[cut: only the first 33554432 bytes of this file were read]
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
  <siteinfo>
    <sitename>Unreal Wiki</sitename>
    <base>http://wiki.beyondunreal.com/</base>
    <generator>MediaWiki 1.15.1</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2">Media</namespace>
      <namespace key="-1">Special</namespace>
      <namespace key="0" />
      <namespace key="1">Talk</namespace>
      <namespace key="2">User</namespace>
      <namespace key="3">User talk</namespace>
      <namespace key="4">Unreal Wiki</namespace>
      <namespace key="5">Unreal Wiki talk</namespace>
      <namespace key="6">File</namespace>
      <namespace key="7">File talk</namespace>
      <namespace key="8">MediaWiki</namespace>
      <namespace key="9">MediaWiki talk</namespace>
      <namespace key="10">Template</namespace>
      <namespace key="11">Template talk</namespace>
      <namespace key="12">Help</namespace>
      <namespace key="13">Help talk</namespace>
      <namespace key="14">Category</namespace>
      <namespace key="15">Category talk</namespace>
      <namespace key="100">Legacy</namespace>
      <namespace key="101">Legacy talk</namespace>
      <namespace key="102">UE1</namespace>
      <namespace key="103">UE1 talk</namespace>
      <namespace key="104">UE2</namespace>
      <namespace key="105">UE2 talk</namespace>
      <namespace key="106">UE3</namespace>
      <namespace key="107">UE3 talk</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>Main Page</title>
    <id>1</id>
    <revision>
      <id>1</id>
      <timestamp>2008-01-24T04:25:02Z</timestamp>
      <contributor>
        <ip>MediaWiki default</ip>
      </contributor>
      <text xml:space="preserve">&lt;big&gt;'''MediaWiki has been successfully installed.'''&lt;/big&gt;

Consult the [http://meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.

== Getting started ==

* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
* [http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]</text>
    </revision>
    <revision>
      <id>66</id>
      <timestamp>2008-02-17T18:45:16Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies:
* [http://wiki.beyondunreal.com:8080/Special:Allpages?namespace=4 Project Pages]
* [http://wiki.beyondunreal.com:8080/Special:Allpages?namespace=8 MediaWiki Pages]
* [http://wiki.beyondunreal.com:8080/Special:Allpages?namespace=12 Help Pages]

When complete, the database will be cleared and the complete pages imported.</text>
    </revision>
    <revision>
      <id>67</id>
      <timestamp>2008-02-17T19:03:19Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Front Page Summary]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Blockiptext]]
* [[MediaWiki:Confirmdeletetext]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Edithelppage]]
* [[MediaWiki:Hideresults]]
* [[MediaWiki:Newarticletext]]
* [[MediaWiki:Privacypage]]
* [[Help:Contents]]
* [[Help:Edit Summary]]
* [[Help:Editing Pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]
* [[Help:Starting New Pages]]

When complete, the database will be cleared and the complete pages imported.</text>
    </revision>
    <revision>
      <id>72</id>
      <timestamp>2008-02-18T07:21:39Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Blockiptext]]
* [[MediaWiki:Confirmdeletetext]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Edithelppage]]
* [[MediaWiki:Hideresults]]
* [[MediaWiki:Newarticletext]]
* [[MediaWiki:Privacypage]]
* [[Help:Contents]]
* [[Help:Edit Summary]]
* [[Help:Editing Pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]
* [[Help:Starting New Pages]]

When complete, the database will be cleared and the complete pages imported.</text>
    </revision>
    <revision>
      <id>73</id>
      <timestamp>2008-02-18T07:52:08Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Blockiptext]]
* [[MediaWiki:Confirmdeletetext]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Edithelppage]]
* [[MediaWiki:Hideresults]]
* [[MediaWiki:Newarticletext]]
* [[MediaWiki:Privacypage]]
* [[Help:Contents]]
* [[Help:Edit Summary]]
* [[Help:Editing Pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]
* [[Help:Starting New Pages]]

When complete, the database will be cleared and the complete pages imported.

Other work to be completed:
* Content conversion - 90% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 0% done - doesn't need much, some color adjustments are probable enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>74</id>
      <timestamp>2008-02-18T07:52:52Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Blockiptext]]
* [[MediaWiki:Confirmdeletetext]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Edithelppage]]
* [[MediaWiki:Hideresults]]
* [[MediaWiki:Newarticletext]]
* [[MediaWiki:Privacypage]]
* [[Help:Contents]]
* [[Help:Edit Summary]]
* [[Help:Editing Pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]
* [[Help:Starting New Pages]]

When complete, the database will be cleared and the complete pages imported.

Other work to be completed:
* Content conversion - 90% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 0% done - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>75</id>
      <timestamp>2008-02-18T07:54:01Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Blockiptext]]
* [[MediaWiki:Confirmdeletetext]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Edithelppage]]
* [[MediaWiki:Hideresults]]
* [[MediaWiki:Newarticletext]]
* [[MediaWiki:Privacypage]]
* [[Help:Contents]]
* [[Help:Edit Summary]]
* [[Help:Editing Pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]
* [[Help:Starting New Pages]]

When complete, the database will be cleared and the complete pages imported.

Other work to be completed:
* Content conversion - 90% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 0% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>309</id>
      <timestamp>2008-02-20T16:29:43Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Hideresults]]
* [[Help:Contents]]
* [[Help:Editing Pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]

When complete, the database will be cleared and the complete pages imported.

Other work to be completed:
* Content conversion - 90% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 0% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>321</id>
      <timestamp>2008-02-21T11:40:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Hideresults]]
* [[Help:Contents]]
* [[Help:Editing pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]

When complete, the database will be cleared and the complete pages imported.

Other work to be completed:
* Content conversion - 90% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 0% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>344</id>
      <timestamp>2008-02-24T00:38:24Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting Started]]
* [[Project:Helping Out]]
* [[Project:Layout Guidelines]]
* [[Project:Policies and Guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style Guide]]
* [[Project:Task List]]
* [[Project:Vandalism]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Hideresults]]
* [[Help:Contents]]
* [[Help:Editing pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>358</id>
      <timestamp>2008-02-24T14:14:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting started]]
* [[Project:Helping out]]
* [[Project:Layout guidelines]]
* [[Project:Policies and guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style guide]]
* [[Project:Task list]]
* [[Project:Vandalism]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Hideresults]]
* [[Help:Contents]]
* [[Help:Editing pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick Editing Guide]]
* [[Help:Searching]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>392</id>
      <timestamp>2008-02-24T15:13:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting started]]
* [[Project:Helping out]]
* [[Project:Layout guidelines]]
* [[Project:Policies and guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style guide]]
* [[Project:Task list]]
* [[Project:Vandalism]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Hideresults]]
* [[Help:Contents]]
* [[Help:Editing pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick editing guide]]
* [[Help:Searching]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>422</id>
      <timestamp>2008-02-25T14:02:05Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''Unreal Wiki''', powered by [[wp:MediaWiki|MediaWiki]]



----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Copyrights]]
* [[Project:Getting started]]
* [[Project:Helping out]]
* [[Project:Layout guidelines]]
* [[Project:Policies and guidelines]]
* [[Project:Sandbox]]
* [[Project:Stub]]
* [[Project:Style guide]]
* [[Project:Task list]]
* [[Project:Vandalism]]
* [[MediaWiki:Copyrightpage]]
* [[MediaWiki:Copyrightwarning]]
* [[MediaWiki:Hideresults]]
* [[Help:Contents]]
* [[Help:Editing pages]]
* [[Help:Formatting]]
* [[Help:Links]]
* [[Help:Navigation]]
* [[Help:Quick editing guide]]
* [[Help:Searching]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>432</id>
      <timestamp>2008-02-29T23:10:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>just a basic idea</comment>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{|class=&quot;inner&quot; style=&quot;padding: 1em; float: right; margin-left: 1em; width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics


----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>433</id>
      <timestamp>2008-02-29T23:20:53Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{|class=&quot;inner&quot; style=&quot;padding: 1em; float: right; margin-left: 1em; width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=Main|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=Main|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1 talk|UE2 talk|UE3 talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics


----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>434</id>
      <timestamp>2008-02-29T23:27:27Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{|class=&quot;inner&quot; style=&quot;padding: 1em; float: right; margin-left: 1em; width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics


----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with
* Licensing - Finalize</text>
    </revision>
    <revision>
      <id>440</id>
      <timestamp>2008-03-02T06:48:37Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{|style=&quot;padding: 1em; float: right; margin-left: 1em; width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics

----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with</text>
    </revision>
    <revision>
      <id>459</id>
      <timestamp>2008-03-02T11:25:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{| class=&quot;infobox&quot; style=&quot;width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics

----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with</text>
    </revision>
    <revision>
      <id>520</id>
      <timestamp>2008-03-04T12:23:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{| class=&quot;infobox infobox-pages&quot; style=&quot;width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics

----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 75% done - See [[Project:Sandbox]]
* Site Style - 10% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with</text>
    </revision>
    <revision>
      <id>581</id>
      <timestamp>2008-03-05T08:11:17Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{| class=&quot;infobox infobox-pages&quot; style=&quot;width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics

----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 90% done - See [[Project:Sandbox]]
* Site Style - 90% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with</text>
    </revision>
    <revision>
      <id>582</id>
      <timestamp>2008-03-05T09:05:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]'''. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.
__NOTOC__ __NOEDITSECTION__
{| class=&quot;infobox infobox-pages&quot; style=&quot;width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}

==Generic topics==
* [[Project:Community Portal|Community Portal]]
* topics applying to all engine generations

==Unreal Engine 3==
* UE3 topics

==Unreal Engine 2==
* UE2 topics

==Unreal Engine 1==
* UE1 topics

----

This page needs content.

These pages need revisions to match this wiki and its policies.  Please remove from list when suitably complete:

* [[Project:Administrators]]
* [[Project:Privacy policy]]
* [[Project:General disclaimer]]

When complete, all old revisions will be cleared.

Other work to be completed:
* Content conversion - 95% done
* UScript highlighter - 90% done - See [[Project:Sandbox]]
* Site Style - 90% done - [[MediaWiki:Monobook.css]] and [[MediaWiki:Common.css]] - doesn't need much, some color adjustments are probably enough to start with</text>
    </revision>
    <revision>
      <id>801</id>
      <timestamp>2008-03-11T16:03:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]''', the [[Unreal Engine]] documentation site. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.

The {{SITENAME}}'s goal is to provide comprehensive documentation of the [[Unreal Editor]] and all technical aspects of the [[Unreal Engine]]. If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's excellent [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tool put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
&lt;!--{| class=&quot;infobox infobox-pages&quot; style=&quot;width:350px;&quot;
! Recent Updates
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
||
&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
||
&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
| style=&quot;text-align:center;font-style:italic;font-size:88%;&quot; | See [[Special:Recentchanges|Recent Changes]] for all recent edits.
|}
--&gt;
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

;Mapping reference
;* [[Unreal Editor interface]]
;* [[:Category:Basic procedures|Basic procedures]]
;* [[:Category:Mapping tutorials|Mapping tutorials]]

;Coding reference
;* [[UnrealScript|UnrealScript features]]
;* [[:Category:Classes|UnrealScript API]]
;* [[:Category:Coding tutorials|Coding tutorials]]

;Modeling reference
;* [[:Category:Modeling tutorials|Modeling tutorials]]

Didn't find what you were looking for? Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
New to the {{SITENAME}}? See [[Project:Getting started|Getting started]] for some tips on how to use {{SITENAME}}.

The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.</text>
    </revision>
    <revision>
      <id>837</id>
      <timestamp>2008-03-12T00:01:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]''', the [[Unreal Engine]] documentation site. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.

The {{SITENAME}}'s goal is to provide comprehensive documentation of the [[Unreal Editor]] and all technical aspects of the [[Unreal Engine]]. If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's excellent '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__

{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| |&lt;div id=&quot;topic-list&quot;&gt;
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Modding terminology]]
* [[Unreal Engine|Unreal Engine overview]]

===Mapping reference===
* [[Unreal Editor|Unreal Editor overview]]
* [[:Category:Basic procedures|Basic procedures]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===Coding reference===
* [[UnrealScript|UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Coding tutorials|Coding tutorials]]

===Modeling reference===
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
New to the {{SITENAME}}? See [[Project:Getting started|Getting started]] for some tips on how to use {{SITENAME}}.

The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.
&lt;/div&gt;
| style=&quot;width:350px;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;float:none;margin-left:auto;&quot;
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:iA D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for other changes.''
|}&lt;!-- end recent edits --&gt;
|}</text>
    </revision>
    <revision>
      <id>838</id>
      <timestamp>2008-03-12T00:18:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Welcome to the new '''[[Project:About|{{SITENAME}}]]''', the [[Unreal Engine]] documentation site. This site is powered by [[wp:MediaWiki|MediaWiki]] and currently holds {{NUMBEROFARTICLES}} articles. So far, {{NUMBEROFUSERS}} users have registered here and unless you already are one of them, feel free to register as well. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it.

The {{SITENAME}}'s goal is to provide comprehensive documentation of the [[Unreal Editor]] and all technical aspects of the [[Unreal Engine]]. If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's excellent '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__

{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Modding terminology]]
* [[Unreal Engine|Unreal Engine overview]]

===Mapping reference===
* [[Unreal Editor|Unreal Editor overview]]
* [[:Category:Basic procedures|Basic procedures]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===Coding reference===
* [[UnrealScript|UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Coding tutorials|Coding tutorials]]

===Modeling reference===
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
New to the {{SITENAME}}? See [[Project:Getting started|Getting started]] for some tips on how to use {{SITENAME}}.

The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for other changes.''
|}&lt;!-- end recent edits --&gt;
|}</text>
    </revision>
    <revision>
      <id>839</id>
      <timestamp>2008-03-12T00:30:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the [[Unreal Editor]] and all technical aspects of the [[Unreal Engine]]. If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's excellent '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Modding terminology]]
* [[Unreal Engine|Unreal Engine overview]]

===Mapping reference===
* [[Unreal Editor|Unreal Editor overview]]
* [[:Category:Basic procedures|Basic procedures]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===Coding reference===
* [[UnrealScript|UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Coding tutorials|Coding tutorials]]

===Modeling reference===
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.

The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for other changes.''
|}
|}</text>
    </revision>
    <revision>
      <id>862</id>
      <timestamp>2008-03-13T10:28:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Terminology]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===Coding reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Coding tutorials|Coding tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>1063</id>
      <timestamp>2008-03-20T15:48:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Terminology]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>1065</id>
      <timestamp>2008-03-20T16:43:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added other discussion namespaces</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Terminology]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>1076</id>
      <timestamp>2008-03-20T18:01:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Protected &quot;[[Main Page]]&quot;: obviously a very important page [edit=sysop:move=sysop]</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Terminology]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
Try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>1078</id>
      <timestamp>2008-03-20T21:55:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>linked [[Category:Article categories]]</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Terminology]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
You can browse [[:Category:Article categories|all articles by category]] or try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>1109</id>
      <timestamp>2008-03-25T10:43:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>it's probably better to have separate terminology pages for mapping/programming/modeling</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
You can browse [[:Category:Article categories|all articles by category]] or try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>1139</id>
      <timestamp>2008-03-26T22:03:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>old content notice</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
As you may have noticed, we have switched to [[wp:MediaWiki|MediaWiki]]. All the [[:Category:Legacy content|old content]] has been imported and is [[Legacy:Home Page|still available]]. See the [[Project:Community Portal|Community Portal]] for further information.
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
You can browse [[:Category:Article categories|all articles by category]] or try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11038</id>
      <timestamp>2008-04-16T07:35:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>clarified red links and requirement to log in</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
As you may have noticed, we have switched to [[wp:MediaWiki|MediaWiki]]. All the [[:Category:Legacy content|old content]] has been imported and is still available at [[Legacy:Home Page]]. See the [[Project:Community Portal|Community Portal]] for further information.

'''Note:''' The new parts of the Unreal Wiki still lack content. Red links are pages that don't exist yet, green links go to external sites. If you want to help create pages and add content, be sure to log in first.
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
You can browse [[:Category:Article categories|all articles by category]] or try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11050</id>
      <timestamp>2008-04-17T05:12:56Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>Unprotected &quot;[[Main Page]]&quot;: unless it is problematic, i'd like community help until this is more finalized</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
As you may have noticed, we have switched to [[wp:MediaWiki|MediaWiki]]. All the [[:Category:Legacy content|old content]] has been imported and is still available at [[Legacy:Home Page]]. See the [[Project:Community Portal|Community Portal]] for further information.

'''Note:''' The new parts of the Unreal Wiki still lack content. Red links are pages that don't exist yet, green links go to external sites. If you want to help create pages and add content, be sure to log in first.
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|Programming tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
You can browse [[:Category:Article categories|all articles by category]] or try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11053</id>
      <timestamp>2008-04-17T15:15:28Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>changed text from Programming tutorials to UnrealScript tutorials</comment>
      <text xml:space="preserve">'''Welcome to the [[Project:About|{{SITENAME}}]].'''
This site's goal is to provide comprehensive documentation of the Unreal Editor and all technical aspects of the Unreal Engine.

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's '''[[Liandri:|Liandri Archives]]'''. If you are a server administrator looking for information about running servers for Unreal series games, try the '''[[uadmin:|Unreal Admin Wiki]]''' instead.

{{ambox
| text = &lt;p&gt;'''Please refrain from using an offline reader or similar tools to download the entire {{SITENAME}}.'''&lt;/p&gt;&lt;p&gt;These tools put an insane stress on the server and will most likely get you ''banned immediately''. The {{SITENAME}} has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable '''[[Project:Offline Wiki|Offline Wiki]]''' archive.&lt;/p&gt;
}}
__NOTOC__ __NOEDITSECTION__
As you may have noticed, we have switched to [[wp:MediaWiki|MediaWiki]]. All the [[:Category:Legacy content|old content]] has been imported and is still available at [[Legacy:Home Page]]. See the [[Project:Community Portal|Community Portal]] for further information.

'''Note:''' The new parts of the Unreal Wiki still lack content. Red links are pages that don't exist yet, green links go to external sites. If you want to help create pages and add content, be sure to log in first.
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the [[Help:Searching|search box]] on the left.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Didn't find what you were looking for?&lt;br/&gt;
You can browse [[:Category:Article categories|all articles by category]] or try your luck with the [[Legacy:Home Page|content imported from the old Unreal Wiki]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11056</id>
      <timestamp>2008-04-18T03:31:36Z</timestamp>
      <contributor>
        <username>Graphik</username>
        <id>213</id>
      </contributor>
      <comment>Formatting change</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still didn't find what you were looking for? You can [[browse all articles by category]] or the [[old {{SITENAME}} content]].

==Community==
The Community Portal is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11057</id>
      <timestamp>2008-04-18T03:34:44Z</timestamp>
      <contributor>
        <username>Graphik</username>
        <id>213</id>
      </contributor>
      <minor/>
      <comment>link formatting</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still didn't find what you were looking for? You can browse [[:Category:Article categories|all articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

==Community==
The Community Portal is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11058</id>
      <timestamp>2008-04-18T03:40:24Z</timestamp>
      <contributor>
        <username>Graphik</username>
        <id>213</id>
      </contributor>
      <minor/>
      <comment>missed another</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still didn't find what you were looking for? You can browse [[:Category:Article categories|all articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11059</id>
      <timestamp>2008-04-18T03:44:36Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <minor/>
      <comment>Minor changes.</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11060</id>
      <timestamp>2008-04-18T03:48:18Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.
| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11515</id>
      <timestamp>2008-04-25T03:54:56Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>Switched up the order of Content and Community as I believe the Community information is more important for new users to read.</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to use {{SITENAME}}.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11516</id>
      <timestamp>2008-04-25T03:56:39Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to get started!

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>11518</id>
      <timestamp>2008-04-25T04:10:19Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <minor/>
      <comment>Added link to Mod ideas (not yet created)</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to get started!

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Modding ideas|Modding ideas]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>28675</id>
      <timestamp>2008-05-22T15:55:49Z</timestamp>
      <contributor>
        <username>Hellkeeper</username>
        <id>245</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

Happy Birthday Unreal. Ten years and still so great !


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to get started!

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Modding ideas|Modding ideas]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>28677</id>
      <timestamp>2008-05-23T12:34:36Z</timestamp>
      <contributor>
        <username>ElMuerte</username>
        <id>5</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Hellkeeper|Hellkeeper]] ([[User talk:Hellkeeper|Talk]]); changed back to last version by [[User:DalinSeivewright|DalinSeivewright]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to get started!

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Modding ideas|Modding ideas]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>32417</id>
      <timestamp>2008-07-25T07:55:40Z</timestamp>
      <contributor>
        <username>Prefix</username>
        <id>1036</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to get started!

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Modding ideas|Modding ideas]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}
[http://typinmp3.net/category/x/ where can i download music][http://typinmp3.net/category/music-downloads/ greenday mp3][http://typinmp3.net/category/3/ bon jovi mp3]</text>
    </revision>
    <revision>
      <id>32419</id>
      <timestamp>2008-07-26T00:40:13Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Prefix|Prefix]] ([[User talk:Prefix|Talk]]); changed back to last version by [[User:ElMuerte|ElMuerte]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.


{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki.

These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}


{{ambox|type=notice|text=We've recently [[Unreal Wiki:MediaWiki conversion|switched]] to the [[wp:MediaWiki|MediaWiki]] engine, and we're taking this opportunity to refresh the site's organization and content. The old content is available in full at [[Legacy:Home Page|the legacy home page]]. During this transition, you'll notice many red-colored links, which point to pages that don't yet exist. [[Project:Community Portal|See how you can help]] form the new, improved {{SITENAME}}.}}

__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? Feel free to join the other {{NUMBEROFUSERS}} users by [[Special:Userlogin|registering]]. The {{SITENAME}} is a community project and you are invited to [[Project:Helping out|help improve]] it. [[Project:Getting started|Getting started]] provides some tips on how to get started!

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]
* [[Modding ideas|Modding ideas]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]] or the [[Legacy:Home Page|old {{SITENAME}} content]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>33397</id>
      <timestamp>2008-11-21T20:08:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reworded some sections, added links to more article categories</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>34344</id>
      <timestamp>2009-04-17T00:24:38Z</timestamp>
      <contributor>
        <username>Leathers97</username>
        <id>1931</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the MMA Information Page.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>34345</id>
      <timestamp>2009-04-17T06:53:26Z</timestamp>
      <contributor>
        <username>Lord Farin</username>
        <id>909</id>
      </contributor>
      <comment>Undo revision 34344 by [[Special:Contributions/Leathers97|Leathers97]] ([[User talk:Leathers97|Talk]])</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>34346</id>
      <timestamp>2009-04-17T13:26:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Protected &quot;[[Main Page]]&quot;: High traffic page ([edit=autoconfirmed] (indefinite) [move=sysop] (indefinite))</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>34418</id>
      <timestamp>2009-05-21T07:45:59Z</timestamp>
      <contributor>
        <username>Edbrown</username>
        <id>1925</id>
      </contributor>
      <text xml:space="preserve">'''Unreal Technology''' today drives most of the finest computer and video games,be it entertainment software,architecture software or animation we are every where.

Ed

Ideal gift for every ocassion: [http://www.custombobble.com Custom BobbleHead]

'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>34419</id>
      <timestamp>2009-05-21T19:24:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Edbrown|Edbrown]] ([[User talk:Edbrown|Talk]]) to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>35390</id>
      <timestamp>2009-09-02T05:09:54Z</timestamp>
      <contributor>
        <username>Cgjoe</username>
        <id>2012</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [http://www.bestessays.com.au Essays]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>35391</id>
      <timestamp>2009-09-02T06:38:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Cgjoe|Cgjoe]] ([[User talk:Cgjoe|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>35467</id>
      <timestamp>2009-10-12T13:29:57Z</timestamp>
      <contributor>
        <username>GuiaanellaFarr</username>
        <id>2040</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]], [http://www.research-service.com/ paper writing service]so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>35472</id>
      <timestamp>2009-10-13T13:29:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/GuiaanellaFarr|GuiaanellaFarr]] ([[User talk:GuiaanellaFarr|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>42622</id>
      <timestamp>2010-03-14T22:48:58Z</timestamp>
      <contributor>
        <username>Johno</username>
        <id>2106</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}
=== Useful Resources ===

* [http://www.google-directions.com Google transit directions]
* [http://www.krugerrand-coins.com Krugerrands]
* [http://www.mapquestdrivingdirections.net Mapquest Directions]
* [http://www.smirlo.com Ganar Dinero Online]
* [http://www.peliculas-online-gratis.com Peliculas Online]
* [http://www.traductor-google.com Traductor de Google]
* [http://www.googleearthgratis.com Earth]
* [http://www.financial-planning-guide.net Financial Planning]
* [http://www.0-credit-cards.net 0 Credit Cards]
* [http://www.debtconsolidationloanstoday.com Debt Consolidation Loans]
* [http://www.onlinetips4u.com Money tips]
* [http://www.makemoneyworldwideinfo.com Make Money]
* [http://www.ganadinero.co.uk Ganar Dinero]
* [http://descargarmessengergratis.blogspot.com Messenger Gratis]
* [http://www.round-kitchen-table.com round kitchen table]
* [http://makemoneyonlinesavvy.blogspot.com make money online]
* [http://www.how-to-make-money-fast.org fast money]
* [http://www.how-to-make-a-website-hosting.com make a website]</text>
    </revision>
    <revision>
      <id>42623</id>
      <timestamp>2010-03-15T08:10:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Johno|Johno]] ([[User talk:Johno|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43229</id>
      <timestamp>2010-05-12T01:19:14Z</timestamp>
      <contributor>
        <username>Vass1</username>
        <id>2137</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
* [http://www.goarticles.com/cgi-bin/showa.cgi?C=2452612 make money on the internet]


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43230</id>
      <timestamp>2010-05-12T01:20:18Z</timestamp>
      <contributor>
        <username>Vass1</username>
        <id>2137</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]



Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43253</id>
      <timestamp>2010-05-15T12:43:05Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[UnrealScript Utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]



Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43552</id>
      <timestamp>2010-06-28T06:18:53Z</timestamp>
      <contributor>
        <username>Brightulysses</username>
        <id>2160</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[UnrealScript Utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
* [[http://dl.njit.edu/moodle/blog/index.php?userid=751|Pink Eyelashes]]



Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43553</id>
      <timestamp>2010-06-28T06:19:36Z</timestamp>
      <contributor>
        <username>Brightulysses</username>
        <id>2160</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[UnrealScript Utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]




Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43748</id>
      <timestamp>2010-07-29T02:00:32Z</timestamp>
      <contributor>
        <username>Verlyn</username>
        <id>2173</id>
      </contributor>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even==Related Links==

[http://www.cellulite.co.uk/ '''cellulite''']  here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[UnrealScript Utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]




Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43751</id>
      <timestamp>2010-07-29T14:02:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Verlyn|Verlyn]] ([[User talk:Verlyn|Talk]]) to last revision by [[User:Brightulysses|Brightulysses]]</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[Modding overview]]

===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping articles|All mapping articles]]

===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[UnrealScript Utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]

===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]




Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;%USER% - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43772</id>
      <timestamp>2010-08-01T02:05:14Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>Tabled sections</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

{|
|-valign=&quot;top&quot;
|
===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]
|-valign=&quot;top&quot;
|
===Mapping reference===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript reference===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling reference===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|
===Modding reference===
* [[Modding overview]]
* [[:Category:Modding tutorials|Modding tutorials]]
* [[:Category:Modding articles|All modding articles]]
|-valign=&quot;top&quot;
|
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 
|}




Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43774</id>
      <timestamp>2010-08-02T04:17:24Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>wiki is reference, looks abit better i think :)</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

{|
|-valign=&quot;top&quot;
|
===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]
|-valign=&quot;top&quot;
|
===Mapping===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|
===Modding===
* [[Modding overview]]
* [[:Category:Modding tutorials|Modding tutorials]]
* [[:Category:Modding articles|All modding articles]]
|-valign=&quot;top&quot;
|
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 
|}




Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43777</id>
      <timestamp>2010-08-02T08:54:58Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>removed modding section as proposed</comment>
      <text xml:space="preserve">'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

{|
|-valign=&quot;top&quot;
|
===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]
|-valign=&quot;top&quot;
|
===Mapping===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|-valign=&quot;top&quot;
|
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 
|}




Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;[[Special:Contributions/%USER%|%USER%]] - %DATE%,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>43854</id>
      <timestamp>2010-08-10T10:18:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>formatting</comment>
      <text xml:space="preserve">{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]

{|style=&quot;width:100%;&quot;
|-valign=&quot;top&quot;
|
===Mapping===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|}
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3|Legacy
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk|Image_talk|Template_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>44051</id>
      <timestamp>2010-09-20T19:06:31Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>Image_talk broke the RecentDiscussion table. Should user talk etc be added?</comment>
      <text xml:space="preserve">{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]

{|style=&quot;width:100%;&quot;
|-valign=&quot;top&quot;
|
===Mapping===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|}
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3|Legacy
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk|Template_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>44511</id>
      <timestamp>2011-07-06T13:56:03Z</timestamp>
      <contributor>
        <username>Loyservice</username>
        <id>2242</id>
      </contributor>
      <text xml:space="preserve">{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]

{|style=&quot;width:100%;&quot;
|-valign=&quot;top&quot;
|
===Mapping===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|}
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 
* [http://www.thegrizasonline.com/ Business Solutions &amp; Tools]
* [http://www.hostgatorcouponsreview.com HostGator Coupons]

Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3|Legacy
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk|Template_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
    <revision>
      <id>44512</id>
      <timestamp>2011-07-06T16:38:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Loyservice|Loyservice]] ([[User talk:Loyservice|Talk]]) to last revision by [[User:Eliot|Eliot]]</comment>
      <text xml:space="preserve">{| cellpadding=&quot;0&quot; cellspacing=&quot;10px&quot; style=&quot;width:100%;&quot;
| id=&quot;topic-list&quot; style=&quot;vertical-align:top;&quot; |
'''Welcome to the {{SITENAME}}.''' This site's goal is to provide comprehensive documentation of the [[Unreal Editor]], [[UnrealScript]] and all technical aspects of the [[Unreal Engine]].

If you came here as a player and are looking for details about the Unreal series of games, head over to BeyondUnreal's [[Liandri:|Liandri Archives]]. If you are a server administrator looking for information about running servers for Unreal series games, try the [[uadmin:|Unreal Admin Wiki]] instead.

{{ambox|type=serious|text=Please refrain from using an offline reader or similar tools to download the entire Unreal Wiki. These tools put an insane stress on the server and will most likely get you banned immediately. The Unreal Wiki has a very dynamic nature, but if you want to download a recent snapshot, try our downloadable [[Project:Offline Wiki|Offline Wiki]] archive.}}
__NOTOC__ __NOEDITSECTION__
==Community==
The [[Project:Community Portal|Community Portal]] is the general place to find out what's going on and what needs to be done on the {{SITENAME}}.

New to the {{SITENAME}}? This is a community project and you are invited to join by [[Special:Userlogin|registering]]. We've provided some tips on [[Project:Getting started|how to get started]] so you can immediately start contributing.

==Content==
The quickest way to find what you're looking for usually is the search box on the left. Otherwise, try one of the topical starting points below.&lt;br/&gt;
Miss the old {{SITENAME}} content? Head over to the [[Legacy:Home Page|old home page]] and start browsing from there, if you want.

As you may notice, there are still a lot of red links, even here on the main page. This is a side effect of our [[Project:MediaWiki conversion|switch]] to the [[wp:MediaWiki|MediaWiki]] engine and we need '''[[Project:Helping out|your help]]''' to get up to speed again.

===General topics===
* [[Unreal Engine overview]]
* [[:Category:Applications|All applications]]

{|style=&quot;width:100%;&quot;
|-valign=&quot;top&quot;
|
===Mapping===
* [[Unreal Editor overview]]
* [[Mapping concepts]]
* [[:Category:Mapping tutorials|Mapping tutorials]]
* [[:Category:Mapping tools|Mapping tools]]
* [[:Category:Mapping articles|All mapping articles]]
|
===UnrealScript===
* [[UnrealScript overview]]
* [[:Category:Classes|UnrealScript API]]
* [[:Category:Programming tutorials|UnrealScript tutorials]]
* [[:Category:UnrealScript utils|UnrealScript utils]]
* [[:Category:Programming articles|All programming articles]]
|
===Modeling===
* [[Modeling overview]]
* [[:Category:Modeling tutorials|Modeling tutorials]]
* [[:Category:Modeling articles|All modeling articles]]
|}
===IRC===
* [irc://irc.enterthegame.com/unrealwiki #UnrealWiki]
* [irc://irc.enterthegame.com/unrealscript #UnrealScript]
* [irc://irc.enterthegame.com/unrealed #UnrealEd] 


Still can't find what you were looking for? You can browse through all of the [[:Category:Article categories|articles by category]].

| style=&quot;vertical-align:top;&quot; |&lt;!-- begin recent edits --&gt;
{| class=&quot;infobox infobox-pages&quot; id=&quot;recent-edits&quot; style=&quot;width:300px;float:none;margin-left:auto;&quot;
|-
| style=&quot;text-align:center;font-size:smaller;&quot; |''See [[Special:Recentchanges|Recent changes]] for all changes.''
|-
! Recent Updates
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3|Legacy
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! New Pages
|-
|&lt;dpl&gt;
namespace=|UE1|UE2|UE3
count=5
ordermethod=firstedit
order=descending
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|-
! Recent Discussion
|-
|&lt;dpl&gt;
namespace=Talk|UE1_talk|UE2_talk|UE3_talk|Unreal_Wiki_talk|Category_talk|Legacy_talk|Template_talk
count=5
ordermethod=lastedit
order=descending
mode=userformat
adduser=true
addeditdate=true
userdateformat=g:ia D, M j
format=&lt;ul&gt;,&lt;li&gt;[[%PAGE%|%TITLE%]]&lt;br /&gt;&lt;span style=&quot;font-size: smaller;&quot;&gt;%DATE% - [[Special:Contributions/%USER%|%USER%]]&lt;/span&gt;,&lt;/li&gt;,&lt;/ul&gt;
noresultsheader=''None''
&lt;/dpl&gt;
|}
|}</text>
    </revision>
  </page>
  <page>
    <title>Category talk:Legacy Category</title>
    <id>4764</id>
    <revision>
      <id>10733</id>
      <timestamp>2008-04-01T22:53:59Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>Question about the future of the Legacy pages</comment>
      <text xml:space="preserve">Because its been asked that no new pages are added to these categories, is it safe to assume that one day they will be removed once we have enough of them reformated/refactored into new pages using the new system? -[[User:DalinSeivewright|DalinSeivewright]] 22:53, 1 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10756</id>
      <timestamp>2008-04-04T13:29:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>only minor updates to legacy, new stuff to new wiki</comment>
      <text xml:space="preserve">Because its been asked that no new pages are added to these categories, is it safe to assume that one day they will be removed once we have enough of them reformated/refactored into new pages using the new system? -[[User:DalinSeivewright|DalinSeivewright]] 22:53, 1 April 2008 (UTC)

:We haven't decided on that yet. The goal is to get all information into the new namespaces, but I guess this will be a &quot;The journey is the reward.&quot; type-of process. New stuff should be documented in the new part of the wiki, while thew legacy pages should only receive minor updates to correct content, spelling, formatting, and other errors. --[[User:Wormbo|Wormbo]] 13:29, 4 April 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Category talk:Mapping tutorials</title>
    <id>23704</id>
    <revision>
      <id>32272</id>
      <timestamp>2008-05-29T04:38:45Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>New page: So where do external resources go if they're not specific to any topic?  For example, http://utmapping.wikidot.com/ or http://www.icecreamyou.com/ut3? --~~~~</comment>
      <text xml:space="preserve">So where do external resources go if they're not specific to any topic?  For example, http://utmapping.wikidot.com/ or http://www.icecreamyou.com/ut3?
--[[User:IceCreamYou|IceCreamYou]] 04:38, 29 May 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Category talk:Modeling tutorials</title>
    <id>5154</id>
    <revision>
      <id>12683</id>
      <timestamp>2008-05-17T10:58:02Z</timestamp>
      <contributor>
        <username>GearType2</username>
        <id>538</id>
      </contributor>
      <comment>New page: __TOC__  ==Suggestions== I am curious if anyone has any suggestions on tutorials that they would like to see here. I am proficient with Maya, and Zbrush, and have a degree of knowledge in ...</comment>
      <text xml:space="preserve">__TOC__

==Suggestions==
I am curious if anyone has any suggestions on tutorials that they would like to see here. I am proficient with Maya, and Zbrush, and have a degree of knowledge in Max. The pipelines are very similar, so making a tutorial wouldn't be that difficult which would be inclusive to multiple packages. I am just unsure how broad, or focused one should be here.</text>
    </revision>
  </page>
  <page>
    <title>Category talk:Programming tutorials</title>
    <id>5113</id>
    <revision>
      <id>11872</id>
      <timestamp>2008-05-12T20:28:59Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>New page: computergod666: WHAT ON EARTH HAPPENED?!! The site switches engines and all the UT-related information is gone! Not sheerly out of curiosity, where do I go for it now? :Try doing a search....</comment>
      <text xml:space="preserve">computergod666: WHAT ON EARTH HAPPENED?!! The site switches engines and all the UT-related information is gone! Not sheerly out of curiosity, where do I go for it now?
:Try doing a search. — [[User:Haarg|Haarg]] 20:28, 12 May 2008 (UTC)</text>
    </revision>
    <revision>
      <id>11873</id>
      <timestamp>2008-05-13T00:11:14Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <text xml:space="preserve">computergod666: WHAT ON EARTH HAPPENED?!! The site switches engines and all the UT-related information is gone! Not sheerly out of curiosity, where do I go for it now?
:Try doing a search. — [[User:Haarg|Haarg]] 20:28, 12 May 2008 (UTC)
:Please read the front page.  It will answer some of your questions. -[[User:DalinSeivewright|DalinSeivewright]] 00:11, 13 May 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Category:API stubs</title>
    <id>119</id>
    <revision>
      <id>360</id>
      <timestamp>2008-02-24T14:15:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]] related to [[UnrealScript]] API documentation.  If you have knowledge on the topic, please [[Project:Helping o...</comment>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]] related to [[UnrealScript]] API documentation.

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|extending]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the stub tag from them.

[[Category:Stubs| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Applications</title>
    <id>259</id>
    <revision>
      <id>978</id>
      <timestamp>2008-03-20T09:44:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all kinds of programs that can be used for Unreal modding.</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all kinds of programs that can be used for Unreal modding.</text>
    </revision>
    <revision>
      <id>986</id>
      <timestamp>2008-03-20T12:50:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Category:Article categories</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all kinds of programs that can be used for Unreal modding.

[[Category:Article categories]]</text>
    </revision>
    <revision>
      <id>1013</id>
      <timestamp>2008-03-20T13:15:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all kinds of programs that can be used for Unreal modding.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Article categories</title>
    <id>262</id>
    <revision>
      <id>987</id>
      <timestamp>2008-03-20T12:51:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories#Meta_categories|meta category]] contains all article pages on the {{SITENAME}}.  [[Category:Categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories#Meta_categories|meta category]] contains all article pages on the {{SITENAME}}.

[[Category:Categories]]</text>
    </revision>
    <revision>
      <id>1015</id>
      <timestamp>2008-03-20T13:16:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories#Meta_categories|meta category]] contains all article pages on the {{SITENAME}}.

[[Category:Categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Articles to be expanded</title>
    <id>141</id>
    <revision>
      <id>416</id>
      <timestamp>2008-02-24T17:24:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles still [[Project:Cleanup#Articles lacking information|lack informat...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles still [[Project:Cleanup#Articles lacking information|lack information]], though.

[[Category:Stubs|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>417</id>
      <timestamp>2008-02-24T17:26:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles still [[Project:Cleanup#Articles lacking information|lack information]], though.

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|expanding]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the expand tag from them.

[[Category:Stubs|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33527</id>
      <timestamp>2008-12-02T17:29:20Z</timestamp>
      <contributor>
        <username>Elc4tBasno</username>
        <id>1680</id>
      </contributor>
      <comment>rorolca</comment>
      <text xml:space="preserve">vartasitc
This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles still [[Project:Cleanup#Articles lacking information|lack information]], though.

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|expanding]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the expand tag from them.

[[Category:Stubs|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33531</id>
      <timestamp>2008-12-03T10:52:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Elc4tBasno|Elc4tBasno]] ([[User talk:Elc4tBasno|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles still [[Project:Cleanup#Articles lacking information|lack information]], though.

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|expanding]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the expand tag from them.

[[Category:Stubs|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Articles with stub sections</title>
    <id>138</id>
    <revision>
      <id>409</id>
      <timestamp>2008-02-24T17:06:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles contain very short [[Project:Cleanup#Articles lacking information|...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles contain very short [[Project:Cleanup#Articles lacking information|stub sections]], though.

[[Category:Stubs]]</text>
    </revision>
    <revision>
      <id>410</id>
      <timestamp>2008-02-24T17:06:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles contain very short [[Project:Cleanup#Articles lacking information|stub sections]], though.

[[Category:Stubs| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>411</id>
      <timestamp>2008-02-24T17:07:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles contain very short [[Project:Cleanup#Articles lacking information|stub sections]], though.

[[Category:Stubs| ]]</text>
    </revision>
    <revision>
      <id>415</id>
      <timestamp>2008-02-24T17:23:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles contain very short [[Project:Cleanup#Articles lacking information|stub sections]], though.

[[Category:Stubs|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>418</id>
      <timestamp>2008-02-24T17:27:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are too long to be called stubs by themselves. These articles contain very short [[Project:Cleanup#Articles lacking information|stub sections]], though.

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|expanding]] these sections. Otherwise you can at least check the articles listed here and, if the tagged sections have been expanded since the tag was originally added, remove the {{[[Template:sectstub|sectstub]]}} tag from them.

[[Category:Stubs|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Auto-generated pages requiring human attention</title>
    <id>4847</id>
    <revision>
      <id>11073</id>
      <timestamp>2008-04-18T15:49:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all pages that were auto-generated in some way and have not yet been verified by a human reader.  Please [[Project:Helping out|help out]] by r...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages that were auto-generated in some way and have not yet been verified by a human reader.

Please [[Project:Helping out|help out]] by reviewing these pages. If an auto-generated page seems to be ok, please [[Help:Editing pages|edit]] it to remove the {{[[Template:autogenerated|autogenerated]]}} tag. If an auto-generated page is structurally ok, but still lacks content, the {{[[Template:expand|expand]]}} tag should be added to it.
[[Category:Pages needing cleanup| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Basic UnrealScript procedures</title>
    <id>300</id>
    <revision>
      <id>1071</id>
      <timestamp>2008-03-20T17:11:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all [[UnrealScript]]-related [[Project:Basic procedures|basic procedures]]. Use {{[[Template:basic-script|]]}} to add pages to this category. ...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all [[UnrealScript]]-related [[Project:Basic procedures|basic procedures]]. Use {{[[Template:basic-script|basic-script]]}} to add pages to this category.

[[Category:Basic procedures| {{PAGENAME}}]]
[[Category:Programming tutorials| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Basic editor procedures</title>
    <id>301</id>
    <revision>
      <id>1072</id>
      <timestamp>2008-03-20T17:12:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all [[UnrealEd]]-related [[Project:Basic procedures|basic procedures]]. Use {{[[Template:basic-editor|]]}} to add pages to this category.  [[C...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all [[UnrealEd]]-related [[Project:Basic procedures|basic procedures]]. Use {{[[Template:basic-editor|basic-editor]]}} to add pages to this category.

[[Category:Basic procedures| {{PAGENAME}}]]
[[Category:Mapping tutorials| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Basic procedures</title>
    <id>268</id>
    <revision>
      <id>1004</id>
      <timestamp>2008-03-20T13:13:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all [[Project:Basic procedures|basic procedures]].  [[Category:Tutorials| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all [[Project:Basic procedures|basic procedures]].

[[Category:Tutorials| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:CC-BY images</title>
    <id>295</id>
    <revision>
      <id>1062</id>
      <timestamp>2008-03-20T15:46:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Creative Commons|Creative Commons]] Attribution 2.5 license.  [[Category:Media categories| {{PAGENAME}}]...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Creative Commons|Creative Commons]] Attribution 2.5 license.

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:CC-BY-NC-SA images</title>
    <id>288</id>
    <revision>
      <id>1050</id>
      <timestamp>2008-03-20T15:04:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Creative Commons|Creative Commons]] Attribution Non-Commercial Share-Alike 3.0 license, i.e. the license...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Creative Commons|Creative Commons]] Attribution Non-Commercial Share-Alike 3.0 license, i.e. the license also used for Unreal Wiki articles.

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:CC-BY-SA images</title>
    <id>287</id>
    <revision>
      <id>1049</id>
      <timestamp>2008-03-20T15:01:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Creative Commons|Creative Commons]] Attribution Share-Alike 3.0 license.  [[Category:Media categories| {...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Creative Commons|Creative Commons]] Attribution Share-Alike 3.0 license.

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Categories</title>
    <id>263</id>
    <revision>
      <id>988</id>
      <timestamp>2008-03-20T12:53:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This is the root category of all {{SITENAME}} [[Project:Categories#Meta categories|meta categories]].</comment>
      <text xml:space="preserve">This is the root category of all {{SITENAME}} [[Project:Categories#Meta categories|meta categories]].</text>
    </revision>
  </page>
  <page>
    <title>Category:Class category templates</title>
    <id>235</id>
    <revision>
      <id>915</id>
      <timestamp>2008-03-16T10:52:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: The following [[Help:templates|]] can be used to populate [[:Category:Classes|class category pages]] with standard text.</comment>
      <text xml:space="preserve">The following [[Help:templates|templates]] can be used to populate [[:Category:Classes|class category pages]] with standard text.</text>
    </revision>
    <revision>
      <id>934</id>
      <timestamp>2008-03-16T12:56:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>linked Project:Categories</comment>
      <text xml:space="preserve">The following [[Help:templates|templates]] can be used to populate [[:Category:Classes|class category pages]] with standard text.

==See also==
* [[Project:Categories]]</text>
    </revision>
    <revision>
      <id>996</id>
      <timestamp>2008-03-20T13:00:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>added to [[Category:Template categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:templates|templates]] for populating [[:Category:Classes|class category pages]] with standard text.

[[Category:Template categories]]</text>
    </revision>
    <revision>
      <id>1019</id>
      <timestamp>2008-03-20T13:17:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:templates|templates]] for populating [[:Category:Classes|class category pages]] with standard text.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes</title>
    <id>215</id>
    <revision>
      <id>873</id>
      <timestamp>2008-03-16T08:40:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>root category for classes</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[class]] and [[interface]] categories.

Classes are grouped by [[:Category:Classes by game|game]], [[:Category:Classes by package|package]], [[:Category:Classes within other classes|outer class]] or [[:Category:Classes implementing an interface|implemented interface]]. [[:Category:Interfaces|Interfaces]] and [[:Category:Custom classes|Custom classes]] are grouped similarly in their own categories.</text>
    </revision>
    <revision>
      <id>980</id>
      <timestamp>2008-03-20T09:58:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Category:Coding articles</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[class]] and [[interface]] categories.

Classes are grouped by [[:Category:Classes by game|game]], [[:Category:Classes by package|package]], [[:Category:Classes within other classes|outer class]] or [[:Category:Classes implementing an interface|implemented interface]]. [[:Category:Interfaces|Interfaces]] and [[:Category:Custom classes|Custom classes]] are grouped similarly in their own categories.

[[Category:Coding articles]]</text>
    </revision>
    <revision>
      <id>981</id>
      <timestamp>2008-03-20T09:59:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Category:Programming articles</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[class]] and [[interface]] categories.

Classes are grouped by [[:Category:Classes by game|game]], [[:Category:Classes by package|package]], [[:Category:Classes within other classes|outer class]] or [[:Category:Classes implementing an interface|implemented interface]]. [[:Category:Interfaces|Interfaces]] and [[:Category:Custom classes|Custom classes]] are grouped similarly in their own categories.

[[Category:Programming articles]]</text>
    </revision>
    <revision>
      <id>1014</id>
      <timestamp>2008-03-20T13:15:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[class]] and [[interface]] categories.

Classes are grouped by [[:Category:Classes by game|game]], [[:Category:Classes by package|package]], [[:Category:Classes within other classes|outer class]] or [[:Category:Classes implementing an interface|implemented interface]]. [[:Category:Interfaces|Interfaces]] and [[:Category:Custom classes|Custom classes]] are grouped similarly in their own categories.

[[Category:Programming articles| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes by game</title>
    <id>216</id>
    <revision>
      <id>874</id>
      <timestamp>2008-03-16T08:44:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by game.  [[Category:Classes|{{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by game.

[[Category:Classes|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>879</id>
      <timestamp>2008-03-16T08:52:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by game.

[[Category:Classes| 2{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>897</id>
      <timestamp>2008-03-16T09:16:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by game.

[[Category:Classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes by package</title>
    <id>219</id>
    <revision>
      <id>880</id>
      <timestamp>2008-03-16T08:52:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by containing package.  [[Category:Classes| 2{{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by containing package.

[[Category:Classes| 2{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>898</id>
      <timestamp>2008-03-16T09:16:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by containing package.

[[Category:Classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing CustomPropertyItemHandler (UDK)</title>
    <id>24459</id>
    <revision>
      <id>35587</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UE3}}</text>
    </revision>
    <revision>
      <id>35588</id>
      <timestamp>2009-11-06T17:54:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing CustomPropertyItemHandler (UT3)</title>
    <id>247</id>
    <revision>
      <id>936</id>
      <timestamp>2008-03-16T13:23:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category implementing classes|CustomPropertyItemHandler|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11093</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11094</id>
      <timestamp>2008-04-20T09:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11874</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11875</id>
      <timestamp>2008-05-13T10:47:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12246</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UE3}}</text>
    </revision>
    <revision>
      <id>12247</id>
      <timestamp>2008-05-13T14:18:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UE3}}</text>
    </revision>
    <revision>
      <id>12699</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|CustomPropertyItemHandler|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing EditorLinkSelectionInterface (UDK)</title>
    <id>24460</id>
    <revision>
      <id>35589</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|EditorLinkSelectionInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35590</id>
      <timestamp>2009-11-06T17:54:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|EditorLinkSelectionInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing GameCrowdSpawnInterface (UDK)</title>
    <id>24461</id>
    <revision>
      <id>35591</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|GameCrowdSpawnInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35592</id>
      <timestamp>2009-11-06T17:54:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|GameCrowdSpawnInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing GameCrowdSpawnerInterface (UDK)</title>
    <id>28689</id>
    <revision>
      <id>40628</id>
      <timestamp>2010-01-17T12:24:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|GameCrowdSpawnerInterface|UE3}}</text>
    </revision>
    <revision>
      <id>40629</id>
      <timestamp>2010-01-17T12:36:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category implementing classes|GameCrowdSpawnerInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing GameStatsDatabaseVisitor (UDK)</title>
    <id>24462</id>
    <revision>
      <id>35593</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|GameStatsDatabaseVisitor|UE3}}</text>
    </revision>
    <revision>
      <id>35594</id>
      <timestamp>2009-11-06T17:54:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|GameStatsDatabaseVisitor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing IAdvWebAdminSettings (UT3)</title>
    <id>5159</id>
    <revision>
      <id>12700</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|IAdvWebAdminSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing IQueryHandler (UT3)</title>
    <id>4855</id>
    <revision>
      <id>11095</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11096</id>
      <timestamp>2008-04-20T09:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11876</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11877</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12248</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|UE3}}</text>
    </revision>
    <revision>
      <id>12249</id>
      <timestamp>2008-05-13T14:18:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|UE3}}</text>
    </revision>
    <revision>
      <id>12701</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|IQueryHandler|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing ISession (UT3)</title>
    <id>4856</id>
    <revision>
      <id>11097</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|ISession|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11098</id>
      <timestamp>2008-04-20T09:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|ISession|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11878</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|ISession|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11879</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|ISession|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12250</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|ISession|UE3}}</text>
    </revision>
    <revision>
      <id>12251</id>
      <timestamp>2008-05-13T14:18:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|ISession|UE3}}</text>
    </revision>
    <revision>
      <id>12702</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|ISession|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing ISessionHandler (UT3)</title>
    <id>4857</id>
    <revision>
      <id>11099</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11100</id>
      <timestamp>2008-04-20T09:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11880</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11881</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12252</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|UE3}}</text>
    </revision>
    <revision>
      <id>12253</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|UE3}}</text>
    </revision>
    <revision>
      <id>12703</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|ISessionHandler|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing IWebAdminAuth (UT3)</title>
    <id>4858</id>
    <revision>
      <id>11101</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11102</id>
      <timestamp>2008-04-20T09:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11882</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11883</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12254</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|UE3}}</text>
    </revision>
    <revision>
      <id>12255</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|UE3}}</text>
    </revision>
    <revision>
      <id>12704</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminAuth|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing IWebAdminUser (UT3)</title>
    <id>242</id>
    <revision>
      <id>925</id>
      <timestamp>2008-03-16T12:37:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category implementing classes|IWebAdminUser|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11103</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11104</id>
      <timestamp>2008-04-20T09:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11884</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11885</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12256</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|UE3}}</text>
    </revision>
    <revision>
      <id>12257</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|UE3}}</text>
    </revision>
    <revision>
      <id>12705</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|IWebAdminUser|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing Interface NavMeshPathObject (UDK)</title>
    <id>24464</id>
    <revision>
      <id>35597</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|Interface_NavMeshPathObject|UE3}}</text>
    </revision>
    <revision>
      <id>35598</id>
      <timestamp>2009-11-06T17:54:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|Interface_NavMeshPathObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing Interface NavMeshPathObstacle (UDK)</title>
    <id>24465</id>
    <revision>
      <id>35599</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|Interface_NavMeshPathObstacle|UE3}}</text>
    </revision>
    <revision>
      <id>35600</id>
      <timestamp>2009-11-06T17:54:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|Interface_NavMeshPathObstacle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing Interface NavMeshPathSwitch (UDK)</title>
    <id>24466</id>
    <revision>
      <id>35601</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|Interface_NavMeshPathSwitch|UE3|parent=Interface_NavMeshPathObject}}</text>
    </revision>
    <revision>
      <id>35602</id>
      <timestamp>2009-11-06T17:54:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|Interface_NavMeshPathSwitch|UE3|parent=Interface_NavMeshPathObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing Interface NavigationHandle (UDK)</title>
    <id>24463</id>
    <revision>
      <id>35595</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|Interface_NavigationHandle|UE3}}</text>
    </revision>
    <revision>
      <id>35596</id>
      <timestamp>2009-11-06T17:54:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|Interface_NavigationHandle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineAccountInterface (UDK)</title>
    <id>24467</id>
    <revision>
      <id>35603</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35604</id>
      <timestamp>2009-11-06T17:54:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineAccountInterface (UT3)</title>
    <id>4859</id>
    <revision>
      <id>11105</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11106</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11886</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11887</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12258</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12259</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12706</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineAccountInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineCommunityContentInterface (UDK)</title>
    <id>24468</id>
    <revision>
      <id>35605</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineCommunityContentInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35606</id>
      <timestamp>2009-11-06T17:54:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineCommunityContentInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineContentInterface (UDK)</title>
    <id>24469</id>
    <revision>
      <id>35607</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35608</id>
      <timestamp>2009-11-06T17:54:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineContentInterface (UT3)</title>
    <id>4860</id>
    <revision>
      <id>11107</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11108</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11888</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11889</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12260</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12261</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12707</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineContentInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineEventsInterface (UDK)</title>
    <id>24470</id>
    <revision>
      <id>35609</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineEventsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35610</id>
      <timestamp>2009-11-06T17:54:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineEventsInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineGameInterface (UDK)</title>
    <id>24471</id>
    <revision>
      <id>35611</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35612</id>
      <timestamp>2009-11-06T17:54:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineGameInterface (UT3)</title>
    <id>4861</id>
    <revision>
      <id>11109</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11110</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11890</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11891</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12262</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12263</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12708</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineGameInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineNewsInterface (UDK)</title>
    <id>24472</id>
    <revision>
      <id>35613</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35614</id>
      <timestamp>2009-11-06T17:54:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineNewsInterface (UT3)</title>
    <id>4862</id>
    <revision>
      <id>11111</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11112</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11892</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11893</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12264</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12265</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12709</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineNewsInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlinePartyChatInterface (UDK)</title>
    <id>28690</id>
    <revision>
      <id>40630</id>
      <timestamp>2010-01-17T12:24:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePartyChatInterface|UE3}}</text>
    </revision>
    <revision>
      <id>40631</id>
      <timestamp>2010-01-17T12:36:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePartyChatInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlinePlayerInterface (UDK)</title>
    <id>24473</id>
    <revision>
      <id>35615</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35616</id>
      <timestamp>2009-11-06T17:54:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlinePlayerInterface (UT3)</title>
    <id>4863</id>
    <revision>
      <id>11113</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11114</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11894</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11895</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12266</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12267</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12710</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlinePlayerInterfaceEx (UDK)</title>
    <id>24474</id>
    <revision>
      <id>35617</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UE3}}</text>
    </revision>
    <revision>
      <id>35618</id>
      <timestamp>2009-11-06T17:54:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlinePlayerInterfaceEx (UT3)</title>
    <id>4864</id>
    <revision>
      <id>11115</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11116</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11896</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11897</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12268</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UE3}}</text>
    </revision>
    <revision>
      <id>12269</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UE3}}</text>
    </revision>
    <revision>
      <id>12711</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlinePlayerInterfaceEx|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineStatsInterface (UDK)</title>
    <id>24475</id>
    <revision>
      <id>35619</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35620</id>
      <timestamp>2009-11-06T17:54:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineStatsInterface (UT3)</title>
    <id>4865</id>
    <revision>
      <id>11117</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11118</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11898</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11899</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12270</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12271</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12712</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineStatsInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineSystemInterface (UDK)</title>
    <id>24476</id>
    <revision>
      <id>35621</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35622</id>
      <timestamp>2009-11-06T17:54:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineSystemInterface (UT3)</title>
    <id>4866</id>
    <revision>
      <id>11119</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11120</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11900</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11901</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12272</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12273</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12713</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineSystemInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineVoiceInterface (UDK)</title>
    <id>24477</id>
    <revision>
      <id>35623</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UE3}}</text>
    </revision>
    <revision>
      <id>35624</id>
      <timestamp>2009-11-06T17:54:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing OnlineVoiceInterface (UT3)</title>
    <id>4867</id>
    <revision>
      <id>11121</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11122</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11902</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11903</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12274</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12275</id>
      <timestamp>2008-05-13T14:18:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UE3}}</text>
    </revision>
    <revision>
      <id>12714</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|OnlineVoiceInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIDataStorePublisher (UDK)</title>
    <id>24478</id>
    <revision>
      <id>35625</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
    <revision>
      <id>35626</id>
      <timestamp>2009-11-06T17:54:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIDataStorePublisher (UT3)</title>
    <id>4868</id>
    <revision>
      <id>11123</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11124</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11904</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|Unreal Tournament 3|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
    <revision>
      <id>11905</id>
      <timestamp>2008-05-13T10:48:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|Unreal Tournament 3|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
    <revision>
      <id>12276</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
    <revision>
      <id>12277</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
    <revision>
      <id>12715</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStorePublisher|UE3|parent=UIDataStoreSubscriber}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIDataStoreSubscriber (UDK)</title>
    <id>24479</id>
    <revision>
      <id>35627</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UE3}}</text>
    </revision>
    <revision>
      <id>35628</id>
      <timestamp>2009-11-06T17:54:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIDataStoreSubscriber (UT3)</title>
    <id>4869</id>
    <revision>
      <id>11125</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11126</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11906</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11907</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12278</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UE3}}</text>
    </revision>
    <revision>
      <id>12279</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UE3}}</text>
    </revision>
    <revision>
      <id>12716</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIDataStoreSubscriber|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIEventContainer (UDK)</title>
    <id>24480</id>
    <revision>
      <id>35629</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UE3}}</text>
    </revision>
    <revision>
      <id>35630</id>
      <timestamp>2009-11-06T17:54:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIEventContainer (UT3)</title>
    <id>4870</id>
    <revision>
      <id>11127</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11128</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11908</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11909</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12280</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UE3}}</text>
    </revision>
    <revision>
      <id>12281</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UE3}}</text>
    </revision>
    <revision>
      <id>12717</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIEventContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIListElementCellProvider (UDK)</title>
    <id>24481</id>
    <revision>
      <id>35631</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UE3}}</text>
    </revision>
    <revision>
      <id>35632</id>
      <timestamp>2009-11-06T17:54:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIListElementCellProvider (UT3)</title>
    <id>4871</id>
    <revision>
      <id>11129</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11130</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11910</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11911</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12282</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UE3}}</text>
    </revision>
    <revision>
      <id>12283</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UE3}}</text>
    </revision>
    <revision>
      <id>12718</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementCellProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIListElementProvider (UDK)</title>
    <id>24482</id>
    <revision>
      <id>35633</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UE3}}</text>
    </revision>
    <revision>
      <id>35634</id>
      <timestamp>2009-11-06T17:54:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIListElementProvider (UT3)</title>
    <id>4872</id>
    <revision>
      <id>11131</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11132</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11912</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11913</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12284</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UE3}}</text>
    </revision>
    <revision>
      <id>12285</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UE3}}</text>
    </revision>
    <revision>
      <id>12719</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIListElementProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UISettingsClient (UDK)</title>
    <id>24483</id>
    <revision>
      <id>35635</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UE3}}</text>
    </revision>
    <revision>
      <id>35636</id>
      <timestamp>2009-11-06T17:54:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UISettingsClient (UT3)</title>
    <id>4873</id>
    <revision>
      <id>11133</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11134</id>
      <timestamp>2008-04-20T09:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11914</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11915</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12286</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UE3}}</text>
    </revision>
    <revision>
      <id>12287</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UE3}}</text>
    </revision>
    <revision>
      <id>12720</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UISettingsClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIStringRenderer (UDK)</title>
    <id>24484</id>
    <revision>
      <id>35637</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>35638</id>
      <timestamp>2009-11-06T17:54:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIStringRenderer (UT3)</title>
    <id>4874</id>
    <revision>
      <id>11135</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11136</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11916</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11917</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12288</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>12289</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>12721</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIStringRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIStyleResolver (UDK)</title>
    <id>24485</id>
    <revision>
      <id>35639</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UE3}}</text>
    </revision>
    <revision>
      <id>35640</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UIStyleResolver (UT3)</title>
    <id>248</id>
    <revision>
      <id>937</id>
      <timestamp>2008-03-16T13:23:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category implementing classes|UIStyleResolver|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11137</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11138</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11918</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>11919</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12290</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UE3}}</text>
    </revision>
    <revision>
      <id>12291</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UE3}}</text>
    </revision>
    <revision>
      <id>12722</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category implementing classes|UIStyleResolver|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing UITickableObject (UDK)</title>
    <id>24486</id>
    <revision>
      <id>35641</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category implementing classes|UITickableObject|UE3}}</text>
    </revision>
    <revision>
      <id>35642</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category implementing classes|UITickableObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes implementing an interface</title>
    <id>221</id>
    <revision>
      <id>882</id>
      <timestamp>2008-03-16T08:54:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by their implemented [[interface]]s.  [[Category:Classes| 2{{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by their implemented [[interface]]s.

[[Category:Classes| 2{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>884</id>
      <timestamp>2008-03-16T08:59:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>linked Category:Interfaces</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by their implemented [[interface]]s.

==See also==
* [[:Category:Interfaces]]

[[Category:Classes| 2{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>899</id>
      <timestamp>2008-03-16T09:16:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es by their implemented [[interface]]s.

==See also==
* [[:Category:Interfaces]]

[[Category:Classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package Core</title>
    <id>5160</id>
    <revision>
      <id>12723</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package Editor</title>
    <id>5161</id>
    <revision>
      <id>12724</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package Engine</title>
    <id>5162</id>
    <revision>
      <id>12725</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package Fire</title>
    <id>5163</id>
    <revision>
      <id>12726</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package IpDrv</title>
    <id>5164</id>
    <revision>
      <id>12727</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package IpServer</title>
    <id>5165</id>
    <revision>
      <id>12728</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpServer|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UBrowser</title>
    <id>5166</id>
    <revision>
      <id>12729</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UDSDemo</title>
    <id>5167</id>
    <revision>
      <id>12730</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UDSDemo|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UMenu</title>
    <id>5168</id>
    <revision>
      <id>12731</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UMenu|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UPak</title>
    <id>5171</id>
    <revision>
      <id>12734</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UPak|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UWindow</title>
    <id>5172</id>
    <revision>
      <id>12735</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWindow|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UnrealI</title>
    <id>5169</id>
    <revision>
      <id>12732</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in RTNP package UnrealShare</title>
    <id>5170</id>
    <revision>
      <id>12733</id>
      <timestamp>2008-05-17T16:10:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package Core</title>
    <id>5173</id>
    <revision>
      <id>12736</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package Editor</title>
    <id>5174</id>
    <revision>
      <id>12737</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package Engine</title>
    <id>5175</id>
    <revision>
      <id>12738</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package Fire</title>
    <id>5176</id>
    <revision>
      <id>12739</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package IpDrv</title>
    <id>5177</id>
    <revision>
      <id>12740</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package IpServer</title>
    <id>5178</id>
    <revision>
      <id>12741</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpServer|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package UBrowser</title>
    <id>5179</id>
    <revision>
      <id>12742</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package UWindow</title>
    <id>5182</id>
    <revision>
      <id>12745</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWindow|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package UnrealI</title>
    <id>5180</id>
    <revision>
      <id>12743</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U1 package UnrealShare</title>
    <id>5181</id>
    <revision>
      <id>12744</id>
      <timestamp>2008-05-17T16:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|U1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Core</title>
    <id>5183</id>
    <revision>
      <id>12746</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Deployables</title>
    <id>5184</id>
    <revision>
      <id>12747</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Deployables|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Editor</title>
    <id>5185</id>
    <revision>
      <id>12748</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Engine</title>
    <id>5186</id>
    <revision>
      <id>12749</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Fire</title>
    <id>5187</id>
    <revision>
      <id>12750</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package IpDrv</title>
    <id>5188</id>
    <revision>
      <id>12751</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Legend</title>
    <id>5189</id>
    <revision>
      <id>12752</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Legend|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Loader</title>
    <id>5190</id>
    <revision>
      <id>12753</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Loader|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package ParticleSystems</title>
    <id>5191</id>
    <revision>
      <id>12754</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|ParticleSystems|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Pawns</title>
    <id>5192</id>
    <revision>
      <id>12755</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Pawns|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package U2</title>
    <id>5193</id>
    <revision>
      <id>12756</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package U2WebAdmin</title>
    <id>5194</id>
    <revision>
      <id>12757</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2WebAdmin|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package UI</title>
    <id>5195</id>
    <revision>
      <id>12758</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UI|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package UWeb</title>
    <id>5197</id>
    <revision>
      <id>12760</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package UnrealEd</title>
    <id>5196</id>
    <revision>
      <id>12759</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Vehicles</title>
    <id>5198</id>
    <revision>
      <id>12761</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2 package Weapons</title>
    <id>5199</id>
    <revision>
      <id>12762</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Weapons|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package Core</title>
    <id>5200</id>
    <revision>
      <id>12763</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package Editor</title>
    <id>5201</id>
    <revision>
      <id>12764</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package Engine</title>
    <id>5202</id>
    <revision>
      <id>12765</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package Environment</title>
    <id>5203</id>
    <revision>
      <id>12766</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Environment|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package Fire</title>
    <id>5204</id>
    <revision>
      <id>12767</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package IpDrv</title>
    <id>5205</id>
    <revision>
      <id>12768</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package Legend</title>
    <id>5206</id>
    <revision>
      <id>12769</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Legend|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package ParticleSystems</title>
    <id>5207</id>
    <revision>
      <id>12770</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|ParticleSystems|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2</title>
    <id>5208</id>
    <revision>
      <id>12771</id>
      <timestamp>2008-05-17T16:11:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2 Atlantis</title>
    <id>5219</id>
    <revision>
      <id>12782</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2_Atlantis|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2 M01</title>
    <id>5220</id>
    <revision>
      <id>12783</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2_M01|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2 M07</title>
    <id>5221</id>
    <revision>
      <id>12784</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2_M07|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2AI</title>
    <id>5209</id>
    <revision>
      <id>12772</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2AI|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2AIOld</title>
    <id>5210</id>
    <revision>
      <id>12773</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2AIOld|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2CTF</title>
    <id>5211</id>
    <revision>
      <id>12774</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2CTF|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2Decorations</title>
    <id>5212</id>
    <revision>
      <id>12775</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2Decorations|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2Dialog</title>
    <id>5213</id>
    <revision>
      <id>12776</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2Dialog|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2Pawns</title>
    <id>5214</id>
    <revision>
      <id>12777</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2Pawns|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2Test</title>
    <id>5215</id>
    <revision>
      <id>12778</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2Test|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2Vehicles</title>
    <id>5216</id>
    <revision>
      <id>12779</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2Vehicles|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2Weapons</title>
    <id>5217</id>
    <revision>
      <id>12780</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2Weapons|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package U2XMP</title>
    <id>5218</id>
    <revision>
      <id>12781</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|U2XMP|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package UI</title>
    <id>5222</id>
    <revision>
      <id>12785</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UI|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in U2XMP package UWeb</title>
    <id>5223</id>
    <revision>
      <id>12786</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package Core</title>
    <id>24487</id>
    <revision>
      <id>35643</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UDK}}</text>
    </revision>
    <revision>
      <id>35644</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|Core|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package Engine</title>
    <id>24488</id>
    <revision>
      <id>35645</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UDK}}
{{categoryTOC}}</text>
    </revision>
    <revision>
      <id>35646</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|Engine|UDK}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package GameFramework</title>
    <id>24489</id>
    <revision>
      <id>35647</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GameFramework|UDK}}</text>
    </revision>
    <revision>
      <id>35648</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|GameFramework|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package IpDrv</title>
    <id>24490</id>
    <revision>
      <id>35649</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UDK}}</text>
    </revision>
    <revision>
      <id>35650</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package OnlineSubsystemPC</title>
    <id>24491</id>
    <revision>
      <id>35651</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemPC|UDK}}</text>
    </revision>
    <revision>
      <id>35652</id>
      <timestamp>2009-11-06T17:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemPC|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package UTEditor</title>
    <id>24493</id>
    <revision>
      <id>35655</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTEditor|UDK}}</text>
    </revision>
    <revision>
      <id>35656</id>
      <timestamp>2009-11-06T17:54:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|UTEditor|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package UTGame</title>
    <id>24494</id>
    <revision>
      <id>35657</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTGame|UDK}}
{{categoryTOC}}</text>
    </revision>
    <revision>
      <id>35658</id>
      <timestamp>2009-11-06T17:54:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|UTGame|UDK}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package UTGameContent</title>
    <id>24495</id>
    <revision>
      <id>35659</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTGameContent|UDK}}</text>
    </revision>
    <revision>
      <id>35660</id>
      <timestamp>2009-11-06T17:54:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|UTGameContent|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UDK package UnrealEd</title>
    <id>24492</id>
    <revision>
      <id>35653</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UDK}}</text>
    </revision>
    <revision>
      <id>35654</id>
      <timestamp>2009-11-06T17:54:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package Core</title>
    <id>4875</id>
    <revision>
      <id>11139</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11140</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11920</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11921</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12292</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12293</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12787</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package Editor</title>
    <id>4876</id>
    <revision>
      <id>11141</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11142</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11922</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11923</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12294</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12295</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12788</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package Engine</title>
    <id>4877</id>
    <revision>
      <id>11143</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11144</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11924</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11925</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12296</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12297</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12789</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package Fire</title>
    <id>4878</id>
    <revision>
      <id>11145</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11146</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11926</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11927</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12298</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12299</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12790</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package GUI</title>
    <id>4880</id>
    <revision>
      <id>11149</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11150</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11930</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11931</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12302</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12303</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12792</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|GUI|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package Gameplay</title>
    <id>4879</id>
    <revision>
      <id>11147</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11148</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11928</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11929</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12300</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12301</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12791</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package IpDrv</title>
    <id>4881</id>
    <revision>
      <id>11151</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11152</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11932</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11933</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12304</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12305</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12793</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package RTInterface</title>
    <id>4882</id>
    <revision>
      <id>11153</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11154</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11934</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11935</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12306</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12307</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12794</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|RTInterface|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package Runtime</title>
    <id>4883</id>
    <revision>
      <id>11155</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11156</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11936</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11937</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12308</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12309</id>
      <timestamp>2008-05-13T14:18:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12795</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Runtime|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package UWeb</title>
    <id>4884</id>
    <revision>
      <id>11157</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11158</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11940</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11941</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12312</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12313</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12796</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UE2Runtime package UnrealEd</title>
    <id>5114</id>
    <revision>
      <id>11938</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11939</id>
      <timestamp>2008-05-13T10:48:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12310</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12311</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package BotPack</title>
    <id>5224</id>
    <revision>
      <id>12797</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|BotPack|UT}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package Core</title>
    <id>4886</id>
    <revision>
      <id>11161</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11162</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11944</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11945</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12316</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT}}</text>
    </revision>
    <revision>
      <id>12317</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT}}</text>
    </revision>
    <revision>
      <id>12798</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package DE</title>
    <id>5225</id>
    <revision>
      <id>12799</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|DE|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package Editor</title>
    <id>4887</id>
    <revision>
      <id>11163</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11164</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11948</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11949</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12320</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT}}</text>
    </revision>
    <revision>
      <id>12321</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT}}</text>
    </revision>
    <revision>
      <id>12800</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package Engine</title>
    <id>4888</id>
    <revision>
      <id>11165</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11166</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11950</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11951</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12322</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT}}</text>
    </revision>
    <revision>
      <id>12323</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT}}</text>
    </revision>
    <revision>
      <id>12801</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package Fire</title>
    <id>4889</id>
    <revision>
      <id>11167</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11168</id>
      <timestamp>2008-04-20T09:28:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11952</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11953</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12324</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UT}}</text>
    </revision>
    <revision>
      <id>12325</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT}}</text>
    </revision>
    <revision>
      <id>12802</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package IpDrv</title>
    <id>4890</id>
    <revision>
      <id>11169</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11170</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11954</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11955</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12326</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT}}</text>
    </revision>
    <revision>
      <id>12327</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT}}</text>
    </revision>
    <revision>
      <id>12803</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package IpServer</title>
    <id>4891</id>
    <revision>
      <id>11171</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|IpServer|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11172</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpServer|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11956</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpServer|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11957</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpServer|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12328</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpServer|UT}}</text>
    </revision>
    <revision>
      <id>12329</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpServer|UT}}</text>
    </revision>
    <revision>
      <id>12804</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpServer|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package MultiMesh</title>
    <id>5226</id>
    <revision>
      <id>12805</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|MultiMesh|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package Relics</title>
    <id>4892</id>
    <revision>
      <id>11173</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Relics|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11174</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Relics|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11960</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Relics|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11961</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Relics|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12332</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Relics|UT}}</text>
    </revision>
    <revision>
      <id>12333</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Relics|UT}}</text>
    </revision>
    <revision>
      <id>12806</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Relics|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package RelicsBindings</title>
    <id>5117</id>
    <revision>
      <id>11962</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|RelicsBindings|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11963</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|RelicsBindings|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12334</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|RelicsBindings|UT}}</text>
    </revision>
    <revision>
      <id>12335</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|RelicsBindings|UT}}</text>
    </revision>
    <revision>
      <id>12807</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|RelicsBindings|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package SkeletalChars</title>
    <id>5118</id>
    <revision>
      <id>11964</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SkeletalChars|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11965</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkeletalChars|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12336</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SkeletalChars|UT}}</text>
    </revision>
    <revision>
      <id>12337</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkeletalChars|UT}}</text>
    </revision>
    <revision>
      <id>12808</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|SkeletalChars|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UBrowser</title>
    <id>4893</id>
    <revision>
      <id>11175</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11176</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11966</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11967</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12338</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UBrowser|UT}}</text>
    </revision>
    <revision>
      <id>12339</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|UT}}</text>
    </revision>
    <revision>
      <id>12809</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UBrowser|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UMenu</title>
    <id>4894</id>
    <revision>
      <id>11177</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11178</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11968</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11969</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12340</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UMenu|UT}}</text>
    </revision>
    <revision>
      <id>12341</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UMenu|UT}}</text>
    </revision>
    <revision>
      <id>12810</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UMenu|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UTBrowser</title>
    <id>4897</id>
    <revision>
      <id>11183</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11184</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11974</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11975</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12346</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT}}</text>
    </revision>
    <revision>
      <id>12347</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT}}</text>
    </revision>
    <revision>
      <id>12813</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTBrowser|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UTMenu</title>
    <id>4898</id>
    <revision>
      <id>11185</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11186</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11976</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11977</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTMenu|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12348</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTMenu|UT}}</text>
    </revision>
    <revision>
      <id>12349</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTMenu|UT}}</text>
    </revision>
    <revision>
      <id>12814</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTMenu|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UTServerAdmin</title>
    <id>4899</id>
    <revision>
      <id>11187</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11188</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11978</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11979</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12350</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT}}</text>
    </revision>
    <revision>
      <id>12351</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT}}</text>
    </revision>
    <revision>
      <id>12815</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTServerAdmin|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UWeb</title>
    <id>4900</id>
    <revision>
      <id>11189</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11190</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11980</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11981</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12352</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT}}</text>
    </revision>
    <revision>
      <id>12353</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT}}</text>
    </revision>
    <revision>
      <id>12816</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UWindow</title>
    <id>4901</id>
    <revision>
      <id>11191</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UWindow|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11192</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWindow|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11982</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWindow|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11983</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWindow|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12354</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWindow|UT}}</text>
    </revision>
    <revision>
      <id>12355</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWindow|UT}}</text>
    </revision>
    <revision>
      <id>12817</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWindow|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UnrealI</title>
    <id>4895</id>
    <revision>
      <id>11179</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11180</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11970</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealI|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11971</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12342</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealI|UT}}</text>
    </revision>
    <revision>
      <id>12343</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|UT}}</text>
    </revision>
    <revision>
      <id>12811</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealI|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT package UnrealShare</title>
    <id>4896</id>
    <revision>
      <id>11181</id>
      <timestamp>2008-04-19T20:04:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11182</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11972</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>11973</id>
      <timestamp>2008-05-13T10:48:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12344</id>
      <timestamp>2008-05-13T14:00:31Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT}}</text>
    </revision>
    <revision>
      <id>12345</id>
      <timestamp>2008-05-13T14:18:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT}}</text>
    </revision>
    <revision>
      <id>12812</id>
      <timestamp>2008-05-17T16:11:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealShare|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package BonusPack</title>
    <id>4902</id>
    <revision>
      <id>11193</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11194</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11984</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11985</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12356</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003}}</text>
    </revision>
    <revision>
      <id>12357</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003}}</text>
    </revision>
    <revision>
      <id>12818</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package Core</title>
    <id>4903</id>
    <revision>
      <id>11195</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11196</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11986</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11987</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12358</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT2003}}</text>
    </revision>
    <revision>
      <id>12359</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2003}}</text>
    </revision>
    <revision>
      <id>12819</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package Editor</title>
    <id>4904</id>
    <revision>
      <id>11197</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11198</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11988</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11989</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12360</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT2003}}</text>
    </revision>
    <revision>
      <id>12361</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2003}}</text>
    </revision>
    <revision>
      <id>12820</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package Engine</title>
    <id>4905</id>
    <revision>
      <id>11199</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11200</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11990</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11991</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12362</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT2003}}</text>
    </revision>
    <revision>
      <id>12363</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2003}}</text>
    </revision>
    <revision>
      <id>12821</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package Fire</title>
    <id>4906</id>
    <revision>
      <id>11201</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11202</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11992</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11993</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12364</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UT2003}}</text>
    </revision>
    <revision>
      <id>12365</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2003}}</text>
    </revision>
    <revision>
      <id>12822</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package Gameplay</title>
    <id>4907</id>
    <revision>
      <id>11203</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11204</id>
      <timestamp>2008-04-20T09:28:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11994</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11995</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12366</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003}}</text>
    </revision>
    <revision>
      <id>12367</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003}}</text>
    </revision>
    <revision>
      <id>12823</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package IpDrv</title>
    <id>4908</id>
    <revision>
      <id>11205</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11206</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11996</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11997</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12368</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003}}</text>
    </revision>
    <revision>
      <id>12369</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003}}</text>
    </revision>
    <revision>
      <id>12824</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package OGGPlayer</title>
    <id>4909</id>
    <revision>
      <id>11207</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11208</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11998</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11999</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12370</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003}}</text>
    </revision>
    <revision>
      <id>12371</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003}}</text>
    </revision>
    <revision>
      <id>12825</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|OGGPlayer|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package SampleSkin</title>
    <id>4910</id>
    <revision>
      <id>11209</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11210</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12000</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12001</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12372</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003}}</text>
    </revision>
    <revision>
      <id>12373</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003}}</text>
    </revision>
    <revision>
      <id>12826</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|SampleSkin|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package SkaarjPack</title>
    <id>5227</id>
    <revision>
      <id>12827</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package SkaarjPack rc</title>
    <id>4912</id>
    <revision>
      <id>11213</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11214</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12004</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12005</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12376</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12377</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12828</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package UTClassic</title>
    <id>4915</id>
    <revision>
      <id>11219</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11220</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12010</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12011</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12382</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003}}</text>
    </revision>
    <revision>
      <id>12383</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003}}</text>
    </revision>
    <revision>
      <id>12831</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package UWeb</title>
    <id>4916</id>
    <revision>
      <id>11221</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11222</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12012</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12013</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12384</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003}}</text>
    </revision>
    <revision>
      <id>12385</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003}}</text>
    </revision>
    <revision>
      <id>12832</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package UnrealEd</title>
    <id>4913</id>
    <revision>
      <id>11215</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11216</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12006</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12007</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12378</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003}}</text>
    </revision>
    <revision>
      <id>12379</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003}}</text>
    </revision>
    <revision>
      <id>12829</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package UnrealGame</title>
    <id>4914</id>
    <revision>
      <id>11217</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11218</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12008</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12009</id>
      <timestamp>2008-05-13T10:48:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12380</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003}}</text>
    </revision>
    <revision>
      <id>12381</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003}}</text>
    </revision>
    <revision>
      <id>12830</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package Vehicles</title>
    <id>4917</id>
    <revision>
      <id>11223</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11224</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12014</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12015</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12386</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003}}</text>
    </revision>
    <revision>
      <id>12387</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003}}</text>
    </revision>
    <revision>
      <id>12833</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XAdmin</title>
    <id>4918</id>
    <revision>
      <id>11225</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11226</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12016</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12017</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12388</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003}}</text>
    </revision>
    <revision>
      <id>12389</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003}}</text>
    </revision>
    <revision>
      <id>12834</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XEffects</title>
    <id>4919</id>
    <revision>
      <id>11227</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11228</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12018</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12019</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12390</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003}}</text>
    </revision>
    <revision>
      <id>12391</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003}}</text>
    </revision>
    <revision>
      <id>12835</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XGame</title>
    <id>4920</id>
    <revision>
      <id>11229</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11230</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12020</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12021</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12392</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame|UT2003}}</text>
    </revision>
    <revision>
      <id>12393</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2003}}</text>
    </revision>
    <revision>
      <id>12836</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XGame rc</title>
    <id>4921</id>
    <revision>
      <id>11231</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11232</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12022</id>
      <timestamp>2008-05-13T11:42:13Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12023</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12394</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12395</id>
      <timestamp>2008-05-13T14:18:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12837</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XInterface</title>
    <id>4922</id>
    <revision>
      <id>11233</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11234</id>
      <timestamp>2008-04-20T09:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12024</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12025</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12396</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003}}</text>
    </revision>
    <revision>
      <id>12397</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003}}</text>
    </revision>
    <revision>
      <id>12838</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XPickups</title>
    <id>4923</id>
    <revision>
      <id>11235</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11236</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12026</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12027</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12398</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003}}</text>
    </revision>
    <revision>
      <id>12399</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003}}</text>
    </revision>
    <revision>
      <id>12839</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XPickups rc</title>
    <id>4924</id>
    <revision>
      <id>11237</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11238</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12028</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12029</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12400</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12401</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12840</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XWeapons</title>
    <id>4925</id>
    <revision>
      <id>11239</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11240</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12030</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12031</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12402</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003}}</text>
    </revision>
    <revision>
      <id>12403</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003}}</text>
    </revision>
    <revision>
      <id>12841</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package XWeapons rc</title>
    <id>4926</id>
    <revision>
      <id>11241</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11242</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12032</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12033</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12404</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12405</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003}}</text>
    </revision>
    <revision>
      <id>12842</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2003 package xWebAdmin</title>
    <id>4927</id>
    <revision>
      <id>11243</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11244</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12034</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12035</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12406</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003}}</text>
    </revision>
    <revision>
      <id>12407</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003}}</text>
    </revision>
    <revision>
      <id>12843</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package BonusPack</title>
    <id>4928</id>
    <revision>
      <id>11245</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11246</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12036</id>
      <timestamp>2008-05-13T11:43:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12037</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12408</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004}}</text>
    </revision>
    <revision>
      <id>12409</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004}}</text>
    </revision>
    <revision>
      <id>12844</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|BonusPack|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Core</title>
    <id>4929</id>
    <revision>
      <id>11247</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11248</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12038</id>
      <timestamp>2008-05-13T11:43:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12039</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12410</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT2004}}</text>
    </revision>
    <revision>
      <id>12411</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2004}}</text>
    </revision>
    <revision>
      <id>12845</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Editor</title>
    <id>4930</id>
    <revision>
      <id>11249</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11250</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12040</id>
      <timestamp>2008-05-13T11:43:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12041</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12412</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT2004}}</text>
    </revision>
    <revision>
      <id>12413</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2004}}</text>
    </revision>
    <revision>
      <id>12846</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Engine</title>
    <id>4931</id>
    <revision>
      <id>11251</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11252</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12042</id>
      <timestamp>2008-05-13T11:43:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12043</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12414</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT2004}}</text>
    </revision>
    <revision>
      <id>12415</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2004}}</text>
    </revision>
    <revision>
      <id>12847</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Fire</title>
    <id>4932</id>
    <revision>
      <id>11253</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11254</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12044</id>
      <timestamp>2008-05-13T11:43:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12045</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12416</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Fire|UT2004}}</text>
    </revision>
    <revision>
      <id>12417</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2004}}</text>
    </revision>
    <revision>
      <id>12848</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Fire|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package GUI2K4</title>
    <id>4934</id>
    <revision>
      <id>11257</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11258</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12048</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12049</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12420</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004}}</text>
    </revision>
    <revision>
      <id>12421</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004}}</text>
    </revision>
    <revision>
      <id>12850</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|GUI2K4|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Gameplay</title>
    <id>4933</id>
    <revision>
      <id>11255</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11256</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12046</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12047</id>
      <timestamp>2008-05-13T10:48:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12418</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004}}</text>
    </revision>
    <revision>
      <id>12419</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004}}</text>
    </revision>
    <revision>
      <id>12849</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Gameplay|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package IpDrv</title>
    <id>4935</id>
    <revision>
      <id>11259</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11260</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12050</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12051</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12422</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004}}</text>
    </revision>
    <revision>
      <id>12423</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004}}</text>
    </revision>
    <revision>
      <id>12851</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Onslaught</title>
    <id>4936</id>
    <revision>
      <id>11261</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11262</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12052</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12053</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12424</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004}}</text>
    </revision>
    <revision>
      <id>12425</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004}}</text>
    </revision>
    <revision>
      <id>12852</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Onslaught|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package OnslaughtBP</title>
    <id>4937</id>
    <revision>
      <id>11263</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11264</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12054</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12055</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12426</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004}}</text>
    </revision>
    <revision>
      <id>12427</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004}}</text>
    </revision>
    <revision>
      <id>12853</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtBP|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package OnslaughtFull</title>
    <id>4938</id>
    <revision>
      <id>11265</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11266</id>
      <timestamp>2008-04-20T09:28:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12056</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12057</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12428</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004}}</text>
    </revision>
    <revision>
      <id>12429</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004}}</text>
    </revision>
    <revision>
      <id>12854</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|OnslaughtFull|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package SkaarjPack</title>
    <id>5228</id>
    <revision>
      <id>12855</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package SkaarjPack rc</title>
    <id>4940</id>
    <revision>
      <id>11269</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11270</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12060</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12061</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12432</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12433</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12856</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|SkaarjPack_rc|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package StreamlineFX</title>
    <id>4941</id>
    <revision>
      <id>11271</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11272</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12062</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12063</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12434</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004}}</text>
    </revision>
    <revision>
      <id>12435</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004}}</text>
    </revision>
    <revision>
      <id>12857</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|StreamlineFX|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UT2k4Assault</title>
    <id>4944</id>
    <revision>
      <id>11277</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11278</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12068</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12069</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12440</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004}}</text>
    </revision>
    <revision>
      <id>12441</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004}}</text>
    </revision>
    <revision>
      <id>12860</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UT2k4Assault|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UT2k4AssaultFull</title>
    <id>4945</id>
    <revision>
      <id>11279</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11280</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12070</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12071</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12442</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004}}</text>
    </revision>
    <revision>
      <id>12443</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004}}</text>
    </revision>
    <revision>
      <id>12861</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UT2k4AssaultFull|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UTClassic</title>
    <id>4946</id>
    <revision>
      <id>11281</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11282</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12072</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12073</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12444</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004}}</text>
    </revision>
    <revision>
      <id>12445</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004}}</text>
    </revision>
    <revision>
      <id>12862</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTClassic|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UTV2004c</title>
    <id>4947</id>
    <revision>
      <id>11283</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11284</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12074</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12075</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12446</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004}}</text>
    </revision>
    <revision>
      <id>12447</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004}}</text>
    </revision>
    <revision>
      <id>12863</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTV2004c|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UTV2004s</title>
    <id>4948</id>
    <revision>
      <id>11285</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11286</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12076</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12077</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12448</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004}}</text>
    </revision>
    <revision>
      <id>12449</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004}}</text>
    </revision>
    <revision>
      <id>12864</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTV2004s|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UWeb</title>
    <id>4949</id>
    <revision>
      <id>11287</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11288</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12078</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12079</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12450</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004}}</text>
    </revision>
    <revision>
      <id>12451</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004}}</text>
    </revision>
    <revision>
      <id>12865</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UnrealEd</title>
    <id>4942</id>
    <revision>
      <id>11273</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11274</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12064</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12065</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12436</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004}}</text>
    </revision>
    <revision>
      <id>12437</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004}}</text>
    </revision>
    <revision>
      <id>12858</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package UnrealGame</title>
    <id>4943</id>
    <revision>
      <id>11275</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11276</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12066</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12067</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12438</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004}}</text>
    </revision>
    <revision>
      <id>12439</id>
      <timestamp>2008-05-13T14:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004}}</text>
    </revision>
    <revision>
      <id>12859</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealGame|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package Vehicles</title>
    <id>4950</id>
    <revision>
      <id>11289</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11290</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12080</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12081</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12452</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004}}</text>
    </revision>
    <revision>
      <id>12453</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004}}</text>
    </revision>
    <revision>
      <id>12866</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Vehicles|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XAdmin</title>
    <id>4951</id>
    <revision>
      <id>11291</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11292</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12082</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12083</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12454</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004}}</text>
    </revision>
    <revision>
      <id>12455</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004}}</text>
    </revision>
    <revision>
      <id>12867</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XAdmin|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XEffects</title>
    <id>4952</id>
    <revision>
      <id>11293</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11294</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12084</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12085</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12456</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004}}</text>
    </revision>
    <revision>
      <id>12457</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004}}</text>
    </revision>
    <revision>
      <id>12868</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XEffects|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XGame</title>
    <id>4826</id>
    <revision>
      <id>10967</id>
      <timestamp>2008-04-11T18:55:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category package classes|XGame|UT2004|Unreal Tournament 2004}}</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11295</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11296</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12086</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12087</id>
      <timestamp>2008-05-13T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12458</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame|UT2004}}</text>
    </revision>
    <revision>
      <id>12459</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2004}}</text>
    </revision>
    <revision>
      <id>12869</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XGame|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XGame rc</title>
    <id>4953</id>
    <revision>
      <id>11297</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11298</id>
      <timestamp>2008-04-20T09:28:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12088</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12089</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12460</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12461</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12870</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XGame_rc|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XInterface</title>
    <id>4954</id>
    <revision>
      <id>11299</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11300</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12090</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12091</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12462</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004}}</text>
    </revision>
    <revision>
      <id>12463</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004}}</text>
    </revision>
    <revision>
      <id>12871</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XInterface|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XPickups</title>
    <id>4955</id>
    <revision>
      <id>11301</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11302</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12092</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12093</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12464</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004}}</text>
    </revision>
    <revision>
      <id>12465</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004}}</text>
    </revision>
    <revision>
      <id>12872</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XPickups|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XPickups rc</title>
    <id>4956</id>
    <revision>
      <id>11303</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11304</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12094</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12095</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12466</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12467</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12873</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XPickups_rc|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XWeapons</title>
    <id>4958</id>
    <revision>
      <id>11307</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11308</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12098</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12099</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12470</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004}}</text>
    </revision>
    <revision>
      <id>12471</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004}}</text>
    </revision>
    <revision>
      <id>12875</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package XWeapons rc</title>
    <id>4959</id>
    <revision>
      <id>11309</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11310</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12100</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12101</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12472</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12473</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004}}</text>
    </revision>
    <revision>
      <id>12876</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|XWeapons_rc|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package xVoting</title>
    <id>4957</id>
    <revision>
      <id>11305</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11306</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12096</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12097</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12468</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004}}</text>
    </revision>
    <revision>
      <id>12469</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004}}</text>
    </revision>
    <revision>
      <id>12874</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|xVoting|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT2004 package xWebAdmin</title>
    <id>4960</id>
    <revision>
      <id>11311</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11312</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12102</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12103</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12474</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004}}</text>
    </revision>
    <revision>
      <id>12475</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004}}</text>
    </revision>
    <revision>
      <id>12877</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|xWebAdmin|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package Core</title>
    <id>4961</id>
    <revision>
      <id>11313</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11314</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12104</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12105</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12476</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Core|UT3}}</text>
    </revision>
    <revision>
      <id>12477</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Core|UT3}}</text>
    </revision>
    <revision>
      <id>12878</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Core|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package Editor</title>
    <id>4962</id>
    <revision>
      <id>11315</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11316</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12106</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12107</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12478</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Editor|UT3}}</text>
    </revision>
    <revision>
      <id>12479</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT3}}</text>
    </revision>
    <revision>
      <id>12879</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Editor|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package Engine</title>
    <id>229</id>
    <revision>
      <id>904</id>
      <timestamp>2008-03-16T09:26:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] lists [[UT3]]-specific [[class]]es and [[interface]]s contained in package Engine.  [[Category:Classes by package|Engine (UT3)]] [[Category:UT3-specifi...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] lists [[UT3]]-specific [[class]]es and [[interface]]s contained in package Engine.

[[Category:Classes by package|Engine (UT3)]]
[[Category:UT3-specific classes| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>918</id>
      <timestamp>2008-03-16T11:02:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>using category template</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11317</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11318</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12108</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12109</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12480</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|Engine|UT3}}</text>
    </revision>
    <revision>
      <id>12481</id>
      <timestamp>2008-05-13T14:18:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT3}}</text>
    </revision>
    <revision>
      <id>12880</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|Engine|UT3}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package GameFramework</title>
    <id>4963</id>
    <revision>
      <id>11319</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11320</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12110</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12111</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12482</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3}}</text>
    </revision>
    <revision>
      <id>12483</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3}}</text>
    </revision>
    <revision>
      <id>12881</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|GameFramework|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package IpDrv</title>
    <id>4964</id>
    <revision>
      <id>11321</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11322</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12112</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12113</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12484</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3}}</text>
    </revision>
    <revision>
      <id>12485</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3}}</text>
    </revision>
    <revision>
      <id>12882</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|IpDrv|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package OnlineSubsystemGameSpy</title>
    <id>4965</id>
    <revision>
      <id>11323</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11324</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12114</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12115</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12486</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3}}</text>
    </revision>
    <revision>
      <id>12487</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3}}</text>
    </revision>
    <revision>
      <id>12883</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemGameSpy|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package OnlineSubsystemLive</title>
    <id>4966</id>
    <revision>
      <id>11325</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11326</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12116</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12117</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12488</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3}}</text>
    </revision>
    <revision>
      <id>12489</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3}}</text>
    </revision>
    <revision>
      <id>12884</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|OnlineSubsystemLive|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UT3Gold</title>
    <id>24209</id>
    <revision>
      <id>34675</id>
      <timestamp>2009-08-16T10:16:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UT3Gold|UT3}}</text>
    </revision>
    <revision>
      <id>34676</id>
      <timestamp>2009-08-16T08:24:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category package classes|UT3Gold|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UT3GoldGame</title>
    <id>24210</id>
    <revision>
      <id>34677</id>
      <timestamp>2009-08-16T10:16:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UT3GoldGame|UT3}}</text>
    </revision>
    <revision>
      <id>34678</id>
      <timestamp>2009-08-16T08:24:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category package classes|UT3GoldGame|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UTEditor</title>
    <id>4968</id>
    <revision>
      <id>11329</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11330</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12120</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12121</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12492</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3}}</text>
    </revision>
    <revision>
      <id>12493</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3}}</text>
    </revision>
    <revision>
      <id>12886</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTEditor|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UTGame</title>
    <id>4969</id>
    <revision>
      <id>11331</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTGame|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11332</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTGame|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12122</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTGame|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12123</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTGame|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12494</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTGame|UT3}}</text>
    </revision>
    <revision>
      <id>12495</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTGame|UT3}}</text>
    </revision>
    <revision>
      <id>12887</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTGame|UT3}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UTGameContent</title>
    <id>4970</id>
    <revision>
      <id>11333</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11334</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12124</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12125</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12496</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3}}</text>
    </revision>
    <revision>
      <id>12497</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3}}</text>
    </revision>
    <revision>
      <id>12888</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UTGameContent|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UWeb</title>
    <id>4971</id>
    <revision>
      <id>11335</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11336</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12126</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12127</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12498</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UWeb|UT3}}</text>
    </revision>
    <revision>
      <id>12499</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT3}}</text>
    </revision>
    <revision>
      <id>12889</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UWeb|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package UnrealEd</title>
    <id>4967</id>
    <revision>
      <id>11327</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11328</id>
      <timestamp>2008-04-20T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12118</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12119</id>
      <timestamp>2008-05-13T10:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12490</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3}}</text>
    </revision>
    <revision>
      <id>12491</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3}}</text>
    </revision>
    <revision>
      <id>12885</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|UnrealEd|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes in UT3 package WebAdmin</title>
    <id>245</id>
    <revision>
      <id>930</id>
      <timestamp>2008-03-16T12:51:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category package classes|WebAdmin|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11337</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11338</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12128</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12129</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12500</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3}}</text>
    </revision>
    <revision>
      <id>12501</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3}}</text>
    </revision>
    <revision>
      <id>12890</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package classes|WebAdmin|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Actor (UDK)</title>
    <id>24496</id>
    <revision>
      <id>35661</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35662</id>
      <timestamp>2009-11-06T17:54:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within BendiBeamGenerator (U2)</title>
    <id>5229</id>
    <revision>
      <id>12891</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|BendiBeamGenerator|UE2|parent=PulseLineGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within BendiBeamGenerator (U2XMP)</title>
    <id>5230</id>
    <revision>
      <id>12892</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|BendiBeamGenerator|UE2|parent=PulseLineGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within BreakableGlass (U2XMP)</title>
    <id>5231</id>
    <revision>
      <id>12893</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|BreakableGlass|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Console (U2)</title>
    <id>5232</id>
    <revision>
      <id>12894</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|Console|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Console (U2XMP)</title>
    <id>5233</id>
    <revision>
      <id>12895</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|Console|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within DemoPlayerController (UT3)</title>
    <id>4972</id>
    <revision>
      <id>11339</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11340</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11412</id>
      <timestamp>2008-04-20T13:35:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes within GamePlayerController (UT3)]]</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UT3|Unreal Tournament 3}}
[[Category:Classes within GamePlayerController (UT3)| ]]</text>
    </revision>
    <revision>
      <id>11867</id>
      <timestamp>2008-05-11T17:46:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>testing new template parameter</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UT3|Unreal Tournament 3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12130</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|Unreal Tournament 3|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12131</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|Unreal Tournament 3|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12502</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12503</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12896</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|DemoPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within DirectoryTreeList (UT2004)</title>
    <id>4973</id>
    <revision>
      <id>11341</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11342</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12132</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12133</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12504</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UE2}}</text>
    </revision>
    <revision>
      <id>12505</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UE2}}</text>
    </revision>
    <revision>
      <id>12897</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|DirectoryTreeList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Engine (UDK)</title>
    <id>24497</id>
    <revision>
      <id>35663</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Engine|UE3}}</text>
    </revision>
    <revision>
      <id>35664</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|Engine|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Engine (UT3)</title>
    <id>4974</id>
    <revision>
      <id>11343</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11344</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12134</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Engine|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12135</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Engine|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12506</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Engine|UE3}}</text>
    </revision>
    <revision>
      <id>12507</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Engine|UE3}}</text>
    </revision>
    <revision>
      <id>12898</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|Engine|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within GameAIController (UDK)</title>
    <id>24498</id>
    <revision>
      <id>35665</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GameAIController|UE3|parent=Actor}}</text>
    </revision>
    <revision>
      <id>35666</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|GameAIController|UE3|parent=Actor}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within GamePlayerController (UDK)</title>
    <id>24499</id>
    <revision>
      <id>35667</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UE3|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>35668</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UE3|parent=PlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within GamePlayerController (UT3)</title>
    <id>4975</id>
    <revision>
      <id>11345</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11346</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11410</id>
      <timestamp>2008-04-20T13:35:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes within PlayerController (UT3)]]</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UT3|Unreal Tournament 3}}
[[Category:Classes within PlayerController (UT3)| ]]</text>
    </revision>
    <revision>
      <id>12136</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GamePlayerController|Unreal Tournament 3|UE3|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12137</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|Unreal Tournament 3|UE3|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12508</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UE3|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12509</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UE3|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12899</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|GamePlayerController|UE3|parent=PlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within GameViewportClient (UDK)</title>
    <id>24500</id>
    <revision>
      <id>35669</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UE3}}</text>
    </revision>
    <revision>
      <id>35670</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within GameViewportClient (UT3)</title>
    <id>4976</id>
    <revision>
      <id>11347</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11348</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12138</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GameViewportClient|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12139</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|GameViewportClient|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12510</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UE3}}</text>
    </revision>
    <revision>
      <id>12511</id>
      <timestamp>2008-05-13T14:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UE3}}</text>
    </revision>
    <revision>
      <id>12900</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|GameViewportClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within LineManager (U2)</title>
    <id>5234</id>
    <revision>
      <id>12901</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|LineManager|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within LineManager (U2XMP)</title>
    <id>5235</id>
    <revision>
      <id>12902</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|LineManager|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Material (UDK)</title>
    <id>24501</id>
    <revision>
      <id>35671</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Material|UE3}}</text>
    </revision>
    <revision>
      <id>35672</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|Material|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Material (UT3)</title>
    <id>4977</id>
    <revision>
      <id>11349</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|Material|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11350</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Material|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12140</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Material|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12141</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Material|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12512</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Material|UE3}}</text>
    </revision>
    <revision>
      <id>12513</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Material|UE3}}</text>
    </revision>
    <revision>
      <id>12903</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|Material|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within OnlineSubsystemCommonImpl (UDK)</title>
    <id>24502</id>
    <revision>
      <id>35673</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UE3}}</text>
    </revision>
    <revision>
      <id>35674</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within OnlineSubsystemCommonImpl (UT3)</title>
    <id>4978</id>
    <revision>
      <id>11351</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11352</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12142</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12143</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12514</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UE3}}</text>
    </revision>
    <revision>
      <id>12515</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UE3}}</text>
    </revision>
    <revision>
      <id>12904</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|OnlineSubsystemCommonImpl|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within ParticleBlower (U2)</title>
    <id>5236</id>
    <revision>
      <id>12905</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|ParticleBlower|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within ParticleBlower (U2XMP)</title>
    <id>5237</id>
    <revision>
      <id>12906</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|ParticleBlower|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within ParticleGenerator (U2)</title>
    <id>5238</id>
    <revision>
      <id>12907</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|ParticleGenerator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within ParticleGenerator (U2XMP)</title>
    <id>5239</id>
    <revision>
      <id>12908</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|ParticleGenerator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within ParticleSkeleton (U2)</title>
    <id>5240</id>
    <revision>
      <id>12909</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|ParticleSkeleton|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within ParticleSkeleton (U2XMP)</title>
    <id>5241</id>
    <revision>
      <id>12910</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|ParticleSkeleton|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (U2)</title>
    <id>5242</id>
    <revision>
      <id>12911</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (U2XMP)</title>
    <id>5243</id>
    <revision>
      <id>12912</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (UDK)</title>
    <id>24503</id>
    <revision>
      <id>35675</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UE3|parent=Actor}}</text>
    </revision>
    <revision>
      <id>35676</id>
      <timestamp>2009-11-06T17:54:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE3|parent=Actor}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (UE2Runtime)</title>
    <id>4979</id>
    <revision>
      <id>11353</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11354</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12144</id>
      <timestamp>2008-05-13T11:40:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12145</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12516</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
    <revision>
      <id>12517</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
    <revision>
      <id>12913</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (UT2003)</title>
    <id>4980</id>
    <revision>
      <id>11355</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11356</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12146</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12147</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12518</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
    <revision>
      <id>12519</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
    <revision>
      <id>12914</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (UT2004)</title>
    <id>4981</id>
    <revision>
      <id>11357</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11358</id>
      <timestamp>2008-04-20T09:28:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12148</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12149</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12520</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
    <revision>
      <id>12521</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
    <revision>
      <id>12915</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PlayerController (UT3)</title>
    <id>4982</id>
    <revision>
      <id>11359</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11360</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12150</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12151</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12522</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|PlayerController|UE3}}</text>
    </revision>
    <revision>
      <id>12523</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE3}}</text>
    </revision>
    <revision>
      <id>12916</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PulseLineGenerator (U2)</title>
    <id>5244</id>
    <revision>
      <id>12917</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PulseLineGenerator|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within PulseLineGenerator (U2XMP)</title>
    <id>5245</id>
    <revision>
      <id>12918</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|PulseLineGenerator|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within RTPlayerController (UE2Runtime)</title>
    <id>4983</id>
    <revision>
      <id>11361</id>
      <timestamp>2008-04-19T20:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11362</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>11408</id>
      <timestamp>2008-04-20T13:33:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes within PlayerController (UE2Runtime)]]</comment>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2Runtime|Unreal Engine 2 Runtime}}
[[Category:Classes within PlayerController (UE2Runtime)| ]]</text>
    </revision>
    <revision>
      <id>12152</id>
      <timestamp>2008-05-13T11:40:52Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2Runtime|Unreal Engine 2 Runtime|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12153</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2Runtime|Unreal Engine 2 Runtime|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12524</id>
      <timestamp>2008-05-13T14:00:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12525</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2|parent=PlayerController}}</text>
    </revision>
    <revision>
      <id>12919</id>
      <timestamp>2008-05-17T16:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|RTPlayerController|UE2|parent=PlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Sequence (UDK)</title>
    <id>24504</id>
    <revision>
      <id>35677</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Sequence|UE3}}</text>
    </revision>
    <revision>
      <id>35678</id>
      <timestamp>2009-11-06T17:54:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|Sequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within Stream (UT2004)</title>
    <id>4984</id>
    <revision>
      <id>11363</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|Stream|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11364</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Stream|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12154</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Stream|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12155</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Stream|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12526</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|Stream|UE2}}</text>
    </revision>
    <revision>
      <id>12527</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|Stream|UE2}}</text>
    </revision>
    <revision>
      <id>12920</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|Stream|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within StreamPlaylistManager (UT2004)</title>
    <id>4985</id>
    <revision>
      <id>11365</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11366</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12156</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12157</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12528</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UE2}}</text>
    </revision>
    <revision>
      <id>12529</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UE2}}</text>
    </revision>
    <revision>
      <id>12921</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|StreamPlaylistManager|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within TarpBuilder (U2)</title>
    <id>5246</id>
    <revision>
      <id>12922</id>
      <timestamp>2008-05-17T16:11:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|TarpBuilder|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within TarpBuilder (U2XMP)</title>
    <id>5247</id>
    <revision>
      <id>12923</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|TarpBuilder|UE2|parent=ParticleGenerator}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within U2GameInfo (U2XMP)</title>
    <id>5248</id>
    <revision>
      <id>12924</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|U2GameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within U2NPCControllerBasic (U2XMP)</title>
    <id>5249</id>
    <revision>
      <id>12925</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|U2NPCControllerBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within U2Pawn (U2XMP)</title>
    <id>5250</id>
    <revision>
      <id>12926</id>
      <timestamp>2008-05-17T16:11:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|U2Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIConfigFileProvider (UDK)</title>
    <id>24505</id>
    <revision>
      <id>35679</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UE3}}</text>
    </revision>
    <revision>
      <id>35680</id>
      <timestamp>2009-11-06T17:54:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIConfigFileProvider (UT3)</title>
    <id>4986</id>
    <revision>
      <id>11367</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11368</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12158</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12159</id>
      <timestamp>2008-05-13T10:48:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12530</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UE3}}</text>
    </revision>
    <revision>
      <id>12531</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UE3}}</text>
    </revision>
    <revision>
      <id>12927</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIConfigFileProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIContextMenu (UDK)</title>
    <id>24506</id>
    <revision>
      <id>35681</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UE3|parent=UIList}}</text>
    </revision>
    <revision>
      <id>35682</id>
      <timestamp>2009-11-06T17:54:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UE3|parent=UIList}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIContextMenu (UT3)</title>
    <id>4987</id>
    <revision>
      <id>11369</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11370</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12160</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIContextMenu|Unreal Tournament 3|UE3|parent=UIList}}</text>
    </revision>
    <revision>
      <id>12161</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIContextMenu|Unreal Tournament 3|UE3|parent=UIList}}</text>
    </revision>
    <revision>
      <id>12532</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UE3|parent=UIList}}</text>
    </revision>
    <revision>
      <id>12533</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UE3|parent=UIList}}</text>
    </revision>
    <revision>
      <id>12928</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIContextMenu|UE3|parent=UIList}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIDataStore PlayerSettings (UT3)</title>
    <id>4988</id>
    <revision>
      <id>11371</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11372</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12162</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12163</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12534</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|UE3}}</text>
    </revision>
    <revision>
      <id>12535</id>
      <timestamp>2008-05-13T14:18:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|UE3}}</text>
    </revision>
    <revision>
      <id>12929</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_PlayerSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIDataStore SessionSettings (UDK)</title>
    <id>24507</id>
    <revision>
      <id>35683</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UE3}}</text>
    </revision>
    <revision>
      <id>35684</id>
      <timestamp>2009-11-06T17:54:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIDataStore SessionSettings (UT3)</title>
    <id>4989</id>
    <revision>
      <id>11373</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11374</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12164</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12165</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12536</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UE3}}</text>
    </revision>
    <revision>
      <id>12537</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UE3}}</text>
    </revision>
    <revision>
      <id>12930</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIDataStore_SessionSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIEditBox (UDK)</title>
    <id>24508</id>
    <revision>
      <id>35685</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIEditBox|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>35686</id>
      <timestamp>2009-11-06T17:54:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIEditBox|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIEditBox (UT3)</title>
    <id>4990</id>
    <revision>
      <id>11375</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIEditBox|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11376</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIEditBox|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12166</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIEditBox|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12167</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIEditBox|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12538</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIEditBox|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12539</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIEditBox|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12931</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIEditBox|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIInteraction (UDK)</title>
    <id>24509</id>
    <revision>
      <id>35687</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIInteraction|UE3}}</text>
    </revision>
    <revision>
      <id>35688</id>
      <timestamp>2009-11-06T17:54:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIInteraction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIInteraction (UT3)</title>
    <id>4991</id>
    <revision>
      <id>11377</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIInteraction|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11378</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIInteraction|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12168</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIInteraction|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12169</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIInteraction|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12540</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIInteraction|UE3}}</text>
    </revision>
    <revision>
      <id>12541</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIInteraction|UE3}}</text>
    </revision>
    <revision>
      <id>12932</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIInteraction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIList (UDK)</title>
    <id>24510</id>
    <revision>
      <id>35689</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIList|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>35690</id>
      <timestamp>2009-11-06T17:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIList|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIList (UT3)</title>
    <id>4992</id>
    <revision>
      <id>11379</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIList|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11380</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIList|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12170</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIList|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12171</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIList|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12542</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIList|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12543</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIList|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12933</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIList|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIObject (UDK)</title>
    <id>24511</id>
    <revision>
      <id>35691</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIObject|UE3|parent=UIScreenObject}}</text>
    </revision>
    <revision>
      <id>35692</id>
      <timestamp>2009-11-06T17:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIObject|UE3|parent=UIScreenObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIObject (UT3)</title>
    <id>193</id>
    <revision>
      <id>756</id>
      <timestamp>2008-03-08T12:55:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>test</comment>
      <text xml:space="preserve">Classes within [[UE3:UIObject (UT3)|UIObject]].</text>
    </revision>
    <revision>
      <id>901</id>
      <timestamp>2008-03-16T09:18:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Classes within [[UE3:UIObject (UT3)|UIObject]].

[[Category:Classes within other classes]]</text>
    </revision>
    <revision>
      <id>902</id>
      <timestamp>2008-03-16T09:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Classes within [[UE3:UIObject (UT3)|UIObject]].

[[Category:Classes within other classes|UIObject (UT3)]]</text>
    </revision>
    <revision>
      <id>11381</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIObject|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11382</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIObject|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12172</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIObject|Unreal Tournament 3|UE3|parent=UIScreenObject}}</text>
    </revision>
    <revision>
      <id>12173</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIObject|Unreal Tournament 3|UE3|parent=UIScreenObject}}</text>
    </revision>
    <revision>
      <id>12544</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIObject|UE3|parent=UIScreenObject}}</text>
    </revision>
    <revision>
      <id>12545</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIObject|UE3|parent=UIScreenObject}}</text>
    </revision>
    <revision>
      <id>12934</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIObject|UE3|parent=UIScreenObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIObjectList (UDK)</title>
    <id>24512</id>
    <revision>
      <id>35693</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIObjectList|UE3|parent=UIList}}</text>
    </revision>
    <revision>
      <id>35694</id>
      <timestamp>2009-11-06T17:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIObjectList|UE3|parent=UIList}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIOptionListBase (UDK)</title>
    <id>24513</id>
    <revision>
      <id>35695</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>35696</id>
      <timestamp>2009-11-06T17:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIOptionListBase (UT3)</title>
    <id>4993</id>
    <revision>
      <id>11383</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11384</id>
      <timestamp>2008-04-20T09:28:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12174</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12175</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12546</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12547</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12935</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIOptionListBase|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIScreenObject (UDK)</title>
    <id>24514</id>
    <revision>
      <id>35697</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UE3}}</text>
    </revision>
    <revision>
      <id>35698</id>
      <timestamp>2009-11-06T17:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIScreenObject (UT3)</title>
    <id>4994</id>
    <revision>
      <id>11385</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11386</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12176</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIScreenObject|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12177</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIScreenObject|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12548</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UE3}}</text>
    </revision>
    <revision>
      <id>12549</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UE3}}</text>
    </revision>
    <revision>
      <id>12936</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIScreenObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIScrollbar (UDK)</title>
    <id>24515</id>
    <revision>
      <id>35699</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>35700</id>
      <timestamp>2009-11-06T17:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UIScrollbar (UT3)</title>
    <id>4995</id>
    <revision>
      <id>11387</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11388</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12178</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIScrollbar|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12179</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIScrollbar|Unreal Tournament 3|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12550</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12551</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UE3|parent=UIObject}}</text>
    </revision>
    <revision>
      <id>12937</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UIScrollbar|UE3|parent=UIObject}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UISkin (UDK)</title>
    <id>24516</id>
    <revision>
      <id>35701</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UISkin|UE3}}</text>
    </revision>
    <revision>
      <id>35702</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UISkin|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UISkin (UT3)</title>
    <id>4996</id>
    <revision>
      <id>11389</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UISkin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11390</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UISkin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12180</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UISkin|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12181</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UISkin|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12552</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UISkin|UE3}}</text>
    </revision>
    <revision>
      <id>12553</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UISkin|UE3}}</text>
    </revision>
    <revision>
      <id>12938</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UISkin|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UT2K4ServerBrowser (UT2004)</title>
    <id>4997</id>
    <revision>
      <id>11391</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11392</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12182</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12183</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12554</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UE2}}</text>
    </revision>
    <revision>
      <id>12555</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UE2}}</text>
    </revision>
    <revision>
      <id>12939</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UT2K4ServerBrowser|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UTConsolePlayerController (UDK)</title>
    <id>24517</id>
    <revision>
      <id>35703</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UE3|parent=UTPlayerController}}</text>
    </revision>
    <revision>
      <id>35704</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UE3|parent=UTPlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UTConsolePlayerController (UT3)</title>
    <id>4998</id>
    <revision>
      <id>11393</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11394</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11409</id>
      <timestamp>2008-04-20T13:35:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes within UTPlayerController (UT3)]]</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UT3|Unreal Tournament 3}}
[[Category:Classes within UTPlayerController (UT3)| ]]</text>
    </revision>
    <revision>
      <id>12184</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|Unreal Tournament 3|UE3|parent=UTPlayerController}}</text>
    </revision>
    <revision>
      <id>12185</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|Unreal Tournament 3|UE3|parent=UTPlayerController}}</text>
    </revision>
    <revision>
      <id>12556</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UE3|parent=UTPlayerController}}</text>
    </revision>
    <revision>
      <id>12557</id>
      <timestamp>2008-05-13T14:18:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UE3|parent=UTPlayerController}}</text>
    </revision>
    <revision>
      <id>12940</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UTConsolePlayerController|UE3|parent=UTPlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UTPlayerController (UDK)</title>
    <id>24518</id>
    <revision>
      <id>35705</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>35706</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UTPlayerController (UT3)</title>
    <id>4999</id>
    <revision>
      <id>11395</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11396</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11411</id>
      <timestamp>2008-04-20T13:35:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes within GamePlayerController (UT3)]]</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UT3|Unreal Tournament 3}}
[[Category:Classes within GamePlayerController (UT3)| ]]</text>
    </revision>
    <revision>
      <id>12186</id>
      <timestamp>2008-05-13T12:39:17Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTPlayerController|Unreal Tournament 3|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12187</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|Unreal Tournament 3|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12558</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12559</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
    <revision>
      <id>12941</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UTPlayerController|UE3|parent=GamePlayerController}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UTServerAdmin (UT2003)</title>
    <id>5000</id>
    <revision>
      <id>11397</id>
      <timestamp>2008-04-19T20:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>11398</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12188</id>
      <timestamp>2008-05-13T11:42:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12189</id>
      <timestamp>2008-05-13T10:48:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12560</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UE2}}</text>
    </revision>
    <revision>
      <id>12561</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UE2}}</text>
    </revision>
    <revision>
      <id>12942</id>
      <timestamp>2008-05-17T16:11:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within UTServerAdmin (UT2004)</title>
    <id>5001</id>
    <revision>
      <id>11399</id>
      <timestamp>2008-04-19T20:05:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>11400</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12190</id>
      <timestamp>2008-05-13T11:43:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12191</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12562</id>
      <timestamp>2008-05-13T14:00:50Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UE2}}</text>
    </revision>
    <revision>
      <id>12563</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UE2}}</text>
    </revision>
    <revision>
      <id>12943</id>
      <timestamp>2008-05-17T16:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category within classes|UTServerAdmin|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Classes within other classes</title>
    <id>220</id>
    <revision>
      <id>881</id>
      <timestamp>2008-03-16T08:53:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es declared [[within]] other classes.  [[Category:Classes| 2{{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es declared [[within]] other classes.

[[Category:Classes| 2{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>900</id>
      <timestamp>2008-03-16T09:16:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[class]]es declared [[within]] other classes.

[[Category:Classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Compiler errors</title>
    <id>29034</id>
    <revision>
      <id>43567</id>
      <timestamp>2010-07-01T12:31:48Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>Created page with 'This category contains [[articles]] that provide descriptions to errors occurred while compiling.  [[Category:Compiler]]'</comment>
      <text xml:space="preserve">This category contains [[articles]] that provide descriptions to errors occurred while compiling.

[[Category:Compiler]]</text>
    </revision>
    <revision>
      <id>43568</id>
      <timestamp>2010-07-01T12:33:16Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>fixed mistake</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains that provide descriptions to errors occurred while compiling.

[[Category:Compiler]]</text>
    </revision>
    <revision>
      <id>43594</id>
      <timestamp>2010-07-03T01:51:25Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles that provide descriptions to errors occurred while compiling.

[[Category:Compiler]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Console Commands</title>
    <id>29126</id>
    <revision>
      <id>43864</id>
      <timestamp>2010-08-13T11:20:30Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>Created page with 'This [[Project:Categories|category]] contains all articles listing [[console command]]s.  [[Category:Article categories| {{PAGENAME}}]]'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles listing [[console command]]s.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UDK-specific classes</title>
    <id>28948</id>
    <revision>
      <id>43180</id>
      <timestamp>2010-05-03T17:03:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category game classes|UDK|UE3|custom=yes}}'</comment>
      <text xml:space="preserve">{{category game classes|UDK|UE3|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UE1-specific classes</title>
    <id>5052</id>
    <revision>
      <id>11645</id>
      <timestamp>2008-04-29T09:12:46Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>New page: {{category game classes|UE1|Unreal Engine 1|custom=yes}}</comment>
      <text xml:space="preserve">{{category game classes|UE1|Unreal Engine 1|custom=yes}}</text>
    </revision>
    <revision>
      <id>12626</id>
      <timestamp>2008-05-13T14:33:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game classes|UE1|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UE2-specific classes</title>
    <id>4811</id>
    <revision>
      <id>10916</id>
      <timestamp>2008-04-08T12:16:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UE2|Unreal Engine 2}}</comment>
      <text xml:space="preserve">{{category game classes|UE2|Unreal Engine 2}}</text>
    </revision>
    <revision>
      <id>10919</id>
      <timestamp>2008-04-08T12:18:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>forgot &quot;custom=yes&quot; in template</comment>
      <text xml:space="preserve">{{category game classes|UE2|Unreal Engine 2|custom=yes}}</text>
    </revision>
    <revision>
      <id>12629</id>
      <timestamp>2008-05-13T14:33:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game classes|UE2|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UE3-specific classes</title>
    <id>5131</id>
    <revision>
      <id>12622</id>
      <timestamp>2008-05-13T14:30:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UE3|custom=yes}}</comment>
      <text xml:space="preserve">{{category game classes|UE3|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UE3-specific interfaces</title>
    <id>5132</id>
    <revision>
      <id>12623</id>
      <timestamp>2008-05-13T14:31:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game interfaces|UE3}}</comment>
      <text xml:space="preserve">{{category game interfaces|UE3}}</text>
    </revision>
    <revision>
      <id>12625</id>
      <timestamp>2008-05-13T14:32:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game interfaces|UE3|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UT-specific classes</title>
    <id>4777</id>
    <revision>
      <id>10775</id>
      <timestamp>2008-04-04T14:17:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT|Unreal Tournament|custom=yes}}</comment>
      <text xml:space="preserve">{{category game classes|UT|Unreal Tournament|custom=yes}}</text>
    </revision>
    <revision>
      <id>28630</id>
      <timestamp>2008-05-17T22:04:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated for new template version</comment>
      <text xml:space="preserve">{{category game classes|UT|UE1|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UT2003-specific classes</title>
    <id>4775</id>
    <revision>
      <id>10773</id>
      <timestamp>2008-04-04T14:16:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT2003|Unreal Tournament 2003|custom=yes}}</comment>
      <text xml:space="preserve">{{category game classes|UT2003|Unreal Tournament 2003|custom=yes}}</text>
    </revision>
    <revision>
      <id>10917</id>
      <timestamp>2008-04-08T12:17:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Custom UE2-specific classes]]</comment>
      <text xml:space="preserve">{{category game classes|UT2003|Unreal Tournament 2003|custom=yes}}
[[Category:Custom UE2-specific classes| ]]</text>
    </revision>
    <revision>
      <id>28656</id>
      <timestamp>2008-05-20T10:48:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated to reflect template changes</comment>
      <text xml:space="preserve">{{category game classes|UT2003|UE2|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UT2004-specific classes</title>
    <id>4774</id>
    <revision>
      <id>10772</id>
      <timestamp>2008-04-04T14:16:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT2004|Unreal Tournament 2004|custom=yes}}</comment>
      <text xml:space="preserve">{{category game classes|UT2004|Unreal Tournament 2004|custom=yes}}</text>
    </revision>
    <revision>
      <id>10918</id>
      <timestamp>2008-04-08T12:18:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Custom UE2-specific classes]]</comment>
      <text xml:space="preserve">{{category game classes|UT2004|Unreal Tournament 2004|custom=yes}}
[[Category:Custom UE2-specific classes| ]]</text>
    </revision>
    <revision>
      <id>28657</id>
      <timestamp>2008-05-20T10:49:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated to reflect template changes</comment>
      <text xml:space="preserve">{{category game classes|UT2004|UE2|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UT3-specific classes</title>
    <id>4776</id>
    <revision>
      <id>10774</id>
      <timestamp>2008-04-04T14:16:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT3|Unreal Tournament 3|custom=yes}}</comment>
      <text xml:space="preserve">{{category game classes|UT3|Unreal Tournament 3|custom=yes}}</text>
    </revision>
    <revision>
      <id>28655</id>
      <timestamp>2008-05-20T10:47:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated to reflect template changes</comment>
      <text xml:space="preserve">{{category game classes|UT3|UE3|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom UT3-specific interfaces</title>
    <id>24436</id>
    <revision>
      <id>35528</id>
      <timestamp>2009-10-24T19:03:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category game interfaces|UT3|UE3|custom=yes}}'</comment>
      <text xml:space="preserve">{{category game interfaces|UT3|UE3|custom=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom classes</title>
    <id>218</id>
    <revision>
      <id>878</id>
      <timestamp>2008-03-16T08:52:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] is the root for all categories of custom [[UnrealScript]] [[class]]es and [[interface]]s.  Custom classes are grouped by [[:Category:Custom classes by ...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all categories of custom [[UnrealScript]] [[class]]es and [[interface]]s.

Custom classes are grouped by [[:Category:Custom classes by game|game]], [[:Category:Custom classes within other classes|outer class]] or [[:Category:Custom classes implementing an interface|implemented interface]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

[[Category:Classes| 1{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>895</id>
      <timestamp>2008-03-16T09:15:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all categories of custom [[UnrealScript]] [[class]]es and [[interface]]s.

Custom classes are grouped by [[:Category:Custom classes by game|game]], [[:Category:Custom classes within other classes|outer class]] or [[:Category:Custom classes implementing an interface|implemented interface]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

[[Category:Classes|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom classes by game</title>
    <id>223</id>
    <revision>
      <id>886</id>
      <timestamp>2008-03-16T09:03:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by game.  [[Category:Classes by game|  {{PAGENAME}}]] [[Category:Custom classes|  {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by game.

[[Category:Classes by game|  {{PAGENAME}}]]
[[Category:Custom classes|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>889</id>
      <timestamp>2008-03-16T09:07:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by game.

[[Category:Classes by game|  {{PAGENAME}}]]
[[Category:Custom classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom classes implementing an interface</title>
    <id>225</id>
    <revision>
      <id>890</id>
      <timestamp>2008-03-16T09:09:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by their implemented [[interface]]s. There is no further separation between stock and custom interfaces here...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by their implemented [[interface]]s. There is no further separation between stock and custom interfaces here.

==See also==
* [[:Category:Interfaces]]

[[Category:Custom classes|  {{PAGENAME}}]]
[[Category:Classes implementing an interface|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>891</id>
      <timestamp>2008-03-16T09:10:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by their implemented [[interface]]s. There is no further separation between stock and custom interfaces here.

==See also==
* [[:Category:Interfaces]]

[[Category:Custom classes|  {{PAGENAME}}]]
[[Category:Classes implementing an interface| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>892</id>
      <timestamp>2008-03-16T09:10:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es by their implemented [[interface]]s. There is no further separation between stock and custom interfaces here.

==See also==
* [[:Category:Interfaces]]

[[Category:Custom classes| {{PAGENAME}}]]
[[Category:Classes implementing an interface|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom classes within other classes</title>
    <id>224</id>
    <revision>
      <id>888</id>
      <timestamp>2008-03-16T09:06:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es declared [[within]] other classes.  [[Category:Custom classes| {{PAGENAME}}]] [[Category:Classes within othe...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[class]]es declared [[within]] other classes.

[[Category:Custom classes| {{PAGENAME}}]]
[[Category:Classes within other classes|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom interfaces</title>
    <id>222</id>
    <revision>
      <id>883</id>
      <timestamp>2008-03-16T08:57:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] is the root for all categories of custom [[UnrealScript]] [[interface]]s.  Custom interfaces can be browsed by [[:Category:Interfaces by game|game]].  ...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all categories of custom [[UnrealScript]] [[interface]]s.

Custom interfaces can be browsed by [[:Category:Interfaces by game|game]].

[[Category:Custom classes| {{PAGENAME}}]]
[[Category:Interfaces| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>887</id>
      <timestamp>2008-03-16T09:05:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all categories of custom [[UnrealScript]] [[interface]]s.

Custom interfaces can be browsed by [[:Category:Interfaces by game|game]].

[[Category:Custom classes|  {{PAGENAME}}]]
[[Category:Interfaces|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Custom interfaces by game</title>
    <id>5148</id>
    <revision>
      <id>12675</id>
      <timestamp>2008-05-17T10:24:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups custom [[UnrealScript]] [[interfaces]] by game.  [[Category:Interfaces by game|  {{PAGENAME}}]] [[Category:Custom classes by game|  {{PAGENAME}}...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[interfaces]] by game.

[[Category:Interfaces by game|  {{PAGENAME}}]]
[[Category:Custom classes by game|  {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>12676</id>
      <timestamp>2008-05-17T10:26:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Custom interfaces]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups custom [[UnrealScript]] [[interfaces]] by game.

[[Category:Interfaces by game| {{PAGENAME}}]]
[[Category:Custom classes by game| {{PAGENAME}}]]
[[Category:Custom interfaces|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Disambiguation</title>
    <id>23795</id>
    <revision>
      <id>33114</id>
      <timestamp>2008-10-10T11:01:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] lists all disambiguation pages.</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] lists all disambiguation pages.</text>
    </revision>
  </page>
  <page>
    <title>Category:Documentation examples</title>
    <id>267</id>
    <revision>
      <id>999</id>
      <timestamp>2008-03-20T13:05:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains examples used in the {{SITENAME}} [[Help:Contents|user documentation]].  [[Category:Help]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains examples used in the {{SITENAME}} [[Help:Contents|user documentation]].

[[Category:Help]]</text>
    </revision>
    <revision>
      <id>1020</id>
      <timestamp>2008-03-20T13:17:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains examples used in the {{SITENAME}} [[Help:Contents|user documentation]].

[[Category:Help| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Documentation subpages</title>
    <id>274</id>
    <revision>
      <id>1031</id>
      <timestamp>2008-03-20T13:32:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains documentation pages for [[Help:Templates|templates]].  [[Category:Template categories| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains documentation pages for [[Help:Templates|templates]].

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1032</id>
      <timestamp>2008-03-20T13:32:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Help]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains documentation pages for [[Help:Templates|templates]].

[[Category:Template categories| {{PAGENAME}}]]
[[Category:Help| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Editor stubs</title>
    <id>120</id>
    <revision>
      <id>361</id>
      <timestamp>2008-02-24T14:16:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This is the [[Project:Categories|category]] of [[UnrealEd]]-related [[Project:Stub|stub articles]].  If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:E...</comment>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[UnrealEd]]-related [[Project:Stub|stub articles]].

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|extending]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the stub tag from them.

[[Category:Stubs| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Enums</title>
    <id>5009</id>
    <revision>
      <id>11417</id>
      <timestamp>2008-04-20T14:01:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[enum]] categories.  Enums can be browsed by [[:Category:Interfaces by game|game]]. Custom enums do not have thei...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[enum]] categories.

Enums can be browsed by [[:Category:Interfaces by game|game]]. Custom enums do not have their own categories.

==See also==
* [[:Category:Structs]]

[[Category:Classes|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:FAL images</title>
    <id>283</id>
    <revision>
      <id>1045</id>
      <timestamp>2008-03-20T14:57:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Free Art License|]].  [[Category:Media categories| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:Free Art License|Free Art License]].

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:GFDL images</title>
    <id>286</id>
    <revision>
      <id>1048</id>
      <timestamp>2008-03-20T15:00:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:GNU Free Documentation License|GNU Free Documentation License]].  [[Category:Media categories| {{PAGENAM...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:GNU Free Documentation License|GNU Free Documentation License]].

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:GPL images</title>
    <id>284</id>
    <revision>
      <id>1046</id>
      <timestamp>2008-03-20T14:59:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:GNU General Public License|GNU General Public License]].  [[Category:Media categories| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:GNU General Public License|GNU General Public License]].

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Help</title>
    <id>64</id>
    <revision>
      <id>148</id>
      <timestamp>2007-11-04T09:36:13Z</timestamp>
      <contributor>
        <ip>BrianOregon</ip>
      </contributor>
      <minor/>
      <comment>Undo revision 141395 by [[Special:Contributions/129.241.133.71|129.241.133.71]] ([[User talk:129.241.133.71|Talk]])</comment>
      <text xml:space="preserve">[[Image:PD-Help icon.png|right|100px|Your help is welcomed. Writers needed.]]

[[:Category:Help]] is for MediaWiki generic site user help. Only pages in namespace &quot;Help:&quot; should be in this category. Note that all pages in namespace &quot;Help:&quot; are released into the [http://en.wikipedia.org/wiki/Public_domain Public domain] so that they can be easily imported into any MediaWiki instance regardless of the specific wiki's own license. See '''[http://www.mediawiki.com/wiki/Project:PD_Help Project:PD Help]''' if you want to help us.

''Every single English-language page within the set of public domain Help pages should directly be categorized &lt;nowiki&gt;[[Category:Help]]&lt;/nowiki&gt; (additionally putting pages in other categories to provide further sorting is possible). This is needed because of later half-automated creation of the PD Help package from this category.''

The front page is '''[[Help:Contents]]'''

{{Languages}}

[[Category:Top level]]
[[Category:Documentation]]</text>
    </revision>
    <revision>
      <id>149</id>
      <timestamp>2008-02-18T18:42:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">[[Image:PD-Help icon.png|right|100px|Your help is welcomed. Writers needed.]]

[[:Category:Help]] is for MediaWiki generic site user help. Only pages in namespace &quot;Help:&quot; should be in this category. Note that all pages in namespace &quot;Help:&quot; are released into the [http://en.wikipedia.org/wiki/Public_domain Public domain] so that they can be easily imported into any MediaWiki instance regardless of the specific wiki's own license. See '''[http://www.mediawiki.com/wiki/Project:PD_Help Project:PD Help]''' if you want to help us.

''Every single English-language page within the set of public domain Help pages should directly be categorized &lt;nowiki&gt;[[Category:Help]]&lt;/nowiki&gt; (additionally putting pages in other categories to provide further sorting is possible). This is needed because of later half-automated creation of the PD Help package from this category.''

The front page is '''[[Help:Contents]]'''

{{Languages}}

[[Category:Top level]]
[[Category:Documentation]]</text>
    </revision>
    <revision>
      <id>188</id>
      <timestamp>2008-02-18T18:59:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">[[:Category:Help]] contains all Unreal Wiki site user help pages.

Most of these pages have been copied from the [http://www.mediawiki.org/wiki/Project:PD_help MediaWiki PD help project] and adapted to Unreal Wiki.

The front page is '''[[Help:Contents]]'''.</text>
    </revision>
    <revision>
      <id>997</id>
      <timestamp>2008-03-20T13:02:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all Unreal Wiki site user help pages.

Most of these pages have been copied from the [http://www.mediawiki.org/wiki/Project:PD_help MediaWiki PD help project] and adapted to Unreal Wiki.

The front page is '''[[Help:Contents]]'''.

[[Category:Categories]]</text>
    </revision>
    <revision>
      <id>1017</id>
      <timestamp>2008-03-20T13:16:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all Unreal Wiki site user help pages.

Most of these pages have been copied from the [http://www.mediawiki.org/wiki/Project:PD_help MediaWiki PD help project] and adapted to Unreal Wiki.

The front page is '''[[Help:Contents]]'''.

[[Category:Categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Helping out</title>
    <id>126</id>
    <revision>
      <id>368</id>
      <timestamp>2008-02-24T14:31:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] lists pages with details on how to '''help Unreal Wiki'''. Its subcategories list pages that need some work done in order to improve them.</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] lists pages with details on how to '''help Unreal Wiki'''. Its subcategories list pages that need some work done in order to improve them.</text>
    </revision>
    <revision>
      <id>994</id>
      <timestamp>2008-03-20T12:58:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Policies and guidelines]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] lists pages with details on how to '''help Unreal Wiki'''. Its subcategories list pages that need some work done in order to improve them.

[[Category:Policies and guidelines]]</text>
    </revision>
    <revision>
      <id>1021</id>
      <timestamp>2008-03-20T13:17:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] lists pages with details on how to '''help Unreal Wiki'''. Its subcategories list pages that need some work done in order to improve them.

[[Category:Policies and guidelines| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Infobox templates</title>
    <id>271</id>
    <revision>
      <id>1028</id>
      <timestamp>2008-03-20T13:27:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains [[Help:Templates|templates]] that create an [[Project:Info boxes|info box]] when [[Wikipedia:Wikipedia:Translusion|transcluded]] on article pa...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that create an [[Project:Info boxes|info box]] when [[Wikipedia:Wikipedia:Translusion|transcluded]] on article pages.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1074</id>
      <timestamp>2008-03-20T17:34:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>link fixes</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that create an [[Project:Info boxes|info or navigation box]] when [[wp:Wikipedia:Transclusion|transcluded]] on article pages.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces</title>
    <id>217</id>
    <revision>
      <id>875</id>
      <timestamp>2008-03-16T08:48:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[interface]] categories.  Interfaces can be browsed by [[:Category:Interfaces by game|game]] or [[:Category:Inter...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[interface]] categories.

Interfaces can be browsed by [[:Category:Interfaces by game|game]] or [[:Category:Interfaces by package|package]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

[[Category:Classes]]</text>
    </revision>
    <revision>
      <id>876</id>
      <timestamp>2008-03-16T08:51:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[interface]] categories.

Interfaces can be browsed by [[:Category:Interfaces by game|game]] or [[:Category:Interfaces by package|package]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

[[Category:Classes| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>877</id>
      <timestamp>2008-03-16T08:52:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed sorting</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[interface]] categories.

Interfaces can be browsed by [[:Category:Interfaces by game|game]] or [[:Category:Interfaces by package|package]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

[[Category:Classes| 0{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>885</id>
      <timestamp>2008-03-16T08:59:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>linked Category:Classes implementing an interface</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[interface]] categories.

Interfaces can be browsed by [[:Category:Interfaces by game|game]] or [[:Category:Interfaces by package|package]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

==See also==
* [[:Category:Classes implementing an interface]]

[[Category:Classes| 0{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>896</id>
      <timestamp>2008-03-16T09:15:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[interface]] categories.

Interfaces can be browsed by [[:Category:Interfaces by game|game]] or [[:Category:Interfaces by package|package]]. [[:Category:Custom interfaces|Custom interfaces]] are grouped similarly in their own categories.

==See also==
* [[:Category:Classes implementing an interface]]

[[Category:Classes|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces by game</title>
    <id>226</id>
    <revision>
      <id>893</id>
      <timestamp>2008-03-16T09:13:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[UnrealScript]] [[interface]]s by game.  [[Category:Interfaces| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[interface]]s by game.

[[Category:Interfaces| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces by package</title>
    <id>227</id>
    <revision>
      <id>894</id>
      <timestamp>2008-03-16T09:13:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[UnrealScript]] [[interface]]s by containing package.  [[Category:Interfaces| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[interface]]s by containing package.

[[Category:Interfaces| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>932</id>
      <timestamp>2008-03-16T12:52:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[UnrealScript]] [[interface]]s by containing package.

[[Category:Interfaces| {{PAGENAME}}]]
[[Category:Classes by package| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UDK package Core</title>
    <id>24519</id>
    <revision>
      <id>35707</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|Core|UDK}}</text>
    </revision>
    <revision>
      <id>35708</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package interfaces|Core|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UDK package Engine</title>
    <id>24520</id>
    <revision>
      <id>35709</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|Engine|UDK}}</text>
    </revision>
    <revision>
      <id>35710</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package interfaces|Engine|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UDK package GameFramework</title>
    <id>24521</id>
    <revision>
      <id>35711</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|GameFramework|UDK}}</text>
    </revision>
    <revision>
      <id>35712</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package interfaces|GameFramework|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UDK package UnrealEd</title>
    <id>24522</id>
    <revision>
      <id>35713</id>
      <timestamp>2009-11-06T18:47:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|UnrealEd|UDK}}</text>
    </revision>
    <revision>
      <id>35714</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category package interfaces|UnrealEd|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UT3 package Core</title>
    <id>5002</id>
    <revision>
      <id>11401</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package interfaces|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11402</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12192</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12193</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|Core|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12564</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|Core|UT3}}</text>
    </revision>
    <revision>
      <id>12565</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|Core|UT3}}</text>
    </revision>
    <revision>
      <id>12944</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package interfaces|Core|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UT3 package Engine</title>
    <id>5003</id>
    <revision>
      <id>11403</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11404</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12194</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12195</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12566</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3}}</text>
    </revision>
    <revision>
      <id>12567</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3}}</text>
    </revision>
    <revision>
      <id>12945</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package interfaces|Engine|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Interfaces in UT3 package WebAdmin</title>
    <id>246</id>
    <revision>
      <id>931</id>
      <timestamp>2008-03-16T12:51:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category package interfaces|WebAdmin|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11405</id>
      <timestamp>2008-04-19T20:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>auto-generated class category page</comment>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>11406</id>
      <timestamp>2008-04-20T09:28:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12196</id>
      <timestamp>2008-05-13T12:39:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12197</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12568</id>
      <timestamp>2008-05-13T14:00:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3}}</text>
    </revision>
    <revision>
      <id>12569</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3}}</text>
    </revision>
    <revision>
      <id>12946</id>
      <timestamp>2008-05-17T16:11:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category package interfaces|WebAdmin|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:LGPL images</title>
    <id>285</id>
    <revision>
      <id>1047</id>
      <timestamp>2008-03-20T14:59:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:GNU Lesser General Public License|GNU Lesser General Public License]].  [[Category:Media categories| {{P...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images uploaded under the [[Wikipedia:GNU Lesser General Public License|GNU Lesser General Public License]].

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Algorithm</title>
    <id>881</id>
    <revision>
      <id>2441</id>
      <timestamp>2005-01-11T15:53:09Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>despam</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category for algorithms implemented in [[Legacy:UnrealScript|UnrealScript]].

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Algorithm]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
[[Category:Legacy Category|Algorithm]]</text>
    </revision>
    <revision>
      <id>2442</id>
      <timestamp>2004-12-04T13:23:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category for algorithms implemented in [[Legacy:UnrealScript|UnrealScript]].

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Algorithm]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
[[Category:Legacy Category|Algorithm]]</text>
    </revision>
    <revision>
      <id>2443</id>
      <timestamp>2005-01-11T15:13:47Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">{{Legacy category}}
*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-scar.boom.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-rosacea.boom.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-product.boom.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-medicine.boom.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://acne-treatment.boom.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>44267</id>
      <timestamp>2011-02-08T21:44:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to programming articles category</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category for algorithms implemented in [[Legacy:UnrealScript|UnrealScript]].

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Algorithm]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
[[Category:Legacy Category|Algorithm]]
[[Category:Programming articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Answer Needed</title>
    <id>476</id>
    <revision>
      <id>1532</id>
      <timestamp>2006-10-22T08:30:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]] for questions that require an answer.

==How to use==

Writing a document but you're missing some vital information? Use this tag. Eg:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Wiki Markup'''''
| style=&quot;text-align: center&quot; |'''''Result'''''
|-
|&lt;code&gt;Set the bPeanutButter variable to enable peanuts. ''Not sure what happens if you have a Jelly value of less than 6.!'' [[Answer&lt;/code&gt;&lt;code&gt; Needed]].&lt;/code&gt;
|Set the bPeanutButter variable to enable peanuts. ''Not sure what happens if you have a Jelly value of less than 6.!'' [[Answer Needed
|]].
|}

==How to help==

Look at the pages listed below in the search results. Find the &quot;Answer Needed&quot; tag in them. If you know the answer, rewrite the text to include the information and remove the tag. Eg:

{{innerbox| Set the bPeanutButter variable to enable peanuts. A Jelly value of less than 6 will result in the spawning of a JellyCreation actor in the EnoughJelly event.

}}

Pages that no longer have the tag will be automatically removed from the list below.

----

'''Lilguy:'''Not sure if this was in response to my post on the UT2004 mods mailing list, but it seems to fit the bill perfectly. Perhaps we could create a page that's devoted to listing the solutions to questions formerly using this tag? maybe another tag for Editing questions answered?

'''Tarquin:''' Not sure we're talking about the same thing. Got a question &amp;ndash; go to the [[Legacy:Help Desk|Help Desk]]. &quot;Answer Needed&quot; is for a gap in a document that requires information. Put the tag in, and the person answering it should ''rewrite'' that part of the document and remove the tag. We shouldn't have a page listing solutions, because solutions should be rewritten into the main body of the wiki. Is the above clearer?

'''Lilguy:''' Gotcha, that all makes sense now. I had suggested to the mailing list that we keep a running tab of all the questions that people asked on the mailing list that were as-yet unanswered, and once questions got answered, we could move them to a list of links to solutions. I see now though that this type of thing probably belongs in the FAQ section somewhere, and we could use the Answer Needed tag to put un-answered questions in there. Makes sense, right?

'''Tarquin:''' What we might do is prune things from the [[Legacy:Help Desk|Help Desk]] to a special page of unanswered questions. But the risk is of it becoming a ghost town... :( This tag is really meant for very small things, in [[MeatBall:DocumentMode]] pages.</text>
    </revision>
    <revision>
      <id>1533</id>
      <timestamp>2004-05-19T18:51:09Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]] for questions that require an answer.

==How to use==

Writing a document but you're missing some vital information? Use this tag. Eg:

{{innerbox| Set the bPeanutButter variable to enable peanuts. ''Not sure what happens if you have a Jelly value of less than 6.!'' [[:Category:Legacy Answer Needed]].

}}

==How to help==

Look at the pages listed below in the search results. Find the &quot;Answer Needed&quot; tag in them. If you know the answer, rewrite the text to include the information and remove the tag. Eg:

{{innerbox| Set the bPeanutButter variable to enable peanuts. A Jelly value of less than 6 will result in the spawning of a JellyCreation actor in the EnoughJelly event.

}}

Pages that no longer have the tag will be automatically removed from the list below.

----

'''Lilguy:'''Not sure if this was in response to my post on the UT2004 mods mailing list, but it seems to fit the bill perfectly. Perhaps we could create a page that's devoted to listing the solutions to questions formerly using this tag? maybe another tag for Editing questions answered?

'''Tarquin:''' Not sure we're talking about the same thing. Got a question &amp;ndash; go to the [[Legacy:Help Desk|Help Desk]]. &quot;Answer Needed&quot; is for a gap in a document that requires information. Put the tag in, and the person answering it should ''rewrite'' that part of the document and remove the tag. We shouldn't have a page listing solutions, because solutions should be rewritten into the main body of the wiki. Is the above clearer?

'''Lilguy:''' Gotcha, that all makes sense now. I had suggested to the mailing list that we keep a running tab of all the questions that people asked on the mailing list that were as-yet unanswered, and once questions got answered, we could move them to a list of links to solutions. I see now though that this type of thing probably belongs in the FAQ section somewhere, and we could use the Answer Needed tag to put un-answered questions in there. Makes sense, right?

'''Tarquin:''' What we might do is prune things from the [[Legacy:Help Desk|Help Desk]] to a special page of unanswered questions. But the risk is of it becoming a ghost town... :( This tag is really meant for very small things, in [[Meatball:DocumentMode]] pages.
[[Category:Legacy Answer Needed|Answer Needed]]</text>
    </revision>
    <revision>
      <id>1534</id>
      <timestamp>2005-01-19T23:30:11Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]] for questions that require an answer.

==How to use==

Writing a document but you're missing some vital information? Use this tag. Eg:

{{innerbox| Set the bPeanutButter variable to enable peanuts. ''Not sure what happens if you have a Jelly value of less than 6.!'' [[:Category:Legacy Answer Needed]].

}}

==How to help==

Look at the pages listed below in the search results. Find the &quot;Answer Needed&quot; tag in them. If you know the answer, rewrite the text to include the information and remove the tag. Eg:

{{innerbox| Set the bPeanutButter variable to enable peanuts. A Jelly value of less than 6 will result in the spawning of a JellyCreation actor in the EnoughJelly event.

}}

Pages that no longer have the tag will be automatically removed from the list below.

----

'''Lilguy:'''Not sure if this was in response to my post on the UT2004 mods mailing list, but it seems to fit the bill perfectly. Perhaps we could create a page that's devoted to listing the solutions to questions formerly using this tag? maybe another tag for Editing questions answered?

'''Tarquin:''' Not sure we're talking about the same thing. Got a question &amp;ndash; go to the [[Legacy:Help Desk|Help Desk]]. &quot;Answer Needed&quot; is for a gap in a document that requires information. Put the tag in, and the person answering it should ''rewrite'' that part of the document and remove the tag. We shouldn't have a page listing solutions, because solutions should be rewritten into the main body of the wiki. Is the above clearer?

'''Lilguy:''' Gotcha, that all makes sense now. I had suggested to the mailing list that we keep a running tab of all the questions that people asked on the mailing list that were as-yet unanswered, and once questions got answered, we could move them to a list of links to solutions. I see now though that this type of thing probably belongs in the FAQ section somewhere, and we could use the Answer Needed tag to put un-answered questions in there. Makes sense, right?

'''Tarquin:''' What we might do is prune things from the [[Legacy:Help Desk|Help Desk]] to a special page of unanswered questions. But the risk is of it becoming a ghost town... :( This tag is really meant for very small things, in [[MeatBall:DocumentMode]] pages.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Application</title>
    <id>813</id>
    <revision>
      <id>2289</id>
      <timestamp>2004-12-25T11:02:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages about software packages. 

* Members of this category are listed below
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Application]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics ==
* [[Legacy:Application|Application]] &amp;ndash; a hand-compiled list, subdivided into sections
* [[:Category:Legacy Game]] &amp;ndash; even though they're applications too, the actual games themselves are sort of different in that they use content rather than create it.
[[Category:Legacy Category|Application]]</text>
    </revision>
    <revision>
      <id>2290</id>
      <timestamp>2004-01-27T10:34:16Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages about software packages. 

* Members of this category are listed below
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Application]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics ==
* [[Legacy:Application|Application]] &amp;ndash; a hand-compiled list, subdivided into sections
* [[:Category:Legacy Game]] &amp;ndash; even though they're applications too, the actual games themselves are sort of different in that they use content rather than create it.
[[Category:Legacy Category|Application]]</text>
    </revision>
    <revision>
      <id>2291</id>
      <timestamp>2004-12-25T10:30:06Z</timestamp>
      <contributor>
        <ip>Webmail.union-city.k12.nj.us</ip>
      </contributor>
      <text xml:space="preserve">{{Legacy category}}


   [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU!

'''   Let us introduce [http://first-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://first-page.nm.ru/viagra.htm order viagra online], [http://first-page.nm.ru/cialis.htm cialis]
 Also [http://first-page.nm.ru/phentermine.htm order phentermine online], [http://first-page.nm.ru/xanax.htm buy xanax], [http://first-page.nm.ru/diazepam.htm diazepam online],  [http://first-page.nm.ru/prosac.htm prozac online].

   Buy [http://first-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://first-page.nm.ru/newcar.htm new car] or  [http://first-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''
*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-gift1.boom.ru/ christmas gift basket] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-gift2.boom.ru/ christmas gift] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes]</text>
    </revision>
    <revision>
      <id>33653</id>
      <timestamp>2008-12-15T09:46:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Applications]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages about software packages. 

* Members of this category are listed below
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Application]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics ==
* [[Legacy:Application|Application]] &amp;ndash; a hand-compiled list, subdivided into sections
* [[:Category:Legacy Game]] &amp;ndash; even though they're applications too, the actual games themselves are sort of different in that they use content rather than create it.
[[Category:Legacy Category|Application]]
[[Category:Applications|Applications]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Basic Procedure</title>
    <id>574</id>
    <revision>
      <id>1756</id>
      <timestamp>2006-12-27T15:26:03Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Use discussion.</comment>
      <text xml:space="preserve">{{Legacy category}}
'''Basic Procedure''' pages are small tutorials which cover simple tasks in [[Legacy:UnrealEd|UnrealEd]] that can be easily linked to from tutorials. This saves the bother of explaining over and over again how to add an actor, choose a resource, and so on. For example, instead of:

{{innerbox| Now open the actor brower window by clicking on the little pawn icon, then navigate down the tree by clicking the + signs, and find Actor &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]]. Then back in your map, right-click in the room and pick &quot;Add a ZoneInfo here&quot;. The actor should appear in your level.

}}

you can just write:

{{innerbox| Now [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] in the room...

}}

Doing this keeps the wiki usable by people of all skill levels.
* Beginners who don't know how to do this can follow the link, and the [[Legacy:Add An Actor|Add an Actor]] page will explain everything in simple steps, with screenshots and everything.
* Intermediate users can go to refresh their memory if they like. 
* Experienced users can just skip it. :)

The page names are chosen so they can flow into the text of a tutorial as above; the list below shows how. Feel free to suggest new pages here.

Some items in lists below have a subitem which you can easily select &amp; copy to a page you're working on.

See also [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]].

==Mapping ==

===Overview pages ===

These aren't &quot;procedures&quot; as such, but it's a good idea to link to these as &quot;prerequisites&quot; at the start of a tutorial.

* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; how to work with actors: add, delete, set properties etc.
* [[Legacy:Unreal World|Unreal World]], [[Legacy:Unreal Geometry|Unreal Geometry]] &amp;ndash; the whole &quot;it's a big world you carve up into&quot; fandango.
* [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] &amp;ndash; the usual warning

===Working with actors ===
* [[Legacy:Add An Actor|Add an Actor]] &amp;ndash; How to add an actor to you map.
:: &lt;nowiki&gt;[[Legacy:Add An Actor|Add an actor]] &gt;&gt; Foo &gt;&gt; Bar to the map&lt;/nowiki&gt;
* [[Legacy:Set The Following Properties|Set the following properties]]
:: &lt;nowiki&gt;[[Legacy:Set The Following Properties|Set the following properties]] of the Trigger:&lt;/nowiki&gt; ''(then list the properties and values)''
* [[Legacy:Set The Resource Property|Set the resource property]] &amp;ndash; how to use the &quot;use&quot; button for resource-referencing properties.
:: &lt;nowiki&gt;[[Legacy:Set The Resource Property|Set the resource property]] LevelInfo -&gt; Screenshot to texture Package.MyPicture&lt;/nowiki&gt;
* [[Legacy:Match These Tags|Match these tags]] &amp;ndash; how to add/match the Tag/Event variables.
:: Place a [[Legacy:TriggerLight|TriggerLight]], and a Switch &amp;ndash; then &lt;nowiki&gt;[[Legacy:Match These Tags|match these tags]]:&lt;/nowiki&gt; ''TriggeredLight.Tag'' and ''Switch.Event''

* [[Legacy:Add An Inline Object|Add an inline object]] &amp;ndash; Explains how to work with inline objects in the properties window.
* [[Legacy:Extend The Dynamic Array|Extend the dynamic array]] &amp;ndash; How to work with dynamic arrays in the properties window

===Working with resources===
* [[Legacy:Create A Material|Create A Material]] &amp;ndash; How to create new materials and work with Material Trees
* [[Legacy:Import The Texture|Import the texture]] &amp;ndash; How to import a bitmap file in UnrealEd as a texture.
:: &lt;nowiki&gt;[[Legacy:Import The Texture|Import the texture]]&lt;/nowiki&gt; MyPants.bmp and set: ''(list of package, group etc. remember to link [[Legacy:MyLevel|MyLevel]] if mentioned)''
* [[Legacy:Apply The Texture|Apply the texture]] &amp;ndash; How to apply a texture to a surface within the level.

===Working with geometry and lighting and other mapping procedures ===
* [[Legacy:Subtract A Space|Subtract a space]] &amp;ndash; How to create a single room. ([[Legacy:Create A Room|create a room]] is obsolete and will be merged into this.)
* [[Legacy:Add A Static Mesh|Add a static mesh]]
* [[Legacy:Add A Volume|Add a volume]]
* [[Legacy:Add A Zone Portal|Add a zone portal]] &amp;ndash; How to add a zone portal to your map.
* [[Legacy:Add A Zone|Add a zone]] &amp;ndash; How to add a zone to your map (water, lava, area naming etc).
* [[Legacy:Create A Mover|Create a mover]] &amp;ndash; How to add movement to your level (doors, lifts, spinny things).
* [[Legacy:Create A Static Mesh|Create a static mesh]] &amp;ndash; How to create a [[Legacy:Static Mesh|static mesh]] within UnrealEd.
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; Adding a cube in your level.
* [[Legacy:Add A Ladder|Add a ladder]] &amp;ndash; Adding a ladder to your level.
* [[Legacy:Create A Jump Pad|Create A Jump Pad]] &amp;ndash; Adding a jump-pad to your level.
* [[Legacy:Building A SkyBox|Building A SkyBox]] &amp;ndash; How to add a [[Legacy:SkyBox|SkyBox]] into your map.
* [[Legacy:Rebuild|Rebuild]] &amp;ndash; Rebuild the level.

==Scripting ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]] &amp;ndash; How to set up folders for a mod
:: &lt;nowiki&gt;[[Legacy:Set Up Package Folders|Set Up Package Folders]]&lt;/nowiki&gt; with the base name &quot;mymod&quot;

* [[Legacy:Create An INT File|Create An INT File]] &amp;ndash; How to create the [[Legacy:INT File|INT file]] for a package.

* [[Legacy:Create A Subclass|Create a subclass]] &amp;ndash; How to create a subclass within UnrealEd.
:: &lt;nowiki&gt;[[Legacy:Create A Subclass|Create a subclass]]&lt;/nowiki&gt; of the [[Legacy:GameInfo|GameInfo]] class...

* [[Legacy:Launch A Local Netgame|Launch A Local Netgame]] &amp;ndash; How to test your code in online conditions

* [[Legacy:Add EditPackage|Add EditPackage]] &amp;ndash; How to configure EditPackages
:: &lt;nowiki&gt;[[Legacy:Add EditPackage|Add EditPackage]] '''Package'''&lt;/nowiki&gt;

==Suggestions for future pages ==

And what to call them, etc.  We should aim for names that can be smoothly linked into the text of a tutorial (see the above page links as examples).

; [[Legacy:Rotate The Actor|Rotate the actor]] : I keep seeing stuff about making actors point somewhere, and the explanation is always a bit lengthy. Eg [[Legacy:Adding Sunlight|Adding Sunlight]].

; ''Something about working with dynamic arrays'' : This basic procedure should explain how to work with dynamic array properties like ''ManualExcludes'' in [[Legacy:ZoneInfo|ZoneInfo]], ''Emitters'' in [[Legacy:Emitter|Emitter]] or ''ColorScale'' in [[Legacy:ParticleEmitter|ParticleEmitter]].

:: I'll work on it &amp;ndash; tarquin
:: Ok, that's editinline, but what about dynamic arrays? Those are two completely different things. [[Legacy:ParticleEmitter|ParticleEmitter]] -&gt; Color -&gt; ColorScale for example is a dynamic array of structs without the editinline stuff. &amp;ndash; Wormbo

'''Tarquin:''' I took some shots of Display -&gt; Skin too. I'll upload those tomorrow &amp;ndash; I have to make them into PNGs first. :)

'''Tarquin:''' Wormbo &amp;ndash; what page title for the dynamic array thing? [[Legacy:Edit The Dynamic Array|Edit the dynamic array]]?

'''Wormbo:''' That's a good question. How do mappers call this type of property list?

'''Chip:''' I just call it a property list :) But explaining that it's an editable dynamic array is more concise, with perhaps a link referring to the Editability section of UnrealScript Language Reference/Variables, where an example could be added?

'''Tarquin:''' how about &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] and set the resource properties ... etc

'''Wormbo:''' Sounds good to me. So for the [[Legacy:Emitter|Emitter]] page it would be something like &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] 'Emitters' and [[Legacy:Add An Inline Object|add an inline object]] of the desired [[Legacy:ParticleEmitter|ParticleEmitter]] subclass.&quot;&lt;br /&gt;I've already uploaded some images (interface-Ed3-inlineobjects-*, interface-Ed3-arrays-* and interface-Ed3-propertywidgets-*, see image uploader) for another page I'm working on. I'm sure you could use some of those for the basic procedure pages.

'''Tarquin:''' [[Legacy:Add An Inline Object|add an inline object]] covers the array part too, I think (at least the pics do! :)

'''OlympusMons:''' Dunno if working with objects would be basic procedure material or not.

'''Unknown:''' (Reguarding the content at the top of the page) This is moronic advice. Including some redundant instructions will make this wiki better for those who most need to use it. The advice I see in here does not link to common tasks, and leaves the reader in the dark how to do basic things they take for granted.

'''SuperApe:''' I disagree, but please keep opinions in the discussion.  Someone will eventually refactor.

----

[[:Category:Legacy To Do]] &amp;ndash; Last two items in the Basic Procedure list: [[Legacy:Add A ZonePortal|Add A ZonePortal]] and [[Legacy:Add A Zone|Add A Zone]].  These are inheritantly linked.  My guess is that they could be combined.
[[Category:Legacy To Do|Basic Procedure]]</text>
    </revision>
    <revision>
      <id>1757</id>
      <timestamp>2006-12-27T10:06:20Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
'''Basic Procedure''' pages are small tutorials which cover simple tasks in [[Legacy:UnrealEd|UnrealEd]] that can be easily linked to from tutorials. This saves the bother of explaining over and over again how to add an actor, choose a resource, and so on. For example, instead of:

{{innerbox| Now open the actor brower window by clicking on the little pawn icon, then navigate down the tree by clicking the + signs, and find Actor &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]]. Then back in your map, right-click in the room and pick &quot;Add a ZoneInfo here&quot;. The actor should appear in your level.

}}

you can just write:

{{innerbox| Now [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] in the room...

}}

(This is moronic advice. Including some redundant instructions will make this wiki better for those who most need to use it. The advice I see in here does not link to common tasks, and leaves the reader in the dark how to do basic things they take for granted.)

Doing this keeps the wiki usable by people of all skill levels.
* Beginners who don't know how to do this can follow the link, and the [[Legacy:Add An Actor|Add an Actor]] page will explain everything in simple steps, with screenshots and everything.
* Intermediate users can go to refresh their memory if they like. 
* Experienced users can just skip it. :)

The page names are chosen so they can flow into the text of a tutorial as above; the list below shows how. Feel free to suggest new pages here.

Some items in lists below have a subitem which you can easily select &amp; copy to a page you're working on.

See also [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]].

==Mapping ==

===Overview pages ===

These aren't &quot;procedures&quot; as such, but it's a good idea to link to these as &quot;prerequisites&quot; at the start of a tutorial.

* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; how to work with actors: add, delete, set properties etc.
* [[Legacy:Unreal World|Unreal World]], [[Legacy:Unreal Geometry|Unreal Geometry]] &amp;ndash; the whole &quot;it's a big world you carve up into&quot; fandango.
* [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] &amp;ndash; the usual warning

===Working with actors ===
* [[Legacy:Add An Actor|Add an Actor]] &amp;ndash; How to add an actor to you map.
:: &lt;nowiki&gt;[[Legacy:Add An Actor|Add an actor]] &gt;&gt; Foo &gt;&gt; Bar to the map&lt;/nowiki&gt;
* [[Legacy:Set The Following Properties|Set the following properties]]
:: &lt;nowiki&gt;[[Legacy:Set The Following Properties|Set the following properties]] of the Trigger:&lt;/nowiki&gt; ''(then list the properties and values)''
* [[Legacy:Set The Resource Property|Set the resource property]] &amp;ndash; how to use the &quot;use&quot; button for resource-referencing properties.
:: &lt;nowiki&gt;[[Legacy:Set The Resource Property|Set the resource property]] LevelInfo -&gt; Screenshot to texture Package.MyPicture&lt;/nowiki&gt;
* [[Legacy:Match These Tags|Match these tags]] &amp;ndash; how to add/match the Tag/Event variables.
:: Place a [[Legacy:TriggerLight|TriggerLight]], and a Switch &amp;ndash; then &lt;nowiki&gt;[[Legacy:Match These Tags|match these tags]]:&lt;/nowiki&gt; ''TriggeredLight.Tag'' and ''Switch.Event''

* [[Legacy:Add An Inline Object|Add an inline object]] &amp;ndash; Explains how to work with inline objects in the properties window.
* [[Legacy:Extend The Dynamic Array|Extend the dynamic array]] &amp;ndash; How to work with dynamic arrays in the properties window

===Working with resources===
* [[Legacy:Create A Material|Create A Material]] &amp;ndash; How to create new materials and work with Material Trees
* [[Legacy:Import The Texture|Import the texture]] &amp;ndash; How to import a bitmap file in UnrealEd as a texture.
:: &lt;nowiki&gt;[[Legacy:Import The Texture|Import the texture]]&lt;/nowiki&gt; MyPants.bmp and set: ''(list of package, group etc. remember to link [[Legacy:MyLevel|MyLevel]] if mentioned)''
* [[Legacy:Apply The Texture|Apply the texture]] &amp;ndash; How to apply a texture to a surface within the level.

===Working with geometry and lighting and other mapping procedures ===
* [[Legacy:Subtract A Space|Subtract a space]] &amp;ndash; How to create a single room. ([[Legacy:Create A Room|create a room]] is obsolete and will be merged into this.)
* [[Legacy:Add A Static Mesh|Add a static mesh]]
* [[Legacy:Add A Volume|Add a volume]]
* [[Legacy:Add A Zone Portal|Add a zone portal]] &amp;ndash; How to add a zone portal to your map.
* [[Legacy:Add A Zone|Add a zone]] &amp;ndash; How to add a zone to your map (water, lava, area naming etc).
* [[Legacy:Create A Mover|Create a mover]] &amp;ndash; How to add movement to your level (doors, lifts, spinny things).
* [[Legacy:Create A Static Mesh|Create a static mesh]] &amp;ndash; How to create a [[Legacy:Static Mesh|static mesh]] within UnrealEd.
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; Adding a cube in your level.
* [[Legacy:Add A Ladder|Add a ladder]] &amp;ndash; Adding a ladder to your level.
* [[Legacy:Create A Jump Pad|Create A Jump Pad]] &amp;ndash; Adding a jump-pad to your level.
* [[Legacy:Building A SkyBox|Building A SkyBox]] &amp;ndash; How to add a [[Legacy:SkyBox|SkyBox]] into your map.
* [[Legacy:Rebuild|Rebuild]] &amp;ndash; Rebuild the level.

==Scripting ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]] &amp;ndash; How to set up folders for a mod
:: &lt;nowiki&gt;[[Legacy:Set Up Package Folders|Set Up Package Folders]]&lt;/nowiki&gt; with the base name &quot;mymod&quot;

* [[Legacy:Create An INT File|Create An INT File]] &amp;ndash; How to create the [[Legacy:INT File|INT file]] for a package.

* [[Legacy:Create A Subclass|Create a subclass]] &amp;ndash; How to create a subclass within UnrealEd.
:: &lt;nowiki&gt;[[Legacy:Create A Subclass|Create a subclass]]&lt;/nowiki&gt; of the [[Legacy:GameInfo|GameInfo]] class...

* [[Legacy:Launch A Local Netgame|Launch A Local Netgame]] &amp;ndash; How to test your code in online conditions

* [[Legacy:Add EditPackage|Add EditPackage]] &amp;ndash; How to configure EditPackages
:: &lt;nowiki&gt;[[Legacy:Add EditPackage|Add EditPackage]] '''Package'''&lt;/nowiki&gt;

==Suggestions for future pages ==

And what to call them, etc.  We should aim for names that can be smoothly linked into the text of a tutorial (see the above page links as examples).

; [[Legacy:Rotate The Actor|Rotate the actor]] : I keep seeing stuff about making actors point somewhere, and the explanation is always a bit lengthy. Eg [[Legacy:Adding Sunlight|Adding Sunlight]].

; ''Something about working with dynamic arrays'' : This basic procedure should explain how to work with dynamic array properties like ''ManualExcludes'' in [[Legacy:ZoneInfo|ZoneInfo]], ''Emitters'' in [[Legacy:Emitter|Emitter]] or ''ColorScale'' in [[Legacy:ParticleEmitter|ParticleEmitter]].

:: I'll work on it &amp;ndash; tarquin
:: Ok, that's editinline, but what about dynamic arrays? Those are two completely different things. [[Legacy:ParticleEmitter|ParticleEmitter]] -&gt; Color -&gt; ColorScale for example is a dynamic array of structs without the editinline stuff. &amp;ndash; Wormbo

'''Tarquin:''' I took some shots of Display -&gt; Skin too. I'll upload those tomorrow &amp;ndash; I have to make them into PNGs first. :)

'''Tarquin:''' Wormbo &amp;ndash; what page title for the dynamic array thing? [[Legacy:Edit The Dynamic Array|Edit the dynamic array]]?

'''Wormbo:''' That's a good question. How do mappers call this type of property list?

'''Chip:''' I just call it a property list :) But explaining that it's an editable dynamic array is more concise, with perhaps a link referring to the Editability section of UnrealScript Language Reference/Variables, where an example could be added?

'''Tarquin:''' how about &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] and set the resource properties ... etc

'''Wormbo:''' Sounds good to me. So for the [[Legacy:Emitter|Emitter]] page it would be something like &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] 'Emitters' and [[Legacy:Add An Inline Object|add an inline object]] of the desired [[Legacy:ParticleEmitter|ParticleEmitter]] subclass.&quot;&lt;br /&gt;I've already uploaded some images (interface-Ed3-inlineobjects-*, interface-Ed3-arrays-* and interface-Ed3-propertywidgets-*, see image uploader) for another page I'm working on. I'm sure you could use some of those for the basic procedure pages.

'''Tarquin:''' [[Legacy:Add An Inline Object|add an inline object]] covers the array part too, I think (at least the pics do! :)

'''OlympusMons:''' Dunno if working with objects would be basic procedure material or not.

----

[[:Category:Legacy To Do]] &amp;ndash; Last two items in the Basic Procedure list: [[Legacy:Add A ZonePortal|Add A ZonePortal]] and [[Legacy:Add A Zone|Add A Zone]].  These are inheritantly linked.  My guess is that they could be combined.
[[Category:Legacy To Do|Basic Procedure]]</text>
    </revision>
    <revision>
      <id>34608</id>
      <timestamp>2009-07-30T06:49:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to non-legacy [[:Category:Basic procedures]]</comment>
      <text xml:space="preserve">{{Legacy category}}
'''Basic Procedure''' pages are small tutorials which cover simple tasks in [[Legacy:UnrealEd|UnrealEd]] that can be easily linked to from tutorials. This saves the bother of explaining over and over again how to add an actor, choose a resource, and so on. For example, instead of:

{{innerbox| Now open the actor brower window by clicking on the little pawn icon, then navigate down the tree by clicking the + signs, and find Actor &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]]. Then back in your map, right-click in the room and pick &quot;Add a ZoneInfo here&quot;. The actor should appear in your level.

}}

you can just write:

{{innerbox| Now [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] in the room...

}}

Doing this keeps the wiki usable by people of all skill levels.
* Beginners who don't know how to do this can follow the link, and the [[Legacy:Add An Actor|Add an Actor]] page will explain everything in simple steps, with screenshots and everything.
* Intermediate users can go to refresh their memory if they like. 
* Experienced users can just skip it. :)

The page names are chosen so they can flow into the text of a tutorial as above; the list below shows how. Feel free to suggest new pages here.

Some items in lists below have a subitem which you can easily select &amp; copy to a page you're working on.

See also [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]].

==Mapping ==

===Overview pages ===

These aren't &quot;procedures&quot; as such, but it's a good idea to link to these as &quot;prerequisites&quot; at the start of a tutorial.

* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; how to work with actors: add, delete, set properties etc.
* [[Legacy:Unreal World|Unreal World]], [[Legacy:Unreal Geometry|Unreal Geometry]] &amp;ndash; the whole &quot;it's a big world you carve up into&quot; fandango.
* [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] &amp;ndash; the usual warning

===Working with actors ===
* [[Legacy:Add An Actor|Add an Actor]] &amp;ndash; How to add an actor to you map.
:: &lt;nowiki&gt;[[Legacy:Add An Actor|Add an actor]] &gt;&gt; Foo &gt;&gt; Bar to the map&lt;/nowiki&gt;
* [[Legacy:Set The Following Properties|Set the following properties]]
:: &lt;nowiki&gt;[[Legacy:Set The Following Properties|Set the following properties]] of the Trigger:&lt;/nowiki&gt; ''(then list the properties and values)''
* [[Legacy:Set The Resource Property|Set the resource property]] &amp;ndash; how to use the &quot;use&quot; button for resource-referencing properties.
:: &lt;nowiki&gt;[[Legacy:Set The Resource Property|Set the resource property]] LevelInfo -&gt; Screenshot to texture Package.MyPicture&lt;/nowiki&gt;
* [[Legacy:Match These Tags|Match these tags]] &amp;ndash; how to add/match the Tag/Event variables.
:: Place a [[Legacy:TriggerLight|TriggerLight]], and a Switch &amp;ndash; then &lt;nowiki&gt;[[Legacy:Match These Tags|match these tags]]:&lt;/nowiki&gt; ''TriggeredLight.Tag'' and ''Switch.Event''

* [[Legacy:Add An Inline Object|Add an inline object]] &amp;ndash; Explains how to work with inline objects in the properties window.
* [[Legacy:Extend The Dynamic Array|Extend the dynamic array]] &amp;ndash; How to work with dynamic arrays in the properties window

===Working with resources===
* [[Legacy:Create A Material|Create A Material]] &amp;ndash; How to create new materials and work with Material Trees
* [[Legacy:Import The Texture|Import the texture]] &amp;ndash; How to import a bitmap file in UnrealEd as a texture.
:: &lt;nowiki&gt;[[Legacy:Import The Texture|Import the texture]]&lt;/nowiki&gt; MyPants.bmp and set: ''(list of package, group etc. remember to link [[Legacy:MyLevel|MyLevel]] if mentioned)''
* [[Legacy:Apply The Texture|Apply the texture]] &amp;ndash; How to apply a texture to a surface within the level.

===Working with geometry and lighting and other mapping procedures ===
* [[Legacy:Subtract A Space|Subtract a space]] &amp;ndash; How to create a single room. ([[Legacy:Create A Room|create a room]] is obsolete and will be merged into this.)
* [[Legacy:Add A Static Mesh|Add a static mesh]]
* [[Legacy:Add A Volume|Add a volume]]
* [[Legacy:Add A Zone Portal|Add a zone portal]] &amp;ndash; How to add a zone portal to your map.
* [[Legacy:Add A Zone|Add a zone]] &amp;ndash; How to add a zone to your map (water, lava, area naming etc).
* [[Legacy:Create A Mover|Create a mover]] &amp;ndash; How to add movement to your level (doors, lifts, spinny things).
* [[Legacy:Create A Static Mesh|Create a static mesh]] &amp;ndash; How to create a [[Legacy:Static Mesh|static mesh]] within UnrealEd.
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; Adding a cube in your level.
* [[Legacy:Add A Ladder|Add a ladder]] &amp;ndash; Adding a ladder to your level.
* [[Legacy:Create A Jump Pad|Create A Jump Pad]] &amp;ndash; Adding a jump-pad to your level.
* [[Legacy:Building A SkyBox|Building A SkyBox]] &amp;ndash; How to add a [[Legacy:SkyBox|SkyBox]] into your map.
* [[Legacy:Rebuild|Rebuild]] &amp;ndash; Rebuild the level.

==Scripting ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]] &amp;ndash; How to set up folders for a mod
:: &lt;nowiki&gt;[[Legacy:Set Up Package Folders|Set Up Package Folders]]&lt;/nowiki&gt; with the base name &quot;mymod&quot;

* [[Legacy:Create An INT File|Create An INT File]] &amp;ndash; How to create the [[Legacy:INT File|INT file]] for a package.

* [[Legacy:Create A Subclass|Create a subclass]] &amp;ndash; How to create a subclass within UnrealEd.
:: &lt;nowiki&gt;[[Legacy:Create A Subclass|Create a subclass]]&lt;/nowiki&gt; of the [[Legacy:GameInfo|GameInfo]] class...

* [[Legacy:Launch A Local Netgame|Launch A Local Netgame]] &amp;ndash; How to test your code in online conditions

* [[Legacy:Add EditPackage|Add EditPackage]] &amp;ndash; How to configure EditPackages
:: &lt;nowiki&gt;[[Legacy:Add EditPackage|Add EditPackage]] '''Package'''&lt;/nowiki&gt;

==Suggestions for future pages ==

And what to call them, etc.  We should aim for names that can be smoothly linked into the text of a tutorial (see the above page links as examples).

; [[Legacy:Rotate The Actor|Rotate the actor]] : I keep seeing stuff about making actors point somewhere, and the explanation is always a bit lengthy. Eg [[Legacy:Adding Sunlight|Adding Sunlight]].

; ''Something about working with dynamic arrays'' : This basic procedure should explain how to work with dynamic array properties like ''ManualExcludes'' in [[Legacy:ZoneInfo|ZoneInfo]], ''Emitters'' in [[Legacy:Emitter|Emitter]] or ''ColorScale'' in [[Legacy:ParticleEmitter|ParticleEmitter]].

:: I'll work on it &amp;ndash; tarquin
:: Ok, that's editinline, but what about dynamic arrays? Those are two completely different things. [[Legacy:ParticleEmitter|ParticleEmitter]] -&gt; Color -&gt; ColorScale for example is a dynamic array of structs without the editinline stuff. &amp;ndash; Wormbo

'''Tarquin:''' I took some shots of Display -&gt; Skin too. I'll upload those tomorrow &amp;ndash; I have to make them into PNGs first. :)

'''Tarquin:''' Wormbo &amp;ndash; what page title for the dynamic array thing? [[Legacy:Edit The Dynamic Array|Edit the dynamic array]]?

'''Wormbo:''' That's a good question. How do mappers call this type of property list?

'''Chip:''' I just call it a property list :) But explaining that it's an editable dynamic array is more concise, with perhaps a link referring to the Editability section of UnrealScript Language Reference/Variables, where an example could be added?

'''Tarquin:''' how about &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] and set the resource properties ... etc

'''Wormbo:''' Sounds good to me. So for the [[Legacy:Emitter|Emitter]] page it would be something like &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] 'Emitters' and [[Legacy:Add An Inline Object|add an inline object]] of the desired [[Legacy:ParticleEmitter|ParticleEmitter]] subclass.&quot;&lt;br /&gt;I've already uploaded some images (interface-Ed3-inlineobjects-*, interface-Ed3-arrays-* and interface-Ed3-propertywidgets-*, see image uploader) for another page I'm working on. I'm sure you could use some of those for the basic procedure pages.

'''Tarquin:''' [[Legacy:Add An Inline Object|add an inline object]] covers the array part too, I think (at least the pics do! :)

'''OlympusMons:''' Dunno if working with objects would be basic procedure material or not.

'''Unknown:''' (Reguarding the content at the top of the page) This is moronic advice. Including some redundant instructions will make this wiki better for those who most need to use it. The advice I see in here does not link to common tasks, and leaves the reader in the dark how to do basic things they take for granted.

'''SuperApe:''' I disagree, but please keep opinions in the discussion.  Someone will eventually refactor.

----

[[:Category:Legacy To Do]] &amp;ndash; Last two items in the Basic Procedure list: [[Legacy:Add A ZonePortal|Add A ZonePortal]] and [[Legacy:Add A Zone|Add A Zone]].  These are inheritantly linked.  My guess is that they could be combined.
[[Category:Legacy To Do|Basic Procedure]]
[[Category:Basic procedures|Basic procedures]]</text>
    </revision>
    <revision>
      <id>34609</id>
      <timestamp>2009-07-30T06:50:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{Legacy category}}
'''Basic Procedure''' pages are small tutorials which cover simple tasks in [[Legacy:UnrealEd|UnrealEd]] that can be easily linked to from tutorials. This saves the bother of explaining over and over again how to add an actor, choose a resource, and so on. For example, instead of:

{{innerbox| Now open the actor brower window by clicking on the little pawn icon, then navigate down the tree by clicking the + signs, and find Actor &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]]. Then back in your map, right-click in the room and pick &quot;Add a ZoneInfo here&quot;. The actor should appear in your level.

}}

you can just write:

{{innerbox| Now [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] in the room...

}}

Doing this keeps the wiki usable by people of all skill levels.
* Beginners who don't know how to do this can follow the link, and the [[Legacy:Add An Actor|Add an Actor]] page will explain everything in simple steps, with screenshots and everything.
* Intermediate users can go to refresh their memory if they like. 
* Experienced users can just skip it. :)

The page names are chosen so they can flow into the text of a tutorial as above; the list below shows how. Feel free to suggest new pages here.

Some items in lists below have a subitem which you can easily select &amp; copy to a page you're working on.

See also [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]].

==Mapping ==

===Overview pages ===

These aren't &quot;procedures&quot; as such, but it's a good idea to link to these as &quot;prerequisites&quot; at the start of a tutorial.

* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; how to work with actors: add, delete, set properties etc.
* [[Legacy:Unreal World|Unreal World]], [[Legacy:Unreal Geometry|Unreal Geometry]] &amp;ndash; the whole &quot;it's a big world you carve up into&quot; fandango.
* [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] &amp;ndash; the usual warning

===Working with actors ===
* [[Legacy:Add An Actor|Add an Actor]] &amp;ndash; How to add an actor to you map.
:: &lt;nowiki&gt;[[Legacy:Add An Actor|Add an actor]] &gt;&gt; Foo &gt;&gt; Bar to the map&lt;/nowiki&gt;
* [[Legacy:Set The Following Properties|Set the following properties]]
:: &lt;nowiki&gt;[[Legacy:Set The Following Properties|Set the following properties]] of the Trigger:&lt;/nowiki&gt; ''(then list the properties and values)''
* [[Legacy:Set The Resource Property|Set the resource property]] &amp;ndash; how to use the &quot;use&quot; button for resource-referencing properties.
:: &lt;nowiki&gt;[[Legacy:Set The Resource Property|Set the resource property]] LevelInfo -&gt; Screenshot to texture Package.MyPicture&lt;/nowiki&gt;
* [[Legacy:Match These Tags|Match these tags]] &amp;ndash; how to add/match the Tag/Event variables.
:: Place a [[Legacy:TriggerLight|TriggerLight]], and a Switch &amp;ndash; then &lt;nowiki&gt;[[Legacy:Match These Tags|match these tags]]:&lt;/nowiki&gt; ''TriggeredLight.Tag'' and ''Switch.Event''

* [[Legacy:Add An Inline Object|Add an inline object]] &amp;ndash; Explains how to work with inline objects in the properties window.
* [[Legacy:Extend The Dynamic Array|Extend the dynamic array]] &amp;ndash; How to work with dynamic arrays in the properties window

===Working with resources===
* [[Legacy:Create A Material|Create A Material]] &amp;ndash; How to create new materials and work with Material Trees
* [[Legacy:Import The Texture|Import the texture]] &amp;ndash; How to import a bitmap file in UnrealEd as a texture.
:: &lt;nowiki&gt;[[Legacy:Import The Texture|Import the texture]]&lt;/nowiki&gt; MyPants.bmp and set: ''(list of package, group etc. remember to link [[Legacy:MyLevel|MyLevel]] if mentioned)''
* [[Legacy:Apply The Texture|Apply the texture]] &amp;ndash; How to apply a texture to a surface within the level.

===Working with geometry and lighting and other mapping procedures ===
* [[Legacy:Subtract A Space|Subtract a space]] &amp;ndash; How to create a single room. ([[Legacy:Create A Room|create a room]] is obsolete and will be merged into this.)
* [[Legacy:Add A Static Mesh|Add a static mesh]]
* [[Legacy:Add A Volume|Add a volume]]
* [[Legacy:Add A Zone Portal|Add a zone portal]] &amp;ndash; How to add a zone portal to your map.
* [[Legacy:Add A Zone|Add a zone]] &amp;ndash; How to add a zone to your map (water, lava, area naming etc).
* [[Legacy:Create A Mover|Create a mover]] &amp;ndash; How to add movement to your level (doors, lifts, spinny things).
* [[Legacy:Create A Static Mesh|Create a static mesh]] &amp;ndash; How to create a [[Legacy:Static Mesh|static mesh]] within UnrealEd.
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; Adding a cube in your level.
* [[Legacy:Add A Ladder|Add a ladder]] &amp;ndash; Adding a ladder to your level.
* [[Legacy:Create A Jump Pad|Create A Jump Pad]] &amp;ndash; Adding a jump-pad to your level.
* [[Legacy:Building A SkyBox|Building A SkyBox]] &amp;ndash; How to add a [[Legacy:SkyBox|SkyBox]] into your map.
* [[Legacy:Rebuild|Rebuild]] &amp;ndash; Rebuild the level.

==Scripting ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]] &amp;ndash; How to set up folders for a mod
:: &lt;nowiki&gt;[[Legacy:Set Up Package Folders|Set Up Package Folders]]&lt;/nowiki&gt; with the base name &quot;mymod&quot;

* [[Legacy:Create An INT File|Create An INT File]] &amp;ndash; How to create the [[Legacy:INT File|INT file]] for a package.

* [[Legacy:Create A Subclass|Create a subclass]] &amp;ndash; How to create a subclass within UnrealEd.
:: &lt;nowiki&gt;[[Legacy:Create A Subclass|Create a subclass]]&lt;/nowiki&gt; of the [[Legacy:GameInfo|GameInfo]] class...

* [[Legacy:Launch A Local Netgame|Launch A Local Netgame]] &amp;ndash; How to test your code in online conditions

* [[Legacy:Add EditPackage|Add EditPackage]] &amp;ndash; How to configure EditPackages
:: &lt;nowiki&gt;[[Legacy:Add EditPackage|Add EditPackage]] '''Package'''&lt;/nowiki&gt;

==Suggestions for future pages ==

And what to call them, etc.  We should aim for names that can be smoothly linked into the text of a tutorial (see the above page links as examples).

; [[Legacy:Rotate The Actor|Rotate the actor]] : I keep seeing stuff about making actors point somewhere, and the explanation is always a bit lengthy. Eg [[Legacy:Adding Sunlight|Adding Sunlight]].

; ''Something about working with dynamic arrays'' : This basic procedure should explain how to work with dynamic array properties like ''ManualExcludes'' in [[Legacy:ZoneInfo|ZoneInfo]], ''Emitters'' in [[Legacy:Emitter|Emitter]] or ''ColorScale'' in [[Legacy:ParticleEmitter|ParticleEmitter]].

:: I'll work on it &amp;ndash; tarquin
:: Ok, that's editinline, but what about dynamic arrays? Those are two completely different things. [[Legacy:ParticleEmitter|ParticleEmitter]] -&gt; Color -&gt; ColorScale for example is a dynamic array of structs without the editinline stuff. &amp;ndash; Wormbo

'''Tarquin:''' I took some shots of Display -&gt; Skin too. I'll upload those tomorrow &amp;ndash; I have to make them into PNGs first. :)

'''Tarquin:''' Wormbo &amp;ndash; what page title for the dynamic array thing? [[Legacy:Edit The Dynamic Array|Edit the dynamic array]]?

'''Wormbo:''' That's a good question. How do mappers call this type of property list?

'''Chip:''' I just call it a property list :) But explaining that it's an editable dynamic array is more concise, with perhaps a link referring to the Editability section of UnrealScript Language Reference/Variables, where an example could be added?

'''Tarquin:''' how about &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] and set the resource properties ... etc

'''Wormbo:''' Sounds good to me. So for the [[Legacy:Emitter|Emitter]] page it would be something like &quot;[[Legacy:Extend The Dynamic Array|Extend the dynamic array]] 'Emitters' and [[Legacy:Add An Inline Object|add an inline object]] of the desired [[Legacy:ParticleEmitter|ParticleEmitter]] subclass.&quot;&lt;br /&gt;I've already uploaded some images (interface-Ed3-inlineobjects-*, interface-Ed3-arrays-* and interface-Ed3-propertywidgets-*, see image uploader) for another page I'm working on. I'm sure you could use some of those for the basic procedure pages.

'''Tarquin:''' [[Legacy:Add An Inline Object|add an inline object]] covers the array part too, I think (at least the pics do! :)

'''OlympusMons:''' Dunno if working with objects would be basic procedure material or not.

'''Unknown:''' (Reguarding the content at the top of the page) This is moronic advice. Including some redundant instructions will make this wiki better for those who most need to use it. The advice I see in here does not link to common tasks, and leaves the reader in the dark how to do basic things they take for granted.

'''SuperApe:''' I disagree, but please keep opinions in the discussion.  Someone will eventually refactor.

----

[[:Category:Legacy To Do]] &amp;ndash; Last two items in the Basic Procedure list: [[Legacy:Add A ZonePortal|Add A ZonePortal]] and [[Legacy:Add A Zone|Add A Zone]].  These are inheritantly linked.  My guess is that they could be combined.
[[Category:Legacy To Do|Basic Procedure]]
[[Category:Basic procedures| Basic procedures]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Big Cleanup</title>
    <id>592</id>
    <revision>
      <id>1798</id>
      <timestamp>2005-11-30T23:02:25Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>suggestion moved</comment>
      <text xml:space="preserve">{{Legacy category}}
''I shall be shortly embarking on a BIG clean up of the entire wiki (well, as much as I can face before giving up). Expect page renamings &amp; upheavals. Feel free to disagree with my ideas, or improve them, or beat me to implementing them. ? Tarquin''

'''OK guys: since you said you'd help, I've put a list here: [[Legacy:UnrealWiki To Do|UnrealWiki To Do]].'''

===Stuff to do ===
* light work: find class pages and tag them as UT or UT2003 (see [[Legacy:Class Tree|Class Tree]] for how)
* look at what's been tagged so far &amp;ndash; suggest improvements, or if you feel moved to go ahead &amp; make changes, do so
* find other pages that need work &amp; tag them as &quot;Big Cleanup&quot;

==Related Topics==
* [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]
* [[:Category:Legacy To Do]]
* [[Legacy:Project Discussion|Project Discussion]]

==Discussion==

'''Piglet:''' Good luck :)

'''ZxAnPhOrIaN:''' Great job! I think that we have to merge repetitive pages and have a universal naming system. The terrain tutorials have to be cleaned up. Also, the pages that have techy stuff on it should have a suffix of &quot;Tech&quot;. Finally, there should have an orpaned pages page here so that it could find a foster home.

'''Mychaeel:''' Everything here &amp;ndash; with exception of personal rant pages &amp;ndash; is &quot;techy stuff.&quot;  It's hardly of much use to give 90 percent of all pages the suffix &quot;tech.&quot; &amp;ndash; Besides, tarquin needs '''help,''' not good wishes.

'''ZxAnPhOrIaN:''' I will be glad to help (if i get time)!

'''ZxAnPhOrIaN:''' Should we have a signup place here?

'''Tarquin:''' I'd rather people just found things that need doing, or tagged pages that need work. We still have tagging of class pages to do, that would be good :)

'''Evolution:''' Well, I think attempting to categorize topics by UT / UT2003 / Unreal2 is a bad idea, simply because there is so much overlapping content.  I think we should refrain from that, though we do need to come up with a standardization for content that *is* different b/t engine versions.

'''Mychaeel:''' We've started thinking about a good way to manage overlapping content even before UT2003 was released, but we couldn't come up with something that ''really'' appeals to us.  Using namespaces was one suggestion, but obviously that only works if (1) content overlaps with a granularity of no less than pages and (2) overlapping content applies to ''all'' engine versions, not just some out of more. &amp;ndash; Suggestions are still welcome.

'''Evolution:''' Does the wiki have the ability to hide/show content via links; something along the lines of &quot;Show Me&quot;/&quot;Hide Me&quot; links.  For each topic's page that applies to more than one engine, there could be subsections that only apply to a specific engine version.  These paragraphs are represented by a &quot;UT2003 specified&quot; link normally.  When you click the link, the paragraph expands inline with the text to display the UT2003-specific info.

'''Piglet:''' I am entirely happy to help, and I dont see why that means I cant also wish Tarquin luck.  If it sounded like '''&quot;I'll just sit back here and wait for it to be done&quot;''' then I apologize, it is not how i meant it at all.

'''Tarquin:''' well not much activity so far.... Maybe we should set up a permanent [[Legacy:UnrealWiki To Do|UnrealWiki To Do]] page with ideas of what people can do to help out, like they have on [[MeatBall:MeatballToDo]]

'''Tarquin:''' Okay, all those people who said they'd help ... list of thing to consider doing on [[Legacy:Unreal Engine|Unreal Engine]].

'''Ben 2500:''' Ill help :)

'''Wormbo:''' I'll fix whatever I run into, at least if I have the time to do it.

'''Anthony:''' I'd love to help. Unfortunately I have very little practicle experience with the Unreal Engine. I have however been studying unrealscript and the general way in which things fit together for a while. How can I make myself useful?

==The topic pages==

'''Mych''': Maybe we need a naming convention for forward indices (&quot;Topics on Mapping&quot;, &quot;Topics on Coding&quot;, and so on, for example?) with a &quot;Category Topics&quot; to go along with it.

'''Tarquin:''' We could standardize the names of the &quot;topic pages&quot;. I think &quot;Topics on foo&quot; doesn't read as well as &quot;foo topics&quot;. But I guess it boils down to: what will people spot most when they search? are they looking for the word &quot;foo&quot; or &quot;topic&quot;? [[Legacy:Home Page|Home Page]] is a forward index for topic pages, but there's no harm in giving a reverse index ''as well''. :) I'm thinking [[Legacy:Application|Application]] is a needless forward index, because it's such a general grouping. People are interested in apps for a particular purpose: IDE, texturing, modeling, text editors, etc

'''Mychaeel:''' But &quot;Topics on Foo&quot; pages are neatly listed one below each other in an alphabetical listing such as a search result, which is the whole point of naming similar pages (or variables, or classes) starting with the same prefix.  Like &quot;Mapping for Foo&quot; and &quot;Mapping for Bar.&quot;  Maybe &quot;Pages on Foo&quot; alternatively. &amp;ndash; [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' ok. point taken, let's do that. I'm off for a walk now, but what I suggest is: rather than rename what we have, let's make a list of what we think we ''need''. Let's just draw up a list of &quot;Topics on foo&quot; pages we think are good to have, based on what we think should be available rather than the material we have. Then I'll figure out how to match what we have to that list. 

'''Mychaeel:''' That sounds like a much better approach than trying bend the existing pages into shape.  :-)

'''Tarquin:''' well... I'm hoping people OTHER than me help write this list, otherwise what I devise will be pretty much the topic grouping we currently have. 

'''Tarquin:''' Looking great! ''and'' it fits in nicely with the planned split of the [[Legacy:Application|Application]]s page. 

====List of Topic pages ====

''A list of suggested Topic pages to form the level of the page hierarchy below [[Legacy:Home Page|Home Page]]. Please add, change, discuss...''

* [[Legacy:Topics On Coding|Topics on Coding]]
* * Fundamentals &amp;ndash; OOP, downloadable sources, ...
* * Setup &amp;ndash; editors, compiler wrappers, IDEs, ...
* * Extending the Game &amp;ndash; making mutators, game types, GUI, ...
* * Networking &amp;ndash; replication, client-side Interactions, ...
* * Reference &amp;ndash; class tree, UnrealScript reference, grammar, ...
* * Tools &amp;ndash; redux from Setup

* [[Legacy:Topics On Mapping|Topics on Mapping]]
* * Layout Design &amp;ndash; planning, layout, gameplay and flow, ...
* * Construction &amp;ndash; BSP, terrain, static meshes, skyboxes, PlayerStarts, ...
* * Visual Design &amp;ndash; using textures, lighting, materials, ...
* * Bot Support &amp;ndash; pathing, jump spots, doors, ...
* * Interactivity &amp;ndash; triggers, custom components, ...
* * Tools &amp;ndash; Toolbar Creator, custom brush builders, MeshMaker, ...

* [[Legacy:Topics On Modeling|Topics on Modeling]]
* * Fundamentals &amp;ndash; vertex meshes, skeletal meshes, static meshes
* * Importing Models &amp;ndash; weapon models, player models, static meshes, ...
* * Tools &amp;ndash; MeshMaker, MilkShape, ...

----

'''Wormbo:''' Those categories have serious issues with newbie friendlyness. I wouldn't care about architecture or visual design if I wanted to learn mapping. At first my only concern is: &quot;How do I use this thing?&quot;

'''Tarquin:''' We can try and make a decent [[Legacy:Mapping Lessons|Mapping Lessons]] page. After all, I think [[Legacy:UnrealScript Lessons|UnrealScript lessons]] is pretty good now :) (and we could rename it &quot;Coding Lessons&quot;

====How to present them====

Several possible ways to do this.

Option 1: 4-tier
* Home Page
** Topics on Mapping etc
*** Building Worlds
**** Actual page

Option 2: 3-tier, small HP, big topics

* Home Page
** Topics on Mapping etc
*** Actual page

Option 3: 3-tier, large HP, small topics

* Home Page, clearly divided into sections &quot;Topics on mapping&quot;, coding etc
** Building Worlds etc
*** Actual page

----

'''Mychaeel:''' I think up to a certain degree people prefer pages with more content to take in at a time over a finer-grained structure of pages.  I think the topic pages outlined above can each be one single page with several subtitles (as illustrated by their subitems above).  Those sections on the topic pages should be a simple bullet list with links and a short description for each:

* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; converts UnrealEd prefabs to ready-to-use [[Legacy:Decoration|Decoration]] actors
* [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] &amp;ndash; creates complex builder brush shapes such as foo, bar and quux

The links to those topic pages on the [[Legacy:Home Page|Home Page]] in turn follow the same scheme, just on a higher level:

* [[Legacy:Topics On Coding|Topics on Coding]] &amp;ndash; fundamentals, setting up a scripting environment, extending the game, tools
* [[Legacy:Topics On Mapping|Topics on Mapping]] &amp;ndash; architecture, building worlds, visual design, bot support, interactivity, tools
* [[Legacy:Topics On Modeling|Topics on Modeling]] &amp;ndash; mesh types, importing models, tools

That's a bit like Yahoo's front page &amp;ndash; links to sections along with a sample of what they contain.

'''Tarquin:''' That's option 2 above. on the one hand, the problem with option 3 (much like what we have) is that some topic pages are very brief, some (architecture) very long. and with option 2, as Zxan's [[Legacy:Mapping Resources|Mapping Resources]] page shows, we could get REALLY big pages. 

'''Mychaeel:''' Then there's need of more &quot;topic&quot; pages that are, however, not necessarily called that way.  Looking at [[Legacy:Mapping Resources|Mapping Resources]] I think all the stuff on brushes (building, saving, transforming) warrants its own page; so do all the mod mapping pages, and apparently the &quot;dynamics&quot; part too.  I thus propose that we simply remain flexible:  If a &quot;Topics on Foo&quot; page becomes too crowded, just see to it that related links are bundled to more specific pages.  The &quot;Topics on Foo&quot; pages are merely the first tier.

'''Tarquin:''' It'll be very strange (to me) having such a slim home page! I think [[Legacy:Topics On Mapping|Topics on Mapping]] will end up being a slim list itself of further pages. I really like the division of topics, just unsure about the depth of hierarchy this is going to produce:
 Home page -&gt; Topics on Mapping -&gt; Visual Design -&gt; specific page on textures

'''Tarquin:''' where does Karma fit into the topic hierarchy above?

'''Foxpaw:''' I'd say Karma is more a topic on coding than mapping.. though mapper can insert them into their levels they generally require a relatively small portion of the capabilities of the Karma physics engine. (For meat, or fans, or swinging doors, or whatever.) Perhaps there could be an overview of Karma in the mapping section and the remainder in the coding section?

'''Foxpaw:''' I like option 3 of the above ones, but I think that there should be a bit more separation between topics. Extending the game could be broken up into a section on general modification and more technically involved things - most of the mods that are made don't require quaternions, complex karma physics, complex vector maths, native functions, or any of that fun stuff, so including it in the same section as the more basic parts of making gametypes, etc. might add confusion. If they went into &quot;Extending the Game&quot; and the first page they clicked on was quaternions, they might be frightened away from unrealscript as a result. (Unless someone were to refactor the page into something less excessively complex.)

----

'''Mychaeel:''' I got the following email on Friday, forwarded by larrystorch, from somebody going by the nickname of Koosh_Ballz.

{{innerbox| um... please seperate UT and UT2k3 a LOT more clearly.

  

 many a time i have read a page, stirring up an idea for a map and

 gotten to the bottom for it to say &quot;sorry ut2k3 only&quot;

  

 AARGGGGHHH

  

 anyway if u actually hear this i would suggest formatting the sidebar

 something like this (if its in brackets, its a button)

  

             UnrealWiki

 

 [Wiki Community]

 

 [Main Index]

 

 [contact us]

 

 [page editing]

 

 [everything else]

 

                 UT

 

               UT 2003

 

               Mapping

 

 [Introduction/beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

 

               Mapping

 

 [Intro/Beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

 

       Mods/Mutators/Scripting

 

 [Introduction/beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

 

       Mods/Mutators/Scripting

 

 [Introduction/beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

}}

'''Tarquin:''' It's unlikely we'll set it out like that. But we should do something about the UT / UT2003 thing. I think that the default is (should be) ut2003. We need to mention that somewhere.

----

'''Mychaeel:''' I just filled in [[Legacy:Create A Mover|Create a Mover]] which tarquin had left as a stub with the comment &quot;needs work.&quot;  All I had to do was filling in three simple, single-line steps.

Really:  We'll never get anywhere with this &quot;big cleanup&quot; if we don't start finishing things instead of leaving them routinely unfinished in the hope that &quot;somebody else will fill it in.&quot;  Bringing a page into a usable state instead of leaving it unfinished may take only a few minutes more, but unless it is done it is just yet another thing on our endless cleanup to-do list.  We won't ever get anywhere if we add things that need cleaning up in a higher rate than we actually clean them up.

What's needed here is a change of attitude, not Yet Another Plan.  The slogan &quot;Leave it unfinished, somebody else is bound to fill it in&quot; that was advertised so often in the early days of the Unreal Wiki (and our own Wiki experience) simply doesn't apply anymore, if it ever really did.  You must consciously force yourself to stick with a page long enough to leave it in the state you'd like to find it in if you were looking for the information its page title promises.  It usually really doesn't take much more than an extra minute, but it'd be well worth it.

'''Tarquin:''' I think it's the other way round. We don't have enough of a &quot;wiki&quot; mindset here, but rather than adapt to that and stop working in a wiki way, I would like to '''change the minset'''. Plenty of people visit this site all the time. Why aren't they helping? It shouldn't be down to just me, you, Wormbo and Entropic when he gets away from the kids! :(

'''OBWANDO:''' I visit just about every day, and add what I can... First thing I usually do is check the recent changes, and then look around to see what I can fix up or so. I havent found a 'to do' page that has places that need to be fixed/etc... If it were there, it would be easier to go to it and do some work instead of spending time trying to find the work to do. Anyone that finds an area can add to the 'to do' page and when finished, should put a **DONE** in front of the header. If not, let me know how I can help.

'''Wormbo:''' The To Do page is [[:Category:Legacy To Do]]. It lists all pages that need further work. If a page doesn't need further work anymore, just remove it from the category by removing the category link.

'''Sobiwan:''' I have been using WIKI as a reference for a while, but never figured out what a WIKI was until recently.  The process I went through is:
* Great reference!
* Why are some pages unfinished?
* Where are some of the pages?
* Why are there conversations at a reference site?

I finally decided to read the [http://wiki.beyondunreal.com/wiki/MetaTopics Wiki Community]] and it all made sense.  Knowing that I love to explain things and know UED pretty well, I wanted to contribute, but that raised an important question, which brings me to this page: 

'''''What format will be used?'''''

This cleanup and to-do is a result of one of many things: 
* There was no format 
* There was a format but few adhered to it because:
** They didnt know about it
** They were lazy
* Everyone had their own format

I have yet to see a standard format for the Unreal WIKI pages, but that might be due to my ignorance.  On the few pages I've altered, I've used my best judgement for a format using particular existing pages as a template.  I believe the format must be ''first'' be defined, ''then'' shared among the contributors.  An example of a format:
*General description
*Process
*Tips to make the process easier
*Problems
*Related Topics
*Comments
*Page Tagging

There is also the issue of when to use certain [[Legacy:Wiki Markup|Wiki Markup]].  Some people may not know when to use a definition list versus a subsection because they havent thought about what their text is structured as.  WIKI can be involved before starting, but the effort to define these issues results in less activity in [[Legacy:UnrealWiki To Do|UnrealWiki To Do]].

Of course, the entire site is one big dynamically structured hierchy, so even that has to be defined.  Like &quot;Koosh_Ballz&quot; said in his email, sometimes he found that certain things applied only to UT2k3 when he was looking for UT2.  I had that same problem.  Proper tagging and structuring solves this.</text>
    </revision>
    <revision>
      <id>1799</id>
      <timestamp>2005-11-30T09:55:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
''I shall be shortly embarking on a BIG clean up of the entire wiki (well, as much as I can face before giving up). Expect page renamings &amp; upheavals. Feel free to disagree with my ideas, or improve them, or beat me to implementing them. ? Tarquin''

'''OK guys: since you said you'd help, I've put a list here: [[Legacy:UnrealWiki To Do|UnrealWiki To Do]].'''

===Stuff to do ===
* light work: find class pages and tag them as UT or UT2003 (see [[Legacy:Class Tree|Class Tree]] for how)
* look at what's been tagged so far &amp;ndash; suggest improvements, or if you feel moved to go ahead &amp; make changes, do so
* find other pages that need work &amp; tag them as &quot;Big Cleanup&quot;

==Related Topics==
* [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]
* [[:Category:Legacy To Do]]
* [[Legacy:Project Discussion|Project Discussion]]

==Discussion==

'''Piglet:''' Good luck :)

'''ZxAnPhOrIaN:''' Great job! I think that we have to merge repetitive pages and have a universal naming system. The terrain tutorials have to be cleaned up. Also, the pages that have techy stuff on it should have a suffix of &quot;Tech&quot;. Finally, there should have an orpaned pages page here so that it could find a foster home.

'''Mychaeel:''' Everything here &amp;ndash; with exception of personal rant pages &amp;ndash; is &quot;techy stuff.&quot;  It's hardly of much use to give 90 percent of all pages the suffix &quot;tech.&quot; &amp;ndash; Besides, tarquin needs '''help,''' not good wishes.

'''ZxAnPhOrIaN:''' I will be glad to help (if i get time)!

'''ZxAnPhOrIaN:''' Should we have a signup place here?

'''Tarquin:''' I'd rather people just found things that need doing, or tagged pages that need work. We still have tagging of class pages to do, that would be good :)

'''Evolution:''' Well, I think attempting to categorize topics by UT / UT2003 / Unreal2 is a bad idea, simply because there is so much overlapping content.  I think we should refrain from that, though we do need to come up with a standardization for content that *is* different b/t engine versions.

'''Mychaeel:''' We've started thinking about a good way to manage overlapping content even before UT2003 was released, but we couldn't come up with something that ''really'' appeals to us.  Using namespaces was one suggestion, but obviously that only works if (1) content overlaps with a granularity of no less than pages and (2) overlapping content applies to ''all'' engine versions, not just some out of more. &amp;ndash; Suggestions are still welcome.

'''Evolution:''' Does the wiki have the ability to hide/show content via links; something along the lines of &quot;Show Me&quot;/&quot;Hide Me&quot; links.  For each topic's page that applies to more than one engine, there could be subsections that only apply to a specific engine version.  These paragraphs are represented by a &quot;UT2003 specified&quot; link normally.  When you click the link, the paragraph expands inline with the text to display the UT2003-specific info.

'''Piglet:''' I am entirely happy to help, and I dont see why that means I cant also wish Tarquin luck.  If it sounded like '''&quot;I'll just sit back here and wait for it to be done&quot;''' then I apologize, it is not how i meant it at all.

'''Tarquin:''' well not much activity so far.... Maybe we should set up a permanent [[Legacy:UnrealWiki To Do|UnrealWiki To Do]] page with ideas of what people can do to help out, like they have on [[MeatBall:MeatballToDo]]

'''Tarquin:''' Okay, all those people who said they'd help ... list of thing to consider doing on [[Legacy:Unreal Engine|Unreal Engine]].

'''Ben 2500:''' Ill help :)

'''Wormbo:''' I'll fix whatever I run into, at least if I have the time to do it.

'''Anthony:''' I'd love to help. Unfortunately I have very little practicle experience with the Unreal Engine. I have however been studying unrealscript and the general way in which things fit together for a while. How can I make myself useful?

==The topic pages==

'''Mych''': Maybe we need a naming convention for forward indices (&quot;Topics on Mapping&quot;, &quot;Topics on Coding&quot;, and so on, for example?) with a &quot;Category Topics&quot; to go along with it.

'''Tarquin:''' We could standardize the names of the &quot;topic pages&quot;. I think &quot;Topics on foo&quot; doesn't read as well as &quot;foo topics&quot;. But I guess it boils down to: what will people spot most when they search? are they looking for the word &quot;foo&quot; or &quot;topic&quot;? [[Legacy:Home Page|Home Page]] is a forward index for topic pages, but there's no harm in giving a reverse index ''as well''. :) I'm thinking [[Legacy:Application|Application]] is a needless forward index, because it's such a general grouping. People are interested in apps for a particular purpose: IDE, texturing, modeling, text editors, etc

'''Mychaeel:''' But &quot;Topics on Foo&quot; pages are neatly listed one below each other in an alphabetical listing such as a search result, which is the whole point of naming similar pages (or variables, or classes) starting with the same prefix.  Like &quot;Mapping for Foo&quot; and &quot;Mapping for Bar.&quot;  Maybe &quot;Pages on Foo&quot; alternatively. &amp;ndash; [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' ok. point taken, let's do that. I'm off for a walk now, but what I suggest is: rather than rename what we have, let's make a list of what we think we ''need''. Let's just draw up a list of &quot;Topics on foo&quot; pages we think are good to have, based on what we think should be available rather than the material we have. Then I'll figure out how to match what we have to that list. 

'''Mychaeel:''' That sounds like a much better approach than trying bend the existing pages into shape.  :-)

'''Tarquin:''' well... I'm hoping people OTHER than me help write this list, otherwise what I devise will be pretty much the topic grouping we currently have. 

'''Tarquin:''' Looking great! ''and'' it fits in nicely with the planned split of the [[Legacy:Application|Application]]s page. 

====List of Topic pages ====

''A list of suggested Topic pages to form the level of the page hierarchy below [[Legacy:Home Page|Home Page]]. Please add, change, discuss...''

* [[Legacy:Topics On Coding|Topics on Coding]]
* * Fundamentals &amp;ndash; OOP, downloadable sources, ...
* * Setup &amp;ndash; editors, compiler wrappers, IDEs, ...
* * Extending the Game &amp;ndash; making mutators, game types, GUI, ...
* * Networking &amp;ndash; replication, client-side Interactions, ...
* * Reference &amp;ndash; class tree, UnrealScript reference, grammar, ...
* * Tools &amp;ndash; redux from Setup

* [[Legacy:Topics On Mapping|Topics on Mapping]]
* * Layout Design &amp;ndash; planning, layout, gameplay and flow, ...
* * Construction &amp;ndash; BSP, terrain, static meshes, skyboxes, PlayerStarts, ...
* * Visual Design &amp;ndash; using textures, lighting, materials, ...
* * Bot Support &amp;ndash; pathing, jump spots, doors, ...
* * Interactivity &amp;ndash; triggers, custom components, ...
* * Tools &amp;ndash; Toolbar Creator, custom brush builders, MeshMaker, ...

* [[Legacy:Topics On Modeling|Topics on Modeling]]
* * Fundamentals &amp;ndash; vertex meshes, skeletal meshes, static meshes
* * Importing Models &amp;ndash; weapon models, player models, static meshes, ...
* * Tools &amp;ndash; MeshMaker, MilkShape, ...

----

'''Wormbo:''' Those categories have serious issues with newbie friendlyness. I wouldn't care about architecture or visual design if I wanted to learn mapping. At first my only concern is: &quot;How do I use this thing?&quot;

'''Tarquin:''' We can try and make a decent [[Legacy:Mapping Lessons|Mapping Lessons]] page. After all, I think [[Legacy:UnrealScript Lessons|UnrealScript lessons]] is pretty good now :) (and we could rename it &quot;Coding Lessons&quot;

====How to present them====

Several possible ways to do this.

Option 1: 4-tier
* Home Page
** Topics on Mapping etc
*** Building Worlds
**** Actual page

Option 2: 3-tier, small HP, big topics

* Home Page
** Topics on Mapping etc
*** Actual page

Option 3: 3-tier, large HP, small topics

* Home Page, clearly divided into sections &quot;Topics on mapping&quot;, coding etc
** Building Worlds etc
*** Actual page

----

'''Mychaeel:''' I think up to a certain degree people prefer pages with more content to take in at a time over a finer-grained structure of pages.  I think the topic pages outlined above can each be one single page with several subtitles (as illustrated by their subitems above).  Those sections on the topic pages should be a simple bullet list with links and a short description for each:

* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; converts UnrealEd prefabs to ready-to-use [[Legacy:Decoration|Decoration]] actors
* [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] &amp;ndash; creates complex builder brush shapes such as foo, bar and quux

The links to those topic pages on the [[Legacy:Home Page|Home Page]] in turn follow the same scheme, just on a higher level:

* [[Legacy:Topics On Coding|Topics on Coding]] &amp;ndash; fundamentals, setting up a scripting environment, extending the game, tools
* [[Legacy:Topics On Mapping|Topics on Mapping]] &amp;ndash; architecture, building worlds, visual design, bot support, interactivity, tools
* [[Legacy:Topics On Modeling|Topics on Modeling]] &amp;ndash; mesh types, importing models, tools

That's a bit like Yahoo's front page &amp;ndash; links to sections along with a sample of what they contain.

'''Tarquin:''' That's option 2 above. on the one hand, the problem with option 3 (much like what we have) is that some topic pages are very brief, some (architecture) very long. and with option 2, as Zxan's [[Legacy:Mapping Resources|Mapping Resources]] page shows, we could get REALLY big pages. 

'''Mychaeel:''' Then there's need of more &quot;topic&quot; pages that are, however, not necessarily called that way.  Looking at [[Legacy:Mapping Resources|Mapping Resources]] I think all the stuff on brushes (building, saving, transforming) warrants its own page; so do all the mod mapping pages, and apparently the &quot;dynamics&quot; part too.  I thus propose that we simply remain flexible:  If a &quot;Topics on Foo&quot; page becomes too crowded, just see to it that related links are bundled to more specific pages.  The &quot;Topics on Foo&quot; pages are merely the first tier.

'''Tarquin:''' It'll be very strange (to me) having such a slim home page! I think [[Legacy:Topics On Mapping|Topics on Mapping]] will end up being a slim list itself of further pages. I really like the division of topics, just unsure about the depth of hierarchy this is going to produce:
 Home page -&gt; Topics on Mapping -&gt; Visual Design -&gt; specific page on textures

'''Tarquin:''' where does Karma fit into the topic hierarchy above?

'''Foxpaw:''' I'd say Karma is more a topic on coding than mapping.. though mapper can insert them into their levels they generally require a relatively small portion of the capabilities of the Karma physics engine. (For meat, or fans, or swinging doors, or whatever.) Perhaps there could be an overview of Karma in the mapping section and the remainder in the coding section?

'''Foxpaw:''' I like option 3 of the above ones, but I think that there should be a bit more separation between topics. Extending the game could be broken up into a section on general modification and more technically involved things - most of the mods that are made don't require quaternions, complex karma physics, complex vector maths, native functions, or any of that fun stuff, so including it in the same section as the more basic parts of making gametypes, etc. might add confusion. If they went into &quot;Extending the Game&quot; and the first page they clicked on was quaternions, they might be frightened away from unrealscript as a result. (Unless someone were to refactor the page into something less excessively complex.)

----

'''Mychaeel:''' I got the following email on Friday, forwarded by larrystorch, from somebody going by the nickname of Koosh_Ballz.

{{innerbox| um... please seperate UT and UT2k3 a LOT more clearly.

  

 many a time i have read a page, stirring up an idea for a map and

 gotten to the bottom for it to say &quot;sorry ut2k3 only&quot;

  

 AARGGGGHHH

  

 anyway if u actually hear this i would suggest formatting the sidebar

 something like this (if its in brackets, its a button)

  

             UnrealWiki

 

 [Wiki Community]

 

 [Main Index]

 

 [contact us]

 

 [page editing]

 

 [everything else]

 

                 UT

 

               UT 2003

 

               Mapping

 

 [Introduction/beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

 

               Mapping

 

 [Intro/Beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

 

       Mods/Mutators/Scripting

 

 [Introduction/beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

 

       Mods/Mutators/Scripting

 

 [Introduction/beginner tutes]

 

 [basic reference]

 

 [advanced tutes]

 

 [FAQ]

}}

'''Tarquin:''' It's unlikely we'll set it out like that. But we should do something about the UT / UT2003 thing. I think that the default is (should be) ut2003. We need to mention that somewhere.

----

'''Mychaeel:''' I just filled in [[Legacy:Create A Mover|Create a Mover]] which tarquin had left as a stub with the comment &quot;needs work.&quot;  All I had to do was filling in three simple, single-line steps.

Really:  We'll never get anywhere with this &quot;big cleanup&quot; if we don't start finishing things instead of leaving them routinely unfinished in the hope that &quot;somebody else will fill it in.&quot;  Bringing a page into a usable state instead of leaving it unfinished may take only a few minutes more, but unless it is done it is just yet another thing on our endless cleanup to-do list.  We won't ever get anywhere if we add things that need cleaning up in a higher rate than we actually clean them up.

What's needed here is a change of attitude, not Yet Another Plan.  The slogan &quot;Leave it unfinished, somebody else is bound to fill it in&quot; that was advertised so often in the early days of the Unreal Wiki (and our own Wiki experience) simply doesn't apply anymore, if it ever really did.  You must consciously force yourself to stick with a page long enough to leave it in the state you'd like to find it in if you were looking for the information its page title promises.  It usually really doesn't take much more than an extra minute, but it'd be well worth it.

'''Tarquin:''' I think it's the other way round. We don't have enough of a &quot;wiki&quot; mindset here, but rather than adapt to that and stop working in a wiki way, I would like to '''change the minset'''. Plenty of people visit this site all the time. Why aren't they helping? It shouldn't be down to just me, you, Wormbo and Entropic when he gets away from the kids! :(

'''OBWANDO:''' I visit just about every day, and add what I can... First thing I usually do is check the recent changes, and then look around to see what I can fix up or so. I havent found a 'to do' page that has places that need to be fixed/etc... If it were there, it would be easier to go to it and do some work instead of spending time trying to find the work to do. Anyone that finds an area can add to the 'to do' page and when finished, should put a **DONE** in front of the header. If not, let me know how I can help.

'''Wormbo:''' The To Do page is [[:Category:Legacy To Do]]. It lists all pages that need further work. If a page doesn't need further work anymore, just remove it from the category by removing the category link.

'''Sobiwan:''' I have been using WIKI as a reference for a while, but never figured out what a WIKI was until recently.  The process I went through is:
* Great reference!
* Why are some pages unfinished?
* Where are some of the pages?
* Why are there conversations at a reference site?

I finally decided to read the [http://wiki.beyondunreal.com/wiki/MetaTopics Wiki Community]] and it all made sense.  Knowing that I love to explain things and know UED pretty well, I wanted to contribute, but that raised an important question, which brings me to this page: 

'''''What format will be used?'''''

This cleanup and to-do is a result of one of many things: 
* There was no format 
* There was a format but few adhered to it because:
** They didnt know about it
** They were lazy
* Everyone had their own format

I have yet to see a standard format for the Unreal WIKI pages, but that might be due to my ignorance.  On the few pages I've altered, I've used my best judgement for a format using particular existing pages as a template.  I believe the format must be ''first'' be defined, ''then'' shared among the contributors.  An example of a format:
*General description
*Process
*Tips to make the process easier
*Problems
*Related Topics
*Comments
*Page Tagging

There is also the issue of when to use certain [[Legacy:Wiki Markup|Wiki Markup]].  Some people may not know when to use a definition list versus a subsection because they havent thought about what their text is structured as.  WIKI can be involved before starting, but the effort to define these issues results in less activity in [[Legacy:UnrealWiki To Do|UnrealWiki To Do]].

Of course, the entire site is one big dynamically structured hierchy, so even that has to be defined.  Like &quot;Koosh_Ballz&quot; said in his email, sometimes he found that certain things applied only to UT2k3 when he was looking for UT2.  I had that same problem.  Proper tagging and structuring solves this.

'''Sweavo:''' Um, sorry if this isn't the place for this question... but ... is there a way to get the &quot;Least Recently Changed&quot; pages?  That would really help the maintenance effort.  That would allow the stalest pages to be revisted and either finished, corrected, merged or deleted.  Of course once that's happened to a page, it's no longer &quot;least recently changed&quot; and there are new old pages on that list to be seen.

'''Tarquin:''' interesting idea. Best to move your question to one of the discussion pages about the wiki software though :)

'''Sweavo:''' Like where?  Not being funny, but I just had a go with google and didn't turn up any likely places...?

'''SuperApe:''' Sweavo is alluding to the current problem with the [[Legacy:Search|Search]] page.  Tarquin is alluding to the [[Legacy:Project Discussion|Project Discussion]] page or the like.  Is this page still alive?  It should be cleaned up so the new Big Cleanup score is redefined. (i.e., What pages and projects are involved in the Big Cleanup?)  If there are already pages on that work, perhaps this page is unnecessary.

'''Tarquin:''' [[Legacy:Wiki Development|Wiki Development]] in fact. The wiki should be usable without search. Categories still work, and the link bar still works ;) This page (Big Cleanup) is ready for deletion, I think.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Category</title>
    <id>722</id>
    <revision>
      <id>2086</id>
      <timestamp>2008-02-15T08:11:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
Many (but not all) pages on the Unreal Wiki are part of one (or several) of the following categories.  Go to one of the category pages to get a list of all pages in it.

===General===

General mapping and modding topics.
* [[:Category:Legacy Game]] &amp;ndash; the games themselves
* [[:Category:Legacy Application]] &amp;ndash; useful applications and third-party tools
* [[:Category:Legacy FAQ]] &amp;ndash; compilations of frequent problems and their solutions on several topic areas
* [[:Category:Legacy Troubleshooting]] &amp;ndash; specific step-by-step troubleshooting instructions
* [[:Category:Legacy Basic Procedure]] &amp;ndash; short, to-the-point tutorials for frequent tasks
* [[:Category:Legacy Tutorial]] &amp;ndash; longer, elaborate tutorials for more complex tasks
* [[:Category:Legacy Feedback]] &amp;ndash; user feedback on the game and its tools

===Editing===

Topics on different aspects of editing the game.
* [[:Category:Legacy Mapping]] &amp;ndash; information and tutorials specific to mapping

* [[:Category:Legacy Modeling]] &amp;ndash; information and tutorials specific to modelling
* Coding has several categories (see next section).

===Coding===

Topics and reference pages revolving around UnrealScript.
* [[:Category:Legacy Class (RTNP)]] &amp;ndash; class reference for Return to Na Pali (an [[Legacy:Unreal 1|Unreal]] expansion pack)
* [[:Category:Legacy Class (UT)]] &amp;ndash; class reference for [[Legacy:UT|Unreal Tournament]]
* [[:Category:Legacy Class (DX)]] &amp;ndash; class reference for [[Legacy:Deus Ex|Deus Ex]]
* [[:Category:Legacy Class (UT2003)]] &amp;ndash; class reference for [[Legacy:UT2003|Unreal Tournament 2003]]
* [[:Category:Legacy Class (UT2004)]] &amp;ndash; class reference for [[Legacy:UT2004|Unreal Tournament 2004]]
* [[:Category:Legacy Class (P2)]] &amp;ndash; class reference for [[Legacy:Postal 2|Postal 2]]
* [[:Category:Legacy Custom Class (UT)]] &amp;ndash; Documentation and source for classes created for UT
* [[:Category:Legacy Custom Class (UT2004)]] &amp;ndash; Documentation and source for classes created for UT2004
* [[:Category:Legacy Custom Class (UT3)]] &amp;ndash; Documentation and source for classes created for UT3
* [[:Category:Legacy Custom Class (UT2003)]] &amp;ndash; Documentation and source for classes compatible with UT2003 but obsolete in UT2004 (e.g. Experiments with vehicles before Onslaught came along)

* [[:Category:Legacy Enum]] &amp;ndash; reference for certain important enumerations in Unreal-engine script code
* [[:Category:Legacy Algorithm]]

===Wiki Community===

Topics related to the community around the Unreal Wiki.
* [[:Category:Legacy Personal Page]] &amp;ndash; contributors' personal pages
* [[:Category:Legacy Journal]] &amp;ndash; coders and mappers tell about their modding experiences
* [[:Category:Legacy Rant]] &amp;ndash; Wikizens' view of the (Unreal) world
* [[:Category:Legacy Screenshots]] &amp;ndash;screenshots for mapping, modelling, and scripting

===Wiki Management===

Special tags and links for internal use.
* [[Legacy:WikiTag|WikiTag]] &amp;ndash; special page links that can be used to tag a page for a certain meaning
* [[:Category:Legacy To Do]] &amp;ndash; pages that are in need of additional information or an overhaul

==Background==

===How does the category system work?===

The '''Category system''' is a [[Wiki:ReverseIndex]]: To belong to a category, a page is tagged with the linked name of that category, usually at end of the text. That link takes you to a category page that lists all tagged pages.

Basically, every page is backwards-linked to its category page, but the category page doesn't have links back, it just has the ability to be searched and display a list of pages in that category &amp;ndash; however, if you're bored or you have a minute to spare, you can add a &quot;hard-coded&quot; index to a Category page, but because this list can become outdated, bear in mind when navigating the system that you'll always get the freshest list by clicking the title.

This page is '''Category Category''', the category of category pages. See below for a list of all categories on this wiki.

===Adding a page to a category===

Simply add a normal link to the category page in question to the bottom of the page.  It is customary to make the category link the last item on a page (even after a discussion) and to add a horizontal ruler directly above it:

  &lt;code&gt;----&lt;/code&gt;
  &lt;code&gt;[[Category&lt;/code&gt; &lt;code&gt;Rant]]&lt;/code&gt;

If a page belongs to several categories, simply add all applicable category page links in distinct lines, separated by \\ for a line break (as opposed to a paragraph break):

  &lt;code&gt;----&lt;/code&gt;
  &lt;code&gt;[[Category&lt;/code&gt; &lt;code&gt;Personal Page]] \\&lt;/code&gt;
  &lt;code&gt;[[Category&lt;/code&gt; &lt;code&gt;Rant]]&lt;/code&gt;

===Adding a non-categorizing link to a category page===

If you want to link to a category page without making the page this link is on part of that category (like, if you want to link to [[:Category:Legacy Personal Page]] from a general topic page), add an extra vertical bar at the end of the link:

&lt;pre&gt;  Check [[:Category:Legacy Personal Page]] for a list of personal pages.&lt;/pre&gt;

===Suggesting new categories===

To suggest a new category, add a comment on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] subpage.</text>
    </revision>
    <revision>
      <id>2087</id>
      <timestamp>2008-02-14T22:15:42Z</timestamp>
      <contributor>
        <ip>Fethican</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;

&lt;!&amp;ndash; saved from url=(0014)about:internet &amp;ndash;&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta name=&quot;generator&quot; content=&quot;Web Page Maker V2&quot;&gt;

&lt;/head&gt;

&lt;style type=&quot;text/css&quot;&gt;

/*----------Text Styles----------*/

.ws6 {font-size: 8px;}

.ws7 {font-size: 9.3px;}

.ws8 {font-size: 11px;}

.ws9 {font-size: 12px;}

.ws10 {font-size: 13px;}

.ws11 {font-size: 15px;}

.ws12 {font-size: 16px;}

.ws14 {font-size: 19px;}

.ws16 {font-size: 21px;}

.ws18 {font-size: 24px;}

.ws20 {font-size: 27px;}

.ws22 {font-size: 29px;}

.ws24 {font-size: 32px;}

.ws26 {font-size: 35px;}

.ws28 {font-size: 37px;}

.ws36 {font-size: 48px;}

.ws48 {font-size: 64px;}

.ws72 {font-size: 96px;}

.wpmd {font-size: 13px;font-family: 'Arial';font-style: normal;font-weight: normal;}

/*----------Para Styles----------*/

DIV,UL,OL /* Left */

{
 margin-top: 0px;
 margin-bottom: 0px;

}
&lt;/style&gt;

&lt;body background=&quot;http://img179.imageshack.us/img179/9726/bbbbbbbtm7.jpg&quot;&gt;

&lt;/body&gt;

&lt;/html&gt;</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Category/Discuss</title>
    <id>815</id>
    <revision>
      <id>2295</id>
      <timestamp>2007-11-19T11:24:49Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
==Proposals==

===Custom Classes===

'''sweavo:''' I've been re-categorising the Custom Class pages to reflect what game they are compatible with, but I've struck on an issue.  First a bit of explanation:

I've been removing Category Class (xx) from custom classes, because Category Class (xx) is for classes that ship as part of a game.  Therefore, no class can be Category Class (xx) and Category Custom Class.  A ''page'' might carry both tags if it has a class reference followed by some user-contributed extensions.

From that, it follows that custom classes no longer indicate what UT version they are compatible with.  So Category Custom Class is now becoming Category Custom Class (''xx'') where ''xx'' is UT, UT2003, UT2004, UT3 (though none exist at UT3 AFAIK).

The issue I have now is whether custom classes should name the GAME they are compatible with or the ENGINE.  It's quite hard to differentiate between UT2003 custom classes and UT2004 custom classes, and also AFAIK UT2004 is a lot more popular than UT2003...  So then I'm thinking UT2003 and UT2004 are both UT2 so why not use that tag.

A possible reason why not is that a custom class ''extends'' a particular class, and that parent may or may not be shipped as part of 2k3 or 2k4.  Or are the Uscript codebases of 2k3 and 2k4 pretty close? 

I guess my feeling is to treat UT2003 as the &quot;bastard half-brother&quot; and leave it locked in the basement to rot.  UT and UT2004 are clearly delineated, and I suspect UT3 will be a whole other beast.

===Examples===

Proposal for [[:Category:Legacy Example]]:

'''Tarquin:'''  There are a few practical examples scattered around here &amp;ndash; perhaps a [[:Category:Legacy Example]] would be a good idea?

'''sweavo:''' this sounds good, for code snippets that are not whole classes.  I think Category Custom Class (''xx'') should only be used for complete classes that can be cut n pasted.  If something is more of a 'howto' than a finished product, it should be in Category Example.  

The difference between Category Example and Category Tutorial ?  Not sure.  Tutorial implies a structured approach, first do this then do this, whereas example is &quot;look, this works&quot;.  But a lot of the writing on here is so bad that pages are unable to decide whether they are tutorial or reference material.

===Basic Procedure===

'''Switch`:''' Why [[Legacy:Basic_Procedure|Basic_Procedure]] is not a member of the [[:Category:Legacy Category]] ? 

===Application and Third-party Components===

'''Tarquin:''' Are [[Legacy:Application|Application]] and [[Legacy:Third-Party Components|third-Party Components]] already those categories? should the content from those be shunted to the category page, or should we consider the exiting pages to be speudo-categories?

===Category Engine?===

What to do with pages that don't apply to ''the game'', but to their engine capabilities (like dynamic array support). Maybe a category like [[:Category:Legacy Engine (Warfare)]] ?

===Topic Pages===

Proposal for [[:Category:Legacy Topic Page]]:

'''Tarquin:''' though they're all listed on the main page and there's only about 10 of them)

===Area Topics===

'''Mosquito:''' I think we should have categories for every major area of Unreal developement.  First of all you should have different categories for the game specific editting such as [[:Category:Legacy UT]], or [[:Category:Legacy UT2003]].  I also think it would be better if you had categories for every aspect such as:
* [[:Category:Legacy Mapping]]
* [[:Category:Legacy Modeling]]
* [[:Category:Legacy Scripting]]
* [[:Category:Legacy Texturing]]

And then maybe perhaps sub-categories like for mapping, different aspects of mapping:
* [[:Category:Legacy Mapping CSG]]
* [[:Category:Legacy Mapping Lights]]
* [[:Category:Legacy Mapping Textures]]
* [[:Category:Legacy Mapping Tools]] IE, the tools at the top such as the texture browser, prefab browser, etc.

Just a suggestion.

'''Wormbo:''' [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]] :o&lt;br /&gt;Cleaning up the topic pages instead of creating category pages would be much better. (and probably less work) How many pages are there on CSG and would an average newcomer even know what a CSG category covers? I don't think so.

'''Tarquin:''' Yup. Let's clean up the ''forward'' indexes!

'''SuperApe:''' I'm finding a need to Categorize pages that talk about Modding and Mutator making.  There is no [[:Category:Legacy Modding]] yet and the Category Class tag isn't helpful for these pages that talk about modding concepts and elements without being a tutorial or a custom class.  Category Scripting may be a good name too, but I find people come looking for &quot;Modding&quot; stuff just as much, if not more, than they look for &quot;Scripting&quot; stuff. (Scripting can be confused with AIScripting)  On another note, I'm voting for no sub-categories as mentioned above.  We have Topic pages for those.

===Structs===

'''Pingz:''' Where should struct documentation like [[Legacy:Quaternion|Quaternion]] and [[Legacy:Vector|Vector]] go?  Shouldn't they too belong to a category?  Maybe just stick them in the class category?

'''Wormbo:''' We already have a [[:Category:Legacy Enum]], so why not make a [[:Category:Legacy Struct]] for them if we really have that many struct pages, but remember, [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]].

===Community===

'''Ch3z'''Seems like there are some pages here that are more geared toward the community of Unreal Wiki frequenters and contributors than toward the reference type of document that is being created here. Some are Mod_Ideas, Map_Ideas, Test_Center, the whole category of personal pages... maybe not enough for a category though. It just seems like if you were to turn this wiki into a book those kinds of pages would be edited out, thus they are set apart from the rest and maybe should be categorized.

===Engines===

[[:Category:Legacy UE3]]

'''Blip2:''' For solidsnake's tuts :P

'''Graphik:''' Erm, we don't have a Category UE1 or 2...

===Global Restructure of Wiki (Denied)===

'''Legal:''' Isn't it about time to split the Wiki for real, that is, www.wiki.beyondunreal.com/wiki/(game)/(normal subpages)? UT would be www.wiki.beyondunreal.com/wiki/UT/Mover for instance. It would be easier as pages and sub-pages wouldn't be named (DX), (UT), (UT2004) and whatever. It's getting quite messy knowing what's UT and what's UT2k4 etc for me, and I'm not exactly an all-green mapper. The only downside is the duplicate pages needed for things which are the same, but that's the only thing. How about it?

'''Tarquin:''' That would be an almighty task. What would be gained by it? You'd still have to put the game name in the links. We'd still need to spend a lot of time cleaning up, which is all that we need at the moment. Which pages are particularly bad? Could people mark them when they find them, or even better, make a start on cleaning them up?

'''Tarquin:''' The real problem is manpower. Your scheme would still require people to put in some work and help shift everything across. I don't see people helping round here :(

'''Legal:''' Yeah, guess so... but it would make things more tidied in my opinion. Ah well, guess it's best to leave it anyway.

'''Tarquin:''' no, it wouldn't... we'd announce a new organisation scheme, ask for help, make a rough start and then.... it would lie dormant for ages, and even more of a mess. What we need is people to make small changes here and there: it will add up over time :) I fixed a few pages this morning....

==Problems==

'''Mychaeel:''' Editing preview shows the #MAGIC line as a single-item numbered list at the top of the page.

'''Tarquin:''' Will look into it. Just need to bypass it in some way in the displaying.
[[Category:Legacy UE3|Category/Discuss]]</text>
    </revision>
    <revision>
      <id>2296</id>
      <timestamp>2007-01-26T13:48:56Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
==Proposals==

===Examples===

Proposal for [[:Category:Legacy Example]]:

'''Tarquin:'''  There are a few practical examples scattered around here &amp;ndash; perhaps a [[:Category:Legacy Example]] would be a good idea?

'''Switch`:''' Why [[Legacy:Basic_Procedure|Basic_Procedure]] is not a member of the [[:Category:Legacy Category]] ? 

===Tools and Classes===

Proposal for [[:Category:Legacy Custom Class]], [[:Category:Legacy Third-Party Tool]], [[:Category:Legacy Software]]

'''ZxAnPhOrIaN:''' This would be the same as the third-party one, tarq.

'''Tarquin:''' Are [[Legacy:Application|Application]] and [[Legacy:Third-Party Components|third-Party Components]] already those categories? should the content from those be shunted to the category page, or should we consider the exiting pages to be speudo-categories?

I'm starting to think that [[:Category:Legacy Third-Party Class]] (or   [[:Category:Legacy Custom Class]] or something...) would be handy, as keeping  handmade list would be hell. Maybe also [[:Category:Legacy Open Source]]? 

What to do with pages that don't apply to ''the game'', but to their engine capabilitys (like dynamic array support). Maybe a category like [[:Category:Legacy Engine (Warfare)]] ?

'''Wormbo:''' What about a [[:Category:Legacy Class (Runtime)]] for classes available in the [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]]?

'''Foxpaw:''' I would be against a category class runtime, because that gives the impression that the Runtime is somehow different than the Engine, which it really isn't. If anything I think we should go the other way around and categorize the classes that belong to specific games, since the Runtime is the &quot;base&quot; on which all of them are built.

'''Wormbo:''' What prevents us from tagging pages with both Category class (UT2003) and Category Class (Runtime)? There are some important differences in some classes, e.g. there are no [[Legacy:WeaponFire|WeaponFire]] classes in the runtime and some global and actor class functions are missing as well.

'''Foxpaw:''' Well, yes, there are differences, but since Runtime is a stock Unreal Engine I would think that should be the &quot;default&quot; where no specific game is indicated.

'''Xhiris:''' The only games I see here for class pages are [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]], though I recall other games with the engine are listed.  Would it be OK to create a  [[:Category:Legacy Class (DX)]] category for this game?  There are a number of classes modified from the UT version, for example some stuff moved from Object into Actor and vice versa.  I can help with the documentation of these, I'm trying to do that for fun anyhow. :)

'''Tarquin:''' Sure, it's ok to create a new category page for Deus Ex. You want [[:Category:Legacy Class (DX)]] rather than [[:Category:Legacy Class (Deus Ex)]]? If so, class pages should probably use the same abbreviation in the name. 

'''Xhiris:''' I like [[:Category:Legacy Class (DX)]] only because it's easier to type, but either's fine. :)

'''Tarquin:''' Well since you're the guy writing about Deus Ex, we'll go with what you prefer :)

'''Dr.AwkwArD:''' It's definitely time for a [[:Category:Legacy Class (UT2004)]] ... please.  We might as well create some for [[Legacy:U2|U2]] (unreal 2) and [[Legacy:UE2|UE2]] the UnrealEngine 2 Runtime.  Whatcha think?

'''Legal:''' Isn't it about time to split the Wiki for real, that is, www.wiki.beyondunreal.com/wiki/(game)/(normal subpages)? UT would be www.wiki.beyondunreal.com/wiki/UT/Mover for instance. It would be easier as pages and sub-pages wouldn't be named (DX), (UT), (UT2004) and whatever. It's getting quite messy knowing what's UT and what's UT2k4 etc for me, and I'm not exactly an all-green mapper. The only downside is the duplicate pages needed for things which are the same, but that's the only thing. How about it?

'''Tarquin:''' That would be an almighty task. What would be gained by it? You'd still have to put the game name in the links. We'd still need to spend a lot of time cleaning up, which is all that we need at the moment. Which pages are particularly bad? Could people mark them when they find them, or even better, make a start on cleaning them up?

'''Tarquin:''' The real problem is manpower. Your scheme would still require people to put in some work and help shift everything across. I don't see people helping round here :(

'''Legal:''' Yeah, guess so... but it would make things more tidied in my opinion. Ah well, guess it's best to leave it anyway.

'''Tarquin:''' no, it wouldn't... we'd announce a new organisation scheme, ask for help, make a rough start and then.... it would lie dormant for ages, and even more of a mess. What we need is people to make small changes here and there: it will add up over time :) I fixed a few pages this morning....

'''Kamek:''' Is it ok to add a Category Class (P2) page? Postal 2 has tons of new classes which I'm working on documenting in the wiki.

'''Tarquin:''' Sure, go ahead.

'''EricBlade:''' Perhaps a Code category for random code?

===Topic Pages===

Proposal for [[:Category:Legacy Topic Page]]:

'''Tarquin:''' though they're all listed on the main page and there's only about 10 of them)

===Area Topics===

'''Mosquito:''' I think we should have categories for every major area of Unreal developement.  First of all you should have different categories for the game specific editting such as [[:Category:Legacy UT]], or [[:Category:Legacy UT2003]].  I also think it would be better if you had categories for every aspect such as:
* [[:Category:Legacy Mapping]]
* [[:Category:Legacy Modeling]]
* [[:Category:Legacy Scripting]]
* [[:Category:Legacy Texturing]]

And then maybe perhaps sub-categories like for mapping, different aspects of mapping:
* [[:Category:Legacy Mapping CSG]]
* [[:Category:Legacy Mapping Lights]]
* [[:Category:Legacy Mapping Textures]]
* [[:Category:Legacy Mapping Tools]] IE, the tools at the top such as the texture browser, prefab browser, etc.

Just a suggestion.

'''Wormbo:''' [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]] :o&lt;br /&gt;Cleaning up the topic pages instead of creating category pages would be much better. (and probably less work) How many pages are there on CSG and would an average newcomer even know what a CSG category covers? I don't think so.

'''Tarquin:''' Yup. Let's clean up the ''forward'' indexes!

'''SuperApe:''' I'm finding a need to Categorize pages that talk about Modding and Mutator making.  There is no [[:Category:Legacy Modding]] yet and the Category Class tag isn't helpful for these pages that talk about modding concepts and elements without being a tutorial or a custom class.  Category Scripting may be a good name too, but I find people come looking for &quot;Modding&quot; stuff just as much, if not more, than they look for &quot;Scripting&quot; stuff. (Scripting can be confused with AIScripting)  On another note, I'm voting for no sub-categories as mentioned above.  We have Topic pages for those.

===Structs===

'''Pingz:''' Where should struct documentation like [[Legacy:Quaternion|Quaternion]] and [[Legacy:Vector|Vector]] go?  Shouldn't they too belong to a category?  Maybe just stick them in the class category?

'''Wormbo:''' We already have a [[:Category:Legacy Enum]], so why not make a [[:Category:Legacy Struct]] for them if we really have that many struct pages, but remember, [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]].

===Community===

'''Ch3z'''Seems like there are some pages here that are more geared toward the communty of Unreal Wiki frequenters and contributors than toward the refference type of document that is being created here. Some are Mod_Ideas, Map_Ideas, Test_Center, the whole category of personal pages... maybe not enough for a category though. It just seems like if you were to turn this wiki into a book those kinds of pages would be editted out, thus they are set apart from the rest and maybe should be categorized.

===Engines===

[[:Category:Legacy UE3]]

'''Blip2:''' For solidsnake's tuts :P

'''Graphik:''' Erm, we don't have a Category UE1 or 2...

=== ===

==Problems==

'''Mychaeel:''' Editing preview shows the #MAGIC line as a single-item numbered list at the top of the page.

'''Tarquin:''' Will look into it. Just need to bypass it in some way in the displaying.
[[Category:Legacy UE3|Category/Discuss]]</text>
    </revision>
    <revision>
      <id>2297</id>
      <timestamp>2007-11-19T11:11:50Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Refactor.  But I think I clobbered some important points by mistake.</comment>
      <text xml:space="preserve">{{Legacy category}}
==Proposals==

===Custom Classes===

'''sweavo:''' I've been re-categorising the Custom Class pages to reflect what game they are compatible with, but I've struck on an issue.  First a bit of explanation:

I've been removing Category Class (xx) from custom classes, because Category Class (xx) is for classes that ship as part of a game.  Therefore, no class can be Category Class (xx) and Category Custom Class.  A ''page'' might carry both tags if it has a class reference followed by some user-contributed extensions.

From that, it follows that custom classes no longer indicate what UT version they are compatible with.  So Category Custom Class is now becoming Category Custom Class (''xx'') where ''xx'' is UT, UT2003, UT2004, UT3 (though none exist at UT3 AFAIK).

The issue I have now is whether custom classes should name the GAME they are compatible with or the ENGINE.  It's quite hard to differentiate between UT2003 custom classes and UT2004 custom classes, and also AFAIK UT2004 is a lot more popular than UT2003...  So then I'm thinking UT2003 and UT2004 are both UT2 so why not use that tag.

A possible reason why not is that a custom class ''extends'' a particular class, and that parent may or may not be shipped as part of 2k3 or 2k4.  Or are the Uscript codebases of 2k3 and 2k4 pretty close? 

I guess my feeling is to treat UT2003 as the &quot;bastard half-brother&quot; and leave it locked in the basement to rot.  UT and UT2004 are clearly delineated, and I suspect UT3 will be a whole other beast.

===Examples===

Proposal for [[:Category:Legacy Example]]:

'''Tarquin:'''  There are a few practical examples scattered around here &amp;ndash; perhaps a [[:Category:Legacy Example]] would be a good idea?

'''sweavo:''' this sounds good, for code snippets that are not whole classes.  I think Category Custom Class (''xx'') should only be used for complete classes that can be cut n pasted.  If something is more of a 'howto' than a finished product, it should be in Category Example.  

The difference between Category Example and Category Tutorial ?  Not sure.  Tutorial implies a structured approach, first do this then do this, whereas example is &quot;look, this works&quot;.  But a lot of the writing on here is so bad that pages are unable to decide whether they are tutorial or reference material.

===Basic Procedure===

'''Switch`:''' Why [[Legacy:Basic_Procedure|Basic_Procedure]] is not a member of the [[:Category:Legacy Category]] ? 

===Application and Third-party Components===

'''Tarquin:''' Are [[Legacy:Application|Application]] and [[Legacy:Third-Party Components|third-Party Components]] already those categories? should the content from those be shunted to the category page, or should we consider the exiting pages to be speudo-categories?

What to do with pages that don't apply to ''the game'', but to their engine capabilities (like dynamic array support). Maybe a category like [[:Category:Legacy Engine (Warfare)]] ?

'''Foxpaw:''' I would be against a category class runtime, because that gives the impression that the Runtime is somehow different than the Engine, which it really isn't. If anything I think we should go the other way around and categorize the classes that belong to specific games, since the Runtime is the &quot;base&quot; on which all of them are built.

'''Wormbo:''' What prevents us from tagging pages with both Category class (UT2003) and Category Class (Runtime)? There are some important differences in some classes, e.g. there are no [[Legacy:WeaponFire|WeaponFire]] classes in the runtime and some global and actor class functions are missing as well.

'''Foxpaw:''' Well, yes, there are differences, but since Runtime is a stock Unreal Engine I would think that should be the &quot;default&quot; where no specific game is indicated.

'''Dr.AwkwArD:''' It's definitely time for a [[:Category:Legacy Class (UT2004)]] ... please.  We might as well create some for [[Legacy:U2|U2]] (unreal 2) and [[Legacy:UE2|UE2]] the UnrealEngine 2 Runtime.  Whatcha think?

===Topic Pages===

Proposal for [[:Category:Legacy Topic Page]]:

'''Tarquin:''' though they're all listed on the main page and there's only about 10 of them)

===Area Topics===

'''Mosquito:''' I think we should have categories for every major area of Unreal developement.  First of all you should have different categories for the game specific editting such as [[:Category:Legacy UT]], or [[:Category:Legacy UT2003]].  I also think it would be better if you had categories for every aspect such as:
* [[:Category:Legacy Mapping]]
* [[:Category:Legacy Modeling]]
* [[:Category:Legacy Scripting]]
* [[:Category:Legacy Texturing]]

And then maybe perhaps sub-categories like for mapping, different aspects of mapping:
* [[:Category:Legacy Mapping CSG]]
* [[:Category:Legacy Mapping Lights]]
* [[:Category:Legacy Mapping Textures]]
* [[:Category:Legacy Mapping Tools]] IE, the tools at the top such as the texture browser, prefab browser, etc.

Just a suggestion.

'''Wormbo:''' [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]] :o&lt;br /&gt;Cleaning up the topic pages instead of creating category pages would be much better. (and probably less work) How many pages are there on CSG and would an average newcomer even know what a CSG category covers? I don't think so.

'''Tarquin:''' Yup. Let's clean up the ''forward'' indexes!

'''SuperApe:''' I'm finding a need to Categorize pages that talk about Modding and Mutator making.  There is no [[:Category:Legacy Modding]] yet and the Category Class tag isn't helpful for these pages that talk about modding concepts and elements without being a tutorial or a custom class.  Category Scripting may be a good name too, but I find people come looking for &quot;Modding&quot; stuff just as much, if not more, than they look for &quot;Scripting&quot; stuff. (Scripting can be confused with AIScripting)  On another note, I'm voting for no sub-categories as mentioned above.  We have Topic pages for those.

===Structs===

'''Pingz:''' Where should struct documentation like [[Legacy:Quaternion|Quaternion]] and [[Legacy:Vector|Vector]] go?  Shouldn't they too belong to a category?  Maybe just stick them in the class category?

'''Wormbo:''' We already have a [[:Category:Legacy Enum]], so why not make a [[:Category:Legacy Struct]] for them if we really have that many struct pages, but remember, [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]].

===Community===

'''Ch3z'''Seems like there are some pages here that are more geared toward the communty of Unreal Wiki frequenters and contributors than toward the refference type of document that is being created here. Some are Mod_Ideas, Map_Ideas, Test_Center, the whole category of personal pages... maybe not enough for a category though. It just seems like if you were to turn this wiki into a book those kinds of pages would be editted out, thus they are set apart from the rest and maybe should be categorized.

===Engines===

[[:Category:Legacy UE3]]

'''Blip2:''' For solidsnake's tuts :P

'''Graphik:''' Erm, we don't have a Category UE1 or 2...

==Global Restructure of Wiki (Denied)==

'''Legal:''' Isn't it about time to split the Wiki for real, that is, www.wiki.beyondunreal.com/wiki/(game)/(normal subpages)? UT would be www.wiki.beyondunreal.com/wiki/UT/Mover for instance. It would be easier as pages and sub-pages wouldn't be named (DX), (UT), (UT2004) and whatever. It's getting quite messy knowing what's UT and what's UT2k4 etc for me, and I'm not exactly an all-green mapper. The only downside is the duplicate pages needed for things which are the same, but that's the only thing. How about it?

'''Tarquin:''' That would be an almighty task. What would be gained by it? You'd still have to put the game name in the links. We'd still need to spend a lot of time cleaning up, which is all that we need at the moment. Which pages are particularly bad? Could people mark them when they find them, or even better, make a start on cleaning them up?

'''Tarquin:''' The real problem is manpower. Your scheme would still require people to put in some work and help shift everything across. I don't see people helping round here :(

'''Legal:''' Yeah, guess so... but it would make things more tidied in my opinion. Ah well, guess it's best to leave it anyway.

'''Tarquin:''' no, it wouldn't... we'd announce a new organisation scheme, ask for help, make a rough start and then.... it would lie dormant for ages, and even more of a mess. What we need is people to make small changes here and there: it will add up over time :) I fixed a few pages this morning....

==Problems==

'''Mychaeel:''' Editing preview shows the #MAGIC line as a single-item numbered list at the top of the page.

'''Tarquin:''' Will look into it. Just need to bypass it in some way in the displaying.
[[Category:Legacy UE3|Category/Discuss]]</text>
    </revision>
    <revision>
      <id>28669</id>
      <timestamp>2008-05-20T11:24:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed non-existing category</comment>
      <text xml:space="preserve">{{Legacy category}}
==Proposals==

===Custom Classes===

'''sweavo:''' I've been re-categorising the Custom Class pages to reflect what game they are compatible with, but I've struck on an issue.  First a bit of explanation:

I've been removing Category Class (xx) from custom classes, because Category Class (xx) is for classes that ship as part of a game.  Therefore, no class can be Category Class (xx) and Category Custom Class.  A ''page'' might carry both tags if it has a class reference followed by some user-contributed extensions.

From that, it follows that custom classes no longer indicate what UT version they are compatible with.  So Category Custom Class is now becoming Category Custom Class (''xx'') where ''xx'' is UT, UT2003, UT2004, UT3 (though none exist at UT3 AFAIK).

The issue I have now is whether custom classes should name the GAME they are compatible with or the ENGINE.  It's quite hard to differentiate between UT2003 custom classes and UT2004 custom classes, and also AFAIK UT2004 is a lot more popular than UT2003...  So then I'm thinking UT2003 and UT2004 are both UT2 so why not use that tag.

A possible reason why not is that a custom class ''extends'' a particular class, and that parent may or may not be shipped as part of 2k3 or 2k4.  Or are the Uscript codebases of 2k3 and 2k4 pretty close? 

I guess my feeling is to treat UT2003 as the &quot;bastard half-brother&quot; and leave it locked in the basement to rot.  UT and UT2004 are clearly delineated, and I suspect UT3 will be a whole other beast.

===Examples===

Proposal for [[:Category:Legacy Example]]:

'''Tarquin:'''  There are a few practical examples scattered around here &amp;ndash; perhaps a [[:Category:Legacy Example]] would be a good idea?

'''sweavo:''' this sounds good, for code snippets that are not whole classes.  I think Category Custom Class (''xx'') should only be used for complete classes that can be cut n pasted.  If something is more of a 'howto' than a finished product, it should be in Category Example.  

The difference between Category Example and Category Tutorial ?  Not sure.  Tutorial implies a structured approach, first do this then do this, whereas example is &quot;look, this works&quot;.  But a lot of the writing on here is so bad that pages are unable to decide whether they are tutorial or reference material.

===Basic Procedure===

'''Switch`:''' Why [[Legacy:Basic_Procedure|Basic_Procedure]] is not a member of the [[:Category:Legacy Category]] ? 

===Application and Third-party Components===

'''Tarquin:''' Are [[Legacy:Application|Application]] and [[Legacy:Third-Party Components|third-Party Components]] already those categories? should the content from those be shunted to the category page, or should we consider the exiting pages to be speudo-categories?

===Category Engine?===

What to do with pages that don't apply to ''the game'', but to their engine capabilities (like dynamic array support). Maybe a category like [[:Category:Legacy Engine (Warfare)]] ?

===Topic Pages===

Proposal for [[:Category:Legacy Topic Page]]:

'''Tarquin:''' though they're all listed on the main page and there's only about 10 of them)

===Area Topics===

'''Mosquito:''' I think we should have categories for every major area of Unreal developement.  First of all you should have different categories for the game specific editting such as [[:Category:Legacy UT]], or [[:Category:Legacy UT2003]].  I also think it would be better if you had categories for every aspect such as:
* [[:Category:Legacy Mapping]]
* [[:Category:Legacy Modeling]]
* [[:Category:Legacy Scripting]]
* [[:Category:Legacy Texturing]]

And then maybe perhaps sub-categories like for mapping, different aspects of mapping:
* [[:Category:Legacy Mapping CSG]]
* [[:Category:Legacy Mapping Lights]]
* [[:Category:Legacy Mapping Textures]]
* [[:Category:Legacy Mapping Tools]] IE, the tools at the top such as the texture browser, prefab browser, etc.

Just a suggestion.

'''Wormbo:''' [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]] :o&lt;br /&gt;Cleaning up the topic pages instead of creating category pages would be much better. (and probably less work) How many pages are there on CSG and would an average newcomer even know what a CSG category covers? I don't think so.

'''Tarquin:''' Yup. Let's clean up the ''forward'' indexes!

'''SuperApe:''' I'm finding a need to Categorize pages that talk about Modding and Mutator making.  There is no [[:Category:Legacy Modding]] yet and the Category Class tag isn't helpful for these pages that talk about modding concepts and elements without being a tutorial or a custom class.  Category Scripting may be a good name too, but I find people come looking for &quot;Modding&quot; stuff just as much, if not more, than they look for &quot;Scripting&quot; stuff. (Scripting can be confused with AIScripting)  On another note, I'm voting for no sub-categories as mentioned above.  We have Topic pages for those.

===Structs===

'''Pingz:''' Where should struct documentation like [[Legacy:Quaternion|Quaternion]] and [[Legacy:Vector|Vector]] go?  Shouldn't they too belong to a category?  Maybe just stick them in the class category?

'''Wormbo:''' We already have a [[:Category:Legacy Enum]], so why not make a [[:Category:Legacy Struct]] for them if we really have that many struct pages, but remember, [[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]].

===Community===

'''Ch3z'''Seems like there are some pages here that are more geared toward the community of Unreal Wiki frequenters and contributors than toward the reference type of document that is being created here. Some are Mod_Ideas, Map_Ideas, Test_Center, the whole category of personal pages... maybe not enough for a category though. It just seems like if you were to turn this wiki into a book those kinds of pages would be edited out, thus they are set apart from the rest and maybe should be categorized.

===Engines===

[[:Category:Legacy UE3]]

'''Blip2:''' For solidsnake's tuts :P

'''Graphik:''' Erm, we don't have a Category UE1 or 2...

===Global Restructure of Wiki (Denied)===

'''Legal:''' Isn't it about time to split the Wiki for real, that is, www.wiki.beyondunreal.com/wiki/(game)/(normal subpages)? UT would be www.wiki.beyondunreal.com/wiki/UT/Mover for instance. It would be easier as pages and sub-pages wouldn't be named (DX), (UT), (UT2004) and whatever. It's getting quite messy knowing what's UT and what's UT2k4 etc for me, and I'm not exactly an all-green mapper. The only downside is the duplicate pages needed for things which are the same, but that's the only thing. How about it?

'''Tarquin:''' That would be an almighty task. What would be gained by it? You'd still have to put the game name in the links. We'd still need to spend a lot of time cleaning up, which is all that we need at the moment. Which pages are particularly bad? Could people mark them when they find them, or even better, make a start on cleaning them up?

'''Tarquin:''' The real problem is manpower. Your scheme would still require people to put in some work and help shift everything across. I don't see people helping round here :(

'''Legal:''' Yeah, guess so... but it would make things more tidied in my opinion. Ah well, guess it's best to leave it anyway.

'''Tarquin:''' no, it wouldn't... we'd announce a new organisation scheme, ask for help, make a rough start and then.... it would lie dormant for ages, and even more of a mess. What we need is people to make small changes here and there: it will add up over time :) I fixed a few pages this morning....

==Problems==

'''Mychaeel:''' Editing preview shows the #MAGIC line as a single-item numbered list at the top of the page.

'''Tarquin:''' Will look into it. Just need to bypass it in some way in the displaying.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (DX)</title>
    <id>845</id>
    <revision>
      <id>2360</id>
      <timestamp>2004-01-27T16:26:29Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Deus Ex|Deus Ex]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (DX)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (DX)]]</text>
    </revision>
    <revision>
      <id>10766</id>
      <timestamp>2008-04-04T14:11:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes by game]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Deus Ex|Deus Ex]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (DX)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (DX)]]
[[Category:Classes by game|Deus Ex]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (P2)</title>
    <id>867</id>
    <revision>
      <id>2411</id>
      <timestamp>2004-05-27T22:21:16Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Postal 2|Postal 2]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (P2)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (P2)]]</text>
    </revision>
    <revision>
      <id>10763</id>
      <timestamp>2008-04-04T14:10:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes by game]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Postal 2|Postal 2]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (P2)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (P2)]]
[[Category:Classes by game|Postal 2]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (RTNP)</title>
    <id>812</id>
    <revision>
      <id>2287</id>
      <timestamp>2006-06-05T07:21:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>sorry this is the wrong place</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for all classes that Legend added to [[Legacy:Unreal 1|Unreal]] when they created the ''Unreal Mission Pack'', probably known more commonly as ''Return to Na Pali''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (RTNP)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

[[Category:Legacy Category|Class (RTNP)]]
[[Category:Legacy Class (RTNP)|Class (RTNP)]]</text>
    </revision>
    <revision>
      <id>2288</id>
      <timestamp>2006-06-05T06:10:26Z</timestamp>
      <contributor>
        <ip>C-69-247-230-239.hsd1.tn.comcast.net</ip>
      </contributor>
      <comment>* Sorrry about my edit of mass destruction earlier. Hope this helps.</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for all classes that Legend added to [[Legacy:Unreal 1|Unreal]] when they created the ''Unreal Mission Pack'', probably known more commonly as ''Return to Na Pali''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (RTNP)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

[Gametypes]

UpakGame: Singleplayer in Mission Pack 1. 

UpakCoopGame: Coopgame using the Upak levels. Not used.

Cloakmatch. Deathmatch using the Cloak item. Botmatch.

TerranWeaponMatch: Unreal weapons replaced with Upak ones. Botmatch

MarineMatch: All bots are Marines attacking any players. Botmatch.

[Monsters]

Predator: Small reptile that bites you. May run away and return with more.

Spinner: Spiders that spit acid at you.

SpaceMarine: These are actually bots, not scripted pawns. Set Gameinfo bTeamGame True.

{{innerbox| ----

 [[:Category:Legacy Class (RTNP)]] 

}}
[[Category:Legacy Category|Class (RTNP)]]
[[Category:Legacy Class (RTNP)|Class (RTNP)]]</text>
    </revision>
    <revision>
      <id>10767</id>
      <timestamp>2008-04-04T14:11:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Classes by game]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for all classes that Legend added to [[Legacy:Unreal 1|Unreal]] when they created the ''Unreal Mission Pack'', probably known more commonly as ''Return to Na Pali''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (RTNP)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

[[Category:Legacy Category|Class (RTNP)]]
[[Category:Classes by game|Return to NaPali]]</text>
    </revision>
    <revision>
      <id>12664</id>
      <timestamp>2008-05-17T08:28:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moved from category classes by game to rtnp-specific classes</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for all classes that Legend added to [[Legacy:Unreal 1|Unreal]] when they created the ''Unreal Mission Pack'', probably known more commonly as ''Return to Na Pali''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (RTNP)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

[[Category:Legacy Category|Class (RTNP)]]
[[Category:RTNP-specific classes| ]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (UT)</title>
    <id>777</id>
    <revision>
      <id>2212</id>
      <timestamp>2007-11-17T23:38:31Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Unreal Tournament|Unreal Tournament]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT.  For that, use '''Category Custom Class (UT)'''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT)]]</text>
    </revision>
    <revision>
      <id>2213</id>
      <timestamp>2003-05-24T16:23:48Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Unreal Tournament|Unreal Tournament]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT)]]</text>
    </revision>
    <revision>
      <id>10757</id>
      <timestamp>2008-04-04T14:05:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:UT-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:Unreal Tournament|Unreal Tournament]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT.  For that, use '''Category Custom Class (UT)'''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT)]]
[[Category:UT-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (UT2003)</title>
    <id>778</id>
    <revision>
      <id>2214</id>
      <timestamp>2007-11-17T23:36:39Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT2003|UT2003]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT2003.  For that, use '''Category Custom Class (UT2003)'''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT2003)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT2003)]]</text>
    </revision>
    <revision>
      <id>2215</id>
      <timestamp>2006-04-07T07:56:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT2003|UT2003]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT2003)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT2003)]]</text>
    </revision>
    <revision>
      <id>10765</id>
      <timestamp>2008-04-04T14:10:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:UT2003-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT2003|UT2003]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT2003.  For that, use '''Category Custom Class (UT2003)'''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT2003)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT2003)]]
[[Category:UT2003-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (UT2004)</title>
    <id>861</id>
    <revision>
      <id>2398</id>
      <timestamp>2007-11-17T23:37:40Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT2004|UT2004]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT2004.  For that, use '''Category Custom Class (UT2004)'''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT2004)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT2004)]]</text>
    </revision>
    <revision>
      <id>2399</id>
      <timestamp>2005-01-14T03:15:53Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT2004|UT2004]]. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT2004)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT2004)]]</text>
    </revision>
    <revision>
      <id>10764</id>
      <timestamp>2008-04-04T14:10:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:UT2004-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT2004|UT2004]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT2004.  For that, use '''Category Custom Class (UT2004)'''.

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT2004)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT2004)]]
[[Category:UT2004-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class (UT3)</title>
    <id>925</id>
    <revision>
      <id>2528</id>
      <timestamp>2008-02-09T14:56:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created category page for UT3 classes</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting [[Legacy:UnrealScript|UnrealScript]] classes that are part of [[Legacy:UT3|UT3]]. 

'''Note:''' it is not correct to put pages that create new content in this category just because they are compatible with UT3.  For that, use [[:Category:Legacy Custom Class (UT3)]].

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class (UT3)]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class (UT3)]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Class Tree</title>
    <id>817</id>
    <revision>
      <id>2300</id>
      <timestamp>2003-05-26T11:30:58Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages that have a [[Legacy:Class Tree|Class Tree]] on them. (That does not include individual class pages with just one level of subclasses.)

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class Tree]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class Tree]]</text>
    </revision>
    <revision>
      <id>2301</id>
      <timestamp>2003-05-26T10:43:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>well, you didn't say no :P</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages that have a [[Legacy:Class Tree|Class Tree]] on them. (not class pages with just one level of subclasses)

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Class Tree]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Class Tree]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Complete Index</title>
    <id>816</id>
    <revision>
      <id>2298</id>
      <timestamp>2003-05-22T12:10:16Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>done :) (and DOH!)</comment>
      <text xml:space="preserve">{{Legacy category}}
#MAGIC AllPages list=OL

A list of all the pages on this Wiki. Same as http://wiki.beyondunreal.com/wiki?action=index/</text>
    </revision>
    <revision>
      <id>2299</id>
      <timestamp>2003-05-22T12:05:46Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
#MAGIC AllPages list=OL

A list of all the pages on this Wiki. Same as http://wiki.beyondunreal.com/wiki?action=index/

'''Mychaeel:''' Links to the individual pages would be nice.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Custom Class (P2)</title>
    <id>919</id>
    <revision>
      <id>2519</id>
      <timestamp>2007-11-18T17:02:37Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
Custom Classes for Postal 2, i.e. not shipped with the game.
[[Category:Legacy Category|Custom Class (P2)]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Custom Class (UT)</title>
    <id>916</id>
    <revision>
      <id>2513</id>
      <timestamp>2007-11-17T23:40:00Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT version prior to UT2003.

Classes invented by wiki authors go in this category.  Classes that shipped with the game go in Category Class (UT).  A class cannot be in both.
[[Category:Legacy Category|Custom Class (UT)]]</text>
    </revision>
    <revision>
      <id>2514</id>
      <timestamp>2007-11-17T23:34:30Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT version prior to UT2003.

Classes invented by wiki authors go in this category.  Classes that shipped with the game go in Category Class (UT).  A class cannot be in both.</text>
    </revision>
    <revision>
      <id>10762</id>
      <timestamp>2008-04-04T14:09:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Custom UT-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT version prior to UT2003.

Classes invented by wiki authors go in this category.  Classes that shipped with the game go in Category Class (UT).  A class cannot be in both.
[[Category:Legacy Category|Custom Class (UT)]]
[[Category:Custom UT-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Custom Class (UT2003)</title>
    <id>920</id>
    <revision>
      <id>2520</id>
      <timestamp>2007-11-23T20:20:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
The category for third-party classes compatible with UT2003, but not shipped with the game.

The classes in this category are possibly obsoleted by UT2004 (e.g. vehicle stuff replaced by Onslaught and Assault technology)
[[Category:Legacy Category|Custom Class (UT2003)]]</text>
    </revision>
    <revision>
      <id>2521</id>
      <timestamp>2007-11-23T18:59:47Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://uk.geocities.com/clubs626puberty/young-little-gay-bareback-boys.htm]young little gay bareback boys[/url]</text>
    </revision>
    <revision>
      <id>10758</id>
      <timestamp>2008-04-04T14:06:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:UT2003-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
The category for third-party classes compatible with UT2003, but not shipped with the game.

The classes in this category are possibly obsoleted by UT2004 (e.g. vehicle stuff replaced by Onslaught and Assault technology)
[[Category:Legacy Category|Custom Class (UT2003)]]

[[Category:UT2003-specific classes| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10759</id>
      <timestamp>2008-04-04T14:07:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>erk - custom, not stock</comment>
      <text xml:space="preserve">{{Legacy category}}
The category for third-party classes compatible with UT2003, but not shipped with the game.

The classes in this category are possibly obsoleted by UT2004 (e.g. vehicle stuff replaced by Onslaught and Assault technology)
[[Category:Legacy Category|Custom Class (UT2003)]]

[[Category:Custom UT2003-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Custom Class (UT2004)</title>
    <id>917</id>
    <revision>
      <id>2515</id>
      <timestamp>2007-11-17T23:40:20Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT2004 onwards.

Classes invented by wiki authors go here.  Classes that shipped with the game go in Category Class (UT2004).  A class cannot be in both.
[[Category:Legacy Category|Custom Class (UT2004)]]</text>
    </revision>
    <revision>
      <id>2516</id>
      <timestamp>2007-11-17T23:33:22Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT2004 onwards.

Classes invented by wiki authors go here.  Classes that shipped with the game go in Category Class (UT2004).  A class cannot be in both.</text>
    </revision>
    <revision>
      <id>10761</id>
      <timestamp>2008-04-04T14:08:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Custom UT2004-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT2004 onwards.

Classes invented by wiki authors go here.  Classes that shipped with the game go in Category Class (UT2004).  A class cannot be in both.
[[Category:Legacy Category|Custom Class (UT2004)]]
[[Category:Custom UT2004-specific classes| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10771</id>
      <timestamp>2008-04-04T14:14:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Legacy Class (UT2004)]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This Category is for custom classes compatible with (or recommended for) UT2004 onwards.

Classes invented by wiki authors go here.  Classes that shipped with the game go in Category Class (UT2004).  A class cannot be in both.
[[Category:Legacy Category|Custom Class (UT2004)]]
[[Category:Legacy Class (UT2004)|Custom Class (UT2004)]]
[[Category:Custom UT2004-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Custom Class (UT3)</title>
    <id>922</id>
    <revision>
      <id>2523</id>
      <timestamp>2007-11-23T20:20:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
The category for third-party classes compatible with UT3, but not shipped with the game.
[[Category:Legacy Category|Custom Class (UT3)]]</text>
    </revision>
    <revision>
      <id>2524</id>
      <timestamp>2007-11-23T19:00:53Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://ca.geocities.com/vegas784cash/ynlqd/free-fantasy-strip-poker.htm]free fantasy strip poker[/url]</text>
    </revision>
    <revision>
      <id>10760</id>
      <timestamp>2008-04-04T14:08:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Custom UT3-specific classes]]</comment>
      <text xml:space="preserve">{{Legacy category}}
The category for third-party classes compatible with UT3, but not shipped with the game.
[[Category:Legacy Category|Custom Class (UT3)]]
[[Category:Custom UT3-specific classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Dead Links</title>
    <id>918</id>
    <revision>
      <id>2517</id>
      <timestamp>2007-11-18T16:59:10Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is a category for pages where most or all the useful content in the page takes the form of a link, but that link is dead.
[[Category:Legacy Category|Dead Links]]</text>
    </revision>
    <revision>
      <id>2518</id>
      <timestamp>2007-11-18T16:58:56Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is a category for pages where most or all the useful content in the page takes the form of a link, but that link is dead.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Delete Me</title>
    <id>1004</id>
    <revision>
      <id>2702</id>
      <timestamp>2005-11-22T19:37:28Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

This tag marks pages that are about to be deleted.  This doesn't invoke any sort of automatism; it merely serves as a handy search target for the admins.

Note that if a page does ''not'' contain a [[:Category:Legacy Delete Me]] tag that doesn't mean it cannot be deleted.  Admins don't just randomly delete pages, of course, but if a page seems to have been created solely for testing purposes (which we ask users not to do), maliciously or by accident, we occasionally may delete it without further ado.

There's a permanent log of all changes ever done on the Wiki, so no valuable content can ever get completely lost (although it can be quite a hassle to retrieve it once a page has been fully deleted). 

==Example==

If you think a page should be deleted, add a link to [[:Category:Legacy Delete Me]] along with a short explanation like this:

: [[:Category:Legacy Delete Me]] because this page is redundant with [[Legacy:The Weather In London|The Weather in London]]. &lt;br /&gt;[[:Category:Legacy Delete Me]] &amp;ndash; page obsoleted by [[:Category:Legacy Wanted Pages]].

Also put something in the ''Summary'' field when you add a [[:Category:Legacy Delete Me]] tag to attract the admins' attention &amp;ndash; otherwise the deletion request may remain unanswered until an admin happens to stumble over it by accident.

==Deletion Requests==

Deletion requests are listed below.
[[Category:Legacy Wanted Pages|Delete Me]]</text>
    </revision>
    <revision>
      <id>2703</id>
      <timestamp>2003-05-22T12:11:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>magic!</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

This tag marks pages that are about to be deleted.  Note that it doesn't invoke any sort of automatism; it merely serves as a handy search target for the admins.

Note that if a page does ''not'' contain a [[:Category:Legacy Delete Me]] tag that doesn't mean that it cannot be deleted.  Admins don't just randomly delete pages, of course, but if a page seems to have been created solely for testing purposes (which we ask users not to do), maliciously or by accident, we occasionally simply delete it without further ado.

There's a permanent log of all changes ever done on the Wiki, so no valuable content can ever get completely lost (altough it can be quite a hassle to retrieve it once a page has been fully deleted). 

==Example==

If you think a page should be deleted, add a link to [[:Category:Legacy Delete Me]] along with a short explanation like this:

: [[:Category:Legacy Delete Me]] because this page is redundant with [[Legacy:The Weather In London|The Weather in London]]. &lt;br /&gt;[[:Category:Legacy Delete Me]] &amp;ndash; page obsoleted by [[:Category:Legacy Wanted Pages]].

Also put something in the ''Summary'' field when you add a [[:Category:Legacy Delete Me]] tag to attract the admins' attention &amp;ndash; otherwise the deletion request may remain unanswered until an admin happens to stumble over it by accident.

==Deletion Requests==

Are listed below.
[[Category:Legacy Wanted Pages|Delete Me]]</text>
    </revision>
    <revision>
      <id>2704</id>
      <timestamp>2003-08-05T13:52:04Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

This tag marks pages that are about to be deleted.  This doesn't invoke any sort of automatism; it merely serves as a handy search target for the admins.

Note that if a page does ''not'' contain a [[:Category:Legacy Delete Me]] tag that doesn't mean it cannot be deleted.  Admins don't just randomly delete pages, of course, but if a page seems to have been created solely for testing purposes (which we ask users not to do), maliciously or by accident, we occasionally may delete it without further ado.

There's a permanent log of all changes ever done on the Wiki, so no valuable content can ever get completely lost (although it can be quite a hassle to retrieve it once a page has been fully deleted). 

==Example==

If you think a page should be deleted, add a link to [[:Category:Legacy Delete Me]] along with a short explanation like this:

: [[:Category:Legacy Delete Me]] because this page is redundant with [[Legacy:The Weather In London|The Weather in London]]. &lt;br /&gt;[[:Category:Legacy Delete Me]] &amp;ndash; page obsoleted by [[:Category:Legacy Wanted Pages]].

Also put something in the ''Summary'' field when you add a [[:Category:Legacy Delete Me]] tag to attract the admins' attention &amp;ndash; otherwise the deletion request may remain unanswered until an admin happens to stumble over it by accident.

==Deletion Requests==

Deletion requests are listed below.
[[Category:Legacy Wanted Pages|Delete Me]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Delete Reply When You See It</title>
    <id>1000</id>
    <revision>
      <id>2694</id>
      <timestamp>2003-05-28T08:35:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>2695</id>
      <timestamp>2003-04-02T12:09:21Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Wiki:WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. Though anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].
[[Category:Legacy Delete Reply When You See It|Delete Reply When You See It]]
[[Category:Legacy Refactor Me|Delete Reply When You See It]]</text>
    </revision>
    <revision>
      <id>2696</id>
      <timestamp>2003-05-25T14:02:21Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].
[[Category:Legacy Delete Reply When You See It|Delete Reply When You See It]]</text>
    </revision>
    <revision>
      <id>33834</id>
      <timestamp>2008-12-30T06:12:10Z</timestamp>
      <contributor>
        <username>OudomZeldr</username>
        <id>1841</id>
      </contributor>
      <comment>ellaacacelal</comment>
      <text xml:space="preserve">basbobasro
{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>33840</id>
      <timestamp>2008-12-30T07:52:54Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>33871</id>
      <timestamp>2009-01-08T16:59:16Z</timestamp>
      <contributor>
        <username>OudomZeldr</username>
        <id>1841</id>
      </contributor>
      <comment>http://bukgetert.0lx.net/article-28.htm</comment>
      <text xml:space="preserve">[webmap|http://bukgetert.0lx.net/article-28.htm] [[http://bukgetert.0lx.net/article-28.htm webmap]] [http://bukgetert.0lx.net/article-28.htm|webmap] ((http://bukgetert.0lx.net/article-28.htm webmap)) [[http://bukgetert.0lx.net/article-28.htm | webmap]] &quot;webmap&quot;:http://bukgetert.0lx.net/article-28.htm [old man and fuck and movie|http://acsitzar.0lx.net/news-old-man-and-2008-11-20.html] [[http://acsitzar.0lx.net/news-old-man-and-2008-11-20.html old man and fuck and movie]] [http://acsitzar.0lx.net/news-old-man-and-2008-11-20.html|old man and fuck and movie] ((http://acsitzar.0lx.net/news-old-man-and-2008-11-20.html old man and fuck and movie)) [[http://acsitzar.0lx.net/news-old-man-and-2008-11-20.html | old man and fuck and movie]] &quot;old man and fuck and movie&quot;:http://acsitzar.0lx.net/news-old-man-and-2008-11-20.html [webmap|http://faquafav.is-the-boss.com/sitemap.htm] [[http://faquafav.is-the-boss.com/sitemap.htm webmap]] [http://faquafav.is-the-boss.com/sitemap.htm|webmap] ((http://faquafav.is-the-boss.com/sitemap.htm webmap)) [[http://faquafav.is-the-boss.com/sitemap.htm | webmap]] &quot;webmap&quot;:http://faquafav.is-the-boss.com/sitemap.htm [longview when you sleep video|http://spfortne.qsh.eu/20090104-longview-when.html] [[http://spfortne.qsh.eu/20090104-longview-when.html longview when you sleep video]] [http://spfortne.qsh.eu/20090104-longview-when.html|longview when you sleep video] ((http://spfortne.qsh.eu/20090104-longview-when.html longview when you sleep video)) [[http://spfortne.qsh.eu/20090104-longview-when.html | longview when you sleep video]] &quot;longview when you sleep video&quot;:http://spfortne.qsh.eu/20090104-longview-when.html [michael jordan highlight video|http://zelgetgo.0lx.net/new1682.htm] [[http://zelgetgo.0lx.net/new1682.htm michael jordan highlight video]] [http://zelgetgo.0lx.net/new1682.htm|michael jordan highlight video] ((http://zelgetgo.0lx.net/new1682.htm michael jordan highlight video)) [[http://zelgetgo.0lx.net/new1682.htm | michael jordan highlight video]] &quot;michael jordan highlight video&quot;:http://zelgetgo.0lx.net/new1682.htm 
{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>33880</id>
      <timestamp>2009-01-08T20:37:45Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>Undo revision 33871 by [[Special:Contributions/OudomZeldr|OudomZeldr]] ([[User talk:OudomZeldr|Talk]])</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>33883</id>
      <timestamp>2009-01-08T23:40:21Z</timestamp>
      <contributor>
        <username>OudomZeldr</username>
        <id>1841</id>
      </contributor>
      <comment>http://tacataca.strefa.pl/comment-507.htm</comment>
      <text xml:space="preserve">[adaily movie|http://tacataca.strefa.pl/comment-507.htm] [[http://tacataca.strefa.pl/comment-507.htm adaily movie]] [http://tacataca.strefa.pl/comment-507.htm|adaily movie] ((http://tacataca.strefa.pl/comment-507.htm adaily movie)) [[http://tacataca.strefa.pl/comment-507.htm | adaily movie]] &quot;adaily movie&quot;:http://tacataca.strefa.pl/comment-507.htm [indian movie dvd caps|http://chifire.strefa.pl/news-856.html] [[http://chifire.strefa.pl/news-856.html indian movie dvd caps]] [http://chifire.strefa.pl/news-856.html|indian movie dvd caps] ((http://chifire.strefa.pl/news-856.html indian movie dvd caps)) [[http://chifire.strefa.pl/news-856.html | indian movie dvd caps]] &quot;indian movie dvd caps&quot;:http://chifire.strefa.pl/news-856.html [links|http://caraines.qsh.eu/sitemap.htm] [[http://caraines.qsh.eu/sitemap.htm links]] [http://caraines.qsh.eu/sitemap.htm|links] ((http://caraines.qsh.eu/sitemap.htm links)) [[http://caraines.qsh.eu/sitemap.htm | links]] &quot;links&quot;:http://caraines.qsh.eu/sitemap.htm [army of darkness video|http://roladarh.strefa.pl/news-767.html] [[http://roladarh.strefa.pl/news-767.html army of darkness video]] [http://roladarh.strefa.pl/news-767.html|army of darkness video] ((http://roladarh.strefa.pl/news-767.html army of darkness video)) [[http://roladarh.strefa.pl/news-767.html | army of darkness video]] &quot;army of darkness video&quot;:http://roladarh.strefa.pl/news-767.html [poker video game download|http://fispruil.qsh.eu/news638.html] [[http://fispruil.qsh.eu/news638.html poker video game download]] [http://fispruil.qsh.eu/news638.html|poker video game download] ((http://fispruil.qsh.eu/news638.html poker video game download)) [[http://fispruil.qsh.eu/news638.html | poker video game download]] &quot;poker video game download&quot;:http://fispruil.qsh.eu/news638.html 
{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>33893</id>
      <timestamp>2009-01-09T07:05:54Z</timestamp>
      <contributor>
        <username>OudomZeldr</username>
        <id>1841</id>
      </contributor>
      <comment>http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html</comment>
      <text xml:space="preserve">[pearl harbor the movie characters|http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html] [[http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html pearl harbor the movie characters]] [http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html|pearl harbor the movie characters] ((http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html pearl harbor the movie characters)) [[http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html | pearl harbor the movie characters]] &quot;pearl harbor the movie characters&quot;:http://acsitzar.0lx.net/news-pearl-harbor-the-2008-11-15.html [reveals serials|http://brc4tdro.is-the-boss.com/page217.html] [[http://brc4tdro.is-the-boss.com/page217.html reveals serials]] [http://brc4tdro.is-the-boss.com/page217.html|reveals serials] ((http://brc4tdro.is-the-boss.com/page217.html reveals serials)) [[http://brc4tdro.is-the-boss.com/page217.html | reveals serials]] &quot;reveals serials&quot;:http://brc4tdro.is-the-boss.com/page217.html [azamovies|http://sakonze.qsh.eu/lirols-329.html] [[http://sakonze.qsh.eu/lirols-329.html azamovies]] [http://sakonze.qsh.eu/lirols-329.html|azamovies] ((http://sakonze.qsh.eu/lirols-329.html azamovies)) [[http://sakonze.qsh.eu/lirols-329.html | azamovies]] &quot;azamovies&quot;:http://sakonze.qsh.eu/lirols-329.html [ski movie music|http://betheres.qsh.eu/comment-597.htm] [[http://betheres.qsh.eu/comment-597.htm ski movie music]] [http://betheres.qsh.eu/comment-597.htm|ski movie music] ((http://betheres.qsh.eu/comment-597.htm ski movie music)) [[http://betheres.qsh.eu/comment-597.htm | ski movie music]] &quot;ski movie music&quot;:http://betheres.qsh.eu/comment-597.htm [spoungebob squarepants the movie|http://vihencbr.0lx.net/spoungebob-squarepants.html] [[http://vihencbr.0lx.net/spoungebob-squarepants.html spoungebob squarepants the movie]] [http://vihencbr.0lx.net/spoungebob-squarepants.html|spoungebob squarepants the movie] ((http://vihencbr.0lx.net/spoungebob-squarepants.html spoungebob squarepants the movie)) [[http://vihencbr.0lx.net/spoungebob-squarepants.html | spoungebob squarepants the movie]] &quot;spoungebob squarepants the movie&quot;:http://vihencbr.0lx.net/spoungebob-squarepants.html 
[adaily movie|http://tacataca.strefa.pl/comment-507.htm] [[http://tacataca.strefa.pl/comment-507.htm adaily movie]] [http://tacataca.strefa.pl/comment-507.htm|adaily movie] ((http://tacataca.strefa.pl/comment-507.htm adaily movie)) [[http://tacataca.strefa.pl/comment-507.htm | adaily movie]] &quot;adaily movie&quot;:http://tacataca.strefa.pl/comment-507.htm [indian movie dvd caps|http://chifire.strefa.pl/news-856.html] [[http://chifire.strefa.pl/news-856.html indian movie dvd caps]] [http://chifire.strefa.pl/news-856.html|indian movie dvd caps] ((http://chifire.strefa.pl/news-856.html indian movie dvd caps)) [[http://chifire.strefa.pl/news-856.html | indian movie dvd caps]] &quot;indian movie dvd caps&quot;:http://chifire.strefa.pl/news-856.html [links|http://caraines.qsh.eu/sitemap.htm] [[http://caraines.qsh.eu/sitemap.htm links]] [http://caraines.qsh.eu/sitemap.htm|links] ((http://caraines.qsh.eu/sitemap.htm links)) [[http://caraines.qsh.eu/sitemap.htm | links]] &quot;links&quot;:http://caraines.qsh.eu/sitemap.htm [army of darkness video|http://roladarh.strefa.pl/news-767.html] [[http://roladarh.strefa.pl/news-767.html army of darkness video]] [http://roladarh.strefa.pl/news-767.html|army of darkness video] ((http://roladarh.strefa.pl/news-767.html army of darkness video)) [[http://roladarh.strefa.pl/news-767.html | army of darkness video]] &quot;army of darkness video&quot;:http://roladarh.strefa.pl/news-767.html [poker video game download|http://fispruil.qsh.eu/news638.html] [[http://fispruil.qsh.eu/news638.html poker video game download]] [http://fispruil.qsh.eu/news638.html|poker video game download] ((http://fispruil.qsh.eu/news638.html poker video game download)) [[http://fispruil.qsh.eu/news638.html | poker video game download]] &quot;poker video game download&quot;:http://fispruil.qsh.eu/news638.html 
{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
    <revision>
      <id>33902</id>
      <timestamp>2009-01-09T07:27:40Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

It works like this:

:Person A writes: what does ''foo'' do?
:Person B answers: it does what it says above. [[:Category:Legacy Delete Reply When You See It]].
:''Person A reads the reply, sees the tag, and removes both question and answer from the page.''

No-one other than Person A should act on this Tag. '''However:'''
* if it's been ''weeks''... I mean ''weeks''... 
* anybody who sees it might decide to change the tag to [[:Category:Legacy Refactor Me]].</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Enum</title>
    <id>732</id>
    <revision>
      <id>2108</id>
      <timestamp>2003-05-24T16:17:16Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting important enumerations in [[Legacy:UnrealScript|UnrealScript]].

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category
* To add a page to this category: add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Enum]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: go there to find other categories.
[[Category:Legacy Category|Enum]]</text>
    </revision>
    <revision>
      <id>2109</id>
      <timestamp>2002-08-19T17:52:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
On the offchance that other Enum pages spring up.

[[Wiki:PleasePleaseDontCategorizeEveryPageOnWiki]]

'''Tarquin:''' yes, Mych :D
[[Category:Legacy Category|Enum]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy FAQ</title>
    <id>727</id>
    <revision>
      <id>2096</id>
      <timestamp>2007-11-23T20:20:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all FAQ pages (Frequently Asked Questions). On Unreal Wiki, we have FAQs for mapping, coding, and modeling, as well as FAQ pages for specific mods. The list of all FAQ pages is shown below.

* To add a page to this category: Add the text &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;FAQ]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|FAQ]]</text>
    </revision>
    <revision>
      <id>2097</id>
      <timestamp>2007-11-23T19:02:24Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://uk.geocities.com/sex828boy/gay-penis-cum-teen.htm]gay penis cum teen[/url]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Feedback</title>
    <id>735</id>
    <revision>
      <id>2114</id>
      <timestamp>2008-02-08T08:25:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of pages that are bug lists or wishlists. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Feedback]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Feedback]]</text>
    </revision>
    <revision>
      <id>2115</id>
      <timestamp>2008-02-08T02:56:02Z</timestamp>
      <contributor>
        <ip>Cpe-75-80-151-39.san.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
fgsfds</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Game</title>
    <id>840</id>
    <revision>
      <id>2349</id>
      <timestamp>2004-01-27T10:33:33Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages about games. 

* Members of this category are listed below
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Game]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

==Related Topics ==
* [[Legacy:Unreal Engine Versions|Unreal Engine versions]] &amp;ndash; a list of most games based on the Unreal Engine
[[Category:Legacy Category|Game]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Image Needed</title>
    <id>1525</id>
    <revision>
      <id>3812</id>
      <timestamp>2006-10-22T08:30:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]] for places where an appropriate image should be inserted.

==How to use==

If you think, a particular document could use an image to help explain things, add this tag. Example:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Wiki Markup'''''
| style=&quot;text-align: center&quot; |'''''Result'''''
|-
|&lt;code&gt;Set the bPeanutButter variable to enable peanuts. ''Maybe add an image to show the difference?'' [[Image&lt;/code&gt;&lt;code&gt; Needed]]&lt;/code&gt;
|Set the bPeanutButter variable to enable peanuts. ''Maybe add an image to show the difference?'' [[ImageNeeded
|]]
|}

==How to help==

Look at the pages listed below in the search results. If you know the Wiki already has an image for the specific purpose, or if you can upload such an image, remove the tag and replace it with the [[Legacy:Wiki Markup|Wiki Markup]] for the image.

Pages that no longer have the tag will be automatically removed from the list below.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Journal</title>
    <id>826</id>
    <revision>
      <id>2319</id>
      <timestamp>2007-11-23T20:19:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of '''Developer Journals''' created and maintained by Unreal Wiki contributors.

If you'd like to share some of your more personal experiences with Unreal-engine mapping or modding, feel free to create a journal.  It's customary to keep it in a datestamped format.

'''Please don't put things of general interest exclusively in your journal.'''  A developer journal is not meant to be a dump for valuable content that should rather be added elsewhere on the Wiki.  If you find something out in your development work which might be of general interest, please add it to wherever it belongs to on the Wiki &amp;ndash; not just your personal journal.

See also [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]]

==Creating a Journal==

To set up your developer journal:
# Create a subpage of your [[:Category:Legacy Personal Page|personal page]].  It's custom to name that subpage &quot;Developer Journal&quot; as in [[Legacy:Mychaeel/Developer Journal|Mychaeel/Developer Journal]].
# 
Add the following code to the bottom of your new journal page to make it show up in the listing at the bottom of this page:
  &lt;code&gt;----&lt;/code&gt;
  &lt;code&gt;[[Category&lt;/code&gt; &lt;code&gt;Journal]]&lt;/code&gt;



==Existing Journals==

All existing developer journals are listed below.

This page itself belongs to [[:Category:Legacy Category]]:  Go there to find other categories.
[[Category:Legacy Category|Journal]]</text>
    </revision>
    <revision>
      <id>2320</id>
      <timestamp>2007-11-23T19:06:34Z</timestamp>
      <contributor>
        <ip>201.36.214.86</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://ca.geocities.com/black237hotel/lhnez/tramadol-order-by-4pm.htm]tramadol order by 4pm[/url]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Journal/Discussion</title>
    <id>833</id>
    <revision>
      <id>2335</id>
      <timestamp>2003-09-21T09:16:42Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
Receveived via email:

{{innerbox| I was browsing the Category Journal page today looking for something interesting to read and I realised that there is no way to know anything about the type of work each developer is currently working on.  I believe it would be a good idea to introduce a one line description after each name, to save people having to look through then all until they find something that interests them. 

}}

'''Tarquin:''' Hmmm.... Not sure how we'd do this. We could encourage people to give their devJours interesting names. but then they'd need a new page each time they started a new topic. We could encourage a commented list, but we've just changed over to a reverse index... 

'''PlanetPhillip:'''  Just a simple description (max 10 words) after their name.  E.G.  Marlowe199...working on weapons mods and HUD.

'''Tarquin:''' But the problem is where to put it &amp;ndash; the list we have now is auto-generated from the page tags

'''PlanetPhillip:'''  OK, I don't fully understand how the whole Wiki thing works (Wish I did) but where it says their name (Not the Link) could they just change it to include a VERY brief description?

'''Tarquin:''' What you're seeing is search result listings embedded into the page. What you requested would have been possible before we switched over &amp;ndash; but nobody had thought of it.

'''PlanetPhillip:'''  WOW, that's so spooky.  I was just wondering what would happen if two users were trying to edit the same page.  OK, I have just logged in and created an Developer Journal.  I wanted to do this anyway so I was not wasting resources!  I simply named it &quot;Developer_Journal_Simple_Weapons_mods&quot;.  Have a look and tell me what you think.  If you don't like it just let me know and I will change it.  I wasn't sure how long the name could be and I had already wasted time trying to get it working.   (I'm a n00b)  PS I changed my name from marlowe1999 to PlanetPhillip.

'''MythOpus:''' Actually, You sohuld make your Dev. Journal a subpage of your Personal Page. Ex.. wiki.beyondunreal.com/wiki/PlanetPhilip/Developer_Journal

'''PlanetPhillip:''' I think I did.  Thanks for the welcome MythOpus.

'''Tarquin:''' Myth, you can't have more than 1 level of subpage.

'''MythOpus:''' I thought he named his dev journal as wiki.beyond..../wiki/Developer_Journal_Simple_Weapons_mods :| what do you mean by more than one level ?

'''Foxpaw:''' I think he thought you meant something like PlanetPhilip/Developer Journal/Simple Weapons Mods.

'''MythOpus:''' Aww man, Now I'm confused... lol aww well... Phillip, whatever your doing... its great :tup:

'''El Muerte TDS:''' You could add a extra field to the user info containing the description and look that up while you generate the dev journal page. But it's quite an ungly hack. Maybe it's better to create some kind of &quot;description&quot; field for all pages with a small description about the page. This could be used for every &quot;magic&quot; page and for search results.</text>
    </revision>
    <revision>
      <id>2336</id>
      <timestamp>2003-09-21T04:23:02Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>lol</comment>
      <text xml:space="preserve">{{Legacy category}}
Receveived via email:

{{innerbox| I was browsing the Category Journal page today looking for something interesting to read and I realised that there is no way to know anything about the type of work each developer is currently working on.  I believe it would be a good idea to introduce a one line description after each name, to save people having to look through then all until they find something that interests them. 

}}

'''Tarquin:''' Hmmm.... Not sure how we'd do this. We could encourage people to give their devJours interesting names. but then they'd need a new page each time they started a new topic. We could encourage a commented list, but we've just changed over to a reverse index... 

'''PlanetPhillip:'''  Just a simple description (max 10 words) after their name.  E.G.  Marlowe199...working on weapons mods and HUD.

'''Tarquin:''' But the problem is where to put it &amp;ndash; the list we have now is auto-generated from the page tags

'''PlanetPhillip:'''  OK, I don't fully understand how the whole Wiki thing works (Wish I did) but where it says their name (Not the Link) could they just change it to include a VERY brief description?

'''Tarquin:''' What you're seeing is search result listings embedded into the page. What you requested would have been possible before we switched over &amp;ndash; but nobody had thought of it.

'''PlanetPhillip:'''  WOW, that's so spooky.  I was just wondering what would happen if two users were trying to edit the same page.  OK, I have just logged in and created an Developer Journal.  I wanted to do this anyway so I was not wasting resources!  I simply named it &quot;Developer_Journal_Simple_Weapons_mods&quot;.  Have a look and tell me what you think.  If you don't like it just let me know and I will change it.  I wasn't sure how long the name could be and I had already wasted time trying to get it working.   (I'm a n00b)  PS I changed my name from marlowe1999 to PlanetPhillip.

'''MythOpus:''' Actually, You sohuld make your Dev. Journal a subpage of your Personal Page. Ex.. wiki.beyondunreal.com/wiki/PlanetPhilip/Developer_Journal

'''PlanetPhillip:''' I think I did.  Thanks for the welcome MythOpus.

'''Tarquin:''' Myth, you can't have more than 1 level of subpage.

'''MythOpus:''' I thought he named his dev journal as wiki.beyond..../wiki/Developer_Journal_Simple_Weapons_mods :| what do you mean by more than one level ?

'''Foxpaw:''' I think he thought you meant something like PlanetPhilip/Developer Journal/Simple Weapons Mods.

'''MythOpus:''' Aww man, Now I'm confused... lol aww well... Phillip, whatever your doing... its great :tup:</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Link Me</title>
    <id>1698</id>
    <revision>
      <id>4194</id>
      <timestamp>2005-12-17T22:02:22Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]]

The person who left this tag wants to link to another wiki page but can't remember the name.

==Example==

Someone might have written something like:

: There's a great example of using this actor somewhere on the wiki, but I can't remember the page name... [[:Category:Legacy Link Me]].

If you know the page name, add it and remove the request for help.

==Help!==

This tag page is part of [[:Category:Legacy To Do]]. If you have a moment to spare, you might like to tackle some of these.</text>
    </revision>
    <revision>
      <id>4195</id>
      <timestamp>2003-04-03T14:34:31Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]]

The person who left this tag wants to link to another wiki page but can't remember the name :(

==Example==

Someone might have written something like:

: ... there's a great example of using this actor somewhere on the wiki, but I can't remember the page name ... [[:Category:Legacy Link Me]].

If you know the page name, add it and remove the request for help. :)

==Help!==

This tag page is part of [[:Category:Legacy To Do]]. If you have a moment to spare, you might like to tackle some of these.
[[Category:Legacy Link Me|Link Me]]
[[Category:Legacy To Do|Link Me]]</text>
    </revision>
    <revision>
      <id>4196</id>
      <timestamp>2003-05-25T11:20:47Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]]

The person who left this tag wants to link to another wiki page but can't remember the name.

==Example==

Someone might have written something like:

: There's a great example of using this actor somewhere on the wiki, but I can't remember the page name... [[:Category:Legacy Link Me]].

If you know the page name, add it and remove the request for help.

==Help!==

This tag page is part of [[:Category:Legacy To Do]]. If you have a moment to spare, you might like to tackle some of these.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Mapping</title>
    <id>798</id>
    <revision>
      <id>2258</id>
      <timestamp>2007-11-23T20:18:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of pages that deal with the mapping aspect of Unreal-engine editing. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Mapping]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Mapping]]</text>
    </revision>
    <revision>
      <id>2259</id>
      <timestamp>2007-11-23T19:09:43Z</timestamp>
      <contributor>
        <ip>B2.ca.1343.static.theplanet.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://uk.geocities.com/free798gay/teen-male-naturist.htm]teen male naturist[/url]</text>
    </revision>
    <revision>
      <id>28643</id>
      <timestamp>2008-05-17T23:19:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Mapping articles]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of pages that deal with the mapping aspect of Unreal-engine editing. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Mapping]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Mapping]]
[[Category:Mapping articles| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Mapping/Lighting</title>
    <id>893</id>
    <revision>
      <id>2467</id>
      <timestamp>2006-01-18T18:13:46Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>This is a test page. And no, only this page would show up as a link to a more specific list.</comment>
      <text xml:space="preserve">{{Legacy category}}
This page is so far only a test to see if tags like [[:Category:Legacy Mapping/Lighting]] will still show up in the list on [[:Category:Legacy Mapping]] from the tag.

And no this tag would make the page only list under the subtopic category page. But it could still be good because the that subtopic category page (this one) still shows up in the list on the main topic category page. So once these subtopic category pages are created and pages tagged accordingly, that list on the main topic category page will be shorter and pose links to more specific lists of pages.
[[Category:Legacy Mapping/Lighting|Mapping/Lighting]]
[[Category:Legacy Mapping|Mapping/Lighting]]</text>
    </revision>
    <revision>
      <id>2468</id>
      <timestamp>2006-01-18T17:53:40Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>This page is a test. And YES the tag would put the page in both lists.</comment>
      <text xml:space="preserve">{{Legacy category}}
This page is so far only a test to see if tags like [[:Category:Legacy Mapping/Lighting]] will still show up in the list on [[:Category:Legacy Mapping]] from the tag.

And YES! It does!
[[Category:Legacy Mapping/Lighting|Mapping/Lighting]]
[[Category:Legacy Mapping|Mapping/Lighting]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Modeling</title>
    <id>782</id>
    <revision>
      <id>2222</id>
      <timestamp>2008-02-14T23:35:32Z</timestamp>
      <contributor>
        <ip>69-11-86-35.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
Anything and everything in this category deals with the Modeling aspect of Unreal development.  This includes tutorials and articles covering all 3 types of modeling: Player modeling, weapon modeling, and static mesh modeling. (Note we're using the US spelling of 'modeling', with one 'l'.)

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Modeling]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Modeling]]</text>
    </revision>
    <revision>
      <id>2223</id>
      <timestamp>2008-02-14T22:10:44Z</timestamp>
      <contributor>
        <ip>Dsl88-244-13102.ttnet.net.tr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;

&lt;!&amp;ndash; saved from url=(0014)about:internet &amp;ndash;&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta name=&quot;generator&quot; content=&quot;Web Page Maker V2&quot;&gt;

&lt;/head&gt;

&lt;style type=&quot;text/css&quot;&gt;

/*----------Text Styles----------*/

.ws6 {font-size: 8px;}

.ws7 {font-size: 9.3px;}

.ws8 {font-size: 11px;}

.ws9 {font-size: 12px;}

.ws10 {font-size: 13px;}

.ws11 {font-size: 15px;}

.ws12 {font-size: 16px;}

.ws14 {font-size: 19px;}

.ws16 {font-size: 21px;}

.ws18 {font-size: 24px;}

.ws20 {font-size: 27px;}

.ws22 {font-size: 29px;}

.ws24 {font-size: 32px;}

.ws26 {font-size: 35px;}

.ws28 {font-size: 37px;}

.ws36 {font-size: 48px;}

.ws48 {font-size: 64px;}

.ws72 {font-size: 96px;}

.wpmd {font-size: 13px;font-family: 'Arial';font-style: normal;font-weight: normal;}

/*----------Para Styles----------*/

DIV,UL,OL /* Left */

{
 margin-top: 0px;
 margin-bottom: 0px;

}
&lt;/style&gt;

&lt;body background=&quot;http://img179.imageshack.us/img179/9726/bbbbbbbtm7.jpg&quot;&gt;

&lt;/body&gt;

&lt;/html&gt;</text>
    </revision>
    <revision>
      <id>28644</id>
      <timestamp>2008-05-17T23:22:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Modeling articles]]</comment>
      <text xml:space="preserve">{{Legacy category}}
Anything and everything in this category deals with the Modeling aspect of Unreal development.  This includes tutorials and articles covering all 3 types of modeling: Player modeling, weapon modeling, and static mesh modeling. (Note we're using the US spelling of 'modeling', with one 'l'.)

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Modeling]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Modeling]]
[[Category:Modeling articles| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Personal Page</title>
    <id>729</id>
    <revision>
      <id>2101</id>
      <timestamp>2007-11-23T20:19:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of the '''Personal Pages''' of all Unreal Wiki contributors.

Every contributor to the Unreal Wiki is entitled to a personal page.  It's not important how large your contribution is; questions, comments and housekeeping tasks can be as valuable as creating all-new pages.

You're free to use your personal page as you wish, but we encourage that you keep it somewhat related to your Unreal-engine work.  Your personal page on the Unreal Wiki is meant to represent you as an Unreal Wiki contributor and as a member of the Unreal-engine editing and modding community.

==Creating a Personal Page==

To set up your personal page:
# Create a Wiki page with your nickname (the name you have [[Legacy:Log In|logged in]] with). To do this simply click on your user name on the Users Online section in the footer while viewing any page. Then click on the &quot;Edit text of this page&quot; link. This will open the edit page for your new personal page.
# 
Add the following code to the bottom of your new page to tag it as a personal page:

&lt;code&gt;----&lt;/code&gt;&lt;br /&gt;&lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Personal Page]]&lt;/code&gt;



==Existing Personal Pages==

All existing personal pages are listed below.

This page itself belongs to [[:Category:Legacy Category]]:  Go there to find other categories.

	
[[Category:Legacy Category|Personal Page]]</text>
    </revision>
    <revision>
      <id>2102</id>
      <timestamp>2007-11-23T19:03:02Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://ca.geocities.com/vegas359and/pnacc/tramadol-more-addicting-than-vicodin.htm]tramadol more addicting than vicodin[/url]</text>
    </revision>
    <revision>
      <id>42494</id>
      <timestamp>2010-01-22T08:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Creating a Personal Page */ added warning about obsolete instructions</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of the '''Personal Pages''' of all Unreal Wiki contributors.

Every contributor to the Unreal Wiki is entitled to a personal page.  It's not important how large your contribution is; questions, comments and housekeeping tasks can be as valuable as creating all-new pages.

You're free to use your personal page as you wish, but we encourage that you keep it somewhat related to your Unreal-engine work.  Your personal page on the Unreal Wiki is meant to represent you as an Unreal Wiki contributor and as a member of the Unreal-engine editing and modding community.

==Creating a Personal Page==
{{ambox|text='''Remember:''' This content was [[Unreal Wiki:MediaWiki conversion|imported from the old UnrealWiki]].&lt;br/&gt;''To create your [[Special:MyPage|user page]], ignore the instructions below and just click on your user name in the top right corner.''}}
To set up your personal page:
# Create a Wiki page with your nickname (the name you have [[Legacy:Log In|logged in]] with). To do this simply click on your user name on the Users Online section in the footer while viewing any page. Then click on the &quot;Edit text of this page&quot; link. This will open the edit page for your new personal page.
# Add the following code to the bottom of your new page to tag it as a personal page:
 ----
 &lt;nowiki&gt;[[Category Personal Page]]&lt;/nowiki&gt;

==Existing Personal Pages==

All existing personal pages are listed below.

This page itself belongs to [[:Category:Legacy Category]]:  Go there to find other categories.

	
[[Category:Legacy Category|Personal Page]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Rant</title>
    <id>728</id>
    <revision>
      <id>2098</id>
      <timestamp>2005-10-22T19:20:50Z</timestamp>
      <contributor>
        <ip>Ip68-6-139-146.sd.sd.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
Various regular Wiki contributors have expressed their (very personal, very subjective) views on the world (and especially the Unreal part of it) in rants scattered all over the Wiki.  

* [[Legacy:Captain Kewl/Mod PR|Captain Kewl/Mod PR]] &amp;ndash; Elitist snob, me.
* [[Legacy:EntropicLqd/EntropicOnFatherhood|EntropicLqd/EntropicOnFatherhood]] &amp;ndash; You want children?  Think twice.
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people ''like'' your mod.
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Why many mod ideas are doomed in the moment they're made public, and how to prevent that.
* [[Legacy:Piglet/Finishing Things|Piglet/Finishing things]]  &amp;ndash; About making 'things' that you can actually finish
* [[Legacy:Tarquin/Mumblings|Tarquin/Mumblings]] &amp;ndash; Mumblings on the Wiki and other stuff.
* [[Legacy:Tarquin/Perl|Tarquin/Perl]] &amp;ndash; Tarquin's take on Perl. Watch him making progress as he continuously wraps his mind more and more around that crazy language. (It's perhaps also a journal, maybe I should move it there &amp;ndash; Tarquin)
* [[Legacy:Tarquin/Rants|Tarquin/Rants]] &amp;ndash; More mumblings on the Wiki and other stuff, and the direction this whole project takes. '''Warning:''' Tarquin writes rants under the influence of whatever happens to be passing (usually low blood sugar), and while they are a good exposition of his (alleged) cavalier attitude and so forth, they do not necessarily express his current opinion.
* [[Legacy:Will/Skill|Will/Skill]] &amp;ndash; General whining about higher-level UT players are obsessed with skill
* [[Legacy:Wormbo/Rants|Wormbo/Rants]] &amp;ndash; A place Wormbo uses irregularly to get rid of his &quot;aggressions&quot; when dealing with coding related problems
* [[Legacy:RegularX/Rants|RegularX/Rants]] &amp;ndash; on mod making, beta testing and dealing with the general public

If you wish to add a rant to this list, feel free.  

This page is also a '''Category page''', which means you can find all the rants clicking the title above. This performs a search on the phrase &quot;Category Rant&quot;. To make a page appear in these results, just add &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Rant]]&lt;/code&gt; at the bottom of it.

----

[[:Category:Legacy Category]] &amp;ndash; this page is itself a member of the category of all categories ;)

	
[[Category:Legacy Category|Rant]]</text>
    </revision>
    <revision>
      <id>2099</id>
      <timestamp>2005-07-17T08:03:30Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
Various regular Wiki contributors have expressed their (very personal, very subjective) views on the world (and especially the Unreal part of it) in rants scattered all over the Wiki.  

* [[Legacy:Captain Kewl/Mod PR|Captain Kewl/Mod PR]] &amp;ndash; Elitist snob, me.
* [[Legacy:EntropicLqd/EntropicOnFatherhood|EntropicLqd/EntropicOnFatherhood]] &amp;ndash; You want children?  Think twice.
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people ''like'' your mod.
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Why many mod ideas are doomed in the moment they're made public, and how to prevent that.
* [[Legacy:Piglet/Finishing Things|Piglet/Finishing things]]  &amp;ndash; About making 'things' that you can actually finish
* [[Legacy:Tarquin/Mumblings|Tarquin/Mumblings]] &amp;ndash; Mumblings on the Wiki and other stuff.
* [[Legacy:Tarquin/Perl|Tarquin/Perl]] &amp;ndash; Tarquin's take on Perl. Watch him making progress as he continuously wraps his mind more and more around that crazy language. (It's perhaps also a journal, maybe I should move it there &amp;ndash; Tarquin)
* [[Legacy:Tarquin/Rants|Tarquin/Rants]] &amp;ndash; More mumblings on the Wiki and other stuff, and the direction this whole project takes. '''Warning:''' Tarquin writes rants under the influence of whatever happens to be passing (usually low blood sugar), and while they are a good exposition of his (alleged) cavalier attitude and so forth, they do not necessarily express his current opinion.
* [[Legacy:Will/Skill|Will/Skill]] &amp;ndash; General whining about higher-level UT players are obsessed with skill
* [[Legacy:Wormbo/Rants|Wormbo/Rants]] &amp;ndash; A place Wormbo uses irregularly to get rid of his &quot;aggressions&quot; when dealing with coding related problems
* [[Legacy:RegularX/Rants|RegularX/Rants]] &amp;ndash; on mod making, beta testing and dealing with the general public

If you wish to add a rant to this list, feel free.  

This page is also a '''Category page''', which means you can find all the rants clicking the title above. This performs a search on the phrase &quot;Category Rant&quot;. To make a page appear in these results, just add &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Rant]]&lt;/code&gt; at the bottom of it.

----

[[:Category:Legacy Category]] &amp;ndash; this page is itself a member of the category of all categories ;)
[[Category:Legacy Category|Rant]]</text>
    </revision>
    <revision>
      <id>2100</id>
      <timestamp>2005-10-22T19:20:45Z</timestamp>
      <contributor>
        <ip>Ip68-5-251-144.oc.oc.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
Various regular Wiki contributors have expressed their (very personal, very subjective) views on the world (and especially the Unreal part of it) in rants scattered all over the Wiki.  

* [[Legacy:Captain Kewl/Mod PR|Captain Kewl/Mod PR]] &amp;ndash; Elitist snob, me.
* [[Legacy:EntropicLqd/EntropicOnFatherhood|EntropicLqd/EntropicOnFatherhood]] &amp;ndash; You want children?  Think twice.
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people ''like'' your mod.
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Why many mod ideas are doomed in the moment they're made public, and how to prevent that.
* [[Legacy:Piglet/Finishing Things|Piglet/Finishing things]]  &amp;ndash; About making 'things' that you can actually finish
* [[Legacy:Tarquin/Mumblings|Tarquin/Mumblings]] &amp;ndash; Mumblings on the Wiki and other stuff.
* [[Legacy:Tarquin/Perl|Tarquin/Perl]] &amp;ndash; Tarquin's take on Perl. Watch him making progress as he continuously wraps his mind more and more around that crazy language. (It's perhaps also a journal, maybe I should move it there &amp;ndash; Tarquin)
* [[Legacy:Tarquin/Rants|Tarquin/Rants]] &amp;ndash; More mumblings on the Wiki and other stuff, and the direction this whole project takes. '''Warning:''' Tarquin writes rants under the influence of whatever happens to be passing (usually low blood sugar), and while they are a good exposition of his (alleged) cavalier attitude and so forth, they do not necessarily express his current opinion.
* [[Legacy:Will/Skill|Will/Skill]] &amp;ndash; General whining about higher-level UT players are obsessed with skill
* [[Legacy:Wormbo/Rants|Wormbo/Rants]] &amp;ndash; A place Wormbo uses irregularly to get rid of his &quot;aggressions&quot; when dealing with coding related problems
* [[Legacy:RegularX/Rants|RegularX/Rants]] &amp;ndash; on mod making, beta testing and dealing with the general public

If you wish to add a rant to this list, feel free.  

This page is also a '''Category page''', which means you can find all the rants clicking the title above. This performs a search on the phrase &quot;Category Rant&quot;. To make a page appear in these results, just add &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Rant]]&lt;/code&gt; at the bottom of it.

----

[[:Category:Legacy Category]] &amp;ndash; this page is itself a member of the category of all categories ;)

	&lt;div id=&quot;wikitikitavi&quot; style=&quot;overflow:auto; height: 1px; &quot;&gt;

	[[http://WTHP1.coolhost.biz] [WTHPD1]]

	[http://WTHP2.coolhost.biz  WTHPD2]

	[[http://WTHP3.coolhost.biz | WTHPD3]]

	[http://WTHP4.coolhost.biz | WTHPD4]

	[WTHPD5 | http://WTHP5.coolhost.biz]

	[[http://WTHP6.coolhost.biz WTHPD6]]

	&lt;/div&gt;
[[Category:Legacy Category|Rant]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Refactor Me</title>
    <id>2620</id>
    <revision>
      <id>6250</id>
      <timestamp>2005-11-23T22:10:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>nah, this page should show up in category to do</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

This tag marks Thread mode discussion which should be refactored (ie rewritten) into document mode.

==Example==

People often post questions and answers on Wiki pages. It's called &quot;Thread Mode&quot;, because it runs like a discussion thread in a forum board. It might look like this:

: Person A: what is a ''foo''?
: Person B: it's a type of ''bar''. It's used for making widgets go &quot;whee!&quot;.
: ''someone else adds the [[:Category:Legacy Refactor Me]] tag''

This can be rewritten into statements. This is called &quot;Document mode&quot;. It might look like:

: A ''foo'' is a a type of ''bar'' which is used for making widgets go &quot;whee!&quot;

Why should we do this? It makes text easier to read. It makes it easier to find information. People who read the page weeks after A and B had this conversation just want the information, they're not looking for a soap opera. And it's what Wiki is about :)

==Help!==

This tag page is part of [[:Category:Legacy To Do]]. If you have a moment to spare, you might like to tackle some of these.

# do a search for instances of this tag by clicking the page title above
# choose one of the pages you get in the results
# find the tag on the page
# refactor the discussion 
# remove the tag

You can find places which need to be tagged, too.
[[Category:Legacy To Do|Refactor Me]]</text>
    </revision>
    <revision>
      <id>6251</id>
      <timestamp>2003-08-08T07:44:50Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

This tag marks Thread mode discussion which should be refactored (ie rewritten) into document mode.

==Example==

People often post questions and answers on Wiki pages. It's called &quot;Thread Mode&quot;, because it runs like a discussion thread in a forum board. It might look like this:

: Person A: what is a ''foo''?
: Person B: it's a type of ''bar''. It's used for making widgets go &quot;whee!&quot;.
: ''someone else adds the [[:Category:Legacy Refactor Me]] tag''

This can be rewritten into statements. This is called &quot;Document mode&quot;. It might look like:

: A ''foo'' is a a type of ''bar'' which is used for making widgets go &quot;whee!&quot;

'''CorDharel:''' I have a question about this: Should I write this sentence in the content of the page or in the comments section?

Why should we do this? It makes text easier to read. It makes it easier to find information. People who read the page weeks after A and B had this conversation just want the information, they're not looking for a soap opera. And it's what Wiki is about :)

==Help!==

This tag page is part of [[:Category:Legacy To Do]]. If you have a moment to spare, you might like to tackle some of these.

# do a search for instances of this tag by clicking the page title above
# choose one of the pages you get in the results
# find the tag on the page
# refactor the discussion 
# remove the tag

You can find places which need to be tagged, too.
[[Category:Legacy To Do|Refactor Me]]</text>
    </revision>
    <revision>
      <id>6252</id>
      <timestamp>2005-11-23T20:53:36Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
A [[Legacy:WikiTag|WikiTag]].

This tag marks Thread mode discussion which should be refactored (ie rewritten) into document mode.

==Example==

People often post questions and answers on Wiki pages. It's called &quot;Thread Mode&quot;, because it runs like a discussion thread in a forum board. It might look like this:

: Person A: what is a ''foo''?
: Person B: it's a type of ''bar''. It's used for making widgets go &quot;whee!&quot;.
: ''someone else adds the [[:Category:Legacy Refactor Me]] tag''

This can be rewritten into statements. This is called &quot;Document mode&quot;. It might look like:

: A ''foo'' is a a type of ''bar'' which is used for making widgets go &quot;whee!&quot;

Why should we do this? It makes text easier to read. It makes it easier to find information. People who read the page weeks after A and B had this conversation just want the information, they're not looking for a soap opera. And it's what Wiki is about :)

==Help!==

This tag page is part of [[:Category:Legacy To Do]]. If you have a moment to spare, you might like to tackle some of these.

# do a search for instances of this tag by clicking the page title above
# choose one of the pages you get in the results
# find the tag on the page
# refactor the discussion 
# remove the tag

You can find places which need to be tagged, too.</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Screenshots</title>
    <id>852</id>
    <revision>
      <id>2375</id>
      <timestamp>2006-04-07T08:01:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This category is for wiki pages that have screenshots of people's works for the [[Legacy:Unreal Engine|Unreal Engine]] and its games.
* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Screenshots]]&lt;/code&gt; to that page so it will show on searches.

This category is useful when people want to see other people's work and don't want to find it.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Screenshots]]</text>
    </revision>
    <revision>
      <id>2376</id>
      <timestamp>2004-02-03T14:17:27Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This category is for wiki pages that have screenshots of people's works for the [[Legacy:Unreal Engine|Unreal Engine]] and its games.
* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Screenshots]]&lt;/code&gt; to that page so it will show on searches.

This category is useful when people want to see other people's work and don't want to find it.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

[[Category:Legacy Category|Screenshots]]
[[Category:Legacy Category|Screenshots]]</text>
    </revision>
    <revision>
      <id>2377</id>
      <timestamp>2006-04-06T21:06:24Z</timestamp>
      <contributor>
        <ip>Cdn-ce-sj-t2-05.sanjose.ca.sanfran.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{Legacy category}}
This category is for wiki pages that have screenshots of people's works for the [[Legacy:Unreal Engine|Unreal Engine]] and its games.
* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Screenshots]]&lt;/code&gt; to that page so it will show on searches.

This category is useful when people want to see other people's work and don't want to find it.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

----

[[:Category:Legacy Category]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Category|Screenshots]]
[[Category:Legacy Category|Screenshots]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Struct</title>
    <id>927</id>
    <revision>
      <id>2532</id>
      <timestamp>2008-02-12T12:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created category page</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all pages documenting important structs in [[Legacy:UnrealScript|UnrealScript]].

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category
* To add a page to this category: add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Struct]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: go there to find other categories.
[[Category:Legacy Category|Struct]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Technical Review</title>
    <id>901</id>
    <revision>
      <id>2486</id>
      <timestamp>2005-06-26T12:11:23Z</timestamp>
      <contributor>
        <ip>222-153-115-167.jetstream.xtra.co.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
==What is a technical review?==

Instead of a review discussing how fun or playable a mod is a technical review will only focus on the technical aspects of the mod.

Some things of interest can be:
* User Interface
* Control Scheme
* Bugs\Issue, like:
** log spam
** craches
** other glitches
* Gameplay design
* Code design (if possible)

...

Depending on the type of mod not all things of interest might apply.

==How to write a technical review==

First of all, a review should ''not'' be a flamebait. You should point out both the good and the bad things in a mod. But always keep it on a technical level, it's not about if you like the maps they included or the textures they used.

If you are writing your first technical review you might want to read the existing reviews to see what their focus was.

==Discussion==

'''El Muerte:''' SolidSnake made the first technical review and I think it's something good that can be done on the wiki. These reviews can give people some insight in things other developers think that a mod team did right or wrong. The above info might need to be improved.

'''Solid Snake:''' From my perspective technical reviews should only really focus as to how a mod was made rather than what the mod has made. Thus if you wish to write one, looking at their coding style is important, looking at the way they designed the structure of the mod is important (Do they have lots of redundant textures, models, packages?), looking at the way the game works (If task A is critical to a player, is it difficult/easy for him/her to do it?) and finally looking at the 'professional' aspect of the mod in that do the content actually match each other (do the textures look uniform ... an obvious one is where some textures are photos and others are hand drawn). A technical review isn't going to award a mod 9 out of 10 or whatever, but it simply discusses what you think they could do better, or was done wrong and what was done right. It is different compared to a normal review as such, and people who read this are going to be people who are interested in how mods are made. Your average Joe Schmo isn't going to care about these reviews...

[[Category:Legacy Category|Technical Review]]</text>
    </revision>
    <revision>
      <id>2487</id>
      <timestamp>2005-06-25T15:43:26Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
==What is a technical review?==

Instead of a review discussing how fun or playable a mod is a technical review will only focus on the technical aspects of the mod.

Some things of interest can be:
* User Interface
* Control Scheme
* Bugs\Issue, like:
** log spam
** craches
** other glitches
* Gameplay design
* Code design (if possible)

...

Depending on the type of mod not all things of interest might apply.

==How to write a technical review==

First of all, a review should ''not'' be a flamebait. You should point out both the good and the bad things in a mod. But always keep it on a technical level, it's not about if you like the maps they included or the textures they used.

If you are writing your first technical review you might want to read the existing reviews to see what their focus was.

==Discussion==

'''El Muerte:''' SolidSnake made the first technical review and I think it's something good that can be done on the wiki. These reviews can give people some insight in things other developers think that a mod team did right or wrong. The above info might need to be improved.

[[Category:Legacy Category|Technical Review]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Text Mangling Alert</title>
    <id>3226</id>
    <revision>
      <id>8392</id>
      <timestamp>2007-02-07T13:34:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
Hi. You've been sent here because your edits have mangled existing text in a wiki page. We know that this was not intentional, but please read the following to see if you can avoid it happening in future:

* Don't paste in text from Microsoft Word.
** &quot;Smart quotes&quot; look like ugly HTML entities in wiki source text
* Please use the &quot;typewriter apostrophe&quot; (the one used in [[Legacy:Wiki Markup|Wiki Markup]] for ''italic'' and '''bold''' text) for 'single quotes' and in words like &quot;don't&quot;, because other, typograhpically &quot;correct&quot; apostrophe or single quote characters look like ugly HTML entities in wiki source text

==Related Topics==
* [[Legacy:New Contributors Quick Start|New Contributors Quick Start]]
* [[Legacy:WikiTag|WikiTag]]</text>
    </revision>
    <revision>
      <id>8393</id>
      <timestamp>2006-04-04T08:48:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
Hi. You've been sent here because your edits have mangled existing text in a wiki page. We know that this was not intentional, but please read the following to see if you can avoid it happening in future:

* Don't paste in text from Microsoft Word.
** &quot;Smart quotes&quot; look like ugly HTML entities in wiki source text
*

==Related Topics==
* [[Legacy:New Contributors Quick Start|New Contributors Quick Start]]
* [[Legacy:WikiTag|WikiTag]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy To Do</title>
    <id>731</id>
    <revision>
      <id>2106</id>
      <timestamp>2006-09-24T03:15:31Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Please discuss, Bob.</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for pages that need work &amp;ndash; if you have spare time on the Wiki, why not see if you can improve any of these pages? :D (go on. the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] will be your friend ;) )

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; To Do]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

Of course ''all'' wiki pages can be added to. This is for pages that have filled up nicely and need some Wiki Gardening.

If you spot pages that you think need a rewrite but don't have the time or the expertise, or you want a group opinion, add &quot;Category To Do&quot; to the bottom. (obviously, all wiki pages can be spruced up from time to time...)

'''Bob_The_Beheader:''' Is there any general agreement on how large of a change should be made to a page before asking for a group opinion? Im working on some refactoring of the [[Legacy:Bot Pathing|Bot Pathing]] page into the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial, and some of it is a pretty heavy duty overhaul.

'''Tarquin:''' It all depends... if you don't mind people disagreeing with the changes and them being reverted, you can do what you like :) I would recommend caution for the bot pages though &amp;ndash; they have been the subject of SO MANY attempts at cleaning up...

'''SuperApe:''' Bob, we need to talk about those proposed changes.  I made a massive overhaul of the bot support pages and I wrote the Basic Bot Pathing Tutorial.  Propose the changes in the Discussion sections so that we can come to an agreement.  Like, what would you change anyway?

You can also add [[Legacy:WikiTag|WikiTags]], like &quot;[[:Category:Legacy Refactor Me]]&quot;.

==Related Topics==
* There's a laundry list of things you could do to help the Unreal Wiki on [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]. These range from simple stuff you can do in a couple of minutes, to major structural work. 
* To find pages that don't exist yet, but are requested by &quot;ghost links&quot;, see [[:Category:Legacy Wanted Pages]].
[[Category:Legacy Category|To Do]]
[[Category:Legacy Wanted Pages|To Do]]</text>
    </revision>
    <revision>
      <id>2107</id>
      <timestamp>2006-09-24T00:14:33Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for pages that need work &amp;ndash; if you have spare time on the Wiki, why not see if you can improve any of these pages? :D (go on. the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] will be your friend ;) )

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; To Do]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

Of course ''all'' wiki pages can be added to. This is for pages that have filled up nicely and need some Wiki Gardening.

If you spot pages that you think need a rewrite but don't have the time or the expertise, or you want a group opinion, add &quot;Category To Do&quot; to the bottom. (obviously, all wiki pages can be spruced up from time to time...)

'''Bob_The_Beheader:''' Is there any general agreement on how large of a change should be made to a page before asking for a group opinion? Im working on some refactoring of the [[Legacy:Bot Pathing|Bot Pathing]] page into the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial, and some of it is a pretty heavy duty overhaul.

'''Tarquin:''' It all depends... if you don't mind people disagreeing with the changes and them being reverted, you can do what you like :) I would recommend caution for the bot pages though &amp;ndash; they have been the subject of SO MANY attempts at cleaning up...

You can also add [[Legacy:WikiTag|WikiTags]], like &quot;[[:Category:Legacy Refactor Me]]&quot;.

==Related Topics==
* There's a laundry list of things you could do to help the Unreal Wiki on [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]. These range from simple stuff you can do in a couple of minutes, to major structural work. 
* To find pages that don't exist yet, but are requested by &quot;ghost links&quot;, see [[:Category:Legacy Wanted Pages]].
[[Category:Legacy Category|To Do]]
[[Category:Legacy Wanted Pages|To Do]]</text>
    </revision>
    <revision>
      <id>32386</id>
      <timestamp>2008-07-19T05:43:48Z</timestamp>
      <contributor>
        <username>C4treLdomd</username>
        <id>990</id>
      </contributor>
      <comment>caacelch</comment>
      <text xml:space="preserve">letolaz
{{Legacy category}}
This is the category page for pages that need work &amp;ndash; if you have spare time on the Wiki, why not see if you can improve any of these pages? :D (go on. the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] will be your friend ;) )

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; To Do]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

Of course ''all'' wiki pages can be added to. This is for pages that have filled up nicely and need some Wiki Gardening.

If you spot pages that you think need a rewrite but don't have the time or the expertise, or you want a group opinion, add &quot;Category To Do&quot; to the bottom. (obviously, all wiki pages can be spruced up from time to time...)

'''Bob_The_Beheader:''' Is there any general agreement on how large of a change should be made to a page before asking for a group opinion? Im working on some refactoring of the [[Legacy:Bot Pathing|Bot Pathing]] page into the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial, and some of it is a pretty heavy duty overhaul.

'''Tarquin:''' It all depends... if you don't mind people disagreeing with the changes and them being reverted, you can do what you like :) I would recommend caution for the bot pages though &amp;ndash; they have been the subject of SO MANY attempts at cleaning up...

'''SuperApe:''' Bob, we need to talk about those proposed changes.  I made a massive overhaul of the bot support pages and I wrote the Basic Bot Pathing Tutorial.  Propose the changes in the Discussion sections so that we can come to an agreement.  Like, what would you change anyway?

You can also add [[Legacy:WikiTag|WikiTags]], like &quot;[[:Category:Legacy Refactor Me]]&quot;.

==Related Topics==
* There's a laundry list of things you could do to help the Unreal Wiki on [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]. These range from simple stuff you can do in a couple of minutes, to major structural work. 
* To find pages that don't exist yet, but are requested by &quot;ghost links&quot;, see [[:Category:Legacy Wanted Pages]].
[[Category:Legacy Category|To Do]]
[[Category:Legacy Wanted Pages|To Do]]</text>
    </revision>
    <revision>
      <id>32393</id>
      <timestamp>2008-07-19T10:37:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>rvv</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for pages that need work &amp;ndash; if you have spare time on the Wiki, why not see if you can improve any of these pages? :D (go on. the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] will be your friend ;) )

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; To Do]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

Of course ''all'' wiki pages can be added to. This is for pages that have filled up nicely and need some Wiki Gardening.

If you spot pages that you think need a rewrite but don't have the time or the expertise, or you want a group opinion, add &quot;Category To Do&quot; to the bottom. (obviously, all wiki pages can be spruced up from time to time...)

'''Bob_The_Beheader:''' Is there any general agreement on how large of a change should be made to a page before asking for a group opinion? Im working on some refactoring of the [[Legacy:Bot Pathing|Bot Pathing]] page into the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial, and some of it is a pretty heavy duty overhaul.

'''Tarquin:''' It all depends... if you don't mind people disagreeing with the changes and them being reverted, you can do what you like :) I would recommend caution for the bot pages though &amp;ndash; they have been the subject of SO MANY attempts at cleaning up...

'''SuperApe:''' Bob, we need to talk about those proposed changes.  I made a massive overhaul of the bot support pages and I wrote the Basic Bot Pathing Tutorial.  Propose the changes in the Discussion sections so that we can come to an agreement.  Like, what would you change anyway?

You can also add [[Legacy:WikiTag|WikiTags]], like &quot;[[:Category:Legacy Refactor Me]]&quot;.

==Related Topics==
* There's a laundry list of things you could do to help the Unreal Wiki on [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]. These range from simple stuff you can do in a couple of minutes, to major structural work. 
* To find pages that don't exist yet, but are requested by &quot;ghost links&quot;, see [[:Category:Legacy Wanted Pages]].
[[Category:Legacy Category|To Do]]
[[Category:Legacy Wanted Pages|To Do]]</text>
    </revision>
    <revision>
      <id>32887</id>
      <timestamp>2008-08-12T17:23:12Z</timestamp>
      <contributor>
        <username>C4treLdomd</username>
        <id>990</id>
      </contributor>
      <comment>http://geraldinesboutique.com/about/media/2/news-346-20080622.html</comment>
      <text xml:space="preserve">[wind speed of a hurricane|http://geraldinesboutique.com/about/media/2/news-346-20080622.html] [[http://geraldinesboutique.com/about/media/2/news-346-20080622.html wind speed of a hurricane]] [http://geraldinesboutique.com/about/media/2/news-346-20080622.html|wind speed of a hurricane] ((http://geraldinesboutique.com/about/media/2/news-346-20080622.html wind speed of a hurricane)) [[http://geraldinesboutique.com/about/media/2/news-346-20080622.html | wind speed of a hurricane]] &quot;wind speed of a hurricane&quot;:http://geraldinesboutique.com/about/media/2/news-346-20080622.html [dad naked|http://geraldinesboutique.com/about/media/2/news-705-20080622.html] [[http://geraldinesboutique.com/about/media/2/news-705-20080622.html dad naked]] [http://geraldinesboutique.com/about/media/2/news-705-20080622.html|dad naked] ((http://geraldinesboutique.com/about/media/2/news-705-20080622.html dad naked)) [[http://geraldinesboutique.com/about/media/2/news-705-20080622.html | dad naked]] &quot;dad naked&quot;:http://geraldinesboutique.com/about/media/2/news-705-20080622.html [oak leaf|http://geraldinesboutique.com/about/media/2/news-852-20080614.html] [[http://geraldinesboutique.com/about/media/2/news-852-20080614.html oak leaf]] [http://geraldinesboutique.com/about/media/2/news-852-20080614.html|oak leaf] ((http://geraldinesboutique.com/about/media/2/news-852-20080614.html oak leaf)) [[http://geraldinesboutique.com/about/media/2/news-852-20080614.html | oak leaf]] &quot;oak leaf&quot;:http://geraldinesboutique.com/about/media/2/news-852-20080614.html [post-op transsexual|http://geraldinesboutique.com/about/media/2/news-1303-20080621.html] [[http://geraldinesboutique.com/about/media/2/news-1303-20080621.html post-op transsexual]] [http://geraldinesboutique.com/about/media/2/news-1303-20080621.html|post-op transsexual] ((http://geraldinesboutique.com/about/media/2/news-1303-20080621.html post-op transsexual)) [[http://geraldinesboutique.com/about/media/2/news-1303-20080621.html | post-op transsexual]] &quot;post-op transsexual&quot;:http://geraldinesboutique.com/about/media/2/news-1303-20080621.html [i love skateboarding video|http://geraldinesboutique.com/about/media/2/news-481-20080625.html] [[http://geraldinesboutique.com/about/media/2/news-481-20080625.html i love skateboarding video]] [http://geraldinesboutique.com/about/media/2/news-481-20080625.html|i love skateboarding video] ((http://geraldinesboutique.com/about/media/2/news-481-20080625.html i love skateboarding video)) [[http://geraldinesboutique.com/about/media/2/news-481-20080625.html | i love skateboarding video]] &quot;i love skateboarding video&quot;:http://geraldinesboutique.com/about/media/2/news-481-20080625.html 
{{Legacy category}}
This is the category page for pages that need work &amp;ndash; if you have spare time on the Wiki, why not see if you can improve any of these pages? :D (go on. the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] will be your friend ;) )

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; To Do]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

Of course ''all'' wiki pages can be added to. This is for pages that have filled up nicely and need some Wiki Gardening.

If you spot pages that you think need a rewrite but don't have the time or the expertise, or you want a group opinion, add &quot;Category To Do&quot; to the bottom. (obviously, all wiki pages can be spruced up from time to time...)

'''Bob_The_Beheader:''' Is there any general agreement on how large of a change should be made to a page before asking for a group opinion? Im working on some refactoring of the [[Legacy:Bot Pathing|Bot Pathing]] page into the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial, and some of it is a pretty heavy duty overhaul.

'''Tarquin:''' It all depends... if you don't mind people disagreeing with the changes and them being reverted, you can do what you like :) I would recommend caution for the bot pages though &amp;ndash; they have been the subject of SO MANY attempts at cleaning up...

'''SuperApe:''' Bob, we need to talk about those proposed changes.  I made a massive overhaul of the bot support pages and I wrote the Basic Bot Pathing Tutorial.  Propose the changes in the Discussion sections so that we can come to an agreement.  Like, what would you change anyway?

You can also add [[Legacy:WikiTag|WikiTags]], like &quot;[[:Category:Legacy Refactor Me]]&quot;.

==Related Topics==
* There's a laundry list of things you could do to help the Unreal Wiki on [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]. These range from simple stuff you can do in a couple of minutes, to major structural work. 
* To find pages that don't exist yet, but are requested by &quot;ghost links&quot;, see [[:Category:Legacy Wanted Pages]].
[[Category:Legacy Category|To Do]]
[[Category:Legacy Wanted Pages|To Do]]</text>
    </revision>
    <revision>
      <id>32889</id>
      <timestamp>2008-08-12T19:45:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Undo revision 32887 by [[Special:Contributions/C4treLdomd|C4treLdomd]] ([[User talk:C4treLdomd|Talk]])</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category page for pages that need work &amp;ndash; if you have spare time on the Wiki, why not see if you can improve any of these pages? :D (go on. the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] will be your friend ;) )

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; To Do]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

Of course ''all'' wiki pages can be added to. This is for pages that have filled up nicely and need some Wiki Gardening.

If you spot pages that you think need a rewrite but don't have the time or the expertise, or you want a group opinion, add &quot;Category To Do&quot; to the bottom. (obviously, all wiki pages can be spruced up from time to time...)

'''Bob_The_Beheader:''' Is there any general agreement on how large of a change should be made to a page before asking for a group opinion? Im working on some refactoring of the [[Legacy:Bot Pathing|Bot Pathing]] page into the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial, and some of it is a pretty heavy duty overhaul.

'''Tarquin:''' It all depends... if you don't mind people disagreeing with the changes and them being reverted, you can do what you like :) I would recommend caution for the bot pages though &amp;ndash; they have been the subject of SO MANY attempts at cleaning up...

'''SuperApe:''' Bob, we need to talk about those proposed changes.  I made a massive overhaul of the bot support pages and I wrote the Basic Bot Pathing Tutorial.  Propose the changes in the Discussion sections so that we can come to an agreement.  Like, what would you change anyway?

You can also add [[Legacy:WikiTag|WikiTags]], like &quot;[[:Category:Legacy Refactor Me]]&quot;.

==Related Topics==
* There's a laundry list of things you could do to help the Unreal Wiki on [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]. These range from simple stuff you can do in a couple of minutes, to major structural work. 
* To find pages that don't exist yet, but are requested by &quot;ghost links&quot;, see [[:Category:Legacy Wanted Pages]].
[[Category:Legacy Category|To Do]]
[[Category:Legacy Wanted Pages|To Do]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Toolchain</title>
    <id>921</id>
    <revision>
      <id>2522</id>
      <timestamp>2007-11-19T12:17:53Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This category is for pages explaining or enhancing the editing and build process.
[[Category:Legacy Category|Toolchain]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Troubleshooting</title>
    <id>837</id>
    <revision>
      <id>2343</id>
      <timestamp>2007-11-23T20:19:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
Stuck with something? Need a hand? This is the category page for all of the pages that have troubleshooting sections. You might also want to look at [[:Category:Legacy FAQ]]. If all fails, seek out the [[Legacy:Help Desk|Help Desk]].

* Pages in this category are listed below
* To add a page to this category: Add the text &lt;code&gt;[[Category &lt;/code&gt;&lt;code&gt;Troubleshooting]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.
[[Category:Legacy Category|Troubleshooting]]</text>
    </revision>
    <revision>
      <id>2344</id>
      <timestamp>2007-11-23T19:08:26Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
[url=http://uk.geocities.com/black639gay/gay-naked-teenage-boys.htm]gay naked teenage boys[/url]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Tutorial</title>
    <id>733</id>
    <revision>
      <id>2110</id>
      <timestamp>2007-11-23T20:19:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all tutorial pages. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Tutorial]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

	
[[Category:Legacy Category|Tutorial]]</text>
    </revision>
    <revision>
      <id>2111</id>
      <timestamp>2007-11-23T19:03:43Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
&lt;a href=&quot;http://uk.geocities.com/boys377free/gay-teen-boy-personal-homepage-webcam.htm&quot;&gt;gay teen boy personal homepage webcam&lt;/a&gt;</text>
    </revision>
    <revision>
      <id>28662</id>
      <timestamp>2008-05-20T11:02:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also linked to [[Category:Tutorials]]</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all tutorial pages. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Tutorial]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

	
[[Category:Legacy Category|Tutorial]]
[[Category:Tutorials| ]]</text>
    </revision>
    <revision>
      <id>35527</id>
      <timestamp>2009-10-24T18:57:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to mapping and programming tutorials categories</comment>
      <text xml:space="preserve">{{Legacy category}}
This is the category of all tutorial pages. 

* To find pages in this category: Click the page title above to generate a list of all the pages that belong to this category.
* To add a page to this category: Add the text &lt;code&gt;[[Category&lt;/code&gt;&lt;code&gt; Tutorial]]&lt;/code&gt; to that page so it will show on searches.

All category pages belong to [[:Category:Legacy Category]]: Go there to find other categories.

	
[[Category:Legacy Category|Tutorial]]
[[Category:Tutorials| ]]

[[Category:Mapping tutorials| ]]
[[Category:Programming tutorials| ]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy WOTgreal Macro</title>
    <id>906</id>
    <revision>
      <id>2497</id>
      <timestamp>2005-10-05T10:57:43Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{Legacy category}}
This is a list of macro files that can be used with [[Legacy:WOTgreal|WOTgreal]]

[[Category:Legacy Category|WOTgreal Macro]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy Wanted Pages</title>
    <id>3713</id>
    <revision>
      <id>9435</id>
      <timestamp>2005-01-14T02:35:28Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">{{Legacy category}}
#MAGIC WantedPages threshold=2

This page gives a list of pages the Wiki wants (ie pagenames that have links somewhere but no pages.)

Note it doesn't list:
* wanted subpages
* pagenames wanted by only one link

Please only create pages if you really have useful information to fill them with.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] this feature.</text>
    </revision>
    <revision>
      <id>9436</id>
      <timestamp>2005-01-13T23:25:30Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">{{Legacy category}}
*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy content</title>
    <id>205</id>
    <revision>
      <id>798</id>
      <timestamp>2008-03-11T15:03:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project copyright|license]]. The same goes for all...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Getting up to speed]]
* [[Legacy:Home Page]]</text>
    </revision>
    <revision>
      <id>800</id>
      <timestamp>2008-03-11T15:06:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]</text>
    </revision>
    <revision>
      <id>869</id>
      <timestamp>2008-03-14T22:06:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed old copyright link</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]</text>
    </revision>
    <revision>
      <id>998</id>
      <timestamp>2008-03-20T13:03:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Policies and guidelines]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]

[[Category:Policies and guidelines]]</text>
    </revision>
    <revision>
      <id>1002</id>
      <timestamp>2008-03-20T13:09:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Article categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]

[[Category:Article categories]]</text>
    </revision>
    <revision>
      <id>1012</id>
      <timestamp>2008-03-20T13:15:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1113</id>
      <timestamp>2008-03-25T12:49:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:Media categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages and images imported from the old Unreal Wiki and fall under its [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]

[[Category:Article categories| {{PAGENAME}}]]
[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1118</id>
      <timestamp>2008-03-25T16:04:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages imported from the old Unreal Wiki, which thus fall under the old [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here. Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1120</id>
      <timestamp>2008-03-25T16:08:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>no copy/move, please</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all category pages imported from the old Unreal Wiki, which thus fall under the old [[Legacy:Project Copyright|license]]. The same goes for all other imported pages, which can be found in the &lt;span class=&quot;plainlinks&quot;&gt;&quot;[{{fullurl:Special:Prefixindex|namespace=100}} Legacy]&quot;&lt;/span&gt; [[Project:Namespaces#Legacy|namespace]].

Please do not add any new pages to the categories listed here and do not copy or move these pages to another namespace.

==See also==
* [[Project:Helping out]]
* [[Legacy:Home Page]]

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Legacy images</title>
    <id>315</id>
    <revision>
      <id>1119</id>
      <timestamp>2008-03-25T16:07:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all images imported from the old Unreal Wiki, which thus fall under the old [[Legacy:Project Copyright|license]].  Consider creating new image...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all images imported from the old Unreal Wiki, which thus fall under the old [[Legacy:Project Copyright|license]].

Consider creating new images and uploading them under a Creative Commons license instead of reusing the old imported ones.

[[Category:Legacy content| {{PAGENAME}}]]
[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Level optimization</title>
    <id>24012</id>
    <revision>
      <id>33625</id>
      <timestamp>2008-12-13T17:48:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:categories|category]] contains all articles related to improving the performance of your maps.  [[Category:Mapping articles]]</comment>
      <text xml:space="preserve">This [[Project:categories|category]] contains all articles related to improving the performance of your maps.

[[Category:Mapping articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:License templates</title>
    <id>270</id>
    <revision>
      <id>1026</id>
      <timestamp>2008-03-20T13:27:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains [[Help:Templates|templates]] that provide license information about uploaded files.  [[Category:Template categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that provide license information about uploaded files.

[[Category:Template categories]]</text>
    </revision>
    <revision>
      <id>1027</id>
      <timestamp>2008-03-20T13:27:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that provide license information about uploaded files.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Mapping articles</title>
    <id>264</id>
    <revision>
      <id>990</id>
      <timestamp>2008-03-20T12:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all articles related to Unreal mapping.  [[Category:Article categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to Unreal mapping.

[[Category:Article categories]]</text>
    </revision>
    <revision>
      <id>1011</id>
      <timestamp>2008-03-20T13:15:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to Unreal mapping.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33533</id>
      <timestamp>2008-12-03T16:47:15Z</timestamp>
      <contributor>
        <username>NozelLiorc</username>
        <id>1689</id>
      </contributor>
      <comment>bocvira</comment>
      <text xml:space="preserve">sitvibocor
This [[Project:Categories|category]] contains all articles related to Unreal mapping.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33536</id>
      <timestamp>2008-12-04T12:29:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/NozelLiorc|NozelLiorc]] ([[User talk:NozelLiorc|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to Unreal mapping.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Mapping tools</title>
    <id>28966</id>
    <revision>
      <id>43280</id>
      <timestamp>2010-05-18T11:16:31Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>Created page with 'This [[Project:Categories|category]] contains articles that are related to mapping tools.  [[Category:Article categories| {{PAGENAME}}]]'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are related to mapping tools.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43285</id>
      <timestamp>2010-05-18T11:51:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>actually belongs in mapping articles category</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are related to mapping tools.

[[Category:Mapping articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Mapping tutorials</title>
    <id>255</id>
    <revision>
      <id>973</id>
      <timestamp>2008-03-20T08:49:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains a list of all mapping-related tutorials created on {{SITENAME}} so far.  [[Category:Tutorials]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all mapping-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials]]</text>
    </revision>
    <revision>
      <id>992</id>
      <timestamp>2008-03-20T12:56:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Mapping articles]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all mapping-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials]]
[[Category:Mapping articles]]</text>
    </revision>
    <revision>
      <id>1007</id>
      <timestamp>2008-03-20T13:13:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all mapping-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Mapping articles| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Media categories</title>
    <id>269</id>
    <revision>
      <id>1025</id>
      <timestamp>2008-03-20T13:24:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories#Meta_categories|meta category]] contains all images and other files uploaded to the {{SITENAME}}.  [[Category:Categories| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories#Meta_categories|meta category]] contains all images and other files uploaded to the {{SITENAME}}.

[[Category:Categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Message templates</title>
    <id>272</id>
    <revision>
      <id>1029</id>
      <timestamp>2008-03-20T13:29:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains [[Help:Templates|templates]] that display some kind of message when they are included on a page.  [[Category:Template categories| {{PAGENAME}}...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that display some kind of message when they are included on a page.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33569</id>
      <timestamp>2008-12-06T09:32:35Z</timestamp>
      <contributor>
        <username>DronlEtora</username>
        <id>1721</id>
      </contributor>
      <minor/>
      <comment>alortaze</comment>
      <text xml:space="preserve">sittrocpa
This [[Project:Categories|category]] contains [[Help:Templates|templates]] that display some kind of message when they are included on a page.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33574</id>
      <timestamp>2008-12-06T12:02:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/DronlEtora|DronlEtora]] ([[User talk:DronlEtora|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that display some kind of message when they are included on a page.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Missing legacy pages</title>
    <id>28620</id>
    <revision>
      <id>40476</id>
      <timestamp>2010-01-14T08:46:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with 'This [[Project:Categories|category]] contains all empty [[Project:Namespaces#Legacy|Legacy: pages]] marked with the {{[[Template:missing legacy class|]]}} template.  [[Category:S…'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all empty [[Project:Namespaces#Legacy|Legacy: pages]] marked with the {{[[Template:missing legacy class|missing legacy class]]}} template.

[[Category:Soft redirects| ]]
[[Category:Legacy content| ]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Modeling articles</title>
    <id>265</id>
    <revision>
      <id>991</id>
      <timestamp>2008-03-20T12:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all articles related to Unreal modeling.  [[Category:Article categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to Unreal modeling.

[[Category:Article categories]]</text>
    </revision>
    <revision>
      <id>1010</id>
      <timestamp>2008-03-20T13:15:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to Unreal modeling.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33810</id>
      <timestamp>2008-12-28T18:09:42Z</timestamp>
      <contributor>
        <username>TrzelAcelb</username>
        <id>1806</id>
      </contributor>
      <minor/>
      <comment>roacvitro</comment>
      <text xml:space="preserve">basladarv
This [[Project:Categories|category]] contains all articles related to Unreal modeling.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33811</id>
      <timestamp>2008-12-28T20:57:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/TrzelAcelb|TrzelAcelb]] ([[User talk:TrzelAcelb|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to Unreal modeling.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Modeling tutorials</title>
    <id>257</id>
    <revision>
      <id>975</id>
      <timestamp>2008-03-20T08:49:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains a list of all modeling-related tutorials created on {{SITENAME}} so far.  [[Category:Tutorials]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all modeling-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials]]</text>
    </revision>
    <revision>
      <id>993</id>
      <timestamp>2008-03-20T12:57:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Modeling articles]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all modeling-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials]]
[[Category:Modeling articles]]</text>
    </revision>
    <revision>
      <id>1006</id>
      <timestamp>2008-03-20T13:13:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all modeling-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Modeling articles| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32867</id>
      <timestamp>2008-08-07T11:39:55Z</timestamp>
      <contributor>
        <username>Tabu</username>
        <id>1134</id>
      </contributor>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all modeling-related tutorials created on {{SITENAME}} so far.

==UT2003/2004 Tutorials:==


==Unreal Tournament 3 Tutorials:==

===Static Mesh===
===Custom Character===
====Maya====
[http://forums.epicgames.com/showthread.php?t=615792 Text based Tutorial on Custom Rig, Animations, *.ini and UTFamilyInfo]

====3DSMax====
[http://www.ut40k.planetunreal.gamespy.com/unreal-Dateien/ut3tuts/UT3_Character_tutorial_1.htm A tutorial by Geo on getting you custom created character ingame.]

[http://www.immortalknightz.com/tutorials/UT3CustomChars/UT3CustCharTutorial01.html Great walkthrough on importing a character into the game]

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Modeling articles| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32868</id>
      <timestamp>2008-08-07T15:43:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>moving links to a separate article page</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all modeling-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Modeling articles| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:NBSP Classes</title>
    <id>24117</id>
    <revision>
      <id>34231</id>
      <timestamp>2009-04-01T20:04:08Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <comment>Created page with 'This is a category grouping all the classes composing NoBullShitPlus.'</comment>
      <text xml:space="preserve">This is a category grouping all the classes composing NoBullShitPlus.</text>
    </revision>
    <revision>
      <id>34249</id>
      <timestamp>2009-04-01T20:29:23Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This is a category grouping all the classes composing NoBullShitPlus.

[[Category:NBSP Documentation Project]]</text>
    </revision>
  </page>
  <page>
    <title>Category:NBSP Documentation Project</title>
    <id>24113</id>
    <revision>
      <id>34203</id>
      <timestamp>2009-04-01T11:47:44Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <comment>Created page with 'This category groups all pages that are related to the documentation of the NoBullShitPlus mod.'</comment>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.</text>
    </revision>
    <revision>
      <id>34241</id>
      <timestamp>2009-04-01T20:21:27Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.

See [[:Category:NBSP Documentation Project]].</text>
    </revision>
    <revision>
      <id>34242</id>
      <timestamp>2009-04-01T20:21:55Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.

See [[Category:NBSP Documentation Project]].</text>
    </revision>
    <revision>
      <id>34243</id>
      <timestamp>2009-04-01T20:22:56Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.</text>
    </revision>
    <revision>
      <id>34244</id>
      <timestamp>2009-04-01T20:23:40Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.

[[Category:NBSP Classes]]</text>
    </revision>
    <revision>
      <id>34246</id>
      <timestamp>2009-04-01T20:24:53Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.</text>
    </revision>
    <revision>
      <id>34247</id>
      <timestamp>2009-04-01T20:28:31Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.

[[Category:NBSP Classes]]</text>
    </revision>
    <revision>
      <id>34248</id>
      <timestamp>2009-04-01T20:28:54Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This category groups all pages that are related to the documentation of the NoBullShitPlus mod.</text>
    </revision>
  </page>
  <page>
    <title>Category:NBSP Forced109</title>
    <id>24125</id>
    <revision>
      <id>34272</id>
      <timestamp>2009-04-02T21:32:39Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <comment>Created page with 'This is a category grouping all NBSP classes in the NBSP_Forced109 package.'</comment>
      <text xml:space="preserve">This is a category grouping all NBSP classes in the NBSP_Forced109 package.</text>
    </revision>
    <revision>
      <id>34273</id>
      <timestamp>2009-04-02T21:33:18Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This is a category grouping all NBSP classes in the NBSP_Forced109 package.
[[Category:NBSP Documentation Project]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Native RTNP-specific classes</title>
    <id>5251</id>
    <revision>
      <id>12947</id>
      <timestamp>2008-05-17T16:10:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|RTNP|UE1|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native U1-specific classes</title>
    <id>5252</id>
    <revision>
      <id>12948</id>
      <timestamp>2008-05-17T16:10:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|U1|UE1|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native U2-specific classes</title>
    <id>5253</id>
    <revision>
      <id>12949</id>
      <timestamp>2008-05-17T16:11:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|U2|UE2|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native U2XMP-specific classes</title>
    <id>5254</id>
    <revision>
      <id>12950</id>
      <timestamp>2008-05-17T16:11:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|U2XMP|UE2|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UDK-specific classes</title>
    <id>24523</id>
    <revision>
      <id>35715</id>
      <timestamp>2009-11-06T18:47:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UDK|UE3|native=yes}}</text>
    </revision>
    <revision>
      <id>35716</id>
      <timestamp>2009-11-06T17:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category game classes|UDK|UE3|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UE1-specific classes</title>
    <id>5255</id>
    <revision>
      <id>12951</id>
      <timestamp>2008-05-17T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UE1|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UE2-specific classes</title>
    <id>5256</id>
    <revision>
      <id>12952</id>
      <timestamp>2008-05-17T16:11:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UE2|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UE2Runtime-specific classes</title>
    <id>5257</id>
    <revision>
      <id>12953</id>
      <timestamp>2008-05-17T16:10:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UE2Runtime|UE2|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UE3-specific classes</title>
    <id>5258</id>
    <revision>
      <id>12954</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UE3|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UT-specific classes</title>
    <id>5259</id>
    <revision>
      <id>12955</id>
      <timestamp>2008-05-17T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT|UE1|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UT2003-specific classes</title>
    <id>5260</id>
    <revision>
      <id>12956</id>
      <timestamp>2008-05-17T16:11:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT2003|UE2|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UT2004-specific classes</title>
    <id>5261</id>
    <revision>
      <id>12957</id>
      <timestamp>2008-05-17T16:11:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT2004|UE2|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native UT3-specific classes</title>
    <id>5262</id>
    <revision>
      <id>12958</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT3|UE3|native=yes}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Native classes</title>
    <id>5139</id>
    <revision>
      <id>12648</id>
      <timestamp>2008-05-16T15:37:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] is the root for all categories of [[native-only]] classes.  [[Category:Classes|  {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all categories of [[native-only]] classes.

[[Category:Classes|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Native classes by game</title>
    <id>5140</id>
    <revision>
      <id>12649</id>
      <timestamp>2008-05-16T15:37:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] groups [[native-only]] classes by game.  [[Category:Classes by game|  {{PAGENAME}}]] [[Category:Native classes| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] groups [[native-only]] classes by game.

[[Category:Classes by game|  {{PAGENAME}}]]
[[Category:Native classes| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Native code snippet</title>
    <id>29033</id>
    <revision>
      <id>43565</id>
      <timestamp>2010-07-01T12:02:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with 'This category contains articles that provide snippets of native [[wp:C++|]] code.  [[Category:Programming articles]]'</comment>
      <text xml:space="preserve">This category contains articles that provide snippets of native [[wp:C++|C++]] code.

[[Category:Programming articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Official applications</title>
    <id>29026</id>
    <revision>
      <id>43529</id>
      <timestamp>2010-06-24T03:47:38Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>Created page with 'This [[Project:Categories|category]] contains all kinds of programs that belong to [[wp:Epic Games|Epic Games]].  [[Category:Applications| {{PAGENAME}}]]'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all kinds of programs that belong to [[wp:Epic Games|Epic Games]].

[[Category:Applications| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:PD images</title>
    <id>276</id>
    <revision>
      <id>1034</id>
      <timestamp>2008-03-20T13:50:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains images in the [[Wikipedia:public domain|]].  [[Category:Media categories| {{PAGENAME}}]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains images in the [[Wikipedia:public domain|public domain]].

[[Category:Media categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Pages needing cleanup</title>
    <id>125</id>
    <revision>
      <id>366</id>
      <timestamp>2008-02-24T14:27:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] and its subcategories contain pages needing some kind of [[Project:Cleanup|cleanup]].  What exactly needs to be done is described on the page itself or...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] and its subcategories contain pages needing some kind of [[Project:Cleanup|cleanup]].

What exactly needs to be done is described on the page itself or its talk page. Please [[Project:Helping out|help out]] by [[Help:Editing pages|editing]] these pages accordingly.

[[Category:Helping out| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Pages needing images</title>
    <id>123</id>
    <revision>
      <id>364</id>
      <timestamp>2008-02-24T14:19:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains pages in need of [[Help:Images|images]].  If you have the required skills and knowledge about the specific topic, please [[Project:Helping out...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains pages in need of [[Help:Images|images]].

If you have the required skills and knowledge about the specific topic, please [[Project:Helping out|help out]] by creating appropriate images for these pages and remove the {{[[needs-images]]}} tag from them.

[[Category:Helping out| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Pages needing peer review</title>
    <id>122</id>
    <revision>
      <id>363</id>
      <timestamp>2008-02-24T14:19:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains pages where an editor requested input from the community.  If you have knowledge on the specific topic, please [[Project:Helping out|help out]...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains pages where an editor requested input from the community.

If you have knowledge on the specific topic, please [[Project:Helping out|help out]] by providing feedback on the listed page's [[Help:Talk pages|talk page]].

[[Category:Helping out| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Pages needing verification</title>
    <id>121</id>
    <revision>
      <id>362</id>
      <timestamp>2008-02-24T14:17:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains pages with unverified statements.  If you have knowledge on the specific topic, please [[Project:Helping out|help out]] by providing feedback ...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains pages with unverified statements.

If you have knowledge on the specific topic, please [[Project:Helping out|help out]] by providing feedback about the unverified statement on the listed page's [[Help:Talk pages|talk page]].

[[Category:Helping out| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Pages needing wikification</title>
    <id>124</id>
    <revision>
      <id>365</id>
      <timestamp>2008-02-24T14:20:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all pages that are not yet or only partially formatted using [[Help:Formatting|Wiki markup]].  Please [[Project:Helping out|help out]] by [[He...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages that are not yet or only partially formatted using [[Help:Formatting|Wiki markup]].

Please [[Project:Helping out|help out]] by [[Help:Editing pages|editing]] these pages to use proper Wiki markup and remove the {{[[Template:wikify|wikify]]}} tag from them after you're done.

[[Category:Pages needing cleanup| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Pages proposed for deletion</title>
    <id>114</id>
    <revision>
      <id>342</id>
      <timestamp>2008-02-21T17:31:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all pages that were proposed for deletion through one of the deletion tags.  == See also == * [[Help:Deleting a page]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages that were proposed for deletion through one of the deletion tags.

== See also ==
* [[Help:Deleting a page]]</text>
    </revision>
    <revision>
      <id>1001</id>
      <timestamp>2008-03-20T13:08:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Pages needing cleanup]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages that were proposed for [[Help:Deleting a page|deletion]] through one of the deletion tags.

[[Category:Pages needing cleanup]]</text>
    </revision>
    <revision>
      <id>1003</id>
      <timestamp>2008-03-20T13:10:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages that were proposed for [[Help:Deleting a page|deletion]] through one of the deletion tags.

[[Category:Pages needing cleanup| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Policies and guidelines</title>
    <id>130</id>
    <revision>
      <id>378</id>
      <timestamp>2008-02-24T14:38:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all pages related to Unreal Wiki policies and guidelines.</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages related to Unreal Wiki policies and guidelines.</text>
    </revision>
    <revision>
      <id>1000</id>
      <timestamp>2008-03-20T13:07:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to [[Category:Categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages related to Unreal Wiki policies and guidelines.

[[Category:Categories]]</text>
    </revision>
    <revision>
      <id>1018</id>
      <timestamp>2008-03-20T13:16:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all pages related to Unreal Wiki policies and guidelines.

[[Category:Categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Programming articles</title>
    <id>261</id>
    <revision>
      <id>985</id>
      <timestamp>2008-03-20T12:50:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all articles related to programming.  [[Category:Article categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to programming.

[[Category:Article categories]]</text>
    </revision>
    <revision>
      <id>1009</id>
      <timestamp>2008-03-20T13:15:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to programming.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33532</id>
      <timestamp>2008-12-03T15:08:49Z</timestamp>
      <contributor>
        <username>OrerpAsget</username>
        <id>1687</id>
      </contributor>
      <comment>boccna</comment>
      <text xml:space="preserve">ladron
This [[Project:Categories|category]] contains all articles related to programming.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33535</id>
      <timestamp>2008-12-04T12:29:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/OrerpAsget|OrerpAsget]] ([[User talk:OrerpAsget|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to programming.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Programming tutorials</title>
    <id>260</id>
    <revision>
      <id>982</id>
      <timestamp>2008-03-20T10:00:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains a list of all programming-related tutorials created on {{SITENAME}} so far.  [[Category:Tutorials]] [[Category:Programming articles]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all programming-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials]]
[[Category:Programming articles]]</text>
    </revision>
    <revision>
      <id>1005</id>
      <timestamp>2008-03-20T13:13:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all programming-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Programming articles| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11870</id>
      <timestamp>2008-05-12T18:19:41Z</timestamp>
      <contributor>
        <username>Computergod666</username>
        <id>513</id>
      </contributor>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all programming-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Programming articles| {{PAGENAME}}]]

computergod666: WHAT ON EARTH HAPPENED?!! The site switches engines and all the UT-related information is gone! Not sheerly out of curiosity, where do I go for it now?</text>
    </revision>
    <revision>
      <id>11871</id>
      <timestamp>2008-05-12T20:28:45Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all programming-related tutorials created on {{SITENAME}} so far.

[[Category:Tutorials| {{PAGENAME}}]]
[[Category:Programming articles| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Programming tutorials (UT3)</title>
    <id>29007</id>
    <revision>
      <id>43465</id>
      <timestamp>2010-06-13T08:17:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with 'This category contains tutorials specific made for the game [[Unreal Tournament 3]].  [[Category:Programming tutorials]]'</comment>
      <text xml:space="preserve">This category contains tutorials specific made for the game [[Unreal Tournament 3]].

[[Category:Programming tutorials]]</text>
    </revision>
  </page>
  <page>
    <title>Category:RTNP-specific classes</title>
    <id>5263</id>
    <revision>
      <id>12959</id>
      <timestamp>2008-05-17T16:10:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|RTNP|UE1}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:RTNP-specific enums</title>
    <id>5264</id>
    <revision>
      <id>12960</id>
      <timestamp>2008-05-17T16:10:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:RTNP-specific structs</title>
    <id>5265</id>
    <revision>
      <id>12961</id>
      <timestamp>2008-05-17T16:10:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|RTNP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Replication</title>
    <id>29050</id>
    <revision>
      <id>43595</id>
      <timestamp>2010-07-03T01:51:35Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>Created page with 'This [[Project:Categories|category]] contains all articles related to [[replication overview|replication]].  [[Category:Programming articles]]'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles related to [[replication overview|replication]].

[[Category:Programming articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Soft redirects</title>
    <id>24419</id>
    <revision>
      <id>35508</id>
      <timestamp>2009-10-24T15:14:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with 'This [[Project:Categories|category]] contains pages that link to external sites, such as the [[liandri:|Liandri Archives]], or to the [[Unreal Wiki:MediaWiki conversion|&quot;Legacy:&quot;…'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains pages that link to external sites, such as the [[liandri:|Liandri Archives]], or to the [[Unreal Wiki:MediaWiki conversion|&quot;Legacy:&quot; namespace]]. These pages are usually considered as article stubs that should be filled with actual content instead of (or in addition to) the link.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Structs</title>
    <id>5010</id>
    <revision>
      <id>11418</id>
      <timestamp>2008-04-20T14:01:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[struct]] categories.  Structs can be browsed by [[:Category:Interfaces by game|game]]. Custom structs do not hav...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] is the root for all [[UnrealScript]] [[struct]] categories.

Structs can be browsed by [[:Category:Interfaces by game|game]]. Custom structs do not have their own categories.

==See also==
* [[:Category:Enums]]

[[Category:Classes|  {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Stubs</title>
    <id>36</id>
    <revision>
      <id>85</id>
      <timestamp>2008-02-18T16:02:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created category page</comment>
      <text xml:space="preserve">This is the [[project:category|category]] of [[project:stub|stub articles]]. Please check the articles listed here and remove the stub tag from them if they have been expanded since the tag was originally added.</text>
    </revision>
    <revision>
      <id>89</id>
      <timestamp>2008-02-18T16:15:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>link should have been Project:Categories, not Project:Category</comment>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]]. Please check the articles listed here and remove the stub tag from them if they have been expanded since the tag was originally added.</text>
    </revision>
    <revision>
      <id>237</id>
      <timestamp>2008-02-18T22:39:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]]. Please check the articles listed here and remove the stub tag from them if they have been expanded since the tag was originally added.

[[Category:Helping Out]]</text>
    </revision>
    <revision>
      <id>261</id>
      <timestamp>2008-02-19T21:34:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]]. Please check the articles listed here and remove the stub tag from them if they have been expanded since the tag was originally added.

[[Category:Helping Out| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>269</id>
      <timestamp>2008-02-19T21:39:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]].

If you have knowledge on the topic, please [[Project:Helping Out|help out]] by [[Help:Editing pages|extending]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the stub tag from them.

[[Category:Helping Out| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>359</id>
      <timestamp>2008-02-24T14:14:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This is the [[Project:Categories|category]] of [[Project:Stub|stub articles]].

If you have knowledge on the topic, please [[Project:Helping out|help out]] by [[Help:Editing pages|extending]] these articles. Otherwise you can at least check the articles listed here and, if they have been expanded since the tag was originally added, remove the stub tag from them.

[[Category:Helping out| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ACTION PlayAnim (U2)</title>
    <id>20899</id>
    <revision>
      <id>28682</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ACTION_PlayAnim|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ACTION PlayAnim (UE2Runtime)</title>
    <id>20900</id>
    <revision>
      <id>28683</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ACTION_PlayAnim|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ACTION PlayAnim (UT2003)</title>
    <id>20901</id>
    <revision>
      <id>28684</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ACTION_PlayAnim|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ACTION PlayAnim (UT2004)</title>
    <id>20902</id>
    <revision>
      <id>28685</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ACTION_PlayAnim|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (U2)</title>
    <id>20929</id>
    <revision>
      <id>28712</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (U2XMP)</title>
    <id>20930</id>
    <revision>
      <id>28713</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|LicenseeController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (UDK)</title>
    <id>24537</id>
    <revision>
      <id>35743</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE3}}</text>
    </revision>
    <revision>
      <id>35744</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (UE2Runtime)</title>
    <id>20931</id>
    <revision>
      <id>28714</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (UT2003)</title>
    <id>20932</id>
    <revision>
      <id>28715</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (UT2004)</title>
    <id>20933</id>
    <revision>
      <id>28716</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIController (UT3)</title>
    <id>20934</id>
    <revision>
      <id>28717</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIController|Controller|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIScript (U2)</title>
    <id>20938</id>
    <revision>
      <id>28721</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIScript|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIScript (UE2Runtime)</title>
    <id>20939</id>
    <revision>
      <id>28722</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIScript|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIScript (UT2003)</title>
    <id>20940</id>
    <revision>
      <id>28723</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIScript|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AIScript (UT2004)</title>
    <id>20941</id>
    <revision>
      <id>28724</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AIScript|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASMDAmmo (RTNP)</title>
    <id>20999</id>
    <revision>
      <id>28782</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASMDAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASMDAmmo (U1)</title>
    <id>21000</id>
    <revision>
      <id>28783</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASMDAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASMDAmmo (UT)</title>
    <id>21001</id>
    <revision>
      <id>28784</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASMDAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASTurret (UT2004)</title>
    <id>21005</id>
    <revision>
      <id>28788</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASTurret|ASVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASTurret Base (UT2004)</title>
    <id>21006</id>
    <revision>
      <id>28789</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASTurret_Base|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASTurret Minigun Swivel (UT2004)</title>
    <id>21007</id>
    <revision>
      <id>28790</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASTurret_Minigun_Swivel|ASTurret_Base|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASVehicle (UT2004)</title>
    <id>21008</id>
    <revision>
      <id>28791</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASVehicle|Vehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASVehicle Sentinel (UT2004)</title>
    <id>21011</id>
    <revision>
      <id>28794</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASVehicle_Sentinel|ASTurret|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASVehicle SpaceFighter (UT2004)</title>
    <id>21012</id>
    <revision>
      <id>28795</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASVehicle_SpaceFighter|ASVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASVehicle SpaceFighter Human (UT2004)</title>
    <id>21013</id>
    <revision>
      <id>28796</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASVehicle_SpaceFighter_Human|ASVehicle_SpaceFighter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASVehicleFactory (UT2004)</title>
    <id>21009</id>
    <revision>
      <id>28792</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASVehicleFactory|SVehicleFactory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ASVehicleFactory Turret (UT2004)</title>
    <id>21010</id>
    <revision>
      <id>28793</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ASVehicleFactory_Turret|ASVehicleFactory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AccessControl (UT2003)</title>
    <id>20895</id>
    <revision>
      <id>28678</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AccessControl|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AccessControl (UT2004)</title>
    <id>20896</id>
    <revision>
      <id>28679</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AccessControl|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActionMessage (UT2003)</title>
    <id>20897</id>
    <revision>
      <id>28680</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActionMessage|CriticalEventPlus|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActionMessage (UT2004)</title>
    <id>20898</id>
    <revision>
      <id>28681</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActionMessage|CriticalEventPlus|UE2}}</text>
    </revision>
    <revision>
      <id>33526</id>
      <timestamp>2008-12-02T11:48:53Z</timestamp>
      <contributor>
        <username>VarolOrolv</username>
        <id>1678</id>
      </contributor>
      <comment>clividarac</comment>
      <text xml:space="preserve">delmontachil
{{category subclasses|ActionMessage|CriticalEventPlus|UE2}}</text>
    </revision>
    <revision>
      <id>33530</id>
      <timestamp>2008-12-03T10:52:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/VarolOrolv|VarolOrolv]] ([[User talk:VarolOrolv|Talk]]); changed back to last version by [[User:|]]</comment>
      <text xml:space="preserve">{{category subclasses|ActionMessage|CriticalEventPlus|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (RTNP)</title>
    <id>20903</id>
    <revision>
      <id>28686</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (U1)</title>
    <id>20904</id>
    <revision>
      <id>28687</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (U2)</title>
    <id>20905</id>
    <revision>
      <id>28688</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (U2XMP)</title>
    <id>20906</id>
    <revision>
      <id>28689</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UDK)</title>
    <id>24524</id>
    <revision>
      <id>35717</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35718</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UE2)</title>
    <id>28570</id>
    <revision>
      <id>40286</id>
      <timestamp>2009-11-18T16:25:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Actor|Object|UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UE2Runtime)</title>
    <id>20907</id>
    <revision>
      <id>28690</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UT)</title>
    <id>20908</id>
    <revision>
      <id>28691</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UT2003)</title>
    <id>20909</id>
    <revision>
      <id>28692</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UT2004)</title>
    <id>20910</id>
    <revision>
      <id>28693</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Actor (UT3)</title>
    <id>20911</id>
    <revision>
      <id>28694</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Actor|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorCollisionNotifier (U2)</title>
    <id>20912</id>
    <revision>
      <id>28695</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorCollisionNotifier|Force|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorCollisionNotifier (U2XMP)</title>
    <id>20913</id>
    <revision>
      <id>28696</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorCollisionNotifier|Force|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorComponent (UDK)</title>
    <id>24525</id>
    <revision>
      <id>35719</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorComponent|Component|UE3}}</text>
    </revision>
    <revision>
      <id>35720</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorComponent|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorComponent (UT3)</title>
    <id>20914</id>
    <revision>
      <id>28697</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorComponent|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactory (U2XMP)</title>
    <id>20915</id>
    <revision>
      <id>28698</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactory|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactory (UDK)</title>
    <id>24526</id>
    <revision>
      <id>35721</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactory|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35722</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactory|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactory (UT3)</title>
    <id>20916</id>
    <revision>
      <id>28699</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactory|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryAI (UDK)</title>
    <id>24527</id>
    <revision>
      <id>35723</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAI|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35724</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAI|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryAI (UT3)</title>
    <id>20917</id>
    <revision>
      <id>28700</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAI|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryAmbientSound (UDK)</title>
    <id>24528</id>
    <revision>
      <id>35725</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAmbientSound|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35726</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAmbientSound|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryAmbientSoundSimple (UDK)</title>
    <id>24529</id>
    <revision>
      <id>35727</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAmbientSoundSimple|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35728</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryAmbientSoundSimple|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryDynamicSM (UDK)</title>
    <id>24530</id>
    <revision>
      <id>35729</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryDynamicSM|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35730</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryDynamicSM|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryDynamicSM (UT3)</title>
    <id>20918</id>
    <revision>
      <id>28701</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryDynamicSM|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryFogVolumeConstantDensityInfo (UDK)</title>
    <id>24531</id>
    <revision>
      <id>35731</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryFogVolumeConstantDensityInfo|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35732</id>
      <timestamp>2009-11-06T17:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryFogVolumeConstantDensityInfo|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryRigidBody (UDK)</title>
    <id>24532</id>
    <revision>
      <id>35733</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryRigidBody|ActorFactoryDynamicSM|UE3}}</text>
    </revision>
    <revision>
      <id>35734</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryRigidBody|ActorFactoryDynamicSM|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryRigidBody (UT3)</title>
    <id>20919</id>
    <revision>
      <id>28702</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryRigidBody|ActorFactoryDynamicSM|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactorySkeletalMesh (UDK)</title>
    <id>24533</id>
    <revision>
      <id>35735</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactorySkeletalMesh|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35736</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactorySkeletalMesh|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactorySkeletalMesh (UT3)</title>
    <id>20920</id>
    <revision>
      <id>28703</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactorySkeletalMesh|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryStaticMesh (UDK)</title>
    <id>24534</id>
    <revision>
      <id>35737</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryStaticMesh|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35738</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryStaticMesh|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryStaticMesh (UT3)</title>
    <id>20921</id>
    <revision>
      <id>28704</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryStaticMesh|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryVehicle (UDK)</title>
    <id>24535</id>
    <revision>
      <id>35739</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryVehicle|ActorFactory|UE3}}</text>
    </revision>
    <revision>
      <id>35740</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ActorFactoryVehicle|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ActorFactoryVehicle (UT3)</title>
    <id>20922</id>
    <revision>
      <id>28705</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ActorFactoryVehicle|ActorFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AdditionalMapLists (UT3)</title>
    <id>20923</id>
    <revision>
      <id>28706</id>
      <timestamp>2008-05-18T15:24:34Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AdditionalMapLists|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Admin (UT3)</title>
    <id>20924</id>
    <revision>
      <id>28707</id>
      <timestamp>2008-05-18T15:24:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Admin|PlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AdminBase (UT2003)</title>
    <id>20925</id>
    <revision>
      <id>28708</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AdminBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AdminBase (UT2004)</title>
    <id>20926</id>
    <revision>
      <id>28709</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AdminBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AdminPanelBase (UT2004)</title>
    <id>20927</id>
    <revision>
      <id>28710</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AdminPanelBase|GUIPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AdvancedReachSpec (UDK)</title>
    <id>24536</id>
    <revision>
      <id>35741</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AdvancedReachSpec|ReachSpec|UE3}}</text>
    </revision>
    <revision>
      <id>35742</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AdvancedReachSpec|ReachSpec|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AdvancedReachSpec (UT3)</title>
    <id>20928</id>
    <revision>
      <id>28711</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AdvancedReachSpec|ReachSpec|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Aida (U2XMP)</title>
    <id>20935</id>
    <revision>
      <id>28718</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Aida|U2PawnAtlantis|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AimedAttachment (UT2003)</title>
    <id>20936</id>
    <revision>
      <id>28719</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AimedAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AimedAttachment (UT2004)</title>
    <id>20937</id>
    <revision>
      <id>28720</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AimedAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbientSound (U2)</title>
    <id>20942</id>
    <revision>
      <id>28725</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbientSound|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbientSound (U2XMP)</title>
    <id>20943</id>
    <revision>
      <id>28726</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbientSound|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbientSound (UDK)</title>
    <id>24538</id>
    <revision>
      <id>35745</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbientSound|Keypoint|UE3}}</text>
    </revision>
    <revision>
      <id>35746</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AmbientSound|Keypoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbientSound (UT3)</title>
    <id>20944</id>
    <revision>
      <id>28727</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbientSound|Keypoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbientSoundSimple (UDK)</title>
    <id>24539</id>
    <revision>
      <id>35747</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbientSoundSimple|AmbientSound|UE3}}</text>
    </revision>
    <revision>
      <id>35748</id>
      <timestamp>2009-11-06T17:54:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AmbientSoundSimple|AmbientSound|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbientSoundSimple (UT3)</title>
    <id>20945</id>
    <revision>
      <id>28728</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbientSoundSimple|AmbientSound|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbushPoint (U2)</title>
    <id>20946</id>
    <revision>
      <id>28729</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbushPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbushPoint (U2XMP)</title>
    <id>20947</id>
    <revision>
      <id>28730</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbushPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbushPoint (UE2Runtime)</title>
    <id>20948</id>
    <revision>
      <id>28731</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbushPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmbushPoint (UT)</title>
    <id>20949</id>
    <revision>
      <id>28732</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmbushPoint|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammo (RTNP)</title>
    <id>20950</id>
    <revision>
      <id>28733</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammo|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammo (U1)</title>
    <id>20951</id>
    <revision>
      <id>28734</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammo|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammo (U2XMP)</title>
    <id>20952</id>
    <revision>
      <id>28735</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammo|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammo (UT)</title>
    <id>20953</id>
    <revision>
      <id>28736</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammo|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammo (UT2003)</title>
    <id>20954</id>
    <revision>
      <id>28737</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammo|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammo (UT2004)</title>
    <id>20955</id>
    <revision>
      <id>28738</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammo|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AmmoPack (U2XMP)</title>
    <id>20958</id>
    <revision>
      <id>28741</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AmmoPack|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammunition (U2XMP)</title>
    <id>20959</id>
    <revision>
      <id>28742</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammunition|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammunition (UT2003)</title>
    <id>20960</id>
    <revision>
      <id>28743</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammunition|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ammunition (UT2004)</title>
    <id>20961</id>
    <revision>
      <id>28744</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ammunition|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimMetaData (UDK)</title>
    <id>24541</id>
    <revision>
      <id>35751</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimMetaData|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35752</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimMetaData|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimMetaData SkelControl (UDK)</title>
    <id>24542</id>
    <revision>
      <id>35753</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimMetaData_SkelControl|AnimMetaData|UE3}}</text>
    </revision>
    <revision>
      <id>35754</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimMetaData_SkelControl|AnimMetaData|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNode (UDK)</title>
    <id>24543</id>
    <revision>
      <id>35755</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNode|AnimObject|UE3}}</text>
    </revision>
    <revision>
      <id>35756</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNode|AnimObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNode (UT3)</title>
    <id>20965</id>
    <revision>
      <id>28748</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNode|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeAimOffset (UDK)</title>
    <id>24544</id>
    <revision>
      <id>35757</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeAimOffset|AnimNodeBlendBase|UE3}}</text>
    </revision>
    <revision>
      <id>35758</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeAimOffset|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeAimOffset (UT3)</title>
    <id>20966</id>
    <revision>
      <id>28749</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeAimOffset|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlend (UDK)</title>
    <id>24545</id>
    <revision>
      <id>35759</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlend|AnimNodeBlendBase|UE3}}</text>
    </revision>
    <revision>
      <id>35760</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlend|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlend (UT3)</title>
    <id>20967</id>
    <revision>
      <id>28750</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlend|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlendBase (UDK)</title>
    <id>24546</id>
    <revision>
      <id>35761</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendBase|AnimNode|UE3}}</text>
    </revision>
    <revision>
      <id>35762</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendBase|AnimNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlendBase (UT3)</title>
    <id>20968</id>
    <revision>
      <id>28751</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendBase|AnimNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlendList (UDK)</title>
    <id>24547</id>
    <revision>
      <id>35763</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendList|AnimNodeBlendBase|UE3}}</text>
    </revision>
    <revision>
      <id>35764</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendList|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlendList (UT3)</title>
    <id>20969</id>
    <revision>
      <id>28752</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendList|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlendPerBone (UDK)</title>
    <id>24548</id>
    <revision>
      <id>35765</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendPerBone|AnimNodeBlend|UE3}}</text>
    </revision>
    <revision>
      <id>35766</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendPerBone|AnimNodeBlend|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeBlendPerBone (UT3)</title>
    <id>20970</id>
    <revision>
      <id>28753</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeBlendPerBone|AnimNodeBlend|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeEditInfo (UDK)</title>
    <id>24549</id>
    <revision>
      <id>35767</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeEditInfo|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35768</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeEditInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeEditInfo (UT3)</title>
    <id>20971</id>
    <revision>
      <id>28754</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeEditInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeScalePlayRate (UDK)</title>
    <id>24550</id>
    <revision>
      <id>35769</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeScalePlayRate|AnimNodeBlendBase|UE3}}</text>
    </revision>
    <revision>
      <id>35770</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeScalePlayRate|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeScalePlayRate (UT3)</title>
    <id>20972</id>
    <revision>
      <id>28755</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeScalePlayRate|AnimNodeBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeSequence (UDK)</title>
    <id>24551</id>
    <revision>
      <id>35771</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeSequence|AnimNode|UE3}}</text>
    </revision>
    <revision>
      <id>35772</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeSequence|AnimNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeSequence (UT3)</title>
    <id>20973</id>
    <revision>
      <id>28756</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeSequence|AnimNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeSequenceBlendBase (UDK)</title>
    <id>24552</id>
    <revision>
      <id>35773</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeSequenceBlendBase|AnimNodeSequence|UE3}}</text>
    </revision>
    <revision>
      <id>35774</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNodeSequenceBlendBase|AnimNodeSequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNodeSequenceBlendBase (UT3)</title>
    <id>20974</id>
    <revision>
      <id>28757</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNodeSequenceBlendBase|AnimNodeSequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify (U2)</title>
    <id>20975</id>
    <revision>
      <id>28758</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify (UDK)</title>
    <id>24553</id>
    <revision>
      <id>35775</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35776</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify (UE2Runtime)</title>
    <id>20976</id>
    <revision>
      <id>28759</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify (UT2003)</title>
    <id>20977</id>
    <revision>
      <id>28760</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify (UT2004)</title>
    <id>20978</id>
    <revision>
      <id>28761</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify (UT3)</title>
    <id>20979</id>
    <revision>
      <id>28762</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify Scripted (U2)</title>
    <id>20980</id>
    <revision>
      <id>28763</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify Scripted (UDK)</title>
    <id>24554</id>
    <revision>
      <id>35777</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE3}}</text>
    </revision>
    <revision>
      <id>35778</id>
      <timestamp>2009-11-06T17:54:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify Scripted (UE2Runtime)</title>
    <id>20981</id>
    <revision>
      <id>28764</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify Scripted (UT2003)</title>
    <id>20982</id>
    <revision>
      <id>28765</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify Scripted (UT2004)</title>
    <id>20983</id>
    <revision>
      <id>28766</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimNotify Scripted (UT3)</title>
    <id>20984</id>
    <revision>
      <id>28767</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimNotify_Scripted|AnimNotify|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimObject (UDK)</title>
    <id>24555</id>
    <revision>
      <id>35779</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimObject|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35780</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimObject|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimSpriteEffect (RTNP)</title>
    <id>20985</id>
    <revision>
      <id>28768</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimSpriteEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimSpriteEffect (U1)</title>
    <id>20986</id>
    <revision>
      <id>28769</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimSpriteEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimSpriteEffect (UT)</title>
    <id>20987</id>
    <revision>
      <id>28770</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimSpriteEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimatedCamera (UT3)</title>
    <id>20962</id>
    <revision>
      <id>28745</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimatedCamera|Camera|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimationCompressionAlgorithm (UDK)</title>
    <id>24540</id>
    <revision>
      <id>35749</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimationCompressionAlgorithm|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35750</id>
      <timestamp>2009-11-06T17:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AnimationCompressionAlgorithm|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimationCompressionAlgorithm (UT3)</title>
    <id>20963</id>
    <revision>
      <id>28746</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimationCompressionAlgorithm|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnimationControllerInterf (U2XMP)</title>
    <id>20964</id>
    <revision>
      <id>28747</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnimationControllerInterf|LegendObjectComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AnnouncerVoice (UT2004)</title>
    <id>20988</id>
    <revision>
      <id>28771</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AnnouncerVoice|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Arena (U2XMP)</title>
    <id>20989</id>
    <revision>
      <id>28772</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Arena|U2Mutator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Arena (UT)</title>
    <id>20990</id>
    <revision>
      <id>28773</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Arena|Mutator|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Armor (U2)</title>
    <id>20991</id>
    <revision>
      <id>28774</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Armor|Powerups|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Armor (U2XMP)</title>
    <id>20992</id>
    <revision>
      <id>28775</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Armor|Powerups|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Artifact (U2)</title>
    <id>20993</id>
    <revision>
      <id>28776</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Artifact|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Artifact (U2XMP)</title>
    <id>20994</id>
    <revision>
      <id>28777</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Artifact|U2Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ArtifactAttachment (U2)</title>
    <id>20995</id>
    <revision>
      <id>28778</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ArtifactAttachment|InventoryAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ArtifactHolder (U2)</title>
    <id>20996</id>
    <revision>
      <id>28779</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ArtifactHolder|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ArtifactPickup (U2)</title>
    <id>20997</id>
    <revision>
      <id>28780</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ArtifactPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ArtifactPickup (U2XMP)</title>
    <id>20998</id>
    <revision>
      <id>28781</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ArtifactPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Assault (UT)</title>
    <id>21002</id>
    <revision>
      <id>28785</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Assault|TeamGamePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AssaultMuzFlash1st (UT2004)</title>
    <id>21003</id>
    <revision>
      <id>28786</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AssaultMuzFlash1st|MinigunMuzFlash1st|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AssaultRifle (U2)</title>
    <id>21004</id>
    <revision>
      <id>28787</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AssaultRifle|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AudioComponent (UDK)</title>
    <id>24556</id>
    <revision>
      <id>35781</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AudioComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35782</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|AudioComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AudioComponent (UT3)</title>
    <id>21014</id>
    <revision>
      <id>28797</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AudioComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AutoTurret (U2XMP)</title>
    <id>21015</id>
    <revision>
      <id>28798</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AutoTurret|ProximitySensor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AvoidMarker (U2)</title>
    <id>21016</id>
    <revision>
      <id>28799</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AvoidMarker|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AvoidMarker (UE2Runtime)</title>
    <id>21017</id>
    <revision>
      <id>28800</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AvoidMarker|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AvoidMarker (UT2003)</title>
    <id>21018</id>
    <revision>
      <id>28801</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AvoidMarker|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of AvoidMarker (UT2004)</title>
    <id>21019</id>
    <revision>
      <id>28802</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|AvoidMarker|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BaseGUIController (UE2Runtime)</title>
    <id>21020</id>
    <revision>
      <id>28803</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BaseGUIController|Interaction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BaseGUIController (UT2003)</title>
    <id>21021</id>
    <revision>
      <id>28804</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BaseGUIController|Interaction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BaseGUIController (UT2004)</title>
    <id>21022</id>
    <revision>
      <id>28805</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BaseGUIController|Interaction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BehaviorControllerInterf (U2XMP)</title>
    <id>21023</id>
    <revision>
      <id>28806</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BehaviorControllerInterf|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BigRock (RTNP)</title>
    <id>21024</id>
    <revision>
      <id>28807</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BigRock|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BigRock (U1)</title>
    <id>21025</id>
    <revision>
      <id>28808</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BigRock|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BigRock (UT)</title>
    <id>21026</id>
    <revision>
      <id>28809</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BigRock|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioAmmo (UT)</title>
    <id>21027</id>
    <revision>
      <id>28810</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioAmmo|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioChargedFire (UT2003)</title>
    <id>21028</id>
    <revision>
      <id>28811</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioChargedFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioChargedFire (UT2004)</title>
    <id>21029</id>
    <revision>
      <id>28812</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioChargedFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioFear (UT)</title>
    <id>21030</id>
    <revision>
      <id>28813</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioFear|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioFire (UT2003)</title>
    <id>21031</id>
    <revision>
      <id>28814</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioFire (UT2004)</title>
    <id>21032</id>
    <revision>
      <id>28815</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioGel (RTNP)</title>
    <id>21033</id>
    <revision>
      <id>28816</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioGel|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioGel (U1)</title>
    <id>21034</id>
    <revision>
      <id>28817</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioGel|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioGel (UT)</title>
    <id>21035</id>
    <revision>
      <id>28818</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioGel|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioGlob (UT2003)</title>
    <id>21036</id>
    <revision>
      <id>28819</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioGlob|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioGlob (UT2004)</title>
    <id>21037</id>
    <revision>
      <id>28820</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioGlob|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioRifle (UT2003)</title>
    <id>21038</id>
    <revision>
      <id>28821</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioRifle|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioRifle (UT2004)</title>
    <id>21039</id>
    <revision>
      <id>28822</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioRifle|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioRiflePickup (UT2003)</title>
    <id>21040</id>
    <revision>
      <id>28823</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioRiflePickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BioRiflePickup (UT2004)</title>
    <id>21041</id>
    <revision>
      <id>28824</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BioRiflePickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bitmap (RTNP)</title>
    <id>21042</id>
    <revision>
      <id>28825</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bitmap|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bitmap (U1)</title>
    <id>21043</id>
    <revision>
      <id>28826</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bitmap|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bitmap (UT)</title>
    <id>21044</id>
    <revision>
      <id>28827</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bitmap|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BitmapMaterial (U2)</title>
    <id>21045</id>
    <revision>
      <id>28828</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BitmapMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BitmapMaterial (U2XMP)</title>
    <id>21046</id>
    <revision>
      <id>28829</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BitmapMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BitmapMaterial (UE2Runtime)</title>
    <id>21047</id>
    <revision>
      <id>28830</id>
      <timestamp>2008-05-23T14:39:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BitmapMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BitmapMaterial (UT2003)</title>
    <id>21048</id>
    <revision>
      <id>28831</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BitmapMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BitmapMaterial (UT2004)</title>
    <id>21049</id>
    <revision>
      <id>28832</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BitmapMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlackMuzzleSmoke (UT2003)</title>
    <id>21050</id>
    <revision>
      <id>28833</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlackMuzzleSmoke|MuzzleSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlackMuzzleSmoke (UT2004)</title>
    <id>21051</id>
    <revision>
      <id>28834</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlackMuzzleSmoke|MuzzleSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlackoutWindow (UT2004)</title>
    <id>21052</id>
    <revision>
      <id>28835</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlackoutWindow|MessageWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BladeHopper (UT)</title>
    <id>21053</id>
    <revision>
      <id>28836</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BladeHopper|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlockingVolume (U2)</title>
    <id>21054</id>
    <revision>
      <id>28837</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlockingVolume (U2XMP)</title>
    <id>21055</id>
    <revision>
      <id>28838</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlockingVolume (UDK)</title>
    <id>24557</id>
    <revision>
      <id>35784</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE3}}</text>
    </revision>
    <revision>
      <id>35783</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlockingVolume (UT2003)</title>
    <id>21056</id>
    <revision>
      <id>28839</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlockingVolume (UT2004)</title>
    <id>21057</id>
    <revision>
      <id>28840</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlockingVolume (UT3)</title>
    <id>21058</id>
    <revision>
      <id>28841</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlockingVolume|Volume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Blood2 (RTNP)</title>
    <id>21059</id>
    <revision>
      <id>28842</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Blood2|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Blood2 (U1)</title>
    <id>21060</id>
    <revision>
      <id>28843</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Blood2|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Blood2 (UT)</title>
    <id>21061</id>
    <revision>
      <id>28844</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Blood2|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BloodJet (UT2003)</title>
    <id>21062</id>
    <revision>
      <id>28845</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BloodJet|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BloodJet (UT2004)</title>
    <id>21063</id>
    <revision>
      <id>28846</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BloodJet|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BloodSpray (UT)</title>
    <id>21064</id>
    <revision>
      <id>28847</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BloodSpray|Blood2|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BloodSpurt (UT2003)</title>
    <id>21065</id>
    <revision>
      <id>28848</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BloodSpurt|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BloodSpurt (UT2004)</title>
    <id>21066</id>
    <revision>
      <id>28849</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BloodSpurt|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BlueSuperShockBeam (UT2004)</title>
    <id>21067</id>
    <revision>
      <id>28850</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BlueSuperShockBeam|ShockBeamEffect|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Book (RTNP)</title>
    <id>21068</id>
    <revision>
      <id>28851</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Book|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Book (U1)</title>
    <id>21069</id>
    <revision>
      <id>28852</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Book|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Book (UT)</title>
    <id>21070</id>
    <revision>
      <id>28853</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Book|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bot (UT)</title>
    <id>21071</id>
    <revision>
      <id>28854</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bot|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bot (UT2003)</title>
    <id>21072</id>
    <revision>
      <id>28855</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bot|ScriptedController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bot (UT2004)</title>
    <id>21073</id>
    <revision>
      <id>28856</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bot|ScriptedController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BotInfo (RTNP)</title>
    <id>21074</id>
    <revision>
      <id>28857</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BotInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BotReplicationInfo (UT)</title>
    <id>21075</id>
    <revision>
      <id>28858</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BotReplicationInfo|PlayerReplicationInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bots (RTNP)</title>
    <id>21076</id>
    <revision>
      <id>28859</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bots|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bots (U1)</title>
    <id>21077</id>
    <revision>
      <id>28860</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bots|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bots (UT)</title>
    <id>21078</id>
    <revision>
      <id>28861</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bots|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BreakableItem (U2)</title>
    <id>21079</id>
    <revision>
      <id>28862</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BreakableItem|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BreakableItem (U2XMP)</title>
    <id>21080</id>
    <revision>
      <id>28863</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BreakableItem|U2Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BreakableLight (U2XMP)</title>
    <id>21081</id>
    <revision>
      <id>28864</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BreakableLight|BreakableItem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BroadcastHandler (UT2003)</title>
    <id>21082</id>
    <revision>
      <id>28865</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BroadcastHandler|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BroadcastHandler (UT2004)</title>
    <id>21083</id>
    <revision>
      <id>28866</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BroadcastHandler|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Browser Page (UT2003)</title>
    <id>21085</id>
    <revision>
      <id>28868</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Browser_Page|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Browser Page (UT2004)</title>
    <id>21086</id>
    <revision>
      <id>28869</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Browser_Page|UT2K3TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Browser ServerListPageBase (UT2003)</title>
    <id>21087</id>
    <revision>
      <id>28870</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Browser_ServerListPageBase|Browser_Page|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Browser ServerListPageBase (UT2004)</title>
    <id>21088</id>
    <revision>
      <id>28871</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Browser_ServerListPageBase|Browser_Page|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Browser ServerListPageMS (UT2003)</title>
    <id>21089</id>
    <revision>
      <id>28872</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Browser_ServerListPageMS|Browser_ServerListPageBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Browser ServerListPageMS (UT2004)</title>
    <id>21090</id>
    <revision>
      <id>28873</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Browser_ServerListPageMS|Browser_ServerListPageBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrowserFilters (UT2004)</title>
    <id>21084</id>
    <revision>
      <id>28867</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrowserFilters|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (RTNP)</title>
    <id>21091</id>
    <revision>
      <id>28874</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (U1)</title>
    <id>21092</id>
    <revision>
      <id>28875</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (U2)</title>
    <id>21093</id>
    <revision>
      <id>28876</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (U2XMP)</title>
    <id>21094</id>
    <revision>
      <id>28877</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (UDK)</title>
    <id>24558</id>
    <revision>
      <id>35785</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35786</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (UE2Runtime)</title>
    <id>21095</id>
    <revision>
      <id>28878</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (UT)</title>
    <id>21096</id>
    <revision>
      <id>28879</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (UT2003)</title>
    <id>21097</id>
    <revision>
      <id>28880</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (UT2004)</title>
    <id>21098</id>
    <revision>
      <id>28881</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brush (UT3)</title>
    <id>21099</id>
    <revision>
      <id>28882</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brush|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (U2)</title>
    <id>21100</id>
    <revision>
      <id>28883</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (U2XMP)</title>
    <id>21101</id>
    <revision>
      <id>28884</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (UDK)</title>
    <id>24559</id>
    <revision>
      <id>35787</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35788</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (UE2Runtime)</title>
    <id>21102</id>
    <revision>
      <id>28885</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (UT)</title>
    <id>21103</id>
    <revision>
      <id>28886</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (UT2003)</title>
    <id>21104</id>
    <revision>
      <id>28887</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (UT2004)</title>
    <id>21105</id>
    <revision>
      <id>28888</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BrushBuilder (UT3)</title>
    <id>21106</id>
    <revision>
      <id>28889</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BrushBuilder|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brute (RTNP)</title>
    <id>21107</id>
    <revision>
      <id>28890</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brute|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brute (U1)</title>
    <id>21108</id>
    <revision>
      <id>28891</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brute|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brute (UT)</title>
    <id>21109</id>
    <revision>
      <id>28892</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brute|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brute (UT2003)</title>
    <id>21110</id>
    <revision>
      <id>28893</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brute|Monster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Brute (UT2004)</title>
    <id>21111</id>
    <revision>
      <id>28894</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Brute|Monster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BruteCarcass (RTNP)</title>
    <id>21112</id>
    <revision>
      <id>28895</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BruteCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BruteCarcass (U1)</title>
    <id>21113</id>
    <revision>
      <id>28896</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BruteCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BruteCarcass (UT)</title>
    <id>21114</id>
    <revision>
      <id>28897</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BruteCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BruteProjectile (RTNP)</title>
    <id>21115</id>
    <revision>
      <id>28898</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BruteProjectile|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BruteProjectile (U1)</title>
    <id>21116</id>
    <revision>
      <id>28899</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BruteProjectile|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BruteProjectile (UT)</title>
    <id>21117</id>
    <revision>
      <id>28900</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BruteProjectile|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Bubble (RTNP)</title>
    <id>21118</id>
    <revision>
      <id>28901</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Bubble|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BufferedTcpLink (UT2003)</title>
    <id>21119</id>
    <revision>
      <id>28902</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BufferedTcpLink|TcpLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BufferedTcpLink (UT2004)</title>
    <id>21120</id>
    <revision>
      <id>28903</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BufferedTcpLink|TcpLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BulletBox (UT)</title>
    <id>21121</id>
    <revision>
      <id>28904</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BulletBox|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BulletDecal (UT2004)</title>
    <id>21122</id>
    <revision>
      <id>28905</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BulletDecal|xScorch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of BulletImpact (UT)</title>
    <id>21123</id>
    <revision>
      <id>28906</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|BulletImpact|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ButtonFooter (UT2004)</title>
    <id>21124</id>
    <revision>
      <id>28907</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ButtonFooter|GUIFooter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSFemale (RTNP)</title>
    <id>21211</id>
    <revision>
      <id>28994</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSFemale|CSHuman|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSHuman (RTNP)</title>
    <id>21212</id>
    <revision>
      <id>28995</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSHuman|CSPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSMale (RTNP)</title>
    <id>21213</id>
    <revision>
      <id>28996</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSMale|CSHuman|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSPawn (RTNP)</title>
    <id>21214</id>
    <revision>
      <id>28997</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSPawn|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSPlayer (RTNP)</title>
    <id>21215</id>
    <revision>
      <id>28998</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSPlayer|UnrealIPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSSinglePlayer (RTNP)</title>
    <id>21216</id>
    <revision>
      <id>28999</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSSinglePlayer|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CSSkaarj (RTNP)</title>
    <id>21217</id>
    <revision>
      <id>29000</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CSSkaarj|CSPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFBase (UT2003)</title>
    <id>21218</id>
    <revision>
      <id>29001</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFBase|GameObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFBase (UT2004)</title>
    <id>21219</id>
    <revision>
      <id>29002</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFBase|GameObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFFlag (UT)</title>
    <id>21220</id>
    <revision>
      <id>29003</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFFlag|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFFlag (UT2003)</title>
    <id>21221</id>
    <revision>
      <id>29004</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFFlag|GameObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFFlag (UT2004)</title>
    <id>21222</id>
    <revision>
      <id>29005</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFFlag|GameObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFGame (UT)</title>
    <id>21223</id>
    <revision>
      <id>29006</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFGame|TeamGamePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFGame (UT2003)</title>
    <id>21224</id>
    <revision>
      <id>29007</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFGame|TeamGame|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFGame (UT2004)</title>
    <id>21225</id>
    <revision>
      <id>29008</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFGame|TeamGame|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFHUDMessage (UT2003)</title>
    <id>21226</id>
    <revision>
      <id>29009</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFHUDMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CTFHUDMessage (UT2004)</title>
    <id>21227</id>
    <revision>
      <id>29010</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CTFHUDMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Camera (UDK)</title>
    <id>24560</id>
    <revision>
      <id>35789</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Camera|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35790</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Camera|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Camera (UT3)</title>
    <id>21125</id>
    <revision>
      <id>28908</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Camera|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraActor (UDK)</title>
    <id>24561</id>
    <revision>
      <id>35791</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35792</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|CameraActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraActor (UT3)</title>
    <id>21126</id>
    <revision>
      <id>28909</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraEffect (U2)</title>
    <id>21127</id>
    <revision>
      <id>28910</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraEffect|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraEffect (UE2Runtime)</title>
    <id>21128</id>
    <revision>
      <id>28911</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraEffect|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraEffect (UT2003)</title>
    <id>21129</id>
    <revision>
      <id>28912</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraEffect|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraEffect (UT2004)</title>
    <id>21130</id>
    <revision>
      <id>28913</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraEffect|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraModifier (UDK)</title>
    <id>24562</id>
    <revision>
      <id>35793</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraModifier|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35794</id>
      <timestamp>2009-11-06T17:54:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|CameraModifier|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CameraModifier (UT3)</title>
    <id>21131</id>
    <revision>
      <id>28914</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CameraModifier|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Cannon (RTNP)</title>
    <id>21132</id>
    <revision>
      <id>28915</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Cannon|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Cannon (U1)</title>
    <id>21133</id>
    <revision>
      <id>28916</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Cannon|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Cannon (UT)</title>
    <id>21134</id>
    <revision>
      <id>28917</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Cannon|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Carcass (RTNP)</title>
    <id>21135</id>
    <revision>
      <id>28918</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Carcass|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Carcass (U1)</title>
    <id>21136</id>
    <revision>
      <id>28919</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Carcass|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Carcass (UT)</title>
    <id>21137</id>
    <revision>
      <id>28920</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Carcass|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ChallengeGame (UT2004)</title>
    <id>21138</id>
    <revision>
      <id>28921</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ChallengeGame|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ChallengeHUD (UT)</title>
    <id>21139</id>
    <revision>
      <id>28922</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ChallengeHUD|HUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ChallengeTeamHUD (UT)</title>
    <id>21140</id>
    <revision>
      <id>28923</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ChallengeTeamHUD|ChallengeHUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ChallengeVoicePack (UT)</title>
    <id>21141</id>
    <revision>
      <id>28924</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ChallengeVoicePack|VoicePack|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CheatManager (U2)</title>
    <id>21142</id>
    <revision>
      <id>28925</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CheatManager|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CheatManager (UDK)</title>
    <id>24563</id>
    <revision>
      <id>35795</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CheatManager|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35796</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|CheatManager|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CheatManager (UE2Runtime)</title>
    <id>21143</id>
    <revision>
      <id>28926</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CheatManager|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CheatManager (UT3)</title>
    <id>21144</id>
    <revision>
      <id>28927</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CheatManager|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Chunk (RTNP)</title>
    <id>21145</id>
    <revision>
      <id>28928</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Chunk|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Chunk (U1)</title>
    <id>21146</id>
    <revision>
      <id>28929</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Chunk|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Chunk (UT)</title>
    <id>21147</id>
    <revision>
      <id>28930</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Chunk|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Chunk1 (RTNP)</title>
    <id>21148</id>
    <revision>
      <id>28931</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Chunk1|Chunk|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Chunk1 (U1)</title>
    <id>21149</id>
    <revision>
      <id>28932</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Chunk1|Chunk|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Chunk1 (UT)</title>
    <id>21150</id>
    <revision>
      <id>28933</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Chunk1|Chunk|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ClassicRocketMultifire (UT2004)</title>
    <id>21151</id>
    <revision>
      <id>28934</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ClassicRocketMultifire|RocketMultiFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ClassicTransbeacon (UT2003)</title>
    <id>21152</id>
    <revision>
      <id>28935</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ClassicTransbeacon|TransBeacon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ClassicTransbeacon (UT2004)</title>
    <id>21153</id>
    <revision>
      <id>28936</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ClassicTransbeacon|TransBeacon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ClientScriptedTexture (UT)</title>
    <id>21154</id>
    <revision>
      <id>28937</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ClientScriptedTexture|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CodecMovie (UDK)</title>
    <id>24564</id>
    <revision>
      <id>35797</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CodecMovie|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35798</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|CodecMovie|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CodecMovie (UT3)</title>
    <id>21155</id>
    <revision>
      <id>28938</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CodecMovie|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Collection (U2XMP)</title>
    <id>21156</id>
    <revision>
      <id>28939</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Collection|LegendObjectComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CollisionProxy (U2XMP)</title>
    <id>21157</id>
    <revision>
      <id>28940</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CollisionProxy|LegendActorComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Combo (UT2003)</title>
    <id>21158</id>
    <revision>
      <id>28941</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Combo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Combo (UT2004)</title>
    <id>21159</id>
    <revision>
      <id>28942</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Combo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet</title>
    <id>28607</id>
    <revision>
      <id>40434</id>
      <timestamp>2010-01-11T11:43:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Commandlet|Object}}'</comment>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (RTNP)</title>
    <id>21160</id>
    <revision>
      <id>28943</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (U1)</title>
    <id>21161</id>
    <revision>
      <id>28944</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (U2)</title>
    <id>21162</id>
    <revision>
      <id>28945</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (U2XMP)</title>
    <id>21163</id>
    <revision>
      <id>28946</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (UDK)</title>
    <id>24565</id>
    <revision>
      <id>35799</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35800</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (UE2Runtime)</title>
    <id>21164</id>
    <revision>
      <id>28947</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (UT)</title>
    <id>21165</id>
    <revision>
      <id>28948</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (UT2003)</title>
    <id>21166</id>
    <revision>
      <id>28949</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (UT2004)</title>
    <id>21167</id>
    <revision>
      <id>28950</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Commandlet (UT3)</title>
    <id>21168</id>
    <revision>
      <id>28951</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Commandlet|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Component (UDK)</title>
    <id>24566</id>
    <revision>
      <id>35801</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Component|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35802</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Component|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Component (UT3)</title>
    <id>21169</id>
    <revision>
      <id>28952</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Component|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (RTNP)</title>
    <id>21170</id>
    <revision>
      <id>28953</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (U1)</title>
    <id>21171</id>
    <revision>
      <id>28954</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (U2)</title>
    <id>21172</id>
    <revision>
      <id>28955</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (U2XMP)</title>
    <id>21173</id>
    <revision>
      <id>28956</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (UDK)</title>
    <id>24567</id>
    <revision>
      <id>35803</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Interaction|UE3}}</text>
    </revision>
    <revision>
      <id>35804</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Console|Interaction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (UE2Runtime)</title>
    <id>21174</id>
    <revision>
      <id>28957</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Interaction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (UT)</title>
    <id>21175</id>
    <revision>
      <id>28958</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (UT2003)</title>
    <id>21176</id>
    <revision>
      <id>28959</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Interaction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (UT2004)</title>
    <id>21177</id>
    <revision>
      <id>28960</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Interaction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Console (UT3)</title>
    <id>21178</id>
    <revision>
      <id>28961</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Console|Interaction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ConsolePlugIn (U2XMP)</title>
    <id>21179</id>
    <revision>
      <id>28962</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ConsolePlugIn|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ConstantMaterial (U2)</title>
    <id>21180</id>
    <revision>
      <id>28963</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ConstantMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ConstantMaterial (U2XMP)</title>
    <id>21181</id>
    <revision>
      <id>28964</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ConstantMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ConstantMaterial (UE2Runtime)</title>
    <id>21182</id>
    <revision>
      <id>28965</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ConstantMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ConstantMaterial (UT2003)</title>
    <id>21183</id>
    <revision>
      <id>28966</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ConstantMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ConstantMaterial (UT2004)</title>
    <id>21184</id>
    <revision>
      <id>28967</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ConstantMaterial|RenderedMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (U2)</title>
    <id>21185</id>
    <revision>
      <id>28968</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (U2XMP)</title>
    <id>21186</id>
    <revision>
      <id>28969</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (UDK)</title>
    <id>24568</id>
    <revision>
      <id>35805</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35806</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (UE2Runtime)</title>
    <id>21187</id>
    <revision>
      <id>28970</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (UT2003)</title>
    <id>21188</id>
    <revision>
      <id>28971</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (UT2004)</title>
    <id>21189</id>
    <revision>
      <id>28972</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Controller (UT3)</title>
    <id>21190</id>
    <revision>
      <id>28973</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Controller|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CoopGame (RTNP)</title>
    <id>21191</id>
    <revision>
      <id>28974</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CoopGame|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Cow (RTNP)</title>
    <id>21192</id>
    <revision>
      <id>28975</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Cow|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Cow (U1)</title>
    <id>21193</id>
    <revision>
      <id>28976</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Cow|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Cow (UT)</title>
    <id>21194</id>
    <revision>
      <id>28977</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Cow|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CowCarcass (RTNP)</title>
    <id>21195</id>
    <revision>
      <id>28978</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CowCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CowCarcass (U1)</title>
    <id>21196</id>
    <revision>
      <id>28979</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CowCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CowCarcass (UT)</title>
    <id>21197</id>
    <revision>
      <id>28980</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CowCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CreatureCarcass (RTNP)</title>
    <id>21198</id>
    <revision>
      <id>28981</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CreatureCarcass|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CreatureCarcass (U1)</title>
    <id>21199</id>
    <revision>
      <id>28982</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CreatureCarcass|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CreatureCarcass (UT)</title>
    <id>21200</id>
    <revision>
      <id>28983</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CreatureCarcass|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CreatureChunks (RTNP)</title>
    <id>21201</id>
    <revision>
      <id>28984</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CreatureChunks|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CreatureChunks (U1)</title>
    <id>21202</id>
    <revision>
      <id>28985</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CreatureChunks|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CreatureChunks (UT)</title>
    <id>21203</id>
    <revision>
      <id>28986</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CreatureChunks|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CriticalEventLowPlus (UT)</title>
    <id>21204</id>
    <revision>
      <id>28987</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CriticalEventLowPlus|CriticalEventPlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CriticalEventPlus (U2)</title>
    <id>21205</id>
    <revision>
      <id>28988</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CriticalEventPlus|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CriticalEventPlus (UE2Runtime)</title>
    <id>21206</id>
    <revision>
      <id>28989</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CriticalEventPlus|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CriticalEventPlus (UT)</title>
    <id>21207</id>
    <revision>
      <id>28990</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CriticalEventPlus|LocalMessagePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CriticalEventPlus (UT2003)</title>
    <id>21208</id>
    <revision>
      <id>28991</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CriticalEventPlus|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CriticalEventPlus (UT2004)</title>
    <id>21209</id>
    <revision>
      <id>28992</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CriticalEventPlus|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CrosshairPack (UT2004)</title>
    <id>21210</id>
    <revision>
      <id>28993</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CrosshairPack|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CrowdAgentBase (UDK)</title>
    <id>24569</id>
    <revision>
      <id>35807</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CrowdAgentBase|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35808</id>
      <timestamp>2009-11-06T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|CrowdAgentBase|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CurveEdPresetBase (UDK)</title>
    <id>24570</id>
    <revision>
      <id>35809</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CurveEdPresetBase|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35810</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|CurveEdPresetBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CurveEdPresetBase (UT3)</title>
    <id>21228</id>
    <revision>
      <id>29011</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CurveEdPresetBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CustomBot (UT)</title>
    <id>21229</id>
    <revision>
      <id>29012</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CustomBot|MaleBotPlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CustomLadderInfo (UT2004)</title>
    <id>21230</id>
    <revision>
      <id>29013</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CustomLadderInfo|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CustomPlayer (UT)</title>
    <id>21231</id>
    <revision>
      <id>29014</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CustomPlayer|TournamentMale|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CutSeq (RTNP)</title>
    <id>21233</id>
    <revision>
      <id>29016</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CutSeq|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of CutscenePlayer (U2XMP)</title>
    <id>21232</id>
    <revision>
      <id>29015</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|CutscenePlayer|U2PawnAtlantis|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DECO Smashable (UT2004)</title>
    <id>21295</id>
    <revision>
      <id>29078</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DECO_Smashable|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DECO SpaceFighter (UT2004)</title>
    <id>21296</id>
    <revision>
      <id>29079</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DECO_SpaceFighter|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DMMutator (UT2003)</title>
    <id>21321</id>
    <revision>
      <id>29104</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DMMutator|Mutator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DMMutator (UT2004)</title>
    <id>21322</id>
    <revision>
      <id>29105</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DMMutator|Mutator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DMRoster (UT2003)</title>
    <id>21323</id>
    <revision>
      <id>29106</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DMRoster|UnrealTeamInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DMRoster (UT2004)</title>
    <id>21324</id>
    <revision>
      <id>29107</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DMRoster|UnrealTeamInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DMSquad (UT2003)</title>
    <id>21325</id>
    <revision>
      <id>29108</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DMSquad|SquadAI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DMSquad (UT2004)</title>
    <id>21326</id>
    <revision>
      <id>29109</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DMSquad|SquadAI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DOFAndBloomEffect (UDK)</title>
    <id>24584</id>
    <revision>
      <id>35837</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DOFAndBloomEffect|DOFEffect|UE3}}</text>
    </revision>
    <revision>
      <id>35838</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DOFAndBloomEffect|DOFEffect|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DOFAndBloomEffect (UT3)</title>
    <id>21327</id>
    <revision>
      <id>29110</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DOFAndBloomEffect|DOFEffect|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DOFBloomMotionBlurEffect (UDK)</title>
    <id>24585</id>
    <revision>
      <id>35839</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DOFBloomMotionBlurEffect|DOFAndBloomEffect|UE3}}</text>
    </revision>
    <revision>
      <id>35840</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DOFBloomMotionBlurEffect|DOFAndBloomEffect|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DOFEffect (UDK)</title>
    <id>24586</id>
    <revision>
      <id>35841</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DOFEffect|PostProcessEffect|UE3}}</text>
    </revision>
    <revision>
      <id>35842</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DOFEffect|PostProcessEffect|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DOFEffect (UT3)</title>
    <id>21328</id>
    <revision>
      <id>29111</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DOFEffect|PostProcessEffect|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeFlakChunk (UT2003)</title>
    <id>21256</id>
    <revision>
      <id>29039</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeFlakChunk|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeFlakChunk (UT2004)</title>
    <id>21257</id>
    <revision>
      <id>29040</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeFlakChunk|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeMinigunBullet (UT2003)</title>
    <id>21258</id>
    <revision>
      <id>29041</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeMinigunBullet|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeMinigunBullet (UT2004)</title>
    <id>21259</id>
    <revision>
      <id>29042</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeMinigunBullet|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypePancake (UT2004)</title>
    <id>21260</id>
    <revision>
      <id>29043</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypePancake|DamTypeRoadkill|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeRoadkill (UT2004)</title>
    <id>21261</id>
    <revision>
      <id>29044</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeRoadkill|VehicleDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeRocket (UT2003)</title>
    <id>21262</id>
    <revision>
      <id>29045</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeRocket|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeRocket (UT2004)</title>
    <id>21263</id>
    <revision>
      <id>29046</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeRocket|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeShockBeam (UT2003)</title>
    <id>21264</id>
    <revision>
      <id>29047</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeShockBeam|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeShockBeam (UT2004)</title>
    <id>21265</id>
    <revision>
      <id>29048</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeShockBeam|WeaponDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeSpaceFighterLaser (UT2004)</title>
    <id>21266</id>
    <revision>
      <id>29049</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeSpaceFighterLaser|VehicleDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeSpaceFighterMissile (UT2004)</title>
    <id>21267</id>
    <revision>
      <id>29050</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeSpaceFighterMissile|VehicleDamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeSuperShockBeam (UT2003)</title>
    <id>21268</id>
    <revision>
      <id>29051</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeSuperShockBeam|DamTypeShockBeam|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamTypeSuperShockBeam (UT2004)</title>
    <id>21269</id>
    <revision>
      <id>29052</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamTypeSuperShockBeam|DamTypeShockBeam|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageFilter (U2)</title>
    <id>21234</id>
    <revision>
      <id>29017</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageFilter|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageFilter (U2XMP)</title>
    <id>21235</id>
    <revision>
      <id>29018</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageFilter|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageFilterBiological (U2XMP)</title>
    <id>21236</id>
    <revision>
      <id>29019</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageFilterBiological|DamageFilter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (RTNP)</title>
    <id>21237</id>
    <revision>
      <id>29020</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (U1)</title>
    <id>21238</id>
    <revision>
      <id>29021</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (U2)</title>
    <id>21239</id>
    <revision>
      <id>29022</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (U2XMP)</title>
    <id>21240</id>
    <revision>
      <id>29023</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (UDK)</title>
    <id>24571</id>
    <revision>
      <id>35811</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35812</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DamageType|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (UE2Runtime)</title>
    <id>21241</id>
    <revision>
      <id>29024</id>
      <timestamp>2008-05-23T14:39:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (UT)</title>
    <id>21242</id>
    <revision>
      <id>29025</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (UT2003)</title>
    <id>21243</id>
    <revision>
      <id>29026</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (UT2004)</title>
    <id>21244</id>
    <revision>
      <id>29027</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageType (UT3)</title>
    <id>21245</id>
    <revision>
      <id>29028</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageType|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeBiological (U2)</title>
    <id>21246</id>
    <revision>
      <id>29029</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeBiological|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeBiological (U2XMP)</title>
    <id>21247</id>
    <revision>
      <id>29030</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeBiological|DamageTypeImpl|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeDeployableBase (U2)</title>
    <id>21248</id>
    <revision>
      <id>29031</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeDeployableBase|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeElectrical (U2)</title>
    <id>21249</id>
    <revision>
      <id>29032</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeElectrical|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeElectrical (U2XMP)</title>
    <id>21250</id>
    <revision>
      <id>29033</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeElectrical|DamageTypeImpl|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeImpl (U2XMP)</title>
    <id>21251</id>
    <revision>
      <id>29034</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeImpl|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeMineBase (U2)</title>
    <id>21252</id>
    <revision>
      <id>29035</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeMineBase|DamageTypeDeployableBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypePhysical (U2XMP)</title>
    <id>21253</id>
    <revision>
      <id>29036</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypePhysical|DamageTypeImpl|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeThermal (U2)</title>
    <id>21254</id>
    <revision>
      <id>29037</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeThermal|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DamageTypeThermal (U2XMP)</title>
    <id>21255</id>
    <revision>
      <id>29038</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DamageTypeThermal|DamageTypeImpl|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeadMales (RTNP)</title>
    <id>21270</id>
    <revision>
      <id>29053</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeadMales|HumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeadMales (U1)</title>
    <id>21271</id>
    <revision>
      <id>29054</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeadMales|HumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeadMales (UT)</title>
    <id>21272</id>
    <revision>
      <id>29055</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeadMales|HumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMatch (UT2003)</title>
    <id>21273</id>
    <revision>
      <id>29056</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMatch|UnrealMPGameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMatch (UT2004)</title>
    <id>21274</id>
    <revision>
      <id>29057</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMatch|UnrealMPGameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMatchGame (RTNP)</title>
    <id>21275</id>
    <revision>
      <id>29058</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMatchGame|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMatchGame (U1)</title>
    <id>21276</id>
    <revision>
      <id>29059</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMatchGame|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMatchGame (UT)</title>
    <id>21277</id>
    <revision>
      <id>29060</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMatchGame|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMatchPlus (UT)</title>
    <id>21278</id>
    <revision>
      <id>29061</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMatchPlus|TournamentGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMessage (U2)</title>
    <id>21279</id>
    <revision>
      <id>29062</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeathMessagePlus (UT)</title>
    <id>21280</id>
    <revision>
      <id>29063</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeathMessagePlus|LocalMessagePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DebugInfoManager (U2)</title>
    <id>21281</id>
    <revision>
      <id>29064</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DebugInfoManager|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DebugInfoManager (U2XMP)</title>
    <id>21282</id>
    <revision>
      <id>29065</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DebugInfoManager|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decal (U2XMP)</title>
    <id>21283</id>
    <revision>
      <id>29066</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decal|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decal (UT)</title>
    <id>21284</id>
    <revision>
      <id>29067</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decal|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DecalActorBase (UDK)</title>
    <id>24572</id>
    <revision>
      <id>35813</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DecalActorBase|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35814</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DecalActorBase|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DecalComponent (UDK)</title>
    <id>24573</id>
    <revision>
      <id>35815</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DecalComponent|PrimitiveComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35816</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DecalComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DecalLifetime (UT3)</title>
    <id>21285</id>
    <revision>
      <id>29068</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DecalLifetime|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DecalManager (UDK)</title>
    <id>24574</id>
    <revision>
      <id>35817</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DecalManager|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35818</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DecalManager|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DecalManager (UT3)</title>
    <id>21286</id>
    <revision>
      <id>29069</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DecalManager|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (RTNP)</title>
    <id>21287</id>
    <revision>
      <id>29070</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (U1)</title>
    <id>21288</id>
    <revision>
      <id>29071</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (U2)</title>
    <id>21289</id>
    <revision>
      <id>29072</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (U2XMP)</title>
    <id>21290</id>
    <revision>
      <id>29073</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (UE2Runtime)</title>
    <id>21291</id>
    <revision>
      <id>29074</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (UT)</title>
    <id>21292</id>
    <revision>
      <id>29075</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (UT2003)</title>
    <id>21293</id>
    <revision>
      <id>29076</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Decoration (UT2004)</title>
    <id>21294</id>
    <revision>
      <id>29077</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Decoration|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DefaultBurst (RTNP)</title>
    <id>21297</id>
    <revision>
      <id>29080</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DefaultBurst|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DefaultBurst (U1)</title>
    <id>21298</id>
    <revision>
      <id>29081</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DefaultBurst|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DefaultBurst (UT)</title>
    <id>21299</id>
    <revision>
      <id>29082</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DefaultBurst|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DefaultSizedThumbnailRenderer (UDK)</title>
    <id>24575</id>
    <revision>
      <id>35819</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DefaultSizedThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>35820</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DefaultSizedThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DefaultSizedThumbnailRenderer (UT3)</title>
    <id>21300</id>
    <revision>
      <id>29083</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DefaultSizedThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeployableInventory (U2)</title>
    <id>21301</id>
    <revision>
      <id>29084</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeployableInventory|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeployableInventory (U2XMP)</title>
    <id>21302</id>
    <revision>
      <id>29085</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeployableInventory|U2XMPItem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeployedUnit (U2)</title>
    <id>21303</id>
    <revision>
      <id>29086</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeployedUnit|StationaryPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DeployedUnit (U2XMP)</title>
    <id>21304</id>
    <revision>
      <id>29087</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DeployedUnit|StationaryPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DestroyableObjective (UT2004)</title>
    <id>21305</id>
    <revision>
      <id>29088</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DestroyableObjective|GameObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Dialog (U2XMP)</title>
    <id>21306</id>
    <revision>
      <id>29089</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Dialog|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DialogController (U2XMP)</title>
    <id>21307</id>
    <revision>
      <id>29090</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DialogController|Dialog|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DialogGameInfo (U2XMP)</title>
    <id>21308</id>
    <revision>
      <id>29091</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DialogGameInfo|GameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DialogNode (U2XMP)</title>
    <id>21309</id>
    <revision>
      <id>29092</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DialogNode|Dialog|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DirectionalLight (UDK)</title>
    <id>24576</id>
    <revision>
      <id>35821</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DirectionalLight|Light|UE3}}</text>
    </revision>
    <revision>
      <id>35822</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DirectionalLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DirectionalLight (UT3)</title>
    <id>21310</id>
    <revision>
      <id>29093</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DirectionalLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DirectionalLightComponent (UDK)</title>
    <id>24577</id>
    <revision>
      <id>35823</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DirectionalLightComponent|LightComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35824</id>
      <timestamp>2009-11-06T17:54:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DirectionalLightComponent|LightComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Dispatcher (U2XMP)</title>
    <id>21311</id>
    <revision>
      <id>29094</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Dispatcher|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DispersionAmmo (RTNP)</title>
    <id>21312</id>
    <revision>
      <id>29095</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DispersionAmmo|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DispersionAmmo (U1)</title>
    <id>21313</id>
    <revision>
      <id>29096</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DispersionAmmo|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DispersionAmmo (UT)</title>
    <id>21314</id>
    <revision>
      <id>29097</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DispersionAmmo|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionFloat (UDK)</title>
    <id>24578</id>
    <revision>
      <id>35825</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionFloat|Component|UE3}}</text>
    </revision>
    <revision>
      <id>35826</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DistributionFloat|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionFloat (UT3)</title>
    <id>21315</id>
    <revision>
      <id>29098</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionFloat|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionFloatConstant (UDK)</title>
    <id>24579</id>
    <revision>
      <id>35827</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionFloatConstant|DistributionFloat|UE3}}</text>
    </revision>
    <revision>
      <id>35828</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DistributionFloatConstant|DistributionFloat|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionFloatConstant (UT3)</title>
    <id>21316</id>
    <revision>
      <id>29099</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionFloatConstant|DistributionFloat|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionFloatParameterBase (UDK)</title>
    <id>24580</id>
    <revision>
      <id>35829</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionFloatParameterBase|DistributionFloatConstant|UE3}}</text>
    </revision>
    <revision>
      <id>35830</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DistributionFloatParameterBase|DistributionFloatConstant|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionFloatParameterBase (UT3)</title>
    <id>21317</id>
    <revision>
      <id>29100</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionFloatParameterBase|DistributionFloatConstant|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionVector (UDK)</title>
    <id>24581</id>
    <revision>
      <id>35831</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionVector|Component|UE3}}</text>
    </revision>
    <revision>
      <id>35832</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DistributionVector|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionVector (UT3)</title>
    <id>21318</id>
    <revision>
      <id>29101</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionVector|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionVectorConstant (UDK)</title>
    <id>24582</id>
    <revision>
      <id>35833</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionVectorConstant|DistributionVector|UE3}}</text>
    </revision>
    <revision>
      <id>35834</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DistributionVectorConstant|DistributionVector|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionVectorConstant (UT3)</title>
    <id>21319</id>
    <revision>
      <id>29102</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionVectorConstant|DistributionVector|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionVectorParameterBase (UDK)</title>
    <id>24583</id>
    <revision>
      <id>35835</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionVectorParameterBase|DistributionVectorConstant|UE3}}</text>
    </revision>
    <revision>
      <id>35836</id>
      <timestamp>2009-11-06T17:54:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DistributionVectorParameterBase|DistributionVectorConstant|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DistributionVectorParameterBase (UT3)</title>
    <id>21320</id>
    <revision>
      <id>29103</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DistributionVectorParameterBase|DistributionVectorConstant|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Domination (UT)</title>
    <id>21329</id>
    <revision>
      <id>29112</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Domination|TeamGamePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DominationPoint (UT2003)</title>
    <id>21330</id>
    <revision>
      <id>29113</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DominationPoint|GameObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DominationPoint (UT2004)</title>
    <id>21331</id>
    <revision>
      <id>29114</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DominationPoint|GameObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Door (U2)</title>
    <id>21332</id>
    <revision>
      <id>29115</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Door|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Door (UE2Runtime)</title>
    <id>21333</id>
    <revision>
      <id>29116</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Door|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Door (UT2003)</title>
    <id>21334</id>
    <revision>
      <id>29117</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Door|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Door (UT2004)</title>
    <id>21335</id>
    <revision>
      <id>29118</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Door|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DrawConeComponent (UDK)</title>
    <id>24587</id>
    <revision>
      <id>35843</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DrawConeComponent|PrimitiveComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35844</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DrawConeComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DrawConeComponent (UT3)</title>
    <id>21336</id>
    <revision>
      <id>29119</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DrawConeComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DrawOpBase (UT2003)</title>
    <id>21337</id>
    <revision>
      <id>29120</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DrawOpBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DrawOpBase (UT2004)</title>
    <id>21338</id>
    <revision>
      <id>29121</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DrawOpBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DrawSphereComponent (UDK)</title>
    <id>24588</id>
    <revision>
      <id>35845</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DrawSphereComponent|PrimitiveComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35846</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DrawSphereComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DrawSphereComponent (UT3)</title>
    <id>21339</id>
    <revision>
      <id>29122</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DrawSphereComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DripGenerator (RTNP)</title>
    <id>21340</id>
    <revision>
      <id>29123</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DripGenerator|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DripGenerator (U1)</title>
    <id>21341</id>
    <revision>
      <id>29124</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DripGenerator|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DripGenerator (UT)</title>
    <id>21342</id>
    <revision>
      <id>29125</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DripGenerator|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DroppedPickup (UDK)</title>
    <id>24589</id>
    <revision>
      <id>35847</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DroppedPickup|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35848</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DroppedPickup|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DroppedPickup (UT3)</title>
    <id>21343</id>
    <revision>
      <id>29126</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DroppedPickup|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DynamicBlockingVolume (U2)</title>
    <id>21344</id>
    <revision>
      <id>29127</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DynamicBlockingVolume|BlockingVolume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DynamicLightEnvironmentComponent (UDK)</title>
    <id>24590</id>
    <revision>
      <id>35849</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DynamicLightEnvironmentComponent|LightEnvironmentComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35850</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DynamicLightEnvironmentComponent|LightEnvironmentComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DynamicProjector (UT2003)</title>
    <id>21345</id>
    <revision>
      <id>29128</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DynamicProjector|Projector|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DynamicProjector (UT2004)</title>
    <id>21346</id>
    <revision>
      <id>29129</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DynamicProjector|Projector|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DynamicSMActor (UDK)</title>
    <id>24591</id>
    <revision>
      <id>35851</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DynamicSMActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35852</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|DynamicSMActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of DynamicSMActor (UT3)</title>
    <id>21347</id>
    <revision>
      <id>29130</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|DynamicSMActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EClip (UT)</title>
    <id>21349</id>
    <revision>
      <id>29132</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EClip|MiniAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Earthquake (UT)</title>
    <id>21348</id>
    <revision>
      <id>29131</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Earthquake|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorComponent (UDK)</title>
    <id>24592</id>
    <revision>
      <id>35853</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorComponent|PrimitiveComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35854</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|EditorComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorComponent (UT3)</title>
    <id>21350</id>
    <revision>
      <id>29133</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorEngine (U2)</title>
    <id>21351</id>
    <revision>
      <id>29134</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorEngine|Engine|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorEngine (UDK)</title>
    <id>24593</id>
    <revision>
      <id>35855</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorEngine|Engine|UE3}}</text>
    </revision>
    <revision>
      <id>35856</id>
      <timestamp>2009-11-06T17:54:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|EditorEngine|Engine|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorEngine (UE2Runtime)</title>
    <id>24440</id>
    <revision>
      <id>35532</id>
      <timestamp>2009-10-24T19:16:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|EditorEngine||UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|EditorEngine||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorEngine (UT2003)</title>
    <id>21352</id>
    <revision>
      <id>29135</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorEngine|Engine|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorEngine (UT2004)</title>
    <id>21353</id>
    <revision>
      <id>29136</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorEngine|Engine|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorEngine (UT3)</title>
    <id>21354</id>
    <revision>
      <id>29137</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorEngine|Engine|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorUISceneClient (UDK)</title>
    <id>24594</id>
    <revision>
      <id>35857</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorUISceneClient|UISceneClient|UE3}}</text>
    </revision>
    <revision>
      <id>35858</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|EditorUISceneClient|UISceneClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorUISceneClient (UT3)</title>
    <id>21355</id>
    <revision>
      <id>29138</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorUISceneClient|UISceneClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorViewportInput (UDK)</title>
    <id>24595</id>
    <revision>
      <id>35859</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorViewportInput|Input|UE3}}</text>
    </revision>
    <revision>
      <id>35860</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|EditorViewportInput|Input|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EditorViewportInput (UT3)</title>
    <id>21356</id>
    <revision>
      <id>29139</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EditorViewportInput|Input|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EffectLight (RTNP)</title>
    <id>21357</id>
    <revision>
      <id>29140</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EffectLight|WeaponLight|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (RTNP)</title>
    <id>21358</id>
    <revision>
      <id>29141</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (U1)</title>
    <id>21359</id>
    <revision>
      <id>29142</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (U2)</title>
    <id>21360</id>
    <revision>
      <id>29143</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (U2XMP)</title>
    <id>21361</id>
    <revision>
      <id>29144</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (UE2Runtime)</title>
    <id>21362</id>
    <revision>
      <id>29145</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (UT)</title>
    <id>21363</id>
    <revision>
      <id>29146</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (UT2003)</title>
    <id>21364</id>
    <revision>
      <id>29147</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Effects (UT2004)</title>
    <id>21365</id>
    <revision>
      <id>29148</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Effects|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ElectricGenerator (U2)</title>
    <id>21366</id>
    <revision>
      <id>29149</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ElectricGenerator|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ElectricGenerator (U2XMP)</title>
    <id>21367</id>
    <revision>
      <id>29150</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ElectricGenerator|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Emitter (UDK)</title>
    <id>24596</id>
    <revision>
      <id>35861</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Emitter|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35862</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Emitter|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Emitter (UT2003)</title>
    <id>21368</id>
    <revision>
      <id>29151</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Emitter|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Emitter (UT2004)</title>
    <id>21369</id>
    <revision>
      <id>29152</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Emitter|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Emitter (UT3)</title>
    <id>21370</id>
    <revision>
      <id>29153</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Emitter|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EmitterPool (UDK)</title>
    <id>24597</id>
    <revision>
      <id>35863</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EmitterPool|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35864</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|EmitterPool|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EmitterPool (UT3)</title>
    <id>21371</id>
    <revision>
      <id>29154</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EmitterPool|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of EnergyImpact (UT)</title>
    <id>21372</id>
    <revision>
      <id>29155</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|EnergyImpact|Scorch|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Enforcer (UT)</title>
    <id>21373</id>
    <revision>
      <id>29156</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Enforcer|TournamentWeapon|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (RTNP)</title>
    <id>21374</id>
    <revision>
      <id>29157</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (U1)</title>
    <id>21375</id>
    <revision>
      <id>29158</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (U2)</title>
    <id>21376</id>
    <revision>
      <id>29159</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (U2XMP)</title>
    <id>21377</id>
    <revision>
      <id>29160</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (UDK)</title>
    <id>24598</id>
    <revision>
      <id>35865</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE3}}</text>
    </revision>
    <revision>
      <id>35866</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (UE2Runtime)</title>
    <id>21378</id>
    <revision>
      <id>29161</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (UT)</title>
    <id>21379</id>
    <revision>
      <id>29162</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (UT2003)</title>
    <id>21380</id>
    <revision>
      <id>29163</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (UT2004)</title>
    <id>21381</id>
    <revision>
      <id>29164</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Engine (UT3)</title>
    <id>21382</id>
    <revision>
      <id>29165</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Engine|Subsystem|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ExplodingWall (RTNP)</title>
    <id>21383</id>
    <revision>
      <id>29166</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ExplodingWall|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ExplodingWall (U1)</title>
    <id>21384</id>
    <revision>
      <id>29167</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ExplodingWall|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ExplodingWall (UT)</title>
    <id>21385</id>
    <revision>
      <id>29168</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ExplodingWall|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FX LinkTurretShield (UT2004)</title>
    <id>21458</id>
    <revision>
      <id>29241</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FX_LinkTurretShield|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FX SpaceFighter Explosion (UT2004)</title>
    <id>21459</id>
    <revision>
      <id>29242</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FX_SpaceFighter_Explosion|Emitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FX SpaceFighter Shield (UT2004)</title>
    <id>21460</id>
    <revision>
      <id>29243</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FX_SpaceFighter_Shield|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FX Turret IonCannon BeamFire (UT2004)</title>
    <id>21461</id>
    <revision>
      <id>29244</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FX_Turret_IonCannon_BeamFire|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FX Turret IonCannon LaserBeam (UT2004)</title>
    <id>21462</id>
    <revision>
      <id>29245</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FX_Turret_IonCannon_LaserBeam|Emitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fell (U2)</title>
    <id>21386</id>
    <revision>
      <id>29169</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fell|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fell (UE2Runtime)</title>
    <id>21387</id>
    <revision>
      <id>29170</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fell|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fell (UT2003)</title>
    <id>21388</id>
    <revision>
      <id>29171</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fell|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fell (UT2004)</title>
    <id>21389</id>
    <revision>
      <id>29172</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fell|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Female (RTNP)</title>
    <id>21390</id>
    <revision>
      <id>29173</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Female|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Female (U1)</title>
    <id>21391</id>
    <revision>
      <id>29174</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Female|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Female (UT)</title>
    <id>21392</id>
    <revision>
      <id>29175</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Female|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Female2Body (RTNP)</title>
    <id>21393</id>
    <revision>
      <id>29176</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Female2Body|FemaleBody|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Female2Body (U1)</title>
    <id>21394</id>
    <revision>
      <id>29177</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Female2Body|FemaleBody|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Female2Body (UT)</title>
    <id>21395</id>
    <revision>
      <id>29178</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Female2Body|FemaleBody|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBody (RTNP)</title>
    <id>21396</id>
    <revision>
      <id>29179</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBody|HumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBody (U1)</title>
    <id>21397</id>
    <revision>
      <id>29180</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBody|HumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBody (UT)</title>
    <id>21398</id>
    <revision>
      <id>29181</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBody|HumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBot (RTNP)</title>
    <id>21399</id>
    <revision>
      <id>29182</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBot|HumanBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBot (U1)</title>
    <id>21400</id>
    <revision>
      <id>29183</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBot|HumanBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBot (UT)</title>
    <id>21401</id>
    <revision>
      <id>29184</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBot|HumanBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FemaleBotPlus (UT)</title>
    <id>21402</id>
    <revision>
      <id>29185</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FemaleBotPlus|HumanBotPlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FieldGenerator (U2XMP)</title>
    <id>21403</id>
    <revision>
      <id>29186</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FieldGenerator|DeployedUnit|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FileWriter (UDK)</title>
    <id>24599</id>
    <revision>
      <id>35867</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FileWriter|Info|UE3}}</text>
    </revision>
    <revision>
      <id>35868</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|FileWriter|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FileWriter (UT3)</title>
    <id>21404</id>
    <revision>
      <id>29187</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FileWriter|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FilterPageBase (UT2004)</title>
    <id>21405</id>
    <revision>
      <id>29188</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FilterPageBase|LargeWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fireball (RTNP)</title>
    <id>21406</id>
    <revision>
      <id>29189</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fireball|GasbagBelch|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Flag1 (RTNP)</title>
    <id>21407</id>
    <revision>
      <id>29190</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Flag1|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Flag1 (U1)</title>
    <id>21408</id>
    <revision>
      <id>29191</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Flag1|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Flag1 (UT)</title>
    <id>21409</id>
    <revision>
      <id>29192</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Flag1|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakAltFire (UT2003)</title>
    <id>21410</id>
    <revision>
      <id>29193</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakAltFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakAltFire (UT2004)</title>
    <id>21411</id>
    <revision>
      <id>29194</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakAltFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakAmmo (UT)</title>
    <id>21412</id>
    <revision>
      <id>29195</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakAmmo|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakBox (RTNP)</title>
    <id>21413</id>
    <revision>
      <id>29196</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakBox|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakBox (U1)</title>
    <id>21414</id>
    <revision>
      <id>29197</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakBox|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakBox (UT)</title>
    <id>21415</id>
    <revision>
      <id>29198</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakBox|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakCannon (UT2003)</title>
    <id>21416</id>
    <revision>
      <id>29199</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakCannon|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakCannon (UT2004)</title>
    <id>21417</id>
    <revision>
      <id>29200</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakCannon|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakCannonPickup (UT2003)</title>
    <id>21418</id>
    <revision>
      <id>29201</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakCannonPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakCannonPickup (UT2004)</title>
    <id>21419</id>
    <revision>
      <id>29202</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakCannonPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakChunk (UT2003)</title>
    <id>21420</id>
    <revision>
      <id>29203</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakChunk|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakChunk (UT2004)</title>
    <id>21421</id>
    <revision>
      <id>29204</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakChunk|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakFire (UT2003)</title>
    <id>21422</id>
    <revision>
      <id>29205</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakFire (UT2004)</title>
    <id>21423</id>
    <revision>
      <id>29206</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakMuzFlash1st (UT2003)</title>
    <id>21424</id>
    <revision>
      <id>29207</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakMuzFlash1st|MinigunMuzFlash1st|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlakMuzFlash1st (UT2004)</title>
    <id>21425</id>
    <revision>
      <id>29208</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlakMuzFlash1st|MinigunMuzFlash1st|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Flashlight (RTNP)</title>
    <id>21428</id>
    <revision>
      <id>29211</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Flashlight|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Flashlight (U1)</title>
    <id>21429</id>
    <revision>
      <id>29212</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Flashlight|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Flashlight (UT)</title>
    <id>21430</id>
    <revision>
      <id>29213</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Flashlight|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FloatingWindow (UT2004)</title>
    <id>21431</id>
    <revision>
      <id>29214</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FloatingWindow|PopupPageBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockMasterPawn (RTNP)</title>
    <id>21432</id>
    <revision>
      <id>29215</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockMasterPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockMasterPawn (U1)</title>
    <id>21433</id>
    <revision>
      <id>29216</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockMasterPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockMasterPawn (UT)</title>
    <id>21434</id>
    <revision>
      <id>29217</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockMasterPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockPawn (RTNP)</title>
    <id>21435</id>
    <revision>
      <id>29218</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockPawn (U1)</title>
    <id>21436</id>
    <revision>
      <id>29219</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockPawn (UT)</title>
    <id>21437</id>
    <revision>
      <id>29220</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FlockTest Spawner (UT3)</title>
    <id>21438</id>
    <revision>
      <id>29221</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FlockTest_Spawner|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FluidSurfaceActor (UDK)</title>
    <id>24600</id>
    <revision>
      <id>35869</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FluidSurfaceActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35870</id>
      <timestamp>2009-11-06T17:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|FluidSurfaceActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FogVolumeDensityComponent (UDK)</title>
    <id>24601</id>
    <revision>
      <id>35871</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FogVolumeDensityComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35872</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|FogVolumeDensityComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FogVolumeDensityComponent (UT3)</title>
    <id>21439</id>
    <revision>
      <id>29222</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FogVolumeDensityComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FogVolumeDensityInfo (UDK)</title>
    <id>24602</id>
    <revision>
      <id>35873</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FogVolumeDensityInfo|Info|UE3}}</text>
    </revision>
    <revision>
      <id>35874</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|FogVolumeDensityInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FogVolumeDensityInfo (UT3)</title>
    <id>21440</id>
    <revision>
      <id>29223</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FogVolumeDensityInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Font (UDK)</title>
    <id>24603</id>
    <revision>
      <id>35875</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Font|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35876</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Font|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Font (UT3)</title>
    <id>21441</id>
    <revision>
      <id>29224</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Font|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Force (U2)</title>
    <id>21442</id>
    <revision>
      <id>29225</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Force|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Force (U2XMP)</title>
    <id>21443</id>
    <revision>
      <id>29226</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Force|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ForceFieldShape (UDK)</title>
    <id>24605</id>
    <revision>
      <id>35879</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ForceFieldShape|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35880</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ForceFieldShape|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ForcedReachSpec (UDK)</title>
    <id>24604</id>
    <revision>
      <id>35877</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ForcedReachSpec|ReachSpec|UE3}}</text>
    </revision>
    <revision>
      <id>35878</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ForcedReachSpec|ReachSpec|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ForcedReachSpec (UT3)</title>
    <id>21444</id>
    <revision>
      <id>29227</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ForcedReachSpec|ReachSpec|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (RTNP)</title>
    <id>21445</id>
    <revision>
      <id>29228</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (U1)</title>
    <id>21446</id>
    <revision>
      <id>29229</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (U2)</title>
    <id>21447</id>
    <revision>
      <id>29230</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (U2XMP)</title>
    <id>21448</id>
    <revision>
      <id>29231</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (UE2Runtime)</title>
    <id>21449</id>
    <revision>
      <id>29232</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (UT)</title>
    <id>21450</id>
    <revision>
      <id>29233</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (UT2003)</title>
    <id>21451</id>
    <revision>
      <id>29234</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FractalTexture (UT2004)</title>
    <id>21452</id>
    <revision>
      <id>29235</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FractalTexture|Texture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FracturedBaseComponent (UDK)</title>
    <id>24606</id>
    <revision>
      <id>35881</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FracturedBaseComponent|StaticMeshComponent|UE3}}</text>
    </revision>
    <revision>
      <id>35882</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|FracturedBaseComponent|StaticMeshComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of FracturedStaticMeshActor (UDK)</title>
    <id>24607</id>
    <revision>
      <id>35883</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|FracturedStaticMeshActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35884</id>
      <timestamp>2009-11-06T17:54:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|FracturedStaticMeshActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fragment (RTNP)</title>
    <id>21453</id>
    <revision>
      <id>29236</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fragment|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fragment (U1)</title>
    <id>21454</id>
    <revision>
      <id>29237</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fragment|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fragment (U2XMP)</title>
    <id>21455</id>
    <revision>
      <id>29238</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fragment|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fragment (UT)</title>
    <id>21456</id>
    <revision>
      <id>29239</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fragment|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Fragment1 (RTNP)</title>
    <id>21457</id>
    <revision>
      <id>29240</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Fragment1|Fragment|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GLGrenade (RTNP)</title>
    <id>21521</id>
    <revision>
      <id>29304</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GLGrenade|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUI (UE2Runtime)</title>
    <id>21528</id>
    <revision>
      <id>29311</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUI|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUI (UT2003)</title>
    <id>21529</id>
    <revision>
      <id>29312</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUI|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUI (UT2004)</title>
    <id>21530</id>
    <revision>
      <id>29313</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUI|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUI2Styles (UT2004)</title>
    <id>21531</id>
    <revision>
      <id>29314</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUI2Styles|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIArrayPropPage (UT2004)</title>
    <id>21532</id>
    <revision>
      <id>29315</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIArrayPropPage|GUICustomPropertyPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIBorder (UT2004)</title>
    <id>21533</id>
    <revision>
      <id>29316</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIBorder|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIButton (UE2Runtime)</title>
    <id>21534</id>
    <revision>
      <id>29317</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIButton|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIButton (UT2003)</title>
    <id>21535</id>
    <revision>
      <id>29318</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIButton|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIButton (UT2004)</title>
    <id>21536</id>
    <revision>
      <id>29319</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIButton|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUICharacterList (UT2003)</title>
    <id>21537</id>
    <revision>
      <id>29320</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUICharacterList|GUICircularList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUICharacterList (UT2004)</title>
    <id>21538</id>
    <revision>
      <id>29321</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUICharacterList|GUICircularList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUICircularList (UT2003)</title>
    <id>21539</id>
    <revision>
      <id>29322</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUICircularList|GUIListBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUICircularList (UT2004)</title>
    <id>21540</id>
    <revision>
      <id>29323</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUICircularList|GUIListBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIComponent (UE2Runtime)</title>
    <id>21541</id>
    <revision>
      <id>29324</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIComponent|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIComponent (UT2003)</title>
    <id>21542</id>
    <revision>
      <id>29325</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIComponent|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIComponent (UT2004)</title>
    <id>21543</id>
    <revision>
      <id>29326</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIComponent|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIController (UE2Runtime)</title>
    <id>21544</id>
    <revision>
      <id>29327</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIController|BaseGUIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIController (UT2004)</title>
    <id>21545</id>
    <revision>
      <id>29328</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIController|BaseGUIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUICustomPropertyPage (UT2004)</title>
    <id>21546</id>
    <revision>
      <id>29329</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUICustomPropertyPage|LockedFloatingWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIFilterPanel (UT2004)</title>
    <id>21547</id>
    <revision>
      <id>29330</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIFilterPanel|UT2K4PlayInfoPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIFont (UE2Runtime)</title>
    <id>21548</id>
    <revision>
      <id>29331</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIFont|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIFont (UT2003)</title>
    <id>21549</id>
    <revision>
      <id>29332</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIFont|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIFont (UT2004)</title>
    <id>21550</id>
    <revision>
      <id>29333</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIFont|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIFooter (UT2004)</title>
    <id>21551</id>
    <revision>
      <id>29334</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIFooter|GUIBorder|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIGFXButton (UE2Runtime)</title>
    <id>21552</id>
    <revision>
      <id>29335</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIGFXButton|GUIButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIGFXButton (UT2003)</title>
    <id>21553</id>
    <revision>
      <id>29336</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIGFXButton|GUIButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIGFXButton (UT2004)</title>
    <id>21554</id>
    <revision>
      <id>29337</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIGFXButton|GUIButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIGripButtonBase (UT2004)</title>
    <id>21555</id>
    <revision>
      <id>29338</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIGripButtonBase|GUIGFXButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIImage (UE2Runtime)</title>
    <id>21556</id>
    <revision>
      <id>29339</id>
      <timestamp>2008-05-23T14:39:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIImage|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIImage (UT2003)</title>
    <id>21557</id>
    <revision>
      <id>29340</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIImage|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIImage (UT2004)</title>
    <id>21558</id>
    <revision>
      <id>29341</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIImage|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUILabel (UT2004)</title>
    <id>21559</id>
    <revision>
      <id>29342</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUILabel|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIList (UE2Runtime)</title>
    <id>21560</id>
    <revision>
      <id>29343</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIList|GUIVertList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIList (UT2003)</title>
    <id>21561</id>
    <revision>
      <id>29344</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIList|GUIVertList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIList (UT2004)</title>
    <id>21562</id>
    <revision>
      <id>29345</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIList|GUIVertList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBase (UE2Runtime)</title>
    <id>21563</id>
    <revision>
      <id>29346</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBase|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBase (UT2003)</title>
    <id>21564</id>
    <revision>
      <id>29347</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBase|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBase (UT2004)</title>
    <id>21565</id>
    <revision>
      <id>29348</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBase|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBox (UT2004)</title>
    <id>21566</id>
    <revision>
      <id>29349</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBox|GUIListBoxBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBoxBase (UE2Runtime)</title>
    <id>21567</id>
    <revision>
      <id>29350</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBoxBase|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBoxBase (UT2003)</title>
    <id>21568</id>
    <revision>
      <id>29351</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBoxBase|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListBoxBase (UT2004)</title>
    <id>21569</id>
    <revision>
      <id>29352</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListBoxBase|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIListSpacer (UT2004)</title>
    <id>21570</id>
    <revision>
      <id>29353</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIListSpacer|GUIMenuOption|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMenuOption (UE2Runtime)</title>
    <id>21571</id>
    <revision>
      <id>29354</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMenuOption|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMenuOption (UT2003)</title>
    <id>21572</id>
    <revision>
      <id>29355</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMenuOption|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMenuOption (UT2004)</title>
    <id>21573</id>
    <revision>
      <id>29356</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMenuOption|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiColumnList (UE2Runtime)</title>
    <id>21574</id>
    <revision>
      <id>29357</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiColumnList|GUIVertList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiColumnList (UT2003)</title>
    <id>21575</id>
    <revision>
      <id>29358</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiColumnList|GUIVertList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiColumnList (UT2004)</title>
    <id>21576</id>
    <revision>
      <id>29359</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiColumnList|GUIVertList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiColumnListBox (UT2004)</title>
    <id>21577</id>
    <revision>
      <id>29360</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiColumnListBox|GUIListBoxBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiComponent (UE2Runtime)</title>
    <id>21578</id>
    <revision>
      <id>29361</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiComponent|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiComponent (UT2003)</title>
    <id>21579</id>
    <revision>
      <id>29362</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiComponent|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIMultiComponent (UT2004)</title>
    <id>21580</id>
    <revision>
      <id>29363</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIMultiComponent|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUINumericEdit (UT2004)</title>
    <id>21581</id>
    <revision>
      <id>29364</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUINumericEdit|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIPage (UE2Runtime)</title>
    <id>21582</id>
    <revision>
      <id>29365</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIPage|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIPage (UT2003)</title>
    <id>21583</id>
    <revision>
      <id>29366</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIPage|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIPage (UT2004)</title>
    <id>21584</id>
    <revision>
      <id>29367</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIPage|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIPanel (UE2Runtime)</title>
    <id>21585</id>
    <revision>
      <id>29368</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIPanel|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIPanel (UT2003)</title>
    <id>21586</id>
    <revision>
      <id>29369</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIPanel|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIPanel (UT2004)</title>
    <id>21587</id>
    <revision>
      <id>29370</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIPanel|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIQuestionPage (UT2004)</title>
    <id>21588</id>
    <revision>
      <id>29371</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIQuestionPage|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIScrollBarBase (UE2Runtime)</title>
    <id>21589</id>
    <revision>
      <id>29372</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIScrollBarBase|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIScrollBarBase (UT2003)</title>
    <id>21590</id>
    <revision>
      <id>29373</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIScrollBarBase|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIScrollBarBase (UT2004)</title>
    <id>21591</id>
    <revision>
      <id>29374</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIScrollBarBase|GUIMultiComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIScrollButtonBase (UT2004)</title>
    <id>21592</id>
    <revision>
      <id>29375</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIScrollButtonBase|GUIGFXButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIScrollZoneBase (UT2004)</title>
    <id>21593</id>
    <revision>
      <id>29376</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIScrollZoneBase|GUIComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUISectionBackground (UT2004)</title>
    <id>21594</id>
    <revision>
      <id>29377</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUISectionBackground|GUIImage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIStyles (UE2Runtime)</title>
    <id>21595</id>
    <revision>
      <id>29378</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIStyles|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIStyles (UT2003)</title>
    <id>21596</id>
    <revision>
      <id>29379</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIStyles|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIStyles (UT2004)</title>
    <id>21597</id>
    <revision>
      <id>29380</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIStyles|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUITabPanel (UE2Runtime)</title>
    <id>21598</id>
    <revision>
      <id>29381</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUITabPanel|GUIPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUITabPanel (UT2003)</title>
    <id>21599</id>
    <revision>
      <id>29382</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUITabPanel|GUIPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUITabPanel (UT2004)</title>
    <id>21600</id>
    <revision>
      <id>29383</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUITabPanel|GUIPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUITitleBar (UT2004)</title>
    <id>21601</id>
    <revision>
      <id>29384</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUITitleBar|GUIBorder|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIUserKeyBinding (UT2003)</title>
    <id>21602</id>
    <revision>
      <id>29385</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIUserKeyBinding|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIUserModInfo (UT2004)</title>
    <id>21603</id>
    <revision>
      <id>29386</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIUserModInfo|GUI|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertList (UE2Runtime)</title>
    <id>21604</id>
    <revision>
      <id>29387</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertList|GUIListBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertList (UT2003)</title>
    <id>21605</id>
    <revision>
      <id>29388</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertList|GUIListBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertList (UT2004)</title>
    <id>21606</id>
    <revision>
      <id>29389</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertList|GUIListBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertScrollBar (UT2004)</title>
    <id>21607</id>
    <revision>
      <id>29390</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertScrollBar|GUIScrollBarBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertScrollButton (UE2Runtime)</title>
    <id>21608</id>
    <revision>
      <id>29391</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertScrollButton|GUIGFXButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertScrollButton (UT2003)</title>
    <id>21609</id>
    <revision>
      <id>29392</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertScrollButton|GUIGFXButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GUIVertScrollButton (UT2004)</title>
    <id>21610</id>
    <revision>
      <id>29393</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GUIVertScrollButton|GUIScrollButtonBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameAIControllerImpl (U2XMP)</title>
    <id>21463</id>
    <revision>
      <id>29246</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameAIControllerImpl|GameAIControllerInterf|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameAIControllerInterf (U2XMP)</title>
    <id>21464</id>
    <revision>
      <id>29247</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameAIControllerInterf|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCameraBase (UDK)</title>
    <id>24608</id>
    <revision>
      <id>35885</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCameraBase|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35886</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCameraBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCrowdAgent (UDK)</title>
    <id>24609</id>
    <revision>
      <id>35887</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCrowdAgent|CrowdAgentBase|UE3}}</text>
    </revision>
    <revision>
      <id>35888</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCrowdAgent|CrowdAgentBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCrowdAgentBehavior (UDK)</title>
    <id>24610</id>
    <revision>
      <id>35889</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCrowdAgentBehavior|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35890</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCrowdAgentBehavior|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCrowdAgentSkeletal (UDK)</title>
    <id>24611</id>
    <revision>
      <id>35891</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCrowdAgentSkeletal|GameCrowdAgent|UE3}}</text>
    </revision>
    <revision>
      <id>35892</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCrowdAgentSkeletal|GameCrowdAgent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCrowdDestination (UDK)</title>
    <id>24612</id>
    <revision>
      <id>35893</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCrowdDestination|GameCrowdInteractionPoint|UE3}}</text>
    </revision>
    <revision>
      <id>35894</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCrowdDestination|GameCrowdInteractionPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCrowdForcePoint (UDK)</title>
    <id>24613</id>
    <revision>
      <id>35895</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCrowdForcePoint|GameCrowdInteractionPoint|UE3}}</text>
    </revision>
    <revision>
      <id>35896</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCrowdForcePoint|GameCrowdInteractionPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameCrowdInteractionPoint (UDK)</title>
    <id>24614</id>
    <revision>
      <id>35897</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameCrowdInteractionPoint|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35898</id>
      <timestamp>2009-11-06T17:54:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameCrowdInteractionPoint|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameHUD (UDK)</title>
    <id>24615</id>
    <revision>
      <id>35899</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameHUD|HUD|UE3}}</text>
    </revision>
    <revision>
      <id>35900</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameHUD|HUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameHUD (UT3)</title>
    <id>21465</id>
    <revision>
      <id>29248</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameHUD|HUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (RTNP)</title>
    <id>21466</id>
    <revision>
      <id>29249</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (U1)</title>
    <id>21467</id>
    <revision>
      <id>29250</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (U2)</title>
    <id>21468</id>
    <revision>
      <id>29251</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (U2XMP)</title>
    <id>21469</id>
    <revision>
      <id>29252</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (UDK)</title>
    <id>24616</id>
    <revision>
      <id>35901</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE3}}</text>
    </revision>
    <revision>
      <id>35902</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (UE2Runtime)</title>
    <id>21470</id>
    <revision>
      <id>29253</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (UT)</title>
    <id>21471</id>
    <revision>
      <id>29254</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (UT2003)</title>
    <id>21472</id>
    <revision>
      <id>29255</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (UT2004)</title>
    <id>21473</id>
    <revision>
      <id>29256</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameInfo (UT3)</title>
    <id>21474</id>
    <revision>
      <id>29257</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameMessage (U2)</title>
    <id>21475</id>
    <revision>
      <id>29258</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameObject (UT2003)</title>
    <id>21476</id>
    <revision>
      <id>29259</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameObject|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameObject (UT2004)</title>
    <id>21477</id>
    <revision>
      <id>29260</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameObject|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameObjective (UT2003)</title>
    <id>21478</id>
    <revision>
      <id>29261</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameObjective|JumpSpot|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameObjective (UT2004)</title>
    <id>21479</id>
    <revision>
      <id>29262</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameObjective|JumpSpot|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GamePawn (UDK)</title>
    <id>24617</id>
    <revision>
      <id>35903</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GamePawn|Pawn|UE3}}</text>
    </revision>
    <revision>
      <id>35904</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GamePawn|Pawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GamePawn (UT3)</title>
    <id>21480</id>
    <revision>
      <id>29263</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GamePawn|Pawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GamePlayerController (UDK)</title>
    <id>24618</id>
    <revision>
      <id>35905</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GamePlayerController|PlayerController|UE3}}</text>
    </revision>
    <revision>
      <id>35906</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GamePlayerController|PlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GamePlayerController (UT3)</title>
    <id>21481</id>
    <revision>
      <id>29264</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GamePlayerController|PlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GamePlayerInput (UDK)</title>
    <id>24619</id>
    <revision>
      <id>35907</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GamePlayerInput|PlayerInput|UE3}}</text>
    </revision>
    <revision>
      <id>35908</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GamePlayerInput|PlayerInput|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GamePlayerInput (UT3)</title>
    <id>21482</id>
    <revision>
      <id>29265</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GamePlayerInput|PlayerInput|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameProfile (UT2003)</title>
    <id>21483</id>
    <revision>
      <id>29266</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameProfile|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameProfile (UT2004)</title>
    <id>21484</id>
    <revision>
      <id>29267</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameProfile|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameReplicationInfo (U2XMP)</title>
    <id>21485</id>
    <revision>
      <id>29268</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameReplicationInfo (UDK)</title>
    <id>24623</id>
    <revision>
      <id>35915</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE3}}</text>
    </revision>
    <revision>
      <id>35916</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameReplicationInfo (UT)</title>
    <id>21486</id>
    <revision>
      <id>29269</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameReplicationInfo (UT2003)</title>
    <id>21487</id>
    <revision>
      <id>29270</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameReplicationInfo (UT2004)</title>
    <id>21488</id>
    <revision>
      <id>29271</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameReplicationInfo (UT3)</title>
    <id>21489</id>
    <revision>
      <id>29272</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameReplicationInfo|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameRules (U2XMP)</title>
    <id>21490</id>
    <revision>
      <id>29273</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameRules|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameRules (UT2003)</title>
    <id>21491</id>
    <revision>
      <id>29274</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameRules|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameRules (UT2004)</title>
    <id>21492</id>
    <revision>
      <id>29275</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameRules|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameRules (UT3)</title>
    <id>21493</id>
    <revision>
      <id>29276</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameRules|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameStats (U2)</title>
    <id>21494</id>
    <revision>
      <id>29277</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameStats|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameStats (UE2Runtime)</title>
    <id>21495</id>
    <revision>
      <id>29278</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameStats|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameStats (UT2003)</title>
    <id>21496</id>
    <revision>
      <id>29279</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameStats|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameStats (UT2004)</title>
    <id>21497</id>
    <revision>
      <id>29280</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameStats|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameStatsVisitorImpl (UDK)</title>
    <id>24624</id>
    <revision>
      <id>35917</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameStatsVisitorImpl|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35918</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameStatsVisitorImpl|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameStatsVisualizer (UDK)</title>
    <id>24625</id>
    <revision>
      <id>35919</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameStatsVisualizer|GameStatsVisitorImpl|UE3}}</text>
    </revision>
    <revision>
      <id>35920</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameStatsVisualizer|GameStatsVisitorImpl|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameThirdPersonCameraMode (UDK)</title>
    <id>24626</id>
    <revision>
      <id>35921</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameThirdPersonCameraMode|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35922</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameThirdPersonCameraMode|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameUISceneClient (UDK)</title>
    <id>24627</id>
    <revision>
      <id>35923</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameUISceneClient|UISceneClient|UE3}}</text>
    </revision>
    <revision>
      <id>35924</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameUISceneClient|UISceneClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameUISceneClient (UT3)</title>
    <id>21498</id>
    <revision>
      <id>29281</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameUISceneClient|UISceneClient|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameViewportClient (UDK)</title>
    <id>24628</id>
    <revision>
      <id>35925</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameViewportClient|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35926</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameViewportClient|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameViewportClient (UT3)</title>
    <id>21499</id>
    <revision>
      <id>29282</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameViewportClient|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameWeapon (UDK)</title>
    <id>24629</id>
    <revision>
      <id>35927</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameWeapon|Weapon|UE3}}</text>
    </revision>
    <revision>
      <id>35928</id>
      <timestamp>2009-11-06T17:54:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameWeapon|Weapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameWeapon (UT3)</title>
    <id>21500</id>
    <revision>
      <id>29283</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameWeapon|Weapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameplayEvents (UDK)</title>
    <id>24620</id>
    <revision>
      <id>35909</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameplayEvents|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35910</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameplayEvents|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameplayEventsReader (UDK)</title>
    <id>24621</id>
    <revision>
      <id>35911</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameplayEventsReader|GameplayEvents|UE3}}</text>
    </revision>
    <revision>
      <id>35912</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameplayEventsReader|GameplayEvents|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GameplayEventsWriter (UDK)</title>
    <id>24622</id>
    <revision>
      <id>35913</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GameplayEventsWriter|GameplayEvents|UE3}}</text>
    </revision>
    <revision>
      <id>35914</id>
      <timestamp>2009-11-06T17:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GameplayEventsWriter|GameplayEvents|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gasbag (RTNP)</title>
    <id>21501</id>
    <revision>
      <id>29284</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gasbag|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gasbag (U1)</title>
    <id>21502</id>
    <revision>
      <id>29285</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gasbag|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gasbag (UT)</title>
    <id>21503</id>
    <revision>
      <id>29286</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gasbag|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GasbagBelch (RTNP)</title>
    <id>21504</id>
    <revision>
      <id>29287</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GasbagBelch|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType (UDK)</title>
    <id>24630</id>
    <revision>
      <id>35929</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35930</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType (UT3)</title>
    <id>21505</id>
    <revision>
      <id>29288</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Archetype (UDK)</title>
    <id>24631</id>
    <revision>
      <id>35931</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Archetype|GenericBrowserType|UE3}}</text>
    </revision>
    <revision>
      <id>35932</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Archetype|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Archetype (UT3)</title>
    <id>21506</id>
    <revision>
      <id>29289</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Archetype|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Custom (UDK)</title>
    <id>24632</id>
    <revision>
      <id>35933</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Custom|GenericBrowserType|UE3}}</text>
    </revision>
    <revision>
      <id>35934</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Custom|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Custom (UT3)</title>
    <id>21507</id>
    <revision>
      <id>29290</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Custom|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Sounds (UDK)</title>
    <id>24633</id>
    <revision>
      <id>35935</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Sounds|GenericBrowserType|UE3}}</text>
    </revision>
    <revision>
      <id>35936</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Sounds|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Sounds (UT3)</title>
    <id>21508</id>
    <revision>
      <id>29291</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Sounds|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType StaticMesh (UDK)</title>
    <id>24634</id>
    <revision>
      <id>35937</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_StaticMesh|GenericBrowserType|UE3}}</text>
    </revision>
    <revision>
      <id>35938</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_StaticMesh|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Texture (UDK)</title>
    <id>24635</id>
    <revision>
      <id>35939</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Texture|GenericBrowserType|UE3}}</text>
    </revision>
    <revision>
      <id>35940</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Texture|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GenericBrowserType Texture (UT3)</title>
    <id>21509</id>
    <revision>
      <id>29292</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GenericBrowserType_Texture|GenericBrowserType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GeomModifier (UDK)</title>
    <id>24636</id>
    <revision>
      <id>35941</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GeomModifier|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35942</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GeomModifier|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GeomModifier (UT3)</title>
    <id>21512</id>
    <revision>
      <id>29295</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GeomModifier|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GeomModifier Edit (UDK)</title>
    <id>24637</id>
    <revision>
      <id>35943</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GeomModifier_Edit|GeomModifier|UE3}}</text>
    </revision>
    <revision>
      <id>35944</id>
      <timestamp>2009-11-06T17:54:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|GeomModifier_Edit|GeomModifier|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GeomModifier Edit (UT3)</title>
    <id>21513</id>
    <revision>
      <id>29296</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GeomModifier_Edit|GeomModifier|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GeometryCollider (U2)</title>
    <id>21510</id>
    <revision>
      <id>29293</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GeometryCollider|Force|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GeometryCollider (U2XMP)</title>
    <id>21511</id>
    <revision>
      <id>29294</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GeometryCollider|Force|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gib (UT2003)</title>
    <id>21514</id>
    <revision>
      <id>29297</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gib|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gib (UT2004)</title>
    <id>21515</id>
    <revision>
      <id>29298</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gib|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GibHead (UT2003)</title>
    <id>21517</id>
    <revision>
      <id>29300</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GibHead|Gib|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GibHead (UT2004)</title>
    <id>21518</id>
    <revision>
      <id>29301</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GibHead|Gib|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GibSet (U2XMP)</title>
    <id>21519</id>
    <revision>
      <id>29302</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GibSet|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GibSetMetal (U2XMP)</title>
    <id>21520</id>
    <revision>
      <id>29303</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GibSetMetal|GibSet|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gibbed (UT2004)</title>
    <id>21516</id>
    <revision>
      <id>29299</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gibbed|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GravityVolume (UT3)</title>
    <id>21522</id>
    <revision>
      <id>29305</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GravityVolume|PhysicsVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GreenSmokePuff (RTNP)</title>
    <id>21523</id>
    <revision>
      <id>29306</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GreenSmokePuff|SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GreenSmokePuff (U1)</title>
    <id>21524</id>
    <revision>
      <id>29307</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GreenSmokePuff|SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GreenSmokePuff (UT)</title>
    <id>21525</id>
    <revision>
      <id>29308</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GreenSmokePuff|SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GrenadeLauncher (U2)</title>
    <id>21526</id>
    <revision>
      <id>29309</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GrenadeLauncher|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GrenadeProjectile (U2)</title>
    <id>21527</id>
    <revision>
      <id>29310</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GrenadeProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Gunner (U2)</title>
    <id>21611</id>
    <revision>
      <id>29394</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Gunner|U2Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GunnerBlue (U2)</title>
    <id>21612</id>
    <revision>
      <id>29395</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GunnerBlue|Gunner|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of GunnerRed (U2)</title>
    <id>21613</id>
    <revision>
      <id>29396</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|GunnerRed|Gunner|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (RTNP)</title>
    <id>21625</id>
    <revision>
      <id>29408</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (U1)</title>
    <id>21626</id>
    <revision>
      <id>29409</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (U2XMP)</title>
    <id>21627</id>
    <revision>
      <id>29410</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (UDK)</title>
    <id>24638</id>
    <revision>
      <id>35945</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35946</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (UE2Runtime)</title>
    <id>21628</id>
    <revision>
      <id>29411</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (UT)</title>
    <id>21629</id>
    <revision>
      <id>29412</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUD (UT3)</title>
    <id>21632</id>
    <revision>
      <id>29415</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUD|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HUDMutator (UT)</title>
    <id>21641</id>
    <revision>
      <id>29424</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HUDMutator|Mutator|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HackTrigger (U2)</title>
    <id>21614</id>
    <revision>
      <id>29397</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HackTrigger|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HarbingerBubbleTurretBarrel (U2)</title>
    <id>21615</id>
    <revision>
      <id>29398</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HarbingerBubbleTurretBarrel|XMPVehicleBarrel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HarbingerTurretBarrel (U2)</title>
    <id>21616</id>
    <revision>
      <id>29399</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HarbingerTurretBarrel|XMPVehicleBarrel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Health (RTNP)</title>
    <id>21617</id>
    <revision>
      <id>29400</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Health|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Health (U1)</title>
    <id>21618</id>
    <revision>
      <id>29401</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Health|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Health (UT)</title>
    <id>21619</id>
    <revision>
      <id>29402</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Health|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HealthCharger (UT2004)</title>
    <id>21620</id>
    <revision>
      <id>29403</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HealthCharger|xPickUpBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HeavyWallHitEffect (RTNP)</title>
    <id>21621</id>
    <revision>
      <id>29404</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HeavyWallHitEffect|WallHitEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HorseFlySwarm (RTNP)</title>
    <id>21622</id>
    <revision>
      <id>29405</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HorseFlySwarm|FlockMasterPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HorseFlySwarm (U1)</title>
    <id>21623</id>
    <revision>
      <id>29406</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HorseFlySwarm|FlockMasterPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HorseFlySwarm (UT)</title>
    <id>21624</id>
    <revision>
      <id>29407</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HorseFlySwarm|FlockMasterPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Hud (UT2003)</title>
    <id>21630</id>
    <revision>
      <id>29413</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Hud|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Hud (UT2004)</title>
    <id>21631</id>
    <revision>
      <id>29414</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Hud|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudBDeathMatch (UT2003)</title>
    <id>21635</id>
    <revision>
      <id>29418</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudBDeathMatch|HudBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudBDeathMatch (UT2004)</title>
    <id>21636</id>
    <revision>
      <id>29419</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudBDeathMatch|HudBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudBTeamDeathMatch (UT2003)</title>
    <id>21637</id>
    <revision>
      <id>29420</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudBTeamDeathMatch|HudBDeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudBTeamDeathMatch (UT2004)</title>
    <id>21638</id>
    <revision>
      <id>29421</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudBTeamDeathMatch|HudBDeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudBase (UT2003)</title>
    <id>21633</id>
    <revision>
      <id>29416</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudBase|Hud|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudBase (UT2004)</title>
    <id>21634</id>
    <revision>
      <id>29417</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudBase|Hud|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudCDeathMatch (UT2004)</title>
    <id>21639</id>
    <revision>
      <id>29422</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudCDeathMatch|HudBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudCTeamDeathMatch (UT2004)</title>
    <id>21640</id>
    <revision>
      <id>29423</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudCTeamDeathMatch|HudCDeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HudOverlay (UT2004)</title>
    <id>21642</id>
    <revision>
      <id>29425</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HudOverlay|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Human (RTNP)</title>
    <id>21643</id>
    <revision>
      <id>29426</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Human|UnrealIPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Human (U1)</title>
    <id>21644</id>
    <revision>
      <id>29427</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Human|UnrealIPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Human (UT)</title>
    <id>21645</id>
    <revision>
      <id>29428</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Human|UnrealIPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanBot (RTNP)</title>
    <id>21646</id>
    <revision>
      <id>29429</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanBot|Bots|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanBot (U1)</title>
    <id>21647</id>
    <revision>
      <id>29430</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanBot|Bots|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanBot (UT)</title>
    <id>21648</id>
    <revision>
      <id>29431</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanBot|Bots|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanBotPlus (UT)</title>
    <id>21649</id>
    <revision>
      <id>29432</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanBotPlus|Bot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanCarcass (RTNP)</title>
    <id>21650</id>
    <revision>
      <id>29433</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanCarcass (U1)</title>
    <id>21651</id>
    <revision>
      <id>29434</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanCarcass (UT)</title>
    <id>21652</id>
    <revision>
      <id>29435</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of HumanDecoration (U2XMP)</title>
    <id>21653</id>
    <revision>
      <id>29436</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|HumanDecoration|U2Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of I3DL2Listener (U2)</title>
    <id>21654</id>
    <revision>
      <id>29437</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|I3DL2Listener|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of I3DL2Listener (U2XMP)</title>
    <id>21655</id>
    <revision>
      <id>29438</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|I3DL2Listener|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of I3DL2Listener (UE2Runtime)</title>
    <id>21656</id>
    <revision>
      <id>29439</id>
      <timestamp>2008-05-23T14:39:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|I3DL2Listener|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of I3DL2Listener (UT2003)</title>
    <id>21657</id>
    <revision>
      <id>29440</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|I3DL2Listener|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of I3DL2Listener (UT2004)</title>
    <id>21658</id>
    <revision>
      <id>29441</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|I3DL2Listener|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IAMultiColumnRulesPanel (UT2004)</title>
    <id>21659</id>
    <revision>
      <id>29442</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IAMultiColumnRulesPanel|UT2K4PlayInfoPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IRC Channel (UT2003)</title>
    <id>21735</id>
    <revision>
      <id>29518</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IRC_Channel|IRC_Page|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IRC Channel (UT2004)</title>
    <id>21736</id>
    <revision>
      <id>29519</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IRC_Channel|IRC_Page|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IRC Page (UT2003)</title>
    <id>21737</id>
    <revision>
      <id>29520</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IRC_Page|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IRC Page (UT2004)</title>
    <id>21738</id>
    <revision>
      <id>29521</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IRC_Page|UT2K3TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IconThumbnailRenderer (UDK)</title>
    <id>24639</id>
    <revision>
      <id>35947</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IconThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>35948</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|IconThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IconThumbnailRenderer (UT3)</title>
    <id>21660</id>
    <revision>
      <id>29443</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IconThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ImageServer (U2)</title>
    <id>21661</id>
    <revision>
      <id>29444</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ImageServer|WebApplication|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ImageServer (UT)</title>
    <id>21662</id>
    <revision>
      <id>29445</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ImageServer|WebApplication|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ImageServer (UT2003)</title>
    <id>21663</id>
    <revision>
      <id>29446</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ImageServer|WebApplication|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ImageServer (UT2004)</title>
    <id>21664</id>
    <revision>
      <id>29447</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ImageServer|WebApplication|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ImageServer (UT3)</title>
    <id>21665</id>
    <revision>
      <id>29448</id>
      <timestamp>2008-05-18T15:24:34Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ImageServer|WebApplication|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ImpactHandler (U2XMP)</title>
    <id>21666</id>
    <revision>
      <id>29449</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ImpactHandler|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (RTNP)</title>
    <id>21667</id>
    <revision>
      <id>29450</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (U1)</title>
    <id>21668</id>
    <revision>
      <id>29451</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (U2)</title>
    <id>21669</id>
    <revision>
      <id>29452</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (U2XMP)</title>
    <id>21670</id>
    <revision>
      <id>29453</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (UDK)</title>
    <id>24640</id>
    <revision>
      <id>35949</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35950</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (UE2Runtime)</title>
    <id>21671</id>
    <revision>
      <id>29454</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (UT)</title>
    <id>21672</id>
    <revision>
      <id>29455</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (UT2003)</title>
    <id>21673</id>
    <revision>
      <id>29456</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (UT2004)</title>
    <id>21674</id>
    <revision>
      <id>29457</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Info (UT3)</title>
    <id>21675</id>
    <revision>
      <id>29458</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Info|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IniLocPatcher (UDK)</title>
    <id>24641</id>
    <revision>
      <id>35951</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IniLocPatcher|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35952</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|IniLocPatcher|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Input (UDK)</title>
    <id>24642</id>
    <revision>
      <id>35953</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Input|Interaction|UE3}}</text>
    </revision>
    <revision>
      <id>35954</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Input|Interaction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Input (UT3)</title>
    <id>21676</id>
    <revision>
      <id>29459</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Input|Interaction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InstantFire (UT2003)</title>
    <id>21677</id>
    <revision>
      <id>29460</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InstantFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InstantFire (UT2004)</title>
    <id>21678</id>
    <revision>
      <id>29461</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InstantFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interaction (UDK)</title>
    <id>24643</id>
    <revision>
      <id>35955</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interaction|UIRoot|UE3}}</text>
    </revision>
    <revision>
      <id>35956</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Interaction|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interaction (UE2Runtime)</title>
    <id>21679</id>
    <revision>
      <id>29462</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interaction|Interactions|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interaction (UT2003)</title>
    <id>21680</id>
    <revision>
      <id>29463</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interaction|Interactions|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interaction (UT2004)</title>
    <id>21681</id>
    <revision>
      <id>29464</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interaction|Interactions|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interaction (UT3)</title>
    <id>21682</id>
    <revision>
      <id>29465</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interaction|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interactions (UE2Runtime)</title>
    <id>21683</id>
    <revision>
      <id>29466</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interactions|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interactions (UT2003)</title>
    <id>21684</id>
    <revision>
      <id>29467</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interactions|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Interactions (UT2004)</title>
    <id>21685</id>
    <revision>
      <id>29468</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Interactions|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IntermissionInfo (RTNP)</title>
    <id>21686</id>
    <revision>
      <id>29469</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IntermissionInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (RTNP)</title>
    <id>21687</id>
    <revision>
      <id>29470</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (U1)</title>
    <id>21688</id>
    <revision>
      <id>29471</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (U2)</title>
    <id>21689</id>
    <revision>
      <id>29472</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (U2XMP)</title>
    <id>21690</id>
    <revision>
      <id>29473</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (UE2Runtime)</title>
    <id>21691</id>
    <revision>
      <id>29474</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (UT)</title>
    <id>21692</id>
    <revision>
      <id>29475</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (UT2003)</title>
    <id>21693</id>
    <revision>
      <id>29476</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (UT2004)</title>
    <id>21694</id>
    <revision>
      <id>29477</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetInfo (UT3)</title>
    <id>21695</id>
    <revision>
      <id>29478</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (RTNP)</title>
    <id>21696</id>
    <revision>
      <id>29479</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (U1)</title>
    <id>21697</id>
    <revision>
      <id>29480</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (U2)</title>
    <id>21698</id>
    <revision>
      <id>29481</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (U2XMP)</title>
    <id>21699</id>
    <revision>
      <id>29482</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (UDK)</title>
    <id>24645</id>
    <revision>
      <id>35959</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|Info|UE3}}</text>
    </revision>
    <revision>
      <id>35960</id>
      <timestamp>2009-11-06T17:54:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InternetLink|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (UE2Runtime)</title>
    <id>21700</id>
    <revision>
      <id>29483</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (UT)</title>
    <id>21701</id>
    <revision>
      <id>29484</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (UT2003)</title>
    <id>21702</id>
    <revision>
      <id>29485</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (UT2004)</title>
    <id>21703</id>
    <revision>
      <id>29486</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InternetLink (UT3)</title>
    <id>21704</id>
    <revision>
      <id>29487</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InternetLink|InternetInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpActor (UDK)</title>
    <id>28691</id>
    <revision>
      <id>40632</id>
      <timestamp>2010-01-17T12:24:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpActor|DynamicSMActor|UE3}}</text>
    </revision>
    <revision>
      <id>40633</id>
      <timestamp>2010-01-17T12:36:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category subclasses|InterpActor|DynamicSMActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpFilter (UDK)</title>
    <id>24646</id>
    <revision>
      <id>35961</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpFilter|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35962</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpFilter|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpFilter (UT3)</title>
    <id>21705</id>
    <revision>
      <id>29488</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpFilter|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpGroup (UDK)</title>
    <id>24647</id>
    <revision>
      <id>35963</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpGroup|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35964</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpGroup|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpGroup (UT3)</title>
    <id>21706</id>
    <revision>
      <id>29489</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpGroup|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpGroupInst (UDK)</title>
    <id>24648</id>
    <revision>
      <id>35965</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpGroupInst|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35966</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpGroupInst|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpGroupInst (UT3)</title>
    <id>21707</id>
    <revision>
      <id>29490</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpGroupInst|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrack (UDK)</title>
    <id>24649</id>
    <revision>
      <id>35967</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrack|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35968</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrack|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrack (UT3)</title>
    <id>21710</id>
    <revision>
      <id>29493</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrack|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackFloatBase (UDK)</title>
    <id>24650</id>
    <revision>
      <id>35969</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackFloatBase|InterpTrack|UE3}}</text>
    </revision>
    <revision>
      <id>35970</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackFloatBase|InterpTrack|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackFloatBase (UT3)</title>
    <id>21711</id>
    <revision>
      <id>29494</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackFloatBase|InterpTrack|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackHelper (UDK)</title>
    <id>24651</id>
    <revision>
      <id>35971</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackHelper|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35972</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackHelper|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackHelper (UT3)</title>
    <id>21712</id>
    <revision>
      <id>29495</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackHelper|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackInst (UDK)</title>
    <id>24652</id>
    <revision>
      <id>35973</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackInst|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35974</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackInst|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackInst (UT3)</title>
    <id>21713</id>
    <revision>
      <id>29496</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackInst|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackInstProperty (UDK)</title>
    <id>24653</id>
    <revision>
      <id>35975</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackInstProperty|InterpTrackInst|UE3}}</text>
    </revision>
    <revision>
      <id>35976</id>
      <timestamp>2009-11-06T17:54:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackInstProperty|InterpTrackInst|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackInstProperty (UT3)</title>
    <id>21714</id>
    <revision>
      <id>29497</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackInstProperty|InterpTrackInst|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackLinearColorBase (UDK)</title>
    <id>24654</id>
    <revision>
      <id>35977</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackLinearColorBase|InterpTrack|UE3}}</text>
    </revision>
    <revision>
      <id>35978</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackLinearColorBase|InterpTrack|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackVectorBase (UDK)</title>
    <id>24655</id>
    <revision>
      <id>35979</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackVectorBase|InterpTrack|UE3}}</text>
    </revision>
    <revision>
      <id>35980</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackVectorBase|InterpTrack|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackVectorBase (UT3)</title>
    <id>21715</id>
    <revision>
      <id>29498</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackVectorBase|InterpTrack|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackVectorPropHelper (UDK)</title>
    <id>24656</id>
    <revision>
      <id>35981</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackVectorPropHelper|InterpTrackHelper|UE3}}</text>
    </revision>
    <revision>
      <id>35982</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InterpTrackVectorPropHelper|InterpTrackHelper|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpTrackVectorPropHelper (UT3)</title>
    <id>21716</id>
    <revision>
      <id>29499</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpTrackVectorPropHelper|InterpTrackHelper|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpolationPoint (RTNP)</title>
    <id>21708</id>
    <revision>
      <id>29491</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpolationPoint|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InterpolationPoint (U1)</title>
    <id>21709</id>
    <revision>
      <id>29492</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InterpolationPoint|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Intro (RTNP)</title>
    <id>21717</id>
    <revision>
      <id>29500</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Intro|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of IntroNullHud (RTNP)</title>
    <id>21718</id>
    <revision>
      <id>29501</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|IntroNullHud|UnrealHUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (RTNP)</title>
    <id>21719</id>
    <revision>
      <id>29502</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (U1)</title>
    <id>21720</id>
    <revision>
      <id>29503</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (U2)</title>
    <id>21721</id>
    <revision>
      <id>29504</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (U2XMP)</title>
    <id>21722</id>
    <revision>
      <id>29505</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (UDK)</title>
    <id>24657</id>
    <revision>
      <id>35983</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35984</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (UE2Runtime)</title>
    <id>21723</id>
    <revision>
      <id>29506</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (UT)</title>
    <id>21724</id>
    <revision>
      <id>29507</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (UT2003)</title>
    <id>21725</id>
    <revision>
      <id>29508</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (UT2004)</title>
    <id>21726</id>
    <revision>
      <id>29509</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Inventory (UT3)</title>
    <id>21727</id>
    <revision>
      <id>29510</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Inventory|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryAttachment (U2)</title>
    <id>21728</id>
    <revision>
      <id>29511</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryAttachment (U2XMP)</title>
    <id>21729</id>
    <revision>
      <id>29512</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryAttachment (UE2Runtime)</title>
    <id>21730</id>
    <revision>
      <id>29513</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryAttachment (UT2003)</title>
    <id>21731</id>
    <revision>
      <id>29514</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryAttachment (UT2004)</title>
    <id>21732</id>
    <revision>
      <id>29515</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryAttachment|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryDataProvider (UDK)</title>
    <id>24658</id>
    <revision>
      <id>35985</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryDataProvider|UIDynamicDataProvider|UE3}}</text>
    </revision>
    <revision>
      <id>35986</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InventoryDataProvider|UIDynamicDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryDataProvider (UT3)</title>
    <id>21733</id>
    <revision>
      <id>29516</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryDataProvider|UIDynamicDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryManager (UDK)</title>
    <id>24659</id>
    <revision>
      <id>35987</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryManager|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35988</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|InventoryManager|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of InventoryManager (UT3)</title>
    <id>21734</id>
    <revision>
      <id>29517</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|InventoryManager|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Isaak (U2XMP)</title>
    <id>21739</id>
    <revision>
      <id>29522</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Isaak|U2PawnAtlantis|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JuggernautFrontTurretBarrel (U2)</title>
    <id>21740</id>
    <revision>
      <id>29523</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JuggernautFrontTurretBarrel|XMPVehicleBarrel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JuggernautTurretBarrelBase (U2)</title>
    <id>21741</id>
    <revision>
      <id>29524</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JuggernautTurretBarrelBase|XMPVehicleBarrel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpDest (UT2003)</title>
    <id>21742</id>
    <revision>
      <id>29525</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpDest|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpDest (UT2004)</title>
    <id>21743</id>
    <revision>
      <id>29526</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpDest|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpPad (U2)</title>
    <id>21744</id>
    <revision>
      <id>29527</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpPad|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpPad (UT2003)</title>
    <id>21745</id>
    <revision>
      <id>29528</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpPad|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpPad (UT2004)</title>
    <id>21746</id>
    <revision>
      <id>29529</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpPad|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpSpot (UT2003)</title>
    <id>21747</id>
    <revision>
      <id>29530</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpSpot|JumpDest|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of JumpSpot (UT2004)</title>
    <id>21748</id>
    <revision>
      <id>29531</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|JumpSpot|JumpDest|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (U2)</title>
    <id>21749</id>
    <revision>
      <id>29532</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (U2XMP)</title>
    <id>21750</id>
    <revision>
      <id>29533</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (UDK)</title>
    <id>24660</id>
    <revision>
      <id>35989</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|DynamicSMActor|UE3}}</text>
    </revision>
    <revision>
      <id>35990</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|KActor|DynamicSMActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (UE2Runtime)</title>
    <id>21751</id>
    <revision>
      <id>29534</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (UT2003)</title>
    <id>21752</id>
    <revision>
      <id>29535</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (UT2004)</title>
    <id>21753</id>
    <revision>
      <id>29536</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KActor (UT3)</title>
    <id>21754</id>
    <revision>
      <id>29537</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KActor|DynamicSMActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KArt (U2XMP)</title>
    <id>21764</id>
    <revision>
      <id>29547</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KArt|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KAsset (UDK)</title>
    <id>24661</id>
    <revision>
      <id>35991</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KAsset|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35992</id>
      <timestamp>2009-11-06T17:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|KAsset|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KAsset (UT3)</title>
    <id>21765</id>
    <revision>
      <id>29548</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KAsset|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KCar (U2)</title>
    <id>21766</id>
    <revision>
      <id>29549</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KCar|KVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KCar (UT2003)</title>
    <id>21767</id>
    <revision>
      <id>29550</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KCar|KVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KCar (UT2004)</title>
    <id>21768</id>
    <revision>
      <id>29551</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KCar|KVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KConstraint (U2)</title>
    <id>21769</id>
    <revision>
      <id>29552</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KConstraint|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KConstraint (U2XMP)</title>
    <id>21770</id>
    <revision>
      <id>29553</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KConstraint|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KConstraint (UE2Runtime)</title>
    <id>21771</id>
    <revision>
      <id>29554</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KConstraint|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KConstraint (UT2003)</title>
    <id>21772</id>
    <revision>
      <id>29555</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KConstraint|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KConstraint (UT2004)</title>
    <id>21773</id>
    <revision>
      <id>29556</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KConstraint|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KMeshProps (UDK)</title>
    <id>24664</id>
    <revision>
      <id>35997</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KMeshProps|Object|UE3}}</text>
    </revision>
    <revision>
      <id>35998</id>
      <timestamp>2009-11-06T17:54:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|KMeshProps|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KMeshProps (UT3)</title>
    <id>21787</id>
    <revision>
      <id>29570</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KMeshProps|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KTire (U2)</title>
    <id>21798</id>
    <revision>
      <id>29581</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KTire|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KTire (UT2003)</title>
    <id>21799</id>
    <revision>
      <id>29582</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KTire|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KTire (UT2004)</title>
    <id>21800</id>
    <revision>
      <id>29583</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KTire|KActor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KVehicle (U2)</title>
    <id>21801</id>
    <revision>
      <id>29584</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KVehicle|Vehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KVehicle (UT2003)</title>
    <id>21802</id>
    <revision>
      <id>29585</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KVehicle|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KVehicle (UT2004)</title>
    <id>21803</id>
    <revision>
      <id>29586</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KVehicle|Vehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KVehicleFactory (UT2003)</title>
    <id>21804</id>
    <revision>
      <id>29587</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KVehicleFactory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KVehicleFactory (UT2004)</title>
    <id>21805</id>
    <revision>
      <id>29588</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KVehicleFactory|SVehicleFactory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParams (U2)</title>
    <id>21755</id>
    <revision>
      <id>29538</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParams|KarmaParamsCollision|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParams (U2XMP)</title>
    <id>21756</id>
    <revision>
      <id>29539</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParams|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParams (UE2Runtime)</title>
    <id>21757</id>
    <revision>
      <id>29540</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParams|KarmaParamsCollision|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParams (UT2003)</title>
    <id>21758</id>
    <revision>
      <id>29541</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParams|KarmaParamsCollision|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParams (UT2004)</title>
    <id>21759</id>
    <revision>
      <id>29542</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParams|KarmaParamsCollision|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParamsCollision (U2)</title>
    <id>21760</id>
    <revision>
      <id>29543</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParamsCollision|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParamsCollision (UE2Runtime)</title>
    <id>21761</id>
    <revision>
      <id>29544</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParamsCollision|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParamsCollision (UT2003)</title>
    <id>21762</id>
    <revision>
      <id>29545</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParamsCollision|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KarmaParamsCollision (UT2004)</title>
    <id>21763</id>
    <revision>
      <id>29546</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KarmaParamsCollision|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KeyBindMenu (UT2004)</title>
    <id>21774</id>
    <revision>
      <id>29557</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KeyBindMenu|LockedFloatingWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (RTNP)</title>
    <id>21775</id>
    <revision>
      <id>29558</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (U1)</title>
    <id>21776</id>
    <revision>
      <id>29559</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (U2)</title>
    <id>21777</id>
    <revision>
      <id>29560</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (U2XMP)</title>
    <id>21778</id>
    <revision>
      <id>29561</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (UDK)</title>
    <id>24662</id>
    <revision>
      <id>35993</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>35994</id>
      <timestamp>2009-11-06T17:54:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (UE2Runtime)</title>
    <id>21779</id>
    <revision>
      <id>29562</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (UT)</title>
    <id>21780</id>
    <revision>
      <id>29563</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (UT2003)</title>
    <id>21781</id>
    <revision>
      <id>29564</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (UT2004)</title>
    <id>21782</id>
    <revision>
      <id>29565</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Keypoint (UT3)</title>
    <id>21783</id>
    <revision>
      <id>29566</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Keypoint|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KillPoint (RTNP)</title>
    <id>21784</id>
    <revision>
      <id>29567</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KillPoint|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KillTrigger (RTNP)</title>
    <id>21785</id>
    <revision>
      <id>29568</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KillTrigger|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KillZDamageType (UDK)</title>
    <id>24663</id>
    <revision>
      <id>35995</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KillZDamageType|DamageType|UE3}}</text>
    </revision>
    <revision>
      <id>35996</id>
      <timestamp>2009-11-06T17:54:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|KillZDamageType|DamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KillZDamageType (UT3)</title>
    <id>21786</id>
    <revision>
      <id>29569</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KillZDamageType|DamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KraalBolt (RTNP)</title>
    <id>21788</id>
    <revision>
      <id>29571</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KraalBolt|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KraalBolt (U1)</title>
    <id>21789</id>
    <revision>
      <id>29572</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KraalBolt|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KraalBolt (UT)</title>
    <id>21790</id>
    <revision>
      <id>29573</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KraalBolt|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Krall (RTNP)</title>
    <id>21791</id>
    <revision>
      <id>29574</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Krall|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Krall (U1)</title>
    <id>21792</id>
    <revision>
      <id>29575</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Krall|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Krall (UT)</title>
    <id>21793</id>
    <revision>
      <id>29576</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Krall|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Krall (UT2003)</title>
    <id>21794</id>
    <revision>
      <id>29577</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Krall|Monster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Krall (UT2004)</title>
    <id>21795</id>
    <revision>
      <id>29578</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Krall|Monster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KrallBolt (UT2003)</title>
    <id>21796</id>
    <revision>
      <id>29579</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KrallBolt|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of KrallBolt (UT2004)</title>
    <id>21797</id>
    <revision>
      <id>29580</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|KrallBolt|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LG ParticleDamage (U2XMP)</title>
    <id>21832</id>
    <revision>
      <id>29615</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LG_ParticleDamage|ParticleDamage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LGalt GeometryCollider (U2XMP)</title>
    <id>21830</id>
    <revision>
      <id>29613</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LGalt_GeometryCollider|GeometryCollider|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LGalt GeometryColliderFertile (U2XMP)</title>
    <id>21831</id>
    <revision>
      <id>29614</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LGalt_GeometryColliderFertile|LGalt_GeometryCollider|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (U2)</title>
    <id>21806</id>
    <revision>
      <id>29589</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (U2XMP)</title>
    <id>21807</id>
    <revision>
      <id>29590</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (UDK)</title>
    <id>24665</id>
    <revision>
      <id>35999</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36000</id>
      <timestamp>2009-11-06T17:54:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Ladder|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (UE2Runtime)</title>
    <id>21808</id>
    <revision>
      <id>29591</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (UT)</title>
    <id>21809</id>
    <revision>
      <id>29592</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (UT2003)</title>
    <id>21810</id>
    <revision>
      <id>29593</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (UT2004)</title>
    <id>21811</id>
    <revision>
      <id>29594</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ladder (UT3)</title>
    <id>21812</id>
    <revision>
      <id>29595</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ladder|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LadderCTF (UT)</title>
    <id>21813</id>
    <revision>
      <id>29596</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LadderCTF|Ladder|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LadderDM (UT)</title>
    <id>21814</id>
    <revision>
      <id>29597</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LadderDM|Ladder|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LadderInfo (UT2003)</title>
    <id>21815</id>
    <revision>
      <id>29598</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LadderInfo|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LadderInfo (UT2004)</title>
    <id>21816</id>
    <revision>
      <id>29599</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LadderInfo|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LargeWindow (UT2004)</title>
    <id>21817</id>
    <revision>
      <id>29600</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LargeWindow|FloatingWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LatentScriptedAction (U2)</title>
    <id>21818</id>
    <revision>
      <id>29601</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LatentScriptedAction|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LatentScriptedAction (UE2Runtime)</title>
    <id>21819</id>
    <revision>
      <id>29602</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LatentScriptedAction|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LatentScriptedAction (UT2003)</title>
    <id>21820</id>
    <revision>
      <id>29603</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LatentScriptedAction|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LatentScriptedAction (UT2004)</title>
    <id>21821</id>
    <revision>
      <id>29604</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LatentScriptedAction|ScriptedAction|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Leg1 (RTNP)</title>
    <id>21822</id>
    <revision>
      <id>29605</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Leg1|PlayerChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Leg1 (U1)</title>
    <id>21823</id>
    <revision>
      <id>29606</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Leg1|PlayerChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Leg1 (UT)</title>
    <id>21824</id>
    <revision>
      <id>29607</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Leg1|PlayerChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LegendActorComponent (U2XMP)</title>
    <id>21825</id>
    <revision>
      <id>29608</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LegendActorComponent|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LegendObjectComponent (U2XMP)</title>
    <id>21826</id>
    <revision>
      <id>29609</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LegendObjectComponent|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LevelChange (U2XMP)</title>
    <id>21827</id>
    <revision>
      <id>29610</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LevelChange|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LevelListReplicationInfo (U2XMP)</title>
    <id>21828</id>
    <revision>
      <id>29611</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LevelListReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LevelStreaming (UDK)</title>
    <id>24666</id>
    <revision>
      <id>36001</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LevelStreaming|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36002</id>
      <timestamp>2009-11-06T17:54:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|LevelStreaming|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LevelStreaming (UT3)</title>
    <id>21829</id>
    <revision>
      <id>29612</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LevelStreaming|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LicenseeController (U2XMP)</title>
    <id>21833</id>
    <revision>
      <id>29616</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LicenseeController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LicenseePawn (U2XMP)</title>
    <id>21834</id>
    <revision>
      <id>29617</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LicenseePawn|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LiftCenter (U2XMP)</title>
    <id>21835</id>
    <revision>
      <id>29618</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LiftCenter|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LiftCenter (UT)</title>
    <id>21836</id>
    <revision>
      <id>29619</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LiftCenter|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LiftExit (UDK)</title>
    <id>24667</id>
    <revision>
      <id>36003</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LiftExit|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36004</id>
      <timestamp>2009-11-06T17:54:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|LiftExit|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LiftExit (UT)</title>
    <id>21837</id>
    <revision>
      <id>29620</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LiftExit|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LiftExit (UT3)</title>
    <id>21838</id>
    <revision>
      <id>29621</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LiftExit|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (RTNP)</title>
    <id>21839</id>
    <revision>
      <id>29622</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (U1)</title>
    <id>21840</id>
    <revision>
      <id>29623</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (U2)</title>
    <id>21841</id>
    <revision>
      <id>29624</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (U2XMP)</title>
    <id>21842</id>
    <revision>
      <id>29625</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (UDK)</title>
    <id>24668</id>
    <revision>
      <id>36005</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36006</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (UE2Runtime)</title>
    <id>21843</id>
    <revision>
      <id>29626</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (UT)</title>
    <id>21844</id>
    <revision>
      <id>29627</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (UT2003)</title>
    <id>21845</id>
    <revision>
      <id>29628</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (UT2004)</title>
    <id>21846</id>
    <revision>
      <id>29629</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Light (UT3)</title>
    <id>21847</id>
    <revision>
      <id>29630</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Light|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LightComponent (UDK)</title>
    <id>24669</id>
    <revision>
      <id>36007</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LightComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36008</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|LightComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LightComponent (UT3)</title>
    <id>21848</id>
    <revision>
      <id>29631</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LightComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LightEnvironmentComponent (UDK)</title>
    <id>24670</id>
    <revision>
      <id>36009</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LightEnvironmentComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36010</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|LightEnvironmentComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LightEnvironmentComponent (UT3)</title>
    <id>21849</id>
    <revision>
      <id>29632</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LightEnvironmentComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LightWallHitEffect (RTNP)</title>
    <id>21850</id>
    <revision>
      <id>29633</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LightWallHitEffect|WallHitEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LineDot (U2XMP)</title>
    <id>21851</id>
    <revision>
      <id>29634</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LineDot|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkAttachment (UT2004)</title>
    <id>21852</id>
    <revision>
      <id>29635</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkAttachment|xWeaponAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkBeamEffect (UT2004)</title>
    <id>21853</id>
    <revision>
      <id>29636</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkBeamEffect|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkFire (UT2004)</title>
    <id>21854</id>
    <revision>
      <id>29637</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkGun (UT2004)</title>
    <id>21855</id>
    <revision>
      <id>29638</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkGun|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkProjSparks (UT2003)</title>
    <id>21856</id>
    <revision>
      <id>29639</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkProjSparks|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkProjSparks (UT2004)</title>
    <id>21857</id>
    <revision>
      <id>29640</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkProjSparks|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkSmoke (UT2003)</title>
    <id>21858</id>
    <revision>
      <id>29641</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkSmoke|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LinkSmoke (UT2004)</title>
    <id>21859</id>
    <revision>
      <id>29642</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LinkSmoke|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (U2)</title>
    <id>21860</id>
    <revision>
      <id>29643</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (U2XMP)</title>
    <id>21861</id>
    <revision>
      <id>29644</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (UDK)</title>
    <id>24671</id>
    <revision>
      <id>36011</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36012</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (UE2Runtime)</title>
    <id>21862</id>
    <revision>
      <id>29645</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (UT)</title>
    <id>21863</id>
    <revision>
      <id>29646</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (UT2003)</title>
    <id>21864</id>
    <revision>
      <id>29647</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (UT2004)</title>
    <id>21865</id>
    <revision>
      <id>29648</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessage (UT3)</title>
    <id>21866</id>
    <revision>
      <id>29649</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessage|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocalMessagePlus (UT)</title>
    <id>21867</id>
    <revision>
      <id>29650</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocalMessagePlus|LocalMessage|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocatorForce (U2)</title>
    <id>21868</id>
    <revision>
      <id>29651</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocatorForce|Force|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LocatorForce (U2XMP)</title>
    <id>21869</id>
    <revision>
      <id>29652</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LocatorForce|Force|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LockedFloatingWindow (UT2004)</title>
    <id>21870</id>
    <revision>
      <id>29653</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LockedFloatingWindow|FloatingWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of LookTarget (UT2004)</title>
    <id>21871</id>
    <revision>
      <id>29654</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|LookTarget|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MCPBase (UDK)</title>
    <id>24685</id>
    <revision>
      <id>36039</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MCPBase|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36040</id>
      <timestamp>2009-11-06T17:54:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MCPBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Male (RTNP)</title>
    <id>21872</id>
    <revision>
      <id>29655</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Male|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Male (U1)</title>
    <id>21873</id>
    <revision>
      <id>29656</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Male|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Male (UT)</title>
    <id>21874</id>
    <revision>
      <id>29657</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Male|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBody (RTNP)</title>
    <id>21875</id>
    <revision>
      <id>29658</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBody|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBody (U1)</title>
    <id>21876</id>
    <revision>
      <id>29659</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBody|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBody (UT)</title>
    <id>21877</id>
    <revision>
      <id>29660</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBody|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBodyThree (RTNP)</title>
    <id>21878</id>
    <revision>
      <id>29661</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBodyThree|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBodyThree (U1)</title>
    <id>21879</id>
    <revision>
      <id>29662</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBodyThree|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBodyThree (UT)</title>
    <id>21880</id>
    <revision>
      <id>29663</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBodyThree|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBodyTwo (RTNP)</title>
    <id>21881</id>
    <revision>
      <id>29664</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBodyTwo|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBodyTwo (U1)</title>
    <id>21882</id>
    <revision>
      <id>29665</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBodyTwo|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBodyTwo (UT)</title>
    <id>21883</id>
    <revision>
      <id>29666</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBodyTwo|DeadMales|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBot (RTNP)</title>
    <id>21884</id>
    <revision>
      <id>29667</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBot|HumanBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBot (U1)</title>
    <id>21885</id>
    <revision>
      <id>29668</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBot|HumanBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBot (UT)</title>
    <id>21886</id>
    <revision>
      <id>29669</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBot|HumanBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaleBotPlus (UT)</title>
    <id>21887</id>
    <revision>
      <id>29670</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaleBotPlus|HumanBotPlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ManagerWindowStub (UT)</title>
    <id>21888</id>
    <revision>
      <id>29671</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ManagerWindowStub|NotifyWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Manta (RTNP)</title>
    <id>21889</id>
    <revision>
      <id>29672</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Manta|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Manta (U1)</title>
    <id>21890</id>
    <revision>
      <id>29673</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Manta|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Manta (UT)</title>
    <id>21891</id>
    <revision>
      <id>29674</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Manta|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapInfo (UDK)</title>
    <id>24672</id>
    <revision>
      <id>36013</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapInfo|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36014</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MapInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapInfo (UT3)</title>
    <id>21892</id>
    <revision>
      <id>29675</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapList (RTNP)</title>
    <id>21893</id>
    <revision>
      <id>29676</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapList|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapList (U1)</title>
    <id>21894</id>
    <revision>
      <id>29677</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapList|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapList (U2)</title>
    <id>21895</id>
    <revision>
      <id>29678</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapList|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapList (UT)</title>
    <id>21896</id>
    <revision>
      <id>29679</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapList|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapList (UT2003)</title>
    <id>21897</id>
    <revision>
      <id>29680</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapList|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapList (UT2004)</title>
    <id>21898</id>
    <revision>
      <id>29681</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapList|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapListLoader (UT2004)</title>
    <id>21899</id>
    <revision>
      <id>29682</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapListLoader|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MapVoteHistory (UT2004)</title>
    <id>21901</id>
    <revision>
      <id>29684</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MapVoteHistory|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaplistManagerBase (UT2004)</title>
    <id>21900</id>
    <revision>
      <id>29683</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaplistManagerBase|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterCreatureChunk (RTNP)</title>
    <id>21902</id>
    <revision>
      <id>29685</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterCreatureChunk|CreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterCreatureChunk (U1)</title>
    <id>21903</id>
    <revision>
      <id>29686</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterCreatureChunk|CreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterCreatureChunk (UT)</title>
    <id>21904</id>
    <revision>
      <id>29687</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterCreatureChunk|CreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterServerLink (U2)</title>
    <id>21905</id>
    <revision>
      <id>29688</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterServerLink|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterServerLink (UE2Runtime)</title>
    <id>21906</id>
    <revision>
      <id>29689</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterServerLink|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterServerLink (UT2003)</title>
    <id>21907</id>
    <revision>
      <id>29690</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterServerLink|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MasterServerLink (UT2004)</title>
    <id>21908</id>
    <revision>
      <id>29691</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MasterServerLink|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatAction (U2)</title>
    <id>21909</id>
    <revision>
      <id>29692</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatAction (U2XMP)</title>
    <id>21910</id>
    <revision>
      <id>29693</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatAction (UE2Runtime)</title>
    <id>21911</id>
    <revision>
      <id>29694</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatAction (UT2003)</title>
    <id>21912</id>
    <revision>
      <id>29695</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatAction (UT2004)</title>
    <id>21913</id>
    <revision>
      <id>29696</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatObject (U2)</title>
    <id>21935</id>
    <revision>
      <id>29718</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatObject (U2XMP)</title>
    <id>21936</id>
    <revision>
      <id>29719</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatObject (UE2Runtime)</title>
    <id>21937</id>
    <revision>
      <id>29720</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatObject (UT2003)</title>
    <id>21938</id>
    <revision>
      <id>29721</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatObject (UT2004)</title>
    <id>21939</id>
    <revision>
      <id>29722</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatSubAction (U2)</title>
    <id>21940</id>
    <revision>
      <id>29723</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatSubAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatSubAction (U2XMP)</title>
    <id>21941</id>
    <revision>
      <id>29724</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatSubAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatSubAction (UE2Runtime)</title>
    <id>21942</id>
    <revision>
      <id>29725</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatSubAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatSubAction (UT2003)</title>
    <id>21943</id>
    <revision>
      <id>29726</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatSubAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatSubAction (UT2004)</title>
    <id>21944</id>
    <revision>
      <id>29727</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatSubAction|MatObject|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatchInfo (UT2004)</title>
    <id>21914</id>
    <revision>
      <id>29697</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatchInfo|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatchSetupPanelBase (UT2004)</title>
    <id>21915</id>
    <revision>
      <id>29698</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatchSetupPanelBase|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (U2)</title>
    <id>21916</id>
    <revision>
      <id>29699</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (U2XMP)</title>
    <id>21917</id>
    <revision>
      <id>29700</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (UDK)</title>
    <id>24673</id>
    <revision>
      <id>36015</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|MaterialInterface|UE3}}</text>
    </revision>
    <revision>
      <id>36016</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Material|MaterialInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (UE2Runtime)</title>
    <id>21918</id>
    <revision>
      <id>29701</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (UT2003)</title>
    <id>21919</id>
    <revision>
      <id>29702</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (UT2004)</title>
    <id>21920</id>
    <revision>
      <id>29703</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Material (UT3)</title>
    <id>21921</id>
    <revision>
      <id>29704</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Material|MaterialInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpression (UDK)</title>
    <id>24674</id>
    <revision>
      <id>36017</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpression|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36018</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpression|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpression (UT3)</title>
    <id>21922</id>
    <revision>
      <id>29705</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpression|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionDynamicParameter (UDK)</title>
    <id>24675</id>
    <revision>
      <id>36019</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionDynamicParameter|MaterialExpression|UE3}}</text>
    </revision>
    <revision>
      <id>36020</id>
      <timestamp>2009-11-06T17:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionDynamicParameter|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionFontSample (UDK)</title>
    <id>24676</id>
    <revision>
      <id>36021</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionFontSample|MaterialExpression|UE3}}</text>
    </revision>
    <revision>
      <id>36022</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionFontSample|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionFontSample (UT3)</title>
    <id>21923</id>
    <revision>
      <id>29706</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionFontSample|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionMeshSubUV (UDK)</title>
    <id>24677</id>
    <revision>
      <id>36023</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionMeshSubUV|MaterialExpressionTextureSample|UE3}}</text>
    </revision>
    <revision>
      <id>36024</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionMeshSubUV|MaterialExpressionTextureSample|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionParameter (UDK)</title>
    <id>24678</id>
    <revision>
      <id>36025</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionParameter|MaterialExpression|UE3}}</text>
    </revision>
    <revision>
      <id>36026</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionParameter|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionParameter (UT3)</title>
    <id>21924</id>
    <revision>
      <id>29707</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionParameter|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionTextureSample (UDK)</title>
    <id>24679</id>
    <revision>
      <id>36027</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSample|MaterialExpression|UE3}}</text>
    </revision>
    <revision>
      <id>36028</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSample|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionTextureSample (UT3)</title>
    <id>21925</id>
    <revision>
      <id>29708</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSample|MaterialExpression|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionTextureSampleParameter (UDK)</title>
    <id>24680</id>
    <revision>
      <id>36029</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameter|MaterialExpressionTextureSample|UE3}}</text>
    </revision>
    <revision>
      <id>36030</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameter|MaterialExpressionTextureSample|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionTextureSampleParameter (UT3)</title>
    <id>21926</id>
    <revision>
      <id>29709</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameter|MaterialExpressionTextureSample|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionTextureSampleParameter2D (UDK)</title>
    <id>24681</id>
    <revision>
      <id>36031</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameter2D|MaterialExpressionTextureSampleParameter|UE3}}</text>
    </revision>
    <revision>
      <id>36032</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameter2D|MaterialExpressionTextureSampleParameter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialExpressionTextureSampleParameterMeshSubUV (UDK)</title>
    <id>24682</id>
    <revision>
      <id>36033</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameterMeshSubUV|MaterialExpressionTextureSampleParameter2D|UE3}}</text>
    </revision>
    <revision>
      <id>36034</id>
      <timestamp>2009-11-06T17:54:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialExpressionTextureSampleParameterMeshSubUV|MaterialExpressionTextureSampleParameter2D|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialFactory (U2)</title>
    <id>21927</id>
    <revision>
      <id>29710</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialFactory|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialFactory (U2XMP)</title>
    <id>21928</id>
    <revision>
      <id>29711</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialFactory|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialFactory (UE2Runtime)</title>
    <id>21929</id>
    <revision>
      <id>29712</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialFactory|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialFactory (UT2003)</title>
    <id>21930</id>
    <revision>
      <id>29713</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialFactory|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialFactory (UT2004)</title>
    <id>21931</id>
    <revision>
      <id>29714</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialFactory|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialInstance (UDK)</title>
    <id>24683</id>
    <revision>
      <id>36035</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialInstance|MaterialInterface|UE3}}</text>
    </revision>
    <revision>
      <id>36036</id>
      <timestamp>2009-11-06T17:54:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialInstance|MaterialInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialInstance (UT3)</title>
    <id>21932</id>
    <revision>
      <id>29715</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialInstance|MaterialInterface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialInterface (UDK)</title>
    <id>24684</id>
    <revision>
      <id>36037</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialInterface|Surface|UE3}}</text>
    </revision>
    <revision>
      <id>36038</id>
      <timestamp>2009-11-06T17:54:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MaterialInterface|Surface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MaterialInterface (UT3)</title>
    <id>21933</id>
    <revision>
      <id>29716</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MaterialInterface|Surface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MatineeActor (UT3)</title>
    <id>21934</id>
    <revision>
      <id>29717</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MatineeActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MedicalJar (U2XMP)</title>
    <id>21945</id>
    <revision>
      <id>29728</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MedicalJar|u2m1|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Menu (RTNP)</title>
    <id>21946</id>
    <revision>
      <id>29729</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Menu|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Menu (U1)</title>
    <id>21947</id>
    <revision>
      <id>29730</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Menu|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Menu (UT)</title>
    <id>21948</id>
    <revision>
      <id>29731</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Menu|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mercenary (RTNP)</title>
    <id>21949</id>
    <revision>
      <id>29732</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mercenary|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mercenary (U1)</title>
    <id>21950</id>
    <revision>
      <id>29733</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mercenary|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mercenary (UT)</title>
    <id>21951</id>
    <revision>
      <id>29734</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mercenary|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshBeacon (UDK)</title>
    <id>28692</id>
    <revision>
      <id>40634</id>
      <timestamp>2010-01-17T12:24:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshBeacon|Object|UE3}}</text>
    </revision>
    <revision>
      <id>40635</id>
      <timestamp>2010-01-17T12:36:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category subclasses|MeshBeacon|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshBrowser (UT)</title>
    <id>21952</id>
    <revision>
      <id>29735</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshBrowser|NotifyWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshComponent (UDK)</title>
    <id>24686</id>
    <revision>
      <id>36041</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshComponent|PrimitiveComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36042</id>
      <timestamp>2009-11-06T17:54:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MeshComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshComponent (UT3)</title>
    <id>21953</id>
    <revision>
      <id>29736</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshComponentFactory (UDK)</title>
    <id>24687</id>
    <revision>
      <id>36043</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshComponentFactory|PrimitiveComponentFactory|UE3}}</text>
    </revision>
    <revision>
      <id>36044</id>
      <timestamp>2009-11-06T17:54:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MeshComponentFactory|PrimitiveComponentFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshComponentFactory (UT3)</title>
    <id>21954</id>
    <revision>
      <id>29737</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshComponentFactory|PrimitiveComponentFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshEffect (UT2003)</title>
    <id>21955</id>
    <revision>
      <id>29738</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshEffect|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshEffect (UT2004)</title>
    <id>21956</id>
    <revision>
      <id>29739</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshEffect|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshObject (U2)</title>
    <id>21957</id>
    <revision>
      <id>29740</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshObject (UE2Runtime)</title>
    <id>24442</id>
    <revision>
      <id>35534</id>
      <timestamp>2009-10-24T19:19:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|MeshObject||UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|MeshObject||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshObject (UT2003)</title>
    <id>21958</id>
    <revision>
      <id>29741</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MeshObject (UT2004)</title>
    <id>21959</id>
    <revision>
      <id>29742</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MeshObject|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessageWindow (UT2004)</title>
    <id>21960</id>
    <revision>
      <id>29743</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessageWindow|PopupPageBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessagingSpectator (U2)</title>
    <id>21961</id>
    <revision>
      <id>29744</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessagingSpectator|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessagingSpectator (U2XMP)</title>
    <id>21962</id>
    <revision>
      <id>29745</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessagingSpectator|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessagingSpectator (UT)</title>
    <id>21963</id>
    <revision>
      <id>29746</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessagingSpectator|Spectator|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessagingSpectator (UT2003)</title>
    <id>21964</id>
    <revision>
      <id>29747</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessagingSpectator|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessagingSpectator (UT2004)</title>
    <id>21965</id>
    <revision>
      <id>29748</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessagingSpectator|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MessagingSpectator (UT3)</title>
    <id>21966</id>
    <revision>
      <id>29749</id>
      <timestamp>2008-05-18T15:24:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MessagingSpectator|Admin|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MidGamePanel (UT2004)</title>
    <id>21967</id>
    <revision>
      <id>29750</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MidGamePanel|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MineBase (U2)</title>
    <id>21968</id>
    <revision>
      <id>29751</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MineBase|BreakableItem|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MiniAmmo (UT)</title>
    <id>21969</id>
    <revision>
      <id>29752</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MiniAmmo|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Minigun (UT2003)</title>
    <id>21970</id>
    <revision>
      <id>29753</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Minigun|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Minigun (UT2004)</title>
    <id>21971</id>
    <revision>
      <id>29754</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Minigun|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunAltFire (UT2003)</title>
    <id>21972</id>
    <revision>
      <id>29755</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunAltFire|MinigunFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunAltFire (UT2004)</title>
    <id>21973</id>
    <revision>
      <id>29756</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunAltFire|MinigunFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunFire (UT2003)</title>
    <id>21974</id>
    <revision>
      <id>29757</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunFire|InstantFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunFire (UT2004)</title>
    <id>21975</id>
    <revision>
      <id>29758</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunFire|InstantFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunMuzFlash1st (UT2003)</title>
    <id>21976</id>
    <revision>
      <id>29759</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunMuzFlash1st|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunMuzFlash1st (UT2004)</title>
    <id>21977</id>
    <revision>
      <id>29760</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunMuzFlash1st|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunMuzFlash3rd (UT2003)</title>
    <id>21978</id>
    <revision>
      <id>29761</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunMuzFlash3rd|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunMuzFlash3rd (UT2004)</title>
    <id>21979</id>
    <revision>
      <id>29762</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunMuzFlash3rd|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunMuzzleSmoke (UT2003)</title>
    <id>21980</id>
    <revision>
      <id>29763</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunMuzzleSmoke|MuzzleSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunMuzzleSmoke (UT2004)</title>
    <id>21981</id>
    <revision>
      <id>29764</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunMuzzleSmoke|MuzzleSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunPickup (UT2003)</title>
    <id>21982</id>
    <revision>
      <id>29765</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MinigunPickup (UT2004)</title>
    <id>21983</id>
    <revision>
      <id>29766</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MinigunPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Modifier (U2)</title>
    <id>21985</id>
    <revision>
      <id>29768</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Modifier|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Modifier (U2XMP)</title>
    <id>21986</id>
    <revision>
      <id>29769</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Modifier|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Modifier (UE2Runtime)</title>
    <id>21987</id>
    <revision>
      <id>29770</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Modifier|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Modifier (UT2003)</title>
    <id>21988</id>
    <revision>
      <id>29771</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Modifier|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Modifier (UT2004)</title>
    <id>21989</id>
    <revision>
      <id>29772</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Modifier|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ModsAndDemosTabs (UT2004)</title>
    <id>21990</id>
    <revision>
      <id>29773</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ModsAndDemosTabs|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MonkStatue (RTNP)</title>
    <id>21992</id>
    <revision>
      <id>29775</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MonkStatue|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MonkStatue (U1)</title>
    <id>21993</id>
    <revision>
      <id>29776</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MonkStatue|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MonkStatue (UT)</title>
    <id>21994</id>
    <revision>
      <id>29777</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MonkStatue|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Monster (UT2003)</title>
    <id>21995</id>
    <revision>
      <id>29778</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Monster|xPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Monster (UT2004)</title>
    <id>21996</id>
    <revision>
      <id>29779</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Monster|xPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Moon (RTNP)</title>
    <id>21998</id>
    <revision>
      <id>29781</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Moon|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Moon (U1)</title>
    <id>21999</id>
    <revision>
      <id>29782</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Moon|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Moon (UT)</title>
    <id>22000</id>
    <revision>
      <id>29783</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Moon|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MorphNodeBase (UDK)</title>
    <id>24688</id>
    <revision>
      <id>36045</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MorphNodeBase|AnimObject|UE3}}</text>
    </revision>
    <revision>
      <id>36046</id>
      <timestamp>2009-11-06T17:54:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MorphNodeBase|AnimObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MorphNodeBase (UT3)</title>
    <id>22001</id>
    <revision>
      <id>29784</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MorphNodeBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MorphNodeWeightBase (UDK)</title>
    <id>24689</id>
    <revision>
      <id>36047</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MorphNodeWeightBase|MorphNodeBase|UE3}}</text>
    </revision>
    <revision>
      <id>36048</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|MorphNodeWeightBase|MorphNodeBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MorphNodeWeightBase (UT3)</title>
    <id>22002</id>
    <revision>
      <id>29785</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MorphNodeWeightBase|MorphNodeBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MotionBlurRI (U2XMP)</title>
    <id>22003</id>
    <revision>
      <id>29786</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MotionBlurRI|RenderIterator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mover (RTNP)</title>
    <id>22004</id>
    <revision>
      <id>29787</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mover|Brush|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mover (U1)</title>
    <id>22005</id>
    <revision>
      <id>29788</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mover|Brush|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mover (U2)</title>
    <id>22006</id>
    <revision>
      <id>29789</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mover|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mover (U2XMP)</title>
    <id>22007</id>
    <revision>
      <id>29790</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mover|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mover (UT)</title>
    <id>22008</id>
    <revision>
      <id>29791</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mover|Brush|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mover (UT2004)</title>
    <id>22009</id>
    <revision>
      <id>29792</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mover|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MutInstaGib (UT2003)</title>
    <id>22015</id>
    <revision>
      <id>29798</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MutInstaGib|Mutator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MutInstaGib (UT2004)</title>
    <id>22016</id>
    <revision>
      <id>29799</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MutInstaGib|Mutator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MutZoomInstaGib (UT2004)</title>
    <id>22017</id>
    <revision>
      <id>29800</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MutZoomInstaGib|MutInstaGib|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mutator (U2XMP)</title>
    <id>22010</id>
    <revision>
      <id>29793</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mutator (UDK)</title>
    <id>24690</id>
    <revision>
      <id>36049</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE3}}</text>
    </revision>
    <revision>
      <id>36050</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mutator (UT)</title>
    <id>22011</id>
    <revision>
      <id>29794</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mutator (UT2003)</title>
    <id>22012</id>
    <revision>
      <id>29795</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mutator (UT2004)</title>
    <id>22013</id>
    <revision>
      <id>29796</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Mutator (UT3)</title>
    <id>22014</id>
    <revision>
      <id>29797</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Mutator|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MuzzleSmoke (UT2003)</title>
    <id>22018</id>
    <revision>
      <id>29801</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MuzzleSmoke|pclLightSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of MuzzleSmoke (UT2004)</title>
    <id>22019</id>
    <revision>
      <id>29802</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|MuzzleSmoke|pclLightSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Nali (RTNP)</title>
    <id>22020</id>
    <revision>
      <id>29803</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Nali|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Nali (U1)</title>
    <id>22021</id>
    <revision>
      <id>29804</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Nali|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Nali (UT)</title>
    <id>22022</id>
    <revision>
      <id>29805</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Nali|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NaliCarcass (RTNP)</title>
    <id>22023</id>
    <revision>
      <id>29806</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NaliCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NaliCarcass (U1)</title>
    <id>22024</id>
    <revision>
      <id>29807</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NaliCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NaliCarcass (UT)</title>
    <id>22025</id>
    <revision>
      <id>29808</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NaliCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NaliStatue (RTNP)</title>
    <id>22026</id>
    <revision>
      <id>29809</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NaliStatue|MonkStatue|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavMeshPathConstraint (UDK)</title>
    <id>24692</id>
    <revision>
      <id>36053</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavMeshPathConstraint|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36054</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NavMeshPathConstraint|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavMeshPathGoalEvaluator (UDK)</title>
    <id>24693</id>
    <revision>
      <id>36055</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavMeshPathGoalEvaluator|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36056</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NavMeshPathGoalEvaluator|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (RTNP)</title>
    <id>22027</id>
    <revision>
      <id>29810</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (U1)</title>
    <id>22028</id>
    <revision>
      <id>29811</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (U2)</title>
    <id>22029</id>
    <revision>
      <id>29812</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (U2XMP)</title>
    <id>22030</id>
    <revision>
      <id>29813</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (UDK)</title>
    <id>24691</id>
    <revision>
      <id>36051</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36052</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (UE2Runtime)</title>
    <id>22031</id>
    <revision>
      <id>29814</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (UT)</title>
    <id>22032</id>
    <revision>
      <id>29815</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (UT2003)</title>
    <id>22033</id>
    <revision>
      <id>29816</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (UT2004)</title>
    <id>22034</id>
    <revision>
      <id>29817</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NavigationPoint (UT3)</title>
    <id>22035</id>
    <revision>
      <id>29818</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NavigationPoint|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Neban (U2XMP)</title>
    <id>22036</id>
    <revision>
      <id>29819</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Neban|U2PawnAtlantis|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NotifyButton (UT)</title>
    <id>22037</id>
    <revision>
      <id>29820</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NotifyButton|UWindowButton|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NotifyWindow (UT)</title>
    <id>22038</id>
    <revision>
      <id>29821</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NotifyWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NxCylindricalForceField (UDK)</title>
    <id>24694</id>
    <revision>
      <id>36057</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NxCylindricalForceField|NxForceField|UE3}}</text>
    </revision>
    <revision>
      <id>36058</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NxCylindricalForceField|NxForceField|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NxForceField (UDK)</title>
    <id>24695</id>
    <revision>
      <id>36059</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NxForceField|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36060</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NxForceField|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NxGenericForceField (UDK)</title>
    <id>24696</id>
    <revision>
      <id>36061</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NxGenericForceField|NxForceField|UE3}}</text>
    </revision>
    <revision>
      <id>36062</id>
      <timestamp>2009-11-06T17:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NxGenericForceField|NxForceField|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NxRadialForceField (UDK)</title>
    <id>24697</id>
    <revision>
      <id>36063</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NxRadialForceField|NxForceField|UE3}}</text>
    </revision>
    <revision>
      <id>36064</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NxRadialForceField|NxForceField|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NxTornadoAngularForceField (UDK)</title>
    <id>24698</id>
    <revision>
      <id>36065</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NxTornadoAngularForceField|NxForceField|UE3}}</text>
    </revision>
    <revision>
      <id>36066</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NxTornadoAngularForceField|NxForceField|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of NxTornadoForceField (UDK)</title>
    <id>24699</id>
    <revision>
      <id>36067</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|NxTornadoForceField|NxForceField|UE3}}</text>
    </revision>
    <revision>
      <id>36068</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|NxTornadoForceField|NxForceField|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSAttackCraft (UT2004)</title>
    <id>22060</id>
    <revision>
      <id>29843</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSAttackCraft|ONSChopperCraft|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSChopperCraft (UT2004)</title>
    <id>22061</id>
    <revision>
      <id>29844</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSChopperCraft|ONSVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSHUDOverlay (UT2004)</title>
    <id>22066</id>
    <revision>
      <id>29849</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSHUDOverlay|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSHeadlightCorona (UT2004)</title>
    <id>22062</id>
    <revision>
      <id>29845</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSHeadlightCorona|Light|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSHoverCraft (UT2004)</title>
    <id>22063</id>
    <revision>
      <id>29846</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSHoverCraft|ONSVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSHoverTank (UT2004)</title>
    <id>22064</id>
    <revision>
      <id>29847</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSHoverTank|ONSTreadCraft|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSHoverTankCannon (UT2004)</title>
    <id>22065</id>
    <revision>
      <id>29848</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSHoverTankCannon|ONSWeapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSLinkableWeapon (UT2004)</title>
    <id>22067</id>
    <revision>
      <id>29850</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSLinkableWeapon|ONSWeapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSMineProjectile (UT2004)</title>
    <id>22068</id>
    <revision>
      <id>29851</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSMineProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSMortarShell (UT2004)</title>
    <id>22069</id>
    <revision>
      <id>29852</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSMortarShell|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSPlaneCraft (UT2004)</title>
    <id>22070</id>
    <revision>
      <id>29853</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSPlaneCraft|ONSVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSPlasmaProjectile (UT2004)</title>
    <id>22071</id>
    <revision>
      <id>29854</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSPlasmaProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSPowerCore (UT2004)</title>
    <id>22072</id>
    <revision>
      <id>29855</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSPowerCore|DestroyableObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSPowerCoreEnergy (UT2004)</title>
    <id>22073</id>
    <revision>
      <id>29856</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSPowerCoreEnergy|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSPowerCoreShield (UT2004)</title>
    <id>22074</id>
    <revision>
      <id>29857</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSPowerCoreShield|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSPowerNode (UT2004)</title>
    <id>22075</id>
    <revision>
      <id>29858</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSPowerNode|ONSPowerCore|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSRVWebProjectile (UT2004)</title>
    <id>22076</id>
    <revision>
      <id>29859</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSRVWebProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSStationaryWeaponPawn (UT2004)</title>
    <id>22077</id>
    <revision>
      <id>29860</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSStationaryWeaponPawn|ONSWeaponPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSTankSecondaryTurret (UT2004)</title>
    <id>22078</id>
    <revision>
      <id>29861</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSTankSecondaryTurret|ONSWeapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSTankSecondaryTurretPawn (UT2004)</title>
    <id>22079</id>
    <revision>
      <id>29862</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSTankSecondaryTurretPawn|ONSWeaponPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSTreadCraft (UT2004)</title>
    <id>22080</id>
    <revision>
      <id>29863</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSTreadCraft|ONSVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSTurretBeamEffect (UT2004)</title>
    <id>22081</id>
    <revision>
      <id>29864</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSTurretBeamEffect|Emitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSVehicle (UT2004)</title>
    <id>22082</id>
    <revision>
      <id>29865</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSVehicle|SVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSVehicleBuildEffect (UT2004)</title>
    <id>22083</id>
    <revision>
      <id>29866</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSVehicleBuildEffect|Emitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSVehicleExplosionEffect (UT2004)</title>
    <id>22084</id>
    <revision>
      <id>29867</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSVehicleExplosionEffect|Emitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSVehicleFactory (UT2004)</title>
    <id>22085</id>
    <revision>
      <id>29868</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSVehicleFactory|SVehicleFactory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSWeapon (UT2004)</title>
    <id>22086</id>
    <revision>
      <id>29869</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSWeapon|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSWeaponAmbientEmitter (UT2004)</title>
    <id>22087</id>
    <revision>
      <id>29870</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSWeaponAmbientEmitter|Emitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSWeaponPawn (UT2004)</title>
    <id>22088</id>
    <revision>
      <id>29871</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSWeaponPawn|Vehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ONSWheeledCraft (UT2004)</title>
    <id>22089</id>
    <revision>
      <id>29872</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ONSWheeledCraft|ONSVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object</title>
    <id>28608</id>
    <revision>
      <id>40436</id>
      <timestamp>2010-01-11T11:47:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Object}}'</comment>
      <text xml:space="preserve">{{category subclasses|Object}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (RTNP)</title>
    <id>22039</id>
    <revision>
      <id>29822</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (U1)</title>
    <id>22040</id>
    <revision>
      <id>29823</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (U2)</title>
    <id>22041</id>
    <revision>
      <id>29824</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (U2XMP)</title>
    <id>22042</id>
    <revision>
      <id>29825</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UDK)</title>
    <id>24700</id>
    <revision>
      <id>36069</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE3}}</text>
    </revision>
    <revision>
      <id>36070</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Object||UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UE2)</title>
    <id>28571</id>
    <revision>
      <id>40287</id>
      <timestamp>2009-11-18T16:26:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Object||UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|Object||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UE2Runtime)</title>
    <id>22043</id>
    <revision>
      <id>29826</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UT)</title>
    <id>22044</id>
    <revision>
      <id>29827</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UT2003)</title>
    <id>22045</id>
    <revision>
      <id>29828</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UT2004)</title>
    <id>22046</id>
    <revision>
      <id>29829</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Object (UT3)</title>
    <id>22047</id>
    <revision>
      <id>29830</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Object||UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ObjectArray (UT2003)</title>
    <id>22048</id>
    <revision>
      <id>29831</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ObjectArray|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ObjectArray (UT2004)</title>
    <id>22049</id>
    <revision>
      <id>29832</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ObjectArray|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Objective (UDK)</title>
    <id>24701</id>
    <revision>
      <id>36071</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Objective|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36072</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Objective|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Objective (UT3)</title>
    <id>22050</id>
    <revision>
      <id>29833</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Objective|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineGameInterfaceImpl (UT3)</title>
    <id>22051</id>
    <revision>
      <id>29834</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineGameInterfaceImpl|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineGameSearch (UDK)</title>
    <id>24702</id>
    <revision>
      <id>36073</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineGameSearch|Settings|UE3}}</text>
    </revision>
    <revision>
      <id>36074</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineGameSearch|Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineGameSearch (UT3)</title>
    <id>22052</id>
    <revision>
      <id>29835</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineGameSearch|Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineGameSettings (UDK)</title>
    <id>24703</id>
    <revision>
      <id>36075</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineGameSettings|Settings|UE3}}</text>
    </revision>
    <revision>
      <id>36076</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineGameSettings|Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineGameSettings (UT3)</title>
    <id>22053</id>
    <revision>
      <id>29836</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineGameSettings|Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlinePlayerStorage (UDK)</title>
    <id>24704</id>
    <revision>
      <id>36077</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlinePlayerStorage|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36078</id>
      <timestamp>2009-11-06T17:54:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlinePlayerStorage|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineProfileSettings (UDK)</title>
    <id>24705</id>
    <revision>
      <id>36079</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineProfileSettings|OnlinePlayerStorage|UE3}}</text>
    </revision>
    <revision>
      <id>36080</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineProfileSettings|OnlinePlayerStorage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineProfileSettings (UT3)</title>
    <id>22054</id>
    <revision>
      <id>29837</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineProfileSettings|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineStats (UDK)</title>
    <id>24706</id>
    <revision>
      <id>36081</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineStats|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36082</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineStats|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineStats (UT3)</title>
    <id>22055</id>
    <revision>
      <id>29838</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineStats|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineStatsRead (UDK)</title>
    <id>24707</id>
    <revision>
      <id>36083</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineStatsRead|OnlineStats|UE3}}</text>
    </revision>
    <revision>
      <id>36084</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineStatsRead|OnlineStats|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineStatsRead (UT3)</title>
    <id>22056</id>
    <revision>
      <id>29839</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineStatsRead|OnlineStats|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineStatsWrite (UDK)</title>
    <id>24708</id>
    <revision>
      <id>36085</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineStatsWrite|OnlineStats|UE3}}</text>
    </revision>
    <revision>
      <id>36086</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineStatsWrite|OnlineStats|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineStatsWrite (UT3)</title>
    <id>22057</id>
    <revision>
      <id>29840</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineStatsWrite|OnlineStats|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineSubsystem (UDK)</title>
    <id>24709</id>
    <revision>
      <id>36087</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineSubsystem|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36088</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineSubsystem|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineSubsystem (UT3)</title>
    <id>22058</id>
    <revision>
      <id>29841</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineSubsystem|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineSubsystemCommonImpl (UDK)</title>
    <id>24710</id>
    <revision>
      <id>36089</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineSubsystemCommonImpl|OnlineSubsystem|UE3}}</text>
    </revision>
    <revision>
      <id>36090</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|OnlineSubsystemCommonImpl|OnlineSubsystem|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of OnlineSubsystemCommonImpl (UT3)</title>
    <id>22059</id>
    <revision>
      <id>29842</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|OnlineSubsystemCommonImpl|OnlineSubsystem|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PAmmo (UT)</title>
    <id>22096</id>
    <revision>
      <id>29879</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PAmmo|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PBRuleNodeBase (UDK)</title>
    <id>24748</id>
    <revision>
      <id>36165</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PBRuleNodeBase|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36166</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PBRuleNodeBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PBolt (UT)</title>
    <id>22156</id>
    <revision>
      <id>29939</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PBolt|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PDA (U2XMP)</title>
    <id>22163</id>
    <revision>
      <id>29946</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PDA|u2m1|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PROJ Sentinel Laser (UT2004)</title>
    <id>22265</id>
    <revision>
      <id>30048</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PROJ_Sentinel_Laser|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PROJ TurretSkaarjPlasma (UT2004)</title>
    <id>22266</id>
    <revision>
      <id>30049</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PROJ_TurretSkaarjPlasma|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PackBase (U2)</title>
    <id>22090</id>
    <revision>
      <id>29873</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PackBase|DeployableInventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Painter (UT2004)</title>
    <id>22091</id>
    <revision>
      <id>29874</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Painter|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PainterAttachment (UT2004)</title>
    <id>22092</id>
    <revision>
      <id>29875</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PainterAttachment|xWeaponAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PainterBeamEffect (UT2004)</title>
    <id>22093</id>
    <revision>
      <id>29876</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PainterBeamEffect|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PainterFire (UT2004)</title>
    <id>22094</id>
    <revision>
      <id>29877</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PainterFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PainterPickup (UT2004)</title>
    <id>22095</id>
    <revision>
      <id>29878</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PainterPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleBlower (U2)</title>
    <id>22097</id>
    <revision>
      <id>29880</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleBlower|ParticleGenerator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleBlower (U2XMP)</title>
    <id>22098</id>
    <revision>
      <id>29881</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleBlower|ParticleGenerator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleBurst (RTNP)</title>
    <id>22099</id>
    <revision>
      <id>29882</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleBurst|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleBurst (U1)</title>
    <id>22100</id>
    <revision>
      <id>29883</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleBurst|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleBurst (UT)</title>
    <id>22101</id>
    <revision>
      <id>29884</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleBurst|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleDamage (U2XMP)</title>
    <id>22102</id>
    <revision>
      <id>29885</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleDamage|ActorCollisionNotifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEmitter (U2XMP)</title>
    <id>22103</id>
    <revision>
      <id>29886</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEmitter (UDK)</title>
    <id>24711</id>
    <revision>
      <id>36091</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36092</id>
      <timestamp>2009-11-06T17:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEmitter (UE2Runtime)</title>
    <id>22104</id>
    <revision>
      <id>29887</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEmitter (UT2003)</title>
    <id>22105</id>
    <revision>
      <id>29888</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEmitter (UT2004)</title>
    <id>22106</id>
    <revision>
      <id>29889</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEmitter (UT3)</title>
    <id>22107</id>
    <revision>
      <id>29890</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEmitter|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleEventManager (UDK)</title>
    <id>24712</id>
    <revision>
      <id>36093</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleEventManager|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36094</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleEventManager|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleGenerator (U2)</title>
    <id>22108</id>
    <revision>
      <id>29891</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleGenerator|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleGenerator (U2XMP)</title>
    <id>22109</id>
    <revision>
      <id>29892</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleGenerator|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModule (UDK)</title>
    <id>24713</id>
    <revision>
      <id>36095</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModule|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36096</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModule|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModule (UT3)</title>
    <id>22110</id>
    <revision>
      <id>29893</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModule|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleAccelerationBase (UDK)</title>
    <id>24714</id>
    <revision>
      <id>36097</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleAccelerationBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36098</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleAccelerationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleAccelerationBase (UT3)</title>
    <id>22111</id>
    <revision>
      <id>29894</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleAccelerationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleAttractorBase (UDK)</title>
    <id>24715</id>
    <revision>
      <id>36099</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleAttractorBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36100</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleAttractorBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleAttractorBase (UT3)</title>
    <id>22112</id>
    <revision>
      <id>29895</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleAttractorBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleBeamBase (UDK)</title>
    <id>24716</id>
    <revision>
      <id>36101</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleBeamBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36102</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleBeamBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleBeamBase (UT3)</title>
    <id>22113</id>
    <revision>
      <id>29896</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleBeamBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleCollisionBase (UDK)</title>
    <id>24717</id>
    <revision>
      <id>36103</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleCollisionBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36104</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleCollisionBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleCollisionBase (UT3)</title>
    <id>22114</id>
    <revision>
      <id>29897</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleCollisionBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleColorBase (UDK)</title>
    <id>24718</id>
    <revision>
      <id>36105</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleColorBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36106</id>
      <timestamp>2009-11-06T17:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleColorBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleColorBase (UT3)</title>
    <id>22115</id>
    <revision>
      <id>29898</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleColorBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleEventBase (UDK)</title>
    <id>24719</id>
    <revision>
      <id>36107</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleEventBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36108</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleEventBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleEventReceiverBase (UDK)</title>
    <id>24720</id>
    <revision>
      <id>36109</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleEventReceiverBase|ParticleModuleEventBase|UE3}}</text>
    </revision>
    <revision>
      <id>36110</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleEventReceiverBase|ParticleModuleEventBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleEventSendToGame (UDK)</title>
    <id>24721</id>
    <revision>
      <id>36111</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleEventSendToGame|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36112</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleEventSendToGame|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleKillBase (UDK)</title>
    <id>24722</id>
    <revision>
      <id>36113</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleKillBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36114</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleKillBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleKillBase (UT3)</title>
    <id>22116</id>
    <revision>
      <id>29899</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleKillBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleLifetimeBase (UDK)</title>
    <id>24723</id>
    <revision>
      <id>36115</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLifetimeBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36116</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLifetimeBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleLifetimeBase (UT3)</title>
    <id>22117</id>
    <revision>
      <id>29900</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLifetimeBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleLocationBase (UDK)</title>
    <id>24724</id>
    <revision>
      <id>36117</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLocationBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36118</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLocationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleLocationBase (UT3)</title>
    <id>22118</id>
    <revision>
      <id>29901</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLocationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleLocationPrimitiveBase (UDK)</title>
    <id>24725</id>
    <revision>
      <id>36119</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLocationPrimitiveBase|ParticleModuleLocationBase|UE3}}</text>
    </revision>
    <revision>
      <id>36120</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLocationPrimitiveBase|ParticleModuleLocationBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleLocationPrimitiveBase (UT3)</title>
    <id>22119</id>
    <revision>
      <id>29902</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleLocationPrimitiveBase|ParticleModuleLocationBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleMaterialBase (UDK)</title>
    <id>24726</id>
    <revision>
      <id>36121</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleMaterialBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36122</id>
      <timestamp>2009-11-06T17:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleMaterialBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleMaterialBase (UT3)</title>
    <id>22120</id>
    <revision>
      <id>29903</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleMaterialBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleOrbitBase (UDK)</title>
    <id>24727</id>
    <revision>
      <id>36123</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleOrbitBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36124</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleOrbitBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleOrbitBase (UT3)</title>
    <id>22121</id>
    <revision>
      <id>29904</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleOrbitBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleOrientationBase (UDK)</title>
    <id>24728</id>
    <revision>
      <id>36125</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleOrientationBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36126</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleOrientationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleOrientationBase (UT3)</title>
    <id>22122</id>
    <revision>
      <id>29905</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleOrientationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleParameterBase (UDK)</title>
    <id>24729</id>
    <revision>
      <id>36127</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleParameterBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36128</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleParameterBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleRotationBase (UDK)</title>
    <id>24730</id>
    <revision>
      <id>36129</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleRotationBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36130</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleRotationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleRotationBase (UT3)</title>
    <id>22123</id>
    <revision>
      <id>29906</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleRotationBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleRotationRateBase (UDK)</title>
    <id>24731</id>
    <revision>
      <id>36131</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleRotationRateBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36132</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleRotationRateBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleRotationRateBase (UT3)</title>
    <id>22124</id>
    <revision>
      <id>29907</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleRotationRateBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSizeBase (UDK)</title>
    <id>24732</id>
    <revision>
      <id>36133</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSizeBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36134</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSizeBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSizeBase (UT3)</title>
    <id>22125</id>
    <revision>
      <id>29908</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSizeBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSpawnBase (UDK)</title>
    <id>24733</id>
    <revision>
      <id>36135</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSpawnBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36136</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSpawnBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSpawnBase (UT3)</title>
    <id>22126</id>
    <revision>
      <id>29909</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSpawnBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleStoreSpawnTimeBase (UDK)</title>
    <id>24734</id>
    <revision>
      <id>36137</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleStoreSpawnTimeBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36138</id>
      <timestamp>2009-11-06T17:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleStoreSpawnTimeBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSubUV (UDK)</title>
    <id>24735</id>
    <revision>
      <id>36139</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSubUV|ParticleModuleSubUVBase|UE3}}</text>
    </revision>
    <revision>
      <id>36140</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSubUV|ParticleModuleSubUVBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSubUVBase (UDK)</title>
    <id>24736</id>
    <revision>
      <id>36141</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSubUVBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36142</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSubUVBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleSubUVBase (UT3)</title>
    <id>22127</id>
    <revision>
      <id>29910</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleSubUVBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleTrailBase (UDK)</title>
    <id>24737</id>
    <revision>
      <id>36143</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTrailBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36144</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTrailBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleTrailBase (UT3)</title>
    <id>22128</id>
    <revision>
      <id>29911</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTrailBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleTypeDataBase (UDK)</title>
    <id>24738</id>
    <revision>
      <id>36145</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTypeDataBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36146</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTypeDataBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleTypeDataBase (UT3)</title>
    <id>22129</id>
    <revision>
      <id>29912</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTypeDataBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleTypeDataMesh (UDK)</title>
    <id>24739</id>
    <revision>
      <id>36147</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTypeDataMesh|ParticleModuleTypeDataBase|UE3}}</text>
    </revision>
    <revision>
      <id>36148</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTypeDataMesh|ParticleModuleTypeDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleTypeDataMesh (UT3)</title>
    <id>22130</id>
    <revision>
      <id>29913</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleTypeDataMesh|ParticleModuleTypeDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleUberBase (UDK)</title>
    <id>24740</id>
    <revision>
      <id>36149</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleUberBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36150</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleUberBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleUberBase (UT3)</title>
    <id>22131</id>
    <revision>
      <id>29914</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleUberBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleVelocityBase (UDK)</title>
    <id>24741</id>
    <revision>
      <id>36151</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleVelocityBase|ParticleModule|UE3}}</text>
    </revision>
    <revision>
      <id>36152</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleModuleVelocityBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleModuleVelocityBase (UT3)</title>
    <id>22132</id>
    <revision>
      <id>29915</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleModuleVelocityBase|ParticleModule|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleSystemComponent (UDK)</title>
    <id>24742</id>
    <revision>
      <id>36153</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleSystemComponent|PrimitiveComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36154</id>
      <timestamp>2009-11-06T17:55:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ParticleSystemComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleSystemComponent (UT3)</title>
    <id>22133</id>
    <revision>
      <id>29916</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleSystemComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleTemplate (U2)</title>
    <id>22134</id>
    <revision>
      <id>29917</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleTemplate|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ParticleTemplate (U2XMP)</title>
    <id>22135</id>
    <revision>
      <id>29918</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ParticleTemplate|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PartyBeacon (UDK)</title>
    <id>24743</id>
    <revision>
      <id>36155</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PartyBeacon|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36156</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PartyBeacon|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathConstraint (UDK)</title>
    <id>24744</id>
    <revision>
      <id>36157</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathConstraint|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36158</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PathConstraint|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathGoalEvaluator (UDK)</title>
    <id>24745</id>
    <revision>
      <id>36159</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathGoalEvaluator|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36160</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PathGoalEvaluator|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathNode (UDK)</title>
    <id>24746</id>
    <revision>
      <id>36161</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathNode|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36162</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PathNode|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathNode (UT2004)</title>
    <id>22136</id>
    <revision>
      <id>29919</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathNode|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathNode (UT3)</title>
    <id>22137</id>
    <revision>
      <id>29920</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathNode|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathNodeIterator (RTNP)</title>
    <id>22138</id>
    <revision>
      <id>29921</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathNodeIterator|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathRenderingComponent (UT3)</title>
    <id>22139</id>
    <revision>
      <id>29922</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathRenderingComponent|PrimitiveComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PathStreakSegment (U2XMP)</title>
    <id>22140</id>
    <revision>
      <id>29923</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PathStreakSegment|TracerSeg|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PatrolPoint (U2XMP)</title>
    <id>22141</id>
    <revision>
      <id>29924</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PatrolPoint|Keypoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (RTNP)</title>
    <id>22142</id>
    <revision>
      <id>29925</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (U1)</title>
    <id>22143</id>
    <revision>
      <id>29926</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (U2)</title>
    <id>22144</id>
    <revision>
      <id>29927</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (U2XMP)</title>
    <id>22145</id>
    <revision>
      <id>29928</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (UDK)</title>
    <id>24747</id>
    <revision>
      <id>36163</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36164</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (UE2Runtime)</title>
    <id>22146</id>
    <revision>
      <id>29929</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (UT)</title>
    <id>22147</id>
    <revision>
      <id>29930</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (UT2003)</title>
    <id>22148</id>
    <revision>
      <id>29931</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (UT2004)</title>
    <id>22149</id>
    <revision>
      <id>29932</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pawn (UT3)</title>
    <id>22150</id>
    <revision>
      <id>29933</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pawn|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PawnProxy (U2XMP)</title>
    <id>22151</id>
    <revision>
      <id>29934</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PawnProxy|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PawnProxyTarget (U2XMP)</title>
    <id>22152</id>
    <revision>
      <id>29935</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PawnProxyTarget|PawnProxy|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PawnTeleportEffect (RTNP)</title>
    <id>22153</id>
    <revision>
      <id>29936</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PawnTeleportEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PawnTeleportEffect (U1)</title>
    <id>22154</id>
    <revision>
      <id>29937</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PawnTeleportEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PawnTeleportEffect (UT)</title>
    <id>22155</id>
    <revision>
      <id>29938</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PawnTeleportEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicalMaterialPropertyBase (UDK)</title>
    <id>24749</id>
    <revision>
      <id>36167</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicalMaterialPropertyBase|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36168</id>
      <timestamp>2009-11-06T17:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PhysicalMaterialPropertyBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicalMaterialPropertyBase (UT3)</title>
    <id>22164</id>
    <revision>
      <id>29947</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicalMaterialPropertyBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (U2)</title>
    <id>22165</id>
    <revision>
      <id>29948</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (U2XMP)</title>
    <id>22166</id>
    <revision>
      <id>29949</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (UDK)</title>
    <id>24750</id>
    <revision>
      <id>36169</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE3}}</text>
    </revision>
    <revision>
      <id>36170</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (UE2Runtime)</title>
    <id>22167</id>
    <revision>
      <id>29950</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (UT2003)</title>
    <id>22168</id>
    <revision>
      <id>29951</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (UT2004)</title>
    <id>22169</id>
    <revision>
      <id>29952</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PhysicsVolume (UT3)</title>
    <id>22170</id>
    <revision>
      <id>29953</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PhysicsVolume|Volume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (RTNP)</title>
    <id>22171</id>
    <revision>
      <id>29954</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Inventory|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (U1)</title>
    <id>22172</id>
    <revision>
      <id>29955</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Inventory|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (U2)</title>
    <id>22173</id>
    <revision>
      <id>29956</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (U2XMP)</title>
    <id>22174</id>
    <revision>
      <id>29957</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (UE2Runtime)</title>
    <id>22175</id>
    <revision>
      <id>29958</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (UT)</title>
    <id>22176</id>
    <revision>
      <id>29959</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Inventory|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (UT2003)</title>
    <id>22177</id>
    <revision>
      <id>29960</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pickup (UT2004)</title>
    <id>22178</id>
    <revision>
      <id>29961</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pickup|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PickupFactory (UDK)</title>
    <id>24751</id>
    <revision>
      <id>36171</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PickupFactory|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36172</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PickupFactory|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PickupFactory (UT3)</title>
    <id>22179</id>
    <revision>
      <id>29962</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PickupFactory|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PickupMessagePlus (UT)</title>
    <id>22180</id>
    <revision>
      <id>29963</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PickupMessagePlus|LocalMessagePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlasmaCap (UT)</title>
    <id>22181</id>
    <revision>
      <id>29964</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlasmaCap|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Player (UDK)</title>
    <id>24752</id>
    <revision>
      <id>36173</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Player|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36174</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Player|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Player (UT)</title>
    <id>28438</id>
    <revision>
      <id>40118</id>
      <timestamp>2009-11-15T18:35:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Player|Object|UE1}}'</comment>
      <text xml:space="preserve">{{category subclasses|Player|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Player (UT3)</title>
    <id>22182</id>
    <revision>
      <id>29965</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Player|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerChatManager (UT2004)</title>
    <id>22183</id>
    <revision>
      <id>29966</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerChatManager|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerChunks (RTNP)</title>
    <id>22184</id>
    <revision>
      <id>29967</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerChunks|CreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerChunks (U1)</title>
    <id>22185</id>
    <revision>
      <id>29968</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerChunks|CreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerChunks (UT)</title>
    <id>22186</id>
    <revision>
      <id>29969</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerChunks|CreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (U2)</title>
    <id>22187</id>
    <revision>
      <id>29970</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (U2XMP)</title>
    <id>22188</id>
    <revision>
      <id>29971</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|LicenseeController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (UDK)</title>
    <id>24753</id>
    <revision>
      <id>36175</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE3}}</text>
    </revision>
    <revision>
      <id>36176</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (UE2Runtime)</title>
    <id>22189</id>
    <revision>
      <id>29972</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (UT2003)</title>
    <id>22190</id>
    <revision>
      <id>29973</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (UT2004)</title>
    <id>22191</id>
    <revision>
      <id>29974</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerController (UT3)</title>
    <id>22192</id>
    <revision>
      <id>29975</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerController|Controller|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerDataProvider (UDK)</title>
    <id>24754</id>
    <revision>
      <id>36177</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerDataProvider|UIDynamicDataProvider|UE3}}</text>
    </revision>
    <revision>
      <id>36178</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PlayerDataProvider|UIDynamicDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerDataProvider (UT3)</title>
    <id>22193</id>
    <revision>
      <id>29976</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerDataProvider|UIDynamicDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerInput (UDK)</title>
    <id>24755</id>
    <revision>
      <id>36179</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerInput|Input|UE3}}</text>
    </revision>
    <revision>
      <id>36180</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PlayerInput|Input|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerInput (UT2003)</title>
    <id>22194</id>
    <revision>
      <id>29977</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerInput|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerInput (UT2004)</title>
    <id>22195</id>
    <revision>
      <id>29978</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerInput|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerInput (UT3)</title>
    <id>22196</id>
    <revision>
      <id>29979</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerInput|Input|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerPawn (RTNP)</title>
    <id>22197</id>
    <revision>
      <id>29980</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerPawn (U1)</title>
    <id>22198</id>
    <revision>
      <id>29981</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerPawn (UT)</title>
    <id>22199</id>
    <revision>
      <id>29982</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (RTNP)</title>
    <id>22200</id>
    <revision>
      <id>29983</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (U2XMP)</title>
    <id>22201</id>
    <revision>
      <id>29984</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (UDK)</title>
    <id>24756</id>
    <revision>
      <id>36181</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE3}}</text>
    </revision>
    <revision>
      <id>36182</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (UT)</title>
    <id>22202</id>
    <revision>
      <id>29985</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (UT2003)</title>
    <id>22203</id>
    <revision>
      <id>29986</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (UT2004)</title>
    <id>22204</id>
    <revision>
      <id>29987</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerReplicationInfo (UT3)</title>
    <id>22205</id>
    <revision>
      <id>29988</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerReplicationInfo|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (RTNP)</title>
    <id>22206</id>
    <revision>
      <id>29989</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (U2)</title>
    <id>22207</id>
    <revision>
      <id>29990</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (UDK)</title>
    <id>24757</id>
    <revision>
      <id>36183</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36184</id>
      <timestamp>2009-11-06T17:55:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PlayerStart|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (UE2Runtime)</title>
    <id>22208</id>
    <revision>
      <id>29991</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (UT2003)</title>
    <id>22209</id>
    <revision>
      <id>29992</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (UT2004)</title>
    <id>22210</id>
    <revision>
      <id>29993</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlayerStart (UT3)</title>
    <id>22211</id>
    <revision>
      <id>29994</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlayerStart|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PlaylistParserBase (UT2004)</title>
    <id>22212</id>
    <revision>
      <id>29995</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PlaylistParserBase|StreamInterface|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PointLight (UDK)</title>
    <id>24758</id>
    <revision>
      <id>36185</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PointLight|Light|UE3}}</text>
    </revision>
    <revision>
      <id>36186</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PointLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PointLight (UT3)</title>
    <id>22213</id>
    <revision>
      <id>29996</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PointLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PointLightComponent (UDK)</title>
    <id>24759</id>
    <revision>
      <id>36187</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PointLightComponent|LightComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36188</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PointLightComponent|LightComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PointLightComponent (UT3)</title>
    <id>22214</id>
    <revision>
      <id>29997</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PointLightComponent|LightComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PopupPageBase (UT2004)</title>
    <id>22215</id>
    <revision>
      <id>29998</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PopupPageBase|UT2K4GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PortalTeleporter (UDK)</title>
    <id>24760</id>
    <revision>
      <id>36189</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PortalTeleporter|SceneCapturePortalActor|UE3}}</text>
    </revision>
    <revision>
      <id>36190</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PortalTeleporter|SceneCapturePortalActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PortalTeleporter (UT3)</title>
    <id>22216</id>
    <revision>
      <id>29999</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PortalTeleporter|SceneCapturePortalActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PostProcessEffect (UDK)</title>
    <id>24761</id>
    <revision>
      <id>36191</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PostProcessEffect|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36192</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PostProcessEffect|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PostProcessEffect (UT3)</title>
    <id>22217</id>
    <revision>
      <id>30000</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PostProcessEffect|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerStation (U2)</title>
    <id>22218</id>
    <revision>
      <id>30001</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerStation|PowerUp|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerStation (U2XMP)</title>
    <id>22219</id>
    <revision>
      <id>30002</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerStation|PowerUp|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerSuit (U2)</title>
    <id>22220</id>
    <revision>
      <id>30003</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerSuit|Armor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerSuit (U2XMP)</title>
    <id>22221</id>
    <revision>
      <id>30004</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerSuit|Armor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerSuitHeavy (U2XMP)</title>
    <id>22222</id>
    <revision>
      <id>30005</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerSuitHeavy|PowerSuit|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerSuitMedium (U2XMP)</title>
    <id>22223</id>
    <revision>
      <id>30006</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerSuitMedium|PowerSuit|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerSuitPickup (U2XMP)</title>
    <id>22224</id>
    <revision>
      <id>30007</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerSuitPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerUp (U2)</title>
    <id>22225</id>
    <revision>
      <id>30008</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerUp|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerUp (U2XMP)</title>
    <id>22226</id>
    <revision>
      <id>30009</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerUp|U2Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerUpPickup (U2)</title>
    <id>22227</id>
    <revision>
      <id>30010</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerUpPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PowerUpPickup (U2XMP)</title>
    <id>22228</id>
    <revision>
      <id>30011</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PowerUpPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Powerups (U2)</title>
    <id>22229</id>
    <revision>
      <id>30012</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Powerups|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Powerups (U2XMP)</title>
    <id>22230</id>
    <revision>
      <id>30013</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Powerups|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Powerups (UE2Runtime)</title>
    <id>22231</id>
    <revision>
      <id>30014</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Powerups|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Powerups (UT2003)</title>
    <id>22232</id>
    <revision>
      <id>30015</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Powerups|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Powerups (UT2004)</title>
    <id>22233</id>
    <revision>
      <id>30016</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Powerups|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Predator (RTNP)</title>
    <id>22234</id>
    <revision>
      <id>30017</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Predator|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Primitive (U2XMP)</title>
    <id>24456</id>
    <revision>
      <id>35553</id>
      <timestamp>2009-10-25T08:38:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Primitive||UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|Primitive||UE2}}</text>
    </revision>
    <revision>
      <id>35554</id>
      <timestamp>2009-10-25T08:40:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category subclasses|Primitive|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Primitive (UT)</title>
    <id>28446</id>
    <revision>
      <id>40130</id>
      <timestamp>2009-11-15T18:50:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Primitive|Object|UE1}}'</comment>
      <text xml:space="preserve">{{category subclasses|Primitive|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Primitive (UT2003)</title>
    <id>28568</id>
    <revision>
      <id>40280</id>
      <timestamp>2009-11-18T16:13:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Primitive|Object|UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|Primitive|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Primitive (UT2004)</title>
    <id>28444</id>
    <revision>
      <id>40126</id>
      <timestamp>2009-11-15T18:44:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subclasses|Primitive|Object|UE2}}'</comment>
      <text xml:space="preserve">{{category subclasses|Primitive|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PrimitiveComponent (UDK)</title>
    <id>24762</id>
    <revision>
      <id>36193</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PrimitiveComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36194</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PrimitiveComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PrimitiveComponent (UT3)</title>
    <id>22235</id>
    <revision>
      <id>30018</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PrimitiveComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PrimitiveComponentFactory (UDK)</title>
    <id>24763</id>
    <revision>
      <id>36195</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PrimitiveComponentFactory|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36196</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|PrimitiveComponentFactory|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PrimitiveComponentFactory (UT3)</title>
    <id>22236</id>
    <revision>
      <id>30019</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PrimitiveComponentFactory|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (RTNP)</title>
    <id>22237</id>
    <revision>
      <id>30020</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (U1)</title>
    <id>22238</id>
    <revision>
      <id>30021</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (U2)</title>
    <id>22239</id>
    <revision>
      <id>30022</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (U2XMP)</title>
    <id>22240</id>
    <revision>
      <id>30023</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (UDK)</title>
    <id>24764</id>
    <revision>
      <id>36197</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36198</id>
      <timestamp>2009-11-06T17:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (UT)</title>
    <id>22241</id>
    <revision>
      <id>30024</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (UT2003)</title>
    <id>22242</id>
    <revision>
      <id>30025</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (UT2004)</title>
    <id>22243</id>
    <revision>
      <id>30026</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projectile (UT3)</title>
    <id>22244</id>
    <revision>
      <id>30027</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projectile|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProjectileAraknidBase (U2XMP)</title>
    <id>22245</id>
    <revision>
      <id>30028</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProjectileAraknidBase|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProjectileFire (UT2003)</title>
    <id>22252</id>
    <revision>
      <id>30035</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProjectileFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProjectileFire (UT2004)</title>
    <id>22253</id>
    <revision>
      <id>30036</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProjectileFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProjectileSkaarjBase (U2XMP)</title>
    <id>22258</id>
    <revision>
      <id>30041</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProjectileSkaarjBase|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projector (U2)</title>
    <id>22260</id>
    <revision>
      <id>30043</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projector|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projector (U2XMP)</title>
    <id>22261</id>
    <revision>
      <id>30044</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projector|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projector (UE2Runtime)</title>
    <id>22262</id>
    <revision>
      <id>30045</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projector|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projector (UT2003)</title>
    <id>22263</id>
    <revision>
      <id>30046</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projector|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Projector (UT2004)</title>
    <id>22264</id>
    <revision>
      <id>30047</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Projector|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProximityObjective (UT2004)</title>
    <id>22267</id>
    <revision>
      <id>30050</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProximityObjective|GameObjective|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProximitySensor (U2)</title>
    <id>22268</id>
    <revision>
      <id>30051</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProximitySensor|DeployedUnit|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProximitySensor (U2XMP)</title>
    <id>22269</id>
    <revision>
      <id>30052</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProximitySensor|DeployedUnit|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProximitySensorController (U2)</title>
    <id>22270</id>
    <revision>
      <id>30053</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProximitySensorController|StationaryPawnControllerOffensive|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ProximitySensorController (U2XMP)</title>
    <id>22271</id>
    <revision>
      <id>30054</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ProximitySensorController|StationaryPawnControllerOffensive|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PulseLineGenerator (U2)</title>
    <id>22272</id>
    <revision>
      <id>30055</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PulseLineGenerator|ParticleGenerator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PulseLineGenerator (U2XMP)</title>
    <id>22273</id>
    <revision>
      <id>30056</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PulseLineGenerator|ParticleGenerator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PulseLineTemplate (U2)</title>
    <id>22274</id>
    <revision>
      <id>30057</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PulseLineTemplate|ParticleTemplate|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of PulseLineTemplate (U2XMP)</title>
    <id>22275</id>
    <revision>
      <id>30058</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|PulseLineTemplate|ParticleTemplate|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Pylon (UDK)</title>
    <id>24765</id>
    <revision>
      <id>36199</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Pylon|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36200</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Pylon|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RB ConstraintActor (UDK)</title>
    <id>24766</id>
    <revision>
      <id>36201</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RB_ConstraintActor|RigidBodyBase|UE3}}</text>
    </revision>
    <revision>
      <id>36202</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|RB_ConstraintActor|RigidBodyBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RB ConstraintActor (UT3)</title>
    <id>22285</id>
    <revision>
      <id>30068</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RB_ConstraintActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RB ConstraintSetup (UDK)</title>
    <id>24767</id>
    <revision>
      <id>36203</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RB_ConstraintSetup|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36204</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|RB_ConstraintSetup|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RB ConstraintSetup (UT3)</title>
    <id>22286</id>
    <revision>
      <id>30069</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RB_ConstraintSetup|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RB Handle (UT3)</title>
    <id>22287</id>
    <revision>
      <id>30070</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RB_Handle|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RL Explosion (U2)</title>
    <id>22320</id>
    <revision>
      <id>30103</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RL_Explosion|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RL Explosion (U2XMP)</title>
    <id>22321</id>
    <revision>
      <id>30104</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RL_Explosion|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RaffTrainingBot (U2XMP)</title>
    <id>22276</id>
    <revision>
      <id>30059</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RaffTrainingBot|U2Player|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Ranger (U2)</title>
    <id>22277</id>
    <revision>
      <id>30060</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Ranger|U2Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RaptorTurretBarrel (U2)</title>
    <id>22278</id>
    <revision>
      <id>30061</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RaptorTurretBarrel|XMPVehicleBarrel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RatedMatchInfo (UT)</title>
    <id>22279</id>
    <revision>
      <id>30062</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RatedMatchInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RatedTeamInfo (UT)</title>
    <id>22280</id>
    <revision>
      <id>30063</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RatedTeamInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Razor2 (UT)</title>
    <id>22281</id>
    <revision>
      <id>30064</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Razor2|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RazorBlade (RTNP)</title>
    <id>22282</id>
    <revision>
      <id>30065</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RazorBlade|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RazorBlade (U1)</title>
    <id>22283</id>
    <revision>
      <id>30066</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RazorBlade|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RazorBlade (UT)</title>
    <id>22284</id>
    <revision>
      <id>30067</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RazorBlade|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReachSpec (UDK)</title>
    <id>24768</id>
    <revision>
      <id>36205</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReachSpec|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36206</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ReachSpec|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReachSpec (UT3)</title>
    <id>22288</id>
    <revision>
      <id>30071</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReachSpec|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RedeemerFire (UT2003)</title>
    <id>22289</id>
    <revision>
      <id>30072</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RedeemerFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RedeemerFire (UT2004)</title>
    <id>22290</id>
    <revision>
      <id>30073</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RedeemerFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RedeemerProjectile (UT2004)</title>
    <id>22291</id>
    <revision>
      <id>30074</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RedeemerProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Relic (UT)</title>
    <id>22292</id>
    <revision>
      <id>30075</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Relic|Mutator|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RelicInventory (UT)</title>
    <id>22293</id>
    <revision>
      <id>30076</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RelicInventory|TournamentPickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RelicShell (UT)</title>
    <id>22294</id>
    <revision>
      <id>30077</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RelicShell|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RenderIterator (U2XMP)</title>
    <id>22300</id>
    <revision>
      <id>30083</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RenderIterator|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RenderedMaterial (U2)</title>
    <id>22295</id>
    <revision>
      <id>30078</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RenderedMaterial|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RenderedMaterial (U2XMP)</title>
    <id>22296</id>
    <revision>
      <id>30079</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RenderedMaterial|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RenderedMaterial (UE2Runtime)</title>
    <id>22297</id>
    <revision>
      <id>30080</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RenderedMaterial|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RenderedMaterial (UT2003)</title>
    <id>22298</id>
    <revision>
      <id>30081</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RenderedMaterial|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RenderedMaterial (UT2004)</title>
    <id>22299</id>
    <revision>
      <id>30082</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RenderedMaterial|Material|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicatedEffect (U2)</title>
    <id>22301</id>
    <revision>
      <id>30084</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicatedEffect|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (RTNP)</title>
    <id>22302</id>
    <revision>
      <id>30085</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (U1)</title>
    <id>22303</id>
    <revision>
      <id>30086</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (U2)</title>
    <id>22304</id>
    <revision>
      <id>30087</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (U2XMP)</title>
    <id>22305</id>
    <revision>
      <id>30088</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (UDK)</title>
    <id>24769</id>
    <revision>
      <id>36207</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE3}}</text>
    </revision>
    <revision>
      <id>36208</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (UE2Runtime)</title>
    <id>22306</id>
    <revision>
      <id>30089</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (UT)</title>
    <id>22307</id>
    <revision>
      <id>30090</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (UT2003)</title>
    <id>22308</id>
    <revision>
      <id>30091</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (UT2004)</title>
    <id>22309</id>
    <revision>
      <id>30092</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ReplicationInfo (UT3)</title>
    <id>22310</id>
    <revision>
      <id>30093</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ReplicationInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Resource (UT2003)</title>
    <id>22311</id>
    <revision>
      <id>30094</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Resource|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Resource (UT2004)</title>
    <id>22312</id>
    <revision>
      <id>30095</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Resource|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RifleAmmo (RTNP)</title>
    <id>22313</id>
    <revision>
      <id>30096</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RifleAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RifleAmmo (U1)</title>
    <id>22314</id>
    <revision>
      <id>30097</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RifleAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RifleAmmo (UT)</title>
    <id>22315</id>
    <revision>
      <id>30098</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RifleAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RifleShell (UT)</title>
    <id>22316</id>
    <revision>
      <id>30099</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RifleShell|BulletBox|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RigidBodyBase (UDK)</title>
    <id>24770</id>
    <revision>
      <id>36209</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RigidBodyBase|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36210</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|RigidBodyBase|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RingExplosion (RTNP)</title>
    <id>22317</id>
    <revision>
      <id>30100</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RingExplosion|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RingExplosion (U1)</title>
    <id>22318</id>
    <revision>
      <id>30101</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RingExplosion|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RingExplosion (UT)</title>
    <id>22319</id>
    <revision>
      <id>30102</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RingExplosion|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RoadPathNode (UT2004)</title>
    <id>22322</id>
    <revision>
      <id>30105</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RoadPathNode|PathNode|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RobotVoice (UT2004)</title>
    <id>22323</id>
    <revision>
      <id>30106</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RobotVoice|xVoicePack|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RockSlide (RTNP)</title>
    <id>22343</id>
    <revision>
      <id>30126</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RockSlide|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RockSlide (U1)</title>
    <id>22344</id>
    <revision>
      <id>30127</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RockSlide|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RockSlide (UT)</title>
    <id>22345</id>
    <revision>
      <id>30128</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RockSlide|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketExplosion (UT2003)</title>
    <id>22327</id>
    <revision>
      <id>30110</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketExplosion|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketExplosion (UT2004)</title>
    <id>22328</id>
    <revision>
      <id>30111</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketExplosion|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketFire (UT2003)</title>
    <id>22329</id>
    <revision>
      <id>30112</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketFire (UT2004)</title>
    <id>22330</id>
    <revision>
      <id>30113</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketLauncher (U2)</title>
    <id>22331</id>
    <revision>
      <id>30114</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketLauncher|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketLauncher (UT2003)</title>
    <id>22332</id>
    <revision>
      <id>30115</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketLauncher|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketLauncher (UT2004)</title>
    <id>22333</id>
    <revision>
      <id>30116</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketLauncher|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketLauncherPickup (UT2003)</title>
    <id>22334</id>
    <revision>
      <id>30117</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketLauncherPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketLauncherPickup (UT2004)</title>
    <id>22335</id>
    <revision>
      <id>30118</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketLauncherPickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketMk2 (UT)</title>
    <id>22336</id>
    <revision>
      <id>30119</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketMk2|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketMultiFire (UT2003)</title>
    <id>22337</id>
    <revision>
      <id>30120</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketMultiFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketMultiFire (UT2004)</title>
    <id>22338</id>
    <revision>
      <id>30121</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketMultiFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketPack (UT)</title>
    <id>22339</id>
    <revision>
      <id>30122</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketPack|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketProj (UT2003)</title>
    <id>22340</id>
    <revision>
      <id>30123</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketProj|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketProj (UT2004)</title>
    <id>22341</id>
    <revision>
      <id>30124</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketProj|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RocketProjectileHeavy (U2)</title>
    <id>22342</id>
    <revision>
      <id>30125</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RocketProjectileHeavy|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RosterEntry (UT2003)</title>
    <id>22346</id>
    <revision>
      <id>30129</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RosterEntry|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of RosterEntry (UT2004)</title>
    <id>22347</id>
    <revision>
      <id>30130</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|RosterEntry|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SCar (U2)</title>
    <id>22350</id>
    <revision>
      <id>30133</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SCar|SVehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SPECIES Human (UT2003)</title>
    <id>22538</id>
    <revision>
      <id>30321</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SPECIES_Human|SpeciesType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SPECIES Human (UT2004)</title>
    <id>22539</id>
    <revision>
      <id>30322</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SPECIES_Human|SpeciesType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SPHighScoreBase (UT2004)</title>
    <id>22546</id>
    <revision>
      <id>30329</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SPHighScoreBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY LadderButton (UT2003)</title>
    <id>22609</id>
    <revision>
      <id>30392</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_LadderButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY LadderButton (UT2004)</title>
    <id>22610</id>
    <revision>
      <id>30393</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_LadderButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY ListBox (UE2Runtime)</title>
    <id>22611</id>
    <revision>
      <id>30394</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_ListBox|STY_SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY ListBox (UT2003)</title>
    <id>22612</id>
    <revision>
      <id>30395</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_ListBox|STY_SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY ListBox (UT2004)</title>
    <id>22613</id>
    <revision>
      <id>30396</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_ListBox|STY_SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY ListSelection (UT2004)</title>
    <id>22614</id>
    <revision>
      <id>30397</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_ListSelection|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY NoBackground (UE2Runtime)</title>
    <id>22615</id>
    <revision>
      <id>30398</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_NoBackground|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY NoBackground (UT2003)</title>
    <id>22616</id>
    <revision>
      <id>30399</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_NoBackground|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY NoBackground (UT2004)</title>
    <id>22617</id>
    <revision>
      <id>30400</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_NoBackground|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY RoundButton (UE2Runtime)</title>
    <id>22618</id>
    <revision>
      <id>30401</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_RoundButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY RoundButton (UT2003)</title>
    <id>22619</id>
    <revision>
      <id>30402</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_RoundButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY RoundButton (UT2004)</title>
    <id>22620</id>
    <revision>
      <id>30403</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_RoundButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY SquareButton (UE2Runtime)</title>
    <id>22621</id>
    <revision>
      <id>30404</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_SquareButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY SquareButton (UT2003)</title>
    <id>22622</id>
    <revision>
      <id>30405</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_SquareButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY SquareButton (UT2004)</title>
    <id>22623</id>
    <revision>
      <id>30406</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_SquareButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY SquareMenuButton (UE2Runtime)</title>
    <id>22624</id>
    <revision>
      <id>30407</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_SquareMenuButton|GUIStyles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY SquareMenuButton (UT2003)</title>
    <id>22625</id>
    <revision>
      <id>30408</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_SquareMenuButton|STY_SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY SquareMenuButton (UT2004)</title>
    <id>22626</id>
    <revision>
      <id>30409</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY_SquareMenuButton|STY_SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2ComboButton (UT2004)</title>
    <id>22596</id>
    <revision>
      <id>30379</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2ComboButton|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2ContextMenu (UT2004)</title>
    <id>22597</id>
    <revision>
      <id>30380</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2ContextMenu|STY2ListBox|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2Footer (UT2004)</title>
    <id>22598</id>
    <revision>
      <id>30381</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2Footer|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2LadderButton (UT2004)</title>
    <id>22599</id>
    <revision>
      <id>30382</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2LadderButton|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2ListBox (UT2004)</title>
    <id>22600</id>
    <revision>
      <id>30383</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2ListBox|STY2SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2ListSelection (UT2004)</title>
    <id>22601</id>
    <revision>
      <id>30384</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2ListSelection|STY_ListSelection|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2NoBackground (UT2004)</title>
    <id>22602</id>
    <revision>
      <id>30385</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2NoBackground|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2RoundButton (UT2004)</title>
    <id>22603</id>
    <revision>
      <id>30386</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2RoundButton|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2SquareButton (UT2004)</title>
    <id>22604</id>
    <revision>
      <id>30387</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2SquareButton|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2SquareMenuButton (UT2004)</title>
    <id>22605</id>
    <revision>
      <id>30388</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2SquareMenuButton|STY2SquareButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2TabButton (UT2004)</title>
    <id>22606</id>
    <revision>
      <id>30389</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2TabButton|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2TextButton (UT2004)</title>
    <id>22607</id>
    <revision>
      <id>30390</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2TextButton|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of STY2TextLabel (UT2004)</title>
    <id>22608</id>
    <revision>
      <id>30391</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|STY2TextLabel|GUI2Styles|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicle (U2)</title>
    <id>22646</id>
    <revision>
      <id>30429</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicle|Vehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicle (UDK)</title>
    <id>24821</id>
    <revision>
      <id>36311</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicle|Vehicle|UE3}}</text>
    </revision>
    <revision>
      <id>36312</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SVehicle|Vehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicle (UT2004)</title>
    <id>22647</id>
    <revision>
      <id>30430</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicle|Vehicle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicle (UT3)</title>
    <id>22648</id>
    <revision>
      <id>30431</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicle|Vehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleFactory (UT2004)</title>
    <id>22649</id>
    <revision>
      <id>30432</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleFactory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleSimBase (UDK)</title>
    <id>24822</id>
    <revision>
      <id>36313</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleSimBase|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36314</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SVehicleSimBase|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleSimBase (UT3)</title>
    <id>22650</id>
    <revision>
      <id>30433</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleSimBase|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleSimCar (UDK)</title>
    <id>24823</id>
    <revision>
      <id>36315</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleSimCar|SVehicleSimBase|UE3}}</text>
    </revision>
    <revision>
      <id>36316</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SVehicleSimCar|SVehicleSimBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleSimCar (UT3)</title>
    <id>22651</id>
    <revision>
      <id>30434</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleSimCar|SVehicleSimBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleSimTank (UT3)</title>
    <id>22652</id>
    <revision>
      <id>30435</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleSimTank|SVehicleSimCar|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleTrigger (UT2004)</title>
    <id>22653</id>
    <revision>
      <id>30436</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleTrigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleWheel (UDK)</title>
    <id>24824</id>
    <revision>
      <id>36317</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleWheel|Component|UE3}}</text>
    </revision>
    <revision>
      <id>36318</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SVehicleWheel|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SVehicleWheel (UT3)</title>
    <id>22654</id>
    <revision>
      <id>30437</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SVehicleWheel|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScaledSprite (UT2003)</title>
    <id>22348</id>
    <revision>
      <id>30131</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScaledSprite|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScaledSprite (UT2004)</title>
    <id>22349</id>
    <revision>
      <id>30132</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScaledSprite|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCaptureActor (UDK)</title>
    <id>24771</id>
    <revision>
      <id>36211</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCaptureActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36212</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SceneCaptureActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCaptureActor (UT3)</title>
    <id>22351</id>
    <revision>
      <id>30134</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCaptureActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCaptureComponent (UDK)</title>
    <id>24772</id>
    <revision>
      <id>36213</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCaptureComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36214</id>
      <timestamp>2009-11-06T17:55:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SceneCaptureComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCaptureComponent (UT3)</title>
    <id>22352</id>
    <revision>
      <id>30135</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCaptureComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCapturePortalActor (UDK)</title>
    <id>24773</id>
    <revision>
      <id>36215</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCapturePortalActor|SceneCaptureReflectActor|UE3}}</text>
    </revision>
    <revision>
      <id>36216</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SceneCapturePortalActor|SceneCaptureReflectActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCapturePortalActor (UT3)</title>
    <id>22353</id>
    <revision>
      <id>30136</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCapturePortalActor|SceneCaptureReflectActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCaptureReflectActor (UDK)</title>
    <id>24774</id>
    <revision>
      <id>36217</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCaptureReflectActor|SceneCaptureActor|UE3}}</text>
    </revision>
    <revision>
      <id>36218</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SceneCaptureReflectActor|SceneCaptureActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SceneCaptureReflectActor (UT3)</title>
    <id>22354</id>
    <revision>
      <id>30137</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SceneCaptureReflectActor|SceneCaptureActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Scorch (UT)</title>
    <id>22355</id>
    <revision>
      <id>30138</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Scorch|Decal|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoard (RTNP)</title>
    <id>22356</id>
    <revision>
      <id>30139</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoard|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoard (U1)</title>
    <id>22357</id>
    <revision>
      <id>30140</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoard|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoard (UT)</title>
    <id>22358</id>
    <revision>
      <id>30141</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoard|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoard (UT2003)</title>
    <id>22359</id>
    <revision>
      <id>30142</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoard|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoard (UT2004)</title>
    <id>22360</id>
    <revision>
      <id>30143</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoard|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoardDeathMatch (UT2003)</title>
    <id>22361</id>
    <revision>
      <id>30144</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoardDeathMatch|ScoreBoard|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoardDeathMatch (UT2004)</title>
    <id>22362</id>
    <revision>
      <id>30145</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoardDeathMatch|ScoreBoard|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScoreBoardTeamDeathMatch (UT2004)</title>
    <id>22363</id>
    <revision>
      <id>30146</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScoreBoardTeamDeathMatch|ScoreBoardDeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Scout (UDK)</title>
    <id>24775</id>
    <revision>
      <id>36219</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Scout|Pawn|UE3}}</text>
    </revision>
    <revision>
      <id>36220</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Scout|Pawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Scout (UT3)</title>
    <id>22364</id>
    <revision>
      <id>30147</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Scout|Pawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptControllerInterf (U2XMP)</title>
    <id>22365</id>
    <revision>
      <id>30148</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptControllerInterf|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedAction (U2)</title>
    <id>22366</id>
    <revision>
      <id>30149</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedAction|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedAction (UE2Runtime)</title>
    <id>22367</id>
    <revision>
      <id>30150</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedAction|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedAction (UT2003)</title>
    <id>22368</id>
    <revision>
      <id>30151</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedAction|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedAction (UT2004)</title>
    <id>22369</id>
    <revision>
      <id>30152</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedAction|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedController (U2)</title>
    <id>22370</id>
    <revision>
      <id>30153</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedController (UE2Runtime)</title>
    <id>22371</id>
    <revision>
      <id>30154</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedController (UT2003)</title>
    <id>22372</id>
    <revision>
      <id>30155</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedController (UT2004)</title>
    <id>22373</id>
    <revision>
      <id>30156</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedLight (U2XMP)</title>
    <id>22374</id>
    <revision>
      <id>30157</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedLight|Light|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedPawn (RTNP)</title>
    <id>22375</id>
    <revision>
      <id>30158</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedPawn (U1)</title>
    <id>22376</id>
    <revision>
      <id>30159</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedPawn (UT)</title>
    <id>22377</id>
    <revision>
      <id>30160</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedSequence (U2)</title>
    <id>22378</id>
    <revision>
      <id>30161</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedSequence|AIScript|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedSequence (UE2Runtime)</title>
    <id>22379</id>
    <revision>
      <id>30162</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedSequence|AIScript|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedSequence (UT2003)</title>
    <id>22380</id>
    <revision>
      <id>30163</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedSequence|AIScript|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ScriptedSequence (UT2004)</title>
    <id>22381</id>
    <revision>
      <id>30164</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ScriptedSequence|AIScript|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Security (UT2003)</title>
    <id>22382</id>
    <revision>
      <id>30165</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Security|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Security (UT2004)</title>
    <id>22383</id>
    <revision>
      <id>30166</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Security|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeekingRocketProj (UT2003)</title>
    <id>22384</id>
    <revision>
      <id>30167</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeekingRocketProj|RocketProj|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeekingRocketProj (UT2004)</title>
    <id>22385</id>
    <revision>
      <id>30168</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeekingRocketProj|RocketProj|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SentinelController (UT2004)</title>
    <id>22386</id>
    <revision>
      <id>30169</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SentinelController|TurretController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct ActorFactory (UDK)</title>
    <id>24776</id>
    <revision>
      <id>36221</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_ActorFactory|SeqAct_Latent|UE3}}</text>
    </revision>
    <revision>
      <id>36222</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_ActorFactory|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct ActorFactory (UT3)</title>
    <id>22387</id>
    <revision>
      <id>30170</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_ActorFactory|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct DisplayChapterTitleBase (UT3)</title>
    <id>22388</id>
    <revision>
      <id>30171</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_DisplayChapterTitleBase|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct GameCrowdSpawner (UDK)</title>
    <id>24777</id>
    <revision>
      <id>36223</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_GameCrowdSpawner|SeqAct_Latent|UE3}}</text>
    </revision>
    <revision>
      <id>36224</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_GameCrowdSpawner|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct HealDamage (UDK)</title>
    <id>24778</id>
    <revision>
      <id>36225</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_HealDamage|SequenceAction|UE3}}</text>
    </revision>
    <revision>
      <id>36226</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_HealDamage|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct HealDamage (UT3)</title>
    <id>22389</id>
    <revision>
      <id>30172</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_HealDamage|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Interp (UT3)</title>
    <id>22390</id>
    <revision>
      <id>30173</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Interp|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Latent (UDK)</title>
    <id>24779</id>
    <revision>
      <id>36227</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Latent|SequenceAction|UE3}}</text>
    </revision>
    <revision>
      <id>36228</id>
      <timestamp>2009-11-06T17:55:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_Latent|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Latent (UT3)</title>
    <id>22391</id>
    <revision>
      <id>30174</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Latent|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct LevelStreamingBase (UDK)</title>
    <id>24780</id>
    <revision>
      <id>36229</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_LevelStreamingBase|SeqAct_Latent|UE3}}</text>
    </revision>
    <revision>
      <id>36230</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_LevelStreamingBase|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct LevelStreamingBase (UT3)</title>
    <id>22392</id>
    <revision>
      <id>30175</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_LevelStreamingBase|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct PlayCameraAnim (UT3)</title>
    <id>22393</id>
    <revision>
      <id>30176</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_PlayCameraAnim|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct PlaySound (UT3)</title>
    <id>22394</id>
    <revision>
      <id>30177</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_PlaySound|SeqAct_Latent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct SetSequenceVariable (UDK)</title>
    <id>24781</id>
    <revision>
      <id>36231</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_SetSequenceVariable|SequenceAction|UE3}}</text>
    </revision>
    <revision>
      <id>36232</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_SetSequenceVariable|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct SetSequenceVariable (UT3)</title>
    <id>22395</id>
    <revision>
      <id>30178</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_SetSequenceVariable|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Switch (UDK)</title>
    <id>24782</id>
    <revision>
      <id>36233</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Switch|SequenceAction|UE3}}</text>
    </revision>
    <revision>
      <id>36234</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_Switch|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Switch (UT3)</title>
    <id>22396</id>
    <revision>
      <id>30179</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Switch|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Toggle (UDK)</title>
    <id>24783</id>
    <revision>
      <id>36235</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Toggle|SequenceAction|UE3}}</text>
    </revision>
    <revision>
      <id>36236</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqAct_Toggle|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqAct Toggle (UT3)</title>
    <id>22397</id>
    <revision>
      <id>30180</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqAct_Toggle|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqCond SwitchBase (UDK)</title>
    <id>24784</id>
    <revision>
      <id>36237</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqCond_SwitchBase|SequenceCondition|UE3}}</text>
    </revision>
    <revision>
      <id>36238</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqCond_SwitchBase|SequenceCondition|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqCond SwitchBase (UT3)</title>
    <id>22398</id>
    <revision>
      <id>30181</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqCond_SwitchBase|SequenceCondition|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqCond SwitchObject (UDK)</title>
    <id>24785</id>
    <revision>
      <id>36239</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqCond_SwitchObject|SeqCond_SwitchBase|UE3}}</text>
    </revision>
    <revision>
      <id>36240</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqCond_SwitchObject|SeqCond_SwitchBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqCond SwitchObject (UT3)</title>
    <id>22399</id>
    <revision>
      <id>30182</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqCond_SwitchObject|SeqCond_SwitchBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqEvent Touch (UDK)</title>
    <id>24786</id>
    <revision>
      <id>36241</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqEvent_Touch|SequenceEvent|UE3}}</text>
    </revision>
    <revision>
      <id>36242</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqEvent_Touch|SequenceEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqEvent Touch (UT3)</title>
    <id>22400</id>
    <revision>
      <id>30183</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqEvent_Touch|SequenceEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqVar Float (UDK)</title>
    <id>24796</id>
    <revision>
      <id>36261</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqVar_Float|SequenceVariable|UE3}}</text>
    </revision>
    <revision>
      <id>36262</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqVar_Float|SequenceVariable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqVar Float (UT3)</title>
    <id>22410</id>
    <revision>
      <id>30193</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqVar_Float|SequenceVariable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqVar Int (UDK)</title>
    <id>24797</id>
    <revision>
      <id>36263</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqVar_Int|SequenceVariable|UE3}}</text>
    </revision>
    <revision>
      <id>36264</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqVar_Int|SequenceVariable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqVar Int (UT3)</title>
    <id>22411</id>
    <revision>
      <id>30194</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqVar_Int|SequenceVariable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqVar Object (UDK)</title>
    <id>24798</id>
    <revision>
      <id>36265</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqVar_Object|SequenceVariable|UE3}}</text>
    </revision>
    <revision>
      <id>36266</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SeqVar_Object|SequenceVariable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SeqVar Object (UT3)</title>
    <id>22412</id>
    <revision>
      <id>30195</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SeqVar_Object|SequenceVariable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Sequence (UDK)</title>
    <id>24787</id>
    <revision>
      <id>36243</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Sequence|SequenceOp|UE3}}</text>
    </revision>
    <revision>
      <id>36244</id>
      <timestamp>2009-11-06T17:55:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Sequence|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Sequence (UT3)</title>
    <id>22401</id>
    <revision>
      <id>30184</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Sequence|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceAction (UDK)</title>
    <id>24788</id>
    <revision>
      <id>36245</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceAction|SequenceOp|UE3}}</text>
    </revision>
    <revision>
      <id>36246</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceAction|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceAction (UT3)</title>
    <id>22402</id>
    <revision>
      <id>30185</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceAction|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceCondition (UDK)</title>
    <id>24789</id>
    <revision>
      <id>36247</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceCondition|SequenceOp|UE3}}</text>
    </revision>
    <revision>
      <id>36248</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceCondition|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceCondition (UT3)</title>
    <id>22403</id>
    <revision>
      <id>30186</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceCondition|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceEvent (UDK)</title>
    <id>24790</id>
    <revision>
      <id>36249</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceEvent|SequenceOp|UE3}}</text>
    </revision>
    <revision>
      <id>36250</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceEvent|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceEvent (UT3)</title>
    <id>22404</id>
    <revision>
      <id>30187</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceEvent|SequenceOp|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceFrame (UDK)</title>
    <id>24791</id>
    <revision>
      <id>36251</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceFrame|SequenceObject|UE3}}</text>
    </revision>
    <revision>
      <id>36252</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceFrame|SequenceObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceFrame (UT3)</title>
    <id>22405</id>
    <revision>
      <id>30188</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceFrame|SequenceObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceObject (UDK)</title>
    <id>24792</id>
    <revision>
      <id>36253</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceObject|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36254</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceObject|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceObject (UT3)</title>
    <id>22406</id>
    <revision>
      <id>30189</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceObject|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceObjectHelper (UDK)</title>
    <id>24793</id>
    <revision>
      <id>36255</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceObjectHelper|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36256</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceObjectHelper|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceObjectHelper (UT3)</title>
    <id>22407</id>
    <revision>
      <id>30190</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceObjectHelper|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceOp (UDK)</title>
    <id>24794</id>
    <revision>
      <id>36257</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceOp|SequenceObject|UE3}}</text>
    </revision>
    <revision>
      <id>36258</id>
      <timestamp>2009-11-06T17:55:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceOp|SequenceObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceOp (UT3)</title>
    <id>22408</id>
    <revision>
      <id>30191</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceOp|SequenceObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceVariable (UDK)</title>
    <id>24795</id>
    <revision>
      <id>36259</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceVariable|SequenceObject|UE3}}</text>
    </revision>
    <revision>
      <id>36260</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SequenceVariable|SequenceObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SequenceVariable (UT3)</title>
    <id>22409</id>
    <revision>
      <id>30192</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SequenceVariable|SequenceObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerBrowserMCList (UT2004)</title>
    <id>22413</id>
    <revision>
      <id>30196</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerBrowserMCList|GUIMultiColumnList|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerBrowserMCListBox (UT2004)</title>
    <id>22414</id>
    <revision>
      <id>30197</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerBrowserMCListBox|GUIMultiColumnListBox|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerInfo (UT)</title>
    <id>22415</id>
    <revision>
      <id>30198</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerInfoTeam (UT)</title>
    <id>22416</id>
    <revision>
      <id>30199</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerInfoTeam|ServerInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerQueryClient (U2)</title>
    <id>22417</id>
    <revision>
      <id>30200</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerQueryClient|MasterServerLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerQueryClient (UE2Runtime)</title>
    <id>22418</id>
    <revision>
      <id>30201</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerQueryClient|MasterServerLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerQueryClient (UT2003)</title>
    <id>22419</id>
    <revision>
      <id>30202</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerQueryClient|MasterServerLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ServerQueryClient (UT2004)</title>
    <id>22420</id>
    <revision>
      <id>30203</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ServerQueryClient|MasterServerLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SessionSettingsProvider (UDK)</title>
    <id>24799</id>
    <revision>
      <id>36267</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SessionSettingsProvider|UISettingsProvider|UE3}}</text>
    </revision>
    <revision>
      <id>36268</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SessionSettingsProvider|UISettingsProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SessionSettingsProvider (UT3)</title>
    <id>22421</id>
    <revision>
      <id>30204</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SessionSettingsProvider|UISettingsProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Settings (UDK)</title>
    <id>24800</id>
    <revision>
      <id>36269</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Settings|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36270</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Settings|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Settings (UT3)</title>
    <id>22422</id>
    <revision>
      <id>30205</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Settings|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Settings Tabs (UT2004)</title>
    <id>22423</id>
    <revision>
      <id>30206</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Settings_Tabs|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShadowBitmapMaterial (U2XMP)</title>
    <id>22424</id>
    <revision>
      <id>30207</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShadowBitmapMaterial|BitmapMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShadowProjector (U2)</title>
    <id>22425</id>
    <revision>
      <id>30208</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShadowProjector|Projector|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShellSpewer (UT2004)</title>
    <id>22429</id>
    <revision>
      <id>30212</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShellSpewer|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Shellbox (RTNP)</title>
    <id>22426</id>
    <revision>
      <id>30209</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Shellbox|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Shellbox (U1)</title>
    <id>22427</id>
    <revision>
      <id>30210</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Shellbox|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Shellbox (UT)</title>
    <id>22428</id>
    <revision>
      <id>30211</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Shellbox|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldBelt (RTNP)</title>
    <id>22430</id>
    <revision>
      <id>30213</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldBelt|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldBelt (U1)</title>
    <id>22431</id>
    <revision>
      <id>30214</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldBelt|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldBelt (UT)</title>
    <id>22432</id>
    <revision>
      <id>30215</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldBelt|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldBeltEffect (RTNP)</title>
    <id>22433</id>
    <revision>
      <id>30216</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldBeltEffect|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldEffect3rd (UT2003)</title>
    <id>22434</id>
    <revision>
      <id>30217</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldEffect3rd|AimedAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldEffect3rd (UT2004)</title>
    <id>22435</id>
    <revision>
      <id>30218</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldEffect3rd|AimedAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldFire (UT2003)</title>
    <id>22436</id>
    <revision>
      <id>30219</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldFire (UT2004)</title>
    <id>22437</id>
    <revision>
      <id>30220</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldFire|WeaponFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldGun (UT2003)</title>
    <id>22438</id>
    <revision>
      <id>30221</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldGun|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldGun (UT2004)</title>
    <id>22439</id>
    <revision>
      <id>30222</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldGun|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldPickup (UT2003)</title>
    <id>22440</id>
    <revision>
      <id>30223</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldPickup|TournamentPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShieldPickup (UT2004)</title>
    <id>22441</id>
    <revision>
      <id>30224</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShieldPickup|TournamentPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockAmmo (UT2003)</title>
    <id>22442</id>
    <revision>
      <id>30225</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockAmmo|Ammunition|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockAmmo (UT2004)</title>
    <id>22443</id>
    <revision>
      <id>30226</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockAmmo|Ammunition|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeam (UT)</title>
    <id>22444</id>
    <revision>
      <id>30227</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeam|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeamCoil (UT2003)</title>
    <id>22445</id>
    <revision>
      <id>30228</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeamCoil|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeamCoil (UT2004)</title>
    <id>22446</id>
    <revision>
      <id>30229</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeamCoil|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeamEffect (UT2003)</title>
    <id>22447</id>
    <revision>
      <id>30230</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeamEffect|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeamEffect (UT2004)</title>
    <id>22448</id>
    <revision>
      <id>30231</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeamEffect|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeamFire (UT2003)</title>
    <id>22449</id>
    <revision>
      <id>30232</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeamFire|InstantFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockBeamFire (UT2004)</title>
    <id>22450</id>
    <revision>
      <id>30233</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockBeamFire|InstantFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockCore (UT)</title>
    <id>22451</id>
    <revision>
      <id>30234</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockCore|TournamentAmmo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockExplosionCore (UT2003)</title>
    <id>22452</id>
    <revision>
      <id>30235</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockExplosionCore|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockExplosionCore (UT2004)</title>
    <id>22453</id>
    <revision>
      <id>30236</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockExplosionCore|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockImpactFlare (UT2003)</title>
    <id>22454</id>
    <revision>
      <id>30237</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockImpactFlare|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockImpactFlare (UT2004)</title>
    <id>22455</id>
    <revision>
      <id>30238</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockImpactFlare|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockImpactRing (UT2003)</title>
    <id>22456</id>
    <revision>
      <id>30239</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockImpactRing|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockImpactRing (UT2004)</title>
    <id>22457</id>
    <revision>
      <id>30240</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockImpactRing|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockMuzFlash (UT2003)</title>
    <id>22458</id>
    <revision>
      <id>30241</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockMuzFlash|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockMuzFlash (UT2004)</title>
    <id>22459</id>
    <revision>
      <id>30242</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockMuzFlash|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockMuzFlash3rd (UT2003)</title>
    <id>22460</id>
    <revision>
      <id>30243</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockMuzFlash3rd|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockMuzFlash3rd (UT2004)</title>
    <id>22461</id>
    <revision>
      <id>30244</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockMuzFlash3rd|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockProjFire (UT2003)</title>
    <id>22464</id>
    <revision>
      <id>30247</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockProjFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockProjFire (UT2004)</title>
    <id>22465</id>
    <revision>
      <id>30248</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockProjFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockProjectile (UT2003)</title>
    <id>22462</id>
    <revision>
      <id>30245</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockProjectile (UT2004)</title>
    <id>22463</id>
    <revision>
      <id>30246</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockRifle (UT)</title>
    <id>22466</id>
    <revision>
      <id>30249</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockRifle|TournamentWeapon|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockRifle (UT2003)</title>
    <id>22467</id>
    <revision>
      <id>30250</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockRifle|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockRifle (UT2004)</title>
    <id>22468</id>
    <revision>
      <id>30251</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockRifle|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockRiflePickup (UT2003)</title>
    <id>22469</id>
    <revision>
      <id>30252</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockRiflePickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShockRiflePickup (UT2004)</title>
    <id>22470</id>
    <revision>
      <id>30253</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShockRiflePickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShootSpot (UT2003)</title>
    <id>22471</id>
    <revision>
      <id>30254</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShootSpot|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ShootSpot (UT2004)</title>
    <id>22472</id>
    <revision>
      <id>30255</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ShootSpot|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SinglePlayer (RTNP)</title>
    <id>22473</id>
    <revision>
      <id>30256</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SinglePlayer|UnrealGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Skaarj (RTNP)</title>
    <id>22474</id>
    <revision>
      <id>30257</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Skaarj|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Skaarj (U1)</title>
    <id>22475</id>
    <revision>
      <id>30258</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Skaarj|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Skaarj (UT)</title>
    <id>22476</id>
    <revision>
      <id>30259</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Skaarj|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Skaarj (UT2003)</title>
    <id>22477</id>
    <revision>
      <id>30260</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Skaarj|Monster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Skaarj (UT2004)</title>
    <id>22478</id>
    <revision>
      <id>30261</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Skaarj|Monster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjController (U2XMP)</title>
    <id>22479</id>
    <revision>
      <id>30262</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjController|U2NPCControllerBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjProjectile (RTNP)</title>
    <id>22480</id>
    <revision>
      <id>30263</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjProjectile|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjProjectile (U1)</title>
    <id>22481</id>
    <revision>
      <id>30264</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjProjectile|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjProjectile (UT)</title>
    <id>22482</id>
    <revision>
      <id>30265</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjProjectile|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjProjectile (UT2003)</title>
    <id>22483</id>
    <revision>
      <id>30266</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjProjectile (UT2004)</title>
    <id>22484</id>
    <revision>
      <id>30267</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjProjectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjTrooper (RTNP)</title>
    <id>22485</id>
    <revision>
      <id>30268</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjTrooper|Skaarj|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjTrooper (U1)</title>
    <id>22486</id>
    <revision>
      <id>30269</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjTrooper|Skaarj|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjTrooper (UT)</title>
    <id>22487</id>
    <revision>
      <id>30270</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjTrooper|Skaarj|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjWarrior (RTNP)</title>
    <id>22488</id>
    <revision>
      <id>30271</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjWarrior|Skaarj|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjWarrior (U1)</title>
    <id>22489</id>
    <revision>
      <id>30272</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjWarrior|Skaarj|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkaarjWarrior (UT)</title>
    <id>22490</id>
    <revision>
      <id>30273</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkaarjWarrior|Skaarj|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlBase (UDK)</title>
    <id>24801</id>
    <revision>
      <id>36271</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlBase|AnimObject|UE3}}</text>
    </revision>
    <revision>
      <id>36272</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkelControlBase|AnimObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlBase (UT3)</title>
    <id>22491</id>
    <revision>
      <id>30274</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlBase|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlLimb (UDK)</title>
    <id>24802</id>
    <revision>
      <id>36273</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlLimb|SkelControlBase|UE3}}</text>
    </revision>
    <revision>
      <id>36274</id>
      <timestamp>2009-11-06T17:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkelControlLimb|SkelControlBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlLimb (UT3)</title>
    <id>22492</id>
    <revision>
      <id>30275</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlLimb|SkelControlBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlLookAt (UDK)</title>
    <id>24803</id>
    <revision>
      <id>36275</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlLookAt|SkelControlBase|UE3}}</text>
    </revision>
    <revision>
      <id>36276</id>
      <timestamp>2009-11-06T17:55:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkelControlLookAt|SkelControlBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlLookAt (UT3)</title>
    <id>22493</id>
    <revision>
      <id>30276</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlLookAt|SkelControlBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlSingleBone (UDK)</title>
    <id>24804</id>
    <revision>
      <id>36277</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlSingleBone|SkelControlBase|UE3}}</text>
    </revision>
    <revision>
      <id>36278</id>
      <timestamp>2009-11-06T17:55:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkelControlSingleBone|SkelControlBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkelControlSingleBone (UT3)</title>
    <id>22494</id>
    <revision>
      <id>30277</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkelControlSingleBone|SkelControlBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalBot (UT)</title>
    <id>22495</id>
    <revision>
      <id>30278</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalBot|HumanBotPlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshActor (UDK)</title>
    <id>24805</id>
    <revision>
      <id>36279</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36280</id>
      <timestamp>2009-11-06T17:55:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshActor (UT3)</title>
    <id>22496</id>
    <revision>
      <id>30279</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshActorMAT (UDK)</title>
    <id>24806</id>
    <revision>
      <id>36281</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshActorMAT|SkeletalMeshCinematicActor|UE3}}</text>
    </revision>
    <revision>
      <id>36282</id>
      <timestamp>2009-11-06T17:55:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshActorMAT|SkeletalMeshCinematicActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshActorMAT (UT3)</title>
    <id>22497</id>
    <revision>
      <id>30280</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshActorMAT|SkeletalMeshActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshCinematicActor (UDK)</title>
    <id>24807</id>
    <revision>
      <id>36283</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshCinematicActor|SkeletalMeshActor|UE3}}</text>
    </revision>
    <revision>
      <id>36284</id>
      <timestamp>2009-11-06T17:55:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshCinematicActor|SkeletalMeshActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshComponent (UDK)</title>
    <id>24808</id>
    <revision>
      <id>36285</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshComponent|MeshComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36286</id>
      <timestamp>2009-11-06T17:55:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshComponent|MeshComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalMeshComponent (UT3)</title>
    <id>22498</id>
    <revision>
      <id>30281</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalMeshComponent|MeshComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkeletalPlayer (UT)</title>
    <id>22499</id>
    <revision>
      <id>30282</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkeletalPlayer|TournamentPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyLight (UDK)</title>
    <id>24809</id>
    <revision>
      <id>36287</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyLight|Light|UE3}}</text>
    </revision>
    <revision>
      <id>36288</id>
      <timestamp>2009-11-06T17:55:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SkyLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyLight (UT3)</title>
    <id>22500</id>
    <revision>
      <id>30283</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyZoneInfo (U2)</title>
    <id>22501</id>
    <revision>
      <id>30284</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyZoneInfo|ZoneInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyZoneInfo (U2XMP)</title>
    <id>22502</id>
    <revision>
      <id>30285</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyZoneInfo|ZoneInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyZoneInfo (UE2Runtime)</title>
    <id>22503</id>
    <revision>
      <id>30286</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyZoneInfo|ZoneInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyZoneInfo (UT)</title>
    <id>22504</id>
    <revision>
      <id>30287</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyZoneInfo|ZoneInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyZoneInfo (UT2003)</title>
    <id>22505</id>
    <revision>
      <id>30288</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyZoneInfo|ZoneInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SkyZoneInfo (UT2004)</title>
    <id>22506</id>
    <revision>
      <id>30289</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SkyZoneInfo|ZoneInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallExplosion (U2)</title>
    <id>22507</id>
    <revision>
      <id>30290</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallExplosion|Squib|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallNavigationPoint (U2)</title>
    <id>22508</id>
    <revision>
      <id>30291</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallNavigationPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallNavigationPoint (UE2Runtime)</title>
    <id>22509</id>
    <revision>
      <id>30292</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallNavigationPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallNavigationPoint (UT2003)</title>
    <id>22510</id>
    <revision>
      <id>30293</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallNavigationPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallNavigationPoint (UT2004)</title>
    <id>22511</id>
    <revision>
      <id>30294</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallNavigationPoint|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallSpark (RTNP)</title>
    <id>22512</id>
    <revision>
      <id>30295</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallSpark|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallSpark (U1)</title>
    <id>22513</id>
    <revision>
      <id>30296</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallSpark|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmallSpark (UT)</title>
    <id>22514</id>
    <revision>
      <id>30297</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmallSpark|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmokeGenerator (RTNP)</title>
    <id>22515</id>
    <revision>
      <id>30298</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmokeGenerator|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmokeGenerator (U1)</title>
    <id>22516</id>
    <revision>
      <id>30299</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmokeGenerator|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SmokeGenerator (UT)</title>
    <id>22517</id>
    <revision>
      <id>30300</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SmokeGenerator|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SniperFire (UT2003)</title>
    <id>22518</id>
    <revision>
      <id>30301</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SniperFire|InstantFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SniperRifle (UT2003)</title>
    <id>22519</id>
    <revision>
      <id>30302</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SniperRifle|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SniperRiflePickup (UT2003)</title>
    <id>22520</id>
    <revision>
      <id>30303</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SniperRiflePickup|UTWeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Sound (UT2003)</title>
    <id>22521</id>
    <revision>
      <id>30304</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Sound|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Sound (UT2004)</title>
    <id>22522</id>
    <revision>
      <id>30305</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Sound|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SoundNode (UDK)</title>
    <id>24810</id>
    <revision>
      <id>36289</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SoundNode|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36290</id>
      <timestamp>2009-11-06T17:55:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SoundNode|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SoundNode (UT3)</title>
    <id>22523</id>
    <revision>
      <id>30306</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SoundNode|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SoundNodeAmbient (UDK)</title>
    <id>24811</id>
    <revision>
      <id>36291</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SoundNodeAmbient|SoundNode|UE3}}</text>
    </revision>
    <revision>
      <id>36292</id>
      <timestamp>2009-11-06T17:55:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SoundNodeAmbient|SoundNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SoundNodeAmbient (UT3)</title>
    <id>22524</id>
    <revision>
      <id>30307</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SoundNodeAmbient|SoundNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SoundSlotTimerListImpl (U2XMP)</title>
    <id>22525</id>
    <revision>
      <id>30308</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SoundSlotTimerListImpl|SoundSlotTimerListInterf|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SoundSlotTimerListInterf (U2XMP)</title>
    <id>22526</id>
    <revision>
      <id>30309</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SoundSlotTimerListInterf|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpaceMarine (RTNP)</title>
    <id>22527</id>
    <revision>
      <id>30310</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpaceMarine|MaleBot|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpaceMarineCarcass (RTNP)</title>
    <id>22528</id>
    <revision>
      <id>30311</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpaceMarineCarcass|CreatureCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Spark3 (RTNP)</title>
    <id>22529</id>
    <revision>
      <id>30312</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Spark3|SmallSpark|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Spark3 (U1)</title>
    <id>22530</id>
    <revision>
      <id>30313</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Spark3|SmallSpark|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Spark3 (UT)</title>
    <id>22531</id>
    <revision>
      <id>30314</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Spark3|SmallSpark|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpawnNotify (UT)</title>
    <id>22532</id>
    <revision>
      <id>30315</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpawnNotify|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpecialEvent (RTNP)</title>
    <id>22533</id>
    <revision>
      <id>30316</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpecialEvent|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpecialEventTrigger (U2)</title>
    <id>22534</id>
    <revision>
      <id>30317</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpecialEventTrigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpecialEventTrigger (UE2Runtime)</title>
    <id>22535</id>
    <revision>
      <id>30318</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpecialEventTrigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpeciesType (UT2003)</title>
    <id>22536</id>
    <revision>
      <id>30319</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpeciesType|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpeciesType (UT2004)</title>
    <id>22537</id>
    <revision>
      <id>30320</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpeciesType|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Spectator (RTNP)</title>
    <id>22540</id>
    <revision>
      <id>30323</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Spectator|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Spectator (U1)</title>
    <id>22541</id>
    <revision>
      <id>30324</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Spectator|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Spectator (UT)</title>
    <id>22542</id>
    <revision>
      <id>30325</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Spectator|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpectatorCam (UT)</title>
    <id>22543</id>
    <revision>
      <id>30326</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpectatorCam|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpeechWindow (UT)</title>
    <id>22544</id>
    <revision>
      <id>30327</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpeechWindow|NotifyWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpeedTrail (UT2004)</title>
    <id>22545</id>
    <revision>
      <id>30328</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpeedTrail|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SplineActor (UDK)</title>
    <id>24812</id>
    <revision>
      <id>36293</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SplineActor|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36294</id>
      <timestamp>2009-11-06T17:55:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SplineActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpotLight (UDK)</title>
    <id>24813</id>
    <revision>
      <id>36295</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpotLight|Light|UE3}}</text>
    </revision>
    <revision>
      <id>36296</id>
      <timestamp>2009-11-06T17:55:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SpotLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpotLight (UT3)</title>
    <id>22547</id>
    <revision>
      <id>30330</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpotLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpotLightComponent (UDK)</title>
    <id>24814</id>
    <revision>
      <id>36297</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpotLightComponent|PointLightComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36298</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|SpotLightComponent|PointLightComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Sprite3DParticleTemplate (U2)</title>
    <id>22548</id>
    <revision>
      <id>30331</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Sprite3DParticleTemplate|SpriteParticleTemplate|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Sprite3DParticleTemplate (U2XMP)</title>
    <id>22549</id>
    <revision>
      <id>30332</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Sprite3DParticleTemplate|SpriteParticleTemplate|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteBallExplosion (RTNP)</title>
    <id>22550</id>
    <revision>
      <id>30333</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteBallExplosion|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteBallExplosion (U1)</title>
    <id>22551</id>
    <revision>
      <id>30334</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteBallExplosion|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteBallExplosion (UT)</title>
    <id>22552</id>
    <revision>
      <id>30335</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteBallExplosion|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteBlueExplo (RTNP)</title>
    <id>22553</id>
    <revision>
      <id>30336</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteBlueExplo|SpriteBallExplosion|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteBlueExplo (U1)</title>
    <id>22554</id>
    <revision>
      <id>30337</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteBlueExplo|SpriteBallExplosion|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteBlueExplo (UT)</title>
    <id>22555</id>
    <revision>
      <id>30338</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteBlueExplo|SpriteBallExplosion|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteParticleTemplate (U2)</title>
    <id>22556</id>
    <revision>
      <id>30339</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteParticleTemplate|ParticleTemplate|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteParticleTemplate (U2XMP)</title>
    <id>22557</id>
    <revision>
      <id>30340</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteParticleTemplate|ParticleTemplate|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteSmokePuff (RTNP)</title>
    <id>22558</id>
    <revision>
      <id>30341</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteSmokePuff|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteSmokePuff (U1)</title>
    <id>22559</id>
    <revision>
      <id>30342</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteSmokePuff|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SpriteSmokePuff (UT)</title>
    <id>22560</id>
    <revision>
      <id>30343</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SpriteSmokePuff|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SquadAI (UT2003)</title>
    <id>22561</id>
    <revision>
      <id>30344</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SquadAI|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SquadAI (UT2004)</title>
    <id>22562</id>
    <revision>
      <id>30345</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SquadAI|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Squib (U2)</title>
    <id>22563</id>
    <revision>
      <id>30346</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Squib|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StatLog (RTNP)</title>
    <id>22577</id>
    <revision>
      <id>30360</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StatLog|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StatLog (U1)</title>
    <id>22578</id>
    <revision>
      <id>30361</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StatLog|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StatLog (U2XMP)</title>
    <id>22579</id>
    <revision>
      <id>30362</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StatLog|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StatLog (UT)</title>
    <id>22580</id>
    <revision>
      <id>30363</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StatLog|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StatLogFile (UT)</title>
    <id>22581</id>
    <revision>
      <id>30364</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StatLogFile|StatLog|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshActor (U2)</title>
    <id>22564</id>
    <revision>
      <id>30347</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshActor (U2XMP)</title>
    <id>22565</id>
    <revision>
      <id>30348</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshActor|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshActor (UDK)</title>
    <id>24815</id>
    <revision>
      <id>36299</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshActor|StaticMeshActorBase|UE3}}</text>
    </revision>
    <revision>
      <id>36300</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|StaticMeshActor|StaticMeshActorBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshActor (UT3)</title>
    <id>22566</id>
    <revision>
      <id>30349</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshActor|StaticMeshActorBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshActorBase (UDK)</title>
    <id>24816</id>
    <revision>
      <id>36301</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshActorBase|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36302</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|StaticMeshActorBase|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshActorBase (UT3)</title>
    <id>22567</id>
    <revision>
      <id>30350</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshActorBase|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshComponent (UDK)</title>
    <id>24817</id>
    <revision>
      <id>36303</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshComponent|MeshComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36304</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|StaticMeshComponent|MeshComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshComponent (UT3)</title>
    <id>22568</id>
    <revision>
      <id>30351</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshComponent|MeshComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StaticMeshLabelRenderer (UDK)</title>
    <id>24818</id>
    <revision>
      <id>36305</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StaticMeshLabelRenderer|ThumbnailLabelRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>36306</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|StaticMeshLabelRenderer|ThumbnailLabelRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawn (U2)</title>
    <id>22569</id>
    <revision>
      <id>30352</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawn|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawn (U2XMP)</title>
    <id>22570</id>
    <revision>
      <id>30353</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawn|U2Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawn (UT)</title>
    <id>22571</id>
    <revision>
      <id>30354</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawn|Pawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawnController (U2)</title>
    <id>22572</id>
    <revision>
      <id>30355</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawnController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawnController (U2XMP)</title>
    <id>22573</id>
    <revision>
      <id>30356</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawnController|U2NPCController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawnControllerOffensive (U2)</title>
    <id>22574</id>
    <revision>
      <id>30357</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawnControllerOffensive|StationaryPawnController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryPawnControllerOffensive (U2XMP)</title>
    <id>22575</id>
    <revision>
      <id>30358</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryPawnControllerOffensive|StationaryPawnController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StationaryTurret (U2)</title>
    <id>22576</id>
    <revision>
      <id>30359</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StationaryTurret|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SteelBarrel (RTNP)</title>
    <id>22582</id>
    <revision>
      <id>30365</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SteelBarrel|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SteelBarrel (U1)</title>
    <id>22583</id>
    <revision>
      <id>30366</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SteelBarrel|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SteelBarrel (UT)</title>
    <id>22584</id>
    <revision>
      <id>30367</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SteelBarrel|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SteelBox (RTNP)</title>
    <id>22585</id>
    <revision>
      <id>30368</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SteelBox|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SteelBox (U1)</title>
    <id>22586</id>
    <revision>
      <id>30369</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SteelBox|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SteelBox (UT)</title>
    <id>22587</id>
    <revision>
      <id>30370</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SteelBox|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StreamBase (UT2004)</title>
    <id>22588</id>
    <revision>
      <id>30371</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StreamBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StreamInterface (UT2004)</title>
    <id>22589</id>
    <revision>
      <id>30372</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StreamInterface|StreamBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StringArray (UT2003)</title>
    <id>22590</id>
    <revision>
      <id>30373</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StringArray|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StringArray (UT2004)</title>
    <id>22591</id>
    <revision>
      <id>30374</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StringArray|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StringMessagePlus (UT)</title>
    <id>22592</id>
    <revision>
      <id>30375</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StringMessagePlus|LocalMessagePlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StringMessagePlus (UT2003)</title>
    <id>22593</id>
    <revision>
      <id>30376</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StringMessagePlus|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StringMessagePlus (UT2004)</title>
    <id>22594</id>
    <revision>
      <id>30377</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StringMessagePlus|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of StudMetal (UT)</title>
    <id>22595</id>
    <revision>
      <id>30378</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|StudMetal|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (RTNP)</title>
    <id>22627</id>
    <revision>
      <id>30410</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (U1)</title>
    <id>22628</id>
    <revision>
      <id>30411</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (U2)</title>
    <id>22629</id>
    <revision>
      <id>30412</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (U2XMP)</title>
    <id>22630</id>
    <revision>
      <id>30413</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (UDK)</title>
    <id>24819</id>
    <revision>
      <id>36307</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36308</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (UE2Runtime)</title>
    <id>22631</id>
    <revision>
      <id>30414</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (UT)</title>
    <id>22632</id>
    <revision>
      <id>30415</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (UT2003)</title>
    <id>22633</id>
    <revision>
      <id>30416</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (UT2004)</title>
    <id>22634</id>
    <revision>
      <id>30417</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Subsystem (UT3)</title>
    <id>22635</id>
    <revision>
      <id>30418</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Subsystem|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Suits (RTNP)</title>
    <id>22636</id>
    <revision>
      <id>30419</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Suits|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Suits (U1)</title>
    <id>22637</id>
    <revision>
      <id>30420</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Suits|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Suits (UT)</title>
    <id>22638</id>
    <revision>
      <id>30421</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Suits|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SuperHealthCharger (UT2004)</title>
    <id>22639</id>
    <revision>
      <id>30422</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SuperHealthCharger|xPickUpBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SuperShockBeamEffect (UT2004)</title>
    <id>22640</id>
    <revision>
      <id>30423</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SuperShockBeamEffect|ShockBeamEffect|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SuperShockBeamFire (UT2003)</title>
    <id>22641</id>
    <revision>
      <id>30424</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SuperShockBeamFire|ShockBeamFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SuperShockBeamFire (UT2004)</title>
    <id>22642</id>
    <revision>
      <id>30425</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SuperShockBeamFire|ShockBeamFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SuperShockRifle (UT2003)</title>
    <id>22643</id>
    <revision>
      <id>30426</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SuperShockRifle|ShockRifle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of SuperShockRifle (UT2004)</title>
    <id>22644</id>
    <revision>
      <id>30427</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|SuperShockRifle|ShockRifle|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Surface (UDK)</title>
    <id>24820</id>
    <revision>
      <id>36309</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Surface|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36310</id>
      <timestamp>2009-11-06T17:55:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Surface|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Surface (UT3)</title>
    <id>22645</id>
    <revision>
      <id>30428</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Surface|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TFemaleBody (UT)</title>
    <id>22733</id>
    <revision>
      <id>30516</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TFemaleBody|UTHumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TMale1Carcass (UT)</title>
    <id>22744</id>
    <revision>
      <id>30527</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TMale1Carcass|TMaleBody|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TMaleBody (UT)</title>
    <id>22745</id>
    <revision>
      <id>30528</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TMaleBody|UTHumanCarcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab ControlSettings (UT2003)</title>
    <id>22655</id>
    <revision>
      <id>30438</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_ControlSettings|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab ControlSettings (UT2004)</title>
    <id>22656</id>
    <revision>
      <id>30439</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_ControlSettings|UT2K3TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab IADeathMatch (UT2003)</title>
    <id>22657</id>
    <revision>
      <id>30440</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_IADeathMatch|Tab_InstantActionBaseRules|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab IADeathMatch (UT2004)</title>
    <id>22658</id>
    <revision>
      <id>30441</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_IADeathMatch|Tab_InstantActionBaseRules|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab IATeamDeathMatch (UT2003)</title>
    <id>22659</id>
    <revision>
      <id>30442</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_IATeamDeathMatch|Tab_IADeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab IATeamDeathMatch (UT2004)</title>
    <id>22660</id>
    <revision>
      <id>30443</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_IATeamDeathMatch|Tab_IADeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab InstantActionBaseRules (UT2003)</title>
    <id>22661</id>
    <revision>
      <id>30444</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_InstantActionBaseRules|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab InstantActionBaseRules (UT2004)</title>
    <id>22662</id>
    <revision>
      <id>30445</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_InstantActionBaseRules|UT2K3TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab SPLadderBase (UT2003)</title>
    <id>22663</id>
    <revision>
      <id>30446</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_SPLadderBase|Tab_SPPanelBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab SPLadderBase (UT2004)</title>
    <id>22664</id>
    <revision>
      <id>30447</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_SPLadderBase|Tab_SPPanelBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab SPPanelBase (UT2003)</title>
    <id>22665</id>
    <revision>
      <id>30448</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_SPPanelBase|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tab SPPanelBase (UT2004)</title>
    <id>22666</id>
    <revision>
      <id>30449</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tab_SPPanelBase|UT2K3TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tapestry1 (UT)</title>
    <id>22667</id>
    <revision>
      <id>30450</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tapestry1|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (RTNP)</title>
    <id>22668</id>
    <revision>
      <id>30451</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (U1)</title>
    <id>22669</id>
    <revision>
      <id>30452</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (U2)</title>
    <id>22670</id>
    <revision>
      <id>30453</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (U2XMP)</title>
    <id>22671</id>
    <revision>
      <id>30454</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (UDK)</title>
    <id>24825</id>
    <revision>
      <id>36319</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE3}}</text>
    </revision>
    <revision>
      <id>36320</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (UE2Runtime)</title>
    <id>22672</id>
    <revision>
      <id>30455</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (UT)</title>
    <id>22673</id>
    <revision>
      <id>30456</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (UT2003)</title>
    <id>22674</id>
    <revision>
      <id>30457</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (UT2004)</title>
    <id>22675</id>
    <revision>
      <id>30458</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TcpLink (UT3)</title>
    <id>22676</id>
    <revision>
      <id>30459</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TcpLink|InternetLink|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamAI (UT2003)</title>
    <id>22677</id>
    <revision>
      <id>30460</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamAI|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamAI (UT2004)</title>
    <id>22678</id>
    <revision>
      <id>30461</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamAI|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamCannon (UT)</title>
    <id>22679</id>
    <revision>
      <id>30462</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamCannon|StationaryPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamGame (UT2003)</title>
    <id>22680</id>
    <revision>
      <id>30463</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamGame|DeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamGame (UT2004)</title>
    <id>22681</id>
    <revision>
      <id>30464</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamGame|DeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamGamePlus (UT)</title>
    <id>22682</id>
    <revision>
      <id>30465</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamGamePlus|DeathMatchPlus|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamInfo (U2XMP)</title>
    <id>22683</id>
    <revision>
      <id>30466</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamInfo (UDK)</title>
    <id>24826</id>
    <revision>
      <id>36321</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamInfo|ReplicationInfo|UE3}}</text>
    </revision>
    <revision>
      <id>36322</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|TeamInfo|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamInfo (UT2003)</title>
    <id>22684</id>
    <revision>
      <id>30467</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamInfo (UT2004)</title>
    <id>22685</id>
    <revision>
      <id>30468</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamInfo (UT3)</title>
    <id>22686</id>
    <revision>
      <id>30469</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamInfo|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamPlayerReplicationInfo (UT2003)</title>
    <id>22687</id>
    <revision>
      <id>30470</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamPlayerReplicationInfo|PlayerReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamPlayerReplicationInfo (UT2004)</title>
    <id>22688</id>
    <revision>
      <id>30471</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamPlayerReplicationInfo|PlayerReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamScoreBoard (UT)</title>
    <id>22689</id>
    <revision>
      <id>30472</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamScoreBoard|TournamentScoreBoard|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamVoicePack (UT2003)</title>
    <id>22690</id>
    <revision>
      <id>30473</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamVoicePack|VoicePack|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TeamVoicePack (UT2004)</title>
    <id>22691</id>
    <revision>
      <id>30474</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TeamVoicePack|VoicePack|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tech (U2)</title>
    <id>22692</id>
    <revision>
      <id>30475</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tech|U2Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (RTNP)</title>
    <id>22693</id>
    <revision>
      <id>30476</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (U1)</title>
    <id>22694</id>
    <revision>
      <id>30477</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (U2)</title>
    <id>22695</id>
    <revision>
      <id>30478</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (U2XMP)</title>
    <id>22696</id>
    <revision>
      <id>30479</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (UDK)</title>
    <id>24827</id>
    <revision>
      <id>36323</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE3}}</text>
    </revision>
    <revision>
      <id>36324</id>
      <timestamp>2009-11-06T17:55:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (UE2Runtime)</title>
    <id>22697</id>
    <revision>
      <id>30480</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|SmallNavigationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (UT)</title>
    <id>22698</id>
    <revision>
      <id>30481</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Teleporter (UT3)</title>
    <id>22699</id>
    <revision>
      <id>30482</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Teleporter|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TestInfo (RTNP)</title>
    <id>22700</id>
    <revision>
      <id>30483</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TestInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TestInfo (U1)</title>
    <id>22701</id>
    <revision>
      <id>30484</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TestInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TestInfo (UT)</title>
    <id>22702</id>
    <revision>
      <id>30485</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TestInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TestNPC (U2XMP)</title>
    <id>22703</id>
    <revision>
      <id>30486</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TestNPC|U2PawnAdvanced|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TestPageBase (UT2004)</title>
    <id>22704</id>
    <revision>
      <id>30487</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TestPageBase|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TestPanelBase (UT2004)</title>
    <id>22705</id>
    <revision>
      <id>30488</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TestPanelBase|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexModifier (U2)</title>
    <id>22706</id>
    <revision>
      <id>30489</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexModifier|Modifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexModifier (U2XMP)</title>
    <id>22707</id>
    <revision>
      <id>30490</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexModifier|Modifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexModifier (UE2Runtime)</title>
    <id>22708</id>
    <revision>
      <id>30491</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexModifier|Modifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexModifier (UT2003)</title>
    <id>22709</id>
    <revision>
      <id>30492</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexModifier|Modifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexModifier (UT2004)</title>
    <id>22710</id>
    <revision>
      <id>30493</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexModifier|Modifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexOscillator (U2)</title>
    <id>22711</id>
    <revision>
      <id>30494</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexOscillator|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexOscillator (UE2Runtime)</title>
    <id>22712</id>
    <revision>
      <id>30495</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexOscillator|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexOscillator (UT2003)</title>
    <id>22713</id>
    <revision>
      <id>30496</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexOscillator|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexOscillator (UT2004)</title>
    <id>22714</id>
    <revision>
      <id>30497</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexOscillator|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexPanner (U2)</title>
    <id>22715</id>
    <revision>
      <id>30498</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexPanner|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexPanner (UE2Runtime)</title>
    <id>22716</id>
    <revision>
      <id>30499</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexPanner|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexPanner (UT2003)</title>
    <id>22717</id>
    <revision>
      <id>30500</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexPanner|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TexPanner (UT2004)</title>
    <id>22718</id>
    <revision>
      <id>30501</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TexPanner|TexModifier|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (RTNP)</title>
    <id>22719</id>
    <revision>
      <id>30502</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|Bitmap|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (U1)</title>
    <id>22720</id>
    <revision>
      <id>30503</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|Bitmap|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (U2)</title>
    <id>22721</id>
    <revision>
      <id>30504</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|BitmapMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (U2XMP)</title>
    <id>22722</id>
    <revision>
      <id>30505</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|BitmapMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (UDK)</title>
    <id>24828</id>
    <revision>
      <id>36325</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|Surface|UE3}}</text>
    </revision>
    <revision>
      <id>36326</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Texture|Surface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (UE2Runtime)</title>
    <id>22723</id>
    <revision>
      <id>30506</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|BitmapMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (UT)</title>
    <id>22724</id>
    <revision>
      <id>30507</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|Bitmap|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (UT2003)</title>
    <id>22725</id>
    <revision>
      <id>30508</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|BitmapMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (UT2004)</title>
    <id>22726</id>
    <revision>
      <id>30509</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|BitmapMaterial|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture (UT3)</title>
    <id>22727</id>
    <revision>
      <id>30510</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture|Surface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture2D (UDK)</title>
    <id>24829</id>
    <revision>
      <id>36327</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture2D|Texture|UE3}}</text>
    </revision>
    <revision>
      <id>36328</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Texture2D|Texture|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Texture2D (UT3)</title>
    <id>22728</id>
    <revision>
      <id>30511</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Texture2D|Texture|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureHelperGeneric (U2XMP)</title>
    <id>22729</id>
    <revision>
      <id>30512</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureHelperGeneric|LegendObjectComponent|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureRenderTarget (UDK)</title>
    <id>24830</id>
    <revision>
      <id>36329</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureRenderTarget|Texture|UE3}}</text>
    </revision>
    <revision>
      <id>36330</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|TextureRenderTarget|Texture|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureRenderTarget (UT3)</title>
    <id>22730</id>
    <revision>
      <id>30513</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureRenderTarget|Texture|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureRenderTarget2D (UDK)</title>
    <id>24831</id>
    <revision>
      <id>36331</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureRenderTarget2D|TextureRenderTarget|UE3}}</text>
    </revision>
    <revision>
      <id>36332</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|TextureRenderTarget2D|TextureRenderTarget|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureRenderTarget2D (UT3)</title>
    <id>22731</id>
    <revision>
      <id>30514</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureRenderTarget2D|TextureRenderTarget|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureThumbnailRenderer (UDK)</title>
    <id>24832</id>
    <revision>
      <id>36333</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
    <revision>
      <id>36334</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|TextureThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TextureThumbnailRenderer (UT3)</title>
    <id>22732</id>
    <revision>
      <id>30515</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TextureThumbnailRenderer|ThumbnailRenderer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThingFactory (RTNP)</title>
    <id>22734</id>
    <revision>
      <id>30517</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThingFactory|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThingFactory (U1)</title>
    <id>22735</id>
    <revision>
      <id>30518</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThingFactory|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThingFactory (UT)</title>
    <id>22736</id>
    <revision>
      <id>30519</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThingFactory|Keypoint|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThumbnailLabelRenderer (UDK)</title>
    <id>24833</id>
    <revision>
      <id>36335</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThumbnailLabelRenderer|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36336</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ThumbnailLabelRenderer|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThumbnailLabelRenderer (UT3)</title>
    <id>22737</id>
    <revision>
      <id>30520</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThumbnailLabelRenderer|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThumbnailRenderer (UDK)</title>
    <id>24834</id>
    <revision>
      <id>36337</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThumbnailRenderer|Object|UE3}}</text>
    </revision>
    <revision>
      <id>36338</id>
      <timestamp>2009-11-06T17:55:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|ThumbnailRenderer|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ThumbnailRenderer (UT3)</title>
    <id>22738</id>
    <revision>
      <id>30521</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ThumbnailRenderer|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TimerMessage (UT2003)</title>
    <id>22739</id>
    <revision>
      <id>30522</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TimerMessage|CriticalEventPlus|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TimerMessage (UT2004)</title>
    <id>22740</id>
    <revision>
      <id>30523</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TimerMessage|CriticalEventPlus|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Titan (RTNP)</title>
    <id>22741</id>
    <revision>
      <id>30524</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Titan|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Titan (U1)</title>
    <id>22742</id>
    <revision>
      <id>30525</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Titan|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Titan (UT)</title>
    <id>22743</id>
    <revision>
      <id>30526</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Titan|ScriptedPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentAmmo (UT)</title>
    <id>22746</id>
    <revision>
      <id>30529</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentAmmo|Ammo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentConsole (UT)</title>
    <id>22747</id>
    <revision>
      <id>30530</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentConsole|UnrealConsole|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentFemale (UT)</title>
    <id>22748</id>
    <revision>
      <id>30531</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentFemale|TournamentPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentGameInfo (UT)</title>
    <id>22749</id>
    <revision>
      <id>30532</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentGameInfo|GameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentGameReplicationInfo (UT)</title>
    <id>22750</id>
    <revision>
      <id>30533</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentGameReplicationInfo|GameReplicationInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentHealth (UT)</title>
    <id>22751</id>
    <revision>
      <id>30534</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentHealth|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentHealth (UT2003)</title>
    <id>22752</id>
    <revision>
      <id>30535</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentHealth|TournamentPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentHealth (UT2004)</title>
    <id>22753</id>
    <revision>
      <id>30536</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentHealth|TournamentPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentMale (UT)</title>
    <id>22754</id>
    <revision>
      <id>30537</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentMale|TournamentPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentPickup (UT)</title>
    <id>22755</id>
    <revision>
      <id>30538</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentPickup|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentPickup (UT2003)</title>
    <id>22756</id>
    <revision>
      <id>30539</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentPickup (UT2004)</title>
    <id>22757</id>
    <revision>
      <id>30540</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentPlayer (UT)</title>
    <id>22758</id>
    <revision>
      <id>30541</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentPlayer|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentScoreBoard (UT)</title>
    <id>22759</id>
    <revision>
      <id>30542</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentScoreBoard|ScoreBoard|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TournamentWeapon (UT)</title>
    <id>22760</id>
    <revision>
      <id>30543</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TournamentWeapon|Weapon|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tracer (U2XMP)</title>
    <id>22761</id>
    <revision>
      <id>30544</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tracer|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TracerSeg (RTNP)</title>
    <id>22762</id>
    <revision>
      <id>30545</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TracerSeg|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TracerSeg (U2XMP)</title>
    <id>22763</id>
    <revision>
      <id>30546</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TracerSeg|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TracerStreak (RTNP)</title>
    <id>22764</id>
    <revision>
      <id>30547</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TracerStreak|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TracerStreak (U2XMP)</title>
    <id>22765</id>
    <revision>
      <id>30548</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TracerStreak|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransBeacon (UT2003)</title>
    <id>22766</id>
    <revision>
      <id>30549</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransBeacon|TranslocatorBeacon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransBeacon (UT2004)</title>
    <id>22767</id>
    <revision>
      <id>30550</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransBeacon|TranslocatorBeacon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransDeRes (UT2003)</title>
    <id>22768</id>
    <revision>
      <id>30551</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransDeRes|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransDeRes (UT2004)</title>
    <id>22769</id>
    <revision>
      <id>30552</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransDeRes|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransEffect (UT2003)</title>
    <id>22770</id>
    <revision>
      <id>30553</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransEffect|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransEffect (UT2004)</title>
    <id>22771</id>
    <revision>
      <id>30554</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransEffect|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransFire (UT2003)</title>
    <id>22772</id>
    <revision>
      <id>30555</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransFire (UT2004)</title>
    <id>22773</id>
    <revision>
      <id>30556</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransFire|ProjectileFire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransFlareBlue (UT2003)</title>
    <id>22774</id>
    <revision>
      <id>30557</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransFlareBlue|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransFlareBlue (UT2004)</title>
    <id>22775</id>
    <revision>
      <id>30558</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransFlareBlue|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransLauncher (UT2003)</title>
    <id>22776</id>
    <revision>
      <id>30559</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransLauncher|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransLauncher (UT2004)</title>
    <id>22777</id>
    <revision>
      <id>30560</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransLauncher|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransTrail (UT2003)</title>
    <id>22781</id>
    <revision>
      <id>30564</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransTrail|pclSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TransTrail (UT2004)</title>
    <id>22782</id>
    <revision>
      <id>30565</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TransTrail|pclSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TranslocGlow (UT)</title>
    <id>22780</id>
    <revision>
      <id>30563</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TranslocGlow|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TranslocatorBeacon (UT2003)</title>
    <id>22778</id>
    <revision>
      <id>30561</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TranslocatorBeacon|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TranslocatorBeacon (UT2004)</title>
    <id>22779</id>
    <revision>
      <id>30562</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TranslocatorBeacon|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tree (RTNP)</title>
    <id>22783</id>
    <revision>
      <id>30566</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tree|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tree (U1)</title>
    <id>22784</id>
    <revision>
      <id>30567</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tree|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Tree (UT)</title>
    <id>22785</id>
    <revision>
      <id>30568</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Tree|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (RTNP)</title>
    <id>22786</id>
    <revision>
      <id>30569</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (U1)</title>
    <id>22787</id>
    <revision>
      <id>30570</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (U2)</title>
    <id>22788</id>
    <revision>
      <id>30571</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (U2XMP)</title>
    <id>22789</id>
    <revision>
      <id>30572</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (UDK)</title>
    <id>24835</id>
    <revision>
      <id>36339</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Actor|UE3}}</text>
    </revision>
    <revision>
      <id>36340</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|Trigger|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (UE2Runtime)</title>
    <id>22790</id>
    <revision>
      <id>30573</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (UT)</title>
    <id>22791</id>
    <revision>
      <id>30574</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (UT2003)</title>
    <id>22792</id>
    <revision>
      <id>30575</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (UT2004)</title>
    <id>22793</id>
    <revision>
      <id>30576</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger (UT3)</title>
    <id>22794</id>
    <revision>
      <id>30577</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trigger ASUseAndPossess (UT2004)</title>
    <id>22806</id>
    <revision>
      <id>30589</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trigger_ASUseAndPossess|SVehicleTrigger|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TriggerLight (UT2003)</title>
    <id>22795</id>
    <revision>
      <id>30578</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TriggerLight|Light|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TriggerLight (UT2004)</title>
    <id>22796</id>
    <revision>
      <id>30579</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TriggerLight|Light|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TriggerVolume (UDK)</title>
    <id>24836</id>
    <revision>
      <id>36341</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TriggerVolume|Volume|UE3}}</text>
    </revision>
    <revision>
      <id>36342</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|TriggerVolume|Volume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TriggerVolume (UT3)</title>
    <id>22805</id>
    <revision>
      <id>30588</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TriggerVolume|Volume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (RTNP)</title>
    <id>22797</id>
    <revision>
      <id>30580</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (U1)</title>
    <id>22798</id>
    <revision>
      <id>30581</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (U2)</title>
    <id>22799</id>
    <revision>
      <id>30582</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (U2XMP)</title>
    <id>22800</id>
    <revision>
      <id>30583</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (UE2Runtime)</title>
    <id>22801</id>
    <revision>
      <id>30584</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (UT)</title>
    <id>22802</id>
    <revision>
      <id>30585</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (UT2003)</title>
    <id>22803</id>
    <revision>
      <id>30586</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Triggers (UT2004)</title>
    <id>22804</id>
    <revision>
      <id>30587</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Triggers|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Trophy (UT)</title>
    <id>22807</id>
    <revision>
      <id>30590</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Trophy|UT_Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Turret (U2)</title>
    <id>22808</id>
    <revision>
      <id>30591</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Turret|ProximitySensor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TurretController (UT2004)</title>
    <id>22809</id>
    <revision>
      <id>30592</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TurretController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TurretProxy (U2)</title>
    <id>22810</id>
    <revision>
      <id>30593</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TurretProxy|UseProxy|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of TurretWeapon (U2)</title>
    <id>22811</id>
    <revision>
      <id>30594</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|TurretWeapon|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Ammo (U2XMP)</title>
    <id>22812</id>
    <revision>
      <id>30595</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Ammo|Ammunition|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2AmmoPickup (U2XMP)</title>
    <id>22813</id>
    <revision>
      <id>30596</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2AmmoPickup|Ammo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2AnimSpriteEffect (U2XMP)</title>
    <id>22814</id>
    <revision>
      <id>30597</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2AnimSpriteEffect|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2AraknidBase (U2XMP)</title>
    <id>22815</id>
    <revision>
      <id>30598</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2AraknidBase|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2AraknidController (U2XMP)</title>
    <id>22816</id>
    <revision>
      <id>30599</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2AraknidController|U2NPCControllerBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2AraknidLight (U2XMP)</title>
    <id>22817</id>
    <revision>
      <id>30600</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2AraknidLight|U2AraknidBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2CTFFlag (U2XMP)</title>
    <id>22819</id>
    <revision>
      <id>30602</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2CTFFlag|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Civilian (U2XMP)</title>
    <id>22818</id>
    <revision>
      <id>30601</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Civilian|U2PawnAdvanced|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2DeathMatch (U2XMP)</title>
    <id>22820</id>
    <revision>
      <id>30603</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2DeathMatch|U2GameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Decal (U2XMP)</title>
    <id>22821</id>
    <revision>
      <id>30604</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Decal|Projector|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Decoration (U2XMP)</title>
    <id>22822</id>
    <revision>
      <id>30605</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Decoration|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Dispatcher (U2XMP)</title>
    <id>22823</id>
    <revision>
      <id>30606</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Dispatcher|Dispatcher|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2FlashLightBeam1 (U2XMP)</title>
    <id>22824</id>
    <revision>
      <id>30607</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2FlashLightBeam1|Light|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2FlyingSnake (U2XMP)</title>
    <id>22825</id>
    <revision>
      <id>30608</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2FlyingSnake|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Fragment (U2XMP)</title>
    <id>22826</id>
    <revision>
      <id>30609</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Fragment|Fragment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2GameInfo (U2XMP)</title>
    <id>22827</id>
    <revision>
      <id>30610</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2GameInfo|DialogGameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2GameReplicationInfo (U2XMP)</title>
    <id>22828</id>
    <revision>
      <id>30611</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2GameReplicationInfo|GameReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Inventory (U2XMP)</title>
    <id>22829</id>
    <revision>
      <id>30612</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Inventory|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2KaiBase (U2XMP)</title>
    <id>22830</id>
    <revision>
      <id>30613</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2KaiBase|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Kicker (U2XMP)</title>
    <id>22831</id>
    <revision>
      <id>30614</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Kicker|Triggers|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2M7 (U2XMP)</title>
    <id>22833</id>
    <revision>
      <id>30616</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2M7|U2Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Mukhogg (U2XMP)</title>
    <id>22834</id>
    <revision>
      <id>30617</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Mukhogg|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Mutator (U2XMP)</title>
    <id>22835</id>
    <revision>
      <id>30618</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Mutator|Mutator|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCController (U2XMP)</title>
    <id>22836</id>
    <revision>
      <id>30619</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCController|AIController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerAdvanced (U2XMP)</title>
    <id>22837</id>
    <revision>
      <id>30620</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerAdvanced|U2NPCControllerBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerAdvancedOld (U2XMP)</title>
    <id>22838</id>
    <revision>
      <id>30621</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerAdvancedOld|U2NPCControllerBaseOld|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerBase (U2XMP)</title>
    <id>22839</id>
    <revision>
      <id>30622</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerBase|U2NPCControllerShared|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerBaseOld (U2XMP)</title>
    <id>22840</id>
    <revision>
      <id>30623</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerBaseOld|U2NPCControllerShared|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerBasic (U2XMP)</title>
    <id>22841</id>
    <revision>
      <id>30624</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerBasic|U2NPCControllerBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerBotOld (U2XMP)</title>
    <id>22842</id>
    <revision>
      <id>30625</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerBotOld|U2NPCControllerAdvancedOld|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerScriptable (U2XMP)</title>
    <id>22843</id>
    <revision>
      <id>30626</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerScriptable|U2NPCController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2NPCControllerShared (U2XMP)</title>
    <id>22844</id>
    <revision>
      <id>30627</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2NPCControllerShared|U2NPCControllerScriptable|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Parata (U2XMP)</title>
    <id>22845</id>
    <revision>
      <id>30628</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Parata|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Pawn (U2)</title>
    <id>22846</id>
    <revision>
      <id>30629</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Pawn|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Pawn (U2XMP)</title>
    <id>22847</id>
    <revision>
      <id>30630</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Pawn|LicenseePawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PawnAdvanced (U2XMP)</title>
    <id>22848</id>
    <revision>
      <id>30631</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PawnAdvanced|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PawnAtlantis (U2XMP)</title>
    <id>22849</id>
    <revision>
      <id>30632</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PawnAtlantis|U2PawnBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PawnBase (U2XMP)</title>
    <id>22850</id>
    <revision>
      <id>30633</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PawnBase|U2Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PawnBasic (U2XMP)</title>
    <id>22851</id>
    <revision>
      <id>30634</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PawnBasic|U2PawnBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PawnHeavyHuman (U2XMP)</title>
    <id>22852</id>
    <revision>
      <id>30635</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PawnHeavyHuman|U2PawnAdvanced|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Player (U2XMP)</title>
    <id>22853</id>
    <revision>
      <id>30636</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Player|U2PawnAdvanced|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PlayerController (U2XMP)</title>
    <id>22854</id>
    <revision>
      <id>30637</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PlayerController|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PlayerMP (U2XMP)</title>
    <id>22855</id>
    <revision>
      <id>30638</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PlayerMP|U2Player|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PlayerSP (U2XMP)</title>
    <id>22856</id>
    <revision>
      <id>30639</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PlayerSP|U2Player|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PlayerTestController (U2XMP)</title>
    <id>22857</id>
    <revision>
      <id>30640</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PlayerTestController|U2PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2PlayerXMP (U2XMP)</title>
    <id>22858</id>
    <revision>
      <id>30641</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2PlayerXMP|U2PlayerMP|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Projectile (U2XMP)</title>
    <id>22859</id>
    <revision>
      <id>30642</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Projectile|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Rammer (U2XMP)</title>
    <id>22860</id>
    <revision>
      <id>30643</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Rammer|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2RingExplosion (U2XMP)</title>
    <id>22861</id>
    <revision>
      <id>30644</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2RingExplosion|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Seagoat (U2XMP)</title>
    <id>22862</id>
    <revision>
      <id>30645</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Seagoat|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2ShellCase (U2XMP)</title>
    <id>22863</id>
    <revision>
      <id>30646</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2ShellCase|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2SkaarjBase (U2XMP)</title>
    <id>22864</id>
    <revision>
      <id>30647</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2SkaarjBase|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2SkaarjLight (U2XMP)</title>
    <id>22865</id>
    <revision>
      <id>30648</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2SkaarjLight|U2SkaarjBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2SkyZoneInfo (U2XMP)</title>
    <id>22866</id>
    <revision>
      <id>30649</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2SkyZoneInfo|SkyZoneInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Snipe (U2XMP)</title>
    <id>22867</id>
    <revision>
      <id>30650</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Snipe|U2PawnBasic|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2TeamGame (U2XMP)</title>
    <id>22868</id>
    <revision>
      <id>30651</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2TeamGame|U2DeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2UseManager (U2XMP)</title>
    <id>22869</id>
    <revision>
      <id>30652</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2UseManager|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2Weapon (U2XMP)</title>
    <id>22870</id>
    <revision>
      <id>30653</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2Weapon|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2WeaponAttachment (U2)</title>
    <id>22871</id>
    <revision>
      <id>30654</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2WeaponAttachment|WeaponAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2WeaponPickup (U2XMP)</title>
    <id>22872</id>
    <revision>
      <id>30655</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2WeaponPickup|WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2XMPAmmo (U2XMP)</title>
    <id>22873</id>
    <revision>
      <id>30656</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2XMPAmmo|U2Ammo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of U2XMPItem (U2XMP)</title>
    <id>22874</id>
    <revision>
      <id>30657</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|U2XMPItem|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserBufferedTcpLink (RTNP)</title>
    <id>22875</id>
    <revision>
      <id>30658</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserBufferedTcpLink|TcpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserBufferedTcpLink (U1)</title>
    <id>22876</id>
    <revision>
      <id>30659</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserBufferedTcpLink|TcpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserBufferedTcpLink (UT)</title>
    <id>22877</id>
    <revision>
      <id>30660</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserBufferedTcpLink|TcpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserEditFavoriteCW (UT)</title>
    <id>22878</id>
    <revision>
      <id>30661</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserEditFavoriteCW|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserEditFavoriteWindow (UT)</title>
    <id>22879</id>
    <revision>
      <id>30662</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserEditFavoriteWindow|UWindowFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserFavoriteServers (UT)</title>
    <id>22880</id>
    <revision>
      <id>30663</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserFavoriteServers|UBrowserServerListWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserHTTPClient (UT)</title>
    <id>22881</id>
    <revision>
      <id>30664</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserHTTPClient|UBrowserBufferedTcpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserIRCPageBase (UT)</title>
    <id>22882</id>
    <revision>
      <id>30665</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserIRCPageBase|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserMainClientWindow (UT)</title>
    <id>22883</id>
    <revision>
      <id>30666</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserMainClientWindow|UWindowClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserMainWindow (UT)</title>
    <id>22884</id>
    <revision>
      <id>30667</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserMainWindow|UWindowFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserRightClickMenu (UT)</title>
    <id>22885</id>
    <revision>
      <id>30668</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserRightClickMenu|UWindowRightClickMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerGrid (UT)</title>
    <id>22886</id>
    <revision>
      <id>30669</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerGrid|UWindowGrid|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerList (UT)</title>
    <id>22887</id>
    <revision>
      <id>30670</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerList|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerListFactory (RTNP)</title>
    <id>22888</id>
    <revision>
      <id>30671</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerListFactory|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerListFactory (U1)</title>
    <id>22889</id>
    <revision>
      <id>30672</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerListFactory|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerListFactory (UT)</title>
    <id>22890</id>
    <revision>
      <id>30673</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerListFactory|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerListWindow (RTNP)</title>
    <id>22891</id>
    <revision>
      <id>30674</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerListWindow|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerListWindow (U1)</title>
    <id>22892</id>
    <revision>
      <id>30675</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerListWindow|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserServerListWindow (UT)</title>
    <id>22893</id>
    <revision>
      <id>30676</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserServerListWindow|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserUpdateServerLink (UT)</title>
    <id>22894</id>
    <revision>
      <id>30677</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserUpdateServerLink|UBrowserHTTPClient|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UBrowserUpdateServerWindow (UT)</title>
    <id>22895</id>
    <revision>
      <id>30678</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UBrowserUpdateServerWindow|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UDamagePack (UT2004)</title>
    <id>22896</id>
    <revision>
      <id>30679</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UDamagePack|TournamentPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction (UDK)</title>
    <id>24837</id>
    <revision>
      <id>36343</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction|SequenceAction|UE3}}</text>
    </revision>
    <revision>
      <id>36344</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIAction|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction (UT3)</title>
    <id>22911</id>
    <revision>
      <id>30694</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction ChangeState (UT3)</title>
    <id>22912</id>
    <revision>
      <id>30695</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_ChangeState|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction DataStore (UT3)</title>
    <id>22913</id>
    <revision>
      <id>30696</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_DataStore|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction DataStoreField (UT3)</title>
    <id>22914</id>
    <revision>
      <id>30697</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_DataStoreField|UIAction_DataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction GetPageReference (UT3)</title>
    <id>22915</id>
    <revision>
      <id>30698</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_GetPageReference|UIAction_TabControl|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction GetValue (UT3)</title>
    <id>22916</id>
    <revision>
      <id>30699</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_GetValue|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction Scene (UDK)</title>
    <id>24838</id>
    <revision>
      <id>36345</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_Scene|UIAction|UE3}}</text>
    </revision>
    <revision>
      <id>36346</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIAction_Scene|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction Scene (UT3)</title>
    <id>22917</id>
    <revision>
      <id>30700</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_Scene|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction SetValue (UT3)</title>
    <id>22918</id>
    <revision>
      <id>30701</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_SetValue|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAction TabControl (UT3)</title>
    <id>22919</id>
    <revision>
      <id>30702</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAction_TabControl|UIAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAnimation (UDK)</title>
    <id>24839</id>
    <revision>
      <id>36347</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAnimation|UIRoot|UE3}}</text>
    </revision>
    <revision>
      <id>36348</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIAnimation|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIAnimation (UT3)</title>
    <id>22920</id>
    <revision>
      <id>30703</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIAnimation|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIButton (UDK)</title>
    <id>24840</id>
    <revision>
      <id>36349</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIButton|UIObject|UE3}}</text>
    </revision>
    <revision>
      <id>36350</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIButton|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIButton (UT3)</title>
    <id>22921</id>
    <revision>
      <id>30704</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIButton|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UICheckbox (UDK)</title>
    <id>24841</id>
    <revision>
      <id>36351</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UICheckbox|UIButton|UE3}}</text>
    </revision>
    <revision>
      <id>36352</id>
      <timestamp>2009-11-06T17:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UICheckbox|UIButton|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UICheckbox (UT3)</title>
    <id>22922</id>
    <revision>
      <id>30705</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UICheckbox|UIButton|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComboBox (UDK)</title>
    <id>24842</id>
    <revision>
      <id>36353</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComboBox|UIObject|UE3}}</text>
    </revision>
    <revision>
      <id>36354</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComboBox|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComboBox (UT3)</title>
    <id>22923</id>
    <revision>
      <id>30706</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComboBox|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp DrawComponents (UDK)</title>
    <id>24844</id>
    <revision>
      <id>36357</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawComponents|UIComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36358</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawComponents|UIComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp DrawComponents (UT3)</title>
    <id>22925</id>
    <revision>
      <id>30708</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawComponents|UIComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp DrawImage (UDK)</title>
    <id>24845</id>
    <revision>
      <id>36359</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawImage|UIComp_DrawComponents|UE3}}</text>
    </revision>
    <revision>
      <id>36360</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawImage|UIComp_DrawComponents|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp DrawImage (UT3)</title>
    <id>22926</id>
    <revision>
      <id>30709</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawImage|UIComp_DrawComponents|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp DrawString (UDK)</title>
    <id>24846</id>
    <revision>
      <id>36361</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawString|UIComp_DrawComponents|UE3}}</text>
    </revision>
    <revision>
      <id>36362</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawString|UIComp_DrawComponents|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp DrawString (UT3)</title>
    <id>22927</id>
    <revision>
      <id>30710</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_DrawString|UIComp_DrawComponents|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListComponentBase (UDK)</title>
    <id>24847</id>
    <revision>
      <id>36363</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListComponentBase|UIComponent|UE3}}</text>
    </revision>
    <revision>
      <id>36364</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_ListComponentBase|UIComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListComponentBase (UT3)</title>
    <id>22928</id>
    <revision>
      <id>30711</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListComponentBase|UIComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListPresenter (UDK)</title>
    <id>24848</id>
    <revision>
      <id>36365</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenter|UIComp_ListPresenterBase|UE3}}</text>
    </revision>
    <revision>
      <id>36366</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenter|UIComp_ListPresenterBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListPresenter (UT3)</title>
    <id>22929</id>
    <revision>
      <id>30712</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenter|UIComp_ListComponentBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListPresenterBase (UDK)</title>
    <id>24849</id>
    <revision>
      <id>36367</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenterBase|UIComp_ListComponentBase|UE3}}</text>
    </revision>
    <revision>
      <id>36368</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenterBase|UIComp_ListComponentBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListPresenterCascade (UDK)</title>
    <id>24850</id>
    <revision>
      <id>36369</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenterCascade|UIComp_ListPresenter|UE3}}</text>
    </revision>
    <revision>
      <id>36370</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenterCascade|UIComp_ListPresenter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComp ListPresenterCascade (UT3)</title>
    <id>22930</id>
    <revision>
      <id>30713</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComp_ListPresenterCascade|UIComp_ListPresenter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComponent (UDK)</title>
    <id>24843</id>
    <revision>
      <id>36355</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComponent|Component|UE3}}</text>
    </revision>
    <revision>
      <id>36356</id>
      <timestamp>2009-11-06T17:55:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIComponent|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIComponent (UT3)</title>
    <id>22924</id>
    <revision>
      <id>30707</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIComponent|Component|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIConfigProvider (UDK)</title>
    <id>24851</id>
    <revision>
      <id>36371</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIConfigProvider|UIDataProvider|UE3}}</text>
    </revision>
    <revision>
      <id>36372</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIConfigProvider|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIConfigProvider (UT3)</title>
    <id>22931</id>
    <revision>
      <id>30714</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIConfigProvider|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIContainer (UDK)</title>
    <id>24852</id>
    <revision>
      <id>36374</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIContainer|UIObject|UE3}}</text>
    </revision>
    <revision>
      <id>36373</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIContainer|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIContainer (UT3)</title>
    <id>22932</id>
    <revision>
      <id>30715</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIContainer|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIContextMenu (UT3)</title>
    <id>24211</id>
    <revision>
      <id>34679</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIContextMenu|UIList|UE3}}</text>
    </revision>
    <revision>
      <id>34680</id>
      <timestamp>2009-08-16T08:24:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UIContextMenu|UIList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider (UDK)</title>
    <id>24853</id>
    <revision>
      <id>36375</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider|UIRoot|UE3}}</text>
    </revision>
    <revision>
      <id>36376</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataProvider|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider (UT3)</title>
    <id>22933</id>
    <revision>
      <id>30716</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlineFriendMessages (UDK)</title>
    <id>24854</id>
    <revision>
      <id>36377</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlineFriendMessages|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
    <revision>
      <id>36378</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlineFriendMessages|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlineFriendMessages (UT3)</title>
    <id>22934</id>
    <revision>
      <id>30717</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlineFriendMessages|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlineFriends (UDK)</title>
    <id>24855</id>
    <revision>
      <id>36379</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlineFriends|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
    <revision>
      <id>36380</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlineFriends|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlineFriends (UT3)</title>
    <id>22935</id>
    <revision>
      <id>30718</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlineFriends|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlinePlayerDataBase (UDK)</title>
    <id>24856</id>
    <revision>
      <id>36381</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlinePlayerDataBase|UIDataProvider|UE3}}</text>
    </revision>
    <revision>
      <id>36382</id>
      <timestamp>2009-11-06T17:55:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlinePlayerDataBase|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlinePlayerDataBase (UT3)</title>
    <id>22936</id>
    <revision>
      <id>30719</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlinePlayerDataBase|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider OnlinePlayerStorage (UDK)</title>
    <id>24857</id>
    <revision>
      <id>36383</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlinePlayerStorage|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
    <revision>
      <id>36384</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_OnlinePlayerStorage|UIDataProvider_OnlinePlayerDataBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider Settings (UDK)</title>
    <id>24858</id>
    <revision>
      <id>36385</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_Settings|UIDynamicDataProvider|UE3}}</text>
    </revision>
    <revision>
      <id>36386</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_Settings|UIDynamicDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataProvider Settings (UT3)</title>
    <id>22937</id>
    <revision>
      <id>30720</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataProvider_Settings|UIDynamicDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore (UDK)</title>
    <id>24859</id>
    <revision>
      <id>36387</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore|UIDataProvider|UE3}}</text>
    </revision>
    <revision>
      <id>36388</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore (UT3)</title>
    <id>22938</id>
    <revision>
      <id>30721</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore GameResource (UDK)</title>
    <id>24861</id>
    <revision>
      <id>36391</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_GameResource|UIDataStore|UE3}}</text>
    </revision>
    <revision>
      <id>36392</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore_GameResource|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore GameResource (UT3)</title>
    <id>22940</id>
    <revision>
      <id>30723</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_GameResource|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore GameState (UDK)</title>
    <id>24862</id>
    <revision>
      <id>36393</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_GameState|UIDataStore|UE3}}</text>
    </revision>
    <revision>
      <id>36394</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore_GameState|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore GameState (UT3)</title>
    <id>22941</id>
    <revision>
      <id>30724</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_GameState|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore OnlineGameSearch (UDK)</title>
    <id>24863</id>
    <revision>
      <id>36395</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineGameSearch|UIDataStore_Remote|UE3}}</text>
    </revision>
    <revision>
      <id>36396</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineGameSearch|UIDataStore_Remote|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore OnlineGameSearch (UT3)</title>
    <id>22942</id>
    <revision>
      <id>30725</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineGameSearch|UIDataStore_Remote|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore OnlineGameSettings (UDK)</title>
    <id>24864</id>
    <revision>
      <id>36397</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineGameSettings|UIDataStore_Settings|UE3}}</text>
    </revision>
    <revision>
      <id>36398</id>
      <timestamp>2009-11-06T17:55:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineGameSettings|UIDataStore_Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore OnlineGameSettings (UT3)</title>
    <id>22943</id>
    <revision>
      <id>30726</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineGameSettings|UIDataStore_Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore OnlineStats (UDK)</title>
    <id>24865</id>
    <revision>
      <id>36399</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineStats|UIDataStore_Remote|UE3}}</text>
    </revision>
    <revision>
      <id>36400</id>
      <timestamp>2009-11-06T17:55:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineStats|UIDataStore_Remote|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore OnlineStats (UT3)</title>
    <id>22944</id>
    <revision>
      <id>30727</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_OnlineStats|UIDataStore_Remote|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore Remote (UDK)</title>
    <id>24866</id>
    <revision>
      <id>36401</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_Remote|UIDataStore|UE3}}</text>
    </revision>
    <revision>
      <id>36402</id>
      <timestamp>2009-11-06T17:55:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;importing UDK classes, part 1</comment>
      <text xml:space="preserve">{{category subclasses|UIDataStore_Remote|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore Remote (UT3)</title>
    <id>22945</id>
    <revision>
      <id>30728</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_Remote|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore Settings (UDK)</title>
    <id>24871</id>
    <revision>
      <id>36407</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_Settings|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore Settings (UT3)</title>
    <id>22946</id>
    <revision>
      <id>30729</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_Settings|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore StringAliasMap (UDK)</title>
    <id>24872</id>
    <revision>
      <id>36408</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_StringAliasMap|UIDataStore_StringBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore StringAliasMap (UT3)</title>
    <id>22947</id>
    <revision>
      <id>30730</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_StringAliasMap|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDataStore StringBase (UDK)</title>
    <id>24873</id>
    <revision>
      <id>36409</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDataStore_StringBase|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDynamicDataProvider (UDK)</title>
    <id>24874</id>
    <revision>
      <id>36410</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDynamicDataProvider|UIPropertyDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIDynamicDataProvider (UT3)</title>
    <id>22948</id>
    <revision>
      <id>30731</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIDynamicDataProvider|UIPropertyDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEditBox (UDK)</title>
    <id>24875</id>
    <revision>
      <id>36411</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEditBox|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEditBox (UT3)</title>
    <id>22949</id>
    <revision>
      <id>30732</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEditBox|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent (UDK)</title>
    <id>24876</id>
    <revision>
      <id>36412</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent|SequenceEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent (UT3)</title>
    <id>22950</id>
    <revision>
      <id>30733</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent|SequenceEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent Scene (UDK)</title>
    <id>24877</id>
    <revision>
      <id>36413</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_Scene|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent Scene (UT3)</title>
    <id>22951</id>
    <revision>
      <id>30734</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_Scene|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent State (UDK)</title>
    <id>24878</id>
    <revision>
      <id>36414</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_State|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent State (UT3)</title>
    <id>22952</id>
    <revision>
      <id>30735</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_State|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent SubmitData (UT3)</title>
    <id>22953</id>
    <revision>
      <id>30736</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_SubmitData|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent TabControl (UT3)</title>
    <id>22954</id>
    <revision>
      <id>30737</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_TabControl|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIEvent ValueChanged (UT3)</title>
    <id>22955</id>
    <revision>
      <id>30738</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIEvent_ValueChanged|UIEvent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIHelper (U2)</title>
    <id>22956</id>
    <revision>
      <id>30739</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIHelper|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIHelper (U2XMP)</title>
    <id>22957</id>
    <revision>
      <id>30740</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIHelper|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIImage (UT3)</title>
    <id>22958</id>
    <revision>
      <id>30741</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIImage|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIInteraction (UDK)</title>
    <id>24879</id>
    <revision>
      <id>36415</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIInteraction|Interaction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIInteraction (UT3)</title>
    <id>22959</id>
    <revision>
      <id>30742</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIInteraction|Interaction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILabel (UDK)</title>
    <id>24880</id>
    <revision>
      <id>36416</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILabel|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILabel (UT3)</title>
    <id>22960</id>
    <revision>
      <id>30743</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILabel|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILabelButton (UDK)</title>
    <id>24881</id>
    <revision>
      <id>36417</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILabelButton|UIButton|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILabelButton (UT3)</title>
    <id>22961</id>
    <revision>
      <id>30744</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILabelButton|UIButton|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILayer (UDK)</title>
    <id>24882</id>
    <revision>
      <id>36418</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILayer|UILayerBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILayer (UT3)</title>
    <id>22962</id>
    <revision>
      <id>30745</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILayer|UILayerBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILayerBase (UDK)</title>
    <id>24883</id>
    <revision>
      <id>36419</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILayerBase|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UILayerBase (UT3)</title>
    <id>22963</id>
    <revision>
      <id>30746</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UILayerBase|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIList (UDK)</title>
    <id>24884</id>
    <revision>
      <id>36420</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIList|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIList (UT3)</title>
    <id>22964</id>
    <revision>
      <id>30747</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIList|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIMeshWidget (UDK)</title>
    <id>24885</id>
    <revision>
      <id>36421</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIMeshWidget|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIMeshWidget (UT3)</title>
    <id>22965</id>
    <revision>
      <id>30748</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIMeshWidget|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIMessageBoxBase (UDK)</title>
    <id>24886</id>
    <revision>
      <id>36422</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIMessageBoxBase|UIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UINumericEditBox (UDK)</title>
    <id>24887</id>
    <revision>
      <id>36423</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UINumericEditBox|UIEditBox|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UINumericEditBox (UT3)</title>
    <id>22966</id>
    <revision>
      <id>30749</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UINumericEditBox|UIEditBox|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIObject (UDK)</title>
    <id>24888</id>
    <revision>
      <id>36424</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIObject|UIScreenObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIObject (UT3)</title>
    <id>22967</id>
    <revision>
      <id>30750</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIObject|UIScreenObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIOptionListBase (UDK)</title>
    <id>24889</id>
    <revision>
      <id>36425</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIOptionListBase|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIOptionListBase (UT3)</title>
    <id>22968</id>
    <revision>
      <id>30751</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIOptionListBase|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIPanel (UDK)</title>
    <id>24890</id>
    <revision>
      <id>36426</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIPanel|UIContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIPanel (UT3)</title>
    <id>22969</id>
    <revision>
      <id>30752</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIPanel|UIContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIPropertyDataProvider (UDK)</title>
    <id>24891</id>
    <revision>
      <id>36427</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIPropertyDataProvider|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIPropertyDataProvider (UT3)</title>
    <id>22970</id>
    <revision>
      <id>30753</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIPropertyDataProvider|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIResourceDataProvider (UDK)</title>
    <id>24892</id>
    <revision>
      <id>36428</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIResourceDataProvider|UIPropertyDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIResourceDataProvider (UT3)</title>
    <id>22971</id>
    <revision>
      <id>30754</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIResourceDataProvider|UIPropertyDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIRoot (UDK)</title>
    <id>24893</id>
    <revision>
      <id>36429</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIRoot|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIRoot (UT3)</title>
    <id>22972</id>
    <revision>
      <id>30755</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIRoot|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScene (UDK)</title>
    <id>24894</id>
    <revision>
      <id>36430</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScene|UIScreenObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScene (UT3)</title>
    <id>22973</id>
    <revision>
      <id>30756</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScene|UIScreenObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISceneClient (UDK)</title>
    <id>24895</id>
    <revision>
      <id>36431</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISceneClient|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISceneClient (UT3)</title>
    <id>22974</id>
    <revision>
      <id>30757</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISceneClient|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScreenObject (UDK)</title>
    <id>24896</id>
    <revision>
      <id>36432</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScreenObject|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScreenObject (UT3)</title>
    <id>22975</id>
    <revision>
      <id>30758</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScreenObject|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScrollFrame (UDK)</title>
    <id>24898</id>
    <revision>
      <id>36434</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScrollFrame|UIContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScrollFrame (UT3)</title>
    <id>22977</id>
    <revision>
      <id>30760</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScrollFrame|UIContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScrollbarButton (UDK)</title>
    <id>24897</id>
    <revision>
      <id>36433</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScrollbarButton|UIButton|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIScrollbarButton (UT3)</title>
    <id>22976</id>
    <revision>
      <id>30759</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIScrollbarButton|UIButton|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISequence (UDK)</title>
    <id>24899</id>
    <revision>
      <id>36435</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISequence|Sequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISequence (UT3)</title>
    <id>22978</id>
    <revision>
      <id>30761</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISequence|Sequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISettingsProvider (UDK)</title>
    <id>24900</id>
    <revision>
      <id>36436</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISettingsProvider|UIPropertyDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISettingsProvider (UT3)</title>
    <id>22979</id>
    <revision>
      <id>30762</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISettingsProvider|UIPropertyDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISkin (UDK)</title>
    <id>24901</id>
    <revision>
      <id>36437</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISkin|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISkin (UT3)</title>
    <id>22980</id>
    <revision>
      <id>30763</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISkin|UIDataStore|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISlider (UDK)</title>
    <id>24902</id>
    <revision>
      <id>36438</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISlider|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UISlider (UT3)</title>
    <id>22981</id>
    <revision>
      <id>30764</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UISlider|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIState (UDK)</title>
    <id>24903</id>
    <revision>
      <id>36439</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIState|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIState (UT3)</title>
    <id>22982</id>
    <revision>
      <id>30765</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIState|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIString (UDK)</title>
    <id>24904</id>
    <revision>
      <id>36440</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIString|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIString (UT3)</title>
    <id>22983</id>
    <revision>
      <id>30766</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIString|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIStyle Data (UDK)</title>
    <id>24905</id>
    <revision>
      <id>36441</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIStyle_Data|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UIStyle Data (UT3)</title>
    <id>22984</id>
    <revision>
      <id>30767</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UIStyle_Data|UIRoot|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UITabControl (UDK)</title>
    <id>24906</id>
    <revision>
      <id>36442</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UITabControl|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UITabControl (UT3)</title>
    <id>22985</id>
    <revision>
      <id>30768</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UITabControl|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UITabPage (UDK)</title>
    <id>24907</id>
    <revision>
      <id>36443</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UITabPage|UIContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UITabPage (UT3)</title>
    <id>22986</id>
    <revision>
      <id>30769</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UITabPage|UIContainer|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuAudioClientWindow (UT)</title>
    <id>22987</id>
    <revision>
      <id>30770</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuAudioClientWindow|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotConfigBase (RTNP)</title>
    <id>22988</id>
    <revision>
      <id>30771</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotConfigBase|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotConfigBase (UT)</title>
    <id>22989</id>
    <revision>
      <id>30772</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotConfigBase|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotSetupBase (RTNP)</title>
    <id>22994</id>
    <revision>
      <id>30777</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotSetupBase|UMenuPlayerSetupClient|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotSetupBase (UT)</title>
    <id>22995</id>
    <revision>
      <id>30778</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotSetupBase|UMenuPlayerSetupClient|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotmatchClientWindow (RTNP)</title>
    <id>22990</id>
    <revision>
      <id>30773</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotmatchClientWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotmatchClientWindow (UT)</title>
    <id>22991</id>
    <revision>
      <id>30774</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotmatchClientWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotmatchWindow (RTNP)</title>
    <id>22992</id>
    <revision>
      <id>30775</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotmatchWindow|UMenuFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuBotmatchWindow (UT)</title>
    <id>22993</id>
    <revision>
      <id>30776</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuBotmatchWindow|UMenuFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuCustomizeClientWindow (UT)</title>
    <id>22996</id>
    <revision>
      <id>30779</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuCustomizeClientWindow|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuDialogClientWindow (RTNP)</title>
    <id>22997</id>
    <revision>
      <id>30780</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuDialogClientWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuDialogClientWindow (UT)</title>
    <id>22998</id>
    <revision>
      <id>30781</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuDialogClientWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuFramedWindow (RTNP)</title>
    <id>22999</id>
    <revision>
      <id>30782</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuFramedWindow|UWindowFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuFramedWindow (UT)</title>
    <id>23000</id>
    <revision>
      <id>30783</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuFramedWindow|UWindowFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuGameRulesBase (RTNP)</title>
    <id>23001</id>
    <revision>
      <id>30784</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuGameRulesBase|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuGameRulesBase (UT)</title>
    <id>23002</id>
    <revision>
      <id>30785</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuGameRulesBase|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuGameRulesCWindow (RTNP)</title>
    <id>23003</id>
    <revision>
      <id>30786</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuGameRulesCWindow|UMenuGameRulesBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuGameRulesCWindow (UT)</title>
    <id>23004</id>
    <revision>
      <id>30787</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuGameRulesCWindow|UMenuGameRulesBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuGameSettingsBase (RTNP)</title>
    <id>23005</id>
    <revision>
      <id>30788</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuGameSettingsBase|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuGameSettingsBase (UT)</title>
    <id>23006</id>
    <revision>
      <id>30789</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuGameSettingsBase|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuInputOptionsClientWindow (UT)</title>
    <id>23007</id>
    <revision>
      <id>30790</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuInputOptionsClientWindow|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuMapListBox (RTNP)</title>
    <id>23008</id>
    <revision>
      <id>30791</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuMapListBox|UWindowListBox|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuMapListBox (UT)</title>
    <id>23009</id>
    <revision>
      <id>30792</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuMapListBox|UWindowListBox|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuModMenuItem (UT)</title>
    <id>23010</id>
    <revision>
      <id>30793</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuModMenuItem|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuMultiplayerMenu (UT)</title>
    <id>23011</id>
    <revision>
      <id>30794</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuMultiplayerMenu|UWindowPulldownMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuMutatorListBox (RTNP)</title>
    <id>23012</id>
    <revision>
      <id>30795</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuMutatorListBox|UWindowListBox|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuMutatorListBox (UT)</title>
    <id>23013</id>
    <revision>
      <id>30796</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuMutatorListBox|UWindowListBox|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuNewGameClientWindow (RTNP)</title>
    <id>23014</id>
    <revision>
      <id>30797</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuNewGameClientWindow|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuNewGameClientWindow (UT)</title>
    <id>23015</id>
    <revision>
      <id>30798</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuNewGameClientWindow|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuOptionsMenu (UT)</title>
    <id>23016</id>
    <revision>
      <id>30799</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuOptionsMenu|UWindowPulldownMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPageWindow (RTNP)</title>
    <id>23017</id>
    <revision>
      <id>30800</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPageWindow|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPageWindow (UT)</title>
    <id>23018</id>
    <revision>
      <id>30801</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPageWindow|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerClientWindow (RTNP)</title>
    <id>23019</id>
    <revision>
      <id>30802</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerClientWindow|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerClientWindow (UT)</title>
    <id>23020</id>
    <revision>
      <id>30803</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerClientWindow|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerSetupClient (RTNP)</title>
    <id>23021</id>
    <revision>
      <id>30804</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerSetupClient|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerSetupClient (UT)</title>
    <id>23022</id>
    <revision>
      <id>30805</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerSetupClient|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerSetupScrollClient (UT)</title>
    <id>23023</id>
    <revision>
      <id>30806</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerSetupScrollClient|UWindowScrollingDialogClient|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerWindow (RTNP)</title>
    <id>23024</id>
    <revision>
      <id>30807</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerWindow|UMenuFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuPlayerWindow (UT)</title>
    <id>23025</id>
    <revision>
      <id>30808</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuPlayerWindow|UMenuFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuServerSetupPage (UT)</title>
    <id>23026</id>
    <revision>
      <id>30809</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuServerSetupPage|UMenuPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuSlotClientWindow (RTNP)</title>
    <id>23027</id>
    <revision>
      <id>30810</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuSlotClientWindow|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuSlotClientWindow (UT)</title>
    <id>23028</id>
    <revision>
      <id>30811</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuSlotClientWindow|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuStartGameWindow (UT)</title>
    <id>23029</id>
    <revision>
      <id>30812</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuStartGameWindow|UMenuBotmatchWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuStartMatchClientWindow (UT)</title>
    <id>23030</id>
    <revision>
      <id>30813</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuStartMatchClientWindow|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuStartMatchScrollClient (UT)</title>
    <id>23031</id>
    <revision>
      <id>30814</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuStartMatchScrollClient|UWindowScrollingDialogClient|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuWeaponPriorityCW (UT)</title>
    <id>23032</id>
    <revision>
      <id>30815</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuWeaponPriorityCW|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuWeaponPriorityList (UT)</title>
    <id>23033</id>
    <revision>
      <id>30816</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuWeaponPriorityList|UWindowListBoxItem|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuWeaponPriorityListArea (UT)</title>
    <id>23034</id>
    <revision>
      <id>30817</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuWeaponPriorityListArea|UMenuDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuWeaponPriorityListBox (UT)</title>
    <id>23035</id>
    <revision>
      <id>30818</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuWeaponPriorityListBox|UWindowListBox|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UMenuWeaponPriorityWindow (UT)</title>
    <id>23036</id>
    <revision>
      <id>30819</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UMenuWeaponPriorityWindow|UMenuFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakBurst (RTNP)</title>
    <id>23100</id>
    <revision>
      <id>30883</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakBurst|SpriteBallExplosion|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakDebugger (RTNP)</title>
    <id>23101</id>
    <revision>
      <id>30884</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakDebugger|Pickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakFemale (RTNP)</title>
    <id>23102</id>
    <revision>
      <id>30885</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakFemale|UPakPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakGame (RTNP)</title>
    <id>23103</id>
    <revision>
      <id>30886</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakGame|DeathMatchGame|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakHUD (RTNP)</title>
    <id>23105</id>
    <revision>
      <id>30888</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakHUD|UnrealHUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakHealth (RTNP)</title>
    <id>23104</id>
    <revision>
      <id>30887</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakHealth|Health|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakMale (RTNP)</title>
    <id>23106</id>
    <revision>
      <id>30889</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakMale|UPakPlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakPlayer (RTNP)</title>
    <id>23107</id>
    <revision>
      <id>30890</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakPlayer|Human|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakRocket (RTNP)</title>
    <id>23108</id>
    <revision>
      <id>30891</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakRocket|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UPakSinglePlayer (RTNP)</title>
    <id>23109</id>
    <revision>
      <id>30892</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UPakSinglePlayer|SinglePlayer|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT BioGel (UT)</title>
    <id>23403</id>
    <revision>
      <id>31186</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_BioGel|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT Blood2 (UT)</title>
    <id>23404</id>
    <revision>
      <id>31187</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_Blood2|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT BloodBurst (UT)</title>
    <id>23405</id>
    <revision>
      <id>31188</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_BloodBurst|UT_Blood2|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT BloodHit (UT)</title>
    <id>23406</id>
    <revision>
      <id>31189</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_BloodHit|UT_BloodBurst|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT BloodPuff (UT)</title>
    <id>23407</id>
    <revision>
      <id>31190</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_BloodPuff|UT_SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT ComboRing (UT)</title>
    <id>23408</id>
    <revision>
      <id>31191</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_ComboRing|UT_RingExplosion|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT Decoration (UT)</title>
    <id>23409</id>
    <revision>
      <id>31192</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_Decoration|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT Invisibility (UT)</title>
    <id>23410</id>
    <revision>
      <id>31193</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_Invisibility|TournamentPickup|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT RingExplosion (UT)</title>
    <id>23411</id>
    <revision>
      <id>31194</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_RingExplosion|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT ShellCase (UT)</title>
    <id>23412</id>
    <revision>
      <id>31195</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_ShellCase|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT SpriteBallExplosion (UT)</title>
    <id>23413</id>
    <revision>
      <id>31196</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_SpriteBallExplosion|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT SpriteSmokePuff (UT)</title>
    <id>23414</id>
    <revision>
      <id>31197</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_SpriteSmokePuff|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT SuperRing (UT)</title>
    <id>23415</id>
    <revision>
      <id>31198</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_SuperRing|UT_RingExplosion|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT WallHit (UT)</title>
    <id>23416</id>
    <revision>
      <id>31199</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT_WallHit|BulletImpact|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2003GameProfile (UT2004)</title>
    <id>23111</id>
    <revision>
      <id>30894</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2003GameProfile|GameProfile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2DraftTeam (UT2003)</title>
    <id>23112</id>
    <revision>
      <id>30895</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2DraftTeam|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2DraftTeam (UT2004)</title>
    <id>23113</id>
    <revision>
      <id>30896</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2DraftTeam|UT2K3GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K3GUIPage (UT2004)</title>
    <id>23114</id>
    <revision>
      <id>30897</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K3GUIPage|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K3TabPanel (UT2004)</title>
    <id>23115</id>
    <revision>
      <id>30898</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K3TabPanel|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Browser OpenIP (UT2004)</title>
    <id>23116</id>
    <revision>
      <id>30899</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Browser_OpenIP|UT2K4GetDataMenu|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Browser Page (UT2004)</title>
    <id>23117</id>
    <revision>
      <id>30900</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Browser_Page|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Browser ServerListPageBase (UT2004)</title>
    <id>23118</id>
    <revision>
      <id>30901</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Browser_ServerListPageBase|UT2K4Browser_Page|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Browser ServerListPageMS (UT2004)</title>
    <id>23119</id>
    <revision>
      <id>30902</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Browser_ServerListPageMS|UT2K4Browser_ServerListPageBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4CustomHUDMenu (UT2004)</title>
    <id>23120</id>
    <revision>
      <id>30903</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4CustomHUDMenu|LargeWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4GUIPage (UT2004)</title>
    <id>23125</id>
    <revision>
      <id>30908</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4GUIPage|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4GamePageBase (UT2004)</title>
    <id>23121</id>
    <revision>
      <id>30904</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4GamePageBase|UT2K4MainPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4GameTabBase (UT2004)</title>
    <id>23122</id>
    <revision>
      <id>30905</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4GameTabBase|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4GenericMessageBox (UT2004)</title>
    <id>23123</id>
    <revision>
      <id>30906</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4GenericMessageBox|MessageWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4GetDataMenu (UT2004)</title>
    <id>23124</id>
    <revision>
      <id>30907</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4GetDataMenu|UT2K4GenericMessageBox|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4IRC Channel (UT2004)</title>
    <id>23126</id>
    <revision>
      <id>30909</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4IRC_Channel|UT2K4IRC_Page|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4IRC Page (UT2004)</title>
    <id>23127</id>
    <revision>
      <id>30910</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4IRC_Page|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4LadderButton (UT2004)</title>
    <id>23128</id>
    <revision>
      <id>30911</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4LadderButton|GUIGFXButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4LadderVButton (UT2004)</title>
    <id>23129</id>
    <revision>
      <id>30912</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4LadderVButton|UT2K4LadderButton|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4LoadingPageBase (UT2004)</title>
    <id>23130</id>
    <revision>
      <id>30913</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4LoadingPageBase|Vignette|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4MainPage (UT2004)</title>
    <id>23131</id>
    <revision>
      <id>30914</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4MainPage|UT2K4GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4PhantomRoster (UT2004)</title>
    <id>23132</id>
    <revision>
      <id>30915</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4PhantomRoster|UT2K4TeamRoster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4PlayInfoPanel (UT2004)</title>
    <id>23134</id>
    <revision>
      <id>30917</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4PlayInfoPanel|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4PlayerLoginMenu (UT2004)</title>
    <id>23133</id>
    <revision>
      <id>30916</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4PlayerLoginMenu|FloatingWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4RosterGroup (UT2004)</title>
    <id>23135</id>
    <revision>
      <id>30918</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4RosterGroup|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4SP CGBRUnTrade (UT2004)</title>
    <id>23139</id>
    <revision>
      <id>30922</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4SP_CGBRUnTrade|LargeWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4SPTab Base (UT2004)</title>
    <id>23136</id>
    <revision>
      <id>30919</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4SPTab_Base|UT2K4TabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4SPTab LadderBase (UT2004)</title>
    <id>23137</id>
    <revision>
      <id>30920</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4SPTab_LadderBase|UT2K4SPTab_Base|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4SPTab SingleLadder (UT2004)</title>
    <id>23138</id>
    <revision>
      <id>30921</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4SPTab_SingleLadder|UT2K4SPTab_LadderBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Tab BotConfigBase (UT2004)</title>
    <id>23141</id>
    <revision>
      <id>30924</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Tab_BotConfigBase|UT2K4GameTabBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Tab GameTypeBase (UT2004)</title>
    <id>23142</id>
    <revision>
      <id>30925</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Tab_GameTypeBase|UT2K4GameTabBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Tab MainBase (UT2004)</title>
    <id>23143</id>
    <revision>
      <id>30926</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Tab_MainBase|UT2K4GameTabBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Tab MutatorBase (UT2004)</title>
    <id>23144</id>
    <revision>
      <id>30927</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Tab_MutatorBase|UT2K4GameTabBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Tab PlayerLoginControls (UT2004)</title>
    <id>23145</id>
    <revision>
      <id>30928</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Tab_PlayerLoginControls|MidGamePanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4Tab ServerMapList (UT2004)</title>
    <id>23146</id>
    <revision>
      <id>30929</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4Tab_ServerMapList|MidGamePanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4TabPanel (UT2004)</title>
    <id>23140</id>
    <revision>
      <id>30923</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4TabPanel|GUITabPanel|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2K4TeamRoster (UT2004)</title>
    <id>23147</id>
    <revision>
      <id>30930</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2K4TeamRoster|xTeamRoster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2LoadingPageBase (UT2003)</title>
    <id>23148</id>
    <revision>
      <id>30931</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2LoadingPageBase|Vignette|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2LoadingPageBase (UT2004)</title>
    <id>23149</id>
    <revision>
      <id>30932</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2LoadingPageBase|Vignette|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2MusicManager (UT2003)</title>
    <id>23150</id>
    <revision>
      <id>30933</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2MusicManager|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2SP LadderEventPage (UT2003)</title>
    <id>23151</id>
    <revision>
      <id>30934</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2SP_LadderEventPage|GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2SP LadderEventPage (UT2004)</title>
    <id>23152</id>
    <revision>
      <id>30935</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2SP_LadderEventPage|UT2K3GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UT2StatsPrompt (UT2004)</title>
    <id>23153</id>
    <revision>
      <id>30936</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UT2StatsPrompt|UT2K3GUIPage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAirVehicle (UDK)</title>
    <id>24909</id>
    <revision>
      <id>36445</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAirVehicle|UTHoverVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAirVehicle (UT3)</title>
    <id>23154</id>
    <revision>
      <id>30937</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAirVehicle|UTHoverVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAmmoPickup (UT2003)</title>
    <id>23155</id>
    <revision>
      <id>30938</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAmmoPickup|Ammo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAmmoPickup (UT2004)</title>
    <id>23156</id>
    <revision>
      <id>30939</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAmmoPickup|Ammo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAmmoPickupFactory (UDK)</title>
    <id>24910</id>
    <revision>
      <id>36446</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAmmoPickupFactory|UTItemPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAmmoPickupFactory (UT3)</title>
    <id>23157</id>
    <revision>
      <id>30940</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAmmoPickupFactory|UTItemPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAnimBlendBase (UDK)</title>
    <id>24911</id>
    <revision>
      <id>36447</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAnimBlendBase|AnimNodeBlendList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAnimBlendBase (UT3)</title>
    <id>23158</id>
    <revision>
      <id>30941</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAnimBlendBase|AnimNodeBlendList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAnimBlendByFall (UDK)</title>
    <id>24912</id>
    <revision>
      <id>36448</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAnimBlendByFall|UTAnimBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAnimBlendByFall (UT3)</title>
    <id>23159</id>
    <revision>
      <id>30942</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAnimBlendByFall|UTAnimBlendBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAnimNodeSequence (UDK)</title>
    <id>24913</id>
    <revision>
      <id>36449</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAnimNodeSequence|AnimNodeSequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTAnimNodeSequence (UT3)</title>
    <id>23160</id>
    <revision>
      <id>30943</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTAnimNodeSequence|AnimNodeSequence|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTArmorPickupFactory (UDK)</title>
    <id>24914</id>
    <revision>
      <id>36450</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTArmorPickupFactory|UTItemPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTArmorPickupFactory (UT3)</title>
    <id>23161</id>
    <revision>
      <id>30944</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTArmorPickupFactory|UTItemPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTBeamWeapon (UDK)</title>
    <id>24915</id>
    <revision>
      <id>36451</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTBeamWeapon|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTBeamWeapon (UT3)</title>
    <id>23162</id>
    <revision>
      <id>30945</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTBeamWeapon|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTBeamWeaponAttachment (UDK)</title>
    <id>24916</id>
    <revision>
      <id>36452</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTBeamWeaponAttachment|UTWeaponAttachment|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTBeamWeaponAttachment (UT3)</title>
    <id>23163</id>
    <revision>
      <id>30946</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTBeamWeaponAttachment|UTWeaponAttachment|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTBloodPool (UT)</title>
    <id>23164</id>
    <revision>
      <id>30947</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTBloodPool|Scorch|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFBase (UDK)</title>
    <id>24919</id>
    <revision>
      <id>36455</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFBase|UTGameObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFBase (UT3)</title>
    <id>23169</id>
    <revision>
      <id>30952</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFBase|UTGameObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFBase Content (UDK)</title>
    <id>24920</id>
    <revision>
      <id>36456</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFBase_Content|UTCTFBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFBase Content (UT3)</title>
    <id>23170</id>
    <revision>
      <id>30953</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFBase_Content|UTCTFBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFFlag (UDK)</title>
    <id>24921</id>
    <revision>
      <id>36457</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFFlag|UTCarriedObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFFlag (UT3)</title>
    <id>23171</id>
    <revision>
      <id>30954</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFFlag|UTCarriedObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFGame (UDK)</title>
    <id>24922</id>
    <revision>
      <id>36458</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFGame|UTTeamGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFGame (UT3)</title>
    <id>23172</id>
    <revision>
      <id>30955</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFGame|UTTeamGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFHUD (UDK)</title>
    <id>24923</id>
    <revision>
      <id>36459</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFHUD|UTTeamHUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFHUD (UT3)</title>
    <id>23173</id>
    <revision>
      <id>30956</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFHUD|UTTeamHUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCTFScoreboardPanel (UT3)</title>
    <id>23174</id>
    <revision>
      <id>30957</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCTFScoreboardPanel|UTTDMScoreboardPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCarriedObject (UDK)</title>
    <id>24917</id>
    <revision>
      <id>36453</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCarriedObject|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCarriedObject (UT3)</title>
    <id>23165</id>
    <revision>
      <id>30948</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCarriedObject|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCarriedObjectMessage (UDK)</title>
    <id>24918</id>
    <revision>
      <id>36454</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCarriedObjectMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCarriedObjectMessage (UT3)</title>
    <id>23166</id>
    <revision>
      <id>30949</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCarriedObjectMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTChunk (UT)</title>
    <id>23167</id>
    <revision>
      <id>30950</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTChunk|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTCreatureChunks (UT)</title>
    <id>23168</id>
    <revision>
      <id>30951</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTCreatureChunks|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDamageType (UDK)</title>
    <id>24924</id>
    <revision>
      <id>36460</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDamageType|DamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDamageType (UT3)</title>
    <id>23175</id>
    <revision>
      <id>30958</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDamageType|DamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDarkWalkerBeamLight (UT3)</title>
    <id>23176</id>
    <revision>
      <id>30959</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDarkWalkerBeamLight|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDataStore GameSearchBase (UDK)</title>
    <id>24925</id>
    <revision>
      <id>36461</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDataStore_GameSearchBase|UIDataStore_OnlineGameSearch|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDataStore GameSearchBase (UT3)</title>
    <id>23177</id>
    <revision>
      <id>30960</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDataStore_GameSearchBase|UIDataStore_OnlineGameSearch|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDataStore GameSearchPersonal (UDK)</title>
    <id>24926</id>
    <revision>
      <id>36462</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDataStore_GameSearchPersonal|UTDataStore_GameSearchBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDataStore GameSearchPersonal (UT3)</title>
    <id>23178</id>
    <revision>
      <id>30961</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDataStore_GameSearchPersonal|UTDataStore_GameSearchBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeathMessage (UDK)</title>
    <id>24928</id>
    <revision>
      <id>36464</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeathMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeathMessage (UT3)</title>
    <id>23180</id>
    <revision>
      <id>30963</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeathMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeathmatch (UDK)</title>
    <id>24927</id>
    <revision>
      <id>36463</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeathmatch|UTGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeathmatch (UT3)</title>
    <id>23179</id>
    <revision>
      <id>30962</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeathmatch|UTGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDefensePoint (UDK)</title>
    <id>24929</id>
    <revision>
      <id>36465</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDefensePoint|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDefensePoint (UT3)</title>
    <id>23181</id>
    <revision>
      <id>30964</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDefensePoint|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeployable (UT3)</title>
    <id>23182</id>
    <revision>
      <id>30965</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeployable|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeployablePickupFactory (UT3)</title>
    <id>23183</id>
    <revision>
      <id>30966</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeployablePickupFactory|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeployableXRayVolumeBase (UT3)</title>
    <id>24212</id>
    <revision>
      <id>34681</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeployableXRayVolumeBase|UTDeployable|UE3}}</text>
    </revision>
    <revision>
      <id>34682</id>
      <timestamp>2009-08-16T08:24:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDeployableXRayVolumeBase|UTDeployable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDeployedActor (UT3)</title>
    <id>23184</id>
    <revision>
      <id>30967</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDeployedActor|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType BioGoo (UT3)</title>
    <id>23185</id>
    <revision>
      <id>30968</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_BioGoo|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType BioGoo Charged (UT3)</title>
    <id>23186</id>
    <revision>
      <id>30969</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_BioGoo_Charged|UTDmgType_BioGoo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType Burning (UDK)</title>
    <id>24930</id>
    <revision>
      <id>36466</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Burning|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType Burning (UT3)</title>
    <id>23187</id>
    <revision>
      <id>30970</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Burning|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType Enforcer (UT3)</title>
    <id>23188</id>
    <revision>
      <id>30971</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Enforcer|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType FlakShard (UT3)</title>
    <id>23189</id>
    <revision>
      <id>30972</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_FlakShard|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType Grenade (UT3)</title>
    <id>24213</id>
    <revision>
      <id>34683</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Grenade|UTDmgType_Rocket|UE3}}</text>
    </revision>
    <revision>
      <id>34684</id>
      <timestamp>2009-08-16T08:24:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Grenade|UTDmgType_Rocket|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType NightshadeBeam (UT3)</title>
    <id>23190</id>
    <revision>
      <id>30973</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_NightshadeBeam|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType RanOver (UDK)</title>
    <id>24931</id>
    <revision>
      <id>36467</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_RanOver|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType RanOver (UT3)</title>
    <id>23191</id>
    <revision>
      <id>30974</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_RanOver|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType Rocket (UDK)</title>
    <id>24932</id>
    <revision>
      <id>36468</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Rocket|UTDmgType_Burning|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType Rocket (UT3)</title>
    <id>23192</id>
    <revision>
      <id>30975</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_Rocket|UTDmgType_Burning|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType SPMACameraCrush (UT3)</title>
    <id>24217</id>
    <revision>
      <id>34691</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_SPMACameraCrush|UTDamageType|UE3}}</text>
    </revision>
    <revision>
      <id>34692</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDmgType_SPMACameraCrush|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType SPMAShell (UT3)</title>
    <id>24218</id>
    <revision>
      <id>34693</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_SPMAShell|UTDamageType|UE3}}</text>
    </revision>
    <revision>
      <id>34694</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDmgType_SPMAShell|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType ScorpionGlob (UDK)</title>
    <id>24933</id>
    <revision>
      <id>36469</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ScorpionGlob|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType ScorpionGlob (UT3)</title>
    <id>23193</id>
    <revision>
      <id>30976</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ScorpionGlob|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType ShockBall (UT3)</title>
    <id>24214</id>
    <revision>
      <id>34685</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ShockBall|UTDamageType|UE3}}</text>
    </revision>
    <revision>
      <id>34686</id>
      <timestamp>2009-08-16T08:24:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ShockBall|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType ShockCombo (UT3)</title>
    <id>24215</id>
    <revision>
      <id>34687</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ShockCombo|UTDamageType|UE3}}</text>
    </revision>
    <revision>
      <id>34688</id>
      <timestamp>2009-08-16T08:24:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ShockCombo|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType ShockPrimary (UT3)</title>
    <id>24216</id>
    <revision>
      <id>34689</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ShockPrimary|UTDamageType|UE3}}</text>
    </revision>
    <revision>
      <id>34690</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTDmgType_ShockPrimary|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDmgType SpiderMine (UT3)</title>
    <id>23194</id>
    <revision>
      <id>30977</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDmgType_SpiderMine|UTDamageType|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDrawPanel (UDK)</title>
    <id>24934</id>
    <revision>
      <id>36470</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDrawPanel|UTUI_Widget|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDrawPanel (UT3)</title>
    <id>23195</id>
    <revision>
      <id>30978</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDrawPanel|UTUI_Widget|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDroppedItemPickup (UDK)</title>
    <id>24935</id>
    <revision>
      <id>36471</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDroppedItemPickup|UTDroppedPickup|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDroppedItemPickup (UT3)</title>
    <id>23196</id>
    <revision>
      <id>30979</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDroppedItemPickup|UTDroppedPickup|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDroppedPickup (UDK)</title>
    <id>24936</id>
    <revision>
      <id>36472</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDroppedPickup|DroppedPickup|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTDroppedPickup (UT3)</title>
    <id>23197</id>
    <revision>
      <id>30980</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTDroppedPickup|DroppedPickup|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmit HeroBombWarning (UT3)</title>
    <id>24219</id>
    <revision>
      <id>34695</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmit_HeroBombWarning|UTReplicatedEmitter|UE3}}</text>
    </revision>
    <revision>
      <id>34696</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTEmit_HeroBombWarning|UTReplicatedEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmit HitEffect (UDK)</title>
    <id>24938</id>
    <revision>
      <id>36474</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmit_HitEffect|UTEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmit HitEffect (UT3)</title>
    <id>23202</id>
    <revision>
      <id>30985</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmit_HitEffect|UTEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmit ShockCombo (UT3)</title>
    <id>24220</id>
    <revision>
      <id>34697</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmit_ShockCombo|UTReplicatedEmitter|UE3}}</text>
    </revision>
    <revision>
      <id>34698</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTEmit_ShockCombo|UTReplicatedEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmit TransLocateOut (UDK)</title>
    <id>24939</id>
    <revision>
      <id>36475</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmit_TransLocateOut|UTReplicatedEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmit TransLocateOut (UT3)</title>
    <id>23203</id>
    <revision>
      <id>30986</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmit_TransLocateOut|UTReplicatedEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmitCameraEffect (UT3)</title>
    <id>23200</id>
    <revision>
      <id>30983</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmitCameraEffect|Emitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmitter (UDK)</title>
    <id>24937</id>
    <revision>
      <id>36473</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmitter|Emitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEmitter (UT3)</title>
    <id>23201</id>
    <revision>
      <id>30984</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEmitter|Emitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEntryGame (UT3)</title>
    <id>23204</id>
    <revision>
      <id>30987</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEntryGame|UTTeamGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTEntryPlayerController (UT3)</title>
    <id>23205</id>
    <revision>
      <id>30988</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTEntryPlayerController|UTPlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTExplosionLight (UDK)</title>
    <id>24940</id>
    <revision>
      <id>36476</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTExplosionLight|PointLightComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTExplosionLight (UT3)</title>
    <id>23206</id>
    <revision>
      <id>30989</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTExplosionLight|PointLightComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTExtraKeyBindings (UT)</title>
    <id>23207</id>
    <revision>
      <id>30990</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTExtraKeyBindings|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo (UDK)</title>
    <id>24941</id>
    <revision>
      <id>36477</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo (UT3)</title>
    <id>23208</id>
    <revision>
      <id>30991</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo Human (UT3)</title>
    <id>23209</id>
    <revision>
      <id>30992</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_Human|UTFamilyInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo Ironguard (UT3)</title>
    <id>23210</id>
    <revision>
      <id>30993</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_Ironguard|UTFamilyInfo_Human|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo Krall (UT3)</title>
    <id>23211</id>
    <revision>
      <id>30994</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_Krall|UTFamilyInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo Liandri (UDK)</title>
    <id>24942</id>
    <revision>
      <id>36478</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_Liandri|UTFamilyInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo Liandri (UT3)</title>
    <id>23212</id>
    <revision>
      <id>30995</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_Liandri|UTFamilyInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo Necris (UT3)</title>
    <id>23213</id>
    <revision>
      <id>30996</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_Necris|UTFamilyInfo_Human|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFamilyInfo TwinSouls (UT3)</title>
    <id>23214</id>
    <revision>
      <id>30997</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFamilyInfo_TwinSouls|UTFamilyInfo_Human|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTFlakShell (UT)</title>
    <id>23215</id>
    <revision>
      <id>30998</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTFlakShell|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGame (UDK)</title>
    <id>24943</id>
    <revision>
      <id>36479</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGame|GameInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGame (UT3)</title>
    <id>23216</id>
    <revision>
      <id>30999</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGame|GameInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameObjective (UDK)</title>
    <id>24944</id>
    <revision>
      <id>36480</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameObjective|Objective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameObjective (UT3)</title>
    <id>23217</id>
    <revision>
      <id>31000</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameObjective|Objective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameReplicationInfo (UT3)</title>
    <id>23218</id>
    <revision>
      <id>31001</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameReplicationInfo|GameReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameSearchCommon (UDK)</title>
    <id>24945</id>
    <revision>
      <id>36481</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameSearchCommon|OnlineGameSearch|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameSearchCommon (UT3)</title>
    <id>23219</id>
    <revision>
      <id>31002</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameSearchCommon|OnlineGameSearch|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameSearchDM (UT3)</title>
    <id>23220</id>
    <revision>
      <id>31003</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameSearchDM|UTGameSearchCommon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameSettings (UT3)</title>
    <id>23221</id>
    <revision>
      <id>31004</id>
      <timestamp>2008-05-18T15:24:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameSettings|WebAdminSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameSettingsCommon (UDK)</title>
    <id>24946</id>
    <revision>
      <id>36482</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameSettingsCommon|OnlineGameSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGameSettingsCommon (UT3)</title>
    <id>23222</id>
    <revision>
      <id>31005</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGameSettingsCommon|OnlineGameSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib (UDK)</title>
    <id>24947</id>
    <revision>
      <id>36483</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib (UT3)</title>
    <id>23223</id>
    <revision>
      <id>31006</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib Human (UT3)</title>
    <id>23224</id>
    <revision>
      <id>31007</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_Human|UTGib|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib Krall (UT3)</title>
    <id>23225</id>
    <revision>
      <id>31008</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_Krall|UTGib|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib Robot (UDK)</title>
    <id>24948</id>
    <revision>
      <id>36484</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_Robot|UTGib|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib Robot (UT3)</title>
    <id>23226</id>
    <revision>
      <id>31009</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_Robot|UTGib|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib Vehicle (UDK)</title>
    <id>24949</id>
    <revision>
      <id>36485</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_Vehicle|UTGib|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib Vehicle (UT3)</title>
    <id>23227</id>
    <revision>
      <id>31010</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_Vehicle|UTGib|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGib VehiclePiece (UT3)</title>
    <id>23228</id>
    <revision>
      <id>31011</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGib_VehiclePiece|UTGib_Vehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGreedCoin (UT3)</title>
    <id>24221</id>
    <revision>
      <id>34699</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin|UTDroppedItemPickup|UE3}}</text>
    </revision>
    <revision>
      <id>34700</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin|UTDroppedItemPickup|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGreedCoin Gold (UT3)</title>
    <id>24222</id>
    <revision>
      <id>34701</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin_Gold|UTGreedCoin|UE3}}</text>
    </revision>
    <revision>
      <id>34702</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin_Gold|UTGreedCoin|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGreedCoin Red (UT3)</title>
    <id>24223</id>
    <revision>
      <id>34703</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin_Red|UTGreedCoin|UE3}}</text>
    </revision>
    <revision>
      <id>34704</id>
      <timestamp>2009-08-16T08:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin_Red|UTGreedCoin|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGreedCoin Silver (UT3)</title>
    <id>24224</id>
    <revision>
      <id>34705</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin_Silver|UTGreedCoin|UE3}}</text>
    </revision>
    <revision>
      <id>34706</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTGreedCoin_Silver|UTGreedCoin|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGreedFlag (UT3)</title>
    <id>24225</id>
    <revision>
      <id>34707</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGreedFlag|UTCTFFlag|UE3}}</text>
    </revision>
    <revision>
      <id>34708</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTGreedFlag|UTCTFFlag|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTGreedGame (UT3)</title>
    <id>24226</id>
    <revision>
      <id>34709</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTGreedGame|UTTeamGame|UE3}}</text>
    </revision>
    <revision>
      <id>34710</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTGreedGame|UTTeamGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHUD (UDK)</title>
    <id>24952</id>
    <revision>
      <id>36488</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHUD|GameHUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHUD (UT3)</title>
    <id>23232</id>
    <revision>
      <id>31015</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHUD|GameHUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHeads (UT)</title>
    <id>23229</id>
    <revision>
      <id>31012</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHeads|UTPlayerChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHealthPickupFactory (UDK)</title>
    <id>24950</id>
    <revision>
      <id>36486</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHealthPickupFactory|UTItemPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHealthPickupFactory (UT3)</title>
    <id>23230</id>
    <revision>
      <id>31013</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHealthPickupFactory|UTItemPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHeroPRI (UT3)</title>
    <id>24227</id>
    <revision>
      <id>34711</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHeroPRI|UTPlayerReplicationInfo|UE3}}</text>
    </revision>
    <revision>
      <id>34712</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTHeroPRI|UTPlayerReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHoverVehicle (UDK)</title>
    <id>24951</id>
    <revision>
      <id>36487</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHoverVehicle|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHoverVehicle (UT3)</title>
    <id>23231</id>
    <revision>
      <id>31014</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHoverVehicle|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTHumanCarcass (UT)</title>
    <id>23233</id>
    <revision>
      <id>31016</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTHumanCarcass|Carcass|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTIntro (UT)</title>
    <id>23234</id>
    <revision>
      <id>31017</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTIntro|TournamentGameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTInventory (UDK)</title>
    <id>24953</id>
    <revision>
      <id>36489</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTInventory|Inventory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTInventory (UT3)</title>
    <id>23235</id>
    <revision>
      <id>31018</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTInventory|Inventory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTItemPickupFactory (UDK)</title>
    <id>24954</id>
    <revision>
      <id>36490</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTItemPickupFactory|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTItemPickupFactory (UT3)</title>
    <id>23236</id>
    <revision>
      <id>31019</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTItemPickupFactory|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLadder (UT)</title>
    <id>23237</id>
    <revision>
      <id>31020</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLadder|UTLadderStub|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLadderStub (UT)</title>
    <id>23238</id>
    <revision>
      <id>31021</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLadderStub|NotifyWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardReadBase (UDK)</title>
    <id>24955</id>
    <revision>
      <id>36491</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardReadBase|OnlineStatsRead|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardReadBase (UT3)</title>
    <id>23239</id>
    <revision>
      <id>31022</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardReadBase|OnlineStatsRead|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardWriteBase (UDK)</title>
    <id>24956</id>
    <revision>
      <id>36492</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardWriteBase|OnlineStatsWrite|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardWriteBase (UT3)</title>
    <id>23240</id>
    <revision>
      <id>31023</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardWriteBase|OnlineStatsWrite|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardWriteDM (UDK)</title>
    <id>24957</id>
    <revision>
      <id>36493</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardWriteDM|UTLeaderboardWriteBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardWriteDM (UT3)</title>
    <id>23241</id>
    <revision>
      <id>31024</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardWriteDM|UTLeaderboardWriteBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardWriteTDM (UDK)</title>
    <id>24958</id>
    <revision>
      <id>36494</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardWriteTDM|UTLeaderboardWriteDM|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLeaderboardWriteTDM (UT3)</title>
    <id>23242</id>
    <revision>
      <id>31025</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLeaderboardWriteTDM|UTLeaderboardWriteDM|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLinkGenerator (UT3)</title>
    <id>24228</id>
    <revision>
      <id>34713</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLinkGenerator|UTDeployedActor|UE3}}</text>
    </revision>
    <revision>
      <id>34714</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTLinkGenerator|UTDeployedActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLocalMessage (UDK)</title>
    <id>24959</id>
    <revision>
      <id>36495</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLocalMessage|LocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTLocalMessage (UT3)</title>
    <id>23243</id>
    <revision>
      <id>31026</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTLocalMessage|LocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMapInfo (UT3)</title>
    <id>23244</id>
    <revision>
      <id>31027</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMapInfo|MapInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMasterCreatureChunk (UT)</title>
    <id>23245</id>
    <revision>
      <id>31028</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMasterCreatureChunk|UTCreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMenuBotmatchCW (UT)</title>
    <id>23246</id>
    <revision>
      <id>31029</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMenuBotmatchCW|UMenuBotmatchClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMissionInfo (UT3)</title>
    <id>23247</id>
    <revision>
      <id>31030</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMissionInfo|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMusicManager (UT3)</title>
    <id>23248</id>
    <revision>
      <id>31031</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMusicManager|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMutator (UDK)</title>
    <id>24960</id>
    <revision>
      <id>36496</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMutator|Mutator|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTMutator (UT3)</title>
    <id>23249</id>
    <revision>
      <id>31032</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTMutator|Mutator|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTObjectiveSpecificMessage (UDK)</title>
    <id>24961</id>
    <revision>
      <id>36497</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTObjectiveSpecificMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTObjectiveSpecificMessage (UT3)</title>
    <id>23250</id>
    <revision>
      <id>31033</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTObjectiveSpecificMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtBlueCoreMessage (UT3)</title>
    <id>23251</id>
    <revision>
      <id>31034</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtBlueCoreMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtFlag (UT3)</title>
    <id>23252</id>
    <revision>
      <id>31035</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtFlag|UTCarriedObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtFlagBase (UT3)</title>
    <id>23253</id>
    <revision>
      <id>31036</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtFlagBase|UTOnslaughtNodeEnhancement|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtGame (UT3)</title>
    <id>23254</id>
    <revision>
      <id>31037</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtGame|UTTeamGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtGameSettings (UT3)</title>
    <id>23255</id>
    <revision>
      <id>31038</id>
      <timestamp>2008-05-18T15:24:34Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtGameSettings|UTTeamGameSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtGodBeam (UT3)</title>
    <id>23256</id>
    <revision>
      <id>31039</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtGodBeam|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtMiningRobot (UT3)</title>
    <id>23257</id>
    <revision>
      <id>31040</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtMiningRobot|GamePawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtNodeEnhancement (UT3)</title>
    <id>23258</id>
    <revision>
      <id>31041</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtNodeEnhancement|UTGameObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtNodeHealEffectBase (UT3)</title>
    <id>23259</id>
    <revision>
      <id>31042</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtNodeHealEffectBase|UTReplicatedEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtNodeObjective (UT3)</title>
    <id>23260</id>
    <revision>
      <id>31043</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtNodeObjective|UTOnslaughtObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtNodeTeleporter (UT3)</title>
    <id>23261</id>
    <revision>
      <id>31044</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtNodeTeleporter|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtObjective (UT3)</title>
    <id>23262</id>
    <revision>
      <id>31045</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtObjective|UTGameObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtPRI (UT3)</title>
    <id>24229</id>
    <revision>
      <id>34715</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtPRI|UTPlayerReplicationInfo|UE3}}</text>
    </revision>
    <revision>
      <id>34716</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtPRI|UTPlayerReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtPanelNode (UT3)</title>
    <id>23263</id>
    <revision>
      <id>31046</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtPanelNode|UTOnslaughtNodeObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtPowerCore (UT3)</title>
    <id>23264</id>
    <revision>
      <id>31047</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtPowerCore|UTOnslaughtPanelNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtPowernode (UT3)</title>
    <id>23265</id>
    <revision>
      <id>31048</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtPowernode|UTOnslaughtPanelNode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtPowernode Content (UT3)</title>
    <id>23266</id>
    <revision>
      <id>31049</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtPowernode_Content|UTOnslaughtPowernode|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtSpecialObjective (UT3)</title>
    <id>23267</id>
    <revision>
      <id>31050</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtSpecialObjective|UTOnslaughtObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtTarydiumMine (UT3)</title>
    <id>23268</id>
    <revision>
      <id>31051</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtTarydiumMine|UTGameObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTOnslaughtTarydiumProcessor (UT3)</title>
    <id>23269</id>
    <revision>
      <id>31052</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTOnslaughtTarydiumProcessor|UTOnslaughtNodeEnhancement|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPawn (UDK)</title>
    <id>24962</id>
    <revision>
      <id>36498</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPawn|GamePawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPawn (UT3)</title>
    <id>23270</id>
    <revision>
      <id>31053</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPawn|GamePawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPawnSoundGroup (UDK)</title>
    <id>24963</id>
    <revision>
      <id>36499</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPawnSoundGroup|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPawnSoundGroup (UT3)</title>
    <id>23271</id>
    <revision>
      <id>31054</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPawnSoundGroup|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPickupFactory (UDK)</title>
    <id>24964</id>
    <revision>
      <id>36500</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPickupFactory|PickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPickupFactory (UT3)</title>
    <id>23272</id>
    <revision>
      <id>31055</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPickupFactory|PickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPickupLight (UDK)</title>
    <id>24965</id>
    <revision>
      <id>36501</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPickupLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPickupLight (UT3)</title>
    <id>23273</id>
    <revision>
      <id>31056</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPickupLight|Light|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPlayerChunks (UT)</title>
    <id>23274</id>
    <revision>
      <id>31057</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPlayerChunks|UTCreatureChunks|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPlayerController (UDK)</title>
    <id>24966</id>
    <revision>
      <id>36502</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPlayerController|GamePlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPlayerController (UT3)</title>
    <id>23275</id>
    <revision>
      <id>31058</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPlayerController|GamePlayerController|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPlayerInput (UDK)</title>
    <id>24967</id>
    <revision>
      <id>36503</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPlayerInput|GamePlayerInput|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPlayerInput (UT3)</title>
    <id>23276</id>
    <revision>
      <id>31059</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPlayerInput|GamePlayerInput|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPlayerReplicationInfo (UT3)</title>
    <id>23277</id>
    <revision>
      <id>31060</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPlayerReplicationInfo|PlayerReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPowerCorePanel (UT3)</title>
    <id>23278</id>
    <revision>
      <id>31061</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPowerCorePanel|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPowerCorePanel Content (UT3)</title>
    <id>23279</id>
    <revision>
      <id>31062</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPowerCorePanel_Content|UTPowerCorePanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPowerupPickupFactory (UDK)</title>
    <id>24968</id>
    <revision>
      <id>36504</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPowerupPickupFactory|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTPowerupPickupFactory (UT3)</title>
    <id>23280</id>
    <revision>
      <id>31063</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTPowerupPickupFactory|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj AvrilRocketBase (UT3)</title>
    <id>23282</id>
    <revision>
      <id>31065</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_AvrilRocketBase|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj BioShot (UT3)</title>
    <id>23283</id>
    <revision>
      <id>31066</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_BioShot|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj FlakShard (UT3)</title>
    <id>23284</id>
    <revision>
      <id>31067</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_FlakShard|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj Grenade (UT3)</title>
    <id>24230</id>
    <revision>
      <id>34717</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_Grenade|UTProjectile|UE3}}</text>
    </revision>
    <revision>
      <id>34718</id>
      <timestamp>2009-08-16T08:24:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTProj_Grenade|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj LinkPlasma (UDK)</title>
    <id>24970</id>
    <revision>
      <id>36506</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_LinkPlasma|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj LinkPlasma (UT3)</title>
    <id>23285</id>
    <revision>
      <id>31068</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_LinkPlasma|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj RaptorBolt (UT3)</title>
    <id>23286</id>
    <revision>
      <id>31069</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_RaptorBolt|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj RaptorRocket (UT3)</title>
    <id>23287</id>
    <revision>
      <id>31070</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_RaptorRocket|UTProj_SeekingRocket|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj Redeemer (UT3)</title>
    <id>23288</id>
    <revision>
      <id>31071</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_Redeemer|UTProj_RedeemerBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj RedeemerBase (UT3)</title>
    <id>23289</id>
    <revision>
      <id>31072</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_RedeemerBase|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj Rocket (UDK)</title>
    <id>24971</id>
    <revision>
      <id>36507</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_Rocket|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj Rocket (UT3)</title>
    <id>23290</id>
    <revision>
      <id>31073</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_Rocket|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SPMACamera (UT3)</title>
    <id>23298</id>
    <revision>
      <id>31081</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SPMACamera|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SPMAShell (UT3)</title>
    <id>23299</id>
    <revision>
      <id>31082</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SPMAShell|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SPMAShell Content (UT3)</title>
    <id>24232</id>
    <revision>
      <id>34721</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SPMAShell_Content|UTProj_SPMAShell|UE3}}</text>
    </revision>
    <revision>
      <id>34722</id>
      <timestamp>2009-08-16T08:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTProj_SPMAShell_Content|UTProj_SPMAShell|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SPMAShellChild (UT3)</title>
    <id>24231</id>
    <revision>
      <id>34719</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SPMAShellChild|UTProjectile|UE3}}</text>
    </revision>
    <revision>
      <id>34720</id>
      <timestamp>2009-08-16T08:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTProj_SPMAShellChild|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj ScavengerBolt (UT3)</title>
    <id>23291</id>
    <revision>
      <id>31074</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_ScavengerBolt|UTProj_ScavengerBoltBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj ScavengerBoltBase (UT3)</title>
    <id>23292</id>
    <revision>
      <id>31075</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_ScavengerBoltBase|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj ScorpionGlob Base (UDK)</title>
    <id>24972</id>
    <revision>
      <id>36508</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_ScorpionGlob_Base|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj ScorpionGlob Base (UT3)</title>
    <id>23293</id>
    <revision>
      <id>31076</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_ScorpionGlob_Base|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SeekingRocket (UT3)</title>
    <id>23294</id>
    <revision>
      <id>31077</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SeekingRocket|UTProj_Rocket|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj ShockBall (UT3)</title>
    <id>23295</id>
    <revision>
      <id>31078</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_ShockBall|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SpiderMine (UT3)</title>
    <id>23296</id>
    <revision>
      <id>31079</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SpiderMine|UTProj_SpiderMineBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj SpiderMineBase (UT3)</title>
    <id>23297</id>
    <revision>
      <id>31080</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_SpiderMineBase|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj StingerShard (UT3)</title>
    <id>23300</id>
    <revision>
      <id>31083</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_StingerShard|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj TransDisc (UT3)</title>
    <id>23301</id>
    <revision>
      <id>31084</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_TransDisc|UTProjectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProj VehicleShockBallBase (UT3)</title>
    <id>23302</id>
    <revision>
      <id>31085</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProj_VehicleShockBallBase|UTProj_ShockBall|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProjectile (UDK)</title>
    <id>24969</id>
    <revision>
      <id>36505</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProjectile|Projectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTProjectile (UT3)</title>
    <id>23281</id>
    <revision>
      <id>31064</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTProjectile|Projectile|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTRemoteRedeemer (UT3)</title>
    <id>23303</id>
    <revision>
      <id>31086</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTRemoteRedeemer|Vehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTReplicatedEmitter (UDK)</title>
    <id>24973</id>
    <revision>
      <id>36509</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTReplicatedEmitter|UTEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTReplicatedEmitter (UT3)</title>
    <id>23304</id>
    <revision>
      <id>31087</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTReplicatedEmitter|UTEmitter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTRulesCWindow (UT)</title>
    <id>23305</id>
    <revision>
      <id>31088</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTRulesCWindow|UMenuGameRulesBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSPGlobe (UT3)</title>
    <id>23316</id>
    <revision>
      <id>31099</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSPGlobe|SkeletalMeshActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTScoreboardPanel (UDK)</title>
    <id>24974</id>
    <revision>
      <id>36510</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTScoreboardPanel|UTDrawPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTScoreboardPanel (UT3)</title>
    <id>23306</id>
    <revision>
      <id>31089</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTScoreboardPanel|UTDrawPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSeqObj SPMission (UT3)</title>
    <id>23307</id>
    <revision>
      <id>31090</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSeqObj_SPMission|SequenceAction|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSettingsCWindow (UT)</title>
    <id>23308</id>
    <revision>
      <id>31091</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSettingsCWindow|UMenuGameSettingsBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTShapedCharge (UT3)</title>
    <id>23309</id>
    <revision>
      <id>31092</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTShapedCharge|UTDeployedActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSimpleDestroyable (UT3)</title>
    <id>23310</id>
    <revision>
      <id>31093</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSimpleDestroyable|DynamicSMActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSimpleList (UDK)</title>
    <id>24975</id>
    <revision>
      <id>36511</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSimpleList|UTDrawPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSimpleList (UT3)</title>
    <id>23311</id>
    <revision>
      <id>31094</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSimpleList|UTDrawPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSkelControl Damage (UDK)</title>
    <id>24976</id>
    <revision>
      <id>36512</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSkelControl_Damage|SkelControlSingleBone|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSkelControl Damage (UT3)</title>
    <id>23312</id>
    <revision>
      <id>31095</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSkelControl_Damage|SkelControlSingleBone|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSkelControl TurretConstrained (UT3)</title>
    <id>23313</id>
    <revision>
      <id>31096</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSkelControl_TurretConstrained|SkelControlSingleBone|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSlowField (UT3)</title>
    <id>24233</id>
    <revision>
      <id>34723</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSlowField|UTTimedPowerup|UE3}}</text>
    </revision>
    <revision>
      <id>34724</id>
      <timestamp>2009-08-16T08:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTSlowField|UTTimedPowerup|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSlowVolume (UT3)</title>
    <id>23314</id>
    <revision>
      <id>31097</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSlowVolume|GravityVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSmokeTrail (UT)</title>
    <id>23315</id>
    <revision>
      <id>31098</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSmokeTrail|Effects|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSpiderMineTrap (UT3)</title>
    <id>23317</id>
    <revision>
      <id>31100</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSpiderMineTrap|UTDeployedActor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSquadAI (UDK)</title>
    <id>24977</id>
    <revision>
      <id>36513</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSquadAI|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTSquadAI (UT3)</title>
    <id>23318</id>
    <revision>
      <id>31101</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTSquadAI|ReplicationInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTStealthVehicle (UT3)</title>
    <id>23319</id>
    <revision>
      <id>31102</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTStealthVehicle|UTVehicle_Deployable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTDMScoreboardPanel (UDK)</title>
    <id>24980</id>
    <revision>
      <id>36516</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTDMScoreboardPanel|UTScoreboardPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTDMScoreboardPanel (UT3)</title>
    <id>23322</id>
    <revision>
      <id>31105</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTDMScoreboardPanel|UTScoreboardPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTabPage (UDK)</title>
    <id>24978</id>
    <revision>
      <id>36514</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTabPage|UITabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTabPage (UT3)</title>
    <id>23320</id>
    <revision>
      <id>31103</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTabPage|UITabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTabPage MidGame (UDK)</title>
    <id>24979</id>
    <revision>
      <id>36515</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTabPage_MidGame|UTTabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTabPage MidGame (UT3)</title>
    <id>23321</id>
    <revision>
      <id>31104</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTabPage_MidGame|UTTabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamAI (UDK)</title>
    <id>24981</id>
    <revision>
      <id>36517</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamAI|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamAI (UT3)</title>
    <id>23323</id>
    <revision>
      <id>31106</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamAI|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamGame (UDK)</title>
    <id>24982</id>
    <revision>
      <id>36518</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamGame|UTDeathmatch|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamGame (UT3)</title>
    <id>23324</id>
    <revision>
      <id>31107</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamGame|UTDeathmatch|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamGameSettings (UT3)</title>
    <id>23325</id>
    <revision>
      <id>31108</id>
      <timestamp>2008-05-18T15:24:34Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamGameSettings|UTGameSettings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamHUD (UDK)</title>
    <id>24983</id>
    <revision>
      <id>36519</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamHUD|UTHUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamHUD (UT3)</title>
    <id>23326</id>
    <revision>
      <id>31109</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamHUD|UTHUD|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamInfo (UDK)</title>
    <id>24984</id>
    <revision>
      <id>36520</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamInfo|TeamInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamInfo (UT3)</title>
    <id>23327</id>
    <revision>
      <id>31110</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamInfo|TeamInfo|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeamRCWindow (UT)</title>
    <id>23328</id>
    <revision>
      <id>31111</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeamRCWindow|UTRulesCWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeleporterBase (UDK)</title>
    <id>24985</id>
    <revision>
      <id>36521</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeleporterBase|Teleporter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTeleporterBase (UT3)</title>
    <id>23329</id>
    <revision>
      <id>31112</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTeleporterBase|Teleporter|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTimedPowerup (UDK)</title>
    <id>24986</id>
    <revision>
      <id>36522</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTimedPowerup|UTInventory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTimedPowerup (UT3)</title>
    <id>23330</id>
    <revision>
      <id>31113</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTimedPowerup|UTInventory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTrajectoryReachSpec (UDK)</title>
    <id>24987</id>
    <revision>
      <id>36523</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTrajectoryReachSpec|AdvancedReachSpec|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTTrajectoryReachSpec (UT3)</title>
    <id>23331</id>
    <revision>
      <id>31114</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTTrajectoryReachSpec|AdvancedReachSpec|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUI Widget (UDK)</title>
    <id>25003</id>
    <revision>
      <id>36539</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUI_Widget|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUI Widget (UT3)</title>
    <id>23352</id>
    <revision>
      <id>31135</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUI_Widget|UIObject|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIDataProvider SimpleElementProvider (UDK)</title>
    <id>24988</id>
    <revision>
      <id>36524</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIDataProvider_SimpleElementProvider|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIDataProvider SimpleElementProvider (UT3)</title>
    <id>23332</id>
    <revision>
      <id>31115</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIDataProvider_SimpleElementProvider|UIDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIDataProvider StatsElementProvider (UDK)</title>
    <id>24989</id>
    <revision>
      <id>36525</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIDataProvider_StatsElementProvider|UTUIDataProvider_SimpleElementProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIDataProvider StatsElementProvider (UT3)</title>
    <id>23333</id>
    <revision>
      <id>31116</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIDataProvider_StatsElementProvider|UTUIDataProvider_SimpleElementProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIDataProvider StatsGeneral (UDK)</title>
    <id>24990</id>
    <revision>
      <id>36526</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIDataProvider_StatsGeneral|UTUIDataProvider_StatsElementProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIDataProvider StatsGeneral (UT3)</title>
    <id>23334</id>
    <revision>
      <id>31117</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIDataProvider_StatsGeneral|UTUIDataProvider_StatsElementProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd (UDK)</title>
    <id>24991</id>
    <revision>
      <id>36527</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd (UT3)</title>
    <id>23335</id>
    <revision>
      <id>31118</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd BasicMenu (UDK)</title>
    <id>24992</id>
    <revision>
      <id>36528</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd_BasicMenu|UTUIFrontEnd|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd BasicMenu (UT3)</title>
    <id>23336</id>
    <revision>
      <id>31119</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd_BasicMenu|UTUIFrontEnd|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd CustomScreen (UT3)</title>
    <id>23337</id>
    <revision>
      <id>31120</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd_CustomScreen|UTUIFrontEnd|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd LaunchGame (UDK)</title>
    <id>24993</id>
    <revision>
      <id>36529</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd_LaunchGame|UTUIFrontEnd|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIFrontEnd LaunchGame (UT3)</title>
    <id>23338</id>
    <revision>
      <id>31121</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIFrontEnd_LaunchGame|UTUIFrontEnd|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIIconMenuList (UDK)</title>
    <id>24994</id>
    <revision>
      <id>36530</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIIconMenuList|UTUIMenuList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIIconMenuList (UT3)</title>
    <id>23339</id>
    <revision>
      <id>31122</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIIconMenuList|UTUIMenuList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIMenuList (UDK)</title>
    <id>24995</id>
    <revision>
      <id>36531</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIMenuList|UTSimpleList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIMenuList (UT3)</title>
    <id>23340</id>
    <revision>
      <id>31123</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIMenuList|UTSimpleList|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIOptionList (UT3)</title>
    <id>23341</id>
    <revision>
      <id>31124</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIOptionList|UTDrawPanel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIResourceDataProvider (UDK)</title>
    <id>24996</id>
    <revision>
      <id>36532</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIResourceDataProvider|UIResourceDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIResourceDataProvider (UT3)</title>
    <id>23342</id>
    <revision>
      <id>31125</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIResourceDataProvider|UIResourceDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene (UDK)</title>
    <id>24997</id>
    <revision>
      <id>36533</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene|UIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene (UT3)</title>
    <id>23343</id>
    <revision>
      <id>31126</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene|UIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene Campaign (UT3)</title>
    <id>23344</id>
    <revision>
      <id>31127</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_Campaign|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene Hud (UDK)</title>
    <id>24998</id>
    <revision>
      <id>36534</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_Hud|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene Hud (UT3)</title>
    <id>23345</id>
    <revision>
      <id>31128</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_Hud|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene MessageBox (UDK)</title>
    <id>24999</id>
    <revision>
      <id>36535</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_MessageBox|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene MessageBox (UT3)</title>
    <id>23346</id>
    <revision>
      <id>31129</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_MessageBox|UTUIScene|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene Scoreboard (UDK)</title>
    <id>25000</id>
    <revision>
      <id>36536</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_Scoreboard|UTUIScene_Hud|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene Scoreboard (UT3)</title>
    <id>23347</id>
    <revision>
      <id>31130</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_Scoreboard|UTUIScene_Hud|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene TeamScoreboard (UDK)</title>
    <id>25001</id>
    <revision>
      <id>36537</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_TeamScoreboard|UTUIScene_Scoreboard|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUIScene TeamScoreboard (UT3)</title>
    <id>23348</id>
    <revision>
      <id>31131</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUIScene_TeamScoreboard|UTUIScene_Scoreboard|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUITabPage Options (UDK)</title>
    <id>25002</id>
    <revision>
      <id>36538</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUITabPage_Options|UTTabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUITabPage Options (UT3)</title>
    <id>23349</id>
    <revision>
      <id>31132</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUITabPage_Options|UTTabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUITabPage ServerBrowser (UT3)</title>
    <id>23350</id>
    <revision>
      <id>31133</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUITabPage_ServerBrowser|UTTabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTUITabPage StatsPage (UT3)</title>
    <id>23351</id>
    <revision>
      <id>31134</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTUITabPage_StatsPage|UTTabPage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVWeap LeviathanTurretBase (UT3)</title>
    <id>23382</id>
    <revision>
      <id>31165</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVWeap_LeviathanTurretBase|UTVehicleWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVWeap NightshadeGun (UT3)</title>
    <id>23383</id>
    <revision>
      <id>31166</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVWeap_NightshadeGun|UTVehicleWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVWeap SPMACannon (UT3)</title>
    <id>23385</id>
    <revision>
      <id>31168</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVWeap_SPMACannon|UTVehicleWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVWeap SPMACannon Content (UT3)</title>
    <id>24235</id>
    <revision>
      <id>34727</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVWeap_SPMACannon_Content|UTVWeap_SPMACannon|UE3}}</text>
    </revision>
    <revision>
      <id>34728</id>
      <timestamp>2009-08-16T08:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTVWeap_SPMACannon_Content|UTVWeap_SPMACannon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVWeap ShockTurretBase (UT3)</title>
    <id>23384</id>
    <revision>
      <id>31167</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVWeap_ShockTurretBase|UTVehicleWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVWeap StealthGunContent (UT3)</title>
    <id>23386</id>
    <revision>
      <id>31169</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVWeap_StealthGunContent|UTVWeap_NightshadeGun|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle (UDK)</title>
    <id>25004</id>
    <revision>
      <id>36540</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle|UTVehicleBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle (UT3)</title>
    <id>23353</id>
    <revision>
      <id>31136</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle|UTVehicleBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Cicada (UDK)</title>
    <id>25011</id>
    <revision>
      <id>36547</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Cicada|UTAirVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Cicada (UT3)</title>
    <id>23363</id>
    <revision>
      <id>31146</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Cicada|UTAirVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle DarkWalker (UT3)</title>
    <id>23364</id>
    <revision>
      <id>31147</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_DarkWalker|UTVehicle_Walker|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Deployable (UT3)</title>
    <id>23365</id>
    <revision>
      <id>31148</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Deployable|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Eradicator (UT3)</title>
    <id>24234</id>
    <revision>
      <id>34725</id>
      <timestamp>2009-08-16T10:16:46Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Eradicator|UTVehicle|UE3}}</text>
    </revision>
    <revision>
      <id>34726</id>
      <timestamp>2009-08-16T08:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Eradicator|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Fury (UT3)</title>
    <id>23366</id>
    <revision>
      <id>31149</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Fury|UTAirVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Goliath (UT3)</title>
    <id>23367</id>
    <revision>
      <id>31150</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Goliath|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle HellBender (UT3)</title>
    <id>23368</id>
    <revision>
      <id>31151</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_HellBender|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Hoverboard (UDK)</title>
    <id>25012</id>
    <revision>
      <id>36548</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Hoverboard|UTHoverVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Leviathan (UT3)</title>
    <id>23369</id>
    <revision>
      <id>31152</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Leviathan|UTVehicle_Deployable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Manta (UDK)</title>
    <id>25013</id>
    <revision>
      <id>36549</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Manta|UTHoverVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Manta (UT3)</title>
    <id>23370</id>
    <revision>
      <id>31153</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Manta|UTHoverVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle NightShade (UT3)</title>
    <id>23371</id>
    <revision>
      <id>31154</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_NightShade|UTStealthVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Raptor (UT3)</title>
    <id>23372</id>
    <revision>
      <id>31155</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Raptor|UTAirVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle SPMA (UT3)</title>
    <id>23376</id>
    <revision>
      <id>31159</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_SPMA|UTVehicle_Deployable|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Scavenger (UT3)</title>
    <id>23373</id>
    <revision>
      <id>31156</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Scavenger|UTVehicle_Walker|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Scorpion (UDK)</title>
    <id>25014</id>
    <revision>
      <id>36550</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Scorpion|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Scorpion (UT3)</title>
    <id>23374</id>
    <revision>
      <id>31157</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Scorpion|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle ShieldedTurret (UT3)</title>
    <id>23375</id>
    <revision>
      <id>31158</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_ShieldedTurret|UTVehicle_TrackTurretBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle StealthBender (UT3)</title>
    <id>23377</id>
    <revision>
      <id>31160</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_StealthBender|UTStealthVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle TrackTurretBase (UT3)</title>
    <id>23378</id>
    <revision>
      <id>31161</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_TrackTurretBase|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Viper (UT3)</title>
    <id>23379</id>
    <revision>
      <id>31162</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Viper|UTHoverVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicle Walker (UT3)</title>
    <id>23380</id>
    <revision>
      <id>31163</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicle_Walker|UTVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleBase (UDK)</title>
    <id>25005</id>
    <revision>
      <id>36541</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleBase|SVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleBase (UT3)</title>
    <id>23354</id>
    <revision>
      <id>31137</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleBase|SVehicle|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleCTFGame (UDK)</title>
    <id>25006</id>
    <revision>
      <id>36542</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleCTFGame|UTCTFGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleCTFGame (UT3)</title>
    <id>23355</id>
    <revision>
      <id>31138</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleCTFGame|UTCTFGame|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleFactory (UDK)</title>
    <id>25007</id>
    <revision>
      <id>36543</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleFactory|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleFactory (UT3)</title>
    <id>23356</id>
    <revision>
      <id>31139</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleFactory|NavigationPoint|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleFactory TrackTurretBase (UT3)</title>
    <id>23357</id>
    <revision>
      <id>31140</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleFactory_TrackTurretBase|UTVehicleFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleShield (UT3)</title>
    <id>23358</id>
    <revision>
      <id>31141</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleShield|UTWeaponShield|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleSimCar (UT3)</title>
    <id>23359</id>
    <revision>
      <id>31142</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleSimCar|SVehicleSimCar|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleSimChopper (UDK)</title>
    <id>25008</id>
    <revision>
      <id>36544</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleSimChopper|SVehicleSimBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleSimChopper (UT3)</title>
    <id>23360</id>
    <revision>
      <id>31143</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleSimChopper|SVehicleSimBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleWeapon (UDK)</title>
    <id>25009</id>
    <revision>
      <id>36545</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleWeapon|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleWeapon (UT3)</title>
    <id>23361</id>
    <revision>
      <id>31144</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleWeapon|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleWheel (UDK)</title>
    <id>25010</id>
    <revision>
      <id>36546</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleWheel|SVehicleWheel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVehicleWheel (UT3)</title>
    <id>23362</id>
    <revision>
      <id>31145</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVehicleWheel|SVehicleWheel|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVoice (UDK)</title>
    <id>25015</id>
    <revision>
      <id>36551</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVoice|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTVoice (UT3)</title>
    <id>23381</id>
    <revision>
      <id>31164</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTVoice|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWalkerBody (UT3)</title>
    <id>23387</id>
    <revision>
      <id>31170</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWalkerBody|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWalkerBody Scavenger (UT3)</title>
    <id>23388</id>
    <revision>
      <id>31171</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWalkerBody_Scavenger|UTWalkerBody|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWarfareBarricade (UT3)</title>
    <id>23389</id>
    <revision>
      <id>31172</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWarfareBarricade|UTOnslaughtSpecialObjective|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWarfareChildBarricade (UT3)</title>
    <id>23390</id>
    <revision>
      <id>31173</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWarfareChildBarricade|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWaterVolume (UDK)</title>
    <id>25016</id>
    <revision>
      <id>36552</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWaterVolume|WaterVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWaterVolume (UT3)</title>
    <id>23391</id>
    <revision>
      <id>31174</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWaterVolume|WaterVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeap Avril (UT3)</title>
    <id>23400</id>
    <revision>
      <id>31183</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeap_Avril|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeap Redeemer (UT3)</title>
    <id>23401</id>
    <revision>
      <id>31184</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeap_Redeemer|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeap RocketLauncher (UDK)</title>
    <id>25023</id>
    <revision>
      <id>36559</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeap_RocketLauncher|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeap ShockRifleBase (UDK)</title>
    <id>25024</id>
    <revision>
      <id>36560</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeap_ShockRifleBase|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeap Translocator (UT3)</title>
    <id>23402</id>
    <revision>
      <id>31185</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeap_Translocator|UTWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeapon (UDK)</title>
    <id>25017</id>
    <revision>
      <id>36553</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeapon|GameWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeapon (UT3)</title>
    <id>23392</id>
    <revision>
      <id>31175</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeapon|GameWeapon|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponAttachment (UDK)</title>
    <id>25018</id>
    <revision>
      <id>36554</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponAttachment|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponAttachment (UT3)</title>
    <id>23393</id>
    <revision>
      <id>31176</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponAttachment|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponKillMessage (UDK)</title>
    <id>25019</id>
    <revision>
      <id>36555</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponKillMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponKillMessage (UT3)</title>
    <id>23394</id>
    <revision>
      <id>31177</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponKillMessage|UTLocalMessage|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponLocker (UDK)</title>
    <id>25020</id>
    <revision>
      <id>36556</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponLocker|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponLocker (UT3)</title>
    <id>23395</id>
    <revision>
      <id>31178</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponLocker|UTPickupFactory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponPawn (UDK)</title>
    <id>25021</id>
    <revision>
      <id>36557</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponPawn|UTVehicleBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponPawn (UT3)</title>
    <id>23396</id>
    <revision>
      <id>31179</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponPawn|UTVehicleBase|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponPickup (UT2003)</title>
    <id>23397</id>
    <revision>
      <id>31180</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponPickup|WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponPickup (UT2004)</title>
    <id>23398</id>
    <revision>
      <id>31181</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponPickup|WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponShield (UDK)</title>
    <id>25022</id>
    <revision>
      <id>36558</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponShield|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTWeaponShield (UT3)</title>
    <id>23399</id>
    <revision>
      <id>31182</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTWeaponShield|Actor|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UTXRayVolume (UT3)</title>
    <id>24236</id>
    <revision>
      <id>34729</id>
      <timestamp>2009-08-16T10:16:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UTXRayVolume|PhysicsVolume|UE3}}</text>
    </revision>
    <revision>
      <id>34730</id>
      <timestamp>2009-08-16T08:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;UT3 Titan Pack classes</comment>
      <text xml:space="preserve">{{category subclasses|UTXRayVolume|PhysicsVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowBase (RTNP)</title>
    <id>23417</id>
    <revision>
      <id>31200</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowBase|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowBase (U1)</title>
    <id>23418</id>
    <revision>
      <id>31201</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowBase|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowBase (UT)</title>
    <id>23419</id>
    <revision>
      <id>31202</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowBase|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowButton (RTNP)</title>
    <id>23420</id>
    <revision>
      <id>31203</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowButton|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowButton (U1)</title>
    <id>23421</id>
    <revision>
      <id>31204</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowButton|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowButton (UT)</title>
    <id>23422</id>
    <revision>
      <id>31205</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowButton|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowClientWindow (RTNP)</title>
    <id>23423</id>
    <revision>
      <id>31206</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowClientWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowClientWindow (U1)</title>
    <id>23424</id>
    <revision>
      <id>31207</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowClientWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowClientWindow (UT)</title>
    <id>23425</id>
    <revision>
      <id>31208</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowClientWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowConsoleWindow (RTNP)</title>
    <id>23426</id>
    <revision>
      <id>31209</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowConsoleWindow|UWindowFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowConsoleWindow (UT)</title>
    <id>23427</id>
    <revision>
      <id>31210</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowConsoleWindow|UWindowFramedWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDialogClientWindow (RTNP)</title>
    <id>23428</id>
    <revision>
      <id>31211</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDialogClientWindow|UWindowClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDialogClientWindow (U1)</title>
    <id>23429</id>
    <revision>
      <id>31212</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDialogClientWindow|UWindowClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDialogClientWindow (UT)</title>
    <id>23430</id>
    <revision>
      <id>31213</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDialogClientWindow|UWindowClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDialogControl (RTNP)</title>
    <id>23431</id>
    <revision>
      <id>31214</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDialogControl|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDialogControl (U1)</title>
    <id>23432</id>
    <revision>
      <id>31215</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDialogControl|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDialogControl (UT)</title>
    <id>23433</id>
    <revision>
      <id>31216</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDialogControl|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDynamicTextArea (RTNP)</title>
    <id>23434</id>
    <revision>
      <id>31217</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDynamicTextArea|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDynamicTextArea (UT)</title>
    <id>23435</id>
    <revision>
      <id>31218</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDynamicTextArea|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDynamicTextRow (RTNP)</title>
    <id>23436</id>
    <revision>
      <id>31219</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDynamicTextRow|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowDynamicTextRow (UT)</title>
    <id>23437</id>
    <revision>
      <id>31220</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowDynamicTextRow|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowEditBox (UT)</title>
    <id>23438</id>
    <revision>
      <id>31221</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowEditBox|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowFramedWindow (RTNP)</title>
    <id>23439</id>
    <revision>
      <id>31222</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowFramedWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowFramedWindow (U1)</title>
    <id>23440</id>
    <revision>
      <id>31223</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowFramedWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowFramedWindow (UT)</title>
    <id>23441</id>
    <revision>
      <id>31224</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowFramedWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowGrid (RTNP)</title>
    <id>23442</id>
    <revision>
      <id>31225</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowGrid|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowGrid (U1)</title>
    <id>23443</id>
    <revision>
      <id>31226</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowGrid|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowGrid (UT)</title>
    <id>23444</id>
    <revision>
      <id>31227</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowGrid|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowHTMLTextArea (UT)</title>
    <id>23445</id>
    <revision>
      <id>31228</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowHTMLTextArea|UWindowDynamicTextArea|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLabelControl (RTNP)</title>
    <id>23446</id>
    <revision>
      <id>31229</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLabelControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLabelControl (UT)</title>
    <id>23447</id>
    <revision>
      <id>31230</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLabelControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLayoutBase (RTNP)</title>
    <id>23448</id>
    <revision>
      <id>31231</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLayoutBase|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLayoutBase (U1)</title>
    <id>23449</id>
    <revision>
      <id>31232</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLayoutBase|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLayoutBase (UT)</title>
    <id>23450</id>
    <revision>
      <id>31233</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLayoutBase|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowList (RTNP)</title>
    <id>23451</id>
    <revision>
      <id>31234</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowList|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowList (U1)</title>
    <id>23452</id>
    <revision>
      <id>31235</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowList|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowList (UT)</title>
    <id>23453</id>
    <revision>
      <id>31236</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowList|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListBox (RTNP)</title>
    <id>23454</id>
    <revision>
      <id>31237</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListBox|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListBox (UT)</title>
    <id>23455</id>
    <revision>
      <id>31238</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListBox|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListBoxItem (RTNP)</title>
    <id>23456</id>
    <revision>
      <id>31239</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListBoxItem|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListBoxItem (UT)</title>
    <id>23457</id>
    <revision>
      <id>31240</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListBoxItem|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListControl (RTNP)</title>
    <id>23458</id>
    <revision>
      <id>31241</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListControl (U1)</title>
    <id>23459</id>
    <revision>
      <id>31242</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowListControl (UT)</title>
    <id>23460</id>
    <revision>
      <id>31243</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowListControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLookAndFeel (RTNP)</title>
    <id>23461</id>
    <revision>
      <id>31244</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLookAndFeel|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLookAndFeel (U1)</title>
    <id>23462</id>
    <revision>
      <id>31245</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLookAndFeel|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowLookAndFeel (UT)</title>
    <id>23463</id>
    <revision>
      <id>31246</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowLookAndFeel|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowMenuBar (RTNP)</title>
    <id>23464</id>
    <revision>
      <id>31247</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowMenuBar|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowMenuBar (UT)</title>
    <id>23465</id>
    <revision>
      <id>31248</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowMenuBar|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPageControl (RTNP)</title>
    <id>23466</id>
    <revision>
      <id>31249</id>
      <timestamp>2008-05-23T14:39:22Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPageControl|UWindowTabControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPageControl (UT)</title>
    <id>23467</id>
    <revision>
      <id>31250</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPageControl|UWindowTabControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPageWindow (RTNP)</title>
    <id>23468</id>
    <revision>
      <id>31251</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPageWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPageWindow (U1)</title>
    <id>23469</id>
    <revision>
      <id>31252</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPageWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPageWindow (UT)</title>
    <id>23470</id>
    <revision>
      <id>31253</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPageWindow|UWindowDialogClientWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPulldownMenu (RTNP)</title>
    <id>23471</id>
    <revision>
      <id>31254</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPulldownMenu|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPulldownMenu (U1)</title>
    <id>23472</id>
    <revision>
      <id>31255</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPulldownMenu|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowPulldownMenu (UT)</title>
    <id>23473</id>
    <revision>
      <id>31256</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowPulldownMenu|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowRightClickMenu (UT)</title>
    <id>23474</id>
    <revision>
      <id>31257</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowRightClickMenu|UWindowPulldownMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowRootWindow (RTNP)</title>
    <id>23475</id>
    <revision>
      <id>31258</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowRootWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowRootWindow (U1)</title>
    <id>23476</id>
    <revision>
      <id>31259</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowRootWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowRootWindow (UT)</title>
    <id>23477</id>
    <revision>
      <id>31260</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowRootWindow|UWindowWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowScrollingDialogClient (RTNP)</title>
    <id>23478</id>
    <revision>
      <id>31261</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowScrollingDialogClient|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowScrollingDialogClient (UT)</title>
    <id>23479</id>
    <revision>
      <id>31262</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowScrollingDialogClient|UWindowPageWindow|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowSmallButton (RTNP)</title>
    <id>23480</id>
    <revision>
      <id>31263</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowSmallButton|UWindowButton|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowSmallButton (UT)</title>
    <id>23481</id>
    <revision>
      <id>31264</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowSmallButton|UWindowButton|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowSmallCloseButton (RTNP)</title>
    <id>23482</id>
    <revision>
      <id>31265</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowSmallCloseButton|UWindowSmallButton|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowSmallCloseButton (UT)</title>
    <id>23483</id>
    <revision>
      <id>31266</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowSmallCloseButton|UWindowSmallButton|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTabControl (RTNP)</title>
    <id>23484</id>
    <revision>
      <id>31267</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTabControl|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTabControl (U1)</title>
    <id>23485</id>
    <revision>
      <id>31268</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTabControl|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTabControl (UT)</title>
    <id>23486</id>
    <revision>
      <id>31269</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTabControl|UWindowListControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTabControlItem (RTNP)</title>
    <id>23487</id>
    <revision>
      <id>31270</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTabControlItem|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTabControlItem (U1)</title>
    <id>23488</id>
    <revision>
      <id>31271</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTabControlItem|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTabControlItem (UT)</title>
    <id>23489</id>
    <revision>
      <id>31272</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTabControlItem|UWindowList|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTextAreaControl (RTNP)</title>
    <id>23490</id>
    <revision>
      <id>31273</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTextAreaControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTextAreaControl (U1)</title>
    <id>23491</id>
    <revision>
      <id>31274</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTextAreaControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowTextAreaControl (UT)</title>
    <id>23492</id>
    <revision>
      <id>31275</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowTextAreaControl|UWindowDialogControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowURLTextArea (UT)</title>
    <id>23493</id>
    <revision>
      <id>31276</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowURLTextArea|UWindowDynamicTextArea|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowWindow (RTNP)</title>
    <id>23494</id>
    <revision>
      <id>31277</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowWindow|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowWindow (U1)</title>
    <id>23495</id>
    <revision>
      <id>31278</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowWindow|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowWindow (UT)</title>
    <id>23496</id>
    <revision>
      <id>31279</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowWindow|UWindowBase|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UWindowWrappedTextArea (UT)</title>
    <id>23497</id>
    <revision>
      <id>31280</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UWindowWrappedTextArea|UWindowTextAreaControl|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpBeacon (RTNP)</title>
    <id>22897</id>
    <revision>
      <id>30680</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpBeacon|UdpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpBeacon (U1)</title>
    <id>22898</id>
    <revision>
      <id>30681</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpBeacon|UdpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpBeacon (U2XMP)</title>
    <id>22899</id>
    <revision>
      <id>30682</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpBeacon|UdpLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpBeacon (UE2Runtime)</title>
    <id>22900</id>
    <revision>
      <id>30683</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpBeacon|UdpLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpBeacon (UT)</title>
    <id>22901</id>
    <revision>
      <id>30684</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpBeacon|UdpLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpBeacon (UT2003)</title>
    <id>22902</id>
    <revision>
      <id>30685</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpBeacon|UdpLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (RTNP)</title>
    <id>22903</id>
    <revision>
      <id>30686</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (U1)</title>
    <id>22904</id>
    <revision>
      <id>30687</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (U2)</title>
    <id>22905</id>
    <revision>
      <id>30688</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (U2XMP)</title>
    <id>22906</id>
    <revision>
      <id>30689</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (UE2Runtime)</title>
    <id>22907</id>
    <revision>
      <id>30690</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (UT)</title>
    <id>22908</id>
    <revision>
      <id>30691</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (UT2003)</title>
    <id>22909</id>
    <revision>
      <id>30692</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UdpLink (UT2004)</title>
    <id>22910</id>
    <revision>
      <id>30693</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UdpLink|InternetLink|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealChatRoom (UT2004)</title>
    <id>23037</id>
    <revision>
      <id>30820</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealChatRoom|VoiceChatRoom|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealChooseGameMenu (RTNP)</title>
    <id>23038</id>
    <revision>
      <id>30821</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealChooseGameMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealConsole (RTNP)</title>
    <id>23039</id>
    <revision>
      <id>30822</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealConsole|WindowConsole|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealConsole (UT)</title>
    <id>23040</id>
    <revision>
      <id>30823</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealConsole|WindowConsole|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealDMGameOptionsMenu (RTNP)</title>
    <id>23044</id>
    <revision>
      <id>30827</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealDMGameOptionsMenu|UnrealGameOptionsMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealDMGameOptionsMenu (U1)</title>
    <id>23045</id>
    <revision>
      <id>30828</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealDMGameOptionsMenu|UnrealGameOptionsMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealDMGameOptionsMenu (UT)</title>
    <id>23046</id>
    <revision>
      <id>30829</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealDMGameOptionsMenu|UnrealGameOptionsMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealDamageType (RTNP)</title>
    <id>23041</id>
    <revision>
      <id>30824</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealDamageType|DamageType|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealDamageType (U1)</title>
    <id>23042</id>
    <revision>
      <id>30825</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealDamageType|DamageType|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealDamageType (UT)</title>
    <id>23043</id>
    <revision>
      <id>30826</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealDamageType|DamageType|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealEdEngine (UDK)</title>
    <id>24908</id>
    <revision>
      <id>36444</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealEdEngine|EditorEngine|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealEdEngine (UT3)</title>
    <id>23047</id>
    <revision>
      <id>30830</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealEdEngine|EditorEngine|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameInfo (RTNP)</title>
    <id>23048</id>
    <revision>
      <id>30831</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameInfo|GameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameInfo (U1)</title>
    <id>23049</id>
    <revision>
      <id>30832</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameInfo|GameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameInfo (UT)</title>
    <id>23050</id>
    <revision>
      <id>30833</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameInfo|GameInfo|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameMenu (RTNP)</title>
    <id>23051</id>
    <revision>
      <id>30834</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameMenu (U1)</title>
    <id>23052</id>
    <revision>
      <id>30835</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameMenu (UT)</title>
    <id>23053</id>
    <revision>
      <id>30836</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameOptionsMenu (RTNP)</title>
    <id>23054</id>
    <revision>
      <id>30837</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameOptionsMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameOptionsMenu (U1)</title>
    <id>23055</id>
    <revision>
      <id>30838</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameOptionsMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealGameOptionsMenu (UT)</title>
    <id>23056</id>
    <revision>
      <id>30839</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealGameOptionsMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealHUD (RTNP)</title>
    <id>23057</id>
    <revision>
      <id>30840</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealHUD|HUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealHUD (U1)</title>
    <id>23058</id>
    <revision>
      <id>30841</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealHUD|HUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealHUD (UT)</title>
    <id>23059</id>
    <revision>
      <id>30842</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealHUD|HUD|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealIPlayer (RTNP)</title>
    <id>23063</id>
    <revision>
      <id>30846</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealIPlayer|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealIPlayer (U1)</title>
    <id>23064</id>
    <revision>
      <id>30847</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealIPlayer|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealIPlayer (UT)</title>
    <id>23065</id>
    <revision>
      <id>30848</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealIPlayer|PlayerPawn|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealInfoMenu (RTNP)</title>
    <id>23060</id>
    <revision>
      <id>30843</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealInfoMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealInfoMenu (U1)</title>
    <id>23061</id>
    <revision>
      <id>30844</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealInfoMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealInfoMenu (UT)</title>
    <id>23062</id>
    <revision>
      <id>30845</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealInfoMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealLongMenu (RTNP)</title>
    <id>23066</id>
    <revision>
      <id>30849</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealLongMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealLongMenu (U1)</title>
    <id>23067</id>
    <revision>
      <id>30850</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealLongMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealLongMenu (UT)</title>
    <id>23068</id>
    <revision>
      <id>30851</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealLongMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMPGameInfo (UT2003)</title>
    <id>23076</id>
    <revision>
      <id>30859</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMPGameInfo|GameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMPGameInfo (UT2004)</title>
    <id>23077</id>
    <revision>
      <id>30860</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMPGameInfo|GameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMainMenu (RTNP)</title>
    <id>23069</id>
    <revision>
      <id>30852</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMainMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMenu (RTNP)</title>
    <id>23070</id>
    <revision>
      <id>30853</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMenu|Menu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMenu (U1)</title>
    <id>23071</id>
    <revision>
      <id>30854</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMenu|Menu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMenu (UT)</title>
    <id>23072</id>
    <revision>
      <id>30855</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMenu|Menu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMeshMenu (RTNP)</title>
    <id>23073</id>
    <revision>
      <id>30856</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMeshMenu|UnrealPlayerMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMeshMenu (U1)</title>
    <id>23074</id>
    <revision>
      <id>30857</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMeshMenu|UnrealPlayerMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealMeshMenu (UT)</title>
    <id>23075</id>
    <revision>
      <id>30858</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealMeshMenu|UnrealPlayerMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPawn (UT2003)</title>
    <id>23078</id>
    <revision>
      <id>30861</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPawn|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPawn (UT2004)</title>
    <id>23079</id>
    <revision>
      <id>30862</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPawn|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPlayer (UT2003)</title>
    <id>23080</id>
    <revision>
      <id>30863</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPlayer|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPlayer (UT2004)</title>
    <id>23081</id>
    <revision>
      <id>30864</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPlayer|PlayerController|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPlayerMenu (RTNP)</title>
    <id>23082</id>
    <revision>
      <id>30865</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPlayerMenu|UnrealShortMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPlayerMenu (U1)</title>
    <id>23083</id>
    <revision>
      <id>30866</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPlayerMenu|UnrealShortMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealPlayerMenu (UT)</title>
    <id>23084</id>
    <revision>
      <id>30867</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealPlayerMenu|UnrealShortMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealQuitMenu (RTNP)</title>
    <id>23085</id>
    <revision>
      <id>30868</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealQuitMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealScoreBoard (RTNP)</title>
    <id>23086</id>
    <revision>
      <id>30869</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealScoreBoard|ScoreBoard|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealScoreBoard (U1)</title>
    <id>23087</id>
    <revision>
      <id>30870</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealScoreBoard|ScoreBoard|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealScoreBoard (UT)</title>
    <id>23088</id>
    <revision>
      <id>30871</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealScoreBoard|ScoreBoard|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealScriptedSequence (UT2003)</title>
    <id>23089</id>
    <revision>
      <id>30872</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealScriptedSequence|ScriptedSequence|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealScriptedSequence (UT2004)</title>
    <id>23090</id>
    <revision>
      <id>30873</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealScriptedSequence|ScriptedSequence|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealShortMenu (RTNP)</title>
    <id>23091</id>
    <revision>
      <id>30874</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealShortMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealShortMenu (U1)</title>
    <id>23092</id>
    <revision>
      <id>30875</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealShortMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealShortMenu (UT)</title>
    <id>23093</id>
    <revision>
      <id>30876</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealShortMenu|UnrealMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealSlotMenu (RTNP)</title>
    <id>23094</id>
    <revision>
      <id>30877</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealSlotMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealSlotMenu (U1)</title>
    <id>23095</id>
    <revision>
      <id>30878</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealSlotMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealSlotMenu (UT)</title>
    <id>23096</id>
    <revision>
      <id>30879</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealSlotMenu|UnrealLongMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealTeamInfo (UT2003)</title>
    <id>23097</id>
    <revision>
      <id>30880</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealTeamInfo|TeamInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealTeamInfo (UT2004)</title>
    <id>23098</id>
    <revision>
      <id>30881</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealTeamInfo|TeamInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UnrealVoiceReplicationInfo (UT2004)</title>
    <id>23099</id>
    <revision>
      <id>30882</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UnrealVoiceReplicationInfo|VoiceChatReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of UseProxy (U2)</title>
    <id>23110</id>
    <revision>
      <id>30893</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|UseProxy|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vase (RTNP)</title>
    <id>23498</id>
    <revision>
      <id>31281</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vase|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vase (U1)</title>
    <id>23499</id>
    <revision>
      <id>31282</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vase|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vase (UT)</title>
    <id>23500</id>
    <revision>
      <id>31283</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vase|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vehicle (U2)</title>
    <id>23501</id>
    <revision>
      <id>31284</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vehicle|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vehicle (UDK)</title>
    <id>25025</id>
    <revision>
      <id>36561</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vehicle|Pawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vehicle (UT2004)</title>
    <id>23502</id>
    <revision>
      <id>31285</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vehicle|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vehicle (UT3)</title>
    <id>23503</id>
    <revision>
      <id>31286</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vehicle|Pawn|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VehicleDamageType (UT2004)</title>
    <id>23504</id>
    <revision>
      <id>31287</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VehicleDamageType|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VehicleFactory (U2)</title>
    <id>23505</id>
    <revision>
      <id>31288</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VehicleFactory|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VehicleHusk (U2)</title>
    <id>23506</id>
    <revision>
      <id>31289</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VehicleHusk|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vignette (UT2003)</title>
    <id>23507</id>
    <revision>
      <id>31290</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vignette|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Vignette (UT2004)</title>
    <id>23508</id>
    <revision>
      <id>31291</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Vignette|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceBoss (UT)</title>
    <id>23509</id>
    <revision>
      <id>31292</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceBoss|ChallengeVoicePack|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceChatReplicationInfo (UT2004)</title>
    <id>23510</id>
    <revision>
      <id>31293</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceChatReplicationInfo|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceChatRoom (UT2004)</title>
    <id>23511</id>
    <revision>
      <id>31294</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceChatRoom|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceController (RTNP)</title>
    <id>23512</id>
    <revision>
      <id>31295</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceController|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceFemale (UT)</title>
    <id>23513</id>
    <revision>
      <id>31296</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceFemale|ChallengeVoicePack|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceList (U2XMP)</title>
    <id>23514</id>
    <revision>
      <id>31297</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceList|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceMale (UT)</title>
    <id>23515</id>
    <revision>
      <id>31298</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceMale|ChallengeVoicePack|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoiceMaleTwo (UT)</title>
    <id>23516</id>
    <revision>
      <id>31299</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoiceMaleTwo|VoiceMale|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoicePack (U2)</title>
    <id>23517</id>
    <revision>
      <id>31300</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoicePack|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoicePack (UT)</title>
    <id>23518</id>
    <revision>
      <id>31301</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoicePack|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoicePack (UT2003)</title>
    <id>23519</id>
    <revision>
      <id>31302</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoicePack|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VoicePack (UT2004)</title>
    <id>23520</id>
    <revision>
      <id>31303</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VoicePack|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (U2)</title>
    <id>23521</id>
    <revision>
      <id>31304</id>
      <timestamp>2008-05-23T14:39:44Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (U2XMP)</title>
    <id>23522</id>
    <revision>
      <id>31305</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (UDK)</title>
    <id>25026</id>
    <revision>
      <id>36562</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (UE2Runtime)</title>
    <id>23523</id>
    <revision>
      <id>31306</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (UT2003)</title>
    <id>23524</id>
    <revision>
      <id>31307</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (UT2004)</title>
    <id>23525</id>
    <revision>
      <id>31308</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Volume (UT3)</title>
    <id>23526</id>
    <revision>
      <id>31309</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Volume|Brush|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VotingHandler (UT2004)</title>
    <id>23527</id>
    <revision>
      <id>31310</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VotingHandler|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VotingPage (UT2004)</title>
    <id>23528</id>
    <revision>
      <id>31311</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VotingPage|LargeWindow|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of VotingReplicationInfoBase (UT2004)</title>
    <id>23529</id>
    <revision>
      <id>31312</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|VotingReplicationInfoBase|ReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WA SpaceFighter (UT2004)</title>
    <id>23546</id>
    <revision>
      <id>31329</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WA_SpaceFighter|xWeaponAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WallHitEffect (RTNP)</title>
    <id>23530</id>
    <revision>
      <id>31313</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WallHitEffect|SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WallHitEffect (U1)</title>
    <id>23531</id>
    <revision>
      <id>31314</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WallHitEffect|SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WallHitEffect (UT)</title>
    <id>23532</id>
    <revision>
      <id>31315</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WallHitEffect|SpriteSmokePuff|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WallSparks (UT2003)</title>
    <id>23533</id>
    <revision>
      <id>31316</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WallSparks|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WallSparks (UT2004)</title>
    <id>23534</id>
    <revision>
      <id>31317</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WallSparks|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WarExplosion (UT)</title>
    <id>23535</id>
    <revision>
      <id>31318</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WarExplosion|AnimSpriteEffect|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WarShell (UT)</title>
    <id>23536</id>
    <revision>
      <id>31319</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WarShell|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (RTNP)</title>
    <id>23537</id>
    <revision>
      <id>31320</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (U1)</title>
    <id>23538</id>
    <revision>
      <id>31321</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (U2)</title>
    <id>23539</id>
    <revision>
      <id>31322</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (U2XMP)</title>
    <id>23540</id>
    <revision>
      <id>31323</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (UE2Runtime)</title>
    <id>23541</id>
    <revision>
      <id>31324</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (UT)</title>
    <id>23542</id>
    <revision>
      <id>31325</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (UT2003)</title>
    <id>23543</id>
    <revision>
      <id>31326</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterTexture (UT2004)</title>
    <id>23544</id>
    <revision>
      <id>31327</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterTexture|FractalTexture|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterVolume (UDK)</title>
    <id>25027</id>
    <revision>
      <id>36563</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterVolume|PhysicsVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WaterVolume (UT3)</title>
    <id>23545</id>
    <revision>
      <id>31328</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WaterVolume|PhysicsVolume|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (RTNP)</title>
    <id>23547</id>
    <revision>
      <id>31330</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (U1)</title>
    <id>23548</id>
    <revision>
      <id>31331</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (U2)</title>
    <id>23549</id>
    <revision>
      <id>31332</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (U2XMP)</title>
    <id>23550</id>
    <revision>
      <id>31333</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (UDK)</title>
    <id>25028</id>
    <revision>
      <id>36564</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (UT)</title>
    <id>23551</id>
    <revision>
      <id>31334</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (UT2003)</title>
    <id>23552</id>
    <revision>
      <id>31335</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (UT2004)</title>
    <id>23553</id>
    <revision>
      <id>31336</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon (UT3)</title>
    <id>23554</id>
    <revision>
      <id>31337</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon|Inventory|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Weapon SpaceFighter (UT2004)</title>
    <id>23584</id>
    <revision>
      <id>31367</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Weapon_SpaceFighter|Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponAttachment (U2)</title>
    <id>23556</id>
    <revision>
      <id>31339</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponAttachment|InventoryAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponAttachment (UT2003)</title>
    <id>23557</id>
    <revision>
      <id>31340</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponAttachment|InventoryAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponAttachment (UT2004)</title>
    <id>23558</id>
    <revision>
      <id>31341</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponAttachment|InventoryAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponDamageType (UT2003)</title>
    <id>23559</id>
    <revision>
      <id>31342</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponDamageType|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponDamageType (UT2004)</title>
    <id>23560</id>
    <revision>
      <id>31343</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponDamageType|DamageType|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponDataProvider (UDK)</title>
    <id>25029</id>
    <revision>
      <id>36565</id>
      <timestamp>2009-11-06T18:47:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponDataProvider|InventoryDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponDataProvider (UT3)</title>
    <id>23561</id>
    <revision>
      <id>31344</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponDataProvider|InventoryDataProvider|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponFire (UT2003)</title>
    <id>23563</id>
    <revision>
      <id>31346</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponFire|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponFire (UT2004)</title>
    <id>23564</id>
    <revision>
      <id>31347</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponFire|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvAssaultRifle (U2XMP)</title>
    <id>23566</id>
    <revision>
      <id>31349</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvAssaultRifle|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvDispersion (U2XMP)</title>
    <id>23567</id>
    <revision>
      <id>31350</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvDispersion|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvEnergyRifle (U2XMP)</title>
    <id>23568</id>
    <revision>
      <id>31351</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvEnergyRifle|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvFlameThrower (U2XMP)</title>
    <id>23569</id>
    <revision>
      <id>31352</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvFlameThrower|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvGrenadeLauncher (U2XMP)</title>
    <id>23570</id>
    <revision>
      <id>31353</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvGrenadeLauncher|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvLaserRifle (U2XMP)</title>
    <id>23571</id>
    <revision>
      <id>31354</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvLaserRifle|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvPistol (U2XMP)</title>
    <id>23572</id>
    <revision>
      <id>31355</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvPistol|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvRocketLauncher (U2XMP)</title>
    <id>23573</id>
    <revision>
      <id>31356</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvRocketLauncher|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvShotgun (U2XMP)</title>
    <id>23574</id>
    <revision>
      <id>31357</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvShotgun|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponInvSniperRifle (U2XMP)</title>
    <id>23575</id>
    <revision>
      <id>31358</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponInvSniperRifle|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponLight (RTNP)</title>
    <id>23576</id>
    <revision>
      <id>31359</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponLight|Light|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponLight (U1)</title>
    <id>23577</id>
    <revision>
      <id>31360</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponLight|Light|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponLight (UT)</title>
    <id>23578</id>
    <revision>
      <id>31361</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponLight|Light|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponPickup (U2XMP)</title>
    <id>23579</id>
    <revision>
      <id>31362</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponPickup (UT2003)</title>
    <id>23580</id>
    <revision>
      <id>31363</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WeaponPickup (UT2004)</title>
    <id>23581</id>
    <revision>
      <id>31364</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WeaponPickup|Pickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebAdmin (UT3)</title>
    <id>23585</id>
    <revision>
      <id>31368</id>
      <timestamp>2008-05-18T15:24:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebAdmin|WebApplication|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebAdminSettings (UT3)</title>
    <id>23586</id>
    <revision>
      <id>31369</id>
      <timestamp>2008-05-18T15:24:34Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebAdminSettings|Settings|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (U2)</title>
    <id>23587</id>
    <revision>
      <id>31370</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (U2XMP)</title>
    <id>23588</id>
    <revision>
      <id>31371</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (UDK)</title>
    <id>25030</id>
    <revision>
      <id>36566</id>
      <timestamp>2009-11-06T18:47:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (UE2Runtime)</title>
    <id>23589</id>
    <revision>
      <id>31372</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (UT)</title>
    <id>23590</id>
    <revision>
      <id>31373</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (UT2003)</title>
    <id>23591</id>
    <revision>
      <id>31374</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (UT2004)</title>
    <id>23592</id>
    <revision>
      <id>31375</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebApplication (UT3)</title>
    <id>23593</id>
    <revision>
      <id>31376</id>
      <timestamp>2008-05-23T14:40:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebApplication|Object|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebConnection (UT3)</title>
    <id>23594</id>
    <revision>
      <id>31377</id>
      <timestamp>2008-05-18T15:24:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebConnection|TcpLink|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebSkin (UT2003)</title>
    <id>23595</id>
    <revision>
      <id>31378</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebSkin|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WebSkin (UT2004)</title>
    <id>23596</id>
    <revision>
      <id>31379</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WebSkin|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WillowWhisp (UT2003)</title>
    <id>23597</id>
    <revision>
      <id>31380</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WillowWhisp|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WillowWhisp (UT2004)</title>
    <id>23598</id>
    <revision>
      <id>31381</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WillowWhisp|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WindDirectionalSourceComponent (UDK)</title>
    <id>28693</id>
    <revision>
      <id>40636</id>
      <timestamp>2010-01-17T12:24:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WindDirectionalSourceComponent|ActorComponent|UE3}}</text>
    </revision>
    <revision>
      <id>40637</id>
      <timestamp>2010-01-17T12:36:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category subclasses|WindDirectionalSourceComponent|ActorComponent|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WindowConsole (RTNP)</title>
    <id>23599</id>
    <revision>
      <id>31382</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WindowConsole|Console|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WindowConsole (U1)</title>
    <id>23600</id>
    <revision>
      <id>31383</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WindowConsole|Console|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WindowConsole (UT)</title>
    <id>23601</id>
    <revision>
      <id>31384</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WindowConsole|Console|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Wire (RTNP)</title>
    <id>23602</id>
    <revision>
      <id>31385</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Wire|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Wire (U1)</title>
    <id>23603</id>
    <revision>
      <id>31386</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Wire|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of Wire (UT)</title>
    <id>23604</id>
    <revision>
      <id>31387</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|Wire|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WoodenBox (RTNP)</title>
    <id>23605</id>
    <revision>
      <id>31388</id>
      <timestamp>2008-05-23T14:39:19Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WoodenBox|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WoodenBox (U1)</title>
    <id>23606</id>
    <revision>
      <id>31389</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WoodenBox|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of WoodenBox (UT)</title>
    <id>23607</id>
    <revision>
      <id>31390</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|WoodenBox|Decoration|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPGame (U2)</title>
    <id>23635</id>
    <revision>
      <id>31418</id>
      <timestamp>2008-05-23T14:39:45Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPGame|GameInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPPickup (U2XMP)</title>
    <id>23636</id>
    <revision>
      <id>31419</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPPickup|WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPSVehicle (U2)</title>
    <id>23638</id>
    <revision>
      <id>31421</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPSVehicle|SCar|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPStationaryTurret (U2)</title>
    <id>23637</id>
    <revision>
      <id>31420</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPStationaryTurret|StationaryTurret|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicle (U2)</title>
    <id>23639</id>
    <revision>
      <id>31422</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicle|KCar|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicleBarrel (U2)</title>
    <id>23640</id>
    <revision>
      <id>31423</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicleBarrel|Pawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicleCab (U2)</title>
    <id>23641</id>
    <revision>
      <id>31424</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicleCab|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicleMessage (U2)</title>
    <id>23642</id>
    <revision>
      <id>31425</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicleMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicleTire (U2)</title>
    <id>23643</id>
    <revision>
      <id>31426</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicleTire|KTire|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicleTrigger (U2)</title>
    <id>23644</id>
    <revision>
      <id>31427</id>
      <timestamp>2008-05-23T14:39:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicleTrigger|ScriptedSequence|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of XMPVehicleTurret (U2)</title>
    <id>23645</id>
    <revision>
      <id>31428</id>
      <timestamp>2008-05-23T14:39:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|XMPVehicleTurret|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of YesNoMenu (RTNP)</title>
    <id>23675</id>
    <revision>
      <id>31458</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|YesNoMenu|UnrealInfoMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of YesNoMenu (U1)</title>
    <id>23676</id>
    <revision>
      <id>31459</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|YesNoMenu|UnrealInfoMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of YesNoMenu (UT)</title>
    <id>23677</id>
    <revision>
      <id>31460</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|YesNoMenu|UnrealInfoMenu|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (RTNP)</title>
    <id>23678</id>
    <revision>
      <id>31461</id>
      <timestamp>2008-05-23T14:39:20Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (U1)</title>
    <id>23679</id>
    <revision>
      <id>31462</id>
      <timestamp>2008-05-23T14:39:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (U2)</title>
    <id>23680</id>
    <revision>
      <id>31463</id>
      <timestamp>2008-05-23T14:39:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (U2XMP)</title>
    <id>23681</id>
    <revision>
      <id>31464</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (UDK)</title>
    <id>25031</id>
    <revision>
      <id>36567</id>
      <timestamp>2009-11-06T18:47:08Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (UE2Runtime)</title>
    <id>23682</id>
    <revision>
      <id>31465</id>
      <timestamp>2008-05-23T14:39:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (UT)</title>
    <id>23683</id>
    <revision>
      <id>31466</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (UT2003)</title>
    <id>23684</id>
    <revision>
      <id>31467</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (UT2004)</title>
    <id>23685</id>
    <revision>
      <id>31468</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ZoneInfo (UT3)</title>
    <id>23686</id>
    <revision>
      <id>31469</id>
      <timestamp>2008-05-23T14:40:42Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ZoneInfo|Info|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ammoGrenade (U2XMP)</title>
    <id>20956</id>
    <revision>
      <id>28739</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ammoGrenade|U2AmmoPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of ammoInvGrenade (U2XMP)</title>
    <id>20957</id>
    <revision>
      <id>28740</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|ammoInvGrenade|U2Ammo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of flakshell (UT2003)</title>
    <id>21426</id>
    <revision>
      <id>29209</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|flakshell|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of flakshell (UT2004)</title>
    <id>21427</id>
    <revision>
      <id>29210</id>
      <timestamp>2008-05-23T14:40:05Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|flakshell|Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of moComboBox (UT2004)</title>
    <id>21984</id>
    <revision>
      <id>29767</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|moComboBox|GUIMenuOption|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of moEditBox (UT2004)</title>
    <id>21991</id>
    <revision>
      <id>29774</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|moEditBox|GUIMenuOption|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of moNumericEdit (UT2004)</title>
    <id>21997</id>
    <revision>
      <id>29780</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|moNumericEdit|GUIMenuOption|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of pclLightSmoke (UT2003)</title>
    <id>22157</id>
    <revision>
      <id>29940</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|pclLightSmoke|pclSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of pclLightSmoke (UT2004)</title>
    <id>22158</id>
    <revision>
      <id>29941</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|pclLightSmoke|pclSmoke|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of pclMuzFlashA (UT2003)</title>
    <id>22159</id>
    <revision>
      <id>29942</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|pclMuzFlashA|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of pclMuzFlashA (UT2004)</title>
    <id>22160</id>
    <revision>
      <id>29943</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|pclMuzFlashA|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of pclSmoke (UT2003)</title>
    <id>22161</id>
    <revision>
      <id>29944</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|pclSmoke|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of pclSmoke (UT2004)</title>
    <id>22162</id>
    <revision>
      <id>29945</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|pclSmoke|xEmitter|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileAssaultExplosion (U2XMP)</title>
    <id>22246</id>
    <revision>
      <id>30029</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileAssaultExplosion|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileAssaultRound (U2XMP)</title>
    <id>22247</id>
    <revision>
      <id>30030</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileAssaultRound|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileAssaultRoundAlt (U2XMP)</title>
    <id>22248</id>
    <revision>
      <id>30031</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileAssaultRoundAlt|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileDispersion (U2XMP)</title>
    <id>22249</id>
    <revision>
      <id>30032</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileDispersion|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileDispersionAlt (U2XMP)</title>
    <id>22250</id>
    <revision>
      <id>30033</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileDispersionAlt|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileDispersionAlt2 (U2XMP)</title>
    <id>22251</id>
    <revision>
      <id>30034</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileDispersionAlt2|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileGrenade (U2XMP)</title>
    <id>22254</id>
    <revision>
      <id>30037</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileGrenade|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileHeavyRocket (U2XMP)</title>
    <id>22255</id>
    <revision>
      <id>30038</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileHeavyRocket|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileLeech (U2XMP)</title>
    <id>22256</id>
    <revision>
      <id>30039</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileLeech|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileShotgun (U2XMP)</title>
    <id>22257</id>
    <revision>
      <id>30040</id>
      <timestamp>2008-05-23T14:39:39Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileShotgun|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of projectileTakkra (U2XMP)</title>
    <id>22259</id>
    <revision>
      <id>30042</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|projectileTakkra|U2Projectile|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of rocket (RTNP)</title>
    <id>22324</id>
    <revision>
      <id>30107</id>
      <timestamp>2008-05-23T14:39:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|rocket|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of rocket (U1)</title>
    <id>22325</id>
    <revision>
      <id>30108</id>
      <timestamp>2008-05-23T14:39:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|rocket|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of rocket (UT)</title>
    <id>22326</id>
    <revision>
      <id>30109</id>
      <timestamp>2008-05-23T14:39:40Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|rocket|Projectile|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of u2m1 (U2XMP)</title>
    <id>22832</id>
    <revision>
      <id>30615</id>
      <timestamp>2008-05-23T14:39:35Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|u2m1|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of uTeamBanner (UT2003)</title>
    <id>23198</id>
    <revision>
      <id>30981</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|uTeamBanner|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of uTeamBanner (UT2004)</title>
    <id>23199</id>
    <revision>
      <id>30982</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|uTeamBanner|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of weaponAssaultRifle (U2XMP)</title>
    <id>23555</id>
    <revision>
      <id>31338</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|weaponAssaultRifle|U2WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of weaponDispersion (U2XMP)</title>
    <id>23562</id>
    <revision>
      <id>31345</id>
      <timestamp>2008-05-23T14:39:36Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|weaponDispersion|U2WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of weaponGrenadeLauncher (U2XMP)</title>
    <id>23565</id>
    <revision>
      <id>31348</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|weaponGrenadeLauncher|U2WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of weaponRocketLauncher (U2XMP)</title>
    <id>23582</id>
    <revision>
      <id>31365</id>
      <timestamp>2008-05-23T14:39:37Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|weaponRocketLauncher|U2WeaponPickup|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of weaponTurretMounted (U2XMP)</title>
    <id>23583</id>
    <revision>
      <id>31366</id>
      <timestamp>2008-05-23T14:39:38Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|weaponTurretMounted|U2Weapon|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xAdminBase (UT2003)</title>
    <id>23608</id>
    <revision>
      <id>31391</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xAdminBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xAdminBase (UT2004)</title>
    <id>23609</id>
    <revision>
      <id>31392</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xAdminBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xAdminConfigBase (UT2003)</title>
    <id>23610</id>
    <revision>
      <id>31393</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xAdminConfigBase|xAdminBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xAdminConfigBase (UT2004)</title>
    <id>23611</id>
    <revision>
      <id>31394</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xAdminConfigBase|xAdminBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xBot (UT2003)</title>
    <id>23612</id>
    <revision>
      <id>31395</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xBot|Bot|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xBot (UT2004)</title>
    <id>23613</id>
    <revision>
      <id>31396</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xBot|Bot|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xCTFGame (UT2004)</title>
    <id>23614</id>
    <revision>
      <id>31397</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xCTFGame|CTFGame|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDMRoster (UT2003)</title>
    <id>23619</id>
    <revision>
      <id>31402</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDMRoster|DMRoster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDMRoster (UT2004)</title>
    <id>23620</id>
    <revision>
      <id>31403</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDMRoster|DMRoster|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDOMMonitor (UT2003)</title>
    <id>23623</id>
    <revision>
      <id>31406</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDOMMonitor|xMonitor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDOMMonitor (UT2004)</title>
    <id>23624</id>
    <revision>
      <id>31407</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDOMMonitor|xMonitor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDeathMatch (UT2003)</title>
    <id>23615</id>
    <revision>
      <id>31398</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDeathMatch|DeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDeathMatch (UT2004)</title>
    <id>23616</id>
    <revision>
      <id>31399</id>
      <timestamp>2008-05-23T14:40:01Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDeathMatch|DeathMatch|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDeathMessage (UT2003)</title>
    <id>23617</id>
    <revision>
      <id>31400</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDeathMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDeathMessage (UT2004)</title>
    <id>23618</id>
    <revision>
      <id>31401</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDeathMessage|LocalMessage|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDomLetter (UT2003)</title>
    <id>23621</id>
    <revision>
      <id>31404</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDomLetter|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDomLetter (UT2004)</title>
    <id>23622</id>
    <revision>
      <id>31405</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDomLetter|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDomPoint (UT2003)</title>
    <id>23625</id>
    <revision>
      <id>31408</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDomPoint|DominationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xDomPoint (UT2004)</title>
    <id>23626</id>
    <revision>
      <id>31409</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xDomPoint|DominationPoint|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xEmitter (UT2003)</title>
    <id>23627</id>
    <revision>
      <id>31410</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xEmitter|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xEmitter (UT2004)</title>
    <id>23628</id>
    <revision>
      <id>31411</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xEmitter|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xHeavyWallHitEffect (UT2003)</title>
    <id>23629</id>
    <revision>
      <id>31412</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xHeavyWallHitEffect|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xHeavyWallHitEffect (UT2004)</title>
    <id>23630</id>
    <revision>
      <id>31413</id>
      <timestamp>2008-05-23T14:40:02Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xHeavyWallHitEffect|Effects|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xIntroPawn (UT2003)</title>
    <id>23631</id>
    <revision>
      <id>31414</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xIntroPawn|UnrealPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xIntroPawn (UT2004)</title>
    <id>23632</id>
    <revision>
      <id>31415</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xIntroPawn|UnrealPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xMonitor (UT2003)</title>
    <id>23633</id>
    <revision>
      <id>31416</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xMonitor|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xMonitor (UT2004)</title>
    <id>23634</id>
    <revision>
      <id>31417</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xMonitor|Decoration|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPawn (UT2003)</title>
    <id>23646</id>
    <revision>
      <id>31429</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPawn|UnrealPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPawn (UT2004)</title>
    <id>23647</id>
    <revision>
      <id>31430</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPawn|UnrealPawn|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPawnGibGroup (UT2003)</title>
    <id>23648</id>
    <revision>
      <id>31431</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPawnGibGroup|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPawnGibGroup (UT2004)</title>
    <id>23649</id>
    <revision>
      <id>31432</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPawnGibGroup|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPawnSoundGroup (UT2003)</title>
    <id>23650</id>
    <revision>
      <id>31433</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPawnSoundGroup|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPawnSoundGroup (UT2004)</title>
    <id>23651</id>
    <revision>
      <id>31434</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPawnSoundGroup|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPickUpBase (UT2003)</title>
    <id>23652</id>
    <revision>
      <id>31435</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPickUpBase|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPickUpBase (UT2004)</title>
    <id>23653</id>
    <revision>
      <id>31436</id>
      <timestamp>2008-05-23T14:39:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPickUpBase|Actor|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPlayer (UT2004)</title>
    <id>23654</id>
    <revision>
      <id>31437</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPlayer|UnrealPlayer|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPlayerReplicationInfo (UT2004)</title>
    <id>23655</id>
    <revision>
      <id>31438</id>
      <timestamp>2008-05-23T14:40:00Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPlayerReplicationInfo|TeamPlayerReplicationInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPrivilegeBase (UT2003)</title>
    <id>23656</id>
    <revision>
      <id>31439</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPrivilegeBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xPrivilegeBase (UT2004)</title>
    <id>23657</id>
    <revision>
      <id>31440</id>
      <timestamp>2008-05-23T14:40:04Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xPrivilegeBase|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xRealCTFBase (UT2003)</title>
    <id>23658</id>
    <revision>
      <id>31441</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xRealCTFBase|CTFBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xRealCTFBase (UT2004)</title>
    <id>23659</id>
    <revision>
      <id>31442</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xRealCTFBase|CTFBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xScorch (UT2003)</title>
    <id>23660</id>
    <revision>
      <id>31443</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xScorch|Projector|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xScorch (UT2004)</title>
    <id>23661</id>
    <revision>
      <id>31444</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xScorch|Projector|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xTeamGame (UT2003)</title>
    <id>23662</id>
    <revision>
      <id>31445</id>
      <timestamp>2008-05-23T14:39:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xTeamGame|TeamGame|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xTeamGame (UT2004)</title>
    <id>23663</id>
    <revision>
      <id>31446</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xTeamGame|TeamGame|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xTeamRoster (UT2003)</title>
    <id>23664</id>
    <revision>
      <id>31447</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xTeamRoster|UnrealTeamInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xTeamRoster (UT2004)</title>
    <id>23665</id>
    <revision>
      <id>31448</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xTeamRoster|UnrealTeamInfo|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xUtil (UT2003)</title>
    <id>23666</id>
    <revision>
      <id>31449</id>
      <timestamp>2008-05-23T14:39:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xUtil|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xUtil (UT2004)</title>
    <id>23667</id>
    <revision>
      <id>31450</id>
      <timestamp>2008-05-23T14:40:07Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xUtil|Object|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xVoicePack (UT2003)</title>
    <id>23668</id>
    <revision>
      <id>31451</id>
      <timestamp>2008-05-23T14:39:23Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xVoicePack|TeamVoicePack|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xVoicePack (UT2004)</title>
    <id>23669</id>
    <revision>
      <id>31452</id>
      <timestamp>2008-05-23T14:39:59Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xVoicePack|TeamVoicePack|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xWeaponAttachment (UT2003)</title>
    <id>23670</id>
    <revision>
      <id>31453</id>
      <timestamp>2008-05-23T14:39:24Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xWeaponAttachment|WeaponAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xWeaponAttachment (UT2004)</title>
    <id>23671</id>
    <revision>
      <id>31454</id>
      <timestamp>2008-05-23T14:39:58Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xWeaponAttachment|WeaponAttachment|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xWeaponBase (UT2004)</title>
    <id>23672</id>
    <revision>
      <id>31455</id>
      <timestamp>2008-05-23T14:40:06Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xWeaponBase|xPickUpBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xWebQueryHandler (UT2003)</title>
    <id>23673</id>
    <revision>
      <id>31456</id>
      <timestamp>2008-05-23T14:39:25Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xWebQueryHandler|xAdminBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subclasses of xWebQueryHandler (UT2004)</title>
    <id>23674</id>
    <revision>
      <id>31457</id>
      <timestamp>2008-05-23T14:40:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subclasses|xWebQueryHandler|xAdminBase|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subinterfaces of Interface (UDK)</title>
    <id>28213</id>
    <revision>
      <id>39756</id>
      <timestamp>2009-11-07T08:07:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subinterfaces|Interface||UE3}}'</comment>
      <text xml:space="preserve">{{category subinterfaces|Interface||UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subinterfaces of Interface (UT3)</title>
    <id>23954</id>
    <revision>
      <id>33379</id>
      <timestamp>2008-11-21T18:44:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category subinterfaces|Interface||UE3}}</comment>
      <text xml:space="preserve">{{category subinterfaces|Interface||UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subinterfaces of Interface NavMeshPathObject (UDK)</title>
    <id>28232</id>
    <revision>
      <id>39848</id>
      <timestamp>2009-11-14T10:40:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subinterfaces|Interface_NavMeshPathObject||UE3}}'</comment>
      <text xml:space="preserve">{{category subinterfaces|Interface_NavMeshPathObject||UE3}}</text>
    </revision>
    <revision>
      <id>40638</id>
      <timestamp>2010-01-17T12:24:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subinterfaces|Interface_NavMeshPathObject||UE3}}</text>
    </revision>
    <revision>
      <id>40639</id>
      <timestamp>2010-01-17T12:36:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category subinterfaces|Interface_NavMeshPathObject||UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subinterfaces of UIDataStoreSubscriber (UDK)</title>
    <id>28233</id>
    <revision>
      <id>39849</id>
      <timestamp>2009-11-14T10:41:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{category subinterfaces|UIDataStoreSubscriber||UE3}}'</comment>
      <text xml:space="preserve">{{category subinterfaces|UIDataStoreSubscriber||UE3}}</text>
    </revision>
    <revision>
      <id>40640</id>
      <timestamp>2010-01-17T12:24:14Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category subinterfaces|UIDataStoreSubscriber||UE3}}</text>
    </revision>
    <revision>
      <id>40641</id>
      <timestamp>2010-01-17T12:36:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision:&amp;#32;class descriptions for UDK January update (part 1)</comment>
      <text xml:space="preserve">{{category subinterfaces|UIDataStoreSubscriber||UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Subinterfaces of UIDataStoreSubscriber (UT3)</title>
    <id>23955</id>
    <revision>
      <id>33380</id>
      <timestamp>2008-11-21T18:44:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category subinterfaces|UIDataStoreSubscriber|Interface|UE3}}</comment>
      <text xml:space="preserve">{{category subinterfaces|UIDataStoreSubscriber|Interface|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:Template categories</title>
    <id>266</id>
    <revision>
      <id>995</id>
      <timestamp>2008-03-20T12:59:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories#Meta categories|meta category]] contains all [[Help:Templates|template]] categories.  [[Category:Categories]]</comment>
      <text xml:space="preserve">This [[Project:Categories#Meta categories|meta category]] contains all [[Help:Templates|template]] categories.

[[Category:Categories]]</text>
    </revision>
    <revision>
      <id>1016</id>
      <timestamp>2008-03-20T13:16:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories#Meta categories|meta category]] contains all [[Help:Templates|template]] categories.

[[Category:Categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Tutorials</title>
    <id>258</id>
    <revision>
      <id>976</id>
      <timestamp>2008-03-20T08:49:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains a list of all tutorials created on {{SITENAME}} so far.</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all tutorials created on {{SITENAME}} so far.</text>
    </revision>
    <revision>
      <id>979</id>
      <timestamp>2008-03-20T09:57:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Category:Article categories</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all tutorials created on {{SITENAME}} so far.

[[Category:Article categories]]</text>
    </revision>
    <revision>
      <id>1008</id>
      <timestamp>2008-03-20T13:15:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains a list of all tutorials created on {{SITENAME}} so far.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Category:U1-specific classes</title>
    <id>5266</id>
    <revision>
      <id>12962</id>
      <timestamp>2008-05-17T16:10:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|U1|UE1}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U1-specific enums</title>
    <id>5267</id>
    <revision>
      <id>12963</id>
      <timestamp>2008-05-17T16:10:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|U1}}</text>
    </revision>
    <revision>
      <id>33365</id>
      <timestamp>2008-11-17T11:50:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game enums|U1|Unreal}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U1-specific structs</title>
    <id>5268</id>
    <revision>
      <id>12964</id>
      <timestamp>2008-05-17T16:10:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|U1}}</text>
    </revision>
    <revision>
      <id>33366</id>
      <timestamp>2008-11-17T11:50:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game structs|U1|Unreal}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U2-specific classes</title>
    <id>5147</id>
    <revision>
      <id>12663</id>
      <timestamp>2008-05-17T07:57:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|U2|UE2|toc=yes}}</comment>
      <text xml:space="preserve">{{category game classes|U2|UE2|toc=yes}}</text>
    </revision>
    <revision>
      <id>12965</id>
      <timestamp>2008-05-17T16:11:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|U2|UE2}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U2-specific enums</title>
    <id>5269</id>
    <revision>
      <id>12966</id>
      <timestamp>2008-05-17T16:11:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U2-specific structs</title>
    <id>5270</id>
    <revision>
      <id>12967</id>
      <timestamp>2008-05-17T16:11:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|U2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U2XMP-specific classes</title>
    <id>5271</id>
    <revision>
      <id>12968</id>
      <timestamp>2008-05-17T16:11:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|U2XMP|UE2}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U2XMP-specific enums</title>
    <id>5272</id>
    <revision>
      <id>12969</id>
      <timestamp>2008-05-17T16:11:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:U2XMP-specific structs</title>
    <id>5273</id>
    <revision>
      <id>12970</id>
      <timestamp>2008-05-17T16:11:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|U2XMP}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UDK-specific classes</title>
    <id>25032</id>
    <revision>
      <id>36568</id>
      <timestamp>2009-11-06T18:47:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UDK|UE3}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UDK-specific enums</title>
    <id>25033</id>
    <revision>
      <id>36569</id>
      <timestamp>2009-11-06T18:47:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UDK-specific interfaces</title>
    <id>25034</id>
    <revision>
      <id>36570</id>
      <timestamp>2009-11-06T18:47:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game interfaces|UDK|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UDK-specific structs</title>
    <id>25035</id>
    <revision>
      <id>36571</id>
      <timestamp>2009-11-06T18:47:27Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UDK}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE1-specific classes</title>
    <id>5134</id>
    <revision>
      <id>12627</id>
      <timestamp>2008-05-13T14:33:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UE1}}</comment>
      <text xml:space="preserve">{{category game classes|UE1}}</text>
    </revision>
    <revision>
      <id>12971</id>
      <timestamp>2008-05-17T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT|UE1}}</text>
    </revision>
    <revision>
      <id>28641</id>
      <timestamp>2008-05-17T22:49:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>squished minor buglet</comment>
      <text xml:space="preserve">{{category game classes|UE1}}</text>
    </revision>
    <revision>
      <id>31470</id>
      <timestamp>2008-05-23T14:40:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UE1}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE2-specific classes</title>
    <id>4812</id>
    <revision>
      <id>10921</id>
      <timestamp>2008-04-08T12:19:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UE2|Unreal Engine 2}}</comment>
      <text xml:space="preserve">{{category game classes|UE2|Unreal Engine 2}}</text>
    </revision>
    <revision>
      <id>12628</id>
      <timestamp>2008-05-13T14:33:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game classes|UE2}}</text>
    </revision>
    <revision>
      <id>12972</id>
      <timestamp>2008-05-17T16:11:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT2004|UE2}}</text>
    </revision>
    <revision>
      <id>28639</id>
      <timestamp>2008-05-17T22:47:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>whoops :-)</comment>
      <text xml:space="preserve">{{category game classes|UE2}}</text>
    </revision>
    <revision>
      <id>31471</id>
      <timestamp>2008-05-23T14:40:43Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UE2}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE2Runtime-specific classes</title>
    <id>5004</id>
    <revision>
      <id>11407</id>
      <timestamp>2008-04-20T09:32:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UE2Runtime|Unreal Engine 2 Runtime}} [[Category:UE2-specific classes| ]]</comment>
      <text xml:space="preserve">{{category game classes|UE2Runtime|Unreal Engine 2 Runtime}}
[[Category:UE2-specific classes| ]]</text>
    </revision>
    <revision>
      <id>12198</id>
      <timestamp>2008-05-13T11:41:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UE2Runtime|Unreal Engine 2 Runtime|UE2}}</text>
    </revision>
    <revision>
      <id>12199</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UE2Runtime|Unreal Engine 2 Runtime|UE2}}</text>
    </revision>
    <revision>
      <id>12570</id>
      <timestamp>2008-05-13T14:00:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UE2Runtime|UE2}}</text>
    </revision>
    <revision>
      <id>12571</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UE2Runtime|UE2}}</text>
    </revision>
    <revision>
      <id>12973</id>
      <timestamp>2008-05-17T16:10:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UE2Runtime|UE2}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE2Runtime-specific enums</title>
    <id>5019</id>
    <revision>
      <id>11431</id>
      <timestamp>2008-04-20T14:09:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game enums|UE2Runtime|Unreal Engine 2 Runtime}}</comment>
      <text xml:space="preserve">{{category game enums|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12200</id>
      <timestamp>2008-05-13T11:41:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12201</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12572</id>
      <timestamp>2008-05-13T14:00:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12573</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12974</id>
      <timestamp>2008-05-17T16:10:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE2Runtime-specific structs</title>
    <id>5020</id>
    <revision>
      <id>11432</id>
      <timestamp>2008-04-20T14:09:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game structs|UE2Runtime|Unreal Engine 2 Runtime}}</comment>
      <text xml:space="preserve">{{category game structs|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12202</id>
      <timestamp>2008-05-13T11:41:03Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12203</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UE2Runtime|Unreal Engine 2 Runtime}}</text>
    </revision>
    <revision>
      <id>12574</id>
      <timestamp>2008-05-13T14:00:26Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12575</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UE2Runtime}}</text>
    </revision>
    <revision>
      <id>12975</id>
      <timestamp>2008-05-17T16:10:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|UE2Runtime}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE3-specific classes</title>
    <id>5130</id>
    <revision>
      <id>12621</id>
      <timestamp>2008-05-13T14:30:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UE3}}</comment>
      <text xml:space="preserve">{{category game classes|UE3}}</text>
    </revision>
    <revision>
      <id>12976</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT3|UE3}}</text>
    </revision>
    <revision>
      <id>28640</id>
      <timestamp>2008-05-17T22:48:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>oops</comment>
      <text xml:space="preserve">{{category game classes|UE3}}</text>
    </revision>
    <revision>
      <id>31472</id>
      <timestamp>2008-05-23T14:40:57Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UE3-specific interfaces</title>
    <id>5133</id>
    <revision>
      <id>12624</id>
      <timestamp>2008-05-13T14:31:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game interfaces|UE3}}</comment>
      <text xml:space="preserve">{{category game interfaces|UE3}}</text>
    </revision>
    <revision>
      <id>12977</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game interfaces|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT-specific classes</title>
    <id>4771</id>
    <revision>
      <id>10768</id>
      <timestamp>2008-04-04T14:13:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT|Unreal Tournament}}</comment>
      <text xml:space="preserve">{{category game classes|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12204</id>
      <timestamp>2008-05-13T11:42:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT|Unreal Tournament|UE1}}</text>
    </revision>
    <revision>
      <id>12205</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT|Unreal Tournament|UE1}}</text>
    </revision>
    <revision>
      <id>12576</id>
      <timestamp>2008-05-13T14:00:32Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT|UE1}}</text>
    </revision>
    <revision>
      <id>12577</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT|UE1}}</text>
    </revision>
    <revision>
      <id>12978</id>
      <timestamp>2008-05-17T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT|UE1}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT-specific enums</title>
    <id>5011</id>
    <revision>
      <id>11423</id>
      <timestamp>2008-04-20T14:05:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game enums|UT|Unreal Tournament}}</comment>
      <text xml:space="preserve">{{category game enums|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12206</id>
      <timestamp>2008-05-13T11:42:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12207</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12578</id>
      <timestamp>2008-05-13T14:00:32Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT}}</text>
    </revision>
    <revision>
      <id>12579</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT}}</text>
    </revision>
    <revision>
      <id>12979</id>
      <timestamp>2008-05-17T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT-specific structs</title>
    <id>5012</id>
    <revision>
      <id>11424</id>
      <timestamp>2008-04-20T14:06:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game structs|UT|Unreal Tournament}}</comment>
      <text xml:space="preserve">{{category game structs|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12208</id>
      <timestamp>2008-05-13T11:42:16Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12209</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT|Unreal Tournament}}</text>
    </revision>
    <revision>
      <id>12580</id>
      <timestamp>2008-05-13T14:00:32Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT}}</text>
    </revision>
    <revision>
      <id>12581</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT}}</text>
    </revision>
    <revision>
      <id>12980</id>
      <timestamp>2008-05-17T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|UT}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT2003-specific classes</title>
    <id>4772</id>
    <revision>
      <id>10769</id>
      <timestamp>2008-04-04T14:13:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT2003|Unreal Tournament 2003}}</comment>
      <text xml:space="preserve">{{category game classes|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>10922</id>
      <timestamp>2008-04-08T12:19:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:UE2-specific classes]]</comment>
      <text xml:space="preserve">{{category game classes|UT2003|Unreal Tournament 2003}}
[[Category:UE2-specific classes| ]]</text>
    </revision>
    <revision>
      <id>12210</id>
      <timestamp>2008-05-13T11:42:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT2003|Unreal Tournament 2003|UE2}}</text>
    </revision>
    <revision>
      <id>12211</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT2003|Unreal Tournament 2003|UE2}}</text>
    </revision>
    <revision>
      <id>12582</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT2003|UE2}}</text>
    </revision>
    <revision>
      <id>12583</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT2003|UE2}}</text>
    </revision>
    <revision>
      <id>12981</id>
      <timestamp>2008-05-17T16:11:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT2003|UE2}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT2003-specific enums</title>
    <id>5014</id>
    <revision>
      <id>11426</id>
      <timestamp>2008-04-20T14:07:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game enums|UT2003|Unreal Tournament 2003}}</comment>
      <text xml:space="preserve">{{category game enums|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12212</id>
      <timestamp>2008-05-13T11:42:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12213</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12584</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT2003}}</text>
    </revision>
    <revision>
      <id>12585</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT2003}}</text>
    </revision>
    <revision>
      <id>12982</id>
      <timestamp>2008-05-17T16:11:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT2003-specific structs</title>
    <id>5013</id>
    <revision>
      <id>11425</id>
      <timestamp>2008-04-20T14:07:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game structs|UT2003|Unreal Tournament 2003}}</comment>
      <text xml:space="preserve">{{category game structs|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12214</id>
      <timestamp>2008-05-13T11:42:21Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12215</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT2003|Unreal Tournament 2003}}</text>
    </revision>
    <revision>
      <id>12586</id>
      <timestamp>2008-05-13T14:00:41Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT2003}}</text>
    </revision>
    <revision>
      <id>12587</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT2003}}</text>
    </revision>
    <revision>
      <id>12983</id>
      <timestamp>2008-05-17T16:11:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|UT2003}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT2004-specific classes</title>
    <id>4773</id>
    <revision>
      <id>10770</id>
      <timestamp>2008-04-04T14:13:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game classes|UT2004|Unreal Tournament 2004}}</comment>
      <text xml:space="preserve">{{category game classes|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>10923</id>
      <timestamp>2008-04-08T12:20:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>also added to [[Category:UE2-specific classes]]</comment>
      <text xml:space="preserve">{{category game classes|UT2004|Unreal Tournament 2004}}
[[Category:UE2-specific classes| ]]</text>
    </revision>
    <revision>
      <id>12216</id>
      <timestamp>2008-05-13T11:43:29Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT2004|Unreal Tournament 2004|UE2}}</text>
    </revision>
    <revision>
      <id>12217</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT2004|Unreal Tournament 2004|UE2}}</text>
    </revision>
    <revision>
      <id>12588</id>
      <timestamp>2008-05-13T14:00:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT2004|UE2}}</text>
    </revision>
    <revision>
      <id>12589</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT2004|UE2}}</text>
    </revision>
    <revision>
      <id>12984</id>
      <timestamp>2008-05-17T16:11:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT2004|UE2}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT2004-specific enums</title>
    <id>5015</id>
    <revision>
      <id>11427</id>
      <timestamp>2008-04-20T14:07:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game enums|UT2004|Unreal Tournament 2004}}</comment>
      <text xml:space="preserve">{{category game enums|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12218</id>
      <timestamp>2008-05-13T11:43:29Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12219</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12590</id>
      <timestamp>2008-05-13T14:00:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT2004}}</text>
    </revision>
    <revision>
      <id>12591</id>
      <timestamp>2008-05-13T14:18:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT2004}}</text>
    </revision>
    <revision>
      <id>12985</id>
      <timestamp>2008-05-17T16:11:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT2004-specific structs</title>
    <id>5016</id>
    <revision>
      <id>11428</id>
      <timestamp>2008-04-20T14:07:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game structs|UT2004|Unreal Tournament 2004}}</comment>
      <text xml:space="preserve">{{category game structs|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12220</id>
      <timestamp>2008-05-13T11:43:29Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12221</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT2004|Unreal Tournament 2004}}</text>
    </revision>
    <revision>
      <id>12592</id>
      <timestamp>2008-05-13T14:00:51Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT2004}}</text>
    </revision>
    <revision>
      <id>12593</id>
      <timestamp>2008-05-13T14:18:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT2004}}</text>
    </revision>
    <revision>
      <id>12986</id>
      <timestamp>2008-05-17T16:11:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|UT2004}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT3-specific classes</title>
    <id>228</id>
    <revision>
      <id>903</id>
      <timestamp>2008-03-16T09:22:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all [[UT3]]-specific [[UnrealScript]] [[class]]es and [[interface]]s.  [[Category:Classes by game]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all [[UT3]]-specific [[UnrealScript]] [[class]]es and [[interface]]s.

[[Category:Classes by game]]</text>
    </revision>
    <revision>
      <id>907</id>
      <timestamp>2008-03-16T10:26:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{category game classes|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12222</id>
      <timestamp>2008-05-13T12:39:18Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT3|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12223</id>
      <timestamp>2008-05-13T10:48:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT3|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12594</id>
      <timestamp>2008-05-13T14:00:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game classes|UT3|UE3}}</text>
    </revision>
    <revision>
      <id>12595</id>
      <timestamp>2008-05-13T14:18:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game classes|UT3|UE3}}</text>
    </revision>
    <revision>
      <id>12987</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game classes|UT3|UE3}}
{{categoryTOC}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT3-specific enums</title>
    <id>5017</id>
    <revision>
      <id>11429</id>
      <timestamp>2008-04-20T14:08:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game enums|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category game enums|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12224</id>
      <timestamp>2008-05-13T12:39:18Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12225</id>
      <timestamp>2008-05-13T10:48:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12596</id>
      <timestamp>2008-05-13T14:00:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game enums|UT3}}</text>
    </revision>
    <revision>
      <id>12597</id>
      <timestamp>2008-05-13T14:18:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game enums|UT3}}</text>
    </revision>
    <revision>
      <id>12988</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game enums|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT3-specific interfaces</title>
    <id>231</id>
    <revision>
      <id>908</id>
      <timestamp>2008-03-16T10:27:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game interfaces|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category game interfaces|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12226</id>
      <timestamp>2008-05-13T12:39:18Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game interfaces|UT3|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12227</id>
      <timestamp>2008-05-13T10:48:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game interfaces|UT3|Unreal Tournament 3|UE3}}</text>
    </revision>
    <revision>
      <id>12598</id>
      <timestamp>2008-05-13T14:00:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game interfaces|UT3|UE3}}</text>
    </revision>
    <revision>
      <id>12599</id>
      <timestamp>2008-05-13T14:18:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game interfaces|UT3|UE3}}</text>
    </revision>
    <revision>
      <id>12989</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game interfaces|UT3|UE3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UT3-specific structs</title>
    <id>5018</id>
    <revision>
      <id>11430</id>
      <timestamp>2008-04-20T14:08:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: {{category game structs|UT3|Unreal Tournament 3}}</comment>
      <text xml:space="preserve">{{category game structs|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12228</id>
      <timestamp>2008-05-13T12:39:18Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12229</id>
      <timestamp>2008-05-13T10:48:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT3|Unreal Tournament 3}}</text>
    </revision>
    <revision>
      <id>12600</id>
      <timestamp>2008-05-13T14:00:47Z</timestamp>
      <contributor>
        <ip />
      </contributor>
      <text xml:space="preserve">{{category game structs|UT3}}</text>
    </revision>
    <revision>
      <id>12601</id>
      <timestamp>2008-05-13T14:18:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision</comment>
      <text xml:space="preserve">{{category game structs|UT3}}</text>
    </revision>
    <revision>
      <id>12990</id>
      <timestamp>2008-05-17T16:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Auto-generated page</comment>
      <text xml:space="preserve">{{category game structs|UT3}}</text>
    </revision>
  </page>
  <page>
    <title>Category:UnrealScript reference</title>
    <id>4828</id>
    <revision>
      <id>10972</id>
      <timestamp>2008-04-11T20:41:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains all articles of the Unreal Wiki's [[UnrealScript reference]].  [[Category:Programming articles]]</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains all articles of the Unreal Wiki's [[UnrealScript reference]].

[[Category:Programming articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:UnrealScript utils</title>
    <id>28961</id>
    <revision>
      <id>43264</id>
      <timestamp>2010-05-17T08:29:02Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>Created page with 'This [[Project:Categories|category]] contains articles that are related to [[UnrealScript Utils]].  [[Category:Article categories| {{PAGENAME}}]]'</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains articles that are related to [[UnrealScript Utils]].

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43732</id>
      <timestamp>2010-07-22T01:01:35Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This [[Project:Categories|category]] contains useful [[UnrealScript]] utility articles.

[[Category:Article categories| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44266</id>
      <timestamp>2011-02-08T21:42:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moved to programming articles category</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains useful [[UnrealScript]] utility articles.

[[Category:Programming articles| {{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44268</id>
      <timestamp>2011-02-08T21:44:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed custom sort order for programming articles</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains useful [[UnrealScript]] utility articles.

[[Category:Programming articles]]</text>
    </revision>
  </page>
  <page>
    <title>Category:Utility templates</title>
    <id>273</id>
    <revision>
      <id>1030</id>
      <timestamp>2008-03-20T13:31:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: This [[Project:Categories|category]] contains [[Help:Templates|templates]] that provide hard-to-implement or otherwise required features for other templates.  [[Category:Template categorie...</comment>
      <text xml:space="preserve">This [[Project:Categories|category]] contains [[Help:Templates|templates]] that provide hard-to-implement or otherwise required features for other templates.

[[Category:Template categories| {{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Bezier.png</title>
    <id>24040</id>
    <revision>
      <id>33678</id>
      <timestamp>2008-12-15T12:15:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Delete.png</title>
    <id>24038</id>
    <revision>
      <id>33676</id>
      <timestamp>2008-12-15T12:15:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Extrude.png</title>
    <id>24045</id>
    <revision>
      <id>33683</id>
      <timestamp>2008-12-15T12:16:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-ExtrudeBevel.png</title>
    <id>24047</id>
    <revision>
      <id>33685</id>
      <timestamp>2008-12-15T12:16:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-ExtrudePoint.png</title>
    <id>24046</id>
    <revision>
      <id>33684</id>
      <timestamp>2008-12-15T12:16:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-FlipH.png</title>
    <id>24034</id>
    <revision>
      <id>33672</id>
      <timestamp>2008-12-15T12:15:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-FlipV.png</title>
    <id>24033</id>
    <revision>
      <id>33671</id>
      <timestamp>2008-12-15T12:14:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Linear.png</title>
    <id>24039</id>
    <revision>
      <id>33677</id>
      <timestamp>2008-12-15T12:15:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-New.png</title>
    <id>24028</id>
    <revision>
      <id>33666</id>
      <timestamp>2008-12-15T12:14:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Open.png</title>
    <id>24029</id>
    <revision>
      <id>33667</id>
      <timestamp>2008-12-15T12:14:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Revolve.png</title>
    <id>24044</id>
    <revision>
      <id>33682</id>
      <timestamp>2008-12-15T12:16:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Rotate45.png</title>
    <id>24032</id>
    <revision>
      <id>33670</id>
      <timestamp>2008-12-15T12:14:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Rotate90.png</title>
    <id>24031</id>
    <revision>
      <id>33669</id>
      <timestamp>2008-12-15T12:14:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Save.png</title>
    <id>24030</id>
    <revision>
      <id>33668</id>
      <timestamp>2008-12-15T12:14:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-ScaleDown.png</title>
    <id>24036</id>
    <revision>
      <id>33674</id>
      <timestamp>2008-12-15T12:15:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-ScaleUp.png</title>
    <id>24035</id>
    <revision>
      <id>33673</id>
      <timestamp>2008-12-15T12:15:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Sheet.png</title>
    <id>24043</id>
    <revision>
      <id>33681</id>
      <timestamp>2008-12-15T12:16:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-Split.png</title>
    <id>24037</id>
    <revision>
      <id>33675</id>
      <timestamp>2008-12-15T12:15:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-ZoomIn.png</title>
    <id>24041</id>
    <revision>
      <id>33679</id>
      <timestamp>2008-12-15T12:15:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:2DShapeEditor-Toolbar-ZoomOut.png</title>
    <id>24042</id>
    <revision>
      <id>33680</id>
      <timestamp>2008-12-15T12:16:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:AntiPortal-NoOcclusion.png</title>
    <id>24015</id>
    <revision>
      <id>33631</id>
      <timestamp>2008-12-13T19:29:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>An example of an [[anti portal]] surface ''not'' occluding an object behind it.</comment>
      <text xml:space="preserve">== Summary ==
An example of an [[anti portal]] surface ''not'' occluding an object behind it.
== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:AntiPortal-Occlusion.png</title>
    <id>24010</id>
    <revision>
      <id>33623</id>
      <timestamp>2008-12-13T14:16:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Example of [[anti portal]] occlusion:

The lower anti portal occludes the rectangle, the upper anti portal occludes the triangle. The circle is occluded by neither anti portal even though it is in the combined occlusion area of them.</comment>
      <text xml:space="preserve">== Summary ==
Example of [[anti portal]] occlusion:

The lower anti portal occludes the rectangle, the upper anti portal occludes the triangle. The circle is occluded by neither anti portal even though it is in the combined occlusion area of them.
== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Brushsinking-example-avaris.jpg</title>
    <id>23991</id>
    <revision>
      <id>33466</id>
      <timestamp>2008-11-30T12:19:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>An example of [[brush sinking]] on CTF-Avaris.

The textured view has been blended with the texture usage and brush wireframe views to make the BSP construction more obvious.</comment>
      <text xml:space="preserve">== Summary ==
An example of [[brush sinking]] on CTF-Avaris.

The textured view has been blended with the texture usage and brush wireframe views to make the BSP construction more obvious.
== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Brushsinking-example-mazon.jpg</title>
    <id>23994</id>
    <revision>
      <id>33471</id>
      <timestamp>2008-11-30T14:33:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Trim on AS-Mazon created with a subtractive brush technique similar to [[brush sinking]].</comment>
      <text xml:space="preserve">== Summary ==
Trim on AS-Mazon created with a subtractive brush technique similar to [[brush sinking]].
== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Brushsinking-example-simple.jpg</title>
    <id>23992</id>
    <revision>
      <id>33469</id>
      <timestamp>2008-11-30T13:41:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>A simple [[brush sinking]] example.</comment>
      <text xml:space="preserve">== Summary ==
A simple [[brush sinking]] example.
== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Button uscript.png</title>
    <id>150</id>
    <revision>
      <id>494</id>
      <timestamp>2008-03-02T21:46:22Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{CC-by-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Cc-deed-icon-by.png</title>
    <id>292</id>
    <revision>
      <id>1054</id>
      <timestamp>2008-03-20T15:40:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{CC-by-sa-3.0}}</text>
    </revision>
    <revision>
      <id>1057</id>
      <timestamp>2008-03-20T15:41:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">== Licensing ==
{| align=&quot;center&quot;  style=&quot;clear:both; width:95%; background-color:#f8f8f8; border:2px solid #e0e0e0;  padding:5px;&quot;
|-
| style=&quot;text-align:center;&quot; | [[Image:cc-somerights.png|Creative Commons]]&lt;br/&gt;[[Image:cc-deed-icon-by.png|Attribution]][[Image:cc-deed-icon-sa.png|Share alike]]
| align=&quot;center&quot; | ''This file is licensed under the [[wp:Creative Commons|Creative&amp;nbsp;Commons]] [http://creativecommons.org/licenses/by-sa/3.0/ Attribution&amp;nbsp;ShareAlike&amp;nbsp;3.0&amp;nbsp;Unported]&amp;nbsp;License. In short: you are free to share and make derivative works of the file under the conditions that you appropriately attribute it, and that you distribute it only under a license [http://creativecommons.org/compatiblelicenses compatible] with this one.
|}
[[Category:CC-BY-SA images|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1058</id>
      <timestamp>2008-03-20T15:42:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>/* Licensing */</comment>
      <text xml:space="preserve">== Licensing ==
{| align=&quot;center&quot;  style=&quot;clear:both; width:95%; background-color:#f8f8f8; border:2px solid #e0e0e0;  padding:5px;&quot;
|-
| style=&quot;text-align:center;&quot; | [[Image:cc-somerights.png|Creative Commons]]&lt;br/&gt;[[Image:cc-deed-icon-by.png|Attribution]]
| align=&quot;center&quot; | ''This file is licensed under the [[wp:Creative Commons|Creative&amp;nbsp;Commons]] [http://creativecommons.org/licenses/by/2.5/ Attribution&amp;nbsp;2.5&amp;nbsp;Unported]&amp;nbsp;License. In short: you are free to share and make derivative works of the file under the conditions that you appropriately attribute it, and that you distribute it only under a license [http://creativecommons.org/compatiblelicenses compatible] with this one.
|}
[[Category:CC-BY images|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1059</id>
      <timestamp>2008-03-20T15:44:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Licensing */ from link</comment>
      <text xml:space="preserve">== Licensing ==
{| align=&quot;center&quot;  style=&quot;clear:both; width:95%; background-color:#f8f8f8; border:2px solid #e0e0e0;  padding:5px;&quot;
|-
| style=&quot;text-align:center;&quot; | [[Image:cc-somerights.png|Creative Commons]]&lt;br/&gt;[[Image:cc-deed-icon-by.png|Attribution]]
| align=&quot;center&quot; | ''This file is licensed under the [[wp:Creative Commons|Creative&amp;nbsp;Commons]] [http://creativecommons.org/licenses/by/2.5/ Attribution&amp;nbsp;2.5&amp;nbsp;Unported]&amp;nbsp;License. In short: you are free to share and make derivative works of the file under the conditions that you appropriately attribute it, and that you distribute it only under a license [http://creativecommons.org/compatiblelicenses compatible] with this one.
|}
'''From:''' http://commons.wikimedia.org/wiki/Image:Cc-by_new_white.svg
[[Category:CC-BY images|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>File:Cc-deed-icon-nc.png</title>
    <id>293</id>
    <revision>
      <id>1055</id>
      <timestamp>2008-03-20T15:40:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{CC-by-sa-3.0}}</text>
    </revision>
    <revision>
      <id>1060</id>
      <timestamp>2008-03-20T15:45:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>/* Licensing */ special license</comment>
      <text xml:space="preserve">== Licensing ==
{| align=&quot;center&quot;  style=&quot;clear:both; width:95%; background-color:#f8f8f8; border:2px solid #e0e0e0;  padding:5px;&quot;
|-
| style=&quot;text-align:center;&quot; | [[Image:cc-somerights.png|Creative Commons]]&lt;br/&gt;[[Image:cc-deed-icon-by.png|Attribution]]
| align=&quot;center&quot; | ''This file is licensed under the [[wp:Creative Commons|Creative&amp;nbsp;Commons]] [http://creativecommons.org/licenses/by/2.5/ Attribution&amp;nbsp;2.5&amp;nbsp;Unported]&amp;nbsp;License. In short: you are free to share and make derivative works of the file under the conditions that you appropriately attribute it, and that you distribute it only under a license [http://creativecommons.org/compatiblelicenses compatible] with this one.
|}
'''From:''' http://commons.wikimedia.org/wiki/Image:Cc-nc_white.svg
[[Category:CC-BY images|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>File:Cc-deed-icon-sa.png</title>
    <id>294</id>
    <revision>
      <id>1056</id>
      <timestamp>2008-03-20T15:40:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{CC-by-sa-3.0}}</text>
    </revision>
    <revision>
      <id>1061</id>
      <timestamp>2008-03-20T15:45:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>/* Licensing */ special license</comment>
      <text xml:space="preserve">== Licensing ==
{| align=&quot;center&quot;  style=&quot;clear:both; width:95%; background-color:#f8f8f8; border:2px solid #e0e0e0;  padding:5px;&quot;
|-
| style=&quot;text-align:center;&quot; | [[Image:cc-somerights.png|Creative Commons]]&lt;br/&gt;[[Image:cc-deed-icon-by.png|Attribution]]
| align=&quot;center&quot; | ''This file is licensed under the [[wp:Creative Commons|Creative&amp;nbsp;Commons]] [http://creativecommons.org/licenses/by/2.5/ Attribution&amp;nbsp;2.5&amp;nbsp;Unported]&amp;nbsp;License. In short: you are free to share and make derivative works of the file under the conditions that you appropriately attribute it, and that you distribute it only under a license [http://creativecommons.org/compatiblelicenses compatible] with this one.
|}
'''From:''' http://commons.wikimedia.org/wiki/Image:Cc-sa_white.svg
[[Category:CC-BY images|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>File:Cc-somerights.png</title>
    <id>291</id>
    <revision>
      <id>1053</id>
      <timestamp>2008-03-20T15:36:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:ConTEXT UI.gif</title>
    <id>28913</id>
    <revision>
      <id>42877</id>
      <timestamp>2010-04-10T18:34:58Z</timestamp>
      <contributor>
        <username>Jrubzjeknf</username>
        <id>55</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Copyleft.png</title>
    <id>282</id>
    <revision>
      <id>1043</id>
      <timestamp>2008-03-20T14:54:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[wp:Copyleft]] symbol from [http://commons.wikimedia.org/wiki/Image:GreenCopyleft.svg Wikimedia Commons]</comment>
      <text xml:space="preserve">== Summary ==
[[wp:Copyleft]] symbol from [http://commons.wikimedia.org/wiki/Image:GreenCopyleft.svg Wikimedia Commons]
== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>1044</id>
      <timestamp>2008-03-20T14:54:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Summary */</comment>
      <text xml:space="preserve">== Summary ==
[[wp:Copyleft|Copyleft]] symbol from [http://commons.wikimedia.org/wiki/Image:GreenCopyleft.svg Wikimedia Commons]

== Licensing ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:Cour.jpg</title>
    <id>23757</id>
    <revision>
      <id>32953</id>
      <timestamp>2008-09-05T02:18:09Z</timestamp>
      <contributor>
        <username>16mentaltempest</username>
        <id>323</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:DbMutator GameX-Flow.gif</title>
    <id>24051</id>
    <revision>
      <id>33709</id>
      <timestamp>2008-12-16T16:23:02Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
    <revision>
      <id>33718</id>
      <timestamp>2008-12-18T16:11:37Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:DbMutator GameX-Flow.gif]]&quot;</comment>
      <text xml:space="preserve">== Licensing ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Delete.png</title>
    <id>185</id>
    <revision>
      <id>699</id>
      <timestamp>2008-03-07T10:04:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Delete icon based on an image from [http://openclipart.org/media/files/dagobert83/1513 openclipart.org]</comment>
      <text xml:space="preserve">== Summary ==
Delete icon based on an image from [http://openclipart.org/media/files/dagobert83/1513 openclipart.org]
== Licensing ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:DeleteFiles.png</title>
    <id>29216</id>
    <revision>
      <id>44162</id>
      <timestamp>2010-12-11T12:56:44Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>A Kismet sequence I put together for my tutorial about the UltimateSaveSystem.</comment>
      <text xml:space="preserve">== Beschreibung ==
A Kismet sequence I put together for my tutorial about the UltimateSaveSystem.
== Licensing: ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:Disambig.png</title>
    <id>5155</id>
    <revision>
      <id>12684</id>
      <timestamp>2008-05-17T11:51:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Disambiguation icon for [[Template:Disambig]] based on http://commons.wikimedia.org/wiki/Image:Disambig_gray.svg</comment>
      <text xml:space="preserve">== Summary ==
Disambiguation icon for [[Template:Disambig]] based on http://commons.wikimedia.org/wiki/Image:Disambig_gray.svg
== Licensing ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:Example.jpg</title>
    <id>77</id>
    <revision>
      <id>174</id>
      <timestamp>2007-10-15T20:34:28Z</timestamp>
      <contributor>
        <ip>HappyDog</ip>
      </contributor>
      <minor/>
      <comment>PD +cat</comment>
      <text xml:space="preserve">----
Note: This image is used as the example image when you use the edit toolbar (English default installation of MediaWiki).
----
* '''Description:''' Sunflowers in Fargo, North Dakota, U.S.
* '''Source:''' [http://www.ars.usda.gov/is/graphics/photos/k5751-1.htm www.ars.usda.gov] (cropped and reworked a bit)
* '''Author:''' Bruce Fritz
* '''Licensing:''' ''This image is in the '''public domain''' because it contains materials that originally came from the Agricultural Research Service, the research agency of the United States Department of Agriculture.''

{{PD}}
[[Category:Documentation examples]]</text>
    </revision>
    <revision>
      <id>175</id>
      <timestamp>2008-02-18T18:42:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">----
Note: This image is used as the example image when you use the edit toolbar (English default installation of MediaWiki).
----
* '''Description:''' Sunflowers in Fargo, North Dakota, U.S.
* '''Source:''' [http://www.ars.usda.gov/is/graphics/photos/k5751-1.htm www.ars.usda.gov] (cropped and reworked a bit)
* '''Author:''' Bruce Fritz
* '''Licensing:''' ''This image is in the '''public domain''' because it contains materials that originally came from the Agricultural Research Service, the research agency of the United States Department of Agriculture.''

{{PD}}
[[Category:Documentation examples]]</text>
    </revision>
    <revision>
      <id>224</id>
      <timestamp>2008-02-18T20:21:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded &quot;[[Image:Example.jpg]]&quot;</comment>
      <text xml:space="preserve">----
Note: This image is used as the example image when you use the edit toolbar (English default installation of MediaWiki).
----
* '''Description:''' Sunflowers in Fargo, North Dakota, U.S.
* '''Source:''' [http://www.ars.usda.gov/is/graphics/photos/k5751-1.htm www.ars.usda.gov] (cropped and reworked a bit)
* '''Author:''' Bruce Fritz
* '''Licensing:''' ''This image is in the '''public domain''' because it contains materials that originally came from the Agricultural Research Service, the research agency of the United States Department of Agriculture.''

{{PD}}
[[Category:Documentation examples]]</text>
    </revision>
  </page>
  <page>
    <title>File:FastPacedMutatorExample.PNG</title>
    <id>29005</id>
    <revision>
      <id>43456</id>
      <timestamp>2010-06-13T02:13:38Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>The source code example is a picture to avoid people from copy pasting the example rather than reading the tutorial.</comment>
      <text xml:space="preserve">== Summary ==
The source code example is a picture to avoid people from copy pasting the example rather than reading the tutorial.
== Licensing: ==
{{CC-by-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:GT Arena--.jpg</title>
    <id>23752</id>
    <revision>
      <id>32940</id>
      <timestamp>2008-09-04T03:33:53Z</timestamp>
      <contributor>
        <username>16mentaltempest</username>
        <id>323</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:GT Arena--Screenshot.jpg</title>
    <id>23753</id>
    <revision>
      <id>32943</id>
      <timestamp>2008-09-04T03:36:36Z</timestamp>
      <contributor>
        <username>16mentaltempest</username>
        <id>323</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:HauteurBaseScreenshot.jpg</title>
    <id>23754</id>
    <revision>
      <id>32945</id>
      <timestamp>2008-09-04T03:37:27Z</timestamp>
      <contributor>
        <username>16mentaltempest</username>
        <id>323</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:HauteurCenterScreenshot.jpg</title>
    <id>23755</id>
    <revision>
      <id>32947</id>
      <timestamp>2008-09-04T03:38:15Z</timestamp>
      <contributor>
        <username>16mentaltempest</username>
        <id>323</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Icon-RTNP.png</title>
    <id>5151</id>
    <revision>
      <id>12680</id>
      <timestamp>2008-05-17T10:38:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[RTNP]] icon for [[Template:Infobox class]].</comment>
      <text xml:space="preserve">[[RTNP]] icon for [[Template:Infobox class]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-U1.png</title>
    <id>5150</id>
    <revision>
      <id>12678</id>
      <timestamp>2008-05-17T10:34:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Unreal 1]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[Unreal 1]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
    <revision>
      <id>12679</id>
      <timestamp>2008-05-17T10:37:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:Icon-U1.png]]&quot;</comment>
      <text xml:space="preserve">[[Unreal 1]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-U2.png</title>
    <id>5149</id>
    <revision>
      <id>12677</id>
      <timestamp>2008-05-17T10:34:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Unreal 2]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[Unreal 2]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-U2XMP.png</title>
    <id>5156</id>
    <revision>
      <id>12687</id>
      <timestamp>2008-05-17T13:22:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[U2XMP]] icon for [[Template:Infobox class]].</comment>
      <text xml:space="preserve">[[U2XMP]] icon for [[Template:Infobox class]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UDK.png</title>
    <id>24870</id>
    <revision>
      <id>36406</id>
      <timestamp>2009-11-06T18:32:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UDK]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[UDK]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UE1.png</title>
    <id>4809</id>
    <revision>
      <id>10913</id>
      <timestamp>2008-04-08T12:12:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Unreal Engine 1]] icon for [[Template:Infobox class]]</comment>
      <text xml:space="preserve">[[Unreal Engine 1]] icon for [[Template:Infobox class]]</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UE2.png</title>
    <id>4808</id>
    <revision>
      <id>10911</id>
      <timestamp>2008-04-08T12:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Unreal Engine 2]] icon for [[Template:Infobox class]]</comment>
      <text xml:space="preserve">[[Unreal Engine 2]] icon for [[Template:Infobox class]]</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UE2Runtime.png</title>
    <id>4850</id>
    <revision>
      <id>11076</id>
      <timestamp>2008-04-18T16:45:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UE2Runtime]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[UE2Runtime]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UE3.png</title>
    <id>4810</id>
    <revision>
      <id>10914</id>
      <timestamp>2008-04-08T12:12:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Unreal Engine 3]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]]</comment>
      <text xml:space="preserve">[[Unreal Engine 3]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]]</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UT.png</title>
    <id>254</id>
    <revision>
      <id>964</id>
      <timestamp>2008-03-19T00:04:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UT]] icon for [[Template:Infobox class]].</comment>
      <text xml:space="preserve">[[UT]] icon for [[Template:Infobox class]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UT2003.png</title>
    <id>252</id>
    <revision>
      <id>962</id>
      <timestamp>2008-03-19T00:01:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UT2003]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[UT2003]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UT2004.png</title>
    <id>253</id>
    <revision>
      <id>963</id>
      <timestamp>2008-03-19T00:01:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UT2004]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[UT2004]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
    <revision>
      <id>11727</id>
      <timestamp>2008-05-05T12:01:59Z</timestamp>
      <contributor>
        <username>Azrael</username>
        <id>455</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">[[Unreal Tournament 2004|UT2004]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:Icon-UT3.png</title>
    <id>251</id>
    <revision>
      <id>961</id>
      <timestamp>2008-03-18T23:58:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UT3]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</comment>
      <text xml:space="preserve">[[UT3]] icon for [[Template:Infobox class]] and [[Template:Infobox interface]].</text>
    </revision>
  </page>
  <page>
    <title>File:InterWiki-Liandri.png</title>
    <id>209</id>
    <revision>
      <id>812</id>
      <timestamp>2008-03-11T19:54:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Help:Interwiki linking|Interwiki link]] icon for [[liandri:|Liandri Archives]].</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for [[liandri:|Liandri Archives]].</text>
    </revision>
    <revision>
      <id>857</id>
      <timestamp>2008-03-13T09:53:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:InterWiki-Liandri.png]]&quot;</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for [[liandri:|Liandri Archives]].</text>
    </revision>
  </page>
  <page>
    <title>File:InterWiki-UAWiki.png</title>
    <id>210</id>
    <revision>
      <id>827</id>
      <timestamp>2008-03-11T22:20:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Help:Interwiki linking|Interwiki link]] icon for the [[uawiki:|Unreal Admin Wiki]].</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for the [[uawiki:|Unreal Admin Wiki]].</text>
    </revision>
    <revision>
      <id>829</id>
      <timestamp>2008-03-11T22:21:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for the [[uadmin:|Unreal Admin Wiki]].</text>
    </revision>
    <revision>
      <id>858</id>
      <timestamp>2008-03-13T09:53:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:InterWiki-UAWiki.png]]&quot;</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for the [[uadmin:|Unreal Admin Wiki]].</text>
    </revision>
  </page>
  <page>
    <title>File:InterWiki-UDN.png</title>
    <id>24148</id>
    <revision>
      <id>34374</id>
      <timestamp>2009-05-01T08:05:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Help:Interwiki linking|Interwiki link]] icon for the [[udn2:|UDN]]</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for the [[udn2:|UDN]]</text>
    </revision>
  </page>
  <page>
    <title>File:InterWiki-Wikipedia.png</title>
    <id>208</id>
    <revision>
      <id>808</id>
      <timestamp>2008-03-11T19:47:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Help:Interwiki linking|Interwiki link]] icon for [[wikipedia:|Wikipedia]].</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for [[wikipedia:|Wikipedia]].</text>
    </revision>
    <revision>
      <id>860</id>
      <timestamp>2008-03-13T09:54:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:InterWiki-Wikipedia.png]]&quot;</comment>
      <text xml:space="preserve">[[Help:Interwiki linking|Interwiki link]] icon for [[wikipedia:|Wikipedia]].</text>
    </revision>
  </page>
  <page>
    <title>File:InventoryListUT.png</title>
    <id>24161</id>
    <revision>
      <id>34466</id>
      <timestamp>2009-06-02T11:14:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>A linear simply-[[linked list]] of [[UE1:Inventory (UT)|]] items, starting at a [[UE1:Pawn (UT)|]] and containing a [[UE1:UT_FlakCannon_(UT)|Flak Cannon]], its [[UE1:FlakAmmo_(UT)|ammo]] and a [[UE1:Armor2_(UT)|body armor]].</comment>
      <text xml:space="preserve">== Summary ==
A linear simply-[[linked list]] of [[UE1:Inventory (UT)|Inventory]] items, starting at a [[UE1:Pawn (UT)|Pawn]] and containing a [[UE1:UT_FlakCannon_(UT)|Flak Cannon]], its [[UE1:FlakAmmo_(UT)|ammo]] and a [[UE1:Armor2_(UT)|body armor]].
== Licensing: ==
{{CC-by-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Kismet Visual Example.PNG</title>
    <id>29306</id>
    <revision>
      <id>44885</id>
      <timestamp>2012-02-04T15:47:31Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Legacy 141.gif</title>
    <id>4208</id>
    <revision>
      <id>10138</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy 2D-arch.gif</title>
    <id>4499</id>
    <revision>
      <id>10429</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy 3dsmax-selectobjects.jpeg</title>
    <id>4686</id>
    <revision>
      <id>10616</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy 3dsmax-snapshot.jpeg</title>
    <id>4681</id>
    <revision>
      <id>10611</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AO EditPackages AddNew.png</title>
    <id>4612</id>
    <revision>
      <id>10542</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AO EditPackages View.png</title>
    <id>4611</id>
    <revision>
      <id>10541</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS CrazyBump 01.jpeg</title>
    <id>4540</id>
    <revision>
      <id>10470</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS CrazyBump 02.jpeg</title>
    <id>4561</id>
    <revision>
      <id>10491</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS EarthRough0009 L 2.jpeg</title>
    <id>4728</id>
    <revision>
      <id>10658</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS EarthRough0009 L 3.jpeg</title>
    <id>4730</id>
    <revision>
      <id>10660</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS Earthrough0009 l COLOR.jpeg</title>
    <id>4732</id>
    <revision>
      <id>10662</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS Earthrough0009 l NRM.jpeg</title>
    <id>4733</id>
    <revision>
      <id>10663</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS Earthrough0009 l SPECDISP.jpeg</title>
    <id>4734</id>
    <revision>
      <id>10664</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS RockGrassy0037 L 2.jpeg</title>
    <id>4729</id>
    <revision>
      <id>10659</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS RockGrassy0037 L 3.jpeg</title>
    <id>4731</id>
    <revision>
      <id>10661</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AS SimpleMaterial 0001.jpeg</title>
    <id>4735</id>
    <revision>
      <id>10665</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ASJournal Title.jpeg</title>
    <id>4533</id>
    <revision>
      <id>10463</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AddSub1.jpeg</title>
    <id>4670</id>
    <revision>
      <id>10600</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AddSub2.jpeg</title>
    <id>4666</id>
    <revision>
      <id>10596</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AddSub4.jpeg</title>
    <id>4665</id>
    <revision>
      <id>10595</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AddSub5.jpeg</title>
    <id>4590</id>
    <revision>
      <id>10520</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AddSub6.jpeg</title>
    <id>4542</id>
    <revision>
      <id>10472</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AlphaTexExample.jpeg</title>
    <id>4668</id>
    <revision>
      <id>10598</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AmonPlanks.jpeg</title>
    <id>4662</id>
    <revision>
      <id>10592</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AmonSkybox.jpeg</title>
    <id>4614</id>
    <revision>
      <id>10544</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AngelMapperCalendar.jpeg</title>
    <id>4673</id>
    <revision>
      <id>10603</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AngelMapperClock.jpeg</title>
    <id>4661</id>
    <revision>
      <id>10591</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AngelMapperElevator.jpeg</title>
    <id>4660</id>
    <revision>
      <id>10590</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AngelMapperOneWayVolume.jpeg</title>
    <id>4656</id>
    <revision>
      <id>10586</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AngelMapperReactiveGrass.jpeg</title>
    <id>4637</id>
    <revision>
      <id>10567</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AngelMapperTeleportEffect.jpeg</title>
    <id>4636</id>
    <revision>
      <id>10566</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial AddingANewBlendControl.png</title>
    <id>4663</id>
    <revision>
      <id>10593</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial AnimTreeProperties.png</title>
    <id>4659</id>
    <revision>
      <id>10589</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial CompleteTreeExample.png</title>
    <id>4627</id>
    <revision>
      <id>10557</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial CreatingTheTree.png</title>
    <id>4669</id>
    <revision>
      <id>10599</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial MovingAndConnectingTheBlendControl.png</title>
    <id>4625</id>
    <revision>
      <id>10555</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial NewTree.png</title>
    <id>4664</id>
    <revision>
      <id>10594</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy AnimTreeTutorial UsingSkeletalBlends.png</title>
    <id>4667</id>
    <revision>
      <id>10597</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BBZxanCone.png</title>
    <id>4568</id>
    <revision>
      <id>10498</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BSPTreeNodes.jpeg</title>
    <id>4562</id>
    <revision>
      <id>10492</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BigVerticlesBrush.png</title>
    <id>4610</id>
    <revision>
      <id>10540</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-Baruro-Shot1.jpeg</title>
    <id>4186</id>
    <revision>
      <id>10116</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-Dec-Alpha1.jpeg</title>
    <id>4119</id>
    <revision>
      <id>10049</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-Dec-Alpha2.jpeg</title>
    <id>4118</id>
    <revision>
      <id>10048</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-Dec-Alpha3.jpeg</title>
    <id>4117</id>
    <revision>
      <id>10047</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-Dec-Alpha4.jpeg</title>
    <id>4116</id>
    <revision>
      <id>10046</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-NameTBA-Shot2.jpeg</title>
    <id>4184</id>
    <revision>
      <id>10114</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Bir-NameTBA-Shot3.jpeg</title>
    <id>4185</id>
    <revision>
      <id>10115</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BrushAlignBad2.jpeg</title>
    <id>4564</id>
    <revision>
      <id>10494</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BrushAlignGood2.jpeg</title>
    <id>4565</id>
    <revision>
      <id>10495</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BrushSinking.jpeg</title>
    <id>4110</id>
    <revision>
      <id>10040</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy BulldogShadowOnCrop.jpeg</title>
    <id>4108</id>
    <revision>
      <id>10038</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Button Trouble.jpeg</title>
    <id>4601</id>
    <revision>
      <id>10531</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ChaosEngine GUIInterfaceRuntime.jpeg</title>
    <id>4547</id>
    <revision>
      <id>10477</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ConTEXT.gif</title>
    <id>3950</id>
    <revision>
      <id>9880</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy CoronaHallway.jpeg</title>
    <id>4096</id>
    <revision>
      <id>10026</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy CreatingYourOwnPawn AnimSetEditor.png</title>
    <id>4559</id>
    <revision>
      <id>10489</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Custom Toolbox.gif</title>
    <id>4516</id>
    <revision>
      <id>10446</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy CustomBB.jpeg</title>
    <id>4094</id>
    <revision>
      <id>10024</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DM-Bunker-Screenshot-Blurr-1.jpeg</title>
    <id>4528</id>
    <revision>
      <id>10458</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DM-Bunker-Screenshot-Blurr-3.jpeg</title>
    <id>4525</id>
    <revision>
      <id>10455</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DM-Bunker-screenshot-Blurr-2.jpeg</title>
    <id>4527</id>
    <revision>
      <id>10457</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 01.jpeg</title>
    <id>4694</id>
    <revision>
      <id>10624</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 02.jpeg</title>
    <id>4695</id>
    <revision>
      <id>10625</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 03.jpeg</title>
    <id>4696</id>
    <revision>
      <id>10626</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 04.jpeg</title>
    <id>4697</id>
    <revision>
      <id>10627</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 05.jpeg</title>
    <id>4698</id>
    <revision>
      <id>10628</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 06.jpeg</title>
    <id>4699</id>
    <revision>
      <id>10629</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 07.jpeg</title>
    <id>4700</id>
    <revision>
      <id>10630</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 08.jpeg</title>
    <id>4701</id>
    <revision>
      <id>10631</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 09.jpeg</title>
    <id>4704</id>
    <revision>
      <id>10634</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 10.jpeg</title>
    <id>4705</id>
    <revision>
      <id>10635</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 11.jpeg</title>
    <id>4706</id>
    <revision>
      <id>10636</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 12.jpeg</title>
    <id>4707</id>
    <revision>
      <id>10637</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 13.jpeg</title>
    <id>4708</id>
    <revision>
      <id>10638</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 14.jpeg</title>
    <id>4709</id>
    <revision>
      <id>10639</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 15.jpeg</title>
    <id>4724</id>
    <revision>
      <id>10654</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SteamVent 16.jpeg</title>
    <id>4725</id>
    <revision>
      <id>10655</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic 3DSMax SulphurWater 11.jpeg</title>
    <id>4721</id>
    <revision>
      <id>10651</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic ISampler.jpeg</title>
    <id>4691</id>
    <revision>
      <id>10621</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic Mud NormalSeemless.jpeg</title>
    <id>4702</id>
    <revision>
      <id>10632</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic MudImage.jpeg</title>
    <id>4690</id>
    <revision>
      <id>10620</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic MudTextureSeemless.jpeg</title>
    <id>4692</id>
    <revision>
      <id>10622</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SandImage.jpeg</title>
    <id>4689</id>
    <revision>
      <id>10619</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic Soil NormalSeemless.jpeg</title>
    <id>4703</id>
    <revision>
      <id>10633</id>
      <timestamp>2008-04-01T01:24:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SoilTextureSeemless.jpeg</title>
    <id>4693</id>
    <revision>
      <id>10623</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SteamParticleBlend.jpeg</title>
    <id>4723</id>
    <revision>
      <id>10653</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 04.jpeg</title>
    <id>4714</id>
    <revision>
      <id>10644</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 05.jpeg</title>
    <id>4715</id>
    <revision>
      <id>10645</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 06.jpeg</title>
    <id>4716</id>
    <revision>
      <id>10646</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 07.jpeg</title>
    <id>4717</id>
    <revision>
      <id>10647</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 08.jpeg</title>
    <id>4718</id>
    <revision>
      <id>10648</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 09.jpeg</title>
    <id>4719</id>
    <revision>
      <id>10649</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic SulphurWater 10.jpeg</title>
    <id>4720</id>
    <revision>
      <id>10650</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic TextureMaker Water 01.jpeg</title>
    <id>4710</id>
    <revision>
      <id>10640</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic WaterAlphaMix 01.jpeg</title>
    <id>4713</id>
    <revision>
      <id>10643</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic WaterImage.jpeg</title>
    <id>4712</id>
    <revision>
      <id>10642</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic WaterParticle.jpeg</title>
    <id>4722</id>
    <revision>
      <id>10652</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DMSiesmic WaterTextureSeemless.jpeg</title>
    <id>4711</id>
    <revision>
      <id>10641</id>
      <timestamp>2008-04-01T01:24:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DavidMredlight.jpeg</title>
    <id>4087</id>
    <revision>
      <id>10017</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DefaultTexture.jpeg</title>
    <id>4746</id>
    <revision>
      <id>10676</id>
      <timestamp>2008-04-01T01:24:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DeusExNoodleBanner.jpeg</title>
    <id>4546</id>
    <revision>
      <id>10476</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Drabridges-Liner.jpeg</title>
    <id>4495</id>
    <revision>
      <id>10425</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy DropShip.jpeg</title>
    <id>4187</id>
    <revision>
      <id>10117</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EMT Fig1.gif</title>
    <id>4121</id>
    <revision>
      <id>10051</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EMT Fig2.gif</title>
    <id>4114</id>
    <revision>
      <id>10044</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EMT Fig3.gif</title>
    <id>4098</id>
    <revision>
      <id>10028</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EMT Fig4.gif</title>
    <id>4115</id>
    <revision>
      <id>10045</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EMT Fig5.gif</title>
    <id>4113</id>
    <revision>
      <id>10043</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EMT Fig6.gif</title>
    <id>4100</id>
    <revision>
      <id>10030</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EarthRough0009 L.jpeg</title>
    <id>4727</id>
    <revision>
      <id>10657</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EditPlus.jpeg</title>
    <id>4111</id>
    <revision>
      <id>10041</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Encarcerationlift.jpeg</title>
    <id>4122</id>
    <revision>
      <id>10052</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Encarcerationpool.jpeg</title>
    <id>4124</id>
    <revision>
      <id>10054</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Encarcerationvat.jpeg</title>
    <id>4125</id>
    <revision>
      <id>10055</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EpicNames.jpeg</title>
    <id>4164</id>
    <revision>
      <id>10094</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy EscR.jpeg</title>
    <id>4682</id>
    <revision>
      <id>10612</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FOD Elevatorcab1.jpeg</title>
    <id>4536</id>
    <revision>
      <id>10466</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FOD Elevatorcabtop.jpeg</title>
    <id>4523</id>
    <revision>
      <id>10453</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FOD Elevatordoor.jpeg</title>
    <id>4535</id>
    <revision>
      <id>10465</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FinalRender.png</title>
    <id>4740</id>
    <revision>
      <id>10670</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FireWorld Small.jpeg</title>
    <id>4206</id>
    <revision>
      <id>10136</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Foxpaws2on3.png</title>
    <id>3935</id>
    <revision>
      <id>9865</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsCloseInFrigates.png</title>
    <id>4011</id>
    <revision>
      <id>9941</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsCruiser1.jpeg</title>
    <id>4364</id>
    <revision>
      <id>10294</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsCruiserSide.jpeg</title>
    <id>4365</id>
    <revision>
      <id>10295</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsCruiserTurret.jpeg</title>
    <id>4520</id>
    <revision>
      <id>10450</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsCruiserVsFighters.jpeg</title>
    <id>4524</id>
    <revision>
      <id>10454</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsDrunkenMissiles.png</title>
    <id>3988</id>
    <revision>
      <id>9918</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsFrigateFormation.png</title>
    <id>4739</id>
    <revision>
      <id>10669</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsGen1Boarding.jpeg</title>
    <id>4352</id>
    <revision>
      <id>10282</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsGen1Carrier.png</title>
    <id>4351</id>
    <revision>
      <id>10281</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsGen1Hangar.jpeg</title>
    <id>4353</id>
    <revision>
      <id>10283</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsGen3Backdrop1-2.png</title>
    <id>4315</id>
    <revision>
      <id>10245</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsGen3Backdrop1.jpeg</title>
    <id>4314</id>
    <revision>
      <id>10244</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsGen3Left.jpeg</title>
    <id>4316</id>
    <revision>
      <id>10246</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsLoneFighterB.jpeg</title>
    <id>4366</id>
    <revision>
      <id>10296</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsNebula1.jpeg</title>
    <id>4181</id>
    <revision>
      <id>10111</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsNebula2.jpeg</title>
    <id>4182</id>
    <revision>
      <id>10112</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsRVGun.jpeg</title>
    <id>4521</id>
    <revision>
      <id>10451</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy FoxpawsTurretScreenShot.jpeg</title>
    <id>4212</id>
    <revision>
      <id>10142</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy GalleryImage499686.jpeg</title>
    <id>4569</id>
    <revision>
      <id>10499</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy GhostLight.jpeg</title>
    <id>4034</id>
    <revision>
      <id>9964</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy GhostNoLight.gif</title>
    <id>4033</id>
    <revision>
      <id>9963</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy GoldWaveLogo.png</title>
    <id>4566</id>
    <revision>
      <id>10496</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy GoogleSearchOddity.gif</title>
    <id>4526</id>
    <revision>
      <id>10456</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy HUD textures.gif</title>
    <id>4744</id>
    <revision>
      <id>10674</id>
      <timestamp>2008-04-01T01:24:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Halfcubediagram.png</title>
    <id>4209</id>
    <revision>
      <id>10139</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy HelloFromUE3Land.jpeg</title>
    <id>4655</id>
    <revision>
      <id>10585</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy IceWorldRender 02640x480.jpeg</title>
    <id>4604</id>
    <revision>
      <id>10534</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy InterpolationPoint.jpeg</title>
    <id>3898</id>
    <revision>
      <id>9828</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy KickerAction.jpeg</title>
    <id>4009</id>
    <revision>
      <id>9939</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW 3ds Export Options.jpeg</title>
    <id>4514</id>
    <revision>
      <id>10444</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW AdditionalPlugins.jpeg</title>
    <id>4515</id>
    <revision>
      <id>10445</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-AppliedTexture.jpeg</title>
    <id>4180</id>
    <revision>
      <id>10110</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-Mine.jpeg</title>
    <id>4174</id>
    <revision>
      <id>10104</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-NewMap.jpeg</title>
    <id>4175</id>
    <revision>
      <id>10105</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-NewMap2.jpeg</title>
    <id>4176</id>
    <revision>
      <id>10106</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-NewMap3.jpeg</title>
    <id>4177</id>
    <revision>
      <id>10107</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-NewMap4.jpeg</title>
    <id>4178</id>
    <revision>
      <id>10108</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy LW-UVMapping-Texture1.jpeg</title>
    <id>4179</id>
    <revision>
      <id>10109</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-BottomToolbar.jpeg</title>
    <id>3925</id>
    <revision>
      <id>9855</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-CreateElements.jpeg</title>
    <id>4172</id>
    <revision>
      <id>10102</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-CreateObjects.jpeg</title>
    <id>4171</id>
    <revision>
      <id>10101</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-FileButtons.jpeg</title>
    <id>3919</id>
    <revision>
      <id>9849</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-FileChooser.jpeg</title>
    <id>3920</id>
    <revision>
      <id>9850</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-Layout.jpeg</title>
    <id>3918</id>
    <revision>
      <id>9848</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-ModelPages.jpeg</title>
    <id>3921</id>
    <revision>
      <id>9851</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-PagingExample.jpeg</title>
    <id>3922</id>
    <revision>
      <id>9852</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Lightwave-ViewportButtons.jpeg</title>
    <id>3923</id>
    <revision>
      <id>9853</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-01-AnimSeqList.gif</title>
    <id>4229</id>
    <revision>
      <id>10159</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-02-CylSpecs.gif</title>
    <id>4230</id>
    <revision>
      <id>10160</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-03-HipsAlign.gif</title>
    <id>4231</id>
    <revision>
      <id>10161</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-04-CylMan.gif</title>
    <id>4232</id>
    <revision>
      <id>10162</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-05-FirstBones.gif</title>
    <id>4234</id>
    <revision>
      <id>10164</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-06-LwrSkeleton.gif</title>
    <id>4235</id>
    <revision>
      <id>10165</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-07-SpineBones.gif</title>
    <id>4236</id>
    <revision>
      <id>10166</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-08-UpperBones.gif</title>
    <id>4237</id>
    <revision>
      <id>10167</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-09-AllBones.gif</title>
    <id>4238</id>
    <revision>
      <id>10168</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-10-ZAxisTweaks.gif</title>
    <id>4239</id>
    <revision>
      <id>10169</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-11-LimbsIK.gif</title>
    <id>4240</id>
    <revision>
      <id>10170</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-12-IKHnames.gif</title>
    <id>4241</id>
    <revision>
      <id>10171</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-13-History.gif</title>
    <id>4242</id>
    <revision>
      <id>10172</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-14-BindSkinSpecs.gif</title>
    <id>4243</id>
    <revision>
      <id>10173</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-15-PlacePivot.gif</title>
    <id>4244</id>
    <revision>
      <id>10174</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-16-RotateArm.gif</title>
    <id>4245</id>
    <revision>
      <id>10175</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-17-IKHrealign.gif</title>
    <id>4246</id>
    <revision>
      <id>10176</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-18-SkinWeights.gif</title>
    <id>4247</id>
    <revision>
      <id>10177</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-19-PaintSkinWeights.gif</title>
    <id>4248</id>
    <revision>
      <id>10178</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-20-KeyOptions.gif</title>
    <id>4249</id>
    <revision>
      <id>10179</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-21-GroundPlane.gif</title>
    <id>4250</id>
    <revision>
      <id>10180</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-22-ZCurves.gif</title>
    <id>4251</id>
    <revision>
      <id>10181</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-23-BigCurves.gif</title>
    <id>4252</id>
    <revision>
      <id>10182</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-24-IdleAnimCurves.gif</title>
    <id>4253</id>
    <revision>
      <id>10183</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-25A.gif</title>
    <id>4283</id>
    <revision>
      <id>10213</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-25B.gif</title>
    <id>4284</id>
    <revision>
      <id>10214</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-25C.gif</title>
    <id>4285</id>
    <revision>
      <id>10215</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-25D.gif</title>
    <id>4286</id>
    <revision>
      <id>10216</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-26-TCManInUed.gif</title>
    <id>4254</id>
    <revision>
      <id>10184</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-27-TCManUPL.gif</title>
    <id>4255</id>
    <revision>
      <id>10185</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MCMT-TCManOnAntalus.jpeg</title>
    <id>4233</id>
    <revision>
      <id>10163</id>
      <timestamp>2008-04-01T01:23:27Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3D-LWOexport.gif</title>
    <id>4256</id>
    <revision>
      <id>10186</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3D2UT2003.jpeg</title>
    <id>4257</id>
    <revision>
      <id>10187</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-00.gif</title>
    <id>4228</id>
    <revision>
      <id>10158</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-01.gif</title>
    <id>4258</id>
    <revision>
      <id>10188</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-02.gif</title>
    <id>4259</id>
    <revision>
      <id>10189</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-03.gif</title>
    <id>4260</id>
    <revision>
      <id>10190</id>
      <timestamp>2008-04-01T01:23:28Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-04.gif</title>
    <id>4261</id>
    <revision>
      <id>10191</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-05.gif</title>
    <id>4262</id>
    <revision>
      <id>10192</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-06.gif</title>
    <id>4263</id>
    <revision>
      <id>10193</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-07.gif</title>
    <id>4264</id>
    <revision>
      <id>10194</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-08.gif</title>
    <id>4265</id>
    <revision>
      <id>10195</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-09.gif</title>
    <id>4266</id>
    <revision>
      <id>10196</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-10.gif</title>
    <id>4267</id>
    <revision>
      <id>10197</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-11.gif</title>
    <id>4268</id>
    <revision>
      <id>10198</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-12.gif</title>
    <id>4269</id>
    <revision>
      <id>10199</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-14.gif</title>
    <id>4270</id>
    <revision>
      <id>10200</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-15.gif</title>
    <id>4271</id>
    <revision>
      <id>10201</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-16.gif</title>
    <id>4272</id>
    <revision>
      <id>10202</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-17.gif</title>
    <id>4273</id>
    <revision>
      <id>10203</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-18.gif</title>
    <id>4274</id>
    <revision>
      <id>10204</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-19.gif</title>
    <id>4275</id>
    <revision>
      <id>10205</id>
      <timestamp>2008-04-01T01:23:29Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-21.gif</title>
    <id>4277</id>
    <revision>
      <id>10207</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-21B.gif</title>
    <id>4281</id>
    <revision>
      <id>10211</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-22.gif</title>
    <id>4278</id>
    <revision>
      <id>10208</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-23.gif</title>
    <id>4279</id>
    <revision>
      <id>10209</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MS3DT-24.gif</title>
    <id>4280</id>
    <revision>
      <id>10210</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MacroTexture 01.jpeg</title>
    <id>4344</id>
    <revision>
      <id>10274</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MacroTexture 02.jpeg</title>
    <id>4345</id>
    <revision>
      <id>10275</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MacroTexture 03.jpeg</title>
    <id>4346</id>
    <revision>
      <id>10276</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MapWithTerrainAndFogEtc1.jpeg</title>
    <id>4158</id>
    <revision>
      <id>10088</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MapWithTerrainAndFogEtc2.jpeg</title>
    <id>4159</id>
    <revision>
      <id>10089</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut0.jpeg</title>
    <id>4006</id>
    <revision>
      <id>9936</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut1.jpeg</title>
    <id>4581</id>
    <revision>
      <id>10511</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut2.jpeg</title>
    <id>4582</id>
    <revision>
      <id>10512</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut3.jpeg</title>
    <id>4583</id>
    <revision>
      <id>10513</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut4.jpeg</title>
    <id>4584</id>
    <revision>
      <id>10514</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut5.jpeg</title>
    <id>4585</id>
    <revision>
      <id>10515</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MayaImportTut6.jpeg</title>
    <id>4586</id>
    <revision>
      <id>10516</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Mover butt.gif</title>
    <id>3998</id>
    <revision>
      <id>9928</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MozWikiTab.gif</title>
    <id>3896</id>
    <revision>
      <id>9826</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy MultiSeasons-Covers.jpeg</title>
    <id>3996</id>
    <revision>
      <id>9926</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy My Button Trouble.jpeg</title>
    <id>4685</id>
    <revision>
      <id>10615</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy My Security Mirror.jpeg</title>
    <id>4684</id>
    <revision>
      <id>10614</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Myth RotationalWeight.jpeg</title>
    <id>4600</id>
    <revision>
      <id>10530</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Myth RotationsA.jpeg</title>
    <id>4678</id>
    <revision>
      <id>10608</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Myth RotationsB.jpeg</title>
    <id>4679</id>
    <revision>
      <id>10609</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy NavigationPointExamples.jpeg</title>
    <id>3989</id>
    <revision>
      <id>9919</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy P2.png</title>
    <id>4189</id>
    <revision>
      <id>10119</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Page1.png</title>
    <id>4530</id>
    <revision>
      <id>10460</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Page2.png</title>
    <id>4531</id>
    <revision>
      <id>10461</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Page3.png</title>
    <id>4532</id>
    <revision>
      <id>10462</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy PariahLogo.jpeg</title>
    <id>4567</id>
    <revision>
      <id>10497</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Pathing-Translocators-01.jpeg</title>
    <id>4375</id>
    <revision>
      <id>10305</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Pathing-Translocators-02.jpeg</title>
    <id>4376</id>
    <revision>
      <id>10306</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Pathing-Translocators-03.jpeg</title>
    <id>4377</id>
    <revision>
      <id>10307</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Pathing-Translocators-04.jpeg</title>
    <id>4378</id>
    <revision>
      <id>10308</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy PokeTerrainExample.jpeg</title>
    <id>4550</id>
    <revision>
      <id>10480</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy PopDamage.jpeg</title>
    <id>4372</id>
    <revision>
      <id>10302</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ProjectX MinimapExample.jpeg</title>
    <id>4677</id>
    <revision>
      <id>10607</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ProjectorTrick1.jpeg</title>
    <id>4170</id>
    <revision>
      <id>10100</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Proton.png</title>
    <id>3917</id>
    <revision>
      <id>9847</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Punisher.gif</title>
    <id>4227</id>
    <revision>
      <id>10157</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Quaternion.png</title>
    <id>4135</id>
    <revision>
      <id>10065</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy QueryHandler.png</title>
    <id>3983</id>
    <revision>
      <id>9913</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RParticles.jpeg</title>
    <id>4602</id>
    <revision>
      <id>10532</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RParticlesExampleVariatto.jpeg</title>
    <id>4657</id>
    <revision>
      <id>10587</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RParticlesTorch.jpeg</title>
    <id>4624</id>
    <revision>
      <id>10554</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RParticlesWindow.gif</title>
    <id>4603</id>
    <revision>
      <id>10533</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RichZapTutPic1.jpeg</title>
    <id>4599</id>
    <revision>
      <id>10529</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RichZapTutPic2.jpeg</title>
    <id>4598</id>
    <revision>
      <id>10528</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitz ImportSMesh 1.gif</title>
    <id>4631</id>
    <revision>
      <id>10561</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitz ImportSMesh 2.gif</title>
    <id>4632</id>
    <revision>
      <id>10562</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitz ImportSMesh 3.gif</title>
    <id>4633</id>
    <revision>
      <id>10563</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitz UIScene 1.gif</title>
    <id>4634</id>
    <revision>
      <id>10564</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitzWotGreal 1.gif</title>
    <id>4628</id>
    <revision>
      <id>10558</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitzWotGreal 2.gif</title>
    <id>4629</id>
    <revision>
      <id>10559</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RoboBlitzWotGreal 3.gif</title>
    <id>4630</id>
    <revision>
      <id>10560</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy RockGrassy0037 L.jpeg</title>
    <id>4726</id>
    <revision>
      <id>10656</id>
      <timestamp>2008-04-01T01:24:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SWPShotWiki.jpeg</title>
    <id>4534</id>
    <revision>
      <id>10464</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SabbathCat MP PUB01.jpeg</title>
    <id>4331</id>
    <revision>
      <id>10261</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SaveButton.jpeg</title>
    <id>4007</id>
    <revision>
      <id>9937</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ScreenPosition.gif</title>
    <id>4157</id>
    <revision>
      <id>10087</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Security Mirror.jpeg</title>
    <id>4683</id>
    <revision>
      <id>10613</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Shot00002.jpeg</title>
    <id>4591</id>
    <revision>
      <id>10521</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Sourced Player Shadows Bug 1.jpeg</title>
    <id>4155</id>
    <revision>
      <id>10085</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Sourced Player Shadows Bug 2.jpeg</title>
    <id>4156</id>
    <revision>
      <id>10086</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU Forward.jpeg</title>
    <id>4299</id>
    <revision>
      <id>10229</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU None.jpeg</title>
    <id>4298</id>
    <revision>
      <id>10228</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU Normal.jpeg</title>
    <id>4300</id>
    <revision>
      <id>10230</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU Right.jpeg</title>
    <id>4301</id>
    <revision>
      <id>10231</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU RightAndNormal.jpeg</title>
    <id>4302</id>
    <revision>
      <id>10232</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU Up.jpeg</title>
    <id>4303</id>
    <revision>
      <id>10233</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy SpriteEmitter-PTDU UpAndNormal.jpeg</title>
    <id>4304</id>
    <revision>
      <id>10234</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-ASupport01AB.png</title>
    <id>4379</id>
    <revision>
      <id>10309</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-ASupport02ab.png</title>
    <id>4380</id>
    <revision>
      <id>10310</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-ASupport03AB.png</title>
    <id>4381</id>
    <revision>
      <id>10311</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-BeamML1GO.png</title>
    <id>4382</id>
    <revision>
      <id>10312</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-Sup2Beam25601AB.png</title>
    <id>4383</id>
    <revision>
      <id>10313</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-Sup2Beam51201AB.png</title>
    <id>4384</id>
    <revision>
      <id>10314</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-SupTopBeam01BA.png</title>
    <id>4386</id>
    <revision>
      <id>10316</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-SupYbeam01BA.png</title>
    <id>4387</id>
    <revision>
      <id>10317</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Beams-Support01AB.png</title>
    <id>4385</id>
    <revision>
      <id>10315</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Ceilings-AOverhead25601AB.png</title>
    <id>4388</id>
    <revision>
      <id>10318</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Ceilings-AOverhead51201AB.png</title>
    <id>4389</id>
    <revision>
      <id>10319</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Deco-LavaPlantML1GO.png</title>
    <id>4390</id>
    <revision>
      <id>10320</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Deco-RoxDOG.png</title>
    <id>4392</id>
    <revision>
      <id>10322</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Deco-RoxDoA.png</title>
    <id>4391</id>
    <revision>
      <id>10321</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-ABCawalkway01.png</title>
    <id>4393</id>
    <revision>
      <id>10323</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-AWalk25601AB.png</title>
    <id>4395</id>
    <revision>
      <id>10325</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-AWalk9001AB.png</title>
    <id>4394</id>
    <revision>
      <id>10324</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-AWalkT01AB.png</title>
    <id>4398</id>
    <revision>
      <id>10328</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-AWalkUp01AB.png</title>
    <id>4399</id>
    <revision>
      <id>10329</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-Awalk51201AB.png</title>
    <id>4396</id>
    <revision>
      <id>10326</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-BWalk25601AB.png</title>
    <id>4401</id>
    <revision>
      <id>10331</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-BWalk51201AB.png</title>
    <id>4402</id>
    <revision>
      <id>10332</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-BWalk9001AB.png</title>
    <id>4400</id>
    <revision>
      <id>10330</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-BWalkT01AB.png</title>
    <id>4403</id>
    <revision>
      <id>10333</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-BWalkUp01AB.png</title>
    <id>4404</id>
    <revision>
      <id>10334</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-IxstairsA.png</title>
    <id>4405</id>
    <revision>
      <id>10335</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Floors-ScorchBridgeA.png</title>
    <id>4406</id>
    <revision>
      <id>10336</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-LavaFormations-AStacks1G0.png</title>
    <id>4407</id>
    <revision>
      <id>10337</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-LavaFormations-AStacks2G0.png</title>
    <id>4408</id>
    <revision>
      <id>10338</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-LavaFormations-AStacks3G0.png</title>
    <id>4409</id>
    <revision>
      <id>10339</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Alight01AB.png</title>
    <id>4410</id>
    <revision>
      <id>10340</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht1.png</title>
    <id>4397</id>
    <revision>
      <id>10327</id>
      <timestamp>2008-04-01T01:23:38Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht2.png</title>
    <id>4411</id>
    <revision>
      <id>10341</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht3.png</title>
    <id>4412</id>
    <revision>
      <id>10342</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht4.png</title>
    <id>4413</id>
    <revision>
      <id>10343</id>
      <timestamp>2008-04-01T01:23:39Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht5.png</title>
    <id>4414</id>
    <revision>
      <id>10344</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht6.png</title>
    <id>4415</id>
    <revision>
      <id>10345</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht7.png</title>
    <id>4416</id>
    <revision>
      <id>10346</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Lights-Ligjht8.png</title>
    <id>4417</id>
    <revision>
      <id>10347</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ABCAMiddlepeak06.png</title>
    <id>4419</id>
    <revision>
      <id>10349</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ABCASpikes01.png</title>
    <id>4420</id>
    <revision>
      <id>10350</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ABCAcage-02.png</title>
    <id>4418</id>
    <revision>
      <id>10348</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ABCAtowertopdecos02.png</title>
    <id>4421</id>
    <revision>
      <id>10351</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ABLift.png</title>
    <id>4422</id>
    <revision>
      <id>10352</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ARailA25601AB.png</title>
    <id>4423</id>
    <revision>
      <id>10353</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ARailHRound01AB.png</title>
    <id>4424</id>
    <revision>
      <id>10354</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ARailHRound02AB.png</title>
    <id>4425</id>
    <revision>
      <id>10355</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-BottomTube01AB.png</title>
    <id>4426</id>
    <revision>
      <id>10356</id>
      <timestamp>2008-04-01T01:23:40Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Bridge01AB.png</title>
    <id>4427</id>
    <revision>
      <id>10357</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Bridge01bAB.png</title>
    <id>4428</id>
    <revision>
      <id>10358</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Bridge01bGratesAB.png</title>
    <id>4429</id>
    <revision>
      <id>10359</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-CircleGrate01AB.png</title>
    <id>4430</id>
    <revision>
      <id>10360</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Controls01AB.png</title>
    <id>4431</id>
    <revision>
      <id>10361</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ElevTrackML1G0.png</title>
    <id>4434</id>
    <revision>
      <id>10364</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ElevatorML1G0.png</title>
    <id>4433</id>
    <revision>
      <id>10363</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Fan01AB.png</title>
    <id>4435</id>
    <revision>
      <id>10365</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Gadget01AB.png</title>
    <id>4436</id>
    <revision>
      <id>10366</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-InsetTank01AB.png</title>
    <id>4438</id>
    <revision>
      <id>10368</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-InsetTank02AB.png</title>
    <id>4439</id>
    <revision>
      <id>10369</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-IxDoorTrim1G0.png</title>
    <id>4440</id>
    <revision>
      <id>10370</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-IxDoorway1G0.png</title>
    <id>4441</id>
    <revision>
      <id>10371</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-JointML1G0.png</title>
    <id>4442</id>
    <revision>
      <id>10372</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar01AB.png</title>
    <id>4443</id>
    <revision>
      <id>10373</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar01ABskin.png</title>
    <id>4444</id>
    <revision>
      <id>10374</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar03AB.png</title>
    <id>4446</id>
    <revision>
      <id>10376</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar04AB.png</title>
    <id>4447</id>
    <revision>
      <id>10377</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar04bAB.png</title>
    <id>4448</id>
    <revision>
      <id>10378</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ScorchDoorG0.png</title>
    <id>4449</id>
    <revision>
      <id>10379</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ScorchShapeA.png</title>
    <id>4450</id>
    <revision>
      <id>10380</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-ScorchShapeB.png</title>
    <id>4452</id>
    <revision>
      <id>10382</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Screen01AB.png</title>
    <id>4453</id>
    <revision>
      <id>10383</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Tank01AB.png</title>
    <id>4455</id>
    <revision>
      <id>10385</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Tankglass01AB.png</title>
    <id>4456</id>
    <revision>
      <id>10386</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-TeleporterWing.png</title>
    <id>4457</id>
    <revision>
      <id>10387</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-TopTube01AB.png</title>
    <id>4458</id>
    <revision>
      <id>10388</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Vent01AB.png</title>
    <id>4459</id>
    <revision>
      <id>10389</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-Wires01AB.png</title>
    <id>4461</id>
    <revision>
      <id>10391</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-door01AB.png</title>
    <id>4432</id>
    <revision>
      <id>10362</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-hook01AB.png</title>
    <id>4437</id>
    <revision>
      <id>10367</id>
      <timestamp>2008-04-01T01:23:41Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-pillar02ab.png</title>
    <id>4445</id>
    <revision>
      <id>10375</id>
      <timestamp>2008-04-01T01:23:42Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-smallTank01AB.png</title>
    <id>4454</id>
    <revision>
      <id>10384</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-victim01AB.png</title>
    <id>4460</id>
    <revision>
      <id>10390</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Miscellaneous-wrench01AB.png</title>
    <id>4462</id>
    <revision>
      <id>10392</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-AInsert01AB.png</title>
    <id>4463</id>
    <revision>
      <id>10393</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe12801AB.png</title>
    <id>4471</id>
    <revision>
      <id>10401</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe12802AB.png</title>
    <id>4472</id>
    <revision>
      <id>10402</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe128Insert01AB.png</title>
    <id>4465</id>
    <revision>
      <id>10395</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe128LowR01AB.png</title>
    <id>4466</id>
    <revision>
      <id>10396</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe128lowR02AB.png</title>
    <id>4467</id>
    <revision>
      <id>10397</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe25601AB.png</title>
    <id>4473</id>
    <revision>
      <id>10403</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe256LowR01AB.png</title>
    <id>4468</id>
    <revision>
      <id>10398</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe51201AB.png</title>
    <id>4474</id>
    <revision>
      <id>10404</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe512LowR01AB.png</title>
    <id>4469</id>
    <revision>
      <id>10399</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe9001AB.png</title>
    <id>4470</id>
    <revision>
      <id>10400</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipe90LowR01AB.png</title>
    <id>4464</id>
    <revision>
      <id>10394</id>
      <timestamp>2008-04-01T01:23:44Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipeCorner01AB.png</title>
    <id>4475</id>
    <revision>
      <id>10405</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-Pipes-APipeCornerLowR01AB.png</title>
    <id>4593</id>
    <revision>
      <id>10523</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-ASupLowPanel25601AB.png</title>
    <id>4478</id>
    <revision>
      <id>10408</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-ASupLowPanel51201AB.png</title>
    <id>4479</id>
    <revision>
      <id>10409</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Corner01AB.png</title>
    <id>4480</id>
    <revision>
      <id>10410</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-SupTopPanel25601BA.png</title>
    <id>4481</id>
    <revision>
      <id>10411</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Suptoppanel51201ba.png</title>
    <id>4482</id>
    <revision>
      <id>10412</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-TopWall01AB.png</title>
    <id>4483</id>
    <revision>
      <id>10413</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-TopWall02AB.png</title>
    <id>4484</id>
    <revision>
      <id>10414</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-TopWall03AB.png</title>
    <id>4485</id>
    <revision>
      <id>10415</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-TopWallCap01AB.png</title>
    <id>4486</id>
    <revision>
      <id>10416</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall01AB.png</title>
    <id>4487</id>
    <revision>
      <id>10417</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall25602AB.png</title>
    <id>4489</id>
    <revision>
      <id>10419</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall25603AB.png</title>
    <id>4490</id>
    <revision>
      <id>10420</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall25603bAB.png</title>
    <id>4491</id>
    <revision>
      <id>10421</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall25603bgrateAB.png</title>
    <id>4492</id>
    <revision>
      <id>10422</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall256AB.png</title>
    <id>4488</id>
    <revision>
      <id>10418</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-Wall256bAB.png</title>
    <id>4494</id>
    <revision>
      <id>10424</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy StaticMeshPic-AbaddonHardware-WallPanels-wrench01AB.png</title>
    <id>4493</id>
    <revision>
      <id>10423</id>
      <timestamp>2008-04-01T01:23:46Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TRILINEAR Off.png</title>
    <id>3931</id>
    <revision>
      <id>9861</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TRILINEAR On.png</title>
    <id>3908</id>
    <revision>
      <id>9838</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Teleporter-problem.jpeg</title>
    <id>4141</id>
    <revision>
      <id>10071</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TerrainIcon.gif</title>
    <id>3930</id>
    <revision>
      <id>9860</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TerrainTT Flip.png</title>
    <id>4150</id>
    <revision>
      <id>10080</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TerrainTT Rotate.png</title>
    <id>4151</id>
    <revision>
      <id>10081</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TextureAddress-Clamp.png</title>
    <id>4674</id>
    <revision>
      <id>10604</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TextureAddress-Mirror.png</title>
    <id>4687</id>
    <revision>
      <id>10617</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TextureAddress-Wrap.png</title>
    <id>4688</id>
    <revision>
      <id>10618</id>
      <timestamp>2008-04-01T01:24:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ToolbarCreator Main.gif</title>
    <id>4161</id>
    <revision>
      <id>10091</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy TunnelTerrainHack-Daid.jpeg</title>
    <id>4370</id>
    <revision>
      <id>10300</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UAPatchTool.png</title>
    <id>4519</id>
    <revision>
      <id>10449</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 01.gif</title>
    <id>3910</id>
    <revision>
      <id>9840</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 02.gif</title>
    <id>3905</id>
    <revision>
      <id>9835</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 03.gif</title>
    <id>3891</id>
    <revision>
      <id>9821</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 04.gif</title>
    <id>3904</id>
    <revision>
      <id>9834</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 05.gif</title>
    <id>4638</id>
    <revision>
      <id>10568</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 06.gif</title>
    <id>4639</id>
    <revision>
      <id>10569</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 07.gif</title>
    <id>4640</id>
    <revision>
      <id>10570</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 08.gif</title>
    <id>4641</id>
    <revision>
      <id>10571</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 09.gif</title>
    <id>4642</id>
    <revision>
      <id>10572</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 10.gif</title>
    <id>4643</id>
    <revision>
      <id>10573</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 11.gif</title>
    <id>4644</id>
    <revision>
      <id>10574</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 12.gif</title>
    <id>4645</id>
    <revision>
      <id>10575</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 13.gif</title>
    <id>4646</id>
    <revision>
      <id>10576</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 14.gif</title>
    <id>4647</id>
    <revision>
      <id>10577</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 15.gif</title>
    <id>4648</id>
    <revision>
      <id>10578</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 16.gif</title>
    <id>4649</id>
    <revision>
      <id>10579</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 17.gif</title>
    <id>4651</id>
    <revision>
      <id>10581</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 18.gif</title>
    <id>4652</id>
    <revision>
      <id>10582</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 19.gif</title>
    <id>4650</id>
    <revision>
      <id>10580</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 20.gif</title>
    <id>4654</id>
    <revision>
      <id>10584</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI 21.gif</title>
    <id>4653</id>
    <revision>
      <id>10583</id>
      <timestamp>2008-04-01T01:23:59Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UI Title.gif</title>
    <id>4635</id>
    <revision>
      <id>10565</id>
      <timestamp>2008-04-01T01:23:58Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UnrealEd MainWindowMasked.jpeg</title>
    <id>4680</id>
    <revision>
      <id>10610</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UE3UnrealEd MaterialEditorMasked.jpeg</title>
    <id>3884</id>
    <revision>
      <id>9814</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UED4 Terrainwindow.jpeg</title>
    <id>4626</id>
    <revision>
      <id>10556</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UERF.png</title>
    <id>3961</id>
    <revision>
      <id>9891</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UFontMaterial.gif</title>
    <id>4500</id>
    <revision>
      <id>10430</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UModBrowser.gif</title>
    <id>4162</id>
    <revision>
      <id>10092</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2004.S Door.png</title>
    <id>3978</id>
    <revision>
      <id>9908</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2004.S FlyingPath.png</title>
    <id>3990</id>
    <revision>
      <id>9920</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2004.S Ladder.png</title>
    <id>3948</id>
    <revision>
      <id>9878</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2004.S Pickup.png</title>
    <id>4556</id>
    <revision>
      <id>10486</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2004.S Player.png</title>
    <id>4558</id>
    <revision>
      <id>10488</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2004.S RoadPath.png</title>
    <id>4557</id>
    <revision>
      <id>10487</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2006 15-5-2005a.jpeg</title>
    <id>4021</id>
    <revision>
      <id>9951</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2006 15-5-2005b.jpeg</title>
    <id>4091</id>
    <revision>
      <id>10021</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2006 A.jpeg</title>
    <id>3966</id>
    <revision>
      <id>9896</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2006 B.jpeg</title>
    <id>3971</id>
    <revision>
      <id>9901</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2006-11-8-05.jpeg</title>
    <id>4084</id>
    <revision>
      <id>10014</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UT2KxRegCheck10.jpeg</title>
    <id>4451</id>
    <revision>
      <id>10381</id>
      <timestamp>2008-04-01T01:23:43Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UWBanner1.gif</title>
    <id>4050</id>
    <revision>
      <id>9980</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UnCodeX-2.png</title>
    <id>3909</id>
    <revision>
      <id>9839</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UnCodeX-icon.gif</title>
    <id>4165</id>
    <revision>
      <id>10095</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UnCodeX.png</title>
    <id>3912</id>
    <revision>
      <id>9842</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy UnrealEdClippyhelp.png</title>
    <id>3911</id>
    <revision>
      <id>9841</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Vector1.gif</title>
    <id>4287</id>
    <revision>
      <id>10217</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Vector3.gif</title>
    <id>4350</id>
    <revision>
      <id>10280</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy VegasStyleNetwork.jpeg</title>
    <id>4348</id>
    <revision>
      <id>10278</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy VehiclePathing.jpeg</title>
    <id>3882</id>
    <revision>
      <id>9812</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy VertexTUT EndResult.png</title>
    <id>4052</id>
    <revision>
      <id>9982</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy W3D-Buttons-Prefmenu.jpeg</title>
    <id>4742</id>
    <revision>
      <id>10672</id>
      <timestamp>2008-04-01T01:24:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy W3D-Layout-Numbered.jpeg</title>
    <id>4282</id>
    <revision>
      <id>10212</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Water Drops.jpeg</title>
    <id>3985</id>
    <revision>
      <id>9915</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy Weaponshot.jpeg</title>
    <id>4597</id>
    <revision>
      <id>10527</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ZTerrainLightBug.jpeg</title>
    <id>4658</id>
    <revision>
      <id>10588</id>
      <timestamp>2008-04-01T01:24:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy acb.jpeg</title>
    <id>4131</id>
    <revision>
      <id>10061</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy addlight.jpeg</title>
    <id>4671</id>
    <revision>
      <id>10601</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy antiportal-occlusion-diagram.png</title>
    <id>4613</id>
    <revision>
      <id>10543</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy archconstruction.gif</title>
    <id>4133</id>
    <revision>
      <id>10063</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy archway example.gif</title>
    <id>4120</id>
    <revision>
      <id>10050</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy astut-base.jpeg</title>
    <id>4596</id>
    <revision>
      <id>10526</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy astut-inside.jpeg</title>
    <id>4595</id>
    <revision>
      <id>10525</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy astut-sketch.png</title>
    <id>4575</id>
    <revision>
      <id>10505</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy astut-sketch2.png</title>
    <id>4594</id>
    <revision>
      <id>10524</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy astut-terrain.jpeg</title>
    <id>4592</id>
    <revision>
      <id>10522</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy astut-valley.jpeg</title>
    <id>4589</id>
    <revision>
      <id>10519</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy bilinear mip example.png</title>
    <id>4574</id>
    <revision>
      <id>10504</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy bloodfx1.jpeg</title>
    <id>4107</id>
    <revision>
      <id>10037</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy bloodfx2.jpeg</title>
    <id>4095</id>
    <revision>
      <id>10025</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy bloodfx3.jpeg</title>
    <id>4093</id>
    <revision>
      <id>10023</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy bloodfxfinal.jpeg</title>
    <id>4112</id>
    <revision>
      <id>10042</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy brush sinking.gif</title>
    <id>4541</id>
    <revision>
      <id>10471</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy brushalignbad.jpeg</title>
    <id>4570</id>
    <revision>
      <id>10500</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy brushaligngood.jpeg</title>
    <id>4563</id>
    <revision>
      <id>10493</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy bsp diagram.gif</title>
    <id>4109</id>
    <revision>
      <id>10039</id>
      <timestamp>2008-04-01T01:23:18Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button brush clip.gif</title>
    <id>4342</id>
    <revision>
      <id>10272</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button flip clip.gif</title>
    <id>4343</id>
    <revision>
      <id>10273</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.camera.gif</title>
    <id>4580</id>
    <revision>
      <id>10510</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.clip.gif</title>
    <id>4106</id>
    <revision>
      <id>10036</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.rotate.gif</title>
    <id>4105</id>
    <revision>
      <id>10035</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.scale.gif</title>
    <id>4104</id>
    <revision>
      <id>10034</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.texpan.gif</title>
    <id>4103</id>
    <revision>
      <id>10033</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.texrot.gif</title>
    <id>4102</id>
    <revision>
      <id>10032</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy button.mode.vertex.gif</title>
    <id>4101</id>
    <revision>
      <id>10031</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy camera actor.png</title>
    <id>4210</id>
    <revision>
      <id>10140</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy clip3d.jpeg</title>
    <id>4099</id>
    <revision>
      <id>10029</id>
      <timestamp>2008-04-01T01:23:17Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy clip3d2.jpeg</title>
    <id>4529</id>
    <revision>
      <id>10459</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy combustionnew2.jpeg</title>
    <id>4560</id>
    <revision>
      <id>10490</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy compare 00.jpeg</title>
    <id>4522</id>
    <revision>
      <id>10452</id>
      <timestamp>2008-04-01T01:23:49Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy compare 01.jpeg</title>
    <id>4201</id>
    <revision>
      <id>10131</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy corona.gif</title>
    <id>4097</id>
    <revision>
      <id>10027</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy creative commons-somerights.gif</title>
    <id>4144</id>
    <revision>
      <id>10074</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cubemap-kyubu-cuberef.png</title>
    <id>4139</id>
    <revision>
      <id>10069</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cubemap-kyubu-finaltxt.png</title>
    <id>4140</id>
    <revision>
      <id>10070</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cubemap-kyubu-newenv.png</title>
    <id>4138</id>
    <revision>
      <id>10068</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cubemap-kyubu-newtexture-2.png</title>
    <id>4136</id>
    <revision>
      <id>10066</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cubemap-kyubu-texture.gif</title>
    <id>4023</id>
    <revision>
      <id>9953</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cubemap-kyubu-txtproperties.png</title>
    <id>4137</id>
    <revision>
      <id>10067</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy curved corridor wireframe.gif</title>
    <id>4132</id>
    <revision>
      <id>10062</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cvs-checkout-general.gif</title>
    <id>4738</id>
    <revision>
      <id>10668</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cvs-checkout-globals.gif</title>
    <id>4092</id>
    <revision>
      <id>10022</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cvs-checkout-settings.gif</title>
    <id>4090</id>
    <revision>
      <id>10020</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cvs-commit.gif</title>
    <id>4089</id>
    <revision>
      <id>10019</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy cvs-update.gif</title>
    <id>4088</id>
    <revision>
      <id>10018</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dUc0N-W3Dtutorial2-shape.jpeg</title>
    <id>4288</id>
    <revision>
      <id>10218</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy deadlyfan1.jpeg</title>
    <id>4086</id>
    <revision>
      <id>10016</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy deadlyfan2.jpeg</title>
    <id>4085</id>
    <revision>
      <id>10015</id>
      <timestamp>2008-04-01T01:23:16Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dl-ul-opera-bug.png</title>
    <id>4503</id>
    <revision>
      <id>10433</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dmquadroid-addlights1.gif</title>
    <id>4205</id>
    <revision>
      <id>10135</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dmquadroid-addlights2.gif</title>
    <id>4190</id>
    <revision>
      <id>10120</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dmquadroid-createthecorridors1.gif</title>
    <id>4202</id>
    <revision>
      <id>10132</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dmquadroid-createthecorridors2.gif</title>
    <id>4203</id>
    <revision>
      <id>10133</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy dmquadroid-createtherooms1.gif</title>
    <id>4204</id>
    <revision>
      <id>10134</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Back.png</title>
    <id>4083</id>
    <revision>
      <id>10013</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Front.png</title>
    <id>4079</id>
    <revision>
      <id>10009</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Left.png</title>
    <id>4077</id>
    <revision>
      <id>10007</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Perspectiveselected.png</title>
    <id>4072</id>
    <revision>
      <id>10002</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Right.png</title>
    <id>4070</id>
    <revision>
      <id>10000</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Top.png</title>
    <id>4067</id>
    <revision>
      <id>9997</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog Underneath.png</title>
    <id>4066</id>
    <revision>
      <id>9996</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog blankinterface.png</title>
    <id>4082</id>
    <revision>
      <id>10012</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog bodyiceon.png</title>
    <id>4081</id>
    <revision>
      <id>10011</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog fit.png</title>
    <id>4080</id>
    <revision>
      <id>10010</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog headicon.png</title>
    <id>4078</id>
    <revision>
      <id>10008</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog lit.png</title>
    <id>4076</id>
    <revision>
      <id>10006</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog modelloaded.png</title>
    <id>4075</id>
    <revision>
      <id>10005</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog pan.png</title>
    <id>4074</id>
    <revision>
      <id>10004</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog perspectiveicon.png</title>
    <id>4073</id>
    <revision>
      <id>10003</id>
      <timestamp>2008-04-01T01:23:15Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog projectionpaint.png</title>
    <id>4071</id>
    <revision>
      <id>10001</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog rotate.png</title>
    <id>4069</id>
    <revision>
      <id>9999</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog skinsimported.png</title>
    <id>4068</id>
    <revision>
      <id>9998</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog wireframe.png</title>
    <id>4065</id>
    <revision>
      <id>9995</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy doog zoom.png</title>
    <id>4064</id>
    <revision>
      <id>9994</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy draconx-runeut-configuration.png</title>
    <id>4498</id>
    <revision>
      <id>10428</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy duckingzone-layout.gif</title>
    <id>4063</id>
    <revision>
      <id>9993</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy duckingzone-screenshot.jpeg</title>
    <id>4062</id>
    <revision>
      <id>9992</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy eldhrin-rocketinstagib-redsmokesample.jpeg</title>
    <id>4060</id>
    <revision>
      <id>9990</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy encarcerationpipework.jpeg</title>
    <id>4123</id>
    <revision>
      <id>10053</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy error.jpeg</title>
    <id>4363</id>
    <revision>
      <id>10293</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy extbar newfeatures.png</title>
    <id>4354</id>
    <revision>
      <id>10284</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy extbar.png</title>
    <id>4134</id>
    <revision>
      <id>10064</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy extruder.trim1.gif</title>
    <id>4743</id>
    <revision>
      <id>10673</id>
      <timestamp>2008-04-01T01:24:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fakeSkyBoxMaterial.jpeg</title>
    <id>4736</id>
    <revision>
      <id>10666</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fatm UV2.gif</title>
    <id>4129</id>
    <revision>
      <id>10059</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fatm lightmap.jpeg</title>
    <id>4374</id>
    <revision>
      <id>10304</id>
      <timestamp>2008-04-01T01:23:37Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fatm meshnice.jpeg</title>
    <id>4349</id>
    <revision>
      <id>10279</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fatm meshugly.jpeg</title>
    <id>4183</id>
    <revision>
      <id>10113</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fatm surfacebaker.gif</title>
    <id>4130</id>
    <revision>
      <id>10060</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fatm uvs.gif</title>
    <id>4126</id>
    <revision>
      <id>10056</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy favicon16.png</title>
    <id>4061</id>
    <revision>
      <id>9991</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy favicon32.png</title>
    <id>4059</id>
    <revision>
      <id>9989</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy favicon48.png</title>
    <id>4058</id>
    <revision>
      <id>9988</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy faviconmaster.png</title>
    <id>4191</id>
    <revision>
      <id>10121</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfacealpha1.jpeg</title>
    <id>4057</id>
    <revision>
      <id>9987</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfacealpha2.jpeg</title>
    <id>4496</id>
    <revision>
      <id>10426</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfacealpha3.jpeg</title>
    <id>4497</id>
    <revision>
      <id>10427</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfacealpha4.jpeg</title>
    <id>4476</id>
    <revision>
      <id>10406</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfacealpha5.jpeg</title>
    <id>4207</id>
    <revision>
      <id>10137</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-1.jpeg</title>
    <id>4049</id>
    <revision>
      <id>9979</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-10.jpeg</title>
    <id>4048</id>
    <revision>
      <id>9978</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-11.jpeg</title>
    <id>4047</id>
    <revision>
      <id>9977</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-12.jpeg</title>
    <id>4046</id>
    <revision>
      <id>9976</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-13.jpeg</title>
    <id>4045</id>
    <revision>
      <id>9975</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-14.jpeg</title>
    <id>4044</id>
    <revision>
      <id>9974</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-15.jpeg</title>
    <id>4043</id>
    <revision>
      <id>9973</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-2.jpeg</title>
    <id>4042</id>
    <revision>
      <id>9972</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-3.jpeg</title>
    <id>4041</id>
    <revision>
      <id>9971</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-4.jpeg</title>
    <id>4040</id>
    <revision>
      <id>9970</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-5.jpeg</title>
    <id>4039</id>
    <revision>
      <id>9969</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-6.jpeg</title>
    <id>4038</id>
    <revision>
      <id>9968</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-7.jpeg</title>
    <id>4037</id>
    <revision>
      <id>9967</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-8.jpeg</title>
    <id>4036</id>
    <revision>
      <id>9966</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fluidsurfaces-9.jpeg</title>
    <id>4035</id>
    <revision>
      <id>9965</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy fov.gif</title>
    <id>4002</id>
    <revision>
      <id>9932</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy globalillum fisheye.jpeg</title>
    <id>4616</id>
    <revision>
      <id>10546</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy gui editor screen1.jpeg</title>
    <id>4373</id>
    <revision>
      <id>10303</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy huntlogo.gif</title>
    <id>4289</id>
    <revision>
      <id>10219</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy iconvt6zq.jpeg</title>
    <id>4549</id>
    <revision>
      <id>10479</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ie7sidebar.png</title>
    <id>4608</id>
    <revision>
      <id>10538</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy inio logo.gif</title>
    <id>4200</id>
    <revision>
      <id>10130</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy integration-ie-search-sidebar.gif</title>
    <id>4032</id>
    <revision>
      <id>9962</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy integration-mozilla-search-sidebar.gif</title>
    <id>4031</id>
    <revision>
      <id>9961</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy integration-opera-search-addressbar.gif</title>
    <id>4030</id>
    <revision>
      <id>9960</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy integration-opera-search-addressfield.gif</title>
    <id>4029</id>
    <revision>
      <id>9959</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy integration-opera-search-personalbar.gif</title>
    <id>4028</id>
    <revision>
      <id>9958</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy integration-opera-search-sidebar.gif</title>
    <id>4027</id>
    <revision>
      <id>9957</id>
      <timestamp>2008-04-01T01:23:12Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed2-main.gif</title>
    <id>4676</id>
    <revision>
      <id>10606</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-AddSpecial.png</title>
    <id>3993</id>
    <revision>
      <id>9923</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-AddVolume.png</title>
    <id>3994</id>
    <revision>
      <id>9924</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-CubeBuilder.png</title>
    <id>3906</id>
    <revision>
      <id>9836</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-Subtract.png</title>
    <id>4173</id>
    <revision>
      <id>10103</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-TerrainTool.png</title>
    <id>3915</id>
    <revision>
      <id>9845</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-actorbrowser.png</title>
    <id>3982</id>
    <revision>
      <id>9912</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-actorproperties.png</title>
    <id>4168</id>
    <revision>
      <id>10098</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-animationbrowser.png</title>
    <id>4217</id>
    <revision>
      <id>10147</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-arrays-dynamic-1.png</title>
    <id>4319</id>
    <revision>
      <id>10249</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-arrays-dynamic-2.png</title>
    <id>4320</id>
    <revision>
      <id>10250</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-arrays-static.png</title>
    <id>4321</id>
    <revision>
      <id>10251</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-dynamicarray-1.png</title>
    <id>4332</id>
    <revision>
      <id>10262</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-dynamicarray-2.png</title>
    <id>4333</id>
    <revision>
      <id>10263</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-dynamicarray-inline-1.png</title>
    <id>4307</id>
    <revision>
      <id>10237</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-dynamicarray-inline-2.png</title>
    <id>4308</id>
    <revision>
      <id>10238</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-dynamicarray-inline-3.png</title>
    <id>4309</id>
    <revision>
      <id>10239</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-dynamicarray-inline-4.png</title>
    <id>4311</id>
    <revision>
      <id>10241</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-groupbrowser.png</title>
    <id>4216</id>
    <revision>
      <id>10146</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-inlineobjects-class.png</title>
    <id>4323</id>
    <revision>
      <id>10253</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-inlineobjects-default.png</title>
    <id>4317</id>
    <revision>
      <id>10247</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-inlineobjects-editinline-1.png</title>
    <id>4322</id>
    <revision>
      <id>10252</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-inlineobjects-editinline-2.png</title>
    <id>4324</id>
    <revision>
      <id>10254</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-inlineobjects-editinline-3.png</title>
    <id>4318</id>
    <revision>
      <id>10248</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-inlineobjects-editinlineuse-1.png</title>
    <id>4325</id>
    <revision>
      <id>10255</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-masterbrowser.png</title>
    <id>4296</id>
    <revision>
      <id>10226</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-meshbrowser.png</title>
    <id>4213</id>
    <revision>
      <id>10143</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-musicbrowser.png</title>
    <id>4215</id>
    <revision>
      <id>10145</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-prefabbrowser.png</title>
    <id>4218</id>
    <revision>
      <id>10148</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-bool.png</title>
    <id>4326</id>
    <revision>
      <id>10256</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-byte.png</title>
    <id>4328</id>
    <revision>
      <id>10258</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-color.png</title>
    <id>4330</id>
    <revision>
      <id>10260</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-resource.png</title>
    <id>4197</id>
    <revision>
      <id>10127</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-simple.png</title>
    <id>4327</id>
    <revision>
      <id>10257</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-struct.png</title>
    <id>4329</id>
    <revision>
      <id>10259</id>
      <timestamp>2008-04-01T01:23:33Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-subobjectlist.png</title>
    <id>4199</id>
    <revision>
      <id>10129</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-propertywidgets-subobjectname.png</title>
    <id>4198</id>
    <revision>
      <id>10128</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-soundbrowser-import.png</title>
    <id>4572</id>
    <revision>
      <id>10502</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-soundbrowser.png</title>
    <id>4214</id>
    <revision>
      <id>10144</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-staticmeshbrowser.png</title>
    <id>4169</id>
    <revision>
      <id>10099</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-surface-align.png</title>
    <id>4026</id>
    <revision>
      <id>9956</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-surface-flag.png</title>
    <id>3916</id>
    <revision>
      <id>9846</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-surface-pan.png</title>
    <id>4025</id>
    <revision>
      <id>9955</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-texturebrowser.png</title>
    <id>4024</id>
    <revision>
      <id>9954</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-Ed3-viewportbar.png</title>
    <id>4010</id>
    <revision>
      <id>9940</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface-surfaceflagstab.png</title>
    <id>4022</id>
    <revision>
      <id>9952</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.2DToolbar.gif</title>
    <id>4020</id>
    <revision>
      <id>9950</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.Ed3.console.png</title>
    <id>4147</id>
    <revision>
      <id>10077</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.Ed3.textureimport.png</title>
    <id>4166</id>
    <revision>
      <id>10096</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.consolebar.gif</title>
    <id>3992</id>
    <revision>
      <id>9922</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.main.jpeg</title>
    <id>4019</id>
    <revision>
      <id>9949</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.toolbar.png</title>
    <id>4018</id>
    <revision>
      <id>9948</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.toolbox.BrushOperations.png</title>
    <id>4016</id>
    <revision>
      <id>9946</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.toolbox.brushGlipGr.gif</title>
    <id>4017</id>
    <revision>
      <id>9947</id>
      <timestamp>2008-04-01T01:23:11Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.toolbox.defbuilders.gif</title>
    <id>4015</id>
    <revision>
      <id>9945</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.toolbox.modes.png</title>
    <id>4014</id>
    <revision>
      <id>9944</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.toolbox.visibility.gif</title>
    <id>4013</id>
    <revision>
      <id>9943</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interface.viewporttitlebar.brighter.gif</title>
    <id>4012</id>
    <revision>
      <id>9942</id>
      <timestamp>2008-04-01T01:23:10Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy interpolation-smerp.gif</title>
    <id>3899</id>
    <revision>
      <id>9829</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-arena-1-talaeron.jpeg</title>
    <id>4513</id>
    <revision>
      <id>10443</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-execution-1-dildo.jpeg</title>
    <id>4737</id>
    <revision>
      <id>10667</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-general-1-phobos.jpeg</title>
    <id>4505</id>
    <revision>
      <id>10435</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-general-2-gauntlet.jpeg</title>
    <id>4506</id>
    <revision>
      <id>10436</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-jails-1-alcatraz.jpeg</title>
    <id>4507</id>
    <revision>
      <id>10437</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-jails-2-castlebreak.jpeg</title>
    <id>4508</id>
    <revision>
      <id>10438</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-jails-3-cavern.jpeg</title>
    <id>4509</id>
    <revision>
      <id>10439</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-risk-1-castlebreak.jpeg</title>
    <id>4510</id>
    <revision>
      <id>10440</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-risk-2-indusrage.jpeg</title>
    <id>4511</id>
    <revision>
      <id>10441</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jailbreak-mapping-risk-3-relic.jpeg</title>
    <id>4512</id>
    <revision>
      <id>10442</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy joefish bobo cutscene.jpeg</title>
    <id>3977</id>
    <revision>
      <id>9907</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy joefish bobo plaza.jpeg</title>
    <id>3980</id>
    <revision>
      <id>9910</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy joefish bobo view.jpeg</title>
    <id>3987</id>
    <revision>
      <id>9917</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy jrm macrotexts.gif</title>
    <id>4347</id>
    <revision>
      <id>10277</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy kagato carjack sketch.jpeg</title>
    <id>4305</id>
    <revision>
      <id>10235</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy kagato morningstar banner.gif</title>
    <id>4297</id>
    <revision>
      <id>10227</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy kagato yog-sothoth mockup.jpeg</title>
    <id>4306</id>
    <revision>
      <id>10236</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy la archi 02.jpeg</title>
    <id>4745</id>
    <revision>
      <id>10675</id>
      <timestamp>2008-04-01T01:24:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy la terrain trouble grid.jpeg</title>
    <id>4518</id>
    <revision>
      <id>10448</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy la terrain trouble.jpeg</title>
    <id>4517</id>
    <revision>
      <id>10447</id>
      <timestamp>2008-04-01T01:23:48Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy laddervolume.gif</title>
    <id>3991</id>
    <revision>
      <id>9921</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy legaltoon goblin bsphole.gif</title>
    <id>4148</id>
    <revision>
      <id>10078</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy legalwork marker.gif</title>
    <id>3997</id>
    <revision>
      <id>9927</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy legalwork me163.gif</title>
    <id>4008</id>
    <revision>
      <id>9938</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy legalwork terra step1.gif</title>
    <id>3901</id>
    <revision>
      <id>9831</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy legalwork ttrwork mapref.gif</title>
    <id>4502</id>
    <revision>
      <id>10432</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy light.cylinder.gif</title>
    <id>4290</id>
    <revision>
      <id>10220</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy light.disco.gif</title>
    <id>4291</id>
    <revision>
      <id>10221</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy light.interference.gif</title>
    <id>4292</id>
    <revision>
      <id>10222</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy light.nonincidence.gif</title>
    <id>4293</id>
    <revision>
      <id>10223</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy light.shell.gif</title>
    <id>4294</id>
    <revision>
      <id>10224</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy light.steady.gif</title>
    <id>4295</id>
    <revision>
      <id>10225</id>
      <timestamp>2008-04-01T01:23:31Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lightwave.jpeg</title>
    <id>3913</id>
    <revision>
      <id>9843</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lodcheat1.jpeg</title>
    <id>4357</id>
    <revision>
      <id>10287</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lodcheat2.jpeg</title>
    <id>4358</id>
    <revision>
      <id>10288</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lodcheat3.jpeg</title>
    <id>4359</id>
    <revision>
      <id>10289</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lodcheat4.jpeg</title>
    <id>4360</id>
    <revision>
      <id>10290</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lodcheat5.jpeg</title>
    <id>4361</id>
    <revision>
      <id>10291</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy lodcheat6.jpeg</title>
    <id>4362</id>
    <revision>
      <id>10292</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy makingglass.2.gif</title>
    <id>4005</id>
    <revision>
      <id>9935</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy matinee1.jpeg</title>
    <id>4004</id>
    <revision>
      <id>9934</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy matinee2.jpeg</title>
    <id>4003</id>
    <revision>
      <id>9933</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy matinee3.jpeg</title>
    <id>4001</id>
    <revision>
      <id>9931</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy matinee4.jpeg</title>
    <id>4000</id>
    <revision>
      <id>9930</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy memeselfandthegoblin.gif</title>
    <id>4160</id>
    <revision>
      <id>10090</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy meshmaker-polysegmentation.gif</title>
    <id>3999</id>
    <revision>
      <id>9929</id>
      <timestamp>2008-04-01T01:23:09Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy mychaeel-ut2003midgamemenu.jpeg</title>
    <id>4355</id>
    <revision>
      <id>10285</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy myth terrain layer1.jpeg</title>
    <id>4128</id>
    <revision>
      <id>10058</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy myth terrain layer2.jpeg</title>
    <id>4152</id>
    <revision>
      <id>10082</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy nick89 jedit.jpeg</title>
    <id>3900</id>
    <revision>
      <id>9830</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy noodles base wip.jpeg</title>
    <id>4367</id>
    <revision>
      <id>10297</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy noodles intro rain.jpeg</title>
    <id>4504</id>
    <revision>
      <id>10434</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy normal to a line 01.png</title>
    <id>4153</id>
    <revision>
      <id>10083</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy nwn-import-scale.jpeg</title>
    <id>3928</id>
    <revision>
      <id>9858</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy nwn-import-spider.jpeg</title>
    <id>4154</id>
    <revision>
      <id>10084</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy orthogonal.vertexedit.boxed.gif</title>
    <id>4538</id>
    <revision>
      <id>10468</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy orthogonal.vertexedit.selected.gif</title>
    <id>4537</id>
    <revision>
      <id>10467</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy orthogonal.vertexedit.selecting.gif</title>
    <id>3986</id>
    <revision>
      <id>9916</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy panoramic 2.jpeg</title>
    <id>4617</id>
    <revision>
      <id>10547</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pass final.jpeg</title>
    <id>4623</id>
    <revision>
      <id>10553</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pass gi.jpeg</title>
    <id>4622</id>
    <revision>
      <id>10552</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pass light.jpeg</title>
    <id>4619</id>
    <revision>
      <id>10549</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pass materials.jpeg</title>
    <id>4618</id>
    <revision>
      <id>10548</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pass softlight.jpeg</title>
    <id>4620</id>
    <revision>
      <id>10550</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pass volumetric.jpeg</title>
    <id>4621</id>
    <revision>
      <id>10551</id>
      <timestamp>2008-04-01T01:23:57Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pdGrid1.jpeg</title>
    <id>4192</id>
    <revision>
      <id>10122</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pdGrid2.jpeg</title>
    <id>4193</id>
    <revision>
      <id>10123</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pdGrid3.jpeg</title>
    <id>4194</id>
    <revision>
      <id>10124</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pdGrid4.jpeg</title>
    <id>4195</id>
    <revision>
      <id>10125</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pdGrid5-2.jpeg</title>
    <id>4196</id>
    <revision>
      <id>10126</id>
      <timestamp>2008-04-01T01:23:24Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pgDebugLog.jpeg</title>
    <id>4609</id>
    <revision>
      <id>10539</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy pigLT logo.jpeg</title>
    <id>4163</id>
    <revision>
      <id>10093</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy playerstartacb.png</title>
    <id>4188</id>
    <revision>
      <id>10118</id>
      <timestamp>2008-04-01T01:23:23Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy polymerge.shape1.gif</title>
    <id>3984</id>
    <revision>
      <id>9914</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy projectilefireflow.jpeg</title>
    <id>4142</id>
    <revision>
      <id>10072</id>
      <timestamp>2008-04-01T01:23:20Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy projectortrick2.jpeg</title>
    <id>4226</id>
    <revision>
      <id>10156</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake01.gif</title>
    <id>4334</id>
    <revision>
      <id>10264</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake02.gif</title>
    <id>4335</id>
    <revision>
      <id>10265</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake03.gif</title>
    <id>4336</id>
    <revision>
      <id>10266</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake04.gif</title>
    <id>4337</id>
    <revision>
      <id>10267</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake05.gif</title>
    <id>4338</id>
    <revision>
      <id>10268</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake06.gif</title>
    <id>4339</id>
    <revision>
      <id>10269</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake07.gif</title>
    <id>4340</id>
    <revision>
      <id>10270</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rampmake08.gif</title>
    <id>4341</id>
    <revision>
      <id>10271</id>
      <timestamp>2008-04-01T01:23:34Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy real.light1.jpeg</title>
    <id>4219</id>
    <revision>
      <id>10149</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy real.light2.jpeg</title>
    <id>4220</id>
    <revision>
      <id>10150</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy real.light3.jpeg</title>
    <id>4221</id>
    <revision>
      <id>10151</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy recruitment-programmer-flowchart.png</title>
    <id>4167</id>
    <revision>
      <id>10097</id>
      <timestamp>2008-04-01T01:23:22Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy roomrender color.jpeg</title>
    <id>4615</id>
    <revision>
      <id>10545</id>
      <timestamp>2008-04-01T01:23:56Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ropengl.jpeg</title>
    <id>4605</id>
    <revision>
      <id>10535</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ropenglprev.jpeg</title>
    <id>4607</id>
    <revision>
      <id>10537</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rotatedtext-screenshot.jpg</title>
    <id>3981</id>
    <revision>
      <id>9911</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rtshotA.jpeg</title>
    <id>4551</id>
    <revision>
      <id>10481</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rtshotB.jpeg</title>
    <id>4552</id>
    <revision>
      <id>10482</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rtshotC.jpeg</title>
    <id>4553</id>
    <revision>
      <id>10483</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rtshotD.jpeg</title>
    <id>4554</id>
    <revision>
      <id>10484</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rtshotE.jpeg</title>
    <id>4555</id>
    <revision>
      <id>10485</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rtshotF.jpeg</title>
    <id>4675</id>
    <revision>
      <id>10605</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy rvmp3player.jpeg</title>
    <id>4606</id>
    <revision>
      <id>10536</id>
      <timestamp>2008-04-01T01:23:55Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scoreboard msgproperties.png</title>
    <id>4576</id>
    <revision>
      <id>10506</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scoreboard panner.png</title>
    <id>4577</id>
    <revision>
      <id>10507</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scoreboard preview.jpeg</title>
    <id>4578</id>
    <revision>
      <id>10508</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scoreboard scripted.png</title>
    <id>4579</id>
    <revision>
      <id>10509</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedTex1.jpeg</title>
    <id>4310</id>
    <revision>
      <id>10240</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedTex2.jpeg</title>
    <id>4312</id>
    <revision>
      <id>10242</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedTex3.jpeg</title>
    <id>4313</id>
    <revision>
      <id>10243</id>
      <timestamp>2008-04-01T01:23:32Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.brutes.jpeg</title>
    <id>3979</id>
    <revision>
      <id>9909</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.krall.jpeg</title>
    <id>3976</id>
    <revision>
      <id>9906</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.mercenaries.jpeg</title>
    <id>3974</id>
    <revision>
      <id>9904</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.nali.jpeg</title>
    <id>3973</id>
    <revision>
      <id>9903</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.nalicows.jpeg</title>
    <id>3972</id>
    <revision>
      <id>9902</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.queen.jpeg</title>
    <id>3970</id>
    <revision>
      <id>9900</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.sktroopers.jpeg</title>
    <id>3969</id>
    <revision>
      <id>9899</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.skwarriors.jpeg</title>
    <id>3968</id>
    <revision>
      <id>9898</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.slith.jpeg</title>
    <id>3967</id>
    <revision>
      <id>9897</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.squid.png</title>
    <id>4143</id>
    <revision>
      <id>10073</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.twoskaarj.jpeg</title>
    <id>3965</id>
    <revision>
      <id>9895</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedpawn.warlord.jpeg</title>
    <id>3964</id>
    <revision>
      <id>9894</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtexture-newtexture.gif</title>
    <id>3963</id>
    <revision>
      <id>9893</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtexture-textureproperties.gif</title>
    <id>3962</id>
    <revision>
      <id>9892</id>
      <timestamp>2008-04-01T01:23:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger2.jpeg</title>
    <id>3960</id>
    <revision>
      <id>9890</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger3.jpeg</title>
    <id>3959</id>
    <revision>
      <id>9889</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger4.jpeg</title>
    <id>3958</id>
    <revision>
      <id>9888</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger5.jpeg</title>
    <id>3957</id>
    <revision>
      <id>9887</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger6.jpeg</title>
    <id>3956</id>
    <revision>
      <id>9886</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger7.jpeg</title>
    <id>3955</id>
    <revision>
      <id>9885</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy scriptedtrigger8.jpeg</title>
    <id>3954</id>
    <revision>
      <id>9884</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy semisolid.example.roundedcorner.gif</title>
    <id>3953</id>
    <revision>
      <id>9883</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy shinymap.jpeg</title>
    <id>3951</id>
    <revision>
      <id>9881</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy showverticles5no.jpeg</title>
    <id>4539</id>
    <revision>
      <id>10469</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy shurikentex.jpeg</title>
    <id>4276</id>
    <revision>
      <id>10206</id>
      <timestamp>2008-04-01T01:23:30Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sm WastelandHardware.jpeg</title>
    <id>4477</id>
    <revision>
      <id>10407</id>
      <timestamp>2008-04-01T01:23:45Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sm WeaponStaticMesh.jpeg</title>
    <id>3947</id>
    <revision>
      <id>9877</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sm XGame StaticMeshes.jpeg</title>
    <id>3944</id>
    <revision>
      <id>9874</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sm XceptOneObjA.jpeg</title>
    <id>3945</id>
    <revision>
      <id>9875</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sm cf de.jpeg</title>
    <id>3949</id>
    <revision>
      <id>9879</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sm wm meshes.jpeg</title>
    <id>3946</id>
    <revision>
      <id>9876</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy sourced player shadows 1.jpeg</title>
    <id>4149</id>
    <revision>
      <id>10079</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy speechmenuhack-ordermenu.jpeg</title>
    <id>4145</id>
    <revision>
      <id>10075</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy speechmenuhack-tacticsmenu.jpeg</title>
    <id>4146</id>
    <revision>
      <id>10076</id>
      <timestamp>2008-04-01T01:23:21Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spine rpipe 1.jpeg</title>
    <id>3943</id>
    <revision>
      <id>9873</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spine rpipe 2.jpeg</title>
    <id>3942</id>
    <revision>
      <id>9872</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spine rpipe 3.jpeg</title>
    <id>3941</id>
    <revision>
      <id>9871</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spine rpipe 4.jpeg</title>
    <id>3940</id>
    <revision>
      <id>9870</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spine rpipe 5.jpeg</title>
    <id>3939</id>
    <revision>
      <id>9869</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spline pipe 1.jpeg</title>
    <id>3938</id>
    <revision>
      <id>9868</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spline pipe 2.jpeg</title>
    <id>3937</id>
    <revision>
      <id>9867</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy spline pipe 3.jpeg</title>
    <id>3936</id>
    <revision>
      <id>9866</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy stair.gif</title>
    <id>3934</id>
    <revision>
      <id>9864</id>
      <timestamp>2008-04-01T01:23:04Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy stairsconstruction.gif</title>
    <id>3933</id>
    <revision>
      <id>9863</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy supports.jpeg</title>
    <id>3932</id>
    <revision>
      <id>9862</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy symmo framework.png</title>
    <id>4573</id>
    <revision>
      <id>10503</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy texture filter example bilinear.png</title>
    <id>4545</id>
    <revision>
      <id>10475</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy texture filter example point.png</title>
    <id>4544</id>
    <revision>
      <id>10474</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy texture filter example small.png</title>
    <id>4543</id>
    <revision>
      <id>10473</id>
      <timestamp>2008-04-01T01:23:50Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy textureScale.gif</title>
    <id>4741</id>
    <revision>
      <id>10671</id>
      <timestamp>2008-04-01T01:24:06Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy thislevelwithlotsofammo-2.jpeg</title>
    <id>4356</id>
    <revision>
      <id>10286</id>
      <timestamp>2008-04-01T01:23:35Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy toofar.jpeg</title>
    <id>4127</id>
    <revision>
      <id>10057</id>
      <timestamp>2008-04-01T01:23:19Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy tools.texture replace.jpeg</title>
    <id>3927</id>
    <revision>
      <id>9857</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy triggermachine.timedlight.gif</title>
    <id>3926</id>
    <revision>
      <id>9856</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy trilinear mip example.png</title>
    <id>3924</id>
    <revision>
      <id>9854</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy tutorial-terrain-10-Flat-Terrain-Wireframe.jpeg</title>
    <id>3914</id>
    <revision>
      <id>9844</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy tutorial-terrain-13-Select-Walls.jpeg</title>
    <id>3907</id>
    <revision>
      <id>9837</id>
      <timestamp>2008-04-01T01:23:02Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy tutorial-terrain-16-SunLight-FrontView.jpeg</title>
    <id>3903</id>
    <revision>
      <id>9833</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy tutorial-terrain-17-Flat-Terrain-Dynamic-Lig.jpeg</title>
    <id>3902</id>
    <revision>
      <id>9832</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy udg2 preview.png</title>
    <id>4211</id>
    <revision>
      <id>10141</id>
      <timestamp>2008-04-01T01:23:25Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy uebannera.jpeg</title>
    <id>4571</id>
    <revision>
      <id>10501</id>
      <timestamp>2008-04-01T01:23:52Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy uedt 1t.png</title>
    <id>4548</id>
    <revision>
      <id>10478</id>
      <timestamp>2008-04-01T01:23:51Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy uglyskaarj.jpeg</title>
    <id>4371</id>
    <revision>
      <id>10301</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ukb1.jpeg</title>
    <id>4501</id>
    <revision>
      <id>10431</id>
      <timestamp>2008-04-01T01:23:47Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unlit surface.png</title>
    <id>3929</id>
    <revision>
      <id>9859</id>
      <timestamp>2008-04-01T01:23:03Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unlit.light.mask.on.surface1.jpeg</title>
    <id>4222</id>
    <revision>
      <id>10152</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unlit.light.mask.on.surface2.jpeg</title>
    <id>4223</id>
    <revision>
      <id>10153</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unlit.light.mask.on.surface3.jpeg</title>
    <id>4224</id>
    <revision>
      <id>10154</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unlit.light.mask.on.surface4.jpeg</title>
    <id>4225</id>
    <revision>
      <id>10155</id>
      <timestamp>2008-04-01T01:23:26Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unrealed-newclass.gif</title>
    <id>3897</id>
    <revision>
      <id>9827</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy unrealwiki.gif</title>
    <id>3883</id>
    <revision>
      <id>9813</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy userfriendly-modstartups-concept.gif</title>
    <id>3895</id>
    <revision>
      <id>9825</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy userfriendly-modstartups-ideas.gif</title>
    <id>3894</id>
    <revision>
      <id>9824</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy usfb fig 1 1.gif</title>
    <id>3952</id>
    <revision>
      <id>9882</id>
      <timestamp>2008-04-01T01:23:05Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy usrender v1 00.jpeg</title>
    <id>3975</id>
    <revision>
      <id>9905</id>
      <timestamp>2008-04-01T01:23:07Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy usrender v2 00.jpeg</title>
    <id>4587</id>
    <revision>
      <id>10517</id>
      <timestamp>2008-04-01T01:23:53Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy usrender v2 01.jpeg</title>
    <id>4588</id>
    <revision>
      <id>10518</id>
      <timestamp>2008-04-01T01:23:54Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ut2003-modsummit-groupshot.jpeg</title>
    <id>3893</id>
    <revision>
      <id>9823</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ut2003-modsummit-mychaeel.jpeg</title>
    <id>3892</id>
    <revision>
      <id>9822</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ut2k3windows1.jpeg</title>
    <id>3890</id>
    <revision>
      <id>9820</id>
      <timestamp>2008-04-01T01:23:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ut2k3windows2.jpeg</title>
    <id>3889</id>
    <revision>
      <id>9819</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ut2k3windows3.jpeg</title>
    <id>3888</id>
    <revision>
      <id>9818</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy ut99regfix.png</title>
    <id>4053</id>
    <revision>
      <id>9983</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy uwindow-scrollingcredits.gif</title>
    <id>3887</id>
    <revision>
      <id>9817</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy vector2d.gif</title>
    <id>3886</id>
    <revision>
      <id>9816</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy vectors-AorienttoB.png</title>
    <id>4369</id>
    <revision>
      <id>10299</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy vectors-AtoB.png</title>
    <id>4368</id>
    <revision>
      <id>10298</id>
      <timestamp>2008-04-01T01:23:36Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy volumebutton.jpeg</title>
    <id>3885</id>
    <revision>
      <id>9815</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy warpzone example.gif</title>
    <id>3995</id>
    <revision>
      <id>9925</id>
      <timestamp>2008-04-01T01:23:08Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy wikilogo-small.jpeg</title>
    <id>4672</id>
    <revision>
      <id>10602</id>
      <timestamp>2008-04-01T01:24:01Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy wotgreal-createsubclass.png</title>
    <id>3881</id>
    <revision>
      <id>9811</id>
      <timestamp>2008-04-01T01:23:00Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy wxUnrilities.png</title>
    <id>4051</id>
    <revision>
      <id>9981</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy zone-badzone.jpeg</title>
    <id>4054</id>
    <revision>
      <id>9984</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy zoning portalsizematters.jpeg</title>
    <id>4056</id>
    <revision>
      <id>9986</id>
      <timestamp>2008-04-01T01:23:14Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:Legacy zoning-optimization-example.png</title>
    <id>4055</id>
    <revision>
      <id>9985</id>
      <timestamp>2008-04-01T01:23:13Z</timestamp>
      <contributor>
        <ip>Maintenance script</ip>
      </contributor>
      <comment>{{Legacy image}}</comment>
      <text xml:space="preserve">{{Legacy image}}</text>
    </revision>
  </page>
  <page>
    <title>File:LegacyBackground.png</title>
    <id>202</id>
    <revision>
      <id>784</id>
      <timestamp>2008-03-11T13:05:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Background image for pages in the [[ProjecT:Namespace#Legacy|legacy namespace]].</comment>
      <text xml:space="preserve">Background image for pages in the [[ProjecT:Namespace#Legacy|legacy namespace]].</text>
    </revision>
    <revision>
      <id>785</id>
      <timestamp>2008-03-11T13:18:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:LegacyBackground.png]]&quot;</comment>
      <text xml:space="preserve">Background image for pages in the [[ProjecT:Namespace#Legacy|legacy namespace]].</text>
    </revision>
    <revision>
      <id>786</id>
      <timestamp>2008-03-11T13:21:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:LegacyBackground.png]]&quot;</comment>
      <text xml:space="preserve">Background image for pages in the [[ProjecT:Namespace#Legacy|legacy namespace]].</text>
    </revision>
    <revision>
      <id>841</id>
      <timestamp>2008-03-12T11:17:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Background image for pages in the [[Project:Namespaces#Legacy|legacy namespace]].</text>
    </revision>
  </page>
  <page>
    <title>File:LoadFiles.png</title>
    <id>29215</id>
    <revision>
      <id>44161</id>
      <timestamp>2010-12-11T12:56:21Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>A Kismet sequence I put together for my tutorial about the UltimateSaveSystem.</comment>
      <text xml:space="preserve">== Beschreibung ==
A Kismet sequence I put together for my tutorial about the UltimateSaveSystem.
== Licensing: ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:M-en-pagetabs.png</title>
    <id>81</id>
    <revision>
      <id>182</id>
      <timestamp>2007-09-18T18:43:50Z</timestamp>
      <contributor>
        <ip>Kaganer</ip>
      </contributor>
      <comment>{{GPL}}-&gt;{{PD}} (as all help pages)</comment>
      <text xml:space="preserve">== Summary ==
Example page tabs screenshot for use in public domain help pages.

I grabbed this image and release it to the public domain, assuming that Mediawiki does not impose any restrictions   on screenshots.

== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>183</id>
      <timestamp>2008-02-18T18:42:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">== Summary ==
Example page tabs screenshot for use in public domain help pages.

I grabbed this image and release it to the public domain, assuming that Mediawiki does not impose any restrictions   on screenshots.

== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>227</id>
      <timestamp>2008-02-18T20:22:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded &quot;[[Image:M-en-pagetabs.png]]&quot;</comment>
      <text xml:space="preserve">== Summary ==
Example page tabs screenshot for use in public domain help pages.

I grabbed this image and release it to the public domain, assuming that Mediawiki does not impose any restrictions   on screenshots.

== Licensing ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:M-en-recentchanges.png</title>
    <id>82</id>
    <revision>
      <id>184</id>
      <timestamp>2005-09-07T07:59:58Z</timestamp>
      <contributor>
        <ip>Elian</ip>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>185</id>
      <timestamp>2008-02-18T18:42:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>228</id>
      <timestamp>2008-02-18T20:22:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded &quot;[[Image:M-en-recentchanges.png]]&quot;</comment>
      <text xml:space="preserve">== Licensing ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:M-en-sidebar.png</title>
    <id>79</id>
    <revision>
      <id>178</id>
      <timestamp>2007-08-01T03:56:00Z</timestamp>
      <contributor>
        <ip>OsamaK</ip>
      </contributor>
      <comment>GPL</comment>
      <text xml:space="preserve">Screenshot of MediaWiki sidebar 
{{GPL}}</text>
    </revision>
    <revision>
      <id>179</id>
      <timestamp>2008-02-18T18:42:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">Screenshot of MediaWiki sidebar 
{{GPL}}</text>
    </revision>
    <revision>
      <id>225</id>
      <timestamp>2008-02-18T20:21:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded &quot;[[Image:M-en-sidebar.png]]&quot;</comment>
      <text xml:space="preserve">Screenshot of MediaWiki sidebar 
{{GPL}}</text>
    </revision>
  </page>
  <page>
    <title>File:M-en-userlinks.png</title>
    <id>80</id>
    <revision>
      <id>180</id>
      <timestamp>2006-11-28T11:11:20Z</timestamp>
      <contributor>
        <ip>Bdk</ip>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/87.230.124.129|87.230.124.129]] ([[User_talk:87.230.124.129|Talk]]); changed back to last version by [[User:Bdk|Bdk]]</comment>
      <text xml:space="preserve">== Summary ==
Example user links screenshot for use in public domain help pages.

I grabbed this image and release it to the public domain, assuming that mediawiki does not impose any restrictions on screenshots.
== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>181</id>
      <timestamp>2008-02-18T18:42:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">== Summary ==
Example user links screenshot for use in public domain help pages.

I grabbed this image and release it to the public domain, assuming that mediawiki does not impose any restrictions on screenshots.
== Licensing ==
{{PD}}</text>
    </revision>
    <revision>
      <id>226</id>
      <timestamp>2008-02-18T20:22:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded &quot;[[Image:M-en-userlinks.png]]&quot;</comment>
      <text xml:space="preserve">== Summary ==
Example user links screenshot for use in public domain help pages.

I grabbed this image and release it to the public domain, assuming that mediawiki does not impose any restrictions on screenshots.
== Licensing ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:Monobook-noir-alpha3.gif</title>
    <id>28687</id>
    <revision>
      <id>40616</id>
      <timestamp>2010-01-16T23:53:31Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>An example of what the theme looks like.</comment>
      <text xml:space="preserve">An example of what the theme looks like.</text>
    </revision>
    <revision>
      <id>43066</id>
      <timestamp>2010-04-22T20:24:05Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[File:Monobook-noir-alpha3.gif]]&quot;</comment>
      <text xml:space="preserve">An example of what the theme looks like.</text>
    </revision>
    <revision>
      <id>43083</id>
      <timestamp>2010-04-23T19:36:01Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[File:Monobook-noir-alpha3.gif]]&quot;</comment>
      <text xml:space="preserve">An example of what the theme looks like.</text>
    </revision>
  </page>
  <page>
    <title>File:Official gnu.png</title>
    <id>277</id>
    <revision>
      <id>1036</id>
      <timestamp>2008-03-20T14:19:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Official GNU head from http://www.gnu.org/graphics/gnusvgart.html</comment>
      <text xml:space="preserve">== Summary ==
Official GNU head from http://www.gnu.org/graphics/gnusvgart.html
== Licensing ==
{{FAL}}</text>
    </revision>
  </page>
  <page>
    <title>File:OldWikiIcon.png</title>
    <id>28231</id>
    <revision>
      <id>39837</id>
      <timestamp>2009-11-14T09:36:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Link icon to the [[Projecti:Namespaces#Legacy|Legacy namespace]].</comment>
      <text xml:space="preserve">Link icon to the [[Projecti:Namespaces#Legacy|Legacy namespace]].</text>
    </revision>
    <revision>
      <id>39839</id>
      <timestamp>2009-11-14T09:41:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[File:OldWikiIcon.png]]&quot;</comment>
      <text xml:space="preserve">Link icon to the [[Projecti:Namespaces#Legacy|Legacy namespace]].</text>
    </revision>
    <revision>
      <id>39845</id>
      <timestamp>2009-11-14T09:53:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>typo in link</comment>
      <text xml:space="preserve">Link icon to the [[Project:Namespaces#Legacy|Legacy namespace]].</text>
    </revision>
  </page>
  <page>
    <title>File:Oldwikilogo.png</title>
    <id>187</id>
    <revision>
      <id>706</id>
      <timestamp>2008-03-07T13:08:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Smaller PNG/alpha'd version of the old Unreal Wiki logo.</comment>
      <text xml:space="preserve">Smaller PNG/alpha'd version of the old Unreal Wiki logo.</text>
    </revision>
  </page>
  <page>
    <title>File:PD-icon.png</title>
    <id>88</id>
    <revision>
      <id>245</id>
      <timestamp>2008-02-19T16:17:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">== Summary ==

== Copyright status ==
{{PD}}
== Source ==</text>
    </revision>
  </page>
  <page>
    <title>File:Redirectltr.png</title>
    <id>5074</id>
    <revision>
      <id>11736</id>
      <timestamp>2008-05-05T12:24:22Z</timestamp>
      <contributor>
        <username>Azrael</username>
        <id>455</id>
      </contributor>
      <comment>Redirect Image used in Wikipedia.</comment>
      <text xml:space="preserve">== Summary ==
Redirect Image used in Wikipedia.
== Licensing ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:Result CustomLoginMenuTabs (UT2004).PNG</title>
    <id>28980</id>
    <revision>
      <id>43392</id>
      <timestamp>2010-05-30T00:29:09Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:RevengeTempt.png</title>
    <id>29393</id>
    <revision>
      <id>45043</id>
      <timestamp>2012-03-06T10:55:09Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>This is the wizard picture for the NSIS theme.</comment>
      <text xml:space="preserve">== Summary ==
This is the wizard picture for the NSIS theme.
== Licensing: ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:S ZoneInfo.png</title>
    <id>24017</id>
    <revision>
      <id>33633</id>
      <timestamp>2008-12-14T12:16:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The default icon for the {{classgames|ZoneInfo}} class.</comment>
      <text xml:space="preserve">The default icon for the {{classgames|ZoneInfo}} class.</text>
    </revision>
  </page>
  <page>
    <title>File:SaveFiles.png</title>
    <id>29214</id>
    <revision>
      <id>44160</id>
      <timestamp>2010-12-11T12:55:56Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>A Kismet sequence I put together for my tutorial about the UltimateSaveSystem.</comment>
      <text xml:space="preserve">== Beschreibung ==
A Kismet sequence I put together for my tutorial about the UltimateSaveSystem.
== Licensing: ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:SaveSystemKismet.png</title>
    <id>29219</id>
    <revision>
      <id>44167</id>
      <timestamp>2010-12-12T01:58:57Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>Preview of all Kismet-SeqActions of my SaveSystem</comment>
      <text xml:space="preserve">== Beschreibung ==
Preview of all Kismet-SeqActions of my SaveSystem
== Licensing: ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:SaveSystemTestMap.jpg</title>
    <id>29218</id>
    <revision>
      <id>44164</id>
      <timestamp>2010-12-11T13:33:57Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>A test level I quickly put together in the UDK to show how to use my UltimateSaveSystem in order to let the player respawn at a checkpoint read from a file.</comment>
      <text xml:space="preserve">== Beschreibung ==
A test level I quickly put together in the UDK to show how to use my UltimateSaveSystem in order to let the player respawn at a checkpoint read from a file.
== Licensing: ==
{{CC-by-sa-3.0}}</text>
    </revision>
    <revision>
      <id>44165</id>
      <timestamp>2010-12-11T13:37:35Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[File:SaveSystemTestMap.jpg]]&quot;:&amp;#32;Slightly better quality.</comment>
      <text xml:space="preserve">== Beschreibung ==
A test level I quickly put together in the UDK to show how to use my UltimateSaveSystem in order to let the player respawn at a checkpoint read from a file.
== Licensing: ==
{{CC-by-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:Sequence Placeholder.png</title>
    <id>29313</id>
    <revision>
      <id>44903</id>
      <timestamp>2012-02-09T18:59:40Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Singly-linked-list.png</title>
    <id>24160</id>
    <revision>
      <id>34465</id>
      <timestamp>2009-06-02T09:25:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Diagram of a singly-linked linear list from [[wp:File:Singly-linked-list.svg]]</comment>
      <text xml:space="preserve">== Summary ==
Diagram of a singly-linked linear list from [[wp:File:Singly-linked-list.svg]]
== Licensing: ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:StatNet.png</title>
    <id>29125</id>
    <revision>
      <id>43860</id>
      <timestamp>2010-08-13T09:52:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The network statistics in most Unreal Engine games as brought up through the &quot;stat net&quot; [[console command]], which is usually bound to the F6 key by default.</comment>
      <text xml:space="preserve">== Summary ==
The network statistics in most Unreal Engine games as brought up through the &quot;stat net&quot; [[console command]], which is usually bound to the F6 key by default.
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:SweetRevengeTemptIcon6l.png</title>
    <id>29394</id>
    <revision>
      <id>45044</id>
      <timestamp>2012-03-06T10:56:57Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>Icon for NSIS theme, I find NSIS does resize this. Obviously not my logo, it belongs to Epic and Unreal thanks.</comment>
      <text xml:space="preserve">== Summary ==
Icon for NSIS theme, I find NSIS does resize this. Obviously not my logo, it belongs to Epic and Unreal thanks.
== Licensing: ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:T3DSM BrushDraw.png</title>
    <id>24414</id>
    <revision>
      <id>35478</id>
      <timestamp>2009-10-15T08:57:13Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>How the vertices are ordering for a simple T3D Triangle brush</comment>
      <text xml:space="preserve">== Summary ==
How the vertices are ordering for a simple T3D Triangle brush
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:T3DSM Draw.png</title>
    <id>24415</id>
    <revision>
      <id>35479</id>
      <timestamp>2009-10-15T08:57:41Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>How the vertices are ordering for a simple T3D Triangle staticmesh.</comment>
      <text xml:space="preserve">== Summary ==
How the vertices are ordering for a simple T3D Triangle staticmesh.
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:T3DSM TriangleUED.png</title>
    <id>24413</id>
    <revision>
      <id>35477</id>
      <timestamp>2009-10-15T08:56:14Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>Some basic triangle created with the UT2004 Unreal Editor</comment>
      <text xml:space="preserve">== Summary ==
Some basic triangle created with the UT2004 Unreal Editor
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:TemptHeader.png</title>
    <id>29395</id>
    <revision>
      <id>45045</id>
      <timestamp>2012-03-06T10:59:43Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>Header image, NSIS themes dont have alot in this area. Standard sizes</comment>
      <text xml:space="preserve">== Summary ==
Header image, NSIS themes dont have alot in this area. Standard sizes
== Licensing: ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:TestMap.jpg</title>
    <id>29213</id>
    <revision>
      <id>44159</id>
      <timestamp>2010-12-11T12:54:48Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>A test level I quickly put together in the UDK to show how to use my UltimateSaveSystem in order to let the player respawn at a checkpoint read from a file.</comment>
      <text xml:space="preserve">== Beschreibung ==
A test level I quickly put together in the UDK to show how to use my UltimateSaveSystem in order to let the player respawn at a checkpoint read from a file.
== Licensing: ==
{{GFDL}}</text>
    </revision>
  </page>
  <page>
    <title>File:Texinfot3d.jpg</title>
    <id>24071</id>
    <revision>
      <id>33861</id>
      <timestamp>2009-01-02T10:35:11Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
    <revision>
      <id>35506</id>
      <timestamp>2009-10-24T14:57:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>unknown license</comment>
      <text xml:space="preserve">== Licensing ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:Timer 01.png</title>
    <id>29311</id>
    <revision>
      <id>44899</id>
      <timestamp>2012-02-09T18:53:00Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UDK Config 01.png</title>
    <id>29380</id>
    <revision>
      <id>45004</id>
      <timestamp>2012-02-29T04:13:18Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UDK Config 02.png</title>
    <id>29381</id>
    <revision>
      <id>45005</id>
      <timestamp>2012-02-29T04:17:06Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UDK Config 03.png</title>
    <id>29382</id>
    <revision>
      <id>45006</id>
      <timestamp>2012-02-29T04:33:05Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UDK Config 04.png</title>
    <id>29383</id>
    <revision>
      <id>45007</id>
      <timestamp>2012-02-29T04:38:43Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UDK Config 05.png</title>
    <id>29384</id>
    <revision>
      <id>45008</id>
      <timestamp>2012-02-29T04:43:33Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UDK Config 06.png</title>
    <id>29385</id>
    <revision>
      <id>45009</id>
      <timestamp>2012-02-29T05:07:58Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Interface.png</title>
    <id>23773</id>
    <revision>
      <id>33060</id>
      <timestamp>2008-09-29T11:45:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UE3:Unreal Editor interface|]] overview</comment>
      <text xml:space="preserve">[[UE3:Unreal Editor interface|Unreal Editor interface]] overview</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Properties-Add.png</title>
    <id>24063</id>
    <revision>
      <id>33783</id>
      <timestamp>2008-12-24T14:09:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Button in [[UT3 Editor]] to add an empty element at the end of a [[dynamic array]] property.</comment>
      <text xml:space="preserve">Button in [[UT3 Editor]] to add an empty element at the end of a [[dynamic array]] property.</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Properties-Duplicate.png</title>
    <id>24064</id>
    <revision>
      <id>33784</id>
      <timestamp>2008-12-24T14:09:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Button in [[UT3 Editor]] to duplicate an empty element of a [[dynamic array]] property.</comment>
      <text xml:space="preserve">Button in [[UT3 Editor]] to duplicate an empty element of a [[dynamic array]] property.</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Properties-DynArrayButtons.png</title>
    <id>24055</id>
    <revision>
      <id>33734</id>
      <timestamp>2008-12-19T19:38:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>A [[dynamic array]] property in the [[UT3 Editor]].</comment>
      <text xml:space="preserve">A [[dynamic array]] property in the [[UT3 Editor]].</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Properties-Empty.png</title>
    <id>24062</id>
    <revision>
      <id>33782</id>
      <timestamp>2008-12-24T14:08:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Button in [[UT3 Editor]] to clear a [[dynamic array]] property.</comment>
      <text xml:space="preserve">Button in [[UT3 Editor]] to clear a [[dynamic array]] property.</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Properties-Insert.png</title>
    <id>24066</id>
    <revision>
      <id>33786</id>
      <timestamp>2008-12-24T14:10:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Button in [[UT3 Editor]] to insert an empty element into a [[dynamic array]] property.</comment>
      <text xml:space="preserve">Button in [[UT3 Editor]] to insert an empty element into a [[dynamic array]] property.</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Properties-Remove.png</title>
    <id>24065</id>
    <revision>
      <id>33785</id>
      <timestamp>2008-12-24T14:09:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Button in [[UT3 Editor]] to remove an empty element from a [[dynamic array]] property.</comment>
      <text xml:space="preserve">Button in [[UT3 Editor]] to remove an empty element from a [[dynamic array]] property.</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Statusbar-AutosaveDisabled.png</title>
    <id>23925</id>
    <revision>
      <id>33331</id>
      <timestamp>2008-11-16T15:29:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Statusbar-AutosaveEnabled.png</title>
    <id>23924</id>
    <revision>
      <id>33330</id>
      <timestamp>2008-11-16T15:29:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Statusbar-AutosaveSoon.png</title>
    <id>23926</id>
    <revision>
      <id>33332</id>
      <timestamp>2008-11-16T15:29:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Statusbar-DragGrid.png</title>
    <id>23922</id>
    <revision>
      <id>33328</id>
      <timestamp>2008-11-16T15:29:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Statusbar-RotationGrid.png</title>
    <id>23923</id>
    <revision>
      <id>33329</id>
      <timestamp>2008-11-16T15:29:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Statusbar.png</title>
    <id>23921</id>
    <revision>
      <id>33327</id>
      <timestamp>2008-11-16T15:21:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The [[UE3:UnrealEd statusbar|UT3Ed statusbar]].</comment>
      <text xml:space="preserve">The [[UE3:UnrealEd statusbar|UT3Ed statusbar]].</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-BrushPolys.png</title>
    <id>23868</id>
    <revision>
      <id>33272</id>
      <timestamp>2008-11-16T12:34:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-BuildAll.png</title>
    <id>23860</id>
    <revision>
      <id>33264</id>
      <timestamp>2008-11-16T12:22:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-BuildCoverNodes.png</title>
    <id>23859</id>
    <revision>
      <id>33263</id>
      <timestamp>2008-11-16T12:22:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-BuildGeometry.png</title>
    <id>23857</id>
    <revision>
      <id>33261</id>
      <timestamp>2008-11-16T12:22:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-BuildLighting.png</title>
    <id>23858</id>
    <revision>
      <id>33262</id>
      <timestamp>2008-11-16T12:22:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-BuildPaths.png</title>
    <id>23861</id>
    <revision>
      <id>33265</id>
      <timestamp>2008-11-16T12:22:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Copy.png</title>
    <id>23862</id>
    <revision>
      <id>33266</id>
      <timestamp>2008-11-16T12:24:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Cut.png</title>
    <id>23845</id>
    <revision>
      <id>33247</id>
      <timestamp>2008-11-16T11:37:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-DistributionToggle.png</title>
    <id>23849</id>
    <revision>
      <id>33251</id>
      <timestamp>2008-11-16T11:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Fullscreen.png</title>
    <id>23848</id>
    <revision>
      <id>33250</id>
      <timestamp>2008-11-16T11:46:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Generic.png</title>
    <id>23855</id>
    <revision>
      <id>33259</id>
      <timestamp>2008-11-16T12:17:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Kismet.png</title>
    <id>23850</id>
    <revision>
      <id>33252</id>
      <timestamp>2008-11-16T12:07:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
    <revision>
      <id>33253</id>
      <timestamp>2008-11-16T12:08:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:UT3-UnrealEd-Toolbar-Kismet.png]]&quot;</comment>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-MouseLock.png</title>
    <id>23846</id>
    <revision>
      <id>33248</id>
      <timestamp>2008-11-16T11:42:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-New.png</title>
    <id>23778</id>
    <revision>
      <id>33066</id>
      <timestamp>2008-09-29T14:36:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Open.png</title>
    <id>23780</id>
    <revision>
      <id>33068</id>
      <timestamp>2008-09-29T14:37:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Paste.png</title>
    <id>23783</id>
    <revision>
      <id>33071</id>
      <timestamp>2008-09-29T14:38:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Play.png</title>
    <id>23852</id>
    <revision>
      <id>33256</id>
      <timestamp>2008-11-16T12:11:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-PrefabLock.png</title>
    <id>23851</id>
    <revision>
      <id>33255</id>
      <timestamp>2008-11-16T12:10:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-PublishCook.png</title>
    <id>23854</id>
    <revision>
      <id>33258</id>
      <timestamp>2008-11-16T12:14:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Redo.png</title>
    <id>23844</id>
    <revision>
      <id>33246</id>
      <timestamp>2008-11-16T11:37:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Rotate.png</title>
    <id>23864</id>
    <revision>
      <id>33268</id>
      <timestamp>2008-11-16T12:30:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Save.png</title>
    <id>23781</id>
    <revision>
      <id>33069</id>
      <timestamp>2008-09-29T14:37:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-SaveAll.png</title>
    <id>23782</id>
    <revision>
      <id>33070</id>
      <timestamp>2008-09-29T14:37:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Scale.png</title>
    <id>23866</id>
    <revision>
      <id>33270</id>
      <timestamp>2008-11-16T12:31:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-ScaleNonUniform.png</title>
    <id>23865</id>
    <revision>
      <id>33269</id>
      <timestamp>2008-11-16T12:31:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Search.png</title>
    <id>23847</id>
    <revision>
      <id>33249</id>
      <timestamp>2008-11-16T11:45:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-ShowWidget.png</title>
    <id>23863</id>
    <revision>
      <id>33267</id>
      <timestamp>2008-11-16T12:26:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-SocketSnapToggle.png</title>
    <id>23856</id>
    <revision>
      <id>33260</id>
      <timestamp>2008-11-16T12:19:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-StartPropagation.png</title>
    <id>23853</id>
    <revision>
      <id>33257</id>
      <timestamp>2008-11-16T12:12:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Translate.png</title>
    <id>23867</id>
    <revision>
      <id>33271</id>
      <timestamp>2008-11-16T12:33:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar-Undo.png</title>
    <id>23843</id>
    <revision>
      <id>33245</id>
      <timestamp>2008-11-16T11:37:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbar.png</title>
    <id>23777</id>
    <revision>
      <id>33065</id>
      <timestamp>2008-09-29T13:29:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The [[UE3:UnrealEd toolbar|]]</comment>
      <text xml:space="preserve">The [[UE3:UnrealEd toolbar|UnrealEd toolbar]]</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-Add.png</title>
    <id>23884</id>
    <revision>
      <id>33289</id>
      <timestamp>2008-11-16T14:23:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-AddSpecial.png</title>
    <id>23888</id>
    <revision>
      <id>33293</id>
      <timestamp>2008-11-16T14:24:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-AddVolume.png</title>
    <id>23889</id>
    <revision>
      <id>33294</id>
      <timestamp>2008-11-16T14:24:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBCone.png</title>
    <id>23876</id>
    <revision>
      <id>33281</id>
      <timestamp>2008-11-16T14:21:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBCube.png</title>
    <id>23875</id>
    <revision>
      <id>33280</id>
      <timestamp>2008-11-16T14:21:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBCurvedStair.png</title>
    <id>23877</id>
    <revision>
      <id>33282</id>
      <timestamp>2008-11-16T14:22:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBCylinder.png</title>
    <id>23878</id>
    <revision>
      <id>33283</id>
      <timestamp>2008-11-16T14:22:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBLinearStair.png</title>
    <id>23879</id>
    <revision>
      <id>33284</id>
      <timestamp>2008-11-16T14:22:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBSheet.png</title>
    <id>23880</id>
    <revision>
      <id>33285</id>
      <timestamp>2008-11-16T14:22:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBSphere.png</title>
    <id>23882</id>
    <revision>
      <id>33287</id>
      <timestamp>2008-11-16T14:22:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBSpiralStair.png</title>
    <id>23881</id>
    <revision>
      <id>33286</id>
      <timestamp>2008-11-16T14:22:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-BBVolumetric.png</title>
    <id>23883</id>
    <revision>
      <id>33288</id>
      <timestamp>2008-11-16T14:23:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-Deintersect.png</title>
    <id>23887</id>
    <revision>
      <id>33292</id>
      <timestamp>2008-11-16T14:24:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-HideSelected.png</title>
    <id>23891</id>
    <revision>
      <id>33296</id>
      <timestamp>2008-11-16T14:24:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-Intersect.png</title>
    <id>23886</id>
    <revision>
      <id>33291</id>
      <timestamp>2008-11-16T14:24:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-InvertSelections.png</title>
    <id>23892</id>
    <revision>
      <id>33297</id>
      <timestamp>2008-11-16T14:25:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-ModeCamera.png</title>
    <id>23871</id>
    <revision>
      <id>33276</id>
      <timestamp>2008-11-16T14:20:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-ModeGeometry.png</title>
    <id>23872</id>
    <revision>
      <id>33277</id>
      <timestamp>2008-11-16T14:20:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-ModeTerrainEdit.png</title>
    <id>23873</id>
    <revision>
      <id>33278</id>
      <timestamp>2008-11-16T14:20:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-ModeTexturePan.png</title>
    <id>23874</id>
    <revision>
      <id>33279</id>
      <timestamp>2008-11-16T14:20:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-ShowAll.png</title>
    <id>23893</id>
    <revision>
      <id>33298</id>
      <timestamp>2008-11-16T14:25:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-ShowSelected.png</title>
    <id>23890</id>
    <revision>
      <id>33295</id>
      <timestamp>2008-11-16T14:24:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox-Subtract.png</title>
    <id>23885</id>
    <revision>
      <id>33290</id>
      <timestamp>2008-11-16T14:23:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Toolbox.png</title>
    <id>23869</id>
    <revision>
      <id>33274</id>
      <timestamp>2008-11-16T12:48:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The [[UE3:UnrealEd toolbox|UT3Ed toolbox ]].</comment>
      <text xml:space="preserve">The [[UE3:UnrealEd toolbox|UT3Ed toolbox ]].</text>
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-BrushWire.png</title>
    <id>23896</id>
    <revision>
      <id>33301</id>
      <timestamp>2008-11-16T14:57:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-CamFast.png</title>
    <id>23906</id>
    <revision>
      <id>33311</id>
      <timestamp>2008-11-16T14:59:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-CamNormal.png</title>
    <id>23905</id>
    <revision>
      <id>33310</id>
      <timestamp>2008-11-16T14:59:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-CamSlow.png</title>
    <id>23904</id>
    <revision>
      <id>33309</id>
      <timestamp>2008-11-16T14:59:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Front.png</title>
    <id>23910</id>
    <revision>
      <id>33315</id>
      <timestamp>2008-11-16T15:07:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-LightingComplexity.png</title>
    <id>23901</id>
    <revision>
      <id>33306</id>
      <timestamp>2008-11-16T14:58:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-LightingOnly.png</title>
    <id>23900</id>
    <revision>
      <id>33305</id>
      <timestamp>2008-11-16T14:58:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Lit.png</title>
    <id>23899</id>
    <revision>
      <id>33304</id>
      <timestamp>2008-11-16T14:58:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-LockSelectedToCamera.png</title>
    <id>23914</id>
    <revision>
      <id>33319</id>
      <timestamp>2008-11-16T15:07:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-LockViewport.png</title>
    <id>23912</id>
    <revision>
      <id>33317</id>
      <timestamp>2008-11-16T15:07:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-MakeViewOcclusionParent.png</title>
    <id>23915</id>
    <revision>
      <id>33320</id>
      <timestamp>2008-11-16T15:08:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Maximize.png</title>
    <id>23913</id>
    <revision>
      <id>33318</id>
      <timestamp>2008-11-16T15:07:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-PPPrevis.png</title>
    <id>23918</id>
    <revision>
      <id>33323</id>
      <timestamp>2008-11-16T15:08:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Perspective.png</title>
    <id>23908</id>
    <revision>
      <id>33313</id>
      <timestamp>2008-11-16T15:06:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Realtime.png</title>
    <id>23895</id>
    <revision>
      <id>33300</id>
      <timestamp>2008-11-16T14:56:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-ShaderComplexity.png</title>
    <id>23903</id>
    <revision>
      <id>33308</id>
      <timestamp>2008-11-16T14:58:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-ShowFlags.png</title>
    <id>23916</id>
    <revision>
      <id>33321</id>
      <timestamp>2008-11-16T15:08:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Side.png</title>
    <id>23911</id>
    <revision>
      <id>33316</id>
      <timestamp>2008-11-16T15:07:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Squint.png</title>
    <id>23919</id>
    <revision>
      <id>33324</id>
      <timestamp>2008-11-16T15:08:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-StreamingPrevis.png</title>
    <id>23917</id>
    <revision>
      <id>33322</id>
      <timestamp>2008-11-16T15:08:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-TextureDensity.png</title>
    <id>23902</id>
    <revision>
      <id>33307</id>
      <timestamp>2008-11-16T14:58:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Top.png</title>
    <id>23909</id>
    <revision>
      <id>33314</id>
      <timestamp>2008-11-16T15:06:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Unlit.png</title>
    <id>23898</id>
    <revision>
      <id>33303</id>
      <timestamp>2008-11-16T14:57:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-UnlitMovement.png</title>
    <id>23907</id>
    <revision>
      <id>33312</id>
      <timestamp>2008-11-16T14:59:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar-Wire.png</title>
    <id>23897</id>
    <revision>
      <id>33302</id>
      <timestamp>2008-11-16T14:57:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UT3-UnrealEd-Viewport-Toolbar.png</title>
    <id>23894</id>
    <revision>
      <id>33299</id>
      <timestamp>2008-11-16T14:55:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Toolbar of a [[UE3:UnrealEd viewport|UT3Ed viewport]].</comment>
      <text xml:space="preserve">Toolbar of a [[UE3:UnrealEd viewport|UT3Ed viewport]].</text>
    </revision>
  </page>
  <page>
    <title>File:UTPT-ExportTree-ContextMenu.png</title>
    <id>24095</id>
    <revision>
      <id>34079</id>
      <timestamp>2009-03-01T10:48:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The context menu in [[UTPT]]'s Export Tree view.</comment>
      <text xml:space="preserve">The context menu in [[UTPT]]'s Export Tree view.</text>
    </revision>
  </page>
  <page>
    <title>File:UTPT-Raw-Property.png</title>
    <id>24096</id>
    <revision>
      <id>34080</id>
      <timestamp>2009-03-01T10:50:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>A property data file in [[UTPT]]'s raw analysis view.</comment>
      <text xml:space="preserve">A property data file in [[UTPT]]'s raw analysis view.</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealConsole-Interface.PNG</title>
    <id>29022</id>
    <revision>
      <id>43523</id>
      <timestamp>2010-06-24T02:37:15Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>[[UnrealConsole]] interface.</comment>
      <text xml:space="preserve">== Summary ==
[[UnrealConsole]] interface.
== Licensing: ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd-Toolbox-AddAntiPortal.png</title>
    <id>24009</id>
    <revision>
      <id>33620</id>
      <timestamp>2008-12-13T13:15:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:UnrealEd1-2DShapeEditor.png</title>
    <id>24079</id>
    <revision>
      <id>33981</id>
      <timestamp>2009-01-30T18:08:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[2D Shape Editor]] of [[UnrealEd 1]]</comment>
      <text xml:space="preserve">[[2D Shape Editor]] of [[UnrealEd 1]]</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd1-CreateANewTexture.png</title>
    <id>28817</id>
    <revision>
      <id>42675</id>
      <timestamp>2010-03-20T14:02:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The &quot;Create a new texture&quot; dialog in [[UnrealEd 1]].</comment>
      <text xml:space="preserve">== Summary ==
The &quot;Create a new texture&quot; dialog in [[UnrealEd 1]].
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd2-NewTexture-ScriptedTexture.png</title>
    <id>28816</id>
    <revision>
      <id>42674</id>
      <timestamp>2010-03-20T13:49:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The &quot;New Texture&quot; dialog from [[UnrealEd 2]], reachable via the [[Texture Browser]]'s '''File''' -&gt; '''New...''' menu item.</comment>
      <text xml:space="preserve">== Summary ==
The &quot;New Texture&quot; dialog from [[UnrealEd 2]], reachable via the [[Texture Browser]]'s '''File''' -&gt; '''New...''' menu item.
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd3-2DShapeEditor.png</title>
    <id>24027</id>
    <revision>
      <id>33661</id>
      <timestamp>2008-12-15T10:18:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The [[2D Shape Editor]] window in [[UnrealEd 3]].</comment>
      <text xml:space="preserve">The [[2D Shape Editor]] window in [[UnrealEd 3]].</text>
    </revision>
    <revision>
      <id>33662</id>
      <timestamp>2008-12-15T10:34:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:UnrealEd3-2DShapeEditor.png]]&quot;</comment>
      <text xml:space="preserve">The [[2D Shape Editor]] window in [[UnrealEd 3]].</text>
    </revision>
    <revision>
      <id>33663</id>
      <timestamp>2008-12-15T11:02:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:UnrealEd3-2DShapeEditor.png]]&quot;</comment>
      <text xml:space="preserve">The [[2D Shape Editor]] window in [[UnrealEd 3]].</text>
    </revision>
    <revision>
      <id>33664</id>
      <timestamp>2008-12-15T11:28:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[Image:UnrealEd3-2DShapeEditor.png]]&quot;</comment>
      <text xml:space="preserve">The [[2D Shape Editor]] window in [[UnrealEd 3]].</text>
    </revision>
    <revision>
      <id>33665</id>
      <timestamp>2008-12-15T12:13:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">The [[2D Shape Editor]] window in [[UnrealEd 3]] with a linear and a bezier segment selected.</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd3-Interface.png</title>
    <id>23972</id>
    <revision>
      <id>33404</id>
      <timestamp>2008-11-22T17:27:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UE2:UnrealEd 3|]] interface.</comment>
      <text xml:space="preserve">[[UE2:UnrealEd 3|UnrealEd 3]] interface.</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd3-NewMaterial.png</title>
    <id>28819</id>
    <revision>
      <id>42677</id>
      <timestamp>2010-03-20T14:09:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The &quot;New Material&quot; dialog in [[UnrealEd 3]].</comment>
      <text xml:space="preserve">== Summary ==
The &quot;New Material&quot; dialog in [[UnrealEd 3]].
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd3-Properties-DynArrayButtons.png</title>
    <id>24054</id>
    <revision>
      <id>33733</id>
      <timestamp>2008-12-19T19:38:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>A [[dynamic array]] property in [[UnrealEd 3]].</comment>
      <text xml:space="preserve">A [[dynamic array]] property in [[UnrealEd 3]].</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealEd3-Viewport-Toolbar.png</title>
    <id>29233</id>
    <revision>
      <id>44251</id>
      <timestamp>2011-01-27T17:12:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[UE2:UnrealEd viewport#Toolbar|UnrealEd 3 viewport toolbar]] buttons.</comment>
      <text xml:space="preserve">== Summary ==
[[UE2:UnrealEd viewport#Toolbar|UnrealEd 3 viewport toolbar]] buttons.
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>File:UnrealFrontend-Interface.PNG</title>
    <id>29020</id>
    <revision>
      <id>43521</id>
      <timestamp>2010-06-24T02:14:30Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>[[UnrealFrontend]] interface.</comment>
      <text xml:space="preserve">== Summary ==
[[UnrealFrontend]] interface.
== Licensing: ==
{{CC-by-nc-sa-3.0}}</text>
    </revision>
  </page>
  <page>
    <title>File:UsineScreenshot.jpg</title>
    <id>23756</id>
    <revision>
      <id>32949</id>
      <timestamp>2008-09-04T03:38:55Z</timestamp>
      <contributor>
        <username>16mentaltempest</username>
        <id>323</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 01.png</title>
    <id>29372</id>
    <revision>
      <id>44992</id>
      <timestamp>2012-02-28T22:32:51Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>Screenshot of Microsoft Visual Studio 2010 with nFringe Installed</comment>
      <text xml:space="preserve">Screenshot of Microsoft Visual Studio 2010 with nFringe Installed</text>
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 02.png</title>
    <id>29373</id>
    <revision>
      <id>44993</id>
      <timestamp>2012-02-28T22:36:03Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 03.png</title>
    <id>29374</id>
    <revision>
      <id>44994</id>
      <timestamp>2012-02-28T22:37:41Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 04.png</title>
    <id>29375</id>
    <revision>
      <id>44995</id>
      <timestamp>2012-02-28T22:43:22Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>New Project Window</comment>
      <text xml:space="preserve">New Project Window</text>
    </revision>
    <revision>
      <id>45001</id>
      <timestamp>2012-02-28T23:30:11Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[File:Visual Studio 2010 04.png]]&quot;:&amp;#32;Project folders</comment>
      <text xml:space="preserve">New Project Window</text>
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 05.png</title>
    <id>29376</id>
    <revision>
      <id>44996</id>
      <timestamp>2012-02-28T22:49:03Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>New Project Window Filled Out</comment>
      <text xml:space="preserve">New Project Window Filled Out</text>
    </revision>
    <revision>
      <id>44998</id>
      <timestamp>2012-02-28T23:01:49Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>uploaded a new version of &quot;[[File:Visual Studio 2010 05.png]]&quot;:&amp;#32;New Project Done</comment>
      <text xml:space="preserve">New Project Window Filled Out</text>
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 06.png</title>
    <id>29377</id>
    <revision>
      <id>44997</id>
      <timestamp>2012-02-28T22:53:43Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>New Project Done</comment>
      <text xml:space="preserve">New Project Done</text>
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 07.png</title>
    <id>29378</id>
    <revision>
      <id>44999</id>
      <timestamp>2012-02-28T23:12:58Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>Project has been moved</comment>
      <text xml:space="preserve">Project has been moved</text>
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 08.png</title>
    <id>29379</id>
    <revision>
      <id>45000</id>
      <timestamp>2012-02-28T23:20:31Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <comment>Project folders</comment>
      <text xml:space="preserve">Project folders</text>
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 09.png</title>
    <id>29387</id>
    <revision>
      <id>45015</id>
      <timestamp>2012-02-29T21:35:51Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 10.png</title>
    <id>29388</id>
    <revision>
      <id>45016</id>
      <timestamp>2012-02-29T21:39:25Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Visual Studio 2010 11.png</title>
    <id>29389</id>
    <revision>
      <id>45017</id>
      <timestamp>2012-02-29T22:01:40Z</timestamp>
      <contributor>
        <username>Krillin6</username>
        <id>2264</id>
      </contributor>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>File:Wikibus.png</title>
    <id>5034</id>
    <revision>
      <id>11484</id>
      <timestamp>2008-04-24T02:26:30Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">== Licensing ==
{{PD}}</text>
    </revision>
  </page>
  <page>
    <title>File:ZoneInfo properties bLonelyZone.png</title>
    <id>28580</id>
    <revision>
      <id>40338</id>
      <timestamp>2009-12-15T11:52:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>The ZoneInfo [[properties window]] with the [[bLonelyZone]] property selected.</comment>
      <text xml:space="preserve">== Summary ==
The ZoneInfo [[properties window]] with the [[bLonelyZone]] property selected.
== Licensing: ==
{{Unknown}}</text>
    </revision>
  </page>
  <page>
    <title>Help talk:Interwiki linking</title>
    <id>105</id>
    <revision>
      <id>310</id>
      <timestamp>2008-02-20T16:39:21Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>New page: Current custom interwiki links: * uadmin - [[uadmin:Main Page|Unreal Admin Wiki]] * liandri - [[liandri:Main Page|Liandri Archives]] I should probably add something for the UDN also, but t...</comment>
      <text xml:space="preserve">Current custom interwiki links:
* uadmin - [[uadmin:Main Page|Unreal Admin Wiki]]
* liandri - [[liandri:Main Page|Liandri Archives]]
I should probably add something for the UDN also, but their site seem to change structure a lot.  There are some other links in the old wiki I could reproduce as well, such as forum links, but I don't really see the purpose to those. --[[User:Haarg|Haarg]] 11:39, 20 February 2008 (EST)</text>
    </revision>
    <revision>
      <id>324</id>
      <timestamp>2008-02-21T15:23:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">Current custom interwiki links:
* uadmin - [[uadmin:Main Page|Unreal Admin Wiki]]
* liandri - [[liandri:Main Page|Liandri Archives]]
I should probably add something for the UDN also, but their site seem to change structure a lot.  There are some other links in the old wiki I could reproduce as well, such as forum links, but I don't really see the purpose to those. --[[User:Haarg|Haarg]] 11:39, 20 February 2008 (EST)

The UDN has two &quot;namespaces&quot; that we might want to link separately: http://udn.epicgames.com/Three/*.html for UE3-related articles and http://udn.epicgames.com/Two/*.html with UE2-related stuff. I don't think we need any other part from there for now. Maybe add those two as &quot;udn2&quot; and &quot;udn3&quot;? --[[User:Wormbo|Wormbo]] 10:23, 21 February 2008 (EST)</text>
    </revision>
    <revision>
      <id>419</id>
      <timestamp>2008-02-24T20:24:20Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">Current custom interwiki links:
* uadmin - [[uadmin:Main Page|Unreal Admin Wiki]]
* liandri - [[liandri:Main Page|Liandri Archives]]
I should probably add something for the UDN also, but their site seem to change structure a lot.  There are some other links in the old wiki I could reproduce as well, such as forum links, but I don't really see the purpose to those. --[[User:Haarg|Haarg]] 11:39, 20 February 2008 (EST)

The UDN has two &quot;namespaces&quot; that we might want to link separately: http://udn.epicgames.com/Three/*.html for UE3-related articles and http://udn.epicgames.com/Two/*.html with UE2-related stuff. I don't think we need any other part from there for now. Maybe add those two as &quot;udn2&quot; and &quot;udn3&quot;? --[[User:Wormbo|Wormbo]] 10:23, 21 February 2008 (EST)

Added --[[User:Haarg|Haarg]] 15:24, 24 February 2008 (EST)</text>
    </revision>
  </page>
  <page>
    <title>Help:Categories</title>
    <id>45</id>
    <revision>
      <id>110</id>
      <timestamp>2008-01-11T05:14:41Z</timestamp>
      <contributor>
        <ip>Anonymous Dissident</ip>
      </contributor>
      <comment>add</comment>
      <text xml:space="preserve">{{PD Help Page}}

MediaWiki allows you to categorize pages by adding one or more category tags to the text.  Adding these tags create links at the bottom of the article which take you to the list of all pages in that category, which makes it easy to browse related articles.

== How to add categories ==

To add an article to a category put the following at the end of the page you are editing...

 &lt;nowiki&gt;[[Category:NAME]]&lt;/nowiki&gt;

where NAME is the name of the category you want to add it to.  Any number of category tags may be added to the page - the page will be listed in all of them.

You can also specify an additional SORT parameter that dictates where the page will appear, alphabetically, within the category. This is achieved by using the following markup:

 &lt;nowiki&gt;[[Category:NAME|SORT]]&lt;/nowiki&gt;

So for example, to add this page to the 'Help' category, you would use:

 &lt;nowiki&gt;[[Category:Help|Categories]]&lt;/nowiki&gt;

Note that we used 'Categories' as the sort parameter.  Without this the page would be listed under 'H' for 'Help:Categories',  instead of under 'C', which is more useful.  Other situations where you might want to use the sort parameter is when you have articles about people that are titled as &lt;code&gt;FirstName LastName&lt;/code&gt; but within the category you want them listed as &lt;code&gt;LastName, FirstName&lt;/code&gt;.

Another way to sort the article in the correct letter without the namespace is

 &lt;nowiki&gt;[[Category:Help|{{SUBPAGENAME}}]]&lt;/nowiki&gt;

This is extremely helpful when using templates which include a category tag.

''Note: the SORT parameter does '''not''' affect how the page title is displayed within the category listing, just how it is ordered.  In the above example, the link to this page will still be 'Help:Categories', and not 'Categories' as you might expect!''

== Linking to Category Pages ==

To create a link to a category page:

 &lt;nowiki&gt;[[:Category:NAME]]&lt;/nowiki&gt;

If you were linking to the Category Page for Help on MediaWiki, the link would look like this: [[:Category:Help]]

If you want to display alternate text for the link:

 &lt;nowiki&gt;[[:Category:NAME|TEXT]]&lt;/nowiki&gt;

Here is an example of the same link to the Category Page for Help on MediaWiki as above, but with alternative text: [[:Category:Help|MediaWiki Help Index]]

== Categorize Categories==

Categories themselves and other uploaded files like Pictures can be categorized exactly like normal pages. It is useful to connect the article-categories with categories already in place to establish connections and hierarchies. To this end, after saving the article, follow the category links at the end of the page to see, if the category is already in place and if not, categorize them until you connect them with an existing category.

==Moving categories==
Categories cannot be easily moved [[Help:Moving a page|like other pages]]. For this reason, category names should be chosen carefully.

The easiest way (for those with admin privileges) is to create the new page, delete the old one, and then change the tags in each member of the category (manually or with a bot). However, this loses the page history - not a huge problem when categories are used only for navigation, but when a wiki is structured differently and the category pages contain significant amounts of text, this is undesirable.

=== Moving with revision history ===
However, category pages ''can'' be moved together with the full revision history, with some effort, by using the [[Special:Export]] and [[Special:Import]] functions. 

A fuller guide, with additional steps and reference to using [[meta:category.py|category.py]] is given at [[Appropedia:Project:Moving category pages]].

==See also==
* [[Meta:Help:Category]]

{{Languages|Help:Categories}}
[[Category:Help|Categories]]
[[Category:Category| ]]</text>
    </revision>
    <revision>
      <id>111</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

MediaWiki allows you to categorize pages by adding one or more category tags to the text.  Adding these tags create links at the bottom of the article which take you to the list of all pages in that category, which makes it easy to browse related articles.

== How to add categories ==

To add an article to a category put the following at the end of the page you are editing...

 &lt;nowiki&gt;[[Category:NAME]]&lt;/nowiki&gt;

where NAME is the name of the category you want to add it to.  Any number of category tags may be added to the page - the page will be listed in all of them.

You can also specify an additional SORT parameter that dictates where the page will appear, alphabetically, within the category. This is achieved by using the following markup:

 &lt;nowiki&gt;[[Category:NAME|SORT]]&lt;/nowiki&gt;

So for example, to add this page to the 'Help' category, you would use:

 &lt;nowiki&gt;[[Category:Help|Categories]]&lt;/nowiki&gt;

Note that we used 'Categories' as the sort parameter.  Without this the page would be listed under 'H' for 'Help:Categories',  instead of under 'C', which is more useful.  Other situations where you might want to use the sort parameter is when you have articles about people that are titled as &lt;code&gt;FirstName LastName&lt;/code&gt; but within the category you want them listed as &lt;code&gt;LastName, FirstName&lt;/code&gt;.

Another way to sort the article in the correct letter without the namespace is

 &lt;nowiki&gt;[[Category:Help|{{SUBPAGENAME}}]]&lt;/nowiki&gt;

This is extremely helpful when using templates which include a category tag.

''Note: the SORT parameter does '''not''' affect how the page title is displayed within the category listing, just how it is ordered.  In the above example, the link to this page will still be 'Help:Categories', and not 'Categories' as you might expect!''

== Linking to Category Pages ==

To create a link to a category page:

 &lt;nowiki&gt;[[:Category:NAME]]&lt;/nowiki&gt;

If you were linking to the Category Page for Help on MediaWiki, the link would look like this: [[:Category:Help]]

If you want to display alternate text for the link:

 &lt;nowiki&gt;[[:Category:NAME|TEXT]]&lt;/nowiki&gt;

Here is an example of the same link to the Category Page for Help on MediaWiki as above, but with alternative text: [[:Category:Help|MediaWiki Help Index]]

== Categorize Categories==

Categories themselves and other uploaded files like Pictures can be categorized exactly like normal pages. It is useful to connect the article-categories with categories already in place to establish connections and hierarchies. To this end, after saving the article, follow the category links at the end of the page to see, if the category is already in place and if not, categorize them until you connect them with an existing category.

==Moving categories==
Categories cannot be easily moved [[Help:Moving a page|like other pages]]. For this reason, category names should be chosen carefully.

The easiest way (for those with admin privileges) is to create the new page, delete the old one, and then change the tags in each member of the category (manually or with a bot). However, this loses the page history - not a huge problem when categories are used only for navigation, but when a wiki is structured differently and the category pages contain significant amounts of text, this is undesirable.

=== Moving with revision history ===
However, category pages ''can'' be moved together with the full revision history, with some effort, by using the [[Special:Export]] and [[Special:Import]] functions. 

A fuller guide, with additional steps and reference to using [[meta:category.py|category.py]] is given at [[Appropedia:Project:Moving category pages]].

==See also==
* [[Meta:Help:Category]]

{{Languages|Help:Categories}}
[[Category:Help|Categories]]
[[Category:Category| ]]</text>
    </revision>
    <revision>
      <id>202</id>
      <timestamp>2008-02-18T19:33:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">MediaWiki allows you to categorize pages by adding one or more category tags to the text.  Adding these tags create links at the bottom of the article which take you to the list of all pages in that category, which makes it easy to browse related articles.

== How to add categories ==

To add an article to a category put the following at the end of the page you are editing...

 &lt;nowiki&gt;[[Category:NAME]]&lt;/nowiki&gt;

where NAME is the name of the category you want to add it to.  Any number of category tags may be added to the page - the page will be listed in all of them.

You can also specify an additional SORT parameter that dictates where the page will appear, alphabetically, within the category. This is achieved by using the following markup:

 &lt;nowiki&gt;[[Category:NAME|SORT]]&lt;/nowiki&gt;

So for example, to add this page to the 'Help' category, you would use:

 &lt;nowiki&gt;[[Category:Help|Categories]]&lt;/nowiki&gt;

Note that we used 'Categories' as the sort parameter.  Without this the page would be listed under 'H' for 'Help:Categories',  instead of under 'C', which is more useful.  Other situations where you might want to use the sort parameter is when you have articles about people that are titled as &lt;code&gt;FirstName LastName&lt;/code&gt; but within the category you want them listed as &lt;code&gt;LastName, FirstName&lt;/code&gt;.

Another way to sort the article in the correct letter without the namespace is

 &lt;nowiki&gt;[[Category:Help|{{SUBPAGENAME}}]]&lt;/nowiki&gt;

This is extremely helpful when using templates which include a category tag.

''Note: the SORT parameter does '''not''' affect how the page title is displayed within the category listing, just how it is ordered.  In the above example, the link to this page will still be 'Help:Categories', and not 'Categories' as you might expect!''

== Linking to Category Pages ==

To create a link to a category page:

 &lt;nowiki&gt;[[:Category:NAME]]&lt;/nowiki&gt;

If you were linking to the Category Page for Help on MediaWiki, the link would look like this: [[:Category:Help]]

If you want to display alternate text for the link:

 &lt;nowiki&gt;[[:Category:NAME|TEXT]]&lt;/nowiki&gt;

Here is an example of the same link to the Category Page for Help on MediaWiki as above, but with alternative text: [[:Category:Help|MediaWiki Help Index]]

== Categorize Categories==

Categories themselves and other uploaded files like Pictures can be categorized exactly like normal pages. It is useful to connect the article-categories with categories already in place to establish connections and hierarchies. To this end, after saving the article, follow the category links at the end of the page to see, if the category is already in place and if not, categorize them until you connect them with an existing category.

==Moving categories==
Categories cannot be easily moved [[Help:Moving a page|like other pages]]. For this reason, category names should be chosen carefully.

The easiest way (for those with admin privileges) is to create the new page, delete the old one, and then change the tags in each member of the category (manually or with a bot). However, this loses the page history - not a huge problem when categories are used only for navigation, but when a wiki is structured differently and the category pages contain significant amounts of text, this is undesirable.

=== Moving with revision history ===
However, category pages ''can'' be moved together with the full revision history, with some effort, by using the [[Special:Export]] and [[Special:Import]] functions. 

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>254</id>
      <timestamp>2008-02-19T17:08:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">MediaWiki allows you to categorize pages by adding one or more category tags to the text.  Adding these tags create links at the bottom of the article which take you to the list of all pages in that category, which makes it easy to browse related articles.

== How to add categories ==

To add an article to a category put the following at the end of the page you are editing...

 &lt;nowiki&gt;[[Category:NAME]]&lt;/nowiki&gt;

where NAME is the name of the category you want to add it to.  Any number of category tags may be added to the page - the page will be listed in all of them.

You can also specify an additional SORT parameter that dictates where the page will appear, alphabetically, within the category. This is achieved by using the following markup:

 &lt;nowiki&gt;[[Category:NAME|SORT]]&lt;/nowiki&gt;

So for example, to add this page to the 'Help' category, you would use:

 &lt;nowiki&gt;[[Category:Help|Categories]]&lt;/nowiki&gt;

Note that we used 'Categories' as the sort parameter.  Without this the page would be listed under 'H' for 'Help:Categories',  instead of under 'C', which is more useful.  Other situations where you might want to use the sort parameter is when you have articles about people that are titled as &lt;code&gt;FirstName LastName&lt;/code&gt; but within the category you want them listed as &lt;code&gt;LastName, FirstName&lt;/code&gt;.

Another way to sort the article in the correct letter without the namespace is

 &lt;nowiki&gt;[[Category:Help|{{SUBPAGENAME}}]]&lt;/nowiki&gt;

This is extremely helpful when using templates which include a category tag.

''Note: the SORT parameter does '''not''' affect how the page title is displayed within the category listing, just how it is ordered.  In the above example, the link to this page will still be 'Help:Categories', and not 'Categories' as you might expect!''

== Linking to Category Pages ==

To create a link to a category page:

 &lt;nowiki&gt;[[:Category:NAME]]&lt;/nowiki&gt;

If you were linking to the Category Page for Help on MediaWiki, the link would look like this: [[:Category:Help]]

If you want to display alternate text for the link:

 &lt;nowiki&gt;[[:Category:NAME|TEXT]]&lt;/nowiki&gt;

Here is an example of the same link to the Category Page for Help on MediaWiki as above, but with alternative text: [[:Category:Help|MediaWiki Help Index]]

== Categorize Categories==

Categories themselves and other uploaded files like Pictures can be categorized exactly like normal pages. It is useful to connect the article-categories with categories already in place to establish connections and hierarchies. To this end, after saving the article, follow the category links at the end of the page to see, if the category is already in place and if not, categorize them until you connect them with an existing category.

==Moving categories==
Categories cannot be easily moved [[Help:Moving a page|like other pages]]. For this reason, category names should be chosen carefully.

The easiest way (for those with admin privileges) is to create the new page, delete the old one, and then change the tags in each member of the category (manually or with a bot). However, this loses the page history - not a huge problem when categories are used only for navigation, but when a wiki is structured differently and the category pages contain significant amounts of text, this is undesirable.

=== Moving with revision history ===
However, category pages ''can'' be moved together with the full revision history, with some effort, by using the [[Special:Export]] and [[Special:Import]] functions.

== Category Policy ==
See [[Project:Categories|Categories]] for the Unreal Wiki's policy on creating and using categories.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Contents</title>
    <id>23</id>
    <revision>
      <id>46</id>
      <timestamp>2007-07-16T04:43:57Z</timestamp>
      <contributor>
        <ip>Sir Brizz</ip>
      </contributor>
      <comment>/* See Also */</comment>
      <text xml:space="preserve">[[Category:Help Files| ]] [[Category:Move Protection|{{PAGENAME}}]]
The purpose of this walkthrough is help aspiring editors learn the ways of editing as soon as possible. We hope that these help files guide you greatly, and we look forward to seeing your future work on our project.

==General Walkthroughs==
;Reading
:[[Help:Navigation|Navigation]]
:[[Help:Searching|Searching]]
:[[Help:Tracking changes|Tracking Changes]]
:[[Help:Namespaces|Namespaces]]
;New Editors
:[[Project:Getting Started|Getting Started]] - Information for new editors 
:[[Project:Helping Out|Helping Out]] – General suggestions for how to help contribute
:[[Project:Task List|Task List]] - More specific tasks that need to be done
;Basic Editing
:[[Help:Quick Editing Guide|Quick Editing Guide]]
:[[Help:Editing Pages|Editing Pages]]
:[[Help:Edit Summary|Edit Summary]]
:[[Help:Starting New Pages|Starting New Pages]]
:[[Help:Formatting|Formatting]]
:[[Help:Links|Links]]
;Advanced Editing
:[[Help:Images|Images]]
:[[Help:Tables|Tables]]
:[[Project:Categories|Categories]]
:[[Help:Templates|Templates]]
:[[Help:Variables|Variables]]

==See Also==

* [[Project:Style Guide|Style Guide]] - General guidelines for how to write, format, and present pages.
* [[Project:Layout Guidelines|Layout Guidelines]] - More specific guidelines for creating specific pages.
* [[Project:Sandbox|The Sandbox]] - You can test out your editing at the sandbox.
* [[Project:Common Mistakes|Common Mistakes]] - Some of the more common mistakes that users make here, and how to avoid and fix them.
* [[metawikipedia:Help:Editing|MediaWiki Help Page]] - General information on how to edit MediaWiki pages, including: building tables, controlling table of contents displays, and adding/using templates, etc.</text>
    </revision>
    <revision>
      <id>47</id>
      <timestamp>2008-02-17T18:39:07Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">[[Category:Help Files| ]] [[Category:Move Protection|{{PAGENAME}}]]
The purpose of this walkthrough is help aspiring editors learn the ways of editing as soon as possible. We hope that these help files guide you greatly, and we look forward to seeing your future work on our project.

==General Walkthroughs==
;Reading
:[[Help:Navigation|Navigation]]
:[[Help:Searching|Searching]]
:[[Help:Tracking changes|Tracking Changes]]
:[[Help:Namespaces|Namespaces]]
;New Editors
:[[Project:Getting Started|Getting Started]] - Information for new editors 
:[[Project:Helping Out|Helping Out]] – General suggestions for how to help contribute
:[[Project:Task List|Task List]] - More specific tasks that need to be done
;Basic Editing
:[[Help:Quick Editing Guide|Quick Editing Guide]]
:[[Help:Editing Pages|Editing Pages]]
:[[Help:Edit Summary|Edit Summary]]
:[[Help:Starting New Pages|Starting New Pages]]
:[[Help:Formatting|Formatting]]
:[[Help:Links|Links]]
;Advanced Editing
:[[Help:Images|Images]]
:[[Help:Tables|Tables]]
:[[Project:Categories|Categories]]
:[[Help:Templates|Templates]]
:[[Help:Variables|Variables]]

==See Also==

* [[Project:Style Guide|Style Guide]] - General guidelines for how to write, format, and present pages.
* [[Project:Layout Guidelines|Layout Guidelines]] - More specific guidelines for creating specific pages.
* [[Project:Sandbox|The Sandbox]] - You can test out your editing at the sandbox.
* [[Project:Common Mistakes|Common Mistakes]] - Some of the more common mistakes that users make here, and how to avoid and fix them.
* [[metawikipedia:Help:Editing|MediaWiki Help Page]] - General information on how to edit MediaWiki pages, including: building tables, controlling table of contents displays, and adding/using templates, etc.</text>
    </revision>
    <revision>
      <id>90</id>
      <timestamp>2008-02-18T17:07:39Z</timestamp>
      <contributor>
        <ip>Harry Wood</ip>
      </contributor>
      <comment>/* Wiki administration */ remove link to Help:User rights.  We will be needing a replacement explanation *for users* to be created here</comment>
      <text xml:space="preserve">{{PD Help Page}}
==Reading==
* [[Help:Navigation|Navigation]]
* [[Help:Searching|Searching]]
* [[Help:Tracking changes|Tracking changes]]

==Editing==
* [[Help:Editing pages|Editing pages]]
* [[Help:Starting a new page|Starting a new page]]
* [[Help:Formatting|Formatting]]
* [[Help:Links|Links]]
* [[Help:User page|User pages]]
* [[Help:Talk pages|Talk pages]]

===Advanced editing===
* [[Help:Images|Images]]
* [[Help:Tables|Tables]]
* [[Help:Categories|Categories]]
* [[Help:Subpages|Subpages]]
* [[Help:Managing files|Managing files]]
* [[Help:Moving a page|Moving a page]]
* [[Help:Redirects|Redirects]]
* [[Help:Deleting a page|Deleting a page]]

* [[Help:Templates|Templates]]
* [[Help:Variables|Variables]]
* [[Help:Namespaces|Namespaces]]
* [[Help:Interwiki linking|Interwiki linking]]

* [[Help:Special pages|Special pages]]
* [[Help:External searches|External searches]]
* [[Help:Patrolled edits|Patrolled edits]]

===Personal customizing===
* [[Help:Preferences|Preferences]]
* [[Help:Skins|Skins]]

==Wiki administration==
The following features requires extra permissions that are not normally granted to all wiki users.

* [[Help:Range blocks|Range IP blocks]]

==See also==
* [[Help:Copying|Copying the help pages to your wiki]]

{{Languages|Help:Contents}}
[[Category:Help| ]]
__NOTOC__</text>
    </revision>
    <revision>
      <id>91</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
==Reading==
* [[Help:Navigation|Navigation]]
* [[Help:Searching|Searching]]
* [[Help:Tracking changes|Tracking changes]]

==Editing==
* [[Help:Editing pages|Editing pages]]
* [[Help:Starting a new page|Starting a new page]]
* [[Help:Formatting|Formatting]]
* [[Help:Links|Links]]
* [[Help:User page|User pages]]
* [[Help:Talk pages|Talk pages]]

===Advanced editing===
* [[Help:Images|Images]]
* [[Help:Tables|Tables]]
* [[Help:Categories|Categories]]
* [[Help:Subpages|Subpages]]
* [[Help:Managing files|Managing files]]
* [[Help:Moving a page|Moving a page]]
* [[Help:Redirects|Redirects]]
* [[Help:Deleting a page|Deleting a page]]

* [[Help:Templates|Templates]]
* [[Help:Variables|Variables]]
* [[Help:Namespaces|Namespaces]]
* [[Help:Interwiki linking|Interwiki linking]]

* [[Help:Special pages|Special pages]]
* [[Help:External searches|External searches]]
* [[Help:Patrolled edits|Patrolled edits]]

===Personal customizing===
* [[Help:Preferences|Preferences]]
* [[Help:Skins|Skins]]

==Wiki administration==
The following features requires extra permissions that are not normally granted to all wiki users.

* [[Help:Range blocks|Range IP blocks]]

==See also==
* [[Help:Copying|Copying the help pages to your wiki]]

{{Languages|Help:Contents}}
[[Category:Help| ]]
__NOTOC__</text>
    </revision>
    <revision>
      <id>189</id>
      <timestamp>2008-02-18T19:01:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Reading==
* [[Help:Navigation|Navigation]]
* [[Help:Searching|Searching]]
* [[Help:Tracking changes|Tracking changes]]

==Editing==
* [[Help:Editing pages|Editing pages]]
* [[Help:Starting a new page|Starting a new page]]
* [[Help:Formatting|Formatting]]
* [[Help:Links|Links]]
* [[Help:User page|User pages]]
* [[Help:Talk pages|Talk pages]]

===Advanced editing===
* [[Help:Images|Images]]
* [[Help:Tables|Tables]]
* [[Help:Categories|Categories]]
* [[Help:Subpages|Subpages]]
* [[Help:Managing files|Managing files]]
* [[Help:Moving a page|Moving a page]]
* [[Help:Redirects|Redirects]]
* [[Help:Deleting a page|Deleting a page]]

* [[Help:Templates|Templates]]
* [[Help:Variables|Variables]]
* [[Help:Namespaces|Namespaces]]
* [[Help:Interwiki linking|Interwiki linking]]

* [[Help:Special pages|Special pages]]
* [[Help:External searches|External searches]]
* [[Help:Patrolled edits|Patrolled edits]]

===Personal customizing===
* [[Help:Preferences|Preferences]]
* [[Help:Skins|Skins]]

==Wiki administration==
The following features requires extra permissions that are not normally granted to all wiki users.

* [[Help:Range blocks|Range IP blocks]]

[[Category:Help| ]]
__NOTOC__</text>
    </revision>
    <revision>
      <id>43275</id>
      <timestamp>2010-05-17T18:54:00Z</timestamp>
      <contributor>
        <ip>78.27.22.204</ip>
      </contributor>
      <comment>Replaced content with 'porno'</comment>
      <text xml:space="preserve">porno</text>
    </revision>
    <revision>
      <id>43277</id>
      <timestamp>2010-05-17T21:50:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/78.27.22.204|78.27.22.204]] ([[User talk:78.27.22.204|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">==Reading==
* [[Help:Navigation|Navigation]]
* [[Help:Searching|Searching]]
* [[Help:Tracking changes|Tracking changes]]

==Editing==
* [[Help:Editing pages|Editing pages]]
* [[Help:Starting a new page|Starting a new page]]
* [[Help:Formatting|Formatting]]
* [[Help:Links|Links]]
* [[Help:User page|User pages]]
* [[Help:Talk pages|Talk pages]]

===Advanced editing===
* [[Help:Images|Images]]
* [[Help:Tables|Tables]]
* [[Help:Categories|Categories]]
* [[Help:Subpages|Subpages]]
* [[Help:Managing files|Managing files]]
* [[Help:Moving a page|Moving a page]]
* [[Help:Redirects|Redirects]]
* [[Help:Deleting a page|Deleting a page]]

* [[Help:Templates|Templates]]
* [[Help:Variables|Variables]]
* [[Help:Namespaces|Namespaces]]
* [[Help:Interwiki linking|Interwiki linking]]

* [[Help:Special pages|Special pages]]
* [[Help:External searches|External searches]]
* [[Help:Patrolled edits|Patrolled edits]]

===Personal customizing===
* [[Help:Preferences|Preferences]]
* [[Help:Skins|Skins]]

==Wiki administration==
The following features requires extra permissions that are not normally granted to all wiki users.

* [[Help:Range blocks|Range IP blocks]]

[[Category:Help| ]]
__NOTOC__</text>
    </revision>
  </page>
  <page>
    <title>Help:Deleting a page</title>
    <id>54</id>
    <revision>
      <id>128</id>
      <timestamp>2008-02-07T03:43:52Z</timestamp>
      <contributor>
        <ip>Ans</ip>
      </contributor>
      <minor/>
      <comment>change :cat template name to meet PD help guidelines</comment>
      <text xml:space="preserve">{{#ifexist: Template:PD Help Page/{{SUBPAGENAME}}|{{PD Help Page/{{SUBPAGENAME}}}}|{{PD Help Page}}}}



== When to delete a page ==
Typically you would delete a page if the contents are entirely inappropriate, and do not match the purposes of the wiki. In other situations you might prefer a less extreme course of action, for example...

* The page should have a different title - So just &quot;move&quot; the page to a better title. See [[Help:Moving a page]]
* The contents should have been placed on a different page - So &quot;merge&quot; the contents into the existing page and then create a redirect. See [[Help:Redirects]]
* The contents are already on a different page - So wipe away all the duplicate content and leave behind a redirect. That way, this page title (which made more sense to somebody), will helpfully redirect to the correct location of the information. See [[Help:Redirects]]
* The page is out-of-date - So update it! If the page describes a current or future event, which has now passed, reword all of the sentences to be in the past tense, that way you have created a page which acts as a historical record. Alternatively label the information as out-of-date, with a warning notice.

So in fact a straightforward delete is generally only necessary if the ''title'' of the page is inappropriate. In other situations, a merge and redirect is more appropriate.

=== Proposing changes ===
Deciding on appropriate content/page titles can be a difficult aspect of wiki organization, and one which can often provoke debates. If the merge or deletion you have in mind, is one which might cause upset, you should propose the change first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a delete/merge proposal template, to make everybody aware of your intentions

=== Unlinking a page ===
If a page is no longer of any value, then you won't have any links pointing to it right? Well you might be surprised. The 'What links here' toolbox feature (bottom left) will tell you which other wiki pages link in to the current page. Always use this feature to check before proceeding with deleting. These related pages will need to be edited, to reflect the change.

== Deletion itself ==
'''Normal users''' cannot permanently delete a wiki page. This is an entirely deliberate design feature, which is an important part of why wikis work. Every kind of editing operation can be reverted by any other user, and that includes resurrecting deleted content. Try not to let it wind you up too much. It doesn't cause significant wasted space, and with nothing but a 'delete' label the page is effectively deleted anyway.

'Sysop' users ''are'' able to delete a page semi-permanently (in fact the old editing history is still preserved, but to normal users the page will appear to no longer exist). A user logged in with sysop privileges will see an extra tab 'delete' for deleting the current page. Procedures may vary, but typically a sysop user might look for delete labels, and do a proper delete on these pages, if the wiki community seems to agree on this action (allowing a period of time for debate perhaps). In situations where the page title is offensive, or the contents (which remain in the history) are legally sensitive, a sysop user should do a &quot;speedy deletion&quot;.

==External links==
{{meta|Help:Deleting a page}}

{{Languages|Help:Deleting a page}}

{{Help Category|Help}}</text>
    </revision>
    <revision>
      <id>129</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{#ifexist: Template:PD Help Page/{{SUBPAGENAME}}|{{PD Help Page/{{SUBPAGENAME}}}}|{{PD Help Page}}}}



== When to delete a page ==
Typically you would delete a page if the contents are entirely inappropriate, and do not match the purposes of the wiki. In other situations you might prefer a less extreme course of action, for example...

* The page should have a different title - So just &quot;move&quot; the page to a better title. See [[Help:Moving a page]]
* The contents should have been placed on a different page - So &quot;merge&quot; the contents into the existing page and then create a redirect. See [[Help:Redirects]]
* The contents are already on a different page - So wipe away all the duplicate content and leave behind a redirect. That way, this page title (which made more sense to somebody), will helpfully redirect to the correct location of the information. See [[Help:Redirects]]
* The page is out-of-date - So update it! If the page describes a current or future event, which has now passed, reword all of the sentences to be in the past tense, that way you have created a page which acts as a historical record. Alternatively label the information as out-of-date, with a warning notice.

So in fact a straightforward delete is generally only necessary if the ''title'' of the page is inappropriate. In other situations, a merge and redirect is more appropriate.

=== Proposing changes ===
Deciding on appropriate content/page titles can be a difficult aspect of wiki organization, and one which can often provoke debates. If the merge or deletion you have in mind, is one which might cause upset, you should propose the change first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a delete/merge proposal template, to make everybody aware of your intentions

=== Unlinking a page ===
If a page is no longer of any value, then you won't have any links pointing to it right? Well you might be surprised. The 'What links here' toolbox feature (bottom left) will tell you which other wiki pages link in to the current page. Always use this feature to check before proceeding with deleting. These related pages will need to be edited, to reflect the change.

== Deletion itself ==
'''Normal users''' cannot permanently delete a wiki page. This is an entirely deliberate design feature, which is an important part of why wikis work. Every kind of editing operation can be reverted by any other user, and that includes resurrecting deleted content. Try not to let it wind you up too much. It doesn't cause significant wasted space, and with nothing but a 'delete' label the page is effectively deleted anyway.

'Sysop' users ''are'' able to delete a page semi-permanently (in fact the old editing history is still preserved, but to normal users the page will appear to no longer exist). A user logged in with sysop privileges will see an extra tab 'delete' for deleting the current page. Procedures may vary, but typically a sysop user might look for delete labels, and do a proper delete on these pages, if the wiki community seems to agree on this action (allowing a period of time for debate perhaps). In situations where the page title is offensive, or the contents (which remain in the history) are legally sensitive, a sysop user should do a &quot;speedy deletion&quot;.

==External links==
{{meta|Help:Deleting a page}}

{{Languages|Help:Deleting a page}}

{{Help Category|Help}}</text>
    </revision>
    <revision>
      <id>211</id>
      <timestamp>2008-02-18T19:50:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">== When to delete a page ==
Typically you would delete a page if the contents are entirely inappropriate, and do not match the purposes of the wiki. In other situations you might prefer a less extreme course of action, for example...

* The page should have a different title - So just &quot;move&quot; the page to a better title. See [[Help:Moving a page]]
* The contents should have been placed on a different page - So &quot;merge&quot; the contents into the existing page and then create a redirect. See [[Help:Redirects]]
* The contents are already on a different page - So wipe away all the duplicate content and leave behind a redirect. That way, this page title (which made more sense to somebody), will helpfully redirect to the correct location of the information. See [[Help:Redirects]]
* The page is out-of-date - So update it! If the page describes a current or future event, which has now passed, reword all of the sentences to be in the past tense, that way you have created a page which acts as a historical record. Alternatively label the information as out-of-date, with a warning notice.

So in fact a straightforward delete is generally only necessary if the ''title'' of the page is inappropriate. In other situations, a merge and redirect is more appropriate.

=== Proposing changes ===
Deciding on appropriate content/page titles can be a difficult aspect of wiki organization, and one which can often provoke debates. If the merge or deletion you have in mind, is one which might cause upset, you should propose the change first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a delete/merge proposal template, to make everybody aware of your intentions

=== Unlinking a page ===
If a page is no longer of any value, then you won't have any links pointing to it right? Well you might be surprised. The 'What links here' toolbox feature (bottom left) will tell you which other wiki pages link in to the current page. Always use this feature to check before proceeding with deleting. These related pages will need to be edited, to reflect the change.

== Deletion itself ==
'''Normal users''' cannot permanently delete a wiki page. This is an entirely deliberate design feature, which is an important part of why wikis work. Every kind of editing operation can be reverted by any other user, and that includes resurrecting deleted content. Try not to let it wind you up too much. It doesn't cause significant wasted space, and with nothing but a 'delete' label the page is effectively deleted anyway.

'Sysop' users ''are'' able to delete a page semi-permanently (in fact the old editing history is still preserved, but to normal users the page will appear to no longer exist). A user logged in with sysop privileges will see an extra tab 'delete' for deleting the current page. Procedures may vary, but typically a sysop user might look for delete labels, and do a proper delete on these pages, if the wiki community seems to agree on this action (allowing a period of time for debate perhaps). In situations where the page title is offensive, or the contents (which remain in the history) are legally sensitive, a sysop user should do a &quot;speedy deletion&quot;.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>339</id>
      <timestamp>2008-02-21T17:20:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Deletion itself */</comment>
      <text xml:space="preserve">== When to delete a page ==
Typically you would delete a page if the contents are entirely inappropriate, and do not match the purposes of the wiki. In other situations you might prefer a less extreme course of action, for example...

* The page should have a different title - So just &quot;move&quot; the page to a better title. See [[Help:Moving a page]]
* The contents should have been placed on a different page - So &quot;merge&quot; the contents into the existing page and then create a redirect. See [[Help:Redirects]]
* The contents are already on a different page - So wipe away all the duplicate content and leave behind a redirect. That way, this page title (which made more sense to somebody), will helpfully redirect to the correct location of the information. See [[Help:Redirects]]
* The page is out-of-date - So update it! If the page describes a current or future event, which has now passed, reword all of the sentences to be in the past tense, that way you have created a page which acts as a historical record. Alternatively label the information as out-of-date, with a warning notice.

So in fact a straightforward delete is generally only necessary if the ''title'' of the page is inappropriate. In other situations, a merge and redirect is more appropriate.

=== Proposing changes ===
Deciding on appropriate content/page titles can be a difficult aspect of wiki organization, and one which can often provoke debates. If the merge or deletion you have in mind, is one which might cause upset, you should propose the change first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a delete/merge proposal template, to make everybody aware of your intentions

=== Unlinking a page ===
If a page is no longer of any value, then you won't have any links pointing to it right? Well you might be surprised. The 'What links here' toolbox feature (bottom left) will tell you which other wiki pages link in to the current page. Always use this feature to check before proceeding with deleting. These related pages will need to be edited, to reflect the change.

== Deletion itself ==
'''Normal users''' cannot permanently delete a wiki page. This is an entirely deliberate design feature, which is an important part of why wikis work. Every kind of editing operation can be reverted by any other user, and that includes resurrecting deleted content. Try not to let it wind you up too much. If you really want a page to be gone, propose it for deletion by adding the {{[[Template:delete|delete]]}} tag and explaining the reason on the corresponding discussion page. At some point an [[Project:Administrators|administrator]] may delete the page, if that's really necessary.

'Sysop' users ''are'' able to delete a page semi-permanently (in fact the old editing history is still preserved, but to normal users the page will appear to no longer exist). A user logged in with sysop privileges will see an extra tab 'delete' for deleting the current page. Procedures may vary, but typically a sysop user might look for delete labels, and do a proper delete on these pages, if the wiki community seems to agree on this action (allowing a period of time for debate perhaps). In situations where the page title is offensive, or the contents (which remain in the history) are legally sensitive, a sysop user should do a &quot;speedy deletion&quot;.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Editing pages</title>
    <id>42</id>
    <revision>
      <id>100</id>
      <timestamp>2007-12-24T03:58:58Z</timestamp>
      <contributor>
        <ip>Anonymous Dissident</ip>
      </contributor>
      <minor/>
      <comment>minor mod</comment>
      <text xml:space="preserve">{{PD Help Page}}
It's very easy to edit the contents of a wiki. It only takes a few clicks.

* Click the '''edit''' [[Help:Navigation#Page Tabs|page tab]] at the top of the page.
* Make changes to the text.
* Click the '''Save page''' button.

Simple as that!

== Editing rules, editing conventions, and formatting ==

The number one rule of wiki editing, is to ''be bold''. Dive in and make changes. Other people can correct mistakes later, so have confidence, and give it a try! There can be all kinds of editing conventions, rules, and philosophy governing the editing of wiki pages, but the &quot;be bold&quot; rule overrides these!

In general try to write clearly and concisely and make sure you are always aiming to do something which improves the wiki contents. An edit might be to contribute whole paragraphs or pages full of information, or it could be as simple as fixing a typo/spelling mistakes.

When you need to use some type of formatting e.g. new headings or '''bold''' text, you do this using wiki syntax, see [[Help:Formatting]] for some of the common types of formatting used.

== Edit Summary ==

Before you save a change, you can enter a short note in the '''Summary''' box describing your changes. Don't worry too much about this, or spend too much time thinking about it, but try to give a little description of what you just changed e.g. &quot;''fixed typo''&quot; or &quot;''added more information about sunflowers''&quot;.

The summary gets stored alongside your edit, and allows people to [[Help:Tracking changes|track changes]] in the wiki more effectively.

== Preview ==

It's a good idea to use the 'Show preview' button to see what your change will look like, before you save it. This is also related to [[Help:Tracking changes|tracking changes]] because every time you save, this is displayed to others as a separate change. This isn't something to worry about too much, but it's good to get into the habit of eliminating mistakes in your own work, by using a preview before saving, rather than saving several minor corrections afterwards. 

== Other types of editing ==
With wiki edits you can start a new page, move (or rename) a page, or even delete a page:
* [[Help:Starting a new page]]
* [[Help:Moving a page]]
* [[Help:Deleting a page]]
Remember you should always aim to improve the overall contents of the wiki with your edits.

== Discussion ==
Every article has its own &quot;talk page&quot; where you can ask questions, make suggestions, or discuss corrections. See [[Help:Talk pages]] 

== External Links ==
{{meta|Help:Editing}}

{{Languages|Help:Editing pages}}

[[Category:Edit]]
[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>101</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
It's very easy to edit the contents of a wiki. It only takes a few clicks.

* Click the '''edit''' [[Help:Navigation#Page Tabs|page tab]] at the top of the page.
* Make changes to the text.
* Click the '''Save page''' button.

Simple as that!

== Editing rules, editing conventions, and formatting ==

The number one rule of wiki editing, is to ''be bold''. Dive in and make changes. Other people can correct mistakes later, so have confidence, and give it a try! There can be all kinds of editing conventions, rules, and philosophy governing the editing of wiki pages, but the &quot;be bold&quot; rule overrides these!

In general try to write clearly and concisely and make sure you are always aiming to do something which improves the wiki contents. An edit might be to contribute whole paragraphs or pages full of information, or it could be as simple as fixing a typo/spelling mistakes.

When you need to use some type of formatting e.g. new headings or '''bold''' text, you do this using wiki syntax, see [[Help:Formatting]] for some of the common types of formatting used.

== Edit Summary ==

Before you save a change, you can enter a short note in the '''Summary''' box describing your changes. Don't worry too much about this, or spend too much time thinking about it, but try to give a little description of what you just changed e.g. &quot;''fixed typo''&quot; or &quot;''added more information about sunflowers''&quot;.

The summary gets stored alongside your edit, and allows people to [[Help:Tracking changes|track changes]] in the wiki more effectively.

== Preview ==

It's a good idea to use the 'Show preview' button to see what your change will look like, before you save it. This is also related to [[Help:Tracking changes|tracking changes]] because every time you save, this is displayed to others as a separate change. This isn't something to worry about too much, but it's good to get into the habit of eliminating mistakes in your own work, by using a preview before saving, rather than saving several minor corrections afterwards. 

== Other types of editing ==
With wiki edits you can start a new page, move (or rename) a page, or even delete a page:
* [[Help:Starting a new page]]
* [[Help:Moving a page]]
* [[Help:Deleting a page]]
Remember you should always aim to improve the overall contents of the wiki with your edits.

== Discussion ==
Every article has its own &quot;talk page&quot; where you can ask questions, make suggestions, or discuss corrections. See [[Help:Talk pages]] 

== External Links ==
{{meta|Help:Editing}}

{{Languages|Help:Editing pages}}

[[Category:Edit]]
[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>193</id>
      <timestamp>2008-02-18T19:12:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">It's very easy to edit the contents of a wiki. It only takes a few clicks.

* Click the '''edit''' [[Help:Navigation#Page Tabs|page tab]] at the top of the page.
* Make changes to the text.
* Click the '''Save page''' button.

Simple as that!

== Editing rules, editing conventions, and formatting ==

The number one rule of wiki editing, is to ''be bold''. Dive in and make changes. Other people can correct mistakes later, so have confidence, and give it a try! There can be all kinds of editing conventions, rules, and philosophy governing the editing of wiki pages, but the &quot;be bold&quot; rule overrides these!

In general try to write clearly and concisely and make sure you are always aiming to do something which improves the wiki contents. An edit might be to contribute whole paragraphs or pages full of information, or it could be as simple as fixing a typo/spelling mistakes.

When you need to use some type of formatting e.g. new headings or '''bold''' text, you do this using wiki syntax, see [[Help:Formatting]] for some of the common types of formatting used.

== Edit Summary ==

Before you save a change, you can enter a short note in the '''Summary''' box describing your changes. Don't worry too much about this, or spend too much time thinking about it, but try to give a little description of what you just changed e.g. &quot;''fixed typo''&quot; or &quot;''added more information about sunflowers''&quot;.

The summary gets stored alongside your edit, and allows people to [[Help:Tracking changes|track changes]] in the wiki more effectively.

== Preview ==

It's a good idea to use the 'Show preview' button to see what your change will look like, before you save it. This is also related to [[Help:Tracking changes|tracking changes]] because every time you save, this is displayed to others as a separate change. This isn't something to worry about too much, but it's good to get into the habit of eliminating mistakes in your own work, by using a preview before saving, rather than saving several minor corrections afterwards. 

== Other types of editing ==
With wiki edits you can start a new page, move (or rename) a page, or even delete a page:
* [[Help:Starting a new page]]
* [[Help:Moving a page]]
* [[Help:Deleting a page]]
Remember you should always aim to improve the overall contents of the wiki with your edits.

== Discussion ==
Every article has its own &quot;talk page&quot; where you can ask questions, make suggestions, or discuss corrections. See [[Help:Talk pages]] 

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>291</id>
      <timestamp>2008-02-20T09:32:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Editing rules, editing conventions, and formatting */</comment>
      <text xml:space="preserve">It's very easy to edit the contents of a wiki. It only takes a few clicks.

* Click the '''edit''' [[Help:Navigation#Page Tabs|page tab]] at the top of the page.
* Make changes to the text.
* Click the '''Save page''' button.

Simple as that!

== Editing rules, editing conventions, and formatting ==

The number one rule of wiki editing, is to '''[[Wikipedia:Wikipedia:Be bold|be bold]]'''. Dive in and make changes. Other people can correct mistakes later, so have confidence, and give it a try! There can be all kinds of editing conventions, rules, and philosophy governing the editing of wiki pages, but the &quot;be bold&quot; rule overrides these!

In general try to write clearly and concisely and make sure you are always aiming to do something which improves the wiki contents. An edit might be to contribute whole paragraphs or pages full of information, or it could be as simple as fixing a typo/spelling mistakes.

When you need to use some type of formatting e.g. new headings or '''bold''' text, you do this using wiki syntax, see [[Help:Formatting]] for some of the common types of formatting used.

== Edit Summary ==

Before you save a change, you can enter a short note in the '''Summary''' box describing your changes. Don't worry too much about this, or spend too much time thinking about it, but try to give a little description of what you just changed e.g. &quot;''fixed typo''&quot; or &quot;''added more information about sunflowers''&quot;.

The summary gets stored alongside your edit, and allows people to [[Help:Tracking changes|track changes]] in the wiki more effectively.

== Preview ==

It's a good idea to use the 'Show preview' button to see what your change will look like, before you save it. This is also related to [[Help:Tracking changes|tracking changes]] because every time you save, this is displayed to others as a separate change. This isn't something to worry about too much, but it's good to get into the habit of eliminating mistakes in your own work, by using a preview before saving, rather than saving several minor corrections afterwards. 

== Other types of editing ==
With wiki edits you can start a new page, move (or rename) a page, or even delete a page:
* [[Help:Starting a new page]]
* [[Help:Moving a page]]
* [[Help:Deleting a page]]
Remember you should always aim to improve the overall contents of the wiki with your edits.

== Discussion ==
Every article has its own &quot;talk page&quot; where you can ask questions, make suggestions, or discuss corrections. See [[Help:Talk pages]] 

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>298</id>
      <timestamp>2008-02-20T13:20:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Editing rules, editing conventions, and formatting */</comment>
      <text xml:space="preserve">It's very easy to edit the contents of a wiki. It only takes a few clicks.

* Click the '''edit''' [[Help:Navigation#Page Tabs|page tab]] at the top of the page.
* Make changes to the text.
* Click the '''Save page''' button.

Simple as that!

== Editing rules, editing conventions, and formatting ==

The number one rule of wiki editing, is to '''[[Wikipedia:Wikipedia:Be bold|be bold]]'''. Dive in and make changes. Other people can correct mistakes later, so have confidence, and give it a try! There can be all kinds of [[Project:Style Guide|editing conventions, rules, and philosophy]] governing the editing of wiki pages, but the &quot;be bold&quot; rule overrides these!

In general try to write clearly and concisely and make sure you are always aiming to do something which improves the wiki contents. An edit might be to contribute whole paragraphs or pages full of information, or it could be as simple as fixing a typo/spelling mistakes.

When you need to use some type of formatting e.g. new headings or '''bold''' text, you do this using wiki syntax, see [[Help:Formatting]] for some of the common types of formatting used.

== Edit Summary ==

Before you save a change, you can enter a short note in the '''Summary''' box describing your changes. Don't worry too much about this, or spend too much time thinking about it, but try to give a little description of what you just changed e.g. &quot;''fixed typo''&quot; or &quot;''added more information about sunflowers''&quot;.

The summary gets stored alongside your edit, and allows people to [[Help:Tracking changes|track changes]] in the wiki more effectively.

== Preview ==

It's a good idea to use the 'Show preview' button to see what your change will look like, before you save it. This is also related to [[Help:Tracking changes|tracking changes]] because every time you save, this is displayed to others as a separate change. This isn't something to worry about too much, but it's good to get into the habit of eliminating mistakes in your own work, by using a preview before saving, rather than saving several minor corrections afterwards. 

== Other types of editing ==
With wiki edits you can start a new page, move (or rename) a page, or even delete a page:
* [[Help:Starting a new page]]
* [[Help:Moving a page]]
* [[Help:Deleting a page]]
Remember you should always aim to improve the overall contents of the wiki with your edits.

== Discussion ==
Every article has its own &quot;talk page&quot; where you can ask questions, make suggestions, or discuss corrections. See [[Help:Talk pages]] 

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>384</id>
      <timestamp>2008-02-24T14:45:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">It's very easy to edit the contents of a wiki. It only takes a few clicks.

* Click the '''edit''' [[Help:Navigation#Page Tabs|page tab]] at the top of the page.
* Make changes to the text.
* Click the '''Save page''' button.

Simple as that!

== Editing rules, editing conventions, and formatting ==

The number one rule of wiki editing, is to '''[[Wikipedia:Wikipedia:Be bold|be bold]]'''. Dive in and make changes. Other people can correct mistakes later, so have confidence, and give it a try! There can be all kinds of [[Project:Style guide|editing conventions, rules, and philosophy]] governing the editing of wiki pages, but the &quot;be bold&quot; rule overrides these!

In general try to write clearly and concisely and make sure you are always aiming to do something which improves the wiki contents. An edit might be to contribute whole paragraphs or pages full of information, or it could be as simple as fixing a typo/spelling mistakes.

When you need to use some type of formatting e.g. new headings or '''bold''' text, you do this using wiki syntax, see [[Help:Formatting]] for some of the common types of formatting used.

== Edit Summary ==

Before you save a change, you can enter a short note in the '''Summary''' box describing your changes. Don't worry too much about this, or spend too much time thinking about it, but try to give a little description of what you just changed e.g. &quot;''fixed typo''&quot; or &quot;''added more information about sunflowers''&quot;.

The summary gets stored alongside your edit, and allows people to [[Help:Tracking changes|track changes]] in the wiki more effectively.

== Preview ==

It's a good idea to use the 'Show preview' button to see what your change will look like, before you save it. This is also related to [[Help:Tracking changes|tracking changes]] because every time you save, this is displayed to others as a separate change. This isn't something to worry about too much, but it's good to get into the habit of eliminating mistakes in your own work, by using a preview before saving, rather than saving several minor corrections afterwards. 

== Other types of editing ==
With wiki edits you can start a new page, move (or rename) a page, or even delete a page:
* [[Help:Starting a new page]]
* [[Help:Moving a page]]
* [[Help:Deleting a page]]
Remember you should always aim to improve the overall contents of the wiki with your edits.

== Discussion ==
Every article has its own &quot;talk page&quot; where you can ask questions, make suggestions, or discuss corrections. See [[Help:Talk pages]] 

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:External searches</title>
    <id>61</id>
    <revision>
      <id>142</id>
      <timestamp>2008-01-26T13:55:25Z</timestamp>
      <contributor>
        <ip>60.240.125.92</ip>
      </contributor>
      <comment>Domain has expired</comment>
      <text xml:space="preserve">{{PD Help Page}}
It is possible to create an external searches of a topic using key words using a template.

For example, this is something that would work for Google:
&lt;pre&gt;&lt;nowiki&gt;
&lt;span style=&quot;border: 1px solid #CCD5DB;&quot;&gt;[[Image:GoogleIcon.PNG]] [http://www.google.com/search?hl=en&amp;safe=off&amp;q={{{1|Wiki}}}&amp;btnG=Search&amp;meta= {{{1|Google}}}]&lt;/span&gt;
==Usage==
Allows to establish a link to a search query at the Google search engine:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
{{Google|Term1+Term2+Term3}}
&amp;lt;/pre&gt;&lt;/div&gt;
[[Category:Template|Google]]
&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/pre&gt;

The usage is very simple and easy to use. &lt;nowiki&gt;{{Google|firstTerm+Second+etc}}&lt;/nowiki&gt; 

It is also possible to do phrases by using %22Term1+Term2+etc%22

*External searches are useful where an article requires certain keywords to make an effective search.
*For the editor it allows making searches of web more quickly and painlessly.

Other applications of the template include searching Forums, for bug reports of the same type for software development wikis where the wiki and forum work together.

Note: Wikipedia has an [[help:interwiki linking|interwiki prefix]] with a similar affect, so you can link to google results with &lt;nowiki&gt;[[Google:firstTerm+Second+etc]]&lt;/nowiki&gt;, although templates are still useful for linking other search engines.

{{languages|Help:External searches}}

[[Category:Help|External Searches]]
[[Category:Search]]</text>
    </revision>
    <revision>
      <id>143</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
It is possible to create an external searches of a topic using key words using a template.

For example, this is something that would work for Google:
&lt;pre&gt;&lt;nowiki&gt;
&lt;span style=&quot;border: 1px solid #CCD5DB;&quot;&gt;[[Image:GoogleIcon.PNG]] [http://www.google.com/search?hl=en&amp;safe=off&amp;q={{{1|Wiki}}}&amp;btnG=Search&amp;meta= {{{1|Google}}}]&lt;/span&gt;
==Usage==
Allows to establish a link to a search query at the Google search engine:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
{{Google|Term1+Term2+Term3}}
&amp;lt;/pre&gt;&lt;/div&gt;
[[Category:Template|Google]]
&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/pre&gt;

The usage is very simple and easy to use. &lt;nowiki&gt;{{Google|firstTerm+Second+etc}}&lt;/nowiki&gt; 

It is also possible to do phrases by using %22Term1+Term2+etc%22

*External searches are useful where an article requires certain keywords to make an effective search.
*For the editor it allows making searches of web more quickly and painlessly.

Other applications of the template include searching Forums, for bug reports of the same type for software development wikis where the wiki and forum work together.

Note: Wikipedia has an [[help:interwiki linking|interwiki prefix]] with a similar affect, so you can link to google results with &lt;nowiki&gt;[[Google:firstTerm+Second+etc]]&lt;/nowiki&gt;, although templates are still useful for linking other search engines.

{{languages|Help:External searches}}

[[Category:Help|External Searches]]
[[Category:Search]]</text>
    </revision>
    <revision>
      <id>219</id>
      <timestamp>2008-02-18T20:10:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">It is possible to create an external searches of a topic using key words using a template.

For example, this is something that would work for Google:
&lt;pre&gt;&lt;nowiki&gt;
&lt;span style=&quot;border: 1px solid #CCD5DB;&quot;&gt;[[Image:GoogleIcon.PNG]] [http://www.google.com/search?hl=en&amp;safe=off&amp;q={{{1|Wiki}}}&amp;btnG=Search&amp;meta= {{{1|Google}}}]&lt;/span&gt;
==Usage==
Allows to establish a link to a search query at the Google search engine:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
{{Google|Term1+Term2+Term3}}
&amp;lt;/pre&gt;&lt;/div&gt;
[[Category:Template|Google]]
&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/pre&gt;

The usage is very simple and easy to use. &lt;nowiki&gt;{{Google|firstTerm+Second+etc}}&lt;/nowiki&gt; 

It is also possible to do phrases by using %22Term1+Term2+etc%22

*External searches are useful where an article requires certain keywords to make an effective search.
*For the editor it allows making searches of web more quickly and painlessly.

Other applications of the template include searching Forums, for bug reports of the same type for software development wikis where the wiki and forum work together.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Formatting</title>
    <id>26</id>
    <revision>
      <id>52</id>
      <timestamp>2007-06-27T13:57:49Z</timestamp>
      <contributor>
        <ip>W0rf</ip>
      </contributor>
      <minor/>
      <comment>/* Emphasis */</comment>
      <text xml:space="preserve">__TOC__

==Spaces, New Lines, Paragraphs, And More==
You might have already noticed that single spaces between lines do not create spaces in the text. For example:

&lt;pre&gt;&lt;nowiki&gt;
Typing 
like 
this
would come out 
like this:
&lt;/nowiki&gt;&lt;/pre&gt;

Typing
like
this 
would come out 
like this:

A blank space between the two lines, on the other hand, creates a new paragraph. For example:

&lt;pre&gt;&lt;nowiki&gt;
This would look like one paragraph.

This would look like another.

This would be the third.
&lt;/nowiki&gt;&lt;/pre&gt;

This would look like one paragraph.

This would look like another.

This would be the third.

For a new line, you must use the line break (br) command after the line. (Single Spaces are not necessary, but are used for clarity.)

Just do this:
&lt;pre&gt;&lt;nowiki&gt;
Text Line 1&lt;br&gt;
Text Line 2&lt;br&gt;

Paragraph 2 Line 1
&lt;/nowiki&gt;&lt;/pre&gt;

'''Remember:''' For the sake of clarity, it is best to place a line break, but not necessary.

==Emphasis==
'''Hello!'''

''How Are You?''

This is basic, but important. Use three 's for a Bold and two for italics. The above section was made like this:

&lt;pre&gt;&lt;nowiki&gt;
'''Hello!'''

''How Are You?''
&lt;/nowiki&gt;&lt;/pre&gt;

HTML encoding also works, such as &lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Lists==
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.

&lt;pre&gt;&lt;nowiki&gt;
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.
&lt;/nowiki&gt;&lt;/pre&gt;

#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.

&lt;pre&gt;&lt;nowiki&gt;
#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.
&lt;/nowiki&gt;&lt;/pre&gt;

*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.

&lt;pre&gt;&lt;nowiki&gt;
*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.
&lt;/nowiki&gt;&lt;/pre&gt;

==Horizontal Rules==
Don't use these too often, as they break up the page. Instead, it is recommended you use section breaks (see below). If you really need them, however, this is the formatting:

&lt;pre&gt;&lt;nowiki&gt;
----
&lt;/nowiki&gt;&lt;/pre&gt;

==Indentation==
:A colon indents a line.
&lt;pre&gt;&lt;nowiki&gt;
:A colon indents a line.
&lt;/nowiki&gt;&lt;/pre&gt;

==Alignment==
A page is left-aligned by default.
&lt;center&gt; Center Text Like This &lt;/center&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;center&gt; Center Text Like This &lt;/center&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Section Breaks==
Many articles on the wiki use section headers and tables of contents, like the ones above. Two equal(=) signs makes a topic.

&lt;pre&gt;&lt;nowiki&gt;
==This Is a Topic==
===This Is a Subtopic===
====This is a Sub Sub Topic====
===This is a subtopic of the first topic, but not the other sub topics===
==This is another topic==
&lt;/nowiki&gt;&lt;/pre&gt;

To add a Table Of Contents, type:

&lt;pre&gt;&lt;nowiki&gt;
__TOC__
&lt;/nowiki&gt;&lt;/pre&gt;

If a Table of Contents is automatic for the article (true for certian namespaces and templates), you can use this formatting to remove one:

&lt;pre&gt;&lt;nowiki&gt;
__NOTOC__
&lt;/nowiki&gt;&lt;/pre&gt;

'''Note:''' Table of contents lists only list topics that appear after they are inserted.</text>
    </revision>
    <revision>
      <id>53</id>
      <timestamp>2008-02-17T18:39:08Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">__TOC__

==Spaces, New Lines, Paragraphs, And More==
You might have already noticed that single spaces between lines do not create spaces in the text. For example:

&lt;pre&gt;&lt;nowiki&gt;
Typing 
like 
this
would come out 
like this:
&lt;/nowiki&gt;&lt;/pre&gt;

Typing
like
this 
would come out 
like this:

A blank space between the two lines, on the other hand, creates a new paragraph. For example:

&lt;pre&gt;&lt;nowiki&gt;
This would look like one paragraph.

This would look like another.

This would be the third.
&lt;/nowiki&gt;&lt;/pre&gt;

This would look like one paragraph.

This would look like another.

This would be the third.

For a new line, you must use the line break (br) command after the line. (Single Spaces are not necessary, but are used for clarity.)

Just do this:
&lt;pre&gt;&lt;nowiki&gt;
Text Line 1&lt;br&gt;
Text Line 2&lt;br&gt;

Paragraph 2 Line 1
&lt;/nowiki&gt;&lt;/pre&gt;

'''Remember:''' For the sake of clarity, it is best to place a line break, but not necessary.

==Emphasis==
'''Hello!'''

''How Are You?''

This is basic, but important. Use three 's for a Bold and two for italics. The above section was made like this:

&lt;pre&gt;&lt;nowiki&gt;
'''Hello!'''

''How Are You?''
&lt;/nowiki&gt;&lt;/pre&gt;

HTML encoding also works, such as &lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Lists==
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.

&lt;pre&gt;&lt;nowiki&gt;
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.
&lt;/nowiki&gt;&lt;/pre&gt;

#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.

&lt;pre&gt;&lt;nowiki&gt;
#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.
&lt;/nowiki&gt;&lt;/pre&gt;

*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.

&lt;pre&gt;&lt;nowiki&gt;
*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.
&lt;/nowiki&gt;&lt;/pre&gt;

==Horizontal Rules==
Don't use these too often, as they break up the page. Instead, it is recommended you use section breaks (see below). If you really need them, however, this is the formatting:

&lt;pre&gt;&lt;nowiki&gt;
----
&lt;/nowiki&gt;&lt;/pre&gt;

==Indentation==
:A colon indents a line.
&lt;pre&gt;&lt;nowiki&gt;
:A colon indents a line.
&lt;/nowiki&gt;&lt;/pre&gt;

==Alignment==
A page is left-aligned by default.
&lt;center&gt; Center Text Like This &lt;/center&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;center&gt; Center Text Like This &lt;/center&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Section Breaks==
Many articles on the wiki use section headers and tables of contents, like the ones above. Two equal(=) signs makes a topic.

&lt;pre&gt;&lt;nowiki&gt;
==This Is a Topic==
===This Is a Subtopic===
====This is a Sub Sub Topic====
===This is a subtopic of the first topic, but not the other sub topics===
==This is another topic==
&lt;/nowiki&gt;&lt;/pre&gt;

To add a Table Of Contents, type:

&lt;pre&gt;&lt;nowiki&gt;
__TOC__
&lt;/nowiki&gt;&lt;/pre&gt;

If a Table of Contents is automatic for the article (true for certian namespaces and templates), you can use this formatting to remove one:

&lt;pre&gt;&lt;nowiki&gt;
__NOTOC__
&lt;/nowiki&gt;&lt;/pre&gt;

'''Note:''' Table of contents lists only list topics that appear after they are inserted.</text>
    </revision>
    <revision>
      <id>104</id>
      <timestamp>2008-01-24T04:00:42Z</timestamp>
      <contributor>
        <ip>Zachary</ip>
      </contributor>
      <comment>doesn't need the TOCright template</comment>
      <text xml:space="preserve">{{PD Help Page}}
You can format your text using wiki markup. This consists of normal characters like asterisks, single quotes or equation marks which have a special function in the wiki, sometimes depending on their position. For example, to format a word in ''italic'', you include it in two single quotes like &lt;tt&gt;&lt;nowiki&gt;''this''&lt;/nowiki&gt;&lt;/tt&gt;

== Text formatting markup ==

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Description'''
|{{Hl2}} |'''You type'''	
|{{Hl2}} |'''You get'''
|-
| colspan=&quot;3&quot; align=&quot;center&quot; | ''applies anywhere''
|-
|Italic text
|&lt;tt&gt;&lt;nowiki&gt;''italic''&lt;/nowiki&gt;&lt;/tt&gt;
|''italic''
|-
| Bold text
|&lt;tt&gt;&lt;nowiki&gt;'''bold'''&lt;/nowiki&gt;&lt;/tt&gt;
|'''bold'''
|-
| Bold and italic
|&lt;tt&gt;&lt;nowiki&gt;'''''bold &amp; italic'''''&lt;/nowiki&gt;&lt;/tt&gt;
|'''''bold &amp; italic'''''
|-
|Escape wiki markup
|&lt;tt&gt;&lt;nowiki&gt;&lt;nowiki&gt;no ''markup''&lt;/nowiki&gt;&lt;/nowiki&gt;&lt;/tt&gt;
|&lt;nowiki&gt;no ''markup''&lt;/nowiki&gt;
|-
| colspan=&quot;3&quot; align=&quot;center&quot; | ''only at the beginning of the line''
|-
| Indent text
|&lt;tt&gt;&lt;nowiki&gt;:Indent text&lt;/nowiki&gt;&lt;/tt&gt;
|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Indent text
|-
|Headings of&lt;br /&gt;
different levels &lt;ref&gt;Use of a heading created by single equal signs is discouraged as it appears with the same formatting and size as the page title, which can be confusing.&lt;/ref&gt;&lt;ref&gt;An article with four or more headings will automatically create a [http://en.wikipedia.org/wiki/Wikipedia:Section#Table_of_contents_.28TOC.29 table of contents].&lt;/ref&gt;
|
&lt;tt&gt;&lt;nowiki&gt;==level 1==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;nowiki&gt;===level 2===&lt;/nowiki&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;nowiki&gt;====level 3====&lt;/nowiki&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;nowiki&gt;=====level 4=====&lt;/nowiki&gt;&lt;/tt&gt;
|

==Level 1==
===Level 2===
====Level 3====
=====Level 4=====
|-
|Horizontal rule
|
&lt;tt&gt;&lt;nowiki&gt;----&lt;/nowiki&gt;&lt;/tt&gt;
|
----
|-
|Bullet list
|
&amp;#42; one&lt;br&gt;
&amp;#42; two&lt;br&gt;
&amp;#42; three&lt;br&gt;
&amp;#42;&amp;#42; three and one-third&lt;br&gt;
&amp;#42;&amp;#42; three and two-thirds&lt;br&gt;
|
* one
* two
* three
** three and one-third
** three and two-thirds
|-
|Numbered list
|
&amp;#35; one&lt;br /&gt;
&amp;#35; two&lt;nowiki&gt;&lt;br&gt;&lt;/nowiki&gt;spanning several lines&lt;nowiki&gt;&lt;br&gt;&lt;/nowiki&gt;without breaking the numbering&lt;br /&gt;
&amp;#35; three&lt;br /&gt;
&amp;#35;&amp;#35; three point one&lt;br /&gt;
&amp;#35;&amp;#35; three point two&lt;br /&gt;
|
# one
# two&lt;br&gt;spanning several lines&lt;br&gt;without breaking the numbering
# three
## three point one
## three point two
|-
| Mixture of bulleted&lt;br /&gt; and numbered lists
|
&amp;#35; one&lt;br /&gt;
&amp;#35; two&lt;br /&gt;
&amp;#35;&amp;#42; two point one&lt;br /&gt;
&amp;#35;&amp;#42; two point two&lt;br /&gt;
|
# one
# two
#* two point one
#* two point two
|-
|Definition list
|
&amp;#59;Definition&lt;br /&gt;
&amp;#58;item 1&lt;br /&gt;
&amp;#58;item 2&lt;br /&gt;
|
;Definition
:item 1
:item 2
|-
|Preformatted text
|
&amp;nbsp;&amp;nbsp;preformatted text is done with&lt;br /&gt;
&amp;nbsp;&amp;nbsp;a space at the&lt;br /&gt;
&amp;nbsp;&amp;nbsp;beginning of the line&lt;br /&gt;
|
 preformatted text is done with
 a space at the 
 beginning of the line
|}

Notes: &lt;references/&gt;

== Paragraphs ==

MediaWiki ignores normal line breaks. To start a new paragraph, leave an empty line. You can also start a new line with the HTML tags &lt;tt&gt;&lt;nowiki&gt;&lt;br&gt; or &lt;br/&gt;&lt;/nowiki&gt;&lt;/tt&gt;.

== HTML ==

Some [[w:HTML|HTML]] tags are allowed in MediaWiki, for example &lt;tt&gt;&lt;nowiki&gt;&lt;code&gt;&lt;/nowiki&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;nowiki&gt;&lt;div&gt;&lt;/nowiki&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;nowiki&gt;&lt;span&gt;&lt;/nowiki&gt;&lt;/tt&gt; and &lt;tt&gt;&lt;nowiki&gt;&lt;font&gt;&lt;/nowiki&gt;&lt;/tt&gt;.

{{Admin tip|tip=If you trust your users you can allow full HTML by setting &lt;code&gt;[[Manual:$wgRawHtml|$wgRawHtml]] = true;&lt;/code&gt; in [[Manual:LocalSettings.php|LocalSettings.php]].}}


== Other formatting ==
Beyond the text formatting markup shown above, here are some other formatting references:
*[[Help:Links|Links]]
*[[Help:Images|Images]]
*[[Help:Tables|Tables]]
[http://en.wikipedia.org/wiki/Wikipedia:WikiProject_User_Page_Help/Do-It-Yourself/Formatting_Text#Underlining More Formatting from Wikipedia]

== External Links ==
{{meta|Help:Editing}}

{{Languages|Help:Formatting}}

[[Category:Help|Formatting]]</text>
    </revision>
    <revision>
      <id>105</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">__TOC__

==Spaces, New Lines, Paragraphs, And More==
You might have already noticed that single spaces between lines do not create spaces in the text. For example:

&lt;pre&gt;&lt;nowiki&gt;
Typing 
like 
this
would come out 
like this:
&lt;/nowiki&gt;&lt;/pre&gt;

Typing
like
this 
would come out 
like this:

A blank space between the two lines, on the other hand, creates a new paragraph. For example:

&lt;pre&gt;&lt;nowiki&gt;
This would look like one paragraph.

This would look like another.

This would be the third.
&lt;/nowiki&gt;&lt;/pre&gt;

This would look like one paragraph.

This would look like another.

This would be the third.

For a new line, you must use the line break (br) command after the line. (Single Spaces are not necessary, but are used for clarity.)

Just do this:
&lt;pre&gt;&lt;nowiki&gt;
Text Line 1&lt;br&gt;
Text Line 2&lt;br&gt;

Paragraph 2 Line 1
&lt;/nowiki&gt;&lt;/pre&gt;

'''Remember:''' For the sake of clarity, it is best to place a line break, but not necessary.

==Emphasis==
'''Hello!'''

''How Are You?''

This is basic, but important. Use three 's for a Bold and two for italics. The above section was made like this:

&lt;pre&gt;&lt;nowiki&gt;
'''Hello!'''

''How Are You?''
&lt;/nowiki&gt;&lt;/pre&gt;

HTML encoding also works, such as &lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Lists==
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.

&lt;pre&gt;&lt;nowiki&gt;
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.
&lt;/nowiki&gt;&lt;/pre&gt;

#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.

&lt;pre&gt;&lt;nowiki&gt;
#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.
&lt;/nowiki&gt;&lt;/pre&gt;

*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.

&lt;pre&gt;&lt;nowiki&gt;
*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.
&lt;/nowiki&gt;&lt;/pre&gt;

==Horizontal Rules==
Don't use these too often, as they break up the page. Instead, it is recommended you use section breaks (see below). If you really need them, however, this is the formatting:

&lt;pre&gt;&lt;nowiki&gt;
----
&lt;/nowiki&gt;&lt;/pre&gt;

==Indentation==
:A colon indents a line.
&lt;pre&gt;&lt;nowiki&gt;
:A colon indents a line.
&lt;/nowiki&gt;&lt;/pre&gt;

==Alignment==
A page is left-aligned by default.
&lt;center&gt; Center Text Like This &lt;/center&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;center&gt; Center Text Like This &lt;/center&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Section Breaks==
Many articles on the wiki use section headers and tables of contents, like the ones above. Two equal(=) signs makes a topic.

&lt;pre&gt;&lt;nowiki&gt;
==This Is a Topic==
===This Is a Subtopic===
====This is a Sub Sub Topic====
===This is a subtopic of the first topic, but not the other sub topics===
==This is another topic==
&lt;/nowiki&gt;&lt;/pre&gt;

To add a Table Of Contents, type:

&lt;pre&gt;&lt;nowiki&gt;
__TOC__
&lt;/nowiki&gt;&lt;/pre&gt;

If a Table of Contents is automatic for the article (true for certian namespaces and templates), you can use this formatting to remove one:

&lt;pre&gt;&lt;nowiki&gt;
__NOTOC__
&lt;/nowiki&gt;&lt;/pre&gt;

'''Note:''' Table of contents lists only list topics that appear after they are inserted.</text>
    </revision>
    <revision>
      <id>197</id>
      <timestamp>2008-02-18T19:21:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">__TOC__

==Spaces, New Lines, Paragraphs, And More==
You might have already noticed that single spaces between lines do not create spaces in the text. For example:

&lt;pre&gt;&lt;nowiki&gt;
Typing 
like 
this
would come out 
like this:
&lt;/nowiki&gt;&lt;/pre&gt;

Typing
like
this 
would come out 
like this:

A blank space between the two lines, on the other hand, creates a new paragraph. For example:

&lt;pre&gt;&lt;nowiki&gt;
This would look like one paragraph.

This would look like another.

This would be the third.
&lt;/nowiki&gt;&lt;/pre&gt;

This would look like one paragraph.

This would look like another.

This would be the third.

For a new line, you must use the line break (br) command after the line. (Single Spaces are not necessary, but are used for clarity.)

Just do this:
&lt;pre&gt;&lt;nowiki&gt;
Text Line 1&lt;br&gt;
Text Line 2&lt;br&gt;

Paragraph 2 Line 1
&lt;/nowiki&gt;&lt;/pre&gt;

'''Remember:''' For the sake of clarity, it is best to place a line break, but not necessary.

==Emphasis==
'''Hello!'''

''How Are You?''

This is basic, but important. Use three 's for a Bold and two for italics. The above section was made like this:

&lt;pre&gt;&lt;nowiki&gt;
'''Hello!'''

''How Are You?''
&lt;/nowiki&gt;&lt;/pre&gt;

HTML encoding also works, such as &lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;b&gt;Bold&lt;/b&gt; and &lt;i&gt;Italics&lt;/i&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Lists==
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.

&lt;pre&gt;&lt;nowiki&gt;
*Creating a bulleted list is simple.
**Creating Sub-Bullets is just as easy.
***And so on and so on and so on.
*Going back is easy too.
&lt;/nowiki&gt;&lt;/pre&gt;

#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.

&lt;pre&gt;&lt;nowiki&gt;
#Numbered Lists are almost the same
##So are sub numbers
###sub sub numbers
#and going back.
&lt;/nowiki&gt;&lt;/pre&gt;

*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.

&lt;pre&gt;&lt;nowiki&gt;
*Mixing lists are possible too.
*#Such as this one
*#*You can also&lt;br&gt;have newlines&lt;br&gt;inside lists.
&lt;/nowiki&gt;&lt;/pre&gt;

==Horizontal Rules==
Don't use these too often, as they break up the page. Instead, it is recommended you use section breaks (see below). If you really need them, however, this is the formatting:

&lt;pre&gt;&lt;nowiki&gt;
----
&lt;/nowiki&gt;&lt;/pre&gt;

==Indentation==
:A colon indents a line.
&lt;pre&gt;&lt;nowiki&gt;
:A colon indents a line.
&lt;/nowiki&gt;&lt;/pre&gt;

==Alignment==
A page is left-aligned by default.
&lt;center&gt; Center Text Like This &lt;/center&gt;

&lt;pre&gt;&lt;nowiki&gt;
&lt;center&gt; Center Text Like This &lt;/center&gt;
&lt;/nowiki&gt;&lt;/pre&gt;

==Section Breaks==
Many articles on the wiki use section headers and tables of contents, like the ones above. Two equal(=) signs makes a topic.

&lt;pre&gt;&lt;nowiki&gt;
==This Is a Topic==
===This Is a Subtopic===
====This is a Sub Sub Topic====
===This is a subtopic of the first topic, but not the other sub topics===
==This is another topic==
&lt;/nowiki&gt;&lt;/pre&gt;

To add a Table Of Contents, type:

&lt;pre&gt;&lt;nowiki&gt;
__TOC__
&lt;/nowiki&gt;&lt;/pre&gt;

If a Table of Contents is automatic for the article (true for certian namespaces and templates), you can use this formatting to remove one:

&lt;pre&gt;&lt;nowiki&gt;
__NOTOC__
&lt;/nowiki&gt;&lt;/pre&gt;

'''Note:''' Table of contents lists only list topics that appear after they are inserted.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Images</title>
    <id>46</id>
    <revision>
      <id>112</id>
      <timestamp>2008-02-10T01:50:32Z</timestamp>
      <contributor>
        <ip>Pathoschild</ip>
      </contributor>
      <comment>/* Syntax */ + page=#</comment>
      <text xml:space="preserve">{{PD Help Page}}
__TOC__

Typically you would '''upload an image file''' to the wiki (See [[Help:Managing files]])  ...''before'' you use the following wiki text to place the image on an article:  

{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type''' 
|{{Hl3}}|'''You get'''
|-
|Embed image&lt;br /&gt; (with alt text)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|Sunflowers]]
|-
|Link to description page
|
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[:Image:Example.jpg]]&lt;br /&gt;
[[:Image:Example.jpg|Sunflowers]]
|-
|Link directly to file
|
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Media:Example.jpg]]&lt;br /&gt;
[[Media:Example.jpg|Sunflowers]]
|-
|Thumbnail&lt;br /&gt; (centered, 100 pixels&lt;br /&gt; wide, with caption)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|center|thumb|100px|Sunflowers]]
|-
|Border&lt;br /&gt; (100 pixels) &lt;br /&gt; Results in a very small gray border
&lt;!-- Note: because the fine gray border can not be seen when used on the &quot;Sunflowers&quot;-image an image is used with a withe background --&gt;
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Wiki.png|border|100px]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Wiki.png|border|100px]]
|-
|Frameless&lt;br /&gt;Like thumbnail, respect user preferences for image width but without border and no right float.
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|frameless]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|frameless]]
|}

== Syntax ==
The full syntax for displaying an image is:
 &lt;code&gt;&lt;nowiki&gt;[[Image:{name}|{options}]]&lt;/nowiki&gt;&lt;/code&gt;
Where options can be zero or more of the following, separated by pipes:
*&lt;code&gt;thumb&lt;/code&gt;, &lt;code&gt;thumbnail&lt;/code&gt;, or &lt;code&gt;frame&lt;/code&gt;: Controls how the image is formatted
*&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;: Controls the alignment of the image on the page
*&lt;code&gt;{width}px&lt;/code&gt;: Resizes the image to the given width in pixels
*&lt;code&gt;{caption text}&lt;/code&gt;
* Special cases:
** &lt;code&gt;page=1&lt;/code&gt;: displays the specified page when showing a djvu file.

The options can be given in any order. If a given option does not match any of the other possibilities, it is assumed to be the caption text. Caption text can contain wiki links or other formatting.

== Other files ==
You can link to an external file using the same syntax used for linking to an external web page. 
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png]&lt;/nowiki&gt;&lt;/code&gt;
Or with different text:
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png link text here]&lt;/nowiki&gt;&lt;/code&gt;

If it is enabled on your wiki (see [[Manual:$wgAllowExternalImages]]), you can also embed external images. To do that, simply insert the image's url:
*&lt;code&gt;&lt;nowiki&gt;http://url.for/some/image.png&lt;/nowiki&gt;&lt;/code&gt;


== Gallery of images ==
It's easy to make a gallery of thumbnails with the &lt;code&gt;&lt;nowiki&gt;&lt;gallery&gt;&lt;/nowiki&gt;&lt;/code&gt; tag. The syntax is:
&lt;pre&gt;
&lt;gallery&gt;
Image:{filename}|{caption}
Image:{filename}|{caption}
{...}
&lt;/gallery&gt;
&lt;/pre&gt;
Captions are optional, and may contain wiki links or other formatting.

for example:
&lt;pre&gt;
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;
&lt;/pre&gt;
is formatted as:
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;

== Administration of images/files ==

See: [[Manual:Image Administration]]

==External Links==
* {{meta|Help:Images and other uploaded files}}
* http://en.wikipedia.org/wiki/Wikipedia:Extended_image_syntax

{{Languages|Help:Images}}

[[Category:Help|Images]]</text>
    </revision>
    <revision>
      <id>113</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
__TOC__

Typically you would '''upload an image file''' to the wiki (See [[Help:Managing files]])  ...''before'' you use the following wiki text to place the image on an article:  

{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type''' 
|{{Hl3}}|'''You get'''
|-
|Embed image&lt;br /&gt; (with alt text)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|Sunflowers]]
|-
|Link to description page
|
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[:Image:Example.jpg]]&lt;br /&gt;
[[:Image:Example.jpg|Sunflowers]]
|-
|Link directly to file
|
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Media:Example.jpg]]&lt;br /&gt;
[[Media:Example.jpg|Sunflowers]]
|-
|Thumbnail&lt;br /&gt; (centered, 100 pixels&lt;br /&gt; wide, with caption)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|center|thumb|100px|Sunflowers]]
|-
|Border&lt;br /&gt; (100 pixels) &lt;br /&gt; Results in a very small gray border
&lt;!-- Note: because the fine gray border can not be seen when used on the &quot;Sunflowers&quot;-image an image is used with a withe background --&gt;
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Wiki.png|border|100px]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Wiki.png|border|100px]]
|-
|Frameless&lt;br /&gt;Like thumbnail, respect user preferences for image width but without border and no right float.
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|frameless]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|frameless]]
|}

== Syntax ==
The full syntax for displaying an image is:
 &lt;code&gt;&lt;nowiki&gt;[[Image:{name}|{options}]]&lt;/nowiki&gt;&lt;/code&gt;
Where options can be zero or more of the following, separated by pipes:
*&lt;code&gt;thumb&lt;/code&gt;, &lt;code&gt;thumbnail&lt;/code&gt;, or &lt;code&gt;frame&lt;/code&gt;: Controls how the image is formatted
*&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;: Controls the alignment of the image on the page
*&lt;code&gt;{width}px&lt;/code&gt;: Resizes the image to the given width in pixels
*&lt;code&gt;{caption text}&lt;/code&gt;
* Special cases:
** &lt;code&gt;page=1&lt;/code&gt;: displays the specified page when showing a djvu file.

The options can be given in any order. If a given option does not match any of the other possibilities, it is assumed to be the caption text. Caption text can contain wiki links or other formatting.

== Other files ==
You can link to an external file using the same syntax used for linking to an external web page. 
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png]&lt;/nowiki&gt;&lt;/code&gt;
Or with different text:
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png link text here]&lt;/nowiki&gt;&lt;/code&gt;

If it is enabled on your wiki (see [[Manual:$wgAllowExternalImages]]), you can also embed external images. To do that, simply insert the image's url:
*&lt;code&gt;&lt;nowiki&gt;http://url.for/some/image.png&lt;/nowiki&gt;&lt;/code&gt;


== Gallery of images ==
It's easy to make a gallery of thumbnails with the &lt;code&gt;&lt;nowiki&gt;&lt;gallery&gt;&lt;/nowiki&gt;&lt;/code&gt; tag. The syntax is:
&lt;pre&gt;
&lt;gallery&gt;
Image:{filename}|{caption}
Image:{filename}|{caption}
{...}
&lt;/gallery&gt;
&lt;/pre&gt;
Captions are optional, and may contain wiki links or other formatting.

for example:
&lt;pre&gt;
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;
&lt;/pre&gt;
is formatted as:
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;

== Administration of images/files ==

See: [[Manual:Image Administration]]

==External Links==
* {{meta|Help:Images and other uploaded files}}
* http://en.wikipedia.org/wiki/Wikipedia:Extended_image_syntax

{{Languages|Help:Images}}

[[Category:Help|Images]]</text>
    </revision>
    <revision>
      <id>203</id>
      <timestamp>2008-02-18T19:37:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">__TOC__

Typically you would '''upload an image file''' to the wiki (See [[Help:Managing files]])  ...''before'' you use the following wiki text to place the image on an article:  

{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type''' 
|{{Hl3}}|'''You get'''
|-
|Embed image&lt;br /&gt; (with alt text)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|Sunflowers]]
|-
|Link to description page
|
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[:Image:Example.jpg]]&lt;br /&gt;
[[:Image:Example.jpg|Sunflowers]]
|-
|Link directly to file
|
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Media:Example.jpg]]&lt;br /&gt;
[[Media:Example.jpg|Sunflowers]]
|-
|Thumbnail&lt;br /&gt; (centered, 100 pixels&lt;br /&gt; wide, with caption)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|center|thumb|100px|Sunflowers]]
|-
|Border&lt;br /&gt; (100 pixels) &lt;br /&gt; Results in a very small gray border
&lt;!-- Note: because the fine gray border can not be seen when used on the &quot;Sunflowers&quot;-image an image is used with a withe background --&gt;
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Wiki.png|border|100px]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Wiki.png|border|100px]]
|-
|Frameless&lt;br /&gt;Like thumbnail, respect user preferences for image width but without border and no right float.
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|frameless]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|frameless]]
|}

== Syntax ==
The full syntax for displaying an image is:
 &lt;code&gt;&lt;nowiki&gt;[[Image:{name}|{options}]]&lt;/nowiki&gt;&lt;/code&gt;
Where options can be zero or more of the following, separated by pipes:
*&lt;code&gt;thumb&lt;/code&gt;, &lt;code&gt;thumbnail&lt;/code&gt;, or &lt;code&gt;frame&lt;/code&gt;: Controls how the image is formatted
*&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;: Controls the alignment of the image on the page
*&lt;code&gt;{width}px&lt;/code&gt;: Resizes the image to the given width in pixels
*&lt;code&gt;{caption text}&lt;/code&gt;
* Special cases:
** &lt;code&gt;page=1&lt;/code&gt;: displays the specified page when showing a djvu file.

The options can be given in any order. If a given option does not match any of the other possibilities, it is assumed to be the caption text. Caption text can contain wiki links or other formatting.

== Other files ==
You can link to an external file using the same syntax used for linking to an external web page. 
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png]&lt;/nowiki&gt;&lt;/code&gt;
Or with different text:
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png link text here]&lt;/nowiki&gt;&lt;/code&gt;

If it is enabled on your wiki (see [[Manual:$wgAllowExternalImages]]), you can also embed external images. To do that, simply insert the image's url:
*&lt;code&gt;&lt;nowiki&gt;http://url.for/some/image.png&lt;/nowiki&gt;&lt;/code&gt;


== Gallery of images ==
It's easy to make a gallery of thumbnails with the &lt;code&gt;&lt;nowiki&gt;&lt;gallery&gt;&lt;/nowiki&gt;&lt;/code&gt; tag. The syntax is:
&lt;pre&gt;
&lt;gallery&gt;
Image:{filename}|{caption}
Image:{filename}|{caption}
{...}
&lt;/gallery&gt;
&lt;/pre&gt;
Captions are optional, and may contain wiki links or other formatting.

for example:
&lt;pre&gt;
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;
&lt;/pre&gt;
is formatted as:
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;


==External Links==
* [[Wikipedia:Wikipedia:Extended image syntax]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>257</id>
      <timestamp>2008-02-19T21:27:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Other files */</comment>
      <text xml:space="preserve">__TOC__

Typically you would '''upload an image file''' to the wiki (See [[Help:Managing files]])  ...''before'' you use the following wiki text to place the image on an article:  

{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type''' 
|{{Hl3}}|'''You get'''
|-
|Embed image&lt;br /&gt; (with alt text)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|Sunflowers]]
|-
|Link to description page
|
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[:Image:Example.jpg]]&lt;br /&gt;
[[:Image:Example.jpg|Sunflowers]]
|-
|Link directly to file
|
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Media:Example.jpg]]&lt;br /&gt;
[[Media:Example.jpg|Sunflowers]]
|-
|Thumbnail&lt;br /&gt; (centered, 100 pixels&lt;br /&gt; wide, with caption)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|center|thumb|100px|Sunflowers]]
|-
|Border&lt;br /&gt; (100 pixels) &lt;br /&gt; Results in a very small gray border
&lt;!-- Note: because the fine gray border can not be seen when used on the &quot;Sunflowers&quot;-image an image is used with a withe background --&gt;
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Wiki.png|border|100px]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Wiki.png|border|100px]]
|-
|Frameless&lt;br /&gt;Like thumbnail, respect user preferences for image width but without border and no right float.
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|frameless]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|frameless]]
|}

== Syntax ==
The full syntax for displaying an image is:
 &lt;code&gt;&lt;nowiki&gt;[[Image:{name}|{options}]]&lt;/nowiki&gt;&lt;/code&gt;
Where options can be zero or more of the following, separated by pipes:
*&lt;code&gt;thumb&lt;/code&gt;, &lt;code&gt;thumbnail&lt;/code&gt;, or &lt;code&gt;frame&lt;/code&gt;: Controls how the image is formatted
*&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;: Controls the alignment of the image on the page
*&lt;code&gt;{width}px&lt;/code&gt;: Resizes the image to the given width in pixels
*&lt;code&gt;{caption text}&lt;/code&gt;
* Special cases:
** &lt;code&gt;page=1&lt;/code&gt;: displays the specified page when showing a djvu file.

The options can be given in any order. If a given option does not match any of the other possibilities, it is assumed to be the caption text. Caption text can contain wiki links or other formatting.

== Other files ==
You can link to an external file using the same syntax used for linking to an external web page. 
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png]&lt;/nowiki&gt;&lt;/code&gt;
Or with different text:
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png link text here]&lt;/nowiki&gt;&lt;/code&gt;

If it is enabled on your wiki (see {{mediawiki|Manual:$wgAllowExternalImages}}), you can also embed external images. To do that, simply insert the image's url:
*&lt;code&gt;&lt;nowiki&gt;http://url.for/some/image.png&lt;/nowiki&gt;&lt;/code&gt;

== Gallery of images ==
It's easy to make a gallery of thumbnails with the &lt;code&gt;&lt;nowiki&gt;&lt;gallery&gt;&lt;/nowiki&gt;&lt;/code&gt; tag. The syntax is:
&lt;pre&gt;
&lt;gallery&gt;
Image:{filename}|{caption}
Image:{filename}|{caption}
{...}
&lt;/gallery&gt;
&lt;/pre&gt;
Captions are optional, and may contain wiki links or other formatting.

for example:
&lt;pre&gt;
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;
&lt;/pre&gt;
is formatted as:
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;


==External Links==
* [[Wikipedia:Wikipedia:Extended image syntax]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35502</id>
      <timestamp>2009-10-24T14:44:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>we don't have a Wiki.png - replaced with Example.jpg</comment>
      <text xml:space="preserve">__TOC__

Typically you would '''upload an image file''' to the wiki (See [[Help:Managing files]])  ...''before'' you use the following wiki text to place the image on an article:  

{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type''' 
|{{Hl3}}|'''You get'''
|-
|Embed image&lt;br /&gt; (with alt text)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|Sunflowers]]
|-
|Link to description page
|
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[:Image:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[:Image:Example.jpg]]&lt;br /&gt;
[[:Image:Example.jpg|Sunflowers]]
|-
|Link directly to file
|
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg]]&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;[[Media:Example.jpg|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Media:Example.jpg]]&lt;br /&gt;
[[Media:Example.jpg|Sunflowers]]
|-
|Thumbnail&lt;br /&gt; (centered, 100 pixels&lt;br /&gt; wide, with caption)
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|center|thumb|100px|Sunflowers]]
|-
|Border&lt;br /&gt; (100 pixels) &lt;br /&gt; Results in a very small gray border
&lt;!-- Note: because the fine gray border can not be seen when used on the &quot;Sunflowers&quot;-image an image is used with a withe background --&gt;
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|border|100px]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|border|100px]]
|-
|Frameless&lt;br /&gt;Like thumbnail, respect user preferences for image width but without border and no right float.
|
&lt;code&gt;&lt;nowiki&gt;[[Image:Example.jpg|frameless]]&lt;/nowiki&gt;&lt;/code&gt;
|
[[Image:Example.jpg|frameless]]
|}

== Syntax ==
The full syntax for displaying an image is:
 &lt;code&gt;&lt;nowiki&gt;[[Image:{name}|{options}]]&lt;/nowiki&gt;&lt;/code&gt;
Where options can be zero or more of the following, separated by pipes:
*&lt;code&gt;thumb&lt;/code&gt;, &lt;code&gt;thumbnail&lt;/code&gt;, or &lt;code&gt;frame&lt;/code&gt;: Controls how the image is formatted
*&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;: Controls the alignment of the image on the page
*&lt;code&gt;{width}px&lt;/code&gt;: Resizes the image to the given width in pixels
*&lt;code&gt;{caption text}&lt;/code&gt;
* Special cases:
** &lt;code&gt;page=1&lt;/code&gt;: displays the specified page when showing a djvu file.

The options can be given in any order. If a given option does not match any of the other possibilities, it is assumed to be the caption text. Caption text can contain wiki links or other formatting.

== Other files ==
You can link to an external file using the same syntax used for linking to an external web page. 
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png]&lt;/nowiki&gt;&lt;/code&gt;
Or with different text:
*&lt;code&gt;&lt;nowiki&gt;[http://url.for/some/image.png link text here]&lt;/nowiki&gt;&lt;/code&gt;

If it is enabled on your wiki (see {{mediawiki|Manual:$wgAllowExternalImages}}), you can also embed external images. To do that, simply insert the image's url:
*&lt;code&gt;&lt;nowiki&gt;http://url.for/some/image.png&lt;/nowiki&gt;&lt;/code&gt;

== Gallery of images ==
It's easy to make a gallery of thumbnails with the &lt;code&gt;&lt;nowiki&gt;&lt;gallery&gt;&lt;/nowiki&gt;&lt;/code&gt; tag. The syntax is:
&lt;pre&gt;
&lt;gallery&gt;
Image:{filename}|{caption}
Image:{filename}|{caption}
{...}
&lt;/gallery&gt;
&lt;/pre&gt;
Captions are optional, and may contain wiki links or other formatting.

for example:
&lt;pre&gt;
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;
&lt;/pre&gt;
is formatted as:
&lt;gallery&gt;
Image:Example.jpg|Item 1
Image:Example.jpg|a link to [[Help:Contents]]
Image:Example.jpg
Image:Example.jpg
Image:Example.jpg|''italic caption''
&lt;/gallery&gt;


==External Links==
* [[Wikipedia:Wikipedia:Extended image syntax]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Interwiki linking</title>
    <id>59</id>
    <revision>
      <id>138</id>
      <timestamp>2008-01-30T09:22:23Z</timestamp>
      <contributor>
        <ip>Emesee</ip>
      </contributor>
      <minor/>
      <comment>see also - [[Extension:SpecialInterwiki]]</comment>
      <text xml:space="preserve">{{PD Help Page}}
'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see [[Manual:Wiki family]]). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an [[:Category:Interwiki extensions|Interwiki extension]].

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set [[Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true]] in your ''LocalSettings.php''

{{admin tip|tip=
Several help pages link to MediaWiki.org's ''Manual'' namespace.  To make these links work on your local wiki, add an interwiki link with ''iw_prefix=manual'' and ''iw_url=&lt;nowiki&gt;http:&lt;/nowiki&gt;//www.mediawiki.org/wiki/Manual:$1''
}}

==Interwiki links to other languages==
[[Image:M-en-interwiki lang.png|thumb|Interwiki links to other languages]]
If you have installed a [[Manual:Wiki family|Wiki family]], you can link from an article in English to an article in German (if you have a German project, too). You can set up MediaWiki, to show those links in the sidebar, just below the toolbox.

In your filesystem, there is a subfolder of your MediaWiki installation, called &quot;languages&quot;. Go there and have a look at &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot; as it contains a list of known languages and their prefixes. E.g. you want to add your German project, search &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot; for &quot;Deutsch&quot; and note the prefix &quot;de&quot;.

If you know the &quot;right&quot; prefix, edit your database by adding a new line to table &lt;code&gt;interwiki&lt;/code&gt;:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': language-prefix (e.g. &quot;de&quot; for German), which is listed in &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot;
*'''&lt;code&gt;iw_url&lt;/code&gt;''': URL to your wiki-project (e.g. &lt;code&gt;&lt;nowiki&gt;http://de.your-wiki.org/index.php/$1&lt;/nowiki&gt;&lt;/code&gt;)
*'''&lt;code&gt;iw_local&lt;/code&gt;''': ''same as above &quot;Adding More&quot;''
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': ''same as above &quot;Adding More&quot;''


Now, you can link an article to the same in other languages. Adding &lt;code&gt;&lt;nowiki&gt;[[de:Hauptseite]]&lt;/nowiki&gt;&lt;/code&gt; on your english Main_Page will create a link &quot;Deutsch&quot; below the toolbox, which leads to the Main_Page of the German wiki (Hauptseite).

Note, that this link is shown in Sidebar's section, '''only''', and not inside of the article. If you want to create a link inside of the text, you have to add a colon previous to the prefix: &lt;code&gt;&lt;nowiki&gt;[[:de:Hauptseite]]&lt;/nowiki&gt;&lt;/code&gt;.

==See also==
* [[Extension:SpecialInterwiki]]

==External links==
{{meta|Help:Interwiki linking}}

{{Languages|Help:Interwiki linking}}

[[Category:Help|Interwiki linking]]
[[Category:Interwiki]]</text>
    </revision>
    <revision>
      <id>139</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see [[Manual:Wiki family]]). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an [[:Category:Interwiki extensions|Interwiki extension]].

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set [[Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true]] in your ''LocalSettings.php''

{{admin tip|tip=
Several help pages link to MediaWiki.org's ''Manual'' namespace.  To make these links work on your local wiki, add an interwiki link with ''iw_prefix=manual'' and ''iw_url=&lt;nowiki&gt;http:&lt;/nowiki&gt;//www.mediawiki.org/wiki/Manual:$1''
}}

==Interwiki links to other languages==
[[Image:M-en-interwiki lang.png|thumb|Interwiki links to other languages]]
If you have installed a [[Manual:Wiki family|Wiki family]], you can link from an article in English to an article in German (if you have a German project, too). You can set up MediaWiki, to show those links in the sidebar, just below the toolbox.

In your filesystem, there is a subfolder of your MediaWiki installation, called &quot;languages&quot;. Go there and have a look at &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot; as it contains a list of known languages and their prefixes. E.g. you want to add your German project, search &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot; for &quot;Deutsch&quot; and note the prefix &quot;de&quot;.

If you know the &quot;right&quot; prefix, edit your database by adding a new line to table &lt;code&gt;interwiki&lt;/code&gt;:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': language-prefix (e.g. &quot;de&quot; for German), which is listed in &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot;
*'''&lt;code&gt;iw_url&lt;/code&gt;''': URL to your wiki-project (e.g. &lt;code&gt;&lt;nowiki&gt;http://de.your-wiki.org/index.php/$1&lt;/nowiki&gt;&lt;/code&gt;)
*'''&lt;code&gt;iw_local&lt;/code&gt;''': ''same as above &quot;Adding More&quot;''
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': ''same as above &quot;Adding More&quot;''


Now, you can link an article to the same in other languages. Adding &lt;code&gt;&lt;nowiki&gt;[[de:Hauptseite]]&lt;/nowiki&gt;&lt;/code&gt; on your english Main_Page will create a link &quot;Deutsch&quot; below the toolbox, which leads to the Main_Page of the German wiki (Hauptseite).

Note, that this link is shown in Sidebar's section, '''only''', and not inside of the article. If you want to create a link inside of the text, you have to add a colon previous to the prefix: &lt;code&gt;&lt;nowiki&gt;[[:de:Hauptseite]]&lt;/nowiki&gt;&lt;/code&gt;.

==See also==
* [[Extension:SpecialInterwiki]]

==External links==
{{meta|Help:Interwiki linking}}

{{Languages|Help:Interwiki linking}}

[[Category:Help|Interwiki linking]]
[[Category:Interwiki]]</text>
    </revision>
    <revision>
      <id>217</id>
      <timestamp>2008-02-18T20:06:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see {{mediawiki|Manual:Wiki family}}). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an {{mediawiki|:Category:Interwiki extensions|Interwiki extension}}.

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set {{mediawiki|Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true}} in your ''LocalSettings.php''

{{admin tip|tip=
Several help pages link to MediaWiki.org's ''Manual'' namespace.  To make these links work on your local wiki, add an interwiki link with ''iw_prefix=manual'' and ''iw_url=&lt;nowiki&gt;http:&lt;/nowiki&gt;//www.mediawiki.org/wiki/Manual:$1''
}}

==Interwiki links to other languages==
[[Image:M-en-interwiki lang.png|thumb|Interwiki links to other languages]]
If you have installed a {{mediawiki|Manual:Wiki family|Wiki family}}, you can link from an article in English to an article in German (if you have a German project, too). You can set up MediaWiki, to show those links in the sidebar, just below the toolbox.

In your filesystem, there is a subfolder of your MediaWiki installation, called &quot;languages&quot;. Go there and have a look at &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot; as it contains a list of known languages and their prefixes. E.g. you want to add your German project, search &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot; for &quot;Deutsch&quot; and note the prefix &quot;de&quot;.

If you know the &quot;right&quot; prefix, edit your database by adding a new line to table &lt;code&gt;interwiki&lt;/code&gt;:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': language-prefix (e.g. &quot;de&quot; for German), which is listed in &quot;&lt;code&gt;Names.php&lt;/code&gt;&quot;
*'''&lt;code&gt;iw_url&lt;/code&gt;''': URL to your wiki-project (e.g. &lt;code&gt;&lt;nowiki&gt;http://de.your-wiki.org/index.php/$1&lt;/nowiki&gt;&lt;/code&gt;)
*'''&lt;code&gt;iw_local&lt;/code&gt;''': ''same as above &quot;Adding More&quot;''
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': ''same as above &quot;Adding More&quot;''


Now, you can link an article to the same in other languages. Adding &lt;code&gt;&lt;nowiki&gt;[[de:Hauptseite]]&lt;/nowiki&gt;&lt;/code&gt; on your english Main_Page will create a link &quot;Deutsch&quot; below the toolbox, which leads to the Main_Page of the German wiki (Hauptseite).

Note, that this link is shown in Sidebar's section, '''only''', and not inside of the article. If you want to create a link inside of the text, you have to add a colon previous to the prefix: &lt;code&gt;&lt;nowiki&gt;[[:de:Hauptseite]]&lt;/nowiki&gt;&lt;/code&gt;.

==See also==
* {{mediawiki|Extension:SpecialInterwiki}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>229</id>
      <timestamp>2008-02-18T20:24:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>unreal wiki is english-only</comment>
      <text xml:space="preserve">'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see {{mediawiki|Manual:Wiki family}}). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an {{mediawiki|:Category:Interwiki extensions|Interwiki extension}}.

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set {{mediawiki|Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true}} in your ''LocalSettings.php''

{{admin tip|tip=
Several help pages link to MediaWiki.org's ''Manual'' namespace.  To make these links work on your local wiki, add an interwiki link with ''iw_prefix=manual'' and ''iw_url=&lt;nowiki&gt;http:&lt;/nowiki&gt;//www.mediawiki.org/wiki/Manual:$1''
}}


==See also==
* {{mediawiki|Extension:SpecialInterwiki}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>696</id>
      <timestamp>2008-03-07T09:30:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed admin tip</comment>
      <text xml:space="preserve">'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see {{mediawiki|Manual:Wiki family}}). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an {{mediawiki|:Category:Interwiki extensions|Interwiki extension}}.

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set {{mediawiki|Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true}} in your ''LocalSettings.php''

==See also==
* {{mediawiki|Extension:SpecialInterwiki}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33542</id>
      <timestamp>2008-12-05T03:53:03Z</timestamp>
      <contributor>
        <username>BastaAlerd</username>
        <id>1700</id>
      </contributor>
      <minor/>
      <comment>nochipas</comment>
      <text xml:space="preserve">relpassita
'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see {{mediawiki|Manual:Wiki family}}). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an {{mediawiki|:Category:Interwiki extensions|Interwiki extension}}.

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set {{mediawiki|Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true}} in your ''LocalSettings.php''

==See also==
* {{mediawiki|Extension:SpecialInterwiki}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33543</id>
      <timestamp>2008-12-05T10:46:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/BastaAlerd|BastaAlerd]] ([[User talk:BastaAlerd|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Interwiki links''' are links to pages of other projects, using a prefixed internal link style.

Interwiki links make it possible, to link to pages of (e.g.) Wikipedia, Wikibooks, Wikinews etc. or to your wiki-project in different languages (see {{mediawiki|Manual:Wiki family}}). 

A link like &lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; will appear like this: [[Wikipedia:Main Page]] and redirect you to Wikipedia's Main Page. 

==Interwiki links to other projects==
===Default===
Several Wikimedia-Projects (and others) are ready for interwiki linking by default, so you can use them without editing your database. Note that wikipedia was only added as one of the interwiki defaults since v1.10

The following are some examples of interwiki prefixes which are available by default:
{| {{prettytable}}
|{{Hl3}} align=&quot;center&quot;|'''prefix'''
|{{Hl3}} align=&quot;center&quot;|'''destination URL'''
|{{Hl3}} align=&quot;center&quot;|'''usage example'''
|-
|commons
|&lt;nowiki&gt;http://commons.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[commons:MediaWiki]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mediazilla
|&lt;nowiki&gt;http://bugzilla.wikimedia.org/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mediazilla:1209]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|meta
|&lt;nowiki&gt;http://meta.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[meta:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|mw
|&lt;nowiki&gt;http://www.mediawiki.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[mw:Help:Contents]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikibooks
|&lt;nowiki&gt;http://en.wikibooks.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikibooks:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikimedia
|&lt;nowiki&gt;http://wikimediafoundation.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikimedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikinews
|&lt;nowiki&gt;http://en.wikinews.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikinews:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikiquote
|&lt;nowiki&gt;http://en.wikiquote.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikiquote:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikisource
|&lt;nowiki&gt;http://en.wikisource.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikisource:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wikispecies
|&lt;nowiki&gt;http://species.wikimedia.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;&lt;nowiki&gt;[[wikispecies:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|wiktionary
|&lt;nowiki&gt;http://en.wiktionary.org/wiki/&lt;/nowiki&gt;
|&lt;code&gt;  &lt;nowiki&gt;[[wiktionary:Main Page]]&lt;/nowiki&gt;&lt;/code&gt;
|-
|}

Note: In some installations none of these is pre-installed. Try &lt;code&gt;&lt;nowiki&gt;[[metawikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; in this case.

===Adding a new website for interwiki linking===
For setting up interwiki links, you might need to edit the database. Alternatively you might prefer to install an {{mediawiki|:Category:Interwiki extensions|Interwiki extension}}.

(note: advanced mySQL users may prefer to use just a single command line:&lt;nowiki&gt; INSERT INTO interwiki SET iw_prefix='(the wiki name)', iw_url='http://(the adequate URL)/$1', iw_local=1, iw_trans=0 ;&lt;/nowiki&gt; - instead of exporting and re-importing the whole table interwiki content... )

(Advanced users of PostgreSQL use &lt;code&gt;INSERT INTO interwiki (iw_prefix, iw_url, iw_local, iw_trans) VALUES ('w', 'http://en.wikipedia.org/wiki/$1', 1, 0);&lt;/code&gt;)
* Export the database table 'interwiki' then add to the end of the table the following kayakwiki example...&lt;br /&gt;
* &lt;nowiki&gt;('kayakwiki', 'http://en.kayakwiki.org/index.php/$1', 1, 0);&lt;/nowiki&gt;&lt;br /&gt;
* Note: in the above code, the semicolon ';' as seen, MUST be at the end of the table. At the end of any other line within that table Only has ','.&lt;br /&gt;
* Import the database table 'interwiki'&lt;br /&gt;
* To test it: Go to your site, create an article, with the following content.&lt;br /&gt;
* &lt;nowiki&gt;[[kayakwiki:Places|]]&lt;/nowiki&gt; will display a link to the 'Places' page on KayakWiki.org (the url &lt;nowiki&gt;http://en.kayakwiki.org/index.php/Places&lt;/nowiki&gt;)

As the Wikipedia isn't set up by default in version 1.9 and before, you might want to add it (and other projects of your need).

The fields of the &lt;code&gt;interwiki&lt;/code&gt; database table are as follows:
*'''&lt;code&gt;iw_prefix&lt;/code&gt;''': choose a prefix, which is used for interwiki linking, e.g. &quot;wikipedia&quot; for linking to Wikipedia
*'''&lt;code&gt;iw_url&lt;/code&gt;''': enter the project's URL, e.g. &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/$1&lt;/nowiki&gt;&lt;/code&gt; for Wikipedia. Don't forget the &lt;code&gt;$1&lt;/code&gt; as it is replaced with the article's name you are linking to (&lt;code&gt;&lt;nowiki&gt;[[Wikipedia:Main Page]]&lt;/nowiki&gt;&lt;/code&gt; links to &lt;code&gt;&lt;nowiki&gt;http://en.wikipedia.org/wiki/&lt;/nowiki&gt;'''Main_Page'''&lt;/code&gt;).
Note: If iw_url is a binary BLOB field (SVN version, but also occurs in version 1.11.0, bug?) this won't work directly. You have to enter it as binary. There are two possible solutions: 1. You save the url in a plain text file, then import it through phpmyadmin. 2. You can directly enter an SQL query.  
 
*'''&lt;code&gt;iw_local&lt;/code&gt;''': if 1, your wiki will redirect even external links of the form iw_prefix:title, not only those from its own pages. you need this if you want to use the redirect functionality from outside your wiki or other wikis use your transwiki functions for nested transwiki links (like http://en.wikipedia.org/wiki/fr:Accueil)
*'''&lt;code&gt;iw_trans&lt;/code&gt;''': &quot;transwiki transclusion&quot; - set to 1 if you want to use pages from the other wiki as templates.  You will also need to set {{mediawiki|Manual:$wgEnableScaryTranscluding|$wgEnableScaryTranscluding = true}} in your ''LocalSettings.php''

==See also==
* {{mediawiki|Extension:SpecialInterwiki}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Links</title>
    <id>27</id>
    <revision>
      <id>54</id>
      <timestamp>2008-01-07T03:19:11Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>/* Interwiki Links */</comment>
      <text xml:space="preserve">Creating '''links''' to other pages is a key part of creating a complete and well-formatted wiki page.  A well-linked page permits readers to easily access other topics that they may be interested in learning more about, and encourages readers to continue to explore the site.

==General Information==
Links are a vital part of the wiki, and are strongly encouraged on all pages in order to refer the reader to other relevant pages (and prevent unnecessary duplication).  However, it is also possible to [[Project:Style Guide#Avoid Cluttering Links|go overboard with links]].  In general, a link should only be added the first time a topic is mentioned on a page, rather than every time the topic is mentioned.

When creating links on a page, you may want to also check what links '''to''' that page.  In general, if there is enough overlap for page A to link to page B, then page B should probably also have a link to page A.  On the left side of any page, in the toolbox, you can use &quot;What Links Here&quot; to see which pages link to that page.  This is one way to check whether a page is fully cross-linked.  If you're creating a new page, this is the best way to make sure that people will be able to find your new page.

==Link Basics==
The bare minimum necessary to create a wiki link is to put two square brackets on either side of a word.  So to change &lt;tt&gt;UT2004&lt;/tt&gt; into a link, just add brackets: &lt;tt&gt;&lt;nowiki&gt;[[UT2004]]&lt;/nowiki&gt;&lt;/tt&gt;.  When you [[Help:Editing Pages#Previewing the Page|preview]] your edit, the word should now be displayed using blue text rather than black text.  If, however, your link is in red text then you have tried to create a link to a page that does not exist.  You should probably double check whether you have spelled the word correctly.

On the wiki, most links that you add to a page will be transformed by the wiki software after you save the page.  So don't be surprised when your links suddenly look a lot more complicated after you have saved.  All that has happened is that the wiki software has expanded the links to make them fully match the expected link syntax, as explained in the following section.

==Internal Links==
Internal links are those created to other pages on the wiki; this is by far the most common type of link.  Some examples are:
{| class=&quot;wikitable&quot;
! You Type !! You See
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)|Unreal Tournament]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|the UT series]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)|the UT series]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo|Demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo|Demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo|the demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo|the demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[#External Links|External Links]]&lt;/nowiki&gt;&lt;/tt&gt;||[[#External Links|External Links]]
|}

An internal link always uses two square brackets.  Within the brackets, the various parts of the link are:
# The [[#Page Names|name of the page]] that you would like the reader to jump to if they click on the link, for example &lt;tt&gt;Capture the Flag&lt;/tt&gt;.  This can be omitted if you are linking to somewhere else on the same page
# An [[#Anchors|anchor]], starting with &lt;tt&gt;#&lt;/tt&gt;, if you would like the reader to jump to somewhere in the middle of the page.  This can be omitted if you just want to link to the top of a page.
# A [[#Labels|label]], starting with &lt;tt&gt;|&lt;/tt&gt;, if you would like to customize the text displayed for the label.  This is optional.

A link to an existing page will always be displayed using blue text.  After creating a link, it is recommended to [[Help:Editing Pages|preview]] the page and double check that the link is indeed blue.  If it is red, you have made a typographical error (unless you are intentionally trying to make a link to a page that needs to be created).  Sometimes links can show up as black, meaning that the wiki isn't even treating it as a link: check that your link starts with &lt;tt&gt;&lt;nowiki&gt;[[&lt;/nowiki&gt;&lt;/tt&gt; and ends with &lt;tt&gt;&lt;nowiki&gt;]]&lt;/nowiki&gt;&lt;/tt&gt;; see also [[#Labels|labels]].

===Page Names===
The wiki will automatically convert a page name into a URL-friendly equivalent.  Web page names cannot contain common characters such as spaces or many types of punctuation.  However, when creating an internal link you can type the name in whatever way is most convenient for you, and the wiki will take care of the details of the conversion.

===Anchors===
The pound sign (#, shift+3 on US keyboards) is used if you would like to link to somewhere other than the top of a page.  The HTML terminology for the spot you link to is an &quot;anchor&quot;.  This is very useful if you want to refer the reader directly to the most relevant part of the page, especially for long pages.

Any [[Help:Formatting#Section Breaks|section title (header)]] on a page can automatically be used as an anchor.  In other words you can use any text that is enclosed in equal signs (=) when you look at the page in the editor.  On pages with table of contents, those section titles will all be shown in the table of contents; if you click on one of those entries, the URL including the anchor will be shown in your browser window.

The same convenient URL conversions described under [[#Page Names|Page Names]] are also done for anchor names.  So section titles or item names can be used exactly as they appear on a page; there is no need to replace spaces with underscores.

===Labels===
Without a label, the text shown for your link will just be the page name, which in most cases is not the best choice. To create a label, you use the pipe sign (|, shift+\ on US keyboards, often shown as two vertical lines instead of just one).

A pipe all by itself at the end of a link tells the wiki to automatically create a label, by stripping out the namespace and using just the page name.  Any parts of the page name in parentheses will also be dropped. For example, &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|]]&lt;/nowiki&gt;&lt;/tt&gt; produces the link [[Unreal Tournament (series)|Unreal Tournament]].  When you save the page, the wiki explicitly fills in the label part of the link, so if you come back and edit this link, it will now read &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|Unreal Tournament]]&lt;/nowiki&gt;&lt;/tt&gt;.  There are some situations, however, where the wiki will not automatically create a label (if the link contains an anchor, for example, or in some templates); in these cases the wiki will not even create a link, but will just add the text to the page unformatted.  

Any text entered after the pipe symbol is used as a custom label for the link, i.e., that is the text that will appear to the reader.

===Special Cases===
There are a few types of links that have a special meaning.
* Links created to [[Help:Images|image pages]] will by default insert that image, instead of creating a plain link.  If you want to create a plain text link, insert a colon at the start of the link.  For example, &lt;tt&gt;&lt;nowiki&gt;[[:Image:UT2004.jpg]]&lt;/nowiki&gt;&lt;/tt&gt; creates [[:Image:UT2004.jpg]].
* Links created to [[Project:Categories|categories]] will by default add the page to that category, and will not show any link at that spot in the text.  If you want to create a link to a category page, insert a colon at the start of the link.  For example, &lt;tt&gt;&lt;nowiki&gt;[[:Category:Weapons]]&lt;/nowiki&gt;&lt;/tt&gt; creates [[:Category:Weapons]].
* Very rarely you may need to link to a page that is not part of the wiki, for example, to create a link to a game review.  In such cases, you must create an [[#External Links|external link]].  If you want to make the link look like a local link, you can embed the link in a span with the plainlinks class.  So &lt;tt&gt;&lt;nowiki&gt;&lt;span class=plainlinks&gt;[http://www.beyondunreal.com/content/articles/86_1.php UT2004 review]&lt;/span&gt;&lt;/nowiki&gt;&lt;/tt&gt; creates &lt;span class=plainlinks&gt;[http://www.beyondunreal.com/content/articles/86_1.php UT2004 review]&lt;/span&gt;.  This should '''only''' be used for links to BeyondUnreal, and should not be used to disguise external links.

==Redirects==
Redirects are a special type of internal link, and are used to make readers completely bypass that page and instead open a different page.

An example of a redirect page is [[UT2004]]; if you follow this link you will instead pull up the page [[Unreal Tournament 2004]].  A message at the top of the page lets you know that you were &quot;Redirected from UT2004&quot;.  If you really want to see the &quot;UT2004&quot; page, you can click on the link in the &quot;Redirected&quot; message.

To turn a page into a redirect you would replace the entire page contents with a single line like:&lt;br&gt;
&lt;tt&gt;&lt;nowiki&gt;
#REDIRECT [[Unreal Tournament 2004]]
&lt;/nowiki&gt;&lt;/tt&gt;&lt;br&gt;
The ''only'' other text that can be included on the page are [[Project:Categories|category]] links.  Any permanent redirect pages should be placed into one of the [[:Category:Redirects|redirect categories]], so that other editors know why the redirect page exists.

There is no reason to add a label to the link, since readers will never see it.  The link should include an anchor if the redirect should take the readers somewhere other than the top of the page.  For example, the redirect page [[UT2004 Maps]] contains the redirect link &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Maps]]&lt;/nowiki&gt;&lt;/tt&gt; so that readers who follow the link end up at the most relevant part of the [[Unreal Tournament 2004]] page, instead of just ending up at the top of the page.

Most redirect pages are created automatically.  Every time a page is moved, the original page name is turned into a redirect to the new page name.  This ensures that any existing links to the page were not broken by the page move.  The &quot;What Links Here&quot; feature (lower left corner of any page) can be used to identify internal links; correcting those links to point to the new page is highly recommended.  If you wish to get rid of the original page completely, a [[Project:Deletion Policy#Proposed Deletion|proposed deletion]] can be used to request that an [[Project:Administrators|administrator]] delete the page.  Before doing so, be sure to fix all internal links to the original page.  However, in cases where there are ''external'' links to the original page, the deletion request may be denied.

==External Links==
External links are links made to sites other than the wiki.  There is a different syntax for external links.  Also, external links have an additional arrow added to the displayed link; this is done to warn readers that following the link will take them to a different site.

{| class=&quot;wikitable&quot;
! You Type !! You See
|-
|&lt;tt&gt;&lt;nowiki&gt;http://forums.beyondunreal.com/&lt;/nowiki&gt;&lt;/tt&gt;||http://forums.beyondunreal.com
|-
|&lt;tt&gt;&lt;nowiki&gt;[http://forums.beyondunreal.com/]&lt;/nowiki&gt;&lt;/tt&gt;||[http://forums.beyondunreal.com]
|-
|&lt;tt&gt;&lt;nowiki&gt;[http://forums.beyondunreal.com/ BeyondUnreal Forums]&lt;/nowiki&gt;&lt;/tt&gt;||[http://forums.beyondunreal.com/ BeyondUnreal Forums]
|}

==Interwiki Links==
Adding an interwiki prefix to a regular link will create a link to that other wiki.  These can include labels as well.

Common Interwiki Prefixes:
{|
! Link Prefix !! Links To !! Example !! Result
|-
| unreal || Unreal Engine Wiki || &lt;tt&gt;&lt;nowiki&gt;[[unreal:Unreal Tournament 2004]]&lt;/nowiki&gt;&lt;/tt&gt; || [[unreal:Unreal Tournament 2004]]
|-
| uadmin || Unreal Admin Wiki || &lt;tt&gt;&lt;nowiki&gt;[[uadmin:Redirection and Compression]]&lt;/nowiki&gt;&lt;/tt&gt; || [[uadmin:Redirection and Compression]]
|-
| wikipedia || English Wikipedia || &lt;tt&gt;&lt;nowiki&gt;[[wikipedia:Unreal Tournament 2004|]]&lt;/nowiki&gt;&lt;/tt&gt; || [[wikipedia:Unreal Tournament 2004|Unreal Tournament 2004]]
|}

==See Also==
* [[metawikipedia:Help:Link|Wikimedia help page on links]]
* [[metawikipedia:Help:Piped Link|Wikimedia help page on link labelling]]
* [[metawikipedia:Help:URL|Wikimedia help page on external links]]
* [[metawikipedia:Help:Redirect|Wikimedia help page on redirects]]
* [[Project:Style Guide|Style Guide]]</text>
    </revision>
    <revision>
      <id>55</id>
      <timestamp>2008-02-17T18:39:08Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">Creating '''links''' to other pages is a key part of creating a complete and well-formatted wiki page.  A well-linked page permits readers to easily access other topics that they may be interested in learning more about, and encourages readers to continue to explore the site.

==General Information==
Links are a vital part of the wiki, and are strongly encouraged on all pages in order to refer the reader to other relevant pages (and prevent unnecessary duplication).  However, it is also possible to [[Project:Style Guide#Avoid Cluttering Links|go overboard with links]].  In general, a link should only be added the first time a topic is mentioned on a page, rather than every time the topic is mentioned.

When creating links on a page, you may want to also check what links '''to''' that page.  In general, if there is enough overlap for page A to link to page B, then page B should probably also have a link to page A.  On the left side of any page, in the toolbox, you can use &quot;What Links Here&quot; to see which pages link to that page.  This is one way to check whether a page is fully cross-linked.  If you're creating a new page, this is the best way to make sure that people will be able to find your new page.

==Link Basics==
The bare minimum necessary to create a wiki link is to put two square brackets on either side of a word.  So to change &lt;tt&gt;UT2004&lt;/tt&gt; into a link, just add brackets: &lt;tt&gt;&lt;nowiki&gt;[[UT2004]]&lt;/nowiki&gt;&lt;/tt&gt;.  When you [[Help:Editing Pages#Previewing the Page|preview]] your edit, the word should now be displayed using blue text rather than black text.  If, however, your link is in red text then you have tried to create a link to a page that does not exist.  You should probably double check whether you have spelled the word correctly.

On the wiki, most links that you add to a page will be transformed by the wiki software after you save the page.  So don't be surprised when your links suddenly look a lot more complicated after you have saved.  All that has happened is that the wiki software has expanded the links to make them fully match the expected link syntax, as explained in the following section.

==Internal Links==
Internal links are those created to other pages on the wiki; this is by far the most common type of link.  Some examples are:
{| class=&quot;wikitable&quot;
! You Type !! You See
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)|Unreal Tournament]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|the UT series]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)|the UT series]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo|Demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo|Demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo|the demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo|the demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[#External Links|External Links]]&lt;/nowiki&gt;&lt;/tt&gt;||[[#External Links|External Links]]
|}

An internal link always uses two square brackets.  Within the brackets, the various parts of the link are:
# The [[#Page Names|name of the page]] that you would like the reader to jump to if they click on the link, for example &lt;tt&gt;Capture the Flag&lt;/tt&gt;.  This can be omitted if you are linking to somewhere else on the same page
# An [[#Anchors|anchor]], starting with &lt;tt&gt;#&lt;/tt&gt;, if you would like the reader to jump to somewhere in the middle of the page.  This can be omitted if you just want to link to the top of a page.
# A [[#Labels|label]], starting with &lt;tt&gt;|&lt;/tt&gt;, if you would like to customize the text displayed for the label.  This is optional.

A link to an existing page will always be displayed using blue text.  After creating a link, it is recommended to [[Help:Editing Pages|preview]] the page and double check that the link is indeed blue.  If it is red, you have made a typographical error (unless you are intentionally trying to make a link to a page that needs to be created).  Sometimes links can show up as black, meaning that the wiki isn't even treating it as a link: check that your link starts with &lt;tt&gt;&lt;nowiki&gt;[[&lt;/nowiki&gt;&lt;/tt&gt; and ends with &lt;tt&gt;&lt;nowiki&gt;]]&lt;/nowiki&gt;&lt;/tt&gt;; see also [[#Labels|labels]].

===Page Names===
The wiki will automatically convert a page name into a URL-friendly equivalent.  Web page names cannot contain common characters such as spaces or many types of punctuation.  However, when creating an internal link you can type the name in whatever way is most convenient for you, and the wiki will take care of the details of the conversion.

===Anchors===
The pound sign (#, shift+3 on US keyboards) is used if you would like to link to somewhere other than the top of a page.  The HTML terminology for the spot you link to is an &quot;anchor&quot;.  This is very useful if you want to refer the reader directly to the most relevant part of the page, especially for long pages.

Any [[Help:Formatting#Section Breaks|section title (header)]] on a page can automatically be used as an anchor.  In other words you can use any text that is enclosed in equal signs (=) when you look at the page in the editor.  On pages with table of contents, those section titles will all be shown in the table of contents; if you click on one of those entries, the URL including the anchor will be shown in your browser window.

The same convenient URL conversions described under [[#Page Names|Page Names]] are also done for anchor names.  So section titles or item names can be used exactly as they appear on a page; there is no need to replace spaces with underscores.

===Labels===
Without a label, the text shown for your link will just be the page name, which in most cases is not the best choice. To create a label, you use the pipe sign (|, shift+\ on US keyboards, often shown as two vertical lines instead of just one).

A pipe all by itself at the end of a link tells the wiki to automatically create a label, by stripping out the namespace and using just the page name.  Any parts of the page name in parentheses will also be dropped. For example, &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|]]&lt;/nowiki&gt;&lt;/tt&gt; produces the link [[Unreal Tournament (series)|Unreal Tournament]].  When you save the page, the wiki explicitly fills in the label part of the link, so if you come back and edit this link, it will now read &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|Unreal Tournament]]&lt;/nowiki&gt;&lt;/tt&gt;.  There are some situations, however, where the wiki will not automatically create a label (if the link contains an anchor, for example, or in some templates); in these cases the wiki will not even create a link, but will just add the text to the page unformatted.  

Any text entered after the pipe symbol is used as a custom label for the link, i.e., that is the text that will appear to the reader.

===Special Cases===
There are a few types of links that have a special meaning.
* Links created to [[Help:Images|image pages]] will by default insert that image, instead of creating a plain link.  If you want to create a plain text link, insert a colon at the start of the link.  For example, &lt;tt&gt;&lt;nowiki&gt;[[:Image:UT2004.jpg]]&lt;/nowiki&gt;&lt;/tt&gt; creates [[:Image:UT2004.jpg]].
* Links created to [[Project:Categories|categories]] will by default add the page to that category, and will not show any link at that spot in the text.  If you want to create a link to a category page, insert a colon at the start of the link.  For example, &lt;tt&gt;&lt;nowiki&gt;[[:Category:Weapons]]&lt;/nowiki&gt;&lt;/tt&gt; creates [[:Category:Weapons]].
* Very rarely you may need to link to a page that is not part of the wiki, for example, to create a link to a game review.  In such cases, you must create an [[#External Links|external link]].  If you want to make the link look like a local link, you can embed the link in a span with the plainlinks class.  So &lt;tt&gt;&lt;nowiki&gt;&lt;span class=plainlinks&gt;[http://www.beyondunreal.com/content/articles/86_1.php UT2004 review]&lt;/span&gt;&lt;/nowiki&gt;&lt;/tt&gt; creates &lt;span class=plainlinks&gt;[http://www.beyondunreal.com/content/articles/86_1.php UT2004 review]&lt;/span&gt;.  This should '''only''' be used for links to BeyondUnreal, and should not be used to disguise external links.

==Redirects==
Redirects are a special type of internal link, and are used to make readers completely bypass that page and instead open a different page.

An example of a redirect page is [[UT2004]]; if you follow this link you will instead pull up the page [[Unreal Tournament 2004]].  A message at the top of the page lets you know that you were &quot;Redirected from UT2004&quot;.  If you really want to see the &quot;UT2004&quot; page, you can click on the link in the &quot;Redirected&quot; message.

To turn a page into a redirect you would replace the entire page contents with a single line like:&lt;br&gt;
&lt;tt&gt;&lt;nowiki&gt;
#REDIRECT [[Unreal Tournament 2004]]
&lt;/nowiki&gt;&lt;/tt&gt;&lt;br&gt;
The ''only'' other text that can be included on the page are [[Project:Categories|category]] links.  Any permanent redirect pages should be placed into one of the [[:Category:Redirects|redirect categories]], so that other editors know why the redirect page exists.

There is no reason to add a label to the link, since readers will never see it.  The link should include an anchor if the redirect should take the readers somewhere other than the top of the page.  For example, the redirect page [[UT2004 Maps]] contains the redirect link &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Maps]]&lt;/nowiki&gt;&lt;/tt&gt; so that readers who follow the link end up at the most relevant part of the [[Unreal Tournament 2004]] page, instead of just ending up at the top of the page.

Most redirect pages are created automatically.  Every time a page is moved, the original page name is turned into a redirect to the new page name.  This ensures that any existing links to the page were not broken by the page move.  The &quot;What Links Here&quot; feature (lower left corner of any page) can be used to identify internal links; correcting those links to point to the new page is highly recommended.  If you wish to get rid of the original page completely, a [[Project:Deletion Policy#Proposed Deletion|proposed deletion]] can be used to request that an [[Project:Administrators|administrator]] delete the page.  Before doing so, be sure to fix all internal links to the original page.  However, in cases where there are ''external'' links to the original page, the deletion request may be denied.

==External Links==
External links are links made to sites other than the wiki.  There is a different syntax for external links.  Also, external links have an additional arrow added to the displayed link; this is done to warn readers that following the link will take them to a different site.

{| class=&quot;wikitable&quot;
! You Type !! You See
|-
|&lt;tt&gt;&lt;nowiki&gt;http://forums.beyondunreal.com/&lt;/nowiki&gt;&lt;/tt&gt;||http://forums.beyondunreal.com
|-
|&lt;tt&gt;&lt;nowiki&gt;[http://forums.beyondunreal.com/]&lt;/nowiki&gt;&lt;/tt&gt;||[http://forums.beyondunreal.com]
|-
|&lt;tt&gt;&lt;nowiki&gt;[http://forums.beyondunreal.com/ BeyondUnreal Forums]&lt;/nowiki&gt;&lt;/tt&gt;||[http://forums.beyondunreal.com/ BeyondUnreal Forums]
|}

==Interwiki Links==
Adding an interwiki prefix to a regular link will create a link to that other wiki.  These can include labels as well.

Common Interwiki Prefixes:
{|
! Link Prefix !! Links To !! Example !! Result
|-
| unreal || Unreal Engine Wiki || &lt;tt&gt;&lt;nowiki&gt;[[unreal:Unreal Tournament 2004]]&lt;/nowiki&gt;&lt;/tt&gt; || [[unreal:Unreal Tournament 2004]]
|-
| uadmin || Unreal Admin Wiki || &lt;tt&gt;&lt;nowiki&gt;[[uadmin:Redirection and Compression]]&lt;/nowiki&gt;&lt;/tt&gt; || [[uadmin:Redirection and Compression]]
|-
| wikipedia || English Wikipedia || &lt;tt&gt;&lt;nowiki&gt;[[wikipedia:Unreal Tournament 2004|]]&lt;/nowiki&gt;&lt;/tt&gt; || [[wikipedia:Unreal Tournament 2004|Unreal Tournament 2004]]
|}

==See Also==
* [[metawikipedia:Help:Link|Wikimedia help page on links]]
* [[metawikipedia:Help:Piped Link|Wikimedia help page on link labelling]]
* [[metawikipedia:Help:URL|Wikimedia help page on external links]]
* [[metawikipedia:Help:Redirect|Wikimedia help page on redirects]]
* [[Project:Style Guide|Style Guide]]</text>
    </revision>
    <revision>
      <id>106</id>
      <timestamp>2008-01-16T00:48:22Z</timestamp>
      <contributor>
        <ip>71.216.187.246</ip>
      </contributor>
      <text xml:space="preserve">{{PD Help Page}}
There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|inter-wiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

{{admin tip|tip=
Which protocols (like http:) are allowed for links is controlled by the [[Manual:$wgUrlProtocols|$wgUrlProtocols]] setting. 
}}

{{admin tip|tip=
To remove the 'external link image' from next to each of the external links, add the following to the page located at &lt;code&gt;MediaWiki:Monobook.css&lt;/code&gt; on your wiki.

&lt;pre&gt;
#bodyContent a.external,
#bodyContent a[href ^=&quot;gopher://&quot;] {
        background: none;
        padding-right: 0;
}
&lt;/pre&gt;
}}

== External links ==
{{meta|Help:Link}}
 
{{Languages|Help:Links}}

[[Category:Help|Links]]
[[Category:Link]]</text>
    </revision>
    <revision>
      <id>107</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">Creating '''links''' to other pages is a key part of creating a complete and well-formatted wiki page.  A well-linked page permits readers to easily access other topics that they may be interested in learning more about, and encourages readers to continue to explore the site.

==General Information==
Links are a vital part of the wiki, and are strongly encouraged on all pages in order to refer the reader to other relevant pages (and prevent unnecessary duplication).  However, it is also possible to [[Project:Style Guide#Avoid Cluttering Links|go overboard with links]].  In general, a link should only be added the first time a topic is mentioned on a page, rather than every time the topic is mentioned.

When creating links on a page, you may want to also check what links '''to''' that page.  In general, if there is enough overlap for page A to link to page B, then page B should probably also have a link to page A.  On the left side of any page, in the toolbox, you can use &quot;What Links Here&quot; to see which pages link to that page.  This is one way to check whether a page is fully cross-linked.  If you're creating a new page, this is the best way to make sure that people will be able to find your new page.

==Link Basics==
The bare minimum necessary to create a wiki link is to put two square brackets on either side of a word.  So to change &lt;tt&gt;UT2004&lt;/tt&gt; into a link, just add brackets: &lt;tt&gt;&lt;nowiki&gt;[[UT2004]]&lt;/nowiki&gt;&lt;/tt&gt;.  When you [[Help:Editing Pages#Previewing the Page|preview]] your edit, the word should now be displayed using blue text rather than black text.  If, however, your link is in red text then you have tried to create a link to a page that does not exist.  You should probably double check whether you have spelled the word correctly.

On the wiki, most links that you add to a page will be transformed by the wiki software after you save the page.  So don't be surprised when your links suddenly look a lot more complicated after you have saved.  All that has happened is that the wiki software has expanded the links to make them fully match the expected link syntax, as explained in the following section.

==Internal Links==
Internal links are those created to other pages on the wiki; this is by far the most common type of link.  Some examples are:
{| class=&quot;wikitable&quot;
! You Type !! You See
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)|Unreal Tournament]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|the UT series]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament (series)|the UT series]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo|Demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo|Demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Demo|the demo]]&lt;/nowiki&gt;&lt;/tt&gt;||[[Unreal Tournament 2004#Demo|the demo]]
|-
|&lt;tt&gt;&lt;nowiki&gt;[[#External Links|External Links]]&lt;/nowiki&gt;&lt;/tt&gt;||[[#External Links|External Links]]
|}

An internal link always uses two square brackets.  Within the brackets, the various parts of the link are:
# The [[#Page Names|name of the page]] that you would like the reader to jump to if they click on the link, for example &lt;tt&gt;Capture the Flag&lt;/tt&gt;.  This can be omitted if you are linking to somewhere else on the same page
# An [[#Anchors|anchor]], starting with &lt;tt&gt;#&lt;/tt&gt;, if you would like the reader to jump to somewhere in the middle of the page.  This can be omitted if you just want to link to the top of a page.
# A [[#Labels|label]], starting with &lt;tt&gt;|&lt;/tt&gt;, if you would like to customize the text displayed for the label.  This is optional.

A link to an existing page will always be displayed using blue text.  After creating a link, it is recommended to [[Help:Editing Pages|preview]] the page and double check that the link is indeed blue.  If it is red, you have made a typographical error (unless you are intentionally trying to make a link to a page that needs to be created).  Sometimes links can show up as black, meaning that the wiki isn't even treating it as a link: check that your link starts with &lt;tt&gt;&lt;nowiki&gt;[[&lt;/nowiki&gt;&lt;/tt&gt; and ends with &lt;tt&gt;&lt;nowiki&gt;]]&lt;/nowiki&gt;&lt;/tt&gt;; see also [[#Labels|labels]].

===Page Names===
The wiki will automatically convert a page name into a URL-friendly equivalent.  Web page names cannot contain common characters such as spaces or many types of punctuation.  However, when creating an internal link you can type the name in whatever way is most convenient for you, and the wiki will take care of the details of the conversion.

===Anchors===
The pound sign (#, shift+3 on US keyboards) is used if you would like to link to somewhere other than the top of a page.  The HTML terminology for the spot you link to is an &quot;anchor&quot;.  This is very useful if you want to refer the reader directly to the most relevant part of the page, especially for long pages.

Any [[Help:Formatting#Section Breaks|section title (header)]] on a page can automatically be used as an anchor.  In other words you can use any text that is enclosed in equal signs (=) when you look at the page in the editor.  On pages with table of contents, those section titles will all be shown in the table of contents; if you click on one of those entries, the URL including the anchor will be shown in your browser window.

The same convenient URL conversions described under [[#Page Names|Page Names]] are also done for anchor names.  So section titles or item names can be used exactly as they appear on a page; there is no need to replace spaces with underscores.

===Labels===
Without a label, the text shown for your link will just be the page name, which in most cases is not the best choice. To create a label, you use the pipe sign (|, shift+\ on US keyboards, often shown as two vertical lines instead of just one).

A pipe all by itself at the end of a link tells the wiki to automatically create a label, by stripping out the namespace and using just the page name.  Any parts of the page name in parentheses will also be dropped. For example, &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|]]&lt;/nowiki&gt;&lt;/tt&gt; produces the link [[Unreal Tournament (series)|Unreal Tournament]].  When you save the page, the wiki explicitly fills in the label part of the link, so if you come back and edit this link, it will now read &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament (series)|Unreal Tournament]]&lt;/nowiki&gt;&lt;/tt&gt;.  There are some situations, however, where the wiki will not automatically create a label (if the link contains an anchor, for example, or in some templates); in these cases the wiki will not even create a link, but will just add the text to the page unformatted.  

Any text entered after the pipe symbol is used as a custom label for the link, i.e., that is the text that will appear to the reader.

===Special Cases===
There are a few types of links that have a special meaning.
* Links created to [[Help:Images|image pages]] will by default insert that image, instead of creating a plain link.  If you want to create a plain text link, insert a colon at the start of the link.  For example, &lt;tt&gt;&lt;nowiki&gt;[[:Image:UT2004.jpg]]&lt;/nowiki&gt;&lt;/tt&gt; creates [[:Image:UT2004.jpg]].
* Links created to [[Project:Categories|categories]] will by default add the page to that category, and will not show any link at that spot in the text.  If you want to create a link to a category page, insert a colon at the start of the link.  For example, &lt;tt&gt;&lt;nowiki&gt;[[:Category:Weapons]]&lt;/nowiki&gt;&lt;/tt&gt; creates [[:Category:Weapons]].
* Very rarely you may need to link to a page that is not part of the wiki, for example, to create a link to a game review.  In such cases, you must create an [[#External Links|external link]].  If you want to make the link look like a local link, you can embed the link in a span with the plainlinks class.  So &lt;tt&gt;&lt;nowiki&gt;&lt;span class=plainlinks&gt;[http://www.beyondunreal.com/content/articles/86_1.php UT2004 review]&lt;/span&gt;&lt;/nowiki&gt;&lt;/tt&gt; creates &lt;span class=plainlinks&gt;[http://www.beyondunreal.com/content/articles/86_1.php UT2004 review]&lt;/span&gt;.  This should '''only''' be used for links to BeyondUnreal, and should not be used to disguise external links.

==Redirects==
Redirects are a special type of internal link, and are used to make readers completely bypass that page and instead open a different page.

An example of a redirect page is [[UT2004]]; if you follow this link you will instead pull up the page [[Unreal Tournament 2004]].  A message at the top of the page lets you know that you were &quot;Redirected from UT2004&quot;.  If you really want to see the &quot;UT2004&quot; page, you can click on the link in the &quot;Redirected&quot; message.

To turn a page into a redirect you would replace the entire page contents with a single line like:&lt;br&gt;
&lt;tt&gt;&lt;nowiki&gt;
#REDIRECT [[Unreal Tournament 2004]]
&lt;/nowiki&gt;&lt;/tt&gt;&lt;br&gt;
The ''only'' other text that can be included on the page are [[Project:Categories|category]] links.  Any permanent redirect pages should be placed into one of the [[:Category:Redirects|redirect categories]], so that other editors know why the redirect page exists.

There is no reason to add a label to the link, since readers will never see it.  The link should include an anchor if the redirect should take the readers somewhere other than the top of the page.  For example, the redirect page [[UT2004 Maps]] contains the redirect link &lt;tt&gt;&lt;nowiki&gt;[[Unreal Tournament 2004#Maps]]&lt;/nowiki&gt;&lt;/tt&gt; so that readers who follow the link end up at the most relevant part of the [[Unreal Tournament 2004]] page, instead of just ending up at the top of the page.

Most redirect pages are created automatically.  Every time a page is moved, the original page name is turned into a redirect to the new page name.  This ensures that any existing links to the page were not broken by the page move.  The &quot;What Links Here&quot; feature (lower left corner of any page) can be used to identify internal links; correcting those links to point to the new page is highly recommended.  If you wish to get rid of the original page completely, a [[Project:Deletion Policy#Proposed Deletion|proposed deletion]] can be used to request that an [[Project:Administrators|administrator]] delete the page.  Before doing so, be sure to fix all internal links to the original page.  However, in cases where there are ''external'' links to the original page, the deletion request may be denied.

==External Links==
External links are links made to sites other than the wiki.  There is a different syntax for external links.  Also, external links have an additional arrow added to the displayed link; this is done to warn readers that following the link will take them to a different site.

{| class=&quot;wikitable&quot;
! You Type !! You See
|-
|&lt;tt&gt;&lt;nowiki&gt;http://forums.beyondunreal.com/&lt;/nowiki&gt;&lt;/tt&gt;||http://forums.beyondunreal.com
|-
|&lt;tt&gt;&lt;nowiki&gt;[http://forums.beyondunreal.com/]&lt;/nowiki&gt;&lt;/tt&gt;||[http://forums.beyondunreal.com]
|-
|&lt;tt&gt;&lt;nowiki&gt;[http://forums.beyondunreal.com/ BeyondUnreal Forums]&lt;/nowiki&gt;&lt;/tt&gt;||[http://forums.beyondunreal.com/ BeyondUnreal Forums]
|}

==Interwiki Links==
Adding an interwiki prefix to a regular link will create a link to that other wiki.  These can include labels as well.

Common Interwiki Prefixes:
{|
! Link Prefix !! Links To !! Example !! Result
|-
| unreal || Unreal Engine Wiki || &lt;tt&gt;&lt;nowiki&gt;[[unreal:Unreal Tournament 2004]]&lt;/nowiki&gt;&lt;/tt&gt; || [[unreal:Unreal Tournament 2004]]
|-
| uadmin || Unreal Admin Wiki || &lt;tt&gt;&lt;nowiki&gt;[[uadmin:Redirection and Compression]]&lt;/nowiki&gt;&lt;/tt&gt; || [[uadmin:Redirection and Compression]]
|-
| wikipedia || English Wikipedia || &lt;tt&gt;&lt;nowiki&gt;[[wikipedia:Unreal Tournament 2004|]]&lt;/nowiki&gt;&lt;/tt&gt; || [[wikipedia:Unreal Tournament 2004|Unreal Tournament 2004]]
|}

==See Also==
* [[metawikipedia:Help:Link|Wikimedia help page on links]]
* [[metawikipedia:Help:Piped Link|Wikimedia help page on link labelling]]
* [[metawikipedia:Help:URL|Wikimedia help page on external links]]
* [[metawikipedia:Help:Redirect|Wikimedia help page on redirects]]
* [[Project:Style Guide|Style Guide]]</text>
    </revision>
    <revision>
      <id>200</id>
      <timestamp>2008-02-18T19:29:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|inter-wiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

{{admin tip|tip=
Which protocols (like http:) are allowed for links is controlled by the [[Manual:$wgUrlProtocols|$wgUrlProtocols]] setting. 
}}

{{admin tip|tip=
To remove the 'external link image' from next to each of the external links, add the following to the page located at &lt;code&gt;MediaWiki:Monobook.css&lt;/code&gt; on your wiki.

&lt;pre&gt;
#bodyContent a.external,
#bodyContent a[href ^=&quot;gopher://&quot;] {
        background: none;
        padding-right: 0;
}
&lt;/pre&gt;
}}

==See Also==
* [[Project:Style Guide|Style Guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>383</id>
      <timestamp>2008-02-24T14:45:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|interwiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

{{admin tip|tip=
Which protocols (like http:) are allowed for links is controlled by the [[Manual:$wgUrlProtocols|$wgUrlProtocols]] setting. 
}}

{{admin tip|tip=
To remove the 'external link image' from next to each of the external links, add the following to the page located at &lt;code&gt;MediaWiki:Monobook.css&lt;/code&gt; on your wiki.

&lt;pre&gt;
#bodyContent a.external,
#bodyContent a[href ^=&quot;gopher://&quot;] {
        background: none;
        padding-right: 0;
}
&lt;/pre&gt;
}}

==See also==
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>693</id>
      <timestamp>2008-03-07T09:27:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed admin tips</comment>
      <text xml:space="preserve">There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|interwiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

==See also==
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33815</id>
      <timestamp>2008-12-29T10:22:35Z</timestamp>
      <contributor>
        <username>AcelvIlapa</username>
        <id>1814</id>
      </contributor>
      <minor/>
      <comment>cotrrolz</comment>
      <text xml:space="preserve">riccnaletomo
There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|interwiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

==See also==
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33821</id>
      <timestamp>2008-12-29T14:38:53Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>Undo revision 33815 by [[Special:Contributions/AcelvIlapa|AcelvIlapa]] ([[User talk:AcelvIlapa|Talk]])</comment>
      <text xml:space="preserve">There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|interwiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

==See also==
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44443</id>
      <timestamp>2011-05-20T09:25:00Z</timestamp>
      <contributor>
        <ip>216.75.232.181</ip>
      </contributor>
      <comment>/* See also */</comment>
      <text xml:space="preserve">There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|interwiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

==See also==
* [[Project:Style guide]]

*[http://www.givenchyoutlet.com/     Givenchy outlet]
[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44444</id>
      <timestamp>2011-05-20T13:39:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/216.75.232.181|216.75.232.181]] ([[User talk:216.75.232.181|Talk]]) to last revision by [[User:Solarsys|Solarsys]]</comment>
      <text xml:space="preserve">There are four sorts of links in MediaWiki: 
# internal links to other pages in the wiki
# external links to websites
# [[Help:Interwiki linking|interwiki links]] (links to other wikis)
# inter-language links to other language versions of the same wiki

To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.

The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).

== How to link ==
{| {{Prettytable}}
|-
|{{Hl3}}|'''Description'''
|{{Hl3}}|'''You type'''	
|{{Hl3}}|'''You get'''
|-
|Internal link
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page]]
|-
|Category link
|&lt;tt&gt;&lt;nowiki&gt;[[:Category:Help]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[:Category:Help]]
|-
|Piped link 
|&lt;tt&gt;&lt;nowiki&gt;[[Main Page|different text]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Main Page|different text]]
|-
|Anchor link 
|&lt;tt&gt;&lt;nowiki&gt;[[#External links|Anchor link]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[#External links|Anchor link]]
|-
|External link
|&lt;tt&gt;&lt;nowiki&gt;http://mediawiki.org&lt;/nowiki&gt;&lt;/tt&gt;
|http://mediawiki.org
|-
|Internal link to image file
|&lt;tt&gt;&lt;nowiki&gt;[[media:example.jpg]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[media:example.jpg]]
|-
|External link,&lt;br /&gt;
different title
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org MediaWiki]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org MediaWiki]
|-
|External link,&lt;br /&gt;
unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://mediawiki.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://mediawiki.org]
|-
|External link,&lt;br /&gt;
same host unnamed
|&lt;tt&gt;&lt;nowiki&gt;[http://{{SERVERNAME}}/pagename]&lt;/nowiki&gt;&lt;/tt&gt;
|[http://{{SERVERNAME}}/pagename]
|-
|Interwiki link
|&lt;tt&gt;&lt;nowiki&gt;[[Wikipedia:MediaWiki]]&lt;/nowiki&gt;&lt;/tt&gt;
|[[Wikipedia:MediaWiki]]
|-
|mailto
|&lt;tt&gt;&lt;nowiki&gt;mailto:info@example.org&lt;/nowiki&gt;&lt;/tt&gt;
|mailto:info@example.org
|-
|mailto unnamed
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org]
|-
|mailto named
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org info]
|-
|mailto named with subject line
|&lt;tt&gt;&lt;nowiki&gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]&lt;/nowiki&gt;&lt;/tt&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject info]
|-
|redirect
|&lt;tt&gt;&lt;nowiki&gt;#REDIRECT [[Main Page]]&lt;/nowiki&gt;&lt;/tt&gt;
| &amp;rarr; [[Main Page]]
|}

==See also==
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Managing files</title>
    <id>51</id>
    <revision>
      <id>122</id>
      <timestamp>2008-01-03T00:36:15Z</timestamp>
      <contributor>
        <ip>Kaganer</ip>
      </contributor>
      <comment>[[Category:Upload]]</comment>
      <text xml:space="preserve">{{PD Help Page}}
If file uploads are enabled, you can upload certain types of files to the wiki. This is particularly useful for uploading images, which you want to place on an article, but you can also upload other types of file.

==Upload a file==
# Prepare the file for upload. Make sure the file is exactly as you want it. Think about how big the file is.
# In the [[Help:Navigation#Sidebar|sidebar]], under '''toolbox''', click &quot;Upload file&quot;
# Next to the '''Source filename''', click '''Browse''' to locate the file on your computer.
# Change the '''Destination filename''' to something descriptive, if necessary.
# Fill in the '''Summary''', if necessary.
# Click the '''Upload file''' button.

If it is a large file, you may need to wait several seconds for the upload to complete.

== Using Images and Image Description Pages ==

After you've uploaded a file, you can use it in an article, with some special wiki syntax to create the link. See [[Help:Images]].

Your file gets its very own 'Image Description Page' within the wiki (even if it isn't an image). You should edit this page to provide more information about the file. For example, many wiki projects are quite sensitive to copyright issues, and so you should explain where you got the file from, and what its copyright status is, on the description page. Any other useful descriptive notes could also be added there.

== Listing files in the wiki ==

There are a number Special Pages to help you view and manage files which have been uploaded. Go to 'Special Pages' (in the toolbox on the left) and then see...

* [[Special:Newimages|Gallery of new images]] - If you just uploaded one, you will see it here.  
* [[Special:Imagelist|File list]] shows all of the files
* [[Special:Unusedimages|Unused images]] helps you track down files which might not be needed.

See [[Help:Special pages]] for details of the other information available here.

{{Languages|Help:Managing files}}
[[Category:Help|Managing files]]
[[Category:Upload]]</text>
    </revision>
    <revision>
      <id>123</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
If file uploads are enabled, you can upload certain types of files to the wiki. This is particularly useful for uploading images, which you want to place on an article, but you can also upload other types of file.

==Upload a file==
# Prepare the file for upload. Make sure the file is exactly as you want it. Think about how big the file is.
# In the [[Help:Navigation#Sidebar|sidebar]], under '''toolbox''', click &quot;Upload file&quot;
# Next to the '''Source filename''', click '''Browse''' to locate the file on your computer.
# Change the '''Destination filename''' to something descriptive, if necessary.
# Fill in the '''Summary''', if necessary.
# Click the '''Upload file''' button.

If it is a large file, you may need to wait several seconds for the upload to complete.

== Using Images and Image Description Pages ==

After you've uploaded a file, you can use it in an article, with some special wiki syntax to create the link. See [[Help:Images]].

Your file gets its very own 'Image Description Page' within the wiki (even if it isn't an image). You should edit this page to provide more information about the file. For example, many wiki projects are quite sensitive to copyright issues, and so you should explain where you got the file from, and what its copyright status is, on the description page. Any other useful descriptive notes could also be added there.

== Listing files in the wiki ==

There are a number Special Pages to help you view and manage files which have been uploaded. Go to 'Special Pages' (in the toolbox on the left) and then see...

* [[Special:Newimages|Gallery of new images]] - If you just uploaded one, you will see it here.  
* [[Special:Imagelist|File list]] shows all of the files
* [[Special:Unusedimages|Unused images]] helps you track down files which might not be needed.

See [[Help:Special pages]] for details of the other information available here.

{{Languages|Help:Managing files}}
[[Category:Help|Managing files]]
[[Category:Upload]]</text>
    </revision>
    <revision>
      <id>208</id>
      <timestamp>2008-02-18T19:47:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">If file uploads are enabled, you can upload certain types of files to the wiki. This is particularly useful for uploading images, which you want to place on an article, but you can also upload other types of file.

==Upload a file==
# Prepare the file for upload. Make sure the file is exactly as you want it. Think about how big the file is.
# In the [[Help:Navigation#Sidebar|sidebar]], under '''toolbox''', click &quot;Upload file&quot;
# Next to the '''Source filename''', click '''Browse''' to locate the file on your computer.
# Change the '''Destination filename''' to something descriptive, if necessary.
# Fill in the '''Summary''', if necessary.
# Click the '''Upload file''' button.

If it is a large file, you may need to wait several seconds for the upload to complete.

== Using Images and Image Description Pages ==

After you've uploaded a file, you can use it in an article, with some special wiki syntax to create the link. See [[Help:Images]].

Your file gets its very own 'Image Description Page' within the wiki (even if it isn't an image). You should edit this page to provide more information about the file. For example, many wiki projects are quite sensitive to copyright issues, and so you should explain where you got the file from, and what its copyright status is, on the description page. Any other useful descriptive notes could also be added there.

== Listing files in the wiki ==

There are a number Special Pages to help you view and manage files which have been uploaded. Go to 'Special Pages' (in the toolbox on the left) and then see...

* [[Special:Newimages|Gallery of new images]] - If you just uploaded one, you will see it here.  
* [[Special:Imagelist|File list]] shows all of the files
* [[Special:Unusedimages|Unused images]] helps you track down files which might not be needed.

See [[Help:Special pages]] for details of the other information available here.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Moving a page</title>
    <id>52</id>
    <revision>
      <id>124</id>
      <timestamp>2008-02-13T19:32:49Z</timestamp>
      <contributor>
        <ip>74.34.155.151</ip>
      </contributor>
      <comment>/* Proposing a move */ corrected spelling</comment>
      <text xml:space="preserve">{{PD Help Page}}

'''Moving (renaming) a page''' means giving it another name. This is done by using &quot;{{int:move}}&quot; tab at the top. Then simply enter the new name and click 'Move Page'. Normally you would want to leave &quot;Move associated talk page&quot; option ticked.  

If you move page &quot;A&quot; to a new title &quot;B&quot;, this operation will do the following:
* Creates the new page &quot;B&quot;, with contents from page &quot;A&quot;
* Replaces the contents of page &quot;A&quot; with redirect to &quot;B&quot;
* Moves all the editing history from page &quot;A&quot; so that it appears under &quot;B&quot;'s history tab.
&lt;!--I think the above describes just the opposite to what actually happens in the database, I'm going to replace it with correct description: page is not actually moved in [[Page table]], it's simply given a new title--&gt;

The third point is important. By using the 'Move' feature, you also '''move the editing history''', which is desireable in most situations. The editing history allows people to see how the contents of the page were built up, and who contributed what. If you move contents around by copying and pasting (not using the move feature), you do not achieve this.

Because the move operation '''leaves behind a redirect''', it should not result in any broken links, however you might want to hunt down the pages which link in to the redirect, and change their text to link directly to the new title. The 'What links here' toolbox feature (bottom left) is useful when doing this.

== Proposing a move ==
Deciding on a page title can be a difficult aspect of wiki organization, and one which can often provoke debates. If the move you have in mind is one which might cause upset or could be considered controversial, you should propose the move first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labelling the page itself, with a move proposal template, to make everybody aware of your intentions.

== Undo a move ==
As with all wiki editing, a move operation can be reversed (by any user).  To reverse a move operation, simply move the page back, e.g. move page &quot;B&quot; back to &quot;A&quot;.

The page title &quot;B&quot; will still be left behind, as a redirect from &quot;B&quot; to &quot;A&quot;. Any user can remove the redirect and propose that the page be deleted. However the final deletion will require sysop priviledges (see [[Help:Deleting a page]]).

==External links==
{{meta|Help:Moving a page}}

{{Languages|Help:Moving a page}}

[[Category:Help|Moving a page]]</text>
    </revision>
    <revision>
      <id>125</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

'''Moving (renaming) a page''' means giving it another name. This is done by using &quot;{{int:move}}&quot; tab at the top. Then simply enter the new name and click 'Move Page'. Normally you would want to leave &quot;Move associated talk page&quot; option ticked.  

If you move page &quot;A&quot; to a new title &quot;B&quot;, this operation will do the following:
* Creates the new page &quot;B&quot;, with contents from page &quot;A&quot;
* Replaces the contents of page &quot;A&quot; with redirect to &quot;B&quot;
* Moves all the editing history from page &quot;A&quot; so that it appears under &quot;B&quot;'s history tab.
&lt;!--I think the above describes just the opposite to what actually happens in the database, I'm going to replace it with correct description: page is not actually moved in [[Page table]], it's simply given a new title--&gt;

The third point is important. By using the 'Move' feature, you also '''move the editing history''', which is desireable in most situations. The editing history allows people to see how the contents of the page were built up, and who contributed what. If you move contents around by copying and pasting (not using the move feature), you do not achieve this.

Because the move operation '''leaves behind a redirect''', it should not result in any broken links, however you might want to hunt down the pages which link in to the redirect, and change their text to link directly to the new title. The 'What links here' toolbox feature (bottom left) is useful when doing this.

== Proposing a move ==
Deciding on a page title can be a difficult aspect of wiki organization, and one which can often provoke debates. If the move you have in mind is one which might cause upset or could be considered controversial, you should propose the move first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labelling the page itself, with a move proposal template, to make everybody aware of your intentions.

== Undo a move ==
As with all wiki editing, a move operation can be reversed (by any user).  To reverse a move operation, simply move the page back, e.g. move page &quot;B&quot; back to &quot;A&quot;.

The page title &quot;B&quot; will still be left behind, as a redirect from &quot;B&quot; to &quot;A&quot;. Any user can remove the redirect and propose that the page be deleted. However the final deletion will require sysop priviledges (see [[Help:Deleting a page]]).

==External links==
{{meta|Help:Moving a page}}

{{Languages|Help:Moving a page}}

[[Category:Help|Moving a page]]</text>
    </revision>
    <revision>
      <id>209</id>
      <timestamp>2008-02-18T19:48:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Moving (renaming) a page''' means giving it another name. This is done by using &quot;{{int:move}}&quot; tab at the top. Then simply enter the new name and click 'Move Page'. Normally you would want to leave &quot;Move associated talk page&quot; option ticked.  

If you move page &quot;A&quot; to a new title &quot;B&quot;, this operation will do the following:
* Creates the new page &quot;B&quot;, with contents from page &quot;A&quot;
* Replaces the contents of page &quot;A&quot; with redirect to &quot;B&quot;
* Moves all the editing history from page &quot;A&quot; so that it appears under &quot;B&quot;'s history tab.
&lt;!--I think the above describes just the opposite to what actually happens in the database, I'm going to replace it with correct description: page is not actually moved in [[Page table]], it's simply given a new title--&gt;

The third point is important. By using the 'Move' feature, you also '''move the editing history''', which is desirable in most situations. The editing history allows people to see how the contents of the page were built up, and who contributed what. If you move contents around by copying and pasting (not using the move feature), you do not achieve this.

Because the move operation '''leaves behind a redirect''', it should not result in any broken links, however you might want to hunt down the pages which link in to the redirect, and change their text to link directly to the new title. The 'What links here' toolbox feature (bottom left) is useful when doing this.

== Proposing a move ==
Deciding on a page title can be a difficult aspect of wiki organization, and one which can often provoke debates. If the move you have in mind is one which might cause upset or could be considered controversial, you should propose the move first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a move proposal template, to make everybody aware of your intentions.

== Undo a move ==
As with all wiki editing, a move operation can be reversed (by any user).  To reverse a move operation, simply move the page back, e.g. move page &quot;B&quot; back to &quot;A&quot;.

The page title &quot;B&quot; will still be left behind, as a redirect from &quot;B&quot; to &quot;A&quot;. Any user can remove the redirect and propose that the page be deleted. However the final deletion will require sysop privileges (see [[Help:Deleting a page]]).

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44547</id>
      <timestamp>2011-08-23T21:07:18Z</timestamp>
      <contributor>
        <ip>67.185.49.250</ip>
      </contributor>
      <text xml:space="preserve">'''Moving (renaming) a page''' means giving it another name. This is done by using ''{{int:move}}'' tab at the top. Then simply enter the new name and click 'Move Page'. Normally you would want to leave &quot;Move associated talk page&quot; option ticked.  

If you move page ''A'' to a new title ''B'', this operation will do the following:
* Creates the new page ''B'', with contents from page ''A''
* Replaces the contents of page ''A'' with redirect to ''B''
* Moves all the editing history from page ''A'' so that it appears under ''B'''s history tab.
&lt;!--I think the above describes just the opposite to what actually happens in the database, I'm going to replace it with correct description: page is not actually moved in [[Page table]], it's simply given a new title--&gt;

The third point is important. By using the 'Move' feature, you also '''move the editing history''', which is desirable in most situations. The editing history allows people to see how the contents of the page were built up, and who contributed what. If you move contents around by copying and pasting (not using the move feature), you do not achieve this.

Because the move operation '''leaves behind a redirect''', it should not result in any broken links, however you might want to hunt down the pages which link in to the redirect, and change their text to link directly to the new title. The 'What links here' toolbox feature (bottom left) is useful when doing this.

== Proposing a move ==
Deciding on a page title can be a difficult aspect of wiki organization, and one which can often provoke debates. If the move you have in mind is one which might cause upset or could be considered controversial, you should propose the move first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a move proposal template, to make everybody aware of your intentions.

== Undo a move ==
As with all wiki editing, a move operation can be reversed (by any user).  To reverse a move operation, simply move the page back, e.g. move page ''B'' back to ''A''.

The page title ''B'' will still be left behind, as a redirect from ''B'' to ''A''. Any user can remove the redirect and propose that the page be deleted. However the final deletion will require sysop privileges (see [[Help:Deleting a page]]).

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44557</id>
      <timestamp>2011-08-23T21:41:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/67.185.49.250|67.185.49.250]] ([[User talk:67.185.49.250|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Moving (renaming) a page''' means giving it another name. This is done by using &quot;{{int:move}}&quot; tab at the top. Then simply enter the new name and click 'Move Page'. Normally you would want to leave &quot;Move associated talk page&quot; option ticked.  

If you move page &quot;A&quot; to a new title &quot;B&quot;, this operation will do the following:
* Creates the new page &quot;B&quot;, with contents from page &quot;A&quot;
* Replaces the contents of page &quot;A&quot; with redirect to &quot;B&quot;
* Moves all the editing history from page &quot;A&quot; so that it appears under &quot;B&quot;'s history tab.
&lt;!--I think the above describes just the opposite to what actually happens in the database, I'm going to replace it with correct description: page is not actually moved in [[Page table]], it's simply given a new title--&gt;

The third point is important. By using the 'Move' feature, you also '''move the editing history''', which is desirable in most situations. The editing history allows people to see how the contents of the page were built up, and who contributed what. If you move contents around by copying and pasting (not using the move feature), you do not achieve this.

Because the move operation '''leaves behind a redirect''', it should not result in any broken links, however you might want to hunt down the pages which link in to the redirect, and change their text to link directly to the new title. The 'What links here' toolbox feature (bottom left) is useful when doing this.

== Proposing a move ==
Deciding on a page title can be a difficult aspect of wiki organization, and one which can often provoke debates. If the move you have in mind is one which might cause upset or could be considered controversial, you should propose the move first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a move proposal template, to make everybody aware of your intentions.

== Undo a move ==
As with all wiki editing, a move operation can be reversed (by any user).  To reverse a move operation, simply move the page back, e.g. move page &quot;B&quot; back to &quot;A&quot;.

The page title &quot;B&quot; will still be left behind, as a redirect from &quot;B&quot; to &quot;A&quot;. Any user can remove the redirect and propose that the page be deleted. However the final deletion will require sysop privileges (see [[Help:Deleting a page]]).

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Namespaces</title>
    <id>57</id>
    <revision>
      <id>134</id>
      <timestamp>2008-01-30T17:02:51Z</timestamp>
      <contributor>
        <ip>Sanbeg</ip>
      </contributor>
      <comment>Undo revision 164254 by [[Special:Contributions/189.79.131.189|189.79.131.189]] ([[User talk:189.79.131.189|Talk]])</comment>
      <text xml:space="preserve">{{PD Help Page}}
Pages without a ':' in their name are in the main namespace.  This namespace is for content pages; documents that aren't directly related to this may go in other namespaces.  When pages are in another namespace, they are specified as ''namespace'':''page''; i.e. this page is ''{{NAMESPACE}}'':''{{PAGENAME}}''.

;Help: Documentation about working with the wiki software.  This could be mirrored from outside sites, or locally written.
;Image: For descriptions of uploaded files or media files.  You shouldn't create these directly; they are created when you click the [[special:upload|Upload file]] link in the toolbox.
;Media: Use this namespace to link to uploaded files directly, rather than through the description pages.
;MediaWiki: Use this namespace to change the default system messages, [http://meta.wikimedia.org/wiki/Help:System_message See Help:System message on meta].
;Project: Information about this wiki; i.e. policies that apply here.  This namespace also has an alias, which is the name of the wiki installation.
;Talk: Each page has a corresponding ''discussion'' page.  This can be used for feedback/comments about that page, or other local notes that another group may want to associate with the page, without modifying the document directly, or for any other additional information to associate with the document.
;Template: This is used for meta-information that is to be transcluded into multiple documents, such as tags to mark the status of a document.
;User: For personal notes.  Each User has a corresponding user page for their own information.  Users can also create subpages, by using a / after their name.
;User_talk: The discussion page on a user's page can be used for leaving messages.  If this page is edited, the next time that user logs in they will see a box notifying them that they have new messages

==External links==

{{meta|Help:Namespace}}

{{Languages}}
[[Category:Help|Namespaces]]
[[Category:Namespace]]</text>
    </revision>
    <revision>
      <id>135</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
Pages without a ':' in their name are in the main namespace.  This namespace is for content pages; documents that aren't directly related to this may go in other namespaces.  When pages are in another namespace, they are specified as ''namespace'':''page''; i.e. this page is ''{{NAMESPACE}}'':''{{PAGENAME}}''.

;Help: Documentation about working with the wiki software.  This could be mirrored from outside sites, or locally written.
;Image: For descriptions of uploaded files or media files.  You shouldn't create these directly; they are created when you click the [[special:upload|Upload file]] link in the toolbox.
;Media: Use this namespace to link to uploaded files directly, rather than through the description pages.
;MediaWiki: Use this namespace to change the default system messages, [http://meta.wikimedia.org/wiki/Help:System_message See Help:System message on meta].
;Project: Information about this wiki; i.e. policies that apply here.  This namespace also has an alias, which is the name of the wiki installation.
;Talk: Each page has a corresponding ''discussion'' page.  This can be used for feedback/comments about that page, or other local notes that another group may want to associate with the page, without modifying the document directly, or for any other additional information to associate with the document.
;Template: This is used for meta-information that is to be transcluded into multiple documents, such as tags to mark the status of a document.
;User: For personal notes.  Each User has a corresponding user page for their own information.  Users can also create subpages, by using a / after their name.
;User_talk: The discussion page on a user's page can be used for leaving messages.  If this page is edited, the next time that user logs in they will see a box notifying them that they have new messages

==External links==

{{meta|Help:Namespace}}

{{Languages}}
[[Category:Help|Namespaces]]
[[Category:Namespace]]</text>
    </revision>
    <revision>
      <id>214</id>
      <timestamp>2008-02-18T19:57:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Pages without a ':' in their name are in the main namespace.  This namespace is for content pages; documents that aren't directly related to this may go in other namespaces.  When pages are in another namespace, they are specified as ''namespace'':''page''; i.e. this page is ''{{NAMESPACE}}'':''{{PAGENAME}}''.

;Help: Documentation about working with the wiki software.  This could be mirrored from outside sites, or locally written.
;Image: For descriptions of uploaded files or media files.  You shouldn't create these directly; they are created when you click the [[special:upload|Upload file]] link in the toolbox.
;Media: Use this namespace to link to uploaded files directly, rather than through the description pages.
;MediaWiki: Use this namespace to change the default system messages, [http://meta.wikimedia.org/wiki/Help:System_message See Help:System message on meta].
;Project: Information about this wiki; i.e. policies that apply here.  This namespace also has an alias, which is the name of the wiki installation.
;Talk: Each page has a corresponding ''discussion'' page.  This can be used for feedback/comments about that page, or other local notes that another group may want to associate with the page, without modifying the document directly, or for any other additional information to associate with the document.
;Template: This is used for meta-information that is to be transcluded into multiple documents, such as tags to mark the status of a document.
;User: For personal notes.  Each User has a corresponding user page for their own information.  Users can also create subpages, by using a / after their name.
;User_talk: The discussion page on a user's page can be used for leaving messages.  If this page is edited, the next time that user logs in they will see a box notifying them that they have new messages

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>322</id>
      <timestamp>2008-02-21T15:04:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Pages without a ':' in their name are in the main namespace.  This namespace is for content pages; documents that aren't directly related to this may go in other namespaces.  When pages are in another namespace, they are specified as ''namespace'':''page''; i.e. this page is ''{{NAMESPACE}}'':''{{PAGENAME}}''.

;Help: Documentation about working with the wiki software.  This could be mirrored from outside sites, or locally written.
;Image: For descriptions of uploaded files or media files.  You shouldn't create these directly; they are created when you click the [[special:upload|Upload file]] link in the toolbox.
;Media: Use this namespace to link to uploaded files directly, rather than through the description pages.
;MediaWiki: Use this namespace to change the default system messages, [http://meta.wikimedia.org/wiki/Help:System_message See Help:System message on meta].
;Project: Information about this wiki; i.e. policies that apply here.  This namespace also has an alias, which is the name of the wiki installation.
;Talk: Each page has a corresponding ''discussion'' page.  This can be used for feedback/comments about that page, or other local notes that another group may want to associate with the page, without modifying the document directly, or for any other additional information to associate with the document.
;Template: This is used for meta-information that is to be transcluded into multiple documents, such as tags to mark the status of a document.
;User: For personal notes.  Each User has a corresponding user page for their own information.  Users can also create subpages, by using a / after their name.
;User_talk: The discussion page on a user's page can be used for leaving messages.  If this page is edited, the next time that user logs in they will see a box notifying them that they have new messages

== See also ==
* [[Project:Namespaces]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Navigation</title>
    <id>28</id>
    <revision>
      <id>56</id>
      <timestamp>2007-07-05T07:07:16Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">If you look at a page on the wiki, you will find three main navigation elements: The sidebar on the left gives you a starting point to some of the more important pages on the wiki. At the top of the page are the links that belong to the page currently displayed, including the discussion page, the version history, and the edit link. 

==Sidebar==
The sidebar is displayed on the left edge of the page below the site logo. This sidebar gives you access to the important pages on the wiki, such as the recent changes or the community portal.

===General===
* Clicking the ''[[{{int:mainpage}}|main page]]'' link will bring you back to the start of the wiki.
* ''[[Special:Recentchanges|Recent changes]]'' is a special page which allows you to track the last edits made in the wiki.
* ''[[Special:Random|Random page]]'' takes you to a completely random page.
* Finally, clicking on the ''[[Help:Contents|Help]]'' link will take you to the site help files.

===Sections===
The sections, also referred to as the game pages, are the main pages associated with each of their respective games. By clicking these links, you can find out more about each game, as well as find links to specific walkthroughs related to the game.

===Community===
These links focus on the community that helps write and edit the wiki, and they provide places for the community to discuss the designing of the project.
* Those newer members who wish to provide ''[[Project:Feedback|feedback]]'' on the site without having to worry about discussion page etiquette can simply put their thoughts on the bottom of this page.
* The ''&lt;span class=&quot;plainlinks&quot;&gt;[http://forums.beyondunreal.com BeyondUnreal Forums]&lt;/span&gt;'' are a place where you can discuss and seek help for the different Unreal games.
* The [[Links]] section is a compilation of different Unreal related sites.

===Toolbox===
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information, or when you are refactoring wiki pages and need to check whether links to a page are still relevant after changes are made to it.
* The ''related changes'' tool lists all recent changes in the pages linked to and from the current page. Recent changes to all relevant template pages are also included in the resulting page list. 
* ''Upload file'' brings up a special page that allows editors to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages.
* The ''special pages'' tool lists the special pages that allow you to do special things on the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.
* You can view a ''printable version'' of a wiki page, which is simply a version of a page that is formatted to fit nicely on paper.
* ''Permanent link'' links to the latest revision of a wiki page. Even if the page is revised, the link will continue to point to the same revision.

==Page Tabs==
The page tabs are displayed at the top of the article. These tabs allow you to perform actions that are related to the current article. The available actions include: viewing, editing, and discussing the current current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have admin privileges on the wiki. An example snapshot image of the page tabs is shown to the right.

* ''&lt;namespace&gt;''
*: The main article.
* ''discussion''
*: The discussion about the main article.
* ''edit''
*: Allows you to edit the main article or it's discussion page, depending on which you are currently viewing.
* ''history''
*: Allows you to view the revision history of the article or the discussion page.
* ''move''
*: This renames or moves the page, leaving a redirect in it's place.
* ''watch/unwatch''
*: This link will either add the page to your watchlist, or remove the page from your watchlist.

==User Links==
The user links are displayed at the bottom of the sidebar. These links allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout. For anonymous users the user links is replaced by a link to the wiki login page. An example snapshot image of the user links is shown to the right.

* ''&lt;username&gt;'' 
*:This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''my preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking 'watch' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.</text>
    </revision>
    <revision>
      <id>57</id>
      <timestamp>2008-02-17T18:39:08Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">If you look at a page on the wiki, you will find three main navigation elements: The sidebar on the left gives you a starting point to some of the more important pages on the wiki. At the top of the page are the links that belong to the page currently displayed, including the discussion page, the version history, and the edit link. 

==Sidebar==
The sidebar is displayed on the left edge of the page below the site logo. This sidebar gives you access to the important pages on the wiki, such as the recent changes or the community portal.

===General===
* Clicking the ''[[{{int:mainpage}}|main page]]'' link will bring you back to the start of the wiki.
* ''[[Special:Recentchanges|Recent changes]]'' is a special page which allows you to track the last edits made in the wiki.
* ''[[Special:Random|Random page]]'' takes you to a completely random page.
* Finally, clicking on the ''[[Help:Contents|Help]]'' link will take you to the site help files.

===Sections===
The sections, also referred to as the game pages, are the main pages associated with each of their respective games. By clicking these links, you can find out more about each game, as well as find links to specific walkthroughs related to the game.

===Community===
These links focus on the community that helps write and edit the wiki, and they provide places for the community to discuss the designing of the project.
* Those newer members who wish to provide ''[[Project:Feedback|feedback]]'' on the site without having to worry about discussion page etiquette can simply put their thoughts on the bottom of this page.
* The ''&lt;span class=&quot;plainlinks&quot;&gt;[http://forums.beyondunreal.com BeyondUnreal Forums]&lt;/span&gt;'' are a place where you can discuss and seek help for the different Unreal games.
* The [[Links]] section is a compilation of different Unreal related sites.

===Toolbox===
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information, or when you are refactoring wiki pages and need to check whether links to a page are still relevant after changes are made to it.
* The ''related changes'' tool lists all recent changes in the pages linked to and from the current page. Recent changes to all relevant template pages are also included in the resulting page list. 
* ''Upload file'' brings up a special page that allows editors to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages.
* The ''special pages'' tool lists the special pages that allow you to do special things on the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.
* You can view a ''printable version'' of a wiki page, which is simply a version of a page that is formatted to fit nicely on paper.
* ''Permanent link'' links to the latest revision of a wiki page. Even if the page is revised, the link will continue to point to the same revision.

==Page Tabs==
The page tabs are displayed at the top of the article. These tabs allow you to perform actions that are related to the current article. The available actions include: viewing, editing, and discussing the current current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have admin privileges on the wiki. An example snapshot image of the page tabs is shown to the right.

* ''&lt;namespace&gt;''
*: The main article.
* ''discussion''
*: The discussion about the main article.
* ''edit''
*: Allows you to edit the main article or it's discussion page, depending on which you are currently viewing.
* ''history''
*: Allows you to view the revision history of the article or the discussion page.
* ''move''
*: This renames or moves the page, leaving a redirect in it's place.
* ''watch/unwatch''
*: This link will either add the page to your watchlist, or remove the page from your watchlist.

==User Links==
The user links are displayed at the bottom of the sidebar. These links allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout. For anonymous users the user links is replaced by a link to the wiki login page. An example snapshot image of the user links is shown to the right.

* ''&lt;username&gt;'' 
*:This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''my preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking 'watch' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.</text>
    </revision>
    <revision>
      <id>92</id>
      <timestamp>2008-02-13T10:46:05Z</timestamp>
      <contributor>
        <ip>Kaganer</ip>
      </contributor>
      <comment>rv to last english edits ;)</comment>
      <text xml:space="preserve">{{PD Help Page}}
When viewing any page on a MediaWiki wiki, you'll find three main navigation elements:
# The [[#Sidebar|sidebar]] on the left gives you access to important pages in the wiki such as Recent changes or Upload file.
# At the top of the page are links (often called [[#Page Tabs|tabs]]) which relate to the page currently displayed: its associated discussion page, the version history, and&amp;mdash;most notably&amp;mdash;the edit link.
# In the top right corner you'll find [[#User Links|user links]]; as an anonymous user, you'll see a link to create an account or log in (they are the same page). As a logged-in user you have a collection of personal links, including ones to your user page and [[Help:Preferences|preferences]].
 
== Sidebar ==
[[Image:M-en-sidebar.png|framed|right|Example sidebar, shown on the left of the page]]
The sidebar is displayed on the left edge of the page below the site logo (if using the default MonoBook skin). This sidebar gives you access to important pages in the wiki such as Recent changes or Upload file.

=== Navigation ===
Clicking on the logo brings you back to the main page of the wiki. The links in the navigation section just below will take you to important pages of the wiki. These links can be configured by site administrators.

{{Admin tip|tip=You can customize the navigation links by editing [[MediaWiki:Sidebar]]. Some entries call for separate MediaWiki: pages, e.g. to change the automatic link to the [[Main Page]] you would change [[MediaWiki:Mainpage]] (target page) and [[MediaWiki:Mainpage-text]] (displayed text). You can find a list of such pages via [[Special:Allmessages]].}}

=== Toolbox ===
The toolbox contains a selection of links which change depending on what type of page you are viewing.

On all pages (except special pages):
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information. The ''What links here'' information can also be useful when you are refactoring wiki pages and need to check whether links to this page are still relevant after changes in the current page.
* The ''Related changes'' tool lists all recent changes in the pages linked to from the current page. Recent changes to all relevant template pages are included in the resulting page list. The &quot;Hide minor edits&quot; option that can be set in the user [[Help:Preferences|preferences]] applies, among other things, to ''Related Changes''.

On all pages (including special pages):
* ''Upload file'' displays a special page that allows logged-in users to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages. Uploading files, viewing files on the server, including them in wiki pages and managing the uploaded files is discussed in the [[Help:Managing files|managing files]] section of this manual. This is not displayed if file uploading has been disabled or not enabled in the first place.
{{Admin tip|tip=To enable file uploading someone with access to the MediaWiki installation files needs to edit the &lt;code&gt;LocalSettings.php&lt;/code&gt; file and uncomment or add the option &lt;code&gt;$wgEnableUploads = true;&lt;/code&gt;. Uploaded files will be stored in the images folder specified by the &lt;code&gt;$wgUploadPath&lt;/code&gt; variable in the &lt;code&gt;LocalSettings.php&lt;/code&gt;. This directory must be writable if file uploads is enabled. The [[Manual:LocalSettings.php#Upload location|upload location]] and [[Manual:LocalSettings.php#Image uploads|image uploads]] settings are described in more detail on the MetaWiki [[Manual:LocalSettings.php|LocalSettings.php]] page.}}
* The ''Special pages'' tool lists the MediaWiki special pages. In MediaWiki terminology, a special page is one that presents information about the Wiki and/or allows access to administration activities for the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.

:''The function and use of the default special pages can be found in the [[Help:Special pages|special pages]] section of this manual.''

== Page Tabs ==
[[Image:M-en-pagetabs.png|framed|right|Default page tabs at the top of the page]]
The page tabs are displayed at the top of the article to the right of the site logo (if using the default MonoBook skin). These tabs allow you to perform actions or view pages that are related to the current article. The available default actions include: viewing, editing, and discussing the current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have sysop (administrator) privileges on the wiki. On special pages only the namespace tab is displayed.

;Default for all users
: ''[[Help:Namespaces|namespace]]'' (article, help, special page, template, user page etc.)
: ''discussion''
: ''edit'' (may read ''view source'' if anonymous editing is disabled, the page is in the MediaWiki: namespace, or the page is protected)
: ''history''

;Extra tabs for logged-in users:
: ''move''
: ''watch''

;Extra tabs for sysops:
: ''protect''
: ''delete''

Administrators can add or remove tabs by using JavaScript or installing extensions, so the tabs you see may be different depending on which wiki you are using.

== User Links ==
[[Image:M-en-userlinks.png|framed|right|Default user links at the top right of the page]]
The user links are displayed at the top far right of the article (if using the default MonoBook skin). These tabs allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout.

For anonymous users the user links is replaced by a link to the wiki login page or, if enabled, a link to your IP address and your IP address's talk page.

* ''&lt;username&gt;'' 
*: This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking ''watch'' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

{{Languages|Help:Navigation}}
[[Category:Help|Navigation]]</text>
    </revision>
    <revision>
      <id>93</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">If you look at a page on the wiki, you will find three main navigation elements: The sidebar on the left gives you a starting point to some of the more important pages on the wiki. At the top of the page are the links that belong to the page currently displayed, including the discussion page, the version history, and the edit link. 

==Sidebar==
The sidebar is displayed on the left edge of the page below the site logo. This sidebar gives you access to the important pages on the wiki, such as the recent changes or the community portal.

===General===
* Clicking the ''[[{{int:mainpage}}|main page]]'' link will bring you back to the start of the wiki.
* ''[[Special:Recentchanges|Recent changes]]'' is a special page which allows you to track the last edits made in the wiki.
* ''[[Special:Random|Random page]]'' takes you to a completely random page.
* Finally, clicking on the ''[[Help:Contents|Help]]'' link will take you to the site help files.

===Sections===
The sections, also referred to as the game pages, are the main pages associated with each of their respective games. By clicking these links, you can find out more about each game, as well as find links to specific walkthroughs related to the game.

===Community===
These links focus on the community that helps write and edit the wiki, and they provide places for the community to discuss the designing of the project.
* Those newer members who wish to provide ''[[Project:Feedback|feedback]]'' on the site without having to worry about discussion page etiquette can simply put their thoughts on the bottom of this page.
* The ''&lt;span class=&quot;plainlinks&quot;&gt;[http://forums.beyondunreal.com BeyondUnreal Forums]&lt;/span&gt;'' are a place where you can discuss and seek help for the different Unreal games.
* The [[Links]] section is a compilation of different Unreal related sites.

===Toolbox===
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information, or when you are refactoring wiki pages and need to check whether links to a page are still relevant after changes are made to it.
* The ''related changes'' tool lists all recent changes in the pages linked to and from the current page. Recent changes to all relevant template pages are also included in the resulting page list. 
* ''Upload file'' brings up a special page that allows editors to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages.
* The ''special pages'' tool lists the special pages that allow you to do special things on the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.
* You can view a ''printable version'' of a wiki page, which is simply a version of a page that is formatted to fit nicely on paper.
* ''Permanent link'' links to the latest revision of a wiki page. Even if the page is revised, the link will continue to point to the same revision.

==Page Tabs==
The page tabs are displayed at the top of the article. These tabs allow you to perform actions that are related to the current article. The available actions include: viewing, editing, and discussing the current current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have admin privileges on the wiki. An example snapshot image of the page tabs is shown to the right.

* ''&lt;namespace&gt;''
*: The main article.
* ''discussion''
*: The discussion about the main article.
* ''edit''
*: Allows you to edit the main article or it's discussion page, depending on which you are currently viewing.
* ''history''
*: Allows you to view the revision history of the article or the discussion page.
* ''move''
*: This renames or moves the page, leaving a redirect in it's place.
* ''watch/unwatch''
*: This link will either add the page to your watchlist, or remove the page from your watchlist.

==User Links==
The user links are displayed at the bottom of the sidebar. These links allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout. For anonymous users the user links is replaced by a link to the wiki login page. An example snapshot image of the user links is shown to the right.

* ''&lt;username&gt;'' 
*:This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''my preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking 'watch' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.</text>
    </revision>
    <revision>
      <id>190</id>
      <timestamp>2008-02-18T19:09:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">If you look at a page on the wiki, you will find three main navigation elements: The sidebar on the left gives you a starting point to some of the more important pages on the wiki. At the top of the page are the links that belong to the page currently displayed, including the discussion page, the version history, and the edit link. 

==Sidebar==
The sidebar is displayed on the left edge of the page below the site logo. This sidebar gives you access to the important pages on the wiki, such as the recent changes or the community portal.

===General===
* Clicking the ''[[{{int:mainpage}}|main page]]'' link will bring you back to the start of the wiki.
* ''[[Special:Recentchanges|Recent changes]]'' is a special page which allows you to track the last edits made in the wiki.
* ''[[Special:Random|Random page]]'' takes you to a completely random page.
* Finally, clicking on the ''[[Help:Contents|Help]]'' link will take you to the site help files.

===Sections===
The sections, also referred to as the game pages, are the main pages associated with each of their respective games. By clicking these links, you can find out more about each game, as well as find links to specific walkthroughs related to the game.

===Community===
These links focus on the community that helps write and edit the wiki, and they provide places for the community to discuss the designing of the project.
* Those newer members who wish to provide ''[[Project:Feedback|feedback]]'' on the site without having to worry about discussion page etiquette can simply put their thoughts on the bottom of this page.
* The ''&lt;span class=&quot;plainlinks&quot;&gt;[http://forums.beyondunreal.com BeyondUnreal Forums]&lt;/span&gt;'' are a place where you can discuss and seek help for the different Unreal games.
* The [[Links]] section is a compilation of different Unreal related sites.

===Toolbox===
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information, or when you are refactoring wiki pages and need to check whether links to a page are still relevant after changes are made to it.
* The ''related changes'' tool lists all recent changes in the pages linked to and from the current page. Recent changes to all relevant template pages are also included in the resulting page list. 
* ''Upload file'' brings up a special page that allows editors to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages.
* The ''special pages'' tool lists the special pages that allow you to do special things on the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.
* You can view a ''printable version'' of a wiki page, which is simply a version of a page that is formatted to fit nicely on paper.
* ''Permanent link'' links to the latest revision of a wiki page. Even if the page is revised, the link will continue to point to the same revision.

==Page Tabs==
The page tabs are displayed at the top of the article. These tabs allow you to perform actions that are related to the current article. The available actions include: viewing, editing, and discussing the current current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have admin privileges on the wiki. An example snapshot image of the page tabs is shown to the right.

* ''&lt;namespace&gt;''
*: The main article.
* ''discussion''
*: The discussion about the main article.
* ''edit''
*: Allows you to edit the main article or it's discussion page, depending on which you are currently viewing.
* ''history''
*: Allows you to view the revision history of the article or the discussion page.
* ''move''
*: This renames or moves the page, leaving a redirect in it's place.
* ''watch/unwatch''
*: This link will either add the page to your watchlist, or remove the page from your watchlist.

==User Links==
The user links are displayed at the bottom of the sidebar. These links allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout. For anonymous users the user links is replaced by a link to the wiki login page. An example snapshot image of the user links is shown to the right.

* ''&lt;username&gt;'' 
*:This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''my preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking 'watch' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|Navigation]]</text>
    </revision>
    <revision>
      <id>194</id>
      <timestamp>2008-02-18T19:13:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">If you look at a page on the wiki, you will find three main navigation elements: The sidebar on the left gives you a starting point to some of the more important pages on the wiki. At the top of the page are the links that belong to the page currently displayed, including the discussion page, the version history, and the edit link. 

==Sidebar==
The sidebar is displayed on the left edge of the page below the site logo. This sidebar gives you access to the important pages on the wiki, such as the recent changes or the community portal.

===General===
* Clicking the ''[[{{int:mainpage}}|main page]]'' link will bring you back to the start of the wiki.
* ''[[Special:Recentchanges|Recent changes]]'' is a special page which allows you to track the last edits made in the wiki.
* ''[[Special:Random|Random page]]'' takes you to a completely random page.
* Finally, clicking on the ''[[Help:Contents|Help]]'' link will take you to the site help files.

===Sections===
The sections, also referred to as the game pages, are the main pages associated with each of their respective games. By clicking these links, you can find out more about each game, as well as find links to specific walkthroughs related to the game.

===Community===
These links focus on the community that helps write and edit the wiki, and they provide places for the community to discuss the designing of the project.
* Those newer members who wish to provide ''[[Project:Feedback|feedback]]'' on the site without having to worry about discussion page etiquette can simply put their thoughts on the bottom of this page.
* The ''&lt;span class=&quot;plainlinks&quot;&gt;[http://forums.beyondunreal.com BeyondUnreal Forums]&lt;/span&gt;'' are a place where you can discuss and seek help for the different Unreal games.
* The [[Links]] section is a compilation of different Unreal related sites.

===Toolbox===
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information, or when you are refactoring wiki pages and need to check whether links to a page are still relevant after changes are made to it.
* The ''related changes'' tool lists all recent changes in the pages linked to and from the current page. Recent changes to all relevant template pages are also included in the resulting page list. 
* ''Upload file'' brings up a special page that allows editors to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages.
* The ''special pages'' tool lists the special pages that allow you to do special things on the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.
* You can view a ''printable version'' of a wiki page, which is simply a version of a page that is formatted to fit nicely on paper.
* ''Permanent link'' links to the latest revision of a wiki page. Even if the page is revised, the link will continue to point to the same revision.

==Page Tabs==
The page tabs are displayed at the top of the article. These tabs allow you to perform actions that are related to the current article. The available actions include: viewing, editing, and discussing the current current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have admin privileges on the wiki. An example snapshot image of the page tabs is shown to the right.

* ''&lt;namespace&gt;''
*: The main article.
* ''discussion''
*: The discussion about the main article.
* ''edit''
*: Allows you to edit the main article or it's discussion page, depending on which you are currently viewing.
* ''history''
*: Allows you to view the revision history of the article or the discussion page.
* ''move''
*: This renames or moves the page, leaving a redirect in it's place.
* ''watch/unwatch''
*: This link will either add the page to your watchlist, or remove the page from your watchlist.

==User Links==
The user links are displayed at the bottom of the sidebar. These links allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout. For anonymous users the user links is replaced by a link to the wiki login page. An example snapshot image of the user links is shown to the right.

* ''&lt;username&gt;'' 
*:This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''my preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking 'watch' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>198</id>
      <timestamp>2008-02-18T19:25:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">When viewing any page on a MediaWiki wiki, you'll find three main navigation elements:
# The [[#Sidebar|sidebar]] on the left gives you access to important pages in the wiki such as Recent changes or Upload file.
# At the top of the page are links (often called [[#Page Tabs|tabs]]) which relate to the page currently displayed: its associated discussion page, the version history, and&amp;mdash;most notably&amp;mdash;the edit link.
# In the top right corner you'll find [[#User Links|user links]]; as an anonymous user, you'll see a link to create an account or log in (they are the same page). As a logged-in user you have a collection of personal links, including ones to your user page and [[Help:Preferences|preferences]].
 
== Sidebar ==
[[Image:M-en-sidebar.png|framed|right|Example sidebar, shown on the left of the page]]
The sidebar is displayed on the left edge of the page below the site logo (if using the default MonoBook skin). This sidebar gives you access to important pages in the wiki such as Recent changes or Upload file.

=== Navigation ===
Clicking on the logo brings you back to the main page of the wiki. The links in the navigation section just below will take you to important pages of the wiki. These links can be configured by site administrators.

{{Admin tip|tip=You can customize the navigation links by editing [[MediaWiki:Sidebar]]. Some entries call for separate MediaWiki: pages, e.g. to change the automatic link to the [[Main Page]] you would change [[MediaWiki:Mainpage]] (target page) and [[MediaWiki:Mainpage-text]] (displayed text). You can find a list of such pages via [[Special:Allmessages]].}}

=== Toolbox ===
The toolbox contains a selection of links which change depending on what type of page you are viewing.

On all pages (except special pages):
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information. The ''What links here'' information can also be useful when you are refactoring wiki pages and need to check whether links to this page are still relevant after changes in the current page.
* The ''Related changes'' tool lists all recent changes in the pages linked to from the current page. Recent changes to all relevant template pages are included in the resulting page list. The &quot;Hide minor edits&quot; option that can be set in the user [[Help:Preferences|preferences]] applies, among other things, to ''Related Changes''.

On all pages (including special pages):
* ''Upload file'' displays a special page that allows logged-in users to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages. Uploading files, viewing files on the server, including them in wiki pages and managing the uploaded files is discussed in the [[Help:Managing files|managing files]] section of this manual. This is not displayed if file uploading has been disabled or not enabled in the first place.
{{Admin tip|tip=To enable file uploading someone with access to the MediaWiki installation files needs to edit the &lt;code&gt;LocalSettings.php&lt;/code&gt; file and uncomment or add the option &lt;code&gt;$wgEnableUploads = true;&lt;/code&gt;. Uploaded files will be stored in the images folder specified by the &lt;code&gt;$wgUploadPath&lt;/code&gt; variable in the &lt;code&gt;LocalSettings.php&lt;/code&gt;. This directory must be writable if file uploads is enabled. The [[Manual:LocalSettings.php#Upload location|upload location]] and [[Manual:LocalSettings.php#Image uploads|image uploads]] settings are described in more detail on the MetaWiki [[Manual:LocalSettings.php|LocalSettings.php]] page.}}
* The ''Special pages'' tool lists the MediaWiki special pages. In MediaWiki terminology, a special page is one that presents information about the Wiki and/or allows access to administration activities for the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.

:''The function and use of the default special pages can be found in the [[Help:Special pages|special pages]] section of this manual.''

== Page Tabs ==
[[Image:M-en-pagetabs.png|framed|right|Default page tabs at the top of the page]]
The page tabs are displayed at the top of the article to the right of the site logo (if using the default MonoBook skin). These tabs allow you to perform actions or view pages that are related to the current article. The available default actions include: viewing, editing, and discussing the current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have sysop (administrator) privileges on the wiki. On special pages only the namespace tab is displayed.

;Default for all users
: ''[[Help:Namespaces|namespace]]'' (article, help, special page, template, user page etc.)
: ''discussion''
: ''edit'' (may read ''view source'' if anonymous editing is disabled, the page is in the MediaWiki: namespace, or the page is protected)
: ''history''

;Extra tabs for logged-in users:
: ''move''
: ''watch''

;Extra tabs for sysops:
: ''protect''
: ''delete''

Administrators can add or remove tabs by using JavaScript or installing extensions, so the tabs you see may be different depending on which wiki you are using.

== User Links ==
[[Image:M-en-userlinks.png|framed|right|Default user links at the top right of the page]]
The user links are displayed at the top far right of the article (if using the default MonoBook skin). These tabs allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout.

For anonymous users the user links is replaced by a link to the wiki login page or, if enabled, a link to your IP address and your IP address's talk page.

* ''&lt;username&gt;'' 
*: This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking ''watch'' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>258</id>
      <timestamp>2008-02-19T21:30:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">When viewing any page on a MediaWiki wiki, you'll find three main navigation elements:
# The [[#Sidebar|sidebar]] on the left gives you access to important pages in the wiki such as Recent changes or Upload file.
# At the top of the page are links (often called [[#Page Tabs|tabs]]) which relate to the page currently displayed: its associated discussion page, the version history, and&amp;mdash;most notably&amp;mdash;the edit link.
# In the top right corner you'll find [[#User Links|user links]]; as an anonymous user, you'll see a link to create an account or log in (they are the same page). As a logged-in user you have a collection of personal links, including ones to your user page and [[Help:Preferences|preferences]].
 
== Sidebar ==
[[Image:M-en-sidebar.png|framed|right|Example sidebar, shown on the left of the page]]
The sidebar is displayed on the left edge of the page below the site logo (if using the default MonoBook skin). This sidebar gives you access to important pages in the wiki such as Recent changes or Upload file.

=== Navigation ===
Clicking on the logo brings you back to the main page of the wiki. The links in the navigation section just below will take you to important pages of the wiki. These links can be configured by site administrators.

{{Admin tip|tip=You can customize the navigation links by editing [[MediaWiki:Sidebar]]. Some entries call for separate MediaWiki: pages, e.g. to change the automatic link to the [[Main Page]] you would change [[MediaWiki:Mainpage]] (target page) and [[MediaWiki:Mainpage-text]] (displayed text). You can find a list of such pages via [[Special:Allmessages]].}}

=== Toolbox ===
The toolbox contains a selection of links which change depending on what type of page you are viewing.

On all pages (except special pages):
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information. The ''What links here'' information can also be useful when you are refactoring wiki pages and need to check whether links to this page are still relevant after changes in the current page.
* The ''Related changes'' tool lists all recent changes in the pages linked to from the current page. Recent changes to all relevant template pages are included in the resulting page list. The &quot;Hide minor edits&quot; option that can be set in the user [[Help:Preferences|preferences]] applies, among other things, to ''Related Changes''.

On all pages (including special pages):
* ''Upload file'' displays a special page that allows logged-in users to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages. Uploading files, viewing files on the server, including them in wiki pages and managing the uploaded files is discussed in the [[Help:Managing files|managing files]] section of this manual. This is not displayed if file uploading has been disabled or not enabled in the first place.
{{Admin tip|tip=To enable file uploading someone with access to the MediaWiki installation files needs to edit the &lt;code&gt;LocalSettings.php&lt;/code&gt; file and uncomment or add the option &lt;code&gt;$wgEnableUploads = true;&lt;/code&gt;. Uploaded files will be stored in the images folder specified by the &lt;code&gt;$wgUploadPath&lt;/code&gt; variable in the &lt;code&gt;LocalSettings.php&lt;/code&gt;. This directory must be writable if file uploads is enabled. The [[Manual:LocalSettings.php#Upload location|upload location]] and {{mediawiki|Manual:LocalSettings.php#Image uploads|image uploads}} settings are described in more detail on the MetaWiki {{mediawiki|Manual:LocalSettings.php|LocalSettings.php}} page.}}
* The ''Special pages'' tool lists the MediaWiki special pages. In MediaWiki terminology, a special page is one that presents information about the Wiki and/or allows access to administration activities for the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.

:''The function and use of the default special pages can be found in the [[Help:Special pages|special pages]] section of this manual.''

== Page Tabs ==
[[Image:M-en-pagetabs.png|framed|right|Default page tabs at the top of the page]]
The page tabs are displayed at the top of the article to the right of the site logo (if using the default MonoBook skin). These tabs allow you to perform actions or view pages that are related to the current article. The available default actions include: viewing, editing, and discussing the current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have sysop (administrator) privileges on the wiki. On special pages only the namespace tab is displayed.

;Default for all users
: ''[[Help:Namespaces|namespace]]'' (article, help, special page, template, user page etc.)
: ''discussion''
: ''edit'' (may read ''view source'' if anonymous editing is disabled, the page is in the MediaWiki: namespace, or the page is protected)
: ''history''

;Extra tabs for logged-in users:
: ''move''
: ''watch''

;Extra tabs for sysops:
: ''protect''
: ''delete''

Administrators can add or remove tabs by using JavaScript or installing extensions, so the tabs you see may be different depending on which wiki you are using.

== User Links ==
[[Image:M-en-userlinks.png|framed|right|Default user links at the top right of the page]]
The user links are displayed at the top far right of the article (if using the default MonoBook skin). These tabs allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout.

For anonymous users the user links is replaced by a link to the wiki login page or, if enabled, a link to your IP address and your IP address's talk page.

* ''&lt;username&gt;'' 
*: This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking ''watch'' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>694</id>
      <timestamp>2008-03-07T09:28:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed admin tip</comment>
      <text xml:space="preserve">When viewing any page on a MediaWiki wiki, you'll find three main navigation elements:
# The [[#Sidebar|sidebar]] on the left gives you access to important pages in the wiki such as Recent changes or Upload file.
# At the top of the page are links (often called [[#Page Tabs|tabs]]) which relate to the page currently displayed: its associated discussion page, the version history, and&amp;mdash;most notably&amp;mdash;the edit link.
# In the top right corner you'll find [[#User Links|user links]]; as an anonymous user, you'll see a link to create an account or log in (they are the same page). As a logged-in user you have a collection of personal links, including ones to your user page and [[Help:Preferences|preferences]].
 
== Sidebar ==
[[Image:M-en-sidebar.png|framed|right|Example sidebar, shown on the left of the page]]
The sidebar is displayed on the left edge of the page below the site logo (if using the default MonoBook skin). This sidebar gives you access to important pages in the wiki such as Recent changes or Upload file.

=== Navigation ===
Clicking on the logo brings you back to the main page of the wiki. The links in the navigation section just below will take you to important pages of the wiki. These links can be configured by site administrators.

=== Toolbox ===
The toolbox contains a selection of links which change depending on what type of page you are viewing.

On all pages (except special pages):
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information. The ''What links here'' information can also be useful when you are refactoring wiki pages and need to check whether links to this page are still relevant after changes in the current page.
* The ''Related changes'' tool lists all recent changes in the pages linked to from the current page. Recent changes to all relevant template pages are included in the resulting page list. The &quot;Hide minor edits&quot; option that can be set in the user [[Help:Preferences|preferences]] applies, among other things, to ''Related Changes''.

On all pages (including special pages):
* ''Upload file'' displays a special page that allows logged-in users to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages. Uploading files, viewing files on the server, including them in wiki pages and managing the uploaded files is discussed in the [[Help:Managing files|managing files]] section of this manual. This is not displayed if file uploading has been disabled or not enabled in the first place.
* The ''Special pages'' tool lists the MediaWiki special pages. In MediaWiki terminology, a special page is one that presents information about the Wiki and/or allows access to administration activities for the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.

:''The function and use of the default special pages can be found in the [[Help:Special pages|special pages]] section of this manual.''

== Page Tabs ==
[[Image:M-en-pagetabs.png|framed|right|Default page tabs at the top of the page]]
The page tabs are displayed at the top of the article to the right of the site logo (if using the default MonoBook skin). These tabs allow you to perform actions or view pages that are related to the current article. The available default actions include: viewing, editing, and discussing the current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have sysop (administrator) privileges on the wiki. On special pages only the namespace tab is displayed.

;Default for all users
: ''[[Help:Namespaces|namespace]]'' (article, help, special page, template, user page etc.)
: ''discussion''
: ''edit'' (may read ''view source'' if anonymous editing is disabled, the page is in the MediaWiki: namespace, or the page is protected)
: ''history''

;Extra tabs for logged-in users:
: ''move''
: ''watch''

;Extra tabs for sysops:
: ''protect''
: ''delete''

Administrators can add or remove tabs by using JavaScript or installing extensions, so the tabs you see may be different depending on which wiki you are using.

== User Links ==
[[Image:M-en-userlinks.png|framed|right|Default user links at the top right of the page]]
The user links are displayed at the top far right of the article (if using the default MonoBook skin). These tabs allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout.

For anonymous users the user links is replaced by a link to the wiki login page or, if enabled, a link to your IP address and your IP address's talk page.

* ''&lt;username&gt;'' 
*: This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking ''watch'' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42872</id>
      <timestamp>2010-04-09T21:28:35Z</timestamp>
      <contributor>
        <ip>188.38.133.118</ip>
      </contributor>
      <comment>brs</comment>
      <text xml:space="preserve">When viewing any page on a MediaWiki wiki, you'll find three main navigation elements:
# The [[#Sidebar|sidebar]] on the left gives you access to important pages in the wiki such as Recent changes or Upload file.
# At the top of the page are links (often called [[#Page Tabs|tabs]]) which relate to the page currently displayed: its associated discussion page, the version history, and&amp;mdash;most notably&amp;mdash;the edit link.
# In the top right corner you'll find [[#User Links|user links]]; as an anonymous user, you'll see a link to create an account or log in (they are the same page). As a logged-in user you have a collection of personal links, including ones to your user page and [[Help:Preferences|preferences]].
 
== Sidebar ==
[[Image:M-en-sidebar.png|framed|right|Example sidebar, shown on the left of the page]]
The sidebar is displayed on the left edge of the page below the site logo (if using the default MonoBook skin). This sidebar gives you access to important pages in the wiki such as Recent changes or Upload file.

=== Navigation ===
Clicking on the logo brings you back to the main page of the wiki. The links in the navigation section just below will take you to important pages of the wiki. These links can be configured by site administrators.

=== Toolbox ===
The toolbox contains a selection of links which change depending on what type of page you are viewing.

On all pages (except special pages):
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information. The ''What links here'' information can also be useful when you are refactoring wiki pages and need to check whether links to this page are still relevant after changes in the current page.
* The ''Related changes'' tool lists all recent changes in the pages linked to from the current page. Recent changes to all relevant template pages are included in the resulting page list. The &quot;Hide minor edits&quot; option that can be set in the user [[Help:Preferences|preferences]] applies, among other things, to ''Related Changes''.

On all pages (including special pages):[http://www.sohbetturk.net sohbet]
* ''Upload file'' displays a special page that allows logged-in users to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages. Uploading files, viewing files on the server, including them in wiki pages and managing the uploaded files is discussed in the [[Help:Managing files|managing files]] section of this manual. This is not displayed if file uploading has been disabled or not enabled in the first place.
* The ''Special pages'' tool lists the MediaWiki special pages. In MediaWiki terminology, a special page is one that presents information about the Wiki and/or allows access to administration activities for the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.

:''The function and use of the default special pages can be found in the [[Help:Special pages|special pages]] section of this manual.''

== Page Tabs ==
[[Image:M-en-pagetabs.png|framed|right|Default page tabs at the top of the page]]
The page tabs are displayed at the top [http://www.kelebekfm.net kelebek] of the article to the right of the site logo (if using the default MonoBook skin). These tabs allow you to perform actions or view pages that are related to the current article. The available default actions include: viewing, editing, and discussing the current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have sysop (administrator) privileges on the wiki. On special pages only the namespace tab is displayed.

;Default for all users[http://www.ikisohbet.net sohbet]
: ''[[Help:Namespaces|namespace]]'' (article, help, special page, template, user page etc.)
: ''discussion''
: ''edit'' (may read ''view source'' if anonymous editing is disabled, the page is in the MediaWiki: namespace, or the page is protected)
: ''history''

;Extra tabs for logged-in users:
: ''move''
: ''watch''[http://www.ticket724.com uçak bileti]

;Extra tabs for sysops:
: ''protect''
: ''delete''

Administrators can add or remove tabs by using JavaScript or installing extensions, so the tabs you see may be different depending on which wiki you are using.

== User Links ==
[[Image:M-en-userlinks.png|framed|right|Default user links at the top right of the page]]
The user links are displayed at the top far right of the article (if using the default[http://www.emircindir.com mirc indir] MonoBook skin). These tabs allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout.

For anonymous users the user links is replaced by a link to the wiki login page or, if enabled, a link to your IP address and your IP address's talk page.

* ''&lt;username&gt;'' 
*: This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.[http://www.bilisimkenti.com seo]
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking ''watch'' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.[http://www.adilsohbet.com sohbet]
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42873</id>
      <timestamp>2010-04-09T21:37:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/188.38.133.118|188.38.133.118]] ([[User talk:188.38.133.118|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">When viewing any page on a MediaWiki wiki, you'll find three main navigation elements:
# The [[#Sidebar|sidebar]] on the left gives you access to important pages in the wiki such as Recent changes or Upload file.
# At the top of the page are links (often called [[#Page Tabs|tabs]]) which relate to the page currently displayed: its associated discussion page, the version history, and&amp;mdash;most notably&amp;mdash;the edit link.
# In the top right corner you'll find [[#User Links|user links]]; as an anonymous user, you'll see a link to create an account or log in (they are the same page). As a logged-in user you have a collection of personal links, including ones to your user page and [[Help:Preferences|preferences]].
 
== Sidebar ==
[[Image:M-en-sidebar.png|framed|right|Example sidebar, shown on the left of the page]]
The sidebar is displayed on the left edge of the page below the site logo (if using the default MonoBook skin). This sidebar gives you access to important pages in the wiki such as Recent changes or Upload file.

=== Navigation ===
Clicking on the logo brings you back to the main page of the wiki. The links in the navigation section just below will take you to important pages of the wiki. These links can be configured by site administrators.

=== Toolbox ===
The toolbox contains a selection of links which change depending on what type of page you are viewing.

On all pages (except special pages):
* ''What links here'' takes you to a special page that lists the pages on this wiki which contain a link to the current page. This is helpful when you are looking for pages of related information. The ''What links here'' information can also be useful when you are refactoring wiki pages and need to check whether links to this page are still relevant after changes in the current page.
* The ''Related changes'' tool lists all recent changes in the pages linked to from the current page. Recent changes to all relevant template pages are included in the resulting page list. The &quot;Hide minor edits&quot; option that can be set in the user [[Help:Preferences|preferences]] applies, among other things, to ''Related Changes''.

On all pages (including special pages):
* ''Upload file'' displays a special page that allows logged-in users to upload images and other files to the wiki. Uploaded files can be linked from or embedded in wiki pages. Uploading files, viewing files on the server, including them in wiki pages and managing the uploaded files is discussed in the [[Help:Managing files|managing files]] section of this manual. This is not displayed if file uploading has been disabled or not enabled in the first place.
* The ''Special pages'' tool lists the MediaWiki special pages. In MediaWiki terminology, a special page is one that presents information about the Wiki and/or allows access to administration activities for the wiki. For example, a list of users registered with the wiki, statistics about the wiki such as the number of pages and number of page edits, system logs, a list of orphaned pages, and so on. These special pages are commonly generated when the special page is loaded rather than being stored in the wiki database.

:''The function and use of the default special pages can be found in the [[Help:Special pages|special pages]] section of this manual.''

== Page Tabs ==
[[Image:M-en-pagetabs.png|framed|right|Default page tabs at the top of the page]]
The page tabs are displayed at the top of the article to the right of the site logo (if using the default MonoBook skin). These tabs allow you to perform actions or view pages that are related to the current article. The available default actions include: viewing, editing, and discussing the current article. The specific tabs displayed on your pages depend on whether or not you are logged into the wiki and whether you have sysop (administrator) privileges on the wiki. On special pages only the namespace tab is displayed.

;Default for all users
: ''[[Help:Namespaces|namespace]]'' (article, help, special page, template, user page etc.)
: ''discussion''
: ''edit'' (may read ''view source'' if anonymous editing is disabled, the page is in the MediaWiki: namespace, or the page is protected)
: ''history''

;Extra tabs for logged-in users:
: ''move''
: ''watch''

;Extra tabs for sysops:
: ''protect''
: ''delete''

Administrators can add or remove tabs by using JavaScript or installing extensions, so the tabs you see may be different depending on which wiki you are using.

== User Links ==
[[Image:M-en-userlinks.png|framed|right|Default user links at the top right of the page]]
The user links are displayed at the top far right of the article (if using the default MonoBook skin). These tabs allow the logged-in user to view and edit their user page and wiki preferences. Additionally, the user links allow the user to quickly access their contributions to the wiki and logout.

For anonymous users the user links is replaced by a link to the wiki login page or, if enabled, a link to your IP address and your IP address's talk page.

* ''&lt;username&gt;'' 
*: This links to your user page which is where you can put information about yourself, store bits of information you want to remember or whatever else you fancy.
* ''my talk''
*: This links to your discussion page, where people can leave messages for you.
* ''preferences''
*: Allows you to change your personal site preferences.
* ''my watchlist''
*: A list of all pages that you are watching.  Pages can be added to this list by clicking ''watch'' at the top of the page.
* ''my contributions''
*: A list of all contributions you have made to the wiki.
* ''log out''
*: Click this link to log out of the wiki.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Patrolled edits</title>
    <id>62</id>
    <revision>
      <id>144</id>
      <timestamp>2008-01-17T20:03:10Z</timestamp>
      <contributor>
        <ip>81.159.187.97</ip>
      </contributor>
      <text xml:space="preserve">{{PD Help Page}}
&lt;div style=&quot;float:right;&quot;&gt;__TOC__&lt;/div&gt;
In MediaWiki 1.4 and above, a feature exists allowing specific users to mark items in recent changes as having been &quot;patrolled&quot; or &quot;approved&quot;. This is useful when reviewing recent changes for undesirable edits, link spam and vandalism.

== Marking edits as patrolled ==

; To mark an edit as patrolled

#Access [[Special:Recentchanges]]
#:Changes which are not patrolled will be indicated with a red exclamation mark
#Click the ([[m:Help:Diff|diff]]) link next to an edit
#To mark the edit as patrolled, click the ''mark as patrolled'' link

== Customization ==

=== Enabling/disabling ===

Patrolled edits are enabled by default in MediaWiki 1.4. In MediaWiki 1.5 and later, set '''$wgUseRCPatrol''' in [[Manual:Configuration settings|LocalSettings.php]].

&lt;code&gt;$wgUseRCPatrol = true;&lt;/code&gt;

=== Permissions ===

==== 1.4 ====

In MediaWiki 1.4, patrolled edits are enabled for all users. To restrict this to sysops, set '''$wgOnlySysopsCanPatrol''' in [[Manual:Configuration settings|LocalSettings.php]].

&lt;code&gt;$wgOnlySysopsCanPatrol = true;&lt;/code&gt;

==== 1.5+ ====

In MediaWiki 1.5 and later, patrolled edits are enabled for sysops. Use the '''[[Manual:$wgGroupPermissions|$wgGroupPermissions]]''' configuration variable for this.

For instance, to create a ''patrollers'' group:

&lt;code&gt;$wgGroupPermissions['patrollers']['patrol'] = true;&lt;/code&gt;

=== Automatic patrolling ===
In MediaWiki 1.6 through 1.8, there is a [[Help:preferences|user preference]] available to users who are able to mark edits as patrolled. When set, this causes their edits to be patrolled automatically.

This option is not available if patrolled edits are switched off.

In MediaWiki 1.9 this user preference has been removed and replaced by a new &quot;autopatrol&quot; right, assigned only to sysops by default. Also, users cannot mark their own edits as patrolled.

=== Marker ===

The formatting of the unpatrolled edit marker can be altered using CSS.

==External links==
{{meta|Help:Patrolled edit}}

{{Languages|Help:Patrolled edits}}
[[Category:Help|Patrolled edits]]</text>
    </revision>
    <revision>
      <id>145</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
&lt;div style=&quot;float:right;&quot;&gt;__TOC__&lt;/div&gt;
In MediaWiki 1.4 and above, a feature exists allowing specific users to mark items in recent changes as having been &quot;patrolled&quot; or &quot;approved&quot;. This is useful when reviewing recent changes for undesirable edits, link spam and vandalism.

== Marking edits as patrolled ==

; To mark an edit as patrolled

#Access [[Special:Recentchanges]]
#:Changes which are not patrolled will be indicated with a red exclamation mark
#Click the ([[m:Help:Diff|diff]]) link next to an edit
#To mark the edit as patrolled, click the ''mark as patrolled'' link

== Customization ==

=== Enabling/disabling ===

Patrolled edits are enabled by default in MediaWiki 1.4. In MediaWiki 1.5 and later, set '''$wgUseRCPatrol''' in [[Manual:Configuration settings|LocalSettings.php]].

&lt;code&gt;$wgUseRCPatrol = true;&lt;/code&gt;

=== Permissions ===

==== 1.4 ====

In MediaWiki 1.4, patrolled edits are enabled for all users. To restrict this to sysops, set '''$wgOnlySysopsCanPatrol''' in [[Manual:Configuration settings|LocalSettings.php]].

&lt;code&gt;$wgOnlySysopsCanPatrol = true;&lt;/code&gt;

==== 1.5+ ====

In MediaWiki 1.5 and later, patrolled edits are enabled for sysops. Use the '''[[Manual:$wgGroupPermissions|$wgGroupPermissions]]''' configuration variable for this.

For instance, to create a ''patrollers'' group:

&lt;code&gt;$wgGroupPermissions['patrollers']['patrol'] = true;&lt;/code&gt;

=== Automatic patrolling ===
In MediaWiki 1.6 through 1.8, there is a [[Help:preferences|user preference]] available to users who are able to mark edits as patrolled. When set, this causes their edits to be patrolled automatically.

This option is not available if patrolled edits are switched off.

In MediaWiki 1.9 this user preference has been removed and replaced by a new &quot;autopatrol&quot; right, assigned only to sysops by default. Also, users cannot mark their own edits as patrolled.

=== Marker ===

The formatting of the unpatrolled edit marker can be altered using CSS.

==External links==
{{meta|Help:Patrolled edit}}

{{Languages|Help:Patrolled edits}}
[[Category:Help|Patrolled edits]]</text>
    </revision>
    <revision>
      <id>220</id>
      <timestamp>2008-02-18T20:12:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">&lt;div style=&quot;float:right;&quot;&gt;__TOC__&lt;/div&gt;
In MediaWiki 1.4 and above, a feature exists allowing specific users to mark items in recent changes as having been &quot;patrolled&quot; or &quot;approved&quot;. This is useful when reviewing recent changes for undesirable edits, link spam and vandalism.

== Marking edits as patrolled ==

; To mark an edit as patrolled

#Access [[Special:Recentchanges]]
#:Changes which are not patrolled will be indicated with a red exclamation mark
#Click the ({{mediawiki|Help:Diff|diff}}) link next to an edit
#To mark the edit as patrolled, click the ''mark as patrolled'' link

== Customization ==

=== Enabling/disabling ===

Patrolled edits are enabled by default in MediaWiki 1.4. In MediaWiki 1.5 and later, set '''$wgUseRCPatrol''' in {{mediawiki|Manual:Configuration settings|LocalSettings.php}}.

&lt;code&gt;$wgUseRCPatrol = true;&lt;/code&gt;

=== Permissions ===

==== 1.4 ====

In MediaWiki 1.4, patrolled edits are enabled for all users. To restrict this to sysops, set '''$wgOnlySysopsCanPatrol''' in {{mediawiki|Manual:Configuration settings|LocalSettings.php}}.

&lt;code&gt;$wgOnlySysopsCanPatrol = true;&lt;/code&gt;

==== 1.5+ ====

In MediaWiki 1.5 and later, patrolled edits are enabled for sysops. Use the '''{{mediawiki|Manual:$wgGroupPermissions|$wgGroupPermissions}}''' configuration variable for this.

For instance, to create a ''patrollers'' group:

&lt;code&gt;$wgGroupPermissions['patrollers']['patrol'] = true;&lt;/code&gt;

=== Automatic patrolling ===
In MediaWiki 1.6 through 1.8, there is a [[Help:preferences|user preference]] available to users who are able to mark edits as patrolled. When set, this causes their edits to be patrolled automatically.

This option is not available if patrolled edits are switched off.

In MediaWiki 1.9 this user preference has been removed and replaced by a new &quot;autopatrol&quot; right, assigned only to sysops by default. Also, users cannot mark their own edits as patrolled.

=== Marker ===

The formatting of the unpatrolled edit marker can be altered using CSS.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>300</id>
      <timestamp>2008-02-20T14:25:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">&lt;div style=&quot;float:right;&quot;&gt;__TOC__&lt;/div&gt;
In MediaWiki 1.4 and above, a feature exists allowing specific users to mark items in recent changes as having been &quot;patrolled&quot; or &quot;approved&quot;. This is useful when reviewing recent changes for [[Project:Vandalism|undesirable edits, link spam and vandalism]].

== Marking edits as patrolled ==

; To mark an edit as patrolled

#Access [[Special:Recentchanges]]
#:Changes which are not patrolled will be indicated with a red exclamation mark
#Click the ({{mediawiki|Help:Diff|diff}}) link next to an edit
#To mark the edit as patrolled, click the ''mark as patrolled'' link

== Customization ==

=== Enabling/disabling ===

Patrolled edits are enabled by default in MediaWiki 1.4. In MediaWiki 1.5 and later, set '''$wgUseRCPatrol''' in {{mediawiki|Manual:Configuration settings|LocalSettings.php}}.

&lt;code&gt;$wgUseRCPatrol = true;&lt;/code&gt;

=== Permissions ===

==== 1.4 ====

In MediaWiki 1.4, patrolled edits are enabled for all users. To restrict this to sysops, set '''$wgOnlySysopsCanPatrol''' in {{mediawiki|Manual:Configuration settings|LocalSettings.php}}.

&lt;code&gt;$wgOnlySysopsCanPatrol = true;&lt;/code&gt;

==== 1.5+ ====

In MediaWiki 1.5 and later, patrolled edits are enabled for sysops. Use the '''{{mediawiki|Manual:$wgGroupPermissions|$wgGroupPermissions}}''' configuration variable for this.

For instance, to create a ''patrollers'' group:

&lt;code&gt;$wgGroupPermissions['patrollers']['patrol'] = true;&lt;/code&gt;

=== Automatic patrolling ===
In MediaWiki 1.6 through 1.8, there is a [[Help:preferences|user preference]] available to users who are able to mark edits as patrolled. When set, this causes their edits to be patrolled automatically.

This option is not available if patrolled edits are switched off.

In MediaWiki 1.9 this user preference has been removed and replaced by a new &quot;autopatrol&quot; right, assigned only to sysops by default. Also, users cannot mark their own edits as patrolled.

=== Marker ===

The formatting of the unpatrolled edit marker can be altered using CSS.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Preferences</title>
    <id>55</id>
    <revision>
      <id>130</id>
      <timestamp>2007-11-16T22:59:57Z</timestamp>
      <contributor>
        <ip>IAlex</ip>
      </contributor>
      <minor/>
      <comment>- {{stub}}</comment>
      <text xml:space="preserve">{{PD Help Page}}

Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in allows you to change your preferences. You will be presented with the User profile section, as well as a bar of tabs across the top for changing other types of settings.

==User profile==
===User profile===
* ''Username'': Your user name. Only bureaucrats can change your username, and the wiki must also have the [[mw:Extension:Renameuser|Renameuser extension]] installed.
* ''User ID'': A number assigned to your account when you created it (for example, if your number is 42 you are the 42nd user to sign up at this particular wiki). This number is used for internal purposes.
* ''Number of edits'': How many edits you have made. Not all wikis will have this.
* ''Real name'': If provided, this will be used for attribution (rather than using your username). Providing your real name is entirely optional. Some wikis do not have this option.
* ''E-mail'': Your email address, if you have supplied one. You can also change or remove your address here.
* ''Nickname'': When you sign your name (using &lt;code&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/code&gt;), what you enter here will be used at the start instead of a simple link to your user page. By default, anything you enter here will be wrapped with &lt;code&gt;&lt;nowiki&gt;[[ ]]&lt;/nowiki&gt;&lt;/code&gt;; if you want to use special linking, enable ''Raw signatures (without automatic link)''.
* ''Language'': This controls what language the interface is displayed in.  MediaWiki's default interface includes localisations for all supported languages, but this is not necessarily the case with extensions or custom skins. Page text will '''not''' be translated, nor will templates (unless the templates integrate text localisation).

===Change password===
To change your password, enter your old password in the first box and your new password in the last two. If you want this site to remember your login, check ''Remember my login on this computer''. Note that this function requires you to have cookies enabled in your browser, and if your cookie is cleared or expires you will no longer be remembered.

===E-mail===
If you have supplied an email address, you will need to click the ''verify address'' button in order to use these functions. You will receive an email; simply open it and follow the link to enable the following functions.

* ''E-mail me when a page I'm watching is changed''
* ''E-mail me when my user talk page is changed''
* ''E-mail me also for minor edits of pages''
* ''Enable e-mail from other users''
* ''Send me copies of emails I send to other users''

==Skin==
Here you can choose the skin you want to use (use ''Preview'' if you want to see a skin before you choose it). By default, MediaWiki includes the following skins:
* Chick
* Classic
* Cologne Blue
* MonoBook (default)
* MySkin
* Nostalgia
* Simple
While you can choose whatever skin you like, bear in mind that some wikis will incorporate templates or layout elements that will not display as intended in some of these skins. Generally speaking, sticking with MonoBook (or whatever the wiki's default skin is) will ensure you see pages as intended.

==Math==
Here you can control how mathematical equations described using the &lt;code&gt;&lt;nowiki&gt;&lt;math&gt;&lt;/nowiki&gt;&lt;/code&gt; tag will be displayed. Mathematical formulae uploaded as images or written outside the math tag will not be affected by this setting.
* ''Always render PNG''
* ''HTML if very simple or else PNG''
* ''HTML if possible or else PNG''
* ''Leave it as TeX (for text browsers)''
* ''Recommended for modern browsers''
* ''MathML if possible (experimental)''

==Files==
Here you can determine how images will be displayed. Images displayed by direct pasting of a URL (if the wiki has it enabled) will not be affected by this setting.

* ''Limit images on image description pages to'': This setting lets you choose how big image previews will be on the Image: pages. If you know what your current screen resolution is you may like to set this to one or two sizes smaller than your own screen. If you have a slow connection (such as dial-up) you may want to limit them to 320×240.
* ''Thumbnail size'': Define how big you want thumbnails to appear. This setting will not affect thumbnails with dimensions determined by an editor, nor can it increase images beyond their original dimensions.

==Date and time==
The following is normally rendered depending on preferences:

&lt;pre&gt;
 [[2001-01-05]] (or [[2001]]-[[01-05]]) (with leading zeros)
 [[2001]] [[January 5]] ([[2001]] [[January 05]])
 [[January 5]], [[2001]] ([[January 05]], [[2001]])
 [[5 January]] [[2001]] ([[05 January]] [[2001]])
 [[January 5]] ([[January 05]])
 [[5 January]] ([[05 January]])
&lt;/pre&gt;

With your current preference setting on this project the seven are rendered as follows:

#[[2001-01-05]] ([[2001]]-[[01-05]])
#[[2001]] [[January 5]] ([[2001]] [[January 05]])
#[[January 5]], [[2001]] ([[January 05]], [[2001]])
#[[5 January]] [[2001]] ([[05 January]] [[2001]])
#[[January 5]] ([[January 05]])
#[[5 January]] ([[05 January]])

The user-specified date format does not seem to work on the [[mw:]] wiki for links! It works in Recent Changes etc.

==Editing==
Settings to control editing pages, including the size of the edit box displayed and whether to watch pages that you have edited or created automatically.

==Recent changes==
* ''Days to show in recent changes'': Here you can specify how far back the [[Help:Tracking changes|recent changes]] pages will go. Note that the list will stop prematurely if the number of edits is exceeded (see below)
* ''Number of edits to show in recent changes'': Here you can specify how many edits should be displayed.
* ''Hide minor edits in recent changes'': This enables you to hide edits marked as minor (see [[Help:Editing pages]]). Since some users will rapidly make a lot of tiny tweaks to update templates or fix spelling errors you may find enabling this to be useful. You can also turn this on temporarily from the recent changes page (see [[Help:Tracking changes]]).
* ''Enhanced recent changes (JavaScript)'': Enhanced recent changes condenses edits into a per-page list. As indicated, this requires JavaScript to be enabled. See [[Help:Tracking changes]] for more information on this feature.

==Watchlist==

==Search==
Default settings for searches including how many results to display and how much context to show for each result.

==Misc==
Other settings such as numbering and justification.

== See also ==
* [[Help:Skins]]

==External Links==
{{meta|Help:Preferences}}

{{Languages|Help:Preferences}}

[[Category:Help|Preferences]]</text>
    </revision>
    <revision>
      <id>131</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in allows you to change your preferences. You will be presented with the User profile section, as well as a bar of tabs across the top for changing other types of settings.

==User profile==
===User profile===
* ''Username'': Your user name. Only bureaucrats can change your username, and the wiki must also have the [[mw:Extension:Renameuser|Renameuser extension]] installed.
* ''User ID'': A number assigned to your account when you created it (for example, if your number is 42 you are the 42nd user to sign up at this particular wiki). This number is used for internal purposes.
* ''Number of edits'': How many edits you have made. Not all wikis will have this.
* ''Real name'': If provided, this will be used for attribution (rather than using your username). Providing your real name is entirely optional. Some wikis do not have this option.
* ''E-mail'': Your email address, if you have supplied one. You can also change or remove your address here.
* ''Nickname'': When you sign your name (using &lt;code&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/code&gt;), what you enter here will be used at the start instead of a simple link to your user page. By default, anything you enter here will be wrapped with &lt;code&gt;&lt;nowiki&gt;[[ ]]&lt;/nowiki&gt;&lt;/code&gt;; if you want to use special linking, enable ''Raw signatures (without automatic link)''.
* ''Language'': This controls what language the interface is displayed in.  MediaWiki's default interface includes localisations for all supported languages, but this is not necessarily the case with extensions or custom skins. Page text will '''not''' be translated, nor will templates (unless the templates integrate text localisation).

===Change password===
To change your password, enter your old password in the first box and your new password in the last two. If you want this site to remember your login, check ''Remember my login on this computer''. Note that this function requires you to have cookies enabled in your browser, and if your cookie is cleared or expires you will no longer be remembered.

===E-mail===
If you have supplied an email address, you will need to click the ''verify address'' button in order to use these functions. You will receive an email; simply open it and follow the link to enable the following functions.

* ''E-mail me when a page I'm watching is changed''
* ''E-mail me when my user talk page is changed''
* ''E-mail me also for minor edits of pages''
* ''Enable e-mail from other users''
* ''Send me copies of emails I send to other users''

==Skin==
Here you can choose the skin you want to use (use ''Preview'' if you want to see a skin before you choose it). By default, MediaWiki includes the following skins:
* Chick
* Classic
* Cologne Blue
* MonoBook (default)
* MySkin
* Nostalgia
* Simple
While you can choose whatever skin you like, bear in mind that some wikis will incorporate templates or layout elements that will not display as intended in some of these skins. Generally speaking, sticking with MonoBook (or whatever the wiki's default skin is) will ensure you see pages as intended.

==Math==
Here you can control how mathematical equations described using the &lt;code&gt;&lt;nowiki&gt;&lt;math&gt;&lt;/nowiki&gt;&lt;/code&gt; tag will be displayed. Mathematical formulae uploaded as images or written outside the math tag will not be affected by this setting.
* ''Always render PNG''
* ''HTML if very simple or else PNG''
* ''HTML if possible or else PNG''
* ''Leave it as TeX (for text browsers)''
* ''Recommended for modern browsers''
* ''MathML if possible (experimental)''

==Files==
Here you can determine how images will be displayed. Images displayed by direct pasting of a URL (if the wiki has it enabled) will not be affected by this setting.

* ''Limit images on image description pages to'': This setting lets you choose how big image previews will be on the Image: pages. If you know what your current screen resolution is you may like to set this to one or two sizes smaller than your own screen. If you have a slow connection (such as dial-up) you may want to limit them to 320×240.
* ''Thumbnail size'': Define how big you want thumbnails to appear. This setting will not affect thumbnails with dimensions determined by an editor, nor can it increase images beyond their original dimensions.

==Date and time==
The following is normally rendered depending on preferences:

&lt;pre&gt;
 [[2001-01-05]] (or [[2001]]-[[01-05]]) (with leading zeros)
 [[2001]] [[January 5]] ([[2001]] [[January 05]])
 [[January 5]], [[2001]] ([[January 05]], [[2001]])
 [[5 January]] [[2001]] ([[05 January]] [[2001]])
 [[January 5]] ([[January 05]])
 [[5 January]] ([[05 January]])
&lt;/pre&gt;

With your current preference setting on this project the seven are rendered as follows:

#[[2001-01-05]] ([[2001]]-[[01-05]])
#[[2001]] [[January 5]] ([[2001]] [[January 05]])
#[[January 5]], [[2001]] ([[January 05]], [[2001]])
#[[5 January]] [[2001]] ([[05 January]] [[2001]])
#[[January 5]] ([[January 05]])
#[[5 January]] ([[05 January]])

The user-specified date format does not seem to work on the [[mw:]] wiki for links! It works in Recent Changes etc.

==Editing==
Settings to control editing pages, including the size of the edit box displayed and whether to watch pages that you have edited or created automatically.

==Recent changes==
* ''Days to show in recent changes'': Here you can specify how far back the [[Help:Tracking changes|recent changes]] pages will go. Note that the list will stop prematurely if the number of edits is exceeded (see below)
* ''Number of edits to show in recent changes'': Here you can specify how many edits should be displayed.
* ''Hide minor edits in recent changes'': This enables you to hide edits marked as minor (see [[Help:Editing pages]]). Since some users will rapidly make a lot of tiny tweaks to update templates or fix spelling errors you may find enabling this to be useful. You can also turn this on temporarily from the recent changes page (see [[Help:Tracking changes]]).
* ''Enhanced recent changes (JavaScript)'': Enhanced recent changes condenses edits into a per-page list. As indicated, this requires JavaScript to be enabled. See [[Help:Tracking changes]] for more information on this feature.

==Watchlist==

==Search==
Default settings for searches including how many results to display and how much context to show for each result.

==Misc==
Other settings such as numbering and justification.

== See also ==
* [[Help:Skins]]

==External Links==
{{meta|Help:Preferences}}

{{Languages|Help:Preferences}}

[[Category:Help|Preferences]]</text>
    </revision>
    <revision>
      <id>212</id>
      <timestamp>2008-02-18T19:55:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in allows you to change your preferences. You will be presented with the User profile section, as well as a bar of tabs across the top for changing other types of settings.

==User profile==
===User profile===
* ''Username'': Your user name.
* ''User ID'': A number assigned to your account when you created it (for example, if your number is 42 you are the 42nd user to sign up at this particular wiki). This number is used for internal purposes.
* ''Number of edits'': How many edits you have made. Not all wikis will have this.
* ''Real name'': If provided, this will be used for attribution (rather than using your username). Providing your real name is entirely optional. Some wikis do not have this option.
* ''E-mail'': Your email address, if you have supplied one. You can also change or remove your address here.
* ''Nickname'': When you sign your name (using &lt;code&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/code&gt;), what you enter here will be used at the start instead of a simple link to your user page. By default, anything you enter here will be wrapped with &lt;code&gt;&lt;nowiki&gt;[[ ]]&lt;/nowiki&gt;&lt;/code&gt;; if you want to use special linking, enable ''Raw signatures (without automatic link)''.
* ''Language'': This controls what language the interface is displayed in.  MediaWiki's default interface includes localizations for all supported languages, but this is not necessarily the case with extensions or custom skins. Page text will '''not''' be translated, nor will templates (unless the templates integrate text localization).

===Change password===
To change your password, enter your old password in the first box and your new password in the last two. If you want this site to remember your login, check ''Remember my login on this computer''. Note that this function requires you to have cookies enabled in your browser, and if your cookie is cleared or expires you will no longer be remembered.

===E-mail===
If you have supplied an email address, you will need to click the ''verify address'' button in order to use these functions. You will receive an email; simply open it and follow the link to enable the following functions.

* ''E-mail me when a page I'm watching is changed''
* ''E-mail me when my user talk page is changed''
* ''E-mail me also for minor edits of pages''
* ''Enable e-mail from other users''
* ''Send me copies of emails I send to other users''

==Skin==
Here you can choose the skin you want to use (use ''Preview'' if you want to see a skin before you choose it). By default, MediaWiki includes the following skins:
* Chick
* Classic
* Cologne Blue
* MonoBook (default)
* MySkin
* Nostalgia
* Simple
While you can choose whatever skin you like, bear in mind that some wikis will incorporate templates or layout elements that will not display as intended in some of these skins. Generally speaking, sticking with MonoBook (or whatever the wiki's default skin is) will ensure you see pages as intended.

==Math==
Here you can control how mathematical equations described using the &lt;code&gt;&lt;nowiki&gt;&lt;math&gt;&lt;/nowiki&gt;&lt;/code&gt; tag will be displayed. Mathematical formulae uploaded as images or written outside the math tag will not be affected by this setting.
* ''Always render PNG''
* ''HTML if very simple or else PNG''
* ''HTML if possible or else PNG''
* ''Leave it as TeX (for text browsers)''
* ''Recommended for modern browsers''
* ''MathML if possible (experimental)''

==Files==
Here you can determine how images will be displayed. Images displayed by direct pasting of a URL (if the wiki has it enabled) will not be affected by this setting.

* ''Limit images on image description pages to'': This setting lets you choose how big image previews will be on the Image: pages. If you know what your current screen resolution is you may like to set this to one or two sizes smaller than your own screen. If you have a slow connection (such as dial-up) you may want to limit them to 320×240.
* ''Thumbnail size'': Define how big you want thumbnails to appear. This setting will not affect thumbnails with dimensions determined by an editor, nor can it increase images beyond their original dimensions.

==Date and time==
The following is normally rendered depending on preferences:

&lt;pre&gt;
 [[2001-01-05]] (or [[2001]]-[[01-05]]) (with leading zeros)
 [[2001]] [[January 5]] ([[2001]] [[January 05]])
 [[January 5]], [[2001]] ([[January 05]], [[2001]])
 [[5 January]] [[2001]] ([[05 January]] [[2001]])
 [[January 5]] ([[January 05]])
 [[5 January]] ([[05 January]])
&lt;/pre&gt;

With your current preference setting on this project the seven are rendered as follows:

#[[2001-01-05]] ([[2001]]-[[01-05]])
#[[2001]] [[January 5]] ([[2001]] [[January 05]])
#[[January 5]], [[2001]] ([[January 05]], [[2001]])
#[[5 January]] [[2001]] ([[05 January]] [[2001]])
#[[January 5]] ([[January 05]])
#[[5 January]] ([[05 January]])


==Editing==
Settings to control editing pages, including the size of the edit box displayed and whether to watch pages that you have edited or created automatically.

==Recent changes==
* ''Days to show in recent changes'': Here you can specify how far back the [[Help:Tracking changes|recent changes]] pages will go. Note that the list will stop prematurely if the number of edits is exceeded (see below)
* ''Number of edits to show in recent changes'': Here you can specify how many edits should be displayed.
* ''Hide minor edits in recent changes'': This enables you to hide edits marked as minor (see [[Help:Editing pages]]). Since some users will rapidly make a lot of tiny tweaks to update templates or fix spelling errors you may find enabling this to be useful. You can also turn this on temporarily from the recent changes page (see [[Help:Tracking changes]]).
* ''Enhanced recent changes (JavaScript)'': Enhanced recent changes condenses edits into a per-page list. As indicated, this requires JavaScript to be enabled. See [[Help:Tracking changes]] for more information on this feature.

==Watchlist==

==Search==
Default settings for searches including how many results to display and how much context to show for each result.

==Misc==
Other settings such as numbering and justification.

== See also ==
* [[Help:Skins]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Quick editing guide</title>
    <id>29</id>
    <revision>
      <id>58</id>
      <timestamp>2007-09-07T22:38:34Z</timestamp>
      <contributor>
        <ip>Sir Brizz</ip>
      </contributor>
      <text xml:space="preserve">[[Category:Help Files|{{PAGENAME}}]]
__NOTOC__ __NOEDITSECTION__

{| class=&quot;greylapse&quot; align=&quot;center&quot; width=&quot;750&quot;
|-
! Description ||  You Type || You See
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies everywhere&lt;/small&gt;&lt;/center&gt;
|-
| Italic Text || &lt;tt&gt;&lt;nowiki&gt;''italics''&lt;/nowiki&gt;&lt;/tt&gt; || ''italics''
|-
| Bold Text || &lt;tt&gt;&lt;nowiki&gt;'''bold'''&lt;/nowiki&gt;&lt;/tt&gt; || '''bold'''
|-
| Bold &amp; Italic Text || &lt;tt&gt;&lt;nowiki&gt;'''''bold &amp; italic'''''&lt;/nowiki&gt;&lt;/tt&gt; || '''''bold &amp; italic'''''
|-
| Large Text || &lt;tt&gt;&lt;nowiki&gt;&lt;big&gt;Large Text&lt;/big&gt;&lt;/nowiki&gt;&lt;/tt&gt; || &lt;big&gt;Large Text&lt;/big&gt;
|-
| style=&quot;vertical-align: middle&quot; | Internal Link 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;[[Rrajigar Mines]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|the third level]]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | [[Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|the third level]]
|-
| style=&quot;vertical-align: middle&quot; | External Link || &lt;tt&gt;&lt;nowiki&gt;http://www.google.com/&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/ Google Search Engine]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | http://www.google.com/ &lt;br/&gt; [http://www.google.com/] &lt;br/&gt; [http://www.google.com/ Google Search Engine]
|-
| style=&quot;vertical-align: middle&quot; | No Wiki Markup 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;With &lt;nowiki&gt;''markup''&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | With ''markup'' &lt;br/&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies only at the beginning of a line&lt;/small&gt;&lt;/center&gt;
|-
| style=&quot;vertical-align: middle&quot; | Headings 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;=Level 1=&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;==Level 2==&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;===Level 3===&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;====Level 4====&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;=====Level 5=====&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; |
=Level 1=
==Level 2==
===Level 3===
====Level 4====
=====Level 5=====
|-
| style=&quot;vertical-align: middle&quot; | Bulleted list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;* Number one &lt;br/&gt;* Number two&lt;br/&gt;** Number two point one&lt;br/&gt;* Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
* Number one
* Number two
** Number two point one
* Number three
|-
| style=&quot;vertical-align: middle&quot; | Numbered list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;# Number one &lt;br/&gt;# Number two&lt;br/&gt;## Number two point one&lt;br/&gt;# Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
# Number one
# Number two
## Number two point one
# Number three
|- style=&quot;vertical-align: middle&quot;
| style=&quot;vertical-align: middle&quot; | Image
| style=&quot;vertical-align: middle&quot; | &lt;nowiki&gt;[[Image:Unreal_Intro.jpg|thumb|center|Unreal's Intro Flyby]]&lt;/nowiki&gt; 
| style=&quot;vertical-align: middle&quot; | [[Image:Unreal_Intro.jpg|thumb|center|Unreal's Intro Flyby]]
|}</text>
    </revision>
    <revision>
      <id>59</id>
      <timestamp>2008-02-17T18:39:08Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">[[Category:Help Files|{{PAGENAME}}]]
__NOTOC__ __NOEDITSECTION__

{| class=&quot;greylapse&quot; align=&quot;center&quot; width=&quot;750&quot;
|-
! Description ||  You Type || You See
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies everywhere&lt;/small&gt;&lt;/center&gt;
|-
| Italic Text || &lt;tt&gt;&lt;nowiki&gt;''italics''&lt;/nowiki&gt;&lt;/tt&gt; || ''italics''
|-
| Bold Text || &lt;tt&gt;&lt;nowiki&gt;'''bold'''&lt;/nowiki&gt;&lt;/tt&gt; || '''bold'''
|-
| Bold &amp; Italic Text || &lt;tt&gt;&lt;nowiki&gt;'''''bold &amp; italic'''''&lt;/nowiki&gt;&lt;/tt&gt; || '''''bold &amp; italic'''''
|-
| Large Text || &lt;tt&gt;&lt;nowiki&gt;&lt;big&gt;Large Text&lt;/big&gt;&lt;/nowiki&gt;&lt;/tt&gt; || &lt;big&gt;Large Text&lt;/big&gt;
|-
| style=&quot;vertical-align: middle&quot; | Internal Link 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;[[Rrajigar Mines]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|the third level]]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | [[Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|the third level]]
|-
| style=&quot;vertical-align: middle&quot; | External Link || &lt;tt&gt;&lt;nowiki&gt;http://www.google.com/&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/ Google Search Engine]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | http://www.google.com/ &lt;br/&gt; [http://www.google.com/] &lt;br/&gt; [http://www.google.com/ Google Search Engine]
|-
| style=&quot;vertical-align: middle&quot; | No Wiki Markup 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;With &lt;nowiki&gt;''markup''&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | With ''markup'' &lt;br/&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies only at the beginning of a line&lt;/small&gt;&lt;/center&gt;
|-
| style=&quot;vertical-align: middle&quot; | Headings 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;=Level 1=&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;==Level 2==&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;===Level 3===&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;====Level 4====&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;=====Level 5=====&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; |
=Level 1=
==Level 2==
===Level 3===
====Level 4====
=====Level 5=====
|-
| style=&quot;vertical-align: middle&quot; | Bulleted list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;* Number one &lt;br/&gt;* Number two&lt;br/&gt;** Number two point one&lt;br/&gt;* Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
* Number one
* Number two
** Number two point one
* Number three
|-
| style=&quot;vertical-align: middle&quot; | Numbered list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;# Number one &lt;br/&gt;# Number two&lt;br/&gt;## Number two point one&lt;br/&gt;# Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
# Number one
# Number two
## Number two point one
# Number three
|- style=&quot;vertical-align: middle&quot;
| style=&quot;vertical-align: middle&quot; | Image
| style=&quot;vertical-align: middle&quot; | &lt;nowiki&gt;[[Image:Unreal_Intro.jpg|thumb|center|Unreal's Intro Flyby]]&lt;/nowiki&gt; 
| style=&quot;vertical-align: middle&quot; | [[Image:Unreal_Intro.jpg|thumb|center|Unreal's Intro Flyby]]
|}</text>
    </revision>
    <revision>
      <id>386</id>
      <timestamp>2008-02-24T14:51:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">__NOTOC__ __NOEDITSECTION__

{| class=&quot;greylapse&quot; align=&quot;center&quot; width=&quot;750&quot;
|-
! Description ||  You Type || You See
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies everywhere&lt;/small&gt;&lt;/center&gt;
|-
| Italic Text || &lt;tt&gt;&lt;nowiki&gt;''italics''&lt;/nowiki&gt;&lt;/tt&gt; || ''italics''
|-
| Bold Text || &lt;tt&gt;&lt;nowiki&gt;'''bold'''&lt;/nowiki&gt;&lt;/tt&gt; || '''bold'''
|-
| Bold &amp; Italic Text || &lt;tt&gt;&lt;nowiki&gt;'''''bold &amp; italic'''''&lt;/nowiki&gt;&lt;/tt&gt; || '''''bold &amp; italic'''''
|-
| Large Text || &lt;tt&gt;&lt;nowiki&gt;&lt;big&gt;Large Text&lt;/big&gt;&lt;/nowiki&gt;&lt;/tt&gt; || &lt;big&gt;Large Text&lt;/big&gt;
|-
| style=&quot;vertical-align: middle&quot; | Internal Link 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;[[Rrajigar Mines]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|the third level]]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | [[Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|the third level]]
|-
| style=&quot;vertical-align: middle&quot; | External Link || &lt;tt&gt;&lt;nowiki&gt;http://www.google.com/&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/ Google Search Engine]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | http://www.google.com/ &lt;br/&gt; [http://www.google.com/] &lt;br/&gt; [http://www.google.com/ Google Search Engine]
|-
| style=&quot;vertical-align: middle&quot; | No Wiki Markup 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;With &lt;nowiki&gt;''markup''&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | With ''markup'' &lt;br/&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies only at the beginning of a line&lt;/small&gt;&lt;/center&gt;
|-
| style=&quot;vertical-align: middle&quot; | Headings 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;=Level 1=&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;==Level 2==&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;===Level 3===&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;====Level 4====&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;=====Level 5=====&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; |
=Level 1=
==Level 2==
===Level 3===
====Level 4====
=====Level 5=====
|-
| style=&quot;vertical-align: middle&quot; | Bulleted list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;* Number one &lt;br/&gt;* Number two&lt;br/&gt;** Number two point one&lt;br/&gt;* Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
* Number one
* Number two
** Number two point one
* Number three
|-
| style=&quot;vertical-align: middle&quot; | Numbered list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;# Number one &lt;br/&gt;# Number two&lt;br/&gt;## Number two point one&lt;br/&gt;# Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
# Number one
# Number two
## Number two point one
# Number three
|- style=&quot;vertical-align: middle&quot;
| style=&quot;vertical-align: middle&quot; | Image
| style=&quot;vertical-align: middle&quot; | &lt;nowiki&gt;[[Image:Example.jpg|thumb|center|An example image]]&lt;/nowiki&gt; 
| style=&quot;vertical-align: middle&quot; | [[Image:Example.jpg|thumb|center|An example image]]
|}

== See also ==
* [[Help:Contents]]
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>387</id>
      <timestamp>2008-02-24T14:52:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>[[Help:Quick Editing Guide]] moved to [[Help:Quick editing guide]]</comment>
      <text xml:space="preserve">__NOTOC__ __NOEDITSECTION__

{| class=&quot;greylapse&quot; align=&quot;center&quot; width=&quot;750&quot;
|-
! Description ||  You Type || You See
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies everywhere&lt;/small&gt;&lt;/center&gt;
|-
| Italic Text || &lt;tt&gt;&lt;nowiki&gt;''italics''&lt;/nowiki&gt;&lt;/tt&gt; || ''italics''
|-
| Bold Text || &lt;tt&gt;&lt;nowiki&gt;'''bold'''&lt;/nowiki&gt;&lt;/tt&gt; || '''bold'''
|-
| Bold &amp; Italic Text || &lt;tt&gt;&lt;nowiki&gt;'''''bold &amp; italic'''''&lt;/nowiki&gt;&lt;/tt&gt; || '''''bold &amp; italic'''''
|-
| Large Text || &lt;tt&gt;&lt;nowiki&gt;&lt;big&gt;Large Text&lt;/big&gt;&lt;/nowiki&gt;&lt;/tt&gt; || &lt;big&gt;Large Text&lt;/big&gt;
|-
| style=&quot;vertical-align: middle&quot; | Internal Link 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;[[Rrajigar Mines]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|]]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[[Rrajigar Mines|the third level]]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | [[Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|Rrajigar Mines]]&lt;br/&gt;[[Rrajigar Mines|the third level]]
|-
| style=&quot;vertical-align: middle&quot; | External Link || &lt;tt&gt;&lt;nowiki&gt;http://www.google.com/&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/]&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;[http://www.google.com/ Google Search Engine]&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | http://www.google.com/ &lt;br/&gt; [http://www.google.com/] &lt;br/&gt; [http://www.google.com/ Google Search Engine]
|-
| style=&quot;vertical-align: middle&quot; | No Wiki Markup 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;With &lt;nowiki&gt;''markup''&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; | With ''markup'' &lt;br/&gt;&lt;nowiki&gt;Without ''markup''&lt;/nowiki&gt;
|- 
! colspan=&quot;3&quot; | &lt;center&gt;&lt;small&gt;Applies only at the beginning of a line&lt;/small&gt;&lt;/center&gt;
|-
| style=&quot;vertical-align: middle&quot; | Headings 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;&lt;nowiki&gt;=Level 1=&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;==Level 2==&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;===Level 3===&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;====Level 4====&lt;/nowiki&gt;&lt;br/&gt;&lt;nowiki&gt;=====Level 5=====&lt;/nowiki&gt;&lt;/tt&gt; 
| style=&quot;vertical-align: middle&quot; |
=Level 1=
==Level 2==
===Level 3===
====Level 4====
=====Level 5=====
|-
| style=&quot;vertical-align: middle&quot; | Bulleted list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;* Number one &lt;br/&gt;* Number two&lt;br/&gt;** Number two point one&lt;br/&gt;* Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
* Number one
* Number two
** Number two point one
* Number three
|-
| style=&quot;vertical-align: middle&quot; | Numbered list 
| style=&quot;vertical-align: middle&quot; | &lt;tt&gt;# Number one &lt;br/&gt;# Number two&lt;br/&gt;## Number two point one&lt;br/&gt;# Number three&lt;/tt&gt;
| style=&quot;vertical-align: middle&quot; |
# Number one
# Number two
## Number two point one
# Number three
|- style=&quot;vertical-align: middle&quot;
| style=&quot;vertical-align: middle&quot; | Image
| style=&quot;vertical-align: middle&quot; | &lt;nowiki&gt;[[Image:Example.jpg|thumb|center|An example image]]&lt;/nowiki&gt; 
| style=&quot;vertical-align: middle&quot; | [[Image:Example.jpg|thumb|center|An example image]]
|}

== See also ==
* [[Help:Contents]]
* [[Project:Style guide]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Range blocks</title>
    <id>58</id>
    <revision>
      <id>136</id>
      <timestamp>2007-11-24T22:44:16Z</timestamp>
      <contributor>
        <ip>AGK</ip>
      </contributor>
      <comment>/* Conversion to binary */ improvements</comment>
      <text xml:space="preserve">{{PD Help Page}}
'''Range blocks''' are technical restrictions applied through [[Special:Blockip]] to a group of [http://en.wikipedia.org/wiki/IP_addresses IP addresses] that prevent them from editing, creating new accounts, sending email through the wiki interface, et cetera. Registered accounts editing from these IP addresses will also be blocked, unless you check the box to only block anonymous editors.

Range blocking is enabled on all [http://en.wikipedia.org/wiki/Wikimedia_Foundation Wikimedia] wikis; to enable it on other wikis, add &quot;&lt;code&gt;{{mediawiki|Manual:$wgSysopRangeBans|$wgSysopRangeBans}} = true;&lt;/code&gt;&quot; in &lt;tt&gt;{{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}&lt;/tt&gt;.

To block an IP range from [[Special:Blockip]], enter the first IP address in the range followed by a forward slash and a [http://en.wikipedia.org/wiki/Classless_inter-domain_routing Classless inter-domain routing] (CIDR) suffix. '''You should avoid performing range blocks unless you understand what you are doing, or you may end up blocking tens of thousands of people who are not the problem!'''

==Technical explanation==
CIDR notation is written as the IP address, a slash, and the CIDR affix (for example, the IPv4 &quot;&lt;code&gt;10.2.3.41/24&lt;/code&gt;&quot; or IPv6 &quot;&lt;code&gt;a3:b:c1:d:e:f:1:21/24&lt;/code&gt;&quot;). The CIDR affix is the number of starting digits every IP address in the range have in common when written in binary. 

For example: &quot;&lt;code&gt;10.10.1.32&lt;/code&gt;&quot; is binary &quot;&lt;code&gt;00001010.00001010.00000001.00100000&lt;/code&gt;&quot;, so &lt;code&gt;10.10.1.32/27&lt;/code&gt; will match the first 27 digits (&quot;&lt;code&gt;&lt;u&gt;00001010&lt;/u&gt;.&lt;u&gt;00001010&lt;/u&gt;.&lt;u&gt;00000001&lt;/u&gt;.&lt;u&gt;001&lt;/u&gt;00000&lt;/code&gt;&quot;). The IP addresses &lt;code&gt;10.10.1.32&lt;/code&gt;–&lt;code&gt;10.10.1.63&lt;/code&gt;, when converted to binary, all have the same 27 first digits and will be blocked if &lt;code&gt;10.10.1.32/27&lt;/code&gt; is blocked.

As the CIDR affix increases, the block affects less IP addresses (see [[#Table|table of example ranges]]). CIDR affixes are not the same for IPv4 addresses as they are for IPv6 addresses.

==Calculating the CIDR affix==
You can use the [[#Table|table of sample ranges]] below to guess the range, use a computer script, or manually calculate the range.

===Conversion to binary===
The first step in manually calculating a range is to convert the first and last IP address to binary representation. (This assumes you're not using a computer script, which can probably calculate the range for you anyway.) An IP address is composed of four groups of eight ones and zeros. Each group represents a number from 0 to 255. To convert a number to binary, you can use a [http://www.ccci.com/tools/subcalc/binary.html reference table] or know the value of each binary digit:
{| class=&quot;prettytable&quot; style=&quot;text-align:center;&quot;
|-
| 1
| 1
| 1
| 1
| 1
| 1
| 1
| 1
|-
| 128
| 64
| 32
| 16
| 8
| 4
| 2
| 1
|}

Proceeding from left to right, fill in '1' if the number is at least that value, and subtract that value (if it's not, fill in '0' and don't subtract). For example, to calculate 240:
# 240 is at least 128, so place 1 and subtract 128.
# 112 (240-128) is at least 64, so place 1 and subtract 64.
# 48 (112-64) is at least 32, so place 1 and subtract 48.
# 16 (48-32) is at least 16, so place 1 and subtract 16.
# Since the remaining value is zero, all the remaining places are '0'.
Thus, 240 is 1111 0000 because it can be represented as 128+64+32+16+0+0+0+0.

===Calculate range===
# Place both IP addresses one atop the other, and count how many starting digits are exactly alike. This is the CIDR affix.
# Double-check! Being off by one digit could extend your block by thousands of addresses.

The example below calculates the CIDR range between 69.208.0.0 and 69.208.0.255. Note that this is a simple example; some groups of IP addresses do not so neatly fit CIDR affixes, and need multiple different-sized blocks to block the exact range.
 IP addresses:
   69.208.0.0
   69.208.0.255
 &amp;nbsp;
 Convert to binary:
   0100 0101.1101 0000.0000 0000.0000 0000
   0100 0101.1101 0000.0000 0000.1111 1111
 &amp;nbsp;
 Count identical first numbers:
   '''0100 0101.1101 0000.0000 0000'''.0000 0000
   '''0100 0101.1101 0000.0000 0000'''.1111 1111
   |____________________________|
             24 digits
  &amp;nbsp;
 CIDR range:
   69.208.0.0/24
&lt;/pre&gt;

===&lt;span id=&quot;Table&quot;&gt;Table of sample ranges&lt;/span&gt;===
The table below shows the IP blocks each CIDR suffix affects. Note that MediaWiki only supports blocking CIDR suffixes 16&amp;ndash;32.

{| class=&quot;prettytable&quot;
! CIDR
! Start Range
! End Range
! Total addresses
! Bits selected in IP address
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/0'''
| 0.0.0.0
| 255.255.255.255
| 4,294,967,296
| ********.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/1'''
| 0.0.0.0
| 127.255.255.255
| 2,147,483,648
| 0*******.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/4'''
| 65.0.0.0
| 79.255.255.255
| 268,435,456
| 0100****.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/8'''
| 69.0.0.0
| 69.255.255.255
| 67,108,864
| 01000101.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/11'''
| 69.208.0.0
| 69.238.255.255
| 2,197,152
| 01000101.110*****.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/12'''
| 69.208.0.0
| 69.223.255.255
| 1,048,576
| 01000101.1101****.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/13'''
| 69.208.0.0
| 69.215.255.255
| 524,288
| 01000101.11010***.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/14'''
| 69.208.0.0
| 69.211.255.255
| 262,144
| 01000101.110100**.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/15'''
| 69.208.0.0
| 69.209.255.255
| 131,072
| 01000101.1101000*.********.********
|-
| 69.208.0.0'''/16'''
| 69.208.0.0
| 69.208.255.255
| 65,536
| 01000101.11010000.********.********
|-
| 69.208.0.0'''/17'''
| 69.208.0.0
| 69.208.127.255
| 32,768
| 01000101.11010000.0*******.********
|-
| 69.208.0.0'''/18'''
| 69.208.0.0
| 69.208.63.255
| 16,384
| 01000101.11010000.00******.********
|-
| 69.208.0.0'''/19'''
| 69.208.0.0
| 69.208.31.255
| 8,192
| 01000101.11010000.000*****.********
|-
| 69.208.0.0'''/20'''
| 69.208.0.0
| 69.208.15.255
| 4,096
| 01000101.11010000.0000****.********
|-
| 69.208.0.0'''/21'''
| 69.208.0.0
| 69.208.7.255
| 2,048
| 01000101.11010000.00000***.********
|-
| 69.208.0.0'''/22'''
| 69.208.0.0
| 69.208.3.255
| 1,024
| 01000101.11010000.000000**.********
|-
| 69.208.0.0'''/23'''
| 69.208.0.0
| 69.208.1.255
| 512
| 01000101.11010000.0000000*.********
|-
| 69.208.0.0'''/24'''
| 69.208.0.0
| 69.208.0.255
| 256
| 01000101.11010000.00000000.********
|-
| 69.208.0.0'''/25'''
| 69.208.0.0
| 69.208.0.127
| 128
| 01000101.11010000.00000000.0*******
|-
| 69.208.0.0'''/26'''
| 69.208.0.0
| 69.208.0.63
| 64
| 01000101.11010000.00000000.00******
|-
| 69.208.0.0'''/27'''
| 69.208.0.0
| 69.208.0.31
| 32
| 01000101.11010000.00000000.000*****
|-
| 69.208.0.0'''/28'''
| 69.208.0.0
| 69.208.0.15
| 16
| 01000101.11010000.00000000.0000****
|-
| 69.208.0.0'''/29'''
| 69.208.0.0
| 69.208.0.7
| 8
| 01000101.11010000.00000000.00000***
|-
| 69.208.0.0'''/30'''
| 69.208.0.0
| 69.208.0.3
| 4
| 01000101.11010000.00000000.000000**
|-
| 69.208.0.0'''/31'''
| 69.208.0.0
| 69.208.0.1
| 2
| 01000101.11010000.00000000.0000000*
|-
| 69.208.0.0'''/32'''
| 69.208.0.0
| 69.208.0.0
| 1
| 01000101.11010000.00000000.00000000
|}

==References==
* {{wikipedia|Classless Inter-Domain Routing}}
* [http://www.ccci.com/tools/subcalc/binary.html Converting IP addresses to binary]

==External links==
* [http://apps.csc.fi/laskin2.html Netmask calculator] which helps in making the correct decision for range blocks.
* [http://tools.wikimedia.de/~chm/blockcalc.php Rangeblock-Calculator] gives you the range you should use when blocking.

{{Languages|Help:Range blocks}}

[[Category:Help|Range blocks]]</text>
    </revision>
    <revision>
      <id>137</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
'''Range blocks''' are technical restrictions applied through [[Special:Blockip]] to a group of [http://en.wikipedia.org/wiki/IP_addresses IP addresses] that prevent them from editing, creating new accounts, sending email through the wiki interface, et cetera. Registered accounts editing from these IP addresses will also be blocked, unless you check the box to only block anonymous editors.

Range blocking is enabled on all [http://en.wikipedia.org/wiki/Wikimedia_Foundation Wikimedia] wikis; to enable it on other wikis, add &quot;&lt;code&gt;{{mediawiki|Manual:$wgSysopRangeBans|$wgSysopRangeBans}} = true;&lt;/code&gt;&quot; in &lt;tt&gt;{{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}&lt;/tt&gt;.

To block an IP range from [[Special:Blockip]], enter the first IP address in the range followed by a forward slash and a [http://en.wikipedia.org/wiki/Classless_inter-domain_routing Classless inter-domain routing] (CIDR) suffix. '''You should avoid performing range blocks unless you understand what you are doing, or you may end up blocking tens of thousands of people who are not the problem!'''

==Technical explanation==
CIDR notation is written as the IP address, a slash, and the CIDR affix (for example, the IPv4 &quot;&lt;code&gt;10.2.3.41/24&lt;/code&gt;&quot; or IPv6 &quot;&lt;code&gt;a3:b:c1:d:e:f:1:21/24&lt;/code&gt;&quot;). The CIDR affix is the number of starting digits every IP address in the range have in common when written in binary. 

For example: &quot;&lt;code&gt;10.10.1.32&lt;/code&gt;&quot; is binary &quot;&lt;code&gt;00001010.00001010.00000001.00100000&lt;/code&gt;&quot;, so &lt;code&gt;10.10.1.32/27&lt;/code&gt; will match the first 27 digits (&quot;&lt;code&gt;&lt;u&gt;00001010&lt;/u&gt;.&lt;u&gt;00001010&lt;/u&gt;.&lt;u&gt;00000001&lt;/u&gt;.&lt;u&gt;001&lt;/u&gt;00000&lt;/code&gt;&quot;). The IP addresses &lt;code&gt;10.10.1.32&lt;/code&gt;–&lt;code&gt;10.10.1.63&lt;/code&gt;, when converted to binary, all have the same 27 first digits and will be blocked if &lt;code&gt;10.10.1.32/27&lt;/code&gt; is blocked.

As the CIDR affix increases, the block affects less IP addresses (see [[#Table|table of example ranges]]). CIDR affixes are not the same for IPv4 addresses as they are for IPv6 addresses.

==Calculating the CIDR affix==
You can use the [[#Table|table of sample ranges]] below to guess the range, use a computer script, or manually calculate the range.

===Conversion to binary===
The first step in manually calculating a range is to convert the first and last IP address to binary representation. (This assumes you're not using a computer script, which can probably calculate the range for you anyway.) An IP address is composed of four groups of eight ones and zeros. Each group represents a number from 0 to 255. To convert a number to binary, you can use a [http://www.ccci.com/tools/subcalc/binary.html reference table] or know the value of each binary digit:
{| class=&quot;prettytable&quot; style=&quot;text-align:center;&quot;
|-
| 1
| 1
| 1
| 1
| 1
| 1
| 1
| 1
|-
| 128
| 64
| 32
| 16
| 8
| 4
| 2
| 1
|}

Proceeding from left to right, fill in '1' if the number is at least that value, and subtract that value (if it's not, fill in '0' and don't subtract). For example, to calculate 240:
# 240 is at least 128, so place 1 and subtract 128.
# 112 (240-128) is at least 64, so place 1 and subtract 64.
# 48 (112-64) is at least 32, so place 1 and subtract 48.
# 16 (48-32) is at least 16, so place 1 and subtract 16.
# Since the remaining value is zero, all the remaining places are '0'.
Thus, 240 is 1111 0000 because it can be represented as 128+64+32+16+0+0+0+0.

===Calculate range===
# Place both IP addresses one atop the other, and count how many starting digits are exactly alike. This is the CIDR affix.
# Double-check! Being off by one digit could extend your block by thousands of addresses.

The example below calculates the CIDR range between 69.208.0.0 and 69.208.0.255. Note that this is a simple example; some groups of IP addresses do not so neatly fit CIDR affixes, and need multiple different-sized blocks to block the exact range.
 IP addresses:
   69.208.0.0
   69.208.0.255
 &amp;nbsp;
 Convert to binary:
   0100 0101.1101 0000.0000 0000.0000 0000
   0100 0101.1101 0000.0000 0000.1111 1111
 &amp;nbsp;
 Count identical first numbers:
   '''0100 0101.1101 0000.0000 0000'''.0000 0000
   '''0100 0101.1101 0000.0000 0000'''.1111 1111
   |____________________________|
             24 digits
  &amp;nbsp;
 CIDR range:
   69.208.0.0/24
&lt;/pre&gt;

===&lt;span id=&quot;Table&quot;&gt;Table of sample ranges&lt;/span&gt;===
The table below shows the IP blocks each CIDR suffix affects. Note that MediaWiki only supports blocking CIDR suffixes 16&amp;ndash;32.

{| class=&quot;prettytable&quot;
! CIDR
! Start Range
! End Range
! Total addresses
! Bits selected in IP address
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/0'''
| 0.0.0.0
| 255.255.255.255
| 4,294,967,296
| ********.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/1'''
| 0.0.0.0
| 127.255.255.255
| 2,147,483,648
| 0*******.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/4'''
| 65.0.0.0
| 79.255.255.255
| 268,435,456
| 0100****.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/8'''
| 69.0.0.0
| 69.255.255.255
| 67,108,864
| 01000101.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/11'''
| 69.208.0.0
| 69.238.255.255
| 2,197,152
| 01000101.110*****.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/12'''
| 69.208.0.0
| 69.223.255.255
| 1,048,576
| 01000101.1101****.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/13'''
| 69.208.0.0
| 69.215.255.255
| 524,288
| 01000101.11010***.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/14'''
| 69.208.0.0
| 69.211.255.255
| 262,144
| 01000101.110100**.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/15'''
| 69.208.0.0
| 69.209.255.255
| 131,072
| 01000101.1101000*.********.********
|-
| 69.208.0.0'''/16'''
| 69.208.0.0
| 69.208.255.255
| 65,536
| 01000101.11010000.********.********
|-
| 69.208.0.0'''/17'''
| 69.208.0.0
| 69.208.127.255
| 32,768
| 01000101.11010000.0*******.********
|-
| 69.208.0.0'''/18'''
| 69.208.0.0
| 69.208.63.255
| 16,384
| 01000101.11010000.00******.********
|-
| 69.208.0.0'''/19'''
| 69.208.0.0
| 69.208.31.255
| 8,192
| 01000101.11010000.000*****.********
|-
| 69.208.0.0'''/20'''
| 69.208.0.0
| 69.208.15.255
| 4,096
| 01000101.11010000.0000****.********
|-
| 69.208.0.0'''/21'''
| 69.208.0.0
| 69.208.7.255
| 2,048
| 01000101.11010000.00000***.********
|-
| 69.208.0.0'''/22'''
| 69.208.0.0
| 69.208.3.255
| 1,024
| 01000101.11010000.000000**.********
|-
| 69.208.0.0'''/23'''
| 69.208.0.0
| 69.208.1.255
| 512
| 01000101.11010000.0000000*.********
|-
| 69.208.0.0'''/24'''
| 69.208.0.0
| 69.208.0.255
| 256
| 01000101.11010000.00000000.********
|-
| 69.208.0.0'''/25'''
| 69.208.0.0
| 69.208.0.127
| 128
| 01000101.11010000.00000000.0*******
|-
| 69.208.0.0'''/26'''
| 69.208.0.0
| 69.208.0.63
| 64
| 01000101.11010000.00000000.00******
|-
| 69.208.0.0'''/27'''
| 69.208.0.0
| 69.208.0.31
| 32
| 01000101.11010000.00000000.000*****
|-
| 69.208.0.0'''/28'''
| 69.208.0.0
| 69.208.0.15
| 16
| 01000101.11010000.00000000.0000****
|-
| 69.208.0.0'''/29'''
| 69.208.0.0
| 69.208.0.7
| 8
| 01000101.11010000.00000000.00000***
|-
| 69.208.0.0'''/30'''
| 69.208.0.0
| 69.208.0.3
| 4
| 01000101.11010000.00000000.000000**
|-
| 69.208.0.0'''/31'''
| 69.208.0.0
| 69.208.0.1
| 2
| 01000101.11010000.00000000.0000000*
|-
| 69.208.0.0'''/32'''
| 69.208.0.0
| 69.208.0.0
| 1
| 01000101.11010000.00000000.00000000
|}

==References==
* {{wikipedia|Classless Inter-Domain Routing}}
* [http://www.ccci.com/tools/subcalc/binary.html Converting IP addresses to binary]

==External links==
* [http://apps.csc.fi/laskin2.html Netmask calculator] which helps in making the correct decision for range blocks.
* [http://tools.wikimedia.de/~chm/blockcalc.php Rangeblock-Calculator] gives you the range you should use when blocking.

{{Languages|Help:Range blocks}}

[[Category:Help|Range blocks]]</text>
    </revision>
    <revision>
      <id>215</id>
      <timestamp>2008-02-18T20:01:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Range blocks''' are technical restrictions applied through [[Special:Blockip]] to a group of [[Wikipedia:IP addresses]] that prevent them from editing, creating new accounts, sending email through the wiki interface, et cetera. Registered accounts editing from these IP addresses will also be blocked, unless you check the box to only block anonymous editors.

Range blocking is enabled on all [[Wikipedia:Wikimedia|Wikimedia]] wikis; to enable it on other wikis, add &quot;&lt;code&gt;{{mediawiki|Manual:$wgSysopRangeBans|$wgSysopRangeBans}} = true;&lt;/code&gt;&quot; in &lt;tt&gt;{{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}&lt;/tt&gt;.

To block an IP range from [[Special:Blockip]], enter the first IP address in the range followed by a forward slash and a [[Wikipedia:Classless inter-domain routing]] (CIDR) suffix. '''You should avoid performing range blocks unless you understand what you are doing, or you may end up blocking tens of thousands of people who are not the problem!'''

==Technical explanation==
CIDR notation is written as the IP address, a slash, and the CIDR affix (for example, the IPv4 &quot;&lt;code&gt;10.2.3.41/24&lt;/code&gt;&quot; or IPv6 &quot;&lt;code&gt;a3:b:c1:d:e:f:1:21/24&lt;/code&gt;&quot;). The CIDR affix is the number of starting digits every IP address in the range have in common when written in binary. 

For example: &quot;&lt;code&gt;10.10.1.32&lt;/code&gt;&quot; is binary &quot;&lt;code&gt;00001010.00001010.00000001.00100000&lt;/code&gt;&quot;, so &lt;code&gt;10.10.1.32/27&lt;/code&gt; will match the first 27 digits (&quot;&lt;code&gt;&lt;u&gt;00001010&lt;/u&gt;.&lt;u&gt;00001010&lt;/u&gt;.&lt;u&gt;00000001&lt;/u&gt;.&lt;u&gt;001&lt;/u&gt;00000&lt;/code&gt;&quot;). The IP addresses &lt;code&gt;10.10.1.32&lt;/code&gt;–&lt;code&gt;10.10.1.63&lt;/code&gt;, when converted to binary, all have the same 27 first digits and will be blocked if &lt;code&gt;10.10.1.32/27&lt;/code&gt; is blocked.

As the CIDR affix increases, the block affects less IP addresses (see [[#Table|table of example ranges]]). CIDR affixes are not the same for IPv4 addresses as they are for IPv6 addresses.

==Calculating the CIDR affix==
You can use the [[#Table|table of sample ranges]] below to guess the range, use a computer script, or manually calculate the range.

===Conversion to binary===
The first step in manually calculating a range is to convert the first and last IP address to binary representation. (This assumes you're not using a computer script, which can probably calculate the range for you anyway.) An IP address is composed of four groups of eight ones and zeros. Each group represents a number from 0 to 255. To convert a number to binary, you can use a [http://www.ccci.com/tools/subcalc/binary.html reference table] or know the value of each binary digit:
{| class=&quot;prettytable&quot; style=&quot;text-align:center;&quot;
|-
| 1
| 1
| 1
| 1
| 1
| 1
| 1
| 1
|-
| 128
| 64
| 32
| 16
| 8
| 4
| 2
| 1
|}

Proceeding from left to right, fill in '1' if the number is at least that value, and subtract that value (if it's not, fill in '0' and don't subtract). For example, to calculate 240:
# 240 is at least 128, so place 1 and subtract 128.
# 112 (240-128) is at least 64, so place 1 and subtract 64.
# 48 (112-64) is at least 32, so place 1 and subtract 48.
# 16 (48-32) is at least 16, so place 1 and subtract 16.
# Since the remaining value is zero, all the remaining places are '0'.
Thus, 240 is 1111 0000 because it can be represented as 128+64+32+16+0+0+0+0.

===Calculate range===
# Place both IP addresses one atop the other, and count how many starting digits are exactly alike. This is the CIDR affix.
# Double-check! Being off by one digit could extend your block by thousands of addresses.

The example below calculates the CIDR range between 69.208.0.0 and 69.208.0.255. Note that this is a simple example; some groups of IP addresses do not so neatly fit CIDR affixes, and need multiple different-sized blocks to block the exact range.
 IP addresses:
   69.208.0.0
   69.208.0.255
 &amp;nbsp;
 Convert to binary:
   0100 0101.1101 0000.0000 0000.0000 0000
   0100 0101.1101 0000.0000 0000.1111 1111
 &amp;nbsp;
 Count identical first numbers:
   '''0100 0101.1101 0000.0000 0000'''.0000 0000
   '''0100 0101.1101 0000.0000 0000'''.1111 1111
   |____________________________|
             24 digits
  &amp;nbsp;
 CIDR range:
   69.208.0.0/24
&lt;/pre&gt;

===&lt;span id=&quot;Table&quot;&gt;Table of sample ranges&lt;/span&gt;===
The table below shows the IP blocks each CIDR suffix affects. Note that MediaWiki only supports blocking CIDR suffixes 16&amp;ndash;32.

{| class=&quot;prettytable&quot;
! CIDR
! Start Range
! End Range
! Total addresses
! Bits selected in IP address
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/0'''
| 0.0.0.0
| 255.255.255.255
| 4,294,967,296
| ********.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/1'''
| 0.0.0.0
| 127.255.255.255
| 2,147,483,648
| 0*******.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/4'''
| 65.0.0.0
| 79.255.255.255
| 268,435,456
| 0100****.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/8'''
| 69.0.0.0
| 69.255.255.255
| 67,108,864
| 01000101.********.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/11'''
| 69.208.0.0
| 69.238.255.255
| 2,197,152
| 01000101.110*****.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/12'''
| 69.208.0.0
| 69.223.255.255
| 1,048,576
| 01000101.1101****.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/13'''
| 69.208.0.0
| 69.215.255.255
| 524,288
| 01000101.11010***.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/14'''
| 69.208.0.0
| 69.211.255.255
| 262,144
| 01000101.110100**.********.********
|- style=&quot;color:gray;&quot;
| 69.208.0.0'''/15'''
| 69.208.0.0
| 69.209.255.255
| 131,072
| 01000101.1101000*.********.********
|-
| 69.208.0.0'''/16'''
| 69.208.0.0
| 69.208.255.255
| 65,536
| 01000101.11010000.********.********
|-
| 69.208.0.0'''/17'''
| 69.208.0.0
| 69.208.127.255
| 32,768
| 01000101.11010000.0*******.********
|-
| 69.208.0.0'''/18'''
| 69.208.0.0
| 69.208.63.255
| 16,384
| 01000101.11010000.00******.********
|-
| 69.208.0.0'''/19'''
| 69.208.0.0
| 69.208.31.255
| 8,192
| 01000101.11010000.000*****.********
|-
| 69.208.0.0'''/20'''
| 69.208.0.0
| 69.208.15.255
| 4,096
| 01000101.11010000.0000****.********
|-
| 69.208.0.0'''/21'''
| 69.208.0.0
| 69.208.7.255
| 2,048
| 01000101.11010000.00000***.********
|-
| 69.208.0.0'''/22'''
| 69.208.0.0
| 69.208.3.255
| 1,024
| 01000101.11010000.000000**.********
|-
| 69.208.0.0'''/23'''
| 69.208.0.0
| 69.208.1.255
| 512
| 01000101.11010000.0000000*.********
|-
| 69.208.0.0'''/24'''
| 69.208.0.0
| 69.208.0.255
| 256
| 01000101.11010000.00000000.********
|-
| 69.208.0.0'''/25'''
| 69.208.0.0
| 69.208.0.127
| 128
| 01000101.11010000.00000000.0*******
|-
| 69.208.0.0'''/26'''
| 69.208.0.0
| 69.208.0.63
| 64
| 01000101.11010000.00000000.00******
|-
| 69.208.0.0'''/27'''
| 69.208.0.0
| 69.208.0.31
| 32
| 01000101.11010000.00000000.000*****
|-
| 69.208.0.0'''/28'''
| 69.208.0.0
| 69.208.0.15
| 16
| 01000101.11010000.00000000.0000****
|-
| 69.208.0.0'''/29'''
| 69.208.0.0
| 69.208.0.7
| 8
| 01000101.11010000.00000000.00000***
|-
| 69.208.0.0'''/30'''
| 69.208.0.0
| 69.208.0.3
| 4
| 01000101.11010000.00000000.000000**
|-
| 69.208.0.0'''/31'''
| 69.208.0.0
| 69.208.0.1
| 2
| 01000101.11010000.00000000.0000000*
|-
| 69.208.0.0'''/32'''
| 69.208.0.0
| 69.208.0.0
| 1
| 01000101.11010000.00000000.00000000
|}

==References==
* [[Wikipedia:Classless Inter-Domain Routing]]
* [http://www.ccci.com/tools/subcalc/binary.html Converting IP addresses to binary]

==External links==
* [http://apps.csc.fi/laskin2.html Netmask calculator] which helps in making the correct decision for range blocks.
* [http://tools.wikimedia.de/~chm/blockcalc.php Rangeblock-Calculator] gives you the range you should use when blocking.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Redirects</title>
    <id>53</id>
    <revision>
      <id>126</id>
      <timestamp>2008-02-05T11:52:48Z</timestamp>
      <contributor>
        <ip>Lbt</ip>
      </contributor>
      <minor/>
      <comment>minor typo in title for the PD version.</comment>
      <text xml:space="preserve">{{PD Help Page}}

Redirects are used to forward users from one page name to another. They can be useful if a particular article is referred to by multiple names, or has alternative punctuation, capitalization or spellings.

==Creating a redirect==
To create a redirect, you must start a new page with the name you want to direct from. Do this by typing the desired name into the search box, or straight into the URL (methods described on [[Help:Starting a new page]])

For the text of the new page, enter the following:
 &lt;nowiki&gt;#REDIRECT [[&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;]]&lt;/nowiki&gt;
where ''pagename'' is the name of the page you want to redirect users to.

You can use the 'preview' button, to check that you have entered the correct page name (Generally you will be redirecting to an existing page name, so the link should be blue, not red)

==Viewing a redirect==
After creating a redirect, you can no longer get to that page name. The browser is always redirected! However near the top of the page, a link is provided. Click this to get back to the redirected page name, and &quot;view&quot; the redirect.

By doing this, you can do all the things that any wiki page allows. You can go to the associated discussion page to discuss the redirect. You can view the history of the page before the redirect was put in place. You edit the page if the redirect is wrong, and you can revert to an older version to remove the redirect.

==Deleting a redirect==
There's generally no need to delete redirects. They do not occupy a significant amount of database space, and they do not show up in wiki search results. If a page name is vaguely meaningful there's no harm (and some benefit) in having it as a redirect to the most relevant existing page in your wiki. However...

If you ''do'' need to delete a redirect, e.g. if the page name of the redirect is offensive, or you wish to discourage people from referring to concept by that name, then you simply go to the redirect page, and follow the same procedure for deleting a page. See: [[Help:Deleting a page]]

==Double redirects ==
A double redirect (a page redirecting to a page which is itself a redirect) will not work. The redirecting will not follow through to the end of the chain. Instead people will just be presented with the relevant link (a view of the redirect page). This is a deliberate restriction, partly to prevent infinite loops, and partly to keep things simple. It avoids people building up an unpleasantly complicated tree of redirects!

However this does mean that you should look out for double redirects and eliminate them, by changing them to be 1-step redirects instead. You are most likely to need to do this after a significant [[Help:Moving a page|page move]]. Use the 'what links here' toolbox link to find double redirects to a particular page, or use [[Special:DoubleRedirects]] to find them throughout the whole wiki.

== A redirect to a page in the category namespace ==
To prevent a page that redirects to a category from appearing in the category; precede the word Category with a colon like so : &lt;nowiki&gt;#REDIRECT [[:Category:Glossary]]&lt;/nowiki&gt;

==External links==
{{meta|Help:Redirect}}

{{Languages|Help:Redirects}} 

[[Category:Help|Redirects]]</text>
    </revision>
    <revision>
      <id>127</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

Redirects are used to forward users from one page name to another. They can be useful if a particular article is referred to by multiple names, or has alternative punctuation, capitalization or spellings.

==Creating a redirect==
To create a redirect, you must start a new page with the name you want to direct from. Do this by typing the desired name into the search box, or straight into the URL (methods described on [[Help:Starting a new page]])

For the text of the new page, enter the following:
 &lt;nowiki&gt;#REDIRECT [[&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;]]&lt;/nowiki&gt;
where ''pagename'' is the name of the page you want to redirect users to.

You can use the 'preview' button, to check that you have entered the correct page name (Generally you will be redirecting to an existing page name, so the link should be blue, not red)

==Viewing a redirect==
After creating a redirect, you can no longer get to that page name. The browser is always redirected! However near the top of the page, a link is provided. Click this to get back to the redirected page name, and &quot;view&quot; the redirect.

By doing this, you can do all the things that any wiki page allows. You can go to the associated discussion page to discuss the redirect. You can view the history of the page before the redirect was put in place. You edit the page if the redirect is wrong, and you can revert to an older version to remove the redirect.

==Deleting a redirect==
There's generally no need to delete redirects. They do not occupy a significant amount of database space, and they do not show up in wiki search results. If a page name is vaguely meaningful there's no harm (and some benefit) in having it as a redirect to the most relevant existing page in your wiki. However...

If you ''do'' need to delete a redirect, e.g. if the page name of the redirect is offensive, or you wish to discourage people from referring to concept by that name, then you simply go to the redirect page, and follow the same procedure for deleting a page. See: [[Help:Deleting a page]]

==Double redirects ==
A double redirect (a page redirecting to a page which is itself a redirect) will not work. The redirecting will not follow through to the end of the chain. Instead people will just be presented with the relevant link (a view of the redirect page). This is a deliberate restriction, partly to prevent infinite loops, and partly to keep things simple. It avoids people building up an unpleasantly complicated tree of redirects!

However this does mean that you should look out for double redirects and eliminate them, by changing them to be 1-step redirects instead. You are most likely to need to do this after a significant [[Help:Moving a page|page move]]. Use the 'what links here' toolbox link to find double redirects to a particular page, or use [[Special:DoubleRedirects]] to find them throughout the whole wiki.

== A redirect to a page in the category namespace ==
To prevent a page that redirects to a category from appearing in the category; precede the word Category with a colon like so : &lt;nowiki&gt;#REDIRECT [[:Category:Glossary]]&lt;/nowiki&gt;

==External links==
{{meta|Help:Redirect}}

{{Languages|Help:Redirects}} 

[[Category:Help|Redirects]]</text>
    </revision>
    <revision>
      <id>210</id>
      <timestamp>2008-02-18T19:49:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Redirects are used to forward users from one page name to another. They can be useful if a particular article is referred to by multiple names, or has alternative punctuation, capitalization or spellings.

==Creating a redirect==
To create a redirect, you must start a new page with the name you want to direct from. Do this by typing the desired name into the search box, or straight into the URL (methods described on [[Help:Starting a new page]])

For the text of the new page, enter the following:
 &lt;nowiki&gt;#REDIRECT [[&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;]]&lt;/nowiki&gt;
where ''pagename'' is the name of the page you want to redirect users to.

You can use the 'preview' button, to check that you have entered the correct page name (Generally you will be redirecting to an existing page name, so the link should be blue, not red)

==Viewing a redirect==
After creating a redirect, you can no longer get to that page name. The browser is always redirected! However near the top of the page, a link is provided. Click this to get back to the redirected page name, and &quot;view&quot; the redirect.

By doing this, you can do all the things that any wiki page allows. You can go to the associated discussion page to discuss the redirect. You can view the history of the page before the redirect was put in place. You edit the page if the redirect is wrong, and you can revert to an older version to remove the redirect.

==Deleting a redirect==
There's generally no need to delete redirects. They do not occupy a significant amount of database space, and they do not show up in wiki search results. If a page name is vaguely meaningful there's no harm (and some benefit) in having it as a redirect to the most relevant existing page in your wiki. However...

If you ''do'' need to delete a redirect, e.g. if the page name of the redirect is offensive, or you wish to discourage people from referring to concept by that name, then you simply go to the redirect page, and follow the same procedure for deleting a page. See: [[Help:Deleting a page]]

==Double redirects ==
A double redirect (a page redirecting to a page which is itself a redirect) will not work. The redirecting will not follow through to the end of the chain. Instead people will just be presented with the relevant link (a view of the redirect page). This is a deliberate restriction, partly to prevent infinite loops, and partly to keep things simple. It avoids people building up an unpleasantly complicated tree of redirects!

However this does mean that you should look out for double redirects and eliminate them, by changing them to be 1-step redirects instead. You are most likely to need to do this after a significant [[Help:Moving a page|page move]]. Use the 'what links here' toolbox link to find double redirects to a particular page, or use [[Special:DoubleRedirects]] to find them throughout the whole wiki.

== A redirect to a page in the category namespace ==
To prevent a page that redirects to a category from appearing in the category; precede the word Category with a colon like so : &lt;nowiki&gt;#REDIRECT [[:Category:Glossary]]&lt;/nowiki&gt;

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Searching</title>
    <id>30</id>
    <revision>
      <id>60</id>
      <timestamp>2007-11-25T11:57:06Z</timestamp>
      <contributor>
        <ip>Raffaello9</ip>
      </contributor>
      <comment>rewrite</comment>
      <text xml:space="preserve">You can use the Search bar on the left side of any page to find content.</text>
    </revision>
    <revision>
      <id>61</id>
      <timestamp>2008-02-17T18:39:08Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">You can use the Search bar on the left side of any page to find content.</text>
    </revision>
    <revision>
      <id>94</id>
      <timestamp>2008-01-28T12:20:46Z</timestamp>
      <contributor>
        <ip>Kaganer</ip>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Baudday|Baudday]] ([[User talk:Baudday|Talk]]); changed back to last version by [[User:BrianOregon|BrianOregon]]</comment>
      <text xml:space="preserve">{{PD Help Page}}
The quickest way to find information in MediaWiki is to look it up directly. On the left-hand side of your screen there is a '''Search''' box with two buttons under it labeled &quot;Go&quot; and &quot;Search&quot;. 

&lt;div style=&quot;border:1px solid #ababff; background: #fdfdff; padding: 1em; margin: 1.1em 1em 1em 0em; font-size:105%&quot;&gt;
Put your keyword in the searchbox.
* &lt;font face=&quot;MS Sans Serif,Arial&quot;&gt;'''Go'''&lt;/font&gt; - (or ''Enter'' on keyboard) will take you automatically to the article, if it exists.
* &lt;font face=&quot;MS Sans Serif,Arial&quot;&gt;'''Search'''&lt;/font&gt; - will search the text of all pages on the wiki (with some restrictions, see below).
&lt;/div&gt;

If you clicked 'search', or you clicked 'go' and the page you were looking for did not exist, you will be presented with a list of articles that matched your search criteria (or a message that no matches were found).  


== How it works ==
Here's how the search works:

* Only the article content is searched - the page title is ignored.
* The article content is searched in its raw (wikitext) form - i.e. it searches the text that appears in the edit box when you click 'edit', not the rendered page.  This means that content coming from an included template will not be picked up, but the target of piped links will be.
* Even if you enclose a phrase in quotes, the search looks for each word individually.  e.g. if you enter &quot;world war 2&quot; it will return pages that contain &quot;world&quot; and &quot;war&quot; and &quot;2&quot;.
* The search is not case-sensitive, so &quot;MediaWiki&quot;, &quot;mediawiki&quot; and &quot;MEDIAWIKI&quot; all give the same result.

== Restricting the search ==
If you click the 'Search' button without filling in anything, you will be taken to 'Special:Search' which gives you extra searching options (also available from any search results list)

You may find it useful to restrict a search to pages within a particular [[Help:Namespaces|namespace]] e.g. only search within the 'Talk' pages. Tick the namespaces you require for this search. 

By default only the [[Help:Namespaces|namespaces]] specified in your [[Help:Preferences|preferences]] will be searched.  Logged-in users can change their preferences to specify the namespaces they want to search by default.

==External links==
{{meta|Help:Searching}}
__NOTOC__
{{Languages|Help:Searching}}

[[Category:Help|Searching]]
[[Category:Search]]</text>
    </revision>
    <revision>
      <id>95</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">You can use the Search bar on the left side of any page to find content.</text>
    </revision>
    <revision>
      <id>195</id>
      <timestamp>2008-02-18T19:13:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">You can use the Search bar on the left side of any page to find content.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>199</id>
      <timestamp>2008-02-18T19:26:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">The quickest way to find information in MediaWiki is to look it up directly. On the left-hand side of your screen there is a '''Search''' box with two buttons under it labeled &quot;Go&quot; and &quot;Search&quot;. 

&lt;div style=&quot;border:1px solid #ababff; background: #fdfdff; padding: 1em; margin: 1.1em 1em 1em 0em; font-size:105%&quot;&gt;
Put your keyword in the searchbox.
* &lt;font face=&quot;MS Sans Serif,Arial&quot;&gt;'''Go'''&lt;/font&gt; - (or ''Enter'' on keyboard) will take you automatically to the article, if it exists.
* &lt;font face=&quot;MS Sans Serif,Arial&quot;&gt;'''Search'''&lt;/font&gt; - will search the text of all pages on the wiki (with some restrictions, see below).
&lt;/div&gt;

If you clicked 'search', or you clicked 'go' and the page you were looking for did not exist, you will be presented with a list of articles that matched your search criteria (or a message that no matches were found).  


== How it works ==
Here's how the search works:

* Only the article content is searched - the page title is ignored.
* The article content is searched in its raw (wikitext) form - i.e. it searches the text that appears in the edit box when you click 'edit', not the rendered page.  This means that content coming from an included template will not be picked up, but the target of piped links will be.
* Even if you enclose a phrase in quotes, the search looks for each word individually.  e.g. if you enter &quot;world war 2&quot; it will return pages that contain &quot;world&quot; and &quot;war&quot; and &quot;2&quot;.
* The search is not case-sensitive, so &quot;MediaWiki&quot;, &quot;mediawiki&quot; and &quot;MEDIAWIKI&quot; all give the same result.

== Restricting the search ==
If you click the 'Search' button without filling in anything, you will be taken to 'Special:Search' which gives you extra searching options (also available from any search results list)

You may find it useful to restrict a search to pages within a particular [[Help:Namespaces|namespace]] e.g. only search within the 'Talk' pages. Tick the namespaces you require for this search. 

By default only the [[Help:Namespaces|namespaces]] specified in your [[Help:Preferences|preferences]] will be searched.  Logged-in users can change their preferences to specify the namespaces they want to search by default.

__NOTOC__
[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Skins</title>
    <id>56</id>
    <revision>
      <id>132</id>
      <timestamp>2007-11-14T11:35:17Z</timestamp>
      <contributor>
        <ip>Courant</ip>
      </contributor>
      <minor/>
      <comment>/* External Links */ added |{{PAGENAME}} parameter</comment>
      <text xml:space="preserve">{{PD Help Page}}

Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in then click on the '''Skin''' button to change your skin. You can also preview the skin by clicking the '''(preview)''' links next to each skin.

You can make changes to the current skin's stylesheet file (CSS) by creating a subpage of your userpage, &quot;[[Special:Mypage/monobook.css|User:Yourname/monobook.css]]&quot; for example. This requires your site admin to have enabled this feature -- if it is, you will see advice text at the top of your custom CSS page about clearing your browser's cache.

{{admin tip|tip=To enable this feature, you have to set [[Manual:$wgAllowUserCss|$wgAllowUserCss]] to your [[Manual:LocalSettings.php|LocalSettings.php]].}}

== See also ==
* [[Help:Preferences]]

== External Links ==
{{meta|Skins}}

{{Languages|Help:Skins}}

[[Category:Help|{{PAGENAME}}]]
[[Category:Special Pages|{{PAGENAME}}]]
[[Category:Subpage|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>133</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in then click on the '''Skin''' button to change your skin. You can also preview the skin by clicking the '''(preview)''' links next to each skin.

You can make changes to the current skin's stylesheet file (CSS) by creating a subpage of your userpage, &quot;[[Special:Mypage/monobook.css|User:Yourname/monobook.css]]&quot; for example. This requires your site admin to have enabled this feature -- if it is, you will see advice text at the top of your custom CSS page about clearing your browser's cache.

{{admin tip|tip=To enable this feature, you have to set [[Manual:$wgAllowUserCss|$wgAllowUserCss]] to your [[Manual:LocalSettings.php|LocalSettings.php]].}}

== See also ==
* [[Help:Preferences]]

== External Links ==
{{meta|Skins}}

{{Languages|Help:Skins}}

[[Category:Help|{{PAGENAME}}]]
[[Category:Special Pages|{{PAGENAME}}]]
[[Category:Subpage|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>213</id>
      <timestamp>2008-02-18T19:56:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in then click on the '''Skin''' button to change your skin. You can also preview the skin by clicking the '''(preview)''' links next to each skin.

You can make changes to the current skin's stylesheet file (CSS) by creating a subpage of your userpage, &quot;[[Special:Mypage/monobook.css|User:Yourname/monobook.css]]&quot; for example. This requires your site admin to have enabled this feature -- if it is, you will see advice text at the top of your custom CSS page about clearing your browser's cache.

{{admin tip|tip=To enable this feature, you have to set [[Manual:$wgAllowUserCss|$wgAllowUserCss]] to your [[Manual:LocalSettings.php|LocalSettings.php]].}}

== See also ==
* [[Help:Preferences]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>216</id>
      <timestamp>2008-02-18T20:02:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in then click on the '''Skin''' button to change your skin. You can also preview the skin by clicking the '''(preview)''' links next to each skin.

You can make changes to the current skin's stylesheet file (CSS) by creating a subpage of your userpage, &quot;[[Special:Mypage/monobook.css|User:Yourname/monobook.css]]&quot; for example. This requires your site admin to have enabled this feature -- if it is, you will see advice text at the top of your custom CSS page about clearing your browser's cache.

{{admin tip|tip=To enable this feature, you have to set {{mediawiki|Manual:$wgAllowUserCss|$wgAllowUserCss}} to your {{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}.}}

== See also ==
* [[Help:Preferences]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>697</id>
      <timestamp>2008-03-07T09:35:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed admin tip</comment>
      <text xml:space="preserve">Clicking on the [[special:preferences|my preferences]] link in the upper right while logged in then click on the '''Skin''' button to change your skin. You can also preview the skin by clicking the '''(preview)''' links next to each skin.

You can make changes to the current skin's stylesheet file (CSS) by creating a subpage of your userpage, &quot;[[Special:Mypage/monobook.css|User:''Yourname''/monobook.css]]&quot; for example. This requires your site admin to have enabled this feature -- if it is, you will see advice text at the top of your custom CSS page about clearing your browser's cache.

== See also ==
* [[Help:Preferences]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Special pages</title>
    <id>60</id>
    <revision>
      <id>140</id>
      <timestamp>2007-11-24T23:54:40Z</timestamp>
      <contributor>
        <ip>Anonymous Dissident</ip>
      </contributor>
      <comment>this seems utterly superfificial</comment>
      <text xml:space="preserve">{{PD Help Page}}
'''Special pages''' are pages that are created by the software on demand. They are located in their own [[Help:Namespaces|namespace]] ''Special:'' and are not editable directly as other pages. 

Some special pages depend on the [[Help:Preferences|preferences]] that have been set by a user, e.g. the number of titles which is displayed on a user's [[Help:Watchlist|watchlist]].

==List of special pages==
Clicking the link ''[[Special:Specialpages]]'' will take you to a list of all special pages on a wiki. Such a link is often accessible in the [[toolbox]] on the left hand panel.

==External links==
{{meta|Help:Special page}}

{{Languages|Help:Special pages}}
[[Category:Help|Special pages]]
[[Category:Special Pages| ]]</text>
    </revision>
    <revision>
      <id>141</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
'''Special pages''' are pages that are created by the software on demand. They are located in their own [[Help:Namespaces|namespace]] ''Special:'' and are not editable directly as other pages. 

Some special pages depend on the [[Help:Preferences|preferences]] that have been set by a user, e.g. the number of titles which is displayed on a user's [[Help:Watchlist|watchlist]].

==List of special pages==
Clicking the link ''[[Special:Specialpages]]'' will take you to a list of all special pages on a wiki. Such a link is often accessible in the [[toolbox]] on the left hand panel.

==External links==
{{meta|Help:Special page}}

{{Languages|Help:Special pages}}
[[Category:Help|Special pages]]
[[Category:Special Pages| ]]</text>
    </revision>
    <revision>
      <id>218</id>
      <timestamp>2008-02-18T20:08:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''Special pages''' are pages that are created by the software on demand. They are located in their own [[Help:Namespaces|namespace]] ''Special:'' and are not editable directly as other pages. 

Some special pages depend on the [[Help:Preferences|preferences]] that have been set by a user, e.g. the number of titles which is displayed on a user's [[Help:Watchlist|watchlist]].

==List of special pages==
Clicking the link ''[[Special:Specialpages]]'' will take you to a list of all special pages on a wiki. Such a link is often accessible in the toolbox on the left hand panel.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Starting a new page</title>
    <id>43</id>
    <revision>
      <id>102</id>
      <timestamp>2008-01-23T13:51:13Z</timestamp>
      <contributor>
        <ip>Harry Wood</ip>
      </contributor>
      <comment>Change admin tip to be a new section &quot;Protecting your new page&quot; (Admin tip template is for *server* administration/config tips) + also reword the text</comment>
      <text xml:space="preserve">{{PD Help Page}}
There are several ways to start a new page.

== Using Wikilinks ==
MediaWiki makes it very easy to link wiki pages using a standard syntax (see [[Help:Links|Links]]). If you (or anyone else) creates a link to an article that doesn't exist yet, the link will be coloured red, &lt;span style=&quot;color: #ba0000&quot;&gt;like this&lt;/span&gt;.

Clicking a red link, will take you to the edit page for the new article.  Simply type your text, click save and the new page will be created.

Once the page has been created, the link will change from &lt;span style=&quot;color: #ba0000&quot;&gt;red&lt;/span&gt; to &lt;span style=&quot;color: #002bb8;&quot;&gt;blue&lt;/span&gt; (&lt;span style=&quot;color: #5a3696;&quot;&gt;purple&lt;/span&gt; for pages you've visited) indicating that the article now exists.

Usually this is the best way to create a new page, because it means that right from the start, the page will be linked from at least one other place on the wiki (and typically you will want to mesh it into other related pages later) If you are creating a new page without creating any link to it, you may need to ask yourself: Does this page really fit in with the topics already covered in the wiki? Also, how are you expecting visitors to find this page? Normally there is no reason to create a page without first creating a red link to it.

== Using the URL ==
You can use the wiki's URL for creating a new page. The URL to an article of the wiki is usually something like this:
*&lt;code&gt;&lt;nowiki&gt;http://www.example.net/index.php/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt; &amp;nbsp;&amp;nbsp; or
*&lt;code&gt;&lt;nowiki&gt;http://www.example.net/wiki/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt;

If you replace &lt;code&gt;'''ARTICLE'''&lt;/code&gt; with the name of the page you wish to create, you will be taken to a blank page which indicates that no article of that name exists yet. Clicking the &quot;''edit''&quot; [[Help:Navigation#Page Tabs|page tab]] at the top of the page will take you to the edit page for that article, where you can create the new page by typing your text, and clicking submit.

== From the search page ==
If you search for a page that doesn't exist (using the search box and 'go' button on the left of the page) then you will be provided with a link to create the new page.  (Note that this technique doesn't work if you use the 'search' button).

== Using the Inputbox extension ==
{{Admin tip|tip=You need to download and install the &quot;[[Extension:Inputbox|inputbox extension]]&quot; for this method to work.}}
If the Inputbox extension is available on the wiki you can start a new page by typing in your article's name and clicking the &quot;create article&quot; button, as in the example below.
{| align=&quot;center&quot; style=&quot;border:1px solid black&quot; width=&quot;60%&quot;
|
&lt;inputbox&gt;
type=create
width=45
&lt;/inputbox&gt;
|}

== Create redirects to your new page == 
Don't forget to setup redirects when you create a page. If you think another person may search for the page you've created by using a different name or spelling, please create the proper redirect(s). See [[Help:Redirects]]

== Protecting your new page ==
Normally a new wiki page can edited by other people (that ''is'' one of the main ideas of a wiki!)  However, you could 'protect' the page, if desired, to prevent normal users editing it. This requires sysop permissions.

==External links==
{{meta|Help:Starting a new page}} 

{{Languages|Help:Starting a new page}}

[[Category:Help|Starting a new page]]</text>
    </revision>
    <revision>
      <id>103</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
There are several ways to start a new page.

== Using Wikilinks ==
MediaWiki makes it very easy to link wiki pages using a standard syntax (see [[Help:Links|Links]]). If you (or anyone else) creates a link to an article that doesn't exist yet, the link will be coloured red, &lt;span style=&quot;color: #ba0000&quot;&gt;like this&lt;/span&gt;.

Clicking a red link, will take you to the edit page for the new article.  Simply type your text, click save and the new page will be created.

Once the page has been created, the link will change from &lt;span style=&quot;color: #ba0000&quot;&gt;red&lt;/span&gt; to &lt;span style=&quot;color: #002bb8;&quot;&gt;blue&lt;/span&gt; (&lt;span style=&quot;color: #5a3696;&quot;&gt;purple&lt;/span&gt; for pages you've visited) indicating that the article now exists.

Usually this is the best way to create a new page, because it means that right from the start, the page will be linked from at least one other place on the wiki (and typically you will want to mesh it into other related pages later) If you are creating a new page without creating any link to it, you may need to ask yourself: Does this page really fit in with the topics already covered in the wiki? Also, how are you expecting visitors to find this page? Normally there is no reason to create a page without first creating a red link to it.

== Using the URL ==
You can use the wiki's URL for creating a new page. The URL to an article of the wiki is usually something like this:
*&lt;code&gt;&lt;nowiki&gt;http://www.example.net/index.php/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt; &amp;nbsp;&amp;nbsp; or
*&lt;code&gt;&lt;nowiki&gt;http://www.example.net/wiki/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt;

If you replace &lt;code&gt;'''ARTICLE'''&lt;/code&gt; with the name of the page you wish to create, you will be taken to a blank page which indicates that no article of that name exists yet. Clicking the &quot;''edit''&quot; [[Help:Navigation#Page Tabs|page tab]] at the top of the page will take you to the edit page for that article, where you can create the new page by typing your text, and clicking submit.

== From the search page ==
If you search for a page that doesn't exist (using the search box and 'go' button on the left of the page) then you will be provided with a link to create the new page.  (Note that this technique doesn't work if you use the 'search' button).

== Using the Inputbox extension ==
{{Admin tip|tip=You need to download and install the &quot;[[Extension:Inputbox|inputbox extension]]&quot; for this method to work.}}
If the Inputbox extension is available on the wiki you can start a new page by typing in your article's name and clicking the &quot;create article&quot; button, as in the example below.
{| align=&quot;center&quot; style=&quot;border:1px solid black&quot; width=&quot;60%&quot;
|
&lt;inputbox&gt;
type=create
width=45
&lt;/inputbox&gt;
|}

== Create redirects to your new page == 
Don't forget to setup redirects when you create a page. If you think another person may search for the page you've created by using a different name or spelling, please create the proper redirect(s). See [[Help:Redirects]]

== Protecting your new page ==
Normally a new wiki page can edited by other people (that ''is'' one of the main ideas of a wiki!)  However, you could 'protect' the page, if desired, to prevent normal users editing it. This requires sysop permissions.

==External links==
{{meta|Help:Starting a new page}} 

{{Languages|Help:Starting a new page}}

[[Category:Help|Starting a new page]]</text>
    </revision>
    <revision>
      <id>196</id>
      <timestamp>2008-02-18T19:19:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">There are several ways to start a new page.

== Using Wikilinks ==
MediaWiki makes it very easy to link wiki pages using a standard syntax (see [[Help:Links|Links]]). If you (or anyone else) creates a link to an article that doesn't exist yet, the link will be coloured red, &lt;span style=&quot;color: #ba0000&quot;&gt;like this&lt;/span&gt;.

Clicking a red link, will take you to the edit page for the new article.  Simply type your text, click save and the new page will be created.

Once the page has been created, the link will change from &lt;span style=&quot;color: #ba0000&quot;&gt;red&lt;/span&gt; to &lt;span style=&quot;color: #002bb8;&quot;&gt;blue&lt;/span&gt; (&lt;span style=&quot;color: #5a3696;&quot;&gt;purple&lt;/span&gt; for pages you've visited) indicating that the article now exists.

Usually this is the best way to create a new page, because it means that right from the start, the page will be linked from at least one other place on the wiki (and typically you will want to mesh it into other related pages later) If you are creating a new page without creating any link to it, you may need to ask yourself: Does this page really fit in with the topics already covered in the wiki? Also, how are you expecting visitors to find this page? Normally there is no reason to create a page without first creating a red link to it.

== Using the URL ==
You can use the wiki's URL for creating a new page. The URL to an article of the wiki is usually something like this:
*&lt;code&gt;&lt;nowiki&gt;http://www.example.net/index.php/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt; &amp;nbsp;&amp;nbsp; or
*&lt;code&gt;&lt;nowiki&gt;http://www.example.net/wiki/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt;

If you replace &lt;code&gt;'''ARTICLE'''&lt;/code&gt; with the name of the page you wish to create, you will be taken to a blank page which indicates that no article of that name exists yet. Clicking the &quot;''edit''&quot; [[Help:Navigation#Page Tabs|page tab]] at the top of the page will take you to the edit page for that article, where you can create the new page by typing your text, and clicking submit.

== From the search page ==
If you search for a page that doesn't exist (using the search box and 'go' button on the left of the page) then you will be provided with a link to create the new page.  (Note that this technique doesn't work if you use the 'search' button).

== Create redirects to your new page == 
Don't forget to setup redirects when you create a page. If you think another person may search for the page you've created by using a different name or spelling, please create the proper redirect(s). See [[Help:Redirects]]

== Protecting your new page ==
Normally a new wiki page can edited by other people (that ''is'' one of the main ideas of a wiki!)  However, you could 'protect' the page, if desired, to prevent normal users editing it. This requires sysop permissions.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>242</id>
      <timestamp>2008-02-19T16:09:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Using the URL */</comment>
      <text xml:space="preserve">There are several ways to start a new page.

== Using Wikilinks ==
MediaWiki makes it very easy to link wiki pages using a standard syntax (see [[Help:Links|Links]]). If you (or anyone else) creates a link to an article that doesn't exist yet, the link will be coloured red, &lt;span style=&quot;color: #ba0000&quot;&gt;like this&lt;/span&gt;.

Clicking a red link, will take you to the edit page for the new article.  Simply type your text, click save and the new page will be created.

Once the page has been created, the link will change from &lt;span style=&quot;color: #ba0000&quot;&gt;red&lt;/span&gt; to &lt;span style=&quot;color: #002bb8;&quot;&gt;blue&lt;/span&gt; (&lt;span style=&quot;color: #5a3696;&quot;&gt;purple&lt;/span&gt; for pages you've visited) indicating that the article now exists.

Usually this is the best way to create a new page, because it means that right from the start, the page will be linked from at least one other place on the wiki (and typically you will want to mesh it into other related pages later) If you are creating a new page without creating any link to it, you may need to ask yourself: Does this page really fit in with the topics already covered in the wiki? Also, how are you expecting visitors to find this page? Normally there is no reason to create a page without first creating a red link to it.

== Using the URL ==
You can use the wiki's URL for creating a new page. The URL to an article of the wiki is something like this:
*&lt;code&gt;&lt;nowiki&gt;http://wiki.beyondunreal.com/&lt;/nowiki&gt;'''ARTICLE'''&lt;/code&gt;

If you replace &lt;code&gt;'''ARTICLE'''&lt;/code&gt; with the name of the page you wish to create, you will be taken to a blank page which indicates that no article of that name exists yet. Clicking the &quot;''edit''&quot; [[Help:Navigation#Page Tabs|page tab]] at the top of the page will take you to the edit page for that article, where you can create the new page by typing your text, and clicking submit.

== From the search page ==
If you search for a page that doesn't exist (using the search box and 'go' button on the left of the page) then you will be provided with a link to create the new page.  (Note that this technique doesn't work if you use the 'search' button).

== Create redirects to your new page == 
Don't forget to setup redirects when you create a page. If you think another person may search for the page you've created by using a different name or spelling, please create the proper redirect(s). See [[Help:Redirects]]

== Protecting your new page ==
Normally a new wiki page can edited by other people (that ''is'' one of the main ideas of a wiki!)  However, you could 'protect' the page, if desired, to prevent normal users editing it. This requires sysop permissions.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Subpages</title>
    <id>47</id>
    <revision>
      <id>114</id>
      <timestamp>2008-02-02T18:38:21Z</timestamp>
      <contributor>
        <ip>Svanslyck</ip>
      </contributor>
      <comment>/* On */</comment>
      <text xml:space="preserve">{{PD Help Page}}
MediaWiki's '''subpage''' feature is turned '''off by default.'''

It can be turned on in any given wiki, per [[Help:Namespaces|namespace]], by the system administrator with {{mediawiki|Manual:$wgNamespacesWithSubpages|$wgNamespacesWithSubpages}} in the specific wiki's {{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}. 

===Off===
If the subpage feature is off (this is the default), then slashes (/) within a page name are simply part of the page name and do nothing special.

===On===
If the subpage feature is on (default is off and this is a per namespace setting), then slashes (/) within a page name break the page into parent and subpages, recursively, eg:

:[[Example page]]
:[[Example page/Some sub-page]]
:[[Example page/Some sub-page/Some sub-sub-page]]

Link(s) back to parent(s) of the subpage(s) automatically appear at the top of each subpage. Note that these links do not appear, however, if the parent page has not yet been created.

==See also==
* [[Meta:Help:Link#Subpage feature]]
* [[Help:Variables#Page names]]
* [[Manual:$wgNamespacesWithSubpages]]

[[Category:Help|{{PAGENAME}}]]
[[Category:Subpage|{{PAGENAME}}]]

{{languages|Help:Subpages}}</text>
    </revision>
    <revision>
      <id>115</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
MediaWiki's '''subpage''' feature is turned '''off by default.'''

It can be turned on in any given wiki, per [[Help:Namespaces|namespace]], by the system administrator with {{mediawiki|Manual:$wgNamespacesWithSubpages|$wgNamespacesWithSubpages}} in the specific wiki's {{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}. 

===Off===
If the subpage feature is off (this is the default), then slashes (/) within a page name are simply part of the page name and do nothing special.

===On===
If the subpage feature is on (default is off and this is a per namespace setting), then slashes (/) within a page name break the page into parent and subpages, recursively, eg:

:[[Example page]]
:[[Example page/Some sub-page]]
:[[Example page/Some sub-page/Some sub-sub-page]]

Link(s) back to parent(s) of the subpage(s) automatically appear at the top of each subpage. Note that these links do not appear, however, if the parent page has not yet been created.

==See also==
* [[Meta:Help:Link#Subpage feature]]
* [[Help:Variables#Page names]]
* [[Manual:$wgNamespacesWithSubpages]]

[[Category:Help|{{PAGENAME}}]]
[[Category:Subpage|{{PAGENAME}}]]

{{languages|Help:Subpages}}</text>
    </revision>
    <revision>
      <id>204</id>
      <timestamp>2008-02-18T19:39:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">MediaWiki's '''subpage''' feature is turned '''off by default.'''

It can be turned on in any given wiki, per [[Help:Namespaces|namespace]], by the system administrator with {{mediawiki|Manual:$wgNamespacesWithSubpages|$wgNamespacesWithSubpages}} in the specific wiki's {{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}. 

===Off===
If the subpage feature is off (this is the default), then slashes (/) within a page name are simply part of the page name and do nothing special.

===On===
If the subpage feature is on (default is off and this is a per namespace setting), then slashes (/) within a page name break the page into parent and subpages, recursively, e.g.:

:[[Example page]]
:[[Example page/Some sub-page]]
:[[Example page/Some sub-page/Some sub-sub-page]]

Link(s) back to parent(s) of the subpage(s) automatically appear at the top of each subpage. Note that these links do not appear, however, if the parent page has not yet been created.

==See also==
* [[Help:Variables#Page names]]

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Tables</title>
    <id>49</id>
    <revision>
      <id>118</id>
      <timestamp>2007-12-13T10:30:17Z</timestamp>
      <contributor>
        <ip>Harry Wood</ip>
      </contributor>
      <comment>cellpadding example is not currently working properly on mediawiki.org</comment>
      <text xml:space="preserve">{{PD Help Page}}

Tables may be authored in wiki pages using either HTML table elements directly, or using wikicode formatting to define the table. HTML table elements and their use are well described on various web pages and will not be discussed here. The benefit of wikicode is that the table is constructed of character symbols which tend to make it easier to perceive the table structure in the article editing view compared to HTML table elements.

A good general rule of thumb is to avoid using a table unless you need to. Table markup often complicates page editing.

== Wiki table markup summary ==

{|cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot; width=&quot;600&quot;
|&lt;nowiki&gt;{|&lt;/nowiki&gt; || start '''table'''
|-
|&lt;nowiki&gt;|+&lt;/nowiki&gt; || table '''caption,''' ''optional;'' only one per table and between table start and first row
|-
|&lt;nowiki&gt;|-&lt;/nowiki&gt; || '''table row,''' ''optional on first row'' -- wiki engine assumes the first row
|-
|&lt;nowiki&gt;!&lt;/nowiki&gt;  || '''table header''' cell, ''optional.'' Consecutive table headers may be added on same line separated by double marks (!!) or start on new lines, each with its own single mark (!).
|- 
|&lt;nowiki&gt;|&lt;/nowiki&gt;  || '''table data''' cell, ''required!'' Consecutive table data cells may be added on same line separated by double marks (&lt;nowiki&gt;||&lt;/nowiki&gt;) or start on new lines, each with its own single mark (&lt;nowiki&gt;|&lt;/nowiki&gt;).
|-
|&lt;nowiki&gt;|}&lt;/nowiki&gt; || end '''table'''
|}
*The above marks must '''start on a new line''' except the double || and !! for optionally adding consecutive cells to a line.
*'''XHTML attributes.''' Each mark, except table end, optionally accepts one or more XHTML attributes. Attributes must be on the same line as the mark. Separate attributes from each other with a single space. 
**Cells and caption (&lt;nowiki&gt;| or ||, ! or !!, and |+&lt;/nowiki&gt;) hold content. So separate any attributes from content with a single pipe (|). Cell content may follow on same line or on following lines.
**Table and row marks (&lt;nowiki&gt;{| and |-&lt;/nowiki&gt;) do not directly hold content. Do ''not'' add pipe (|) after their optional attributes. If you erroneously add a pipe after attributes for the table mark or row mark the parser will delete it ''and'' your final attribute if it was touching the erroneous pipe!
*'''Content''' may (a) follow its cell mark on the same line after any optional XHTML attributes or (b) on lines below the cell mark. Content that uses wiki markup that itself needs to start on a new line, such as lists, headers, or nested tables, must of course be on its own new line.

==Simple table==

===Plain===
The following table lacks borders and good spacing but shows the simplest wiki markup table structure
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{|
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{|
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

===Alternative===
For more table-ish looking wiki markup cells can be listed on one line separated by ||. This does not scale well for longer cell content such as paragraphs. It works well for short bits of content however, such as our example table.

Extra spaces within cells in the wiki markup can be added, as I have done in the wiki markup below, to make the wiki markup itself look better but they do not affect the actual table rendering.

HTML attributes can be added to tables on this page but have been left out of the following example for simplicity.
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{|
|  Orange    ||   Apple   ||   more
|-
|   Bread    ||   Pie     ||   more
|-
|   Butter   || Ice cream ||  and more
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{|
|  Orange    ||   Apple   ||   more
|-
|   Bread    ||   Pie     ||   more
|-
|   Butter   || Ice cream ||  and more
|}
&lt;/pre&gt;
|}

===With HTML attributes===
You can add HTML attributes to make your table look better
====border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====align=&quot;center&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| align=&quot;center&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| align=&quot;center&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====Attributes on cells ====
You can put attributes on individual '''cells.''' Numbers for example may look better aligned right
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|-
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|-
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
&lt;/pre&gt;
|}

====Attributes on rows====
You can put attributes on individual '''rows,''' too.
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|- style=&quot;font-style:italic;color:green;&quot;
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|- style=&quot;font-style:italic;color:green;&quot;
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
&lt;/pre&gt;
|}

====cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

''Note: This cellpadding example is not currently working properly on mediawiki.org   It is supposed to look like [http://test.wikipedia.org/wiki/Table_test this]''

===With HTML attributes and CSS styles===
CSS style attributes can be added with or without other HTML attributes
====style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Table with TH headings==

TH (HTML table headings) can be created by using ! instead of |. Headings usually show up bold and centered by default.

===Top headings===
====Each column====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Yummy
!Yummier
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Yummy
!Yummier
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}
====Colspan=&quot;2&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!colspan=&quot;2&quot;|Yummies
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
! colspan=&quot;2&quot;|Yummies
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

===Side headings===
====Default====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Fruit
|Orange
|Apple
|-
!Dish
|Bread
|Pie
|-
!Complement
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Fruit
|Orange
|Apple
|-
!Dish
|Bread
|Pie
|-
!Complement
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====Right justify====
Right justified side headings can be done as follows
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!align=&quot;right&quot; |Fruit
|Orange
|Apple
|-
!align=&quot;right&quot; |Dish
|Bread
|Pie
|-
!align=&quot;right&quot; |Complement
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!align=&quot;right&quot; |Fruit
|Orange
|Apple
|-
!align=&quot;right&quot; |Dish
|Bread
|Pie
|-
!align=&quot;right&quot; |Complement
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Caption==
A '''table caption''' can be added to the top of any table as follows
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+Food complements
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+Food complements
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

'''Attributes''' can be added to the caption as follows

{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+align=&quot;bottom&quot; style=&quot;color:#e76700;&quot;|''Food complements''
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+align=&quot;bottom&quot; style=&quot;color:#e76700;&quot;|''Food complements''
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Table with H1, H2, H3 etc. headings==

HTML H1, H2, H3, H4 etc. headings can be created the standard wiki markup way with ==equal== signs and '''must be on a line all by themselves''' to work.

'''Preview the whole table.''' If you click on an edit tab for a heading ''within'' a table, edit, and preview, the parent table will display erroneously broken because part of it will be missing.

Keep the heading hierarchy consistent with the rest of the page so that the table of contents at page top works correctly.

{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|colspan=&quot;2&quot;|
===Yummiest===
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;3&quot;  cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|colspan=&quot;2&quot;|
===Yummiest===
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Caveat==
===Negative numbers===
Negative value minus sign can break your table (it may display missing some values) if you start a cell on a new line with a negative number or a parameter that evaluates to a negative number (|-6) because that is the wiki markup for table row, not table cell. To avoid this, insert a space before the value (| -6) or use in-line cell markup (||-6).

==External links==
{{meta|Help:Table}}

{{Languages|Help:Tables}}
[[Category:Help|Tables]]
[[Category:Tables]]</text>
    </revision>
    <revision>
      <id>119</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

Tables may be authored in wiki pages using either HTML table elements directly, or using wikicode formatting to define the table. HTML table elements and their use are well described on various web pages and will not be discussed here. The benefit of wikicode is that the table is constructed of character symbols which tend to make it easier to perceive the table structure in the article editing view compared to HTML table elements.

A good general rule of thumb is to avoid using a table unless you need to. Table markup often complicates page editing.

== Wiki table markup summary ==

{|cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot; width=&quot;600&quot;
|&lt;nowiki&gt;{|&lt;/nowiki&gt; || start '''table'''
|-
|&lt;nowiki&gt;|+&lt;/nowiki&gt; || table '''caption,''' ''optional;'' only one per table and between table start and first row
|-
|&lt;nowiki&gt;|-&lt;/nowiki&gt; || '''table row,''' ''optional on first row'' -- wiki engine assumes the first row
|-
|&lt;nowiki&gt;!&lt;/nowiki&gt;  || '''table header''' cell, ''optional.'' Consecutive table headers may be added on same line separated by double marks (!!) or start on new lines, each with its own single mark (!).
|- 
|&lt;nowiki&gt;|&lt;/nowiki&gt;  || '''table data''' cell, ''required!'' Consecutive table data cells may be added on same line separated by double marks (&lt;nowiki&gt;||&lt;/nowiki&gt;) or start on new lines, each with its own single mark (&lt;nowiki&gt;|&lt;/nowiki&gt;).
|-
|&lt;nowiki&gt;|}&lt;/nowiki&gt; || end '''table'''
|}
*The above marks must '''start on a new line''' except the double || and !! for optionally adding consecutive cells to a line.
*'''XHTML attributes.''' Each mark, except table end, optionally accepts one or more XHTML attributes. Attributes must be on the same line as the mark. Separate attributes from each other with a single space. 
**Cells and caption (&lt;nowiki&gt;| or ||, ! or !!, and |+&lt;/nowiki&gt;) hold content. So separate any attributes from content with a single pipe (|). Cell content may follow on same line or on following lines.
**Table and row marks (&lt;nowiki&gt;{| and |-&lt;/nowiki&gt;) do not directly hold content. Do ''not'' add pipe (|) after their optional attributes. If you erroneously add a pipe after attributes for the table mark or row mark the parser will delete it ''and'' your final attribute if it was touching the erroneous pipe!
*'''Content''' may (a) follow its cell mark on the same line after any optional XHTML attributes or (b) on lines below the cell mark. Content that uses wiki markup that itself needs to start on a new line, such as lists, headers, or nested tables, must of course be on its own new line.

==Simple table==

===Plain===
The following table lacks borders and good spacing but shows the simplest wiki markup table structure
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{|
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{|
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

===Alternative===
For more table-ish looking wiki markup cells can be listed on one line separated by ||. This does not scale well for longer cell content such as paragraphs. It works well for short bits of content however, such as our example table.

Extra spaces within cells in the wiki markup can be added, as I have done in the wiki markup below, to make the wiki markup itself look better but they do not affect the actual table rendering.

HTML attributes can be added to tables on this page but have been left out of the following example for simplicity.
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{|
|  Orange    ||   Apple   ||   more
|-
|   Bread    ||   Pie     ||   more
|-
|   Butter   || Ice cream ||  and more
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{|
|  Orange    ||   Apple   ||   more
|-
|   Bread    ||   Pie     ||   more
|-
|   Butter   || Ice cream ||  and more
|}
&lt;/pre&gt;
|}

===With HTML attributes===
You can add HTML attributes to make your table look better
====border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====align=&quot;center&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| align=&quot;center&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| align=&quot;center&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====Attributes on cells ====
You can put attributes on individual '''cells.''' Numbers for example may look better aligned right
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|-
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|-
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
&lt;/pre&gt;
|}

====Attributes on rows====
You can put attributes on individual '''rows,''' too.
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|- style=&quot;font-style:italic;color:green;&quot;
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|- style=&quot;font-style:italic;color:green;&quot;
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
&lt;/pre&gt;
|}

====cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

''Note: This cellpadding example is not currently working properly on mediawiki.org   It is supposed to look like [http://test.wikipedia.org/wiki/Table_test this]''

===With HTML attributes and CSS styles===
CSS style attributes can be added with or without other HTML attributes
====style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Table with TH headings==

TH (HTML table headings) can be created by using ! instead of |. Headings usually show up bold and centered by default.

===Top headings===
====Each column====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Yummy
!Yummier
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Yummy
!Yummier
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}
====Colspan=&quot;2&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!colspan=&quot;2&quot;|Yummies
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
! colspan=&quot;2&quot;|Yummies
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

===Side headings===
====Default====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Fruit
|Orange
|Apple
|-
!Dish
|Bread
|Pie
|-
!Complement
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Fruit
|Orange
|Apple
|-
!Dish
|Bread
|Pie
|-
!Complement
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====Right justify====
Right justified side headings can be done as follows
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!align=&quot;right&quot; |Fruit
|Orange
|Apple
|-
!align=&quot;right&quot; |Dish
|Bread
|Pie
|-
!align=&quot;right&quot; |Complement
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!align=&quot;right&quot; |Fruit
|Orange
|Apple
|-
!align=&quot;right&quot; |Dish
|Bread
|Pie
|-
!align=&quot;right&quot; |Complement
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Caption==
A '''table caption''' can be added to the top of any table as follows
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+Food complements
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+Food complements
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

'''Attributes''' can be added to the caption as follows

{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+align=&quot;bottom&quot; style=&quot;color:#e76700;&quot;|''Food complements''
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+align=&quot;bottom&quot; style=&quot;color:#e76700;&quot;|''Food complements''
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Table with H1, H2, H3 etc. headings==

HTML H1, H2, H3, H4 etc. headings can be created the standard wiki markup way with ==equal== signs and '''must be on a line all by themselves''' to work.

'''Preview the whole table.''' If you click on an edit tab for a heading ''within'' a table, edit, and preview, the parent table will display erroneously broken because part of it will be missing.

Keep the heading hierarchy consistent with the rest of the page so that the table of contents at page top works correctly.

{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|colspan=&quot;2&quot;|
===Yummiest===
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;3&quot;  cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|colspan=&quot;2&quot;|
===Yummiest===
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Caveat==
===Negative numbers===
Negative value minus sign can break your table (it may display missing some values) if you start a cell on a new line with a negative number or a parameter that evaluates to a negative number (|-6) because that is the wiki markup for table row, not table cell. To avoid this, insert a space before the value (| -6) or use in-line cell markup (||-6).

==External links==
{{meta|Help:Table}}

{{Languages|Help:Tables}}
[[Category:Help|Tables]]
[[Category:Tables]]</text>
    </revision>
    <revision>
      <id>206</id>
      <timestamp>2008-02-18T19:44:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Tables may be authored in wiki pages using either HTML table elements directly, or using wikicode formatting to define the table. HTML table elements and their use are well described on various web pages and will not be discussed here. The benefit of wikicode is that the table is constructed of character symbols which tend to make it easier to perceive the table structure in the article editing view compared to HTML table elements.

A good general rule of thumb is to avoid using a table unless you need to. Table markup often complicates page editing.

== Wiki table markup summary ==

{|cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot; width=&quot;600&quot;
|&lt;nowiki&gt;{|&lt;/nowiki&gt; || start '''table'''
|-
|&lt;nowiki&gt;|+&lt;/nowiki&gt; || table '''caption,''' ''optional;'' only one per table and between table start and first row
|-
|&lt;nowiki&gt;|-&lt;/nowiki&gt; || '''table row,''' ''optional on first row'' -- wiki engine assumes the first row
|-
|&lt;nowiki&gt;!&lt;/nowiki&gt;  || '''table header''' cell, ''optional.'' Consecutive table headers may be added on same line separated by double marks (!!) or start on new lines, each with its own single mark (!).
|- 
|&lt;nowiki&gt;|&lt;/nowiki&gt;  || '''table data''' cell, ''required!'' Consecutive table data cells may be added on same line separated by double marks (&lt;nowiki&gt;||&lt;/nowiki&gt;) or start on new lines, each with its own single mark (&lt;nowiki&gt;|&lt;/nowiki&gt;).
|-
|&lt;nowiki&gt;|}&lt;/nowiki&gt; || end '''table'''
|}
*The above marks must '''start on a new line''' except the double || and !! for optionally adding consecutive cells to a line.
*'''XHTML attributes.''' Each mark, except table end, optionally accepts one or more XHTML attributes. Attributes must be on the same line as the mark. Separate attributes from each other with a single space. 
**Cells and caption (&lt;nowiki&gt;| or ||, ! or !!, and |+&lt;/nowiki&gt;) hold content. So separate any attributes from content with a single pipe (|). Cell content may follow on same line or on following lines.
**Table and row marks (&lt;nowiki&gt;{| and |-&lt;/nowiki&gt;) do not directly hold content. Do ''not'' add pipe (|) after their optional attributes. If you erroneously add a pipe after attributes for the table mark or row mark the parser will delete it ''and'' your final attribute if it was touching the erroneous pipe!
*'''Content''' may (a) follow its cell mark on the same line after any optional XHTML attributes or (b) on lines below the cell mark. Content that uses wiki markup that itself needs to start on a new line, such as lists, headers, or nested tables, must of course be on its own new line.

==Simple table==

===Plain===
The following table lacks borders and good spacing but shows the simplest wiki markup table structure
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{|
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{|
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

===Alternative===
For more table-ish looking wiki markup cells can be listed on one line separated by ||. This does not scale well for longer cell content such as paragraphs. It works well for short bits of content however, such as our example table.

Extra spaces within cells in the wiki markup can be added, as I have done in the wiki markup below, to make the wiki markup itself look better but they do not affect the actual table rendering.

HTML attributes can be added to tables on this page but have been left out of the following example for simplicity.
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{|
|  Orange    ||   Apple   ||   more
|-
|   Bread    ||   Pie     ||   more
|-
|   Butter   || Ice cream ||  and more
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{|
|  Orange    ||   Apple   ||   more
|-
|   Bread    ||   Pie     ||   more
|-
|   Butter   || Ice cream ||  and more
|}
&lt;/pre&gt;
|}

===With HTML attributes===
You can add HTML attributes to make your table look better
====border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====align=&quot;center&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| align=&quot;center&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| align=&quot;center&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====Attributes on cells ====
You can put attributes on individual '''cells.''' Numbers for example may look better aligned right
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|-
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|-
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
&lt;/pre&gt;
|}

====Attributes on rows====
You can put attributes on individual '''rows,''' too.
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|- style=&quot;font-style:italic;color:green;&quot;
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot;
|Orange
|Apple
|align=&quot;right&quot;|12,333.00
|-
|Bread
|Pie
|align=&quot;right&quot;|500.00
|- style=&quot;font-style:italic;color:green;&quot;
|Butter
|Ice cream
|align=&quot;right&quot;|1.00
|}
&lt;/pre&gt;
|}

====cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

''Note: This cellpadding example is not currently working properly on mediawiki.org   It is supposed to look like [http://test.wikipedia.org/wiki/Table_test this]''

===With HTML attributes and CSS styles===
CSS style attributes can be added with or without other HTML attributes
====style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| style=&quot;color:green;background-color:#ffffcc;&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Table with TH headings==

TH (HTML table headings) can be created by using ! instead of |. Headings usually show up bold and centered by default.

===Top headings===
====Each column====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Yummy
!Yummier
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Yummy
!Yummier
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}
====Colspan=&quot;2&quot;====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!colspan=&quot;2&quot;|Yummies
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
! colspan=&quot;2&quot;|Yummies
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

===Side headings===
====Default====
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Fruit
|Orange
|Apple
|-
!Dish
|Bread
|Pie
|-
!Complement
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!Fruit
|Orange
|Apple
|-
!Dish
|Bread
|Pie
|-
!Complement
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

====Right justify====
Right justified side headings can be done as follows
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!align=&quot;right&quot; |Fruit
|Orange
|Apple
|-
!align=&quot;right&quot; |Dish
|Bread
|Pie
|-
!align=&quot;right&quot; |Complement
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
!align=&quot;right&quot; |Fruit
|Orange
|Apple
|-
!align=&quot;right&quot; |Dish
|Bread
|Pie
|-
!align=&quot;right&quot; |Complement
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Caption==
A '''table caption''' can be added to the top of any table as follows
{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+Food complements
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+Food complements
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

'''Attributes''' can be added to the caption as follows

{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+align=&quot;bottom&quot; style=&quot;color:#e76700;&quot;|''Food complements''
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|+align=&quot;bottom&quot; style=&quot;color:#e76700;&quot;|''Food complements''
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Table with H1, H2, H3 etc. headings==

HTML H1, H2, H3, H4 etc. headings can be created the standard wiki markup way with ==equal== signs and '''must be on a line all by themselves''' to work.

'''Preview the whole table.''' If you click on an edit tab for a heading ''within'' a table, edit, and preview, the parent table will display erroneously broken because part of it will be missing.

Keep the heading hierarchy consistent with the rest of the page so that the table of contents at page top works correctly.

{| width=&quot;100%&quot;
|width=&quot;50%&quot;|
{| border=&quot;1&quot; cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|colspan=&quot;2&quot;|
===Yummiest===
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
|width=&quot;50%&quot;|
&lt;pre&gt;
{| border=&quot;3&quot;  cellpadding=&quot;20&quot; cellspacing=&quot;0&quot;
|colspan=&quot;2&quot;|
===Yummiest===
|-
|Orange
|Apple
|-
|Bread
|Pie
|-
|Butter
|Ice cream 
|}
&lt;/pre&gt;
|}

==Caveat==
===Negative numbers===
Negative value minus sign can break your table (it may display missing some values) if you start a cell on a new line with a negative number or a parameter that evaluates to a negative number (|-6) because that is the wiki markup for table row, not table cell. To avoid this, insert a space before the value (| -6) or use in-line cell markup (||-6).

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Talk pages</title>
    <id>44</id>
    <revision>
      <id>108</id>
      <timestamp>2007-12-21T20:16:44Z</timestamp>
      <contributor>
        <ip>BrianOregon</ip>
      </contributor>
      <minor/>
      <comment>Undo revision 155744 by [[Special:Contributions/194.83.46.45|194.83.46.45]] ([[User talk:194.83.46.45|Talk]])</comment>
      <text xml:space="preserve">{{PD Help Page}}

Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

==External links==
{{meta|Help:Talk page}}

{{Languages|Help:Talk pages}}

[[Category:Help|Talk pages]]</text>
    </revision>
    <revision>
      <id>109</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

==External links==
{{meta|Help:Talk page}}

{{Languages|Help:Talk pages}}

[[Category:Help|Talk pages]]</text>
    </revision>
    <revision>
      <id>201</id>
      <timestamp>2008-02-18T19:31:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33833</id>
      <timestamp>2008-12-30T06:03:53Z</timestamp>
      <contributor>
        <username>LetonOmona</username>
        <id>1840</id>
      </contributor>
      <minor/>
      <comment>acricliorol</comment>
      <text xml:space="preserve">cnachilap
Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33841</id>
      <timestamp>2008-12-30T07:53:25Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>Undo revision 33833 by [[Special:Contributions/LetonOmona|LetonOmona]] ([[User talk:LetonOmona|Talk]])</comment>
      <text xml:space="preserve">Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33867</id>
      <timestamp>2009-01-08T16:57:26Z</timestamp>
      <contributor>
        <username>LetonOmona</username>
        <id>1840</id>
      </contributor>
      <minor/>
      <comment>http://zelgetgo.0lx.net/new432.htm</comment>
      <text xml:space="preserve">[new indian movies bollywood|http://zelgetgo.0lx.net/new432.htm] [[http://zelgetgo.0lx.net/new432.htm new indian movies bollywood]] [http://zelgetgo.0lx.net/new432.htm|new indian movies bollywood] ((http://zelgetgo.0lx.net/new432.htm new indian movies bollywood)) [[http://zelgetgo.0lx.net/new432.htm | new indian movies bollywood]] &quot;new indian movies bollywood&quot;:http://zelgetgo.0lx.net/new432.htm [adshareit crack serial|http://hencnac4t.is-the-boss.com/news-adshareit-crack-2008-12-26.html] [[http://hencnac4t.is-the-boss.com/news-adshareit-crack-2008-12-26.html adshareit crack serial]] [http://hencnac4t.is-the-boss.com/news-adshareit-crack-2008-12-26.html|adshareit crack serial] ((http://hencnac4t.is-the-boss.com/news-adshareit-crack-2008-12-26.html adshareit crack serial)) [[http://hencnac4t.is-the-boss.com/news-adshareit-crack-2008-12-26.html | adshareit crack serial]] &quot;adshareit crack serial&quot;:http://hencnac4t.is-the-boss.com/news-adshareit-crack-2008-12-26.html [monitoring video wireless|http://caraines.qsh.eu/delnorol.htm] [[http://caraines.qsh.eu/delnorol.htm monitoring video wireless]] [http://caraines.qsh.eu/delnorol.htm|monitoring video wireless] ((http://caraines.qsh.eu/delnorol.htm monitoring video wireless)) [[http://caraines.qsh.eu/delnorol.htm | monitoring video wireless]] &quot;monitoring video wireless&quot;:http://caraines.qsh.eu/delnorol.htm [mt hood hellicopter crash video|http://roladarh.strefa.pl/news-1785.html] [[http://roladarh.strefa.pl/news-1785.html mt hood hellicopter crash video]] [http://roladarh.strefa.pl/news-1785.html|mt hood hellicopter crash video] ((http://roladarh.strefa.pl/news-1785.html mt hood hellicopter crash video)) [[http://roladarh.strefa.pl/news-1785.html | mt hood hellicopter crash video]] &quot;mt hood hellicopter crash video&quot;:http://roladarh.strefa.pl/news-1785.html [india arie video download|http://tulilre.strefa.pl/2009-01-01-india-arie-video.html] [[http://tulilre.strefa.pl/2009-01-01-india-arie-video.html india arie video download]] [http://tulilre.strefa.pl/2009-01-01-india-arie-video.html|india arie video download] ((http://tulilre.strefa.pl/2009-01-01-india-arie-video.html india arie video download)) [[http://tulilre.strefa.pl/2009-01-01-india-arie-video.html | india arie video download]] &quot;india arie video download&quot;:http://tulilre.strefa.pl/2009-01-01-india-arie-video.html 
Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33878</id>
      <timestamp>2009-01-08T20:36:37Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <comment>Undo revision 33867 by [[Special:Contributions/LetonOmona|LetonOmona]] ([[User talk:LetonOmona|Talk]])</comment>
      <text xml:space="preserve">Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33886</id>
      <timestamp>2009-01-08T23:40:37Z</timestamp>
      <contributor>
        <username>LetonOmona</username>
        <id>1840</id>
      </contributor>
      <comment>http://cnavieltz.strefa.pl/comment-1632.htm</comment>
      <text xml:space="preserve">[karma video banks|http://cnavieltz.strefa.pl/comment-1632.htm] [[http://cnavieltz.strefa.pl/comment-1632.htm karma video banks]] [http://cnavieltz.strefa.pl/comment-1632.htm|karma video banks] ((http://cnavieltz.strefa.pl/comment-1632.htm karma video banks)) [[http://cnavieltz.strefa.pl/comment-1632.htm | karma video banks]] &quot;karma video banks&quot;:http://cnavieltz.strefa.pl/comment-1632.htm [simhachalam telugu movie|http://ettaelt.strefa.pl/news-111.html] [[http://ettaelt.strefa.pl/news-111.html simhachalam telugu movie]] [http://ettaelt.strefa.pl/news-111.html|simhachalam telugu movie] ((http://ettaelt.strefa.pl/news-111.html simhachalam telugu movie)) [[http://ettaelt.strefa.pl/news-111.html | simhachalam telugu movie]] &quot;simhachalam telugu movie&quot;:http://ettaelt.strefa.pl/news-111.html [scatology movies|http://zelgetgo.0lx.net/new909.htm] [[http://zelgetgo.0lx.net/new909.htm scatology movies]] [http://zelgetgo.0lx.net/new909.htm|scatology movies] ((http://zelgetgo.0lx.net/new909.htm scatology movies)) [[http://zelgetgo.0lx.net/new909.htm | scatology movies]] &quot;scatology movies&quot;:http://zelgetgo.0lx.net/new909.htm [impossible creatures no cd patch|http://varpasz.is-the-boss.com/article327.htm] [[http://varpasz.is-the-boss.com/article327.htm impossible creatures no cd patch]] [http://varpasz.is-the-boss.com/article327.htm|impossible creatures no cd patch] ((http://varpasz.is-the-boss.com/article327.htm impossible creatures no cd patch)) [[http://varpasz.is-the-boss.com/article327.htm | impossible creatures no cd patch]] &quot;impossible creatures no cd patch&quot;:http://varpasz.is-the-boss.com/article327.htm [animal rights farming video|http://saererg.0lx.net/20081117-animal-rights.htm] [[http://saererg.0lx.net/20081117-animal-rights.htm animal rights farming video]] [http://saererg.0lx.net/20081117-animal-rights.htm|animal rights farming video] ((http://saererg.0lx.net/20081117-animal-rights.htm animal rights farming video)) [[http://saererg.0lx.net/20081117-animal-rights.htm | animal rights farming video]] &quot;animal rights farming video&quot;:http://saererg.0lx.net/20081117-animal-rights.htm 
Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33892</id>
      <timestamp>2009-01-09T07:05:45Z</timestamp>
      <contributor>
        <username>LetonOmona</username>
        <id>1840</id>
      </contributor>
      <minor/>
      <comment>http://flheddin.qsh.eu/reldar-262.html</comment>
      <text xml:space="preserve">[life aquatic movie poster|http://flheddin.qsh.eu/reldar-262.html] [[http://flheddin.qsh.eu/reldar-262.html life aquatic movie poster]] [http://flheddin.qsh.eu/reldar-262.html|life aquatic movie poster] ((http://flheddin.qsh.eu/reldar-262.html life aquatic movie poster)) [[http://flheddin.qsh.eu/reldar-262.html | life aquatic movie poster]] &quot;life aquatic movie poster&quot;:http://flheddin.qsh.eu/reldar-262.html [m.i.a. sunshowers video|http://bukgetert.0lx.net/article-95.htm] [[http://bukgetert.0lx.net/article-95.htm m.i.a. sunshowers video]] [http://bukgetert.0lx.net/article-95.htm|m.i.a. sunshowers video] ((http://bukgetert.0lx.net/article-95.htm m.i.a. sunshowers video)) [[http://bukgetert.0lx.net/article-95.htm | m.i.a. sunshowers video]] &quot;m.i.a. sunshowers video&quot;:http://bukgetert.0lx.net/article-95.htm [san luis obispo movies|http://dronoubr.0lx.net/san-luis-obispo.html] [[http://dronoubr.0lx.net/san-luis-obispo.html san luis obispo movies]] [http://dronoubr.0lx.net/san-luis-obispo.html|san luis obispo movies] ((http://dronoubr.0lx.net/san-luis-obispo.html san luis obispo movies)) [[http://dronoubr.0lx.net/san-luis-obispo.html | san luis obispo movies]] &quot;san luis obispo movies&quot;:http://dronoubr.0lx.net/san-luis-obispo.html [link|http://baslozaro.is-the-boss.com/sitemap.html] [[http://baslozaro.is-the-boss.com/sitemap.html link]] [http://baslozaro.is-the-boss.com/sitemap.html|link] ((http://baslozaro.is-the-boss.com/sitemap.html link)) [[http://baslozaro.is-the-boss.com/sitemap.html | link]] &quot;link&quot;:http://baslozaro.is-the-boss.com/sitemap.html [incredimail xe 1787 crack|http://faquafav.is-the-boss.com/text-612.htm] [[http://faquafav.is-the-boss.com/text-612.htm incredimail xe 1787 crack]] [http://faquafav.is-the-boss.com/text-612.htm|incredimail xe 1787 crack] ((http://faquafav.is-the-boss.com/text-612.htm incredimail xe 1787 crack)) [[http://faquafav.is-the-boss.com/text-612.htm | incredimail xe 1787 crack]] &quot;incredimail xe 1787 crack&quot;:http://faquafav.is-the-boss.com/text-612.htm 
[karma video banks|http://cnavieltz.strefa.pl/comment-1632.htm] [[http://cnavieltz.strefa.pl/comment-1632.htm karma video banks]] [http://cnavieltz.strefa.pl/comment-1632.htm|karma video banks] ((http://cnavieltz.strefa.pl/comment-1632.htm karma video banks)) [[http://cnavieltz.strefa.pl/comment-1632.htm | karma video banks]] &quot;karma video banks&quot;:http://cnavieltz.strefa.pl/comment-1632.htm [simhachalam telugu movie|http://ettaelt.strefa.pl/news-111.html] [[http://ettaelt.strefa.pl/news-111.html simhachalam telugu movie]] [http://ettaelt.strefa.pl/news-111.html|simhachalam telugu movie] ((http://ettaelt.strefa.pl/news-111.html simhachalam telugu movie)) [[http://ettaelt.strefa.pl/news-111.html | simhachalam telugu movie]] &quot;simhachalam telugu movie&quot;:http://ettaelt.strefa.pl/news-111.html [scatology movies|http://zelgetgo.0lx.net/new909.htm] [[http://zelgetgo.0lx.net/new909.htm scatology movies]] [http://zelgetgo.0lx.net/new909.htm|scatology movies] ((http://zelgetgo.0lx.net/new909.htm scatology movies)) [[http://zelgetgo.0lx.net/new909.htm | scatology movies]] &quot;scatology movies&quot;:http://zelgetgo.0lx.net/new909.htm [impossible creatures no cd patch|http://varpasz.is-the-boss.com/article327.htm] [[http://varpasz.is-the-boss.com/article327.htm impossible creatures no cd patch]] [http://varpasz.is-the-boss.com/article327.htm|impossible creatures no cd patch] ((http://varpasz.is-the-boss.com/article327.htm impossible creatures no cd patch)) [[http://varpasz.is-the-boss.com/article327.htm | impossible creatures no cd patch]] &quot;impossible creatures no cd patch&quot;:http://varpasz.is-the-boss.com/article327.htm [animal rights farming video|http://saererg.0lx.net/20081117-animal-rights.htm] [[http://saererg.0lx.net/20081117-animal-rights.htm animal rights farming video]] [http://saererg.0lx.net/20081117-animal-rights.htm|animal rights farming video] ((http://saererg.0lx.net/20081117-animal-rights.htm animal rights farming video)) [[http://saererg.0lx.net/20081117-animal-rights.htm | animal rights farming video]] &quot;animal rights farming video&quot;:http://saererg.0lx.net/20081117-animal-rights.htm 
Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33899</id>
      <timestamp>2009-01-09T07:26:36Z</timestamp>
      <contributor>
        <username>Solarsys</username>
        <id>1818</id>
      </contributor>
      <text xml:space="preserve">Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34524</id>
      <timestamp>2009-07-03T07:38:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>talk pages vs. forums</comment>
      <text xml:space="preserve">Every wiki page has an associated talk page which can be used for discussion and communicating with other users. Talk pages can be accessed by clicking the ''Discussion'' tab at the top of the page. Simply edit the page as normal to add your comment.

A talk page is actually very similar to any other wiki page, but it is in the 'talk' namespace, to keep it separate from the articles in the 'main' namespace (See [[Help:namespaces]]) As with any wiki page, you can edit it, link to it, and view the editing history.

== Editing conventions on talk pages ==
Having discussions on a free-form wiki page will seem strange at first. It helps if everyone follows some simple editing conventions:

* Always sign your name after your comments. Use the four tildas '&lt;tt&gt;&lt;nowiki&gt;~~~~&lt;/nowiki&gt;&lt;/tt&gt;' wiki syntax (or the toolbar button)
* Start a new discussion with a &lt;tt&gt;&lt;nowiki&gt;==level 2 heading==&lt;/nowiki&gt;&lt;/tt&gt; at the bottom of the page (or use the '+' tab)
* Indent replies with colons (':') at the beginning of the line.

== Example ==
Here is an example discussion, following the talk page conventions:

{| align=&quot;center&quot; {{Prettytable}}
|-
|{{Hl2}} |'''Wiki text'''	
|{{Hl2}} |'''Formatted talk page'''
|-
|


&lt;tt&gt;&lt;nowiki&gt;== More spiders information needed ==&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;&lt;nowiki&gt;::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)&lt;/nowiki&gt;&lt;/tt&gt;
|
== More spiders information needed ==
This page has a lot of detail about the web, but I really dont understand a single word of it, and it doesn't mention the spider once -- [[User:Bob Smith|Bob Smith]] 18:07, 26 August 1991 (UTC)
: No no. This page is talking about the &quot;world wide web&quot;. I have added a clarification at the top - [[User:Simon Brown|Simon Brown]] 11:21, 28 August 1991(UTC)
:: Oh I see... So what's the big deal about hyperlinked documents? Seems like a stupid idea to me. -- [[User:Bob Smith|Bob Smith]] 14:11, 3 September 1991 (UTC)
::: Well I think we should have some information about it here on our wiki, but you're probably right. It'll never catch on. -- [[User:Simon Brown|Simon Brown]] 21:55, 3 September 1991 (UTC)
|}


== Editing discussions ==
Having discussions on a free-form wiki page will seem strange at first. It has some advantages over the conventional rigid forum format, but it can get a little messy. As with other wiki pages, anyone can help with tidying up discussions, to conform to the editing conventions e.g. add signatures and headings where they are missing.

Clearly we also have the opportunity to edit other people's comments. It is generally bad etiquette to modify somebody else's wording (Better to just add your own comment with your corrections) But it can be acceptable to...

;Modify discussion headings
:Change wording or append words to the discussion headings, to better describe the topic of discussion. Note that good descriptive headings become important when many discussions start to fill the page.
;Move discussions to a different page
:If discussions are put in the wrong place on the wiki, and are better associated with different talk page, then you could just move the discussion by cut &amp; paste. This is potentially confusing, for the people posting, but can be important for keeping things tidy. You could leave the discussion in the wrong place for a few days/weeks grace before tidying it. You could leave a link behind explaining that a discussion was moved, or if not, you should link within the edit summary.
;Delete discussions when they are out-of-date
:Discussions can often get left lying around on a talk page long after the issue is no longer relevant. It's usually a good idea to reply to saying &quot;I think this is now resolved&quot;, but sooner or later it's time to just blow away the old discussions (they are of course preserved in the editing history)
;Split a post into several discussions
:It may appropriate to do this, if somebody has raised several points which need to be answered separately. However you should always be respectful to other people's words. Does their post still make sense if you split it up?

== Building articles - Discussing articles ==
It is usually best to keep focused on the task of building a wiki article, and use discussion pages only to support this process. The topic of conversation should generally revolve around what needs to be done to make the associated article better. Remember that editing the article itself is often a more effective means of communicating. It can be more difficult, requiring you to balance your views alongside those of others, but it can also be more rewarding. This is how the community of wiki editors will make progress. Often it will feel more natural to engage in heated debate on a talk page (or indeed any other contact channel) but in fact the wiki article itself can offer a powerful means of reaching middle-ground. Think about how to portray both sides of the argument (e.g. listing advantages and disadvantages) and you may find the debate evaporates.

== User Talk pages ==
A &quot;user talk page&quot; is a talk page associated with somebody's &quot;user page&quot; (See [[Help:User page]])  This is a place to leave messages for a particular wiki user.

This can function as a kind of messaging system. Users receive a prominent notification when new messages have been left on their talk page. They may be notified by email as well, although this cannot always be relied upon (since the email notification feature must be activated by supplying a valid email address, and clicking a confirmation link). If you don't get a response to your user talk page message, try looking for other contact details which they may have supplied on their user page.

Note that the messages are not private, and others can join in the conversation.

==Talk pages vs. forums==
Talk pages aren't the ultimate answer to all communication needs. Especially individual questions only semi-related to an article should better be asked on a related forum. Almost all questions related to the Unreal Engine most likely receive better responses on the [http://forums.beyondunreal.com/ BeyondUnreal Forums] or the [http://forums.epicgames.com/ Epic Games Forums]. Of course you are welcome to [[Help:Editing pages|add]] any knowledge derived from the answers to related articles on the Unreal Wiki, or even [[Help:Starting a new page|start new articles]] about the topic.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Templates</title>
    <id>48</id>
    <revision>
      <id>116</id>
      <timestamp>2008-01-24T03:37:05Z</timestamp>
      <contributor>
        <ip>Zachary</ip>
      </contributor>
      <comment>/* Control template inclusion */ boo, no extra templates</comment>
      <text xml:space="preserve">{{PD Help Page}}
If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=&quot;float:right; margin:8px;&quot;&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''Template with numbered parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''with named parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use &quot;name=value&quot; pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''&quot;all your hard work&quot;'' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Category|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the [[m:Help:Job queue|job queue]]&lt;!-- please fix link once that page has been migrated here --&gt;.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates
*[[meta:Help:Embed page]] -- embedding pages from [[namespace]]s other than &lt;code&gt;Template:&lt;/code&gt;.

==External links==
{{meta|Help:Template}}

[[Category:Help|{{PAGENAME}}]]
[[Category:Template]]
{{Languages|Help:Templates}}</text>
    </revision>
    <revision>
      <id>117</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=&quot;float:right; margin:8px;&quot;&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''Template with numbered parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''with named parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use &quot;name=value&quot; pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''&quot;all your hard work&quot;'' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Category|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the [[m:Help:Job queue|job queue]]&lt;!-- please fix link once that page has been migrated here --&gt;.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates
*[[meta:Help:Embed page]] -- embedding pages from [[namespace]]s other than &lt;code&gt;Template:&lt;/code&gt;.

==External links==
{{meta|Help:Template}}

[[Category:Help|{{PAGENAME}}]]
[[Category:Template]]
{{Languages|Help:Templates}}</text>
    </revision>
    <revision>
      <id>205</id>
      <timestamp>2008-02-18T19:42:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=&quot;float:right; margin:8px;&quot;&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''Template with numbered parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''with named parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use &quot;name=value&quot; pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''&quot;all your hard work&quot;'' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Help:Category|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the job queue.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>255</id>
      <timestamp>2008-02-19T21:19:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Control template inclusion */</comment>
      <text xml:space="preserve">If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=&quot;float:right; margin:8px;&quot;&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''Template with numbered parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''with named parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use &quot;name=value&quot; pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''&quot;all your hard work&quot;'' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Help:Categories|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the job queue.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44548</id>
      <timestamp>2011-08-23T21:11:10Z</timestamp>
      <contributor>
        <ip>67.185.49.250</ip>
      </contributor>
      <text xml:space="preserve">If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=''float:right; margin:8px;''&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=''2'' align=''center'' |'''Template with numbered parameters'''	
|-
| colspan=''2'' |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=''2'' align=''center'' |'''with named parameters'''	
|-
| colspan=''2'' |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use ''name=value'' pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''''all your hard work'''' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Help:Categories|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the job queue.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=''display:table; width:auto;''&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44549</id>
      <timestamp>2011-08-23T21:11:56Z</timestamp>
      <contributor>
        <ip>67.185.49.250</ip>
      </contributor>
      <text xml:space="preserve">If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;''[[Template:Name]]''&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;''[[Template:Name]]''&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=''float:right; margin:8px;''&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=''2'' align=''center'' |'''Template with numbered parameters'''	
|-
| colspan=''2'' |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=''2'' align=''center'' |'''with named parameters'''	
|-
| colspan=''2'' |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use ''name=value'' pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''''all your hard work'''' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Help:Categories|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the job queue.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=''display:table; width:auto;''&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44556</id>
      <timestamp>2011-08-23T21:41:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/67.185.49.250|67.185.49.250]] ([[User talk:67.185.49.250|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play (like the tag above which is included in the pages of the Help namespace).

==Creating a template==
Template names are prefixed with &lt;code&gt;Template:&lt;/code&gt;, you [[Help:Starting a new page|create them like any other wiki page]].

==Using a template==
Templates are wiki pages which can be used in other pages in three ways:
*&lt;code&gt;&lt;nowiki&gt;{{Name}}&lt;/nowiki&gt;&lt;/code&gt; includes the content of the template at the moment the page containing it is fetched &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt;. 
*&lt;code&gt;&lt;nowiki&gt;{{subst:Name}}&lt;/nowiki&gt;&lt;/code&gt; inserts the content of the template into the code of the page in a form that is editable normally &lt;nowiki&gt;&quot;[[Template:Name]]&quot;&lt;/nowiki&gt; after you have saved your text. 
*&lt;code&gt;&lt;nowiki&gt;{{msgnw:Name}}&lt;/nowiki&gt;&lt;/code&gt; when the page containing it is fetched, includes the template in a form that displays it as raw wiki syntax, like &lt;code&gt;&lt;nowiki&gt;&amp;lt;nowiki&amp;gt;&lt;/nowiki&gt;&lt;/code&gt; does

==Using parameters in templates==
&lt;div style=&quot;float:right; margin:8px;&quot;&gt;
{| {{Prettytable}} 
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''Template with numbered parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{1}}}.&lt;br&gt;
hugs, {{{2}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;
|
{{Thankyou|all your hard work|Joe}}
|-
|{{Hl2}} colspan=&quot;2&quot; align=&quot;center&quot; |'''with named parameters'''	
|-
| colspan=&quot;2&quot; |
&lt;pre&gt;&lt;nowiki&gt; 
'''A little thank you...'''&lt;br&gt;
&lt;small&gt;for {{{reason}}}.&lt;br&gt;
hugs, {{{signature}}}&lt;/small&gt;
&lt;/nowiki&gt;&lt;/pre&gt; 
|-
|{{Hl2}}|'''You type'''	
|{{Hl2}}|'''You get'''
|-
|&lt;pre&gt;&lt;nowiki&gt;{{Thankyou
|reason=all your hard work
|signature=Joe}}&lt;/nowiki&gt;&lt;/pre&gt;
|
{{Thankyou|all your hard work|Joe}}
|}
&lt;/div&gt;
You can define parameters in templates either numbered as &lt;code&gt;&lt;nowiki&gt;{{{1}}}&lt;/nowiki&gt;&lt;/code&gt; or named &lt;code&gt;&lt;nowiki&gt;{{{param}}}&lt;/nowiki&gt;&lt;/code&gt;.  

'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.

When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &lt;code&gt;&lt;nowiki&gt;{{Thankyou|all your hard work|Joe}}&lt;/nowiki&gt;&lt;/code&gt;.  For named parameters use &quot;name=value&quot; pairs separated by a pipe char:   &lt;code&gt;&lt;nowiki&gt;{{Thankyou|reason=all your hard work|signature=Joe}}&lt;/nowiki&gt;&lt;/code&gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &lt;code&gt;&lt;nowiki&gt;{{Thankyou|2=Joe|1=all your hard work}}&lt;/nowiki&gt;&lt;/code&gt;.

You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &lt;code&gt;&lt;nowiki&gt;{{{reason|all your hard work}}}&lt;/nowiki&gt;&lt;/code&gt; would result in ''&quot;all your hard work&quot;'' if no value was provided for the parameter &lt;tt&gt;reason&lt;/tt&gt;.

==Control template inclusion==
You can control template inclusion by the use of &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; tags.

Anything between &lt;code&gt;&lt;nowiki&gt;&lt;noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; and &lt;code&gt;&lt;nowiki&gt;&lt;/noinclude&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and
displayed only when the page is being viewed directly, not included.

Possible applications are:
* Categorising templates
* Interlanguage links to similar templates in other languages
* Explanatory text about how to use the template

The converse is &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt;. Text between &lt;code&gt;&lt;nowiki&gt;&lt;includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; and
&lt;code&gt;&lt;nowiki&gt;&lt;/includeonly&gt;&lt;/nowiki&gt;&lt;/code&gt; will be processed and displayed only when the page is
being included. The obvious application is to add all pages containing a given template to a [[Help:Categories|category]], without putting the template itself into that category.

'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the job queue.

==Organizing templates==
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.
For example:
&lt;div style=&quot;display:table; width:auto;&quot;&gt;&lt;pre&gt;
&lt;noinclude&gt;
==Usage==
Allows to establish a link to a subject:
{{NameOfTemplate|Term1+Term2+Term3}}
&lt;/noinclude&gt;
&lt;/pre&gt;&lt;/div&gt;

Then, an editor can simply copy and paste the example to create a similar page.

==See Also==
*[[Help:External searches]] -- a template special use case example
*[[Help:Variables]] -- fancy stuff you may find in some templates

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Tracking changes</title>
    <id>40</id>
    <revision>
      <id>96</id>
      <timestamp>2008-01-16T18:20:39Z</timestamp>
      <contributor>
        <ip>Harry Wood</ip>
      </contributor>
      <minor/>
      <comment>typo</comment>
      <text xml:space="preserve">{{PD Help Page}}
[[Image:M-en-recentchanges.png|thumb|370px|'''Recent changes''' shows the latest changes to articles, file uploads, deletions and page moves]]
MediaWiki offers a collection of special pages and tools to keep track of what is going on in the wiki. So you can watch for example:
* recent changes to all pages
* the revision history: all changes made to one page
* the contributions of one specific user 
* newly created pages

The most interesting special page is '''[[Special:Recentchanges]]'''. It displays all edits, file uploads, page moves, deletions and other actions done in the wiki. In the menu on top it offers a collection of links to customize your display: limit the number of changes shown, the number of days or restrict it to edits to a certain namespace. You can also hide edits marked as minor (don't forget that major changes can be flagged by a user as minor anyway).

One line in recentchanges consists of several links:
* ''diff'' displays the difference to the previous revision of the page,
* ''hist'' links to the revision history of the page,
* the link with the full title of the page brings you to the current version. If the title is in bold, it indicates that it is on your watchlist.

Next is a flag describing the article modification type:
*''N'' signalizes a new page,
*''m'' a minor edit,
*''b'' an edit made by a bot.

Following the timestamp the user is mentioned, with a link to their [[Help:User page|user page]] and their [[Help:Talk pages#User Talk pages|talk page]] or to their contributions (in the case of anonymous users).

Last but not least, there is an edit summary, appearing in italics, if the user submitted one when they made the edit.

=== Enhanced view ===
If you are logged in and have JavaScript enabled, you can also try the &quot;enhanced&quot; view. Simply go to your [[Help:Preferences#Recent changes|Preferences]] and enable &quot;Enhanced recent changes (JavaScript)&quot;; this will make recent changes show edits divided by page rather than being listed individually.  You will now see entries like the following:
:! 15:17 [[Main Page]] (4 changes; (+236) Page history) [Some User‎ (2×); Some Other User (2×)]
Simply click the blue arrow to the left of the page name and timestamp to expand that page's recent edits just as they were on the normal style. You can turn this enhancement on and off at will, so feel free to try both to see which one you prefer.

=== See also ===
* [[Special:Newpages]]
* Related changes: [[Special:Recentchangeslinked/Pagename]]
* User contributions: [[Special:Contributions/User]]
* History
* [[Special:Watchlist]]  

{{Admin tip|tip=You may want to add important pages in your wiki to [[MediaWiki:Recentchangestext]], the intro shown at [[Special:Recentchanges]]}}

==External links==
{{meta|Help:Tracking changes}}

{{Languages|Help:Tracking changes}}
[[Category:Help|Tracking changes]]</text>
    </revision>
    <revision>
      <id>97</id>
      <timestamp>2008-02-18T18:42:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}
[[Image:M-en-recentchanges.png|thumb|370px|'''Recent changes''' shows the latest changes to articles, file uploads, deletions and page moves]]
MediaWiki offers a collection of special pages and tools to keep track of what is going on in the wiki. So you can watch for example:
* recent changes to all pages
* the revision history: all changes made to one page
* the contributions of one specific user 
* newly created pages

The most interesting special page is '''[[Special:Recentchanges]]'''. It displays all edits, file uploads, page moves, deletions and other actions done in the wiki. In the menu on top it offers a collection of links to customize your display: limit the number of changes shown, the number of days or restrict it to edits to a certain namespace. You can also hide edits marked as minor (don't forget that major changes can be flagged by a user as minor anyway).

One line in recentchanges consists of several links:
* ''diff'' displays the difference to the previous revision of the page,
* ''hist'' links to the revision history of the page,
* the link with the full title of the page brings you to the current version. If the title is in bold, it indicates that it is on your watchlist.

Next is a flag describing the article modification type:
*''N'' signalizes a new page,
*''m'' a minor edit,
*''b'' an edit made by a bot.

Following the timestamp the user is mentioned, with a link to their [[Help:User page|user page]] and their [[Help:Talk pages#User Talk pages|talk page]] or to their contributions (in the case of anonymous users).

Last but not least, there is an edit summary, appearing in italics, if the user submitted one when they made the edit.

=== Enhanced view ===
If you are logged in and have JavaScript enabled, you can also try the &quot;enhanced&quot; view. Simply go to your [[Help:Preferences#Recent changes|Preferences]] and enable &quot;Enhanced recent changes (JavaScript)&quot;; this will make recent changes show edits divided by page rather than being listed individually.  You will now see entries like the following:
:! 15:17 [[Main Page]] (4 changes; (+236) Page history) [Some User‎ (2×); Some Other User (2×)]
Simply click the blue arrow to the left of the page name and timestamp to expand that page's recent edits just as they were on the normal style. You can turn this enhancement on and off at will, so feel free to try both to see which one you prefer.

=== See also ===
* [[Special:Newpages]]
* Related changes: [[Special:Recentchangeslinked/Pagename]]
* User contributions: [[Special:Contributions/User]]
* History
* [[Special:Watchlist]]  

{{Admin tip|tip=You may want to add important pages in your wiki to [[MediaWiki:Recentchangestext]], the intro shown at [[Special:Recentchanges]]}}

==External links==
{{meta|Help:Tracking changes}}

{{Languages|Help:Tracking changes}}
[[Category:Help|Tracking changes]]</text>
    </revision>
    <revision>
      <id>191</id>
      <timestamp>2008-02-18T19:09:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">[[Image:M-en-recentchanges.png|thumb|370px|'''Recent changes''' shows the latest changes to articles, file uploads, deletions and page moves]]
MediaWiki offers a collection of special pages and tools to keep track of what is going on in the wiki. So you can watch for example:
* recent changes to all pages
* the revision history: all changes made to one page
* the contributions of one specific user 
* newly created pages

The most interesting special page is '''[[Special:Recentchanges]]'''. It displays all edits, file uploads, page moves, deletions and other actions done in the wiki. In the menu on top it offers a collection of links to customize your display: limit the number of changes shown, the number of days or restrict it to edits to a certain namespace. You can also hide edits marked as minor (don't forget that major changes can be flagged by a user as minor anyway).

One line in recentchanges consists of several links:
* ''diff'' displays the difference to the previous revision of the page,
* ''hist'' links to the revision history of the page,
* the link with the full title of the page brings you to the current version. If the title is in bold, it indicates that it is on your watchlist.

Next is a flag describing the article modification type:
*''N'' signalizes a new page,
*''m'' a minor edit,
*''b'' an edit made by a bot.

Following the timestamp the user is mentioned, with a link to their [[Help:User page|user page]] and their [[Help:Talk pages#User Talk pages|talk page]] or to their contributions (in the case of anonymous users).

Last but not least, there is an edit summary, appearing in italics, if the user submitted one when they made the edit.

=== Enhanced view ===
If you are logged in and have JavaScript enabled, you can also try the &quot;enhanced&quot; view. Simply go to your [[Help:Preferences#Recent changes|Preferences]] and enable &quot;Enhanced recent changes (JavaScript)&quot;; this will make recent changes show edits divided by page rather than being listed individually.  You will now see entries like the following:
:! 15:17 [[Main Page]] (4 changes; (+236) Page history) [Some User‎ (2×); Some Other User (2×)]
Simply click the blue arrow to the left of the page name and timestamp to expand that page's recent edits just as they were on the normal style. You can turn this enhancement on and off at will, so feel free to try both to see which one you prefer.

=== See also ===
* [[Special:Newpages]]
* Related changes: [[Special:Recentchangeslinked/Pagename]]
* User contributions: [[Special:Contributions/User]]
* History
* [[Special:Watchlist]]  

{{Admin tip|tip=You may want to add important pages in your wiki to [[MediaWiki:Recentchangestext]], the intro shown at [[Special:Recentchanges]]}}

[[Category:Help|Tracking changes]]</text>
    </revision>
    <revision>
      <id>695</id>
      <timestamp>2008-03-07T09:29:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed admin tip</comment>
      <text xml:space="preserve">[[Image:M-en-recentchanges.png|thumb|370px|'''Recent changes''' shows the latest changes to articles, file uploads, deletions and page moves]]
MediaWiki offers a collection of special pages and tools to keep track of what is going on in the wiki. So you can watch for example:
* recent changes to all pages
* the revision history: all changes made to one page
* the contributions of one specific user 
* newly created pages

The most interesting special page is '''[[Special:Recentchanges]]'''. It displays all edits, file uploads, page moves, deletions and other actions done in the wiki. In the menu on top it offers a collection of links to customize your display: limit the number of changes shown, the number of days or restrict it to edits to a certain namespace. You can also hide edits marked as minor (don't forget that major changes can be flagged by a user as minor anyway).

One line in recentchanges consists of several links:
* ''diff'' displays the difference to the previous revision of the page,
* ''hist'' links to the revision history of the page,
* the link with the full title of the page brings you to the current version. If the title is in bold, it indicates that it is on your watchlist.

Next is a flag describing the article modification type:
*''N'' signalizes a new page,
*''m'' a minor edit,
*''b'' an edit made by a bot.

Following the timestamp the user is mentioned, with a link to their [[Help:User page|user page]] and their [[Help:Talk pages#User Talk pages|talk page]] or to their contributions (in the case of anonymous users).

Last but not least, there is an edit summary, appearing in italics, if the user submitted one when they made the edit.

=== Enhanced view ===
If you are logged in and have JavaScript enabled, you can also try the &quot;enhanced&quot; view. Simply go to your [[Help:Preferences#Recent changes|Preferences]] and enable &quot;Enhanced recent changes (JavaScript)&quot;; this will make recent changes show edits divided by page rather than being listed individually.  You will now see entries like the following:
:! 15:17 [[Main Page]] (4 changes; (+236) Page history) [Some User‎ (2×); Some Other User (2×)]
Simply click the blue arrow to the left of the page name and timestamp to expand that page's recent edits just as they were on the normal style. You can turn this enhancement on and off at will, so feel free to try both to see which one you prefer.

=== See also ===
* [[Special:Newpages]]
* Related changes: [[Special:Recentchangeslinked/Pagename]]
* User contributions: [[Special:Contributions/User]]
* History
* [[Special:Watchlist]]  

[[Category:Help|Tracking changes]]</text>
    </revision>
  </page>
  <page>
    <title>Help:User page</title>
    <id>63</id>
    <revision>
      <id>146</id>
      <timestamp>2008-02-16T15:39:21Z</timestamp>
      <contributor>
        <ip>Kakurady</ip>
      </contributor>
      <minor/>
      <comment>rv to rev. 146544</comment>
      <text xml:space="preserve">{{PD Help Page}}

A '''user page''' is a page about a wiki user; someone who registered on the wiki, and is (most probably) a contributor. If you have registered, you can create your own user page. Your user page is linked in the top right. More importantly, others will see links to your user page from various places which assist wiki collaboration. This includes the 'Recent changes' and page 'history' displays (See [[Help:Tracking changes]]). You can also link to your user page within text of a wiki page, which is mainly useful on [[Help:Talk pages|talk pages]] when you sign your name.

== What to put on your user page ==
User pages are just as flexible as any other wiki page, and it's a page all about you, so generally people will leave you to freely write your user page in whatever format you like. Think of it as a 'profile' page. It's a feature to help other people know who you are, and to bring the online community closer together. You might like to mention where you are from and what your job is. You can also state what your main areas of interest are in relation to the topic of the wiki, and describe contributions you have made or are areas where you are interested in contributing.

=== User scratchpad / development area ===
You can use your user page as a scratchpad. An area for developing ideas without cluttering the main namespace. If subpages are enabled (See [[Help:Subpages]]), you may find them useful for creating sub pages under you user page. However you should avoid expending too much effort within your own area of the wiki. Be bold! Edit the main wiki articles! You can also use a shared [[Sandbox]] page for quick (non-permanent) wiki experimentation.

== Other people's user pages ==

As mentioned above, you will see links to other people's user pages, in various places throughout the wiki.

=== User Contributions ===
When viewing another person's user page, an additional link &quot;''user contributions''&quot; appears in the 'toolbox' area (bottom left). This takes you to a list of all of this user's wiki edits. Use this to get an idea of how prolific a contributor somebody is, or to track down edits made by a user who is causing trouble/making bad wiki edits.

=== Editing someone else's page ===
It's generally considered bad etiquette to rewrite or reword another person's user page. Editing is not disallowed, but you should avoid adding information (or especially opinions) which might be misinterpreted as coming from that user, in situations where this could potentially cause upset. Some types of edit are widely acceptable, and unlikely to cause upset:

* Fixing wiki links, when a page has been [[Help:Moving a page|moved]] or [[Help:Deleting a page|deleted]]
* Fixing broken external links
* Categorizing or fixing categories of user pages.

=== User talk pages ===
Every user page has an associated talk page; a &quot;user talk page&quot;. This is a special kind of talk page, for leaving messages directed at a particular user. See [[Help:Talk pages#User Talk pages]].

== External Links ==
{{meta|User page}}

{{Languages|Help:User page}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>147</id>
      <timestamp>2008-02-18T18:42:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

A '''user page''' is a page about a wiki user; someone who registered on the wiki, and is (most probably) a contributor. If you have registered, you can create your own user page. Your user page is linked in the top right. More importantly, others will see links to your user page from various places which assist wiki collaboration. This includes the 'Recent changes' and page 'history' displays (See [[Help:Tracking changes]]). You can also link to your user page within text of a wiki page, which is mainly useful on [[Help:Talk pages|talk pages]] when you sign your name.

== What to put on your user page ==
User pages are just as flexible as any other wiki page, and it's a page all about you, so generally people will leave you to freely write your user page in whatever format you like. Think of it as a 'profile' page. It's a feature to help other people know who you are, and to bring the online community closer together. You might like to mention where you are from and what your job is. You can also state what your main areas of interest are in relation to the topic of the wiki, and describe contributions you have made or are areas where you are interested in contributing.

=== User scratchpad / development area ===
You can use your user page as a scratchpad. An area for developing ideas without cluttering the main namespace. If subpages are enabled (See [[Help:Subpages]]), you may find them useful for creating sub pages under you user page. However you should avoid expending too much effort within your own area of the wiki. Be bold! Edit the main wiki articles! You can also use a shared [[Sandbox]] page for quick (non-permanent) wiki experimentation.

== Other people's user pages ==

As mentioned above, you will see links to other people's user pages, in various places throughout the wiki.

=== User Contributions ===
When viewing another person's user page, an additional link &quot;''user contributions''&quot; appears in the 'toolbox' area (bottom left). This takes you to a list of all of this user's wiki edits. Use this to get an idea of how prolific a contributor somebody is, or to track down edits made by a user who is causing trouble/making bad wiki edits.

=== Editing someone else's page ===
It's generally considered bad etiquette to rewrite or reword another person's user page. Editing is not disallowed, but you should avoid adding information (or especially opinions) which might be misinterpreted as coming from that user, in situations where this could potentially cause upset. Some types of edit are widely acceptable, and unlikely to cause upset:

* Fixing wiki links, when a page has been [[Help:Moving a page|moved]] or [[Help:Deleting a page|deleted]]
* Fixing broken external links
* Categorizing or fixing categories of user pages.

=== User talk pages ===
Every user page has an associated talk page; a &quot;user talk page&quot;. This is a special kind of talk page, for leaving messages directed at a particular user. See [[Help:Talk pages#User Talk pages]].

== External Links ==
{{meta|User page}}

{{Languages|Help:User page}}

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>221</id>
      <timestamp>2008-02-18T20:13:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">A '''user page''' is a page about a wiki user; someone who registered on the wiki, and is (most probably) a contributor. If you have registered, you can create your own user page. Your user page is linked in the top right. More importantly, others will see links to your user page from various places which assist wiki collaboration. This includes the 'Recent changes' and page 'history' displays (See [[Help:Tracking changes]]). You can also link to your user page within text of a wiki page, which is mainly useful on [[Help:Talk pages|talk pages]] when you sign your name.

== What to put on your user page ==
User pages are just as flexible as any other wiki page, and it's a page all about you, so generally people will leave you to freely write your user page in whatever format you like. Think of it as a 'profile' page. It's a feature to help other people know who you are, and to bring the online community closer together. You might like to mention where you are from and what your job is. You can also state what your main areas of interest are in relation to the topic of the wiki, and describe contributions you have made or are areas where you are interested in contributing.

=== User scratchpad / development area ===
You can use your user page as a scratchpad. An area for developing ideas without cluttering the main namespace. If subpages are enabled (See [[Help:Subpages]]), you may find them useful for creating sub pages under you user page. However you should avoid expending too much effort within your own area of the wiki. Be bold! Edit the main wiki articles! You can also use the shared [[Project:Sandbox|Sandbox]] page for quick (non-permanent) wiki experimentation.

== Other people's user pages ==

As mentioned above, you will see links to other people's user pages, in various places throughout the wiki.

=== User Contributions ===
When viewing another person's user page, an additional link &quot;''user contributions''&quot; appears in the 'toolbox' area (bottom left). This takes you to a list of all of this user's wiki edits. Use this to get an idea of how prolific a contributor somebody is, or to track down edits made by a user who is causing trouble/making bad wiki edits.

=== Editing someone else's page ===
It's generally considered bad etiquette to rewrite or reword another person's user page. Editing is not disallowed, but you should avoid adding information (or especially opinions) which might be misinterpreted as coming from that user, in situations where this could potentially cause upset. Some types of edit are widely acceptable, and unlikely to cause upset:

* Fixing wiki links, when a page has been [[Help:Moving a page|moved]] or [[Help:Deleting a page|deleted]]
* Fixing broken external links
* Categorizing or fixing categories of user pages.

=== User talk pages ===
Every user page has an associated talk page; a &quot;user talk page&quot;. This is a special kind of talk page, for leaving messages directed at a particular user. See [[Help:Talk pages#User Talk pages]].


[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34519</id>
      <timestamp>2009-07-01T04:01:02Z</timestamp>
      <contributor>
        <ip>146.83.8.31</ip>
      </contributor>
      <comment>/* What to put on your user page */</comment>
      <text xml:space="preserve">A '''user page''' is a page about a wiki user; someone who registered on the wiki, and is (most probably) a contributor. If you have registered, you can create your own user page. Your user page is linked in the top right. More importantly, others will see links to your user page from various places which assist wiki collaboration. This includes the 'Recent changes' and page 'history' displays (See [[Help:Tracking changes]]). You can also link to your user page within text of a wiki page, which is mainly useful on [[Help:Talk pages|talk pages]] when you sign your name.

Zna68e  &lt;a href=&quot;http://rndufaqybnmn.com/&quot;&gt;rndufaqybnmn&lt;/a&gt;, [url=http://mlctkqeiphga.com/]mlctkqeiphga[/url], [link=http://lpjngodefvlg.com/]lpjngodefvlg[/link], http://vsyglxxzegmh.com/

== Other people's user pages ==

As mentioned above, you will see links to other people's user pages, in various places throughout the wiki.

=== User Contributions ===
When viewing another person's user page, an additional link &quot;''user contributions''&quot; appears in the 'toolbox' area (bottom left). This takes you to a list of all of this user's wiki edits. Use this to get an idea of how prolific a contributor somebody is, or to track down edits made by a user who is causing trouble/making bad wiki edits.

=== Editing someone else's page ===
It's generally considered bad etiquette to rewrite or reword another person's user page. Editing is not disallowed, but you should avoid adding information (or especially opinions) which might be misinterpreted as coming from that user, in situations where this could potentially cause upset. Some types of edit are widely acceptable, and unlikely to cause upset:

* Fixing wiki links, when a page has been [[Help:Moving a page|moved]] or [[Help:Deleting a page|deleted]]
* Fixing broken external links
* Categorizing or fixing categories of user pages.

=== User talk pages ===
Every user page has an associated talk page; a &quot;user talk page&quot;. This is a special kind of talk page, for leaving messages directed at a particular user. See [[Help:Talk pages#User Talk pages]].


[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34520</id>
      <timestamp>2009-07-01T22:25:07Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/146.83.8.31|146.83.8.31]] ([[User talk:146.83.8.31|Talk]]) to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">A '''user page''' is a page about a wiki user; someone who registered on the wiki, and is (most probably) a contributor. If you have registered, you can create your own user page. Your user page is linked in the top right. More importantly, others will see links to your user page from various places which assist wiki collaboration. This includes the 'Recent changes' and page 'history' displays (See [[Help:Tracking changes]]). You can also link to your user page within text of a wiki page, which is mainly useful on [[Help:Talk pages|talk pages]] when you sign your name.

== What to put on your user page ==
User pages are just as flexible as any other wiki page, and it's a page all about you, so generally people will leave you to freely write your user page in whatever format you like. Think of it as a 'profile' page. It's a feature to help other people know who you are, and to bring the online community closer together. You might like to mention where you are from and what your job is. You can also state what your main areas of interest are in relation to the topic of the wiki, and describe contributions you have made or are areas where you are interested in contributing.

=== User scratchpad / development area ===
You can use your user page as a scratchpad. An area for developing ideas without cluttering the main namespace. If subpages are enabled (See [[Help:Subpages]]), you may find them useful for creating sub pages under you user page. However you should avoid expending too much effort within your own area of the wiki. Be bold! Edit the main wiki articles! You can also use the shared [[Project:Sandbox|Sandbox]] page for quick (non-permanent) wiki experimentation.

== Other people's user pages ==

As mentioned above, you will see links to other people's user pages, in various places throughout the wiki.

=== User Contributions ===
When viewing another person's user page, an additional link &quot;''user contributions''&quot; appears in the 'toolbox' area (bottom left). This takes you to a list of all of this user's wiki edits. Use this to get an idea of how prolific a contributor somebody is, or to track down edits made by a user who is causing trouble/making bad wiki edits.

=== Editing someone else's page ===
It's generally considered bad etiquette to rewrite or reword another person's user page. Editing is not disallowed, but you should avoid adding information (or especially opinions) which might be misinterpreted as coming from that user, in situations where this could potentially cause upset. Some types of edit are widely acceptable, and unlikely to cause upset:

* Fixing wiki links, when a page has been [[Help:Moving a page|moved]] or [[Help:Deleting a page|deleted]]
* Fixing broken external links
* Categorizing or fixing categories of user pages.

=== User talk pages ===
Every user page has an associated talk page; a &quot;user talk page&quot;. This is a special kind of talk page, for leaving messages directed at a particular user. See [[Help:Talk pages#User Talk pages]].


[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Help:Variables</title>
    <id>50</id>
    <revision>
      <id>120</id>
      <timestamp>2008-01-30T20:03:25Z</timestamp>
      <contributor>
        <ip>163.231.6.65</ip>
      </contributor>
      <text xml:space="preserve">{{PD Help Page}}

MediaWiki '''variables''' are strings of text that output information such as time, site details, or page names.

==Parsing==
The syntax of most variables is similar to [[Help:Templates|templates]], but capitalized to help avoid conflicts. If a template has the same name and case as a variable, the variable will be used. Usage of the template can be forced by adding the &quot;msg:&quot; modifier (for example, &quot;&lt;code&gt;&lt;nowiki&gt;{{msg:CURRENTYEAR}}&lt;/nowiki&gt;&lt;/code&gt;&quot;).

Page-dependent variables will return data about the currently-viewed page, regardless of whether the variable is in the page code or a transcluded template.

==Variables==
===Date &amp; time===
The following variables return the current date and time according to the user's timezone [[Special:Preferences|preferences]], defaulting to the UTC timezone.

Due to MediaWiki and browser caching, these variables frequently show when the page was ''cached'' rather than the current time.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
|colspan=&quot;3&quot;| '''Year'''
|-
| &lt;nowiki&gt;{{CURRENTYEAR}}&lt;/nowiki&gt;
| {{CURRENTYEAR}}
| Year
|-
|colspan=&quot;3&quot;| '''Month'''
|-

| &lt;nowiki&gt;{{CURRENTMONTH}}&lt;/nowiki&gt; 
| {{CURRENTMONTH}}
| Month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAME}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAME}}
| Month (name)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAMEGEN}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAMEGEN}}
| Month ([http://en.wikipedia.org/wiki/genitive genitive form])
|-
| &lt;nowiki&gt;{{CURRENTMONTHABBREV}}&lt;/nowiki&gt;
| {{CURRENTMONTHABBREV}}
| Month (abbreviation)
|-
|colspan=&quot;3&quot;| '''Day'''
|-
| &lt;nowiki&gt;{{CURRENTDAY}}&lt;/nowiki&gt;
| {{CURRENTDAY}}
| Day of the month (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAY2}}&lt;/nowiki&gt;
| {{CURRENTDAY2}}
| Day of the month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTDOW}}&lt;/nowiki&gt;
| {{CURRENTDOW}}
| Day of the week (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAYNAME}}&lt;/nowiki&gt;
| {{CURRENTDAYNAME}}
| Day of the week (name)
|-
|colspan=&quot;3&quot;| '''Time'''
|-
| &lt;nowiki&gt;{{CURRENTTIME}}&lt;/nowiki&gt;
| {{CURRENTTIME}}
| Time (24-hour HH:mm format)
|-
| &lt;nowiki&gt;{{CURRENTHOUR}}&lt;/nowiki&gt;
| {{CURRENTHOUR}}
| Hour (24-hour zero-padded number)
|-
|colspan=&quot;3&quot;| '''Other'''
|-
| &lt;nowiki&gt;{{CURRENTWEEK}}&lt;/nowiki&gt;
| {{CURRENTWEEK}}
| Week (number)
|-
| &lt;nowiki&gt;{{CURRENTTIMESTAMP}}&lt;/nowiki&gt;
| {{CURRENTTIMESTAMP}}
| ISO 8601 time stamp
|}

The following variables do the same as the above, but using the site's local timezone instead of user preferences and UTC:
* &lt;nowiki&gt;{{LOCALYEAR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTH}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHABBREV}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY2}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDOW}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAYNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALHOUR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALWEEK}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIMESTAMP}}&lt;/nowiki&gt;

===Statistics and technical details===
====Site====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SITENAME}}&lt;/nowiki&gt;
| {{SITENAME}}
| Name of the wiki ({{mediawiki|Manual:$wgSitename|$wgSitename}})
|-
| &lt;nowiki&gt;{{CONTENTLANGUAGE}}&lt;/nowiki&gt;
| {{CONTENTLANGUAGE}}
| Default interface language ({{mediawiki|Manual:$wgLanguageCode|$wgLanguageCode}})
|-
| &lt;nowiki&gt;{{NUMBEROFPAGES}}&lt;/nowiki&gt;
| {{NUMBEROFPAGES}}
| Number of wiki pages
|-
| &lt;nowiki&gt;{{NUMBEROFARTICLES}}&lt;/nowiki&gt;
| {{NUMBEROFARTICLES}}
| Number of pages in main namespace
|-
| &lt;nowiki&gt;{{NUMBEROFFILES}}&lt;/nowiki&gt;
| {{NUMBEROFFILES}}
| Number of uploaded files
|}

====Latest revision to a page====
The following variables return data about the '''latest edit to the current page''', even if viewing an older version of the page.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{REVISIONID}}&lt;/nowiki&gt;
| {{REVISIONID}}
| Unique ID
|-
| &lt;nowiki&gt;{{REVISIONDAY}}&lt;/nowiki&gt;
| {{REVISIONDAY}}
| Day edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONDAY2}}&lt;/nowiki&gt;
| {{REVISIONDAY2}}
| Day edit was made (zero-padded number)
|-
| &lt;nowiki&gt;{{REVISIONMONTH}}&lt;/nowiki&gt;
| {{REVISIONMONTH}}
| Month edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONYEAR}}&lt;/nowiki&gt;
| {{REVISIONYEAR}}
| Year edit was made
|-
| &lt;nowiki&gt;{{REVISIONTIMESTAMP}}&lt;/nowiki&gt;
| {{REVISIONTIMESTAMP}}
| Timestamp as of time of edit
|}

===URL data===
====URLs====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SERVER}}&lt;/nowiki&gt;
| {{SERVER}}
| domain URL ({{mediawiki|Manual:$wgServer|$wgServer}})
|-
| &lt;nowiki&gt;{{SERVERNAME}}&lt;/nowiki&gt;
| {{SERVERNAME}}
| domain name ({{mediawiki|Manual:$wgServerName|$wgServerName}})
|-
| &lt;nowiki&gt;{{SCRIPTPATH}}&lt;/nowiki&gt;
| {{SCRIPTPATH}}
| relative script path ({{mediawiki|Manual:$wgScriptPath|$wgScriptPath}})
|-
| &lt;nowiki&gt;{{localurl:&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;}}&lt;/nowiki&gt;&lt;br /&gt;&lt;nowiki&gt;{{localurl:pagename|&lt;/nowiki&gt;''query string''&lt;nowiki&gt;}}&lt;/nowiki&gt;
| {{localurl:pagename}}&lt;br /&gt;{{localurl:pagename|query string}}
| relative path to title
|}

====Page names====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{FULLPAGENAME}}&lt;/nowiki&gt;
| {{FULLPAGENAME}}
| Namespace and page title
|-
| &lt;nowiki&gt;{{BASEPAGENAME}}&lt;/nowiki&gt;
| {{BASEPAGENAME}}
| Page title excluding the current [[Help:subpage|subpage]] and ''without'' the Namespace prepended (&quot;Title&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{PAGENAME}}&lt;/nowiki&gt;
| {{PAGENAME}}
| Page title
|-
| &lt;nowiki&gt;{{SUBPAGENAME}}&lt;/nowiki&gt;
| {{SUBPAGENAME}}
| The [[Help:subpage|subpage]] title (&quot;foo&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{SUBJECTPAGENAME}}&lt;/nowiki&gt;
| {{SUBJECTPAGENAME}}
| The title of the associated content page.
|-
| &lt;nowiki&gt;{{TALKPAGENAME}}&lt;/nowiki&gt;
| {{TALKPAGENAME}}
| The title of the associated talk page.
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{FULLPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{PAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{BASEPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKPAGENAMEE}}&lt;/nowiki&gt;

====Namespaces====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{NAMESPACE}}&lt;/nowiki&gt;
| {{NAMESPACE}}
| Namespace (name)
|-
| &lt;nowiki&gt;{{SUBJECTSPACE}}&lt;/nowiki&gt;
| {{SUBJECTSPACE}}
| Name of the associated content namespace
|-
| &lt;nowiki&gt;{{TALKSPACE}}&lt;/nowiki&gt;
| {{TALKSPACE}}
| Name of the associated talk namespace
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{NAMESPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTSPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKSPACEE}}&lt;/nowiki&gt;

&lt;code&gt;&lt;nowiki&gt;{{ns:}}&lt;/nowiki&gt;&lt;/code&gt; returns the localized namespace name for that number of constant. The default values are:

{| {{prettytable}}
|-
!{{Hl2}}| Usage
!{{Hl2}}| Output
|-
| &lt;nowiki&gt;{{ns:-2}} or {{ns:Media}}&lt;/nowiki&gt;
| {{ns:-2}}
|-
| &lt;nowiki&gt;{{ns:-1}} or {{ns:Special}}&lt;/nowiki&gt;
| {{ns:-1}}
|-
| &lt;nowiki&gt;{{ns:0}} or {{ns:Main}}&lt;/nowiki&gt;
| {{ns:0}}
|-
| &lt;nowiki&gt;{{ns:1}} or {{ns:Talk}}&lt;/nowiki&gt;
| {{ns:1}}
|-
| &lt;nowiki&gt;{{ns:2}} or {{ns:User}}&lt;/nowiki&gt;
| {{ns:2}}
|-
| &lt;nowiki&gt;{{ns:3}} or {{ns:User_talk}}&lt;/nowiki&gt;
| {{ns:3}}
|-
| &lt;nowiki&gt;{{ns:4}} or {{ns:Project}}&lt;/nowiki&gt;
| {{ns:4}}
|-
| &lt;nowiki&gt;{{ns:5}} or {{ns:Project_talk}}&lt;/nowiki&gt;
| {{ns:5}}
|-
| &lt;nowiki&gt;{{ns:6}} or {{ns:Image}}&lt;/nowiki&gt;
| {{ns:6}}
|-
| &lt;nowiki&gt;{{ns:7}} or {{ns:Image_talk}}&lt;/nowiki&gt;
| {{ns:7}}
|-
| &lt;nowiki&gt;{{ns:8}} or {{ns:MediaWiki}}&lt;/nowiki&gt;
| {{ns:8}}
|-
| &lt;nowiki&gt;{{ns:9}} or {{ns:MediaWiki_talk}}&lt;/nowiki&gt;
| {{ns:9}}
|-
| &lt;nowiki&gt;{{ns:10}} or {{ns:Template}}&lt;/nowiki&gt;
| {{ns:10}}
|-
| &lt;nowiki&gt;{{ns:11}} or {{ns:Template_talk}}&lt;/nowiki&gt;
| {{ns:11}}
|-
| &lt;nowiki&gt;{{ns:12}} or {{ns:Help}}&lt;/nowiki&gt;
| {{ns:12}}
|-
| &lt;nowiki&gt;{{ns:13}} or {{ns:Help_talk}}&lt;/nowiki&gt;
| {{ns:13}}
|-
| &lt;nowiki&gt;{{ns:14}} or {{ns:Category}}&lt;/nowiki&gt;
| {{ns:14}}
|-
| &lt;nowiki&gt;{{ns:15}} or {{ns:Category_talk}}&lt;/nowiki&gt;
| {{ns:15}}
|}

== Custom variables ==
MediaWiki also supports custom variables defined as part of extensions or specific to a particular installation.  For example, some installations  might find it helpful to have a variable that identifies the name of the sponsoring organization or the portion of the wiki URL that precedes the title if it is liable to change or more complex than &lt;code&gt;&lt;nowiki&gt;http://{{SERVERNAME}}&lt;/nowiki&gt;&lt;/code&gt;.


For more information, please see {{mediawiki|Manual:Variable}}.

==External links==
{{meta|Help:Variable}}

{{Languages|Help:Variables}}

[[Category:Help|Variables]]</text>
    </revision>
    <revision>
      <id>121</id>
      <timestamp>2008-02-18T18:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>1 revision(s)</comment>
      <text xml:space="preserve">{{PD Help Page}}

MediaWiki '''variables''' are strings of text that output information such as time, site details, or page names.

==Parsing==
The syntax of most variables is similar to [[Help:Templates|templates]], but capitalized to help avoid conflicts. If a template has the same name and case as a variable, the variable will be used. Usage of the template can be forced by adding the &quot;msg:&quot; modifier (for example, &quot;&lt;code&gt;&lt;nowiki&gt;{{msg:CURRENTYEAR}}&lt;/nowiki&gt;&lt;/code&gt;&quot;).

Page-dependent variables will return data about the currently-viewed page, regardless of whether the variable is in the page code or a transcluded template.

==Variables==
===Date &amp; time===
The following variables return the current date and time according to the user's timezone [[Special:Preferences|preferences]], defaulting to the UTC timezone.

Due to MediaWiki and browser caching, these variables frequently show when the page was ''cached'' rather than the current time.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
|colspan=&quot;3&quot;| '''Year'''
|-
| &lt;nowiki&gt;{{CURRENTYEAR}}&lt;/nowiki&gt;
| {{CURRENTYEAR}}
| Year
|-
|colspan=&quot;3&quot;| '''Month'''
|-

| &lt;nowiki&gt;{{CURRENTMONTH}}&lt;/nowiki&gt; 
| {{CURRENTMONTH}}
| Month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAME}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAME}}
| Month (name)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAMEGEN}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAMEGEN}}
| Month ([http://en.wikipedia.org/wiki/genitive genitive form])
|-
| &lt;nowiki&gt;{{CURRENTMONTHABBREV}}&lt;/nowiki&gt;
| {{CURRENTMONTHABBREV}}
| Month (abbreviation)
|-
|colspan=&quot;3&quot;| '''Day'''
|-
| &lt;nowiki&gt;{{CURRENTDAY}}&lt;/nowiki&gt;
| {{CURRENTDAY}}
| Day of the month (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAY2}}&lt;/nowiki&gt;
| {{CURRENTDAY2}}
| Day of the month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTDOW}}&lt;/nowiki&gt;
| {{CURRENTDOW}}
| Day of the week (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAYNAME}}&lt;/nowiki&gt;
| {{CURRENTDAYNAME}}
| Day of the week (name)
|-
|colspan=&quot;3&quot;| '''Time'''
|-
| &lt;nowiki&gt;{{CURRENTTIME}}&lt;/nowiki&gt;
| {{CURRENTTIME}}
| Time (24-hour HH:mm format)
|-
| &lt;nowiki&gt;{{CURRENTHOUR}}&lt;/nowiki&gt;
| {{CURRENTHOUR}}
| Hour (24-hour zero-padded number)
|-
|colspan=&quot;3&quot;| '''Other'''
|-
| &lt;nowiki&gt;{{CURRENTWEEK}}&lt;/nowiki&gt;
| {{CURRENTWEEK}}
| Week (number)
|-
| &lt;nowiki&gt;{{CURRENTTIMESTAMP}}&lt;/nowiki&gt;
| {{CURRENTTIMESTAMP}}
| ISO 8601 time stamp
|}

The following variables do the same as the above, but using the site's local timezone instead of user preferences and UTC:
* &lt;nowiki&gt;{{LOCALYEAR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTH}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHABBREV}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY2}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDOW}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAYNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALHOUR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALWEEK}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIMESTAMP}}&lt;/nowiki&gt;

===Statistics and technical details===
====Site====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SITENAME}}&lt;/nowiki&gt;
| {{SITENAME}}
| Name of the wiki ({{mediawiki|Manual:$wgSitename|$wgSitename}})
|-
| &lt;nowiki&gt;{{CONTENTLANGUAGE}}&lt;/nowiki&gt;
| {{CONTENTLANGUAGE}}
| Default interface language ({{mediawiki|Manual:$wgLanguageCode|$wgLanguageCode}})
|-
| &lt;nowiki&gt;{{NUMBEROFPAGES}}&lt;/nowiki&gt;
| {{NUMBEROFPAGES}}
| Number of wiki pages
|-
| &lt;nowiki&gt;{{NUMBEROFARTICLES}}&lt;/nowiki&gt;
| {{NUMBEROFARTICLES}}
| Number of pages in main namespace
|-
| &lt;nowiki&gt;{{NUMBEROFFILES}}&lt;/nowiki&gt;
| {{NUMBEROFFILES}}
| Number of uploaded files
|}

====Latest revision to a page====
The following variables return data about the '''latest edit to the current page''', even if viewing an older version of the page.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{REVISIONID}}&lt;/nowiki&gt;
| {{REVISIONID}}
| Unique ID
|-
| &lt;nowiki&gt;{{REVISIONDAY}}&lt;/nowiki&gt;
| {{REVISIONDAY}}
| Day edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONDAY2}}&lt;/nowiki&gt;
| {{REVISIONDAY2}}
| Day edit was made (zero-padded number)
|-
| &lt;nowiki&gt;{{REVISIONMONTH}}&lt;/nowiki&gt;
| {{REVISIONMONTH}}
| Month edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONYEAR}}&lt;/nowiki&gt;
| {{REVISIONYEAR}}
| Year edit was made
|-
| &lt;nowiki&gt;{{REVISIONTIMESTAMP}}&lt;/nowiki&gt;
| {{REVISIONTIMESTAMP}}
| Timestamp as of time of edit
|}

===URL data===
====URLs====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SERVER}}&lt;/nowiki&gt;
| {{SERVER}}
| domain URL ({{mediawiki|Manual:$wgServer|$wgServer}})
|-
| &lt;nowiki&gt;{{SERVERNAME}}&lt;/nowiki&gt;
| {{SERVERNAME}}
| domain name ({{mediawiki|Manual:$wgServerName|$wgServerName}})
|-
| &lt;nowiki&gt;{{SCRIPTPATH}}&lt;/nowiki&gt;
| {{SCRIPTPATH}}
| relative script path ({{mediawiki|Manual:$wgScriptPath|$wgScriptPath}})
|-
| &lt;nowiki&gt;{{localurl:&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;}}&lt;/nowiki&gt;&lt;br /&gt;&lt;nowiki&gt;{{localurl:pagename|&lt;/nowiki&gt;''query string''&lt;nowiki&gt;}}&lt;/nowiki&gt;
| {{localurl:pagename}}&lt;br /&gt;{{localurl:pagename|query string}}
| relative path to title
|}

====Page names====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{FULLPAGENAME}}&lt;/nowiki&gt;
| {{FULLPAGENAME}}
| Namespace and page title
|-
| &lt;nowiki&gt;{{BASEPAGENAME}}&lt;/nowiki&gt;
| {{BASEPAGENAME}}
| Page title excluding the current [[Help:subpage|subpage]] and ''without'' the Namespace prepended (&quot;Title&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{PAGENAME}}&lt;/nowiki&gt;
| {{PAGENAME}}
| Page title
|-
| &lt;nowiki&gt;{{SUBPAGENAME}}&lt;/nowiki&gt;
| {{SUBPAGENAME}}
| The [[Help:subpage|subpage]] title (&quot;foo&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{SUBJECTPAGENAME}}&lt;/nowiki&gt;
| {{SUBJECTPAGENAME}}
| The title of the associated content page.
|-
| &lt;nowiki&gt;{{TALKPAGENAME}}&lt;/nowiki&gt;
| {{TALKPAGENAME}}
| The title of the associated talk page.
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{FULLPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{PAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{BASEPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKPAGENAMEE}}&lt;/nowiki&gt;

====Namespaces====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{NAMESPACE}}&lt;/nowiki&gt;
| {{NAMESPACE}}
| Namespace (name)
|-
| &lt;nowiki&gt;{{SUBJECTSPACE}}&lt;/nowiki&gt;
| {{SUBJECTSPACE}}
| Name of the associated content namespace
|-
| &lt;nowiki&gt;{{TALKSPACE}}&lt;/nowiki&gt;
| {{TALKSPACE}}
| Name of the associated talk namespace
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{NAMESPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTSPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKSPACEE}}&lt;/nowiki&gt;

&lt;code&gt;&lt;nowiki&gt;{{ns:}}&lt;/nowiki&gt;&lt;/code&gt; returns the localized namespace name for that number of constant. The default values are:

{| {{prettytable}}
|-
!{{Hl2}}| Usage
!{{Hl2}}| Output
|-
| &lt;nowiki&gt;{{ns:-2}} or {{ns:Media}}&lt;/nowiki&gt;
| {{ns:-2}}
|-
| &lt;nowiki&gt;{{ns:-1}} or {{ns:Special}}&lt;/nowiki&gt;
| {{ns:-1}}
|-
| &lt;nowiki&gt;{{ns:0}} or {{ns:Main}}&lt;/nowiki&gt;
| {{ns:0}}
|-
| &lt;nowiki&gt;{{ns:1}} or {{ns:Talk}}&lt;/nowiki&gt;
| {{ns:1}}
|-
| &lt;nowiki&gt;{{ns:2}} or {{ns:User}}&lt;/nowiki&gt;
| {{ns:2}}
|-
| &lt;nowiki&gt;{{ns:3}} or {{ns:User_talk}}&lt;/nowiki&gt;
| {{ns:3}}
|-
| &lt;nowiki&gt;{{ns:4}} or {{ns:Project}}&lt;/nowiki&gt;
| {{ns:4}}
|-
| &lt;nowiki&gt;{{ns:5}} or {{ns:Project_talk}}&lt;/nowiki&gt;
| {{ns:5}}
|-
| &lt;nowiki&gt;{{ns:6}} or {{ns:Image}}&lt;/nowiki&gt;
| {{ns:6}}
|-
| &lt;nowiki&gt;{{ns:7}} or {{ns:Image_talk}}&lt;/nowiki&gt;
| {{ns:7}}
|-
| &lt;nowiki&gt;{{ns:8}} or {{ns:MediaWiki}}&lt;/nowiki&gt;
| {{ns:8}}
|-
| &lt;nowiki&gt;{{ns:9}} or {{ns:MediaWiki_talk}}&lt;/nowiki&gt;
| {{ns:9}}
|-
| &lt;nowiki&gt;{{ns:10}} or {{ns:Template}}&lt;/nowiki&gt;
| {{ns:10}}
|-
| &lt;nowiki&gt;{{ns:11}} or {{ns:Template_talk}}&lt;/nowiki&gt;
| {{ns:11}}
|-
| &lt;nowiki&gt;{{ns:12}} or {{ns:Help}}&lt;/nowiki&gt;
| {{ns:12}}
|-
| &lt;nowiki&gt;{{ns:13}} or {{ns:Help_talk}}&lt;/nowiki&gt;
| {{ns:13}}
|-
| &lt;nowiki&gt;{{ns:14}} or {{ns:Category}}&lt;/nowiki&gt;
| {{ns:14}}
|-
| &lt;nowiki&gt;{{ns:15}} or {{ns:Category_talk}}&lt;/nowiki&gt;
| {{ns:15}}
|}

== Custom variables ==
MediaWiki also supports custom variables defined as part of extensions or specific to a particular installation.  For example, some installations  might find it helpful to have a variable that identifies the name of the sponsoring organization or the portion of the wiki URL that precedes the title if it is liable to change or more complex than &lt;code&gt;&lt;nowiki&gt;http://{{SERVERNAME}}&lt;/nowiki&gt;&lt;/code&gt;.


For more information, please see {{mediawiki|Manual:Variable}}.

==External links==
{{meta|Help:Variable}}

{{Languages|Help:Variables}}

[[Category:Help|Variables]]</text>
    </revision>
    <revision>
      <id>207</id>
      <timestamp>2008-02-18T19:46:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">MediaWiki '''variables''' are strings of text that output information such as time, site details, or page names.

==Parsing==
The syntax of most variables is similar to [[Help:Templates|templates]], but capitalized to help avoid conflicts. If a template has the same name and case as a variable, the variable will be used. Usage of the template can be forced by adding the &quot;msg:&quot; modifier (for example, &quot;&lt;code&gt;&lt;nowiki&gt;{{msg:CURRENTYEAR}}&lt;/nowiki&gt;&lt;/code&gt;&quot;).

Page-dependent variables will return data about the currently-viewed page, regardless of whether the variable is in the page code or a transcluded template.

==Variables==
===Date &amp; time===
The following variables return the current date and time according to the user's timezone [[Special:Preferences|preferences]], defaulting to the UTC timezone.

Due to MediaWiki and browser caching, these variables frequently show when the page was ''cached'' rather than the current time.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
|colspan=&quot;3&quot;| '''Year'''
|-
| &lt;nowiki&gt;{{CURRENTYEAR}}&lt;/nowiki&gt;
| {{CURRENTYEAR}}
| Year
|-
|colspan=&quot;3&quot;| '''Month'''
|-

| &lt;nowiki&gt;{{CURRENTMONTH}}&lt;/nowiki&gt; 
| {{CURRENTMONTH}}
| Month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAME}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAME}}
| Month (name)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAMEGEN}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAMEGEN}}
| Month ([http://en.wikipedia.org/wiki/genitive genitive form])
|-
| &lt;nowiki&gt;{{CURRENTMONTHABBREV}}&lt;/nowiki&gt;
| {{CURRENTMONTHABBREV}}
| Month (abbreviation)
|-
|colspan=&quot;3&quot;| '''Day'''
|-
| &lt;nowiki&gt;{{CURRENTDAY}}&lt;/nowiki&gt;
| {{CURRENTDAY}}
| Day of the month (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAY2}}&lt;/nowiki&gt;
| {{CURRENTDAY2}}
| Day of the month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTDOW}}&lt;/nowiki&gt;
| {{CURRENTDOW}}
| Day of the week (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAYNAME}}&lt;/nowiki&gt;
| {{CURRENTDAYNAME}}
| Day of the week (name)
|-
|colspan=&quot;3&quot;| '''Time'''
|-
| &lt;nowiki&gt;{{CURRENTTIME}}&lt;/nowiki&gt;
| {{CURRENTTIME}}
| Time (24-hour HH:mm format)
|-
| &lt;nowiki&gt;{{CURRENTHOUR}}&lt;/nowiki&gt;
| {{CURRENTHOUR}}
| Hour (24-hour zero-padded number)
|-
|colspan=&quot;3&quot;| '''Other'''
|-
| &lt;nowiki&gt;{{CURRENTWEEK}}&lt;/nowiki&gt;
| {{CURRENTWEEK}}
| Week (number)
|-
| &lt;nowiki&gt;{{CURRENTTIMESTAMP}}&lt;/nowiki&gt;
| {{CURRENTTIMESTAMP}}
| ISO 8601 time stamp
|}

The following variables do the same as the above, but using the site's local timezone instead of user preferences and UTC:
* &lt;nowiki&gt;{{LOCALYEAR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTH}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHABBREV}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY2}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDOW}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAYNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALHOUR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALWEEK}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIMESTAMP}}&lt;/nowiki&gt;

===Statistics and technical details===
====Site====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SITENAME}}&lt;/nowiki&gt;
| {{SITENAME}}
| Name of the wiki ({{mediawiki|Manual:$wgSitename|$wgSitename}})
|-
| &lt;nowiki&gt;{{CONTENTLANGUAGE}}&lt;/nowiki&gt;
| {{CONTENTLANGUAGE}}
| Default interface language ({{mediawiki|Manual:$wgLanguageCode|$wgLanguageCode}})
|-
| &lt;nowiki&gt;{{NUMBEROFPAGES}}&lt;/nowiki&gt;
| {{NUMBEROFPAGES}}
| Number of wiki pages
|-
| &lt;nowiki&gt;{{NUMBEROFARTICLES}}&lt;/nowiki&gt;
| {{NUMBEROFARTICLES}}
| Number of pages in main namespace
|-
| &lt;nowiki&gt;{{NUMBEROFFILES}}&lt;/nowiki&gt;
| {{NUMBEROFFILES}}
| Number of uploaded files
|}

====Latest revision to a page====
The following variables return data about the '''latest edit to the current page''', even if viewing an older version of the page.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{REVISIONID}}&lt;/nowiki&gt;
| {{REVISIONID}}
| Unique ID
|-
| &lt;nowiki&gt;{{REVISIONDAY}}&lt;/nowiki&gt;
| {{REVISIONDAY}}
| Day edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONDAY2}}&lt;/nowiki&gt;
| {{REVISIONDAY2}}
| Day edit was made (zero-padded number)
|-
| &lt;nowiki&gt;{{REVISIONMONTH}}&lt;/nowiki&gt;
| {{REVISIONMONTH}}
| Month edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONYEAR}}&lt;/nowiki&gt;
| {{REVISIONYEAR}}
| Year edit was made
|-
| &lt;nowiki&gt;{{REVISIONTIMESTAMP}}&lt;/nowiki&gt;
| {{REVISIONTIMESTAMP}}
| Timestamp as of time of edit
|}

===URL data===
====URLs====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SERVER}}&lt;/nowiki&gt;
| {{SERVER}}
| domain URL ({{mediawiki|Manual:$wgServer|$wgServer}})
|-
| &lt;nowiki&gt;{{SERVERNAME}}&lt;/nowiki&gt;
| {{SERVERNAME}}
| domain name ({{mediawiki|Manual:$wgServerName|$wgServerName}})
|-
| &lt;nowiki&gt;{{SCRIPTPATH}}&lt;/nowiki&gt;
| {{SCRIPTPATH}}
| relative script path ({{mediawiki|Manual:$wgScriptPath|$wgScriptPath}})
|-
| &lt;nowiki&gt;{{localurl:&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;}}&lt;/nowiki&gt;&lt;br /&gt;&lt;nowiki&gt;{{localurl:pagename|&lt;/nowiki&gt;''query string''&lt;nowiki&gt;}}&lt;/nowiki&gt;
| {{localurl:pagename}}&lt;br /&gt;{{localurl:pagename|query string}}
| relative path to title
|}

====Page names====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{FULLPAGENAME}}&lt;/nowiki&gt;
| {{FULLPAGENAME}}
| Namespace and page title
|-
| &lt;nowiki&gt;{{BASEPAGENAME}}&lt;/nowiki&gt;
| {{BASEPAGENAME}}
| Page title excluding the current [[Help:subpages|subpage]] and ''without'' the Namespace prepended (&quot;Title&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{PAGENAME}}&lt;/nowiki&gt;
| {{PAGENAME}}
| Page title
|-
| &lt;nowiki&gt;{{SUBPAGENAME}}&lt;/nowiki&gt;
| {{SUBPAGENAME}}
| The [[Help:subpages|subpage]] title (&quot;foo&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{SUBJECTPAGENAME}}&lt;/nowiki&gt;
| {{SUBJECTPAGENAME}}
| The title of the associated content page.
|-
| &lt;nowiki&gt;{{TALKPAGENAME}}&lt;/nowiki&gt;
| {{TALKPAGENAME}}
| The title of the associated talk page.
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{FULLPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{PAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{BASEPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKPAGENAMEE}}&lt;/nowiki&gt;

====Namespaces====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{NAMESPACE}}&lt;/nowiki&gt;
| {{NAMESPACE}}
| Namespace (name)
|-
| &lt;nowiki&gt;{{SUBJECTSPACE}}&lt;/nowiki&gt;
| {{SUBJECTSPACE}}
| Name of the associated content namespace
|-
| &lt;nowiki&gt;{{TALKSPACE}}&lt;/nowiki&gt;
| {{TALKSPACE}}
| Name of the associated talk namespace
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{NAMESPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTSPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKSPACEE}}&lt;/nowiki&gt;

&lt;code&gt;&lt;nowiki&gt;{{ns:}}&lt;/nowiki&gt;&lt;/code&gt; returns the localized namespace name for that number of constant. The default values are:

{| {{prettytable}}
|-
!{{Hl2}}| Usage
!{{Hl2}}| Output
|-
| &lt;nowiki&gt;{{ns:-2}} or {{ns:Media}}&lt;/nowiki&gt;
| {{ns:-2}}
|-
| &lt;nowiki&gt;{{ns:-1}} or {{ns:Special}}&lt;/nowiki&gt;
| {{ns:-1}}
|-
| &lt;nowiki&gt;{{ns:0}} or {{ns:Main}}&lt;/nowiki&gt;
| {{ns:0}}
|-
| &lt;nowiki&gt;{{ns:1}} or {{ns:Talk}}&lt;/nowiki&gt;
| {{ns:1}}
|-
| &lt;nowiki&gt;{{ns:2}} or {{ns:User}}&lt;/nowiki&gt;
| {{ns:2}}
|-
| &lt;nowiki&gt;{{ns:3}} or {{ns:User_talk}}&lt;/nowiki&gt;
| {{ns:3}}
|-
| &lt;nowiki&gt;{{ns:4}} or {{ns:Project}}&lt;/nowiki&gt;
| {{ns:4}}
|-
| &lt;nowiki&gt;{{ns:5}} or {{ns:Project_talk}}&lt;/nowiki&gt;
| {{ns:5}}
|-
| &lt;nowiki&gt;{{ns:6}} or {{ns:Image}}&lt;/nowiki&gt;
| {{ns:6}}
|-
| &lt;nowiki&gt;{{ns:7}} or {{ns:Image_talk}}&lt;/nowiki&gt;
| {{ns:7}}
|-
| &lt;nowiki&gt;{{ns:8}} or {{ns:MediaWiki}}&lt;/nowiki&gt;
| {{ns:8}}
|-
| &lt;nowiki&gt;{{ns:9}} or {{ns:MediaWiki_talk}}&lt;/nowiki&gt;
| {{ns:9}}
|-
| &lt;nowiki&gt;{{ns:10}} or {{ns:Template}}&lt;/nowiki&gt;
| {{ns:10}}
|-
| &lt;nowiki&gt;{{ns:11}} or {{ns:Template_talk}}&lt;/nowiki&gt;
| {{ns:11}}
|-
| &lt;nowiki&gt;{{ns:12}} or {{ns:Help}}&lt;/nowiki&gt;
| {{ns:12}}
|-
| &lt;nowiki&gt;{{ns:13}} or {{ns:Help_talk}}&lt;/nowiki&gt;
| {{ns:13}}
|-
| &lt;nowiki&gt;{{ns:14}} or {{ns:Category}}&lt;/nowiki&gt;
| {{ns:14}}
|-
| &lt;nowiki&gt;{{ns:15}} or {{ns:Category_talk}}&lt;/nowiki&gt;
| {{ns:15}}
|}

== Custom variables ==
MediaWiki also supports custom variables defined as part of extensions or specific to a particular installation.  For example, some installations  might find it helpful to have a variable that identifies the name of the sponsoring organization or the portion of the wiki URL that precedes the title if it is liable to change or more complex than &lt;code&gt;&lt;nowiki&gt;http://{{SERVERNAME}}&lt;/nowiki&gt;&lt;/code&gt;.


For more information, please see {{mediawiki|Manual:Variable}}.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33541</id>
      <timestamp>2008-12-05T03:25:09Z</timestamp>
      <contributor>
        <username>CalibOmonc</username>
        <id>1699</id>
      </contributor>
      <comment>dartaacelou</comment>
      <text xml:space="preserve">alerdomsi
MediaWiki '''variables''' are strings of text that output information such as time, site details, or page names.

==Parsing==
The syntax of most variables is similar to [[Help:Templates|templates]], but capitalized to help avoid conflicts. If a template has the same name and case as a variable, the variable will be used. Usage of the template can be forced by adding the &quot;msg:&quot; modifier (for example, &quot;&lt;code&gt;&lt;nowiki&gt;{{msg:CURRENTYEAR}}&lt;/nowiki&gt;&lt;/code&gt;&quot;).

Page-dependent variables will return data about the currently-viewed page, regardless of whether the variable is in the page code or a transcluded template.

==Variables==
===Date &amp; time===
The following variables return the current date and time according to the user's timezone [[Special:Preferences|preferences]], defaulting to the UTC timezone.

Due to MediaWiki and browser caching, these variables frequently show when the page was ''cached'' rather than the current time.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
|colspan=&quot;3&quot;| '''Year'''
|-
| &lt;nowiki&gt;{{CURRENTYEAR}}&lt;/nowiki&gt;
| {{CURRENTYEAR}}
| Year
|-
|colspan=&quot;3&quot;| '''Month'''
|-

| &lt;nowiki&gt;{{CURRENTMONTH}}&lt;/nowiki&gt; 
| {{CURRENTMONTH}}
| Month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAME}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAME}}
| Month (name)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAMEGEN}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAMEGEN}}
| Month ([http://en.wikipedia.org/wiki/genitive genitive form])
|-
| &lt;nowiki&gt;{{CURRENTMONTHABBREV}}&lt;/nowiki&gt;
| {{CURRENTMONTHABBREV}}
| Month (abbreviation)
|-
|colspan=&quot;3&quot;| '''Day'''
|-
| &lt;nowiki&gt;{{CURRENTDAY}}&lt;/nowiki&gt;
| {{CURRENTDAY}}
| Day of the month (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAY2}}&lt;/nowiki&gt;
| {{CURRENTDAY2}}
| Day of the month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTDOW}}&lt;/nowiki&gt;
| {{CURRENTDOW}}
| Day of the week (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAYNAME}}&lt;/nowiki&gt;
| {{CURRENTDAYNAME}}
| Day of the week (name)
|-
|colspan=&quot;3&quot;| '''Time'''
|-
| &lt;nowiki&gt;{{CURRENTTIME}}&lt;/nowiki&gt;
| {{CURRENTTIME}}
| Time (24-hour HH:mm format)
|-
| &lt;nowiki&gt;{{CURRENTHOUR}}&lt;/nowiki&gt;
| {{CURRENTHOUR}}
| Hour (24-hour zero-padded number)
|-
|colspan=&quot;3&quot;| '''Other'''
|-
| &lt;nowiki&gt;{{CURRENTWEEK}}&lt;/nowiki&gt;
| {{CURRENTWEEK}}
| Week (number)
|-
| &lt;nowiki&gt;{{CURRENTTIMESTAMP}}&lt;/nowiki&gt;
| {{CURRENTTIMESTAMP}}
| ISO 8601 time stamp
|}

The following variables do the same as the above, but using the site's local timezone instead of user preferences and UTC:
* &lt;nowiki&gt;{{LOCALYEAR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTH}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHABBREV}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY2}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDOW}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAYNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALHOUR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALWEEK}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIMESTAMP}}&lt;/nowiki&gt;

===Statistics and technical details===
====Site====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SITENAME}}&lt;/nowiki&gt;
| {{SITENAME}}
| Name of the wiki ({{mediawiki|Manual:$wgSitename|$wgSitename}})
|-
| &lt;nowiki&gt;{{CONTENTLANGUAGE}}&lt;/nowiki&gt;
| {{CONTENTLANGUAGE}}
| Default interface language ({{mediawiki|Manual:$wgLanguageCode|$wgLanguageCode}})
|-
| &lt;nowiki&gt;{{NUMBEROFPAGES}}&lt;/nowiki&gt;
| {{NUMBEROFPAGES}}
| Number of wiki pages
|-
| &lt;nowiki&gt;{{NUMBEROFARTICLES}}&lt;/nowiki&gt;
| {{NUMBEROFARTICLES}}
| Number of pages in main namespace
|-
| &lt;nowiki&gt;{{NUMBEROFFILES}}&lt;/nowiki&gt;
| {{NUMBEROFFILES}}
| Number of uploaded files
|}

====Latest revision to a page====
The following variables return data about the '''latest edit to the current page''', even if viewing an older version of the page.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{REVISIONID}}&lt;/nowiki&gt;
| {{REVISIONID}}
| Unique ID
|-
| &lt;nowiki&gt;{{REVISIONDAY}}&lt;/nowiki&gt;
| {{REVISIONDAY}}
| Day edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONDAY2}}&lt;/nowiki&gt;
| {{REVISIONDAY2}}
| Day edit was made (zero-padded number)
|-
| &lt;nowiki&gt;{{REVISIONMONTH}}&lt;/nowiki&gt;
| {{REVISIONMONTH}}
| Month edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONYEAR}}&lt;/nowiki&gt;
| {{REVISIONYEAR}}
| Year edit was made
|-
| &lt;nowiki&gt;{{REVISIONTIMESTAMP}}&lt;/nowiki&gt;
| {{REVISIONTIMESTAMP}}
| Timestamp as of time of edit
|}

===URL data===
====URLs====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SERVER}}&lt;/nowiki&gt;
| {{SERVER}}
| domain URL ({{mediawiki|Manual:$wgServer|$wgServer}})
|-
| &lt;nowiki&gt;{{SERVERNAME}}&lt;/nowiki&gt;
| {{SERVERNAME}}
| domain name ({{mediawiki|Manual:$wgServerName|$wgServerName}})
|-
| &lt;nowiki&gt;{{SCRIPTPATH}}&lt;/nowiki&gt;
| {{SCRIPTPATH}}
| relative script path ({{mediawiki|Manual:$wgScriptPath|$wgScriptPath}})
|-
| &lt;nowiki&gt;{{localurl:&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;}}&lt;/nowiki&gt;&lt;br /&gt;&lt;nowiki&gt;{{localurl:pagename|&lt;/nowiki&gt;''query string''&lt;nowiki&gt;}}&lt;/nowiki&gt;
| {{localurl:pagename}}&lt;br /&gt;{{localurl:pagename|query string}}
| relative path to title
|}

====Page names====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{FULLPAGENAME}}&lt;/nowiki&gt;
| {{FULLPAGENAME}}
| Namespace and page title
|-
| &lt;nowiki&gt;{{BASEPAGENAME}}&lt;/nowiki&gt;
| {{BASEPAGENAME}}
| Page title excluding the current [[Help:subpages|subpage]] and ''without'' the Namespace prepended (&quot;Title&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{PAGENAME}}&lt;/nowiki&gt;
| {{PAGENAME}}
| Page title
|-
| &lt;nowiki&gt;{{SUBPAGENAME}}&lt;/nowiki&gt;
| {{SUBPAGENAME}}
| The [[Help:subpages|subpage]] title (&quot;foo&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{SUBJECTPAGENAME}}&lt;/nowiki&gt;
| {{SUBJECTPAGENAME}}
| The title of the associated content page.
|-
| &lt;nowiki&gt;{{TALKPAGENAME}}&lt;/nowiki&gt;
| {{TALKPAGENAME}}
| The title of the associated talk page.
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{FULLPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{PAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{BASEPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKPAGENAMEE}}&lt;/nowiki&gt;

====Namespaces====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{NAMESPACE}}&lt;/nowiki&gt;
| {{NAMESPACE}}
| Namespace (name)
|-
| &lt;nowiki&gt;{{SUBJECTSPACE}}&lt;/nowiki&gt;
| {{SUBJECTSPACE}}
| Name of the associated content namespace
|-
| &lt;nowiki&gt;{{TALKSPACE}}&lt;/nowiki&gt;
| {{TALKSPACE}}
| Name of the associated talk namespace
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{NAMESPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTSPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKSPACEE}}&lt;/nowiki&gt;

&lt;code&gt;&lt;nowiki&gt;{{ns:}}&lt;/nowiki&gt;&lt;/code&gt; returns the localized namespace name for that number of constant. The default values are:

{| {{prettytable}}
|-
!{{Hl2}}| Usage
!{{Hl2}}| Output
|-
| &lt;nowiki&gt;{{ns:-2}} or {{ns:Media}}&lt;/nowiki&gt;
| {{ns:-2}}
|-
| &lt;nowiki&gt;{{ns:-1}} or {{ns:Special}}&lt;/nowiki&gt;
| {{ns:-1}}
|-
| &lt;nowiki&gt;{{ns:0}} or {{ns:Main}}&lt;/nowiki&gt;
| {{ns:0}}
|-
| &lt;nowiki&gt;{{ns:1}} or {{ns:Talk}}&lt;/nowiki&gt;
| {{ns:1}}
|-
| &lt;nowiki&gt;{{ns:2}} or {{ns:User}}&lt;/nowiki&gt;
| {{ns:2}}
|-
| &lt;nowiki&gt;{{ns:3}} or {{ns:User_talk}}&lt;/nowiki&gt;
| {{ns:3}}
|-
| &lt;nowiki&gt;{{ns:4}} or {{ns:Project}}&lt;/nowiki&gt;
| {{ns:4}}
|-
| &lt;nowiki&gt;{{ns:5}} or {{ns:Project_talk}}&lt;/nowiki&gt;
| {{ns:5}}
|-
| &lt;nowiki&gt;{{ns:6}} or {{ns:Image}}&lt;/nowiki&gt;
| {{ns:6}}
|-
| &lt;nowiki&gt;{{ns:7}} or {{ns:Image_talk}}&lt;/nowiki&gt;
| {{ns:7}}
|-
| &lt;nowiki&gt;{{ns:8}} or {{ns:MediaWiki}}&lt;/nowiki&gt;
| {{ns:8}}
|-
| &lt;nowiki&gt;{{ns:9}} or {{ns:MediaWiki_talk}}&lt;/nowiki&gt;
| {{ns:9}}
|-
| &lt;nowiki&gt;{{ns:10}} or {{ns:Template}}&lt;/nowiki&gt;
| {{ns:10}}
|-
| &lt;nowiki&gt;{{ns:11}} or {{ns:Template_talk}}&lt;/nowiki&gt;
| {{ns:11}}
|-
| &lt;nowiki&gt;{{ns:12}} or {{ns:Help}}&lt;/nowiki&gt;
| {{ns:12}}
|-
| &lt;nowiki&gt;{{ns:13}} or {{ns:Help_talk}}&lt;/nowiki&gt;
| {{ns:13}}
|-
| &lt;nowiki&gt;{{ns:14}} or {{ns:Category}}&lt;/nowiki&gt;
| {{ns:14}}
|-
| &lt;nowiki&gt;{{ns:15}} or {{ns:Category_talk}}&lt;/nowiki&gt;
| {{ns:15}}
|}

== Custom variables ==
MediaWiki also supports custom variables defined as part of extensions or specific to a particular installation.  For example, some installations  might find it helpful to have a variable that identifies the name of the sponsoring organization or the portion of the wiki URL that precedes the title if it is liable to change or more complex than &lt;code&gt;&lt;nowiki&gt;http://{{SERVERNAME}}&lt;/nowiki&gt;&lt;/code&gt;.


For more information, please see {{mediawiki|Manual:Variable}}.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33544</id>
      <timestamp>2008-12-05T10:46:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/CalibOmonc|CalibOmonc]] ([[User talk:CalibOmonc|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">MediaWiki '''variables''' are strings of text that output information such as time, site details, or page names.

==Parsing==
The syntax of most variables is similar to [[Help:Templates|templates]], but capitalized to help avoid conflicts. If a template has the same name and case as a variable, the variable will be used. Usage of the template can be forced by adding the &quot;msg:&quot; modifier (for example, &quot;&lt;code&gt;&lt;nowiki&gt;{{msg:CURRENTYEAR}}&lt;/nowiki&gt;&lt;/code&gt;&quot;).

Page-dependent variables will return data about the currently-viewed page, regardless of whether the variable is in the page code or a transcluded template.

==Variables==
===Date &amp; time===
The following variables return the current date and time according to the user's timezone [[Special:Preferences|preferences]], defaulting to the UTC timezone.

Due to MediaWiki and browser caching, these variables frequently show when the page was ''cached'' rather than the current time.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
|colspan=&quot;3&quot;| '''Year'''
|-
| &lt;nowiki&gt;{{CURRENTYEAR}}&lt;/nowiki&gt;
| {{CURRENTYEAR}}
| Year
|-
|colspan=&quot;3&quot;| '''Month'''
|-

| &lt;nowiki&gt;{{CURRENTMONTH}}&lt;/nowiki&gt; 
| {{CURRENTMONTH}}
| Month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAME}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAME}}
| Month (name)
|-
| &lt;nowiki&gt;{{CURRENTMONTHNAMEGEN}}&lt;/nowiki&gt;
| {{CURRENTMONTHNAMEGEN}}
| Month ([http://en.wikipedia.org/wiki/genitive genitive form])
|-
| &lt;nowiki&gt;{{CURRENTMONTHABBREV}}&lt;/nowiki&gt;
| {{CURRENTMONTHABBREV}}
| Month (abbreviation)
|-
|colspan=&quot;3&quot;| '''Day'''
|-
| &lt;nowiki&gt;{{CURRENTDAY}}&lt;/nowiki&gt;
| {{CURRENTDAY}}
| Day of the month (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAY2}}&lt;/nowiki&gt;
| {{CURRENTDAY2}}
| Day of the month (zero-padded number)
|-
| &lt;nowiki&gt;{{CURRENTDOW}}&lt;/nowiki&gt;
| {{CURRENTDOW}}
| Day of the week (unpadded number)
|-
| &lt;nowiki&gt;{{CURRENTDAYNAME}}&lt;/nowiki&gt;
| {{CURRENTDAYNAME}}
| Day of the week (name)
|-
|colspan=&quot;3&quot;| '''Time'''
|-
| &lt;nowiki&gt;{{CURRENTTIME}}&lt;/nowiki&gt;
| {{CURRENTTIME}}
| Time (24-hour HH:mm format)
|-
| &lt;nowiki&gt;{{CURRENTHOUR}}&lt;/nowiki&gt;
| {{CURRENTHOUR}}
| Hour (24-hour zero-padded number)
|-
|colspan=&quot;3&quot;| '''Other'''
|-
| &lt;nowiki&gt;{{CURRENTWEEK}}&lt;/nowiki&gt;
| {{CURRENTWEEK}}
| Week (number)
|-
| &lt;nowiki&gt;{{CURRENTTIMESTAMP}}&lt;/nowiki&gt;
| {{CURRENTTIMESTAMP}}
| ISO 8601 time stamp
|}

The following variables do the same as the above, but using the site's local timezone instead of user preferences and UTC:
* &lt;nowiki&gt;{{LOCALYEAR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTH}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALMONTHABBREV}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAY2}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDOW}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALDAYNAME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIME}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALHOUR}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALWEEK}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{LOCALTIMESTAMP}}&lt;/nowiki&gt;

===Statistics and technical details===
====Site====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SITENAME}}&lt;/nowiki&gt;
| {{SITENAME}}
| Name of the wiki ({{mediawiki|Manual:$wgSitename|$wgSitename}})
|-
| &lt;nowiki&gt;{{CONTENTLANGUAGE}}&lt;/nowiki&gt;
| {{CONTENTLANGUAGE}}
| Default interface language ({{mediawiki|Manual:$wgLanguageCode|$wgLanguageCode}})
|-
| &lt;nowiki&gt;{{NUMBEROFPAGES}}&lt;/nowiki&gt;
| {{NUMBEROFPAGES}}
| Number of wiki pages
|-
| &lt;nowiki&gt;{{NUMBEROFARTICLES}}&lt;/nowiki&gt;
| {{NUMBEROFARTICLES}}
| Number of pages in main namespace
|-
| &lt;nowiki&gt;{{NUMBEROFFILES}}&lt;/nowiki&gt;
| {{NUMBEROFFILES}}
| Number of uploaded files
|}

====Latest revision to a page====
The following variables return data about the '''latest edit to the current page''', even if viewing an older version of the page.

{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{REVISIONID}}&lt;/nowiki&gt;
| {{REVISIONID}}
| Unique ID
|-
| &lt;nowiki&gt;{{REVISIONDAY}}&lt;/nowiki&gt;
| {{REVISIONDAY}}
| Day edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONDAY2}}&lt;/nowiki&gt;
| {{REVISIONDAY2}}
| Day edit was made (zero-padded number)
|-
| &lt;nowiki&gt;{{REVISIONMONTH}}&lt;/nowiki&gt;
| {{REVISIONMONTH}}
| Month edit was made (unpadded number)
|-
| &lt;nowiki&gt;{{REVISIONYEAR}}&lt;/nowiki&gt;
| {{REVISIONYEAR}}
| Year edit was made
|-
| &lt;nowiki&gt;{{REVISIONTIMESTAMP}}&lt;/nowiki&gt;
| {{REVISIONTIMESTAMP}}
| Timestamp as of time of edit
|}

===URL data===
====URLs====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{SERVER}}&lt;/nowiki&gt;
| {{SERVER}}
| domain URL ({{mediawiki|Manual:$wgServer|$wgServer}})
|-
| &lt;nowiki&gt;{{SERVERNAME}}&lt;/nowiki&gt;
| {{SERVERNAME}}
| domain name ({{mediawiki|Manual:$wgServerName|$wgServerName}})
|-
| &lt;nowiki&gt;{{SCRIPTPATH}}&lt;/nowiki&gt;
| {{SCRIPTPATH}}
| relative script path ({{mediawiki|Manual:$wgScriptPath|$wgScriptPath}})
|-
| &lt;nowiki&gt;{{localurl:&lt;/nowiki&gt;''pagename''&lt;nowiki&gt;}}&lt;/nowiki&gt;&lt;br /&gt;&lt;nowiki&gt;{{localurl:pagename|&lt;/nowiki&gt;''query string''&lt;nowiki&gt;}}&lt;/nowiki&gt;
| {{localurl:pagename}}&lt;br /&gt;{{localurl:pagename|query string}}
| relative path to title
|}

====Page names====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{FULLPAGENAME}}&lt;/nowiki&gt;
| {{FULLPAGENAME}}
| Namespace and page title
|-
| &lt;nowiki&gt;{{BASEPAGENAME}}&lt;/nowiki&gt;
| {{BASEPAGENAME}}
| Page title excluding the current [[Help:subpages|subpage]] and ''without'' the Namespace prepended (&quot;Title&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{PAGENAME}}&lt;/nowiki&gt;
| {{PAGENAME}}
| Page title
|-
| &lt;nowiki&gt;{{SUBPAGENAME}}&lt;/nowiki&gt;
| {{SUBPAGENAME}}
| The [[Help:subpages|subpage]] title (&quot;foo&quot; on &quot;Title/foo&quot;)
|-
| &lt;nowiki&gt;{{SUBJECTPAGENAME}}&lt;/nowiki&gt;
| {{SUBJECTPAGENAME}}
| The title of the associated content page.
|-
| &lt;nowiki&gt;{{TALKPAGENAME}}&lt;/nowiki&gt;
| {{TALKPAGENAME}}
| The title of the associated talk page.
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{FULLPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{PAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{BASEPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTPAGENAMEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKPAGENAMEE}}&lt;/nowiki&gt;

====Namespaces====
{| {{prettytable}}
|-
!{{Hl2}}| Variable
!{{Hl2}}| Output
!{{Hl2}}| Description
|-
| &lt;nowiki&gt;{{NAMESPACE}}&lt;/nowiki&gt;
| {{NAMESPACE}}
| Namespace (name)
|-
| &lt;nowiki&gt;{{SUBJECTSPACE}}&lt;/nowiki&gt;
| {{SUBJECTSPACE}}
| Name of the associated content namespace
|-
| &lt;nowiki&gt;{{TALKSPACE}}&lt;/nowiki&gt;
| {{TALKSPACE}}
| Name of the associated talk namespace
|}

The following are URL-encoded equivalents:
* &lt;nowiki&gt;{{NAMESPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{SUBJECTSPACEE}}&lt;/nowiki&gt;
* &lt;nowiki&gt;{{TALKSPACEE}}&lt;/nowiki&gt;

&lt;code&gt;&lt;nowiki&gt;{{ns:}}&lt;/nowiki&gt;&lt;/code&gt; returns the localized namespace name for that number of constant. The default values are:

{| {{prettytable}}
|-
!{{Hl2}}| Usage
!{{Hl2}}| Output
|-
| &lt;nowiki&gt;{{ns:-2}} or {{ns:Media}}&lt;/nowiki&gt;
| {{ns:-2}}
|-
| &lt;nowiki&gt;{{ns:-1}} or {{ns:Special}}&lt;/nowiki&gt;
| {{ns:-1}}
|-
| &lt;nowiki&gt;{{ns:0}} or {{ns:Main}}&lt;/nowiki&gt;
| {{ns:0}}
|-
| &lt;nowiki&gt;{{ns:1}} or {{ns:Talk}}&lt;/nowiki&gt;
| {{ns:1}}
|-
| &lt;nowiki&gt;{{ns:2}} or {{ns:User}}&lt;/nowiki&gt;
| {{ns:2}}
|-
| &lt;nowiki&gt;{{ns:3}} or {{ns:User_talk}}&lt;/nowiki&gt;
| {{ns:3}}
|-
| &lt;nowiki&gt;{{ns:4}} or {{ns:Project}}&lt;/nowiki&gt;
| {{ns:4}}
|-
| &lt;nowiki&gt;{{ns:5}} or {{ns:Project_talk}}&lt;/nowiki&gt;
| {{ns:5}}
|-
| &lt;nowiki&gt;{{ns:6}} or {{ns:Image}}&lt;/nowiki&gt;
| {{ns:6}}
|-
| &lt;nowiki&gt;{{ns:7}} or {{ns:Image_talk}}&lt;/nowiki&gt;
| {{ns:7}}
|-
| &lt;nowiki&gt;{{ns:8}} or {{ns:MediaWiki}}&lt;/nowiki&gt;
| {{ns:8}}
|-
| &lt;nowiki&gt;{{ns:9}} or {{ns:MediaWiki_talk}}&lt;/nowiki&gt;
| {{ns:9}}
|-
| &lt;nowiki&gt;{{ns:10}} or {{ns:Template}}&lt;/nowiki&gt;
| {{ns:10}}
|-
| &lt;nowiki&gt;{{ns:11}} or {{ns:Template_talk}}&lt;/nowiki&gt;
| {{ns:11}}
|-
| &lt;nowiki&gt;{{ns:12}} or {{ns:Help}}&lt;/nowiki&gt;
| {{ns:12}}
|-
| &lt;nowiki&gt;{{ns:13}} or {{ns:Help_talk}}&lt;/nowiki&gt;
| {{ns:13}}
|-
| &lt;nowiki&gt;{{ns:14}} or {{ns:Category}}&lt;/nowiki&gt;
| {{ns:14}}
|-
| &lt;nowiki&gt;{{ns:15}} or {{ns:Category_talk}}&lt;/nowiki&gt;
| {{ns:15}}
|}

== Custom variables ==
MediaWiki also supports custom variables defined as part of extensions or specific to a particular installation.  For example, some installations  might find it helpful to have a variable that identifies the name of the sponsoring organization or the portion of the wiki URL that precedes the title if it is liable to change or more complex than &lt;code&gt;&lt;nowiki&gt;http://{{SERVERNAME}}&lt;/nowiki&gt;&lt;/code&gt;.


For more information, please see {{mediawiki|Manual:Variable}}.

[[Category:Help|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Actor (UT)/Display</title>
    <id>29399</id>
    <revision>
      <id>45082</id>
      <timestamp>2012-04-01T23:08:37Z</timestamp>
      <contributor>
        <username>Feralidragon</username>
        <id>505</id>
      </contributor>
      <comment>Created page with '&quot;RGB(127,127,127) is transparent&quot; - I just noticed this and this sentence is wrong. The actual value for modulated *full transparency* is RGB(128,128,128), not 127. A simple test…'</comment>
      <text xml:space="preserve">&quot;RGB(127,127,127) is transparent&quot; - I just noticed this and this sentence is wrong.
The actual value for modulated *full transparency* is RGB(128,128,128), not 127.
A simple test like making 2 decals with 127 and 128 respectively as background, and then keep adding them to a wall will show that the 127 one will eventually show the background as it darkens, while the 128 keeps transparent.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Animated Texture</title>
    <id>24200</id>
    <revision>
      <id>34610</id>
      <timestamp>2009-07-30T08:51:21Z</timestamp>
      <contributor>
        <ip>76.246.55.40</ip>
      </contributor>
      <comment>Created page with 'does this apply to UE1 or UE2? or both?'</comment>
      <text xml:space="preserve">does this apply to UE1 or UE2? or both?</text>
    </revision>
    <revision>
      <id>34611</id>
      <timestamp>2009-07-30T10:47:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Both.</comment>
      <text xml:space="preserve">does this apply to UE1 or UE2? or both?

Both. —[[User:Wormbo|Wormbo]] 10:47, 30 July 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Application</title>
    <id>29209</id>
    <revision>
      <id>44112</id>
      <timestamp>2010-11-12T05:46:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>gosh!</comment>
      <text xml:space="preserve">
===This index===

It's got to the point where we have SO MANY pages for apps on this wiki. There's official stuff like UPaint, homemade like Umake and UnCodeX, stuff that's not really Unreal related but that we recommend as useful... basically, this [[MeatBall:ForwardIndex]] is becoming too hard to maintain; and it's getting too long to digest. So maybe we should switch to a reverse index and create [[:Category:Legacy Application]]. Keep forward indexes for specific areas, such as [[Legacy:Texture Editing Program|Texture Editing Program]], or [[Legacy:UnrealScript Editors|UnrealScript Editors]]. Any thoughts on this?

Mych:  [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' here's my plan:

====1. type pages====

Specialized forward indexes for different types of app, such as
* [[Legacy:Texture Editing Program|Texture editing program]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Model Editor|Model editor]]

... and so on. These names can be easily back-linked from pages for specific apps:

: foo is an [[Legacy:IDE|IDE]] bla bla bla

====2 parent page====

This page remains a parent page that leads to the above type pages. any apps that don't get listed on a type page stay here.

====3 reverse index====

Use [[:Category:Legacy Application]] so we can generate a flat list of all applications discussed on the wiki

How does that sound?

'''Tarquin:''' no opinions? I'll take that as a unanimous yes then

'''Wormbo:''' Sounds good to me, so if you need an explicit &quot;yes&quot;, you got mine. :)

'''Ch3z:''' Those Type Pages maybe need a sufix like, &quot;TextureEdit_Apps&quot;, &quot;IDE_Apps&quot;, &quot;TextEdit_Apps&quot;, &quot;ModelEdit_Apps&quot;, &quot;ModelConvert_Apps&quot;? Or maybe a prefix?

'''Bob_The_Beheader:''' I've noticed when adding a program to the [[Legacy:Graphics_Application|Graphics_Application]] page, some of the programs already listed don't have there own page, and therefore can't be listed on the [[Legacy:Category_Application|Category_Application]] page. Should seperate pages be made for these apps, or are users expected to follow the link to the [[Legacy:Application|Application]] page?

'''Tarquin:''' Depends if there's anything interesting to say about the app. is [[Legacy:Application|Application]] not prominent enough?

'''Bob_The_Beheader:''' Tarquin is what ive just done with adding the link to the Text Editor page what you are talking about for Type Pages in step one?

==Discussion on Legacy pages==
Why are you people discussing this stuff on the page instead of on the talk page for this page?  (i.e. the &quot;discussion&quot; tab) {{unsigned|216.196.244.38|01:00, 12 November 2010}}

:Because there was no other way when the comments were added, the UseMod Wiki software didn't provide namespaces. Different question: Why do you reply to a two year old discussion and don't even sign your comment properly? —[[User:Wormbo|Wormbo]] 05:46, 12 November 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Attaching Actors</title>
    <id>28782</id>
    <revision>
      <id>42531</id>
      <timestamp>2010-02-10T21:27:54Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>Created page with '==Comments==  '''Foxpaw:''' Can this be renamed, since it deals only with attaching things to movers, and not attaching things to bones, or just using plain old attach or setbase…'</comment>
      <text xml:space="preserve">==Comments==

'''Foxpaw:''' Can this be renamed, since it deals only with attaching things to movers, and not attaching things to bones, or just using plain old attach or setbase?

'''Tarquin:''' &quot;Attaching to movers&quot;?

'''Foxpaw:''' That could work. Alternatively we could add stuff on those other topics here, though admittedly I've never had any success with the &quot;Attach&quot; function and only sporadic results with Setbase.

'''MythOpus:''' I suggest making a base page called Attaching or something and have subpages for attaching actors to movers and bones etc...

~~ Sounds good :)

~~ Thanks :)  I think I'll get right no it then.  Can you rename this page to Attaching_To_Movers or something?  And do you want it to be a sub-page of &quot; Attaching_Stuff &quot; or just a page on it's own?

'''GTD-Carthage:''' I've done everything correctly but no matter what happens, BlockPlayer actors don't move with the attachmover. I've tied up everything correctly and even investigated twice. Are BlockPlayer actors really just static actors?

'''Ragdoll:''' I dont know about other games, but in [[Legacy:Devastation|Devastation]] if you try to change bStatic to false to attach an actor you will get a violent crash when played online. You even get a message in the map check errors box saying &quot;actor X is bStatic=False, but is bStatic by default, map will fail in netplay&quot;.

'''Musha:''' What kinds of actors can be attached to a mover?  I'm trying to attach a weapon base to a mover, but for the life of me, I can't get it to work.  Can these types of actors just not be attached to a mover?  I understand that this will be excluded from bot pathing, but since its a player-activated assault objective, it doesn't matter.
.

See the bStatic section.
--[[User:Eliot|Eliot]] 10 February 2010

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Authorizer</title>
    <id>5062</id>
    <revision>
      <id>11711</id>
      <timestamp>2008-05-05T08:29:57Z</timestamp>
      <contributor>
        <username>Raven</username>
        <id>16</id>
      </contributor>
      <comment>[[Legacy talk:Authorizer]] moved to [[UE1 talk:Authorizer]]</comment>
      <text xml:space="preserve">#REDIRECT [[UE1 talk:Authorizer]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Binding Keys</title>
    <id>29294</id>
    <revision>
      <id>44864</id>
      <timestamp>2012-01-24T15:17:27Z</timestamp>
      <contributor>
        <username>Crusher</username>
        <id>2266</id>
      </contributor>
      <minor/>
      <comment>UT Speech Binder</comment>
      <text xml:space="preserve">If you are looking to bind keys to UT Taunts or CTF Commands (like: &quot;You like that&quot; or &quot;Take their flag&quot;) there is a cool tool called the UT Speech Binder. It can be found at www.UT99.org ... this is a link to the topic itself 
http://www.ut99.org/viewtopic.php?f=12&amp;t=3628&amp;p=34909#p34909</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Brush Sinking</title>
    <id>23990</id>
    <revision>
      <id>33464</id>
      <timestamp>2008-11-29T23:59:16Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <comment>Flickering surfaces?</comment>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations?</text>
    </revision>
    <revision>
      <id>33465</id>
      <timestamp>2008-11-30T11:24:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>/* Flickering surfaces? */ brush sinking = regular CSG operation</comment>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations? --GreatEmerald

:Well, brush sinking creates fixed BSP geometry, so there aren't two surfaces to display, but only one. The Unreal Engine doesn't have any flickering problems with BSP because it always displays the last brush's (as per brush order) surfaces. Mover's aren't part of the BSP tree, so the engine needs to figure out their drawing order dynamically, which causes flickering. If you look closely, you will find brush sinking in all generations of the Unreal Engine. It's even used on VCTF-Suspense in UT3! —[[User:Wormbo|Wormbo]] 11:24, 30 November 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33467</id>
      <timestamp>2008-11-30T13:12:02Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations? --GreatEmerald

:Well, brush sinking creates fixed BSP geometry, so there aren't two surfaces to display, but only one. The Unreal Engine doesn't have any flickering problems with BSP because it always displays the last brush's (as per brush order) surfaces. Mover's aren't part of the BSP tree, so the engine needs to figure out their drawing order dynamically, which causes flickering. If you look closely, you will find brush sinking in all generations of the Unreal Engine. It's even used on VCTF-Suspense in UT3! —[[User:Wormbo|Wormbo]] 11:24, 30 November 2008 (UTC)

::Interesting! But then why didn't epic sink the floor tiles on Na Pali Haven map, near the gate? Instead, they used non-solid sheets that disappear after rebuilding! --[[User:GreatEmerald|GreatEmerald]] 13:12, 30 November 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33468</id>
      <timestamp>2008-11-30T13:12:32Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations? --GreatEmerald

:Well, brush sinking creates fixed BSP geometry, so there aren't two surfaces to display, but only one. The Unreal Engine doesn't have any flickering problems with BSP because it always displays the last brush's (as per brush order) surfaces. Mover's aren't part of the BSP tree, so the engine needs to figure out their drawing order dynamically, which causes flickering. If you look closely, you will find brush sinking in all generations of the Unreal Engine. It's even used on VCTF-Suspense in UT3! —[[User:Wormbo|Wormbo]] 11:24, 30 November 2008 (UTC)

::Interesting! But then why didn't epic sink the floor tiles on Na Pali Haven map in Unreal 1, near the gate? Instead, they used non-solid sheets that disappear after rebuilding! --[[User:GreatEmerald|GreatEmerald]] 13:12, 30 November 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33473</id>
      <timestamp>2008-11-30T14:39:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>no idea</comment>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations? --GreatEmerald

:Well, brush sinking creates fixed BSP geometry, so there aren't two surfaces to display, but only one. The Unreal Engine doesn't have any flickering problems with BSP because it always displays the last brush's (as per brush order) surfaces. Mover's aren't part of the BSP tree, so the engine needs to figure out their drawing order dynamically, which causes flickering. If you look closely, you will find brush sinking in all generations of the Unreal Engine. It's even used on VCTF-Suspense in UT3! —[[User:Wormbo|Wormbo]] 11:24, 30 November 2008 (UTC)

::Interesting! But then why didn't epic sink the floor tiles on Na Pali Haven map in Unreal 1, near the gate? Instead, they used non-solid sheets that disappear after rebuilding! --[[User:GreatEmerald|GreatEmerald]] 13:12, 30 November 2008 (UTC)

::No idea. Maybe they weren't aware of this trick back when they designed the Unreal levels. There is an amazingly low number of UT maps using this as well. I've ported the [[brush sinking]] tutorial to the main name space now, btw. —[[User:Wormbo|Wormbo]] 14:39, 30 November 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33483</id>
      <timestamp>2008-11-30T17:56:16Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations? --GreatEmerald

:Well, brush sinking creates fixed BSP geometry, so there aren't two surfaces to display, but only one. The Unreal Engine doesn't have any flickering problems with BSP because it always displays the last brush's (as per brush order) surfaces. Mover's aren't part of the BSP tree, so the engine needs to figure out their drawing order dynamically, which causes flickering. If you look closely, you will find brush sinking in all generations of the Unreal Engine. It's even used on VCTF-Suspense in UT3! —[[User:Wormbo|Wormbo]] 11:24, 30 November 2008 (UTC)

::Interesting! But then why didn't epic sink the floor tiles on Na Pali Haven map in Unreal 1, near the gate? Instead, they used non-solid sheets that disappear after rebuilding! --[[User:GreatEmerald|GreatEmerald]] 13:12, 30 November 2008 (UTC)

::No idea. Maybe they weren't aware of this trick back when they designed the Unreal levels. There is an amazingly low number of UT maps using this as well. I've ported the [[brush sinking]] tutorial to the main name space now, btw. —[[User:Wormbo|Wormbo]] 14:39, 30 November 2008 (UTC)

:::Ooh, nice. Though some more maps could be given as examples, like DM-Gothic for UT99 or ONS-Torlan for subtractive sinking. --[[User:GreatEmerald|GreatEmerald]] 17:56, 30 November 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33585</id>
      <timestamp>2008-12-06T23:29:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>subtractive sinking on Torlan?</comment>
      <text xml:space="preserve">== Flickering surfaces? ==

This method doesn't create flickering surfaces? I mean, the engine should get quite confused, there are two textures to render at the same spot. Just like with movers, you can't use this method with them. Any explanations? --GreatEmerald

:Well, brush sinking creates fixed BSP geometry, so there aren't two surfaces to display, but only one. The Unreal Engine doesn't have any flickering problems with BSP because it always displays the last brush's (as per brush order) surfaces. Mover's aren't part of the BSP tree, so the engine needs to figure out their drawing order dynamically, which causes flickering. If you look closely, you will find brush sinking in all generations of the Unreal Engine. It's even used on VCTF-Suspense in UT3! —[[User:Wormbo|Wormbo]] 11:24, 30 November 2008 (UTC)

::Interesting! But then why didn't epic sink the floor tiles on Na Pali Haven map in Unreal 1, near the gate? Instead, they used non-solid sheets that disappear after rebuilding! --[[User:GreatEmerald|GreatEmerald]] 13:12, 30 November 2008 (UTC)

::No idea. Maybe they weren't aware of this trick back when they designed the Unreal levels. There is an amazingly low number of UT maps using this as well. I've ported the [[brush sinking]] tutorial to the main name space now, btw. —[[User:Wormbo|Wormbo]] 14:39, 30 November 2008 (UTC)

:::Ooh, nice. Though some more maps could be given as examples, like DM-Gothic for UT99 or ONS-Torlan for subtractive sinking. --[[User:GreatEmerald|GreatEmerald]] 17:56, 30 November 2008 (UTC)

::::I only see a bit of regular additive brush sinking on Torlan. Where would the subtractive part be? —[[User:Wormbo|Wormbo]] 23:29, 6 December 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Building A SkyBox</title>
    <id>29163</id>
    <revision>
      <id>43976</id>
      <timestamp>2010-09-09T20:52:35Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <minor/>
      <comment>Moved to discussion page</comment>
      <text xml:space="preserve">'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{quote
| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.
}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

'''Guest:''' What happens if, instead of  making a sky box, you make an 8 sided sky box. Would it look better, or just not work?

It really doesn't matter what shape you create for the sky zone, what matters is how the final result looks like. Common skybox textures are designed to be used on cube surfaces, though. —[[User:Wormbo|Wormbo]] 18:08, 2 September 2009 (UTC)

'''TheKiller:''' The Skybox Instructions are only working in SinglePlayer Mode
To get them working in Multiplayer You have to add a ZoneInfo icon to the Map So the Sky will be displayed</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Compiling With UCC</title>
    <id>5048</id>
    <revision>
      <id>11620</id>
      <timestamp>2008-04-29T03:40:57Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <comment>New page: Okay so thought I would buzz in here, UCC maybe alittle specific now hey? Since UT3 uses the game executable for running the make commandlet, alot of the other stuff remains unchanged. Id ...</comment>
      <text xml:space="preserve">Okay so thought I would buzz in here, UCC maybe alittle specific now hey? Since UT3 uses the game executable for running the make commandlet, alot of the other stuff remains unchanged. Id like to work on a new version of this page and add UT3 related materials also. My suggestion would be [[Compiling UnrealScript]] or something like that. Shouldnt be too hard to bring over but I would wonder what other pages this would link to like for eg Commandline parameters for each engine version or perhaps a link to a basic procedure like page which is associate with the make commandlet like [[Legacy:DumpIntCommandlet|DumpIntCommandlet]] -[[User:OlympusMons|OlympusMons]] 03:40, 29 April 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Console Commands/Admin Console Commands</title>
    <id>23809</id>
    <revision>
      <id>33131</id>
      <timestamp>2008-10-17T06:39:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moved from article page</comment>
      <text xml:space="preserve">'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''XxDangerxX:''' I've found the same thing. You simply cannot do it with the way Mychaeel explained.
HOWEVER!!! In the 451 update (which is apparently dodgy unless you're running a server), you can set an array like so:

&lt;code&gt;set Package.Class Array &lt;#&gt; Value&lt;/code&gt;

See the release notes: [http://www.utpg.org/patches/ReleaseNotes451.htm]

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?

'''UBCS Spawn:''' I want to learn how to use the Adminlogin for the game but it does not let me do it i wanted to do the password but i dont know how i need some help please I also want to know what is the codes Myclass MyArray (1,2,3,4,5,).

'''XxJasonXx:'''' i dont know how to use the adminlogin for Land of the Dead i need some help for this game.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:EIntelligence</title>
    <id>23727</id>
    <revision>
      <id>32392</id>
      <timestamp>2008-07-19T10:37:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>prolly about navigation</comment>
      <text xml:space="preserve">'''KnTenshi:''' Has anyone tested these extensively or knows exactly what these effect?  In other words, what does limited path length mean?

:Limited path length probably refers to how much ahead the pawn looks when determining navigation routes to a certain goal. -[[User:Wormbo|Wormbo]] 10:37, 19 July 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:ExportCacheCommandlet</title>
    <id>5049</id>
    <revision>
      <id>11623</id>
      <timestamp>2008-04-29T04:04:01Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <comment>New page: Since Im not the original author here I cant bring this out of legacy just yet as I would need to create a new page, to note there are 2 commandline switches Im aware of, -a which is appen...</comment>
      <text xml:space="preserve">Since Im not the original author here I cant bring this out of legacy just yet as I would need to create a new page, to note there are 2 commandline switches Im aware of, -a which is append and that is mentioned and -v which is verbose. There seems to be more but I would be wondering if we should be going for something more like this with these commandlet pages [[udn2:UnrealCacheLists.html#Exporting|UnrealCacheLists\Exporting]] -[[User:OlympusMons|OlympusMons]] 04:04, 29 April 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:ExtendedToolbar</title>
    <id>28236</id>
    <revision>
      <id>39859</id>
      <timestamp>2009-11-14T11:32:45Z</timestamp>
      <contributor>
        <username>Jan</username>
        <id>1621</id>
      </contributor>
      <comment>moved [[Legacy talk:ExtendedToolbar]] to [[Talk:Extended Toolbar]]</comment>
      <text xml:space="preserve">#REDIRECT [[Talk:Extended Toolbar]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:FireTexture</title>
    <id>23769</id>
    <revision>
      <id>33048</id>
      <timestamp>2008-09-25T13:39:27Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <comment>New page: '''XxDangerxX:''' I'd like to see a tutorial on creating a FireTexture, as well as editing an existing one (Different UDamage colours...?)</comment>
      <text xml:space="preserve">'''XxDangerxX:''' I'd like to see a tutorial on creating a FireTexture, as well as editing an existing one (Different UDamage colours...?)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:FlagBase</title>
    <id>29138</id>
    <revision>
      <id>43928</id>
      <timestamp>2010-08-31T06:14:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>moved old discussion to talk page and answered new question</comment>
      <text xml:space="preserve">'''R3plicant:''' Tarquin, hi. I'd like to have a working-online UT99 Flagbase, (Red &amp; Blue obv'), that will keep a non-scrolling scrolling-message-texture scoreboard, (think Red above Blue, static, with Flag Cap score at the end of the team colour), updated with both red &amp; Blue teams' scores as and when they happen - how would I achieve that? Second to that and a little off-topic, but indirectly related to this; I wanted a custom-font scripted texture to use for it, but haven't had any luck in making one. As you're probably aware it's simply not a case of making a new font texture, (which I DID manage, just). Any help much appreciated. Thanks! I can be found in #unrealed on Quakenet in irc during the day.

:There's not much point addressing tarquin directly nowadays, he doesn't come over here anymore. For a more powerful info screen implementation, try Mychaeel's [[Legacy:Screen|Screen]] component. —[[User:Wormbo|Wormbo]] 06:14, 31 August 2010 (UTC)

==Old discussion==
'''Omarr:''' I've checked this page a million times... I can never remember which color is which number.

'''ZxAnPhOrIaN:''' Think of red as being the beginning of the spectrum and blue is after red. 1 is after 0, so that is how I remember it.

'''Tarquin:''' I like playing on red. So red is zero, the best number :D okay, I mean the default number. For people who can never remember (like me) there's the [[Legacy:Team Number|team number]] page you can link to from any page that mentions them.

'''ZxAnPhOrIaN:''' Zero is easy to remember, think opposites. Zero to red (4 letters to 3 letters), One to blue (3 letters to 4 letters)

'''SuperApe:''' This class page needs property, function, event and state defs.  A Package name too.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Fyfe/PawnFactory</title>
    <id>5054</id>
    <revision>
      <id>11664</id>
      <timestamp>2008-04-29T17:24:29Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>New page: TeamVehicleFactory bears absolutely no connection to Fyfe's Pawn Factory.  What were you intending here, Haarg? -- [[User:SuperApe|SuperApe]] 09:26 (PST) 29 April 2008.  Whoops.  Copy/past...</comment>
      <text xml:space="preserve">TeamVehicleFactory bears absolutely no connection to Fyfe's Pawn Factory.  What were you intending here, Haarg? -- [[User:SuperApe|SuperApe]] 09:26 (PST) 29 April 2008.

Whoops.  Copy/paste error when resolving the double redirects. – [[User:Haarg|Haarg]] 17:24, 29 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>11665</id>
      <timestamp>2008-04-29T17:39:36Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <comment>ert.</comment>
      <text xml:space="preserve">TeamVehicleFactory bears absolutely no connection to Fyfe's Pawn Factory.  What were you intending here, Haarg? -- [[User:SuperApe|SuperApe]] 09:26 (PST) 29 April 2008.

Whoops.  Copy/paste error when resolving the double redirects. – [[User:Haarg|Haarg]] 17:24, 29 April 2008 (UTC)

(Let's move this discussion to the redirect page's discussion tab, yeah?)</text>
    </revision>
    <revision>
      <id>11666</id>
      <timestamp>2008-04-29T17:40:01Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <minor/>
      <comment>ert.</comment>
      <text xml:space="preserve">TeamVehicleFactory bears absolutely no connection to Fyfe's Pawn Factory.  What were you intending here, Haarg? -- [[User:SuperApe|SuperApe]] 09:26 (PST) 29 April 2008.

Whoops.  Copy/paste error when resolving the double redirects. – [[User:Haarg|Haarg]] 17:24, 29 April 2008 (UTC)

(Let's move this discussion to the redirect page's discussion tab, yeah?) -- [[User:SuperApe|SuperApe]] 10:40 (PST) 29 April 2008.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:GUIUserKeyBinding</title>
    <id>29059</id>
    <revision>
      <id>43667</id>
      <timestamp>2010-07-16T08:41:24Z</timestamp>
      <contributor>
        <username>Pd</username>
        <id>2036</id>
      </contributor>
      <comment>Created page with ''''pd'''  Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?  Background is that my mod will most likely only be downloaded from the …'</comment>
      <text xml:space="preserve">'''pd'''

Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?

Background is that my mod will most likely only be downloaded from the server, that means the INT file will not be transfered, which again means that the custom keybindings are not known to the client.
I would like my mod (Interaction or similar) to register those bindings automagically, though I don't know a way to programmatically replicate an INT file entry. Anything known here?</text>
    </revision>
    <revision>
      <id>43668</id>
      <timestamp>2010-07-16T09:16:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>not really</comment>
      <text xml:space="preserve">Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?

Background is that my mod will most likely only be downloaded from the server, that means the INT file will not be transfered, which again means that the custom keybindings are not known to the client.
I would like my mod (Interaction or similar) to register those bindings automagically, though I don't know a way to programmatically replicate an INT file entry. Anything known here? {{unsigned|Pd|10:41, 16 July 2010}}

:There are two options here: Either monitor the GUIController for the ControlBinder menu and manually add your keybinds there (I'm actually not sure if that's easily possible) or simply provide your own keybind menu. —[[User:Wormbo|Wormbo]] 09:16, 16 July 2010 (UTC)</text>
    </revision>
    <revision>
      <id>43669</id>
      <timestamp>2010-07-16T20:42:23Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>How is the temporal keybinding done in Jailbreak?</comment>
      <text xml:space="preserve">Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?

Background is that my mod will most likely only be downloaded from the server, that means the INT file will not be transfered, which again means that the custom keybindings are not known to the client.
I would like my mod (Interaction or similar) to register those bindings automagically, though I don't know a way to programmatically replicate an INT file entry. Anything known here? {{unsigned|Pd|10:41, 16 July 2010}}

:There are two options here: Either monitor the GUIController for the ControlBinder menu and manually add your keybinds there (I'm actually not sure if that's easily possible) or simply provide your own keybind menu. —[[User:Wormbo|Wormbo]] 09:16, 16 July 2010 (UTC)

Which method is used in Jailbreak? It temporarily binds a few keys for the user and tells him in a popup about it. Very fancy.
—[[User:Crusha|Crusha]] 20:40, 16 July 2010 (UTC)</text>
    </revision>
    <revision>
      <id>43670</id>
      <timestamp>2010-07-16T20:43:26Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <minor/>
      <comment>Formatting of the page</comment>
      <text xml:space="preserve">Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?

Background is that my mod will most likely only be downloaded from the server, that means the INT file will not be transfered, which again means that the custom keybindings are not known to the client.
I would like my mod (Interaction or similar) to register those bindings automagically, though I don't know a way to programmatically replicate an INT file entry. Anything known here? {{unsigned|Pd|10:41, 16 July 2010}}

:There are two options here: Either monitor the GUIController for the ControlBinder menu and manually add your keybinds there (I'm actually not sure if that's easily possible) or simply provide your own keybind menu. —[[User:Wormbo|Wormbo]] 09:16, 16 July 2010 (UTC)

::Which method is used in Jailbreak? It temporarily binds a few keys for the user and tells him in a popup about it. Very fancy. —[[User:Crusha|Crusha]] 20:40, 16 July 2010 (UTC)</text>
    </revision>
    <revision>
      <id>43671</id>
      <timestamp>2010-07-16T21:33:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>none</comment>
      <text xml:space="preserve">Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?

Background is that my mod will most likely only be downloaded from the server, that means the INT file will not be transfered, which again means that the custom keybindings are not known to the client.
I would like my mod (Interaction or similar) to register those bindings automagically, though I don't know a way to programmatically replicate an INT file entry. Anything known here? {{unsigned|Pd|10:41, 16 July 2010}}

:There are two options here: Either monitor the GUIController for the ControlBinder menu and manually add your keybinds there (I'm actually not sure if that's easily possible) or simply provide your own keybind menu. —[[User:Wormbo|Wormbo]] 09:16, 16 July 2010 (UTC)

::Which method is used in Jailbreak? It temporarily binds a few keys for the user and tells him in a popup about it. Very fancy. —[[User:Crusha|Crusha]] 20:40, 16 July 2010 (UTC)

:None. Jailbreak players will need to install the mod if they want to customize JB-specific keybinds. The mod captures key events for temp-bound commands through an Interaction, which is also responsible for drawing the notification after map load. —[[User:Wormbo|Wormbo]] 21:33, 16 July 2010 (UTC)</text>
    </revision>
    <revision>
      <id>43724</id>
      <timestamp>2010-07-19T07:09:30Z</timestamp>
      <contributor>
        <username>Pd</username>
        <id>2036</id>
      </contributor>
      <text xml:space="preserve">Is there any way to programatically register a GUIUserKeyBinding class, ie without an INT file?

Background is that my mod will most likely only be downloaded from the server, that means the INT file will not be transfered, which again means that the custom keybindings are not known to the client.
I would like my mod (Interaction or similar) to register those bindings automagically, though I don't know a way to programmatically replicate an INT file entry. Anything known here? {{unsigned|Pd|10:41, 16 July 2010}}

:There are two options here: Either monitor the GUIController for the ControlBinder menu and manually add your keybinds there (I'm actually not sure if that's easily possible) or simply provide your own keybind menu. —[[User:Wormbo|Wormbo]] 09:16, 16 July 2010 (UTC)

::Which method is used in Jailbreak? It temporarily binds a few keys for the user and tells him in a popup about it. Very fancy. —[[User:Crusha|Crusha]] 20:40, 16 July 2010 (UTC)

:None. Jailbreak players will need to install the mod if they want to customize JB-specific keybinds. The mod captures key events for temp-bound commands through an Interaction, which is also responsible for drawing the notification after map load. —[[User:Wormbo|Wormbo]] 21:33, 16 July 2010 (UTC)

:Alright, thanks! GUI2k4.KeyBindMenu proves to be a pretty easy to use interface for custom and even dynamic (depending on server configuration, for instance) keybinding menus, so providing your own menu is really the easiest way here. —[[User:Pd|Pd]] 07:08, 19 July 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:General Scale And Dimensions</title>
    <id>28922</id>
    <revision>
      <id>42909</id>
      <timestamp>2010-04-15T21:52:56Z</timestamp>
      <contributor>
        <ip>188.101.195.195</ip>
      </contributor>
      <comment>Created page with '== uu and px == Which relation is given between unreal units and pixels? How many UU are how many px? Would be nice, if somebody knows, because it makes texturing much easier. ~~…'</comment>
      <text xml:space="preserve">== uu and px ==
Which relation is given between unreal units and pixels? How many UU are how many px? Would be nice, if somebody knows, because it makes texturing much easier. 21:52, 15 April 2010 (UTC)</text>
    </revision>
    <revision>
      <id>42910</id>
      <timestamp>2010-04-15T22:00:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>apples and oranges!</comment>
      <text xml:space="preserve">== uu and px ==
Which relation is given between unreal units and pixels? How many UU are how many px? Would be nice, if somebody knows, because it makes texturing much easier. 21:52, 15 April 2010 (UTC)

:There is absolutely no fixed relation between UU and pixels. If you take a photo of an object with a size of 1 inch or 1 cm, how many pixels will it have on the digitized image? Same applies to Unreal Units when rendered to screen. —[[User:Wormbo|Wormbo]] 22:00, 15 April 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:General Unreal Timeline</title>
    <id>4753</id>
    <revision>
      <id>10697</id>
      <timestamp>2008-04-01T17:43:11Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>New page: '''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.</comment>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Global Function (UT)</title>
    <id>23764</id>
    <revision>
      <id>32985</id>
      <timestamp>2008-09-08T14:13:33Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <comment>New page: '''XxDangerxX:''' The Exp() function doesn't have anywhere enough information. What is the syntax when calling Exp, and how do you make it calculate your number e over the specified power ...</comment>
      <text xml:space="preserve">'''XxDangerxX:''' The Exp() function doesn't have anywhere enough information. What is the syntax when calling Exp, and how do you make it calculate your number e over the specified power a, when there is only one parameter in the function?</text>
    </revision>
    <revision>
      <id>32986</id>
      <timestamp>2008-09-08T14:15:45Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">'''XxDangerxX:''' The Exp() function doesn't have anywhere enough information. What is the syntax when calling Exp, and how do you make it calculate your number e over the specified power a, when there is only one parameter in the function? On that note, what is e, and where did it come from? You could tie this question in with the syntax question.</text>
    </revision>
    <revision>
      <id>32987</id>
      <timestamp>2008-09-08T14:38:58Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">'''XxDangerxX:''' The Exp() function doesn't have anywhere enough information. What is the syntax when calling Exp, and how do you make it calculate your number e over the specified power a, when there is only one parameter in the function? On that note, what is e, and where did it come from? You could tie that question in with the syntax question.</text>
    </revision>
    <revision>
      <id>32990</id>
      <timestamp>2008-09-09T21:36:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>exp(x) == 2.71828182845 ** x</comment>
      <text xml:space="preserve">'''XxDangerxX:''' The Exp() function doesn't have anywhere enough information. What is the syntax when calling Exp, and how do you make it calculate your number e over the specified power a, when there is only one parameter in the function? On that note, what is e, and where did it come from? You could tie that question in with the syntax question.

The [[wp:E (mathematical constant)|mathematical constant &quot;e&quot;]] is the base of the natural logarithm with the value 2.71828182845904523536..., so you don't actually need to specify it. If you're looking for a general way to raise a base to a certain power, use [[UE1:Object operators (UT)#float ** float|operator **]] instead. Bascially exp(x) is the same as doing (2.71828182845 ** x). -[[User:Wormbo|Wormbo]] 21:36, 9 September 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:INT File</title>
    <id>29274</id>
    <revision>
      <id>44483</id>
      <timestamp>2011-06-10T08:47:32Z</timestamp>
      <contributor>
        <username>Bobbuz</username>
        <id>87</id>
      </contributor>
      <comment>Created page with 'Retrieved the russian and czech working extensions. Does anybody know the extensions for : dutch, portuguese, finnish, hungarian, greek ?'</comment>
      <text xml:space="preserve">Retrieved the russian and czech working extensions. Does anybody know the extensions for : dutch, portuguese, finnish, hungarian, greek ?</text>
    </revision>
    <revision>
      <id>44485</id>
      <timestamp>2011-06-12T13:42:45Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>Here you go, but Czech is not correct.</comment>
      <text xml:space="preserve">Retrieved the russian and czech working extensions. Does anybody know the extensions for : dutch, portuguese, finnish, hungarian, greek ?
: I doubt that the Czech variant is correct. The Unreal Engine localization uses the two letters of the [http://www.loc.gov/standards/iso639-2/php/English_list.php ISO 639-1] and adds a 't' after that. So the Czech would be CST, Dutch would be NLT, Portuguese would be PTT, Finnish would be FIT, Hungarian would be HUT and Greek would be ELT. --[[User:Crusha|Crusha]] 13:42, 12 June 2011 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:InputKeyMap</title>
    <id>24081</id>
    <revision>
      <id>34000</id>
      <timestamp>2009-02-07T20:54:50Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <comment>Bad formatting</comment>
      <text xml:space="preserve">This page seems to have lost formatting for some reason (probably code tags or too many columns). This should be rewritten I guess. --[[User:GreatEmerald|GreatEmerald]] 20:54, 7 February 2009 (UTC)</text>
    </revision>
    <revision>
      <id>34002</id>
      <timestamp>2009-02-07T22:18:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>yup, fixed</comment>
      <text xml:space="preserve">This page seems to have lost formatting for some reason (probably code tags or too many columns). This should be rewritten I guess. --[[User:GreatEmerald|GreatEmerald]] 20:54, 7 February 2009 (UTC)

:Yeah, the import script probably messed up the table syntax as it didn't realize the | inside the code tags wasn't part of the table. —[[User:Wormbo|Wormbo]] 22:18, 7 February 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Keyboard Shortcuts</title>
    <id>28999</id>
    <revision>
      <id>43435</id>
      <timestamp>2010-06-10T11:40:16Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>The last edits describe UE3, but this is a Legacy page</comment>
      <text xml:space="preserve">This page is Legacy content, there is no need in editing it, especially not with Shortcuts that work only in UE3.

A new page should be created for that purpose and add descriptions about what engine version that Shortcut belongs to.
—[[User:Crusha|Crusha]] 13:39, 10 June 2010 (UTC)</text>
    </revision>
    <revision>
      <id>43436</id>
      <timestamp>2010-06-10T11:44:18Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <text xml:space="preserve">This page is Legacy content, there is no need in editing it, especially not with Shortcuts that work only in UE3.

A new page should be created for that purpose and add descriptions about what engine version that Shortcut belongs to.
—[[User:Crusha|Crusha]] 13:39, 10 June 2010 (UTC)
: I suggest adding the shortcuts in [[UE3:Unreal_Editor]] same for all other versions, those articles need to be expanded anyway. --Eliot 11:44, 10 June 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Mac</title>
    <id>24126</id>
    <revision>
      <id>34300</id>
      <timestamp>2009-04-03T15:11:59Z</timestamp>
      <contributor>
        <username>Xandros</username>
        <id>1922</id>
      </contributor>
      <comment>Created page with ''''Xandros''': I don't honestly think this page is needed anymore. I've been editing it though with the possibility in mind that at some point someone decided it is worth keeping...'</comment>
      <text xml:space="preserve">'''Xandros''': I don't honestly think this page is needed anymore. I've been editing it though with the possibility in mind that at some point someone decided it is worth keeping and moved it to the normal pages and deleted the legacy section. Ultimately now though, I don't suppose there's many Mac users out there still interested in this information (with the exception to the UT3 info), anyone who is interested could probably just Google it and get it off the various other sites that mention the same things. I originally created it as a means for Mac users to have a some good info about various problems, I figured having all the info in one place was a good enough idea. Now though I just don't think it really fits with the site's ideals.

Meh, anyway, I'm not editing it anymore now since it is up-to-date. What I do suggest if the decision is ever made to keep it in the new Wiki is to link to it from the various game pages (like [[Unreal_Tournament]], and if it is ever modified beyond a soft redirect; [[Unreal]]).</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Mapping For Jailbreak/Shooting From Jails</title>
    <id>23719</id>
    <revision>
      <id>32356</id>
      <timestamp>2008-07-07T12:52:20Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <comment>New page: This 'information' could easily be included on a main page under a Tips section or something.  There is no reason to have this page. --[[User:SuperApe|SuperApe]] 7 July 2008 (UTC)</comment>
      <text xml:space="preserve">This 'information' could easily be included on a main page under a Tips section or something.  There is no reason to have this page. --[[User:SuperApe|SuperApe]] 7 July 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:MilkShape</title>
    <id>5112</id>
    <revision>
      <id>11869</id>
      <timestamp>2008-05-11T22:16:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: '''5parrowhawk:''' I've had some trouble with Milkshape's PSA export. Seems the program doesn't autoswap the y and z axes for joint rotation, meaning that the rotation data in an exported ...</comment>
      <text xml:space="preserve">'''5parrowhawk:''' I've had some trouble with Milkshape's PSA export. Seems the program doesn't autoswap the y and z axes for joint rotation, meaning that the rotation data in an exported PSA is all out of whack unless you use only the x-axis.

Anyone else have this problem? I can't find the settings in Milkshape to swap axes, if there are any.

'''Bob_The_Beheader:''' Great piece of software, especially for importing/exporting models and stuff. It's

pretty poor for creating models by itself, but just friggin' awesome when it comes to taking models from

other programs and getting them into the game.

'''Feralidragon:''' I was wondering, I am using MilkShape 1.8.2 for modelling to Unreal Tournament Classic or GOTY, and at the beggining, I exported many models to _d.3d and _a.3d formats (unreal format) without any problems, all perfect. But one day, it started to export them with little and big distortions in the models, and I don't know what's hapenning. I already tried to make a total new reinstall (uninstalled, deleted all MilkShape related files, except the models, and install again), and it didn't work. The funny thing, is that I stored a model in unreal format in my HD at the beggining, and model is fine, but when i import it to this MilkShape, the importer itself distorts the model. So both exporter and importer are distorting my models. Anyone know what's happening and how to solve this?</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Mod Ideas/LocalGravity</title>
    <id>23718</id>
    <revision>
      <id>32355</id>
      <timestamp>2008-07-07T04:13:56Z</timestamp>
      <contributor>
        <username>Crackerjack</username>
        <id>898</id>
      </contributor>
      <comment>New page: *Just throwing an idea out there ... perhaps this could be centered around Volumes? --~~~~</comment>
      <text xml:space="preserve">*Just throwing an idea out there ... perhaps this could be centered around Volumes? --[[User:Crackerjack|Crackerjack]] 04:13, 7 July 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Mouse Control</title>
    <id>23715</id>
    <revision>
      <id>32347</id>
      <timestamp>2008-06-24T11:30:03Z</timestamp>
      <contributor>
        <username>Girth</username>
        <id>825</id>
      </contributor>
      <comment>New page: The tutorial video references a 'Maya' style mouse control for the viewports in which you hold down the 'U' key in order to make the mouse controls function similar to Maya. Is there a way...</comment>
      <text xml:space="preserve">The tutorial video references a 'Maya' style mouse control for the viewports in which you hold down the 'U' key in order to make the mouse controls function similar to Maya. Is there a way of turning this on by default? Thanks.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:MultiSkyBox</title>
    <id>28917</id>
    <revision>
      <id>42887</id>
      <timestamp>2010-04-11T13:15:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>moved from article page and ansered last question</comment>
      <text xml:space="preserve">'''Tester:''' I made some parts of the quick tutorial clearer ;)

'''&lt;unknown&gt;''' Has anyone figured this thing out? Maybe they could write a tute for us less technically abled...:D

'''inio:''' That looks like a classic UT component.  For UT2003 I have a working rig in my [http://www.inio.org/~inio/DM-StupidSkyboxTricks.zip StupidSkyboxTricks] map, that also does scaled skybox movement.  In 2k3 you can't have zones with different skyboxes visible at once though, it'll cause problems.  That's why the zoning setup in that map is so funky.

'''SuperApe:''' I've been looking for something like this.  Of course, it on the wiki. :D  Looks pretty straight forward.  Edit: with quick tut that I haven't tested yet.

'''Cup Of Squirrels:''' Hmm I can't seem to get the actor to save when I compile. Am I doing something wrong?

'''MythOpus:''' Well if you're talking about an error when you try to compile it, try taking out the numbes on the left hand side of the code.  I don't think the compiler likes those there.

'''Che''' Both codes work for me, but only for 2 different skyboxes :(
If i try to use a third skybox for a third terrain, the first terrain always shows the sky of the third skybox.
Anyone got a solution to fix this?

:What &quot;codes&quot; do you mean? Keep in mind that from any location in your map only exactly one skybox can be visible, and that's the skybox associated to the zone you're looking from. No matter [[User:Wormbo/SelectableSkyZoneInfo|which implementation]] you use, they  are all the same in that regard as it's an engine limitation.—[[User:Wormbo|Wormbo]] 13:15, 11 April 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:MutTutorial</title>
    <id>23710</id>
    <revision>
      <id>32313</id>
      <timestamp>2008-06-06T17:22:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>moved discussion from article page</comment>
      <text xml:space="preserve">'''Tarquin:''' I don't understand what this is trying to show, or why there is no text on that page, only script. Secondly, in your script comments there are a number of questions you've left, and a few misconceptions. I suggest you get wait for feedback on it first before adding it to the chain of lessons.

'''EntropicLqd:''' Imagine you are completely new to Unreal Script.  Is this page going to actually help you in [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] or how to [[Legacy:Set Up Package Folders|Set Up Package Folders]].  There's no set of pre-requisites mentioned anywhere or even any real explanation of what is going on (note to self - must add them to my tut. page).  To my mind the worst thing about the tutorial is that you've assumed that someone has downloaded your code.  Try and fit your tutorial into a similar structure to the other tutorials on the Wiki.  At least that way all of the tutorials will be in a similar form.  Also one of your stated commands will not work under Windows XP, and one of them is redundant - but maybe I'm just being picky in my old age.

'''Mr.bob''' Uhhhhhhhhhh... what are pre-requisites (I mean in  ucode context). Also that is kind of weird because I just used this mut in windows xp and it compiled and then worked flawlessly. Also what does redundant mean. About the prompt command I think you are talking about, I'm surprised it didn't work. Maybe I misspelled it but when I type &quot;prompt $1 into command line in windows XP it gives me a blank prompt which is what I want. Finally there is a smiley I've been wanting to try out...&lt;br /&gt; :stupid:

Oh ya, most importantly this tutorial was not meant for reading, it was meant for downloading as folders a .uc file and a .int file. However that didn't seem to work out. In response to Tarquin (who seems to really enjoy messing with and moving around my things ... this gives me an idea :cheesy: ) this code is trying to give newbs some code that they can mess around with and understand. The very first step people do when they are learning to mess with code is to do things like replace the word health with shield, and this code lets them do that.

Later: Just discovered that all the links I had previously posted to the .zip file were broken. Here is one that has to work: [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName THE FILE]

Tarquin, why don't you tell me what the misconceptions are so I can fix them, you people should really give me a lot more input, although the problem is you can't because there are no links to this page.

'''Tarquin:''' things like &quot;says that there is a local variable that applies only to Xpawns, and that varaible is x.&quot; Please also take care to spell correctly. And please remove your tutorial from the list &amp;ndash; you can put the link further down the page if you like. You can get it linked by addding a category tag to this page.

'''EntropicLqd:''' The redundant command is indeed the prompt one.  You might not like to see where you are in the directory structure but I'm betting most people (like me) do.  Not only that, but the command is irrelevant.  You don't need it to compile any Unreal Script at all - but that's not explained.
: The one I thought wouldn't work under XP was running &quot;command&quot;.  It does work but gives you the old Win9x DOS shell.  The XP version (like NT) is ''cmd''.
: Pre-requisites in Unreal Script terms are the basic things someone needs to know before they can starting writing code.  I linked to them in my previous post.  Also, simply downloading some code and then tweaking the values to see what they do is a very inefficient way of learning.  A good tutorial does the following:
: * Explains what the tutorial will cover and what the person is supposed to learn from doing it.
: * Explains what the person doing the tutorial needs to know in order to complete it.  That is - the assumed ''base knowledge'' or as we like to say ''prerequisites''.
: * Explain in simple steps what must be done to accomplish the goal of the tutorial.  At this point explaining why things are done (in this case why ModifyPlayer() was used) in a lot of detail is necessary.  Your description of ModifyPlayer() is somewhat vague &amp;ndash; and could even be misleading.  And also, you should never ever leave questions unanswered in a tutorial.
: * Conclude with a summary of what the person is supposed to have learned from the tutorial.
: So to reiterate my original point, simply providing people with some code they can mess about with is not a tutorial.  It's also unlikely to help them write their own code in the future as it provides no method for understanding why something was done in a specific way.

'''Mr.bob:''' At this point I am once again forced to admit to my newbishness (is that even a word?) and bow down to your superior knowledge. Putting the tutorial on the front page was reckless and hasty (what do you expect, I'm 14). I will delete it from the front page and start working on one worthy of this terrific site, thx for the advice [[Legacy:EntropicLqd|EntropicLqd]] and sorry for bugging you by posting so much junk [[Legacy:Tarquin|Tarquin]]. A few more points, command, while not as good a cmd still works, but thx anyway for the update. Just saying it would help if you included a description of what modify player does, considering my description was very incorrect.

Growing up in the age of spell checkers has severely damaged my spelling capabilities.

My brother is insisting that I keep the things in progress section intact with my link in it, but I'm telling him [[Legacy:Tarquin|Tarquin]] isn't going to be happy.

Whew, that should do it, the tutorial isn't perfect yet, but it is much better then before. It is still not in traditional tutorial format, but I don't really like the traditional tutorial format.

'''Foxpaw:''' I put some more comments in there to explain some stuff that was a bit misleading. However, as you can now see, the comments take up so much space it's hard to see the code. What you might consider doing is listing the code in it's entirety (without the play by play comments) and then below that take each line and show it dissected.

'''Tarquin:''' &quot;I was sick of lessons like the regeneration mutator that would tell you to modify some code you found without telling you what that code meant.&quot; &amp;ndash; I think that is an ''excellent'' point! We should look into adding a &quot;How it works&quot; or &quot;What's going on&quot; section to our scripting tutorial pages!

'''Mr.Bob's brother:'''  a simple note about the prompt $1 thing. we use it because in Windows XP home edition you start in this part of the directory structure: &lt;tt&gt;C:/Documents and settings/~username&gt;&lt;/tt&gt; and the UT2004 directory is &lt;tt&gt;C:/UT2004&lt;/tt&gt; so we need to make the directory structure become blank to go down to C:/.

PS. call me Doodle77 because it is my username for a bunch of games

'''EntropicLqd:''' The ''prompt'' command simply changes the DOS prompt.  It ''does not'' change the directory you are in.  I suspect you actually meant &lt;CODE&gt;cd c:\UT2004&lt;/CODE&gt;.  If you wanted to make the directory structure blank then &lt;CODE&gt;format C:\&lt;/CODE&gt; is the command you are after.

'''Mr.bob:''' Never mind, you can type in the file path without typing in prompt $1 first, i have changed the script apropratly in light of this new discovery.

Wow this tutorial is really something now. Now i think it can add it to the chain. I will update the .zip file with the new code, and add it to the top of the Uscript lessons. The full exspanation of what the code means will REALLY help out people who are compleate newbs to programing.

'''Tarquin:''' Please could you:
* make links in your text
* add a few headings perhaps
* fix spelling mistakes
* explain what the variables you have modified mean
* I think it would be better to remove the explanations from the script entirely, it would make then easier to read &amp;ndash; instead of comments within script, a section of text with script extracts within it.

'''EntropicLqd:''' Right then Mr.Bob.  Please finish off your tutorial in the style it has started in.  If you do a good job maybe I'll come back and extend it with information regarding constructing a configuration GUI for it.

'''Mr.bob:''' This is what I like about the wiki, it is not me writing this tutorial anymore, it is the whole wiki community. It's very much like open source code, that is what makes open source programs so good and flawless, there is a large amount of people who can look at the code and change things.

'''EntropicLqd:''' Maybe, maybe not.  I'm just showing you how you should have written it in the first place.  I won't be finishing it off for you (and I doubt whether anyone else will) as I don't have time.  I certainly won't be restructuing any more of your tutorials if they are presented in the manner similar to the way this one was.

'''RegularX:''' While I like that more verbal tutes like this are getting written - it should be noted that because this is the wiki, tutes like Regen mutator can be appended to describe the inner workings of the tutorial itself...

'''Mr.bob:''' You said that you wouldn't be finishing it off. Personally I have seen much less polished tutorials then this. I think it is finished, what more does it need?

arg i read it and there is some sloppy coding, i changed it, Please don't change it back, it is acutally really bad. And this is a newb telling you this. First of all the config part is junk, second of all you repeated a lot of parts you didn't have to repeat, third of all the pre-requisites are MUCH steeper then what i had in mind ... ok it is so bad i am sequencering (&lt;-spelling bad) the whole new section and making one that doesn't suck so much later. Please don't put it back, the code is very misleading and wasteful. I can't do anything too soon becuase my mouse is broken, sry.

'''EntropicLqd:'''
: Firstly - Thanks Foxpaw.  I was in a hurry and didn't bother to read what I'd actually written.  Apologies to Mr Bob. for introducing ''junk'' into his perfect tutorial, and also to Foxpaw for making him come in here and fix it.
: Mr Bob, just because there are much less polished tutorials than this doesn't mean that is one is finished.  It just means that the other tutorials are not as good.  While I agree I repeated a lot of the stuff that is covered within the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial I felt it was necessary to make the tutorial complete.  You could also argue that this would be a better ''Hello World'' style tutorial than the existing one as it actually does something.
: Yes I agree the pre-requisites are fairly heavy.  However there is actually a fair amount of stuff that you need to know, and get right before you even start writing any code.
: I'm also fairly sure that the code is broken around the &quot;health&quot; area but I've not had time to actually compile it and check (I'm relatively sure the player's health will get reset to 100 should thep layer actually run over a standard health pickup).
: I've essentially left the compilation and use section for you to complete.  When that's done I'll add the GUI elements unless you also fill those in.

'''Mr.bob:''' New tutorial, in traditional format (me don't like tradition) and the coding is awful, I will make a major revision after I get my mouse fixed. I'm just glad entropiclqd didn't delete anything important. I thought he was skilled, and maybe he is, but it looks like he was trying to make a 2004 GUI and didn't quite complete it. You should know that when changing a public page you don't present new incomplete code that you haven't even complied and tested. If I complied this code, it probably would compile and even if it did, it would be very sloppy wasteful code that might glitch the program in a worst case scenario. I don't like the traditional format that much, but if you people insist that my tutorial look like everyone else's then it shall be. If you complete the 2004 GUI soon enough I will forgive you entopiclqd, but if you don't, I'm scraping all your work, or at least sequestering it.

One more point, the pre-requisites are completely ridiculous, you don't need the unreal script source code, you don't need to have read any of those pages, and I haven't glanced at the terminology page. The installed UT2004/3 on your computer is way too obvious. I also don't like how you changed it to MutPlayerTweak. NO ONE CHANGE THE ORIGANAL PAGE SECTION, good I made my self clear.

I just turned 15 today :)

'''EntropicLqd:'''
* This isn't a public page yet.
* Tutorials should be written for people to follow and understand.  Tradition has nothing to do with it.
* Thankyou for scrapping all my work. I look forward to seeing your alternative offering.
* MutTutorial is a crap name for the muator.
* I am indeed an ''old geezer''.
* Happy birthday.
* Oh dear - I just changed the original page section.

'''Mr.bob:''' Damn, i thought I deleted the old geezer part, (I did, you just looked at the history) i was in a bad mood. Your right, both the names are stupid, we need a good name. And I didn't scrap all your work yet, i will in five minutes. Your right about the part about tradition, the whole time i've been trying to create a downloadable tutorial, so you don't need to copy and paste too much, that is what my origanal structure was about. Thank you for the happy birthday. Now to look at the origanal page section ... YOU DELETED IT!!! :Pissed: that is very annoying, now I need to harvest it from the history. Are you mad at me for calling you an old geezer :cheesy: (i deleted it i tell you). But comeon, that was just pointless. Now to scrap most of your changes (i was going to wait a while, but you deleted the origanal page, and i have nothing better to do).

&quot;sigh&quot;, you could have just taken the compiling instructions from the origanal code, but i seems that you were too lazy.

I didn't compleatly scrap everything and a lot of the things you said were pretty good, all i ask is that you make a seperate page for the 2004 GUI, although i really want you to make one.

'''Tarquin:''' We can leave the GUI part out &amp;ndash; the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] tutorial should be generic enough to work with any mutator (and should be tweaked so it works like that). MrBob, if people are too lazy to copy &amp; paste instead of downloading, then modding ''really isn't for them''. :D I really don't think it's much of a timesaver, you still need to compile, and it's harder for us to maintain it here.

'''Mr.bob:''' Ok fine I'll take the download part out.

Entopiclqd, if you are interested in making a GUI for 2004 then look at this .uc file, if you have UT2004 then you probably have it, but for your convinance you can download it here: [http://home.earthlink.net/~theultimatebob/air_control.zip Air Control]. As you can tell the file is the air control mutator for UT2004, which is vaguly similer to the mutator above. I was not able to make any sense of it, or figure out how to tweak it enough to work with health instead of air control, but you know much more about Uscript then I do.

'''EntropicLqd:''' Please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference page for instructions on how to add GUI configuration to your mutator.  I will add a discussion section at the bottom of that page should you have additional questions.  If you find youself struggling with the page then I suggest referring to the set of pre-requisites I originally added to the tutorial.  Calling me an ''old geezer'' is in no way offensive - I am over twice you age.

'''Mr.bob:''' Kewl, about the whole GUI thing, the above link doesn't help me, makes no sense at all. Also the volume control mutator, helped a bit more, but doesn't have enough comments in the GUI section. So far my most useful resource has been air control.

'''Tarquin:''' Like I said above, [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] should give you a template to create a GUI for any given mutator, I hope. Since I don't have UT2004 I can't try it for myself. Now as for this page's name.... I have altered the listing on the Lessons page to be a bit clearer, and I want to do the same to the name. Since the main thing this does is alter jumping, how about &quot;SuperJump Mutator Tutorial&quot;?

'''Tarquin:''' Message for ppp-62-235-110-208.tiscali.be &amp;ndash; thanks for your typo corrections, much appreciated! But please don't introduce &quot;smart quotes&quot; into the wiki text (the &amp;amp;#8217; things) &amp;ndash; either turn them off in MS Word or use a text editor. Thanks!

'''Random Guest:''' Sorry about that.. I don't know how that happened, maybe because i'm using IE 5.0. Anyway, this script isn't working when I try to compile it. Says MaxHealth isn't a member of xPawn. The code-page doesn't use MaxHealth. Maybe this page, or the other needs some updating. I deleted the maxhealth thing, since it didn't work. There's HealthMax in Pawn, but setting Other.HealtMax gives me another error. I don't know why, I'm a newbie. I also had to take it out of the defaultproperties. Now it works.

'''MythOpus:'''  I don't have the time to test this Mut out but...  have you tried x.HealthMax instead of just deleteing it completely?  I think it's a critical part in the mutator...  I think without changing the HealthMax property, the health can't be set over it's max... which is... 199 I believe?  And why use Other when you can use x :) 

'''Tarquin:''' The variable I think you want is [[Legacy:Pawn|Pawn]].HealthMax. MrBob, did you actually TEST this????

'''Mr.bob:''' Ya, i tested it, three times, but not sense the most recent changes. sry. I'll test it now, and update the zip file.

Yay it compiled :), now to update the zip file.

Wait those aren't the problem. I see the problem now. The problem is that it is &quot;healthmax&quot;, not &quot;maxhealth&quot;. I have edited the code.

'''Random Guest:''' That was indeed the problem. The code as it is now works, but there's one small problem. Taking health vials (the +5 things) only boosts your health till 199, not till 250 of whatever. Regular health packs do get you to 250! Therefore, i would propose this code:

&lt;uscript&gt;
    x.Health = StartingHealth;
    x.HealthMax = StartingHealth;
    x.SuperHealthMax = HealthMax;
&lt;/uscript&gt;

This sets the paws starting health, as discussed before, says the normal health you can reach is the same starting health, and the super health (normally 199) is set to the maximum.

I also made gui-code (mutator settings in the configuration-screen), should i post them or is that overkill for this example?

'''EntropicLqd:''' It's a little overkill for this example.  Also, if the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page isn't good enough then it is that page that should be updated.  In terms of the smart-quotes - if you edit the tutorial text in Word, they will be added in automatically.  And if you use Notepad remember to turn ''wordwrap'' off.

'''Mr.bob:''' Greetings from saratoga! I've been on vacation and i havn't had acess to a computer. Right now I am using the library computer, unfortanatly I don't have a apointment and i'm in the childrens section computers (the adult comps were full). So they could kick me off at any time.

Ok, I'm going to change the code so there is super health max. Also random guest, if you have this mut with the GUI zip the .uc file(s), put them on your website (you have a website right?) and put a link to them. You can also make an extention tutorial on the wiki that tells you how to add a GUI to this mutator. Put it under the currently existing &quot;Adding a Configuration Window&quot; heading.

arg the : p_i_s_s_e_d : (ignore the underscores, they have a bunch of wierd filtering software on this computer which makes it so I can't write words like p_i_s_s. just don't ask) smily is broke! (or is it the filtering software on the kidy computers?).

'''Tarquin:''' I don't think SuperHealthMax = SuperMaxHealth is  a good choice of variable names.........

'''Mr.bob:''' Greating from independent lake camp! Can't think of a better var name sry. Also when is random guest going to show me how to make a GUI? Hope it is soon :)

'''Tarquin:''' well TRY. Having variables called SuperHealthMax and SuperMaxHealth  is just horribly confusing. What is the difference between these two vars? How do their names tell me of this difference? If you're going to write tutorials, you HAVE to think of this. Also, I don't think this tute should contain the GUI &amp;ndash; see what Ent said above.

'''MythOpus:''' Instead of using 'x' as a variable.  Couldn't you make life easier by using:

&lt;uscript&gt;
if (xPawn(Other) != None)
{
            xPawn(Other).MaxMultiJump = MultiJumpCount;
            xPawn(Other).MultiJumpBoost = MultiJumpBoost;
}

Other.Health = StartingHealth;
Other.HealthMax = MaximumHealth
Other.SuperHealthMax = SuperMaxHealth
&lt;/uscript&gt;

'''EntropicLqd:''' Mr Bob have you not read what has been written in the comments section?  RandomGuest has been specifically asked not to add a section on creating a GUI for the mutator as this is covered on the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page.  If you do not understand the information on that page then you should post some questions there.

'''Mr.bob:''' You said that he shouldn't add it on to this &lt;u&gt;page&lt;/u&gt;. I am asking him to make a seperate page. I know you are proud of the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page. But I have looked at it and tried some things and ....

'''EntropicLqd:'''....Comments moved to [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page as originally requested....

'''Mr.bob:''' :confused: I didn't request it to be moved to that page :confused: .

Random guest, at some point I would like to see this mut customized with a GUI somewhere. Don't worry, I wo't get inpatiant until I get back to NYC.

'''Random Guest:''' I've already put it on the wiki, but i haven't linked yet, since i don't know if i may, it's at [[Legacy:MutTutorial Code With GUI|MutTutorial Code With GUI]]. Read the [[Legacy:Recent Changes|Recent Changes]] ;)

'''Tarquin:''' MR Bob, have you actually read the comments above? Have you read my note about variable names? If you want to have a hand in writing a tutorial here, please take note of these things instead of asking for more help. 

'''Mr.bob:''' Sorry about my laziness tarquin. I'll change the bad var name now.

You are the coolest random guest. Thank you so much. :D :) :D

I tested the mutator with the GUI, it works perfectly. After I tweak it and make it bigger, i'm going to make a tutorial for it (unless random guest wants to first).

'''Tarquin:''' I thought this tutorial was meant to be '''simple'''.

'''Random Guest:''' Be my guest Mr. bob, make all you like. I don't like typing tutorials :-) You can use wotgreal (don't know the link to the page), that expands a menu when you type a dot.

'''Mr.bob:''' I meant I would make a different tutorial for this, one that would say that it was harder.

Does anyone know what other modifiable things are a part of the class Xpawn, besides the ones used above?

'''Mr.bob:''' It's been about 2 months, and the Mut turorial code with GUI hasn't been updated. And no one ahs responded to my question. :(

The mut tutorial with GUI has some confusing variable names, for example multijumpboost = multijumpboost and healthmax = healthmax , and superhealthmax = superhealthmax. They should be changed, in my opinion at least, (Behind my back my brother is compaining that those names make it easier and i'm wrong.

'''GRAF1K:''' Your question either is confusingly stated or assumes something incorrect, so people are unlikely to respond. Rephrase it and you'll have better luck.

'''Tarquin:''' With the variable names, I think you need to adopt a scheme that makes it clear which xPawn variable it relates to. Eg, 
 x.MultiJumpBoost = myMultiJumpBoost ;

and so on.

'''SuperApe:''' I'm just guessing by the sheer volume of discussion entries that this page needs a RefactorMe tag.  If not, (or if refactored) please remove.

'''Metabollica:''' Ok i've tried this out and i can't get it to compile. I'm a complete noob at this also and honestly this tutorial must need a lot of pre-requisites. Because i understand very little of what is being asked. The error i get is that it doesn't recognise type xPawn, i thought maybe it was a typo so i copy and pasted but nothing changed.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:New UnrealScript In UT3</title>
    <id>5088</id>
    <revision>
      <id>11766</id>
      <timestamp>2008-05-07T18:32:43Z</timestamp>
      <contributor>
        <username>HoMeRSiMpSoN</username>
        <id>49</id>
      </contributor>
      <minor/>
      <comment>New page: Does this belong in the &quot;Legacy&quot; area?</comment>
      <text xml:space="preserve">Does this belong in the &quot;Legacy&quot; area?</text>
    </revision>
    <revision>
      <id>11767</id>
      <timestamp>2008-05-07T18:33:17Z</timestamp>
      <contributor>
        <username>HoMeRSiMpSoN</username>
        <id>49</id>
      </contributor>
      <comment>Removing all content from page</comment>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>Legacy talk:Object (UT3)</title>
    <id>28611</id>
    <revision>
      <id>40448</id>
      <timestamp>2010-01-12T08:39:28Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>Created page with 'Okay so Ive been wondering, whats the purpose of these type of legacy pages when we have pages like [[UE3:Object_(UT3)|Object]]?? -~~~~'</comment>
      <text xml:space="preserve">Okay so Ive been wondering, whats the purpose of these type of legacy pages when we have pages like [[UE3:Object_(UT3)|Object]]?? -[[User:00zX|00zX]] 08:39, 12 January 2010 (UTC)</text>
    </revision>
    <revision>
      <id>40452</id>
      <timestamp>2010-01-12T09:57:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Project:Namespaces#Legacy]]</comment>
      <text xml:space="preserve">Okay so Ive been wondering, whats the purpose of these type of legacy pages when we have pages like [[UE3:Object_(UT3)|Object]]?? -[[User:00zX|00zX]] 08:39, 12 January 2010 (UTC)

That one's easy to answer: [[Project:Namespaces#Legacy]]&lt;br&gt;
The longer version: Legacy is all the content from the old UseMod-powered version of the Unreal Wiki. There are issues with the old wiki's licence, so we can't just copy those pages over to the main namespace and change their licence to CC. However, we also shouldn't just delete them. —[[User:Wormbo|Wormbo]] 09:57, 12 January 2010 (UTC)</text>
    </revision>
    <revision>
      <id>40458</id>
      <timestamp>2010-01-12T10:22:31Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <text xml:space="preserve">Okay so Ive been wondering, whats the purpose of these type of legacy pages when we have pages like [[UE3:Object_(UT3)|Object]]?? -[[User:00zX|00zX]] 08:39, 12 January 2010 (UTC)

That one's easy to answer: [[Project:Namespaces#Legacy]]&lt;br&gt;
The longer version: Legacy is all the content from the old UseMod-powered version of the Unreal Wiki. There are issues with the old wiki's licence, so we can't just copy those pages over to the main namespace and change their licence to CC. However, we also shouldn't just delete them. —[[User:Wormbo|Wormbo]] 09:57, 12 January 2010 (UTC)

Fair enough, I knew about the old licencing I just wasnt sure if duplicating material that, well lets me honest and say epic holds the right to class pages, I dont have a problem with leaving them but it could get confusing if people find themselves in the legacy namespace without knowing. Personally I much prefer the new system, the informations much easier to read and its very indepth. -[[User:00zX|00zX]] 10:22, 12 January 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Offline Wiki</title>
    <id>2334</id>
    <revision>
      <id>5625</id>
      <timestamp>2007-04-03T08:44:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>link problem</comment>
      <text xml:space="preserve">At long last and by popular request (not by Wiki regulars of course &amp;ndash; they want the raw Wiki power live, not a zipped version of it), the [[Legacy:Offline Wiki|Offline Wiki]] has been set up.  Thanks to the BeyondUnreal staff, especially MalHavoc and QAPete, for supporting it.

Post here if you'd like to discuss this feature, or if you have any problems using it.  If you find anything that looks like a bug to you, we'd be happy to hear about it as well. 

==Discussion==

'''Mychaeel:''' Phew.  Took long enough, but now it's there.  Will make a press release later today.

'''Jan:''' Cool. ;) Do you need a offline viewer?

'''Tarquin:''' Nice screenie. pity it's rendering with IE :( - the blue sidebar should go all the way down in a real browser :p

'''Jan:''' This tool is only a side project, to view all my web documents offline. What I miss is a folder structure inside the wiki offline version.

'''Mychaeel:''' Nice.  :-)  I've flattened the folder structure to simplify the relative referencing of other pages, images, smileys and so on; the page names have to be rewritten anyway to accommodate various platforms' limitations (no more than 32 characters on the Mac, case-insensitivity on Windows).  However, I could rather simply have the script create a .txt file containing a mapping table between actual page names and the generated file names &amp;ndash; an offline reader could read that file and display the actual structure.

'''El Muerte TDS:''' to bad there's no MS HTML Help compiler for linux, or else you could easily create HTML Help files. HTML Help files are very nice since they provide some very usefull features like full text search. Project and glossary files are easy to create.

----

'''Mychaeel:''' Sunir got me thinking (over at [[Legacy:Project Copyright/Discussion|Project Copyright/Discussion]]).  Maybe we should make it '''very''' clear on [[Legacy:Offline Wiki|Offline Wiki]] that the download is for private use only and not to be distributed commercially.  (That's implied in [[Legacy:Project Copyright|Project Copyright]] already, to be sure, but we know people think if they don't read copyright statements they don't apply to them.)

----

'''Mychaeel:''' For some reason several files that only differ in the capitalization of their file name are in the &quot;shared&quot; directory (for instance, InterWiki-Wikipedia.png and InterWiki-Wikipedia.PNG).  When extracting the archive under Windows that leads to unnecessary and confusing &quot;Overwrite this file?&quot; questions.  Please delete one of the files, whichever is unnecessary.

'''ZxAnPhOrIaN:''' Agreed. We should adopt a standard on only lower-case file types (a.jpg, not a.JPG). it would solve that problem.

'''Mychaeel:''' Yeah... well.  I take it it was an accident.  Hope tarquin sees it.  That's why I put that log message in that you overwrote by posting your comment.

'''Tarquin:''' Seen. It's because Photoshop puts CAPS extensions, and I forget to change them before uploading. The perl script cares about case, but the eventual URL does not. ARG! But will fix.

'''Mychaeel:''' ...the server doesn't?  http://wiki.beyondunreal.com/wiki-ext/wikilogo.jpg?link displays the Wiki logo, but http://wiki.beyondunreal.com/wiki-ext/WiKiLoGo.JpG?link yields a 404.

'''ZxAnPhOrIaN:''' I thought that you can't have mixed-case in file extensions.

'''Mychaeel:''' File extensions are just part of a file name separated from it by a dot, by convention.  You can have any case you like in there like everywhere else.

'''Chema:''' Hi people.  Neat site you are running here.  Was not until I found it that I felt like &quot;mastering unreal&quot;.  The offline wiki is another cute detail, especially for 56krs like me, or netecofreaks; like me ;-)  Could I suggest using a solid compression algo, like RAR or Bzip2?  Documents with repetitive text like headers and sidebars are the ideal meat for them.  I just tryed it: todays wiki (29,444,530 bytes) shrinks to 42% (12,706,692 bytes) when zipped; but it gets down to 26% (7,937,234 bytes) using solid RAR!  That's almost 5 MB less.  Even if you made the archive self extracting, it would be a lot lighter.  Keep up the good work, and count me in, even if I spend most of my wiki time on the offline version!

'''Mychaeel:''' We're limited by the compression software that's available on the server.  We have zip and bzip2 there, but no RAR compression utility (or I'm just bad at guessing names).  If you could point me to one that runs under Linux, I'll ask the BeyondUnreal admins to install it.

'''El Muerte TDS:''' unrar is free, rar isn't.

'''El Muerte TDS:''' btw here are some stats:
 34226176 in total
 12728922 test.zip
 8134137  test.tar.bz2
 8966783  test.tar.gz
 

bzip2 generates a high system load, gzip doesn't. So I think using tar gzip is the best solution.

'''Mychaeel:''' Sounds like a good idea.  Is .tgz widely enough supported by Windows archivers to allow us to completely scratch the .zip version in favor of a .tgz one?

'''Mysterial:''' WinZip and WinRAR support it and they're the two most widely used archivers.

'''Chema:''' Usually bandwith is more precious ('myyyy preshiouuus' ;-) ) than some extra cpu cycles, but bzip2 is indeeded not widely supported in Windows: just by WinRAR and, well, bzip2.exe, to my knowledge (WinZip barely provides tgz support &amp;ndash; just decompression, couse zip provides &quot;similar functionality&quot;. haha).

Well, you could provide both formats, but that means even more cycles.  But even better would be to have weekly snapshots, that would weight a few hundred KBs in tgz.  A simple &quot;find . -ctime 7&quot; would do the trick; well, if your usual script is that simple too.

But I see there is still the zip pack.  If I can help writing the stuff, just tell me so (with a brief, err, debriefing: sh or perl? target for cron?).

'''El Muerte TDS:''' I don't know if weekly snapshots are such a good idea, because it would require you to download  the snapshot everyweek, you can't mis a single week or you will have to download the full snapshot again. And the offline wiki is only intresting for users without broadband.

'''Mychaeel:''' Adding support for RAR is a matter of (1) having a RAR compressor for Linux and (2) adding a single line of code to the current Offline Wiki (Perl) script.  My concern is more for BeyondUnreal's bandwidth than the users' in this case; right now a single 13 MB-file is uploaded to all mirrors once a day, and each compression format we'd provide in addition to that would add to that load (multiplied by the number of mirrors, naturally).

'''Chema:''' Err, you got me wrong: I was talking about bzip2 format, not RAR.  Anyway, yes, I think that having 2 formats its not elegant (not 'perlish' ;-) ), thats why I think the weekly snapshot is much better.

In response to El Muerte, you don't have to get the snapshot every week: I think they should be really tiny (100-500KB at most, in tgz? well, not counting when I upload my vactaion pics!), and several of them could be stored on the Offline Wiki page.  So you just need to check your last update, and get the newer snapshots.

'''El Muerte TDS:''' what about this: &quot;snapshot on request&quot; you can select the timeframe of the snapshot and then a archive will be created on the fly and feeded realtime to your browser ;)

'''Mychaeel:''' Hmm... maybe that's not even so far off.  Executing the Offline Wiki script takes several minutes to complete, but that's mostly due to several thousand pages that have to be read and formatted.  Actually packing a subset of pages into a downloadable archive file takes much less time. &amp;ndash; However, the problem remains that file downloads shouldn't be served directly from a BeyondUnreal-hosted site.

'''GRAF1K:''' Gehn, the offline wiki file size does change frequently due to constant edits. Thanks for the update.

----

'''Mychaeel:''' Offline Wiki is up and running again after it went down April 29, 2004, and nobody bothered telling me/us... according to hal from BeyondUnreal, the Perl script building the Offline Wiki has been throwing warning messages for quite a while, but they chose to ignore them rather than to tell us about them.  :-/

'''Tarquin:''' I had no idea... 

----

'''El Muerte:''' I've put up an readonly mirror of the UnrealWiki [http://unreal.student.utwente.nl/wiki/ here], it uses this offline wiki for it's content. Quite some things don't work (like search), and the page naming isn't 1on1, but at least we'll have a fallback when BU goes offline again.

'''El Muerte:''' it's broken, the current archive is from november 5

----

'''Techno_JF:''' Just so it's clear, the offline wiki hasn't been updated in a while.  I don't know if that's by accident or by design, but I think people should be aware of it either way.  I just downloaded it, and the date on the pages said &quot;Sat, November 5, 2005&quot;.  For reference, today's date is February 21, 2006.

'''HC Denton:''' Is someone going to fix this? The offline wiki is a nice thing because it ensures you have access to all docs even if the wiki goes down temporarily..

'''FEID:''' i noticed the same problem the offline wiki isn't working and 

can't get recent Added Pages!!!  

----

'''fyfe:''' Almost a year now and the offline wiki is still offline. Is it dead for good, or is it just a glitch the higher ups haven't noticed :p

'''Tarquin:''' It's down to BU admins. You can contact them yourself :)

'''feid:''' so you can do nothing at all, i mean whats the point for this page if nothing is updated, it pretty much useless when new information get published, and what about when our precious wiki is gone, i want somthing to remener it by, in the future.

'''Tarquin:''' Basically, no, I can't do anything. BU's server must be doing something wrong.

'''fyfe:''' Sent an e-mail to qapete, but I never got a response.

'''fyfe:''' Got a e-mail from qapete, it's now fixed :)

'''fyfe:''' But it doesn't look like it's hit the mirrors yet :(

'''fyfe:''' The mirrors have caught up now :D

----

===Blocking offline readers===

'''fyfe:''' Not sure if you've got anything like this implemented, but if you wanted to block the casual user from strip mining the wiki with an offline reader you can add the following to ''.htaccess''

&lt;pre&gt;
RewriteEngine on

# Send offline readers to offlinewiki.html
RewriteCond %{HTTP_USER_AGENT} (Wget|CherryPickerSE|CherryPickerElite|ExtractorPro|WebStripper|WebCopier|WebZIP) 
RewriteRule ^.*$ offlinewiki.html [L]
&lt;/pre&gt;

then create a file called ''/offlinewiki.html'' (don't put any links in it)

&lt;pre&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Never use an offline reader to download the entire Unreal Wiki.&lt;/title&gt;
		&lt;meta name=&quot;robots&quot; content=&quot;noindex,nofollow&quot;&gt;
	&lt;/head&gt;
	&lt;body style=&quot;color:#000000;background-color:#FFFFFF;&quot;  bgcolor=&quot;#FFFFFF&quot; color=&quot;#000000&quot;&gt;
		&lt;p&gt;&lt;strong&gt;Never use an offline reader to download the entire Unreal Wiki. If you do, 
		   we will ban you instantly and permanently.&lt;/strong&gt; Offline readers put an insane 
		   stress on the web server because they follow each and every of the 
		   processing-intensive maintenance links on the Wiki that are used seldomly by real 
		   people. Don't say you haven't been warned.&lt;/p&gt;

		&lt;p&gt;We're providing the entire Wiki content as a convenient single download on Offline 
		   Wiki [&lt;span style=&quot;color:#FF0000;&quot;&gt;http://wiki.beyondunreal.com/wiki/Offline_Wiki&lt;/span&gt;] 
		   though. It's smaller, zipped and downloads faster than what any offline reader 
		   could give you. Of course you can also save individual pages using your web browser 
		   without problems.&lt;/p&gt;
	&lt;/body&gt;
&lt;/html&gt;
&lt;/pre&gt;

The same could be done for bad robots that ignore ''/robots.txt'' just change the ''RewriteRule to
 # Send a &quot;403 Forbidden&quot; response
 RewriteRule ^.*$ - [F]

===Download Links===

'''Wormbo:''' Appearantly the FileFront mirror linked on BU FileWorks points to the wrong file.</text>
    </revision>
    <revision>
      <id>5626</id>
      <timestamp>2006-12-02T18:10:56Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">At long last and by popular request (not by Wiki regulars of course &amp;ndash; they want the raw Wiki power live, not a zipped version of it), the [[Legacy:Offline Wiki|Offline Wiki]] has been set up.  Thanks to the BeyondUnreal staff, especially MalHavoc and QAPete, for supporting it.

Post here if you'd like to discuss this feature, or if you have any problems using it.  If you find anything that looks like a bug to you, we'd be happy to hear about it as well. 

==Discussion==

'''Mychaeel:''' Phew.  Took long enough, but now it's there.  Will make a press release later today.

'''Jan:''' Cool. ;) Do you need a offline viewer?

'''Tarquin:''' Nice screenie. pity it's rendering with IE :( - the blue sidebar should go all the way down in a real browser :p

'''Jan:''' This tool is only a side project, to view all my web documents offline. What I miss is a folder structure inside the wiki offline version.

'''Mychaeel:''' Nice.  :-)  I've flattened the folder structure to simplify the relative referencing of other pages, images, smileys and so on; the page names have to be rewritten anyway to accommodate various platforms' limitations (no more than 32 characters on the Mac, case-insensitivity on Windows).  However, I could rather simply have the script create a .txt file containing a mapping table between actual page names and the generated file names &amp;ndash; an offline reader could read that file and display the actual structure.

'''El Muerte TDS:''' to bad there's no MS HTML Help compiler for linux, or else you could easily create HTML Help files. HTML Help files are very nice since they provide some very usefull features like full text search. Project and glossary files are easy to create.

----

'''Mychaeel:''' Sunir got me thinking (over at [[Legacy:Project Copyright/Discussion|Project Copyright/Discussion]]).  Maybe we should make it '''very''' clear on [[Legacy:Offline Wiki|Offline Wiki]] that the download is for private use only and not to be distributed commercially.  (That's implied in [[Legacy:Project Copyright|Project Copyright]] already, to be sure, but we know people think if they don't read copyright statements they don't apply to them.)

----

'''Mychaeel:''' For some reason several files that only differ in the capitalization of their file name are in the &quot;shared&quot; directory (for instance, InterWiki-Wikipedia.png and InterWiki-Wikipedia.PNG).  When extracting the archive under Windows that leads to unnecessary and confusing &quot;Overwrite this file?&quot; questions.  Please delete one of the files, whichever is unnecessary.

'''ZxAnPhOrIaN:''' Agreed. We should adopt a standard on only lower-case file types (a.jpg, not a.JPG). it would solve that problem.

'''Mychaeel:''' Yeah... well.  I take it it was an accident.  Hope tarquin sees it.  That's why I put that log message in that you overwrote by posting your comment.

'''Tarquin:''' Seen. It's because Photoshop puts CAPS extensions, and I forget to change them before uploading. The perl script cares about case, but the eventual URL does not. ARG! But will fix.

'''Mychaeel:''' ...the server doesn't?  http://wiki.beyondunreal.com/wiki-ext/wikilogo.jpg?link displays the Wiki logo, but http://wiki.beyondunreal.com/wiki-ext/WiKiLoGo.JpG?link yields a 404.

'''ZxAnPhOrIaN:''' I thought that you can't have mixed-case in file extensions.

'''Mychaeel:''' File extensions are just part of a file name separated from it by a dot, by convention.  You can have any case you like in there like everywhere else.

'''Chema:''' Hi people.  Neat site you are running here.  Was not until I found it that I felt like &quot;mastering unreal&quot;.  The offline wiki is another cute detail, especially for 56krs like me, or netecofreaks; like me ;-)  Could I suggest using a solid compression algo, like RAR or Bzip2?  Documents with repetitive text like headers and sidebars are the ideal meat for them.  I just tryed it: todays wiki (29,444,530 bytes) shrinks to 42% (12,706,692 bytes) when zipped; but it gets down to 26% (7,937,234 bytes) using solid RAR!  That's almost 5 MB less.  Even if you made the archive self extracting, it would be a lot lighter.  Keep up the good work, and count me in, even if I spend most of my wiki time on the offline version!

'''Mychaeel:''' We're limited by the compression software that's available on the server.  We have zip and bzip2 there, but no RAR compression utility (or I'm just bad at guessing names).  If you could point me to one that runs under Linux, I'll ask the BeyondUnreal admins to install it.

'''El Muerte TDS:''' unrar is free, rar isn't.

'''El Muerte TDS:''' btw here are some stats:
 34226176 in total
 12728922 test.zip
 8134137  test.tar.bz2
 8966783  test.tar.gz
 

bzip2 generates a high system load, gzip doesn't. So I think using tar gzip is the best solution.

'''Mychaeel:''' Sounds like a good idea.  Is .tgz widely enough supported by Windows archivers to allow us to completely scratch the .zip version in favor of a .tgz one?

'''Mysterial:''' WinZip and WinRAR support it and they're the two most widely used archivers.

'''Chema:''' Usually bandwith is more precious ('myyyy preshiouuus' ;-) ) than some extra cpu cycles, but bzip2 is indeeded not widely supported in Windows: just by WinRAR and, well, bzip2.exe, to my knowledge (WinZip barely provides tgz support &amp;ndash; just decompression, couse zip provides &quot;similar functionality&quot;. haha).

Well, you could provide both formats, but that means even more cycles.  But even better would be to have weekly snapshots, that would weight a few hundred KBs in tgz.  A simple &quot;find . -ctime 7&quot; would do the trick; well, if your usual script is that simple too.

But I see there is still the zip pack.  If I can help writing the stuff, just tell me so (with a brief, err, debriefing: sh or perl? target for cron?).

'''El Muerte TDS:''' I don't know if weekly snapshots are such a good idea, because it would require you to download  the snapshot everyweek, you can't mis a single week or you will have to download the full snapshot again. And the offline wiki is only intresting for users without broadband.

'''Mychaeel:''' Adding support for RAR is a matter of (1) having a RAR compressor for Linux and (2) adding a single line of code to the current Offline Wiki (Perl) script.  My concern is more for BeyondUnreal's bandwidth than the users' in this case; right now a single 13 MB-file is uploaded to all mirrors once a day, and each compression format we'd provide in addition to that would add to that load (multiplied by the number of mirrors, naturally).

'''Chema:''' Err, you got me wrong: I was talking about bzip2 format, not RAR.  Anyway, yes, I think that having 2 formats its not elegant (not 'perlish' ;-) ), thats why I think the weekly snapshot is much better.

In response to El Muerte, you don't have to get the snapshot every week: I think they should be really tiny (100-500KB at most, in tgz? well, not counting when I upload my vactaion pics!), and several of them could be stored on the Offline Wiki page.  So you just need to check your last update, and get the newer snapshots.

'''El Muerte TDS:''' what about this: &quot;snapshot on request&quot; you can select the timeframe of the snapshot and then a archive will be created on the fly and feeded realtime to your browser ;)

'''Mychaeel:''' Hmm... maybe that's not even so far off.  Executing the Offline Wiki script takes several minutes to complete, but that's mostly due to several thousand pages that have to be read and formatted.  Actually packing a subset of pages into a downloadable archive file takes much less time. &amp;ndash; However, the problem remains that file downloads shouldn't be served directly from a BeyondUnreal-hosted site.

'''GRAF1K:''' Gehn, the offline wiki file size does change frequently due to constant edits. Thanks for the update.

----

'''Mychaeel:''' Offline Wiki is up and running again after it went down April 29, 2004, and nobody bothered telling me/us... according to hal from BeyondUnreal, the Perl script building the Offline Wiki has been throwing warning messages for quite a while, but they chose to ignore them rather than to tell us about them.  :-/

'''Tarquin:''' I had no idea... 

----

'''El Muerte:''' I've put up an readonly mirror of the UnrealWiki [http://unreal.student.utwente.nl/wiki/ here], it uses this offline wiki for it's content. Quite some things don't work (like search), and the page naming isn't 1on1, but at least we'll have a fallback when BU goes offline again.

'''El Muerte:''' it's broken, the current archive is from november 5

----

'''Techno_JF:''' Just so it's clear, the offline wiki hasn't been updated in a while.  I don't know if that's by accident or by design, but I think people should be aware of it either way.  I just downloaded it, and the date on the pages said &quot;Sat, November 5, 2005&quot;.  For reference, today's date is February 21, 2006.

'''HC Denton:''' Is someone going to fix this? The offline wiki is a nice thing because it ensures you have access to all docs even if the wiki goes down temporarily..

'''FEID:''' i noticed the same problem the offline wiki isn't working and 

can't get recent Added Pages!!!  

----

'''fyfe:''' Almost a year now and the offline wiki is still offline. Is it dead for good, or is it just a glitch the higher ups haven't noticed :p

'''Tarquin:''' It's down to BU admins. You can contact them yourself :)

'''feid:''' so you can do nothing at all, i mean whats the point for this page if nothing is updated, it pretty much useless when new information get published, and what about when our precious wiki is gone, i want somthing to remener it by, in the future.

'''Tarquin:''' Basically, no, I can't do anything. BU's server must be doing something wrong.

'''fyfe:''' Sent an e-mail to qapete, but I never got a response.

'''fyfe:''' Got a e-mail from qapete, it's now fixed :)

'''fyfe:''' But it doesn't look like it's hit the mirrors yet :(

'''fyfe:''' The mirrors have caught up now :D

----

===Blocking offline readers===

'''fyfe:''' Not sure if you've got anything like this implemented, but if you wanted to block the casual user from strip mining the wiki with an offline reader you can add the following to ''.htaccess''

&lt;pre&gt;
RewriteEngine on

# Send offline readers to offlinewiki.html
RewriteCond %{HTTP_USER_AGENT} (Wget|CherryPickerSE|CherryPickerElite|ExtractorPro|WebStripper|WebCopier|WebZIP) 
RewriteRule ^.*$ offlinewiki.html [L]
&lt;/pre&gt;

then create a file called ''/offlinewiki.html'' (don't put any links in it)

&lt;pre&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Never use an offline reader to download the entire Unreal Wiki.&lt;/title&gt;
		&lt;meta name=&quot;robots&quot; content=&quot;noindex,nofollow&quot;&gt;
	&lt;/head&gt;
	&lt;body style=&quot;color:#000000;background-color:#FFFFFF;&quot;  bgcolor=&quot;#FFFFFF&quot; color=&quot;#000000&quot;&gt;
		&lt;p&gt;&lt;strong&gt;Never use an offline reader to download the entire Unreal Wiki. If you do, 
		   we will ban you instantly and permanently.&lt;/strong&gt; Offline readers put an insane 
		   stress on the web server because they follow each and every of the 
		   processing-intensive maintenance links on the Wiki that are used seldomly by real 
		   people. Don't say you haven't been warned.&lt;/p&gt;

		&lt;p&gt;We're providing the entire Wiki content as a convenient single download on Offline 
		   Wiki [&lt;span style=&quot;color:#FF0000;&quot;&gt;http://wiki.beyondunreal.com/wiki/Offline_Wiki&lt;/span&gt;] 
		   though. It's smaller, zipped and downloads faster than what any offline reader 
		   could give you. Of course you can also save individual pages using your web browser 
		   without problems.&lt;/p&gt;
	&lt;/body&gt;
&lt;/html&gt;
&lt;/pre&gt;

The same could be done for bad robots that ignore ''/robots.txt'' just change the ''RewriteRule to
 # Send a &quot;403 Forbidden&quot; response
 RewriteRule ^.*$ - [F]</text>
    </revision>
    <revision>
      <id>32289</id>
      <timestamp>2008-05-30T21:52:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>[[Legacy:Offline Wiki/Discuss]] moved to [[Legacy talk:Offline Wiki]]</comment>
      <text xml:space="preserve">At long last and by popular request (not by Wiki regulars of course &amp;ndash; they want the raw Wiki power live, not a zipped version of it), the [[Legacy:Offline Wiki|Offline Wiki]] has been set up.  Thanks to the BeyondUnreal staff, especially MalHavoc and QAPete, for supporting it.

Post here if you'd like to discuss this feature, or if you have any problems using it.  If you find anything that looks like a bug to you, we'd be happy to hear about it as well. 

==Discussion==

'''Mychaeel:''' Phew.  Took long enough, but now it's there.  Will make a press release later today.

'''Jan:''' Cool. ;) Do you need a offline viewer?

'''Tarquin:''' Nice screenie. pity it's rendering with IE :( - the blue sidebar should go all the way down in a real browser :p

'''Jan:''' This tool is only a side project, to view all my web documents offline. What I miss is a folder structure inside the wiki offline version.

'''Mychaeel:''' Nice.  :-)  I've flattened the folder structure to simplify the relative referencing of other pages, images, smileys and so on; the page names have to be rewritten anyway to accommodate various platforms' limitations (no more than 32 characters on the Mac, case-insensitivity on Windows).  However, I could rather simply have the script create a .txt file containing a mapping table between actual page names and the generated file names &amp;ndash; an offline reader could read that file and display the actual structure.

'''El Muerte TDS:''' to bad there's no MS HTML Help compiler for linux, or else you could easily create HTML Help files. HTML Help files are very nice since they provide some very usefull features like full text search. Project and glossary files are easy to create.

----

'''Mychaeel:''' Sunir got me thinking (over at [[Legacy:Project Copyright/Discussion|Project Copyright/Discussion]]).  Maybe we should make it '''very''' clear on [[Legacy:Offline Wiki|Offline Wiki]] that the download is for private use only and not to be distributed commercially.  (That's implied in [[Legacy:Project Copyright|Project Copyright]] already, to be sure, but we know people think if they don't read copyright statements they don't apply to them.)

----

'''Mychaeel:''' For some reason several files that only differ in the capitalization of their file name are in the &quot;shared&quot; directory (for instance, InterWiki-Wikipedia.png and InterWiki-Wikipedia.PNG).  When extracting the archive under Windows that leads to unnecessary and confusing &quot;Overwrite this file?&quot; questions.  Please delete one of the files, whichever is unnecessary.

'''ZxAnPhOrIaN:''' Agreed. We should adopt a standard on only lower-case file types (a.jpg, not a.JPG). it would solve that problem.

'''Mychaeel:''' Yeah... well.  I take it it was an accident.  Hope tarquin sees it.  That's why I put that log message in that you overwrote by posting your comment.

'''Tarquin:''' Seen. It's because Photoshop puts CAPS extensions, and I forget to change them before uploading. The perl script cares about case, but the eventual URL does not. ARG! But will fix.

'''Mychaeel:''' ...the server doesn't?  http://wiki.beyondunreal.com/wiki-ext/wikilogo.jpg?link displays the Wiki logo, but http://wiki.beyondunreal.com/wiki-ext/WiKiLoGo.JpG?link yields a 404.

'''ZxAnPhOrIaN:''' I thought that you can't have mixed-case in file extensions.

'''Mychaeel:''' File extensions are just part of a file name separated from it by a dot, by convention.  You can have any case you like in there like everywhere else.

'''Chema:''' Hi people.  Neat site you are running here.  Was not until I found it that I felt like &quot;mastering unreal&quot;.  The offline wiki is another cute detail, especially for 56krs like me, or netecofreaks; like me ;-)  Could I suggest using a solid compression algo, like RAR or Bzip2?  Documents with repetitive text like headers and sidebars are the ideal meat for them.  I just tryed it: todays wiki (29,444,530 bytes) shrinks to 42% (12,706,692 bytes) when zipped; but it gets down to 26% (7,937,234 bytes) using solid RAR!  That's almost 5 MB less.  Even if you made the archive self extracting, it would be a lot lighter.  Keep up the good work, and count me in, even if I spend most of my wiki time on the offline version!

'''Mychaeel:''' We're limited by the compression software that's available on the server.  We have zip and bzip2 there, but no RAR compression utility (or I'm just bad at guessing names).  If you could point me to one that runs under Linux, I'll ask the BeyondUnreal admins to install it.

'''El Muerte TDS:''' unrar is free, rar isn't.

'''El Muerte TDS:''' btw here are some stats:
 34226176 in total
 12728922 test.zip
 8134137  test.tar.bz2
 8966783  test.tar.gz
 

bzip2 generates a high system load, gzip doesn't. So I think using tar gzip is the best solution.

'''Mychaeel:''' Sounds like a good idea.  Is .tgz widely enough supported by Windows archivers to allow us to completely scratch the .zip version in favor of a .tgz one?

'''Mysterial:''' WinZip and WinRAR support it and they're the two most widely used archivers.

'''Chema:''' Usually bandwith is more precious ('myyyy preshiouuus' ;-) ) than some extra cpu cycles, but bzip2 is indeeded not widely supported in Windows: just by WinRAR and, well, bzip2.exe, to my knowledge (WinZip barely provides tgz support &amp;ndash; just decompression, couse zip provides &quot;similar functionality&quot;. haha).

Well, you could provide both formats, but that means even more cycles.  But even better would be to have weekly snapshots, that would weight a few hundred KBs in tgz.  A simple &quot;find . -ctime 7&quot; would do the trick; well, if your usual script is that simple too.

But I see there is still the zip pack.  If I can help writing the stuff, just tell me so (with a brief, err, debriefing: sh or perl? target for cron?).

'''El Muerte TDS:''' I don't know if weekly snapshots are such a good idea, because it would require you to download  the snapshot everyweek, you can't mis a single week or you will have to download the full snapshot again. And the offline wiki is only intresting for users without broadband.

'''Mychaeel:''' Adding support for RAR is a matter of (1) having a RAR compressor for Linux and (2) adding a single line of code to the current Offline Wiki (Perl) script.  My concern is more for BeyondUnreal's bandwidth than the users' in this case; right now a single 13 MB-file is uploaded to all mirrors once a day, and each compression format we'd provide in addition to that would add to that load (multiplied by the number of mirrors, naturally).

'''Chema:''' Err, you got me wrong: I was talking about bzip2 format, not RAR.  Anyway, yes, I think that having 2 formats its not elegant (not 'perlish' ;-) ), thats why I think the weekly snapshot is much better.

In response to El Muerte, you don't have to get the snapshot every week: I think they should be really tiny (100-500KB at most, in tgz? well, not counting when I upload my vactaion pics!), and several of them could be stored on the Offline Wiki page.  So you just need to check your last update, and get the newer snapshots.

'''El Muerte TDS:''' what about this: &quot;snapshot on request&quot; you can select the timeframe of the snapshot and then a archive will be created on the fly and feeded realtime to your browser ;)

'''Mychaeel:''' Hmm... maybe that's not even so far off.  Executing the Offline Wiki script takes several minutes to complete, but that's mostly due to several thousand pages that have to be read and formatted.  Actually packing a subset of pages into a downloadable archive file takes much less time. &amp;ndash; However, the problem remains that file downloads shouldn't be served directly from a BeyondUnreal-hosted site.

'''GRAF1K:''' Gehn, the offline wiki file size does change frequently due to constant edits. Thanks for the update.

----

'''Mychaeel:''' Offline Wiki is up and running again after it went down April 29, 2004, and nobody bothered telling me/us... according to hal from BeyondUnreal, the Perl script building the Offline Wiki has been throwing warning messages for quite a while, but they chose to ignore them rather than to tell us about them.  :-/

'''Tarquin:''' I had no idea... 

----

'''El Muerte:''' I've put up an readonly mirror of the UnrealWiki [http://unreal.student.utwente.nl/wiki/ here], it uses this offline wiki for it's content. Quite some things don't work (like search), and the page naming isn't 1on1, but at least we'll have a fallback when BU goes offline again.

'''El Muerte:''' it's broken, the current archive is from november 5

----

'''Techno_JF:''' Just so it's clear, the offline wiki hasn't been updated in a while.  I don't know if that's by accident or by design, but I think people should be aware of it either way.  I just downloaded it, and the date on the pages said &quot;Sat, November 5, 2005&quot;.  For reference, today's date is February 21, 2006.

'''HC Denton:''' Is someone going to fix this? The offline wiki is a nice thing because it ensures you have access to all docs even if the wiki goes down temporarily..

'''FEID:''' i noticed the same problem the offline wiki isn't working and 

can't get recent Added Pages!!!  

----

'''fyfe:''' Almost a year now and the offline wiki is still offline. Is it dead for good, or is it just a glitch the higher ups haven't noticed :p

'''Tarquin:''' It's down to BU admins. You can contact them yourself :)

'''feid:''' so you can do nothing at all, i mean whats the point for this page if nothing is updated, it pretty much useless when new information get published, and what about when our precious wiki is gone, i want somthing to remener it by, in the future.

'''Tarquin:''' Basically, no, I can't do anything. BU's server must be doing something wrong.

'''fyfe:''' Sent an e-mail to qapete, but I never got a response.

'''fyfe:''' Got a e-mail from qapete, it's now fixed :)

'''fyfe:''' But it doesn't look like it's hit the mirrors yet :(

'''fyfe:''' The mirrors have caught up now :D

----

===Blocking offline readers===

'''fyfe:''' Not sure if you've got anything like this implemented, but if you wanted to block the casual user from strip mining the wiki with an offline reader you can add the following to ''.htaccess''

&lt;pre&gt;
RewriteEngine on

# Send offline readers to offlinewiki.html
RewriteCond %{HTTP_USER_AGENT} (Wget|CherryPickerSE|CherryPickerElite|ExtractorPro|WebStripper|WebCopier|WebZIP) 
RewriteRule ^.*$ offlinewiki.html [L]
&lt;/pre&gt;

then create a file called ''/offlinewiki.html'' (don't put any links in it)

&lt;pre&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Never use an offline reader to download the entire Unreal Wiki.&lt;/title&gt;
		&lt;meta name=&quot;robots&quot; content=&quot;noindex,nofollow&quot;&gt;
	&lt;/head&gt;
	&lt;body style=&quot;color:#000000;background-color:#FFFFFF;&quot;  bgcolor=&quot;#FFFFFF&quot; color=&quot;#000000&quot;&gt;
		&lt;p&gt;&lt;strong&gt;Never use an offline reader to download the entire Unreal Wiki. If you do, 
		   we will ban you instantly and permanently.&lt;/strong&gt; Offline readers put an insane 
		   stress on the web server because they follow each and every of the 
		   processing-intensive maintenance links on the Wiki that are used seldomly by real 
		   people. Don't say you haven't been warned.&lt;/p&gt;

		&lt;p&gt;We're providing the entire Wiki content as a convenient single download on Offline 
		   Wiki [&lt;span style=&quot;color:#FF0000;&quot;&gt;http://wiki.beyondunreal.com/wiki/Offline_Wiki&lt;/span&gt;] 
		   though. It's smaller, zipped and downloads faster than what any offline reader 
		   could give you. Of course you can also save individual pages using your web browser 
		   without problems.&lt;/p&gt;
	&lt;/body&gt;
&lt;/html&gt;
&lt;/pre&gt;

The same could be done for bad robots that ignore ''/robots.txt'' just change the ''RewriteRule to
 # Send a &quot;403 Forbidden&quot; response
 RewriteRule ^.*$ - [F]

===Download Links===

'''Wormbo:''' Appearantly the FileFront mirror linked on BU FileWorks points to the wrong file.</text>
    </revision>
    <revision>
      <id>32354</id>
      <timestamp>2008-07-06T13:25:23Z</timestamp>
      <contributor>
        <username>Q</username>
        <id>895</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">At long last and by popular request (not by Wiki regulars of course &amp;ndash; they want the raw Wiki power live, not a zipped version of it), the [[Legacy:Offline Wiki|Offline Wiki]] has been set up.  Thanks to the BeyondUnreal staff, especially MalHavoc and QAPete, for supporting it.

Post here if you'd like to discuss this feature, or if you have any problems using it.  If you find anything that looks like a bug to you, we'd be happy to hear about it as well. 

==Discussion==

'''Mychaeel:''' Phew.  Took long enough, but now it's there.  Will make a press release later today.

'''Jan:''' Cool. ;) Do you need a offline viewer?

'''Tarquin:''' Nice screenie. pity it's rendering with IE :( - the blue sidebar should go all the way down in a real browser :p

'''Jan:''' This tool is only a side project, to view all my web documents offline. What I miss is a folder structure inside the wiki offline version.

'''Mychaeel:''' Nice.  :-)  I've flattened the folder structure to simplify the relative referencing of other pages, images, smileys and so on; the page names have to be rewritten anyway to accommodate various platforms' limitations (no more than 32 characters on the Mac, case-insensitivity on Windows).  However, I could rather simply have the script create a .txt file containing a mapping table between actual page names and the generated file names &amp;ndash; an offline reader could read that file and display the actual structure.

'''El Muerte TDS:''' to bad there's no MS HTML Help compiler for linux, or else you could easily create HTML Help files. HTML Help files are very nice since they provide some very usefull features like full text search. Project and glossary files are easy to create.

----

'''Mychaeel:''' Sunir got me thinking (over at [[Legacy:Project Copyright/Discussion|Project Copyright/Discussion]]).  Maybe we should make it '''very''' clear on [[Legacy:Offline Wiki|Offline Wiki]] that the download is for private use only and not to be distributed commercially.  (That's implied in [[Legacy:Project Copyright|Project Copyright]] already, to be sure, but we know people think if they don't read copyright statements they don't apply to them.)

----

'''Mychaeel:''' For some reason several files that only differ in the capitalization of their file name are in the &quot;shared&quot; directory (for instance, InterWiki-Wikipedia.png and InterWiki-Wikipedia.PNG).  When extracting the archive under Windows that leads to unnecessary and confusing &quot;Overwrite this file?&quot; questions.  Please delete one of the files, whichever is unnecessary.

'''ZxAnPhOrIaN:''' Agreed. We should adopt a standard on only lower-case file types (a.jpg, not a.JPG). it would solve that problem.

'''Mychaeel:''' Yeah... well.  I take it it was an accident.  Hope tarquin sees it.  That's why I put that log message in that you overwrote by posting your comment.

'''Tarquin:''' Seen. It's because Photoshop puts CAPS extensions, and I forget to change them before uploading. The perl script cares about case, but the eventual URL does not. ARG! But will fix.

'''Mychaeel:''' ...the server doesn't?  http://wiki.beyondunreal.com/wiki-ext/wikilogo.jpg?link displays the Wiki logo, but http://wiki.beyondunreal.com/wiki-ext/WiKiLoGo.JpG?link yields a 404.

'''ZxAnPhOrIaN:''' I thought that you can't have mixed-case in file extensions.

'''Mychaeel:''' File extensions are just part of a file name separated from it by a dot, by convention.  You can have any case you like in there like everywhere else.

'''Chema:''' Hi people.  Neat site you are running here.  Was not until I found it that I felt like &quot;mastering unreal&quot;.  The offline wiki is another cute detail, especially for 56krs like me, or netecofreaks; like me ;-)  Could I suggest using a solid compression algo, like RAR or Bzip2?  Documents with repetitive text like headers and sidebars are the ideal meat for them.  I just tryed it: todays wiki (29,444,530 bytes) shrinks to 42% (12,706,692 bytes) when zipped; but it gets down to 26% (7,937,234 bytes) using solid RAR!  That's almost 5 MB less.  Even if you made the archive self extracting, it would be a lot lighter.  Keep up the good work, and count me in, even if I spend most of my wiki time on the offline version!

'''Mychaeel:''' We're limited by the compression software that's available on the server.  We have zip and bzip2 there, but no RAR compression utility (or I'm just bad at guessing names).  If you could point me to one that runs under Linux, I'll ask the BeyondUnreal admins to install it.

'''El Muerte TDS:''' unrar is free, rar isn't.

'''El Muerte TDS:''' btw here are some stats:
 34226176 in total
 12728922 test.zip
 8134137  test.tar.bz2
 8966783  test.tar.gz
 

bzip2 generates a high system load, gzip doesn't. So I think using tar gzip is the best solution.

'''Mychaeel:''' Sounds like a good idea.  Is .tgz widely enough supported by Windows archivers to allow us to completely scratch the .zip version in favor of a .tgz one?

'''Mysterial:''' WinZip and WinRAR support it and they're the two most widely used archivers.

'''Chema:''' Usually bandwith is more precious ('myyyy preshiouuus' ;-) ) than some extra cpu cycles, but bzip2 is indeeded not widely supported in Windows: just by WinRAR and, well, bzip2.exe, to my knowledge (WinZip barely provides tgz support &amp;ndash; just decompression, couse zip provides &quot;similar functionality&quot;. haha).

Well, you could provide both formats, but that means even more cycles.  But even better would be to have weekly snapshots, that would weight a few hundred KBs in tgz.  A simple &quot;find . -ctime 7&quot; would do the trick; well, if your usual script is that simple too.

But I see there is still the zip pack.  If I can help writing the stuff, just tell me so (with a brief, err, debriefing: sh or perl? target for cron?).

'''El Muerte TDS:''' I don't know if weekly snapshots are such a good idea, because it would require you to download  the snapshot everyweek, you can't mis a single week or you will have to download the full snapshot again. And the offline wiki is only intresting for users without broadband.

'''Mychaeel:''' Adding support for RAR is a matter of (1) having a RAR compressor for Linux and (2) adding a single line of code to the current Offline Wiki (Perl) script.  My concern is more for BeyondUnreal's bandwidth than the users' in this case; right now a single 13 MB-file is uploaded to all mirrors once a day, and each compression format we'd provide in addition to that would add to that load (multiplied by the number of mirrors, naturally).

'''Chema:''' Err, you got me wrong: I was talking about bzip2 format, not RAR.  Anyway, yes, I think that having 2 formats its not elegant (not 'perlish' ;-) ), thats why I think the weekly snapshot is much better.

In response to El Muerte, you don't have to get the snapshot every week: I think they should be really tiny (100-500KB at most, in tgz? well, not counting when I upload my vactaion pics!), and several of them could be stored on the Offline Wiki page.  So you just need to check your last update, and get the newer snapshots.

'''El Muerte TDS:''' what about this: &quot;snapshot on request&quot; you can select the timeframe of the snapshot and then a archive will be created on the fly and feeded realtime to your browser ;)

'''Mychaeel:''' Hmm... maybe that's not even so far off.  Executing the Offline Wiki script takes several minutes to complete, but that's mostly due to several thousand pages that have to be read and formatted.  Actually packing a subset of pages into a downloadable archive file takes much less time. &amp;ndash; However, the problem remains that file downloads shouldn't be served directly from a BeyondUnreal-hosted site.

'''GRAF1K:''' Gehn, the offline wiki file size does change frequently due to constant edits. Thanks for the update.

----

'''Mychaeel:''' Offline Wiki is up and running again after it went down April 29, 2004, and nobody bothered telling me/us... according to hal from BeyondUnreal, the Perl script building the Offline Wiki has been throwing warning messages for quite a while, but they chose to ignore them rather than to tell us about them.  :-/

'''Tarquin:''' I had no idea... 

----

'''El Muerte:''' I've put up an readonly mirror of the UnrealWiki [http://unreal.student.utwente.nl/wiki/ here], it uses this offline wiki for it's content. Quite some things don't work (like search), and the page naming isn't 1on1, but at least we'll have a fallback when BU goes offline again.

'''El Muerte:''' it's broken, the current archive is from november 5

----

'''Techno_JF:''' Just so it's clear, the offline wiki hasn't been updated in a while.  I don't know if that's by accident or by design, but I think people should be aware of it either way.  I just downloaded it, and the date on the pages said &quot;Sat, November 5, 2005&quot;.  For reference, today's date is February 21, 2006.

'''HC Denton:''' Is someone going to fix this? The offline wiki is a nice thing because it ensures you have access to all docs even if the wiki goes down temporarily..

'''FEID:''' i noticed the same problem the offline wiki isn't working and 

can't get recent Added Pages!!!  

----

'''fyfe:''' Almost a year now and the offline wiki is still offline. Is it dead for good, or is it just a glitch the higher ups haven't noticed :p

'''Tarquin:''' It's down to BU admins. You can contact them yourself :)

'''feid:''' so you can do nothing at all, i mean whats the point for this page if nothing is updated, it pretty much useless when new information get published, and what about when our precious wiki is gone, i want somthing to remener it by, in the future.

'''Tarquin:''' Basically, no, I can't do anything. BU's server must be doing something wrong.

'''fyfe:''' Sent an e-mail to qapete, but I never got a response.

'''fyfe:''' Got a e-mail from qapete, it's now fixed :)

'''fyfe:''' But it doesn't look like it's hit the mirrors yet :(

'''fyfe:''' The mirrors have caught up now :D

----

===Blocking offline readers===

'''fyfe:''' Not sure if you've got anything like this implemented, but if you wanted to block the casual user from strip mining the wiki with an offline reader you can add the following to ''.htaccess''

&lt;pre&gt;
RewriteEngine on

# Send offline readers to offlinewiki.html
RewriteCond %{HTTP_USER_AGENT} (Wget|CherryPickerSE|CherryPickerElite|ExtractorPro|WebStripper|WebCopier|WebZIP) 
RewriteRule ^.*$ offlinewiki.html [L]
&lt;/pre&gt;

then create a file called ''/offlinewiki.html'' (don't put any links in it)

&lt;pre&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Never use an offline reader to download the entire Unreal Wiki.&lt;/title&gt;
		&lt;meta name=&quot;robots&quot; content=&quot;noindex,nofollow&quot;&gt;
	&lt;/head&gt;
	&lt;body style=&quot;color:#000000;background-color:#FFFFFF;&quot;  bgcolor=&quot;#FFFFFF&quot; color=&quot;#000000&quot;&gt;
		&lt;p&gt;&lt;strong&gt;Never use an offline reader to download the entire Unreal Wiki. If you do, 
		   we will ban you instantly and permanently.&lt;/strong&gt; Offline readers put an insane 
		   stress on the web server because they follow each and every of the 
		   processing-intensive maintenance links on the Wiki that are used seldomly by real 
		   people. Don't say you haven't been warned.&lt;/p&gt;

		&lt;p&gt;We're providing the entire Wiki content as a convenient single download on Offline 
		   Wiki [&lt;span style=&quot;color:#FF0000;&quot;&gt;http://wiki.beyondunreal.com/wiki/Offline_Wiki&lt;/span&gt;] 
		   though. It's smaller, zipped and downloads faster than what any offline reader 
		   could give you. Of course you can also save individual pages using your web browser 
		   without problems.&lt;/p&gt;
	&lt;/body&gt;
&lt;/html&gt;
&lt;/pre&gt;

The same could be done for bad robots that ignore ''/robots.txt'' just change the ''RewriteRule to
 # Send a &quot;403 Forbidden&quot; response
 RewriteRule ^.*$ - [F]

===Download Links===

'''Wormbo:''' Appearantly the FileFront mirror linked on BU FileWorks points to the wrong file.
'''Q:''' How long until the download comes out?</text>
    </revision>
    <revision>
      <id>43401</id>
      <timestamp>2010-06-04T11:05:12Z</timestamp>
      <contributor>
        <ip>194.75.238.104</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">At long last and by popular request (not by Wiki regulars of course &amp;ndash; they want the raw Wiki power live, not a zipped version of it), the [[Legacy:Offline Wiki|Offline Wiki]] has been set up.  Thanks to the BeyondUnreal staff, especially MalHavoc and QAPete, for supporting it.

Post here if you'd like to discuss this feature, or if you have any problems using it.  If you find anything that looks like a bug to you, we'd be happy to hear about it as well. 

==Discussion==

'''Mychaeel:''' Phew.  Took long enough, but now it's there.  Will make a press release later today.

'''Jan:''' Cool. ;) Do you need a offline viewer?

'''Tarquin:''' Nice screenie. pity it's rendering with IE :( - the blue sidebar should go all the way down in a real browser :p

'''Jan:''' This tool is only a side project, to view all my web documents offline. What I miss is a folder structure inside the wiki offline version.

'''Mychaeel:''' Nice.  :-)  I've flattened the folder structure to simplify the relative referencing of other pages, images, smileys and so on; the page names have to be rewritten anyway to accommodate various platforms' limitations (no more than 32 characters on the Mac, case-insensitivity on Windows).  However, I could rather simply have the script create a .txt file containing a mapping table between actual page names and the generated file names &amp;ndash; an offline reader could read that file and display the actual structure.

'''El Muerte TDS:''' to bad there's no MS HTML Help compiler for linux, or else you could easily create HTML Help files. HTML Help files are very nice since they provide some very usefull features like full text search. Project and glossary files are easy to create.

----

'''Mychaeel:''' Sunir got me thinking (over at [[Legacy:Project Copyright/Discussion|Project Copyright/Discussion]]).  Maybe we should make it '''very''' clear on [[Legacy:Offline Wiki|Offline Wiki]] that the download is for private use only and not to be distributed commercially.  (That's implied in [[Legacy:Project Copyright|Project Copyright]] already, to be sure, but we know people think if they don't read copyright statements they don't apply to them.)

----

'''Mychaeel:''' For some reason several files that only differ in the capitalization of their file name are in the &quot;shared&quot; directory (for instance, InterWiki-Wikipedia.png and InterWiki-Wikipedia.PNG).  When extracting the archive under Windows that leads to unnecessary and confusing &quot;Overwrite this file?&quot; questions.  Please delete one of the files, whichever is unnecessary.

'''ZxAnPhOrIaN:''' Agreed. We should adopt a standard on only lower-case file types (a.jpg, not a.JPG). it would solve that problem.

'''Mychaeel:''' Yeah... well.  I take it it was an accident.  Hope tarquin sees it.  That's why I put that log message in that you overwrote by posting your comment.

'''Tarquin:''' Seen. It's because Photoshop puts CAPS extensions, and I forget to change them before uploading. The perl script cares about case, but the eventual URL does not. ARG! But will fix.

'''Mychaeel:''' ...the server doesn't?  http://wiki.beyondunreal.com/wiki-ext/wikilogo.jpg?link displays the Wiki logo, but http://wiki.beyondunreal.com/wiki-ext/WiKiLoGo.JpG?link yields a 404.

'''ZxAnPhOrIaN:''' I thought that you can't have mixed-case in file extensions.

'''Mychaeel:''' File extensions are just part of a file name separated from it by a dot, by convention.  You can have any case you like in there like everywhere else.

'''Chema:''' Hi people.  Neat site you are running here.  Was not until I found it that I felt like &quot;mastering unreal&quot;.  The offline wiki is another cute detail, especially for 56krs like me, or netecofreaks; like me ;-)  Could I suggest using a solid compression algo, like RAR or Bzip2?  Documents with repetitive text like headers and sidebars are the ideal meat for them.  I just tryed it: todays wiki (29,444,530 bytes) shrinks to 42% (12,706,692 bytes) when zipped; but it gets down to 26% (7,937,234 bytes) using solid RAR!  That's almost 5 MB less.  Even if you made the archive self extracting, it would be a lot lighter.  Keep up the good work, and count me in, even if I spend most of my wiki time on the offline version!

'''Mychaeel:''' We're limited by the compression software that's available on the server.  We have zip and bzip2 there, but no RAR compression utility (or I'm just bad at guessing names).  If you could point me to one that runs under Linux, I'll ask the BeyondUnreal admins to install it.

'''El Muerte TDS:''' unrar is free, rar isn't.

'''El Muerte TDS:''' btw here are some stats:
 34226176 in total
 12728922 test.zip
 8134137  test.tar.bz2
 8966783  test.tar.gz
 

bzip2 generates a high system load, gzip doesn't. So I think using tar gzip is the best solution.

'''Mychaeel:''' Sounds like a good idea.  Is .tgz widely enough supported by Windows archivers to allow us to completely scratch the .zip version in favor of a .tgz one?

'''Mysterial:''' WinZip and WinRAR support it and they're the two most widely used archivers.

'''Chema:''' Usually bandwith is more precious ('myyyy preshiouuus' ;-) ) than some extra cpu cycles, but bzip2 is indeeded not widely supported in Windows: just by WinRAR and, well, bzip2.exe, to my knowledge (WinZip barely provides tgz support &amp;ndash; just decompression, couse zip provides &quot;similar functionality&quot;. haha).

Well, you could provide both formats, but that means even more cycles.  But even better would be to have weekly snapshots, that would weight a few hundred KBs in tgz.  A simple &quot;find . -ctime 7&quot; would do the trick; well, if your usual script is that simple too.

But I see there is still the zip pack.  If I can help writing the stuff, just tell me so (with a brief, err, debriefing: sh or perl? target for cron?).

'''El Muerte TDS:''' I don't know if weekly snapshots are such a good idea, because it would require you to download  the snapshot everyweek, you can't mis a single week or you will have to download the full snapshot again. And the offline wiki is only intresting for users without broadband.

'''Mychaeel:''' Adding support for RAR is a matter of (1) having a RAR compressor for Linux and (2) adding a single line of code to the current Offline Wiki (Perl) script.  My concern is more for BeyondUnreal's bandwidth than the users' in this case; right now a single 13 MB-file is uploaded to all mirrors once a day, and each compression format we'd provide in addition to that would add to that load (multiplied by the number of mirrors, naturally).

'''Chema:''' Err, you got me wrong: I was talking about bzip2 format, not RAR.  Anyway, yes, I think that having 2 formats its not elegant (not 'perlish' ;-) ), thats why I think the weekly snapshot is much better.

In response to El Muerte, you don't have to get the snapshot every week: I think they should be really tiny (100-500KB at most, in tgz? well, not counting when I upload my vactaion pics!), and several of them could be stored on the Offline Wiki page.  So you just need to check your last update, and get the newer snapshots.

'''El Muerte TDS:''' what about this: &quot;snapshot on request&quot; you can select the timeframe of the snapshot and then a archive will be created on the fly and feeded realtime to your browser ;)

'''Mychaeel:''' Hmm... maybe that's not even so far off.  Executing the Offline Wiki script takes several minutes to complete, but that's mostly due to several thousand pages that have to be read and formatted.  Actually packing a subset of pages into a downloadable archive file takes much less time. &amp;ndash; However, the problem remains that file downloads shouldn't be served directly from a BeyondUnreal-hosted site.

'''GRAF1K:''' Gehn, the offline wiki file size does change frequently due to constant edits. Thanks for the update.

----

'''Mychaeel:''' Offline Wiki is up and running again after it went down April 29, 2004, and nobody bothered telling me/us... according to hal from BeyondUnreal, the Perl script building the Offline Wiki has been throwing warning messages for quite a while, but they chose to ignore them rather than to tell us about them.  :-/

'''Tarquin:''' I had no idea... 

----

'''El Muerte:''' I've put up an readonly mirror of the UnrealWiki [http://unreal.student.utwente.nl/wiki/ here], it uses this offline wiki for it's content. Quite some things don't work (like search), and the page naming isn't 1on1, but at least we'll have a fallback when BU goes offline again.

'''El Muerte:''' it's broken, the current archive is from november 5

----

'''Techno_JF:''' Just so it's clear, the offline wiki hasn't been updated in a while.  I don't know if that's by accident or by design, but I think people should be aware of it either way.  I just downloaded it, and the date on the pages said &quot;Sat, November 5, 2005&quot;.  For reference, today's date is February 21, 2006.

'''HC Denton:''' Is someone going to fix this? The offline wiki is a nice thing because it ensures you have access to all docs even if the wiki goes down temporarily..

'''FEID:''' i noticed the same problem the offline wiki isn't working and 

can't get recent Added Pages!!!  

----

'''fyfe:''' Almost a year now and the offline wiki is still offline. Is it dead for good, or is it just a glitch the higher ups haven't noticed :p

'''Tarquin:''' It's down to BU admins. You can contact them yourself :)

'''feid:''' so you can do nothing at all, i mean whats the point for this page if nothing is updated, it pretty much useless when new information get published, and what about when our precious wiki is gone, i want somthing to remener it by, in the future.

'''Tarquin:''' Basically, no, I can't do anything. BU's server must be doing something wrong.

'''fyfe:''' Sent an e-mail to qapete, but I never got a response.

'''fyfe:''' Got a e-mail from qapete, it's now fixed :)

'''fyfe:''' But it doesn't look like it's hit the mirrors yet :(

'''fyfe:''' The mirrors have caught up now :D

----

'''Meindratheal:''' When will this next get updated? I (and a lot of others, I guess) could do with a more up-to-date version so I can read up on everything at home :)

----

===Blocking offline readers===

'''fyfe:''' Not sure if you've got anything like this implemented, but if you wanted to block the casual user from strip mining the wiki with an offline reader you can add the following to ''.htaccess''

&lt;pre&gt;
RewriteEngine on

# Send offline readers to offlinewiki.html
RewriteCond %{HTTP_USER_AGENT} (Wget|CherryPickerSE|CherryPickerElite|ExtractorPro|WebStripper|WebCopier|WebZIP) 
RewriteRule ^.*$ offlinewiki.html [L]
&lt;/pre&gt;

then create a file called ''/offlinewiki.html'' (don't put any links in it)

&lt;pre&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Never use an offline reader to download the entire Unreal Wiki.&lt;/title&gt;
		&lt;meta name=&quot;robots&quot; content=&quot;noindex,nofollow&quot;&gt;
	&lt;/head&gt;
	&lt;body style=&quot;color:#000000;background-color:#FFFFFF;&quot;  bgcolor=&quot;#FFFFFF&quot; color=&quot;#000000&quot;&gt;
		&lt;p&gt;&lt;strong&gt;Never use an offline reader to download the entire Unreal Wiki. If you do, 
		   we will ban you instantly and permanently.&lt;/strong&gt; Offline readers put an insane 
		   stress on the web server because they follow each and every of the 
		   processing-intensive maintenance links on the Wiki that are used seldomly by real 
		   people. Don't say you haven't been warned.&lt;/p&gt;

		&lt;p&gt;We're providing the entire Wiki content as a convenient single download on Offline 
		   Wiki [&lt;span style=&quot;color:#FF0000;&quot;&gt;http://wiki.beyondunreal.com/wiki/Offline_Wiki&lt;/span&gt;] 
		   though. It's smaller, zipped and downloads faster than what any offline reader 
		   could give you. Of course you can also save individual pages using your web browser 
		   without problems.&lt;/p&gt;
	&lt;/body&gt;
&lt;/html&gt;
&lt;/pre&gt;

The same could be done for bad robots that ignore ''/robots.txt'' just change the ''RewriteRule to
 # Send a &quot;403 Forbidden&quot; response
 RewriteRule ^.*$ - [F]

===Download Links===

'''Wormbo:''' Appearantly the FileFront mirror linked on BU FileWorks points to the wrong file.
'''Q:''' How long until the download comes out?</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:OlympusMons</title>
    <id>5053</id>
    <revision>
      <id>11657</id>
      <timestamp>2008-04-29T15:28:40Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>New page: To suggest a page for deletion, use the {{[[Template:delete|delete]]}} template.  In this case, I'm going to redirect the page. ~~~~</comment>
      <text xml:space="preserve">To suggest a page for deletion, use the {{[[Template:delete|delete]]}} template.  In this case, I'm going to redirect the page. – [[User:Haarg|Haarg]] 15:28, 29 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>11659</id>
      <timestamp>2008-04-29T15:31:08Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <text xml:space="preserve">To suggest a page for deletion, use the {{[[Template:delete|delete]]}} template.  In this case, I'm going to redirect the page. – [[User:Haarg|Haarg]] 15:28, 29 April 2008 (UTC)

Ahh okay, yeah like legacy user pages arnt linked to much if at all anyways so I figured a delete would be okay -[[User:OlympusMons|OlympusMons]] 15:31, 29 April 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Pathing For Vehicles</title>
    <id>23726</id>
    <revision>
      <id>32371</id>
      <timestamp>2008-07-14T20:30:05Z</timestamp>
      <contributor>
        <username>Ganymede</username>
        <id>961</id>
      </contributor>
      <comment>New page: What about if you want to specifically mark a path as being &quot;on foot&quot; only? Is there a bDontTakeVehicle property, or a bOnlyWalking somewhere?</comment>
      <text xml:space="preserve">What about if you want to specifically mark a path as being &quot;on foot&quot; only? Is there a bDontTakeVehicle property, or a bOnlyWalking somewhere?</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Punk129/Savegames 2k4</title>
    <id>28573</id>
    <revision>
      <id>40314</id>
      <timestamp>2009-12-05T19:25:17Z</timestamp>
      <contributor>
        <ip>79.111.46.168</ip>
      </contributor>
      <comment>Created page with '   Make sure it's &quot;\&quot; and not &quot;/&quot; !!  Why? Any Unreal engine does not see difference between slashes.'</comment>
      <text xml:space="preserve">   Make sure it's &quot;\&quot; and not &quot;/&quot; !!

Why? Any Unreal engine does not see difference between slashes.</text>
    </revision>
    <revision>
      <id>40315</id>
      <timestamp>2009-12-05T20:09:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>that's not quite right</comment>
      <text xml:space="preserve">   Make sure it's &quot;\&quot; and not &quot;/&quot; !!

Why? Any Unreal engine does not see difference between slashes. {{unsigned|79.111.46.168|20:25, 5 December 2009}}

The engine yes, but not INI files. There are quite a few quirks with how values are loaded from INI files, and backslashes are one of the biggest issues there. They should really be avoided if possible, as they may be interpreted as string escape sequences. —[[User:Wormbo|Wormbo]] 20:09, 5 December 2009 (UTC)</text>
    </revision>
    <revision>
      <id>42672</id>
      <timestamp>2010-03-20T12:30:09Z</timestamp>
      <contributor>
        <ip>79.111.11.129</ip>
      </contributor>
      <text xml:space="preserve">   Make sure it's &quot;\&quot; and not &quot;/&quot; !!

Why? Any Unreal engine does not see difference between slashes. {{unsigned|79.111.46.168|20:25, 5 December 2009}}

The engine yes, but not INI files. There are quite a few quirks with how values are loaded from INI files, and backslashes are one of the biggest issues there. They should really be avoided if possible, as they may be interpreted as string escape sequences. —[[User:Wormbo|Wormbo]] 20:09, 5 December 2009 (UTC)

Now I understand. It's fixed in Unreal227. But it cause bugs in other games like UT2004. Saves don't work for me at all. https://bugzilla.icculus.org/show_bug.cgi?id=4370 - Skaarj[ZR] [[Special:Contributions/79.111.11.129|79.111.11.129]] 12:30, 20 March 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:RSA</title>
    <id>28572</id>
    <revision>
      <id>40302</id>
      <timestamp>2009-11-26T13:39:27Z</timestamp>
      <contributor>
        <username>Elmuerte</username>
        <id>4</id>
      </contributor>
      <comment>License</comment>
      <text xml:space="preserve">== License ==

I just noticed that I never stated what license this code is available under. So to keep things friendly, the license is ZLib/LibPNG like, which means you can use it everywhere, just not claim you wrote it. This seems fair enough. --[[User:Elmuerte|elmuerte]] 13:39, 26 November 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Races Of Unreal</title>
    <id>4751</id>
    <revision>
      <id>10693</id>
      <timestamp>2008-04-01T17:41:24Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>New page: '''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.</comment>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.</text>
    </revision>
    <revision>
      <id>10702</id>
      <timestamp>2008-04-01T18:47:35Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.

Probably a good candidate for linking to or moving to Liandri – [[User:Haarg]] 18:47, 1 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10706</id>
      <timestamp>2008-04-01T19:45:09Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>reply</comment>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.

Probably a good candidate for linking to or moving to Liandri – [[User:Haarg]] 18:47, 1 April 2008 (UTC)
Can we move things from here to Liandri on the fly with the new system or would we have to login seperately and add the appropriate information?  Either way I'm sure most if not all of it is already there.  --[[User:DalinSeivewright|DalinSeivewright]] 19:45, 1 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10707</id>
      <timestamp>2008-04-01T19:45:23Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.

Probably a good candidate for linking to or moving to Liandri – [[User:Haarg]] 18:47, 1 April 2008 (UTC)

Can we move things from here to Liandri on the fly with the new system or would we have to login seperately and add the appropriate information?  Either way I'm sure most if not all of it is already there.  --[[User:DalinSeivewright|DalinSeivewright]] 19:45, 1 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10708</id>
      <timestamp>2008-04-01T20:50:15Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.

Probably a good candidate for linking to or moving to Liandri – [[User:Haarg]] 18:47, 1 April 2008 (UTC)

Can we move things from here to Liandri on the fly with the new system or would we have to login seperately and add the appropriate information?  Either way I'm sure most if not all of it is already there.  --[[User:DalinSeivewright|DalinSeivewright]] 19:45, 1 April 2008 (UTC)

I would like to have a centralized login for the two, but the ways to do that are either too limited or too unstable to use at this point.  I hope to get that set up at some point in the future though.  As for moving content, I'll try to work up a tag along the lines of &lt;nowiki&gt;{{delete}}&lt;/nowiki&gt; to make it easy to sort through.  That should enable anyone who is interested to try to move the content.  However, I was forgetting about licensing issues.  The reason the Legacy: namespace exists is primarily because of incompatible licensing, which extends to moving content from Legacy: to Liandri.  For this page, recreating it would be simple enough, but linking to the [[Liandri:Category:Sapient species]] would probably be better. – [[User:Haarg|Haarg]] 20:50, 1 April 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Replication Examples/Emitter replication</title>
    <id>24154</id>
    <revision>
      <id>34454</id>
      <timestamp>2009-05-31T14:42:43Z</timestamp>
      <contributor>
        <username>Sir Brizz</username>
        <id>64</id>
      </contributor>
      <minor/>
      <comment>Created page with 'Why wasn't this created in the UE2 namespace? --~~~~'</comment>
      <text xml:space="preserve">Why wasn't this created in the UE2 namespace? --[[User:Sir Brizz|Sir Brizz]] 14:42, 31 May 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Running A Dedicated Server With UCC</title>
    <id>4831</id>
    <revision>
      <id>10976</id>
      <timestamp>2008-04-12T00:19:45Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <comment>Question about Dedicated Server methods</comment>
      <text xml:space="preserve">Is it possible to run a DC (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)? UCC has the command prompt up the whole time. And when one runs a server off their PC, it's annoying thing to have.</text>
    </revision>
    <revision>
      <id>10977</id>
      <timestamp>2008-04-12T00:50:50Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to do what I'm describing? Also is there any documentation of attributes/suffixes for the UnrealTournament executable?</text>
    </revision>
    <revision>
      <id>10978</id>
      <timestamp>2008-04-12T00:57:39Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable?</text>
    </revision>
    <revision>
      <id>10980</id>
      <timestamp>2008-04-12T06:27:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>how the GUI does is</comment>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable?

:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10996</id>
      <timestamp>2008-04-14T01:12:01Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable?

:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)

Thanks! Although I already had the -server. I was about to pin the cause of my problem on the absence of -lanplay, but I realised that the absence of the &quot;-&quot; in front of -server was the cause!</text>
    </revision>
    <revision>
      <id>10997</id>
      <timestamp>2008-04-14T01:19:28Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable? [[User:XxDangerxX|XxDangerxX]]

:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)

Thanks! Although I already had the -server. I was about to pin the cause of my problem on the absence of -lanplay, but I realised that the absence of the &quot;-&quot; in front of -server was the cause! [[User:Wormbo|Wormbo]] 11:23, 14 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10998</id>
      <timestamp>2008-04-14T01:19:43Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable? [[User:XxDangerxX|XxDangerxX]]

:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)

Thanks! Although I already had the -server. I was about to pin the cause of my problem on the absence of -lanplay, but I realised that the absence of the &quot;-&quot; in front of -server was the cause! [[User:XxDangerxX|XxDangerxX]] 11:23, 14 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>10999</id>
      <timestamp>2008-04-14T01:20:40Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable? [[User:XxDangerxX|XxDangerxX]]



:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)



Thanks! Although I already had the -server. I was about to pin the cause of my problem on the absence of -lanplay, but I realised that the absence of the &quot;-&quot; in front of -server was the cause! [[User:XxDangerxX|XxDangerxX]] 11:23, 14 April 2008 (UTC)</text>
    </revision>
    <revision>
      <id>11000</id>
      <timestamp>2008-04-14T01:22:19Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable? [[User:XxDangerxX|XxDangerxX]]



:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)



Thanks! Although I already had the -server. I was about to pin the cause of my problem on the absence of -lanplay, but I realised that the absence of the &quot;-&quot; in front of -server was the cause! [[User:XxDangerxX|XxDangerxX]] 01:23, 14 April 2008 (GMT)</text>
    </revision>
    <revision>
      <id>11002</id>
      <timestamp>2008-04-14T14:23:50Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">Is it possible to run a DS (Dedicated Server) in the system tray without loading the GUI (Graphical User Interface)?

The idea is this:

* If you run a DS through UnrealTournament.exe, you will see the DS in the System Tray. This requires the GUI to be loaded.
* If you run a DS through UCC.exe, a command (UCC/cmd) window will show until the server is terminated. However, the GUI does not load before opening the match.
* If you run a server UnrealTournament in the same fashion as UCC (&quot;UnrealTournament.exe server MH-2MuchHP?game=MonsterHunt.MonsterHunt&quot; etc.), the GUI won't load, and it loads the match straight up, but it runs as a listen server, not a DS.

I run my server on my home computer, and for my clan's sake, I want to put the UCC Server in my Windows startup so that it's running as soon as I boot. Unfortunately I don't want to do it while either my study is going to be disturbed by a cmd window that can't be hidden, or my boot is going to be slowed down by a loading GUI.

Is there any way to run the DS hidden or in the system tray without first loading the GUI? Also, is there any documentation of attributes/suffixes for the UnrealTournament executable? [[User:XxDangerxX|XxDangerxX]]



:When you press the &quot;dedicated&quot; button in the GUI, the game executes the console command &quot;RELAUNCH ''MapName''?game=''gametype''?mutator=''mutatorlist''?listen -lanplay -server -log=''server.log''&quot; to shut down and start a new instance of UnrealTournament.exe with the given parameters. The &quot;-lanplay&quot; part is only added if you requested a LAN game. I guess the important part is the &quot;-server&quot; parameter. [[User:Wormbo|Wormbo]] 06:27, 12 April 2008 (UTC)



Thanks! Although I already had the -server. I was about to pin the cause of my problem on the absence of -lanplay, but I realised that the absence of the &quot;-&quot; in front of -server was the cause! [[User:XxDangerxX|XxDangerxX]] 01:23, 14 April 2008 (GMT)



I just came to another revelation: if you don't want the server booting up to CityIntro (or whatever you have set as &quot;LocalMap&quot; in your UT ini), make sure you put the -server parameter AFTER the map/game/mutator string. [[User:XxDangerxX|XxDangerxX]] 14:26, 14 April 2008 (GMT)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Setting Up UnrealScript</title>
    <id>23814</id>
    <revision>
      <id>33139</id>
      <timestamp>2008-10-17T19:12:40Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <comment>New page: ==Remake Scripting Environment section?== The ''Choose a scripting environment'' section is quite ugly now. There are countless ways to set it up - not only 4 like it looks like now. Thing...</comment>
      <text xml:space="preserve">==Remake Scripting Environment section?==
The ''Choose a scripting environment'' section is quite ugly now. There are countless ways to set it up - not only 4 like it looks like now. Things like [http://unreal.student.utwente.nl/ UnCodeX online source] is a very nice alternative to actually having to get the UnCodeX program itself. [[MonkeyBuild]] could also be mentioned as a good alternative to UMake. And also it could then be converted to a usual, non-legacy page. --[[User:GreatEmerald|GreatEmerald]] 19:12, 17 October 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33142</id>
      <timestamp>2008-10-18T07:34:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Remake Scripting Environment section?==
The ''Choose a scripting environment'' section is quite ugly now. There are countless ways to set it up - not only 4 like it looks like now. Things like [http://unreal.student.utwente.nl/ UnCodeX online source] is a very nice alternative to actually having to get the UnCodeX program itself. [[MonkeyBuild]] could also be mentioned as a good alternative to UMake. And also it could then be converted to a usual, non-legacy page. --[[User:GreatEmerald|GreatEmerald]] 19:12, 17 October 2008 (UTC)

All the pages in the &quot;Legacy&quot; namespace should be remade for the regular namespaces. &amp;mdash; [[User:Wormbo|Wormbo]] 07:34, 18 October 2008 (UTC)</text>
    </revision>
    <revision>
      <id>33148</id>
      <timestamp>2008-10-18T16:28:17Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <text xml:space="preserve">==Remake Scripting Environment section?==
The ''Choose a scripting environment'' section is quite ugly now. There are countless ways to set it up - not only 4 like it looks like now. Things like [http://unreal.student.utwente.nl/ UnCodeX online source] is a very nice alternative to actually having to get the UnCodeX program itself. [[MonkeyBuild]] could also be mentioned as a good alternative to UMake. And also it could then be converted to a usual, non-legacy page. --[[User:GreatEmerald|GreatEmerald]] 19:12, 17 October 2008 (UTC)

All the pages in the &quot;Legacy&quot; namespace should be remade for the regular namespaces. &amp;mdash; [[User:Wormbo|Wormbo]] 07:34, 18 October 2008 (UTC)

:Indeed, but it's a hell loads of data that needs to be remade...  And, as it's said in [[Unreal Wiki:Namespaces]], you can't just copy over stuff... So it's even more to do. Yet I could convert some if I had some free time. --[[User:GreatEmerald|GreatEmerald]] 16:28, 18 October 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Skeletal Mesh</title>
    <id>24405</id>
    <revision>
      <id>35437</id>
      <timestamp>2009-09-30T21:44:40Z</timestamp>
      <contributor>
        <username>Chanke81</username>
        <id>2035</id>
      </contributor>
      <comment>Created page with 'hey i´m new here my name is Chris and i started coding servermods for Americas Army 2.5 a half year ago. i got a lot of stuff working now but absolutely stuck with some function…'</comment>
      <text xml:space="preserve">hey i´m new here my name is Chris and i started coding servermods for Americas Army 2.5 a half year ago.
i got a lot of stuff working now but absolutely stuck with some functions like this one :(
the idea is to make all players small (this works) and let them have really big heads.

thats what i did atm ...

var config bool bbighead;

Function ModifyPlayer(Pawn Other)
{
  if(bbighead)
  {
    AGP_Pawn(Other).SetBoneScale(0, 2.00, 'head');
    AGP_Pawn(Other).SetBoneScale(1, 3.00, 'head');
  }
}

it gives no errors while compiling but in game nothing happens.
any idea what i did wrong ?</text>
    </revision>
    <revision>
      <id>35438</id>
      <timestamp>2009-10-01T04:33:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">hey i´m new here my name is Chris and i started coding servermods for Americas Army 2.5 a half year ago.
i got a lot of stuff working now but absolutely stuck with some functions like this one :(
the idea is to make all players small (this works) and let them have really big heads.

thats what i did atm ...

var config bool bbighead;

Function ModifyPlayer(Pawn Other)
{
  if(bbighead)
  {
    AGP_Pawn(Other).SetBoneScale(0, 2.00, 'head');
    AGP_Pawn(Other).SetBoneScale(1, 3.00, 'head');
  }
}

it gives no errors while compiling but in game nothing happens.
any idea what i did wrong ?


:This kind of question really belongs on [http://forums.beyondunreal.com/forumdisplay.php?f=101 a forum] and not on a Wiki talk page, but apart from this code really requiring clientside execution, did you check whether your models actually have a 'head' bone? —[[User:Wormbo|Wormbo]] 04:33, 1 October 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Static Function</title>
    <id>24085</id>
    <revision>
      <id>34019</id>
      <timestamp>2009-02-10T00:45:00Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <comment>New page: --~~~~ It might be interesting to add the explanation that Tim Sweeney gave about the absence of static variables.</comment>
      <text xml:space="preserve">--[[User:Azura|Azura]] 00:45, 10 February 2009 (UTC) It might be interesting to add the explanation that Tim Sweeney gave about the absence of static variables.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Static Mesh Modeling</title>
    <id>28982</id>
    <revision>
      <id>43398</id>
      <timestamp>2010-06-02T05:51:11Z</timestamp>
      <contributor>
        <ip>71.20.215.45</ip>
      </contributor>
      <comment>This page is vague</comment>
      <text xml:space="preserve">I don't get the thing about
   3. Use the Intersect tool to grab the shape you've constructed and add one to your level.
   4. Place the pivot point of the new brush on the corner of the brush or in the middle (bottom left is good).
   5. on your newly created blue, do Brush Context Menu -&gt; Convert to -&gt; static mesh
How do you do these steps?

Miatthas@gmail.com
vague</text>
    </revision>
    <revision>
      <id>43410</id>
      <timestamp>2010-06-08T20:32:17Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>Reply to your question</comment>
      <text xml:space="preserve">I don't get the thing about
   3. Use the Intersect tool to grab the shape you've constructed and add one to your level.
   4. Place the pivot point of the new brush on the corner of the brush or in the middle (bottom left is good).
   5. on your newly created blue, do Brush Context Menu -&gt; Convert to -&gt; static mesh
How do you do these steps?

Miatthas@gmail.com
vague





[http://www.youtube.com/watch?v=2o9nAFe0_Pg This] video tutorial shows it pretty well:

There you can see how to create a lift out of brushes, how to texture it and finally how to convert it.
The part that is relevant for you starts at timecode 9:00.

You can select a vertex by clicking on it (preferably in 2D view). The selected vertex will be the pivot once you converted it. I don't know how to select a vertex in the center of a brush, but a corner will do as well.

To open the context menu you must rightclick on the selected mesh.
—[[User:Crusha|Crusha]] 22:31, 8 June 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Surface Flags (UT)</title>
    <id>24391</id>
    <revision>
      <id>35348</id>
      <timestamp>2009-08-20T18:31:14Z</timestamp>
      <contributor>
        <ip>195.241.249.43</ip>
      </contributor>
      <comment>Created page with 'is there a way to give tags to surfaces with the same texture?'</comment>
      <text xml:space="preserve">is there a way to give tags to surfaces with the same texture?</text>
    </revision>
    <revision>
      <id>35351</id>
      <timestamp>2009-08-21T09:08:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>no</comment>
      <text xml:space="preserve">is there a way to give tags to surfaces with the same texture? &lt;span style=&quot;font-size: smaller;&quot; class=&quot;autosigned&quot;&gt;—Preceding [[wp:Wikipedia:Signatures|unsigned]] comment added by [[Special:Contributions/195.241.249.43|195.241.249.43]] ([[User talk:195.241.249.43|talk]]) 20:31, 20 August 2009&lt;/span&gt;&lt;!-- Template:UnsignedIP --&gt;

No, surfaces can't be tagged like Actors. You can select all surfaces with the same texture via the context menu -&gt; &quot;Select Surfaces&quot; -&gt; &quot;Matching Texture&quot; or Shift+T. —[[User:Wormbo|Wormbo]] 09:08, 21 August 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:T3D Brush</title>
    <id>28587</id>
    <revision>
      <id>40354</id>
      <timestamp>2009-12-28T18:12:25Z</timestamp>
      <contributor>
        <username>Evil bill</username>
        <id>2071</id>
      </contributor>
      <comment>Created page with 'I'm trying to parse a T3D file and render a wireframe using Java. Nearly there I think.  However, I'm a little unsure about the Yaw/Pitch/Rotation matrices that are described on …'</comment>
      <text xml:space="preserve">I'm trying to parse a T3D file and render a wireframe using Java. Nearly there I think.

However, I'm a little unsure about the Yaw/Pitch/Rotation matrices that are described on this page.

1. Why are they 4x4 matrices, and not 3x3 as one would expect?

2. Reading [http://mathworld.wolfram.com/EulerAngles.html], the matrices starting with formula 48 look correct, but differ from those on this page (other than problem 1).

Any explanation on this would be most appreciated.</text>
    </revision>
    <revision>
      <id>40355</id>
      <timestamp>2009-12-28T18:14:03Z</timestamp>
      <contributor>
        <username>Evil bill</username>
        <id>2071</id>
      </contributor>
      <text xml:space="preserve">I'm trying to parse a T3D file and render a wireframe using Java. Nearly there I think.

However, I'm a little unsure about the Yaw/Pitch/Rotation matrices that are described on this page.

1. Why are they 4x4 matrices, and not 3x3 as one would expect?

2. Reading [http://mathworld.wolfram.com/EulerAngles.html], the matrices starting with formula 48 look correct, but differ from those on this page (other than problem 1).

3. Re: Origin of Polygons. This is not mentioned in the parsing sudo-code - is it not important. Most examples seem to have the origin identical to the first vertex, but I'm not sure if this is always the case.

Any explanation on this would be most appreciated.</text>
    </revision>
    <revision>
      <id>40356</id>
      <timestamp>2009-12-28T18:14:27Z</timestamp>
      <contributor>
        <username>Evil bill</username>
        <id>2071</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">I'm trying to parse a T3D file and render a wireframe using Java. Nearly there I think.

However, I'm a little unsure about the Yaw/Pitch/Rotation matrices that are described on this page.

1. Why are they 4x4 matrices, and not 3x3 as one would expect?

2. Reading [http://mathworld.wolfram.com/EulerAngles.html], the matrices starting with formula 48 look correct, but differ from those on this page (other than problem 1).

3. Re: Origin of Polygons. This is not mentioned in the parsing sudo-code - is it not important? Most examples seem to have the origin identical to the first vertex, but I'm not sure if this is always the case.

Any explanation on this would be most appreciated.</text>
    </revision>
    <revision>
      <id>40357</id>
      <timestamp>2009-12-28T18:15:04Z</timestamp>
      <contributor>
        <username>Evil bill</username>
        <id>2071</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">I'm trying to parse a T3D file and render a wireframe using Java. Nearly there I think.

However, I'm a little unsure about the Yaw/Pitch/Rotation matrices that are described on this page.

1. Why are they 4x4 matrices, and not 3x3 as one would expect?

2. Reading [http://mathworld.wolfram.com/EulerAngles.html], the matrices starting with formula 48 look correct, but differ from those on this page (other than problem 1).

Any explanation on this would be most appreciated.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Tannah</title>
    <id>28915</id>
    <revision>
      <id>42882</id>
      <timestamp>2010-04-11T00:53:01Z</timestamp>
      <contributor>
        <ip>72.155.149.39</ip>
      </contributor>
      <comment>Created page with '''Hay Tannah,its Tannah,no joke'''</comment>
      <text xml:space="preserve">''Hay Tannah,its Tannah,no joke''</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Tarquin Brushbuilders</title>
    <id>4836</id>
    <revision>
      <id>11029</id>
      <timestamp>2008-04-15T20:36:28Z</timestamp>
      <contributor>
        <username>Hellkeeper</username>
        <id>245</id>
      </contributor>
      <comment>Call to find the Tarquin Brush Builder</comment>
      <text xml:space="preserve">==Where ?==

I used Tarquin BrushBuilders a LOT when I was mapping with Unrealed 2.0, and they used to provide much more control than Epic's usual brushbuilders, even thought I used them very little in my few released maps. I also used some of them with Unrealed 3.0 for most of my work on UT2004.

However, it is now impossible to find these tools over the net. Event Tarquin's webpage at planet Unreal shows mostly dead links. A few versions are still available at FileFront, but mostly for UT99. A few of them have been found for UT2004, but they are compressed in UT4MOD format with obvious problems (not detecting UT2004 and denying installation is an exemple), and since Tarquin has disappeared from the web, it's hard to fix it.

So I was wondering if anyone had a complete set of Tarquin's great brushes for both Ued 2.0 and 3.0, so he might upload it and provide working links on this page. If necessary, I can provide UT99's versions of :

* Tarquin brush builder pack 100
* Tarquin Extended brush Builder pack 100
* Tarquin Extrude Builder 80

All of them are under .zip format. Would it be possible to obtain a kind of agreement from tarquin ? or from the administrators of UW ?</text>
    </revision>
    <revision>
      <id>42495</id>
      <timestamp>2010-01-22T22:12:14Z</timestamp>
      <contributor>
        <username>Nuisance</username>
        <id>2085</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Where ?==

I used Tarquin BrushBuilders a LOT when I was mapping with Unrealed 2.0, and they used to provide much more control than Epic's usual brushbuilders, even thought I used them very little in my few released maps. I also used some of them with Unrealed 3.0 for most of my work on UT2004.

However, it is now impossible to find these tools over the net. Event Tarquin's webpage at planet Unreal shows mostly dead links. A few versions are still available at FileFront, but mostly for UT99. A few of them have been found for UT2004, but they are compressed in UT4MOD format with obvious problems (not detecting UT2004 and denying installation is an exemple), and since Tarquin has disappeared from the web, it's hard to fix it.

So I was wondering if anyone had a complete set of Tarquin's great brushes for both Ued 2.0 and 3.0, so he might upload it and provide working links on this page.

Unreal Editor 2.0/3.0 Tarquin Brush Tools:

* [http://www.box.net/shared/o3vc43aciu Tarquin brush builder pack 100]
* [http://www.box.net/shared/uae3zq3483 Tarquin Extended brush Builder pack 100]
* [http://www.box.net/shared/i81lm87sbs Tarquin Extrude Builder 80]

Here are your Tarquin brush tools for 2.0 and 3.0 please post UT99 files also!</text>
    </revision>
    <revision>
      <id>42496</id>
      <timestamp>2010-01-22T23:39:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>unsigned comments</comment>
      <text xml:space="preserve">==Where ?==

I used Tarquin BrushBuilders a LOT when I was mapping with Unrealed 2.0, and they used to provide much more control than Epic's usual brushbuilders, even thought I used them very little in my few released maps. I also used some of them with Unrealed 3.0 for most of my work on UT2004.

However, it is now impossible to find these tools over the net. Event Tarquin's webpage at planet Unreal shows mostly dead links. A few versions are still available at FileFront, but mostly for UT99. A few of them have been found for UT2004, but they are compressed in UT4MOD format with obvious problems (not detecting UT2004 and denying installation is an exemple), and since Tarquin has disappeared from the web, it's hard to fix it.

So I was wondering if anyone had a complete set of Tarquin's great brushes for both Ued 2.0 and 3.0, so he might upload it and provide working links on this page.
{{unsigned|Hellkeeper|21:36, 15 April 2008}}


Unreal Editor 2.0/3.0 Tarquin Brush Tools:

* [http://www.box.net/shared/o3vc43aciu Tarquin brush builder pack 100]
* [http://www.box.net/shared/uae3zq3483 Tarquin Extended brush Builder pack 100]
* [http://www.box.net/shared/i81lm87sbs Tarquin Extrude Builder 80]

Here are your Tarquin brush tools for 2.0 and 3.0 please post UT99 files also!
{{unsigned|Nuisance|23:12, 22 January 2010}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:The Curse Of Static Meshes</title>
    <id>24141</id>
    <revision>
      <id>34339</id>
      <timestamp>2009-04-13T17:47:43Z</timestamp>
      <contributor>
        <username>Skary</username>
        <id>1685</id>
      </contributor>
      <comment>Created page with 'ok, i've made my first mapthat consists entirely of a static meshes. I have a static mesh sewer system, with static mesh walkways, cob webs etc. but when i attempt to zone it, ma...'</comment>
      <text xml:space="preserve">ok, i've made my first mapthat consists entirely of a static meshes. I have a static mesh sewer system, with static mesh walkways, cob webs etc. but when i attempt to zone it, many strange things happen. the zone/portal view only shows 1 or 2 colors depending on how you are looking at the map, and while playing, static meshes disappear and reappear as you enter or leave a zone. is there a way to zone such a model?</text>
    </revision>
    <revision>
      <id>34340</id>
      <timestamp>2009-04-13T17:48:12Z</timestamp>
      <contributor>
        <username>Skary</username>
        <id>1685</id>
      </contributor>
      <text xml:space="preserve">ok, i've made my first map that consists entirely of a static meshes. I have a static mesh sewer system, with static mesh walkways, cob webs etc. but when i attempt to zone it, many strange things happen. the zone/portal view only shows 1 or 2 colors depending on how you are looking at the map, and while playing, static meshes disappear and reappear as you enter or leave a zone. is there a way to zone such a model?</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:The Unreal Universe</title>
    <id>4752</id>
    <revision>
      <id>10695</id>
      <timestamp>2008-04-01T17:42:35Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>New page: '''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.</comment>
      <text xml:space="preserve">'''DalinSeivewright:''' The page really doesn't follow the UnrealWiki's purpose.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:TheHealer</title>
    <id>29027</id>
    <revision>
      <id>43538</id>
      <timestamp>2010-06-26T00:38:27Z</timestamp>
      <contributor>
        <ip>68.232.113.174</ip>
      </contributor>
      <comment>Created page with 'Legacy - This tutorial was great, but how do i get it to work?!'</comment>
      <text xml:space="preserve">Legacy - This tutorial was great, but how do i get it to work?!</text>
    </revision>
    <revision>
      <id>43542</id>
      <timestamp>2010-06-26T10:19:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moved [[Legacy:TheHealer/TUT The End]] to [[Legacy talk:TheHealer]]</comment>
      <text xml:space="preserve">Legacy - This tutorial was great, but how do i get it to work?!</text>
    </revision>
    <revision>
      <id>43544</id>
      <timestamp>2010-06-26T10:22:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve">Legacy - This tutorial was great, but how do i get it to work?! {{unsigned|68.232.113.174|02:38, 26 June 2010}}
:This tutorial is more than seven years old an apparently never got finished. —[[User:Wormbo|Wormbo]] 10:22, 26 June 2010 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:TourBusStop</title>
    <id>5033</id>
    <revision>
      <id>11483</id>
      <timestamp>2008-04-24T02:23:06Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>[[Legacy talk:TourBusStop]] moved to [[Unreal Wiki talk:TourBusStop]]</comment>
      <text xml:space="preserve">#REDIRECT [[Unreal Wiki talk:TourBusStop]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Triggering Sounds</title>
    <id>29222</id>
    <revision>
      <id>44176</id>
      <timestamp>2010-12-15T21:55:41Z</timestamp>
      <contributor>
        <ip>80.98.246.238</ip>
      </contributor>
      <comment>Created page with 'to the hidden mover thingi i noticed the sound of a mover is affected by doppler-effect, but a moving ambientsound actor is not. just in case...'</comment>
      <text xml:space="preserve">to the hidden mover thingi
i noticed the sound of a mover is affected by doppler-effect, but a moving ambientsound actor is not. just in case...</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UDE</title>
    <id>24155</id>
    <revision>
      <id>34455</id>
      <timestamp>2009-05-31T14:45:09Z</timestamp>
      <contributor>
        <username>Sir Brizz</username>
        <id>64</id>
      </contributor>
      <minor/>
      <comment>Created page with 'This page (maybe minus it's discussion) should be safe to move to the new namespaces --~~~~'</comment>
      <text xml:space="preserve">This page (maybe minus it's discussion) should be safe to move to the new namespaces --[[User:Sir Brizz|Sir Brizz]] 14:45, 31 May 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UMS</title>
    <id>24076</id>
    <revision>
      <id>33952</id>
      <timestamp>2009-01-20T03:46:04Z</timestamp>
      <contributor>
        <username>Joe83420</username>
        <id>1877</id>
      </contributor>
      <comment>New page: Awsome little program! I'm looking for tutorials on using the other commands in the director though, i'm trying to figure out the rest like fade, motionblur, shake commands but i seem to b...</comment>
      <text xml:space="preserve">Awsome little program! I'm looking for tutorials on using the other commands in the director though, i'm trying to figure out the rest like fade, motionblur, shake commands but i seem to be having problems getting them to work. Does anyone have a full documentation on ums that i can use?! Hugh or Nemesis maybe?</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UT Troubleshooting FAQ</title>
    <id>24089</id>
    <revision>
      <id>34062</id>
      <timestamp>2009-02-23T09:35:53Z</timestamp>
      <contributor>
        <username>Seadee</username>
        <id>1275</id>
      </contributor>
      <comment>New page: Unreal Ed3 suddenly refuses to open claiming a UT3.exe error, the game opens. I have re-installed but still not working; I am on Vista</comment>
      <text xml:space="preserve">Unreal Ed3 suddenly refuses to open claiming a UT3.exe error, the game opens. I have re-installed but still not working; I am on Vista</text>
    </revision>
    <revision>
      <id>34063</id>
      <timestamp>2009-02-23T09:37:19Z</timestamp>
      <contributor>
        <username>Seadee</username>
        <id>1275</id>
      </contributor>
      <text xml:space="preserve">Unreal Ed3 Crash
It suddenly refuses to open claiming a UT3.exe error, the game opens the Editor doesn't. I have re-installed but still not working; I am on Vista.</text>
    </revision>
    <revision>
      <id>34064</id>
      <timestamp>2009-02-23T11:43:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>forum &gt; wiki?</comment>
      <text xml:space="preserve">Unreal Ed3 Crash
It suddenly refuses to open claiming a UT3.exe error, the game opens the Editor doesn't. I have re-installed but still not working; I am on Vista. --Seadee

:You're really better off asking [http://forums.beyondunreal.com/showthread.php?t=81840 in a forum] than on a wiki. —[[User:Wormbo|Wormbo]] 11:43, 23 February 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UT2k4 Default.Ini</title>
    <id>5046</id>
    <revision>
      <id>11605</id>
      <timestamp>2008-04-29T01:16:48Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <comment>[[Legacy talk:UT2k4 Default.Ini]] moved to [[UE2 talk:UT2004 Default.ini]]</comment>
      <text xml:space="preserve">#REDIRECT [[UE2 talk:UT2004 Default.ini]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UltraEdit</title>
    <id>24108</id>
    <revision>
      <id>34149</id>
      <timestamp>2009-03-26T16:51:01Z</timestamp>
      <contributor>
        <ip>91.104.133.248</ip>
      </contributor>
      <comment>Created page with ''''Max''': There seems to be some corruption on this page. If you use these examples be sure to remove these bits or anything similar:&lt;br&gt; | class=&quot;br0&quot;&gt;&lt;br&gt; | class=&quot;kw5&quot;&gt;&lt;br&gt; |...'</comment>
      <text xml:space="preserve">'''Max''':
There seems to be some corruption on this page. If you use these examples be sure to remove these bits or anything similar:&lt;br&gt;
| class=&quot;br0&quot;&gt;&lt;br&gt;
| class=&quot;kw5&quot;&gt;&lt;br&gt;
| class=&quot;kw6&quot;&gt;&lt;br&gt;</text>
    </revision>
    <revision>
      <id>34150</id>
      <timestamp>2009-03-26T16:51:58Z</timestamp>
      <contributor>
        <ip>91.104.133.248</ip>
      </contributor>
      <comment>Blanked the page</comment>
      <text xml:space="preserve" />
    </revision>
  </page>
  <page>
    <title>Legacy talk:Unreal Engine Versions/3</title>
    <id>5058</id>
    <revision>
      <id>11695</id>
      <timestamp>2008-05-03T07:25:00Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <comment>New page: Should be alright to pull these pages out of legacy hey? I mean the original authour doesnt matter much since its all fact based on the engine versions anyways so its not like the informat...</comment>
      <text xml:space="preserve">Should be alright to pull these pages out of legacy hey? I mean the original authour doesnt matter much since its all fact based on the engine versions anyways so its not like the information is unique. -[[User:OlympusMons|OlympusMons]] 07:25, 3 May 2008 (UTC)</text>
    </revision>
    <revision>
      <id>11696</id>
      <timestamp>2008-05-03T08:07:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>I don't feel too well about all this</comment>
      <text xml:space="preserve">Should be alright to pull these pages out of legacy hey? I mean the original authour doesnt matter much since its all fact based on the engine versions anyways so its not like the information is unique. -[[User:OlympusMons|OlympusMons]] 07:25, 3 May 2008 (UTC)

:Actually I'm still not convinced all the information gathered here is actually supposed to be public. I mean, all the information about games in the works where the developers never even issued any official statements. It almost seems like someone is leaking information from a private area oif the UDN, or even worse, discloses information he is supposed to not make public by contract. -[[User:Wormbo|Wormbo]] 08:07, 3 May 2008 (UTC)</text>
    </revision>
    <revision>
      <id>11697</id>
      <timestamp>2008-05-03T08:11:23Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <text xml:space="preserve">Should be alright to pull these pages out of legacy hey? I mean the original authour doesnt matter much since its all fact based on the engine versions anyways so its not like the information is unique. -[[User:OlympusMons|OlympusMons]] 07:25, 3 May 2008 (UTC)

:Actually I'm still not convinced all the information gathered here is actually supposed to be public. I mean, all the information about games in the works where the developers never even issued any official statements. It almost seems like someone is leaking information from a private area oif the UDN, or even worse, discloses information he is supposed to not make public by contract. -[[User:Wormbo|Wormbo]] 08:07, 3 May 2008 (UTC)

::Yeah that is certainly an issue if it is happening, I have stated in the past I would prefer to see the upcoming games listed as they were publicly announced not when some trickle of information comes through about possbilities. Where ever the source I think its best to leave that type of stuff in the hands of publishers for official announcements, then we can stick to the facts as the public knows them 8) -[[User:OlympusMons|OlympusMons]] 08:11, 3 May 2008 (UTC)</text>
    </revision>
    <revision>
      <id>12634</id>
      <timestamp>2008-05-13T16:00:35Z</timestamp>
      <contributor>
        <username>Fyfe</username>
        <id>128</id>
      </contributor>
      <comment>Unannounced projects should be removed</comment>
      <text xml:space="preserve">Should be alright to pull these pages out of legacy hey? I mean the original authour doesnt matter much since its all fact based on the engine versions anyways so its not like the information is unique. -[[User:OlympusMons|OlympusMons]] 07:25, 3 May 2008 (UTC)

:Actually I'm still not convinced all the information gathered here is actually supposed to be public. I mean, all the information about games in the works where the developers never even issued any official statements. It almost seems like someone is leaking information from a private area oif the UDN, or even worse, discloses information he is supposed to not make public by contract. -[[User:Wormbo|Wormbo]] 08:07, 3 May 2008 (UTC)

::Yeah that is certainly an issue if it is happening, I have stated in the past I would prefer to see the upcoming games listed as they were publicly announced not when some trickle of information comes through about possbilities. Where ever the source I think its best to leave that type of stuff in the hands of publishers for official announcements, then we can stick to the facts as the public knows them 8) -[[User:OlympusMons|OlympusMons]] 08:11, 3 May 2008 (UTC)

::When the Unreal Engine pages were last rewritten this list began, and after some discussion it was decied to remove all the unannounced projects. But a user by the name of UE started adding them again, as far as I know it's privileged information and shouldn't be listed here. And does anyone really care if company X has licensed UE tech for unannounced project Y? -[[User:Fyfe|Fyfe]]</text>
    </revision>
    <revision>
      <id>12698</id>
      <timestamp>2008-05-17T17:54:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>comment on removal and page protection</comment>
      <text xml:space="preserve">Should be alright to pull these pages out of legacy hey? I mean the original authour doesnt matter much since its all fact based on the engine versions anyways so its not like the information is unique. -[[User:OlympusMons|OlympusMons]] 07:25, 3 May 2008 (UTC)

:Actually I'm still not convinced all the information gathered here is actually supposed to be public. I mean, all the information about games in the works where the developers never even issued any official statements. It almost seems like someone is leaking information from a private area oif the UDN, or even worse, discloses information he is supposed to not make public by contract. -[[User:Wormbo|Wormbo]] 08:07, 3 May 2008 (UTC)

::Yeah that is certainly an issue if it is happening, I have stated in the past I would prefer to see the upcoming games listed as they were publicly announced not when some trickle of information comes through about possbilities. Where ever the source I think its best to leave that type of stuff in the hands of publishers for official announcements, then we can stick to the facts as the public knows them 8) -[[User:OlympusMons|OlympusMons]] 08:11, 3 May 2008 (UTC)

::When the Unreal Engine pages were last rewritten this list began, and after some discussion it was decied to remove all the unannounced projects. But a user by the name of UE started adding them again, as far as I know it's privileged information and shouldn't be listed here. And does anyone really care if company X has licensed UE tech for unannounced project Y? -[[User:Fyfe|Fyfe]]

The page is now protected and can only be edited by sysops. I also removed all the projects and licensees because of the questionable source and reliability of the information. The many &quot;unannounced&quot; projects suggest this list was maintained by someone with insider access, but we really don't want to mess with all those licensees. -[[User:Wormbo|Wormbo]] 17:54, 17 May 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UnrealEd 2 Console</title>
    <id>29275</id>
    <revision>
      <id>44534</id>
      <timestamp>2011-08-04T22:53:20Z</timestamp>
      <contributor>
        <ip>128.227.15.124</ip>
      </contributor>
      <comment>Created page with 'I need to figure out how to bind these actions to keys:  Movers-&gt; show polys  And something like doing &quot;brush addmover&quot;, but for any kind of brush, like semi-solids or deusex mov…'</comment>
      <text xml:space="preserve">I need to figure out how to bind these actions to keys:

Movers-&gt; show polys

And something like doing &quot;brush addmover&quot;, but for any kind of brush, like semi-solids or deusex movers, or breakable glass movers.

Does every action have a command?</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UnrealEd Console</title>
    <id>29256</id>
    <revision>
      <id>44379</id>
      <timestamp>2011-04-25T15:35:01Z</timestamp>
      <contributor>
        <ip>67.142.130.30</ip>
      </contributor>
      <comment>Created page with '==Command Inqueries==  Anyone know what the command is for &quot;Movers-&gt;Show Polys&quot;?  I hate right clicking and messing up the vertex on a mover.'</comment>
      <text xml:space="preserve">==Command Inqueries==

Anyone know what the command is for &quot;Movers-&gt;Show Polys&quot;?  I hate right clicking and messing up the vertex on a mover.</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:UnrealTournament Extension Pack</title>
    <id>20894</id>
    <revision>
      <id>28674</id>
      <timestamp>2008-05-22T11:17:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: ==Page move== You may wish to move or recreate this page in the main or UE1 namespace. -~~~~</comment>
      <text xml:space="preserve">==Page move==
You may wish to move or recreate this page in the main or UE1 namespace. -[[User:Wormbo|Wormbo]] 11:17, 22 May 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Using The Mod System In UT2004</title>
    <id>5042</id>
    <revision>
      <id>11591</id>
      <timestamp>2008-04-29T00:42:04Z</timestamp>
      <contributor>
        <username>OlympusMons</username>
        <id>255</id>
      </contributor>
      <comment>[[Legacy talk:Using The Mod System In UT2004]] moved to [[UE2 talk:Using the UT2004 mod system]]</comment>
      <text xml:space="preserve">#REDIRECT [[UE2 talk:Using the UT2004 mod system]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Variable Syntax</title>
    <id>23744</id>
    <revision>
      <id>32884</id>
      <timestamp>2008-08-12T07:30:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>New page: ==Discussion==  '''Foxpaw:''' I have some variables that I could make private, but I'm curious - is there any advantage to having them private or should I leave them public on the off chan...</comment>
      <text xml:space="preserve">==Discussion==

'''Foxpaw:''' I have some variables that I could make private, but I'm curious - is there any advantage to having them private or should I leave them public on the off chance that a subclass might want to use them somewhere down the road? I don't see any reason why they would, but on the other hand there are some functions declared as final that Epic apparently didn't think anyone would want to override, whilst I very much do - so it's possible that sometime someone might want to use this variable for something. Is there a performance gain or anything like that to be had for using private variables?

'''Mychaeel:''' That's more a code design question than a purely technical one.  While I'm very glad Epic followed a policy of leaving virtually everything public and non-final, my own code makes very frequent use of private or protected variables and functions.

At least during development my intent is to force others working with my code (and myself) to interact with my code only in a clearly defined, controllable fashion instead of messing with the internal state of my objects at will.  That allows me to change the internal implementation of my classes without having to worry about what those changes do to others' code as long as I keep the interface true to its specification.

If you want to keep people from accessing variables or functions from outside a class but would still like to let them use those variables and use/overwrite the methods in subclasses, make them ''protected'', not ''private''.

'''Tarquin:''' I don't quite understand what &quot;private&quot; does. If I declare variable &quot;Foo&quot; to be private in MyClass, and I have objects A and B of that class, and C of a child class, can B read A's foo but C can't read A's foo? C has a foo variable of its own, with the same restrictions to ''its'' child classes?

'''Mychaeel:''' First part:  Yes.  Second part:  C ''can'' have its own private (or public) variable called &quot;foo,&quot; but that variable wouldn't be connected in any way to the &quot;foo&quot; variable from the base class.  (Of course C has a piece of memory space allocated that the code in the base class would address as &quot;foo,&quot; but the code in the child class doesn't know about the base class's &quot;foo&quot; at all.)

----

'''Tarquin:''' Can a constant be a boolean? eg
 const DEFAULT_PROTECT_ARENA = True;

'''Foxpaw:''' That seems to work for me. I believe that constants in UnrealScript are closer to #DEFINE in C rather than a variable that can't be changed. (Only for constants, not const vars.) Unfortunately, however, you can't set a constant to be a statement or an expression like you can with a #DEFINE. Booleans should work, though.

----

'''Evolution:''' regarding the noexport modifier: this is only used by the GUIDesigner - it tells the GUIDesigner that this property shouldn't be included in the subobject definition that will be generated when you hit Ctrl+X while you are in design mode and have a control highlighted.  The fact that it prevents those properties from appearing in the defaultproperties block for the class when you use batchexport is in fact a bug  :)  It's fixed in the first patch, but I completely forgot about exporting classes from UnrealEd! so it will only correctly export those properties if you use batchexport to create the .uc files.

----

'''Devi:''' Is there a way of declaring member variables as static? I was wondering because I wanted to use the singleton model in one of my classes (The singleton model is where you declare a class in such a way that there can only be one instance of it, that instance is usually a static member variable of the class and is accessed via a static method of the class) in C++ I would do it like this:

class MySingleton

{
   private:
      int some_data_or_other;

      static MySingleton my_singleton_instance;

   public:
      inline static MySingleton &amp;GetInstance(void) {return my_singleton_instance;}

};

Then, whenever I needed to get access to the class or it's functionality I can do:

MySingleton::GetInstance().DoSomethingWonderful();

I normally use this technique for big manager classes and such that get referenced all over the place and am wondering how I'd deal with the same kind of situation in UScript...

'''Wormbo:''' There are no static variables in UnrealScript. There are default class variables, though. You could store objects in them, but it's not a good idea. You will very likely mess up garbage collection by assigning dynamically generated objects (i.e. not within the editor) to default class variables, because they might still reference the level even after a map change. You should store the reference to your object in another central object that can easily be accessed.

'''Foxpaw:''' You can use default variables for the same purpose. In many instances I have done the following:

&lt;uscript&gt;
class SomeClass extends Whatever;

var SomeClass Reference;

function PreBeginPlay()
{
  default.Reference = Self;
}

function Destroyed()
{
  default.Reference = None;
}
&lt;/uscript&gt;

However, default properties don't get &quot;cleaned up&quot; in the same way that dynamic references do, so you have to make sure you manually clean up these references like I've done above.

'''Devi:''' That seems to make sense, I'll give it a try... For extra protection you may like to use code like this:

&lt;uscript&gt;
function PreBeginPlay()
{
  if (default.Reference!=None)
  {
    if (default.Reference!=Self)
    {
      Log(&quot;There's more than one SomeClass class placed in this level, one named: &quot;$Name$&quot; the other: &quot;$default.Reference.Name$&quot;...&quot;);
    }
  }
  else
  {
    default.Reference=self;
  }
}
function Destroyed()
{
  if (default.Reference==Self)
  {
    default.Reference=None;
  }
}
&lt;/uscript&gt;

This way your code is protected if something accidentally generates a second instance of your singleton class...

----

'''Jimboh:''' Are newly declared variables GUARANTEED to be zero?

'''Wormbo:''' Yes, however, only local variables and new array elements can be considered &quot;newly declared&quot;.

'''Skrilax:''' What string is a 'coerce string'? (for example used in BroadcastMessage function)

'''Mychaeel:''' The &quot;coerce&quot; isn't part of the variable type; it tells the compiler to accept non-string arguments at that place as long as they can be auto-[[Legacy:Typecasting|typecasted]] as strings.  The &lt;code&gt;Log&lt;/code&gt; function also coerces its argument to string, so you can write &lt;code&gt;Log(&quot;foo&quot;)&lt;/code&gt; or &lt;code&gt;Log(123)&lt;/code&gt; or even &lt;code&gt;Log(Pawn.Location)&lt;/code&gt; without having to bother with writing an explicit typecast.

----

'''Juxtapose:''' I added new information to constants as pertaining to default properties. I haven't investigated the situation further than the information used above (using constants from classes compiled before the current default properties block, e.g.) so if anyone else has run into this, please add what you know. Also, are there any suggestions on where this should go? I linked the default properties page, but maybe all this information needs to be there instead. Should Default_Properties link back to here for use of constants?

----

'''MM:''' Is there a limit to the [length] of a static array? (In Unreal Engine 1) Such as &lt;uscript&gt;var string testtxt[1000000]&lt;/uscript&gt;

----
'''Tex23BM''' Is there a way To declare C++ member variables in Unreal? AKA: I want a C++ fstream (not a FileLog).

:You can't declare C++ types from UnrealScript. You can, however, declare the variable of a replacement type. For pointers you simply use ''int'' up to UT2003 and ''pointer'' in UT2004. You'll have to declare your class as ''noexport'' and write its native declaration yourself, though. --[[User:Wormbo|Wormbo]] 07:30, 12 August 2008 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:Weapon Mutator Tutorial</title>
    <id>24198</id>
    <revision>
      <id>34603</id>
      <timestamp>2009-07-29T13:46:10Z</timestamp>
      <contributor>
        <username>Teun</username>
        <id>1995</id>
      </contributor>
      <comment>Created page with 'Help!   Im very new in Unrealscript. I did all first tutorials and they did it fine. Now i want to finish this one but i got this:   Error in MutMinigunHE.uc (14): Unrecognized m…'</comment>
      <text xml:space="preserve">Help!


Im very new in Unrealscript. I did all first tutorials and they did it fine. Now i want to finish this one but i got this:


Error in MutMinigunHE.uc (14): Unrecognized member '|' in class 'xWeaponBase' (im using UMake)
&lt;uscript&gt;if (xWeaponBase(Other) != None )
    {
        if ( string(xWeaponBase(Other).| class=&quot;me1&quot;&gt;WeaponType ) ~= &quot;XWeapons.Minigun&quot; )
        {
            xWeaponBase(Other).| class=&quot;me1&quot;&gt;WeaponType = class'MinigunHE';
            return false;
        }
    }&lt;/uscript&gt;

pls help, thx</text>
    </revision>
    <revision>
      <id>34606</id>
      <timestamp>2009-07-29T15:54:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>geshi bug</comment>
      <text xml:space="preserve">Help!


Im very new in Unrealscript. I did all first tutorials and they did it fine. Now i want to finish this one but i got this:


Error in MutMinigunHE.uc (14): Unrecognized member '|' in class 'xWeaponBase' (im using UMake)
&lt;uscript&gt;if (xWeaponBase(Other) != None )
    {
        if ( string(xWeaponBase(Other).| class=&quot;me1&quot;&gt;WeaponType ) ~= &quot;XWeapons.Minigun&quot; )
        {
            xWeaponBase(Other).| class=&quot;me1&quot;&gt;WeaponType = class'MinigunHE';
            return false;
        }
    }&lt;/uscript&gt;

pls help, thx


Oh, that looks like a bug in the script formatter. Must be related to our recent MediaWiki upgrade, we'll look into that. Remove everything from '|' to the next '&gt;' and it should compile. —[[User:Wormbo|Wormbo]] 15:54, 29 July 2009 (UTC)</text>
    </revision>
  </page>
  <page>
    <title>Legacy talk:XIIIEd</title>
    <id>23748</id>
    <revision>
      <id>32914</id>
      <timestamp>2008-08-26T11:30:03Z</timestamp>
      <contributor>
        <username>Bobbuz</username>
        <id>87</id>
      </contributor>
      <comment>New page: We are a french XIII team who are looking for the way to restore the XIIIEd sound browser... does anyone have a hint ?</comment>
      <text xml:space="preserve">We are a french XIII team who are looking for the way to restore the XIIIEd sound browser... does anyone have a hint ?</text>
    </revision>
    <revision>
      <id>33075</id>
      <timestamp>2008-09-30T15:29:55Z</timestamp>
      <contributor>
        <username>Bobbuz</username>
        <id>87</id>
      </contributor>
      <text xml:space="preserve">We are a french XIII team who are looking for the way to restore the XIIIEd sound browser... does anyone have a tip ?
Can we import / or create some sound packages, and handle them, without XIIIEd ? (for example, by editing a T3D file ...)

thanks !</text>
    </revision>
    <revision>
      <id>34027</id>
      <timestamp>2009-02-12T14:08:31Z</timestamp>
      <contributor>
        <ip>62.160.97.2</ip>
      </contributor>
      <text xml:space="preserve">We are a french XIII team who are looking for the way to restore the XIIIEd sound browser... does anyone have a tip ?
Can we import / or create some sound packages, and handle them, without XIIIEd ? thanks !</text>
    </revision>
  </page>
  <page>
    <title>Legacy:2COOL4-U</title>
    <id>3869</id>
    <revision>
      <id>9780</id>
      <timestamp>2002-07-06T13:47:49Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Jeroen &quot;2COOL4-U&quot; de Haas
* jeroen@mysticgd.com
* ICQ: 81112455
* MSN: kipkanarieolifantje@msn.com

I am ''trying'' to write some articles for the wiki but mostly forget about it. My first article was [[Legacy:VisualUC|VisualUC]]. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9781</id>
      <timestamp>2002-06-23T11:41:32Z</timestamp>
      <contributor>
        <ip>Cp26796-a.gelen1.lb.nl.home.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Jeroen &quot;2COOL4-U&quot; de Haas

jeroen@mysticgd.com

ICQ: 81112455

MSN: kipkanarieolifantje@msn.com</text>
    </revision>
    <revision>
      <id>9782</id>
      <timestamp>2002-06-23T17:23:23Z</timestamp>
      <contributor>
        <ip>2COOL4-U</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Jeroen &quot;2COOL4-U&quot; de Haas
* jeroen@mysticgd.com
* ICQ: 81112455
* MSN: kipkanarieolifantje@msn.com

I am ''trying'' to write some articles for the wiki but mostly forget about it. My first article was [[Legacy:VisualUC|VisualUC]]. 

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:2D Shape Editor</title>
    <id>3870</id>
    <revision>
      <id>9783</id>
      <timestamp>2007-06-09T23:21:47Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==2D shape editor tutorial ==

This is the Industry Standard: &lt;strike&gt;[http://www.unrealism.com/unrealedmax/2dshapes.shtml Machismo's 2D Shape Editor Tutorial]&lt;/strike&gt; Link is dead, unfortunately, but leaving URL be just in case of a miracle.

:''Tarquin'': Machismo has invited the Wiki to import his 2D-ed tute. I'm realizing just how much info there is on this topic (eek!)... so I've split off a new page to cover drawing techniques, and added some architecture tutes. Anyway, I'm off to get fud and chill as I've been wiki-ing most of the afternoon...

'''Olorin:''' The link above brings up a 404 for me (right now). Might be a temporary problem, or an out-of-date link (in which case we shall remove).

'''Tarquin:''' Oh dear... we're going to have to write something ourselves instead then!

'''MechMantis:''' Confirmed dead. Apparently, they let their domain name expire, and so, it is now under the control of one &quot;NuVisions Media&quot;. Better call in the writing squad.

'''Kirk:''' The domain name is currently being auctioned off (to search engine or pornsite webmasters, I'm sure) on eBay by someone. Auction end June 17th 2007.

----

==Introduction ==

The 2D Shape Editor was introduced as experimental in the original [[Legacy:UnrealEd 1|UnrealEd 1]], but by the [[Legacy:UnrealEd 2|UnrealEd 2]] that was bundled with [[Legacy:UT|UT]] 436, had matured into a robust tool for creating 3 dimensional shapes. However, it can be crashed (see [[Legacy:Crashing UnrealEd|Crashing UnrealEd]]), but otherwise is functional and commonly useful to mappers for all kinds of creative brush operations.

This is a versatile 3 dimensional tool. When the 2D Shape Editor is opened, a 2 dimensional grid is displayed, similar to the main UnrealEd 2D grid views. The only real disadvantage is that all vertex points must coincide with the grid (you can't just place the vertices in any position). However, you can map to a small resolution (4 world units), and the resultant 3D brushes are completely at home in the main UnrealEd 3D views.  

==Tutorials ==

Starting point for using this tool:
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]

Using the 2D editor to make complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Interface ==

For the menu commands, see [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]].

[[Image:Legacy_interface.2DToolbar.gif|center|]]

# New, Open, Close. 2D shapes can be saved as special 2DS files, independently of the current map in the main UnrealEd window.
# Rotate the shape 90 or 45 degrees.
# Flip the shape in x or y axis
# Enlarge or shrink the shape by a factor of 2
# Zoom in or out on the shape (note: the grid is a little buggy on different zoom levels, it's sort of sticky)
# Add a vertex by splitting the current sides. If more than one side is selected, will split all.
# Remove selected side(s). Note that this tends to rearrange the remaining vertices quite a bit, so it's best avoided if possible as a fair amount of fine tuning is necessary afterwards. Not disastrous, but annoying.
# Convert the current side to a linear segment
# Convert the current side to a Bezier segment
# Process: Sheet
# Process: Revolve
# Process: Extrude
# Process: Extrude to point
# Process: Extrude to bevel

===Mouse control ===
* Click on points to select them.
* CTRL+Click to select multiple points
* Click + drag to move points, add CTRL to move multiple
* Right-click + drag to pan the work area
* CLick and drag the orange centre point to move the entire shape

==Processing commands ==

===Sheet ===

This simply creates a sheet brush out of the current shape.

===Revolve ===

Revolves your 2D brush around the &quot;Y&quot; axis.  The origin of the shape (the green node) must be completely to the left or right of the shape you wish to revolve.  The distance of the origin to the edge of your shape determines the inner radius the resultant shape.  The two properties you specify at the point of revolution are &quot;Per 360&quot; which specifies the number of sides that would exist in a full circle, and &quot;Use&quot; which specifies the number of sides to actually generate. 

Tip: rotate the shape before revolving to make, for example, a corridor that curves upwards.

===Extrude to set depth ===

Produces a prism of a given depth, with the current shape as cross-section.  It's well worth the effort of extruding the brush slightly deeper than you need and then substracting (or clipping) the &quot;flat&quot; faces of your extruded brush away.  The Intersect tool can then be used to grab the final brush and hey-presto you've removed a lot of unecessary polygons.  This is similar to the [[Legacy:Merge Polygons|merge polygons]] command but also changes the brush wireframe potentially reducing the [[Legacy:Node Count|Node Count]] of your brush.

===Extrude to point ===

Produces a cone with the base of your 2D shape.  The height of the code is determined by the depth value specified at the point of extrusion.  The X and Y offset of the point of the cone is determined by the location of the 2D shape's origin (that little green node you can see).

===Extrude to bevel ===

This behaves in a very similar manner to that of the &quot;Extrude to point&quot; function.  The difference being that the resulting &quot;cone&quot; is trimmed down to the CapHeight specified at the point of extrusion.

==Tips ==

Simplify the surfaces of a brush produced with the 2D shape editor with the [[Legacy:Merge Polygons|merge polygons]] command.

To get rid of extra polygons that it produces when you add the brush, add it then [[Legacy:Intersect|intersect]] it. Delete the added brush and add the RBB (Red Builder Brush) where you want to add it.

Be '''''VERY''''' careful creating the shape because there are no undo's; save often.

:'''Tarquin:'''  not necessarily a good thing though, may introduce new BSP cuts. Use with caution on complex shapes.

If you are having problems seeing the gridlines in the 2d Ed, then add this command to the end of your UED shortcut:

-no gamma-

This will make a fairly ugly workspace, but you will get used to it and hey, you can see the grid lines...

Also you can reduce polys per face by extruding the shape to a larger number, then clipping the flat faces. This will remove the triangulation though so it is a situational practice

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9784</id>
      <timestamp>2007-04-03T07:42:10Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>Revert.</comment>
      <text xml:space="preserve">==2D shape editor tutorial ==

This is the Industry Standard: &lt;strike&gt;[http://www.unrealism.com/unrealedmax/2dshapes.shtml Machismo's 2D Shape Editor Tutorial]&lt;/strike&gt; Link is dead, unfortunately, but leaving URL be just in case of a miracle.

:''Tarquin'': Machismo has invited the Wiki to import his 2D-ed tute. I'm realizing just how much info there is on this topic (eek!)... so I've split off a new page to cover drawing techniques, and added some architecture tutes. Anyway, I'm off to get fud and chill as I've been wiki-ing most of the afternoon...

'''Olorin:''' The link above brings up a 404 for me (right now). Might be a temporary problem, or an out-of-date link (in which case we shall remove).

'''Tarquin:''' Oh dear... we're going to have to write something ourselves instead then!

'''MechMantis:''' Confirmed dead. Apparently, they let their domain name expire, and so, it is now under the control of one &quot;NuVisions Media&quot;. Better call in the writing squad.

----

==Introduction ==

The 2D Shape Editor was introduced as experimental in the original [[Legacy:UnrealEd 1|UnrealEd 1]], but by the [[Legacy:UnrealEd 2|UnrealEd 2]] that was bundled with [[Legacy:UT|UT]] 436, had matured into a robust tool for creating 3 dimensional shapes. However, it can be crashed (see [[Legacy:Crashing UnrealEd|Crashing UnrealEd]]), but otherwise is functional and commonly useful to mappers for all kinds of creative brush operations.

This is a versatile 3 dimensional tool. When the 2D Shape Editor is opened, a 2 dimensional grid is displayed, similar to the main UnrealEd 2D grid views. The only real disadvantage is that all vertex points must coincide with the grid (you can't just place the vertices in any position). However, you can map to a small resolution (4 world units), and the resultant 3D brushes are completely at home in the main UnrealEd 3D views.  

==Tutorials ==

Starting point for using this tool:
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]

Using the 2D editor to make complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Interface ==

For the menu commands, see [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]].

[[Image:Legacy_interface.2DToolbar.gif|center|]]

# New, Open, Close. 2D shapes can be saved as special 2DS files, independently of the current map in the main UnrealEd window.
# Rotate the shape 90 or 45 degrees.
# Flip the shape in x or y axis
# Enlarge or shrink the shape by a factor of 2
# Zoom in or out on the shape (note: the grid is a little buggy on different zoom levels, it's sort of sticky)
# Add a vertex by splitting the current sides. If more than one side is selected, will split all.
# Remove selected side(s). Note that this tends to rearrange the remaining vertices quite a bit, so it's best avoided if possible as a fair amount of fine tuning is necessary afterwards. Not disastrous, but annoying.
# Convert the current side to a linear segment
# Convert the current side to a Bezier segment
# Process: Sheet
# Process: Revolve
# Process: Extrude
# Process: Extrude to point
# Process: Extrude to bevel

===Mouse control ===
* Click on points to select them.
* CTRL+Click to select multiple points
* Click + drag to move points, add CTRL to move multiple
* Right-click + drag to pan the work area
* CLick and drag the orange centre point to move the entire shape

==Processing commands ==

===Sheet ===

This simply creates a sheet brush out of the current shape.

===Revolve ===

Revolves your 2D brush around the &quot;Y&quot; axis.  The origin of the shape (the green node) must be completely to the left or right of the shape you wish to revolve.  The distance of the origin to the edge of your shape determines the inner radius the resultant shape.  The two properties you specify at the point of revolution are &quot;Per 360&quot; which specifies the number of sides that would exist in a full circle, and &quot;Use&quot; which specifies the number of sides to actually generate. 

Tip: rotate the shape before revolving to make, for example, a corridor that curves upwards.

===Extrude to set depth ===

Produces a prism of a given depth, with the current shape as cross-section.  It's well worth the effort of extruding the brush slightly deeper than you need and then substracting (or clipping) the &quot;flat&quot; faces of your extruded brush away.  The Intersect tool can then be used to grab the final brush and hey-presto you've removed a lot of unecessary polygons.  This is similar to the [[Legacy:Merge Polygons|merge polygons]] command but also changes the brush wireframe potentially reducing the [[Legacy:Node Count|Node Count]] of your brush.

===Extrude to point ===

Produces a cone with the base of your 2D shape.  The height of the code is determined by the depth value specified at the point of extrusion.  The X and Y offset of the point of the cone is determined by the location of the 2D shape's origin (that little green node you can see).

===Extrude to bevel ===

This behaves in a very similar manner to that of the &quot;Extrude to point&quot; function.  The difference being that the resulting &quot;cone&quot; is trimmed down to the CapHeight specified at the point of extrusion.

==Tips ==

Simplify the surfaces of a brush produced with the 2D shape editor with the [[Legacy:Merge Polygons|merge polygons]] command.

To get rid of extra polygons that it produces when you add the brush, add it then [[Legacy:Intersect|intersect]] it. Delete the added brush and add the RBB (Red Builder Brush) where you want to add it.

Be '''''VERY''''' careful creating the shape because there are no undo's; save often.

:'''Tarquin:'''  not necessarily a good thing though, may introduce new BSP cuts. Use with caution on complex shapes.

If you are having problems seeing the gridlines in the 2d Ed, then add this command to the end of your UED shortcut:

-no gamma-

This will make a fairly ugly workspace, but you will get used to it and hey, you can see the grid lines...

Also you can reduce polys per face by extruding the shape to a larger number, then clipping the flat faces. This will remove the triangulation though so it is a situational practice

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9785</id>
      <timestamp>2007-06-09T23:21:15Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==2D shape editor tutorial ==

This is the Industry Standard: &lt;strike&gt;[http://www.unrealism.com/unrealedmax/2dshapes.shtml Machismo's 2D Shape Editor Tutorial]&lt;/strike&gt; Link is dead, unfortunately, but leaving URL be just in case of a miracle.

:''Tarquin'': Machismo has invited the Wiki to import his 2D-ed tute. I'm realizing just how much info there is on this topic (eek!)... so I've split off a new page to cover drawing techniques, and added some architecture tutes. Anyway, I'm off to get fud and chill as I've been wiki-ing most of the afternoon...

'''Olorin:''' The link above brings up a 404 for me (right now). Might be a temporary problem, or an out-of-date link (in which case we shall remove).

'''Tarquin:''' Oh dear... we're going to have to write something ourselves instead then!

'''MechMantis:''' Confirmed dead. Apparently, they let their domain name expire, and so, it is now under the control of one &quot;NuVisions Media&quot;. Better call in the writing squad.

'''Kirk:''' The domain name is currently being auctioned off (to search engine or pornsite webmasters, I'm sure) on eBay by someone. Auction end July 17th 2007.

----

==Introduction ==

The 2D Shape Editor was introduced as experimental in the original [[Legacy:UnrealEd 1|UnrealEd 1]], but by the [[Legacy:UnrealEd 2|UnrealEd 2]] that was bundled with [[Legacy:UT|UT]] 436, had matured into a robust tool for creating 3 dimensional shapes. However, it can be crashed (see [[Legacy:Crashing UnrealEd|Crashing UnrealEd]]), but otherwise is functional and commonly useful to mappers for all kinds of creative brush operations.

This is a versatile 3 dimensional tool. When the 2D Shape Editor is opened, a 2 dimensional grid is displayed, similar to the main UnrealEd 2D grid views. The only real disadvantage is that all vertex points must coincide with the grid (you can't just place the vertices in any position). However, you can map to a small resolution (4 world units), and the resultant 3D brushes are completely at home in the main UnrealEd 3D views.  

==Tutorials ==

Starting point for using this tool:
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]

Using the 2D editor to make complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Interface ==

For the menu commands, see [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]].

[[Image:Legacy_interface.2DToolbar.gif|center|]]

# New, Open, Close. 2D shapes can be saved as special 2DS files, independently of the current map in the main UnrealEd window.
# Rotate the shape 90 or 45 degrees.
# Flip the shape in x or y axis
# Enlarge or shrink the shape by a factor of 2
# Zoom in or out on the shape (note: the grid is a little buggy on different zoom levels, it's sort of sticky)
# Add a vertex by splitting the current sides. If more than one side is selected, will split all.
# Remove selected side(s). Note that this tends to rearrange the remaining vertices quite a bit, so it's best avoided if possible as a fair amount of fine tuning is necessary afterwards. Not disastrous, but annoying.
# Convert the current side to a linear segment
# Convert the current side to a Bezier segment
# Process: Sheet
# Process: Revolve
# Process: Extrude
# Process: Extrude to point
# Process: Extrude to bevel

===Mouse control ===
* Click on points to select them.
* CTRL+Click to select multiple points
* Click + drag to move points, add CTRL to move multiple
* Right-click + drag to pan the work area
* CLick and drag the orange centre point to move the entire shape

==Processing commands ==

===Sheet ===

This simply creates a sheet brush out of the current shape.

===Revolve ===

Revolves your 2D brush around the &quot;Y&quot; axis.  The origin of the shape (the green node) must be completely to the left or right of the shape you wish to revolve.  The distance of the origin to the edge of your shape determines the inner radius the resultant shape.  The two properties you specify at the point of revolution are &quot;Per 360&quot; which specifies the number of sides that would exist in a full circle, and &quot;Use&quot; which specifies the number of sides to actually generate. 

Tip: rotate the shape before revolving to make, for example, a corridor that curves upwards.

===Extrude to set depth ===

Produces a prism of a given depth, with the current shape as cross-section.  It's well worth the effort of extruding the brush slightly deeper than you need and then substracting (or clipping) the &quot;flat&quot; faces of your extruded brush away.  The Intersect tool can then be used to grab the final brush and hey-presto you've removed a lot of unecessary polygons.  This is similar to the [[Legacy:Merge Polygons|merge polygons]] command but also changes the brush wireframe potentially reducing the [[Legacy:Node Count|Node Count]] of your brush.

===Extrude to point ===

Produces a cone with the base of your 2D shape.  The height of the code is determined by the depth value specified at the point of extrusion.  The X and Y offset of the point of the cone is determined by the location of the 2D shape's origin (that little green node you can see).

===Extrude to bevel ===

This behaves in a very similar manner to that of the &quot;Extrude to point&quot; function.  The difference being that the resulting &quot;cone&quot; is trimmed down to the CapHeight specified at the point of extrusion.

==Tips ==

Simplify the surfaces of a brush produced with the 2D shape editor with the [[Legacy:Merge Polygons|merge polygons]] command.

To get rid of extra polygons that it produces when you add the brush, add it then [[Legacy:Intersect|intersect]] it. Delete the added brush and add the RBB (Red Builder Brush) where you want to add it.

Be '''''VERY''''' careful creating the shape because there are no undo's; save often.

:'''Tarquin:'''  not necessarily a good thing though, may introduce new BSP cuts. Use with caution on complex shapes.

If you are having problems seeing the gridlines in the 2d Ed, then add this command to the end of your UED shortcut:

-no gamma-

This will make a fairly ugly workspace, but you will get used to it and hey, you can see the grid lines...

Also you can reduce polys per face by extruding the shape to a larger number, then clipping the flat faces. This will remove the triangulation though so it is a situational practice

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33046</id>
      <timestamp>2008-09-23T15:36:35Z</timestamp>
      <contributor>
        <username>Asteconn</username>
        <id>1363</id>
      </contributor>
      <comment>/* 2D shape editor tutorial */</comment>
      <text xml:space="preserve">==2D shape editor tutorial ==

This is the Industry Standard: [http://web.archive.org/web/20011016152300/http://www.unrealism.com/unrealedmax/2dshapes.shtml Machismo's 2D Shape Editor Tutorial] &lt;!--Link is dead, unfortunately, but leaving URL be just in case of a miracle.


:''Tarquin'': Machismo has invited the Wiki to import his 2D-ed tute. I'm realizing just how much info there is on this topic (eek!)... so I've split off a new page to cover drawing techniques, and added some architecture tutes. Anyway, I'm off to get fud and chill as I've been wiki-ing most of the afternoon...

'''Olorin:''' The link above brings up a 404 for me (right now). Might be a temporary problem, or an out-of-date link (in which case we shall remove).

'''Tarquin:''' Oh dear... we're going to have to write something ourselves instead then!

'''MechMantis:''' Confirmed dead. Apparently, they let their domain name expire, and so, it is now under the control of one &quot;NuVisions Media&quot;. Better call in the writing squad.

'''Kirk:''' The domain name is currently being auctioned off (to search engine or pornsite webmasters, I'm sure) on eBay by someone. Auction end June 17th 2007.--&gt;

----

==Introduction ==

The 2D Shape Editor was introduced as experimental in the original [[Legacy:UnrealEd 1|UnrealEd 1]], but by the [[Legacy:UnrealEd 2|UnrealEd 2]] that was bundled with [[Legacy:UT|UT]] 436, had matured into a robust tool for creating 3 dimensional shapes. However, it can be crashed (see [[Legacy:Crashing UnrealEd|Crashing UnrealEd]]), but otherwise is functional and commonly useful to mappers for all kinds of creative brush operations.

This is a versatile 3 dimensional tool. When the 2D Shape Editor is opened, a 2 dimensional grid is displayed, similar to the main UnrealEd 2D grid views. The only real disadvantage is that all vertex points must coincide with the grid (you can't just place the vertices in any position). However, you can map to a small resolution (4 world units), and the resultant 3D brushes are completely at home in the main UnrealEd 3D views.  

==Tutorials ==

Starting point for using this tool:
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]

Using the 2D editor to make complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Interface ==

For the menu commands, see [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]].

[[Image:Legacy_interface.2DToolbar.gif|center|]]

# New, Open, Close. 2D shapes can be saved as special 2DS files, independently of the current map in the main UnrealEd window.
# Rotate the shape 90 or 45 degrees.
# Flip the shape in x or y axis
# Enlarge or shrink the shape by a factor of 2
# Zoom in or out on the shape (note: the grid is a little buggy on different zoom levels, it's sort of sticky)
# Add a vertex by splitting the current sides. If more than one side is selected, will split all.
# Remove selected side(s). Note that this tends to rearrange the remaining vertices quite a bit, so it's best avoided if possible as a fair amount of fine tuning is necessary afterwards. Not disastrous, but annoying.
# Convert the current side to a linear segment
# Convert the current side to a Bezier segment
# Process: Sheet
# Process: Revolve
# Process: Extrude
# Process: Extrude to point
# Process: Extrude to bevel

===Mouse control ===
* Click on points to select them.
* CTRL+Click to select multiple points
* Click + drag to move points, add CTRL to move multiple
* Right-click + drag to pan the work area
* CLick and drag the orange centre point to move the entire shape

==Processing commands ==

===Sheet ===

This simply creates a sheet brush out of the current shape.

===Revolve ===

Revolves your 2D brush around the &quot;Y&quot; axis.  The origin of the shape (the green node) must be completely to the left or right of the shape you wish to revolve.  The distance of the origin to the edge of your shape determines the inner radius the resultant shape.  The two properties you specify at the point of revolution are &quot;Per 360&quot; which specifies the number of sides that would exist in a full circle, and &quot;Use&quot; which specifies the number of sides to actually generate. 

Tip: rotate the shape before revolving to make, for example, a corridor that curves upwards.

===Extrude to set depth ===

Produces a prism of a given depth, with the current shape as cross-section.  It's well worth the effort of extruding the brush slightly deeper than you need and then substracting (or clipping) the &quot;flat&quot; faces of your extruded brush away.  The Intersect tool can then be used to grab the final brush and hey-presto you've removed a lot of unecessary polygons.  This is similar to the [[Legacy:Merge Polygons|merge polygons]] command but also changes the brush wireframe potentially reducing the [[Legacy:Node Count|Node Count]] of your brush.

===Extrude to point ===

Produces a cone with the base of your 2D shape.  The height of the code is determined by the depth value specified at the point of extrusion.  The X and Y offset of the point of the cone is determined by the location of the 2D shape's origin (that little green node you can see).

===Extrude to bevel ===

This behaves in a very similar manner to that of the &quot;Extrude to point&quot; function.  The difference being that the resulting &quot;cone&quot; is trimmed down to the CapHeight specified at the point of extrusion.

==Tips ==

Simplify the surfaces of a brush produced with the 2D shape editor with the [[Legacy:Merge Polygons|merge polygons]] command.

To get rid of extra polygons that it produces when you add the brush, add it then [[Legacy:Intersect|intersect]] it. Delete the added brush and add the RBB (Red Builder Brush) where you want to add it.

Be '''''VERY''''' careful creating the shape because there are no undo's; save often.

:'''Tarquin:'''  not necessarily a good thing though, may introduce new BSP cuts. Use with caution on complex shapes.

If you are having problems seeing the gridlines in the 2d Ed, then add this command to the end of your UED shortcut:

-no gamma-

This will make a fairly ugly workspace, but you will get used to it and hey, you can see the grid lines...

Also you can reduce polys per face by extruding the shape to a larger number, then clipping the flat faces. This will remove the triangulation though so it is a situational practice

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:2D Shape Editor Menu</title>
    <id>3877</id>
    <revision>
      <id>9801</id>
      <timestamp>2003-05-25T09:00:40Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">This is the reference page for the menu bar in the [[Legacy:2D Shape Editor|2D Shape Editor]]. For menus in other windows and context menus, see [[Legacy:UnrealEd Menus|UnrealEd Menus]]. Note that even though some of these may be fairly obvious, they are included anyway for completeness.

'''Ars-Magna:''' Hmm, somehow I got logged out&amp;ndash;I actually created this page :-P

===File ===

Obvious:
* New...
* Open ...
* Save 
* Save As... (Open and save commands use the [[Legacy:2DS File|2DS File]] format)

* Image (submenu)
** Open From Disk...
** Get From Current Texture (sometimes crashes UnreadEd)
** Delete &amp;ndash; removes the current image

* Exit &amp;ndash; note that this closes the Shape Editor window, not all of UnrealEd.

===Edit ===
* Insert New Shape
* Split Side
* Delete

* Scale Up
* Scale Down
* Rotate 45
* Rotate 90
* Flip Horizontally
* Flip Vertically

* Grid (submenu)&amp;ndash;Changes the amount of units between each square on the grid.
* Segment (submenu)
** Linear
** Bezier
** Detail Level (submenu)

===View ===

Obvious.
* Zoom In
* Zoom Out

===Process ===

What to do with your shape after it's been created.
* Sheet&amp;ndash;Make it into a sheet
* Revolve...
* Extrude...
* Extrude to Point...
* Extrude to Bevel...

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9802</id>
      <timestamp>2002-09-11T00:08:52Z</timestamp>
      <contributor>
        <ip>Ars-Magna</ip>
      </contributor>
      <minor/>
      <comment>Arghh!!!</comment>
      <text xml:space="preserve">This is the reference page for the menu bar in the [[Legacy:2D Shape Editor|2D Shape Editor]]. For menus in other windows and context menus, see [[Legacy:UnrealEd Menus|UnrealEd Menus]]. Note that even though some of these may be fairly obvious, they are included anyway for completeness.

'''Ars-Magna:''' Hmm, somehow I got logged out&amp;ndash;I actually created this page :-P

===File ===

Obvious:
* New...
* Open ...
* Save 
* Save As...

* Image (submenu)
** Open From Disk...
** Get From Current Texture
** Delete

* Exit&amp;ndash;note that this quits the Shape Editor, not all of UnrealEd.

===Edit ===
* Insert New Shape
* Split Side
* Delete

* Scale Up
* Scale Down
* Rotate 45
* Rotate 90
* Flip Horizontally
* Flip Vertically

* Grid (submenu)&amp;ndash;Changes the amount of units between each square on the grid.
* Segment (submenu)
** Linear
** Bezier
** Detail Level (submenu)

===View ===

Obvious.
* Zoom In
* Zoom Out

===Process ===

What to do with your shape after it's been created.
* Sheet&amp;ndash;Make it into a sheet
* Revolve...
* Extrude...
* Extrude to Point...
* Extrude to Bevel...</text>
    </revision>
    <revision>
      <id>9803</id>
      <timestamp>2002-09-11T09:36:24Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the reference page for the menu bar in the [[Legacy:2D Shape Editor|2D Shape Editor]]. For menus in other windows and context menus, see [[Legacy:UnrealEd Menus|UnrealEd Menus]]. Note that even though some of these may be fairly obvious, they are included anyway for completeness.

'''Ars-Magna:''' Hmm, somehow I got logged out&amp;ndash;I actually created this page :-P

===File ===

Obvious:
* New...
* Open ...
* Save 
* Save As... (Open and save commands use the [[Legacy:2DS File|2DS File]] format)

* Image (submenu)
** Open From Disk...
** Get From Current Texture (sometimes crashes UnreadEd)
** Delete &amp;ndash; removes the current image

* Exit &amp;ndash; note that this closes the Shape Editor window, not all of UnrealEd.

===Edit ===
* Insert New Shape
* Split Side
* Delete

* Scale Up
* Scale Down
* Rotate 45
* Rotate 90
* Flip Horizontally
* Flip Vertically

* Grid (submenu)&amp;ndash;Changes the amount of units between each square on the grid.
* Segment (submenu)
** Linear
** Bezier
** Detail Level (submenu)

===View ===

Obvious.
* Zoom In
* Zoom Out

===Process ===

What to do with your shape after it's been created.
* Sheet&amp;ndash;Make it into a sheet
* Revolve...
* Extrude...
* Extrude to Point...
* Extrude to Bevel...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:2DS File</title>
    <id>3871</id>
    <revision>
      <id>9786</id>
      <timestamp>2003-05-04T10:41:23Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''.2DS'''  [[Legacy:File Format|file format]]  is used by the [[Legacy:2D Shape Editor|2D Shape Editor]] to save shapes.

If you have made a shape in the [[Legacy:2D Shape Editor|2D Shape Editor]], and want to save it, you'll have to save it as a .2ds file. 2ds means (if you didn't figure) 2 dimension shape (or something). You can't save .2ds files as anything else than .2ds files, ie .t3d or the broken (?) .u3d format. So, in other words don't try it, it can't be done. That's all I know, and beware of the UEd goblin 'til next time, kidz ;)

Stores a 2D shape. 
* Created by: 
** UnrealEd's [[Legacy:2D Shape Editor|2D Shape Editor]]. 
* Location: wherever.</text>
    </revision>
    <revision>
      <id>9787</id>
      <timestamp>2002-04-16T16:41:48Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>A quick (un-necessary) text 'bout the .2ds format</comment>
      <text xml:space="preserve">About the .2ds format:

If you have made a shape in the 2D Shape Editor, and want to save it, you'll have to save it as a .2ds file. 2ds means (if you didn't figure) 2 dimension shape (or something). You can't save .2ds files as anything else than .2ds files, ie .t3d or the broken (?) .u3d format. So, in other words don't try it, it can't be done. That's all I know, and beware of the UEd goblin 'til next time, kidz ;)

LegalAssassin</text>
    </revision>
    <revision>
      <id>9788</id>
      <timestamp>2003-04-30T08:26:14Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''.2DS'''  [[Legacy:File Format|file format]]  is used by the [[Legacy:2D Shape Editor|2D Shape Editor]] to save shapes.

If you have made a shape in the [[Legacy:2D Shape Editor|2D Shape Editor]], and want to save it, you'll have to save it as a .2ds file. 2ds means (if you didn't figure) 2 dimension shape (or something). You can't save .2ds files as anything else than .2ds files, ie .t3d or the broken (?) .u3d format. So, in other words don't try it, it can't be done. That's all I know, and beware of the UEd goblin 'til next time, kidz ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:2tall</title>
    <id>3879</id>
    <revision>
      <id>9807</id>
      <timestamp>2003-10-22T23:43:33Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>Welcome</comment>
      <text xml:space="preserve">Background:

I've been playing around with UED 2.0 and UED 3.0 for the last few years. I've made a few maps along the way.

Those that I've released or am working on are as follows:

UT99

::Death Match 
:::[http://nalicity.beyondunreal.com/map_hub.php?mid=3006 DM-Head_2_Head]
:::DM-2tallSpace

UT2003
::Deathball
:::DB-Rockpit
:::DB-Antean
:::DB-Intrepid [http://www.ut2003hq.com/pafiledb/pafiledb.php?action=file&amp;id=1531 download]
:::DB-Pladagogo (Unreleased)

::Bombing Run
:::BR-Orphic

::Death Match
:::DM-INV-Orphic
:::DM-1v1-?? Havent decided on a name yet. Egyptian themed 1 v 1 DM level. 99% done needs tweaking.

I'm currently trying to learn uscript. After reading alot on the scripting section I decided on reading up on Java. That has been quite a help in understanding uscript.

====Discussion====

'''Ch3z:''' Hi there 2tall =) Welcome. 

'''2tall:''' Hello :).........Thanks for the Welcome.

'''GRAF1K:''' Ironically, it's always that last 1% of a project that takes 99% of the time &amp;ndash; in my experience anyway. :-) Welcome to the wiki. :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9808</id>
      <timestamp>2003-10-22T23:07:56Z</timestamp>
      <contributor>
        <ip>2tall</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Background:

I've been playing around with UED 2.0 and UED 3.0 for the last few years. I've made a few maps along the way.

Those that I've released or am working on are as follows:

UT99

::Death Match 
:::[http://nalicity.beyondunreal.com/map_hub.php?mid=3006 DM-Head_2_Head]
:::DM-2tallSpace

UT2003
::Deathball
:::DB-Rockpit
:::DB-Antean
:::DB-Intrepid [http://www.ut2003hq.com/pafiledb/pafiledb.php?action=file&amp;id=1531 download]
:::DB-Pladagogo (Unreleased)

::Bombing Run
:::BR-Orphic

::Death Match
:::DM-INV-Orphic
:::DM-1v1-?? Havent decided on a name yet. Egyptian themed 1 v 1 DM level. 99% done needs tweaking.

I'm currently trying to learn uscript. After reading alot on the scripting section I decided on reading up on Java. That has been quite a help in understanding uscript.

====Discussion====

'''Ch3z:''' Hi there 2tall =) Welcome. 

'''2tall:''' Hello :).........Thanks for the Welcome.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:3D Studio Max</title>
    <id>3872</id>
    <revision>
      <id>9789</id>
      <timestamp>2007-05-15T03:20:00Z</timestamp>
      <contributor>
        <ip>Cpe-24-195-226-195.nycap.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

'''3D Studio Max''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by [http://www.discreet.com discreet].

==3D Studio Max Grid==

It's easy to set your grid in [[Legacy:3D Studio Max|3D Studio Max]] to match the grid in UnrealED. Under Customize -&gt; Grid and Snap Settings, goto the &quot;Home Grid&quot; tab. Under grid spacing, set it match UnrealEd's. The default is 10. Setting it to 16 will make it 16 units in UnrealEd. You can plug in whatever you please.

'''UArch:''' does 3dsmax have a &quot;snap vertexes to nearest gridpoint&quot; feature, from what ive been able to find out, apparently not...any maxscript pros able to make a small script to do this? i would have expected it to be a standard feature but i cant seem to find such a thing :)

'''Canstein:''' If you right click on the snap tool you will get the options for snapping. One of the check boxes is grid. Now when you select a vertex you can move it around from grid point to grid point. If the grid is hidden just press G. Note: I would also turn on vertex snapping. This way you can grab a whole object by a vertex and snap it to the grid at that vertex point instead of doing it one vertex at a time.

==Downloads==

* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/Tools/ut2k3/ut2k3_characters.zip 3DSMax Character model source for UT2003] - This is a must have if you're thinking of making models for Unreal Tournament 2003 with 3DSMax
* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/tools/ut2k3/ut2003-wireframes.zip Wireframe skin textures] - Wireframe images extracted from the 3DSMax character models skin textures for easier skin creation

==Related Topics==
* [[Legacy:Gmax|gmax]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]]
* [[Legacy:3D Studio Max Advanced Texturing|3D Studio Max Advanced Texturing]]
* [[Legacy:3ds2unr|3ds2unr]] Convert .3ds model files to Unreal format
* [[Legacy:Beginner'S Guide To The Edit Mesh Modifier|Beginner's Guide to the Edit Mesh Modifier]]
* [http://www.planetunreal.com/fordy/eeroks.htm Eeroks Plugin for Max 3.xx] Tutorial on exporting models/animations from 3D Studio Max 3.xx and importing them into UT

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9790</id>
      <timestamp>2007-03-29T13:16:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">==Overview==

'''3D Studio Max''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by [http://www.discreet.com discreet].

==3D Studio Max Grid==

It's easy to set your grid in [[Legacy:3D Studio Max|3D Studio Max]] to match the grid in UnrealED. Under Customize -&gt; Grid and Snap Settings, goto the &quot;Home Grid&quot; tab. Under grid spacing, set it match UnrealEd's. The default is 10. Setting it to 16 will make it 16 units in UnrealEd. You can plug in whatever you please.

'''UArch:''' does 3dsmax have a &quot;snap vertexes to nearest gridpoint&quot; feature, from what ive been able to find out, apparently not...any maxscript pros able to make a small script to do this? i would have expected it to be a standard feature but i cant seem to find such a thing :)

==Downloads==

* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/Tools/ut2k3/ut2k3_characters.zip 3DSMax Character model source for UT2003] - This is a must have if you're thinking of making models for Unreal Tournament 2003 with 3DSMax
* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/tools/ut2k3/ut2003-wireframes.zip Wireframe skin textures] - Wireframe images extracted from the 3DSMax character models skin textures for easier skin creation

==Related Topics==
* [[Legacy:Gmax|gmax]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]]
* [[Legacy:3D Studio Max Advanced Texturing|3D Studio Max Advanced Texturing]]
* [[Legacy:3ds2unr|3ds2unr]] Convert .3ds model files to Unreal format
* [[Legacy:Beginner'S Guide To The Edit Mesh Modifier|Beginner's Guide to the Edit Mesh Modifier]]
* [http://www.planetunreal.com/fordy/eeroks.htm Eeroks Plugin for Max 3.xx] Tutorial on exporting models/animations from 3D Studio Max 3.xx and importing them into UT

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34545</id>
      <timestamp>2009-07-21T15:33:10Z</timestamp>
      <contributor>
        <ip>87.205.163.156</ip>
      </contributor>
      <text xml:space="preserve">==Overview==

'''3D Studio Max''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by [http://www.discreet.com discreet].

==3D Studio Max Grid==

It's easy to set your grid in [[Legacy:3D Studio Max|3D Studio Max]] to match the grid in UnrealED. Under Customize -&gt; Grid and Snap Settings, goto the &quot;Home Grid&quot; tab. Under grid spacing, set it match UnrealEd's. The default is 10. Setting it to 16 will make it 16 units in UnrealEd. You can plug in whatever you please.

'''UArch:''' does 3dsmax have a &quot;snap vertexes to nearest gridpoint&quot; feature, from what ive been able to find out, apparently not...any maxscript pros able to make a small script to do this? i would have expected it to be a standard feature but i cant seem to find such a thing :)

'''Canstein:''' If you right click on the snap tool you will get the options for snapping. One of the check boxes is grid. Now when you select a vertex you can move it around from grid point to grid point. If the grid is hidden just press G. Note: I would also turn on vertex snapping. This way you can grab a whole object by a vertex and snap it to the grid at that vertex point instead of doing it one vertex at a time. Doesn't work, idiot...

==Downloads==

* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/Tools/ut2k3/ut2k3_characters.zip 3DSMax Character model source for UT2003] - This is a must have if you're thinking of making models for Unreal Tournament 2003 with 3DSMax
* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/tools/ut2k3/ut2003-wireframes.zip Wireframe skin textures] - Wireframe images extracted from the 3DSMax character models skin textures for easier skin creation

==Related Topics==
* [[Legacy:Gmax|gmax]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]]
* [[Legacy:3D Studio Max Advanced Texturing|3D Studio Max Advanced Texturing]]
* [[Legacy:3ds2unr|3ds2unr]] Convert .3ds model files to Unreal format
* [[Legacy:Beginner'S Guide To The Edit Mesh Modifier|Beginner's Guide to the Edit Mesh Modifier]]
* [http://www.planetunreal.com/fordy/eeroks.htm Eeroks Plugin for Max 3.xx] Tutorial on exporting models/animations from 3D Studio Max 3.xx and importing them into UT

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34546</id>
      <timestamp>2009-07-21T15:50:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/87.205.163.156|87.205.163.156]] ([[User talk:87.205.163.156|Talk]]) to last version by [[User:Cpe-24-195-226-195.nycap.res.rr.com|Cpe-24-195-226-195.nycap.res.rr.com]]</comment>
      <text xml:space="preserve">==Overview==

'''3D Studio Max''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by [http://www.discreet.com discreet].

==3D Studio Max Grid==

It's easy to set your grid in [[Legacy:3D Studio Max|3D Studio Max]] to match the grid in UnrealED. Under Customize -&gt; Grid and Snap Settings, goto the &quot;Home Grid&quot; tab. Under grid spacing, set it match UnrealEd's. The default is 10. Setting it to 16 will make it 16 units in UnrealEd. You can plug in whatever you please.

'''UArch:''' does 3dsmax have a &quot;snap vertexes to nearest gridpoint&quot; feature, from what ive been able to find out, apparently not...any maxscript pros able to make a small script to do this? i would have expected it to be a standard feature but i cant seem to find such a thing :)

'''Canstein:''' If you right click on the snap tool you will get the options for snapping. One of the check boxes is grid. Now when you select a vertex you can move it around from grid point to grid point. If the grid is hidden just press G. Note: I would also turn on vertex snapping. This way you can grab a whole object by a vertex and snap it to the grid at that vertex point instead of doing it one vertex at a time.

==Downloads==

* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/Tools/ut2k3/ut2k3_characters.zip 3DSMax Character model source for UT2003] - This is a must have if you're thinking of making models for Unreal Tournament 2003 with 3DSMax
* [http://old.fileplanet.com/dl/dl.asp?/planetquake/polycount/tools/ut2k3/ut2003-wireframes.zip Wireframe skin textures] - Wireframe images extracted from the 3DSMax character models skin textures for easier skin creation

==Related Topics==
* [[Legacy:Gmax|gmax]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]]
* [[Legacy:3D Studio Max Advanced Texturing|3D Studio Max Advanced Texturing]]
* [[Legacy:3ds2unr|3ds2unr]] Convert .3ds model files to Unreal format
* [[Legacy:Beginner'S Guide To The Edit Mesh Modifier|Beginner's Guide to the Edit Mesh Modifier]]
* [http://www.planetunreal.com/fordy/eeroks.htm Eeroks Plugin for Max 3.xx] Tutorial on exporting models/animations from 3D Studio Max 3.xx and importing them into UT

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:3D Studio Max Advanced Texturing</title>
    <id>3876</id>
    <revision>
      <id>9799</id>
      <timestamp>2007-06-12T19:45:00Z</timestamp>
      <contributor>
        <ip>Dsl.dynamic8597694.ttnet.net.tr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Prologue==

Let's face it.  Ued's texture alignment utilities pretty much suck.  It's darn near impossible to align the textures on that cylinder, or make a decent looking sphere.  Even more difficult is trying to create terrain with paths and other details.  In this tutorial, I will explain how to get your texturing from 3ds max 4 into UnrealEd.  I will NOT explain how to texture/skin things in Max, as 1) I am not very good at this yet, myself.  2) That would be a whole diferrent tutorial.  Perhaps some other time. 

Obviously, you're going to need 3d Studio Max 4 to do this.  You'll also need [http://www.planetunreal.com/spooger/Converter.html Spooger's ASEtoT3D converter] utility. 

==Getting the brush into Max==

The best way to do this is to export your builder brush to a DXF, go into 3d studio max, and import the DXF.  Go into the Brush menu in Ued and hit export.  Select DXF from the dropdown box, and save it to your location of choice.  Now, in 3ds max, open the file menu, hit import, and find your file.  It should all be self-explanatory from here.

==What to do with it once it's there==

Now select the brush and apply your material.  You can also skin it using offset and tiling controls.  Note that you can only rotate in the &quot;W&quot; or ASEtoT3D won't translate right.  For the material make sure you choose a 256x256 bitmap under the diffuse setting of your material.  Neither colors nor any other setting translates through the ASEtoT3D utility.  Just plain bitmaps used as the map for diffuse.  Note that the size of the brush in Max is exactly equal to that in Ued.  A 256x256x256 square in max will import as a 256x256x256 square in Ued.  I'm not sure whether this changes in the import from DXF so make sure you scale the brush appropriately.

==Exporting it to an ASE==

Now under File...  hit export.  Select ASE format and export it with your name of choice.  Only the following check boxes should be checked in the export options dialog that comes up: Under Output Options: Mesh Definition, Materials &amp;ndash; Under Materials: Mesh Normals, Mapping Coordinates &amp;ndash; Under Object Types: Geometric.  Hit OK and proceed.

==Using the Converter==

This is very straight forward.  I'm not going to get into any of the advanced options or anything.  Just select your appropriate ASE file and the output name for the resulting T3D file. Hit Convert.

==Back to Ued==

Now, under the brush menu, &quot;import&quot; the T3D.  The texture alignment in the resulting brush will be exactly as it was in Max.  Also, here's an excerpt from Spooger's site: 

&quot;Texture association in Unreal can be automatic... or not, choice is yours. Before importing the T3D into UnrealEd, the textures should be imported and saved in UED first. Once done, the textures will be assigned to the brush in Unreal automatically during the T3D import by &quot;name association&quot;. So the textures used in Unreal need to have the same name as the ones you assigned in MAX, simple enough.&quot;

Note that even if you can't get this automatic thing to work, just import your texture and apply it to the brush.  It'll be aligned right anyway.  Any 256x256 texture will be aligned the way you skinned things in max, so you can use this to your advantage creating paths and such things on terrain.

Finally, note that any change you make results in the textures going back to default alignment.  This means scaling, vertexes, just about anything.  I'm guessing that you could rotate/pan the textures without it going back to default, but I haven't had reason to try.  What this means is that even the most minor tweak in the geometry of the brush will have to be done in 3ds max to preserve your texturing.  I don't think there's any way around this - it's just a limitation of Ued.

==Wrapping it Up==

This may seem complicated and difficult, but it really isn't as hard as it seems, and it makes real texture alignment possible.  Chrysaor uses this technique for all of his terrain (which, on a side note, he builds in Max).  You can see an example if its effectiveness in his excellent map, [http://www.chrysaor.org/CTF-DisposableV155.zip CTF-Disposable].

Well, I guess that's about it!  I'm still learning in Max, but it is an incredibly powerful tool and by far worth the trouble.  Good luck!

==Related Topics==
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Topics On Modeling|Topics on Modeling]]
* [[Legacy:Skinning|Skinning]]
* [[Legacy:Texture Topics|Texture Topics]]

==Discussion==

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9800</id>
      <timestamp>2007-06-12T19:42:56Z</timestamp>
      <contributor>
        <ip>Dsl.dynamic8597694.ttnet.net.tr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Prologue==

==Getting the brush into Max==

The best way to do this is to export your builder brush to a DXF, go into 3d studio max, and import the DXF.  Go into the Brush menu in Ued and hit export.  Select DXF from the dropdown box, and save it to your location of choice.  Now, in 3ds max, open the file menu, hit import, and find your file.  It should all be self-explanatory from here.

==What to do with it once it's there==

Now select the brush and apply your material.  You can also skin it using offset and tiling controls.  Note that you can only rotate in the &quot;W&quot; or ASEtoT3D won't translate right.  For the material make sure you choose a 256x256 bitmap under the diffuse setting of your material.  Neither colors nor any other setting translates through the ASEtoT3D utility.  Just plain bitmaps used as the map for diffuse.  Note that the size of the brush in Max is exactly equal to that in Ued.  A 256x256x256 square in max will import as a 256x256x256 square in Ued.  I'm not sure whether this changes in the import from DXF so make sure you scale the brush appropriately.

==Exporting it to an ASE==

Now under File...  hit export.  Select ASE format and export it with your name of choice.  Only the following check boxes should be checked in the export options dialog that comes up: Under Output Options: Mesh Definition, Materials &amp;ndash; Under Materials: Mesh Normals, Mapping Coordinates &amp;ndash; Under Object Types: Geometric.  Hit OK and proceed.

==Using the Converter==

This is very straight forward.  I'm not going to get into any of the advanced options or anything.  Just select your appropriate ASE file and the output name for the resulting T3D file. Hit Convert.

==Back to Ued==

Now, under the brush menu, &quot;import&quot; the T3D.  The texture alignment in the resulting brush will be exactly as it was in Max.  Also, here's an excerpt from Spooger's site: 

&quot;Texture association in Unreal can be automatic... or not, choice is yours. Before importing the T3D into UnrealEd, the textures should be imported and saved in UED first. Once done, the textures will be assigned to the brush in Unreal automatically during the T3D import by &quot;name association&quot;. So the textures used in Unreal need to have the same name as the ones you assigned in MAX, simple enough.&quot;

Note that even if you can't get this automatic thing to work, just import your texture and apply it to the brush.  It'll be aligned right anyway.  Any 256x256 texture will be aligned the way you skinned things in max, so you can use this to your advantage creating paths and such things on terrain.

Finally, note that any change you make results in the textures going back to default alignment.  This means scaling, vertexes, just about anything.  I'm guessing that you could rotate/pan the textures without it going back to default, but I haven't had reason to try.  What this means is that even the most minor tweak in the geometry of the brush will have to be done in 3ds max to preserve your texturing.  I don't think there's any way around this - it's just a limitation of Ued.

==Wrapping it Up==

This may seem complicated and difficult, but it really isn't as hard as it seems, and it makes real texture alignment possible.  Chrysaor uses this technique for all of his terrain (which, on a side note, he builds in Max).  You can see an example if its effectiveness in his excellent map, [http://www.chrysaor.org/CTF-DisposableV155.zip CTF-Disposable].

Well, I guess that's about it!  I'm still learning in Max, but it is an incredibly powerful tool and by far worth the trouble.  Good luck!

==Related Topics==
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Topics On Modeling|Topics on Modeling]]
* [[Legacy:Skinning|Skinning]]
* [[Legacy:Texture Topics|Texture Topics]]

==Discussion==

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:3D Studio Max Weapon Modeling And Import</title>
    <id>3878</id>
    <revision>
      <id>9804</id>
      <timestamp>2005-12-18T00:30:57Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Note:''' This tutorial applies mostly to Unreal Tournament. It is also very hard to do clearly so if you have any questions or corrections, please add them in as comments. I can now see why so few tuts on this subject exist :)

'''Discaimer:''' This is the way I animate and import weapons. There are approximately 1,000,345 different ways of doing it, with at least 1,000,000 of them being more efficient/better than mine. What I am passing on is what I learned by scouring the net for scant information on the subject and just basic trial and error. What I do know is that this way works :) To be honest I do things a bit more efficiently, but it is easier to explain it this way and let the person reading it come up with their own better ways of doing it after they are comfortable.

In this tutorial on making weapon models for Unreal Tournament using 3ds2unr, I'm assuming that you are comfortable with 3D Studio Max R3.1 or later. 2.X should be fine although you may find some features missing that I talk about (not sure). This tutorial will not explain the in's and out's of modeling and texturing your weapon, only the basics on how to animate it and export it correctly into Unreal Tournament. 

==Getting Started==

'''Model Setup''' (note that this is for a weapon with one texture, I will explain multi-textured first person view weapon models later):

* Face the forward part of the model to the right in the top viewport. This will save having to alter the script to get the model facing the right way.

* Name your weapon mesh Something00 (Something being whatever name you want).

* It must not be bigger than a 256x256 grid extent centered on the origin. You can scale it to suit in script later so don't fret over that yet. All animations need to reside inside the 256x256 box also (i.e. if the kickback animation leaves the bounding box even by a decimal 3ds2unr will conk out on you).

* Place a blank material (or a multi sub-object material if it has more than one texture) on the object called &quot;Skin&quot;.

* Collapse the stack or convert to an editable mesh (same outcome) and then go to ''Utilities'' and choose ''Reset X-Form'' (''X-form'' stands for &quot;transform,&quot; much like [[Legacy:Transform Permanently|Transform Permanently]] works in UnrealEd). Converting to an editable mesh even if it is already one is important before hitting ''Reset X-Form'' to keep faces that you may have created or mirrored from flipping their normals. Hit the ''Reset Selected'' button and then collapse the stack again. This ensures the pivot point is nicely centered after import into Unreal Tournament.

==Animating==

===Quick Explanation of Vertex Animation===

Vertex animation works like this: Each frame of animation is basically a copy of the mesh, just slightly different, like the little stick figure cartoons you used to draw in school on little pads of paper (you flip the pages and it animates). The .3d files (the file format vertex animation in UT uses) contains a model with these frames of animation and is basically X number of copies of the model super-imposed on one another with X being the number of frames.

In Max we use the ''Snapshot'' tool to make these super-imposed versions of our animated model. The product of this is what gets exported from Max as the .3ds file. The ''Snapshot'' tool asks what frames you want super-imposed (0-15 for example), the number of copies (in our example it would be 16 since 0-15 is 16 copies), and will do all the hard work for you. All this will be explained in detail below.

The beginning and ending of each animation (if the animation begins or ends with the weapon in view) needs to have the same exact postioning. For instance, a firing animation sequence starts, recoils back, and comes back to rest in the exact same postion (it's &quot;rest&quot; postion) it started in. If there is any difference, the gun will appear to jump around in view and look terrible. A good rule of thumb is to save a seperate copy of your .max file with a just a one frame animation of your weapon sitting in it's &quot;rest&quot; position. The exception to this rule are animations that start or end out of view such as a Select and Deselect animations which in these cases the weapon only needs to end in it's &quot;rest&quot; postion and start in it's &quot;rest&quot; postion, respectively.

===Standard Animations===

====Firing Animation====
# First, setup your 3D viewport window so the gun looks as it would in first person. This can give you a semi-accurate view of what it will look like animating in game. Save the Max file as something like &lt;code&gt;Rest_Position.max&lt;/code&gt; or whatever.

# Now move the animation slider to keyframe 1 or 2, hit the Animate button in the lower right, and move/rotate your model into a kickback postion or however it would be postioned when the weapon is fired. Turn off the Animate button, select the first Keyframe at 0 and hold down shift (to clone the key) and drag the cloned keyframe to keyframe 5. Now hit play to see it run through it's firing sequence. It will do this fairly quickly but the code can slow it down later when it's imported into the game. Jump back and forth from key 1 and 5 to make sure the model doesn't move. Save this file as &lt;code&gt;Firing.max&lt;/code&gt; (or whatever as long as you know it's the firing animation file) and re-open the &quot;rest&quot; postion .max file you saved earlier.

====Alt Firing Animation====

Now we need an altfire animation. If your weapon has no alt-fire, skip this step. Pretty much just repeat the same process as above, saving the file as &lt;code&gt;Alt_fire.max&lt;/code&gt; or whatever.

====Select and Deselect Animations====

Now for the Deselect and Select animations which we will include in one file since both animations don't begin ''and'' end in the &quot;rest&quot; posistion. Open your rest postion .max file, move the slider to keyframe 10, hit the Animation button, and move/rotate your model out of view below. Turn off the animation button. Now select the first keyframe at 0, hold shift and clone/drag it to keyframe 20. Play the animation and it should go out of view and then come back into view, ending at it's &quot;rest&quot; postion. Save this file as &lt;code&gt;Select_Deselect.max&lt;/code&gt; or something.

===Looping Animations===

If you need any repetitious animations that loop, such as a spinning barrel, only animate one cycle. For instance, for the spinning barrel, only animate one rotation. Exceptions to this are things like vibration animations (like the Impact-Hammer charging animation) where you want some variety. 

We now have the minimum amount of animations needed to get a weapon into UT. Actually we still need a 1 frame &quot;Still&quot; animation that's played when the weapon isn't doing anything but we can get that from any other animation's &quot;rest&quot; frame so it doesn't need it's own file.

==Exporting Your Animations==

Export your Fire/Alt-Fire and other Standard Animations.

# Open your &lt;code&gt;Firing.max&lt;/code&gt; (or whatever) file and select your weapon. Go to Tools&gt;Snapshot. A window will pop up that looks like this:

[[Image:Legacy_3dsmax-snapshot.jpeg|center|]]

# Click the radio button labeled ''Range'', enter 0 for ''From'' and 5 for ''To'' and make sure the ''Mesh'' radio button is selected (it usually is by default). Select ''OK''. You will now see a bunch of meshes including your original mesh, each one called Something01 through Something05 (with Something00 being your original mesh you snapshotted). Press '''H''' (the ''Select by Name'' hotkey) and a window will pop up listing all the objects in your scene. Now select Something01, hold down Shift, and while still holding Shift select Something05. This will select Something01 and Something05 as well as all the ones in between. Make sure you don't include Something00 (the source mesh that was snapshotted) as 3ds2unr wants all meshes labeled from &quot;01-0X&quot; in the .3ds file. Notice that Something01 is a copy of Something00. See Figure B below for more info.

# Now, while Something01 through Something05 is selected, go to ''File'' -&gt; ''Export Selected''. Export the meshes as a .3ds file named &lt;code&gt;Fire.3ds&lt;/code&gt;. Make sure you choose ''Export Selected'' and not just plain old ''Export''. Once finished, close the scene '''without saving it'''.

# Repeat the process for your alt-fire animation if you have one and any other animations you need. Make sure you input the correct animation frames and copies in the Snapshot tool window. For example, if your alt-fire animation starts from 0 and ends at 13, enter From=0 and To=13 with 14 copies (the 0 is inclusive!). Name your .3ds file &lt;code&gt;Altfire.3ds&lt;/code&gt; or &lt;code&gt;Fire2.3ds&lt;/code&gt; or anything really.

==Exporting Your Select and Deselect Animations==
# Since the Select and Deselect animations are in the same file we will do things slightly different this time. We'll basically be snapshotting the file twice since we need to export two .3ds files. Select your weapons and go to Tools&gt;Snapshot again. Select ''Range'', enter 0 in ''From'' and 10 in ''To'' and enter 11 in ''Copies''. Hit ''OK''. Hit '''H''', select Something01 through Something11, hit ''OK'', choose ''Export Selected'' and export the files as &lt;code&gt;Down.3ds&lt;/code&gt;. It is important that you name it &lt;code&gt;Down.3ds&lt;/code&gt; for reasons I will explain below.

# Now either ''Undo'' until you are back to before you snapshotted the weapon, or close the file without saving and re-open it. Once back to square one, select Snapshot, make sure ''Range'' is selected, enter 10 in ''From'' and 20 in ''To''. Enter 11 for ''Copies'' and make sure ''Mesh'' is selected as the output. Hit ok. Hit '''H''', select Something01 through Something11, choose ''Export Selected'' and name the exported file &lt;code&gt;Select.3ds&lt;/code&gt;. It is important to name this file &lt;code&gt;Select.3ds&lt;/code&gt; for reason I will explain below.

[[Image:Legacy_3dsmax-selectobjects.jpeg|center|]]

===Select/Deselect Naming Conventions===

In UnrealScript, when an action that requires an animation is called, it gets the info from a function in the weapon's code. For instance, when a person presses the alt-fire on a Shockrifle, the code knows to play the animation &quot;Fire2&quot; since it's called in the Shockrifle code's alt-fire play animation function. Since every weapon has to have a Select and Deselect animation and they are never looped or anything funky like that, Epic saw fit to place those play animation functions in every weapon's parent class, TournamentWeapon, and they chose &quot;Down&quot; and &quot;Select&quot; as their animation names. So basically, if you name your Select and Deselect animations as &quot;Select&quot; and &quot;Down&quot;, you don't have to write the play animation functions for them. If you must name them something else or want to change the rate at which the select or deselect animation (or both) is played, you can override the TournamentWeapon function in your weapon's code. This is starting to leave the scope of this tutorial so just make sure you name them &quot;Down&quot; and &quot;Select&quot;.

==Exporting the Still Animation==

You now need a one frame animations called &quot;Still&quot;. There are a few ways to do this with the Snapshot tool (or without) but for simplicity we'll do it the same way we did the others. Open the &lt;code&gt;Rest_Position.max&lt;/code&gt; file, go to ''Tools'' -&gt; ''Snapshot'', and enter 0 in ''From'' and 0 in ''To'', make the number of ''Copies'' 1, and hit OK. Press '''H''', select Something01, hit OK, go to Export Selected, and save it as &lt;code&gt;Still.3ds&lt;/code&gt;.

Move your .3ds files that you exported into the same directory as your 3ds2unr.exe.  On to Part2 [[Legacy:3ds2unr|3ds2unr]]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics on Modeling]]
** [[Legacy:Weapon Modeling|Weapon Modeling]]
*** [[Legacy:Weapons, Items, And Decorations|Weapons, Items, And Decorations]]
*** [[Legacy:Creating A New Weapontype|Creating A New Weapontype]]

==Discussion==

'''Unknown:''' On my hunt to correct spelling, this page came up in a search for ''modelling' but there is only ''modeling' in this page.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9805</id>
      <timestamp>2005-07-28T23:06:16Z</timestamp>
      <contributor>
        <ip>HSE-Sherbrooke-ppp120894.qc.sympatico.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Note:''' This tutorial applies mostly to Unreal Tournament. It is also very hard to do clearly so if you have any questions or corrections, please add them in as comments. I can now see why so few tuts on this subject exist :)

'''Discaimer:''' This is the way I animate and import weapons. There are approximately 1,000,345 different ways of doing it, with at least 1,000,000 of them being more efficient/better than mine. What I am passing on is what I learned by scouring the net for scant information on the subject and just basic trial and error. What I do know is that this way works :) To be honest I do things a bit more efficiently, but it is easier to explain it this way and let the person reading it come up with their own better ways of doing it after they are comfortable.

In this tutorial on making weapon models for Unreal Tournament using 3ds2unr, I'm assuming that you are comfortable with 3D Studio Max R3.1 or later. 2.X should be fine although you may find some features missing that I talk about (not sure). This tutorial will not explain the in's and out's of modeling and texturing your weapon, only the basics on how to animate it and export it correctly into Unreal Tournament. 

==Getting Started ==

'''Model Setup''' (note that this is for a weapon with one texture, I will explain multi-textured first person view weapon models later):

* Face the forward part of the model to the right in the top viewport. This will save having to alter the script to get the model facing the right way.

* Name your weapon mesh Something00 (Something being whatever name you want).

* It must not be bigger than a 256x256 grid extent centered on the origin. You can scale it to suit in script later so don't fret over that yet. All animations need to reside inside the 256x256 box also (i.e. if the kickback animation leaves the bounding box even by a decimal 3ds2unr will conk out on you).

* Place a blank material (or a multi sub-object material if it has more than one texture) on the object called &quot;Skin&quot;.

* Collapse the stack or convert to an editable mesh (same outcome) and then go to ''Utilities'' and choose ''Reset X-Form'' (''X-form'' stands for &quot;transform,&quot; much like [[Legacy:Transform Permanently|Transform Permanently]] works in UnrealEd). Converting to an editable mesh even if it is already one is important before hitting ''Reset X-Form'' to keep faces that you may have created or mirrored from flipping their normals. Hit the ''Reset Selected'' button and then collapse the stack again. This ensures the pivot point is nicely centered after import into Unreal Tournament.

==Animating ==

===Quick Explanation of Vertex Animation ===

Vertex animation works like this: Each frame of animation is basically a copy of the mesh, just slightly different, like the little stick figure cartoons you used to draw in school on little pads of paper (you flip the pages and it animates). The .3d files (the file format vertex animation in UT uses) contains a model with these frames of animation and is basically X number of copies of the model super-imposed on one another with X being the number of frames.

In Max we use the ''Snapshot'' tool to make these super-imposed versions of our animated model. The product of this is what gets exported from Max as the .3ds file. The ''Snapshot'' tool asks what frames you want super-imposed (0-15 for example), the number of copies (in our example it would be 16 since 0-15 is 16 copies), and will do all the hard work for you. All this will be explained in detail below.

The beginning and ending of each animation (if the animation begins or ends with the weapon in view) needs to have the same exact postioning. For instance, a firing animation sequence starts, recoils back, and comes back to rest in the exact same postion (it's &quot;rest&quot; postion) it started in. If there is any difference, the gun will appear to jump around in view and look terrible. A good rule of thumb is to save a seperate copy of your .max file with a just a one frame animation of your weapon sitting in it's &quot;rest&quot; position. The exception to this rule are animations that start or end out of view such as a Select and Deselect animations which in these cases the weapon only needs to end in it's &quot;rest&quot; postion and start in it's &quot;rest&quot; postion, respectively.

===Standard Animations ===

====Firing Animation ====

# First, setup your 3D viewport window so the gun looks as it would in first person. This can give you a semi-accurate view of what it will look like animating in game. Save the Max file as something like &lt;code&gt;Rest_Position.max&lt;/code&gt; or whatever.

# Now move the animation slider to keyframe 1 or 2, hit the Animate button in the lower right, and move/rotate your model into a kickback postion or however it would be postioned when the weapon is fired. Turn off the Animate button, select the first Keyframe at 0 and hold down shift (to clone the key) and drag the cloned keyframe to keyframe 5. Now hit play to see it run through it's firing sequence. It will do this fairly quickly but the code can slow it down later when it's imported into the game. Jump back and forth from key 1 and 5 to make sure the model doesn't move. Save this file as &lt;code&gt;Firing.max&lt;/code&gt; (or whatever as long as you know it's the firing animation file) and re-open the &quot;rest&quot; postion .max file you saved earlier.

====Alt Firing Animation ====

Now we need an altfire animation. If your weapon has no alt-fire, skip this step. Pretty much just repeat the same process as above, saving the file as &lt;code&gt;Alt_fire.max&lt;/code&gt; or whatever.

====Select and Deselect Animations ====

Now for the Deselect and Select animations which we will include in one file since both animations don't begin ''and'' end in the &quot;rest&quot; posistion. Open your rest postion .max file, move the slider to keyframe 10, hit the Animation button, and move/rotate your model out of view below. Turn off the animation button. Now select the first keyframe at 0, hold shift and clone/drag it to keyframe 20. Play the animation and it should go out of view and then come back into view, ending at it's &quot;rest&quot; postion. Save this file as &lt;code&gt;Select_Deselect.max&lt;/code&gt; or something.

===Looping Animations ===

If you need any repetitious animations that loop, such as a spinning barrel, only animate one cycle. For instance, for the spinning barrel, only animate one rotation. Exceptions to this are things like vibration animations (like the Impact-Hammer charging animation) where you want some variety. 

We now have the minimum amount of animations needed to get a weapon into UT. Actually we still need a 1 frame &quot;Still&quot; animation that's played when the weapon isn't doing anything but we can get that from any other animation's &quot;rest&quot; frame so it doesn't need it's own file.

==Exporting Your Animations ==

Export your Fire/Alt-Fire and other Standard Animations.

# Open your &lt;code&gt;Firing.max&lt;/code&gt; (or whatever) file and select your weapon. Go to Tools&gt;Snapshot. A window will pop up that looks like this:

[[Image:Legacy_3dsmax-snapshot.jpeg|center|]]

# Click the radio button labeled ''Range'', enter 0 for ''From'' and 5 for ''To'' and make sure the ''Mesh'' radio button is selected (it usually is by default). Select ''OK''. You will now see a bunch of meshes including your original mesh, each one called Something01 through Something05 (with Something00 being your original mesh you snapshotted). Press '''H''' (the ''Select by Name'' hotkey) and a window will pop up listing all the objects in your scene. Now select Something01, hold down Shift, and while still holding Shift select Something05. This will select Something01 and Something05 as well as all the ones in between. Make sure you don't include Something00 (the source mesh that was snapshotted) as 3ds2unr wants all meshes labeled from &quot;01-0X&quot; in the .3ds file. Notice that Something01 is a copy of Something00. See Figure B below for more info.

# Now, while Something01 through Something05 is selected, go to ''File'' -&gt; ''Export Selected''. Export the meshes as a .3ds file named &lt;code&gt;Fire.3ds&lt;/code&gt;. Make sure you choose ''Export Selected'' and not just plain old ''Export''. Once finished, close the scene '''without saving it'''.

# Repeat the process for your alt-fire animation if you have one and any other animations you need. Make sure you input the correct animation frames and copies in the Snapshot tool window. For example, if your alt-fire animation starts from 0 and ends at 13, enter From=0 and To=13 with 14 copies (the 0 is inclusive!). Name your .3ds file &lt;code&gt;Altfire.3ds&lt;/code&gt; or &lt;code&gt;Fire2.3ds&lt;/code&gt; or anything really.

==Exporting Your Select and Deselect Animations ==

# Since the Select and Deselect animations are in the same file we will do things slightly different this time. We'll basically be snapshotting the file twice since we need to export two .3ds files. Select your weapons and go to Tools&gt;Snapshot again. Select ''Range'', enter 0 in ''From'' and 10 in ''To'' and enter 11 in ''Copies''. Hit ''OK''. Hit '''H''', select Something01 through Something11, hit ''OK'', choose ''Export Selected'' and export the files as &lt;code&gt;Down.3ds&lt;/code&gt;. It is important that you name it &lt;code&gt;Down.3ds&lt;/code&gt; for reasons I will explain below.

# Now either ''Undo'' until you are back to before you snapshotted the weapon, or close the file without saving and re-open it. Once back to square one, select Snapshot, make sure ''Range'' is selected, enter 10 in ''From'' and 20 in ''To''. Enter 11 for ''Copies'' and make sure ''Mesh'' is selected as the output. Hit ok. Hit '''H''', select Something01 through Something11, choose ''Export Selected'' and name the exported file &lt;code&gt;Select.3ds&lt;/code&gt;. It is important to name this file &lt;code&gt;Select.3ds&lt;/code&gt; for reason I will explain below.

[[Image:Legacy_3dsmax-selectobjects.jpeg|center|]]

===Select/Deselect Naming Conventions ===

In UnrealScript, when an action that requires an animation is called, it gets the info from a function in the weapon's code. For instance, when a person presses the alt-fire on a Shockrifle, the code knows to play the animation &quot;Fire2&quot; since it's called in the Shockrifle code's alt-fire play animation function. Since every weapon has to have a Select and Deselect animation and they are never looped or anything funky like that, Epic saw fit to place those play animation functions in every weapon's parent class, TournamentWeapon, and they chose &quot;Down&quot; and &quot;Select&quot; as their animation names. So basically, if you name your Select and Deselect animations as &quot;Select&quot; and &quot;Down&quot;, you don't have to write the play animation functions for them. If you must name them something else or want to change the rate at which the select or deselect animation (or both) is played, you can override the TournamentWeapon function in your weapon's code. This is starting to leave the scope of this tutorial so just make sure you name them &quot;Down&quot; and &quot;Select&quot;.

==Exporting the Still Animation ==

You now need a one frame animations called &quot;Still&quot;. There are a few ways to do this with the Snapshot tool (or without) but for simplicity we'll do it the same way we did the others. Open the &lt;code&gt;Rest_Position.max&lt;/code&gt; file, go to ''Tools'' -&gt; ''Snapshot'', and enter 0 in ''From'' and 0 in ''To'', make the number of ''Copies'' 1, and hit OK. Press '''H''', select Something01, hit OK, go to Export Selected, and save it as &lt;code&gt;Still.3ds&lt;/code&gt;.

Move your .3ds files that you exported into the same directory as your 3ds2unr.exe.  On to Part2 [[Legacy:3ds2unr|3ds2unr]]

==Comments==

On my hunt to correct spelling, this page came up in a search for ''modelling' but there is only ''modeling' in this page.

WERWESREWREWRWEREW
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9806</id>
      <timestamp>2005-07-28T23:06:45Z</timestamp>
      <contributor>
        <ip>HSE-Sherbrooke-ppp120894.qc.sympatico.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Note:''' This tutorial applies mostly to Unreal Tournament. It is also very hard to do clearly so if you have any questions or corrections, please add them in as comments. I can now see why so few tuts on this subject exist :)

'''Discaimer:''' This is the way I animate and import weapons. There are approximately 1,000,345 different ways of doing it, with at least 1,000,000 of them being more efficient/better than mine. What I am passing on is what I learned by scouring the net for scant information on the subject and just basic trial and error. What I do know is that this way works :) To be honest I do things a bit more efficiently, but it is easier to explain it this way and let the person reading it come up with their own better ways of doing it after they are comfortable.

In this tutorial on making weapon models for Unreal Tournament using 3ds2unr, I'm assuming that you are comfortable with 3D Studio Max R3.1 or later. 2.X should be fine although you may find some features missing that I talk about (not sure). This tutorial will not explain the in's and out's of modeling and texturing your weapon, only the basics on how to animate it and export it correctly into Unreal Tournament. 

==Getting Started ==

'''Model Setup''' (note that this is for a weapon with one texture, I will explain multi-textured first person view weapon models later):

* Face the forward part of the model to the right in the top viewport. This will save having to alter the script to get the model facing the right way.

* Name your weapon mesh Something00 (Something being whatever name you want).

* It must not be bigger than a 256x256 grid extent centered on the origin. You can scale it to suit in script later so don't fret over that yet. All animations need to reside inside the 256x256 box also (i.e. if the kickback animation leaves the bounding box even by a decimal 3ds2unr will conk out on you).

* Place a blank material (or a multi sub-object material if it has more than one texture) on the object called &quot;Skin&quot;.

* Collapse the stack or convert to an editable mesh (same outcome) and then go to ''Utilities'' and choose ''Reset X-Form'' (''X-form'' stands for &quot;transform,&quot; much like [[Legacy:Transform Permanently|Transform Permanently]] works in UnrealEd). Converting to an editable mesh even if it is already one is important before hitting ''Reset X-Form'' to keep faces that you may have created or mirrored from flipping their normals. Hit the ''Reset Selected'' button and then collapse the stack again. This ensures the pivot point is nicely centered after import into Unreal Tournament.

==Animating ==

===Quick Explanation of Vertex Animation ===

Vertex animation works like this: Each frame of animation is basically a copy of the mesh, just slightly different, like the little stick figure cartoons you used to draw in school on little pads of paper (you flip the pages and it animates). The .3d files (the file format vertex animation in UT uses) contains a model with these frames of animation and is basically X number of copies of the model super-imposed on one another with X being the number of frames.

In Max we use the ''Snapshot'' tool to make these super-imposed versions of our animated model. The product of this is what gets exported from Max as the .3ds file. The ''Snapshot'' tool asks what frames you want super-imposed (0-15 for example), the number of copies (in our example it would be 16 since 0-15 is 16 copies), and will do all the hard work for you. All this will be explained in detail below.

The beginning and ending of each animation (if the animation begins or ends with the weapon in view) needs to have the same exact postioning. For instance, a firing animation sequence starts, recoils back, and comes back to rest in the exact same postion (it's &quot;rest&quot; postion) it started in. If there is any difference, the gun will appear to jump around in view and look terrible. A good rule of thumb is to save a seperate copy of your .max file with a just a one frame animation of your weapon sitting in it's &quot;rest&quot; position. The exception to this rule are animations that start or end out of view such as a Select and Deselect animations which in these cases the weapon only needs to end in it's &quot;rest&quot; postion and start in it's &quot;rest&quot; postion, respectively.

===Standard Animations ===

====Firing Animation ====

# First, setup your 3D viewport window so the gun looks as it would in first person. This can give you a semi-accurate view of what it will look like animating in game. Save the Max file as something like &lt;code&gt;Rest_Position.max&lt;/code&gt; or whatever.

# Now move the animation slider to keyframe 1 or 2, hit the Animate button in the lower right, and move/rotate your model into a kickback postion or however it would be postioned when the weapon is fired. Turn off the Animate button, select the first Keyframe at 0 and hold down shift (to clone the key) and drag the cloned keyframe to keyframe 5. Now hit play to see it run through it's firing sequence. It will do this fairly quickly but the code can slow it down later when it's imported into the game. Jump back and forth from key 1 and 5 to make sure the model doesn't move. Save this file as &lt;code&gt;Firing.max&lt;/code&gt; (or whatever as long as you know it's the firing animation file) and re-open the &quot;rest&quot; postion .max file you saved earlier.

====Alt Firing Animation ====

Now we need an altfire animation. If your weapon has no alt-fire, skip this step. Pretty much just repeat the same process as above, saving the file as &lt;code&gt;Alt_fire.max&lt;/code&gt; or whatever.

====Select and Deselect Animations ====

Now for the Deselect and Select animations which we will include in one file since both animations don't begin ''and'' end in the &quot;rest&quot; posistion. Open your rest postion .max file, move the slider to keyframe 10, hit the Animation button, and move/rotate your model out of view below. Turn off the animation button. Now select the first keyframe at 0, hold shift and clone/drag it to keyframe 20. Play the animation and it should go out of view and then come back into view, ending at it's &quot;rest&quot; postion. Save this file as &lt;code&gt;Select_Deselect.max&lt;/code&gt; or something.

===Looping Animations ===

If you need any repetitious animations that loop, such as a spinning barrel, only animate one cycle. For instance, for the spinning barrel, only animate one rotation. Exceptions to this are things like vibration animations (like the Impact-Hammer charging animation) where you want some variety. 

We now have the minimum amount of animations needed to get a weapon into UT. Actually we still need a 1 frame &quot;Still&quot; animation that's played when the weapon isn't doing anything but we can get that from any other animation's &quot;rest&quot; frame so it doesn't need it's own file.

==Exporting Your Animations ==

Export your Fire/Alt-Fire and other Standard Animations.

# Open your &lt;code&gt;Firing.max&lt;/code&gt; (or whatever) file and select your weapon. Go to Tools&gt;Snapshot. A window will pop up that looks like this:

[[Image:Legacy_3dsmax-snapshot.jpeg|center|]]

# Click the radio button labeled ''Range'', enter 0 for ''From'' and 5 for ''To'' and make sure the ''Mesh'' radio button is selected (it usually is by default). Select ''OK''. You will now see a bunch of meshes including your original mesh, each one called Something01 through Something05 (with Something00 being your original mesh you snapshotted). Press '''H''' (the ''Select by Name'' hotkey) and a window will pop up listing all the objects in your scene. Now select Something01, hold down Shift, and while still holding Shift select Something05. This will select Something01 and Something05 as well as all the ones in between. Make sure you don't include Something00 (the source mesh that was snapshotted) as 3ds2unr wants all meshes labeled from &quot;01-0X&quot; in the .3ds file. Notice that Something01 is a copy of Something00. See Figure B below for more info.

# Now, while Something01 through Something05 is selected, go to ''File'' -&gt; ''Export Selected''. Export the meshes as a .3ds file named &lt;code&gt;Fire.3ds&lt;/code&gt;. Make sure you choose ''Export Selected'' and not just plain old ''Export''. Once finished, close the scene '''without saving it'''.

# Repeat the process for your alt-fire animation if you have one and any other animations you need. Make sure you input the correct animation frames and copies in the Snapshot tool window. For example, if your alt-fire animation starts from 0 and ends at 13, enter From=0 and To=13 with 14 copies (the 0 is inclusive!). Name your .3ds file &lt;code&gt;Altfire.3ds&lt;/code&gt; or &lt;code&gt;Fire2.3ds&lt;/code&gt; or anything really.

==Exporting Your Select and Deselect Animations ==

# Since the Select and Deselect animations are in the same file we will do things slightly different this time. We'll basically be snapshotting the file twice since we need to export two .3ds files. Select your weapons and go to Tools&gt;Snapshot again. Select ''Range'', enter 0 in ''From'' and 10 in ''To'' and enter 11 in ''Copies''. Hit ''OK''. Hit '''H''', select Something01 through Something11, hit ''OK'', choose ''Export Selected'' and export the files as &lt;code&gt;Down.3ds&lt;/code&gt;. It is important that you name it &lt;code&gt;Down.3ds&lt;/code&gt; for reasons I will explain below.

# Now either ''Undo'' until you are back to before you snapshotted the weapon, or close the file without saving and re-open it. Once back to square one, select Snapshot, make sure ''Range'' is selected, enter 10 in ''From'' and 20 in ''To''. Enter 11 for ''Copies'' and make sure ''Mesh'' is selected as the output. Hit ok. Hit '''H''', select Something01 through Something11, choose ''Export Selected'' and name the exported file &lt;code&gt;Select.3ds&lt;/code&gt;. It is important to name this file &lt;code&gt;Select.3ds&lt;/code&gt; for reason I will explain below.

[[Image:Legacy_3dsmax-selectobjects.jpeg|center|]]

===Select/Deselect Naming Conventions ===

In UnrealScript, when an action that requires an animation is called, it gets the info from a function in the weapon's code. For instance, when a person presses the alt-fire on a Shockrifle, the code knows to play the animation &quot;Fire2&quot; since it's called in the Shockrifle code's alt-fire play animation function. Since every weapon has to have a Select and Deselect animation and they are never looped or anything funky like that, Epic saw fit to place those play animation functions in every weapon's parent class, TournamentWeapon, and they chose &quot;Down&quot; and &quot;Select&quot; as their animation names. So basically, if you name your Select and Deselect animations as &quot;Select&quot; and &quot;Down&quot;, you don't have to write the play animation functions for them. If you must name them something else or want to change the rate at which the select or deselect animation (or both) is played, you can override the TournamentWeapon function in your weapon's code. This is starting to leave the scope of this tutorial so just make sure you name them &quot;Down&quot; and &quot;Select&quot;.

==Exporting the Still Animation ==

You now need a one frame animations called &quot;Still&quot;. There are a few ways to do this with the Snapshot tool (or without) but for simplicity we'll do it the same way we did the others. Open the &lt;code&gt;Rest_Position.max&lt;/code&gt; file, go to ''Tools'' -&gt; ''Snapshot'', and enter 0 in ''From'' and 0 in ''To'', make the number of ''Copies'' 1, and hit OK. Press '''H''', select Something01, hit OK, go to Export Selected, and save it as &lt;code&gt;Still.3ds&lt;/code&gt;.

Move your .3ds files that you exported into the same directory as your 3ds2unr.exe.  On to Part2 [[Legacy:3ds2unr|3ds2unr]]

==Comments==

On my hunt to correct spelling, this page came up in a search for ''modelling' but there is only ''modeling' in this page.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:3D Studio Max Weapon Modelling And Import</title>
    <id>3873</id>
    <revision>
      <id>9791</id>
      <timestamp>2003-07-17T16:26:57Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>Gah. Redirect, then...</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]]</text>
    </revision>
    <revision>
      <id>9792</id>
      <timestamp>2003-07-17T16:13:45Z</timestamp>
      <contributor>
        <ip>S246-23.ties.k12.mn.us</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page should exist because it was listed on a website and you got this page. Check the page and try agian.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:3ds2unr</title>
    <id>3874</id>
    <revision>
      <id>9793</id>
      <timestamp>2005-11-02T21:22:44Z</timestamp>
      <contributor>
        <ip>Jan</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page follows on from where the [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]] tutorial ends.

===Download ===

[http://unreal.epicgames.com/Files/3ds2unr.zip Latest version of 3ds2unr (119)]

===HowTo ===

Once you have the *.3ds files ready (from the above tutorial) place them all into a new empty directory. Copy the 3ds2unr.exe file into the same directory.

Now you need to decide on what your output file will be called. For my grenade weapon first person view I used grenadefp which is what I will continue using here.

The 3ds files I ended up with after animation and export were:
* sel_desel.3ds - the de-select/select animation
* pinpull_fire.3ds - animation for pulling the pin and then throwing

That was it actually. You might have more. My pin pull and fire were in the same file because at the end of the pin pull the arm is drawn back for the throw and not in the rest position so I thought it was simpler this way.

Open up a DOS box, cd to your new directory that contains 3ds2unr and type in the following command:

 3ds2unr.exe grenadefp sel_desel.3ds pinpull_fire.3ds

Replacing the command arguments with your output name and input 3ds files.

If this is the first time you have run 3ds2unr it will prompt you for a project directory. I selected the directory in which we currently were (where 3ds2unr was). If this is not the first time you have run the util it will carry on with whatever setting it was originally given. This is OK if you know where it is but you do have the option of redefining it by typing the following command:

 3ds2unr.exe -setproj

Assuming this is the first time the utility has been run it will create 2 sub-directories in the project directory (does it or do you have to manually create them? It was all of yesterday I did this):
* Classes
* Models

If there were no problems with the conversion you will find, after the utility has completed, a new *.uc file in the classes directory, and new *_d.3d and *_a.3d files in the Models directory. In my case I had a grenadefp.uc, grenadefp_d.3d and grenade_a.3d files.

You have now finished with 3ds2unr.

If you get an error that you don't understand or want to learn how to use transparent/two-sided object materials etc. then the easiest thing is to read the .DOC file that comes with the 3ds2unr download above. It contains a lot of good information on model/material restrictions and advice on how to achieve different effects.

===What Now ===

Once you have the output files it's time to get them into the game. Since my 3ds2unr project directory was nowhere near my UT directory I manually copied the model files into the Models sub-directory of my mods package directory under UT. You will then also need to copy the texture files you used in Max into your models directory. (make sure they are 8bit colour depth and are a power of 2 in resolution - 128*128 or 128*256 or 256*256 etc)

Then open the generated .uc file in notepad and copied all of the #[[Legacy:Exec Directive|exec directive]] statements that this contained and paste them at the top of your new weapon class.

The first thing you will need to change is the texture import lines. Example code:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=Jgrenade FILE=MODELS\hand.bmp GROUP=Skins FLAGS=2 // skins
#exec TEXTURE IMPORT NAME=Jgrenade1 FILE=MODELS\grenbody.bmp GROUP=Skins FLAGS=2 // skins
#exec TEXTURE IMPORT NAME=Jgrenade2 FILE=MODELS\grenarm.bmp GROUP=Skins FLAGS=2
#exec MESHMAP NEW   MESHMAP=grenadehn MESH=grenadehn
#exec MESHMAP SCALE MESHMAP=grenadehn X=0.1 Y=0.1 Z=0.2

#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=1 TEXTURE=Jgrenade
#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=2 TEXTURE=Jgrenade1
#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=3 TEXTURE=Jgrenade2
&lt;/uscript&gt;

The TEXTURE IMPORT lines will contain texture files that dont exist. Replace the FILE setting with the correct bitmap or pcx file name.

Ensure that in the SETTEXTURE lines that the correct texture is set to the correct NUM value. The NUM value refers to the material ID of the polys in your scene. So for example my arm models all have material ID of 1. My grenade body and ring pull have material ID 2 and the grenade arm has a material ID of 3 (done this way to allow a 2 sided material for the grenade arm)

Next, you may need to change is the placement and orientation of the model. The line for this on my model ended up like this:

&lt;uscript&gt;
#exec MESH ORIGIN MESH=grenadehn X=100 Y=0 Z=70 YAW=128
&lt;/uscript&gt;

The origin (X=100 Y=0 Z=70) tells unreal where on the screen the model will appear (X is into the screen, Y is left/right and Z is up/down). Play with the numbers until it looks right. YAW, PITCH and ROLL can also be defined to rotate the model as required (128 is equivalent to 180deg). My model was facing the wrong way initially.

You will also find that the model may be too small or too large on import. To modify this add (or modify) the line

&lt;uscript&gt;
PlayerViewScale=0.4
&lt;/uscript&gt;

in the default properties of the class. A value of 1 keeps the model dimensions as they are. Smaller numbers reduce the size...

It can take quite some time to get the model exactly as you want it on screen.

One thing to be careful of is numbers used for the origin. If the model gets moved away too far from the players point of view it will start to clip into walls when you get close.

Next come the animation sequences.

My final code looked like this:

&lt;uscript&gt;
#exec MESH SEQUENCE MESH=grenadehn SEQ=All STARTFRAME=0 NUMFRAMES=59
#exec MESH SEQUENCE MESH=grenadehn SEQ=down STARTFRAME=0 NUMFRAMES=11 rate=6
#exec MESH SEQUENCE MESH=grenadehn SEQ=select STARTFRAME=10 NUMFRAMES=11 rate=6
#exec MESH SEQUENCE MESH=grenadehn SEQ=still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=grenadehn SEQ=idle STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=grenadehn SEQ=loading STARTFRAME=21 NUMFRAMES=21 rate=8
#exec MESH SEQUENCE MESH=grenadehn SEQ=fire STARTFRAME=41 NUMFRAMES=8
#exec MESH SEQUENCE MESH=grenadehn SEQ=downempty STARTFRAME=48 NUMFRAMES=11 rate=6
&lt;/uscript&gt;

The ALL sequence should be done for you. You will need to list out all the other animation sequences specifying the exact frame they start on and how many frames they last. The RATE keyword at the end of some of the lines allows you to speed up or slow down the animation. You will need to play with it until it feels right.

Finally, write the code to call the animations and make your weapon work :)

One last thing. The above code assumes a right handed weapon. Once you have this finished you can copy all of the #exec statements and paste them below the originals. All you have to do is change the MESH IMPORT MESH line so that it has unmirror=1 at the end. i.e.:

&lt;uscript&gt;
#exec MESH IMPORT MESH=grenadehn ANIVFILE=MODELS\grenfp_a.3d DATAFILE=MODELS\grenfp_d.3d X=0 Y=0 Z=0 unmirror=1
&lt;/uscript&gt;

Then replace all occurances of the mesh name (grenadehn here) with a different name (I used grenadehnl). You can also remove the TEXTURE IMPORT lines since we have already imported the required textures.

Now for an annoying bit. After getting everything spot on for the right hand view you may find that left hand view is out. Again it is just a question of playing with the origin of the mesh and '''also''' the following:

&lt;uscript&gt;
PlayerViewOffset=(X=1.500000,Y=-1.000000,Z=-1.650000)
&lt;/uscript&gt;

Which can be found (or added) to the default properties of the class.

This allows for a model to be mirrored for left/right hand views and be placed exactly where the author wants it. It makes for a lot of tweaking but you can always get the effect you want eventually.

----

'''Wang:'''  This could do with being a bit more detailed and is &quot;fluffy&quot; in a few areas. Anyone who knows more about the subject should add on/modify where necessary.

'''Col Kassad:'''  Very nice! :)

'''Wang:'''  There is something I should add to this that I found out later that only applies to this type of 2 stage firing. On the client in a network game if a weapon is not animating it will be sent to the idle state. When my animation for pulling the pin finished I held the weapon at the last frame of this animation until the user released the fire button. At this point the throw animation ran. Holding the weapon at a specific frame meant it wasn't animating so off it went out of the ClientFiring state. I had to add a 2 frame static animation that could loop in the ready to throw position.

'''Shuriken:''' Hey - can anyone tell me if this and the previous tutorial are the same method still used for importing models and animations into UT2003?  I've found it really hard to find tutorials about the subject for UT2003... can anyone point me to some if it uses a different method?

'''Chip:''' Shuri, this method ''can'' be used for getting vertex animations into UT2003, but that type of animation isn't used for &quot;modern&quot; UT2K3 character models and weapons &amp;ndash; they're exported/imported as skeletal meshes, using either [[Legacy:ActorX|ActorX]] (for Max and [[Legacy:Maya|Maya]] full apps) or with the [[Legacy:UnEditor.Mll|unEditor]] plug-in for Maya 4.0.1 PLE. The difference between the animation types can be seen if you've ever played the Invasion game type &amp;ndash; all the Unreal1 monsters are vertex anims (the method used for Unreal1 characters),and their limited anims are obvious.

In UEd, check the Animations browser to see the extent of skeletal anims used in UT2K3 (File&gt;Open will shows how many .ukx files are used), and the Meshes browser will show the vertex anims. Note that some objects like waving flags are still best done with vertex animation due to the complexity of the motion, or because the mesh shape changes (goop blobs).

So a full answer to your question means you have to define what type of [[Legacy:Animation|Animation]] you're planning. Some links that might help: [[udn2:ModelingTableOfContents]], [[udn2:ActorX]], [[udn2:UnrealVertexAnimation]], [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

'''Shuriken:''' Wow, thanks - detailed reply :) (this is all new to me, so I need all the help I can get...)

From what I've been working with today, I've realised that I'll definately need bones in the model to attach emitters to.  So I assume I have to go the ActorX route (I'm working in Max btw)... but I'm confused about Skeletal Animation.  Is it completely different form of animation?  Or can I do the regular 'move+rotate' animation that is detailed in the first part of this tutorial.. all I need is some simple recoil effects + select/down.

Also, every weapon mutator I have comes with a .ukx.  Is this necessary for skeletal meshes?  I know with vertex animating the models you can embed it in the code, which is what I wish to do - possible for skeletal animation?

'''Chip:''' Hmmm...hard to answer succinctly, but basically vertex animation &amp; skeletal animation are significantly different methods of accomplishing the same task &amp;ndash; animating a mesh. Vertex animation draws on more system resources (from what I've read) during game play, and can be harder to animate for some types of movement (like humanoid stuff.) For weapons, I don't know that it makes much diff, but all &quot;stock&quot; UT2K3 weps are .ukx files, which are skeletal mesh anims. Here's another UDN page to study &amp;ndash; it makes the .ukx package a bit more understandable: [[udn2:AnimBrowserTutorial]]

I haven't done any weapons yet, so the &quot;embed it in the code&quot; question I can't speak to, but just from the standpoint of ease of animation, export &amp; import, the skeletal route seems better to me. Check out the ShockRifle_1st model &amp; anims in Weapons.ukx (use the Animations browser) &amp;ndash; a good recoil anim example, among others.

'''*Someone*:''' Do you know if I can just clone the objects and move them into their individual frames?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9794</id>
      <timestamp>2004-03-30T02:45:14Z</timestamp>
      <contributor>
        <ip>Px3wh.vc.shawcable.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page follows on from where the [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]] tutorial ends.

===Download ===

[ftp://ftp.unrealized.com/files/tools/modeling/3ds2unr_v119.zip Latest version of 3ds2unr (119)]

===HowTo ===

Once you have the *.3ds files ready (from the above tutorial) place them all into a new empty directory. Copy the 3ds2unr.exe file into the same directory.

Now you need to decide on what your output file will be called. For my grenade weapon first person view I used grenadefp which is what I will continue using here.

The 3ds files I ended up with after animation and export were:
* sel_desel.3ds - the de-select/select animation
* pinpull_fire.3ds - animation for pulling the pin and then throwing

That was it actually. You might have more. My pin pull and fire were in the same file because at the end of the pin pull the arm is drawn back for the throw and not in the rest position so I thought it was simpler this way.

Open up a DOS box, cd to your new directory that contains 3ds2unr and type in the following command:

 3ds2unr.exe grenadefp sel_desel.3ds pinpull_fire.3ds

Replacing the command arguments with your output name and input 3ds files.

If this is the first time you have run 3ds2unr it will prompt you for a project directory. I selected the directory in which we currently were (where 3ds2unr was). If this is not the first time you have run the util it will carry on with whatever setting it was originally given. This is OK if you know where it is but you do have the option of redefining it by typing the following command:

 3ds2unr.exe -setproj

Assuming this is the first time the utility has been run it will create 2 sub-directories in the project directory (does it or do you have to manually create them? It was all of yesterday I did this):
* Classes
* Models

If there were no problems with the conversion you will find, after the utility has completed, a new *.uc file in the classes directory, and new *_d.3d and *_a.3d files in the Models directory. In my case I had a grenadefp.uc, grenadefp_d.3d and grenade_a.3d files.

You have now finished with 3ds2unr.

If you get an error that you don't understand or want to learn how to use transparent/two-sided object materials etc. then the easiest thing is to read the .DOC file that comes with the 3ds2unr download above. It contains a lot of good information on model/material restrictions and advice on how to achieve different effects.

===What Now ===

Once you have the output files it's time to get them into the game. Since my 3ds2unr project directory was nowhere near my UT directory I manually copied the model files into the Models sub-directory of my mods package directory under UT. You will then also need to copy the texture files you used in Max into your models directory. (make sure they are 8bit colour depth and are a power of 2 in resolution - 128*128 or 128*256 or 256*256 etc)

Then open the generated .uc file in notepad and copied all of the #[[Legacy:Exec Directive|exec directive]] statements that this contained and paste them at the top of your new weapon class.

The first thing you will need to change is the texture import lines. Example code:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=Jgrenade FILE=MODELS\hand.bmp GROUP=Skins FLAGS=2 // skins
#exec TEXTURE IMPORT NAME=Jgrenade1 FILE=MODELS\grenbody.bmp GROUP=Skins FLAGS=2 // skins
#exec TEXTURE IMPORT NAME=Jgrenade2 FILE=MODELS\grenarm.bmp GROUP=Skins FLAGS=2
#exec MESHMAP NEW   MESHMAP=grenadehn MESH=grenadehn
#exec MESHMAP SCALE MESHMAP=grenadehn X=0.1 Y=0.1 Z=0.2

#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=1 TEXTURE=Jgrenade
#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=2 TEXTURE=Jgrenade1
#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=3 TEXTURE=Jgrenade2
&lt;/uscript&gt;

The TEXTURE IMPORT lines will contain texture files that dont exist. Replace the FILE setting with the correct bitmap or pcx file name.

Ensure that in the SETTEXTURE lines that the correct texture is set to the correct NUM value. The NUM value refers to the material ID of the polys in your scene. So for example my arm models all have material ID of 1. My grenade body and ring pull have material ID 2 and the grenade arm has a material ID of 3 (done this way to allow a 2 sided material for the grenade arm)

Next, you may need to change is the placement and orientation of the model. The line for this on my model ended up like this:

&lt;uscript&gt;
#exec MESH ORIGIN MESH=grenadehn X=100 Y=0 Z=70 YAW=128
&lt;/uscript&gt;

The origin (X=100 Y=0 Z=70) tells unreal where on the screen the model will appear (X is into the screen, Y is left/right and Z is up/down). Play with the numbers until it looks right. YAW, PITCH and ROLL can also be defined to rotate the model as required (128 is equivalent to 180deg). My model was facing the wrong way initially.

You will also find that the model may be too small or too large on import. To modify this add (or modify) the line

&lt;uscript&gt;
PlayerViewScale=0.4
&lt;/uscript&gt;

in the default properties of the class. A value of 1 keeps the model dimensions as they are. Smaller numbers reduce the size...

It can take quite some time to get the model exactly as you want it on screen.

One thing to be careful of is numbers used for the origin. If the model gets moved away too far from the players point of view it will start to clip into walls when you get close.

Next come the animation sequences.

My final code looked like this:

&lt;uscript&gt;
#exec MESH SEQUENCE MESH=grenadehn SEQ=All STARTFRAME=0 NUMFRAMES=59
#exec MESH SEQUENCE MESH=grenadehn SEQ=down STARTFRAME=0 NUMFRAMES=11 rate=6
#exec MESH SEQUENCE MESH=grenadehn SEQ=select STARTFRAME=10 NUMFRAMES=11 rate=6
#exec MESH SEQUENCE MESH=grenadehn SEQ=still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=grenadehn SEQ=idle STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=grenadehn SEQ=loading STARTFRAME=21 NUMFRAMES=21 rate=8
#exec MESH SEQUENCE MESH=grenadehn SEQ=fire STARTFRAME=41 NUMFRAMES=8
#exec MESH SEQUENCE MESH=grenadehn SEQ=downempty STARTFRAME=48 NUMFRAMES=11 rate=6
&lt;/uscript&gt;

The ALL sequence should be done for you. You will need to list out all the other animation sequences specifying the exact frame they start on and how many frames they last. The RATE keyword at the end of some of the lines allows you to speed up or slow down the animation. You will need to play with it until it feels right.

Finally, write the code to call the animations and make your weapon work :)

One last thing. The above code assumes a right handed weapon. Once you have this finished you can copy all of the #exec statements and paste them below the originals. All you have to do is change the MESH IMPORT MESH line so that it has unmirror=1 at the end. i.e.:

&lt;uscript&gt;
#exec MESH IMPORT MESH=grenadehn ANIVFILE=MODELS\grenfp_a.3d DATAFILE=MODELS\grenfp_d.3d X=0 Y=0 Z=0 unmirror=1
&lt;/uscript&gt;

Then replace all occurances of the mesh name (grenadehn here) with a different name (I used grenadehnl). You can also remove the TEXTURE IMPORT lines since we have already imported the required textures.

Now for an annoying bit. After getting everything spot on for the right hand view you may find that left hand view is out. Again it is just a question of playing with the origin of the mesh and '''also''' the following:

&lt;uscript&gt;
PlayerViewOffset=(X=1.500000,Y=-1.000000,Z=-1.650000)
&lt;/uscript&gt;

Which can be found (or added) to the default properties of the class.

This allows for a model to be mirrored for left/right hand views and be placed exactly where the author wants it. It makes for a lot of tweaking but you can always get the effect you want eventually.

----

'''Wang:'''  This could do with being a bit more detailed and is &quot;fluffy&quot; in a few areas. Anyone who knows more about the subject should add on/modify where necessary.

'''Col Kassad:'''  Very nice! :)

'''Wang:'''  There is something I should add to this that I found out later that only applies to this type of 2 stage firing. On the client in a network game if a weapon is not animating it will be sent to the idle state. When my animation for pulling the pin finished I held the weapon at the last frame of this animation until the user released the fire button. At this point the throw animation ran. Holding the weapon at a specific frame meant it wasn't animating so off it went out of the ClientFiring state. I had to add a 2 frame static animation that could loop in the ready to throw position.

'''Shuriken:''' Hey - can anyone tell me if this and the previous tutorial are the same method still used for importing models and animations into UT2003?  I've found it really hard to find tutorials about the subject for UT2003... can anyone point me to some if it uses a different method?

'''Chip:''' Shuri, this method ''can'' be used for getting vertex animations into UT2003, but that type of animation isn't used for &quot;modern&quot; UT2K3 character models and weapons &amp;ndash; they're exported/imported as skeletal meshes, using either [[Legacy:ActorX|ActorX]] (for Max and [[Legacy:Maya|Maya]] full apps) or with the [[Legacy:UnEditor.Mll|unEditor]] plug-in for Maya 4.0.1 PLE. The difference between the animation types can be seen if you've ever played the Invasion game type &amp;ndash; all the Unreal1 monsters are vertex anims (the method used for Unreal1 characters),and their limited anims are obvious.

In UEd, check the Animations browser to see the extent of skeletal anims used in UT2K3 (File&gt;Open will shows how many .ukx files are used), and the Meshes browser will show the vertex anims. Note that some objects like waving flags are still best done with vertex animation due to the complexity of the motion, or because the mesh shape changes (goop blobs).

So a full answer to your question means you have to define what type of [[Legacy:Animation|Animation]] you're planning. Some links that might help: [[udn2:ModelingTableOfContents]], [[udn2:ActorX]], [[udn2:UnrealVertexAnimation]], [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

'''Shuriken:''' Wow, thanks - detailed reply :) (this is all new to me, so I need all the help I can get...)

From what I've been working with today, I've realised that I'll definately need bones in the model to attach emitters to.  So I assume I have to go the ActorX route (I'm working in Max btw)... but I'm confused about Skeletal Animation.  Is it completely different form of animation?  Or can I do the regular 'move+rotate' animation that is detailed in the first part of this tutorial.. all I need is some simple recoil effects + select/down.

Also, every weapon mutator I have comes with a .ukx.  Is this necessary for skeletal meshes?  I know with vertex animating the models you can embed it in the code, which is what I wish to do - possible for skeletal animation?

'''Chip:''' Hmmm...hard to answer succinctly, but basically vertex animation &amp; skeletal animation are significantly different methods of accomplishing the same task &amp;ndash; animating a mesh. Vertex animation draws on more system resources (from what I've read) during game play, and can be harder to animate for some types of movement (like humanoid stuff.) For weapons, I don't know that it makes much diff, but all &quot;stock&quot; UT2K3 weps are .ukx files, which are skeletal mesh anims. Here's another UDN page to study &amp;ndash; it makes the .ukx package a bit more understandable: [[udn2:AnimBrowserTutorial]]

I haven't done any weapons yet, so the &quot;embed it in the code&quot; question I can't speak to, but just from the standpoint of ease of animation, export &amp; import, the skeletal route seems better to me. Check out the ShockRifle_1st model &amp; anims in Weapons.ukx (use the Animations browser) &amp;ndash; a good recoil anim example, among others.

'''*Someone*:''' Do you know if I can just clone the objects and move them into their individual frames?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9795</id>
      <timestamp>2005-10-17T00:05:20Z</timestamp>
      <contributor>
        <ip>Bc18112.bendcable.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page follows on from where the [[Legacy:3D Studio Max Weapon Modeling And Import|3D Studio Max Weapon Modeling And Import]] tutorial ends.

===Download ===

[ftp://ftp.unrealized.com/files/tools/modeling/3ds2unr_v119.zip Latest version of 3ds2unr (119)](dead link)

===HowTo ===

Once you have the *.3ds files ready (from the above tutorial) place them all into a new empty directory. Copy the 3ds2unr.exe file into the same directory.

Now you need to decide on what your output file will be called. For my grenade weapon first person view I used grenadefp which is what I will continue using here.

The 3ds files I ended up with after animation and export were:
* sel_desel.3ds - the de-select/select animation
* pinpull_fire.3ds - animation for pulling the pin and then throwing

That was it actually. You might have more. My pin pull and fire were in the same file because at the end of the pin pull the arm is drawn back for the throw and not in the rest position so I thought it was simpler this way.

Open up a DOS box, cd to your new directory that contains 3ds2unr and type in the following command:

 3ds2unr.exe grenadefp sel_desel.3ds pinpull_fire.3ds

Replacing the command arguments with your output name and input 3ds files.

If this is the first time you have run 3ds2unr it will prompt you for a project directory. I selected the directory in which we currently were (where 3ds2unr was). If this is not the first time you have run the util it will carry on with whatever setting it was originally given. This is OK if you know where it is but you do have the option of redefining it by typing the following command:

 3ds2unr.exe -setproj

Assuming this is the first time the utility has been run it will create 2 sub-directories in the project directory (does it or do you have to manually create them? It was all of yesterday I did this):
* Classes
* Models

If there were no problems with the conversion you will find, after the utility has completed, a new *.uc file in the classes directory, and new *_d.3d and *_a.3d files in the Models directory. In my case I had a grenadefp.uc, grenadefp_d.3d and grenade_a.3d files.

You have now finished with 3ds2unr.

If you get an error that you don't understand or want to learn how to use transparent/two-sided object materials etc. then the easiest thing is to read the .DOC file that comes with the 3ds2unr download above. It contains a lot of good information on model/material restrictions and advice on how to achieve different effects.

===What Now ===

Once you have the output files it's time to get them into the game. Since my 3ds2unr project directory was nowhere near my UT directory I manually copied the model files into the Models sub-directory of my mods package directory under UT. You will then also need to copy the texture files you used in Max into your models directory. (make sure they are 8bit colour depth and are a power of 2 in resolution - 128*128 or 128*256 or 256*256 etc)

Then open the generated .uc file in notepad and copied all of the #[[Legacy:Exec Directive|exec directive]] statements that this contained and paste them at the top of your new weapon class.

The first thing you will need to change is the texture import lines. Example code:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=Jgrenade FILE=MODELS\hand.bmp GROUP=Skins FLAGS=2 // skins
#exec TEXTURE IMPORT NAME=Jgrenade1 FILE=MODELS\grenbody.bmp GROUP=Skins FLAGS=2 // skins
#exec TEXTURE IMPORT NAME=Jgrenade2 FILE=MODELS\grenarm.bmp GROUP=Skins FLAGS=2
#exec MESHMAP NEW   MESHMAP=grenadehn MESH=grenadehn
#exec MESHMAP SCALE MESHMAP=grenadehn X=0.1 Y=0.1 Z=0.2

#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=1 TEXTURE=Jgrenade
#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=2 TEXTURE=Jgrenade1
#exec MESHMAP SETTEXTURE MESHMAP=grenadehn NUM=3 TEXTURE=Jgrenade2
&lt;/uscript&gt;

The TEXTURE IMPORT lines will contain texture files that dont exist. Replace the FILE setting with the correct bitmap or pcx file name.

Ensure that in the SETTEXTURE lines that the correct texture is set to the correct NUM value. The NUM value refers to the material ID of the polys in your scene. So for example my arm models all have material ID of 1. My grenade body and ring pull have material ID 2 and the grenade arm has a material ID of 3 (done this way to allow a 2 sided material for the grenade arm)

Next, you may need to change is the placement and orientation of the model. The line for this on my model ended up like this:

&lt;uscript&gt;
#exec MESH ORIGIN MESH=grenadehn X=100 Y=0 Z=70 YAW=128
&lt;/uscript&gt;

The origin (X=100 Y=0 Z=70) tells unreal where on the screen the model will appear (X is into the screen, Y is left/right and Z is up/down). Play with the numbers until it looks right. YAW, PITCH and ROLL can also be defined to rotate the model as required (128 is equivalent to 180deg). My model was facing the wrong way initially.

You will also find that the model may be too small or too large on import. To modify this add (or modify) the line

&lt;uscript&gt;
PlayerViewScale=0.4
&lt;/uscript&gt;

in the default properties of the class. A value of 1 keeps the model dimensions as they are. Smaller numbers reduce the size...

It can take quite some time to get the model exactly as you want it on screen.

One thing to be careful of is numbers used for the origin. If the model gets moved away too far from the players point of view it will start to clip into walls when you get close.

Next come the animation sequences.

My final code looked like this:

&lt;uscript&gt;
#exec MESH SEQUENCE MESH=grenadehn SEQ=All STARTFRAME=0 NUMFRAMES=59
#exec MESH SEQUENCE MESH=grenadehn SEQ=down STARTFRAME=0 NUMFRAMES=11 rate=6
#exec MESH SEQUENCE MESH=grenadehn SEQ=select STARTFRAME=10 NUMFRAMES=11 rate=6
#exec MESH SEQUENCE MESH=grenadehn SEQ=still STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=grenadehn SEQ=idle STARTFRAME=0 NUMFRAMES=1
#exec MESH SEQUENCE MESH=grenadehn SEQ=loading STARTFRAME=21 NUMFRAMES=21 rate=8
#exec MESH SEQUENCE MESH=grenadehn SEQ=fire STARTFRAME=41 NUMFRAMES=8
#exec MESH SEQUENCE MESH=grenadehn SEQ=downempty STARTFRAME=48 NUMFRAMES=11 rate=6
&lt;/uscript&gt;

The ALL sequence should be done for you. You will need to list out all the other animation sequences specifying the exact frame they start on and how many frames they last. The RATE keyword at the end of some of the lines allows you to speed up or slow down the animation. You will need to play with it until it feels right.

Finally, write the code to call the animations and make your weapon work :)

One last thing. The above code assumes a right handed weapon. Once you have this finished you can copy all of the #exec statements and paste them below the originals. All you have to do is change the MESH IMPORT MESH line so that it has unmirror=1 at the end. i.e.:

&lt;uscript&gt;
#exec MESH IMPORT MESH=grenadehn ANIVFILE=MODELS\grenfp_a.3d DATAFILE=MODELS\grenfp_d.3d X=0 Y=0 Z=0 unmirror=1
&lt;/uscript&gt;

Then replace all occurances of the mesh name (grenadehn here) with a different name (I used grenadehnl). You can also remove the TEXTURE IMPORT lines since we have already imported the required textures.

Now for an annoying bit. After getting everything spot on for the right hand view you may find that left hand view is out. Again it is just a question of playing with the origin of the mesh and '''also''' the following:

&lt;uscript&gt;
PlayerViewOffset=(X=1.500000,Y=-1.000000,Z=-1.650000)
&lt;/uscript&gt;

Which can be found (or added) to the default properties of the class.

This allows for a model to be mirrored for left/right hand views and be placed exactly where the author wants it. It makes for a lot of tweaking but you can always get the effect you want eventually.

----

'''Wang:'''  This could do with being a bit more detailed and is &quot;fluffy&quot; in a few areas. Anyone who knows more about the subject should add on/modify where necessary.

'''Col Kassad:'''  Very nice! :)

'''Wang:'''  There is something I should add to this that I found out later that only applies to this type of 2 stage firing. On the client in a network game if a weapon is not animating it will be sent to the idle state. When my animation for pulling the pin finished I held the weapon at the last frame of this animation until the user released the fire button. At this point the throw animation ran. Holding the weapon at a specific frame meant it wasn't animating so off it went out of the ClientFiring state. I had to add a 2 frame static animation that could loop in the ready to throw position.

'''Shuriken:''' Hey - can anyone tell me if this and the previous tutorial are the same method still used for importing models and animations into UT2003?  I've found it really hard to find tutorials about the subject for UT2003... can anyone point me to some if it uses a different method?

'''Chip:''' Shuri, this method ''can'' be used for getting vertex animations into UT2003, but that type of animation isn't used for &quot;modern&quot; UT2K3 character models and weapons &amp;ndash; they're exported/imported as skeletal meshes, using either [[Legacy:ActorX|ActorX]] (for Max and [[Legacy:Maya|Maya]] full apps) or with the [[Legacy:UnEditor.Mll|unEditor]] plug-in for Maya 4.0.1 PLE. The difference between the animation types can be seen if you've ever played the Invasion game type &amp;ndash; all the Unreal1 monsters are vertex anims (the method used for Unreal1 characters),and their limited anims are obvious.

In UEd, check the Animations browser to see the extent of skeletal anims used in UT2K3 (File&gt;Open will shows how many .ukx files are used), and the Meshes browser will show the vertex anims. Note that some objects like waving flags are still best done with vertex animation due to the complexity of the motion, or because the mesh shape changes (goop blobs).

So a full answer to your question means you have to define what type of [[Legacy:Animation|Animation]] you're planning. Some links that might help: [[udn2:ModelingTableOfContents]], [[udn2:ActorX]], [[udn2:UnrealVertexAnimation]], [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

'''Shuriken:''' Wow, thanks - detailed reply :) (this is all new to me, so I need all the help I can get...)

From what I've been working with today, I've realised that I'll definately need bones in the model to attach emitters to.  So I assume I have to go the ActorX route (I'm working in Max btw)... but I'm confused about Skeletal Animation.  Is it completely different form of animation?  Or can I do the regular 'move+rotate' animation that is detailed in the first part of this tutorial.. all I need is some simple recoil effects + select/down.

Also, every weapon mutator I have comes with a .ukx.  Is this necessary for skeletal meshes?  I know with vertex animating the models you can embed it in the code, which is what I wish to do - possible for skeletal animation?

'''Chip:''' Hmmm...hard to answer succinctly, but basically vertex animation &amp; skeletal animation are significantly different methods of accomplishing the same task &amp;ndash; animating a mesh. Vertex animation draws on more system resources (from what I've read) during game play, and can be harder to animate for some types of movement (like humanoid stuff.) For weapons, I don't know that it makes much diff, but all &quot;stock&quot; UT2K3 weps are .ukx files, which are skeletal mesh anims. Here's another UDN page to study &amp;ndash; it makes the .ukx package a bit more understandable: [[udn2:AnimBrowserTutorial]]

I haven't done any weapons yet, so the &quot;embed it in the code&quot; question I can't speak to, but just from the standpoint of ease of animation, export &amp; import, the skeletal route seems better to me. Check out the ShockRifle_1st model &amp; anims in Weapons.ukx (use the Animations browser) &amp;ndash; a good recoil anim example, among others.

'''*Someone*:''' Do you know if I can just clone the objects and move them into their individual frames?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:3s</title>
    <id>3875</id>
    <revision>
      <id>9796</id>
      <timestamp>2002-07-06T13:48:06Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">'''Tarquin:'''  Hey 3s. :)

'''ZxAnPhOrIaN:'''  Welcome to the Wiki ;-)

'''Tarquin:'''  3s has been around for a while... high time he got a user page. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9797</id>
      <timestamp>2002-06-23T17:16:15Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:'''  Hey 3s. :)

'''ZxAnPhOrIaN:'''  Welcome to the Wiki ;-)</text>
    </revision>
    <revision>
      <id>9798</id>
      <timestamp>2002-06-23T19:14:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:'''  Hey 3s. :)

'''ZxAnPhOrIaN:'''  Welcome to the Wiki ;-)

'''Tarquin:'''  3s has been around for a while... high time he got a user page. :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:5parrowhawk</title>
    <id>3880</id>
    <revision>
      <id>9809</id>
      <timestamp>2006-12-02T02:06:09Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Orphan page hunting.</comment>
      <text xml:space="preserve">Hi! I'm a relative newbie to Unreal editing, and sort of a jack of all trades - I do code, modelling and a bit of animation (I suck at texturing though.)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>9810</id>
      <timestamp>2004-05-16T16:09:04Z</timestamp>
      <contributor>
        <ip>5parrowhawk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi! I'm a relative newbie to Unreal editing, and sort of a jack of all trades - I do code, modelling and a bit of animation (I suck at texturing though.)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:A Bug'S Life</title>
    <id>4829</id>
    <revision>
      <id>10973</id>
      <timestamp>2008-04-11T20:42:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirecting to [[A Bug's Life]]</comment>
      <text xml:space="preserve">#REDIRECT [[A Bug's Life]]</text>
    </revision>
    <revision>
      <id>10974</id>
      <timestamp>2008-04-11T20:51:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>erk, legacy namespace</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:A Bug's Life]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:A Bug's Life</title>
    <id>407</id>
    <revision>
      <id>1352</id>
      <timestamp>2006-07-06T23:36:57Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>cf. Joel Spolsky</comment>
      <text xml:space="preserve">{{innerbox| ''I originally posted this article in our internal Jailbreak testing forums and moved it on the Wiki at a second thought.  It's generically phrased, so it should apply to almost every project that's in development.''

 ''For another and rather entertaining look on the same subject, have a look at [http://www.joelonsoftware.com/articles/fog0000000029.html Painless Bug Tracking] by Joel Spolsky.  One of the most important things Joel has to teach to us techies is that you have to make documents ''fun to read'' to get people to actually read them.''

}}

Instead of listing a set of rules how bug reports should be posted, I'm going to describe '''A Bug's Life''' here.  After all, all rules I could possibly post boil down to a certain understanding of which information is necessary (and why) in order to squish a bug.

==What's a Bug?==

First off, whether something is a bug is a mere matter of definition.  That fragged players get respawned in jail is a distinct feature of Jailbreak, but for common Deathmatch it'd be a bug.  (Yes, that's a bit far-fetched, but you get the idea.)  Generally speaking, '''if a program behaves in a way the developer intended it not to, that's a bug.'''

There are a number of things where you can safely assume that a developer did not intend them to happen:

* '''Crashes.'''
* Things that '''obviously disagree with existing documentation.''' &amp;ndash; That could just as well be an error in the documentation, but that'd be a bug in its own right.
* Things that are '''needlessly inconvenient''' for the user. &amp;ndash; On the other hand, they could also be ''necessarily'' inconvenient for the user, but then that should be made obvious to prevent frustration on the users' part.  Have a look at the [[Legacy:Mychaeel/Modding Etiquette|Modding Etiquette]] about that.

If you find such a thing, post a bug report.  If you find something where you're not sure whether it's a bug or intentional behavior, ask the developer; chances are that it is a bug anyway, and if it's not it should at least be changed to make that clear.

==A Bug's Life Phases==

After this short intro to what a bug is, let's have a look at the bug's life.

# '''A bug is born''' somewhere on the way between the developer's brain and the fingers typing the code.
# * Sometimes a bug's cause is as simple as a typo in the code (when the coder lacks coffee, or sleep, or both, or had too much coffee, or something like that).
# * Sometimes a coder ''thought'' she'd understood a particular piece of code, and how she could get her own code to work with it effectively.  Unfortunately she is subtly mistaken (which could even be due to another bug in that existing code which naturally isn't documented anywhere).
# * Sometimes one part of her own code puts the program in a state some other part of her own code doesn't expect and handle; that's the most annoying and most avoidable kind of bug for a decent programmer.

# Now that the bug has crept into the code, it stays there until '''it is discovered''' by chance by somebody.  More often than not that's in the middle of a complex situation that is impossible to reproduce in every detail, and the next time the program is executed and the situation is slightly different, the bug manages to hide again.

# But the bug's days are numbered since its existence has been given away already.  Of course, just like with real-life bugs, the coder needs to '''see the bug in order to fix it.'''  So the bug hunter tries to recall as much as possible of the situation that caused the bug  to appear the first time and the events preceding it and then successively '''strips it of everything unnecessary.'''  Ideally the bug hunter ends this process with a short and simple list of steps that reliably lead to the bug showing itself.

# Now it's the coder's turn to '''squish the bug.'''  She traces the program's execution from the start until she finds the point where a piece of code doesn't change the program's state as she meant it to.  Then she tries to trace the program's flow ''back'' to the cause of that behavior.  She changes it, and the bug is '''fixed.'''

==Bug Hunters==

You, as bug hunters, are responsible for the '''second and third phase''' in a bug's hopefully short lifespan.

Just discovering the bug by chance is not enough; given that there are more bug hunters than developers working on a project, leaving the third step up to the developers is a big waste of project time.

Imagine a small project with one coder and three testers.  For the sake of the argument, let's assume that the third phase (reproduction) takes one hour per bug, and the fourth phase (fixing) half an hour (which may or may not be way off in either direction depending on the bug).  Let's also assume that every tester discovers a single distinct bug.

* If all testers stop working at the second phase (discovery) and let the developer handle the third and fourth phase (reproduction and fixing), we have:  a single coder working one and a half hours on each of three bugs, resulting in '''four and a half hours of work.'''

* If all testers continue working until the third phase is completed (discovery and reproduction) and then let the developer fix the bug, we have:  three bug hunters working in parallel on three bugs for one hour, then the developer fixing each of the three bugs for half an hour each, resulting in '''two and a half hours of work.'''

Do you notice how the second way to do it actually saves two hours of development time in this example?

==Reporting Bugs==

When you report a bug, include all information that's necessary for the developers to reliably reproduce it.  And just as important:  Leave unnecessary information away.

Things every bug report should contain in some way or another:

* A brief, but descriptive '''bug report subject''' (a thread subject if you post it in a forum, for instance) for your bug report that clearly summarizes the reported bug.  As a rule of thumb, a descriptive subject always '''contains at a verb.'''  The program ''does'' something wrong after all.

* A thorough, but to-the-point '''description of the buggy behavior,''' including a short description of how you ''expect'' the program to behave instead.  Screenshots, logs and the like ''can'' be helpful there.

* A thorough, but to-the-point '''description of how to reproduce the buggy behavior''' which you worked out in the third phase of a bug's life as described above.

* The '''revision of the program''' you're reporting the bug for.

* An up-to-date '''description of your system''' (hardware, operating system version and patch level, drivers, and so on).  You don't have to repeat the same information over and over again, of course, but the developers should always be able to look it up if they need to.  (For example, the developers could ask all testers to submit their system specs at the start of the testing period.)

==Comments==

'''Mychaeel:''' I originally posted that in the internal &quot;Jailbreak Testing&quot; forum, but knowing the Wiki as a great sounding board for articles like this one I decided to move it here and link it from our testing forum instead.  Comments are appreciated.

'''EntropicLqd:''' Nice article.  Is it worth mentioning that the number of bugs in any software system generally decays exponentially?  How about adding a suggested set of minimum information that should be submitted with a bug report (game version, mod version, log files, screen shots if applicable etc).

'''Mychaeel:''' I expressly did not want to give a minimum set of information to post with a bug report in terms of &quot;map name, log, screen shots&quot; and so on.  It only leads people to ticking those points off one by one without thinking about whether they're actually giving the developers helpful information or not.

'''Tarquin:''' That's sort of ... zen :D 

'''Piglet:''' Hmm.  Good and intresting section, however you have seemed to have neglected the 'immediatly obvious' type of bug.  Which are generally more common (at least in the programming that i do).  Not a big complaint, just a minor point.

'''Mychaeel:''' Hmm.  The really obvious things should actually never get into testing; and I would rather not tempt testers to skip bug research by simply claiming that it's &quot;obvious.&quot;  My stance is that, if a bug was obvious, it wouldn't be there for others to find in the first place.  I assume that programmers do a minimum amount of testing themselves before releasing a piece of software to anyone.</text>
    </revision>
    <revision>
      <id>1353</id>
      <timestamp>2003-02-24T16:41:51Z</timestamp>
      <contributor>
        <ip>Piglet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''I originally posted this article in our internal Jailbreak testing forums and moved it on the Wiki at a second thought.  It's generically phrased, so it should apply to almost every project that's in development.''

}}

Instead of listing a set of rules how bug reports should be posted, I'm going to describe '''A Bug's Life''' here.  After all, all rules I could possibly post boil down to a certain understanding of which information is necessary (and why) in order to squish a bug.

==What's a Bug?==

First off, whether something is a bug is a mere matter of definition.  That fragged players get respawned in jail is a distinct feature of Jailbreak, but for common Deathmatch it'd be a bug.  (Yes, that's a bit far-fetched, but you get the idea.)  Generally speaking, '''if a program behaves in a way the developer intended it not to, that's a bug.'''

There are a number of things where you can safely assume that a developer did not intend them to happen:

* '''Crashes.'''
* Things that '''obviously disagree with existing documentation.''' &amp;ndash; That could just as well be an error in the documentation, but that'd be a bug in its own right.
* Things that are '''needlessly inconvenient''' for the user. &amp;ndash; On the other hand, they could also be ''necessarily'' inconvenient for the user, but then that should be made obvious to prevent frustration on the users' part.  Have a look at the [[Legacy:Mychaeel/Modding Etiquette|Modding Etiquette]] about that.

If you find such a thing, post a bug report.  If you find something where you're not sure whether it's a bug or intentional behavior, ask the developer; chances are that it is a bug anyway, and if it's not it should at least be changed to make that clear.

==A Bug's Life Phases==

After this short intro to what a bug is, let's have a look at the bug's life.

# '''A bug is born''' somewhere on the way between the developer's brain and the fingers typing the code.
# * Sometimes a bug's cause is as simple as a typo in the code (when the coder lacks coffee, or sleep, or both, or had too much coffee, or something like that).
# * Sometimes a coder ''thought'' she'd understood a particular piece of code, and how she could get her own code to work with it effectively.  Unfortunately she is subtly mistaken (which could even be due to another bug in that existing code which naturally isn't documented anywhere).
# * Sometimes one part of her own code puts the program in a state some other part of her own code doesn't expect and handle; that's the most annoying and most avoidable kind of bug for a decent programmer.

# Now that the bug has crept into the code, it stays there until '''it is discovered''' by chance by somebody.  More often than not that's in the middle of a complex situation that is impossible to reproduce in every detail, and the next time the program is executed and the situation is slightly different, the bug manages to hide again.

# But the bug's days are numbered since its existence has been given away already.  Of course, just like with real-life bugs, the coder needs to '''see the bug in order to fix it.'''  So the bug hunter tries to recall as much as possible of the situation that caused the bug  to appear the first time and the events preceding it and then successively '''strips it of everything unnecessary.'''  Ideally the bug hunter ends this process with a short and simple list of steps that reliably lead to the bug showing itself.

# Now it's the coder's turn to '''squish the bug.'''  She traces the program's execution from the start until she finds the point where a piece of code doesn't change the program's state as she meant it to.  Then she tries to trace the program's flow ''back'' to the cause of that behavior.  She changes it, and the bug is '''fixed.'''

==Bug Hunters==

You, as bug hunters, are responsible for the '''second and third phase''' in a bug's hopefully short lifespan.

Just discovering the bug by chance is not enough; given that there are more bug hunters than developers working on a project, leaving the third step up to the developers is a big waste of project time.

Imagine a small project with one coder and three testers.  For the sake of the argument, let's assume that the third phase (reproduction) takes one hour per bug, and the fourth phase (fixing) half an hour (which may or may not be way off in either direction depending on the bug).  Let's also assume that every tester discovers a single distinct bug.

* If all testers stop working at the second phase (discovery) and let the developer handle the third and fourth phase (reproduction and fixing), we have:  a single coder working one and a half hours on each of three bugs, resulting in '''four and a half hours of work.'''

* If all testers continue working until the third phase is completed (discovery and reproduction) and then let the developer fix the bug, we have:  three bug hunters working in parallel on three bugs for one hour, then the developer fixing each of the three bugs for half an hour each, resulting in '''two and a half hours of work.'''

Do you notice how the second way to do it actually saves two hours of development time in this example?

==Reporting Bugs==

When you report a bug, include all information that's necessary for the developers to reliably reproduce it.  And just as important:  Leave unnecessary information away.

Things every bug report should contain in some way or another:

* A brief, but descriptive '''bug report subject''' (a thread subject if you post it in a forum, for instance) for your bug report that clearly summarizes the reported bug.  As a rule of thumb, a descriptive subject always '''contains at a verb.'''  The program ''does'' something wrong after all.

* A thorough, but to-the-point '''description of the buggy behavior,''' including a short description of how you ''expect'' the program to behave instead.  Screenshots, logs and the like ''can'' be helpful there.

* A thorough, but to-the-point '''description of how to reproduce the buggy behavior''' which you worked out in the third phase of a bug's life as described above.

* The '''revision of the program''' you're reporting the bug for.

* An up-to-date '''description of your system''' (hardware, operating system version and patch level, drivers, and so on).  You don't have to repeat the same information over and over again, of course, but the developers should always be able to look it up if they need to.  (For example, the developers could ask all testers to submit their system specs at the start of the testing period.)

==Comments==

'''Mychaeel:''' I originally posted that in the internal &quot;Jailbreak Testing&quot; forum, but knowing the Wiki as a great sounding board for articles like this one I decided to move it here and link it from our testing forum instead.  Comments are appreciated.

'''EntropicLqd:''' Nice article.  Is it worth mentioning that the number of bugs in any software system generally decays exponentially?  How about adding a suggested set of minimum information that should be submitted with a bug report (game version, mod version, log files, screen shots if applicable etc).

'''Mychaeel:''' I expressly did not want to give a minimum set of information to post with a bug report in terms of &quot;map name, log, screen shots&quot; and so on.  It only leads people to ticking those points off one by one without thinking about whether they're actually giving the developers helpful information or not.

'''Tarquin:''' That's sort of ... zen :D 

'''Piglet:''' Hmm.  Good and intresting section, however you have seemed to have neglected the 'immediatly obvious' type of bug.  Which are generally more common (at least in the programming that i do).  Not a big complaint, just a minor point.</text>
    </revision>
    <revision>
      <id>1354</id>
      <timestamp>2003-02-24T16:58:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''I originally posted this article in our internal Jailbreak testing forums and moved it on the Wiki at a second thought.  It's generically phrased, so it should apply to almost every project that's in development.''

}}

Instead of listing a set of rules how bug reports should be posted, I'm going to describe '''A Bug's Life''' here.  After all, all rules I could possibly post boil down to a certain understanding of which information is necessary (and why) in order to squish a bug.

==What's a Bug?==

First off, whether something is a bug is a mere matter of definition.  That fragged players get respawned in jail is a distinct feature of Jailbreak, but for common Deathmatch it'd be a bug.  (Yes, that's a bit far-fetched, but you get the idea.)  Generally speaking, '''if a program behaves in a way the developer intended it not to, that's a bug.'''

There are a number of things where you can safely assume that a developer did not intend them to happen:

* '''Crashes.'''
* Things that '''obviously disagree with existing documentation.''' &amp;ndash; That could just as well be an error in the documentation, but that'd be a bug in its own right.
* Things that are '''needlessly inconvenient''' for the user. &amp;ndash; On the other hand, they could also be ''necessarily'' inconvenient for the user, but then that should be made obvious to prevent frustration on the users' part.  Have a look at the [[Legacy:Mychaeel/Modding Etiquette|Modding Etiquette]] about that.

If you find such a thing, post a bug report.  If you find something where you're not sure whether it's a bug or intentional behavior, ask the developer; chances are that it is a bug anyway, and if it's not it should at least be changed to make that clear.

==A Bug's Life Phases==

After this short intro to what a bug is, let's have a look at the bug's life.

# '''A bug is born''' somewhere on the way between the developer's brain and the fingers typing the code.
# * Sometimes a bug's cause is as simple as a typo in the code (when the coder lacks coffee, or sleep, or both, or had too much coffee, or something like that).
# * Sometimes a coder ''thought'' she'd understood a particular piece of code, and how she could get her own code to work with it effectively.  Unfortunately she is subtly mistaken (which could even be due to another bug in that existing code which naturally isn't documented anywhere).
# * Sometimes one part of her own code puts the program in a state some other part of her own code doesn't expect and handle; that's the most annoying and most avoidable kind of bug for a decent programmer.

# Now that the bug has crept into the code, it stays there until '''it is discovered''' by chance by somebody.  More often than not that's in the middle of a complex situation that is impossible to reproduce in every detail, and the next time the program is executed and the situation is slightly different, the bug manages to hide again.

# But the bug's days are numbered since its existence has been given away already.  Of course, just like with real-life bugs, the coder needs to '''see the bug in order to fix it.'''  So the bug hunter tries to recall as much as possible of the situation that caused the bug  to appear the first time and the events preceding it and then successively '''strips it of everything unnecessary.'''  Ideally the bug hunter ends this process with a short and simple list of steps that reliably lead to the bug showing itself.

# Now it's the coder's turn to '''squish the bug.'''  She traces the program's execution from the start until she finds the point where a piece of code doesn't change the program's state as she meant it to.  Then she tries to trace the program's flow ''back'' to the cause of that behavior.  She changes it, and the bug is '''fixed.'''

==Bug Hunters==

You, as bug hunters, are responsible for the '''second and third phase''' in a bug's hopefully short lifespan.

Just discovering the bug by chance is not enough; given that there are more bug hunters than developers working on a project, leaving the third step up to the developers is a big waste of project time.

Imagine a small project with one coder and three testers.  For the sake of the argument, let's assume that the third phase (reproduction) takes one hour per bug, and the fourth phase (fixing) half an hour (which may or may not be way off in either direction depending on the bug).  Let's also assume that every tester discovers a single distinct bug.

* If all testers stop working at the second phase (discovery) and let the developer handle the third and fourth phase (reproduction and fixing), we have:  a single coder working one and a half hours on each of three bugs, resulting in '''four and a half hours of work.'''

* If all testers continue working until the third phase is completed (discovery and reproduction) and then let the developer fix the bug, we have:  three bug hunters working in parallel on three bugs for one hour, then the developer fixing each of the three bugs for half an hour each, resulting in '''two and a half hours of work.'''

Do you notice how the second way to do it actually saves two hours of development time in this example?

==Reporting Bugs==

When you report a bug, include all information that's necessary for the developers to reliably reproduce it.  And just as important:  Leave unnecessary information away.

Things every bug report should contain in some way or another:

* A brief, but descriptive '''bug report subject''' (a thread subject if you post it in a forum, for instance) for your bug report that clearly summarizes the reported bug.  As a rule of thumb, a descriptive subject always '''contains at a verb.'''  The program ''does'' something wrong after all.

* A thorough, but to-the-point '''description of the buggy behavior,''' including a short description of how you ''expect'' the program to behave instead.  Screenshots, logs and the like ''can'' be helpful there.

* A thorough, but to-the-point '''description of how to reproduce the buggy behavior''' which you worked out in the third phase of a bug's life as described above.

* The '''revision of the program''' you're reporting the bug for.

* An up-to-date '''description of your system''' (hardware, operating system version and patch level, drivers, and so on).  You don't have to repeat the same information over and over again, of course, but the developers should always be able to look it up if they need to.  (For example, the developers could ask all testers to submit their system specs at the start of the testing period.)

==Comments==

'''Mychaeel:''' I originally posted that in the internal &quot;Jailbreak Testing&quot; forum, but knowing the Wiki as a great sounding board for articles like this one I decided to move it here and link it from our testing forum instead.  Comments are appreciated.

'''EntropicLqd:''' Nice article.  Is it worth mentioning that the number of bugs in any software system generally decays exponentially?  How about adding a suggested set of minimum information that should be submitted with a bug report (game version, mod version, log files, screen shots if applicable etc).

'''Mychaeel:''' I expressly did not want to give a minimum set of information to post with a bug report in terms of &quot;map name, log, screen shots&quot; and so on.  It only leads people to ticking those points off one by one without thinking about whether they're actually giving the developers helpful information or not.

'''Tarquin:''' That's sort of ... zen :D 

'''Piglet:''' Hmm.  Good and intresting section, however you have seemed to have neglected the 'immediatly obvious' type of bug.  Which are generally more common (at least in the programming that i do).  Not a big complaint, just a minor point.

'''Mychaeel:''' Hmm.  The really obvious things should actually never get into testing; and I would rather not tempt testers to skip bug research by simply claiming that it's &quot;obvious.&quot;  My stance is that, if a bug was obvious, it wouldn't be there for others to find in the first place.  I assume that programmers do a minimum amount of testing themselves before releasing a piece of software to anyone.</text>
    </revision>
    <revision>
      <id>44210</id>
      <timestamp>2010-12-28T16:37:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* A Bug's Life Phases */ formating</comment>
      <text xml:space="preserve">{{innerbox| ''I originally posted this article in our internal Jailbreak testing forums and moved it on the Wiki at a second thought.  It's generically phrased, so it should apply to almost every project that's in development.''

 ''For another and rather entertaining look on the same subject, have a look at [http://www.joelonsoftware.com/articles/fog0000000029.html Painless Bug Tracking] by Joel Spolsky.  One of the most important things Joel has to teach to us techies is that you have to make documents ''fun to read'' to get people to actually read them.''

}}

Instead of listing a set of rules how bug reports should be posted, I'm going to describe '''A Bug's Life''' here.  After all, all rules I could possibly post boil down to a certain understanding of which information is necessary (and why) in order to squish a bug.

==What's a Bug?==

First off, whether something is a bug is a mere matter of definition.  That fragged players get respawned in jail is a distinct feature of Jailbreak, but for common Deathmatch it'd be a bug.  (Yes, that's a bit far-fetched, but you get the idea.)  Generally speaking, '''if a program behaves in a way the developer intended it not to, that's a bug.'''

There are a number of things where you can safely assume that a developer did not intend them to happen:

* '''Crashes.'''
* Things that '''obviously disagree with existing documentation.''' &amp;ndash; That could just as well be an error in the documentation, but that'd be a bug in its own right.
* Things that are '''needlessly inconvenient''' for the user. &amp;ndash; On the other hand, they could also be ''necessarily'' inconvenient for the user, but then that should be made obvious to prevent frustration on the users' part.  Have a look at the [[Legacy:Mychaeel/Modding Etiquette|Modding Etiquette]] about that.

If you find such a thing, post a bug report.  If you find something where you're not sure whether it's a bug or intentional behavior, ask the developer; chances are that it is a bug anyway, and if it's not it should at least be changed to make that clear.

==A Bug's Life Phases==

After this short intro to what a bug is, let's have a look at the bug's life.

# '''A bug is born''' somewhere on the way between the developer's brain and the fingers typing the code.
#* Sometimes a bug's cause is as simple as a typo in the code (when the coder lacks coffee, or sleep, or both, or had too much coffee, or something like that).
#* Sometimes a coder ''thought'' she'd understood a particular piece of code, and how she could get her own code to work with it effectively.  Unfortunately she is subtly mistaken (which could even be due to another bug in that existing code which naturally isn't documented anywhere).
#* Sometimes one part of her own code puts the program in a state some other part of her own code doesn't expect and handle; that's the most annoying and most avoidable kind of bug for a decent programmer.
# Now that the bug has crept into the code, it stays there until '''it is discovered''' by chance by somebody.  More often than not that's in the middle of a complex situation that is impossible to reproduce in every detail, and the next time the program is executed and the situation is slightly different, the bug manages to hide again.
# But the bug's days are numbered since its existence has been given away already.  Of course, just like with real-life bugs, the coder needs to '''see the bug in order to fix it.'''  So the bug hunter tries to recall as much as possible of the situation that caused the bug  to appear the first time and the events preceding it and then successively '''strips it of everything unnecessary.'''  Ideally the bug hunter ends this process with a short and simple list of steps that reliably lead to the bug showing itself.
# Now it's the coder's turn to '''squish the bug.'''  She traces the program's execution from the start until she finds the point where a piece of code doesn't change the program's state as she meant it to.  Then she tries to trace the program's flow ''back'' to the cause of that behavior.  She changes it, and the bug is '''fixed.'''

==Bug Hunters==

You, as bug hunters, are responsible for the '''second and third phase''' in a bug's hopefully short lifespan.

Just discovering the bug by chance is not enough; given that there are more bug hunters than developers working on a project, leaving the third step up to the developers is a big waste of project time.

Imagine a small project with one coder and three testers.  For the sake of the argument, let's assume that the third phase (reproduction) takes one hour per bug, and the fourth phase (fixing) half an hour (which may or may not be way off in either direction depending on the bug).  Let's also assume that every tester discovers a single distinct bug.

* If all testers stop working at the second phase (discovery) and let the developer handle the third and fourth phase (reproduction and fixing), we have:  a single coder working one and a half hours on each of three bugs, resulting in '''four and a half hours of work.'''

* If all testers continue working until the third phase is completed (discovery and reproduction) and then let the developer fix the bug, we have:  three bug hunters working in parallel on three bugs for one hour, then the developer fixing each of the three bugs for half an hour each, resulting in '''two and a half hours of work.'''

Do you notice how the second way to do it actually saves two hours of development time in this example?

==Reporting Bugs==

When you report a bug, include all information that's necessary for the developers to reliably reproduce it.  And just as important:  Leave unnecessary information away.

Things every bug report should contain in some way or another:

* A brief, but descriptive '''bug report subject''' (a thread subject if you post it in a forum, for instance) for your bug report that clearly summarizes the reported bug.  As a rule of thumb, a descriptive subject always '''contains at a verb.'''  The program ''does'' something wrong after all.

* A thorough, but to-the-point '''description of the buggy behavior,''' including a short description of how you ''expect'' the program to behave instead.  Screenshots, logs and the like ''can'' be helpful there.

* A thorough, but to-the-point '''description of how to reproduce the buggy behavior''' which you worked out in the third phase of a bug's life as described above.

* The '''revision of the program''' you're reporting the bug for.

* An up-to-date '''description of your system''' (hardware, operating system version and patch level, drivers, and so on).  You don't have to repeat the same information over and over again, of course, but the developers should always be able to look it up if they need to.  (For example, the developers could ask all testers to submit their system specs at the start of the testing period.)

==Comments==

'''Mychaeel:''' I originally posted that in the internal &quot;Jailbreak Testing&quot; forum, but knowing the Wiki as a great sounding board for articles like this one I decided to move it here and link it from our testing forum instead.  Comments are appreciated.

'''EntropicLqd:''' Nice article.  Is it worth mentioning that the number of bugs in any software system generally decays exponentially?  How about adding a suggested set of minimum information that should be submitted with a bug report (game version, mod version, log files, screen shots if applicable etc).

'''Mychaeel:''' I expressly did not want to give a minimum set of information to post with a bug report in terms of &quot;map name, log, screen shots&quot; and so on.  It only leads people to ticking those points off one by one without thinking about whether they're actually giving the developers helpful information or not.

'''Tarquin:''' That's sort of ... zen :D 

'''Piglet:''' Hmm.  Good and intresting section, however you have seemed to have neglected the 'immediatly obvious' type of bug.  Which are generally more common (at least in the programming that i do).  Not a big complaint, just a minor point.

'''Mychaeel:''' Hmm.  The really obvious things should actually never get into testing; and I would rather not tempt testers to skip bug research by simply claiming that it's &quot;obvious.&quot;  My stance is that, if a bug was obvious, it wouldn't be there for others to find in the first place.  I assume that programmers do a minimum amount of testing themselves before releasing a piece of software to anyone.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:A UT2004 Monster Tutorial</title>
    <id>503</id>
    <revision>
      <id>1588</id>
      <timestamp>2006-09-22T17:17:18Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''This page is under contruction.'''''

This tutorial is meant to demonstrate the basics needed to implement [[Legacy:Monster|Monster]] class characters within a UT2004 environment.  The Monster is a specific class introduced in UT2004 for the [[Legacy:Invasion|Invasion]] gametype.  For a tutorial on using UT Monsters, a subclass of [[Legacy:ScriptedPawn|ScriptedPawn]], see [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]].  

==Prerequisites==

This tutorial assumes you know how to [[Legacy:Create A Subclass|Create A Subclass]].

==Overview==

By default, Monsters in UT2004 use a [[Legacy:MonsterController|MonsterController]] that implements a complex set of behaviors to hunt down and attack players.  This is specifically designed for the Invasion gametype, where Monsters are spawned at random [[Legacy:NavigationPoint|NavigationPoint]]s around the map and attack the players in increasingly aggressive waves.

However, for other gametypes this default behavior may not be desirable to the mapper.  As an example, placing UT2004 Monsters in a map designed for a TeamGame will result in a team imbalance, where the UnrealPawn PostNetBeginPlay() function attempts (and eventually fails) to place the Monster in an xTeamRoster. ''(RedTeam's Size is incremented although there's no valid player added and extra BlueTeam memebers are the result)''

In cases where the mapper would like to get Monster class creatures to perform more complex tasks, such as Patrolling, Defending, Ambushing, just as UT was able to do, extra steps are needed.

==ScriptedSequence==

The [[Legacy:ScriptedSequence|ScriptedSequence]] is a subclass of AIScript designed to control pawns.  This takes the place of the AI portion of UT's ScriptedPawn, which is not available in UT200x.  With the ScriptedSequence, mappers can define a script using predefined [[Legacy:ScriptedAction|ScriptedAction]]s.  The ScriptedSequence is designed to work in conjunction with an associated Pawn; one who's AI -&gt; AIScriptTag matches the ScriptedSequence's Tag.

For example, one of the most useful ACTIONs is ACTION_SpawnActor.  But, if no Pawn is associated to the ScriptedSequence, the script will be removed from the level at map start.  If the mapper would like to spawn a Monster out of thin air, a special Pawn will have to be used.

==The Dummy Pawn==

The Dummy Pawn is a simple custom [[Legacy:Pawn|Pawn]] subclass that will act as the servant to our ScriptedSequence.  Subclass Pawn and define the following default properties:

; (Advanced) bool bHidden : true
; (Advanced) bool bNoDelete : true
; (Collision) bool bUseCylinderCollision : false
; (Display) EDrawType DrawType : DT_Sprite
; (Display) Texture Texture : Texture'Engine.S_Pawn'
; (Movement) EPhysics Physics : PHYS_None

For each ScriptedSequence that does not already have an associated Pawn (Monster), a Dummy can be used instead.  This will allow full use of ACTIONs, like ACTION_SpawnActor to create a kind of &quot;MonsterFactory&quot;.

==Useful Stock ACTIONs==

The following stock ScriptedActions are available to use in conjunction with Monsters.  This is just a basic list of useful ACTIONs to implement Monsters.  For a full list of ACTIONs, see also [[Legacy:ScriptedAction|ScriptedAction]].

===ACTION_SpawnActor===

As long as a Pawn is already associated with this ScriptedSequence, this will spawn the provided Actor class and give it the provided Tag.  A &quot;MonsterFactory&quot; is easily made with this action, but it should be noted that the Monster will automatically spawn it's own MonsterController, making it attack any player it finds.

===ACTION_MoveToPoint===

This is a latent ACTION that gives the Pawn a destination defined as a [[Legacy:NavigationPoint|NavigationPoint]] with a particular Tag that matches the provided name.  The Monster will animate, make sounds, navigate and move appropriately without any further ACTIONs.

===ACTION_PlayAnim===

This will play the provided animation sequence (if it exists for this character mesh) and allows options for timing, looping, etc.

===ACTION_PlaySound===

This will play the provided sound and allows options for pitch, volume, etc.

===ACTION_IfCondition===

This conditional is true if the associated [[Legacy:TriggeredCondition|TriggeredCondition]] actor is true.  TriggeredCondition are a subclass of Trigger and can be activated or toggled on and off by another Trigger.  TriggeredConditions act as a flag, a byte of memory that can store information about the map's current condition.  Some examples are: Is a door open?  Is an area occupied by a player?  Has a flag been taken?

===ACTION_IfRandomPct===

This conditional is true if the random number generated, between 1 and 100, is greater than the provided threadhold.  This is good to keep variety.

===ACTION_EndSection===

This is necessary to define the end of a conditional block of ACTIONs.

===ACTION_GotoAction===

This will send focus to another part of the script.

===ACTION_TriggerEvent===

This will trigger the provided Event and trigger those Actors with a matching Tag.

===ACTION_WaitForEvent===

This latent ACTION will pause the script's focus until the provided Event is triggered.

===ACTION_WaitForTimer===

This latent ACTION will pause the script's focus for the provided number of seconds.

===ACTION_DestroyActor===

This will delete the Actor(s) with a Tag that matches the provided name.

===ACTION_ChangeScript===

This will transfer control of the associate Pawn to the ScriptedSequence with a matching Tag.

==Custom ACTIONs==

Many of the stock ACTIONs are left over from UT and were never meant to effect the Monster's MonsterController.  To perform complex behavior like Patrolling, we'll need some custom SciptedActions to take control of the Monster, give up control and detemine various aspects of this relatively new object class.  For more on custom ScriptedActions, see also [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]].

===ACTION_SpawnMonster===

This will spawn the provided Monster class and automatically Possess it, unless otherwise configured.  Other options include setting Tag for the Monster and it's MonsterController, if needed.  This particular ScriptedAction is very useful in implementing Monsters in TeamGame maps.  By spawning them after match start, as opposed to explicitly placing them in a map, you avoid the team imbalance problem described in the Overview above.

&lt;uscript&gt;
//=============================================================================
// ACTION_SpawnMonster.
// Spawn a Monster class and Possess unless bMonsterizeAtStart is true.
// by SuperApe	-- Dec 2005
//=============================================================================
class ACTION_SpawnMonster extends ScriptedAction;

var()	class&lt;Monster&gt;		MonsterClass;
var()	name				MonsterTag;
var()	bool				bMonsterizeAtStart;
var()	name				MonsterControllerTag;

function bool InitActionFor( ScriptedController C )
{
	local	Monster				M;
	local	MonsterController	MC;

	M = C.spawn( MonsterClass, C, MonsterTag, C.Location, C.Rotation );
	C.Pawn = M;

	if ( bMonsterizeAtStart )
		M.Controller.Tag = MonsterControllerTag;
	else
	{
		M.Controller.Unpossess();
		C.Possess( M );
		M.Controller = C;
		M.AIScriptTag = C.Tag;
	}

	return false;
}
&lt;/uscript&gt;

===ACTION_Monsterize===

This spawns a MonsterController for the Monster Pawn and has the MonsterController Possess it.  This is what gets the Monsters to begin to attack any player they see.

&lt;uscript&gt;
//=============================================================================
// ACTION_Monsterize.
// Spawn a MonsterController for this Pawn and have it possess the Pawn.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_Monsterize extends ScriptedAction;

var()	name	MonsterControllerTag;

function bool InitActionFor( ScriptedController C )
{
	local	MonsterController 	MC;

	MC = C.spawn( class'MonsterController', None );
	MC.Tag = MonsterControllerTag;
	MC.Possess( C.Pawn );

	return false;
}
&lt;/uscript&gt;

===ACTION_PossessPawn===

This Possesses the Monster Pawn matching the provided Tag, making it the currently associated Pawn.  This will also destroy the previous Controller if it is a MonsterController.  This is what stops the Monsters from attacking at will and puts them under the control of this ScriptedSequence.  

&lt;uscript&gt;
//=============================================================================
// ACTION_PossessPawn.
// Possess the Pawn with the PawnTag.  Destroy any previous MonsterController.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_PossessPawn extends ScriptedAction;

var()	name	PawnTag;
var		bool	bPawnExists;

function bool InitActionFor( ScriptedController C )
{
	local	Pawn 			P;
	local	MonsterController	MC;

	bPawnExists = false;
	forEach C.DynamicActors( class'Pawn', P, PawnTag )
	{
		bPawnExists = true;
		if ( P.Controller.IsA('MonsterController') )
			MC = MonsterController( P.Controller );	
		P.Controller.Unpossess();

		if ( P.Health &gt; 0 )
		{
			C.Possess( P );
			P.Controller = C;
			P.AIScriptTag = C.Tag;
		}
		else
			P.AIScriptTag = '';

		if ( MC != None )
			MC.Destroy();
	}
	if ( !bPawnExists )
		Warn(&quot;No Pawn with tag &quot;$PawnTag$&quot; exists!&quot;);

	return false;
}
&lt;/uscript&gt;

===ACTION_IfMonsterHasEnemy===

This conditional is true if the Monster Pawn's Controller.Enemy property is occupied.  Useful for situations where you want to know if it's a good time to ACTION_PossessPawn, otherwise you may want to keep it &quot;Monsterized&quot; and wait until the Enemy is gone.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterHasEnemy.
// Conditional on Pawn.Controller.Enemy != None
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterHasEnemy extends ScriptedAction;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( C.Pawn.Controller.Enemy == None )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_IfMonsterSeesEnemy===

This conditional is true based on the property MonsterController.bEnemyIsVisible.  Useful in the same way that ACTION_IfMonsterHasEnemy is, but this will only be true if the Enemy is visible.  So an Enemy that's ducked out of sight will cause this conditional to be false.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterSeesEnemy.
// Conditional on MonsterController.bEnemyIsVisible
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterSeesEnemy extends ScriptedAction;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') || MonsterController( C.Pawn.Controller ) == None )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( !MonsterController(C.Pawn.Controller).bEnemyIsVisible )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_IfMonsterIsHurt===

This conditional is true if the Pawn's Health is less than the provided HealthThreshold.  This works whether the Monster is currently Monsterized or not.  It's useful to determine if the ScriptedSequence should take control of a hurt Monster to move it to a safer place, etc.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterIsHurt.
// Conditional on Pawn.Health &lt; HealthThreshold
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterIsHurt extends ScriptedAction;

var()	int		HealthThreshold;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( C.Pawn.Health &gt; HealthThreshold )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_HealPawn===

This gives the Pawn Health, up to it's MaxHealth, based on the provided HealAmount.  Ironically, ACTION_HealActor doesn't work with Pawns.  This is useful in situations where you'd like to keep the Monster around a bit longer.  In conjunction with ACTION_IfMonsterIsHurt, this can be used to provide a kind of &quot;Healing Station&quot; for the Monster, giving it a sophisticated combat tactic: Retreat to ''Live and fight another day''.

&lt;uscript&gt;
//=============================================================================
// ACTION_HealPawn.
// Calls Pawn.GiveHealth( HealAmount, HealthMax ).  Does what HealActor can't.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_HealPawn extends ScriptedAction;

var()	int		HealAmount;

function bool InitActionFor( ScriptedController C )
{
	C.Pawn.GiveHealth( HealAmount, int( C.Pawn.HealthMax ) );

	return false;
}
&lt;/uscript&gt;

==Further Development==

The possibilities are endless.  Some useful ACTIONs to make include setting specific Properties or switching to behavior States.  Other custom ACTIONs should be appended here to this section.

===ACTION_myCustomAction===

==Monster Tutorial==

Now that we have the ScriptedActions available to affect Monsters, we can begin to construct a complex Monster behavior patrolling to guard an item in a map.  We will start with a MonsterFactory.  We will give our Monsters a path to follow while on patrol.  We will keep track of the item so the Monsters know when it's been taken.  We will also give our Monsters a safe &quot;homebase&quot; where they can heal themselves when they're hurt.

We will use a variety of actors to make this behavior happen.  We could do it with one Dummy Pawn and one ScriptedSequence, however the ScriptedSequence script would be &lt;u&gt;very&lt;/u&gt; long and complex.  It's very easy to make a mistake in a script that long, so we will break it up into manageable chunks and spread the script around to several ScriptedSequences.

===MonsterFactory===

A MonsterFactory starts with a Dummy Pawn and a ScriptedSequence.  The Dummy -&gt; AIScript -&gt; AIScriptTag will match the ScriptedSequence -&gt; Tag.  We will place the Dummy at the spot we would like our Monsters to spawn.  We will keep the ScriptedSequence close by, just for organization.

This MonsterFactory script will consist of the following ScriptedActions:
; [0] ACTION_TriggerEvent : An emitter actor will be set up here to give some simple effects for our spawning Monster.  We will match it's Tag, &quot;MonsterSpawnFX&quot;, to this ACTION's arguement.
; [1] ACTION_PlaySound : A sound effect will also be played at this point so both a visual and audial queue will signal to any close player that a Monster is about to be spawned.
; [2] ACTION_SpawnMonster : We will spawn a [[Legacy:Krall|Krall]] and give it the MonsterTag, &quot;KrallPatrol&quot;.  We will keep it's control on this script rather than Monsterizing it at start.
; [3] ACTION_MoveToPoint : A nearby PathNode with a Tag set to, &quot;MonsterStart&quot;, will be designated as the first spot our Monsters will move.  This will simply get them out of the way of other Monsters.
; [4] ACTION_TriggerEvent : This action will signal the next ScriptedSequence that a Monster has been spawned and moved to the MonsterStart spot.  This signal, Event &quot;MonsterToPatrol&quot;, will start transferring control of the Monster to the next script.
; [5] ACTION_WaitForEvent : At this point, our MonsterFactory has done its job.  We will have it wait here for a signal to continue.  Our signal will be the Event, &quot;MonsterSpawn&quot;.
; [6] ACTION_GotoAction : Once the signal is given, we will goto the Action 0 to start this script again and spawn a new Monster.

===Patrolling===

Here another ScriptedSequence will take over control of the Monsters from our MonsterFactory.  A series of PathNodes will have Tags that we will use to define the Patrol points for our Monsters.  Each Patrol point will have a corresponding ScriptedSequence.  Our Patrolling scripts will perform checks to make sure our Monsters are Monsterized to attack visible enemies.  At various points, we will also give the Monsters the opportunity to keep track of the item they are guarding and go to a safe healing place if they need it.

The Patrolling script will have the following ScriptedActions:
; [0] ACTION_WaitForEvent : This script waits for the Event, &quot;MonsterToPatrol&quot;, as a signal to take control of the Monster.
; [1] ACTION_PossessPawn : This will take control of the Monster Pawn with the Tag, &quot;KrallPatrol&quot;.
; [2] ACTION_MoveToPoint : We will send this Monster to the first Patrol point, a PathNode with a Tag, &quot;Patrol1&quot;.
; [3] ACTION_Monsterize : We will give the Monster the opportunity to attack any player it sees.  The MonsterControllerTag will be, &quot;KrallMonster&quot;.
; [4] ACTION_WaitForTimer : We will have the Monster wait 5 seconds while Monsterized.
; [5] ACTION_IfMonsterSeesEnemy : This conditional gives the Monster a chance to tell us if they see an Enemy while at this Patrol point.
; [6] ACTION_GotoAction : Send the script to Action 4, to continue the attack for another 5 seconds.
; [7] ACTION_EndSection : This ends the conditional block for IfMonsterSeesEnemy.
; [8] ACTION_TriggerEvent : This will signal to the next Patrol script to take control of this Monster and move it to the next Patrol point.  The Event to trigger will be, &quot;Patrol2&quot;.
; [9] ACTION_GotoAction : This script has done its job and should return to the original state, at Action 0, waiting for the next Monster to take control of.

Now the next Patrol script and Patrol point will take over.  They will look exactly like this one with the exception of some of the Tags.  The script will be waiting for Event, &quot;Patrol2&quot;.  The Patrol point PathNode and ACTION_MoveToPoint will have the tag, &quot;Patrol2&quot;.  When the script has finished checking to see IfMonsterSeesEnemy, it will trigger the next Patrol script using Event, &quot;Patrol3&quot;.

This series of Patrol points and scripts will loop around the Patrol path back to the first point, where the last Patrol script will be triggering, &quot;MonsterToPatrol&quot;, to signal the first Patrol script to take over again.

===Guarding An Item===

In our case, we will have the Monsters guard a BombingRun [[Legacy:XBombFlag|xBombFlag]] at the [[Legacy:XBombSpawn|xBombSpawn]] point.  This will force players to get through the Monster patrol to get the BombFlag in order to score.

===Healing===

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=37962 UnrealPlayground Forum topic, Monster Experiments] &amp;ndash; Implementation of Monsters via custom ScriptedActions.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, NPCs, etc.)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for all Monster Support topics.
* [[Legacy:Monster|Monster]] &amp;ndash; The UT2004 parent class of all Monsters.
* [[Legacy:MonsterController|MonsterController]] &amp;ndash; The Controller class for Monsters.
* [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; The UT parent class for all Monsters and NPCs.
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]]
* [[Legacy:Trigger Systems|Trigger Systems]]

===Custom Content===
* [[Legacy:SuperApe/Old_Skool_Monsta_Toolz|Old Skool Monsta Toolz]] &amp;ndash; A mod/mapping toolset for implementing monsters and complex monster AI in any gametype for UT2004.

==Discussion==

'''SuperApe:''' Created.  Working...

'''SuperApe:''' These are okay.  It's beginning to work.  There are a few key issues that need to be addressed:
# With these Actions, you can have the Monster attack &lt;u&gt;or&lt;/u&gt; be controlled by the ScriptedSequence, not both.  So, setting something akin to Alertness level is difficult.
# Technically, the MonsterController &lt;u&gt;will&lt;/u&gt; &quot;teleport&quot; a Monster to a PlayerStart after several seconds if it hasn't encountered a player.  Perhaps another controller should be used anyway. (like a subclass that at least removes that method)
# A daisy chain of ScriptedSequences should work, but I've been having problems.  (I haven't figured out why, but it intermitently &quot;misses&quot; the Trigger for the next script.)

So, I'm beginning to think re-creating the [[Legacy:HomeBase|HomeBase]], [[Legacy:AmbushPoint|AmbushPoint]], [[Legacy:AlarmPoint|AlarmPoint]] and [[Legacy:PatrolPoint|PatrolPoint]] might be helpful in conjunction with a modified [[Legacy:MonsterController|MonsterController]].

'''Moofed:''' Any progress on this?  I'll be learning monster scripting (very) soon and this page looks useful.. until your comment about it not working.

'''SuperApe:''' Your timing is impecable. :)  I'm working on this now.  It's not that it ''doesn't'' work, it's that there are serious limitations without further development, as I mention above.  At the moment, I'm right on the edge of either continuing to use custom ScriptedActions (and making a lot more of them) or creating a custom MonsterController that will include much of the functionality needed.  It's a bit of a mess to have both.  I will be updating this soon.

'''Moofed:''' ... What I will be learning monster scripting for (is) civilian pedestrians and vehicles ... to recreate the GTA2 feel.

'''SuperApe:''' So, you're thinking more along the lines of an NPC?  This could be done with ScriptedSequences, I suppose.  I might be a little too much to do, or a little too simple an NPC.  This page is specifically talking about the problems using Monsters with ScriptedSequences, so it's not gonna be directly applicable to what you want to do.  Monsters are defined as a specific kind of NPC whose sole purpose is to hunt down and kill players.  Civilians and pedestrians would be more along the lines of a general NPC.  See [[Legacy:NPC Support|NPC Support]] and describe for us what you'd like them to do.  Perhaps we can offer suggestions. :)

'''Moofed:''' It seemed relevant to what I want, but you're probably right.  A custom controller would be better.  I'm making a personal page now to descibe my ideas for this.

'''SuperApe:''' Great.  Be glad to help. :)

----

'''SuperApe:''' This page will be updated soon, but while I like being able to use (mostly) stock objects to implement UT2004 Monsters, there's some drastic limitations.  It's no where near as cool as original ScriptedPawn Monsters used to be in UT.  While I may keep this tutorial the same, I am beginning to recreate the older actors and code for the ScriptedPawn AI, with all their functionality.  This will eventually include all the NavPoints, a new Monster parent class that mimics some ScriptedPawn functionality, as many individual Monsters as UT2004 has (with all their original functionality) and a new ScriptedMonsterController which will handle the bulk of what ScriptedPawn used to.  I suppose that qualifies as a different project, a different page, but it related directly to and evolved from these experiments.  In the meantime, I will try to finish up this tutorial as best I can using the custom work already described above.

'''SuperApe:''' This line of thinking has led to a new project, [http://forums.unrealplayground.com/showthread.php?t=39783 Old Skool Monsta Toolz], implementing UT-style monsters in UT2004.  EDIT: It has been publicly released.

'''SuperApe:''' The current wiki page for the OSMT project is here: [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]].

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; SuperApe is working on a tutorial. (This actually needs to be refactored, redone)
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1589</id>
      <timestamp>2006-01-30T02:28:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''This page is under contruction.'''''

This tutorial is meant to demonstrate the basics needed to implement [[Legacy:Monster|Monster]] class characters within a UT2004 environment.  The Monster is a specific class introduced in UT2004 for the [[Legacy:Invasion|Invasion]] gametype.  For a tutorial on using UT Monsters, a subclass of [[Legacy:ScriptedPawn|ScriptedPawn]], see [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]].  

==Prerequisites==

This tutorial assumes you know how to [[Legacy:Create A Subclass|Create A Subclass]].

==Overview==

By default, Monsters in UT2004 use a [[Legacy:MonsterController|MonsterController]] that implements a complex set of behaviors to hunt down and attack players.  This is specifically designed for the Invasion gametype, where Monsters are spawned at random [[Legacy:NavigationPoint|NavigationPoint]]s around the map and attack the players in increasingly aggressive waves.

However, for other gametypes this default behavior may not be desirable to the mapper.  As an example, placing UT2004 Monsters in a map designed for a TeamGame will result in a team imbalance, where the UnrealPawn PostNetBeginPlay() function attempts (and eventually fails) to place the Monster in an xTeamRoster. ''(RedTeam's Size is incremented although there's no valid player added and extra BlueTeam memebers are the result)''

In cases where the mapper would like to get Monster class creatures to perform more complex tasks, such as Patrolling, Defending, Ambushing, just as UT was able to do, extra steps are needed.

==ScriptedSequence==

The [[Legacy:ScriptedSequence|ScriptedSequence]] is a subclass of AIScript designed to control pawns.  This takes the place of the AI portion of UT's ScriptedPawn, which is not available in UT200x.  With the ScriptedSequence, mappers can define a script using predefined [[Legacy:ScriptedAction|ScriptedAction]]s.  The ScriptedSequence is designed to work in conjunction with an associated Pawn; one who's AI -&gt; AIScriptTag matches the ScriptedSequence's Tag.

For example, one of the most useful ACTIONs is ACTION_SpawnActor.  But, if no Pawn is associated to the ScriptedSequence, the script will be removed from the level at map start.  If the mapper would like to spawn a Monster out of thin air, a special Pawn will have to be used.

==The Dummy Pawn==

The Dummy Pawn is a simple custom [[Legacy:Pawn|Pawn]] subclass that will act as the servant to our ScriptedSequence.  Subclass Pawn and define the following default properties:

; (Advanced) bool bHidden : true
; (Advanced) bool bNoDelete : true
; (Collision) bool bUseCylinderCollision : false
; (Display) EDrawType DrawType : DT_Sprite
; (Display) Texture Texture : Texture'Engine.S_Pawn'
; (Movement) EPhysics Physics : PHYS_None

For each ScriptedSequence that does not already have an associated Pawn (Monster), a Dummy can be used instead.  This will allow full use of ACTIONs, like ACTION_SpawnActor to create a kind of &quot;MonsterFactory&quot;.

==Useful Stock ACTIONs==

The following stock ScriptedActions are available to use in conjunction with Monsters.  This is just a basic list of useful ACTIONs to implement Monsters.  For a full list of ACTIONs, see also [[Legacy:ScriptedAction|ScriptedAction]].

===ACTION_SpawnActor===

As long as a Pawn is already associated with this ScriptedSequence, this will spawn the provided Actor class and give it the provided Tag.  A &quot;MonsterFactory&quot; is easily made with this action, but it should be noted that the Monster will automatically spawn it's own MonsterController, making it attack any player it finds.

===ACTION_MoveToPoint===

This is a latent ACTION that gives the Pawn a destination defined as a [[Legacy:NavigationPoint|NavigationPoint]] with a particular Tag that matches the provided name.  The Monster will animate, make sounds, navigate and move appropriately without any further ACTIONs.

===ACTION_PlayAnim===

This will play the provided animation sequence (if it exists for this character mesh) and allows options for timing, looping, etc.

===ACTION_PlaySound===

This will play the provided sound and allows options for pitch, volume, etc.

===ACTION_IfCondition===

This conditional is true if the associated [[Legacy:TriggeredCondition|TriggeredCondition]] actor is true.  TriggeredCondition are a subclass of Trigger and can be activated or toggled on and off by another Trigger.  TriggeredConditions act as a flag, a byte of memory that can store information about the map's current condition.  Some examples are: Is a door open?  Is an area occupied by a player?  Has a flag been taken?

===ACTION_IfRandomPct===

This conditional is true if the random number generated, between 1 and 100, is greater than the provided threadhold.  This is good to keep variety.

===ACTION_EndSection===

This is necessary to define the end of a conditional block of ACTIONs.

===ACTION_GotoAction===

This will send focus to another part of the script.

===ACTION_TriggerEvent===

This will trigger the provided Event and trigger those Actors with a matching Tag.

===ACTION_WaitForEvent===

This latent ACTION will pause the script's focus until the provided Event is triggered.

===ACTION_WaitForTimer===

This latent ACTION will pause the script's focus for the provided number of seconds.

===ACTION_DestroyActor===

This will delete the Actor(s) with a Tag that matches the provided name.

===ACTION_ChangeScript===

This will transfer control of the associate Pawn to the ScriptedSequence with a matching Tag.

==Custom ACTIONs==

Many of the stock ACTIONs are left over from UT and were never meant to effect the Monster's MonsterController.  To perform complex behavior like Patrolling, we'll need some custom SciptedActions to take control of the Monster, give up control and detemine various aspects of this relatively new object class.  For more on custom ScriptedActions, see also [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]].

===ACTION_SpawnMonster===

This will spawn the provided Monster class and automatically Possess it, unless otherwise configured.  Other options include setting Tag for the Monster and it's MonsterController, if needed.  This particular ScriptedAction is very useful in implementing Monsters in TeamGame maps.  By spawning them after match start, as opposed to explicitly placing them in a map, you avoid the team imbalance problem described in the Overview above.

&lt;uscript&gt;
//=============================================================================
// ACTION_SpawnMonster.
// Spawn a Monster class and Possess unless bMonsterizeAtStart is true.
// by SuperApe	-- Dec 2005
//=============================================================================
class ACTION_SpawnMonster extends ScriptedAction;

var()	class&lt;Monster&gt;		MonsterClass;
var()	name				MonsterTag;
var()	bool				bMonsterizeAtStart;
var()	name				MonsterControllerTag;

function bool InitActionFor( ScriptedController C )
{
	local	Monster				M;
	local	MonsterController	MC;

	M = C.spawn( MonsterClass, C, MonsterTag, C.Location, C.Rotation );
	C.Pawn = M;

	if ( bMonsterizeAtStart )
		M.Controller.Tag = MonsterControllerTag;
	else
	{
		M.Controller.Unpossess();
		C.Possess( M );
		M.Controller = C;
		M.AIScriptTag = C.Tag;
	}

	return false;
}
&lt;/uscript&gt;

===ACTION_Monsterize===

This spawns a MonsterController for the Monster Pawn and has the MonsterController Possess it.  This is what gets the Monsters to begin to attack any player they see.

&lt;uscript&gt;
//=============================================================================
// ACTION_Monsterize.
// Spawn a MonsterController for this Pawn and have it possess the Pawn.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_Monsterize extends ScriptedAction;

var()	name	MonsterControllerTag;

function bool InitActionFor( ScriptedController C )
{
	local	MonsterController 	MC;

	MC = C.spawn( class'MonsterController', None );
	MC.Tag = MonsterControllerTag;
	MC.Possess( C.Pawn );

	return false;
}
&lt;/uscript&gt;

===ACTION_PossessPawn===

This Possesses the Monster Pawn matching the provided Tag, making it the currently associated Pawn.  This will also destroy the previous Controller if it is a MonsterController.  This is what stops the Monsters from attacking at will and puts them under the control of this ScriptedSequence.  

&lt;uscript&gt;
//=============================================================================
// ACTION_PossessPawn.
// Possess the Pawn with the PawnTag.  Destroy any previous MonsterController.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_PossessPawn extends ScriptedAction;

var()	name	PawnTag;
var		bool	bPawnExists;

function bool InitActionFor( ScriptedController C )
{
	local	Pawn 			P;
	local	MonsterController	MC;

	bPawnExists = false;
	forEach C.DynamicActors( class'Pawn', P, PawnTag )
	{
		bPawnExists = true;
		if ( P.Controller.IsA('MonsterController') )
			MC = P.Controller;	
		P.Controller.Unpossess();

		if ( P.Health &gt; 0 )
		{
			C.Possess( P );
			P.Controller = C;
			P.AIScriptTag = C.Tag;
		}
		else
			P.AIScriptTag = '';

		if ( MC != None )
			MC.Destroy();
	}
	if ( !bPawnExists )
		Warn(&quot;No Pawn with tag &quot;$PawnTag$&quot; exists!&quot;);

	return false;
}
&lt;/uscript&gt;

===ACTION_IfMonsterHasEnemy===

This conditional is true if the Monster Pawn's Controller.Enemy property is occupied.  Useful for situations where you want to know if it's a good time to ACTION_PossessPawn, otherwise you may want to keep it &quot;Monsterized&quot; and wait until the Enemy is gone.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterHasEnemy.
// Conditional on Pawn.Controller.Enemy != None
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterHasEnemy extends ScriptedAction;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( C.Pawn.Controller.Enemy == None )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_IfMonsterSeesEnemy===

This conditional is true based on the property MonsterController.bEnemyIsVisible.  Useful in the same way that ACTION_IfMonsterHasEnemy is, but this will only be true if the Enemy is visible.  So an Enemy that's ducked out of sight will cause this conditional to be false.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterSeesEnemy.
// Conditional on MonsterController.bEnemyIsVisible
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterSeesEnemy extends ScriptedAction;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') || MonsterController( C.Pawn.Controller ) == None )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( !MonsterController(C.Pawn.Controller).bEnemyIsVisible )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_IfMonsterIsHurt===

This conditional is true if the Pawn's Health is less than the provided HealthThreshold.  This works whether the Monster is currently Monsterized or not.  It's useful to determine if the ScriptedSequence should take control of a hurt Monster to move it to a safer place, etc.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterIsHurt.
// Conditional on Pawn.Health &lt; HealthThreshold
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterIsHurt extends ScriptedAction;

var()	int		HealthThreshold;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( C.Pawn.Health &gt; HealthThreshold )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_HealPawn===

This gives the Pawn Health, up to it's MaxHealth, based on the provided HealAmount.  Ironically, ACTION_HealActor doesn't work with Pawns.  This is useful in situations where you'd like to keep the Monster around a bit longer.  In conjunction with ACTION_IfMonsterIsHurt, this can be used to provide a kind of &quot;Healing Station&quot; for the Monster, giving it a sophisticated combat tactic: Retreat to ''Live and fight another day''.

&lt;uscript&gt;
//=============================================================================
// ACTION_HealPawn.
// Calls Pawn.GiveHealth( HealAmount, HealthMax ).  Does what HealActor can't.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_HealPawn extends ScriptedAction;

var()	int		HealAmount;

function bool InitActionFor( ScriptedController C )
{
	C.Pawn.GiveHealth( HealAmount, int( C.Pawn.HealthMax ) );

	return false;
}
&lt;/uscript&gt;

==Further Development==

The possibilities are endless.  Some useful ACTIONs to make include setting specific Properties or switching to behavior States.  Other custom ACTIONs should be appended here to this section.

===ACTION_myCustomAction===

==Monster Tutorial==

Now that we have the ScriptedActions available to affect Monsters, we can begin to construct a complex Monster behavior patrolling to guard an item in a map.  We will start with a MonsterFactory.  We will give our Monsters a path to follow while on patrol.  We will keep track of the item so the Monsters know when it's been taken.  We will also give our Monsters a safe &quot;homebase&quot; where they can heal themselves when they're hurt.

We will use a variety of actors to make this behavior happen.  We could do it with one Dummy Pawn and one ScriptedSequence, however the ScriptedSequence script would be &lt;u&gt;very&lt;/u&gt; long and complex.  It's very easy to make a mistake in a script that long, so we will break it up into manageable chunks and spread the script around to several ScriptedSequences.

===MonsterFactory===

A MonsterFactory starts with a Dummy Pawn and a ScriptedSequence.  The Dummy -&gt; AIScript -&gt; AIScriptTag will match the ScriptedSequence -&gt; Tag.  We will place the Dummy at the spot we would like our Monsters to spawn.  We will keep the ScriptedSequence close by, just for organization.

This MonsterFactory script will consist of the following ScriptedActions:
; [0] ACTION_TriggerEvent : An emitter actor will be set up here to give some simple effects for our spawning Monster.  We will match it's Tag, &quot;MonsterSpawnFX&quot;, to this ACTION's arguement.
; [1] ACTION_PlaySound : A sound effect will also be played at this point so both a visual and audial queue will signal to any close player that a Monster is about to be spawned.
; [2] ACTION_SpawnMonster : We will spawn a [[Legacy:Krall|Krall]] and give it the MonsterTag, &quot;KrallPatrol&quot;.  We will keep it's control on this script rather than Monsterizing it at start.
; [3] ACTION_MoveToPoint : A nearby PathNode with a Tag set to, &quot;MonsterStart&quot;, will be designated as the first spot our Monsters will move.  This will simply get them out of the way of other Monsters.
; [4] ACTION_TriggerEvent : This action will signal the next ScriptedSequence that a Monster has been spawned and moved to the MonsterStart spot.  This signal, Event &quot;MonsterToPatrol&quot;, will start transferring control of the Monster to the next script.
; [5] ACTION_WaitForEvent : At this point, our MonsterFactory has done its job.  We will have it wait here for a signal to continue.  Our signal will be the Event, &quot;MonsterSpawn&quot;.
; [6] ACTION_GotoAction : Once the signal is given, we will goto the Action 0 to start this script again and spawn a new Monster.

===Patrolling===

Here another ScriptedSequence will take over control of the Monsters from our MonsterFactory.  A series of PathNodes will have Tags that we will use to define the Patrol points for our Monsters.  Each Patrol point will have a corresponding ScriptedSequence.  Our Patrolling scripts will perform checks to make sure our Monsters are Monsterized to attack visible enemies.  At various points, we will also give the Monsters the opportunity to keep track of the item they are guarding and go to a safe healing place if they need it.

The Patrolling script will have the following ScriptedActions:
; [0] ACTION_WaitForEvent : This script waits for the Event, &quot;MonsterToPatrol&quot;, as a signal to take control of the Monster.
; [1] ACTION_PossessPawn : This will take control of the Monster Pawn with the Tag, &quot;KrallPatrol&quot;.
; [2] ACTION_MoveToPoint : We will send this Monster to the first Patrol point, a PathNode with a Tag, &quot;Patrol1&quot;.
; [3] ACTION_Monsterize : We will give the Monster the opportunity to attack any player it sees.  The MonsterControllerTag will be, &quot;KrallMonster&quot;.
; [4] ACTION_WaitForTimer : We will have the Monster wait 5 seconds while Monsterized.
; [5] ACTION_IfMonsterSeesEnemy : This conditional gives the Monster a chance to tell us if they see an Enemy while at this Patrol point.
; [6] ACTION_GotoAction : Send the script to Action 4, to continue the attack for another 5 seconds.
; [7] ACTION_EndSection : This ends the conditional block for IfMonsterSeesEnemy.
; [8] ACTION_TriggerEvent : This will signal to the next Patrol script to take control of this Monster and move it to the next Patrol point.  The Event to trigger will be, &quot;Patrol2&quot;.
; [9] ACTION_GotoAction : This script has done its job and should return to the original state, at Action 0, waiting for the next Monster to take control of.

Now the next Patrol script and Patrol point will take over.  They will look exactly like this one with the exception of some of the Tags.  The script will be waiting for Event, &quot;Patrol2&quot;.  The Patrol point PathNode and ACTION_MoveToPoint will have the tag, &quot;Patrol2&quot;.  When the script has finished checking to see IfMonsterSeesEnemy, it will trigger the next Patrol script using Event, &quot;Patrol3&quot;.

This series of Patrol points and scripts will loop around the Patrol path back to the first point, where the last Patrol script will be triggering, &quot;MonsterToPatrol&quot;, to signal the first Patrol script to take over again.

===Guarding An Item===

In our case, we will have the Monsters guard a BombingRun [[Legacy:XBombFlag|xBombFlag]] at the [[Legacy:XBombSpawn|xBombSpawn]] point.  This will force players to get through the Monster patrol to get the BombFlag in order to score.

===Healing===

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=37962 UnrealPlayground Forum topic, Monster Experiments] &amp;ndash; Implementation of Monsters via custom ScriptedActions.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, NPCs, etc.)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for all Monster Support topics.
* [[Legacy:Monster|Monster]] &amp;ndash; The UT2004 parent class of all Monsters.
* [[Legacy:MonsterController|MonsterController]] &amp;ndash; The Controller class for Monsters.
* [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; The UT parent class for all Monsters and NPCs.
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

'''SuperApe:''' Created.  Working...

'''SuperApe:''' These are okay.  It's beginning to work.  There are a few key issues that need to be addressed:
# With these Actions, you can have the Monster attack &lt;u&gt;or&lt;/u&gt; be controlled by the ScriptedSequence, not both.  So, setting something akin to Alertness level is difficult.
# Technically, the MonsterController &lt;u&gt;will&lt;/u&gt; &quot;teleport&quot; a Monster to a PlayerStart after several seconds if it hasn't encountered a player.  Perhaps another controller should be used anyway. (like a subclass that at least removes that method)
# A daisy chain of ScriptedSequences should work, but I've been having problems.  (I haven't figured out why, but it intermitently &quot;misses&quot; the Trigger for the next script.)

So, I'm beginning to think re-creating the [[Legacy:HomeBase|HomeBase]], [[Legacy:AmbushPoint|AmbushPoint]], [[Legacy:AlarmPoint|AlarmPoint]] and [[Legacy:PatrolPoint|PatrolPoint]] might be helpful in conjunction with a modified [[Legacy:MonsterController|MonsterController]].

'''Moofed:''' Any progress on this?  I'll be learning monster scripting (very) soon and this page looks useful.. until your comment about it not working.

'''SuperApe:''' Your timing is impecable. :)  I'm working on this now.  It's not that it ''doesn't'' work, it's that there are serious limitations without further development, as I mention above.  At the moment, I'm right on the edge of either continuing to use custom ScriptedActions (and making a lot more of them) or creating a custom MonsterController that will include much of the functionality needed.  It's a bit of a mess to have both.  I will be updating this soon.

'''Moofed:''' ... What I will be learning monster scripting for (is) civilian pedestrians and vehicles ... to recreate the GTA2 feel.

'''SuperApe:''' So, you're thinking more along the lines of an NPC?  This could be done with ScriptedSequences, I suppose.  I might be a little too much to do, or a little too simple an NPC.  This page is specifically talking about the problems using Monsters with ScriptedSequences, so it's not gonna be directly applicable to what you want to do.  Monsters are defined as a specific kind of NPC whose sole purpose is to hunt down and kill players.  Civilians and pedestrians would be more along the lines of a general NPC.  See [[Legacy:NPC Support|NPC Support]] and describe for us what you'd like them to do.  Perhaps we can offer suggestions. :)

'''Moofed:''' It seemed relevant to what I want, but you're probably right.  A custom controller would be better.  I'm making a personal page now to descibe my ideas for this.

'''SuperApe:''' Great.  Be glad to help. :)

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; SuperApe is working on a tutorial.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1590</id>
      <timestamp>2006-06-18T17:45:12Z</timestamp>
      <contributor>
        <ip>Dialup-4.245.102.51.Dial1.SanJose1.Level3.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''This page is under contruction.'''''

This tutorial is meant to demonstrate the basics needed to implement [[Legacy:Monster|Monster]] class characters within a UT2004 environment.  The Monster is a specific class introduced in UT2004 for the [[Legacy:Invasion|Invasion]] gametype.  For a tutorial on using UT Monsters, a subclass of [[Legacy:ScriptedPawn|ScriptedPawn]], see [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]].  

==Prerequisites==

This tutorial assumes you know how to [[Legacy:Create A Subclass|Create A Subclass]].

==Overview==

By default, Monsters in UT2004 use a [[Legacy:MonsterController|MonsterController]] that implements a complex set of behaviors to hunt down and attack players.  This is specifically designed for the Invasion gametype, where Monsters are spawned at random [[Legacy:NavigationPoint|NavigationPoint]]s around the map and attack the players in increasingly aggressive waves.

However, for other gametypes this default behavior may not be desirable to the mapper.  As an example, placing UT2004 Monsters in a map designed for a TeamGame will result in a team imbalance, where the UnrealPawn PostNetBeginPlay() function attempts (and eventually fails) to place the Monster in an xTeamRoster. ''(RedTeam's Size is incremented although there's no valid player added and extra BlueTeam memebers are the result)''

In cases where the mapper would like to get Monster class creatures to perform more complex tasks, such as Patrolling, Defending, Ambushing, just as UT was able to do, extra steps are needed.

==ScriptedSequence==

The [[Legacy:ScriptedSequence|ScriptedSequence]] is a subclass of AIScript designed to control pawns.  This takes the place of the AI portion of UT's ScriptedPawn, which is not available in UT200x.  With the ScriptedSequence, mappers can define a script using predefined [[Legacy:ScriptedAction|ScriptedAction]]s.  The ScriptedSequence is designed to work in conjunction with an associated Pawn; one who's AI -&gt; AIScriptTag matches the ScriptedSequence's Tag.

For example, one of the most useful ACTIONs is ACTION_SpawnActor.  But, if no Pawn is associated to the ScriptedSequence, the script will be removed from the level at map start.  If the mapper would like to spawn a Monster out of thin air, a special Pawn will have to be used.

==The Dummy Pawn==

The Dummy Pawn is a simple custom [[Legacy:Pawn|Pawn]] subclass that will act as the servant to our ScriptedSequence.  Subclass Pawn and define the following default properties:

; (Advanced) bool bHidden : true
; (Advanced) bool bNoDelete : true
; (Collision) bool bUseCylinderCollision : false
; (Display) EDrawType DrawType : DT_Sprite
; (Display) Texture Texture : Texture'Engine.S_Pawn'
; (Movement) EPhysics Physics : PHYS_None

For each ScriptedSequence that does not already have an associated Pawn (Monster), a Dummy can be used instead.  This will allow full use of ACTIONs, like ACTION_SpawnActor to create a kind of &quot;MonsterFactory&quot;.

==Useful Stock ACTIONs==

The following stock ScriptedActions are available to use in conjunction with Monsters.  This is just a basic list of useful ACTIONs to implement Monsters.  For a full list of ACTIONs, see also [[Legacy:ScriptedAction|ScriptedAction]].

===ACTION_SpawnActor===

As long as a Pawn is already associated with this ScriptedSequence, this will spawn the provided Actor class and give it the provided Tag.  A &quot;MonsterFactory&quot; is easily made with this action, but it should be noted that the Monster will automatically spawn it's own MonsterController, making it attack any player it finds.

===ACTION_MoveToPoint===

This is a latent ACTION that gives the Pawn a destination defined as a [[Legacy:NavigationPoint|NavigationPoint]] with a particular Tag that matches the provided name.  The Monster will animate, make sounds, navigate and move appropriately without any further ACTIONs.

===ACTION_PlayAnim===

This will play the provided animation sequence (if it exists for this character mesh) and allows options for timing, looping, etc.

===ACTION_PlaySound===

This will play the provided sound and allows options for pitch, volume, etc.

===ACTION_IfCondition===

This conditional is true if the associated [[Legacy:TriggeredCondition|TriggeredCondition]] actor is true.  TriggeredCondition are a subclass of Trigger and can be activated or toggled on and off by another Trigger.  TriggeredConditions act as a flag, a byte of memory that can store information about the map's current condition.  Some examples are: Is a door open?  Is an area occupied by a player?  Has a flag been taken?

===ACTION_IfRandomPct===

This conditional is true if the random number generated, between 1 and 100, is greater than the provided threadhold.  This is good to keep variety.

===ACTION_EndSection===

This is necessary to define the end of a conditional block of ACTIONs.

===ACTION_GotoAction===

This will send focus to another part of the script.

===ACTION_TriggerEvent===

This will trigger the provided Event and trigger those Actors with a matching Tag.

===ACTION_WaitForEvent===

This latent ACTION will pause the script's focus until the provided Event is triggered.

===ACTION_WaitForTimer===

This latent ACTION will pause the script's focus for the provided number of seconds.

===ACTION_DestroyActor===

This will delete the Actor(s) with a Tag that matches the provided name.

===ACTION_ChangeScript===

This will transfer control of the associate Pawn to the ScriptedSequence with a matching Tag.

==Custom ACTIONs==

Many of the stock ACTIONs are left over from UT and were never meant to effect the Monster's MonsterController.  To perform complex behavior like Patrolling, we'll need some custom SciptedActions to take control of the Monster, give up control and detemine various aspects of this relatively new object class.  For more on custom ScriptedActions, see also [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]].

===ACTION_SpawnMonster===

This will spawn the provided Monster class and automatically Possess it, unless otherwise configured.  Other options include setting Tag for the Monster and it's MonsterController, if needed.  This particular ScriptedAction is very useful in implementing Monsters in TeamGame maps.  By spawning them after match start, as opposed to explicitly placing them in a map, you avoid the team imbalance problem described in the Overview above.

&lt;uscript&gt;
//=============================================================================
// ACTION_SpawnMonster.
// Spawn a Monster class and Possess unless bMonsterizeAtStart is true.
// by SuperApe	-- Dec 2005
//=============================================================================
class ACTION_SpawnMonster extends ScriptedAction;

var()	class&lt;Monster&gt;		MonsterClass;
var()	name				MonsterTag;
var()	bool				bMonsterizeAtStart;
var()	name				MonsterControllerTag;

function bool InitActionFor( ScriptedController C )
{
	local	Monster				M;
	local	MonsterController	MC;

	M = C.spawn( MonsterClass, C, MonsterTag, C.Location, C.Rotation );
	C.Pawn = M;

	if ( bMonsterizeAtStart )
		M.Controller.Tag = MonsterControllerTag;
	else
	{
		M.Controller.Unpossess();
		C.Possess( M );
		M.Controller = C;
		M.AIScriptTag = C.Tag;
	}

	return false;
}
&lt;/uscript&gt;

===ACTION_Monsterize===

This spawns a MonsterController for the Monster Pawn and has the MonsterController Possess it.  This is what gets the Monsters to begin to attack any player they see.

&lt;uscript&gt;
//=============================================================================
// ACTION_Monsterize.
// Spawn a MonsterController for this Pawn and have it possess the Pawn.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_Monsterize extends ScriptedAction;

var()	name	MonsterControllerTag;

function bool InitActionFor( ScriptedController C )
{
	local	MonsterController 	MC;

	MC = C.spawn( class'MonsterController', None );
	MC.Tag = MonsterControllerTag;
	MC.Possess( C.Pawn );

	return false;
}
&lt;/uscript&gt;

===ACTION_PossessPawn===

This Possesses the Monster Pawn matching the provided Tag, making it the currently associated Pawn.  This will also destroy the previous Controller if it is a MonsterController.  This is what stops the Monsters from attacking at will and puts them under the control of this ScriptedSequence.  

&lt;uscript&gt;
//=============================================================================
// ACTION_PossessPawn.
// Possess the Pawn with the PawnTag.  Destroy any previous MonsterController.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_PossessPawn extends ScriptedAction;

var()	name	PawnTag;
var		bool	bPawnExists;

function bool InitActionFor( ScriptedController C )
{
	local	Pawn 			P;
	local	MonsterController	MC;

	bPawnExists = false;
	forEach C.DynamicActors( class'Pawn', P, PawnTag )
	{
		bPawnExists = true;
		if ( P.Controller.IsA('MonsterController') )
			MC = MonsterController( P.Controller );	
		P.Controller.Unpossess();

		if ( P.Health &gt; 0 )
		{
			C.Possess( P );
			P.Controller = C;
			P.AIScriptTag = C.Tag;
		}
		else
			P.AIScriptTag = '';

		if ( MC != None )
			MC.Destroy();
	}
	if ( !bPawnExists )
		Warn(&quot;No Pawn with tag &quot;$PawnTag$&quot; exists!&quot;);

	return false;
}
&lt;/uscript&gt;

===ACTION_IfMonsterHasEnemy===

This conditional is true if the Monster Pawn's Controller.Enemy property is occupied.  Useful for situations where you want to know if it's a good time to ACTION_PossessPawn, otherwise you may want to keep it &quot;Monsterized&quot; and wait until the Enemy is gone.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterHasEnemy.
// Conditional on Pawn.Controller.Enemy != None
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterHasEnemy extends ScriptedAction;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( C.Pawn.Controller.Enemy == None )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_IfMonsterSeesEnemy===

This conditional is true based on the property MonsterController.bEnemyIsVisible.  Useful in the same way that ACTION_IfMonsterHasEnemy is, but this will only be true if the Enemy is visible.  So an Enemy that's ducked out of sight will cause this conditional to be false.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterSeesEnemy.
// Conditional on MonsterController.bEnemyIsVisible
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterSeesEnemy extends ScriptedAction;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') || MonsterController( C.Pawn.Controller ) == None )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( !MonsterController(C.Pawn.Controller).bEnemyIsVisible )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_IfMonsterIsHurt===

This conditional is true if the Pawn's Health is less than the provided HealthThreshold.  This works whether the Monster is currently Monsterized or not.  It's useful to determine if the ScriptedSequence should take control of a hurt Monster to move it to a safer place, etc.

&lt;uscript&gt;
//=============================================================================
// ACTION_IfMonsterIsHurt.
// Conditional on Pawn.Health &lt; HealthThreshold
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_IfMonsterIsHurt extends ScriptedAction;

var()	int		HealthThreshold;

function ProceedToNextAction( ScriptedController C )
{
	if ( !C.Pawn.IsA('Monster') )
		ProceedToSectionEnd( C );

	C.ActionNum += 1;
	if ( C.Pawn.Health &gt; HealthThreshold )
		ProceedToSectionEnd( C );
}

function bool StartsSection()
{
	return true;
}
&lt;/uscript&gt;

===ACTION_HealPawn===

This gives the Pawn Health, up to it's MaxHealth, based on the provided HealAmount.  Ironically, ACTION_HealActor doesn't work with Pawns.  This is useful in situations where you'd like to keep the Monster around a bit longer.  In conjunction with ACTION_IfMonsterIsHurt, this can be used to provide a kind of &quot;Healing Station&quot; for the Monster, giving it a sophisticated combat tactic: Retreat to ''Live and fight another day''.

&lt;uscript&gt;
//=============================================================================
// ACTION_HealPawn.
// Calls Pawn.GiveHealth( HealAmount, HealthMax ).  Does what HealActor can't.
// by SuperApe -- Dec 2005
//=============================================================================
class ACTION_HealPawn extends ScriptedAction;

var()	int		HealAmount;

function bool InitActionFor( ScriptedController C )
{
	C.Pawn.GiveHealth( HealAmount, int( C.Pawn.HealthMax ) );

	return false;
}
&lt;/uscript&gt;

==Further Development==

The possibilities are endless.  Some useful ACTIONs to make include setting specific Properties or switching to behavior States.  Other custom ACTIONs should be appended here to this section.

===ACTION_myCustomAction===

==Monster Tutorial==

Now that we have the ScriptedActions available to affect Monsters, we can begin to construct a complex Monster behavior patrolling to guard an item in a map.  We will start with a MonsterFactory.  We will give our Monsters a path to follow while on patrol.  We will keep track of the item so the Monsters know when it's been taken.  We will also give our Monsters a safe &quot;homebase&quot; where they can heal themselves when they're hurt.

We will use a variety of actors to make this behavior happen.  We could do it with one Dummy Pawn and one ScriptedSequence, however the ScriptedSequence script would be &lt;u&gt;very&lt;/u&gt; long and complex.  It's very easy to make a mistake in a script that long, so we will break it up into manageable chunks and spread the script around to several ScriptedSequences.

===MonsterFactory===

A MonsterFactory starts with a Dummy Pawn and a ScriptedSequence.  The Dummy -&gt; AIScript -&gt; AIScriptTag will match the ScriptedSequence -&gt; Tag.  We will place the Dummy at the spot we would like our Monsters to spawn.  We will keep the ScriptedSequence close by, just for organization.

This MonsterFactory script will consist of the following ScriptedActions:
; [0] ACTION_TriggerEvent : An emitter actor will be set up here to give some simple effects for our spawning Monster.  We will match it's Tag, &quot;MonsterSpawnFX&quot;, to this ACTION's arguement.
; [1] ACTION_PlaySound : A sound effect will also be played at this point so both a visual and audial queue will signal to any close player that a Monster is about to be spawned.
; [2] ACTION_SpawnMonster : We will spawn a [[Legacy:Krall|Krall]] and give it the MonsterTag, &quot;KrallPatrol&quot;.  We will keep it's control on this script rather than Monsterizing it at start.
; [3] ACTION_MoveToPoint : A nearby PathNode with a Tag set to, &quot;MonsterStart&quot;, will be designated as the first spot our Monsters will move.  This will simply get them out of the way of other Monsters.
; [4] ACTION_TriggerEvent : This action will signal the next ScriptedSequence that a Monster has been spawned and moved to the MonsterStart spot.  This signal, Event &quot;MonsterToPatrol&quot;, will start transferring control of the Monster to the next script.
; [5] ACTION_WaitForEvent : At this point, our MonsterFactory has done its job.  We will have it wait here for a signal to continue.  Our signal will be the Event, &quot;MonsterSpawn&quot;.
; [6] ACTION_GotoAction : Once the signal is given, we will goto the Action 0 to start this script again and spawn a new Monster.

===Patrolling===

Here another ScriptedSequence will take over control of the Monsters from our MonsterFactory.  A series of PathNodes will have Tags that we will use to define the Patrol points for our Monsters.  Each Patrol point will have a corresponding ScriptedSequence.  Our Patrolling scripts will perform checks to make sure our Monsters are Monsterized to attack visible enemies.  At various points, we will also give the Monsters the opportunity to keep track of the item they are guarding and go to a safe healing place if they need it.

The Patrolling script will have the following ScriptedActions:
; [0] ACTION_WaitForEvent : This script waits for the Event, &quot;MonsterToPatrol&quot;, as a signal to take control of the Monster.
; [1] ACTION_PossessPawn : This will take control of the Monster Pawn with the Tag, &quot;KrallPatrol&quot;.
; [2] ACTION_MoveToPoint : We will send this Monster to the first Patrol point, a PathNode with a Tag, &quot;Patrol1&quot;.
; [3] ACTION_Monsterize : We will give the Monster the opportunity to attack any player it sees.  The MonsterControllerTag will be, &quot;KrallMonster&quot;.
; [4] ACTION_WaitForTimer : We will have the Monster wait 5 seconds while Monsterized.
; [5] ACTION_IfMonsterSeesEnemy : This conditional gives the Monster a chance to tell us if they see an Enemy while at this Patrol point.
; [6] ACTION_GotoAction : Send the script to Action 4, to continue the attack for another 5 seconds.
; [7] ACTION_EndSection : This ends the conditional block for IfMonsterSeesEnemy.
; [8] ACTION_TriggerEvent : This will signal to the next Patrol script to take control of this Monster and move it to the next Patrol point.  The Event to trigger will be, &quot;Patrol2&quot;.
; [9] ACTION_GotoAction : This script has done its job and should return to the original state, at Action 0, waiting for the next Monster to take control of.

Now the next Patrol script and Patrol point will take over.  They will look exactly like this one with the exception of some of the Tags.  The script will be waiting for Event, &quot;Patrol2&quot;.  The Patrol point PathNode and ACTION_MoveToPoint will have the tag, &quot;Patrol2&quot;.  When the script has finished checking to see IfMonsterSeesEnemy, it will trigger the next Patrol script using Event, &quot;Patrol3&quot;.

This series of Patrol points and scripts will loop around the Patrol path back to the first point, where the last Patrol script will be triggering, &quot;MonsterToPatrol&quot;, to signal the first Patrol script to take over again.

===Guarding An Item===

In our case, we will have the Monsters guard a BombingRun [[Legacy:XBombFlag|xBombFlag]] at the [[Legacy:XBombSpawn|xBombSpawn]] point.  This will force players to get through the Monster patrol to get the BombFlag in order to score.

===Healing===

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=37962 UnrealPlayground Forum topic, Monster Experiments] &amp;ndash; Implementation of Monsters via custom ScriptedActions.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, NPCs, etc.)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for all Monster Support topics.
* [[Legacy:Monster|Monster]] &amp;ndash; The UT2004 parent class of all Monsters.
* [[Legacy:MonsterController|MonsterController]] &amp;ndash; The Controller class for Monsters.
* [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; The UT parent class for all Monsters and NPCs.
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

'''SuperApe:''' Created.  Working...

'''SuperApe:''' These are okay.  It's beginning to work.  There are a few key issues that need to be addressed:
# With these Actions, you can have the Monster attack &lt;u&gt;or&lt;/u&gt; be controlled by the ScriptedSequence, not both.  So, setting something akin to Alertness level is difficult.
# Technically, the MonsterController &lt;u&gt;will&lt;/u&gt; &quot;teleport&quot; a Monster to a PlayerStart after several seconds if it hasn't encountered a player.  Perhaps another controller should be used anyway. (like a subclass that at least removes that method)
# A daisy chain of ScriptedSequences should work, but I've been having problems.  (I haven't figured out why, but it intermitently &quot;misses&quot; the Trigger for the next script.)

So, I'm beginning to think re-creating the [[Legacy:HomeBase|HomeBase]], [[Legacy:AmbushPoint|AmbushPoint]], [[Legacy:AlarmPoint|AlarmPoint]] and [[Legacy:PatrolPoint|PatrolPoint]] might be helpful in conjunction with a modified [[Legacy:MonsterController|MonsterController]].

'''Moofed:''' Any progress on this?  I'll be learning monster scripting (very) soon and this page looks useful.. until your comment about it not working.

'''SuperApe:''' Your timing is impecable. :)  I'm working on this now.  It's not that it ''doesn't'' work, it's that there are serious limitations without further development, as I mention above.  At the moment, I'm right on the edge of either continuing to use custom ScriptedActions (and making a lot more of them) or creating a custom MonsterController that will include much of the functionality needed.  It's a bit of a mess to have both.  I will be updating this soon.

'''Moofed:''' ... What I will be learning monster scripting for (is) civilian pedestrians and vehicles ... to recreate the GTA2 feel.

'''SuperApe:''' So, you're thinking more along the lines of an NPC?  This could be done with ScriptedSequences, I suppose.  I might be a little too much to do, or a little too simple an NPC.  This page is specifically talking about the problems using Monsters with ScriptedSequences, so it's not gonna be directly applicable to what you want to do.  Monsters are defined as a specific kind of NPC whose sole purpose is to hunt down and kill players.  Civilians and pedestrians would be more along the lines of a general NPC.  See [[Legacy:NPC Support|NPC Support]] and describe for us what you'd like them to do.  Perhaps we can offer suggestions. :)

'''Moofed:''' It seemed relevant to what I want, but you're probably right.  A custom controller would be better.  I'm making a personal page now to descibe my ideas for this.

'''SuperApe:''' Great.  Be glad to help. :)

----

'''SuperApe:''' This page will be updated soon, but while I like being able to use (mostly) stock objects to implement UT2004 Monsters, there's some drastic limitations.  It's no where near as cool as original ScriptedPawn Monsters used to be in UT.  While I may keep this tutorial the same, I am beginning to recreate the older actors and code for the ScriptedPawn AI, with all their functionality.  This will eventually include all the NavPoints, a new Monster parent class that mimics some ScriptedPawn functionality, as many individual Monsters as UT2004 has (with all their original functionality) and a new ScriptedMonsterController which will handle the bulk of what ScriptedPawn used to.  I suppose that qualifies as a different project, a different page, but it related directly to and evolved from these experiments.  In the meantime, I will try to finish up this tutorial as best I can using the custom work already described above.

'''SuperApe:''' This line of thinking has led to a new project, [http://forums.unrealplayground.com/showthread.php?t=39783 Old Skool Monsta Toolz], implementing UT-style monsters in UT2004.  It's currently in beta and testing for quality assurance.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; SuperApe is working on a tutorial.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ACTION GotoAction</title>
    <id>28348</id>
    <revision>
      <id>40015</id>
      <timestamp>2009-11-14T20:17:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ACTION IfCondition</title>
    <id>28416</id>
    <revision>
      <id>40088</id>
      <timestamp>2009-11-15T08:28:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ACTION WaitForEvent</title>
    <id>28382</id>
    <revision>
      <id>40053</id>
      <timestamp>2009-11-15T08:14:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AI Scripting</title>
    <id>414</id>
    <revision>
      <id>1367</id>
      <timestamp>2007-07-03T14:54:43Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''AI Scripting''' allows enemies (and friends) to be controlled via external .[[Legacy:Ucs File|ucs file]]s that can be changed without map rebuilding.  Almost every important NPC (non player character) in Unreal II has a long and detailed script behind it controlling its behavious and actions under various conditions.  Note that .[[Legacy:Ucs File|ucs file]]s can only be attached to pawns which are subclassed from [[Legacy:U2NPCControllerScriptable|U2NPCControllerScriptable]].  See also [[Legacy:AI Scripting Reference|AI Scripting Reference]].

By contrast, in UT200x, the term &quot;AIScripting&quot; more commonly refers to any custom scripting meant to control bots or NPCs done via [[Legacy:AIScript|AIScript]] actors using [[Legacy:ScriptedAction|ScriptedAction]]s.  See also [[Legacy:ScriptedSequence|ScriptedSequence]].

==Related Topics==

===UT &amp; UT2===
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:AI Scripting Reference|AI Scripting Reference]]

===UT200x===
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:Bot Vision|Bot Vision]] &amp;ndash; Modding unreal bots
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:ScriptedAction|ScriptedAction]]
* [[Legacy:ScriptedSequence|ScriptedSequence]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Discussion==

'''SuperApe:''' Classes related to bot support moved here, as it relates more closely to AIScripting and does not relate to stock bot suppot methods.

'''SuperApe:''' To be a little more current, this page titled &quot;AI Scripting&quot; should probably be centered around the process of directing Pawn classes via an AIScript actor's ScriptedController and ScriptedActions in UT200x.  AIScripting using external .ucs files seems like a relic from UT99/UT2 days.  For now, people looking for info on using AIScripts (ScriptedSequences) and ScriptedActions should head over to [[Legacy:Trigger Systems|Trigger Systems]] as a starting point.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1368</id>
      <timestamp>2007-06-22T23:09:22Z</timestamp>
      <contributor>
        <ip>72.9.108.74.svservers.com</ip>
      </contributor>
      <text xml:space="preserve">This is very nice site, but my is better! ;) &lt;a href=&quot;http://cheap-pills-store.info/diflucan.html&quot;&gt;Anti Fungal / Generic Diflucan ( Fluconazole )&lt;/a&gt;</text>
    </revision>
    <revision>
      <id>1369</id>
      <timestamp>2007-06-22T23:21:37Z</timestamp>
      <contributor>
        <ip>207-237-77-198.c3-0.nyr-ubr4.nyr.ny.cable.rcn.com</ip>
      </contributor>
      <comment>rv</comment>
      <text xml:space="preserve">'''AI Scripting''' allows enemies (and friends) to be controlled via external .[[Legacy:Ucs File|ucs file]]s that can be changed without map rebuilding.  Almost every important NPC (non player character) in Unreal II has a long and detailed script behind it controlling its behavious and actions under various conditions.  Note that .[[Legacy:Ucs File|ucs file]]s can only be attached to pawns which are subclassed from [[Legacy:U2NPCControllerScriptable|U2NPCControllerScriptable]].

Likewise, any custom scripting meant to control bots in UT2003/UT2004 is done via AI Scripting.

==Classes==

The following classes and subclasses thereof are involved in the UT2003/UT2004 bot support AI:
; [[Legacy:TeamAI|TeamAI]] : Creates squads, assigns bots to them and changes the objectives of squads based on the objectives of the [[Legacy:Gametype|gametype]].
; [[Legacy:SquadAI|SquadAI]] : Team of bots following a Squad Leader.
; [[Legacy:Bot|Bot]] : Low-level bot behavior (navigation, combat, inventory acquisition).

Certain game objects have to tell bots what to do with them:
; [[Legacy:GameObjective|GameObjective]] : Immobile (though possibly destructible) markers for relevant places in a map:  CTF flag bases, Bombing Run bomb spawn points, goal hoops, Domination control points and so on.
; [[Legacy:Weapon|Weapon]] : Weapon inventory items.
; [[Legacy:NavigationPoint|NavigationPoint]] : Various NavigationPoints, like [[Legacy:Door|Door]], [[Legacy:LiftExit|LiftExit]], etc., have code or critical properties that work with other bot support actors.

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:AI Scripting Reference|AI Scripting Reference]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:Bot Vision|Bot Vision]] &amp;ndash; Modding unreal bots
* [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]]

==Discussion==

'''SuperApe:''' Classes related to bot support moved here, as it relates more closely to AIScripting and does not relate to stock bot suppot methods.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AI Scripting Reference</title>
    <id>415</id>
    <revision>
      <id>1370</id>
      <timestamp>2005-12-06T21:27:57Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Commands for [[Legacy:Unreal 2|Unreal 2]]'s [[Legacy:AI Scripting|AI Scripting]] system.

==Commands ==

;addammo			: '''''ammostring amount [maxclip]'''''					gives N units of specified ammo to NPC, if maxclip=1 makes sure clip is as full as possible                                                                      	
;agentbind			: '''''inputname valuename'''''						sets and locks an agent input to a given value, for characters with agent-driven meshes                                                                          		
;agentcall			: '''''actionname [wait]'''''						calls an agent action of the given name, for characters with agent-driven meshes                                                                                 		
;agentexecute			: '''''actiontext [wait]'''''						compiles and executes a GAL string on-the-fly as if were inside an action, and calls it                                                                          		
;agentunbind			: '''''inputname'''''							unlocks an agent input previously locked and set with AgentBind                                                                                                  		
;animloop			: '''''name [rate tweentime [wait]]'''''					loops specified anim on channel 0                                                                                                                                		
;animloopex			: '''''channel name [rate tweentime [wait]]'''''				loops specified anim on arbitrary channel                                                                                                                        		
;animplay			: '''''name [rate tweentime	[wait]]'''''					plays specified anim on channel 0                                                                                                                                		
;animplayex			: '''''channel name [rate tweentime [wait]]'''''				plays specified anim on arbitrary channel                                                                                                                        		
;animrelease			: 								allow NPC to control anims (currently idle only)                                                                                                                 		
;animtween			: '''''name [tweentime [wait]]'''''					tweens specified anim on channel 0                                                                                                                               		
;animtweenex			: '''''channel name [tweentime [wait]]'''''				tweens specified anim on arbitrary channel                                                                                                                       		
;call				: '''''label'''''								pushes line after current one and jumps to given label                                                                                                           		
;callscript			: '''''scriptname'''''							pushes current script state and switches to specified file                                                                                                       		
;callend  			: 								aborts any previously pushed call (can no longer return)                                                                                                         		
;clearevents  			: 								clears any current onevents                                                                                                                                      		
;cleartimers  			: 								clears any current general timers                                                                                                                                		
;cleartriggers			: 								clears any current ontriggers                                                                                                                                    		
;consolecommand  		: '''''command'''''							executes given console command                                                                                                                                   		
;debugai			: '''''0/1'''''								enables/disables debug AI mode in controlled NPC                                                                                                                 		
;debugaievents			: '''''0/1'''''								enables/disables debug events mode in controlled NPC                                                                                                             		
;debugaiflags			: '''''###'''''								explicitely sets debug AI flags in controlled NPC                                                                                                                		
;debugmode			: '''''flags'''''								enables/disables various debug modes for the script controller                                                                                                   		
;decproperty			: '''''name property value [#]'''''					decrements (integer) property in named actor by 1 or by #                                                                                                        		
;deployinventory		: '''''S [1]'''''								deploy given inventory item [alt deploy it]                                                                                                                      		
;destroy			: 								destroy controlled NPC (and controller)                                                                                                                          		
;dialogdisable			: '''''topicname'''''							disable this dialog node                                                                                                                                         		
;dialogenable			: '''''topicname'''''							enable this dialog node                                                                                                                                          		
;dialogfar			: '''''topicname speaker1 [speaker2]'''''					starts dialog b/w 2 npcs regardless of distance                                                                                                                  		
;dialogfarwait			: '''''topicname speaker1 [speaker2]'''''					waits for dialog b/w 2 npcs to finish                                                                                                                            		
;dialoginitiate			: '''''speaker topicname'''''						tries to initiate given dialog with given target                                                                                                                 		
;dialogterminate		: '''''speaker'''''							tries to remove NPC from dialog                                                                                                                                  		
;directionalpatrol		: '''''0/1'''''								whether NPC faces in direction of patrol destination                                                                                                             		
;dormant			: '''''0/1 [1]'''''							toggle whether NPC (Pawn and Controller) is dormant (bStasis=true and Physics=PHYS_None) [1] means stay dormant even if script removed?                          		
;dropinventory			: '''''S'''''								drop given inventory item                                                                                                                                        		
;enableprobeevent		: '''''probename 0|1'''''							enables/disables NPC probe event (for performance) e.g. enableprobeevent seeplayer 0 -&gt; no more seeplayer events                                                 		
;enablexmphandling		: '''''0/1'''''								enables/disables NPC reacting to XMP items (inert 0/1 sets this to 1/0 use enablexmphandling 0/1 to override this).                                              		
;error				:								used internally                                                                                                                                                  		
;eventdisable			: '''''event'''''								disables event                                                                                                                                                   		
;eventenable			: '''''event'''''								enables event                                                                                                                                                    		
;eventwait			: '''''event'''''								waits until event occurs                                                                                                                                         		
;findactor			: '''''[name Min Max Type Vis Num gotolabel targetlabel]'''''    		searches for actors in level (all args optional)                                                                                                                 		
;fire				: '''''[duration]'''''							fire (weapon / animation-based) for given duration                                                                                                               		
;firealt			: '''''[duration]'''''							alt fire (weapon / animation-based) for given duration                                                                                                           		
;gib				: '''''[bDestroy] [gorelevel]'''''					gib controlled NPC. If gib fails, bDestroy determines if npc is killed or destroyed. Gore level overrides the gibset's default gore level                        		
;giball				: '''''targetclass [bDestroy] [gorelevel]'''''				gib all actors of the given class. . If gib fails, bDestroy determines if npc is killed or destroyed. Gore level overrides the gibset's default gore level       		
;giveinventory			: '''''inventorystring'''''						gives the specified inventory item to the NPC                                                                                                                    		
;giveitemtoplayer		: '''''inventorystring [ammocount]'''''					give item to player, if ammocount treats as ammo and adds this much ammo to player's inventory                                                                   		
;givetosseditem			: '''''inventorystring'''''						add item to tossed items list                                                                                                                                    		
;gotoactor			: '''''targetname [dist [face]]'''''					sends NPC to specifed actor at specified dist (error if target not found), face=1 ==&gt; try to face target (e.g. for initiating dialog)                            		
;gotoactorsafe			: '''''targetname [dist [face]]'''''					sends NPC to specifed actor at specified dist (not an error if target not found), face=1 ==&gt; try to face target (e.g. for initiating dialog)                     		
;gotolabel			: '''''label'''''								jumps to given label                                                                                                                                             		
;incproperty			: '''''name property value [#]'''''					increments (integer) property in named actor by 1 or by #                                                                                                        		

;inert				: '''''0/1'''''								toggles NPC reacting to sensory input &amp;ndash; shorthand for toggling bump, hearnoise, seeplayer, tookdamage                                                           		
;handlergroup			: 								denotes start of a new handler groups (can't be in one currently?)                                                                                               		
;handlergroupend		: 								denotes end of a new handler groups (must be in one currently)                                                                                                   		
;headtracking			: '''''0/1'''''	                                                                                                                                                                                                                      		
;jump				: '''''X Y Z'''''								launch NPC in given direction                                                                                                                                    		
;kill				: 								kill controlled NPC (goes into dying state)                                                                                                                      		
;killall			: '''''targetclass'''''							kill all actors of the given class                                                                                                                               		
;lockstep			: '''''name [f]'''''							maintain given or current distance from named actor (for keeping squads in formation)                                                                            		
;message			: '''''string [0|1|2]'''''						displays the given message in-game (surround with &quot;&quot; for multiple words) 0: onscreen 1: log 2: onscreen and log                                                  		
;onevent			: '''''xxx [gotolabel ### [clear]]'''''					when event xxx occurs, jumps to given label (or disables previous onevent)                                                                                       		
;ontimer			: '''''index [delay repeat gotolabel ###]'''''				adds a general-purpose timer                                                                                                                                     		
;ontrigger			: '''''name [gotolabel ###]'''''						when trigger with given event name occurs, jumps to given label (or disables previous ontrigger)                                                                 		
;playsound			: '''''name sound [slot [volume [bNoOverride [Radius [Pitch]]]]]'''''	plays sound through named actor (or self=controlled NPC)                                                                                                         		
;playsoundwait			: '''''name sound [slot [volume [bNoOverride [Radius [Pitch]]]]]'''''	plays sound through named actor (or self=controlled NPC) and script waits for sound to finish                                                                    		
;playsoundtableslot		: '''''name slot'''''							play sound belonging to the specified group from named pawn's sound table                                                                                        		
;playsoundtableslotwait		: '''''name slot'''''							play sound belonging to the specified group from named pawn's sound table and script waits for sound to finish                                                   		
;removeinventory		: '''''[string]'''''							removes all [or the specified] inventory from the NPC                                                                                                            		
;removeinventoryfromplayer	: '''''[string]'''''							removes all [or the specified] inventory from the player                                                                                                         		
;removeitemfromplayer		: '''''inventorystring'''''						add item to player's inventory                                                                                                                                   		
;removetosseditem		: '''''inventorystring'''''						remove item from tossed items list                                                                                                                               		
;resumepatrol			: '''''startlabel endlabel'''''						finds the &quot;best&quot; destination at which the resume patrolling and jumps to that line                                                                               		
;return				:      								returns to most recently pushed line or script state (error if no applicable)                                                                                    		
;rotate				: '''''#.#'''''								rotate #.# degrees clockwise (right) relative to forward                                                                                                         		
;savedestination		: 								copies GotoActorTarget into SavedDestination for later use with resumepatrol                                                                                     		
;sendevent  			: '''''EventName [triggerpawns]'''''					triggers all Actors with tag that matches given Event, or all NPCs                                                                                               		
;setactorrangetest		: '''''target distance'''''						sets the InRangeActor and InRangeDistance for ActorInRange/ActorOutOfRange events                                                                                		
;setaimodds			: '''''odds'''''								sets odds of hitting target when firing weapon under script control                                                                                              		
;setalert			: '''''0/1'''''								controls whether NPC uses &quot;alert&quot; animations                                                                                                                     		
;setammo			: '''''ammostring amount [maxclip]'''''					makes sure NPC has exactly specified amount of given type of ammo, if maxclip=1 makes sure clip is as full as possible                                           		
;setfocus			: '''''[name]'''''							set scripted focus to given actor or clear focus                                                                                                                 		
;sethealth			: '''''x.x'''''								sets controlled NPC's health to x.x                                                                                                                              		
;setinventory			: '''''targetname inventorystring'''''					sets target's selected inventory to x.x                                                                                                                          		
;setlocation			: '''''locationname [allowfail]'''''					move pawn to location of locationame                                                                                                                             		
;setlocationnamed		: '''''targetname locationname [allowfail]'''''				move actor matching targetname to location of locationame                                                                                                        		
;setlocationvector		: '''''targetname X Y Z'''''						move targetname to given coordinates                                                                                                                             		
;setmovespeed			: '''''speed [stance]'''''						0.01 to MaxDesiredSpeed (usually 1.0) &amp;ndash; set speed used for scripted movement                                                                                    		
;setmovespeedauto		: '''''speed'''''								0.01 to MaxDesiredSpeed (usually 1.0) &amp;ndash; set speed used for autonomous movement                                                                                  		
;setorders			: '''''orders [OrdersObject [fparam [ordergiver]]]''''' 			sets/clears orders                                                                                                                                               		
;setphysics			: '''''physics'''''                                                                                                                                                                                                                     		
;setproperty			: '''''targetname property value'''''  					sets property in named actor to value                                                                                                                            		
;setproperties			: '''''classname property value'''''  					sets given property in all actors which are a classname                                                                                                          		
;setsatellite			: '''''satellitename [targetname]'''''					binds a mesh satellite node of the given name to the given target, for dynamic animations                                                                        		
;setscript			: '''''filename [startlabel]'''''						switches over to the given script [at the given label]                                                                                                           		
;setskill			: '''''skill'''''								set NPC's skill to given value (0.0..1.0)                                                                                                                        		
;setstance			: '''''stand / crouch / prone'''''					specifies stance that NPC should use while patrolling                                                                                                            		
;setstationary			: '''''1/0 [1]'''''							makes NPC immobile/mobile, optionally forever                                                                                                                    		
;settacticalmovetype		: '''''0/1/2'''''								sets tactical move type to use during scripted movement (0: none 1: basic 2: serpentine)                                                                         		
;setweapon			: '''''weaponstring'''''							set NPC's weapon to specified one, spawning it if necessary                                                                                                      		
;shutdown			: '''''1/0'''''								makes NPC as inert as possible without actually making it dormant or removing its controller                                                                     		
;sleep	  			: '''''[x.x]'''''   							puts controller to sleep for x.x seconds (defaults to &quot;forever&quot;)                                                                                                 		
;sleeprand			: '''''[x.x]'''''								puts controller to sleep for random time in 0..x.x seconds (x.x defaults to 1.0)                                                                                 		
;spawn				: '''''targetname S	[1 [filename [startlabel]]]'''''			spawn given actor at targetname's location, if 1 is given, failure = error, optionally gives spawned NPCs a script                                               		
;stop				: 								stops execution, detaches script controller                                                                                                                      		
;stopmovement			: 								stops NPC movement                                                                                                                                               		
;stopsound			: '''''slot	[bStopNoOverrideSounds]'''''					stops any sounds played through the named actor on the specified sound slot                                                                                      		
;testactorinrange		: '''''name distance'''''							if given actor is outside given distance of pawn ==&gt; next command skipped                                                                                        		
;testproperty			: '''''name property value'''''  						property != value ==&gt; next command skipped (string comparison)                                                                                                   		
;testpropertyci			: '''''name property value'''''  						property != value ==&gt; next command skipped (case-insensitive string comparison)                                                                                  		
;testpropertye			: '''''name property value'''''  						property != value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyg			: '''''name property value'''''  						property &lt;= value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyge			: '''''name property value'''''  						property &lt;  value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyl			: '''''name property value'''''  						property &gt;= value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyle			: '''''name property value'''''  						property &gt;  value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testrandom			: '''''float'''''								(if random number in 0.0..1.0 &gt; value ==&gt; next command skipped)                                                                                                  		
;teststate			: '''''name name'''''							(false ==&gt; next command skipped)                                                                                                                                 		
;turntoactor			: '''''targetname [LOS [Lock]]'''''					turn NPC to face named actor, LOS=0 ==&gt; LOS not needed, LOS=1 ==&gt; LOS needed, LOS=2 ==&gt; LOS not needed but turn anyway, Lock means target actor won't be cleared 		
;unuse				: '''''name'''''								unuse the named actor                                                                                                                                            		
;use				: '''''name'''''								use the named actor                                                                                                                                              		
;usepickups			: '''''0/1'''''								if 0, won't go after or pickup pickups                                                                                                                           		
;weaponload			:								load current weapon                                                                                                                                              		
;WeaponSetAmmoType		: '''''ammoname'''''                                                                                                                                                                                                                    		
;WeaponSupportsAltFire		: '''''weaponname 0/1'''''						disables/enables NPC being able to alt fire weapon                                                                                                               		
;WeaponSupportsFire		: '''''weaponname 0/1'''''						disables/enables NPC being able to primary fire weapon                                                                                                           		
                                                                                                

==Events ==
                                                                                                                                                              
;ActorInRange			: 								generated when the InRangeActor comes within the InRangeDistance                       
;ActorOutOfRange		:                                                               generated once when the InRangeActor comes goes out of the InRangeDistance             
;AnimEnd			:                                                               goes to Controller unless Pawn has no Controller (dying state)                         
;AutoBegin			:                                                               goes to Controller, generated by U2NPCControllerScriptable                             
;AutoEnd			:                                                               goes to Controller, generated by Controller  : seems to be used for after fighting conditions                                           
;BumpEnemy			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpFriend			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpOther			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpPlayer			:                                                               not an actual event: eventwait BumpPlayer &amp;ndash;&gt; BumpEnemy/BumpFriend checked for player  
;DestinationReached		:                                                               goes to Controller                                                                     
;DialogBegin	 		:                                                               generated by Controller before destroyed                                               
;DialogUnPause			:                                                               generated when dialog unpauses npc's script                                            
;Died	 			:                                                               generated by Controller before destroyed                                               
;EnemyNotVisible		:                                                               goes to Controller                                                                     
;HearNoiseFriendly		:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseFriendly                                         
;HearNoiseOther			:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseOther                                            
;HearNoiseThreat		:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseThreat                                           
;InheritEnemy			:                                                               generated when NPC could inherit another NPC's Enemy                                   
;ScriptedLanding		:                                                               generated when NPC in scripted state lands (not passed back to NPC)                    
;SeeAlertFriend			:                                                               SeeAlertFriend &amp;ndash;&gt; Controller                                                          
;SeeEnemy			:                                                               SeeEnemy &amp;ndash;&gt; Controller                                                                
;SeeFriend			:                                                               SeeFriend &amp;ndash;&gt; Controller &amp;ndash;&gt; SeeFriend                                                 
;SeeOther			:                                                               SeeOther &amp;ndash;&gt; Controller &amp;ndash;&gt; SeeOther                                                   
;SeePlayer			:                                                               not an actual event: eventwait SeePlayer &amp;ndash;&gt; SeeEnemy/SeeFriend checked for player     
;TakeDamage			:                                                               goes to Pawn                                                                           
;TookDamage			:                                                               eventTakeDamage &amp;ndash;&gt; TookDamage generated by U2NPCControllerScriptable                  
;TookDamageEnemy		:                                                               generated internall from TookDamage for use by scripts only                            
;TookDamageFriend		:                                                               generated internall from TookDamage for use by scripts only                            
;Trigger			:                                                               goes to Pawn then Controller                                                           

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI
* [[Legacy:AI Scripting|AI Scripting]]
* [[Legacy:ScriptedPawn|ScriptedPawn]]
 

==Discussion==

'''Unknown:''' Maybe explain what these are and where to put them?

'''Unknown:''' I'll put that stuff in [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] when I make it.

'''SuperApe:''' This page needs help.  Is it purely U2?  It should be applicable to all versions.  Since, I'm working on the [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]], I may revise this.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; This page needs to be updated and made relevant to all Unreal versions as well as the current wiki structure.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1371</id>
      <timestamp>2004-02-22T00:01:26Z</timestamp>
      <contributor>
        <ip>Pool-68-162-169-202.pitt.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Commands for [[Legacy:AI Scripting|AI Scripting]]...

(maybe explain what these are and where to put them? (I'll put that stuff in [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] when I make it))

'''clam''': Do these somehow work with UT2K3, or are these just Unreal II .UCS commands?

==Commands ==

;addammo			: '''''ammostring amount [maxclip]'''''					gives N units of specified ammo to NPC, if maxclip=1 makes sure clip is as full as possible                                                                      	
;agentbind			: '''''inputname valuename'''''						sets and locks an agent input to a given value, for characters with agent-driven meshes                                                                          		
;agentcall			: '''''actionname [wait]'''''						calls an agent action of the given name, for characters with agent-driven meshes                                                                                 		
;agentexecute			: '''''actiontext [wait]'''''						compiles and executes a GAL string on-the-fly as if were inside an action, and calls it                                                                          		
;agentunbind			: '''''inputname'''''							unlocks an agent input previously locked and set with AgentBind                                                                                                  		
;animloop			: '''''name [rate tweentime [wait]]'''''					loops specified anim on channel 0                                                                                                                                		
;animloopex			: '''''channel name [rate tweentime [wait]]'''''				loops specified anim on arbitrary channel                                                                                                                        		
;animplay			: '''''name [rate tweentime	[wait]]'''''					plays specified anim on channel 0                                                                                                                                		
;animplayex			: '''''channel name [rate tweentime [wait]]'''''				plays specified anim on arbitrary channel                                                                                                                        		
;animrelease			: 								allow NPC to control anims (currently idle only)                                                                                                                 		
;animtween			: '''''name [tweentime [wait]]'''''					tweens specified anim on channel 0                                                                                                                               		
;animtweenex			: '''''channel name [tweentime [wait]]'''''				tweens specified anim on arbitrary channel                                                                                                                       		
;call				: '''''label'''''								pushes line after current one and jumps to given label                                                                                                           		
;callscript			: '''''scriptname'''''							pushes current script state and switches to specified file                                                                                                       		
;callend  			: 								aborts any previously pushed call (can no longer return)                                                                                                         		
;clearevents  			: 								clears any current onevents                                                                                                                                      		
;cleartimers  			: 								clears any current general timers                                                                                                                                		
;cleartriggers			: 								clears any current ontriggers                                                                                                                                    		
;consolecommand  		: '''''command'''''							executes given console command                                                                                                                                   		
;debugai			: '''''0/1'''''								enables/disables debug AI mode in controlled NPC                                                                                                                 		
;debugaievents			: '''''0/1'''''								enables/disables debug events mode in controlled NPC                                                                                                             		
;debugaiflags			: '''''###'''''								explicitely sets debug AI flags in controlled NPC                                                                                                                		
;debugmode			: '''''flags'''''								enables/disables various debug modes for the script controller                                                                                                   		
;decproperty			: '''''name property value [#]'''''					decrements (integer) property in named actor by 1 or by #                                                                                                        		
;deployinventory		: '''''S [1]'''''								deploy given inventory item [alt deploy it]                                                                                                                      		
;destroy			: 								destroy controlled NPC (and controller)                                                                                                                          		
;dialogdisable			: '''''topicname'''''							disable this dialog node                                                                                                                                         		
;dialogenable			: '''''topicname'''''							enable this dialog node                                                                                                                                          		
;dialogfar			: '''''topicname speaker1 [speaker2]'''''					starts dialog b/w 2 npcs regardless of distance                                                                                                                  		
;dialogfarwait			: '''''topicname speaker1 [speaker2]'''''					waits for dialog b/w 2 npcs to finish                                                                                                                            		
;dialoginitiate			: '''''speaker topicname'''''						tries to initiate given dialog with given target                                                                                                                 		
;dialogterminate		: '''''speaker'''''							tries to remove NPC from dialog                                                                                                                                  		
;directionalpatrol		: '''''0/1'''''								whether NPC faces in direction of patrol destination                                                                                                             		
;dormant			: '''''0/1 [1]'''''							toggle whether NPC (Pawn and Controller) is dormant (bStasis=true and Physics=PHYS_None) [1] means stay dormant even if script removed?                          		
;dropinventory			: '''''S'''''								drop given inventory item                                                                                                                                        		
;enableprobeevent		: '''''probename 0|1'''''							enables/disables NPC probe event (for performance) e.g. enableprobeevent seeplayer 0 -&gt; no more seeplayer events                                                 		
;enablexmphandling		: '''''0/1'''''								enables/disables NPC reacting to XMP items (inert 0/1 sets this to 1/0 use enablexmphandling 0/1 to override this).                                              		
;error				:								used internally                                                                                                                                                  		
;eventdisable			: '''''event'''''								disables event                                                                                                                                                   		
;eventenable			: '''''event'''''								enables event                                                                                                                                                    		
;eventwait			: '''''event'''''								waits until event occurs                                                                                                                                         		
;findactor			: '''''[name Min Max Type Vis Num gotolabel targetlabel]'''''    		searches for actors in level (all args optional)                                                                                                                 		
;fire				: '''''[duration]'''''							fire (weapon / animation-based) for given duration                                                                                                               		
;firealt			: '''''[duration]'''''							alt fire (weapon / animation-based) for given duration                                                                                                           		
;gib				: '''''[bDestroy] [gorelevel]'''''					gib controlled NPC. If gib fails, bDestroy determines if npc is killed or destroyed. Gore level overrides the gibset's default gore level                        		
;giball				: '''''targetclass [bDestroy] [gorelevel]'''''				gib all actors of the given class. . If gib fails, bDestroy determines if npc is killed or destroyed. Gore level overrides the gibset's default gore level       		
;giveinventory			: '''''inventorystring'''''						gives the specified inventory item to the NPC                                                                                                                    		
;giveitemtoplayer		: '''''inventorystring [ammocount]'''''					give item to player, if ammocount treats as ammo and adds this much ammo to player's inventory                                                                   		
;givetosseditem			: '''''inventorystring'''''						add item to tossed items list                                                                                                                                    		
;gotoactor			: '''''targetname [dist [face]]'''''					sends NPC to specifed actor at specified dist (error if target not found), face=1 ==&gt; try to face target (e.g. for initiating dialog)                            		
;gotoactorsafe			: '''''targetname [dist [face]]'''''					sends NPC to specifed actor at specified dist (not an error if target not found), face=1 ==&gt; try to face target (e.g. for initiating dialog)                     		
;gotolabel			: '''''label'''''								jumps to given label                                                                                                                                             		
;incproperty			: '''''name property value [#]'''''					increments (integer) property in named actor by 1 or by #                                                                                                        		

;inert				: '''''0/1'''''								toggles NPC reacting to sensory input &amp;ndash; shorthand for toggling bump, hearnoise, seeplayer, tookdamage                                                           		
;handlergroup			: 								denotes start of a new handler groups (can't be in one currently?)                                                                                               		
;handlergroupend		: 								denotes end of a new handler groups (must be in one currently)                                                                                                   		
;headtracking			: '''''0/1'''''	                                                                                                                                                                                                                      		
;jump				: '''''X Y Z'''''								launch NPC in given direction                                                                                                                                    		
;kill				: 								kill controlled NPC (goes into dying state)                                                                                                                      		
;killall			: '''''targetclass'''''							kill all actors of the given class                                                                                                                               		
;lockstep			: '''''name [f]'''''							maintain given or current distance from named actor (for keeping squads in formation)                                                                            		
;message			: '''''string [0|1|2]'''''						displays the given message in-game (surround with &quot;&quot; for multiple words) 0: onscreen 1: log 2: onscreen and log                                                  		
;onevent			: '''''xxx [gotolabel ### [clear]]'''''					when event xxx occurs, jumps to given label (or disables previous onevent)                                                                                       		
;ontimer			: '''''index [delay repeat gotolabel ###]'''''				adds a general-purpose timer                                                                                                                                     		
;ontrigger			: '''''name [gotolabel ###]'''''						when trigger with given event name occurs, jumps to given label (or disables previous ontrigger)                                                                 		
;playsound			: '''''name sound [slot [volume [bNoOverride [Radius [Pitch]]]]]'''''	plays sound through named actor (or self=controlled NPC)                                                                                                         		
;playsoundwait			: '''''name sound [slot [volume [bNoOverride [Radius [Pitch]]]]]'''''	plays sound through named actor (or self=controlled NPC) and script waits for sound to finish                                                                    		
;playsoundtableslot		: '''''name slot'''''							play sound belonging to the specified group from named pawn's sound table                                                                                        		
;playsoundtableslotwait		: '''''name slot'''''							play sound belonging to the specified group from named pawn's sound table and script waits for sound to finish                                                   		
;removeinventory		: '''''[string]'''''							removes all [or the specified] inventory from the NPC                                                                                                            		
;removeinventoryfromplayer	: '''''[string]'''''							removes all [or the specified] inventory from the player                                                                                                         		
;removeitemfromplayer		: '''''inventorystring'''''						add item to player's inventory                                                                                                                                   		
;removetosseditem		: '''''inventorystring'''''						remove item from tossed items list                                                                                                                               		
;resumepatrol			: '''''startlabel endlabel'''''						finds the &quot;best&quot; destination at which the resume patrolling and jumps to that line                                                                               		
;return				:      								returns to most recently pushed line or script state (error if no applicable)                                                                                    		
;rotate				: '''''#.#'''''								rotate #.# degrees clockwise (right) relative to forward                                                                                                         		
;savedestination		: 								copies GotoActorTarget into SavedDestination for later use with resumepatrol                                                                                     		
;sendevent  			: '''''EventName [triggerpawns]'''''					triggers all Actors with tag that matches given Event, or all NPCs                                                                                               		
;setactorrangetest		: '''''target distance'''''						sets the InRangeActor and InRangeDistance for ActorInRange/ActorOutOfRange events                                                                                		
;setaimodds			: '''''odds'''''								sets odds of hitting target when firing weapon under script control                                                                                              		
;setalert			: '''''0/1'''''								controls whether NPC uses &quot;alert&quot; animations                                                                                                                     		
;setammo			: '''''ammostring amount [maxclip]'''''					makes sure NPC has exactly specified amount of given type of ammo, if maxclip=1 makes sure clip is as full as possible                                           		
;setfocus			: '''''[name]'''''							set scripted focus to given actor or clear focus                                                                                                                 		
;sethealth			: '''''x.x'''''								sets controlled NPC's health to x.x                                                                                                                              		
;setinventory			: '''''targetname inventorystring'''''					sets target's selected inventory to x.x                                                                                                                          		
;setlocation			: '''''locationname [allowfail]'''''					move pawn to location of locationame                                                                                                                             		
;setlocationnamed		: '''''targetname locationname [allowfail]'''''				move actor matching targetname to location of locationame                                                                                                        		
;setlocationvector		: '''''targetname X Y Z'''''						move targetname to given coordinates                                                                                                                             		
;setmovespeed			: '''''speed [stance]'''''						0.01 to MaxDesiredSpeed (usually 1.0) &amp;ndash; set speed used for scripted movement                                                                                    		
;setmovespeedauto		: '''''speed'''''								0.01 to MaxDesiredSpeed (usually 1.0) &amp;ndash; set speed used for autonomous movement                                                                                  		
;setorders			: '''''orders [OrdersObject [fparam [ordergiver]]]''''' 			sets/clears orders                                                                                                                                               		
;setphysics			: '''''physics'''''                                                                                                                                                                                                                     		
;setproperty			: '''''targetname property value'''''  					sets property in named actor to value                                                                                                                            		
;setproperties			: '''''classname property value'''''  					sets given property in all actors which are a classname                                                                                                          		
;setsatellite			: '''''satellitename [targetname]'''''					binds a mesh satellite node of the given name to the given target, for dynamic animations                                                                        		
;setscript			: '''''filename [startlabel]'''''						switches over to the given script [at the given label]                                                                                                           		
;setskill			: '''''skill'''''								set NPC's skill to given value (0.0..1.0)                                                                                                                        		
;setstance			: '''''stand / crouch / prone'''''					specifies stance that NPC should use while patrolling                                                                                                            		
;setstationary			: '''''1/0 [1]'''''							makes NPC immobile/mobile, optionally forever                                                                                                                    		
;settacticalmovetype		: '''''0/1/2'''''								sets tactical move type to use during scripted movement (0: none 1: basic 2: serpentine)                                                                         		
;setweapon			: '''''weaponstring'''''							set NPC's weapon to specified one, spawning it if necessary                                                                                                      		
;shutdown			: '''''1/0'''''								makes NPC as inert as possible without actually making it dormant or removing its controller                                                                     		
;sleep	  			: '''''[x.x]'''''   							puts controller to sleep for x.x seconds (defaults to &quot;forever&quot;)                                                                                                 		
;sleeprand			: '''''[x.x]'''''								puts controller to sleep for random time in 0..x.x seconds (x.x defaults to 1.0)                                                                                 		
;spawn				: '''''targetname S	[1 [filename [startlabel]]]'''''			spawn given actor at targetname's location, if 1 is given, failure = error, optionally gives spawned NPCs a script                                               		
;stop				: 								stops execution, detaches script controller                                                                                                                      		
;stopmovement			: 								stops NPC movement                                                                                                                                               		
;stopsound			: '''''slot	[bStopNoOverrideSounds]'''''					stops any sounds played through the named actor on the specified sound slot                                                                                      		
;testactorinrange		: '''''name distance'''''							if given actor is outside given distance of pawn ==&gt; next command skipped                                                                                        		
;testproperty			: '''''name property value'''''  						property != value ==&gt; next command skipped (string comparison)                                                                                                   		
;testpropertyci			: '''''name property value'''''  						property != value ==&gt; next command skipped (case-insensitive string comparison)                                                                                  		
;testpropertye			: '''''name property value'''''  						property != value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyg			: '''''name property value'''''  						property &lt;= value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyge			: '''''name property value'''''  						property &lt;  value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyl			: '''''name property value'''''  						property &gt;= value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyle			: '''''name property value'''''  						property &gt;  value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testrandom			: '''''float'''''								(if random number in 0.0..1.0 &gt; value ==&gt; next command skipped)                                                                                                  		
;teststate			: '''''name name'''''							(false ==&gt; next command skipped)                                                                                                                                 		
;turntoactor			: '''''targetname [LOS [Lock]]'''''					turn NPC to face named actor, LOS=0 ==&gt; LOS not needed, LOS=1 ==&gt; LOS needed, LOS=2 ==&gt; LOS not needed but turn anyway, Lock means target actor won't be cleared 		
;unuse				: '''''name'''''								unuse the named actor                                                                                                                                            		
;use				: '''''name'''''								use the named actor                                                                                                                                              		
;usepickups			: '''''0/1'''''								if 0, won't go after or pickup pickups                                                                                                                           		
;weaponload			:								load current weapon                                                                                                                                              		
;WeaponSetAmmoType		: '''''ammoname'''''                                                                                                                                                                                                                    		
;WeaponSupportsAltFire		: '''''weaponname 0/1'''''						disables/enables NPC being able to alt fire weapon                                                                                                               		
;WeaponSupportsFire		: '''''weaponname 0/1'''''						disables/enables NPC being able to primary fire weapon                                                                                                           		
                                                                                                

==Events ==
                                                                                                                                                              
;ActorInRange			: 								generated when the InRangeActor comes within the InRangeDistance                       
;ActorOutOfRange		:                                                               generated once when the InRangeActor comes goes out of the InRangeDistance             
;AnimEnd			:                                                               goes to Controller unless Pawn has no Controller (dying state)                         
;AutoBegin			:                                                               goes to Controller, generated by U2NPCControllerScriptable                             
;AutoEnd			:                                                               goes to Controller, generated by Controller  : seems to be used for after fighting conditions                                           
;BumpEnemy			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpFriend			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpOther			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpPlayer			:                                                               not an actual event: eventwait BumpPlayer &amp;ndash;&gt; BumpEnemy/BumpFriend checked for player  
;DestinationReached		:                                                               goes to Controller                                                                     
;DialogBegin	 		:                                                               generated by Controller before destroyed                                               
;DialogUnPause			:                                                               generated when dialog unpauses npc's script                                            
;Died	 			:                                                               generated by Controller before destroyed                                               
;EnemyNotVisible		:                                                               goes to Controller                                                                     
;HearNoiseFriendly		:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseFriendly                                         
;HearNoiseOther			:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseOther                                            
;HearNoiseThreat		:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseThreat                                           
;InheritEnemy			:                                                               generated when NPC could inherit another NPC's Enemy                                   
;ScriptedLanding		:                                                               generated when NPC in scripted state lands (not passed back to NPC)                    
;SeeAlertFriend			:                                                               SeeAlertFriend &amp;ndash;&gt; Controller                                                          
;SeeEnemy			:                                                               SeeEnemy &amp;ndash;&gt; Controller                                                                
;SeeFriend			:                                                               SeeFriend &amp;ndash;&gt; Controller &amp;ndash;&gt; SeeFriend                                                 
;SeeOther			:                                                               SeeOther &amp;ndash;&gt; Controller &amp;ndash;&gt; SeeOther                                                   
;SeePlayer			:                                                               not an actual event: eventwait SeePlayer &amp;ndash;&gt; SeeEnemy/SeeFriend checked for player     
;TakeDamage			:                                                               goes to Pawn                                                                           
;TookDamage			:                                                               eventTakeDamage &amp;ndash;&gt; TookDamage generated by U2NPCControllerScriptable                  
;TookDamageEnemy		:                                                               generated internall from TookDamage for use by scripts only                            
;TookDamageFriend		:                                                               generated internall from TookDamage for use by scripts only                            
;Trigger			:                                                               goes to Pawn then Controller                                                           
 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1372</id>
      <timestamp>2004-02-22T09:48:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>reply to clam</comment>
      <text xml:space="preserve">Commands for [[Legacy:Unreal 2|Unreal 2]]'s [[Legacy:AI Scripting|AI Scripting]] system.

(maybe explain what these are and where to put them? (I'll put that stuff in [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] when I make it))

==Commands ==

;addammo			: '''''ammostring amount [maxclip]'''''					gives N units of specified ammo to NPC, if maxclip=1 makes sure clip is as full as possible                                                                      	
;agentbind			: '''''inputname valuename'''''						sets and locks an agent input to a given value, for characters with agent-driven meshes                                                                          		
;agentcall			: '''''actionname [wait]'''''						calls an agent action of the given name, for characters with agent-driven meshes                                                                                 		
;agentexecute			: '''''actiontext [wait]'''''						compiles and executes a GAL string on-the-fly as if were inside an action, and calls it                                                                          		
;agentunbind			: '''''inputname'''''							unlocks an agent input previously locked and set with AgentBind                                                                                                  		
;animloop			: '''''name [rate tweentime [wait]]'''''					loops specified anim on channel 0                                                                                                                                		
;animloopex			: '''''channel name [rate tweentime [wait]]'''''				loops specified anim on arbitrary channel                                                                                                                        		
;animplay			: '''''name [rate tweentime	[wait]]'''''					plays specified anim on channel 0                                                                                                                                		
;animplayex			: '''''channel name [rate tweentime [wait]]'''''				plays specified anim on arbitrary channel                                                                                                                        		
;animrelease			: 								allow NPC to control anims (currently idle only)                                                                                                                 		
;animtween			: '''''name [tweentime [wait]]'''''					tweens specified anim on channel 0                                                                                                                               		
;animtweenex			: '''''channel name [tweentime [wait]]'''''				tweens specified anim on arbitrary channel                                                                                                                       		
;call				: '''''label'''''								pushes line after current one and jumps to given label                                                                                                           		
;callscript			: '''''scriptname'''''							pushes current script state and switches to specified file                                                                                                       		
;callend  			: 								aborts any previously pushed call (can no longer return)                                                                                                         		
;clearevents  			: 								clears any current onevents                                                                                                                                      		
;cleartimers  			: 								clears any current general timers                                                                                                                                		
;cleartriggers			: 								clears any current ontriggers                                                                                                                                    		
;consolecommand  		: '''''command'''''							executes given console command                                                                                                                                   		
;debugai			: '''''0/1'''''								enables/disables debug AI mode in controlled NPC                                                                                                                 		
;debugaievents			: '''''0/1'''''								enables/disables debug events mode in controlled NPC                                                                                                             		
;debugaiflags			: '''''###'''''								explicitely sets debug AI flags in controlled NPC                                                                                                                		
;debugmode			: '''''flags'''''								enables/disables various debug modes for the script controller                                                                                                   		
;decproperty			: '''''name property value [#]'''''					decrements (integer) property in named actor by 1 or by #                                                                                                        		
;deployinventory		: '''''S [1]'''''								deploy given inventory item [alt deploy it]                                                                                                                      		
;destroy			: 								destroy controlled NPC (and controller)                                                                                                                          		
;dialogdisable			: '''''topicname'''''							disable this dialog node                                                                                                                                         		
;dialogenable			: '''''topicname'''''							enable this dialog node                                                                                                                                          		
;dialogfar			: '''''topicname speaker1 [speaker2]'''''					starts dialog b/w 2 npcs regardless of distance                                                                                                                  		
;dialogfarwait			: '''''topicname speaker1 [speaker2]'''''					waits for dialog b/w 2 npcs to finish                                                                                                                            		
;dialoginitiate			: '''''speaker topicname'''''						tries to initiate given dialog with given target                                                                                                                 		
;dialogterminate		: '''''speaker'''''							tries to remove NPC from dialog                                                                                                                                  		
;directionalpatrol		: '''''0/1'''''								whether NPC faces in direction of patrol destination                                                                                                             		
;dormant			: '''''0/1 [1]'''''							toggle whether NPC (Pawn and Controller) is dormant (bStasis=true and Physics=PHYS_None) [1] means stay dormant even if script removed?                          		
;dropinventory			: '''''S'''''								drop given inventory item                                                                                                                                        		
;enableprobeevent		: '''''probename 0|1'''''							enables/disables NPC probe event (for performance) e.g. enableprobeevent seeplayer 0 -&gt; no more seeplayer events                                                 		
;enablexmphandling		: '''''0/1'''''								enables/disables NPC reacting to XMP items (inert 0/1 sets this to 1/0 use enablexmphandling 0/1 to override this).                                              		
;error				:								used internally                                                                                                                                                  		
;eventdisable			: '''''event'''''								disables event                                                                                                                                                   		
;eventenable			: '''''event'''''								enables event                                                                                                                                                    		
;eventwait			: '''''event'''''								waits until event occurs                                                                                                                                         		
;findactor			: '''''[name Min Max Type Vis Num gotolabel targetlabel]'''''    		searches for actors in level (all args optional)                                                                                                                 		
;fire				: '''''[duration]'''''							fire (weapon / animation-based) for given duration                                                                                                               		
;firealt			: '''''[duration]'''''							alt fire (weapon / animation-based) for given duration                                                                                                           		
;gib				: '''''[bDestroy] [gorelevel]'''''					gib controlled NPC. If gib fails, bDestroy determines if npc is killed or destroyed. Gore level overrides the gibset's default gore level                        		
;giball				: '''''targetclass [bDestroy] [gorelevel]'''''				gib all actors of the given class. . If gib fails, bDestroy determines if npc is killed or destroyed. Gore level overrides the gibset's default gore level       		
;giveinventory			: '''''inventorystring'''''						gives the specified inventory item to the NPC                                                                                                                    		
;giveitemtoplayer		: '''''inventorystring [ammocount]'''''					give item to player, if ammocount treats as ammo and adds this much ammo to player's inventory                                                                   		
;givetosseditem			: '''''inventorystring'''''						add item to tossed items list                                                                                                                                    		
;gotoactor			: '''''targetname [dist [face]]'''''					sends NPC to specifed actor at specified dist (error if target not found), face=1 ==&gt; try to face target (e.g. for initiating dialog)                            		
;gotoactorsafe			: '''''targetname [dist [face]]'''''					sends NPC to specifed actor at specified dist (not an error if target not found), face=1 ==&gt; try to face target (e.g. for initiating dialog)                     		
;gotolabel			: '''''label'''''								jumps to given label                                                                                                                                             		
;incproperty			: '''''name property value [#]'''''					increments (integer) property in named actor by 1 or by #                                                                                                        		

;inert				: '''''0/1'''''								toggles NPC reacting to sensory input &amp;ndash; shorthand for toggling bump, hearnoise, seeplayer, tookdamage                                                           		
;handlergroup			: 								denotes start of a new handler groups (can't be in one currently?)                                                                                               		
;handlergroupend		: 								denotes end of a new handler groups (must be in one currently)                                                                                                   		
;headtracking			: '''''0/1'''''	                                                                                                                                                                                                                      		
;jump				: '''''X Y Z'''''								launch NPC in given direction                                                                                                                                    		
;kill				: 								kill controlled NPC (goes into dying state)                                                                                                                      		
;killall			: '''''targetclass'''''							kill all actors of the given class                                                                                                                               		
;lockstep			: '''''name [f]'''''							maintain given or current distance from named actor (for keeping squads in formation)                                                                            		
;message			: '''''string [0|1|2]'''''						displays the given message in-game (surround with &quot;&quot; for multiple words) 0: onscreen 1: log 2: onscreen and log                                                  		
;onevent			: '''''xxx [gotolabel ### [clear]]'''''					when event xxx occurs, jumps to given label (or disables previous onevent)                                                                                       		
;ontimer			: '''''index [delay repeat gotolabel ###]'''''				adds a general-purpose timer                                                                                                                                     		
;ontrigger			: '''''name [gotolabel ###]'''''						when trigger with given event name occurs, jumps to given label (or disables previous ontrigger)                                                                 		
;playsound			: '''''name sound [slot [volume [bNoOverride [Radius [Pitch]]]]]'''''	plays sound through named actor (or self=controlled NPC)                                                                                                         		
;playsoundwait			: '''''name sound [slot [volume [bNoOverride [Radius [Pitch]]]]]'''''	plays sound through named actor (or self=controlled NPC) and script waits for sound to finish                                                                    		
;playsoundtableslot		: '''''name slot'''''							play sound belonging to the specified group from named pawn's sound table                                                                                        		
;playsoundtableslotwait		: '''''name slot'''''							play sound belonging to the specified group from named pawn's sound table and script waits for sound to finish                                                   		
;removeinventory		: '''''[string]'''''							removes all [or the specified] inventory from the NPC                                                                                                            		
;removeinventoryfromplayer	: '''''[string]'''''							removes all [or the specified] inventory from the player                                                                                                         		
;removeitemfromplayer		: '''''inventorystring'''''						add item to player's inventory                                                                                                                                   		
;removetosseditem		: '''''inventorystring'''''						remove item from tossed items list                                                                                                                               		
;resumepatrol			: '''''startlabel endlabel'''''						finds the &quot;best&quot; destination at which the resume patrolling and jumps to that line                                                                               		
;return				:      								returns to most recently pushed line or script state (error if no applicable)                                                                                    		
;rotate				: '''''#.#'''''								rotate #.# degrees clockwise (right) relative to forward                                                                                                         		
;savedestination		: 								copies GotoActorTarget into SavedDestination for later use with resumepatrol                                                                                     		
;sendevent  			: '''''EventName [triggerpawns]'''''					triggers all Actors with tag that matches given Event, or all NPCs                                                                                               		
;setactorrangetest		: '''''target distance'''''						sets the InRangeActor and InRangeDistance for ActorInRange/ActorOutOfRange events                                                                                		
;setaimodds			: '''''odds'''''								sets odds of hitting target when firing weapon under script control                                                                                              		
;setalert			: '''''0/1'''''								controls whether NPC uses &quot;alert&quot; animations                                                                                                                     		
;setammo			: '''''ammostring amount [maxclip]'''''					makes sure NPC has exactly specified amount of given type of ammo, if maxclip=1 makes sure clip is as full as possible                                           		
;setfocus			: '''''[name]'''''							set scripted focus to given actor or clear focus                                                                                                                 		
;sethealth			: '''''x.x'''''								sets controlled NPC's health to x.x                                                                                                                              		
;setinventory			: '''''targetname inventorystring'''''					sets target's selected inventory to x.x                                                                                                                          		
;setlocation			: '''''locationname [allowfail]'''''					move pawn to location of locationame                                                                                                                             		
;setlocationnamed		: '''''targetname locationname [allowfail]'''''				move actor matching targetname to location of locationame                                                                                                        		
;setlocationvector		: '''''targetname X Y Z'''''						move targetname to given coordinates                                                                                                                             		
;setmovespeed			: '''''speed [stance]'''''						0.01 to MaxDesiredSpeed (usually 1.0) &amp;ndash; set speed used for scripted movement                                                                                    		
;setmovespeedauto		: '''''speed'''''								0.01 to MaxDesiredSpeed (usually 1.0) &amp;ndash; set speed used for autonomous movement                                                                                  		
;setorders			: '''''orders [OrdersObject [fparam [ordergiver]]]''''' 			sets/clears orders                                                                                                                                               		
;setphysics			: '''''physics'''''                                                                                                                                                                                                                     		
;setproperty			: '''''targetname property value'''''  					sets property in named actor to value                                                                                                                            		
;setproperties			: '''''classname property value'''''  					sets given property in all actors which are a classname                                                                                                          		
;setsatellite			: '''''satellitename [targetname]'''''					binds a mesh satellite node of the given name to the given target, for dynamic animations                                                                        		
;setscript			: '''''filename [startlabel]'''''						switches over to the given script [at the given label]                                                                                                           		
;setskill			: '''''skill'''''								set NPC's skill to given value (0.0..1.0)                                                                                                                        		
;setstance			: '''''stand / crouch / prone'''''					specifies stance that NPC should use while patrolling                                                                                                            		
;setstationary			: '''''1/0 [1]'''''							makes NPC immobile/mobile, optionally forever                                                                                                                    		
;settacticalmovetype		: '''''0/1/2'''''								sets tactical move type to use during scripted movement (0: none 1: basic 2: serpentine)                                                                         		
;setweapon			: '''''weaponstring'''''							set NPC's weapon to specified one, spawning it if necessary                                                                                                      		
;shutdown			: '''''1/0'''''								makes NPC as inert as possible without actually making it dormant or removing its controller                                                                     		
;sleep	  			: '''''[x.x]'''''   							puts controller to sleep for x.x seconds (defaults to &quot;forever&quot;)                                                                                                 		
;sleeprand			: '''''[x.x]'''''								puts controller to sleep for random time in 0..x.x seconds (x.x defaults to 1.0)                                                                                 		
;spawn				: '''''targetname S	[1 [filename [startlabel]]]'''''			spawn given actor at targetname's location, if 1 is given, failure = error, optionally gives spawned NPCs a script                                               		
;stop				: 								stops execution, detaches script controller                                                                                                                      		
;stopmovement			: 								stops NPC movement                                                                                                                                               		
;stopsound			: '''''slot	[bStopNoOverrideSounds]'''''					stops any sounds played through the named actor on the specified sound slot                                                                                      		
;testactorinrange		: '''''name distance'''''							if given actor is outside given distance of pawn ==&gt; next command skipped                                                                                        		
;testproperty			: '''''name property value'''''  						property != value ==&gt; next command skipped (string comparison)                                                                                                   		
;testpropertyci			: '''''name property value'''''  						property != value ==&gt; next command skipped (case-insensitive string comparison)                                                                                  		
;testpropertye			: '''''name property value'''''  						property != value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyg			: '''''name property value'''''  						property &lt;= value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyge			: '''''name property value'''''  						property &lt;  value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyl			: '''''name property value'''''  						property &gt;= value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testpropertyle			: '''''name property value'''''  						property &gt;  value ==&gt; next command skipped (numerical comparison)                                                                                                		
;testrandom			: '''''float'''''								(if random number in 0.0..1.0 &gt; value ==&gt; next command skipped)                                                                                                  		
;teststate			: '''''name name'''''							(false ==&gt; next command skipped)                                                                                                                                 		
;turntoactor			: '''''targetname [LOS [Lock]]'''''					turn NPC to face named actor, LOS=0 ==&gt; LOS not needed, LOS=1 ==&gt; LOS needed, LOS=2 ==&gt; LOS not needed but turn anyway, Lock means target actor won't be cleared 		
;unuse				: '''''name'''''								unuse the named actor                                                                                                                                            		
;use				: '''''name'''''								use the named actor                                                                                                                                              		
;usepickups			: '''''0/1'''''								if 0, won't go after or pickup pickups                                                                                                                           		
;weaponload			:								load current weapon                                                                                                                                              		
;WeaponSetAmmoType		: '''''ammoname'''''                                                                                                                                                                                                                    		
;WeaponSupportsAltFire		: '''''weaponname 0/1'''''						disables/enables NPC being able to alt fire weapon                                                                                                               		
;WeaponSupportsFire		: '''''weaponname 0/1'''''						disables/enables NPC being able to primary fire weapon                                                                                                           		
                                                                                                

==Events ==
                                                                                                                                                              
;ActorInRange			: 								generated when the InRangeActor comes within the InRangeDistance                       
;ActorOutOfRange		:                                                               generated once when the InRangeActor comes goes out of the InRangeDistance             
;AnimEnd			:                                                               goes to Controller unless Pawn has no Controller (dying state)                         
;AutoBegin			:                                                               goes to Controller, generated by U2NPCControllerScriptable                             
;AutoEnd			:                                                               goes to Controller, generated by Controller  : seems to be used for after fighting conditions                                           
;BumpEnemy			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpFriend			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpOther			:                                                               NotifyBump &amp;ndash;&gt; Controller &amp;ndash;&gt; BumpEnemy/Friend/Other                                   
;BumpPlayer			:                                                               not an actual event: eventwait BumpPlayer &amp;ndash;&gt; BumpEnemy/BumpFriend checked for player  
;DestinationReached		:                                                               goes to Controller                                                                     
;DialogBegin	 		:                                                               generated by Controller before destroyed                                               
;DialogUnPause			:                                                               generated when dialog unpauses npc's script                                            
;Died	 			:                                                               generated by Controller before destroyed                                               
;EnemyNotVisible		:                                                               goes to Controller                                                                     
;HearNoiseFriendly		:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseFriendly                                         
;HearNoiseOther			:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseOther                                            
;HearNoiseThreat		:                                                               HearNoise &amp;ndash;&gt; Controller &amp;ndash;&gt; HearNoiseThreat                                           
;InheritEnemy			:                                                               generated when NPC could inherit another NPC's Enemy                                   
;ScriptedLanding		:                                                               generated when NPC in scripted state lands (not passed back to NPC)                    
;SeeAlertFriend			:                                                               SeeAlertFriend &amp;ndash;&gt; Controller                                                          
;SeeEnemy			:                                                               SeeEnemy &amp;ndash;&gt; Controller                                                                
;SeeFriend			:                                                               SeeFriend &amp;ndash;&gt; Controller &amp;ndash;&gt; SeeFriend                                                 
;SeeOther			:                                                               SeeOther &amp;ndash;&gt; Controller &amp;ndash;&gt; SeeOther                                                   
;SeePlayer			:                                                               not an actual event: eventwait SeePlayer &amp;ndash;&gt; SeeEnemy/SeeFriend checked for player     
;TakeDamage			:                                                               goes to Pawn                                                                           
;TookDamage			:                                                               eventTakeDamage &amp;ndash;&gt; TookDamage generated by U2NPCControllerScriptable                  
;TookDamageEnemy		:                                                               generated internall from TookDamage for use by scripts only                            
;TookDamageFriend		:                                                               generated internall from TookDamage for use by scripts only                            
;Trigger			:                                                               goes to Pawn then Controller                                                           
 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AIController</title>
    <id>410</id>
    <revision>
      <id>1359</id>
      <timestamp>2005-12-07T22:43:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; AIController}}

This is the parent class of all AI-based [[Legacy:Controller|controller]]s.

==Properties ==
; bool bHunting : This is true if the controlled [[Legacy:Pawn|pawn]] is hunting another [[Legacy:Pawn|pawn]].
; bool bAdjustFromWalls : Auto-adjust around corners, with no hitwall notification for [[Legacy:Controller|controller]] or [[Legacy:Pawn|pawn]] (???)
; [[Legacy:AIScript|AIScript]] MyScript : The AIScript that controls this AIController.
; float Skill : The skill of the AI. Generally, from 0 to 7.

==Functions ==
; WaitToSeeEnemy() (native, final, latent) : Returns when the [[Legacy:Pawn|pawn]] is looking directly at a visible enemy.
; bool WeaponFireAgain( float RefireRate, bool bFinishedFire ) : Called by [[Legacy:Weapon|Weapon]]. Returns true if the weapon should fire.
; bool TriggerScript( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Any trigger is sent to this function, which in turn triggers MyScript if it exists.
; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) : If the &quot;showdebug&quot; console command is on, this is called to display debug information on the screen.
; float AdjustDesireFor( [[Legacy:Pickup|Pickup]] P ) : In subclasses, returns a float indicating how much the AI wants the [[Legacy:Pickup|Pickup]] P. In this class, it always returns 0.
; int GetFacingDirection() : Returns direction faced relative to movement dir, where 0 = forward, 16384 = right, 32768 = back, and 49152 = left
; AdjustView( float DeltaTime ) : Called if Controller's pawn is the viewtarget of a player
; SetOrders( name NewOrders, [[Legacy:Controller|Controller]] OrderGiver ) :
; Actor GetOrderObject():
; name GetOrders() : In subclasses, sets and gets info about the AI's orders, but in this class they don't do anything.
; WaitForMover( [[Legacy:Mover|Mover]] M ) : Sets up the AI to wait for Mover M to tell the AI that it has completed its move. Sets PendingMover.
; MoverFinished() : Called by Mover when it finishes a move, and this pawn has the mover set as its PendingMover.
; UnderLift( [[Legacy:Mover|Mover]] M ) : Called by mover when it hits a pawn with that mover as its pendingmover while moving to its destination.
; bool PriorityObjective() : This always returns false here.
; Startle( [[Legacy:Actor|Actor]] A ) : &quot;Startles&quot; the AI. Basically, this is a message to the AI to stop everything and re-evaluate its situation as soon as possible. Something calls this when the AI absolutely needs to know about it RIGHT NOW.  The Actor A being the cause of the startle.

==Events==
; PrepareForMove( [[Legacy:NavigationPoint|NavigationPoint]] Goal, [[Legacy:ReachSpec|ReachSpec]] Path ) : Called if the reachspec doesn't support the pawn's current configuration. The code should tell the Pawn what to do to deal with it (e.g. crouch). It's implemented in subclasses; here it doesn't do anything.

==Known Subclasses==
 AIController
   +- [[Legacy:ScriptedController|ScriptedController]]
   |   +- [[Legacy:Bot|Bot]]
   |   |   +- [[Legacy:XBot|xBot]]
   |   |       +- [[Legacy:InvasionBot|InvasionBot]] (Epic Bonuspack &amp; UT2004)
   |   +- [[Legacy:MonsterController|MonsterController]] (Epic Bonuspack &amp; UT2004)
   |   +- [[Legacy:ScriptedTriggerController|ScriptedTriggerController]]
   +- [[Legacy:TurretController|TurretController]] (UT2004)
       +- [[Legacy:LinkTurretController|LinkTurretController]]
       +- [[Legacy:ONSTurretController|ONSTurretController]]
       +- [[Legacy:SentinelController|SentinelController]]
            +- [[Legacy:ASSentinelController|ASSentinelController]]

==Relevant Links==
* [[Legacy:AIScript|AIScript]]
* [[Legacy:AI Scripting Reference|AI Scripting Reference]]
* [[Legacy:Controller Overview|Controller Overview]]
* [[Legacy:PlayerController|PlayerController]] &amp;ndash; Controllers for player characters

==Discussion==

'''SuperApe:''' Updated known subclasses.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1360</id>
      <timestamp>2003-03-14T13:21:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>more subclasses</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; AIController}}

This is the parent class of all AI-based [[Legacy:Controller|controller]]s.

==Properties ==
;bool bHunting : This is true if the controlled [[Legacy:Pawn|pawn]] is hunting another [[Legacy:Pawn|pawn]].
;bool bAdjustFromWalls : auto-adjust around corners, with no hitwall notification for [[Legacy:Controller|controller]] or [[Legacy:Pawn|pawn]] (???)
;AIScript MyScript : If this [[Legacy:AIController|AIController]] is based on a script, the script is in this variable.
;float Skill : The skill of the AI. Generally, from 0 to 7.

==Functions ==
;native final latent function WaitToSeeEnemy() : returns when the [[Legacy:Pawn|pawn]] is looking directly at a visible enemy.
;function bool WeaponFireAgain(float RefireRate, bool bFinishedFire) : called by [[Legacy:Weapon|Weapon]]. Returns true if the weapon should fire.
;function bool TriggerScript(actor Other, pawn EventInstigator) : Any trigger is sent to this function, which in turn triggers MyScript if it exists.
;function DisplayDebug(Canvas Canvas, out float YL, out float YPos) : If the &quot;showdebug&quot; console command is on, this is called to display debug information on the screen.
;function float AdjustDesireFor(Pickup P) : In subclasses, returns a float indicating how much the AI wants the [[Legacy:Pickup|Pickup]] P. In this class, it always returns 0.
;function int GetFacingDirection() : returns direction faced relative to movement dir, where 0 = forward, 16384 = right, 32768 = back, and 49152 = left
;function AdjustView(float DeltaTime) : called if Controller's pawn is the viewtarget of a player
;function SetOrders(name NewOrders, Controller OrderGiver), function actor GetOrderObject(), function name GetOrders() : In subclasses, sets and gets info about the AI's orders, but in this class they don't do anything.
;event PrepareForMove(NavigationPoint Goal, ReachSpec Path) : Called if the reachspec doesn't support the pawn's current configuration. The code should tell the [[Legacy:Pawn|pawn]] what to do to deal with it (e.g. crouch). It's implemented in subclasses; here it doesn't do anything.
;function WaitForMover(Mover M) : Sets up the AI to wait for Mover M to tell the AI that it has completed its move. Sets PendingMover.
;function MoverFinished() : Called by Mover when it finishes a move, and this pawn has the mover set as its PendingMover.
;function UnderLift(Mover M) : called by mover when it hits a pawn with that mover as its pendingmover while moving to its destination.
;function bool PriorityObjective() : This always returns false here.
;function Startle(Actor A) : &quot;Startles&quot; the AI. Basically, this is a message to the AI to stop everything and re-evaluate its situation as soon as possible. Something calls this when the AI absolutely needs to know about it RIGHT NOW.

==Subclasses ==
 +-[[Legacy:AIController|AIController]]
     +-[[Legacy:ScriptedController|ScriptedController]]
         +-[[Legacy:Bot|Bot]]
         |   +-[[Legacy:XBot|xBot]]
         |       +-[[Legacy:InvasionBot|InvasionBot]] ''(Epic Bonuspack)''
         +-[[Legacy:MonsterController|MonsterController]] ''(Epic Bonuspack)''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AIMarker</title>
    <id>28411</id>
    <revision>
      <id>40083</id>
      <timestamp>2009-11-15T08:27:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AIScript</title>
    <id>402</id>
    <revision>
      <id>1340</id>
      <timestamp>2005-12-18T00:56:28Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; AIScript}}

Used by Level Designers to specify special AI scripts for pawns placed in a level, and to change which type of AI controller to use for a pawn.  AIScripts can be shared by one or many pawns.  Game specific subclasses of AIScript will have editable properties defining game specific behavior and AI.  This is the base class for [[Legacy:ScriptedSequence|ScriptedSequence]].

==Properties==

===Main===
; class&lt;[[Legacy:AIController|AIController]]&gt; ControllerClass :

===Hidden===
; bool bNavigate : If true, put an associated path in the navigation network
; bool bLoggingEnabled :	
; [[Legacy:AIMarker|AIMarker]] myMarker : The [[Legacy:NavigationPoint|NavigationPoint]] created when bot paths are built

==Functions==

(incomplete)
; SpawnControllerFor([[Legacy:Pawn|Pawn]] P) : Spawn and initialize an AI Controller (called by a non-player controlled Pawn at level startup)  This sets the &lt;tt&gt;Controller.MyScript&lt;/tt&gt; property and calls &lt;tt&gt;Controller.Possess&lt;/tt&gt;
; GetMoveTarget() : Returns the myMarker property as an Actor 

==Known Subclasses==
* [[Legacy:ScriptedSequence|ScriptedSequence]]
** [[Legacy:ScriptedTrigger|ScriptedTrigger]]
** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Related Topics==
* [[Legacy:AIController|AIController]]
** [[Legacy:ScriptedController|ScriptedController]]
*** [[Legacy:Bot|Bot]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic for all AI
** [[Legacy:Bot Support|Bot Support]] &amp;ndash; Hub for bot support
*** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and element of a bot path network
*** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Hub for monster support
*** [[Legacy:AI Scripting Reference|AI Scripting Reference]]
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Hub for NPC support

==Discussion==

'''SuperApe:''' Filled in properties and functions.  Linked up.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1341</id>
      <timestamp>2003-02-20T07:13:53Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; AIScript}}

Used by Level Designers to specify special AI scripts for pawns  placed in a level, and to change which type of AI controller to use for a pawn. AIScripts can be shared by one or many pawns.  Game specific subclasses of AIScript will have editable properties defining game specific behavior and AI.

Scripted sequences are sort of like macros in Microsoft Access:  They are built up from preset actions which can have parameters. The actual &quot;actions&quot; are the subclasses of [[Legacy:ScriptedAction|ScriptedAction]], and their class names all start with &quot;Action_...&quot;.

* Place [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] actors in your map to have defending or freelancing bots automatically follow certain scripted orders.
* Use [[Legacy:ScriptedTrigger|ScriptedTrigger]] actors to execute stand-alone scripts.

There are even simple means for flow control available within a scripted sequence (see below).

See [[udn2:ScriptedSequenceActions|UDN: ScriptedSequenceActions]] for additional information.

==Available Actions==

* '''Latent actions''' stop the execution flow of the scripted sequence until their task has been finished.

* Several actions by design can't be used with a [[Legacy:ScriptedTrigger|ScriptedTrigger]].  They're marked separately below.

===Environment Control===

{|

|-
|'''Action Class'''
|'''Latent?'''
|'''ScriptedTrigger?'''
|'''Purpose''' 
|-
|[[Legacy:ACTION_ChangeLevel|ACTION_ChangeLevel]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Sends the server to another level.
|-
|[[Legacy:ACTION_DestroyActor|ACTION_DestroyActor]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Destroys all [[Legacy:Actor|Actor]]s with a given [[Legacy:Tag|Tag]].
|-
|[[Legacy:ACTION_PlayAmbientSound|ACTION_PlayAmbientSound]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Plays an ambient sound.
|-
|[[Legacy:ACTION_SetCorona|ACTION_SetCorona]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Sets the bCorona property for all [[Legacy:Actor|Actor]]s with a given [[Legacy:Tag|Tag]].
|-
|[[Legacy:ACTION_SetHidden|ACTION_SetHidden]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Sets the bHidden property for all [[Legacy:Actor|Actor]]s with a given [[Legacy:Tag|Tag]].
|-
|[[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Spawns an [[Legacy:Actor|Actor]].
|-
|[[Legacy:ACTION_TriggerEvent|ACTION_TriggerEvent]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Fires the given [[Legacy:Event|Event]].
|}

===Player Control===

====General====

{|

|-
|'''Action Class'''
|'''Latent?'''
|'''ScriptedTrigger?'''
|'''Purpose''' 
|-
|[[Legacy:Action_ConsoleCommand|Action_ConsoleCommand]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Executes a console command on the server for the instigator.
|-
|[[Legacy:ACTION_DamageInstigator|ACTION_DamageInstigator]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Inflicts damage on the instigator.
|-
|[[Legacy:ACTION_DestroyPawn|ACTION_DestroyPawn]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Destroys the instigator's [[Legacy:Pawn|Pawn]].
|-
|[[Legacy:ACTION_ForceMoveToPoint|ACTION_ForceMoveToPoint]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Instantaneously moves the instigator to the specified point.
|-
|[[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Kills the instigator with a given [[Legacy:DamageType|DamageType]].
|-
|[[Legacy:ACTION_PlaySound|ACTION_PlaySound]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Plays a sound.
|-
|[[Legacy:ACTION_SetPhysics|ACTION_SetPhysics]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Sets the instigator's physics mode.
|-
|[[Legacy:ACTION_TeleportToPoint|ACTION_TeleportToPoint]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Instantly teleports the instigator to a given destination, optionally displaying a respawn/teleportation effect.
|}

====Human Players====

{|

|-
|'''Action Class'''
|'''Latent?'''
|'''ScriptedTrigger?'''
|'''Purpose''' 
|-
|[[Legacy:ACTION_DisplayMessage|ACTION_DisplayMessage]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Sends a message to the instigator or all players.
|-
|[[Legacy:ACTION_FadeView|ACTION_FadeView]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |'''Yes'''
|Fades the instigator's view to a given constant color.
|-
|[[Legacy:ACTION_GotoMenu|ACTION_GotoMenu]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Opens a given menu on the first found human player's screen.
|-
|[[Legacy:ACTION_LocalizedMessage|ACTION_LocalizedMessage]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Displays a certain [[Legacy:LocalMessage|LocalMessage]] on the instigator's screen.
|-
|[[Legacy:ACTION_PlayLocalSound|ACTION_PlayLocalSound]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Plays a sound for all human players in the game.
|-
|[[Legacy:ACTION_PlayMusic|ACTION_PlayMusic]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Sets the music for either the instigator only or all human players in the game.
|}

====ScriptedControllers and Bots====

{|

|-
|'''Action Class'''
|'''Latent?'''
|'''ScriptedTrigger?'''
|'''Purpose''' 
|-
|[[Legacy:ACTION_ChangeTeam|ACTION_ChangeTeam]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Changes the instigator's team.
|-
|[[Legacy:ACTION_ChangeWeapon|ACTION_ChangeWeapon]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Changes the instigator's [[Legacy:Weapon|Weapon]] (if present in his/her inventory).
|-
|[[Legacy:ACTION_Crouch|ACTION_Crouch]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Tells the instigator to start crouching (as opposed to walking or running).
|-
|[[Legacy:ACTION_FinishRotation|ACTION_FinishRotation]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |'''Yes'''
|Waits until the instigator has finished rotating towards its goal.
|-
|[[Legacy:ACTION_FireWeapon|ACTION_FireWeapon]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Tells the instigator to fire its current weapon.
|-
|[[Legacy:ACTION_Freeze|ACTION_Freeze]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |'''Yes'''
|Freezes the instigator.
|-
|[[Legacy:ACTION_FreezeOnAnimEnd|ACTION_FreezeOnAnimEnd]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Freezes the instigator after its current animation has ended.
|-
|[[Legacy:ACTION_Jump|ACTION_Jump]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Makes the instigator jump or dodge.
|-
|[[Legacy:ACTION_MoveToPlayer|ACTION_MoveToPlayer]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |No
|Makes the instigator go to its associated player.
|-
|[[Legacy:ACTION_MoveToPoint|ACTION_MoveToPoint]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |No
|Makes the instigator go to a specified [[Legacy:Actor|Actor]] specified by its [[Legacy:Tag|Tag]], or the UnrealScriptedSequence actor's location itself if none is specified.
|-
|[[Legacy:ACTION_PlayAnim|ACTION_PlayAnim]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Plays an animation for the instigator.
|-
|[[Legacy:ACTION_Run|ACTION_Run]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Tells the instigator to start running (as opposed to walking or crouching).
|-
|[[Legacy:ACTION_SetAlertness|ACTION_SetAlertness]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Sets the instigator's alertness.
|-
|[[Legacy:ACTION_SetViewTarget|ACTION_SetViewTarget]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Tells the instigator to focus on the actor specified by a given [[Legacy:Tag|Tag]].
|-
|[[Legacy:ACTION_ShootTarget|ACTION_ShootTarget]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Tells the instigator to start shooting its current target.
|-
|[[Legacy:ACTION_StopAnimation|ACTION_StopAnimation]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Stops the instigator's current animation.
|-
|[[Legacy:ACTION_StopShooting|ACTION_StopShooting]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Tells the instigator to stop shooting its current target.
|-
|[[Legacy:ACTION_ThrowWeapon|ACTION_ThrowWeapon]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Tells the instigator to throw its weapon.
|-
|[[Legacy:ACTION_TurnTowardPlayer|ACTION_TurnTowardPlayer]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Tells the instigator to turn towards its associated player.
|-
|[[Legacy:ACTION_Walk|ACTION_Walk]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Tells the instigator to start walking (as opposed to running or crouching).
|}

===Flow Control===

* Scripted sequences can contain '''conditional blocks.'''  A conditional block starts with an [[Legacy:ACTION_IfCondition|ACTION_IfCondition]] or an [[Legacy:ACTION_IfRandomPct|ACTION_IfRandomPct]] and ends at an [[Legacy:ACTION_EndSection|ACTION_EndSection]].  Blocks can be nested.

* There is support for '''loops''' built into the code, but no scripted action that exposes that functionality in UnrealEd.

{|

|-
|'''Action Class'''
|'''Latent?'''
|'''ScriptedTrigger?'''
|'''Purpose''' 
|-
|[[Legacy:ACTION_ChangeScript|ACTION_ChangeScript]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |No
|Continues execution with a different script.
|-
|[[Legacy:ACTION_EndSection|ACTION_EndSection]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Marks the end of a section of script actions.
|-
|[[Legacy:ACTION_GotoAction|ACTION_GotoAction]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Jumps to a given action number within the current sequence.
|-
|[[Legacy:ACTION_IfCondition|ACTION_IfCondition]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Skips all actions up to the next [[ACTION_EndSection
|section end]] unless a given [[Legacy:TriggeredCondition|TriggeredCondition]] is enabled.
|-
|[[Legacy:ACTION_IfRandomPct|ACTION_IfRandomPct]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Skips all actions up to the next [[ACTION_EndSection
|section end]] with a given probability.
|-
|[[Legacy:ACTION_LeaveSequence|ACTION_LeaveSequence]]
| style=&quot;text-align: center&quot; |No
| style=&quot;text-align: center&quot; |'''Yes'''
|Stops this scripted sequence.
|-
|[[Legacy:ACTION_WaitForAnimend|ACTION_WaitForAnimend]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |No
|Waits until the instigator's current animation has ended.
|-
|[[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |'''Yes'''
|Waits until the given [[Legacy:Event|Event]] has been fired.
|-
|[[Legacy:ACTION_WaitForPlayer|ACTION_WaitForPlayer]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |No
|Waits until the instigator is within a given distance of its associated player.
|-
|[[Legacy:ACTION_WaitForTimer|ACTION_WaitForTimer]]
| style=&quot;text-align: center&quot; |'''Yes'''
| style=&quot;text-align: center&quot; |'''Yes'''
|Waits until a given number of seconds has elapsed.
|}

==Known Subclasses ==

 AIScript
   +-[[Legacy:ScriptedSequence|ScriptedSequence]]
         +-[[Legacy:ScriptedTrigger|ScriptedTrigger]]
         +-[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Tutorials ==
*[[Legacy:Creating A Defense Point In UT2003|Creating A Defense Point in UT2003]]

==Related Topics ==
* [[Legacy:PlayerController|PlayerController]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1342</id>
      <timestamp>2005-11-02T01:00:18Z</timestamp>
      <contributor>
        <ip>Pool1418.cvx6-bradley.dialup.earthlink.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; AIScript}}

Base class for [[Legacy:ScriptedSequence|ScriptedSequence]].

==Known Subclasses ==

* [[Legacy:ScriptedSequence|ScriptedSequence]]

==Related Topics ==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Strategic Bots|Strategic Bots]]
* [[Legacy:PlayerController|PlayerController]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AS</title>
    <id>355</id>
    <revision>
      <id>1226</id>
      <timestamp>2002-09-11T11:50:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>redirected to Assault</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Assault|Assault]]</text>
    </revision>
    <revision>
      <id>1227</id>
      <timestamp>2002-09-11T10:00:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>AS, CTF, DM and DOM instead of their full names or class names?</comment>
      <text xml:space="preserve">===Introduction===

''Assault (AS):'' Standard Unreal Tournament [[Legacy:Gametypes|game type]]. One team assaults a base guarded by the other team and has to fulfill a given number of tasks within limited time; the other team has to prevent that. After a round has ended (because the assaulting team has completed its mission or the time ran out), assaulters and defenders switch positions.

====Overview of the Code===

Assault works quite simply by knowing whether the game is in the first or second half and then restarting the same level if the first half has finished or traveling on to the next map in the normal way.  The way assault manages to remember which half it's in, despite completely reloading the map (and hence all the variables in the gametype or anywhere else in the map for that matter) is to save the variables to a config file, which of course are loded next time the gametype is used.

===Assault Functions===

; InitGame : Mainly calls the super of itself, but apart from setting end camera shot from the forts and a few other things, sets the remaining time to be that of the captured time in the case of the second half, unless the first half was not won.

; FindPlayerStart : Defenders always start on team 0 labelled starts and attackers on team 1.  Any other team numbers are changed to 0.  This function, most simply, looks to see whether it's the first or second half and then takes the team numbers of the attackers and of the defenders.  It then observes to see what team the player passed to it comes from.  Then, the code calls the Super ([[Legacy:TeamGamePlus|TeamGamePlus]]) version of itself but passes none as the pawn.  With a none call, the super function gets the team number from the InTeam optional variable.  The InTeam variable passed is adjusted for whether the player is now an attacker or a defender (0 if defender and 1 if attacker).  Thus, in the second half, the players who were on one team now start from the player starts of the other team.  This is how the function swaps the teams.

; RestartGame : Restarts the game.  If called from the first half, the function sets certain settings including the victory time (if there was one) and whether the first half met with success and saves them in a config file before calling Level.ServerTravel(&quot;?Resart, false) to restart the level.  If it isn't the first half, the function calls ResetGame() which resets all the changed config variables back to their defaults ready for the next game.

===Other links===

*[[Legacy:Mapping_For_AS|Mapping_For_AS]]

==Discussion==

'''Wormbo:''' The useful information from this page should be moved to [[Legacy:Assault|Assault]] or [[Legacy:Mapping For AS|Mapping For AS]] and this page should be either deleted or rewritten for non-coding readers. This also goes for the [[Legacy:DM|DM]], [[Legacy:CTF|CTF]] and [[Legacy:DOM|DOM]] pages.</text>
    </revision>
    <revision>
      <id>1228</id>
      <timestamp>2002-09-11T10:24:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>i agree</comment>
      <text xml:space="preserve">===Introduction===

''Assault (AS):'' Standard Unreal Tournament [[Legacy:Gametypes|game type]]. One team assaults a base guarded by the other team and has to fulfill a given number of tasks within limited time; the other team has to prevent that. After a round has ended (because the assaulting team has completed its mission or the time ran out), assaulters and defenders switch positions.

====Overview of the Code===

Assault works quite simply by knowing whether the game is in the first or second half and then restarting the same level if the first half has finished or traveling on to the next map in the normal way.  The way assault manages to remember which half it's in, despite completely reloading the map (and hence all the variables in the gametype or anywhere else in the map for that matter) is to save the variables to a config file, which of course are loded next time the gametype is used.

===Assault Functions===

; InitGame : Mainly calls the super of itself, but apart from setting end camera shot from the forts and a few other things, sets the remaining time to be that of the captured time in the case of the second half, unless the first half was not won.

; FindPlayerStart : Defenders always start on team 0 labelled starts and attackers on team 1.  Any other team numbers are changed to 0.  This function, most simply, looks to see whether it's the first or second half and then takes the team numbers of the attackers and of the defenders.  It then observes to see what team the player passed to it comes from.  Then, the code calls the Super ([[Legacy:TeamGamePlus|TeamGamePlus]]) version of itself but passes none as the pawn.  With a none call, the super function gets the team number from the InTeam optional variable.  The InTeam variable passed is adjusted for whether the player is now an attacker or a defender (0 if defender and 1 if attacker).  Thus, in the second half, the players who were on one team now start from the player starts of the other team.  This is how the function swaps the teams.

; RestartGame : Restarts the game.  If called from the first half, the function sets certain settings including the victory time (if there was one) and whether the first half met with success and saves them in a config file before calling Level.ServerTravel(&quot;?Resart, false) to restart the level.  If it isn't the first half, the function calls ResetGame() which resets all the changed config variables back to their defaults ready for the next game.

===Other links===

*[[Legacy:Mapping_For_AS|Mapping_For_AS]]

==Discussion==

'''Wormbo:''' The useful information from this page should be moved to [[Legacy:Assault|Assault]] or [[Legacy:Mapping For AS|Mapping For AS]] and this page should be either deleted or rewritten for non-coding readers. This also goes for the [[Legacy:DM|DM]], [[Legacy:CTF|CTF]] and [[Legacy:DOM|DOM]] pages.

'''Tarquin:''' I agree. move coding stuff to [[Legacy:Assault|Assault]] and anything else to [[Legacy:Mapping For AS|Mapping For AS]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASC File</title>
    <id>369</id>
    <revision>
      <id>1258</id>
      <timestamp>2002-07-21T15:51:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''ASC''' file format is a 3D graphics file created from [[Legacy:3D Studio Max|3D Studio Max]]. This can be used to export geometry from 3ds Max into UnrealED.

===Related Articles===
*[[Legacy:Brush Exporting And Importing|Brush Exporting and Importing]]</text>
    </revision>
    <revision>
      <id>1259</id>
      <timestamp>2002-05-20T19:28:47Z</timestamp>
      <contributor>
        <ip>Bean</ip>
      </contributor>
      <text xml:space="preserve">The ''ASC'' file format is a 3D graphics file created from 3D Studio Max. This can be used to export geometry from 3ds Max into UnrealED.

===Related Articles===
*[[Legacy:Brush Exporting And Importing|Brush Exporting and Importing]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASCriticalObjectiveVolume</title>
    <id>481</id>
    <revision>
      <id>1543</id>
      <timestamp>2005-12-16T18:56:09Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>minor markup.</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; ASCriticalObjectiveVolume (Package: UT2k4Assault)}}

ASCriticalObjectiveVolumes are used in connection with [[Legacy:GameObjective|GameObjective]]s in the UT2004 Assault gametype.  If one or more GameObjectives have a CriticalObjectiveVolumeTag which matches this volume's Events-&gt;Tag.  Then whenever an attacker enters this volume, those objectives will be marked as &quot;critical&quot;, and the &quot;critical objective warning&quot; (a siren and flashing HUD icon) will be signalled to the defending team.

==Properties==

===Main===
; [[Legacy:Pawn|Pawn]] ConstraintPawnClass : Only pawns matching this pawn class (or its descendants) will trigger the critical objective alarm when entering this volume.

===Hidden===
; Info CheckTimer : Internal timer used to periodically check if the objective is still &quot;critical&quot;.

===Inherited from [[Legacy:Actor|Actor]]===
; Tag : This actor is associated with one or more [[Legacy:GameObjective|GameObjective]]s by matching this Tag with the GameObjective's &lt;tt&gt;CriticalObjectiveVolumeTag&lt;/tt&gt; property.

==Functions==
; PostBeginPlay() : Skips normal Volume initialization and goes straight to super(Brush).PostBeginPlay() to avoid the AssociatedActorTag stuff in [[Legacy:Volume|Volume]] (ASCriticalVolumes do not support associated actors).
; Destroyed() : Clean up the CheckTimer, if there is one.
; bool IsCriticalPawn( [[Legacy:Pawn|Pawn]] P ) : Determine whether the Pawn P matches the requirements (ConstraintPawnClass) for triggering a critical state for the objective.
; bool IsStillCritical() : Determine whether there are any Pawns touching this volume which pass the IsCriticalPawn test.  If there are, re-send the &quot;critical objective warning&quot; to the defenders of all of the objectives associated with this volume.  If there aren't any valid touching Pawns, clear the &quot;critical&quot; status on all associated objectives.
; Reset() : Go to the &quot;Safe&quot; state.

==States ==

===Safe (auto)===

This is the &quot;normal&quot; state of the ASCriticalObjectiveVolume.

====Events====
; Touch( Actor Other ) : If Other is a Pawn matching the ConstraintPawnClass, set all associated objectives &quot;critical status&quot; to true, send warning to their defenders, and go into the &quot;Critical&quot; state.

===Critical===

This state is entered after the Touch event (in the Safe state) has set the objectives to be &quot;critical&quot;.

====Functions====
; BeginState() : Create a new [[Legacy:VolumeTimer|VolumeTimer]] (and store it in CheckTimer) to periodically see if we're still critical.
; TimerPop( [[Legacy:VolumeTimer|VolumeTimer]] T ) : When the CheckTimer pops, call IsStillCritical to check if we're still critical.

===ObjectiveDisabled===

Apparently entered when one of the associated objectives is disabled.

====Functions ====
; BeginState() : Check if we have any remaining active objectives, and if not, go to the &quot;Disabled&quot; state.

===Disabled===

This state is entered when we don't have any more active objectives to take care of.

====Functions====
; BeginState() : If we have a CheckTimer, clean it up.

==Related Topics==
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
* [[Legacy:GameObjective|GameObjective]]
* [[Legacy:Team Number|Team Number]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1544</id>
      <timestamp>2005-12-03T01:40:33Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; ASCriticalObjectiveVolume (Package: UT2k4Assault)}}

ASCriticalObjectiveVolumes are used in connection with [[Legacy:GameObjective|GameObjective]]s in the UT2004 Assault gametype.  If one or more GameObjectives have a CriticalObjectiveVolumeTag which matches this volume's Events-&gt;Tag, then whenever an attacker enters this volume, those objectives will be marked as &quot;critical&quot;, and the &quot;critical objective warning&quot; (a siren and flashing HUD icon) will be signalled to the defending team.

==Properties ==

===Important Properties Inherited from [[Legacy:Actor|Actor]] ===

; Events-&gt;Tag: This actor is associated with one or more [[Legacy:GameObjective|GameObjective]]s by matching this tag with the GameObjective's CriticalObjectiveVolumeTag property.

===ASCriticalObjectiveVolume ===
; [[Legacy:Pawn|Pawn]] ConstraintPawnClass: Only pawns matching this pawn class (or its descendants) will trigger the critical objective alarm when entering this volume.

===(Hidden Properties) ===
; Info CheckTimer: Internal timer used to periodically check if the objective is still &quot;critical&quot;.

==Functions ==
; PostBeginPlay ( ) : Skips normal Volume initialization and goes straight to super(Brush).PostBeginPlay() to avoid the AssociatedActorTag stuff in [[Legacy:Volume|Volume]] (ASCriticalVolumes do not support associated actors).
; Destroyed ( ) : Clean up the CheckTimer, if there is one.
; bool IsCriticalPawn (Pawn P) : Determine whether the Pawn P matches the requirements (ConstraintPawnClass) for triggering a critical state for the objective.
; bool IsStillCritical ( ) : Determine whether there are any Pawns touching this volume which pass the IsCriticalPawn test.  If there are, re-send the &quot;critical objective warning&quot; to the defenders of all of the objectives associated with this volume.  If there aren't any valid touching Pawns, clear the &quot;critical&quot; status on all associated objectives.

; Reset ( ) : Go to the &quot;Safe&quot; state.

==States ==

===Safe (auto) ===

This is the &quot;normal&quot; state of the ASCriticalObjectiveVolume.

====Events ====
; Touch (Actor Other) : If Other is a Pawn matching the ConstraintPawnClass, set all associated objectives &quot;critical status&quot; to true, send warning to their defenders, and go into the &quot;Critical&quot; state.

===Critical ===

This state is entered after the Touch event (in the Safe state) has set the objectives to be &quot;critical&quot;.

====Functions ====
; BeginState ( ) : Create a new VolumeTimer (and store it in CheckTimer) to periodically see if we're still critical.
; TimerPop (VolumeTimer T) : When the CheckTimer pops, call IsStillCritical to check if we're still critical.

===ObjectiveDisabled ===

Apparently entered when one of the associated objectives is disabled.

====Functions ====
; BeginState ( ) : Check if we have any remaining active objectives, and if not, go to the &quot;Disabled&quot; state.

===Disabled ===

This state is entered when we don't have any more active objectives to take care of.

====Functions ====
; BeginState ( ) : If we have a CheckTimer, clean it up.

==Related Topics==
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASE File Format</title>
    <id>429</id>
    <revision>
      <id>1440</id>
      <timestamp>2007-04-14T08:01:26Z</timestamp>
      <contributor>
        <ip>Ip68-100-136-201.dc.dc.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbes, which are the vertex's index followed by it's X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_TFACELIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1441</id>
      <timestamp>2007-01-27T11:29:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Texture Map Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbes, which are the vertex's index followed by it's X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_TFACELIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1442</id>
      <timestamp>2007-04-11T02:32:37Z</timestamp>
      <contributor>
        <ip>Ip68-100-136-201.dc.dc.cox.net</ip>
      </contributor>
      <comment>Added some info about *TIMEVALUE and allocated space for explaining TM_ANIMATION when I have a little more time on my hands and an *.ASE file open in notepad. ~ FXO</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Texture Map Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbes, which are the vertex's index followed by it's X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_TFACELIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33534</id>
      <timestamp>2008-12-03T22:26:52Z</timestamp>
      <contributor>
        <username>0beron</username>
        <id>1691</id>
      </contributor>
      <comment>/* Node Animation Specifiers */</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbes, which are the vertex's index followed by it's X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_TFACELIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]

'''0beron''' I've been trying to get a script working to convert STL meshes into ASE format, and have discovered that UEd 3 (UT2004) at least is picky about whitespace. In particular lines like *MESH_TVERT work best if they are in the form *MESH_TVERT index_number U&lt;tab&gt;V&lt;tab&gt;0.000&lt;newline&gt; (with a space being a literal space). A mesh face line is best formatted *MESH_FACE  0: A: 0 B: 2 C: 1 AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING 1 &lt;tab&gt;*MESH_MTLID 0&lt;newline&gt; (note the space followed by a tab.) My guess is that UED splits on tabs and spaces at different times to hack up the strings it reads in, and if they don't appear in the right order it gets rubbish.</text>
    </revision>
    <revision>
      <id>33995</id>
      <timestamp>2009-02-06T04:09:47Z</timestamp>
      <contributor>
        <ip>59.92.66.131</ip>
      </contributor>
      <comment>MESH_FACE_LIST is misspelled as MESH_TFACELIST</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbes, which are the vertex's index followed by it's X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_FACE_LIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]

'''0beron''' I've been trying to get a script working to convert STL meshes into ASE format, and have discovered that UEd 3 (UT2004) at least is picky about whitespace. In particular lines like *MESH_TVERT work best if they are in the form *MESH_TVERT index_number U&lt;tab&gt;V&lt;tab&gt;0.000&lt;newline&gt; (with a space being a literal space). A mesh face line is best formatted *MESH_FACE  0: A: 0 B: 2 C: 1 AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING 1 &lt;tab&gt;*MESH_MTLID 0&lt;newline&gt; (note the space followed by a tab.) My guess is that UED splits on tabs and spaces at different times to hack up the strings it reads in, and if they don't appear in the right order it gets rubbish.</text>
    </revision>
    <revision>
      <id>34120</id>
      <timestamp>2009-03-15T18:20:00Z</timestamp>
      <contributor>
        <ip>204.225.123.132</ip>
      </contributor>
      <comment>/* Mesh Geometry Specification */ spelling</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbes, which are the vertex's index followed by its X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_FACE_LIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]

'''0beron''' I've been trying to get a script working to convert STL meshes into ASE format, and have discovered that UEd 3 (UT2004) at least is picky about whitespace. In particular lines like *MESH_TVERT work best if they are in the form *MESH_TVERT index_number U&lt;tab&gt;V&lt;tab&gt;0.000&lt;newline&gt; (with a space being a literal space). A mesh face line is best formatted *MESH_FACE  0: A: 0 B: 2 C: 1 AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING 1 &lt;tab&gt;*MESH_MTLID 0&lt;newline&gt; (note the space followed by a tab.) My guess is that UED splits on tabs and spaces at different times to hack up the strings it reads in, and if they don't appear in the right order it gets rubbish.</text>
    </revision>
    <revision>
      <id>34121</id>
      <timestamp>2009-03-15T18:20:39Z</timestamp>
      <contributor>
        <ip>204.225.123.132</ip>
      </contributor>
      <comment>/* Mesh Geometry Specification */</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbers, which are the vertex's index followed by its X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_FACE_LIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]

'''0beron''' I've been trying to get a script working to convert STL meshes into ASE format, and have discovered that UEd 3 (UT2004) at least is picky about whitespace. In particular lines like *MESH_TVERT work best if they are in the form *MESH_TVERT index_number U&lt;tab&gt;V&lt;tab&gt;0.000&lt;newline&gt; (with a space being a literal space). A mesh face line is best formatted *MESH_FACE  0: A: 0 B: 2 C: 1 AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING 1 &lt;tab&gt;*MESH_MTLID 0&lt;newline&gt; (note the space followed by a tab.) My guess is that UED splits on tabs and spaces at different times to hack up the strings it reads in, and if they don't appear in the right order it gets rubbish.</text>
    </revision>
    <revision>
      <id>35360</id>
      <timestamp>2009-08-24T14:25:15Z</timestamp>
      <contributor>
        <ip>117.206.34.118</ip>
      </contributor>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbers, which are the vertex's index followed by its X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMTVFACES 2 
 *MESH_FACE_LIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]

'''0beron''' I've been trying to get a script working to convert STL meshes into ASE format, and have discovered that UEd 3 (UT2004) at least is picky about whitespace. In particular lines like *MESH_TVERT work best if they are in the form *MESH_TVERT index_number U&lt;tab&gt;V&lt;tab&gt;0.000&lt;newline&gt; (with a space being a literal space). A mesh face line is best formatted *MESH_FACE  0: A: 0 B: 2 C: 1 AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING 1 &lt;tab&gt;*MESH_MTLID 0&lt;newline&gt; (note the space followed by a tab.) My guess is that UED splits on tabs and spaces at different times to hack up the strings it reads in, and if they don't appear in the right order it gets rubbish.

for info on how to use .ase for biped animation check out:
http://area.autodesk.com/forum/autodesk-3ds-max/animation/ascii-scene-export-format-explanation/</text>
    </revision>
    <revision>
      <id>35397</id>
      <timestamp>2009-09-03T08:33:44Z</timestamp>
      <contributor>
        <ip>217.169.229.152</ip>
      </contributor>
      <comment>MESH_NUMTVFACES is not supposed to stand there, it should be MESH_NUMFACES wich is actually interceded by *MESH_VERTEX_LIST</comment>
      <text xml:space="preserve">The ASE [[Legacy:File Format|file format]], short for [[Wikipedia:ASCII]] Scene Exporter, is the prefered format to import [[Legacy:Static Mesh|static mesh]]es into [[Legacy:UnrealEd|UnrealEd]] from anything except [[Legacy:Lightwave|Lightwave]]. The format is native to [[Legacy:3D Studio Max|3D Studio Max]], but [[Legacy:ActorX|ActorX]] for [[Legacy:Maya|Maya]] can also export it. The format is based on identifiers, all in the form *ASTERISK_THEN_NAME, which are followed by zero or more values, and then for a few a block of further identifiers surrounded by curly braces.  As there is no official specification, it is unknown whether there is differentiation of whitespace, but for UnrealEd, each identifier must start on its own line, preceded only by spaces, tabs and closing curly braces.

==Top Level Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;3DSMAX_ASCIIEXPORT ''version'': '''ignored by UnrealEd'''. indicates the version of the file.  typical value for 'version' seems to be 200.
; &lt;nowiki&gt;*&lt;/nowiki&gt;COMMENT &quot;''comment''&quot;: '''ignored by UnrealEd'''.  Contains version of the exporter and export date in files generated by [[Legacy:3D Studio Max|3D Studio Max]].  Presumably could contain anything you want and might occur in any block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE: '''ignored by UnrealEd'''. '''Block''' contains information about the scene, animation, ambient light, background color.  See '''''Scene Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_LIST: '''Block''' contains all materials used by the objects in this file.  See '''''Material List Identifiers'''''. 
; &lt;nowiki&gt;*&lt;/nowiki&gt;GEOMOBJECT: '''Block''' contains actual geometry of objects  in the file.  See '''''Geometry Object Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;LIGHTOBJECT &amp; *CAMERAOBJECT: '''ignored by UnrealEd'''. '''Blocks''' contain information about lights and cameras in the scene.  They're pretty straightforwards and not at all relevant to UnrealEd, so I'm not covering them.

==Scene Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FILENAME &quot;''filename''&quot;: '''ignored by UnrealEd'''.  Orignal .max file name that this ASE was generated from
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FIRSTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation begins.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_LASTFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame on which animation ends.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_FRAMESPEED ''frames_per_second'': '''ignored by UnrealEd'''.  Unknown, presumed to be frame rate for scene (whether it's rendered or keyed frame rate is unknown).
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_TICKSPERFRAME ''frame'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_BACKGROUND_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Unknown, presumed to be background color.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;SCENE_AMBIENT_STATIC ''red'' ''green'' ''blue'': '''ignored by UnrealEd'''.  Ambient light color and brightness.  The three variables are floats between 0.0 and 1.0.

==Material List Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_COUNT ''num'': Must be first identifier in *MATERIAL_LIST.  ''num'' is the number of materials contained in the *MATERIAL_LIST block.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL ''index'': '''Block''' contains specification of a material.  ''index'' is the index of the material, counting from zero.  UnrealEd ignores the index and assigns material indices starting from zero in the order they occur in the file.  See '''''Material Identifiers'''''.  Unlike the previous block identifiers, UnrealEd needs to see this one to function properly.

==Material Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_NAME &quot;''name''&quot;: Name of the material.  UnrealEd may look for a texture by this name, but it has not been tested.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Usually &quot;Standard&quot;, but &quot;Multi/Sub-Object&quot; has been observed.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_AMBIENT  ''red'' ''green'' ''blue'': Ambient glow of this material.  It is unknown if this adds to or overrides *SCENE_AMBIENT_STATIC.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_DIFFUSE  ''red'' ''green'' ''blue'': Diffuse color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SPECULAR ''red'' ''green'' ''blue'': Specular highlight color material.  UnrealEd appears to interpret this identifier, but it is unknown what it does with it.  The three variables are floats between 0.0 and 1.0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINE ''shine'': '''ignored by UnrealEd'''.  Defines how focused the Specular shine is.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHINESTRENGTH ''strength'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_TRANSPARENCY ''transparency'': '''ignored by UnrealEd'''.  Unknown, presumed to be transparency of the material represented as a float from 0 to 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_WIRESIZE ''size'': '''ignored by UnrealEd'''.  Unknown, presumed to be the pixel width that wires should draw as when viewed as wire frame.
: Now, if the material has submaterials, you'll have this:
; &lt;nowiki&gt;*&lt;/nowiki&gt;NUMSUBMTLS ''num'': Number of sub-materials for this material;
; &lt;nowiki&gt;*&lt;/nowiki&gt;SUBMATERIAL ''index'': '''Block''' containing a complete material definition.  indexes start at 0 and count up to NUMSUBMTLS-1.  This block contains a complete material definition, but may not contain submaterials.
: If the material is regular (no submaterials, you'll have this the rest of this stuff:
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SHADING ''mode'': '''ignored by UnrealEd'''.  Shading algorithm to use.  Observed values are Blinn and Phong.  Note that this value is not quoted.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown, presumed to be exponential falloff of something related to lighting.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_SELFILLUM ''illum'': '''ignored by UnrealEd'''.  Unknown, presumed to be some sort of ambient glow.  Float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_FALLOFF ''falloff'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;In&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_XP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Only observed value is &quot;Filter&quot; (whout quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_DIFFUSE: '''Block''' containing a texture map specification for the diffuse channel.  See '''''Map Identifiers'''''.
: There may be other MAP types (for example MAP_AMBIENT, MAP_OPACITY or MAP_SPECULAR) but I don't know of them.

==Map Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Unknown, presumed to be the name of this texture map for display in the editor.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_CLASS &quot;''class''&quot;: '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Bitmap&quot;.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_SUBNO ''subno'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_AMOUNT 1.0000: '''ignored by UnrealEd'''.  Unknown, presumed to be
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP &quot;''path''&quot;: '''''UNREALED USES THIS ONE!'''''.  It appears to be a path to a BMP file.  I'm not sure if UnrealEd will add the texture or what, but this identifier appears in UnrealEd's strings.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MAP_TYPE ''type'': '''ignored by UnrealEd'''.  Unknown.  Observed value is &quot;Screen&quot; (without quotes).
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_U_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_V_TILING ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_ANGLE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_BLUR_OFFSET ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOUSE_AMT ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_SIZE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_LEVEL ''level'': '''ignored by UnrealEd'''.  Unknown.  Observed value is 1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;UVW_NOISE_PHASE ''value'': '''ignored by UnrealEd'''.  Unknown.  Value is a float.
; &lt;nowiki&gt;*&lt;/nowiki&gt;BITMAP_FILTER ''filter'': '''ignored by UnrealEd'''.  Unknown, presumed to be filter for generating [[Legacy:Mipmap|MIP Maps]].  Only observed value is &quot;Pyramidal&quot; (without the quotes).

==Geometry Object Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: '''ignored by UnrealEd'''.  Name of this object.
; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_TM: '''Block''' containing information about the transformation matrix on this object.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Node Transformation Matrix Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH: '''Block''' containing the actual mesh and texturing info.  Like the outer blocks, UnrealEd doesn't care about seeing this identifier, just the ones that are supposed to be inside it.  See '''''Mesh Identifiers'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_MOTIONBLUR ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should be motion blurred if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_CASTSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should cast shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;PROP_RECVSHADOW ''bool'': '''ignored by UnrealEd'''.  Unknown, presumed to indicate that this object should receive shadows if 1, and not if 0.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ANIMATION : '''Block''' containing information about the transformation of the animation.  I don't understand this block. (Different Editor: I understand this block, however, I have lost my example ASE files and have forgotten the identifiers for within this block. There's a section at the bottom of the page allocating space for when I get my hands on another animated ASE file.)
; &lt;nowiki&gt;*&lt;/nowiki&gt;MATERIAL_REF ''index'': Index of the texture to use for this object.  Default for faces without a *MESH_MTLID.

==Node Transformation Matrix Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;NODE_NAME &quot;''name''&quot;: Should be same name as the containing *GEOM_OBJECT.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_POS ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_ROT ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;INHERIT_SCL ''int'' ''int'' ''int'': '''ignored by UnrealEd'''.  Unknown.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW0 ''float'' ''float'' ''float'': First row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW1 ''float'' ''float'' ''float'': Second row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW2 ''float'' ''float'' ''float'': Third row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROW3 ''float'' ''float'' ''float'': Fourth row of the transformation matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_POS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The translation part of the transformation. It's here just for convenience, as the information is also in the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTAXIS  ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Axis of the rotation part of the transformacion. Also extracted from the matrix, it's not really needed if you already use the full matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_ROTANGLE ''float'': '''ignored by UnrealEd'''.  Angle of rotation part of the transformation.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALE ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  Scale of the transformation. Also from the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXIS ''float'' ''float'' ''float'': '''ignored by UnrealEd'''.  The axis of the scaling. Not sure how to use it, but the information is also on the matrix.
; &lt;nowiki&gt;*&lt;/nowiki&gt;TM_SCALEAXISANG ''float'': '''ignored by UnrealEd'''.  Angle of the scaling.. Ditto.

==Mesh Identifiers==

; &lt;nowiki&gt;*&lt;/nowiki&gt;TIMEVALUE ''int'': '''ignored by UnrealEd'''.  Represents the frame of animation for which this mesh represents (This generally means there are more *MESH declarations within the *GEOMOBJECT block to represent the vertex positions in different frames).
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMVERTEX ''num'': Number of vertices used in the model.  Vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_VERTEX_LIST: ''Block'' containing vertex positions.  UnrealEd doesn't care about this identifier, just the ones inside of it.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMFACES ''num'': Number of faces used in the model.  Face indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_FACE_LIST: '''Block''' containing face definitions.  Again, UnrealEd only care about the identifiers inside.  See '''''Mesh Geometry Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVERTEX ''num'': Number of vertices used in the first UV set of the model.  Texture vertex indices range from 0 to ''num''-1.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TVERTLIST: '''Block''' containing texture vertex positions for the first UV set.  Just like the others UnrealEd doesn't actually need to see this identifier.  See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMTVFACES ''num'': Number of texture faces used in the first UV set of model.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_TFACELIST: '''Block''' containing texture face definitions for the first UV set.  Do I need to say it again?
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_MAPPINGCHANNEL ''number'': ''Block containing the an additional UV set.  a single *MESH can conatin multiple *MESH_MAPPINGCHANNELs.  Each one has a number starting at 2 and counting upwards. See '''''Mesh Texture Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVERTEX ''num'': Number of color vertices.  Usually same as *MESH_NUMVERTEX.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CVERTLIST: '''Block''' containing vertex color information. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NUMCVFACES ''num'': Number of color faces.  Should always be identical to *MESH_NUMFACES.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_CFACELIST: '''Block''' containing color face definitions. See '''''Mesh Color Specification'''''.
; &lt;nowiki&gt;*&lt;/nowiki&gt;MESH_NORMALS: '''Ignored by UnrealEd???''' ''Block'' containing normal information for faces and vertices. See '''''Mesh Normal Specification'''''.

At this level the consistency of the file format breaks down, so will my consistency of presentation.

==Mesh Geometry Specification==

A Mesh is made up of a set of triangles built by selecting 3 vertices.  the &quot;front&quot; of this triangle is the side that when viewed from causes the vertices to rotate in a counter-clockwise direction around the middle.  The mesh is specified by listing all the verticies, and then listing polygons that use them.  The vertices are specified as follows:

 *MESH_NUMVERTEX 4
 *MESH_VERTEX_LIST {
     *MESH_VERTEX  0  -128.0  -128.0  0.000 
     *MESH_VERTEX  1   128.0  -128.0  0.000
     *MESH_VERTEX  2   128.0   128.0  0.000
     *MESH_VERTEX  3  -128.0   128.0  0.000
 }

Each *MESH_VERTEX line contains 4 numbers, which are the vertex's index followed by its X, Y, and Z coordinates.  The vertex indices start at 0 and count upwards to one less than the value in MESH_NUMVERTEX.  Once the vertices are specified, the faces are defined like this:

 *MESH_NUMFACES 2
 *MESH_FACE_LIST { 
     *MESH_FACE 0: A: 3 B: 0 C: 2 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
     *MESH_FACE 1: A: 1 B: 2 C: 0 AB: 1 BC: 0 CA: 1 *MESH_SMOOTHING 1 *MESH_MTLID 0 
 }

Here the format takes a complete departure from everywhere else.  Suddenly the values get labeled?  The first number is the face index, starting at 0 just like all the other indices.  the A, B and C numbers are the vertex indices of the three corners of the triangle, in counter-clockwise order.  the AB, BC, and CA are ignored by UnrealEd, but it's believed that they determine whether the edge should be drawn when viewed as wire frame.  It gets stranger still as two identifiers show up on the same line as the *MESH_FACE.  *MESH_SMOOTHING determines which smoothing groups the triangle is a member of and is a comma-delimited list.  *MESH_MTLID specifies which submaterial to use for this triangle.

==Mesh Texture Coordinate Specification==

Once the geometry is in place, we can paint pretty pictures on it.  The texture coordinate specification is identical to the vertex coordinate specification:

 *MESH_NUMTVERTEX 4
 *MESH_TVERTLIST {
     *MESH_TVERT 0  0.000  0.000  0.500
     *MESH_TVERT 1  1.000  0.000  0.500
     *MESH_TVERT 2  1.000  1.000  0.500
     *MESH_TVERT 3  0.000  1.000  0.500
 }

The last value is some sort of 3rd texture coordinate.  It's not clear how or even if it's used.  Once the coordinates are defined, you can apply the coordinates to the polygons:

 *MESH_NUMTVFACES 2
 *MESH_TFACELIST {
     *MESH_TFACE 0  3  0  2
     *MESH_TFACE 1  1  2  0
 }

The first number of each *MESH_TFACE selects a face to apply a texture to.  The three numbers after that select coordinates from the *MESH_TVERTLIST to use for each of the three corners o the triangle.

Additional texture coordinate sets can be specified like this:

 *MESH_MAPPINGCHANNEL 2 {
     *MESH_NUMTVERTEX 4 
     *MESH_TVERTLIST { ... } 
     *MESH_NUMTVFACES 2 
     *MESH_TFACELIST { ... } 
 }

The only thing new here is the *MESH_MAPPINGCHANNEL block, which contains another copy of the texturing info with different values.  The number after *MESH_MAPPINGCHANNEL seems to start at 2 for the 2nd set (the first one is outside any *MESH_MAPPINGCHANNEL), and count upwards for each additional set.

==Mesh Vertex Color Specification==

Now, it seems UnrealEd supports this.  It shouldn't be able to, but it does.  Nowhere in the binary do the strings identifying color information occur, yet it does seems to be able to extract it.  Can either use this color information as lighting, or use the red channel to blend between two textures.  Anyway, on with the specification.

Colors are specified in a similar way to geometry and textures.  First a block of vertex data:

 *MESH_NUMCVERTEX 4
 *MESH_CVERTLIST {
     *MESH_VERTCOL 0 1.0000 0.0000 0.0000
     *MESH_VERTCOL 1 0.0000 1.0000 0.0000
     *MESH_VERTCOL 2 0.0000 0.0000 1.0000
     *MESH_VERTCOL 3 1.0000 1.0000 1.0000
 }

the first value is the color vertex index, the other three are the red green and blue of that vertex, from 0 to 1.  Then just like textures, they're mapped onto polygons:

 *MESH_NUMCVFACES 2
 *MESH_CFACELIST {
     *MESH_CFACE 0  3  0  2
     *MESH_CFACE 1  1  2  0
 }

==Mesh Vertex Normal Specification==

Yet another bizarre twist here: two types of identifiers show up inside the MESH_NORMALS list.  The first one is *MESH_FACENORMAL, which is followed by a face index and then three float values which are the normalized (length 1) normal for that vertex.  the *MESH_FACENORMAL may be followed by exactly 3 *MESH_VERTEXNORMAL commands which are again followed by the vertex index (from *MESH_VERTEX_LIST) and three floats that form the normal for that corner of the triangle.  I haven't checked if UnrealEd will let you specify different normals for the same vertex index, but my initial guess is no.

==Node Animation Specifiers==

More to come...

----

Well, that's all I know.  There's still one identifier that shows up in UnrealEd's strings that I don't know about: *NUMSUBMTLS.  I'm guessing this has something to do with materials.  I also don't know how vertex colors are specified.  I know the internal format supports them, as CTF-Magma makes use of vertex colors to blend between textures, but I don't know how to get the into UnrealEd.

Lots of info on the UnrealEd side of things, and a sample ASE file can be found at the [[udn2:VertexBlendingTutorial]].

----

[[:Category:Legacy Modeling]]

'''Tarquin:''' You mean [[:Category:Legacy Application]]? but this is a file format, not an app! *confused*

'''inio:''' I'm blind :-).  yeah, relevancy is questionable.  Maybe there should be a tools coding category or something, for stuff like this.  I've come across a couple pages that seemed targeted more at people writing tools than people creating content.

'''Tarquin:''' interesting idea. Suggest it on the main categories page. in the meantime, link this page from [[Legacy:File Format|file format]] if not already.

'''Tarquin:''' Is there a way to export ASE files from UnrealEd?

'''Anonymous:''' the AB,BC,CA are Edge flags. see glEdgeFlag.

'''Anonymous:''' most engines ignore the vertex normals, they are not guaranteed to be orthonormal in the ASE format. This is done by regenerating the normals at each vertex per face, averaging them togethor to get the normal. Assuming the engine even uses the normals.
[[Category:Legacy Modeling|{{PAGENAME}}]]

'''0beron''' I've been trying to get a script working to convert STL meshes into ASE format, and have discovered that UEd 3 (UT2004) at least is picky about whitespace. In particular lines like *MESH_TVERT work best if they are in the form *MESH_TVERT index_number U&lt;tab&gt;V&lt;tab&gt;0.000&lt;newline&gt; (with a space being a literal space). A mesh face line is best formatted *MESH_FACE  0: A: 0 B: 2 C: 1 AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING 1 &lt;tab&gt;*MESH_MTLID 0&lt;newline&gt; (note the space followed by a tab.) My guess is that UED splits on tabs and spaces at different times to hack up the strings it reads in, and if they don't appear in the right order it gets rubbish.

for info on how to use .ase for biped animation check out:
http://area.autodesk.com/forum/autodesk-3ds-max/animation/ascii-scene-export-format-explanation/</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASGameInfo</title>
    <id>28274</id>
    <revision>
      <id>39931</id>
      <timestamp>2009-11-14T18:05:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASMD</title>
    <id>28424</id>
    <revision>
      <id>40096</id>
      <timestamp>2009-11-15T08:29:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASMDAmmo</title>
    <id>356</id>
    <revision>
      <id>1229</id>
      <timestamp>2003-05-23T16:11:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; ASMDAmmo (Package: UnrealShare)}}

==Known Subclasses ==
* [[Legacy:DefaultAmmo|DefaultAmmo]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1230</id>
      <timestamp>2002-03-30T18:06:43Z</timestamp>
      <contributor>
        <ip>The G.O.A.T</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; ASMDAmmo}}

==Known subclasses ==
* [[Legacy:DefaultAmmo|DefaultAmmo]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASOBJ EnergyCore Delivery</title>
    <id>512</id>
    <revision>
      <id>1608</id>
      <timestamp>2006-12-27T22:09:11Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General==

The ASOBJ_EnergyCore_Delivery actor is a subclass of [[Legacy:GameObjective|GameObjective]] and is used in the [[Legacy:Assault|Assault]] gametype.  It accompanies the [[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]] actor; the latter spawns a Power Core, and the objective is to retrieve and deliver it somewhere, usually a vehicle (for obvious reasons).  An ASOBJ_EnergyCore_Spawn actor should have a DefensePriority (See [[Legacy:GameObjective|GameObjective]]) of one higher than its corresponding ASOBJ_EnergyCore_Delivery.

==Related Actors==
*[[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]]

==Discussion==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASOBJ EnergyCore Spawn</title>
    <id>511</id>
    <revision>
      <id>1606</id>
      <timestamp>2006-12-27T22:08:07Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General==

The ASOBJ_EnergyCore_Spawn actor is used in the [[Legacy:Assault|Assault]] gametype.  A subclass of [[Legacy:GameObjective|GameObjective]], this spawns the Power Core that makes up the first objective in the stock map AS-Junkyard.  It accompanies the [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]] actor, which is the place the Power Core is delivered to: generally, a vehicle.  A Power Core spawns when the map starts, and can be picked up by attacking players like a weapon.  While the defense cannot move the power core, if it is dropped (if its carrier is killed) and 30 seconds (?) have passed, the power core will be reset to its original location.

==Caution==

The ASOBJ_EnergyCore_Spawn actor should have a DefensePriority (See [[Legacy:GameObjective|GameObjective]]) of one higher than its corresponding ASOBJ_EnergyCore_Delivery.  This is because Power Cores can be picked up at any time during the game, but will not respawn once delivered.  Therefore, if a Power Core is picked up before its appropriate objective and delivered to an ASOBJ_EnergyCore_Delivery once it's activated, the player will be left with an uncompleteable objective: there is no Power Core, but he is required to retrieve one.

Another unfortunate characteristic of ASOBJ_EnergyCore_Spawn actors is that they cause the directional arrow at the top of the [[Legacy:Assault|Assault]] [[Legacy:HUD|HUD]] to point only at them until the core is picked up.  This means that Power Core delivery objectives should only be used as the first objective in an Assault map.

==Related Actors==
*[[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]]

==Discussion==</text>
    </revision>
    <revision>
      <id>1607</id>
      <timestamp>2006-12-27T22:03:26Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General==

The ASOBJ_EnergyCore_Spawn actor is used in the [[Legacy:Assault|Assault]] gametype.  A subclass of [[Legacy:GameObjective|GameObjective]], this spawns the Power Core that makes up the first objective in the stock map AS-Junkyard.  It accompanies the [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]] actor, which is the place the Power Core is delivered to: generally, a vehicle.  A Power Core spawns when the map starts, and can be picked up by attacking players like a weapon.  While the defense cannot move the power core, if it is dropped (if its carrier is killed) and 30 seconds (?) have passed, the power core will be reset to its original location.

==Caution==

The ASOBJ_EnergyCore_Spawn actor should have a DefensePriority (See [[Legacy:GameObjective|GameObjective]]) of one higher than its corresponding ASOBJ_EnergyCore_Delivery.  This is because Power Cores can be picked up at any time during the game, but will not respawn once delivered.  Therefore, if a Power Core is picked up before its appropriate objective and delivered to an ASOBJ_EnergyCore_Delivery once it's activated, the player will be left with an uncompleteable objective: there is no Power Core, but he is required to retrieve one.

Another unfortunate characteristic of ASOBJ_EnergyCore_Spawn actors is that they cause the directional arrow at the top of the [[Legacy:Assault|Assault]] [[Legacy:HUD|HUD]] to point only at them until the core is picked up.  This means that Power Core delivery objectives should only be used as the first objective in an Assault map.

==Discussion==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASSentinelController</title>
    <id>28885</id>
    <revision>
      <id>42815</id>
      <timestamp>2010-03-31T11:02:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASTurret</title>
    <id>404</id>
    <revision>
      <id>1345</id>
      <timestamp>2007-06-02T11:01:56Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:ASVehicle|ASVehicle]] &gt;&gt; ASTurret}}

'''Abstract''' class of all the various turrets seen in the [[Legacy:Assault|Assault]] gametype.

With the exception of [[Legacy:ASTurret_Minigun|ASTurret_Minigun]] and [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]], ASTurrets are automated turrets used to defend objectives in [[Legacy:Assault|Assault]] maps. Unlike the [[Legacy:ONSManualGun|ONSManualGun]] turrets that defend powernodes in [[Legacy:Onslaught|Onslaught]] maps, and players need not control them directly. Some turrets, such as the [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]] allow players to operate them remotely, using control panels ([[Legacy:Trigger_ASTurretControlPanel|Trigger_ASTurretControlPanel]]) . Others are completely automated, like the [[Legacy:ASVehicle_Sentinel|Sentinel]].

==Properties==

===Base===

information regarding the [[Legacy:AS_Turret_Base|AS_Turret_Base]] on which the turret sits.
; class&lt;[[Legacy:ASTurret_Base|ASTurret_Base]]&gt; TurretBaseClass : Reference to the turret's base's class.
; [[Legacy:AS_Turret_Base|AS_Turret_Base]] TurretBase : pointer to '''this''' turret's base.
; Rotator OriginalRotation : The direction this turret points when it spawns.

===Swivel===
; class&lt;[[Legacy:ASTurret_Base|ASTurret_Base]]&gt; TurretSwivelClass
; [[Legacy:ASTurret_Base|ASTurret_Base]] TurretSwivel

===Movement===
; float YawAccel : Acceleration factor for when the turret turns from side to side
; float PitchAccel : Acceleration factor for when the turret turns up and down
; const	float	RotationInertia : Momentum of rotation.
; const	Range	RotPitchConstraint : Min=0d,-90d  Max=0d,+90d  16384=0d 0=90d
; const	float	RotationSpeed : How fast the turret rotates.
; vector  CamAbsLocation :

===Camera===
; Rotator LastCamRot :
; float	LastTimeSeconds :
; float CamRotationInertia :

===Zooming===
; bool bZooming
; float	DesiredPlayerFOV :
; float MinPlayerFOV :
; float OldFOV :
; float ZoomSpeed :
; float ZoomWeaponOffsetAdjust :
; Material ZoomTick :
; Material ZoomTickTex :

===Other===
; Texture WeaponInfoTexture :
; name ObjectiveTag[6] : Tags for the objectives this turret is defending.  Bots will choose the most closest.
; array&lt;SVehicleTrigger&gt; EntryTriggers : Triggers used to enter the turret when the player presses the 'use' key.

==Functions==

==Events==

==States==

==Known Subclasses==

ASTurret
    +- [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
    +- [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
    +- [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
    +- [[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
    +- [[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
       +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
       +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]

==Related Topics:==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Super topic for all vehicles.
* [[Legacy:ASTurret_Base|ASTurret_Base]]

==Discussion:==

'''Bob_The_Beheader:''' Hey, it's about time :)... I don't know very much about this, but I've done what I can.
:Oh, and what is [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]] and is it remote control only? could be mentioned in the first paragraph.

'''MythOpus:''' Its one of the remote/auto turrets that are used in AS-Mothership.

----

[[:Category:Legacy To Do]] Fill in Functions, Events, and States.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1346</id>
      <timestamp>2006-12-31T23:33:18Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:ASVehicle|ASVehicle]] &gt;&gt; ASTurret}}

'''Abstract''' class of all the various turrets seen in the [[Legacy:Assault|Assault]] gametype.

With the exception of [[Legacy:ASTurret_Minigun|ASTurret_Minigun]] and [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]], ASTurrets are automated turrets used to defend objectives in [[Legacy:Assault|Assault]] maps. Unlike the [[Legacy:ONSManualGun|ONSManualGun]] turrets that defend powernodes in [[Legacy:Onslaught|Onslaught]] maps, and players need not control them directly. Some turrets, such as the [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]] allow players to operate them remotely, using control panels ([[Legacy:Trigger_ASTurretControlPanel|Trigger_ASTurretControlPanel]]) . Others are completely automated, like the [[Legacy:ASVehicle_Sentinel|Sentinel]].

==Properties==

===Base===

information regarding the [[Legacy:AS_Turret_Base|AS_Turret_Base]] on which the turret sits.
; class&lt;[[Legacy:ASTurret_Base|ASTurret_Base]]&gt; TurretBaseClass : Reference to the turret's base's class.
; [[Legacy:AS_Turret_Base|AS_Turret_Base]] TurretBase : pointer to '''this''' turret's base.
; Rotator OriginalRotation : The direction this turret points when it spawns. Please confirm [[:Category:Legacy Answer Needed]]

===Swivel===
; class&lt;[[Legacy:ASTurret_Base|ASTurret_Base]]&gt; TurretSwivelClass
; [[Legacy:ASTurret_Base|ASTurret_Base]] TurretSwivel

===Movement===
; float YawAccel : Acceleration factor for when the turret turns from side to side
; float PitchAccel : Acceleration factor for when the turret turns up and down
; const	float	RotationInertia : Momentum for rotation? Please confirm [[:Category:Legacy Answer Needed]]
; const	Range	RotPitchConstraint : Min=0d,-90d  Max=0d,+90d  16384=0d 0=90d
; const	float	RotationSpeed :
; vector  CamAbsLocation :

===Camera===
; Rotator LastCamRot :
; float	LastTimeSeconds :
; float CamRotationInertia :

===Zooming===
; bool bZooming
; float	DesiredPlayerFOV :
; float MinPlayerFOV :
; float OldFOV :
; float ZoomSpeed :
; float ZoomWeaponOffsetAdjust :
; Material ZoomTick :
; Material ZoomTickTex :

===Other===
; Texture WeaponInfoTexture :
; name ObjectiveTag[6] : Tags for the objectives this turret is defending ? Please Confirm [[Legacy:Answer ; Needed|Answer ; Needed]]
; array&lt;SVehicleTrigger&gt; EntryTriggers : Trigger for when this turret becomes active, i.e. the objective it is set to defend is now vulnerable. Please confirm [[:Category:Legacy Answer Needed]]

==Functions==

==Events==

==States==

==Known Subclasses==

ASTurret
    +- [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
    +- [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
    +- [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
    +- [[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
    +- [[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
       +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
       +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]

==Related Topics:==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Super topic for all vehicles.
* [[Legacy:ASTurret_Base|ASTurret_Base]]

==Discussion:==

'''Bob_The_Beheader:''' Hey, it's about time :)... I don't know very much about this, but I've done what I can.
:Oh, and ([[:Category:Legacy Answer Needed]]) what is [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]] and is it remote control only? could be mentioned in the first paragraph.

----

[[:Category:Legacy To Do]] Fill in Functions, Events, and States.

[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASTurret BallTurret</title>
    <id>28336</id>
    <revision>
      <id>40003</id>
      <timestamp>2009-11-14T20:15:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASTurret IonCannon</title>
    <id>28318</id>
    <revision>
      <id>39985</id>
      <timestamp>2009-11-14T20:13:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASTurret LinkTurret</title>
    <id>28320</id>
    <revision>
      <id>39987</id>
      <timestamp>2009-11-14T20:13:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASTurret Minigun</title>
    <id>28323</id>
    <revision>
      <id>39990</id>
      <timestamp>2009-11-14T20:13:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle</title>
    <id>504</id>
    <revision>
      <id>1591</id>
      <timestamp>2006-04-09T01:12:29Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; ASVehicle (Package: UT2k4Assault)}}

This is the abstract parent class of all UT2004 Assault vehicles and turrets. (non-Karma vehicles)

==Properties==

===Main===
; string DefaultWeaponClassName : Default vehicle weapon class.  This applies when players start game in vehicle without the &quot;standard&quot; possess procedure.
; vector VehicleProjSpawnOffset : Projectile spawn offset.
; sound LockedOnSound :

===Hidden===
; [[Legacy:Pawn|Pawn]] DamLastInstigator :
; float DamLastDamageTime :
; Material DefaultCrosshair :
; Material CrosshairHitFeedbackTex :
; float CrosshairScale :
; bool bCHZeroYOffset : For dual cannons, just trace from the center.
; bool bCustomHealthDisplay :
; float LastCalcWeaponFire : Avoid multiple traces the same tick
; Actor LastCalcHA :
; vector LastCalcHL :
; vector LastCalcHN :
; [[Legacy:Controller|Controller]] DestroyPrevController :
; [[Legacy:Emitter|Emitter]] ExplosionEffect :
; [[Legacy:Emitter|Emitter]] DebugFX :
; vector BotError :
; Actor OldTarget :

==Functions==
; PlayHit( float Damage, [[Legacy:Pawn|Pawn]] InstigatedBy, vector HitLocation, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector Momentum ) : EMPTY
; ClientDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLocation) : EMPTY
; Tick( float DeltaTime ) (simualted) : EMPTY
; AddDefaultInventory() :
; PossessedBy( [[Legacy:Controller|Controller]] C ) :
; UnPossessed() :
; ClientKDriverEnter( [[Legacy:PlayerController|PlayerController]] PC ) (simulated) :
; ClientKDriverLeave( [[Legacy:PlayerController|PlayerController]] PC) (simulated) :
; bool StopWeaponFiring() (simulated) :
; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) :
; Explode( vector HitLocation, vector HitNormal ) (simulated) : Spawn explosion FX
; float CalcInertia( float DeltaTime, float FrictionFactor, float OldValue, float NewValue ) (simulated, final) :
; name GetWeaponBoneFor( [[Legacy:Inventory|Inventory]] I ) : Returns ''.
; DrawHUD( [[Legacy:Canvas|Canvas]] C) (simulated) : 
; SpecialDrawCrosshair( [[Legacy:Canvas C|Canvas C]] ) (simulated) : 
; DrawVehicleHUD( [[Legacy:Canvas|Canvas]] C, [[Legacy:PlayerController|PlayerController]] PC ) (simulated) : EMPTY
; DrawWeaponInfo( [[Legacy:Canvas|Canvas]] C, [[Legacy:HUD|HUD]] H ) (simulated) : EMPTY
; DrawHealthInfo( [[Legacy:Canvas|Canvas]] C, [[Legacy:PlayerController|PlayerController]] PC ) (simulated) : EMPTY
; bool DrawCrosshair( [[Legacy:Canvas|Canvas]] C, out vector ScreenPos ) (simulated) : 
; bool WeaponHitsCrosshairsHL() (simulated) : Check if weapon fires where crosshair is aiming at (because of offset between VehicleProjSpawnOffset and POV in 3rd person view)
; DrawCrosshairAlignment( [[Legacy:Canvas|Canvas]] C, vector ScreenPos ) (simulated) : Visual feedback that weapon will hit where crosshair is aiming at
; DrawEnemyName( [[Legacy:Canvas|Canvas]] C, [[Legacy:HUDCDeathMatch|HUDCDeathMatch]] H ) (simulated) : 
; vector GetCrosshairWorldLocation() (simulated) : Return world location of crosshair's == vehicle's focus point
; vector GetFireStart( optional float XOffset ) (simulated) : Returns world location of vehicle fire start
; vector GetBotError( vector StartLocation ) : 
; Actor CalcWeaponFire( out vector HitLocation, out Vector HitNormal ) (simulated) : Trace from View to CrossHair, and return HitActor, HitLocation and HitNormal
; Actor PerformTrace( out vector HitLocation, out Vector HitNormal, vector End, vector Start ) (simulated) : 
; StaticPrecache( [[Legacy:LevelInfo|LevelInfo]] L ) (static) :
; UpdatePrecacheMaterials() (simulated) : 

==Events==
; PostBeginPlay() (simulated) :
; Destroyed() (simulated) : If &lt;tt&gt;Level.Game != None&lt;/tt&gt;, calls &lt;tt&gt;Level.Game.DiscardInventory( Self )&lt;/tt&gt;.
; bool KDriverLeave( bool bForceLeave ) :
; PlayDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLoc ) (simulated) :
; NotifyEnemyLockedOn() : Notify vehicle that an enemy has locked on to it

==States==

===Dying===

Explode

Ignores Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling and BreathTimer.

====Functions====
; PlayFiring( float Rate, name FiringMode ) : EMPTY
; PlayWeaponSwitch( [[Legacy:Weapon|Weapon]] NewWeapon ) : EMPTY
; PlayTakeHit( vector HitLoc, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : EMPTY
; PlayNextAnimation() (simulated) : EMPTY
; Landed( vector HitNormal ) : EMPTY
; ReduceCylinder() : EMPTY
;  LandThump() : EMPTY
; LieStill() : EMPTY
; BaseChange() (singluar) : EMPTY
; Died( [[Legacy:Controller|Controller]] Killer, class&lt;DamageType&gt; damageType, vector HitLocation ) : EMPTY
; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : EMPTY
; UpdateRocketAcceleration( float DeltaTime, float YawChange, float PitchChange ) : EMPTY
; VehicleSwitchView( bool bUpdating ) : EMPTY
; ProcessMove( float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot ) : EMPTY
; DriverDied() : EMPTY
; Timer() (simulated) : If &lt;tt&gt;!bDeleteMe&lt;/tt&gt;, calls &lt;tt&gt;Destroy()&lt;/tt&gt;.
; BeginState() :

====Events====
; ChangeAnimation() : EMPTY
; StopPlayFiring() : EMPTY
; FellOutOfWorld( eKillZType KillType ) : EMPTY
; AnimEnd( int Channel ) : EMPTY

==Known Subclasses==
 ASVehicle
   +- [[Legacy:ASTurret|ASTurret]]
   |   +- [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
   |   +- [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
   |   +- [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
   |   +- [[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
   |   +- [[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
   |       +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
   |       +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]
   +- [[Legacy:ASVehicle_SpaceFighter|ASVehicle_SpaceFighter]]
       +- [[Legacy:ASVehicle_SpaceFighter_Human|ASVehicle_SpaceFighter_Human]]
           +- [[Legacy:ASVehicle_SpaceFighter_Skaarj|ASVehicle_SpaceFighter_Skaarj]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic on all vehicles
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]] &amp;ndash; Parent class of ASVehicle spawners
*** [[Legacy:Assault Mapping Tutorial/Adding Vehicles And Turrets|Assault Mapping Tutorial/Adding Vehicles And Turrets]]
** [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] &amp;ndash; Custom vehicle spawner for any vehicle class
* [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] &amp;ndash; Placing VehicleFactories for strong [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Bot Pathing|Bot Pathing]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1592</id>
      <timestamp>2005-12-17T22:59:20Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; ASVehicle (Package: UT2k4Assault)}}

This is the abstract parent class of all UT2004 Assault vehicles and turrets. (non-Karma vehicles)

==Properties==

===Main===
; string DefaultWeaponClassName : Default vehicle weapon class.  This applies when players start game in vehicle without the &quot;standard&quot; possess procedure.
; vector VehicleProjSpawnOffset : Projectile spawn offset.
; sound LockedOnSound :

===Hidden===
; [[Legacy:Pawn|Pawn]] DamLastInstigator :
; float DamLastDamageTime :
; Material DefaultCrosshair :
; Material CrosshairHitFeedbackTex :
; float CrosshairScale :
; bool bCHZeroYOffset : For dual cannons, just trace from the center.
; bool bCustomHealthDisplay :
; float LastCalcWeaponFire : Avoid multiple traces the same tick
; Actor LastCalcHA :
; vector LastCalcHL :
; vector LastCalcHN :
; [[Legacy:Controller|Controller]] DestroyPrevController :
; [[Legacy:Emitter|Emitter]] ExplosionEffect :
; [[Legacy:Emitter|Emitter]] DebugFX :
; vector BotError :
; Actor OldTarget :

==Functions==
; PlayHit( float Damage, [[Legacy:Pawn|Pawn]] InstigatedBy, vector HitLocation, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector Momentum ) : EMPTY
; ClientDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLocation) : EMPTY
; Tick( float DeltaTime ) (simualted) : EMPTY
; AddDefaultInventory() :
; PossessedBy( [[Legacy:Controller|Controller]] C ) :
; UnPossessed() :
; ClientKDriverEnter( [[Legacy:PlayerController|PlayerController]] PC ) (simulated) :
; ClientKDriverLeave( [[Legacy:PlayerController|PlayerController]] PC) (simulated) :
; bool StopWeaponFiring() (simulated) :
; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) :
; Explode( vector HitLocation, vector HitNormal ) (simulated) : Spawn explosion FX
; float CalcInertia( float DeltaTime, float FrictionFactor, float OldValue, float NewValue ) (simulated, final) :
; name GetWeaponBoneFor( [[Legacy:Inventory|Inventory]] I ) : Returns ''.
; DrawHUD( [[Legacy:Canvas|Canvas]] C) (simulated) : 
; SpecialDrawCrosshair( [[Legacy:Canvas C|Canvas C]] ) (simulated) : 
; DrawVehicleHUD( [[Legacy:Canvas|Canvas]] C, [[Legacy:PlayerController|PlayerController]] PC ) (simulated) : EMPTY
; DrawWeaponInfo( [[Legacy:Canvas|Canvas]] C, [[Legacy:HUD|HUD]] H ) (simulated) : EMPTY
; DrawHealthInfo( [[Legacy:Canvas|Canvas]] C, [[Legacy:PlayerController|PlayerController]] PC ) (simulated) : EMPTY
; bool DrawCrosshair( [[Legacy:Canvas|Canvas]] C, out vector ScreenPos ) (simulated) : 
; bool WeaponHitsCrosshairsHL() (simulated) : Check if weapon fires where crosshair is aiming at (because of offset between VehicleProjSpawnOffset and POV in 3rd person view)
; DrawCrosshairAlignment( [[Legacy:Canvas|Canvas]] C, vector ScreenPos ) (simulated) : Visual feedback that weapon will hit where crosshair is aiming at
; DrawEnemyName( [[Legacy:Canvas|Canvas]] C, [[Legacy:HUDCDeathMatch|HUDCDeathMatch]] H ) (simulated) : 
; vector GetCrosshairWorldLocation() (simulated) : Return world location of crosshair's == vehicle's focus point
; vector GetFireStart( optional float XOffset ) (simulated) : Returns world location of vehicle fire start
; vector GetBotError( vector StartLocation ) : 
; Actor CalcWeaponFire( out vector HitLocation, out Vector HitNormal ) (simulated) : Trace from View to CrossHair, and return HitActor, HitLocation and HitNormal
; Actor PerformTrace( out vector HitLocation, out Vector HitNormal, vector End, vector Start ) (simulated) : 
; StaticPrecache( [[Legacy:LevelInfo|LevelInfo]] L ) (static) :
; UpdatePrecacheMaterials() (simulated) : 

==Events==
; PostBeginPlay() (simulated) :
; Destroyed() (simulated) : If &lt;tt&gt;Level.Game != None&lt;/tt&gt;, calls &lt;tt&gt;Level.Game.DiscardInventory( Self )&lt;/tt&gt;.
; bool KDriverLeave( bool bForceLeave ) :
; PlayDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLoc ) (simulated) :
; NotifyEnemyLockedOn() : Notify vehicle that an enemy has locked on to it

==States==

===Dying===

Explode

Ignores Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling and BreathTimer.

====Functions====
; PlayFiring( float Rate, name FiringMode ) : EMPTY
; PlayWeaponSwitch( [[Legacy:Weapon|Weapon]] NewWeapon ) : EMPTY
; PlayTakeHit( vector HitLoc, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : EMPTY
; PlayNextAnimation() (simulated) : EMPTY
; Landed( vector HitNormal ) : EMPTY
; ReduceCylinder() : EMPTY
;  LandThump() : EMPTY
; LieStill() : EMPTY
; BaseChange() (singluar) : EMPTY
; Died( [[Legacy:Controller|Controller]] Killer, class&lt;DamageType&gt; damageType, vector HitLocation ) : EMPTY
; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : EMPTY
; UpdateRocketAcceleration( float DeltaTime, float YawChange, float PitchChange ) : EMPTY
; VehicleSwitchView( bool bUpdating ) : EMPTY
; ProcessMove( float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot ) : EMPTY
; DriverDied() : EMPTY
; Timer() (simulated) : If &lt;tt&gt;!bDeleteMe&lt;/tt&gt;, calls &lt;tt&gt;Destroy()&lt;/tt&gt;.
; BeginState() :

====Events====
; ChangeAnimation() : EMPTY
; StopPlayFiring() : EMPTY
; FellOutOfWorld( eKillZType KillType ) : EMPTY
; AnimEnd( int Channel ) : EMPTY

==Known Subclasses==
 ASVehicle
   +- [[Legacy:ASTurret|ASTurret]]
   |   +- [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
   |   +- [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
   |   +- [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
   |   +- [[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
   |   +- [[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
   |       +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
   |       +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]
   +- [[Legacy:ASVehicle_SpaceFighter|ASVehicle_SpaceFighter]]
       +- [[Legacy:ASVehicle_SpaceFighter_Human|ASVehicle_SpaceFighter_Human]]
           +- [[Legacy:ASVehicle_SpaceFighter_Skaarj|ASVehicle_SpaceFighter_Skaarj]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic on all vehicles
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]] &amp;ndash; Parent class of ASVehicle spawners
** [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] &amp;ndash; Custom vehicle spawner for any vehicle class
* [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] &amp;ndash; Placing VehicleFactories for strong [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Bot Pathing|Bot Pathing]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1593</id>
      <timestamp>2006-04-08T16:05:37Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; ASVehicle (Package: UT2k4Assault)}}

This is the abstract parent class of all UT2004 Assault vehicles and turrets. (non-Karma vehicles)

==Properties==

===Main===
; string DefaultWeaponClassName : Default vehicle weapon class.  This applies when players start game in vehicle without the &quot;standard&quot; possess procedure.
; vector VehicleProjSpawnOffset : Projectile spawn offset.
; sound LockedOnSound :

===Hidden===
; [[Legacy:Pawn|Pawn]] DamLastInstigator :
; float DamLastDamageTime :
; Material DefaultCrosshair :
; Material CrosshairHitFeedbackTex :
; float CrosshairScale :
; bool bCHZeroYOffset : For dual cannons, just trace from the center.
; bool bCustomHealthDisplay :
; float LastCalcWeaponFire : Avoid multiple traces the same tick
; Actor LastCalcHA :
; vector LastCalcHL :
; vector LastCalcHN :
; [[Legacy:Controller|Controller]] DestroyPrevController :
; [[Legacy:Emitter|Emitter]] ExplosionEffect :
; [[Legacy:Emitter|Emitter]] DebugFX :
; vector BotError :
; Actor OldTarget :

==Functions==
; PlayHit( float Damage, [[Legacy:Pawn|Pawn]] InstigatedBy, vector HitLocation, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector Momentum ) : EMPTY
; ClientDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLocation) : EMPTY
; Tick( float DeltaTime ) (simualted) : EMPTY
; AddDefaultInventory() :
; PossessedBy( [[Legacy:Controller|Controller]] C ) :
; UnPossessed() :
; ClientKDriverEnter( [[Legacy:PlayerController|PlayerController]] PC ) (simulated) :
; ClientKDriverLeave( [[Legacy:PlayerController|PlayerController]] PC) (simulated) :
; bool StopWeaponFiring() (simulated) :
; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) :
; Explode( vector HitLocation, vector HitNormal ) (simulated) : Spawn explosion FX
; float CalcInertia( float DeltaTime, float FrictionFactor, float OldValue, float NewValue ) (simulated, final) :
; name GetWeaponBoneFor( [[Legacy:Inventory|Inventory]] I ) : Returns ''.
; DrawHUD( [[Legacy:Canvas|Canvas]] C) (simulated) : 
; SpecialDrawCrosshair( [[Legacy:Canvas C|Canvas C]] ) (simulated) : 
; DrawVehicleHUD( [[Legacy:Canvas|Canvas]] C, [[Legacy:PlayerController|PlayerController]] PC ) (simulated) : EMPTY
; DrawWeaponInfo( [[Legacy:Canvas|Canvas]] C, [[Legacy:HUD|HUD]] H ) (simulated) : EMPTY
; DrawHealthInfo( [[Legacy:Canvas|Canvas]] C, [[Legacy:PlayerController|PlayerController]] PC ) (simulated) : EMPTY
; bool DrawCrosshair( [[Legacy:Canvas|Canvas]] C, out vector ScreenPos ) (simulated) : 
; bool WeaponHitsCrosshairsHL() (simulated) : Check if weapon fires where crosshair is aiming at (because of offset between VehicleProjSpawnOffset and POV in 3rd person view)
; DrawCrosshairAlignment( [[Legacy:Canvas|Canvas]] C, vector ScreenPos ) (simulated) : Visual feedback that weapon will hit where crosshair is aiming at
; DrawEnemyName( [[Legacy:Canvas|Canvas]] C, [[Legacy:HUDCDeathMatch|HUDCDeathMatch]] H ) (simulated) : 
; vector GetCrosshairWorldLocation() (simulated) : Return world location of crosshair's == vehicle's focus point
; vector GetFireStart( optional float XOffset ) (simulated) : Returns world location of vehicle fire start
; vector GetBotError( vector StartLocation ) : 
; Actor CalcWeaponFire( out vector HitLocation, out Vector HitNormal ) (simulated) : Trace from View to CrossHair, and return HitActor, HitLocation and HitNormal
; Actor PerformTrace( out vector HitLocation, out Vector HitNormal, vector End, vector Start ) (simulated) : 
; StaticPrecache( [[Legacy:LevelInfo|LevelInfo]] L ) (static) :
; UpdatePrecacheMaterials() (simulated) : 

==Events==
; PostBeginPlay() (simulated) :
; Destroyed() (simulated) : If &lt;tt&gt;Level.Game != None&lt;/tt&gt;, calls &lt;tt&gt;Level.Game.DiscardInventory( Self )&lt;/tt&gt;.
; bool KDriverLeave( bool bForceLeave ) :
; PlayDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLoc ) (simulated) :
; NotifyEnemyLockedOn() : Notify vehicle that an enemy has locked on to it

==States==

===Dying===

Explode

Ignores Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling and BreathTimer.

====Functions====
; PlayFiring( float Rate, name FiringMode ) : EMPTY
; PlayWeaponSwitch( [[Legacy:Weapon|Weapon]] NewWeapon ) : EMPTY
; PlayTakeHit( vector HitLoc, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : EMPTY
; PlayNextAnimation() (simulated) : EMPTY
; Landed( vector HitNormal ) : EMPTY
; ReduceCylinder() : EMPTY
;  LandThump() : EMPTY
; LieStill() : EMPTY
; BaseChange() (singluar) : EMPTY
; Died( [[Legacy:Controller|Controller]] Killer, class&lt;DamageType&gt; damageType, vector HitLocation ) : EMPTY
; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : EMPTY
; UpdateRocketAcceleration( float DeltaTime, float YawChange, float PitchChange ) : EMPTY
; VehicleSwitchView( bool bUpdating ) : EMPTY
; ProcessMove( float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot ) : EMPTY
; DriverDied() : EMPTY
; Timer() (simulated) : If &lt;tt&gt;!bDeleteMe&lt;/tt&gt;, calls &lt;tt&gt;Destroy()&lt;/tt&gt;.
; BeginState() :

====Events====
; ChangeAnimation() : EMPTY
; StopPlayFiring() : EMPTY
; FellOutOfWorld( eKillZType KillType ) : EMPTY
; AnimEnd( int Channel ) : EMPTY

==Known Subclasses==
 ASVehicle
   +- [[Legacy:ASTurret|ASTurret]]
   |   +- [[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
   |   +- [[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
   |   +- [[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
   |   +- [[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
   |   +- [[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
   |       +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
   |       +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]
   +- [[Legacy:ASVehicle_SpaceFighter|ASVehicle_SpaceFighter]]
       +- [[Legacy:ASVehicle_SpaceFighter_Human|ASVehicle_SpaceFighter_Human]]
           +- [[Legacy:ASVehicle_SpaceFighter_Skaarj|ASVehicle_SpaceFighter_Skaarj]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic on all vehicles
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]] &amp;ndash; Parent class of ASVehicle spawners
*** [[Legacy:Assault Mapping Tutorial/Adding Vehicles And Turrets|Assault Mapping Tutorial/Adding Vehicles And Turrets]]
** [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] &amp;ndash; Custom vehicle spawner for any vehicle class
* [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] &amp;ndash; Placing VehicleFactories for strong [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Bot Pathing|Bot Pathing]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle Sentinel</title>
    <id>502</id>
    <revision>
      <id>1586</id>
      <timestamp>2006-12-31T22:02:23Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>removing unnecessary discussion (suggestions already implememented) and refactor tag</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:ASVehicle|ASVehicle]] &gt;&gt; [[Legacy:ASTurret|ASTurret]] &gt;&gt; ASVehicle Sentinel (Package: UT2k4Assault)}}

This is the abstract class for the super-powerful automatic turret gun seen in AS games when you get too close to the enemy spawn-zone. To get a close look, check out the map AS-MotherShip. Assuming it was implemented to prevent spawn killing in AS games. It is an abstract class, so one of it's two subclasses must be used (see below), based on weather the sentinel is attached to the floor or the cieling.

Keep in mind that the Sentinel has no means of movement, and cannot be &quot;driven&quot; or &quot;ridden&quot; or &quot;flown.&quot; See [[Legacy:Vehicle|Vehicle]].

==Properties==

===Main===
; float TransientSoundVolume=0.75
; float TransientSoundRadius=512
; float bNetNotify=true
; float Health=1000
; float HealthMax=1000
; string DefaultWeaponClassName = &quot;UT2k4Assault.Weapon_Sentinel&quot;

====Physics====
: All of these are set so the the Sentinel is immobile.
; bool bSimulateGravity=false 
; Physics Physics=PHYS_Rotating
; float AirSpeed=0.0
; float WaterSpeed=0.0
; float AccelRate=0.0 
; float JumpZ=0.0
; float MaxFallSpeed=0.0 
; bool bIgnoreEncroachers=true
; bool bCollideWorld=false
; bool bIgnoreForces=true
; bool bShouldBaseAtStartup=false

====AI====
; Bool bAutoTurret=true : true = the turret is controled by the class listed in the property ''AutoTurretControllerClass''. False = ??
; Class AutoTurretControllerClass=class &lt;[[Legacy:Controller|Controller]]&gt; [[Legacy:UT2k4Assault.ASSentinelController|UT2k4Assault.ASSentinelController]]
; float SightRadius=+25000.0 : The distance at which the turret looks for enemies to fire at.
; bool bNonHumanControl=true : ???
; bool bDefensive=true : ??? (Assumming that this makes the AI play with defensive tactics...but defending what??? Itself?
; bool bStationary=true : True = This Sentinel is sationary (does not move) 
; string VehicleNameString=&quot;Sentinel&quot; : The name of this sentinel.
; bool bNoTeamBeacon=true : ??

===Hidden===
: ??

==Functions==
; PlayFiring(optional float Rate, optional name FiringMode)(simulated) : causes the sentinel to fire.
; PlayIdleOpened()(simulated) : Plays the animation of the sentinel idling in it's active, &quot;open position&quot;.
; PlayIdleClosed()(simulated) : Plays the animation of the sentinel idling in it's sleeping, &quot;closed&quot;.
; 

==States==

===Sleeping (Auto)===

====Functions====
; TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,

					Vector momentum, class&lt;DamageType&gt; damageType) : Causes the sentinel to automatically wake up when it takes damage.
; bool Awake() : Wakes the sentinel up. bActive set to true, PlayOpening is called, returns true
; PlayOpening()(simulated) : Plays the animation of the sentinel &quot;deploying&quot; or &quot;unfolding,&quot; and brings it into the '''Opening''' state.
;'''''Begin''''' : if bActive = true, then call the PlayOpening() animation, otherwise play PlayIdleClosed().

===Active===

====Functions====
; bool GoToSleep() : Plays the animation of the sentinel closing and brings it into the '''Closing''' state. Also causes the sentinel to emit a snoring sound. Just joking about that last :)
; PlayClosing()(simulated) : Plays the animation of the sentinel &quot;closing&quot;, when it changes from the active state to the sleeping state. (It puts on it's pajamas and brushes it's teeth...It's mommy comes in to tuck it to bed... :) ). Also brings the sentinel into the '''Closing''' state.
;'''''Begin''''' : PlayIdleOpened()

===Opening===

====Functions====
; TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
                        Vector momentum, class&lt;DamageType&gt; damageType)

===Closing===

====Functions====
; TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
                        Vector momentum, class&lt;DamageType&gt; damageType)

==Known Subclasses==
: Some 
 ASVehicle_Sentinel
   +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]] : Sentinel is right side up so that it can be resting on the floor.
   +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]] : Sentinel is upside down so that it can be attached to a cieling.

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic for all vehicles
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
* [[Legacy:TurretController|TurretController]]

==Discussion==

----

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy Class Tree]]

[[:Category:Legacy To Do]] &amp;ndash; Make sure parent class pages are also done.
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1587</id>
      <timestamp>2006-02-01T17:14:19Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>Getting rid of the source code(I only had it in there while I needed it to make the page)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:ASVehicle|ASVehicle]] &gt;&gt; [[Legacy:ASTurret|ASTurret]] &gt;&gt; ASVehicle Sentinel (Package: UT2k4Assault)}}

This is the abstract class for the super-powerful automatic turret gun seen in AS games when you get too close to the enemy spawn-zone. To get a close look, check out the map AS-MotherShip. Assuming it was implemented to prevent spawn killing in AS games. It is an abstract class, so one of it's two subclasses must be used (see below), based on weather the sentinel is attached to the floor or the cieling.

Keep in mind that the Sentinel has no means of movement, and cannot be &quot;driven&quot; or &quot;ridden&quot; or &quot;flown.&quot; See [[Legacy:Vehicle|Vehicle]].

==Properties==

===Main===
; float TransientSoundVolume=0.75
; float TransientSoundRadius=512
; float bNetNotify=true
; float Health=1000
; float HealthMax=1000
; string DefaultWeaponClassName = &quot;UT2k4Assault.Weapon_Sentinel&quot;

====Physics====
: All of these are set so the the Sentinel is immobile.
; bool bSimulateGravity=false 
; Physics Physics=PHYS_Rotating
; float AirSpeed=0.0
; float WaterSpeed=0.0
; float AccelRate=0.0 
; float JumpZ=0.0
; float MaxFallSpeed=0.0 
; bool bIgnoreEncroachers=true
; bool bCollideWorld=false
; bool bIgnoreForces=true
; bool bShouldBaseAtStartup=false

====AI====
; Bool bAutoTurret=true : true = the turret is controled by the class listed in the property ''AutoTurretControllerClass''. False = ??
; Class AutoTurretControllerClass=class &lt;[[Legacy:Controller|Controller]]&gt; [[Legacy:UT2k4Assault.ASSentinelController|UT2k4Assault.ASSentinelController]]
; float SightRadius=+25000.0 : The distance at which the turret looks for enemies to fire at.
; bool bNonHumanControl=true : ???
; bool bDefensive=true : ??? (Assumming that this makes the AI play with defensive tactics...but defending what??? Itself?
; bool bStationary=true : True = This Sentinel is sationary (does not move) 
; string VehicleNameString=&quot;Sentinel&quot; : The name of this sentinel.
; bool bNoTeamBeacon=true : ??

===Hidden===
: ??

==Functions==
; PlayFiring(optional float Rate, optional name FiringMode)(simulated) : causes the sentinel to fire.
; PlayIdleOpened()(simulated) : Plays the animation of the sentinel idling in it's active, &quot;open position&quot;.
; PlayIdleClosed()(simulated) : Plays the animation of the sentinel idling in it's sleeping, &quot;closed&quot;.
; 

==States==

===Sleeping (Auto)===

====Functions====
; TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,

					Vector momentum, class&lt;DamageType&gt; damageType) : Causes the sentinel to automatically wake up when it takes damage.
; bool Awake() : Wakes the sentinel up. bActive set to true, PlayOpening is called, returns true
; PlayOpening()(simulated) : Plays the animation of the sentinel &quot;deploying&quot; or &quot;unfolding,&quot; and brings it into the '''Opening''' state.
;'''''Begin''''' : if bActive = true, then call the PlayOpening() animation, otherwise play PlayIdleClosed().

===Active===

====Functions====
; bool GoToSleep() : Plays the animation of the sentinel closing and brings it into the '''Closing''' state. Also causes the sentinel to emit a snoring sound. Just joking about that last :)
; PlayClosing()(simulated) : Plays the animation of the sentinel &quot;closing&quot;, when it changes from the active state to the sleeping state. (It puts on it's pajamas and brushes it's teeth...It's mommy comes in to tuck it to bed... :) ). Also brings the sentinel into the '''Closing''' state.
;'''''Begin''''' : PlayIdleOpened()

===Opening===

====Functions====
; TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
                        Vector momentum, class&lt;DamageType&gt; damageType)

===Closing===

====Functions====
; TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
                        Vector momentum, class&lt;DamageType&gt; damageType)

==Known Subclasses==
: Some 
 ASVehicle_Sentinel
   +- [[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]] : Sentinel is right side up so that it can be resting on the floor.
   +- [[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]] : Sentinel is upside down so that it can be attached to a cieling.

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic for all vehicles
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
* [[Legacy:TurretController|TurretController]]

==Discussion==

'''Bob_The_Beheader:''' OMG someone help me!!! - I've been looking at this class because I want to add a sentinal to a CTF map. Basically my idea was to have a standard CTF game but then make a central area with a sentinal in it and then have a switch (a trigger) that can cause the sentinal to fight for the team of the player that touches the trigger. OK - I had enough trouble making the trigger, but when I looked at the code/ properties for the sentinal, I was a little confused - does anyone know how this thing works? - the sentinal seems like 1/2 vehicle 1/2 bot to me... all the information that mentions it is just talking about turrets in general.

OK I have steeled my resolve, and, so I'm not just whining here, I will create this class page...as I find out stuff about it... :)

'''SuperApe:''' Regarding adding this class to CTF:
#) Make it VCTF, as turrets are vehicles.
#) Use a custom VehicleFactory like the [[Legacy:TeamVehicleFactory|TeamVehicleFactory]], so you have access to ASVehicles, as well as control over team, timing, particles, events, etc.
#) You might want to balance the awesome power of the Sentinel (high armor and firepower) with vehicles for the other side.  Alternately, you could subclass the Sentinel and make it less powerful.

Regarding making a class page:
#) Take a look at the example page I made for [[Legacy:MinigunAttachment|MinigunAttachment]].
#) Add a class hierarchy path box.
#) Add a simple (one sentance) explanation of this class.
#) Add &quot;Properties&quot; (&quot;Main&quot; and &quot;Hidden&quot;, or however it's organized in the code) with definitions, where needed.
#) Add important &quot;Functions&quot;, important &quot;Events&quot; and all &quot;States&quot; with definitions, where you can.
#) Omit the source code.
#) Add a &quot;Known Subclasses&quot; section with a subclass tree, if applicable.
#) Add a &quot;Related Topics&quot; section with other pages not previously mentioned on the page.
#) Put the &quot;Discussion&quot; section after that.
#) Add a &quot;-----&quot; bar and list the Category tags for this page (I suggest Class UT2004, plus Category Class Tree if a subclass tree is included and Category To Do (with explanation) if you didn't finish.)

I've done a couple of these things for you.  Check the [[Legacy:Wiki Markup|Wiki Markup]] for more info.

Thanks for helping out. :)

'''Bob_The_Beheader:''' No, SuperApe, thank YOU. By the way, MinigunAttachment is a very well done page. It will be my template for this one. Thanks for pointing me to it. Also - It's like, physically impossible to put vehicles into a standard CTF map? I thought that VCTF was just a naming convension because some players don't like playing with vehicles... If this is the case, I think my map could very well be a CTF map, because I don't think players would count the turret as a vehicle.

'''Bob_The_Beheader:''' Should I take the comments at the beginning out? Also should I have deleted the properties portion of the source code as it is listed above? Oh, also ;) Is it appropriete to add comments of my own to the source code? Lastly, does anyone know where I can get more info about this class so that I can actually state facts on this page instead of my own assumptions, speculations and hunches? I'm thinking mostly about the properties portion... I've included the properties' default values, ok ppl?

'''Bob_The_Beheader:''' I could use some help with defining the physics properties...I don't like making this many assumptions about what a property is for. 

'''Bob_The_Beheader:''' Umm, how should I add the state-specific functions? should they be listed under the state itself, or in the functions list, with a note pointing to the state it belongs to, or both?

'''SuperApe:''' Not both, unless the function is defined (or redefined) here in this class &lt;u&gt;and&lt;/u&gt; it is altered during the state.  For example, here &lt;tt&gt;PlayOpening()&lt;/tt&gt; is defined here in the main body of code (as EMPTY), and in the state it is altered to do something.  That's where you would want to define it in both places, as the definitions change.  I've been formatting it something like this:

==States==

===MyState===

====Functions====
; MyFunction( MyArgs ) : My Function does some different stuff in this state.
; '''''Begin''''' : This is what happens when the state begins.

... but I've also seen it done like this ...

==States==
; MyState :
;: function MyFunction( MyArgs ) : My Function does some different stuff in this state.
;: '''Begin''' : This is what happens when the state begins.

... I suggest the first one.  Also, I suggest formatting Property definitions like so :

&lt;tt&gt;&lt;nowiki&gt;; variableType ThisProperty : The property definition.  It's default value is X.&lt;/nowiki&gt;&lt;/tt&gt;

... and Function definitions like this :

&lt;tt&gt;&lt;nowiki&gt;; returnType ThisFunction( name ThisArg, bool bNeat ) (simulated, native) : The function definition.&lt;/nowiki&gt;&lt;/tt&gt;

... IOW, loose the &quot;function&quot; and &quot;event&quot; decalaration and put them in their own sections.  Take care to do the object heirarchy box properly.  You can loose the &quot;Properties&quot; label from obvious properties sections headings, but remember to include a Main or Hidden section.  Although, it's really only necessary (helpful) to include new Properties to this class, not parent classes. (no need to include every default property value)  No need (and no use) putting your name there as the author; just put something in the Discussion section if you really want to.  Added '''Related Topics''' section.  See the updated [[Legacy:MinigunAttachment|MinigunAttachment]].  I'm repositioning the '''Known Subclasses''' section to the bottom and marking it up properly as a Class Tree (otherwise, omit that Category tag).  I would also loose as much of the commentary (like the extra &quot;!!!&quot; and parentheticals) as possible.  This is a reference.  I'm sure there's a wiki discussion page on formatting somewhere.  Good start, but needs editing.  Remember to keep the descriptions (like the main class description) breif, to the point, and sans redundancy. :)

Oh, regarding your other (many) comments:
* Yes, turrets are vehicles.  VCTF is it's own gametype in UT2004.  See also [[Legacy:Mapping For VCTF|Mapping For VCTF]].
* No, it is not appropriate to alter the Source Code if you post it.  My advice is to take it out of this page, but if you do include it on any page, leave it as is.
* Do not worry about completing the page in it's entirety.  If you don't know about something &lt;u&gt;do not&lt;/u&gt; write about it or comment on it.  If you have a question about it, include your question under the Discussion section.  Otherwise, do what you can and leave the rest for the next helpful wiki people. :)

'''Bob_The_Beheader:''' Ahh...Thank you for putting my mind at rest!

----

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy Class Tree]]

[[:Category:Legacy To Do]] &amp;ndash; See to do steps for this class page in Discussion above.  Make sure parent class pages are also done.
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle Sentinel Ceiling</title>
    <id>28271</id>
    <revision>
      <id>39928</id>
      <timestamp>2009-11-14T18:05:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle Sentinel Floor</title>
    <id>28273</id>
    <revision>
      <id>39930</id>
      <timestamp>2009-11-14T18:05:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle SpaceFighter</title>
    <id>28283</id>
    <revision>
      <id>39940</id>
      <timestamp>2009-11-14T18:07:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle SpaceFighter Human</title>
    <id>28400</id>
    <revision>
      <id>40072</id>
      <timestamp>2009-11-15T08:25:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicle SpaceFighter Skaarj</title>
    <id>28404</id>
    <revision>
      <id>40076</id>
      <timestamp>2009-11-15T08:26:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicleFactory</title>
    <id>510</id>
    <revision>
      <id>1604</id>
      <timestamp>2007-06-04T13:22:57Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <minor/>
      <comment>*Spelling</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:SVehicleFactory|SVehicleFactory]] &gt;&gt; ASVehicleFactory (Package: UT2K4Assualt)}}

ASVehicleFactory is a class that spawns vehicles for [[Legacy:Mapping_For_AS_(UT2004)|Assault (UT2004)]] maps.  The factory respawns a vehicle when the vehicle is destroyed or when the round resets.  The factory can be set to a trigger to enable/disable spawing of the vehicle.  An ASVehicleFactory can only spawn one instance of a vehicle.

==Properties==

===Main===
;bool bEnabled : If true, factory will spawn vehicles.
;bool bVehicleTeamLock : If true, members of the opposing team can't use this vehilce.
;bool bEnter_TeamUnlocks : If true, the vehicle unlocks to opposing team after if is entered.
;bool bHudTrackVehicle : If true, the vehicle will be tracked on the [[Legacy:HUD|HUD]]. Useful for tracking objectives.
;bool bRespawnWhenDestroyed : If true, when the vehicle is destroyed, a new one is spawned.
;bool bSpawnProtected : If true, the vehicle is protected when is spawns.
;bool bHighScoreKill : If true, the vehicle will award 5 points to the killer.
;bool bKeyVehilce : Used by bots.  If true, the bots will know to hunt down this vehicle.
;bool bSpawnBuildEffect : If true, the spawn effects will appear around vehicle when it spawns.
;byte VehicleTeam : The team the vehicle will belong to.

===Hidden===
;bool BACKUP_bEnabled : The initial value of bEnabled is held here.
;bool bSoundsPrecached :
;bool bResetting : Set to true when teams are switching sides (i.e. Attackers become Defenders).

===Enums===
;EAVSF_TriggeredFunction : An enumaration holding the different types of events to process when Trigger() is called.
;*EAVSF_ToggleEnabled
;*EAVSF_TriggeredSpawn
;*EAVSF_SpawnProgress

===Published===
;name VehicleTage : Tag to use with [[Legacy:Trigger|Trigger]]s
;name VehicleEvent : Event to set on vehicle (triggered when vehicle is destroyed)
;name NextFactoryTag : Next Factory to enable with Spawn Progress
;name VehiclePossessedEvent : Event thrown when vehicle is possesed.
;String VehicleClassStr : The name of the class in String form.
;float RespawnDelay : The amount of time before respawning the vehicle.
;int VehicleHealth : The initial health of the vehicle.  Set this to 0 for default.
;float VehicleDriverDamageMult : The damage multiplier applied to people in the vehicle.
;float vehicleDamageMomentumScale : The damage multiplier applied to the vehicle from crashing.
;float vehicleLinkHealMult : The multiplier applied to the [[Legacy:LinkGun|LinkGun]] healing alt-fire.
;[[Legacy:Sound|Sound]] Announcement_Destroyed : [[Legacy:Sound|Sound]] file played when when vehicle is destroyed.
;byte VehicleAmbientGlow :
;float AIVisibilityDist : Bots need to be within this distance to see the vehicle.

===Internal===
;Vehicle Child : A reference to the vehicle spawned.
;float SpawnDelay : Spawn delay to avoid spawning vehicles during resetting.
;ASVehicleFactory NextFactory : The next ASVehicleFactory in the chain.
;int MaxSpawnBlockCount : The maximum number of times the vehicle can be blocked when it tries to spawn.
;int BlockCount : The number of times the vehicle has been blocked when trying to spawn.
;[[Legacy:Emitter|Emitter]] BuildEffect : The build effect to display when vehicle is spawning.
;class&lt;[[Legacy:Emitter|Emitter]]&gt; BuildEffectClass : 
;DestroyVehicleObjective MyDestroyVehicleObjective

==Functions==
;simulated functionPostBeginPlay() :
;simulated function UpdatePrecacheMaterials() :
;simualated function UpdatePrecacheStaticMeshes() : 
;function bool SelfTriggered() : Returns true.
;event Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) :
;function SetEnabled( bool bNewEnabled ) : Sets bEnabled to bNewEnabled and attempts to spawn a new vehicle.
;function ShutDown() : Sets bEnabled to false and destroys the Child vehicle.
;function SpawnVehicle() : Attempts to spawn a vehicle in the game.
;function SpawnBuildEffect() : 
;function VehicleSpawned() : Sets the properties of the newly spawned vehicle.
;function byte SetVehicleTeam() : Sets the team number of the vehicle.
;function Reset() : Called when round is over.  Forces destruction of vehicles in play.
;function Timer() : Attempts to spawn a vehicle.
;event VehiclePossessed( [[Legacy:Vehicle|Vehicle]] V ) : Triggers VehiclePossessedEvent.
;event VehicleDestroyed( [[Legacy:Vehicle|Vehicle]] V ) : Event called when vehicle is destroyed.  Attempts to spawn a new vehicle.
;simulated function PrecacheAnnouncer([[Legacy:AnnouncerVoice|AnnouncerVoice]] V, bool bRewardSounds) : 

==Default Properties==

&lt;uscript&gt;
bEnabled=True
bSpawnBuildEffect=True
VehicleTeam=1
RespawnDelay=3.000000
VehicleDriverDamageMult=1.000000
VehicleDamageMomentumScale=1.000000
VehicleLinkHealMult=0.350000
AIVisibilityDist=15000.000000
SpawnDelay=0.150000
MaxSpawnBlockCount=5
BuildEffectClass=Class'UT2k4Assault.FX_ASVehicleBuildEffect'
VehicleClass=Class'UT2k4Assault.ASTurret'
bMovable=False
&lt;/uscript&gt;

==Known Subclasses==
 ASVehicleFactory
  +- [[Legacy:ASVehicleFactory_IonCannon|ASVehicleFactory_IonCannon]]
  +- [[Legacy:ASVehicleFactory_MinigunTurret|ASVehicleFactory_MinigunTurret]]
  +- [[Legacy:ASVehicleFactory_SentinelCeiling|ASVehicleFactory_SentinelCeiling]]
  +- [[Legacy:ASVehicleFactory_SentinelFloor|ASVehicleFactory_SentinelFloor]]
  +- [[Legacy:ASVehicleFactory_Turret|ASVehicleFactory_Turret]]
      +- [[Legacy:ASVehicleFactory_LinkTurret|ASVehicleFactory_LinkTurret]]</text>
    </revision>
    <revision>
      <id>1605</id>
      <timestamp>2006-11-06T19:38:12Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:SVehicleFactory|SVehicleFactory]] &gt;&gt; ASVehicleFactory (Package: UT2K4Assualt)}}

ASVehicleFactory is a class that spawns vehicles for [[Legacy:Mapping_For_AS_(UT2004)|Assault (UT2004)]] maps.  The factory respawns a vehicle when the vehicle is destroyed or when the round resets.  The factory can be set to a trigger to enable/disable spawing of the vehicle.  An ASVehicleFactory can only spawn one instance of a vehicle.

==Properties==

===Main===
;bool bEnabled : If true, factory will spawn vehicles.
;bool bVehicleTeamLock : If true, members of the opposing team can't use this vehilce.
;bool bEnter_TeamUnlocks : If true, the vehicle unlocks to opposing team after if is entered.
;bool bHudTrackVehicle : If true, the vehicle will be tracked on the [[Legacy:HUD|HUD]]. Useful for tracking objectives.
;bool bRespawnWhenDestroyed : If true, when the vehicle is destroyed, a new one is spawned.
;bool bSpawnProtected : If true, the vehicle is protected when is spawns.
;bool bHighScoreKill : If true, the vehicle will award 5 points to the killer.
;bool bKeyVehilce : Used by bots.  If true, the bots will know to hunt down this vehicle.
;bool bSpawnBuildEffect : If true, the spawn effects will appear around vehicle when it spawns.
;byte VehicleTeam : The team the vehicle will belong to.

===Hidden===
;bool BACKUP_bEnabled : The initial value of bEnabled is held here.
;bool bSoundsPrecached :
;bool bResetting : Set to true when teams are switching sides (i.e. Attackers become Defenders).

===Enums===
;EAVSF_TriggeredFunction : An enumaration holding the different types of events to process when Trigger() is called.
;*EAVSF_ToggleEnabled
;*EAVSF_TriggeredSpawn
;*EAVSF_SpawnProgress

===Published===
;name VehicleTage : Tag to use with [[Legacy:Trigger|Trigger]]s
;name VehicleEvent : Event to set on vehicle (triggered when vehicle is destroyed)
;name NextFactoryTag : Next Factory to enable with Spawn Progress
;name VehiclePossessedEvent : Event thrown when vehicle is possesed.
;Strig VehicleClassStr : The name of the class in String form.
;float RespawnDelay : The amount of time before respawning the vehicle.
;int VehicleHealth : The initial health of the vehicle.  Set this to 0 for default.
;float VehicleDriverDamageMult : The damage multiplier applied to people in the vehicle.
;float vehicleDamageMomentumScale : The damage multiplier applied to the vehicle from crashing.
;float vehicleLinkHealMult : The multiplier applied to the [[Legacy:LinkGun|LinkGun]] healing alt-fire.
;[[Legacy:Sound|Sound]] Announcement_Destroyed : [[Legacy:Sound|Sound]] file played when when vehicle is destroyed.
;byte VehicleAmbientGlow :
;float AIVisibilityDist : Bots need to be within this distance to see the vehicle.

===Internal===
;Vehicle Child : A reference to the vehicle spawned.
;float SpawnDelay : Spawn delay to avoid spawning vehicles during resetting.
;ASVehicleFactory NextFactory : The next ASVehicleFactory in the chain.
;int MaxSpawnBlockCount : The maximum number of times the vehicle can be blocked when it tries to spawn.
;int BlockCount : The number of times the vehicle has been blocked when trying to spawn.
;[[Legacy:Emitter|Emitter]] BuildEffect : The build effect to display when vehicle is spawning.
;class&lt;[[Legacy:Emitter|Emitter]]&gt; BuildEffectClass : 
;DestroyVehicleObjective MyDestroyVehicleObjective

==Functions==
;simulated functionPostBeginPlay() :
;simulated function UpdatePrecacheMaterials() :
;simualated function UpdatePrecacheStaticMeshes() : 
;function bool SelfTriggered() : Returns true.
;event Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) :
;function SetEnabled( bool bNewEnabled ) : Sets bEnabled to bNewEnabled and attempts to spawn a new vehicle.
;function ShutDown() : Sets bEnabled to false and destroys the Child vehicle.
;function SpawnVehicle() : Attempts to spawn a vehicle in the game.
;function SpawnBuildEffect() : 
;function VehicleSpawned() : Sets the properties of the newly spawned vehicle.
;function byte SetVehicleTeam() : Sets the team number of the vehicle.
;function Reset() : Called when round is over.  Forces destruction of vehicles in play.
;function Timer() : Attempts to spawn a vehicle.
;event VehiclePossessed( [[Legacy:Vehicle|Vehicle]] V ) : Triggers VehiclePossessedEvent.
;event VehicleDestroyed( [[Legacy:Vehicle|Vehicle]] V ) : Event called when vehicle is destroyed.  Attempts to spawn a new vehicle.
;simulated function PrecacheAnnouncer([[Legacy:AnnouncerVoice|AnnouncerVoice]] V, bool bRewardSounds) : 

==Default Properties==

&lt;uscript&gt;
bEnabled=True
bSpawnBuildEffect=True
VehicleTeam=1
RespawnDelay=3.000000
VehicleDriverDamageMult=1.000000
VehicleDamageMomentumScale=1.000000
VehicleLinkHealMult=0.350000
AIVisibilityDist=15000.000000
SpawnDelay=0.150000
MaxSpawnBlockCount=5
BuildEffectClass=Class'UT2k4Assault.FX_ASVehicleBuildEffect'
VehicleClass=Class'UT2k4Assault.ASTurret'
bMovable=False
&lt;/uscript&gt;

==Known Subclasses==
 ASVehicleFactory
  +- [[Legacy:ASVehicleFactory_IonCannon|ASVehicleFactory_IonCannon]]
  +- [[Legacy:ASVehicleFactory_MinigunTurret|ASVehicleFactory_MinigunTurret]]
  +- [[Legacy:ASVehicleFactory_SentinelCeiling|ASVehicleFactory_SentinelCeiling]]
  +- [[Legacy:ASVehicleFactory_SentinelFloor|ASVehicleFactory_SentinelFloor]]
  +- [[Legacy:ASVehicleFactory_Turret|ASVehicleFactory_Turret]]
      +- [[Legacy:ASVehicleFactory_LinkTurret|ASVehicleFactory_LinkTurret]]</text>
    </revision>
    <revision>
      <id>42617</id>
      <timestamp>2010-03-12T03:17:28Z</timestamp>
      <contributor>
        <username>Jacen</username>
        <id>1306</id>
      </contributor>
      <minor/>
      <comment>Spelling</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:SVehicleFactory|SVehicleFactory]] &gt;&gt; ASVehicleFactory (Package: UT2K4Assualt)}}

ASVehicleFactory is a class that spawns vehicles for [[Legacy:Mapping_For_AS_(UT2004)|Assault (UT2004)]] maps.  The factory respawns a vehicle when the vehicle is destroyed or when the round resets.  The factory can be set to a trigger to enable/disable spawing of the vehicle.  An ASVehicleFactory can only spawn one instance of a vehicle.

==Properties==

===Main===
;bool bEnabled : If true, factory will spawn vehicles.
;bool bVehicleTeamLock : If true, members of the opposing team can't use this vehilce.
;bool bEnter_TeamUnlocks : If true, the vehicle unlocks to opposing team after if is entered.
;bool bHudTrackVehicle : If true, the vehicle will be tracked on the [[Legacy:HUD|HUD]]. Useful for tracking objectives.
;bool bRespawnWhenDestroyed : If true, when the vehicle is destroyed, a new one is spawned.
;bool bSpawnProtected : If true, the vehicle is protected when is spawns.
;bool bHighScoreKill : If true, the vehicle will award 5 points to the killer.
;bool bKeyVehilce : Used by bots.  If true, the bots will know to hunt down this vehicle.
;bool bSpawnBuildEffect : If true, the spawn effects will appear around vehicle when it spawns.
;byte VehicleTeam : The team the vehicle will belong to.

===Hidden===
;bool BACKUP_bEnabled : The initial value of bEnabled is held here.
;bool bSoundsPrecached :
;bool bResetting : Set to true when teams are switching sides (i.e. Attackers become Defenders).

===Enums===
;EAVSF_TriggeredFunction : An enumaration holding the different types of events to process when Trigger() is called.
;*EAVSF_ToggleEnabled
;*EAVSF_TriggeredSpawn
;*EAVSF_SpawnProgress

===Published===
;name VehicleTag : Tag to use with [[Legacy:Trigger|Trigger]]s
;name VehicleEvent : Event to set on vehicle (triggered when vehicle is destroyed)
;name NextFactoryTag : Next Factory to enable with Spawn Progress
;name VehiclePossessedEvent : Event thrown when vehicle is possesed.
;String VehicleClassStr : The name of the class in String form.
;float RespawnDelay : The amount of time before respawning the vehicle.
;int VehicleHealth : The initial health of the vehicle.  Set this to 0 for default.
;float VehicleDriverDamageMult : The damage multiplier applied to people in the vehicle.
;float vehicleDamageMomentumScale : The damage multiplier applied to the vehicle from crashing.
;float vehicleLinkHealMult : The multiplier applied to the [[Legacy:LinkGun|LinkGun]] healing alt-fire.
;[[Legacy:Sound|Sound]] Announcement_Destroyed : [[Legacy:Sound|Sound]] file played when when vehicle is destroyed.
;byte VehicleAmbientGlow :
;float AIVisibilityDist : Bots need to be within this distance to see the vehicle.

===Internal===
;Vehicle Child : A reference to the vehicle spawned.
;float SpawnDelay : Spawn delay to avoid spawning vehicles during resetting.
;ASVehicleFactory NextFactory : The next ASVehicleFactory in the chain.
;int MaxSpawnBlockCount : The maximum number of times the vehicle can be blocked when it tries to spawn.
;int BlockCount : The number of times the vehicle has been blocked when trying to spawn.
;[[Legacy:Emitter|Emitter]] BuildEffect : The build effect to display when vehicle is spawning.
;class&lt;[[Legacy:Emitter|Emitter]]&gt; BuildEffectClass : 
;DestroyVehicleObjective MyDestroyVehicleObjective

==Functions==
;simulated functionPostBeginPlay() :
;simulated function UpdatePrecacheMaterials() :
;simualated function UpdatePrecacheStaticMeshes() : 
;function bool SelfTriggered() : Returns true.
;event Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) :
;function SetEnabled( bool bNewEnabled ) : Sets bEnabled to bNewEnabled and attempts to spawn a new vehicle.
;function ShutDown() : Sets bEnabled to false and destroys the Child vehicle.
;function SpawnVehicle() : Attempts to spawn a vehicle in the game.
;function SpawnBuildEffect() : 
;function VehicleSpawned() : Sets the properties of the newly spawned vehicle.
;function byte SetVehicleTeam() : Sets the team number of the vehicle.
;function Reset() : Called when round is over.  Forces destruction of vehicles in play.
;function Timer() : Attempts to spawn a vehicle.
;event VehiclePossessed( [[Legacy:Vehicle|Vehicle]] V ) : Triggers VehiclePossessedEvent.
;event VehicleDestroyed( [[Legacy:Vehicle|Vehicle]] V ) : Event called when vehicle is destroyed.  Attempts to spawn a new vehicle.
;simulated function PrecacheAnnouncer([[Legacy:AnnouncerVoice|AnnouncerVoice]] V, bool bRewardSounds) : 

==Default Properties==

&lt;uscript&gt;
bEnabled=True
bSpawnBuildEffect=True
VehicleTeam=1
RespawnDelay=3.000000
VehicleDriverDamageMult=1.000000
VehicleDamageMomentumScale=1.000000
VehicleLinkHealMult=0.350000
AIVisibilityDist=15000.000000
SpawnDelay=0.150000
MaxSpawnBlockCount=5
BuildEffectClass=Class'UT2k4Assault.FX_ASVehicleBuildEffect'
VehicleClass=Class'UT2k4Assault.ASTurret'
bMovable=False
&lt;/uscript&gt;

==Known Subclasses==
 ASVehicleFactory
  +- [[Legacy:ASVehicleFactory_IonCannon|ASVehicleFactory_IonCannon]]
  +- [[Legacy:ASVehicleFactory_MinigunTurret|ASVehicleFactory_MinigunTurret]]
  +- [[Legacy:ASVehicleFactory_SentinelCeiling|ASVehicleFactory_SentinelCeiling]]
  +- [[Legacy:ASVehicleFactory_SentinelFloor|ASVehicleFactory_SentinelFloor]]
  +- [[Legacy:ASVehicleFactory_Turret|ASVehicleFactory_Turret]]
      +- [[Legacy:ASVehicleFactory_LinkTurret|ASVehicleFactory_LinkTurret]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicleFactory LinkTurret</title>
    <id>28879</id>
    <revision>
      <id>42809</id>
      <timestamp>2010-03-31T11:02:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicleFactory MinigunTurret</title>
    <id>28480</id>
    <revision>
      <id>40181</id>
      <timestamp>2009-11-17T10:54:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicleFactory SentinelCeiling</title>
    <id>517</id>
    <revision>
      <id>1616</id>
      <timestamp>2008-02-07T20:48:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==ASVehicleFactory: SentinelCeiling (UT2004)==

Sentinel Ceiling is an automated energy turret, which can be used even for anti-spawn-camping and automated defender turrets.&lt;br /&gt;It can be used as a normal defense turret by setting ASVehicleFactory_SentinelCeiling -&gt; bSpawnCampProtection: FALSE&lt;br /&gt;In that case, the sentinel is &quot;closed&quot; until something hits it or until it sees an enemy. Generally it kills a player with 100 health,(and no shield) in 5-6 shots.

But the sentinel can be also set to bSpawnCampProtection: TRUE

In that case, the sentinel will act as a super-strong turret. Only recommended for spawn camp protection!&lt;br /&gt;Setting bSpawnCampProtection: TRUE, will enhance&lt;br /&gt;the sentinel, and it will kill any player in 1 shot (200 damage per shot), and always opened.

===TriggeredFunction(s):===

Sentinels are triggerable. Here are the functions about how will they effect when triggered:

ToggleEnabled:&lt;br /&gt;When triggered, the bEnabled will be toggled between 'False' and 'True' activating and deactivating the sentinel.

TriggeredSpawn:&lt;br /&gt;When triggered, the sentinel will spawn (not depending on bEnabled). Isn't activated before triggering

SpawnProgress (Assault Only):&lt;br /&gt;Difficult to describe in just a few words, here is a short tutorial instead:

Make sure you have a working assault map first.&lt;br /&gt;Place 2 sentinels, then select a sentinel, and set it's tag to SpawnProgressSentinel1, and bEnabled to 'True'.&lt;br /&gt;Now select the another one and set it's tag to SpawnProgressSentinel2, and bEnabled to 'False'.&lt;br /&gt;Now select the 1. sentinel and set ASVehicleFactory -&gt; NextFactoryTag: SpawnProgressSentinel2.&lt;br /&gt;Now place a trigger to a known place of you, and set it's event to SpawnProgressSentinel1 (make sure that you can see both the sentinels from the trigger, this is not needed, only to see the effect).

==Discussion==

'''Delta:'''Seems to work correctly...</text>
    </revision>
    <revision>
      <id>1617</id>
      <timestamp>2008-02-07T20:19:25Z</timestamp>
      <contributor>
        <ip>64-73-249-183.static-ip.telepacific.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">lulz gone</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicleFactory SentinelFloor</title>
    <id>28511</id>
    <revision>
      <id>40212</id>
      <timestamp>2009-11-17T11:00:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ASVehicleFactory Turret</title>
    <id>28530</id>
    <revision>
      <id>40231</id>
      <timestamp>2009-11-17T11:03:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ATimson</title>
    <id>388</id>
    <revision>
      <id>1307</id>
      <timestamp>2002-11-01T20:21:21Z</timestamp>
      <contributor>
        <ip>ATimson</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki! :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''ATimson:''' Thanks! :biggrin:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1308</id>
      <timestamp>2002-11-01T19:59:45Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki! :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AX000</title>
    <id>368</id>
    <revision>
      <id>1255</id>
      <timestamp>2002-07-06T13:49:00Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Welcome to the Wiki, AX000. &amp;ndash; [[Legacy:Wormbo|Wormbo]]
: Seconded. Welcome aboard. :)  &amp;ndash; ''Tarquin'' 

Thanks. I added your [[Legacy:YawTeleporter|YawTeleporter]] so more mappers will use it. &amp;ndash; [[Legacy:AX000|AX000]]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1256</id>
      <timestamp>2002-05-10T10:38:53Z</timestamp>
      <contributor>
        <ip>AX000</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome to the Wiki, AX000. &amp;ndash; [[Legacy:Wormbo|Wormbo]]

Thanks. I added your [[Legacy:YawTeleporter|YawTeleporter]] so more mappers will use it. &amp;ndash; [[Legacy:AX000|AX000]]</text>
    </revision>
    <revision>
      <id>1257</id>
      <timestamp>2002-05-10T12:48:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome to the Wiki, AX000. &amp;ndash; [[Legacy:Wormbo|Wormbo]]
: Seconded. Welcome aboard. :)  &amp;ndash; ''Tarquin'' 

Thanks. I added your [[Legacy:YawTeleporter|YawTeleporter]] so more mappers will use it. &amp;ndash; [[Legacy:AX000|AX000]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Beams</title>
    <id>467</id>
    <revision>
      <id>1523</id>
      <timestamp>2004-04-06T11:43:41Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-ASupport01AB.png|center|AbaddonHardware.Beams.ASupport01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-ASupport02ab.png|center|AbaddonHardware.Beams.ASupport02ab]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-ASupport03AB.png|center|AbaddonHardware.Beams.ASupport03AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-BeamML1GO.png|center|AbaddonHardware.Beams.BeamML1GO]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-Sup2Beam25601AB.png|center|AbaddonHardware.Beams.Sup2Beam25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-Sup2Beam51201AB.png|center|AbaddonHardware.Beams.Sup2Beam51201AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-Support01AB.png|center|AbaddonHardware.Beams.Support01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-SupTopBeam01BA.png|center|AbaddonHardware.Beams.SupTopBeam01BA]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Beams-SupYbeam01BA.png|center|AbaddonHardware.Beams.SupYbeam01BA]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Celings</title>
    <id>468</id>
    <revision>
      <id>1524</id>
      <timestamp>2004-04-06T11:44:28Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Ceilings-AOverhead25601AB.png|center|AbaddonHardware.Ceilings.AOverhead25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Ceilings-AOverhead51201AB.png|center|AbaddonHardware.Ceilings.AOverhead51201AB]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Deco</title>
    <id>469</id>
    <revision>
      <id>1525</id>
      <timestamp>2004-04-06T11:45:26Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Deco-LavaPlantML1GO.png|center|AbaddonHardware.Deco.LavaPlantML1GO]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Deco-RoxDoA.png|center|AbaddonHardware.Deco.RoxDoA]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Deco-RoxDOG.png|center|AbaddonHardware.Deco.RoxDOG]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Floors</title>
    <id>470</id>
    <revision>
      <id>1526</id>
      <timestamp>2004-04-06T11:46:07Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-ABCawalkway01.png|center|AbaddonHardware.Floors.ABCawalkway01]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-AWalk25601AB.png|center|AbaddonHardware.Floors.AWalk25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-Awalk51201AB.png|center|AbaddonHardware.Floors.Awalk51201AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-AWalk9001AB.png|center|AbaddonHardware.Floors.AWalk9001AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-AWalkT01AB.png|center|AbaddonHardware.Floors.AWalkT01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-AWalkUp01AB.png|center|AbaddonHardware.Floors.AWalkUp01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-BWalk25601AB.png|center|AbaddonHardware.Floors.BWalk25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-BWalk51201AB.png|center|AbaddonHardware.Floors.BWalk51201AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-BWalk9001AB.png|center|AbaddonHardware.Floors.BWalk9001AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-BWalkT01AB.png|center|AbaddonHardware.Floors.BWalkT01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-BWalkUp01AB.png|center|AbaddonHardware.Floors.BWalkUp01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-IxstairsA.png|center|AbaddonHardware.Floors.IxstairsA]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Floors-ScorchBridgeA.png|center|AbaddonHardware.Floors.ScorchBridgeA]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-LavaFormations</title>
    <id>471</id>
    <revision>
      <id>1527</id>
      <timestamp>2004-04-06T11:46:49Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-LavaFormations-AStacks1G0.png|center|AbaddonHardware.LavaFormations.AStacks1G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-LavaFormations-AStacks2G0.png|center|AbaddonHardware.LavaFormations.AStacks2G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-LavaFormations-AStacks3G0.png|center|AbaddonHardware.LavaFormations.AStacks3G0]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Lights</title>
    <id>472</id>
    <revision>
      <id>1528</id>
      <timestamp>2004-04-06T11:47:26Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Alight01AB.png|center|AbaddonHardware.Lights.Alight01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht1.png|center|AbaddonHardware.Lights.Ligjht1]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht2.png|center|AbaddonHardware.Lights.Ligjht2]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht3.png|center|AbaddonHardware.Lights.Ligjht3]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht4.png|center|AbaddonHardware.Lights.Ligjht4]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht5.png|center|AbaddonHardware.Lights.Ligjht5]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht6.png|center|AbaddonHardware.Lights.Ligjht6]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht7.png|center|AbaddonHardware.Lights.Ligjht7]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Lights-Ligjht8.png|center|AbaddonHardware.Lights.Ligjht8]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Miscellaneous</title>
    <id>473</id>
    <revision>
      <id>1529</id>
      <timestamp>2004-04-06T11:48:02Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ABCAcage-02.png|center|AbaddonHardware.Miscellaneous.ABCAcage.02]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ABCAMiddlepeak06.png|center|AbaddonHardware.Miscellaneous.ABCAMiddlepeak06]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ABCASpikes01.png|center|AbaddonHardware.Miscellaneous.ABCASpikes01]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ABCAtowertopdecos02.png|center|AbaddonHardware.Miscellaneous.ABCAtowertopdecos02]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ABLift.png|center|AbaddonHardware.Miscellaneous.ABLift]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ARailA25601AB.png|center|AbaddonHardware.Miscellaneous.ARailA25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ARailHRound01AB.png|center|AbaddonHardware.Miscellaneous.ARailHRound01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ARailHRound02AB.png|center|AbaddonHardware.Miscellaneous.ARailHRound02AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-BottomTube01AB.png|center|AbaddonHardware.Miscellaneous.BottomTube01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Bridge01AB.png|center|AbaddonHardware.Miscellaneous.Bridge01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Bridge01bAB.png|center|AbaddonHardware.Miscellaneous.Bridge01bAB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Bridge01bGratesAB.png|center|AbaddonHardware.Miscellaneous.Bridge01bGratesAB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-CircleGrate01AB.png|center|AbaddonHardware.Miscellaneous.CircleGrate01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Controls01AB.png|center|AbaddonHardware.Miscellaneous.Controls01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-door01AB.png|center|AbaddonHardware.Miscellaneous.door01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ElevatorML1G0.png|center|AbaddonHardware.Miscellaneous.ElevatorML1G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ElevTrackML1G0.png|center|AbaddonHardware.Miscellaneous.ElevTrackML1G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Fan01AB.png|center|AbaddonHardware.Miscellaneous.Fan01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Gadget01AB.png|center|AbaddonHardware.Miscellaneous.Gadget01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-hook01AB.png|center|AbaddonHardware.Miscellaneous.hook01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-InsetTank01AB.png|center|AbaddonHardware.Miscellaneous.InsetTank01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-InsetTank02AB.png|center|AbaddonHardware.Miscellaneous.InsetTank02AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-IxDoorTrim1G0.png|center|AbaddonHardware.Miscellaneous.IxDoorTrim1G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-IxDoorway1G0.png|center|AbaddonHardware.Miscellaneous.IxDoorway1G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-JointML1G0.png|center|AbaddonHardware.Miscellaneous.JointML1G0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar01AB.png|center|AbaddonHardware.Miscellaneous.Pillar01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar01ABskin.png|center|AbaddonHardware.Miscellaneous.Pillar01ABskin]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-pillar02ab.png|center|AbaddonHardware.Miscellaneous.pillar02ab]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar03AB.png|center|AbaddonHardware.Miscellaneous.Pillar03AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar04AB.png|center|AbaddonHardware.Miscellaneous.Pillar04AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Pillar04bAB.png|center|AbaddonHardware.Miscellaneous.Pillar04bAB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ScorchDoorG0.png|center|AbaddonHardware.Miscellaneous.ScorchDoorG0]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ScorchShapeA.png|center|AbaddonHardware.Miscellaneous.ScorchShapeA]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-ScorchShapeB.png|center|AbaddonHardware.Miscellaneous.ScorchShapeB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Screen01AB.png|center|AbaddonHardware.Miscellaneous.Screen01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-smallTank01AB.png|center|AbaddonHardware.Miscellaneous.smallTank01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Tank01AB.png|center|AbaddonHardware.Miscellaneous.Tank01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Tankglass01AB.png|center|AbaddonHardware.Miscellaneous.Tankglass01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-TeleporterWing.png|center|AbaddonHardware.Miscellaneous.TeleporterWing]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-TopTube01AB.png|center|AbaddonHardware.Miscellaneous.TopTube01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Vent01AB.png|center|AbaddonHardware.Miscellaneous.Vent01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-victim01AB.png|center|AbaddonHardware.Miscellaneous.victim01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-Wires01AB.png|center|AbaddonHardware.Miscellaneous.Wires01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Miscellaneous-wrench01AB.png|center|AbaddonHardware.Miscellaneous.wrench01AB]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-Pipes</title>
    <id>474</id>
    <revision>
      <id>1530</id>
      <timestamp>2004-04-06T11:49:00Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-AInsert01AB.png|center|AbaddonHardware.Pipes.AInsert01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe12801AB.png|center|AbaddonHardware.Pipes.APipe12801AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe12802AB.png|center|AbaddonHardware.Pipes.APipe12802AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe128Insert01AB.png|center|AbaddonHardware.Pipes.APipe128Insert01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe128LowR01AB.png|center|AbaddonHardware.Pipes.APipe128LowR01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe128lowR02AB.png|center|AbaddonHardware.Pipes.APipe128lowR02AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe25601AB.png|center|AbaddonHardware.Pipes.APipe25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe256LowR01AB.png|center|AbaddonHardware.Pipes.APipe256LowR01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe51201AB.png|center|AbaddonHardware.Pipes.APipe51201AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe512LowR01AB.png|center|AbaddonHardware.Pipes.APipe512LowR01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe9001AB.png|center|AbaddonHardware.Pipes.APipe9001AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipe90LowR01AB.png|center|AbaddonHardware.Pipes.APipe90LowR01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipeCorner01AB.png|center|AbaddonHardware.Pipes.APipeCorner01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-Pipes-APipeCornerLowR01AB.png|center|AbaddonHardware.Pipes.APipeCornerLowR01AB]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AbaddonHardware-WallPanels</title>
    <id>475</id>
    <revision>
      <id>1531</id>
      <timestamp>2004-04-06T11:50:08Z</timestamp>
      <contributor>
        <ip>Ip68-14-23-41.ri.ri.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-ASupLowPanel25601AB.png|center|AbaddonHardware.WallPanels.ASupLowPanel25601AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-ASupLowPanel51201AB.png|center|AbaddonHardware.WallPanels.ASupLowPanel51201AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Corner01AB.png|center|AbaddonHardware.WallPanels.Corner01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-SupTopPanel25601BA.png|center|AbaddonHardware.WallPanels.SupTopPanel25601BA]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Suptoppanel51201ba.png|center|AbaddonHardware.WallPanels.Suptoppanel51201ba]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-TopWall01AB.png|center|AbaddonHardware.WallPanels.TopWall01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-TopWall02AB.png|center|AbaddonHardware.WallPanels.TopWall02AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-TopWall03AB.png|center|AbaddonHardware.WallPanels.TopWall03AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-TopWallCap01AB.png|center|AbaddonHardware.WallPanels.TopWallCap01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall01AB.png|center|AbaddonHardware.WallPanels.Wall01AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall25602AB.png|center|AbaddonHardware.WallPanels.Wall25602AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall25603AB.png|center|AbaddonHardware.WallPanels.Wall25603AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall25603bAB.png|center|AbaddonHardware.WallPanels.Wall25603bAB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall25603bgrateAB.png|center|AbaddonHardware.WallPanels.Wall25603bgrateAB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall256AB.png|center|AbaddonHardware.WallPanels.Wall256AB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-Wall256bAB.png|center|AbaddonHardware.WallPanels.Wall256bAB]]

[[Image:Legacy_StaticMeshPic-AbaddonHardware-WallPanels-wrench01AB.png|center|AbaddonHardware.WallPanels.wrench01AB]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Abednego</title>
    <id>466</id>
    <revision>
      <id>1520</id>
      <timestamp>2004-04-06T18:50:31Z</timestamp>
      <contributor>
        <ip>Abednego</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey, I'm very very new here.  I've got a favorite mod from Quake that I'm (hopefully) going to rewrite for UT2003/2004.

I'm a complete beginner with UnrealScript but I'm running through the tutorials, and I've got the Wiki.  heh

Wish me luck!  :)

I'm also the co-leader of a UT2003/2004 Bombing Run/ONS/AS Clan.  Feel free to visit us at http://www.deadlybreed.com. 

==Guest Book==

'''abednego:''' Wow, you guys are fast.  Wait, should I have put this comment at the bottom? Also, is there any way to get my name to have the first letter as lowercase?

'''EntropicLqd:''' Good luck :)  - Welcome to the Wiki

'''Dr.AwkwArD:''' Welcome, sir, welcome. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1521</id>
      <timestamp>2004-04-01T07:52:53Z</timestamp>
      <contributor>
        <ip>Dr.AwkwArD</ip>
      </contributor>
      <comment>Welcome!</comment>
      <text xml:space="preserve">Hey, I'm very very new here.  I've got a favorite mod from Quake that I'm (hopefully) going to rewrite for UT2003/2004.

I'm a complete beginner with UnrealScript but I'm running through the tutorials, and I've got the Wiki.  heh

Wish me luck!  :)

I'm also the leader of a UT2003 Bombing Run Clan.  Feel free to visit us at http://www.deadlybreed.com. 

==Guest Book==

'''EntropicLqd:''' Good luck :)  - Welcome to the Wiki

'''Dr.AwkwArD:''' Welcome, sir, welcome. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1522</id>
      <timestamp>2004-04-01T23:12:24Z</timestamp>
      <contributor>
        <ip>Abednego</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey, I'm very very new here.  I've got a favorite mod from Quake that I'm (hopefully) going to rewrite for UT2003/2004.

I'm a complete beginner with UnrealScript but I'm running through the tutorials, and I've got the Wiki.  heh

Wish me luck!  :)

I'm also the leader of a UT2003 Bombing Run Clan.  Feel free to visit us at http://www.deadlybreed.com. 

==Guest Book==

'''abednego:''' Wow, you guys are fast.  Wait, should I have put this comment at the bottom? Also, is there any way to get my name to have the first letter as lowercase?

'''EntropicLqd:''' Good luck :)  - Welcome to the Wiki

'''Dr.AwkwArD:''' Welcome, sir, welcome. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AccessControl</title>
    <id>456</id>
    <revision>
      <id>1501</id>
      <timestamp>2004-09-29T10:58:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>incomplete is worse than nothing</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; AccessControl (Package: Engine)}}

AccessControl is a helper class for [[Legacy:GameInfo|GameInfo]]. The AccessControl class determines whether or not the player is allowed to login in the PreLogin() function, and also controls whether or not a player can enter as a spectator or a game administrator.

==Constants==
; PROPNUM = 4 : Number of configurable options and their descriptions.

==Properties==

===Localization===
; string ACDescText[PROPNUM] : Descriptions for configurable options.
; string ACDisplayText[PROPNUM] : Display names of configurable options.
; string IPBanned : Message shown to player when they are rejected from the server because their IP is banned.
; string DefaultKickReason : Default reason added to a kick message.
; string IdleKickReason : Message shown to players when they are kicked for idling.
; string KickedMsg : Message shown to players when they are kicked from the server.
; string NeedPassword : Message shown when player logs in without providing a required game password.
; string SessionBanned : Message shown to player when they are rejected from the server because they are session-banned.
; string WrongPassword : Message shown when player logs in with the wrong game password.

===Configuration===
; string AdminPassword (globalconfig, private) : Password to receive bAdmin privileges.
; bool bBanByID (globalconfig) : Set to true to ban by CDKey hash instead of banning by IP.
; array&lt;string&gt; BannedIDs (globalconfig) : Holds information about banned player IDs.
; string GamePassword (globalconfig, private) : Password required to enter game.
; array&lt;string&gt; IPPolicies (globalconfig) : An array of IP policies. Values start with &quot;ALLOW,&quot; for allowing a range of IPs or &quot;DENY,&quot; to ban a range of IP addresses followed by an IP possibly with the wildcard &lt;code&gt;*&lt;/code&gt; to specify IP ranges.
; float LoginDelaySeconds (globalconfig) : Delay between login attempts.
; array&lt; class&lt;[[Legacy:XPrivilegeBase|xPrivilegeBase]]&gt; &gt; PrivClasses (config) : 

===Other===
; class&lt;[[Legacy:AdminBase|AdminBase]]&gt; AdminClass : Class of the [[Legacy:Admin|Admin]] object.
; string AdminName (private) : 
; string AdminPassword (private) : Admin password.
; string AllPrivs : 
; bool bReplyToGUI : 
; bool bDontAddDefaultAdmin : Wether to add the default admin login. (Admin/Admin)
; [[Legacy:XAdminGroupList|xAdminGroupList]] Groups : 
; array&lt;AdminPlayer&gt; LoggedAdmins (protected) : List of admins.
; array&lt;[[Legacy:XPrivilegeBase|xPrivilegeBase]]&gt; PrivManagers : 
; array&lt;string&gt; SessionBannedIDs (transient) : Player IDs banned for the current match.
; array&lt;string&gt; SessionIPPolicies (transient) : IP policies for the current match. This works just like the permanent IPPolicies.
; [[Legacy:XAdminUserList|xAdminUserList]] Users : List of logged-in users.

==Structures==

===AdminPlayer===

Associates a user with a PlayerReplicationInfo.
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI : 
; [[Legacy:XAdminUser|xAdminUser]] User : 

==Functions==

; bool AdminLogin ([[Legacy:PlayerController|PlayerController]] P, string Password) : Attempts to log player in as an admin. Returns true if successful, false if unsuccessful.
; bool AdminLogout ([[Legacy:PlayerController|PlayerController]] P) : Attempts to log player out of admin. Returns true if successful, false if failed.
; AdminEntered ([[Legacy:PlayerController|PlayerController]] P) : Alert that the admin logged in. Perhaps you want to log this to a file, or broadcast a message or something.
; AdminExited ([[Legacy:PlayerController|PlayerController]] P) : Alert that the admin logged out. Perhaps you want to log this to a file, or broadcast a message or something.
; IsAdmin ([[Legacy:PlayerController|PlayerController]] P) : Returns true if the player is an admin.
; SetAdminPassword (string P) : Sets the admin password.
; SetGamePassword (string P) : Sets the game password.
; bool RequiresPassword ( ) : Returns true if the game password is not an empty string.
; Kick (string S) : Finds the first player matching the string S and kicks them.
; KickBan (string S) : Finds the first player matching the string S and kicks and bans them.
; bool CheckOptionsAdmin (string Options) :
; bool ValidLogin (string Password) : 
; event PreLogin (string Options, string Address, out string Error, out string FailCode, bool bSpectator) : Accept or reject a player on the server. Fails login if you set the Error to a non-empty string.
; bool CheckIPPolicy (string Address) : Used by PreLogin to see if a player is banned or not. Returns true if the player is allowed to join.

==Related Topics==
* [[Legacy:Admin|Admin]]
* [[Legacy:GameInfo|GameInfo]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1502</id>
      <timestamp>2004-09-29T07:58:14Z</timestamp>
      <contributor>
        <ip>Ip68-10-173-122.hr.hr.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; AccessControl}}

AccessControl is a helper class for [[Legacy:GameInfo|GameInfo]]. The AccessControl class determines whether or not the player is allowed to login in the PreLogin() function, and also controls whether or not a player can enter as a spectator or a game administrator.

==Properties==

; globalconfig string IPPolicies[50]:An array of IP policies. Also known as the &quot;ban list&quot;.
; localized string IPBanned:Message shown to player when they are rejected from the server because their IP is banned.
; localized string WrongPassword:Message shown when player logs in with the wrong game password.
; localized string NeedPassword:Message shown when player logs in without providing a required game password.
; class&lt;[[Legacy:AdminBase|AdminBase]]&gt; AdminClass:Class of the [[Legacy:Admin|Admin]] object.
; private string AdminPassword:Admin password.
; private globalconfig string GamePassword:Password required to enter game.

==Functions==

; bool AdminLogin([[Legacy:PlayerController|PlayerController]] P, string Password): Attempts to log player in as an admin. Returns true if successful, false if unsuccessful.
; bool AdminLogout([[Legacy:PlayerController|PlayerController]] P): Attempts to log player out of admin. Returns true if successful, false if failed.
; AdminEntered([[Legacy:PlayerController|PlayerController]] P): Alert that the admin logged in. Perhaps you want to log this to a file, or broadcast a message or something.
; AdminExited([[Legacy:PlayerController|PlayerController]] P): Alert that the admin logged out. Perhaps you want to log this to a file, or broadcast a message or something.
; IsAdmin([[Legacy:PlayerController|PlayerController]] P): Returns true if the player is an admin.
; SetAdminPassword(string P): Sets the admin password.
; SetGamePassword(string P): Sets the game password.
; bool RequiresPassword(): Returns true if the game password is not an empty string.
; Kick(string S): Finds the first player matching the string S and kicks them.
; KickBan(string S): Finds the first player matching the string S and kicks and bans them.
; bool CheckOptionsAdmin(string Options)
; bool ValidLogin(string Password)
; event PreLogin(string Options, string Address, out string Error, out string FailCode, bool bSpectator):Accept or reject a player on the server. Fails login if you set the Error to a non-empty string.
; bool CheckIPPolicy(string Address): Used by PreLogin to see if a player is banned or not. Returns true if the player is allowed to join.

==Related Topics==
* [[Legacy:Admin|Admin]]
* [[Legacy:GameInfo|GameInfo]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Accessed None</title>
    <id>454</id>
    <revision>
      <id>1498</id>
      <timestamp>2003-12-13T13:18:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>redirected to Log Warnings</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Log Warnings|Log Warnings]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Acidsphinx'S Journal Into UT3</title>
    <id>28770</id>
    <revision>
      <id>42383</id>
      <timestamp>2010-01-17T13:57:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirected page to [[Legacy:Acidsphinx's Journal Into UT3]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Acidsphinx's Journal Into UT3]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Acidsphinx's Journal Into UT3</title>
    <id>520</id>
    <revision>
      <id>1623</id>
      <timestamp>2008-02-27T18:28:45Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_ASJournal_Title.jpeg|]] 

The exact final product to this page has changed slightly, originally I had planned on a set of tutorials that would show how a DeathMatch map, which I am still working on, was made, hopefully in enough detail that anyone could follow it.

However, because of the fact that I am reaching a little further than I had originally planned, I now want the first set of tutorials to orientate around custom content and how it was made, while showing also how it can be applied through the DM-SeismicCanyon map, hoepfully showcasing a lot of what is included in the content pack.

The focus has shifted from just getting a DeathMatch map compleated and documented, to a long term mission to provide a lot of content based on Siesmic Canyons theme, and documenting it here, as well as providing a small showcase file via FileFront of each specific element added to the pack.

I have also started looking for more people to jump on board this little escapade. While I have only just started this section recently and there is little here so far, I think this could be a lot of fun, and am looking forward to making it a good resource for custom map makers.

If this useage of BuF's wiki is not accepted by the admin I will probably move it elsewhere.

''Current Task: Rearanging this section of the wiki to match the change in focus of this project.''

[[Legacy:Making Seemless Textures From Photographic Sources|Making Seemless Textures from Photographic Sources]] - ''A quick and easy method!''

[[Legacy:Brimstone And Sulphur Content Pack Documentation And Links|Brimstone and Sulphur Content Pack Documentation and Links]]

[[Legacy:The Making Of DM-SiesmicCanyon|The Making of DM-SiesmicCanyon]] Using Brimstone and Sulphur Content Pack

=Everything Below Here is to be eventually ERASED and rewritten in the new section.=

===DM-Siesmic Canyon===

====Miscellanious Infos====

[[Legacy:DM-Seismic Canyon Foreword|DM-Seismic Canyon Foreword]]

[[Legacy:DM-Siesmic Canyon Links|DM-Siesmic Canyon Links]]

[[Legacy:DM-Siesmic Canyon Planning|DM-Siesmic Canyon Planning]]

[[Legacy:DM-Siesmic Canyon Files|DM-Siesmic Canyon Files]]

====Practicle Guides====

'''Part #01''' - A quick mesh for DM-Siesmic Canyon, the asociated procedure of making all aspects of the mesh, and importing it for use in the UT3 Editor ''(UTEd4)''

''Note: This Part has files (see above), it is nearly compleate, and ready for revision.

[[Legacy:Part 01 DM-Siesmic Canyon Textures|Part 01 DM-Siesmic Canyon Textures]]

[[Legacy:Part 01 DM-Siesmic Canyon Static Meshes|Part 01 DM-Siesmic Canyon Static Meshes]]

[[Legacy:Part 01 DM-Siesmic Canyon Mesh Import|Part 01 DM-Siesmic Canyon Mesh Import]]

[[Legacy:Part 01 DM-Siesmic Canyon Cascade Particles|Part 01 DM-Siesmic Canyon Cascade Particles]]

[[Legacy:Part 01 DM-Siesmic Canyon A Quick Test|Part 01 DM-Siesmic Canyon A Quick Test]] ''Note: This chapter needs to be rewritten to correspond to the downloadable example''

'''Part #02''' - A briney sulphurous pool of water, the asociated procedures of making the pool from scratch, with custom effects for use in the UT3 Editor ''(UTEd4)''

''Note: This chapter is flawed, and requires to be totally restructured.''

''Note: This chapter is also in the process of being totally rewritten.''

[[Legacy:Part 02 DM-Siesmic Canyon Textures|Part 02 DM-Siesmic Canyon Textures]]

[[Legacy:Part 02 DM-Siesmic Canyon UTMaterials|Part 02 DM-Siesmic Canyon UTMaterials]]

[[Legacy:Part 02 DM-Siesmic Canyon Shallow And Deep Water|Part 02 DM-Siesmic Canyon Shallow and Deep Water]]

====What I learnt from writing the Practicle Guide - Summarized====

[[Legacy:Part 01-Using VertexColoring To Smoothly Texture Static Meshes|Part 01-Using VertexColoring to Smoothly Texture Static Meshes]]

[[Legacy:Part 01-Touching On Emitters|Part 01-Touching on Emitters]]</text>
    </revision>
    <revision>
      <id>1624</id>
      <timestamp>2008-02-23T21:00:27Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_ASJournal_Title.jpeg|]] 

The exact final product to this page has changed slightly, originally I had planned on a set of tutorials that would show how a DeathMatch map, which I am still working on, was made, hopefully in enough detail that anyone could follow it.

However, because of the fact that I am reaching a little further than I had originally planned, I now want the first set of tutorials to orientate around custom content and how it was made, while showing also how it can be applied through the DM-SeismicCanyon map, hoepfully showcasing a lot of what is included in the content pack.

The focus has shifted from just getting a DeathMatch map compleated and documented, to a long term mission to provide a lot of content based on Siesmic Canyons theme, and documenting it here, as well as providing a small showcase file via FileFront of each specific element added to the pack.

I have also started looking for more people to jump on board this little escapade. While I have only just started this section recently and there is little here so far, I think this could be a lot of fun, and am looking forward to making it a good resource for custom map makers.

If this useage of BuF's wiki is not accepted by the admin I will probably move it elsewhere.

''Current Task: Rearanging this section of the wiki to match the change in focus of this project.''

[[Legacy:Brimstone And Sulphur Content Pack Documentation And Links|Brimstone and Sulphur Content Pack Documentation and Links]]

[[Legacy:The Making Of DM-SiesmicCanyon|The Making of DM-SiesmicCanyon]] Using Brimstone and Sulphur Content Pack

=Everything Below Here is to be eventually ERASED and rewritten in the new section.=

===DM-Siesmic Canyon===

====Miscellanious Infos====

[[Legacy:DM-Seismic Canyon Foreword|DM-Seismic Canyon Foreword]]

[[Legacy:DM-Siesmic Canyon Links|DM-Siesmic Canyon Links]]

[[Legacy:DM-Siesmic Canyon Planning|DM-Siesmic Canyon Planning]]

[[Legacy:DM-Siesmic Canyon Files|DM-Siesmic Canyon Files]]

====Practicle Guides====

'''Part #01''' - A quick mesh for DM-Siesmic Canyon, the asociated procedure of making all aspects of the mesh, and importing it for use in the UT3 Editor ''(UTEd4)''

''Note: This Part has files (see above), it is nearly compleate, and ready for revision.

[[Legacy:Part 01 DM-Siesmic Canyon Textures|Part 01 DM-Siesmic Canyon Textures]]

[[Legacy:Part 01 DM-Siesmic Canyon Static Meshes|Part 01 DM-Siesmic Canyon Static Meshes]]

[[Legacy:Part 01 DM-Siesmic Canyon Mesh Import|Part 01 DM-Siesmic Canyon Mesh Import]]

[[Legacy:Part 01 DM-Siesmic Canyon Cascade Particles|Part 01 DM-Siesmic Canyon Cascade Particles]]

[[Legacy:Part 01 DM-Siesmic Canyon A Quick Test|Part 01 DM-Siesmic Canyon A Quick Test]] ''Note: This chapter needs to be rewritten to correspond to the downloadable example''

'''Part #02''' - A briney sulphurous pool of water, the asociated procedures of making the pool from scratch, with custom effects for use in the UT3 Editor ''(UTEd4)''

''Note: This chapter is flawed, and requires to be totally restructured.''

''Note: This chapter is also in the process of being totally rewritten.''

[[Legacy:Part 02 DM-Siesmic Canyon Textures|Part 02 DM-Siesmic Canyon Textures]]

[[Legacy:Part 02 DM-Siesmic Canyon UTMaterials|Part 02 DM-Siesmic Canyon UTMaterials]]

[[Legacy:Part 02 DM-Siesmic Canyon Shallow And Deep Water|Part 02 DM-Siesmic Canyon Shallow and Deep Water]]

====What I learnt from writing the Practicle Guide - Summarized====

[[Legacy:Part 01-Using VertexColoring To Smoothly Texture Static Meshes|Part 01-Using VertexColoring to Smoothly Texture Static Meshes]]

[[Legacy:Part 01-Touching On Emitters|Part 01-Touching on Emitters]]</text>
    </revision>
    <revision>
      <id>1625</id>
      <timestamp>2008-02-27T17:45:18Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_ASJournal_Title.jpeg|]] 

The exact final product to this page has changed slightly, originally I had planned on a set of tutorials that would show how a DeathMatch map, which I am still working on, was made, hopefully in enough detail that anyone could follow it.

However, because of the fact that I am reaching a little further than I had originally planned, I now want the first set of tutorials to orientate around custom content and how it was made, while showing also how it can be applied through the DM-SeismicCanyon map, hoepfully showcasing a lot of what is included in the content pack.

The focus has shifted from just getting a DeathMatch map compleated and documented, to a long term mission to provide a lot of content based on Siesmic Canyons theme, and documenting it here, as well as providing a small showcase file via FileFront of each specific element added to the pack.

I have also started looking for more people to jump on board this little escapade. While I have only just started this section recently and there is little here so far, I think this could be a lot of fun, and am looking forward to making it a good resource for custom map makers.

If this useage of BuF's wiki is not accepted by the admin I will probably move it elsewhere.

''Current Task: Rearanging this section of the wiki to match the change in focus of this project.''

[[Legacy:Making Seemless Textures From Photographic Sources|Making Seemless Textures from Photographic Sources]]

[[Legacy:Brimstone And Sulphur Content Pack Documentation And Links|Brimstone and Sulphur Content Pack Documentation and Links]]

[[Legacy:The Making Of DM-SiesmicCanyon|The Making of DM-SiesmicCanyon]] Using Brimstone and Sulphur Content Pack

=Everything Below Here is to be eventually ERASED and rewritten in the new section.=

===DM-Siesmic Canyon===

====Miscellanious Infos====

[[Legacy:DM-Seismic Canyon Foreword|DM-Seismic Canyon Foreword]]

[[Legacy:DM-Siesmic Canyon Links|DM-Siesmic Canyon Links]]

[[Legacy:DM-Siesmic Canyon Planning|DM-Siesmic Canyon Planning]]

[[Legacy:DM-Siesmic Canyon Files|DM-Siesmic Canyon Files]]

====Practicle Guides====

'''Part #01''' - A quick mesh for DM-Siesmic Canyon, the asociated procedure of making all aspects of the mesh, and importing it for use in the UT3 Editor ''(UTEd4)''

''Note: This Part has files (see above), it is nearly compleate, and ready for revision.

[[Legacy:Part 01 DM-Siesmic Canyon Textures|Part 01 DM-Siesmic Canyon Textures]]

[[Legacy:Part 01 DM-Siesmic Canyon Static Meshes|Part 01 DM-Siesmic Canyon Static Meshes]]

[[Legacy:Part 01 DM-Siesmic Canyon Mesh Import|Part 01 DM-Siesmic Canyon Mesh Import]]

[[Legacy:Part 01 DM-Siesmic Canyon Cascade Particles|Part 01 DM-Siesmic Canyon Cascade Particles]]

[[Legacy:Part 01 DM-Siesmic Canyon A Quick Test|Part 01 DM-Siesmic Canyon A Quick Test]] ''Note: This chapter needs to be rewritten to correspond to the downloadable example''

'''Part #02''' - A briney sulphurous pool of water, the asociated procedures of making the pool from scratch, with custom effects for use in the UT3 Editor ''(UTEd4)''

''Note: This chapter is flawed, and requires to be totally restructured.''

''Note: This chapter is also in the process of being totally rewritten.''

[[Legacy:Part 02 DM-Siesmic Canyon Textures|Part 02 DM-Siesmic Canyon Textures]]

[[Legacy:Part 02 DM-Siesmic Canyon UTMaterials|Part 02 DM-Siesmic Canyon UTMaterials]]

[[Legacy:Part 02 DM-Siesmic Canyon Shallow And Deep Water|Part 02 DM-Siesmic Canyon Shallow and Deep Water]]

====What I learnt from writing the Practicle Guide - Summarized====

[[Legacy:Part 01-Using VertexColoring To Smoothly Texture Static Meshes|Part 01-Using VertexColoring to Smoothly Texture Static Meshes]]

[[Legacy:Part 01-Touching On Emitters|Part 01-Touching on Emitters]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Activating A Mover</title>
    <id>318</id>
    <revision>
      <id>1141</id>
      <timestamp>2006-08-15T04:38:56Z</timestamp>
      <contributor>
        <ip>H212.214.40.69.ip.alltel.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page follows on from: 
# [[Legacy:Create A Mover|Create A Mover]]: making a mover shape and adding it to the map 
# [[Legacy:Keyframe|Keyframe]]: setting the mover keyframes 

Mover [[Legacy:Keyframe|keyframe]]s set the places the mover will go to in space. There are now two remaining questions:

# what will make the mover start moving? This is its ''activation method''
# how far along its keyframe sequence will it move &amp; when will it come back? This is set by the [[Legacy:InitialState|InitialState]].

==Activation Methods==

===Triggering===

The mover is activated by being triggered. This can be by:
* a [[Legacy:Trigger|Trigger]] (or [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]], etc) 
* another type of event, such as something the game itself generates (eg a flag capture)
* the mover itself, with '''BumpEvent''': a player bumps the mover, which fires the BumpEvent, which matches the mover's Events -&gt; Tag. See &quot;bumping&quot; below.
* Another mover (A button, switch, etc) using the MoverEvents section of its properties.

For a mover to be activated by triggering, set Object-&gt;InitialState to one of the 'TriggerFoo' [[Legacy:State|state]]s. 

===Bumping===

The mover is activated by an actor touching it. The BumpType property determines which actors count as valid.

* Use one of the Bump states
* Set the mover's BumpEvent property to match its Tag, so it triggers itself when bumped, and use a 'TriggerFoo' state.

===Standing===

The mover is activated by an actor standing on it. This is often used for lifts.

: anyone know how the engine differentiates between &quot;bump&quot; and &quot;stand&quot;?

'''Legal:''' You have to stand on top of it rather than just bumping (running into the side of) it. At least in theory...

StandOpenTimed, as I see it, is mostly for bots. A lift will still lift if it's set to &quot;BumpOpenTimed&quot;, however, a bot will think treat it like a door. StandOpenTimed lets bots know they have to stand on it.

However for extremly long lifts I would advise using '''TriggerControl''' instead. Then if the player falls, the lift will rise up and &quot;catch&quot; them.

==Setting the State==

Each state listed in the mover's Object -&gt; [[Legacy:InitialState|InitialState]] property sets a different type of behaviour for the mover. (hence they are sometimes referred to as move types.... &lt;i&gt; or are they? I might have dreamt this one...  ''Tarquin'' &lt;/i&gt;

The full list is covered in detail on the [[Legacy:Mover|Mover]] class page. Which one you use depends on what the mover is meant to represent in the map and what you want it to do:

===Lift===

Use StandOpenTimed: the mover will open, wait, close if a player or a [[Legacy:Bot (UT)|bot (UT)]] stands on it.  

===Door===

TriggerOpenTimed and TriggerControl are both often used for doors. Both will start opening when triggered, but there is a differnce in what happens next:

* TriggerOpenTimed will open, wait, close automatically regardless of where the player is.

* TriggerControl will open, and stay open as long as the player is still standing in the Trigger. The moment the player steps out, it will reverse direction and close, even if it was only partially open. 

TriggerControl is used in DM-StalwartXL for the slow-opening redeemer door, and for all the doors CTF-Cybrosis. It's a very nice effect, as doors shut as soon as the player has gone through, and also will never close on a player.

'''This is generally the preferred method for doors.'''

===Button===

Use BumpOpenTimed: the mover will open, wait, close if it's touched. BumpButton adds extra detail to the movement: see the [[Legacy:Mover|mover]] page.

==Adding a Trigger==

The next step after setting up your mover and its keyframes is adding in a [[Legacy:Trigger|Trigger]] to make it work. Note that you do not &lt;i&gt;have&lt;/i&gt; to have a trigger to make the mover work; you only need one if you are going to use an InitialState that starts with &quot;Trigger*&quot;. For the purposes of a mover, you can use any type of Trigger you want, it doesn't matter. To get the mover to activate set the Events -&gt; [[Legacy:Event|Event]] property of you trigger to the Events -&gt; [[Legacy:Tag|Tag]] property of your mover.

Note that you don't actually have to have a subclass of Trigger to trigger a mover. A mover can even be triggered by another mover, as long as the other mover's Event is set to the triggered mover's Tag. In the case of certain mods (like Jailbreak), you may also have the mover be triggered by events that are fired off by the game itself. Really, any Event that matches the mover's Tag will cause it to activate.

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Create A Mover|Create A Mover]] shape and adding it to the map
* [[Legacy:Event|Event]] and [[Legacy:Tag|Tag]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1142</id>
      <timestamp>2006-01-22T00:09:21Z</timestamp>
      <contributor>
        <ip>Bc177132.bendcable.com</ip>
      </contributor>
      <minor/>
      <comment>Removing flames, and goin on my way. I'll contribute indirectly.</comment>
      <text xml:space="preserve">This page follows on from: 
# [[Legacy:Create A Mover|Create A Mover]]: making a mover shape and adding it to the map 
# [[Legacy:Keyframe|Keyframe]]: setting the mover keyframes 

Mover [[Legacy:Keyframe|keyframe]]s set the places the mover will go to in space. There are now two remaining questions:

# what will make the mover start moving? This is its ''activation method''
# how far along its keyframe sequence will it move &amp; when will it come back? This is set by the [[Legacy:InitialState|InitialState]].

==Activation Methods==

===Triggering===

The mover is activated by being triggered. This can be by:
* a [[Legacy:Trigger|Trigger]] (or [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]], etc) 
* another type of event, such as something the game itself generates (eg a flag capture)
* the mover itself, with '''BumpEvent''': a player bumps the mover, which fires the BumpEvent, which matches the mover's Events -&gt; Tag. See &quot;bumping&quot; below.
* Another mover (A button, switch, etc) using the MoverEvents section of its properties.

For a mover to be activated by triggering, set Object-&gt;InitialState to one of the 'TriggerFoo' [[Legacy:State|state]]s. 

===Bumping===

The mover is activated by an actor touching it. The BumpType property determines which actors count as valid.

* Use one of the Bump states
* Set the mover's BumpEvent property to match its Tag, so it triggers itself when bumped, and use a 'TriggerFoo' state.

===Standing===

The mover is activated by an actor standing on it. This is often used for lifts.

: anyone know how the engine differentiates between &quot;bump&quot; and &quot;stand&quot;?

'''Legal:''' You have to stand on top of it rather than just bumping (running into the side of) it. At least in theory...

However for extremly long lifts I would advise using '''TriggerControl''' instead. Then if the player falls, the lift will rise up and &quot;catch&quot; them.

==Setting the State==

Each state listed in the mover's Object -&gt; [[Legacy:InitialState|InitialState]] property sets a different type of behaviour for the mover. (hence they are sometimes referred to as move types.... &lt;i&gt; or are they? I might have dreamt this one...  ''Tarquin'' &lt;/i&gt;

The full list is covered in detail on the [[Legacy:Mover|Mover]] class page. Which one you use depends on what the mover is meant to represent in the map and what you want it to do:

===Lift===

Use StandOpenTimed: the mover will open, wait, close if a player or a [[Legacy:Bot (UT)|bot (UT)]] stands on it.  

===Door===

TriggerOpenTimed and TriggerControl are both often used for doors. Both will start opening when triggered, but there is a differnce in what happens next:

* TriggerOpenTimed will open, wait, close automatically regardless of where the player is.

* TriggerControl will open, and stay open as long as the player is still standing in the Trigger. The moment the player steps out, it will reverse direction and close, even if it was only partially open. 

TriggerControl is used in DM-StalwartXL for the slow-opening redeemer door, and for all the doors CTF-Cybrosis. It's a very nice effect, as doors shut as soon as the player has gone through, and also will never close on a player.

'''This is generally the preferred method for doors.'''

===Button===

Use BumpOpenTimed: the mover will open, wait, close if it's touched. BumpButton adds extra detail to the movement: see the [[Legacy:Mover|mover]] page.

==Adding a Trigger==

The next step after setting up your mover and its keyframes is adding in a [[Legacy:Trigger|Trigger]] to make it work. Note that you do not &lt;i&gt;have&lt;/i&gt; to have a trigger to make the mover work; you only need one if you are going to use an InitialState that starts with &quot;Trigger*&quot;. For the purposes of a mover, you can use any type of Trigger you want, it doesn't matter. To get the mover to activate set the Events -&gt; [[Legacy:Event|Event]] property of you trigger to the Events -&gt; [[Legacy:Tag|Tag]] property of your mover.

Note that you don't actually have to have a subclass of Trigger to trigger a mover. A mover can even be triggered by another mover, as long as the other mover's Event is set to the triggered mover's Tag. In the case of certain mods (like Jailbreak), you may also have the mover be triggered by events that are fired off by the game itself. Really, any Event that matches the mover's Tag will cause it to activate.

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Create A Mover|Create A Mover]] shape and adding it to the map
* [[Legacy:Event|Event]] and [[Legacy:Tag|Tag]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35345</id>
      <timestamp>2009-08-18T12:47:02Z</timestamp>
      <contributor>
        <username>Martines5</username>
        <id>2007</id>
      </contributor>
      <minor/>
      <comment>/* Related Topics */</comment>
      <text xml:space="preserve">This page follows on from: 
# [[Legacy:Create A Mover|Create A Mover]]: making a mover shape and adding it to the map 
# [[Legacy:Keyframe|Keyframe]]: setting the mover keyframes 

Mover [[Legacy:Keyframe|keyframe]]s set the places the mover will go to in space. There are now two remaining questions:

# what will make the mover start moving? This is its ''activation method''
# how far along its keyframe sequence will it move &amp; when will it come back? This is set by the [[Legacy:InitialState|InitialState]].

==Activation Methods==

===Triggering===

The mover is activated by being triggered. This can be by:
* a [[Legacy:Trigger|Trigger]] (or [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]], etc) 
* another type of event, such as something the game itself generates (eg a flag capture)
* the mover itself, with '''BumpEvent''': a player bumps the mover, which fires the BumpEvent, which matches the mover's Events -&gt; Tag. See &quot;bumping&quot; below.
* Another mover (A button, switch, etc) using the MoverEvents section of its properties.

For a mover to be activated by triggering, set Object-&gt;InitialState to one of the 'TriggerFoo' [[Legacy:State|state]]s. 

===Bumping===

The mover is activated by an actor touching it. The BumpType property determines which actors count as valid.

* Use one of the Bump states
* Set the mover's BumpEvent property to match its Tag, so it triggers itself when bumped, and use a 'TriggerFoo' state.

===Standing===

The mover is activated by an actor standing on it. This is often used for lifts.

: anyone know how the engine differentiates between &quot;bump&quot; and &quot;stand&quot;?

'''Legal:''' You have to stand on top of it rather than just bumping (running into the side of) it. At least in theory...

StandOpenTimed, as I see it, is mostly for bots. A lift will still lift if it's set to &quot;BumpOpenTimed&quot;, however, a bot will think treat it like a door. StandOpenTimed lets bots know they have to stand on it.

However for extremly long lifts I would advise using '''TriggerControl''' instead. Then if the player falls, the lift will rise up and &quot;catch&quot; them.

==Setting the State==

Each state listed in the mover's Object -&gt; [[Legacy:InitialState|InitialState]] property sets a different type of behaviour for the mover. (hence they are sometimes referred to as move types.... &lt;i&gt; or are they? I might have dreamt this one...  ''Tarquin'' &lt;/i&gt;

The full list is covered in detail on the [[Legacy:Mover|Mover]] class page. Which one you use depends on what the mover is meant to represent in the map and what you want it to do:

===Lift===

Use StandOpenTimed: the mover will open, wait, close if a player or a [[Legacy:Bot (UT)|bot (UT)]] stands on it.  

===Door===

TriggerOpenTimed and TriggerControl are both often used for doors. Both will start opening when triggered, but there is a differnce in what happens next:

* TriggerOpenTimed will open, wait, close automatically regardless of where the player is.

* TriggerControl will open, and stay open as long as the player is still standing in the Trigger. The moment the player steps out, it will reverse direction and close, even if it was only partially open. 

TriggerControl is used in DM-StalwartXL for the slow-opening redeemer door, and for all the doors CTF-Cybrosis. It's a very nice effect, as doors shut as soon as the player has gone through, and also will never close on a player.

'''This is generally the preferred method for doors.'''

===Button===

Use BumpOpenTimed: the mover will open, wait, close if it's touched. BumpButton adds extra detail to the movement: see the [[Legacy:Mover|mover]] page.

==Adding a Trigger==

The next step after setting up your mover and its keyframes is adding in a [[Legacy:Trigger|Trigger]] to make it work. Note that you do not &lt;i&gt;have&lt;/i&gt; to have a trigger to make the mover work; you only need one if you are going to use an InitialState that starts with &quot;Trigger*&quot;. For the purposes of a mover, you can use any type of Trigger you want, it doesn't matter. To get the mover to activate set the Events -&gt; [[Legacy:Event|Event]] property of you trigger to the Events -&gt; [[Legacy:Tag|Tag]] property of your mover.

Note that you don't actually have to have a subclass of Trigger to trigger a mover. A mover can even be triggered by another mover, as long as the other mover's Event is set to the triggered mover's Tag. In the case of certain mods (like Jailbreak), you may also have the mover be triggered by events that are fired off by the game itself. Really, any Event that matches the mover's Tag will cause it to activate.

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]
* [http://www.arzinger.ua legal service Ukraine]
* [[Legacy:Create A Mover|Create A Mover]] shape and adding it to the map
* [[Legacy:Event|Event]] and [[Legacy:Tag|Tag]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35346</id>
      <timestamp>2009-08-18T18:45:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Martines5|Martines5]] ([[User talk:Martines5|Talk]]) to last revision by [[User:H212.214.40.69.ip.alltel.net|H212.214.40.69.ip.alltel.net]]</comment>
      <text xml:space="preserve">This page follows on from: 
# [[Legacy:Create A Mover|Create A Mover]]: making a mover shape and adding it to the map 
# [[Legacy:Keyframe|Keyframe]]: setting the mover keyframes 

Mover [[Legacy:Keyframe|keyframe]]s set the places the mover will go to in space. There are now two remaining questions:

# what will make the mover start moving? This is its ''activation method''
# how far along its keyframe sequence will it move &amp; when will it come back? This is set by the [[Legacy:InitialState|InitialState]].

==Activation Methods==

===Triggering===

The mover is activated by being triggered. This can be by:
* a [[Legacy:Trigger|Trigger]] (or [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]], etc) 
* another type of event, such as something the game itself generates (eg a flag capture)
* the mover itself, with '''BumpEvent''': a player bumps the mover, which fires the BumpEvent, which matches the mover's Events -&gt; Tag. See &quot;bumping&quot; below.
* Another mover (A button, switch, etc) using the MoverEvents section of its properties.

For a mover to be activated by triggering, set Object-&gt;InitialState to one of the 'TriggerFoo' [[Legacy:State|state]]s. 

===Bumping===

The mover is activated by an actor touching it. The BumpType property determines which actors count as valid.

* Use one of the Bump states
* Set the mover's BumpEvent property to match its Tag, so it triggers itself when bumped, and use a 'TriggerFoo' state.

===Standing===

The mover is activated by an actor standing on it. This is often used for lifts.

: anyone know how the engine differentiates between &quot;bump&quot; and &quot;stand&quot;?

'''Legal:''' You have to stand on top of it rather than just bumping (running into the side of) it. At least in theory...

StandOpenTimed, as I see it, is mostly for bots. A lift will still lift if it's set to &quot;BumpOpenTimed&quot;, however, a bot will think treat it like a door. StandOpenTimed lets bots know they have to stand on it.

However for extremly long lifts I would advise using '''TriggerControl''' instead. Then if the player falls, the lift will rise up and &quot;catch&quot; them.

==Setting the State==

Each state listed in the mover's Object -&gt; [[Legacy:InitialState|InitialState]] property sets a different type of behaviour for the mover. (hence they are sometimes referred to as move types.... &lt;i&gt; or are they? I might have dreamt this one...  ''Tarquin'' &lt;/i&gt;

The full list is covered in detail on the [[Legacy:Mover|Mover]] class page. Which one you use depends on what the mover is meant to represent in the map and what you want it to do:

===Lift===

Use StandOpenTimed: the mover will open, wait, close if a player or a [[Legacy:Bot (UT)|bot (UT)]] stands on it.  

===Door===

TriggerOpenTimed and TriggerControl are both often used for doors. Both will start opening when triggered, but there is a differnce in what happens next:

* TriggerOpenTimed will open, wait, close automatically regardless of where the player is.

* TriggerControl will open, and stay open as long as the player is still standing in the Trigger. The moment the player steps out, it will reverse direction and close, even if it was only partially open. 

TriggerControl is used in DM-StalwartXL for the slow-opening redeemer door, and for all the doors CTF-Cybrosis. It's a very nice effect, as doors shut as soon as the player has gone through, and also will never close on a player.

'''This is generally the preferred method for doors.'''

===Button===

Use BumpOpenTimed: the mover will open, wait, close if it's touched. BumpButton adds extra detail to the movement: see the [[Legacy:Mover|mover]] page.

==Adding a Trigger==

The next step after setting up your mover and its keyframes is adding in a [[Legacy:Trigger|Trigger]] to make it work. Note that you do not &lt;i&gt;have&lt;/i&gt; to have a trigger to make the mover work; you only need one if you are going to use an InitialState that starts with &quot;Trigger*&quot;. For the purposes of a mover, you can use any type of Trigger you want, it doesn't matter. To get the mover to activate set the Events -&gt; [[Legacy:Event|Event]] property of you trigger to the Events -&gt; [[Legacy:Tag|Tag]] property of your mover.

Note that you don't actually have to have a subclass of Trigger to trigger a mover. A mover can even be triggered by another mover, as long as the other mover's Event is set to the triggered mover's Tag. In the case of certain mods (like Jailbreak), you may also have the mover be triggered by events that are fired off by the game itself. Really, any Event that matches the mover's Tag will cause it to activate.

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Create A Mover|Create A Mover]] shape and adding it to the map
* [[Legacy:Event|Event]] and [[Legacy:Tag|Tag]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor</title>
    <id>334</id>
    <revision>
      <id>1175</id>
      <timestamp>2005-12-29T19:46:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1176</id>
      <timestamp>2005-12-10T21:04:27Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties ==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses ===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]

* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics ==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion ==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

'''Lilguy:''' Don't mind me, just added this to the UT2004 category...

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1177</id>
      <timestamp>2005-12-11T10:01:31Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties ==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses ===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]

* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics ==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion ==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35451</id>
      <timestamp>2009-10-05T18:01:13Z</timestamp>
      <contributor>
        <ip>61.219.56.227</ip>
      </contributor>
      <comment>anna witnauer</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

Hey guys, wanna chat with me?

(716) 444-4083

www.myspace.com/freegiftwiteverypurchase

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35452</id>
      <timestamp>2009-10-05T18:29:41Z</timestamp>
      <contributor>
        <ip>61.219.56.227</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

Hey guys, wanna chat with me? (anna witnauer)

(716) 444-4083

www.myspace.com/freegiftwiteverypurchase

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35453</id>
      <timestamp>2009-10-06T07:12:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/61.219.56.227|61.219.56.227]] ([[User talk:61.219.56.227|Talk]]) to last revision by [[User:SuperApe|SuperApe]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35458</id>
      <timestamp>2009-10-06T15:28:11Z</timestamp>
      <contributor>
        <ip>61.219.56.227</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

Hey guys, wanna chat with me? (anna witnauer)

(716) 444-4083

www.myspace.com/freegiftwiteverypurchase

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35459</id>
      <timestamp>2009-10-06T20:07:14Z</timestamp>
      <contributor>
        <username>Pd</username>
        <id>2036</id>
      </contributor>
      <comment>Looks like you wanna IP ban somebody? - Undo revision 35458 by [[Special:Contributions/61.219.56.227|61.219.56.227]] ([[User talk:61.219.56.227|Talk]])</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35460</id>
      <timestamp>2009-10-06T20:46:12Z</timestamp>
      <contributor>
        <ip>61.219.56.227</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on 716-444-4083nd organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35461</id>
      <timestamp>2009-10-07T09:21:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/61.219.56.227|61.219.56.227]] ([[User talk:61.219.56.227|Talk]]) to last revision by [[User:Pd|Pd]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35462</id>
      <timestamp>2009-10-07T09:50:54Z</timestamp>
      <contributor>
        <ip>58.221.41.86</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on 1-716-444-4083 organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43852</id>
      <timestamp>2010-08-10T01:09:02Z</timestamp>
      <contributor>
        <ip>92.48.88.210</ip>
      </contributor>
      <comment>Undo revision 35462 by [[Special:Contributions/58.221.41.86|58.221.41.86]] ([[User talk:58.221.41.86|Talk]]): rm vandalism</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==Discussion==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43853</id>
      <timestamp>2010-08-10T01:50:55Z</timestamp>
      <contributor>
        <ip>92.48.88.210</ip>
      </contributor>
      <comment>changed &quot;Discussion&quot; -&gt; &quot;See also&quot; (sounds better)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Actor (Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|Bot (UT)]]s, [[Legacy:Light (UT)|Light (UT)]]s and [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT see [[Legacy:Actor (UT)|Actor (UT)]].

==Configurable Properties==

Actor properties sorted by group. These can be changed from UnrealEd's [[Legacy:Actor Properties Window|actor properties window]].
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Display]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Events]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Force]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Karma]] see [[Legacy:Karma|Karma]] for now 
* LightColor and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lighting]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Object]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Replication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sound]]

''Note that not all property groups have been described yet. Please fill in if you have time.''

==Other Members Of The Actor Class==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]] that don't appear in UnrealEd's properties window
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Constants]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enums]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Structs]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]]
* [[Legacy:Iterator|Iterator]]s
* [[Legacy:Operators|Operators]] &amp;ndash; The color operators.
* Properties and functions which are [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/New In UT2004]] or have changed from UT2003

==Known Subclasses ==

See [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] for a full tree of subclasses.

===Placeable Subclasses ===

(or notplaceable with placeable subclasses)
* AntiPortalActor (see [[Legacy:Antiportal|Antiportal]])
* [[Legacy:Decoration|Decoration]]
* [[Legacy:Emitter|Emitter]]
* [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
* [[Legacy:Info|Info]]
* [[Legacy:IonCannon|IonCannon]]
* [[Legacy:KActor|KActor]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
* [[Legacy:Keypoint|Keypoint]]
* [[Legacy:Light|Light]]
* [[Legacy:MeshEffect|MeshEffect]]
* [[Legacy:NavigationPoint|NavigationPoint]]
* [[Legacy:Note|Note]]
* [[Legacy:Pawn|Pawn]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:ProjectileSpawner|ProjectileSpawner]]
* [[Legacy:Projector|Projector]]
* [[Legacy:StaticMeshActor|StaticMeshActor]]
* [[Legacy:TankVictim|TankVictim]]
* [[Legacy:Triggers|Triggers]]
* [[Legacy:VehiclePart|VehiclePart]]
* [[Legacy:VMeshActor|VMeshActor]]
* [[Legacy:XEmitter|xEmitter]]
* [[Legacy:XMaterialController|xMaterialController]]
* [[Legacy:XPickUpBase|xPickUpBase]]
* [[Legacy:XProcMesh|xProcMesh]]
* [[Legacy:XWeatherEffect|xWeatherEffect]]

===Not Placeable Subclasses===
* [[Legacy:AimedAttachment|AimedAttachment]]
* [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
* [[Legacy:Brush|Brush]]
* [[Legacy:Controller|Controller]]
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Decal|Decal]] (deprecated)
* [[Legacy:DecoVolumeObject|DecoVolumeObject]]
* [[Legacy:Effects|Effects]]
* [[Legacy:Gib|Gib]]
* [[Legacy:HUD|HUD]]
* [[Legacy:HudOverlay|HudOverlay]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:InventoryAttachment|InventoryAttachment]]
* [[Legacy:IonEffect|IonEffect]]
* [[Legacy:MatDemoActor|MatDemoActor]]
* [[Legacy:Mover|Mover]]
* [[Legacy:PrecacheHack|PrecacheHack]]
* [[Legacy:Projectile|Projectile]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:ShockCombo|ShockCombo]]
* [[Legacy:SpinnyWeap|SpinnyWeap]]
* [[Legacy:ShieldEffect|ShieldEffect]]
* [[Legacy:TransDummyBeacon|TransDummyBeacon]]
* [[Legacy:Vignette|Vignette]]
* [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]
* [[Legacy:WeaponFire|WeaponFire]]
* [[Legacy:XMaterialTrigger|xMaterialTrigger]]
* [[Legacy:XMutatorList|xMutatorList]]

==Related Topics==
* This class in other games:
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] &amp;ndash; All descendants of this class
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; more mapping- and UnrealEd-related information
* [[Legacy:Actor (UT)|Actor (UT)]] &amp;ndash; The [[Legacy:UT|UT]] version of this class
* [[Legacy:Replication|Replication]] &amp;ndash; All the evilness of network-related Actor functionality

==See also==

Great Actor Pages Debate on page names and organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (DX)</title>
    <id>339</id>
    <revision>
      <id>1188</id>
      <timestamp>2006-01-20T22:18:12Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>Fixed some stuff, removed minor unrelated things, removed things that were present in the comments in the  sourcecode but are not relevant,</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; Actor (Engine)}}

==Properties ==
; bool bIgnore : True if this actor should be generally ignored; compliance is voluntary
; float BlendAnimFrame[4] : Blending animation variable
; float BlendAnimLast[4] : Blending animation control - Last Frame
; float BlendAnimMinRate[4] : Bleinding animation control - Minimum rate for velocity-scaled animation
; float BlendAnimRate[4] : Blending animation variable
; name BlendAnimSequence[4] : Blending animation variable
; float BlendTweenRate[4] : Blending animation variable
; bool bVisionImportant : Added to make vision aug run faster.  If true, the vision aug needs to check this object more closely. Used for heat sources as well as things that blind.
; int CollisionTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; Object ConListItems : [Linked] list of ConItems for this Actor
; float CurrentVisibility : Additional variable for AI
; float DistanceFromPlayer : Added for stasis
; int ExtraTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; Inventory Inventory : Inventory chain
; float LastConEndTime : Time when last conversation ended
; float LastRenderTime : Added for stasis
; SmellNode LastSmellNode : Additional variable for AI
; float LastVisibility : Additional variable for AI
; int LightingTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; int NetTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; float OldBlendAnimRate[4] : Blending animation control - Animation rate of previous animation (is equal to AnimRate until animation completes).
; int OtherTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; plane SimBlendAnim[4] : Blending animation control. This is replicated to simulated proxies
; int SpecialTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; float VisUpdateTime : Additional variable for AI

===Advanced ===
; bool bBlockSight : True if pawns can't see through this actor.
; bool bDetectable : True if this actor can be detected (by sight, sound, etc).
; bool bOwned : Additional variable for AI
; bool bTransient : True if this actor should be destroyed when it goes into stasis

===Conversation ===
; String BarkBindName : Used to bind barks.
; String BindName : Used to bind conversations
; float ConStartInterval : Amount of time required between two convos.
; String FamiliarName : For display in conversations after you've spoken to the Actor
; String UnfamiliarName : For display in conversations before you've spoken to the Actor

===Display ===

===Networking ===
; float RelevantRadius : Radius in which things are always relevant.

===Smell ===
; class&lt;SmellNode&gt; SmellClass : Additional variable for AI

==Enums ==

===EAIEventState ===
; EAISTATE_Begin :
; EAISTATE_End :
; EAISTATE_Pulse :
; EAISTATE_ChangeBes :

===EAIEventType ===
; EAITYPE_Visual :
; EAITYPE_Audio :
; EAITYPE_Olifactor :

===EBarkModes ===
; BM_Idle :
; BM_CriticalDamage :
; BM_AreaSecure :
; BM_TargetAcquired :
; BM_TargetLost :
; BM_GoingForAlarm :
; BM_OutOfAmmo :
; BM_Scanning :
; BM_Futz :
; BM_OnFire :
; BM_TearGas :
; BM_Gore :
; BM_Surprise :
; BM_PreAttackSearching :
; BM_PreAttackSighting :
; BM_PostAttackSearching :
; BM_SearchGiveUp :
; BM_AllianceHostile :
; BM_AllianceFriendl :

==Structures ==

===XAIParams ===

&lt;uscript&gt;{
	var actor BestActor;
	var float Score;
	var float Visibility;
	var float Volume;
	var float Smell;
};&lt;/uscript&gt;

==Functions ==
;  AIClearEvent( name eventName ): Native function used for AI
;  AIClearEventCallback( name eventName ): Native function used for AI
;  AIEndEvent( name eventName , EAIEventType eventType ): Native function used for AI
; float AIGetLightLevel( vector Location ): Native function used for AI
;  AISendEvent( name eventName , EAIEventType eventType , optional float Value , optional float Radius ): Native function used for AI
;  AISetEventCallback( name eventName , name callback , optional name scoreCallback , optional bool bCheckVisibility , optional bool bCheckDir , optional bool bCheckCylinder , optional bool bCheckLOS ): Native function used for AI
;  AIStartEvent( name eventName , EAIEventType eventType , optional float Value , optional float Radius ): Native function used for AI
; float AIVisibility( optional bool bIncludeVelocity ): Native function used for AI
;  AllActors( class&lt;actor&gt; BaseClass , out actor Actor , optional name MatchTag ): Iterate through all actors on the level.
;  CycleActors( class&lt;actor&gt; BaseClass , out actor Actor , out int Index ): Currently unknown...
;  EndConversation( ): Save the time this conversation ended.
; bool FastTrace( vector TraceEnd , optional vector TraceStart ): A quick trace. Returns true if it hits an actor within the range (TraceEnd from TraceStart). 
;  Frob( Actor Frobber , Inventory frobWith ): Called to frob (use) an object.  This function is an abstract stub.
; bool GetBoundingBox( out vector MinVect , out vector MaxVect , optional bool bExact , optional vector testLocation , optional rotator testRotation ):
; Texture GetMeshTexture( optional int texnum ): Gets any numbered texture from a mesh
; PlayerPawn GetPlayerPawn( ): This returns the playerpawn, its behavior in multiplayer games is unknown.
;  HurtRadius( float DamageAmount , float DamageRadius , name DamageName , float Momentum , vector HitLocation , optional bool bIgnoreLOS ): Changes made, see comments
; bool InStasis( ): Native function used for AI
; bool IsOverlapping( actor checkActor ): Native function used for AI
; float LastRendered( ): Native function used for AI
; float ParabolicTrace( out vector finalLocation , optional vector startVelocity , optional vector startLocation , optional bool bCheckActors , optional vector cylinder , optional float maxTime , optional float elasticity , optional bool bBounce , optional float landingSpeed , optional float granularity ):
;  PlayBlendAnim( name Sequence , optional float Rate , optional float TweenTime , optional int BlendSlot ): Blending animation function
;  PlayOwnedSound( sound Sound , optional ESoundSlot Slot , optional float Volume , optional bool bNoOverride , optional float Radius , optional float Pitch ):  
; int PlaySound( sound Sound , optional ESoundSlot Slot , optional float Volume , optional bool bNoOverride , optional float Radius , optional float Pitch ): Plays a sound. Changed to return the channel ID of the sound so you can call StopSound later.
; rotator RandomBiasedRotation( int centralYaw , float yawDistribution , int centralPitch , float pitchDistribution ):
;  SetInstantMusicVolume( byte newMusicVolume ): Set the sound system volumes without waiting for a tick event
;  SetInstantSoundVolume( byte newSoundVolume ): Set the sound system volumes without waiting for a tick event
;  SetInstantSpeechVolume( byte newSpeechVolume ): Set the sound system volumes without waiting for a tick event
;  SetPhysics( EPhysics newPhysics , optional Actor newFloor ): added optional param to SetPhysics()
;  StopBlendAnims( ):  Blending animation function.
;  StopSound( int Id ): Stop a sound given the sound's ID
;  TraceTexture( class&lt;actor&gt; BaseClass , out actor Actor , out name texName , out name texGroup , out int flags , out vector HitLoc , out vector HitNorm , vector End , optional vector Start , optional vector Extent ): A trace that gives you the texture it hits... it is unknown at this time whether this only detects BSP, actors, or both.
;  TraceVisibleActors( class&lt;actor&gt; BaseClass , out actor Actor , out vector HitLoc , out vector HitNorm , vector End , optional vector Start , optional vector Extent ): A trace that only hits visible actors... it is unknown at this time whether this includes non-colliding visible actors.
;  TweenBlendAnim( name Sequence , float Time , optional int BlendSlot ): Blending animation function.

==Events ==
;  BroadcastLocalizedMessage( class&lt;LocalMessage&gt; Message , optional int Switch , optional PlayerReplicationInfo RelatedPRI_1 , optional PlayerReplicationInfo RelatedPRI_2 , optional Object OptionalObject ): Changes made, see comments
;  BumpWall( vector HitLocation , vector HitNormal ): Called when the Actor bumps a wall.
;  PostPostBeginPlay( ): Called immediately after Initial State, and always called when loading a map *AND* when loading savegame
;  PreBeginPlay( ): Changes made, see comments
;  SetInitialState( ): Changes made, see comments

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1189</id>
      <timestamp>2004-02-11T05:32:37Z</timestamp>
      <contributor>
        <ip>TheRenegadeMaster</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; Actor (Engine)}}

==Properties ==
; bool bIgnore : True if this actor should be generally ignored; compliance is voluntary (STM)
; float BlendAnimFrame[4] : Blending animation variable (CNN)
; float BlendAnimLast[4] : Blending animation control - Last Frame (CNN)
; float BlendAnimMinRate[4] : Bleinding animation control - Minimum rate for velocity-scaled animation (CNN)
; float BlendAnimRate[4] : Blending animation variable (CNN)
; name BlendAnimSequence[4] : Blending animation variable (CNN)
; float BlendTweenRate[4] : Blending animation variable (CNN)
; bool bVisionImportant : Added to make vision aug run faster.  If true, the vision aug needs to check this object more closely.  Used for heat sources as well as things that blind.
; int CollisionTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; Object ConListItems : [Linked] list of ConItems for this Actor
; float CurrentVisibility : Additional variable for AI
; float DistanceFromPlayer : Added for stasis (STM)
; int ExtraTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; Inventory Inventory : Inventory chain (DEUS_EX STM - added &quot;travel&quot;)
; float LastConEndTime : Time when last conversation ended
; float LastRenderTime : Added for stasis (STM)
; SmellNode LastSmellNode : Additional variable for AI
; float LastVisibility : Additional variable for AI
; int LightingTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; int NetTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; float OldBlendAnimRate[4] : Blending animation control - Animation rate of previous animation (= AnimRate until animation completes). (CNN)
; int OtherTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; plane SimBlendAnim[4] : Blending animation control - replicated to simulated proxies (CNN)
; int SpecialTag : NetTag is on its own in the UT original - not sure of significance [Xhiris]
; float VisUpdateTime : Additional variable for AI

===Advanced ===
; bool bBlockSight : True if pawns can't see through this actor. (STM)
; bool bDetectable : True if this actor can be detected (by sight, sound, etc).
; bool bOwned : Additional variable for AI
; bool bTransient : True if this actor should be destroyed when it goes into stasis (STM)

===Conversation ===
; String BarkBindName : Used to bind barks.
; String BindName : Used to bind conversations
; float ConStartInterval : Amount of time required between two convos.
; String FamiliarName : For display in conversations [before you've spoken to them - Xhiris]
; String UnfamiliarName : For display in conversations [After you've spoken to them once - Xhiris]  (You sure that's not the other way round - UnfamiliarName before you speak to them, Familiar after?)

===Display ===

===Networking ===
; float RelevantRadius : Radius in which things are always relevant.

===Smell ===
; class&lt;SmellNode&gt; SmellClass : Additional variable for AI

==Enums ==

===EAIEventState ===

Added for Deus EX (STM)
; EAISTATE_Begin :
; EAISTATE_End :
; EAISTATE_Pulse :
; EAISTATE_ChangeBes :

===EAIEventType ===

Added for Deus EX (STM)
; EAITYPE_Visual :
; EAITYPE_Audio :
; EAITYPE_Olifactor :

===EBarkModes ===

Added for Deus EX (AJY)
; BM_Idle :
; BM_CriticalDamage :
; BM_AreaSecure :
; BM_TargetAcquired :
; BM_TargetLost :
; BM_GoingForAlarm :
; BM_OutOfAmmo :
; BM_Scanning :
; BM_Futz :
; BM_OnFire :
; BM_TearGas :
; BM_Gore :
; BM_Surprise :
; BM_PreAttackSearching :
; BM_PreAttackSighting :
; BM_PostAttackSearching :
; BM_SearchGiveUp :
; BM_AllianceHostile :
; BM_AllianceFriendl :

==Structures ==

===XAIParams ===

&lt;uscript&gt;{
	var actor BestActor;
	var float Score;
	var float Visibility;
	var float Volume;
	var float Smell;
};&lt;/uscript&gt;

Added for Deus EX (STM)

==Functions ==
;  AIClearEvent( name eventName ): AI functions added DEUS_EX STM
;  AIClearEventCallback( name eventName ): AI functions added DEUS_EX STM
;  AIEndEvent( name eventName , EAIEventType eventType ): AI functions added DEUS_EX STM
; float AIGetLightLevel( vector Location ): AI functions added DEUS_EX STM
;  AISendEvent( name eventName , EAIEventType eventType , optional float Value , optional float Radius ): AI functions added DEUS_EX STM
;  AISetEventCallback( name eventName , name callback , optional name scoreCallback , optional bool bCheckVisibility , optional bool bCheckDir , optional bool bCheckCylinder , optional bool bCheckLOS ): AI functions added DEUS_EX STM
;  AIStartEvent( name eventName , EAIEventType eventType , optional float Value , optional float Radius ): AI functions added DEUS_EX STM
; float AIVisibility( optional bool bIncludeVelocity ): AI functions added DEUS_EX STM
;  AllActors( class&lt;actor&gt; BaseClass , out actor Actor , optional name MatchTag ): Iterate through all actors on the level.
;  CycleActors( class&lt;actor&gt; BaseClass , out actor Actor , out int Index ): added by DEUS_EX STM
;  EndConversation( ): Save the time this conversation ended.
; bool FastTrace( vector TraceEnd , optional vector TraceStart ): A quick trace. Returns true if it hits an actor within the range (TraceEnd from TraceStart). 
;  Frob( Actor Frobber , Inventory frobWith ): Called to frob an object.  The subclass is responsible for implementing this.
; bool GetBoundingBox( out vector MinVect , out vector MaxVect , optional bool bExact , optional vector testLocation , optional rotator testRotation ): AI functions added DEUS_EX STM
; Texture GetMeshTexture( optional int texnum ): Gets any numbered texture from a mesh - DEUS_EX CNN
; PlayerPawn GetPlayerPawn( ): AI functions added DEUS_EX STM
;  HurtRadius( float DamageAmount , float DamageRadius , name DamageName , float Momentum , vector HitLocation , optional bool bIgnoreLOS ): Changes made, see comments
; bool InStasis( ): AI functions added DEUS_EX STM
; bool IsOverlapping( actor checkActor ): AI functions added DEUS_EX STM
; float LastRendered( ): AI functions added DEUS_EX STM
; float ParabolicTrace( out vector finalLocation , optional vector startVelocity , optional vector startLocation , optional bool bCheckActors , optional vector cylinder , optional float maxTime , optional float elasticity , optional bool bBounce , optional float landingSpeed , optional float granularity ): AI functions added DEUS_EX STM
;  PlayBlendAnim( name Sequence , optional float Rate , optional float TweenTime , optional int BlendSlot ): Blending animation function DEUS_EX CNN
;  PlayOwnedSound( sound Sound , optional ESoundSlot Slot , optional float Volume , optional bool bNoOverride , optional float Radius , optional float Pitch ):  
; int PlaySound( sound Sound , optional ESoundSlot Slot , optional float Volume , optional bool bNoOverride , optional float Radius , optional float Pitch ): Plays a sound. Changed to return the channel ID of the sound so you can call StopSound later.
; rotator RandomBiasedRotation( int centralYaw , float yawDistribution , int centralPitch , float pitchDistribution ): AI functions added DEUS_EX STM
;  SetInstantMusicVolume( byte newMusicVolume ): DEUS_EX CNN - Set the sound system volumes without waiting for a tick event
;  SetInstantSoundVolume( byte newSoundVolume ): DEUS_EX CNN - Set the sound system volumes without waiting for a tick event
;  SetInstantSpeechVolume( byte newSpeechVolume ): DEUS_EX CNN - Set the sound system volumes without waiting for a tick event
;  SetPhysics( EPhysics newPhysics , optional Actor newFloor ): DEUS_EX STM - added optional param to SetPhysics()
;  StopBlendAnims( ): DEUS_EX CNN
;  StopSound( int Id ): DEUS_EX CNN - Stop a sound given the sound's ID
;  TraceTexture( class&lt;actor&gt; BaseClass , out actor Actor , out name texName , out name texGroup , out int flags , out vector HitLoc , out vector HitNorm , vector End , optional vector Start , optional vector Extent ): added by DEUS_EX CNN
;  TraceVisibleActors( class&lt;actor&gt; BaseClass , out actor Actor , out vector HitLoc , out vector HitNorm , vector End , optional vector Start , optional vector Extent ): added by DEUS_EX STM
;  TweenBlendAnim( name Sequence , float Time , optional int BlendSlot ): Blending animation function DEUS_EX CNN

==Events ==
;  BroadcastLocalizedMessage( class&lt;LocalMessage&gt; Message , optional int Switch , optional PlayerReplicationInfo RelatedPRI_1 , optional PlayerReplicationInfo RelatedPRI_2 , optional Object OptionalObject ): Changes made, see comments
;  BumpWall( vector HitLocation , vector HitNormal ): DEUS_EX STM &amp;ndash; added
;  PostPostBeginPlay( ): Called immediately after Initial State, and always called when loading a map *AND* when loading savegame
;  PreBeginPlay( ): Changes made, see comments
;  SetInitialState( ): Changes made, see comments

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)</title>
    <id>382</id>
    <revision>
      <id>1290</id>
      <timestamp>2006-04-07T07:50:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Actor (Package: Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover (UT)|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|bot]]s, [[Legacy:Light (UT)|light]]s and [[Legacy:Triggers (UT)|Triggers (UT)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT2003 see the default [[Legacy:Actor|Actor]] page.

==Properties ==

Many properties that all actors have are defined in the actor base class:
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]
* [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]] &amp;ndash; Determines the size and behaviour of the [[Legacy:Collision Cylinder|Collision Cylinder]]
* [[Legacy:Actor (UT)/Display|Actor (UT)/Display]]
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]]
* [[Legacy:Actor (UT)/Filter|Actor (UT)/Filter]]
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] and light color
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] &amp;ndash; Location and simple movement
* [[Legacy:Actor (UT)/Networking|Actor (UT)/Networking]]
* [[Legacy:Actor (UT)/Object|Actor (UT)/Object]] &amp;ndash; Actor's name, class and initial state
* [[Legacy:Actor (UT)/Sound|Actor (UT)/Sound]]

Note that all the common properties of the objects editable in UnrealEd (such as [[Legacy:Mover|mover]]s or [[Legacy:Light (UT)|Light (UT)]]s) are just particular public variables of that class that are set editable via specifiers (see [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]] for more details).

==Known subclasses ==
* [[Legacy:Brush|Brush]]
* [[Legacy:DamageType (UT)|DamageType (UT)]]
* [[Legacy:Decal|Decal]]
* [[Legacy:Decoration (UT)|Decoration (UT)]]
* [[Legacy:Effects (UT)|Effects (UT)]]
* [[Legacy:HUD (UT)|HUD (UT)]]
* [[Legacy:Info (UT)|Info (UT)]]
* [[Legacy:Inventory (UT)|Inventory (UT)]] &amp;ndash; Things that players can pick up and carry
* [[Legacy:Keypoint (UT)|Keypoint (UT)]]
* [[Legacy:Light (UT)|Light (UT)]]
* [[Legacy:Menu|Menu]]
* [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &amp;ndash; Actors for building the bot path network
* [[Legacy:Pawn (UT)|Pawn (UT)]] &amp;ndash; Actors that move indepentently (monsters, players etc.)
* [[Legacy:Projectile (UT)|Projectile (UT)]]
* [[Legacy:SpawnNotify|SpawnNotify]]
* [[Legacy:Triggers (UT)|Triggers (UT)]]

==Functions ==
* [[Legacy:Actor (UT)/Functions|Actor (UT)/Functions]] for now, may need to split later

==Related Topics ==
* [[Legacy:Creating Actors And Objects|Creating Actors and Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]

==Discussion ==

Great Actor Pages Debate on page names &amp; organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1291</id>
      <timestamp>2003-05-13T17:16:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Actor (Package: Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover (UT)|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|bot]]s, [[Legacy:Light (UT)|light]]s and [[Legacy:Triggers (UT)|Triggers (UT)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT2003 see the default [[Legacy:Actor|Actor]] page.

==Properties ==

Many properties that all actors have are defined in the actor base class:
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]
* [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]] &amp;ndash; Determines the size and behaviour of the [[Legacy:Collision Cylinder|Collision Cylinder]]
* [[Legacy:Actor (UT)/Display|Actor (UT)/Display]]
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]]
* [[Legacy:Actor (UT)/Filter|Actor (UT)/Filter]]
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] and light color
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] &amp;ndash; Location and simple movement
* [[Legacy:Actor (UT)/Networking|Actor (UT)/Networking]]
* [[Legacy:Actor (UT)/Object|Actor (UT)/Object]] &amp;ndash; Actor's name, class and initial state
* [[Legacy:Actor (UT)/Sound|Actor (UT)/Sound]]

Note that all the common properties of the objects editable in UnrealEd (such as [[Legacy:Mover|mover]]s or [[Legacy:Light (UT)|Light (UT)]]s) are just particular public variables of that class that are set editable via specifiers (see [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]] for more details).

==Known subclasses ==
* [[Legacy:Brush|Brush]]
* [[Legacy:DamageType (UT)|DamageType (UT)]]
* [[Legacy:Decal|Decal]]
* [[Legacy:Decoration (UT)|Decoration (UT)]]
* [[Legacy:Effects (UT)|Effects (UT)]]
* [[Legacy:HUD (UT)|HUD (UT)]]
* [[Legacy:Info (UT)|Info (UT)]]
* [[Legacy:Inventory (UT)|Inventory (UT)]] &amp;ndash; Things that players can pick up and carry
* [[Legacy:Keypoint (UT)|Keypoint (UT)]]
* [[Legacy:Light (UT)|Light (UT)]]
* [[Legacy:Menu|Menu]]
* [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &amp;ndash; Actors for building the bot path network
* [[Legacy:Pawn (UT)|Pawn (UT)]] &amp;ndash; Actors that move indepentently (monsters, players etc.)
* [[Legacy:Projectile (UT)|Projectile (UT)]]
* [[Legacy:SpawnNotify|SpawnNotify]]
* [[Legacy:Triggers (UT)|Triggers (UT)]]

==Functions ==
* [[Legacy:Actor (UT)/Functions|Actor (UT)/Functions]] for now, may need to split later

==Related Topics ==
* [[Legacy:Creating Actors And Objects|Creating Actors and Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]

==Discussion ==

Great Actor Pages Debate on page names &amp; organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1292</id>
      <timestamp>2006-04-06T21:05:39Z</timestamp>
      <contributor>
        <ip>Cdn-ce-wland-t2-02.westlandrdc.mi.michigan.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Actor (Package: Engine)}}

This page is the technical specification for the Actor class. See [[Legacy:Actor Overview|Actor Overview]] for information on working with actors in UnrealEd.

Objects that have a position in the world are subclassed from Actor. For example [[Legacy:Brush|brush]]es, [[Legacy:Mover (UT)|mover]]s, [[Legacy:Decoration|decoration]]s, [[Legacy:Bot (UT)|bot]]s, [[Legacy:Light (UT)|light]]s and [[Legacy:Triggers (UT)|Triggers (UT)]]. This is an important class because it's the base class for all in-game objects (as in &quot;object oriented programming&quot;), so you'll find really a lot of very important functions and variables defined in this class. UnrealScript beginners ought to take a look at this class's source code.

For this class in UT2003 see the default [[Legacy:Actor|Actor]] page.

==Properties ==

Many properties that all actors have are defined in the actor base class:
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]
* [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]] &amp;ndash; Determines the size and behaviour of the [[Legacy:Collision Cylinder|Collision Cylinder]]
* [[Legacy:Actor (UT)/Display|Actor (UT)/Display]]
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]]
* [[Legacy:Actor (UT)/Filter|Actor (UT)/Filter]]
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] and light color
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] &amp;ndash; Location and simple movement
* [[Legacy:Actor (UT)/Networking|Actor (UT)/Networking]]
* [[Legacy:Actor (UT)/Object|Actor (UT)/Object]] &amp;ndash; Actor's name, class and initial state
* [[Legacy:Actor (UT)/Sound|Actor (UT)/Sound]]

Note that all the common properties of the objects editable in UnrealEd (such as [[Legacy:Mover|mover]]s or [[Legacy:Light (UT)|Light (UT)]]s) are just particular public variables of that class that are set editable via specifiers (see [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]] for more details).

==Known subclasses ==
* [[Legacy:Brush|Brush]]
* [[Legacy:DamageType (UT)|DamageType (UT)]]
* [[Legacy:Decal|Decal]]
* [[Legacy:Decoration (UT)|Decoration (UT)]]
* [[Legacy:Effects (UT)|Effects (UT)]]
* [[Legacy:HUD (UT)|HUD (UT)]]
* [[Legacy:Info (UT)|Info (UT)]]
* [[Legacy:Inventory (UT)|Inventory (UT)]] &amp;ndash; Things that players can pick up and carry
* [[Legacy:Keypoint (UT)|Keypoint (UT)]]
* [[Legacy:Light (UT)|Light (UT)]]
* [[Legacy:Menu|Menu]]
* [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &amp;ndash; Actors for building the bot path network
* [[Legacy:Pawn (UT)|Pawn (UT)]] &amp;ndash; Actors that move indepentently (monsters, players etc.)
* [[Legacy:Projectile (UT)|Projectile (UT)]]
* [[Legacy:SpawnNotify|SpawnNotify]]
* [[Legacy:Triggers (UT)|Triggers (UT)]]

==Functions ==
* [[Legacy:Actor (UT)/Functions|Actor (UT)/Functions]] for now, may need to split later

==Related Topics ==
* [[Legacy:Creating Actors And Objects|Creating Actors and Objects]]
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]

==Discussion ==

Great Actor Pages Debate on page names &amp; organization: [[Legacy:Actor (UT)/Talk|Actor (UT)/Talk]]

----

[[:Category:Legacy Class (UT)]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Advanced</title>
    <id>389</id>
    <revision>
      <id>1309</id>
      <timestamp>2006-04-18T22:31:19Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]] (Property group: Advanced)}}

Properties every [[Legacy:Actor (UT)|Actor (UT)]] has under the ''Advanced'' section. See [[Legacy:Actor/Advanced|Actor/Advanced]] for the [[Legacy:UT2003|UT2003]] version.

; bAlwaysRelevant : [[Legacy:Replication|Replication]] &amp;ndash; If set, then this actor is always relevant to gameplay.  As a result, the server will always be keeping tabs on this actor and constantly sending data to its clients about it, regardless of any other circumstances.  For example, [[Legacy:ReplicationInfo|ReplicationInfo]]s are always relevant.

; bCanTeleport : If something attempts to teleport the actor, then the attempt will be successful.  For example, this is ''True'' for [[Legacy:Pawn (UT)|Pawn (UT)]]s and ''False'' for [[Legacy:Inventory (UT)|Inventory (UT)]] items.

; bCollideWhenPlacing : When being placed using the editor, this actor will not allow itself to be moved through walls and other such things.

;  bDirectional : An actor which has this flag set will display a directional arrow in UnrealEd when selected. This directional arrow matches the current setting of the actor's Movement -&gt; Rotation property (see [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]]). It also allows the actor to be rotated the same way as a brush in an [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] (see [[Legacy:Brush Rotate|Brush rotate]]). By default, [[Legacy:Spotlight|Spotlight]]s, [[Legacy:PlayerStart|PlayerStart]]s and some [[Legacy:Decoration|Decoration]]s are directional, but [[Legacy:Trigger|Trigger]]s and ordinary [[Legacy:Light (UT)|Light (UT)]]s are not.&lt;br /&gt;'''Tip:'''  Set this to ''True'' for brushes (including the [[Legacy:Red Builder Brush|red builder brush]]) to see whether they have rotation applied.

; bEdShouldSnap : In the editor, this actor should snap to the grid when it is being placed. This is set by default to ''True'' for [[Legacy:Brush|Brush]]es and ''False'' for other actors. It's often useful to set this to ''True'' for actors such as [[Legacy:Trigger|Trigger]] or [[Legacy:BlockAll|BlockAll]], as they can then be aligned to the grid exactly. The value of this property determines whether an actor has a [[Legacy:Pivot|pivot]].

; bForceStasis : In stand-alone games, this actor can be forced into stasis when it doesn't need to be updated, even if it has physics is something more meaningful than simple rotation.

; bGameRelevant : This actor is relevant to gameplay.  For example, this is ''True'' for such things as [[Legacy:GameInfo (UT)|GameInfo (UT)]] and [[Legacy:ReplicationInfo|ReplicationInfo]]. If this is set to True mutators won't change or replace the actor.

; bHidden : During the game, this actor should not be displayed.  Obviously, things like [[Legacy:Pawn (UT)|Pawn (UT)]]s are not hidden, but [[Legacy:Triggers (UT)|Triggers (UT)]] are.

; bHiddenEd : In the editor, this actor should not be displayed.  It's for instance used for the [[Legacy:LevelInfo|LevelInfo]] actor that is automatically added when you create a new map.  (The [[Legacy:LevelInfo|LevelInfo]] actor's properties can be set with [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties)&lt;br /&gt;&lt;br /&gt;Some mappers set this flag on the brushes in their levels. To reveal a brush that has been hidden like this, first find it in the [[Legacy:Actor Search|Actor Search]] window. Double-clicking its name there will selected it even though it isn't visible in any [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. Then open the [[Legacy:Actor Properties Window|Actor Properties window]] (F4) and set this flag to ''False''. The object in question should re-appear.

; bHighDetail : This actor will only show up if the game is set to render high detail.  This is typically used with [[Legacy:SkyZoneInfo|SkyZoneInfo]] objects to provide two [[Legacy:SkyBox|SkyBox]]es.  One used when high detail is set, and the other used when high detail is not set.

; bIsItemGoal : This actor will count in the item count of some such mechanic.  [[Legacy:Inventory (UT)|Inventory (UT)]] items are examples of this.

; bIsKillGoal : This actor will count in the death tally.  [[Legacy:ScriptedPawn|ScriptedPawn]]s are examples of this.

; bIsSecretGoal : This actor will count in the list of secrets.  I can't think of any examples of this that are used in Unreal or Unreal Tournament.

; bMovable : This actor is not just stuck in place; it can move or be moved around the level.  Some [[Legacy:Decoration|Decoration]]s are movable and some aren't.  [[Legacy:NavigationPoint|NavigationPoint]]s are never movable.  [[Legacy:Pawn (UT)|Pawn (UT)]]s are almost always movable.

; bNetOptional : [[Legacy:Replication|Replication]] &amp;ndash; In online games, it can sometimes be necessary to forego the replication of some relevant actors.  In such a case, the list needs to be pruned further, and actors that are bNetOptional are of a type that should only be replicated to clients if there is enough bandwidth for it.

; bNetTemporary : [[Legacy:Replication|Replication]] &amp;ndash; Tear-off simulation in network play. When set to true, the actor and its variables are replicated only when it is first spawned.  Thereafter everything is handled client-side &amp;ndash; and no longer relevant to the server, which retains its own, game-relevant copy &amp;ndash; thus preventing excessive bandwidth consumption.  Generally used with actors which adhere to movement which can be predicted solely by standard physics types or client-side calculation (noncontrollable projectiles, decorations, effects).

; bNoDelete : This actor cannot be deleted during play.  For most actors, this is ''False''.  [[Legacy:Pawn (UT)|Pawn (UT)]]s, some [[Legacy:Decoration|Decoration]]s, and [[Legacy:Triggers (UT)|Triggers (UT)]] can be deleted, but such things as [[Legacy:Brush|Brush]]es and [[Legacy:NavigationPoint|NavigationPoint]]s should not be deleted.

; bOnlyOwnerSee : If an actor has an owner, then this owner is the only other actor that can see it.

; bOwnerNoSee : If an actor has an owner, then this owner is prevented from seeing the actor.  This property is used for the [[Legacy:ShieldBeltEffect|ShieldBeltEffect]], for instance.

; bStasis : This actor is capable of entering stasis.  In standalone games, an actor that doesn't need to be updated because of the player's location can enter stasis, especially if its physics is nonexistent or the actor is simply rotating in place.

; bStatic : This actor doesn't move or change at all over the course of time.  [[Legacy:PathNode|PathNode]]s are bStatic, for example, because they don't need to be updated during the game, thus saving processing resources.&lt;br /&gt;'''Note:'''  Neither Tick nor Timer are executed for bStatic actors.&lt;br /&gt;'''''Another Note:''''' '''Never''' use this to prevent items from rotating. There's the '''bRotatingPickup''' property for a reason, so use it.

; bTravel : This actor is capable of travelling between levels and between servers.  This is pretty much only ''True'' for such things as [[Legacy:PlayerPawn|PlayerPawn]]s and [[Legacy:Inventory (UT)|Inventory (UT)]] items.

; LifeSpan : This is a float that tells how many seconds the object gets to exist before it is automatically destroyed.  Most actors have a LifeSpan of 0.0, which means that they are allowed to exist forever.  However, some things such as [[Legacy:Effects (UT)|Effects (UT)]] and [[Legacy:Projectile (UT)|Projectile (UT)]]s do have a definite LifeSpan.

'''Evilmrfrank:''' Ayone have any clue how to get the directional property to work in the classic UT?  I have tried to use it a number of times but it never seems to work correctly.

'''Xian:''' From what I know, it's used by UED mostly to set the initial rotation of an actor (say the AmbushSpot). Tell me what you need/want to do and I'll do my best to explain it as clear as possible :)

'''Evilmrfrank:''' I have needed it for many things in UT from teleporters, to playerstarts, etc.  According to this article you only need to change the setting to bdirectional=true, but that doesnt work.... I never see any red arrow like I do in Unreal Ed 3.0

'''Xian:''' Tried it on a weapon and the arrow appeared.

==Related Topics ==
* [[Legacy:Actor Overview|Actor overview]]</text>
    </revision>
    <revision>
      <id>1310</id>
      <timestamp>2006-04-18T22:17:38Z</timestamp>
      <contributor>
        <ip>206-192-47-168.dynamic.cdpt.zitomedia.net.47.192.206.in-addr.arpa</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]] (Property group: Advanced)}}

Properties every [[Legacy:Actor (UT)|Actor (UT)]] has under the ''Advanced'' section. See [[Legacy:Actor/Advanced|Actor/Advanced]] for the [[Legacy:UT2003|UT2003]] version.

; bAlwaysRelevant : [[Legacy:Replication|Replication]] &amp;ndash; If set, then this actor is always relevant to gameplay.  As a result, the server will always be keeping tabs on this actor and constantly sending data to its clients about it, regardless of any other circumstances.  For example, [[Legacy:ReplicationInfo|ReplicationInfo]]s are always relevant.

; bCanTeleport : If something attempts to teleport the actor, then the attempt will be successful.  For example, this is ''True'' for [[Legacy:Pawn (UT)|Pawn (UT)]]s and ''False'' for [[Legacy:Inventory (UT)|Inventory (UT)]] items.

; bCollideWhenPlacing : When being placed using the editor, this actor will not allow itself to be moved through walls and other such things.

;  bDirectional : An actor which has this flag set will display a directional arrow in UnrealEd when selected. This directional arrow matches the current setting of the actor's Movement -&gt; Rotation property (see [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]]). It also allows the actor to be rotated the same way as a brush in an [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] (see [[Legacy:Brush Rotate|Brush rotate]]). By default, [[Legacy:Spotlight|Spotlight]]s, [[Legacy:PlayerStart|PlayerStart]]s and some [[Legacy:Decoration|Decoration]]s are directional, but [[Legacy:Trigger|Trigger]]s and ordinary [[Legacy:Light (UT)|Light (UT)]]s are not.&lt;br /&gt;'''Tip:'''  Set this to ''True'' for brushes (including the [[Legacy:Red Builder Brush|red builder brush]]) to see whether they have rotation applied.

; bEdShouldSnap : In the editor, this actor should snap to the grid when it is being placed. This is set by default to ''True'' for [[Legacy:Brush|Brush]]es and ''False'' for other actors. It's often useful to set this to ''True'' for actors such as [[Legacy:Trigger|Trigger]] or [[Legacy:BlockAll|BlockAll]], as they can then be aligned to the grid exactly. The value of this property determines whether an actor has a [[Legacy:Pivot|pivot]].

; bForceStasis : In stand-alone games, this actor can be forced into stasis when it doesn't need to be updated, even if it has physics is something more meaningful than simple rotation.

; bGameRelevant : This actor is relevant to gameplay.  For example, this is ''True'' for such things as [[Legacy:GameInfo (UT)|GameInfo (UT)]] and [[Legacy:ReplicationInfo|ReplicationInfo]]. If this is set to True mutators won't change or replace the actor.

; bHidden : During the game, this actor should not be displayed.  Obviously, things like [[Legacy:Pawn (UT)|Pawn (UT)]]s are not hidden, but [[Legacy:Triggers (UT)|Triggers (UT)]] are.

; bHiddenEd : In the editor, this actor should not be displayed.  It's for instance used for the [[Legacy:LevelInfo|LevelInfo]] actor that is automatically added when you create a new map.  (The [[Legacy:LevelInfo|LevelInfo]] actor's properties can be set with [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties)&lt;br /&gt;&lt;br /&gt;Some mappers set this flag on the brushes in their levels. To reveal a brush that has been hidden like this, first find it in the [[Legacy:Actor Search|Actor Search]] window. Double-clicking its name there will selected it even though it isn't visible in any [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. Then open the [[Legacy:Actor Properties Window|Actor Properties window]] (F4) and set this flag to ''False''. The object in question should re-appear.

; bHighDetail : This actor will only show up if the game is set to render high detail.  This is typically used with [[Legacy:SkyZoneInfo|SkyZoneInfo]] objects to provide two [[Legacy:SkyBox|SkyBox]]es.  One used when high detail is set, and the other used when high detail is not set.

; bIsItemGoal : This actor will count in the item count of some such mechanic.  [[Legacy:Inventory (UT)|Inventory (UT)]] items are examples of this.

; bIsKillGoal : This actor will count in the death tally.  [[Legacy:ScriptedPawn|ScriptedPawn]]s are examples of this.

; bIsSecretGoal : This actor will count in the list of secrets.  I can't think of any examples of this that are used in Unreal or Unreal Tournament.

; bMovable : This actor is not just stuck in place; it can move or be moved around the level.  Some [[Legacy:Decoration|Decoration]]s are movable and some aren't.  [[Legacy:NavigationPoint|NavigationPoint]]s are never movable.  [[Legacy:Pawn (UT)|Pawn (UT)]]s are almost always movable.

; bNetOptional : [[Legacy:Replication|Replication]] &amp;ndash; In online games, it can sometimes be necessary to forego the replication of some relevant actors.  In such a case, the list needs to be pruned further, and actors that are bNetOptional are of a type that should only be replicated to clients if there is enough bandwidth for it.

; bNetTemporary : [[Legacy:Replication|Replication]] &amp;ndash; Tear-off simulation in network play. When set to true, the actor and its variables are replicated only when it is first spawned.  Thereafter everything is handled client-side &amp;ndash; and no longer relevant to the server, which retains its own, game-relevant copy &amp;ndash; thus preventing excessive bandwidth consumption.  Generally used with actors which adhere to movement which can be predicted solely by standard physics types or client-side calculation (noncontrollable projectiles, decorations, effects).

; bNoDelete : This actor cannot be deleted during play.  For most actors, this is ''False''.  [[Legacy:Pawn (UT)|Pawn (UT)]]s, some [[Legacy:Decoration|Decoration]]s, and [[Legacy:Triggers (UT)|Triggers (UT)]] can be deleted, but such things as [[Legacy:Brush|Brush]]es and [[Legacy:NavigationPoint|NavigationPoint]]s should not be deleted.

; bOnlyOwnerSee : If an actor has an owner, then this owner is the only other actor that can see it.

; bOwnerNoSee : If an actor has an owner, then this owner is prevented from seeing the actor.  This property is used for the [[Legacy:ShieldBeltEffect|ShieldBeltEffect]], for instance.

; bStasis : This actor is capable of entering stasis.  In standalone games, an actor that doesn't need to be updated because of the player's location can enter stasis, especially if its physics is nonexistent or the actor is simply rotating in place.

; bStatic : This actor doesn't move or change at all over the course of time.  [[Legacy:PathNode|PathNode]]s are bStatic, for example, because they don't need to be updated during the game, thus saving processing resources.&lt;br /&gt;'''Note:'''  Neither Tick nor Timer are executed for bStatic actors.&lt;br /&gt;'''''Another Note:''''' '''Never''' use this to prevent items from rotating. There's the '''bRotatingPickup''' property for a reason, so use it.

; bTravel : This actor is capable of travelling between levels and between servers.  This is pretty much only ''True'' for such things as [[Legacy:PlayerPawn|PlayerPawn]]s and [[Legacy:Inventory (UT)|Inventory (UT)]] items.

; LifeSpan : This is a float that tells how many seconds the object gets to exist before it is automatically destroyed.  Most actors have a LifeSpan of 0.0, which means that they are allowed to exist forever.  However, some things such as [[Legacy:Effects (UT)|Effects (UT)]] and [[Legacy:Projectile (UT)|Projectile (UT)]]s do have a definite LifeSpan.

'''Evilmrfrank:''' Ayone have any clue how to get the directional property to work in the classic UT?  I have tried to use it a number of times but it never seems to work correctly.

'''Xian:''' From what I know, it's used by UED mostly to set the initial rotation of an actor (say the AmbushSpot). Tell me what you need/want to do and I'll do my best to explain it as clear as possible :)

'''Evilmrfrank:''' I have needed it for many things in UT from teleporters, to playerstarts, etc.  According to this article you only need to change the setting to bdirectional=true, but that doesnt work.... I never see any red arrow like I do in Unreal Ed 3.0

==Related Topics ==
* [[Legacy:Actor Overview|Actor overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Collision</title>
    <id>390</id>
    <revision>
      <id>1311</id>
      <timestamp>2005-11-18T20:13:24Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">These properties determine the size and behaviour of an [[Legacy:Actor_(UT)|Actor_(UT)]]'s  [[Legacy:Collision Cylinder|collision cylinder]]. 

Note that the cylinder is always upright, no matter what the [[Legacy:Actor_(UT)|Actor_(UT)]]'s orientation.

==Properties==

===Boolean Flags===
; bBlockActors : Blocks non-player [[Legacy:Actor_(UT)|Actor_(UT)]]s.
; bBlockPlayers : Blocks player actors ([[Legacy:PlayerPawn|PlayerPawn]]s and [[Legacy:Bot (UT)|Bot (UT)]]s).
; bCollideActors : Collides with other [[Legacy:Actor_(UT)|Actor_(UT)]]s.
; bCollideWorld : Collides with the world geometry.
; bCollideWhenPlacing : Collides when being moved; can't be set into geometry.
; bProjTarget :  Set this true if you want your object to be a potential target for projectiles (subject to adjusted aim in single-player mode).

===Collision Cylinder===

The size of the collision cylinder is given by the two properties ''CollisionHeight'' and ''CollisionRadius''.

==Related topics==
* [[Legacy:Actor (UT)|Actor (UT)]]
* [[Legacy:DuckingZone|DuckingZone]] &amp;ndash; A zone where ducking players actually become smaller in Unreal Tournament.
* [[Legacy:Collision Cylinder|Collision Cylinder]] &amp;ndash; Details on collision and on &lt;tt&gt;Touch&lt;/tt&gt;, &lt;tt&gt;Untouch&lt;/tt&gt; and other related events.
* [[Legacy:OCD|OCD]] &amp;ndash; Technical lowdown of object collision detection.
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; More on working with Actors, adding actors to a map and setting properties.</text>
    </revision>
    <revision>
      <id>1312</id>
      <timestamp>2002-04-24T10:30:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>rearranging</comment>
      <text xml:space="preserve">These properties determine the size and behaviour of an [[Legacy:Actor|Actor]]'s  [[Legacy:Collision Cylinder|collision cylinder]]. 

Note that the cylinder is always upright, no matter what the [[Legacy:Actor|Actor]]'s orientation.

==Properties ==

===Flags ===
; bBlockActors : Blocks non-player [[Legacy:Actor|Actor]]s.
; bBlockPlayers : Blocks player actors ([[Legacy:PlayerPawn|PlayerPawn]]s and [[Legacy:Bot (UT)|Bot (UT)]]s).
; bCollideActors : Collides with other [[Legacy:Actor|Actor]]s.
; bCollideWorld : Collides with the world geometry.
; bCollideWhenPlacing : Collides when being moved; can't be set into geometry.
; bProjTarget :  Set this true if you want your object to be a potential target for projectiles (subject to adjusted aim in single-player mode).

===Collision Cylinder ===

The size of the collision cylinder is given by the two properties ''CollisionHeight'' and ''CollisionRadius''.

==Related topics ==
* See [[Legacy:Collision Cylinder|collision cylinder]] for details on collision and on &lt;tt&gt;Touch&lt;/tt&gt;, &lt;tt&gt;Untouch&lt;/tt&gt; and other related events.
* See [[Legacy:OCD|OCD]] for the technical lowdown of object collision detection.
* See [[Legacy:Actor Overview|Actor Overview]] for more on working with Actors, adding actors to a map and setting properties.</text>
    </revision>
    <revision>
      <id>1313</id>
      <timestamp>2005-11-08T04:44:42Z</timestamp>
      <contributor>
        <ip>Ua-dip0.nat.okstate.edu</ip>
      </contributor>
      <minor/>
      <comment>Links to &quot;Actor&quot; now lead to the one from UT.</comment>
      <text xml:space="preserve">These properties determine the size and behaviour of an [[Legacy:Actor_(UT)|Actor_(UT)]]'s  [[Legacy:Collision Cylinder|collision cylinder]]. 

Note that the cylinder is always upright, no matter what the [[Legacy:Actor_(UT)|Actor_(UT)]]'s orientation.

==Properties ==

===Flags ===
; bBlockActors : Blocks non-player [[Legacy:Actor_(UT)|Actor_(UT)]]s.
; bBlockPlayers : Blocks player actors ([[Legacy:PlayerPawn|PlayerPawn]]s and [[Legacy:Bot (UT)|Bot (UT)]]s).
; bCollideActors : Collides with other [[Legacy:Actor_(UT)|Actor_(UT)]]s.
; bCollideWorld : Collides with the world geometry.
; bCollideWhenPlacing : Collides when being moved; can't be set into geometry.
; bProjTarget :  Set this true if you want your object to be a potential target for projectiles (subject to adjusted aim in single-player mode).

===Collision Cylinder ===

The size of the collision cylinder is given by the two properties ''CollisionHeight'' and ''CollisionRadius''.

==Related topics ==
* [[Legacy:DuckingZone|DuckingZone]] &amp;ndash; A zone where ducking players actually become smaller in Unreal Tournament.
* [[Legacy:Collision Cylinder|Collision Cylinder]] &amp;ndash; Details on collision and on &lt;tt&gt;Touch&lt;/tt&gt;, &lt;tt&gt;Untouch&lt;/tt&gt; and other related events.
* [[Legacy:OCD|OCD]] &amp;ndash; Technical lowdown of object collision detection.
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; More on working with Actors, adding actors to a map and setting properties.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Display</title>
    <id>391</id>
    <revision>
      <id>1314</id>
      <timestamp>2004-10-12T16:09:42Z</timestamp>
      <contributor>
        <ip>Captain Kewl</ip>
      </contributor>
      <minor/>
      <comment>oh so pretty</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]]  (Property Group: Display)}}

(see [[Legacy:Actor/Display|Actor/Display]] for the [[Legacy:UT2003|UT2003]] version)

Properties that every [[Legacy:Actor (UT)|Actor (UT)]] has which control its display in the game.

Some of these also have an effect in UnrealEd, which is why working with [[Legacy:Corona|corona]]s is such a right pain.

; AmbientGlow : &quot;Ambient brightness, or 255=pulsing&quot;
; bFilterByVolume : &quot;Filter this sprite by its Visibility volume.&quot;  Huh?
; bMeshCurvy : &quot;Curvy mesh.&quot;
; bMeshEnviroMap : Render Mesh environment-mapped with Texture
; bNoSmooth : If True, model textures are not filtered and will look blocky and stretched.  For some stupid reason the Weapon superclass has this set to True by default.
; bParticles : Given Mesh, particles (sprites drawn as Texture) are drawn where each mesh vertex would be.
; bRandomFrame : If bParticles = True, each particle texture is randomly selected from Texture and the MultiSkins array.
; bShadowCast : &quot;Casts Shadows&quot; (not yet implemented?)
; bUnlit : Actor is rendered fully lit.
; DrawScale  : Scale by which actor is drawn
; float LODBias :  This will affect the distance at which the engine starts simplifying the mesh. If your new model has parts that are pretty thin, or even have a single face, raise this number. 
; DrawType : How actor should be rendered as.  (More exist than those listed below, but they are unused.) ''Legal'' Don't exist or..?
;* DT_None &amp;ndash; Don't render.  Not visible.
;* DT_Sprite &amp;ndash; Draw as sprite (2d) using Texture/Sprite
;* DT_Mesh &amp;ndash; Draw as mesh (3d) using Mesh, mapped with Skin
;* DT_Brush &amp;ndash; Draw as brush
;* DT_SpriteAnimOnce &amp;ndash; Draw as Sprite, and, if an animation sequence, only animate once.
; Fatness : Expansion or compression of mesh along its normals.  Default = 128. It's this property that is changed by the [[Legacy:PressureZone|PressureZone]] in DM-Pressure.
; Mesh : 3d model to render actor as in the world and editor if DrawType=DT_Mesh.
; ScaleGlow  : &quot;Multiplies lighting&quot;
: Use a value from 0...1 at scaleglow=0 an actor is very dark. Also when drawstyle = STY_Translucent a value of 0.0 means the actor is totally transparent. Slowly change this from 1 down to 0 in script to make things fade into transparency.
; Skin : Texture to be mapped onto Mesh.
; Sprite  : Texture to be rendered if DrawType=DT_Sprite.
; SpriteProjForward : &quot;Distance forward to draw sprite from actual location&quot;
; Style : Technique to use while rendering.
;* STY_None &amp;ndash; don't render.
;* STY_Normal &amp;ndash; render normally.
;* STY_Masked &amp;ndash; all pixels with the first color in the palette (palette entry 0) are made completely transparent.
;* STY_Translucent &amp;ndash; variable translucency based on brightness.  Black is invisible, grey is 50%, white is opaque.
;* STY_Modulated &amp;ndash; render texture modulated; RGB(127,127,127) is transparent.  Deeper shades darken, lighter shades lighten.
: See [[Legacy:Color Blending|Color Blending]] for a more detailed explanation.
; Texture : For actors like Trigger, this is the icon displayed in the editor.  Texture to be rendered if DrawType=DT_Sprite and Sprite=None.  Environment-mapping texture if bMeshEnviroMap=True.
; VisibilityHeight : &quot;cylinder.  Zero=infinite visibility.&quot;
; VisibilityRadius : &quot;Actor is drawn if viewer is within its visibility&quot;

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
    <revision>
      <id>1315</id>
      <timestamp>2003-12-29T22:36:31Z</timestamp>
      <contributor>
        <ip>SabbathCat</ip>
      </contributor>
      <minor/>
      <comment>Added LODBias. (Wasn't listed.)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]]  (Property Group: Display)}}

(see [[Legacy:Actor/Display|Actor/Display]] for the [[Legacy:UT2003|UT2003]] version)

Properties that every [[Legacy:Actor (UT)|Actor (UT)]] has which control its display in the game.

Some of these also have an effect in UnrealEd, which is why working with [[Legacy:Corona|corona]]s is such a right pain.

; AmbientGlow : &quot;Ambient brightness, or 255=pulsing&quot;
; bFilterByVolume : &quot;Filter this sprite by its Visibility volume.&quot;  Huh?
; bMeshCurvy : &quot;Curvy mesh.&quot;
; bMeshEnviroMap : Render Mesh environment-mapped with Texture
; bNoSmooth : If True, model textures are not filtered and will look blocky and stretched.  For some stupid reason the Weapon superclass has this set to True by default.
; bParticles : Given Mesh, particles (sprites drawn as Texture) are drawn where each mesh vertex would be.
; bRandomFrame : If bParticles = True, each particle texture is randomly selected from Texture and the MultiSkins array.
; bShadowCast : &quot;Casts Shadows&quot; (not yet implemented?)
; bUnlit : Actor is rendered fully lit.
; DrawScale  : Scale by which actor is drawn
; float LODBias :  This will affect the distance at which the engine starts simplifying the mesh. If your new model has parts that are pretty thin, or even have a single face, raise this number. 
; DrawType : How actor should be rendered as.  (More exist than those listed below, but they are unused.) ''Legal'' Don't exist or..?
: DT_None &amp;ndash; Don't render.  Not visible.
: DT_Sprite &amp;ndash; Draw as sprite (2d) using Texture/Sprite
: DT_Mesh &amp;ndash; Draw as mesh (3d) using Mesh, mapped with Skin
: DT_Brush &amp;ndash; Draw as brush
: DT_SpriteAnimOnce &amp;ndash; Draw as Sprite, and, if an animation sequence, only animate once.
; Fatness : Lateral widening or compression of mesh.  Default = 128. It's this property that is changed by the [[Legacy:PressureZone|PressureZone]] in DM-Pressure.
; Mesh : 3d model to render actor as in the world and editor if DrawType=DT_Mesh.
; ScaleGlow  : &quot;Multiplies lighting&quot;
: Use a value from 0...1 at scaleglow=0 an actor is very dark. Also when drawstyle = STY_Translucent a value of 0.0 means the actor is totally transparent. Slowly change this from 1 down to 0 in script to make things fade into transparency.
; Skin : Texture to be mapped onto Mesh.
; Sprite  : Texture to be rendered if DrawType=DT_Sprite.
; SpriteProjForward : &quot;Distance forward to draw sprite from actual location&quot;
; Style : Quality of rendering.
: STY_None &amp;ndash; don't render.
: STY_Normal &amp;ndash; render normally.
: STY_Masked &amp;ndash; render texture with Pallete ID=0 transparent.
: STY_Translucent &amp;ndash; render texture translucent with Pallete ID=0 transparent.
: STY_Modulated &amp;ndash; render texture modulated; RGB(127,127,127) is transparent.  Deeper shades darken, lighter shades lighten.
: See [[Legacy:Color Blending|Color Blending]].
; Texture  : For actors like Trigger, this is the icon displayed in the editor.  Texture to be rendered if DrawType=DT_Sprite and Sprite=None.  Environment-mapping texture if bMeshEnviroMap=True.
; VisibilityHeight : &quot;cylinder.  Zero=infinite visibility.&quot;
; VisibilityRadius : &quot;Actor is drawn if viewer is within its visibility&quot;

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
    <revision>
      <id>1316</id>
      <timestamp>2004-03-18T17:29:17Z</timestamp>
      <contributor>
        <ip>Winterwing</ip>
      </contributor>
      <comment>Clarified/corrected entries in Style</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]]  (Property Group: Display)}}

(see [[Legacy:Actor/Display|Actor/Display]] for the [[Legacy:UT2003|UT2003]] version)

Properties that every [[Legacy:Actor (UT)|Actor (UT)]] has which control its display in the game.

Some of these also have an effect in UnrealEd, which is why working with [[Legacy:Corona|corona]]s is such a right pain.

; AmbientGlow : &quot;Ambient brightness, or 255=pulsing&quot;
; bFilterByVolume : &quot;Filter this sprite by its Visibility volume.&quot;  Huh?
; bMeshCurvy : &quot;Curvy mesh.&quot;
; bMeshEnviroMap : Render Mesh environment-mapped with Texture
; bNoSmooth : If True, model textures are not filtered and will look blocky and stretched.  For some stupid reason the Weapon superclass has this set to True by default.
; bParticles : Given Mesh, particles (sprites drawn as Texture) are drawn where each mesh vertex would be.
; bRandomFrame : If bParticles = True, each particle texture is randomly selected from Texture and the MultiSkins array.
; bShadowCast : &quot;Casts Shadows&quot; (not yet implemented?)
; bUnlit : Actor is rendered fully lit.
; DrawScale  : Scale by which actor is drawn
; float LODBias :  This will affect the distance at which the engine starts simplifying the mesh. If your new model has parts that are pretty thin, or even have a single face, raise this number. 
; DrawType : How actor should be rendered as.  (More exist than those listed below, but they are unused.) ''Legal'' Don't exist or..?
: DT_None &amp;ndash; Don't render.  Not visible.
: DT_Sprite &amp;ndash; Draw as sprite (2d) using Texture/Sprite
: DT_Mesh &amp;ndash; Draw as mesh (3d) using Mesh, mapped with Skin
: DT_Brush &amp;ndash; Draw as brush
: DT_SpriteAnimOnce &amp;ndash; Draw as Sprite, and, if an animation sequence, only animate once.
; Fatness : Lateral widening or compression of mesh.  Default = 128. It's this property that is changed by the [[Legacy:PressureZone|PressureZone]] in DM-Pressure.
; Mesh : 3d model to render actor as in the world and editor if DrawType=DT_Mesh.
; ScaleGlow  : &quot;Multiplies lighting&quot;
: Use a value from 0...1 at scaleglow=0 an actor is very dark. Also when drawstyle = STY_Translucent a value of 0.0 means the actor is totally transparent. Slowly change this from 1 down to 0 in script to make things fade into transparency.
; Skin : Texture to be mapped onto Mesh.
; Sprite  : Texture to be rendered if DrawType=DT_Sprite.
; SpriteProjForward : &quot;Distance forward to draw sprite from actual location&quot;
; Style : Technique to use while rendering.
: STY_None &amp;ndash; don't render.
: STY_Normal &amp;ndash; render normally.
: STY_Masked &amp;ndash; all pixels with the first color in the palette (palette entry 0) are made completely transparent.
: STY_Translucent &amp;ndash; variable translucency based on brightness.  Black is invisible, grey is 50%, white is opaque.
: STY_Modulated &amp;ndash; render texture modulated; RGB(127,127,127) is transparent.  Deeper shades darken, lighter shades lighten.
: - See [[Legacy:Color Blending|Color Blending]] for a more detailed explanation.
; Texture : For actors like Trigger, this is the icon displayed in the editor.  Texture to be rendered if DrawType=DT_Sprite and Sprite=None.  Environment-mapping texture if bMeshEnviroMap=True.
; VisibilityHeight : &quot;cylinder.  Zero=infinite visibility.&quot;
; VisibilityRadius : &quot;Actor is drawn if viewer is within its visibility&quot;

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Events</title>
    <id>392</id>
    <revision>
      <id>1317</id>
      <timestamp>2003-05-23T06:44:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]] (Property group: Events)}}

There are only two variables under an this heading of an Actor's properties:  [[Legacy:Event|Event]] and [[Legacy:Tag|Tag]].  These control the passage and transferrence of events.  Usually, according to an actor's script, the act of passing an event results in this actor doing the following things:
# Search for each actor whose Tag matches this actor's Event.
# Call the &quot;Trigger&quot; function in each of these actors.

The text entered into these two properties is arbitrary: the only important thing is the way the names match. It's sensible to use a descriptive name, for example &quot;BlueDoor&quot;, or &quot;Explosion&quot;. 

; name Event : The name of the event that the actor will fire.
; name Tag : The name of the event that will trigger the actor. By default, this is the same as the name of the actor's class.

==Related Topics ==
* [[Legacy:Actor Overview|Actor overview]]

This topic needs a shake-up: we have [[Legacy:Event|event]], [[Legacy:Tag|tag]], [[Legacy:Triggered|triggered]]

'''Wormbo:''' Is this part of [[:Category:Legacy To Do]]?
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1318</id>
      <timestamp>2002-04-25T09:04:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>removed old discussion, refactored a bit</comment>
      <text xml:space="preserve">There are only two variables under an this heading of an Actor's properties:  [[Legacy:Event|Event]] and [[Legacy:Tag|Tag]].  These control the passage and transferrence of events.  Usually, according to an actor's script, the act of passing an event results in this actor doing the following things:
# Search for each actor whose Tag matches this actor's Event.
# Call the &quot;Trigger&quot; function in each of these actors.

The text entered into these two properties is arbitrary: the only important thing is the way the names match. It's sensible to use a descriptive name, for example &quot;BlueDoor&quot;, or &quot;Explosion&quot;. 

; Event : the name of the event that the actor will fire
; Tag : the name of the event that will trigger the actor. By default, this is the same as the name of the actor's class.

==Related Topics ==
* [[Legacy:Actor Overview|Actor overview]]

This topic needs a shake-up: we have [[Legacy:Event|event]], [[Legacy:Tag|tag]], [[Legacy:Triggered|triggered]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Filter</title>
    <id>393</id>
    <revision>
      <id>1319</id>
      <timestamp>2006-06-14T10:40:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The Filter properties of an actor determine the conditions under which the actor will be present in gameplay.

; bDifficulty0, bDifficulty1, bDifficulty2, and bDifficulty3 : In SinglePlayer, there are four difficulty levels that can be applied.  In Unreal, they are called Easy, Medium, Hard, and Unreal.  The default difficulty level is Medium.  The contents of these variables is used to determine which difficulty levels the actor should be present or absent in.

; bNet : If True, then this actor will appear in regular network play.

; bNetSpecial : If True, then this actor will appear in special network play mode.

; bSinglePlayer : If True, then this actor will appear in standalone gametypes.

; OddsOfAppearing : In a game where this actor would normally exist, this value (between 0 and 1.0) determines the probability of the actor actually appearing.  For most actors, this value is equal to 1, which means that the actor will always exist in relevant games.</text>
    </revision>
    <revision>
      <id>1320</id>
      <timestamp>2006-06-13T21:41:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>answer factored into the text</comment>
      <text xml:space="preserve">The Filter properties of an actor determine the conditions under which the actor will be present in gameplay.

====bDifficulty0, bDifficulty1, bDifficulty2, and bDifficulty3 ====

In SinglePlayer, there are four difficulty levels that can be applied.  In Unreal, they are called Easy, Medium, Hard, and Unreal.  The default difficulty level is Medium.  The contents of these variables is used to determine which difficulty levels the actor should be present or absent in.

====bNet ====

If True, then this actor will appear in regular network play. (dedicated or listen server)

====bNetSpecial ====

If True, then this actor will appear in special network play mode. (client, in whatever way this is going to work &amp;ndash; this is checked in GameInfo which usually doesn't exist on clients)

====bSinglePlayer ====

If True, then this actor will appear in standalone gametypes. (any offline mode)

====OddsOfAppearing ====

In a game where this actor would normally exist, this value (between 0 and 1.0) determines the probability of the actor actually appearing.  For most actors, this value is equal to 1, which means that the actor will always exist in relevant games.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Functions</title>
    <id>394</id>
    <revision>
      <id>1321</id>
      <timestamp>2006-09-08T16:03:00Z</timestamp>
      <contributor>
        <ip>Cdif-cache-5.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Native Functions ==

===General Functions ===
; string ConsoleCommand (string Command) [native, but not final] : Execute a console command.
; Error (coerce string S) : Handle an error and kill this one actor.
; [[Legacy:Actor|Actor]] Spawn (class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation) : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location and with the spawner's rotation.
; bool Destroy() : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick.
; SetTimer (float NewTimerRate, bool bLoop) : If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer.

===Latent Functions ===

[[Legacy:Latent Function|Latent Function]] are special native functions that can only be used in [[Legacy:State|state]] code. (i.e. in labels outside of functions within states.  See ScriptedPawn's script for excellent examples).  They will cause script execution within the state to pause until some condition is met. All other functions and states in other classes will continue to execute normally.

While you cannot define new latent functions, it possible to pull a similar effect:

&lt;uscript&gt;
While (!SomeConditionIsMet()) //Pause until this function returns true
  Sleep(0.0);
&lt;/uscript&gt;

; Sleep (float Seconds) : Waits for the specified amount of time.  Note using continual low values of sleep() (&lt;0.1) is not recommended, as this creates signnificant dependance on frame rate.  For instance, the minigun has this problem, where different frame rates make it fire different amounts of bullets in a second.  See [http://www.clanvikings.org/tnse/images/minishots.jpg?nopic this graph].
; FinishAnim ( ) : Waits till the current animation is finished.  WARNING: If you have an AnimEnd() that plays a new animation, this will never pass!
; FinishInterpolation ( ) : Only used mostly in movers. Pauses until the mover has finished interpolated to the next key.

===Collision ===
; SetCollision (optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers) : 
; bool SetCollisionSize (float NewRadius, float NewHeight) : 
; [[Legacy:Actor|Actor]] Trace (out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActor, optional vector Extent) : Trace a line and see what it collides with first. Takes this actor's collision properties into account. Returns first hit actor, the [[Legacy:LevelInfo|LevelInfo]] if hit level geometry, or ''None'' if hit nothing. bTraceActors specifies whether Trace should check for actors at all.

'''Highlander:''' UT2003 info, Trace returns as expected the static mesh actor if it hits a static mesh, and returns the TerrainInfo if it hits terrain.
; bool FastTrace (vector TraceEnd, optional vector TraceStart) : Returns ''True'' when there is no world geometry between the two points. The actor's location is used as start if no ''TraceStart'' is specified.

===Movement ===
; bool Move (vector Delta) : Moves an actor to Location + Delta.  Stops if is blocked.
; bool SetLocation (vector NewLocation) : Self-explanatory
; bool SetRotation (rotator NewRotation) : Self-explanatory. See also [[Legacy:Rotator|rotator]].
; bool MoveSmooth (vector Delta) : Moves an actor to Location + Delta.  If blocked, the actor will slide on the object it collided with (i.e. as your player does when you walk into a wall).
; AutonomousPhysics (float DeltaSeconds) : Used in PlayerPawn in netgames.  Causes Physics to be handed with a DeltaTime of DeltaSeconds.
; SetPhysics (EPhysics newPhysics) : Sets the actor's movement physics.

===Relations ===
; SetBase ([[Legacy:Actor|Actor]] NewBase) : 
; SetOwner ([[Legacy:Actor|Actor]] NewOwner) : 

===Animations ===
; PlayAnim (name Sequence, optional float Rate, optional float TweenTime) : Plays an Animation (must have a mesh set for this to work!) Sequence=Anim sequence Name ; Rate = Animation Rate multiplier ; TweenTime = Amount of Time to &quot;tween&quot; into the first frame of this animation sequence if in a different sequence.
; LoopAnim (name Sequence, optional float Rate, optional float TweenTime, optional float MinRate) : Plays an animation that loops until another animation is played.
; TweenAnim (name Sequence, float Time) : Tween into a new animation.
; bool IsAnimating ( ) : Returns whether the actor's mesh currently plays an animation.
; name GetAnimGroup (name Sequence) : Returns the group of the actor's current animation.
; bool HasAnim (name Sequence) : Returns whether the specified animation is present for the actor's current mesh.
; LinkSkelAnim (Animation Anim) : Generally never used.  Will Link a Skeletal animation to a skeletal mesh.

===Sounds ===
; PlaySound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) : Plays a sound.  Slot = Sound slot (allows actors to play multiple sounds at once) ; bNoOverride: If true and a sound is currently playing in the specified slot, the new sound will not play (override the current sound).
; PlayOwnedSound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) [simulated] : This plays a sound that will not be replicated to network clients. It is generally used for first-person weapon sound effects, HUD notifications, etcetera.
; DemoPlaySound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) [simulated]: 
; float GetSoundDuration (sound Sound) : Returns the length of the sound in seconds.

===AI Functions ===
; MakeNoise (float Loudness) : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an Instigator if they are not [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; bool PlayerCanSeeMe ( ) : PlayerCanSeeMe returns true if some player has a line of sight to actor's location.

===Other Functions ===
; string GetMapName (string NameEnding, string MapName, int Dir) : The horribly slow function that uses an O(X^2) algorithm to find maps.  When searching for maps it's useful to set the ''NameEnding'' parameter to the prefix for the type of maps you are looking for.  The ''MapName'' parameter can be set to any map name (possibly even maps that don't exist) and its value is used to derive the name of the next map returned by this function.  The ''Dir'' parameter should be set to 1 to move forwards in the list of map names, -1 to move backwards, and 0 to return the same map.  A ''Dir'' of 0 is onle every used with a ''MapName'' value of &quot;&quot; to obtain the first map in the list of maps for a given map prefix.  Be aware that this function will loop from the last map in a &quot;list&quot; to the &quot;first&quot; map in the list without warning.
; GetNextSkin (string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc) : Another slow function that finds skins.
; string GetURLMap ( ) : Supposedly returns the current map's filename. (although gives false results in save games and demos).
; string GetNextInt (string ClassName, int Num) : Reads through the INT files in the system directory and returns the classname of entries with a MetaClass given by ClassName.
; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextINT, only supports the Description tag in INT files.
; bool GetCacheEntry (int Num, out string GUID, out string Filename) : Reads through the cache.ini and returns the FileName and GUID of files within the cache directory.
; bool MoveCacheEntry (string GUID, optional string NewFilename) :  Will &quot;move&quot; an entry somewhere... (haven't fully tested it).

==Scripted Functions and Engine Notifications ==

===General Notifications ===
; AnimEnd ( ) : Called when an animation has completed.
; Destroyed ( ) : Called when the actor is destroyed.
; Expired ( ) : Called when the actor's LifeSpan has reached 0.
; GainedChild ([[Legacy:Actor|Actor]] Other) : Called when this actor becomes the Owner of other.
; LostChild ([[Legacy:Actor|Actor]] Other) : Called when this actor is no longer the Owner of other (including other being destroyed()).
; Tick (float DeltaTime) : Called once each frame. DeltaTime is the time that has passed since the last frame.
; Timer ( ) : Called when the Timer has expired (Launched by SetTimer()).
; TravelPreAccept ( ) : Called when carried onto a new level, before AcceptInventory.
; TravelPostAccept ( ) : Called when carried into a new level, after AcceptInventory.
; BecomeViewTarget ( ) : Called by PlayerPawn when this actor becomes its ViewTarget.

===Initialisation ===

(also see [[Legacy:Creating Actors And Objects|Creating Actors and Objects]])
; Spawned ( ) : Called only when the actor is created using the Spawn method.
; PreBeginPlay ( ) : Called immediately before gameplay begins.
; BeginPlay ( ) : Called when gameplay begins.
; PostBeginPlay ( ) : Called after gameplay begins, before variables have been replicated to the clients.
; SetInitialState ( ) [simulated] : Called after PostBeginPlay to set the initial state of the actor.
; PostNetBeginPlay ( ) [simulated] : Called on net clients after the data packet that spawned this actor has been completely processed.  However, replicated variables are NOT guarenteed to have reached the client.

===Triggers ===
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : Handled in subclasses.
; UnTrigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : Handled in subclasses.
; BeginEvent ( ) : 
; EndEvent ( ) : 

===Physics and World Interaction ===
; HitWall (vector HitNormal, [[Legacy:Actor|Actor]] HitWall) : Called when the actor hits a fall. ( NB, defined for projectile actors only and called from within touch() if the touching actor has blockall set. )
; Falling ( ) : Called when Pawns begin to fall.
; Landed (vector HitNormal) : Called when an actor hits the ground.  (What is the angle in relation to a flat plane that the ground must be at to be considered ground and not a wall?)
; ZoneChange ([[Legacy:ZoneInfo|ZoneInfo]] NewZone) : Called when actor is about to enter a new [[Legacy:Zone|Zone]].
; Touch ([[Legacy:Actor|Actor]] Other) : Called when Other touches this actor (and this actor doesn't block that actor).
; PostTouch ([[Legacy:Actor|Actor]] Other) :  // called for PendingTouch actor after physics completes
; UnTouch ([[Legacy:Actor|Actor]] Other) : Called when Other is no longer touching this actor.
; Bump ([[Legacy:Actor|Actor]] Other) : Called when an actor bumps into this actor and is blocked.
; BaseChange ( ) : Called when the actor's base changes.
; Attach ([[Legacy:Actor|Actor]] Other) : 
; Detach ([[Legacy:Actor|Actor]] Other) : 
; KillCredit ([[Legacy:Actor|Actor]] Other) : Not implemented in Epic's Code.
; [[Legacy:Actor|Actor]] SpecialHandling ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Used by the navigation system to modify results.
; bool EncroachingOn ([[Legacy:Actor|Actor]] Other) : Called when this actor is trying to take up the same space as Other. (and block each other?)
; EncroachedBy ([[Legacy:Actor|Actor]] Other) : Called when Other has taken up this actor's space. (and block each other).
; InterpolateEnd ([[Legacy:Actor|Actor]] Other) : 
; EndedRotation ( ) : Called when an actor's rotation has reached DesiredRotation?
; FellOutOfWorld ( ) : This is called when an actor enters zone 0. Zone 0 is the region of non-subtracted space in your level. Actors can enter this zone through BSP errors or if they are of a type that does not collide with the world.
; bool PreTeleport ([[Legacy:Teleporter|Teleporter]] InTeleporter) : Called by InTeleporter when trying to Teleport this actor. Return true to prevent Teleporter from Teleporting.
; PostTeleport ([[Legacy:Teleporter|Teleporter]] OutTeleporter ) : Not implemented?

===Damage ===
; KilledBy ([[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : 
; TakeDamage (int Damage, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator, vector HitLocation, vector Momentum, name DamageType) : Implemented in subclasses.

===Rendering ===
; RenderOverlays ([[Legacy:Canvas|Canvas]] Canvas) : Draw on canvas before flash and fog are applied. (used for drawing weapons).  Note that only the PlayerPawn receives this call from the engine.
; RenderTexture ([[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] Tex) : Called when a scripted texture with this Actor set as NotifyActor needs rendering.
; SetDisplayProperties (ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a [[Legacy:Pawn (UT)|Pawn (UT)]]'s [[Legacy:Weapon (UT)|Weapon (UT)]]) or to adjust the result based on other factors (such as a [[Legacy:Pawn (UT)|Pawn (UT)]]'s other [[Legacy:Inventory (UT)|Inventory (UT)]] wanting to affect the result)
; SetDefaultDisplayProperties ( ) : Sets the default display properties similar to SetDisplayProperties.

===Messages ===
; BroadcastMessage (coerce string Msg, optional bool bBeep, optional name Type) : Broadcast a string message to all players. This calls ClientMessage on all [[Legacy:Pawn (UT)|Pawn (UT)]]s (see [[Legacy:Pawn (UT)/Events|Pawn (UT)/Events]]). See [[Legacy:SpecialEvent|SpecialEvent]] for an example. Type can be one of 'Event' (default), 'CriticalEvent', 'Say', 'TeamSay', 'DeathMessage', 'Pickup' and maybe other types for custom HUD classes.
; BroadcastLocalizedMessage (class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] class defines how the PRI's and optional actor are used.

===Other Functions ===
; HurtRadius (float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation) [final] : Hurt other actors within a radius of this actor. [[Legacy:ExplosionChain|ExplosionChain]] uses this, for example.
; string GetItemName (string FullName) : Returns the string representation of the name of an object without the package prefixes.
; string GetHumanName ( ) : Returns the human readable string representation of an object.

----

'''Mychaeel:'''  I've seen that elsewhere too &amp;ndash; I really think that everything up to and including the &quot;function&quot; keyword should be stripped from function prototype here on the Wiki in order to keep the clutter at a minimum.  It's much more important to see that a function returns a string value than knowing that it's native(123).

'''Wormbo:''' Ok, how about putting really important stuff (final, static, etc.) in brackets behind the function definition? &lt;br /&gt;HurtRadius (float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation) [final]

'''Mychaeel:'''  I could live with that.  :-)

'''Wormbo:''' How's that?

'''Mychaeel:'''  Much tidier :-)

'''Hugh:''' I've just made a change to the SetTimer() description - I think I'm right, but can someone confirm?

'''Zedsquared:''' Looks good but has anyone experimented to see what happens if timer() takes longer than TimerRate to execute? do you get another event fired or will it wait?

'''Mychaeel:'''  Since UnrealScript code doesn't execute in parallel and lengthy execution of code in Timer blocks everything else, the engine will simply fire the next timer event in the next tick.

'''BesigedB:'''  Tick, tock, tick, tock.

'''Highlander:''' I guess this is a Trace related question, ive noticed that when a trace() hits terrain the HitLocation points towards the TerrainInfo actor ?? Am i correct or am i loosing my mind?

'''Claw:''' Hmm, are you certain it's the HitLocation? I experienced something similar in UT; when a Trace hit the Level, the HitActor would be the LevelInfo (maybe ZoneInfo if one existed, I never checked). Maybe your code uses HitActor.Location?

'''Highlander:''' Positive, it doesnt matter as i found a way around the particular problem that uses less traces. It does return the TerrainInfo as the actor however, the vsize of the hitlocation was 3000units + in my tests. (The trace was 128 units long) and i was approximately 3000 units from the center of the map where the terrain info was.

'''Foxpaw:''' Hitlocation is relative to the center of the world, as far as I know... I think that the terraininfo and center of the map just coincided. Can someone confirm this? I've noticed that in UT2003 instantfire weapons scratch the hitlocation and replace it with the end of the trace instead of the point where the trace actually impacted the map, that seems silly but I expect it's done that way for a reason.

'''Claw:''' Strange, when I just tested it again with the newest patch, the HitLocation definitely wasn't the HitActor's Location. It wasn't the correct spot either. But I verified the error is linked to the position where the trace starts. From the center of the map Trace works allright.

'''Foxpaw:''' HitLocation isn't usually the location of the actor you hit, but instead the point upon that objects collision sphere/cylinder/whatever. I'm not sure why your traces would not be returning the correct location for hitlocation when you hit the world - it works fine for me.</text>
    </revision>
    <revision>
      <id>1322</id>
      <timestamp>2004-05-23T22:09:25Z</timestamp>
      <contributor>
        <ip>Cpc5-whit1-3-0-cust204.cdif.cable.ntl.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Native Functions ==

===General Functions ===
; string ConsoleCommand (string Command) [native, but not final] : Execute a console command.
; Error (coerce string S) : Handle an error and kill this one actor.
; [[Legacy:Actor|Actor]] Spawn (class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation) : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location and with the spawner's rotation.
; bool Destroy() : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick.
; SetTimer (float NewTimerRate, bool bLoop) : If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer.

===Latent Functions ===

[[Legacy:Latent Function|Latent Function]] are special native functions that can only be used in [[Legacy:State|state]] code. (i.e. in labels outside of functions within states.  See ScriptedPawn's script for excellent examples).  They will cause script execution within the state to pause until some condition is met. All other functions and states in other classes will continue to execute normally.

While you cannot define new latent functions, it possible to pull a similar effect:

&lt;uscript&gt;
While (!SomeConditionIsMet()) //Pause until this function returns true
  Sleep(0.0);
&lt;/uscript&gt;

; Sleep (float Seconds) : Waits for the specified amount of time.  Note using continual low values of sleep() (&lt;0.1) is not recommended, as this creates signnificant dependance on frame rate.  For instance, the minigun has this problem, where different frame rates make it fire different amounts of bullets in a second.  See [http://www.clanvikings.org/tnse/images/minishots.jpg?nopic this graph].
; FinishAnim ( ) : Waits till the current animation is finished.  WARNING: If you have an AnimEnd() that plays a new animation, this will never pass!
; FinishInterpolation ( ) : Only used mostly in movers. Pauses until the mover has finished interpolated to the next key.

===Collision ===
; SetCollision (optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers) : 
; bool SetCollisionSize (float NewRadius, float NewHeight) : 
; [[Legacy:Actor|Actor]] Trace (out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActor, optional vector Extent) : Trace a line and see what it collides with first. Takes this actor's collision properties into account. Returns first hit actor, the [[Legacy:LevelInfo|LevelInfo]] if hit level geometry, or ''None'' if hit nothing. bTraceActors specifies whether Trace should check for actors at all.

'''Highlander:''' UT2003 info, Trace returns as expected the static mesh actor if it hits a static mesh, and returns the TerrainInfo if it hits terrain.
; bool FastTrace (vector TraceEnd, optional vector TraceStart) : Returns ''True'' when there is no world geometry between the two points. The actor's location is used as start if no ''TraceStart'' is specified.

===Movement ===
; bool Move (vector Delta) : Moves an actor to Location + Delta.  Stops if is blocked.
; bool SetLocation (vector NewLocation) : Self-explanatory
; bool SetRotation (rotator NewRotation) : Self-explanatory. See also [[Legacy:Rotator|rotator]].
; bool MoveSmooth (vector Delta) : Moves an actor to Location + Delta.  If blocked, the actor will slide on the object it collided with (i.e. as your player does when you walk into a wall).
; AutonomousPhysics (float DeltaSeconds) : Used in PlayerPawn in netgames.  Causes Physics to be handed with a DeltaTime of DeltaSeconds.
; SetPhysics (EPhysics newPhysics) : Sets the actor's movement physics.

===Relations ===
; SetBase ([[Legacy:Actor|Actor]] NewBase) : 
; SetOwner ([[Legacy:Actor|Actor]] NewOwner) : 

===Animations ===
; PlayAnim (name Sequence, optional float Rate, optional float TweenTime) : Plays an Animation (must have a mesh set for this to work!) Sequence=Anim sequence Name ; Rate = Animation Rate multiplier ; TweenTime = Amount of Time to &quot;tween&quot; into the first frame of this animation sequence if in a different sequence.
; LoopAnim (name Sequence, optional float Rate, optional float TweenTime, optional float MinRate) : Plays an animation that loops until another animation is played.
; TweenAnim (name Sequence, float Time) : Tween into a new animation.
; bool IsAnimating ( ) : Returns whether the actor's mesh currently plays an animation.
; name GetAnimGroup (name Sequence) : Returns the group of the actor's current animation.
; bool HasAnim (name Sequence) : Returns whether the specified animation is present for the actor's current mesh.
; LinkSkelAnim (Animation Anim) : Generally never used.  Will Link a Skeletal animation to a skeletal mesh.

===Sounds ===
; PlaySound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) : Plays a sound.  Slot = Sound slot (allows actors to play multiple sounds at once) ; bNoOverride: If true and a sound is currently playing in the specified slot, the new sound will not play (override the current sound).
; PlayOwnedSound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) [simulated] : This plays a sound that will not be replicated to network clients. It is generally used for first-person weapon sound effects, HUD notifications, etcetera.
; DemoPlaySound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) [simulated]: 
; float GetSoundDuration (sound Sound) : Returns the length of the sound in seconds.

===AI Functions ===
; MakeNoise (float Loudness) : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an Instigator if they are not [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; bool PlayerCanSeeMe ( ) : PlayerCanSeeMe returns true if some player has a line of sight to actor's location.

===Other Functions ===
; string GetMapName (string NameEnding, string MapName, int Dir) : The horribly slow function that uses an O(X^2) algorithm to find maps.  When searching for maps it's useful to set the ''NameEnding'' parameter to the prefix for the type of maps you are looking for.  The ''MapName'' parameter can be set to any map name (possibly even maps that don't exist) and its value is used to derive the name of the next map returned by this function.  The ''Dir'' parameter should be set to 1 to move forwards in the list of map names, -1 to move backwards, and 0 to return the same map.  A ''Dir'' of 0 is onle every used with a ''MapName'' value of &quot;&quot; to obtain the first map in the list of maps for a given map prefix.  Be aware that this function will loop from the last map in a &quot;list&quot; to the &quot;first&quot; map in the list without warning.
; GetNextSkin (string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc) : Another slow function that finds skins.
; string GetURLMap ( ) : Supposedly returns the current map's filename. (although gives false results in save games and demos).
; string GetNextInt (string ClassName, int Num) : Reads through the INT files in the system directory and returns the classname of entries with a MetaClass given by ClassName.
; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextINT, only supports the Description tag in INT files.
; bool GetCacheEntry (int Num, out string GUID, out string Filename) : Reads through the cache.ini and returns the FileName and GUID of files within the cache directory.
; bool MoveCacheEntry (string GUID, optional string NewFilename) :  Will &quot;move&quot; an entry somewhere... (haven't fully tested it).

==Scripted Functions and Engine Notifications ==

===General Notifications ===
; AnimEnd ( ) : Called when an animation has completed.
; Destroyed ( ) : Called when the actor is destroyed.
; Expired ( ) : Called when the actor's LifeSpan has reached 0.
; GainedChild ([[Legacy:Actor|Actor]] Other) : Called when this actor becomes the Owner of other.
; LostChild ([[Legacy:Actor|Actor]] Other) : Called when this actor is no longer the Owner of other (including other being destroyed()).
; Tick (float DeltaTime) : Called once each frame. DeltaTime is the time that has passed since the last frame.
; Timer ( ) : Called when the Timer has expired (Launched by SetTimer()).
; TravelPreAccept ( ) : Called when carried onto a new level, before AcceptInventory.
; TravelPostAccept ( ) : Called when carried into a new level, after AcceptInventory.
; BecomeViewTarget ( ) : Called by PlayerPawn when this actor becomes its ViewTarget.

===Initialisation ===

(also see [[Legacy:Creating Actors And Objects|Creating Actors and Objects]])
; Spawned ( ) : Called only when the actor is created using the Spawn method.
; PreBeginPlay ( ) : Called immediately before gameplay begins.
; BeginPlay ( ) : Called when gameplay begins.
; PostBeginPlay ( ) : Called after gameplay begins, before variables have been replicated to the clients.
; SetInitialState ( ) [simulated] : Called after PostBeginPlay to set the initial state of the actor.
; PostNetBeginPlay ( ) [simulated] : Called on net clients after the data packet that spawned this actor has been completely processed.  However, replicated variables are NOT guarenteed to have reached the client.

===Triggers ===
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : Handled in subclasses.
; UnTrigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : Handled in subclasses.
; BeginEvent ( ) : 
; EndEvent ( ) : 

===Physics and World Interaction ===
; HitWall (vector HitNormal, [[Legacy:Actor|Actor]] HitWall) : Called when the actor hits a fall. ( NB, defined for projectile actors only and called from within touch() if the touching actor has blockall set. )
; Falling ( ) : Called when Pawns begin to fall.
; Landed (vector HitNormal) : Called when an actor hits the ground.  (What is the angle in relation to a flat plane that the ground must be at to be considered ground and not a wall?)
; ZoneChange ([[Legacy:ZoneInfo|ZoneInfo]] NewZone) : Called when actor is about to enter a new [[Legacy:Zone|Zone]].
; Touch ([[Legacy:Actor|Actor]] Other) : Called when Other touches this actor (and this actor doesn't block that actor).
; PostTouch ([[Legacy:Actor|Actor]] Other) :  // called for PendingTouch actor after physics completes
; UnTouch ([[Legacy:Actor|Actor]] Other) : Called when Other is no longer touching this actor.
; Bump ([[Legacy:Actor|Actor]] Other) : Called when an actor bumps into this actor and is blocked.
; BaseChange ( ) : Called when the actor's base changes.
; Attach ([[Legacy:Actor|Actor]] Other) : 
; Detach ([[Legacy:Actor|Actor]] Other) : 
; KillCredit ([[Legacy:Actor|Actor]] Other) : Not implemented in Epic's Code.
; [[Legacy:Actor|Actor]] SpecialHandling ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Used by the navigation system to modify results.
; bool EncroachingOn ([[Legacy:Actor|Actor]] Other) : Called when this actor is trying to take up the same space as Other. (and block each other?)
; EncroachedBy ([[Legacy:Actor|Actor]] Other) : Called when Other has taken up this actor's space. (and block each other).
; InterpolateEnd ([[Legacy:Actor|Actor]] Other) : 
; EndedRotation ( ) : Called when an actor's rotation has reached DesiredRotation?
; FellOutOfWorld ( ) : This is called when an actor enters zone 0. Zone 0 is the region of non-subtracted space in your level. Actors can enter this zone through BSP errors or if they are of a type that does not collide with the world.
; bool PreTeleport ([[Legacy:Teleporter|Teleporter]] InTeleporter) : Called by InTeleporter when trying to Teleport this actor. Return true to prevent Teleporter from Teleporting.
; PostTeleport ([[Legacy:Teleporter|Teleporter]] OutTeleporter ) : Not implemented?

===Damage ===
; KilledBy ([[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : 
; TakeDamage (int Damage, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator, vector HitLocation, vector Momentum, name DamageType) : Implemented in subclasses.

===Rendering ===
; RenderOverlays ([[Legacy:Canvas|Canvas]] Canvas) : Draw on canvas before flash and fog are applied. (used for drawing weapons).  Note that only the PlayerPawn receives this call from the engine.
; RenderTexture ([[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] Tex) : Called when a scripted texture with this Actor set as NotifyActor needs rendering.
; SetDisplayProperties (ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a [[Legacy:Pawn (UT)|Pawn (UT)]]'s [[Legacy:Weapon (UT)|Weapon (UT)]]) or to adjust the result based on other factors (such as a [[Legacy:Pawn (UT)|Pawn (UT)]]'s other [[Legacy:Inventory (UT)|Inventory (UT)]] wanting to affect the result)
; SetDefaultDisplayProperties ( ) : Sets the default display properties similar to SetDisplayProperties.

===Messages ===
; BroadcastMessage (coerce string Msg, optional bool bBeep, optional name Type) : Broadcast a string message to all players. This calls ClientMessage on all [[Legacy:Pawn (UT)|Pawn (UT)]]s (see [[Legacy:Pawn (UT)/Events|Pawn (UT)/Events]]). See [[Legacy:SpecialEvent|SpecialEvent]] for an example. Type can be one of 'Event' (default), 'CriticalEvent', 'Say', 'TeamSay', 'DeathMessage', 'Pickup' and maybe other types for custom HUD classes.
; BroadcastLocalizedMessage (class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] class defines how the PRI's and optional actor are used.

===Other Functions ===
; HurtRadius (float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation) [final] : Hurt other actors within a radius of this actor. [[Legacy:ExplosionChain|ExplosionChain]] uses this, for example.
; string GetItemName (string FullName) : Returns the string representation of the name of an object without the package prefixes.
; string GetHumanName ( ) : Returns the human readable string representation of an object.

----

'''Mychaeel:'''  I've seen that elsewhere too &amp;ndash; I really think that everything up to and including the &quot;function&quot; keyword should be stripped from function prototype here on the Wiki in order to keep the clutter at a minimum.  It's much more important to see that a function returns a string value than knowing that it's native(123).

'''Wormbo:''' Ok, how about putting really important stuff (final, static, etc.) in brackets behind the function definition? &lt;br /&gt;HurtRadius (float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation) [final]

'''Mychaeel:'''  I could live with that.  :-)

'''Wormbo:''' How's that?

'''Mychaeel:'''  Much tidier :-)

'''Hugh:''' I've just made a change to the SetTimer() description - I think I'm right, but can someone confirm?

'''Zedsquared:''' Looks good but has anyone experimented to see what happens if timer() takes longer than TimerRate to execute? do you get another event fired or will it wait?

'''Mychaeel:'''  Since UnrealScript code doesn't execute in parallel and lengthy execution of code in Timer blocks everything else, the engine will simply fire the next timer event in the next tick.

'''BesigedB:'''  Tick, tock, tick, tock.

'''Highlander:''' I guess this is a Trace related question, ive noticed that when a trace() hits terrain the HitLocation points towards the TerrainInfo actor ?? Am i correct or am i loosing my mind?

'''Claw:''' Hmm, are you certain it's the HitLocation? I experienced something similar in UT; when a Trace hit the Level, the HitActor would be the LevelInfo (maybe ZoneInfo if one existed, I never checked). Maybe your code uses HitActor.Location?

'''Highlander:''' Positive, it doesnt matter as i found a way around the particular problem that uses less traces. It does return the TerrainInfo as the actor however, the vsize of the hitlocation was 3000units + in my tests. (The trace was 128 units long) and i was approximately 3000 units from the center of the map where the terrain info was.

'''Foxpaw:''' Hitlocation is relative to the center of the world, as far as I know... I think that the terraininfo and center of the map just coincided. Can someone confirm this? I've noticed that in UT2003 instantfire weapons scratch the hitlocation and replace it with the end of the trace instead of the point where the trace actually impacted the map, that seems silly but I expect it's done that way for a reason.

'''Claw:''' Strange, when I just tested it again with the newest patch, the HitLocation definitely wasn't the HitActor's Location. It wasn't the correct spot either. But I verified the error is linked to the position where the trace starts. From the center of the map Trace works allright.

'''Foxpaw:''' HitLocation isn't usually the location of the actor you hit, but instead the point upon that objects collision sphere/cylinder/whatever. I'm not sure why your traces would not be returning the correct location for hitlocation when you hit the world - it works fine for me.

'''[CK]Davros:''' In my experience as a newbie scripter, bStatic stops the Timer() function. I spent a couple of hours trying to work out what was wrong with my script, and feel kinda stupid.</text>
    </revision>
    <revision>
      <id>35473</id>
      <timestamp>2009-10-14T10:43:30Z</timestamp>
      <contributor>
        <ip>200.129.46.188</ip>
      </contributor>
      <comment>/* Latent Functions */</comment>
      <text xml:space="preserve">==Native Functions ==

===General Functions ===
; string ConsoleCommand (string Command) [native, but not final] : Execute a console command.
; Error (coerce string S) : Handle an error and kill this one actor.
; [[Legacy:Actor|Actor]] Spawn (class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation) : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location and with the spawner's rotation.
; bool Destroy() : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick.
; SetTimer (float NewTimerRate, bool bLoop) : If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer.

===Latent Functions ===

[[Legacy:Latent Function|Latent Function]] are special native functions that can only be used in [[Legacy:State|state]] code. (i.e. in labels outside of functions within states.  See ScriptedPawn's script for excellent examples).  They will cause script execution within the state to pause until some condition is met. All other functions and states in other classes will continue to execute normally.

While you cannot define new latent functions, it possible to pull a similar effect:

&lt;uscript&gt;
While (!SomeConditionIsMet()) //Pause until this function returns true
  Sleep(0.0);
&lt;/uscript&gt;

; Sleep (float Seconds) : Waits for the specified amount of time.  Note using continual low values of sleep() (&lt;0.1) is not recommended, as this creates signnificant dependance on frame rate.  For instance, the minigun has this problem, where different frame rates make it fire different amounts of bullets in a second.  See [http://wiki.unrealadmin.org/images/0/00/Minishots.jpg this graph].
; FinishAnim ( ) : Waits till the current animation is finished.  WARNING: If you have an AnimEnd() that plays a new animation, this will never pass!
; FinishInterpolation ( ) : Only used mostly in movers. Pauses until the mover has finished interpolated to the next key.

===Collision ===
; SetCollision (optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers) : 
; bool SetCollisionSize (float NewRadius, float NewHeight) : 
; [[Legacy:Actor|Actor]] Trace (out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActor, optional vector Extent) : Trace a line and see what it collides with first. Takes this actor's collision properties into account. Returns first hit actor, the [[Legacy:LevelInfo|LevelInfo]] if hit level geometry, or ''None'' if hit nothing. bTraceActors specifies whether Trace should check for actors at all.

'''Highlander:''' UT2003 info, Trace returns as expected the static mesh actor if it hits a static mesh, and returns the TerrainInfo if it hits terrain.
; bool FastTrace (vector TraceEnd, optional vector TraceStart) : Returns ''True'' when there is no world geometry between the two points. The actor's location is used as start if no ''TraceStart'' is specified.

===Movement ===
; bool Move (vector Delta) : Moves an actor to Location + Delta.  Stops if is blocked.
; bool SetLocation (vector NewLocation) : Self-explanatory
; bool SetRotation (rotator NewRotation) : Self-explanatory. See also [[Legacy:Rotator|rotator]].
; bool MoveSmooth (vector Delta) : Moves an actor to Location + Delta.  If blocked, the actor will slide on the object it collided with (i.e. as your player does when you walk into a wall).
; AutonomousPhysics (float DeltaSeconds) : Used in PlayerPawn in netgames.  Causes Physics to be handed with a DeltaTime of DeltaSeconds.
; SetPhysics (EPhysics newPhysics) : Sets the actor's movement physics.

===Relations ===
; SetBase ([[Legacy:Actor|Actor]] NewBase) : 
; SetOwner ([[Legacy:Actor|Actor]] NewOwner) : 

===Animations ===
; PlayAnim (name Sequence, optional float Rate, optional float TweenTime) : Plays an Animation (must have a mesh set for this to work!) Sequence=Anim sequence Name ; Rate = Animation Rate multiplier ; TweenTime = Amount of Time to &quot;tween&quot; into the first frame of this animation sequence if in a different sequence.
; LoopAnim (name Sequence, optional float Rate, optional float TweenTime, optional float MinRate) : Plays an animation that loops until another animation is played.
; TweenAnim (name Sequence, float Time) : Tween into a new animation.
; bool IsAnimating ( ) : Returns whether the actor's mesh currently plays an animation.
; name GetAnimGroup (name Sequence) : Returns the group of the actor's current animation.
; bool HasAnim (name Sequence) : Returns whether the specified animation is present for the actor's current mesh.
; LinkSkelAnim (Animation Anim) : Generally never used.  Will Link a Skeletal animation to a skeletal mesh.

===Sounds ===
; PlaySound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) : Plays a sound.  Slot = Sound slot (allows actors to play multiple sounds at once) ; bNoOverride: If true and a sound is currently playing in the specified slot, the new sound will not play (override the current sound).
; PlayOwnedSound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) [simulated] : This plays a sound that will not be replicated to network clients. It is generally used for first-person weapon sound effects, HUD notifications, etcetera.
; DemoPlaySound (sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch) [simulated]: 
; float GetSoundDuration (sound Sound) : Returns the length of the sound in seconds.

===AI Functions ===
; MakeNoise (float Loudness) : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an Instigator if they are not [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; bool PlayerCanSeeMe ( ) : PlayerCanSeeMe returns true if some player has a line of sight to actor's location.

===Other Functions ===
; string GetMapName (string NameEnding, string MapName, int Dir) : The horribly slow function that uses an O(X^2) algorithm to find maps.  When searching for maps it's useful to set the ''NameEnding'' parameter to the prefix for the type of maps you are looking for.  The ''MapName'' parameter can be set to any map name (possibly even maps that don't exist) and its value is used to derive the name of the next map returned by this function.  The ''Dir'' parameter should be set to 1 to move forwards in the list of map names, -1 to move backwards, and 0 to return the same map.  A ''Dir'' of 0 is onle every used with a ''MapName'' value of &quot;&quot; to obtain the first map in the list of maps for a given map prefix.  Be aware that this function will loop from the last map in a &quot;list&quot; to the &quot;first&quot; map in the list without warning.
; GetNextSkin (string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc) : Another slow function that finds skins.
; string GetURLMap ( ) : Supposedly returns the current map's filename. (although gives false results in save games and demos).
; string GetNextInt (string ClassName, int Num) : Reads through the INT files in the system directory and returns the classname of entries with a MetaClass given by ClassName.
; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextINT, only supports the Description tag in INT files.
; bool GetCacheEntry (int Num, out string GUID, out string Filename) : Reads through the cache.ini and returns the FileName and GUID of files within the cache directory.
; bool MoveCacheEntry (string GUID, optional string NewFilename) :  Will &quot;move&quot; an entry somewhere... (haven't fully tested it).

==Scripted Functions and Engine Notifications ==

===General Notifications ===
; AnimEnd ( ) : Called when an animation has completed.
; Destroyed ( ) : Called when the actor is destroyed.
; Expired ( ) : Called when the actor's LifeSpan has reached 0.
; GainedChild ([[Legacy:Actor|Actor]] Other) : Called when this actor becomes the Owner of other.
; LostChild ([[Legacy:Actor|Actor]] Other) : Called when this actor is no longer the Owner of other (including other being destroyed()).
; Tick (float DeltaTime) : Called once each frame. DeltaTime is the time that has passed since the last frame.
; Timer ( ) : Called when the Timer has expired (Launched by SetTimer()).
; TravelPreAccept ( ) : Called when carried onto a new level, before AcceptInventory.
; TravelPostAccept ( ) : Called when carried into a new level, after AcceptInventory.
; BecomeViewTarget ( ) : Called by PlayerPawn when this actor becomes its ViewTarget.

===Initialisation ===

(also see [[Legacy:Creating Actors And Objects|Creating Actors and Objects]])
; Spawned ( ) : Called only when the actor is created using the Spawn method.
; PreBeginPlay ( ) : Called immediately before gameplay begins.
; BeginPlay ( ) : Called when gameplay begins.
; PostBeginPlay ( ) : Called after gameplay begins, before variables have been replicated to the clients.
; SetInitialState ( ) [simulated] : Called after PostBeginPlay to set the initial state of the actor.
; PostNetBeginPlay ( ) [simulated] : Called on net clients after the data packet that spawned this actor has been completely processed.  However, replicated variables are NOT guarenteed to have reached the client.

===Triggers ===
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : Handled in subclasses.
; UnTrigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : Handled in subclasses.
; BeginEvent ( ) : 
; EndEvent ( ) : 

===Physics and World Interaction ===
; HitWall (vector HitNormal, [[Legacy:Actor|Actor]] HitWall) : Called when the actor hits a fall. ( NB, defined for projectile actors only and called from within touch() if the touching actor has blockall set. )
; Falling ( ) : Called when Pawns begin to fall.
; Landed (vector HitNormal) : Called when an actor hits the ground.  (What is the angle in relation to a flat plane that the ground must be at to be considered ground and not a wall?)
; ZoneChange ([[Legacy:ZoneInfo|ZoneInfo]] NewZone) : Called when actor is about to enter a new [[Legacy:Zone|Zone]].
; Touch ([[Legacy:Actor|Actor]] Other) : Called when Other touches this actor (and this actor doesn't block that actor).
; PostTouch ([[Legacy:Actor|Actor]] Other) :  // called for PendingTouch actor after physics completes
; UnTouch ([[Legacy:Actor|Actor]] Other) : Called when Other is no longer touching this actor.
; Bump ([[Legacy:Actor|Actor]] Other) : Called when an actor bumps into this actor and is blocked.
; BaseChange ( ) : Called when the actor's base changes.
; Attach ([[Legacy:Actor|Actor]] Other) : 
; Detach ([[Legacy:Actor|Actor]] Other) : 
; KillCredit ([[Legacy:Actor|Actor]] Other) : Not implemented in Epic's Code.
; [[Legacy:Actor|Actor]] SpecialHandling ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Used by the navigation system to modify results.
; bool EncroachingOn ([[Legacy:Actor|Actor]] Other) : Called when this actor is trying to take up the same space as Other. (and block each other?)
; EncroachedBy ([[Legacy:Actor|Actor]] Other) : Called when Other has taken up this actor's space. (and block each other).
; InterpolateEnd ([[Legacy:Actor|Actor]] Other) : 
; EndedRotation ( ) : Called when an actor's rotation has reached DesiredRotation?
; FellOutOfWorld ( ) : This is called when an actor enters zone 0. Zone 0 is the region of non-subtracted space in your level. Actors can enter this zone through BSP errors or if they are of a type that does not collide with the world.
; bool PreTeleport ([[Legacy:Teleporter|Teleporter]] InTeleporter) : Called by InTeleporter when trying to Teleport this actor. Return true to prevent Teleporter from Teleporting.
; PostTeleport ([[Legacy:Teleporter|Teleporter]] OutTeleporter ) : Not implemented?

===Damage ===
; KilledBy ([[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator) : 
; TakeDamage (int Damage, [[Legacy:Pawn (UT)|Pawn (UT)]] EventInstigator, vector HitLocation, vector Momentum, name DamageType) : Implemented in subclasses.

===Rendering ===
; RenderOverlays ([[Legacy:Canvas|Canvas]] Canvas) : Draw on canvas before flash and fog are applied. (used for drawing weapons).  Note that only the PlayerPawn receives this call from the engine.
; RenderTexture ([[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] Tex) : Called when a scripted texture with this Actor set as NotifyActor needs rendering.
; SetDisplayProperties (ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a [[Legacy:Pawn (UT)|Pawn (UT)]]'s [[Legacy:Weapon (UT)|Weapon (UT)]]) or to adjust the result based on other factors (such as a [[Legacy:Pawn (UT)|Pawn (UT)]]'s other [[Legacy:Inventory (UT)|Inventory (UT)]] wanting to affect the result)
; SetDefaultDisplayProperties ( ) : Sets the default display properties similar to SetDisplayProperties.

===Messages ===
; BroadcastMessage (coerce string Msg, optional bool bBeep, optional name Type) : Broadcast a string message to all players. This calls ClientMessage on all [[Legacy:Pawn (UT)|Pawn (UT)]]s (see [[Legacy:Pawn (UT)/Events|Pawn (UT)/Events]]). See [[Legacy:SpecialEvent|SpecialEvent]] for an example. Type can be one of 'Event' (default), 'CriticalEvent', 'Say', 'TeamSay', 'DeathMessage', 'Pickup' and maybe other types for custom HUD classes.
; BroadcastLocalizedMessage (class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] class defines how the PRI's and optional actor are used.

===Other Functions ===
; HurtRadius (float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation) [final] : Hurt other actors within a radius of this actor. [[Legacy:ExplosionChain|ExplosionChain]] uses this, for example.
; string GetItemName (string FullName) : Returns the string representation of the name of an object without the package prefixes.
; string GetHumanName ( ) : Returns the human readable string representation of an object.

----

'''Mychaeel:'''  I've seen that elsewhere too &amp;ndash; I really think that everything up to and including the &quot;function&quot; keyword should be stripped from function prototype here on the Wiki in order to keep the clutter at a minimum.  It's much more important to see that a function returns a string value than knowing that it's native(123).

'''Wormbo:''' Ok, how about putting really important stuff (final, static, etc.) in brackets behind the function definition? &lt;br /&gt;HurtRadius (float DamageAmount, float DamageRadius, name DamageName, float Momentum, vector HitLocation) [final]

'''Mychaeel:'''  I could live with that.  :-)

'''Wormbo:''' How's that?

'''Mychaeel:'''  Much tidier :-)

'''Hugh:''' I've just made a change to the SetTimer() description - I think I'm right, but can someone confirm?

'''Zedsquared:''' Looks good but has anyone experimented to see what happens if timer() takes longer than TimerRate to execute? do you get another event fired or will it wait?

'''Mychaeel:'''  Since UnrealScript code doesn't execute in parallel and lengthy execution of code in Timer blocks everything else, the engine will simply fire the next timer event in the next tick.

'''BesigedB:'''  Tick, tock, tick, tock.

'''Highlander:''' I guess this is a Trace related question, ive noticed that when a trace() hits terrain the HitLocation points towards the TerrainInfo actor ?? Am i correct or am i loosing my mind?

'''Claw:''' Hmm, are you certain it's the HitLocation? I experienced something similar in UT; when a Trace hit the Level, the HitActor would be the LevelInfo (maybe ZoneInfo if one existed, I never checked). Maybe your code uses HitActor.Location?

'''Highlander:''' Positive, it doesnt matter as i found a way around the particular problem that uses less traces. It does return the TerrainInfo as the actor however, the vsize of the hitlocation was 3000units + in my tests. (The trace was 128 units long) and i was approximately 3000 units from the center of the map where the terrain info was.

'''Foxpaw:''' Hitlocation is relative to the center of the world, as far as I know... I think that the terraininfo and center of the map just coincided. Can someone confirm this? I've noticed that in UT2003 instantfire weapons scratch the hitlocation and replace it with the end of the trace instead of the point where the trace actually impacted the map, that seems silly but I expect it's done that way for a reason.

'''Claw:''' Strange, when I just tested it again with the newest patch, the HitLocation definitely wasn't the HitActor's Location. It wasn't the correct spot either. But I verified the error is linked to the position where the trace starts. From the center of the map Trace works allright.

'''Foxpaw:''' HitLocation isn't usually the location of the actor you hit, but instead the point upon that objects collision sphere/cylinder/whatever. I'm not sure why your traces would not be returning the correct location for hitlocation when you hit the world - it works fine for me.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Lighting</title>
    <id>395</id>
    <revision>
      <id>1323</id>
      <timestamp>2003-10-31T21:03:41Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <minor/>
      <comment>tidied</comment>
      <text xml:space="preserve">Any actor can be made to give off light by setting these properties. For example, it's often useful when testing Triggers to make them cast a small circle of light so you know where to walk to activate them.

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.
;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 
 

==Lighting ==
;bActorShadows: Unused.
;bCorona: Adds a corona to the light (the effect that is often called a &quot;lens flare&quot;, incorrectly). A texture needs to be set under '''Display -&gt; Skin'''. See [[Legacy:Corona|Corona]] for full instructions.
;bLensFlare: Unused.
;bSpecialLit: Light only affect walls and items with the Special Lit true.  See [[Legacy:Special Lit|Special Lit]] for more information.
;LightCone: Changes the size of the lightbeam in specific lights such as the spotlight.
;LightEffect: Adds an animation to the light. (Further down for specs.). 
;LightPeriod: Sets speed of selected LightType and/or LightEffect. 
;LightPhase: Start of light animation cycle. 
;LightRadius: Radius of the light. 
;LightType: What kind of light (Further down for specs.). 
;VolumeBright: When in a FogZone, used to set how bright the fog around the light source is.
;VolumeFog: When in a FogZone, sets how thick the fog is around the light.
;VolumeRadius: When in a Fogzone, sets the distance in which the light casts fog.

: ''question: should the following sets of options be on a page of their own?''  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

===LightEffect===

Light effects are animated shapes that affect surfaces within its radius.

;TorchWaver: Makes the light shimmer a little, ideal when used in conjunction with animated flames (such as in the GreatFire texture package).

;FireWaver: As the TorchWaver but more &quot;drastic&quot;. Best when used with large-scale flame animations.

;WateryShimmer: Also like the TorchWaver but more wave and glimmer feel. Best if used with water animated textures.

;SearchLight: A rotating spotlight (Adjust speed with LightPeriod). 

;SlowWave: A wave that starts from the middle and flows out. 

;FastWave: As SlowWave but at a faster rate. 

;Shock: A small pulsating light, fast up and slowly down. 

[[Image:Legacy_light.disco.gif|right|Light Effect: Disco]]
;Disco: Think disco ball rotating glittering light specs.

;Spotlight: Simply a spotlight (set bDirectional). 

[[Image:Legacy_light.nonincidence.gif|right|Light Effect: Non-Incidence]]
;NonIncidence: Makes the light stronger and reduce the amount of shadow umbra.

[[Image:Legacy_light.shell.gif|right|Light Effect: Shell]]
;Shell Only: lights the actual LightRadius (a hollow sphere). 

;OmniBumpMap: This a light that only light up actors (players) and not the geometry. 

[[Image:Legacy_light.interference.gif|right|Light Effect: Interference]]
;Interference: Light waves that goes from bottom to the top. 

[[Image:Legacy_light.cylinder.gif|right|Light Effect: Cylinder]]
;Cylinder: Creates a light cylinder instead of a standard sphere.

;Rotor: Like Interference but moves sideways instead, like a fan. 

;Unused: It's a unused space in the editor that does nothing, same effect as far as I can tell as none.

===LightTypes===

Light types affect the brightness and darkness values of a lights' lighteffect.

;None: No light is cast. 

[[Image:Legacy_light.steady.gif|right|Light Type: Steady]]
;Steady: The light is is constant; it does not animate.  Default setting.  Note that the light quickly fades to into the shadow umbra.

;Pulse: A &quot;heavily&quot; pulsating light. 

;Blink: Randomly turns light off for a split second. 

;Flicker: Randomly turns light on/off at random intervals. 

;Strobe: Fast switching between light on and off. 

;SubtlePulse: As Pulse but less &quot;deep&quot;. 

;TexturePaletteOnce: The light colour will cycle once through the texture palette selected for ''Skin''.

;TexturePaletteLoop: As TexturePaletteOnce but loops. The value of ''LightPeriod'' sets the speed. For an example of this effect, look at the neon lights that glow blue to white in UT's DM-Phobos. There are texture palettes suitable for this effect in the GenFX.utx texture package.

'''GRAF1K:''' What I've done isn't exactly fine art, but a bit better I think. :)

'''Tarquin:''' I think rev.32 is best. The images are each captioned, so there's no confusion. I much prefer a DL to a table for this sort of thing. If you guys think the images still don't work, then let's taken them out of the DL entirely and make a gallery page or something.

'''Sobiwan:''' I could always downsize the images; that would help keep it all together more so than it is now.

'''Tarquin:''' I persoanlyl think it's fine as it is now :)

==Miscellaneous ==

Other actor properties that are relevant to casting light:

;Advanced -&gt; bDirectional: Shows a directional arrow on an actor in UnrealEd. This allows rotation to be set with the mouse as well as in the [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties. [[Legacy:Spotlight|Spotlight]]s have this set to true by default. 
;Display -&gt; DrawScale: Affects light actor size in editor and size of a [[Legacy:Corona|corona]] in game.
;Display -&gt; Skin: The texture used for a lens flare and TexturePaletteOnce/Loop effect.

==Related Topics ==
* [[Legacy:Lighting|Lighting]] is the hub for all things light
* Understand [[Legacy:Lighting Basics|Lighting Basics]]
* Understand all things [[Legacy:Actor Overview|Actor Overview]] 
* Understand the [[Legacy:Light (UT)|Light (UT)]] class 
* Understanding is half the battle!  :)</text>
    </revision>
    <revision>
      <id>1324</id>
      <timestamp>2003-10-31T10:58:59Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>I could always downsize the images</comment>
      <text xml:space="preserve">Any actor can be made to give off light by setting these properties. For example, it's often useful when testing Triggers to make them cast a small circle of light so you know where to walk to activate them.

See also:
* the [[Legacy:Light (UT)|Light (UT)]] class for information on other properties relevant to lighting and subclasses
* the [[Legacy:Lighting Basics|Lighting Basics]] tutorial
* the main [[Legacy:Lighting|Lighting]] page for all topics on lighting

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.
;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 
 

==Lighting ==
;bActorShadows: Unused.
;bCorona: Adds a corona to the light (the effect that is often called a &quot;lens flare&quot;, incorrectly). A texture needs to be set under '''Display -&gt; Skin'''. See [[Legacy:Corona|Corona]] for full instructions.
;bLensFlare: Unused.
;bSpecialLit: Light only affect walls and items with the Special Lit true.  See [[Legacy:Special Lit|Special Lit]] for more information.
;LightCone: Changes the size of the lightbeam in specific lights such as the spotlight.
;LightEffect: Adds an animation to the light. (Further down for specs.). 
;LightPeriod: Sets speed of selected LightType and/or LightEffect. 
;LightPhase: Start of light animation cycle. 
;LightRadius: Radius of the light. 
;LightType: What kind of light (Further down for specs.). 
;VolumeBright: When in a FogZone, used to set how bright the fog around the light source is.
;VolumeFog: When in a FogZone, sets how thick the fog is around the light.
;VolumeRadius: When in a Fogzone, sets the distance in which the light casts fog.

: ''question: should the following sets of options be on a page of their own?''  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

===LightEffect===

Light effects are animated shapes that affect surfaces within its radius.

;TorchWaver: Makes the light shimmer a little, ideal when used in conjunction with animated flames (such as in the GreatFire texture package).

;FireWaver: As the TorchWaver but more &quot;drastic&quot;. Best when used with large-scale flame animations.

;WateryShimmer: Also like the TorchWaver but more wave and glimmer feel. Best if used with water animated textures.

;SearchLight: A rotating spotlight (Adjust speed with LightPeriod). 

;SlowWave: A wave that starts from the middle and flows out. 

;FastWave: As SlowWave but at a faster rate. 

;Shock: A small pulsating light, fast up and slowly down. 

[[Image:Legacy_light.disco.gif|right|Light Effect: Disco]]
;Disco: Think disco ball rotating glittering light specs.

;Spotlight: Simply a spotlight (set bDirectional). 

[[Image:Legacy_light.nonincidence.gif|right|Light Effect: Non-Incidence]]
;NonIncidence: Makes the light stronger and reduce the amount of shadow umbra.

[[Image:Legacy_light.shell.gif|right|Light Effect: Shell]]
;Shell Only: lights the actual LightRadius (a hollow sphere). 

;OmniBumpMap: This a light that only light up actors (players) and not the geometry. 

[[Image:Legacy_light.interference.gif|right|Light Effect: Interference]]
;Interference: Light waves that goes from bottom to the top. 

[[Image:Legacy_light.cylinder.gif|right|Light Effect: Cylinder]]
;Cylinder: Creates a light cylinder instead of a standard sphere.

;Rotor: Like Interference but moves sideways instead, like a fan. 

;Unused: It's a unused space in the editor that does nothing, same effect as far as I can tell as none.

===LightTypes===

Light types affect the brightness and darkness values of a lights' lighteffect.

;None: No light is cast. 

[[Image:Legacy_light.steady.gif|right|Light Type: Steady]]
;Steady: The light is is constant; it does not animate.  Default setting.  Note that the light quickly fades to into the shadow umbra.

;Pulse: A &quot;heavily&quot; pulsating light. 

;Blink: Randomly turns light off for a split second. 

;Flicker: Randomly turns light on/off at random intervals. 

;Strobe: Fast switching between light on and off. 

;SubtlePulse: As Pulse but less &quot;deep&quot;. 

;TexturePaletteOnce: The light colour will cycle once through the texture palette selected for ''Skin''.

;TexturePaletteLoop: As TexturePaletteOnce but loops. The value of ''LightPeriod'' sets the speed. For an example of this effect, look at the neon lights that glow blue to white in UT's DM-Phobos. There are texture palettes suitable for this effect in the GenFX.utx texture package.

'''Sobiwan:''' Is this table better... or worse for readibility?

'''Tarquin:''' The table is a bit yuck :(

'''Sobiwan:''' Let's go back to Revision 32 then

'''GRAF1K:''' Let's not. The images are ambigous as to their text conterparts in that revision.

'''GRAF1K:''' What I've done isn't exactly fine art, but a bit better I think. :)

'''Tarquin:''' I think rev.32 is best. The images are each captioned, so there's no confusion. I much prefer a DL to a table for this sort of thing. If you guys think the images still don't work, then let's taken them out of the DL entirely and make a gallery page or something.

'''Sobiwan:''' I could always downsize the images; that would help keep it all together more so than it is now.

==Miscellaneous ==

Other actor properties that are relevant to casting light:

;Advanced -&gt; bDirectional: Shows a directional arrow on an actor in UnrealEd. This allows rotation to be set with the mouse as well as in the [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties. [[Legacy:Spotlight|Spotlight]]s have this set to true by default. 
;Display -&gt; DrawScale: Affects light actor size in editor and size of a [[Legacy:Corona|corona]] in game.
;Display -&gt; Skin: The texture used for a lens flare and TexturePaletteOnce/Loop effect.

As we get tutorials on using some of these options, remember to add relevant links on this page too.
 

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
    <revision>
      <id>1325</id>
      <timestamp>2003-10-31T11:07:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Any actor can be made to give off light by setting these properties. For example, it's often useful when testing Triggers to make them cast a small circle of light so you know where to walk to activate them.

See also:
* the [[Legacy:Light (UT)|Light (UT)]] class for information on other properties relevant to lighting and subclasses
* the [[Legacy:Lighting Basics|Lighting Basics]] tutorial
* the main [[Legacy:Lighting|Lighting]] page for all topics on lighting

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.
;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 
 

==Lighting ==
;bActorShadows: Unused.
;bCorona: Adds a corona to the light (the effect that is often called a &quot;lens flare&quot;, incorrectly). A texture needs to be set under '''Display -&gt; Skin'''. See [[Legacy:Corona|Corona]] for full instructions.
;bLensFlare: Unused.
;bSpecialLit: Light only affect walls and items with the Special Lit true.  See [[Legacy:Special Lit|Special Lit]] for more information.
;LightCone: Changes the size of the lightbeam in specific lights such as the spotlight.
;LightEffect: Adds an animation to the light. (Further down for specs.). 
;LightPeriod: Sets speed of selected LightType and/or LightEffect. 
;LightPhase: Start of light animation cycle. 
;LightRadius: Radius of the light. 
;LightType: What kind of light (Further down for specs.). 
;VolumeBright: When in a FogZone, used to set how bright the fog around the light source is.
;VolumeFog: When in a FogZone, sets how thick the fog is around the light.
;VolumeRadius: When in a Fogzone, sets the distance in which the light casts fog.

: ''question: should the following sets of options be on a page of their own?''  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

===LightEffect===

Light effects are animated shapes that affect surfaces within its radius.

;TorchWaver: Makes the light shimmer a little, ideal when used in conjunction with animated flames (such as in the GreatFire texture package).

;FireWaver: As the TorchWaver but more &quot;drastic&quot;. Best when used with large-scale flame animations.

;WateryShimmer: Also like the TorchWaver but more wave and glimmer feel. Best if used with water animated textures.

;SearchLight: A rotating spotlight (Adjust speed with LightPeriod). 

;SlowWave: A wave that starts from the middle and flows out. 

;FastWave: As SlowWave but at a faster rate. 

;Shock: A small pulsating light, fast up and slowly down. 

[[Image:Legacy_light.disco.gif|right|Light Effect: Disco]]
;Disco: Think disco ball rotating glittering light specs.

;Spotlight: Simply a spotlight (set bDirectional). 

[[Image:Legacy_light.nonincidence.gif|right|Light Effect: Non-Incidence]]
;NonIncidence: Makes the light stronger and reduce the amount of shadow umbra.

[[Image:Legacy_light.shell.gif|right|Light Effect: Shell]]
;Shell Only: lights the actual LightRadius (a hollow sphere). 

;OmniBumpMap: This a light that only light up actors (players) and not the geometry. 

[[Image:Legacy_light.interference.gif|right|Light Effect: Interference]]
;Interference: Light waves that goes from bottom to the top. 

[[Image:Legacy_light.cylinder.gif|right|Light Effect: Cylinder]]
;Cylinder: Creates a light cylinder instead of a standard sphere.

;Rotor: Like Interference but moves sideways instead, like a fan. 

;Unused: It's a unused space in the editor that does nothing, same effect as far as I can tell as none.

===LightTypes===

Light types affect the brightness and darkness values of a lights' lighteffect.

;None: No light is cast. 

[[Image:Legacy_light.steady.gif|right|Light Type: Steady]]
;Steady: The light is is constant; it does not animate.  Default setting.  Note that the light quickly fades to into the shadow umbra.

;Pulse: A &quot;heavily&quot; pulsating light. 

;Blink: Randomly turns light off for a split second. 

;Flicker: Randomly turns light on/off at random intervals. 

;Strobe: Fast switching between light on and off. 

;SubtlePulse: As Pulse but less &quot;deep&quot;. 

;TexturePaletteOnce: The light colour will cycle once through the texture palette selected for ''Skin''.

;TexturePaletteLoop: As TexturePaletteOnce but loops. The value of ''LightPeriod'' sets the speed. For an example of this effect, look at the neon lights that glow blue to white in UT's DM-Phobos. There are texture palettes suitable for this effect in the GenFX.utx texture package.

'''Sobiwan:''' Is this table better... or worse for readibility?

'''Tarquin:''' The table is a bit yuck :(

'''Sobiwan:''' Let's go back to Revision 32 then

'''GRAF1K:''' Let's not. The images are ambigous as to their text conterparts in that revision.

'''GRAF1K:''' What I've done isn't exactly fine art, but a bit better I think. :)

'''Tarquin:''' I think rev.32 is best. The images are each captioned, so there's no confusion. I much prefer a DL to a table for this sort of thing. If you guys think the images still don't work, then let's taken them out of the DL entirely and make a gallery page or something.

'''Sobiwan:''' I could always downsize the images; that would help keep it all together more so than it is now.

'''Tarquin:''' I persoanlyl think it's fine as it is now :)

==Miscellaneous ==

Other actor properties that are relevant to casting light:

;Advanced -&gt; bDirectional: Shows a directional arrow on an actor in UnrealEd. This allows rotation to be set with the mouse as well as in the [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties. [[Legacy:Spotlight|Spotlight]]s have this set to true by default. 
;Display -&gt; DrawScale: Affects light actor size in editor and size of a [[Legacy:Corona|corona]] in game.
;Display -&gt; Skin: The texture used for a lens flare and TexturePaletteOnce/Loop effect.

As we get tutorials on using some of these options, remember to add relevant links on this page too.
 

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Movement</title>
    <id>396</id>
    <revision>
      <id>1326</id>
      <timestamp>2003-10-04T10:02:37Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>updated description from ut2003</comment>
      <text xml:space="preserve">Properties that relate to location, orientation and movement.

; AttachTag : see [[Legacy:Attaching Actors|Attaching Actors]]
; bBounce : Bounces when hits ground fast
; bFixedRotationDir : Fixed direction of rotation
; bRotateToDesired : Rotate to DesiredRotation
; Buoyancy : Water buoyancy  ''define values''
; DesiredRotation : Physics will smoothly rotate actor to this rotation if bRotateToDesired.
; Location : a [[Legacy:Vector|vector]] giving the position of the actor in the world. Remember when setting this that the engine uses a left-handed coordinate system (see [[Wikipedia:Handedness]] for definition &amp; pictures).
; Mass : Mass of this actor.  ''define values''
; Physics : see [[Legacy:PhysicsType|PhysicsType]] for the list
; Rotation : see below.
; RotationRate : Change in rotation per second.
; Velocity : Actor's velocity.

==Rotation==

Rotations are measured in unreal rotation units. A right angle is 16384.

Note that an actor's rotation can be set graphically: Setting Advanced -&gt; bDirectional to True will cause UnrealEd to display a direction arrow on the actor. It is then possible to [[Legacy:Brush Rotate|rotate]] it the same way as a brush.

Quick definition of the rotation angles. Imagine you are standing at the origin, facing the positive X axis.
; Pitch : Tilting forward or backward, dipping on the X axis.
; Roll  : Wobbling from side to side, dipping on the Y axis.
; Yaw   : Turning from left to right.

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
    <revision>
      <id>1327</id>
      <timestamp>2003-01-27T17:47:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Properties that relate to location, orientation and movement.

; AttachTag : see [[Legacy:Attaching Actors|Attaching Actors]]
; bBounce : 
; bFixedRotationDir : 
; bRotateToDesired : 
; Buoyancy : 
; DesiredRotation : 
; Location : a [[Legacy:Vector|vector]] giving the position of the actor in the world. Remember when setting this that the engine uses a left-handed coordinate system (see [[Wikipedia:Handedness]] for definition &amp; pictures).
; Mass : 
; Physics : see [[Legacy:PhysicsType|PhysicsType]] for the list
; Rotation : see below.
; RotationRate : Change in rotation per second.
; Velocity : 

==Rotation ==

Rotations are measured in unreal rotation units. A right angle is 16384.

Note that an actor's rotation can be set graphically: Setting Advanced -&gt; bDirectional to True will cause UnrealEd to display a direction arrow on the actor. It is then possible to [[Legacy:Brush Rotate|rotate]] it the same way as a brush.

Quick definition of the rotation angles. Imagine you are standing at the origin, facing the positive X axis.
; Pitch : Tilting forward or backward, dipping on the X axis.
; Roll  : Wobbling from side to side, dipping on the Y axis.
; Yaw   : Turning from left to right.

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Object</title>
    <id>397</id>
    <revision>
      <id>1328</id>
      <timestamp>2002-04-24T10:16:43Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>rearranging stuff</comment>
      <text xml:space="preserve">==Properties ==
; Name and Class : These are defined in the [[Legacy:Object|Object]] class script, so all objects have these properties not just actors. These can't be edited in UnrealEd.
; InitialState : The initial state the actor will be in when the game starts. See below.
; Group: This is used by UnrealEd to keep track of which view group an actor belongs to. This probably shouldn't be edited; UnrealEd will change it to reflect the list in the [[Legacy:Group|Group]] browser.

==Initial States ==

UnrealScript's states allow different types of behaviour. The same function may be present in several states and the appropriate one will be called. The classic example: an actor such as a monster could have states &quot;wandering&quot; and &quot;attacking&quot;, and in these states the function SeePlayer() will have a completely different effect. (see [[Legacy:State|state]] for more on scripting states)

The InitialState property contains a list of states that are made available to mappers. This sets which state the actor will be in when the game begins.

This property is not always relevant: not all actors have states which can be chosen in this list. Of those actors that do, some such as [[Legacy:Trigger|Trigger]] and [[Legacy:SpecialEvent|SpecialEvent]] have states but don't switch between them at all during play. This programming strategy essentially allows the one class to offer several ways of behaving &amp;ndash; several classes for the price of one.

Quick link for now: [[Legacy:InitialState|InitialState]] covers this topic (or will) for mappers. [[Legacy:State|State]] is aimed at coders.</text>
    </revision>
    <revision>
      <id>1329</id>
      <timestamp>2002-04-22T04:26:48Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <comment>This page marked for deletion</comment>
      <text xml:space="preserve">This page marked for deletion</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Properties</title>
    <id>398</id>
    <revision>
      <id>1330</id>
      <timestamp>2002-11-09T13:27:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor_(UT)|Actor_(UT)]]</text>
    </revision>
    <revision>
      <id>1331</id>
      <timestamp>2002-04-22T03:02:33Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor|Actor]]</text>
    </revision>
    <revision>
      <id>1332</id>
      <timestamp>2002-11-09T12:51:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>this has to be filled with real information</comment>
      <text xml:space="preserve">==Collision==

==Movement==

==erm...==

'''Wormbo:''' Why did this page only redirect to [[Legacy:Actor|Actor]] anyway? More important: Where are the UT Actor properties?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Sound</title>
    <id>399</id>
    <revision>
      <id>1333</id>
      <timestamp>2006-08-14T08:08:53Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <minor/>
      <comment>typo</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]] (Property group: Sound)}}

Properties for emitting sound.

Note: Don't set this for [[Legacy:Mover|Mover]]. It only works until the mover moves, then the script overwrites with MoverSounds -&gt; MoveAmbientSound   and then &quot;none&quot; after moving.

;AmbientSound :  Ambient sound effect. Note: some actors will override this, eg Movers set this property for the sound they play during movement (please supply the name) &amp;ndash; be careful. (Does this still apply to ut2003? if so, copy tis to the equivalent ut2003 page)

Ambient sound
;SoundRadius :  Radius of ambient sound. When a viewport in UnrealEd is set to radii view, a blue circle will surround the actor when there is something in the AmbientSound field.  Within this radius, the sound in the AmbientSound field can be heard.
;SoundVolume :  Volume of ambient sound. Ranges from 0 to 255.  255 is maximum volume.
;SoundPitch :  Sound pitch shift, 64.0=none.

Regular sounds.  (Used for actors that emit dynamic sounds such as [[Legacy:SpecialEvent|SpecialEvent]]s and [[Legacy:Mover|Mover]]s.)

; TransientSoundVolume : Multiplier of the default volume of the dynamic sound. Range is 0.000 to 1.000.&lt;br /&gt;For example, the default volume of a [[Legacy:SpecialEvent|SpecialEvent]] is maximum: 255.  A multiplier above 1.000 will not increase volume, but a multiplier less than 1.000 will decrease volume.

;TransientSoundRadius: Number of [[Legacy:UU|UU]]s in which the dynamic sound can be heard.  Outside of this radius, the sound will not be heard.</text>
    </revision>
    <revision>
      <id>1334</id>
      <timestamp>2003-10-24T23:44:31Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <minor/>
      <comment>clarified transientsoundvolume</comment>
      <text xml:space="preserve">Properties for emitting sound.

Note: don't set this for [[Legacy:Mover|Mover]]. It only works until the mover moves, then the script overwrites with MoverSounds -&gt; MoveAmbientSound   and then &quot;none&quot; after moving.

;AmbientSound :  Ambient sound effect. Note: some actors will override this, eg Movers set this property for the sound they play during movement (please suplpy the name) &amp;ndash; be careful. (Does this still apply to ut2003? if so, copy tis to the equivalent ut2003 page)

Ambient sound
;SoundRadius :  Radius of ambient sound. When a viewport in UnrealEd is set to radii view, a blue circle will surround the actor when there is something in the AmbientSound field.  Within this radius, the sound in the AmbientSound field can be heard.
;SoundVolume :  Volume of ambient sound. Ranges from 0 to 255.  255 is maximum volume.
;SoundPitch :  Sound pitch shift, 64.0=none.

Regular sounds.  (Used for actors that emit dynamic sounds such as [[Legacy:SpecialEvent|SpecialEvent]]s and [[Legacy:Mover|Mover]]s.)

;TransientSoundVolume: 
Multiplier of the default volume of the dynamic sound. Range is 0.000 to 1.000.  

For example, the default volume of a [[Legacy:SpecialEvent|SpecialEvent]] is maximum: 255.  A multiplier above 1.000 will not increase volume, but a multiplier less than 1.000 will decrease volume.


;TransientSoundRadius: Number of [[Legacy:UU|UU]]s in which the dynamic sound can be heard.  Outside of this radius, the sound will not be heard.</text>
    </revision>
    <revision>
      <id>1335</id>
      <timestamp>2004-09-02T20:26:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]] (Property group: Sound)}}

Properties for emitting sound.

Note: Don't set this for [[Legacy:Mover|Mover]]. It only works until the mover moves, then the script overwrites with MoverSounds -&gt; MoveAmbientSound   and then &quot;none&quot; after moving.

;AmbientSound :  Ambient sound effect. Note: some actors will override this, eg Movers set this property for the sound they play during movement (please suplpy the name) &amp;ndash; be careful. (Does this still apply to ut2003? if so, copy tis to the equivalent ut2003 page)

Ambient sound
;SoundRadius :  Radius of ambient sound. When a viewport in UnrealEd is set to radii view, a blue circle will surround the actor when there is something in the AmbientSound field.  Within this radius, the sound in the AmbientSound field can be heard.
;SoundVolume :  Volume of ambient sound. Ranges from 0 to 255.  255 is maximum volume.
;SoundPitch :  Sound pitch shift, 64.0=none.

Regular sounds.  (Used for actors that emit dynamic sounds such as [[Legacy:SpecialEvent|SpecialEvent]]s and [[Legacy:Mover|Mover]]s.)

; TransientSoundVolume : Multiplier of the default volume of the dynamic sound. Range is 0.000 to 1.000.&lt;br /&gt;For example, the default volume of a [[Legacy:SpecialEvent|SpecialEvent]] is maximum: 255.  A multiplier above 1.000 will not increase volume, but a multiplier less than 1.000 will decrease volume.

;TransientSoundRadius: Number of [[Legacy:UU|UU]]s in which the dynamic sound can be heard.  Outside of this radius, the sound will not be heard.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT)/Talk</title>
    <id>400</id>
    <revision>
      <id>1336</id>
      <timestamp>2002-04-24T07:12:09Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====subpages ====
:The principal groups in the Properties window are not &quot;Actor Properties&quot; as in &quot;properties of all actors&quot;, they are properties of the class &quot;Actor&quot; which get inherited by all subclasses. This is why they were subpages of &quot;Actor&quot;. I realise this is coder mumbo-jumbo and may be confusing to the mapper, and in fact is really of no interest to the mapper, who just wants to look up what the properties mean.
: I'll try and think of a way that uses logical page-names, but is also clear to non-coders.

====&quot;actor classes&quot; etc ====
: &quot;Actor Classes&quot; was, I think, originally meant to cover the browser window itself (details about saving stuff, importing, etc). I used that name because (I think) that's what its title bar says in UnrealEd, although in saying that I'm wide open for shooting because of &quot;Surface Properties Window&quot;.... urg.... Likewise, it's probably that if I made an &quot;Actor Properties&quot; link it was meant to cover usage of that window itself, explain how it works, etc.  &amp;ndash; ''Tarquin''
: &lt;i&gt;If a title has multiple logical subjects, I'm all for turning it into a summary page with links to the various subjects&lt;/i&gt; &amp;ndash; ''Aedis''

----

''Tarquin'': OK, here's what I suggest:

* We put the property subpages back under Actor, as technically they do belong there.
* Change &quot;Actor/Working with Actors&quot; to &quot;Actors Overview&quot; so it shows up in the search list nicely.
* On this &quot;Actors Overview&quot; page, we put a list of all the property groups, and comment them, eg
** &quot;Display: these properties relate to blah blah&quot;  (&lt;i&gt;Makes sense to me!&lt;/i&gt; &amp;ndash; ''Aedis'')
* Link back to &quot;Actors Overview&quot; from all the properties subpages.
* Net result: we get the Actor tech spec page and the &quot;Actor Overview&quot; page that's more mapper- and n00b-oriented, both effectively working in parallel.

''Mychaeel:''  That sounds reasonable to me.
: &lt;i&gt;Indeed I am confused by the above logic, but that doesn't bother me.  It sounds like there are different schools of thought at work here.  One method is to organize according to topic.  Another method is to organize according to Unreal conventions.  I personally prefer topical organization, because it serves the material and the learner as opposed to the tool that is being taught.  For example, Tarquin's statement above, &quot;as technically they do belong there&quot; sounds focused on emulating the structure of UnrealScript instead of being focused on what is most useful to a novice.  Of course, links are only links &amp;ndash; the way info is organized on the pages has a much larger impact on the reader.&lt;/i&gt; - ''Aedis''
: Topical organization is best. The reason we want subpages for the properties is that, to match all the other class technical pages, they should ALL be on the page &quot;Actor&quot;. Clearly, that's too much, so we're following a convention that excessively long pages can get chopped into subpages.
: The site's organization isn't created by page names, it's created by links. If we have a page &quot;Actor Overview&quot;, that's likely to be where novices go if they see it in search results. We can also give it prominence in topic pages. I've just realised I don't know which topic page should get a link to &quot;Actor Overview&quot;. Hmmm... I really think we should resurrect [[Legacy:Beginner Topics|Beginner Topics]]. Anyway, I'm off to make the above changes. I'll spread links to AO liberally. :-)  &amp;ndash; ''Tarquin''</text>
    </revision>
    <revision>
      <id>1337</id>
      <timestamp>2002-04-24T02:35:49Z</timestamp>
      <contributor>
        <ip>C-24-245-44-228.mn.client2.attbi.com</ip>
      </contributor>
      <minor/>
      <comment>discussion</comment>
      <text xml:space="preserve">====subpages ====
:The principal groups in the Properties window are not &quot;Actor Properties&quot; as in &quot;properties of all actors&quot;, they are properties of the class &quot;Actor&quot; which get inherited by all subclasses. This is why they were subpages of &quot;Actor&quot;. I realise this is coder mumbo-jumbo and may be confusing to the mapper, and in fact is really of no interest to the mapper, who just wants to look up what the properties mean.
: I'll try and think of a way that uses logical page-names, but is also clear to non-coders.

====&quot;actor classes&quot; etc ====
: &quot;Actor Classes&quot; was, I think, originally meant to cover the browser window itself (details about saving stuff, importing, etc). I used that name because (I think) that's what its title bar says in UnrealEd, although in saying that I'm wide open for shooting because of &quot;Surface Properties Window&quot;.... urg.... Likewise, it's probably that if I made an &quot;Actor Properties&quot; link it was meant to cover usage of that window itself, explain how it works, etc.  &amp;ndash; ''Tarquin''
: &lt;i&gt;If a title has multiple logical subjects, I'm all for turning it into a summary page with links to the various subjects&lt;/i&gt; &amp;ndash; ''Aedis''

----

''Tarquin'': OK, here's what I suggest:

* We put the property subpages back under Actor, as technically they do belong there.
* Change &quot;Actor/Working with Actors&quot; to &quot;Actors Overview&quot; so it shows up in the search list nicely.
* On this &quot;Actors Overview&quot; page, we put a list of all the property groups, and comment them, eg
** &quot;Display: these properties relate to blah blah&quot;  (&lt;i&gt;Makes sense to me!&lt;/i&gt; &amp;ndash; ''Aedis'')
* Link back to &quot;Actors Overview&quot; from all the properties subpages.
* Net result: we get the Actor tech spec page and the &quot;Actor Overview&quot; page that's more mapper- and n00b-oriented, both effectively working in parallel.

''Mychaeel:''  That sounds reasonable to me.
: &lt;i&gt;Indeed I am confused by the above logic, but that doesn't bother me.  It sounds like there are different schools of thought at work here.  One method is to organize according to topic.  Another method is to organize according to Unreal conventions.  I personally prefer topical organization, because it serves the material and the learner as opposed to the tool that is being taught.  For example, Tarquin's statement above, &quot;as technically they do belong there&quot; sounds focused on emulating the structure of UnrealScript instead of being focused on what is most useful to a novice.  Of course, links are only links &amp;ndash; the way info is organized on the pages has a much larger impact on the reader.&lt;/i&gt; - ''Aedis''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor (UT3)</title>
    <id>28666</id>
    <revision>
      <id>40522</id>
      <timestamp>2010-01-14T09:05:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Browser</title>
    <id>347</id>
    <revision>
      <id>1209</id>
      <timestamp>2002-04-21T22:10:09Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <comment>created (redirect)</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Class Browser</title>
    <id>386</id>
    <revision>
      <id>1302</id>
      <timestamp>2004-03-18T21:43:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>two ideas what it might actually do</comment>
      <text xml:space="preserve">The '''Actor Class Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

The basics of working with actors are covered in [[Legacy:Actor Overview|Actor Overview]].

This browser displays a [[Legacy:Class Tree|class tree]] for the current game: the contents of the list vary among [[Legacy:Unreal Engine Versions|Unreal Engine versions]] and different games. The classes shown  initially are those in the [[Legacy:Package|package]]s UnrealEd has loaded on startup (set in the [[Legacy:Game Ini File|Game Ini File]]). Opening a package that contains classes adds them to the tree.

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|The Actor Classes Browser, with the toolbar button highlighted]]

==Opening ==

The Actor Class Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser
* Press the Actor Class Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like a chess pawn.

==Uses==
* Selecting a class to then [[Legacy:Add An Actor|Add an actor]] of this class to a map: anything from decorations (meshes), spawnpoints, inventory items to special effects and so on.
* Setting [[Legacy:Default Properties|default properties]] for classes.
* Export actors 
* Load up extra packages containing actors.

Once an Actor is selected you can add it to your map by doing [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;class&gt; here on the spot where you want the actor to be placed.

Note that there is a quick way to make a class current in this browser:
# find an actor on this class in your map
# Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Make Current

==Browser Toolbar Buttons ==

The Static Mesh Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* Open Package
* Save Selected Packages (Use the browser menu View -&gt; Show Packages to show all packages containing classes)
* New Script
* Edit Script
* Edit Default Properties

==Menu==

See [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]].

File -&gt; Export changed scripts &amp;ndash; does this actually work????

'''Wormbo:''' I think it exports scripts that have not yet been compiled. Or it exports scripts in packages that have not yet been saved.

==Related Topics ==
* Working with actors in general: [[Legacy:Actor Overview|Actor Overview]]
* Step by step tutorial: how to [[Legacy:Add An Actor|Add an Actor]]
* Other parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]:
** The UnrealEd [[Legacy:Toolbar|Toolbar]]
** Next resource browser: [[Legacy:Group Browser|Group Browser]] 
* Classes:
** [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] (all on one page)
** [[Legacy:Actor|Actor]] class (browse the tree page by page)

==Comments==

'''Tarquin:''' &quot;Export Changes Scripts&quot; &amp;ndash; which ones does that mean? A script changed &amp; recompiled wasn't saved, but one where I'd changed defaults was.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1303</id>
      <timestamp>2004-03-18T21:21:56Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>File -&gt; Export changed scripts -- does this actually work????</comment>
      <text xml:space="preserve">The '''Actor Class Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

The basics of working with actors are covered in [[Legacy:Actor Overview|Actor Overview]].

This browser displays a [[Legacy:Class Tree|class tree]] for the current game: the contents of the list vary among [[Legacy:Unreal Engine Versions|Unreal Engine versions]] and different games. The classes shown  initially are those in the [[Legacy:Package|package]]s UnrealEd has loaded on startup (set in the [[Legacy:Game Ini File|Game Ini File]]). Opening a package that contains classes adds them to the tree.

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|The Actor Classes Browser, with the toolbar button highlighted]]

==Opening ==

The Actor Class Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser
* Press the Actor Class Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like a chess pawn.

==Uses==
* Selecting a class to then [[Legacy:Add An Actor|Add an actor]] of this class to a map: anything from decorations (meshes), spawnpoints, inventory items to special effects and so on.
* Setting [[Legacy:Default Properties|default properties]] for classes.
* Export actors 
* Load up extra packages containing actors.

Once an Actor is selected you can add it to your map by doing [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;class&gt; here on the spot where you want the actor to be placed.

Note that there is a quick way to make a class current in this browser:
# find an actor on this class in your map
# Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Make Current

==Browser Toolbar Buttons ==

The Static Mesh Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* Open Package
* Save Selected Packages (Use the browser menu View -&gt; Show Packages to show all packages containing classes)
* New Script
* Edit Script
* Edit Default Properties

==Menu==

See [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]].

File -&gt; Export changed scripts &amp;ndash; does this actually work????

==Related Topics ==
* Working with actors in general: [[Legacy:Actor Overview|Actor Overview]]
* Step by step tutorial: how to [[Legacy:Add An Actor|Add an Actor]]
* Other parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]:
** The UnrealEd [[Legacy:Toolbar|Toolbar]]
** Next resource browser: [[Legacy:Group Browser|Group Browser]] 
* Classes:
** [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]] (all on one page)
** [[Legacy:Actor|Actor]] class (browse the tree page by page)

==Comments==

'''Tarquin:''' &quot;Export Changes Scripts&quot; &amp;ndash; which ones does that mean? A script changed &amp; recompiled wasn't saved, but one where I'd changed defaults was.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Class Hierarchy</title>
    <id>358</id>
    <revision>
      <id>1233</id>
      <timestamp>2007-05-19T11:05:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the [[Legacy:Class Tree|class tree]] extending from Actor in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]].  For a class tree of the GUI components see [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

==Adding new class pages ==

Any UT2003 class page should begin with the text:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; etc}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; etc}}

If you want to add information on a UT2003 class:

* Put a link here to the class you want to describe.
* If the link is taken by a Unreal Tournament class then, in that class:
* # Put a link to &quot;{classname} (UT)&quot;, substituting the current classname
* # Move all the text from the page to this new page.
* # Change the box at the top of the UT class to start with &quot;&lt;code&gt;[[Legacy:UT|UT]] ::&lt;/code&gt;&quot; for clarity.

Use the [[Legacy:Class Wikifier|Class Wikifier]] to create the basics of a wiki page from an [[Legacy:UnrealScript|UnrealScript]] class.

==Class Tree ==

You won't see all of these classes in the [[Legacy:Actor Classes Browser|Actor Classes Browser]] unless you uncheck &quot;Placeable Classes Only&quot;. And then you'll also only see the classes of the packages which are loaded. You can manually load *.u packages to add them to the class heirarchy

Key:
* &quot;&gt;&gt;&quot; means that class' subtree is expanded on the class page.
* Classes that exist only in UT2004 are labelled as such

 [[Legacy:Actor|Actor]]
   +- [[Legacy:AimedAttachment|AimedAttachment]]
   +- [[Legacy:Brush|Brush]]
   |    +- [[Legacy:Volume|Volume]] &gt;&gt;
   +- [[Legacy:Controller|Controller]]
   |    +- [[Legacy:AIController|AIController]]
   |    |    +- [[Legacy:ScriptedController|ScriptedController]]
   |    |         +- [[Legacy:Bot|Bot]]
   |    |              +- [[Legacy:XBot|xBot]]
   |    +- [[Legacy:PlayerController|PlayerController]]
   |         +- [[Legacy:Camera|Camera]]
   |         +- [[Legacy:MessagingSpectator|MessagingSpectator]]
   |         |    +- [[Legacy:DemoRecSpectator|DemoRecSpectator]]
   |         |    +- [[Legacy:UTServerAdminSpectator|UTServerAdminSpectator]]
   |         +- [[Legacy:UnrealPlayer|UnrealPlayer]]
   |              +- [[Legacy:CinematicPlayer|CinematicPlayer]]
   |              +- [[Legacy:XPlayer|xPlayer]]
   +- [[Legacy:DamageType|DamageType]] &gt;&gt;
   +- [[Legacy:Effects|Effects]]
   +- [[Legacy:Emitter|Emitter]]
   |    +- [[Legacy:NetworkEmitter|NetworkEmitter]] '''(UT2004 only)'''
   +- [[Legacy:Gib|Gib]]
   +- [[Legacy:HUD|HUD]] &gt;&gt;
   +- [[Legacy:Info|Info]]
   |    +- [[Legacy:Combo|Combo]]
   |    +- [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]
   |    +- [[Legacy:GameInfo|GameInfo]]
   |    |    +- [[Legacy:CinematicGame|CinematicGame]]
   |    |    +- [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]
   |    |         +- [[Legacy:DeathMatch|DeathMatch]]
   |    |              +- [[Legacy:TeamGame|TeamGame]]
   |    |              |    +- [[Legacy:CTFGame|CTFGame]]
   |    |              |    |    +- [[Legacy:XCTFGame|xCTFGame]]
   |    |              |    +- [[Legacy:XBombingRun|xBombingRun]]
   |    |              |    +- [[Legacy:XDoubleDom|xDoubleDom]]
   |    |              |    +- [[Legacy:XTeamGame|xTeamGame]]
   |    |              |         +- [[Legacy:ASGameInfo|ASGameInfo]] '''(UT2004 only)'''
   |    |              |         +- [[Legacy:Invasion|Invasion]] '''(UT2004 only)'''
   |    |              |         +- [[Legacy:ONSOnslaughtGame|ONSOnslaughtGame]] '''(UT2004 only)'''
   |    |              +- [[Legacy:XDeathMatch|xDeathMatch]]
   |    |                   +- [[Legacy:BossDM|BossDM]]
   |    +- [[Legacy:Mutator|Mutator]]
   +- [[Legacy:Inventory|Inventory]]
   |    +- [[Legacy:Ammunition|Ammunition]]
   |    |    +- [[Legacy:BallAmmo|BallAmmo]]
   |    |    +- [[Legacy:BioAmmo|BioAmmo]]
   |    |    +- [[Legacy:FlakAmmo|FlakAmmo]]
   |    |    +- [[Legacy:GrenadeAmmo|GrenadeAmmo]]
   |    |    +- [[Legacy:LinkAmmo|LinkAmmo]]
   |    |    +- [[Legacy:MinigunAmmo|MinigunAmmo]]
   |    |    +- [[Legacy:RedeemerAmmo|RedeemerAmmo]]
   |    |    +- [[Legacy:RocketAmmo|RocketAmmo]]
   |    |    +- [[Legacy:ShieldAmmo|ShieldAmmo]]
   |    |    +- [[Legacy:ShockAmmo|ShockAmmo]]
   |    |    |    +- [[Legacy:SuperShockAmmo|SuperShockAmmo]]
   |    |    +- [[Legacy:SniperAmmo|SniperAmmo]]
   |    |    +- [[Legacy:TransAmmo|TransAmmo]]
   |    +- [[Legacy:KeyInventory|KeyInventory]]
   |    +- [[Legacy:Powerups|Powerups]]
   |    |    +- [[Legacy:Armor|Armor]]
   |    +- [[Legacy:Weapon|Weapon]]
   |         +- [[Legacy:AssaultRifle|AssaultRifle]]
   |         +- [[Legacy:BallLauncher|BallLauncher]]
   |         +- [[Legacy:BioRifle|BioRifle]]
   |         +- [[Legacy:FlakCannon|FlakCannon]]
   |         +- [[Legacy:LinkGun|LinkGun]]
   |         +- [[Legacy:Minigun|Minigun]]
   |         +- [[Legacy:Painter|Painter]]
   |         +- [[Legacy:Redeemer|Redeemer]]
   |         +- [[Legacy:RocketLauncher|RocketLauncher]]
   |         +- [[Legacy:ShieldGun|ShieldGun]]
   |         +- [[Legacy:ShockRifle|ShockRifle]]
   |         |    +- [[Legacy:SuperShockRifle|SuperShockRifle]]
   |         |         +- [[Legacy:ZoomSuperShockRifle|ZoomSuperShockRifle]]
   |         +- [[Legacy:SniperRifle|SniperRifle]]
   |         +- [[Legacy:TransLauncher|TransLauncher]]

   +- [[Legacy:InventoryAttachment|InventoryAttachment]]
   |    +- [[Legacy:WeaponAttachment|WeaponAttachment]]
   +- [[Legacy:KActor|KActor]]
   |    +- [[Legacy:KConstraint|KConstraint]]
   |    |    +- [[Legacy:KBSJoint|KBSJoint]]
   |    |    +- [[Legacy:KCarWheelJoint|KCarWheelJoint]]
   |    |    +- [[Legacy:KConeLimit|KConeLimit]]
   |    |    +- [[Legacy:KHinge|KHinge]]
   |    +- [[Legacy:KTire|KTire]]
   |         +- [[Legacy:BulldogTire|BulldogTire]]
   +- [[Legacy:KVehicleFactory|KVehicleFactory]]
   |    +- [[Legacy:BulldogFactory|BulldogFactory]]
   +- [[Legacy:Keypoint|Keypoint]]
   |    +- [[Legacy:AIScript|AIScript]]
   |    |    +- [[Legacy:ScriptedSequence|ScriptedSequence]]
   |    |         +- [[Legacy:ScriptedTrigger|ScriptedTrigger]]
   |    |         +- [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
   |    +- [[Legacy:AmbientSound|AmbientSound]]
   +- [[Legacy:Light|Light]] &gt;&gt;
   +- [[Legacy:MeshEffect|MeshEffect]]
   +- [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt;
   +- [[Legacy:NetworkTrigger|NetworkTrigger]] '''(UT2004 only)'''
   +- [[Legacy:Pawn|Pawn]]
   |    +- [[Legacy:KVehicle|KVehicle]] '''(UT2003 only,''' ''in UT2004 it is under'' Vehicle''')'''
   |    |    +- [[Legacy:KCar|KCar]]
   |    |        +- [[Legacy:Bulldog|Bulldog]]
   |    +- [[Legacy:RedeemerWarhead|RedeemerWarhead]]
   |    +- [[Legacy:Scout|Scout]]
   |    +- [[Legacy:UnrealPawn|UnrealPawn]]
   |    |    +- [[Legacy:XIntroPawn|xIntroPawn]]
   |    |    +- [[Legacy:XPawn|xPawn]]
   |    |         +- [[Legacy:Monster|Monster]]
   |    +- [[Legacy:Vehicle|Vehicle]] '''(UT2004 only)'''
   |         +-[[Legacy:ASVehicle|ASVehicle]]
   |         |   +-[[Legacy:ASTurret|ASTurret]]
   |         |   |   +-[[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
   |         |   |   +-[[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
   |         |   |   +-[[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
   |         |   |   +-[[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
   |         |   +-[[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
   |         |       +-[[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
   |         |       +-[[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]
   |         +-[[Legacy:ASVehicle_SpaceFighter|ASVehicle_SpaceFighter]]
   |         |   +-[[Legacy:ASVehicle_SpaceFighter_Human|ASVehicle_SpaceFighter_Human]]
   |         |       +-[[Legacy:ASVehicle_SpaceFighter_Skaarj|ASVehicle_SpaceFighter_Skaarj]]
   |         +-[[Legacy:KVehicle|KVehicle]]
   |         |   +-[[Legacy:KCar|KCar]]
   |         |       +-[[Legacy:Bulldog|Bulldog]]
   |         +-[[Legacy:ONSWeaponPawn|ONSWeaponPawn]]
   |         |   +-[[Legacy:ONSArtillerySideGunPawn|ONSArtillerySideGunPawn]]
   |         |   +-[[Legacy:ONSDualACGatlingGunPawn|ONSDualACGatlingGunPawn]]
   |         |   +-[[Legacy:ONSMASSideGunPawn|ONSMASSideGunPawn]]
   |         |   +-[[Legacy:ONSPRVRearGunPawn|ONSPRVRearGunPawn]]
   |         |   +-[[Legacy:ONSPRVSideGunPawn|ONSPRVSideGunPawn]]
   |         |   +-[[Legacy:ONSStationaryWeaponPawn|ONSStationaryWeaponPawn]]
   |         |       +-[[Legacy:ONSManualGunPawn|ONSManualGunPawn]]
   |         |   +-[[Legacy:ONSTankSecondaryTurretPawn|ONSTankSecondaryTurretPawn]]
   |         |       +-[[Legacy:ONSTankSecondaryTurretPawn_IonPlasma|ONSTankSecondaryTurretPawn_IonPlasma]]
   |         +-[[Legacy:SVehicle|SVehicle]]
   |             +-[[Legacy:ONSVehicle|ONSVehicle]]
   |                 +-[[Legacy:ONSChopperCraft|ONSChopperCraft]]
   |                 |   +-[[Legacy:ONSAttackCraft|ONSAttackCraft]]
   |                 |       +-[[Legacy:ONSDualAttackCraft|ONSDualAttackCraft]] '''(UT2004 Bonus Pack)'''
   |                 +-[[Legacy:ONSHoverCraft|ONSHoverCraft]]
   |                 |   +-[[Legacy:ONSHoverBike|ONSHoverBike]]
   |                 +-[[Legacy:ONSPlaneCraft|ONSPlaneCraft]]
   |                 |   +-[[Legacy:ONSBomber|ONSBomber]]
   |                 +-[[Legacy:ONSTreadCraft|ONSTreadCraft]]
   |                 |   +-[[Legacy:ONSHoverTank|ONSHoverTank]]
   |                 |       +-[[Legacy:ONSHoverTank_IonPlasma|ONSHoverTank_IonPlasma]]
   |                 +-[[Legacy:ONSWheeledCraft|ONSWheeledCraft]]
   |                     +-[[Legacy:ONSArtillery|ONSArtillery]] '''(UT2004 Bonus Pack)'''
   |                     +-[[Legacy:ONSGenericSD|ONSGenericSD]]
   |                     +-[[Legacy:ONSMobileAssaultStation|ONSMobileAssaultStation]]
   |                     +-[[Legacy:ONSPRV|ONSPRV]]
   |                     +-[[Legacy:ONSRV|ONSRV]]
   |                     +-[[Legacy:ONSShockTank|ONSShockTank]] '''(UT2004 Bonus Pack)'''
   +- [[Legacy:Pickup|Pickup]]     
   |    +- [[Legacy:Ammo|Ammo]]
   |    |    +- [[Legacy:UTAmmoPickup|UTAmmoPickup]]
   |    |         +- [[Legacy:AssaultAmmoPickup|AssaultAmmoPickup]]
   |    |         +- [[Legacy:BioAmmoPickup|BioAmmoPickup]]
   |    |         +- [[Legacy:FlakAmmoPickup|FlakAmmoPickup]]
   |    |         +- [[Legacy:LinkAmmoPickup|LinkAmmoPickup]]
   |    |         +- [[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]
   |    |         +- [[Legacy:RocketAmmoPickup|RocketAmmoPickup]]
   |    |         +- [[Legacy:ShockAmmoPickup|ShockAmmoPickup]]
   |    |         +- [[Legacy:SniperAmmoPickup|SniperAmmoPickup]]
   |    +- [[Legacy:ArmorPickup|ArmorPickup]]       
   |    +- [[Legacy:KeyPickup|KeyPickup]]
   |    +- [[Legacy:TournamentPickup|TournamentPickup]]
   |    |    +- [[Legacy:AdrenalinePickup|AdrenalinePickup]]
   |    |    +- [[Legacy:ShieldPickup|ShieldPickup]]
   |    |    |    +- [[Legacy:ShieldPack|ShieldPack]]
   |    |    +- [[Legacy:TournamentHealth|TournamentHealth]]
   |    |    |    +- [[Legacy:HealthPack|HealthPack]]
   |    |    |    +- [[Legacy:MiniHealthPack|MiniHealthPack]]
   |    |    +- [[Legacy:UDamagePack|UDamagePack]]
   |    +- [[Legacy:WeaponPickup|WeaponPickup]]   
   +- [[Legacy:Projectile|Projectile]] ''(not expanded)''
   +- [[Legacy:Projector|Projector]]
   |    +-[[Legacy:DynamicProjector|DynamicProjector]]
   |    |   +-[[Legacy:BulldogHeadlight|BulldogHeadlight]]
   |    +-[[Legacy:ShadowProjector|ShadowProjector]]
   |    +-[[Legacy:XScorch|XScorch]] ''(not expanded)''
   +- [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &gt;&gt;
   +- [[Legacy:Vignette|Vignette]]
   +- [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt;
   +- [[Legacy:XEmitter|xEmitter]]
   |     +- [[Legacy:ShockBeamEffect|ShockBeamEffect]]
   |          +- [[Legacy:SuperShockBeamEffect|SuperShockBeamEffect]]
   |               +- [[Legacy:BlueSuperShockBeam|BlueSuperShockBeam]]
   +- [[Legacy:XPickUpBase|xPickUpBase]]
   |    +- [[Legacy:HealthCharger|HealthCharger]]
   |    +- [[Legacy:ShieldCharger|ShieldCharger]]
   |    +- [[Legacy:SuperHealthCharger|SuperHealthCharger]]
   |    +- [[Legacy:SuperShieldCharger|SuperShieldCharger]]
   |    +- [[Legacy:UDamageCharger|UDamageCharger]]
   |    +- [[Legacy:WildcardBase|WildcardBase]]
   |    +- [[Legacy:XWeaponBase|xWeaponBase]]
   +- [[Legacy:XProcMesh|xProcMesh]]
   +- [[Legacy:XWeatherEffect|xWeatherEffect]]

==Construction Discussion==

For comments during construction.  This is intended as temporary.

'''Aphelion''' This is my start on the class tree.  Please add to it, water it and help it grow :)  As you can see, I'm focused on the GameInfo actors.  I hope other people intent on other parts come along soon...

'''EntropicLqd:''' There was talk about using namespaces for the different game types. If this was so you'd use a prefix of ''UT2003:'' rather than a suffix.  We need Mychaeel or Tarquin in here to comment really.

'''Tarquin:''' Namespaces are not here yet. We more or less decided on the solution I've put above. Mych said he might work on something but I think he's very busy at the moment.

'''Aphelion''' Ta muchly...

'''JoeDark:''' Is this going to be the class tree for UT2003 or just UT? On a side note, have they decided what to do with the UT content yet?

'''EntropicLqd:''' Since Tarquin's comments seem to have vanished ... If you find you need to replace an existingly linked page containing UT content with UT2003 content then create a new page called ''&quot;Page Name&quot; (UT)'' and copy the original UT content into it.  You can then replace the UT content with the UT2003 content on the original page.  Would also be worth including a link to the UT content on the page as well.

'''Aphelion'''  Praise be to the Epic people...  Thanks to them, at last I can run UnrealEd and look at code in tree view... :)  I'll update this tree a little bit more sensibly now.  Updated the instruction up top, because I think they're a little unclear.

'''G-LiTe:''' It looks a little messy with certain entries expanded and others not. It'd be cool if we could get an actual JavaScript to make a large tree and have one big page pointing to all classes, making it easy to navigate at the same time. (so you can browse the tree just as in UEd) I don't know if this is possible, however, and even if it is, it might not be very cross platform.

'''Wormbo:''' JavaScript isn't possible or even desireable, because it would require people to actually ''not'' disable it. Partially expanded entries should be fully expanded if they don't have too many subclasses or moved to the class page if there are enough subclasses for making a class tree on that page. ([[Legacy:Inventory|Inventory]], [[Legacy:NavigationPoint|NavigationPoint]] and [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] are such candidates IMHO)

'''[3]''' Expanded on Pawn... will start to go into more detail as i get my head around it...same with pickup

'''Lilguy:''' This is going to start getting really complicated with the new 2004 structure. Weaponfire doesn't subclass actor anymore for instance, so there are going to be branches that don't exist in one game but do in the other, etc. Is there (should there be) a seperate class tree for 2004? It almost seems like they'd be better off in one tree (or at least on one page) since it's unlikely that someone will bother to edit both pages. Perhaps we could color code sections as 2003-only, 2004-only, or both?

I just added a branch for &quot;vehicle&quot; subclasses in 2004, but one of the subclasses, KVehicle, was originally a pawn subclass in 2003...

'''Tarquin:''' Well.... you could make a copy of this tree for just UT2003 before you start major work on it &amp;ndash; in case a joint page doesn't work out &amp;ndash; but have a go at a joint page. 

'''Lilguy:''' Ok, since I didn't find anything on how to use arbitrary text coloring, I decided to try it with bold meaning ut2004 only Perhaps we could make a little icon for 2004 instead and put that just to the right of all the ut2004 classes. Now that I think about it, there won't be any classes that are ut2003 only, but a few classes (such as weapon fires, which now subclass object) moved around.

Oh, if someone's reading this, can you tell me why the wiki text editing box extends itself past the right side of my IE window? it's getting annoying...

'''SHilrobot:''' All of the subclasses of  [[Legacy:Pickup|Pickup]] ([[Legacy:Ammo|Ammo]], [[Legacy:TournamentPickup|TournamentPickup]], etc.) were incorrectly displayed as siblings, I've changed it so it's not that way anymore. Tell me if I'm wrong.

'''EntropicLqd:''' Looks good to me.  Thanks for fixing it :)

'''Wormbo:''' Actually, it was the Pickup class itself that was incorrectly listed as a subclass of Pawn, the Pickup subclasses already had the correct position compared to Pickup's real position in the class tree.

'''SHilrobot:''' Ahh, I see. That makes much more sense.

==General Discussion==

===x classes===

Why do some classes begin with an &quot;x&quot;? what does it mean? Does it mean anything? This snippet from the head comment of [[Legacy:XEmitter|xEmitter]]:

{{innerbox| renamed to avoid conflict with Emitter

 Copyright 2001 Digital Extremes

}}

'''Mychaeel:''' I suspect all classes prefixed with an &quot;x&quot; are content added by Digital Extremes to the basic Unreal engine created by Epic.  More or less.  Of course it's not consistently used.

===Classes extending object===

'''OlympusMons:''' Well I was trying to get something happening with an object class tree as there is many pages on the wiki that contain information relating to these classes but this page seems to have dissapeared maybe it got renamed. Anyway Ive found alot of these pages arnt linked from many if any other pages, since there is no object tree, so maybe its worth extending the actor class tree to include the document classes or something. I think its probably a better idea to get this stuff sorted before adding stuff on ut2007 that way when it does come it'll be easier to know what classes belong to what game. 

'''Tarquin:''' There was a complete text list of classes... I deleted that yesterday because it's been marked as 'Delete me' for over a year. What do you mean by 'document classes'?

'''OlympusMons:''' Yeah I saw the text list and I agree that that one should have been deleted. By documented I mean classes which have pages on the wiki, I was adding some to the ut2004 class tree page that I found. I think I found them on the object page, Im thinking to clean the object page up a bit these documented and undocumented classes could go in an object class hierarchy similar to this page. Personally I just find it easier to navigate through a tree view that way you get a better understanding of the inheritance.

'''Tarquin:''' I agree, tree views are useful. There's no reason to not have an [[Legacy:Object Class Hierarchy|Object Class Hierarchy]] page :)

'''SuperApe:''' Filled in Vehicle Class tree.

'''OlympusMons:''' Bold makes the (ut2k?) stand out a bit better.

[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1234</id>
      <timestamp>2007-05-19T10:11:52Z</timestamp>
      <contributor>
        <ip>User-514f19b9.l1.c3.dsl.pol.co.uk</ip>
      </contributor>
      <comment>*kVehicle is still there</comment>
      <text xml:space="preserve">This is the [[Legacy:Class Tree|class tree]] extending from Actor in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]].  For a class tree of the GUI components see [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

==Adding new class pages ==

Any UT2003 class page should begin with the text:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; etc}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; etc}}

If you want to add information on a UT2003 class:

* Put a link here to the class you want to describe.
* If the link is taken by a Unreal Tournament class then, in that class:
* # Put a link to &quot;{classname} (UT)&quot;, substituting the current classname
* # Move all the text from the page to this new page.
* # Change the box at the top of the UT class to start with &quot;&lt;code&gt;[[Legacy:UT|UT]] ::&lt;/code&gt;&quot; for clarity.

Use the [[Legacy:Class Wikifier|Class Wikifier]] to create the basics of a wiki page from an [[Legacy:UnrealScript|UnrealScript]] class.

==Class Tree ==

You won't see all of these classes in the [[Legacy:Actor Classes Browser|Actor Classes Browser]] unless you uncheck &quot;Placeable Classes Only&quot;. And then you'll also only see the classes of the packages which are loaded. You can manually load *.u packages to add them to the class heirarchy

Key:
* &quot;&gt;&gt;&quot; means that class' subtree is expanded on the class page.
* Classes that exist only in UT2004 are labelled as such

 [[Legacy:Actor|Actor]]
   +- [[Legacy:AimedAttachment|AimedAttachment]]
   +- [[Legacy:Brush|Brush]]
   |    +- [[Legacy:Volume|Volume]] &gt;&gt;
   +- [[Legacy:Controller|Controller]]
   |    +- [[Legacy:AIController|AIController]]
   |    |    +- [[Legacy:ScriptedController|ScriptedController]]
   |    |         +- [[Legacy:Bot|Bot]]
   |    |              +- [[Legacy:XBot|xBot]]
   |    +- [[Legacy:PlayerController|PlayerController]]
   |         +- [[Legacy:Camera|Camera]]
   |         +- [[Legacy:MessagingSpectator|MessagingSpectator]]
   |         |    +- [[Legacy:DemoRecSpectator|DemoRecSpectator]]
   |         |    +- [[Legacy:UTServerAdminSpectator|UTServerAdminSpectator]]
   |         +- [[Legacy:UnrealPlayer|UnrealPlayer]]
   |              +- [[Legacy:CinematicPlayer|CinematicPlayer]]
   |              +- [[Legacy:XPlayer|xPlayer]]
   +- [[Legacy:DamageType|DamageType]] &gt;&gt;
   +- [[Legacy:Effects|Effects]]
   +- [[Legacy:Emitter|Emitter]]
   |    +- [[Legacy:NetworkEmitter|NetworkEmitter]] '''(UT2004 only)'''
   +- [[Legacy:Gib|Gib]]
   +- [[Legacy:HUD|HUD]] &gt;&gt;
   +- [[Legacy:Info|Info]]
   |    +- [[Legacy:Combo|Combo]]
   |    +- [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]
   |    +- [[Legacy:GameInfo|GameInfo]]
   |    |    +- [[Legacy:CinematicGame|CinematicGame]]
   |    |    +- [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]
   |    |         +- [[Legacy:DeathMatch|DeathMatch]]
   |    |              +- [[Legacy:TeamGame|TeamGame]]
   |    |              |    +- [[Legacy:CTFGame|CTFGame]]
   |    |              |    |    +- [[Legacy:XCTFGame|xCTFGame]]
   |    |              |    +- [[Legacy:XBombingRun|xBombingRun]]
   |    |              |    +- [[Legacy:XDoubleDom|xDoubleDom]]
   |    |              |    +- [[Legacy:XTeamGame|xTeamGame]]
   |    |              |         +- [[Legacy:ASGameInfo|ASGameInfo]] '''(UT2004 only)'''
   |    |              |         +- [[Legacy:Invasion|Invasion]] '''(UT2004 only)'''
   |    |              |         +- [[Legacy:ONSOnslaughtGame|ONSOnslaughtGame]] '''(UT2004 only)'''
   |    |              +- [[Legacy:XDeathMatch|xDeathMatch]]
   |    |                   +- [[Legacy:BossDM|BossDM]]
   |    +- [[Legacy:Mutator|Mutator]]
   +- [[Legacy:Inventory|Inventory]]
   |    +- [[Legacy:Ammunition|Ammunition]]
   |    |    +- [[Legacy:BallAmmo|BallAmmo]]
   |    |    +- [[Legacy:BioAmmo|BioAmmo]]
   |    |    +- [[Legacy:FlakAmmo|FlakAmmo]]
   |    |    +- [[Legacy:GrenadeAmmo|GrenadeAmmo]]
   |    |    +- [[Legacy:LinkAmmo|LinkAmmo]]
   |    |    +- [[Legacy:MinigunAmmo|MinigunAmmo]]
   |    |    +- [[Legacy:RedeemerAmmo|RedeemerAmmo]]
   |    |    +- [[Legacy:RocketAmmo|RocketAmmo]]
   |    |    +- [[Legacy:ShieldAmmo|ShieldAmmo]]
   |    |    +- [[Legacy:ShockAmmo|ShockAmmo]]
   |    |    |    +- [[Legacy:SuperShockAmmo|SuperShockAmmo]]
   |    |    +- [[Legacy:SniperAmmo|SniperAmmo]]
   |    |    +- [[Legacy:TransAmmo|TransAmmo]]
   |    +- [[Legacy:KeyInventory|KeyInventory]]
   |    +- [[Legacy:Powerups|Powerups]]
   |    |    +- [[Legacy:Armor|Armor]]
   |    +- [[Legacy:Weapon|Weapon]]
   |         +- [[Legacy:AssaultRifle|AssaultRifle]]
   |         +- [[Legacy:BallLauncher|BallLauncher]]
   |         +- [[Legacy:BioRifle|BioRifle]]
   |         +- [[Legacy:FlakCannon|FlakCannon]]
   |         +- [[Legacy:LinkGun|LinkGun]]
   |         +- [[Legacy:Minigun|Minigun]]
   |         +- [[Legacy:Painter|Painter]]
   |         +- [[Legacy:Redeemer|Redeemer]]
   |         +- [[Legacy:RocketLauncher|RocketLauncher]]
   |         +- [[Legacy:ShieldGun|ShieldGun]]
   |         +- [[Legacy:ShockRifle|ShockRifle]]
   |         |    +- [[Legacy:SuperShockRifle|SuperShockRifle]]
   |         |         +- [[Legacy:ZoomSuperShockRifle|ZoomSuperShockRifle]]
   |         +- [[Legacy:SniperRifle|SniperRifle]]
   |         +- [[Legacy:TransLauncher|TransLauncher]]

   +- [[Legacy:InventoryAttachment|InventoryAttachment]]
   |    +- [[Legacy:WeaponAttachment|WeaponAttachment]]
   +- [[Legacy:KActor|KActor]]
   |    +- [[Legacy:KConstraint|KConstraint]]
   |    |    +- [[Legacy:KBSJoint|KBSJoint]]
   |    |    +- [[Legacy:KCarWheelJoint|KCarWheelJoint]]
   |    |    +- [[Legacy:KConeLimit|KConeLimit]]
   |    |    +- [[Legacy:KHinge|KHinge]]
   |    +- [[Legacy:KTire|KTire]]
   |         +- [[Legacy:BulldogTire|BulldogTire]]
   +- [[Legacy:KVehicleFactory|KVehicleFactory]]
   |    +- [[Legacy:BulldogFactory|BulldogFactory]]
   +- [[Legacy:Keypoint|Keypoint]]
   |    +- [[Legacy:AIScript|AIScript]]
   |    |    +- [[Legacy:ScriptedSequence|ScriptedSequence]]
   |    |         +- [[Legacy:ScriptedTrigger|ScriptedTrigger]]
   |    |         +- [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
   |    +- [[Legacy:AmbientSound|AmbientSound]]
   +- [[Legacy:Light|Light]] &gt;&gt;
   +- [[Legacy:MeshEffect|MeshEffect]]
   +- [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt;
   +- [[Legacy:NetworkTrigger|NetworkTrigger]] '''(UT2004 only)'''
   +- [[Legacy:Pawn|Pawn]]
   |    +- [[Legacy:KVehicle|KVehicle]] '''(UT2003 only)''' is still in 2k4, but is compleatly unused and broken
   |    |    +- [[Legacy:KCar|KCar]]
   |    |        +- [[Legacy:Bulldog|Bulldog]]
   |    +- [[Legacy:RedeemerWarhead|RedeemerWarhead]]
   |    +- [[Legacy:Scout|Scout]]
   |    +- [[Legacy:UnrealPawn|UnrealPawn]]
   |    |    +- [[Legacy:XIntroPawn|xIntroPawn]]
   |    |    +- [[Legacy:XPawn|xPawn]]
   |    |         +- [[Legacy:Monster|Monster]]
   |    +- [[Legacy:Vehicle|Vehicle]] '''(UT2004 only)'''
   |         +-[[Legacy:ASVehicle|ASVehicle]]
   |         |   +-[[Legacy:ASTurret|ASTurret]]
   |         |   |   +-[[Legacy:ASTurret_BallTurret|ASTurret_BallTurret]]
   |         |   |   +-[[Legacy:ASTurret_IonCannon|ASTurret_IonCannon]]
   |         |   |   +-[[Legacy:ASTurret_LinkTurret|ASTurret_LinkTurret]]
   |         |   |   +-[[Legacy:ASTurret_Minigun|ASTurret_Minigun]]
   |         |   +-[[Legacy:ASVehicle_Sentinel|ASVehicle_Sentinel]]
   |         |       +-[[Legacy:ASVehicle_Sentinel_Ceiling|ASVehicle_Sentinel_Ceiling]]
   |         |       +-[[Legacy:ASVehicle_Sentinel_Floor|ASVehicle_Sentinel_Floor]]
   |         +-[[Legacy:ASVehicle_SpaceFighter|ASVehicle_SpaceFighter]]
   |         |   +-[[Legacy:ASVehicle_SpaceFighter_Human|ASVehicle_SpaceFighter_Human]]
   |         |       +-[[Legacy:ASVehicle_SpaceFighter_Skaarj|ASVehicle_SpaceFighter_Skaarj]]
   |         +-[[Legacy:KVehicle|KVehicle]]
   |         |   +-[[Legacy:KCar|KCar]]
   |         |       +-[[Legacy:Bulldog|Bulldog]]
   |         +-[[Legacy:ONSWeaponPawn|ONSWeaponPawn]]
   |         |   +-[[Legacy:ONSArtillerySideGunPawn|ONSArtillerySideGunPawn]]
   |         |   +-[[Legacy:ONSDualACGatlingGunPawn|ONSDualACGatlingGunPawn]]
   |         |   +-[[Legacy:ONSMASSideGunPawn|ONSMASSideGunPawn]]
   |         |   +-[[Legacy:ONSPRVRearGunPawn|ONSPRVRearGunPawn]]
   |         |   +-[[Legacy:ONSPRVSideGunPawn|ONSPRVSideGunPawn]]
   |         |   +-[[Legacy:ONSStationaryWeaponPawn|ONSStationaryWeaponPawn]]
   |         |       +-[[Legacy:ONSManualGunPawn|ONSManualGunPawn]]
   |         |   +-[[Legacy:ONSTankSecondaryTurretPawn|ONSTankSecondaryTurretPawn]]
   |         |       +-[[Legacy:ONSTankSecondaryTurretPawn_IonPlasma|ONSTankSecondaryTurretPawn_IonPlasma]]
   |         +-[[Legacy:SVehicle|SVehicle]]
   |             +-[[Legacy:ONSVehicle|ONSVehicle]]
   |                 +-[[Legacy:ONSChopperCraft|ONSChopperCraft]]
   |                 |   +-[[Legacy:ONSAttackCraft|ONSAttackCraft]]
   |                 |       +-[[Legacy:ONSDualAttackCraft|ONSDualAttackCraft]] '''(UT2004 Bonus Pack)'''
   |                 +-[[Legacy:ONSHoverCraft|ONSHoverCraft]]
   |                 |   +-[[Legacy:ONSHoverBike|ONSHoverBike]]
   |                 +-[[Legacy:ONSPlaneCraft|ONSPlaneCraft]]
   |                 |   +-[[Legacy:ONSBomber|ONSBomber]]
   |                 +-[[Legacy:ONSTreadCraft|ONSTreadCraft]]
   |                 |   +-[[Legacy:ONSHoverTank|ONSHoverTank]]
   |                 |       +-[[Legacy:ONSHoverTank_IonPlasma|ONSHoverTank_IonPlasma]]
   |                 +-[[Legacy:ONSWheeledCraft|ONSWheeledCraft]]
   |                     +-[[Legacy:ONSArtillery|ONSArtillery]] '''(UT2004 Bonus Pack)'''
   |                     +-[[Legacy:ONSGenericSD|ONSGenericSD]]
   |                     +-[[Legacy:ONSMobileAssaultStation|ONSMobileAssaultStation]]
   |                     +-[[Legacy:ONSPRV|ONSPRV]]
   |                     +-[[Legacy:ONSRV|ONSRV]]
   |                     +-[[Legacy:ONSShockTank|ONSShockTank]] '''(UT2004 Bonus Pack)'''
   +- [[Legacy:Pickup|Pickup]]     
   |    +- [[Legacy:Ammo|Ammo]]
   |    |    +- [[Legacy:UTAmmoPickup|UTAmmoPickup]]
   |    |         +- [[Legacy:AssaultAmmoPickup|AssaultAmmoPickup]]
   |    |         +- [[Legacy:BioAmmoPickup|BioAmmoPickup]]
   |    |         +- [[Legacy:FlakAmmoPickup|FlakAmmoPickup]]
   |    |         +- [[Legacy:LinkAmmoPickup|LinkAmmoPickup]]
   |    |         +- [[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]
   |    |         +- [[Legacy:RocketAmmoPickup|RocketAmmoPickup]]
   |    |         +- [[Legacy:ShockAmmoPickup|ShockAmmoPickup]]
   |    |         +- [[Legacy:SniperAmmoPickup|SniperAmmoPickup]]
   |    +- [[Legacy:ArmorPickup|ArmorPickup]]       
   |    +- [[Legacy:KeyPickup|KeyPickup]]
   |    +- [[Legacy:TournamentPickup|TournamentPickup]]
   |    |    +- [[Legacy:AdrenalinePickup|AdrenalinePickup]]
   |    |    +- [[Legacy:ShieldPickup|ShieldPickup]]
   |    |    |    +- [[Legacy:ShieldPack|ShieldPack]]
   |    |    +- [[Legacy:TournamentHealth|TournamentHealth]]
   |    |    |    +- [[Legacy:HealthPack|HealthPack]]
   |    |    |    +- [[Legacy:MiniHealthPack|MiniHealthPack]]
   |    |    +- [[Legacy:UDamagePack|UDamagePack]]
   |    +- [[Legacy:WeaponPickup|WeaponPickup]]   
   +- [[Legacy:Projectile|Projectile]] ''(not expanded)''
   +- [[Legacy:Projector|Projector]]
   |    +-[[Legacy:DynamicProjector|DynamicProjector]]
   |    |   +-[[Legacy:BulldogHeadlight|BulldogHeadlight]]
   |    +-[[Legacy:ShadowProjector|ShadowProjector]]
   |    +-[[Legacy:XScorch|XScorch]] ''(not expanded)''
   +- [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &gt;&gt;
   +- [[Legacy:Vignette|Vignette]]
   +- [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt;
   +- [[Legacy:XEmitter|xEmitter]]
   |     +- [[Legacy:ShockBeamEffect|ShockBeamEffect]]
   |          +- [[Legacy:SuperShockBeamEffect|SuperShockBeamEffect]]
   |               +- [[Legacy:BlueSuperShockBeam|BlueSuperShockBeam]]
   +- [[Legacy:XPickUpBase|xPickUpBase]]
   |    +- [[Legacy:HealthCharger|HealthCharger]]
   |    +- [[Legacy:ShieldCharger|ShieldCharger]]
   |    +- [[Legacy:SuperHealthCharger|SuperHealthCharger]]
   |    +- [[Legacy:SuperShieldCharger|SuperShieldCharger]]
   |    +- [[Legacy:UDamageCharger|UDamageCharger]]
   |    +- [[Legacy:WildcardBase|WildcardBase]]
   |    +- [[Legacy:XWeaponBase|xWeaponBase]]
   +- [[Legacy:XProcMesh|xProcMesh]]
   +- [[Legacy:XWeatherEffect|xWeatherEffect]]

==Construction Discussion==

For comments during construction.  This is intended as temporary.

'''Aphelion''' This is my start on the class tree.  Please add to it, water it and help it grow :)  As you can see, I'm focused on the GameInfo actors.  I hope other people intent on other parts come along soon...

'''EntropicLqd:''' There was talk about using namespaces for the different game types. If this was so you'd use a prefix of ''UT2003:'' rather than a suffix.  We need Mychaeel or Tarquin in here to comment really.

'''Tarquin:''' Namespaces are not here yet. We more or less decided on the solution I've put above. Mych said he might work on something but I think he's very busy at the moment.

'''Aphelion''' Ta muchly...

'''JoeDark:''' Is this going to be the class tree for UT2003 or just UT? On a side note, have they decided what to do with the UT content yet?

'''EntropicLqd:''' Since Tarquin's comments seem to have vanished ... If you find you need to replace an existingly linked page containing UT content with UT2003 content then create a new page called ''&quot;Page Name&quot; (UT)'' and copy the original UT content into it.  You can then replace the UT content with the UT2003 content on the original page.  Would also be worth including a link to the UT content on the page as well.

'''Aphelion'''  Praise be to the Epic people...  Thanks to them, at last I can run UnrealEd and look at code in tree view... :)  I'll update this tree a little bit more sensibly now.  Updated the instruction up top, because I think they're a little unclear.

'''G-LiTe:''' It looks a little messy with certain entries expanded and others not. It'd be cool if we could get an actual JavaScript to make a large tree and have one big page pointing to all classes, making it easy to navigate at the same time. (so you can browse the tree just as in UEd) I don't know if this is possible, however, and even if it is, it might not be very cross platform.

'''Wormbo:''' JavaScript isn't possible or even desireable, because it would require people to actually ''not'' disable it. Partially expanded entries should be fully expanded if they don't have too many subclasses or moved to the class page if there are enough subclasses for making a class tree on that page. ([[Legacy:Inventory|Inventory]], [[Legacy:NavigationPoint|NavigationPoint]] and [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] are such candidates IMHO)

'''[3]''' Expanded on Pawn... will start to go into more detail as i get my head around it...same with pickup

'''Lilguy:''' This is going to start getting really complicated with the new 2004 structure. Weaponfire doesn't subclass actor anymore for instance, so there are going to be branches that don't exist in one game but do in the other, etc. Is there (should there be) a seperate class tree for 2004? It almost seems like they'd be better off in one tree (or at least on one page) since it's unlikely that someone will bother to edit both pages. Perhaps we could color code sections as 2003-only, 2004-only, or both?

I just added a branch for &quot;vehicle&quot; subclasses in 2004, but one of the subclasses, KVehicle, was originally a pawn subclass in 2003...

'''Tarquin:''' Well.... you could make a copy of this tree for just UT2003 before you start major work on it &amp;ndash; in case a joint page doesn't work out &amp;ndash; but have a go at a joint page. 

'''Lilguy:''' Ok, since I didn't find anything on how to use arbitrary text coloring, I decided to try it with bold meaning ut2004 only Perhaps we could make a little icon for 2004 instead and put that just to the right of all the ut2004 classes. Now that I think about it, there won't be any classes that are ut2003 only, but a few classes (such as weapon fires, which now subclass object) moved around.

Oh, if someone's reading this, can you tell me why the wiki text editing box extends itself past the right side of my IE window? it's getting annoying...

'''SHilrobot:''' All of the subclasses of  [[Legacy:Pickup|Pickup]] ([[Legacy:Ammo|Ammo]], [[Legacy:TournamentPickup|TournamentPickup]], etc.) were incorrectly displayed as siblings, I've changed it so it's not that way anymore. Tell me if I'm wrong.

'''EntropicLqd:''' Looks good to me.  Thanks for fixing it :)

'''Wormbo:''' Actually, it was the Pickup class itself that was incorrectly listed as a subclass of Pawn, the Pickup subclasses already had the correct position compared to Pickup's real position in the class tree.

'''SHilrobot:''' Ahh, I see. That makes much more sense.

==General Discussion==

===x classes===

Why do some classes begin with an &quot;x&quot;? what does it mean? Does it mean anything? This snippet from the head comment of [[Legacy:XEmitter|xEmitter]]:

{{innerbox| renamed to avoid conflict with Emitter

 Copyright 2001 Digital Extremes

}}

'''Mychaeel:''' I suspect all classes prefixed with an &quot;x&quot; are content added by Digital Extremes to the basic Unreal engine created by Epic.  More or less.  Of course it's not consistently used.

===Classes extending object===

'''OlympusMons:''' Well I was trying to get something happening with an object class tree as there is many pages on the wiki that contain information relating to these classes but this page seems to have dissapeared maybe it got renamed. Anyway Ive found alot of these pages arnt linked from many if any other pages, since there is no object tree, so maybe its worth extending the actor class tree to include the document classes or something. I think its probably a better idea to get this stuff sorted before adding stuff on ut2007 that way when it does come it'll be easier to know what classes belong to what game. 

'''Tarquin:''' There was a complete text list of classes... I deleted that yesterday because it's been marked as 'Delete me' for over a year. What do you mean by 'document classes'?

'''OlympusMons:''' Yeah I saw the text list and I agree that that one should have been deleted. By documented I mean classes which have pages on the wiki, I was adding some to the ut2004 class tree page that I found. I think I found them on the object page, Im thinking to clean the object page up a bit these documented and undocumented classes could go in an object class hierarchy similar to this page. Personally I just find it easier to navigate through a tree view that way you get a better understanding of the inheritance.

'''Tarquin:''' I agree, tree views are useful. There's no reason to not have an [[Legacy:Object Class Hierarchy|Object Class Hierarchy]] page :)

'''SuperApe:''' Filled in Vehicle Class tree.

'''OlympusMons:''' Bold makes the (ut2k?) stand out a bit better.

[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Class Hierarchy (DX)</title>
    <id>478</id>
    <revision>
      <id>1537</id>
      <timestamp>2004-02-11T01:47:02Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve"> [[Legacy:Actor (DX)|Actor (DX)]]
 +&amp;ndash; [[Legacy:Augmentation (DX)|Augmentation (DX)]]
 |   +&amp;ndash; [[Legacy:AugAqualung (DX)|AugAqualung (DX)]]
 |   +&amp;ndash; [[Legacy:AugBallistic (DX)|AugBallistic (DX)]]
 |   +&amp;ndash; [[Legacy:AugCloak (DX)|AugCloak (DX)]]
 |   +&amp;ndash; [[Legacy:AugCombat (DX)|AugCombat (DX)]]
 |   +&amp;ndash; [[Legacy:AugDatalink (DX)|AugDatalink (DX)]]
 |   +&amp;ndash; [[Legacy:AugDefense (DX)|AugDefense (DX)]]
 |   +&amp;ndash; [[Legacy:AugDrone (DX)|AugDrone (DX)]]
 |   +&amp;ndash; [[Legacy:AugEMP (DX)|AugEMP (DX)]]
 |   +&amp;ndash; [[Legacy:AugEnviro (DX)|AugEnviro (DX)]]
 |   +&amp;ndash; [[Legacy:AugHealing (DX)|AugHealing (DX)]]
 |   +&amp;ndash; [[Legacy:AugHeartLung (DX)|AugHeartLung (DX)]]
 |   +&amp;ndash; [[Legacy:AugIFF (DX)|AugIFF (DX)]]
 |   +&amp;ndash; [[Legacy:AugLight (DX)|AugLight (DX)]]
 |   +&amp;ndash; [[Legacy:AugMuscle (DX)|AugMuscle (DX)]]
 |   +&amp;ndash; [[Legacy:AugPower (DX)|AugPower (DX)]]
 |   +&amp;ndash; [[Legacy:AugRadarTrans (DX)|AugRadarTrans (DX)]]
 |   +&amp;ndash; [[Legacy:AugShield (DX)|AugShield (DX)]]
 |   +&amp;ndash; [[Legacy:AugSpeed (DX)|AugSpeed (DX)]]
 |   +&amp;ndash; [[Legacy:AugStealth (DX)|AugStealth (DX)]]
 |   +&amp;ndash; [[Legacy:AugTarget (DX)|AugTarget (DX)]]
 |   +&amp;ndash; [[Legacy:AugVision (DX)|AugVision (DX)]]
 +&amp;ndash; [[Legacy:AugmentationManager (DX)|AugmentationManager (DX)]]
 +&amp;ndash; [[Legacy:BarkManager (DX)|BarkManager (DX)]]
 +&amp;ndash; [[Legacy:Brush (DX)|Brush (DX)]]
 |   +&amp;ndash; [[Legacy:Mover (DX)|Mover (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExMover (DX)|DeusExMover (DX)]]
 |       |   +&amp;ndash; [[Legacy:BreakableGlass (DX)|BreakableGlass (DX)]]
 |       |   +&amp;ndash; [[Legacy:BreakableWall (DX)|BreakableWall (DX)]]
 |       +&amp;ndash; [[Legacy:ElevatorMover (DX)|ElevatorMover (DX)]]
 |       +&amp;ndash; [[Legacy:MultiMover (DX)|MultiMover (DX)]]
 +&amp;ndash; [[Legacy:ColorTheme (DX)|ColorTheme (DX)]]
 |   +&amp;ndash; [[Legacy:ColorThemeHUD (DX)|ColorThemeHUD (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Amber (DX)|ColorThemeHUD_Amber (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Cops (DX)|ColorThemeHUD_Cops (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Cyan (DX)|ColorThemeHUD_Cyan (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_DarkBlue (DX)|ColorThemeHUD_DarkBlue (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Default (DX)|ColorThemeHUD_Default (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_DesertStorm (DX)|ColorThemeHUD_DesertStorm (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_DriedBlood (DX)|ColorThemeHUD_DriedBlood (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Dusk (DX)|ColorThemeHUD_Dusk (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Grey (DX)|ColorThemeHUD_Grey (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_IonStorm (DX)|ColorThemeHUD_IonStorm (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Nightvision (DX)|ColorThemeHUD_Nightvision (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Ninja (DX)|ColorThemeHUD_Ninja (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_PaleGreen (DX)|ColorThemeHUD_PaleGreen (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Pastel (DX)|ColorThemeHUD_Pastel (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Plasma (DX)|ColorThemeHUD_Plasma (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Primaries (DX)|ColorThemeHUD_Primaries (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Purple (DX)|ColorThemeHUD_Purple (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Red (DX)|ColorThemeHUD_Red (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_SoylentGreen (DX)|ColorThemeHUD_SoylentGreen (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Starlight (DX)|ColorThemeHUD_Starlight (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_SteelGreen (DX)|ColorThemeHUD_SteelGreen (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Superhero (DX)|ColorThemeHUD_Superhero (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Terminator (DX)|ColorThemeHUD_Terminator (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Violet (DX)|ColorThemeHUD_Violet (DX)]]
 |   +&amp;ndash; [[Legacy:ColorThemeMenu (DX)|ColorThemeMenu (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Blue (DX)|ColorThemeMenu_Blue (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_BlueAndGold (DX)|ColorThemeMenu_BlueAndGold (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_CoolGreen (DX)|ColorThemeMenu_CoolGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Cops (DX)|ColorThemeMenu_Cops (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Cyan (DX)|ColorThemeMenu_Cyan (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Default (DX)|ColorThemeMenu_Default (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_DesertStorm (DX)|ColorThemeMenu_DesertStorm (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_DriedBlood (DX)|ColorThemeMenu_DriedBlood (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Dusk (DX)|ColorThemeMenu_Dusk (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Earth (DX)|ColorThemeMenu_Earth (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Green (DX)|ColorThemeMenu_Green (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Grey (DX)|ColorThemeMenu_Grey (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_IonStorm (DX)|ColorThemeMenu_IonStorm (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Lava (DX)|ColorThemeMenu_Lava (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_NightVision (DX)|ColorThemeMenu_NightVision (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Ninja (DX)|ColorThemeMenu_Ninja (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Olive (DX)|ColorThemeMenu_Olive (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_PaleGreen (DX)|ColorThemeMenu_PaleGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Pastel (DX)|ColorThemeMenu_Pastel (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Plasma (DX)|ColorThemeMenu_Plasma (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Primaries (DX)|ColorThemeMenu_Primaries (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Purple (DX)|ColorThemeMenu_Purple (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Red (DX)|ColorThemeMenu_Red (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Seawater (DX)|ColorThemeMenu_Seawater (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_SoylentGreen (DX)|ColorThemeMenu_SoylentGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Starlight (DX)|ColorThemeMenu_Starlight (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Steel (DX)|ColorThemeMenu_Steel (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_SteelGreen (DX)|ColorThemeMenu_SteelGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Superhero (DX)|ColorThemeMenu_Superhero (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Terminator (DX)|ColorThemeMenu_Terminator (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Violet (DX)|ColorThemeMenu_Violet (DX)]]
 +&amp;ndash; [[Legacy:ColorThemeManager (DX)|ColorThemeManager (DX)]]
 +&amp;ndash; [[Legacy:ConPlayBark (DX)|ConPlayBark (DX)]]
 +&amp;ndash; [[Legacy:ConPlayBase (DX)|ConPlayBase (DX)]]
 |   +&amp;ndash; [[Legacy:ConPlay (DX)|ConPlay (DX)]]
 |   +&amp;ndash; [[Legacy:DataLinkPlay (DX)|DataLinkPlay (DX)]]
 +&amp;ndash; [[Legacy:DamageType (DX)|DamageType (DX)]]
 +&amp;ndash; [[Legacy:Decal (DX)|Decal (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExDecal (DX)|DeusExDecal (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmbrosiaPool (DX)|AmbrosiaPool (DX)]]
 |   |   +&amp;ndash; [[Legacy:BloodPool (DX)|BloodPool (DX)]]
 |   |   +&amp;ndash; [[Legacy:BloodSplat (DX)|BloodSplat (DX)]]
 |   |   +&amp;ndash; [[Legacy:BulletHole (DX)|BulletHole (DX)]]
 |   |   +&amp;ndash; [[Legacy:BurnMark (DX)|BurnMark (DX)]]
 |   |   +&amp;ndash; [[Legacy:ScorchMark (DX)|ScorchMark (DX)]]
 |   |   +&amp;ndash; [[Legacy:WaterPool (DX)|WaterPool (DX)]]
 |   +&amp;ndash; [[Legacy:Shadow (DX)|Shadow (DX)]]
 +&amp;ndash; [[Legacy:Decoration (DX)|Decoration (DX)]] &gt;&gt; (expanded in [[Legacy:Decoration Class Tree (DX)|Decoration Class Tree (DX)]]
 +&amp;ndash; [[Legacy:Effects (DX)|Effects (DX)]]
 |   +&amp;ndash; [[Legacy:AirBubble (DX)|AirBubble (DX)]]
 |   +&amp;ndash; [[Legacy:AnimatedSprite (DX)|AnimatedSprite (DX)]]
 |   |   +&amp;ndash; [[Legacy:ExplosionLarge (DX)|ExplosionLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:ExplosionMedium (DX)|ExplosionMedium (DX)]]
 |   |   +&amp;ndash; [[Legacy:ExplosionSmall (DX)|ExplosionSmall (DX)]]
 |   +&amp;ndash; [[Legacy:BloodSpurt (DX)|BloodSpurt (DX)]]
 |   +&amp;ndash; [[Legacy:EllipseEffect (DX)|EllipseEffect (DX)]]
 |   +&amp;ndash; [[Legacy:Fire (DX)|Fire (DX)]]
 |   |   +&amp;ndash; [[Legacy:SmokelessFire (DX)|SmokelessFire (DX)]]
 |   +&amp;ndash; [[Legacy:LaserEmitter (DX)|LaserEmitter (DX)]]
 |   |   +&amp;ndash; [[Legacy:ElectricityEmitter (DX)|ElectricityEmitter (DX)]]
 |   +&amp;ndash; [[Legacy:LaserProxy (DX)|LaserProxy (DX)]]
 |   +&amp;ndash; [[Legacy:LaserSpot (DX)|LaserSpot (DX)]]
 |   +&amp;ndash; [[Legacy:MoverHighlight (DX)|MoverHighlight (DX)]]
 |   +&amp;ndash; [[Legacy:MuzzleFlash (DX)|MuzzleFlash (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleGenerator (DX)|ParticleGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:WaterDrips (DX)|WaterDrips (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleProxy (DX)|ParticleProxy (DX)]]
 |   +&amp;ndash; [[Legacy:PawnGenerator (DX)|PawnGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:Fish2Generator (DX)|Fish2Generator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FishGenerator (DX)|FishGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlyGenerator (DX)|FlyGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:PedestrianGenerator (DX)|PedestrianGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:PigeonGenerator (DX)|PigeonGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:RatGenerator (DX)|RatGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:SeagullGenerator (DX)|SeagullGenerator (DX)]]
 |   +&amp;ndash; [[Legacy:ProjectileGenerator (DX)|ProjectileGenerator (DX)]]
 |   +&amp;ndash; [[Legacy:ShieldEffect (DX)|ShieldEffect (DX)]]
 |   +&amp;ndash; [[Legacy:ShockRing (DX)|ShockRing (DX)]]
 |   +&amp;ndash; [[Legacy:SmokeTrail (DX)|SmokeTrail (DX)]]
 |   +&amp;ndash; [[Legacy:Spark (DX)|Spark (DX)]]
 |   +&amp;ndash; [[Legacy:SphereEffect (DX)|SphereEffect (DX)]]
 |   |   +&amp;ndash; [[Legacy:InvulnSphere (DX)|InvulnSphere (DX)]]
 |   +&amp;ndash; [[Legacy:TrashGenerator (DX)|TrashGenerator (DX)]]
 |   +&amp;ndash; [[Legacy:WaterRing (DX)|WaterRing (DX)]]
 +&amp;ndash; [[Legacy:HUD (DX)|HUD (DX)]]
 +&amp;ndash; [[Legacy:Info (DX)|Info (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExLevelInfo (DX)|DeusExLevelInfo (DX)]]
 |   +&amp;ndash; [[Legacy:GameInfo (DX)|GameInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DeusExGameInfo (DX)|DeusExGameInfo (DX)]]
 |   |       +&amp;ndash; [[Legacy:DeusExMPGame (DX)|DeusExMPGame (DX)]]
 |   |           +&amp;ndash; [[Legacy:DeathMatchGame (DX)|DeathMatchGame (DX)]]
 |   |           +&amp;ndash; [[Legacy:TeamDMGame (DX)|TeamDMGame (DX)]]
 |   |               +&amp;ndash; [[Legacy:AdvTeamDMGame (DX)|AdvTeamDMGame (DX)]]
 |   |               +&amp;ndash; [[Legacy:BasicTeamDMGame (DX)|BasicTeamDMGame (DX)]]
 |   +&amp;ndash; [[Legacy:InternetInfo (DX)|InternetInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:InternetLink (DX)|InternetLink (DX)]]
 |   |       +&amp;ndash; [[Legacy:TcpLink (DX)|TcpLink (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:UBrowserBufferedTcpLink (DX)|UBrowserBufferedTcpLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:DeusExGSpyLink (DX)|DeusExGSpyLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserGSpyLink (DX)|UBrowserGSpyLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserHTTPClient (DX)|UBrowserHTTPClient (DX)]]
 |   |       |       |   +&amp;ndash; [[Legacy:UBrowserUpdateServerLink (DX)|UBrowserUpdateServerLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserHTTPLink (DX)|UBrowserHTTPLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserIRCLink (DX)|UBrowserIRCLink (DX)]]
 |   |       +&amp;ndash; [[Legacy:UdpLink (DX)|UdpLink (DX)]]
 |   |           +&amp;ndash; [[Legacy:DeusExLocalLink (DX)|DeusExLocalLink (DX)]]
 |   |           +&amp;ndash; [[Legacy:DeusExServerPing (DX)|DeusExServerPing (DX)]]
 |   |           +&amp;ndash; [[Legacy:UBrowserLocalLink (DX)|UBrowserLocalLink (DX)]]
 |   |           +&amp;ndash; [[Legacy:UBrowserServerPing (DX)|UBrowserServerPing (DX)]]
 |   |           +&amp;ndash; [[Legacy:UdpBeacon (DX)|UdpBeacon (DX)]]
 |   |           |   +&amp;ndash; [[Legacy:ClientBeaconReceiver (DX)|ClientBeaconReceiver (DX)]]
 |   |           +&amp;ndash; [[Legacy:UdpServerQuery (DX)|UdpServerQuery (DX)]]
 |   |           +&amp;ndash; [[Legacy:UdpServerUplink (DX)|UdpServerUplink (DX)]]
 |   +&amp;ndash; [[Legacy:KillerProfile (DX)|KillerProfile (DX)]]
 |   +&amp;ndash; [[Legacy:LocalMessage (DX)|LocalMessage (DX)]]
 |   +&amp;ndash; [[Legacy:MapList (DX)|MapList (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXMapList (DX)|DXMapList (DX)]]
 |   +&amp;ndash; [[Legacy:MissionScript (DX)|MissionScript (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission00 (DX)|Mission00 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission01 (DX)|Mission01 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission02 (DX)|Mission02 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission03 (DX)|Mission03 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission04 (DX)|Mission04 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission05 (DX)|Mission05 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission06 (DX)|Mission06 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission08 (DX)|Mission08 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission09 (DX)|Mission09 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission10 (DX)|Mission10 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission11 (DX)|Mission11 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission12 (DX)|Mission12 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission14 (DX)|Mission14 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission15 (DX)|Mission15 (DX)]]
 |   |   +&amp;ndash; [[Legacy:MissionEndgame (DX)|MissionEndgame (DX)]]
 |   |   +&amp;ndash; [[Legacy:MissionIntro (DX)|MissionIntro (DX)]]
 |   +&amp;ndash; [[Legacy:Mutator (DX)|Mutator (DX)]]
 |   +&amp;ndash; [[Legacy:ReplicationInfo (DX)|ReplicationInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:GameReplicationInfo (DX)|GameReplicationInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:PlayerReplicationInfo (DX)|PlayerReplicationInfo (DX)]]
 |   +&amp;ndash; [[Legacy:SavedMove (DX)|SavedMove (DX)]]
 |   +&amp;ndash; [[Legacy:ScoreBoard (DX)|ScoreBoard (DX)]]
 |   +&amp;ndash; [[Legacy:StatLog (DX)|StatLog (DX)]]
 |   |   +&amp;ndash; [[Legacy:StatLogFile (DX)|StatLogFile (DX)]]
 |   +&amp;ndash; [[Legacy:TestInfo (DX)|TestInfo (DX)]]
 |   +&amp;ndash; [[Legacy:VoicePack (DX)|VoicePack (DX)]]
 |   +&amp;ndash; [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]]
 |       +&amp;ndash; [[Legacy:LevelInfo (DX)|LevelInfo (DX)]]
 |       +&amp;ndash; [[Legacy:SkyZoneInfo (DX)|SkyZoneInfo (DX)]]
 |       +&amp;ndash; [[Legacy:WarpZoneInfo (DX)|WarpZoneInfo (DX)]]
 |       +&amp;ndash; [[Legacy:WaterZone (DX)|WaterZone (DX)]]
 +&amp;ndash; [[Legacy:Inventory (DX)|Inventory (DX)]] &gt;&gt; (expanded in [[Legacy:Inventory Class Tree (DX)|Inventory Class Tree (DX)]]
 +&amp;ndash; [[Legacy:Keypoint (DX)|Keypoint (DX)]]
 |   +&amp;ndash; [[Legacy:AmbientSound (DX)|AmbientSound (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmbientSoundTriggered (DX)|AmbientSoundTriggered (DX)]]
 |   +&amp;ndash; [[Legacy:BlockAll (DX)|BlockAll (DX)]]
 |   +&amp;ndash; [[Legacy:BlockMonsters (DX)|BlockMonsters (DX)]]
 |   +&amp;ndash; [[Legacy:BlockPlayer (DX)|BlockPlayer (DX)]]
 |   +&amp;ndash; [[Legacy:CameraPoint (DX)|CameraPoint (DX)]]
 |   +&amp;ndash; [[Legacy:InterpolationPoint (DX)|InterpolationPoint (DX)]]
 |   +&amp;ndash; [[Legacy:LocationID (DX)|LocationID (DX)]]
 |   +&amp;ndash; [[Legacy:MoverCollider (DX)|MoverCollider (DX)]]
 |   +&amp;ndash; [[Legacy:PickupDistributor (DX)|PickupDistributor (DX)]]
 |   +&amp;ndash; [[Legacy:RandomEvents (DX)|RandomEvents (DX)]]
 |   +&amp;ndash; [[Legacy:RandomSounds (DX)|RandomSounds (DX)]]
 |   +&amp;ndash; [[Legacy:SequenceEvents (DX)|SequenceEvents (DX)]]
 |   +&amp;ndash; [[Legacy:Timer (DX)|Timer (DX)]]
 |   +&amp;ndash; [[Legacy:WayBeacon (DX)|WayBeacon (DX)]]
 +&amp;ndash; [[Legacy:Light (DX)|Light (DX)]]
 |   +&amp;ndash; [[Legacy:Beam (DX)|Beam (DX)]]
 |   +&amp;ndash; [[Legacy:ConLight (DX)|ConLight (DX)]]
 |   +&amp;ndash; [[Legacy:ExplosionLight (DX)|ExplosionLight (DX)]]
 |   +&amp;ndash; [[Legacy:HighLight (DX)|HighLight (DX)]]
 |   +&amp;ndash; [[Legacy:Spotlight (DX)|Spotlight (DX)]]
 |   +&amp;ndash; [[Legacy:TriggerLight (DX)|TriggerLight (DX)]]
 +&amp;ndash; [[Legacy:Menu (DX)|Menu (DX)]]
 +&amp;ndash; [[Legacy:MPPlayerTrack (DX)|MPPlayerTrack (DX)]]
 +&amp;ndash; [[Legacy:NavigationPoint (DX)|NavigationPoint (DX)]]
 |   +&amp;ndash; [[Legacy:AmbushPoint (DX)|AmbushPoint (DX)]]
 |   +&amp;ndash; [[Legacy:ButtonMarker (DX)|ButtonMarker (DX)]]
 |   +&amp;ndash; [[Legacy:HidePoint (DX)|HidePoint (DX)]]
 |   +&amp;ndash; [[Legacy:HomeBase (DX)|HomeBase (DX)]]
 |   +&amp;ndash; [[Legacy:InventorySpot (DX)|InventorySpot (DX)]]
 |   +&amp;ndash; [[Legacy:LiftCenter (DX)|LiftCenter (DX)]]
 |   +&amp;ndash; [[Legacy:LiftExit (DX)|LiftExit (DX)]]
 |   +&amp;ndash; [[Legacy:MapExit (DX)|MapExit (DX)]]
 |   +&amp;ndash; [[Legacy:PathNode (DX)|PathNode (DX)]]
 |   +&amp;ndash; [[Legacy:PatrolPoint (DX)|PatrolPoint (DX)]]
 |   +&amp;ndash; [[Legacy:PlayerStart (DX)|PlayerStart (DX)]]
 |   +&amp;ndash; [[Legacy:SpawnPoint (DX)|SpawnPoint (DX)]]
 |   +&amp;ndash; [[Legacy:Teleporter (DX)|Teleporter (DX)]]
 |   +&amp;ndash; [[Legacy:TriggerMarker (DX)|TriggerMarker (DX)]]
 |   +&amp;ndash; [[Legacy:WanderPoint (DX)|WanderPoint (DX)]]
 |   +&amp;ndash; [[Legacy:WarpZoneMarker (DX)|WarpZoneMarker (DX)]]
 +&amp;ndash; [[Legacy:Pawn (DX)|Pawn (DX)]] &gt;&gt; (expanded in [[Legacy:Pawn Class Tree (DX)|Pawn Class Tree (DX)]]
 +&amp;ndash; [[Legacy:Projectile (DX)|Projectile (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExProjectile (DX)|DeusExProjectile (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cloud (DX)|Cloud (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:HalonGas (DX)|HalonGas (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:PoisonGas (DX)|PoisonGas (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:TearGas (DX)|TearGas (DX)]]
 |   |   +&amp;ndash; [[Legacy:Dart (DX)|Dart (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:DartFlare (DX)|DartFlare (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:DartPoison (DX)|DartPoison (DX)]]
 |   |   +&amp;ndash; [[Legacy:Fireball (DX)|Fireball (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:FireballRocket (DX)|FireballRocket (DX)]]
 |   |   +&amp;ndash; [[Legacy:GraySpit (DX)|GraySpit (DX)]]
 |   |   +&amp;ndash; [[Legacy:GreaselSpit (DX)|GreaselSpit (DX)]]
 |   |   +&amp;ndash; [[Legacy:HECannister20mm (DX)|HECannister20mm (DX)]]
 |   |   +&amp;ndash; [[Legacy:PlasmaBolt (DX)|PlasmaBolt (DX)]]
 |   |   +&amp;ndash; [[Legacy:Rocket (DX)|Rocket (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketLAW (DX)|RocketLAW (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketMini (DX)|RocketMini (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketRobot (DX)|RocketRobot (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketWP (DX)|RocketWP (DX)]]
 |   |   +&amp;ndash; [[Legacy:Shuriken (DX)|Shuriken (DX)]]
 |   |   +&amp;ndash; [[Legacy:ThrownProjectile (DX)|ThrownProjectile (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:EMPGrenade (DX)|EMPGrenade (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:GasGrenade (DX)|GasGrenade (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:LAM (DX)|LAM (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:NanoVirusGrenade (DX)|NanoVirusGrenade (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:SpyDrone (DX)|SpyDrone (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tracer (DX)|Tracer (DX)]]
 |   |       +&amp;ndash; [[Legacy:SniperTracer (DX)|SniperTracer (DX)]]
 |   +&amp;ndash; [[Legacy:Fragment (DX)|Fragment (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExFragment (DX)|DeusExFragment (DX)]]
 |           +&amp;ndash; [[Legacy:BloodDrop (DX)|BloodDrop (DX)]]
 |           +&amp;ndash; [[Legacy:FireComet (DX)|FireComet (DX)]]
 |           +&amp;ndash; [[Legacy:FleshFragment (DX)|FleshFragment (DX)]]
 |           +&amp;ndash; [[Legacy:GlassFragment (DX)|GlassFragment (DX)]]
 |           +&amp;ndash; [[Legacy:MetalFragment (DX)|MetalFragment (DX)]]
 |           +&amp;ndash; [[Legacy:PaperFragment (DX)|PaperFragment (DX)]]
 |           +&amp;ndash; [[Legacy:PlasticFragment (DX)|PlasticFragment (DX)]]
 |           +&amp;ndash; [[Legacy:Rockchip (DX)|Rockchip (DX)]]
 |           +&amp;ndash; [[Legacy:ShellCasing (DX)|ShellCasing (DX)]]
 |           |   +&amp;ndash; [[Legacy:ShellCasingSilent (DX)|ShellCasingSilent (DX)]]
 |           +&amp;ndash; [[Legacy:ShellCasing2 (DX)|ShellCasing2 (DX)]]
 |           +&amp;ndash; [[Legacy:SuperBall (DX)|SuperBall (DX)]]
 |           +&amp;ndash; [[Legacy:WoodFragment (DX)|WoodFragment (DX)]]
 +&amp;ndash; [[Legacy:Skill (DX)|Skill (DX)]]
 |   +&amp;ndash; [[Legacy:SkillComputer (DX)|SkillComputer (DX)]]
 |   +&amp;ndash; [[Legacy:SkillDemolition (DX)|SkillDemolition (DX)]]
 |   +&amp;ndash; [[Legacy:SkillEnviro (DX)|SkillEnviro (DX)]]
 |   +&amp;ndash; [[Legacy:SkillLockpicking (DX)|SkillLockpicking (DX)]]
 |   +&amp;ndash; [[Legacy:SkillMedicine (DX)|SkillMedicine (DX)]]
 |   +&amp;ndash; [[Legacy:SkillSwimming (DX)|SkillSwimming (DX)]]
 |   +&amp;ndash; [[Legacy:SkillTech (DX)|SkillTech (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponHeavy (DX)|SkillWeaponHeavy (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponLowTech (DX)|SkillWeaponLowTech (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponPistol (DX)|SkillWeaponPistol (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponRifle (DX)|SkillWeaponRifle (DX)]]
 +&amp;ndash; [[Legacy:SkillManager (DX)|SkillManager (DX)]]
 +&amp;ndash; [[Legacy:SmellNode (DX)|SmellNode (DX)]]
 +&amp;ndash; [[Legacy:SpawnNotify (DX)|SpawnNotify (DX)]]
 +&amp;ndash; [[Legacy:TraceHitSpawner (DX)|TraceHitSpawner (DX)]]
 |   +&amp;ndash; [[Legacy:TraceHitHandSpawner (DX)|TraceHitHandSpawner (DX)]]
 |   +&amp;ndash; [[Legacy:TraceHitNonPenSpawner (DX)|TraceHitNonPenSpawner (DX)]]
 |       +&amp;ndash; [[Legacy:TraceHitHandNonPenSpawner (DX)|TraceHitHandNonPenSpawner (DX)]]
 +&amp;ndash; [[Legacy:Triggers (DX)|Triggers (DX)]]
     +&amp;ndash; [[Legacy:Counter (DX)|Counter (DX)]]
     +&amp;ndash; [[Legacy:Dispatcher (DX)|Dispatcher (DX)]]
     +&amp;ndash; [[Legacy:MusicEvent (DX)|MusicEvent (DX)]]
     +&amp;ndash; [[Legacy:RoundRobin (DX)|RoundRobin (DX)]]
     +&amp;ndash; [[Legacy:SpecialEvent (DX)|SpecialEvent (DX)]]
     +&amp;ndash; [[Legacy:Trigger (DX)|Trigger (DX)]]
         +&amp;ndash; [[Legacy:AllianceTrigger (DX)|AllianceTrigger (DX)]]
         +&amp;ndash; [[Legacy:BeamTrigger (DX)|BeamTrigger (DX)]]
         +&amp;ndash; [[Legacy:ConversationTrigger (DX)|ConversationTrigger (DX)]]
         +&amp;ndash; [[Legacy:DamageTrigger (DX)|DamageTrigger (DX)]]
         +&amp;ndash; [[Legacy:DataLinkTrigger (DX)|DataLinkTrigger (DX)]]
         +&amp;ndash; [[Legacy:DirectionalTrigger (DX)|DirectionalTrigger (DX)]]
         +&amp;ndash; [[Legacy:FadeViewTrigger (DX)|FadeViewTrigger (DX)]]
         +&amp;ndash; [[Legacy:FlagTrigger (DX)|FlagTrigger (DX)]]
         +&amp;ndash; [[Legacy:GoalCompleteTrigger (DX)|GoalCompleteTrigger (DX)]]
         +&amp;ndash; [[Legacy:InterpolateTrigger (DX)|InterpolateTrigger (DX)]]
         +&amp;ndash; [[Legacy:LaserTrigger (DX)|LaserTrigger (DX)]]
         +&amp;ndash; [[Legacy:LogicTrigger (DX)|LogicTrigger (DX)]]
         +&amp;ndash; [[Legacy:OrdersTrigger (DX)|OrdersTrigger (DX)]]
         +&amp;ndash; [[Legacy:SenseTrigger (DX)|SenseTrigger (DX)]]
         +&amp;ndash; [[Legacy:SequenceTrigger (DX)|SequenceTrigger (DX)]]
         +&amp;ndash; [[Legacy:ShakeTrigger (DX)|ShakeTrigger (DX)]]
         +&amp;ndash; [[Legacy:SkillAwardTrigger (DX)|SkillAwardTrigger (DX)]]
         +&amp;ndash; [[Legacy:UnTrigger (DX)|UnTrigger (DX)]]
         +&amp;ndash; [[Legacy:ZoneTrigger (DX)|ZoneTrigger (DX)]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1538</id>
      <timestamp>2004-02-11T01:43:25Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>Moved out Inventory</comment>
      <text xml:space="preserve">[[Legacy:Actor (DX)|Actor (DX)]]
 +&amp;ndash; [[Legacy:Augmentation (DX)|Augmentation (DX)]]
 |   +&amp;ndash; [[Legacy:AugAqualung (DX)|AugAqualung (DX)]]
 |   +&amp;ndash; [[Legacy:AugBallistic (DX)|AugBallistic (DX)]]
 |   +&amp;ndash; [[Legacy:AugCloak (DX)|AugCloak (DX)]]
 |   +&amp;ndash; [[Legacy:AugCombat (DX)|AugCombat (DX)]]
 |   +&amp;ndash; [[Legacy:AugDatalink (DX)|AugDatalink (DX)]]
 |   +&amp;ndash; [[Legacy:AugDefense (DX)|AugDefense (DX)]]
 |   +&amp;ndash; [[Legacy:AugDrone (DX)|AugDrone (DX)]]
 |   +&amp;ndash; [[Legacy:AugEMP (DX)|AugEMP (DX)]]
 |   +&amp;ndash; [[Legacy:AugEnviro (DX)|AugEnviro (DX)]]
 |   +&amp;ndash; [[Legacy:AugHealing (DX)|AugHealing (DX)]]
 |   +&amp;ndash; [[Legacy:AugHeartLung (DX)|AugHeartLung (DX)]]
 |   +&amp;ndash; [[Legacy:AugIFF (DX)|AugIFF (DX)]]
 |   +&amp;ndash; [[Legacy:AugLight (DX)|AugLight (DX)]]
 |   +&amp;ndash; [[Legacy:AugMuscle (DX)|AugMuscle (DX)]]
 |   +&amp;ndash; [[Legacy:AugPower (DX)|AugPower (DX)]]
 |   +&amp;ndash; [[Legacy:AugRadarTrans (DX)|AugRadarTrans (DX)]]
 |   +&amp;ndash; [[Legacy:AugShield (DX)|AugShield (DX)]]
 |   +&amp;ndash; [[Legacy:AugSpeed (DX)|AugSpeed (DX)]]
 |   +&amp;ndash; [[Legacy:AugStealth (DX)|AugStealth (DX)]]
 |   +&amp;ndash; [[Legacy:AugTarget (DX)|AugTarget (DX)]]
 |   +&amp;ndash; [[Legacy:AugVision (DX)|AugVision (DX)]]
 +&amp;ndash; [[Legacy:AugmentationManager (DX)|AugmentationManager (DX)]]
 +&amp;ndash; [[Legacy:BarkManager (DX)|BarkManager (DX)]]
 +&amp;ndash; [[Legacy:Brush (DX)|Brush (DX)]]
 |   +&amp;ndash; [[Legacy:Mover (DX)|Mover (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExMover (DX)|DeusExMover (DX)]]
 |       |   +&amp;ndash; [[Legacy:BreakableGlass (DX)|BreakableGlass (DX)]]
 |       |   +&amp;ndash; [[Legacy:BreakableWall (DX)|BreakableWall (DX)]]
 |       +&amp;ndash; [[Legacy:ElevatorMover (DX)|ElevatorMover (DX)]]
 |       +&amp;ndash; [[Legacy:MultiMover (DX)|MultiMover (DX)]]
 +&amp;ndash; [[Legacy:ColorTheme (DX)|ColorTheme (DX)]]
 |   +&amp;ndash; [[Legacy:ColorThemeHUD (DX)|ColorThemeHUD (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Amber (DX)|ColorThemeHUD_Amber (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Cops (DX)|ColorThemeHUD_Cops (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Cyan (DX)|ColorThemeHUD_Cyan (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_DarkBlue (DX)|ColorThemeHUD_DarkBlue (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Default (DX)|ColorThemeHUD_Default (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_DesertStorm (DX)|ColorThemeHUD_DesertStorm (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_DriedBlood (DX)|ColorThemeHUD_DriedBlood (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Dusk (DX)|ColorThemeHUD_Dusk (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Grey (DX)|ColorThemeHUD_Grey (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_IonStorm (DX)|ColorThemeHUD_IonStorm (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Nightvision (DX)|ColorThemeHUD_Nightvision (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Ninja (DX)|ColorThemeHUD_Ninja (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_PaleGreen (DX)|ColorThemeHUD_PaleGreen (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Pastel (DX)|ColorThemeHUD_Pastel (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Plasma (DX)|ColorThemeHUD_Plasma (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Primaries (DX)|ColorThemeHUD_Primaries (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Purple (DX)|ColorThemeHUD_Purple (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Red (DX)|ColorThemeHUD_Red (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_SoylentGreen (DX)|ColorThemeHUD_SoylentGreen (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Starlight (DX)|ColorThemeHUD_Starlight (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_SteelGreen (DX)|ColorThemeHUD_SteelGreen (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Superhero (DX)|ColorThemeHUD_Superhero (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Terminator (DX)|ColorThemeHUD_Terminator (DX)]]
 |   |   +&amp;ndash; [[Legacy:ColorThemeHUD_Violet (DX)|ColorThemeHUD_Violet (DX)]]
 |   +&amp;ndash; [[Legacy:ColorThemeMenu (DX)|ColorThemeMenu (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Blue (DX)|ColorThemeMenu_Blue (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_BlueAndGold (DX)|ColorThemeMenu_BlueAndGold (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_CoolGreen (DX)|ColorThemeMenu_CoolGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Cops (DX)|ColorThemeMenu_Cops (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Cyan (DX)|ColorThemeMenu_Cyan (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Default (DX)|ColorThemeMenu_Default (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_DesertStorm (DX)|ColorThemeMenu_DesertStorm (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_DriedBlood (DX)|ColorThemeMenu_DriedBlood (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Dusk (DX)|ColorThemeMenu_Dusk (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Earth (DX)|ColorThemeMenu_Earth (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Green (DX)|ColorThemeMenu_Green (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Grey (DX)|ColorThemeMenu_Grey (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_IonStorm (DX)|ColorThemeMenu_IonStorm (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Lava (DX)|ColorThemeMenu_Lava (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_NightVision (DX)|ColorThemeMenu_NightVision (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Ninja (DX)|ColorThemeMenu_Ninja (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Olive (DX)|ColorThemeMenu_Olive (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_PaleGreen (DX)|ColorThemeMenu_PaleGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Pastel (DX)|ColorThemeMenu_Pastel (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Plasma (DX)|ColorThemeMenu_Plasma (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Primaries (DX)|ColorThemeMenu_Primaries (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Purple (DX)|ColorThemeMenu_Purple (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Red (DX)|ColorThemeMenu_Red (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Seawater (DX)|ColorThemeMenu_Seawater (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_SoylentGreen (DX)|ColorThemeMenu_SoylentGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Starlight (DX)|ColorThemeMenu_Starlight (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Steel (DX)|ColorThemeMenu_Steel (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_SteelGreen (DX)|ColorThemeMenu_SteelGreen (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Superhero (DX)|ColorThemeMenu_Superhero (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Terminator (DX)|ColorThemeMenu_Terminator (DX)]]
 |       +&amp;ndash; [[Legacy:ColorThemeMenu_Violet (DX)|ColorThemeMenu_Violet (DX)]]
 +&amp;ndash; [[Legacy:ColorThemeManager (DX)|ColorThemeManager (DX)]]
 +&amp;ndash; [[Legacy:ConPlayBark (DX)|ConPlayBark (DX)]]
 +&amp;ndash; [[Legacy:ConPlayBase (DX)|ConPlayBase (DX)]]
 |   +&amp;ndash; [[Legacy:ConPlay (DX)|ConPlay (DX)]]
 |   +&amp;ndash; [[Legacy:DataLinkPlay (DX)|DataLinkPlay (DX)]]
 +&amp;ndash; [[Legacy:DamageType (DX)|DamageType (DX)]]
 +&amp;ndash; [[Legacy:Decal (DX)|Decal (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExDecal (DX)|DeusExDecal (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmbrosiaPool (DX)|AmbrosiaPool (DX)]]
 |   |   +&amp;ndash; [[Legacy:BloodPool (DX)|BloodPool (DX)]]
 |   |   +&amp;ndash; [[Legacy:BloodSplat (DX)|BloodSplat (DX)]]
 |   |   +&amp;ndash; [[Legacy:BulletHole (DX)|BulletHole (DX)]]
 |   |   +&amp;ndash; [[Legacy:BurnMark (DX)|BurnMark (DX)]]
 |   |   +&amp;ndash; [[Legacy:ScorchMark (DX)|ScorchMark (DX)]]
 |   |   +&amp;ndash; [[Legacy:WaterPool (DX)|WaterPool (DX)]]
 |   +&amp;ndash; [[Legacy:Shadow (DX)|Shadow (DX)]]
 +&amp;ndash; [[Legacy:Decoration (DX)|Decoration (DX)]] &gt;&gt; (expanded in [[Legacy:Decoration Class Tree (DX)|Decoration Class Tree (DX)]]
 +&amp;ndash; [[Legacy:Effects (DX)|Effects (DX)]]
 |   +&amp;ndash; [[Legacy:AirBubble (DX)|AirBubble (DX)]]
 |   +&amp;ndash; [[Legacy:AnimatedSprite (DX)|AnimatedSprite (DX)]]
 |   |   +&amp;ndash; [[Legacy:ExplosionLarge (DX)|ExplosionLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:ExplosionMedium (DX)|ExplosionMedium (DX)]]
 |   |   +&amp;ndash; [[Legacy:ExplosionSmall (DX)|ExplosionSmall (DX)]]
 |   +&amp;ndash; [[Legacy:BloodSpurt (DX)|BloodSpurt (DX)]]
 |   +&amp;ndash; [[Legacy:EllipseEffect (DX)|EllipseEffect (DX)]]
 |   +&amp;ndash; [[Legacy:Fire (DX)|Fire (DX)]]
 |   |   +&amp;ndash; [[Legacy:SmokelessFire (DX)|SmokelessFire (DX)]]
 |   +&amp;ndash; [[Legacy:LaserEmitter (DX)|LaserEmitter (DX)]]
 |   |   +&amp;ndash; [[Legacy:ElectricityEmitter (DX)|ElectricityEmitter (DX)]]
 |   +&amp;ndash; [[Legacy:LaserProxy (DX)|LaserProxy (DX)]]
 |   +&amp;ndash; [[Legacy:LaserSpot (DX)|LaserSpot (DX)]]
 |   +&amp;ndash; [[Legacy:MoverHighlight (DX)|MoverHighlight (DX)]]
 |   +&amp;ndash; [[Legacy:MuzzleFlash (DX)|MuzzleFlash (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleGenerator (DX)|ParticleGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:WaterDrips (DX)|WaterDrips (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleProxy (DX)|ParticleProxy (DX)]]
 |   +&amp;ndash; [[Legacy:PawnGenerator (DX)|PawnGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:Fish2Generator (DX)|Fish2Generator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FishGenerator (DX)|FishGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlyGenerator (DX)|FlyGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:PedestrianGenerator (DX)|PedestrianGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:PigeonGenerator (DX)|PigeonGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:RatGenerator (DX)|RatGenerator (DX)]]
 |   |   +&amp;ndash; [[Legacy:SeagullGenerator (DX)|SeagullGenerator (DX)]]
 |   +&amp;ndash; [[Legacy:ProjectileGenerator (DX)|ProjectileGenerator (DX)]]
 |   +&amp;ndash; [[Legacy:ShieldEffect (DX)|ShieldEffect (DX)]]
 |   +&amp;ndash; [[Legacy:ShockRing (DX)|ShockRing (DX)]]
 |   +&amp;ndash; [[Legacy:SmokeTrail (DX)|SmokeTrail (DX)]]
 |   +&amp;ndash; [[Legacy:Spark (DX)|Spark (DX)]]
 |   +&amp;ndash; [[Legacy:SphereEffect (DX)|SphereEffect (DX)]]
 |   |   +&amp;ndash; [[Legacy:InvulnSphere (DX)|InvulnSphere (DX)]]
 |   +&amp;ndash; [[Legacy:TrashGenerator (DX)|TrashGenerator (DX)]]
 |   +&amp;ndash; [[Legacy:WaterRing (DX)|WaterRing (DX)]]
 +&amp;ndash; [[Legacy:HUD (DX)|HUD (DX)]]
 +&amp;ndash; [[Legacy:Info (DX)|Info (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExLevelInfo (DX)|DeusExLevelInfo (DX)]]
 |   +&amp;ndash; [[Legacy:GameInfo (DX)|GameInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DeusExGameInfo (DX)|DeusExGameInfo (DX)]]
 |   |       +&amp;ndash; [[Legacy:DeusExMPGame (DX)|DeusExMPGame (DX)]]
 |   |           +&amp;ndash; [[Legacy:DeathMatchGame (DX)|DeathMatchGame (DX)]]
 |   |           +&amp;ndash; [[Legacy:TeamDMGame (DX)|TeamDMGame (DX)]]
 |   |               +&amp;ndash; [[Legacy:AdvTeamDMGame (DX)|AdvTeamDMGame (DX)]]
 |   |               +&amp;ndash; [[Legacy:BasicTeamDMGame (DX)|BasicTeamDMGame (DX)]]
 |   +&amp;ndash; [[Legacy:InternetInfo (DX)|InternetInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:InternetLink (DX)|InternetLink (DX)]]
 |   |       +&amp;ndash; [[Legacy:TcpLink (DX)|TcpLink (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:UBrowserBufferedTcpLink (DX)|UBrowserBufferedTcpLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:DeusExGSpyLink (DX)|DeusExGSpyLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserGSpyLink (DX)|UBrowserGSpyLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserHTTPClient (DX)|UBrowserHTTPClient (DX)]]
 |   |       |       |   +&amp;ndash; [[Legacy:UBrowserUpdateServerLink (DX)|UBrowserUpdateServerLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserHTTPLink (DX)|UBrowserHTTPLink (DX)]]
 |   |       |       +&amp;ndash; [[Legacy:UBrowserIRCLink (DX)|UBrowserIRCLink (DX)]]
 |   |       +&amp;ndash; [[Legacy:UdpLink (DX)|UdpLink (DX)]]
 |   |           +&amp;ndash; [[Legacy:DeusExLocalLink (DX)|DeusExLocalLink (DX)]]
 |   |           +&amp;ndash; [[Legacy:DeusExServerPing (DX)|DeusExServerPing (DX)]]
 |   |           +&amp;ndash; [[Legacy:UBrowserLocalLink (DX)|UBrowserLocalLink (DX)]]
 |   |           +&amp;ndash; [[Legacy:UBrowserServerPing (DX)|UBrowserServerPing (DX)]]
 |   |           +&amp;ndash; [[Legacy:UdpBeacon (DX)|UdpBeacon (DX)]]
 |   |           |   +&amp;ndash; [[Legacy:ClientBeaconReceiver (DX)|ClientBeaconReceiver (DX)]]
 |   |           +&amp;ndash; [[Legacy:UdpServerQuery (DX)|UdpServerQuery (DX)]]
 |   |           +&amp;ndash; [[Legacy:UdpServerUplink (DX)|UdpServerUplink (DX)]]
 |   +&amp;ndash; [[Legacy:KillerProfile (DX)|KillerProfile (DX)]]
 |   +&amp;ndash; [[Legacy:LocalMessage (DX)|LocalMessage (DX)]]
 |   +&amp;ndash; [[Legacy:MapList (DX)|MapList (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXMapList (DX)|DXMapList (DX)]]
 |   +&amp;ndash; [[Legacy:MissionScript (DX)|MissionScript (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission00 (DX)|Mission00 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission01 (DX)|Mission01 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission02 (DX)|Mission02 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission03 (DX)|Mission03 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission04 (DX)|Mission04 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission05 (DX)|Mission05 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission06 (DX)|Mission06 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission08 (DX)|Mission08 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission09 (DX)|Mission09 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission10 (DX)|Mission10 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission11 (DX)|Mission11 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission12 (DX)|Mission12 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission14 (DX)|Mission14 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mission15 (DX)|Mission15 (DX)]]
 |   |   +&amp;ndash; [[Legacy:MissionEndgame (DX)|MissionEndgame (DX)]]
 |   |   +&amp;ndash; [[Legacy:MissionIntro (DX)|MissionIntro (DX)]]
 |   +&amp;ndash; [[Legacy:Mutator (DX)|Mutator (DX)]]
 |   +&amp;ndash; [[Legacy:ReplicationInfo (DX)|ReplicationInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:GameReplicationInfo (DX)|GameReplicationInfo (DX)]]
 |   |   +&amp;ndash; [[Legacy:PlayerReplicationInfo (DX)|PlayerReplicationInfo (DX)]]
 |   +&amp;ndash; [[Legacy:SavedMove (DX)|SavedMove (DX)]]
 |   +&amp;ndash; [[Legacy:ScoreBoard (DX)|ScoreBoard (DX)]]
 |   +&amp;ndash; [[Legacy:StatLog (DX)|StatLog (DX)]]
 |   |   +&amp;ndash; [[Legacy:StatLogFile (DX)|StatLogFile (DX)]]
 |   +&amp;ndash; [[Legacy:TestInfo (DX)|TestInfo (DX)]]
 |   +&amp;ndash; [[Legacy:VoicePack (DX)|VoicePack (DX)]]
 |   +&amp;ndash; [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]]
 |       +&amp;ndash; [[Legacy:LevelInfo (DX)|LevelInfo (DX)]]
 |       +&amp;ndash; [[Legacy:SkyZoneInfo (DX)|SkyZoneInfo (DX)]]
 |       +&amp;ndash; [[Legacy:WarpZoneInfo (DX)|WarpZoneInfo (DX)]]
 |       +&amp;ndash; [[Legacy:WaterZone (DX)|WaterZone (DX)]]
 +&amp;ndash; [[Legacy:Inventory (DX)|Inventory (DX)]] &gt;&gt; (expanded in [[Legacy:Inventory Class Tree (DX)|Inventory Class Tree (DX)]]
 +&amp;ndash; [[Legacy:Keypoint (DX)|Keypoint (DX)]]
 |   +&amp;ndash; [[Legacy:AmbientSound (DX)|AmbientSound (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmbientSoundTriggered (DX)|AmbientSoundTriggered (DX)]]
 |   +&amp;ndash; [[Legacy:BlockAll (DX)|BlockAll (DX)]]
 |   +&amp;ndash; [[Legacy:BlockMonsters (DX)|BlockMonsters (DX)]]
 |   +&amp;ndash; [[Legacy:BlockPlayer (DX)|BlockPlayer (DX)]]
 |   +&amp;ndash; [[Legacy:CameraPoint (DX)|CameraPoint (DX)]]
 |   +&amp;ndash; [[Legacy:InterpolationPoint (DX)|InterpolationPoint (DX)]]
 |   +&amp;ndash; [[Legacy:LocationID (DX)|LocationID (DX)]]
 |   +&amp;ndash; [[Legacy:MoverCollider (DX)|MoverCollider (DX)]]
 |   +&amp;ndash; [[Legacy:PickupDistributor (DX)|PickupDistributor (DX)]]
 |   +&amp;ndash; [[Legacy:RandomEvents (DX)|RandomEvents (DX)]]
 |   +&amp;ndash; [[Legacy:RandomSounds (DX)|RandomSounds (DX)]]
 |   +&amp;ndash; [[Legacy:SequenceEvents (DX)|SequenceEvents (DX)]]
 |   +&amp;ndash; [[Legacy:Timer (DX)|Timer (DX)]]
 |   +&amp;ndash; [[Legacy:WayBeacon (DX)|WayBeacon (DX)]]
 +&amp;ndash; [[Legacy:Light (DX)|Light (DX)]]
 |   +&amp;ndash; [[Legacy:Beam (DX)|Beam (DX)]]
 |   +&amp;ndash; [[Legacy:ConLight (DX)|ConLight (DX)]]
 |   +&amp;ndash; [[Legacy:ExplosionLight (DX)|ExplosionLight (DX)]]
 |   +&amp;ndash; [[Legacy:HighLight (DX)|HighLight (DX)]]
 |   +&amp;ndash; [[Legacy:Spotlight (DX)|Spotlight (DX)]]
 |   +&amp;ndash; [[Legacy:TriggerLight (DX)|TriggerLight (DX)]]
 +&amp;ndash; [[Legacy:Menu (DX)|Menu (DX)]]
 +&amp;ndash; [[Legacy:MPPlayerTrack (DX)|MPPlayerTrack (DX)]]
 +&amp;ndash; [[Legacy:NavigationPoint (DX)|NavigationPoint (DX)]]
 |   +&amp;ndash; [[Legacy:AmbushPoint (DX)|AmbushPoint (DX)]]
 |   +&amp;ndash; [[Legacy:ButtonMarker (DX)|ButtonMarker (DX)]]
 |   +&amp;ndash; [[Legacy:HidePoint (DX)|HidePoint (DX)]]
 |   +&amp;ndash; [[Legacy:HomeBase (DX)|HomeBase (DX)]]
 |   +&amp;ndash; [[Legacy:InventorySpot (DX)|InventorySpot (DX)]]
 |   +&amp;ndash; [[Legacy:LiftCenter (DX)|LiftCenter (DX)]]
 |   +&amp;ndash; [[Legacy:LiftExit (DX)|LiftExit (DX)]]
 |   +&amp;ndash; [[Legacy:MapExit (DX)|MapExit (DX)]]
 |   +&amp;ndash; [[Legacy:PathNode (DX)|PathNode (DX)]]
 |   +&amp;ndash; [[Legacy:PatrolPoint (DX)|PatrolPoint (DX)]]
 |   +&amp;ndash; [[Legacy:PlayerStart (DX)|PlayerStart (DX)]]
 |   +&amp;ndash; [[Legacy:SpawnPoint (DX)|SpawnPoint (DX)]]
 |   +&amp;ndash; [[Legacy:Teleporter (DX)|Teleporter (DX)]]
 |   +&amp;ndash; [[Legacy:TriggerMarker (DX)|TriggerMarker (DX)]]
 |   +&amp;ndash; [[Legacy:WanderPoint (DX)|WanderPoint (DX)]]
 |   +&amp;ndash; [[Legacy:WarpZoneMarker (DX)|WarpZoneMarker (DX)]]
 +&amp;ndash; [[Legacy:Pawn (DX)|Pawn (DX)]]
 |   +&amp;ndash; [[Legacy:GeneratorScout (DX)|GeneratorScout (DX)]]
 |   +&amp;ndash; [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]]
 |   |   +&amp;ndash; [[Legacy:Camera (DX)|Camera (DX)]]
 |   |   +&amp;ndash; [[Legacy:PlayerPawnExt (DX)|PlayerPawnExt (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:DeusExPlayer (DX)|DeusExPlayer (DX)]]
 |   |   |       +&amp;ndash; [[Legacy:Human (DX)|Human (DX)]]
 |   |   |           +&amp;ndash; [[Legacy:JCDentonMale (DX)|JCDentonMale (DX)]]
 |   |   |           +&amp;ndash; [[Legacy:MPMJ12 (DX)|MPMJ12 (DX)]]
 |   |   |           +&amp;ndash; [[Legacy:MPNSF (DX)|MPNSF (DX)]]
 |   |   |           +&amp;ndash; [[Legacy:MPUnatco (DX)|MPUnatco (DX)]]
 |   |   +&amp;ndash; [[Legacy:Spectator (DX)|Spectator (DX)]]
 |   |       +&amp;ndash; [[Legacy:MessagingSpectator (DX)|MessagingSpectator (DX)]]
 |   |           +&amp;ndash; [[Legacy:DemoRecSpectator (DX)|DemoRecSpectator (DX)]]
 |   +&amp;ndash; [[Legacy:Scout (DX)|Scout (DX)]]
 |   +&amp;ndash; [[Legacy:ScriptedPawn (DX)|ScriptedPawn (DX)]]
 |       +&amp;ndash; [[Legacy:Animal (DX)|Animal (DX)]]
 |       |   +&amp;ndash; [[Legacy:Bird (DX)|Bird (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:Pigeon (DX)|Pigeon (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:Seagull (DX)|Seagull (DX)]]
 |       |   +&amp;ndash; [[Legacy:Cat (DX)|Cat (DX)]]
 |       |   +&amp;ndash; [[Legacy:Dog (DX)|Dog (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:Doberman (DX)|Doberman (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:Mutt (DX)|Mutt (DX)]]
 |       |   +&amp;ndash; [[Legacy:Fishes (DX)|Fishes (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:Fish (DX)|Fish (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:Fish2 (DX)|Fish2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Fly (DX)|Fly (DX)]]
 |       |   +&amp;ndash; [[Legacy:Gray (DX)|Gray (DX)]]
 |       |   +&amp;ndash; [[Legacy:Greasel (DX)|Greasel (DX)]]
 |       |   +&amp;ndash; [[Legacy:Karkian (DX)|Karkian (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:KarkianBaby (DX)|KarkianBaby (DX)]]
 |       |   +&amp;ndash; [[Legacy:Rat (DX)|Rat (DX)]]
 |       +&amp;ndash; [[Legacy:HumanCivilian (DX)|HumanCivilian (DX)]]
 |       |   +&amp;ndash; [[Legacy:AlexJacobson (DX)|AlexJacobson (DX)]]
 |       |   +&amp;ndash; [[Legacy:Bartender (DX)|Bartender (DX)]]
 |       |   +&amp;ndash; [[Legacy:BoatPerson (DX)|BoatPerson (DX)]]
 |       |   +&amp;ndash; [[Legacy:BumFemale (DX)|BumFemale (DX)]]
 |       |   +&amp;ndash; [[Legacy:BumMale (DX)|BumMale (DX)]]
 |       |   +&amp;ndash; [[Legacy:BumMale2 (DX)|BumMale2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:BumMale3 (DX)|BumMale3 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Businessman1 (DX)|Businessman1 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Businessman2 (DX)|Businessman2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Businessman3 (DX)|Businessman3 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Businesswoman1 (DX)|Businesswoman1 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Butler (DX)|Butler (DX)]]
 |       |   +&amp;ndash; [[Legacy:Chef (DX)|Chef (DX)]]
 |       |   +&amp;ndash; [[Legacy:ChildMale (DX)|ChildMale (DX)]]
 |       |   +&amp;ndash; [[Legacy:ChildMale2 (DX)|ChildMale2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Doctor (DX)|Doctor (DX)]]
 |       |   +&amp;ndash; [[Legacy:Female1 (DX)|Female1 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Female2 (DX)|Female2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Female3 (DX)|Female3 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Female4 (DX)|Female4 (DX)]]
 |       |   +&amp;ndash; [[Legacy:FordSchick (DX)|FordSchick (DX)]]
 |       |   +&amp;ndash; [[Legacy:GarySavage (DX)|GarySavage (DX)]]
 |       |   +&amp;ndash; [[Legacy:GilbertRenton (DX)|GilbertRenton (DX)]]
 |       |   +&amp;ndash; [[Legacy:HarleyFilben (DX)|HarleyFilben (DX)]]
 |       |   +&amp;ndash; [[Legacy:Hooker1 (DX)|Hooker1 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Hooker2 (DX)|Hooker2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:HowardStrong (DX)|HowardStrong (DX)]]
 |       |   +&amp;ndash; [[Legacy:JaimeReyes (DX)|JaimeReyes (DX)]]
 |       |   +&amp;ndash; [[Legacy:Janitor (DX)|Janitor (DX)]]
 |       |   +&amp;ndash; [[Legacy:JoeGreene (DX)|JoeGreene (DX)]]
 |       |   +&amp;ndash; [[Legacy:JordanShea (DX)|JordanShea (DX)]]
 |       |   +&amp;ndash; [[Legacy:JunkieFemale (DX)|JunkieFemale (DX)]]
 |       |   +&amp;ndash; [[Legacy:JunkieMale (DX)|JunkieMale (DX)]]
 |       |   +&amp;ndash; [[Legacy:LowerClassFemale (DX)|LowerClassFemale (DX)]]
 |       |   +&amp;ndash; [[Legacy:LowerClassMale (DX)|LowerClassMale (DX)]]
 |       |   +&amp;ndash; [[Legacy:LowerClassMale2 (DX)|LowerClassMale2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:MaggieChow (DX)|MaggieChow (DX)]]
 |       |   +&amp;ndash; [[Legacy:Maid (DX)|Maid (DX)]]
 |       |   +&amp;ndash; [[Legacy:Male1 (DX)|Male1 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Male2 (DX)|Male2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Male3 (DX)|Male3 (DX)]]
 |       |   +&amp;ndash; [[Legacy:Male4 (DX)|Male4 (DX)]]
 |       |   +&amp;ndash; [[Legacy:MargaretWilliams (DX)|MargaretWilliams (DX)]]
 |       |   +&amp;ndash; [[Legacy:Mechanic (DX)|Mechanic (DX)]]
 |       |   +&amp;ndash; [[Legacy:MichaelHamner (DX)|MichaelHamner (DX)]]
 |       |   +&amp;ndash; [[Legacy:MorganEverett (DX)|MorganEverett (DX)]]
 |       |   +&amp;ndash; [[Legacy:NathanMadison (DX)|NathanMadison (DX)]]
 |       |   +&amp;ndash; [[Legacy:Nurse (DX)|Nurse (DX)]]
 |       |   +&amp;ndash; [[Legacy:PhilipMead (DX)|PhilipMead (DX)]]
 |       |   +&amp;ndash; [[Legacy:RachelMead (DX)|RachelMead (DX)]]
 |       |   +&amp;ndash; [[Legacy:Sailor (DX)|Sailor (DX)]]
 |       |   +&amp;ndash; [[Legacy:SandraRenton (DX)|SandraRenton (DX)]]
 |       |   +&amp;ndash; [[Legacy:SarahMead (DX)|SarahMead (DX)]]
 |       |   +&amp;ndash; [[Legacy:ScientistFemale (DX)|ScientistFemale (DX)]]
 |       |   +&amp;ndash; [[Legacy:ScientistMale (DX)|ScientistMale (DX)]]
 |       |   +&amp;ndash; [[Legacy:ScubaDiver (DX)|ScubaDiver (DX)]]
 |       |   +&amp;ndash; [[Legacy:Secretary (DX)|Secretary (DX)]]
 |       |   +&amp;ndash; [[Legacy:SecretService (DX)|SecretService (DX)]]
 |       |   +&amp;ndash; [[Legacy:StantonDowd (DX)|StantonDowd (DX)]]
 |       |   +&amp;ndash; [[Legacy:TiffanySavage (DX)|TiffanySavage (DX)]]
 |       |   +&amp;ndash; [[Legacy:TracerTong (DX)|TracerTong (DX)]]
 |       +&amp;ndash; [[Legacy:HumanMilitary (DX)|HumanMilitary (DX)]]
 |       |   +&amp;ndash; [[Legacy:AnnaNavarre (DX)|AnnaNavarre (DX)]]
 |       |   +&amp;ndash; [[Legacy:BobPage (DX)|BobPage (DX)]]
 |       |   +&amp;ndash; [[Legacy:Cop (DX)|Cop (DX)]]
 |       |   +&amp;ndash; [[Legacy:GordonQuick (DX)|GordonQuick (DX)]]
 |       |   +&amp;ndash; [[Legacy:GuntherHermann (DX)|GuntherHermann (DX)]]
 |       |   +&amp;ndash; [[Legacy:HKMilitary (DX)|HKMilitary (DX)]]
 |       |   +&amp;ndash; [[Legacy:JCDouble (DX)|JCDouble (DX)]]
 |       |   +&amp;ndash; [[Legacy:Jock (DX)|Jock (DX)]]
 |       |   +&amp;ndash; [[Legacy:JosephManderley (DX)|JosephManderley (DX)]]
 |       |   +&amp;ndash; [[Legacy:JuanLebedev (DX)|JuanLebedev (DX)]]
 |       |   +&amp;ndash; [[Legacy:MaxChen (DX)|MaxChen (DX)]]
 |       |   +&amp;ndash; [[Legacy:MIB (DX)|MIB (DX)]]
 |       |   +&amp;ndash; [[Legacy:MJ12Commando (DX)|MJ12Commando (DX)]]
 |       |   +&amp;ndash; [[Legacy:MJ12Troop (DX)|MJ12Troop (DX)]]
 |       |   +&amp;ndash; [[Legacy:PaulDenton (DX)|PaulDenton (DX)]]
 |       |   +&amp;ndash; [[Legacy:RiotCop (DX)|RiotCop (DX)]]
 |       |   +&amp;ndash; [[Legacy:SamCarter (DX)|SamCarter (DX)]]
 |       |   +&amp;ndash; [[Legacy:Soldier (DX)|Soldier (DX)]]
 |       |   +&amp;ndash; [[Legacy:Terrorist (DX)|Terrorist (DX)]]
 |       |   +&amp;ndash; [[Legacy:UNATCOTroop (DX)|UNATCOTroop (DX)]]
 |       |   +&amp;ndash; [[Legacy:WaltonSimons (DX)|WaltonSimons (DX)]]
 |       |   +&amp;ndash; [[Legacy:WIB (DX)|WIB (DX)]]
 |       +&amp;ndash; [[Legacy:HumanThug (DX)|HumanThug (DX)]]
 |       |   +&amp;ndash; [[Legacy:Chad (DX)|Chad (DX)]]
 |       |   +&amp;ndash; [[Legacy:JoJoFine (DX)|JoJoFine (DX)]]
 |       |   +&amp;ndash; [[Legacy:NicoletteDuClare (DX)|NicoletteDuClare (DX)]]
 |       |   +&amp;ndash; [[Legacy:Smuggler (DX)|Smuggler (DX)]]
 |       |   +&amp;ndash; [[Legacy:TerroristCommander (DX)|TerroristCommander (DX)]]
 |       |   +&amp;ndash; [[Legacy:ThugMale (DX)|ThugMale (DX)]]
 |       |   +&amp;ndash; [[Legacy:ThugMale2 (DX)|ThugMale2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:ThugMale3 (DX)|ThugMale3 (DX)]]
 |       |   +&amp;ndash; [[Legacy:TobyAtanwe (DX)|TobyAtanwe (DX)]]
 |       |   +&amp;ndash; [[Legacy:TriadLumPath (DX)|TriadLumPath (DX)]]
 |       |   +&amp;ndash; [[Legacy:TriadLumPath2 (DX)|TriadLumPath2 (DX)]]
 |       |   +&amp;ndash; [[Legacy:TriadRedArrow (DX)|TriadRedArrow (DX)]]
 |       +&amp;ndash; [[Legacy:Robot (DX)|Robot (DX)]]
 |           +&amp;ndash; [[Legacy:CleanerBot (DX)|CleanerBot (DX)]]
 |           +&amp;ndash; [[Legacy:MedicalBot (DX)|MedicalBot (DX)]]
 |           +&amp;ndash; [[Legacy:MilitaryBot (DX)|MilitaryBot (DX)]]
 |           +&amp;ndash; [[Legacy:RepairBot (DX)|RepairBot (DX)]]
 |           +&amp;ndash; [[Legacy:SecurityBot2 (DX)|SecurityBot2 (DX)]]
 |           +&amp;ndash; [[Legacy:SecurityBot3 (DX)|SecurityBot3 (DX)]]
 |           +&amp;ndash; [[Legacy:SecurityBot4 (DX)|SecurityBot4 (DX)]]
 |           +&amp;ndash; [[Legacy:SpiderBot (DX)|SpiderBot (DX)]]
 |           +&amp;ndash; [[Legacy:SpiderBot2 (DX)|SpiderBot2 (DX)]]
 +&amp;ndash; [[Legacy:Projectile (DX)|Projectile (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExProjectile (DX)|DeusExProjectile (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cloud (DX)|Cloud (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:HalonGas (DX)|HalonGas (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:PoisonGas (DX)|PoisonGas (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:TearGas (DX)|TearGas (DX)]]
 |   |   +&amp;ndash; [[Legacy:Dart (DX)|Dart (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:DartFlare (DX)|DartFlare (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:DartPoison (DX)|DartPoison (DX)]]
 |   |   +&amp;ndash; [[Legacy:Fireball (DX)|Fireball (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:FireballRocket (DX)|FireballRocket (DX)]]
 |   |   +&amp;ndash; [[Legacy:GraySpit (DX)|GraySpit (DX)]]
 |   |   +&amp;ndash; [[Legacy:GreaselSpit (DX)|GreaselSpit (DX)]]
 |   |   +&amp;ndash; [[Legacy:HECannister20mm (DX)|HECannister20mm (DX)]]
 |   |   +&amp;ndash; [[Legacy:PlasmaBolt (DX)|PlasmaBolt (DX)]]
 |   |   +&amp;ndash; [[Legacy:Rocket (DX)|Rocket (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketLAW (DX)|RocketLAW (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketMini (DX)|RocketMini (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketRobot (DX)|RocketRobot (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RocketWP (DX)|RocketWP (DX)]]
 |   |   +&amp;ndash; [[Legacy:Shuriken (DX)|Shuriken (DX)]]
 |   |   +&amp;ndash; [[Legacy:ThrownProjectile (DX)|ThrownProjectile (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:EMPGrenade (DX)|EMPGrenade (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:GasGrenade (DX)|GasGrenade (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:LAM (DX)|LAM (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:NanoVirusGrenade (DX)|NanoVirusGrenade (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:SpyDrone (DX)|SpyDrone (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tracer (DX)|Tracer (DX)]]
 |   |       +&amp;ndash; [[Legacy:SniperTracer (DX)|SniperTracer (DX)]]
 |   +&amp;ndash; [[Legacy:Fragment (DX)|Fragment (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExFragment (DX)|DeusExFragment (DX)]]
 |           +&amp;ndash; [[Legacy:BloodDrop (DX)|BloodDrop (DX)]]
 |           +&amp;ndash; [[Legacy:FireComet (DX)|FireComet (DX)]]
 |           +&amp;ndash; [[Legacy:FleshFragment (DX)|FleshFragment (DX)]]
 |           +&amp;ndash; [[Legacy:GlassFragment (DX)|GlassFragment (DX)]]
 |           +&amp;ndash; [[Legacy:MetalFragment (DX)|MetalFragment (DX)]]
 |           +&amp;ndash; [[Legacy:PaperFragment (DX)|PaperFragment (DX)]]
 |           +&amp;ndash; [[Legacy:PlasticFragment (DX)|PlasticFragment (DX)]]
 |           +&amp;ndash; [[Legacy:Rockchip (DX)|Rockchip (DX)]]
 |           +&amp;ndash; [[Legacy:ShellCasing (DX)|ShellCasing (DX)]]
 |           |   +&amp;ndash; [[Legacy:ShellCasingSilent (DX)|ShellCasingSilent (DX)]]
 |           +&amp;ndash; [[Legacy:ShellCasing2 (DX)|ShellCasing2 (DX)]]
 |           +&amp;ndash; [[Legacy:SuperBall (DX)|SuperBall (DX)]]
 |           +&amp;ndash; [[Legacy:WoodFragment (DX)|WoodFragment (DX)]]
 +&amp;ndash; [[Legacy:Skill (DX)|Skill (DX)]]
 |   +&amp;ndash; [[Legacy:SkillComputer (DX)|SkillComputer (DX)]]
 |   +&amp;ndash; [[Legacy:SkillDemolition (DX)|SkillDemolition (DX)]]
 |   +&amp;ndash; [[Legacy:SkillEnviro (DX)|SkillEnviro (DX)]]
 |   +&amp;ndash; [[Legacy:SkillLockpicking (DX)|SkillLockpicking (DX)]]
 |   +&amp;ndash; [[Legacy:SkillMedicine (DX)|SkillMedicine (DX)]]
 |   +&amp;ndash; [[Legacy:SkillSwimming (DX)|SkillSwimming (DX)]]
 |   +&amp;ndash; [[Legacy:SkillTech (DX)|SkillTech (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponHeavy (DX)|SkillWeaponHeavy (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponLowTech (DX)|SkillWeaponLowTech (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponPistol (DX)|SkillWeaponPistol (DX)]]
 |   +&amp;ndash; [[Legacy:SkillWeaponRifle (DX)|SkillWeaponRifle (DX)]]
 +&amp;ndash; [[Legacy:SkillManager (DX)|SkillManager (DX)]]
 +&amp;ndash; [[Legacy:SmellNode (DX)|SmellNode (DX)]]
 +&amp;ndash; [[Legacy:SpawnNotify (DX)|SpawnNotify (DX)]]
 +&amp;ndash; [[Legacy:TraceHitSpawner (DX)|TraceHitSpawner (DX)]]
 |   +&amp;ndash; [[Legacy:TraceHitHandSpawner (DX)|TraceHitHandSpawner (DX)]]
 |   +&amp;ndash; [[Legacy:TraceHitNonPenSpawner (DX)|TraceHitNonPenSpawner (DX)]]
 |       +&amp;ndash; [[Legacy:TraceHitHandNonPenSpawner (DX)|TraceHitHandNonPenSpawner (DX)]]
 +&amp;ndash; [[Legacy:Triggers (DX)|Triggers (DX)]]
     +&amp;ndash; [[Legacy:Counter (DX)|Counter (DX)]]
     +&amp;ndash; [[Legacy:Dispatcher (DX)|Dispatcher (DX)]]
     +&amp;ndash; [[Legacy:MusicEvent (DX)|MusicEvent (DX)]]
     +&amp;ndash; [[Legacy:RoundRobin (DX)|RoundRobin (DX)]]
     +&amp;ndash; [[Legacy:SpecialEvent (DX)|SpecialEvent (DX)]]
     +&amp;ndash; [[Legacy:Trigger (DX)|Trigger (DX)]]
         +&amp;ndash; [[Legacy:AllianceTrigger (DX)|AllianceTrigger (DX)]]
         +&amp;ndash; [[Legacy:BeamTrigger (DX)|BeamTrigger (DX)]]
         +&amp;ndash; [[Legacy:ConversationTrigger (DX)|ConversationTrigger (DX)]]
         +&amp;ndash; [[Legacy:DamageTrigger (DX)|DamageTrigger (DX)]]
         +&amp;ndash; [[Legacy:DataLinkTrigger (DX)|DataLinkTrigger (DX)]]
         +&amp;ndash; [[Legacy:DirectionalTrigger (DX)|DirectionalTrigger (DX)]]
         +&amp;ndash; [[Legacy:FadeViewTrigger (DX)|FadeViewTrigger (DX)]]
         +&amp;ndash; [[Legacy:FlagTrigger (DX)|FlagTrigger (DX)]]
         +&amp;ndash; [[Legacy:GoalCompleteTrigger (DX)|GoalCompleteTrigger (DX)]]
         +&amp;ndash; [[Legacy:InterpolateTrigger (DX)|InterpolateTrigger (DX)]]
         +&amp;ndash; [[Legacy:LaserTrigger (DX)|LaserTrigger (DX)]]
         +&amp;ndash; [[Legacy:LogicTrigger (DX)|LogicTrigger (DX)]]
         +&amp;ndash; [[Legacy:OrdersTrigger (DX)|OrdersTrigger (DX)]]
         +&amp;ndash; [[Legacy:SenseTrigger (DX)|SenseTrigger (DX)]]
         +&amp;ndash; [[Legacy:SequenceTrigger (DX)|SequenceTrigger (DX)]]
         +&amp;ndash; [[Legacy:ShakeTrigger (DX)|ShakeTrigger (DX)]]
         +&amp;ndash; [[Legacy:SkillAwardTrigger (DX)|SkillAwardTrigger (DX)]]
         +&amp;ndash; [[Legacy:UnTrigger (DX)|UnTrigger (DX)]]
         +&amp;ndash; [[Legacy:ZoneTrigger (DX)|ZoneTrigger (DX)]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>39970</id>
      <timestamp>2009-11-14T18:52:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>delinked non-existing pages to cut down the number of wanted pages</comment>
      <text xml:space="preserve"> [[Legacy:Actor (DX)|Actor]]
 +- [[Legacy:Augmentation (DX)|Augmentation]]
 |   +- AugAqualung
 |   +- AugBallistic
 |   +- AugCloak
 |   +- AugCombat
 |   +- AugDatalink
 |   +- AugDefense
 |   +- AugDrone
 |   +- AugEMP
 |   +- AugEnviro
 |   +- AugHealing
 |   +- AugHeartLung
 |   +- AugIFF
 |   +- AugLight
 |   +- AugMuscle
 |   +- AugPower
 |   +- AugRadarTrans
 |   +- AugShield
 |   +- AugSpeed
 |   +- AugStealth
 |   +- AugTarget
 |   +- AugVision
 +- AugmentationManager
 +- BarkManager
 +- Brush
 |   +- Mover
 |       +- DeusExMover
 |       |   +- BreakableGlass
 |       |   +- BreakableWall
 |       +- ElevatorMover
 |       +- MultiMover
 +- ColorTheme
 |   +- ColorThemeHUD
 |   |   +- ColorThemeHUD_Amber
 |   |   +- ColorThemeHUD_Cops
 |   |   +- ColorThemeHUD_Cyan
 |   |   +- ColorThemeHUD_DarkBlue
 |   |   +- ColorThemeHUD_Default
 |   |   +- ColorThemeHUD_DesertStorm
 |   |   +- ColorThemeHUD_DriedBlood
 |   |   +- ColorThemeHUD_Dusk
 |   |   +- ColorThemeHUD_Grey
 |   |   +- ColorThemeHUD_IonStorm
 |   |   +- ColorThemeHUD_Nightvision
 |   |   +- ColorThemeHUD_Ninja
 |   |   +- ColorThemeHUD_PaleGreen
 |   |   +- ColorThemeHUD_Pastel
 |   |   +- ColorThemeHUD_Plasma
 |   |   +- ColorThemeHUD_Primaries
 |   |   +- ColorThemeHUD_Purple
 |   |   +- ColorThemeHUD_Red
 |   |   +- ColorThemeHUD_SoylentGreen
 |   |   +- ColorThemeHUD_Starlight
 |   |   +- ColorThemeHUD_SteelGreen
 |   |   +- ColorThemeHUD_Superhero
 |   |   +- ColorThemeHUD_Terminator
 |   |   +- ColorThemeHUD_Violet
 |   +- ColorThemeMenu
 |       +- ColorThemeMenu_Blue
 |       +- ColorThemeMenu_BlueAndGold
 |       +- ColorThemeMenu_CoolGreen
 |       +- ColorThemeMenu_Cops
 |       +- ColorThemeMenu_Cyan
 |       +- ColorThemeMenu_Default
 |       +- ColorThemeMenu_DesertStorm
 |       +- ColorThemeMenu_DriedBlood
 |       +- ColorThemeMenu_Dusk
 |       +- ColorThemeMenu_Earth
 |       +- ColorThemeMenu_Green
 |       +- ColorThemeMenu_Grey
 |       +- ColorThemeMenu_IonStorm
 |       +- ColorThemeMenu_Lava
 |       +- ColorThemeMenu_NightVision
 |       +- ColorThemeMenu_Ninja
 |       +- ColorThemeMenu_Olive
 |       +- ColorThemeMenu_PaleGreen
 |       +- ColorThemeMenu_Pastel
 |       +- ColorThemeMenu_Plasma
 |       +- ColorThemeMenu_Primaries
 |       +- ColorThemeMenu_Purple
 |       +- ColorThemeMenu_Red
 |       +- ColorThemeMenu_Seawater
 |       +- ColorThemeMenu_SoylentGreen
 |       +- ColorThemeMenu_Starlight
 |       +- ColorThemeMenu_Steel
 |       +- ColorThemeMenu_SteelGreen
 |       +- ColorThemeMenu_Superhero
 |       +- ColorThemeMenu_Terminator
 |       +- ColorThemeMenu_Violet
 +- ColorThemeManager
 +- ConPlayBark
 +- ConPlayBase
 |   +- ConPlay
 |   +- DataLinkPlay
 +- DamageType
 +- [[Legacy:Decal (DX)|Decal]]
 |   +- DeusExDecal
 |   |   +- AmbrosiaPool
 |   |   +- BloodPool
 |   |   +- BloodSplat
 |   |   +- BulletHole
 |   |   +- BurnMark
 |   |   +- ScorchMark
 |   |   +- WaterPool
 |   +- Shadow
 +- [[Legacy:Decoration (DX)|Decoration]] &gt;&gt; (expanded in [[Legacy:Decoration Class Tree (DX)|Decoration Class Tree]]
 +- Effects
 |   +- AirBubble
 |   +- AnimatedSprite
 |   |   +- ExplosionLarge
 |   |   +- ExplosionMedium
 |   |   +- ExplosionSmall
 |   +- BloodSpurt
 |   +- EllipseEffect
 |   +- Fire
 |   |   +- SmokelessFire
 |   +- LaserEmitter
 |   |   +- ElectricityEmitter
 |   +- LaserProxy
 |   +- LaserSpot
 |   +- MoverHighlight
 |   +- MuzzleFlash
 |   +- ParticleGenerator
 |   |   +- WaterDrips
 |   +- ParticleProxy
 |   +- PawnGenerator
 |   |   +- Fish2Generator
 |   |   +- FishGenerator
 |   |   +- FlyGenerator
 |   |   +- PedestrianGenerator
 |   |   +- PigeonGenerator
 |   |   +- RatGenerator
 |   |   +- SeagullGenerator
 |   +- ProjectileGenerator
 |   +- ShieldEffect
 |   +- ShockRing
 |   +- SmokeTrail
 |   +- Spark
 |   +- SphereEffect
 |   |   +- InvulnSphere
 |   +- TrashGenerator
 |   +- WaterRing
 +- HUD
 +- Info
 |   +- DeusExLevelInfo
 |   +- [[Legacy:GameInfo (DX)|GameInfo]]
 |   |   +- DeusExGameInfo
 |   |       +- DeusExMPGame
 |   |           +- DeathMatchGame
 |   |           +- TeamDMGame
 |   |               +- AdvTeamDMGame
 |   |               +- BasicTeamDMGame
 |   +- InternetInfo
 |   |   +- InternetLink
 |   |       +- TcpLink
 |   |       |   +- UBrowserBufferedTcpLink
 |   |       |       +- DeusExGSpyLink
 |   |       |       +- UBrowserGSpyLink
 |   |       |       +- UBrowserHTTPClient
 |   |       |       |   +- UBrowserUpdateServerLink
 |   |       |       +- UBrowserHTTPLink
 |   |       |       +- UBrowserIRCLink
 |   |       +- UdpLink
 |   |           +- DeusExLocalLink
 |   |           +- DeusExServerPing
 |   |           +- UBrowserLocalLink
 |   |           +- UBrowserServerPing
 |   |           +- UdpBeacon
 |   |           |   +- ClientBeaconReceiver
 |   |           +- UdpServerQuery
 |   |           +- UdpServerUplink
 |   +- KillerProfile
 |   +- LocalMessage
 |   +- MapList
 |   |   +- DXMapList
 |   +- MissionScript
 |   |   +- Mission00
 |   |   +- Mission01
 |   |   +- Mission02
 |   |   +- Mission03
 |   |   +- Mission04
 |   |   +- Mission05
 |   |   +- Mission06
 |   |   +- Mission08
 |   |   +- Mission09
 |   |   +- Mission10
 |   |   +- Mission11
 |   |   +- Mission12
 |   |   +- Mission14
 |   |   +- Mission15
 |   |   +- MissionEndgame
 |   |   +- MissionIntro
 |   +- Mutator
 |   +- ReplicationInfo
 |   |   +- GameReplicationInfo
 |   |   +- PlayerReplicationInfo
 |   +- SavedMove
 |   +- ScoreBoard
 |   +- StatLog
 |   |   +- StatLogFile
 |   +- TestInfo
 |   +- VoicePack
 |   +- ZoneInfo
 |       +- [[Legacy:LevelInfo (DX)|LevelInfo]]
 |       +- SkyZoneInfo
 |       +- WarpZoneInfo
 |       +- WaterZone
 +- [[Legacy:Inventory (DX)|Inventory]] &gt;&gt; (expanded in [[Legacy:Inventory Class Tree (DX)|Inventory Class Tree]]
 +- Keypoint
 |   +- AmbientSound
 |   |   +- AmbientSoundTriggered
 |   +- BlockAll
 |   +- BlockMonsters
 |   +- BlockPlayer
 |   +- CameraPoint
 |   +- InterpolationPoint
 |   +- LocationID
 |   +- MoverCollider
 |   +- PickupDistributor
 |   +- RandomEvents
 |   +- RandomSounds
 |   +- SequenceEvents
 |   +- Timer
 |   +- WayBeacon
 +- Light
 |   +- Beam
 |   +- ConLight
 |   +- ExplosionLight
 |   +- HighLight
 |   +- Spotlight
 |   +- TriggerLight
 +- Menu
 +- MPPlayerTrack
 +- NavigationPoint
 |   +- AmbushPoint
 |   +- ButtonMarker
 |   +- HidePoint
 |   +- HomeBase
 |   +- InventorySpot
 |   +- LiftCenter
 |   +- LiftExit
 |   +- MapExit
 |   +- PathNode
 |   +- PatrolPoint
 |   +- PlayerStart
 |   +- SpawnPoint
 |   +- Teleporter
 |   +- TriggerMarker
 |   +- WanderPoint
 |   +- WarpZoneMarker
 +- [[Legacy:Pawn (DX)|Pawn]] &gt;&gt; (expanded in [[Legacy:Pawn Class Tree (DX)|Pawn Class Tree]]
 +- Projectile
 |   +- DeusExProjectile
 |   |   +- Cloud
 |   |   |   +- HalonGas
 |   |   |   +- PoisonGas
 |   |   |   +- TearGas
 |   |   +- Dart
 |   |   |   +- DartFlare
 |   |   |   +- DartPoison
 |   |   +- Fireball
 |   |   |   +- FireballRocket
 |   |   +- GraySpit
 |   |   +- GreaselSpit
 |   |   +- HECannister20mm
 |   |   +- PlasmaBolt
 |   |   +- Rocket
 |   |   |   +- RocketLAW
 |   |   |   +- RocketMini
 |   |   |   +- RocketRobot
 |   |   |   +- RocketWP
 |   |   +- Shuriken
 |   |   +- ThrownProjectile
 |   |   |   +- EMPGrenade
 |   |   |   +- GasGrenade
 |   |   |   +- LAM
 |   |   |   +- NanoVirusGrenade
 |   |   |   +- SpyDrone
 |   |   +- Tracer
 |   |       +- SniperTracer
 |   +- [[Legacy:Fragment (DX)|Fragment]]
 |       +- DeusExFragment
 |           +- BloodDrop
 |           +- FireComet
 |           +- FleshFragment
 |           +- GlassFragment
 |           +- MetalFragment
 |           +- PaperFragment
 |           +- PlasticFragment
 |           +- Rockchip
 |           +- ShellCasing
 |           |   +- ShellCasingSilent
 |           +- ShellCasing2
 |           +- SuperBall
 |           +- WoodFragment
 +- Skill
 |   +- SkillComputer
 |   +- SkillDemolition
 |   +- SkillEnviro
 |   +- SkillLockpicking
 |   +- SkillMedicine
 |   +- SkillSwimming
 |   +- SkillTech
 |   +- SkillWeaponHeavy
 |   +- SkillWeaponLowTech
 |   +- SkillWeaponPistol
 |   +- SkillWeaponRifle
 +- SkillManager
 +- SmellNode
 +- SpawnNotify
 +- TraceHitSpawner
 |   +- TraceHitHandSpawner
 |   +- TraceHitNonPenSpawner
 |       +- TraceHitHandNonPenSpawner
 +- Triggers
     +- Counter
     +- Dispatcher
     +- MusicEvent
     +- RoundRobin
     +- SpecialEvent
     +- Trigger
         +- AllianceTrigger
         +- BeamTrigger
         +- ConversationTrigger
         +- DamageTrigger
         +- DataLinkTrigger
         +- DirectionalTrigger
         +- FadeViewTrigger
         +- FlagTrigger
         +- GoalCompleteTrigger
         +- InterpolateTrigger
         +- LaserTrigger
         +- LogicTrigger
         +- OrdersTrigger
         +- SenseTrigger
         +- SequenceTrigger
         +- ShakeTrigger
         +- SkillAwardTrigger
         +- UnTrigger
         +- ZoneTrigger

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Class Hierarchy (P2)</title>
    <id>479</id>
    <revision>
      <id>1539</id>
      <timestamp>2007-05-25T00:53:59Z</timestamp>
      <contributor>
        <ip>CPE-124-178-60-99.wa.bigpond.net.au</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">his is the [[Legacy:Class Tree|class tree]] extending from Actor in [[Legacy:Postal 2|Postal 2]].  For a class tree for [[Legacy:Info|Info]] see [[Legacy:Info Class Hierarchy (P2)|Info Class Hierarchy (P2)]].

{{classbox| [[Image:Legacy_P2.png|]] [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; ''etc.'' (Package: ''packagename'')}}

If you want to add information on a [[Legacy:Postal 2|Postal 2]] class:

* Put a link here to the class you want to describe.
* If the link is taken by a Unreal Tournament class then, in that class:
* # Put a link to &quot;{classname} (P2)&quot;, substituting the current classname
* # Move all the text from the page to this new page.

Key:
* &quot;&gt;&gt;&quot; means that class' subtree is expanded on the class page.
* Classes that exist only in Postal 2 should be labelled as such.
* The word &quot;unused&quot; indicates that this actor class is not used in Postal 2.

 [[Legacy:Actor|Actor]]
 +- [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
 +- [[Legacy:AnimNotifyActor|AnimNotifyActor]]
 +- [[Legacy:Bleeper|Bleeper]]
 +- [[Legacy:Brush|Brush]]
 |  +- [[Legacy:Volume|Volume]]
 |     +- [[Legacy:BlockingVolume|BlockingVolume]]
 |     |  +- [[Legacy:PathBlockingVolume|PathBlockingVolume]]
 |     +- [[Legacy:PhysicsVolume|PhysicsVolume]]
 |     |  +- [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]]
 |     |  +- [[Legacy:InterestVolume|InterestVolume]]
 |     |  +- [[Legacy:LadderVolume|LadderVolume]]
 |     +- [[Legacy:SnipingVolume (P2)|SnipingVolume (P2)]]
 +- [[Legacy:BulletHitPack|BulletHitPack]] '''(not expanded)'''
 +- [[Legacy:Cheerleaders|Cheerleaders]] &gt;&gt;
 +- [[Legacy:Controller|Controller]]
 |  +- [[Legacy:AIController|AIController]]
 |  |  +- [[Legacy:ScriptedController (P2)|ScriptedController (P2)]]
 |  |     +- [[Legacy:Bot (P2)|Bot (P2)]]
 |  |     +- [[Legacy:FPSController|FPSController]] &gt;&gt;
 |  |     +- [[Legacy:ScriptedTriggerController|ScriptedTriggerController]]
 |  +- [[Legacy:PlayerController|PlayerController]]
 |  |  +- [[Legacy:Camera|Camera]]
 |  |     +- [[Legacy:FPSPlayer|FPSPlayer]] &gt;&gt;
 |  |  +- [[Legacy:MessagingSpectator|MessagingSpectator]] (unused)
 |  |     +- [[Legacy:DemoRecSpectator|DemoRecSpectator]] (unused)
 |  |     +- [[Legacy:UTServerAdminSpectator|UTServerAdminSpectator]] (unused)
 +- [[Legacy:DamageType|DamageType]]
 |  +- [[Legacy:Crushed|Crushed]]
 |  +- [[Legacy:Fell|fell]]
 |  +- [[Legacy:Gibbed|Gibbed]]
 |  +- [[Legacy:P2Damage|P2Damage]] &gt;&gt;
 |  +- [[Legacy:Suicided|Suicided]]
 +- [[Legacy:Decal|Decal]]
 +- [[Legacy:DecoVolumeObject|DecoVolumeObject]]
 +- [[Legacy:EffectMaker|EffectMaker]]
 |  +- [[Legacy:BloodImpactMaker|BloodImpactMaker]]
 |  |  +- [[Legacy:BloodImpactHeadShotMaker|BloodImpactHeadShotMaker]]
 |  +- [[Legacy:BulletTracerMaker|BulletTracerMaker]]
 |  +- [[Legacy:FoodCrumbMaker|FoodCrumbMaker]]
 +- [[Legacy:Effects|Effects]]
 |  +- [[Legacy:Fragment|Fragment]]
 +- [[Legacy:FlavinClientDec|FlavinClientDec]]
 +- [[Legacy:FlavinClientInc|FlavinClientInc]]
 +- [[Legacy:HUD|HUD]]
 |  +- [[Legacy:FPSHud|FPSHud]] &gt;&gt;
 +- [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Info Class Hierarchy (P2)|Info Class Hierarchy (P2)]]
 +- [[Legacy:Inventory|Inventory]]
 |  +- [[Legacy:Ammunition|Ammunition]]
 |  |  +- [[Legacy:P2AmmoInv|P2AmmoInv]] &gt;&gt;
 |  +- [[Legacy:FPSGameState|FPSGameState]]
 |  |  +- [[Legacy:GameState|GameState]]
 |  +- [[Legacy:Powerups|Powerups]]
 |  |  +- [[Legacy:Armor|Armor]]
 |  |  +- [[Legacy:P2PowerupInv|P2PowerupInv]] '''(not expanded)'''
 |  +- [[Legacy:TravelInv|TravelInv]]
 |  |  +- [[Legacy:PawnTravelInv|PawnTravelInv]]
 |  |  +- [[Legacy:PickupTravelInv|PickupTravelInv]]
 |  |  +- [[Legacy:PowerupTravelInv|PowerupTravelInv]]
 |  |  +- [[Legacy:WeaponTravelInv|WeaponTravelInv]]
 |  +- [[Legacy:Weapon|Weapon]]
 |     +- [[Legacy:P2Weapon|P2Weapon]] '''(not expanded)'''
 +- [[Legacy:InventoryAttachment|InventoryAttachment]]
 |  +- [[Legacy:MuzzleFlashAttachment|MuzzleFlashAttachment]] '''(not expanded)'''
 |  +- [[Legacy:WeaponAttachment|WeaponAttachment]]
 |     +- [[Legacy:P2WeaponAttachment|P2WeaponAttachment]] '''(not expanded)'''
 +- [[Legacy:Mover|Mover]]
 |  +- [[Legacy:PowerMover|PowerMover]]
 |  +- [[Legacy:SplitMover|SplitMover]]
 |     +- [[Legacy:DoorMover|DoorMover]]
 |        +- [[Legacy:DudeDoor|DudeDoor]]
 +- [[Legacy:NavigationPoint|NavigationPoint]]
 |  +- [[Legacy:GameObjective (P2)|GameObjective (P2)]]
 |  |  +- [[Legacy:CTFBase (P2)|CTFBase (P2)]]
 |  |     +- [[Legacy:XCTFBase|xCTFBase]]
 |  |        +- [[Legacy:BlueFlagBase|BlueFlagBase]]
 |  |        +- [[Legacy:RedFlagBase|RedFlagBase]]
 |  +- [[Legacy:JumpDest|JumpDest]]
 |  +- [[Legacy:JumpPad|JumpPad]]
 |  +- [[Legacy:SmallNavigationPoint|SmallNavigationPoint]]
 |  |  +- [[Legacy:AIMarker|AIMarker]]
 |  |  +- [[Legacy:InventorySpot|InventorySpot]]
 |  |  +- [[Legacy:WarpZoneMarker|WarpZoneMarker]]
 |  |  +- [[Legacy:Ladder (UT)|Ladder (UT)]]
 |  |  |  +- [[Legacy:AutoLadder|AutoLadder]]
 |  |  +- [[Legacy:LevelLoadingView|LevelLoadingView]]
 |  |  +- [[Legacy:PlayerStart|PlayerStart]]
 |  |  +- [[Legacy:Teleporter|Teleporter]]
 |  |     +- [[Legacy:Telepad|Telepad]]
 |  |        +- [[Legacy:Linkpad|Linkpad]]
 |  +- [[Legacy:AssaultPath|AssaultPath]]
 |  +- [[Legacy:Door|Door]]
 |  |  +- [[Legacy:AutoDoor|AutoDoor]]
 |  +- [[Legacy:LiftCenter|LiftCenter]]
 |  +- [[Legacy:LiftExit|LiftExit]]
 |  +- [[Legacy:P2HintPoint|P2HintPoint]]
 |  +- [[Legacy:PathNode|PathNode]]
 |     +- [[Legacy:HomeNode|HomeNode]]
 +- [[Legacy:PeoplePart|PeoplePart]]
 |  +- [[Legacy:BodyPart|BodyPart]]
 |  |  +- [[Legacy:Head|Head]]
 |  |     +- [[Legacy:MpHead|MpHead]]
 |  +- [[Legacy:FlavinMesh|FlavinMesh]]
 |  +- [[Legacy:KevlarMesh|KevlarMesh]] &gt;&gt;
 +- [[Legacy:Projectile|Projectile]]
 |  +- [[Legacy:P2Projectile|P2Projectile]] '''(not expanded)'''
 +- [[Legacy:RawActor|RawActor]]
 +- [[Legacy:RocketBeeper|RocketBeeper]]
 +- [[Legacy:SplatMaker|SplatMaker]]
 |  +- [[Legacy:BloodDripSplatMaker|BloodDripSplatMaker]]
 |  +- [[Legacy:BloodExplosionSplatMaker|BloodExplosionSplatMaker]]
 |  +- [[Legacy:BloodMachinegunSplatMaker|BloodMachinegunSplatMaker]]
 +- [[Legacy:AntiPortalActor|AntiPortalActor]]
 +- [[Legacy:CheerleaderMusic|CheerleaderMusic]]
 +- [[Legacy:Decoration|Decoration]]
 |  +- [[Legacy:GameObject (P2)|GameObject (P2)]]
 |     +- [[Legacy:CTFFlag (P2)|CTFFlag (P2)]]
 |        +- [[Legacy:XCTFFlag|xCTFFlag]]
 |           +- [[Legacy:BlueFlag|BlueFlag]]
 |           +- [[Legacy:RedFlag|RedFlag]]
 +- [[Legacy:Emitter|Emitter]]
 |  +- [[Legacy:P2Emitter|P2Emitter]] &gt;&gt;
 |  +- [[Legacy:WillowWhisp|WillowWhisp]]
 +- [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
 +- [[Legacy:KActor|KActor]]
 |  +- [[Legacy:KActorExplodable|KActorExplodable]]
 |  |  +- [[Legacy:BarrelExplodable|BarrelExplodable]]
 |  |  +- [[Legacy:CarExplodable|CarExplodable]]
 |  |     +- [[Legacy:CarPolice|CarPolice]]
 |  +- [[Legacy:KConstraint|KConstraint]] &gt;&gt;
 |  +- [[Legacy:KTire|KTire]] (unused)
 +- [[Legacy:Keypoint|Keypoint]]
 |  +- [[Legacy:Keypoint Class Hierarchy (P2)|Keypoint Class Hierarchy (P2)]]
 +- [[Legacy:Light|Light]]
 |  +- [[Legacy:Spotlight|Spotlight]]
 |  +- [[Legacy:Sunlight|Sunlight]]
 |  +- [[Legacy:TriggerLight|TriggerLight]]
 +- [[Legacy:Note|Note]]
 +- [[Legacy:Pawn|Pawn]]
 |  +- [[Legacy:FPSPawn|FPSPawn]]
 |  | +- [[Legacy:AnimalPawn|AnimalPawn]] &gt;&gt;
 |  | +- [[Legacy:P2Pawn|P2Pawn]] &gt;&gt;
 |  +- [[Legacy:Scout|Scout]] (unused)
 |  +- [[Legacy:KVehicle|KVehicle]] (unused)
 |  +- [[Legacy:Vehicle|Vehicle]] (unused)
 +- [[Legacy:Pickup|Pickup]]
 |  +- [[Legacy:Ammo|Ammo]]
 |  |  +- [[Legacy:P2AmmoPickup|P2AmmoPickup]] &gt;&gt;
 |  +- [[Legacy:ArmorPickup|ArmorPickup]] (unused)
 |  +- [[Legacy:P2PowerupPickup|P2PowerupPickup]] &gt;&gt;
 |  +- [[Legacy:WeaponPickup|WeaponPickup]]
 |     +- [[Legacy:P2WeaponPickup|P2WeaponPickup]] &gt;&gt;
 +- [[Legacy:Projector|Projector]]
 |  +- [[Legacy:ShadowProjector|ShadowProjector]]
 |  +- [[Legacy:Splat|Splat]] &gt;&gt;
 +- [[Legacy:Prop|Prop]] &gt;&gt;
 +- [[Legacy:SongThing|SongThing]]
 +- [[Legacy:SoundThing|SoundThing]]
 |  +- [[Legacy:SoundRepeater|SoundRepeater]]
 +- [[Legacy:Spawner|Spawner]]
 |  +- [[Legacy:PawnSpawner|PawnSpawner]]
 |     +- [[Legacy:BackupSpawner|BackupSpawner]]
 +- [[Legacy:StaticMeshActor|StaticMeshActor]]
 |  +- [[Legacy:MoveableStaticMeshActor|MoveableStaticMeshActor]]
 |  +- [[Legacy:UrineBucket|UrineBucket]]
 +- [[Legacy:Triggers|Triggers]]
 |  +- [[Legacy:MusicTrigger|MusicTrigger]] (unused)
 |  +- [[Legacy:ShellTrigger|ShellTrigger]]
 |  +- [[Legacy:LineOfSightTrigger|LineOfSightTrigger]]
 |  |  +- [[Legacy:LineOfSightHint|LineOfSightHint]]
 |  +- [[Legacy:MaterialTrigger|MaterialTrigger]]
 |  +- [[Legacy:Trigger|Trigger]]
 |  |  +- [[Legacy:FaceToTalkTrigger|FaceToTalkTrigger]]
 |  |  +- [[Legacy:TriggerApocalypse|TriggerApocalypse]]
 |  |  +- [[Legacy:TriggeredHint|TriggeredHint]]
 |  |  +- [[Legacy:TriggerMapReminder|TriggerMapReminder]]
 |  |  +- [[Legacy:TriggerStatic|TriggerStatic]]
 |  |  +- [[Legacy:TriggerSuper|TriggerSuper]]
 |  |  +- [[Legacy:ZoneTrigger|ZoneTrigger]]
 |  +- [[Legacy:TriggeredCondition|TriggeredCondition]]
 |  +- [[Legacy:UseTrigger|UseTrigger]] (unused)
 +- [[Legacy:VehiclePart|VehiclePart]] (unused)

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1540</id>
      <timestamp>2004-06-10T13:53:37Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">An ellipsis (...) indicates that the tree expands to a large number of subclasses. These subclasses are covered or linked to by the parent.

The word &quot;unused&quot; indicates that this actor class is not used in Postal 2.

 [[Legacy:Actor|Actor]]
 +- [[Legacy:AnimBrowserMesh|AnimBrowserMesh]]
 +- [[Legacy:AnimNotifyActor|AnimNotifyActor]]
 +- [[Legacy:Bleeper|Bleeper]]
 +- [[Legacy:Brush|Brush]]
 |  +- [[Legacy:Volume|Volume]]
 |     +- [[Legacy:BlockingVolume|BlockingVolume]]
 |     |  +- [[Legacy:PathBlockingVolume|PathBlockingVolume]]
 |     +- [[Legacy:PhysicsVolume|PhysicsVolume]]
 |     |  +- [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]]
 |     |  +- [[Legacy:InterestVolume|InterestVolume]]
 |     |  +- [[Legacy:LadderVolume|LadderVolume]]
 |     +- [[Legacy:SnipingVolume (P2)|SnipingVolume (P2)]]
 +- [[Legacy:BulletHitPack|BulletHitPack]]
 |  +- ...
 +- [[Legacy:Cheerleaders|Cheerleaders]]
 |  +- ...
 +- [[Legacy:Controller|Controller]]
 |  +- [[Legacy:AIController|AIController]]
 |  |  +- [[Legacy:ScriptedController (P2)|ScriptedController (P2)]]
 |  |     +- [[Legacy:Bot (P2)|Bot (P2)]]
 |  |     +- [[Legacy:FPSController|FPSController]]
 |  |     |  +- ...
 |  |     +- [[Legacy:ScriptedTriggerController|ScriptedTriggerController]]
 |  +- [[Legacy:PlayerController|PlayerController]]
 |  |  +- [[Legacy:Camera|Camera]]
 |  |     +- [[Legacy:FPSPlayer|FPSPlayer]]
 |  |        +- ...
 |  |  +- [[Legacy:MessagingSpectator|MessagingSpectator]] (unused)
 |  |     +- [[Legacy:DemoRecSpectator|DemoRecSpectator]] (unused)
 |  |     +- [[Legacy:UTServerAdminSpectator|UTServerAdminSpectator]] (unused)
 +- [[Legacy:DamageType|DamageType]]
 |  +- [[Legacy:Crushed|Crushed]]
 |  +- [[Legacy:Fell|fell]]
 |  +- [[Legacy:Gibbed|Gibbed]]
 |  +- [[Legacy:P2Damage|P2Damage]]
 |  |  +- ...
 |  +- [[Legacy:Suicided|Suicided]]
 +- [[Legacy:Decal|Decal]]
 +- [[Legacy:DecoVolumeObject|DecoVolumeObject]]
 +- [[Legacy:EffectMaker|EffectMaker]]
 |  +- [[Legacy:BloodImpactMaker|BloodImpactMaker]]
 |  |  +- [[Legacy:BloodImpactHeadShotMaker|BloodImpactHeadShotMaker]]
 |  +- [[Legacy:BulletTracerMaker|BulletTracerMaker]]
 |  +- [[Legacy:FoodCrumbMaker|FoodCrumbMaker]]
 +- [[Legacy:Effects|Effects]]
 |  +- [[Legacy:Fragment|Fragment]]
 +- [[Legacy:FlavinClientDec|FlavinClientDec]]
 +- [[Legacy:FlavinClientInc|FlavinClientInc]]
 +- [[Legacy:HUD|HUD]]
 |  +- [[Legacy:FPSHud|FPSHud]]
 |     +- ...
 +- [[Legacy:Info|Info]]
 |  +- [[Legacy:Info Class Hierarchy (P2)|Info Class Hierarchy (P2)]]
 +- [[Legacy:Inventory|Inventory]]
 |  +- [[Legacy:Ammunition|Ammunition]]
 |  |  +- [[Legacy:P2AmmoInv|P2AmmoInv]]
 |  |     +- ...
 |  +- [[Legacy:FPSGameState|FPSGameState]]
 |  |  +- [[Legacy:GameState|GameState]]
 |  +- [[Legacy:Powerups|Powerups]]
 |  |  +- [[Legacy:Armor|Armor]]
 |  |  +- [[Legacy:P2PowerupInv|P2PowerupInv]]
 |  |     +- ...
 |  +- [[Legacy:TravelInv|TravelInv]]
 |  |  +- [[Legacy:PawnTravelInv|PawnTravelInv]]
 |  |  +- [[Legacy:PickupTravelInv|PickupTravelInv]]
 |  |  +- [[Legacy:PowerupTravelInv|PowerupTravelInv]]
 |  |  +- [[Legacy:WeaponTravelInv|WeaponTravelInv]]
 |  +- [[Legacy:Weapon|Weapon]]
 |     +- [[Legacy:P2Weapon|P2Weapon]]
 |        +- ...
 +- [[Legacy:InventoryAttachment|InventoryAttachment]]
 |  +- [[Legacy:MuzzleFlashAttachment|MuzzleFlashAttachment]]
 |     +- ...
 |  +- [[Legacy:WeaponAttachment|WeaponAttachment]]
 |     +- [[Legacy:P2WeaponAttachment|P2WeaponAttachment]]
 |        +- ...
 +- [[Legacy:Mover|Mover]]
 |  +- [[Legacy:PowerMover|PowerMover]]
 |  +- [[Legacy:SplitMover|SplitMover]]
 |     +- [[Legacy:DoorMover|DoorMover]]
 |        +- [[Legacy:DudeDoor|DudeDoor]]
 +- [[Legacy:NavigationPoint|NavigationPoint]]
 |  +- [[Legacy:GameObjective (P2)|GameObjective (P2)]]
 |  |  +- [[Legacy:CTFBase (P2)|CTFBase (P2)]]
 |  |     +- [[Legacy:XCTFBase|xCTFBase]]
 |  |        +- [[Legacy:BlueFlagBase|BlueFlagBase]]
 |  |        +- [[Legacy:RedFlagBase|RedFlagBase]]
 |  +- [[Legacy:JumpDest|JumpDest]]
 |  +- [[Legacy:JumpPad|JumpPad]]
 |  +- [[Legacy:SmallNavigationPoint|SmallNavigationPoint]]
 |  |  +- [[Legacy:AIMarker|AIMarker]]
 |  |  +- [[Legacy:InventorySpot|InventorySpot]]
 |  |  +- [[Legacy:WarpZoneMarker|WarpZoneMarker]]
 |  |  +- [[Legacy:Ladder (UT)|Ladder (UT)]]
 |  |  |  +- [[Legacy:AutoLadder|AutoLadder]]
 |  |  +- [[Legacy:LevelLoadingView|LevelLoadingView]]
 |  |  +- [[Legacy:PlayerStart|PlayerStart]]
 |  |  +- [[Legacy:Teleporter|Teleporter]]
 |  |     +- [[Legacy:Telepad|Telepad]]
 |  |        +- [[Legacy:Linkpad|Linkpad]]
 |  +- [[Legacy:AssaultPath|AssaultPath]]
 |  +- [[Legacy:Door|Door]]
 |  |  +- [[Legacy:AutoDoor|AutoDoor]]
 |  +- [[Legacy:LiftCenter|LiftCenter]]
 |  +- [[Legacy:LiftExit|LiftExit]]
 |  +- [[Legacy:P2HintPoint|P2HintPoint]]
 |  +- [[Legacy:PathNode|PathNode]]
 |     +- [[Legacy:HomeNode|HomeNode]]
 +- [[Legacy:PeoplePart|PeoplePart]]
 |  +- [[Legacy:BodyPart|BodyPart]]
 |  |  +- [[Legacy:Head|Head]]
 |  |     +- [[Legacy:MpHead|MpHead]]
 |  +- [[Legacy:FlavinMesh|FlavinMesh]]
 |  +- [[Legacy:KevlarMesh|KevlarMesh]]
 |     +- ...
 +- [[Legacy:Projectile|Projectile]]
 |  +- [[Legacy:P2Projectile|P2Projectile]]
 |     +- ...
 +- [[Legacy:RawActor|RawActor]]
 +- [[Legacy:RocketBeeper|RocketBeeper]]
 +- [[Legacy:SplatMaker|SplatMaker]]
 |  +- [[Legacy:BloodDripSplatMaker|BloodDripSplatMaker]]
 |  +- [[Legacy:BloodExplosionSplatMaker|BloodExplosionSplatMaker]]
 |  +- [[Legacy:BloodMachinegunSplatMaker|BloodMachinegunSplatMaker]]
 +- [[Legacy:AntiPortalActor|AntiPortalActor]]
 +- [[Legacy:CheerleaderMusic|CheerleaderMusic]]
 +- [[Legacy:Decoration|Decoration]]
 |  +- [[Legacy:GameObject (P2)|GameObject (P2)]]
 |     +- [[Legacy:CTFFlag (P2)|CTFFlag (P2)]]
 |        +- [[Legacy:XCTFFlag|xCTFFlag]]
 |           +- [[Legacy:BlueFlag|BlueFlag]]
 |           +- [[Legacy:RedFlag|RedFlag]]
 +- [[Legacy:Emitter|Emitter]]
 |  +- [[Legacy:P2Emitter|P2Emitter]]
 |  |  +- ...
 |  +- [[Legacy:WillowWhisp|WillowWhisp]]
 +- [[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]
 +- [[Legacy:KActor|KActor]]
 |  +- [[Legacy:KActorExplodable|KActorExplodable]]
 |  |  +- [[Legacy:BarrelExplodable|BarrelExplodable]]
 |  |  +- [[Legacy:CarExplodable|CarExplodable]]
 |  |     +- [[Legacy:CarPolice|CarPolice]]
 |  +- [[Legacy:KConstraint|KConstraint]]
 |  |  +- ...
 |  +- [[Legacy:KTire|KTire]] (unused)
 +- [[Legacy:Keypoint|Keypoint]]
 |  +- [[Legacy:Keypoint Class Hierarchy (P2)|Keypoint Class Hierarchy (P2)]]
 +- [[Legacy:Light|Light]]
 |  +- [[Legacy:Spotlight|Spotlight]]
 |  +- [[Legacy:Sunlight|Sunlight]]
 |  +- [[Legacy:TriggerLight|TriggerLight]]
 +- [[Legacy:Note|Note]]
 +- [[Legacy:Pawn|Pawn]]
 |  +- [[Legacy:FPSPawn|FPSPawn]]
 |  | +- [[Legacy:AnimalPawn|AnimalPawn]]
 |  |    +- ...
 |  | +- [[Legacy:P2Pawn|P2Pawn]]
 |  |    +- ...
 |  +- [[Legacy:Scout|Scout]] (unused)
 |  +- [[Legacy:KVehicle|KVehicle]] (unused)
 |  +- [[Legacy:Vehicle|Vehicle]] (unused)
 +- [[Legacy:Pickup|Pickup]]
 |  +- [[Legacy:Ammo|Ammo]]
 |  |  +- [[Legacy:P2AmmoPickup|P2AmmoPickup]]
 |  |     +- ...
 |  +- [[Legacy:ArmorPickup|ArmorPickup]] (unused)
 |  +- [[Legacy:P2PowerupPickup|P2PowerupPickup]]
 |  |  +- ...
 |  +- [[Legacy:WeaponPickup|WeaponPickup]]
 |     +- [[Legacy:P2WeaponPickup|P2WeaponPickup]]
 |        +- ...
 +- [[Legacy:Projector|Projector]]
 |  +- [[Legacy:ShadowProjector|ShadowProjector]]
 |  +- [[Legacy:Splat|Splat]]
 |     +- ...
 +- [[Legacy:Prop|Prop]]
 |  +- ...
 +- [[Legacy:SongThing|SongThing]]
 +- [[Legacy:SoundThing|SoundThing]]
 |  +- [[Legacy:SoundRepeater|SoundRepeater]]
 +- [[Legacy:Spawner|Spawner]]
 |  +- [[Legacy:PawnSpawner|PawnSpawner]]
 |     +- [[Legacy:BackupSpawner|BackupSpawner]]
 +- [[Legacy:StaticMeshActor|StaticMeshActor]]
 |  +- [[Legacy:MoveableStaticMeshActor|MoveableStaticMeshActor]]
 |  +- [[Legacy:UrineBucket|UrineBucket]]
 +- [[Legacy:Triggers|Triggers]]
 |  +- [[Legacy:MusicTrigger|MusicTrigger]] (unused)
 |  +- [[Legacy:ShellTrigger|ShellTrigger]]
 |  +- [[Legacy:LineOfSightTrigger|LineOfSightTrigger]]
 |  |  +- [[Legacy:LineOfSightHint|LineOfSightHint]]
 |  +- [[Legacy:MaterialTrigger|MaterialTrigger]]
 |  +- [[Legacy:Trigger|Trigger]]
 |  |  +- [[Legacy:FaceToTalkTrigger|FaceToTalkTrigger]]
 |  |  +- [[Legacy:TriggerApocalypse|TriggerApocalypse]]
 |  |  +- [[Legacy:TriggeredHint|TriggeredHint]]
 |  |  +- [[Legacy:TriggerMapReminder|TriggerMapReminder]]
 |  |  +- [[Legacy:TriggerStatic|TriggerStatic]]
 |  |  +- [[Legacy:TriggerSuper|TriggerSuper]]
 |  |  +- [[Legacy:ZoneTrigger|ZoneTrigger]]
 |  +- [[Legacy:TriggeredCondition|TriggeredCondition]]
 |  +- [[Legacy:UseTrigger|UseTrigger]] (unused)
 +- [[Legacy:VehiclePart|VehiclePart]] (unused)

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Class Hierarchy (UT)</title>
    <id>383</id>
    <revision>
      <id>1293</id>
      <timestamp>2007-05-28T06:29:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Here is the [[Legacy:Unreal Tournament|Unreal Tournament]] [[Legacy:Class Tree|Class Tree]] hierarchy from Actor in all its beauty and glory.  The Actor class inherits from [[Legacy:Object (UT)|Object (UT)]].  There are a whole host of non actor classes that might get added in here eventually.  One of the things I don't like about the way the class hierarchies have been built is that quite often a subclass exists purely to customise data rather than behaviour.

: The behaviour / data distinction is something we could label here. I agree with you, there are some groups that don't need expanding here, for example: Effects are expanded on the [[Legacy:Effects (UT)|Effects (UT)]] class page anyway; with Decoration it's worth marking as you have that there's a subtree UTDecoration (it's a pain if you ask me, they could have chosen a name that put it at the top... sigh)   &amp;ndash; ''Tarquin'' 
: I'm sure I read somewhere that there is a fairly chunky memory and performance overhead when including any of the original Unreal content in the UnrealTournament levels as the entire Unreal actor tree gets loaded.  The actors are diverse at the C++ level so the amount of &quot;code&quot; that UT loads is significantly increased.  I'll be damned if I can find the reference I read it in though.  It may even only apply to decoration types. &amp;ndash; ''EntropicLqd''

 [[Legacy:Actor (UT)|Actor (UT)]]
  +- [[Legacy:Brush|Brush]]
  |   +- [[Legacy:Mover (UT)|Mover (UT)]]
  |       +- [[Legacy:AssertMover|AssertMover]]
  |       +- [[Legacy:AttachMover|AttachMover]]
  |       +- [[Legacy:ElevatorMover|ElevatorMover]]
  |       +- [[Legacy:GradualMover|GradualMover]]
  |       +- [[Legacy:LoopMover|LoopMover]]
  |       +- [[Legacy:MixMover|MixMover]]
  |       +- [[Legacy:RotatingMover|RotatingMover]]
  |
  +- [[Legacy:DamageType (UT)|DamageType (UT)]] ''Not used''
  |   +- UnrealDamageType
  |       +- Burned
  |       +- Corroded
  |       +- Decapitated
  |       +- Drowned
  |       +- Fell
  |
  +- [[Legacy:Decal|Decal]]
  |   +- [[Legacy:FadeShadow|FadeShadow]]
  |   +- [[Legacy:PlayerShadow|PlayerShadow]]
  |   +- [[Legacy:Scorch|Scorch]]
  |   |   +- [[Legacy:BigEnergyImpact|BigEnergyImpact]]
  |   |   +- [[Legacy:Biomark|biomark]]
  |   |   +- [[Legacy:BlastMark|BlastMark]]
  |   |   +- [[Legacy:BloodSplat|BloodSplat]]
  |   |   +- [[Legacy:DirectionalBlast|DirectionalBlast]]
  |   |   +- [[Legacy:EnergyImpact|EnergyImpact]]
  |   |   |   +- [[Legacy:BoltScorch|BoltScorch]]
  |   |   +- [[Legacy:ImpactHole|ImpactHole]]
  |   |   +- [[Legacy:NuclearMark|NuclearMark]]
  |   |   +- [[Legacy:Pock|Pock]]
  |   |   +- [[Legacy:RipperMark|RipperMark]]
  |   |   +- [[Legacy:UTBloodPool|UTBloodPool]]
  |   |   |   +- [[Legacy:UTBloodPool2|UTBloodPool2]]
  |   |   +- [[Legacy:WallCrack|WallCrack]]
  |   |
  |   +- [[Legacy:TargetShadow|TargetShadow]]
  |
  +- [[Legacy:Decoration (UT)|Decoration (UT)]] ''How many classes!''
  |   +- [[Legacy:Ut_Decoration|ut_Decoration]]
  |
  +- [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt;
  |
  +- [[Legacy:HUD (UT)|HUD (UT)]]
  |   +- [[Legacy:ChallengeHUD|ChallengeHUD]]
  |   |   +- [[Legacy:ChallengeTeamHUD|ChallengeTeamHUD]]
  |   |       +- [[Legacy:AssaultHUD|AssaultHUD]]
  |   |       +- [[Legacy:ChallengeCTFHUD|ChallengeCTFHUD]]
  |   |       +- [[Legacy:ChallengeDominationHUD|ChallengeDominationHUD]]
  |   |
  |   +- [[Legacy:UnrealHUD|UnrealHUD]] ''Not expanded''
  |
  +- [[Legacy:Info (UT)|Info (UT)]]
  |   +- [[Legacy:AssaultInfo|AssaultInfo]]
  |   +- [[Legacy:BotInfo|BotInfo]]
  |   +- [[Legacy:ChallengeBotInfo|ChallengeBotInfo]]
  |   +- [[Legacy:ClientScriptedTexture|ClientScriptedTexture]]
  |   |   +- [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
  |   +- [[Legacy:CodeMaster|CodeMaster]]
  |   +- [[Legacy:EndStats|EndStats]]
  |   +- [[Legacy:FontInfo|FontInfo]]
  |   +- [[Legacy:GameInfo (UT)|GameInfo (UT)]]
  |   |   +- [[Legacy:TournamentGameInfo|TournamentGameInfo]]
  |   |   |   +- [[Legacy:DeathMatchPlus|DeathMatchPlus]]
  |   |   |   |   +- [[Legacy:ChallengeDMP|ChallengeDMP]]
  |   |   |   |   +- [[Legacy:ChallengeIntro|ChallengeIntro]]
  |   |   |   |   +- [[Legacy:LastManStanding|LastManStanding]]
  |   |   |   |   +- [[Legacy:TDarkMatch|TDarkMatch]]
  |   |   |   |   +- [[Legacy:TeamGamePlus|TeamGamePlus]]
  |   |   |   |   |   +- [[Legacy:Assault|Assault]]
  |   |   |   |   |   |   +- [[Legacy:TrainingAS|TrainingAS]]
  |   |   |   |   |   +- [[Legacy:CTFGame (UT)|CTFGame (UT)]]
  |   |   |   |   |   |   +- [[Legacy:TrainingCTF|TrainingCTF]]
  |   |   |   |   |   +- [[Legacy:Domination|Domination]]
  |   |   |   |   |       +- [[Legacy:TrainingDOM|TrainingDOM]]
  |   |   |   |   |
  |   |   |   |   +- [[Legacy:TrainingDM|TrainingDM]]
  |   |   |   |
  |   |   |   +- [[Legacy:UTIntro|UTIntro]]
  |   |   |       +- [[Legacy:LadderLoadGame|LadderLoadGame]]
  |   |   |       +- [[Legacy:LadderNewGame|LadderNewGame]]
  |   |   |       +- [[Legacy:LadderTransition|LadderTransition]]
  |   |   |       +- [[Legacy:TrophyGame|TrophyGame]]
  |   |   |
  |   |   +- [[Legacy:UnrealGameInfo|UnrealGameInfo]] ''Not expanded''
  |   |
  |   +- [[Legacy:InternetInfo|InternetInfo]] ''Not expanded''
  |   +- [[Legacy:Ladder (UT)|Ladder (UT)]] ''Not expanded''
  |   +- [[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
  |   |   +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
  |   |       +- [[Legacy:CriticalEventPlus|CriticalEventPlus]]
  |   |       |   +- [[Legacy:CriticalEventLowPlus|CriticalEventLowPlus]]
  |   |       |   |   +- [[Legacy:ControlPointMessage|ControlPointMessage]]
  |   |       |   |   +- [[Legacy:KillingSpreeMessage|KillingSpreeMessage]]
  |   |       |   |   +- [[Legacy:LMSOutMessage|LMSOutMessage]]
  |   |       |   |
  |   |       |   +- [[Legacy:CriticalStringPlus|CriticalStringPlus]]
  |   |       |   +- [[Legacy:CTFMessage|CTFMessage]]
  |   |       |   +- [[Legacy:DeathMatchMessage|DeathMatchMessage]]
  |   |       |   +- [[Legacy:FirstBloodMessage|FirstBloodMessage]]
  |   |       |   +- [[Legacy:TimeMessage|TimeMessage]]
  |   |       |
  |   |       +- [[Legacy:CTFMessage2|CTFMessage2]]
  |   |       +- [[Legacy:DeathMessagePlus|DeathMessagePlus]]
  |   |       |   +- [[Legacy:EradicatedDeathMessage|EradicatedDeathMessage]]
  |   |       +- [[Legacy:DecapitationMessage|DecapitationMessage]]
  |   |       +- [[Legacy:ItemMessagePlus|ItemMessagePlus]]
  |   |       +- [[Legacy:KillerMessagePlus|KillerMessagePlus]]
  |   |       +- [[Legacy:MultiKillMessage|MultiKillMessage]]
  |   |       +- [[Legacy:PickupMessagePlus|PickupMessagePlus]]
  |   |       |   +- [[Legacy:PickupMessageHealthPlus|PickupMessageHealthPlus]]
  |   |       +- [[Legacy:StringMesagePlus|StringMesagePlus]]
  |   |       |   +- [[Legacy:RedSayMessagePlus|RedSayMessagePlus]]
  |   |       |   +- [[Legacy:SayMessagePlus|SayMessagePlus]]
  |   |       |   +- [[Legacy:TeamSayMessagePlus|TeamSayMessagePlus]]
  |   |       |
  |   |       +- [[Legacy:VictimMessage|VictimMessage]]
  |   |
  |   +- [[Legacy:MapList|MapList]] ''Not expanded''
  |   +- [[Legacy:MeshActor|MeshActor]]
  |   +- [[Legacy:Mutator (UT)|Mutator (UT)]]
  |   |   +- [[Legacy:Arena|Arena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|FlakArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|impactarena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|InstaGibDM]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|MinigunArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|PulseArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|RocketArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|ShockArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|SniperArena]]
  |   |   |
  |   |   +- [[Legacy:ChainsawMelee|ChainsawMelee]]
  |   |   +- [[Legacy:DMMutator|DMMutator]]
  |   |   +- [[Legacy:FatBoy|FatBoy]]
  |   |   +- [[Legacy:InstantRockets|InstantRockets]]
  |   |   +- [[Legacy:JumpMatch|JumpMatch]]
  |   |   +- [[Legacy:LowGrav|LowGrav]]
  |   |   +- [[Legacy:NoPowerups|NoPowerups]]
  |   |   +- [[Legacy:NoRedeemer|NoRedeemer]]
  |   |   +- [[Legacy:Relic|Relic]]
  |   |   |   +- [[Legacy:RelicDeath|RelicDeath]]
  |   |   |   +- [[Legacy:RelicDefense|RelicDefense]]
  |   |   |   +- [[Legacy:RelicRedemption|RelicRedemption]]
  |   |   |   +- [[Legacy:RelicRegen|RelicRegen]]
  |   |   |   +- [[Legacy:RelicSpeed|RelicSpeed]]
  |   |   |   +- [[Legacy:RelicStrength|RelicStrength]]
  |   |   |
  |   |   +- [[Legacy:Stealth|Stealth]]
  |   |
  |   +- [[Legacy:NewGameInterimObject|NewGameInterimObject]]
  |   +- [[Legacy:RatedMatchInfo|RatedMatchInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:RatedTeamInfo|RatedTeamInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:ReplicationInfo|ReplicationInfo]]
  |   |   +- [[Legacy:GameReplicationInfo|GameReplicationInfo]]
  |   |   |   +- [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]]
  |   |   |       +- [[Legacy:CTFReplicationInfo|CTFReplicationInfo]]
  |   |   +- [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]
  |   |       +- [[Legacy:BotReplicationInfo|BotReplicationInfo]]
  |   |
  |   +- [[Legacy:SavedMove|SavedMove]]
  |   +- [[Legacy:ScoreBoard|ScoreBoard]]
  |   |   +- [[Legacy:TournamentScoreBoard|TournamentScoreBoard]]
  |   |   |   +- [[Legacy:LMSScoreBoard|LMSScoreBoard]]
  |   |   |   +- [[Legacy:TeamScoreBoard|TeamScoreBoard]]
  |   |   |       +- [[Legacy:AssaultScoreBoard|AssaultScoreBoard]]
  |   |   |       +- [[Legacy:DominationScoreBoard|DominationScoreBoard]]
  |   |   |       +- [[Legacy:UnrealCTFScoreBoard|UnrealCTFScoreBoard]]
  |   |   |
  |   |   +- [[Legacy:UnrealScoreBoard|UnrealScoreBoard]]
  |   |       +- [[Legacy:UnrealTeamScoreBoard|UnrealTeamScoreBoard]]
  |   +- [[Legacy:SelectionDude|SelectionDude]] ''Not expanded''
  |   +- [[Legacy:ServerInfo|ServerInfo]] ''Not expanded''
  |   |   +- [[Legacy:ServerInfoTeam|ServerInfoTeam]]
  |   |       +- [[Legacy:ServerInfoAS|ServerInfoAS]]
  |   |       +- [[Legacy:ServerInfoCTF|ServerInfoCTF]]
  |   |       +- [[Legacy:ServerInfoDOM|ServerInfoDOM]]
  |   |
  |   +- [[Legacy:StatLog|StatLog]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:TeamInfo|TeamInfo]]
  |   +- [[Legacy:TestInfo|TestInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:VoicePack|VoicePack]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]
  |       +- [[Legacy:CloudZone|CloudZone]]
  |       +- [[Legacy:KillingField|KillingField]]
  |       +- [[Legacy:LavaZone|LavaZone]]
  |       +- [[Legacy:LevelInfo (UT)|LevelInfo (UT)]]
  |       +- [[Legacy:NitrogenZone|NitrogenZone]]
  |       +- [[Legacy:PressureZone|PressureZone]]
  |       +- [[Legacy:SkyZoneInfo|SkyZoneInfo]]
  |       |   +- [[Legacy:RockingSkyZoneInfo|RockingSkyZoneInfo]]
  |       +- [[Legacy:SlimeZone|SlimeZone]]
  |       +- [[Legacy:TarZone|TarZone]]
  |       +- [[Legacy:TeleporterZone|TeleporterZone]]
  |       +- [[Legacy:ToggleZoneInfo|ToggleZoneInfo]]
  |       +- [[Legacy:VacuumZone|VacuumZone]]
  |       +- [[Legacy:WarpZoneInfo|WarpZoneInfo]]
  |       +- [[Legacy:WaterZone|WaterZone]]
  |
  +- [[Legacy:Inventory (UT)|Inventory (UT)]]
  |   +- [[Legacy:LadderInventory|LadderInventory]]
  |   +- [[Legacy:Pickup (UT)|Pickup (UT)]]
  |   |   +- [[Legacy:Ammo (UT)|Ammo (UT)]]
  |   |   |   +- [[Legacy:ASMDAmmo|ASMDAmmo]]
  |   |   |   |   +- [[Legacy:DefaultAmmo|DefaultAmmo]]
  |   |   |   +- [[Legacy:FlakBox|FlakBox]]
  |   |   |   |   +- FlakShellAmmo
  |   |   |   +- [[Legacy:NullAmmo|NullAmmo]]
  |   |   |   +- [[Legacy:RazorAmmo|RazorAmmo]]
  |   |   |   +- [[Legacy:RifleAmmo|RifleAmmo]]
  |   |   |   |   +- RifleRound
  |   |   |   +- [[Legacy:RocketCan|RocketCan]]
  |   |   |   +- [[Legacy:ShellBox|ShellBox]]
  |   |   |   |   +- [[Legacy:Clip|Clip]]
  |   |   |   +- [[Legacy:Shells|Shells]]
  |   |   |   +- [[Legacy:Sludge|Sludge]]
  |   |   |   +- [[Legacy:StingerAmmo|StingerAmmo]]
  |   |   |   +- [[Legacy:TournamentAmmo|TournamentAmmo]]
  |   |   |       +- [[Legacy:BioAmmo|BioAmmo]]
  |   |   |       +- [[Legacy:BladeHopper|BladeHopper]]
  |   |   |       +- [[Legacy:BulletBox|BulletBox]]
  |   |   |       |   +- RifleShell
  |   |   |       +- [[Legacy:FlakAmmo|FlakAmmo]]
  |   |   |       +- [[Legacy:Miniammo|Miniammo]]
  |   |   |       |   +- EClip
  |   |   |       +- [[Legacy:PAmmo|PAmmo]]
  |   |   |       +- [[Legacy:RocketPack|RocketPack]]
  |   |   |       +- [[Legacy:ShockCore|ShockCore]]
  |   |   |       |   +- SuperShockCore
  |   |   |       +- [[Legacy:WarHeadAmmo|WarHeadAmmo]]
  |   |   |
  |   |   +- [[Legacy:Amplifier|Amplifier]]
  |   |   +- [[Legacy:Armor|Armor]]
  |   |   +- [[Legacy:Dampener|Dampener]]
  |   |   +- [[Legacy:Flare|Flare]]
  |   |   +- [[Legacy:Flashlight|Flashlight]]
  |   |   |   +- [[Legacy:SearchLight|SearchLight]]
  |   |   +- [[Legacy:ForceField|ForceField]]
  |   |   +- [[Legacy:Health|Health]]
  |   |   |   +- [[Legacy:Bandages|Bandages]]
  |   |   |   +- [[Legacy:NaliFruit|NaliFruit]]
  |   |   |   +- [[Legacy:SuperHealth|SuperHealth]]
  |   |   |
  |   |   +- [[Legacy:Invisibility|Invisibility]]
  |   |   +- [[Legacy:JumpBoots|JumpBoots]]
  |   |   +- [[Legacy:SCUBAGear|SCUBAGear]]
  |   |   +- [[Legacy:Seeds|Seeds]]
  |   |   +- [[Legacy:Shieldbelt|Shieldbelt]]
  |   |   |   +- [[Legacy:PowerShield|PowerShield]]
  |   |   +- [[Legacy:Suits|Suits]]
  |   |   |   +- [[Legacy:AsbestosSuit|AsbestosSuit]]
  |   |   |   +- [[Legacy:KevlarSuit|KevlarSuit]]
  |   |   |   +- [[Legacy:ToxinSuit|ToxinSuit]]
  |   |   |
  |   |   +- [[Legacy:TournamentHealth|TournamentHealth]]
  |   |   |   +- [[Legacy:HealthPack|HealthPack]]
  |   |   |   +- [[Legacy:HealthVial|HealthVial]]
  |   |   |   +- [[Legacy:MedBox|MedBox]]
  |   |   |
  |   |   +- [[Legacy:TournamentPickup|TournamentPickup]]
  |   |   |   +- [[Legacy:Armor2|Armor2]]
  |   |   |   +- [[Legacy:RelicInventory|RelicInventory]]
  |   |   |   |   +- [[Legacy:RelicDeath|RelicDeathInventory]]
  |   |   |   |   +- [[Legacy:RelicDefense|RelicDefenseInventory]]
  |   |   |   |   +- [[Legacy:RelicRedemption|RelicRedemptionInventory]]
  |   |   |   |   +- [[Legacy:RelicRegen|RelicRegenInventory]]
  |   |   |   |   +- [[Legacy:RelicSpeed|RelicSpeedInventory]]
  |   |   |   |   +- [[Legacy:RelicStrength|RelicStrengthInventory]]
  |   |   |   |
  |   |   |   +- [[Legacy:ThighPads|ThighPads]]
  |   |   |   +- [[Legacy:UDamage|UDamage]]
  |   |   |   +- [[Legacy:UT_invisibility|UT_invisibility]]
  |   |   |   |   +- [[Legacy:UT_Stealth|UT_Stealth]]
  |   |   |   +- [[Legacy:UT_JumpBoots|UT_JumpBoots]]
  |   |   |   +- [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
  |   |   |
  |   |   +- [[Legacy:Translator|Translator]]
  |   |   +- [[Legacy:VoiceBox|VoiceBox]]
  |   |   +- [[Legacy:WeaponPowerup|WeaponPowerup]]
  |   |
  |   +- [[Legacy:TrapSpringer|TrapSpringer]]
  |   +- [[Legacy:Weapon (UT)|Weapon (UT)]]
  |      +- [[Legacy:ASMD|ASMD]]
  |      +- [[Legacy:AutoMag|AutoMag]]
  |      +- [[Legacy:DispersionPistol|DispersionPistol]]
  |      +- [[Legacy:Eightball|Eightball]]
  |      +- [[Legacy:FlakCannon|FlakCannon]]
  |      +- [[Legacy:GESBioRifle|GESBioRifle]]
  |      +- [[Legacy:Minigun|Minigun]]
  |      +- [[Legacy:QuadShot|QuadShot]]
  |      +- [[Legacy:Razorjack|Razorjack]]
  |      +- [[Legacy:Rifle|Rifle]]
  |      +- [[Legacy:Stinger|Stinger]]
  |      +- [[Legacy:TournamentWeapon|TournamentWeapon]]
  |          +- [[Legacy:Chainsaw|Chainsaw]]
  |          +- [[Legacy:Enforcer|Enforcer]]
  |          |   +- [[Legacy:Enforcer|DoubleEnforcer]]
  |          +- [[Legacy:ImpactHammer|ImpactHammer]]
  |          +- [[Legacy:Minigun|Minigun]]
  |          +- [[Legacy:PulseGun|PulseGun]]
  |          +- [[Legacy:Ripper|ripper]]
  |          +- [[Legacy:ShockRifle|ShockRifle]]
  |          |   +- [[Legacy:SuperShockRifle|SuperShockRifle]]
  |          +- [[Legacy:SniperRifle|SniperRifle]]
  |          +- [[Legacy:Translocator|Translocator]]
  |          +- [[Legacy:UT_BioRifle|ut_biorifle]]
  |          +- [[Legacy:UT_Eightball|UT_Eightball]]
  |          +- [[Legacy:UT_FlakCannon|UT_FlakCannon]]
  |          +- [[Legacy:WarheadLauncher|WarheadLauncher]]
  |
  +- [[Legacy:Keypoint (UT)|Keypoint (UT)]]
  |   +- [[Legacy:AmbientSound (UT)|AmbientSound (UT)]]
  |   +- [[Legacy:BlockAll|BlockAll]]
  |   +- [[Legacy:BlockMonsters|BlockMonsters]]
  |   +- [[Legacy:BlockPlayer|BlockPlayer]]
  |   +- [[Legacy:ClipMarker|ClipMarker]]
  |   +- [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]
  |   +- [[Legacy:Earthquake|Earthquake]]
  |   |   +- [[Legacy:CH_Earthquake|CH_Earthquake]]
  |   +- [[Legacy:GuardPoint|GuardPoint]]
  |   +- [[Legacy:HoldSpot|HoldSpot]]
  |   +- [[Legacy:InterpolationPoint|InterpolationPoint]]
  |   +- [[Legacy:LocationID|LocationID]]
  |   +- [[Legacy:MakeNaliFriendly|MakeNaliFriendly]]
  |   +- [[Legacy:ObjectPath|ObjectPath]]
  |   +- [[Legacy:OEMEnd|OEMEnd]]
  |   +- [[Legacy:PathPoint|PathPoint]]
  |   +- [[Legacy:RockSlide|RockSlide]]
  |   |   +- [[Legacy:MagmaBurst|MagmaBurst]]
  |   +- [[Legacy:SpectatorCam|SpectatorCam]]
  |   |   +- [[Legacy:QuakeCam|QuakeCam]]
  |   +- [[Legacy:ThingFactory|ThingFactory]]
  |   |   +- [[Legacy:CreatureFactory|CreatureFactory]]
  |   +- [[Legacy:ThrowStuff|ThrowStuff]]
  |   +- [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]
  |   +- [[Legacy:WayBeacon|WayBeacon]]
  |
  +- [[Legacy:Light (UT)|Light (UT)]]
  |   +- [[Legacy:ChargeLight|ChargeLight]]
  |   +- [[Legacy:DistanceLighting|DistanceLighting]]
  |   +- [[Legacy:FlashLightBeam|FlashLightBeam]]
  |   +- [[Legacy:OverheadLight|OverheadLight]]
  |   +- [[Legacy:QueenTeleportLight|QueenTeleportLight]]
  |   +- [[Legacy:SightLight|SightLight]]
  |   +- [[Legacy:SpotLight|SpotLight]]
  |   +- [[Legacy:TorchFlame|TorchFlame]]
  |   +- [[Legacy:TriggerLight|TriggerLight]] ''There are two identical TriggerLight actors in Engine and UnrealShare.''
  |   +- [[Legacy:TriggerLightRad|TriggerLightRad]]
  |   +- [[Legacy:WeaponLight|WeaponLight]]
  |       +- [[Legacy:EffectLight|EffectLight]]
  |       +- [[Legacy:PurpleLight|PurpleLight]]
  |
  +- [[Legacy:Menu|Menu]] ''Not expanded - no plans to at this time''
  |
  +- [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt;
  |
  +- [[Legacy:Pawn (UT)|Pawn (UT)]]
  |   +- [[Legacy:Bot (UT)|Bot (UT)]]
  |   |   +- [[Legacy:HumanBotPlus|HumanBotPlus]]
  |   |   |   +- [[Legacy:FemaleBotPlus|FemaleBotPlus]]
  |   |   |   |   +- [[Legacy:TFemaleBot1|TFemaleBot1]]
  |   |   |   |   +- [[Legacy:TFemaleBot2|TFemaleBot2]]
  |   |   |   |
  |   |   |   +- [[Legacy:MaleBotPlus|MaleBotPlus]]
  |   |   |       +- [[Legacy:TBossBot|TBossBot]]
  |   |   |       +- [[Legacy:TMale1Bot|TMale1Bot]]
  |   |   |       +- [[Legacy:TMale2Bot|TMale2Bot]]
  |   |   |
  |   |   +- [[Legacy:SkaarjBot|SkaarjBot]]
  |   |
  |   +- [[Legacy:Bots|Bots]] ''Not expanded''
  |   +- [[Legacy:FlockMasterPawn|FlockMasterPawn]] ''Not expanded''
  |   +- [[Legacy:FlockPawn|FlockPawn]] ''Not expanded''
  |   +- [[Legacy:PlayerPawn|PlayerPawn]] ''Not expanded''
  |   +- [[Legacy:Scout|Scout]] ''Not expanded''
  |   +- [[Legacy:ScriptedPawn|ScriptedPawn]] ''Not expanded''
  |   +- [[Legacy:StationaryPawn|StationaryPawn]] ''Not expanded''
  |
  +- [[Legacy:Projectile (UT)|Projectile (UT)]] ''Not expanded''
  +- [[Legacy:ShareSounds|ShareSounds]]
  +- [[Legacy:SpawnNotify|SpawnNotify]]
  +- [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1294</id>
      <timestamp>2005-07-01T09:46:31Z</timestamp>
      <contributor>
        <ip>Torin</ip>
      </contributor>
      <comment>removed CamperZone - it's not a standard class so it belongs in 3rd party</comment>
      <text xml:space="preserve">Here is the [[Legacy:Unreal Tournament|Unreal Tournament]] [[Legacy:Class Tree|Class Tree]] hierarchy from Actor in all its beauty and glory.  The Actor class inherits from [[Legacy:Object (UT)|Object (UT)]].  There are a whole host of non actor classes that might get added in here eventually.  One of the things I don't like about the way the class hierarchies have been built is that quite often a subclass exists purely to customise data rather than behaviour.

: The behaviour / data distinction is something we could label here. I agree with you, there are some groups that don't need expanding here, for example: Effects are expanded on the [[Legacy:Effects (UT)|Effects (UT)]] class page anyway; with Decoration it's worth marking as you have that there's a subtree UTDecoration (it's a pain if you ask me, they could have chosen a name that put it at the top... sigh)   &amp;ndash; ''Tarquin'' 
: I'm sure I read somewhere that there is a fairly chunky memory and performance overhead when including any of the original Unreal content in the UnrealTournament levels as the entire Unreal actor tree gets loaded.  The actors are diverse at the C++ level so the amount of &quot;code&quot; that UT loads is significantly increased.  I'll be damned if I can find the reference I read it in though.  It may even only apply to decoration types. &amp;ndash; ''EntropicLqd''

 [[Legacy:Actor (UT)|Actor (UT)]]
  +- [[Legacy:Brush|Brush]]
  |   +- [[Legacy:Mover (UT)|Mover (UT)]]
  |       +- [[Legacy:AssertMover|AssertMover]]
  |       +- [[Legacy:AttachMover|AttachMover]]
  |       +- [[Legacy:ElevatorMover|ElevatorMover]]
  |       +- [[Legacy:GradualMover|GradualMover]]
  |       +- [[Legacy:LoopMover|LoopMover]]
  |       +- [[Legacy:MixMover|MixMover]]
  |       +- [[Legacy:RotatingMover|RotatingMover]]
  |
  +- [[Legacy:DamageType (UT)|DamageType (UT)]] ''Not used''
  |   +- UnrealDamageType
  |       +- Burned
  |       +- Corroded
  |       +- Decapitated
  |       +- Drowned
  |       +- Fell
  |
  +- [[Legacy:Decal|Decal]]
  |   +- [[Legacy:FadeShadow|FadeShadow]]
  |   +- [[Legacy:PlayerShadow|PlayerShadow]]
  |   +- [[Legacy:Scorch|Scorch]]
  |   |   +- [[Legacy:BigEnergyImpact|BigEnergyImpact]]
  |   |   +- [[Legacy:Biomark|biomark]]
  |   |   +- [[Legacy:BlastMark|BlastMark]]
  |   |   +- [[Legacy:BloodSplat|BloodSplat]]
  |   |   +- [[Legacy:DirectionalBlast|DirectionalBlast]]
  |   |   +- [[Legacy:EnergyImpact|EnergyImpact]]
  |   |   |   +- [[Legacy:BoltScorch|BoltScorch]]
  |   |   +- [[Legacy:ImpactHole|ImpactHole]]
  |   |   +- [[Legacy:NuclearMark|NuclearMark]]
  |   |   +- [[Legacy:Pock|Pock]]
  |   |   +- [[Legacy:RipperMark|RipperMark]]
  |   |   +- [[Legacy:UTBloodPool|UTBloodPool]]
  |   |   |   +- [[Legacy:UTBloodPool2|UTBloodPool2]]
  |   |   +- [[Legacy:WallCrack|WallCrack]]
  |   |
  |   +- [[Legacy:TargetShadow|TargetShadow]]
  |
  +- [[Legacy:Decoration (UT)|Decoration (UT)]] ''How many classes!''
  |   +- [[Legacy:Ut_Decoration|ut_Decoration]]
  |
  +- [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt;
  |
  +- [[Legacy:HUD (UT)|HUD (UT)]]
  |   +- [[Legacy:ChallengeHUD|ChallengeHUD]]
  |   |   +- [[Legacy:ChallengeTeamHUD|ChallengeTeamHUD]]
  |   |       +- [[Legacy:AssaultHUD|AssaultHUD]]
  |   |       +- [[Legacy:ChallengeCTFHUD|ChallengeCTFHUD]]
  |   |       +- [[Legacy:ChallengeDominationHUD|ChallengeDominationHUD]]
  |   |
  |   +- [[Legacy:UnrealHUD|UnrealHUD]] ''Not expanded''
  |
  +- [[Legacy:Info (UT)|Info (UT)]]
  |   +- [[Legacy:AssaultInfo|AssaultInfo]]
  |   +- [[Legacy:BotInfo|BotInfo]]
  |   +- [[Legacy:ChallengeBotInfo|ChallengeBotInfo]]
  |   +- [[Legacy:ClientScriptedTexture|ClientScriptedTexture]]
  |   |   +- [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
  |   +- [[Legacy:CodeMaster|CodeMaster]]
  |   +- [[Legacy:EndStats|EndStats]]
  |   +- [[Legacy:FontInfo|FontInfo]]
  |   +- [[Legacy:GameInfo (UT)|GameInfo (UT)]]
  |   |   +- [[Legacy:TournamentGameInfo|TournamentGameInfo]]
  |   |   |   +- [[Legacy:DeathMatchPlus|DeathMatchPlus]]
  |   |   |   |   +- [[Legacy:ChallengeDMP|ChallengeDMP]]
  |   |   |   |   +- [[Legacy:ChallengeIntro|ChallengeIntro]]
  |   |   |   |   +- [[Legacy:LastManStanding|LastManStanding]]
  |   |   |   |   +- [[Legacy:TDarkMatch|TDarkMatch]]
  |   |   |   |   +- [[Legacy:TeamGamePlus|TeamGamePlus]]
  |   |   |   |   |   +- [[Legacy:Assault|Assault]]
  |   |   |   |   |   |   +- [[Legacy:TrainingAS|TrainingAS]]
  |   |   |   |   |   +- [[Legacy:CTFGame (UT)|CTFGame (UT)]]
  |   |   |   |   |   |   +- [[Legacy:TrainingCTF|TrainingCTF]]
  |   |   |   |   |   +- [[Legacy:Domination|Domination]]
  |   |   |   |   |       +- [[Legacy:TrainingDOM|TrainingDOM]]
  |   |   |   |   |
  |   |   |   |   +- [[Legacy:TrainingDM|TrainingDM]]
  |   |   |   |
  |   |   |   +- [[Legacy:UTIntro|UTIntro]]
  |   |   |       +- [[Legacy:LadderLoadGame|LadderLoadGame]]
  |   |   |       +- [[Legacy:LadderNewGame|LadderNewGame]]
  |   |   |       +- [[Legacy:LadderTransition|LadderTransition]]
  |   |   |       +- [[Legacy:TrophyGame|TrophyGame]]
  |   |   |
  |   |   +- [[Legacy:UnrealGameInfo|UnrealGameInfo]] ''Not expanded''
  |   |
  |   +- [[Legacy:InternetInfo|InternetInfo]] ''Not expanded''
  |   +- [[Legacy:Ladder (UT)|Ladder (UT)]] ''Not expanded''
  |   +- [[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
  |   |   +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
  |   |       +- [[Legacy:CriticalEventPlus|CriticalEventPlus]]
  |   |       |   +- [[Legacy:CriticalEventLowPlus|CriticalEventLowPlus]]
  |   |       |   |   +- [[Legacy:ControlPointMessage|ControlPointMessage]]
  |   |       |   |   +- [[Legacy:KillingSpreeMessage|KillingSpreeMessage]]
  |   |       |   |   +- [[Legacy:LMSOutMessage|LMSOutMessage]]
  |   |       |   |
  |   |       |   +- [[Legacy:CriticalStringPlus|CriticalStringPlus]]
  |   |       |   +- [[Legacy:CTFMessage|CTFMessage]]
  |   |       |   +- [[Legacy:DeathMatchMessage|DeathMatchMessage]]
  |   |       |   +- [[Legacy:FirstBloodMessage|FirstBloodMessage]]
  |   |       |   +- [[Legacy:TimeMessage|TimeMessage]]
  |   |       |
  |   |       +- [[Legacy:CTFMessage2|CTFMessage2]]
  |   |       +- [[Legacy:DeathMessagePlus|DeathMessagePlus]]
  |   |       |   +- [[Legacy:EradicatedDeathMessage|EradicatedDeathMessage]]
  |   |       +- [[Legacy:DecapitationMessage|DecapitationMessage]]
  |   |       +- [[Legacy:ItemMessagePlus|ItemMessagePlus]]
  |   |       +- [[Legacy:KillerMessagePlus|KillerMessagePlus]]
  |   |       +- [[Legacy:MultiKillMessage|MultiKillMessage]]
  |   |       +- [[Legacy:PickupMessagePlus|PickupMessagePlus]]
  |   |       |   +- [[Legacy:PickupMessageHealthPlus|PickupMessageHealthPlus]]
  |   |       +- [[Legacy:StringMesagePlus|StringMesagePlus]]
  |   |       |   +- [[Legacy:RedSayMessagePlus|RedSayMessagePlus]]
  |   |       |   +- [[Legacy:SayMessagePlus|SayMessagePlus]]
  |   |       |   +- [[Legacy:TeamSayMessagePlus|TeamSayMessagePlus]]
  |   |       |
  |   |       +- [[Legacy:VictimMessage|VictimMessage]]
  |   |
  |   +- [[Legacy:MapList|MapList]] ''Not expanded''
  |   +- [[Legacy:MeshActor|MeshActor]]
  |   +- [[Legacy:Mutator (UT)|Mutator (UT)]]
  |   |   +- [[Legacy:Arena|Arena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|FlakArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|impactarena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|InstaGibDM]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|MinigunArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|PulseArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|RocketArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|ShockArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|SniperArena]]
  |   |   |
  |   |   +- [[Legacy:ChainsawMelee|ChainsawMelee]]
  |   |   +- [[Legacy:DMMutator|DMMutator]]
  |   |   +- [[Legacy:FatBoy|FatBoy]]
  |   |   +- [[Legacy:InstantRockets|InstantRockets]]
  |   |   +- [[Legacy:JumpMatch|JumpMatch]]
  |   |   +- [[Legacy:LowGrav|LowGrav]]
  |   |   +- [[Legacy:NoPowerups|NoPowerups]]
  |   |   +- [[Legacy:NoRedeemer|NoRedeemer]] ''Boooo :)''
  |   |   +- [[Legacy:Relic|Relic]]
  |   |   |   +- [[Legacy:RelicDeath|RelicDeath]]
  |   |   |   +- [[Legacy:RelicDefense|RelicDefense]]
  |   |   |   +- [[Legacy:RelicRedemption|RelicRedemption]]
  |   |   |   +- [[Legacy:RelicRegen|RelicRegen]]
  |   |   |   +- [[Legacy:RelicSpeed|RelicSpeed]]
  |   |   |   +- [[Legacy:RelicStrength|RelicStrength]]
  |   |   |
  |   |   +- [[Legacy:Stealth|Stealth]]
  |   |
  |   +- [[Legacy:NewGameInterimObject|NewGameInterimObject]]
  |   +- [[Legacy:RatedMatchInfo|RatedMatchInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:RatedTeamInfo|RatedTeamInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:ReplicationInfo|ReplicationInfo]]
  |   |   +- [[Legacy:GameReplicationInfo|GameReplicationInfo]]
  |   |   |   +- [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]]
  |   |   |       +- [[Legacy:CTFReplicationInfo|CTFReplicationInfo]]
  |   |   +- [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]
  |   |       +- [[Legacy:BotReplicationInfo|BotReplicationInfo]]
  |   |
  |   +- [[Legacy:SavedMove|SavedMove]]
  |   +- [[Legacy:ScoreBoard|ScoreBoard]]
  |   |   +- [[Legacy:TournamentScoreBoard|TournamentScoreBoard]]
  |   |   |   +- [[Legacy:LMSScoreBoard|LMSScoreBoard]]
  |   |   |   +- [[Legacy:TeamScoreBoard|TeamScoreBoard]]
  |   |   |       +- [[Legacy:AssaultScoreBoard|AssaultScoreBoard]]
  |   |   |       +- [[Legacy:DominationScoreBoard|DominationScoreBoard]]
  |   |   |       +- [[Legacy:UnrealCTFScoreBoard|UnrealCTFScoreBoard]]
  |   |   |
  |   |   +- [[Legacy:UnrealScoreBoard|UnrealScoreBoard]]
  |   |       +- [[Legacy:UnrealTeamScoreBoard|UnrealTeamScoreBoard]]
  |   +- [[Legacy:SelectionDude|SelectionDude]] ''Not expanded''
  |   +- [[Legacy:ServerInfo|ServerInfo]] ''Not expanded''
  |   |   +- [[Legacy:ServerInfoTeam|ServerInfoTeam]]
  |   |       +- [[Legacy:ServerInfoAS|ServerInfoAS]]
  |   |       +- [[Legacy:ServerInfoCTF|ServerInfoCTF]]
  |   |       +- [[Legacy:ServerInfoDOM|ServerInfoDOM]]
  |   |
  |   +- [[Legacy:StatLog|StatLog]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:TeamInfo|TeamInfo]]
  |   +- [[Legacy:TestInfo|TestInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:VoicePack|VoicePack]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]
  |       +- [[Legacy:CloudZone|CloudZone]]
  |       +- [[Legacy:KillingField|KillingField]]
  |       +- [[Legacy:LavaZone|LavaZone]]
  |       +- [[Legacy:LevelInfo (UT)|LevelInfo (UT)]]
  |       +- [[Legacy:NitrogenZone|NitrogenZone]]
  |       +- [[Legacy:PressureZone|PressureZone]]
  |       +- [[Legacy:SkyZoneInfo|SkyZoneInfo]]
  |       |   +- [[Legacy:RockingSkyZoneInfo|RockingSkyZoneInfo]]
  |       +- [[Legacy:SlimeZone|SlimeZone]]
  |       +- [[Legacy:TarZone|TarZone]]
  |       +- [[Legacy:TeleporterZone|TeleporterZone]]
  |       +- [[Legacy:ToggleZoneInfo|ToggleZoneInfo]]
  |       +- [[Legacy:VacuumZone|VacuumZone]]
  |       +- [[Legacy:WarpZoneInfo|WarpZoneInfo]]
  |       +- [[Legacy:WaterZone|WaterZone]]
  |
  +- [[Legacy:Inventory (UT)|Inventory (UT)]]
  |   +- [[Legacy:LadderInventory|LadderInventory]]
  |   +- [[Legacy:Pickup (UT)|Pickup (UT)]]
  |   |   +- [[Legacy:Ammo (UT)|Ammo (UT)]]
  |   |   |   +- [[Legacy:ASMDAmmo|ASMDAmmo]]
  |   |   |   |   +- [[Legacy:DefaultAmmo|DefaultAmmo]]
  |   |   |   +- [[Legacy:FlakBox|FlakBox]]
  |   |   |   |   +- FlakShellAmmo
  |   |   |   +- [[Legacy:NullAmmo|NullAmmo]]
  |   |   |   +- [[Legacy:RazorAmmo|RazorAmmo]]
  |   |   |   +- [[Legacy:RifleAmmo|RifleAmmo]]
  |   |   |   |   +- RifleRound
  |   |   |   +- [[Legacy:RocketCan|RocketCan]]
  |   |   |   +- [[Legacy:ShellBox|ShellBox]]
  |   |   |   |   +- [[Legacy:Clip|Clip]]
  |   |   |   +- [[Legacy:Shells|Shells]]
  |   |   |   +- [[Legacy:Sludge|Sludge]]
  |   |   |   +- [[Legacy:StingerAmmo|StingerAmmo]]
  |   |   |   +- [[Legacy:TournamentAmmo|TournamentAmmo]]
  |   |   |       +- [[Legacy:BioAmmo|BioAmmo]]
  |   |   |       +- [[Legacy:BladeHopper|BladeHopper]]
  |   |   |       +- [[Legacy:BulletBox|BulletBox]]
  |   |   |       |   +- RifleShell
  |   |   |       +- [[Legacy:FlakAmmo|FlakAmmo]]
  |   |   |       +- [[Legacy:Miniammo|Miniammo]]
  |   |   |       |   +- EClip
  |   |   |       +- [[Legacy:PAmmo|PAmmo]]
  |   |   |       +- [[Legacy:RocketPack|RocketPack]]
  |   |   |       +- [[Legacy:ShockCore|ShockCore]]
  |   |   |       |   +- SuperShockCore
  |   |   |       +- [[Legacy:WarHeadAmmo|WarHeadAmmo]]
  |   |   |
  |   |   +- [[Legacy:Amplifier|Amplifier]]
  |   |   +- [[Legacy:Armor|Armor]]
  |   |   +- [[Legacy:Dampener|Dampener]]
  |   |   +- [[Legacy:Flare|Flare]]
  |   |   +- [[Legacy:Flashlight|Flashlight]]
  |   |   |   +- [[Legacy:SearchLight|SearchLight]]
  |   |   +- [[Legacy:ForceField|ForceField]]
  |   |   +- [[Legacy:Health|Health]]
  |   |   |   +- [[Legacy:Bandages|Bandages]]
  |   |   |   +- [[Legacy:NaliFruit|NaliFruit]]
  |   |   |   +- [[Legacy:SuperHealth|SuperHealth]]
  |   |   |
  |   |   +- [[Legacy:Invisibility|Invisibility]]
  |   |   +- [[Legacy:JumpBoots|JumpBoots]]
  |   |   +- [[Legacy:SCUBAGear|SCUBAGear]]
  |   |   +- [[Legacy:Seeds|Seeds]]
  |   |   +- [[Legacy:Shieldbelt|Shieldbelt]]
  |   |   |   +- [[Legacy:PowerShield|PowerShield]]
  |   |   +- [[Legacy:Suits|Suits]]
  |   |   |   +- [[Legacy:AsbestosSuit|AsbestosSuit]]
  |   |   |   +- [[Legacy:KevlarSuit|KevlarSuit]]
  |   |   |   +- [[Legacy:ToxinSuit|ToxinSuit]]
  |   |   |
  |   |   +- [[Legacy:TournamentHealth|TournamentHealth]]
  |   |   |   +- [[Legacy:HealthPack|HealthPack]]
  |   |   |   +- [[Legacy:HealthVial|HealthVial]]
  |   |   |   +- [[Legacy:MedBox|MedBox]]
  |   |   |
  |   |   +- [[Legacy:TournamentPickup|TournamentPickup]]
  |   |   |   +- [[Legacy:Armor2|Armor2]]
  |   |   |   +- [[Legacy:RelicInventory|RelicInventory]]
  |   |   |   |   +- [[Legacy:RelicDeath|RelicDeathInventory]]
  |   |   |   |   +- [[Legacy:RelicDefense|RelicDefenseInventory]]
  |   |   |   |   +- [[Legacy:RelicRedemption|RelicRedemptionInventory]]
  |   |   |   |   +- [[Legacy:RelicRegen|RelicRegenInventory]]
  |   |   |   |   +- [[Legacy:RelicSpeed|RelicSpeedInventory]]
  |   |   |   |   +- [[Legacy:RelicStrength|RelicStrengthInventory]]
  |   |   |   |
  |   |   |   +- [[Legacy:ThighPads|ThighPads]]
  |   |   |   +- [[Legacy:UDamage|UDamage]]
  |   |   |   +- [[Legacy:UT_invisibility|UT_invisibility]]
  |   |   |   |   +- [[Legacy:UT_Stealth|UT_Stealth]]
  |   |   |   +- [[Legacy:UT_JumpBoots|UT_JumpBoots]]
  |   |   |   +- [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
  |   |   |
  |   |   +- [[Legacy:Translator|Translator]]
  |   |   +- [[Legacy:VoiceBox|VoiceBox]]
  |   |   +- [[Legacy:WeaponPowerup|WeaponPowerup]]
  |   |
  |   +- [[Legacy:TrapSpringer|TrapSpringer]]
  |   +- [[Legacy:Weapon (UT)|Weapon (UT)]]
  |      +- [[Legacy:ASMD|ASMD]]
  |      +- [[Legacy:AutoMag|AutoMag]]
  |      +- [[Legacy:DispersionPistol|DispersionPistol]]
  |      +- [[Legacy:Eightball|Eightball]]
  |      +- [[Legacy:FlakCannon|FlakCannon]]
  |      +- [[Legacy:GESBioRifle|GESBioRifle]]
  |      +- [[Legacy:Minigun|Minigun]]
  |      +- [[Legacy:QuadShot|QuadShot]]
  |      +- [[Legacy:Razorjack|Razorjack]]
  |      +- [[Legacy:Rifle|Rifle]]
  |      +- [[Legacy:Stinger|Stinger]]
  |      +- [[Legacy:TournamentWeapon|TournamentWeapon]]
  |          +- [[Legacy:Chainsaw|Chainsaw]]
  |          +- [[Legacy:Enforcer|Enforcer]]
  |          |   +- [[Legacy:Doubleenforcer|doubleenforcer]]
  |          +- [[Legacy:ImpactHammer|ImpactHammer]]
  |          +- [[Legacy:Minigun|Minigun]]
  |          +- [[Legacy:PulseGun|PulseGun]]
  |          +- [[Legacy:Ripper|ripper]]
  |          +- [[Legacy:ShockRifle|ShockRifle]]
  |          |   +- [[Legacy:SuperShockRifle|SuperShockRifle]]
  |          +- [[Legacy:SniperRifle|SniperRifle]]
  |          +- [[Legacy:Translocator|Translocator]]
  |          +- [[Legacy:UT_BioRifle|ut_biorifle]]
  |          +- [[Legacy:UT_Eightball|UT_Eightball]]
  |          +- [[Legacy:UT_FlakCannon|UT_FlakCannon]]
  |          +- [[Legacy:WarheadLauncher|WarheadLauncher]]
  |
  +- [[Legacy:Keypoint (UT)|Keypoint (UT)]]
  |   +- [[Legacy:AmbientSound (UT)|AmbientSound (UT)]]
  |   +- [[Legacy:BlockAll|BlockAll]]
  |   +- [[Legacy:BlockMonsters|BlockMonsters]]
  |   +- [[Legacy:BlockPlayer|BlockPlayer]]
  |   +- [[Legacy:ClipMarker|ClipMarker]]
  |   +- [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]
  |   +- [[Legacy:Earthquake|Earthquake]]
  |   |   +- [[Legacy:CH_Earthquake|CH_Earthquake]]
  |   +- [[Legacy:GuardPoint|GuardPoint]]
  |   +- [[Legacy:HoldSpot|HoldSpot]]
  |   +- [[Legacy:InterpolationPoint|InterpolationPoint]]
  |   +- [[Legacy:LocationID|LocationID]]
  |   +- [[Legacy:MakeNaliFriendly|MakeNaliFriendly]]
  |   +- [[Legacy:ObjectPath|ObjectPath]]
  |   +- [[Legacy:OEMEnd|OEMEnd]]
  |   +- [[Legacy:PathPoint|PathPoint]]
  |   +- [[Legacy:RockSlide|RockSlide]]
  |   |   +- [[Legacy:MagmaBurst|MagmaBurst]]
  |   +- [[Legacy:SpectatorCam|SpectatorCam]]
  |   |   +- [[Legacy:QuakeCam|QuakeCam]]
  |   +- [[Legacy:ThingFactory|ThingFactory]]
  |   |   +- [[Legacy:CreatureFactory|CreatureFactory]]
  |   +- [[Legacy:ThrowStuff|ThrowStuff]]
  |   +- [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]
  |   +- [[Legacy:WayBeacon|WayBeacon]]
  |
  +- [[Legacy:Light (UT)|Light (UT)]]
  |   +- [[Legacy:ChargeLight|ChargeLight]]
  |   +- [[Legacy:DistanceLighting|DistanceLighting]]
  |   +- [[Legacy:FlashLightBeam|FlashLightBeam]]
  |   +- [[Legacy:OverheadLight|OverheadLight]]
  |   +- [[Legacy:QueenTeleportLight|QueenTeleportLight]]
  |   +- [[Legacy:SightLight|SightLight]]
  |   +- [[Legacy:SpotLight|SpotLight]]
  |   +- [[Legacy:TorchFlame|TorchFlame]]
  |   +- [[Legacy:TriggerLight|TriggerLight]] ''There are two identical TriggerLight actors in Engine and UnrealShare.''
  |   +- [[Legacy:TriggerLightRad|TriggerLightRad]]
  |   +- [[Legacy:WeaponLight|WeaponLight]]
  |       +- [[Legacy:EffectLight|EffectLight]]
  |       +- [[Legacy:PurpleLight|PurpleLight]]
  |
  +- [[Legacy:Menu|Menu]] ''Not expanded - no plans to at this time''
  |
  +- [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt;
  |
  +- [[Legacy:Pawn (UT)|Pawn (UT)]]
  |   +- [[Legacy:Bot (UT)|Bot (UT)]]
  |   |   +- [[Legacy:HumanBotPlus|HumanBotPlus]]
  |   |   |   +- [[Legacy:FemaleBotPlus|FemaleBotPlus]]
  |   |   |   |   +- [[Legacy:TFemaleBot1|TFemaleBot1]]
  |   |   |   |   +- [[Legacy:TFemaleBot2|TFemaleBot2]]
  |   |   |   |
  |   |   |   +- [[Legacy:MaleBotPlus|MaleBotPlus]]
  |   |   |       +- [[Legacy:TBossBot|TBossBot]]
  |   |   |       +- [[Legacy:TMale1Bot|TMale1Bot]]
  |   |   |       +- [[Legacy:TMale2Bot|TMale2Bot]]
  |   |   |
  |   |   +- [[Legacy:SkaarjBot|SkaarjBot]]
  |   |
  |   +- [[Legacy:Bots|Bots]] ''Not expanded''
  |   +- [[Legacy:FlockMasterPawn|FlockMasterPawn]] ''Not expanded''
  |   +- [[Legacy:FlockPawn|FlockPawn]] ''Not expanded''
  |   +- [[Legacy:PlayerPawn|PlayerPawn]] ''Not expanded''
  |   +- [[Legacy:Scout|Scout]] ''Not expanded''
  |   +- [[Legacy:ScriptedPawn|ScriptedPawn]] ''Not expanded''
  |   +- [[Legacy:StationaryPawn|StationaryPawn]] ''Not expanded''
  |
  +- [[Legacy:Projectile (UT)|Projectile (UT)]] ''Not expanded''
  +- [[Legacy:ShareSounds|ShareSounds]]
  +- [[Legacy:SpawnNotify|SpawnNotify]]
  +- [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1295</id>
      <timestamp>2006-11-30T16:51:22Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here is the [[Legacy:Unreal Tournament|Unreal Tournament]] [[Legacy:Class Tree|Class Tree]] hierarchy from Actor in all its beauty and glory.  The Actor class inherits from [[Legacy:Object (UT)|Object (UT)]].  There are a whole host of non actor classes that might get added in here eventually.  One of the things I don't like about the way the class hierarchies have been built is that quite often a subclass exists purely to customise data rather than behaviour.

: The behaviour / data distinction is something we could label here. I agree with you, there are some groups that don't need expanding here, for example: Effects are expanded on the [[Legacy:Effects (UT)|Effects (UT)]] class page anyway; with Decoration it's worth marking as you have that there's a subtree UTDecoration (it's a pain if you ask me, they could have chosen a name that put it at the top... sigh)   &amp;ndash; ''Tarquin'' 
: I'm sure I read somewhere that there is a fairly chunky memory and performance overhead when including any of the original Unreal content in the UnrealTournament levels as the entire Unreal actor tree gets loaded.  The actors are diverse at the C++ level so the amount of &quot;code&quot; that UT loads is significantly increased.  I'll be damned if I can find the reference I read it in though.  It may even only apply to decoration types. &amp;ndash; ''EntropicLqd''

 [[Legacy:Actor (UT)|Actor (UT)]]
  +- [[Legacy:Brush|Brush]]
  |   +- [[Legacy:Mover (UT)|Mover (UT)]]
  |       +- [[Legacy:AssertMover|AssertMover]]
  |       +- [[Legacy:AttachMover|AttachMover]]
  |       +- [[Legacy:ElevatorMover|ElevatorMover]]
  |       +- [[Legacy:GradualMover|GradualMover]]
  |       +- [[Legacy:LoopMover|LoopMover]]
  |       +- [[Legacy:MixMover|MixMover]]
  |       +- [[Legacy:RotatingMover|RotatingMover]]
  |
  +- [[Legacy:DamageType (UT)|DamageType (UT)]] ''Not used''
  |   +- UnrealDamageType
  |       +- Burned
  |       +- Corroded
  |       +- Decapitated
  |       +- Drowned
  |       +- Fell
  |
  +- [[Legacy:Decal|Decal]]
  |   +- [[Legacy:FadeShadow|FadeShadow]]
  |   +- [[Legacy:PlayerShadow|PlayerShadow]]
  |   +- [[Legacy:Scorch|Scorch]]
  |   |   +- [[Legacy:BigEnergyImpact|BigEnergyImpact]]
  |   |   +- [[Legacy:Biomark|biomark]]
  |   |   +- [[Legacy:BlastMark|BlastMark]]
  |   |   +- [[Legacy:BloodSplat|BloodSplat]]
  |   |   +- [[Legacy:DirectionalBlast|DirectionalBlast]]
  |   |   +- [[Legacy:EnergyImpact|EnergyImpact]]
  |   |   |   +- [[Legacy:BoltScorch|BoltScorch]]
  |   |   +- [[Legacy:ImpactHole|ImpactHole]]
  |   |   +- [[Legacy:NuclearMark|NuclearMark]]
  |   |   +- [[Legacy:Pock|Pock]]
  |   |   +- [[Legacy:RipperMark|RipperMark]]
  |   |   +- [[Legacy:UTBloodPool|UTBloodPool]]
  |   |   |   +- [[Legacy:UTBloodPool2|UTBloodPool2]]
  |   |   +- [[Legacy:WallCrack|WallCrack]]
  |   |
  |   +- [[Legacy:TargetShadow|TargetShadow]]
  |
  +- [[Legacy:Decoration (UT)|Decoration (UT)]] ''How many classes!''
  |   +- [[Legacy:Ut_Decoration|ut_Decoration]]
  |
  +- [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt;
  |
  +- [[Legacy:HUD (UT)|HUD (UT)]]
  |   +- [[Legacy:ChallengeHUD|ChallengeHUD]]
  |   |   +- [[Legacy:ChallengeTeamHUD|ChallengeTeamHUD]]
  |   |       +- [[Legacy:AssaultHUD|AssaultHUD]]
  |   |       +- [[Legacy:ChallengeCTFHUD|ChallengeCTFHUD]]
  |   |       +- [[Legacy:ChallengeDominationHUD|ChallengeDominationHUD]]
  |   |
  |   +- [[Legacy:UnrealHUD|UnrealHUD]] ''Not expanded''
  |
  +- [[Legacy:Info (UT)|Info (UT)]]
  |   +- [[Legacy:AssaultInfo|AssaultInfo]]
  |   +- [[Legacy:BotInfo|BotInfo]]
  |   +- [[Legacy:ChallengeBotInfo|ChallengeBotInfo]]
  |   +- [[Legacy:ClientScriptedTexture|ClientScriptedTexture]]
  |   |   +- [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
  |   +- [[Legacy:CodeMaster|CodeMaster]]
  |   +- [[Legacy:EndStats|EndStats]]
  |   +- [[Legacy:FontInfo|FontInfo]]
  |   +- [[Legacy:GameInfo (UT)|GameInfo (UT)]]
  |   |   +- [[Legacy:TournamentGameInfo|TournamentGameInfo]]
  |   |   |   +- [[Legacy:DeathMatchPlus|DeathMatchPlus]]
  |   |   |   |   +- [[Legacy:ChallengeDMP|ChallengeDMP]]
  |   |   |   |   +- [[Legacy:ChallengeIntro|ChallengeIntro]]
  |   |   |   |   +- [[Legacy:LastManStanding|LastManStanding]]
  |   |   |   |   +- [[Legacy:TDarkMatch|TDarkMatch]]
  |   |   |   |   +- [[Legacy:TeamGamePlus|TeamGamePlus]]
  |   |   |   |   |   +- [[Legacy:Assault|Assault]]
  |   |   |   |   |   |   +- [[Legacy:TrainingAS|TrainingAS]]
  |   |   |   |   |   +- [[Legacy:CTFGame (UT)|CTFGame (UT)]]
  |   |   |   |   |   |   +- [[Legacy:TrainingCTF|TrainingCTF]]
  |   |   |   |   |   +- [[Legacy:Domination|Domination]]
  |   |   |   |   |       +- [[Legacy:TrainingDOM|TrainingDOM]]
  |   |   |   |   |
  |   |   |   |   +- [[Legacy:TrainingDM|TrainingDM]]
  |   |   |   |
  |   |   |   +- [[Legacy:UTIntro|UTIntro]]
  |   |   |       +- [[Legacy:LadderLoadGame|LadderLoadGame]]
  |   |   |       +- [[Legacy:LadderNewGame|LadderNewGame]]
  |   |   |       +- [[Legacy:LadderTransition|LadderTransition]]
  |   |   |       +- [[Legacy:TrophyGame|TrophyGame]]
  |   |   |
  |   |   +- [[Legacy:UnrealGameInfo|UnrealGameInfo]] ''Not expanded''
  |   |
  |   +- [[Legacy:InternetInfo|InternetInfo]] ''Not expanded''
  |   +- [[Legacy:Ladder (UT)|Ladder (UT)]] ''Not expanded''
  |   +- [[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
  |   |   +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
  |   |       +- [[Legacy:CriticalEventPlus|CriticalEventPlus]]
  |   |       |   +- [[Legacy:CriticalEventLowPlus|CriticalEventLowPlus]]
  |   |       |   |   +- [[Legacy:ControlPointMessage|ControlPointMessage]]
  |   |       |   |   +- [[Legacy:KillingSpreeMessage|KillingSpreeMessage]]
  |   |       |   |   +- [[Legacy:LMSOutMessage|LMSOutMessage]]
  |   |       |   |
  |   |       |   +- [[Legacy:CriticalStringPlus|CriticalStringPlus]]
  |   |       |   +- [[Legacy:CTFMessage|CTFMessage]]
  |   |       |   +- [[Legacy:DeathMatchMessage|DeathMatchMessage]]
  |   |       |   +- [[Legacy:FirstBloodMessage|FirstBloodMessage]]
  |   |       |   +- [[Legacy:TimeMessage|TimeMessage]]
  |   |       |
  |   |       +- [[Legacy:CTFMessage2|CTFMessage2]]
  |   |       +- [[Legacy:DeathMessagePlus|DeathMessagePlus]]
  |   |       |   +- [[Legacy:EradicatedDeathMessage|EradicatedDeathMessage]]
  |   |       +- [[Legacy:DecapitationMessage|DecapitationMessage]]
  |   |       +- [[Legacy:ItemMessagePlus|ItemMessagePlus]]
  |   |       +- [[Legacy:KillerMessagePlus|KillerMessagePlus]]
  |   |       +- [[Legacy:MultiKillMessage|MultiKillMessage]]
  |   |       +- [[Legacy:PickupMessagePlus|PickupMessagePlus]]
  |   |       |   +- [[Legacy:PickupMessageHealthPlus|PickupMessageHealthPlus]]
  |   |       +- [[Legacy:StringMesagePlus|StringMesagePlus]]
  |   |       |   +- [[Legacy:RedSayMessagePlus|RedSayMessagePlus]]
  |   |       |   +- [[Legacy:SayMessagePlus|SayMessagePlus]]
  |   |       |   +- [[Legacy:TeamSayMessagePlus|TeamSayMessagePlus]]
  |   |       |
  |   |       +- [[Legacy:VictimMessage|VictimMessage]]
  |   |
  |   +- [[Legacy:MapList|MapList]] ''Not expanded''
  |   +- [[Legacy:MeshActor|MeshActor]]
  |   +- [[Legacy:Mutator (UT)|Mutator (UT)]]
  |   |   +- [[Legacy:Arena|Arena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|FlakArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|impactarena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|InstaGibDM]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|MinigunArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|PulseArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|RocketArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|ShockArena]]
  |   |   |   +- [[Legacy:Specific_Arena_Mutators|SniperArena]]
  |   |   |
  |   |   +- [[Legacy:ChainsawMelee|ChainsawMelee]]
  |   |   +- [[Legacy:DMMutator|DMMutator]]
  |   |   +- [[Legacy:FatBoy|FatBoy]]
  |   |   +- [[Legacy:InstantRockets|InstantRockets]]
  |   |   +- [[Legacy:JumpMatch|JumpMatch]]
  |   |   +- [[Legacy:LowGrav|LowGrav]]
  |   |   +- [[Legacy:NoPowerups|NoPowerups]]
  |   |   +- [[Legacy:NoRedeemer|NoRedeemer]]
  |   |   +- [[Legacy:Relic|Relic]]
  |   |   |   +- [[Legacy:RelicDeath|RelicDeath]]
  |   |   |   +- [[Legacy:RelicDefense|RelicDefense]]
  |   |   |   +- [[Legacy:RelicRedemption|RelicRedemption]]
  |   |   |   +- [[Legacy:RelicRegen|RelicRegen]]
  |   |   |   +- [[Legacy:RelicSpeed|RelicSpeed]]
  |   |   |   +- [[Legacy:RelicStrength|RelicStrength]]
  |   |   |
  |   |   +- [[Legacy:Stealth|Stealth]]
  |   |
  |   +- [[Legacy:NewGameInterimObject|NewGameInterimObject]]
  |   +- [[Legacy:RatedMatchInfo|RatedMatchInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:RatedTeamInfo|RatedTeamInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:ReplicationInfo|ReplicationInfo]]
  |   |   +- [[Legacy:GameReplicationInfo|GameReplicationInfo]]
  |   |   |   +- [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]]
  |   |   |       +- [[Legacy:CTFReplicationInfo|CTFReplicationInfo]]
  |   |   +- [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]
  |   |       +- [[Legacy:BotReplicationInfo|BotReplicationInfo]]
  |   |
  |   +- [[Legacy:SavedMove|SavedMove]]
  |   +- [[Legacy:ScoreBoard|ScoreBoard]]
  |   |   +- [[Legacy:TournamentScoreBoard|TournamentScoreBoard]]
  |   |   |   +- [[Legacy:LMSScoreBoard|LMSScoreBoard]]
  |   |   |   +- [[Legacy:TeamScoreBoard|TeamScoreBoard]]
  |   |   |       +- [[Legacy:AssaultScoreBoard|AssaultScoreBoard]]
  |   |   |       +- [[Legacy:DominationScoreBoard|DominationScoreBoard]]
  |   |   |       +- [[Legacy:UnrealCTFScoreBoard|UnrealCTFScoreBoard]]
  |   |   |
  |   |   +- [[Legacy:UnrealScoreBoard|UnrealScoreBoard]]
  |   |       +- [[Legacy:UnrealTeamScoreBoard|UnrealTeamScoreBoard]]
  |   +- [[Legacy:SelectionDude|SelectionDude]] ''Not expanded''
  |   +- [[Legacy:ServerInfo|ServerInfo]] ''Not expanded''
  |   |   +- [[Legacy:ServerInfoTeam|ServerInfoTeam]]
  |   |       +- [[Legacy:ServerInfoAS|ServerInfoAS]]
  |   |       +- [[Legacy:ServerInfoCTF|ServerInfoCTF]]
  |   |       +- [[Legacy:ServerInfoDOM|ServerInfoDOM]]
  |   |
  |   +- [[Legacy:StatLog|StatLog]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:TeamInfo|TeamInfo]]
  |   +- [[Legacy:TestInfo|TestInfo]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:VoicePack|VoicePack]] ''Not expanded - no plans to at this time''
  |   +- [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]
  |       +- [[Legacy:CloudZone|CloudZone]]
  |       +- [[Legacy:KillingField|KillingField]]
  |       +- [[Legacy:LavaZone|LavaZone]]
  |       +- [[Legacy:LevelInfo (UT)|LevelInfo (UT)]]
  |       +- [[Legacy:NitrogenZone|NitrogenZone]]
  |       +- [[Legacy:PressureZone|PressureZone]]
  |       +- [[Legacy:SkyZoneInfo|SkyZoneInfo]]
  |       |   +- [[Legacy:RockingSkyZoneInfo|RockingSkyZoneInfo]]
  |       +- [[Legacy:SlimeZone|SlimeZone]]
  |       +- [[Legacy:TarZone|TarZone]]
  |       +- [[Legacy:TeleporterZone|TeleporterZone]]
  |       +- [[Legacy:ToggleZoneInfo|ToggleZoneInfo]]
  |       +- [[Legacy:VacuumZone|VacuumZone]]
  |       +- [[Legacy:WarpZoneInfo|WarpZoneInfo]]
  |       +- [[Legacy:WaterZone|WaterZone]]
  |
  +- [[Legacy:Inventory (UT)|Inventory (UT)]]
  |   +- [[Legacy:LadderInventory|LadderInventory]]
  |   +- [[Legacy:Pickup (UT)|Pickup (UT)]]
  |   |   +- [[Legacy:Ammo (UT)|Ammo (UT)]]
  |   |   |   +- [[Legacy:ASMDAmmo|ASMDAmmo]]
  |   |   |   |   +- [[Legacy:DefaultAmmo|DefaultAmmo]]
  |   |   |   +- [[Legacy:FlakBox|FlakBox]]
  |   |   |   |   +- FlakShellAmmo
  |   |   |   +- [[Legacy:NullAmmo|NullAmmo]]
  |   |   |   +- [[Legacy:RazorAmmo|RazorAmmo]]
  |   |   |   +- [[Legacy:RifleAmmo|RifleAmmo]]
  |   |   |   |   +- RifleRound
  |   |   |   +- [[Legacy:RocketCan|RocketCan]]
  |   |   |   +- [[Legacy:ShellBox|ShellBox]]
  |   |   |   |   +- [[Legacy:Clip|Clip]]
  |   |   |   +- [[Legacy:Shells|Shells]]
  |   |   |   +- [[Legacy:Sludge|Sludge]]
  |   |   |   +- [[Legacy:StingerAmmo|StingerAmmo]]
  |   |   |   +- [[Legacy:TournamentAmmo|TournamentAmmo]]
  |   |   |       +- [[Legacy:BioAmmo|BioAmmo]]
  |   |   |       +- [[Legacy:BladeHopper|BladeHopper]]
  |   |   |       +- [[Legacy:BulletBox|BulletBox]]
  |   |   |       |   +- RifleShell
  |   |   |       +- [[Legacy:FlakAmmo|FlakAmmo]]
  |   |   |       +- [[Legacy:Miniammo|Miniammo]]
  |   |   |       |   +- EClip
  |   |   |       +- [[Legacy:PAmmo|PAmmo]]
  |   |   |       +- [[Legacy:RocketPack|RocketPack]]
  |   |   |       +- [[Legacy:ShockCore|ShockCore]]
  |   |   |       |   +- SuperShockCore
  |   |   |       +- [[Legacy:WarHeadAmmo|WarHeadAmmo]]
  |   |   |
  |   |   +- [[Legacy:Amplifier|Amplifier]]
  |   |   +- [[Legacy:Armor|Armor]]
  |   |   +- [[Legacy:Dampener|Dampener]]
  |   |   +- [[Legacy:Flare|Flare]]
  |   |   +- [[Legacy:Flashlight|Flashlight]]
  |   |   |   +- [[Legacy:SearchLight|SearchLight]]
  |   |   +- [[Legacy:ForceField|ForceField]]
  |   |   +- [[Legacy:Health|Health]]
  |   |   |   +- [[Legacy:Bandages|Bandages]]
  |   |   |   +- [[Legacy:NaliFruit|NaliFruit]]
  |   |   |   +- [[Legacy:SuperHealth|SuperHealth]]
  |   |   |
  |   |   +- [[Legacy:Invisibility|Invisibility]]
  |   |   +- [[Legacy:JumpBoots|JumpBoots]]
  |   |   +- [[Legacy:SCUBAGear|SCUBAGear]]
  |   |   +- [[Legacy:Seeds|Seeds]]
  |   |   +- [[Legacy:Shieldbelt|Shieldbelt]]
  |   |   |   +- [[Legacy:PowerShield|PowerShield]]
  |   |   +- [[Legacy:Suits|Suits]]
  |   |   |   +- [[Legacy:AsbestosSuit|AsbestosSuit]]
  |   |   |   +- [[Legacy:KevlarSuit|KevlarSuit]]
  |   |   |   +- [[Legacy:ToxinSuit|ToxinSuit]]
  |   |   |
  |   |   +- [[Legacy:TournamentHealth|TournamentHealth]]
  |   |   |   +- [[Legacy:HealthPack|HealthPack]]
  |   |   |   +- [[Legacy:HealthVial|HealthVial]]
  |   |   |   +- [[Legacy:MedBox|MedBox]]
  |   |   |
  |   |   +- [[Legacy:TournamentPickup|TournamentPickup]]
  |   |   |   +- [[Legacy:Armor2|Armor2]]
  |   |   |   +- [[Legacy:RelicInventory|RelicInventory]]
  |   |   |   |   +- [[Legacy:RelicDeath|RelicDeathInventory]]
  |   |   |   |   +- [[Legacy:RelicDefense|RelicDefenseInventory]]
  |   |   |   |   +- [[Legacy:RelicRedemption|RelicRedemptionInventory]]
  |   |   |   |   +- [[Legacy:RelicRegen|RelicRegenInventory]]
  |   |   |   |   +- [[Legacy:RelicSpeed|RelicSpeedInventory]]
  |   |   |   |   +- [[Legacy:RelicStrength|RelicStrengthInventory]]
  |   |   |   |
  |   |   |   +- [[Legacy:ThighPads|ThighPads]]
  |   |   |   +- [[Legacy:UDamage|UDamage]]
  |   |   |   +- [[Legacy:UT_invisibility|UT_invisibility]]
  |   |   |   |   +- [[Legacy:UT_Stealth|UT_Stealth]]
  |   |   |   +- [[Legacy:UT_JumpBoots|UT_JumpBoots]]
  |   |   |   +- [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
  |   |   |
  |   |   +- [[Legacy:Translator|Translator]]
  |   |   +- [[Legacy:VoiceBox|VoiceBox]]
  |   |   +- [[Legacy:WeaponPowerup|WeaponPowerup]]
  |   |
  |   +- [[Legacy:TrapSpringer|TrapSpringer]]
  |   +- [[Legacy:Weapon (UT)|Weapon (UT)]]
  |      +- [[Legacy:ASMD|ASMD]]
  |      +- [[Legacy:AutoMag|AutoMag]]
  |      +- [[Legacy:DispersionPistol|DispersionPistol]]
  |      +- [[Legacy:Eightball|Eightball]]
  |      +- [[Legacy:FlakCannon|FlakCannon]]
  |      +- [[Legacy:GESBioRifle|GESBioRifle]]
  |      +- [[Legacy:Minigun|Minigun]]
  |      +- [[Legacy:QuadShot|QuadShot]]
  |      +- [[Legacy:Razorjack|Razorjack]]
  |      +- [[Legacy:Rifle|Rifle]]
  |      +- [[Legacy:Stinger|Stinger]]
  |      +- [[Legacy:TournamentWeapon|TournamentWeapon]]
  |          +- [[Legacy:Chainsaw|Chainsaw]]
  |          +- [[Legacy:Enforcer|Enforcer]]
  |          |   +- [[Legacy:Doubleenforcer|doubleenforcer]]
  |          +- [[Legacy:ImpactHammer|ImpactHammer]]
  |          +- [[Legacy:Minigun|Minigun]]
  |          +- [[Legacy:PulseGun|PulseGun]]
  |          +- [[Legacy:Ripper|ripper]]
  |          +- [[Legacy:ShockRifle|ShockRifle]]
  |          |   +- [[Legacy:SuperShockRifle|SuperShockRifle]]
  |          +- [[Legacy:SniperRifle|SniperRifle]]
  |          +- [[Legacy:Translocator|Translocator]]
  |          +- [[Legacy:UT_BioRifle|ut_biorifle]]
  |          +- [[Legacy:UT_Eightball|UT_Eightball]]
  |          +- [[Legacy:UT_FlakCannon|UT_FlakCannon]]
  |          +- [[Legacy:WarheadLauncher|WarheadLauncher]]
  |
  +- [[Legacy:Keypoint (UT)|Keypoint (UT)]]
  |   +- [[Legacy:AmbientSound (UT)|AmbientSound (UT)]]
  |   +- [[Legacy:BlockAll|BlockAll]]
  |   +- [[Legacy:BlockMonsters|BlockMonsters]]
  |   +- [[Legacy:BlockPlayer|BlockPlayer]]
  |   +- [[Legacy:ClipMarker|ClipMarker]]
  |   +- [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]
  |   +- [[Legacy:Earthquake|Earthquake]]
  |   |   +- [[Legacy:CH_Earthquake|CH_Earthquake]]
  |   +- [[Legacy:GuardPoint|GuardPoint]]
  |   +- [[Legacy:HoldSpot|HoldSpot]]
  |   +- [[Legacy:InterpolationPoint|InterpolationPoint]]
  |   +- [[Legacy:LocationID|LocationID]]
  |   +- [[Legacy:MakeNaliFriendly|MakeNaliFriendly]]
  |   +- [[Legacy:ObjectPath|ObjectPath]]
  |   +- [[Legacy:OEMEnd|OEMEnd]]
  |   +- [[Legacy:PathPoint|PathPoint]]
  |   +- [[Legacy:RockSlide|RockSlide]]
  |   |   +- [[Legacy:MagmaBurst|MagmaBurst]]
  |   +- [[Legacy:SpectatorCam|SpectatorCam]]
  |   |   +- [[Legacy:QuakeCam|QuakeCam]]
  |   +- [[Legacy:ThingFactory|ThingFactory]]
  |   |   +- [[Legacy:CreatureFactory|CreatureFactory]]
  |   +- [[Legacy:ThrowStuff|ThrowStuff]]
  |   +- [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]
  |   +- [[Legacy:WayBeacon|WayBeacon]]
  |
  +- [[Legacy:Light (UT)|Light (UT)]]
  |   +- [[Legacy:ChargeLight|ChargeLight]]
  |   +- [[Legacy:DistanceLighting|DistanceLighting]]
  |   +- [[Legacy:FlashLightBeam|FlashLightBeam]]
  |   +- [[Legacy:OverheadLight|OverheadLight]]
  |   +- [[Legacy:QueenTeleportLight|QueenTeleportLight]]
  |   +- [[Legacy:SightLight|SightLight]]
  |   +- [[Legacy:SpotLight|SpotLight]]
  |   +- [[Legacy:TorchFlame|TorchFlame]]
  |   +- [[Legacy:TriggerLight|TriggerLight]] ''There are two identical TriggerLight actors in Engine and UnrealShare.''
  |   +- [[Legacy:TriggerLightRad|TriggerLightRad]]
  |   +- [[Legacy:WeaponLight|WeaponLight]]
  |       +- [[Legacy:EffectLight|EffectLight]]
  |       +- [[Legacy:PurpleLight|PurpleLight]]
  |
  +- [[Legacy:Menu|Menu]] ''Not expanded - no plans to at this time''
  |
  +- [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt;
  |
  +- [[Legacy:Pawn (UT)|Pawn (UT)]]
  |   +- [[Legacy:Bot (UT)|Bot (UT)]]
  |   |   +- [[Legacy:HumanBotPlus|HumanBotPlus]]
  |   |   |   +- [[Legacy:FemaleBotPlus|FemaleBotPlus]]
  |   |   |   |   +- [[Legacy:TFemaleBot1|TFemaleBot1]]
  |   |   |   |   +- [[Legacy:TFemaleBot2|TFemaleBot2]]
  |   |   |   |
  |   |   |   +- [[Legacy:MaleBotPlus|MaleBotPlus]]
  |   |   |       +- [[Legacy:TBossBot|TBossBot]]
  |   |   |       +- [[Legacy:TMale1Bot|TMale1Bot]]
  |   |   |       +- [[Legacy:TMale2Bot|TMale2Bot]]
  |   |   |
  |   |   +- [[Legacy:SkaarjBot|SkaarjBot]]
  |   |
  |   +- [[Legacy:Bots|Bots]] ''Not expanded''
  |   +- [[Legacy:FlockMasterPawn|FlockMasterPawn]] ''Not expanded''
  |   +- [[Legacy:FlockPawn|FlockPawn]] ''Not expanded''
  |   +- [[Legacy:PlayerPawn|PlayerPawn]] ''Not expanded''
  |   +- [[Legacy:Scout|Scout]] ''Not expanded''
  |   +- [[Legacy:ScriptedPawn|ScriptedPawn]] ''Not expanded''
  |   +- [[Legacy:StationaryPawn|StationaryPawn]] ''Not expanded''
  |
  +- [[Legacy:Projectile (UT)|Projectile (UT)]] ''Not expanded''
  +- [[Legacy:ShareSounds|ShareSounds]]
  +- [[Legacy:SpawnNotify|SpawnNotify]]
  +- [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Classes</title>
    <id>336</id>
    <revision>
      <id>1180</id>
      <timestamp>2002-10-24T12:58:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>#REDIRECT [[Actor Class Browser]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor Class Browser|Actor Class Browser]]</text>
    </revision>
    <revision>
      <id>1181</id>
      <timestamp>2002-04-21T22:18:25Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <comment>Now redirects to [[Actor]] page, which covers Actor Classes.   This page's content moved to [[Working With Actors]].</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor|Actor]]

==Actor Classes Browser ==

The Actor Classes Browser is what has to be used to add anything from decorations (meshes), spawnpoints, inventory items to special effect to your level.   The Actor Classes Browser as the name suggests is a utility within the [[Legacy:UnrealEd Interface|Editor]] that allows you to browse through the list of actors available in your UT. Once an Actor is selected you can add it to your level by right-clicking on the spot where you want it to go and hitting 'add &lt;selected actor&gt; here'. The browser can also be used to export actors and load up extra packages containing actors.

The Actor Classes Browser is accessed either of two ways: 
* Select ''View'' from the Menu line at the top of the Editor Display, and click on ''Actor Classes Browser''
* Press the Actor Classes Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like a chess pawn (4). 

[[Image:Legacy_interface.toolbar.png|center|]]

==Tips ==

Insert tips here...

==Links ==
* Other parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]:
** The UnrealEd [[Legacy:Toolbar|Toolbar]]
** [[Legacy:Right-Click Menu|Right-click menu]] reference
* Classes:
** [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]] (all on one page)
** [[Legacy:Actor|Actor]] class (browse the tree page by page)</text>
    </revision>
    <revision>
      <id>1182</id>
      <timestamp>2002-06-25T16:35:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page covers the Actor Classes window of UnrealEd's interface in detail. The basics of working with actors are covered in [[Legacy:Actor Overview|Actor Overview]]

==Actor Classes Browser ==

The Actor Classes Browser is what has to be used to add anything from decorations (meshes), spawnpoints, inventory items to special effect to your level.   The Actor Classes Browser as the name suggests is a utility within the [[Legacy:UnrealEd Interface|Editor]] that allows you to browse through the list of actors available in your UT. Once an Actor is selected you can add it to your level by right-clicking on the spot where you want it to go and hitting 'add &lt;selected actor&gt; here'. The browser can also be used to export actors and load up extra packages containing actors.

The Actor Classes Browser is accessed in two ways: 
* Select [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Classes Browser
* Press the Actor Classes Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like a chess pawn (4). 

[[Image:Legacy_interface.toolbar.png|center|]]

==Tips ==

Insert tips here...

==Links ==
* Other parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]:
** The UnrealEd [[Legacy:Toolbar|Toolbar]]
** [[Legacy:Right-Click Menu|Right-click menu]] reference
* Classes:
** [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]] (all on one page)
** [[Legacy:Actor|Actor]] class (browse the tree page by page)

----

: The basics of this page are covered by [[Legacy:Actor Overview|Actor Overview]], however this page should mention more advanced stuff, like editing actor default properties, saving packages, etc. Technical stuff.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Classes Browser</title>
    <id>361</id>
    <revision>
      <id>1240</id>
      <timestamp>2002-10-24T12:58:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*#REDIRECT [[Actor Class Browser]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor Class Browser|Actor Class Browser]]</text>
    </revision>
    <revision>
      <id>1241</id>
      <timestamp>2002-04-19T23:24:00Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <minor/>
      <comment>Created testing redirect</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Classes Browser Menu</title>
    <id>509</id>
    <revision>
      <id>1603</id>
      <timestamp>2006-04-11T21:19:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is the reference for the menubar in the [[Legacy:Actor Class Browser|Actor Class Browser]] window.

See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for other menus.

==File==
; Open Package... : Loads the classes from a [[Legacy:Package|package]]. You might use this if you're working on a mod that has classes not loaded in UnrealEd by default. (You can change the packages loaded at startup in the ini file.)
; Save selected packages : Relatively unlikely you'll ever use this. Remember: [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Context Menu</title>
    <id>375</id>
    <revision>
      <id>1273</id>
      <timestamp>2006-06-01T07:58:54Z</timestamp>
      <contributor>
        <ip>Pool-71-105-113-177.lsanca.dsl-w.verizon.net</ip>
      </contributor>
      <comment>*added keyboard shortcut</comment>
      <text xml:space="preserve">This context menu appears when an [[Legacy:Actor|Actor]] is right-clicked in an [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. A more specialized menu appears on [[Legacy:Brush|brush]]es and [[Legacy:Mover|mover]]s: see [[Legacy:Brush Context Menu|Brush Context Menu]].

For [[Legacy:UnrealEd Interface|UnrealEd Interface]] menus in other windows and context menus, see [[Legacy:UnrealEd Menus|UnrealEd Menus]].

For more on working with actors, see [[Legacy:Actor Overview|Actor Overview]].

; '''&lt;&lt;i&gt;class&lt;/i&gt;&gt; properties''' : opens the floating [[Legacy:Actor Properties Window|actor properties window]] for this actor or group of actors.
; Movers : commands to show mover polygons in the BSP &amp; change the keyframe. See [[Legacy:Mover|mover]].
; Reset -&gt; : reset rotation, pivot, scaling or all. Use the reset rotation command as frequently as possible to avoid [[Legacy:Brush Rotate|gimbal lock]] errors
; Transform -&gt; : 
see also [[Legacy:Brush Transformation|Brush Transformation]].
* '''Mirror About X''': When a pivot is selected, mirrors the brush on x axis.
* '''Mirror About Y''': When a pivot is selected, mirrors the brush on y axis.
* '''Mirror About Z''': When a pivot is selected, mirrors the brush on z axis.
* '''[[Legacy:Transform Permanently|Transform Permanently]]''': Makes any scale changes/other changes to the brush permanent. Resets changed values back to 0.

Note on the mirror commands: the axis is the ''normal'' to the plane of reflection, not the plane of reflection itself (common mistake when thinking in a 2D viewport)


; Order -&gt; : brings selection to front or back of the [[Legacy:Brush Order|Brush Order]]. 
; Polygons -&gt; : 
opens polygons submenu
* '''To Brush''': use on a world brush to make the [[Legacy:Red Builder Brush|red builder brush]] take on its shape.
* '''From Brush''': use on a world brush to make it take the current shape of the red builder brush.
* '''Merge''': merges coplanar faces of a brush. See [[Legacy:Merge Polygons|Merge Polygons]].
* '''Seperate''': seperates faces that have been previously merged. See [[Legacy:Merge Polygons|Merge Polygons]].



; '''Select all &lt;&lt;i&gt;class&lt;/i&gt;&gt;''' : selects all of the same of the selected actor.
; Select all : selects everything in the world, such as brushes, actors, lights, etc... 
;*Note: If used on an actor/brush that is part of a group, it will select all in the particular group.
; Select none : deselects everything that is currently selected.
; Select brushes : allows selection of ALL [[Legacy:Brush|brush]]es that are Additive, Subtractive, [[Legacy:Semisolid|Semisolid]], or [[Legacy:Nonsolid|Nonsolid]].

; Duplicate: creates a copy of a selected actor/brush. The characteristics and values of the selected actor/brush are carried over to the duplicate. Keyboard equivalent: CTRL-W or SHIFT-D
; Delete: deletes selected actors.
; Edit script: opens and displays the UnrealScript code of the selected object's class in the script editor window.
; Make current: Makes the class of this actor the selected class in the [[Legacy:Actor Class Browser|Actor Class Browser]]. It will now show in the [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;class&gt; here command. 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1274</id>
      <timestamp>2004-08-21T16:24:42Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This context menu appears when an [[Legacy:Actor|Actor]] is right-clicked in an [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. A more specialized menu appears on [[Legacy:Brush|brush]]es and [[Legacy:Mover|mover]]s: see [[Legacy:Brush Context Menu|Brush Context Menu]].

For [[Legacy:UnrealEd Interface|UnrealEd Interface]] menus in other windows and context menus, see [[Legacy:UnrealEd Menus|UnrealEd Menus]].

For more on working with actors, see [[Legacy:Actor Overview|Actor Overview]].

; '''&lt;&lt;i&gt;class&lt;/i&gt;&gt; properties''' : opens the floating [[Legacy:Actor Properties Window|actor properties window]] for this actor or group of actors.
; Movers : commands to show mover polygons in the BSP &amp; change the keyframe. See [[Legacy:Mover|mover]].
; Reset -&gt; : reset rotation, pivot, scaling or all. Use the reset rotation command as frequently as possible to avoid [[Legacy:Brush Rotate|gimbal lock]] errors
; Transform -&gt; : 
see also [[Legacy:Brush Transformation|Brush Transformation]].
* '''Mirror About X''': When a pivot is selected, mirrors the brush on x axis.
* '''Mirror About Y''': When a pivot is selected, mirrors the brush on y axis.
* '''Mirror About Z''': When a pivot is selected, mirrors the brush on z axis.
* '''[[Legacy:Transform Permanently|Transform Permanently]]''': Makes any scale changes/other changes to the brush permanent. Resets changed values back to 0.

Note on the mirror commands: the axis is the ''normal'' to the plane of reflection, not the plane of reflection itself (common mistake when thinking in a 2D viewport)


; Order -&gt; : brings selection to front or back of the [[Legacy:Brush Order|Brush Order]]. 
; Polygons -&gt; : 
opens polygons submenu
* '''To Brush''': use on a world brush to make the [[Legacy:Red Builder Brush|red builder brush]] take on its shape.
* '''From Brush''': use on a world brush to make it take the current shape of the red builder brush.
* '''Merge''': merges coplanar faces of a brush. See [[Legacy:Merge Polygons|Merge Polygons]].
* '''Seperate''': seperates faces that have been previously merged. See [[Legacy:Merge Polygons|Merge Polygons]].



; '''Select all &lt;&lt;i&gt;class&lt;/i&gt;&gt;''' : selects all of the same of the selected actor.
; Select all : selects everything in the world, such as brushes, actors, lights, etc... 
;*Note: If used on an actor/brush that is part of a group, it will select all in the particular group.
; Select none : deselects everything that is currently selected.
; Select brushes : allows selection of ALL [[Legacy:Brush|brush]]es that are Additive, Subtractive, [[Legacy:Semisolid|Semisolid]], or [[Legacy:Nonsolid|Nonsolid]].

; Duplicate: creates a copy of a selected actor/brush. The characteristics and values of the selected actor/brush are carried over to the duplicate. Keyboard equivalent: CTRL-W
; Delete: deletes selected actors.
; Edit script: opens and displays the UnrealScript code of the selected object's class in the script editor window.
; Make current: Makes the class of this actor the selected class in the [[Legacy:Actor Class Browser|Actor Class Browser]]. It will now show in the [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;class&gt; here command. 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Overview</title>
    <id>363</id>
    <revision>
      <id>1244</id>
      <timestamp>2005-09-17T09:33:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

&lt;wiki&gt;

==The Actor Classes Browser==

The [[Legacy:Actor Classes|Actor Classes]] Browser shows a hierarchy of all currently loaded actor classes. To bring up the Actor Classes Browser:
* click the button labled &quot;browsers #1&quot; on the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

[[Image:Legacy_interface.toolbar.png|center|'''UnrealEd Toolbar''']]

==How To Insert Actors==

The first step is to select an item in the Actor Classes Browser. Then in one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do:
* [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space. More: [[Legacy:Add An Actor|Add An Actor]].

&lt;/wiki&gt;

[[Image:Legacy_interface-Ed3-actorproperties.png|left|'''Actor Properties Window''']]

&lt;wiki&gt;

==How To Edit Actor Properties==

The [[Legacy:Actor Properties Window|Actor Properties Window]] holds all the settings for an actor. It always updates itself to display information for the currently selected actor or actors. To open it do one of:

* [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; Properties (the first item in the menu)
* Press the button labeled #12 on the [[Legacy:Toolbar|toolbar]] image above
* Press the F4 key
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties

Within this window you can edit the properties for the currently selected Actor. Note that this window isn't a dialog box, there's no &quot;OK&quot; button: changes to properties affect the actor immediately. More: [[Legacy:Set The Following Properties|Set The Following Properties]].

&lt;/wiki&gt;

==How To Delete Actors==

Click the Actor in one of the editor windows that you want to delete.  Then press the Delete key on the keyboard, or do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Delete.

==Other Actor Techniques==
; Duplicate Actor : Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Duplicate to create an exact copy of the actor near to the original.&lt;br /&gt;In UE2 it seems that Actor names are swapped after duplication. New actor gets old actor name and old actor gets a new name.

; Make Current : Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Make Current to make that actor's class the new selected class in the Classes Browser.

; Copy/Paste : If you select an Actor and press CTRL+C, a copy will be placed on the clipboard. This can be pasted into the same map or another, but note that UnrealEd often takes a long time to process a paste command. It can also be pasted into a text editor, where only the properties that have changed from defaults for that actor will be shown. This is very useful for understanding how other mappers have achieved an effect. ''This copy can be pasted in maps, but this feature can cause errors in your map and is not recommended.'' &amp;ndash; not had any problems with this myself.  &amp;rarr;[[Legacy:Tarquin|Tarquin]]
 
; Import/Export Actors : see [[Legacy:Data Import And Export|Data Import And Export]]

; Snap to grid : Make any actor snap to the [[Legacy:Grid|grid]] by setting its Advanced -&gt; bEdShouldSnap property to True

; Superimposed actors : if two actors need to be in the exact same location, set Display -&gt; Drawscale of first one you placed there to something larger than default. You'll get a big icon with the smaller, newer actor on top, and can thus select either easily.

==Actor Properties==

The huge list of properties each actor has may seem daunting at first. The large majority of them are common to ''all'' actor classes. They fall under the following property groups:

; Advanced : Contains deep technical mojo. Some of these are handy for mappers, eg bEdShouldSnap makes the actor snap to the [[Legacy:Grid|grid]]. See [[Legacy:Actor/Advanced|Actor/Advanced]].

; Collision : Determines the size and behaviour of the [[Legacy:Collision Cylinder|Collision Cylinder]] &amp;ndash; for something like a Trigger, this sets the &quot;listening&quot; area. See [[Legacy:Actor/Collision|Actor/Collision]].

; Display : Things relating to the actor's display. Skin textures and sizes of models, for example. See [[Legacy:Actor/Display|Actor/Display]].

; Events : Holds just two properties, which determine how what actors trigger and what they are triggered by. See [[Legacy:Event|Event]] for an overview, and [[Legacy:Actor/Events|Actor/Events]] for technicals.

; Filter : Determines under what cicumstances the actor should appear (eg single player, net game, etc ). See [[Legacy:Actor/Filter|Actor/Filter]].

; Lighting, LightColor : These two groups set the light-emitting properties of the actor. This includes light colour, brightness, effects and fog. See  [[Legacy:Actor/Lighting|Actor/Lighting]].

; Movement : Holds things like rotation, but also an actor's location. See [[Legacy:Actor/Movement|Actor/Movement]].

; Networking : See [[Legacy:Actor/Networking|Actor/Networking]].

; Object : The actor's name and class, which aren't editable, and its [[Legacy:InitialState|InitialState]] property.

; Sound : Sets properties for the actor's ambient sound. See [[Legacy:Actor/Sound|Actor/Sound]].

==Related Topics==
* Reference for the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:Toolbar|Toolbar]] reference
* [[Legacy:Actor Properties Window|Actor Properties Window]]
* [[:Category:Legacy Tutorial]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1245</id>
      <timestamp>2005-09-17T03:42:24Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>duplication side effects</comment>
      <text xml:space="preserve">[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

&lt;wiki&gt;

==The Actor Classes Browser==

The [[Legacy:Actor Classes|Actor Classes]] Browser is used to add anything from [[Legacy:Decoration|Decoration]]s, to event-driven special effects ([[Legacy:Trigger|Trigger]]s) to your level. To bring up the Actor Classes Browser:
* click the button labled &quot;browsers #1&quot; on the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

[[Image:Legacy_interface.toolbar.png|center|'''UnrealEd Toolbar''']]

==How To Insert Actors==

The first step is to select an item in the Actor Classes Browser. Then in one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do:
* [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space. More: [[Legacy:Add An Actor|Add An Actor]].

&lt;/wiki&gt;

[[Image:Legacy_interface-Ed3-actorproperties.png|left|'''Actor Properties Window''']]

&lt;wiki&gt;

==How To Edit Actor Properties==

The [[Legacy:Actor Properties Window|Actor Properties Window]] holds all the settings for an actor. It always updates itself to display information for the currently selected actor or actors. To open it do one of:

* [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; Properties (the first item in the menu)
* Press the button labeled #12 on the [[Legacy:Toolbar|toolbar]] image above
* Press the F4 key
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties

Within this window you can edit the properties for the currently selected Actor. Note that this window isn't a dialog box, there's no &quot;OK&quot; button: changes to properties affect the actor immediately. More: [[Legacy:Set The Following Properties|Set The Following Properties]].

&lt;/wiki&gt;

==How To Delete Actors==

Click the Actor in one of the editor windows that you want to delete.  Then press the Delete key on the keyboard, or do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Delete.

==Other Actor Techniques==
; Duplicate Actor : Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Duplicate to create an exact copy of the actor near to the original.&lt;br /&gt;In UE2 it seems that Actor names are swapped after duplication. New actor gets old actor name and old actor gets a new name.

; Make Current : Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Make Current to make that actor's class the new selected class in the Classes Browser.

; Copy/Paste : If you select an Actor and press CTRL+C, a copy will be placed on the clipboard. This can be pasted into the same map or another, but note that UnrealEd often takes a long time to process a paste command. It can also be pasted into a text editor, where only the properties that have changed from defaults for that actor will be shown. This is very useful for understanding how other mappers have achieved an effect. ''This copy can be pasted in maps, but this feature can cause errors in your map and is not recommended.'' &amp;ndash; not had any problems with this myself.  &amp;rarr;[[Legacy:Tarquin|Tarquin]]
 
; Import/Export Actors : see [[Legacy:Data Import And Export|Data Import And Export]]

; Snap to grid : Make any actor snap to the [[Legacy:Grid|grid]] by setting its Advanced -&gt; bEdShouldSnap property to True

; Superimposed actors : if two actors need to be in the exact same location, set Display -&gt; Drawscale of first one you placed there to something larger than default. You'll get a big icon with the smaller, newer actor on top, and can thus select either easily.

==Actor Properties==

The huge list of properties each actor has may seem daunting at first. The large majority of them are common to ''all'' actor classes. They fall under the following property groups:

; Advanced : Contains deep technical mojo. Some of these are handy for mappers, eg bEdShouldSnap makes the actor snap to the [[Legacy:Grid|grid]]. See [[Legacy:Actor/Advanced|Actor/Advanced]].

; Collision : Determines the size and behaviour of the [[Legacy:Collision Cylinder|Collision Cylinder]] &amp;ndash; for something like a Trigger, this sets the &quot;listening&quot; area. See [[Legacy:Actor/Collision|Actor/Collision]].

; Display : Things relating to the actor's display. Skin textures and sizes of models, for example. See [[Legacy:Actor/Display|Actor/Display]].

; Events : Holds just two properties, which determine how what actors trigger and what they are triggered by. See [[Legacy:Event|Event]] for an overview, and [[Legacy:Actor/Events|Actor/Events]] for technicals.

; Filter : Determines under what cicumstances the actor should appear (eg single player, net game, etc ). See [[Legacy:Actor/Filter|Actor/Filter]].

; Lighting, LightColor : These two groups set the light-emitting properties of the actor. This includes light colour, brightness, effects and fog. See  [[Legacy:Actor/Lighting|Actor/Lighting]].

; Movement : Holds things like rotation, but also an actor's location. See [[Legacy:Actor/Movement|Actor/Movement]].

; Networking : See [[Legacy:Actor/Networking|Actor/Networking]].

; Object : The actor's name and class, which aren't editable, and its [[Legacy:InitialState|InitialState]] property.

; Sound : Sets properties for the actor's ambient sound. See [[Legacy:Actor/Sound|Actor/Sound]].

==Related Topics==
* Reference for the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:Toolbar|Toolbar]] reference
* [[Legacy:Actor Properties Window|Actor Properties Window]]
* [[:Category:Legacy Tutorial]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33032</id>
      <timestamp>2008-09-20T16:46:03Z</timestamp>
      <contributor>
        <username>Death to u</username>
        <id>1255</id>
      </contributor>
      <comment>/* Actor Properties */</comment>
      <text xml:space="preserve">[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

&lt;wiki&gt;

==The Actor Classes Browser==

The [[Legacy:Actor Classes|Actor Classes]] Browser shows a hierarchy of all currently loaded actor classes. To bring up the Actor Classes Browser:
* click the button labled &quot;browsers #1&quot; on the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

[[Image:Legacy_interface.toolbar.png|center|'''UnrealEd Toolbar''']]

==How To Insert Actors==

The first step is to select an item in the Actor Classes Browser. Then in one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do:
* [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space. More: [[Legacy:Add An Actor|Add An Actor]].

&lt;/wiki&gt;

[[Image:Legacy_interface-Ed3-actorproperties.png|left|'''Actor Properties Window''']]

&lt;wiki&gt;

==How To Edit Actor Properties==

The [[Legacy:Actor Properties Window|Actor Properties Window]] holds all the settings for an actor. It always updates itself to display information for the currently selected actor or actors. To open it do one of:

* [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; Properties (the first item in the menu)
* Press the button labeled #12 on the [[Legacy:Toolbar|toolbar]] image above
* Press the F4 key
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties

Within this window you can edit the properties for the currently selected Actor. Note that this window isn't a dialog box, there's no &quot;OK&quot; button: changes to properties affect the actor immediately. More: [[Legacy:Set The Following Properties|Set The Following Properties]].

&lt;/wiki&gt;

==How To Delete Actors==

Click the Actor in one of the editor windows that you want to delete.  Then press the Delete key on the keyboard, or do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Delete.

==Other Actor Techniques==
; Duplicate Actor : Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Duplicate to create an exact copy of the actor near to the original.&lt;br /&gt;In UE2 it seems that Actor names are swapped after duplication. New actor gets old actor name and old actor gets a new name.

; Make Current : Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Make Current to make that actor's class the new selected class in the Classes Browser.

; Copy/Paste : If you select an Actor and press CTRL+C, a copy will be placed on the clipboard. This can be pasted into the same map or another, but note that UnrealEd often takes a long time to process a paste command. It can also be pasted into a text editor, where only the properties that have changed from defaults for that actor will be shown. This is very useful for understanding how other mappers have achieved an effect. ''This copy can be pasted in maps, but this feature can cause errors in your map and is not recommended.'' &amp;ndash; not had any problems with this myself.  &amp;rarr;[[Legacy:Tarquin|Tarquin]]
 
; Import/Export Actors : see [[Legacy:Data Import And Export|Data Import And Export]]

; Snap to grid : Make any actor snap to the [[Legacy:Grid|grid]] by setting its Advanced -&gt; bEdShouldSnap property to True

; Superimposed actors : if two actors need to be in the exact same location, set Display -&gt; Drawscale of first one you placed there to something larger than default. You'll get a big icon with the smaller, newer actor on top, and can thus select either easily.

==Actor Properties==

The huge list of properties each actor has may seem daunting at first. The large majority of them are common to ''all'' actor classes. They fall under the following property groups:

; Advanced : Contains deep technical mojo. Some of these are handy for mappers, eg bEdShouldSnap makes the actor snap to the [[Legacy:Grid|grid]]. See [[Legacy:Actor/Advanced|Actor/Advanced]].

; Collision : Determines the size and behaviour of the [[Legacy:Collision Cylinder|Collision Cylinder]] &amp;ndash; for something like a Trigger, this sets the &quot;listening&quot; area. See [[Legacy:Actor/Collision|Actor/Collision]].

; Display : Things relating to the actor's display. Skin textures and sizes of models, for example. See [[Legacy:Actor/Display|Actor/Display]].

; Events : Holds just two properties, which determine how what actors trigger and what they are triggered by. See [[Legacy:Event|Event]] for an overview, and [[Legacy:Actor/Events|Actor/Events]] for technicals.

; Filter : Determines under what cicumstances the actor should appear (eg single player, net game, etc ). See [[Legacy:Actor/Filter|Actor/Filter]].

; Lighting, LightColor : These two groups set the light-emitting properties of the actor. This includes light colour, brightness, effects and fog. See  [[Legacy:Actor/Lighting|Actor/Lighting]].

; Movement : Holds things like rotation, but also an actor's location. See [[Legacy:Actor/Movement|Actor/Movement]].

; Networking : See [[Legacy:Actor/Networking|Actor/Networking]].

; NavigationPoint : This menu only shows up if the actor selected extends NavigationPoint in the actor class menu.

; Object : The actor's name and class, which aren't editable, and its [[Legacy:InitialState|InitialState]] property.

; Sound : Sets properties for the actor's ambient sound. See [[Legacy:Actor/Sound|Actor/Sound]].

==Related Topics==
* Reference for the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:Toolbar|Toolbar]] reference
* [[Legacy:Actor Properties Window|Actor Properties Window]]
* [[:Category:Legacy Tutorial]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Properties</title>
    <id>362</id>
    <revision>
      <id>1242</id>
      <timestamp>2002-04-25T12:05:55Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>changed redirect to Actor Overview, IMO people who follow this link are more in need of basics than tech spec</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
    <revision>
      <id>1243</id>
      <timestamp>2002-04-21T23:32:34Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <comment>Created (redirect) -- in case it's not apparent, I'm experimenting with redirect usefulness</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor|Actor]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Properties Window</title>
    <id>337</id>
    <revision>
      <id>1183</id>
      <timestamp>2005-11-03T16:59:12Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a floating window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] that lists all the properties of any currently selected actor or actors. Each section heading can be expanded or collapsed by clicking on the small + or - next to the name. Some properties themselves contain several values and are expandable, eg colors, [[Legacy:Vector|vector]]s, and also embedded actors.

Most of the headings are common to all actors; this is because they are defined in the script for the [[Legacy:Actor|Actor]] class and inherited by all subclasses. Many of them are not relevant to a particular given class, for instance the properties under [[Legacy:Actor/Collision|Actor/Collision]] are not used with [[Legacy:Light|Light]] actors. These common properties are explained on the [[Legacy:Actor|Actor]] class page.

When several actors are selected, this list will only show property names they have in common. If no actors are selected, the list window will simply be blank. The window is always in sync with the currently selected actors, and changes to properties apply immediately.

==Opening ==

It can be opened in any of the following ways:
* click the button on the [[Legacy:Toolbar|toolbar]]
* press F4
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties
* Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; properties

[[Image:Legacy_interface-Ed3-actorproperties.png|center|'''Actor Properties Window''']]

==Tips ==

To quickly see how a particular actor's properties differs from the defaults for that class, copy it and then paste into a text editor. Only the properties that are different to the defaults are listed. This can be handy when looking at someone else's map to see how an effect has been achieved.

* Other tips: [[Legacy:UnrealEd Tips|UnrealEd Tips]]

==Other Windows ==

Two other windows look exactly like this one, but are only opened from the View menu:
* [[Legacy:Level Properties|Level Properties]]
* [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]]

The [[Legacy:Surface Properties Window|Surface Properties Window]] is totally unrelated to this window, but the buttons for both are side by side on the toolbar.

==Hidden variables==

Some variables are not displayed in this window. They could be part of a property group concealed with the '''hidecategories''' [[Legacy:Class Syntax|class syntax]], or a hidden variable (i.e., those defined with &quot;var&quot; instead of &quot;var()&quot; [[Legacy:Variable Syntax|variable syntax]]). 

'''WARNING''' Altering some properties of certain actors, especially the bStatic property, may cause your map to fail in network play. You're better off making a subclass if you want to attach a [[Legacy:Light|Light]] to a [[Legacy:Mover|Mover]] and have the map work properly in network play. UnrealEd will balk at you if you alter the default bStatic value of any actors, and clients will likely crash out of network play.

There are a few different ways to edit these hidden properties:

===Method 1: The EditObj [[Legacy:Console Commands|Console Command]]===
* Look up the Actor's '''object name'''. It is stored in the (non-editable) Object -&gt; Name property.  Normally, a Actor's object name is along the lines of &quot;Actor443&quot; (that's &quot;Actor&quot; plus a number).
* In the [[Legacy:UnrealEd Console|UnrealEd console]], enter &quot;editobj Light443&quot; (substitute &quot;Light443&quot; with the object name of your Actor).  This will pop up another window very similar to the normal actor properties window.
* Values you couldn't normally set will show up in the editactor window under the &quot;None&quot; category. Unlike the main Actor Properties Window, this new window is permanently fixed to the actor it was opened for.

Note that you can only edit &quot;hidden properties&quot; in this manner. You cannot edit categories hidden with the '''hidecategories''' [[Legacy:Class Syntax|class syntax]].

===Method 2: The Set [[Legacy:Console Commands|Console Command]]===
* To set a particular variable, you can use
 set &lt;class&gt; &lt;variable name&gt; &lt;setting&gt;
* However, this will set that variable on ALL versions of that Actor (or any actors of this actor's class' subclasses) in the map. It also affects the default value of that variable in the actor's class and any of its subclasses.

===Method 3: Copy-And-Paste===
* In some versions of UnrealEd, you cannot use the &quot;EditObj&quot; command. If you want to change that variable without affecting all other Actors of that class, then you can use the Copy-And-Paste method.
* In the editor window, highlight the Actor or Actors in question.
* Select Edit -&gt; Cut.
* Open your favorite [[Legacy:Text Editor|text editor]] and create a blank file.
* Paste the contents of the clipboard into that file. You'll end up with something like this:

&lt;uscript&gt;
Begin Map
Begin Actor Class=Spotlight Name=Spotlight1
    bDynamicLight=True
    bNetDirty=True
    LastRenderTime=448.986694
    Tag=&quot;Spotlight&quot;
    Level=LevelInfo'MyLevel.LevelInfo0'
    Region=(Zone=LevelInfo'MyLevel.LevelInfo0',iLeaf=1403,ZoneNumber=2)
    PhysicsVolume=DefaultPhysicsVolume'MyLevel.DefaultPhysicsVolume23'
    Location=(X=-1520.892090,Y=-22217.167969,Z=-3488.283203)
    Rotation=(Pitch=-32636,Yaw=147568,Roll=-9544)
    AttachTag=&quot;train&quot;
    bMovable=True
    LightBrightness=255.000000
    bSelected=True
    Name=&quot;Spotlight1&quot;
End Actor
Begin Surface
End Surface
End Map
&lt;/uscript&gt;

Now you can edit whatever properties you want as if you were editing an [[Legacy:Subobject|inline object]] in UnrealScript. Simply add &quot;bStatic=False&quot; or whatever property you're trying to edit between the Begin Actor/End Actor lines. Select all the text and copy it to the clipboard, then go back to UnrealEd and Edit -&gt; Paste -&gt; To Original Location. UnrealEd places actors exactly 32 units off per axis, so you'll have to tweak its position.

===If All Else Fails===

If none of the above methods work for you, you will have to subclass the actor using UnrealScript, and add in the new value in the new class's DefaultProperties. You cannot do this in UnrealEd, since the properties you're trying to change are hidden, so you'll have to actually make a new package. After you do that, add the new package to your EditPackages in [Editor.EditorEngine], start up UnrealEd once again, and place the new actor.

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]] covers the basics of working with actors
* The class page for [[Legacy:Actor|Actor]]
* Reference for the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:Displaying Variables In UnrealEd|Displaying Variables In UnrealEd]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1184</id>
      <timestamp>2005-11-03T15:46:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>despam</comment>
      <text xml:space="preserve">This is a floating window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] that lists all the properties of any currently selected actor or actors. Each section heading can be expanded or collapsed by clicking on the small box next to the name. 

Most of the headings are common to all actors; this is because they are defined in the script for the [[Legacy:Actor|Actor]] class and inherited by all subclasses. Many of them are not relevant to a particular given class, for instance the properties under [[Legacy:Actor/Collision|Actor/Collision]] are not used with [[Legacy:Light|Light]] actors. These common properties are explained on the [[Legacy:Actor|Actor]] class page.

When several actors are selected, this list will only show property names they have in common. If no actors are selected, the list window will simply be blank.

==Opening ==

It can be opened several ways. First, select one or more actors. Then do one of the following:
* click the button on the [[Legacy:Toolbar|toolbar]]
* press F4
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties
* Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; properties

[[Image:Legacy_interface-Ed3-actorproperties.png|center|'''Actor Properties Window''']]

==Tips ==

To quickly see how a particular actor's properties differs from the defaults for that class, copy it and then paste into a text editor. Only the properties that are different to the defaults are listed. This can be handy when looking at someone else's map to see how an effect has been achieved.

* Other tips: [[Legacy:UnrealEd Tips|UnrealEd Tips]]

==Other Windows ==

Two other windows look exactly like this one, but are only opened from the View menu:
* [[Legacy:Level Properties|Level Properties]]
* [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]]

The [[Legacy:Surface Properties Window|Surface Properties Window]] is totally unrelated to this window, but the buttons for both are side by side on the toolbar.

==Hidden variables==

Some variables are not displayed in this window. They could be part of a property group concealed with the '''hidecategories''' [[Legacy:Class Syntax|class syntax]], or a hidden variable (i.e., those defined with &quot;var&quot; instead of &quot;var()&quot; [[Legacy:Variable Syntax|variable syntax]]). 

'''WARNING''' Altering some properties of certain actors, especially the bStatic property, may cause your map to fail in network play. You're better off making a subclass if you want to attach a [[Legacy:Light|Light]] to a [[Legacy:Mover|Mover]] and have the map work properly in network play. UnrealEd will balk at you if you alter the default bStatic value of any actors, and clients will likely crash out of network play.

There are a few different ways to edit these hidden properties:

===Method 1: The EditObj [[Legacy:Console Commands|Console Command]]===
* Look up the Actor's '''object name'''. It is stored in the (non-editable) Object -&gt; Name property.  Normally, a Actor's object name is along the lines of &quot;Actor443&quot; (that's &quot;Actor&quot; plus a number).
* In the [[Legacy:UnrealEd Console|UnrealEd console]], enter &quot;editobj Light443&quot; (substitute &quot;Light443&quot; with the object name of your Actor).  This will pop up another window very similar to the normal actor properties window.
* Values you couldn't normally set will show up in the editactor window under the &quot;None&quot; category. Unlike the main Actor Properties Window, this new window is permanently fixed to the actor it was opened for.

Note that you can only edit &quot;hidden properties&quot; in this manner. You cannot edit categories hidden with the '''hidecategories''' [[Legacy:Class Syntax|class syntax]].

===Method 2: The Set [[Legacy:Console Commands|Console Command]]===
* To set a particular variable, you can use
 set &lt;class&gt; &lt;variable name&gt; &lt;setting&gt;
* However, this will set that variable on ALL versions of that Actor (or any actors of this actor's class' subclasses) in the map. It also affects the default value of that variable in the actor's class and any of its subclasses.

===Method 3: Copy-And-Paste===
* In some versions of UnrealEd, you cannot use the &quot;EditObj&quot; command. If you want to change that variable without affecting all other Actors of that class, then you can use the Copy-And-Paste method.
* In the editor window, highlight the Actor or Actors in question.
* Select Edit -&gt; Cut.
* Open your favorite [[Legacy:Text Editor|text editor]] and create a blank file.
* Paste the contents of the clipboard into that file. You'll end up with something like this:

&lt;uscript&gt;
Begin Map
Begin Actor Class=Spotlight Name=Spotlight1
    bDynamicLight=True
    bNetDirty=True
    LastRenderTime=448.986694
    Tag=&quot;Spotlight&quot;
    Level=LevelInfo'MyLevel.LevelInfo0'
    Region=(Zone=LevelInfo'MyLevel.LevelInfo0',iLeaf=1403,ZoneNumber=2)
    PhysicsVolume=DefaultPhysicsVolume'MyLevel.DefaultPhysicsVolume23'
    Location=(X=-1520.892090,Y=-22217.167969,Z=-3488.283203)
    Rotation=(Pitch=-32636,Yaw=147568,Roll=-9544)
    AttachTag=&quot;train&quot;
    bMovable=True
    LightBrightness=255.000000
    bSelected=True
    Name=&quot;Spotlight1&quot;
End Actor
Begin Surface
End Surface
End Map
&lt;/uscript&gt;

Now you can edit whatever properties you want as if you were editing an [[Legacy:Subobject|inline object]] in UnrealScript. Simply add &quot;bStatic=False&quot; or whatever property you're trying to edit between the Begin Actor/End Actor lines. Select all the text and copy it to the clipboard, then go back to UnrealEd and Edit -&gt; Paste -&gt; To Original Location. UnrealEd places actors exactly 32 units off per axis, so you'll have to tweak its position.

===If All Else Fails===

If none of the above methods work for you, you will have to subclass the actor using UnrealScript, and add in the new value in the new class's DefaultProperties. You cannot do this in UnrealEd, since the properties you're trying to change are hidden, so you'll have to actually make a new package. After you do that, add the new package to your EditPackages in [Editor.EditorEngine], start up UnrealEd once again, and place the new actor.

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]] covers the basics of working with actors
* The class page for [[Legacy:Actor|Actor]]
* Reference for the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:Displaying Variables In UnrealEd|Displaying Variables In UnrealEd]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Screen</title>
    <id>348</id>
    <revision>
      <id>1210</id>
      <timestamp>2002-04-21T22:11:04Z</timestamp>
      <contributor>
        <ip>Aedis</ip>
      </contributor>
      <comment>created (redirect)</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor Search</title>
    <id>338</id>
    <revision>
      <id>1185</id>
      <timestamp>2003-05-25T09:00:30Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">The '''Actor Search''' window is an extremely handy and often neglected tool in UnrealEd.

Open with:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Edit -&gt; Search for Actors...
* the binoculars icon on the [[Legacy:Toolbar|toolbar]]

The list on the left initially shows ''all'' [[Legacy:Actor|actor]]s in the current map.

Type into any of the three fields on the right. The list will narrow down to those that match your criteria.

Double-click any name in the list to focus all the [[Legacy:UnreaEd Viewport|UnreaEd viewport]]s on that actor.

Use Actor Search to:
* Reveal hidden brushes (see [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]).
* Find all [[Legacy:Actor|actor]]s of a given class. Since actor names are always built like &lt;tt&gt;&lt;classname&gt;&lt;number&gt;&lt;/tt&gt;), type the first few letters of the class name, until the list on the left shows only actors of this class.
* Find all [[Legacy:Actor|actor]]s triggered by an [[Legacy:Event|event]].
* Find all [[Legacy:Actor|actor]]s that fire an event (note that actors which use properties other than Event to do this won't show up, eg [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]]).

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd interface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1186</id>
      <timestamp>2002-06-30T22:19:48Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Extremely handy and often neglected.

Open with:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Edit -&gt; Search for Actors...
* the binoculars icon on the [[Legacy:Toolbar|toolbar]]

Use Actor Search to:
* Reveal hidden brushes (see [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]).
* Find all [[Legacy:Actor|actor]]s of a given class (as actor names are always built like &lt;tt&gt;&lt;classname&gt;&lt;number&gt;&lt;/tt&gt;).
* Find all [[Legacy:Actor|actor]]s triggered by an [[Legacy:Event|event]].
* Find all [[Legacy:Actor|actor]]s that fire an event (note that actors which use properties other than Event to do this won't show up, eg [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]]).

See also: [[Legacy:UnrealEd Interface|UnrealEd interface]]</text>
    </revision>
    <revision>
      <id>1187</id>
      <timestamp>2003-02-04T16:40:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Actor Search''' window is an extremely handy and often neglected tool in UnrealEd.

Open with:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Edit -&gt; Search for Actors...
* the binoculars icon on the [[Legacy:Toolbar|toolbar]]

The list on the left initially shows ''all'' [[Legacy:Actor|actor]]s in the current map.

Type into any of the three fields on the right. The list will narrow down to those that match your criteria.

Double-click any name in the list to focus all the [[Legacy:UnreaEd Viewport|UnreaEd viewport]]s on that actor.

Use Actor Search to:
* Reveal hidden brushes (see [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]).
* Find all [[Legacy:Actor|actor]]s of a given class. Since actor names are always built like &lt;tt&gt;&lt;classname&gt;&lt;number&gt;&lt;/tt&gt;), type the first few letters of the class name, until the list on the left shows only actors of this class.
* Find all [[Legacy:Actor|actor]]s triggered by an [[Legacy:Event|event]].
* Find all [[Legacy:Actor|actor]]s that fire an event (note that actors which use properties other than Event to do this won't show up, eg [[Legacy:Dispatcher|Dispatcher]], [[Legacy:RoundRobin|RoundRobin]]).

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd interface]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Advanced</title>
    <id>320</id>
    <revision>
      <id>1145</id>
      <timestamp>2005-01-14T02:14:18Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Advanced)}}

(also see [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]])

==Game-specific Properties ==
; bool bCanTeleport : This actor can be teleported. This property must be True for [[Legacy:Teleporter|Teleporter]]s to notice the actor.
; bool bHidden : Specifies, whether the actor is invisible in the game. This property has no effect in the editor.
; bool bNoDelete (const) : Specifies, that the actor can't be spawned or destroyed during the game.
; bool bHighDetail : The actor only shows up in high or super high detail mode.
; bool bSuperHighDetail : The actor only shows up in super high detail mode.
; bool bGameRelevant : Mutators will not receive CheckReplacement and AlwaysKeep calls for the actor if this property is True.
; bool bShouldBaseAtStartup : The actor tries to find another actor for its Base (see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Properties]]) at level startup if its Physics property is set to either PHYS_None or PHYS_Rotating.
; bool bStasis : In standalone (i.e. single player, e.g. Instant Action) games this actor should be turned off if it's not in a recently rendered zone. It will only be turned off when its Physics mode is PHYS_None or PHYS_Rotating. (see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement]] and [[Legacy:PhysicsType|PhysicsType]])
; bool bNetNotify : The actor wishes to be notified of [[Legacy:Replication|replication]] events.  The actor gets the simulated function PostNetReceive() called whenever replication occurs, e.g. in Ammunition whenever AmmoAmount gets changed.
; float Lifespan : Specifies how long the actor will exist. This value is constantly decreased and the actor will be destroyed when it reaches 0. In this case the actor's Expired method is executed. An initial LifeSpan of 0 or explicitely setting the LifeSpan to 0 from UnrealScript disables the actor's &quot;destruction timer&quot;. Setting it to a value greater 0 from UnrealScript enables it and the Actor will be destroyed after that time unless LifeSpan is set to 0 again before it expired.

==Editor-specific Properties ==
; bool bCollideWhenPlacing : The actor will collide with world geometry when placed.
; bool bDirectional : Whether the editor should display an arrow to show the actor's current rotation. This has no effect in the game. The rotation is set in [[Legacy:Actor/Movement|Movement]] -&gt; Rotation, or by using the [[Legacy:Brush Rotate|Brush Rotate]] tool on the actor.
; bool bEdShouldSnap : Snap to grid in the editor.

{{innerbox|TIP: If you add powerups to the map, make sure you go into the [[Legacy:Default Properties|default properties]] (not individual properties!!!) of the designated actor, mark that true, place all you want, and then, mark that false. It will align the ammo or the pickup base to grid and make your map be more like eye-candy (heck, ALL maps are eye candy! ;)) 

}}
; bool bHiddenEd : The actor is hidden in the editor. This has no effect in the game.
; bool bHiddenEdGroup : The actor is hidden in the Group Browser. This has no effect in the editor viewports or in the game.
; bool bLockLocation : Prevent the actor from being moved in the editor.
; bool bMovable : Actor can be moved. When false, location can't be changed in-game. This doesn't count for the editor.</text>
    </revision>
    <revision>
      <id>1146</id>
      <timestamp>2005-01-14T00:36:28Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Collision</title>
    <id>322</id>
    <revision>
      <id>1148</id>
      <timestamp>2007-06-08T18:33:02Z</timestamp>
      <contributor>
        <ip>Cpc2-bagu1-0-0-cust836.bagu.cable.ntl.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Collision)}}

Properties that control how an actor blocks other actors. For the [[Legacy:UT|UT]] version, see [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]].

The difference between Blocking and Colliding is that Colliding actors only get a Touch() event when another object collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

; bool bAutoAlignToTerrain :  Auto-align to [[Legacy:Terrain|terrain]] in the editor.

; bool bBlockActors : Blocks other actors that also have bBlockActors set. The two actors will not be permitted to occupy the same space, and if the location of one is changed such that it would overlap with another blocking actor, the first (the one that just moved) will be moved to the nearest valid location by the engine. This defaults to false.

; bool bBlockKarma : Blocks actors being simulated with [[Legacy:Karma|Karma]]. Unlike bBlockActors, an actor does not need bBlockKarma to ''be blocked'' by a Karma object, it only needs to have bBlockActors set. If bBlockKarma is also set, Karma objects will ''be blocked by'' this actor. This defaults to false.

; bool bBlockPlayers : The name of this variable is a bit misleading, as [[Legacy:Player|Player]]s aren't actors and can't move. What this actually refers to is [[Legacy:Pawn|Pawn]]s: bots, human players, and monsters. Pawns are exempted from colliding under bBlockActors and use this value instead. This allows for some objects that do not block pawns, but do block normal actors. (or vice versa, though the value of that is questionable) '''NOTE:''' In UT2004, this property is not used and setting it does absolutely nothing.

; bool bCollideWorld : This variable name is a bit miseleading, as although the variable name says collide instead of block, this is actually the equivalent of bBlockActors for actors with bWorldGeometry (hidden variable) set to true. Like controllers, actors with bWorldGeometry set to true are exempt from collision under the normal bBlockAlayers conditions and instead block things that have bCollideWorld set to true. This value defaults to false.

; bool bCollideActors :  Collides with other actors. This will generate a '''Touch''' event between two actors that collide with each other, if they both have bCollideActors set. An example of a colliding, but non-blocking object would be a projectile or a trigger. They know when they touch something, but do not natively interfere with it. This value defaults to false.

; bool PathColliding : '''Nytro:''' I think this means that bot paths wont't be affected by its collision. I'll test that soon.
; bool bBlockNonZeroExtentTraces : Traces with a non-zero extent can hit this actor. If it is false, some traces may not hit this actor. Projectiles are usually zero-extent traces, so they will likely still hit this actor. If this is true, traces with non-zero extents will NOT hit this actor. This value defaults to false. Some Pawns use non-zero extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]].
; bool bBlockZeroExtentTraces : [[Legacy:Trace|Trace]]s with zero extents can hit this actor, if set to true. Traces with zero extents are usually traces where the extent parameter is omitted, though a value of 0,0,0 in that parameter is also a zero extent trace. If it is false, traces with zero extents cannot hit this actor and will pass right though it. It defaults to false. In UT2003 and UT2004, projectiles use zero-extent traces to determine their exact impact location. Instant hit weapons such as the shock rifle or assault rifle also use zero-extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]]. Note that traces will only hit this actor if either bBlockActors or bProjTarget is true (thanks to Mysterial for that info)
; bool bProjTarget : Projectiles should potentially target this actor.
; bool bUseCylinderCollision : If this value is true, this actor will use a [[Legacy:Collision Cylinder|collision cylinder]], set the size with the next two properties. Note that depending on other parameters, the effectiveness of this variable may vary. For instance, Karma simulated actors will not use a simple cylinder collision regardless of this value. Some actors will use a cylinder collision regardless of this value as well. It may pertain only to the skeletal mesh collision hulls availible in the [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] and later builds.
; float CollisionHeight : Half of the height of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.
; float CollisionRadius :  Radius of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.

; [[Legacy:ESurfaceTypes|ESurfaceTypes]]  SurfaceType :  

==Cookbook==

To control collision of an actor with...

; Players, Bots and Monster : bBlockNonZeroExtentTraces. Setting this to false will allow players to walk through a mesh.
; Weapons Fire : bBlockZeroExtentTraces. Setting this to false will allow all weapons fire to travel through a mesh. Additionally, this setting will allow Light to travel through a mesh. Lights with bCorona set to true will still be blocked though.
; Karma Bodies : bBlockKarma. This setting depends on the mesh itself having a Karma collision hull.
; particles from a [[Legacy:ParticleEmitter|ParticleEmitter]] with Collision-&gt;UseCollision set : Answer Needed!
; to block players only in UT2004 : After doing the following, this volume will allow shooting and translocators but not the player. ''(Don't know about other pawns (bots, invasion monsters), but i would assume it will block them as well.)''
*'''Blocking Volume &gt; bClassBlocker = True'''
*'''Blocking Volume &gt; BlockedClasses &gt; Add &gt; Pawn''' which will add ''' Class'Engine.Pawn' '''to the BlockedClasses list.

==Related topics ==
* [[Legacy:OCD|OCD]] &amp;ndash; Technical lowdown of object collision detection.
* [[Legacy:Collision|Collision]]
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; More on working with Actors, adding actors to a map and setting properties.

==Discussion==

'''King Mango''' Still trying to figure out how to block ONLY players.  Shock secondary is a NonZeroExtent trace and is therefore blocked along with players if bBlockNonZeroExtent is true.  Class blocker seems to be broken.  Have not gotten it to work in several dozen different values for the class.

'''monsto''' added the UT2004 players only block. If a mod sees it, it could use some formatting. . .

'''AJRAD:''' Does anyone know how to assign collisionheight and collisionradius of an actor in a script? I'm hoping there's a function like SetLocation or SetCollision, if you know how please send a quick email to ajradical@gmail.com, it would be greatly appreciated.

'''EricBlade:''' Well, if you ever look back here, it's &quot;SetCollisionSize&quot;.

'''AJRAD:''' Thank you. I love you.</text>
    </revision>
    <revision>
      <id>1149</id>
      <timestamp>2007-05-16T21:34:22Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Collision)}}

Properties that control how an actor blocks other actors. For the [[Legacy:UT|UT]] version, see [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]].

The difference between Blocking and Colliding is that Colliding actors only get a Touch() event when another object collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

; bool bAutoAlignToTerrain :  Auto-align to [[Legacy:Terrain|terrain]] in the editor.

; bool bBlockActors : Blocks other actors that also have bBlockActors set. The two actors will not be permitted to occupy the same space, and if the location of one is changed such that it would overlap with another blocking actor, the first (the one that just moved) will be moved to the nearest valid location by the engine. This defaults to false.

; bool bBlockKarma : Blocks actors being simulated with [[Legacy:Karma|Karma]]. Unlike bBlockActors, an actor does not need bBlockKarma to ''be blocked'' by a Karma object, it only needs to have bBlockActors set. If bBlockKarma is also set, Karma objects will ''be blocked by'' this actor. This defaults to false.

; bool bBlockPlayers : The name of this variable is a bit misleading, as [[Legacy:Player|Player]]s aren't actors and can't move. What this actually refers to is [[Legacy:Pawn|Pawn]]s: bots, human players, and monsters. Pawns are exempted from colliding under bBlockActors and use this value instead. This allows for some objects that do not block pawns, but do block normal actors. (or vice versa, though the value of that is questionable) '''NOTE:''' In UT2004, this property is not used and setting it does absolutely nothing.

; bool bCollideWorld : This variable name is a bit miseleading, as although the variable name says collide instead of block, this is actually the equivalent of bBlockActors for actors with bWorldGeometry (hidden variable) set to true. Like controllers, actors with bWorldGeometry set to true are exempt from collision under the normal bBlockAlayers conditions and instead block things that have bCollideWorld set to true. This value defaults to false.

; bool bCollideActors :  Collides with other actors. This will generate a '''Touch''' event between two actors that collide with each other, if they both have bCollideActors set. An example of a colliding, but non-blocking object would be a projectile or a trigger. They know when they touch something, but do not natively interfere with it. This value defaults to false.

; bool PathColliding : '''Nytro:''' I think this means that bot paths wont't be affected by its collision. I'll test that soon.
; bool bBlockNonZeroExtentTraces : Traces with a non-zero extent can hit this actor. If it is false, some traces may not hit this actor. Projectiles are usually zero-extent traces, so they will likely still hit this actor. If this is true, traces with non-zero extents will NOT hit this actor. This value defaults to false. Some Pawns use non-zero extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]].
; bool bBlockZeroExtentTraces : [[Legacy:Trace|Trace]]s with zero extents can hit this actor, if set to true. Traces with zero extents are usually traces where the extent parameter is omitted, though a value of 0,0,0 in that parameter is also a zero extent trace. If it is false, traces with zero extents cannot hit this actor and will pass right though it. It defaults to false. In UT2003 and UT2004, projectiles use zero-extent traces to determine their exact impact location. Instant hit weapons such as the shock rifle or assault rifle also use zero-extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]]. Note that traces will only hit this actor if either bBlockActors or bProjTarget is true (thanks to Mysterial for that info)
; bool bProjTarget : Projectiles should potentially target this actor.
; bool bUseCylinderCollision : If this value is true, this actor will use a [[Legacy:Collision Cylinder|collision cylinder]], set the size with the next two properties. Note that depending on other parameters, the effectiveness of this variable may vary. For instance, Karma simulated actors will not use a simple cylinder collision regardless of this value. Some actors will use a cylinder collision regardless of this value as well. It may pertain only to the skeletal mesh collision hulls availible in the [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] and later builds.
; float CollisionHeight : Half of the height of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.
; float CollisionRadius :  Radius of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.

; [[Legacy:ESurfaceTypes|ESurfaceTypes]]  SurfaceType :  

==Cookbook==

To control collision of an actor with...

; Players, Bots and Monster : bBlockNonZeroExtentTraces. Setting this to false will allow players to walk through a mesh.
; Weapons Fire : bBlockZeroExtentTraces. Setting this to false will allow all weapons fire to travel through a mesh. Additionally, this setting will allow Light to travel through a mesh. Lights with bCorona set to true will still be blocked though.
; Karma Bodies : bBlockKarma. This setting depends on the mesh itself having a Karma collision hull.
; particles from a [[Legacy:ParticleEmitter|ParticleEmitter]] with Collision-&gt;UseCollision set : Answer Needed!
; to block players only in UT2004 : After doing the following, this volume will allow shooting and translocators but not the player. ''(Don't know about other pawns (bots, invasion monsters), but i would assume it will block them as well.)''
*'''Blocking Volume &gt; bClassBlocker = True'''
*'''Blocking Volume &gt; BlockedClasses &gt; Add &gt; Pawn''' which will add ''' Class'Engine.Pawn' '''to the BlockedClasses list.

==Related topics ==
* [[Legacy:OCD|OCD]] &amp;ndash; Technical lowdown of object collision detection.
* [[Legacy:Collision|Collision]]
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; More on working with Actors, adding actors to a map and setting properties.

==Discussion==

'''King Mango''' Still trying to figure out how to block ONLY players.  Shock secondary is a NonZeroExtent trace and is therefore blocked along with players if bBlockNonZeroExtent is true.  Class blocker seems to be broken.  Have not gotten it to work in several dozen different values for the class.

'''monsto''' added the UT2004 players only block. If a mod sees it, it could use some formatting. . .

'''AJRAD:''' Does anyone know how to assign collisionheight and collisionradius of an actor in a script? I'm hoping there's a function like SetLocation or SetCollision, if you know how please send a quick email to ajradical@gmail.com, it would be greatly appreciated.

'''EricBlade:''' Well, if you ever look back here, it's &quot;SetCollisionSize&quot;.</text>
    </revision>
    <revision>
      <id>34463</id>
      <timestamp>2009-06-02T01:17:49Z</timestamp>
      <contributor>
        <ip>82.15.36.235</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Collision)}}

Properties that control how an actor blocks other actors. For the [[Legacy:UT|UT]] version, see [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]].

The difference between Blocking and Colliding is that Colliding actors only get a Touch() event when another object collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

; bool bAutoAlignToTerrain :  Auto-align to [[Legacy:Terrain|terrain]] in the editor.

; bool bBlockActors : Blocks other actors that also have bBlockActors set. The two actors will not be permitted to occupy the same space, and if the location of one is changed such that it would overlap with another blocking actor, the first (the one that just moved) will be moved to the nearest valid location by the engine. This defaults to false.

; bool bBlockKarma : Blocks actors being simulated with [[Legacy:Karma|Karma]]. Unlike bBlockActors, an actor does not need bBlockKarma to ''be blocked'' by a Karma object, it only needs to have bBlockActors set. If bBlockKarma is also set, Karma objects will ''be blocked by'' this actor. This defaults to false.

; bool bBlockPlayers : The name of this variable is a bit misleading, as [[Legacy:Player|Player]]s aren't actors and can't move. What this actually refers to is [[Legacy:Pawn|Pawn]]s: bots, human players, and monsters. Pawns are exempted from colliding under bBlockActors and use this value instead. This allows for some objects that do not block pawns, but do block normal actors. (or vice versa, though the value of that is questionable) '''NOTE:''' In UT2004, this property is not used and setting it does absolutely nothing.

; bool bCollideWorld : This variable name is a bit miseleading, as although the variable name says collide instead of block, this is actually the equivalent of bBlockActors for actors with bWorldGeometry (hidden variable) set to true. Like controllers, actors with bWorldGeometry set to true are exempt from collision under the normal bBlockAlayers conditions and instead block things that have bCollideWorld set to true. This value defaults to false.

; bool bCollideActors :  Collides with other actors. This will generate a '''Touch''' event between two actors that collide with each other, if they both have bCollideActors set. An example of a colliding, but non-blocking object would be a projectile or a trigger. They know when they touch something, but do not natively interfere with it. This value defaults to false.

; bool PathColliding : '''Nytro:''' I think this means that bot paths wont't be affected by its collision. I'll test that soon.
; bool bBlockNonZeroExtentTraces : Traces with a non-zero extent can hit this actor. If it is false, some traces may not hit this actor. Projectiles are usually zero-extent traces, so they will likely still hit this actor. If this is true, traces with non-zero extents will NOT hit this actor. This value defaults to false. Some Pawns use non-zero extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]].
; bool bBlockZeroExtentTraces : [[Legacy:Trace|Trace]]s with zero extents can hit this actor, if set to true. Traces with zero extents are usually traces where the extent parameter is omitted, though a value of 0,0,0 in that parameter is also a zero extent trace. If it is false, traces with zero extents cannot hit this actor and will pass right though it. It defaults to false. In UT2003 and UT2004, projectiles use zero-extent traces to determine their exact impact location. Instant hit weapons such as the shock rifle or assault rifle also use zero-extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]]. Note that traces will only hit this actor if either bBlockActors or bProjTarget is true (thanks to Mysterial for that info)
; bool bProjTarget : Projectiles should potentially target this actor.
; bool bUseCylinderCollision : If this value is true, this actor will use a [[Legacy:Collision Cylinder|collision cylinder]], set the size with the next two properties. Note that depending on other parameters, the effectiveness of this variable may vary. For instance, Karma simulated actors will not use a simple cylinder collision regardless of this value. Some actors will use a cylinder collision regardless of this value as well. It may pertain only to the skeletal mesh collision hulls availible in the [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] and later builds.
; float CollisionHeight : Half of the height of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.
; float CollisionRadius :  Radius of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.

; [[Legacy:ESurfaceTypes|ESurfaceTypes]]  SurfaceType :  

==Cookbook==

To control collision of an actor with...

; Players, Bots and Monster : bBlockNonZeroExtentTraces. Setting this to false will allow players to walk through a mesh.
; Weapons Fire : bBlockZeroExtentTraces. Setting this to false will allow all weapons fire to travel through a mesh. Additionally, this setting will allow Light to travel through a mesh. Lights with bCorona set to true will still be blocked though.
; Karma Bodies : bBlockKarma. This setting depends on the mesh itself having a Karma collision hull.
; particles from a [[Legacy:ParticleEmitter|ParticleEmitter]] with Collision-&gt;UseCollision set : Answer Needed!
; to block players only in UT2004 : After doing the following, this volume will allow shooting and translocators but not the player. ''(Don't know about other pawns (bots, invasion monsters), but i would assume it will block them as well.)''
*'''Blocking Volume &gt; bClassBlocker = True'''
*'''Blocking Volume &gt; BlockedClasses &gt; Add &gt; Pawn''' which will add ''' Class'Engine.Pawn' '''to the BlockedClasses list.

==Related topics ==
* [[Legacy:OCD|OCD]] &amp;ndash; Technical lowdown of object collision detection.
* [[Legacy:Collision|Collision]]
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; More on working with Actors, adding actors to a map and setting properties.

==Discussion==

'''King Mango''' Still trying to figure out how to block ONLY players.  Shock secondary is a NonZeroExtent trace and is therefore blocked along with players if bBlockNonZeroExtent is true.  Class blocker seems to be broken.  Have not gotten it to work in several dozen different values for the class.

'''monsto''' added the UT2004 players only block. If a mod sees it, it could use some formatting. . .

'''AJRAD:''' Does anyone know how to assign collisionheight and collisionradius of an actor in a script?

'''EricBlade:''' Well, if you ever look back here, it's &quot;SetCollisionSize&quot;.

'''AJRAD:''' Thank you. I love you.</text>
    </revision>
    <revision>
      <id>43878</id>
      <timestamp>2010-08-15T21:38:33Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <minor/>
      <comment>Added informations about bPathColliding (I know, this is legacy...)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Collision)}}

Properties that control how an actor blocks other actors. For the [[Legacy:UT|UT]] version, see [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]].

The difference between Blocking and Colliding is that Colliding actors only get a Touch() event when another object collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

; bool bAutoAlignToTerrain :  Auto-align to [[Legacy:Terrain|terrain]] in the editor.

; bool bBlockActors : Blocks other actors that also have bBlockActors set. The two actors will not be permitted to occupy the same space, and if the location of one is changed such that it would overlap with another blocking actor, the first (the one that just moved) will be moved to the nearest valid location by the engine. This defaults to false.

; bool bBlockKarma : Blocks actors being simulated with [[Legacy:Karma|Karma]]. Unlike bBlockActors, an actor does not need bBlockKarma to ''be blocked'' by a Karma object, it only needs to have bBlockActors set. If bBlockKarma is also set, Karma objects will ''be blocked by'' this actor. This defaults to false.

; bool bBlockPlayers : The name of this variable is a bit misleading, as [[Legacy:Player|Player]]s aren't actors and can't move. What this actually refers to is [[Legacy:Pawn|Pawn]]s: bots, human players, and monsters. Pawns are exempted from colliding under bBlockActors and use this value instead. This allows for some objects that do not block pawns, but do block normal actors. (or vice versa, though the value of that is questionable) '''NOTE:''' In UT2004, this property is not used and setting it does absolutely nothing.

; bool bCollideWorld : This variable name is a bit miseleading, as although the variable name says collide instead of block, this is actually the equivalent of bBlockActors for actors with bWorldGeometry (hidden variable) set to true. Like controllers, actors with bWorldGeometry set to true are exempt from collision under the normal bBlockAlayers conditions and instead block things that have bCollideWorld set to true. This value defaults to false.

; bool bCollideActors :  Collides with other actors. This will generate a '''Touch''' event between two actors that collide with each other, if they both have bCollideActors set. An example of a colliding, but non-blocking object would be a projectile or a trigger. They know when they touch something, but do not natively interfere with it. This value defaults to false.

; bool PathColliding : Set this to True to consider the Actor for blocking bot paths during rebuilding. This has no effect on Actors with bStatic set to True, as those are non-moving world geometry that will always block paths.

; bool bBlockNonZeroExtentTraces : Traces with a non-zero extent can hit this actor. If it is false, some traces may not hit this actor. Projectiles are usually zero-extent traces, so they will likely still hit this actor. If this is true, traces with non-zero extents will NOT hit this actor. This value defaults to false. Some Pawns use non-zero extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]].

; bool bBlockZeroExtentTraces : [[Legacy:Trace|Trace]]s with zero extents can hit this actor, if set to true. Traces with zero extents are usually traces where the extent parameter is omitted, though a value of 0,0,0 in that parameter is also a zero extent trace. If it is false, traces with zero extents cannot hit this actor and will pass right though it. It defaults to false. In UT2003 and UT2004, projectiles use zero-extent traces to determine their exact impact location. Instant hit weapons such as the shock rifle or assault rifle also use zero-extent traces. See also the '''Trace''' function on [[Legacy:Actor/Methods|Actor/Methods]]. Note that traces will only hit this actor if either bBlockActors or bProjTarget is true (thanks to Mysterial for that info)

; bool bProjTarget : Projectiles should potentially target this actor.

; bool bUseCylinderCollision : If this value is true, this actor will use a [[Legacy:Collision Cylinder|collision cylinder]], set the size with the next two properties. Note that depending on other parameters, the effectiveness of this variable may vary. For instance, Karma simulated actors will not use a simple cylinder collision regardless of this value. Some actors will use a cylinder collision regardless of this value as well. It may pertain only to the skeletal mesh collision hulls availible in the [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] and later builds.

; float CollisionHeight : Half of the height of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.

; float CollisionRadius :  Radius of the collision cylinder. Note that the collision cylinder is always &quot;upright&quot; and does not follow the rotation of the actor.

; [[Legacy:ESurfaceTypes|ESurfaceTypes]]  SurfaceType :  

==Cookbook==

To control collision of an actor with...

; Players, Bots and Monster : bBlockNonZeroExtentTraces. Setting this to false will allow players to walk through a mesh.
; Weapons Fire : bBlockZeroExtentTraces. Setting this to false will allow all weapons fire to travel through a mesh. Additionally, this setting will allow Light to travel through a mesh. Lights with bCorona set to true will still be blocked though.
; Karma Bodies : bBlockKarma. This setting depends on the mesh itself having a Karma collision hull.
; particles from a [[Legacy:ParticleEmitter|ParticleEmitter]] with Collision-&gt;UseCollision set : Answer Needed!
; to block players only in UT2004 : After doing the following, this volume will allow shooting and translocators but not the player. ''(Don't know about other pawns (bots, invasion monsters), but i would assume it will block them as well.)''
*'''Blocking Volume &gt; bClassBlocker = True'''
*'''Blocking Volume &gt; BlockedClasses &gt; Add &gt; Pawn''' which will add ''' Class'Engine.Pawn' '''to the BlockedClasses list.

==Related topics ==
* [[Legacy:OCD|OCD]] &amp;ndash; Technical lowdown of object collision detection.
* [[Legacy:Collision|Collision]]
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; More on working with Actors, adding actors to a map and setting properties.

==Discussion==

'''King Mango''' Still trying to figure out how to block ONLY players.  Shock secondary is a NonZeroExtent trace and is therefore blocked along with players if bBlockNonZeroExtent is true.  Class blocker seems to be broken.  Have not gotten it to work in several dozen different values for the class.

'''monsto''' added the UT2004 players only block. If a mod sees it, it could use some formatting. . .

'''AJRAD:''' Does anyone know how to assign collisionheight and collisionradius of an actor in a script?

'''EricBlade:''' Well, if you ever look back here, it's &quot;SetCollisionSize&quot;.

'''AJRAD:''' Thank you. I love you.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Constants</title>
    <id>326</id>
    <revision>
      <id>1157</id>
      <timestamp>2002-11-13T19:14:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Constants)}}

; MAXSTEPHEIGHT = 35.0 : Maximum step height walkable by [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; MINFLOORZ = 0.7 : Minimum Z value for floor normal. Anything that's less, isn't a walkable floor. (0.7 corresponds to about 45 degree angle for floor)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Display</title>
    <id>323</id>
    <revision>
      <id>1150</id>
      <timestamp>2005-07-30T08:29:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Display)}}

(For the UT Actor class properties, see [[Legacy:Actor (UT)/Display|Actor (UT)/Display]].)

This group holds properties that affect how the actor is displayed. The most important property is the DrawType [[Legacy:Enum|enum]]eration, which sets what kind of resource is displayed: texture, mesh, etc. Other properties then determine the actual thing that is displayed: [[Legacy:Set The Resource Property|Set The Resource Property]] that matches the DrawType.

; AmbientGlow : The brightness of the actor. Shifts the used lightmap up by this amount. 0 means the actor can be completely dark if it's in the shadows, 128 means the actor will be rendered as unlit or brighter, 254 means the actor is always rendered twice as bright as unlit
; [[Legacy:ConvexVolume|ConvexVolume]] AntiPortal : ConvexVolume used for DT_AntiPortal  
; bool bAcceptsProjectors : [[Legacy:Projector|Projector]]s can project onto this actor  
; bool bAlwaysFaceCamera :  actor will be rendered always facing the camera like a [[Legacy:Sprite|sprite]]  
; bool bDisableSorting :  Manual override for translucent material sorting.  
; bool bShadowCast :  Casts [[Legacy:Static Shadow|static shadow]]s.  
; bool bStaticLighting :  Uses raytraced lighting.  
; bool bUnlit :  [[Legacy:Light|Light]]s don't affect actor. It will be at full brightness.  
; bool bUseDynamicLights :  
; bool bUseLightingFromBase :  Use Unlit/AmbientGlow from Base  
; float ClientOverlayCounter :  sjs - current secs left to show overlay effect  
; float ClientOverlayTimer :  sjs - client inital time count  
; float CullDistance : in non-zero, sets the distance at which to cease displaying this actor (works for static meshes)
; float DrawScale : Scales the actor's visual representation, whether it's a static mesh, texture or whatever. Useful on non-displayed actors to make their icons bigger in UnrealEd.
; vector DrawScale3D : 3-dimensional scaling of the actor's visual representation. Used on [[Legacy:Static Mesh|static mesh]]es.
; EDrawType DrawType : Sets how the actor is drawn, eg sprite, static mesh, etc. See enum list below.
; name ForcedVisibilityZoneTag :  Makes the visibility code treat the actor as if it was in the zone(s) with the given tag.
; float LODBias :  This will affect the distance at which the engine starts simplifying the mesh. If your new model has parts that are pretty thin, or even have a single face, raise this number. 
; byte MaxLights :  Limit to hardware lights active on this primitive.  
; [[Legacy:Mesh|Mesh]] Mesh : Mesh to display if DrawType=DT_Mesh.  
; [[Legacy:Material|Material]] OverlayMaterial :  sjs - shader/material effect to use with skin  
; float OverlayTimer :  sjs - set by server  
; vector PrePivot :  Offset from box center for drawing. This property is useful for fixing [[Legacy:Static Mesh|static mesh]]es that aren't correctly lined up to the grid. 
; float ScaleGlow : 
; array&lt;[[Legacy:Material|Material]]&gt; Skins :  Multiple skin support - not replicated.  
; [[Legacy:StaticMesh|StaticMesh]] StaticMesh :  the [[Legacy:Static Mesh|Static Mesh]] to display if DrawType=DT_StaticMesh  
; ERenderStyle Style : the render style: see below 
; [[Legacy:Material|Material]] Texture :  Sprite texture if DrawType=DT_Sprite  
; EUV2Mode UV2Mode :  determines how the [[Legacy:UV2Texture|UV2Texture]] is applied. 
; [[Legacy:Material|Material]] UV2Texture : Some sort of overlay mojo for [[Legacy:Static Mesh|Static Mesh]]es. See [[Legacy:UV2Texture|UV2Texture]].

===EDrawType ===

The DrawType enumneration sets how the actor displays. Some of these options work with another property to set ''what'' is displayed.

; DT_None : The actor isn't displayed at all. You should probably use [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]] -&gt; bHidden instead in most cases because it will allow the actor to still show up in UnrealEd.
; DT_Sprite : Display a sprite with the material set in the Texture property.
; DT_Mesh : Display the mesh set in the Mesh property. 
; DT_Brush : Only for [[Legacy:Brush|Brush]] classes.
; DT_RopeSprite : 
; DT_VerticalSprite : 
; DT_Terraform : 
; DT_SpriteAnimOnce : Like DT_Sprite, but plays an animated texture's animation at a speed that plays the animation exactly once during the LifeSpan of the actor. 
; DT_StaticMesh : Display the [[Legacy:Static Mesh|static mesh]] set in the StaticMesh property.
; DT_DrawType : 
; DT_Particle : Used by particle effect actors ([[Legacy:Emitter|Emitter]], [[Legacy:XEmitter|xEmitter]], [[Legacy:XWeatherEffect|xWeatherEffect]]) and [[Legacy:XProcMesh|xProcMesh]]es.
; DT_AntiPortal : Used for [[Legacy:Antiportal|Antiportal]]s.
; DT_FluidSurface : Used by [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]s. See [[Legacy:Fluid Surfaces|Fluid Surfaces]].

===ERenderStyle ===

See also [[Legacy:Color Blending|Color Blending]].

; STY_None : 
; STY_Normal : 
; STY_Masked : 
; STY_Translucent : 
; STY_Modulated : 
; STY_Alpha : If you use the Alpha blending mode when drawing in RenderOverlays, the final alpha level is determined by both the alpha channel AND the player's [[Legacy:HUD|HUD]] Transparency Setting. So even if you set the alpha to 255, if the player has anything less than a fully opaque HUD setting, your overlay texture will still appear translucent.
; STY_Additive : 
; STY_Subtractive : 
; STY_Particle : 
; STY_AlphaZ :</text>
    </revision>
    <revision>
      <id>1151</id>
      <timestamp>2005-04-09T11:40:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Display)}}

(For the UT Actor class properties, see [[Legacy:Actor (UT)/Display|Actor (UT)/Display]].)

This group holds properties that affect how the actor is displayed. The most important property is the DrawType [[Legacy:Enum|enum]]eration, which sets what kind of resource is displayed: texture, mesh, etc. Other properties then determine the actual thing that is displayed: [[Legacy:Set The Resource Property|Set The Resource Property]] that matches the DrawType.

; AmbientGlow : The brightness of the actor. Shifts the used lightmap up by this amount. 0 means the actor can be completely dark if it's in the shadows, 128 means the actor will be rendered as unlit or brighter, 254 means the actor is always rendered twice as bright as unlit
; [[Legacy:ConvexVolume|ConvexVolume]] AntiPortal : ConvexVolume used for DT_AntiPortal  
; bool bAcceptsProjectors : [[Legacy:Projector|Projector]]s can project onto this actor  
; bool bAlwaysFaceCamera :  actor will be rendered always facing the camera like a [[Legacy:Sprite|sprite]]  
; bool bDisableSorting :  Manual override for translucent material sorting.  
; bool bShadowCast :  Casts [[Legacy:Static Shadow|static shadow]]s.  
; bool bStaticLighting :  Uses raytraced lighting.  
; bool bUnlit :  [[Legacy:Light|Light]]s don't affect actor. It will be at full brightness.  
; bool bUseDynamicLights :  
; bool bUseLightingFromBase :  Use Unlit/AmbientGlow from Base  
; float ClientOverlayCounter :  sjs - current secs left to show overlay effect  
; float ClientOverlayTimer :  sjs - client inital time count  
; float CullDistance : in non-zero, sets the distance at which to cease displaying this actor (works for static meshes)
; float DrawScale : Scales the actor's visual representation, whether it's a static mesh, texture or whatever. Useful on non-displayed actors to make their icons bigger in UnrealEd.
; vector DrawScale3D : 3-dimensional scaling of the actor's visual representation. Used on [[Legacy:Static Mesh|static mesh]]es.
; EDrawType DrawType : Sets how the actor is drawn, eg sprite, static mesh, etc. See enum list below.
; name ForcedVisibilityZoneTag :  Makes the visibility code treat the actor as if it was in the zone(s) with the given tag.
; float LODBias :  This will affect the distance at which the engine starts simplifying the mesh. If your new model has parts that are pretty thin, or even have a single face, raise this number. 
; byte MaxLights :  Limit to hardware lights active on this primitive.  
; [[Legacy:Mesh|Mesh]] Mesh : Mesh to display if DrawType=DT_Mesh.  
; [[Legacy:Material|Material]] OverlayMaterial :  sjs - shader/material effect to use with skin  
; float OverlayTimer :  sjs - set by server  
; vector PrePivot :  Offset from box center for drawing. This property is useful for fixing [[Legacy:Static Mesh|static mesh]]es that aren't correctly lined up to the grid. 
; float ScaleGlow : 
; array&lt;[[Legacy:Material|Material]]&gt; Skins :  Multiple skin support - not replicated.  
; [[Legacy:StaticMesh|StaticMesh]] StaticMesh :  the [[Legacy:Static Mesh|Static Mesh]] to display if DrawType=DT_StaticMesh  
; ERenderStyle Style : the render style: see below 
; [[Legacy:Material|Material]] Texture :  Sprite texture if DrawType=DT_Sprite  
; EUV2Mode UV2Mode :  determines how the UV2Texture is applied. 
; [[Legacy:Material|Material]] UV2Texture : Some sort of overlay mojo for [[Legacy:Static Mesh|Static Mesh]]es.

===EDrawType ===

The DrawType enumneration sets how the actor displays. Some of these options work with another property to set ''what'' is displayed.

; DT_None : The actor isn't displayed at all. You should probably use [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]] -&gt; bHidden instead in most cases because it will allow the actor to still show up in UnrealEd.
; DT_Sprite : Display a sprite with the material set in the Texture property.
; DT_Mesh : Display the mesh set in the Mesh property. 
; DT_Brush : Only for [[Legacy:Brush|Brush]] classes.
; DT_RopeSprite : 
; DT_VerticalSprite : 
; DT_Terraform : 
; DT_SpriteAnimOnce : Like DT_Sprite, but plays an animated texture's animation at a speed that plays the animation exactly once during the LifeSpan of the actor. 
; DT_StaticMesh : Display the [[Legacy:Static Mesh|static mesh]] set in the StaticMesh property.
; DT_DrawType : 
; DT_Particle : Used by particle effect actors ([[Legacy:Emitter|Emitter]], [[Legacy:XEmitter|xEmitter]], [[Legacy:XWeatherEffect|xWeatherEffect]]) and [[Legacy:XProcMesh|xProcMesh]]es.
; DT_AntiPortal : Used for [[Legacy:Antiportal|Antiportal]]s.
; DT_FluidSurface : Used by [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]s. See [[Legacy:Fluid Surfaces|Fluid Surfaces]].

===ERenderStyle ===

See also [[Legacy:Color Blending|Color Blending]].

; STY_None : 
; STY_Normal : 
; STY_Masked : 
; STY_Translucent : 
; STY_Modulated : 
; STY_Alpha : If you use the Alpha blending mode when drawing in RenderOverlays, the final alpha level is determined by both the alpha channel AND the player's [[Legacy:HUD|HUD]] Transparency Setting. So even if you set the alpha to 255, if the player has anything less than a fully opaque HUD setting, your overlay texture will still appear translucent.
; STY_Additive : 
; STY_Subtractive : 
; STY_Particle : 
; STY_AlphaZ :</text>
    </revision>
    <revision>
      <id>1152</id>
      <timestamp>2005-07-30T08:28:53Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Display)}}

(For the UT Actor class properties, see [[Legacy:Actor (UT)/Display|Actor (UT)/Display]].)

This group holds properties that affect how the actor is displayed. The most important property is the DrawType [[Legacy:Enum|enum]]eration, which sets what kind of resource is displayed: texture, mesh, etc. Other properties then determine the actual thing that is displayed: [[Legacy:Set The Resource Property|Set The Resource Property]] that matches the DrawType.

; AmbientGlow : The brightness of the actor. Shifts the used lightmap up by this amount. 0 means the actor can be completely dark if it's in the shadows, 128 means the actor will be rendered as unlit or brighter, 254 means the actor is always rendered twice as bright as unlit
; [[Legacy:ConvexVolume|ConvexVolume]] AntiPortal : ConvexVolume used for DT_AntiPortal  
; bool bAcceptsProjectors : [[Legacy:Projector|Projector]]s can project onto this actor  
; bool bAlwaysFaceCamera :  actor will be rendered always facing the camera like a [[Legacy:Sprite|sprite]]  
; bool bDisableSorting :  Manual override for translucent material sorting.  
; bool bShadowCast :  Casts [[Legacy:Static Shadow|static shadow]]s.  
; bool bStaticLighting :  Uses raytraced lighting.  
; bool bUnlit :  [[Legacy:Light|Light]]s don't affect actor. It will be at full brightness.  
; bool bUseDynamicLights :  
; bool bUseLightingFromBase :  Use Unlit/AmbientGlow from Base  
; float ClientOverlayCounter :  sjs - current secs left to show overlay effect  
; float ClientOverlayTimer :  sjs - client inital time count  
; float CullDistance : in non-zero, sets the distance at which to cease displaying this actor (works for static meshes)
; float DrawScale : Scales the actor's visual representation, whether it's a static mesh, texture or whatever. Useful on non-displayed actors to make their icons bigger in UnrealEd.
; vector DrawScale3D : 3-dimensional scaling of the actor's visual representation. Used on [[Legacy:Static Mesh|static mesh]]es.
; EDrawType DrawType : Sets how the actor is drawn, eg sprite, static mesh, etc. See enum list below.
; name ForcedVisibilityZoneTag :  Makes the visibility code treat the actor as if it was in the zone(s) with the given tag.
; float LODBias :  This will affect the distance at which the engine starts simplifying the mesh. If your new model has parts that are pretty thin, or even have a single face, raise this number. 
; byte MaxLights :  Limit to hardware lights active on this primitive.  
; [[Legacy:Mesh|Mesh]] Mesh : Mesh to display if DrawType=DT_Mesh.  
; [[Legacy:Material|Material]] OverlayMaterial :  sjs - shader/material effect to use with skin  
; float OverlayTimer :  sjs - set by server  
; vector PrePivot :  Offset from box center for drawing. This property is useful for fixing [[Legacy:Static Mesh|static mesh]]es that aren't correctly lined up to the grid. 
; float ScaleGlow : 
; array&lt;[[Legacy:Material|Material]]&gt; Skins :  Multiple skin support - not replicated.  
; [[Legacy:StaticMesh|StaticMesh]] StaticMesh :  the [[Legacy:Static Mesh|Static Mesh]] to display if DrawType=DT_StaticMesh  
; ERenderStyle Style : the render style: see below 
; [[Legacy:Material|Material]] Texture :  Sprite texture if DrawType=DT_Sprite  
; EUV2Mode UV2Mode :  determines how the [[Legacy:UV2Texture|UV2Texture]] is applied. 
; [[Legacy:Material|Material]] UV2Texture : Some sort of overlay mojo for [[Legacy:Static Mesh|Static Mesh]]es.

===EDrawType ===

The DrawType enumneration sets how the actor displays. Some of these options work with another property to set ''what'' is displayed.

; DT_None : The actor isn't displayed at all. You should probably use [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced]] -&gt; bHidden instead in most cases because it will allow the actor to still show up in UnrealEd.
; DT_Sprite : Display a sprite with the material set in the Texture property.
; DT_Mesh : Display the mesh set in the Mesh property. 
; DT_Brush : Only for [[Legacy:Brush|Brush]] classes.
; DT_RopeSprite : 
; DT_VerticalSprite : 
; DT_Terraform : 
; DT_SpriteAnimOnce : Like DT_Sprite, but plays an animated texture's animation at a speed that plays the animation exactly once during the LifeSpan of the actor. 
; DT_StaticMesh : Display the [[Legacy:Static Mesh|static mesh]] set in the StaticMesh property.
; DT_DrawType : 
; DT_Particle : Used by particle effect actors ([[Legacy:Emitter|Emitter]], [[Legacy:XEmitter|xEmitter]], [[Legacy:XWeatherEffect|xWeatherEffect]]) and [[Legacy:XProcMesh|xProcMesh]]es.
; DT_AntiPortal : Used for [[Legacy:Antiportal|Antiportal]]s.
; DT_FluidSurface : Used by [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]s. See [[Legacy:Fluid Surfaces|Fluid Surfaces]].

===ERenderStyle ===

See also [[Legacy:Color Blending|Color Blending]].

; STY_None : 
; STY_Normal : 
; STY_Masked : 
; STY_Translucent : 
; STY_Modulated : 
; STY_Alpha : If you use the Alpha blending mode when drawing in RenderOverlays, the final alpha level is determined by both the alpha channel AND the player's [[Legacy:HUD|HUD]] Transparency Setting. So even if you set the alpha to 255, if the player has anything less than a fully opaque HUD setting, your overlay texture will still appear translucent.
; STY_Additive : 
; STY_Subtractive : 
; STY_Particle : 
; STY_AlphaZ :</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Enums</title>
    <id>324</id>
    <revision>
      <id>1153</id>
      <timestamp>2003-10-04T11:37:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Enums)}}

[[Legacy:Variable Type|Enums]] defined in the Actor class.

===EDetailMode ===

World detail modes.
; DM_Low : Low detail mode. No high detail or super-high detail actors should be displayed.
; DM_High : High detail. No super-high detail actors should be displayed.
; DM_SuperHigh : All detail-dependant actors should be displayed.

===EDoubleClickDir ===

Used to remember the dodging state of a player. This will be reset to DCLICK_None when the player lands.
; DCLICK_None : No dodging move started.
; DCLICK_Left : 
; DCLICK_Right : 
; DCLICK_Forward : 
; DCLICK_Back : 
; DCLICK_Active : In dodging move.
; DCLICK_Done : Dodging move done.

===EDrawType ===

See [[Legacy:Actor/Display|Actor/Display]]

===EFilterState ===
; FS_Maybe : 
; FS_Yes : 
; FS_No : 

===EFlagState ===

States of CTF flags.
; FLAG_Home : The flag is in its base.
; FLAG_HeldFriendly : The flag is being held by a member of the flag's team.
; FLAG_HeldEnemy : The flag is being held by a member of the enemy team.
; FLAG_Down : The flag has been dropped.

===EForceType ===
; FT_None : This actor of doesn't apply any force to emitter particles.
; FT_DragAlong : This actor drags emitter particles with it.
; FT_Constant : This actor applies a constant force to emitter particles.

===eKillZType ===
; KILLZ_None : 
; KILLZ_Lava : 
; KILLZ_Suicide : 

===ELightEffect ===
; LE_None : 
; LE_TorchWaver : 
; LE_FireWaver : 
; LE_WateryShimmer : 
; LE_Searchlight : 
; LE_SlowWave : 
; LE_FastWave : 
; LE_CloudCast : 
; LE_StaticSpot : 
; LE_Shock : 
; LE_Disco : 
; LE_Warp : 
; LE_Spotlight : 
; LE_NonIncidence : 
; LE_Shell : 
; LE_OmniBumpMap : 
; LE_Interference : 
; LE_Cylinder : 
; LE_Rotor : 
; LE_Negative : 
; LE_Sunlight : 
; LE_QuadraticNonIncidence : 

===ELightType ===
; LT_None : 
; LT_Steady : 
; LT_Pulse : 
; LT_Blink : 
; LT_Flicker : 
; LT_Strobe : 
; LT_BackdropLight : 
; LT_SubtlePulse : 
; LT_TexturePaletteOnce : 
; LT_TexturePaletteLoop : 
; LT_FadeOut : 

===EMusicTransition ===
; MTRAN_None : 
; MTRAN_Instant : 
; MTRAN_Segue : 
; MTRAN_Fade : 
; MTRAN_FastFade : 
; MTRAN_SlowFade : 

===ENetRole ===

See [[Legacy:Role|Role]].

===EPhysics ===

See [[Legacy:PhysicsType|PhysicsType]].

===ERenderStyle ===

See [[Legacy:Color Blending|Color Blending]].

===ESoundOcclusion ===
; OCCLUSION_Default : 
; OCCLUSION_None : 
; OCCLUSION_BSP : 
; OCCLUSION_StaticMeshes : 

===ESoundSlot ===
; SLOT_None : 
; SLOT_Misc : 
; SLOT_Pain : 
; SLOT_Interact : 
; SLOT_Ambient : 
; SLOT_Talk : 
; SLOT_Interface : 

===ESurfaceType ===

See [[Legacy:ESurfaceTypes|ESurfaceTypes]].

===ETravelType ===
; TRAVEL_Absolute : Absolute URL.
; TRAVEL_Partial : Partial (carry name, reset server).
; TRAVEL_Relative : Relative URL.

===EUV2Mode ===
; UVM_MacroTexture : 
; UVM_LightMap : 
; UVM_Skin : 

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1154</id>
      <timestamp>2003-04-02T16:04:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Enums)}}

[[Legacy:Enum|Enum]]s defined in the Actor class.

===EDetailMode ===

World detail modes.
; DM_Low : Low detail mode. No high detail or super-high detail actors should be displayed.
; DM_High : High detail. No super-high detail actors should be displayed.
; DM_SuperHigh : All detail-dependant actors should be displayed.

===EDoubleClickDir ===
; DCLICK_None : 
; DCLICK_Left : 
; DCLICK_Right : 
; DCLICK_Forward : 
; DCLICK_Back : 
; DCLICK_Active : 
; DCLICK_Done : 

===EDrawType ===

See [[Legacy:Actor/Display|Actor/Display]]

===EFilterState ===
; FS_Maybe : 
; FS_Yes : 
; FS_No : 

===EFlagState ===

States of CTF flags.
; FLAG_Home : The flag is in its base.
; FLAG_HeldFriendly : The flag is being held by a member of the flag's team.
; FLAG_HeldEnemy : The flag is being held by a member of the enemy team.
; FLAG_Down : The flag has been dropped.

===EForceType ===
; FT_None : 
; FT_DragAlong : 
; FT_Constant : 

===eKillZType ===
; KILLZ_None : 
; KILLZ_Lava : 
; KILLZ_Suicide : 

===ELightEffect ===
; LE_None : 
; LE_TorchWaver : 
; LE_FireWaver : 
; LE_WateryShimmer : 
; LE_Searchlight : 
; LE_SlowWave : 
; LE_FastWave : 
; LE_CloudCast : 
; LE_StaticSpot : 
; LE_Shock : 
; LE_Disco : 
; LE_Warp : 
; LE_Spotlight : 
; LE_NonIncidence : 
; LE_Shell : 
; LE_OmniBumpMap : 
; LE_Interference : 
; LE_Cylinder : 
; LE_Rotor : 
; LE_Negative : 
; LE_Sunlight : 
; LE_QuadraticNonIncidence : 

===ELightType ===
; LT_None : 
; LT_Steady : 
; LT_Pulse : 
; LT_Blink : 
; LT_Flicker : 
; LT_Strobe : 
; LT_BackdropLight : 
; LT_SubtlePulse : 
; LT_TexturePaletteOnce : 
; LT_TexturePaletteLoop : 
; LT_FadeOut : 

===EMusicTransition ===
; MTRAN_None : 
; MTRAN_Instant : 
; MTRAN_Segue : 
; MTRAN_Fade : 
; MTRAN_FastFade : 
; MTRAN_SlowFade : 

===ENetRole ===

An actor's network roles used in [[Legacy:Replication|Replication]]. See [[Legacy:Role|Role]].

===EPhysics ===

See [[Legacy:PhysicsType|PhysicsType]].

===ERenderStyle ===

&quot;STY_...&quot; &amp;ndash; See [[Legacy:Actor/Display|Actor/Display]]

===ESoundOcclusion ===
; OCCLUSION_Default : 
; OCCLUSION_None : 
; OCCLUSION_BSP : 
; OCCLUSION_StaticMeshes : 

===ESoundSlot ===
; SLOT_None : 
; SLOT_Misc : 
; SLOT_Pain : 
; SLOT_Interact : 
; SLOT_Ambient : 
; SLOT_Talk : 
; SLOT_Interface : 

===ESurfaceType ===

See [[Legacy:ESurfaceTypes|ESurfaceTypes]].

===ETravelType ===
; TRAVEL_Absolute : Absolute URL.
; TRAVEL_Partial : Partial (carry name, reset server).
; TRAVEL_Relative : Relative URL.

===EUV2Mode ===
; UVM_MacroTexture : 
; UVM_LightMap : 
; UVM_Skin : 

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1155</id>
      <timestamp>2003-07-29T09:13:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Enums)}}

[[Legacy:Variable Type|Enums]] defined in the Actor class.

===EDetailMode ===

World detail modes.
; DM_Low : Low detail mode. No high detail or super-high detail actors should be displayed.
; DM_High : High detail. No super-high detail actors should be displayed.
; DM_SuperHigh : All detail-dependant actors should be displayed.

===EDoubleClickDir ===

Used to remember the dodging state of a player. This will be reset to DCLICK_None when the player lands.
; DCLICK_None : No dodging move started.
; DCLICK_Left : 
; DCLICK_Right : 
; DCLICK_Forward : 
; DCLICK_Back : 
; DCLICK_Active : In dodging move.
; DCLICK_Done : Dodging move done.

===EDrawType ===

See [[Legacy:Actor/Display|Actor/Display]]

===EFilterState ===
; FS_Maybe : 
; FS_Yes : 
; FS_No : 

===EFlagState ===

States of CTF flags.
; FLAG_Home : The flag is in its base.
; FLAG_HeldFriendly : The flag is being held by a member of the flag's team.
; FLAG_HeldEnemy : The flag is being held by a member of the enemy team.
; FLAG_Down : The flag has been dropped.

===EForceType ===
; FT_None : This actor of doesn't apply any force to emitter particles.
; FT_DragAlong : This actor drags emitter particles with it.
; FT_Constant : This actor applies a constant force to emitter particles.

===eKillZType ===
; KILLZ_None : 
; KILLZ_Lava : 
; KILLZ_Suicide : 

===ELightEffect ===
; LE_None : 
; LE_TorchWaver : 
; LE_FireWaver : 
; LE_WateryShimmer : 
; LE_Searchlight : 
; LE_SlowWave : 
; LE_FastWave : 
; LE_CloudCast : 
; LE_StaticSpot : 
; LE_Shock : 
; LE_Disco : 
; LE_Warp : 
; LE_Spotlight : 
; LE_NonIncidence : 
; LE_Shell : 
; LE_OmniBumpMap : 
; LE_Interference : 
; LE_Cylinder : 
; LE_Rotor : 
; LE_Negative : 
; LE_Sunlight : 
; LE_QuadraticNonIncidence : 

===ELightType ===
; LT_None : 
; LT_Steady : 
; LT_Pulse : 
; LT_Blink : 
; LT_Flicker : 
; LT_Strobe : 
; LT_BackdropLight : 
; LT_SubtlePulse : 
; LT_TexturePaletteOnce : 
; LT_TexturePaletteLoop : 
; LT_FadeOut : 

===EMusicTransition ===
; MTRAN_None : 
; MTRAN_Instant : 
; MTRAN_Segue : 
; MTRAN_Fade : 
; MTRAN_FastFade : 
; MTRAN_SlowFade : 

===ENetRole ===

An actor's network roles used in [[Legacy:Replication|Replication]]. See [[Legacy:Role|Role]].

===EPhysics ===

See [[Legacy:PhysicsType|PhysicsType]].

===ERenderStyle ===

&quot;STY_...&quot; &amp;ndash; See [[Legacy:Actor/Display|Actor/Display]]

===ESoundOcclusion ===
; OCCLUSION_Default : 
; OCCLUSION_None : 
; OCCLUSION_BSP : 
; OCCLUSION_StaticMeshes : 

===ESoundSlot ===
; SLOT_None : 
; SLOT_Misc : 
; SLOT_Pain : 
; SLOT_Interact : 
; SLOT_Ambient : 
; SLOT_Talk : 
; SLOT_Interface : 

===ESurfaceType ===

See [[Legacy:ESurfaceTypes|ESurfaceTypes]].

===ETravelType ===
; TRAVEL_Absolute : Absolute URL.
; TRAVEL_Partial : Partial (carry name, reset server).
; TRAVEL_Relative : Relative URL.

===EUV2Mode ===
; UVM_MacroTexture : 
; UVM_LightMap : 
; UVM_Skin : 

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Events</title>
    <id>325</id>
    <revision>
      <id>1156</id>
      <timestamp>2002-11-13T18:59:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property group: Events)}}

(see also [[Legacy:Actor (UT)/Events|Actor (UT)/Events]])

; name Event : The [[Legacy:Event|event]] this actor causes.
; name ExcludeTag[8] : Multipurpose exclusion tag for excluding [[Legacy:Light (UT)|Light (UT)]]s, [[Legacy:Projector|projector]]s, rendering actors, blocking weather, etc.
; name Tag : Actor's [[Legacy:Tag|tag]] name.

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Lighting</title>
    <id>329</id>
    <revision>
      <id>1163</id>
      <timestamp>2006-04-07T07:52:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Lighting)}}

For the [[Legacy:UT|UT]] properties, see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]].

These properties allow any actor to cast light, in particular the [[Legacy:Light|Light]] actor.  However, most of the LightEffect settings don't work in game UT2003, even if they work in the [[Legacy:UnrealEd 3|UnrealEd 3]]; use [[Legacy:Projector|Projector]]s instead.  

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.
;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 

===Lighting===
; bool bActorShadows : Light casts actor shadows.
; bool bAttenByLife : Attenuate light by diminishing lifespan.
; bool bCorona : Light uses Skin as a corona.
; bool bDirectionalCorona : (if bCorona) Make corona bigger if it faces you, and zero and 90 degrees or beyond.
; bool bDynamicLight : This light is dynamic.
; bool bLightingVisibility : Calculate lighting visibility for this actor with line checks.
; bool bSpecialLit : Only affects special-lit surfaces. See [[Legacy:Special Lit|Special Lit]] for more information.
; byte LightCone : 
; ELightEffect LightEffect : 
; byte LightPeriod : 
; byte LightPhase : Start of light animation cycle. 

; float LightRadius : Radius of the light. This doesn't seem to be [[Legacy:UU|UU]], whether you go by how far the light goes, or the dark blue circle you see if you enable [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; Radii View. There seems to be a factor of about 27 between the LightRadius value and how far the light reaches in UU. The blue circle is a good guide of how far the light will reach.

; ELightType LightType : 

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all topics about lighting.

==Discussion==

'''Axe56:''' Same here, couldn't get anything like that happening. I'm also toying with the distance fog option in UT2k3, and seem to be gettng a HOM effect if I look across the entire map with distance fog on... the question is: anyone know where I can look?

'''Roland:''' Yep, same here, I wish I would have looked here first...it took me hours to find out what I did wrong (I didn't..)

'''ZxAnPhOrIaN:''' You must have an emitter do the flickering. Just don't activate the emitter (don't make it emit stuff).

'''Mosquito''' Axe, You get the HOM effect in the editor if the distance is bigger then the max map size in the orginal UT, even if you add distance fog, its still there... But ingame its Gone. (look at CTF-DE-Lavagiant][

'''KGF:'''  Well, would someone care to elaborate a bit?  Exactly HOW can I use an emitter to simulate a torch flicker effect?  Nothing I do will work.  And Projectors are even more of a dead end...how can you use those to just project light, and not a texture?

'''Axe56:''' Mosquito, thanks :) KGF, not exactly sure, but I didn't think (correct me if I'm wrong) that emitters produce light, only textures.

'''Sobiwan:''' Is the class called '''light''', not '''lighting'''?

'''Tarquin:''' Well ''this'' class is called [[Legacy:Actor|Actor]] ;)

'''MythOpus:''' All of these properties can be set in every class that extends Actor Sobiwan.  You're thinknig of the class 'Light' that is just a shortcut to putting lighting in your maps basically.</text>
    </revision>
    <revision>
      <id>1164</id>
      <timestamp>2005-12-03T03:06:56Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Lighting)}}

For the [[Legacy:UT|UT]] properties, see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]].

These properties allow any actor to cast light, in particular the [[Legacy:Light|Light]] actor.  However, most of the LightEffect settings don't work in game UT2003, even if they work in the [[Legacy:UnrealEd 3|UnrealEd 3]]; use [[Legacy:Projector|Projector]]s instead.  

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.
;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 

===Lighting===
; bool bActorShadows : Light casts actor shadows.
; bool bAttenByLife : Attenuate light by diminishing lifespan.
; bool bCorona : Light uses Skin as a corona.
; bool bDirectionalCorona : (if bCorona) Make corona bigger if it faces you, and zero and 90 degrees or beyond.
; bool bDynamicLight : This light is dynamic.
; bool bLightingVisibility : Calculate lighting visibility for this actor with line checks.
; bool bSpecialLit : Only affects special-lit surfaces. See [[Legacy:Special Lit|Special Lit]] for more information.
; byte LightCone : 
; ELightEffect LightEffect : 
; byte LightPeriod : 
; byte LightPhase : Start of light animation cycle. 

; float LightRadius : Radius of the light. This doesn't seem to be [[Legacy:UU|UU]], whether you go by how far the light goes, or the dark blue circle you see if you enable [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; Radii View. There seems to be a factor of about 27 between the LightRadius value and how far the light reaches in UU. The blue circle is a good guide of how far the light will reach.

; ELightType LightType : 

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all topics about lighting.

==Discussion==

'''Axe56:''' Same here, couldn't get anything like that happening. I'm also toying with the distance fog option in UT2k3, and seem to be gettng a HOM effect if I look across the entire map with distance fog on... the question is: anyone know where I can look?

'''Roland:''' Yep, same here, I wish I would have looked here first...it took me hours to find out what I did wrong (I didn't..)

'''ZxAnPhOrIaN:''' You must have an emitter do the flickering. Just don't activate the emitter (don't make it emit stuff).

'''Mosquito''' Axe, You get the HOM effect in the editor if the distance is bigger then the max map size in the orginal UT, even if you add distance fog, its still there... But ingame its Gone. (look at CTF-DE-Lavagiant][

'''KGF:'''  Well, would someone care to elaborate a bit?  Exactly HOW can I use an emitter to simulate a torch flicker effect?  Nothing I do will work.  And Projectors are even more of a dead end...how can you use those to just project light, and not a texture?

'''Axe56:''' Mosquito, thanks :) KGF, not exactly sure, but I didn't think (correct me if I'm wrong) that emitters produce light, only textures.

'''Sobiwan:''' Is the class called '''light''', not '''lighting'''?

'''Tarquin:''' Well ''this'' class is called [[Legacy:Actor|Actor]] ;)

'''MythOpus:''' All of these properties can be set in every class that extends Actor Sobiwan.  You're thinknig of the class 'Light' that is just a shortcut to putting lighting in your maps basically.</text>
    </revision>
    <revision>
      <id>1165</id>
      <timestamp>2006-04-06T21:05:49Z</timestamp>
      <contributor>
        <ip>CDN-CE-INFLOW-T2-01.inflow.pa.bo.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Lighting)}}

For the [[Legacy:UT|UT]] properties, see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]].

These properties allow any actor to cast light, in particular the [[Legacy:Light|Light]] actor.  However, most of the LightEffect settings don't work in game UT2003, even if they work in the [[Legacy:UnrealEd 3|UnrealEd 3]]; use [[Legacy:Projector|Projector]]s instead.  

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.
;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 

===Lighting===
; bool bActorShadows : Light casts actor shadows.
; bool bAttenByLife : Attenuate light by diminishing lifespan.
; bool bCorona : Light uses Skin as a corona.
; bool bDirectionalCorona : (if bCorona) Make corona bigger if it faces you, and zero and 90 degrees or beyond.
; bool bDynamicLight : This light is dynamic.
; bool bLightingVisibility : Calculate lighting visibility for this actor with line checks.
; bool bSpecialLit : Only affects special-lit surfaces. See [[Legacy:Special Lit|Special Lit]] for more information.
; byte LightCone : 
; ELightEffect LightEffect : 
; byte LightPeriod : 
; byte LightPhase : Start of light animation cycle. 

; float LightRadius : Radius of the light. This doesn't seem to be [[Legacy:UU|UU]], whether you go by how far the light goes, or the dark blue circle you see if you enable [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; Radii View. There seems to be a factor of about 27 between the LightRadius value and how far the light reaches in UU. The blue circle is a good guide of how far the light will reach.

; ELightType LightType : 

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all topics about lighting.

==Discussion==

'''Axe56:''' Same here, couldn't get anything like that happening. I'm also toying with the distance fog option in UT2k3, and seem to be gettng a HOM effect if I look across the entire map with distance fog on... the question is: anyone know where I can look?

'''Roland:''' Yep, same here, I wish I would have looked here first...it took me hours to find out what I did wrong (I didn't..)

'''ZxAnPhOrIaN:''' You must have an emitter do the flickering. Just don't activate the emitter (don't make it emit stuff).

'''Mosquito''' Axe, You get the HOM effect in the editor if the distance is bigger then the max map size in the orginal UT, even if you add distance fog, its still there... But ingame its Gone. (look at CTF-DE-Lavagiant][

'''KGF:'''  Well, would someone care to elaborate a bit?  Exactly HOW can I use an emitter to simulate a torch flicker effect?  Nothing I do will work.  And Projectors are even more of a dead end...how can you use those to just project light, and not a texture?

'''Axe56:''' Mosquito, thanks :) KGF, not exactly sure, but I didn't think (correct me if I'm wrong) that emitters produce light, only textures.

'''Sobiwan:''' Is the class called '''light''', not '''lighting'''?

'''Tarquin:''' Well ''this'' class is called [[Legacy:Actor|Actor]] ;)

'''MythOpus:''' All of these properties can be set in every class that extends Actor Sobiwan.  You're thinknig of the class 'Light' that is just a shortcut to putting lighting in your maps basically.

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
    <revision>
      <id>35488</id>
      <timestamp>2009-10-17T20:56:44Z</timestamp>
      <contributor>
        <username>Rejecht</username>
        <id>1657</id>
      </contributor>
      <comment>/* LightColor: Added a table to show what colour  corresponds with the LightHue value (UE2.5, UT2004 as reference). */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Lighting)}}

For the [[Legacy:UT|UT]] properties, see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]].

These properties allow any actor to cast light, in particular the [[Legacy:Light|Light]] actor.  However, most of the LightEffect settings don't work in game UT2003, even if they work in the [[Legacy:UnrealEd 3|UnrealEd 3]]; use [[Legacy:Projector|Projector]]s instead.  

==LightColor ==

This property group determines the colour of the light. For examples of settings, see [[Legacy:Colors|Colors]].

;LightBrightness: How bright the light should be from source and outwards. 
;LightHue: Allows you to select a color through the default color spectrum. The values range from 0 to 255. Affects the color chosen.

{| align=&quot;center&quot; style=&quot;font-family: courier, courier new, monospace;&quot;
|+LightBrightness = 255, LightSaturation = 0
!LightHue:!!&amp;nbsp;&amp;nbsp;0!!&amp;nbsp;16!!&amp;nbsp;32!!&amp;nbsp;48!!&amp;nbsp;64!!&amp;nbsp;80!!&amp;nbsp;96!!112!!128!!144!!160!!176!!192!!208!!224!!240!!255
|-
| align=&quot;right&quot; | '''Colour:'''
| style=&quot;background-color:#FF0000;&quot; | &amp;nbsp;
| style=&quot;background-color:#CF2E00;&quot; | &amp;nbsp;
| style=&quot;background-color:#B16700;&quot; | &amp;nbsp;
| style=&quot;background-color:#84A500;&quot; | &amp;nbsp;
| style=&quot;background-color:#42CA00;&quot; | &amp;nbsp;
| style=&quot;background-color:#10F600;&quot; | &amp;nbsp;
| style=&quot;background-color:#00E820;&quot; | &amp;nbsp;
| style=&quot;background-color:#00B255;&quot; | &amp;nbsp;
| style=&quot;background-color:#008388;&quot; | &amp;nbsp;
| style=&quot;background-color:#0052BA;&quot; | &amp;nbsp;
| style=&quot;background-color:#001EEA;&quot; | &amp;nbsp;
| style=&quot;background-color:#1000FE;&quot; | &amp;nbsp;
| style=&quot;background-color:#4200D5;&quot; | &amp;nbsp;
| style=&quot;background-color:#8300A3;&quot; | &amp;nbsp;
| style=&quot;background-color:#B20061;&quot; | &amp;nbsp;
| style=&quot;background-color:#E50030;&quot; | &amp;nbsp;
| style=&quot;background-color:#FF0000;&quot; | &amp;nbsp;
|}

;LightSaturation: This value sets the amount of white light to mix with the color selected. If the value is set to 0, it will be the pure color. The higher the value, the less rich the color becomes. This is very effective when creating realistic lighting schemes. The default saturation is 127. Affects the chosen color. 

===Lighting===
; bool bActorShadows : Light casts actor shadows.
; bool bAttenByLife : Attenuate light by diminishing lifespan.
; bool bCorona : Light uses Skin as a corona.
; bool bDirectionalCorona : (if bCorona) Make corona bigger if it faces you, and zero and 90 degrees or beyond.
; bool bDynamicLight : This light is dynamic.
; bool bLightingVisibility : Calculate lighting visibility for this actor with line checks.
; bool bSpecialLit : Only affects special-lit surfaces. See [[Legacy:Special Lit|Special Lit]] for more information.
; byte LightCone : 
; ELightEffect LightEffect : 
; byte LightPeriod : 
; byte LightPhase : Start of light animation cycle. 

; float LightRadius : Radius of the light. This doesn't seem to be [[Legacy:UU|UU]], whether you go by how far the light goes, or the dark blue circle you see if you enable [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; Radii View. There seems to be a factor of about 27 between the LightRadius value and how far the light reaches in UU. The blue circle is a good guide of how far the light will reach.

; ELightType LightType :

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all topics about lighting.

==Discussion==

'''Axe56:''' Same here, couldn't get anything like that happening. I'm also toying with the distance fog option in UT2k3, and seem to be gettng a HOM effect if I look across the entire map with distance fog on... the question is: anyone know where I can look?

'''Roland:''' Yep, same here, I wish I would have looked here first...it took me hours to find out what I did wrong (I didn't..)

'''ZxAnPhOrIaN:''' You must have an emitter do the flickering. Just don't activate the emitter (don't make it emit stuff).

'''Mosquito''' Axe, You get the HOM effect in the editor if the distance is bigger then the max map size in the orginal UT, even if you add distance fog, its still there... But ingame its Gone. (look at CTF-DE-Lavagiant][

'''KGF:'''  Well, would someone care to elaborate a bit?  Exactly HOW can I use an emitter to simulate a torch flicker effect?  Nothing I do will work.  And Projectors are even more of a dead end...how can you use those to just project light, and not a texture?

'''Axe56:''' Mosquito, thanks :) KGF, not exactly sure, but I didn't think (correct me if I'm wrong) that emitters produce light, only textures.

'''Sobiwan:''' Is the class called '''light''', not '''lighting'''?

'''Tarquin:''' Well ''this'' class is called [[Legacy:Actor|Actor]] ;)

'''MythOpus:''' All of these properties can be set in every class that extends Actor Sobiwan.  You're thinknig of the class 'Light' that is just a shortcut to putting lighting in your maps basically.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Methods</title>
    <id>331</id>
    <revision>
      <id>1168</id>
      <timestamp>2007-10-28T16:54:12Z</timestamp>
      <contributor>
        <ip>C-76-117-131-41.hsd1.pa.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Methods)}}

==Uncategorized ==

; string ConsoleCommand( string Command ) [native] : Execute a console command in the context of the current level and game engine. See [[Legacy:Console Commands|console commands]].

; Error( coerce string S ) [native, final] : Handle an error and kill this one actor.

; Sleep( float Seconds ) [native, final, latent] : See [[Legacy:Latent Function|latent function]].

==Collision ==

; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) [native, final] : Sets bCollideActors, bBlockActors and bBlockPlayers to the values given by the parameters. bBlockPlayers is obsolete.

; bool SetCollisionSize( float NewRadius, float NewHeight ) [native, final] : Sets CollisionRadius and CollisionHeight to the values given by the parameters.

==Drawing ==

As their names suggest, these functions set the corresponding properties, which can't be changed directly since they are declared as const.

; SetDrawScale( float NewScale ) [native, final]
; SetDrawScale3D( vector NewScale3D ) [native, final]
; SetStaticMesh( [[Legacy:StaticMesh|StaticMesh]] NewStaticMesh ) [native, final]
; SetDrawType( EDrawType NewDrawType ) [native, final]

==Movement ==

; bool Move( vector Delta ) [native, final] : Like SetLocation but parameter is used relative to current location.

; bool SetLocation( vector NewLocation ) [native, final] : This function sets the location of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. If the actor cannot occupy the new location because it is colliding with an actor that can block it, it will be placed at the nearest valid location. Note that because [[Legacy:Terrain|Terrain]] has no &quot;volume&quot; and is just a bent up sheet, the actor may not be moved in this manner when it penetrates [[Legacy:Terrain|terrain]].

; bool SetRotation( rotator NewRotation ) [native, final] :  This function sets the rotation of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. Does this relocate actors with more complex collision hulls if their new rotation causes them to penetrate an actor that can block them?

; bool SetRelativeRotation( rotator NewRotation ) [native, final] : Sets the rotation relative to the actor's base.

; bool SetRelativeLocation( vector NewLocation ) [native, final] : Sets the rotation reletive to the actor's base.

; bool MoveSmooth( vector Delta ) [native, final] :

; AutonomousPhysics( float DeltaSeconds ) [native, final] :

==Relations ==

; SetBase( [[Legacy:Actor|Actor]] NewBase, optional vector NewFloor ) [native, final] : Sets the actor's new base. NewFloor is the optional new floor normal (default is vect(0,0,1)) and it is only used for classes inherited from [[Legacy:Pawn|Pawn]].

; SetOwner( [[Legacy:Actor|Actor]] NewOwner ) [native, final] : Sets the actor's new owner.

==Animation ==

; string GetMeshName() [native, final] : 

; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Plays one of the animation sequences available for the actor's mesh. Rate is the relative playback speed of the animation sequence. TweenTime is the amount of game time the current animation frame is crossfaded to the start frame of the new animation before the animation sequence actually starts. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Same as PlayAnim, except that the animation sequence is restarted after it finished. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool TweenAnim( name Sequence, float Time, optional int Channel ) [native, final] : Crossfades from the current animation frame to the first frame of the specified animation sequence. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool IsAnimating(optional int Channel) [native, final] : Returns whether there's an animation playing in the specified channel.

; FinishAnim(optional int Channel) [native, final, latent] : A [[Legacy:Latent Function|latent function]] which returns when the animation sequence in the specified channel has reached its last frame.

; bool HasAnim( name Sequence ) [native, final] : Returns whether the actor's current mesh has an animation sequence with the specified name.

; StopAnimating( optional bool ClearAllButBase ) [native, final] : Immediately stops the animation(s) the actor is currently playing. ''(What does ClearAllButBase do?)'' [[:Category:Legacy Answer Needed]]

; FreezeAnimAt( float Time, optional int Channel) [native, final] : Freezes the specified channel's animation. ''(How exactly does this work?)'' [[:Category:Legacy Answer Needed]]

; SetAnimFrame( float Time, optional int Channel, optional int UnitFlag ) [native, final] : Sets an animation in a certain channel to the specified time index. If the UnitFlag is 0 then the time value ranges from 0 to 1, 1 being the end of the animation (last frame) and 0 being the beginning (first frame). If the UnitFlag is 1 then the time is the frame that you want it to go to.

; bool IsTweening(int Channel) [native, final] : Returns whether the specified channel is currently fading in (tweening to) a new animation sequence.

; AnimStopLooping(optional int Channel) [native, final] : Prevents an animation sequence from starting over by itself once it has reached its last frame.

===Animation Notifications ===

; AnimEnd( int Channel ) [event] : Notification that the current animation has ended.  Allows an object to wait for animation completion before proceeding with other activities.

; EnableChannelNotify ( int Channel, int Switch ) [native, final] :

; int GetNotifyChannel() [native, final] :

===Skeletal Animation ===

; LinkSkelAnim( [[Legacy:MeshAnimation|MeshAnimation]] Anim, optional [[Legacy:Mesh|Mesh]] NewMesh ) [simulated, native, final] : Links a new animation set and mesh to the actor.

; LinkMesh( [[Legacy:Mesh|Mesh]] NewMesh, optional bool bKeepAnim ) [simulated, native, final] : Loads a new [[Legacy:Mesh|mesh]] for the actor and optionally keeps the animation set of the previous mesh.

----

LinkMesh note&gt; vaptor: seems in 2004 and 2003 for subclassed xpawns link mesh won't work cause theres a undocumented native function that changes the set mesh in net mode to the default character mesh each tick the only work around is to stop replicateing player replication info by seting it to role_none but thats not a good solution either cause it tends cause the actor to not be useable for playercontrollers.

----

; BoneRefresh() [native, final] : Updates the bone coords.

; AnimBlendParams( int Stage, optional float BlendAlpha, optional float InTime, optional float OutTime, optional name BoneName, optional bool bGlobalPose) [native, final] : See [[udn2:SkeletalBlending]].

; AnimBlendToAlpha( int Stage, float TargetAlpha, float TimeInterval ) [native, final] :

; coords GetBoneCoords( name BoneName ) [native, final] :

; rotator GetBoneRotation( name BoneName, optional int Space ) [native, final] :

; vector GetRootLocation() [native, final] :

; rotator GetRootRotation() [native, final] :

; vector GetRootLocationDelta() [native, final] :

; rotator GetRootRotationDelta() [native, final] :

; bool AttachToBone( [[Legacy:Actor|Actor]] Attachment, name BoneName ) [native, final] : Attaches the actor to the bone/socket alias using the attachment offset/rotation defined within the socket.

; bool DetachFromBone( [[Legacy:Actor|Actor]] Attachment ) [native, final] :

; LockRootMotion( int Lock ) [native, final] :

; SetBoneScale( int Slot, optional float BoneScale, optional name BoneName ) [native, final] : Scales the specified bone, overriding any other bone scaling associated with the specified slot. Not sure of the rationale in exposing the slots.

; SetBoneDirection( name BoneName, rotator BoneTurn, optional vector BoneTrans, optional float Alpha, optional int Space ) [native, final] :

; SetBoneLocation( name BoneName, optional vector BoneTrans, optional float Alpha ) [native, final] :

; SetBoneRotation( name BoneName, optional rotator BoneTurn, optional int Space, optional float Alpha ) [native, final, simulated] :

; GetAnimParams( int Channel, out name OutSeqName, out float OutAnimFrame, out float OutAnimRate ) [native, final] :

; bool AnimIsInGroup( int Channel, name GroupName ) [native, final] :

; Name GetClosestBone( Vector loc, Vector ray, out float boneDist, optional Name BiasBone, optional float BiasDistance ) [native, final] : Returns the closest socket alias, not the bone (UT2004).

==URLs==

; UpdateURL( String NewOption, String NewValue, bool bSaveDefault ) [native, final] : Updates an URL option and optionally saves it as default URL option.

; string GetUrlOption( String Option ) [native, final] : Returns the value of an URL option.

==Rendering ==

; plane GetRenderBoundingSphere() [native, final] : Returns a plane struct which represents a sphere surrounding the actor. (X, Y, Z represent the center, W the radius)

; DrawDebugLine( vector LineStart, vector LineEnd, byte R, byte G, byte B) [native, final] : SLOW! Use for debugging only!

==Physics ==

; DebugClock() [native, final] :

; DebugUnclock() [native, final] :

; FinishInterpolation() [native, final, latent] : [[Legacy:Latent Function|Latent function]], which returns when the actor has finished following its assigned interpolation path.

; SetPhysics( EPhysics newPhysics ) [native, final] : Sets a new physics mode.

; OnlyAffectPawns( bool B ) [native, final] :

===Karma ===

Note that SimParams take affect until you quit the game! Make sure you reset them to defaults when leaving your mod etc.

; KGetSimParams( out KSimParams SimParams ) [native, final] :

; KSetSimParams( KSimParams SimParams ) [native, final] :

; quat KGetRBQuaternion() [native, final] :

; KGetRigidBodyState( out KRigidBodyState RBstate ) [native, final] : Returns the current Karma state of the actor in the RBstate variable

; KDrawRigidBodyState( KRigidBodyState RBState, bool AltColour ) [native, final] : SLOW! Use for debugging only!

; vector KRBVecToVector( KRBVec RBvec ) [native, final] : Returns a vector created from the Karma KRBVec

; KRBVec KRBVecFromVector( vector v ) [native, final] : Returns a Karma KBBVec created from the regular Unreal vector

; KSetMass( float mass ) [native, final] : Sets the Karma KMass property of an Actor

; float KGetMass() [native, final] : Returns the Karma KMass

; KSetInertiaTensor( vector it1, vector it2 ) [native, final] : Set inertia tensor assuming a mass of 1. Scaled by mass internally to calculate actual inertia tensor.

; KGetInertiaTensor( out vector it1, out vector it2 ) [native, final] :

; KSetDampingProps( float lindamp, float angdamp ) [native, final] :

; KGetDampingProps( out float lindamp, out float angdamp ) [native, final] :

; KSetFriction( float friction ) [native, final] : Sets the Karma Friction property

; float KGetFriction() [native, final] : Returns the Karma Friction property

; KSetRestitution( float rest ) [native, final] : Sets the Karma Restitution (Bounciness) property

; float KGetRestitution() [native, final] : Returns the Karma Restitution property

; KSetCOMOffset( vector offset ) [native, final] :

; KGetCOMOffset( out vector offset ) [native, final] :

; KGetCOMPosition( out vector pos ) [native, final] : Get actual position of actors COM in world space.

; KSetImpactThreshold( float thresh ) [native, final] : Sets the threshold for velocity at which a moving Karma actor must strike something before it's KImpact() event is called

; float KGetImpactThreshold() [native, final] : Returns the Impact Threshhold

; KWake() [native, final] : Begins Karma simulation

; bool KIsAwake() [native, final] : Returns true if Karma is simulating for this Actor

; KAddImpulse( vector Impulse, vector Position, optional name BoneName ) [native, final] : Adds a Karma impulse to the actor from Position, applying to BoneName

; KSetStayUpright( bool stayUpright, bool allowRotate ) [native, final] : Sets the KStayUpright poperty

; KSetBlockKarma( bool newBlock ) [native, final] : Sets the actor to block Karma

; KSetActorGravScale( float ActorGravScale ) [native, final] : Sets the Karma GravScale

; float KGetActorGravScale() [native, final] : Returns the Karma GravScale

; KDisableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Disable Karma contact generation between this actor, and another actor.  Collision is on by default.

; KEnableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Enable Karma contact generation between this actor, and another actor.  Collision is on by default.

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

===Karma Ragdoll ===

; KSetSkelVel( vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ) [native, final] :

; float KGetSkelMass() [native, final] :

; KFreezeRagdoll() [native, final] :

; KAddBoneLifter( name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ) [native, final] : Note you MUST turn collision off (KSetBlockKarma) before using bone lifters!

; KRemoveLifterFromBone( name BoneName ) [native, final] : 

; KRemoveAllBoneLifters() [native, final] : Used for only allowing a fixed maximum number of ragdolls in action.

; KMakeRagdollAvailable() [native, final] :

; bool KIsRagdollAvailable() [native, final] :

===Karma Events===

; KImpact( [[Legacy:Actor|Actor]] other, vector pos, vector impactVel, vector impactNorm) [event] : called when [[Legacy:Karma|Karma]] actor hits with impact velocity over KImpactThreshold 

; KVelDropBelow() [event] : called when karma actor's velocity drops below KVelDropBelowThreshold

; KSkelConvulse() [event] : called when a ragdoll convulses (see KarmaParamsSkel)

; KApplyForce( out vector Force, out vector Torque ) [event] : called just before sim to allow user to apply force (location movement) and torque (rotation movement) to the actor.  You should ONLY put numbers into Force and Torque during this event!!!!

; bool KUpdateState(out KRigidBodyState newState) [event] : This is called from inside C++ Karma physics code at the appropriate time to update state of Karma rigid body. If you return true, newState will be set into the rigid body. Return false and it will do nothing.&lt;br /&gt;It seems this is only called on subclasses of [[Legacy:KActor|KActor]], [[Legacy:KVehicle|KVehicle]] and [[Legacy:SVehicle|SVehicle]].

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

==Optimization==

; Clock( out float time ) [native, final] : This is called at the beginning of a section of code to be timed.  The variable time does not need to be initialized.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; UnClock( out float time ) [native, final] :  This is called at the end of a section of code to be timed passing in the same time variable supplied to Clock.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; CyclesToSeconds( int cycles) [native, final] : Available for Deus Ex. Converts the cycles created by Clock/UnClock to seconds.

==Timing ==

; SetTimer( float NewTimerRate, bool bLoop ) [native, final] : Causes Timer() events every NewTimerRate seconds. If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer. Actors with bStatic true do not get ticked, and as such the timer will not function if bStatic is true.

==Music ==

; int PlayMusic( string Song, float FadeInTime ) [native, final] : Plays a song name, given a FadeInTime, returns a SongHandle.

; StopMusic( int SongHandle, float FadeOutTime ) [native, final] : Stops the specified SongHandle (as given to you by PlayMusic)

; StopAllMusic( float FadeOutTime ) [native, final] : Stops all music

==Engine notification functions ==

; Destroyed() [event] : called when an actor is destroyed. See [[Legacy:Destroying Objects|Destroying Objects]].

; GainedChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor sets this actor as its Owner through SetOwner() or Spawn().

; LostChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor is no longer owned by this actor. Ownership was changed through SetOwner() or the other actor was destroyed.

; Tick( float DeltaTime ) [event] : Called when time passes if this actor isn't bStatic. ''DeltaTime'' is the time in seconds that has passed since the last tick. Child actors are ticket after their owners have been ticked. Temporarily toggle with Enable('Tick'), Disable('Tick'). See [[Legacy:Probe Function|Probe Function]].

; Timer() [event] : When a timer has been started with SetTimer(), this function is executed when the amount of time that was specified in SetTimer has passed. Like Tick() this event will only be called when the actor is not static and has not been disabled via Disable('Timer'). See [[Legacy:Probe Function|Probe Function]].

; PostNetReceive() [event] : If bNetNotify is True, this event is called when the actor receives an update to any variable through replication. See [[Legacy:Replication|Replication]].

; TornOff() [event] : Networking - called on client when actor is torn off. (bTearOff==true)

===Triggers ===

; Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is triggered.

; UnTrigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is untriggered.

; BeginEvent() [event] :

; EndEvent() [event] :

===Physics &amp; world interaction ===

; HitWall( vector HitNormal, [[Legacy:Actor|Actor]] HitWall ) [event] : Called when the actor can collide with world geometry and just hit a wall.

; Falling() [event] : Called with PHYS_Falling when the actor starts to fall.

; Landed( vector HitNormal ) [event] : Called when the actor is no longer falling. If you want to receive HitWall() instead of Landed() set bBounce=True.

; ZoneChange( [[Legacy:ZoneInfo|ZoneInfo]] NewZone ) [event] : Called when the actor's zone is about to change to NewZone.

; PhysicsVolumeChange( [[Legacy:PhysicsVolume|PhysicsVolume]] NewVolume ) [event] : Called when the actor's PhysicsVolume is about to change to NewVolume.

; Touch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull is touching another actor's collision hull.

; PostTouch( [[Legacy:Actor|Actor]] Other ) [event] : called for PendingTouch actor after physics completes

; UnTouch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull no longer touches another actor's collision hull.

; Bump( [[Legacy:Actor|Actor]] Other ) [event] :

; BaseChange() [event] : Called when the actor's base has changed.

; Attach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that another actor ''Other'' has been attached to it.

; Detach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that a previously attached actor ''Other'' has been detached from it.

; Actor SpecialHandling( [[Legacy:Pawn|Pawn]] Other) [event] :

; bool EncroachingOn( [[Legacy:Actor|Actor]] Other ) [event] : Called when this actor's collision hull intersects a blocking actor's collision hull. Returns whether this actor is &quot;encroaching&quot; on the other actor.

; EncroachedBy( [[Legacy:Actor|Actor]] Other ) [event] : When another actor has determined that it &quot;encroaches&quot; this actor, this event is called.

; FinishedInterpolation() [event] : The actor has finished folowing its assigned interpolation path.

; EndedRotation() [event] : Called when rotation completes.

; UsedBy( [[Legacy:Pawn|Pawn]] user ) [event] : Called if this Actor was touching a Pawn who pressed Use.

; FellOutOfWorld( eKillZType KillType ) [simulated, event] : Called when the actor fell below the current zone's KillZ height. By default this sets physics to none and destroys the actor.

; [[Legacy:Actor|Actor]] Trace( out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActors, optional vector Extent, optional out [[Legacy:Material|Material]] Material ) [native, final] : This traces a path to find what it collides with first. The line will be traced starting at TraceStart and ending at TraceEnd. If bTraceActors is true, actors will be considered for the tracing, otherwise only pieces of the world (terrain, staticmeshactors, BSP) will be considered for collision. When the trace hits something, HitLocation and HitNormal will be set to contain the location and normal of the impact. If specified, the material of the surface hit can also be returned. If an Extent is specified, you can have the trace have &quot;width.&quot; It will have a box of the size specified as a vector (corner to corner) as the &quot;thickness&quot; of the trace. Note that traces are not very fast, so should be avoided or kept to a minimum where possible. Note that if you want actors to be considered for traces they must be able to block the trace, either by bCollideActors, or easier with bBlockZeroExtentTraces or bBlockNonZeroExtentTraces if your trace uses extents. See [[Legacy:Trace|Trace]] for more.

'''Foxpaw:''' Can someone elaborate on the extents of a trace? Specifically, is the box aligned on the world axes or along the trace? IE, does the X of the extents point &quot;foreward&quot; along the trace, with Y and Z perpindicular to the trace, or do they define a box in the world coordinate system that gets &quot;dragged along&quot; the length of the trace?

'''Foxpaw:''' Tracing doesn't seem to interact properly with terrain if you use extents. I have been able to get zero extent traces to hit terrain, but not extent traces.

'''Devi:''' In theory the extent vector gets interpreted as a world aligned rectangular prism when doing Terrain checks, when it's testing versus actors it gets interpreted as a vertical cylinder. The cylinder collision type can go a bit weird if the X and Y values in the extent vector don't match...

; bool FastTrace( vector TraceEnd, optional vector TraceStart ) [native, final] : Similar to trace. Returns true if there is a clear path between the two points, false if the trace is blocked by world geometry. It will pass right through anything that is not set as world geometry.

; [[Legacy:Actor|Actor]] Spawn( class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation ) [native, final] : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location. See [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]].

; bool Destroy() [native, final] : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick. See [[Legacy:Destroying Objects|Destroying Objects]].

===Damage &amp; Kills ===

; KilledBy( [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : This actor was &quot;killed&quot; by a [[Legacy:Pawn|Pawn]].

; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] EventInstigator, vector HitLocation, vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) [event] : Called when the actor is taking damage.

==Sound ==

; PlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, final] : Play a sound effect. If called from a simulated function or on a client, the sound is propagated only to the local player, i.e. only he will hear the sound. If called from a non-simulated function on the server, the sound is propagated to all players. (They will hear it as long as they are in range.)

; PlayOwnedSound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, final] : Play a sound effect. On clients this is function behaves identical to PlaySound. If called on the server the sound os propagated to all players but the remote owner. It will be propagated to a local owner, though.

; DemoPlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, event] :

; float GetSoundDuration( [[Legacy:Sound|Sound]] Sound ) [native, final] : Get a sound duration in seconds. (not affected by Level.TimeDilation)

==Force Feedback ==

; PlayFeedbackEffect( String EffectName ) [native, final] :

; StopFeedbackEffect( optional String EffectName ) [native, final] : Pass no parameter or &quot;&quot; to stop all.

; bool ForceFeedbackSupported( optional bool Enable ) [native, final] :

==AI ==

; MakeNoise( float Loudness ) [native, final] : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an instigator if they are not pawns. The noise is blocked by walls (only tested BSP, not SM)

'''Foxpaw:''' This probrably does a &quot;FastTrace&quot; and will be blocked by any object that is set as being world geometry. I haven't tested that either though.

'''Wormbo:''' It's not simply a trace. it also takes into account that noise travels around corners etc. by doing path ([[Legacy:NavigationPoint|NavigationPoint]].bPropagatesSound) and zone checks.

; bool PlayerCanSeeMe() [native, final] : Returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location.  '''Note:''' If the Actor in question is set to bHidden=True, this will always return false.

; vector SuggestFallVelocity( vector Destination, vector Start, float MaxZ, float MaxXYSpeed ) [native, final] :

==??? ==

; bool PreTeleport( [[Legacy:Teleporter|Teleporter]] InTeleporter ) [event] : Called when an actor is about to be moved by a teleporter

; PostTeleport( [[Legacy:Teleporter|Teleporter]] OutTeleporter ) [event] : Called when an actor exits a teleporter

==Disk access ==

; string GetMapName( string NameEnding, string MapName, int Dir ) [native, final] : 

; GetNextSkin( string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ) [native, final] :

; string GetURLMap() [native, final] :

; string GetNextInt( string ClassName, int Num ) [native, final] :

; GetNextIntDesc( string ClassName, int Num, out string Entry, out string Description ) [native, final] :

; bool GetCacheEntry( int Num, out string GUID, out string Filename ) [native, final] :

; bool MoveCacheEntry( string GUID, optional string NewFilename ) [native, final] :

==Iterator functions ==

[[Legacy:Iterator|Iterator]] functions for dealing with sets of actors.

; AllActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Avoid using AllActors() too often as it iterates through the whole actor list and is therefore slow.

; DynamicActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Only iterates through the non-static actors on the list (still relatively slow, but much better than AllActors).  This should be used in most cases and replaces AllActors in most of Epic's game code.

; ChildActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors owned by this actor.  Slow like AllActors().

; BasedActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors based on the current actor (slow, like AllActors).

; TouchingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors touching the current actor (fast). Actors that are attached are ignored.

; TraceActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) [native, final, iterator] : TraceActors() return all actors along a traced line.  Reasonably fast (like any trace).

; RadiusActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns all actors within a give radius.  Slow like AllActors().  Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible (not bHidden) and in the collision hash (bCollideActors is true).

; VisibleActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc ) [native, final, iterator] : Returns all visible actors within a radius.  Slow like AllActors().  Use VisibleCollidingActors() instead if desired actor types are in the collision hash (bCollideActors is true).

; VisibleCollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden ) [native, final, iterator] : VisibleCollidingActors() returns visible (not bHidden) colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() since it uses the collision hash.

; CollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() for reasonably small radii since it uses the collision hash.

==Scripted Actor functions ==
; BecomeViewTarget() : Called by PlayerController when this actor becomes its ViewTarget.
; BroadcastLocalizedMessage( class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; MessageClass, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) [event] : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The LocalMessage class defines how the PRI's and optional actor are used.

; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) [simulated] : lists important actor variable on canvas.  HUD will call DisplayDebug() on the current ViewTarget when the ShowDebug exec is used.
; HurtRadius( float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation ) [simulated, final] : Hurt locally authoritative actors within the radius.
; MatchStarting() : Called when gameplay actually starts.
; PlayTeleportEffect( bool bOut, bool bSound ) :

; PreBeginPlay() [event] : Called immediately before gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; BeginPlay() [event] : Called when gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostBeginPlay() [event] : Called immediately after gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostNetBeginPlay() [event] : called after PostBeginPlay.  On a net client, PostNetBeginPlay() is spawned after replicated variables have been initialized to their replicated values. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].

; RenderOverlays( [[Legacy:Canvas|Canvas]] Canvas ) : Called by player's hud to request drawing of actor-specific overlays onto canvas. Called every frame. Whatever is drawn on the canvas here only lasts for the current frame.&lt;br /&gt;'''Note:''' This function has to be called explicitly by another canvas drawing function, it's ''not'' called automatically for all actors.
; RenderTexture( [[Legacy:ScriptedTexture|ScriptedTexture]] Tex ) [event] :
; ReplaceText( out string Text, string Replace, string With ) [final] :
; Reset() : Reset actor to initial state - used when restarting level without reloading.
; SetDefaultDisplayProperties() :
; SetDisplayProperties( ERenderStyle NewStyle, [[Legacy:Material|Material]] NewTexture, bool bLighting ) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a Pawn's weapon) or to adjust the result based on other factors (such as a Pawn's other inventory wanting to affect the result).
; SetGRI( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI ) :
; SetInitialState() [simulated, event] : Called after PostBeginPlay. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; SetOverlayMaterial( [[Legacy:Material|Material]] mat, float time, bool bOverride ) [simulated] :
; StartInterpolation() [simulated] : when this function is called, the actor will start moving along an interpolation path beginning at Dest.
; String GetHumanReadableName() [simulated] : Returns the human readable string representation of an object.
; String GetItemName( string FullName ) : Returns the string representation of the name of an object without the package prefixes.
; String GetLocalString( optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2 ) [static] : Get localized message string associated with this actor.
; TravelPostAccept() [event] : Called when carried into a new level, after AcceptInventory.
; TravelPreAccept() [event] : Called when carried onto a new level, before AcceptInventory.
; TriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Trigger an [[Legacy:Event|event]]
; UntriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Untrigger an event (is this an event? if not, why?)
; UpdatePrecacheMaterials() [simulated] :
; UpdatePrecacheStaticMeshes() [simulated] :
; bool CanSplash() : return True in this function if the actor should make splashies
; bool EffectIsRelevant( vector SpawnLocation, bool bForceDedicated ) [simulated] :
; bool IsInPain() : Returns true if the actor is inside a [[Legacy:PhysicsVolume|PhysicsVolume]] that can cause pain.
; bool IsInVolume( [[Legacy:Volume|Volume]] aVolume ) : Returns true if the actor is inside the volume ''Volume''.
; bool NearSpot(vector Spot) [simulated, final] : returns true is spot is within collision cylinder.
; bool TouchingActor( [[Legacy:Actor|Actor]] A ) [simulated, final] : Returns true if the collision cylinders of the calling actor and the actor ''A'' overlap. 
; string GetDebugName() :
; vector GetCollisionExtent() :

'''MythOpus:''' Do you think we could add some documentation on how to get these functions to work?

'''MythOpus:''' Since there are various functions only available for certain games on this page, I suggest we page different pages for each seperate game for methods.

'''Tarquin:''' Good idea

'''MythOpus:''' Thanks :)

'''EricBlade:''' Couple things.  I did make a [[Legacy:Land Of The Dead|Land of the Dead]] page to root for that game, I hope that's acceptable.  I'm not sure if I should detail only the changes from the 2k3 Actor there, or keep the whole thing?   Second thing, the recent note on PlayerCanSeeMe() notes that bHidden makes it fail all the time, which was something that boggled my mind for a while.  So, if I wanted to make something that was invisible, but used this call, I could say, SetDrawType(DT_NONE); bHidden=False; and that would cause PlayerCanSeeMe() to work?  One last one.. I see &quot;KRemoveAllBoneLifters&quot; says &quot;used to limit ragdolls&quot; .. how is it used to do that? what does it do?

'''EricBlade:''' I actually just got to testing that, setting DrawType=DT_NONE and bHidden=False will cause PlayerCanSeeMe() to work for invisible actors. \o/

'''Xian:''' Sounds accurate. DT_None doesn't make the object disappear, but just to not render. bHidden does that. I also noticed a lot of funcs here are missing descriptions, although the UE1 pages (namely UT) have them. Think I'll get busy tomorrow :)

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Sounds|Sounds]]

----

[[:Category:Legacy To Do]] : Still needs work... lots to document, the functions need to be better organized into groups, and then it can all be broken up into sub-pages by group.  Some initial groups... rendering, movement, collision, physics, etc.
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1169</id>
      <timestamp>2007-09-01T18:26:41Z</timestamp>
      <contributor>
        <ip>Home-001511.b.astral.ro</ip>
      </contributor>
      <comment>Comments on Eric and the functions</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Methods)}}

==Uncategorized ==

; string ConsoleCommand( string Command ) [native] : Execute a console command in the context of the current level and game engine. See [[Legacy:Console Commands|console commands]].

; Error( coerce string S ) [native, final] : Handle an error and kill this one actor.

; Sleep( float Seconds ) [native, final, latent] : See [[Legacy:Latent Function|latent function]].

==Collision ==

; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) [native, final] : Sets bCollideActors, bBlockActors and bBlockPlayers to the values given by the parameters. bBlockPlayers is obsolete.

; bool SetCollisionSize( float NewRadius, float NewHeight ) [native, final] : Sets CollisionRadius and CollisionHeight to the values given by the parameters.

==Drawing ==

As their names suggest, these functions set the corresponding properties, which can't be changed directly since they are declared as const.

; SetDrawScale( float NewScale ) [native, final]
; SetDrawScale3D( vector NewScale3D ) [native, final]
; SetStaticMesh( [[Legacy:StaticMesh|StaticMesh]] NewStaticMesh ) [native, final]
; SetDrawType( EDrawType NewDrawType ) [native, final]

==Movement ==

; bool Move( vector Delta ) [native, final] : Like SetLocation but parameter is used relative to current location.

; bool SetLocation( vector NewLocation ) [native, final] : This function sets the location of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. If the actor cannot occupy the new location because it is colliding with an actor that can block it, it will be placed at the nearest valid location. Note that because [[Legacy:Terrain|Terrain]] has no &quot;volume&quot; and is just a bent up sheet, the actor may not be moved in this manner when it penetrates [[Legacy:Terrain|terrain]].

; bool SetRotation( rotator NewRotation ) [native, final] :  This function sets the rotation of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. Does this relocate actors with more complex collision hulls if their new rotation causes them to penetrate an actor that can block them?

; bool SetRelativeRotation( rotator NewRotation ) [native, final] : Sets the rotation relative to the actor's base.

; bool SetRelativeLocation( vector NewLocation ) [native, final] : Sets the rotation reletive to the actor's base.

; bool MoveSmooth( vector Delta ) [native, final] :

; AutonomousPhysics( float DeltaSeconds ) [native, final] :

==Relations ==

; SetBase( [[Legacy:Actor|Actor]] NewBase, optional vector NewFloor ) [native, final] : Sets the actor's new base. NewFloor is the optional new floor normal (default is vect(0,0,1)) and it is only used for classes inherited from [[Legacy:Pawn|Pawn]].

; SetOwner( [[Legacy:Actor|Actor]] NewOwner ) [native, final] : Sets the actor's new owner.

==Animation ==

; string GetMeshName() [native, final] : 

; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Plays one of the animation sequences available for the actor's mesh. Rate is the relative playback speed of the animation sequence. TweenTime is the amount of game time the current animation frame is crossfaded to the start frame of the new animation before the animation sequence actually starts. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Same as PlayAnim, except that the animation sequence is restarted after it finished. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool TweenAnim( name Sequence, float Time, optional int Channel ) [native, final] : Crossfades from the current animation frame to the first frame of the specified animation sequence. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool IsAnimating(optional int Channel) [native, final] : Returns whether there's an animation playing in the specified channel.

; FinishAnim(optional int Channel) [native, final, latent] : A [[Legacy:Latent Function|latent function]] which returns when the animation sequence in the specified channel has reached its last frame.

; bool HasAnim( name Sequence ) [native, final] : Returns whether the actor's current mesh has an animation sequence with the specified name.

; StopAnimating( optional bool ClearAllButBase ) [native, final] : Immediately stops the animation(s) the actor is currently playing. ''(What does ClearAllButBase do?)'' [[:Category:Legacy Answer Needed]]

; FreezeAnimAt( float Time, optional int Channel) [native, final] : Freezes the specified channel's animation. ''(How exactly does this work?)'' [[:Category:Legacy Answer Needed]]

; SetAnimFrame( float Time, optional int Channel, optional int UnitFlag ) [native, final] : Sets an animation in a certain channel to the specified time index. If the UnitFlag is 0 then the time value ranges from 0 to 1, 1 being the end of the animation (last frame) and 0 being the beginning (first frame). If the UnitFlag is 1 then the time is the frame that you want it to go to.

; bool IsTweening(int Channel) [native, final] : Returns whether the specified channel is currently fading in (tweening to) a new animation sequence.

; AnimStopLooping(optional int Channel) [native, final] : Prevents an animation sequence from starting over by itself once it has reached its last frame.

===Animation Notifications ===

; AnimEnd( int Channel ) [event] : Notification that the current animation has ended.  Allows an object to wait for animation completion before proceeding with other activities.

; EnableChannelNotify ( int Channel, int Switch ) [native, final] :

; int GetNotifyChannel() [native, final] :

===Skeletal Animation ===

; LinkSkelAnim( [[Legacy:MeshAnimation|MeshAnimation]] Anim, optional [[Legacy:Mesh|Mesh]] NewMesh ) [simulated, native, final] : Links a new animation set and mesh to the actor.

; LinkMesh( [[Legacy:Mesh|Mesh]] NewMesh, optional bool bKeepAnim ) [simulated, native, final] : Loads a new [[Legacy:Mesh|mesh]] for the actor and optionally keeps the animation set of the previous mesh.

; BoneRefresh() [native, final] : Updates the bone coords.

; AnimBlendParams( int Stage, optional float BlendAlpha, optional float InTime, optional float OutTime, optional name BoneName, optional bool bGlobalPose) [native, final] : See [[udn2:SkeletalBlending]].

; AnimBlendToAlpha( int Stage, float TargetAlpha, float TimeInterval ) [native, final] :

; coords GetBoneCoords( name BoneName ) [native, final] :

; rotator GetBoneRotation( name BoneName, optional int Space ) [native, final] :

; vector GetRootLocation() [native, final] :

; rotator GetRootRotation() [native, final] :

; vector GetRootLocationDelta() [native, final] :

; rotator GetRootRotationDelta() [native, final] :

; bool AttachToBone( [[Legacy:Actor|Actor]] Attachment, name BoneName ) [native, final] : Attaches the actor to the bone/socket alias using the attachment offset/rotation defined within the socket.

; bool DetachFromBone( [[Legacy:Actor|Actor]] Attachment ) [native, final] :

; LockRootMotion( int Lock ) [native, final] :

; SetBoneScale( int Slot, optional float BoneScale, optional name BoneName ) [native, final] : Scales the specified bone, overriding any other bone scaling associated with the specified slot. Not sure of the rationale in exposing the slots.

; SetBoneDirection( name BoneName, rotator BoneTurn, optional vector BoneTrans, optional float Alpha, optional int Space ) [native, final] :

; SetBoneLocation( name BoneName, optional vector BoneTrans, optional float Alpha ) [native, final] :

; SetBoneRotation( name BoneName, optional rotator BoneTurn, optional int Space, optional float Alpha ) [native, final, simulated] :

; GetAnimParams( int Channel, out name OutSeqName, out float OutAnimFrame, out float OutAnimRate ) [native, final] :

; bool AnimIsInGroup( int Channel, name GroupName ) [native, final] :

; Name GetClosestBone( Vector loc, Vector ray, out float boneDist, optional Name BiasBone, optional float BiasDistance ) [native, final] : Returns the closest socket alias, not the bone (UT2004).

==URLs==

; UpdateURL( String NewOption, String NewValue, bool bSaveDefault ) [native, final] : Updates an URL option and optionally saves it as default URL option.

; string GetUrlOption( String Option ) [native, final] : Returns the value of an URL option.

==Rendering ==

; plane GetRenderBoundingSphere() [native, final] : Returns a plane struct which represents a sphere surrounding the actor. (X, Y, Z represent the center, W the radius)

; DrawDebugLine( vector LineStart, vector LineEnd, byte R, byte G, byte B) [native, final] : SLOW! Use for debugging only!

==Physics ==

; DebugClock() [native, final] :

; DebugUnclock() [native, final] :

; FinishInterpolation() [native, final, latent] : [[Legacy:Latent Function|Latent function]], which returns when the actor has finished following its assigned interpolation path.

; SetPhysics( EPhysics newPhysics ) [native, final] : Sets a new physics mode.

; OnlyAffectPawns( bool B ) [native, final] :

===Karma ===

Note that SimParams take affect until you quit the game! Make sure you reset them to defaults when leaving your mod etc.

; KGetSimParams( out KSimParams SimParams ) [native, final] :

; KSetSimParams( KSimParams SimParams ) [native, final] :

; quat KGetRBQuaternion() [native, final] :

; KGetRigidBodyState( out KRigidBodyState RBstate ) [native, final] : Returns the current Karma state of the actor in the RBstate variable

; KDrawRigidBodyState( KRigidBodyState RBState, bool AltColour ) [native, final] : SLOW! Use for debugging only!

; vector KRBVecToVector( KRBVec RBvec ) [native, final] : Returns a vector created from the Karma KRBVec

; KRBVec KRBVecFromVector( vector v ) [native, final] : Returns a Karma KBBVec created from the regular Unreal vector

; KSetMass( float mass ) [native, final] : Sets the Karma KMass property of an Actor

; float KGetMass() [native, final] : Returns the Karma KMass

; KSetInertiaTensor( vector it1, vector it2 ) [native, final] : Set inertia tensor assuming a mass of 1. Scaled by mass internally to calculate actual inertia tensor.

; KGetInertiaTensor( out vector it1, out vector it2 ) [native, final] :

; KSetDampingProps( float lindamp, float angdamp ) [native, final] :

; KGetDampingProps( out float lindamp, out float angdamp ) [native, final] :

; KSetFriction( float friction ) [native, final] : Sets the Karma Friction property

; float KGetFriction() [native, final] : Returns the Karma Friction property

; KSetRestitution( float rest ) [native, final] : Sets the Karma Restitution (Bounciness) property

; float KGetRestitution() [native, final] : Returns the Karma Restitution property

; KSetCOMOffset( vector offset ) [native, final] :

; KGetCOMOffset( out vector offset ) [native, final] :

; KGetCOMPosition( out vector pos ) [native, final] : Get actual position of actors COM in world space.

; KSetImpactThreshold( float thresh ) [native, final] : Sets the threshold for velocity at which a moving Karma actor must strike something before it's KImpact() event is called

; float KGetImpactThreshold() [native, final] : Returns the Impact Threshhold

; KWake() [native, final] : Begins Karma simulation

; bool KIsAwake() [native, final] : Returns true if Karma is simulating for this Actor

; KAddImpulse( vector Impulse, vector Position, optional name BoneName ) [native, final] : Adds a Karma impulse to the actor from Position, applying to BoneName

; KSetStayUpright( bool stayUpright, bool allowRotate ) [native, final] : Sets the KStayUpright poperty

; KSetBlockKarma( bool newBlock ) [native, final] : Sets the actor to block Karma

; KSetActorGravScale( float ActorGravScale ) [native, final] : Sets the Karma GravScale

; float KGetActorGravScale() [native, final] : Returns the Karma GravScale

; KDisableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Disable Karma contact generation between this actor, and another actor.  Collision is on by default.

; KEnableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Enable Karma contact generation between this actor, and another actor.  Collision is on by default.

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

===Karma Ragdoll ===

; KSetSkelVel( vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ) [native, final] :

; float KGetSkelMass() [native, final] :

; KFreezeRagdoll() [native, final] :

; KAddBoneLifter( name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ) [native, final] : Note you MUST turn collision off (KSetBlockKarma) before using bone lifters!

; KRemoveLifterFromBone( name BoneName ) [native, final] : 

; KRemoveAllBoneLifters() [native, final] : Used for only allowing a fixed maximum number of ragdolls in action.

; KMakeRagdollAvailable() [native, final] :

; bool KIsRagdollAvailable() [native, final] :

===Karma Events===

; KImpact( [[Legacy:Actor|Actor]] other, vector pos, vector impactVel, vector impactNorm) [event] : called when [[Legacy:Karma|Karma]] actor hits with impact velocity over KImpactThreshold 

; KVelDropBelow() [event] : called when karma actor's velocity drops below KVelDropBelowThreshold

; KSkelConvulse() [event] : called when a ragdoll convulses (see KarmaParamsSkel)

; KApplyForce( out vector Force, out vector Torque ) [event] : called just before sim to allow user to apply force (location movement) and torque (rotation movement) to the actor.  You should ONLY put numbers into Force and Torque during this event!!!!

; bool KUpdateState(out KRigidBodyState newState) [event] : This is called from inside C++ Karma physics code at the appropriate time to update state of Karma rigid body. If you return true, newState will be set into the rigid body. Return false and it will do nothing.&lt;br /&gt;It seems this is only called on subclasses of [[Legacy:KActor|KActor]], [[Legacy:KVehicle|KVehicle]] and [[Legacy:SVehicle|SVehicle]].

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

==Optimization==

; Clock( out float time ) [native, final] : This is called at the beginning of a section of code to be timed.  The variable time does not need to be initialized.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; UnClock( out float time ) [native, final] :  This is called at the end of a section of code to be timed passing in the same time variable supplied to Clock.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; CyclesToSeconds( int cycles) [native, final] : Available for Deus Ex. Converts the cycles created by Clock/UnClock to seconds.

==Timing ==

; SetTimer( float NewTimerRate, bool bLoop ) [native, final] : Causes Timer() events every NewTimerRate seconds. If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer. Actors with bStatic true do not get ticked, and as such the timer will not function if bStatic is true.

==Music ==

; int PlayMusic( string Song, float FadeInTime ) [native, final] : Plays a song name, given a FadeInTime, returns a SongHandle.

; StopMusic( int SongHandle, float FadeOutTime ) [native, final] : Stops the specified SongHandle (as given to you by PlayMusic)

; StopAllMusic( float FadeOutTime ) [native, final] : Stops all music

==Engine notification functions ==

; Destroyed() [event] : called when an actor is destroyed. See [[Legacy:Destroying Objects|Destroying Objects]].

; GainedChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor sets this actor as its Owner through SetOwner() or Spawn().

; LostChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor is no longer owned by this actor. Ownership was changed through SetOwner() or the other actor was destroyed.

; Tick( float DeltaTime ) [event] : Called when time passes if this actor isn't bStatic. ''DeltaTime'' is the time in seconds that has passed since the last tick. Child actors are ticket after their owners have been ticked. Temporarily toggle with Enable('Tick'), Disable('Tick'). See [[Legacy:Probe Function|Probe Function]].

; Timer() [event] : When a timer has been started with SetTimer(), this function is executed when the amount of time that was specified in SetTimer has passed. Like Tick() this event will only be called when the actor is not static and has not been disabled via Disable('Timer'). See [[Legacy:Probe Function|Probe Function]].

; PostNetReceive() [event] : If bNetNotify is True, this event is called when the actor receives an update to any variable through replication. See [[Legacy:Replication|Replication]].

; TornOff() [event] : Networking - called on client when actor is torn off. (bTearOff==true)

===Triggers ===

; Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is triggered.

; UnTrigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is untriggered.

; BeginEvent() [event] :

; EndEvent() [event] :

===Physics &amp; world interaction ===

; HitWall( vector HitNormal, [[Legacy:Actor|Actor]] HitWall ) [event] : Called when the actor can collide with world geometry and just hit a wall.

; Falling() [event] : Called with PHYS_Falling when the actor starts to fall.

; Landed( vector HitNormal ) [event] : Called when the actor is no longer falling. If you want to receive HitWall() instead of Landed() set bBounce=True.

; ZoneChange( [[Legacy:ZoneInfo|ZoneInfo]] NewZone ) [event] : Called when the actor's zone is about to change to NewZone.

; PhysicsVolumeChange( [[Legacy:PhysicsVolume|PhysicsVolume]] NewVolume ) [event] : Called when the actor's PhysicsVolume is about to change to NewVolume.

; Touch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull is touching another actor's collision hull.

; PostTouch( [[Legacy:Actor|Actor]] Other ) [event] : called for PendingTouch actor after physics completes

; UnTouch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull no longer touches another actor's collision hull.

; Bump( [[Legacy:Actor|Actor]] Other ) [event] :

; BaseChange() [event] : Called when the actor's base has changed.

; Attach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that another actor ''Other'' has been attached to it.

; Detach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that a previously attached actor ''Other'' has been detached from it.

; Actor SpecialHandling( [[Legacy:Pawn|Pawn]] Other) [event] :

; bool EncroachingOn( [[Legacy:Actor|Actor]] Other ) [event] : Called when this actor's collision hull intersects a blocking actor's collision hull. Returns whether this actor is &quot;encroaching&quot; on the other actor.

; EncroachedBy( [[Legacy:Actor|Actor]] Other ) [event] : When another actor has determined that it &quot;encroaches&quot; this actor, this event is called.

; FinishedInterpolation() [event] : The actor has finished folowing its assigned interpolation path.

; EndedRotation() [event] : Called when rotation completes.

; UsedBy( [[Legacy:Pawn|Pawn]] user ) [event] : Called if this Actor was touching a Pawn who pressed Use.

; FellOutOfWorld( eKillZType KillType ) [simulated, event] : Called when the actor fell below the current zone's KillZ height. By default this sets physics to none and destroys the actor.

; [[Legacy:Actor|Actor]] Trace( out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActors, optional vector Extent, optional out [[Legacy:Material|Material]] Material ) [native, final] : This traces a path to find what it collides with first. The line will be traced starting at TraceStart and ending at TraceEnd. If bTraceActors is true, actors will be considered for the tracing, otherwise only pieces of the world (terrain, staticmeshactors, BSP) will be considered for collision. When the trace hits something, HitLocation and HitNormal will be set to contain the location and normal of the impact. If specified, the material of the surface hit can also be returned. If an Extent is specified, you can have the trace have &quot;width.&quot; It will have a box of the size specified as a vector (corner to corner) as the &quot;thickness&quot; of the trace. Note that traces are not very fast, so should be avoided or kept to a minimum where possible. Note that if you want actors to be considered for traces they must be able to block the trace, either by bCollideActors, or easier with bBlockZeroExtentTraces or bBlockNonZeroExtentTraces if your trace uses extents. See [[Legacy:Trace|Trace]] for more.

'''Foxpaw:''' Can someone elaborate on the extents of a trace? Specifically, is the box aligned on the world axes or along the trace? IE, does the X of the extents point &quot;foreward&quot; along the trace, with Y and Z perpindicular to the trace, or do they define a box in the world coordinate system that gets &quot;dragged along&quot; the length of the trace?

'''Foxpaw:''' Tracing doesn't seem to interact properly with terrain if you use extents. I have been able to get zero extent traces to hit terrain, but not extent traces.

'''Devi:''' In theory the extent vector gets interpreted as a world aligned rectangular prism when doing Terrain checks, when it's testing versus actors it gets interpreted as a vertical cylinder. The cylinder collision type can go a bit weird if the X and Y values in the extent vector don't match...

; bool FastTrace( vector TraceEnd, optional vector TraceStart ) [native, final] : Similar to trace. Returns true if there is a clear path between the two points, false if the trace is blocked by world geometry. It will pass right through anything that is not set as world geometry.

; [[Legacy:Actor|Actor]] Spawn( class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation ) [native, final] : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location. See [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]].

; bool Destroy() [native, final] : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick. See [[Legacy:Destroying Objects|Destroying Objects]].

===Damage &amp; Kills ===

; KilledBy( [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : This actor was &quot;killed&quot; by a [[Legacy:Pawn|Pawn]].

; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] EventInstigator, vector HitLocation, vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) [event] : Called when the actor is taking damage.

==Sound ==

; PlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, final] : Play a sound effect. If called from a simulated function or on a client, the sound is propagated only to the local player, i.e. only he will hear the sound. If called from a non-simulated function on the server, the sound is propagated to all players. (They will hear it as long as they are in range.)

; PlayOwnedSound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, final] : Play a sound effect. On clients this is function behaves identical to PlaySound. If called on the server the sound os propagated to all players but the remote owner. It will be propagated to a local owner, though.

; DemoPlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, event] :

; float GetSoundDuration( [[Legacy:Sound|Sound]] Sound ) [native, final] : Get a sound duration in seconds. (not affected by Level.TimeDilation)

==Force Feedback ==

; PlayFeedbackEffect( String EffectName ) [native, final] :

; StopFeedbackEffect( optional String EffectName ) [native, final] : Pass no parameter or &quot;&quot; to stop all.

; bool ForceFeedbackSupported( optional bool Enable ) [native, final] :

==AI ==

; MakeNoise( float Loudness ) [native, final] : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an instigator if they are not pawns. The noise is blocked by walls (only tested BSP, not SM)

'''Foxpaw:''' This probrably does a &quot;FastTrace&quot; and will be blocked by any object that is set as being world geometry. I haven't tested that either though.

'''Wormbo:''' It's not simply a trace. it also takes into account that noise travels around corners etc. by doing path ([[Legacy:NavigationPoint|NavigationPoint]].bPropagatesSound) and zone checks.

; bool PlayerCanSeeMe() [native, final] : Returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location.  '''Note:''' If the Actor in question is set to bHidden=True, this will always return false.

; vector SuggestFallVelocity( vector Destination, vector Start, float MaxZ, float MaxXYSpeed ) [native, final] :

==??? ==

; bool PreTeleport( [[Legacy:Teleporter|Teleporter]] InTeleporter ) [event] : Called when an actor is about to be moved by a teleporter

; PostTeleport( [[Legacy:Teleporter|Teleporter]] OutTeleporter ) [event] : Called when an actor exits a teleporter

==Disk access ==

; string GetMapName( string NameEnding, string MapName, int Dir ) [native, final] : 

; GetNextSkin( string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ) [native, final] :

; string GetURLMap() [native, final] :

; string GetNextInt( string ClassName, int Num ) [native, final] :

; GetNextIntDesc( string ClassName, int Num, out string Entry, out string Description ) [native, final] :

; bool GetCacheEntry( int Num, out string GUID, out string Filename ) [native, final] :

; bool MoveCacheEntry( string GUID, optional string NewFilename ) [native, final] :

==Iterator functions ==

[[Legacy:Iterator|Iterator]] functions for dealing with sets of actors.

; AllActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Avoid using AllActors() too often as it iterates through the whole actor list and is therefore slow.

; DynamicActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Only iterates through the non-static actors on the list (still relatively slow, but much better than AllActors).  This should be used in most cases and replaces AllActors in most of Epic's game code.

; ChildActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors owned by this actor.  Slow like AllActors().

; BasedActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors based on the current actor (slow, like AllActors).

; TouchingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors touching the current actor (fast). Actors that are attached are ignored.

; TraceActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) [native, final, iterator] : TraceActors() return all actors along a traced line.  Reasonably fast (like any trace).

; RadiusActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns all actors within a give radius.  Slow like AllActors().  Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible (not bHidden) and in the collision hash (bCollideActors is true).

; VisibleActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc ) [native, final, iterator] : Returns all visible actors within a radius.  Slow like AllActors().  Use VisibleCollidingActors() instead if desired actor types are in the collision hash (bCollideActors is true).

; VisibleCollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden ) [native, final, iterator] : VisibleCollidingActors() returns visible (not bHidden) colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() since it uses the collision hash.

; CollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() for reasonably small radii since it uses the collision hash.

==Scripted Actor functions ==
; BecomeViewTarget() : Called by PlayerController when this actor becomes its ViewTarget.
; BroadcastLocalizedMessage( class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; MessageClass, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) [event] : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The LocalMessage class defines how the PRI's and optional actor are used.

; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) [simulated] : lists important actor variable on canvas.  HUD will call DisplayDebug() on the current ViewTarget when the ShowDebug exec is used.
; HurtRadius( float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation ) [simulated, final] : Hurt locally authoritative actors within the radius.
; MatchStarting() : Called when gameplay actually starts.
; PlayTeleportEffect( bool bOut, bool bSound ) :

; PreBeginPlay() [event] : Called immediately before gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; BeginPlay() [event] : Called when gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostBeginPlay() [event] : Called immediately after gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostNetBeginPlay() [event] : called after PostBeginPlay.  On a net client, PostNetBeginPlay() is spawned after replicated variables have been initialized to their replicated values. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].

; RenderOverlays( [[Legacy:Canvas|Canvas]] Canvas ) : Called by player's hud to request drawing of actor-specific overlays onto canvas. Called every frame. Whatever is drawn on the canvas here only lasts for the current frame.&lt;br /&gt;'''Note:''' This function has to be called explicitly by another canvas drawing function, it's ''not'' called automatically for all actors.
; RenderTexture( [[Legacy:ScriptedTexture|ScriptedTexture]] Tex ) [event] :
; ReplaceText( out string Text, string Replace, string With ) [final] :
; Reset() : Reset actor to initial state - used when restarting level without reloading.
; SetDefaultDisplayProperties() :
; SetDisplayProperties( ERenderStyle NewStyle, [[Legacy:Material|Material]] NewTexture, bool bLighting ) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a Pawn's weapon) or to adjust the result based on other factors (such as a Pawn's other inventory wanting to affect the result).
; SetGRI( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI ) :
; SetInitialState() [simulated, event] : Called after PostBeginPlay. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; SetOverlayMaterial( [[Legacy:Material|Material]] mat, float time, bool bOverride ) [simulated] :
; StartInterpolation() [simulated] : when this function is called, the actor will start moving along an interpolation path beginning at Dest.
; String GetHumanReadableName() [simulated] : Returns the human readable string representation of an object.
; String GetItemName( string FullName ) : Returns the string representation of the name of an object without the package prefixes.
; String GetLocalString( optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2 ) [static] : Get localized message string associated with this actor.
; TravelPostAccept() [event] : Called when carried into a new level, after AcceptInventory.
; TravelPreAccept() [event] : Called when carried onto a new level, before AcceptInventory.
; TriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Trigger an [[Legacy:Event|event]]
; UntriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Untrigger an event (is this an event? if not, why?)
; UpdatePrecacheMaterials() [simulated] :
; UpdatePrecacheStaticMeshes() [simulated] :
; bool CanSplash() : return True in this function if the actor should make splashies
; bool EffectIsRelevant( vector SpawnLocation, bool bForceDedicated ) [simulated] :
; bool IsInPain() : Returns true if the actor is inside a [[Legacy:PhysicsVolume|PhysicsVolume]] that can cause pain.
; bool IsInVolume( [[Legacy:Volume|Volume]] aVolume ) : Returns true if the actor is inside the volume ''Volume''.
; bool NearSpot(vector Spot) [simulated, final] : returns true is spot is within collision cylinder.
; bool TouchingActor( [[Legacy:Actor|Actor]] A ) [simulated, final] : Returns true if the collision cylinders of the calling actor and the actor ''A'' overlap. 
; string GetDebugName() :
; vector GetCollisionExtent() :

'''MythOpus:''' Do you think we could add some documentation on how to get these functions to work?

'''MythOpus:''' Since there are various functions only available for certain games on this page, I suggest we page different pages for each seperate game for methods.

'''Tarquin:''' Good idea

'''MythOpus:''' Thanks :)

'''EricBlade:''' Couple things.  I did make a [[Legacy:Land Of The Dead|Land of the Dead]] page to root for that game, I hope that's acceptable.  I'm not sure if I should detail only the changes from the 2k3 Actor there, or keep the whole thing?   Second thing, the recent note on PlayerCanSeeMe() notes that bHidden makes it fail all the time, which was something that boggled my mind for a while.  So, if I wanted to make something that was invisible, but used this call, I could say, SetDrawType(DT_NONE); bHidden=False; and that would cause PlayerCanSeeMe() to work?  One last one.. I see &quot;KRemoveAllBoneLifters&quot; says &quot;used to limit ragdolls&quot; .. how is it used to do that? what does it do?

'''EricBlade:''' I actually just got to testing that, setting DrawType=DT_NONE and bHidden=False will cause PlayerCanSeeMe() to work for invisible actors. \o/

'''Xian:''' Sounds accurate. DT_None doesn't make the object disappear, but just to not render. bHidden does that. I also noticed a lot of funcs here are missing descriptions, although the UE1 pages (namely UT) have them. Think I'll get busy tomorrow :)

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Sounds|Sounds]]

----

[[:Category:Legacy To Do]] : Still needs work... lots to document, the functions need to be better organized into groups, and then it can all be broken up into sub-pages by group.  Some initial groups... rendering, movement, collision, physics, etc.
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33985</id>
      <timestamp>2009-02-05T10:17:40Z</timestamp>
      <contributor>
        <ip>217.91.34.219</ip>
      </contributor>
      <comment>/* Sound */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Methods)}}

==Uncategorized ==

; string ConsoleCommand( string Command ) [native] : Execute a console command in the context of the current level and game engine. See [[Legacy:Console Commands|console commands]].

; Error( coerce string S ) [native, final] : Handle an error and kill this one actor.

; Sleep( float Seconds ) [native, final, latent] : See [[Legacy:Latent Function|latent function]].

==Collision ==

; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) [native, final] : Sets bCollideActors, bBlockActors and bBlockPlayers to the values given by the parameters. bBlockPlayers is obsolete.

; bool SetCollisionSize( float NewRadius, float NewHeight ) [native, final] : Sets CollisionRadius and CollisionHeight to the values given by the parameters.

==Drawing ==

As their names suggest, these functions set the corresponding properties, which can't be changed directly since they are declared as const.

; SetDrawScale( float NewScale ) [native, final]
; SetDrawScale3D( vector NewScale3D ) [native, final]
; SetStaticMesh( [[Legacy:StaticMesh|StaticMesh]] NewStaticMesh ) [native, final]
; SetDrawType( EDrawType NewDrawType ) [native, final]

==Movement ==

; bool Move( vector Delta ) [native, final] : Like SetLocation but parameter is used relative to current location.

; bool SetLocation( vector NewLocation ) [native, final] : This function sets the location of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. If the actor cannot occupy the new location because it is colliding with an actor that can block it, it will be placed at the nearest valid location. Note that because [[Legacy:Terrain|Terrain]] has no &quot;volume&quot; and is just a bent up sheet, the actor may not be moved in this manner when it penetrates [[Legacy:Terrain|terrain]].

; bool SetRotation( rotator NewRotation ) [native, final] :  This function sets the rotation of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. Does this relocate actors with more complex collision hulls if their new rotation causes them to penetrate an actor that can block them?

; bool SetRelativeRotation( rotator NewRotation ) [native, final] : Sets the rotation relative to the actor's base.

; bool SetRelativeLocation( vector NewLocation ) [native, final] : Sets the rotation reletive to the actor's base.

; bool MoveSmooth( vector Delta ) [native, final] :

; AutonomousPhysics( float DeltaSeconds ) [native, final] :

==Relations ==

; SetBase( [[Legacy:Actor|Actor]] NewBase, optional vector NewFloor ) [native, final] : Sets the actor's new base. NewFloor is the optional new floor normal (default is vect(0,0,1)) and it is only used for classes inherited from [[Legacy:Pawn|Pawn]].

; SetOwner( [[Legacy:Actor|Actor]] NewOwner ) [native, final] : Sets the actor's new owner.

==Animation ==

; string GetMeshName() [native, final] : 

; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Plays one of the animation sequences available for the actor's mesh. Rate is the relative playback speed of the animation sequence. TweenTime is the amount of game time the current animation frame is crossfaded to the start frame of the new animation before the animation sequence actually starts. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Same as PlayAnim, except that the animation sequence is restarted after it finished. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool TweenAnim( name Sequence, float Time, optional int Channel ) [native, final] : Crossfades from the current animation frame to the first frame of the specified animation sequence. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool IsAnimating(optional int Channel) [native, final] : Returns whether there's an animation playing in the specified channel.

; FinishAnim(optional int Channel) [native, final, latent] : A [[Legacy:Latent Function|latent function]] which returns when the animation sequence in the specified channel has reached its last frame.

; bool HasAnim( name Sequence ) [native, final] : Returns whether the actor's current mesh has an animation sequence with the specified name.

; StopAnimating( optional bool ClearAllButBase ) [native, final] : Immediately stops the animation(s) the actor is currently playing. ''(What does ClearAllButBase do?)'' [[:Category:Legacy Answer Needed]]

; FreezeAnimAt( float Time, optional int Channel) [native, final] : Freezes the specified channel's animation. ''(How exactly does this work?)'' [[:Category:Legacy Answer Needed]]

; SetAnimFrame( float Time, optional int Channel, optional int UnitFlag ) [native, final] : Sets an animation in a certain channel to the specified time index. If the UnitFlag is 0 then the time value ranges from 0 to 1, 1 being the end of the animation (last frame) and 0 being the beginning (first frame). If the UnitFlag is 1 then the time is the frame that you want it to go to.

; bool IsTweening(int Channel) [native, final] : Returns whether the specified channel is currently fading in (tweening to) a new animation sequence.

; AnimStopLooping(optional int Channel) [native, final] : Prevents an animation sequence from starting over by itself once it has reached its last frame.

===Animation Notifications ===

; AnimEnd( int Channel ) [event] : Notification that the current animation has ended.  Allows an object to wait for animation completion before proceeding with other activities.

; EnableChannelNotify ( int Channel, int Switch ) [native, final] :

; int GetNotifyChannel() [native, final] :

===Skeletal Animation ===

; LinkSkelAnim( [[Legacy:MeshAnimation|MeshAnimation]] Anim, optional [[Legacy:Mesh|Mesh]] NewMesh ) [simulated, native, final] : Links a new animation set and mesh to the actor.

; LinkMesh( [[Legacy:Mesh|Mesh]] NewMesh, optional bool bKeepAnim ) [simulated, native, final] : Loads a new [[Legacy:Mesh|mesh]] for the actor and optionally keeps the animation set of the previous mesh.

----

LinkMesh note&gt; vaptor: seems in 2004 and 2003 for subclassed xpawns link mesh won't work cause theres a undocumented native function that changes the set mesh in net mode to the default character mesh each tick the only work around is to stop replicateing player replication info by seting it to role_none but thats not a good solution either cause it tends cause the actor to not be useable for playercontrollers.

----

; BoneRefresh() [native, final] : Updates the bone coords.

; AnimBlendParams( int Stage, optional float BlendAlpha, optional float InTime, optional float OutTime, optional name BoneName, optional bool bGlobalPose) [native, final] : See [[udn2:SkeletalBlending]].

; AnimBlendToAlpha( int Stage, float TargetAlpha, float TimeInterval ) [native, final] :

; coords GetBoneCoords( name BoneName ) [native, final] :

; rotator GetBoneRotation( name BoneName, optional int Space ) [native, final] :

; vector GetRootLocation() [native, final] :

; rotator GetRootRotation() [native, final] :

; vector GetRootLocationDelta() [native, final] :

; rotator GetRootRotationDelta() [native, final] :

; bool AttachToBone( [[Legacy:Actor|Actor]] Attachment, name BoneName ) [native, final] : Attaches the actor to the bone/socket alias using the attachment offset/rotation defined within the socket.

; bool DetachFromBone( [[Legacy:Actor|Actor]] Attachment ) [native, final] :

; LockRootMotion( int Lock ) [native, final] :

; SetBoneScale( int Slot, optional float BoneScale, optional name BoneName ) [native, final] : Scales the specified bone, overriding any other bone scaling associated with the specified slot. Not sure of the rationale in exposing the slots.

; SetBoneDirection( name BoneName, rotator BoneTurn, optional vector BoneTrans, optional float Alpha, optional int Space ) [native, final] :

; SetBoneLocation( name BoneName, optional vector BoneTrans, optional float Alpha ) [native, final] :

; SetBoneRotation( name BoneName, optional rotator BoneTurn, optional int Space, optional float Alpha ) [native, final, simulated] :

; GetAnimParams( int Channel, out name OutSeqName, out float OutAnimFrame, out float OutAnimRate ) [native, final] :

; bool AnimIsInGroup( int Channel, name GroupName ) [native, final] :

; Name GetClosestBone( Vector loc, Vector ray, out float boneDist, optional Name BiasBone, optional float BiasDistance ) [native, final] : Returns the closest socket alias, not the bone (UT2004).

==URLs==

; UpdateURL( String NewOption, String NewValue, bool bSaveDefault ) [native, final] : Updates an URL option and optionally saves it as default URL option.

; string GetUrlOption( String Option ) [native, final] : Returns the value of an URL option.

==Rendering ==

; plane GetRenderBoundingSphere() [native, final] : Returns a plane struct which represents a sphere surrounding the actor. (X, Y, Z represent the center, W the radius)

; DrawDebugLine( vector LineStart, vector LineEnd, byte R, byte G, byte B) [native, final] : SLOW! Use for debugging only!

==Physics ==

; DebugClock() [native, final] :

; DebugUnclock() [native, final] :

; FinishInterpolation() [native, final, latent] : [[Legacy:Latent Function|Latent function]], which returns when the actor has finished following its assigned interpolation path.

; SetPhysics( EPhysics newPhysics ) [native, final] : Sets a new physics mode.

; OnlyAffectPawns( bool B ) [native, final] :

===Karma ===

Note that SimParams take affect until you quit the game! Make sure you reset them to defaults when leaving your mod etc.

; KGetSimParams( out KSimParams SimParams ) [native, final] :

; KSetSimParams( KSimParams SimParams ) [native, final] :

; quat KGetRBQuaternion() [native, final] :

; KGetRigidBodyState( out KRigidBodyState RBstate ) [native, final] : Returns the current Karma state of the actor in the RBstate variable

; KDrawRigidBodyState( KRigidBodyState RBState, bool AltColour ) [native, final] : SLOW! Use for debugging only!

; vector KRBVecToVector( KRBVec RBvec ) [native, final] : Returns a vector created from the Karma KRBVec

; KRBVec KRBVecFromVector( vector v ) [native, final] : Returns a Karma KBBVec created from the regular Unreal vector

; KSetMass( float mass ) [native, final] : Sets the Karma KMass property of an Actor

; float KGetMass() [native, final] : Returns the Karma KMass

; KSetInertiaTensor( vector it1, vector it2 ) [native, final] : Set inertia tensor assuming a mass of 1. Scaled by mass internally to calculate actual inertia tensor.

; KGetInertiaTensor( out vector it1, out vector it2 ) [native, final] :

; KSetDampingProps( float lindamp, float angdamp ) [native, final] :

; KGetDampingProps( out float lindamp, out float angdamp ) [native, final] :

; KSetFriction( float friction ) [native, final] : Sets the Karma Friction property

; float KGetFriction() [native, final] : Returns the Karma Friction property

; KSetRestitution( float rest ) [native, final] : Sets the Karma Restitution (Bounciness) property

; float KGetRestitution() [native, final] : Returns the Karma Restitution property

; KSetCOMOffset( vector offset ) [native, final] :

; KGetCOMOffset( out vector offset ) [native, final] :

; KGetCOMPosition( out vector pos ) [native, final] : Get actual position of actors COM in world space.

; KSetImpactThreshold( float thresh ) [native, final] : Sets the threshold for velocity at which a moving Karma actor must strike something before it's KImpact() event is called

; float KGetImpactThreshold() [native, final] : Returns the Impact Threshhold

; KWake() [native, final] : Begins Karma simulation

; bool KIsAwake() [native, final] : Returns true if Karma is simulating for this Actor

; KAddImpulse( vector Impulse, vector Position, optional name BoneName ) [native, final] : Adds a Karma impulse to the actor from Position, applying to BoneName

; KSetStayUpright( bool stayUpright, bool allowRotate ) [native, final] : Sets the KStayUpright poperty

; KSetBlockKarma( bool newBlock ) [native, final] : Sets the actor to block Karma

; KSetActorGravScale( float ActorGravScale ) [native, final] : Sets the Karma GravScale

; float KGetActorGravScale() [native, final] : Returns the Karma GravScale

; KDisableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Disable Karma contact generation between this actor, and another actor.  Collision is on by default.

; KEnableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Enable Karma contact generation between this actor, and another actor.  Collision is on by default.

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

===Karma Ragdoll ===

; KSetSkelVel( vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ) [native, final] :

; float KGetSkelMass() [native, final] :

; KFreezeRagdoll() [native, final] :

; KAddBoneLifter( name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ) [native, final] : Note you MUST turn collision off (KSetBlockKarma) before using bone lifters!

; KRemoveLifterFromBone( name BoneName ) [native, final] : 

; KRemoveAllBoneLifters() [native, final] : Used for only allowing a fixed maximum number of ragdolls in action.

; KMakeRagdollAvailable() [native, final] :

; bool KIsRagdollAvailable() [native, final] :

===Karma Events===

; KImpact( [[Legacy:Actor|Actor]] other, vector pos, vector impactVel, vector impactNorm) [event] : called when [[Legacy:Karma|Karma]] actor hits with impact velocity over KImpactThreshold 

; KVelDropBelow() [event] : called when karma actor's velocity drops below KVelDropBelowThreshold

; KSkelConvulse() [event] : called when a ragdoll convulses (see KarmaParamsSkel)

; KApplyForce( out vector Force, out vector Torque ) [event] : called just before sim to allow user to apply force (location movement) and torque (rotation movement) to the actor.  You should ONLY put numbers into Force and Torque during this event!!!!

; bool KUpdateState(out KRigidBodyState newState) [event] : This is called from inside C++ Karma physics code at the appropriate time to update state of Karma rigid body. If you return true, newState will be set into the rigid body. Return false and it will do nothing.&lt;br /&gt;It seems this is only called on subclasses of [[Legacy:KActor|KActor]], [[Legacy:KVehicle|KVehicle]] and [[Legacy:SVehicle|SVehicle]].

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

==Optimization==

; Clock( out float time ) [native, final] : This is called at the beginning of a section of code to be timed.  The variable time does not need to be initialized.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; UnClock( out float time ) [native, final] :  This is called at the end of a section of code to be timed passing in the same time variable supplied to Clock.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; CyclesToSeconds( int cycles) [native, final] : Available for Deus Ex. Converts the cycles created by Clock/UnClock to seconds.

==Timing ==

; SetTimer( float NewTimerRate, bool bLoop ) [native, final] : Causes Timer() events every NewTimerRate seconds. If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer. Actors with bStatic true do not get ticked, and as such the timer will not function if bStatic is true.

==Music ==

; int PlayMusic( string Song, float FadeInTime ) [native, final] : Plays a song name, given a FadeInTime, returns a SongHandle.

; StopMusic( int SongHandle, float FadeOutTime ) [native, final] : Stops the specified SongHandle (as given to you by PlayMusic)

; StopAllMusic( float FadeOutTime ) [native, final] : Stops all music

==Engine notification functions ==

; Destroyed() [event] : called when an actor is destroyed. See [[Legacy:Destroying Objects|Destroying Objects]].

; GainedChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor sets this actor as its Owner through SetOwner() or Spawn().

; LostChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor is no longer owned by this actor. Ownership was changed through SetOwner() or the other actor was destroyed.

; Tick( float DeltaTime ) [event] : Called when time passes if this actor isn't bStatic. ''DeltaTime'' is the time in seconds that has passed since the last tick. Child actors are ticket after their owners have been ticked. Temporarily toggle with Enable('Tick'), Disable('Tick'). See [[Legacy:Probe Function|Probe Function]].

; Timer() [event] : When a timer has been started with SetTimer(), this function is executed when the amount of time that was specified in SetTimer has passed. Like Tick() this event will only be called when the actor is not static and has not been disabled via Disable('Timer'). See [[Legacy:Probe Function|Probe Function]].

; PostNetReceive() [event] : If bNetNotify is True, this event is called when the actor receives an update to any variable through replication. See [[Legacy:Replication|Replication]].

; TornOff() [event] : Networking - called on client when actor is torn off. (bTearOff==true)

===Triggers ===

; Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is triggered.

; UnTrigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is untriggered.

; BeginEvent() [event] :

; EndEvent() [event] :

===Physics &amp; world interaction ===

; HitWall( vector HitNormal, [[Legacy:Actor|Actor]] HitWall ) [event] : Called when the actor can collide with world geometry and just hit a wall.

; Falling() [event] : Called with PHYS_Falling when the actor starts to fall.

; Landed( vector HitNormal ) [event] : Called when the actor is no longer falling. If you want to receive HitWall() instead of Landed() set bBounce=True.

; ZoneChange( [[Legacy:ZoneInfo|ZoneInfo]] NewZone ) [event] : Called when the actor's zone is about to change to NewZone.

; PhysicsVolumeChange( [[Legacy:PhysicsVolume|PhysicsVolume]] NewVolume ) [event] : Called when the actor's PhysicsVolume is about to change to NewVolume.

; Touch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull is touching another actor's collision hull.

; PostTouch( [[Legacy:Actor|Actor]] Other ) [event] : called for PendingTouch actor after physics completes

; UnTouch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull no longer touches another actor's collision hull.

; Bump( [[Legacy:Actor|Actor]] Other ) [event] :

; BaseChange() [event] : Called when the actor's base has changed.

; Attach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that another actor ''Other'' has been attached to it.

; Detach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that a previously attached actor ''Other'' has been detached from it.

; Actor SpecialHandling( [[Legacy:Pawn|Pawn]] Other) [event] :

; bool EncroachingOn( [[Legacy:Actor|Actor]] Other ) [event] : Called when this actor's collision hull intersects a blocking actor's collision hull. Returns whether this actor is &quot;encroaching&quot; on the other actor.

; EncroachedBy( [[Legacy:Actor|Actor]] Other ) [event] : When another actor has determined that it &quot;encroaches&quot; this actor, this event is called.

; FinishedInterpolation() [event] : The actor has finished folowing its assigned interpolation path.

; EndedRotation() [event] : Called when rotation completes.

; UsedBy( [[Legacy:Pawn|Pawn]] user ) [event] : Called if this Actor was touching a Pawn who pressed Use.

; FellOutOfWorld( eKillZType KillType ) [simulated, event] : Called when the actor fell below the current zone's KillZ height. By default this sets physics to none and destroys the actor.

; [[Legacy:Actor|Actor]] Trace( out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActors, optional vector Extent, optional out [[Legacy:Material|Material]] Material ) [native, final] : This traces a path to find what it collides with first. The line will be traced starting at TraceStart and ending at TraceEnd. If bTraceActors is true, actors will be considered for the tracing, otherwise only pieces of the world (terrain, staticmeshactors, BSP) will be considered for collision. When the trace hits something, HitLocation and HitNormal will be set to contain the location and normal of the impact. If specified, the material of the surface hit can also be returned. If an Extent is specified, you can have the trace have &quot;width.&quot; It will have a box of the size specified as a vector (corner to corner) as the &quot;thickness&quot; of the trace. Note that traces are not very fast, so should be avoided or kept to a minimum where possible. Note that if you want actors to be considered for traces they must be able to block the trace, either by bCollideActors, or easier with bBlockZeroExtentTraces or bBlockNonZeroExtentTraces if your trace uses extents. See [[Legacy:Trace|Trace]] for more.

'''Foxpaw:''' Can someone elaborate on the extents of a trace? Specifically, is the box aligned on the world axes or along the trace? IE, does the X of the extents point &quot;foreward&quot; along the trace, with Y and Z perpindicular to the trace, or do they define a box in the world coordinate system that gets &quot;dragged along&quot; the length of the trace?

'''Foxpaw:''' Tracing doesn't seem to interact properly with terrain if you use extents. I have been able to get zero extent traces to hit terrain, but not extent traces.

'''Devi:''' In theory the extent vector gets interpreted as a world aligned rectangular prism when doing Terrain checks, when it's testing versus actors it gets interpreted as a vertical cylinder. The cylinder collision type can go a bit weird if the X and Y values in the extent vector don't match...

; bool FastTrace( vector TraceEnd, optional vector TraceStart ) [native, final] : Similar to trace. Returns true if there is a clear path between the two points, false if the trace is blocked by world geometry. It will pass right through anything that is not set as world geometry.

; [[Legacy:Actor|Actor]] Spawn( class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation ) [native, final] : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location. See [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]].

; bool Destroy() [native, final] : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick. See [[Legacy:Destroying Objects|Destroying Objects]].

===Damage &amp; Kills ===

; KilledBy( [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : This actor was &quot;killed&quot; by a [[Legacy:Pawn|Pawn]].

; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] EventInstigator, vector HitLocation, vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) [event] : Called when the actor is taking damage.

==Sound ==

; PlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, final] : Play a sound effect. If called from a simulated function or on a client, the sound is propagated only to the local player, i.e. only he will hear the sound. If called from a non-simulated function on the server, the sound is propagated to all players. (They will hear it as long as they are in range.)

; PlayOwnedSound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, final] : Play a sound effect. On clients this function behaves identical to PlaySound. If called on the server the sound os propagated to all players but the remote owner. It will be propagated to a local owner, though.

; DemoPlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, event] :

; float GetSoundDuration( [[Legacy:Sound|Sound]] Sound ) [native, final] : Get a sound duration in seconds. (not affected by Level.TimeDilation)

==Force Feedback ==

; PlayFeedbackEffect( String EffectName ) [native, final] :

; StopFeedbackEffect( optional String EffectName ) [native, final] : Pass no parameter or &quot;&quot; to stop all.

; bool ForceFeedbackSupported( optional bool Enable ) [native, final] :

==AI ==

; MakeNoise( float Loudness ) [native, final] : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an instigator if they are not pawns. The noise is blocked by walls (only tested BSP, not SM)

'''Foxpaw:''' This probrably does a &quot;FastTrace&quot; and will be blocked by any object that is set as being world geometry. I haven't tested that either though.

'''Wormbo:''' It's not simply a trace. it also takes into account that noise travels around corners etc. by doing path ([[Legacy:NavigationPoint|NavigationPoint]].bPropagatesSound) and zone checks.

; bool PlayerCanSeeMe() [native, final] : Returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location.  '''Note:''' If the Actor in question is set to bHidden=True, this will always return false.

; vector SuggestFallVelocity( vector Destination, vector Start, float MaxZ, float MaxXYSpeed ) [native, final] :

==??? ==

; bool PreTeleport( [[Legacy:Teleporter|Teleporter]] InTeleporter ) [event] : Called when an actor is about to be moved by a teleporter

; PostTeleport( [[Legacy:Teleporter|Teleporter]] OutTeleporter ) [event] : Called when an actor exits a teleporter

==Disk access ==

; string GetMapName( string NameEnding, string MapName, int Dir ) [native, final] : 

; GetNextSkin( string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ) [native, final] :

; string GetURLMap() [native, final] :

; string GetNextInt( string ClassName, int Num ) [native, final] :

; GetNextIntDesc( string ClassName, int Num, out string Entry, out string Description ) [native, final] :

; bool GetCacheEntry( int Num, out string GUID, out string Filename ) [native, final] :

; bool MoveCacheEntry( string GUID, optional string NewFilename ) [native, final] :

==Iterator functions ==

[[Legacy:Iterator|Iterator]] functions for dealing with sets of actors.

; AllActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Avoid using AllActors() too often as it iterates through the whole actor list and is therefore slow.

; DynamicActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Only iterates through the non-static actors on the list (still relatively slow, but much better than AllActors).  This should be used in most cases and replaces AllActors in most of Epic's game code.

; ChildActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors owned by this actor.  Slow like AllActors().

; BasedActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors based on the current actor (slow, like AllActors).

; TouchingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors touching the current actor (fast). Actors that are attached are ignored.

; TraceActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) [native, final, iterator] : TraceActors() return all actors along a traced line.  Reasonably fast (like any trace).

; RadiusActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns all actors within a give radius.  Slow like AllActors().  Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible (not bHidden) and in the collision hash (bCollideActors is true).

; VisibleActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc ) [native, final, iterator] : Returns all visible actors within a radius.  Slow like AllActors().  Use VisibleCollidingActors() instead if desired actor types are in the collision hash (bCollideActors is true).

; VisibleCollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden ) [native, final, iterator] : VisibleCollidingActors() returns visible (not bHidden) colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() since it uses the collision hash.

; CollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() for reasonably small radii since it uses the collision hash.

==Scripted Actor functions ==
; BecomeViewTarget() : Called by PlayerController when this actor becomes its ViewTarget.
; BroadcastLocalizedMessage( class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; MessageClass, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) [event] : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The LocalMessage class defines how the PRI's and optional actor are used.

; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) [simulated] : lists important actor variable on canvas.  HUD will call DisplayDebug() on the current ViewTarget when the ShowDebug exec is used.
; HurtRadius( float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation ) [simulated, final] : Hurt locally authoritative actors within the radius.
; MatchStarting() : Called when gameplay actually starts.
; PlayTeleportEffect( bool bOut, bool bSound ) :

; PreBeginPlay() [event] : Called immediately before gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; BeginPlay() [event] : Called when gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostBeginPlay() [event] : Called immediately after gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostNetBeginPlay() [event] : called after PostBeginPlay.  On a net client, PostNetBeginPlay() is spawned after replicated variables have been initialized to their replicated values. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].

; RenderOverlays( [[Legacy:Canvas|Canvas]] Canvas ) : Called by player's hud to request drawing of actor-specific overlays onto canvas. Called every frame. Whatever is drawn on the canvas here only lasts for the current frame.&lt;br /&gt;'''Note:''' This function has to be called explicitly by another canvas drawing function, it's ''not'' called automatically for all actors.
; RenderTexture( [[Legacy:ScriptedTexture|ScriptedTexture]] Tex ) [event] :
; ReplaceText( out string Text, string Replace, string With ) [final] :
; Reset() : Reset actor to initial state - used when restarting level without reloading.
; SetDefaultDisplayProperties() :
; SetDisplayProperties( ERenderStyle NewStyle, [[Legacy:Material|Material]] NewTexture, bool bLighting ) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a Pawn's weapon) or to adjust the result based on other factors (such as a Pawn's other inventory wanting to affect the result).
; SetGRI( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI ) :
; SetInitialState() [simulated, event] : Called after PostBeginPlay. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; SetOverlayMaterial( [[Legacy:Material|Material]] mat, float time, bool bOverride ) [simulated] :
; StartInterpolation() [simulated] : when this function is called, the actor will start moving along an interpolation path beginning at Dest.
; String GetHumanReadableName() [simulated] : Returns the human readable string representation of an object.
; String GetItemName( string FullName ) : Returns the string representation of the name of an object without the package prefixes.
; String GetLocalString( optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2 ) [static] : Get localized message string associated with this actor.
; TravelPostAccept() [event] : Called when carried into a new level, after AcceptInventory.
; TravelPreAccept() [event] : Called when carried onto a new level, before AcceptInventory.
; TriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Trigger an [[Legacy:Event|event]]
; UntriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Untrigger an event (is this an event? if not, why?)
; UpdatePrecacheMaterials() [simulated] :
; UpdatePrecacheStaticMeshes() [simulated] :
; bool CanSplash() : return True in this function if the actor should make splashies
; bool EffectIsRelevant( vector SpawnLocation, bool bForceDedicated ) [simulated] :
; bool IsInPain() : Returns true if the actor is inside a [[Legacy:PhysicsVolume|PhysicsVolume]] that can cause pain.
; bool IsInVolume( [[Legacy:Volume|Volume]] aVolume ) : Returns true if the actor is inside the volume ''Volume''.
; bool NearSpot(vector Spot) [simulated, final] : returns true is spot is within collision cylinder.
; bool TouchingActor( [[Legacy:Actor|Actor]] A ) [simulated, final] : Returns true if the collision cylinders of the calling actor and the actor ''A'' overlap. 
; string GetDebugName() :
; vector GetCollisionExtent() :

'''MythOpus:''' Do you think we could add some documentation on how to get these functions to work?

'''MythOpus:''' Since there are various functions only available for certain games on this page, I suggest we page different pages for each seperate game for methods.

'''Tarquin:''' Good idea

'''MythOpus:''' Thanks :)

'''EricBlade:''' Couple things.  I did make a [[Legacy:Land Of The Dead|Land of the Dead]] page to root for that game, I hope that's acceptable.  I'm not sure if I should detail only the changes from the 2k3 Actor there, or keep the whole thing?   Second thing, the recent note on PlayerCanSeeMe() notes that bHidden makes it fail all the time, which was something that boggled my mind for a while.  So, if I wanted to make something that was invisible, but used this call, I could say, SetDrawType(DT_NONE); bHidden=False; and that would cause PlayerCanSeeMe() to work?  One last one.. I see &quot;KRemoveAllBoneLifters&quot; says &quot;used to limit ragdolls&quot; .. how is it used to do that? what does it do?

'''EricBlade:''' I actually just got to testing that, setting DrawType=DT_NONE and bHidden=False will cause PlayerCanSeeMe() to work for invisible actors. \o/

'''Xian:''' Sounds accurate. DT_None doesn't make the object disappear, but just to not render. bHidden does that. I also noticed a lot of funcs here are missing descriptions, although the UE1 pages (namely UT) have them. Think I'll get busy tomorrow :)

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Sounds|Sounds]]

----

[[:Category:Legacy To Do]] : Still needs work... lots to document, the functions need to be better organized into groups, and then it can all be broken up into sub-pages by group.  Some initial groups... rendering, movement, collision, physics, etc.
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44084</id>
      <timestamp>2010-11-03T13:30:22Z</timestamp>
      <contributor>
        <ip>187.113.80.73</ip>
      </contributor>
      <comment>/* Movement */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Methods)}}

==Uncategorized ==

; string ConsoleCommand( string Command ) [native] : Execute a console command in the context of the current level and game engine. See [[Legacy:Console Commands|console commands]].

; Error( coerce string S ) [native, final] : Handle an error and kill this one actor.

; Sleep( float Seconds ) [native, final, latent] : See [[Legacy:Latent Function|latent function]].

==Collision ==

; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) [native, final] : Sets bCollideActors, bBlockActors and bBlockPlayers to the values given by the parameters. bBlockPlayers is obsolete.

; bool SetCollisionSize( float NewRadius, float NewHeight ) [native, final] : Sets CollisionRadius and CollisionHeight to the values given by the parameters.

==Drawing ==

As their names suggest, these functions set the corresponding properties, which can't be changed directly since they are declared as const.

; SetDrawScale( float NewScale ) [native, final]
; SetDrawScale3D( vector NewScale3D ) [native, final]
; SetStaticMesh( [[Legacy:StaticMesh|StaticMesh]] NewStaticMesh ) [native, final]
; SetDrawType( EDrawType NewDrawType ) [native, final]

==Movement ==

; bool Move( vector Delta ) [native, final] : Like SetLocation but parameter is used relative to current location. It will consider the collision of the actor, so it will not pass through walls and other blockers.

; bool SetLocation( vector NewLocation ) [native, final] : This function sets the location of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. If the actor cannot occupy the new location because it is colliding with an actor that can block it, it will be placed at the nearest valid location. Note that because [[Legacy:Terrain|Terrain]] has no &quot;volume&quot; and is just a bent up sheet, the actor may not be moved in this manner when it penetrates [[Legacy:Terrain|terrain]].

; bool SetRotation( rotator NewRotation ) [native, final] :  This function sets the rotation of the actor it is called on. It will not work on actors with PHYS_Karma or PHYS_KarmaRagdoll. Does this relocate actors with more complex collision hulls if their new rotation causes them to penetrate an actor that can block them?

; bool SetRelativeRotation( rotator NewRotation ) [native, final] : Sets the rotation relative to the actor's base.

; bool SetRelativeLocation( vector NewLocation ) [native, final] : Sets the rotation reletive to the actor's base.

; bool MoveSmooth( vector Delta ) [native, final] :

; AutonomousPhysics( float DeltaSeconds ) [native, final] :

==Relations ==

; SetBase( [[Legacy:Actor|Actor]] NewBase, optional vector NewFloor ) [native, final] : Sets the actor's new base. NewFloor is the optional new floor normal (default is vect(0,0,1)) and it is only used for classes inherited from [[Legacy:Pawn|Pawn]].

; SetOwner( [[Legacy:Actor|Actor]] NewOwner ) [native, final] : Sets the actor's new owner.

==Animation ==

; string GetMeshName() [native, final] : 

; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Plays one of the animation sequences available for the actor's mesh. Rate is the relative playback speed of the animation sequence. TweenTime is the amount of game time the current animation frame is crossfaded to the start frame of the new animation before the animation sequence actually starts. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) [native, final] : Same as PlayAnim, except that the animation sequence is restarted after it finished. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool TweenAnim( name Sequence, float Time, optional int Channel ) [native, final] : Crossfades from the current animation frame to the first frame of the specified animation sequence. Channel refers to the channel that this animation should be played on, for blended animations. See [[Legacy:Skeletal Mesh|Skeletal Mesh]]. ''(What does the function return?)'' [[:Category:Legacy Answer Needed]]

; bool IsAnimating(optional int Channel) [native, final] : Returns whether there's an animation playing in the specified channel.

; FinishAnim(optional int Channel) [native, final, latent] : A [[Legacy:Latent Function|latent function]] which returns when the animation sequence in the specified channel has reached its last frame.

; bool HasAnim( name Sequence ) [native, final] : Returns whether the actor's current mesh has an animation sequence with the specified name.

; StopAnimating( optional bool ClearAllButBase ) [native, final] : Immediately stops the animation(s) the actor is currently playing. ''(What does ClearAllButBase do?)'' [[:Category:Legacy Answer Needed]]

; FreezeAnimAt( float Time, optional int Channel) [native, final] : Freezes the specified channel's animation. ''(How exactly does this work?)'' [[:Category:Legacy Answer Needed]]

; SetAnimFrame( float Time, optional int Channel, optional int UnitFlag ) [native, final] : Sets an animation in a certain channel to the specified time index. If the UnitFlag is 0 then the time value ranges from 0 to 1, 1 being the end of the animation (last frame) and 0 being the beginning (first frame). If the UnitFlag is 1 then the time is the frame that you want it to go to.

; bool IsTweening(int Channel) [native, final] : Returns whether the specified channel is currently fading in (tweening to) a new animation sequence.

; AnimStopLooping(optional int Channel) [native, final] : Prevents an animation sequence from starting over by itself once it has reached its last frame.

===Animation Notifications ===

; AnimEnd( int Channel ) [event] : Notification that the current animation has ended.  Allows an object to wait for animation completion before proceeding with other activities.

; EnableChannelNotify ( int Channel, int Switch ) [native, final] :

; int GetNotifyChannel() [native, final] :

===Skeletal Animation ===

; LinkSkelAnim( [[Legacy:MeshAnimation|MeshAnimation]] Anim, optional [[Legacy:Mesh|Mesh]] NewMesh ) [simulated, native, final] : Links a new animation set and mesh to the actor.

; LinkMesh( [[Legacy:Mesh|Mesh]] NewMesh, optional bool bKeepAnim ) [simulated, native, final] : Loads a new [[Legacy:Mesh|mesh]] for the actor and optionally keeps the animation set of the previous mesh.

----

LinkMesh note&gt; vaptor: seems in 2004 and 2003 for subclassed xpawns link mesh won't work cause theres a undocumented native function that changes the set mesh in net mode to the default character mesh each tick the only work around is to stop replicateing player replication info by seting it to role_none but thats not a good solution either cause it tends cause the actor to not be useable for playercontrollers.

----

; BoneRefresh() [native, final] : Updates the bone coords.

; AnimBlendParams( int Stage, optional float BlendAlpha, optional float InTime, optional float OutTime, optional name BoneName, optional bool bGlobalPose) [native, final] : See [[udn2:SkeletalBlending]].

; AnimBlendToAlpha( int Stage, float TargetAlpha, float TimeInterval ) [native, final] :

; coords GetBoneCoords( name BoneName ) [native, final] :

; rotator GetBoneRotation( name BoneName, optional int Space ) [native, final] :

; vector GetRootLocation() [native, final] :

; rotator GetRootRotation() [native, final] :

; vector GetRootLocationDelta() [native, final] :

; rotator GetRootRotationDelta() [native, final] :

; bool AttachToBone( [[Legacy:Actor|Actor]] Attachment, name BoneName ) [native, final] : Attaches the actor to the bone/socket alias using the attachment offset/rotation defined within the socket.

; bool DetachFromBone( [[Legacy:Actor|Actor]] Attachment ) [native, final] :

; LockRootMotion( int Lock ) [native, final] :

; SetBoneScale( int Slot, optional float BoneScale, optional name BoneName ) [native, final] : Scales the specified bone, overriding any other bone scaling associated with the specified slot. Not sure of the rationale in exposing the slots.

; SetBoneDirection( name BoneName, rotator BoneTurn, optional vector BoneTrans, optional float Alpha, optional int Space ) [native, final] :

; SetBoneLocation( name BoneName, optional vector BoneTrans, optional float Alpha ) [native, final] :

; SetBoneRotation( name BoneName, optional rotator BoneTurn, optional int Space, optional float Alpha ) [native, final, simulated] :

; GetAnimParams( int Channel, out name OutSeqName, out float OutAnimFrame, out float OutAnimRate ) [native, final] :

; bool AnimIsInGroup( int Channel, name GroupName ) [native, final] :

; Name GetClosestBone( Vector loc, Vector ray, out float boneDist, optional Name BiasBone, optional float BiasDistance ) [native, final] : Returns the closest socket alias, not the bone (UT2004).

==URLs==

; UpdateURL( String NewOption, String NewValue, bool bSaveDefault ) [native, final] : Updates an URL option and optionally saves it as default URL option.

; string GetUrlOption( String Option ) [native, final] : Returns the value of an URL option.

==Rendering ==

; plane GetRenderBoundingSphere() [native, final] : Returns a plane struct which represents a sphere surrounding the actor. (X, Y, Z represent the center, W the radius)

; DrawDebugLine( vector LineStart, vector LineEnd, byte R, byte G, byte B) [native, final] : SLOW! Use for debugging only!

==Physics ==

; DebugClock() [native, final] :

; DebugUnclock() [native, final] :

; FinishInterpolation() [native, final, latent] : [[Legacy:Latent Function|Latent function]], which returns when the actor has finished following its assigned interpolation path.

; SetPhysics( EPhysics newPhysics ) [native, final] : Sets a new physics mode.

; OnlyAffectPawns( bool B ) [native, final] :

===Karma ===

Note that SimParams take affect until you quit the game! Make sure you reset them to defaults when leaving your mod etc.

; KGetSimParams( out KSimParams SimParams ) [native, final] :

; KSetSimParams( KSimParams SimParams ) [native, final] :

; quat KGetRBQuaternion() [native, final] :

; KGetRigidBodyState( out KRigidBodyState RBstate ) [native, final] : Returns the current Karma state of the actor in the RBstate variable

; KDrawRigidBodyState( KRigidBodyState RBState, bool AltColour ) [native, final] : SLOW! Use for debugging only!

; vector KRBVecToVector( KRBVec RBvec ) [native, final] : Returns a vector created from the Karma KRBVec

; KRBVec KRBVecFromVector( vector v ) [native, final] : Returns a Karma KBBVec created from the regular Unreal vector

; KSetMass( float mass ) [native, final] : Sets the Karma KMass property of an Actor

; float KGetMass() [native, final] : Returns the Karma KMass

; KSetInertiaTensor( vector it1, vector it2 ) [native, final] : Set inertia tensor assuming a mass of 1. Scaled by mass internally to calculate actual inertia tensor.

; KGetInertiaTensor( out vector it1, out vector it2 ) [native, final] :

; KSetDampingProps( float lindamp, float angdamp ) [native, final] :

; KGetDampingProps( out float lindamp, out float angdamp ) [native, final] :

; KSetFriction( float friction ) [native, final] : Sets the Karma Friction property

; float KGetFriction() [native, final] : Returns the Karma Friction property

; KSetRestitution( float rest ) [native, final] : Sets the Karma Restitution (Bounciness) property

; float KGetRestitution() [native, final] : Returns the Karma Restitution property

; KSetCOMOffset( vector offset ) [native, final] :

; KGetCOMOffset( out vector offset ) [native, final] :

; KGetCOMPosition( out vector pos ) [native, final] : Get actual position of actors COM in world space.

; KSetImpactThreshold( float thresh ) [native, final] : Sets the threshold for velocity at which a moving Karma actor must strike something before it's KImpact() event is called

; float KGetImpactThreshold() [native, final] : Returns the Impact Threshhold

; KWake() [native, final] : Begins Karma simulation

; bool KIsAwake() [native, final] : Returns true if Karma is simulating for this Actor

; KAddImpulse( vector Impulse, vector Position, optional name BoneName ) [native, final] : Adds a Karma impulse to the actor from Position, applying to BoneName

; KSetStayUpright( bool stayUpright, bool allowRotate ) [native, final] : Sets the KStayUpright poperty

; KSetBlockKarma( bool newBlock ) [native, final] : Sets the actor to block Karma

; KSetActorGravScale( float ActorGravScale ) [native, final] : Sets the Karma GravScale

; float KGetActorGravScale() [native, final] : Returns the Karma GravScale

; KDisableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Disable Karma contact generation between this actor, and another actor.  Collision is on by default.

; KEnableCollision( [[Legacy:Actor|Actor]] Other ) [native, final] : Enable Karma contact generation between this actor, and another actor.  Collision is on by default.

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

===Karma Ragdoll ===

; KSetSkelVel( vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ) [native, final] :

; float KGetSkelMass() [native, final] :

; KFreezeRagdoll() [native, final] :

; KAddBoneLifter( name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ) [native, final] : Note you MUST turn collision off (KSetBlockKarma) before using bone lifters!

; KRemoveLifterFromBone( name BoneName ) [native, final] : 

; KRemoveAllBoneLifters() [native, final] : Used for only allowing a fixed maximum number of ragdolls in action.

; KMakeRagdollAvailable() [native, final] :

; bool KIsRagdollAvailable() [native, final] :

===Karma Events===

; KImpact( [[Legacy:Actor|Actor]] other, vector pos, vector impactVel, vector impactNorm) [event] : called when [[Legacy:Karma|Karma]] actor hits with impact velocity over KImpactThreshold 

; KVelDropBelow() [event] : called when karma actor's velocity drops below KVelDropBelowThreshold

; KSkelConvulse() [event] : called when a ragdoll convulses (see KarmaParamsSkel)

; KApplyForce( out vector Force, out vector Torque ) [event] : called just before sim to allow user to apply force (location movement) and torque (rotation movement) to the actor.  You should ONLY put numbers into Force and Torque during this event!!!!

; bool KUpdateState(out KRigidBodyState newState) [event] : This is called from inside C++ Karma physics code at the appropriate time to update state of Karma rigid body. If you return true, newState will be set into the rigid body. Return false and it will do nothing.&lt;br /&gt;It seems this is only called on subclasses of [[Legacy:KActor|KActor]], [[Legacy:KVehicle|KVehicle]] and [[Legacy:SVehicle|SVehicle]].

The Karma functions are discussed in more detail on the [[Legacy:Karma Functions And Events|Karma Functions And Events]] page.

==Optimization==

; Clock( out float time ) [native, final] : This is called at the beginning of a section of code to be timed.  The variable time does not need to be initialized.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; UnClock( out float time ) [native, final] :  This is called at the end of a section of code to be timed passing in the same time variable supplied to Clock.  See [[Legacy:Code Optimization|Code Optimization]] for a code sample.

; CyclesToSeconds( int cycles) [native, final] : Available for Deus Ex. Converts the cycles created by Clock/UnClock to seconds.

==Timing ==

; SetTimer( float NewTimerRate, bool bLoop ) [native, final] : Causes Timer() events every NewTimerRate seconds. If bLoop is true, causes &lt;tt&gt;Timer()&lt;/tt&gt; events every NewTimerRate seconds. Otherwise, causes &lt;tt&gt;Timer()&lt;/tt&gt; to be called once in NewTimerRate seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer. Actors with bStatic true do not get ticked, and as such the timer will not function if bStatic is true.

==Music ==

; int PlayMusic( string Song, float FadeInTime ) [native, final] : Plays a song name, given a FadeInTime, returns a SongHandle.

; StopMusic( int SongHandle, float FadeOutTime ) [native, final] : Stops the specified SongHandle (as given to you by PlayMusic)

; StopAllMusic( float FadeOutTime ) [native, final] : Stops all music

==Engine notification functions ==

; Destroyed() [event] : called when an actor is destroyed. See [[Legacy:Destroying Objects|Destroying Objects]].

; GainedChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor sets this actor as its Owner through SetOwner() or Spawn().

; LostChild( [[Legacy:Actor|Actor]] Other ) [event] : Called when another actor is no longer owned by this actor. Ownership was changed through SetOwner() or the other actor was destroyed.

; Tick( float DeltaTime ) [event] : Called when time passes if this actor isn't bStatic. ''DeltaTime'' is the time in seconds that has passed since the last tick. Child actors are ticket after their owners have been ticked. Temporarily toggle with Enable('Tick'), Disable('Tick'). See [[Legacy:Probe Function|Probe Function]].

; Timer() [event] : When a timer has been started with SetTimer(), this function is executed when the amount of time that was specified in SetTimer has passed. Like Tick() this event will only be called when the actor is not static and has not been disabled via Disable('Timer'). See [[Legacy:Probe Function|Probe Function]].

; PostNetReceive() [event] : If bNetNotify is True, this event is called when the actor receives an update to any variable through replication. See [[Legacy:Replication|Replication]].

; TornOff() [event] : Networking - called on client when actor is torn off. (bTearOff==true)

===Triggers ===

; Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is triggered.

; UnTrigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Called when this actor's [[Legacy:Event|Event]] is untriggered.

; BeginEvent() [event] :

; EndEvent() [event] :

===Physics &amp; world interaction ===

; HitWall( vector HitNormal, [[Legacy:Actor|Actor]] HitWall ) [event] : Called when the actor can collide with world geometry and just hit a wall.

; Falling() [event] : Called with PHYS_Falling when the actor starts to fall.

; Landed( vector HitNormal ) [event] : Called when the actor is no longer falling. If you want to receive HitWall() instead of Landed() set bBounce=True.

; ZoneChange( [[Legacy:ZoneInfo|ZoneInfo]] NewZone ) [event] : Called when the actor's zone is about to change to NewZone.

; PhysicsVolumeChange( [[Legacy:PhysicsVolume|PhysicsVolume]] NewVolume ) [event] : Called when the actor's PhysicsVolume is about to change to NewVolume.

; Touch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull is touching another actor's collision hull.

; PostTouch( [[Legacy:Actor|Actor]] Other ) [event] : called for PendingTouch actor after physics completes

; UnTouch( [[Legacy:Actor|Actor]] Other ) [event] : Called when the actor's collision hull no longer touches another actor's collision hull.

; Bump( [[Legacy:Actor|Actor]] Other ) [event] :

; BaseChange() [event] : Called when the actor's base has changed.

; Attach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that another actor ''Other'' has been attached to it.

; Detach( [[Legacy:Actor|Actor]] Other ) [event] : Called by ''SetBase()'' to notify an actor that a previously attached actor ''Other'' has been detached from it.

; Actor SpecialHandling( [[Legacy:Pawn|Pawn]] Other) [event] :

; bool EncroachingOn( [[Legacy:Actor|Actor]] Other ) [event] : Called when this actor's collision hull intersects a blocking actor's collision hull. Returns whether this actor is &quot;encroaching&quot; on the other actor.

; EncroachedBy( [[Legacy:Actor|Actor]] Other ) [event] : When another actor has determined that it &quot;encroaches&quot; this actor, this event is called.

; FinishedInterpolation() [event] : The actor has finished folowing its assigned interpolation path.

; EndedRotation() [event] : Called when rotation completes.

; UsedBy( [[Legacy:Pawn|Pawn]] user ) [event] : Called if this Actor was touching a Pawn who pressed Use.

; FellOutOfWorld( eKillZType KillType ) [simulated, event] : Called when the actor fell below the current zone's KillZ height. By default this sets physics to none and destroys the actor.

; [[Legacy:Actor|Actor]] Trace( out vector HitLocation, out vector HitNormal, vector TraceEnd, optional vector TraceStart, optional bool bTraceActors, optional vector Extent, optional out [[Legacy:Material|Material]] Material ) [native, final] : This traces a path to find what it collides with first. The line will be traced starting at TraceStart and ending at TraceEnd. If bTraceActors is true, actors will be considered for the tracing, otherwise only pieces of the world (terrain, staticmeshactors, BSP) will be considered for collision. When the trace hits something, HitLocation and HitNormal will be set to contain the location and normal of the impact. If specified, the material of the surface hit can also be returned. If an Extent is specified, you can have the trace have &quot;width.&quot; It will have a box of the size specified as a vector (corner to corner) as the &quot;thickness&quot; of the trace. Note that traces are not very fast, so should be avoided or kept to a minimum where possible. Note that if you want actors to be considered for traces they must be able to block the trace, either by bCollideActors, or easier with bBlockZeroExtentTraces or bBlockNonZeroExtentTraces if your trace uses extents. See [[Legacy:Trace|Trace]] for more.

'''Foxpaw:''' Can someone elaborate on the extents of a trace? Specifically, is the box aligned on the world axes or along the trace? IE, does the X of the extents point &quot;foreward&quot; along the trace, with Y and Z perpindicular to the trace, or do they define a box in the world coordinate system that gets &quot;dragged along&quot; the length of the trace?

'''Foxpaw:''' Tracing doesn't seem to interact properly with terrain if you use extents. I have been able to get zero extent traces to hit terrain, but not extent traces.

'''Devi:''' In theory the extent vector gets interpreted as a world aligned rectangular prism when doing Terrain checks, when it's testing versus actors it gets interpreted as a vertical cylinder. The cylinder collision type can go a bit weird if the X and Y values in the extent vector don't match...

; bool FastTrace( vector TraceEnd, optional vector TraceStart ) [native, final] : Similar to trace. Returns true if there is a clear path between the two points, false if the trace is blocked by world geometry. It will pass right through anything that is not set as world geometry.

; [[Legacy:Actor|Actor]] Spawn( class&lt;[[Legacy:Actor|Actor]]&gt; SpawnClass, optional [[Legacy:Actor|Actor]] SpawnOwner, optional name SpawnTag, optional vector SpawnLocation, optional rotator SpawnRotation ) [native, final] : Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). Defaults to spawning at the spawner's location. See [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]].

; bool Destroy() [native, final] : Destroy this actor. Returns true if destroyed, false if indestructable. Destruction is latent. It occurs at the end of the tick. See [[Legacy:Destroying Objects|Destroying Objects]].

===Damage &amp; Kills ===

; KilledBy( [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : This actor was &quot;killed&quot; by a [[Legacy:Pawn|Pawn]].

; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] EventInstigator, vector HitLocation, vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) [event] : Called when the actor is taking damage.

==Sound ==

; PlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, final] : Play a sound effect. If called from a simulated function or on a client, the sound is propagated only to the local player, i.e. only he will hear the sound. If called from a non-simulated function on the server, the sound is propagated to all players. (They will hear it as long as they are in range.)

; PlayOwnedSound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, final] : Play a sound effect. On clients this function behaves identical to PlaySound. If called on the server the sound os propagated to all players but the remote owner. It will be propagated to a local owner, though.

; DemoPlaySound( [[Legacy:Sound|Sound]] Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) [native, simulated, event] :

; float GetSoundDuration( [[Legacy:Sound|Sound]] Sound ) [native, final] : Get a sound duration in seconds. (not affected by Level.TimeDilation)

==Force Feedback ==

; PlayFeedbackEffect( String EffectName ) [native, final] :

; StopFeedbackEffect( optional String EffectName ) [native, final] : Pass no parameter or &quot;&quot; to stop all.

; bool ForceFeedbackSupported( optional bool Enable ) [native, final] :

==AI ==

; MakeNoise( float Loudness ) [native, final] : Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). Senders of MakeNoise should have an instigator if they are not pawns. The noise is blocked by walls (only tested BSP, not SM)

'''Foxpaw:''' This probrably does a &quot;FastTrace&quot; and will be blocked by any object that is set as being world geometry. I haven't tested that either though.

'''Wormbo:''' It's not simply a trace. it also takes into account that noise travels around corners etc. by doing path ([[Legacy:NavigationPoint|NavigationPoint]].bPropagatesSound) and zone checks.

; bool PlayerCanSeeMe() [native, final] : Returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location.  '''Note:''' If the Actor in question is set to bHidden=True, this will always return false.

; vector SuggestFallVelocity( vector Destination, vector Start, float MaxZ, float MaxXYSpeed ) [native, final] :

==??? ==

; bool PreTeleport( [[Legacy:Teleporter|Teleporter]] InTeleporter ) [event] : Called when an actor is about to be moved by a teleporter

; PostTeleport( [[Legacy:Teleporter|Teleporter]] OutTeleporter ) [event] : Called when an actor exits a teleporter

==Disk access ==

; string GetMapName( string NameEnding, string MapName, int Dir ) [native, final] : 

; GetNextSkin( string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ) [native, final] :

; string GetURLMap() [native, final] :

; string GetNextInt( string ClassName, int Num ) [native, final] :

; GetNextIntDesc( string ClassName, int Num, out string Entry, out string Description ) [native, final] :

; bool GetCacheEntry( int Num, out string GUID, out string Filename ) [native, final] :

; bool MoveCacheEntry( string GUID, optional string NewFilename ) [native, final] :

==Iterator functions ==

[[Legacy:Iterator|Iterator]] functions for dealing with sets of actors.

; AllActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Avoid using AllActors() too often as it iterates through the whole actor list and is therefore slow.

; DynamicActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag ) [native, final, iterator] : Only iterates through the non-static actors on the list (still relatively slow, but much better than AllActors).  This should be used in most cases and replaces AllActors in most of Epic's game code.

; ChildActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors owned by this actor.  Slow like AllActors().

; BasedActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors based on the current actor (slow, like AllActors).

; TouchingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor ) [native, final, iterator] : Returns all actors touching the current actor (fast). Actors that are attached are ignored.

; TraceActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) [native, final, iterator] : TraceActors() return all actors along a traced line.  Reasonably fast (like any trace).

; RadiusActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns all actors within a give radius.  Slow like AllActors().  Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible (not bHidden) and in the collision hash (bCollideActors is true).

; VisibleActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc ) [native, final, iterator] : Returns all visible actors within a radius.  Slow like AllActors().  Use VisibleCollidingActors() instead if desired actor types are in the collision hash (bCollideActors is true).

; VisibleCollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden ) [native, final, iterator] : VisibleCollidingActors() returns visible (not bHidden) colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() since it uses the collision hash.

; CollidingActors( class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc ) [native, final, iterator] : Returns colliding (bCollideActors==true) actors within a certain radius. Much faster than AllActors() for reasonably small radii since it uses the collision hash.

==Scripted Actor functions ==
; BecomeViewTarget() : Called by PlayerController when this actor becomes its ViewTarget.
; BroadcastLocalizedMessage( class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; MessageClass, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) [event] : Broadcast a localized message to all players. Most message deal with 0 to 2 related PRIs. The LocalMessage class defines how the PRI's and optional actor are used.

; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) [simulated] : lists important actor variable on canvas.  HUD will call DisplayDebug() on the current ViewTarget when the ShowDebug exec is used.
; HurtRadius( float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation ) [simulated, final] : Hurt locally authoritative actors within the radius.
; MatchStarting() : Called when gameplay actually starts.
; PlayTeleportEffect( bool bOut, bool bSound ) :

; PreBeginPlay() [event] : Called immediately before gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; BeginPlay() [event] : Called when gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostBeginPlay() [event] : Called immediately after gameplay begins. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; PostNetBeginPlay() [event] : called after PostBeginPlay.  On a net client, PostNetBeginPlay() is spawned after replicated variables have been initialized to their replicated values. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].

; RenderOverlays( [[Legacy:Canvas|Canvas]] Canvas ) : Called by player's hud to request drawing of actor-specific overlays onto canvas. Called every frame. Whatever is drawn on the canvas here only lasts for the current frame.&lt;br /&gt;'''Note:''' This function has to be called explicitly by another canvas drawing function, it's ''not'' called automatically for all actors.
; RenderTexture( [[Legacy:ScriptedTexture|ScriptedTexture]] Tex ) [event] :
; ReplaceText( out string Text, string Replace, string With ) [final] :
; Reset() : Reset actor to initial state - used when restarting level without reloading.
; SetDefaultDisplayProperties() :
; SetDisplayProperties( ERenderStyle NewStyle, [[Legacy:Material|Material]] NewTexture, bool bLighting ) : Set the display properties of an actor.  By setting them through this function, it allows the actor to modify other components (such as a Pawn's weapon) or to adjust the result based on other factors (such as a Pawn's other inventory wanting to affect the result).
; SetGRI( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI ) :
; SetInitialState() [simulated, event] : Called after PostBeginPlay. See [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]] and [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].
; SetOverlayMaterial( [[Legacy:Material|Material]] mat, float time, bool bOverride ) [simulated] :
; StartInterpolation() [simulated] : when this function is called, the actor will start moving along an interpolation path beginning at Dest.
; String GetHumanReadableName() [simulated] : Returns the human readable string representation of an object.
; String GetItemName( string FullName ) : Returns the string representation of the name of an object without the package prefixes.
; String GetLocalString( optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2 ) [static] : Get localized message string associated with this actor.
; TravelPostAccept() [event] : Called when carried into a new level, after AcceptInventory.
; TravelPreAccept() [event] : Called when carried onto a new level, before AcceptInventory.
; TriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) [event] : Trigger an [[Legacy:Event|event]]
; UntriggerEvent( Name EventName, [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Untrigger an event (is this an event? if not, why?)
; UpdatePrecacheMaterials() [simulated] :
; UpdatePrecacheStaticMeshes() [simulated] :
; bool CanSplash() : return True in this function if the actor should make splashies
; bool EffectIsRelevant( vector SpawnLocation, bool bForceDedicated ) [simulated] :
; bool IsInPain() : Returns true if the actor is inside a [[Legacy:PhysicsVolume|PhysicsVolume]] that can cause pain.
; bool IsInVolume( [[Legacy:Volume|Volume]] aVolume ) : Returns true if the actor is inside the volume ''Volume''.
; bool NearSpot(vector Spot) [simulated, final] : returns true is spot is within collision cylinder.
; bool TouchingActor( [[Legacy:Actor|Actor]] A ) [simulated, final] : Returns true if the collision cylinders of the calling actor and the actor ''A'' overlap. 
; string GetDebugName() :
; vector GetCollisionExtent() :

'''MythOpus:''' Do you think we could add some documentation on how to get these functions to work?

'''MythOpus:''' Since there are various functions only available for certain games on this page, I suggest we page different pages for each seperate game for methods.

'''Tarquin:''' Good idea

'''MythOpus:''' Thanks :)

'''EricBlade:''' Couple things.  I did make a [[Legacy:Land Of The Dead|Land of the Dead]] page to root for that game, I hope that's acceptable.  I'm not sure if I should detail only the changes from the 2k3 Actor there, or keep the whole thing?   Second thing, the recent note on PlayerCanSeeMe() notes that bHidden makes it fail all the time, which was something that boggled my mind for a while.  So, if I wanted to make something that was invisible, but used this call, I could say, SetDrawType(DT_NONE); bHidden=False; and that would cause PlayerCanSeeMe() to work?  One last one.. I see &quot;KRemoveAllBoneLifters&quot; says &quot;used to limit ragdolls&quot; .. how is it used to do that? what does it do?

'''EricBlade:''' I actually just got to testing that, setting DrawType=DT_NONE and bHidden=False will cause PlayerCanSeeMe() to work for invisible actors. \o/

'''Xian:''' Sounds accurate. DT_None doesn't make the object disappear, but just to not render. bHidden does that. I also noticed a lot of funcs here are missing descriptions, although the UE1 pages (namely UT) have them. Think I'll get busy tomorrow :)

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Sounds|Sounds]]

----

[[:Category:Legacy To Do]] : Still needs work... lots to document, the functions need to be better organized into groups, and then it can all be broken up into sub-pages by group.  Some initial groups... rendering, movement, collision, physics, etc.
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Movement</title>
    <id>327</id>
    <revision>
      <id>1158</id>
      <timestamp>2005-11-18T20:24:28Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Movement)}}

(also see [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]])

; EPhysics Physics (const) : Actor's current physics mode. (see [[Legacy:PhysicsType|PhysicsType]]) Use SetPhysics method to change.
; bool bIgnoreEncroachers : Ignore collisions with movers.
; vector Location (const) : a [[Legacy:Vector|vector]] giving the position of the actor in the world. Remember when setting this that the engine uses a left-handed coordinate system (see [[Wikipedia:Handedness]] for definition &amp; pictures).  Use Move or SetLocation methods to change.
; rotator Rotation (const) : Actor's rotation. Use SetRotation or SetRelativeRotation methods to change. In UnrealEd, set [[Legacy:Actor/Advanced|Advanced]] -&gt; bDirectional to make the actor display an arrow that represents this value.
; vector Velocity : Actor's velocity.
; name AttachTag : The [[Legacy:Mover|Mover]], or KActor to attach this actor to. AttachTag is the Tag of the mover. This replaces the Attach Mover in UT.
; bool bHardAttach (const) : Uses 'hard' attachment code. bBlockActor and bBlockPlayer must also be false. This actor cannot then move relative to base (SetLocation etc.). Dont set while currently based on something!
; bool bBounce : Bounces when hits ground fast.
; bool bFixedRotationDir : Fixed direction of rotation.
; bool bRotateToDesired : Rotate to DesiredRotation.
; float Mass : Mass of this actor.
; float Buoyancy : Water buoyancy.
; rotator RotationRate : Change in rotation per second.
; rotator DesiredRotation : Physics will smoothly rotate actor to this rotation if bRotateToDesired.</text>
    </revision>
    <revision>
      <id>1159</id>
      <timestamp>2003-03-01T18:19:55Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Movement)}}

(also see [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]])

; EPhysics Physics (const) : Actor's current physics mode. (see [[Legacy:PhysicsType|PhysicsType]]) Use SetPhysics method to change.
; bool bIgnoreEncroachers : Ignore collisions with movers.
; vector Location (const) : a [[Legacy:Vector|vector]] giving the position of the actor in the world. Remember when setting this that the engine uses a left-handed coordinate system (see [[Wikipedia:Handedness]] for definition &amp; pictures).  Use Move or SetLocation methods to change.
; rotator Rotation (const) : Actor's rotation. Use SetRotation or SetRelativeRotation methods to change.
; vector Velocity : Actor's velocity.
; name AttachTag : The [[Legacy:Mover|Mover]], or KActor to attach this actor to. AttachTag is the Tag of the mover. This replaces the Attach Mover in UT.
; bool bHardAttach (const) : Uses 'hard' attachment code. bBlockActor and bBlockPlayer must also be false. This actor cannot then move relative to base (SetLocation etc.). Dont set while currently based on something!
; bool bBounce : Bounces when hits ground fast.
; bool bFixedRotationDir : Fixed direction of rotation.
; bool bRotateToDesired : Rotate to DesiredRotation.
; float Mass : Mass of this actor.
; float Buoyancy : Water buoyancy.
; rotator RotationRate : Change in rotation per second.
; rotator DesiredRotation : Physics will smoothly rotate actor to this rotation if bRotateToDesired.</text>
    </revision>
    <revision>
      <id>1160</id>
      <timestamp>2003-04-05T08:14:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Movement)}}

(also see [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]])

; EPhysics Physics (const) : Actor's current physics mode. (see [[Legacy:PhysicsType|PhysicsType]]) Use SetPhysics method to change.
; bool bIgnoreEncroachers : Ignore collisions with movers.
; vector Location (const) : a [[Legacy:Vector|vector]] giving the position of the actor in the world. Remember when setting this that the engine uses a left-handed coordinate system (see [[Wikipedia:Handedness]] for definition &amp; pictures).  Use Move or SetLocation methods to change.
; rotator Rotation (const) : Actor's rotation. Use SetRotation or SetRelativeRotation methods to change. In UnrealEd, set [[Legacy:Actor/Advanced|Advanced]] -&gt; bDirectional to make the actor display an arrow that represents this value.
; vector Velocity : Actor's velocity.
; name AttachTag : The [[Legacy:Mover|Mover]], or KActor to attach this actor to. AttachTag is the Tag of the mover. This replaces the Attach Mover in UT.
; bool bHardAttach (const) : Uses 'hard' attachment code. bBlockActor and bBlockPlayer must also be false. This actor cannot then move relative to base (SetLocation etc.). Dont set while currently based on something!
; bool bBounce : Bounces when hits ground fast.
; bool bFixedRotationDir : Fixed direction of rotation.
; bool bRotateToDesired : Rotate to DesiredRotation.
; float Mass : Mass of this actor.
; float Buoyancy : Water buoyancy.
; rotator RotationRate : Change in rotation per second.
; rotator DesiredRotation : Physics will smoothly rotate actor to this rotation if bRotateToDesired.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/New In UT2004</title>
    <id>332</id>
    <revision>
      <id>1170</id>
      <timestamp>2006-05-26T15:41:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] (Package: Engine)}}

There are numerous changes, so this page might be missing some of them. The information on this page is based on the [[Legacy:UnrealScript Source|UnrealScript source]] code of UT2003 v2225 and UT2004 v3204.

==Properties==

===Changed in UT2004===
; float NetUpdateTime : This property is no longer const.
; bool bCollideWorld
; bool bBlockPlayers : These properties are no longer displayed in the Collision property group. bBlockPlayers is obsolete now and also no longer replicated.
; bool bNetNotify : This property is no longer displayed in the Advanced property group.
; bool bIgnoreEncroachers : This property is now replicated to clients if the actor can collide with other actors or world geometry.

===New in UT2004===
; float FluidSurfaceShootStrengthMod : If bDisturbFluidSurface is set to True, a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]'s ShootStrength is multiplied by this before doing the ripples.
; bool bNotifyLocalPlayerTeamReceived : Wants NotifyLocalPlayerTeamReceived() calls.
; bool bForceSkelUpdate : Update skeleton (and attached actor positions) even if not rendered.
; bool bClientAuthoritative (const) : Remains ROLE_Authority on client. (only valid for bStatic or bNoDelete actors)
; bool bBlocksTeleport : 
; bool bClientTrigger (changes replicated to clients) : Changes in this value will call the ClientTrigger event clientsidely.
; bool bUseCollisionStaticMesh : 
; bool bNotOnDedServer : Destroy this actor if on dedicated server and [[Legacy:RemoteRole|RemoteRole]] == ROLE_None (emitters, etc.)
; bool bAlreadyPrecachedMaterials : 
; bool bAlreadyPrecachedMeshes : 
; [[Legacy:Material|Material]] HighDetailOverlay : If high detail mode, use this overlay when no other overlay is active.

==Structs==

===Changed in UT2004===
; KSimParams : The MaxKarmaSpeed and MaxRagdollSpeed properties have been removed.

===New in UT2004===

====FireProperties====

&lt;uscript&gt;
struct FireProperties
{
	var class&lt;Ammunition&gt; AmmoClass;
	var class&lt;Projectile&gt; ProjectileClass;
	var float WarnTargetPct;
	var float MaxRange;
	var bool bTossed;
	var bool bTrySplash;
	var bool bLeadTarget;
	var bool bInstantHit;
	var bool bInitialized;
};
&lt;/uscript&gt;

==Enums==
; ESurfaceTypes : This enum now has the additional values EST_Custom00..EST_Custom31 for mods that need custom surface types.

==Methods==

===Removed in UT2004===
; string GetItemName (string FullName)
; ReplaceText (out string Text, string Replace, string With) [final] : These are now static simulated [[Legacy:Global Function|global function]]s. (ReplaceText() is still final, though.)

===Changed in UT2004===
; string ConsoleCommand (string Command, optional bool bWriteToLog) [native] : The new bWriteToLog parameter outputs the console command's results to the game's log file.

; int PlayMusic(string Song, optional float FadeInTime) [native final]
; StopMusic int SongHandle, optional float FadeOutTime) [native final]
; StopAllMusic(optional float FadeOutTime) [native final] : The fading parameters are now optional. These functions are used only for level music in .OGG format and playback is stopped on mapchange.

; string GetURLMap (optional bool bIncludeOptions) [native final] : The bIncludeOptions is new in UT2004.

; TriggerEvent (name EventName, [[Legacy:Actor Other|Actor Other]], [[Legacy:Pawn|Pawn]] EventInstigator) [simulated]
; UntriggerEvent (name EventName, [[Legacy:Actor Other|Actor Other]], [[Legacy:Pawn|Pawn]] EventInstigator) : TriggerEvent is a [[Legacy:Simulated Function|simulated function]] now, i.e. it can be executed on clients as well. Both functions not only (un)trigger dynamic actors, but also static [[Legacy:NavigationPoint|NavigationPoint]]s in UT2004.

===New functions in UT2004===
; CopyObjectToClipboard ([[Legacy:Object|Object]] Obj) [native] : Copy the specified object's properties to the clipboard. The format generated is for pasting into the editor if it's an actor or into the [[Legacy:Default Properties|default properties]] block of a class if it isn't.

; TextToSpeech (string Text, float Volume) [native] : 

; bool ShouldBeHidden ( ) [native final static] : Returns, whether the class has the HideDropDown class modifier. (see [[Legacy:Class Syntax|Class Syntax]])

; bool IsJoinedTo ([[Legacy:Actor|Actor]] Other) [native final] : 

; KAddAngularImpulse (vector AngImpulse) [native final] : 

; KSetStayUprightParams (float stiffness, float damping) [native final] : 

; KScaleJointLimits (float scale, float stiffness) [native final] : 

; AllowMusicPlayback (bool Allow) [native final] : 

; int PlayStream (string Song, optional bool UseMusicVolume, optional float Volume, optional float FadeInTime, optional float SeekTime) [native final]
; StopStream (int Handle, optional float FadeOutTime) [native final]
; int SeekStream (int Handle, float Seconds) [native final]
; bool AdjustVolume (int Handle, float NewVolume) [native final]
; bool PauseStream (int Handle) [native final] : Used for playing custom music - not cached, and will not be stopped at level transition.&lt;br /&gt;Song parameter must contain extension, but can be relative or absolute directory, e.g.: &lt;code&gt;PlayStream(&quot;D:\\alongtheway.mp3&quot;,false,1,0,0);&lt;/code&gt;

; TimerPop ([[Legacy:VolumeTimer|VolumeTimer]] T) : Moved from [[Legacy:Volume|Volume]] to [[Legacy:Actor|Actor]].

; bool HealDamage (int Amount, [[Legacy:Controller|Controller]] Healer, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : The opposite of TakeDamage(). Use this function to add health to an actor.

; bool TraceThisActor(out vector HitLocation, out vector HitNormal, vector TraceEnd, vector TraceStart, optional vector Extent) [native final] : Returns True if the trace did not hit the actor it was called for.

; ChangeSpringFeedbackEffect (string EffectName, float CenterX, float CenterY) [native final] : 
; ChangeBaseParamsFeedbackEffect (string EffectName, optional float DirectionX, optional float DirectionY, optional float Gain) [native final] : 

; ResetStaticFilterState() [native final] : Use when change rendering of bStatic actors.

; AddToPackageMap (optional string PackageName) [native final] : Add PackageName to the packagemap as if it was in GameEngine's ServerPackages list. If PackageName is omitted, it adds this actor's package.&lt;br /&gt;This function is only valid during initialization (between [[Legacy:GameInfo|GameInfo]]::InitGame() and [[Legacy:GameInfo|GameInfo]]::SetInitialState()) If called outside of that window, or anytime on a client, the function returns without doing anything.&lt;br /&gt;&lt;b&gt;N.B.&lt;/b&gt; When demorecording (serverside at least), this function will &lt;u&gt;not include packages in the demo!&lt;/u&gt; So for instance, if a package containing a vehicle is added to the package map in this way, that vehicle will NOT SHOW in serverside demo's.

; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [native final static]
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [native final static] : Much faster and, more importantly, static versions of the GetNextInt() and GetNextIntDesc() functions. They will return all entries for the specified MetaClass as a dynamic array.

; HurtRadius (float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation) [simulated] : This function is no longer final, i.e. it can be overridden in subclasses now. E.g. [[Legacy:Projectile|Projectile]] utilizes this fact to implement UT2003's DelayedHurtRadius() function as HurtRadius() now.

; Crash() [static] : Crashes the game via &lt;code&gt;Assert(false)&lt;/code&gt;.

; bool CheckMaxEffectDistance ([[Legacy:PlayerController|PlayerController]] P, vector SpawnLocation) [simulated] : 

; bool SelfTriggered ( ) : 

; bool TeamLink (int TeamNum) : 

; SetDelayedDamageInstigatorController ([[Legacy:Controller|Controller]] C) : 

; bool IsStationary ( ) : For AI. Bots have perfect aim shooting non-pawn stationary targets.

===New events in UT2004===
; ClientTrigger ( ) : Called clientsidely if bClientTrigger changes its value.

; RanInto ([[Legacy:Actor|Actor]] Other) : Called for encroaching actors which successfully moved the other actor out of the way.

; RecoverFromBadStateCode ( ) : 

; bool CheckForErrors() : 

; POVChanged ([[Legacy:PlayerController|PlayerController]] PC, bool bBehindViewChanged) : Called by [[Legacy:PlayerController|PlayerController]] on its current ViewTarget when its ViewTarget and/or bBehindView change.

; NotifyLocalPlayerDead ([[Legacy:PlayerController|PlayerController]] PC) : 

; NotifyLocalPlayerTeamReceived ( ) : Called only if bNotifyLocalPlayerTeamReceived and is a net client when local PlayerController receives PlayerReplicationInfo.Team.

; PawnBaseDied ( ) : This actor is based on a [[Legacy:Pawn|Pawn]] and that Pawn has just died.

==Discussion==

'''Xian:''' About AddToPackageMap(), if I got it right, this Package will be added and be &quot;simulated&quot; as a ServerPackage (so that Clients can use it), correct? Wouldn't it be easier to just set the ServerPackages entries manually and then do ConsoleCommand(&quot;quit&quot;)? Hmm, about that bug, I did notice many similar bugs involving demorec (client or server) so I'd say it has an issue with parts of replication (in my case a variable was not replicated which simulated ViewRotation as an integer rather than a rotator). Does that bug occur if the client has the added package ?

'''Wormbo:''' That's correct, AddToPackageMap() will tell clients to download and use the package during network games, but demo recording still only uses the real ServerPackages list in the server's INI file.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1171</id>
      <timestamp>2006-05-26T13:30:01Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>question about the AddToPackageMap() note</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] (Package: Engine)}}

There are numerous changes, so this page might be missing some of them. The information on this page is based on the [[Legacy:UnrealScript Source|UnrealScript source]] code of UT2003 v2225 and UT2004 v3204.

==Properties==

===Changed in UT2004===
; float NetUpdateTime : This property is no longer const.
; bool bCollideWorld
; bool bBlockPlayers : These properties are no longer displayed in the Collision property group. bBlockPlayers is obsolete now and also no longer replicated.
; bool bNetNotify : This property is no longer displayed in the Advanced property group.
; bool bIgnoreEncroachers : This property is now replicated to clients if the actor can collide with other actors or world geometry.

===New in UT2004===
; float FluidSurfaceShootStrengthMod : If bDisturbFluidSurface is set to True, a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]'s ShootStrength is multiplied by this before doing the ripples.
; bool bNotifyLocalPlayerTeamReceived : Wants NotifyLocalPlayerTeamReceived() calls.
; bool bForceSkelUpdate : Update skeleton (and attached actor positions) even if not rendered.
; bool bClientAuthoritative (const) : Remains ROLE_Authority on client. (only valid for bStatic or bNoDelete actors)
; bool bBlocksTeleport : 
; bool bClientTrigger (changes replicated to clients) : Changes in this value will call the ClientTrigger event clientsidely.
; bool bUseCollisionStaticMesh : 
; bool bNotOnDedServer : Destroy this actor if on dedicated server and [[Legacy:RemoteRole|RemoteRole]] == ROLE_None (emitters, etc.)
; bool bAlreadyPrecachedMaterials : 
; bool bAlreadyPrecachedMeshes : 
; [[Legacy:Material|Material]] HighDetailOverlay : If high detail mode, use this overlay when no other overlay is active.

==Structs==

===Changed in UT2004===
; KSimParams : The MaxKarmaSpeed and MaxRagdollSpeed properties have been removed.

===New in UT2004===

====FireProperties====

&lt;uscript&gt;
struct FireProperties
{
	var class&lt;Ammunition&gt; AmmoClass;
	var class&lt;Projectile&gt; ProjectileClass;
	var float WarnTargetPct;
	var float MaxRange;
	var bool bTossed;
	var bool bTrySplash;
	var bool bLeadTarget;
	var bool bInstantHit;
	var bool bInitialized;
};
&lt;/uscript&gt;

==Enums==
; ESurfaceTypes : This enum now has the additional values EST_Custom00..EST_Custom31 for mods that need custom surface types.

==Methods==

===Removed in UT2004===
; string GetItemName (string FullName)
; ReplaceText (out string Text, string Replace, string With) [final] : These are now static simulated [[Legacy:Global Function|global function]]s. (ReplaceText() is still final, though.)

===Changed in UT2004===
; string ConsoleCommand (string Command, optional bool bWriteToLog) [native] : The new bWriteToLog parameter outputs the console command's results to the game's log file.

; int PlayMusic(string Song, optional float FadeInTime) [native final]
; StopMusic int SongHandle, optional float FadeOutTime) [native final]
; StopAllMusic(optional float FadeOutTime) [native final] : The fading parameters are now optional. These functions are used only for level music in .OGG format and playback is stopped on mapchange.

; string GetURLMap (optional bool bIncludeOptions) [native final] : The bIncludeOptions is new in UT2004.

; TriggerEvent (name EventName, [[Legacy:Actor Other|Actor Other]], [[Legacy:Pawn|Pawn]] EventInstigator) [simulated]
; UntriggerEvent (name EventName, [[Legacy:Actor Other|Actor Other]], [[Legacy:Pawn|Pawn]] EventInstigator) : TriggerEvent is a [[Legacy:Simulated Function|simulated function]] now, i.e. it can be executed on clients as well. Both functions not only (un)trigger dynamic actors, but also static [[Legacy:NavigationPoint|NavigationPoint]]s in UT2004.

===New functions in UT2004===
; CopyObjectToClipboard ([[Legacy:Object|Object]] Obj) [native] : Copy the specified object's properties to the clipboard. The format generated is for pasting into the editor if it's an actor or into the [[Legacy:Default Properties|default properties]] block of a class if it isn't.

; TextToSpeech (string Text, float Volume) [native] : 

; bool ShouldBeHidden ( ) [native final static] : Returns, whether the class has the HideDropDown class modifier. (see [[Legacy:Class Syntax|Class Syntax]])

; bool IsJoinedTo ([[Legacy:Actor|Actor]] Other) [native final] : 

; KAddAngularImpulse (vector AngImpulse) [native final] : 

; KSetStayUprightParams (float stiffness, float damping) [native final] : 

; KScaleJointLimits (float scale, float stiffness) [native final] : 

; AllowMusicPlayback (bool Allow) [native final] : 

; int PlayStream (string Song, optional bool UseMusicVolume, optional float Volume, optional float FadeInTime, optional float SeekTime) [native final]
; StopStream (int Handle, optional float FadeOutTime) [native final]
; int SeekStream (int Handle, float Seconds) [native final]
; bool AdjustVolume (int Handle, float NewVolume) [native final]
; bool PauseStream (int Handle) [native final] : Used for playing custom music - not cached, and will not be stopped at level transition.&lt;br /&gt;Song parameter must contain extension, but can be relative or absolute directory, e.g.: &lt;code&gt;PlayStream(&quot;D:\\alongtheway.mp3&quot;,false,1,0,0);&lt;/code&gt;

; TimerPop ([[Legacy:VolumeTimer|VolumeTimer]] T) : Moved from [[Legacy:Volume|Volume]] to [[Legacy:Actor|Actor]].

; bool HealDamage (int Amount, [[Legacy:Controller|Controller]] Healer, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : The opposite of TakeDamage(). Use this function to add health to an actor.

; bool TraceThisActor(out vector HitLocation, out vector HitNormal, vector TraceEnd, vector TraceStart, optional vector Extent) [native final] : Returns True if the trace did not hit the actor it was called for.

; ChangeSpringFeedbackEffect (string EffectName, float CenterX, float CenterY) [native final] : 
; ChangeBaseParamsFeedbackEffect (string EffectName, optional float DirectionX, optional float DirectionY, optional float Gain) [native final] : 

; ResetStaticFilterState() [native final] : Use when change rendering of bStatic actors.

; AddToPackageMap (optional string PackageName) [native final] : Add PackageName to the packagemap as if it was in GameEngine's ServerPackages list. If PackageName is omitted, it adds this actor's package.&lt;br /&gt;This function is only valid during initialization (between [[Legacy:GameInfo|GameInfo]]::InitGame() and [[Legacy:GameInfo|GameInfo]]::SetInitialState()) If called outside of that window, or anytime on a client, the function returns without doing anything.&lt;br /&gt;&lt;b&gt;N.B.&lt;/b&gt; When demorecording (serverside at least), this function will &lt;u&gt;not include packages in the demo!&lt;/u&gt; So for instance, if a package containing a vehicle is added to the package map in this way, that vehicle will NOT SHOW in serverside demo's.

; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [native final static]
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [native final static] : Much faster and, more importantly, static versions of the GetNextInt() and GetNextIntDesc() functions. They will return all entries for the specified MetaClass as a dynamic array.

; HurtRadius (float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation) [simulated] : This function is no longer final, i.e. it can be overridden in subclasses now. E.g. [[Legacy:Projectile|Projectile]] utilizes this fact to implement UT2003's DelayedHurtRadius() function as HurtRadius() now.

; Crash() [static] : Crashes the game via &lt;code&gt;Assert(false)&lt;/code&gt;.

; bool CheckMaxEffectDistance ([[Legacy:PlayerController|PlayerController]] P, vector SpawnLocation) [simulated] : 

; bool SelfTriggered ( ) : 

; bool TeamLink (int TeamNum) : 

; SetDelayedDamageInstigatorController ([[Legacy:Controller|Controller]] C) : 

; bool IsStationary ( ) : For AI. Bots have perfect aim shooting non-pawn stationary targets.

===New events in UT2004===
; ClientTrigger ( ) : Called clientsidely if bClientTrigger changes its value.

; RanInto ([[Legacy:Actor|Actor]] Other) : Called for encroaching actors which successfully moved the other actor out of the way.

; RecoverFromBadStateCode ( ) : 

; bool CheckForErrors() : 

; POVChanged ([[Legacy:PlayerController|PlayerController]] PC, bool bBehindViewChanged) : Called by [[Legacy:PlayerController|PlayerController]] on its current ViewTarget when its ViewTarget and/or bBehindView change.

; NotifyLocalPlayerDead ([[Legacy:PlayerController|PlayerController]] PC) : 

; NotifyLocalPlayerTeamReceived ( ) : Called only if bNotifyLocalPlayerTeamReceived and is a net client when local PlayerController receives PlayerReplicationInfo.Team.

; PawnBaseDied ( ) : This actor is based on a [[Legacy:Pawn|Pawn]] and that Pawn has just died.

==Discussion==

'''Xian:''' About AddToPackageMap(), if I got it right, this Package will be added and be &quot;simulated&quot; as a ServerPackage (so that Clients can use it), correct? Wouldn't it be easier to just set the ServerPackages entries manually and then do ConsoleCommand(&quot;quit&quot;)? Hmm, about that bug, I did notice many similar bugs involving demorec (client or server) so I'd say it has an issue with parts of replication (in my case a variable was not replicated which simulated ViewRotation as an integer rather than a rotator). Does that bug occur if the client has the added package ?

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Object</title>
    <id>321</id>
    <revision>
      <id>1147</id>
      <timestamp>2002-11-11T20:40:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: Object)}}

(also see [[Legacy:Actor (UT)/Object|Actor (UT)/Object]])

==Inherited From Parent Class ==
; name Name (native, const, editconst) : This native property is declared in the [[Legacy:Object|Object]] class and is available in all classes. (It might be hidden in the editor for some classes, but it's always accessable from UnrealScript.) It can't be changed in the editor or from UnrealScript in the game. It contains the actor's name.

==Declared In This Class ==
; name Group : Specifies the group this actor belongs to. This is only used by the Groups Browser and doesn't affect anything in the game.
; name InitialState : Specified the startup state of this actor. This property doesn't have the same effect on every actor. In fact, for most actors this property doesn't change anything. (see also [[Legacy:InitialState|InitialState]], [[Legacy:State|State]] and the SetInitialState function in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Methods]])</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Properties</title>
    <id>319</id>
    <revision>
      <id>1143</id>
      <timestamp>2006-06-03T17:56:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: None)}}

These are the so-called '''hidden variables'''. They can't be accessed in the [[Legacy:Actor Properties Window|Actor Properties Window]] (but see that page for ways to work around this).

; vector Acceleration : For physics types that move the actor based on its [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Movement|Velocity]], the Acceleration is constantly applied.
; float AccumKarmaAngleError : 
; ActorRenderDataPtr ActorRenderData (const native) : 
; array&lt;[[Legacy:Actor|Actor]]&gt; Attached (const) : Array of actors attached to this actor.

; name AttachmentBone (const) : Name of bone to which actor is attached (if attached to center of base.

; bool bAlreadyPrecachedMaterials : 
; bool bAlreadyPrecachedMeshes : 
; bool bAlwaysRelevant : Always relevant for network.

; bool bAlwaysTick (const) : Update even when players-only.

; bool bAlwaysZeroBoneOffset : If true, offset always zero when attached to skeletalmesh.

; bool bAnimByOwner : Animation dictated by owner.

; [[Legacy:Actor|Actor]] Base (const) : Actor we're standing on.

; bool bBadStateCode : Used for recovering from illegal state transitions (hack)

; bool bBlockPlayers : OBSOLETE - no longer used

; bool bBlockProjectiles : 
; bool bBlocksTeleport : 
; bool bCanBeDamaged : Can take damage.

; bool bClientAnim : Don't replicate any animations - animation done client-side.

; bool bClientAuthoritative (const) : Remains ROLE_Authority on client (only valid for bStatic or bNoDelete actors).

; bool bClientDemoNetFunc (const) : True if we're client-side demo recording and this call originated from the remote.

; bool bClientDemoRecording (const) : True we are currently recording a client-side demo.

; bool bClientTrigger : replicated property used to trigger client side ClientTrigger() event.

; bool bCollideWorld : Collides with the world.

; bool bCompressedPosition : Used by networking code to flag compressed position replication.

; bool bDeleteMe (const) : About to be deleted.

; bool bDemoOwner (const) : Demo recording driver owns this actor.

; bool bDemoRecording (const) : True we are currently demo recording.

; bool bDestroyInPainVolume : Destroy this actor if it enters a pain volume.

; bool bDetailAttachment (const) : If actor is attached to Karma object, only move once a frame regardless of timestep subdivision. Only valid when [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Collision|bCollideActors]] is false.

; bool bDisturbFluidSurface : Cause ripples when in contact with FluidSurface.

; bool bDramaticLighting : 
; bool bEdSnap : Should snap to grid in UnrealEd.

; bool bForceSkelUpdate : Update skeleton (and attached actor positions) even if not rendered.

; bool bHurtEntry : Keep HurtRadius from being reentrant,

; bool bIgnoreOutOfWorld : Don't destroy if enters zone zero.

; bool bIgnoreVehicles : Ignore collisions between vehicles and this actor (only relevant if &lt;code&gt;bIgnoreEncroachers&lt;/code&gt; is false).

; bool bInterpolating : Performing interpolating.

; bool bJustTeleported (const) : Used by engine physics - not valid for scripts.

; bool bLightChanged : Recalculate this light's lighting now.

; bool bNetDirty (transient const) : Set when any attribute is assigned a value in unrealscript,

; bool bNetInitial (const) : Initial network update.

; bool bNetInitialRotation (const) : Should replicate initial rotation.

; bool bNetNotify : The actor wishes to be notified of replication events. The actor gets the simulated function PostNetReceive() called whenever replication occurs, e.g. in Ammunition whenever AmmoAmount gets changed.

; bool bNetOwner (const) : Player owns this actor.

; bool bNetRelevant (const) : Actor is currently relevant. Only valid server side, only when replicating variables.

; bool bNetTemporary (const) : Tear-off simulation in network play.

; bool bNoRepMesh : Don't replicate mesh.

; bool bNotifyLocalPlayerTeamReceived : Wants &lt;code&gt;NotifyLocalPlayerTeamReceived()&lt;/code&gt;

; bool bNotOnDedServer : Destroy if on dedicated server and &lt;code&gt;RemoteRole== ROLE_None&lt;/code&gt; (emitters, etc.)

; bool bObsolete : Actor is obsolete - warn level designers to remove it.

; bool bOnlyAffectPawns (const) : Optimisation - only test overlap against [[Legacy:Pawn|Pawn]]s. Used for influences etc.

; bool bOnlyDirtyReplication : If true, only replicate actor if &lt;code&gt;bNetDirty&lt;/code&gt; is true - useful if no C++ changed attributes (such as physics)&lt;br /&gt;

; bool bOnlyDrawIfAttached : Don't draw this actor if not attached (useful for net clients where attached actors and their bases' replication may not be synched).

; bool bOnlyOwnerSee : Only owner can see this actor.

; bool bOnlyRelevantToOwner : This actor is only relevant to its owner.

; bool bOrientOnSlope : When landing, orient base on slope of floor.

; bool bOwnerNoSee : Everything but the owner can see this actor.

; bool bPathTemp (transient) : Internal/path building.

; bool bPendingDelete : Set when actor is about to be deleted (since endstate and other functions called during deletion process before &lt;code&gt;bDeleteMe&lt;/code&gt; is set).

; bool bRepClientDemo (const) : True if remote client is recording demo.

; bool bReplicateAnimations : Should replicate SimAnim.

; bool bReplicateInstigator : Replicate instigator to client (used by bNetTemporary projectiles).

; bool bReplicateMovement : If true, replicate movement/location related properties.

; [[Legacy:Model|Model]] Brush (const export) : Used by [[Legacy:Brush|Brush]] subclass actors with &lt;code&gt;DrawType=DT_Brush&lt;/code&gt;. The Model object is the actual shape of the brush.

; bool bScriptInitialized : Set to prevent re-initializing of actors spawned during level startup

; bool bSelected (const) : Selected in UnrealEd.

; bool bShouldStopKarma (transient const) : 
; bool bShowOctreeNodes : 
; bool bSkipActorPropertyReplication : f true, don't replicate actor class variables for this actor.

; bool bSmoothKarmaStateUpdates : When true, karma state updates will be smoothly interpolated.

; bool bStatic (const) : Does not move or change over time. Level designers should not change this, it will screw up net play.

; bool bTearOff : If true, this actor is no longer replicated to new clients, and is &quot;torn off&quot; (becomes a &lt;code&gt;ROLE_Authority&lt;/code&gt;) on clients to which it was being replicated.

; bool bTempEditor : 
; bool bTicked (transient const) : Actor has been updated.

; bool bTimerLoop : Timer loops (else is one-shot).

; bool bTraceWater : If true, &lt;code&gt;trace()&lt;/code&gt; by this actor returns collisions with water volumes.

; bool bTrailerAllowRotation : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and want independent rotation control.

; bool bTrailerPrePivot : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and true, offset from owner by &lt;code&gt;PrePivot&lt;/code&gt;.

; bool bTrailerSameRotation : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and true, have same rotation as owner.

; bool bTravel : Actor is capable of travelling among servers.

; bool bUpdateSimulatedPosition : f true, update velocity/location after initialization for simulated proxies.

; bool bUseCollisionStaticMesh : 
; bool bWasSNFiltered : Mainly for debugging - the way this actor was inserted into Octree.

; bool bWorldGeometry : Collision and Physics treats this actor as world geometry.

; Matrix CachedLocalToWorld : 
; vector CachedLocation (const) : 
; rotator CachedRotation (const) : 
; int CollisionTag (const native) : 
; vector ColLocation (const) : Actor's old location one move ago. Only for debugging.

; [[Legacy:Actor|Actor]] Deleted (const) : Next actor in just-deleted chain. (not accessible through UnrealScript)

; float FluidSurfaceShootStrengthMod : If &lt;code&gt;bDisturbFluidSurface== true&lt;/code&gt;, FluidSurface's ShootStrength is multiplied by this before doing the ripples.

; Matrix HardRelMatrix (const) : Transform of actor in base's ref frame. Doesn't change after SetBase.

; [[Legacy:Material|Material]] HighDetailOverlay : If high detail mode, use this overlay when no other overlay is active.

; [[Legacy:Pawn|Pawn]] Instigator : Pawn responsible for damage caused by this actor.

; [[Legacy:Inventory|Inventory]] Inventory : This actor's Inventory chain. Usually used by [[Legacy:Pawn|Pawn]]s to store the player's inventory and by the [[Legacy:Inventory|Inventory]] class itself to build the linked list of inventory items.

; int JoinedTag (const transient) : 
; int KStepTag (const native) : 
; float LastRenderTime (transient) : Last time this actor was rendered.

; float LatentFloat (const) : Internal latent function use.

; array&lt;int&gt; Leaves (transient) : BSP leaves this actor is in.

; LevelInfo Level (const) : Level this actor is on.

; LightRenderDataPtr LightRenderData (const native) : 
; [[Legacy:MeshInstance|MeshInstance]] MeshInstance (transient) : Mesh instance.

; class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; MessageClass : A LocalMessage class associated with this actor.
; float NetPriority : Higher priorities means update it more frequently.

; int NetTag (const transient) : 
; float NetUpdateFrequency : How many net updates per seconds.

; float NetUpdateTime : Time of last update

; Box OctreeBox (const transient) : Actor bounding box cached when added to Octree. Internal use only.

; vector OctreeBoxCenter (const transient) : 
; vector OctreeBoxRadii (const transient) : 
; array&lt;pointer&gt; OctreeNodes (const transient) : Array of nodes of the octree Actor is currently in. Internal use only.

; [[Legacy:Actor|Actor]] Owner : Owner actor.

; [[Legacy:Actor|Actor]] PendingTouch : Actor touched during move which wants to add an effect after the movement completes.

; [[Legacy:PhysicsVolume|PhysicsVolume]] PhysicsVolume (const) : physics volume this actor is currently in.

; array&lt;ProjectorRenderInfoPtr&gt; Projectors (const native) : Projected textures on this actor.

; PointRegion Region (const) : A struct describing the region this actor is in. Oly one property in this struct is commonly used: &lt;tt&gt;Region.Zone&lt;/tt&gt; references the [[Legacy:ZoneInfo|ZoneInfo]] of the [[Legacy:Zone|zone]] containing the actor. 

; vector RelativeLocation (const) : Location relative to base/bone (valid if base exists).

; rotator RelativeRotation (const) : Rotation relative to base/bone (valid if base exists).

; ENetRole RemoteRole : Remote network role. See [[Legacy:Role|Role]].
; int RenderRevision (const native) : 
; [[Legacy:Material|Material]] RepSkin : Replicated skin (sets Skins[0] if not none)

; ENetRole Role : Local network role. See [[Legacy:Role|Role]].
; AnimRep SimAnim : Only replicated if &lt;code&gt;bReplicateAnimations&lt;/code&gt; is true

; EFilterState StaticFilterState : 
; [[Legacy:StaticMeshInstance|StaticMeshInstance]] StaticMeshInstance : Contains per-instance static mesh data, like static lighting data.

; array&lt;StaticMeshProjectorRenderInfoPtr&gt; StaticMeshProjectors (const native) : 
; array&lt;BatchReference&gt; StaticSectionBatches (const, native) : 
; float TimerCounter (const) : Counts up until it reaches TimerRate.

; float TimerRate : Timer event, 0=no timer.

; array&lt;[[Legacy:Actor|Actor]]&gt; Touching (const) : List of touching actors.

; [[Legacy:Level|Level]] XLevel (transient const) : The Level object. (not to be confused with the [[Legacy:LevelInfo|LevelInfo]] actor accessible through the &lt;tt&gt;Level&lt;/tt&gt; property.</text>
    </revision>
    <revision>
      <id>1144</id>
      <timestamp>2006-06-03T15:48:24Z</timestamp>
      <contributor>
        <ip>Smattbac</ip>
      </contributor>
      <comment>Added bWorldGeometry</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property Group: None)}}

These are the so-called '''hidden variables'''. They can't be accessed in the [[Legacy:Actor Properties Window|Actor Properties Window]] (but see that page for ways to work around this).

; bStatic : When set to True, the actor will not be ticked, can't be spawned or destroyed in the game and will be excluded from the DynamicActors() [[Legacy:Iterator|iterator]]. In particular this means the actor can't use Tick, Timer, Trigger (in UT2003) or [[Legacy:State|state]]s.

; Pawn Instigator : Pawn responsible for damage caused by this actor. ?? Except in [[Legacy:Trigger|Trigger]], the message is sent to Owner.Instigator??

; Inventory : The first member of the [[Legacy:Inventory|Inventory]] chain. This is a [[Legacy:Linked List|linked list]] of all a [[Legacy:Pawn|Pawn]]'s inventory. It works like this: the Pawn's Inventory property is item 1, item 1's Inventory property is item 2, etc.

; Owner : The Owner of an actor is usually the [[Legacy:Actor|Actor]] that created it. The best example of Owner is a [[Legacy:Weapon|Weapon]]'s Owner is the Pawn that holds it (or the controller, not sure). Can be changed by the function SetOwner(), and the 2nd parameter of Spawn().

; bWorldGeometry : Collision and Physics treats the actor as world geometry.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Replication</title>
    <id>333</id>
    <revision>
      <id>1172</id>
      <timestamp>2006-01-19T04:56:21Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <minor/>
      <comment>Added Related Topics Section</comment>
      <text xml:space="preserve">This page describes the properties of [[Legacy:Actor|Actor]] that have bearing on the behavior of [[Legacy:Replication|Replication]]

; NetPriority : This floating-point value is used to determine how much network bandwidth is allocated for keeping the actor up-to-date across the network.  The ratio of an actor's NetPriority and another actor's NetPriority is the same ratio as the bandwidth that will be allocated to each.  The default value for actors is 1.00 (Checked in UT99 and in UT2004).

; NetUpdateFrequency : 
NetUpdateFrequency allows you to throttle back the amount of network traffic generated to keep an actor up-to-date.  This is useful when the data changes frequently but you only want periodic updates.  For example, PlayerReplicationInfo contains a lot of data about the client.  Stuff like the various players' pings may change quite frequently, and having the client keep track of such information would be quite a network hog.  But since PlayerReplicationInfo has a NetUpdateFrequency of 2, it is only updated twice a second, which is much better for that player's, and of course the server's, bandwidth. 

Here are some example NetUpdateFrequencies for some UT2004 classes:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Class'''
| style=&quot;text-align: center&quot; |'''NetUpdateFrequency''' 
|-
| style=&quot;text-align: center&quot; |Actor
| style=&quot;text-align: center&quot; |100 Hz 
|-
| style=&quot;text-align: center&quot; |Pawn
| style=&quot;text-align: center&quot; |100 Hz when possessed, or 5 Hz when unpossessed 
|-
| style=&quot;text-align: center&quot; |Mover
| style=&quot;text-align: center&quot; |1 Hz 
|-
| style=&quot;text-align: center&quot; |Pickup
| style=&quot;text-align: center&quot; |0.1 Hz, or 8 Hz when just dropped 
|-
| style=&quot;text-align: center&quot; |PlayerReplicationInfo
| style=&quot;text-align: center&quot; |1 Hz 
|}

As you can see from the table, it's perfectly fine to alter the actor's NetUpdateFrequency to reflect periods of increased or decreased activity.


; bNoRepMesh : don't replicate mesh

; bNotOnDedServer : destroy if on dedicated server and RemoteRole == ROLE_None (emitters, etc.)

The following '''const bool''' flags are maintained by the engine and are only relevant [[Legacy:Replication Block|during replication]]:

; bNetInitial : It is true if this is the first time this actor has been replicated to the client.  It is false otherwise.  This is useful for things like projectiles that only need to have their location and velocity replicated once and their movement can then be predicted reliably.

; bNetOwner : Indicates whether the client we are considering replicating to is the owner of the actor we are replicating. 

; bNetRelevant : Only valid server side, indicates that the server considers the actor [[Legacy:Relevance|relevant]] to the client.

; bDemoRecording : Are we currently demo recording?

; bClientDemoRecording : True if we are currently recording a client-side demo
; bRepClientDemo : True if remote client is recording demo
; bClientDemoNetFunc : True if we're client-side demo recording and this call originated from the remote.
; bDemoOwner : Demo recording driver owns this actor.

==Related Topics==
* [[Legacy:Actor|Actor]] class, which contains the properties governing replication behaviour
* [[Legacy:Introduction To Replication|Introduction to Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]
* [[Legacy:Simulated Function|Simulated Function]]
* [[Legacy:Replicated Function|Replicated Function]]
* [[Legacy:Animation Replication|Animation Replication]]
* [[Legacy:Another Look At Replication|Another Look At Replication]]
* [[Legacy:Replication Examples|Replication examples]]
** [[Legacy:Replication Examples/Battle City|Replication Examples/Battle City]]
** [[Legacy:Replication Examples/Giant Spider Execution|Replication Examples/Giant Spider Execution]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1173</id>
      <timestamp>2005-12-11T10:01:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page describes the properties of [[Legacy:Actor|Actor]] that have bearing on the behavior of [[Legacy:Replication|Replication]]

; NetPriority : This floating-point value is used to determine how much network bandwidth is allocated for keeping the actor up-to-date across the network.  The ratio of an actor's NetPriority and another actor's NetPriority is the same ratio as the bandwidth that will be allocated to each.  The default value for actors in UT'99 v4.36 is 1.00.

; NetUpdateFrequency : 
NetUpdateFrequency allows you to throttle back the amount of network traffic generated to keep an actor up-to-date.  This is useful when the data changes frequently but you only want periodic updates.  For example, PlayerReplicationInfo contains a lot of data about the client.  Stuff like the various players' pings may change quite frequently, and having the client keep track of such information would be quite a network hog.  But since PlayerReplicationInfo has a NetUpdateFrequency of 2, it is only updated twice a second, which is much better for that player's, and of course the server's, bandwidth. 

Here are some example NetUpdateFrequencies for some UT99 classes:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''UT'99 class'''
| style=&quot;text-align: center&quot; |'''NetUpdateFrequency ''' 
|-
| style=&quot;text-align: center&quot; |Actor
| style=&quot;text-align: center&quot; |100 Hz 
|-
| style=&quot;text-align: center&quot; |Inventory
| style=&quot;text-align: center&quot; |8 Hz 
|-
| style=&quot;text-align: center&quot; |ZoneInfo
| style=&quot;text-align: center&quot; |4 Hz 
|-
| style=&quot;text-align: center&quot; |GameReplicationInfo
| style=&quot;text-align: center&quot; |4 Hz 
|-
| style=&quot;text-align: center&quot; |PlayerReplicationInfo
| style=&quot;text-align: center&quot; |2 Hz 
|}


; bNoRepMesh : don't replicate mesh

; bNotOnDedServer : destroy if on dedicated server and RemoteRole == ROLE_None (emitters, etc.)

The following '''const bool''' flags are maintained by the engine and are only relevant [[Legacy:Replication Block|during replication]]:

; bNetInitial : It is true if this is the first time this actor has been replicated to the client.  It is false otherwise.  This is useful for things like projectiles that only need to have their location and velocity replicated once and their movement can then be predicted reliably.

; bNetOwner : Indicates whether the client we are considering replicating to is the owner of the actor we are replicating. 

; bNetRelevant : Only valid server side, indicates that the server considers the actor [[Legacy:Relevance|relevant]] to the client.

; bDemoRecording : Are we currently demo recording?

; bClientDemoRecording : True if we are currently recording a client-side demo
; bRepClientDemo : True if remote client is recording demo
; bClientDemoNetFunc : True if we're client-side demo recording and this call originated from the remote.
; bDemoOwner : Demo recording driver owns this actor.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1174</id>
      <timestamp>2005-12-11T21:18:31Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page describes the properties of [[Legacy:Actor|Actor]] that have bearing on the behavior of [[Legacy:Replication|Replication]]

; NetPriority : This floating-point value is used to determine how much network bandwidth is allocated for keeping the actor up-to-date across the network.  The ratio of an actor's NetPriority and another actor's NetPriority is the same ratio as the bandwidth that will be allocated to each.  The default value for actors is 1.00 (Checked in UT99 and in UT2004).

; NetUpdateFrequency : 
NetUpdateFrequency allows you to throttle back the amount of network traffic generated to keep an actor up-to-date.  This is useful when the data changes frequently but you only want periodic updates.  For example, PlayerReplicationInfo contains a lot of data about the client.  Stuff like the various players' pings may change quite frequently, and having the client keep track of such information would be quite a network hog.  But since PlayerReplicationInfo has a NetUpdateFrequency of 2, it is only updated twice a second, which is much better for that player's, and of course the server's, bandwidth. 

Here are some example NetUpdateFrequencies for some UT2004 classes:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Class'''
| style=&quot;text-align: center&quot; |'''NetUpdateFrequency''' 
|-
| style=&quot;text-align: center&quot; |Actor
| style=&quot;text-align: center&quot; |100 Hz 
|-
| style=&quot;text-align: center&quot; |Pawn
| style=&quot;text-align: center&quot; |100 Hz when possessed, or 5 Hz when unpossessed 
|-
| style=&quot;text-align: center&quot; |Mover
| style=&quot;text-align: center&quot; |1 Hz 
|-
| style=&quot;text-align: center&quot; |Pickup
| style=&quot;text-align: center&quot; |0.1 Hz, or 8 Hz when just dropped 
|-
| style=&quot;text-align: center&quot; |PlayerReplicationInfo
| style=&quot;text-align: center&quot; |1 Hz 
|}

As you can see from the table, it's perfectly fine to alter the actor's NetUpdateFrequency to reflect periods of increased or decreased activity.


; bNoRepMesh : don't replicate mesh

; bNotOnDedServer : destroy if on dedicated server and RemoteRole == ROLE_None (emitters, etc.)

The following '''const bool''' flags are maintained by the engine and are only relevant [[Legacy:Replication Block|during replication]]:

; bNetInitial : It is true if this is the first time this actor has been replicated to the client.  It is false otherwise.  This is useful for things like projectiles that only need to have their location and velocity replicated once and their movement can then be predicted reliably.

; bNetOwner : Indicates whether the client we are considering replicating to is the owner of the actor we are replicating. 

; bNetRelevant : Only valid server side, indicates that the server considers the actor [[Legacy:Relevance|relevant]] to the client.

; bDemoRecording : Are we currently demo recording?

; bClientDemoRecording : True if we are currently recording a client-side demo
; bRepClientDemo : True if remote client is recording demo
; bClientDemoNetFunc : True if we're client-side demo recording and this call originated from the remote.
; bDemoOwner : Demo recording driver owns this actor.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Sound</title>
    <id>330</id>
    <revision>
      <id>1166</id>
      <timestamp>2005-12-17T21:44:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property group: Sound)}}

(see also [[Legacy:Actor (UT)/Sound|Actor (UT)/Sound]])

; sound AmbientSound: The single ambient sound effect that is associated with this actor.  Assigning a [[Legacy:Sound|Sound]] instance to this property will automagically begin looped playback.  Assign it to None to stop playback.

; float SoundRadius: The radius of ambient sound.

; byte SoundVolume: The volume of ambient sound as a value between 0 and 255 with 255 being the maximum volume.

; byte SoundPitch: Sound pitch shift, 64.0=none.

; ESoundOcclusion SoundOcclusion: One of the [[Legacy:Actor/Enums|Actor/Enums]] which controls sound occlusion approach.

; bool bFullVolume: Whether to apply ambient attenuation.

; float TransientSoundVolume: Default sound volume used in the PlaySound method (see [[Legacy:Actor/Methods|Actor/Methods]]).

; float TransientSoundRadius: Default sound radius used in the PlaySound method (see [[Legacy:Actor/Methods|Actor/Methods]]).

==Related Topics==
* [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Sound|Sound]]
* [[Legacy:Sounds|Sounds]]</text>
    </revision>
    <revision>
      <id>1167</id>
      <timestamp>2003-07-29T06:34:07Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>Blah... someone had to do it.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Property group: Sound)}}

(see also [[Legacy:Actor (UT)/Sound|Actor (UT)/Sound]])

; sound AmbientSound: The single ambient sound effect that is associated with this actor.  Assigning a [[Legacy:Sound|Sound]] instance to this property will automagically begin looped playback.  Assign it to None to stop playback.

; float SoundRadius: The radius of ambient sound.

; byte SoundVolume: The volume of ambient sound as a value between 0 and 255 with 255 being the maximum volume.

; byte SoundPitch: Sound pitch shift, 64.0=none.

; ESoundOcclusion SoundOcclusion: One of the [[Legacy:Actor/Enums|Actor/Enums]] which controls sound occlusion approach.

; bool bFullVolume: Whether to apply ambient attenuation.

; float TransientSoundVolume: Default sound volume used in the PlaySound method (see [[Legacy:Actor/Methods|Actor/Methods]]).

; float TransientSoundRadius: Default sound radius used in the PlaySound method (see [[Legacy:Actor/Methods|Actor/Methods]]).

==Related Topics ==
* [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Sound|Sound]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actor/Structs</title>
    <id>328</id>
    <revision>
      <id>1161</id>
      <timestamp>2008-02-12T12:25:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to category</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Structs)}}

See [[Legacy:Built-In Struct|Built-In Struct]] for more (and probably more useful) structs that can be used in [[Legacy:Actor|Actor]] classes.

===ActorRenderDataPtr  ===

&lt;uscript&gt;
struct ActorRenderDataPtr { var pointer Ptr; };
&lt;/uscript&gt;

===AnimRep ===

[[Legacy:Animation Replication|Animation replication]] (can be used to replicate channel 0 anims for dumb proxies)

&lt;uscript&gt;
struct AnimRep
{
	var name AnimSequence; 
	var bool bAnimLoop;	
	var byte AnimRate;		// note that with compression, max replicated animrate is 4.0
	var byte AnimFrame;
	var byte TweenRate;		// note that with compression, max replicated tweentime is 4 seconds
};
&lt;/uscript&gt;

===BatchReference===

&lt;uscript&gt;
struct BatchReference
{
	var int	BatchIndex,
			ElementIndex;
};
&lt;/uscript&gt;

===KBVect ===

Used to avoid compression.

&lt;uscript&gt;
struct KRBVec
{
	var float	X, Y, Z;
};
&lt;/uscript&gt;

===KRigidBodyState ===

&lt;uscript&gt;
struct KRigidBodyState
{
	var KRBVec	Position;
	var Quat	Quaternion;
	var KRBVec	LinVel;
	var KRBVec	AngVel;
};
&lt;/uscript&gt;

===LightRenderDataPtr ===

&lt;uscript&gt;
struct LightRenderDataPtr { var pointer Ptr; };
&lt;/uscript&gt;

===PointRegion ===

Identifies a unique convex volume in the world.

&lt;uscript&gt;
struct PointRegion
{
	var zoneinfo Zone;       // Zone.
	var int      iLeaf;      // Bsp leaf.
	var byte     ZoneNumber; // Zone number.
};
&lt;/uscript&gt;

===ProjectorRenderInfoPtr ===

&lt;uscript&gt;
struct ProjectorRenderInfoPtr { var pointer Ptr; };	// Hack to to fool C++ header generation...
&lt;/uscript&gt;

===StaticMeshProjectorRenderInfoPtr ===

&lt;uscript&gt;
struct StaticMeshProjectorRenderInfoPtr { var pointer Ptr; };
&lt;/uscript&gt;

[[Category:Legacy Struct|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1162</id>
      <timestamp>2002-11-14T12:36:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]  (Structs)}}

See [[Legacy:Built-In Struct|Built-In Struct]] for more (and probably more useful) structs that can be used in [[Legacy:Actor|Actor]] classes.

===ActorRenderDataPtr  ===

&lt;uscript&gt;
struct ActorRenderDataPtr { var int Ptr; };
&lt;/uscript&gt;

===AnimRep ===

Animation replication (can be used to replicate channel 0 anims for dumb proxies)

&lt;uscript&gt;
struct AnimRep
{
	var name AnimSequence; 
	var bool bAnimLoop;	
	var byte AnimRate;		// note that with compression, max replicated animrate is 4.0
	var byte AnimFrame;
	var byte TweenRate;		// note that with compression, max replicated tweentime is 4 seconds
};
&lt;/uscript&gt;

===BatchReference===

&lt;uscript&gt;
struct BatchReference
{
	var int	BatchIndex,
			ElementIndex;
};
&lt;/uscript&gt;

===KBVect ===

Used to avoid compression.

&lt;uscript&gt;
struct KRBVec
{
	var float	X, Y, Z;
};
&lt;/uscript&gt;

===KRigidBodyState ===

&lt;uscript&gt;
struct KRigidBodyState
{
	var KRBVec	Position;
	var Quat	Quaternion;
	var KRBVec	LinVel;
	var KRBVec	AngVel;
};
&lt;/uscript&gt;

===LightRenderDataPtr ===

&lt;uscript&gt;
struct LightRenderDataPtr { var int Ptr; };
&lt;/uscript&gt;

===PointRegion ===

Identifies a unique convex volume in the world.

&lt;uscript&gt;
struct PointRegion
{
	var zoneinfo Zone;       // Zone.
	var int      iLeaf;      // Bsp leaf.
	var byte     ZoneNumber; // Zone number.
};
&lt;/uscript&gt;

===ProjectorRenderInfoPtr ===

&lt;uscript&gt;
struct ProjectorRenderInfoPtr { var int Ptr; };	// Hack to to fool C++ header generation...
&lt;/uscript&gt;

===StaticMeshProjectorRenderInfoPtr ===

&lt;uscript&gt;
struct StaticMeshProjectorRenderInfoPtr { var int Ptr; };
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ActorAttacher</title>
    <id>335</id>
    <revision>
      <id>1178</id>
      <timestamp>2007-11-17T23:24:39Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; ActorAttacher}}

The ActorAttacher is a special third party actor by [[Legacy:ElBundee|ElBundee]] to attach [[Legacy:Actor|Actor]]s (such as pickups or decoration) to any movers. The reason not to do this using an [[Legacy:AttachMover|AttachMover]] is that this will work fine for the yaw of the mover but not for the pitch or roll of a rotating mover.

[http://www.unrealplayground.com/forums/showthread.php?p=470832&amp;mode=linear ActorAttacher.zip]  (3 kB)

or you can find it embedded in JB-Mafia's MyLevel

also CTF-Assidaria.zip, DM-1on1-Darkwalls.zip as ActorAttacher.u

==ActorAttacher Properties ==

The additional properties of the ActorAttacher are

; ActorName[8]: One ActorAttacher can handle up to 8 [[Legacy:Actor|Actor]]s which can be attached to a mover. These are the names of these Actors which can be found in the &lt;tt&gt;Name&lt;/tt&gt; property (group ''Object'' in the property sheet).

; bMoveX, bMoveY, bMoveZ: Set to true if the attached Actors are supposed to follow the movement of the mover for these axes.

;bRotatePitch, bRotateYaw, bRotateRoll: Set to true if the attached Actors are supposed to follow the rotation of the mover for these axes.

;MoverName:The name of the mover the Actors are attached to which can be found in the &lt;tt&gt;Name&lt;/tt&gt; property (group ''Object'' in the property sheet).

==Discussion.==

'''vitaloverdose''' is it just me or is the link to the zipfile dead ? the file im downloading is unopenable.
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1179</id>
      <timestamp>2006-09-01T16:08:40Z</timestamp>
      <contributor>
        <ip>Torin</ip>
      </contributor>
      <comment>new download link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; ActorAttacher}}

The ActorAttacher is a special third party actor by [[Legacy:ElBundee|ElBundee]] to attach [[Legacy:Actor|Actor]]s (such as pickups or decoration) to any movers. The reason not to do this using an [[Legacy:AttachMover|AttachMover]] is that this will work fine for the yaw of the mover but not for the pitch or roll of a rotating mover.

[http://www.unrealplayground.com/forums/showthread.php?p=470832&amp;mode=linear ActorAttacher.zip]  (3 kB)

or you can find it embedded in JB-Mafia's MyLevel

also CTF-Assidaria.zip, DM-1on1-Darkwalls.zip as ActorAttacher.u

==ActorAttacher Properties ==

The additional properties of the ActorAttacher are

; ActorName[8]: One ActorAttacher can handle up to 8 [[Legacy:Actor|Actor]]s which can be attached to a mover. These are the names of these Actors which can be found in the &lt;tt&gt;Name&lt;/tt&gt; property (group ''Object'' in the property sheet).

; bMoveX, bMoveY, bMoveZ: Set to true if the attached Actors are supposed to follow the movement of the mover for these axes.

;bRotatePitch, bRotateYaw, bRotateRoll: Set to true if the attached Actors are supposed to follow the rotation of the mover for these axes.

;MoverName:The name of the mover the Actors are attached to which can be found in the &lt;tt&gt;Name&lt;/tt&gt; property (group ''Object'' in the property sheet).

----

===Discussion.===

'''vitaloverdose''' is it just me or is the link to the zipfile dead ? the file im downloading is unopenable.
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ActorComponent</title>
    <id>28396</id>
    <revision>
      <id>40068</id>
      <timestamp>2009-11-15T08:24:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ActorX</title>
    <id>384</id>
    <revision>
      <id>1296</id>
      <timestamp>2007-05-13T21:35:14Z</timestamp>
      <contributor>
        <ip>Cpe-76-168-77-153.socal.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">ActorX is a plugin available for [[Legacy:3D Studio Max|3D Studio Max]],[[Legacy:Maya|Maya]] and [[Legacy:Softimage_XSI|Softimage_XSI]] , which can be used to export skeletal animations.

==Related Pages at the UDN==
* [[udn2:ActorX]] download
* [[udn2:UnrealModeling]] &amp;ndash; Unreal Modeling Guide
* [[udn2:ActorXMaxTutorial]] &amp;ndash; How to export animations using ActorX and Max
* [[udn2:ActorXMayaTutorial]] &amp;ndash; How to export animations using ActorX and Maya
* [[udn2:ActorXXSITutorial]] &amp;ndash; Overview of the ActorX Plug-In XSI, Usage which points to ActorX for Maya tutorial, Script interface
* [[udn2:SkeletalSetup]] &amp;ndash; Preparing a Character for use with the Unreal Skeletal Animation System

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1297</id>
      <timestamp>2006-02-16T21:30:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>google is your friend...</comment>
      <text xml:space="preserve">ActorX is a plugin available for [[Legacy:3D Studio Max|3D Studio Max]] and [[Legacy:Maya|Maya]], which can be used to export skeletal animations.

==Related Pages at the UDN==
* [[udn2:ActorX]] download
* [[udn2:UnrealModeling]] &amp;ndash; Unreal Modeling Guide
* [[udn2:ActorXMaxTutorial]] &amp;ndash; How to export animations using ActorX and Max
* [[udn2:ActorXMayaTutorial]] &amp;ndash; How to export animations using ActorX and Maya
* [[udn2:SkeletalSetup]] &amp;ndash; Preparing a Character for use with the Unreal Skeletal Animation System

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1298</id>
      <timestamp>2007-05-13T21:29:37Z</timestamp>
      <contributor>
        <ip>Cpe-76-168-77-153.socal.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">ActorX is a plugin available for [[Legacy:3D Studio Max|3D Studio Max]] and [[Legacy:Maya|Maya]], which can be used to export skeletal animations.

==Related Pages at the UDN==
* [[udn2:ActorX]] download
* [[udn2:UnrealModeling]] &amp;ndash; Unreal Modeling Guide
* [[udn2:ActorXMaxTutorial]] &amp;ndash; How to export animations using ActorX and Max
* [[udn2:ActorXMayaTutorial]] &amp;ndash; How to export animations using ActorX and Maya
* [[udn2:ActorXXSITutorial]] &amp;ndash; Overview of the Plug-In, Usage which points to ActorX for Maya tutorial, Script interface
* [[udn2:SkeletalSetup]] &amp;ndash; Preparing a Character for use with the Unreal Skeletal Animation System

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Actors Snap By Default</title>
    <id>500</id>
    <revision>
      <id>1582</id>
      <timestamp>2005-10-24T17:43:46Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In order to make actors snap to the grid by default, (I think only a few of them do) so that when you add an actor to your map, it snaps to the grid without you having to go into it's properties and change it every time you add it, you can make actors snap to the grid as soon as you add them, without having to change anything! Whee! &lt;br /&gt;Read more about the [[Legacy:Snap To Grid|Snap To Grid]] feature.

----

===The procedure to do this is as follows:===

Note: this page was written for UnrealEd 3.0 for UT2004. I'm not sure if this procedure is the same for other versions.

[[Image:Legacy_SaveButton.jpeg|right|The button to save the actor's default properties]]

1. In the actor browser, RT click the actor you wish to snap to grid by default, and select &quot;Default Properties.&quot;

2. When the property page opens, open the &quot;Advanced&quot; tab, and change the property &quot;bEdShouldSnap&quot; to &quot;True&quot;.

3. Next, this property change must be saved. If you do not save the property change, the next time you load UnrealED, your change will be lost, of course, and actors you add will not snap to the grid (except one you've already added to your map, they're properties are saved with the map.)

4. Back in the actor browser, click the &quot;save&quot; button in the toolbar at the top of the browser.

O.K. You're done. To test this property change, close and re-open UnrealEd, and add the actor whose properties you have modified. If it snaps to the grid, then Success! Otherwise, make sure you have added the actor you changed, or try the above procedure again.

----

Note: this procedure does not make all actors snap to the grid by default, only the one whose properties you edited. It must be repeted for each actor that you want to snap to grid by default.

==Related Links==

[[Legacy:Snap To Grid|Snap To Grid]]

==Discussion==

'''Bob_The_Beheader:''' O.K. people, this is the first page I've made for the Wiki. I hope it's adaquite. One question, however&amp;ndash;Why don't actors snap to the grid by default anyways? It seems like a good idea to me, and it's easier for centering stuff like centering a SkyBoxInfo in it's box and other stuff.

'''Tarquin:''' whoa... isn't this a case of [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]]?

'''Wormbo:''' Yes it is. Never modify and save the defaults of actors.

'''Tarquin:''' What should we do with this page? Fold some of it into the pages on the [[Legacy:Grid|grid]]?

'''Bob_The_Beheader:''' Well, I've used this procedure and saved the bEdShouldSnap property for at least several actors, and nothing bad has come of it. I think because the bEdShouldSnap property is not something used by the game, and has no real effect on the inner workings of the actor. I have noticed, however, that the AntiTCC anti cheating mutator looks at me for a suspiciously long time on my favorite UT server. This is probably because of something else, however. ;)

'''Evilmrfrank:''' Just changing the above from editor 2 to editor 3
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1583</id>
      <timestamp>2005-10-16T21:57:08Z</timestamp>
      <contributor>
        <ip>Evilmrfrank</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In order to make actors snap to the grid by default, (I think only a few of them do) so that when you add an actor to your map, it snaps to the grid without you having to go into it's properties and change it every time you add it, you can make actors snap to the grid as soon as you add them, without having to change anything! Whee! &lt;br /&gt;Read more about the [[Legacy:Snap To Grid|Snap To Grid]] feature.

----

===The procedure to do this is as follows:===

Note: this page was written for UnrealEd 3.0 for UT2004. I'm not sure if this procedure is the same for other versions.

[[Image:Legacy_SaveButton.jpeg|right|The button to save the actor's default properties]]

1. In the actor browser, RT click the actor you wish to snap to grid by default, and select &quot;Default Properties.&quot;

2. When the property page opens, open the &quot;Advanced&quot; tab, and change the property &quot;bEdShouldSnap&quot; to &quot;True&quot;.

3. Next, this property change must be saved. If you do not save the property change, the next time you load UnrealED, your change will be lost, of course, and actors you add will not snap to the grid (except one you've already added to your map, they're properties are saved with the map.)

4. Back in the actor browser, click the &quot;save&quot; button in the toolbar at the top of the browser.

O.K. You're done. To test this property change, close and re-open UnrealEd, and add the actor whose properties you have modified. If it snaps to the grid, then Success! Otherwise, make sure you have added the actor you changed, or try the above procedure again.

----

Note: this procedure does not make all actors snap to the grid by default, only the one whose properties you edited. It must be repeted for each actor that you want to snap to grid by default.

==Related Links==

[[Legacy:Snap To Grid|Snap To Grid]]

==Discussion==

'''Bob_The_Beheader:''' O.K. people, this is the first page I've made for the Wiki. I hope it's adaquite. One question, however&amp;ndash;Why don't actors snap to the grid by default anyways? It seems like a good idea to me, and it's easier for centering stuff like centering a SkyBoxInfo in it's box and other stuff.

'''Tarquin:''' whoa... isn't this a case of [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]]?

'''Wormbo:''' Yes it is. Never modify and save the defaults of actors.

'''Tarquin:''' What should we do with this page? Fold some of it into the pages on the [[Legacy:Grid|grid]]?

'''Evilmrfrank:''' Just changing the above from editor 2 to editor 3
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add A Ladder</title>
    <id>416</id>
    <revision>
      <id>1373</id>
      <timestamp>2008-03-19T19:27:03Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>locked</comment>
      <text xml:space="preserve">{{innerbox| ''This page is temporarily locked for editing because it has recently been targeted by a particularly persistent spammer with a particularly large herd of zombie computers. If you'd like to change anything, please leave a note on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion|discussion page]].''

}}

This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1374</id>
      <timestamp>2006-12-04T18:00:49Z</timestamp>
      <contributor>
        <ip>Filter2.brick.proxy.easynet.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1375</id>
      <timestamp>2008-03-12T07:48:18Z</timestamp>
      <contributor>
        <ip>89.127.167.26</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">AxLuDF  &lt;a href=&quot;http://irkypwlwaolm.com/&quot;&gt;irkypwlwaolm&lt;/a&gt;, [url=http://jaeumikxzpuz.com/]jaeumikxzpuz[/url], [link=http://cacnnxaiecze.com/]cacnnxaiecze[/link], http://pciriuvswygn.com/</text>
    </revision>
    <revision>
      <id>1376</id>
      <timestamp>2008-03-12T07:56:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1377</id>
      <timestamp>2008-03-12T12:39:24Z</timestamp>
      <contributor>
        <ip>201-74-21-100-mu.cpe.vivax.com.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Get best pleasure in your life with free porn movies., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2946&quot;&gt;shemale cock&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2946&quot;]shemale cock[/url],  =-OO, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2889&quot;&gt;huge tit cum&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2889&quot;]huge tit cum[/url],  %-[[[, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2960&quot;&gt;suck big dick&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2960&quot;]suck big dick[/url],  cetus, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2961&quot;&gt;teen tit cum&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2961&quot;]teen tit cum[/url],  11762, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2916&quot;&gt;indian pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2916&quot;]indian pussy[/url],  czxs, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2906&quot;&gt;cock giant shemale&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2906&quot;]cock giant shemale[/url],  463,</text>
    </revision>
    <revision>
      <id>1378</id>
      <timestamp>2008-03-12T12:40:21Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1379</id>
      <timestamp>2008-03-12T16:39:48Z</timestamp>
      <contributor>
        <ip>220112.static.ctb.virtua.com.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Get your pussy on your dick, don't wait for big boobs girls from your dreams., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2878&quot;&gt;blow job cum shot movie&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2878&quot;]blow job cum shot movie[/url],  722680, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2891&quot;&gt;compilation cum free shot video&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2891&quot;]compilation cum free shot video[/url],  ewnzka, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2933&quot;&gt;black cock monster&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2933&quot;]black cock monster[/url],  ruf, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2871&quot;&gt;beach bikini babes&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2871&quot;]beach bikini babes[/url],  :[, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2898&quot;&gt;dick goods park sporting&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2898&quot;]dick goods park sporting[/url],  71225,</text>
    </revision>
    <revision>
      <id>1380</id>
      <timestamp>2008-03-12T16:46:05Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted *yawn*</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1381</id>
      <timestamp>2008-03-12T18:22:06Z</timestamp>
      <contributor>
        <ip>220.194.159.12</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Worldwise sex porn movies, home video of hot latins., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2877&quot;&gt;blonde hairy pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2877&quot;]blonde hairy pussy[/url],  8(, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2891&quot;&gt;cum shot movie compilation&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2891&quot;]cum shot movie compilation[/url],  05747, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2958&quot;&gt;cock porn small&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2958&quot;]cock porn small[/url],  &gt;:PP, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2948&quot;&gt;shemale swallow cum
&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2948&quot;]shemale swallow cum

[/url],  873, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2943&quot;&gt;pussy squirting&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2943&quot;]pussy squirting[/url],  080,</text>
    </revision>
    <revision>
      <id>1382</id>
      <timestamp>2008-03-12T18:24:57Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1383</id>
      <timestamp>2008-03-12T18:29:43Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>spam block test</comment>
      <text xml:space="preserve">Worldwise sex porn movies, home video of hot latins., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2877&quot;&gt;blonde hairy pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2877&quot;]blonde hairy pussy[/url],  8(, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2891&quot;&gt;cum shot movie compilation&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2891&quot;]cum shot movie compilation[/url],  05747, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2958&quot;&gt;cock porn small&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2958&quot;]cock porn small[/url],  &gt;:PP, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2948&quot;&gt;shemale swallow cum
&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2948&quot;]shemale swallow cum

[/url],  873, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2943&quot;&gt;pussy squirting&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2943&quot;]pussy squirting[/url],  080,</text>
    </revision>
    <revision>
      <id>1384</id>
      <timestamp>2008-03-12T18:30:00Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1385</id>
      <timestamp>2008-03-19T04:04:12Z</timestamp>
      <contributor>
        <ip>87.68.212.170.adsl.012.net.il</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bdsm is just as a pasrt of my life, I love when my pussy wired and I love to suck my master., &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=170&quot;&gt;foto gay porn
&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=170&quot;]foto gay porn

[/url],  868355, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=57&quot;&gt;ass babe kick mercedes&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=57&quot;]ass babe kick mercedes[/url],  1058, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=272&quot;&gt;free mexican pussy&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=272&quot;]free mexican pussy[/url],  574370, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=236&quot;&gt;biel jessica nude pic&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=236&quot;]biel jessica nude pic[/url],  065252, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=427&quot;&gt;big tit and hairy pussy&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=427&quot;]big tit and hairy pussy[/url],  &gt;:-(((,</text>
    </revision>
    <revision>
      <id>1386</id>
      <timestamp>2008-03-19T08:58:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted; did you break something, Mych?</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1387</id>
      <timestamp>2008-03-19T15:15:34Z</timestamp>
      <contributor>
        <ip>Ppp-50-169.32-151.iol.it</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">She touched my cock while I licked her pussy and put my finger in her ass., &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=217&quot;&gt;hitchhiker stephanie teen&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=217&quot;]hitchhiker stephanie teen[/url],  6499, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=143&quot;&gt;teen clothing store&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=143&quot;]teen clothing store[/url],  458477, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=335&quot;&gt;nude man swimming&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=335&quot;]nude man swimming[/url],  6758, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=89&quot;&gt;black gay chat&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=89&quot;]black gay chat[/url],  &gt;:-PPP, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=188&quot;&gt;gay bareback&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=188&quot;]gay bareback[/url],  6654, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=85&quot;&gt;teen in bikini&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=85&quot;]teen in bikini[/url],  750579,</text>
    </revision>
    <revision>
      <id>1388</id>
      <timestamp>2008-03-19T15:19:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted (these are only the tip of the eisberg; most of the ~50 spamming attempts since midnight are blocked automatically already)</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1389</id>
      <timestamp>2008-03-19T18:34:49Z</timestamp>
      <contributor>
        <ip>81.172.3.218.dyn.user.ono.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Worldwise sex porn movies, home video of hot latins., &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=387&quot;&gt;huge saggy tit&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=387&quot;]huge saggy tit[/url],  80799, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=163&quot;&gt;extreme ass&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=163&quot;]extreme ass[/url],  8-(, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=361&quot;&gt;movie porn review&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=361&quot;]movie porn review[/url],  hpu, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=241&quot;&gt;large boob&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=241&quot;]large boob[/url],  &gt;:OOO, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=212&quot;&gt;hardcore partying pool&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=212&quot;]hardcore partying pool[/url],  8-[[, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=344&quot;&gt;swinger party pic&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=344&quot;]swinger party pic[/url],  ato,</text>
    </revision>
    <revision>
      <id>1390</id>
      <timestamp>2008-03-19T19:09:49Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">This page describes how a ladder is built.  The description of the steps required has been taken from the game [[Legacy:Devastation|Devastation]].  It is expected that the process for other unreal engine based games will be similar if not identical.

A ladder is composed of three main elements (five if you include the autogenerated ladder paths).  These elements are:
* The ladder static mesh (just for the look of the thing)
* The blocking volume used to &quot;cover&quot; the ladder (for [[Legacy:Collision|collision]] purposes: quicker than per-poly collision)
* The LadderVolume itself (makes the player climb)
* Two auto generated Ladder pathnodes ([[Legacy:AutoLadder|AutoLadder]] objects for [[Legacy:Bot Support|bot support]])

==Adding the Ladder==
# The first thing you need to do is add your ladder object to the map. I used the ladder [[Legacy:Static Mesh|static mesh]] &lt;tt&gt;AbitladderA&lt;/tt&gt; from the &lt;tt&gt;Aquifiers&lt;/tt&gt; package: [[Legacy:Add A Static Mesh|Add a static mesh]] &lt;tt&gt;Aquifiers.AbitladderA&lt;/tt&gt;. Place it on the wall where you wish the ladder to be.
# The ladder itself is 32 [[Legacy:UU|UU]] wide and 192 UU high.  You will most likely find that you will have to rotate the ladder into the correct orientation and move it into position.
# Once you have got the ladder into position it is well worth changing the [[Legacy:Collision|collision]] properties on the ladder to ensure good performance. So [[Legacy:Set The Following Properties|Set the following properties]]:
#*  Collision -&gt; bBlockKarma = true
#*  Collision -&gt; bBlockZeroExtentTraces = true
#*  Collision -&gt; bCollideActors = true

Your ladder is now ready for use.

==Add a Blocking Volume==

You may have noticed that our ladder does not block any of the Actors within the game. We are going to use a [[Legacy:BlockingVolume|BlockingVolume]] for this purpose.  The BlockingVolume will enclose the ladder and ensure that only simplistic collision occurs.

In order to create the blocking volume you need to [[Legacy:Add A Volume|Add a Volume]] with a height, width and breadth of 192, 32, and 16 UU respetively.  Depending on the orientation of your ladder you may need to swap the breadth and width values around.

A white cube will now appear in your level.  Move the red builder brush out of the way and position your new blocking volume over the ladder.

==Adding the LadderVolume==

So, we have the ladder in our map and a mechanism to ensure that the ladder is solid.  We still can't climb our ladder though. The [[Legacy:LadderVolume|LadderVolume]] defines the area within which the &quot;ladder effect&quot; will occur. 

* Create a cube using the [[Legacy:Red Builder Brush|red builder brush]] with a height, width, and breadth of 288, 64, 64 UU respectively.  The height specified is 96 units higher than the ladder's blocking volume.  This additional height seems to make it easier to get down the ladder without having to jump.  If you find better values add them to this page.  These are most likely Devastation specific.
* Left click on the &lt;tt&gt;Add Volume&lt;/tt&gt; button in the left toolbutton area and select the &lt;tt&gt;LadderVolume&lt;/tt&gt; option.

Players in a ladder volume, obviously, are able to climb; Forward will make the character ascend, backward descend.This is only possible when the following two criteria are met:
* The player's '''forward motion is blocked''' - This means a player wont accidentally start climbing while  walking through the empty parts of the ladder zone. He has to hit the ladder mesh or blocking volume.
* The player is '''facing the specified direction''' - This means a player can only climb the correct side of a  ladder, and not the perpendicular wall next to it etc

Thats quite specific, so its reasonably safe to make your volume too big rather than too small. Move aside the red builder brush then completely enclose the ladder and blocking volume with the ladder volume you just spawned.

Finally you need to specify the direction. The arrow at the centre of the ladder volume must point towards the surface you want to climb. You can't set this with the mouse, and must instead edit the ladder volume properties-&gt;LadderVolume-&gt;WallDir (And most likely the yaw)

Common values are: North=49152, East=0, South=16384, West=32768.

==The finishing touches==

In order to make your ladder actually work you will need to [[Legacy:Rebuild|rebuild]] the level (including the paths).  If you don't see two ladder icons at top and bottom of your ladder something has gone wrong and your ladder will not work correctly within the level.  Try adjusting the position and size of the LadderVolume relative to the BlockingVolume.  Also ensure that the &lt;tt&gt;bAutoPath&lt;/tt&gt; property is set to &lt;tt&gt;True&lt;/tt&gt;.  If you can see the two ladder icons within your volume your ladder should work without any problems.

Save your level and give it a go.

[[Image:Legacy_laddervolume.gif|left|]]

A picture of the ladder volume is shown on the left.  The LadderVolume is in brown, the BlockingVolume is in blue, and the AutoLadder PathNodes are in yellow.  The orientation of the LadderVolume is indicated by the Red Arrow.  The static mesh I used for the ladder is invisible.

Be aware that I tweaked the colours to make the diagram clearer.

----

'''Mychaeel:''' Why did you remove all the ''italics'' from menu commands, EntropicLqd?  They make them much easier to distinguish from the surrounding text.

'''EntropicLqd:''' Because I felt that it made the actual text too hard to read (at least it did on my screen).  I might try using &lt;tt&gt;the teletype&lt;/tt&gt; format instead tomorrow.
: Thanks for adding the basic procedure stuff Tarquin.  I was expecting to have to do that now.  Instead I can go get some sleep.

'''Tarquin:''' np :) you may have noticed that most of [[Legacy:Add A Static Mesh|Add A Static Mesh]] is your work too ... :p

'''N8Mills:''' I've had considerable difficulty in placing a ladder over water (i.e. a LadderVolume above a WaterVolume) because it wants to put the AutoLadder PathNode on the floor (which is outside the LadderVolume, at the bottom of the WaterVolume), and not just at the bottom of the LadderVolume.  Because of this little &quot;feature&quot; it causes an error each time I rebuild.  It should be possible to make this work somehow, so I've created a BlockingVolume below the LadderVolume that's specific to AutoLadder actors, but that didn't fix it.  So the only way I can get it working is by submerging the LadderVolume into the WaterVolume or by change &lt;tt&gt;bAutoPath&lt;/tt&gt; to &lt;tt&gt;false&lt;/tt&gt;.  The other problem is that The AutoLadder PathNodes don't like to remain rotated after I point them somewhere other than their default.  Am I committing a cardinal sin or what?  Am I on the right track with the additional blocking volume but my follow-through is lacking?

'''Newman:''' - Im using a free copy of unreal engine 2 demo version for my college course and when i test the level in the runtime mode i can't climb these ladders can you help pls any advice would be apprichiated thx for your time

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add A Static Mesh</title>
    <id>417</id>
    <revision>
      <id>1391</id>
      <timestamp>2008-03-19T19:27:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>locked</comment>
      <text xml:space="preserve">{{innerbox| ''This page is temporarily locked for editing because it has recently been targeted by a particularly persistent spammer with a particularly large herd of zombie computers. If you'd like to change anything, please leave a note on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion|discussion page]].''

}}

''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1392</id>
      <timestamp>2006-12-04T15:17:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>it's already linked at the top</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1393</id>
      <timestamp>2008-03-11T00:31:59Z</timestamp>
      <contributor>
        <ip>Host34-235-static.74-81-b.business.telecomitalia.it</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">YuFrAI  &lt;a href=&quot;http://ddxqqudnvlkm.com/&quot;&gt;ddxqqudnvlkm&lt;/a&gt;, [url=http://fszrylvfzlir.com/]fszrylvfzlir[/url], [link=http://jymaerayubfo.com/]jymaerayubfo[/link], http://zogopccrxpmz.com/</text>
    </revision>
    <revision>
      <id>1394</id>
      <timestamp>2008-03-11T09:05:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1395</id>
      <timestamp>2008-03-12T10:24:02Z</timestamp>
      <contributor>
        <ip>Host164-190-static.23-87-b.business.telecomitalia.it</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Great ass, hot body that's what you need for handjobs now., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2965&quot;&gt;free pictures of virgin pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2965&quot;]free pictures of virgin pussy[/url],  585331, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2922&quot;&gt;aunt gallery judys mature&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2922&quot;]aunt gallery judys mature[/url],  8], &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2880&quot;&gt;black chick dick latin&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2880&quot;]black chick dick latin[/url],  =-), &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2964&quot;&gt;babe true video&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2964&quot;]babe true video[/url],  =((, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2868&quot;&gt;naked babe of the day&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2868&quot;]naked babe of the day[/url],  14540, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2882&quot;&gt;cock robin tablature&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2882&quot;]cock robin tablature[/url],  670,</text>
    </revision>
    <revision>
      <id>1396</id>
      <timestamp>2008-03-12T10:30:04Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1397</id>
      <timestamp>2008-03-12T11:26:34Z</timestamp>
      <contributor>
        <ip>Pd95b349b.dip0.t-ipconnect.de</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Worldwise sex porn movies, home video of hot latins., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2936&quot;&gt;pussy cat dolls beep&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2936&quot;]pussy cat dolls beep[/url],  8]]], &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2918&quot;&gt;latina hairy pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2918&quot;]latina hairy pussy[/url],  xehlk, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2950&quot;&gt;free shemale cum shot&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2950&quot;]free shemale cum shot[/url],  %-))), &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2964&quot;&gt;babe college from fuck true
&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2964&quot;]babe college from fuck true

[/url],  ejaza, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2881&quot;&gt;cock ring vibrator&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2881&quot;]cock ring vibrator[/url],  nzhtp,</text>
    </revision>
    <revision>
      <id>1398</id>
      <timestamp>2008-03-12T12:28:19Z</timestamp>
      <contributor>
        <ip>202.41.80.50</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bdsm is just as a pasrt of my life, I love when my pussy wired and I love to suck my master., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2942&quot;&gt;teen pussy squirt&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2942&quot;]teen pussy squirt[/url],  3153, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2962&quot;&gt;teen cumshot&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2962&quot;]teen cumshot[/url],  swy, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2940&quot;&gt;fucking pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2940&quot;]fucking pussy[/url],  rgfak, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2880&quot;&gt;chicks with dicks&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2880&quot;]chicks with dicks[/url],  21660, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2875&quot;&gt;black shemale dick&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2875&quot;]black shemale dick[/url],  ofxm, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2943&quot;&gt;black squirting pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2943&quot;]black squirting pussy[/url],  907252,</text>
    </revision>
    <revision>
      <id>1399</id>
      <timestamp>2008-03-12T12:29:09Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1400</id>
      <timestamp>2008-03-12T15:37:00Z</timestamp>
      <contributor>
        <ip>Static-host210-2-145-154.link.net.pk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hardcore in my house every day with my wife, she call me son and I call her my sexy mom, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2946&quot;&gt;cock huge shemale&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2946&quot;]cock huge shemale[/url],  247, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2961&quot;&gt;teen cum swallow&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2961&quot;]teen cum swallow[/url],  333, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2922&quot;&gt;aunt judy mature model&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2922&quot;]aunt judy mature model[/url],  :-(, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2874&quot;&gt;busty bikini babes
&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2874&quot;]busty bikini babes

[/url],  lizjg, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2906&quot;&gt;cock giant white&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2906&quot;]cock giant white[/url],  8-[, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2919&quot;&gt;massive gay cock&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2919&quot;]massive gay cock[/url],  ztnbsl,</text>
    </revision>
    <revision>
      <id>1401</id>
      <timestamp>2008-03-12T15:41:40Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1402</id>
      <timestamp>2008-03-12T18:12:15Z</timestamp>
      <contributor>
        <ip>D83-190-91-112.cust.tele2.it</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Fingering after school with my lesbian friend, I love to lick her everywhere., &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2946&quot;&gt;shemale cock&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2946&quot;]shemale cock[/url],  quam, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2952&quot;&gt;hentai anime shemale&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2952&quot;]hentai anime shemale[/url],  909453, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2865&quot;&gt;free absolute shemale&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2865&quot;]free absolute shemale[/url],  %))), &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2935&quot;&gt;nice lesben pussy&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2935&quot;]nice lesben pussy[/url],  fhvbmb, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2939&quot;&gt;hot pussy fuck&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2939&quot;]hot pussy fuck[/url],  2306, &lt;a href=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2884&quot;&gt;cum covered face&lt;/a&gt;, [url=&quot;http://www.breed77.net/forum/topic.asp?TOPIC_ID=2884&quot;]cum covered face[/url],  8-DD,</text>
    </revision>
    <revision>
      <id>1403</id>
      <timestamp>2008-03-12T18:14:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1404</id>
      <timestamp>2008-03-13T17:57:30Z</timestamp>
      <contributor>
        <ip>62.43.155.74.dyn.user.ono.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Son and mom, that's our roles in sex, we fuch each other hardly outdoor., &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/1a/adult-comic.html&quot;&gt;adult comic&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/1a/adult-comic.html&quot;]adult comic[/url],  gaozxp, &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/1a/gay-torrent.html&quot;&gt;gay torrent&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/1a/gay-torrent.html&quot;]gay torrent[/url],  iqmpvs, &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/2b/monster-dicks.html&quot;&gt;monster dicks&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/2b/monster-dicks.html&quot;]monster dicks[/url],  %-], &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/1a/rate-my-pussy.html&quot;&gt;rate my pussy&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/1a/rate-my-pussy.html&quot;]rate my pussy[/url],  0231, &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/2b/monster-cocks.html&quot;&gt;monster cocks&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/2b/monster-cocks.html&quot;]monster cocks[/url],  &gt;:-((, &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/1a/hentai-teen-titans.html&quot;&gt;hentai raven teen titans&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/1a/hentai-teen-titans.html&quot;]hentai raven teen titans[/url],  :OO, &lt;a href=&quot;http://www.iris.edu/activeearth/imgs/box/26/teen-tits.html&quot;&gt;huge teen tits&lt;/a&gt;, [url=&quot;http://www.iris.edu/activeearth/imgs/box/26/teen-tits.html&quot;]huge teen tits[/url],  765,</text>
    </revision>
    <revision>
      <id>1405</id>
      <timestamp>2008-03-13T18:00:24Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1406</id>
      <timestamp>2008-03-19T01:40:07Z</timestamp>
      <contributor>
        <ip>196.203.15.36</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Great ass, hot body that's what you need for handjobs now., &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=341&quot;&gt;pantie hose teen&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=341&quot;]pantie hose teen[/url],  56088, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=132&quot;&gt;black butt man
&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=132&quot;]black butt man

[/url],  032426, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=220&quot;&gt;hot butt&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=220&quot;]hot butt[/url],  &gt;:DD, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=242&quot;&gt;large black penis&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=242&quot;]large black penis[/url],  akgh, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=126&quot;&gt;kristina and busty adventure&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=126&quot;]kristina and busty adventure[/url],  &gt;:)),</text>
    </revision>
    <revision>
      <id>1407</id>
      <timestamp>2008-03-19T02:10:52Z</timestamp>
      <contributor>
        <ip>71-17-83-160.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1408</id>
      <timestamp>2008-03-19T04:43:44Z</timestamp>
      <contributor>
        <ip>84.126.196.143.dyn.user.ono.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Choose me and get satisfaction now, best blowjobs and anal sex!!!, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=282&quot;&gt;milf rider lani&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=282&quot;]milf rider lani[/url],  &gt;:-OO, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=213&quot;&gt;free teen titans hentai&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=213&quot;]free teen titans hentai[/url],  &gt;:]]], &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=234&quot;&gt;free jennifer love hewitt nude pic
&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=234&quot;]free jennifer love hewitt nude pic

[/url],  byt, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=58&quot;&gt;amanda baby boob got&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=58&quot;]amanda baby boob got[/url],  uyrz, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=236&quot;&gt;biel free jessica nude pic&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=236&quot;]biel free jessica nude pic[/url],  &gt;:-(, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=85&quot;&gt;teen in bikini&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=85&quot;]teen in bikini[/url],  zyyc,</text>
    </revision>
    <revision>
      <id>1409</id>
      <timestamp>2008-03-19T06:18:24Z</timestamp>
      <contributor>
        <ip>Ip-84.net-81-220-223.henin.rev.numericable.fr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Wow, touch hot ass of asian teens, wanna cum? It's here!, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=261&quot;&gt;natural mature boob&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=261&quot;]natural mature boob[/url],  hsco, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=193&quot;&gt;free gay hunk
&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=193&quot;]free gay hunk

[/url],  =-(((, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=384&quot;&gt;free retro porn movie&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=384&quot;]free retro porn movie[/url],  csd, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=252&quot;&gt;lindsay lohan photo upskirt&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=252&quot;]lindsay lohan photo upskirt[/url],  616754, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=257&quot;&gt;bbw mature free&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=257&quot;]bbw mature free[/url],  %-(, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=194&quot;&gt;gay man kiss&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=194&quot;]gay man kiss[/url],  nnfaax, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=167&quot;&gt;sexy fergie nude&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=167&quot;]sexy fergie nude[/url],  :-], &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=326&quot;&gt;nude female body builder video
&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=326&quot;]nude female body builder video

[/url],  ngd, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=316&quot;&gt;nude actress&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=316&quot;]nude actress[/url],  &gt;:OO, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=308&quot;&gt;naruto porn sakura&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=308&quot;]naruto porn sakura[/url],  :DD,</text>
    </revision>
    <revision>
      <id>1410</id>
      <timestamp>2008-03-19T07:09:48Z</timestamp>
      <contributor>
        <ip>201-26-46-33.dsl.telesp.net.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Gay and lesbians always made me feel horny and I like to watch that porn., &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=193&quot;&gt;free gay hunk
&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=193&quot;]free gay hunk

[/url],  :-OO, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=416&quot;&gt;pic teen tiffany
&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=416&quot;]pic teen tiffany

[/url],  63244, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=125&quot;&gt;bunny teen&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=125&quot;]bunny teen[/url],  nlkuu, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=25&quot;&gt;amateur match&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=25&quot;]amateur match[/url],  mwcha, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=36&quot;&gt;angelina jolie movie nude
&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=36&quot;]angelina jolie movie nude

[/url],  802,</text>
    </revision>
    <revision>
      <id>1411</id>
      <timestamp>2008-03-19T08:57:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1412</id>
      <timestamp>2008-03-19T15:07:48Z</timestamp>
      <contributor>
        <ip>159-200-235-201.fibertel.com.ar</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hardcore in my house every day with my wife, she call me son and I call her my sexy mom, &lt;a href=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=187&quot;&gt;teen ass fuck&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Updyke_Palmer?action=AttachFile&amp;do=get&amp;target=187&quot;]teen ass fuck[/url],  cyn, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=52&quot;&gt;ass pigtails rayne round tiffany
&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=52&quot;]ass pigtails rayne round tiffany

[/url],  0011, &lt;a href=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=294&quot;&gt;picture of naked hot lady&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Moiras_Kostas?action=AttachFile&amp;do=get&amp;target=294&quot;]picture of naked hot lady[/url],  473, &lt;a href=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=55&quot;&gt;breast augmentation chicago&lt;/a&gt;, [url=&quot;http://softwarefreedomday.org/Quaid_Opal?action=AttachFile&amp;do=get&amp;target=55&quot;]breast augmentation chicago[/url],  %-DD, &lt;a href=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=367&quot;&gt;vintage retro porn
&lt;/a&gt;, [url=&quot;http://wiki.ubuntu.cz/Adair_Kristen?action=AttachFile&amp;do=get&amp;target=367&quot;]vintage retro porn

[/url],  :PPP,</text>
    </revision>
    <revision>
      <id>1413</id>
      <timestamp>2008-03-19T15:16:30Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==
* Static Meshes are resources, just like textures or sounds, stored in packages. When you add one to your map, you're actually placing something that refers to the mesh resource.
* You'll be given a mesh name in the form '''Package.Group.Mesh Name''' or '''Package.Mesh Name'''.

==Instructions==

To '''place a static mesh''' in your map:

# Open the [[Legacy:Static Mesh Browser|static mesh browser]] by doing one of:
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Static Mesh Browser
#* Press the Static Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an arch, to the left of the &quot;A&quot;.

[[Image:Legacy_interface-Ed3-staticmeshbrowser.png|center|The static mesh browser. The currently selected mesh is from the '''AbbadonHardware''' [[Legacy:Package|package]], the '''Beams''' group, and the mesh itself is '''ASupport03AB'''. This is written as &quot;AbbadonHardware.Beams.ASupport03AB&quot;.]]

# Do [[Legacy:Static Mesh Browser Menu|Static Mesh Browser Menu]] -&gt; File -&gt; Open, select the package you want, click '''Open'''. (If you've already loaded this package, you can skip this step of course.)
# Select the group you want from the drop-down menu in the static mesh browser
# Within the static mesh browser scroll down the list of meshes on the left hand side of the browser until you find the mesh.
# Highlight the mesh by left clicking once on its name. You can see the mesh in the main part of the window, and use the mouse to zoom or move around it.
# Close the static mesh browser or move it out of the way
# Find the spot where you want to place the mesh, and there do [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add static mesh: {name of the mesh currently selected in the browser}

==Alternative methods==

Aside from the method above, you could also:

* Copy and paste an existing instance of the mesh in your map, or from another map
* [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:StaticMeshActor|StaticMeshActor]] and then [[Legacy:Set The Resource Property|Set the resource property]] Display -&gt; StaticMesh. For example, you can change the static mesh an already placed StaticMeshActor is displaying.

==Settings==

You can now alter the appearance of the mesh:
* location &amp;ndash; just move the actor, or set Movement-&gt;Location
* rotation &amp;ndash; just rotate the actor, or set Movement-&gt;Rotation
* size &amp;ndash; set Display-&gt;DrawScale or Display-&gt;DrawScale3D

==Related Topics==
* List of all of Epic's [[Legacy:Static Mesh Package|Static Mesh Package]]s
* [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]], to help you find your way in them

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add A Volume</title>
    <id>418</id>
    <revision>
      <id>1414</id>
      <timestamp>2006-12-04T15:17:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>it's already linked at the top</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

Volumes are a new concept in the [[Legacy:UT2003|UT2003]] [[Legacy:Unreal Engine|Unreal Engine]]. They are a region of space in which certain behaviour is defined. In a sense they take over from:
* [[Legacy:Zoning|zoning]] for gravity, water, etc
* [[Legacy:Invisible Collision Hull|Invisible collision hull]] for [[Legacy:Collision|collision]]

==Instructions==

===Make a brush shape===

Volumes can be any shape (concave bad though? someone confirm?), so UnrealEd uses the [[Legacy:Red Builder Brush|red builder brush]] to define a shape, in exactly the same way as when you make a [[Legacy:Brush|brush]].

Choose a brush builder button from the [[Legacy:Brushbuilders|brushbuilders]] section of the [[Legacy:Toolbox|toolbox]]:
* click the button to get the default settings
* right-click to call up a parameter window.

Most volumes will be made with the cube builder, so for this:
# right-click the cube builder button
# enter the height, width and breadth you want
# click &quot;Build&quot;

===Add the volume===

[[Image:Legacy_interface-Ed3-AddVolume.png|center|Right-click the button]]

Right-click on the Add Volume button in the left [[Legacy:Toolbox|toolbox]] area and select type of volume you want. These are:

* [[Legacy:BlockingVolume|BlockingVolume]] &amp;ndash; Used for limiting player movements, works like the [[Legacy:Invisible Collision Hull|Invisible Collision Hull]] in UT
* [[Legacy:Volume|Volume]] &amp;ndash; Generic volume with no properties, you can use these for Location Tags in outdoor areas where zoning may not be possible.
* [[Legacy:LadderVolume|LadderVolume]]
* [[Legacy:PhysicsVolume|PhysicsVolume]] &amp;ndash; Created with default physics, gravity and other properties can be changed in this volume to create reverse gravity, wind, etc
* [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] &amp;ndash; This cannot be used by mappers. The class holds the physics properties used in areas that are not contained within any PhysicsVolume.
* [[Legacy:PressureVolume|PressureVolume]]
* [[Legacy:WaterVolume|WaterVolume]] &amp;ndash; The player &quot;swims&quot; in this volume, complete with blue fogged view and distorted audio
* [[Legacy:SnipingVolume|SnipingVolume]]
* [[Legacy:LavaVolume|LavaVolume]] &amp;ndash; Damages the actor that falls in here, with the Lava damage type ''&quot;Player crashed and burned&quot;''
* [[Legacy:XFallingVolume|xFallingVolume]] &amp;ndash; Damages the actor that falls in here with Falling damage type ''&quot;Player left a small crater&quot;''
* [[Legacy:LimitationVolume|LimitationVolume]]
* [[Legacy:HitScanBlockingVolume|HitScanBlockingVolume]]

A white cube will now appear in your level: this is the [[Legacy:Volume|Volume]] actor. You can move it as you would a brush.

If you're working with water or lava, you'll need to add a [[Legacy:Sheet|sheet]] or a FluidSurfaceInfo if you want the water to have a visible surface. Volumes just contains the physics, nothing more.

==Related Topics ==
* [[Legacy:Working With Volumes|Working With Volumes]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1415</id>
      <timestamp>2004-04-28T06:36:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

Volumes are a new concept in the [[Legacy:UT2003|UT2003]] [[Legacy:Unreal Engine|Unreal Engine]]. They are a region of space in which certain behaviour is defined. In a sense they take over from:
* [[Legacy:Zoning|zoning]] for gravity, water, etc
* [[Legacy:Invisible Collision Hull|Invisible collision hull]] for [[Legacy:Collision|collision]]

==Instructions==

===Make a brush shape===

Volumes can be any shape (concave bad though? someone confirm?), so UnrealEd uses the [[Legacy:Red Builder Brush|red builder brush]] to define a shape, in excatly the same way as making [[Legacy:Brush|brush]]es.

Choose a brush builder button from the [[Legacy:Brushbuilders|brushbuilders]] section of the [[Legacy:Toolbox|toolbox]]:
* click the button to get the default settings
* right-click to call up a parameter window.

Most volumes will be made with the cube builder, so for this:
# right-click the cube builder button
# enter the height, width and breadth you want
# click &quot;Build&quot;

===Add the volume===

[[Image:Legacy_interface-Ed3-AddVolume.png|center|Right-click the button]]

Right-click on the Add Volume button in the left [[Legacy:Toolbox|toolbox]] area and select type of volume you want. These are:

* [[Legacy:BlockingVolume|BlockingVolume]] &amp;ndash; Used for limiting player movements, works like the [[Legacy:Invisible Collision Hull|Invisible Collision Hull]] in UT
* [[Legacy:Volume|Volume]] &amp;ndash; Generic volume with no properties, you can use these for Location Tags in outdoor areas where zoning may not be possible.
* [[Legacy:LadderVolume|LadderVolume]]
* [[Legacy:PhysicsVolume|PhysicsVolume]] &amp;ndash; Created with default physics, gravity and other properties can be changed in this volume to create reverse gravity, wind, etc
* [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] &amp;ndash; This cannot be used by mappers. The class holds the physics properties used in areas that are not contained within any PhysicsVolume.
* [[Legacy:PressureVolume|PressureVolume]]
* [[Legacy:WaterVolume|WaterVolume]] &amp;ndash; The player &quot;swims&quot; in this volume, complete with blue fogged view and distorted audio
* [[Legacy:SnipingVolume|SnipingVolume]]
* [[Legacy:LavaVolume|LavaVolume]] &amp;ndash; Damages the actor that falls in here, with the Lava damage type ''&quot;Player crashed and burned&quot;''
* [[Legacy:XFallingVolume|xFallingVolume]] &amp;ndash; Damages the actor that falls in here with Falling damage type ''&quot;Player left a small crater&quot;''
* [[Legacy:LimitationVolume|LimitationVolume]]
* [[Legacy:HitScanBlockingVolume|HitScanBlockingVolume]]

A white cube will now appear in your level: this is the [[Legacy:Volume|Volume]] actor. You can move it as you would a brush.

If you're working with water or lava, you'll need to add a [[Legacy:Sheet|sheet]] or a FluidSurfaceInfo if you want the water to have a visible surface. Volumes just contains the physics, nothing more.

==Related Topics ==
* [[Legacy:Working With Volumes|Working With Volumes]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1416</id>
      <timestamp>2006-12-02T02:46:50Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

Volumes are a new concept in the [[Legacy:UT2003|UT2003]] [[Legacy:Unreal Engine|Unreal Engine]]. They are a region of space in which certain behaviour is defined. In a sense they take over from:
* [[Legacy:Zoning|zoning]] for gravity, water, etc
* [[Legacy:Invisible Collision Hull|Invisible collision hull]] for [[Legacy:Collision|collision]]

==Instructions==

===Make a brush shape===

Volumes can be any shape (concave bad though? someone confirm?), so UnrealEd uses the [[Legacy:Red Builder Brush|red builder brush]] to define a shape, in exactly the same way as when you make a [[Legacy:Brush|brush]].

Choose a brush builder button from the [[Legacy:Brushbuilders|brushbuilders]] section of the [[Legacy:Toolbox|toolbox]]:
* click the button to get the default settings
* right-click to call up a parameter window.

Most volumes will be made with the cube builder, so for this:
# right-click the cube builder button
# enter the height, width and breadth you want
# click &quot;Build&quot;

===Add the volume===

[[Image:Legacy_interface-Ed3-AddVolume.png|center|Right-click the button]]

Right-click on the Add Volume button in the left [[Legacy:Toolbox|toolbox]] area and select type of volume you want. These are:

* [[Legacy:BlockingVolume|BlockingVolume]] &amp;ndash; Used for limiting player movements, works like the [[Legacy:Invisible Collision Hull|Invisible Collision Hull]] in UT
* [[Legacy:Volume|Volume]] &amp;ndash; Generic volume with no properties, you can use these for Location Tags in outdoor areas where zoning may not be possible.
* [[Legacy:LadderVolume|LadderVolume]]
* [[Legacy:PhysicsVolume|PhysicsVolume]] &amp;ndash; Created with default physics, gravity and other properties can be changed in this volume to create reverse gravity, wind, etc
* [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] &amp;ndash; This cannot be used by mappers. The class holds the physics properties used in areas that are not contained within any PhysicsVolume.
* [[Legacy:PressureVolume|PressureVolume]]
* [[Legacy:WaterVolume|WaterVolume]] &amp;ndash; The player &quot;swims&quot; in this volume, complete with blue fogged view and distorted audio
* [[Legacy:SnipingVolume|SnipingVolume]]
* [[Legacy:LavaVolume|LavaVolume]] &amp;ndash; Damages the actor that falls in here, with the Lava damage type ''&quot;Player crashed and burned&quot;''
* [[Legacy:XFallingVolume|xFallingVolume]] &amp;ndash; Damages the actor that falls in here with Falling damage type ''&quot;Player left a small crater&quot;''
* [[Legacy:LimitationVolume|LimitationVolume]]
* [[Legacy:HitScanBlockingVolume|HitScanBlockingVolume]]

A white cube will now appear in your level: this is the [[Legacy:Volume|Volume]] actor. You can move it as you would a brush.

If you're working with water or lava, you'll need to add a [[Legacy:Sheet|sheet]] or a FluidSurfaceInfo if you want the water to have a visible surface. Volumes just contains the physics, nothing more.

==Related Topics ==
* [[Legacy:Working With Volumes|Working With Volumes]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add An Actor</title>
    <id>387</id>
    <revision>
      <id>1304</id>
      <timestamp>2006-12-27T15:29:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Find the class in the browser==

To '''add an actor''' to your map:

Open the [[Legacy:Actor Class Browser|Actor Class Browser]]: either 
* click the button in the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

This shows the [[Legacy:Class Tree|class tree]] descended from the class [[Legacy:Actor|Actor]]. When working within UnrealEd, you'll probably always want to leave the two options checked: 'use Actor as parent' and 'placeable classes only'.

Navigate through the [[Legacy:Class Tree|Class Tree]] to the [[Legacy:Class|class]] you want to add. On the Unreal Wiki, we represent the parentage of a class like this:

: [[Legacy:Actor|Actor]] &gt;&gt; ChildClass &gt;&gt; GrandchildClass &gt;&gt; etc ... &gt;&gt; TheClassWeWant

Click on a [+] to expand a tree branch. Click on the Actor class you would like to add to the map...

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

==Add the actor==

In one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do: 

: [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

The name of the actor you selected in the tree should appear in the context menu.

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space.

==Related Topics==
* For how to set the properties of the actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1305</id>
      <timestamp>2006-12-27T10:08:01Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Find the class in the browser==

To '''add an actor''' to your map:

Open the [[Legacy:Actor Class Browser|Actor Class Browser]]: either 
* click the button in the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

This shows the [[Legacy:Class Tree|class tree]] descended from the class [[Legacy:Actor|Actor]]. When working within UnrealEd, you'll probably always want to leave the two options checked: 'use Actor as parent' and 'placeable classes only'.

Navigate through the [[Legacy:Class Tree|Class Tree]] to the [[Legacy:Class|class]] you want to add. On the Unreal Wiki, we represent the parentage of a class like this:

: [[Legacy:Actor|Actor]] &gt;&gt; ChildClass &gt;&gt; GrandchildClass &gt;&gt; etc ... &gt;&gt; TheClassWeWant

Click on a [+] to expand a tree branch. Click on the name of the class you want to select. (And then what? We still have a window open now. Please finish this explanation.)

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

==Add the actor==

In one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do: 

: [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

The name of the actor you selected in the tree should appear in the context menu.

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space.

==Related Topics==
* For how to set the properties of the actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1306</id>
      <timestamp>2006-12-27T10:09:35Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Find the class in the browser==

To '''add an actor''' to your map:

Open the [[Legacy:Actor Class Browser|Actor Class Browser]]: either 
* click the button in the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

This shows the [[Legacy:Class Tree|class tree]] descended from the class [[Legacy:Actor|Actor]]. When working within UnrealEd, you'll probably always want to leave the two options checked: 'use Actor as parent' and 'placeable classes only'.

Navigate through the [[Legacy:Class Tree|Class Tree]] to the [[Legacy:Class|class]] you want to add. On the Unreal Wiki, we represent the parentage of a class like this:

: [[Legacy:Actor|Actor]] &gt;&gt; ChildClass &gt;&gt; GrandchildClass &gt;&gt; etc ... &gt;&gt; TheClassWeWant

Click on a [+] to expand a tree branch. Click on the name of the class you want to select. (Look to the section below for the remaining explanation.)

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

==Add the actor==

In one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do: 

: [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

The name of the actor you selected in the tree should appear in the context menu.

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space.

==Related Topics==
* For how to set the properties of the actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33241</id>
      <timestamp>2008-11-15T23:54:50Z</timestamp>
      <contributor>
        <username>RacolOleto</username>
        <id>1595</id>
      </contributor>
      <minor/>
      <comment>eltboc4</comment>
      <text xml:space="preserve">riccasitdro
''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Find the class in the browser==

To '''add an actor''' to your map:

Open the [[Legacy:Actor Class Browser|Actor Class Browser]]: either 
* click the button in the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

This shows the [[Legacy:Class Tree|class tree]] descended from the class [[Legacy:Actor|Actor]]. When working within UnrealEd, you'll probably always want to leave the two options checked: 'use Actor as parent' and 'placeable classes only'.

Navigate through the [[Legacy:Class Tree|Class Tree]] to the [[Legacy:Class|class]] you want to add. On the Unreal Wiki, we represent the parentage of a class like this:

: [[Legacy:Actor|Actor]] &gt;&gt; ChildClass &gt;&gt; GrandchildClass &gt;&gt; etc ... &gt;&gt; TheClassWeWant

Click on a [+] to expand a tree branch. Click on the Actor class you would like to add to the map...

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

==Add the actor==

In one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do: 

: [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

The name of the actor you selected in the tree should appear in the context menu.

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space.

==Related Topics==
* For how to set the properties of the actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33242</id>
      <timestamp>2008-11-16T08:41:56Z</timestamp>
      <contributor>
        <username>RacolOleto</username>
        <id>1595</id>
      </contributor>
      <minor/>
      <comment>http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm</comment>
      <text xml:space="preserve">[sitemap|http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm] [[http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm sitemap]] [http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm|sitemap] ((http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm sitemap)) [[http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm | sitemap]] &quot;sitemap&quot;:http://topkickerpoker.com/dev/resources/templates_c/img/sitemap.htm [joliet illinois|http://ufonews.in/images/supporting_images/pics/etbasf.html] [[http://ufonews.in/images/supporting_images/pics/etbasf.html joliet illinois]] [http://ufonews.in/images/supporting_images/pics/etbasf.html|joliet illinois] ((http://ufonews.in/images/supporting_images/pics/etbasf.html joliet illinois)) [[http://ufonews.in/images/supporting_images/pics/etbasf.html | joliet illinois]] &quot;joliet illinois&quot;:http://ufonews.in/images/supporting_images/pics/etbasf.html [one eight seven lyrics|http://hydroenergycompany.com/gallery/big_pic/52/text-614.htm] [[http://hydroenergycompany.com/gallery/big_pic/52/text-614.htm one eight seven lyrics]] [http://hydroenergycompany.com/gallery/big_pic/52/text-614.htm|one eight seven lyrics] ((http://hydroenergycompany.com/gallery/big_pic/52/text-614.htm one eight seven lyrics)) [[http://hydroenergycompany.com/gallery/big_pic/52/text-614.htm | one eight seven lyrics]] &quot;one eight seven lyrics&quot;:http://hydroenergycompany.com/gallery/big_pic/52/text-614.htm [plank eye bible|http://georgeangelov.com/gallery2/media/topic-201.htm] [[http://georgeangelov.com/gallery2/media/topic-201.htm plank eye bible]] [http://georgeangelov.com/gallery2/media/topic-201.htm|plank eye bible] ((http://georgeangelov.com/gallery2/media/topic-201.htm plank eye bible)) [[http://georgeangelov.com/gallery2/media/topic-201.htm | plank eye bible]] &quot;plank eye bible&quot;:http://georgeangelov.com/gallery2/media/topic-201.htm [jimmy hendrix wallpaper|http://tourismcollege-varna.com/images/articles/pics/racgol.html] [[http://tourismcollege-varna.com/images/articles/pics/racgol.html jimmy hendrix wallpaper]] [http://tourismcollege-varna.com/images/articles/pics/racgol.html|jimmy hendrix wallpaper] ((http://tourismcollege-varna.com/images/articles/pics/racgol.html jimmy hendrix wallpaper)) [[http://tourismcollege-varna.com/images/articles/pics/racgol.html | jimmy hendrix wallpaper]] &quot;jimmy hendrix wallpaper&quot;:http://tourismcollege-varna.com/images/articles/pics/racgol.html 
riccasitdro
''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Find the class in the browser==

To '''add an actor''' to your map:

Open the [[Legacy:Actor Class Browser|Actor Class Browser]]: either 
* click the button in the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

This shows the [[Legacy:Class Tree|class tree]] descended from the class [[Legacy:Actor|Actor]]. When working within UnrealEd, you'll probably always want to leave the two options checked: 'use Actor as parent' and 'placeable classes only'.

Navigate through the [[Legacy:Class Tree|Class Tree]] to the [[Legacy:Class|class]] you want to add. On the Unreal Wiki, we represent the parentage of a class like this:

: [[Legacy:Actor|Actor]] &gt;&gt; ChildClass &gt;&gt; GrandchildClass &gt;&gt; etc ... &gt;&gt; TheClassWeWant

Click on a [+] to expand a tree branch. Click on the Actor class you would like to add to the map...

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

==Add the actor==

In one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do: 

: [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

The name of the actor you selected in the tree should appear in the context menu.

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space.

==Related Topics==
* For how to set the properties of the actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33243</id>
      <timestamp>2008-11-16T10:01:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/RacolOleto|RacolOleto]] ([[User talk:RacolOleto|Talk]]); changed back to last version by [[User:SuperApe|SuperApe]]</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Find the class in the browser==

To '''add an actor''' to your map:

Open the [[Legacy:Actor Class Browser|Actor Class Browser]]: either 
* click the button in the [[Legacy:Toolbar|toolbar]]
* or do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Class Browser.

This shows the [[Legacy:Class Tree|class tree]] descended from the class [[Legacy:Actor|Actor]]. When working within UnrealEd, you'll probably always want to leave the two options checked: 'use Actor as parent' and 'placeable classes only'.

Navigate through the [[Legacy:Class Tree|Class Tree]] to the [[Legacy:Class|class]] you want to add. On the Unreal Wiki, we represent the parentage of a class like this:

: [[Legacy:Actor|Actor]] &gt;&gt; ChildClass &gt;&gt; GrandchildClass &gt;&gt; etc ... &gt;&gt; TheClassWeWant

Click on a [+] to expand a tree branch. Click on the Actor class you would like to add to the map...

[[Image:Legacy_interface-Ed3-actorbrowser.png|center|'''Actor Classes Browser''']]

==Add the actor==

In one of the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s, do: 

: [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add &lt;selected actor&gt; here

The name of the actor you selected in the tree should appear in the context menu.

In a 3D viewport the actor will appear near the surface that was right-clicked. In a 2D view, UnrealEd will take the third coordinate to be 0 and may refuse to place the actor in solid space.

==Related Topics==
* For how to set the properties of the actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add An Inline Object</title>
    <id>451</id>
    <revision>
      <id>1491</id>
      <timestamp>2006-12-04T15:18:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>it's already linked at the top</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

An '''inline object''' is a new concept in [[Legacy:UnrealEd 3|UnrealEd 3]]. The notion of setting one actor's property to point to another actor in the map is not new, but with an inline object, that second object's properties can be edited within the first's. It's an object that is created just to work within this actor: you can think of the inline object as a complex group of properties or component inserted into the actor.

[[Image:Legacy_interface-Ed3-dynamicarray-inline-1.png|center|]]

When dealing with dynamic arrays, like the Emitters array of the [[Legacy:Emitter|Emitter]] class, [[Legacy:Extend The Dynamic Array|extend the dynamic array]] to make room for a new inline object first.

[[Image:Legacy_interface-Ed3-dynamicarray-inline-2.png|center|]]

This is how you usually start out. You have an object reference that doesn't hold anything: the box says 'None'.

You could:
* type in a reference for an existing object, or
* use the widgets to create a new object.

Reusing an existing object might be useful with the Emitter, as you could have one ParticleEmitter working in several Emitters (probably... we haven't tested this!)

[[Image:Legacy_interface-Ed3-dynamicarray-inline-3.png|center|]]

To use the '''New''' widget, first highlight the row that contains the &quot;New&quot; label. This will reveal a drop-down list of classes. Pick one and click the New button. (Note: in some older builds of UnrealEd 3, the drop-down list is broken and won't display. Make it active and use the arrow keys to select from the list.)

[[Image:Legacy_interface-Ed3-dynamicarray-inline-4.png|center|The object reference now holds an object. Note the darker grey background for the inline object and its property groups.]]

Your actor whose properties are displayed in the Actor Properties Window now contains a new object ''inside it''. It has its own properties within the properties of the containing actor: the inner object properties are shown in a darker grey that the containing actor properties.

Note that the inner object won't appear in the map views and can't be selected and edited like an actor. To work with it, you'll always need to select the containing actor first.

==Discussion==

'''Tarquin:''' I have a better set of pics from  Karma -&gt; KParams , will upload later.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1492</id>
      <timestamp>2005-12-18T00:04:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

An '''inline object''' is a new concept in [[Legacy:UnrealEd 3|UnrealEd 3]]. The notion of setting one actor's property to point to another actor in the map is not new, but with an inline object, that second object's properties can be edited within the first's. It's an object that is created just to work within this actor: you can think of the inline object as a complex group of properties or component inserted into the actor.

[[Image:Legacy_interface-Ed3-dynamicarray-inline-1.png|center|]]

When dealing with dynamic arrays, like the Emitters array of the [[Legacy:Emitter|Emitter]] class, [[Legacy:Extend The Dynamic Array|extend the dynamic array]] to make room for a new inline object first.

[[Image:Legacy_interface-Ed3-dynamicarray-inline-2.png|center|]]

This is how you usually start out. You have an object reference that doesn't hold anything: the box says 'None'.

You could:
* type in a reference for an existing object, or
* use the widgets to create a new object.

Reusing an existing object might be useful with the Emitter, as you could have one ParticleEmitter working in several Emitters (probably... we haven't tested this!)

[[Image:Legacy_interface-Ed3-dynamicarray-inline-3.png|center|]]

To use the '''New''' widget, first highlight the row that contains the &quot;New&quot; label. This will reveal a drop-down list of classes. Pick one and click the New button. (Note: in some older builds of UnrealEd 3, the drop-down list is broken and won't display. Make it active and use the arrow keys to select from the list.)

[[Image:Legacy_interface-Ed3-dynamicarray-inline-4.png|center|The object reference now holds an object. Note the darker grey background for the inline object and its property groups.]]

Your actor whose properties are displayed in the Actor Properties Window now contains a new object ''inside it''. It has its own properties within the properties of the containing actor: the inner object properties are shown in a darker grey that the containing actor properties.

Note that the inner object won't appear in the map views and can't be selected and edited like an actor. To work with it, you'll always need to select the containing actor first.

==Discussion==

'''Tarquin:''' I have a better set of pics from  Karma -&gt; KParams , will upload later.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1493</id>
      <timestamp>2006-12-02T02:47:39Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

An '''inline object''' is a new concept in [[Legacy:UnrealEd 3|UnrealEd 3]]. The notion of setting one actor's property to point to another actor in the map is not new, but with an inline object, that second object's properties can be edited within the first's. It's an object that is created just to work within this actor: you can think of the inline object as a complex group of properties or component inserted into the actor.

[[Image:Legacy_interface-Ed3-dynamicarray-inline-1.png|center|]]

When dealing with dynamic arrays, like the Emitters array of the [[Legacy:Emitter|Emitter]] class, [[Legacy:Extend The Dynamic Array|extend the dynamic array]] to make room for a new inline object first.

[[Image:Legacy_interface-Ed3-dynamicarray-inline-2.png|center|]]

This is how you usually start out. You have an object reference that doesn't hold anything: the box says 'None'.

You could:
* type in a reference for an existing object, or
* use the widgets to create a new object.

Reusing an existing object might be useful with the Emitter, as you could have one ParticleEmitter working in several Emitters (probably... we haven't tested this!)

[[Image:Legacy_interface-Ed3-dynamicarray-inline-3.png|center|]]

To use the '''New''' widget, first highlight the row that contains the &quot;New&quot; label. This will reveal a drop-down list of classes. Pick one and click the New button. (Note: in some older builds of UnrealEd 3, the drop-down list is broken and won't display. Make it active and use the arrow keys to select from the list.)

[[Image:Legacy_interface-Ed3-dynamicarray-inline-4.png|center|The object reference now holds an object. Note the darker grey background for the inline object and its property groups.]]

Your actor whose properties are displayed in the Actor Properties Window now contains a new object ''inside it''. It has its own properties within the properties of the containing actor: the inner object properties are shown in a darker grey that the containing actor properties.

Note that the inner object won't appear in the map views and can't be selected and edited like an actor. To work with it, you'll always need to select the containing actor first.

==Discussion==

'''Tarquin:''' I have a better set of pics from  Karma -&gt; KParams , will upload later.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add EditPackage</title>
    <id>499</id>
    <revision>
      <id>1580</id>
      <timestamp>2005-09-16T03:58:44Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>Remove EditPackage</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview==
* EditPackages are a list of unreal [[Legacy:Package|package]] files that will be automatically loaded on startup of the editor. 
* They are used by [[Legacy:UnrealEd|UnrealEd]] and [[Legacy:Ucc|Ucc]]. 
* They are defined in [[Legacy:Game Ini File|Game Ini File]] (ie: in UT2004 it's UT2004.ini). 
* EditPackages are loaded in the same order they are defined in the ini file.
* Editor will crash if EditPackage cannot be loaded:
** The package may not exist or be invalid.
** The package may be in directory that wasn't defined as valid Path in game ini.
** The package may require another package to be loaded first.
* EditPackages are defined using file name only.
** Do not add package file extension
** Do not add package file path

==Tips==
* Editor startup time can be reduced from minutes to couple seconds by removing game-specific EditPackages.

==Configure EditPackages using UnrealEd==

===View EditPackages===

{|

|-
|In menu '''View''' select '''Advanced Options'''.&lt;br /&gt;Navigate to '''Editor''' &gt;&gt; '''Advanced''' &gt;&gt; '''EditPackages'''.
|[[Image:Legacy_AO_EditPackages_View.png|]]
|}

===Add EditPackage===

{|

|-
|Click the '''Add''' button.&lt;br /&gt;A new empty field will be added to the bottom.&lt;br /&gt;Enter the name of your package into the empty field.&lt;br /&gt;Close the window.
|[[Image:Legacy_AO_EditPackages_AddNew.png|]]
|}

==Configure EditPackages using Text Editor==

===View EditPackages===
* Make sure that game and editor are closed.
* Open your [[Legacy:Game Ini File|Game Ini File]] (ie: UT2004.ini) in a [[Legacy:Text Editor|text editor]] (ie: Notepad).
* Find section '''[Editor.EditorEngine]'''
* Find '''EditPackages''' list in it.

===Add EditPackage===
* Add your package to the end of '''EditPackages''' list unless instructed otherwise.
* Make sure you didn't added any empty lines to the section.
* Save the file.

===Remove EditPackage===
* Find your package in the '''EditPackages''' list and remove that line.
* Make sure you didn't added any empty lines to the section.
* Save the file.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1581</id>
      <timestamp>2005-09-13T08:17:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview==
* EditPackages are a list of unreal [[Legacy:Package|package]] files that will be automatically loaded on startup of the editor. 
* They are used by [[Legacy:UnrealEd|UnrealEd]] and [[Legacy:UCC|UCC]]. 
* They are defined in game configuration file (ie: in UT2004 it's UT2004.ini). 
* EditPackages are loaded in the same order they are defined in the ini file.
* Editor will crash if EditPackage cannot be loaded:
** The package may not exist or be invalid.
** The package may be in directory that wasn't defined as valid Path in game ini.
** The package may require another package to be loaded first.
* EditPackages are defined using file name only.
** Do not add package file extension
** Do not add package file path

==Tips==
* Editor startup time can be reduced from minutes to couple seconds by removing game-specific EditPackages.

==Configure EditPackages using UnrealEd==

===View EditPackages===

{|

|-
|In menu '''View''' select '''Advanced Options'''.&lt;br /&gt;Navigate to '''Editor''' &gt;&gt; '''Advanced''' &gt;&gt; '''EditPackages'''.
|[[Image:Legacy_AO_EditPackages_View.png|]]
|}

===Add EditPackages===

{|

|-
|Click the '''Add''' button.&lt;br /&gt;A new empty field will be added to the bottom.&lt;br /&gt;Enter the name of your package into the empty field.&lt;br /&gt;Close the window.
|[[Image:Legacy_AO_EditPackages_AddNew.png|]]
|}

==Configure EditPackages using Text Editor==

===View EditPackages===
* Make sure that game and editor are closed.
* Open your [[Legacy:Game Ini File|game ini file]] (ie: UT2004.ini) in a [[Legacy:Text Editor|text editor]] (ie: Notepad).
* Find section '''[Editor.EditorEngine]'''
* Find '''EditPackages''' list in it.

===Add EditPackages===
* Add your '''EditPackage''' to the end of the list unless instructed otherwise.
* Make sure you didn't added any empty lines to the section.
* Save the file.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Add Special</title>
    <id>366</id>
    <revision>
      <id>1250</id>
      <timestamp>2006-11-26T12:57:33Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Change link from Glass to Making Windows</comment>
      <text xml:space="preserve">This is a floating window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] which allows the mapper to add special [[Legacy:Brush|brush]]es. Summon it by clicking the square blue button in the [[Legacy:Toolbox|toolbox]]'s CSG operations group.

[[Image:Legacy_interface-Ed3-AddSpecial.png|center|Add Special window]]

The ''Prefabs'' drop-down list sets the flags automatically for certain predefined types.  (Note that it's absolutely possible to create exactly the same effects by manipulating a regular brush manually.)

'''Tarquin:'''  Not exactly, unfortunately ... I've often had problems with the following: add a sheet ZP as ''translucent''. Change your mind and remove the translucent flag in the surface properties window. rebuild... the translucent flag (sometimes) returns :( This might be because it's as single poly brush.

:'''Mychaeel:'''  But then I suppose the same would have happened if you had created that translucent sheet zone portal manually before by creating a sheet and setting its &quot;translucent&quot; and &quot;zone portal&quot; flags.  There's hardly any special magic in &quot;Add Special&quot; &amp;ndash; it's just for mappers' convenience.

'''Tarquin:'''  You mean setting ''Polyflags'' in the brush? Yes. Add Special just determines the value of the PolyFlags and CSG property when the brush is created. A simple sheet brush would have no problem being switched from trans to non-trans ''surface flags'', since there would be no Brush polyflags set. So from that point of view, there's greater flexibility in creating only standard brushes, then setting surface flags on all the polys. I use Add Special for ZPs, ICHs and masked textures. Regular semisolids I add and convert later.

==Prefabs ==
; Invisible Collision Hull : Used to create invisible brushes that block players and projectile. See [[Legacy:Invisible Collision Hull|Invisible Collision Hull]].
; Masked Decoration, Masked Wall : These are identical. Use with [[Legacy:Masked Texture|masked texture]]s. Note that in most circumstances, you may want to also check the ''2 Sided'' option.
; Regular Brush : Just adds a normal brush. This is the same as clicking the Add button in the [[Legacy:Toolbox|toolbox]].
; Semisolid Pillar : Adds a [[Legacy:Semisolid|semisolid]] brush to the map.
; Transparent Window : See [[Legacy:Making Windows|Making Windows]].
; Water : See [[Legacy:Making Liquids (UT)|Making Liquids (UT)]].
; Zone Portal : See [[Legacy:Zone Portal|Zone Portal]], [[Legacy:Zoning|Zoning]] / [[Legacy:Zoning|Zoning]]. It's a good idea to check &quot;2 sided&quot; for zone portals so they are easier to see in UnrealEd.

==Custom ==

The flags set the [[Legacy:PolyFlags|PolyFlags]] for the brush &amp;ndash; see [[Legacy:Surface Flags (UT)|Surface Flags (UT)]].

The solidity radio button group sets the [[Legacy:Solidity|solidity]].

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1251</id>
      <timestamp>2003-04-30T09:11:48Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a floating window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] which allows the mapper to add special [[Legacy:Brush|brush]]es. Summon it by clicking the square blue button in the [[Legacy:Toolbox|toolbox]]'s CSG operations group.

 [[Image:Legacy_interface-Ed3-AddSpecial.png|center|Add Special window]]

The ''Prefabs'' drop-down list sets the flags automatically for certain predefined types.  (Note that it's absolutely possible to create exactly the same effects by manipulating a regular brush manually.)

'''Tarquin:'''  Not exactly, unfortunately ... I've often had problems with the following: add a sheet ZP as ''translucent''. Change your mind and remove the translucent flag in the surface properties window. rebuild... the translucent flag (sometimes) returns :( This might be because it's as single poly brush.

:'''Mychaeel:'''  But then I suppose the same would have happened if you had created that translucent sheet zone portal manually before by creating a sheet and setting its &quot;translucent&quot; and &quot;zone portal&quot; flags.  There's hardly any special magic in &quot;Add Special&quot; &amp;ndash; it's just for mappers' convenience.

'''Tarquin:'''  You mean setting ''Polyflags'' in the brush? Yes. Add Special just determines the value of the PolyFlags and CSG property when the brush is created. A simple sheet brush would have no problem being switched from trans to non-trans ''surface flags'', since there would be no Brush polyflags set. So from that point of view, there's greater flexibility in creating only standard brushes, then setting surface flags on all the polys. I use Add Special for ZPs, ICHs and masked textures. Regular semisolids I add and convert later.

==Prefabs ==
; Invisible Collision Hull : Used to create invisible brushes that block players and projectile. See [[Legacy:Invisible Collision Hull|Invisible Collision Hull]].
; Masked Decoration, Masked Wall : These are identical. Use with [[Legacy:Masked Texture|masked texture]]s. Note that in most circumstances, you may want to also check the ''2 Sided'' option.
; Regular Brush : Just adds a normal brush. This is the same as clicking the Add button in the [[Legacy:Toolbox|toolbox]].
; Semisolid Pillar : Adds a [[Legacy:Semisolid|semisolid]] brush to the map.
; Transparent Window : See [[Legacy:Glass|Glass]].
; Water : See [[Legacy:Making Liquids (UT)|Making Liquids (UT)]].
; Zone Portal : See [[Legacy:Zone Portal|Zone Portal]], [[Legacy:Zoning|Zoning]] / [[Legacy:Zoning|Zoning]]. It's a good idea to check &quot;2 sided&quot; for zone portals so they are easier to see in UnrealEd.

==Custom ==

The flags set the [[Legacy:PolyFlags|PolyFlags]] for the brush &amp;ndash; see [[Legacy:Surface Flags (UT)|Surface Flags (UT)]].

The solidity radio button group sets the [[Legacy:Solidity|solidity]].</text>
    </revision>
    <revision>
      <id>1252</id>
      <timestamp>2003-05-25T09:02:55Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">This is a floating window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] which allows the mapper to add special [[Legacy:Brush|brush]]es. Summon it by clicking the square blue button in the [[Legacy:Toolbox|toolbox]]'s CSG operations group.

[[Image:Legacy_interface-Ed3-AddSpecial.png|center|Add Special window]]

The ''Prefabs'' drop-down list sets the flags automatically for certain predefined types.  (Note that it's absolutely possible to create exactly the same effects by manipulating a regular brush manually.)

'''Tarquin:'''  Not exactly, unfortunately ... I've often had problems with the following: add a sheet ZP as ''translucent''. Change your mind and remove the translucent flag in the surface properties window. rebuild... the translucent flag (sometimes) returns :( This might be because it's as single poly brush.

:'''Mychaeel:'''  But then I suppose the same would have happened if you had created that translucent sheet zone portal manually before by creating a sheet and setting its &quot;translucent&quot; and &quot;zone portal&quot; flags.  There's hardly any special magic in &quot;Add Special&quot; &amp;ndash; it's just for mappers' convenience.

'''Tarquin:'''  You mean setting ''Polyflags'' in the brush? Yes. Add Special just determines the value of the PolyFlags and CSG property when the brush is created. A simple sheet brush would have no problem being switched from trans to non-trans ''surface flags'', since there would be no Brush polyflags set. So from that point of view, there's greater flexibility in creating only standard brushes, then setting surface flags on all the polys. I use Add Special for ZPs, ICHs and masked textures. Regular semisolids I add and convert later.

==Prefabs ==
; Invisible Collision Hull : Used to create invisible brushes that block players and projectile. See [[Legacy:Invisible Collision Hull|Invisible Collision Hull]].
; Masked Decoration, Masked Wall : These are identical. Use with [[Legacy:Masked Texture|masked texture]]s. Note that in most circumstances, you may want to also check the ''2 Sided'' option.
; Regular Brush : Just adds a normal brush. This is the same as clicking the Add button in the [[Legacy:Toolbox|toolbox]].
; Semisolid Pillar : Adds a [[Legacy:Semisolid|semisolid]] brush to the map.
; Transparent Window : See [[Legacy:Glass|Glass]].
; Water : See [[Legacy:Making Liquids (UT)|Making Liquids (UT)]].
; Zone Portal : See [[Legacy:Zone Portal|Zone Portal]], [[Legacy:Zoning|Zoning]] / [[Legacy:Zoning|Zoning]]. It's a good idea to check &quot;2 sided&quot; for zone portals so they are easier to see in UnrealEd.

==Custom ==

The flags set the [[Legacy:PolyFlags|PolyFlags]] for the brush &amp;ndash; see [[Legacy:Surface Flags (UT)|Surface Flags (UT)]].

The solidity radio button group sets the [[Legacy:Solidity|solidity]].

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adding A Block</title>
    <id>494</id>
    <revision>
      <id>1569</id>
      <timestamp>2006-09-11T06:13:43Z</timestamp>
      <contributor>
        <ip>46.059.dsl.pth.iprimus.net.au</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This page is both:''
* ''a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''
* ''One of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].''

==Overview ==

The [[Legacy:Unreal Engine|Unreal Engine]] thinks of the entire [[Legacy:Unreal World|Unreal world]] as solid matter when you start a new map. Once you have '''subtracted a space''' you may want to add a small piece back in. This is called '''adding''', because we tell UnrealEd to add a chunk of &quot;solid&quot; material to a subtracted space.

You can not add solid geometry into your Map unless you first place it into a Subtracted Space. ''Only relevant in older versions of Unrealed, 1,2,3.''

==Instructions==

To create a block in your level:
# You will need a map with a subtracted space. [[Legacy:Subtract A Space|Subtract a Space]] 
# 
The [[Legacy:UnrealEd Interface|UnrealEd Interface]] has a set of buttons running down the left side of the screen. This is called the [[Legacy:Toolbox|toolbox]] and is divided into several groups. In the 3rd group of buttons, find the top-left button of that group is a blue-green cube. (In UnrealEd 2 and later, each group can be collapsed, but normally this group is visible.) Right-click the cube button.

[[Image:Legacy_interface-Ed3-CubeBuilder.png|center|setting the cube builder parameters]]


# This opens a floating window with a list of parameters for the '''Cube Brushbuilder'''. Type in the height, width and breadth you want for the block. You can use the mouse to select the fields or hit Tab to move the focus. The numbers are all in [[Legacy:Unreal Unit|Unreal Unit]]s.
# For now create a small cube, make it 64x64x64. For more on using the parameters window, see [[Legacy:Brushbuilders|Brushbuilders]].
# You will now see that the red outline, [[Legacy:Red Builder Brush|Red Builder Brush]], has now resized to your set dimensions. If you would like to move this object, select it (you should see it turn to a light red), then hold the ctrl button and drag with your mouse.

[[Image:Legacy_interface.toolbox.BrushOperations.png|left|]]

# Find the 4th group of buttons in the [[Legacy:Toolbox|toolbox]]. Choose #2 or the one thats tooltip says &quot;add&quot;. click it. Before you can see the additive block you will have to Press &quot;build&quot;. This action has taken the current shape of the red builder brush, and used it as a template to create a real, additive [[Legacy:Brush|brush]] in the world.
# You should now see a block in your level.
#The other brushbuilder buttons create different basic shapes, try messing around with adding different shapes to your level. Dont forget to &quot;rebuild&quot; or you may not be able to see the changes, sometimes you will not need to &quot;rebuild&quot; but until you learn when to use unrealed effectively I suggest doing it often.

==Rules of thumb==

'''You should not make additive brushes go outside the area which you subtracted.'''

'''You should not make additive brushes overlap each other.'''

These above can cause undesired results in you map I would strongly recommend against it. (see [[Legacy:BSP Hole|BSP Hole]])

To save yourself some hastles when you are getting started I suggest using [[Legacy:Snap To Grid|Snap To Grid]].

'''Foxpaw:''' Why shouldn't additive brushes overlap each other?

'''OlympusMons:''' Im not entirely sure I thought it caused holes in the map. I figured it would be safe if beginners started simple. If im wrong in anyway please change it.

==Related Topics==
* [[Legacy:Creating A Terrain|Creating A Terrain]] &amp;ndash; Your recommended next step in the [[Legacy:Mapping Lessons|Mapping Lessons]].
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; a complete reference for UnrealEd's menus, windows and buttons.
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]] &amp;ndash; compares Unreal Unit dimensions to real world scale.
* [[Legacy:Brushbuilders|Brushbuilders]] &amp;ndash; a must if you would like to add shapes other than cubes.
* [[Legacy:Brush|Brush]] &amp;ndash; a complete reference for the brush class, has lots of useful information on using brushes of all types.

----

==Comments==

'''OlympusMons:''' Touch it up alittle and made it alittle easier to read as well as some more intermediate suggestions. Wow I never thought this page was going to be useful but now it seems it will be a starting point in Unrealed 4 is it? Are there any ideas on what formats we might be going for with the new engine? I would perhaps suggest pre-fixs or something to comments/procedures only related to certain engine versions.#

'''Tarquin:''' What's going to be different in UEd 4?

'''OlympusMons:''' From what Ive been reading on utforums etc, it seems you can goto file/new and you get to selecti either additive or subtractive methods. It defaults to additive now by all accounts and you can create adds to the void without having to worry about anything. So a [[Legacy:Basic Procedure|basic procedure]] [[Legacy:Creating A Room|Creating a room]] would combine both [[Legacy:Subtract A Space|Subtract a Space]] and ''Adding a Block''. If your in Subtractive mode then nothing has changed but as I said before you must go file/new first then select it, apparently it just fills the void with a big additive anyways.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1570</id>
      <timestamp>2006-09-10T06:37:12Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>no subtract in UE4?</comment>
      <text xml:space="preserve">''This page is both:''
* ''a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''
* ''One of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].''

==Overview ==

The [[Legacy:Unreal Engine|Unreal Engine]] thinks of the entire [[Legacy:Unreal World|Unreal world]] as solid matter when you start a new map. Once you have '''subtracted a space''' you may want to add a small piece back in. This is called '''adding''', because we tell UnrealEd to add a chunk of &quot;solid&quot; material to a subtracted space.

You can not add solid geometry into your Map unless you first place it into a Subtracted Space. ''Only relevant in older versions of Unrealed, 1,2,3.''

==Instructions==

To create a block in your level:
# You will need a map with a subtracted space. [[Legacy:Subtract A Space|Subtract a Space]] 
# 
The [[Legacy:UnrealEd Interface|UnrealEd Interface]] has a set of buttons running down the left side of the screen. This is called the [[Legacy:Toolbox|toolbox]] and is divided into several groups. In the 3rd group of buttons, find the top-left button of that group is a blue-green cube. (In UnrealEd 2 and later, each group can be collapsed, but normally this group is visible.) Right-click the cube button.

[[Image:Legacy_interface-Ed3-CubeBuilder.png|center|setting the cube builder parameters]]


# This opens a floating window with a list of parameters for the '''Cube Brushbuilder'''. Type in the height, width and breadth you want for the block. You can use the mouse to select the fields or hit Tab to move the focus. The numbers are all in [[Legacy:Unreal Unit|Unreal Unit]]s.
# For now create a small cube, make it 64x64x64. For more on using the parameters window, see [[Legacy:Brushbuilders|Brushbuilders]].
# You will now see that the red outline, [[Legacy:Red Builder Brush|Red Builder Brush]], has now resized to your set dimensions. If you would like to move this object, select it (you should see it turn to a light red), then hold the ctrl button and drag with your mouse.

[[Image:Legacy_interface.toolbox.BrushOperations.png|left|]]

# Find the 4th group of buttons in the [[Legacy:Toolbox|toolbox]]. Choose #2 or the one thats tooltip says &quot;add&quot;. click it. Before you can see the additive block you will have to Press &quot;build&quot;. This action has taken the current shape of the red builder brush, and used it as a template to create a real, additive [[Legacy:Brush|brush]] in the world.
# You should now see a block in your level.
#The other brushbuilder buttons create different basic shapes, try messing around with adding different shapes to your level. Dont forget to &quot;rebuild&quot; or you may not be able to see the changes, sometimes you will not need to &quot;rebuild&quot; but until you learn when to use unrealed effectively I suggest doing it often.

==Rules of thumb==

'''You should not make additive brushes go outside the area which you subtracted.'''

'''You should not make additive brushes overlap each other.'''

These above can cause undesired results in you map I would strongly recommend against it. (see [[Legacy:BSP Hole|BSP Hole]])

To save yourself some hastles when you are getting started I suggest using [[Legacy:Snap To Grid|Snap To Grid]].

'''Foxpaw:''' Why shouldn't additive brushes overlap each other?

'''OlympusMons:''' Im not entirely sure I thought it caused holes in the map. I figured it would be safe if beginners started simple. If im wrong in anyway please change it.

==Related Topics==
* [[Legacy:Creating A Terrain|Creating A Terrain]] &amp;ndash; Your recommended next step in the [[Legacy:Mapping Lessons|Mapping Lessons]].
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; a complete reference for UnrealEd's menus, windows and buttons.
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]] &amp;ndash; compares Unreal Unit dimensions to real world scale.
* [[Legacy:Brushbuilders|Brushbuilders]] &amp;ndash; a must if you would like to add shapes other than cubes.
* [[Legacy:Brush|Brush]] &amp;ndash; a complete reference for the brush class, has lots of useful information on using brushes of all types.

----

==Comments==

'''OlympusMons:''' Touch it up alittle and made it alittle easier to read as well as some more intermediate suggestions. Wow I never thought this page was going to be useful but now it seems it will be a starting point in Unrealed 4 is it? Are there any ideas on what formats we might be going for with the new engine? I would perhaps suggest pre-fixs or something to comments/procedures only related to certain engine versions.#

'''Tarquin:''' What's going to be different in UEd 4?

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adding A Brick</title>
    <id>519</id>
    <revision>
      <id>1620</id>
      <timestamp>2008-02-18T22:55:18Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Now I will assume that you have completed part 1 and that you have a space ready in your Editor.

1. Simply right click &quot;Cube&quot; or any other brushes that you wish for from the side bar.

2. Fill in the required information for the brush.(Just experiment with different values)

3. Left click &quot;Build&quot; and your red wire frame brush should instantly change its looks to your wanted brush.

4. Now you probably would love to move this brush into your special spot in the room. =DLeft click on the wire frame model, so that it will be bright red. Hold down &quot;Ctrl&quot; while you press and hold Left mouse button, Right mouse button or Both mouse buttons.

Now try to move your mouse and see how this wire frame model is moving around. Try to see if you can move your brush to your heavily desired place.

5. Press &quot;Add&quot; if you want the space inside your brush to be filled.

&quot;or&quot; Press &quot;Subtract&quot; if you want the space inside your brush to be removed.

Congratulations, if you did this correctly, you now have added a brick or some other brush of your choice into the map.</text>
    </revision>
    <revision>
      <id>1621</id>
      <timestamp>2008-02-10T20:26:48Z</timestamp>
      <contributor>
        <ip>MrVortex</ip>
      </contributor>
      <text xml:space="preserve">Now I will assume that you have completed part 1 and that you have a space ready in your Editor.

1. Simply right click &quot;Cube&quot; Fill inn whatever you want, but I recommend 64x64x64 for a small brick to fit into your space.

2. Click Build, and you will get a red wire frame block on your map.

3. Now, we would want to move this, to somewhere into your map, and probably on the floor. First click the wire frame brick, then hold &quot;Ctrl&quot; while pressing left mouse button and move your mouse. Try while holding different mouse button combinations, and try in both 3d and wire frame views. Now you should be able to move this cube. Try get it on the floor in your cube where u want it. If you use the &quot;Front&quot; or &quot;side&quot; wire frame views you can easily see when the cube touches the ground.

4. Now you find a button called &quot;Add&quot; it is right beside the &quot;Subtract&quot; button you used earlier when creating the room.

Now this will also look like a chess figured block for now, or just white if you made it small. Dont worry about the odd design, we will learn how to change this in later steps.

5. Also, UT3 has more to offer than just cubes. Instead of clicking cube. you can try Cone, cylinder, or staircase. Try to add one beside the cube in your map.

You are now ready for the next step.

Improvements on this tutorial will be done over time.</text>
    </revision>
    <revision>
      <id>1622</id>
      <timestamp>2008-02-18T22:25:08Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Now I will assume that you have completed part 1 and that you have a space ready in your Editor.

1. Simply right click &quot;Cube&quot; or any other brushes that you wish for from the side bar.

2. Fill in the required information for the brush.(Just experiment with different values)

3. Left click &quot;Build&quot; and your red wire frame brush should instantly change its looks to your wanted brush.

4. Now you probably would love to move this brush into your special spot in the room. =DLeft click on the wire frame model, so that it will be bright red. Hold down &quot;Ctrl&quot; while you press and hold Left mouse button, Right mouse button or Both mouse buttons.

Now try to move your mouse and see how this wire frame model is moving around. Try to see if you can move your brush to your heavily desired place.

5. Press &quot;Add&quot; if you want the space inside your brush to be filled.

&quot;or&quot; Press &quot;Subtract&quot; if you want the space inside your brush to be removed.

Congratulations, if you did this correctly, you now have added a brick or some other brush of your choice into the map.

You are now ready for the next step.

Improvements on this tutorial will be done over time.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adding An Adrenaline Combo With A Mutator</title>
    <id>507</id>
    <revision>
      <id>1597</id>
      <timestamp>2007-05-16T05:09:20Z</timestamp>
      <contributor>
        <ip>Cpe-70-120-199-55.austin.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 15 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

'''tornWolf:''' Just from a best practices point of view, it would likely be better to declare an int (const if we could) MAX_PLAYERS so that if the game will allow a different number than 32 players, that can be updated once in the code.  I'm a noob so I may be wrong, just thought I'd throw that in.

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Coding|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1598</id>
      <timestamp>2006-12-02T02:50:15Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 15 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Coding|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1599</id>
      <timestamp>2007-05-16T04:45:06Z</timestamp>
      <contributor>
        <ip>Cpe-70-120-199-55.austin.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 15 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

'''tornWolf:''' Just from a best practices point of view, it would likely be better to declare a constant int MAX_PLAYERS so that if the game will allow a different number than 32 players, that can be updated once in the code.  I'm a noob so I may be wrong, just thought I'd throw that in.

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Coding|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>28663</id>
      <timestamp>2008-05-20T11:02:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed non-existing category</comment>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 15 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

'''tornWolf:''' Just from a best practices point of view, it would likely be better to declare an int (const if we could) MAX_PLAYERS so that if the game will allow a different number than 32 players, that can be updated once in the code.  I'm a noob so I may be wrong, just thought I'd throw that in.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34364</id>
      <timestamp>2009-04-25T13:40:46Z</timestamp>
      <contributor>
        <username>Lord Farin</username>
        <id>909</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 15 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

'''tornWolf:''' Just from a best practices point of view, it would likely be better to declare an int (const if we could) MAX_PLAYERS so that if the game will allow a different number than 32 players, that can be updated once in the code.  I'm a noob so I may be wrong, just thought I'd throw that in.

'''Lord_Farin:''' Nice idea from Metal_Maniac (though this was abadoned long ago). I will start implementing it, as it will be a nice exercise on Mut and Combo making.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34381</id>
      <timestamp>2009-05-06T18:13:24Z</timestamp>
      <contributor>
        <username>Lord Farin</username>
        <id>909</id>
      </contributor>
      <minor/>
      <comment>3 seconds divided by 5% is not 15 seconds, it's 60...</comment>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 60 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

'''tornWolf:''' Just from a best practices point of view, it would likely be better to declare an int (const if we could) MAX_PLAYERS so that if the game will allow a different number than 32 players, that can be updated once in the code.  I'm a noob so I may be wrong, just thought I'd throw that in.

'''Lord_Farin:''' Nice idea from Metal_Maniac (though this was abadoned long ago). I will start implementing it, as it will be a nice exercise on Mut and Combo making.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34383</id>
      <timestamp>2009-05-06T18:44:22Z</timestamp>
      <contributor>
        <username>Lord Farin</username>
        <id>909</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This tutorial will show how to create an adrenaline combo and add the combo to all players through a mutator. The specific adrenaline combo that we are making is called the Bullet Time combo. What this adrenaline combo will allow us to do is once the combo is activated, gameplay speed will slowdown allowing all players to enter into &quot;Bullet Time&quot; like in the matrix trilogies.

==Getting Started==

First off, we will need to create the directory structure in the UT2004 directory. Create a folder named &quot;MutBulletTimeCombo&quot;. Then inside this folder, create another folder called &quot;Classes&quot;. For more information on the package structure, see [[Legacy:Set Up Package Folders|Set Up Package Folders]].

We will create our script files in the this directory. Next, go into the system directory and locate the ut2004.ini file. Open up the file and do a search for Editor.EditorEngine. In this section, you will see many &quot;EditPackages=X&quot; where X is a package name. Our package is MutBulletTimeCombo, so at the end of that list, add the line &quot;EditPackages=MutBulletTimeCombo&quot;.

==Creating Combo Class==

Create a new file in your preferred text editor and save the file as ComboBulletTime.uc. Inside that file, create a class called ComboBulletTime and have it extend the Combo class. This way, we gain access to the Combo class's functions and member variables. These will help us in creating our own adrenaline combo. Here is the code you will need:

&lt;uscript&gt;
class ComboBulletTime extends Combo;

var float fOrigGameSpeed;

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     fOrigGameSpeed = Level.Game.GameSpeed;
     Level.Game.SetGameSpeed(0.05);
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     Level.Game.SetGameSpeed(fOrigGameSpeed);
}

defaultproperties
{
     fOrigGameSpeed = 1.0;
     Duration = 3;
     ExecMessage = &quot;Bullet Time!&quot;
     keys[0] = 1;
     keys[1] = 2;
     keys[2] = 1;
     keys[3] = 2;
}
&lt;/uscript&gt;

The two functions called StartEffect and StopEffect both do exactly what the name implies. The variable Level is an object of the LevelInfo class declared in the Actor class. You have access to this variable because Combo extends from the Info class which then extends from the Actor class. Inside the LevelInfo class, there is a variable called Game which is an object of the GameInfo class. Take a look at these classes to see what these contain. Inside the GameInfo class, there is a function called SetGameSpeed that changes the value of GameSpeed within that same class. Here, we will change the game speed to be 0.05. The game speed is based on a percentage. A game speed of 1.0 means the game speed will be at 100%. We want to slow the game down, so a game speed of 5% will do the job. If you notice, we declared our own variable called fOrigGameSpeed. This is used to get the current game speed setting, which is usually 1.0, to set the speed back to once the adrenaline combo wears off.

The next thing to mention is the keys array in the default properties. These are where the combination of keys are declared that the player must press in order to get the combo activated. If you take a look at the Combo class, there are numbers which go with the direction the player presses. 1 is up, 2 is down, 4 is left, and 8 is right. In this example, the player must press &quot;Up, Down, Up, Down&quot; in that order when the player has full adrenaline to activate the combo.

Also in the default properties, you will notice the duration variable being declared to three. The reason for this is that we have set the game speed to 5%. So, 3 seconds running at 5% game speed will probably take like 60 seconds for the adrenaline to where off.

==Mutator==

Here, we will be adding a class called MutBulletTimeCombo, so create a new file of the same name and the .uc extension. When declaring the MutBulletTimeCombo class, have it extend Mutator. The code to add the Adrenaline combo to every player is below:

&lt;uscript&gt;
class MutBulletTimeCombo extends Mutator;

var xPlayer NotifyPlayer[32];

function Timer()
{
     local int i;

     for(i = 0; i &lt; 32; i++)
     {
          if(NotifyPlayer[i] != None)
          {
               NotifyPlayer[i].ClientReceiveCombo(&quot;MutBulletTimeCombo.ComboBulletTime&quot;);
               NotifyPlayer[i] = None;
          }

     }
}

function bool IsRelevant(Actor Other, out byte bSuperRelevant)
{
     local int i;

     if(xPlayer(Other) != None)
     {
          for(i=0; i&lt;16; i++)
	  {
	       if (xPlayer(Other).ComboNameList[i] ~= &quot;MutBulletTimeCombo.ComboBulletTime&quot;)
                    break;
               else if(xPlayer(Other).ComboNameList[i] == &quot;&quot;)
               {
                    xPlayer(Other).ComboNameList[i] = &quot;MutBulletTimeCombo.ComboBulletTime&quot;;
		    break;
               }
          }
          for(i = 0; i &lt; 32; i++)
          {
               if(NotifyPlayer[i] == None)
               {
                    NotifyPlayer[i] = xPlayer(Other);
                    SetTimer(0.5, false);
                    break;
               }
          }
     }
     if(NextMutator != None)
          return NextMutator.IsRelevant(Other, bSuperRelevant);
     else
          return true;
}

defaultproperties
{
    FriendlyName = &quot;Bullet Time Combo&quot;
    Description = &quot;Adds the bullet time combo (UDUD). The combo slows all gameplay down, but allows players aim to be more accurate, as seen in the Matrix trilogies.&quot;
}
&lt;/uscript&gt;

The description and the FriendlyName will be shown in the mutator list. The Timer function above will notify each player in the level about the new combo. To access the combo, you need to put in the package name, followed by the combo class. In this case, we add ComboBulletTime class in the MutBulletTimeCombo package. Now every player is like Neo!

ToDo: Add more description about the IsRelavant Function.

==Comments==

'''Mad:''' I hope this tutorial helps you in understanding how combos work and how it can be activated through a mutator. I recommend grabbing the sniper rifle upon performing this combo and get your headshots in. Feel free to leave any comments or make any suggestions about this tutorial. 

'''Metal_Maniac:''' I get the way it works, but what if you wanted to make something similar to the berzerk combo, or you wanted to make a mutator that gives you all the default weapons, and they all have infinite ammo, but for a limited time, and at the end of that time limit, your character explodes and dies, I'd call it &quot;KamiKaze Mania combo&quot;, so if anyone has a suggestion on how to make that, please reply.

'''tornWolf:''' Just from a best practices point of view, it would likely be better to declare an int (const if we could) MAX_PLAYERS so that if the game will allow a different number than 32 players, that can be updated once in the code.  I'm a noob so I may be wrong, just thought I'd throw that in.

'''Lord_Farin:''' Nice idea from Metal_Maniac (though this was abadoned long ago). I have coded it, fairly easy job. Any interested people, leave a message on my talk page.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adding Bot Backstory</title>
    <id>505</id>
    <revision>
      <id>1594</id>
      <timestamp>2006-07-26T23:48:11Z</timestamp>
      <contributor>
        <ip>69-44-250-40.mrc.clearwire-dns.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">(pasted from [[Legacy:Skinning|skinning]], which has been refactored)

now, you only need to do this if you want to make custom information for your new character(age, race, data)  if you do, follow along.  see where it says (Text=xplayers.      )and after the xplayers it has a race of somekind and two letters/numbers.  change these numbers/letters to two different ones.  open your system folder, and find the two files that are xplayers.  NOT xplayersL1 or L2, XPLAYERS.  there should be two. one of them is in spanish, so open the english one with notepad or something.  set it for wordwrap, if not already, and find the race type that was in your new characters upl.  make sure the two letters that you added are NOT the same as two already in the race type.  now, anywhere on this page, add that word that came after text=xplayers.------ it should be similar to the ones on the page already.  now, using the ones already there, set up that line to be like them i.e copy the line or something, just putting in your own info.  your character should now be able to work.  try it out by opening up the game, and setting your character to the one you made.  make sure your skin is right, and your info looks correct.  Congratulations, you just made a skin!!!</text>
    </revision>
    <revision>
      <id>1595</id>
      <timestamp>2006-02-02T14:29:30Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">(pasted from [[Legacy:Skinning|skinning]], which has been refactored)

now, you only need to do this if you want to make custom information for your new caharacter(age, race, data)  if you do, follow along.  see where it says (Text=xplayers.      )and after the xplayers it has a race of somekind and two letters/numbers.  change these numbers/letters to two different ones.  open your system folder, and find the two files that are xplayers.  NOT xplayersL1 or L2, XPLAYERS.  there should be two. one of them is in spanish, so open the english one with notepad or something.  set it for wordwrap, if not already, and find the race type that was in your new characters upl.  make sure the two letters that you added are NOT the same as two already in the race type.  now, anywhere on this page, add that word that came after text=xplayers.------ it should be similar to the ones on the page already.  now, using the ones already there, set up that line to be like them i.e copy the line or something, just putting in your own info.  your character should now be able to work.  try it out by opening up the game, and setting your character to the one you made.  make sure your skin is right, and your info looks correct.  Congratulations, you just made a skin!!!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adding Polish To Maps</title>
    <id>377</id>
    <revision>
      <id>1278</id>
      <timestamp>2006-05-10T05:01:10Z</timestamp>
      <contributor>
        <ip>129.174.176.4</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page lists the final details you need to consider adding to a map to get the perfectly polished professional look.

This little section is for those people wondering why their maps aren't getting any recognition. This is a do's and don'ts list to help you getting started in making 1337 maps, if your already pretty good at mapping (would DavidM read this anyway?) then this section may be of little use to you. (BTW, I have removed the Don'ts because they are unbeneficial, if you plan on contributing to this section then add the 'do' and explain why it is 'A Good Thing™', thanks)

See also [[Legacy:Mapping Checklist|Mapping Checklist]] and [[Legacy:Map Filesize|Map Filesize]].

Note: this used to be &quot;General Tips&quot;. New, more descriptive name.

===Do's ===

Things to consider:

* Trim edges of platforms whenever possible, it looks a lot cleaner (especially on stairs);
* Never skew brick textures... It's not only impossible, you won't even get them aligned properly.

'''Legal:''' False! I use brick textures on rounded corners. True, it's a lot of work fitting them properly but to claim it's impossible is not correct. For skewed surfaces it's the same thing, at least I can do it, but you might get a problem with certain textures.

'''ViolentFunction:'''  I think what he means is that it's physically impossible (in the real world) to build a wall out of bricks at a skewed angle, so you shouldn't do it in your map because it would be very unrealistic.  Notice he mentioned bricks only and not simply all wall designs.

'''Foxpaw:''' I wouldn't say that it's impossible either. You could file the bricks to make rounded surfaces or cut off parts to have them on diagonals, etc.

* Break up large flat surfaces with something interesting (a few lights, some girders, a sloping wall etc);
* Consider the theme of your map and choose textures and structures that match that.  Keep the theme consistent throughout the entire map. Texture your surfaces appropriately, for example a texture labeled floor is for the floor not the walls, it may seem obvious but it is amazing how many maps have made mistakes as simple as this.

'''AeroBLASTER:''' This is not necessarily true, or a mistake.  Just because a texture is in the floor section of a UTX, it doesn't mean it's not suitable for other usage.  If it looks good, use it.

'''Tarquin:''' I agree. Some of best mappers use floor textures on sections of walls, or ceiling textures (that blue-grey griod ceiling from one of the UTTechs is good for pieces of wall). Pillars are trim are often interchangeable.
* Lighting shouldn't be used just for making your level visible, use it to your advantage. Because UT only has a limited Polygon count it is difficult to make a really beautiful looking level. Using a healthy mix of lighting and shadows will add lots of atmosphere to your level.
* Seek advice from your peers on how to improve your map. It can be a little ego denting sometimes but in the long run it is very beneficial to you as a mapper.
* Use masked textures to create grates and such to see your opponents through platforms to better the effect of your level.
* Arches over doorways (or door frames) make them look good and give you a place to stick an overhead light. See [[Legacy:Making Arches|Making Arches]].
* Use ambient sounds!  Put them anywhere you can.  It adds an amazing amount of atmosphere to the map if you can hear that fan blowing, that water dripping, or the wind blasting over your hilltops.
* Assign environmental sound effects to your map using ZoneSounds.  UT200X supports EAX environmental sound technology which is utilized in the ZoneSounds portion of your ZoneInfo.  Just select a setting that closely matches what that particular zone of your level would be like (Arena, Stadium, StoneCorridor, WoodenRoom, etc) and click Add.  that's all!  The engine does the rest!  It takes 5 seconds and it greatly enhances the sound for those with EAX enabled!!  All Creative cards starting with the Audigy support EAX and many non-Creative cards also support it.  Even some AC97-audio cards have software support for EAX!  It takes no time at all, has ZERO impact on performance because it's dependent entirely on the sound card hardware (except when using software-EAX), and it has ZERO effect on people who don't have EAX enabled.
* Don't over or under scale your map.  A good rule to follow is not to make anything more than 256 units higher than the closest lower level.  Always keep in mind that the only weapon that can effectively hit things at a range of over 512 units it the sniper rifle, and then pretty much only from above.  Try to make your hallways narrow enough to where people don't have too much trouble hitting their opponents, but wide enough to leave some room for strafing.  Avoid edges that jut out, effectively making the room smaller than it need be. See [[Legacy:General Scale And Dimensions|General Scale And Dimensions]].
* Nothing should be plain.  Detail everything with architecture, and if your poly counts get too high, use shadows to hide flat, plain surfaces.
* When making symmetrical maps you may have some bsp holes in the game but you cannot see them or find them in the editor. To combat this problem you should put different textures on the walls of each direction to point you in the right direction in the editor. Then when it's all fixed just texture it the good way

:'''Tarquin:'''  I'm a bit baffled by that. How does applying textures work? Try Zone/Portal view, BSP holes will show up very clearly.

:'''EternalEpoch:''' I assume he means if you find a BSP error in game while play testing but can't find it in the editor, you texture as above so you can find the BSP error easier by following the textures. Cos some BSP errors only show up from certain angles etc.

It's well worth examining as many other levels as you can.  Try and work out how those areas of a map that are ''special'' were created.  Some of the cool tricks you will see are amazing.

===Dont's ===

=== Moving... ==

The following tips are to be moved to a new page: a basic checklist of what a map should have before it's released. I can't think of a good name, but my initial ideas are [[Legacy:Mapping Checklist|Mapping Checklist]] or [[Legacy:Final Touches On A Map|Final Touches on a Map]]
: what the heck. it's [[Legacy:Mapping Checklist|Mapping Checklist]]. We can always rename it ;) Tips moved.

----

'''Mychaeel:'''  What about renaming this page to &quot;General Mapping Tips&quot;?  &quot;General Tips&quot; could be anything...

'''Tarquin:'''  there are several tip pages: &quot;Lighting Tips&quot; (now deleted), [[Legacy:UnrealEd Tips|UnrealEd Tips]]. Some of this page is about style &amp; design, so I suggest:
* a rename to &quot;Design Tips&quot; 
* a shunt of some tips to other pages

I'm a bit wary of &quot;Tips&quot; lists: anything on the wiki could be a &quot;tip&quot;. granted, something like the use of expressions in property boxes is a very useful thing to know, and most people won't go reading up on &quot;Brushbuilders&quot; or &quot;actor Properties window&quot; because they think they already know all there is to know about those... but maybe they ''should''...

'''Mychaeel:'''  &quot;Mapping Tips&quot; could contain the most generic of those tips and link to &quot;Lighting Tips&quot; (remove &quot;and Tricks&quot;), &quot;Texture Tips&quot; and &quot;UnrealEd Tips.&quot; &amp;ndash; I wouldn't use &quot;Design Tips&quot; for the same reason I wouldn't use &quot;General Tips&quot; &amp;ndash; it's just too generic.  (Software needs to be designed as well.)

'''Tarquin:'''  Ok. The tips on style &amp; design could go to the [[Legacy:Map Design|Map Design]] page, pad it out a bit &amp; encourage some writing there.

'''Tarquin:'''  I've created (Mapping Tips) (removed) as a top level tip page. We have too many of these things. (rant) Tip pages are for people who want information pushed at them, rather than take a few minutes to seek it out.

'''TossMonkey:''' I'm gone for a month and I come back to find everything is different!! And you have completely dissected my little hideout! Anyway, I think there are too many tip sections. But this stuff is just general design help, and doesn't neccessarily fit into any of the technical editing aspects of the site.

'''Tarquin:'''  lol... you can make yourself a hideout on [[Legacy:Developer Journals|Developer Journals]]. :) I agree with you, there are too many tip sections. Design is an important aspect of mapping, so it definitely belongs on the site. We're slowly growing the [[Legacy:Map Design|Map Design]] page...

+

'''Tarquin:'''  Progress report: &quot;Texture tips&quot; -&gt; [[Legacy:Using Textures|Using Textures]]. &quot;Lighting Tips&quot; -&gt; Delete.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1279</id>
      <timestamp>2005-11-16T22:49:25Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page lists the final details you need to consider adding to a map to get the perfectly polished professional look.

This little section is for those people wondering why their maps aren't getting any recognition. This is a do's and don'ts list to help you getting started in making 1337 maps, if your already pretty good at mapping (would DavidM read this anyway?) then this section may be of little use to you. (BTW, I have removed the Don'ts because they are unbeneficial, if you plan on contributing to this section then add the 'do' and explain why it is 'A Good Thing™', thanks)

See also [[Legacy:Mapping Checklist|Mapping Checklist]] and [[Legacy:Map Filesize|Map Filesize]].

Note: this used to be &quot;General Tips&quot;. New, more descriptive name.

===Do's ===

Things to consider:

* Trim edges of platforms whenever possible, it looks a lot cleaner (especially on stairs);
* Never skew brick textures... It's not only impossible, you won't even get them aligned properly.

'''Legal:''' False! I use brick textures on rounded corners. True, it's a lot of work fitting them properly but to claim it's impossible is not correct. For skewed surfaces it's the same thing, at least I can do it, but you might get a problem with certain textures.

'''ViolentFunction:'''  I think what he means is that it's physically impossible (in the real world) to build a wall out of bricks at a skewed angle, so you shouldn't do it in your map because it would be very unrealistic.  Notice he mentioned bricks only and not simply all wall designs.

'''Foxpaw:''' I wouldn't say that it's impossible either. You could file the bricks to make rounded surfaces or cut off parts to have them on diagonals, etc.

* Break up large flat surfaces with something interesting (a few lights, some girders, a sloping wall etc);
* Consider the theme of your map and choose textures and structures that match that.  Keep the theme consistent throughout the entire map. Texture your surfaces appropriately, for example a texture labeled floor is for the floor not the walls, it may seem obvious but it is amazing how many maps have made mistakes as simple as this.

'''AeroBLASTER:''' This is not necessarily true, or a mistake.  Just because a texture is in the floor section of a UTX, it doesn't mean it's not suitable for other usage.  If it looks good, use it.

'''Tarquin:''' I agree. Some of best mappers use floor textures on sections of walls, or ceiling textures (that blue-grey griod ceiling from one of the UTTechs is good for pieces of wall). Pillars are trim are often interchangeable.
* Lighting shouldn't be used just for making your level visible, use it to your advantage. Because UT only has a limited Polygon count it is difficult to make a really beautiful looking level. Using a healthy mix of lighting and shadows will add lots of atmosphere to your level.
* Seek advice from your peers on how to improve your map. It can be a little ego denting sometimes but in the long run it is very beneficial to you as a mapper.
* Use masked textures to create grates and such to see your opponents through platforms to better the effect of your level.
* Arches over doorways (or door frames) make them look good and give you a place to stick an overhead light. See [[Legacy:Making Arches|Making Arches]].
* Use ambient sounds!  Put them anywhere you can.  It adds an amazing amount of atmosphere to the map if you can hear that fan blowing, that water dripping, or the wind blasting over your hilltops.
* Assign environmental sound effects to your map using ZoneSounds.  UT200X supports EAX environmental sound technology which is utilized in the ZoneSounds portion of your ZoneInfo.  Just select a setting that closely matches what that particular zone of your level would be like (Arena, Stadium, StoneCorridor, WoodenRoom, etc) and click Add.  that's all!  The engine does the rest!  It takes 5 seconds and it greatly enhances the sound for those with EAX enabled!!  All Creative cards starting with the Audigy support EAX and many non-Creative cards also support it.  Even some AC97-audio cards have software support for EAX!  It takes no time at all, has ZERO impact on performance because it's dependent entirely on the sound card hardware (except when using software-EAX), and it has ZERO effect on people who don't have EAX enabled.
* Don't over or under scale your map.  A good rule to follow is not to make anything more than 256 units higher than the closest lower level.  Always keep in mind that the only weapon that can effectively hit things at a range of over 512 units it the sniper rifle, and then pretty much only from above.  Try to make your hallways narrow enough to where people don't have too much trouble hitting their opponents, but wide enough to leave some room for strafing.  Avoid edges that jut out, effectively making the room smaller than it need be. See [[Legacy:General Scale And Dimensions|General Scale And Dimensions]].
* Nothing should be plain.  Detail everything with architecture, and if your poly counts get too high, use shadows to hide flat, plain surfaces.
* When making symmetrical maps you may have some bsp holes in the game but you cannot see them or find them in the editor. To combat this problem you should put different textures on the walls of each direction to point you in the right direction in the editor. Then when it's all fixed just texture it the good way. 

:'''Tarquin:'''  I'm a bit baffled by that. How does applying textures work? Try Zone/Portal view, BSP holes will show up very clearly.

:'''EternalEpoch:''' I assume he means if you find a BSP error in game while play testing but can't find it in the editor, you texture as above so you can find the BSP error easier by following the textures. Cos some BSP errors only show up from certain angles etc.

It's well worth examining as many other levels as you can.  Try and work out how those areas of a map that are ''special'' were created.  Some of the cool tricks you will see are amazing.

===Dont's ===

=== Moving... ==

The following tips are to be moved to a new page: a basic checklist of what a map should have before it's released. I can't think of a good name, but my initial ideas are [[Legacy:Mapping Checklist|Mapping Checklist]] or [[Legacy:Final Touches On A Map|Final Touches on a Map]]
: what the heck. it's [[Legacy:Mapping Checklist|Mapping Checklist]]. We can always rename it ;) Tips moved.

----

'''Mychaeel:'''  What about renaming this page to &quot;General Mapping Tips&quot;?  &quot;General Tips&quot; could be anything...

'''Tarquin:'''  there are several tip pages: &quot;Lighting Tips&quot; (now deleted), [[Legacy:UnrealEd Tips|UnrealEd Tips]]. Some of this page is about style &amp; design, so I suggest:
* a rename to &quot;Design Tips&quot; 
* a shunt of some tips to other pages

I'm a bit wary of &quot;Tips&quot; lists: anything on the wiki could be a &quot;tip&quot;. granted, something like the use of expressions in property boxes is a very useful thing to know, and most people won't go reading up on &quot;Brushbuilders&quot; or &quot;actor Properties window&quot; because they think they already know all there is to know about those... but maybe they ''should''...

'''Mychaeel:'''  &quot;Mapping Tips&quot; could contain the most generic of those tips and link to &quot;Lighting Tips&quot; (remove &quot;and Tricks&quot;), &quot;Texture Tips&quot; and &quot;UnrealEd Tips.&quot; &amp;ndash; I wouldn't use &quot;Design Tips&quot; for the same reason I wouldn't use &quot;General Tips&quot; &amp;ndash; it's just too generic.  (Software needs to be designed as well.)

'''Tarquin:'''  Ok. The tips on style &amp; design could go to the [[Legacy:Map Design|Map Design]] page, pad it out a bit &amp; encourage some writing there.

'''Tarquin:'''  I've created (Mapping Tips) (removed) as a top level tip page. We have too many of these things. (rant) Tip pages are for people who want information pushed at them, rather than take a few minutes to seek it out.

'''TossMonkey:''' I'm gone for a month and I come back to find everything is different!! And you have completely dissected my little hideout! Anyway, I think there are too many tip sections. But this stuff is just general design help, and doesn't neccessarily fit into any of the technical editing aspects of the site.

'''Tarquin:'''  lol... you can make yourself a hideout on [[Legacy:Developer Journals|Developer Journals]]. :) I agree with you, there are too many tip sections. Design is an important aspect of mapping, so it definitely belongs on the site. We're slowly growing the [[Legacy:Map Design|Map Design]] page...

+

'''Tarquin:'''  Progress report: &quot;Texture tips&quot; -&gt; [[Legacy:Using Textures|Using Textures]]. &quot;Lighting Tips&quot; -&gt; Delete.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adding Sunlight</title>
    <id>419</id>
    <revision>
      <id>1417</id>
      <timestamp>2006-12-27T15:23:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This page is one of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].'' 

[[Legacy:Sunlight|Sunlight]] has one tricky property which confounded me for about an hour making my first terrain. The light from a Sunlight ''will be blocked by the main subtracted brush itself unless you set its walls to Fake Backdrop''. A fake backdrop is used in outdoor areas to make the skybox texture visible in the map. To set this property, click on a wall in the 3D preview window, then hit the '''Shift-B''' key combination to select all the faces of the brush. This is what that should look like in the 3D viewport.

[[Image:Legacy_tutorial-terrain-13-Select-Walls.jpeg|center|]]

On the selected walls  do [[Legacy:Surface Context Menu|Surface Context Menu]] -&gt; Surface Properties, and in the [[Legacy:Surface Properties Window|surface properties window]] check the '''Fake Backdrop''' checkbox.

[[Image:Legacy_interface-Ed3-surface-flag.png|center|Caption]]

==Adding the Sunlight==

[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Light|Light]]  &gt;&gt; [[Legacy:Sunlight|Sunlight]] to your level. I like to move it up near the top of the subtracted cube. You'll also want to rotate it so the arrow points in the direction you want the light to shine. ''Note:'' in later builds of UT2003, the &quot;eagle-head&quot; icon as seen below has been replaced by a yellow ball icon, to look like a sun. Don't let this throw you.

[[Image:Legacy_tutorial-terrain-16-SunLight-FrontView.jpeg|center|]]

Now if you rebuild your level the terrain will be visible in the 3D viewport in Dynamic Lighting mode. The default settings for the Sunlight are a little dim, so you may want to increase the lighting brightness &amp; play with the color if you want. 

[[Image:Legacy_tutorial-terrain-17-Flat-Terrain-Dynamic-Lig.jpeg|center|]]

----

Next Lesson:
* [[Legacy:Building A SkyBox|Building A SkyBox]]

==Related Topics ==
* [[Legacy:Lighting|Lighting]]

==Discussion ==

'''Mr. Neutron:''' Hope I'm doing this right (editing whole document to add a comment). I didn't understand you saying that subtract brushes &quot;block&quot; sunlight without fake backdrop. What do you mean? Did it not work at all, or did the walls get funny lighting or what? I can't see how this would effect the lighting on the terrain.

'''Birelli:''' I'm not positive but I believe the reason that you might think that the large subtractive brush is actually &quot;blocking&quot; the light is that in order to get SunLight, you need to have walls set to fake backdrop for it to come &quot;from&quot;. I think it's easier just to think of it as that light comes &quot;out of your skybox&quot; and is transmitted through the fake backdrop walls, although this is most definitely not true in a technical sense.

'''CCFreak2K:''' If you go to [[Legacy:Creating A Terrain|Creating A Terrain]], you'll see that your sunlight actor should be placed in your level, not in your skybox (this is noted further down in that page).  You might also want to note that your box without fakebackdrop is much like a solid wall, and I can't remember the last time I saw sunlight go though a solid wall.

'''Bob_The_Beheader:''' Wait. I'm confused. Which brushes are you setting to fake backdrop? I hope no one minds me explaining what a fake backdrop is in this lesson. I basically copied the explaination from [[Legacy:Surface_Flags_(UT)|Surface_Flags_(UT)]]

'''Guest:''' The way I think of it is that when you subtract a space, you are creating its internal ceiling, floor, and four walls.  You can place various textures on these.  You can also set &quot;fake backdrop&quot; to make the wall &quot;invisible&quot;.  At runtime, the player will not be aware of the wall unless he/she collides with it, as the renderer will draw the skybox in its place.

'''Tarquin:''' IIRC, you should imagine that the sunlight is coming from infinitely far away, and that even though your Sunlight actor is IN your map, the light is coming from outside the subtracted area. So it needs to get through the &quot;ceiling&quot; of your area, so that has to be set to Fake Backdrop to let the light through.

'''Moofed:''' If your meshes suddenly start to flicker really badly and you have serveral Sunlight actors, try deleting some.  Once I had only 4 Sunlights the flickering went away.

'''Unknown:''' (Regarding the &quot;add the Sunlight actor&quot; step) How exactly do you do this? Please fill in the gaps in this explanation.

'''SuperApe:''' The link [[Legacy:Add An Actor|Add an Actor]], as you found out, is a [[:Category:Legacy Basic Procedure]], a foundational building block of knowledge in using the editor that will be used in many different tutorials on this wiki.  As such, it has been categorized as a &quot;first step&quot; for beginning users of the Unreal Editor.  Once you've mastered that knowledge (and the associated terminology used here on the wiki), you will find this becomes second nature.  Explaining this basic step (or several others covered in the Basic Procedure pages), would not only appear redundant, but cluttered and eventually disorganized to more experienced users.  As a side note, please keep your opinions in the Discussion section of the page.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1418</id>
      <timestamp>2006-12-27T10:00:43Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This page is one of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].'' 

[[Legacy:Sunlight|Sunlight]] has one tricky property which confounded me for about an hour making my first terrain. The light from a Sunlight ''will be blocked by the main subtracted brush itself unless you set its walls to Fake Backdrop''. A fake backdrop is used in outdoor areas to make the skybox texture visible in the map. To set this property, click on a wall in the 3D preview window, then hit the '''Shift-B''' key combination to select all the faces of the brush. This is what that should look like in the 3D viewport.

[[Image:Legacy_tutorial-terrain-13-Select-Walls.jpeg|center|]]

On the selected walls  do [[Legacy:Surface Context Menu|Surface Context Menu]] -&gt; Surface Properties, and in the [[Legacy:Surface Properties Window|surface properties window]] check the '''Fake Backdrop''' checkbox.

[[Image:Legacy_interface-Ed3-surface-flag.png|center|Caption]]

==Adding the Sunlight==

[[Legacy:???|???]]&gt;[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Light|Light]]  &gt;&gt; [[Legacy:Sunlight|Sunlight]] to your level. (How exactly do you do this? Please fill in the gaps in this explanation.) I like to move it up near the top of the subtracted cube. You'll also want to rotate it so the arrow points in the direction you want the light to shine. ''Note:'' in later builds of UT2003, the &quot;eagle-head&quot; icon as seen below has been replaced by a yellow ball icon, to look like a sun. Don't let this throw you.

[[Image:Legacy_tutorial-terrain-16-SunLight-FrontView.jpeg|center|]]

Now if you rebuild your level the terrain will be visible in the 3D viewport in Dynamic Lighting mode. The default settings for the Sunlight are a little dim, so you may want to increase the lighting brightness &amp; play with the color if you want. 

[[Image:Legacy_tutorial-terrain-17-Flat-Terrain-Dynamic-Lig.jpeg|center|]]

----

Next Lesson:
* [[Legacy:Building A SkyBox|Building A SkyBox]]

==Related Topics ==
* [[Legacy:Lighting|Lighting]]

==Discussion ==

'''Mr. Neutron:''' Hope I'm doing this right (editing whole document to add a comment). I didn't understand you saying that subtract brushes &quot;block&quot; sunlight without fake backdrop. What do you mean? Did it not work at all, or did the walls get funny lighting or what? I can't see how this would effect the lighting on the terrain.

'''Birelli:''' I'm not positive but I believe the reason that you might think that the large subtractive brush is actually &quot;blocking&quot; the light is that in order to get SunLight, you need to have walls set to fake backdrop for it to come &quot;from&quot;. I think it's easier just to think of it as that light comes &quot;out of your skybox&quot; and is transmitted through the fake backdrop walls, although this is most definitely not true in a technical sense.

'''CCFreak2K:''' If you go to [[Legacy:Creating A Terrain|Creating A Terrain]], you'll see that your sunlight actor should be placed in your level, not in your skybox (this is noted further down in that page).  You might also want to note that your box without fakebackdrop is much like a solid wall, and I can't remember the last time I saw sunlight go though a solid wall.

'''Bob_The_Beheader:''' Wait. I'm confused. Which brushes are you setting to fake backdrop? I hope no one minds me explaining what a fake backdrop is in this lesson. I basically copied the explaination from [[Legacy:Surface_Flags_(UT)|Surface_Flags_(UT)]]

'''Guest:''' The way I think of it is that when you subtract a space, you are creating its internal ceiling, floor, and four walls.  You can place various textures on these.  You can also set &quot;fake backdrop&quot; to make the wall &quot;invisible&quot;.  At runtime, the player will not be aware of the wall unless he/she collides with it, as the renderer will draw the skybox in its place.

'''Tarquin:''' IIRC, you should imagine that the sunlight is coming from infinitely far away, and that even though your Sunlight actor is IN your map, the light is coming from outside the subtracted area. So it needs to get through the &quot;ceiling&quot; of your area, so that has to be set to Fake Backdrop to let the light through.

'''Moofed:''' If your meshes suddenly start to flicker really badly and you have serveral Sunlight actors, try deleting some.  Once I had only 4 Sunlights the flickering went away.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Admin</title>
    <id>477</id>
    <revision>
      <id>1535</id>
      <timestamp>2004-10-15T20:19:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:AdminBase|AdminBase]] &gt;&gt; Admin (Package: Engine)}}

{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:AdminBase|AdminBase]] &gt;&gt; Admin (Package: Engine)}}

An [[Legacy:Object|Object]] within the [[Legacy:PlayerController|PlayerController]] class that allows players to login as server administrators and perform various administrative functions.

In UT200x this class is only used if the AccessControlClass is set to Engine.[[Legacy:AccessControl|AccessControl]], i.e. the basic admin interface. The advanced admin interface XAdmin.[[Legacy:AccessControlIni|AccessControlIni]] uses the [[Legacy:AdminIni|AdminIni]] class for handling logged-in admins.

In [[Legacy:Postal 2|Postal 2]] this is the only Admin class besides [[Legacy:AdminBase|AdminBase]] and it is the default for all [[Legacy:Postal 2|Postal 2]] gametypes.

==Functions [all exec]==

'''Note:''' In order for exec functions within this class to be executed, they must be preceded with the word &quot;admin&quot;. This is coded within [[Legacy:PlayerController|PlayerController]].

; DoLogin(string Password): Attempts to log the player in as an administrator. This is done by calling the [[Legacy:AccessControl|AccessControl]]'s AdminLogin function and comparing the given password with the AccessControl's admin password. If successful, the bAdmin value is set to true.

; DoLogout(): Logs the player out of administrator.

; KickBan(string S): Instructs the [[Legacy:GameInfo|GameInfo]] to kick and ban the player specified by S.

; Kick(string S): Instructs the [[Legacy:GameInfo|GameInfo]] to kick the player specified by S.

; PlayerList(): Logs a list of all players in the game along with their pings.

; RestartMap(): Supposedly restarts the map. However, due to a bug in the function, it simply causes the player giving the command to reconnect to the server.

; Switch(string URL): Tells the server to switch to the specified URL. URL can be a mapname or a full-blown URL with gametype, mutators, etc.

; NextMap(): Tells the server to switch to the next map.

==Related Topics==
* [[Legacy:AccessControl|AccessControl]]
* [[Legacy:Console Commands/Admin Console Commands|Console Commands/Admin Console Commands]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1536</id>
      <timestamp>2004-10-15T19:43:36Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>page created</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:AdminBase|AdminBase]] &gt;&gt; Admin (Package: Engine)}}

{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:AdminBase|AdminBase]] &gt;&gt; Admin (Package: Engine)}}

An [[Legacy:Object|Object]] within the [[Legacy:PlayerController|PlayerController]] class that allows players to login as server administrators and perform various administrative functions.

This class doesn't seem to be used in [[Legacy:UT2003|UT2003]], as the XAdmin's [[Legacy:AdminIni|AdminIni]] class extends from [[Legacy:AdminBase|AdminBase]] and not this class.

However, this is the only Admin class in [[Legacy:Postal 2|Postal 2]] besides [[Legacy:AdminBase|AdminBase]], and it is the default for all [[Legacy:Postal 2|Postal 2]] gametypes.

==Functions [all exec]==

'''Note:''' In order for exec functions within this class to be executed, they must be preceded with the word &quot;admin&quot;. This is coded within [[Legacy:PlayerController|PlayerController]].

; DoLogin(string Password): Attempts to log the player in as an administrator. This is done by calling the [[Legacy:AccessControl|AccessControl]]'s AdminLogin function and comparing the given password with the AccessControl's admin password. If successful, the bAdmin value is set to true.

; DoLogout(): Logs the player out of administrator.

; KickBan(string S): Instructs the [[Legacy:GameInfo|GameInfo]] to kick and ban the player specified by S.

; Kick(string S): Instructs the [[Legacy:GameInfo|GameInfo]] to kick the player specified by S.

; PlayerList(): Logs a list of all players in the game along with their pings.

; RestartMap(): Supposedly restarts the map. However, due to a bug in the function, it simply causes the player giving the command to reconnect to the server.

; Switch(string URL): Tells the server to switch to the specified URL. URL can be a mapname or a full-blown URL with gametype, mutators, etc.

; NextMap(): Tells the server to switch to the next map.

==Related Topics==
* [[Legacy:Console Commands/Admin Console Commands|Console Commands/Admin Console Commands]]
* [[:Category:Legacy Class (UT2003)]]
* [[:Category:Legacy Class (P2)]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AdminBase</title>
    <id>438</id>
    <revision>
      <id>1465</id>
      <timestamp>2004-10-15T20:16:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; AdminBase (Package: Engine)}}

{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; AdminBase (Package: Engine)}}

Base class for the [[Legacy:Admin|Admin]] object which allows players logged in as an administrator to perform administrative functions on the server such as kicking, map switching, and so on.

This class is almost an empty class, and any useful functions are left to its subclasses.

==Property==
; bool bAdmin: This property is set by a derived class' DoLogin() function when the player successfully logs in as an administrator.

==Function==
; DoLogout() [exec]: Stub to be filled in a derived class.

==Known Subclasses==
* [[Legacy:Admin|Admin]]
* [[Legacy:AdminIni|AdminIni]]

==Related Topics==
* [[Legacy:AccessControl|AccessControl]]
* [[Legacy:Console Commands/Admin Console Commands|Console Commands/Admin Console Commands]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1466</id>
      <timestamp>2004-10-15T19:46:38Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>edit</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; AdminBase (Package: Engine)}}

{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; AdminBase (Package: Engine)}}

Base class for the [[Legacy:Admin|Admin]] object which allows players logged in as an administrator to perform administrative functions on the server such as kicking, map switching, and so on.

This class is almost an empty class, and any useful functions are left to its subclasses.

==Property==
; bool bAdmin: This property is set by a derived class' DoLogin() function when the player successfully logs in as an administrator.

==Function==
; DoLogout() [exec]: Stub to be filled in a derived class.

==Known Subclasses==
 AdminBase
 +- [[Legacy:Admin|Admin]]
 +- [[Legacy:AdminIni|AdminIni]]

==Related Topics==
* [[Legacy:Console Commands/Admin Console Commands|Console Commands/Admin Console Commands]]
* [[:Category:Legacy Class (UT2003)]]
* [[:Category:Legacy Class (P2)]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AdminIni</title>
    <id>28658</id>
    <revision>
      <id>40514</id>
      <timestamp>2010-01-14T09:02:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Adrenaline</title>
    <id>406</id>
    <revision>
      <id>1349</id>
      <timestamp>2005-12-17T23:16:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Adrenaline is a game concept new in [[Legacy:UT2003|UT2003]].  It's acquired by killing people, capturing flags and performing other &quot;game related&quot; events, and collecting huge red/white pills scattered around the map.  Once you have 100 adrenaline points you can envoke a special &quot;Adrenaline Combo&quot; using quick key combinations (like an dodge jump).  The adrenaline accumulated is then spent at a rate of about 3 per second while the combo is in effect.

Amount of adrenaline awarded for various actions is set in [[Legacy:DeathMatch|DeathMatch]] and [[Legacy:TeamGame|TeamGame]].

==Default Adrenaline Combos==

The known adrenaline combos are:
; Speed (forward four times) : Makes you run super fast. 
; Booster (back four times) : Gives you health at a rate of 5 points per second up to 199, then it gives you shield at a rate of 5 per second up to 150.
; Invisibility (right twice, left twice) : Your character pawn is nearly invisible, given a texture that only shows shifting highlights. (Bots are not fooled)
; Beserk (forward twice, back twice) : Makes you fire at a twice the rate.

==Bonus Combos==

A mutator called &quot;Bonus Combos&quot; was included in the Epic Bonus pack for UT2004.
; Pint-size (left four times) : Your character pawn shrinks to a quarter size. (Mass reduced as well?)
; Camouflage (right four times) : Your character pawn is covered (not replaced) by a large static mesh object.  The static mesh object is attached to the pawn and will have no collision set.  This mesh can be defined in the [[Legacy:Level Properties|Level Properties]] of each map, there is a slot for both indoor and outdoor camouflage meshes.  If no mesh is defined in the map, a default &quot;crate&quot; mesh is used : &lt;tt&gt;HumanoidHardware.Beams.jribbedcolumn01HA&lt;/tt&gt;.  This combo is also called the Crate Combo, after the mutator name &lt;tt&gt;MutCrateCombo&lt;/tt&gt;.

[[Legacy:Mutator|Mutator]]s can add new combos.  If you build a custom combo, make sure it follows the naming convention, &lt;tt&gt;Mut&lt;blahblah&gt;Combo&lt;/tt&gt;, for identification purposes.

==Defining Combo Key Presses in Mutators ==

The key press combination for a combo is defined the class default properties.  The keys are translated as such:

&lt;uscript&gt;
// CK_Up      = 1;
// CK_Down    = 2;
// CK_Left    = 4;
// CK_Right   = 8;
&lt;/uscript&gt;

For example, the Double Damage Combo in the [http://inkless.com/xpak.html XXXpak] is left right left right or:

&lt;uscript&gt;
defaultproperties
{
     ExecMessage=&quot;Double Damage!&quot;
     ComboAnnouncement=Sound'PickupSounds.UDamagePickup'
     Duration=20
     keys(0)=4
     keys(1)=8
     keys(2)=4
     keys(3)=8
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Controller|Controller]] &amp;ndash; The class that handles Adrenaline for Pawns.
* [[Legacy:AdrenalinePickup|AdrenalinePickup]]
** [[Legacy:AdrenalinePickup/Script|AdrenalinePickup/script]] &amp;ndash; Source code for AdrenalinePickup. (commented for learning)
* [[Legacy:Modify Mutator Tutorial|Modify Mutator Tutorial]] &amp;ndash; A tutorial for making an adrenaline [[Legacy:Mutator|mutator]]
* The next [[Legacy:UTutes | UTute]] will be a combo tutorial, and will be more expansive.  UTute2 is directly about controlling adrenaline from a mutator.
* [[Legacy:ComboTrigger|ComboTrigger]] &amp;ndash; A custom Trigger that activates a combo for the touching player.

==Discussion==

'''Mysterial:''' Here's some bizareness for you: The combos that come with the game use 8 for CK_Right (you can see this in ComboInvis) yet custom subclasses (including Epic's Bonus Pack combo ComboCrate) use 4 for CK_Right. Also, has anyone gotten a combo using four different keys (Up Down Left Right, for example) to work? If so, did you need to do anything special and what did you use in your keys array?

'''Tarquin:''' Further bizareness: you can't tell which combos are available (beyond the four built-in) from within the game.

'''SuperApe:''' The two extra combos are pretty easy to spot in the Mutator subclass list, just look for &quot;Combo&quot;.  Question: Is the mass of the Pawn reduced as well during the Pint-size combo?

'''Tarquin:''' What I mean is that there's no way for UnrealScript to get a list of available combos.</text>
    </revision>
    <revision>
      <id>1350</id>
      <timestamp>2005-11-15T01:20:44Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Adrenaline is a game concept new in [[Legacy:UT2003|UT2003]].  It's acquired by killing people, capturing flags and performing other &quot;game related&quot; events, and collecting huge red/white pills scattered around the map.  Once you have 100 adrenaline points you can envoke a special &quot;Adrenaline Combo&quot; using quick key combinations (like an dodge jump).  The adrenaline accumulated is then spent at a rate of about 3 per second while the combo is in effect.

==Default Adrenaline Combos==

The known adrenaline combos are:
; Speed (forward four times) : Makes you run super fast. 
; Booster (back four times) : Gives you health at a rate of 5 points per second up to 199, then it gives you shield at a rate of 5 per second up to 150.
; Invisibility (right twice, left twice) : Your character pawn is nearly invisible, given a texture that only shows shifting highlights. (Bots are not fooled)
; Beserk (forward twice, back twice) : Makes you fire at a twice the rate.

==Bonus Combos==

A mutator called &quot;Bonus Combos&quot; was included in the Epic Bonus pack for UT2004.
; Pint-size (left four times) : Your character pawn shrinks to a quarter size. (Mass reduced as well?)
; Camouflage (right four times) : Your character pawn is covered (not replaced) by a large static mesh object.  The static mesh object is attached to the pawn and will have no collision set.  This mesh can be defined in the [[Legacy:Level Properties|Level Properties]] of each map, there is a slot for both indoor and outdoor camouflage meshes.  If no mesh is defined in the map, a default &quot;crate&quot; mesh is used : &lt;tt&gt;HumanoidHardware.Beams.jribbedcolumn01HA&lt;/tt&gt;.  This combo is also called the Crate Combo, after the mutator name &lt;tt&gt;MutCrateCombo&lt;/tt&gt;.

[[Legacy:Mutator|Mutator]]s can add new combos.  If you build a custom combo, make sure it follows the naming convention, &lt;tt&gt;Mut&lt;blahblah&gt;Combo&lt;/tt&gt;, for identification purposes.

Amount of adrenaline awarded for various actions is set in [[Legacy:DeathMatch|DeathMatch]] and [[Legacy:TeamGame|TeamGame]].

==Defining Combo Key Presses in Mutators ==

The key press combination for a combo is defined the class default properties.  The keys are translated as such:

&lt;uscript&gt;
// CK_Up      = 1;
// CK_Down    = 2;
// CK_Left    = 4;
// CK_Right   = 8;
&lt;/uscript&gt;

For example, the Double Damage Combo in the [http://inkless.com/xpak.html XXXpak] is left right left right or:

&lt;uscript&gt;
defaultproperties
{
     ExecMessage=&quot;Double Damage!&quot;
     ComboAnnouncement=Sound'PickupSounds.UDamagePickup'
     Duration=20
     keys(0)=4
     keys(1)=8
     keys(2)=4
     keys(3)=8
}
&lt;/uscript&gt;

==Discussion==

'''Mysterial:'''Here's some bizareness for you: The combos that come with the game use 8 for CK_Right (you can see this in ComboInvis) yet custom subclasses (including Epic's Bonus Pack combo ComboCrate) use 4 for CK_Right. Also, has anyone gotten a combo using four different keys (Up Down Left Right, for example) to work? If so, did you need to do anything special and what did you use in your keys array?

'''Tarquin:''' Further bizareness: you can't tell which combos are available (beyond the four built-in) from within the game.

'''SuperApe:''' The two extra combos are pretty easy to spot in the Mutator subclass list, just look for &quot;Combo&quot;.  Question: Is the mass of the Pawn reduced as well during the Pint-size combo?

==Related Topics==
* [[Legacy:Controller|Controller]] &amp;ndash; The class that handles Adrenaline for Pawns.
* [[Legacy:Modify Mutator Tutorial|Modify Mutator Tutorial]] &amp;ndash; A tutorial for making an adrenaline [[Legacy:Mutator|mutator]]
* The next [[Legacy:UTutes | UTute]] will be a combo tutorial, and will be more expansive.  UTute2 is directly about controlling adrenaline from a mutator.</text>
    </revision>
    <revision>
      <id>1351</id>
      <timestamp>2005-11-15T08:27:31Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adrenaline is a game concept new in [[Legacy:UT2003|UT2003]].  It's acquired by killing people, capturing flags and performing other &quot;game related&quot; events, and collecting huge red/white pills scattered around the map.  Once you have 100 adrenaline points you can envoke a special &quot;Adrenaline Combo&quot; using quick key combinations (like an dodge jump).  The adrenaline accumulated is then spent at a rate of about 3 per second while the combo is in effect.

Amount of adrenaline awarded for various actions is set in [[Legacy:DeathMatch|DeathMatch]] and [[Legacy:TeamGame|TeamGame]].

==Default Adrenaline Combos==

The known adrenaline combos are:
; Speed (forward four times) : Makes you run super fast. 
; Booster (back four times) : Gives you health at a rate of 5 points per second up to 199, then it gives you shield at a rate of 5 per second up to 150.
; Invisibility (right twice, left twice) : Your character pawn is nearly invisible, given a texture that only shows shifting highlights. (Bots are not fooled)
; Beserk (forward twice, back twice) : Makes you fire at a twice the rate.

==Bonus Combos==

A mutator called &quot;Bonus Combos&quot; was included in the Epic Bonus pack for UT2004.
; Pint-size (left four times) : Your character pawn shrinks to a quarter size. (Mass reduced as well?)
; Camouflage (right four times) : Your character pawn is covered (not replaced) by a large static mesh object.  The static mesh object is attached to the pawn and will have no collision set.  This mesh can be defined in the [[Legacy:Level Properties|Level Properties]] of each map, there is a slot for both indoor and outdoor camouflage meshes.  If no mesh is defined in the map, a default &quot;crate&quot; mesh is used : &lt;tt&gt;HumanoidHardware.Beams.jribbedcolumn01HA&lt;/tt&gt;.  This combo is also called the Crate Combo, after the mutator name &lt;tt&gt;MutCrateCombo&lt;/tt&gt;.

[[Legacy:Mutator|Mutator]]s can add new combos.  If you build a custom combo, make sure it follows the naming convention, &lt;tt&gt;Mut&lt;blahblah&gt;Combo&lt;/tt&gt;, for identification purposes.

==Defining Combo Key Presses in Mutators ==

The key press combination for a combo is defined the class default properties.  The keys are translated as such:

&lt;uscript&gt;
// CK_Up      = 1;
// CK_Down    = 2;
// CK_Left    = 4;
// CK_Right   = 8;
&lt;/uscript&gt;

For example, the Double Damage Combo in the [http://inkless.com/xpak.html XXXpak] is left right left right or:

&lt;uscript&gt;
defaultproperties
{
     ExecMessage=&quot;Double Damage!&quot;
     ComboAnnouncement=Sound'PickupSounds.UDamagePickup'
     Duration=20
     keys(0)=4
     keys(1)=8
     keys(2)=4
     keys(3)=8
}
&lt;/uscript&gt;

==Discussion==

'''Mysterial:'''Here's some bizareness for you: The combos that come with the game use 8 for CK_Right (you can see this in ComboInvis) yet custom subclasses (including Epic's Bonus Pack combo ComboCrate) use 4 for CK_Right. Also, has anyone gotten a combo using four different keys (Up Down Left Right, for example) to work? If so, did you need to do anything special and what did you use in your keys array?

'''Tarquin:''' Further bizareness: you can't tell which combos are available (beyond the four built-in) from within the game.

'''SuperApe:''' The two extra combos are pretty easy to spot in the Mutator subclass list, just look for &quot;Combo&quot;.  Question: Is the mass of the Pawn reduced as well during the Pint-size combo?

'''Tarquin:''' What I mean is that there's no way for UnrealScript to get a list of available combos.

==Related Topics==
* [[Legacy:Controller|Controller]] &amp;ndash; The class that handles Adrenaline for Pawns.
* [[Legacy:Modify Mutator Tutorial|Modify Mutator Tutorial]] &amp;ndash; A tutorial for making an adrenaline [[Legacy:Mutator|mutator]]
* The next [[Legacy:UTutes | UTute]] will be a combo tutorial, and will be more expansive.  UTute2 is directly about controlling adrenaline from a mutator.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AdrenalinePickup</title>
    <id>448</id>
    <revision>
      <id>1483</id>
      <timestamp>2005-12-01T00:06:04Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; AdrenalinePickup (Package: XPickups)}}

This is the adreneline pickup class.  Useful when fiddling with adreneline mutators.

==Properties==

This property is hidden.
; float AdrenalineAmount : Amount of adrenaline to award the [[Legacy:Controller|Controller]] who picks this up.

==Function==
; float DetourWeight( [[Legacy:Pawn|Pawn]] Other, float PathWeight ) : Value of this path to take a quick detour (usually 0, used when on route to distant objective, but want to grab inventory, for example).

==Events==
; float BotDesirability( [[Legacy:Pawn|Pawn]] Bot ) : This returns MaxDesirability unless Bot.Controller.bHuntPlayer is true or Bot.Controller.NeedsAdrenaline() returns false.

==States==
; Pickup (auto) : When the function Touch is called, the Other's &lt;tt&gt;Pawn.Controller.AwardAdrenaline( AdrenalineAmount )&lt;/tt&gt; function is called (if &lt;tt&gt;ValidTouch(Other)&lt;/tt&gt;), the pickup is announced and set to respawn.

==Source Code==

The [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]] page lists all the code for the class, heavily commented for learning.

==Related Topics==
* [[Legacy:Adrenaline|Adrenaline]]
* [[Legacy:Code References|Code References]]

==Discussion==</text>
    </revision>
    <revision>
      <id>1484</id>
      <timestamp>2003-10-05T20:05:03Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

This is the adreneline pickup class.  Useful when fiddling with adreneline mutators.

&lt;uscript&gt;
//=============================================================================
// AdrenalinePickup  //Name of the class
//=============================================================================
class AdrenalinePickup extends TournamentPickUp; //Says this class is a subclass of Tournament Pickups

var() float AdrenalineAmount; //The variable that determines adreneline you get from the pickup

DetourWeight() //How much the bots will stray off a course to pick up this object
function float DetourWeight(Pawn Other,float PathWeight)
{
	if ( !Other.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

event float BotDesireability(Pawn Bot) //Determines how much a bot will want to pick this up
{
	if ( Bot.Controller.bHuntPlayer )
		return 0;
	if ( !Bot.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

auto state Pickup //What happens when you pick this up
{	
	function Touch( actor Other )
	{
        local Pawn P;
			
		if ( ValidTouch(Other) ) //If a player touches an adreneline pill...
		{			
            P = Pawn(Other);	
    		P.Controller.AwardAdrenaline(AdrenalineAmount); //He will get Adreneline based off of the variable AdrenelineAmount...
            AnnouncePickup(P); //The player will recieve a message that he has recieved adreneline...
            SetRespawn(); //And the Adreneline will be set to respawn in a few seconds		
		}
	}
}

defaultproperties //Definitions for variables used by this class
{
     AdrenalineAmount=3.000000 //How much adreneline you get
     MaxDesireability=0.300000 //The amount of desireability the bots have for it
     RespawnTime=30.000000 //How long it takes to respawn (in second)
     PickupMessage=&quot;Adrenaline &quot; //The message you get when you pick it up
     PickupSound=Sound'PickupSounds.AdrenelinPickup' //The pick up sound
     PickupForce=&quot;AdrenelinPickup&quot;
     Physics=PHYS_Rotating //The physics for the adreneline model.  This sets the model to spin in place.
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'XPickups_rc.AdrenalinePack'
     DrawScale=0.075000
     AmbientGlow=255 //The glow the pill gives off
     ScaleGlow=0.600000
     Style=STY_AlphaZ
     CollisionRadius=32.000000 //The radius...
     CollisionHeight=23.000000 //And height to determine when you collide with the pickup, there adding it to your inventory
     Mass=10.000000 //The pill's mass
     RotationRate=(Yaw=24000) //How fast the pill rotates
}
&lt;/uscript&gt;

Any corrections are helpful and would be appreciated

==Related Topics==

[[Legacy:Code References|Code References]]

[[Legacy:TournamentPickup|TournamentPickup]]

==Comment==</text>
    </revision>
    <revision>
      <id>1485</id>
      <timestamp>2003-10-05T22:23:50Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; AdrenalinePickup (Package: XPickups)}}

This is the adreneline pickup class.  Useful when fiddling with adreneline mutators.

----

The [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]] page lists all the code for the class, heavily commented for learning.

----

==Related Topics==

[[Legacy:Code References|Code References]]

==Comments==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AdrenalinePickup/Script</title>
    <id>449</id>
    <revision>
      <id>1486</id>
      <timestamp>2005-12-01T00:05:12Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

&lt;uscript&gt;
//=============================================================================
// AdrenalinePickup  //Name of the class
//=============================================================================
class AdrenalinePickup extends TournamentPickUp; //Says this class is a subclass of Tournament Pickups

var() float AdrenalineAmount; //The variable that determines adreneline you get from the pickup

DetourWeight() //How much the bots will stray off a course to pick up this object
function float DetourWeight(Pawn Other,float PathWeight)
{
	if ( !Other.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

event float BotDesireability(Pawn Bot) //Determines how much a bot will want to pick this up
{
	if ( Bot.Controller.bHuntPlayer )
		return 0;
	if ( !Bot.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

auto state Pickup //What happens when you pick this up
{	
	function Touch( actor Other )
	{
        local Pawn P;
			
		if ( ValidTouch(Other) ) //If a player touches an adreneline pill...
		{			
            P = Pawn(Other);	
    		P.Controller.AwardAdrenaline(AdrenalineAmount); //He will get Adreneline based off of the variable AdrenelineAmount...
            AnnouncePickup(P); //The player will recieve a message that he has recieved adreneline...
            SetRespawn(); //And the Adreneline will be set to respawn in a few seconds		
		}
	}
}

defaultproperties //Definitions for variables used by this class
{
     AdrenalineAmount=3.000000 //How much adreneline you get
     MaxDesireability=0.300000 //The amount of desireability the bots have for it
     RespawnTime=30.000000 //How long it takes to respawn (in second)
     PickupMessage=&quot;Adrenaline &quot; //The message you get when you pick it up
     PickupSound=Sound'PickupSounds.AdrenelinPickup' //The pick up sound
     PickupForce=&quot;AdrenelinPickup&quot;
     Physics=PHYS_Rotating //The physics for the adreneline model.  This sets the model to spin in place.
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'XPickups_rc.AdrenalinePack'
     DrawScale=0.075000
     AmbientGlow=255 //The glow the pill gives off
     ScaleGlow=0.600000
     Style=STY_AlphaZ
     CollisionRadius=32.000000 //The radius...
     CollisionHeight=23.000000 //And height to determine when you collide with the pickup, there adding it to your inventory
     Mass=10.000000 //The pill's mass
     RotationRate=(Yaw=24000) //How fast the pill rotates
}
&lt;/uscript&gt;

'''''UT2004'''''

&lt;uscript&gt;
//=============================================================================
// AdrenalinePickup
//=============================================================================
class AdrenalinePickup extends TournamentPickUp;

var float AdrenalineAmount;

/* DetourWeight()
value of this path to take a quick detour (usually 0, used when on route to distant objective, but want to grab inventory for example)
*/
function float DetourWeight(Pawn Other,float PathWeight)
{
	if ( (PathWeight &gt; 500) || !Other.Controller.NeedsAdrenaline() )
		return 0;
	if ( (Other.Controller.Enemy != None) &amp;&amp; (Level.TimeSeconds - Other.Controller.LastSeenTime &lt; 1) )
		return 0;
	
	return 0.15/PathWeight;
}

event float BotDesireability(Pawn Bot)
{
	if ( Bot.Controller.bHuntPlayer )
		return 0;
	if ( !Bot.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

auto state Pickup
{	
	function Touch( actor Other )
	{
        local Pawn P;
			
		if ( ValidTouch(Other) ) 
		{			
            P = Pawn(Other);	
    		P.Controller.AwardAdrenaline(AdrenalineAmount);
            AnnouncePickup(P);
            SetRespawn();			
		}
	}
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Code References|Code References]]
* [[Legacy:Adrenaline|Adrenaline]]
* [[Legacy:AdrenalinePickup|AdrenalinePickup]]

==Discussion==</text>
    </revision>
    <revision>
      <id>1487</id>
      <timestamp>2004-12-06T00:31:56Z</timestamp>
      <contributor>
        <ip>Camper At Heart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

&lt;uscript&gt;
//=============================================================================
// AdrenalinePickup  //Name of the class
//=============================================================================
class AdrenalinePickup extends TournamentPickUp; //Says this class is a subclass of Tournament Pickups

var() float AdrenalineAmount; //The variable that determines adreneline you get from the pickup

DetourWeight() //How much the bots will stray off a course to pick up this object
function float DetourWeight(Pawn Other,float PathWeight)
{
	if ( !Other.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

event float BotDesireability(Pawn Bot) //Determines how much a bot will want to pick this up
{
	if ( Bot.Controller.bHuntPlayer )
		return 0;
	if ( !Bot.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

auto state Pickup //What happens when you pick this up
{	
	function Touch( actor Other )
	{
        local Pawn P;
			
		if ( ValidTouch(Other) ) //If a player touches an adreneline pill...
		{			
            P = Pawn(Other);	
    		P.Controller.AwardAdrenaline(AdrenalineAmount); //He will get Adreneline based off of the variable AdrenelineAmount...
            AnnouncePickup(P); //The player will recieve a message that he has recieved adreneline...
            SetRespawn(); //And the Adreneline will be set to respawn in a few seconds		
		}
	}
}

defaultproperties //Definitions for variables used by this class
{
     AdrenalineAmount=3.000000 //How much adreneline you get
     MaxDesireability=0.300000 //The amount of desireability the bots have for it
     RespawnTime=30.000000 //How long it takes to respawn (in second)
     PickupMessage=&quot;Adrenaline &quot; //The message you get when you pick it up
     PickupSound=Sound'PickupSounds.AdrenelinPickup' //The pick up sound
     PickupForce=&quot;AdrenelinPickup&quot;
     Physics=PHYS_Rotating //The physics for the adreneline model.  This sets the model to spin in place.
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'XPickups_rc.AdrenalinePack'
     DrawScale=0.075000
     AmbientGlow=255 //The glow the pill gives off
     ScaleGlow=0.600000
     Style=STY_AlphaZ
     CollisionRadius=32.000000 //The radius...
     CollisionHeight=23.000000 //And height to determine when you collide with the pickup, there adding it to your inventory
     Mass=10.000000 //The pill's mass
     RotationRate=(Yaw=24000) //How fast the pill rotates
}
&lt;/uscript&gt;

Any corrections are helpful and would be appreciated

==Related Topics==

[[Legacy:Code References|Code References]]

==Comment==

'''Camper at Heart:''' Could someone give me a hand with this?

&lt;uscript&gt;
//********************************************************************
// SuperAdren
//
// This wonderful little item gives you full adrenaline immediately.
//********************************************************************

class SuperAdren extends AdrenalinePickup;

#EXEC AUDIO IMPORT FILE=&quot;sounds/more.wav&quot; NAME=&quot;More&quot;

defaultproperties
{
  AdrenalineAmount=100.000000;
  PickupSound=Sound'SuperAdren.More';
}
&lt;/uscript&gt;

Why doesn't it work? :(</text>
    </revision>
    <revision>
      <id>1488</id>
      <timestamp>2004-12-06T00:39:15Z</timestamp>
      <contributor>
        <ip>Camper At Heart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

&lt;uscript&gt;
//=============================================================================
// AdrenalinePickup  //Name of the class
//=============================================================================
class AdrenalinePickup extends TournamentPickUp; //Says this class is a subclass of Tournament Pickups

var() float AdrenalineAmount; //The variable that determines adreneline you get from the pickup

DetourWeight() //How much the bots will stray off a course to pick up this object
function float DetourWeight(Pawn Other,float PathWeight)
{
	if ( !Other.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

event float BotDesireability(Pawn Bot) //Determines how much a bot will want to pick this up
{
	if ( Bot.Controller.bHuntPlayer )
		return 0;
	if ( !Bot.Controller.NeedsAdrenaline() )
		return 0;
	return MaxDesireability;
}

auto state Pickup //What happens when you pick this up
{	
	function Touch( actor Other )
	{
        local Pawn P;
			
		if ( ValidTouch(Other) ) //If a player touches an adreneline pill...
		{			
            P = Pawn(Other);	
    		P.Controller.AwardAdrenaline(AdrenalineAmount); //He will get Adreneline based off of the variable AdrenelineAmount...
            AnnouncePickup(P); //The player will recieve a message that he has recieved adreneline...
            SetRespawn(); //And the Adreneline will be set to respawn in a few seconds		
		}
	}
}

defaultproperties //Definitions for variables used by this class
{
     AdrenalineAmount=3.000000 //How much adreneline you get
     MaxDesireability=0.300000 //The amount of desireability the bots have for it
     RespawnTime=30.000000 //How long it takes to respawn (in second)
     PickupMessage=&quot;Adrenaline &quot; //The message you get when you pick it up
     PickupSound=Sound'PickupSounds.AdrenelinPickup' //The pick up sound
     PickupForce=&quot;AdrenelinPickup&quot;
     Physics=PHYS_Rotating //The physics for the adreneline model.  This sets the model to spin in place.
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'XPickups_rc.AdrenalinePack'
     DrawScale=0.075000
     AmbientGlow=255 //The glow the pill gives off
     ScaleGlow=0.600000
     Style=STY_AlphaZ
     CollisionRadius=32.000000 //The radius...
     CollisionHeight=23.000000 //And height to determine when you collide with the pickup, there adding it to your inventory
     Mass=10.000000 //The pill's mass
     RotationRate=(Yaw=24000) //How fast the pill rotates
}
&lt;/uscript&gt;

Any corrections are helpful and would be appreciated

==Related Topics==

[[Legacy:Code References|Code References]]

==Comment==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Aedis</title>
    <id>360</id>
    <revision>
      <id>1238</id>
      <timestamp>2005-01-14T03:26:15Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Contributions:

04/15/02: [[Legacy:RoundRobin|RoundRobin]] (Created)

04/15/02: [[Legacy:Triggered|triggered]] (Created)

04/16/02: [[Legacy:Shoot One, Shoot Two, Shoot Three|Shoot One, Shoot Two, Shoot Three]] (Created)

----

==Guestbook ==
: Here's your official &quot;welcome to the wiki&quot; cookie. Hope I don't sound like I'm ranting about some of the changes you've made. Even if I don't agree with them, they've highlighted things that need fixing or improving, and the wiki will be better for it. :-)  &amp;ndash; ''Tarquin'' 

====My Sandbox ====

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TableOfContentsMockup]]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1239</id>
      <timestamp>2005-01-14T02:46:23Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Aedis/TableOfContentsMockup</title>
    <id>349</id>
    <revision>
      <id>1211</id>
      <timestamp>2002-04-26T04:26:59Z</timestamp>
      <contributor>
        <ip>C-24-245-44-228.mn.client2.attbi.com</ip>
      </contributor>
      <comment>Page naming conventions</comment>
      <text xml:space="preserve">&lt;i&gt;Personal scratchpad for structuring ideas.  Feel free to comment and make suggestions but please do not modify.&lt;/i&gt; &amp;ndash; ''Aedis''

----

===Conventions ===

: ''Page Names:''&lt;br /&gt;&quot;&lt;i&gt;&lt;term&gt;&lt;/i&gt;&quot; &amp;ndash; definition page, such as [[Legacy:Actor|Actor]], &lt;br /&gt;&quot;&lt;i&gt;&lt;topic&gt;&lt;/i&gt; Overview&quot; &amp;ndash; intro page acting as a portal to detail pages, useful when a topic shares a name with a term, such as [[Legacy:Actor Overview|Actor Overview]]&lt;br /&gt;&quot;&lt;i&gt;&lt;topic&gt;&lt;/i&gt; Basics&quot; &amp;ndash; Entry-level tutorial to the topic&lt;br /&gt;&quot;&lt;i&gt;&lt;topic&gt;&lt;/i&gt; Masterclass&quot; &amp;ndash; Advanced tutorial, tips and tricks.

: ''Subtopics as necessary:''&lt;br /&gt;&quot;Light Masterclass/Coronas''&quot;&lt;br /&gt;&quot;Light Masterclass/Reducing Framerates&quot;&lt;br /&gt;&quot;Bot Support/Defense&quot;&lt;br /&gt;&quot;Bot Support/Sniping&quot;

=Table of Contents =

==Tutorials ==
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Graphics Design|Graphics Design]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Encyclop&amp;aelig;dia ==
* [[Legacy:Object|Class Reference]] ([[Legacy:Light (UT)|Lights]], [[Legacy:Brush|Brushes]], [[Legacy:Decoration|Decorations]], [[Legacy:Trigger|Triggers]], [[Legacy:NavigationPoint|Navigation Points]], and other [[Legacy:Actor|Actors]])
* [[Legacy:Texture Overview|Textures]]
* [[Legacy:Sound Overview|Sounds]]
* [[Legacy:Music Overview|Music]]
* [[Legacy:Mesh Overview|Meshes]]
* [[Legacy:UnrealScript|UnrealScript]]

==Unreal Topics ==
* [[Legacy:Mods Overview|Mods]]
* [[Legacy:Distribution|Distribution]]
* [[Legacy:Unreal Engine|Unreal Engine]]

==Other ==
* [[Legacy:External Links|External Links]]

----

=UnrealED Lessons =

==The Basics ==

&lt;i&gt;Don't be afraid!&lt;/i&gt;

* [[Legacy:Toolbar|The Toolbar]]
* [[Legacy:Toolbox|The Toolbox]]
* [[Legacy:UnrealEd Viewport|Understanding Viewports]]
* [[Legacy:Mouse Control|Mouse Control]]
* [[Legacy:Create A Room|Create A Room]]
* [[Legacy:Texture Topics|How Rooms are Decorated]]
* [[Legacy:Lighting|How Rooms are Lit]]
* [[Legacy:Preflight Steps|From PlayerStart to Play!]]

==Intermediate Lessons ==

&lt;i&gt;Let's have some fun&lt;/i&gt;

* [[Legacy:Sounds|Adding Sound]]
* [[Legacy:Triggers (UT)|Adding Interactivity with Triggers]]
* [[Legacy:PolyBrush Basics|Combining Brushes]]
* [[Legacy:Brush Clipping|Splitting Bruses]]
* [[Legacy:Teleportation Basics|Teleport!]]
* [[Legacy:Getting Warriors Killed|Getting Warriors Killed]]

==Advanced Techniques ==

&lt;i&gt;Show-off!&lt;/i&gt;
* [[Legacy:2D Shape Editor|From 2-D to 3-D]]
* [[Legacy:Vertex Editing|Vertex Editing]]
* [[Legacy:Trigger Systems|Advanced Interactivity]]
* [[Legacy:Create A Mover|Moving Parts]]
** [[Legacy:Making Doors|Making doors]]
** [[Legacy:Making Lifts|Making lifts]]
** [[Legacy:Mover Topics|Futher reading]]
* [[Legacy:Zoning|Zone Your World!]]

==Bots ==

&lt;i&gt;Who needs friends?&lt;/i&gt;

* [[Legacy:Path Basics|Bot Support]]
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Strategic Bots (DefensePoints, Sniping)|Strategic Bots (DefensePoints, Sniping)]]
* [[Legacy:Smart Bots (Translocation, Etc.)|Smart Bots (Translocation, etc.)]]

==Realistic Effects ==

&lt;i&gt;For overactive imaginations&lt;/i&gt;

* [[Legacy:Transparency And Solidity Basics|Simulating Glass]]
* [[Legacy:Making Liquids (UT)|Making Water, Lava, Slime]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Skybox Basics|The Skybox is the Limit]]

==Expert Topics ==

&lt;i&gt;No more baby-talk&lt;/i&gt;

====Techniques ====
* Lighting Tricks and Tips
** [[Legacy:Coronas|Coronas]]
** [[Legacy:Shadows|Shadows]]
* Textures
** [[Legacy:Importing Textures|Importing]]
** [[Legacy:Animated Textures|Animated]]
* [[Legacy:Warpzones|Portals]]
* [[Legacy:Gravity, Warp Tunnels|Gravity, Warp Tunnels]]
* [[Legacy:Embedding Code|Embedding Code]] or other packages
* [[Legacy:Making An Interpolation Path|Making an Interpolation Path]]
* [[Legacy:Using The Console|Extended Functionality Using the Console]]

====Gametype-specific ====
* [[Legacy:Mapping For DM|Deathmatch]]
* [[Legacy:Mapping For DOM|Domination]]
* [[Legacy:Mapping For CTF|Capture the Flag]]
* [[Legacy:Mapping For AS (UT)|Assault]]
* [[Legacy:Mapping For Unreal SinglePlayer|Unreal SinglePlayer]]
* [[Legacy:Mapping For Unreal Coop|Unreal Coop]]

====ScriptedPawns (Monsters) ====
* [[Legacy:AlarmPoints|AlarmPoints]]
* [[Legacy:Orders|Orders]]
* [[Legacy:General Scripted Sequences|General scripted sequences]]
* [[Legacy:Setting Up CreatureFactories|Setting up CreatureFactories]] 

====Additional Info ====
* [[Legacy:Brush Rotate|Gimbal lock]] or, why rotation in UEd doesn't always do what you want it to.

----

== Comments ===
: Looks good. Sorry, I couldn't resist changing the heading to &quot;Encyclop&amp;aelig;dia&quot;... I like the &quot;Mapping lessons&quot; page idea. Not sure about how you've organized the stuff Encyclopedia heading. How about you create &quot;Mapping Lessons / UnrealED Lessons&quot; as above (though pick one name, we're getting too many | in links), and I'll revamp the HomePage with your suggestions too &amp;ndash; give the Wiki a big breath of fresh air :-D  &amp;ndash; ''Tarquin'' 

&lt;font color=maroon&gt;Sorry for the delay &amp;ndash; work has caught up with me bigtime.  Hope to do some more Wiki this weekend.  In the meantime definitely feel free to implement away!  BTW &amp;ndash; I'm not at all dismayed by the debate &amp;ndash; the less punches pulled the faster the results, in my opinion.
&lt;/font&gt; - ''Aedis''</text>
    </revision>
    <revision>
      <id>1212</id>
      <timestamp>2002-04-24T10:13:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>added comments</comment>
      <text xml:space="preserve">&lt;i&gt;Personal scratchpad for structuring ideas.  Feel free to comment and make suggestions but please do not modify.&lt;/i&gt; &amp;ndash; ''Aedis''

----

=Table of Contents =

==Tutorials ==
* [[Legacy:Mapping Lessons|UnrealED Lessons]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Graphics Design|Graphics Design]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Encyclop&amp;aelig;dia ==
* [[Legacy:Object|Class Reference]] ([[Legacy:Light (UT)|Lights]], [[Legacy:Brush|Brushes]], [[Legacy:Decoration|Decorations]], [[Legacy:Trigger|Triggers]], [[Legacy:NavigationPoint|Navigation Points]], and other [[Legacy:Actor|Actors]])
* [[Legacy:Texture Topics|Textures]]
* [[Legacy:Sound Topics|Sounds]]
* [[Legacy:Music Topics|Music]]
* [[Legacy:Mesh Topics|Meshes]]
* [[Legacy:UnrealScript|UnrealScript]]

==Unreal Topics ==
* [[Legacy:Mods|Mods]]
* [[Legacy:Distribution|Distribution]]
* [[Legacy:Unreal Engine|Unreal Engine]]

==Other ==
* [[Legacy:External Links|External Links]]

----

=UnrealED Lessons =

==The Basics ==

&lt;i&gt;Don't be afraid!&lt;/i&gt;

* [[Legacy:Toolbar Basics|The Toolbar]]
* [[Legacy:Viewport Basics|Understanding Viewports &amp; The Mouse]]
* [[Legacy:Brush Basics|How Rooms are Made]]
* [[Legacy:Texture Basics|How Rooms are Decorated]]
* [[Legacy:Lighting Basics|How Rooms are Lit]]
* [[Legacy:Preflight Steps|From PlayerStart to Play!]]

==Intermediate Lessons ==

&lt;i&gt;Let's have some fun&lt;/i&gt;

* [[Legacy:Sound Basics|Adding Sound]]
* [[Legacy:Trigger Basics|Adding Interactivity with Triggers]]
* [[Legacy:Intersection And Deintersection|Combining Brushes]]
* [[Legacy:Brush Clipping|Splitting Bruses]]
* [[Legacy:Teleportation Basics|Teleport!]]
* [[Legacy:Getting Warriors Killed|Getting Warriors Killed]]

==Advanced Techniques ==

&lt;i&gt;Show-off!&lt;/i&gt;
* [[Legacy:2D Shape Editor|From 2-D to 3-D]]
* [[Legacy:Vertex Editing|Vertex Editing]]
* [[Legacy:Trigger Systems|Advanced Interactivity]]
* [[Legacy:Mover Basics|Moving Parts]]
** [[Legacy:Making Double-Doors|Making double-doors]]
** [[Legacy:Making Lifts|Making lifts]]
** [[Legacy:Simulating Locks And Keys Using Movers|Simulating locks and keys using Movers]]
* [[Legacy:Zone Basics|Zone Your World!]]

==Bots ==

&lt;i&gt;Who needs friends?&lt;/i&gt;

* [[Legacy:Path Basics|Bot Support]]
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Strategic Bots (DefensePoints, Sniping)|Strategic Bots (DefensePoints, Sniping)]]
* [[Legacy:Smart Bots (Translocation, Etc.)|Smart Bots (Translocation, etc.)]]

==Realistic Effects ==

&lt;i&gt;For overactive imaginations&lt;/i&gt;

* [[Legacy:Transparency And Solidity Basics|Simulating Glass]]
* [[Legacy:Making Liquids (UT)|Making Water, Lava, Slime]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Skybox Basics|The Skybox is the Limit]]

==Expert Topics ==

&lt;i&gt;No more baby-talk&lt;/i&gt;

====Techniques ====
* Lighting Tricks and Tips
** [[Legacy:Coronas|Coronas]]
** [[Legacy:Shadows|Shadows]]
* Textures
** [[Legacy:Importing Textures|Importing]]
** [[Legacy:Animated Textures|Animated]]
* [[Legacy:Warpzones|Portals]]
* [[Legacy:Gravity, Warp Tunnels|Gravity, Warp Tunnels]]
* [[Legacy:Embedding Code|Embedding Code]] or other packages
* [[Legacy:Making An Interpolation Path|Making an Interpolation Path]]
* [[Legacy:Using The Console|Extended Functionality Using the Console]]

====Gametype-specific ====
* [[Legacy:Mapping For DM|Deathmatch]]
* [[Legacy:Mapping For DOM|Domination]]
* [[Legacy:Mapping For CTF|Capture the Flag]]
* [[Legacy:Mapping For AS (UT)|Assault]]
* [[Legacy:Mapping For Unreal SinglePlayer|Unreal SinglePlayer]]
* [[Legacy:Mapping For Unreal Coop|Unreal Coop]]

====ScriptedPawns (Monsters) ====
* [[Legacy:AlarmPoints|AlarmPoints]]
* [[Legacy:Orders|Orders]]
* [[Legacy:General Scripted Sequences|General scripted sequences]]
* [[Legacy:Setting Up CreatureFactories|Setting up CreatureFactories]] 

====Additional Info ====
* [[Legacy:Brush Rotate|Gimbal lock]] or, why rotation in UEd doesn't always do what you want it to.

----

== Comments ===
: Looks good. Sorry, I couldn't resist changing the heading to &quot;Encyclop&amp;aelig;dia&quot;... I like the &quot;Mapping lessons&quot; page idea. Not sure about how you've organized the stuff Encyclopedia heading. How about you create &quot;Mapping Lessons / UnrealED Lessons&quot; as above (though pick one name, we're getting too many | in links), and I'll revamp the HomePage with your suggestions too &amp;ndash; give the Wiki a big breath of fresh air :-D  &amp;ndash; ''Tarquin''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AeroBLASTER/Developer Journal</title>
    <id>431</id>
    <revision>
      <id>1446</id>
      <timestamp>2003-08-05T09:41:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">==Journal Of A Mapper - What To Do, But Mostly, What Not To Do ==

This is a Journal of Lessons Learned during the creation of my UT maps.

===DM-Mirror ===
* Make sure the name is interesting ameks sense.  A more proper name for this map would've been DM-Suckiness.
* No matter how many cubed brushes you use, they're still cubes.  Try something a little less... Bland.
* Only use enough pathnodes to cover the map.  More pathnodes = more confused bots.  Oh, and slime confuses them.
* Don't clutter things up.  An interesting room shape is better than hundreds of cube &quot;Rafters&quot;.
* Align them textures!  When you just can't seem to get thngs aligned right, take the easy way out.  Use a grain texture or chunk a sheet of the lot of it.
* Reflective surfaces suck.
* Skinny hallways suck.  Cramped quarters are good to certain extent, but not THIS small.

===DM-What's That Purple Stuff? ===
* An interesting idea carries a map a long way.  Even one as simple as cool purple texturing.
* Creating the ultimate camping spot may be fun, but it's ultimately detrimental to gameplay.  Don't do it.
* Falling from really high up sucks.  Use caution when creating high places.
* Good [[Legacy:Z-Axis|Z-axis]] is fun, just make sure there are plenty of places to get between the two axises.
* Dead ends suck.  Make sure you can always get to that place you can see.
* The more lift exits/centers a bot has to use to get somewhere, the less likely he is to go there.

===DM-Septicus ===
* Mapping contests rock.
* As in DM-Mirror, don't clutter things up too much.
* Big, complex rooms are a breeding ground for nasty BSP errors.
* Items, especially health vials and ammo, provide great incentive for a bot to follow a path.  They also act as pathnodes, spawned or not.
* Ambient sounds are cool.  Use them.
* Crushing movers are cool.  Use them.
* Apparently, I didn't fully learn my lesson in Purple Stuff.  High places suck.  Use with caution.
* Put side rails on the sides of staircases.  It covers up the ugly texture problems on the many surface and makes things look more realistic and fancy.
* All-seeing snipe points with enough room for the sniper to stay out of the path of anyone who notices them are cheap.  If you use sniping points, make sure there's enough reason for the sniper not to stay there too long.

More to come!  I'm still mapping, and I learn new things every day.  I'll be sure to share them with you.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1447</id>
      <timestamp>2002-04-20T22:37:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a Journal of Lessons Learned during the creation of my UT maps.

===DM-Mirror ===
* Make sure the name is interesting ameks sense.  A more proper name for this map would've been DM-Suckiness.
* No matter how many cubed brushes you use, they're still cubes.  Try something a little less... Bland.
* Only use enough pathnodes to cover the map.  More pathnodes = more confused bots.  Oh, and slime confuses them.
* Don't clutter things up.  An interesting room shape is better than hundreds of cube &quot;Rafters&quot;.
* Align them textures!  When you just can't seem to get thngs aligned right, take the easy way out.  Use a grain texture or chunk a sheet of the lot of it.
* Reflective surfaces suck.
* Skinny hallways suck.  Cramped quarters are good to certain extent, but not THIS small.

===DM-What's That Purple Stuff? ===
* An interesting idea carries a map a long way.  Even one as simple as cool purple texturing.
* Creating the ultimate camping spot may be fun, but it's ultimately detrimental to gameplay.  Don't do it.
* Falling from really high up sucks.  Use caution when creating high places.
* Good Z-axis is fun, just make sure there are plenty of places to get between the two axises.
* Dead ends suck.  Make sure you can always get to that place you can see.
* The more lift exits/centers a bot has to use to get somewhere, the less likely he is to go there.

===DM-Septicus ===
* Mapping contests rock.
* As in DM-Mirror, don't clutter things up too much.
* Big, complex rooms are a breeding ground for nasty BSP errors.
* Items, especially health vials and ammo, provide great incentive for a bot to follow a path.  They also act as pathnodes, spawned or not.
* Ambient sounds are cool.  Use them.
* Crushing movers are cool.  Use them.
* Apparently, I didn't fully learn my lesson in Purple Stuff.  High places suck.  Use with caution.
* Put side rails on the sides of staircases.  It covers up the ugly texture problems on the many surface and makes things look more realistic and fancy.
* All-seeing snipe points with enough room for the sniper to stay out of the path of anyone who notices them are cheap.  If you use sniping points, make sure there's enough reason for the sniper not to stay there too long.

More to come!  I'm still mapping, and I learn new things every day.  I'll be sure to share them with you.</text>
    </revision>
    <revision>
      <id>1448</id>
      <timestamp>2002-06-18T13:14:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Journal Of A Mapper - What To Do, But Mostly, What Not To Do ==

This is a Journal of Lessons Learned during the creation of my UT maps.

===DM-Mirror ===
* Make sure the name is interesting ameks sense.  A more proper name for this map would've been DM-Suckiness.
* No matter how many cubed brushes you use, they're still cubes.  Try something a little less... Bland.
* Only use enough pathnodes to cover the map.  More pathnodes = more confused bots.  Oh, and slime confuses them.
* Don't clutter things up.  An interesting room shape is better than hundreds of cube &quot;Rafters&quot;.
* Align them textures!  When you just can't seem to get thngs aligned right, take the easy way out.  Use a grain texture or chunk a sheet of the lot of it.
* Reflective surfaces suck.
* Skinny hallways suck.  Cramped quarters are good to certain extent, but not THIS small.

===DM-What's That Purple Stuff? ===
* An interesting idea carries a map a long way.  Even one as simple as cool purple texturing.
* Creating the ultimate camping spot may be fun, but it's ultimately detrimental to gameplay.  Don't do it.
* Falling from really high up sucks.  Use caution when creating high places.
* Good [[Legacy:Z-Axis|Z-axis]] is fun, just make sure there are plenty of places to get between the two axises.
* Dead ends suck.  Make sure you can always get to that place you can see.
* The more lift exits/centers a bot has to use to get somewhere, the less likely he is to go there.

===DM-Septicus ===
* Mapping contests rock.
* As in DM-Mirror, don't clutter things up too much.
* Big, complex rooms are a breeding ground for nasty BSP errors.
* Items, especially health vials and ammo, provide great incentive for a bot to follow a path.  They also act as pathnodes, spawned or not.
* Ambient sounds are cool.  Use them.
* Crushing movers are cool.  Use them.
* Apparently, I didn't fully learn my lesson in Purple Stuff.  High places suck.  Use with caution.
* Put side rails on the sides of staircases.  It covers up the ugly texture problems on the many surface and makes things look more realistic and fancy.
* All-seeing snipe points with enough room for the sniper to stay out of the path of anyone who notices them are cheap.  If you use sniping points, make sure there's enough reason for the sniper not to stay there too long.

More to come!  I'm still mapping, and I learn new things every day.  I'll be sure to share them with you.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AgentBionicman</title>
    <id>411</id>
    <revision>
      <id>1361</id>
      <timestamp>2006-12-02T02:56:30Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Orphan page hunting.</comment>
      <text xml:space="preserve">My thoughts about lag and why I think reliable replication is partly to blame.

When there is information sent reliably to a client from a server and 

that information is not being received, due to network interference,

the server has to keep sending that information until it is received, as the game progresses more 

information needs to be sent to the client reliably, all this inforamtion starts building up untill 

a spike of information is sent out to the client causing lag.

Note: that in the Actor class there's no reliable replication at all.

==Comments :)==

'''MythOpus:''' LIES!

'''AgentBionicman''' What if all replication in uscript used reliable replication? There would be serious

lag, wouldn't there? Thats what I'm trying to point out. Perhaps I didn't described it cleary above.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1362</id>
      <timestamp>2005-05-23T03:56:52Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">My thoughts about lag and why I think reliable replication is partly to blame.

When there is information sent reliably to a client from a server and 

that information is not being received, due to network interference,

the server has to keep sending that information until it is received, as the game progresses more 

information needs to be sent to the client reliably, all this inforamtion starts building up untill 

a spike of information is sent out to the client causing lag.

Note: that in the Actor class there's no reliable replication at all.

==Comments :)==

'''MythOpus:''' LIES!</text>
    </revision>
    <revision>
      <id>1363</id>
      <timestamp>2005-05-28T23:13:14Z</timestamp>
      <contributor>
        <ip>AgentBionicman</ip>
      </contributor>
      <comment>added comment</comment>
      <text xml:space="preserve">My thoughts about lag and why I think reliable replication is partly to blame.

When there is information sent reliably to a client from a server and 

that information is not being received, due to network interference,

the server has to keep sending that information until it is received, as the game progresses more 

information needs to be sent to the client reliably, all this inforamtion starts building up untill 

a spike of information is sent out to the client causing lag.

Note: that in the Actor class there's no reliable replication at all.

==Comments :)==

'''MythOpus:''' LIES!

'''AgentBionicman''' What if all replication in uscript used reliable replication? There would be serious

lag, wouldn't there? Thats what I'm trying to point out. Perhaps I didn't described it cleary above.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AimedAttachment</title>
    <id>28464</id>
    <revision>
      <id>40163</id>
      <timestamp>2009-11-17T10:48:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Alam GBC</title>
    <id>420</id>
    <revision>
      <id>1419</id>
      <timestamp>2003-06-30T15:46:29Z</timestamp>
      <contributor>
        <ip>Alam GBC</ip>
      </contributor>
      <minor/>
      <comment>Comcast update</comment>
      <text xml:space="preserve">Hello? wow, so this is a wiki, i hope i did this page, right

Well, I am Alam_GBC(that with a underscore)(no, not GameBoy Color, i had this name long before GBC was out, it means game-bonef code/co-admin)

I also have a twin called Logan_GBA(A for Admin, yes, make fun of him)

I love to program(how much?, i almost always forget to do my homework:rolleyes:)

I like to Play Unreal1/Unreal Gold

That mean I like to code for Unreal1(UT is too much for my skills now)

plus I like to play coop(like 98% of the time)

* EMAIL: Alam_GBC at yahoo dot com
* HOMEPAGE: http://Alam_gbc.home.comcast.net
* Yahoo : Alam_GBC
* MSN : Alam_GBC#hotmail*com(don't care)
* AIM : AlamGBC

History:
* Age 6: Got our 1st Computer, w00t
* Age 8: Pick Up my BASIC book from school
* Age 10: Find out GBx(z86) ASM
* Age 12: Learn C(just to understard it)
* Age 14: Took a hack at Java(I still don't get the Mult-Inheandant bit of classes)
* Age 15?: GBA(86x ASM/ARM) programming(I start to like JAVA-like then ASM)
* Age 16: When to Unreal Gold(This game have been sitting for 5 Years) &lt;br /&gt;Meet [[Legacy:Joss|Joss]], look at her souce code for [http://www.geocities.com/J88oss JCoop] and got into making a gametype that expands her gametype
* Age 17: Unknown

I love to work on old computer and deivces(is this a crime?)

'''Wormbo:''' Yup, you did. Welcome to the Unreal Wiki.

'''EntropicLqd:''' Hi, welcome to the Wiki.  Have fun :)

'''Tarquin:''' Hi there. (about old computers... I have several 386s in bits and most of a pentium 133. currently pondering installing linux on it, but first have to work out why non of my dloppy drives work on it ... :( )

'''Alam GBC:''' It could that old floppy drives hav their &quot;head&quot; not alined with what currunt floppy drive have, you could do a network install(if you have an old (maybe ISA?) network card), or maybe the cable is in wrong (light go on all the time when this haps), oh you misspelled floppy wrong, you know that? :D

'''El Muerte TDS:''' and you misspelled ''history'' ;)

'''Alam GBC:''' ... :hmm: oh so, a game of &quot;who can find more spelling mistakes then the other can&quot; is it?

'''Tarquin:''' Well everyone can correct everyone else's spelling mistakes :) How do they end up with their head not aligned? :( can anything be done about it? I have an old network card, but it's a BNC cable and my other stuff is the thingy (er.... like phone plugs but wider) type. 

'''Alam GBC:''' the bios can make the movement of the motor wrong(yes, this did happed alot),what i do is take the floppy drive that format/put the install stuff on the disk and put it in the older computer, that way, the haed aligned is the same.1 way: The phone plugs thige is called ethernet, you can make a crossover ethernet cable to pulg between 2 computers. both get a manual ip adress(192.168.0.254 for the computer for that have the files and 192.168.0.253 for the so-be-lunix computer. Send thru ftp or http([http://www.janaserver.de try jana server]), and w00t, i have a linix computer,i have a linix computer!:P(plus i don't have to spend money for CD-R)well, this is the way i went to install linux(Red Hat). 2nd way: burn CD images onto CD-Rs(i had no CD-R burner back then) and hope that your old computer's cd-rom can read the CD-Rs :/, well i think i talk/type too much now, go ask your local lunix gurk to help you.

'''Tarquin:''' ''(my email will be protected from spammer by the hidden(banme) link, right?)'' What sort of hidden banme link?

'''Alam GBC:''' the one for people who try to download with an offline reader also works aghist spammer's web bots that doesn't reads the robots.txt file, right or did i read that part wrong somewhere?

'''Tarquin:''' I can't remember if we implemented that. Best to hide your email with &quot;foo atsign bar dot com&quot; type thing.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1420</id>
      <timestamp>2003-05-08T22:00:13Z</timestamp>
      <contributor>
        <ip>Alam GBC</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hello? wow, so this is a wiki, i hope i did this page, right

Well, I am Alam_GBC(that with a underscore)(no, not GameBoy Color, i had this name long before GBC was out, it means game-bonef code/co-admin)

I also have a twin called Logan_GBA(A for Admin, yes, make fun of him)

I love to program(how much?, i almost always forget to do my homework:rolleyes:)

I like to Play Unreal1/Unreal Gold

That mean I like to code for Unreal1(UT is too much for my skills now)

plus I like to play coop(like 98% of the time)

* EMAIL: Alam_GBC@yahoo.com (my email will be protected from spammer by the hidden(banme) link, right?)
* HOMEPAGE: http://Alam_gbc.home.attbi.com 
* Yahoo : Alam_GBC
* MSN : Alam_GBC@hotmail.com
* AIM : AlamGBC

History:
* Age 6: Got our 1st Computer, w00t
* Age 8: Pick Up my BASIC book from school
* Age 10: Find out GBx(z86) ASM
* Age 12: Learn C(just to understard it)
* Age 14: Took a hack at Java(I still don't get the Mult-Inheandant bit of classes)
* Age 15?: GBA(86x ASM/ARM) programming(I start to like JAVA-like then ASM)
* Age 16: When to Unreal Gold(This game have been sitting for 5 Years) &lt;br /&gt;Meet [[Legacy:Joss|Joss]], look at her souce code for [http://www.geocities.com/J88oss JCoop] and got into making a gametype that expands her gametype
* Age 17: Unknown

I love to work on old computer and deivces(is this a crime?)

'''Wormbo:''' Yup, you did. Welcome to the Unreal Wiki.

'''EntropicLqd:''' Hi, welcome to the Wiki.  Have fun :)

'''Tarquin:''' Hi there. (about old computers... I have several 386s in bits and most of a pentium 133. currently pondering installing linux on it, but first have to work out why non of my dloppy drives work on it ... :( )

'''Alam GBC:''' It could that old floppy drives hav their &quot;head&quot; not alined with what currunt floppy drive have, you could do a network install(if you have an old (maybe ISA?) network card), or maybe the cable is in wrong (light go on all the time when this haps), oh you misspelled floppy wrong, you know that? :D

'''El Muerte TDS:''' and you misspelled ''history'' ;)

'''Alam GBC:''' ... :hmm: oh so, a game of &quot;who can find more spelling mistakes then the other can&quot; is it?

'''Tarquin:''' Well everyone can correct everyone else's spelling mistakes :) How do they end up with their head not aligned? :( can anything be done about it? I have an old network card, but it's a BNC cable and my other stuff is the thingy (er.... like phone plugs but wider) type. 

'''Alam GBC:''' the bios can make the movement of the motor wrong(yes, this did happed alot),what i do is take the floppy drive that format/put the install stuff on the disk and put it in the older computer, that way, the haed aligned is the same.1 way: The phone plugs thige is called ethernet, you can make a crossover ethernet cable to pulg between 2 computers. both get a manual ip adress(192.168.0.254 for the computer for that have the files and 192.168.0.253 for the so-be-lunix computer. Send thru ftp or http([http://www.janaserver.de try jana server]), and w00t, i have a linix computer,i have a linix computer!:P(plus i don't have to spend money for CD-R)well, this is the way i went to install linux(Red Hat). 2nd way: burn CD images onto CD-Rs(i had no CD-R burner back then) and hope that your old computer's cd-rom can read the CD-Rs :/, well i think i talk/type too much now, go ask your local lunix gurk to help you.

'''Tarquin:''' ''(my email will be protected from spammer by the hidden(banme) link, right?)'' What sort of hidden banme link?

'''Alam GBC:''' the one for people who try to download with an offline reader also works aghist spammer's web bots that doesn't reads the robots.txt file, right or did i read that part wrong somewhere?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1421</id>
      <timestamp>2003-05-08T22:10:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello? wow, so this is a wiki, i hope i did this page, right

Well, I am Alam_GBC(that with a underscore)(no, not GameBoy Color, i had this name long before GBC was out, it means game-bonef code/co-admin)

I also have a twin called Logan_GBA(A for Admin, yes, make fun of him)

I love to program(how much?, i almost always forget to do my homework:rolleyes:)

I like to Play Unreal1/Unreal Gold

That mean I like to code for Unreal1(UT is too much for my skills now)

plus I like to play coop(like 98% of the time)

* EMAIL: Alam_GBC@yahoo.com (my email will be protected from spammer by the hidden(banme) link, right?)
* HOMEPAGE: http://Alam_gbc.home.attbi.com 
* Yahoo : Alam_GBC
* MSN : Alam_GBC@hotmail.com
* AIM : AlamGBC

History:
* Age 6: Got our 1st Computer, w00t
* Age 8: Pick Up my BASIC book from school
* Age 10: Find out GBx(z86) ASM
* Age 12: Learn C(just to understard it)
* Age 14: Took a hack at Java(I still don't get the Mult-Inheandant bit of classes)
* Age 15?: GBA(86x ASM/ARM) programming(I start to like JAVA-like then ASM)
* Age 16: When to Unreal Gold(This game have been sitting for 5 Years) &lt;br /&gt;Meet [[Legacy:Joss|Joss]], look at her souce code for [http://www.geocities.com/J88oss JCoop] and got into making a gametype that expands her gametype
* Age 17: Unknown

I love to work on old computer and deivces(is this a crime?)

'''Wormbo:''' Yup, you did. Welcome to the Unreal Wiki.

'''EntropicLqd:''' Hi, welcome to the Wiki.  Have fun :)

'''Tarquin:''' Hi there. (about old computers... I have several 386s in bits and most of a pentium 133. currently pondering installing linux on it, but first have to work out why non of my dloppy drives work on it ... :( )

'''Alam GBC:''' It could that old floppy drives hav their &quot;head&quot; not alined with what currunt floppy drive have, you could do a network install(if you have an old (maybe ISA?) network card), or maybe the cable is in wrong (light go on all the time when this haps), oh you misspelled floppy wrong, you know that? :D

'''El Muerte TDS:''' and you misspelled ''history'' ;)

'''Alam GBC:''' ... :hmm: oh so, a game of &quot;who can find more spelling mistakes then the other can&quot; is it?

'''Tarquin:''' Well everyone can correct everyone else's spelling mistakes :) How do they end up with their head not aligned? :( can anything be done about it? I have an old network card, but it's a BNC cable and my other stuff is the thingy (er.... like phone plugs but wider) type. 

'''Alam GBC:''' the bios can make the movement of the motor wrong(yes, this did happed alot),what i do is take the floppy drive that format/put the install stuff on the disk and put it in the older computer, that way, the haed aligned is the same.1 way: The phone plugs thige is called ethernet, you can make a crossover ethernet cable to pulg between 2 computers. both get a manual ip adress(192.168.0.254 for the computer for that have the files and 192.168.0.253 for the so-be-lunix computer. Send thru ftp or http([http://www.janaserver.de try jana server]), and w00t, i have a linix computer,i have a linix computer!:P(plus i don't have to spend money for CD-R)well, this is the way i went to install linux(Red Hat). 2nd way: burn CD images onto CD-Rs(i had no CD-R burner back then) and hope that your old computer's cd-rom can read the CD-Rs :/, well i think i talk/type too much now, go ask your local lunix gurk to help you.

'''Tarquin:''' ''(my email will be protected from spammer by the hidden(banme) link, right?)'' What sort of hidden banme link?

'''Alam GBC:''' the one for people who try to download with an offline reader also works aghist spammer's web bots that doesn't reads the robots.txt file, right or did i read that part wrong somewhere?

'''Tarquin:''' I can't remember if we implemented that. Best to hide your email with &quot;foo atsign bar dot com&quot; type thing.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlarmPoint</title>
    <id>340</id>
    <revision>
      <id>1190</id>
      <timestamp>2006-04-21T22:26:13Z</timestamp>
      <contributor>
        <ip>192.251.69.68</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AlarmPoint (Package: Engine)}}

Under a [[Legacy:ScriptedPawn|ScriptedPawn]]'s properties you'll find an &quot;Orders&quot; tab. Expand it and you find an AlarmTag tab. Enter the tag of the AlarmTag you want this pawn to act towards. An AlarmTag is, as the name kinda reveals, an actor that the Pawns react to when they are &quot;alarmed&quot; &amp;ndash; or more simply put when they see the player/players. 

==Properties==
; name AlarmAnim : The anim played when the pawn is alarmed: enter the name of an animation for the pawn's model. To see available animations, look in the [[Legacy:Mesh Browser|Mesh Browser]].
; sound AlarmSound : The sound played when the pawn is alarmed 
; bool bAttackWhilePaused : Uncertain on this one but I think this option, when set to true, will make the pawn stop each time he wishes to fire. He won't move and shoot at the same time 
; bool bDestroyAlarmTriggerer : Destroys whatever set the &quot;alarm&quot; off (usually the player) 
; bool bKillMe : if set to true the pawn reach an AlarmPoint that has this tab set to true it will be removed from the level (The pawn, not the tag:) 
; bool bNoFail : if set to true the pawn is obsesed with succeeding with whatever script the AlarmTag holds and nothing but death will stop it
; bool bStopIfNoEnemy : if set to true the pawn will halt with what he is doing and return to his idle animations 
; bool bStrafeTo : if set to true the pawn will strafe rather than walking straight to this point 
; float DuckTime : If set to 0 the pawn will ignore it. If set to 1 or above the pawn will duck during the time of &quot;1&quot; something (miliseconds is it? seconds?) 
; name NextAlarm : Enter the tag of anohter AlarmPoint to form a chain, or a path which the pawn will follow. They run trough this course doing whatever is selected in the AlarmPoints' options
; float PauseTime : If set to 0 the pawn will ignore it. If set to 1 or above the pawn will pause (stand still) at this point during the time entered in the tab 
; name ShootTarget : Write the [[Legacy:Tag|Tag]] of an actor here to make the pawn attack it

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]
* [[Legacy:HomeBase|HomeBase]]

==Discussion==

'''SuperApe:''' Based on the property usage, I made educated guesses as to the property type, but I do not have UT to check against.  If incorrect, please fix.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1191</id>
      <timestamp>2003-07-11T01:10:40Z</timestamp>
      <contributor>
        <ip>Slakkie</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; AlarmPoint}}

AlarmPoints. 

Under a [[Legacy:ScriptedPawn|ScriptedPawn]]'s propeties you'll find an &quot;Orders&quot; tab. Expand it and you find an AlarmTag tab. Enter the tag of the AlarmTag you want this pawn to act towards. An AlarmTag is, as the name kinda reveals, an actor that the Pawns react to when they are &quot;alarmed&quot; &amp;ndash; or more simply put when they see the player/players. 

This powerful little actor holds the following properties 

; AlarmAnim : The anim played when the pawn is alarmed: enter the name of an animation for the pawn's model. To see available animations, look in the [[Legacy:Mesh Browser|Mesh Browser]].
; AlarmSound : The sound played when the pawn is alarmed 
; bAttackWhilePaused : Uncertain on this one but I think this option, when set to true, will make the pawn stop each time he wishes to fire. He won't move and shoot at the same time 
; bDestroyAlarmTriggerer : Destroys whatever set the &quot;alarm&quot; off (usually the player) 
; bKillMe : if set to true the pawn reach an AlarmPoint that has this tab set to true it will be removed from the level (The pawn, not the tag:) 
; bNoFail : if set to true the pawn is obsesed with succeeding with whatever script the AlarmTag holds and nothing but death will stop it
; bStopIfNoEnemy : if set to true the pawn will halt with what he is doing and return to his idle animations 
; bStrafeTo : if set to true the pawn will strafe rather than walking straight to this point 
; DuckTime : If set to 0 the pawn will ignore it. If set to 1 or above the pawn will duck during the time of &quot;1&quot; something (miliseconds is it? seconds?) 
; NextAlarm : Enter the tag of anohter AlarmPoint to form a chain, or a path which the pawn will follow. They run trough this course doing whatever is selected in the AlarmPoints' options
; PauseTime : If set to 0 the pawn will ignore it. If set to 1 or above the pawn will pause (stand still) at this point during the time entered in the tab 
; ShootTarget : Write the [[Legacy:Tag|tag]] of an actor here to make the pawn attack it</text>
    </revision>
    <revision>
      <id>1192</id>
      <timestamp>2006-01-28T01:57:55Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AlarmPoint (Package: Engine)}}

Under a [[Legacy:ScriptedPawn|ScriptedPawn]]'s properties you'll find an &quot;Orders&quot; tab. Expand it and you find an AlarmTag tab. Enter the tag of the AlarmTag you want this pawn to act towards. An AlarmTag is, as the name kinda reveals, an actor that the Pawns react to when they are &quot;alarmed&quot; &amp;ndash; or more simply put when they see the player/players. 

==Properties==
; AlarmAnim : The anim played when the pawn is alarmed: enter the name of an animation for the pawn's model. To see available animations, look in the [[Legacy:Mesh Browser|Mesh Browser]].
; AlarmSound : The sound played when the pawn is alarmed 
; bAttackWhilePaused : Uncertain on this one but I think this option, when set to true, will make the pawn stop each time he wishes to fire. He won't move and shoot at the same time 
; bDestroyAlarmTriggerer : Destroys whatever set the &quot;alarm&quot; off (usually the player) 
; bKillMe : if set to true the pawn reach an AlarmPoint that has this tab set to true it will be removed from the level (The pawn, not the tag:) 
; bNoFail : if set to true the pawn is obsesed with succeeding with whatever script the AlarmTag holds and nothing but death will stop it
; bStopIfNoEnemy : if set to true the pawn will halt with what he is doing and return to his idle animations 
; bStrafeTo : if set to true the pawn will strafe rather than walking straight to this point 
; DuckTime : If set to 0 the pawn will ignore it. If set to 1 or above the pawn will duck during the time of &quot;1&quot; something (miliseconds is it? seconds?) 
; NextAlarm : Enter the tag of anohter AlarmPoint to form a chain, or a path which the pawn will follow. They run trough this course doing whatever is selected in the AlarmPoints' options
; PauseTime : If set to 0 the pawn will ignore it. If set to 1 or above the pawn will pause (stand still) at this point during the time entered in the tab 
; ShootTarget : Write the [[Legacy:Tag|tag]] of an actor here to make the pawn attack it

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]
* [[Legacy:HomeBase|HomeBase]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlexAC</title>
    <id>428</id>
    <revision>
      <id>1438</id>
      <timestamp>2003-06-23T11:54:52Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">Hey this page does now... umm live!

prepear for me L33t Mutators n maps n stuff.

but i suck at codeing so nm the mutators!

----

'''Mychaeel:''' Welcome to the Wiki, and happy editing.

'''EntropicLqd:''' Hi, Enjoy your stay at the Wiki.  Good luck with the coding.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1439</id>
      <timestamp>2003-06-23T11:33:43Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">Hey this page does now... umm live!

prepear for me L33t Mutators n maps n stuff.

but i suck at codeing so nm the mutators!

----

'''Mychaeel:''' Welcome to the Wiki, and happy editing.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Alien</title>
    <id>425</id>
    <revision>
      <id>1431</id>
      <timestamp>2006-12-02T02:57:56Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Orphan page hunting.</comment>
      <text xml:space="preserve">{{innerbox|Build UT2003_Build_[2003-04-07_17.42]

}}

{{innerbox|OS: Windows 98 4.10 (Build: 67766446)

CPU: AuthenticAMD PentiumPro-class processor @ 1196 MHz with 255MB RAM

Video: NVIDIA GeForce4 MX 420 (2942)

}}

{{innerbox|CreateWindowEx failed: The operation completed successfully.

}}

{{innerbox|History: PerformCreateWindowEx &lt;- WCheckListBox::OpenWindow &lt;- WBrowserActor::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserActor::OpenWindow &lt;- WM_BROWSER_DOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop

}}

Can anybody help me ?

==Comments==

'''GRAF1K:''' Notice &lt;tt&gt;WM_BROWSER_DOCK&lt;/tt&gt; in the crash history. A few people I've heard of have UEd crash when the try and dock something, but apparently It's docking the browser tabs on first load. Try going in Unrealed.ini and changing Docked=1 to Docked=0 under [Texture Browser], [Sound Browser], etc.

'''El Muerte TDS:''' Notice &lt;tt&gt;OS: Windows 98 4.10&lt;/tt&gt;, UnrealEd3 runs like crap on win98, you can't do anything about it. It's best to use Windows 2000 or newer.

'''GRAF1K:''' ...what he said, only save yourelf a headache and a half: don't get XP. I recommend Win2KPro 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1432</id>
      <timestamp>2003-10-25T17:01:18Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|Build UT2003_Build_[2003-04-07_17.42]

}}

{{innerbox|OS: Windows 98 4.10 (Build: 67766446)

CPU: AuthenticAMD PentiumPro-class processor @ 1196 MHz with 255MB RAM

Video: NVIDIA GeForce4 MX 420 (2942)

}}

{{innerbox|CreateWindowEx failed: The operation completed successfully.

}}

{{innerbox|History: PerformCreateWindowEx &lt;- WCheckListBox::OpenWindow &lt;- WBrowserActor::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserActor::OpenWindow &lt;- WM_BROWSER_DOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop

}}

Can anybody help me ?

==Comments==

'''GRAF1K:''' Notice &lt;tt&gt;WM_BROWSER_DOCK&lt;/tt&gt; in the crash history. A few people I've heard of have UEd crash when the try and dock something, but apparently It's docking the browser tabs on first load. Try going in Unrealed.ini and changing Docked=1 to Docked=0 under [Texture Browser], [Sound Browser], etc.

'''El Muerte TDS:''' Notice &lt;tt&gt;OS: Windows 98 4.10&lt;/tt&gt;, UnrealEd3 runs like crap on win98, you can't do anything about it. It's best to use Windows 2000 or newer.</text>
    </revision>
    <revision>
      <id>1433</id>
      <timestamp>2003-10-25T17:08:27Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|Build UT2003_Build_[2003-04-07_17.42]

}}

{{innerbox|OS: Windows 98 4.10 (Build: 67766446)

CPU: AuthenticAMD PentiumPro-class processor @ 1196 MHz with 255MB RAM

Video: NVIDIA GeForce4 MX 420 (2942)

}}

{{innerbox|CreateWindowEx failed: The operation completed successfully.

}}

{{innerbox|History: PerformCreateWindowEx &lt;- WCheckListBox::OpenWindow &lt;- WBrowserActor::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserActor::OpenWindow &lt;- WM_BROWSER_DOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop

}}

Can anybody help me ?

==Comments==

'''GRAF1K:''' Notice &lt;tt&gt;WM_BROWSER_DOCK&lt;/tt&gt; in the crash history. A few people I've heard of have UEd crash when the try and dock something, but apparently It's docking the browser tabs on first load. Try going in Unrealed.ini and changing Docked=1 to Docked=0 under [Texture Browser], [Sound Browser], etc.

'''El Muerte TDS:''' Notice &lt;tt&gt;OS: Windows 98 4.10&lt;/tt&gt;, UnrealEd3 runs like crap on win98, you can't do anything about it. It's best to use Windows 2000 or newer.

'''GRAF1K:''' ...what he said, only save yourelf a headache and a half: don't get XP. I recommend Win2KPro</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Alien8</title>
    <id>424</id>
    <revision>
      <id>1429</id>
      <timestamp>2003-05-21T08:44:31Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki, Alien8. :)

'''Tarquin:''' Hi, welcome to the site. Note that &quot;Category Class (UT)&quot; is meant to tag class spec pages only, not all pages about UT. :)

'''EntropicLqd:''' Hello and welcome.  It has been a while since I last saw that name I can tell you.

'''Alien8:'''  Hey guys :)

Tarquin: Yeah, sorry about that - I sorta figured I mighta screwed up on that, but I didn't know for sure, so I left it alone.

Entropic:  Hey man - yeah, it's been quite awhile alright.  I sorta left the 'scene' (and I hate calling it that, 'cuz it just sounds... stupid) right around the time that BU started up - Pete took me onboard, and I helped a bit with some of the back-end stuff, but then Real Life kind of took me away.  I started reading this wiki quite awhile ago - I'm no coder, that's for damn sure, but reading about it piques my interest.  I figured it was about time that I did my part in helping out :)

'''Tarquin:''' No worries :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1430</id>
      <timestamp>2003-05-21T00:25:31Z</timestamp>
      <contributor>
        <ip>Alien8</ip>
      </contributor>
      <comment>Heyas all</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki, Alien8. :)

'''Tarquin:''' Hi, welcome to the site. Note that &quot;Category Class (UT)&quot; is meant to tag class spec pages only, not all pages about UT. :)

'''EntropicLqd:''' Hello and welcome.  It has been a while since I last saw that name I can tell you.

'''Alien8:'''  Hey guys :)

Tarquin: Yeah, sorry about that - I sorta figured I mighta screwed up on that, but I didn't know for sure, so I left it alone.

Entropic:  Hey man - yeah, it's been quite awhile alright.  I sorta left the 'scene' (and I hate calling it that, 'cuz it just sounds... stupid) right around the time that BU started up - Pete took me onboard, and I helped a bit with some of the back-end stuff, but then Real Life kind of took me away.  I started reading this wiki quite awhile ago - I'm no coder, that's for damn sure, but reading about it piques my interest.  I figured it was about time that I did my part in helping out :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Alpha Channel</title>
    <id>427</id>
    <revision>
      <id>1436</id>
      <timestamp>2007-01-11T21:12:06Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>A little refactoring</comment>
      <text xml:space="preserve">An '''alpha channel''', also sometimes called a mask, controls the transparency of an image. In programs like Lightwave and 3D Studio, the image and its alpha channel can be separate image files, but most image formats store the alpha channel information within the main image file. For [[Legacy:Texture Import And Export|importing to UnrealEd]], it's best to use 32 bit [[Wikipedia:TGA]] (Targa) files.

Alpha channels use black for transparent areas, and white for opaque areas. Files that are only black and white are sometimes called masks. An example might be an image of a tree where the trunk, branches, and leaves are visible but everything else is &quot;invisible&quot; or transparent.

They can also be used to make gradual shifts in transparency such as with the simulated glow of coronas and particles. Since black is transparent, a dark grey (eg, RGB 10,10,10) is mostly transparent but not completely.

Alpha channels are used to simulate 3D geometry without increasing the number of physical polygons. For example, a picket fence would require modeling individual boards and nails while an alpha channel image fence would simply contain and image of a fence and its alpha channel; transparent areas around the top and between individual fence boards.

==About the .TGA file format ==
*It is designed for high quality, raster images.
*They can be very large files because 1 byte is used for each color .
*TGAs support greyscale transparency, and so store the mask within the TGA.
*A TGA with an alpha channel (transparency information) are typically 32 bit files.
*TGA files can be run length encoded to save space; RLE compression is directly proportional to the complexity of the image. &quot;Noisy&quot; images don't compress well, while bands of the same color do compress well.
*TGAs are sometimes called Targas or Targavision, or Truevision Targa.

see [[Wikipedia:TGA]] for more in-depth information.

==Adding An Alpha Channel to an Image ==

===Adobe Photoshop ===

# Using the various laso tools, magic wand and the pen tool make your selection. If you don't already know how great the pen tool can be for making your selections try this [http://www.gurusnetwork.com/tutorials/photoshop/pen1intro.html tutorial].
# Go to the channels tab (next where the layers tab is usualy). 
# Press the button &quot;Save selection as channel&quot; and a channel named Alpha1 should appear. 
#N ow check if what you want to be visible is white. If it's the opposite, click on the Alpha1 channel (should be under the blue) deselect (Ctrl+D) and invert (Ctrl+I). There you have it!

'''Note:''' that in Photoshop 7.0 there is a bug that makes it imposible to save alpha channels in Targas. To fix this either update to 7.01 or download a small fix for the Adobe web site.

http://www.adobe.com/support/downloads/detail.jsp?ftpID=1544

Make sure you follow the instructions given there.

Also if you're using Photoshop you can save textures with alpha channels in [[Legacy:DXT|DXT]]3 format. It only has a 4-bit alpha, instead of the 8-bit TGA alpha channel, but compression with DXT is much better and in most cases quality isn't much of an issue with alpha channels.

===Paint Shop Pro ===
# Do Main menu-&gt;Selections-&gt;Select All, and press CTRL-C to copy the image to the clipboard.
# Press CTRL-V to paste it as a new image (you will be working on the cloned image first).
# Select the parts of the image you want to make transparent. The Wand selection tool is useful for this. Hold down the shift key to select multiple parts of the image.
# Take your floodfill tool and select a dark colour (the darker the colour, the more transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do Selections-&gt;Invert. This will invert your selection.
# Whatever you ''do not'' want transparent is now selected.  Take your floodfill tool and select a light colour (the lighter the colour, the less transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do 'Layers-&gt;Load/Save Mask-&gt;Save Mask to Disk'.  Type in a filename and hit Save.
# In the menu, click on 'Selections-&gt;Select None' to deselect everything.
# Reopen your original image.
# In the menu, click on 'Selections-&gt;Select All'.
# In the menu, click on 'Layers-&gt;Load/Save Mask-&gt;Load Mask from Disk'and look in the menu bar at the top of screen for Mask.  Select Mask-&gt;New-&gt;From Image.  In this dialogue box, for the source window, the pulldown box, 'blank' and select your masked texture's filename, and press ok.
# Select Masks-&gt;Save to Alpha channel from the menu.  Just agree with the next two windows (hit 'OK'), and save your new masked image.  Make sure you choose .TGA file format (it will be listed as Truevision TARGA (.TGA)).

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

===The GIMP===

# Select the parts of the image you want to be visible. (Or select what you want to be transparent, and do Select-&gt;Invert.)
# Do Layer-&gt;Mask-&gt;Add Layer Mask
## In the dialog, set Initialize Layer Mark to 'Selection'
# You can make further changes by painting directly on the layer mask. The layermask is just a grayscale image; black means fully transparent and white fully opaque.
# The new mask is selected in the layer list. Before you save, click on the original layer to select it. (Otherwise, saving will only export the grayscale mask.)
# When saving as TGA, the export procedure will tell you it needs to &quot;Apply layer mask&quot;. Click 'Export'.

Another way to do is it right click on the layer and select &quot;Add alpha channel&quot; and use the Erase tool or Edit-&gt;Clear to erase the parts you want transparent.

==Importing into UnrealEd:==
*Be sure to check the 'alpha' checkbox when you import your texture. If you forget to do this, you can always change it by setting the '''bAlphaTexture''' to True in the 'surface' section of the Texture Properties window (open that by right-clicking your texture and selecting 'properties' in the context list).
*You will know that you have created and imported the alpha texture properly if you can see some of the texture window's background through your texture. for example, it looks a little like this:

[[Image:Legacy_AlphaTexExample.jpeg|center|Alpha textures appear like this, with the background showing through.]]

See [[Legacy:Texture Import And Export|Texture Import and Export]] for more information on importing textures.

==Related Topics ==
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:Texture Import And Export|Texture Import And Export]] for [[Legacy:UnrealEd|UnrealEd]]

==Discussion==

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

'''Foxpaw:''' Is there a way to make a add a mask to a texture within UnrealEd? IE Set a texture as the alpha mask for another material?

'''Wormbo:''' I'm sure this is possible through extensive use of texture modifiers, e.g. you can use a [[Legacy:Combiner|Combiner]] to combine the colors of one texture with the alpha map of a different texture. With a [[Legacy:FinalBlend|FinalBlend]] modifier you can create an alpha channel based on a texture's brightness (like the render style STY_Translucent in [[Legacy:UT|UT]]) and use it in a Combiner to combine texture 1 and alpha channel of that FinalBlend. In both cases you have to apply another FinalBlend to the Combiner to make it actually use its alpha channel.

'''Foxpaw:''' I haven't been successful in using the finalblend to make an alpha channel like that, but that is basically what I was aiming for.. can you explain the process in greater detail, or maybe make a tutorial page on how to do it?

'''LegalAssassin:''' If you want an anti-aliased edge in PS you might experience (Geforce 2 GTS at least) that at distances this edge will turn white (!) in UEd. This is because of the the alpha color being white in PS. This looks bad when making, for instance, leaves on a branch. To fix this I use PSP 7 and open a .psd-version of the texture with the transparency as you want it. Now, make a new background layer, fill it with a more appropriate color (for leaves, some green would be nice) and save it as a .tga in PSP. The AA'd edge should now look good.

I'm sure there's a better way, but I'm learning PS by trial-and-error.

'''Tarquin:''' Discussion needs cleaning... [[:Category:Legacy Refactor Me]]

----

[[:Category:Legacy To Do]] - Discussion needs cleaning
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1437</id>
      <timestamp>2006-09-17T10:48:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An '''alpha channel''', also sometimes called a mask, controls the transparency of an image. In programs like Lightwave and 3D Studio, the image and its alpha channel can be separate image files, but most image formats store the alpha channel information within the main image file. For importing to UnrealEd, it's best to use 32 bit [[Wikipedia:TGA]] (Targa) files.

Alpha channels use black for transparent areas, and white for opaque areas. Files that are only black and white are sometimes called masks. An example might be an image of a tree where the trunk, branches, and leaves are visible but everything else is &quot;invisible&quot; or transparent.

They can also be used to make gradual shifts in transparency such as with the simulated glow of coronas and particles. Since black is transparent, a dark grey (eg, RGB 10,10,10) is mostly transparent but not completely.

Alpha channels are used to simulate 3D geometry without increasing the number of physical polygons. For example, a picket fence would require modeling individual boards and nails while an alpha channel image fence would simply contain and image of a fence and its alpha channel; transparent areas around the top and between individual fence boards.

==About the .TGA file format ==
*It is designed for high quality, raster images
*They can be very large files because 1 byte is used for each color 
*TGAs support greyscale transparency, and so store the mask within the TGA
*A TGA with an alpha channel (transparency information) are typically 32 bit files
*TGA files can be run length encoded to save space; RLE compression is directly proportional to the complexity of the image. &quot;Noisy&quot; images don't compress well, while bands of the same color do compress well.
*TGAs are sometimes called Targas or Targavision, or Truevision Targa

==Adding An Alpha Channel to an Image ==

===Adobe Photoshop ===

# Using the various laso tools, magic wand and the pen tool make your selection. If you don't already know how great the pen tool can be for making your selections try this [http://www.gurusnetwork.com/tutorials/photoshop/pen1intro.html tutorial].
# Go to the channels tab (next where the layers tab is usualy). 
# Press the button &quot;Save selection as channel&quot; and a channel named Alpha1 should appear. 
#N ow check if what you want to be visible is white. If it's the opposite, click on the Alpha1 channel (should be under the blue) deselect (Ctrl+D) and invert (Ctrl+I). There you have it!

'''Note:''' that in Photoshop 7.0 there is a bug that makes it imposible to save alpha channels in Targas. To fix this either update to 7.01 or download a small fix for the Adobe web site.

http://www.adobe.com/support/downloads/detail.jsp?ftpID=1544

Make sure you follow the instructions given there.

Also if you're using Photoshop you can save textures with alpha channels in [[Legacy:DXT|DXT]]3 format. It only has a 4-bit alpha, instead of the 8-bit TGA alpha channel, but compression with DXT is much better and in most cases quality isn't much of an issue with alpha channels.

===Paint Shop Pro ===
# Do Main menu-&gt;Selections-&gt;Select All, and press CTRL-C to copy the image to the clipboard.
# Press CTRL-V to paste it as a new image (you will be working on the cloned image first).
# Select the parts of the image you want to make transparent. The Wand selection tool is useful for this. Hold down the shift key to select multiple parts of the image.
# Take your floodfill tool and select a dark colour (the darker the colour, the more transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do Selections-&gt;Invert. This will invert your selection.
# Whatever you ''do not'' want transparent is now selected.  Take your floodfill tool and select a light colour (the lighter the colour, the less transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do 'Layers-&gt;Load/Save Mask-&gt;Save Mask to Disk'.  Type in a filename and hit Save.
# In the menu, click on 'Selections-&gt;Select None' to deselect everything.
# Reopen your original image.
# In the menu, click on 'Selections-&gt;Select All'.
# In the menu, click on 'Layers-&gt;Load/Save Mask-&gt;Load Mask from Disk'and look in the menu bar at the top of screen for Mask.  Select Mask-&gt;New-&gt;From Image.  In this dialogue box, for the source window, the pulldown box, 'blank' and select your masked texture's filename, and press ok.
# Select Masks-&gt;Save to Alpha channel from the menu.  Just agree with the next two windows (hit 'OK'), and save your new masked image.  Make sure you choose .TGA file format (it will be listed as Truevision TARGA (.TGA)).

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

===The GIMP===

# Select the parts of the image you want to be visible. (Or select what you want to be transparent, and do Select-&gt;Invert.)
# Do Layer-&gt;Mask-&gt;Add Layer Mask
## In the dialog, set Initialize Layer Mark to 'Selection'
# You can make further changes by painting directly on the layer mask. The layermask is just a grayscale image; black means fully transparent and white fully opaque.
# The new mask is selected in the layer list. Before you save, click on the original layer to select it. (Otherwise, saving will only export the grayscale mask.)
# When saving as TGA, the export procedure will tell you it needs to &quot;Apply layer mask&quot;. Click 'Export'.

Another way to do is it right click on the layer and select &quot;Add alpha channel&quot; and use the Erase tool or Edit-&gt;Clear to erase the parts you want transparent.

==Related Topics ==
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:Texture Import And Export|Texture Import And Export]] for [[Legacy:UnrealEd|UnrealEd]]

==Discussion==

'''Birelli:''' Make sure you check the &quot;Alpha&quot; checkbox when you import your texture.

'''EricBlade:''' I have a &quot;Masked&quot; checkbox on the Import box, and that's about it.  Seems like there's some important step missing here, since I can't get transparency to work at all in this thing.

'''Wormbo:''' You should still be able to set bAlphaTexture to True in the Texture Properties window.

'''EricBlade:''' awesome, that does it.  Didn't know about that setting.  Very, very handy.

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

'''Foxpaw:''' Is there a way to make a add a mask to a texture within UnrealEd? IE Set a texture as the alpha mask for another material?

'''Wormbo:''' I'm sure this is possible through extensive use of texture modifiers, e.g. you can use a [[Legacy:Combiner|Combiner]] to combine the colors of one texture with the alpha map of a different texture. With a [[Legacy:FinalBlend|FinalBlend]] modifier you can create an alpha channel based on a texture's brightness (like the render style STY_Translucent in [[Legacy:UT|UT]]) and use it in a Combiner to combine texture 1 and alpha channel of that FinalBlend. In both cases you have to apply another FinalBlend to the Combiner to make it actually use its alpha channel.

'''Foxpaw:''' I haven't been successful in using the finalblend to make an alpha channel like that, but that is basically what I was aiming for.. can you explain the process in greater detail, or maybe make a tutorial page on how to do it?

'''LegalAssassin:''' If you want an anti-aliased edge in PS you might experience (Geforce 2 GTS at least) that at distances this edge will turn white (!) in UEd. This is because of the the alpha color being white in PS. This looks bad when making, for instance, leaves on a branch. To fix this I use PSP 7 and open a .psd-version of the texture with the transparency as you want it. Now, make a new background layer, fill it with a more appropriate color (for leaves, some green would be nice) and save it as a .tga in PSP. The AA'd edge should now look good.

I'm sure there's a better way, but I'm learning PS by trial-and-error.

'''Tarquin:''' Discussion needs cleaning... [[:Category:Legacy Refactor Me]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33714</id>
      <timestamp>2008-12-17T04:41:31Z</timestamp>
      <contributor>
        <username>Caboose</username>
        <id>1758</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">An '''alpha channel''', also sometimes called a mask, controls the transparency of an image. In programs like Lightwave and 3D Studio, the image and its alpha channel can be separate image files, but most image formats store the alpha channel information within the main image file. For [[Legacy:Texture Import And Export|importing to UnrealEd]], it's best to use 32 bit [[Wikipedia:TGA]] (Targa) files.

Alpha channels use black for transparent areas, and white for opaque areas. Files that are only black and white are sometimes called masks. An example might be an image of a tree where the trunk, branches, and leaves are visible but everything else is &quot;invisible&quot; or transparent.

They can also be used to make gradual shifts in transparency such as with the simulated glow of coronas and particles. Since black is transparent, a dark grey (eg, RGB 10,10,10) is mostly transparent but not completely.

Alpha channels are used to simulate 3D geometry without increasing the number of physical polygons. For example, a picket fence would require modeling individual boards and nails while an alpha channel image fence would simply contain and image of a fence and its alpha channel; transparent areas around the top and between individual fence boards.

==About the .TGA file format ==
*It is designed for high quality, raster images.
*They can be very large files because 1 byte is used for each color .
*TGAs support greyscale transparency, and so store the mask within the TGA.
*A TGA with an alpha channel (transparency information) are typically 32 bit files.
*TGA files can be run length encoded to save space; RLE compression is directly proportional to the complexity of the image. &quot;Noisy&quot; images don't compress well, while bands of the same color do compress well.
*TGAs are sometimes called Targas or Targavision, or Truevision Targa.

see [[Wikipedia:TGA]] for more in-depth information.

==Adding An Alpha Channel to an Image ==

===Adobe Photoshop ===

# Using the various laso tools, magic wand and the pen tool make your selection. If you don't already know how great the pen tool can be for making your selections try this [http://www.gurusnetwork.com/tutorials/photoshop/pen1intro.html tutorial].
# Go to the channels tab (next where the layers tab is usualy). 
# Press the button &quot;Save selection as channel&quot; and a channel named Alpha1 should appear. 
#N ow check if what you want to be visible is white. If it's the opposite, click on the Alpha1 channel (should be under the blue) deselect (Ctrl+D) and invert (Ctrl+I). There you have it!

'''Note:''' that in Photoshop 7.0 there is a bug that makes it imposible to save alpha channels in Targas. To fix this either update to 7.01 or download a small fix for the Adobe web site.

http://www.adobe.com/support/downloads/detail.jsp?ftpID=1544

Make sure you follow the instructions given there.

Also if you're using Photoshop you can save textures with alpha channels in [[Legacy:DXT|DXT]]3 format. It only has a 4-bit alpha, instead of the 8-bit TGA alpha channel, but compression with DXT is much better and in most cases quality isn't much of an issue with alpha channels.

===Paint Shop Pro ===
# Do Main menu-&gt;Selections-&gt;Select All, and press CTRL-C to copy the image to the clipboard.
# Press CTRL-V to paste it as a new image (you will be working on the cloned image first).
# Select the parts of the image you want to make transparent. The Wand selection tool is useful for this. Hold down the shift key to select multiple parts of the image.
# Take your floodfill tool and select a dark colour (the darker the colour, the more transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do Selections-&gt;Invert. This will invert your selection.
# Whatever you ''do not'' want transparent is now selected.  Take your floodfill tool and select a light colour (the lighter the colour, the less transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do 'Layers-&gt;Load/Save Mask-&gt;Save Mask to Disk'.  Type in a filename and hit Save.
# In the menu, click on 'Selections-&gt;Select None' to deselect everything.
# Reopen your original image.
# In the menu, click on 'Selections-&gt;Select All'.
# In the menu, click on 'Layers-&gt;Load/Save Mask-&gt;Load Mask from Disk'and look in the menu bar at the top of screen for Mask.  Select Mask-&gt;New-&gt;From Image.  In this dialogue box, for the source window, the pulldown box, 'blank' and select your masked texture's filename, and press ok.
# Select Masks-&gt;Save to Alpha channel from the menu.  Just agree with the next two windows (hit 'OK'), and save your new masked image.  Make sure you choose .TGA file format (it will be listed as Truevision TARGA (.TGA)).

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

===The GIMP===

# Select the parts of the image you want to be visible. (Or select what you want to be transparent, and do Select-&gt;Invert.)
# Do Layer-&gt;Mask-&gt;Add Layer Mask
## In the dialog, set Initialize Layer Mark to 'Selection'
# You can make further changes by painting directly on the layer mask. The layermask is just a grayscale image; black means fully transparent and white fully opaque.
# The new mask is selected in the layer list. Before you save, click on the original layer to select it. (Otherwise, saving will only export the grayscale mask.)
# When saving as TGA, the export procedure will tell you it needs to &quot;Apply layer mask&quot;. Click 'Export'.

Another way to do is it right click on the layer and select &quot;Add alpha channel&quot; and use the Erase tool or Edit-&gt;Clear to erase the parts you want transparent.

==Importing into UnrealEd:==
*Be sure to check the 'alpha' checkbox when you import your texture. If you forget to do this, you can always change it by setting the '''bAlphaTexture''' to True in the 'surface' section of the Texture Properties window (open that by right-clicking your texture and selecting 'properties' in the context list).
*You will know that you have created and imported the alpha texture properly if you can see some of the texture window's background through your texture. for example, it looks a little like this:

[[Image:Legacy_AlphaTexExample.jpeg|center|Alpha textures appear like this, with the background showing through.]]

See [[Legacy:Texture Import And Export|Texture Import and Export]] for more information on importing textures.

==Related Topics ==
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:Texture Import And Export|Texture Import And Export]] for [[Legacy:UnrealEd|UnrealEd]]

==Discussion==

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

'''Foxpaw:''' Is there a way to make a add a mask to a texture within UnrealEd? IE Set a texture as the alpha mask for another material?

'''Wormbo:''' I'm sure this is possible through extensive use of texture modifiers, e.g. you can use a [[Legacy:Combiner|Combiner]] to combine the colors of one texture with the alpha map of a different texture. With a [[Legacy:FinalBlend|FinalBlend]] modifier you can create an alpha channel based on a texture's brightness (like the render style STY_Translucent in [[Legacy:UT|UT]]) and use it in a Combiner to combine texture 1 and alpha channel of that FinalBlend. In both cases you have to apply another FinalBlend to the Combiner to make it actually use its alpha channel.

'''Foxpaw:''' I haven't been successful in using the finalblend to make an alpha channel like that, but that is basically what I was aiming for.. can you explain the process in greater detail, or maybe make a tutorial page on how to do it?

'''LegalAssassin:''' If you want an anti-aliased edge in PS you might experience (Geforce 2 GTS at least) that at distances this edge will turn white (!) in UEd. This is because of the the alpha color being white in PS. This looks bad when making, for instance, leaves on a branch. To fix this I use PSP 7 and open a .psd-version of the texture with the transparency as you want it. Now, make a new background layer, fill it with a more appropriate color (for leaves, some green would be nice) and save it as a .tga in PSP. The AA'd edge should now look good.

I'm sure there's a better way, but I'm learning PS by trial-and-error.

'''Tarquin:''' Discussion needs cleaning... [[:Category:Legacy Refactor Me]]

'''Caboose:''' I figured out, this ca also be done on the free photo editor, paint.net.

----

[[:Category:Legacy To Do]] - Discussion needs cleaning
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35409</id>
      <timestamp>2009-09-12T15:31:04Z</timestamp>
      <contributor>
        <ip>82.65.72.163</ip>
      </contributor>
      <comment>/* Adobe Photoshop */</comment>
      <text xml:space="preserve">An '''alpha channel''', also sometimes called a mask, controls the transparency of an image. In programs like Lightwave and 3D Studio, the image and its alpha channel can be separate image files, but most image formats store the alpha channel information within the main image file. For [[Legacy:Texture Import And Export|importing to UnrealEd]], it's best to use 32 bit [[Wikipedia:TGA]] (Targa) files.

Alpha channels use black for transparent areas, and white for opaque areas. Files that are only black and white are sometimes called masks. An example might be an image of a tree where the trunk, branches, and leaves are visible but everything else is &quot;invisible&quot; or transparent.

They can also be used to make gradual shifts in transparency such as with the simulated glow of coronas and particles. Since black is transparent, a dark grey (eg, RGB 10,10,10) is mostly transparent but not completely.

Alpha channels are used to simulate 3D geometry without increasing the number of physical polygons. For example, a picket fence would require modeling individual boards and nails while an alpha channel image fence would simply contain and image of a fence and its alpha channel; transparent areas around the top and between individual fence boards.

==About the .TGA file format ==
*It is designed for high quality, raster images.
*They can be very large files because 1 byte is used for each color .
*TGAs support greyscale transparency, and so store the mask within the TGA.
*A TGA with an alpha channel (transparency information) are typically 32 bit files.
*TGA files can be run length encoded to save space; RLE compression is directly proportional to the complexity of the image. &quot;Noisy&quot; images don't compress well, while bands of the same color do compress well.
*TGAs are sometimes called Targas or Targavision, or Truevision Targa.

see [[Wikipedia:TGA]] for more in-depth information.

==Adding An Alpha Channel to an Image ==

===Adobe Photoshop ===

# Using the various laso tools, magic wand and the pen tool make your selection. If you don't already know how great the pen tool can be for making your selections try this [http://www.gurusnetwork.com/tutorials/photoshop/pen1intro.html tutorial].
# Go to the channels tab (next where the layers tab is usualy). 
# Press the button &quot;Save selection as channel&quot; and a channel named Alpha1 should appear. 
#N ow check if what you want to be visible is white. If it's the opposite, click on the Alpha1 channel (should be under the blue) deselect (Ctrl+D) and invert (Ctrl+I). There you have it!

'''Note:''' that in Photoshop 7.0 there is a bug that makes it impossible to save alpha channels in Targas. To fix this either update to 7.01 or download a small fix for the Adobe web site.

http://www.adobe.com/support/downloads/detail.jsp?ftpID=1544

Make sure you follow the instructions given there.

Also if you're using Photoshop you can save textures with alpha channels in [[Legacy:DXT|DXT]]3 format. It only has a 4-bit alpha, instead of the 8-bit TGA alpha channel, but compression with DXT is much better and in most cases quality isn't much of an issue with alpha channels.

===Paint Shop Pro ===
# Do Main menu-&gt;Selections-&gt;Select All, and press CTRL-C to copy the image to the clipboard.
# Press CTRL-V to paste it as a new image (you will be working on the cloned image first).
# Select the parts of the image you want to make transparent. The Wand selection tool is useful for this. Hold down the shift key to select multiple parts of the image.
# Take your floodfill tool and select a dark colour (the darker the colour, the more transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do Selections-&gt;Invert. This will invert your selection.
# Whatever you ''do not'' want transparent is now selected.  Take your floodfill tool and select a light colour (the lighter the colour, the less transparent the pixel will be). Floodfill within the selected areas.
# In the menu, do 'Layers-&gt;Load/Save Mask-&gt;Save Mask to Disk'.  Type in a filename and hit Save.
# In the menu, click on 'Selections-&gt;Select None' to deselect everything.
# Reopen your original image.
# In the menu, click on 'Selections-&gt;Select All'.
# In the menu, click on 'Layers-&gt;Load/Save Mask-&gt;Load Mask from Disk'and look in the menu bar at the top of screen for Mask.  Select Mask-&gt;New-&gt;From Image.  In this dialogue box, for the source window, the pulldown box, 'blank' and select your masked texture's filename, and press ok.
# Select Masks-&gt;Save to Alpha channel from the menu.  Just agree with the next two windows (hit 'OK'), and save your new masked image.  Make sure you choose .TGA file format (it will be listed as Truevision TARGA (.TGA)).

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

===The GIMP===

# Select the parts of the image you want to be visible. (Or select what you want to be transparent, and do Select-&gt;Invert.)
# Do Layer-&gt;Mask-&gt;Add Layer Mask
## In the dialog, set Initialize Layer Mark to 'Selection'
# You can make further changes by painting directly on the layer mask. The layermask is just a grayscale image; black means fully transparent and white fully opaque.
# The new mask is selected in the layer list. Before you save, click on the original layer to select it. (Otherwise, saving will only export the grayscale mask.)
# When saving as TGA, the export procedure will tell you it needs to &quot;Apply layer mask&quot;. Click 'Export'.

Another way to do is it right click on the layer and select &quot;Add alpha channel&quot; and use the Erase tool or Edit-&gt;Clear to erase the parts you want transparent.

==Importing into UnrealEd:==
*Be sure to check the 'alpha' checkbox when you import your texture. If you forget to do this, you can always change it by setting the '''bAlphaTexture''' to True in the 'surface' section of the Texture Properties window (open that by right-clicking your texture and selecting 'properties' in the context list).
*You will know that you have created and imported the alpha texture properly if you can see some of the texture window's background through your texture. for example, it looks a little like this:

[[Image:Legacy_AlphaTexExample.jpeg|center|Alpha textures appear like this, with the background showing through.]]

See [[Legacy:Texture Import And Export|Texture Import and Export]] for more information on importing textures.

==Related Topics ==
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:Texture Import And Export|Texture Import And Export]] for [[Legacy:UnrealEd|UnrealEd]]

==Discussion==

'''DJPaul:''' Did some more work on this.  Fell through when I released the Beta 8 of PSP menu-wise is much different from PSP7, so i'm stuck.  Plus my art sk1lls about suitable for MS Paint.  I will try find someone who knows to finish it.

'''Foxpaw:''' Is there a way to make a add a mask to a texture within UnrealEd? IE Set a texture as the alpha mask for another material?

'''Wormbo:''' I'm sure this is possible through extensive use of texture modifiers, e.g. you can use a [[Legacy:Combiner|Combiner]] to combine the colors of one texture with the alpha map of a different texture. With a [[Legacy:FinalBlend|FinalBlend]] modifier you can create an alpha channel based on a texture's brightness (like the render style STY_Translucent in [[Legacy:UT|UT]]) and use it in a Combiner to combine texture 1 and alpha channel of that FinalBlend. In both cases you have to apply another FinalBlend to the Combiner to make it actually use its alpha channel.

'''Foxpaw:''' I haven't been successful in using the finalblend to make an alpha channel like that, but that is basically what I was aiming for.. can you explain the process in greater detail, or maybe make a tutorial page on how to do it?

'''LegalAssassin:''' If you want an anti-aliased edge in PS you might experience (Geforce 2 GTS at least) that at distances this edge will turn white (!) in UEd. This is because of the the alpha color being white in PS. This looks bad when making, for instance, leaves on a branch. To fix this I use PSP 7 and open a .psd-version of the texture with the transparency as you want it. Now, make a new background layer, fill it with a more appropriate color (for leaves, some green would be nice) and save it as a .tga in PSP. The AA'd edge should now look good.

I'm sure there's a better way, but I'm learning PS by trial-and-error.

'''Tarquin:''' Discussion needs cleaning... [[:Category:Legacy Refactor Me]]

'''Caboose:''' I figured out, this ca also be done on the free photo editor, paint.net.

----

[[:Category:Legacy To Do]] - Discussion needs cleaning
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaCoop</title>
    <id>463</id>
    <revision>
      <id>1515</id>
      <timestamp>2008-02-08T19:50:02Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <comment>changed download link</comment>
      <text xml:space="preserve">&lt;strike&gt;'''I'm not working on this anymore''' &lt;/strike&gt; ?

&lt;code&gt;current version 1.33.7b&lt;/code&gt;

==Revival?==

Recently I had got some cool ideas. I'm thinking of adding some sort of an RTS element to the game. Keeping the 1st person view, you should be able to direct / order your teammates. Possibly even possess the AI controlled ones. Moreover I would like to change the style of the mod to something like exploration of new worlds. That would allow for the widest and wildest variety of maps without requiring an epic story to tie them all together. I'm thinking of small quests per map.

I wonder what lies beyond the NyLevel falls...

http://www.yucc.yorku.ca/~plouj/pics/AC_Banner.jpg

==What is AlphaCoop?==

{{innerbox|'' When you take some invasion fun, coop teamwork, monster hunt gameplay, unreal1 nostalgia and mix it with some AlphaOne you get AlphaCoop - AlphaOne

}}

AlphaCoop is an Unreal Tournament 2003/2004 game type.

===Compared to normal coop:===
* In AlphaCoop the levels are not really linked together in some kind of a story.

&lt;strike&gt;* It has much more monsters per level.&lt;/strike&gt; I don't desire this anymore.
* AlphaCoop attempts to be more about teamwork, which means it is nearly impossible to pass the missions alone.

===Testing:===

I am conducting my testing at '''24.225.94.146'''. If you want to join, you are more than welcome to. Just be patient because I restart the '''server''' a lot. Check the download links to get the latest version of the mod. Please, '''make''' sure to leave some comments after you have played.&lt;/strike&gt;

&lt;strike&gt;Public Teamspeak is also available on the same ip.&lt;/strike&gt;

===Progress===

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Progress]]

==Map Design==

{{innerbox|''Coop maps that let the player explore, have fun, progress, and make the player feel like he's accomplished something at the end of it.

}}

===Requirements===
* fun
* cooperative gameplay - humans vs monsters. Good example: Monster Hunt for UT1
** humans are traversing though the level from start to finish encoutering, and fighting unreal1 monsters
* story - doesn't have to be super good or make sense. Doesn't have to link with other maps. Just has to be interesting enough and told creatively.
* The original Unreal feeling
* good use of monsters MonsterSpawner's - for example: don't spawn too many too difficult monsters
* try to keep the monster count generally lower, not just for the performance reasons, but also because may repetative monsters kill the gaming experience. I know that from playing games such as SeriousSam and Painkiller
* good combinations of monsters. There is no reason to put every single type of monster in one area
* players should have a sense of progress as they get further in the level
* appropriate weapon spawns for each area
* Interactive environment as much as possible with unreal engine. Ex:
** enemiues slaming a door
** big explosions, walls collapsing, water rushing down from just opened door
** a veicle exploding, falling towards some pawns
* fun

===Good to have===
* hidden areas, secrets, easter eggs - do it subtle or really hidden. This is not to show off a logo or something, its something to reward that extra sniffy player:)
* things that reward teamwork - do as much as possible with UED
* linking with other maps

===I could care less about===
* graphics - I want those 'less fortunate' to be able to play this mod. This does not mean that I want maps with crappy style and design. I'm just saying that More polygons does not mean better looking. I just want you (the mapper) to FOCUS on gameplay rather then visuals

==Features (so far)==
* triggerable monster spawn points
* most of the unreal1 monsters
* Triggerable player spawn points
* damage based scoring
** 10 health taken away gives you one point
* limited lives
** Start with 3 lives
** Earn a life for each 100 points gained
* roundRobin trigger
* Progress indicator - based on the completed objectives

==To Do==
* scale monsters properly, and a little bit bigger than players for the scare effect.
* change player physics values - slow them down to someting similar like Unreal1. I still want to leave double jumping ang such:) '''''&lt;-''''' tweak this
* do some thorough playtesting
* work on monsters
** revive some of the Unreal1 monster code:
*** patrolling behaviour
*** defending behaviour
*** hunting/freelancing behaviour
* write a mapping document
* when UT2004 comes out I'll make use of the spawn protection for now use haloshield mut

==My Plans==

I want to make this game teamwork oriented and not repetative.

==Requirements==
* UT2003 version 2225
* Epic Bonus pack (the one with invasion;))

==Screenshots==

You can find some unedited screenshots [http://yucc.yorku.ca/~plouj/AlphaCoop/Screenshots/ here].

==Downloads==

===Main===

[http://plouj.com/projects/AlphaCoop/ AlphaCoop files folder]

===Source===

http://www.yucc.yorku.ca/~plouj/AlphaCoop/AlphaCoopSource.rar

Here you go, if you ever want to use/modify/continue this mod.

==Installing + Playing==
* unzip into your UT2003 folder
* run UT2003
* select AlphaCoop as the gametype and play the available maps
* I suggest you join or create an online match because bots are stupid at the moment

===Mutators to go with this mod===

[http://mep.beyondunreal.com click here], go to Projects &gt;&gt; Inactive.

* radar2003
* dropitall
* haloshield, if you want the game to be a little easier

==Contact Me==

You are more than welcome to send me comments suggestions, either here, or to my email: thematrixhunter@yahoo.com

==Discussion==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]]</text>
    </revision>
    <revision>
      <id>1516</id>
      <timestamp>2004-08-14T20:38:23Z</timestamp>
      <contributor>
        <ip>Plouj</ip>
      </contributor>
      <comment>added source finally</comment>
      <text xml:space="preserve">&lt;strike&gt;'''I'm not working on this anymore''' &lt;/strike&gt; ?

&lt;code&gt;current version 1.33.7b&lt;/code&gt;

==Revival?==

Recently I had got some cool ideas. I'm thinking of adding some sort of an RTS element to the game. Keeping the 1st person view, you should be able to direct / order your teammates. Possibly even possess the AI controlled ones. Moreover I would like to change the style of the mod to something like exploration of new worlds. That would allow for the widest and wildest variety of maps without requiring an epic story to tie them all together. I'm thinking of small quests per map.

I wonder what lies beyond the NyLevel falls...

http://www.yucc.yorku.ca/~plouj/pics/AC_Banner.jpg

==What is AlphaCoop?==

{{innerbox|'' When you take some invasion fun, coop teamwork, monster hunt gameplay, unreal1 nostalgia and mix it with some AlphaOne you get AlphaCoop - AlphaOne

}}

AlphaCoop is an Unreal Tournament 2003/2004 game type.

===Compared to normal coop:===
* In AlphaCoop the levels are not really linked together in some kind of a story.

&lt;strike&gt;* It has much more monsters per level.&lt;/strike&gt; I don't desire this anymore.
* AlphaCoop attempts to be more about teamwork, which means it is nearly impossible to pass the missions alone.

===Testing:===

I am conducting my testing at '''24.225.94.146'''. If you want to join, you are more than welcome to. Just be patient because I restart the '''server''' a lot. Check the download links to get the latest version of the mod. Please, '''make''' sure to leave some comments after you have played.&lt;/strike&gt;

&lt;strike&gt;Public Teamspeak is also available on the same ip.&lt;/strike&gt;

===Progress===

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Progress]]

==Map Design==

{{innerbox|''Coop maps that let the player explore, have fun, progress, and make the player feel like he's accomplished something at the end of it.

}}

===Requirements===
* fun
* cooperative gameplay - humans vs monsters. Good example: Monster Hunt for UT1
** humans are traversing though the level from start to finish encoutering, and fighting unreal1 monsters
* story - doesn't have to be super good or make sense. Doesn't have to link with other maps. Just has to be interesting enough and told creatively.
* The original Unreal feeling
* good use of monsters MonsterSpawner's - for example: don't spawn too many too difficult monsters
* try to keep the monster count generally lower, not just for the performance reasons, but also because may repetative monsters kill the gaming experience. I know that from playing games such as SeriousSam and Painkiller
* good combinations of monsters. There is no reason to put every single type of monster in one area
* players should have a sense of progress as they get further in the level
* appropriate weapon spawns for each area
* Interactive environment as much as possible with unreal engine. Ex:
** enemiues slaming a door
** big explosions, walls collapsing, water rushing down from just opened door
** a veicle exploding, falling towards some pawns
* fun

===Good to have===
* hidden areas, secrets, easter eggs - do it subtle or really hidden. This is not to show off a logo or something, its something to reward that extra sniffy player:)
* things that reward teamwork - do as much as possible with UED
* linking with other maps

===I could care less about===
* graphics - I want those 'less fortunate' to be able to play this mod. This does not mean that I want maps with crappy style and design. I'm just saying that More polygons does not mean better looking. I just want you (the mapper) to FOCUS on gameplay rather then visuals

==Features (so far)==
* triggerable monster spawn points
* most of the unreal1 monsters
* Triggerable player spawn points
* damage based scoring
** 10 health taken away gives you one point
* limited lives
** Start with 3 lives
** Earn a life for each 100 points gained
* roundRobin trigger
* Progress indicator - based on the completed objectives

==To Do==
* scale monsters properly, and a little bit bigger than players for the scare effect.
* change player physics values - slow them down to someting similar like Unreal1. I still want to leave double jumping ang such:) '''''&lt;-''''' tweak this
* do some thorough playtesting
* work on monsters
** revive some of the Unreal1 monster code:
*** patrolling behaviour
*** defending behaviour
*** hunting/freelancing behaviour
* write a mapping document
* when UT2004 comes out I'll make use of the spawn protection for now use haloshield mut

==My Plans==

I want to make this game teamwork oriented and not repetative.

==Requirements==
* UT2003 version 2225
* Epic Bonus pack (the one with invasion;))

==Screenshots==

You can find some unedited screenshots [http://yucc.yorku.ca/~plouj/AlphaCoop/Screenshots/ here].

==Downloads==

===Main===

[http://yucc.yorku.ca/~plouj/AlphaCoop/ AlphaCoop files folder]

===Source===

http://www.yucc.yorku.ca/~plouj/AlphaCoop/AlphaCoopSource.rar

Here you go, if you ever want to use/modify/continue this mod.

==Installing + Playing==
* unzip into your UT2003 folder
* run UT2003
* select AlphaCoop as the gametype and play the available maps
* I suggest you join or create an online match because bots are stupid at the moment

===Mutators to go with this mod===

[http://mep.beyondunreal.com click here], go to Projects &gt;&gt; Inactive.

* radar2003
* dropitall
* haloshield, if you want the game to be a little easier

==Contact Me==

You are more than welcome to send me comments suggestions, either here, or to my email: thematrixhunter@yahoo.com

==Discussion==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaCoop/Discussion</title>
    <id>464</id>
    <revision>
      <id>1517</id>
      <timestamp>2004-10-05T20:44:57Z</timestamp>
      <contributor>
        <ip>Enos Shenk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mosquito:''' The map of your REALLY is screaming for a vehicle, its just so freakin' big. Also, there's not path nodes for bots, making computer teammates as usefull as a wet clam. I actually liked the ending bit, But I expected a big showdown with a mega queen in the bottom, not some loppy rockthrowers, The bridge bit's elevators are seriously broken, and the door for the &quot;SURROUNDED&quot; section is unlockible, I had to use a translocator to bypass it, and the fly cheat for the bridge. The weapons selection was questionable. No lightning gun or minigun? They'd work very well for the setup.

And in other news, my Moria map is coming very.. very... VERY slowly, considering I can't properly compile lighting and distance fog is non-functional, I think I'll just carve out a basic BSP level for now to use for testing in this mod, then when I get my new rig, add all the pretty.

'''AlphaOne:''' Wow, thats a whole bunch for the feedback. Here is what I have to say in return:

-no vehicles for this mod. It would just ruin the fun of fighting the monsters up close. It would be too boring to just be able to ram all the monsters. Yes I know my map is way to big, but what can you do? Its just a test map. I'm not even a mapper. Hehehehe.-

- That leads to the next point - since its a test map, I generally don't care if its all perfect and such. Thus I'm not gonna pay much attention to the path nodes. I just care that my code works.

-Thats true, the ending should be better. Once again, I was just testing my triggers and such. I'm also planning on coding special oversized verisons of the monster to be used as bosses and for the arena gametype.-

-btw, why don't you like the titans?? They are the coolest monsters in unreal!-

- the elevators are not broken, you just have to have more than one person to make it work - that was the idea.

-the 'surrounded' door is not working because I forgot to fix the roundrobin which activates it-

- weapons selection is another thing. I just choose the most used ones. I didn't bother taking the time to custom fit them for all areas, since the monsters are kind of randomly choosen anyways - it would be pointless unless I spawn specific monsters with a reason behind it. Giving all weapons is also not an option - I'd like to keep the gameplay consistent.

Good to hear that you are working on a map:) Its even better than you decided to do the layout/bsp first, which is far more important than eyecandy.

'''Mosquito:''' I'm an old style UT mapper, so nearly 70% of my candy sweetiness is in my lighting :(. Also, Titans Seem to have a thing for being slaughtered by Skraaj, Is there a way to set teams for the monsters? The phrase; &quot;They have a cave Troll!&quot; isn't as impressive when the troll turns around to get butchered by its comrade orcs. 

Your map with alittle TLC could be a very awsome level, It would need a serious mofit facelift, but it could be very awsome. feel free to code a Balrog for me, A big mean firey balrog, Attach Smoke and flame emitters to the Warlord, give a flamethrower and a mean slash attack, scale him up afew times and slow him down and he'd be perfect. I'm still thinking of a way I could script the balrog to step on the bridge when he's out of health to fall to his demise. And SniperSkraaj with arrows, and another type with only melee would be nice too... (the shield thing fits perfectly with the LOTR thing)

oohh! And a redhead, with big breasts, really easy, I'd prefer a virgin, really naive, not to skinny or fat.. And some fries. thanks.

'''AlphaOne:'''

-Yes, I can change the monster's species so they can decide to fight each other, or not.-

-I dunno if I have the time, ideas, creativity, and the ability to do the mofit facelift...I'd rather focus on the code so that your maps can benefit from it!-

-I'll get to the monsters, when... I'll get to the monsters ;)-

'''Mosquito:''' I really didn't notice the lack of a specialevent actor until now! Why'd they take out that useful trigger, arg! My work around for the cave troll is to have the team need to kill all the skraaj snipers before facing the troll. I hope you can enable a squad function in a future release.

Update: I just played the tomb section of my Moria map, Might shit is it hard, the minigun is in the center of the room, with health and ammo on the side upper areas on it, because of the dozen or so SniperSkraaj that attack you, its a frantic dance around the level just shooting that these guys, which a problem arose (Note: when you shot a SniperSkraaj while he has his shield up, he still bleeds, confusing players) and I found myself relying lots of grenades and using the shield function of the shieldgun, (I think the shield should be implemented gameplaywise in a more important and useful fashion in AC). Because of the incredible close quarters of the room, the titan only need take afew steps to be in striking range. So far, this map with hit home with LOTR and haters alike... now only If I can fix this lighting problem, right now I have very VERY ugly standin lights to light up the meshes, so I don't need to use RMODE 6 all the time.

'''AlphaOne:''' What do you mean by enable the '...enable a squad function'?

'''Mosquito:''' To set teams, so you could have a group of Skaarj fight another group of Skaarj.

'''AlphaOne:''' Oh, ok. Maybe tomorrow.

'''Mosquito:''' I've got a full afternoon ahead of me, I might beable to finish moria today, layout wise.

'''AlphaOne:''' Sweet!

'''Mosquito:''' These glitches that are effecting my UED are really making this map a totally pain, and complete mess, I'm considering just dropping it all together and wait till I have a rig that can handle UED.

'''AlphaOne:''' Thats fine, no pressure. After all, you signed up to help me. You don't owe me anything. Plus, I haven't done much myself. I got nuf real life problems. Tell me what your problem with UED is. Are you editing terrain? If so, don't edit the very edges of it! \o/ Just a friendly warning: if you don't get good fps in the editor, that means the map has too many polygons. Might be time to consider if they are all actually necessary :)

'''Mosquito:''' No compiling of lighting on BSP surfaces, messed up distance fog, complete breakdown of the whole concept of x Event triggers actor with x tag, etc. Just all round asshatery that no one else on the planet has an issue with, hence no support. (it wasn't always like this either, it just happened out of the blue, no hardware change, now software change, nothing, drivers don't fix it, patches don't fix it, reinstalls, multiple installiations... all that there is left to do it to reformat, but I can't do that... So arggh!

'''Mosquito:''' errr... check Planetunreal.com, seems Alpha has doing public.... errrr? What? This isn't anywhere near a public release, I think someone slipped out the word, I highly recommend getting that off PU before the spammers of hell start ripping up this page.

'''AlphOne:''' No worries. I did it myself and I had some good reasons for that.

----

'''EntropicLqd:'''Hope you don't mind me butting in like this but .... I've been thinking about your desire to encourage teamwork within your maps.  You have to be really careful with that.  I thought of one:
* You have to cross a large draw bridge.  There are switches to raise and lower the drawbridge on either side.  The bridge starts in the &quot;up&quot; position.  In order to lower the bridge you have to get into the gatehouse and find the switch/lever/trigger.  The thing is, there are monsters spawning on the other side of the bridge that will start the drawbridge raising again should a player start to lower it.  You can't see the other side of the bridge from within the gatehouse so you need half your team sniping monsters on the other side of the water/lava-lake/chasm/etc and the other half to get into the gate house and lower the bridge.

There are real problems with this level of co-operation in that on pubs you may not have a chance to get things together enough to actually finish the level.  The one thing in your favour is that the whole mod will be emphasising teamwork so people will expect to have to work together.  I've built similar stuff in the past and people have hated the co-op aspect.  Personally I think it rocks.  Anyways - is that the level of co-op you were aiming for?

'''AlphaOne:''' Yes, thats exactly it! LOL How did you know? :) I just need some mappers to execute it properly. However, I might as well making up (designing) coop scenario ideas because I REALLY DO suck at mapping.

'''Enos:''' Every once in a while randomly browsing forums pays off. Ive been hoping that someone would make a co-op mod like sven co-op for HL, and here i find out someone is. I map, im not fantastic, but im not a complete newbie. If theres any way that i can help out, id be more then happy to. To Entropic: Ive thought of that same sort of scenario for an assault map, but i dont know how it could be implemented without custom scripting that i dont understand. The problem is since movers move between keyframes, you cant have one trigger that say moves the bridge from key 0 to 1, and another for the monsters to use that moves it between keys 1 to 0. Im not putting down your idea, it would be excellent, im just not sure how it could be executed.

'''EntropicLqd:''' I'd custom script it.  Glad the original page was restored after the bit of vandalism it received.

'''veryhappy:''' I'd created a mover for UT that can be pushed in the two ways,i mean if you are near a button it will go go n -&gt; n+1 if you are near another button it will go n+1-&gt;n (where n is the numbre of keys).I'd made it customizable so you can jump to the 0-&gt; latest key or latest key-&gt;0 if you like.I'd lose all the work when i formated my PC but i think i can redo it for UT2004 without a lot of work(I hope)

'''veryhappy:''' It's more dificult than it was in UT.I must create a new trigger to send a custom event to the mover, the mover itself and learn a bit of mapping things :/.I think i can't do this at least till August (I've to study a lot).I was thinking about that and I'd an idea: Put a button in a sub that trigger the mover that way the player that push the button can't reach the mover so they must cooperate to go to the other side of the abyss :)

'''Plouj:''' I added some vague ideas. What do you think?

----

'''Mosquito?:'''Alpha, you still working on this? with my new rig I've been hungering to work on a project.

'''Plouj:''' Righ now I'm not working on anything, but if anyone wants to continue AC, go ahead, I'll be glad to see that happen. Obviously my work/ides should remain credited as mine.

'''Plouj:''' Added a link to the source [[Legacy:AlphaCoop|AlphaCoop]] if anyone wants to continue it.

'''Enos Shenk:''' If anyone takes up development on this, i would be more then happy to map for it. If i could comprehend object-oriented code in the slightest, i miht have a go at it.</text>
    </revision>
    <revision>
      <id>1518</id>
      <timestamp>2004-08-14T20:35:57Z</timestamp>
      <contributor>
        <ip>Plouj</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mosquito:''' The map of your REALLY is screaming for a vehicle, its just so freakin' big. Also, there's not path nodes for bots, making computer teammates as usefull as a wet clam. I actually liked the ending bit, But I expected a big showdown with a mega queen in the bottom, not some loppy rockthrowers, The bridge bit's elevators are seriously broken, and the door for the &quot;SURROUNDED&quot; section is unlockible, I had to use a translocator to bypass it, and the fly cheat for the bridge. The weapons selection was questionable. No lightning gun or minigun? They'd work very well for the setup.

And in other news, my Moria map is coming very.. very... VERY slowly, considering I can't properly compile lighting and distance fog is non-functional, I think I'll just carve out a basic BSP level for now to use for testing in this mod, then when I get my new rig, add all the pretty.

'''AlphaOne:''' Wow, thats a whole bunch for the feedback. Here is what I have to say in return:

-no vehicles for this mod. It would just ruin the fun of fighting the monsters up close. It would be too boring to just be able to ram all the monsters. Yes I know my map is way to big, but what can you do? Its just a test map. I'm not even a mapper. Hehehehe.-

- That leads to the next point - since its a test map, I generally don't care if its all perfect and such. Thus I'm not gonna pay much attention to the path nodes. I just care that my code works.

-Thats true, the ending should be better. Once again, I was just testing my triggers and such. I'm also planning on coding special oversized verisons of the monster to be used as bosses and for the arena gametype.-

-btw, why don't you like the titans?? They are the coolest monsters in unreal!-

- the elevators are not broken, you just have to have more than one person to make it work - that was the idea.

-the 'surrounded' door is not working because I forgot to fix the roundrobin which activates it-

- weapons selection is another thing. I just choose the most used ones. I didn't bother taking the time to custom fit them for all areas, since the monsters are kind of randomly choosen anyways - it would be pointless unless I spawn specific monsters with a reason behind it. Giving all weapons is also not an option - I'd like to keep the gameplay consistent.

Good to hear that you are working on a map:) Its even better than you decided to do the layout/bsp first, which is far more important than eyecandy.

'''Mosquito:''' I'm an old style UT mapper, so nearly 70% of my candy sweetiness is in my lighting :(. Also, Titans Seem to have a thing for being slaughtered by Skraaj, Is there a way to set teams for the monsters? The phrase; &quot;They have a cave Troll!&quot; isn't as impressive when the troll turns around to get butchered by its comrade orcs. 

Your map with alittle TLC could be a very awsome level, It would need a serious mofit facelift, but it could be very awsome. feel free to code a Balrog for me, A big mean firey balrog, Attach Smoke and flame emitters to the Warlord, give a flamethrower and a mean slash attack, scale him up afew times and slow him down and he'd be perfect. I'm still thinking of a way I could script the balrog to step on the bridge when he's out of health to fall to his demise. And SniperSkraaj with arrows, and another type with only melee would be nice too... (the shield thing fits perfectly with the LOTR thing)

oohh! And a redhead, with big breasts, really easy, I'd prefer a virgin, really naive, not to skinny or fat.. And some fries. thanks.

'''AlphaOne:'''

-Yes, I can change the monster's species so they can decide to fight each other, or not.-

-I dunno if I have the time, ideas, creativity, and the ability to do the mofit facelift...I'd rather focus on the code so that your maps can benefit from it!-

-I'll get to the monsters, when... I'll get to the monsters ;)-

'''Mosquito:''' I really didn't notice the lack of a specialevent actor until now! Why'd they take out that useful trigger, arg! My work around for the cave troll is to have the team need to kill all the skraaj snipers before facing the troll. I hope you can enable a squad function in a future release.

Update: I just played the tomb section of my Moria map, Might shit is it hard, the minigun is in the center of the room, with health and ammo on the side upper areas on it, because of the dozen or so SniperSkraaj that attack you, its a frantic dance around the level just shooting that these guys, which a problem arose (Note: when you shot a SniperSkraaj while he has his shield up, he still bleeds, confusing players) and I found myself relying lots of grenades and using the shield function of the shieldgun, (I think the shield should be implemented gameplaywise in a more important and useful fashion in AC). Because of the incredible close quarters of the room, the titan only need take afew steps to be in striking range. So far, this map with hit home with LOTR and haters alike... now only If I can fix this lighting problem, right now I have very VERY ugly standin lights to light up the meshes, so I don't need to use RMODE 6 all the time.

'''AlphaOne:''' What do you mean by enable the '...enable a squad function'?

'''Mosquito:''' To set teams, so you could have a group of Skaarj fight another group of Skaarj.

'''AlphaOne:''' Oh, ok. Maybe tomorrow.

'''Mosquito:''' I've got a full afternoon ahead of me, I might beable to finish moria today, layout wise.

'''AlphaOne:''' Sweet!

'''Mosquito:''' These glitches that are effecting my UED are really making this map a totally pain, and complete mess, I'm considering just dropping it all together and wait till I have a rig that can handle UED.

'''AlphaOne:''' Thats fine, no pressure. After all, you signed up to help me. You don't owe me anything. Plus, I haven't done much myself. I got nuf real life problems. Tell me what your problem with UED is. Are you editing terrain? If so, don't edit the very edges of it! \o/ Just a friendly warning: if you don't get good fps in the editor, that means the map has too many polygons. Might be time to consider if they are all actually necessary :)

'''Mosquito:''' No compiling of lighting on BSP surfaces, messed up distance fog, complete breakdown of the whole concept of x Event triggers actor with x tag, etc. Just all round asshatery that no one else on the planet has an issue with, hence no support. (it wasn't always like this either, it just happened out of the blue, no hardware change, now software change, nothing, drivers don't fix it, patches don't fix it, reinstalls, multiple installiations... all that there is left to do it to reformat, but I can't do that... So arggh!

'''Mosquito:''' errr... check Planetunreal.com, seems Alpha has doing public.... errrr? What? This isn't anywhere near a public release, I think someone slipped out the word, I highly recommend getting that off PU before the spammers of hell start ripping up this page.

'''AlphOne:''' No worries. I did it myself and I had some good reasons for that.

----

'''EntropicLqd:'''Hope you don't mind me butting in like this but .... I've been thinking about your desire to encourage teamwork within your maps.  You have to be really careful with that.  I thought of one:
* You have to cross a large draw bridge.  There are switches to raise and lower the drawbridge on either side.  The bridge starts in the &quot;up&quot; position.  In order to lower the bridge you have to get into the gatehouse and find the switch/lever/trigger.  The thing is, there are monsters spawning on the other side of the bridge that will start the drawbridge raising again should a player start to lower it.  You can't see the other side of the bridge from within the gatehouse so you need half your team sniping monsters on the other side of the water/lava-lake/chasm/etc and the other half to get into the gate house and lower the bridge.

There are real problems with this level of co-operation in that on pubs you may not have a chance to get things together enough to actually finish the level.  The one thing in your favour is that the whole mod will be emphasising teamwork so people will expect to have to work together.  I've built similar stuff in the past and people have hated the co-op aspect.  Personally I think it rocks.  Anyways - is that the level of co-op you were aiming for?

'''AlphaOne:''' Yes, thats exactly it! LOL How did you know? :) I just need some mappers to execute it properly. However, I might as well making up (designing) coop scenario ideas because I REALLY DO suck at mapping.

'''Enos:''' Every once in a while randomly browsing forums pays off. Ive been hoping that someone would make a co-op mod like sven co-op for HL, and here i find out someone is. I map, im not fantastic, but im not a complete newbie. If theres any way that i can help out, id be more then happy to. To Entropic: Ive thought of that same sort of scenario for an assault map, but i dont know how it could be implemented without custom scripting that i dont understand. The problem is since movers move between keyframes, you cant have one trigger that say moves the bridge from key 0 to 1, and another for the monsters to use that moves it between keys 1 to 0. Im not putting down your idea, it would be excellent, im just not sure how it could be executed.

'''EntropicLqd:''' I'd custom script it.  Glad the original page was restored after the bit of vandalism it received.

'''veryhappy:''' I'd created a mover for UT that can be pushed in the two ways,i mean if you are near a button it will go go n -&gt; n+1 if you are near another button it will go n+1-&gt;n (where n is the numbre of keys).I'd made it customizable so you can jump to the 0-&gt; latest key or latest key-&gt;0 if you like.I'd lose all the work when i formated my PC but i think i can redo it for UT2004 without a lot of work(I hope)

'''veryhappy:''' It's more dificult than it was in UT.I must create a new trigger to send a custom event to the mover, the mover itself and learn a bit of mapping things :/.I think i can't do this at least till August (I've to study a lot).I was thinking about that and I'd an idea: Put a button in a sub that trigger the mover that way the player that push the button can't reach the mover so they must cooperate to go to the other side of the abyss :)

'''Plouj:''' I added some vague ideas. What do you think?

----

'''Mosquito?:'''Alpha, you still working on this? with my new rig I've been hungering to work on a project.

'''Plouj:''' Righ now I'm not working on anything, but if anyone wants to continue AC, go ahead, I'll be glad to see that happen. Obviously my work/ides should remain credited as mine.

'''Plouj:''' Added a link to the source [[Legacy:AlphaCoop|AlphaCoop]] if anyone wants to continue it.</text>
    </revision>
    <revision>
      <id>34047</id>
      <timestamp>2009-02-19T14:34:04Z</timestamp>
      <contributor>
        <ip>217.80.201.230</ip>
      </contributor>
      <text xml:space="preserve">'''Mosquito:''' The map of your REALLY is screaming for a vehicle, its just so freakin' big. Also, there's not path nodes for bots, making computer teammates as usefull as a wet clam. I actually liked the ending bit, But I expected a big showdown with a mega queen in the bottom, not some loppy rockthrowers, The bridge bit's elevators are seriously broken, and the door for the &quot;SURROUNDED&quot; section is unlockible, I had to use a translocator to bypass it, and the fly cheat for the bridge. The weapons selection was questionable. No lightning gun or minigun? They'd work very well for the setup.

And in other news, my Moria map is coming very.. very... VERY slowly, considering I can't properly compile lighting and distance fog is non-functional, I think I'll just carve out a basic BSP level for now to use for testing in this mod, then when I get my new rig, add all the pretty.

'''AlphaOne:''' Wow, thats a whole bunch for the feedback. Here is what I have to say in return:

-no vehicles for this mod. It would just ruin the fun of fighting the monsters up close. It would be too boring to just be able to ram all the monsters. Yes I know my map is way to big, but what can you do? Its just a test map. I'm not even a mapper. Hehehehe.-

- That leads to the next point - since its a test map, I generally don't care if its all perfect and such. Thus I'm not gonna pay much attention to the path nodes. I just care that my code works.

-Thats true, the ending should be better. Once again, I was just testing my triggers and such. I'm also planning on coding special oversized verisons of the monster to be used as bosses and for the arena gametype.-

-btw, why don't you like the titans?? They are the coolest monsters in unreal!-

- the elevators are not broken, you just have to have more than one person to make it work - that was the idea.

-the 'surrounded' door is not working because I forgot to fix the roundrobin which activates it-

- weapons selection is another thing. I just choose the most used ones. I didn't bother taking the time to custom fit them for all areas, since the monsters are kind of randomly choosen anyways - it would be pointless unless I spawn specific monsters with a reason behind it. Giving all weapons is also not an option - I'd like to keep the gameplay consistent.

Good to hear that you are working on a map:) Its even better than you decided to do the layout/bsp first, which is far more important than eyecandy.

'''Mosquito:''' I'm an old style UT mapper, so nearly 70% of my candy sweetiness is in my lighting :(. Also, Titans Seem to have a thing for being slaughtered by Skraaj, Is there a way to set teams for the monsters? The phrase; &quot;They have a cave Troll!&quot; isn't as impressive when the troll turns around to get butchered by its comrade orcs. 

Your map with alittle TLC could be a very awsome level, It would need a serious mofit facelift, but it could be very awsome. feel free to code a Balrog for me, A big mean firey balrog, Attach Smoke and flame emitters to the Warlord, give a flamethrower and a mean slash attack, scale him up afew times and slow him down and he'd be perfect. I'm still thinking of a way I could script the balrog to step on the bridge when he's out of health to fall to his demise. And SniperSkraaj with arrows, and another type with only melee would be nice too... (the shield thing fits perfectly with the LOTR thing)

oohh! And a redhead, with big breasts, really easy, I'd prefer a virgin, really naive, not to skinny or fat.. And some fries. thanks.

'''AlphaOne:'''

-Yes, I can change the monster's species so they can decide to fight each other, or not.-

-I dunno if I have the time, ideas, creativity, and the ability to do the mofit facelift...I'd rather focus on the code so that your maps can benefit from it!-

-I'll get to the monsters, when... I'll get to the monsters ;)-

'''Mosquito:''' I really didn't notice the lack of a specialevent actor until now! Why'd they take out that useful trigger, arg! My work around for the cave troll is to have the team need to kill all the skraaj snipers before facing the troll. I hope you can enable a squad function in a future release.

Update: I just played the tomb section of my Moria map, Might shit is it hard, the minigun is in the center of the room, with health and ammo on the side upper areas on it, because of the dozen or so SniperSkraaj that attack you, its a frantic dance around the level just shooting that these guys, which a problem arose (Note: when you shot a SniperSkraaj while he has his shield up, he still bleeds, confusing players) and I found myself relying lots of grenades and using the shield function of the shieldgun, (I think the shield should be implemented gameplaywise in a more important and useful fashion in AC). Because of the incredible close quarters of the room, the titan only need take afew steps to be in striking range. So far, this map with hit home with LOTR and haters alike... now only If I can fix this lighting problem, right now I have very VERY ugly standin lights to light up the meshes, so I don't need to use RMODE 6 all the time.

'''AlphaOne:''' What do you mean by enable the '...enable a squad function'?

'''Mosquito:''' To set teams, so you could have a group of Skaarj fight another group of Skaarj.

'''AlphaOne:''' Oh, ok. Maybe tomorrow.

'''Mosquito:''' I've got a full afternoon ahead of me, I might beable to finish moria today, layout wise.

'''AlphaOne:''' Sweet!

'''Mosquito:''' These glitches that are effecting my UED are really making this map a totally pain, and complete mess, I'm considering just dropping it all together and wait till I have a rig that can handle UED.

'''AlphaOne:''' Thats fine, no pressure. After all, you signed up to help me. You don't owe me anything. Plus, I haven't done much myself. I got nuf real life problems. Tell me what your problem with UED is. Are you editing terrain? If so, don't edit the very edges of it! \o/ Just a friendly warning: if you don't get good fps in the editor, that means the map has too many polygons. Might be time to consider if they are all actually necessary :)

'''Mosquito:''' No compiling of lighting on BSP surfaces, messed up distance fog, complete breakdown of the whole concept of x Event triggers actor with x tag, etc. Just all round asshatery that no one else on the planet has an issue with, hence no support. (it wasn't always like this either, it just happened out of the blue, no hardware change, now software change, nothing, drivers don't fix it, patches don't fix it, reinstalls, multiple installiations... all that there is left to do it to reformat, but I can't do that... So arggh!

'''Mosquito:''' errr... check Planetunreal.com, seems Alpha has doing public.... errrr? What? This isn't anywhere near a public release, I think someone slipped out the word, I highly recommend getting that off PU before the spammers of hell start ripping up this page.

'''AlphOne:''' No worries. I did it myself and I had some good reasons for that.

----

'''EntropicLqd:'''Hope you don't mind me butting in like this but .... I've been thinking about your desire to encourage teamwork within your maps.  You have to be really careful with that.  I thought of one:
* You have to cross a large draw bridge.  There are switches to raise and lower the drawbridge on either side.  The bridge starts in the &quot;up&quot; position.  In order to lower the bridge you have to get into the gatehouse and find the switch/lever/trigger.  The thing is, there are monsters spawning on the other side of the bridge that will start the drawbridge raising again should a player start to lower it.  You can't see the other side of the bridge from within the gatehouse so you need half your team sniping monsters on the other side of the water/lava-lake/chasm/etc and the other half to get into the gate house and lower the bridge.

There are real problems with this level of co-operation in that on pubs you may not have a chance to get things together enough to actually finish the level.  The one thing in your favour is that the whole mod will be emphasising teamwork so people will expect to have to work together.  I've built similar stuff in the past and people have hated the co-op aspect.  Personally I think it rocks.  Anyways - is that the level of co-op you were aiming for?

'''AlphaOne:''' Yes, thats exactly it! LOL How did you know? :) I just need some mappers to execute it properly. However, I might as well making up (designing) coop scenario ideas because I REALLY DO suck at mapping.

'''Enos:''' Every once in a while randomly browsing forums pays off. Ive been hoping that someone would make a co-op mod like sven co-op for HL, and here i find out someone is. I map, im not fantastic, but im not a complete newbie. If theres any way that i can help out, id be more then happy to. To Entropic: Ive thought of that same sort of scenario for an assault map, but i dont know how it could be implemented without custom scripting that i dont understand. The problem is since movers move between keyframes, you cant have one trigger that say moves the bridge from key 0 to 1, and another for the monsters to use that moves it between keys 1 to 0. Im not putting down your idea, it would be excellent, im just not sure how it could be executed.

'''EntropicLqd:''' I'd custom script it.  Glad the original page was restored after the bit of vandalism it received.

'''veryhappy:''' I'd created a mover for UT that can be pushed in the two ways,i mean if you are near a button it will go go n -&gt; n+1 if you are near another button it will go n+1-&gt;n (where n is the numbre of keys).I'd made it customizable so you can jump to the 0-&gt; latest key or latest key-&gt;0 if you like.I'd lose all the work when i formated my PC but i think i can redo it for UT2004 without a lot of work(I hope)

'''veryhappy:''' It's more dificult than it was in UT.I must create a new trigger to send a custom event to the mover, the mover itself and learn a bit of mapping things :/.I think i can't do this at least till August (I've to study a lot).I was thinking about that and I'd an idea: Put a button in a sub that trigger the mover that way the player that push the button can't reach the mover so they must cooperate to go to the other side of the abyss :)

'''Plouj:''' I added some vague ideas. What do you think?

----

'''Mosquito?:'''Alpha, you still working on this? with my new rig I've been hungering to work on a project.

'''Plouj:''' Righ now I'm not working on anything, but if anyone wants to continue AC, go ahead, I'll be glad to see that happen. Obviously my work/ides should remain credited as mine.

'''Plouj:''' Added a link to the source [[Legacy:AlphaCoop|AlphaCoop]] if anyone wants to continue it.

'''Enos Shenk:''' If anyone takes up development on this, i would be more then happy to map for it. If i could comprehend object-oriented code in the slightest, i miht have a go at it.

'''lincore:''' Could someone post a link to the source? The one on [[Legacy:AlphaCoop|AlphaCoop]] is dead and I'd like to have a look on the code.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaCoop/Progress</title>
    <id>465</id>
    <revision>
      <id>1519</id>
      <timestamp>2004-07-14T01:21:21Z</timestamp>
      <contributor>
        <ip>Dsl-207-112-89-155.tor.primus.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Updates (In completely reverse-chronological order)==

{{classbox|18 MAR 04}}

There is a funny bug with the ut2k4 version: If you host a dedicated server all monsters use human character models!

{{classbox|17 MAR 04}}

YAY! I just ported the mod to UT2004: http://www.yucc.yorku.ca/~plouj/AlphaCoop/AlphaCoop-2004.zip

Going to start my own test server!!

{{classbox|16 MAR 04}}

Crap! I have to wait another day before I can port this to ut2k4.

{{classbox|13 MAR 04}}

I'm gonna put on hold the this mod for a while. I'm 'helping' out the DA2 team with some code.

'''El Muerte:''' screw DA2, finish this mod first

{{classbox|11 MAR 04}}

I just noticed that the monters should be relatively bigger than players based on Unreal1 scale. Gotta figure out the exact proportions.

{{classbox|09 MAR 04}}

Ah, I'm glad that I've told more people about this mod. It was never hidden in the first place anyways. Just needed a bit of pimping:)

I finally made my own uber crappy map actually playeable and finish-able.

Today I played (haven't do that in a long time) the whole map from beginning to end, and it seemed better then I expected.

'''El Muerte:''' you should have asked for mapping support in your pimpage.

'''''AlphaOne kicks himself.'''''

{{classbox|08 MAR 04}}

Uh oh! I'm starting to neglect this mod. Not good.

Anyways, I decided to officially start using version numbers. Format as follows (thanks to elmuerte):

&lt;code&gt; &lt;major&gt;.&lt;minor&gt;.&lt;build&gt;&lt;fuck up count&gt; &lt;/code&gt;

Obviously the first official version would be: '''''1.33.7b'''''

Maybe someday, somehow, it will come back to that same version :)

{{classbox|02 MAR 04}}

Just gonna show you what are the current additional properties of the monster pawns that I've coded: [http://yucc.yorku.ca/~plouj/AlphaCoop/Screenshots/AC_MonsterProperties.jpg?bleh AC_Monster &gt; Properties]

{{classbox|28 FEB 04}}

I fixed the player spawns so that its easier to define 'goups'. Instead of adding the adjacent player spawns to the main one, all you do is increase the main spawn's radius so that the game calculates the adjacent ones. Great simplification for the mappers at no performance or functionaly cost:)

I made monsters which are placed in UEd drop pickups specified by the mapper!

I added a teamTag property to the monsters so that the mappers can define what monsters area /not allowed to fight. Only monsters with the same tag will not fight
* '''Downloads''' updated.
* Thats just great. I get a GPF: Assertion Failure when I call Canvas.(&quot;Test&quot;,XL,YL);

{{classbox|27 FEB 04}}

This is when crap hits the fan. Luckily I have an umbrella! (This has nothing to do with this mod other than the fact that it slows down my progress)
* changed the progress indicator, which still looks UGLY!
* fixed the bot's PRI
* fixed the scoreboard to draw only one team
* '''Downloads''' updated

{{classbox|25 FEB 04}}

School is killing me.

{{classbox|23 FEB 04}}
* '''downloads''' updated.
* I've added a progress indicator, which shows with a percentage value, how much of the level has been completed. Note that you don't have to reach 100% to win the level, since some objectives are optional;)
* I'm thinking of reducing the player speed(s) to make the gameplay more like Unreal1, and more focused on the monsters. The slower u move the more detail u will notice. Also, less speed means that the monsters will be harder to beat, which lets me use less monsters for performance considerations.
* I've been thinking that reducing the # of monsters is a generally good idea because it's just good. I really have to have to fight 1000 repetitive monsters - I think that is where games like Serious Sam, and Pain Killer failed. I'd rather have more focus on individual monster.

{{classbox|22 FEB 04}}

Maybe I should make an arena game type too. Just like MonsterHunt. I found it quite fun recently. At least I can actually map an arena type of thing!
* wow this mod has been '''in development for''' '''''40''''' days. And most of them I actually '''did something''' for it - my 1st time.

{{classbox|21 FEB 04}}

I've been going to sleep late this week. As a result I'm so tired that all I can do is stare at the monitor and chat to people.

{{classbox|19 FEB 04}}

This week I found some cool mutators which work great with my mod. They are all made by Pfhoenix. What a great guy he is! :p

You can get them here: [http://mep.beyondunreal.com MEP], go to Projects &gt; Inactive.

Download:
* radar2003
* dropitall
* haloshield, if you want the game to be a little easier

{{classbox|18 FEB 04}}

'''Screenshots''' folder updated, with all the monster shots. I think...

{{classbox| 17 FEB 04}}

'''downloads''' updated.

Oh my! TEH DEMO is addictive...and hackable!

Anyways, I finally separated the meshes from the code, so no it will be x10 easier to upload files (speed wise).

{{classbox| 10 FEB 04}}
* The game '''server''' has been restarted with the latest packages.
* '''downloads''' have been updated
* I have finally worked on the map. It is much more playable and enjoyable now. There is a variety of monsters, the player spawn points work properly. There is enough ammo. I've added some cool things, such as fish in the water, and warlords in addition to the stone titans in the final area. I have also fixed the pathway down to the bottom of the last area. Now you can either walk down, or jump in the pool. AND you can walk back up too! The files should be uploaded to both the file and the game '''server'''s so get ready to download and have some fun!

{{classbox| 9 FEB 04}}
* I changed the way that the MonsterCount is scaled based on the number of players. Now, it is only changed once, when the spawn point was activated, or when it was spawned (if bInitialized is initially true).
* Yay! The AC_RoundRobin (RR) seems to work. It is well triggered by 4 monster spawners, when all the monsters are dead. The last time the RR is triggered it triggers 4 movers which are the huge gates that open a path to the next area!
* I changed the gate meshes to something that has slightly better collision.

{{classbox| 8 FEB 04}}

Oh my gosh! I was looking at some of my monster spawner class, and it looked like I wrote it while I drunk or something. Not that I drink or anything.

{{classbox| 7 FEB 04}}
* I coded a round robin, to trigger the doors in my level, when triggered by a number of monster spawners. It does not work properly so far.
* I fixed a crash which was caused by wrong monster types spawning in one place.

As of today, I've fixed up some problems, and trimmed some options that are given to the mapper. I've also implemented the damage based scoring thingy.
* '''downloads''' have been updated, again, and the '''server''' has been restarted.
* I'm thinking of whether I should multiply the monster's health by the log of their skill as WELL as by the player count.
* I'm also thinking of scaling the actual monster's skill based on player count.

{{classbox| 5 FEB 04}}

This is your last chance. After this, there is no turning back. You take the blue pill and the story ends. You wake in your bed and believe whatever you want to believe. You take the red pill and you stay in Wonderland and I show you how deep the rabbit-hole goes.

{{classbox| 3 FEB 04}}
* '''downloads''' and the '''server''' is updated
* I've coded it so that you score by damaging monsters instead of killing them. Each 10 health that u take away from one monsters, gives u 1 point. Every 100 points u gain a life. You start with 3 lives.
* aaand there is something messed up: online the # of lives is always zero. Plus, the game doesn't end when the last person dies.

{{classbox| 2 FEB 04}}
* I've had a small but important talk with Pfhoenix about the game's balance, and I have made some decisions. I'm going to 'trim' some of the features out of the monster spawners to keep the gameplay rather constant. Also, I'm going to make scoring based on damage dealt rather then kills.
* I'm going to divide the map into 'arenas' by means of simple gates. That would reduce lag, made the game more fun, easier to play (don't need to walk too far), and more logical.

{{classbox| 1 FEB 04}}
* wow, it's February!
* With great thanks to MWGemini, I can now host beta games of AlphaCoop on '''24.225.94.146''' !!!!

{{classbox| 31 JAN 04}}
* I rushed, and I just copy+pasted Satore's monster pawn class, which made a lot of problems in online play. Now its all back to normal.
* '''Downloads''' updated. Woo! I finally uploaded the files (23MB total). That includes the zip, and all files separate.
* YES! I finally added those cool options to [http://www.yucc.yorku.ca/~plouj/AlphaCoop/Screenshots/MonsterSpawnerProperties.jpg?bleh Monster Spawners].

{{classbox| 28 JAN 04}}
* Yesterday, Satore was nice enough to send me both the code AND the .3d files for the monsters.
* I'm gonna export the textures today, and try to fix the alpha problem where the textures are SUPPOSED to be transparent.
* No, I didn't fix the textures. I just barely put all the monsters in to my package so far. I don't even know if it works in game. All, I know is that it compiles.
* I'm still waiting for Satore to send me the StoneTitan rock meshes. I unable to export those from his package, or from UT1 using WOTGreal.

{{classbox| 27 JAN 04}}
* Okey, I got a reply from Satore - the guy who actually exported the monsters. I think he agreed. He replied: &quot;Ok, ok. What should I do?&quot; to &quot;Will you allow me to use your monsters' models and code?&quot;.

{{classbox| 26 JAN 04}}
* Still waiting for their reply. It appears that 3 people have released the same mod (satoreMonsterPack) so I emailed all of them.
* I removed the ScaleActor from the map because it has done its job.

{{classbox| 25 JAN 04}}
* I found someone who imported the other monster models into UT2003!!

{{classbox| 23 JAN 04}}
* Fixed so that the bots spawn with different characters now.
* Its fun watching the bots fight the monsters, while I camp on a side!
* '''Downloads''' updated, again
* Map's general layout is finished
* Testing revealed scoring imbalance
* I decided to automate the choosing of spawn points, a little
* Added some more monsters in the forest

{{classbox| 23 JAN 04}}
* '''Downloads''' updated
* I finally got bots to behave nicely (they stopped crashing the game) when I add them. I copied half of the invasion.uc code. Tomorrow, I'll try to clean it up and trim the useless stuff.
* I have to make them load different characters now.
* Fixed some monster spawns so that they don't flood your CPU with monster actors :)
* I got permission from NozzeM to use his Unreal1 exported/imported art. I hope he got permission from Epic;)

{{classbox| 20 JAN 04}}
* '''Downloads''' updated
* I added another option to the monster spawns - bUnnoticedSpawning. What it does it is look for the most unnoticed spawn point (out of the list of associated nav. points), and spawns the monster there. The code was 'ripped' from the invasion gametype ;) With this installed, there are two ways that monsters spawn now. with bUnnoticedSpawning=true, they spawn once per spawn interval. When its false, monsters spawn as many as there are available nav. points, per interval.
* I also fixed up my map
** Improved the bridge logic.
** The gameplay is insane now. Monsters keep coming and coming, and the performance is much better. Instead of spawning all monsters at once (slow) I spawn little by little, which is much more CPU friendly, and gives a proper feeling of monster attack.
* Latest testing identified the following problems:

** ALL spawn points need weapon bases and some health.
** I'm not sure ''which'' guns to actually include in the weapon bases. So far, only RL, shock rifle, and flack cannon. I might have to make some variety from point to point.
** The first lift needs a way to move back up without defeating its purpose
** I need to make it much harder to advance to the next point without defeating the current 'bunch' of monsters.
** Multiplying the # of monsters by player count tends to slow things down - should be turned off for huge areas like TEH VALLEY.

{{classbox| 17 JAN 04}}
* '''Downloads''' updated
** Fixed MORE monster spawning bugs. I have learned that SetTimer(0,true) effectively turns OFF your timers (as well as SetTimer(0,false)).
** The bridge and the lifts work a little bit.

{{classbox| 16 JAN 04}}
* '''downloads''' updated
** Fixed some monster spawning bugs

{{classbox| 14 JAN 04}}
* Thats when I started working on the first lines of code.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaOne</title>
    <id>385</id>
    <revision>
      <id>1299</id>
      <timestamp>2005-12-29T03:06:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

Real name is Michael P. I'm a [http://www.cs.yorku.ca computer science] student at [http://www.yorku.ca York university]

website: http://alphaone.teaminfamy.net/

==Contact Info==

===Email===

thematrixhunter@yahoo.com ('''Y!'''), AlphaOne4u@hotmail.com ('''MSN'''), plouj@yorku.ca (Uni e-mail)

===ICQ===

235746829

==Goals==
* To have fun
* To explore the possibilities of Unreal Script
* To implement my ideas using the Unreal Engine
* To compete in the &quot;Make Something Unreal&quot; contest

==Projects==

[[Legacy:AlphaCoop|AlphaCoop]] - coder - '''''active'''''

[http://www.planetunreal.com/da Defence Alliance 2] - coder - inactive

[[Legacy:Mod_Ideas/DevTools|DevTools]] - coder - inactive

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FishEyeView]] - coder - inactive

[http://www.planetunreal.com/hackerz Hackerz UT2003 TC] - coder - inactive

[[Legacy:Mod_Ideas/Possessed|Possessed]] - coder - inactive

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RocketJump]] - coder

[http://wiki.unrealkart.elmuerte.com/Wiki_Markup Unreal Kart] - coder - '''''active'''''

[http://strangelove.beyondunreal.com StrangeLove mutator for UT2004] - coder and everything else -  '''''active'''''

==Journal==

[[Legacy:AlphaOne/Developer Journal|AlphaOne/Developer Journal]]

---- ----

==Discussion==

'''SuperApe:''' Hi, AlphaOne. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1300</id>
      <timestamp>2004-07-15T01:05:13Z</timestamp>
      <contributor>
        <ip>Dsl-207-112-89-155.tor.primus.ca</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

Real name is Michael P. I'm a [http://www.cs.yorku.ca computer science] student at [http://www.yorku.ca York university]

website: http://alphaone.teaminfamy.net/

==Contact Info==

===Email===

thematrixhunter@yahoo.com ('''Y!'''), AlphaOne4u@hotmail.com ('''MSN'''), plouj@yorku.ca (Uni e-mail)

===ICQ===

235746829

==Goals==
* To have fun
* To explore the possibilities of Unreal Script
* To implement my ideas using the Unreal Engine
* To compete in the &quot;Make Something Unreal&quot; contest

==Projects==

[[Legacy:AlphaCoop|AlphaCoop]] - coder - '''''active'''''

[http://www.planetunreal.com/da Defence Alliance 2] - coder - inactive

[[Legacy:Mod_Ideas/DevTools|DevTools]] - coder - inactive

[http://www.planetunreal.com/hackerz Hackerz UT2003 TC] - coder - inactive

[[Legacy:Mod_Ideas/Possessed|Possessed]] - coder - inactive

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RocketJump]] - coder

[http://wiki.unrealkart.elmuerte.com/Wiki_Markup Unreal Kart] - coder - '''''active'''''

[http://strangelove.beyondunreal.com StrangeLove mutator for UT2004] - coder and everything else -  '''''active'''''

==Journal==

[[Legacy:AlphaOne/Developer Journal|AlphaOne/Developer Journal]]

---- ----

==Discussion==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1301</id>
      <timestamp>2004-09-15T00:11:38Z</timestamp>
      <contributor>
        <ip>Plouj</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

Real name is Michael P. I'm a [http://www.cs.yorku.ca computer science] student at [http://www.yorku.ca York university]

website: http://alphaone.teaminfamy.net/

==Contact Info==

===Email===

thematrixhunter@yahoo.com ('''Y!'''), AlphaOne4u@hotmail.com ('''MSN'''), plouj@yorku.ca (Uni e-mail)

===ICQ===

235746829

==Goals==
* To have fun
* To explore the possibilities of Unreal Script
* To implement my ideas using the Unreal Engine
* To compete in the &quot;Make Something Unreal&quot; contest

==Projects==

[[Legacy:AlphaCoop|AlphaCoop]] - coder - '''''active'''''

[http://www.planetunreal.com/da Defence Alliance 2] - coder - inactive

[[Legacy:Mod_Ideas/DevTools|DevTools]] - coder - inactive

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FishEyeView]] - coder - inactive

[http://www.planetunreal.com/hackerz Hackerz UT2003 TC] - coder - inactive

[[Legacy:Mod_Ideas/Possessed|Possessed]] - coder - inactive

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RocketJump]] - coder

[http://wiki.unrealkart.elmuerte.com/Wiki_Markup Unreal Kart] - coder - '''''active'''''

[http://strangelove.beyondunreal.com StrangeLove mutator for UT2004] - coder and everything else -  '''''active'''''

==Journal==

[[Legacy:AlphaOne/Developer Journal|AlphaOne/Developer Journal]]

---- ----

==Discussion==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaOne/AlphaCoop</title>
    <id>345</id>
    <revision>
      <id>1204</id>
      <timestamp>2004-09-26T18:14:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well, I decided not to make this, so, ouch

'''Wormbo:''' Eh? What (re)create this page then?</text>
    </revision>
    <revision>
      <id>1205</id>
      <timestamp>2004-09-26T15:08:35Z</timestamp>
      <contributor>
        <ip>Pcp03568053pcs.wchryh01.nj.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well, I decided not to make this, so, ouch</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaOne/Developer Journal</title>
    <id>343</id>
    <revision>
      <id>1198</id>
      <timestamp>2003-09-09T02:34:38Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==8 SEP 2003==

I think its time to update. Today was my first time at my [http://yorku.ca/yorkweb/index.htm university]. I'm studying [http://www.cs.yorku.ca computer science] there. Now I need to waste a lot of money on:
* books
* supplies
* new clothes
* food

We also got some nice progress over at [http://www.planetunreal.com/hackerz/ Hackerz].

==31 JUL 2003==

It's still July?!? Oh, well. I'm trying to figure out how to program proper (working) jet plane physics.

==27 - 30 JUL 2003==

Been lazy

==12 - 26 JUL 2003==

Was away @ a camp.

==10 - 11 JUL 2003==

Was packing for camp.

==9 JUL 2003==

I just fixed some &quot;Access None&quot;s and no I spawn each player with a &quot;ghost&quot; pawn, which is invicible. Whenever, it collides with empty body pawns the PC takes controll of it and fragging begins! After I die I take control of the ghost again.

Now I have to figure out how and where to spawn empty bodies after they die and @ game start.

Yay! I just wrote a wild mutator which displays Debug info for all pawns, even if your PlayerController doesn't own it - [[Legacy:Mod_Ideas/DevTools|Mod_Ideas/DevTools]] All you have to do is move your crosshair over the pawn!

==8 JUL 2003==

While working on [[Legacy:Mod_Ideas/Possessed|Possessed]] I managed to switch from ghost to normal pawn when the ghost collides with the lonely pawn. Now, the challenge is during the death of the normal pawn. To put the ghost pawn in its position, and to posses it by the PC properly.

==7 JUL 2003==

First entry. Hopefully not the last! I'm starting to work on two small projects: [[Legacy:Mod_Ideas/Possessed|Possessed]] and [[Legacy:Mod_Ideas/Lightning|Lightning]]

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1199</id>
      <timestamp>2003-08-05T09:42:14Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">'''31 JUL 2003'''

It's still July?!? Oh, well. I'm trying to figure out how to program proper (working) jet plane physics.

'''27 - 30 JUL 2003'''

Been lazy

'''12 - 26 JUL 2003'''

Was away @ a camp.

'''10 - 11 JUL 2003'''

Was packing for camp.

'''9 JUL 2003'''

I just fixed some &quot;Access None&quot;s and no I spawn each player with a &quot;ghost&quot; pawn, which is invicible. Whenever, it collides with empty body pawns the PC takes controll of it and fragging begins! After I die I take control of the ghost again.

Now I have to figure out how and where to spawn empty bodies after they die and @ game start.

Yay! I just wrote a wild mutator which displays Debug info for all pawns, even if your PlayerController doesn't own it - [[Legacy:Mod_Ideas/DevTools|Mod_Ideas/DevTools]] All you have to do is move your crosshair over the pawn!

'''8 JUL 2003'''

While working on [[Legacy:Mod_Ideas/Possessed|Possessed]] I managed to switch from ghost to normal pawn when the ghost collides with the lonely pawn. Now, the challenge is during the death of the normal pawn. To put the ghost pawn in its position, and to posses it by the PC properly.

'''7 JUL 2003'''

First entry. Hopefully not the last! I'm starting to work on two small projects: [[Legacy:Mod_Ideas/Possessed|Possessed]] and [[Legacy:Mod_Ideas/Lightning|Lightning]]

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1200</id>
      <timestamp>2003-09-09T02:31:21Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==8 SEP 2003==

I think its time to update. Today was my first time at my [http://yorku.ca/yorkweb/index.htm university]. Now I need to waste a lot of money on:
* books
* supplies
* new clothes
* food

We also got some nice progress over at [http://www.planetunreal.com/hackerz/ Hackerz].

==31 JUL 2003==

It's still July?!? Oh, well. I'm trying to figure out how to program proper (working) jet plane physics.

==27 - 30 JUL 2003==

Been lazy

==12 - 26 JUL 2003==

Was away @ a camp.

==10 - 11 JUL 2003==

Was packing for camp.

==9 JUL 2003==

I just fixed some &quot;Access None&quot;s and no I spawn each player with a &quot;ghost&quot; pawn, which is invicible. Whenever, it collides with empty body pawns the PC takes controll of it and fragging begins! After I die I take control of the ghost again.

Now I have to figure out how and where to spawn empty bodies after they die and @ game start.

Yay! I just wrote a wild mutator which displays Debug info for all pawns, even if your PlayerController doesn't own it - [[Legacy:Mod_Ideas/DevTools|Mod_Ideas/DevTools]] All you have to do is move your crosshair over the pawn!

==8 JUL 2003==

While working on [[Legacy:Mod_Ideas/Possessed|Possessed]] I managed to switch from ghost to normal pawn when the ghost collides with the lonely pawn. Now, the challenge is during the death of the normal pawn. To put the ghost pawn in its position, and to posses it by the PC properly.

==7 JUL 2003==

First entry. Hopefully not the last! I'm starting to work on two small projects: [[Legacy:Mod_Ideas/Possessed|Possessed]] and [[Legacy:Mod_Ideas/Lightning|Lightning]]

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaOne/FishEyeView</title>
    <id>346</id>
    <revision>
      <id>1206</id>
      <timestamp>2004-09-04T15:34:20Z</timestamp>
      <contributor>
        <ip>Plouj</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Borrowed from [http://wouter.fov120.com/gfxengine/fisheyequake/index.html Fish Eye Quake]

First attempts http://alphaone.teaminfamy.net/pics/FishEyeTest1.png?wikihack

Thats a FOV of 170!

For compartions of normal and fisheye projection FOVs, see this:

[http://wouter.fov120.com/gfxengine/fisheyequake/compare.html Quake FOV comparison]

==Non Code Stuff==

http://alphaone.teaminfamy.net/pics/FishEyeShader.png?wikihack

http://alphaone.teaminfamy.net/pics/FishEyeMesh.png?wikihack

==Crappy Code==

This code makes it barely work:

&lt;uscript&gt;
class FishEyeScreenActor extends Actor;

var PlayerController ownerViewer;
var() ScriptedTexture	DestTexture;
var() name				CameraTag;
var() float				RefreshRate;
var() float				FOV;
var() float				ScreenViewDistance;

// lots of coded ripped from CameraTextureClient...
simulated function PostBeginPlay()
{
	DestTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture'));
	if(DestTexture != None)
	{
		DestTexture.Client = Self;
		DestTexture.SetSize(1024,1024);
		Skins[0] = DestTexture;
		SetTimer(1.0 / RefreshRate,true);
		Enable('Timer');
	}
}

simulated function Timer()
{
	DestTexture.Revision++;
}

function Tick(float DeltaTime)
{
	local vector screenOffSet;

	super.Tick(DeltaTime);
	if(ownerViewer != none)
	{
		SetRotation(ownerViewer.Rotation);
		screenOffSet = vector(Rotation) * ScreenViewDistance;

		if(ownerViewer.Pawn != none)
		{
			SetLocation(ownerViewer.Pawn.Location + screenOffSet + ownerViewer.Pawn.EyePosition());
		}
		else
		{
			SetLocation(ownerViewer.Location + screenOffSet);
		}
	}
}

simulated event RenderTexture(ScriptedTexture Tex)
{
	local vector screenOffSet;
	local vector fishCameraLocation;
	local rotator fishCameraRotation;
	local actor fishCameraActor;

	/*if(ownerViewer != none)
	{
		screenOffSet = vector(ownerViewer.Rotation) * ScreenViewDistance;

		fishCameraRotation = ownerViewer.Rotation;
		fishCameraActor = ownerViewer;
		fishCameraLocation = -screenOffSet;

		if(ownerViewer.Pawn != none)
		{
			fishCameraLocation += ownerViewer.Pawn.Location + ownerViewer.Pawn.EyePosition();
		}
		else
		{
			fishCameraLocation += ownerViewer.Location;
		}
	}
	else
	{*/
		fishCameraActor = self;
		fishCameraLocation = Location;
		fishCameraRotation = Rotation;
	//}

	Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,fishCameraActor,fishCameraLocation,fishCameraRotation,FOV);

}

simulated event Destroyed()
{
	if (DestTexture != None)
	{
		DestTexture.Client = None;
		Level.ObjectPool.FreeObject(DestTexture);
	}

	Super.Destroyed();
}

defaultproperties
{
	ScreenViewDistance =	160
	bUnlit =				true
	bStatic =				false
	bAlwaysRelevant =		true
	bNoDelete =				false
	RefreshRate =			60
	FOV =					170
	DrawType =				DT_StaticMesh
	StaticMesh =			StaticMesh'FishEyeMeshes.Sphere2'
	DestTexture =			ScriptedTexture'FishEyeTex.Screen2'
	bHardAttach =			true

}
&lt;/uscript&gt;

&lt;uscript&gt;
class FishEyeInt extends interaction;

var bool bFishEyeActive;
var FishEyeScreenActor FishEyeScreenObject;


function Initialize()
{
	if(ViewportOwner.Actor != none)
	{
		// called after being attached to the PC
	 	FishEyeScreenObject = ViewportOwner.Actor.Spawn(class'FishEyeScreenActor',
		 	ViewportOwner.Actor, ,
			ViewportOwner.Actor.Location,
			ViewportOwner.Actor.Rotation);

		FishEyeScreenObject.ownerViewer = ViewportOwner.Actor;
		//FishEyeScreenObject.SetBase(ViewportOwner.Actor.Pawn);
	}
}

// ============================================================================
function PostRender(canvas Canvas)
{
	Canvas.SetPos(0,100);
	Canvas.Font = Canvas.TinyFont;
	Canvas.SetDrawColor(255,255,255,255);
	if(bFishEyeActive)
	{
		Canvas.DrawText(&quot;FishEye active&quot;);
		Canvas.SetPos(Canvas.SizeX, Canvas.SizeY);
  		Canvas.DrawActor(FishEyeScreenObject,false,false);
	}
	else
	{
		Canvas.DrawText(&quot;FishEye not active&quot;);
	}
}

// modified, from http://wiki.beyondunreal.com/wiki/Keypress_Interactions
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{
	local string tmp;

	if (Action == IST_Release &amp;&amp; FishEyeScreenObject != none)
	{
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
		if (tmp == &quot;use&quot;)
		{
			bFishEyeActive = !bFishEyeActive;
			//FishEyeScreenObject.bHidden = !FishEyeScreenObject.bHidden;
			return True;
		}
	}
	// this event doesn't matter to us, so we pass it on for further processing
	return False;
}

defaultproperties
{
	bVisible =			true
	bFishEyeActive =	false
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1207</id>
      <timestamp>2004-08-30T14:48:41Z</timestamp>
      <contributor>
        <ip>Rhpl-lib.on.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Borrowed from [http://wouter.fov120.com/gfxengine/fisheyequake/index.html Fish Eye Quake]

First attempts http://yucc.yorku.ca/~plouj/pics/FishEyeTest1.png?wikihack

Thats a FOV of 170!

For compartions of normal and fisheye projection FOVs, see this:

[http://wouter.fov120.com/gfxengine/fisheyequake/compare.html Quake FOV comparison]</text>
    </revision>
    <revision>
      <id>1208</id>
      <timestamp>2004-09-04T15:22:27Z</timestamp>
      <contributor>
        <ip>Plouj</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Borrowed from [http://wouter.fov120.com/gfxengine/fisheyequake/index.html Fish Eye Quake]

First attempts http://alphaone.teaminfamy.net/pics/FishEyeTest1.png?wikihack

Thats a FOV of 170!

For compartions of normal and fisheye projection FOVs, see this:

[http://wouter.fov120.com/gfxengine/fisheyequake/compare.html Quake FOV comparison]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlphaOne/RocketJump</title>
    <id>344</id>
    <revision>
      <id>1201</id>
      <timestamp>2004-01-27T23:26:17Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Rocket Jump for UT2003

Version 1.4 of 07 JAN 04

Coded by AlphaOne

Promo Map + initial idea by Travis

==About==

Just something I finally finished.

Its pretty basic, but I'm still putting it out to the public to see the reaction, and to possibly get some more ideas/comments on what to do with it next.

This first version of rocket jump for ut2003 comes with two maps, promo and king of the hill.

The first one is just to play around and do some cool jumps and tricks.

The second one allows you to play a king of the hill type of game mixed with rocket jump. You earn points by being on top of a hill.

==Instructions==

===Installation===

====ZIP====

-unzip into your '''UT2003/''' directory-

-read the README-

====UMOD====

-unzip in '''any''' folder-

-read the README-

-Simple point + click install-

===Playing===

Select Rocket Jump as the gametype.

Click on gameRules tab to change the game settings and the client settings.

Do NOT play with bots - they don't know what to do so they'll just push you around.

Select one of two maps

When in the game, press ESC to access the spectate/play button, as well as the client settings button.

====KOTH====

The player first to reach the goal score wins. You score by being on top of a hill. Watch that circle thingy, it tells you where the current hill is. Depending on the game settings you might have to be alone on the hill to score, so shoot those guys off. If you want to stop someone from scoring shoot him off too. Oh, and watch out, the hills might 'move' to different locations. :D

====Other maps====

No point other than doing jumps and tricks. Maybe showing your friends how 1337 you are. (Use the spectate option for that :))

Enjoy!

==Features==
*KOTH (King Of the Hill)
**game type allowed for maps using special KOTHVolume's
**mappers can add as many hills as they want
**you can play with either one hill being active all the time (first hill in the map), or by letting the hills switch based on time alloted to each hill by the mapper
*Custom game rules tab
*Client settings
**Trains on/off
**Realistic smoke physics on/off
*Custom ECS menu
**added a spectate/play button
**better layout :)
*proper rocket jump world rules (at least I think so)
**Only one gun - rocket launcher
**All types of damages are turned off
**Rockets spash damage impulse is increased to allow for cool jumps + tricks
*Custom HUD
**removed useless stuff
**show where the current hill in KOTH is
*Network Compatible
*No bot support :(

==Downloads==

===ZIP===

http://www.yucc.yorku.ca/~plouj/RocketJump/RocketJump.zip

===UMOD===

http://www.yucc.yorku.ca/~plouj/RocketJump/RocketJumpUMOD.zip

==Comments==

'''Wormbo:''' You should zip UT2MOD files as well and include instructions how to install them. That's better for people who don't know what UMOD means.

'''AlphaOne:''' Done and done!</text>
    </revision>
    <revision>
      <id>1202</id>
      <timestamp>2004-01-09T00:14:49Z</timestamp>
      <contributor>
        <ip>Dsl-207-112-87-83.tor.primus.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Rocket Jump for UT2003

Version 1.4 of 07 JAN 04

Coded by AlphaOne

Promo Map + initial idea by Travis

==About==

Just something I finally finished.

Its pretty basic, but I'm still putting it out to the public to see the reaction, and to possibly get some more ideas/comments on what to do with it next.

This first version of rocket jump for ut2003 comes with two maps, promo and king of the hill.

The first one is just to play around and do some cool jumps and tricks.

The second one allows you to play a king of the hill type of game mixed with rocket jump. You earn points by being on top of a hill.

==Instructions==

===Installation===

====ZIP====

-unzip into your '''UT2003/''' directory-

-read the README-

====UMOD====

-unzip in '''any''' folder-

-read the README-

-Simple point + click install-

===Playing===

Select Rocket Jump as the gametype.

Click on gameRules tab to change the game settings and the client settings.

Do NOT play with bots - they don't know what to do so they'll just push you around.

Select one of two maps

When in the game, press ESC to access the spectate/play button, as well as the client settings button.

====KOTH====

The player first to reach the goal score wins. You score by being on top of a hill. Watch that circle thingy, it tells you where the current hill is. Depending on the game settings you might have to be alone on the hill to score, so shoot those guys off. If you want to stop someone from scoring shoot him off too. Oh, and watch out, the hills might 'move' to different locations. :D

====Other maps====

No point other than doing jumps and tricks. Maybe showing your friends how 1337 you are. (Use the spectate option for that :))

Enjoy!

==Features==
*KOTH (King Of the Hill)
**game type allowed for maps using special KOTHVolume's
**mappers can add as many hills as they want
**you can play with either one hill being active all the time (first hill in the map), or by letting the hills switch based on time alloted to each hill by the mapper
*Custom game rules tab
*Client settings
**Trains on/off
**Realistic smoke physics on/off
*Custom ECS menu
**added a spectate/play button
**better layout :)
*proper rocket jump world rules (at least I think so)
**Only one gun - rocket launcher
**All types of damages are turned off
**Rockets spash damage impulse is increased to allow for cool jumps + tricks
*Custom HUD
**removed useless stuff
**show where the current hill in KOTH is
*Network Compatible
*No bot support :(

==Downloads==

===ZIP===

http://www.yucc.yorku.ca/~plouj/RocketJump.zip

===UMOD===

http://www.yucc.yorku.ca/~plouj/RocketJumpUMOD.zip

==Comments==

'''Wormbo:''' You should zip UT2MOD files as well and include instructions how to install them. That's better for people who don't know what UMOD means.</text>
    </revision>
    <revision>
      <id>1203</id>
      <timestamp>2004-01-09T01:02:00Z</timestamp>
      <contributor>
        <ip>Dsl-207-112-91-151.tor.primus.ca</ip>
      </contributor>
      <comment>Beautifying</comment>
      <text xml:space="preserve">Rocket Jump for UT2003

Version 1.4 of 07 JAN 04

Coded by AlphaOne

Promo Map + initial idea by Travis

==About==

Just something I finally finished.

Its pretty basic, but I'm still putting it out to the public to see the reaction, and to possibly get some more ideas/comments on what to do with it next.

This first version of rocket jump for ut2003 comes with two maps, promo and king of the hill.

The first one is just to play around and do some cool jumps and tricks.

The second one allows you to play a king of the hill type of game mixed with rocket jump. You earn points by being on top of a hill.

==Instructions==

===Installation===

====ZIP====

-unzip into your '''UT2003/''' directory-

-read the README-

====UMOD====

-unzip in '''any''' folder-

-read the README-

-Simple point + click install-

===Playing===

Select Rocket Jump as the gametype.

Click on gameRules tab to change the game settings and the client settings.

Do NOT play with bots - they don't know what to do so they'll just push you around.

Select one of two maps

When in the game, press ESC to access the spectate/play button, as well as the client settings button.

====KOTH====

The player first to reach the goal score wins. You score by being on top of a hill. Watch that circle thingy, it tells you where the current hill is. Depending on the game settings you might have to be alone on the hill to score, so shoot those guys off. If you want to stop someone from scoring shoot him off too. Oh, and watch out, the hills might 'move' to different locations. :D

====Other maps====

No point other than doing jumps and tricks. Maybe showing your friends how 1337 you are. (Use the spectate option for that :))

Enjoy!

==Features==
*KOTH (King Of the Hill)
**game type allowed for maps using special KOTHVolume's
**mappers can add as many hills as they want
**you can play with either one hill being active all the time (first hill in the map), or by letting the hills switch based on time alloted to each hill by the mapper
*Custom game rules tab
*Client settings
**Trains on/off
**Realistic smoke physics on/off
*Custom ECS menu
**added a spectate/play button
**better layout :)
*proper rocket jump world rules (at least I think so)
**Only one gun - rocket launcher
**All types of damages are turned off
**Rockets spash damage impulse is increased to allow for cool jumps + tricks
*Custom HUD
**removed useless stuff
**show where the current hill in KOTH is
*Network Compatible
*No bot support :(

==Downloads==

===ZIP===

http://www.yucc.yorku.ca/~plouj/RocketJump.zip

===UMOD===

http://www.yucc.yorku.ca/~plouj/RocketJumpUMOD.zip

==Comments==

'''Wormbo:''' You should zip UT2MOD files as well and include instructions how to install them. That's better for people who don't know what UMOD means.

'''AlphaOne:''' Done and done!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AlternatePath</title>
    <id>341</id>
    <revision>
      <id>1193</id>
      <timestamp>2005-07-18T14:06:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AlternatePath (Package: Botpack)}}

The AlternatePath actor tells the bots where to go to reach an enemy flag in a CTF level when there are more than one distinct paths available. Place AlternatePath actors at the 'start' of each possible path.

There is no &quot;start&quot; of a path.  Routes are calculated from wherever the bot happens to be to wherever they feel like they should be going.

a bot always looks for the quickest route to the flag. If that route &amp; another possible route both contain an AlternatePath actor, it considers both of those to be of equal length &amp; picks according to SelectionWeight?

The plot thickens: forum snip from [[Legacy:Chris|Chris]]Toth.Hu:

{{innerbox| Alternatepath actors are used for marking the ENTRANCES to the enemy base. It should belong to the team whose base the path leads into. The selectionweight value should balance the lenght of the different routes. So if one path is longer and the bots don't like to use it, then raise the SW value.

}}

and a snip from the UT AI article:

{{innerbox| AlternatePaths are used to indicate alternate routes that bots can use to enter an opponent's base. The AlternatePath's team attribute should be the same as the team of the FlagBase for which the AlternatePath is pointing out a route. The AlternatePath's SelectionWeight is used to modify the likelihood of bots using that path. Bots use AlternatePaths by first moving along the shortest route to the AlternatePath they have chosen, and then moving along the shortest route from their to the FlagBase. If the AlternatePath is set up so that the shortest route to the AltermatePath involves running right by the FlagBase, bots will do that (a bad thing!). The location of AlternatePaths may need to be adjusted to provide the desired results. AlternatePaths with the bReturnOnly flag set true are used by bots with the same team number returning to their base with a flag.

}}

This seems to be saying:

* Team = Red: blue bots use this to attack the red base
* Team = Red, bReturnOnly = true. Red bots use this to go home.

Arg! Though I suppose it ''sort of'' makes sense: an AltPath's Team gives the base it leads to.

I presume there can't be several tiers of AltPaths.

==Properties ==
;Team : AlternatePath actors are team specific and this must be set here. For a normal CTF map the value of the &lt;tt&gt;Team&lt;/tt&gt; property is the number of the team that should be using the path.  For a CTF4 map, the &lt;tt&gt;Team&lt;/tt&gt; property should be set to the number of the team the path goes to.
; * 0 = Red Team
; * 1 = Blue Team
; * 2 = Green Team
; * 3 = Gold Team

; SelectionWeight : this changes the selection 'weight' of a given AlternatePath to make that direction more/less desirable.

'''Tarquin:'''  I'm fiddling with this value to try and make bots use one of my altpaths. Current setting is 500, and they are still not taking it (other paths are set to 1 (default), 10 and 15. What do these damn bots want?

'''SabbathCat:''' I'm was having quite serious problems getting bots to follow certain parts in a map I'm working on, so I made a test map with 3 paths for each team and set up alternate paths with values of -1, 0 and 1. The paths the bots took the most seemed to be the middle , which was a value of 1! I'm confused. The paths are all equidistant from the flag, which really boggles me. 

One thing I found that does appear to work is ExtraCost on [[Legacy:PathNode|PathNode]]s, I exchanged all the altpaths for [[Legacy:PathNode|PathNode]]s with values of 2560,1024 and 512. and the bots all steered towards the shortest (in ExtraCost terms). :)

[http://www.fileplanet.com/dl.aspx?/planetunreal/identitycrisis/cabins/sabbathcat/ctf-alternate-path-test.zip Here are the two test maps I created] if you're interested :)

'''EntropicLqd:''' I've been looking through the AlternatePath coding in Botpack.CTFGame (UT) - and the code is very odd.  It uses the sum of all of the alternate path weightings (that are not return only types) to get a total of the weightings.  This total is then used to pick an AlternatePath.  The curious thing is that when selecting the AlternatePath to use, ''return only'' Alternate Paths are also used.  Here's the code snippet.

&lt;uscript&gt;
function bool RestartPlayer(Pawn aPlayer)
{
  // Prior code snipped - post code slightly reformatted from original
  if ( FRand() &lt; 0.8 )
  {
    for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
    {
      if ( N.IsA('AlternatePath') &amp;&amp;
           (AlternatePath(N).team != B.PlayerReplicationInfo.team)
           &amp;&amp; !AlternatePath(N).bReturnOnly )
      {
        TotalWeight += AlternatePath(N).SelectionWeight;
      }
    }
    selection = FRand() * TotalWeight;

    for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
    {
      // Look - all alternate path nodes are counted - weird.
      if ( N.IsA('AlternatePath') &amp;&amp;
           (AlternatePath(N).team != B.PlayerReplicationInfo.team) )
      {
        B.AlternatePath = AlternatePath(N);
        PartialWeight += AlternatePath(N).SelectionWeight;
        if ( PartialWeight &gt; selection )
        {
          break;
        }
      }
   }
}
&lt;/uscript&gt;

'''Ironblayde:''' I'm just getting started in UnrealScript. As it happens, I picked [[Legacy:CTFGame|CTFGame]] to start working through and tinkering with, and I found this today as well. If I'm interpreting it correctly, AlternatePath selection will work correctly ''if'' there are no Return Only AlternatePaths of the relevant color. Otherwise, since Return Only pathnodes are included in the search to find a destination, you could have a situation like this. Suppose a red bot is spawning and has four blue AlternatePaths to choose from:

AltPath0 &amp;ndash; Weight 1.0

AltPath1 &amp;ndash; Weight 1.0 &amp;ndash; RETURN ONLY

AltPath2 &amp;ndash; Weight 1.0 &amp;ndash; RETURN ONLY

AltPath3 &amp;ndash; Weight 1.0

Since only the first and last paths are included in the computation of TotalWeight, we'll get TotalWeight = 2.0, thus Selection will be on [0.0, 2.0), meaning that the choice will be 50/50 between AltPath0 and AltPath1, even though the latter should theoretically not be used.

This is the only place that an AlternatePath is assigned to an attacker, isn't it? I only found one other instance of an AlternatePath being assigned, and it was in [[Legacy:CTFFlag|CTFFlag]] where one is assigned to someone returning with a flag. Am I reading the code right, i.e. is this confirmed to be a mistake in the code? Forgive me if I'm a few years behind. ;)

Also, does anyone have any idea why an AlternatePath would only be assigned 80% of the time? I assume that in the other 20% of cases, bots will just take the most direct route to the flag?

Sorry for the long thread mode remarks... I promise I'll refactor this page as soon as I'm certain what's going on here. ;)

==Related Topics ==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Mapping For CTF|Mapping For CTF]]
* [[Legacy:Mapping For MCTF|Mapping For MCTF]]
* The equivalent (more or less) in UT2003 is the [[Legacy:AssaultPath|AssaultPath]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1194</id>
      <timestamp>2004-05-22T04:07:11Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>Questions on AlternatePath selection</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AlternatePath (Package: Botpack)}}

The AlternatePath actor tells the bots where to go to reach an enemy flag in a CTF level when there are more than one distinct paths available. Place AlternatePath actors at the 'start' of each possible path.

'''Tarquin:'''  where is the &quot;start&quot; of a path? CTF-EternalCave has them about 4 pathnodes beyond the forking point.

'''EntropicLqd:'''  There is no &quot;start&quot;.  Routes are calculated from wherever the bot happens to be to wherever they feel like they should be going.

'''Tarquin:'''  so... a bot always looks for the quickest route to the flag. If that route &amp; another possible route both contain an AlternatePath actor, it considers both of those to be of equal length &amp; picks according to SelectionWeight?

The plot thickens: forum snip from [[Legacy:Chris|Chris]]Toth.Hu:

{{innerbox| Alternatepath actors are used for marking the ENTRANCES to the enemy base. It should belong to the team whose base the path leads into. The selectionweight value should balance the lenght of the different routes. So if one path is longer and the bots don't like to use it, then raise the SW value.

}}

and a snip from the UT AI article:

{{innerbox| AlternatePaths are used to indicate alternate routes that bots can use to enter an opponent's base. The AlternatePath's team attribute should be the same as the team of the FlagBase for which the AlternatePath is pointing out a route. The AlternatePath's SelectionWeight is used to modify the likelihood of bots using that path. Bots use AlternatePaths by first moving along the shortest route to the AlternatePath they have chosen, and then moving along the shortest route from their to the FlagBase. If the AlternatePath is set up so that the shortest route to the AltermatePath involves running right by the FlagBase, bots will do that (a bad thing!). The location of AlternatePaths may need to be adjusted to provide the desired results. AlternatePaths with the bReturnOnly flag set true are used by bots with the same team number returning to their base with a flag.

}}

This seems to be saying:

* Team = Red: blue bots use this to attack the red base
* Team = Red, bReturnOnly = true. Red bots use this to go home.

Arg! Though I suppose it ''sort of'' makes sense: an AltPath's Team gives the base it leads to.

I presume there can't be several tiers of AltPaths.

[[:Category:Legacy Refactor Me]]

==Properties ==
;Team : AlternatePath actors are team specific and this must be set here. For a normal CTF map the value of the &lt;tt&gt;Team&lt;/tt&gt; property is the number of the team that should be using the path.  For a CTF4 map, the &lt;tt&gt;Team&lt;/tt&gt; property should be set to the number of the team the path goes to.
; * 0 = Red Team
; * 1 = Blue Team
; * 2 = Green Team
; * 3 = Gold Team

; SelectionWeight : this changes the selection 'weight' of a given AlternatePath to make that direction more/less desirable.

'''Tarquin:'''  I'm fiddling with this value to try and make bots use one of my altpaths. Current setting is 500, and they are still not taking it (other paths are set to 1 (default), 10 and 15. What do these damn bots want?

'''SabbathCat:''' I'm was having quite serious problems getting bots to follow certain parts in a map I'm working on, so I made a test map with 3 paths for each team and set up alternate paths with values of -1, 0 and 1. The paths the bots took the most seemed to be the middle , which was a value of 1! I'm confused. The paths are all equidistant from the flag, which really boggles me. 

One thing I found that does appear to work is ExtraCost on [[Legacy:PathNode|PathNode]]s, I exchanged all the altpaths for [[Legacy:PathNode|PathNode]]s with values of 2560,1024 and 512. and the bots all steered towards the shortest (in ExtraCost terms). :)

[http://www.fileplanet.com/dl.aspx?/planetunreal/identitycrisis/cabins/sabbathcat/ctf-alternate-path-test.zip Here are the two test maps I created] if you're interested :)

'''EntropicLqd:''' I've been looking through the AlternatePath coding in Botpack.CTFGame (UT) - and the code is very odd.  It uses the sum of all of the alternate path weightings (that are not return only types) to get a total of the weightings.  This total is then used to pick an AlternatePath.  The curious thing is that when selecting the AlternatePath to use, ''return only'' Alternate Paths are also used.  Here's the code snippet.

&lt;uscript&gt;
function bool RestartPlayer(Pawn aPlayer)
{
  // Prior code snipped - post code slightly reformatted from original
  if ( FRand() &lt; 0.8 )
  {
    for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
    {
      if ( N.IsA('AlternatePath') &amp;&amp;
           (AlternatePath(N).team != B.PlayerReplicationInfo.team)
           &amp;&amp; !AlternatePath(N).bReturnOnly )
      {
        TotalWeight += AlternatePath(N).SelectionWeight;
      }
    }
    selection = FRand() * TotalWeight;

    for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
    {
      // Look - all alternate path nodes are counted - weird.
      if ( N.IsA('AlternatePath') &amp;&amp;
           (AlternatePath(N).team != B.PlayerReplicationInfo.team) )
      {
        B.AlternatePath = AlternatePath(N);
        PartialWeight += AlternatePath(N).SelectionWeight;
        if ( PartialWeight &gt; selection )
        {
          break;
        }
      }
   }
}
&lt;/uscript&gt;

'''Ironblayde:''' I'm just getting started in UnrealScript. As it happens, I picked [[Legacy:CTFGame|CTFGame]] to start working through and tinkering with, and I found this today as well. If I'm interpreting it correctly, AlternatePath selection will work correctly ''if'' there are no Return Only AlternatePaths of the relevant color. Otherwise, since Return Only pathnodes are included in the search to find a destination, you could have a situation like this. Suppose a red bot is spawning and has four blue AlternatePaths to choose from:

AltPath0 &amp;ndash; Weight 1.0

AltPath1 &amp;ndash; Weight 1.0 &amp;ndash; RETURN ONLY

AltPath2 &amp;ndash; Weight 1.0 &amp;ndash; RETURN ONLY

AltPath3 &amp;ndash; Weight 1.0

Since only the first and last paths are included in the computation of TotalWeight, we'll get TotalWeight = 2.0, thus Selection will be on [0.0, 2.0), meaning that the choice will be 50/50 between AltPath0 and AltPath1, even though the latter should theoretically not be used.

This is the only place that an AlternatePath is assigned to an attacker, isn't it? I only found one other instance of an AlternatePath being assigned, and it was in [[Legacy:CTFFlag|CTFFlag]] where one is assigned to someone returning with a flag. Am I reading the code right, i.e. is this confirmed to be a mistake in the code? Forgive me if I'm a few years behind. ;)

Also, does anyone have any idea why an AlternatePath would only be assigned 80% of the time? I assume that in the other 20% of cases, bots will just take the most direct route to the flag?

Sorry for the long thread mode remarks... I promise I'll refactor this page as soon as I'm certain what's going on here. ;)

==Related Topics ==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Mapping For CTF|Mapping For CTF]]
* [[Legacy:Mapping For MCTF|Mapping For MCTF]]
* The equivalent (more or less) in UT2003 is the [[Legacy:AssaultPath|AssaultPath]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1195</id>
      <timestamp>2005-07-18T13:38:57Z</timestamp>
      <contributor>
        <ip>CPE0080c8b807b3-CM00111a59bdc0.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AlternatePath (Package: Botpack)}}

The AlternatePath actor tells the bots where to go to reach an enemy flag in a CTF level when there are more than one distinct paths available. Place AlternatePath actors at the 'start' of each possible path.

  There is no &quot;start&quot; of a path.  Routes are calculated from wherever the bot happens to be to wherever they feel like they should be going.

a bot always looks for the quickest route to the flag. If that route &amp; another possible route both contain an AlternatePath actor, it considers both of those to be of equal length &amp; picks according to SelectionWeight?

The plot thickens: forum snip from [[Legacy:Chris|Chris]]Toth.Hu:

{{innerbox| Alternatepath actors are used for marking the ENTRANCES to the enemy base. It should belong to the team whose base the path leads into. The selectionweight value should balance the lenght of the different routes. So if one path is longer and the bots don't like to use it, then raise the SW value.

}}

and a snip from the UT AI article:

{{innerbox| AlternatePaths are used to indicate alternate routes that bots can use to enter an opponent's base. The AlternatePath's team attribute should be the same as the team of the FlagBase for which the AlternatePath is pointing out a route. The AlternatePath's SelectionWeight is used to modify the likelihood of bots using that path. Bots use AlternatePaths by first moving along the shortest route to the AlternatePath they have chosen, and then moving along the shortest route from their to the FlagBase. If the AlternatePath is set up so that the shortest route to the AltermatePath involves running right by the FlagBase, bots will do that (a bad thing!). The location of AlternatePaths may need to be adjusted to provide the desired results. AlternatePaths with the bReturnOnly flag set true are used by bots with the same team number returning to their base with a flag.

}}

This seems to be saying:

* Team = Red: blue bots use this to attack the red base
* Team = Red, bReturnOnly = true. Red bots use this to go home.

Arg! Though I suppose it ''sort of'' makes sense: an AltPath's Team gives the base it leads to.

I presume there can't be several tiers of AltPaths.

==Properties ==
;Team : AlternatePath actors are team specific and this must be set here. For a normal CTF map the value of the &lt;tt&gt;Team&lt;/tt&gt; property is the number of the team that should be using the path.  For a CTF4 map, the &lt;tt&gt;Team&lt;/tt&gt; property should be set to the number of the team the path goes to.
; * 0 = Red Team
; * 1 = Blue Team
; * 2 = Green Team
; * 3 = Gold Team

; SelectionWeight : this changes the selection 'weight' of a given AlternatePath to make that direction more/less desirable.

'''Tarquin:'''  I'm fiddling with this value to try and make bots use one of my altpaths. Current setting is 500, and they are still not taking it (other paths are set to 1 (default), 10 and 15. What do these damn bots want?

'''SabbathCat:''' I'm was having quite serious problems getting bots to follow certain parts in a map I'm working on, so I made a test map with 3 paths for each team and set up alternate paths with values of -1, 0 and 1. The paths the bots took the most seemed to be the middle , which was a value of 1! I'm confused. The paths are all equidistant from the flag, which really boggles me. 

One thing I found that does appear to work is ExtraCost on [[Legacy:PathNode|PathNode]]s, I exchanged all the altpaths for [[Legacy:PathNode|PathNode]]s with values of 2560,1024 and 512. and the bots all steered towards the shortest (in ExtraCost terms). :)

[http://www.fileplanet.com/dl.aspx?/planetunreal/identitycrisis/cabins/sabbathcat/ctf-alternate-path-test.zip Here are the two test maps I created] if you're interested :)

'''EntropicLqd:''' I've been looking through the AlternatePath coding in Botpack.CTFGame (UT) - and the code is very odd.  It uses the sum of all of the alternate path weightings (that are not return only types) to get a total of the weightings.  This total is then used to pick an AlternatePath.  The curious thing is that when selecting the AlternatePath to use, ''return only'' Alternate Paths are also used.  Here's the code snippet.

&lt;uscript&gt;
function bool RestartPlayer(Pawn aPlayer)
{
  // Prior code snipped - post code slightly reformatted from original
  if ( FRand() &lt; 0.8 )
  {
    for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
    {
      if ( N.IsA('AlternatePath') &amp;&amp;
           (AlternatePath(N).team != B.PlayerReplicationInfo.team)
           &amp;&amp; !AlternatePath(N).bReturnOnly )
      {
        TotalWeight += AlternatePath(N).SelectionWeight;
      }
    }
    selection = FRand() * TotalWeight;

    for ( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint )
    {
      // Look - all alternate path nodes are counted - weird.
      if ( N.IsA('AlternatePath') &amp;&amp;
           (AlternatePath(N).team != B.PlayerReplicationInfo.team) )
      {
        B.AlternatePath = AlternatePath(N);
        PartialWeight += AlternatePath(N).SelectionWeight;
        if ( PartialWeight &gt; selection )
        {
          break;
        }
      }
   }
}
&lt;/uscript&gt;

'''Ironblayde:''' I'm just getting started in UnrealScript. As it happens, I picked [[Legacy:CTFGame|CTFGame]] to start working through and tinkering with, and I found this today as well. If I'm interpreting it correctly, AlternatePath selection will work correctly ''if'' there are no Return Only AlternatePaths of the relevant color. Otherwise, since Return Only pathnodes are included in the search to find a destination, you could have a situation like this. Suppose a red bot is spawning and has four blue AlternatePaths to choose from:

AltPath0 &amp;ndash; Weight 1.0

AltPath1 &amp;ndash; Weight 1.0 &amp;ndash; RETURN ONLY

AltPath2 &amp;ndash; Weight 1.0 &amp;ndash; RETURN ONLY

AltPath3 &amp;ndash; Weight 1.0

Since only the first and last paths are included in the computation of TotalWeight, we'll get TotalWeight = 2.0, thus Selection will be on [0.0, 2.0), meaning that the choice will be 50/50 between AltPath0 and AltPath1, even though the latter should theoretically not be used.

This is the only place that an AlternatePath is assigned to an attacker, isn't it? I only found one other instance of an AlternatePath being assigned, and it was in [[Legacy:CTFFlag|CTFFlag]] where one is assigned to someone returning with a flag. Am I reading the code right, i.e. is this confirmed to be a mistake in the code? Forgive me if I'm a few years behind. ;)

Also, does anyone have any idea why an AlternatePath would only be assigned 80% of the time? I assume that in the other 20% of cases, bots will just take the most direct route to the flag?

Sorry for the long thread mode remarks... I promise I'll refactor this page as soon as I'm certain what's going on here. ;)

==Related Topics ==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Mapping For CTF|Mapping For CTF]]
* [[Legacy:Mapping For MCTF|Mapping For MCTF]]
* The equivalent (more or less) in UT2003 is the [[Legacy:AssaultPath|AssaultPath]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Alternative Devastation Gametypes</title>
    <id>501</id>
    <revision>
      <id>1584</id>
      <timestamp>2005-12-24T19:15:05Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>Some cleaning up</comment>
      <text xml:space="preserve">Devastation Ships with ctf, dtt ( see [[Legacy:Mapping For Territories|Mapping For Territories]]) and old fashioned Deathmatch. I have figured out some ways of getting other exciting gametypes to work without ANY scripting or coding. Read on....

You need to have a good understanding of basic map skills.

==Siege==

This gametype is in [[Legacy:Pariah|Pariah]] and im sure in others. This is how we can make a siege gametype where one team defends while the other team attacks an objective.

'''Note:''' Ive spent a very long time getting this to work properly online where things dont work the same as when tested through the editor. You are welcome to suggest any improvements but please dont try to be smart when following this and miss out a step because it might make it easier for you. Thanks

==Part 1:Basic configuration==

Go to the level properties and set the gametype to DTerrGameInfo. Didn't see it in the menu? thats because you need to open the '''DTerritories''' package in the actor class browser. Always open that whenever you start work on this.

==Part 2:Team 1 spawner==

The resistance will be attacking an objective (in this case a valuable power generator) which will be guarded by the conformists. We need to set up a protected spawning area for the resistance. Heres how you do it.

# In the Dspawnsm static mesh package, there is all the static meshes you need to construct a standard spawning platform. Arrange them into a 3x2 rectangle and add the side trim bars to make it look nice.
# 
The SMs are just for show. You need to add a playerstart above each spawner plate. When you have, set each playerstarts properties to the following:

* PlayerstartTeam&gt;1
* Spawnpoint=True

# Now we must add the spawner. Go into the prefab browser (you cant get to it from under the view menu so go to the actor class browser) and look for '''DSpawner'''. Add it into your map with the middle mouse button-or right click in wireframe mode and &quot;add decoration here&quot;. Set the spawners properties to the following:

DDecoDamage Structuralintegrity=0. The conformists cant get to the spawner, but its good to make it invincible anyway.

SpawnerTeamID=1  

Playerstarts= Expand this field, and click on Add, then Find. The cursor should turn to a arrow with a question mark next to it. Click on one of your playerstarts and it should appear in the space. Repeat for all 6 playerstarts. If that doesnt work, type the name (found under the object field) of each playerstart manually into the space.

You can delete the spawner objective (the green hexagon thing) and the interact points.

you should now have 6 playerstarts hooked to a spawner. No we have to make sure the spawning area is protected. We need to put a laser fence across each entrance to make sure conformists cant get in.

1: Make the [[Legacy:Red Builder Brush|red builder brush]] the right size for the laser fence. This will form the part that will actually block players. Then add a volume '''DLaserfencevolume'''. You should see a pinkish volume appear when you move the builder brush away.

2: You can delete the two interact points, they are not needed.

3: Under the laser fence notification (the eagle head icon) set the Team to 1. When [[Legacy:Realtime Preview|realtime preview]] is activated, the lasers should be blue. You can rotate the laser fence emitter to the correct orientation. The static meshes for the laser emitters are found in DDecosmb, but you wil have to press the &quot;all&quot; tab to see them.

Repeat for every entrance to the resistance base.

==Part 3: The Generator/conformist spawner==

The conformist spawner will be located next to the generator so it is the spawner which will need to be destroyed. Follow the steps for the resistance spawner, but set the team values to 0 instead of 1. The spawning area should be protected by lasef fences, but the actual spawner should be next to the generator.

Theres some nice generator meshes in DDecosm and Aquifiers. Add the appropriate generator mesh and place the spawner box in a dominant position next to it. Set the spawners structural integrity (default is 250) to however much damage you wish it to take before blowing up. DO NOT delete the spawner objective this time!!!

I havent tried this yet, but it may be possible to change the display-&gt;Static mesh of the spawner to a generator mesh so you can destroy the generator directly. Ive done something like it before although there is problems with the spawner not showing up in game if the static mesh field is changed.

You should now have a protected conformist spawning area and an unprotected spawner box next to the generator.

==Part 4: The objectives==

Now we must form a system of objectives to tell each team what to do (attack, defend) and to end the round when an objective is complete.

You should still have the spawner objective. Set its properties as following:

Objective&gt; 

Attacking team=1

Primary objective=True

End Objective=True

Feedback&gt;

Title= &quot;destroy the power generator by shooting the spawner&quot; or something. This will show up in the objective box, if it doesnt try tweaking the &quot;always hidden&quot; and &quot;always visible&quot; values.

Now add a '''DSimpleObjective''' to the map and set its properties:

Attacking team=0

Primary objective=False

End objective=False

Feedback&gt;

Title &quot;defend the power generator&quot; or something along those lines. Again tweak the visible values if it doesnt show up when playing as a conformist.

Well done! its finished. Check you have all these:

==Checklist==

*A protected spawning area for the resistance with an hidden spawner box.
*A protected spawning area for the conformists with the spawner forming the destroyable part of the generator.
*The spawner objective and simple objectives set as appropriate.

When played online, when the resistance destroy the generator, the round should end. If it doesnt, check that End objective and primary obective are set to true in the spawner objective and that it refers to the correct spawner-it should be default.

===Things to explore===

I havent tried this yet, but i think it would be possible to have each team with a generator so both can attack each others. Sort of like Territories without the laser fences.

===Comments===</text>
    </revision>
    <revision>
      <id>1585</id>
      <timestamp>2005-11-25T12:54:50Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Devastation Ships with ctf, dtt ( see [[Legacy:Mapping For Territories|Mapping For Territories]]) and old fashioned Deathmatch. I have figured out some ways of getting other exciting gametypes to work without ANY scripting or coding. Read on....

You need to have a good understanding of basic map skills and Events and Tags.

===Siege===

This gametype is in [[Legacy:Pariah|Pariah]] and UT (assault i think? i only have the demo, please verify this for me) and im sure in others. This is how we can make a siege gametype where one team defends while the other team attacks an objective.

'''Note:''' Ive spent a very long time getting this to work properly online where things dont work the same as when tested through the editor. You are welcome to suggest any improvements but please dont try to be smart when following this and miss out a step because it might make it easier for you. Thanks

==Part 1:Basic configuration==

Go to the level properties and set the gametype to DTerrGameInfo. Didn't see it in the menu? thats because you need to open the '''DTerritories''' package in the actor class browser. Always open that whenever you start work on this.

==Part 2:Team 1 spawner==

The resistance will be attacking an objective (in this case a valuable power generator) which will be guarded by the conformists. We need to set up a protected spawning area for the resistance. Heres how you do it.

# In the Dspawnsm static mesh package, there is all the static meshes you need to construct a standard spawning platform. Arrange them into a 3x2 rectangle and add the side trim bars to make it look nice.
# 
The SMs are just for show. You need to add a playerstart above each spawner plate. When you have, set each playerstarts properties to the following:

* PlayerstartTeam&gt;1
* Spawnpoint=True

# Now we must add the spawner. Go into the prefab browser (you cant get to it from under the view menu so go to the actor class browser) and look for '''DSpawner'''. Add it into your map with the middle mouse button-or right click in wireframe mode and &quot;add decoration here&quot;. Set the spawners properties to the following:

DDecoDamage Structuralintegrity=0. The conformists cant get to the spawner, but its good to make it invincible anyway.

SpawnerTeamID=1  Playerstarts. Expand this field, and click on Add, then Find. The cursor should turn to a arrow with a question mark next to it. Click on one of your playerstarts and it should appear in the space. Repeat for all 6 playerstarts. If that doesnt work, type the name (found under the object field) of each playerstart manually into the space.

you should now have 6 playerstarts hooked to a spawner. No we have to make sure the spawning area is protected. We need to put a laser fence across each entrance to make sure conformists cant get in.

1: Make the [[Legacy:Red Builder Brush|red builder brush]] the right size for the laser fence. This will form the part that will actually block players. Then add a volume '''DLaerfencevolume'''. You should see a pinkish volume appear when you move the builder brush away.

2: You can delete the two interact points, they are not needed.

3: Under the laser fence notification (the eagle head icon) set the Team to 1. When [[Legacy:Realtime Preview|realtime preview]] is activated, the lasers should be blue. You can rotate the laser fence emitter to the correct orientation. The static meshes for the laser emitters are found in DDecosmb, but you wil have to press the &quot;all&quot; tab to see them.

Repeat for every entrance to the resistance base.

==Part 3: The Generator/conformist spawner==

'''STILL UNCOMPLETED'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Alternative Vehicle Control</title>
    <id>452</id>
    <revision>
      <id>1494</id>
      <timestamp>2007-11-17T23:25:27Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This code has arisen from the need to have a vehicle where the player can still be seen and shot whilst in control of a vehicle (for the artillery and horses in the LawDogs mod). Instead of the player's original [[Legacy:Pawn|Pawn]] being hidden and the vehicle possessed, the original pawn is attached to the vehicle and the vehicle controlled indirectly.

This has the advantage not only of being able to kill the player without damaging the vehicle and vice versa, but also it allows the player to potentially fire their normal weapons whilst on the vehicle.

The code shown here has only the code relevant to this control method present; It is a long way from a complete vehicle. There is no bot support.

First the vehicle class:

&lt;uscript&gt;
class LawDogsVehicle extends KVehicle
	abstract;

var Pawn RepDriver; //Replicated 'Driver'.

replication
{
	reliable if(Role == ROLE_Authority)
		RepDriver;
}

simulated function ClientKDriverEnter(PlayerController pc)
{
	PlayerController(RepDriver.Controller).bBehindView = bUseBehindView;
}

function KDriverEnter(Pawn p)
{
	Driver = p;
	RepDriver = Driver;

	Driver.bCollideWorld = false;
	Driver.bPhysicsAnimUpdate = false;
	Driver.Velocity = vect(0,0,0);
	Driver.SetPhysics(PHYS_None);

	Driver.SetBase(self);
	Driver.SetRelativeLocation(DrivePos);
	Driver.SetRelativeRotation(rot(0, 0, 0));

	LawDogsPlayer(Driver.Controller).Vehicle = self;
	LawDogsPlayer(Driver.Controller).GotoState('PlayerRiding');
	SetOwner(Driver.Controller);

	ClientKDriverEnter(PlayerController(Driver.Controller));
}

simulated function ClientKDriverLeave(PlayerController pc)
{
	pc.bBehindView = pc.Default.bBehindView;
}

function bool KDriverLeave(bool bForceLeave)
{
	local int i;
	local bool havePlaced;
	local vector HitLocation, HitNormal, tryPlace;

	if(Driver == None)
		return false;

	Driver.bCollideWorld = true;

	for(i = 0; i &lt; ExitPositions.Length &amp;&amp; havePlaced == false; i++)
	{
		tryPlace = Location + (ExitPositions[i] &gt;&gt; Rotation);
	
		if(Trace(HitLocation, HitNormal, tryPlace, Location, false) != None)
			continue;
			
		if(!Driver.SetLocation(tryPlace))
			continue;
	
		havePlaced = true;
	}

	if(!havePlaced &amp;&amp; !bForceLeave)
	{
		Driver.bCollideWorld = false;
		return false;
	}

	Driver.PlayWaiting();
	Driver.bPhysicsAnimUpdate = Driver.Default.bPhysicsAnimUpdate;
	Driver.SetBase(None);
	Driver.Acceleration = vect(0, 0, 24000);

	if(Driver.TouchingWaterVolume())
		Driver.SetPhysics(PHYS_Swimming);
	else
		Driver.SetPhysics(PHYS_Falling);

	Driver.Controller.Restart();
	LawDogsPlayer(Driver.Controller).Vehicle = None;
	ClientKDriverLeave(PlayerController(Driver.Controller));

	Driver = None;
	RepDriver = None;
	SetOwner(None);

	Throttle=0;
	Steering=0;

	return true;
}

function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class&lt;DamageType&gt; damageType)
{
	Health -= Damage;

	if(Health &lt;= 0)
	{
		//Make sure driver leaves when vehicle is destroyed.
		if(Driver != None)
			KDriverLeave(true);

		Destroy();
	}
}

simulated function Tick(float DeltaTime)
{
	local rotator DriverRot;

	if(RepDriver != None)
	{
		//So taking damage doesn't make the driver start falling.
		if(RepDriver.Physics != PHYS_None)
			RepDriver.SetPhysics(PHYS_None);

		//Make very sure the driver stays still.
		RepDriver.SetRelativeLocation(DrivePos);
		DriverRot.Yaw = RepDriver.RelativeRotation.Yaw;
		RepDriver.SetRelativeRotation(DriverRot);
	}
}

//Allow camera to rotate relative to the vehicle, within limits.
simulated function bool SpecialCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation)
{
	if(RepDriver == None || RepDriver.Controller == None)
		return false;

	ViewActor = RepDriver;

	if(CameraRotation.Yaw ClockwiseFrom (Rotation.Yaw + MaxYaw))
		CameraRotation.Yaw = Rotation.Yaw + MaxYaw;
	else if(!(CameraRotation.Yaw ClockwiseFrom (Rotation.Yaw + MinYaw)))
		CameraRotation.Yaw = Rotation.Yaw + MinYaw;

	CameraRotation = normalize(CameraRotation);
	RepDriver.SetTwistLook(normalize(CameraRotation - Rotation).Yaw, CameraRotation.Pitch);

	RepDriver.Controller.SetRotation(CameraRotation);
	CameraLocation = RepDriver.Location + RepDriver.EyePosition();

	if(PlayerController(RepDriver.Controller).bBehindView)
		CameraLocation += BehindViewOffset &gt;&gt; Rotation;

	return true;
}
&lt;/uscript&gt;

And the new stuff for the PlayerController class:

&lt;uscript&gt;
class LawDogsPlayer extends xPlayer
	config(user);

var KVehicle Vehicle;

replication
{
	reliable if(Role == ROLE_Authority)
		Vehicle;
}

//Fix dying whilst controling a vehicle.
function WasKilledBy(Controller Other)
{
	if(Vehicle != None)
		Vehicle.KDriverLeave(true);

	Super.WasKilledBy(Other);
}

//Allow vehicle to handle camera.
event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation)
{
	if(Vehicle != None &amp;&amp; Vehicle.bSpecialCalcView &amp;&amp; Vehicle.SpecialCalcView(ViewActor, CameraLocation, CameraRotation))
		return;

	Super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation);
}

//Using a LawDogsVehicle.
state PlayerRiding
{
ignores SeePlayer, HearNoise, Bump;

	function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot){}

	//Pressing 'use' will exit vehicle (to free up the jump key for other purposes).
	function ServerUse()
	{
		if(Level.Pauser == PlayerReplicationInfo)
		{
			SetPause(false);
			return;
		}

		if(Pawn == None)
			return;

		if(Vehicle != None)
			Vehicle.bGetOut = true;
	}

	exec function Fire(optional float F)
	{
		if(Vehicle != None)
		{
			Vehicle.VehicleFire(false);
			Vehicle.bVehicleIsFiring = true;
		}
	}

	exec function AltFire(optional float F)
	{
		if(Vehicle != None)
		{
			Vehicle.VehicleFire(true);
			Vehicle.bVehicleIsAltFiring = true;
		}
	}

	// Set the throttle, steering etc. for the vehicle based on the input provided
	function ProcessDrive(float InForward, float InStrafe, bool InJump)
	{
		if(Vehicle == None)
		{
			log(&quot;PlayerRiding.PlayerMove: No Vehicle&quot;);
			return;
		}

		//Horses can jump.
		if(bPressedJump)
		{
			Vehicle.DoJump(bUpdating);
			bPressedJump = false;
		}

		if(InForward &gt; 1)
			Vehicle.Throttle = 1;
		else if(InForward &lt; -1)
			Vehicle.Throttle = -1;
		else
			Vehicle.Throttle = 0;

		if(InStrafe &lt; -1)
			Vehicle.Steering = -1;
		else if(InStrafe &gt; 1)
			Vehicle.Steering = 1;
		else
			Vehicle.Steering = 0;
	}

	function PlayerMove(float DeltaTime)
	{
		//Only servers can actually do the driving logic.
		if(Role &lt; ROLE_Authority)
			ServerDrive(aForward, aStrafe, bPressedJump);
		else
			ProcessDrive(aForward, aStrafe, bPressedJump);

		if(Vehicle != None)
		{
			if(bFire == 0 &amp;&amp; Vehicle.bVehicleIsFiring)
			{
				Vehicle.VehicleCeaseFire(false);
				Vehicle.bVehicleIsFiring = false;
			}

			if(bAltFire == 0 &amp;&amp; Vehicle.bVehicleIsAltFiring)
			{
				Vehicle.VehicleCeaseFire(true);
				Vehicle.bVehicleIsAltFiring = false;
			}
		}

		//update 'looking' rotation - no affect on driving
		UpdateRotation(DeltaTime, 2);
	}

	function BeginState()
	{
		CleanOutSavedMoves();
	}

	function EndState()
	{
		CleanOutSavedMoves();
	}
}
&lt;/uscript&gt;

One thing that you may find necessary but which is not shown here is that to stop a player from firing their own weapons, you need to give them a non-functional dummy weapon whilst they are in control of the vehicle.

Another potential problem is that the player's pawn can encroach on other pawns whilst it is attached to the vehicle, telefragging them instantly. This needs to be fixed in the EncroachedBy function in the pawn.

'''Foxpaw:''' From what I've heard, this is already part of the vehicle code for UT2004. But I haven't played UT2004 so I can't say that with certainty.

'''Mr Evil:''' That's what I've heard too, but I wanted it now, so I did it.
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1495</id>
      <timestamp>2006-04-07T07:49:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This code has arisen from the need to have a vehicle where the player can still be seen and shot whilst in control of a vehicle (for the artillery and horses in the LawDogs mod). Instead of the player's original [[Legacy:Pawn|Pawn]] being hidden and the vehicle possessed, the original pawn is attached to the vehicle and the vehicle controlled indirectly.

This has the advantage not only of being able to kill the player without damaging the vehicle and vice versa, but also it allows the player to potentially fire their normal weapons whilst on the vehicle.

The code shown here has only the code relevant to this control method present; It is a long way from a complete vehicle. There is no bot support.

First the vehicle class:

&lt;uscript&gt;
class LawDogsVehicle extends KVehicle
	abstract;

var Pawn RepDriver; //Replicated 'Driver'.

replication
{
	reliable if(Role == ROLE_Authority)
		RepDriver;
}

simulated function ClientKDriverEnter(PlayerController pc)
{
	PlayerController(RepDriver.Controller).bBehindView = bUseBehindView;
}

function KDriverEnter(Pawn p)
{
	Driver = p;
	RepDriver = Driver;

	Driver.bCollideWorld = false;
	Driver.bPhysicsAnimUpdate = false;
	Driver.Velocity = vect(0,0,0);
	Driver.SetPhysics(PHYS_None);

	Driver.SetBase(self);
	Driver.SetRelativeLocation(DrivePos);
	Driver.SetRelativeRotation(rot(0, 0, 0));

	LawDogsPlayer(Driver.Controller).Vehicle = self;
	LawDogsPlayer(Driver.Controller).GotoState('PlayerRiding');
	SetOwner(Driver.Controller);

	ClientKDriverEnter(PlayerController(Driver.Controller));
}

simulated function ClientKDriverLeave(PlayerController pc)
{
	pc.bBehindView = pc.Default.bBehindView;
}

function bool KDriverLeave(bool bForceLeave)
{
	local int i;
	local bool havePlaced;
	local vector HitLocation, HitNormal, tryPlace;

	if(Driver == None)
		return false;

	Driver.bCollideWorld = true;

	for(i = 0; i &lt; ExitPositions.Length &amp;&amp; havePlaced == false; i++)
	{
		tryPlace = Location + (ExitPositions[i] &gt;&gt; Rotation);
	
		if(Trace(HitLocation, HitNormal, tryPlace, Location, false) != None)
			continue;
			
		if(!Driver.SetLocation(tryPlace))
			continue;
	
		havePlaced = true;
	}

	if(!havePlaced &amp;&amp; !bForceLeave)
	{
		Driver.bCollideWorld = false;
		return false;
	}

	Driver.PlayWaiting();
	Driver.bPhysicsAnimUpdate = Driver.Default.bPhysicsAnimUpdate;
	Driver.SetBase(None);
	Driver.Acceleration = vect(0, 0, 24000);

	if(Driver.TouchingWaterVolume())
		Driver.SetPhysics(PHYS_Swimming);
	else
		Driver.SetPhysics(PHYS_Falling);

	Driver.Controller.Restart();
	LawDogsPlayer(Driver.Controller).Vehicle = None;
	ClientKDriverLeave(PlayerController(Driver.Controller));

	Driver = None;
	RepDriver = None;
	SetOwner(None);

	Throttle=0;
	Steering=0;

	return true;
}

function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class&lt;DamageType&gt; damageType)
{
	Health -= Damage;

	if(Health &lt;= 0)
	{
		//Make sure driver leaves when vehicle is destroyed.
		if(Driver != None)
			KDriverLeave(true);

		Destroy();
	}
}

simulated function Tick(float DeltaTime)
{
	local rotator DriverRot;

	if(RepDriver != None)
	{
		//So taking damage doesn't make the driver start falling.
		if(RepDriver.Physics != PHYS_None)
			RepDriver.SetPhysics(PHYS_None);

		//Make very sure the driver stays still.
		RepDriver.SetRelativeLocation(DrivePos);
		DriverRot.Yaw = RepDriver.RelativeRotation.Yaw;
		RepDriver.SetRelativeRotation(DriverRot);
	}
}

//Allow camera to rotate relative to the vehicle, within limits.
simulated function bool SpecialCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation)
{
	if(RepDriver == None || RepDriver.Controller == None)
		return false;

	ViewActor = RepDriver;

	if(CameraRotation.Yaw ClockwiseFrom (Rotation.Yaw + MaxYaw))
		CameraRotation.Yaw = Rotation.Yaw + MaxYaw;
	else if(!(CameraRotation.Yaw ClockwiseFrom (Rotation.Yaw + MinYaw)))
		CameraRotation.Yaw = Rotation.Yaw + MinYaw;

	CameraRotation = normalize(CameraRotation);
	RepDriver.SetTwistLook(normalize(CameraRotation - Rotation).Yaw, CameraRotation.Pitch);

	RepDriver.Controller.SetRotation(CameraRotation);
	CameraLocation = RepDriver.Location + RepDriver.EyePosition();

	if(PlayerController(RepDriver.Controller).bBehindView)
		CameraLocation += BehindViewOffset &gt;&gt; Rotation;

	return true;
}
&lt;/uscript&gt;

And the new stuff for the PlayerController class:

&lt;uscript&gt;
class LawDogsPlayer extends xPlayer
	config(user);

var KVehicle Vehicle;

replication
{
	reliable if(Role == ROLE_Authority)
		Vehicle;
}

//Fix dying whilst controling a vehicle.
function WasKilledBy(Controller Other)
{
	if(Vehicle != None)
		Vehicle.KDriverLeave(true);

	Super.WasKilledBy(Other);
}

//Allow vehicle to handle camera.
event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation)
{
	if(Vehicle != None &amp;&amp; Vehicle.bSpecialCalcView &amp;&amp; Vehicle.SpecialCalcView(ViewActor, CameraLocation, CameraRotation))
		return;

	Super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation);
}

//Using a LawDogsVehicle.
state PlayerRiding
{
ignores SeePlayer, HearNoise, Bump;

	function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot){}

	//Pressing 'use' will exit vehicle (to free up the jump key for other purposes).
	function ServerUse()
	{
		if(Level.Pauser == PlayerReplicationInfo)
		{
			SetPause(false);
			return;
		}

		if(Pawn == None)
			return;

		if(Vehicle != None)
			Vehicle.bGetOut = true;
	}

	exec function Fire(optional float F)
	{
		if(Vehicle != None)
		{
			Vehicle.VehicleFire(false);
			Vehicle.bVehicleIsFiring = true;
		}
	}

	exec function AltFire(optional float F)
	{
		if(Vehicle != None)
		{
			Vehicle.VehicleFire(true);
			Vehicle.bVehicleIsAltFiring = true;
		}
	}

	// Set the throttle, steering etc. for the vehicle based on the input provided
	function ProcessDrive(float InForward, float InStrafe, bool InJump)
	{
		if(Vehicle == None)
		{
			log(&quot;PlayerRiding.PlayerMove: No Vehicle&quot;);
			return;
		}

		//Horses can jump.
		if(bPressedJump)
		{
			Vehicle.DoJump(bUpdating);
			bPressedJump = false;
		}

		if(InForward &gt; 1)
			Vehicle.Throttle = 1;
		else if(InForward &lt; -1)
			Vehicle.Throttle = -1;
		else
			Vehicle.Throttle = 0;

		if(InStrafe &lt; -1)
			Vehicle.Steering = -1;
		else if(InStrafe &gt; 1)
			Vehicle.Steering = 1;
		else
			Vehicle.Steering = 0;
	}

	function PlayerMove(float DeltaTime)
	{
		//Only servers can actually do the driving logic.
		if(Role &lt; ROLE_Authority)
			ServerDrive(aForward, aStrafe, bPressedJump);
		else
			ProcessDrive(aForward, aStrafe, bPressedJump);

		if(Vehicle != None)
		{
			if(bFire == 0 &amp;&amp; Vehicle.bVehicleIsFiring)
			{
				Vehicle.VehicleCeaseFire(false);
				Vehicle.bVehicleIsFiring = false;
			}

			if(bAltFire == 0 &amp;&amp; Vehicle.bVehicleIsAltFiring)
			{
				Vehicle.VehicleCeaseFire(true);
				Vehicle.bVehicleIsAltFiring = false;
			}
		}

		//update 'looking' rotation - no affect on driving
		UpdateRotation(DeltaTime, 2);
	}

	function BeginState()
	{
		CleanOutSavedMoves();
	}

	function EndState()
	{
		CleanOutSavedMoves();
	}
}
&lt;/uscript&gt;

One thing that you may find necessary but which is not shown here is that to stop a player from firing their own weapons, you need to give them a non-functional dummy weapon whilst they are in control of the vehicle.

Another potential problem is that the player's pawn can encroach on other pawns whilst it is attached to the vehicle, telefragging them instantly. This needs to be fixed in the EncroachedBy function in the pawn.

'''Foxpaw:''' From what I've heard, this is already part of the vehicle code for UT2004. But I haven't played UT2004 so I can't say that with certainty.

'''Mr Evil:''' That's what I've heard too, but I wanted it now, so I did it.
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ambershee</title>
    <id>513</id>
    <revision>
      <id>1609</id>
      <timestamp>2008-01-15T17:01:58Z</timestamp>
      <contributor>
        <ip>Host217-41-111-12.in-addr.btopenworld.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Ambershee''', aka '''AmberZ''', '''Z0mG_Rockitz!!!1''' in UT2004.

My real name is Luke Parkes-Haskell, and I'm an Unreal Programmer currently located in London, UK. I have worked under my alias as a developer for several years, and you can find my now five year old mod group out there hiding on the interweb. Yes, we do also behave like five year olds.

When I'm not programming (a rarity!), I'm an ex-professional miniature painter, student of obscure martial arts, and more likely, down the pub.

==Experience==

* 3 Years C, C# and C++ programming experience, including software rendering and DirectX.
* Programmed in GML, LSL, UnrealScript, ActionScript and LUA
* Worked with GameBryo, Unreal Technology, iD Tech 3, and a few other middleware solutions
* Loudmouthed and opinionative.

==Unreal Projects==

I'm currently working on a number of Unreal 3 and programming tutorials, which you can visit here:

http://www.moddb.com/members/21982/ambershee/tutorials

I'm also working on a server / player customisation mutator called 'Server King', and an unannounced total conversion project 'Sonic Boom'.

==Related Links==

* [http://sheelabs.gamemod.net Shee Labs] &amp;ndash; my mod group.
* [http://www.moddb.com ModDB] &amp;ndash; I have wasted four years of my life frequenting this place on a regular basis.
* [http://www.derby.ac.uk Derby University] &amp;ndash; I studied here. They forced this UT2004 nonsense upon me, so blame them for my presence.
* [http://www.cityscape3d.com CityScape] - I work as a game programmer here.

===Talk to Me===

'''Ambershee:''' Ah, the almighty personal page arrives. I guess that means I'll be here for a while.

'''Tarquin:''' Hello! Sorry you've not had a welcome yet. Here it is, if a little late :)

'''Ambershee:''' Oh, hai! I've not been around much recently =]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1610</id>
      <timestamp>2008-01-15T09:49:06Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Ambershee''', aka '''AmberZ''', '''Z0mG_Rockitz!!!1''' in UT2004.

My real name is Luke Parkes-Haskell, and I'm an Unreal Programmer currently located in London, UK. I have worked under my alias as a developer for several years, and you can find my now five year old mod group out there hiding on the interweb. Yes, we do also behave like five year olds.

When I'm not programming (a rarity!), I'm an ex-professional miniature painter, student of obscure martial arts, and more likely, down the pub.

==Experience==

* 3 Years C, C# and C++ programming experience, including software rendering and DirectX.
* Programmed in GML, LSL, UnrealScript, ActionScript and LUA
* Worked with GameBryo, Unreal Technology, iD Tech 3, and a few other middleware solutions
* Loudmouthed and opinionative.

==Unreal Projects==

I'm currently working on a number of Unreal 3 and programming tutorials, which you can visit here:

http://www.moddb.com/members/21982/ambershee/tutorials

I'm also working on a server / player customisation mutator called 'Server King', and an unannounced total conversion project 'Sonic Boom'.

==Related Links==

* [http://sheelabs.gamemod.net Shee Labs] &amp;ndash; my mod group.
* [http://www.moddb.com ModDB] &amp;ndash; I have wasted four years of my life frequenting this place on a regular basis.
* [http://www.derby.ac.uk Derby University] &amp;ndash; I studied here. They forced this UT2004 nonsense upon me, so blame them for my presence.
* [http://www.cityscape3d.com CityScape] - I work as a game programmer here.

===Talk to Me===

'''Ambershee:''' Ah, the almighty personal page arrives. I guess that means I'll be here for a while.

'''Tarquin:''' Hello! Sorry you've not had a welcome yet. Here it is, if a little late :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AmbientSound</title>
    <id>342</id>
    <revision>
      <id>1196</id>
      <timestamp>2003-06-03T18:34:45Z</timestamp>
      <contributor>
        <ip>Inktomi1-cam.server.ntl.com</ip>
      </contributor>
      <comment>Added radii view note</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; AmbientSound (Package: Engine)}}

Used to create ambient sounds in a map.

See [[Legacy:AmbientSound (UT)|AmbientSound (UT)]] for the UT version of this class.

==Properties ==

===Sound Group ===
; Array&lt;SoundEmitter&gt; SoundEmitters : A list of sound emitters. Sound will trigger every EmitInterval (+/- a value up to EmitVariance) seconds. (See SoundEmitter struct below.)

===Hidden ===
; float AmbientVolume (globalconfig) : Ambient volume multiplier. (scaling)

==Structs ==

===SoundEmitter ===
; float EmitInterval : The delay between each time the sound is played in seconds.
; [[Legacy:Sound|Sound]] EmitSound : The sound to be played.
; float EmitVariance : Amount of seconds the delay may vary, so people won't set their alarmclock on it. ;)
; float EmitTime (hidden in UnrealEd, transient) : 

==Quick Tutorial ==

Taken from the [[Legacy:AmbientSound (UT)|AmbientSound (UT)]] page; this still applies for a simple looping sound:

#Under your actor class, select Keypoint -&gt; AmbientSound
#Add it to your level where you want the sound to originate from.
#You can edit the radius and volume in the [[Legacy:Actor Properties Window|Actor Properties Window]].
#In the [[Legacy:Sound Browser|sound browser]], load a sound file of your choosing...
#Select the sound you wish to use. Then expand the Sound group of the actor's properties, click on the AmbientSound property and click the &quot;use&quot; button. The name of your chosen sound should appear in the property box.
#Activate [[Legacy:Realtime Preview|realtime preview]] in a 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] to hear it. This helps in getting the right radius, pitch and volume for your effect.

----

Note that any actor can be made to emit sound by setting these properties. The SoundEmitters property, however, is specific to the AmbientSound class. &lt;br /&gt;The SoundEmitters property is used to play a sound every few seconds. Simply expand the Sound -&gt; SoundEmitters property and click the &quot;add&quot; button to add an emitter. You can then set the EmitInterval, EmitSound and EmitVariance properties for the new emitter as described above. &lt;br /&gt;Multiple emitters can be set to a single AmbientSound this way. However, you will have to create a seperate AmbientSound actor if you want a new emitter to originate from a different source.

----

'''G-LiTe:''' The radius indicator from the old Ued seems to have vanished in UT2003.. I could be wrong, though I can't find it anywhere. Also, does anyone know how to set the volume on an AmbientSound using the SoundEmitters property? It's just uberloud and sounds really bad.

'''Wormbo:''' You'll probably have to use the [[Legacy:Actor/Sound|Actor/Sound]] -&gt; SoundRadius/Volume/Pitch properties for that.

'''CTZ:''' You can view the radii of the AmbientSound actors by right clicking a viewport name, then Actors -&gt; Radii View.  The outer radius is shown by a red line, the occlusion volume is shown by a small cyan cylinder (which is a little confusing I think).

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1197</id>
      <timestamp>2003-05-23T07:47:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; AmbientSound (Package: Engine)}}

Used to create ambient sounds in a map.

See [[Legacy:AmbientSound (UT)|AmbientSound (UT)]] for the UT version of this class.

==Properties ==

===Sound Group ===
; Array&lt;SoundEmitter&gt; SoundEmitters : A list of sound emitters. Sound will trigger every EmitInterval (+/- a value up to EmitVariance) seconds. (See SoundEmitter struct below.)

===Hidden ===
; float AmbientVolume (globalconfig) : Ambient volume multiplier. (scaling)

==Structs ==

===SoundEmitter ===
; float EmitInterval : The delay between each time the sound is played in seconds.
; [[Legacy:Sound|Sound]] EmitSound : The sound to be played.
; float EmitVariance : Amount of seconds the delay may vary, so people won't set their alarmclock on it. ;)
; float EmitTime (hidden in UnrealEd, transient) : 

==Quick Tutorial ==

Taken from the [[Legacy:AmbientSound (UT)|AmbientSound (UT)]] page; this still applies for a simple looping sound:

#Under your actor class, select Keypoint -&gt; AmbientSound
#Add it to your level where you want the sound to originate from.
#You can edit the radius and volume in the [[Legacy:Actor Properties Window|Actor Properties Window]].
#In the [[Legacy:Sound Browser|sound browser]], load a sound file of your choosing...
#Select the sound you wish to use. Then expand the Sound group of the actor's properties, click on the AmbientSound property and click the &quot;use&quot; button. The name of your chosen sound should appear in the property box.
#Activate [[Legacy:Realtime Preview|realtime preview]] in a 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] to hear it. This helps in getting the right radius, pitch and volume for your effect.

----

Note that any actor can be made to emit sound by setting these properties. The SoundEmitters property, however, is specific to the AmbientSound class. &lt;br /&gt;The SoundEmitters property is used to play a sound every few seconds. Simply expand the Sound -&gt; SoundEmitters property and click the &quot;add&quot; button to add an emitter. You can then set the EmitInterval, EmitSound and EmitVariance properties for the new emitter as described above. &lt;br /&gt;Multiple emitters can be set to a single AmbientSound this way. However, you will have to create a seperate AmbientSound actor if you want a new emitter to originate from a different source.

----

'''G-LiTe:''' The radius indicator from the old Ued seems to have vanished in UT2003.. I could be wrong, though I can't find it anywhere. Also, does anyone know how to set the volume on an AmbientSound using the SoundEmitters property? It's just uberloud and sounds really bad.

'''Wormbo:''' You'll probably have to use the [[Legacy:Actor/Sound|Actor/Sound]] -&gt; SoundRadius/Volume/Pitch properties for that.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AmbientSound (UT)</title>
    <id>405</id>
    <revision>
      <id>1347</id>
      <timestamp>2003-05-23T07:48:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; AmbientSound (Package: Engine)}}

See [[Legacy:AmbientSound|AmbientSound]] for the UT2003 version of this class.

#Under your actor class, select Keypoint -&gt; AmbientSound
#Add it to your level where you want the sound to originate from.
#You can edit the radius and volume in the [[Legacy:Actor Properties Window|Actor Properties Window]].
#In the [[Legacy:Sound Browser|sound browser]], load a sound file of your choosing...
#Select the sound you wish to use. Then expand the Sound group of the actor's properties, click on the AmbientSound property and click the &quot;use&quot; button. The name of your chosen sound should appear in the property box.
#Activate [[Legacy:Realtime Preview|realtime preview]] in a 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] to hear it. This helps in getting the right radius, pitch and volume for your effect.

You can see the radius of the sound as a blue circle in any [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] that is set to show Actor radii, although it's only a rough indication because the volume seting also affects how far the sound is heard.

Note that any actor can be made to emit sound by setting the same properties.

See also the [[Legacy:Dynamics|Dynamics]] main topic page.

==Related Topics ==
* [[Legacy:Sounds|Sounds]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1348</id>
      <timestamp>2003-01-02T21:08:56Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <comment>AmbientSound move and some minor fixes</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; AmbientSound (UT)}}

#Under your actor class, select Keypoint -&gt; AmbientSound
#Add it to your level where you want the sound to originate from.
#You can edit the radius and volume in the [[Legacy:Actor Properties Window|Actor Properties Window]].
#In the [[Legacy:Sound Browser|sound browser]], load a sound file of your choosing...
#Select the sound you wish to use. Then expand the Sound group of the actor's properties, click on the AmbientSound property and click the &quot;use&quot; button. The name of your chosen sound should appear in the property box.
#Activate [[Legacy:Realtime Preview|realtime preview]] in a 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] to hear it. This helps in getting the right radius, pitch and volume for your effect.

You can see the radius of the sound as a blue circle in any [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] that is set to show Actor radii, although it's only a rough indication because the volume seting also affects how far the sound is heard.

Note that any actor can be made to emit sound by setting the same properties.

See also the [[Legacy:Dynamics|Dynamics]] main topic page.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AmbushPoint</title>
    <id>370</id>
    <revision>
      <id>1260</id>
      <timestamp>2006-01-28T01:53:29Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AmbushPoint (Package: Engine)}}

An AmbushPoint is a [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] upon which a [[Legacy:Bot (UT)|Bot (UT)]] will stop. Whether a bot stops will depend on how healthy it is, if it is alone, and how high the camping attribute of the bot is set. The AmbushPoint is directional, meaning when you select it in the editor it will have an arrow. When the bot is using the ambush, this is the direction it will face.

: does this need to have OwnerTeam set?

AmbushPoints, especially when set up for sniping, work very well in conjunction with [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]s.

See [[Legacy:Strategic Bots|Strategic Bots]] for tips &amp; tricks on using this actor.

==Properties==
; bool bSniping : If set to true, the bot will stay at the AmbushPoint and attack from it. If false, the bot will chase and attack anyone it sights from the AmbushPoint.
; float SightRadius : This is how far the bot will look for an enemy from the ambush point.

==Known Subclasses==
* [[Legacy:DefensePoint|DefensePoint]] &amp;ndash; for teamgames

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:HomeBase|HomeBase]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1261</id>
      <timestamp>2002-07-16T13:24:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>See [[Strategic Bots]]</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; AmbushPoint}}

An AmbushPoint is a [[Legacy:NavigationPoint|NavigationPoint]] upon which a [[Legacy:Bot (UT)|Bot (UT)]] will stop. Whether a bot stops will depend on how healthy it is, if it is alone, and how high the camping attribute of the bot is set. The AmbushPoint is directional, meaning when you select it in the editor it will have an arrow. When the bot is using the ambush, this is the direction it will face.

: does this need to have OwnerTeam set?

AmbushPoints, especially when set up for sniping, work very well in conjunction with [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]s.

See [[Legacy:Strategic Bots|Strategic Bots]] for tips &amp; tricks on using this actor.

==Properties ==

; bSniping : If set to true, the bot will stay at the AmbushPoint and attack from it. If false, the bot will chase and attack anyone it sights from the AmbushPoint.

; SightRadius : This is how far the bot will look for an enemy from the ambush point.

==Known Subclasses ==
* [[Legacy:DefensePoint|DefensePoint]] &amp;ndash; for teamgames</text>
    </revision>
    <revision>
      <id>1262</id>
      <timestamp>2003-05-23T16:06:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AmbushPoint (Package: Engine)}}

An AmbushPoint is a [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] upon which a [[Legacy:Bot (UT)|Bot (UT)]] will stop. Whether a bot stops will depend on how healthy it is, if it is alone, and how high the camping attribute of the bot is set. The AmbushPoint is directional, meaning when you select it in the editor it will have an arrow. When the bot is using the ambush, this is the direction it will face.

: does this need to have OwnerTeam set?

AmbushPoints, especially when set up for sniping, work very well in conjunction with [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]s.

See [[Legacy:Strategic Bots|Strategic Bots]] for tips &amp; tricks on using this actor.

==Properties ==

; bool bSniping : If set to true, the bot will stay at the AmbushPoint and attack from it. If false, the bot will chase and attack anyone it sights from the AmbushPoint.

; float SightRadius : This is how far the bot will look for an enemy from the ambush point.

==Known Subclasses ==
* [[Legacy:DefensePoint|DefensePoint]] &amp;ndash; for teamgames

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ammo</title>
    <id>435</id>
    <revision>
      <id>1458</id>
      <timestamp>2005-01-14T00:10:15Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>reverted - Anyone at all? Could use some help with this.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]]  &gt;&gt; Ammo (Package: Engine)}}

The parent class for all Ammo Pickup.

{{innerbox| For state behavoir of this item refer to the parent class [[Legacy:Pickup|Pickup]].

}}

==Properties ==

;int AmmoAmount : The amount of ammo contained in the ammo pickup.

==Methods==

===Inherited From [[Legacy:Pickup|Pickup]]===
; float BotDesireability ([[Legacy:Pawn|Pawn]] Bot) : This determines the AI for desireability of the item.  If the [[Legacy:Pawn|Pawn]] doesn't have the weapon it does not desire this weapon.  If it has the weapon it then determines its desire from the ''MaxDesirability'' divided by the ''PathWeight''.

; float DetourWeight ([[Legacy:Pawn|Pawn]] Other, float PathWeight) : If the bot is hunting a player or has max ammo the desireability is very low.  If the bot doesn't have the weapon then it wants the ammo at 35% of the ''MaxDesirability''.  If it has the weapon and no ammo then the bot desires it at ''MaxDesirability''.

; [[Legacy:Inventory|Inventory]] SpawnCopy ([[Legacy:Pawn|Pawn]] Other) : Calls the [[Legacy:Pickup|Pickup]] ''SpawnCopy'' but simply appends the ''AmmoAmount'' to the Ammo pickup that was copied.

==Strange Bug==

If your grid is higher than 16 sometimes you can not place certain ammo types. It's weird, this may also happen with all [[Legacy:Pickup|Pickup]]s but I haven't tested it.

'''Legal:''' This is probably not a bug. It's the actor placed always positions itself to the closest grid reference point available. Rather obviously, you can't place weapons in the middle of nowhere, hence it's not placed at all.

Then again, I don't know the exact circumstances.

==Known Subclasses==
 +-Ammo
    +-[[Legacy:UTAmmoPickup|UTAmmoPickup]]
       +-[[Legacy:AssaultAmmoPickup|AssaultAmmoPickup]]
       +-[[Legacy:BioAmmoPickup|BioAmmoPickup]]
       +-[[Legacy:FlakAmmoPickup|FlakAmmoPickup]]
       +-[[Legacy:LinkAmmoPickup|LinkAmmoPickup]]
       +-[[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]
       +-[[Legacy:RocketAmmoPickup|RocketAmmoPickup]]
       +-[[Legacy:ShockAmmoPickup|ShockAmmoPickup]]
       +-[[Legacy:SniperAmmoPickup|SniperAmmoPickup]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1459</id>
      <timestamp>2005-01-13T23:20:25Z</timestamp>
      <contributor>
        <ip>Lepam03.pamlico.k12.nc.us</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ammo (DX)</title>
    <id>455</id>
    <revision>
      <id>1499</id>
      <timestamp>2004-02-10T05:08:12Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Inventory (DX)|Inventory (DX)]] &gt;&gt; [[Legacy:Pickup (DX)|Pickup (DX)]] &gt;&gt; Ammo (Engine)}}

==Changes ==
* DX doesn't have the UT class flags: native, native replication
* several replication properties differ

==Functions ==
; bool HandlePickupQuery( inventory Item ): Different in DX
; bool SimUseAmmo( ): New in DX

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1500</id>
      <timestamp>2004-02-05T13:17:47Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:Ammo (DX)|Ammo (DX)]]}}

==Changes ==
* DX doesn't have the UT class flags: native, native replication
* several replication properties differ

==Functions ==
; bool HandlePickupQuery( inventory Item ): Different in DX
; bool SimUseAmmo( ): New in DX</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ammo (UT)</title>
    <id>422</id>
    <revision>
      <id>1424</id>
      <timestamp>2006-02-20T17:46:51Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; Ammo (Package: Engine)}}

Parent class of ammunition types for [[Legacy:Weapon (UT)|Weapon (UT)]]s.  Child class [[Legacy:TournamentAmmo|TournamentAmmo]] corresponds with [[Legacy:TournamentWeapon|TournamentWeapon]] (UT) weapons.

One does not actually posess a quantity of Ammo inventory items.  Rather, an Ammo item is a placeholder which indicates how much of the corresponding ammunition type the player may expend.

==Properties==

;int AmmoAmount (travel, replicated to owning client) : In inventory, the amount of ammunition of this type the player may expend.  For a pickup, amount of ammunition to be added to an inventory copy of the ammotype's AmmoAmount.

;int MaxAmmo (travel) : Maximum amount AmmoAmount may reach in a player's inventory.

;class&lt;Ammo&gt; ParentAmmo : Parent class of Ammotype.  Some ammotypes are smaller, child classes of other types, only different in, say, the size of AmmoAmount.  Providing a link to a parent class prevents the child ammo from being added to a player's inventory separately from its parent.

;byte UsedInWeaponSlot[10] : For display purposes AFAIK.  Position in the HUD Ammo and AmmoAmount should be displayed in.

;Ammo PAmmo : ???Original implementation of ParentAmmo???

==Methods==

===Inherited from [[Legacy:Inventory (UT)|Inventory (UT)]]===
; float BotDesireability ([[Legacy:Pawn (UT)|Pawn (UT)]] Bot) : 

==Known subclasses==
* [[Legacy:ASMDAmmo|ASMDAmmo]]
* [[Legacy:FlakBox|FlakBox]]
* [[Legacy:NullAmmo|NullAmmo]]
* [[Legacy:RazorAmmo|RazorAmmo]]
* [[Legacy:RifleAmmo|RifleAmmo]]
* [[Legacy:RocketCan|RocketCan]]
* [[Legacy:ShellBox|ShellBox]]
* [[Legacy:Shells|Shells]]
* [[Legacy:Sludge|Sludge]]
* [[Legacy:StingerAmmo|StingerAmmo]]
* [[Legacy:TournamentAmmo|TournamentAmmo]]

==Discussion==

----

'''Csimbi''': How can I change the starting ammo, the maximum ammo, and the pickup ammo settings dynamically (default properties are static)?

The following code adjust starting ammo and maximum ammo correctly, but how can I adjust the amount of ammo that is added when player picks up some ammo?

&lt;uscript&gt;
function GiveWeapon(pawn P, string ThisClass)
{
	local class&lt;weapon&gt; WeaponClass;
	local weapon NewWeapon;

	if (ThisClass==&quot;none&quot;) return;

	WeaponClass = class&lt;weapon&gt;(DynamicLoadObject(ThisClass, class'Class') );
	if (WeaponClass==none||P.FindInventoryType(WeaponClass)!=none) return;

	WeaponClass.default.ItemArticle=MyArticle;
	NewWeapon=Spawn(WeaponClass);
	WeaponClass.default.ItemArticle=NormalArticle;
	NewWeapon.RespawnTime=0.0;
	NewWeapon.GiveTo(P);
	NewWeapon.bHeldItem=true;
	NewWeapon.GiveAmmo(P);
	NewWeapon.SetSwitchPriority(P);
	NewWeapon.WeaponSet(P);
	NewWeapon.AmbientGlow = 0;

	if (P.IsA('PlayerPawn')) NewWeapon.SetHand(PlayerPawn(P).Handedness);
	else NewWeapon.GotoState('Idle');
	P.Weapon.GotoState('DownWeapon');
	P.PendingWeapon=none;
	if(ThisClass==MyWeapon &amp;&amp; NewWeapon!=none)
	{
		NewWeapon.AmmoType.AmmoAmount=class'OptionsPage'.default.InitialAmmo;
		NewWeapon.AmmoType.MaxAmmo=class'OptionsPage'.default.MaxAmmo;
	}
}
&lt;/uscript&gt;

An example would be nice... Thank You.

'''Wormbo:''' You can use one of the various HandlePickupQuery() functions ([[Legacy:Inventory (UT)|Inventory (UT)]], [[Legacy:Mutator (UT)|Mutator (UT)]], etc.) to handle any type of pickup, but could you please put your questions where people can actually find them? The [[Legacy:Help Desk|Help Desk]] would be a  good place, or a coding forum (e.g. [http://forums.beyondunreal.com/forumdisplay.php?f=101 BUF Coding]).

'''Ticklemonster:''' Open the weapon's uc file, browse down to default properties, and look at this line:

&lt;uscript&gt;
     PickupAmmoCount=8
&lt;/uscript&gt;

Change the count to say 99.

Then, look for the weapon's ammo, let's say it's AmmoName=Class'botpack.BulletBox', to go open that uc file, and change it to look like this:

&lt;uscript&gt;
class BulletBox99 extends TournamentAmmo;

defaultproperties
{
     AmmoAmount=10
     MaxAmmo=99
     UsedInWeaponSlot(9)=1
     PickupMessage=&quot;You got a box of rifle rounds.&quot;
     ItemName=&quot;Box of Rifle Rounds&quot;
     PickupViewMesh=LodMesh'Botpack.BulletBoxM'
     MaxDesireability=0.240000
     Icon=Texture'UnrealI.Icons.I_RIFLEAmmo'
     Physics=PHYS_Falling
     Skin=Texture'Botpack.Skins.BulletBoxT'
     Mesh=LodMesh'Botpack.BulletBoxM'
     CollisionRadius=15.000000
     CollisionHeight=10.000000
     bCollideActors=True
}
&lt;/uscript&gt;

Of course you want to put them in their own class of their own named directory. Say it's a sniper rifle, save the assualtrifle.uc as assualtrifle99.uc and save the bulletbox as bulletbox99.uc. If they are in \AssaultRifle99\Classes, then you will have an AssaultRifle99.u that you can use. You'd want to make a mutator, I guess to make it want to work. 

Does that help?

'''Unknown:''' (hey Ma, look! I posted on Wiki.beyondunreal!!! Now if I could get someone to tell me how to make a flakslug act like a regular sniper bullet, then make that the primary fire on the flak cannon, I'd be all set... hint hint Mr. Wormbo)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1425</id>
      <timestamp>2003-12-17T15:22:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; Ammo (Package: Engine)}}

Parent class of ammunition types for [[Legacy:Weapon (UT)|Weapon (UT)]]s.  Child class [[Legacy:TournamentAmmo|TournamentAmmo]] corresponds with [[Legacy:TournamentWeapon|TournamentWeapon]] (UT) weapons.

One does not actually posess a quantity of Ammo inventory items.  Rather, an Ammo item is a placeholder which indicates how much of the corresponding ammunition type the player may expend.

==Properties==

;int AmmoAmount (travel, replicated to owning client) : In inventory, the amount of ammunition of this type the player may expend.  For a pickup, amount of ammunition to be added to an inventory copy of the ammotype's AmmoAmount.

;int MaxAmmo (travel) : Maximum amount AmmoAmount may reach in a player's inventory.

;class&lt;Ammo&gt; ParentAmmo : Parent class of Ammotype.  Some ammotypes are smaller, child classes of other types, only different in, say, the size of AmmoAmount.  Providing a link to a parent class prevents the child ammo from being added to a player's inventory separately from its parent.

;byte UsedInWeaponSlot[10] : For display purposes AFAIK.  Position in the HUD Ammo and AmmoAmount should be displayed in.

;Ammo PAmmo : ???Original implementation of ParentAmmo???

==Methods==

===Inherited from [[Legacy:Inventory (UT)|Inventory (UT)]]===
; float BotDesireability ([[Legacy:Pawn (UT)|Pawn (UT)]] Bot) : 

==Known subclasses==
* [[Legacy:ASMDAmmo|ASMDAmmo]]
* [[Legacy:FlakBox|FlakBox]]
* [[Legacy:NullAmmo|NullAmmo]]
* [[Legacy:RazorAmmo|RazorAmmo]]
* [[Legacy:RifleAmmo|RifleAmmo]]
* [[Legacy:RocketCan|RocketCan]]
* [[Legacy:ShellBox|ShellBox]]
* [[Legacy:Shells|Shells]]
* [[Legacy:Sludge|Sludge]]
* [[Legacy:StingerAmmo|StingerAmmo]]
* [[Legacy:TournamentAmmo|TournamentAmmo]]

----

[[:Category:Legacy Class (UT)]]

----

'''Csimbi''': How can I change the starting ammo, the maximum ammo, and the pickup ammo settings dynamically (default properties are static)?

The following code adjust starting ammo and maximum ammo correctly, but how can I adjust the amount of ammo that is added when player picks up some ammo?

&lt;uscript&gt;
function GiveWeapon(pawn P, string ThisClass)
{
	local class&lt;weapon&gt; WeaponClass;
	local weapon NewWeapon;

	if (ThisClass==&quot;none&quot;) return;

	WeaponClass = class&lt;weapon&gt;(DynamicLoadObject(ThisClass, class'Class') );
	if (WeaponClass==none||P.FindInventoryType(WeaponClass)!=none) return;

	WeaponClass.default.ItemArticle=MyArticle;
	NewWeapon=Spawn(WeaponClass);
	WeaponClass.default.ItemArticle=NormalArticle;
	NewWeapon.RespawnTime=0.0;
	NewWeapon.GiveTo(P);
	NewWeapon.bHeldItem=true;
	NewWeapon.GiveAmmo(P);
	NewWeapon.SetSwitchPriority(P);
	NewWeapon.WeaponSet(P);
	NewWeapon.AmbientGlow = 0;

	if (P.IsA('PlayerPawn')) NewWeapon.SetHand(PlayerPawn(P).Handedness);
	else NewWeapon.GotoState('Idle');
	P.Weapon.GotoState('DownWeapon');
	P.PendingWeapon=none;
	if(ThisClass==MyWeapon &amp;&amp; NewWeapon!=none)
	{
		NewWeapon.AmmoType.AmmoAmount=class'OptionsPage'.default.InitialAmmo;
		NewWeapon.AmmoType.MaxAmmo=class'OptionsPage'.default.MaxAmmo;
	}
}
&lt;/uscript&gt;

An example would be nice... Thank You.

'''Wormbo:''' You can use one of the various HandlePickupQuery() functions ([[Legacy:Inventory (UT)|Inventory (UT)]], [[Legacy:Mutator (UT)|Mutator (UT)]], etc.) to handle any type of pickup, but could you please put your questions where people can actually find them? The [[Legacy:Help Desk|Help Desk]] would be a  good place, or a coding forum (e.g. [http://forums.beyondunreal.com/forumdisplay.php?f=101 BUF Coding]).
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1426</id>
      <timestamp>2005-04-01T04:24:44Z</timestamp>
      <contributor>
        <ip>Ticklemonster</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; Ammo (Package: Engine)}}

Parent class of ammunition types for [[Legacy:Weapon (UT)|Weapon (UT)]]s.  Child class [[Legacy:TournamentAmmo|TournamentAmmo]] corresponds with [[Legacy:TournamentWeapon|TournamentWeapon]] (UT) weapons.

One does not actually posess a quantity of Ammo inventory items.  Rather, an Ammo item is a placeholder which indicates how much of the corresponding ammunition type the player may expend.

==Properties==

;int AmmoAmount (travel, replicated to owning client) : In inventory, the amount of ammunition of this type the player may expend.  For a pickup, amount of ammunition to be added to an inventory copy of the ammotype's AmmoAmount.

;int MaxAmmo (travel) : Maximum amount AmmoAmount may reach in a player's inventory.

;class&lt;Ammo&gt; ParentAmmo : Parent class of Ammotype.  Some ammotypes are smaller, child classes of other types, only different in, say, the size of AmmoAmount.  Providing a link to a parent class prevents the child ammo from being added to a player's inventory separately from its parent.

;byte UsedInWeaponSlot[10] : For display purposes AFAIK.  Position in the HUD Ammo and AmmoAmount should be displayed in.

;Ammo PAmmo : ???Original implementation of ParentAmmo???

==Methods==

===Inherited from [[Legacy:Inventory (UT)|Inventory (UT)]]===
; float BotDesireability ([[Legacy:Pawn (UT)|Pawn (UT)]] Bot) : 

==Known subclasses==
* [[Legacy:ASMDAmmo|ASMDAmmo]]
* [[Legacy:FlakBox|FlakBox]]
* [[Legacy:NullAmmo|NullAmmo]]
* [[Legacy:RazorAmmo|RazorAmmo]]
* [[Legacy:RifleAmmo|RifleAmmo]]
* [[Legacy:RocketCan|RocketCan]]
* [[Legacy:ShellBox|ShellBox]]
* [[Legacy:Shells|Shells]]
* [[Legacy:Sludge|Sludge]]
* [[Legacy:StingerAmmo|StingerAmmo]]
* [[Legacy:TournamentAmmo|TournamentAmmo]]

----

[[:Category:Legacy Class (UT)]]

----

'''Csimbi''': How can I change the starting ammo, the maximum ammo, and the pickup ammo settings dynamically (default properties are static)?

The following code adjust starting ammo and maximum ammo correctly, but how can I adjust the amount of ammo that is added when player picks up some ammo?

&lt;uscript&gt;
function GiveWeapon(pawn P, string ThisClass)
{
	local class&lt;weapon&gt; WeaponClass;
	local weapon NewWeapon;

	if (ThisClass==&quot;none&quot;) return;

	WeaponClass = class&lt;weapon&gt;(DynamicLoadObject(ThisClass, class'Class') );
	if (WeaponClass==none||P.FindInventoryType(WeaponClass)!=none) return;

	WeaponClass.default.ItemArticle=MyArticle;
	NewWeapon=Spawn(WeaponClass);
	WeaponClass.default.ItemArticle=NormalArticle;
	NewWeapon.RespawnTime=0.0;
	NewWeapon.GiveTo(P);
	NewWeapon.bHeldItem=true;
	NewWeapon.GiveAmmo(P);
	NewWeapon.SetSwitchPriority(P);
	NewWeapon.WeaponSet(P);
	NewWeapon.AmbientGlow = 0;

	if (P.IsA('PlayerPawn')) NewWeapon.SetHand(PlayerPawn(P).Handedness);
	else NewWeapon.GotoState('Idle');
	P.Weapon.GotoState('DownWeapon');
	P.PendingWeapon=none;
	if(ThisClass==MyWeapon &amp;&amp; NewWeapon!=none)
	{
		NewWeapon.AmmoType.AmmoAmount=class'OptionsPage'.default.InitialAmmo;
		NewWeapon.AmmoType.MaxAmmo=class'OptionsPage'.default.MaxAmmo;
	}
}
&lt;/uscript&gt;

An example would be nice... Thank You.

'''Wormbo:''' You can use one of the various HandlePickupQuery() functions ([[Legacy:Inventory (UT)|Inventory (UT)]], [[Legacy:Mutator (UT)|Mutator (UT)]], etc.) to handle any type of pickup, but could you please put your questions where people can actually find them? The [[Legacy:Help Desk|Help Desk]] would be a  good place, or a coding forum (e.g. [http://forums.beyondunreal.com/forumdisplay.php?f=101 BUF Coding]).

'''Ticklemonster:''' Open the weapon's uc file, browse down to default properties, and look at this line:

&lt;uscript&gt;
     PickupAmmoCount=8
&lt;/uscript&gt;

Change the count to say 99.

Then, look for the weapon's ammo, let's say it's AmmoName=Class'botpack.BulletBox', to go open that uc file, and change it to look like this:

&lt;uscript&gt;
class BulletBox99 extends TournamentAmmo;

defaultproperties
{
     AmmoAmount=10
     MaxAmmo=99
     UsedInWeaponSlot(9)=1
     PickupMessage=&quot;You got a box of rifle rounds.&quot;
     ItemName=&quot;Box of Rifle Rounds&quot;
     PickupViewMesh=LodMesh'Botpack.BulletBoxM'
     MaxDesireability=0.240000
     Icon=Texture'UnrealI.Icons.I_RIFLEAmmo'
     Physics=PHYS_Falling
     Skin=Texture'Botpack.Skins.BulletBoxT'
     Mesh=LodMesh'Botpack.BulletBoxM'
     CollisionRadius=15.000000
     CollisionHeight=10.000000
     bCollideActors=True
}
&lt;/uscript&gt;

Of course you want to put them in their own class of their own named directory. Say it's a sniper rifle, save the assualtrifle.uc as assualtrifle99.uc and save the bulletbox as bulletbox99.uc. If they are in \AssaultRifle99\Classes, then you will have an AssaultRifle99.u that you can use. You'd want to make a mutator, I guess to make it want to work. 

Does that help?

(hey Ma, look! I posted on Wiki.beyondunreal!!! Now if I could get someone to tell me how to make a flakslug act like a regular sniper bullet, then make that the primary fire on the flak cannon, I'd be all set... hint hint Mr. Wormbo)
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ammunition</title>
    <id>436</id>
    <revision>
      <id>1460</id>
      <timestamp>2006-11-29T01:20:34Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <comment>Formatted subclass tree</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]]  &gt;&gt; Ammunition (Package: Engine)}}

==Properties ==
; int MaxAmmo (travel) : The maximum ammount of ammo.
; int AmmoAmount (travel) : The amount of ammo contained in the Ammunition.  This is used when the [[Legacy:Pawn|Pawn]]'s inventory.
; int InitialAmount :  The amount of ammo currently available.
; int PickupAmmo (travel) : Amount of Ammo to give when this is picked up for the first time	
; bool bRecommendSplashDamage : Used by bots. 
; bool bTossed : Used by bots.
; bool bTrySplash : Used by bots.
; bool bLeadTarget : Used by bots.
; bool bInstantHit : Used by bots.
; bool bSplashDamage : Used by bots.
; class&lt;[[Legacy:Projectile|Projectile]]&gt; ProjectileClass : The projectile type for the ammunition.
; class&lt;[[Legacy:DamageType|DamageType]]&gt; MyDamageType : The Damage type for this ammunition.
; float WarnTargetPct : The percentage value that is used to ''WarnTarget''.
; float RefireRate : The refire rate of the ammunition.
; [[Legacy:Sound|Sound]] FireSound : The [[Legacy:Sound|Sound]] attached to the ammunitions firing.
; float MaxRange : For autoaim.
; bool  bTryHeadShot : Whether the bot using this ammunition should attempt for a headshot.

==Functions==

===Inherited From [[Legacy:Actor|Actor]]===
; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) (simulated) : Displays Ammunition information on on the screen. 
; PostNetReceive() (simulated) : Calls ''CheckOutOfAmmo''.

===Inherited From [[Legacy:Inventory|Inventory]]===
; bool HandlePickupQuery([[Legacy:Pickup|Pickup]] Item ) : If the [[Legacy:Pickup|Pickup]] is an InventoryType and then the PickupQuery is handled.  If the PickupQuery is handled then the ammunition is added through ''AddAmmo'' if the AmmoAmount is not at MaxAmmo.

===General===
; CheckOutOfAmmo() (simulated) : If their is no more ammunition then call the [[Legacy:Weapon|Weapon]] ''OutOfAmmo''.
; bool UseAmmo( int AmountNeeded, optional bool bAmountNeededIsMax ) [simulated] : Determines whether the ammount of ammunition contained in the ammunition is there.  If the flag ''bAmountNeededIsMax'' is set to ''True'' then it uses all of the ammunition.  It subtracts the ammo used, then calls ''CheckOutOfAmmo'' if the Level's ''NetMode'' is NM_StandAlone or NM-ListenServer.
; bool HasAmmo() (simulated) : Returns ''True'' if the weapon has ammunition, else returns ''False'' if the weapon does not contain any ammunition.
; float RateSelf( [[Legacy:Pawn|Pawn]] Shooter, out name RecommendedFiringMode ) : Returns 0.5 
; WarnTarget( [[Legacy:Actor|Actor]] Target, [[Legacy:Pawn|Pawn]] P, vector FireDir ) : If the ammunition was not an bInstantHit, then give warning if a random value is below the ''WarnTargetPct''.  Calls the [[Legacy:Controller|Controller]]'s ''ReceiveWarning'' method.
; SpawnProjectile( vector Start, rotator Dir ) : Sutracts one ammunition and then spawns the [[Legacy:Projectile|Projectile]] for the weapon at the [[Legacy:Vector|vector]] and [[Legacy:Rotator|rotator]] specifed.
; ProcessTraceHit( [[Legacy:Weapon|Weapon]] W, [[Legacy:Actor|Actor]] Other, vector HitLocation, vector HitNormal, vector X, vector Y, vector Z ) : Subtracts one ammunition.
; bool AddAmmo( int AmmoToAdd ) : Adds whichever is smaller, the MaxAmmo or the AmmoAmount plus the Amount of ammunition being added.
; float GetDamageRadius() : Queries the [[Legacy:Projectile|Projectile]] for it's ''DamageRadius''.

==Known Subclasses==
 Ammunition
 +- [[Legacy:BallAmmo|BallAmmo]]
 +- [[Legacy:BioAmmo|BioAmmo]]
 +- [[Legacy:FlakAmmo|FlakAmmo]]
 +- [[Legacy:GrenadeAmmo|GrenadeAmmo]]
 +- [[Legacy:LinkAmmo|LinkAmmo]]
 +- [[Legacy:MinigunAmmo|MinigunAmmo]]
 +- [[Legacy:RedeemerAmmo|RedeemerAmmo]]
 +- [[Legacy:RocketAmmo|RocketAmmo]]
 +- [[Legacy:ShieldAmmo|ShieldAmmo]]
 +- [[Legacy:ShockAmmo|ShockAmmo]]
 |   +- [[Legacy:SuperShockAmmo|SuperShockAmmo]]
 + [[Legacy:SniperAmmo|SniperAmmo]]
 + [[Legacy:TransAmmo|TransAmmo]]

===Epic Bonuspack &amp; UT2004===
* [[Legacy:BruteAmmo|BruteAmmo]]
* [[Legacy:GasbagAmmo|GasbagAmmo]]
* [[Legacy:KrallAmmo|KrallAmmo]]
* [[Legacy:SkaarjAmmo|SkaarjAmmo]]
* [[Legacy:WarlordAmmo|WarlordAmmo]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1461</id>
      <timestamp>2005-11-22T19:13:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>slight editing, added category tags.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]]  &gt;&gt; Ammunition (Package: Engine)}}

==Properties ==
; int MaxAmmo (travel) : The maximum ammount of ammo.
; int AmmoAmount (travel) : The amount of ammo contained in the Ammunition.  This is used when the [[Legacy:Pawn|Pawn]]'s inventory.
; int InitialAmount :  The amount of ammo currently available.
; int PickupAmmo (travel) : Amount of Ammo to give when this is picked up for the first time	
; bool bRecommendSplashDamage : Used by bots. 
; bool bTossed : Used by bots.
; bool bTrySplash : Used by bots.
; bool bLeadTarget : Used by bots.
; bool bInstantHit : Used by bots.
; bool bSplashDamage : Used by bots.
; class&lt;[[Legacy:Projectile|Projectile]]&gt; ProjectileClass : The projectile type for the ammunition.
; class&lt;[[Legacy:DamageType|DamageType]]&gt; MyDamageType : The Damage type for this ammunition.
; float WarnTargetPct : The percentage value that is used to ''WarnTarget''.
; float RefireRate : The refire rate of the ammunition.
; [[Legacy:Sound|Sound]] FireSound : The [[Legacy:Sound|Sound]] attached to the ammunitions firing.
; float MaxRange : For autoaim.
; bool  bTryHeadShot : Whether the bot using this ammunition should attempt for a headshot.

==Functions==

===Inherited From [[Legacy:Actor|Actor]]===
; DisplayDebug( [[Legacy:Canvas|Canvas]] Canvas, out float YL, out float YPos ) (simulated) : Displays Ammunition information on on the screen. 
; PostNetReceive() (simulated) : Calls ''CheckOutOfAmmo''.

===Inherited From [[Legacy:Inventory|Inventory]]===
; bool HandlePickupQuery([[Legacy:Pickup|Pickup]] Item ) : If the [[Legacy:Pickup|Pickup]] is an InventoryType and then the PickupQuery is handled.  If the PickupQuery is handled then the ammunition is added through ''AddAmmo'' if the AmmoAmount is not at MaxAmmo.

===General===
; CheckOutOfAmmo() (simulated) : If their is no more ammunition then call the [[Legacy:Weapon|Weapon]] ''OutOfAmmo''.
; bool UseAmmo( int AmountNeeded, optional bool bAmountNeededIsMax ) [simulated] : Determines whether the ammount of ammunition contained in the ammunition is there.  If the flag ''bAmountNeededIsMax'' is set to ''True'' then it uses all of the ammunition.  It subtracts the ammo used, then calls ''CheckOutOfAmmo'' if the Level's ''NetMode'' is NM_StandAlone or NM-ListenServer.
; bool HasAmmo() (simulated) : Returns ''True'' if the weapon has ammunition, else returns ''False'' if the weapon does not contain any ammunition.
; float RateSelf( [[Legacy:Pawn|Pawn]] Shooter, out name RecommendedFiringMode ) : Returns 0.5 
; WarnTarget( [[Legacy:Actor|Actor]] Target, [[Legacy:Pawn|Pawn]] P, vector FireDir ) : If the ammunition was not an bInstantHit, then give warning if a random value is below the ''WarnTargetPct''.  Calls the [[Legacy:Controller|Controller]]'s ''ReceiveWarning'' method.
; SpawnProjectile( vector Start, rotator Dir ) : Sutracts one ammunition and then spawns the [[Legacy:Projectile|Projectile]] for the weapon at the [[Legacy:Vector|vector]] and [[Legacy:Rotator|rotator]] specifed.
; ProcessTraceHit( [[Legacy:Weapon|Weapon]] W, [[Legacy:Actor|Actor]] Other, vector HitLocation, vector HitNormal, vector X, vector Y, vector Z ) : Subtracts one ammunition.
; bool AddAmmo( int AmmoToAdd ) : Adds whichever is smaller, the MaxAmmo or the AmmoAmount plus the Amount of ammunition being added.
; float GetDamageRadius() : Queries the [[Legacy:Projectile|Projectile]] for it's ''DamageRadius''.

==Known Subclasses==
* [[Legacy:BallAmmo|BallAmmo]]
* [[Legacy:BioAmmo|BioAmmo]]
* [[Legacy:FlakAmmo|FlakAmmo]]
* [[Legacy:GrenadeAmmo|GrenadeAmmo]]
* [[Legacy:LinkAmmo|LinkAmmo]]
* [[Legacy:MinigunAmmo|MinigunAmmo]]
* [[Legacy:RedeemerAmmo|RedeemerAmmo]]
* [[Legacy:RocketAmmo|RocketAmmo]]
* [[Legacy:ShieldAmmo|ShieldAmmo]]
* [[Legacy:ShockAmmo|ShockAmmo]]
** [[Legacy:SuperShockAmmo|SuperShockAmmo]]
* [[Legacy:SniperAmmo|SniperAmmo]]
* [[Legacy:TransAmmo|TransAmmo]]

===Epic Bonuspack &amp; UT2004===
* [[Legacy:BruteAmmo|BruteAmmo]]
* [[Legacy:GasbagAmmo|GasbagAmmo]]
* [[Legacy:KrallAmmo|KrallAmmo]]
* [[Legacy:SkaarjAmmo|SkaarjAmmo]]
* [[Legacy:WarlordAmmo|WarlordAmmo]]

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy Class Tree]]

[[:Category:Legacy To Do]] &amp;ndash; Make subclass tree look like others (see [[Legacy:NavigationPoint|NavigationPoint]] for reference).
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Amphibious Vehicle</title>
    <id>518</id>
    <revision>
      <id>1618</id>
      <timestamp>2007-11-11T08:38:23Z</timestamp>
      <contributor>
        <ip>Ut2004addict</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">By UT2004Addict

http://www.arclength.net/ut2004

Based off of the Hellbender, here's the easiest way to make an Amphibious vehicle (that I've found...)

&lt;uscript&gt;
class Demo extends ONSPRV;


var float UprightStiffness, UprightDamping;



simulated function PostBeginPlay()
{

    super.PostBeginPlay();

    // Make sure we float
    KarmaParams(KParams).KBuoyancy = Buoyancy;


}


simulated function Tick(float DeltaTime)
{


    // Handle water stuff
    if (  PhysicsVolume.bWaterVolume
    &amp;&amp;    (Vect(0,0,-1) &gt;&gt; Rotation) dot PhysicsVolume.Gravity &gt; 0    )
    {
        // Try to stay upright if we're not flipped over already
        KSetStayUpright(true, true);
        KSetStayUprightParams(UprightStiffness, UprightDamping);
    }
    else
    {
        // Allow to flip
        KSetStayUpright(false, false);
        KSetStayUprightParams(0, 0);
    }



    super.Tick(DeltaTime);

}


// Instead of using this to take damage,
// we're going to use this to keep
// our vehicle afloat
event TakeWaterDamage(float DeltaTime)
{

    local vector TempVector;


    // Don't drive up or down...
    TempVector = vector(Rotation);
    TempVector.Z = 0.0;


    if (Throttle != 0)
        KAddImpulse(TempVector * Throttle * 500000.0 * DeltaTime, Location);


    if (Steering != 0)
        KAddAngularImpulse((vect(0,0,1) &gt;&gt; Rotation) * Steering * Throttle * (-15.0) * DeltaTime);


}


defaultproperties
{

    Buoyancy=1.5

    UprightStiffness=500
    UprightDamping=500

    WaterSpeed=1000.0

    WaterMovementState=PlayerDriving


}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1619</id>
      <timestamp>2007-11-11T02:25:16Z</timestamp>
      <contributor>
        <ip>Ut2004addict</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Based off of the Hellbender, here's the easiest way to make an Amphibious vehicle (that I've found...)

&lt;uscript&gt;
class Demo extends ONSPRV;


var float UprightStiffness, UprightDamping;






simulated function PostBeginPlay()
{

    super.PostBeginPlay();

    // Make sure we float
    KarmaParams(KParams).KBuoyancy = Buoyancy;


}



simulated function Tick(float DeltaTime)
{


    // Handle water stuff
    if (  PhysicsVolume.bWaterVolume
    &amp;&amp;    (Vect(0,0,-1) &gt;&gt; Rotation) dot PhysicsVolume.Gravity &gt; 0    )
    {
        // Try to stay upright if we're not flipped over already
        KSetStayUpright(true, true);
        KSetStayUprightParams(UprightStiffness, UprightDamping);
    }
    else
    {
        // Allow to flip
        KSetStayUpright(false, false);
        KSetStayUprightParams(0, 0);
    }



    super.Tick(DeltaTime);

}





// Instead of using this to take damage,
// we're going to use this to keep
// our vehicle afloat
event TakeWaterDamage(float DeltaTime)
{

    local vector Up;
    local vector TempVector;

    Up = PhysicsVolume.Gravity * -1.0;


    // Don't drive up or down...
    TempVector = vector(Rotation);
    TempVector.Z = 0.0;


    if (Throttle != 0)
        KAddImpulse(TempVector * Throttle * 500000.0 * DeltaTime, Location);


    if (Steering != 0)
        KAddAngularImpulse(normal(Up) * Steering * Throttle * (-15.0) * DeltaTime);


}



defaultproperties
{

    Buoyancy=1.5

    UprightStiffness=500
    UprightDamping=500

    WaterSpeed=1000.0

    WaterMovementState=PlayerDriving


}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Amplifier</title>
    <id>28344</id>
    <revision>
      <id>40011</id>
      <timestamp>2009-11-14T20:16:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:An AI Concept</title>
    <id>374</id>
    <revision>
      <id>1270</id>
      <timestamp>2007-06-02T20:05:20Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <minor/>
      <comment>seems more like a tutorial or proposal of an idea than an actual custom class</comment>
      <text xml:space="preserve">'''''Disclaimer:''''' This page represents an idea for a proposed way of coding some particular functionality / behavior in UnrealScript.  It does not represent the way that [[Legacy:UT|UT]] / [[Legacy:UT2003|UT2003]] / [[Legacy:UT2004|UT2004]] actually do things in the normal game engine.

==Introduction==

I'm going to generalize for a minute briefly and explain that in a game &quot;world,&quot; any and every object has a behaviour.  Even if it's as simple as a cup or as complex as monster.  Each behaviour can be more eaisily comprehended if split up into two categories:

# General  Behaviour
# Specific Behaviour

General Behaviours are behaviours that all objects of a certain type know.  With Unreal, most monsters general behaviour is located in their parent class.  For example the Skaarj:

&lt;uscript&gt;
class Skaarj extends ScriptedPawn;

//some behavioural code
&lt;/uscript&gt;

ScriptedPawn is the Skaarj's parent class, and defines general behaviour for all instances of itself. And down the heirarchy:

&lt;uscript&gt;
class SkaarjWarrior extends Skaarj;

//some behavioural code
&lt;/uscript&gt;

Where Skaarj is the parent class and contains general behaviour code for all instances of itself. SkaarjWarrior now has the behaviour defined in Skaarj, general, and it's own behaviour for doing more &quot;specific to it&quot; things, specific.  This concept is old and for new coders, is called inheritance.  (If your one of those newer coders, I'd suggest reading a tutorial on Object Oriented Programming before you continue).

==The New Pattern ==

Before I actually show how to implement the new patten, I'd like to explain what it does, and if you should use it.

===What does it do? ===

I can best show you what it does by using an example.  Most of it is pseudo code, but it gets the point across ;).

Basically, the pattern creates a class structure for creating GENERAL TYPES of monsters with specific behaviours. It allows you to make one class for every general type of monster, one behaviour for every general type of behaviour, and allow both to be used in eachother.This requires two new classes, class Behaviour, and class Creature: 

&lt;uscript&gt;
class Behaviour extends ScriptedPawn;

//an instance of every sub-class of behaviour will need to be here(eventually)
&lt;/uscript&gt;

&lt;uscript&gt;
class Creature extends ScriptedPawn;

//Every variable that a subclass of Creature needs will go here(eventually)
&lt;/uscript&gt;

Note that I say 'general' several times in that paragraph.  The classes NEED to be general. Example: Say I wanted to create a new brute that can crouch and hide behind boxes, shoot missles and machine guns, and talk to the player.  To do this, I could create a general 'Creature' class called newBrute and a general 'Behaviour' classes called Hiding:

&lt;uscript&gt;
class newBrute extends Creature;
&lt;/uscript&gt;

&lt;uscript&gt;
class Hiding extends Behaviour;
&lt;/uscript&gt;

Notice that it isin't 'HidngBehindBoxes', or 'BruteWarrior' extending Brute.  They are both general names and both general classes.  newBrute will define more specific functions for instances of itself and Hiding will define functions for hiding.  All sub-classes of Behaviour are abstract, or only contain functions that make up an interface. Let us map out what needs to be in each class:

*newBrute
**UseMachineGun()
**UseMissileLauncher()
**CheckWeaponStates()
**CheckHealthState()
**SeePlayer()

*Hiding
**CheckForBox()
**CheckForShadows()
**HideBehindNearestBox()
**HideBehindNearestShadow()

(By no means are these complete, they are just for the sake of the example)

A redefinition of Creature:

&lt;uscript&gt;
// same class as before just added on to

class Creature extends ScriptedPawn;

var Behaviour _behaviour;
&lt;/uscript&gt;

Now that we have mapped out what will be needed for the newBrute and Hiding, we will continue to define states:

*newBrute
**TalkingToPlayer
**Firing
**Idling
**Hiding

; TalkingToPlayer : A state for calling functions that send logs to players.
; Firing : A state that calls firing functions and plays animations.
; Idling : A state that checks ammo and checks which weapons can be used.
; HidingBehindBox : A state for using the _behaviour instance for calling the 'Hiding' interface.

No states will be needed for Hiding, for it is abstract.

&lt;uscript&gt;
//The same class as above, just added on to

class newBrute extends Creature;

//---------------------------------------------------
// Functions
//---------------------------------------------------

function UseMachineGun() {
//code
}

function UseMissileLauncher() {
//code
}

function CheckWeaponStates() {
//code
}

function CheckHealthState() {
//code
}

function SeePlayer(actor SeenPlayer) {
//code
}

//-------------------------------------------------------------
// States
//-------------------------------------------------------------

state TalkingToPlayer {
Begin:
//code
}

state Firing {
Begin:
//code
}

state Idling {
Begin:
//code
}

state Hiding {
Begin:
//code
}
&lt;/uscript&gt;

&lt;uscript&gt;
// same class as above, just added on to

class Hiding extends Behaviour;

//------------------------------------
// Functions
//------------------------------------

function CheckForBoxes() {
//code
}

function CheckForShadows() {
//code
}

function HideBehindNearestBox(Creature _creature) {
//code
}

function HideBehindNearestShadow(Creature _creature) {
//code
}
&lt;/uscript&gt;

Now the Behaviour class can be modified:

&lt;uscript&gt;
//same class as above, just added on to

class Behaviour extends ScriptedPawn;

var Hiding  _hiding;  // an instance of the Hiding class
&lt;/uscript&gt;

Now the _behaviour instance can be used in newBrute to access 'Hiding' interface.

&lt;uscript&gt;
class newBrute extends Creature;

var actor player;

//---------------------------------------------------
// Functions
//---------------------------------------------------

function UseMachineGun() {
//code
}

function UseMissileLauncher() {
//code
}

function CheckWeaponStates() {
//code
}

function CheckHealthState() {
if(self.health &lt;= 50) { GotoState('Hiding'); }
}

function SeePlayer(actor Seenplayer) {
SeenPlayer = player;
}

//-------------------------------------------------------------
// States
//-------------------------------------------------------------

state TalkingToPlayer {
Begin:
//code
}

state Firing {
Begin:
//code
}

state Idling {
Begin:
//code
}

state Hiding {
Begin:
behaviour._hiding.HideBehindBox(self);
CheckHealthState();
}

&lt;/uscript&gt;

====Is It For Me====

Well, thats not really an easy question to awnser.  But here are somethings to check over.  If you can awnser yes to these questions I would try the concept, just to see what can be gotten out of it, explore it.

# Am I making a mod where I want to include my own models and meshes?
# Is my mod large enough to be doing all this work for just a few monsters?
# Am I going to be adding a lot of new features with AI?
# Will I be making new weapons and items in my mod? 
# If my mod is multiplayer, is this system appropriate?

==The Concept Extended (More Advanced) ==

===Semi-Abstract Classes===

I like to call Creature and Behaviour 'semi-abstract classes' because they aren't really abstract, they contain variables and functions just like any other class.  They become semi-abstract because they are basically interfaces for accessing multiple interfaces. 

===Sub-whatta?===

I like to define these terms in this way:
; Sub-Behavioural classes : Any class that inherits 'Behaviour' a sub-behavioural class.  
; Sub-Creature classes : Any class that inherits 'Creature' a sub-creature class.

===Polymorphism===

Many elements of the pattern will be polymorphic.  Hence the terms semisub-polymorphic, sub-polymorphic, and semi-abstract polymorphic. A behavioural trigger which can be called by the creature could use polymorphism by having the creature call the trigger placed somewhere in some map, and having it call some interface to change that creatures behaviour, all at runtime.  More on this will be added later.

==Conclusion==

The pattern can be used on anything, not just AI, just with a little change insystem.  Weapons, items, etc. all have behaviours... One could write general  classes for every type of item or weapon or whatever and provide interfaces through behaviour and '_Item' instead of Creature, or _Weapon.  Remember, it's just a concept, a theory,  don't live by it... Much is untested.  Take it and expand it... find ways to make it better.  

[[Legacy:C0ry|C0ry]]

Cory Vogel 2002

fusion815@cox.net

Questions?

email me :)

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super Topic for all AI (custom or stock)
** [[Legacy:Introduction To Game AI|Introduction to Game AI]]
** [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''Foogod:''' I added the disclaimer at the top, because the way these pages are linked from [[Legacy:Artificial Intelligence|Artificial Intelligence]] could confuse some people into thinking this is an explanation of the way that the UT-based games actually do things.

'''Ghost3021:'''fixed a typo, &quot;just a some monsters? is now &quot;for just a few monsters?&quot;. ;) 

'''SuperApe:''' I hope Cory doesn't mind; I took out a lot of unecessary spacing in the code and text of this page.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1271</id>
      <timestamp>2005-11-16T22:04:00Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Disclaimer ==

'''Note:''' This page represents an idea for a proposed way of coding some particular functionality/behavior in UnrealScript.  It does not represent the way that [[Legacy:UT|UT]]/[[Legacy:UT2003|UT2003]]/[[Legacy:UT2004|UT2004]] actually do things in the normal game engine.

==Introduction ==

I'm going to generalize for a minute briefly and explain that in a game &quot;world,&quot; any and every object has a behaviour.  Even if it's as simple as a cup or as complex as monster.  Each behaviour can be more eaisily comprehended if split up into two categories:

# General  Behaviour
# Specific Behaviour

General Behaviours are behaviours that all objects of a certain type know.  With Unreal, most monsters general behaviour is located in their parent class.  For example the Skaarj:

&lt;uscript&gt;
class Skaarj extends ScriptedPawn;

//some behavioural code
&lt;/uscript&gt;

ScriptedPawn is the Skaarj's parent class, and defines general behaviour for all instances of itself. And down the heirarchy:

&lt;uscript&gt;
class SkaarjWarrior extends Skaarj;

//some behavioural code

&lt;/uscript&gt;

Where Skaarj is the parent class and contains general behaviour code for all instances of itself. SkaarjWarrior now has the behaviour defined in Skaarj, general, and it's own behaviour for doing more &quot;specific to it&quot; things, specific.  This concept is old and for new coders, is called inheritance.  (If your one of those newer coders, I'd suggest reading a tutorial on Object Oriented Programming before you continue).

==The New Pattern==

Before I actually show how to implement the new patten, I'd like to explain what it does, and if you should use it.

====What does it do?====

I can best show you what it does by using an example.  Most of it is pseudo code, but it gets the point across ;).

Basically, the pattern creates a class structure for creating GENERAL TYPES of monsters with specific behaviours. It allows you to make one class for every general type of monster, one behaviour for every general type of behaviour, and allow both to be used in eachother.This requires two new classes, class Behaviour, and class Creature: 

&lt;uscript&gt;

class Behaviour extends ScriptedPawn;

//an instance of every sub-class of behaviour will need to be here(eventually)

&lt;/uscript&gt;

&lt;uscript&gt;

class Creature extends ScriptedPawn;

//Every variable that a subclass of Creature needs will go here(eventually)

&lt;/uscript&gt;

 

Note that I say 'general' several times in that paragraph.  The classes NEED to be general. Example: Say I wanted to create a new brute that can crouch and hide behind boxes, shoot missles and machine guns, and talk to the player.  To do this, I could create a general 'Creature' class called newBrute and a general 'Behaviour' classes called Hiding:

&lt;uscript&gt;

class newBrute extends Creature;

&lt;/uscript&gt;

&lt;uscript&gt;

class Hiding extends Behaviour;

&lt;/uscript&gt;

Notice that it isin't 'HidngBehindBoxes', or 'BruteWarrior' extending Brute.  They are both general names and both general classes.  newBrute will define more specific functions for instances of itself and Hiding will define functions for hiding.  All sub-classes of Behaviour are abstract, or only contain functions that make up an interface. Let us map out what needs to be in each class:

*newBrute
**UseMachineGun()
**UseMissileLauncher()
**CheckWeaponStates()
**CheckHealthState()
**SeePlayer()

*Hiding
**CheckForBox()
**CheckForShadows()
**HideBehindNearestBox()
**HideBehindNearestShadow()

(By no means are these complete, they are just for the sake of the example)

A redefinition of Creature:

&lt;uscript&gt;

// same class as before just added on to

class Creature extends ScriptedPawn;

var Behaviour _behaviour;

&lt;/uscript&gt;

Now that we have mapped out what will be needed for the newBrute and Hiding, we will continue to define states:

*newBrute
**TalkingToPlayer
**Firing
**Idling
**Hiding

TalkingToPlayer: A state for calling functions that send logs to players.

Firing: A state that calls firing functions and plays animations.

Idling: A state that checks ammo and checks which weapons can be used.

HidingBehindBox: A state for using the _behaviour instance for calling the 'Hiding' interface.

No states will be needed for Hiding, for it is abstract.

&lt;uscript&gt;

//The same class as above, just added on to

class newBrute extends Creature;

//---------------------------------------------------
// Functions
//---------------------------------------------------

function UseMachineGun() {

//code


}

function UseMissileLauncher() {

//code

}


function CheckWeaponStates() {

//code

}


function CheckHealthState() {

//code

}

function SeePlayer(actor SeenPlayer) {


}


//-------------------------------------------------------------
// States
//-------------------------------------------------------------

state TalkingToPlayer {

Begin:

//code


}


state Firing {

Begin:

//code


}


state Idling {

Begin:

//code

}


state Hiding {

Begin:

//code

}

&lt;/uscript&gt;

&lt;uscript&gt;

// same class as above, just added on to

class Hiding extends Behaviour;

//------------------------------------
// Functions
//------------------------------------

function CheckForBoxes() {

//code

}


function CheckForShadows() {

//code

}

function HideBehindNearestBox(Creature _creature) {

//code

}


function HideBehindNearestShadow(Creature _creature) {

//code


}

&lt;/uscript&gt;

Now the Behaviour class can be modified:

&lt;uscript&gt;

//same class as above, just added on to

class Behaviour extends ScriptedPawn;

var Hiding  _hiding;  // an instance of the Hiding class

&lt;/uscript&gt;

Now the _behaviour instance can be used in newBrute to access 'Hiding' interface.

&lt;uscript&gt;

class newBrute extends Creature;

var actor player;

//---------------------------------------------------
// Functions
//---------------------------------------------------

function UseMachineGun() {

//code


}

function UseMissileLauncher() {

//code

}


function CheckWeaponStates() {

//code

}


function CheckHealthState() {

if(self.health &lt;= 50) { GotoState('Hiding'); }

}

function SeePlayer(actor Seenplayer) {

SeenPlayer = player;

}



//-------------------------------------------------------------
// States
//-------------------------------------------------------------

state TalkingToPlayer {

Begin:

//code


}


state Firing {

Begin:

//code


}


state Idling {

Begin:


//code

}


state Hiding {

Begin:
behaviour._hiding.HideBehindBox(self);
CheckHealthState();


}

&lt;/uscript&gt;

====Is It For Me====

Well, thats not really an easy question to awnser.  But here are somethings to check over.  If you can awnser yes to these questions I would try the concept, just to see what can be gotten out of it, explore it.

# Am I making a mod where I want to include my own models and meshes?
# Is my mod large enough to be doing all this work for just a few monsters?
# Am I going to be adding a lot of new features with AI?
# Will I be making new weapons and items in my mod? 
# If my mod is multiplayer, is this system appropriate?

==The Concept Extended(More Advanced)==

====Semi-Abstract Classes====

I like to call Creature and Behaviour 'semi-abstract classes' because they aren't really abstract, they contain variables and functions just like any other class.  They become semi-abstract because they are basically interfaces for accessing multiple interfaces. 

====Sub-whatta?====

Sub-Behavioural classes:

I like to call any class that inherits 'Behaviour' a sub-behavioural class.  

Sub-Creature classes:

I like to call any class that inherits 'Creature' a sub-creature class.

====Polymorphism====

Many elements of the pattern will be polymorphic.  Hence the terms semisub-polymorphic,

sub-polymorphic, and semi-abstract polymorphic. A behavioural trigger which can be called

by the creature could use polymorphism by having the creature call the trigger placed 

somewhere in some map, and having it call some interface to change that creatures behaviour,

all at runtime.  More on this will be added later.

==Conclusion==

The pattern can be used on anything, not just AI, just with a little change insystem.  Weapons, items, etc. all have behaviours... One could write general  classes for every type of item or weapon or whatever and provide interfaces through behaviour and '_Item' instead of Creature, or _Weapon.  Remember, it's just a concept, a theory,  don't live by it... Much is untested.  Take it and expand it... find ways to make it better.  

[[Legacy:C0ry|C0ry]]

Cory Vogel 2002

fusion815@cox.net

Questions?

email me :)

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super Topic for all AI (custom or stock)

==Discussion==

'''Foogod:''' I added the disclaimer at the top, because the way these pages are linked from [[Legacy:Artificial Intelligence|Artificial Intelligence]] could confuse some people into thinking this is an explanation of the way that the UT-based games actually do things.

'''Ghost3021:'''fixed a typo, &quot;just a some monsters? is now &quot;for just a few monsters?&quot;. ;) 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1272</id>
      <timestamp>2005-11-17T22:51:29Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''Disclaimer:''''' This page represents an idea for a proposed way of coding some particular functionality / behavior in UnrealScript.  It does not represent the way that [[Legacy:UT|UT]] / [[Legacy:UT2003|UT2003]] / [[Legacy:UT2004|UT2004]] actually do things in the normal game engine.

==Introduction==

I'm going to generalize for a minute briefly and explain that in a game &quot;world,&quot; any and every object has a behaviour.  Even if it's as simple as a cup or as complex as monster.  Each behaviour can be more eaisily comprehended if split up into two categories:

# General  Behaviour
# Specific Behaviour

General Behaviours are behaviours that all objects of a certain type know.  With Unreal, most monsters general behaviour is located in their parent class.  For example the Skaarj:

&lt;uscript&gt;
class Skaarj extends ScriptedPawn;

//some behavioural code
&lt;/uscript&gt;

ScriptedPawn is the Skaarj's parent class, and defines general behaviour for all instances of itself. And down the heirarchy:

&lt;uscript&gt;
class SkaarjWarrior extends Skaarj;

//some behavioural code
&lt;/uscript&gt;

Where Skaarj is the parent class and contains general behaviour code for all instances of itself. SkaarjWarrior now has the behaviour defined in Skaarj, general, and it's own behaviour for doing more &quot;specific to it&quot; things, specific.  This concept is old and for new coders, is called inheritance.  (If your one of those newer coders, I'd suggest reading a tutorial on Object Oriented Programming before you continue).

==The New Pattern ==

Before I actually show how to implement the new patten, I'd like to explain what it does, and if you should use it.

===What does it do? ===

I can best show you what it does by using an example.  Most of it is pseudo code, but it gets the point across ;).

Basically, the pattern creates a class structure for creating GENERAL TYPES of monsters with specific behaviours. It allows you to make one class for every general type of monster, one behaviour for every general type of behaviour, and allow both to be used in eachother.This requires two new classes, class Behaviour, and class Creature: 

&lt;uscript&gt;
class Behaviour extends ScriptedPawn;

//an instance of every sub-class of behaviour will need to be here(eventually)
&lt;/uscript&gt;

&lt;uscript&gt;
class Creature extends ScriptedPawn;

//Every variable that a subclass of Creature needs will go here(eventually)
&lt;/uscript&gt;

Note that I say 'general' several times in that paragraph.  The classes NEED to be general. Example: Say I wanted to create a new brute that can crouch and hide behind boxes, shoot missles and machine guns, and talk to the player.  To do this, I could create a general 'Creature' class called newBrute and a general 'Behaviour' classes called Hiding:

&lt;uscript&gt;
class newBrute extends Creature;
&lt;/uscript&gt;

&lt;uscript&gt;
class Hiding extends Behaviour;
&lt;/uscript&gt;

Notice that it isin't 'HidngBehindBoxes', or 'BruteWarrior' extending Brute.  They are both general names and both general classes.  newBrute will define more specific functions for instances of itself and Hiding will define functions for hiding.  All sub-classes of Behaviour are abstract, or only contain functions that make up an interface. Let us map out what needs to be in each class:

*newBrute
**UseMachineGun()
**UseMissileLauncher()
**CheckWeaponStates()
**CheckHealthState()
**SeePlayer()

*Hiding
**CheckForBox()
**CheckForShadows()
**HideBehindNearestBox()
**HideBehindNearestShadow()

(By no means are these complete, they are just for the sake of the example)

A redefinition of Creature:

&lt;uscript&gt;
// same class as before just added on to

class Creature extends ScriptedPawn;

var Behaviour _behaviour;
&lt;/uscript&gt;

Now that we have mapped out what will be needed for the newBrute and Hiding, we will continue to define states:

*newBrute
**TalkingToPlayer
**Firing
**Idling
**Hiding

; TalkingToPlayer : A state for calling functions that send logs to players.
; Firing : A state that calls firing functions and plays animations.
; Idling : A state that checks ammo and checks which weapons can be used.
; HidingBehindBox : A state for using the _behaviour instance for calling the 'Hiding' interface.

No states will be needed for Hiding, for it is abstract.

&lt;uscript&gt;
//The same class as above, just added on to

class newBrute extends Creature;

//---------------------------------------------------
// Functions
//---------------------------------------------------

function UseMachineGun() {
//code
}

function UseMissileLauncher() {
//code
}

function CheckWeaponStates() {
//code
}

function CheckHealthState() {
//code
}

function SeePlayer(actor SeenPlayer) {
//code
}

//-------------------------------------------------------------
// States
//-------------------------------------------------------------

state TalkingToPlayer {
Begin:
//code
}

state Firing {
Begin:
//code
}

state Idling {
Begin:
//code
}

state Hiding {
Begin:
//code
}
&lt;/uscript&gt;

&lt;uscript&gt;
// same class as above, just added on to

class Hiding extends Behaviour;

//------------------------------------
// Functions
//------------------------------------

function CheckForBoxes() {
//code
}

function CheckForShadows() {
//code
}

function HideBehindNearestBox(Creature _creature) {
//code
}

function HideBehindNearestShadow(Creature _creature) {
//code
}
&lt;/uscript&gt;

Now the Behaviour class can be modified:

&lt;uscript&gt;
//same class as above, just added on to

class Behaviour extends ScriptedPawn;

var Hiding  _hiding;  // an instance of the Hiding class
&lt;/uscript&gt;

Now the _behaviour instance can be used in newBrute to access 'Hiding' interface.

&lt;uscript&gt;
class newBrute extends Creature;

var actor player;

//---------------------------------------------------
// Functions
//---------------------------------------------------

function UseMachineGun() {
//code
}

function UseMissileLauncher() {
//code
}

function CheckWeaponStates() {
//code
}

function CheckHealthState() {
if(self.health &lt;= 50) { GotoState('Hiding'); }
}

function SeePlayer(actor Seenplayer) {
SeenPlayer = player;
}

//-------------------------------------------------------------
// States
//-------------------------------------------------------------

state TalkingToPlayer {
Begin:
//code
}

state Firing {
Begin:
//code
}

state Idling {
Begin:
//code
}

state Hiding {
Begin:
behaviour._hiding.HideBehindBox(self);
CheckHealthState();
}

&lt;/uscript&gt;

====Is It For Me====

Well, thats not really an easy question to awnser.  But here are somethings to check over.  If you can awnser yes to these questions I would try the concept, just to see what can be gotten out of it, explore it.

# Am I making a mod where I want to include my own models and meshes?
# Is my mod large enough to be doing all this work for just a few monsters?
# Am I going to be adding a lot of new features with AI?
# Will I be making new weapons and items in my mod? 
# If my mod is multiplayer, is this system appropriate?

==The Concept Extended (More Advanced) ==

===Semi-Abstract Classes===

I like to call Creature and Behaviour 'semi-abstract classes' because they aren't really abstract, they contain variables and functions just like any other class.  They become semi-abstract because they are basically interfaces for accessing multiple interfaces. 

===Sub-whatta?===

I like to define these terms in this way:
; Sub-Behavioural classes : Any class that inherits 'Behaviour' a sub-behavioural class.  
; Sub-Creature classes : Any class that inherits 'Creature' a sub-creature class.

===Polymorphism===

Many elements of the pattern will be polymorphic.  Hence the terms semisub-polymorphic, sub-polymorphic, and semi-abstract polymorphic. A behavioural trigger which can be called by the creature could use polymorphism by having the creature call the trigger placed somewhere in some map, and having it call some interface to change that creatures behaviour, all at runtime.  More on this will be added later.

==Conclusion==

The pattern can be used on anything, not just AI, just with a little change insystem.  Weapons, items, etc. all have behaviours... One could write general  classes for every type of item or weapon or whatever and provide interfaces through behaviour and '_Item' instead of Creature, or _Weapon.  Remember, it's just a concept, a theory,  don't live by it... Much is untested.  Take it and expand it... find ways to make it better.  

[[Legacy:C0ry|C0ry]]

Cory Vogel 2002

fusion815@cox.net

Questions?

email me :)

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super Topic for all AI (custom or stock)
** [[Legacy:Introduction To Game AI|Introduction to Game AI]]
** [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''Foogod:''' I added the disclaimer at the top, because the way these pages are linked from [[Legacy:Artificial Intelligence|Artificial Intelligence]] could confuse some people into thinking this is an explanation of the way that the UT-based games actually do things.

'''Ghost3021:'''fixed a typo, &quot;just a some monsters? is now &quot;for just a few monsters?&quot;. ;) 

'''SuperApe:''' I hope Cory doesn't mind; I took out a lot of unecessary spacing in the code and text of this page.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Angel Mapper</title>
    <id>498</id>
    <revision>
      <id>1578</id>
      <timestamp>2007-04-15T10:56:59Z</timestamp>
      <contributor>
        <ip>C-67-168-230-87.hsd1.or.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Tamearia===

[[Legacy:Tamearia Elevator System|Tamearia Elevator System]]

[[Legacy:Tamearia Real Time Clock|Tamearia Real Time Clock]]

[[Legacy:Tamearia Real Time Calendar|Tamearia Real Time Calendar]]

[[Legacy:Tamearia Reactive Grass|Tamearia Reactive Grass]]

[[Legacy:Tamearia Player Opacity|Tamearia Player Opacity]]

[[Legacy:Tamearia Teleport Effect|Tamearia Teleport Effect]]

===Random===

[[Legacy:Warp Zone Trace Weapons|Warp Zone Trace Weapons]]

[[Legacy:GTA Radar|GTA Radar]]

[[Legacy:One Way Volume|One Way Volume]]

===Comments===

'''MythOpus:''' Welcome To The Wiki!  I'm Glad You've Finally Decided To Join Us Wikizenz :D

'''Tarquin:''' Hi! 

'''Cup Of Squirrels:''' Hey there ^_^

'''SuperApe:''' Welcome, Angel_Mapper!  ''&lt;rolls out red carpet&gt;''

'''Soto:''' Hey Angel_Mapper, thanks for help before =)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1579</id>
      <timestamp>2006-12-16T20:03:23Z</timestamp>
      <contributor>
        <ip>Cpe-66-24-11-165.stny.res.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Tamearia===

[[Legacy:Tamearia Elevator System|Tamearia Elevator System]]

[[Legacy:Tamearia Real Time Clock|Tamearia Real Time Clock]]

[[Legacy:Tamearia Real Time Calendar|Tamearia Real Time Calendar]]

[[Legacy:Tamearia Reactive Grass|Tamearia Reactive Grass]]

[[Legacy:Tamearia Player Opacity|Tamearia Player Opacity]]

[[Legacy:Tamearia Teleport Effect|Tamearia Teleport Effect]]

===Random===

[[Legacy:GTA Radar|GTA Radar]]

[[Legacy:One Way Volume|One Way Volume]]

===Comments===

'''MythOpus:''' Welcome To The Wiki!  I'm Glad You've Finally Decided To Join Us Wikizenz :D

'''Tarquin:''' Hi! 

'''Cup Of Squirrels:''' Hey there ^_^

'''SuperApe:''' Welcome, Angel_Mapper!  ''&lt;rolls out red carpet&gt;''

'''Soto:''' Hey Angel_Mapper, thanks for help before =)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AnimBrowserMesh</title>
    <id>28490</id>
    <revision>
      <id>40191</id>
      <timestamp>2009-11-17T10:56:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AnimEditProps</title>
    <id>28456</id>
    <revision>
      <id>40153</id>
      <timestamp>2009-11-17T10:09:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AnimNotify</title>
    <id>28379</id>
    <revision>
      <id>40050</id>
      <timestamp>2009-11-15T08:14:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AnimSpriteEffect</title>
    <id>28362</id>
    <revision>
      <id>40030</id>
      <timestamp>2009-11-15T07:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AnimalPawn</title>
    <id>28292</id>
    <revision>
      <id>39949</id>
      <timestamp>2009-11-14T18:24:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Animated Texture</title>
    <id>373</id>
    <revision>
      <id>1267</id>
      <timestamp>2003-05-25T09:46:09Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">You can create [[Legacy:Texture|Texture]]s that are animated as a repeating sequence of static frames.

==Creation ==

===Automatic ===

# Create the frames as individual image files.  All images must be of the same size and adhere to the general restrictions described in [[Legacy:Texture Import And Export|Texture Import and Export]].

# Give those image files names according to the following scheme:
# * All files must have the same base name, for instance &lt;code&gt;MyAnim&lt;/code&gt;.
# * In the order the frames should be played, add the suffix &lt;code&gt;_a00&lt;/code&gt;, &lt;code&gt;_a01&lt;/code&gt; and so on to the file (base) names, like &lt;code&gt;MyAnim_a00.pcx&lt;/code&gt;, &lt;code&gt;MyAnim_a01.pcx&lt;/code&gt; and so on.

# In the [[Legacy:Texture Browser|texture browser]], click ''File'' -&gt; ''Import''.  In the &quot;Import Texture&quot; dialog that pops up, select '''all''' of the image files that will belong to your animation, click ''Open'' and proceed as described in [[Legacy:Texture Import And Export|Texture Import and Export]].

UnrealEd will, thanks to the naming of the image files, automatically connect them to an animation.  Use the properties in the ''Animation'' section of the [[Legacy:Texture Properties|texture properties]] window to specify the speed of the animation.

Only the identical base name, the underscore, the &quot;a&quot; and the two-digit number are relevant; the numbers themselves don't have to start at zero.  UnrealEd simply connects the textures in ascending order of the number following &lt;code&gt;_a&lt;/code&gt; in the file name.

===Manual ===

You can manually connect textures to an animation by setting each texture's [[Legacy:Texture Properties|AnimNext property]] to the next texture in the animation.

==Related Topics ==

* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Dynamic Texture|Dynamic Texture]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1268</id>
      <timestamp>2002-06-15T14:05:10Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You can create [[Legacy:Texture (UT)|Texture (UT)]]s that are animated as a sequence of static frames.

==Creation ==

===Automatic ===

# Create the frames as individual image files.  All images must be of the same size and adhere to the general restrictions described in [[Legacy:Texture Import And Export|Texture Import and Export]].

# Give those image files names according to the following scheme:
# * All files should have the same base name, for instance &lt;code&gt;MyAnim&lt;/code&gt;.
# * In the order the frames should be played, add the suffix &lt;code&gt;_a00&lt;/code&gt;, &lt;code&gt;_a01&lt;/code&gt; and so on to the file (base) names, like &lt;code&gt;MyAnim_a00.pcx&lt;/code&gt;, &lt;code&gt;MyAnim_a01.pcx&lt;/code&gt; and so on.

# In the [[Legacy:Texture Browser|texture browser]], click ''File'' -&gt; ''Import''.  In the &quot;Import Texture&quot; dialog that pops up, select '''all''' of the image files that will belong to your animation, click ''Open'' and proceed as described in [[Legacy:Texture Import And Export|Texture Import and Export]].

UnrealEd will, thanks to the naming of the image files, automatically connect them to an animation.  Use the properties in the ''Animation'' section of the [[Legacy:Texture Properties|texture properties]] window to specify the speed of the animation.

===Manual ===

You can manually connect textures to an animation by setting each texture's AnimNext [[Legacy:Texture Properties|property]] to the next texture in the animation.

==Related Topics ==

* [[Legacy:Dynamic Texture|Dynamic Texture]]</text>
    </revision>
    <revision>
      <id>1269</id>
      <timestamp>2002-12-22T17:00:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">You can create [[Legacy:Texture|Texture]]s that are animated as a repeating sequence of static frames.

==Creation ==

===Automatic ===

# Create the frames as individual image files.  All images must be of the same size and adhere to the general restrictions described in [[Legacy:Texture Import And Export|Texture Import and Export]].

# Give those image files names according to the following scheme:
# * All files must have the same base name, for instance &lt;code&gt;MyAnim&lt;/code&gt;.
# * In the order the frames should be played, add the suffix &lt;code&gt;_a00&lt;/code&gt;, &lt;code&gt;_a01&lt;/code&gt; and so on to the file (base) names, like &lt;code&gt;MyAnim_a00.pcx&lt;/code&gt;, &lt;code&gt;MyAnim_a01.pcx&lt;/code&gt; and so on.

# In the [[Legacy:Texture Browser|texture browser]], click ''File'' -&gt; ''Import''.  In the &quot;Import Texture&quot; dialog that pops up, select '''all''' of the image files that will belong to your animation, click ''Open'' and proceed as described in [[Legacy:Texture Import And Export|Texture Import and Export]].

UnrealEd will, thanks to the naming of the image files, automatically connect them to an animation.  Use the properties in the ''Animation'' section of the [[Legacy:Texture Properties|texture properties]] window to specify the speed of the animation.

Only the identical base name, the underscore, the &quot;a&quot; and the two-digit number are relevant; the numbers themselves don't have to start at zero.  UnrealEd simply connects the textures in ascending order of the number following &lt;code&gt;_a&lt;/code&gt; in the file name.

===Manual ===

You can manually connect textures to an animation by setting each texture's [[Legacy:Texture Properties|AnimNext property]] to the next texture in the animation.

==Related Topics ==

* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Dynamic Texture|Dynamic Texture]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Animation</title>
    <id>450</id>
    <revision>
      <id>1489</id>
      <timestamp>2008-03-13T17:35:13Z</timestamp>
      <contributor>
        <ip>Adsl-68-127-116-19.dsl.frsn02.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''Animation''''' is the science and art of creating the illusion of motion. From antique kinetiscopes to cutting edge digital effects, this is done by exploiting the sensory phenomenon called persistence of vision, which causes a series of individual pictures to be perceived as a single, continuous image if displayed one after the other at a fast enough rate. By changing the content of the pictures, the illusion of smooth motion can be created.

In the Unreal universe, animation is the principal deity &amp;ndash; nearly every aspect of the game engine and its thousands of &quot;moving&quot; parts (pun intended) contributes to achieving the ultimate goal of delivering a series of constantly changing images to a computer display. When all goes well, we willingly suspend our disbelief and enter that universe to play the game. If things get glitchy (framerate drop, netplay lag, etc.), the illusion can be broken.

&quot;Animation&quot; need not refer only to apparent motion &amp;ndash; any visually detectable change over time in a series of images (such as changes in color or texture) is also animation. That is the heart of the art &amp;ndash; change over time.

For Unreal game content developers, &quot;animation&quot; can be more narrowly defined. There are five types of animation techniques directly accessible for content creation: texture animation, mover animation, cinematic animation, vertex animation, and skeletal animation.

;Texture animation: The creation of any change over time in the textures applied to the surfaces of objects in Unreal scenes. [[Legacy:TexPanner|TexPanner]]s, [[Legacy:TexRotator|TexRotator]]s, and MaterialSequences are examples.

;Mover animation: Uses game engine programming to create positional changes over time of 3D objects in the Unreal scene. Mover animation is implemented by designating a 3D object in a map as a [[Legacy:Mover|Mover]], and specifying a sequence of positional changes (keys) and the time to move between each.

;Cinematic animation: Related to mover animation, but employs defined motion paths for objects, including the depicted viewpoint, if desirable. The [[Legacy:Matinee|Matinee]] tool is used to create cinematic animation &amp;ndash; [[Legacy:InterpolationPoint|InterpolationPoint]]s are placed in a map to describe the motion path, and the [[Legacy:SceneManager|SceneManager]]'s Affect and/or AffectedActor properties are set to specify the object being moved. Actions and SubActions properties further define the motion characteristics.

;Vertex animation: 
A method of creating motion in a 3D model mesh by directly manipulating the individual vertices of the mesh. This was the principal 3d mesh animation technique used in Unreal 1, and is still employed selectively in UT2003 for such objects as the waving-in-the-wind CTF flags and the bio-rifle goop blobs. Vertex animation of characters and some types of weapons is a laborious task, and has been largely superceded by the skeletal animation technique.

Vertex animation requires a modeling/animation program ( e.g., 3DS Max, Maya, or MilkShape) and the use of a utility (e.g., [[Legacy:ActorX|ActorX]], [[Legacy:3ds2unr|3ds2unr]]) for exporting the animated meshes to a form that can be imported into UEd. Currently vertex animation requires some Unreal Scripting to fully implement.


;Skeletal animation: 
A technique for animating 3D meshes by using a controlling understructure, commonly called a skeleton, that is invisible in the game. The skeleton can be constructed to mimic the proportions and range of motion of a human skeleton, making it an ideal technique for animating humanoid characters, but it can be applied to many other animation needs as well. One of the strongest features of skeletal animation is that it can employ inverse kinematics, which greatly simplifies the creation of certain types of animated motion.

Skeletal animation requires a modeling/animation program ( e.g., 3DS Max, Maya) that supports the technique, and the use of a utility (e.g., [[Legacy:ActorX|ActorX]], [[Legacy:UnEditor.Mll|unEditor.mll]]) for exporting the skeletal animations to a form that can be imported into UEd.


Both gmax and Maya PLE, the freeware versions of Max and Maya that Discreet and Alias provide for non-commercial use, can be employed to produce 3D mesh animations, but their limitations can complicate the process of getting the result into UT2003.

The choice by a modeler/animator of which animation technique to use for a particular task depends on the nature of the motion to be simulated. The surface appearance of an object can be animated using the various moving texture types. For motion through virtual 3D space, when the form of a moving object does not change, mover animation is usually adequate. More complex motion paths, and &quot;camera&quot; motion, can be accomplished with cinematic animation. Motions requiring a 3D object to change its shape in a complex fashion (such as the multiple waveforms present in a breeze-blown banner) are best portrayed with vertex animation. Skeletal animation is most useful where sections of a mesh object move as separate units (such as an arm or leg), and the units can be &quot;attached&quot; to a skeletal understructure. 

==Reference==
* [http://www.unrealtournament.com/downloads/ UnrealTournament.com's] Download Section. Get the UT Bonus Pack 4, which adds support for Skeletal Animation for UT.
* [http://unreal.epicgames.com/skeletal/utskelanim.htm Unreal Tournament Skeletal Animation System Notes]
* [http://planetunreal.com/epicknights/ EpicKnights] &amp;ndash; An Unreal Engine animating resource.
** Skeletal animation using [[Legacy:ActorX|ActorX]]
** Applying materials in 3DS
** UnrealNST &amp;ndash; A useful tool for viewing, mapping, and painting vertex models.

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Skinning|Skinning]]
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Maya|Maya]]
* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Cryptic AR|Cryptic AR]]</text>
    </revision>
    <revision>
      <id>1490</id>
      <timestamp>2003-10-22T14:52:07Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>removed my old comment</comment>
      <text xml:space="preserve">'''''Animation''''' is the science and art of creating the illusion of motion. From antique kinetiscopes to cutting edge digital effects, this is done by exploiting the sensory phenomenon called persistence of vision, which causes a series of individual pictures to be perceived as a single, continuous image if displayed one after the other at a fast enough rate. By changing the content of the pictures, the illusion of smooth motion can be created.

In the Unreal universe, animation is the principal deity &amp;ndash; nearly every aspect of the game engine and its thousands of &quot;moving&quot; parts (pun intended) contributes to achieving the ultimate goal of delivering a series of constantly changing images to a computer display. When all goes well, we willingly suspend our disbelief and enter that universe to play the game. If things get glitchy (framerate drop, netplay lag, etc.), the illusion can be broken.

&quot;Animation&quot; need not refer only to apparent motion &amp;ndash; any visually detectable change over time in a series of images (such as changes in color or texture) is also animation. That is the heart of the art &amp;ndash; change over time.

For Unreal game content developers, &quot;animation&quot; can be more narrowly defined. There are five types of animation techniques directly accessible for content creation: texture animation, mover animation, cinematic animation, vertex animation, and skeletal animation.

;Texture animation: The creation of any change over time in the textures applied to the surfaces of objects in Unreal scenes. [[Legacy:TexPanner|TexPanner]]s, [[Legacy:TexRotator|TexRotator]]s, and MaterialSequences are examples.

;Mover animation: Uses game engine programming to create positional changes over time of 3D objects in the Unreal scene. Mover animation is implemented by designating a 3D object in a map as a [[Legacy:Mover|Mover]], and specifying a sequence of positional changes (keys) and the time to move between each.

;Cinematic animation: Related to mover animation, but employs defined motion paths for objects, including the depicted viewpoint, if desirable. The [[Legacy:Matinee|Matinee]] tool is used to create cinematic animation &amp;ndash; [[Legacy:InterpolationPoint|InterpolationPoint]]s are placed in a map to describe the motion path, and the [[Legacy:SceneManager|SceneManager]]'s Affect and/or AffectedActor properties are set to specify the object being moved. Actions and SubActions properties further define the motion characteristics.

;Vertex animation: 
A method of creating motion in a 3D model mesh by directly manipulating the individual vertices of the mesh. This was the principal 3d mesh animation technique used in Unreal 1, and is still employed selectively in UT2003 for such objects as the waving-in-the-wind CTF flags and the bio-rifle goop blobs. Vertex animation of characters and some types of weapons is a laborious task, and has been largely superceded by the skeletal animation technique.

Vertex animation requires a modeling/animation program ( e.g., 3DS Max, Maya, or MilkShape) and the use of a utility (e.g., [[Legacy:ActorX|ActorX]], [[Legacy:3ds2unr|3ds2unr]]) for exporting the animated meshes to a form that can be imported into UEd. Currently vertex animation requires some Unreal Scripting to fully implement.


;Skeletal animation: 
A technique for animating 3D meshes by using a controlling understructure, commonly called a skeleton, that is invisible in the game. The skeleton can be constructed to mimic the proportions and range of motion of a human skeleton, making it an ideal technique for animating humanoid characters, but it can be applied to many other animation needs as well. One of the strongest features of skeletal animation is that it can employ inverse kinematics, which greatly simplifies the creation of certain types of animated motion.

Skeletal animation requires a modeling/animation program ( e.g., 3DS Max, Maya) that supports the technique, and the use of a utility (e.g., [[Legacy:ActorX|ActorX]], [[Legacy:UnEditor.Mll|unEditor.mll]]) for exporting the skeletal animations to a form that can be imported into UEd.


Both gmax and Maya PLE, the freeware versions of Max and Maya that Discreet and Alias provide for non-commercial use, can be employed to produce 3D mesh animations, but their limitations can complicate the process of getting the result into UT2003.

The choice by a modeler/animator of which animation technique to use for a particular task depends on the nature of the motion to be simulated. The surface appearance of an object can be animated using the various moving texture types. For motion through virtual 3D space, when the form of a moving object does not change, mover animation is usually adequate. More complex motion paths, and &quot;camera&quot; motion, can be accomplished with cinematic animation. Motions requiring a 3D object to change its shape in a complex fashion (such as the multiple waveforms present in a breeze-blown banner) are best portrayed with vertex animation. Skeletal animation is most useful where sections of a mesh object move as separate units (such as an arm or leg), and the units can be &quot;attached&quot; to a skeletal understructure. 

==Reference==
* [http://www.unrealtournament.com/downloads/ UnrealTournament.com's] Download Section. Get the UT Bonus Pack 4, which adds support for Skeletal Animation for UT.
* [http://unreal.epicgames.com/skeletal/utskelanim.htm Unreal Tournament Skeletal Animation System Notes]
* [http://planetunreal.com/epicknights/ EpicKnights] &amp;ndash; An Unreal Engine animating resource.
** Skeletal animation using [[Legacy:ActorX|ActorX]]
** Applying materials in 3DS
** UnrealNST &amp;ndash; A useful tool for viewing, mapping, and painting vertex models.

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Skinning|Skinning]]
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Maya|Maya]]
* [[Legacy:MilkShape|MilkShape]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Animation Browser</title>
    <id>444</id>
    <revision>
      <id>1476</id>
      <timestamp>2003-09-18T15:09:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Animation Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

Uses of the browser:
* displays currently loaded skeletal [[Legacy:Mesh|mesh]]es
* allows further [[Legacy:Package|package]]s to be opened
* allows properties of the skeletal mesh resources to be edited, such as skins or animation sequences. But remember [[Legacy:Do Not Alter Default Packages|Do not alter default packages]].

[[Image:Legacy_interface-Ed3-animationbrowser.png|center|Animation Browser]]

==Opening ==

The Animations Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Animations Browser
* Press the Animations Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an &quot;A&quot;.

==Browser Toolbar Buttons ==

The Animation Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* Open Package
* Save Package
* Load Entire Package
* Import Mesh
* Import Skeletal Animation
* Import additional animation data
* Link animation to mesh
* Info
* Edit mesh properties
* Edit animation properties
* View bounds
* View bones
* Clear groups
* View reference pose
* View influences
* Toggle raw offset display
* Redigest raw data
* Copy mesh properties
* Pase mesh properties
* Cycle through the LOD mesh levels
* Import a single LOD mesh
* Redigest LOD levels
* Forced syncronous in-level animation

----

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Static Mesh Browser|Static Mesh Browser]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Animation Replication</title>
    <id>446</id>
    <revision>
      <id>1479</id>
      <timestamp>2006-11-26T17:59:48Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is about animations in [[Legacy:UT2003|UT2003]].

After running into many problems with animations online, and after discovering many more have these problems, I decided to write this little how to/tut so new people can figure it out a bit more easy. I hope ;)

==Basic Animation info==

There are many ways to play animations, I guess most used are PlayAnim and LoopAnim. Animations are blended over different channels etc.

I am sure someone with great animation skills will someday make a animation tut.

===Where it fails===

It's important to know that the PlayAnim and related functions don't get replicated. This is where the real trouble starts. So you have yourself a good animation offline, now how do you make it work online?

The simple solution is well documented and goes like this:

&lt;uscript&gt;
//In your Pawn class
simulated event SetAnimAction(name NewAction)
{
    //This is the default animation replication method
    if (animaction != NewAction) {
       //This means that the animation played by the server is not the same as by the client
       
       //Do some checks here to see what animation should be played, and play it
    }
}
&lt;/uscript&gt;

Now in this function you will be doing basicly the stuff done by the server also, for example:

&lt;uscript&gt;
//Somewhere in your code you do:
    PlayAnim('myanim',,,0);
    FreezeAnimAt(0,0);
&lt;/uscript&gt;

So the myanim animation you need to be replicated. Now alter the SetAnimAction function to do this:

&lt;uscript&gt;
//In your Pawn class
simulated event SetAnimAction(name NewAction)
{
    //This is the default animation replication method
    if (animaction != NewAction) {
       //This means that the animation played by the server is not the same as by the client
       if (animaction == 'myanim') {
          PlayAnim(animaction,,,0);
          FreezeAnimAt(0,0);
    }
}
&lt;/uscript&gt;

Well all nice and perfect so far, but it wont work online just yet.

First you need to set the animaction variable to make it replicate and let the client see that it needs to update. You do this by setting the AnimAction property of your pawn to the animation you told the server to play:

&lt;uscript&gt;
//Somewhere in your code you do:
    P.PlayAnim('myanim',,,0);
    P.FreezeAnimAt(0,0);
    P.SetAnimAction('myanim');
&lt;/uscript&gt;

===Need more control?===

Well I did, some of my animations needed calculated properties to run smoothly with their environment. This is the hard part IMO. I decided to use boolean and integers that got replicated, then the pawn's Tick function would check the boolean and set the animation so it would use the proper calculated properties etc.

I am sure this part so far is clear, this isn't the hard part of online animations. ;)

==Where the engine starts to interupt==

Now when I tested my animation replication online I was shocked to see the pawn revert to default player animations at random moments. I spend then many hours trying to find the source of these animations. It turned out that a part of UT2003's engine does animation control already. These where overruling my animations all the time. A good way to solve this is by setting the Physics to PHYS_None, this stops the engine from updating your pawn.

Another part that overrules the animations is the AnimEnd function. You can simply subclass it and make it check for certain conditions where you don't want the animations to be overruled.

==The End==

So I hope this helps people to get their animations working online, its just a start. I might add more over time. Specially since I don't have it all working myself. ;)

Feel free to alter, fix and complete.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Actor|Actor]] class (declares the animation functions)

----

[[:Category:Legacy Tutorial]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; This needs merged into the grand topic of [[Legacy:Replication|Replication]]. See [[Legacy:Replication/Discussing|Replication/Discussing]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1480</id>
      <timestamp>2003-10-05T19:04:26Z</timestamp>
      <contributor>
        <ip>I110-054.nv.iinet.net.au</ip>
      </contributor>
      <minor/>
      <comment>*I'm pretty sure the AnimAction function doesnt exist ;)</comment>
      <text xml:space="preserve">This page is about animations in [[Legacy:UT2003|UT2003]].

After running into many problems with animations online, and after discovering many more have these problems, I decided to write this little how to/tut so new people can figure it out a bit more easy. I hope ;)

==Basic Animation info==

There are many ways to play animations, I guess most used are PlayAnim and LoopAnim. Animations are blended over different channels etc.

I am sure someone with great animation skills will someday make a animation tut.

===Where it fails===

It's important to know that the PlayAnim and related functions don't get replicated. This is where the real trouble starts. So you have yourself a good animation offline, now how do you make it work online?

The simple solution is well documented and goes like this:

&lt;uscript&gt;
//In your Pawn class
simulated event SetAnimAction(name NewAction)
{
    //This is the default animation replication method
    if (animaction != NewAction) {
       //This means that the animation played by the server is not the same as by the client
       
       //Do some checks here to see what animation should be played, and play it
    }
}
&lt;/uscript&gt;

Now in this function you will be doing basicly the stuff done by the server also, for example:

&lt;uscript&gt;
//Somewhere in your code you do:
    PlayAnim('myanim',,,0);
    FreezeAnimAt(0,0);
&lt;/uscript&gt;

So the myanim animation you need to be replicated. Now alter the SetAnimAction function to do this:

&lt;uscript&gt;
//In your Pawn class
simulated event SetAnimAction(name NewAction)
{
    //This is the default animation replication method
    if (animaction != NewAction) {
       //This means that the animation played by the server is not the same as by the client
       if (animaction == 'myanim') {
          PlayAnim(animaction,,,0);
          FreezeAnimAt(0,0);
    }
}
&lt;/uscript&gt;

Well all nice and perfect so far, but it wont work online just yet.

First you need to set the animaction variable to make it replicate and let the client see that it needs to update. You do this by setting the AnimAction property of your pawn to the animation you told the server to play:

&lt;uscript&gt;
//Somewhere in your code you do:
    P.PlayAnim('myanim',,,0);
    P.FreezeAnimAt(0,0);
    P.SetAnimAction('myanim');
&lt;/uscript&gt;

===Need more control?===

Well I did, some of my animations needed calculated properties to run smoothly with their environment. This is the hard part IMO. I decided to use boolean and integers that got replicated, then the pawn's Tick function would check the boolean and set the animation so it would use the proper calculated properties etc.

I am sure this part so far is clear, this isn't the hard part of online animations. ;)

==Where the engine starts to interupt==

Now when I tested my animation replication online I was shocked to see the pawn revert to default player animations at random moments. I spend then many hours trying to find the source of these animations. It turned out that a part of UT2003's engine does animation control already. These where overruling my animations all the time. A good way to solve this is by setting the Physics to PHYS_None, this stops the engine from updating your pawn.

Another part that overrules the animations is the AnimEnd function. You can simply subclass it and make it check for certain conditions where you don't want the animations to be overruled.

==The End==

So I hope this helps people to get their animations working online, its just a start. I might add more over time. Specially since I don't have it all working myself. ;)

Feel free to alter, fix and complete.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Actor|Actor]] class (declares the animation functions)

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AnnouncerVoice</title>
    <id>28289</id>
    <revision>
      <id>39946</id>
      <timestamp>2009-11-14T18:24:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Another Look At Replication</title>
    <id>480</id>
    <revision>
      <id>1541</id>
      <timestamp>2006-11-26T18:00:59Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==The Meaning Of The Replication Block==

&lt;uscript&gt;
replication
{
         reliable if( Role == ROLE_Authority )
           somevar;
         reliable if( Role &lt; ROLE_Authority )
            someInputVar;
}
&lt;/uscript&gt;

The first part of the replication block here is saying, if 'somevar' changes on the server, then the server should tell others about it.

The second part says if 'someInputVar' changes on the client, then the client will send that data back to the server.

When writing your replication statements, your conditional check is a specification of who should be SENDING the data, and then that data will be sent to everyone applicable.

I'm guessing this means that the server will always send to the owner of the actor, and maybe even ALL clients.

On the other hand, Clients can ONLY send data to the server.

'''MtTracer:''' As far as I know variables are not necessarily sent directly after they changed. Replication happens frequently but you can't tell when exactly. Only bNetDirty can be used to see if at least one property of this a class has been changed since the last replication check. Second, the server will allways send its variables to every &quot;copy&quot; of this actor on all clients except you used bNetOwner in the condition check.

&lt;uscript&gt;
replication
{
reliable if( ROLE == ROLE_Authority )
   ServerVersionOfSomeImportantValueTheClientIsGoingToChange;
reliable if( ROLE &lt; ROLE_Authority )
   NotifyServer, SomeImportantValueTheClientIsGoingToChange;
}

simulated function MyClientSideFunc()
{
SomeImportantValueTheClientIsGoingToChange++;
NotifyServer();
}

function NotifyServer()
{
    if( SomeImportantValueTheClientIsGoingToChange == NOT_A_PROBLEMATIC_CHANGE )
       ServerVersionOfSomeIMportantValueTheClientIsGoingToChange=SomeImportantValueTheClientIsGoingToChange;
}

simulated event DrawHUD(Canvas C)
{
   C.DrawText(&quot;Client Value specified is: &quot;@ServerVersionOfSomeImportantValueTheClientIsGoingToChange);
}
 
&lt;/uscript&gt;

Now what's going on here, is that the client is going to change SomeIMportantValueTheClientIsGoingToChange, and call NotifyServer. 

This call to notify server is going to be called on the ServerMachine, both because it's non-simulated, so it can't execute on the client, and because we are replicating this function from the client to the server. 

in NotifyServer The server will allow the change and set it's version of this variable, 'SeverVersionOfSomeIMportantValueTheClientIsGoingToChange' to the client variables value.

Now that this has happened, the drawhud function is going to draw the value of the server's version of the variable to the clients hud during updates.

This is simply an example to get the point across. Specifically, i have not tested to see whether SomeImportantValueTheClientIsGoingToChange will take it's new, client modified value, before NotifyServer is called and the value is assigned.

This understanding has fixed some of my recent problems so i hope it helps you too.

==Comments==

'''Tarquin:''' Perhaps this can be folded into [[Legacy:Introduction To Replication|Introduction To Replication]]?

'''Solid Snake:''' Fixed a spelling mistake for those who cut-copy code from places, and also it may be better to just use A, B instead of really long labels for the sake of readability?

'''Mychaeel:''' ''Especially'' for sake of readability I'm particularly fond of well-crafted, long symbol names... though I have to admit that the ones used here aren't terribly well-crafted.  They're just a string of [[Wiki:WordsSmashedTogetherLikeSo|WordsSmashedTogetherLikeSo]].

'''Sweavo:''' Agree that this should be folded-in, also that human-meaningful names are better than A and B

----

[[:Category:Legacy To Do]] &amp;ndash; This needs merged into the grand topic of [[Legacy:Replication|Replication]]. See [[Legacy:Replication/Discussing|Replication/Discussing]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1542</id>
      <timestamp>2006-01-08T14:20:14Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==The Meaning Of The Replication Block==

&lt;uscript&gt;
replication
{
         reliable if( Role == ROLE_Authority )
           somevar;
         reliable if( Role &lt; ROLE_Authority )
            someInputVar;
}
&lt;/uscript&gt;

The first part of the replication block here is saying, if 'somevar' changes on the server, then the server should tell others about it.

The second part says if 'someInputVar' changes on the client, then the client will send that data back to the server.

When writing your replication statements, your conditional check is a specification of who should be SENDING the data, and then that data will be sent to everyone applicable.

I'm guessing this means that the server will always send to the owner of the actor, and maybe even ALL clients.

On the other hand, Clients can ONLY send data to the server.

'''MtTracer:''' As far as I know variables are not necessarily sent directly after they changed. Replication happens frequently but you can't tell when exactly. Only bNetDirty can be used to see if at least one property of this a class has been changed since the last replication check. Second, the server will allways send its variables to every &quot;copy&quot; of this actor on all clients except you used bNetOwner in the condition check.

&lt;uscript&gt;
replication
{
reliable if( ROLE == ROLE_Authority )
   ServerVersionOfSomeImportantValueTheClientIsGoingToChange;
reliable if( ROLE &lt; ROLE_Authority )
   NotifyServer, SomeImportantValueTheClientIsGoingToChange;
}

simulated function MyClientSideFunc()
{
SomeImportantValueTheClientIsGoingToChange++;
NotifyServer();
}

function NotifyServer()
{
    if( SomeImportantValueTheClientIsGoingToChange == NOT_A_PROBLEMATIC_CHANGE )
       ServerVersionOfSomeIMportantValueTheClientIsGoingToChange=SomeImportantValueTheClientIsGoingToChange;
}

simulated event DrawHUD(Canvas C)
{
   C.DrawText(&quot;Client Value specified is: &quot;@ServerVersionOfSomeImportantValueTheClientIsGoingToChange);
}
 
&lt;/uscript&gt;

Now what's going on here, is that the client is going to change SomeIMportantValueTheClientIsGoingToChange, and call NotifyServer. 

This call to notify server is going to be called on the ServerMachine, both because it's non-simulated, so it can't execute on the client, and because we are replicating this function from the client to the server. 

in NotifyServer The server will allow the change and set it's version of this variable, 'SeverVersionOfSomeIMportantValueTheClientIsGoingToChange' to the client variables value.

Now that this has happened, the drawhud function is going to draw the value of the server's version of the variable to the clients hud during updates.

This is simply an example to get the point across. Specifically, i have not tested to see whether SomeImportantValueTheClientIsGoingToChange will take it's new, client modified value, before NotifyServer is called and the value is assigned.

This understanding has fixed some of my recent problems so i hope it helps you too.

==Comments==

'''Tarquin:''' Perhaps this can be folded into [[Legacy:Introduction To Replication|Introduction To Replication]]?

'''Solid Snake:''' Fixed a spelling mistake for those who cut-copy code from places, and also it may be better to just use A, B instead of really long labels for the sake of readability?

'''Mychaeel:''' ''Especially'' for sake of readability I'm particularly fond of well-crafted, long symbol names... though I have to admit that the ones used here aren't terribly well-crafted.  They're just a string of [[Wiki:WordsSmashedTogetherLikeSo|WordsSmashedTogetherLikeSo]].

'''Sweavo:''' Agree that this should be folded-in, also that human-meaningful names are better than A and B</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Anozireth</title>
    <id>457</id>
    <revision>
      <id>1503</id>
      <timestamp>2004-02-27T16:59:57Z</timestamp>
      <contributor>
        <ip>Anozireth</ip>
      </contributor>
      <comment>Reformatted and added some info on a current project</comment>
      <text xml:space="preserve">==Anozireth==

===A little about me===

Real name: Tom Nicholson

Age: 21

Hometown: Seattle, WA

E-Mail: anozireth at yahoo.com

Website: (coming soon hopefully)

Hey all, I'm new around here, but have been into modding since Quake 1. My main talent is programming, although I do dabble in mapping from time to time.  I'm still learning UnrealScript, but getting the hang of it pretty quick. I've found a lot of great help on this site so I thought I'd register a profile.

Right now I'm deployed in Iraq with the US Army, writing this to you from my tent via satellite internet.  I should be home in May, and I plan to take most of the summer off and go back to school in the fall.  My job in the Army Reserve is a Chinook helicopter mechanic, and in the civilian world (aka the 'real world' around here), I am a student and I work part time for my dad's small business developing accounting and inventory software on the AS/400.

===Projects===

Right now I'm working on a mutator I've tentativly titled &quot;Insanity&quot; (hopefully there's no other mods with this name?).  Basically it makes all the weapons 10x as powerful.  I know this has been done before (I think the famous one is called Excessive), but I thought it would make a fun and reasonably simple project to learn with.  You start off with all weapons and full ammo (with 10x as much ammo as normal) and 500 health.  You also run, jump, swim and fly 50% faster.  I'm working on a config screen to allow full user conrtol over everything it has to offer.  I've also added smoke grenades.  So far the funnest weapon has turned out to be the Insane Bio Rifle on secondary fire, it charges up 100 rounds of ammo in the amount of time it normally takes to charge 10, and if you hit someone with the giant glob of goo in a room full of enemies, everyone dies! :-D  I'm not quite to the point where I'm ready to release this but I could be within a few days if I don't have ''too'' much work to do.  

===Comments/Discussion===

'''EntropicLqd:''' Welcome to the Wiki.  Glad you've found it useful.  Hope you are enjoying the sand out there :/

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1504</id>
      <timestamp>2004-02-26T18:29:35Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">Hey all, I'm new around here, but have been into modding since Quake 1.  

Still learning UnrealScript, but getting the hang of it pretty quick. I've found a lot of great help on this site so I thought I'd register a profile.

I don't have a website right now (I'm actually in the Army and in Iraq right now), but I will when I get home in a couple months.  Maybe I'll find a freebie host and post one sooner.  My email is anozireth@yahoo.com. 

'''EntropicLqd:''' Welcome to the Wiki.  Glad you've found it useful.  Hope you are enjoying the sand out there :/

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Anozireth/IonTrigger</title>
    <id>458</id>
    <revision>
      <id>1505</id>
      <timestamp>2007-11-17T23:26:32Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Download IonTrigger Package==

http://www.geocities.com/Anozireth/IonTrigger.html

==Description==

This package provides a pair of classes that allow the mapper to place a volume that will trigger the firing of an [[Legacy:IonCannon|IonCannon]].  It allows the mapper to specify either a fixed targer or the triggering player as the target.  It also allows the mapper to set the minimum time between firings and the maximum number of firings.

==How to use==

Simply place an &lt;tt&gt;IonTriggerVolume&lt;/tt&gt; in the map where you want it, and an [[Legacy:IonCannon|IonCannon]] that can see intended area of the target.  Then configure the following settings:

; bTargetPlayer : If set to true, it will attempt to target the player which triggered it.  If set to false it will target the IonTarget
; IonTarget : Optional : An Actor of the IonTriggerTarget class at the point to be targeted.  Note that there are no configuration options for the IonTriggerTarget.
; maxFires : The maximum number of times this volume can trigger a firing.  0 = infinite
; resetTime : The minimum time between firings.  Note that each individual cannon takes about 3 seconds to reload, so a value of less than 3 is not recommended, and may cause the cannon to not refire properly if a player is still staning in the volume when the timer resets.

==Source Code==

&lt;uscript&gt;
//-----------------------------------------------------------
//  IonTriggerVolume - A volume that can be used to trigger an IonCannon.
//  By Tom Nicholson, aka Anozireth
//  anozireth@yahoo.com
//-----------------------------------------------------------
class IonTriggerVolume extends Volume;

var() IonTriggerTarget IonTarget;   // designated target
var() bool bTargetPlayer;            // Targets triggering actor if true, otherwise targets IonTarget
var() float resetTime;                // Time between fires.  This should be &gt; 0
var() int maxFires;                   // Maximum number of times this volume can trigger a firing.  0 = infinite

var bool bWaitingToFire;            // can we fire right now?
var int firingCount;                // How many times we've triggered a firing

event touch(Actor Other)
{
	// Don't fire if not enough time has elapsed since the last firing
    if (bWaitingToFire)
	   return;

    // Don't fire if we're over the max number of firings
    if ( (maxFires&gt;0) &amp;&amp; (firingCount &gt;= maxFires))
       return;

    if ( Pawn(Other) != none )
       	if ( Pawn(Other).IsPlayerPawn() )
            FireCannon(Pawn(Other));       // if the touch was by a player, then FIRE!
}

function IonCannon CheckMark(Pawn TargetPawn, vector MarkLocation, bool bFire)
{
	local IonCannon I;

    // iterate through all cannons in the map until we can find one that can hit our target
	foreach DynamicActors(class'IonCannon', I)
	{
	    // Found a cannon, try to fire it and check if it succeeded.
		if ( I.CheckMark(Instigator,MarkLocation,bFire) )
		{
            firingCount++;   // Keep track of how many times we've triggered a firing
			return I;
		}
	}
    // didn't find a cannon that could hit the target
	return None;
}

function FireCannon(Pawn TargetPawn)
{
local vector vecTarget;     // Location aimed at by cannon
local vector vecNorm;       // not really used, just required by trace
local string s;

    // Trace straight down from the target.
    // Cannons don't seem to like shooting at points that aren't on the ground.
    if (bTargetPlayer || (IonTarget == none))  // Target the triggering player
       Trace(vecTarget,vecNorm,TargetPawn.Location+Vect(0,0,-10000), TargetPawn.Location, false);
    else    // Target the map specified target
       Trace(vecTarget,vecNorm,IonTarget.Location+Vect(0,0,-10000), IonTarget.Location, false);

    // Try to actually find a cannon and fire it
    if (CheckMark(TargetPawn,vecTarget,true) == none)
    {  // didn't fire for some reason, log error
       s = string(name) $ &quot; Couldn't find a valid cannon to fire on Target at: &quot; $ string(vecTarget);
       Log(s);
    }
    else
    {  // successfully fired, so reset timer
       bWaitingToFire=true;
       SetTimer(resetTime,false);
    }
}

// Checks if any pawns are touching the volume when it is re-activated
function CheckIfTouching()
{
	local actor A;

    // Don't fire if we're over the max number of firings
    if ( (maxFires&gt;0) &amp;&amp; (firingCount &gt;= maxFires))
       return;

	foreach TouchingActors(class'Actor', A)
	{
        Log(&quot;Found a touching actor&quot;);
        if ( Pawn(A) != none )
        {
            Log(&quot;Found a touching Pawn&quot;);
           	if ( Pawn(A).IsPlayerPawn() )
           	{
                 Log(&quot;Found a touching PlayerPawn, firing...&quot;);
                 FireCannon(Pawn(A));       // we found a player touching the volume, so FIRE!
           	     return;
           	}
        }
    }
}

// Re-Activates cannon after time delay
function Timer()
{
	bWaitingToFire=false;
	CheckIfTouching();
}


defaultproperties
{
   maxFires=0
   resetTime=30
   bTargetPlayer=true
   bWaitingToFire=false
   bStatic=false
}
&lt;/uscript&gt;

The &lt;tt&gt;IonTriggerTarget&lt;/tt&gt; class is nothing but placeable subclass of &lt;tt&gt;Actor -&gt; Info&lt;/tt&gt; and there's not really any code for it.

==Discussion==

'''Anozireth:''' This is my first real contribution here, so I hope you guys like it!  I'm up way past my bedtime tonight so I'll have to polish this off tomorrow evening :-)

'''EntropicLqd:''' Nice.  About the only change I would make to the code would be to move the checks for invalid parameters into either the PreBeingPlay() or PostBeingPlay() function.  You might also want an option for an infinite amount of fires.  Pretty cool though - good job well done :).

'''Jimbo:''' Indeed! I've been after a script like this for some time. Thanks for your help! (check your email, Tom)

'''Anozireth:''' EntropicLqd - I forgot to mention it in the description (at first, I added it now) but it was already in the code, 0 = infinite firings :-) I'll see if I can rework it to get those checks into one of those two functions you mentioned. Jimbo, I'll write you back on that email later today, for now I gotta get to work here.  Thanks for the positive feed back guys, I'm glad you liked it!  

'''Anozireth:''' I just noticed a small bug that would allow the volume to exceed its &lt;tt&gt;maxFires&lt;/tt&gt; if a player was standing in it when the &lt;tt&gt;CheckIfTouching&lt;/tt&gt; function was called.  I've updated the code here and the download with the new package.

~~ You could simplify this by using a [[Legacy:LookTarget|LookTarget]] instead of the custom target class. 

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1506</id>
      <timestamp>2004-08-11T16:34:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Download IonTrigger Package==

http://www.geocities.com/Anozireth/IonTrigger.html

==Description==

This package provides a pair of classes that allow the mapper to place a volume that will trigger the firing of an [[Legacy:IonCannon|IonCannon]].  It allows the mapper to specify either a fixed targer or the triggering player as the target.  It also allows the mapper to set the minimum time between firings and the maximum number of firings.

==How to use==

Simply place an &lt;tt&gt;IonTriggerVolume&lt;/tt&gt; in the map where you want it, and an [[Legacy:IonCannon|IonCannon]] that can see intended area of the target.  Then configure the following settings:

; bTargetPlayer : If set to true, it will attempt to target the player which triggered it.  If set to false it will target the IonTarget
; IonTarget : Optional : An Actor of the IonTriggerTarget class at the point to be targeted.  Note that there are no configuration options for the IonTriggerTarget.
; maxFires : The maximum number of times this volume can trigger a firing.  0 = infinite
; resetTime : The minimum time between firings.  Note that each individual cannon takes about 3 seconds to reload, so a value of less than 3 is not recommended, and may cause the cannon to not refire properly if a player is still staning in the volume when the timer resets.

==Source Code==

&lt;uscript&gt;
//-----------------------------------------------------------
//  IonTriggerVolume - A volume that can be used to trigger an IonCannon.
//  By Tom Nicholson, aka Anozireth
//  anozireth@yahoo.com
//-----------------------------------------------------------
class IonTriggerVolume extends Volume;

var() IonTriggerTarget IonTarget;   // designated target
var() bool bTargetPlayer;            // Targets triggering actor if true, otherwise targets IonTarget
var() float resetTime;                // Time between fires.  This should be &gt; 0
var() int maxFires;                   // Maximum number of times this volume can trigger a firing.  0 = infinite

var bool bWaitingToFire;            // can we fire right now?
var int firingCount;                // How many times we've triggered a firing

event touch(Actor Other)
{
	// Don't fire if not enough time has elapsed since the last firing
    if (bWaitingToFire)
	   return;

    // Don't fire if we're over the max number of firings
    if ( (maxFires&gt;0) &amp;&amp; (firingCount &gt;= maxFires))
       return;

    if ( Pawn(Other) != none )
       	if ( Pawn(Other).IsPlayerPawn() )
            FireCannon(Pawn(Other));       // if the touch was by a player, then FIRE!
}

function IonCannon CheckMark(Pawn TargetPawn, vector MarkLocation, bool bFire)
{
	local IonCannon I;

    // iterate through all cannons in the map until we can find one that can hit our target
	foreach DynamicActors(class'IonCannon', I)
	{
	    // Found a cannon, try to fire it and check if it succeeded.
		if ( I.CheckMark(Instigator,MarkLocation,bFire) )
		{
            firingCount++;   // Keep track of how many times we've triggered a firing
			return I;
		}
	}
    // didn't find a cannon that could hit the target
	return None;
}

function FireCannon(Pawn TargetPawn)
{
local vector vecTarget;     // Location aimed at by cannon
local vector vecNorm;       // not really used, just required by trace
local string s;

    // Trace straight down from the target.
    // Cannons don't seem to like shooting at points that aren't on the ground.
    if (bTargetPlayer || (IonTarget == none))  // Target the triggering player
       Trace(vecTarget,vecNorm,TargetPawn.Location+Vect(0,0,-10000), TargetPawn.Location, false);
    else    // Target the map specified target
       Trace(vecTarget,vecNorm,IonTarget.Location+Vect(0,0,-10000), IonTarget.Location, false);

    // Try to actually find a cannon and fire it
    if (CheckMark(TargetPawn,vecTarget,true) == none)
    {  // didn't fire for some reason, log error
       s = string(name) $ &quot; Couldn't find a valid cannon to fire on Target at: &quot; $ string(vecTarget);
       Log(s);
    }
    else
    {  // successfully fired, so reset timer
       bWaitingToFire=true;
       SetTimer(resetTime,false);
    }
}

// Checks if any pawns are touching the volume when it is re-activated
function CheckIfTouching()
{
	local actor A;

    // Don't fire if we're over the max number of firings
    if ( (maxFires&gt;0) &amp;&amp; (firingCount &gt;= maxFires))
       return;

	foreach TouchingActors(class'Actor', A)
	{
        Log(&quot;Found a touching actor&quot;);
        if ( Pawn(A) != none )
        {
            Log(&quot;Found a touching Pawn&quot;);
           	if ( Pawn(A).IsPlayerPawn() )
           	{
                 Log(&quot;Found a touching PlayerPawn, firing...&quot;);
                 FireCannon(Pawn(A));       // we found a player touching the volume, so FIRE!
           	     return;
           	}
        }
    }
}

// Re-Activates cannon after time delay
function Timer()
{
	bWaitingToFire=false;
	CheckIfTouching();
}


defaultproperties
{
   maxFires=0
   resetTime=30
   bTargetPlayer=true
   bWaitingToFire=false
   bStatic=false
}
&lt;/uscript&gt;

The &lt;tt&gt;IonTriggerTarget&lt;/tt&gt; class is nothing but placeable subclass of &lt;tt&gt;Actor -&gt; Info&lt;/tt&gt; and there's not really any code for it.

==Discussion==

'''Anozireth:''' This is my first real contribution here, so I hope you guys like it!  I'm up way past my bedtime tonight so I'll have to polish this off tomorrow evening :-)

'''EntropicLqd:''' Nice.  About the only change I would make to the code would be to move the checks for invalid parameters into either the PreBeingPlay() or PostBeingPlay() function.  You might also want an option for an infinite amount of fires.  Pretty cool though - good job well done :).

'''Jimbo:''' Indeed! I've been after a script like this for some time. Thanks for your help! (check your email, Tom)

'''Anozireth:''' EntropicLqd - I forgot to mention it in the description (at first, I added it now) but it was already in the code, 0 = infinite firings :-) I'll see if I can rework it to get those checks into one of those two functions you mentioned. Jimbo, I'll write you back on that email later today, for now I gotta get to work here.  Thanks for the positive feed back guys, I'm glad you liked it!  

'''Anozireth:''' I just noticed a small bug that would allow the volume to exceed its &lt;tt&gt;maxFires&lt;/tt&gt; if a player was standing in it when the &lt;tt&gt;CheckIfTouching&lt;/tt&gt; function was called.  I've updated the code here and the download with the new package.

~~ You could simplify this by using a [[Legacy:LookTarget|LookTarget]] instead of the custom target class. 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Anthony</title>
    <id>401</id>
    <revision>
      <id>1338</id>
      <timestamp>2002-12-11T01:00:21Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Highlander:''' Hello and welcome to the wiki :)

'''Tarquin:''' Hi &amp; welcome :D

'''Anthony:''' Hi again :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1339</id>
      <timestamp>2002-12-11T00:49:32Z</timestamp>
      <contributor>
        <ip>Anthony</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Highlander:''' Hello and welcome to the wiki :)

'''Tarquin:''' Hi &amp; welcome :D

'''Anthony:''' Hi again :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AntiPortalActor</title>
    <id>28855</id>
    <revision>
      <id>42782</id>
      <timestamp>2010-03-30T16:19:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Antiportal</title>
    <id>380</id>
    <revision>
      <id>1286</id>
      <timestamp>2007-07-13T19:58:27Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Antiportals''' are a new concept in [[Legacy:Unreal Engine Versions|version 2]] of the [[Legacy:Unreal Engine|Unreal Engine]], [[Legacy:UT2003|UT2003]] and onward. For more information on the transition from older versions, see [[Legacy:Occlusion Changes For UnrealEngine2|Occlusion changes for UnrealEngine2]].

They aren't a type of portal, and in fact shouldn't really be called &quot;antiportal&quot; at all. They are '''occluding planes''': they prevent the rendering of things behind them.

==Two flavours==

===AntiPortal Surfaces===

There are two ways you do this:

* define special planes with a special kind of Antiportal brush
* label particular BSP surfaces as antiportals, which causes them to occlude

===AntiPortalActor (the volume-ish kind)===

This type of '''Antiportal''' is a type of [[Legacy:Brush|brush]]. It is placed with the special [[Legacy:Toolbox|toolbox]] button and shows up as brown wireframe model, similar to a volume. Hiding volumes (key O by default) will hide AntiPortalActors as well.

===Behavior===

An Antiportal speeds up the rendering of a view by occluding (hiding) everything (geometry, actors etc) ''behind'' itself.  This has the effect of reducing the [[Legacy:Polycount|polycount]] (the number of polygons visible) from a particular location and therefore speeds the level up.

Although Antiportals can be placed in solid space (that is outside of the level) they must be touching some subtracted space in order to be considered by the rendering engine &amp;ndash; this is so the engine knows which zone the antiportal affects. Also, an Antiportal will only be considered for occlusion if the zone(s) the Antiportal exists within is visible within the current viewport.  If an Antiportal is used by the rendering engine then the entire Antiportal is used, whether it be in solid or substracted space.

{|

|-
|Not true for recent builds at least:
|
&lt;font color=&quot;#444444&quot;&gt;Antiportals are always treated as a cube.  Though you can use a convex (see warning section) brush of any shape and size to make an AntiPortal, the resulting area it occludes will '''always''' be a box based on the extents of the original brush. This ''box'' rotates with the brush, so you can have diagonal boxes for occlusion.&lt;/font&gt;

|}

AntiPortalActors may use any convex brush as their source geometry.  However, to make their processing fast you should only use extrmely simple brushes, such as sheets.

An Antiportal will occlude different parts of the [[Legacy:Unreal World|Unreal World]] in different ways:
* [[Legacy:BSP|BSP]] on a node by node basis 
* if the bounding sphere of a [[Legacy:Static Mesh|static mesh]] is visible the entire mesh will be rendered.  
* an Antiportal will occlude [[Legacy:Terrain|terrain]] in 16x16 blocks.  So even if a small part of a 16x16 block is visible the whole block will be rendered.

An Antiportal should never be substantially visible to the player - it should always be hidden within a static mesh or other &quot;solid&quot; part of a level.  It's usually OK if the corners stick out a bit as it's unlikely that the player would notice any occlusion errors that small (but test from a wide range of angles to make sure it looks OK).  It is, however, critical that the player not be allowed to (even for an instant) get their camera inside the anti-portal volume.  If this happens the world stops rendering (even objects intersecting with the antiportal) and a [[Legacy:Hall Of Mirrors|Hall Of Mirrors]] rendering errors will occur until they move back outside of the antiportal.

===Zone Antiportals===

The game [[Legacy:Devastation|Devastation]] adds a new type of Antiportal &amp;ndash; the Zone Anitportal.

Zone AntiPortals are used to cut down on the number of AntiPortals needed for a single building.  The idea is if you have a building with a room inside it, that building should occlude what's behind it.  With UT2k3, that means added a number of AntiPortals around the building, making sure not to cover up any of the inside of the building or the doorway.  This means for a single building you're using maybe 6 AntiPortals for a building that may only be a basic box.  Zone AntiPortals let you select the ZoneInfo of zones you don't wish the Zone AntiPortal to occlude.  This means you can have a big building with a room inside, and only one big Zone AntiPortal that occludes everything behind the building, but doesn't occlude the room.

There are some quirks around using the Zone AntiPortals as they cannot cover the Zone Portal which looks in to the zone you don't want it to occlude, as the Zone Portal actually exists in the zone you're in, and not in the zone you're trying not to occlude.

There may also be some issues with listing multiple ZoneInfos in the Zone AntiPortal's ZoneInfo list where only one or some of the zones are not occluded.  Sometimes it works, sometimes it doesn't.  Some of the bugs with this were fixed near the end of the development of the game so it might work now.

The map ''SP3M5-Bukko'' is a good example of the different occlusion techniques as that uses zone occlusion, AntiPortals, and Zone AntiPortals together.  The small store the troopers use as their first spawner base is a Zone AntiPortal, and there are regular AntiPortals on both sides of that street.

It is not known whether Zone Antiportals have now been integrated into the main Unreal Engine.

==BSP Surface Anti-portals==

''note: I'm calling these Anti-portals (with a hyphen) as the Surface Properties window calls them that.''

Anti-portals work very similarly to AntiPortalActors.  They occlude objects entirely behind them.  The advantage with BSP surface Anti-portals is that if you already have BSP in the right places you don't have to add new objects to the map.  There are several issues with BSP surface anti-portals however.

Most significantly, the original brush geometry is used, not the geometry exposed in the map.  This means you can't flag a wall that you cut a doorway through as an anti-portal because the original polygon (without the doorway cut out of it) will be used for occlusion.

The second issue with BSP surface Anti-portals is that each surface is treated as a separate anti-portal.  Because an object is only occluded is if is entirely hidden by one anti-portal, if an object is behind the seam between two BSP anti-portals it will be visible.

In general you should stay away from BSP surface Anti-portals unless they precisely fit the needs of your map.  A significant number of the standard and bonus pack maps use BSP surface Anti-portals, but I believe this may be because AntiPortalActors only became available shortly before UT2003 shipped.

==Triggerable AntiPortalActors==

'''Note:''' Only tested in UT2004, but should work in UT2003 as well.

This combination is a great way to use AntiPortalActors for '''door'''s or '''Destroyable Objective SM'''s. For example, you have a nice decorated tunnel, with a destroyable door or a standard door at the entrance of it, you want to occlude the decorations, but placing AntiPortalActors to the entrance will hide most of the tunnel, even if the entrance door is opened or destroyed. Triggered AntiPortalActors are here to solve this problem. AntiPortalActors are always activated, but they are deactivateable (and reactivateable)!

!Now let's create it!:

====Destroyable Doors====
#[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; DestroyableObjective &gt;&gt; DestroyableObjective_SM, select a cool static mesh for it, and move it into the needed place
#Place the AntiPortalActor to the correct place (inside or behind the DestroyableObjective_SM), and [[Legacy:Set The Following Properties|set the following properties]]:
#*Events -&gt; Tag = MyTriggeredAP
#*Object -&gt; InitialState = TriggerToggle
#Select your Destroyable Objective SM, [[Legacy:Set The Following Properties|set the following properties]]:

*DestroyableObjective_SM -&gt; AntiPortalTag = MyTriggeredAP

Our DestroyableObjective will deactivate the MyTriggeredAP tagged AntiPortalActor, when the objective is destroyed

#Check it in-game!

====Standard Doors====
#Create the whole door (including [[Legacy:Mover|Mover]]s, [[Legacy:Trigger|Trigger]]s, but NavigationPoints don't affect our AP)
#Place the AntiPortalActor to the correct place (inside the door), and [[Legacy:Set The Following Properties|set the following properties]]:
#*Events -&gt; Tag = MyDoorAP
#*Object -&gt; InitialState = TriggerControl
#Select one of your Door's mover (only 1 mover if 2 movers for 1 door), [[Legacy:Set The Following Properties|set the following properties]]:

*Mover -&gt; AntiPortalTag = MyDoorAP

The door will deactivate the MyDoorAP tagged AntiPortalActor, when the door starts opening, and will reactivate it when completely closed.

#Check it in-game!

====Examples====

Power Station Access Door - AS-Glacier

Suprise Door at Power Station - AS-Glacier

==An Example==

Imagine a level that has many static meshes that are &quot;possibly&quot; in the field of view, but most of them are obscured by a single mesh in the center of the level.  A static mesh does not cause other meshes behind it to be discarded from the rendering queue as it will not occlude anything behind it.  This means that all meshes within the field of view are rendered.

By placing an Antiportal into the center of the large static mesh in the middle of the level we force some occlusion to occur.  The performance of the level would be increased as all of the static meshes completely behind the Antiportal would not be rendered.

Antiportals are particularly useful within maps that are based &quot;outdoors&quot; or have large areas of terrain.  In these environments creating zones becomes problematic because of the ''ceiling height''.

==A Warning==

AntiPortals are slow, and should be used sparingly in most cases.  Once the number of Antiportals in use starts to increase, the number of AntiPortals starts to negate the rendering benefit of having those areas occluded.  Also, it should be mentioned that though AntiPortals are created from brushes (that includes both 3d shapes and 2d [[Legacy:Sheet|sheet]]s), they are not brushes themselves.  &lt;/font color=&quot;#444444&quot;&gt;In fact, though you can use brushes of any shape and size to make AntiPortals, the resulting area they occlude will ALWAYS be a box based on the extents of the original brush.  This &quot;box&quot; rotates with the brush, so you can have diagonal boxes for occlusion.&lt;/font&gt;

'''Wormbo:''' That can't be correct. If AntiPortals were boxes, you'd see a lot more HOM effects. Can anyone confirm this, please? [[:Category:Legacy Answer Needed]]

'''EntropicLqd:''' That is correct.  Anti-portals are always hidden in other brushes or within mountains and stuff - which is why you don't see the HOM effects - there is always geometry in front.  It'll be interesting to see if they are supported by UE3.

'''Wormbo:''' I used pyramid-shaped (square base, tip down) antiportals in JB-Aswan-v2 and both real-time wireframe view in UEd and rmode 1 in game suggest that they really occlude stuff behind the pyramid (i.e. ''not'' a box) shape.

'''EntropicLqd:''' Interesting.  I've not done any mapping with the 2K4 editor - it's entirely possible that Epic ''improved'' their behaviour to make it more intuitive.  I would expect rmode 1 to be the &quot;arbiter of truth though&quot;.   Certianly the description fits with how I remember it working in Devastation (although that was a long long time ago, and before 2K3 &amp; 2K4).

The CPU overhead for occlusion with boxes and sheets are actually the same, as AntiPortals treat sheets as infinitely thin boxes.  The CPU overhead for 8-sided cylinders is about 50% higher than for boxes, but this might be worth it if you only have a handful of complex static meshes up for occlusion.

If an Antiportal volume is not convex it will cause the game to hang as soon as the offending concave Antiportal is in view. (actually this is not true, last I tried it with the latest version of UT2004 it will just cause the antiportal to stop working entirely) A convex shape is one where the angle from any vertex to any other vertex is &lt;= 180 degrees.  A simpler way to think of it is that a straight line drawn between any two points on the surface of the shape must not go outside the shape.

Finally Sheets created in the 2D Shape Editor will not work as AntiPortalActors.  I'm not exactly sure what the deal is, but if their in the view frustum they occlude EVERYTHING.  You can use them as BSP surface Anti-portals just fine however.

==Seeing the Antiportal Effect==

Within UT2003 (works in devastation too) type ''RMODE 1'' into the Console (see [[Legacy:Console Commands|Console Commands]] for more information).  This will place the renderer into wireframe mode.  Static meshes and brushes will not be shown within this view if they are fully behind an Antiportal.

In UnrealEd, do the following in a 3D viewport:

* activate [[Legacy:Realtime Preview|realtime preview]]
* Toggle [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; View -&gt; Show Volumes to show [[Legacy:Volume|volume]]s
* view complexity mode (last button, funky green-&gt;red color ramp) can be useful to see if your antiportals are working.  Turning off terrain (hit 't') and BSP (hit 'q') will let you see static mesh overdraw.

==Related Topics==

See the following pages for more information on level optimization.
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Zoning|Zoning]]
* [[udn2:LevelOptimization]] - The UDN's level optimisation page.
* [[udn2:VolumesTutorial]] - the AntiPortalActors section at the bottom.

==Discussion==

'''Foxpaw:''' Above it refers to the &quot;bounding sphere&quot; of a static mesh. Is that referring to the collision data of the static mesh or something else?

'''inio:''' Bounding spheres are used for visibility (GetRenderBoundingSphere) and probably also for the first pass of collision tests.  Spheres are used because plane/sphere and sphere/sphere tests are extremely fast.

'''inio:''' I added some info on Anti-portal BSP surfaces and expanded the AntiPortalActor section a bit.  Also, all the bits about the bounding box being used for AntiPortalActors seem to be entirely incorrect (under no circumstances did I ever see the bounding box used instead of the actual geometry).

My testing methods for collecting data about what works, what doesn't, and performance:
#Make a 8k square cube
# by recursive duplication, spread about 4000 EffectMehses.DirtChunk_01aw static meshes around about say 4k square on the floor and scale them up a bit (drawscale = 3)
#  for various antiportal setups, place 64 identical antiportals above this, with the camera locked in place at the top of the center of the 8k room looking straight down.

'''Tarquin:''' Roughly how many APs is ok &amp;ndash; is there any rule of thumb, say, for the number of zones in the map, of the number of static meshes in total, or something?

'''EntropicLqd:''' Its going back a bit (and I've lost the original email due to a HD crash) but I remember the guy from the Devastation dev. team saying that once the number of AP's got above 9 they tended to become prohibitively expensive.  That's on an earlier version of the engine though so some optimisation has almost certainly taken place.

'''Ragdoll:'''Ive seen devastation maps with way more antiportals than that. Im not sure sure if theres a limit to the number of zone antiportals you can have before it starts to become too costly though.

'''MythOpus:''' But do any of the Devestation maps use the newer level area occlude methods too?  I forget what it is and how to do it.  There's a page on the wiki but it involves telling the renderer to just not render certain parts of the map based on where the player is.  Its different from the Anti-Portals and if you use both in conjunction it would probably ignore the limits and run better.  Perhaps they've used that?

[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1287</id>
      <timestamp>2007-07-13T19:04:23Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Interesting .. description fits with Devesation - could be out of date though</comment>
      <text xml:space="preserve">'''Antiportals''' are a new concept in [[Legacy:Unreal Engine Versions|version 2]] of the [[Legacy:Unreal Engine|Unreal Engine]], [[Legacy:UT2003|UT2003]] and onward. For more information on the transition from older versions, see [[Legacy:Occlusion Changes For UnrealEngine2|Occlusion changes for UnrealEngine2]].

They aren't a type of portal, and in fact shouldn't really be called &quot;antiportal&quot; at all. They are '''occluding planes''': they prevent the rendering of things behind them.

==Two flavours==

===AntiPortal Surfaces===

There are two ways you do this:

* define special planes with a special kind of Antiportal brush
* label particular BSP surfaces as antiportals, which causes them to occlude

===AntiPortalActor (the volume-ish kind)===

This type of '''Antiportal''' is a type of [[Legacy:Brush|brush]]. It is placed with the special [[Legacy:Toolbox|toolbox]] button and shows up as brown wireframe model, similar to a volume. Hiding volumes (key O by default) will hide AntiPortalActors as well.

===Behavior===

An Antiportal speeds up the rendering of a view by occluding (hiding) everything (geometry, actors etc) ''behind'' itself.  This has the effect of reducing the [[Legacy:Polycount|polycount]] (the number of polygons visible) from a particular location and therefore speeds the level up.

Although Antiportals can be placed in solid space (that is outside of the level) they must be touching some subtracted space in order to be considered by the rendering engine &amp;ndash; this is so the engine knows which zone the antiportal affects. Also, an Antiportal will only be considered for occlusion if the zone(s) the Antiportal exists within is visible within the current viewport.  If an Antiportal is used by the rendering engine then the entire Antiportal is used, whether it be in solid or substracted space.

{|

|-
|Not true for recent builds at least:
|
&lt;font color=&quot;#444444&quot;&gt;Antiportals are always treated as a cube.  Though you can use a convex (see warning section) brush of any shape and size to make an AntiPortal, the resulting area it occludes will '''always''' be a box based on the extents of the original brush. This ''box'' rotates with the brush, so you can have diagonal boxes for occlusion.&lt;/font&gt;

|}

AntiPortalActors may use any convex brush as their source geometry.  However, to make their processing fast you should only use extrmely simple brushes, such as sheets.

An Antiportal will occlude different parts of the [[Legacy:Unreal World|Unreal World]] in different ways:
* [[Legacy:BSP|BSP]] on a node by node basis 
* if the bounding sphere of a [[Legacy:Static Mesh|static mesh]] is visible the entire mesh will be rendered.  
* an Antiportal will occlude [[Legacy:Terrain|terrain]] in 16x16 blocks.  So even if a small part of a 16x16 block is visible the whole block will be rendered.

An Antiportal should never be substantially visible to the player - it should always be hidden within a static mesh or other &quot;solid&quot; part of a level.  It's usually OK if the corners stick out a bit as it's unlikely that the player would notice any occlusion errors that small (but test from a wide range of angles to make sure it looks OK).  It is, however, critical that the player not be allowed to (even for an instant) get their camera inside the anti-portal volume.  If this happens the world stops rendering (even objects intersecting with the antiportal) and a [[Legacy:Hall Of Mirrors|Hall Of Mirrors]] rendering errors will occur until they move back outside of the antiportal.

===Zone Antiportals===

The game [[Legacy:Devastation|Devastation]] adds a new type of Antiportal &amp;ndash; the Zone Anitportal.

Zone AntiPortals are used to cut down on the number of AntiPortals needed for a single building.  The idea is if you have a building with a room inside it, that building should occlude what's behind it.  With UT2k3, that means added a number of AntiPortals around the building, making sure not to cover up any of the inside of the building or the doorway.  This means for a single building you're using maybe 6 AntiPortals for a building that may only be a basic box.  Zone AntiPortals let you select the ZoneInfo of zones you don't wish the Zone AntiPortal to occlude.  This means you can have a big building with a room inside, and only one big Zone AntiPortal that occludes everything behind the building, but doesn't occlude the room.

There are some quirks around using the Zone AntiPortals as they cannot cover the Zone Portal which looks in to the zone you don't want it to occlude, as the Zone Portal actually exists in the zone you're in, and not in the zone you're trying not to occlude.

There may also be some issues with listing multiple ZoneInfos in the Zone AntiPortal's ZoneInfo list where only one or some of the zones are not occluded.  Sometimes it works, sometimes it doesn't.  Some of the bugs with this were fixed near the end of the development of the game so it might work now.

The map ''SP3M5-Bukko'' is a good example of the different occlusion techniques as that uses zone occlusion, AntiPortals, and Zone AntiPortals together.  The small store the troopers use as their first spawner base is a Zone AntiPortal, and there are regular AntiPortals on both sides of that street.

It is not known whether Zone Antiportals have now been integrated into the main Unreal Engine.

==BSP Surface Anti-portals==

''note: I'm calling these Anti-portals (with a hyphen) as the Surface Properties window calls them that.''

Anti-portals work very similarly to AntiPortalActors.  They occlude objects entirely behind them.  The advantage with BSP surface Anti-portals is that if you already have BSP in the right places you don't have to add new objects to the map.  There are several issues with BSP surface anti-portals however.

Most significantly, the original brush geometry is used, not the geometry exposed in the map.  This means you can't flag a wall that you cut a doorway through as an anti-portal because the original polygon (without the doorway cut out of it) will be used for occlusion.

The second issue with BSP surface Anti-portals is that each surface is treated as a separate anti-portal.  Because an object is only occluded is if is entirely hidden by one anti-portal, if an object is behind the seam between two BSP anti-portals it will be visible.

In general you should stay away from BSP surface Anti-portals unless they precisely fit the needs of your map.  A significant number of the standard and bonus pack maps use BSP surface Anti-portals, but I believe this may be because AntiPortalActors only became available shortly before UT2003 shipped.

==Triggerable AntiPortalActors==

'''Note:''' Only tested in UT2004, but should work in UT2003 as well.

This combination is a great way to use AntiPortalActors for '''door'''s or '''Destroyable Objective SM'''s. For example, you have a nice decorated tunnel, with a destroyable door or a standard door at the entrance of it, you want to occlude the decorations, but placing AntiPortalActors to the entrance will hide most of the tunnel, even if the entrance door is opened or destroyed. Triggered AntiPortalActors are here to solve this problem. AntiPortalActors are always activated, but they are deactivateable (and reactivateable)!

!Now let's create it!:

====Destroyable Doors====
#[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; DestroyableObjective &gt;&gt; DestroyableObjective_SM, select a cool static mesh for it, and move it into the needed place
#Place the AntiPortalActor to the correct place (inside or behind the DestroyableObjective_SM), and [[Legacy:Set The Following Properties|set the following properties]]:
#*Events -&gt; Tag = MyTriggeredAP
#*Object -&gt; InitialState = TriggerToggle
#Select your Destroyable Objective SM, [[Legacy:Set The Following Properties|set the following properties]]:

*DestroyableObjective_SM -&gt; AntiPortalTag = MyTriggeredAP

Our DestroyableObjective will deactivate the MyTriggeredAP tagged AntiPortalActor, when the objective is destroyed

#Check it in-game!

====Standard Doors====
#Create the whole door (including [[Legacy:Mover|Mover]]s, [[Legacy:Trigger|Trigger]]s, but NavigationPoints don't affect our AP)
#Place the AntiPortalActor to the correct place (inside the door), and [[Legacy:Set The Following Properties|set the following properties]]:
#*Events -&gt; Tag = MyDoorAP
#*Object -&gt; InitialState = TriggerControl
#Select one of your Door's mover (only 1 mover if 2 movers for 1 door), [[Legacy:Set The Following Properties|set the following properties]]:

*Mover -&gt; AntiPortalTag = MyDoorAP

The door will deactivate the MyDoorAP tagged AntiPortalActor, when the door starts opening, and will reactivate it when completely closed.

#Check it in-game!

====Examples====

Power Station Access Door - AS-Glacier

Suprise Door at Power Station - AS-Glacier

==An Example==

Imagine a level that has many static meshes that are &quot;possibly&quot; in the field of view, but most of them are obscured by a single mesh in the center of the level.  A static mesh does not cause other meshes behind it to be discarded from the rendering queue as it will not occlude anything behind it.  This means that all meshes within the field of view are rendered.

By placing an Antiportal into the center of the large static mesh in the middle of the level we force some occlusion to occur.  The performance of the level would be increased as all of the static meshes completely behind the Antiportal would not be rendered.

Antiportals are particularly useful within maps that are based &quot;outdoors&quot; or have large areas of terrain.  In these environments creating zones becomes problematic because of the ''ceiling height''.

==A Warning==

AntiPortals are slow, and should be used sparingly in most cases.  Once the number of Antiportals in use starts to increase, the number of AntiPortals starts to negate the rendering benefit of having those areas occluded.  Also, it should be mentioned that though AntiPortals are created from brushes (that includes both 3d shapes and 2d [[Legacy:Sheet|sheet]]s), they are not brushes themselves.  &lt;/font color=&quot;#444444&quot;&gt;In fact, though you can use brushes of any shape and size to make AntiPortals, the resulting area they occlude will ALWAYS be a box based on the extents of the original brush.  This &quot;box&quot; rotates with the brush, so you can have diagonal boxes for occlusion.&lt;/font&gt;

'''Wormbo:''' That can't be correct. If AntiPortals were boxes, you'd see a lot more HOM effects. Can anyone confirm this, please? [[:Category:Legacy Answer Needed]]

'''EntropicLqd:''' That is correct.  Anti-portals are always hidden in other brushes or within mountains and stuff - which is why you don't see the HOM effects - there is always geometry in front.  It'll be interesting to see if they are supported by UE3.

'''Wormbo:''' I used pyramid-shaped (square base, tip down) antiportals in JB-Aswan-v2 and both real-time wireframe view in UEd and rmode 1 in game suggest that they really occlude stuff behind the pyramid (i.e. ''not'' a box) shape.

'''EntropicLqd:''' Interesting.  I've not done any mapping with the 2K4 editor - it's entirely possible that Epic ''improved'' their behaviour to make it more intuitive.  I would expect rmode 1 to be the &quot;arbiter of truth though&quot;.   Certianly the description fits with how I remember it working in Devastation (although that was a long long time ago, and before 2K3 &amp; 2K4).

The CPU overhead for occlusion with boxes and sheets are actually the same, as AntiPortals treat sheets as infinitely thin boxes.  The CPU overhead for 8-sided cylinders is about 50% higher than for boxes, but this might be worth it if you only have a handful of complex static meshes up for occlusion.

If an Antiportal volume is not convex it will cause the game to hang as soon as the offending concave Antiportal is in view. (actually this is not true, last I tried it with the latest version of UT2004 it will just cause the antiportal to stop working entirely) A convex shape is one where the angle from any vertex to any other vertex is &lt;= 180 degrees.  A simpler way to think of it is that a straight line drawn between any two points on the surface of the shape must not go outside the shape.

Finally Sheets created in the 2D Shape Editor will not work as AntiPortalActors.  I'm not exactly sure what the deal is, but if their in the view frustum they occlude EVERYTHING.  You can use them as BSP surface Anti-portals just fine however.

==Seeing the Antiportal Effect==

Within UT2003 (works in devastation too) type ''RMODE 1'' into the Console (see [[Legacy:Console Commands|Console Commands]] for more information).  This will place the renderer into wireframe mode.  Static meshes and brushes will not be shown within this view if they are fully behind an Antiportal.

In UnrealEd, do the following in a 3D viewport:

* activate [[Legacy:Realtime Preview|realtime preview]]
* Toggle [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; View -&gt; Show Volumes to show [[Legacy:Volume|volume]]s
* view complexity mode (last button, funky green-&gt;red color ramp) can be useful to see if your antiportals are working.  Turning off terrain (hit 't') and BSP (hit 'q') will let you see static mesh overdraw.

==Related Topics==

See the following pages for more information on level optimization.
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Zoning|Zoning]]
* [[udn2:LevelOptimization]] - The UDN's level optimisation page.
* [[udn2:VolumesTutorial]] - the AntiPortalActors section at the bottom.

==Discussion==

'''Foxpaw:''' Above it refers to the &quot;bounding sphere&quot; of a static mesh. Is that referring to the collision data of the static mesh or something else?

'''inio:''' Bounding spheres are used for visibility (GetRenderBoundingSphere) and probably also for the first pass of collision tests.  Spheres are used because plane/sphere and sphere/sphere tests are extremely fast.

'''inio:''' I added some info on Anti-portal BSP surfaces and expanded the AntiPortalActor section a bit.  Also, all the bits about the bounding box being used for AntiPortalActors seem to be entirely incorrect (under no circumstances did I ever see the bounding box used instead of the actual geometry).

My testing methods for collecting data about what works, what doesn't, and performance:
#Make a 8k square cube
# by recursive duplication, spread about 4000 EffectMehses.DirtChunk_01aw static meshes around about say 4k square on the floor and scale them up a bit (drawscale = 3)
#  for various antiportal setups, place 64 identical antiportals above this, with the camera locked in place at the top of the center of the 8k room looking straight down.

'''Tarquin:''' Roughly how many APs is ok &amp;ndash; is there any rule of thumb, say, for the number of zones in the map, of the number of static meshes in total, or something?

'''EntropicLqd:''' Its going back a bit (and I've lost the original email due to a HD crash) but I remember the guy from the Devastation dev. team saying that once the number of AP's got above 9 they tended to become prohibitively expensive.  That's on an earlier version of the engine though so some optimisation has almost certainly taken place.

'''Ragdoll:'''Ive seen devastation maps with way more antiportals than that. Im not sure sure if theres a limit to the number of zone antiportals you can have before it starts to become too costly though.

[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Aphelion</title>
    <id>378</id>
    <revision>
      <id>1280</id>
      <timestamp>2006-12-02T03:09:54Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Orphan page hunting.</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Wiki, Aphelion.  Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.  :-)

'''Tarquin:''' Hi Aphelion. Interesting stuff in your developer journal.

'''ZxAnPhOrIaN:''' Hello! :)

'''Highlander:''' Hullo fancy meeting you here. Who let you out of your cage? Get back to work! /me cracks whip :P j/k

'''Aphelion:''' Thankyou for your welcome.  Wow, somebody's actually reading my journal...  I think I'd really better crackdown on my lousy spelling, grammar and typos...

==Aph's Personal Page==

===Projects===

====uCOM====

Coder, main gametype coder.

====UnF====

Assault gamefix, currently put on hold.

===Links===

http://www.unreal-command.com  The uCOM webpage

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1281</id>
      <timestamp>2002-08-15T04:51:02Z</timestamp>
      <contributor>
        <ip>Pc-62-30-157-188-hw.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Wiki, Aphelion.  Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.  :-)

'''Tarquin:''' Hi Aphelion. Interesting stuff in your developer journal.

'''ZxAnPhOrIaN:''' Hello! :)

'''Highlander:''' Hullo fancy meeting you here. Who let you out of your cage? Get back to work! /me cracks whip :P j/k

'''Aphelion:''' Thankyou for your welcome.  Wow, somebody's actually reading my journal...  I think I'd really better crackdown on my lousy spelling, grammar and typos...</text>
    </revision>
    <revision>
      <id>1282</id>
      <timestamp>2002-10-13T14:40:40Z</timestamp>
      <contributor>
        <ip>Aphelion</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Wiki, Aphelion.  Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.  :-)

'''Tarquin:''' Hi Aphelion. Interesting stuff in your developer journal.

'''ZxAnPhOrIaN:''' Hello! :)

'''Highlander:''' Hullo fancy meeting you here. Who let you out of your cage? Get back to work! /me cracks whip :P j/k

'''Aphelion:''' Thankyou for your welcome.  Wow, somebody's actually reading my journal...  I think I'd really better crackdown on my lousy spelling, grammar and typos...

==Aph's Personal Page==

===Projects===

====uCOM====

Coder, main gametype coder.

====UnF====

Assault gamefix, currently put on hold.

===Links===

http://www.unreal-command.com  The uCOM webpage</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Aphelion/Developer Journal</title>
    <id>432</id>
    <revision>
      <id>1449</id>
      <timestamp>2003-08-05T09:42:39Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">&lt;b&gt;Journal of a Mod making coder&lt;/b&gt;

===Introduction===

So I saw this page of journals and thought, wtf, I'll write something.  After all, I've recently started writing for a mod that's going to come out for UT2K3.  Yes, it's a while off, but there's the whole gametype to write for this mod and that's my task.  Oh well, to start from the beginning...

The mod is Unreal Command, or uCOM for short.  It was started a while ago by an ex-member of the UnrealFortress mod, which I had fun playing and for which I learnt UScript so I could modify the gameplay, create map objects for one or two maps I tried to make and generally see if I could learn a whole language as a challenge.  Anyway, after a while wondering what I was going to do with my extremely non-elite coding skills, I was pointed in the way of uCOM by a friend, Highlander, who promptly joined the team shortly after me (which was nice).  

The aim of the mod is to create a mod with a commander for each team.  This commander issues orders, builds vehicles and generally is the boss.  He has a load of unwitting recruits to his cause, members of his own team who are the grunts, who he gets to order around and fight for him/her, alongside and possibly in the vehicles.  Sort of like RTS meets unreal.

Anyway, after looking at the mod, liking what I saw, I looked at the page of team members and, lo and behold, they needed a coder.  Well, I thought, this sounds good, apart from the experience bit.  Oh well, I send off an application emial with all that I know and can do on it and find, to my amazement, that I'm a developer, just like that, welcome to the team.  Bit surprised, the e-mail back said that I had experience in all the things they lacked, like gametypes and coding map actors.  Well, that was a bit surprising.  Anyway, my task lay before me!  To code the gametype and map actors for uCOM.  And this is where the journal begins...

===Now what have I let myself in for!===

Well, there I'm sitting, realising that I have been lumbered with a mass coding effort.  Good stuff, and I was planning to do lots of work this summer for my physics degree...  Oh well!  So the mod is for UT2K3, a game that hasn't been writen... This puts a dampener on things, especially as I have an attention span the size of a goldfishe's!  But for now, I have to do something, before all my raw enthusiasm is used up!

So, question 1:  How similar will the gametype code in UT2K3 be to UT?

Completely uninformed opinion:  Well, they can't actually change THAT much, can they?  The code was pretty simple and had not too many limitations...  Well, to my inexperienced eyes.  But they could change the subclasses and so on.  So, first move, why not list the functions in GameInfo, assume that they have to have the same or stuff that fufills similar functions and then go for it in UT1!  

Yey!, after looking at the code it seems this was a good move, lots of functions, they all do obvious things like restart the game and find you start locations, so even if the specifics are different, the thought's go to be the same in UT2K3... right?

Ok, by now, Highlander (High for short) had joined the team.  A few words about him, because he becomes important here.  Highlander is a prolific and (in my opinion) good mapper, who learnt how to code because he knew other programming languages and set me my first major task for one of his maps.  After I showed and explained the code I wrote, Highlander went out and found some sites for learning UScript and, of course, was from that day, a fairly competent coder without really trying...  Anyway, one problem (or should I say fun thing) is that High is always coming up with crazy whacked ideas continually, then actually trying to get them to work.  This means he has come to continually but his head against the UT1 engine's limits, and done some impressive things including skyboxes that are dangerous to gameplay (i.e. you stop and go, &quot;ooh, pretty skybox&quot; kersplat!!!!).  Anyway, with him on the team, the uCOM gamecode had better be flexible, very flexible, because if it wasn't High certainly would be coming to me and bugging me to do stuff (or, coding it himself, depending on what) later on and not being able to strut his funky stuff.  So that's one thing I need to think about.  Flexibility...

On top of everything, despite being made a member of the design team, CE (that's Cyber-Emperor for non-lazy people), our illustrious leader, had barely exchanged more then 2 words with me about what the hell was going on.  So, with only the website to go on, and CE off on a short break of a few days, flexibility seemed like the way to least get into trouble... :-)

Next problem is thinking about the design...  How to design the gametype.  Well, UnrealFortress had a mapinfo.  The gameinfo subclass uses the mapinfo to achieve different gametypes with only one gameinfo subclass.  Nice idea.  Unfortunately, messy and a lot of work to replace lots of mapinfo code...  However, the idea had hit me before that it would be nice to have a mapinfo where most of the gameinfo code was called from.  Definitely something a mapper/coder like High could have fun with.  But what about straight mappers, they'd want to create their own gametypes and not code anything.  Then the idea hit me!  Use objects for each and every function in the gameinfo.  Each object could be placed in the map and at startup the mapinfo could detect each of these objects (rule modules I called them) and the gameinfo could call them through the mapinfo.  Then mappers could mix and match gametypes, and assault restart here, a CTF objective there, domination like scoring, whatever!  

Then, what really clinched it was the fact that, with such modular code, I could transfer lots of it direct to UT2K3.  I was well pleased with myself... :-)  Then I realised a flaw...  Modular bot AI.  This could work well, or it could go catastrophically wrong.  Oh well, may aswell try...

So, with this in mind I started coding...

'''Highlander:''' See all the trouble i caused? and the skybox wasnt that purty I just went overboard with the attach movers. And yes i guess it is my fault that Aph started coding in uscript. (Just dont hurt me ok.. it was an accident :P)

===Starting to code a mod===

Well, there I am sitting in front of UnrealEd looking at the gameinfo subclasses thinking, well, here I am, having to write a mod...  It's a pretty daunting bit, you know, when you have nothing there...  And making the first step aswell, secure in the knowledge that whatever you do, somewhere along the way, if your mod becomes popular, you're going to be regretting every little thing you didn't think about properly along the way...

Actually going through GameInfo earlier and writing down all the functions helped a heck of a lot.  With that done, and what they did (more or less), it was easier to see what I needed to achieve, what my code was actually going to do.  So I made the first big decision, where to subclass this new mod...  Well, since it was a team mod, the answer seemed simple enough, TeamGamePlus looked damn good...

Starting to code though, still was quite hard.  There was lots of &quot;and I'll reference to this actors which... doesn't exist yet...&quot; concrete examples being the mapinfo and map objectives.  However, comments are a coder's best friend.  When the greatest impediment is design, writing lots of comments and very little code may seem as not making much progress, but it helped me to cut the ice and get the brain going as to HOW exactly everything was going to work...

Jumping to other actors soon provided the stimulus to uncomment many lines of code that referenced to them, but my code was getting unwieldy and I gave up commenting anything that didn't exist yet, so my code became uncompilable...  Given that people say to compile your code every few lines, this, I thought, was not good...

I said above that the idea to modularise had hit me suddenly, and in a way it had, but it wasn't clear until I started work on the MapInfo itself.  At this point I started creating the basis of what really would be the mod.  In effect, it had been a bit of a mistake to start with the gameinfo, because, with the mapinfo going, I knew how I was going to code it all and had to go back to the gameinfo and practically wipe most of it.  Still it was progress and I got to where I am about now. 

Anyway, I think I've managed to nearly catch up with the present enough to start a day by day (or near enough) journal, which is how this will progress from here...

====15/08/02 Start of Journal in day by day=====

Writing descriptions of your code for complete non-coders should be easy, no?  Well, that's what I thought...  But that's not what I discovered.  Having writen lots of this modularised code system, I thought I'd better write a technical document describing how to create maps with this thing...  Not only would this be useful down the line, but it would allow me to put down in black and white what I was going to do and allow me to compose my thoughts a bit more.  

Well, the major difficulty I encountered today was just trying to describe this situation to a non-coder:

The mapinfo at startup searches for the objects that contain the functions for the gameinfo.  Each of these objects is a subclass of uCOM_RuleModule which is how I search for them in the level.  Now, the subclasses of uCOM_RuleModule are in themselves useless, because they are again subclassed and exist there only for me to use as a variable to refer to when discussing any of the subclasses in the code.  However, how do you explain this to a mapper who doesn't code?  Hell, I don't think I explained it well here either!  I tried an explanation along the lines of branches of the actor tree (go down this branch...).  Anyway, considering I thought I had most of the technical document laid out in my head, enough for me to write it, such a thing seemed a really odd problem to crop up...  I really can't wait to give this to one of our mappers who's cold on this and see them fall flat (especially on what, I'm sure I'd be very surprised at someof the things they'd find incomprehensable).  Which'll be good, because once I set them straight, they can rewrite it for their own kind and then no one else will!

====15/08/02=====

Well, people who see this entry are going to think that I screwed up on the date.  Not so!  Unfortunately, and I think in common with many other coders from what I hear, I have a screwed sleeping pattern.  I've been to bed and gotten up since last update.  I imagine this won't be the first or last time, so I beg the reader's indulgence...

Since last update, I haven't really done much coding.  However, I have been reading some more of this page, which I am eternally grateful that Highlander showed me some weeks ago (and which I only properly got into 4 days or so ago).  The sections are [[Legacy:Mychaeel/Modding_Etiquette|Mychaeel/Modding_Etiquette]] and [[Legacy:Mychaeel/Mod_Startups|Mychaeel/Mod_Startups]].  Basically, they're about how to behave with the general public with your mod (modding etiquette) and homw to get people to join your team when you have a good idea...  Anyway, I thought the question of why I joined uCOM probably is a good one.

Well, for one thing, I'd been thinking I wanted to join a mod team somewhere.  I thought that writing mutators for Unreal Fortress and generally coding a bit, made me think it would be fun to mod.  Well, the link to uCOM was passed to me by Highlander.  First thing going for it was that it had a nice website.  I realsie that in the guide by Mycheal it says that's one thing you can't really trust is a nicely made web-page, because it doesn't say anything about the game-design abilities of the designer.  However, this one was different IMO.  It spoke of a level of care, firstly, as it was very finished.  It also said the game designer could do graphics!  Also, I realise, it really said that the whole page was organised and so the person behind the website would definitely be someone who, whether or not they had any modding ability, be able to grab servers, push the mod etc.

Secondly, there were already people on the team, and people in the forums.  These were both good things IMO.  It meant other people had already been swayed and people already cared about the mod.  

Thirdly, the leader of this project was CE, who had been in Unreal Fortress and left, had made some of the maps that I constantly played on and so I knew was able.  On top of that, he was brother to the person who'd led Clan Cannon Fodder, the Unreal Fortress clan I was in, who was also in the Dev team.  Now, I dunno what it is about clan leaders, but they're usually not the most exceptionally brilliant people in the chosen game the clan participates in.  However, they have something rarer, leadership...  So, in that sense, the mod looked like it was on a sound footing in terms of all the little factors beyond actual raw modding talent.

====26/08/02====

Back from a big break, part of it completely unexpected :)  I was randomly asked by my girlfriend, who went on this scheme run by Oxford University to improve the numbers of state school and ethnic minorities applying to it, to help them out for a week because they were a person down.  For some reason Oxford has a reputation for exclusivity that is very, very undeserved.  Unfortunately, this reputation is self-perpetuating.  Not too many ethnic minorities or state school people apply because of the reputation, so there aren't too many of them in the unversity, so everyone thinks Oxford's reputation is deserved...  Were any bright person from England be reading this, wondering whether they should apply or not, I'd unhesitatingly answer, yes!!!!  If you can get nearly all As at A-Level, then nothing should stop you!

Well, anyway, time to move on from that little side-track.  

'''DJPaul:''' Yeah, getting all As is easier said than done :).  I've recently got a series of straight Cs at AS level, and am hoping to get one upgraded to a B because the exam boards mark silly :).

'''Aphelion''' That was a pretty mess with the exam boards...  Hope it didn't cost you any Uni places...

'''DJPaul:''' Nup, I may go to Uni. next year.  Or sloth off.

==UT2003 Relased, Start of Actual Mod 03/10/02==

===I'm Back===

Well, UT2003's been released, today in my part of the hills, but I already have the classes and can begin to code, hopefully get the game today though :)  Anyway, I've been a bit absent from this journal for a while.  I think it's hard to maintain something like this.  I've always never managed to maintain a diary ever :)

Anyway, I'd thought I'd start from here a bit more rigorously.  The mod's website is http://www.unreal-command.com just so you know what the mods about.  From here on, hopefully there'll be more information about the mod and the coding problems I face and overcome (so should get some tutorial sections out of this, hopefully) and a bit more about writing large chunck of code.

===Importance of Planning===

Well, I'm sure anyone who's read this far may be wondering, did the writing of the code in UT help at all?  To that, I have to say emphatically, yes.

First off, the code of the UT2003 [[Legacy:GameInfo|GameInfo]] was similar to the UT one in many ways.  So this guess had paid off and this was good.  However, I designed a nice system to modularise the UT1 GameInfo, and so had Epic, in a different way, that's incompatible.  I have to face the choice that the GameRules may not work with uCOM and spend time thinking about overcoming this.

Despite this problem, coding in UT1 was still good as it had given me the idea of HOW I wanted to code the Gametypes of the mod.  By that I mean, not the code itself, but the philosophy behind it.  In short, I had some kind of plan behind my motivations.

Secondly, any method of tackling a problem has its own disadvantages compared to other methods.  But, it's easy to forget that each method has advantages aswell, advantages that one may not forsee...  So, by coding, I found out a few things that were not obvious.  By coding the gametypes modularly, it would be exceptionally easy to change gametype midway.  This is an alright thing to have, but really, it would be more useful to have in campaign type RTSs, where one map determines the outcome of the next.  I realised that wouldn't be hard to add in extra.  

These kind of things, are the type that crop up as you code, and I found by coding, I got to spot the above, and a few other things. Problem with cropping up as you code is that it's unplanned.  However, I've not yet started to code and I know how it works, have talked it over with others at the mod and know how it will be implemented.  I think this is good and saves being messy.

===10/10/02 The big blank page... 2-team limits===

Above, I said starting wasn't easy.  Well, I've got the big blank page before me once again.  The main initial problem I've faced before even starting to code is that the UT2003 Team game code doesn't support more then two teams.  This seems a bit limiting to me.  First off, uCOM really should have support for four teams.  It doesn't really need it yet and there arent big plans to have 4 team games, but the option should be there...  On top of that, uCOM needs to have civilians and there should be something for map specified extras, so that's 6 teams in all uCOM needs to see.  This means I must resort to using Deathmatch as superclass of the mod gamecode or dump these ideas for &gt;2 teams.  Personally, I don't like having that level of inflexibility and the existance of arrays like TeamInfo[2] would make it hell to extand later on, so I'm going for the second options.

Thus, my first start is to copy the teamgame code into my uCOM_GameInfo (that's the name of my GameInfo derivative class) and see where the limiting number 2 crops up in both properties and functions:

* var UnrealTeamInfo Teams[2]
* var RedTeamName, BlueTeamName: Used for loading premade teams.  More for the single player I guess.
* var TeamAIType[2]
* var TempSymbols[2]: Note, there is also TeamSymbols[2] in GameRepInfo.
* function PostBeginPlay: Creates settings for Teams[i]
* function OtherTeam: Returns the other team, useless if &gt;2 teams
* function Preloadbots: Accesses functions in each Teams[i]
* function GetBlueTeam: Creates a TeamInfo for the blue team.  Mainly single player part
* function GetRedTeam: Calls super with EnemyRosterName being the same as RedTeamName, so look up that in DeathMatch.
* function InitGame: Inits the TeamAIType.  Parses options for red and blue team names and symbols
* function RestartPlayer: balances teams with bots.  
* function NotifyKilled: Accesses Teams[i]
* function CheckEndGame: Works out winner between 0 and 1.
* function GetBotTeam: Explicitly references each TeamInfo
* function FindTeamFor: Calls functions in Teams[i]
* function PickTeam: Another sorting function which just sorts out which team is bigger and picks the smaller team.
* function PlayEndOfMatchMessage: Accesses Teams[i]
* function FindTeamDesignation: Accesses Teams[i] in the GameRepInfo.  Means GRI needs to be recoded too...
* function FindNewObjectives: Again, accesses Teams[i], would need to be extended.
* function AnnounceScore: Sorts out teams into scoring team and other team (a concept that's not going to work in &gt;2 teams).  Then works out what messages to send (e.g. taken the lead if scores were equal)
* function PostLogin: Announces teamchange of a newly entered player, switches between 0 and 1

Well, that's it.  Other segments that need to be changed include the GameRepInfo but, as pointed out by Flashman below, there's likely to be more...

'''Flashman:''' Just a word of advice: i've been reading different bits about the player models in UT2k3, and the fact that team skinning might be a limitation: only two team skins? If this is also the case (I'm no expert mind) you might want to check out any classes that deal with the Player itself - if there's going to be too much work (including getting your team to make new skins and player models if they arent already) just to get &gt;2 teams in the game?

'''Aphelion:''' Thank you for your advice.  It's worth looking into.  Currently, I'm not too bothered, because uCOM will only have to work with 2 teams in the beginning.  Any code now is trying to save work in the uCOM_GameInfo later on.  Later on, though, if what you say is true....  As I find any errors, I'll post them up.  I'm pretty sure given the big discussion about creating a new unified MCTF mod, noneof this will be wasted.  At worst, anyway, we can have 2 textures, because we can get away with it as the textures are different for each team in not just colour (both teams look radically different, as you might expect from an RTS mod :) ) and then use labelling and lights and so on.  In fact, thinking about it, that could just be the quickest solution... Hmmm...  /me goes away to think. 

=== 17/10/02 === 

Finished looking at TeamInfo.  Will start coding the uCOM_GameInfo now...  Damn my uni work....  Everyone else in uCOM is so far ahead of me now...

===08/12/02 Converting strings to names, other random pieces of info===

Although there's not been much in this journal, I've been doing some coding in among the mass work of Uni and, at least until next term and my dreaded finals, I'm free!  Anyway, time to write down any random bits of useful info I can think of:

'''''Converting Strings to Names:'''''

Highlander needed to change a string to a name and talked to a few people about it, advice ranging from dunno to native coding (!?) solutions were flung his way.  There is a simpler way, so here it is:

In object, there's a functions defined called SetProperty( string, string).  What this does is set any property in a UScript class based on the name of the property (in string format) and it's value (in string format).  This works for names.  So, if I want to set the name variable Tag to a string variable called TagString, I need to simply do the call Self.SetProperty( &quot;Tag&quot;, TagString ).

'''''TeamGame Garbage:'''''  

Most of the TeamGame class is just unneccessary.  I'm saying that just in case you find yourself subclassing the deathmatch class to get more teams and wade through tons of intimidating code.  Most of the TeamGame stuff deals with the single player game and team rosters and contains lots of code that's easy to get lost in.  So, in case you're some unfortunate sod in the position of going through that, don't get downhearted and remember that the InitGame (to set start variables), the ReduceDamage (how else do you not kill your team mates?) and the scorekill (to win) are really the heart, plus some crap to create TeamInfos...

===01/02/03===

Well, this is a bit of a unique date to write down in European format, probably ausipcious or something, then again maybe not.  

Been away from this journal for a while.  Main reason is I want to write something useful, but then I've only been doing grunt level codework for the mod.  Anyway, recently I delved into the GUI code so I think I have some stuff to write about.

====GUI====

'''''Overview of the GUI:'''''

The GUI classes are all of those that extend from [[Legacy:GUI|GUI]] which subclasses Object.  [[Legacy:GUI|GUI]] itself is just an organisational class containing some structs but is subclassed by three child classes:

#[[Legacy:GUIComponent|GUIComponent]]
#[[Legacy:GUIFont|GUIFont]]
#[[Legacy:GUIStyles|GUIStyles]]

[[Legacy:GUIComponent|GUIComponent]] is the actual class that the graphical menus and in-game menus of ut2003 are made out of and as its name suggests, corresponds to actual components in the menu, like buttons, images, lists and arrows.  

[[Legacy:GUIFont|GUIFont]] contains information about fonts.  Used when specifying fonts in GUIComponent.

[[Legacy:GUIStyles|GUIStyles]] contains information about how a particular GUIComponent should be displayed.  Display information (like fonts and images) comes in arrays, each array element corresponding to one focus states.  More about focus lower down.

'''''GUIComponent:'''''

As mentioned, all items displayed on the screen in a menu are [GUIComponent]s.  This includes the page for example.  However, a page has many buttons, check boxes and images embedded into it.  Also, there are other user interface elements that a user would consider to be one item but can in fact be made out of many other [[Legacy:GUIComponent|GUIComponent]]s like [[Legacy:GUIComboBox|GUIComboBox]] which is a drop down menu made up of an edit box, a down arrow and a list.  Such multi-component systems are made out of [[Legacy:GUIComponent|GUIComponent]]'s subclass [[Legacy:GUIMultiComponent|GUIMultiComponent]].

'''''GUIMultiComponent:'''''

This class operates by having a dynamic array called Controls which is of class [[Legacy:GUIComponent|GUIComponent]].  Thus lots of components can be embedded into a single GUIComponent itself and this is how menu pages and tabs are built, along with other multicomponent menu items.

'''''Focus:'''''

Focus is the concept of which menu item is enabled at any one time and accepting input.  Like in Windows or an XWindows server when you have many windows open, only one will accept input from the keyboard.  That window is described as having focus and is normally markd by some colour change.  UT2003 has 5 levels of focus that each component knows about defined as an enumerator in [GUI].  They are:

; MSAT_Blurry  : No focus at all
; MSAT_Watched : Component has mouse over it
; MSAT_Focused : Component is focused
; MSAT_Pressed : Component is pressed
; MSAT_Disabled: ..is disabled

As mentioned, styles define characteristics of the component for each focus state.

===02/02/03===

====Writing a GUI====

'''''Introduction:'''''

This section isn't about how to write a GUI in terms of laying it out and so on, something which is probably better not left to most coders (is it me, or does asthetic design just get in the way of coding? :) ).  This section is more about the mechanics of it, which I've found to be slightly more complicated then using UScript to position GUIComponents inside a page/tab and getting that displayed.  The GUI classes contain a lot of native code and no obvious drawing functions.  With most of the functionality &quot;under the bonnet&quot; as it were, life can be fun.

'''''Static and Dynamic GUIs:'''''

There are two types of GUIs you might want to build: static and dynamic.  Static GUIs are those where you know what menu components are needed on the screen for all the time your menu will be displayed.  Dynamic GUIs don't assume that you know what menu components will be for the time the menu exists.  Notice I said menu components, not user menu items or what a user might assume to be a dynamically generated menu.  If you don't understand that distinction, then don't worry about it as they'll be explained in a bit more detail below.  Dynamic menus are much harder to create then static menus.

'''''Writing a Static GUI:'''''

As mentioned, static GUIs are ones where the person writing the menu knows what menu components are going to be displayed at all times on the menu.  Examples of this are, for example, the UT2003 main menu and the settings tabs in general.  

To write a menu requires that a multi-component class be declared.  In general, this will involve subclassing [[Legacy:GUIPage|GUIPage]] or [[Legacy:GUITabPanel|GUITabPanel]] to create menu pages and menu tabs respectively.  Once you have your class, you need to define the components that go into the menu, namely you have to define what the array Controls is and this is the bit where life gets complicated very quickly.

All [GUIComponent] classes have a function called InitComponent() which is called when a menu is initialised.  One might assume that creating the [GUIComponent] with the ''new'' function and then initialising it to the neccessary values would be a good way to go about it.  However, if this is done, the menu component won't render.  To make the menu component work, (remember there is no obvious draw function to update the screen) the component must be declared in the default properties, which does render it.  Once there is a decleration, the properties of each component can be edited inside the class you've created.  If you haven't seen the syntax, here's an example:

&lt;uscript&gt;

	Begin Object class=GUIImage Name=CharacterDetails
		WinWidth=0.5
		WinHeight=0.943790
		WinLeft=0.021641
		WinTop=0.028105
		Image=Material'InterfaceContent.Menu.BorderBoxD'
		ImageColor=(R=255,G=255,B=255,A=160);
		ImageRenderStyle=MSTY_Alpha
		ImageStyle=ISTY_Stretched
	End Object
	Controls(0)=GUIImage'CharacterDetails'

&lt;/uscript&gt;

Notice the basic points, the '''Begin''' statement, followed by the class, follow by the name.  This is then followed by the default properties of the new menu component being created terminated by an '''''End''' statement.  This defines the object.  Lastly, the object is initialised into the Controls array with the syntax of ClassName'Name' .

Since menu items created via the new comand won't render, it should be possible to see that this limits the menu to containing only the elements declared in the default properties can be used for the menu's duration, what I defined earlier as a static menu.  Notice that there is a way around this render problem and there's more on that under the dynamic menu heading but before you rush there (if that's what you want to create) there's some tricks that can be done with static menus to create dynamic effects (see section below).

Notice throughout I've been careful to say that static menus are those in which the menu components are known throughout the menus' durations. I've been careful to say this because there are certain dynamic effects that can be achieved to create basic dynamic tricks.  Namely, you can make menu items disappear and generate dynamic menus inside pre-exisiting components.  Also, remember all properties of a menu can be changed from their default ones and this will display properly.

''''' &quot;Dynamic&quot; Static Menus: ''''' 

All components have a property called bVisible which is obvious enough what it does.  Just to clarify, this completely removes the control from the screen so that not only is it invisible, but it's not clickable etc.  Using this, it's easily possible to have controls/buttons etc that appear and disappear based on input from the user.  So, for example, if you want to have two buttons like save and discard pop up when someone clicks on a control, it's easily possible to do that by defining the buttons in the default properties and then making them invisible on start (either in the default properties or in InitComponent) and then making them visible when the time comes.

Combining the above invisibility property with the ability to change the components once rendered without affecting them adversely means that a semi-dynamic menu can be created.  To create an example, say you wish to read a map and display selectable starting locations in the form of buttons (assuming there are such [[Legacy:Playerstart|playerstart]] actors in the level, which is NOT true for stock UT2003).  By clicking on a button, a player can choose the start location that's written on the button.  Assuming that a map will never have more then 10 of these selectable start locations, ten buttons can be defined in default properties.  At menu init, the menu scans the map and assigns to each each button one start location up to the max of ten.  Each button that's assigned a start location is then made visible.  So long as the mapper does not exceed 10 start locations, no one need know that this &quot;dynamic&quot; menu is not really dynamic.

However, say you want to get a dynamic amount of start locations displayed.  Can this be done?  Well, yes, by using any component that contains a list ([[Legacy:GUIList|GUIList]]).  Lists are individual menu components, so they need to be declared once in the default properties.  However, they contain a dynamic array.  The dynamic array contains a struct which holds:

#The text displayed in the list for that entry
#An object associated with the list entry
#Some extra string realated to the list entry

Data can be entered into the list during it's initialisation and, providing the list is declared in default properties, the list can be as long as you like (of course, there are some limits, for example, there's a variable for max no of items displayed and the space you can use on a display, go read the class itself).  Thus, to take the example, I have a list (or a [[Legacy:GUIComboBox|GUIComboBox]] which contains a list) in my default properties.  On init, the code scans as before for selectable start locations.  This time, instead of assigning the name of the start location to a button and making it visible, the code simply adds the start location to a list.  If the start location is special, an object can be passed aswell to the list and the onChange delegate in the list can be changed to deal with the object and call functions from it (e.g. to see whether the person's allowed to spawn there) each time a person clicks on it.

The examples are a little specific, but I hope it's easy to see the way in which one should approach building a dynamic menu using existing components.

'''''Dynamic Menus'''''

There are two ways in dealing with a dynamic menu:  

The first is to use existing GUI classes and to use the onDraw delegate.  This allows the coder to draw directly on the canvas of the menu itself, as with a normal HUD.  By returning false, it's possible to stop the native menu drawing code.  Returning true just supplements the native code with your instructions.

One important thing to note is that, although created components aren't rendered, they are still there and can be activated etc.  This is useful in itself if you want to create a menu over some complex image, say, without too much work.

The second way of dealing with a dynamic menu is to write one's own GUI equivalent classes and have the drawing all handled in the HUD of the player.  This is the method that uCOM uses to render the commander's HUD, for example.  

The basic principle for this method is that the controls are created as an interaction.  The interaction is then used to render and to catch input and to pass the mouse coords and textures based on where the mouse is and what's under it) to the HUD.  Then, a class for the actual components themselves, with notification when the mouse is over the component (back to the interaction) and an array to hold other components.  I've left this description vague because there's different ways of actually implementing this this, better left to each individual designer according to their needs.  

[[Legacy:Spark|Spark]] has a tutorial on creating a mouse.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1450</id>
      <timestamp>2003-02-02T15:10:24Z</timestamp>
      <contributor>
        <ip>Aphelion</ip>
      </contributor>
      <comment>Update on general info on building a GUI inc. random things in the GUI code</comment>
      <text xml:space="preserve">&lt;b&gt;Journal of a Mod making coder&lt;/b&gt;

===Introduction===

So I saw this page of journals and thought, wtf, I'll write something.  After all, I've recently started writing for a mod that's going to come out for UT2K3.  Yes, it's a while off, but there's the whole gametype to write for this mod and that's my task.  Oh well, to start from the beginning...

The mod is Unreal Command, or uCOM for short.  It was started a while ago by an ex-member of the UnrealFortress mod, which I had fun playing and for which I learnt UScript so I could modify the gameplay, create map objects for one or two maps I tried to make and generally see if I could learn a whole language as a challenge.  Anyway, after a while wondering what I was going to do with my extremely non-elite coding skills, I was pointed in the way of uCOM by a friend, Highlander, who promptly joined the team shortly after me (which was nice).  

The aim of the mod is to create a mod with a commander for each team.  This commander issues orders, builds vehicles and generally is the boss.  He has a load of unwitting recruits to his cause, members of his own team who are the grunts, who he gets to order around and fight for him/her, alongside and possibly in the vehicles.  Sort of like RTS meets unreal.

Anyway, after looking at the mod, liking what I saw, I looked at the page of team members and, lo and behold, they needed a coder.  Well, I thought, this sounds good, apart from the experience bit.  Oh well, I send off an application emial with all that I know and can do on it and find, to my amazement, that I'm a developer, just like that, welcome to the team.  Bit surprised, the e-mail back said that I had experience in all the things they lacked, like gametypes and coding map actors.  Well, that was a bit surprising.  Anyway, my task lay before me!  To code the gametype and map actors for uCOM.  And this is where the journal begins...

===Now what have I let myself in for!===

Well, there I'm sitting, realising that I have been lumbered with a mass coding effort.  Good stuff, and I was planning to do lots of work this summer for my physics degree...  Oh well!  So the mod is for UT2K3, a game that hasn't been writen... This puts a dampener on things, especially as I have an attention span the size of a goldfishe's!  But for now, I have to do something, before all my raw enthusiasm is used up!

So, question 1:  How similar will the gametype code in UT2K3 be to UT?

Completely uninformed opinion:  Well, they can't actually change THAT much, can they?  The code was pretty simple and had not too many limitations...  Well, to my inexperienced eyes.  But they could change the subclasses and so on.  So, first move, why not list the functions in GameInfo, assume that they have to have the same or stuff that fufills similar functions and then go for it in UT1!  

Yey!, after looking at the code it seems this was a good move, lots of functions, they all do obvious things like restart the game and find you start locations, so even if the specifics are different, the thought's go to be the same in UT2K3... right?

Ok, by now, Highlander (High for short) had joined the team.  A few words about him, because he becomes important here.  Highlander is a prolific and (in my opinion) good mapper, who learnt how to code because he knew other programming languages and set me my first major task for one of his maps.  After I showed and explained the code I wrote, Highlander went out and found some sites for learning UScript and, of course, was from that day, a fairly competent coder without really trying...  Anyway, one problem (or should I say fun thing) is that High is always coming up with crazy whacked ideas continually, then actually trying to get them to work.  This means he has come to continually but his head against the UT1 engine's limits, and done some impressive things including skyboxes that are dangerous to gameplay (i.e. you stop and go, &quot;ooh, pretty skybox&quot; kersplat!!!!).  Anyway, with him on the team, the uCOM gamecode had better be flexible, very flexible, because if it wasn't High certainly would be coming to me and bugging me to do stuff (or, coding it himself, depending on what) later on and not being able to strut his funky stuff.  So that's one thing I need to think about.  Flexibility...

On top of everything, despite being made a member of the design team, CE (that's Cyber-Emperor for non-lazy people), our illustrious leader, had barely exchanged more then 2 words with me about what the hell was going on.  So, with only the website to go on, and CE off on a short break of a few days, flexibility seemed like the way to least get into trouble... :-)

Next problem is thinking about the design...  How to design the gametype.  Well, UnrealFortress had a mapinfo.  The gameinfo subclass uses the mapinfo to achieve different gametypes with only one gameinfo subclass.  Nice idea.  Unfortunately, messy and a lot of work to replace lots of mapinfo code...  However, the idea had hit me before that it would be nice to have a mapinfo where most of the gameinfo code was called from.  Definitely something a mapper/coder like High could have fun with.  But what about straight mappers, they'd want to create their own gametypes and not code anything.  Then the idea hit me!  Use objects for each and every function in the gameinfo.  Each object could be placed in the map and at startup the mapinfo could detect each of these objects (rule modules I called them) and the gameinfo could call them through the mapinfo.  Then mappers could mix and match gametypes, and assault restart here, a CTF objective there, domination like scoring, whatever!  

Then, what really clinched it was the fact that, with such modular code, I could transfer lots of it direct to UT2K3.  I was well pleased with myself... :-)  Then I realised a flaw...  Modular bot AI.  This could work well, or it could go catastrophically wrong.  Oh well, may aswell try...

So, with this in mind I started coding...

'''Highlander:''' See all the trouble i caused? and the skybox wasnt that purty I just went overboard with the attach movers. And yes i guess it is my fault that Aph started coding in uscript. (Just dont hurt me ok.. it was an accident :P)

===Starting to code a mod===

Well, there I am sitting in front of UnrealEd looking at the gameinfo subclasses thinking, well, here I am, having to write a mod...  It's a pretty daunting bit, you know, when you have nothing there...  And making the first step aswell, secure in the knowledge that whatever you do, somewhere along the way, if your mod becomes popular, you're going to be regretting every little thing you didn't think about properly along the way...

Actually going through GameInfo earlier and writing down all the functions helped a heck of a lot.  With that done, and what they did (more or less), it was easier to see what I needed to achieve, what my code was actually going to do.  So I made the first big decision, where to subclass this new mod...  Well, since it was a team mod, the answer seemed simple enough, TeamGamePlus looked damn good...

Starting to code though, still was quite hard.  There was lots of &quot;and I'll reference to this actors which... doesn't exist yet...&quot; concrete examples being the mapinfo and map objectives.  However, comments are a coder's best friend.  When the greatest impediment is design, writing lots of comments and very little code may seem as not making much progress, but it helped me to cut the ice and get the brain going as to HOW exactly everything was going to work...

Jumping to other actors soon provided the stimulus to uncomment many lines of code that referenced to them, but my code was getting unwieldy and I gave up commenting anything that didn't exist yet, so my code became uncompilable...  Given that people say to compile your code every few lines, this, I thought, was not good...

I said above that the idea to modularise had hit me suddenly, and in a way it had, but it wasn't clear until I started work on the MapInfo itself.  At this point I started creating the basis of what really would be the mod.  In effect, it had been a bit of a mistake to start with the gameinfo, because, with the mapinfo going, I knew how I was going to code it all and had to go back to the gameinfo and practically wipe most of it.  Still it was progress and I got to where I am about now. 

Anyway, I think I've managed to nearly catch up with the present enough to start a day by day (or near enough) journal, which is how this will progress from here...

====15/08/02 Start of Journal in day by day=====

Writing descriptions of your code for complete non-coders should be easy, no?  Well, that's what I thought...  But that's not what I discovered.  Having writen lots of this modularised code system, I thought I'd better write a technical document describing how to create maps with this thing...  Not only would this be useful down the line, but it would allow me to put down in black and white what I was going to do and allow me to compose my thoughts a bit more.  

Well, the major difficulty I encountered today was just trying to describe this situation to a non-coder:

The mapinfo at startup searches for the objects that contain the functions for the gameinfo.  Each of these objects is a subclass of uCOM_RuleModule which is how I search for them in the level.  Now, the subclasses of uCOM_RuleModule are in themselves useless, because they are again subclassed and exist there only for me to use as a variable to refer to when discussing any of the subclasses in the code.  However, how do you explain this to a mapper who doesn't code?  Hell, I don't think I explained it well here either!  I tried an explanation along the lines of branches of the actor tree (go down this branch...).  Anyway, considering I thought I had most of the technical document laid out in my head, enough for me to write it, such a thing seemed a really odd problem to crop up...  I really can't wait to give this to one of our mappers who's cold on this and see them fall flat (especially on what, I'm sure I'd be very surprised at someof the things they'd find incomprehensable).  Which'll be good, because once I set them straight, they can rewrite it for their own kind and then no one else will!

====15/08/02=====

Well, people who see this entry are going to think that I screwed up on the date.  Not so!  Unfortunately, and I think in common with many other coders from what I hear, I have a screwed sleeping pattern.  I've been to bed and gotten up since last update.  I imagine this won't be the first or last time, so I beg the reader's indulgence...

Since last update, I haven't really done much coding.  However, I have been reading some more of this page, which I am eternally grateful that Highlander showed me some weeks ago (and which I only properly got into 4 days or so ago).  The sections are [[Legacy:Mychaeel/Modding_Etiquette|Mychaeel/Modding_Etiquette]] and [[Legacy:Mychaeel/Mod_Startups|Mychaeel/Mod_Startups]].  Basically, they're about how to behave with the general public with your mod (modding etiquette) and homw to get people to join your team when you have a good idea...  Anyway, I thought the question of why I joined uCOM probably is a good one.

Well, for one thing, I'd been thinking I wanted to join a mod team somewhere.  I thought that writing mutators for Unreal Fortress and generally coding a bit, made me think it would be fun to mod.  Well, the link to uCOM was passed to me by Highlander.  First thing going for it was that it had a nice website.  I realsie that in the guide by Mycheal it says that's one thing you can't really trust is a nicely made web-page, because it doesn't say anything about the game-design abilities of the designer.  However, this one was different IMO.  It spoke of a level of care, firstly, as it was very finished.  It also said the game designer could do graphics!  Also, I realise, it really said that the whole page was organised and so the person behind the website would definitely be someone who, whether or not they had any modding ability, be able to grab servers, push the mod etc.

Secondly, there were already people on the team, and people in the forums.  These were both good things IMO.  It meant other people had already been swayed and people already cared about the mod.  

Thirdly, the leader of this project was CE, who had been in Unreal Fortress and left, had made some of the maps that I constantly played on and so I knew was able.  On top of that, he was brother to the person who'd led Clan Cannon Fodder, the Unreal Fortress clan I was in, who was also in the Dev team.  Now, I dunno what it is about clan leaders, but they're usually not the most exceptionally brilliant people in the chosen game the clan participates in.  However, they have something rarer, leadership...  So, in that sense, the mod looked like it was on a sound footing in terms of all the little factors beyond actual raw modding talent.

====26/08/02====

Back from a big break, part of it completely unexpected :)  I was randomly asked by my girlfriend, who went on this scheme run by Oxford University to improve the numbers of state school and ethnic minorities applying to it, to help them out for a week because they were a person down.  For some reason Oxford has a reputation for exclusivity that is very, very undeserved.  Unfortunately, this reputation is self-perpetuating.  Not too many ethnic minorities or state school people apply because of the reputation, so there aren't too many of them in the unversity, so everyone thinks Oxford's reputation is deserved...  Were any bright person from England be reading this, wondering whether they should apply or not, I'd unhesitatingly answer, yes!!!!  If you can get nearly all As at A-Level, then nothing should stop you!

Well, anyway, time to move on from that little side-track.  

'''DJPaul:''' Yeah, getting all As is easier said than done :).  I've recently got a series of straight Cs at AS level, and am hoping to get one upgraded to a B because the exam boards mark silly :).

'''Aphelion''' That was a pretty mess with the exam boards...  Hope it didn't cost you any Uni places...

'''DJPaul:''' Nup, I may go to Uni. next year.  Or sloth off.

==UT2003 Relased, Start of Actual Mod 03/10/02==

===I'm Back===

Well, UT2003's been released, today in my part of the hills, but I already have the classes and can begin to code, hopefully get the game today though :)  Anyway, I've been a bit absent from this journal for a while.  I think it's hard to maintain something like this.  I've always never managed to maintain a diary ever :)

Anyway, I'd thought I'd start from here a bit more rigorously.  The mod's website is http://www.unreal-command.com just so you know what the mods about.  From here on, hopefully there'll be more information about the mod and the coding problems I face and overcome (so should get some tutorial sections out of this, hopefully) and a bit more about writing large chunck of code.

===Importance of Planning===

Well, I'm sure anyone who's read this far may be wondering, did the writing of the code in UT help at all?  To that, I have to say emphatically, yes.

First off, the code of the UT2003 [[Legacy:GameInfo|GameInfo]] was similar to the UT one in many ways.  So this guess had paid off and this was good.  However, I designed a nice system to modularise the UT1 GameInfo, and so had Epic, in a different way, that's incompatible.  I have to face the choice that the GameRules may not work with uCOM and spend time thinking about overcoming this.

Despite this problem, coding in UT1 was still good as it had given me the idea of HOW I wanted to code the Gametypes of the mod.  By that I mean, not the code itself, but the philosophy behind it.  In short, I had some kind of plan behind my motivations.

Secondly, any method of tackling a problem has its own disadvantages compared to other methods.  But, it's easy to forget that each method has advantages aswell, advantages that one may not forsee...  So, by coding, I found out a few things that were not obvious.  By coding the gametypes modularly, it would be exceptionally easy to change gametype midway.  This is an alright thing to have, but really, it would be more useful to have in campaign type RTSs, where one map determines the outcome of the next.  I realised that wouldn't be hard to add in extra.  

These kind of things, are the type that crop up as you code, and I found by coding, I got to spot the above, and a few other things. Problem with cropping up as you code is that it's unplanned.  However, I've not yet started to code and I know how it works, have talked it over with others at the mod and know how it will be implemented.  I think this is good and saves being messy.

===10/10/02 The big blank page... 2-team limits===

Above, I said starting wasn't easy.  Well, I've got the big blank page before me once again.  The main initial problem I've faced before even starting to code is that the UT2003 Team game code doesn't support more then two teams.  This seems a bit limiting to me.  First off, uCOM really should have support for four teams.  It doesn't really need it yet and there arent big plans to have 4 team games, but the option should be there...  On top of that, uCOM needs to have civilians and there should be something for map specified extras, so that's 6 teams in all uCOM needs to see.  This means I must resort to using Deathmatch as superclass of the mod gamecode or dump these ideas for &gt;2 teams.  Personally, I don't like having that level of inflexibility and the existance of arrays like TeamInfo[2] would make it hell to extand later on, so I'm going for the second options.

Thus, my first start is to copy the teamgame code into my uCOM_GameInfo (that's the name of my GameInfo derivative class) and see where the limiting number 2 crops up in both properties and functions:

* var UnrealTeamInfo Teams[2]
* var RedTeamName, BlueTeamName: Used for loading premade teams.  More for the single player I guess.
* var TeamAIType[2]
* var TempSymbols[2]: Note, there is also TeamSymbols[2] in GameRepInfo.
* function PostBeginPlay: Creates settings for Teams[i]
* function OtherTeam: Returns the other team, useless if &gt;2 teams
* function Preloadbots: Accesses functions in each Teams[i]
* function GetBlueTeam: Creates a TeamInfo for the blue team.  Mainly single player part
* function GetRedTeam: Calls super with EnemyRosterName being the same as RedTeamName, so look up that in DeathMatch.
* function InitGame: Inits the TeamAIType.  Parses options for red and blue team names and symbols
* function RestartPlayer: balances teams with bots.  
* function NotifyKilled: Accesses Teams[i]
* function CheckEndGame: Works out winner between 0 and 1.
* function GetBotTeam: Explicitly references each TeamInfo
* function FindTeamFor: Calls functions in Teams[i]
* function PickTeam: Another sorting function which just sorts out which team is bigger and picks the smaller team.
* function PlayEndOfMatchMessage: Accesses Teams[i]
* function FindTeamDesignation: Accesses Teams[i] in the GameRepInfo.  Means GRI needs to be recoded too...
* function FindNewObjectives: Again, accesses Teams[i], would need to be extended.
* function AnnounceScore: Sorts out teams into scoring team and other team (a concept that's not going to work in &gt;2 teams).  Then works out what messages to send (e.g. taken the lead if scores were equal)
* function PostLogin: Announces teamchange of a newly entered player, switches between 0 and 1

Well, that's it.  Other segments that need to be changed include the GameRepInfo but, as pointed out by Flashman below, there's likely to be more...

'''Flashman:''' Just a word of advice: i've been reading different bits about the player models in UT2k3, and the fact that team skinning might be a limitation: only two team skins? If this is also the case (I'm no expert mind) you might want to check out any classes that deal with the Player itself - if there's going to be too much work (including getting your team to make new skins and player models if they arent already) just to get &gt;2 teams in the game?

'''Aphelion:''' Thank you for your advice.  It's worth looking into.  Currently, I'm not too bothered, because uCOM will only have to work with 2 teams in the beginning.  Any code now is trying to save work in the uCOM_GameInfo later on.  Later on, though, if what you say is true....  As I find any errors, I'll post them up.  I'm pretty sure given the big discussion about creating a new unified MCTF mod, noneof this will be wasted.  At worst, anyway, we can have 2 textures, because we can get away with it as the textures are different for each team in not just colour (both teams look radically different, as you might expect from an RTS mod :) ) and then use labelling and lights and so on.  In fact, thinking about it, that could just be the quickest solution... Hmmm...  /me goes away to think. 

===17/10/02=== 

Finished looking at TeamInfo.  Will start coding the uCOM_GameInfo now...  Damn my uni work....  Everyone else in uCOM is so far ahead of me now...

===08.12/02 Converting strings to names, other random pieces of info===

Although there's not been much in this journal, I've been doing some coding in among the mass work of Uni and, at least until next term and my dreaded finals, I'm free!  Anyway, time to write down any random bits of useful info I can think of:

'''''Converting Strings to Names:'''''

Highlander needed to change a string to a name and talked to a few people about it, advice ranging from dunno to native coding (!?) solutions were flung his way.  There is a simpler way, so here it is:

In object, there's a functions defined called SetProperty( string, string).  What this does is set any property in a UScript class based on the name of the property (in string format) and it's value (in string format).  This works for names.  So, if I want to set the name variable Tag to a string variable called TagString, I need to simply do the call Self.SetProperty( &quot;Tag&quot;, TagString ).

'''''TeamGame Garbage:'''''  

Most of the TeamGame class is just unneccessary.  I'm saying that just in case you find yourself subclassing the deathmatch class to get more teams and wade through tons of intimidating code.  Most of the TeamGame stuff deals with the single player game and team rosters and contains lots of code that's easy to get lost in.  So, in case you're some unfortunate sod in the position of going through that, don't get downhearted and remember that the InitGame (to set start variables), the ReduceDamage (how else do you not kill your team mates?) and the scorekill (to win) are really the heart, plus some crap to create TeamInfos...

===01/02/03===

Well, this is a bit of a unique date to write down in European format, probably ausipcious or something, then again maybe not.  

Been away from this journal for a while.  Main reason is I want to write something useful, but then I've only been doing grunt level codework for the mod.  Anyway, recently I delved into the GUI code so I think I have some stuff to write about.

====GUI====

'''''Overview of the GUI:'''''

The GUI classes are all of those that extend from [[Legacy:GUI|GUI]] which subclasses Object.  [[Legacy:GUI|GUI]] itself is just an organisational class containing some structs but is subclassed by three child classes:

#[[Legacy:GUIComponent|GUIComponent]]
#[[Legacy:GUIFont|GUIFont]]
#[[Legacy:GUIStyles|GUIStyles]]

[[Legacy:GUIComponent|GUIComponent]] is the actual class that the graphical menus and in-game menus of ut2003 are made out of and as its name suggests, corresponds to actual components in the menu, like buttons, images, lists and arrows.  

[[Legacy:GUIFont|GUIFont]] contains information about fonts.  Used when specifying fonts in GUIComponent.

[[Legacy:GUIStyles|GUIStyles]] contains information about how a particular GUIComponent should be displayed.  Display information (like fonts and images) comes in arrays, each array element corresponding to one focus states.  More about focus lower down.

'''''GUIComponent:'''''

As mentioned, all items displayed on the screen in a menu are [GUIComponent]s.  This includes the page for example.  However, a page has many buttons, check boxes and images embedded into it.  Also, there are other user interface elements that a user would consider to be one item but can in fact be made out of many other [[Legacy:GUIComponent|GUIComponent]]s like [[Legacy:GUIComboBox|GUIComboBox]] which is a drop down menu made up of an edit box, a down arrow and a list.  Such multi-component systems are made out of [[Legacy:GUIComponent|GUIComponent]]'s subclass [[Legacy:GUIMultiComponent|GUIMultiComponent]].

'''''GUIMultiComponent:'''''

This class operates by having a dynamic array called Controls which is of class [[Legacy:GUIComponent|GUIComponent]].  Thus lots of components can be embedded into a single GUIComponent itself and this is how menu pages and tabs are built, along with other multicomponent menu items.

'''''Focus:'''''

Focus is the concept of which menu item is enabled at any one time and accepting input.  Like in Windows or an XWindows server when you have many windows open, only one will accept input from the keyboard.  That window is described as having focus and is normally markd by some colour change.  UT2003 has 5 levels of focus that each component knows about defined as an enumerator in [GUI].  They are:

; MSAT_Blurry  : No focus at all
; MSAT_Watched : Component has mouse over it
; MSAT_Focused : Component is focused
; MSAT_Pressed : Component is pressed
; MSAT_Disabled: ..is disabled

As mentioned, styles define characteristics of the component for each focus state.

===02/02/03===

====Writing a GUI====

'''''Introduction:'''''

This section isn't about how to write a GUI in terms of laying it out and so on, something which is probably better not left to most coders (is it me, or does asthetic design just get in the way of coding? :) ).  This section is more about the mechanics of it, which I've found to be slightly more complicated then using UScript to position GUIComponents inside a page/tab and getting that displayed.  The GUI classes contain a lot of native code and no obvious drawing functions.  With most of the functionality &quot;under the bonnet&quot; as it were, life can be fun.

'''''Static and Dynamic GUIs:'''''

There are two types of GUIs you might want to build: static and dynamic.  Static GUIs are those where you know what menu components are needed on the screen for all the time your menu will be displayed.  Dynamic GUIs don't assume that you know what menu components will be for the time the menu exists.  Notice I said menu components, not user menu items or what a user might assume to be a dynamically generated menu.  If you don't understand that distinction, then don't worry about it as they'll be explained in a bit more detail below.  Dynamic menus are much harder to create then static menus.

'''''Writing a Static GUI:'''''

As mentioned, static GUIs are ones where the person writing the menu knows what menu components are going to be displayed at all times on the menu.  Examples of this are, for example, the UT2003 main menu and the settings tabs in general.  

To write a menu requires that a multi-component class be declared.  In general, this will involve subclassing [[Legacy:GUIPage|GUIPage]] or [[Legacy:GUITabPanel|GUITabPanel]] to create menu pages and menu tabs respectively.  Once you have your class, you need to define the components that go into the menu, namely you have to define what the array Controls is and this is the bit where life gets complicated very quickly.

All [GUIComponent] classes have a function called InitComponent() which is called when a menu is initialised.  One might assume that creating the [GUIComponent] with the ''new'' function and then initialising it to the neccessary values would be a good way to go about it.  However, if this is done, the menu component won't render.  To make the menu component work, (remember there is no obvious draw function to update the screen) the component must be declared in the default properties, which does render it.  Once there is a decleration, the properties of each component can be edited inside the class you've created.  If you haven't seen the syntax, here's an example:

&lt;uscript&gt;

	Begin Object class=GUIImage Name=CharacterDetails
		WinWidth=0.5
		WinHeight=0.943790
		WinLeft=0.021641
		WinTop=0.028105
		Image=Material'InterfaceContent.Menu.BorderBoxD'
		ImageColor=(R=255,G=255,B=255,A=160);
		ImageRenderStyle=MSTY_Alpha
		ImageStyle=ISTY_Stretched
	End Object
	Controls(0)=GUIImage'CharacterDetails'

&lt;/uscript&gt;

Notice the basic points, the '''Begin''' statement, followed by the class, follow by the name.  This is then followed by the default properties of the new menu component being created terminated by an '''''End''' statement.  This defines the object.  Lastly, the object is initialised into the Controls array with the syntax of ClassName'Name' .

Since menu items created via the new comand won't render, it should be possible to see that this limits the menu to containing only the elements declared in the default properties can be used for the menu's duration, what I defined earlier as a static menu.  Notice that there is a way around this render problem and there's more on that under the dynamic menu heading but before you rush there (if that's what you want to create) there's some tricks that can be done with static menus to create dynamic effects (see section below).

Notice throughout I've been careful to say that static menus are those in which the menu components are known throughout the menus' durations. I've been careful to say this because there are certain dynamic effects that can be achieved to create basic dynamic tricks.  Namely, you can make menu items disappear and generate dynamic menus inside pre-exisiting components.  Also, remember all properties of a menu can be changed from their default ones and this will display properly.

''''' &quot;Dynamic&quot; Static Menus: ''''' 

All components have a property called bVisible which is obvious enough what it does.  Just to clarify, this completely removes the control from the screen so that not only is it invisible, but it's not clickable etc.  Using this, it's easily possible to have controls/buttons etc that appear and disappear based on input from the user.  So, for example, if you want to have two buttons like save and discard pop up when someone clicks on a control, it's easily possible to do that by defining the buttons in the default properties and then making them invisible on start (either in the default properties or in InitComponent) and then making them visible when the time comes.

Combining the above invisibility property with the ability to change the components once rendered without affecting them adversely means that a semi-dynamic menu can be created.  To create an example, say you wish to read a map and display selectable starting locations in the form of buttons (assuming there are such [[Legacy:Playerstart|playerstart]] actors in the level, which is NOT true for stock UT2003).  By clicking on a button, a player can choose the start location that's written on the button.  Assuming that a map will never have more then 10 of these selectable start locations, ten buttons can be defined in default properties.  At menu init, the menu scans the map and assigns to each each button one start location up to the max of ten.  Each button that's assigned a start location is then made visible.  So long as the mapper does not exceed 10 start locations, no one need know that this &quot;dynamic&quot; menu is not really dynamic.

However, say you want to get a dynamic amount of start locations displayed.  Can this be done?  Well, yes, by using any component that contains a list ([[Legacy:GUIList|GUIList]]).  Lists are individual menu components, so they need to be declared once in the default properties.  However, they contain a dynamic array.  The dynamic array contains a struct which holds:

#The text displayed in the list for that entry
#An object associated with the list entry
#Some extra string realated to the list entry

Data can be entered into the list during it's initialisation and, providing the list is declared in default properties, the list can be as long as you like (of course, there are some limits, for example, there's a variable for max no of items displayed and the space you can use on a display, go read the class itself).  Thus, to take the example, I have a list (or a [[Legacy:GUIComboBox|GUIComboBox]] which contains a list) in my default properties.  On init, the code scans as before for selectable start locations.  This time, instead of assigning the name of the start location to a button and making it visible, the code simply adds the start location to a list.  If the start location is special, an object can be passed aswell to the list and the onChange delegate in the list can be changed to deal with the object and call functions from it (e.g. to see whether the person's allowed to spawn there) each time a person clicks on it.

The examples are a little specific, but I hope it's easy to see the way in which one should approach building a dynamic menu using existing components.

'''''Dynamic Menus'''''

There are two ways in dealing with a dynamic menu:  

The first is to use existing menus and to use the onDraw delegate.  This allows the coder to draw directly on the canvas of the menu itself, as with a normal HUD.  By returning false, it's possible to stop the native menu drawing code.  Returning true just supplements the native code with your instructions.

One important thing to note is that, although created components aren't rendered, they are still there and can be activated etc.  This is useful in itself if you want to create a menu over some complex image, say, without too much work.

The second way of dealing with a dynamic menu is to write one's own GUI equivalent class and have the drawing all handled in the HUD of the player.  This is the method that uCOM uses to render the commander's HUD, for example.  

The basic principle is that the controls are created as an interaction.  The interaction is then used to render to catch input and to pass the mouse coords and textures to the HUD.  Then, a class for the actual components themselves, with notification when the mouse is over the component and an array to holdother components.  I've left this description vague because there's different ways of attempting this, better left to each individual designer according to their needs.  

[[Legacy:Spark|Spark]] has a tutorial on creating a mouse.</text>
    </revision>
    <revision>
      <id>1451</id>
      <timestamp>2003-02-02T15:14:34Z</timestamp>
      <contributor>
        <ip>Aphelion</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;b&gt;Journal of a Mod making coder&lt;/b&gt;

===Introduction===

So I saw this page of journals and thought, wtf, I'll write something.  After all, I've recently started writing for a mod that's going to come out for UT2K3.  Yes, it's a while off, but there's the whole gametype to write for this mod and that's my task.  Oh well, to start from the beginning...

The mod is Unreal Command, or uCOM for short.  It was started a while ago by an ex-member of the UnrealFortress mod, which I had fun playing and for which I learnt UScript so I could modify the gameplay, create map objects for one or two maps I tried to make and generally see if I could learn a whole language as a challenge.  Anyway, after a while wondering what I was going to do with my extremely non-elite coding skills, I was pointed in the way of uCOM by a friend, Highlander, who promptly joined the team shortly after me (which was nice).  

The aim of the mod is to create a mod with a commander for each team.  This commander issues orders, builds vehicles and generally is the boss.  He has a load of unwitting recruits to his cause, members of his own team who are the grunts, who he gets to order around and fight for him/her, alongside and possibly in the vehicles.  Sort of like RTS meets unreal.

Anyway, after looking at the mod, liking what I saw, I looked at the page of team members and, lo and behold, they needed a coder.  Well, I thought, this sounds good, apart from the experience bit.  Oh well, I send off an application emial with all that I know and can do on it and find, to my amazement, that I'm a developer, just like that, welcome to the team.  Bit surprised, the e-mail back said that I had experience in all the things they lacked, like gametypes and coding map actors.  Well, that was a bit surprising.  Anyway, my task lay before me!  To code the gametype and map actors for uCOM.  And this is where the journal begins...

===Now what have I let myself in for!===

Well, there I'm sitting, realising that I have been lumbered with a mass coding effort.  Good stuff, and I was planning to do lots of work this summer for my physics degree...  Oh well!  So the mod is for UT2K3, a game that hasn't been writen... This puts a dampener on things, especially as I have an attention span the size of a goldfishe's!  But for now, I have to do something, before all my raw enthusiasm is used up!

So, question 1:  How similar will the gametype code in UT2K3 be to UT?

Completely uninformed opinion:  Well, they can't actually change THAT much, can they?  The code was pretty simple and had not too many limitations...  Well, to my inexperienced eyes.  But they could change the subclasses and so on.  So, first move, why not list the functions in GameInfo, assume that they have to have the same or stuff that fufills similar functions and then go for it in UT1!  

Yey!, after looking at the code it seems this was a good move, lots of functions, they all do obvious things like restart the game and find you start locations, so even if the specifics are different, the thought's go to be the same in UT2K3... right?

Ok, by now, Highlander (High for short) had joined the team.  A few words about him, because he becomes important here.  Highlander is a prolific and (in my opinion) good mapper, who learnt how to code because he knew other programming languages and set me my first major task for one of his maps.  After I showed and explained the code I wrote, Highlander went out and found some sites for learning UScript and, of course, was from that day, a fairly competent coder without really trying...  Anyway, one problem (or should I say fun thing) is that High is always coming up with crazy whacked ideas continually, then actually trying to get them to work.  This means he has come to continually but his head against the UT1 engine's limits, and done some impressive things including skyboxes that are dangerous to gameplay (i.e. you stop and go, &quot;ooh, pretty skybox&quot; kersplat!!!!).  Anyway, with him on the team, the uCOM gamecode had better be flexible, very flexible, because if it wasn't High certainly would be coming to me and bugging me to do stuff (or, coding it himself, depending on what) later on and not being able to strut his funky stuff.  So that's one thing I need to think about.  Flexibility...

On top of everything, despite being made a member of the design team, CE (that's Cyber-Emperor for non-lazy people), our illustrious leader, had barely exchanged more then 2 words with me about what the hell was going on.  So, with only the website to go on, and CE off on a short break of a few days, flexibility seemed like the way to least get into trouble... :-)

Next problem is thinking about the design...  How to design the gametype.  Well, UnrealFortress had a mapinfo.  The gameinfo subclass uses the mapinfo to achieve different gametypes with only one gameinfo subclass.  Nice idea.  Unfortunately, messy and a lot of work to replace lots of mapinfo code...  However, the idea had hit me before that it would be nice to have a mapinfo where most of the gameinfo code was called from.  Definitely something a mapper/coder like High could have fun with.  But what about straight mappers, they'd want to create their own gametypes and not code anything.  Then the idea hit me!  Use objects for each and every function in the gameinfo.  Each object could be placed in the map and at startup the mapinfo could detect each of these objects (rule modules I called them) and the gameinfo could call them through the mapinfo.  Then mappers could mix and match gametypes, and assault restart here, a CTF objective there, domination like scoring, whatever!  

Then, what really clinched it was the fact that, with such modular code, I could transfer lots of it direct to UT2K3.  I was well pleased with myself... :-)  Then I realised a flaw...  Modular bot AI.  This could work well, or it could go catastrophically wrong.  Oh well, may aswell try...

So, with this in mind I started coding...

'''Highlander:''' See all the trouble i caused? and the skybox wasnt that purty I just went overboard with the attach movers. And yes i guess it is my fault that Aph started coding in uscript. (Just dont hurt me ok.. it was an accident :P)

===Starting to code a mod===

Well, there I am sitting in front of UnrealEd looking at the gameinfo subclasses thinking, well, here I am, having to write a mod...  It's a pretty daunting bit, you know, when you have nothing there...  And making the first step aswell, secure in the knowledge that whatever you do, somewhere along the way, if your mod becomes popular, you're going to be regretting every little thing you didn't think about properly along the way...

Actually going through GameInfo earlier and writing down all the functions helped a heck of a lot.  With that done, and what they did (more or less), it was easier to see what I needed to achieve, what my code was actually going to do.  So I made the first big decision, where to subclass this new mod...  Well, since it was a team mod, the answer seemed simple enough, TeamGamePlus looked damn good...

Starting to code though, still was quite hard.  There was lots of &quot;and I'll reference to this actors which... doesn't exist yet...&quot; concrete examples being the mapinfo and map objectives.  However, comments are a coder's best friend.  When the greatest impediment is design, writing lots of comments and very little code may seem as not making much progress, but it helped me to cut the ice and get the brain going as to HOW exactly everything was going to work...

Jumping to other actors soon provided the stimulus to uncomment many lines of code that referenced to them, but my code was getting unwieldy and I gave up commenting anything that didn't exist yet, so my code became uncompilable...  Given that people say to compile your code every few lines, this, I thought, was not good...

I said above that the idea to modularise had hit me suddenly, and in a way it had, but it wasn't clear until I started work on the MapInfo itself.  At this point I started creating the basis of what really would be the mod.  In effect, it had been a bit of a mistake to start with the gameinfo, because, with the mapinfo going, I knew how I was going to code it all and had to go back to the gameinfo and practically wipe most of it.  Still it was progress and I got to where I am about now. 

Anyway, I think I've managed to nearly catch up with the present enough to start a day by day (or near enough) journal, which is how this will progress from here...

====15/08/02 Start of Journal in day by day=====

Writing descriptions of your code for complete non-coders should be easy, no?  Well, that's what I thought...  But that's not what I discovered.  Having writen lots of this modularised code system, I thought I'd better write a technical document describing how to create maps with this thing...  Not only would this be useful down the line, but it would allow me to put down in black and white what I was going to do and allow me to compose my thoughts a bit more.  

Well, the major difficulty I encountered today was just trying to describe this situation to a non-coder:

The mapinfo at startup searches for the objects that contain the functions for the gameinfo.  Each of these objects is a subclass of uCOM_RuleModule which is how I search for them in the level.  Now, the subclasses of uCOM_RuleModule are in themselves useless, because they are again subclassed and exist there only for me to use as a variable to refer to when discussing any of the subclasses in the code.  However, how do you explain this to a mapper who doesn't code?  Hell, I don't think I explained it well here either!  I tried an explanation along the lines of branches of the actor tree (go down this branch...).  Anyway, considering I thought I had most of the technical document laid out in my head, enough for me to write it, such a thing seemed a really odd problem to crop up...  I really can't wait to give this to one of our mappers who's cold on this and see them fall flat (especially on what, I'm sure I'd be very surprised at someof the things they'd find incomprehensable).  Which'll be good, because once I set them straight, they can rewrite it for their own kind and then no one else will!

====15/08/02=====

Well, people who see this entry are going to think that I screwed up on the date.  Not so!  Unfortunately, and I think in common with many other coders from what I hear, I have a screwed sleeping pattern.  I've been to bed and gotten up since last update.  I imagine this won't be the first or last time, so I beg the reader's indulgence...

Since last update, I haven't really done much coding.  However, I have been reading some more of this page, which I am eternally grateful that Highlander showed me some weeks ago (and which I only properly got into 4 days or so ago).  The sections are [[Legacy:Mychaeel/Modding_Etiquette|Mychaeel/Modding_Etiquette]] and [[Legacy:Mychaeel/Mod_Startups|Mychaeel/Mod_Startups]].  Basically, they're about how to behave with the general public with your mod (modding etiquette) and homw to get people to join your team when you have a good idea...  Anyway, I thought the question of why I joined uCOM probably is a good one.

Well, for one thing, I'd been thinking I wanted to join a mod team somewhere.  I thought that writing mutators for Unreal Fortress and generally coding a bit, made me think it would be fun to mod.  Well, the link to uCOM was passed to me by Highlander.  First thing going for it was that it had a nice website.  I realsie that in the guide by Mycheal it says that's one thing you can't really trust is a nicely made web-page, because it doesn't say anything about the game-design abilities of the designer.  However, this one was different IMO.  It spoke of a level of care, firstly, as it was very finished.  It also said the game designer could do graphics!  Also, I realise, it really said that the whole page was organised and so the person behind the website would definitely be someone who, whether or not they had any modding ability, be able to grab servers, push the mod etc.

Secondly, there were already people on the team, and people in the forums.  These were both good things IMO.  It meant other people had already been swayed and people already cared about the mod.  

Thirdly, the leader of this project was CE, who had been in Unreal Fortress and left, had made some of the maps that I constantly played on and so I knew was able.  On top of that, he was brother to the person who'd led Clan Cannon Fodder, the Unreal Fortress clan I was in, who was also in the Dev team.  Now, I dunno what it is about clan leaders, but they're usually not the most exceptionally brilliant people in the chosen game the clan participates in.  However, they have something rarer, leadership...  So, in that sense, the mod looked like it was on a sound footing in terms of all the little factors beyond actual raw modding talent.

====26/08/02====

Back from a big break, part of it completely unexpected :)  I was randomly asked by my girlfriend, who went on this scheme run by Oxford University to improve the numbers of state school and ethnic minorities applying to it, to help them out for a week because they were a person down.  For some reason Oxford has a reputation for exclusivity that is very, very undeserved.  Unfortunately, this reputation is self-perpetuating.  Not too many ethnic minorities or state school people apply because of the reputation, so there aren't too many of them in the unversity, so everyone thinks Oxford's reputation is deserved...  Were any bright person from England be reading this, wondering whether they should apply or not, I'd unhesitatingly answer, yes!!!!  If you can get nearly all As at A-Level, then nothing should stop you!

Well, anyway, time to move on from that little side-track.  

'''DJPaul:''' Yeah, getting all As is easier said than done :).  I've recently got a series of straight Cs at AS level, and am hoping to get one upgraded to a B because the exam boards mark silly :).

'''Aphelion''' That was a pretty mess with the exam boards...  Hope it didn't cost you any Uni places...

'''DJPaul:''' Nup, I may go to Uni. next year.  Or sloth off.

==UT2003 Relased, Start of Actual Mod 03/10/02==

===I'm Back===

Well, UT2003's been released, today in my part of the hills, but I already have the classes and can begin to code, hopefully get the game today though :)  Anyway, I've been a bit absent from this journal for a while.  I think it's hard to maintain something like this.  I've always never managed to maintain a diary ever :)

Anyway, I'd thought I'd start from here a bit more rigorously.  The mod's website is http://www.unreal-command.com just so you know what the mods about.  From here on, hopefully there'll be more information about the mod and the coding problems I face and overcome (so should get some tutorial sections out of this, hopefully) and a bit more about writing large chunck of code.

===Importance of Planning===

Well, I'm sure anyone who's read this far may be wondering, did the writing of the code in UT help at all?  To that, I have to say emphatically, yes.

First off, the code of the UT2003 [[Legacy:GameInfo|GameInfo]] was similar to the UT one in many ways.  So this guess had paid off and this was good.  However, I designed a nice system to modularise the UT1 GameInfo, and so had Epic, in a different way, that's incompatible.  I have to face the choice that the GameRules may not work with uCOM and spend time thinking about overcoming this.

Despite this problem, coding in UT1 was still good as it had given me the idea of HOW I wanted to code the Gametypes of the mod.  By that I mean, not the code itself, but the philosophy behind it.  In short, I had some kind of plan behind my motivations.

Secondly, any method of tackling a problem has its own disadvantages compared to other methods.  But, it's easy to forget that each method has advantages aswell, advantages that one may not forsee...  So, by coding, I found out a few things that were not obvious.  By coding the gametypes modularly, it would be exceptionally easy to change gametype midway.  This is an alright thing to have, but really, it would be more useful to have in campaign type RTSs, where one map determines the outcome of the next.  I realised that wouldn't be hard to add in extra.  

These kind of things, are the type that crop up as you code, and I found by coding, I got to spot the above, and a few other things. Problem with cropping up as you code is that it's unplanned.  However, I've not yet started to code and I know how it works, have talked it over with others at the mod and know how it will be implemented.  I think this is good and saves being messy.

===10/10/02 The big blank page... 2-team limits===

Above, I said starting wasn't easy.  Well, I've got the big blank page before me once again.  The main initial problem I've faced before even starting to code is that the UT2003 Team game code doesn't support more then two teams.  This seems a bit limiting to me.  First off, uCOM really should have support for four teams.  It doesn't really need it yet and there arent big plans to have 4 team games, but the option should be there...  On top of that, uCOM needs to have civilians and there should be something for map specified extras, so that's 6 teams in all uCOM needs to see.  This means I must resort to using Deathmatch as superclass of the mod gamecode or dump these ideas for &gt;2 teams.  Personally, I don't like having that level of inflexibility and the existance of arrays like TeamInfo[2] would make it hell to extand later on, so I'm going for the second options.

Thus, my first start is to copy the teamgame code into my uCOM_GameInfo (that's the name of my GameInfo derivative class) and see where the limiting number 2 crops up in both properties and functions:

* var UnrealTeamInfo Teams[2]
* var RedTeamName, BlueTeamName: Used for loading premade teams.  More for the single player I guess.
* var TeamAIType[2]
* var TempSymbols[2]: Note, there is also TeamSymbols[2] in GameRepInfo.
* function PostBeginPlay: Creates settings for Teams[i]
* function OtherTeam: Returns the other team, useless if &gt;2 teams
* function Preloadbots: Accesses functions in each Teams[i]
* function GetBlueTeam: Creates a TeamInfo for the blue team.  Mainly single player part
* function GetRedTeam: Calls super with EnemyRosterName being the same as RedTeamName, so look up that in DeathMatch.
* function InitGame: Inits the TeamAIType.  Parses options for red and blue team names and symbols
* function RestartPlayer: balances teams with bots.  
* function NotifyKilled: Accesses Teams[i]
* function CheckEndGame: Works out winner between 0 and 1.
* function GetBotTeam: Explicitly references each TeamInfo
* function FindTeamFor: Calls functions in Teams[i]
* function PickTeam: Another sorting function which just sorts out which team is bigger and picks the smaller team.
* function PlayEndOfMatchMessage: Accesses Teams[i]
* function FindTeamDesignation: Accesses Teams[i] in the GameRepInfo.  Means GRI needs to be recoded too...
* function FindNewObjectives: Again, accesses Teams[i], would need to be extended.
* function AnnounceScore: Sorts out teams into scoring team and other team (a concept that's not going to work in &gt;2 teams).  Then works out what messages to send (e.g. taken the lead if scores were equal)
* function PostLogin: Announces teamchange of a newly entered player, switches between 0 and 1

Well, that's it.  Other segments that need to be changed include the GameRepInfo but, as pointed out by Flashman below, there's likely to be more...

'''Flashman:''' Just a word of advice: i've been reading different bits about the player models in UT2k3, and the fact that team skinning might be a limitation: only two team skins? If this is also the case (I'm no expert mind) you might want to check out any classes that deal with the Player itself - if there's going to be too much work (including getting your team to make new skins and player models if they arent already) just to get &gt;2 teams in the game?

'''Aphelion:''' Thank you for your advice.  It's worth looking into.  Currently, I'm not too bothered, because uCOM will only have to work with 2 teams in the beginning.  Any code now is trying to save work in the uCOM_GameInfo later on.  Later on, though, if what you say is true....  As I find any errors, I'll post them up.  I'm pretty sure given the big discussion about creating a new unified MCTF mod, noneof this will be wasted.  At worst, anyway, we can have 2 textures, because we can get away with it as the textures are different for each team in not just colour (both teams look radically different, as you might expect from an RTS mod :) ) and then use labelling and lights and so on.  In fact, thinking about it, that could just be the quickest solution... Hmmm...  /me goes away to think. 

=== 17/10/02 === 

Finished looking at TeamInfo.  Will start coding the uCOM_GameInfo now...  Damn my uni work....  Everyone else in uCOM is so far ahead of me now...

===08/12/02 Converting strings to names, other random pieces of info===

Although there's not been much in this journal, I've been doing some coding in among the mass work of Uni and, at least until next term and my dreaded finals, I'm free!  Anyway, time to write down any random bits of useful info I can think of:

'''''Converting Strings to Names:'''''

Highlander needed to change a string to a name and talked to a few people about it, advice ranging from dunno to native coding (!?) solutions were flung his way.  There is a simpler way, so here it is:

In object, there's a functions defined called SetProperty( string, string).  What this does is set any property in a UScript class based on the name of the property (in string format) and it's value (in string format).  This works for names.  So, if I want to set the name variable Tag to a string variable called TagString, I need to simply do the call Self.SetProperty( &quot;Tag&quot;, TagString ).

'''''TeamGame Garbage:'''''  

Most of the TeamGame class is just unneccessary.  I'm saying that just in case you find yourself subclassing the deathmatch class to get more teams and wade through tons of intimidating code.  Most of the TeamGame stuff deals with the single player game and team rosters and contains lots of code that's easy to get lost in.  So, in case you're some unfortunate sod in the position of going through that, don't get downhearted and remember that the InitGame (to set start variables), the ReduceDamage (how else do you not kill your team mates?) and the scorekill (to win) are really the heart, plus some crap to create TeamInfos...

===01/02/03===

Well, this is a bit of a unique date to write down in European format, probably ausipcious or something, then again maybe not.  

Been away from this journal for a while.  Main reason is I want to write something useful, but then I've only been doing grunt level codework for the mod.  Anyway, recently I delved into the GUI code so I think I have some stuff to write about.

====GUI====

'''''Overview of the GUI:'''''

The GUI classes are all of those that extend from [[Legacy:GUI|GUI]] which subclasses Object.  [[Legacy:GUI|GUI]] itself is just an organisational class containing some structs but is subclassed by three child classes:

#[[Legacy:GUIComponent|GUIComponent]]
#[[Legacy:GUIFont|GUIFont]]
#[[Legacy:GUIStyles|GUIStyles]]

[[Legacy:GUIComponent|GUIComponent]] is the actual class that the graphical menus and in-game menus of ut2003 are made out of and as its name suggests, corresponds to actual components in the menu, like buttons, images, lists and arrows.  

[[Legacy:GUIFont|GUIFont]] contains information about fonts.  Used when specifying fonts in GUIComponent.

[[Legacy:GUIStyles|GUIStyles]] contains information about how a particular GUIComponent should be displayed.  Display information (like fonts and images) comes in arrays, each array element corresponding to one focus states.  More about focus lower down.

'''''GUIComponent:'''''

As mentioned, all items displayed on the screen in a menu are [GUIComponent]s.  This includes the page for example.  However, a page has many buttons, check boxes and images embedded into it.  Also, there are other user interface elements that a user would consider to be one item but can in fact be made out of many other [[Legacy:GUIComponent|GUIComponent]]s like [[Legacy:GUIComboBox|GUIComboBox]] which is a drop down menu made up of an edit box, a down arrow and a list.  Such multi-component systems are made out of [[Legacy:GUIComponent|GUIComponent]]'s subclass [[Legacy:GUIMultiComponent|GUIMultiComponent]].

'''''GUIMultiComponent:'''''

This class operates by having a dynamic array called Controls which is of class [[Legacy:GUIComponent|GUIComponent]].  Thus lots of components can be embedded into a single GUIComponent itself and this is how menu pages and tabs are built, along with other multicomponent menu items.

'''''Focus:'''''

Focus is the concept of which menu item is enabled at any one time and accepting input.  Like in Windows or an XWindows server when you have many windows open, only one will accept input from the keyboard.  That window is described as having focus and is normally markd by some colour change.  UT2003 has 5 levels of focus that each component knows about defined as an enumerator in [GUI].  They are:

; MSAT_Blurry  : No focus at all
; MSAT_Watched : Component has mouse over it
; MSAT_Focused : Component is focused
; MSAT_Pressed : Component is pressed
; MSAT_Disabled: ..is disabled

As mentioned, styles define characteristics of the component for each focus state.

===02/02/03===

====Writing a GUI====

'''''Introduction:'''''

This section isn't about how to write a GUI in terms of laying it out and so on, something which is probably better not left to most coders (is it me, or does asthetic design just get in the way of coding? :) ).  This section is more about the mechanics of it, which I've found to be slightly more complicated then using UScript to position GUIComponents inside a page/tab and getting that displayed.  The GUI classes contain a lot of native code and no obvious drawing functions.  With most of the functionality &quot;under the bonnet&quot; as it were, life can be fun.

'''''Static and Dynamic GUIs:'''''

There are two types of GUIs you might want to build: static and dynamic.  Static GUIs are those where you know what menu components are needed on the screen for all the time your menu will be displayed.  Dynamic GUIs don't assume that you know what menu components will be for the time the menu exists.  Notice I said menu components, not user menu items or what a user might assume to be a dynamically generated menu.  If you don't understand that distinction, then don't worry about it as they'll be explained in a bit more detail below.  Dynamic menus are much harder to create then static menus.

'''''Writing a Static GUI:'''''

As mentioned, static GUIs are ones where the person writing the menu knows what menu components are going to be displayed at all times on the menu.  Examples of this are, for example, the UT2003 main menu and the settings tabs in general.  

To write a menu requires that a multi-component class be declared.  In general, this will involve subclassing [[Legacy:GUIPage|GUIPage]] or [[Legacy:GUITabPanel|GUITabPanel]] to create menu pages and menu tabs respectively.  Once you have your class, you need to define the components that go into the menu, namely you have to define what the array Controls is and this is the bit where life gets complicated very quickly.

All [GUIComponent] classes have a function called InitComponent() which is called when a menu is initialised.  One might assume that creating the [GUIComponent] with the ''new'' function and then initialising it to the neccessary values would be a good way to go about it.  However, if this is done, the menu component won't render.  To make the menu component work, (remember there is no obvious draw function to update the screen) the component must be declared in the default properties, which does render it.  Once there is a decleration, the properties of each component can be edited inside the class you've created.  If you haven't seen the syntax, here's an example:

&lt;uscript&gt;

	Begin Object class=GUIImage Name=CharacterDetails
		WinWidth=0.5
		WinHeight=0.943790
		WinLeft=0.021641
		WinTop=0.028105
		Image=Material'InterfaceContent.Menu.BorderBoxD'
		ImageColor=(R=255,G=255,B=255,A=160);
		ImageRenderStyle=MSTY_Alpha
		ImageStyle=ISTY_Stretched
	End Object
	Controls(0)=GUIImage'CharacterDetails'

&lt;/uscript&gt;

Notice the basic points, the '''Begin''' statement, followed by the class, follow by the name.  This is then followed by the default properties of the new menu component being created terminated by an '''''End''' statement.  This defines the object.  Lastly, the object is initialised into the Controls array with the syntax of ClassName'Name' .

Since menu items created via the new comand won't render, it should be possible to see that this limits the menu to containing only the elements declared in the default properties can be used for the menu's duration, what I defined earlier as a static menu.  Notice that there is a way around this render problem and there's more on that under the dynamic menu heading but before you rush there (if that's what you want to create) there's some tricks that can be done with static menus to create dynamic effects (see section below).

Notice throughout I've been careful to say that static menus are those in which the menu components are known throughout the menus' durations. I've been careful to say this because there are certain dynamic effects that can be achieved to create basic dynamic tricks.  Namely, you can make menu items disappear and generate dynamic menus inside pre-exisiting components.  Also, remember all properties of a menu can be changed from their default ones and this will display properly.

''''' &quot;Dynamic&quot; Static Menus: ''''' 

All components have a property called bVisible which is obvious enough what it does.  Just to clarify, this completely removes the control from the screen so that not only is it invisible, but it's not clickable etc.  Using this, it's easily possible to have controls/buttons etc that appear and disappear based on input from the user.  So, for example, if you want to have two buttons like save and discard pop up when someone clicks on a control, it's easily possible to do that by defining the buttons in the default properties and then making them invisible on start (either in the default properties or in InitComponent) and then making them visible when the time comes.

Combining the above invisibility property with the ability to change the components once rendered without affecting them adversely means that a semi-dynamic menu can be created.  To create an example, say you wish to read a map and display selectable starting locations in the form of buttons (assuming there are such [[Legacy:Playerstart|playerstart]] actors in the level, which is NOT true for stock UT2003).  By clicking on a button, a player can choose the start location that's written on the button.  Assuming that a map will never have more then 10 of these selectable start locations, ten buttons can be defined in default properties.  At menu init, the menu scans the map and assigns to each each button one start location up to the max of ten.  Each button that's assigned a start location is then made visible.  So long as the mapper does not exceed 10 start locations, no one need know that this &quot;dynamic&quot; menu is not really dynamic.

However, say you want to get a dynamic amount of start locations displayed.  Can this be done?  Well, yes, by using any component that contains a list ([[Legacy:GUIList|GUIList]]).  Lists are individual menu components, so they need to be declared once in the default properties.  However, they contain a dynamic array.  The dynamic array contains a struct which holds:

#The text displayed in the list for that entry
#An object associated with the list entry
#Some extra string realated to the list entry

Data can be entered into the list during it's initialisation and, providing the list is declared in default properties, the list can be as long as you like (of course, there are some limits, for example, there's a variable for max no of items displayed and the space you can use on a display, go read the class itself).  Thus, to take the example, I have a list (or a [[Legacy:GUIComboBox|GUIComboBox]] which contains a list) in my default properties.  On init, the code scans as before for selectable start locations.  This time, instead of assigning the name of the start location to a button and making it visible, the code simply adds the start location to a list.  If the start location is special, an object can be passed aswell to the list and the onChange delegate in the list can be changed to deal with the object and call functions from it (e.g. to see whether the person's allowed to spawn there) each time a person clicks on it.

The examples are a little specific, but I hope it's easy to see the way in which one should approach building a dynamic menu using existing components.

'''''Dynamic Menus'''''

There are two ways in dealing with a dynamic menu:  

The first is to use existing GUI classes and to use the onDraw delegate.  This allows the coder to draw directly on the canvas of the menu itself, as with a normal HUD.  By returning false, it's possible to stop the native menu drawing code.  Returning true just supplements the native code with your instructions.

One important thing to note is that, although created components aren't rendered, they are still there and can be activated etc.  This is useful in itself if you want to create a menu over some complex image, say, without too much work.

The second way of dealing with a dynamic menu is to write one's own GUI equivalent classes and have the drawing all handled in the HUD of the player.  This is the method that uCOM uses to render the commander's HUD, for example.  

The basic principle for this method is that the controls are created as an interaction.  The interaction is then used to render and to catch input and to pass the mouse coords and textures based on where the mouse is and what's under it) to the HUD.  Then, a class for the actual components themselves, with notification when the mouse is over the component (back to the interaction) and an array to hold other components.  I've left this description vague because there's different ways of actually implementing this this, better left to each individual designer according to their needs.  

[[Legacy:Spark|Spark]] has a tutorial on creating a mouse.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Aphex</title>
    <id>350</id>
    <revision>
      <id>1213</id>
      <timestamp>2004-04-12T11:30:06Z</timestamp>
      <contributor>
        <ip>Cache4-bagu.server.ntli.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==APHEX's BIO==

OK, started mapping for UT soon after it showed up.

1st effort: CTF-Warrior.  Loved by a few, hated by most.

2nd effort: CTF-Supplyline.  Loved by a few, ignored by most.

Made WF-Warrior remix for the WFUT mod.

Since then delved into:

Texture creation (ITex mainly).

Modelling (Blender / GMax/3ds).

Making use of my new digital camera to collect textures from around the world ;)

See some of my stuff here: http://homepage.ntlworld.com/martingbell/

12-Apr-04: Attempting to move into the murky world of games programming.  My unrealEd experience is proving quite handy here :)

----

Hi Aphex. Welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.  &amp;ndash; ''Tarquin''

Hi there again :) Been away for a bit - back now ready for some ut2k3 editing :E  &amp;ndash; ''Aph''

Eek looks like someone rewrote (decoded my rambling) on how zones (may) work to speed up rendering.  It was an educated guess on my part, so did someone get some hard facts?

'''EntropicLqd:''' Welcome back.  You've missed some pretty good stuff unless you've been quietly watching in the sidelines (like a fair few I think). :tup:.  Hope you are well.  I haven't seen you for ages.

'''Aphex:''' Yep - sidelines mostly. Moved house, done it up, got kid on the way in Jan ==:-o  topical?  ;)

'''EntropicLqd:''' Oh well, enjoy the rest of your life.  It'll be over in four months.  So which part of ''Don't do it, run away screaming.'' didn't you understand again?

'''EntropicLqd:''' How's life?  Mwhahahahahaha!

'''Aph 'tired' ex:''' sooooo.... tired.....  %-) lol - not as bad as I thought it would be though - got a great kid - doesn't cry much... not yet anyways :)

'''EntropicLqd:''' Heh - it wasn't the first that pushed me over the edge .. it was when the second arrived.  Glad you're having fun though.  There may have been a time when I wasn't constantly tired - I just can't remember it. :)

'''Aphex:''' 2nd?!?!  Hmm not just yet ;)  Expensive things these kiddies!  He's at the smiley stage though - makes getting up in the morning worth it :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1214</id>
      <timestamp>2003-03-25T16:44:39Z</timestamp>
      <contributor>
        <ip>Aphex</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==APHEX's BIO==

OK, started mapping for UT soon after it showed up.

1st effort: CTF-Warrior.  Loved by a few, hated by most.

2nd effort: CTF-Supplyline.  Loved by a few, ignored by most.

Made WF-Warrior remix for the WFUT mod.

Since then delved into:

Texture creation (ITex mainly).

Modelling (Blender / GMax/3ds).

Making use of my new digital camera to collect textures from around the world ;)

See some of my stuff here: http://homepage.ntlworld.com/martingbell/

----

Hi Aphex. Welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.  &amp;ndash; ''Tarquin''

Hi there again :) Been away for a bit - back now ready for some ut2k3 editing :E  &amp;ndash; ''Aph''

Eek looks like someone rewrote (decoded my rambling) on how zones (may) work to speed up rendering.  It was an educated guess on my part, so did someone get some hard facts?

'''EntropicLqd:''' Welcome back.  You've missed some pretty good stuff unless you've been quietly watching in the sidelines (like a fair few I think). :tup:.  Hope you are well.  I haven't seen you for ages.

'''Aphex:''' Yep - sidelines mostly. Moved house, done it up, got kid on the way in Jan ==:-o  topical?  ;)

'''EntropicLqd:''' Oh well, enjoy the rest of your life.  It'll be over in four months.  So which part of ''Don't do it, run away screaming.'' didn't you understand again?

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1215</id>
      <timestamp>2003-04-09T10:09:29Z</timestamp>
      <contributor>
        <ip>Aphex</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==APHEX's BIO==

OK, started mapping for UT soon after it showed up.

1st effort: CTF-Warrior.  Loved by a few, hated by most.

2nd effort: CTF-Supplyline.  Loved by a few, ignored by most.

Made WF-Warrior remix for the WFUT mod.

Since then delved into:

Texture creation (ITex mainly).

Modelling (Blender / GMax/3ds).

Making use of my new digital camera to collect textures from around the world ;)

See some of my stuff here: http://homepage.ntlworld.com/martingbell/

----

Hi Aphex. Welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.  &amp;ndash; ''Tarquin''

Hi there again :) Been away for a bit - back now ready for some ut2k3 editing :E  &amp;ndash; ''Aph''

Eek looks like someone rewrote (decoded my rambling) on how zones (may) work to speed up rendering.  It was an educated guess on my part, so did someone get some hard facts?

'''EntropicLqd:''' Welcome back.  You've missed some pretty good stuff unless you've been quietly watching in the sidelines (like a fair few I think). :tup:.  Hope you are well.  I haven't seen you for ages.

'''Aphex:''' Yep - sidelines mostly. Moved house, done it up, got kid on the way in Jan ==:-o  topical?  ;)

'''EntropicLqd:''' Oh well, enjoy the rest of your life.  It'll be over in four months.  So which part of ''Don't do it, run away screaming.'' didn't you understand again?

'''EntropicLqd:''' How's life?  Mwhahahahahaha!

'''Aph 'tired' ex:''' sooooo.... tired.....  %-) lol - not as bad as I thought it would be though - got a great kid - doesn't cry much... not yet anyways :)

'''EntropicLqd:''' Heh - it wasn't the first that pushed me over the edge .. it was when the second arrived.  Glad you're having fun though.  There may have been a time when I wasn't constantly tired - I just can't remember it. :)

'''Aphex:''' 2nd?!?!  Hmm not just yet ;)  Expensive things these kiddies!  He's at the smiley stage though - makes getting up in the morning worth it :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Appleweed</title>
    <id>447</id>
    <revision>
      <id>1481</id>
      <timestamp>2003-12-11T19:35:37Z</timestamp>
      <contributor>
        <ip>Appleweed</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Appleweed''' is an old nickname of mine that stuck. Imagine a baseball team of 10 year-old boys trying to learn each others names. Now imagine you live in Minnesota where everyone else has a name like &quot;Johnson&quot; and you're of Arab descent. ''Appleweed'' was the best they could pronounce. :)

My real name is Omar. But &quot;hey you&quot; works just fine. ;)

==Stuff I Like==
* [http://www.homestarrunner.com/sbemail.html Strongbad's e-mail] Trust me. Click on this link!
* [http://www.slashdot.org Slashdot] &quot;News for nerds. Stuff that matters.&quot; Damn skippy.

==Stuff I Hate==
* [http://www.riaa.com RIAA] aka, The &quot;let's sue our customers&quot; association. o_O

==Stuff I Wrote==
* [http://www.gamedev.net/reference/programming/features/distributed/ Distributed Gaming]
* [http://www.indigenoustech.com/meesha.htm Meesha]

==Projects==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Vegas Style]]

==Links of Interest==
* [http://www.indigenoustech.com My Website]
* [http://www.gamedev.net GameDev.net] Great game developer site.

==Contact Info==
* [mailto:appleweedDONOTSPAMME@indigenoustech.com appleweedDONOTSPAMME@indigenoustech.com] No spam, please!

==Discussion==

'''GRAF1K:''' Hey you, welcome to the wiki. ;-) :tup:

'''RegularX:''' Greets Appleweed.  Glad you could make it.

'''appleweed:''' Thanks for the welcome, guys! Much appreciated! I'll have more to add here soon.

'''Tarquin:''' Hi. Welcome to the site :) Distributed Gaming sounds like an interesting concept.

'''Foxpaw:''' To avoid spam, you might consider changing the @ in your email address above to something that would be recognized as a replacement. (like &quot;something at somethingelse.com&quot;) I believe there are automated email-seeking programs that roam the net looking for new email addresses to add to bulk email lists.

'''appleweed:''' Thanks for the advice! Forgot to do this.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1482</id>
      <timestamp>2003-12-11T06:03:16Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Appleweed''' is an old nickname of mine that stuck. Imagine a baseball team of 10 year-old boys trying to learn each others names. Now imagine you live in Minnesota where everyone else has a name like &quot;Johnson&quot; and you're of Arab descent. ''Appleweed'' was the best they could pronounce. :)

My real name is Omar. But &quot;hey you&quot; works just fine. ;)

==Stuff I Like==
* [http://www.homestarrunner.com/sbemail.html Strongbad's e-mail] Trust me. Click on this link!
* [http://www.slashdot.org Slashdot] &quot;News for nerds. Stuff that matters.&quot; Damn skippy.

==Stuff I Hate==
* [http://www.riaa.com RIAA] aka, The &quot;let's sue our customers&quot; association. o_O

==Stuff I Wrote==
* [http://www.gamedev.net/reference/programming/features/distributed/ Distributed Gaming]
* [http://www.indigenoustech.com/meesha.htm Meesha]

==Projects==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Vegas Style]]

==Links of Interest==
* [http://www.indigenoustech.com My Website]
* [http://www.gamedev.net GameDev.net] Great game developer site.

==Contact Info==
* [mailto:appleweed@indigenoustech.com appleweed@indigenoustech.com] No spam, please!

==Discussion==

'''GRAF1K:''' Hey you, welcome to the wiki. ;-) :tup:

'''RegularX:''' Greets Appleweed.  Glad you could make it.

'''appleweed:''' Thanks for the welcome, guys! Much appreciated! I'll have more to add here soon.

'''Tarquin:''' Hi. Welcome to the site :) Distributed Gaming sounds like an interesting concept.

'''Foxpaw:''' To avoid spam, you might consider changing the @ in your email address above to something that would be recognized as a replacement. (like &quot;something at somethingelse.com&quot;) I believe there are automated email-seeking programs that roam the net looking for new email addresses to add to bulk email lists.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Appleweed/Vegas Style</title>
    <id>453</id>
    <revision>
      <id>1496</id>
      <timestamp>2005-08-30T09:56:05Z</timestamp>
      <contributor>
        <ip>142-165-228-70.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>question about player/commerce data transfering</comment>
      <text xml:space="preserve">The purpose of this mod is to facilitate cash prize tournament through an in-game commerce service. This mod leverages concepts around [http://www.gamedev.net/reference/programming/features/distributed/ Distributed Gaming] and the [http://www.indigenoustech.com/meesha.htm Meesha] implementation. For the first release, [http://www.paypal.com PayPal] is used for secure transactions.

Basically, any [[Legacy:DeathMatch|DeathMatch]] game can add this mod as a [[Legacy:Mutator|mutator]]. Servers set an &quot;ante&quot; as an entry fee to play. The winner takes home the &quot;pot&quot;! :)

==Why?==

I'm very interested in creating commerce experiences within gaming. (Before anyone jumps to conclusions, ''NO'', I don't want to create a 3-D store within a game!) Much of this interest has come from many years of game play, especially in Massive Multiplayer Online Role-Playing Games (MMORPG) like [http://www.uo.com Ultima Online] and [http://www.everquest.com Everquest]. (For further reference, see &quot;Inspiration&quot;, below.)

Also, have you seen [http://www.ultimatearena.com Ultimate Arena]? Pretty cool, but I wanted to be able to choose from the many different games created by the Unreal community of developers. And, hey, why pay someone else a commission?!

==What?==

There are two components to running Vegas Style games: The [[Legacy:Mutator|mutator]] and the commerce service.

Technically, &quot;Vegas Style&quot; is a [[Legacy:Mutator|mutator]]. It has the following features:
* In-game currency called &quot;Gibsons&quot;. (Named after [http://www.williamgibsonbooks.com/blog/blog.asp William Gibson] who you should all know, love, worship. ;))
* Ability to set entry fees (&quot;antes&quot;) in Gibsons on the server in order to play. ([[Legacy:DeathMatch|DeathMatch]] games only, for now.)
* Separate and secure [http://pajhome.org.uk/crypt/md5/chaplogin.html CHAP] logins to commerce service for transaction management and player accounts.

The Commerce Service is a set of web pages. It has the following features:
* Tracks in-game commerce transactions and player accounts. (i.e.: games, sessions, antes, winnings, reversals.)
* Ability to exchange Gibsons for U.S. Dollars and vice-versa via payment gateways.
* [http://www.paypal.com PayPal] gateway. (Possibly others in the future: [http://www.authorizenet.com Authorize.Net], etc.)
* Session management featuring [http://pajhome.org.uk/crypt/md5/chaplogin.html CHAP] logins.
* Player account management via web only. (This is purposely a security feature.)

Requirements:
* UT2k3, of course.
* [http://www.paypal.com PayPal] accounts for each player and server.
* [[Legacy:LibHTTP|LibHTTP]]

==How?==

[[Image:Legacy_VegasStyleNetwork.jpeg|center|]]

... more detail here in a bit.

==When?==

Soon!

==Future Plans==
* Move commerce service to [http://www.indigenoustech.com/meesha.htm Meesha] implementation. (Account management will still be via web.)
* Add more payment gateways, like [http://www.authorizenet.com Authorize.Net].
* Make Gibsons exchangeable with UO gold, Everquest platinum, and Star Wars Galaxies credits. :cool:
* &quot;Make plans to take over the world.&quot; - The Brain (&quot;Pinky &amp; The Brain&quot;)

==Inspiration==
* [http://papers.ssrn.com/sol3/papers.cfm?abstract_id=294828 Virtual Worlds: A First-Hand Account of Market and Society on the Cyberian Frontier] Paper by Edward Castronova that documents the real economy created within the world of Everquest's Norrath.
* [http://terranova.blogs.com/ Terra Nova] Incredible blog around the impact of online games.
* [http://business.fullerton.edu/ecastronova/ Proskenion] Edward Castronova's website.

==Comments==

'''Foxpaw:''' Well, my two cents would be, when real money becomes involved people can get kind of serious about the game, and it can foster bad attitudes. From a technical standpoint, I think you may run into a different problem. You can make it hard for a person to decompile your source code and figure out a way to try and cheat other people out of their money, but you can't really make it impossible for them to decompile the sources. I'm not sure if it would be really difficult or not, but I would be wary of the security implications when people have the incentive of real money.

'''appleweed:''' Good points all around. We actually had a short thread on this on the forums: [http://forums.beyondunreal.com/showthread.php?t=121354 Vegas discussion]. I see this mod for use with groups of people that know each other very well. In this case, I see playing UT for cash no different than playing a buck a hole in golf or a friendly poker game. I have thought of some ways to combat cheating, but this would be necessary only for anonymous tournament play. Also, in the end, whomever owns the UT server can pretty much determine the winner. It isn't a simple matter of protecting the code. (Tho, the MD5 checks do help.) One could easily add another mutator to the server that says &quot;my buddy Tim always wins&quot;. However, noone will be able to simply login and steal your winnings. That has been protected using encryption, the fact that account information is never replicated and ultimately your PayPal account handles your cash winnings. More of this will be made obvious when I update the &quot;How?&quot; above.

'''MythOpus:'''  Knowing very little about replication and the order data should be sent... I was just looking at the diagram and noticed something.  I read it in two different ways... one... the players are sending data to the commerce server itself, without sending the commerce data through the UT server to be verified... or if I'm reading it in a different way, the commerce server shouldn't be sending data to the players directly as it could be corrupted and hacked.  Shouldn't all data be routed through the UT server for more security?</text>
    </revision>
    <revision>
      <id>1497</id>
      <timestamp>2003-12-12T18:20:09Z</timestamp>
      <contributor>
        <ip>Appleweed</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The purpose of this mod is to facilitate cash prize tournament through an in-game commerce service. This mod leverages concepts around [http://www.gamedev.net/reference/programming/features/distributed/ Distributed Gaming] and the [http://www.indigenoustech.com/meesha.htm Meesha] implementation. For the first release, [http://www.paypal.com PayPal] is used for secure transactions.

Basically, any [[Legacy:DeathMatch|DeathMatch]] game can add this mod as a [[Legacy:Mutator|mutator]]. Servers set an &quot;ante&quot; as an entry fee to play. The winner takes home the &quot;pot&quot;! :)

==Why?==

I'm very interested in creating commerce experiences within gaming. (Before anyone jumps to conclusions, ''NO'', I don't want to create a 3-D store within a game!) Much of this interest has come from many years of game play, especially in Massive Multiplayer Online Role-Playing Games (MMORPG) like [http://www.uo.com Ultima Online] and [http://www.everquest.com Everquest]. (For further reference, see &quot;Inspiration&quot;, below.)

Also, have you seen [http://www.ultimatearena.com Ultimate Arena]? Pretty cool, but I wanted to be able to choose from the many different games created by the Unreal community of developers. And, hey, why pay someone else a commission?!

==What?==

There are two components to running Vegas Style games: The [[Legacy:Mutator|mutator]] and the commerce service.

Technically, &quot;Vegas Style&quot; is a [[Legacy:Mutator|mutator]]. It has the following features:
* In-game currency called &quot;Gibsons&quot;. (Named after [http://www.williamgibsonbooks.com/blog/blog.asp William Gibson] who you should all know, love, worship. ;))
* Ability to set entry fees (&quot;antes&quot;) in Gibsons on the server in order to play. ([[Legacy:DeathMatch|DeathMatch]] games only, for now.)
* Separate and secure [http://pajhome.org.uk/crypt/md5/chaplogin.html CHAP] logins to commerce service for transaction management and player accounts.

The Commerce Service is a set of web pages. It has the following features:
* Tracks in-game commerce transactions and player accounts. (i.e.: games, sessions, antes, winnings, reversals.)
* Ability to exchange Gibsons for U.S. Dollars and vice-versa via payment gateways.
* [http://www.paypal.com PayPal] gateway. (Possibly others in the future: [http://www.authorizenet.com Authorize.Net], etc.)
* Session management featuring [http://pajhome.org.uk/crypt/md5/chaplogin.html CHAP] logins.
* Player account management via web only. (This is purposely a security feature.)

Requirements:
* UT2k3, of course.
* [http://www.paypal.com PayPal] accounts for each player and server.
* [[Legacy:LibHTTP|LibHTTP]]

==How?==

[[Image:Legacy_VegasStyleNetwork.jpeg|center|]]

... more detail here in a bit.

==When?==

Soon!

==Future Plans==
* Move commerce service to [http://www.indigenoustech.com/meesha.htm Meesha] implementation. (Account management will still be via web.)
* Add more payment gateways, like [http://www.authorizenet.com Authorize.Net].
* Make Gibsons exchangeable with UO gold, Everquest platinum, and Star Wars Galaxies credits. :cool:
* &quot;Make plans to take over the world.&quot; - The Brain (&quot;Pinky &amp; The Brain&quot;)

==Inspiration==
* [http://papers.ssrn.com/sol3/papers.cfm?abstract_id=294828 Virtual Worlds: A First-Hand Account of Market and Society on the Cyberian Frontier] Paper by Edward Castronova that documents the real economy created within the world of Everquest's Norrath.
* [http://terranova.blogs.com/ Terra Nova] Incredible blog around the impact of online games.
* [http://business.fullerton.edu/ecastronova/ Proskenion] Edward Castronova's website.

==Comments==

'''Foxpaw:''' Well, my two cents would be, when real money becomes involved people can get kind of serious about the game, and it can foster bad attitudes. From a technical standpoint, I think you may run into a different problem. You can make it hard for a person to decompile your source code and figure out a way to try and cheat other people out of their money, but you can't really make it impossible for them to decompile the sources. I'm not sure if it would be really difficult or not, but I would be wary of the security implications when people have the incentive of real money.

'''appleweed:''' Good points all around. We actually had a short thread on this on the forums: [http://forums.beyondunreal.com/showthread.php?t=121354 Vegas discussion]. I see this mod for use with groups of people that know each other very well. In this case, I see playing UT for cash no different than playing a buck a hole in golf or a friendly poker game. I have thought of some ways to combat cheating, but this would be necessary only for anonymous tournament play. Also, in the end, whomever owns the UT server can pretty much determine the winner. It isn't a simple matter of protecting the code. (Tho, the MD5 checks do help.) One could easily add another mutator to the server that says &quot;my buddy Tim always wins&quot;. However, noone will be able to simply login and steal your winnings. That has been protected using encryption, the fact that account information is never replicated and ultimately your PayPal account handles your cash winnings. More of this will be made obvious when I update the &quot;How?&quot; above.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Application</title>
    <id>408</id>
    <revision>
      <id>1355</id>
      <timestamp>2008-03-20T22:52:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page lists '''applications''' which are useful for working with the [[Legacy:Unreal Engine|Unreal engine]]. Some have been designed specifically for this purpose, some we just recommend as handy to have.

This page is a forward index, split into sub-pages by type. For a flat list of all pages about applications, see [[:Category:Legacy Application]].

See also [[Legacy:Third-Party Components|Third-Party Components]] for external components that can be added to maps.

==Bundled ==

Bundled in with [[Legacy:UT2003|UT2003]]:
* [[Legacy:UnrealEd 3|UnrealEd 3]], of course (older [[Legacy:UnrealEd Versions|UnrealEd Versions]] with older games)
* [[Legacy:Maya|Maya]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] - Make skins in 3D! Buggy though :(
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.

==Third party==
* [[Legacy:Mapping Application|Mapping Application]]
* [[Legacy:Modelling Application|Modelling Application]]
* [[Legacy:Model Conversion Application|Model Conversion Application]]
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Documentation Tool|Documentation Tool]]

''suggest more grouping pages''

===Compilers ===

* [[Legacy:UMake|UMake]] &amp;ndash; Wrapper tool for &quot;ucc make&quot; with a bunch of additional convenience options

===Documentation ===
* [[Legacy:UClasses|UClasses]] &amp;ndash; Stand-alone Unreal class browser.
* [[Legacy:UnCodeX|UnCodeX]] &amp;ndash; Class browser and document generator
* [[Legacy:UnDox|UnDox]]
* [[Legacy:UnDox Revisited|UnDox Revisited]]

===Tools ===
* [[Legacy:CVS|CVS]]
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UnrVarpu|UnrVarpu]] &amp;ndash; C++ class library (sources included) for decoding Unreal packages

==Text Editors ==

see [[Legacy:Text_Editor|Text_Editor]]

==Coding utilities ==

==Music utilities ==
* [[Legacy:ModPlug Tracker|ModPlug Tracker]] &amp;ndash; Tool to edit/create Unreal's .umx files.

==Sound Editing/Recording tools ==
* [[Legacy:GoldWave|GoldWave]]

==General utilities ==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2k3 win-registry-keys
* [[Legacy:Unreal Tournament 3 Tweaker|Unreal Tournament 3 Tweaker]]

==Wheeee! ==
* [[Legacy:Capturing Unreal Video|Capturing Unreal video]]

See http://w3.one.net/~darkon/cgi-bin/shire-wiki.cgi?UnrealTournament for a perl script that synchronizes map lists.

==Comments==

===This index===

It's got to the point where we have SO MANY pages for apps on this wiki. There's official stuff like UPaint, homemade like Umake and UnCodeX, stuff that's not really Unreal related but that we recommend as useful... basically, this [[MeatBall:ForwardIndex]] is becoming too hard to maintain; and it's getting too long to digest. So maybe we should switch to a reverse index and create [[:Category:Legacy Application]]. Keep forward indexes for specific areas, such as [[Legacy:Texture Editing Program|Texture Editing Program]], or [[Legacy:UnrealScript Editors|UnrealScript Editors]]. Any thoughts on this?

Mych:  [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' here's my plan:

====1. type pages====

Specialized forward indexes for different types of app, such as
* [[Legacy:Texture Editing Program|Texture editing program]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Model Editor|Model editor]]

... and so on. These names can be easily back-linked from pages for specific apps:

: foo is an [[Legacy:IDE|IDE]] bla bla bla

====2 parent page====

This page remains a parent page that leads to the above type pages. any apps that don't get listed on a type page stay here.

====3 reverse index====

Use [[:Category:Legacy Application]] so we can generate a flat list of all applications discussed on the wiki

How does that sound?

'''Tarquin:''' no opinions? I'll take that as a unanimous yes then

'''Wormbo:''' Sounds good to me, so if you need an explicit &quot;yes&quot;, you got mine. :)

'''Ch3z:''' Those Type Pages maybe need a sufix like, &quot;TextureEdit_Apps&quot;, &quot;IDE_Apps&quot;, &quot;TextEdit_Apps&quot;, &quot;ModelEdit_Apps&quot;, &quot;ModelConvert_Apps&quot;? Or maybe a prefix?

'''Bob_The_Beheader:''' I've noticed when adding a program to the [[Legacy:Graphics_Application|Graphics_Application]] page, some of the programs already listed don't have there own page, and therefore can't be listed on the [[Legacy:Category_Application|Category_Application]] page. Should seperate pages be made for these apps, or are users expected to follow the link to the [[Legacy:Application|Application]] page?

'''Tarquin:''' Depends if there's anything interesting to say about the app. is [[Legacy:Application|Application]] not prominent enough?

'''Bob_The_Beheader:''' Tarquin is what ive just done with adding the link to the Text Editor page what you are talking about for Type Pages in step one?</text>
    </revision>
    <revision>
      <id>1356</id>
      <timestamp>2006-12-08T20:43:38Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>Adding a section/link to the Text_Editor page</comment>
      <text xml:space="preserve">This page lists '''applications''' which are useful for working with the [[Legacy:Unreal Engine|Unreal engine]]. Some have been designed specifically for this purpose, some we just recommend as handy to have.

This page is a forward index, split into sub-pages by type. For a flat list of all pages about applications, see [[:Category:Legacy Application]].

See also [[Legacy:Third-Party Components|Third-Party Components]] for external components that can be added to maps.

==Bundled ==

Bundled in with [[Legacy:UT2003|UT2003]]:
* [[Legacy:UnrealEd 3|UnrealEd 3]], of course (older [[Legacy:UnrealEd Versions|UnrealEd Versions]] with older games)
* [[Legacy:Maya|Maya]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] - Make skins in 3D! Buggy though :(
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.

==Third party==
* [[Legacy:Mapping Application|Mapping Application]]
* [[Legacy:Modelling Application|Modelling Application]]
* [[Legacy:Model Conversion Application|Model Conversion Application]]
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Documentation Tool|Documentation Tool]]

''suggest more grouping pages''

===Compilers ===

* [[Legacy:UMake|UMake]] &amp;ndash; Wrapper tool for &quot;ucc make&quot; with a bunch of additional convenience options

===Documentation ===
* [[Legacy:UClasses|UClasses]] &amp;ndash; Stand-alone Unreal class browser.
* [[Legacy:UnCodeX|UnCodeX]] &amp;ndash; Class browser and document generator
* [[Legacy:UnDox|UnDox]]
* [[Legacy:UnDox Revisited|UnDox Revisited]]

===Tools ===
* [[Legacy:CVS|CVS]]
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UnrVarpu|UnrVarpu]] &amp;ndash; C++ class library (sources included) for decoding Unreal packages

==Text Editors ==

see [[Legacy:Text_Editor|Text_Editor]]

==Coding utilities ==

==Music utilities ==
* [[Legacy:ModPlug Tracker|ModPlug Tracker]] &amp;ndash; Tool to edit/create Unreal's .umx files.

==Sound Editing/Recording tools ==
* [[Legacy:GoldWave|GoldWave]]

==General utilities ==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2k3 win-registry-keys

==Wheeee! ==
* [[Legacy:Capturing Unreal Video|Capturing Unreal video]]

See http://w3.one.net/~darkon/cgi-bin/shire-wiki.cgi?UnrealTournament for a perl script that synchronizes map lists.

==Comments==

===This index===

It's got to the point where we have SO MANY pages for apps on this wiki. There's official stuff like UPaint, homemade like Umake and UnCodeX, stuff that's not really Unreal related but that we recommend as useful... basically, this [[MeatBall:ForwardIndex]] is becoming too hard to maintain; and it's getting too long to digest. So maybe we should switch to a reverse index and create [[:Category:Legacy Application]]. Keep forward indexes for specific areas, such as [[Legacy:Texture Editing Program|Texture Editing Program]], or [[Legacy:UnrealScript Editors|UnrealScript Editors]]. Any thoughts on this?

Mych:  [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' here's my plan:

====1. type pages====

Specialized forward indexes for different types of app, such as
* [[Legacy:Texture Editing Program|Texture editing program]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Model Editor|Model editor]]

... and so on. These names can be easily back-linked from pages for specific apps:

: foo is an [[Legacy:IDE|IDE]] bla bla bla

====2 parent page====

This page remains a parent page that leads to the above type pages. any apps that don't get listed on a type page stay here.

====3 reverse index====

Use [[:Category:Legacy Application]] so we can generate a flat list of all applications discussed on the wiki

How does that sound?

'''Tarquin:''' no opinions? I'll take that as a unanimous yes then

'''Wormbo:''' Sounds good to me, so if you need an explicit &quot;yes&quot;, you got mine. :)

'''Ch3z:''' Those Type Pages maybe need a sufix like, &quot;TextureEdit_Apps&quot;, &quot;IDE_Apps&quot;, &quot;TextEdit_Apps&quot;, &quot;ModelEdit_Apps&quot;, &quot;ModelConvert_Apps&quot;? Or maybe a prefix?

'''Bob_The_Beheader:''' I've noticed when adding a program to the [[Legacy:Graphics_Application|Graphics_Application]] page, some of the programs already listed don't have there own page, and therefore can't be listed on the [[Legacy:Category_Application|Category_Application]] page. Should seperate pages be made for these apps, or are users expected to follow the link to the [[Legacy:Application|Application]] page?

'''Tarquin:''' Depends if there's anything interesting to say about the app. is [[Legacy:Application|Application]] not prominent enough?

'''Bob_The_Beheader:''' Tarquin is what ive just done with adding the link to the Text Editor page what you are talking about for Type Pages in step one?</text>
    </revision>
    <revision>
      <id>33138</id>
      <timestamp>2008-10-17T19:01:40Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <minor/>
      <comment>/* Compilers */ Mentioned MonkeyBuild</comment>
      <text xml:space="preserve">This page lists '''applications''' which are useful for working with the [[Legacy:Unreal Engine|Unreal engine]]. Some have been designed specifically for this purpose, some we just recommend as handy to have.

This page is a forward index, split into sub-pages by type. For a flat list of all pages about applications, see [[:Category:Legacy Application]].

See also [[Legacy:Third-Party Components|Third-Party Components]] for external components that can be added to maps.

==Bundled ==

Bundled in with [[Legacy:UT2003|UT2003]]:
* [[Legacy:UnrealEd 3|UnrealEd 3]], of course (older [[Legacy:UnrealEd Versions|UnrealEd Versions]] with older games)
* [[Legacy:Maya|Maya]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] - Make skins in 3D! Buggy though :(
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.

==Third party==
* [[Legacy:Mapping Application|Mapping Application]]
* [[Legacy:Modelling Application|Modelling Application]]
* [[Legacy:Model Conversion Application|Model Conversion Application]]
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Documentation Tool|Documentation Tool]]

''suggest more grouping pages''

===Compilers ===

* [[Legacy:UMake|UMake]] &amp;ndash; Wrapper tool for &quot;ucc make&quot; with a bunch of additional convenience options
* [[MonkeyBuild]] &amp;ndash; Sequencer for &quot;ucc make&quot; and other UnrealScript development tasks

===Documentation ===
* [[Legacy:UClasses|UClasses]] &amp;ndash; Stand-alone Unreal class browser.
* [[Legacy:UnCodeX|UnCodeX]] &amp;ndash; Class browser and document generator
* [[Legacy:UnDox|UnDox]]
* [[Legacy:UnDox Revisited|UnDox Revisited]]

===Tools ===
* [[Legacy:CVS|CVS]]
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UnrVarpu|UnrVarpu]] &amp;ndash; C++ class library (sources included) for decoding Unreal packages

==Text Editors ==

see [[Legacy:Text_Editor|Text_Editor]]

==Coding utilities ==

==Music utilities ==
* [[Legacy:ModPlug Tracker|ModPlug Tracker]] &amp;ndash; Tool to edit/create Unreal's .umx files.

==Sound Editing/Recording tools ==
* [[Legacy:GoldWave|GoldWave]]

==General utilities ==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2k3 win-registry-keys
* [[Legacy:Unreal Tournament 3 Tweaker|Unreal Tournament 3 Tweaker]]

==Wheeee! ==
* [[Legacy:Capturing Unreal Video|Capturing Unreal video]]

See http://w3.one.net/~darkon/cgi-bin/shire-wiki.cgi?UnrealTournament for a perl script that synchronizes map lists.

==Comments==

===This index===

It's got to the point where we have SO MANY pages for apps on this wiki. There's official stuff like UPaint, homemade like Umake and UnCodeX, stuff that's not really Unreal related but that we recommend as useful... basically, this [[MeatBall:ForwardIndex]] is becoming too hard to maintain; and it's getting too long to digest. So maybe we should switch to a reverse index and create [[:Category:Legacy Application]]. Keep forward indexes for specific areas, such as [[Legacy:Texture Editing Program|Texture Editing Program]], or [[Legacy:UnrealScript Editors|UnrealScript Editors]]. Any thoughts on this?

Mych:  [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' here's my plan:

====1. type pages====

Specialized forward indexes for different types of app, such as
* [[Legacy:Texture Editing Program|Texture editing program]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Model Editor|Model editor]]

... and so on. These names can be easily back-linked from pages for specific apps:

: foo is an [[Legacy:IDE|IDE]] bla bla bla

====2 parent page====

This page remains a parent page that leads to the above type pages. any apps that don't get listed on a type page stay here.

====3 reverse index====

Use [[:Category:Legacy Application]] so we can generate a flat list of all applications discussed on the wiki

How does that sound?

'''Tarquin:''' no opinions? I'll take that as a unanimous yes then

'''Wormbo:''' Sounds good to me, so if you need an explicit &quot;yes&quot;, you got mine. :)

'''Ch3z:''' Those Type Pages maybe need a sufix like, &quot;TextureEdit_Apps&quot;, &quot;IDE_Apps&quot;, &quot;TextEdit_Apps&quot;, &quot;ModelEdit_Apps&quot;, &quot;ModelConvert_Apps&quot;? Or maybe a prefix?

'''Bob_The_Beheader:''' I've noticed when adding a program to the [[Legacy:Graphics_Application|Graphics_Application]] page, some of the programs already listed don't have there own page, and therefore can't be listed on the [[Legacy:Category_Application|Category_Application]] page. Should seperate pages be made for these apps, or are users expected to follow the link to the [[Legacy:Application|Application]] page?

'''Tarquin:''' Depends if there's anything interesting to say about the app. is [[Legacy:Application|Application]] not prominent enough?

'''Bob_The_Beheader:''' Tarquin is what ive just done with adding the link to the Text Editor page what you are talking about for Type Pages in step one?</text>
    </revision>
    <revision>
      <id>44110</id>
      <timestamp>2010-11-12T00:00:37Z</timestamp>
      <contributor>
        <ip>216.196.244.38</ip>
      </contributor>
      <text xml:space="preserve">This page lists '''applications''' which are useful for working with the [[Legacy:Unreal Engine|Unreal engine]]. Some have been designed specifically for this purpose, some we just recommend as handy to have.

This page is a forward index, split into sub-pages by type. For a flat list of all pages about applications, see [[:Category:Legacy Application]].

See also [[Legacy:Third-Party Components|Third-Party Components]] for external components that can be added to maps.

==Bundled ==

Bundled in with [[Legacy:UT2003|UT2003]]:
* [[Legacy:UnrealEd 3|UnrealEd 3]], of course (older [[Legacy:UnrealEd Versions|UnrealEd Versions]] with older games)
* [[Legacy:Maya|Maya]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] - Make skins in 3D! Buggy though :(
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.

==Third party==
* [[Legacy:Mapping Application|Mapping Application]]
* [[Legacy:Modelling Application|Modelling Application]]
* [[Legacy:Model Conversion Application|Model Conversion Application]]
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Documentation Tool|Documentation Tool]]

''suggest more grouping pages''

===Compilers ===

* [[Legacy:UMake|UMake]] &amp;ndash; Wrapper tool for &quot;ucc make&quot; with a bunch of additional convenience options
* [[MonkeyBuild]] &amp;ndash; Sequencer for &quot;ucc make&quot; and other UnrealScript development tasks

===Documentation ===
* [[Legacy:UClasses|UClasses]] &amp;ndash; Stand-alone Unreal class browser.
* [[Legacy:UnCodeX|UnCodeX]] &amp;ndash; Class browser and document generator
* [[Legacy:UnDox|UnDox]]
* [[Legacy:UnDox Revisited|UnDox Revisited]]

===Tools ===
* [[Legacy:CVS|CVS]]
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UnrVarpu|UnrVarpu]] &amp;ndash; C++ class library (sources included) for decoding Unreal packages

==Text Editors ==

see [[Legacy:Text_Editor|Text_Editor]]

==Coding utilities ==

==Music utilities ==
* [[Legacy:ModPlug Tracker|ModPlug Tracker]] &amp;ndash; Tool to edit/create Unreal's .umx files.

==Sound Editing/Recording tools ==
* [[Legacy:GoldWave|GoldWave]]

==General utilities ==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2k3 win-registry-keys
* [[Legacy:Unreal Tournament 3 Tweaker|Unreal Tournament 3 Tweaker]]

==Wheeee! ==
* [[Legacy:Capturing Unreal Video|Capturing Unreal video]]

See http://w3.one.net/~darkon/cgi-bin/shire-wiki.cgi?UnrealTournament for a perl script that synchronizes map lists.

==Comments==

===This index===

It's got to the point where we have SO MANY pages for apps on this wiki. There's official stuff like UPaint, homemade like Umake and UnCodeX, stuff that's not really Unreal related but that we recommend as useful... basically, this [[MeatBall:ForwardIndex]] is becoming too hard to maintain; and it's getting too long to digest. So maybe we should switch to a reverse index and create [[:Category:Legacy Application]]. Keep forward indexes for specific areas, such as [[Legacy:Texture Editing Program|Texture Editing Program]], or [[Legacy:UnrealScript Editors|UnrealScript Editors]]. Any thoughts on this?

Mych:  [[Legacy:Application|Application]] might have subpages, for that matter.

'''Tarquin:''' here's my plan:

====1. type pages====

Specialized forward indexes for different types of app, such as
* [[Legacy:Texture Editing Program|Texture editing program]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Model Editor|Model editor]]

... and so on. These names can be easily back-linked from pages for specific apps:

: foo is an [[Legacy:IDE|IDE]] bla bla bla

====2 parent page====

This page remains a parent page that leads to the above type pages. any apps that don't get listed on a type page stay here.

====3 reverse index====

Use [[:Category:Legacy Application]] so we can generate a flat list of all applications discussed on the wiki

How does that sound?

'''Tarquin:''' no opinions? I'll take that as a unanimous yes then

'''Wormbo:''' Sounds good to me, so if you need an explicit &quot;yes&quot;, you got mine. :)

'''Ch3z:''' Those Type Pages maybe need a sufix like, &quot;TextureEdit_Apps&quot;, &quot;IDE_Apps&quot;, &quot;TextEdit_Apps&quot;, &quot;ModelEdit_Apps&quot;, &quot;ModelConvert_Apps&quot;? Or maybe a prefix?

'''Bob_The_Beheader:''' I've noticed when adding a program to the [[Legacy:Graphics_Application|Graphics_Application]] page, some of the programs already listed don't have there own page, and therefore can't be listed on the [[Legacy:Category_Application|Category_Application]] page. Should seperate pages be made for these apps, or are users expected to follow the link to the [[Legacy:Application|Application]] page?

'''Tarquin:''' Depends if there's anything interesting to say about the app. is [[Legacy:Application|Application]] not prominent enough?

'''Bob_The_Beheader:''' Tarquin is what ive just done with adding the link to the Text Editor page what you are talking about for Type Pages in step one?

Why are you people discussing this stuff on the page instead of on the talk page for this page?  (i.e. the &quot;discussion&quot; tab)</text>
    </revision>
    <revision>
      <id>44111</id>
      <timestamp>2010-11-12T05:42:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moving discussion to own page</comment>
      <text xml:space="preserve">This page lists '''applications''' which are useful for working with the [[Legacy:Unreal Engine|Unreal engine]]. Some have been designed specifically for this purpose, some we just recommend as handy to have.

This page is a forward index, split into sub-pages by type. For a flat list of all pages about applications, see [[:Category:Legacy Application]].

See also [[Legacy:Third-Party Components|Third-Party Components]] for external components that can be added to maps.

==Bundled ==

Bundled in with [[Legacy:UT2003|UT2003]]:
* [[Legacy:UnrealEd 3|UnrealEd 3]], of course (older [[Legacy:UnrealEd Versions|UnrealEd Versions]] with older games)
* [[Legacy:Maya|Maya]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] - Make skins in 3D! Buggy though :(
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.

==Third party==
* [[Legacy:Mapping Application|Mapping Application]]
* [[Legacy:Modelling Application|Modelling Application]]
* [[Legacy:Model Conversion Application|Model Conversion Application]]
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Documentation Tool|Documentation Tool]]

''suggest more grouping pages''

===Compilers ===

* [[Legacy:UMake|UMake]] &amp;ndash; Wrapper tool for &quot;ucc make&quot; with a bunch of additional convenience options
* [[MonkeyBuild]] &amp;ndash; Sequencer for &quot;ucc make&quot; and other UnrealScript development tasks

===Documentation ===
* [[Legacy:UClasses|UClasses]] &amp;ndash; Stand-alone Unreal class browser.
* [[Legacy:UnCodeX|UnCodeX]] &amp;ndash; Class browser and document generator
* [[Legacy:UnDox|UnDox]]
* [[Legacy:UnDox Revisited|UnDox Revisited]]

===Tools ===
* [[Legacy:CVS|CVS]]
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UnrVarpu|UnrVarpu]] &amp;ndash; C++ class library (sources included) for decoding Unreal packages

==Text Editors ==

see [[Legacy:Text_Editor|Text_Editor]]

==Coding utilities ==

==Music utilities ==
* [[Legacy:ModPlug Tracker|ModPlug Tracker]] &amp;ndash; Tool to edit/create Unreal's .umx files.

==Sound Editing/Recording tools ==
* [[Legacy:GoldWave|GoldWave]]

==General utilities ==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2k3 win-registry-keys
* [[Legacy:Unreal Tournament 3 Tweaker|Unreal Tournament 3 Tweaker]]

==Wheeee! ==
* [[Legacy:Capturing Unreal Video|Capturing Unreal video]]

See http://w3.one.net/~darkon/cgi-bin/shire-wiki.cgi?UnrealTournament for a perl script that synchronizes map lists.</text>
    </revision>
    <revision>
      <id>44133</id>
      <timestamp>2010-11-29T02:42:00Z</timestamp>
      <contributor>
        <ip>173.86.155.53</ip>
      </contributor>
      <text xml:space="preserve">This page lists '''applications''' which are useful for working with the [[Legacy:Unreal Engine|Unreal engine]]. Some have been designed specifically for this purpose, some we just recommend as handy to have.

This page is a forward index, split into sub-pages by type. For a flat list of all pages about applications, see [[:Category:Legacy Application]].

See also [[Legacy:Third-Party Components|Third-Party Components]] for external components that can be added to maps.

==Bundled ==

Bundled in with [[Legacy:UT2003|UT2003]]:
* [[Legacy:UnrealEd 3|UnrealEd 3]], of course (older [[Legacy:UnrealEd Versions|UnrealEd Versions]] with older games)
* [[Legacy:Maya|Maya]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] - Make skins in 3D! Buggy though :(
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.

==Third party==
* [[Legacy:Mapping Application|Mapping Application]]
* [[Legacy:Modelling Application|Modelling Application]]
* [[Legacy:Model Conversion Application|Model Conversion Application]]
* [[Legacy:Graphics Application|Graphics Application]]
* [[Legacy:IDE|IDE]]
* [[Legacy:Text Editor|Text Editor]]
* [[Legacy:Documentation Tool|Documentation Tool]]

''suggest more grouping pages''

===Compilers ===

* [[Legacy:UMake|UMake]] &amp;ndash; Wrapper tool for &quot;ucc make&quot; with a bunch of additional convenience options
* [[MonkeyBuild]] &amp;ndash; Sequencer for &quot;ucc make&quot; and other UnrealScript development tasks

===Documentation ===
* [[Legacy:UClasses|UClasses]] &amp;ndash; Stand-alone Unreal class browser.
* [[Legacy:UnCodeX|UnCodeX]] &amp;ndash; Class browser and document generator
* [[Legacy:UnDox|UnDox]]
* [[Legacy:UnDox Revisited|UnDox Revisited]]

===Tools ===
* [[Legacy:CVS|CVS]]
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UnrVarpu|UnrVarpu]] &amp;ndash; C++ class library (sources included) for decoding Unreal packages

==Text Editors ==

see [[Legacy:Text_Editor|Text_Editor]]

==Coding utilities ==

==Music utilities ==
* [[Legacy:ModPlug Tracker|ModPlug Tracker]] &amp;ndash; Tool to edit/create Unreal's .umx files.

==Sound Editing/Recording tools ==
* [[Legacy:GoldWave|GoldWave]]

==General utilities ==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2k3 win-registry-keys
* [[Legacy:Unreal Tournament 3 Tweaker|Unreal Tournament 3 Tweaker]]
* [[Legacy:Unreal Writer|Unreal Writer]] &amp;ndash; UnrealScript editor for Mac OS X.
==Wheeee! ==
* [[Legacy:Capturing Unreal Video|Capturing Unreal video]]

See http://w3.one.net/~darkon/cgi-bin/shire-wiki.cgi?UnrealTournament for a perl script that synchronizes map lists.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Apply Texture</title>
    <id>423</id>
    <revision>
      <id>1427</id>
      <timestamp>2006-11-27T23:19:06Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <comment>*Added a list for keyboard shortcuts</comment>
      <text xml:space="preserve">''This page is one of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].'' 

Previous tutorials: 
* You've created some empty space in your map: [[Legacy:Subtract A Space|Subtract a Space]], [[Legacy:Place A Light|Place a Light]] then [[Legacy:Place A Playerstart|Place a Playerstart]].

----

By default Unreal applies a bubbly greenish texture. We're going to apply different textures to make it look better.

==Intructions ==

===Select a surface. ===

Left click on any surface of your cube to select it. It turns a blueish color to indicate it is selected.

===Open the Texture Browser ===

You can open the [[Legacy:Texture Browser|Texture Browser]] in a couple of different ways:
# Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] → View → Texture Browser 
#Or, you can push the Texture Browser button in the middle of the [[Legacy:Toolbar|toolbar]]. (Button #5 under Browsers)

[[Image:Legacy_interface.toolbar.png|center|]]

The Textures window appears:

[[Image:Legacy_interface-Ed3-texturebrowser.png|center|The Texture Browser.]]

===Open a Package ===

The first step when using the Texture Browser is to load some texture packages. In the Texture Browser window use File -&gt; Open. [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=5&amp;art_id=33 Unreal Tournament Textures]. 

You should be taken automatically to the default Textures folder, so you can just select any file and open it. The Texture Browser will load the package and display some of the textures. You can scroll down to see all textures in the package.

===Apply Texture ===

Select the surface you want to apply a texture to. Select a texture from the Texture Browser. It becomes highlighted.  The texture should now appear on the selected surface. 

Select another surface and click on a different texture. It is immediately applied to your surface.

===Selecting Multiple Surfaces ===

Now, holding the Ctrl key, select multiple surfaces. If you accidentally select one you didn't want to, you can deselect by holding Ctrl and clicking that surface again. Select a new texture and it is applied to all of the surfaces you have selected at once.

A quck list of keyboard shortcuts for selecting textures:

Shift+...
;W: Will select all the walls of the selected brush
;B: Selects all of the walls associated with the brush
;S: Selects all the walls in the level

===Changing the Image Preview Size ===

At any time, you can change Views (from the Cascading Menus at the top of the Browser window) in the Texture Browser to show texture dimensions and other properties. 

See [[Legacy:Selecting Surfaces|Selecting Surfaces]] for useful keyboard shortcuts when working with textures.

----

==Next Lessons==
* [[Legacy:Place A Pickup|Place a Pickup]] &amp;ndash; Adding weapons to your scene
* Add a [[Legacy:Terrain|Terrain]]

----

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture|Texture]]
* [[Legacy:Texture (UT)|Texture (UT)]]
* [[Legacy:Texture Browser|Texture Browser]]
* [[Legacy:Texture Browser Menu|Texture Browser Menu]]
* [[Legacy:Texture Compression|Texture Compression]]
* [[Legacy:Texture Cull|Texture Cull]]
* [[Legacy:Texture Effects|Texture Effects]]
* [[Legacy:Texture Package (UT)|Texture Package (UT)]]
* [[Legacy:Texture Import And Export|Texture Import And Export]]
* [[Legacy:Texture Package|Texture Package]]
* [[Legacy:Texture Pan|Texture Pan]]
* [[Legacy:Texture Pitfalls|Texture Pitfalls]]
* [[Legacy:Texture Properties|Texture Properties]]
* [[Legacy:Texture Replacement Tool|Texture Replacement Tool]]

----

'''Musicalglass:''' I made this a lot more readable, added multi select and added headers so each step appears in quick navigation

'''RabidZombie:''' Isn't select all surfaces Shift + S, not Shift + B. This is the case with UED3. Need to be sure if it is with older UEDs so this can be changed correctly

'''Tarquin:''' See [[Legacy:Keyboard Shortcuts|Keyboard Shortcuts]]. Isn't SHIFT + S select ALL surfaces? We want to select the BRUSH's surfaces.

'''Foogod:''' Tarquin is correct: Shift+S selects all surfaces ''in the whole level''.  Shift+B selects all surfaces which are part of the same brush, which is usually more useful, and almost certainly what was intended here.  I've clarified this a bit in the text.</text>
    </revision>
    <revision>
      <id>1428</id>
      <timestamp>2006-04-07T07:53:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">''This page is one of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].'' 

Previous tutorials: 
* You've created some empty space in your map: [[Legacy:Subtract A Space|Subtract a Space]], [[Legacy:Place A Light|Place a Light]] then [[Legacy:Place A Playerstart|Place a Playerstart]].

----

By default Unreal applies a bubbly greenish texture. We're going to apply different textures to make it look better.

==Intructions ==

===Select a surface. ===

Left click on any surface of your cube to select it. It turns a blueish color to indicate it is selected.

===Open the Texture Browser ===

You can open the [[Legacy:Texture Browser|Texture Browser]] in a couple of different ways:
# Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] → View → Texture Browser 
#Or, you can push the Texture Browser button in the middle of the [[Legacy:Toolbar|toolbar]]. (Button #5 under Browsers)

[[Image:Legacy_interface.toolbar.png|center|]]

The Textures window appears:

[[Image:Legacy_interface-Ed3-texturebrowser.png|center|The Texture Browser.]]

===Open a Package ===

The first step when using the Texture Browser is to load some texture packages. In the Texture Browser window use File -&gt; Open. [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=5&amp;art_id=33 Unreal Tournament Textures]. 

You should be taken automatically to the default Textures folder, so you can just select any file and open it. The Texture Browser will load the package and display some of the textures. You can scroll down to see all textures in the package.

===Apply Texture ===

Select the surface you want to apply a texture to. Select a texture from the Texture Browser. It becomes highlighted.  The texture should now appear on the selected surface. 

Select another surface and click on a different texture. It is immediately applied to your surface.

===Selecting Multiple Surfaces ===

Now, holding the Ctrl key, select multiple surfaces. If you accidentally select one you didn't want to, you can deselect by holding Ctrl and clicking that surface again. Select a new texture and it is applied to all of the surfaces you have selected at once.

To select all the surfaces associated with the same brush, select one of its surfaces and then hold Shift and press B.

Let's say you want to apply textures to all the walls but not the floor and ceiling. A quick trick is to select all the brush's surfaces (Shift B) then deselect the floor and ceiling with Ctrl.

===Changing the Image Preview Size ===

At any time, you can change Views (from the Cascading Menus at the top of the Browser window) in the Texture Browser to show texture dimensions and other properties. 

See [[Legacy:Selecting Surfaces|Selecting Surfaces]] for useful keyboard shortcuts when working with textures.

----

==Next Lessons==
* [[Legacy:Place A Pickup|Place a Pickup]] &amp;ndash; Adding weapons to your scene
* Add a [[Legacy:Terrain|Terrain]]

----

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture|Texture]]
* [[Legacy:Texture (UT)|Texture (UT)]]
* [[Legacy:Texture Browser|Texture Browser]]
* [[Legacy:Texture Browser Menu|Texture Browser Menu]]
* [[Legacy:Texture Compression|Texture Compression]]
* [[Legacy:Texture Cull|Texture Cull]]
* [[Legacy:Texture Effects|Texture Effects]]
* [[Legacy:Texture Package (UT)|Texture Package (UT)]]
* [[Legacy:Texture Import And Export|Texture Import And Export]]
* [[Legacy:Texture Package|Texture Package]]
* [[Legacy:Texture Pan|Texture Pan]]
* [[Legacy:Texture Pitfalls|Texture Pitfalls]]
* [[Legacy:Texture Properties|Texture Properties]]
* [[Legacy:Texture Replacement Tool|Texture Replacement Tool]]

----

'''Musicalglass:''' I made this a lot more readable, added multi select and added headers so each step appears in quick navigation

'''RabidZombie:''' Isn't select all surfaces Shift + S, not Shift + B. This is the case with UED3. Need to be sure if it is with older UEDs so this can be changed correctly

'''Tarquin:''' See [[Legacy:Keyboard Shortcuts|Keyboard Shortcuts]]. Isn't SHIFT + S select ALL surfaces? We want to select the BRUSH's surfaces.

'''Foogod:''' Tarquin is correct: Shift+S selects all surfaces ''in the whole level''.  Shift+B selects all surfaces which are part of the same brush, which is usually more useful, and almost certainly what was intended here.  I've clarified this a bit in the text.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Apply The Texture</title>
    <id>439</id>
    <revision>
      <id>1467</id>
      <timestamp>2003-08-29T06:30:19Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

One of the first things you will want to do, right after [[Legacy:Create A Room|Create a room]] is apply a texture to a surface.  There are a couple of different ways of doing it and they all have slightly different starting points.  I'll cover as many as I can think of.

There are two things worth remembering about applying textures.
# You always have a single '''current texture''', and the default texture is pretty ugly.
# If you have a surface selected when you change the current texture that surface's texture will also change.  It can be quite easy to inadvertently change the texture on a surface this way.

==Instructions==

===Changing the Current Texture===

In order to change a texture of any surface in your map you need to set the '''current texture''' to the texture you wish to apply to the surface.  To set the current texture we use the [[Legacy:Texture Browser|Texture Browser]].

[[Image:Legacy_interface.toolbar.png|center|]]

To open the browser click on ''browser button 5''.  It looks like a painting and sites between the eye and the speaker buttons.  This will open the texture browser, shown below.

[[Image:Legacy_interface-Ed3-texturebrowser.png|center|]]

By default the texture browser will only contain textures from the packages in your ServerPackages list.  These are unlikely to be of much use to you in texturing your map.  Gaining access to more useful textures is simply a matter of loading them.

Go [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Open and a file browser should open and automatically go to your UT\Textures directory.  There should be a ton of files (texture packages) in here.  Select a package you like the sound of, NaliCast.utx, for example and open it.

This will change the currently selected Texture Package (top drop list in the Texture Browser) to ''NaliCast'', and the drop list (which displays the texture groups within the texture package) below it to ''Arch''.  You should see a whole bunch of new textures now.  You can use the ''texture group'' drop list to view the other textures in the package as they were grouped by the package creator, or, by clicking on the '''All''' button you can view every single texture in the package.  Note that not all texture packages group their textures.

Any texture you highlight in the main view of the Texture Browser will become the '''current texture'''.

====Shortcut to Changing the Current Texture====

If you hold down Alt and right-click on a surface in the 3D view, you will &quot;pick up&quot; the texture on the surface, changing the current texture to the one you just clicked on.

'''NOTE:''' This doesn't work in all tool modes (the clipping mode for example) so you may need to be in camera mode [[Image:Legacy_button.mode.camera.gif|]] to get this to work.

===Applying the Current Texture to a Surface===

====The Long Winded Way====
# In the 3D view of Unreal Ed left-click on the surface you wish to texture so that it is highlighted.
# Open the texture browser and select the texture you wish to apply to that surface.

====A Quicker Way====
# Right-Click on the surface you wish to texture (If the texture doesn't highlight then left-click on it first).
#  Select the '''Apply Texture &lt;current texture name&gt;''' option at the bottom of the list.

====The Quickest Way====
# Hold down the Alt-Key and then, in the 3D view in Unreal Ed, left-click on the surface you wish to apply the current texture to.

'''NOTE:''' This doesn't work in all tool modes (the clipping mode for example) so you may need to be in camera mode [[Image:Legacy_button.mode.camera.gif|]] to get this to work.

===Other Things to Do in the Texture Browser===

Other things you can try are to change the viewing size of the textures displayed.  If you go to View -&gt; SetSize or View -&gt; Variable.

Using View -&gt; Docked will dock or undock it from the browser.

Changing the display size does not affect your textures in the game world.  If you wish to do that see [[Legacy:Decorating Rooms With Textures|Decorating Rooms With Textures]].

One useful feature of the [[Legacy:Texture Browser|Texture Browser]] is that the title of the browser window always displays the name of the '''current texture''' followed by it's width and height in UEd units.  e.g. Arch2 (256x128)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1468</id>
      <timestamp>2003-08-29T01:35:30Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

One of the first things you will want to do, right after [[Legacy:Create A Room|Create a room]] is apply a texture to a surface.  There are a couple of different ways of doing it and they all have slightly different starting points.  I'll cover as many as I can think of.

There are two things worth remembering about applying textures.
# You always have a single '''current texture''', and the default texture is pretty ugly.
# If you have a surface selected when you change the current texture that surface's texture will also change.  It can be quite easy to inadvertently change the texture on a surface this way.

==Instructions==

===Changing the Current Texture===

In order to change a texture of any surface in your map you need to set the '''current texture''' to the texture you wish to apply to the surface.  To set the current texture we use the [[Legacy:Texture Browser|Texture Browser]].

[[Image:Legacy_interface.toolbar.png|center|]]

To open the browser click on ''browser button 5''.  It looks like a painting and sites between the eye and the speaker buttons.  This will open the texture browser, shown below.

[[Image:Legacy_interface-Ed3-texturebrowser.png|center|]]

By default the texture browser will only contain textures from the packages in your ServerPackages list.  These are unlikely to be of much use to you in texturing your map.  Gaining access to more useful textures is simply a matter of loading them.

Go [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Open and a file browser should open and automatically go to your UT\Textures directory.  There should be a ton of files (texture packages) in here.  Select a package you like the sound of, NaliCast.utx, for example and open it.

This will change the currently selected Texture Package (top drop list in the Texture Browser) to ''NaliCast'', and the drop list (which displays the texture groups within the texture package) below it to ''Arch''.  You should see a whole bunch of new textures now.  You can use the ''texture group'' drop list to view the other textures in the package as they were grouped by the package creator, or, by clicking on the '''All''' button you can view every single texture in the package.  Note that not all texture packages group their textures.

Any texture you highlight in the main view of the Texture Browser will become the '''current texture'''.

===Applying the Current Texture to a Surface===

====The Long Winded Way====
# In the 3D view of Unreal Ed left-click on the surface you wish to texture so that it is highlighted.
# Open the texture browser and select the texture you wish to apply to that surface.

====A Quicker Way====
# Right-Click on the surface you wish to texture (If the texture doesn't highlight then left-click on it first).
#  Select the '''Apply Texture &lt;current texture name&gt;''' option at the bottom of the list.

====The Quickest Way====
# Hold down the Alt-Key and then, in the 3D view in Unreal Ed, left-click on the surface you wish to apply the current texture to.
# If you hold down Alt and right-click, you will &quot;pick up&quot; the texture on the surface, changing the current texture to the one you just clicked on. Then you can Alt-left-click to place the texture you just &quot;picked up&quot; on another surface.

'''NOTE:''' This doesn't work in all tool modes (the clipping mode for example) so you may need to be in camera mode to get this to work.  Hint - click on the [[Image:Legacy_button.mode.camera.gif|]] icon in the top left toolbox.

===Other Things to Do in the Texture Browser===

Other things you can try are to change the viewing size of the textures displayed.  If you go to View -&gt; SetSize or View -&gt; Variable.

Using View -&gt; Docked will dock or undock it from the browser.

Changing the display size does not affect your textures in the game world.  If you wish to do that see [[Legacy:Decorating Rooms With Textures|Decorating Rooms With Textures]].

One useful feature of the [[Legacy:Texture Browser|Texture Browser]] is that the title of the browser window always displays the name of the '''current texture''' followed by it's width and height in UEd units.  e.g. Arch2 (256x128)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Aradd</title>
    <id>437</id>
    <revision>
      <id>1462</id>
      <timestamp>2004-08-06T14:24:22Z</timestamp>
      <contributor>
        <ip>Invoker</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">made by The Invoker.

I've put all mutators I've made until now in the Aradd package. Because I'm curious what other people think of it and because I'd like to learn more about scripting from feedback I decided to put it on the internet.

==Contents==

===Life===

'''Lifesteal'''

''Get 10 life for every kill you make (Max 199)''

'''Lifesteal Plus'''

''Get (another) life for every kill (Max 500)''

'''Regeneration'''

''Get a life every (a little less than a) second. (Max 100)''

'''Regeneration'''

''Get a(nother) life every (a little less than a) second. (Max 199)''

'''Corrosion'''

''Slowly lose life (Min 5), best combined with Lifesteal.''

'''Corrosion Plus'''

''Slowly lose life even faster. (Min 5)''

===Colormatches===

'''Colormatch: Red'''

''The world becomes completely red.''

'''Colormatch: Yellow'''

''The world becomes completely yellow.''

'''Colormatch: Green'''

''The world becomes completely green :).''

'''Colormatch: Light Blue'''

''The world becomes completely ligth blue.''

'''Colormatch: Dark Blue'''

''The world becomes completely dark blue.''

'''Colormatch: Purple'''

''The world becomes completely purple:S.''

===Death effects===

'''Death Jumps'''

''Players will make a final jump when they die.''

'''Death Jumps Plus'''

''They jump even higher (and are gibbed when they land)''

'''Corpse Explosions'''

''Players explode when they die.''

'''Corpse Explosions Plus'''

''Hurts even more.''

===Item replacement:===

'''Shieldvials'''

''Health vials give you 10 shield instead of 5 life.''

'''Minigun Flakker'''

''Minigun shoots flaks. (only good at short range)''

'''Better Locking'''

''The rocketlauncher can lock while loading and homing missiles never miss (unless there's a wall in the way or something)''

'''Shockrifle Trigger'''

''You can trigger your shockrifle bolts (bots can't really handle it (yet))''

'''ShockBomber'''

''Weapon that places shockbombs which you can trigger (usually quite useless and bots can't handle it)''

'''Flak Sniper'''

''Sniper Rifle that gives an explosion like the altfire of the flakcannon when it hits (probably too powerful)''

'''Enhanced Ripper'''

''AltFire shoots a blade that splits up in multiple blades (&amp; costs more ammo)''

'''Frost Rifle'''

''The weapon I'm most proud of. When it hits it (sometimes) freezes whatever it hit for a seconds. Secondary fire fires a bolt that start more powerful, but becomes weaker (less damage, smaller, smaller freezing chance, shorter freeze duration) the further it travels.''

===Misc:===

'''Frozen Floor'''

''Very low friction.''

'''Frozen Floor Plus'''

''NO friction.''

'''High Speed'''

''Players move a lot faster.''

==The mod==

Oops, I almost forgot adding this [http://home.planet.nl/~baars162/ar/Aradd.umod Aradd.umod] (394 KB)

==Feedback==

'''The Invoker:''' Please tell me what you think of it/report any bugs/comments/tips here.</text>
    </revision>
    <revision>
      <id>1463</id>
      <timestamp>2003-08-23T09:37:09Z</timestamp>
      <contributor>
        <ip>The Light</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">made by the light (Arjen Baarsma).

I've put all mutators I've made until now in the Aradd package. Because I'm curious what other people think of it and because I'd like to learn more about scripting from feedback I decided to put it on the internet.

==Contents==

===Mutators:===

'''LifeSteal'''

''Gives you 10 health for each kill with a maximum of 199''

'''LifeSteal Plus'''

''Gives you 10 health for each kill with a maximum of 500''

'''Colormatch:''' Red, Yellow, Green, Cyan (That's light blue, right?), Blue (Dark Blue), Purple.

''Lets all actors (not only lights) give off light of the chosen colour''

'''Regeneration'''

''Read the tuturial and made one that works for UT (max 100)''

'''Regeneration Plus'''

''Duh (max 199)''

'''Corrosion'''

''Lose life slowly (not damage, loss of life) with a minimum of 5 (intended to be combined with lifesteal)''

'''Corrosion Plus'''

''Corrosion was a bit too slow for my liking''

'''Extreme Damage'''

''Lame name and lame mutator (Auchtime in package btw). Gives everyone unlimited UDamage. (Just copied Stealth)''

'''Accelerating Rockets'''

''Read some mod idea about it. Rocketspeed just rises exponentially (ever x time velocity * 1.00(something)). I Tried it, but didn't really notice anything, so I don't know if it worked.''

'''Corpse Explosions'''

''People explode when they die (really cool to see someone turn to gibs when you shoot his head off)''

'''Corpse Explosions Plus'''

''Bigger and deadlier explosio (not tested).''

'''DeathJumps'''

''Players make a jump (Z velocity + something) when they die.''

'''DeathJumps Plus'''

''They jump higher (and turn into gibs when they land (too high).''

'''ShieldVials'''

''The first inventory item I changed. Copied the shieldbelt so it gave 10 armor and increased its own charge when you take another one (and didn't remove other armors). Also made it look like a healthvial (I tried, but failed to change it's skin)''

'''Loaded'''

''Gives you all the normal UT weapons when you spawn.''

'''Infinite Ammunition'''

''Gives you 999 ammo every second (there must be a better way).''

'''Darkmatch'''

''Supposed to turn off all lights and give you a searchlight (not yet tested)''

'''Low Friction'''

''Duh''

'''Low Friction Plus'''

''Duh''

'''Hi Speed'''

''Changed walking speed with a factor (I don't remember right now)''

'''Better Locking'''

''Made a new weapon (copy of the UT_Eightball) and made it possible to lock while loading (You can start loading rockets and keep your crosshair on the enemy and lock him). Also made them fire rockets that home far better''

'''Sniper Change: Explosive'''

''Sniper Rifle causes an explosion where it hits.''

'''Sniper Change: Biosludge'''

''Ges SniperRifle. Produces sludge where it hits (nice to see sludge coming out when you hit someone's head)''

'''SniperChange: Rockets'''

''Not an improvement, but cool nontheless. Sniper Rifle fires rockets that home when you would have hit someone (same improved rockets as with better Locking) (Nice in face)''

'''SniperChange: Rail'''

''SniperRifle can shoot through walls and you see a crosshair on bots when you zoom (I just sort of copied this from the Unreal4E Railgun (but that one has a greater travel time and a limited range (I think))''

'''SniperChange: Flaks'''

''No more shot or decapitated damage, just an explosion like that of the alternate flakcannon fire)''

'''Really rapid fire'''

''Minigun fires a lot faster and deals very little damage per hit (also changed amount of ammo you get)''

'''Discomatch'''

''Everything is dark, but players give off nicely coloured (changing) flickering light.''

'''Shockrifle trigger'''

''Was supposed to enable the shockrifle to lock onto shockbolts and shoot them, but in the end I changed it so you could detonate your bolts manually.''

'''ShockBomber'''

''Shockrifle looks like the original (but bigger somehow (that makes it cool)) and fires bolts that stop after a while. These bolts can be shot  or triggered and give Superexplosions (also explode up when owner dies or someone walks into it). Bots can't handle it btw.''

'''MiniFlakker'''

''Minigun fires flaks.''

'''SpawnSkaarj'''

''I thought I might want to spawn Skaarjtroopers in Pawnmatch levels and give them different weapons (without having to make a subclass of Skaarj), so I changed the spawnpoint actor to have it give them a weapon (so what weapon they have depends on the spawnpoint). Haven't tested this.''

'''Enhanced Rippers'''

''I changed the ripper in such a way that the alternate fire shoots a blade that doesn't explode, but produces many more blades. I've tested it and it's very deadly.''

'''Frost Rilfe'''  (Added August 23)

''Turns all Shockrifle's into Frost Rifles. I didn't really like the freezer from U4E because it only really froze people when they were dead anyway, so I decided to create my own freezer. When its projectile hits there is a chance that it creates a statue that looks just like the player (Always happens if the player's killed), but with an icy texture (just like in U4E), but it also creates another one that has the player's texture, but is transparant so you can see the player through the ice. I made the player invisible and immobile and disabled his weapon until a certain time had elapsed or until he was dead (he remained invisible so there wouldn't be any corpse (just the statue) (he's visible again when he respawns)).''

===Gametype:===

'''Pawnmatch''

''Just team deathmatch, but the teams have bases and they get extra frags for killing scripted pawn (Titan = 15 points for example). I based on the default health of the pawn (+ or - something if I didn't like the score) (so new pawn can be added). I turned Stalwart into a PawnMatch level because I was too lazy (and not good enough at mapping) to make my own maps for it.''

==The mod==

Oops, I almost forgot adding this

http://home.planet.nl/~baars162/ar/Aradd.zip (663 KB)

==Feedback==

'''The Light:''' Please tell me what you think of it/report any bugs/comments/tips here.</text>
    </revision>
    <revision>
      <id>1464</id>
      <timestamp>2004-08-05T15:48:28Z</timestamp>
      <contributor>
        <ip>Invoker</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">made by The Invoker.

I've put all mutators I've made until now in the Aradd package. Because I'm curious what other people think of it and because I'd like to learn more about scripting from feedback I decided to put it on the internet.

==Contents==

===Life===

'''Lifesteal'''

''Get 10 life for every kill you make (Max 199)''

'''Lifesteal Plus'''

''Get (another) life for every kill (Max 500)''

'''Regeneration'''

''Get a life every (a little less than a) second. (Max 100)''

'''Regeneration'''

''Get a(nother) life every (a little less than a) second. (Max 199)''

'''Corrosion'''

''Slowly lose life (Min 5), best combined with Lifesteal.''

'''Corrosion Plus'''

''Slowly lose life even faster. (Min 5)''

===Colormatches===

'''Colormatch: Red'''

''The world becomes completely red.''

'''Colormatch: Yellow'''

''The world becomes completely yellow.''

'''Colormatch: Green'''

''The world becomes completely green :).''

'''Colormatch: Light Blue'''

''The world becomes completely ligth blue.''

'''Colormatch: Dark Blue'''

''The world becomes completely dark blue.''

'''Colormatch: Purple'''

''The world becomes completely purple:S.''

===Death effects===

'''Death Jumps'''

''Players will make a final jump when they die.''

'''Death Jumps Plus'''

''They jump even higher (and are gibbed when they land)''

'''Corpse Explosions'''

''Players explode when they die.''

'''Corpse Explosions Plus'''

''Hurts even more.''

===Item replacement:===

'''Shieldvials'''

''Health vials give you 10 shield instead of 5 life.''

'''Minigun Flakker'''

''Minigun shoots flaks. (only good at short range)''

'''Better Locking'''

''The rocketlauncher can lock while loading and homing missiles never miss (unless there's a wall in the way or something)''

'''Shockrifle Trigger'''

''You can trigger your shockrifle bolts (bots can't really handle it (yet))''

'''ShockBomber'''

''Weapon that places shockbombs which you can trigger (usually quite useless and bots can't handle it)''

'''Flak Sniper'''

''Sniper Rifle that gives an explosion like the altfire of the flakcannon when it hits (probably too powerful)''

'''Enhanced Ripper'''

''AltFire shoots a blade that splits up in multiple blades (&amp; costs more ammo)''

'''Frost Rifle'''

''The weapon I'm most proud of. When it hits it (sometimes) freezes whatever it hit for a seconds. Secondary fire fires a bolt that start more powerful, but becomes weaker (less damage, smaller, smaller freezing chance, shorter freeze duration) the further it travels.''

===Misc:===

'''Frozen Floor'''

''Very low friction.''

'''Frozen Floor Plus'''

''NO friction.''

'''High Speed'''

''Players move a lot faster.''

==The mod==

Oops, I almost forgot adding this

&lt;Old version, going to upload a newer one soon&gt;

http://home.planet.nl/~baars162/ar/Aradd.zip (663 KB)

==Feedback==

'''The Invoker:''' Please tell me what you think of it/report any bugs/comments/tips here.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Araes</title>
    <id>461</id>
    <revision>
      <id>1511</id>
      <timestamp>2004-04-16T23:27:08Z</timestamp>
      <contributor>
        <ip>Araes</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Bio===

===Delays, Delays, but Moving Again===

April 16th, 2004

After a bit of a gap, I'm back working on things again.  In the meantime I got one of my new weapons to work and made up some initial ships with really low polys for testing.  The weapon for now is a three beam minigun with an adjustable spread, basically like a choke, that can be adjusted to vary from about a 0 - 30 degree arc off of the symmetry axis.  Now I just need to get some form of HUD representation for this ability, like a little slider bar that tells you your current spread and maybe up it to a spiraling or 6 beam pattern.  Things for later.  Anyhow, next up is to implement some of the basic beam cannons and try to work on a first gen concept for the formation code.  I'll see how that goes in a few days maybe.  Unfortunately, also busy writing a thesis and going for doctoral work, so who knows.

===Got UT2004 and Working on Simple MUTs===

March 24th, 2004

Well, Amazon sure took their sweet time in getting my limited edition copy of UT2004 to me.  Ended up nearly a week late compared to people who were playing it right out of the stores in my local area.  Ah well, either way it worked out, as I was in Vegas for most of that week, so I couldn't have worked on Mods anyhow.  Now that I'm back, I've started in on the space strat mod in a general sense and am doing simple Muts to work up to more difficult stuff.

On that topic, while actually playing it, I was also a bit surprised by how little mileage they really get out of the space aspects.  From the demo videos and such, I expected them to run with such a neat concept as coexisting space and personal scale warfare, yet I've only been able to find one assault map so far that really utilizes it.  Guess its good in a sense, as it means that any space add-ons will be that much more unique.  Yet, I can't help thinking I ought to get slightly distracted and at least make a space VDM or space ONS map.  Also, I was surprised at the stark contrast in the skill of the bots between land and spatial combat.  In space, the bots are fairly nasty, firing crack shots at all who oppose them and effectively rushing objectives en mass.  Yet on land, I could waltz through armies of them, achieving Godlike status in me-vs-them maps more often than I'd like to think about.  Very odd.

Anyhow, back to the grind.

===Preliminary Design Doc Work===

March 10th, 2004

Here's a link to the design document for my [[Legacy:Araes/Design Document|proposed mod]] to UT2k4.

Moderate work so far.  Still need good diagrams, placeholder models, and placeholder sounds to go with it.  I'll probably move this off-site and then link to it later, as I figure this isn't the most appropriate place for it, but for now it can at least serve as a sort of workspace for my mental, organizational purposes.

March 8th, 2004

Introductions being underway, I'm a new modder to the Unreal community, but a past modder of things like Half-Life and Serious Sam.  My main strengths are with modeling and textures, as I'm a mechanical engineer by profession.  So, naturally I've got a wee bit of practice with creating functional mechanical objects and can wrap my head around 3D proportions.  However, over time I've also picked up a fair amount of experience with coding as my research requires it.  Most of this has been technical languages like MatLab, however, I also know a bit of PHP, a fair amount of Javascript, and a bit of Java as well.

As I also write a fair amount in my spare time, and like to pump out random disertations on all kinds of topics, you can catch a glimps of this over at my [http://www.webpages.uidaho.edu/~putn4403/ spot on the web].

===General Plan===

I've got what I view as a grand idea for a mod (of course), however, as its somewhat large I'm going to segment it down into a number of smaller steps that I can handle efficiently and hopefully finish.  Ability willing, these would probably also be potential canidates for simpler mutations , which would probably be their first iteration of design.

*'''To Dos'''
**Finish a full blown [[Legacy:Design Document|design document]] with sketches, work plan, subtasks, and other assundry info.
***Create placeholder unit models to go along with this
***Create placeholder sounds to go along with this
***Create various other placeholder assets.
**Develop code to create formations of units (or at least simulations of them) within UT.
***Different options for this, one would be to use given destinations and AI to tell them to move (Bot AI that tries to maintain a particular position?), other would be groupings of models that operate as a single model.
***Still exploring these to see which would be more effective and wouldn't overload the cycles with inefficient script.
**Write the nice folks at Sierra, as I think my design may impinge on their intellectual property.

----

'''Tarquin:''' Hi, welcome to the wiki :)

'''EntropicLqd:''' Hi, Welcome to the Wiki

'''Araes:''' Thanks for the welcome.  Hopefully I'll have more to show than the above vagueness shortly (such as a contribution to that design document topic) 03/08/04.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1512</id>
      <timestamp>2004-03-24T20:23:42Z</timestamp>
      <contributor>
        <ip>Araes</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Bio===

===Got UT2004 and Working on Simple MUTs===

March 24th, 2004

Well, Amazon sure took their sweet time in getting my limited edition copy of UT2004 to me.  Ended up nearly a week late compared to people who were playing it right out of the stores in my local area.  Ah well, either way it worked out, as I was in Vegas for most of that week, so I couldn't have worked on Mods anyhow.  Now that I'm back, I've started in on the space strat mod in a general sense and am doing simple Muts to work up to more difficult stuff.

On that topic, while actually playing it, I was also a bit surprised by how little mileage they really get out of the space aspects.  From the demo videos and such, I expected them to run with such a neat concept as coexisting space and personal scale warfare, yet I've only been able to find one assault map so far that really utilizes it.  Guess its good in a sense, as it means that any space add-ons will be that much more unique.  Yet, I can't help thinking I ought to get slightly distracted and at least make a space VDM or space ONS map.  Also, I was surprised at the stark contrast in the skill of the bots between land and spatial combat.  In space, the bots are fairly nasty, firing crack shots at all who oppose them and effectively rushing objectives en mass.  Yet on land, I could waltz through armies of them, achieving Godlike status in me-vs-them maps more often than I'd like to think about.  Very odd.

Anyhow, back to the grind.

===Preliminary Design Doc Work===

March 10th, 2004

Here's a link to the design document for my [[Legacy:Araes/Design Document|proposed mod]] to UT2k4.

Moderate work so far.  Still need good diagrams, placeholder models, and placeholder sounds to go with it.  I'll probably move this off-site and then link to it later, as I figure this isn't the most appropriate place for it, but for now it can at least serve as a sort of workspace for my mental, organizational purposes.

March 8th, 2004

Introductions being underway, I'm a new modder to the Unreal community, but a past modder of things like Half-Life and Serious Sam.  My main strengths are with modeling and textures, as I'm a mechanical engineer by profession.  So, naturally I've got a wee bit of practice with creating functional mechanical objects and can wrap my head around 3D proportions.  However, over time I've also picked up a fair amount of experience with coding as my research requires it.  Most of this has been technical languages like MatLab, however, I also know a bit of PHP, a fair amount of Javascript, and a bit of Java as well.

As I also write a fair amount in my spare time, and like to pump out random disertations on all kinds of topics, you can catch a glimps of this over at my [http://www.webpages.uidaho.edu/~putn4403/ spot on the web].

===General Plan===

I've got what I view as a grand idea for a mod (of course), however, as its somewhat large I'm going to segment it down into a number of smaller steps that I can handle efficiently and hopefully finish.  Ability willing, these would probably also be potential canidates for simpler mutations , which would probably be their first iteration of design.

*'''To Dos'''
**Finish a full blown [[Legacy:Design Document|design document]] with sketches, work plan, subtasks, and other assundry info.
***Create placeholder unit models to go along with this
***Create placeholder sounds to go along with this
***Create various other placeholder assets.
**Develop code to create formations of units (or at least simulations of them) within UT.
***Different options for this, one would be to use given destinations and AI to tell them to move (Bot AI that tries to maintain a particular position?), other would be groupings of models that operate as a single model.
***Still exploring these to see which would be more effective and wouldn't overload the cycles with inefficient script.
**Write the nice folks at Sierra, as I think my design may impinge on their intellectual property.

----

'''Tarquin:''' Hi, welcome to the wiki :)

'''EntropicLqd:''' Hi, Welcome to the Wiki

'''Araes:''' Thanks for the welcome.  Hopefully I'll have more to show than the above vagueness shortly (such as a contribution to that design document topic) 03/08/04.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Araes/Design Document</title>
    <id>462</id>
    <revision>
      <id>1513</id>
      <timestamp>2004-03-12T11:05:15Z</timestamp>
      <contributor>
        <ip>NickR</ip>
      </contributor>
      <comment>We come in peace! Shoot to Kill!!</comment>
      <text xml:space="preserve">All work Copyright © 2004 by Team Araes

Version 0.5

March 10th, 2004

==Introduction ==

The purpose of this mod is to create a Total Conversion for Unreal Tournament 2004 in the form of an RTS like space mod.  Initial plans for the first release are to have a single playable map with two teams.  Like a standard RTS, the gameplay will progress from a relatively low technology level at the beginning of any match, through a series of increasing tech advances, which give access to further weaponry, vehicles, and tactical options.  Within each of the teams, there will be a single individual whos purpose it is to coordinate the actions of his team and provide the rest of the players with the resources they need to achieve conquest.

==General Structure ==

The important features of this mod are as follows:

*RTS like game play with advancing tech levels and upgradable weaponry.
**Automated or Commander controlled resource gathering.
*Varying classes of vehicles progressing from light fighters to heavy cruisers.
*Varying classes of weapons progressing from light weapons to heavy capital guns.
*Primarily ship-to-ship combat emphasis.  Light if any troop combat.
**Formations of ships controlled by a single individual.
**Coordinated fire from within these formations.
**Turret fire from within capital cruisers (Probably adaptable from standard UT2k4 space combat).
**Scouting ranges for each ship (Either hard-coded or swappable sensor statistics)
*At least one ship for each side from each class of ship, and a mothership for command duties on release.
*At least one weapon of both projectile and beam types for each each weapon class.
*At least one playable and balanced map for use upon release.
*At least one original ambient music track for inclusion with the first map.
*A set of general plug-ins for the normal GUI.
*A specialized GUI for the commander in which all ships within the scouted range may be seen, selected, and given orders.

Currently this is just planned as a fun, personal project, with few goals for something like the MSU or similar.  Most of the coding is intended to be done by the creator, but I may change my mind later if it looks too immense.

==Game Environment ==

More fully fleshed story coming in a bit.  Generally, two races are at war.  However, due to the energy limitations of travel, they have found that it is most efficient to take only what is required to manufacture the weapons of war with them when they move.  To actually engage in combat, they will find locations of high resources and manufacture the implements of their enemy's destruction as needed.

==Special Features ==

As I did a quick listing of all the features up above, I'll just jump right into the specific sections for each new feature and the subtopics of vehicles, weapon design, sounds, ect...

===Ship Formations ===

The purpose of this feature is to allow small groups of players (as little as 16 to a map) to engage in large scale space warfare.  Not much fun flying around in the vastness of space when there are only a few ships to fight, so I propose instead to allow each player to control as many ships as needed to achieve their goals (within reason for the engine) and use attack formations to organize them for whatever their goals may be.  These formations will start as single ships of any class and will be expandable through shape algorithms.  For instance, in a simple arrangement I might like to have my ships organized into a cone to allow every ship in the group to fire their forward mounted weapons.  As such, I will control the movement of the cone as if I were the point dragging the rest of them along.  The cone itself can extend off to the rear as far as it wants, since new ships can simply be added in a circular stair-case or ring pattern.  The same would work for X's, strings, walls, spheres, ect...

I have several options which I have been considering for the creation of these constructs.  The first is based upon an expandable vehicle model, in which each additional vehicle's position is hard aligned to the lead ship, and the entire assembly moves as if it were a single structure.  i.e. 8 ships formed into the above cone concept would simply move as if they were one really big conical ship.

The next idea was instead to use something like the behavior which mines exhibit, possibly even tapping into this code.  During movement, there would be a position to some reference of the main ship, which would call each of the other &quot;follower&quot; ships.  Rather than working over the limited range of a mine, however, this calling would function over any distance, and if the main ship moved, this reference point would also ship accordingly.  As such, the entire assembly would move forward in a huge game of follow the leader, with each subship always being a slight step behind.  This would have the advantage of a more loosely based structure, which could accomodate things like two large groups colliding, without all of them becoming hopelessly entwined.  In addition, you would also be able to do things like chose a ship you wanted to have from the assembled lot and just have it fly out into position.

===Coordinated Firing ===

To control firing from both formations of ships and large batteries of turrets, it would be necessary to create a system for aligning their targets.  For example, when manning the broadside guns of a capital ship, some fire arcs would naturally be out of direct alignment with the gunner.  If not compensated for correctly, these extra shots would essentially be wasted, as they couldn't be accurately aimed at small targets with any precision.

My initial thought for correcting this problem was to have a single, instantaneous, tracer shot which would be fired with each button press.  This would have no animation, but would provide a painter for Bot manned weapons to home in on.  Each of these Bot guns would then fire their own weapons in time with the gunner's to simulate the effect of coordinated battery fire.  The same concept holds for a ship formation as well.  Naturally, someone else has already run into and corrected for this problem.  Namely Foxpaw with his [[Legacy:Foxpaw/Cosmic_Fury|Cosmic Fury]] mod, so maybe he'll have further insight once I get out of the n00b stage.

===Characters/Classes ===

*'''Commander''' - This class is the one calling all the shots.  They are housed within each team's mothership and have access to overviews of the total action.  They can't directly attack anyone, however, they can command Bot controlled vehicles to perform tasks, issue commands to formations of human controlled ships, and provide needed tactical information for assaults.  This position would best be served as a voted position for each team, or an automatic appointment for the player with the best score from each round (possible waived for good performance by the prior Commander).

*'''Pilots/Grunts''' - Basically everybody else.  These players fly most/all of the ships, man the capital turrets, and perform the majority of tactical assaults.  They have few special abilities per say, except for an ability to man nearly any form of weapon known.

===Weapons ===

The weapons section is divided into two sub-segments.  Weapon types (beam/projectile/mine) and weapon classes (Light/Medium/Heavy).  Each basic weapon concept has three levels of power which correspond to its class and there are several variations within the basic beam and projectile classes.

'''Projectile Weapons'''

Series of weapons which use rechargable ammunition that is flung from the ship/turret at high speeds.  Ammunition can be renewed through the steady expenditure of resources.  Generally greater damage per shot than beam weapons, but require more skill to apply their full damage.  No problems with energy drain, however.

*'''Gattling Cannon''' - A weapon firing high speed streams of shots, which shifts form rather than power/shot with each class increase.
**Light Form - A single stream of shots which hits only in the center of the targeting region and has minimal spread due to vehicle compensation.
**Medium Form - Three streams of shots, which can have their angular alignment adjusted using the right mouse button.  i.e. The spread and coverage of the shots can be widened or concentrated for the application.
**Heavy Form - Six streams of shots, which cover varying angular cross sections and can be expanded and contracted in the form of two aligned cones with varying base diameters.  (The second group has a slightly wider spread)

*'''Flak Gun''' - A weapon firing exploding shots which send off further cascades of exploding debris in a spherical pattern.
**Light Form - A single projectile shot which explodes on impact or at a set distance from the ship (can be set with right button).
**Medium Form - A single shot which explodes at a set distance which can be set or triggered and fires off four smaller exploding shots when it explodes.
**Heavy Form - A single shot which explodes at a set distance that can be set or triggered, fires off four smaller exploding shots when it explodes, and each of which also fires off 2-4 smaller shots when they explode.

*'''Seeker Missiles''' - Quick homing missiles that fire in greater and greater numbers with increasing class and have a fast fire rate.
**Light Form - Fires one heat seeking missile that tracks on any target in the reticle, much like an Avril.
**Medium Form - Fires two missiles, but functions similarly.
**Heavy Form - Fires three missiles, but functions similarly.

*'''Torpedoes''' - Limited or no-homing rockets that are meant as counters to larger ships.  Slow rate of fire and travel time.
**Light Form - Fires a single torpedo that has a good ratio of damage per second and per shot, but is easy to dodge.
**Medium Form - Bulkier form of the torpedo that is meant for taking down medium and larger ships.  Fighters will rarely be hit by it.
**Heavy Form - Huge torpedo that is meant for taking down capital monstrosities and beats even the heaviest armors.

'''Beam Weapons'''

Series of weapons which are powered from the ships systems.  Usually lower power per shot, however, they are easily tracked in most cases and require only the power of the ship to function.  However, they must be monitored or they will empty the ship reserves and hamper its other functions.

*'''Pulse Beam''' - Classic &quot;zapping&quot; beam weapon, which has a short initiation time, a somewhat quick travel time, and then a short pause before the next firing cycle.
**Light Form - Pencil thin beam that does a minor amount of damage.  Very small initiation time before firing.
**Medium Form - Slightly larger beam which scales up the damage accordingly, and has a slightly longer initialization time.
**Heavy Form - Arm or greater width beam that can punch through every form of armor, but has a long initialization delay.
**Macross Style? - Possible super capital weapon that requires devotion to one ship.  Takes up a large number of forward firing slots, has a long delay, but basically eradicates things in its path.  Only an idea, probably bad for balance.

*'''Energy Blades''' - Shot like beam weapon which fires out gliding discs of energy.  Each form has curve arcs which can be adjusted with the right button of the mouse.
**Light Form - Single stream of discs which can be curved side to side in flight.
**Medium Form - Two streams of discs which naturally curve and can have the distance at which the beams cross adjusted.
**Heavy Form - Similar to the medium form, but with three discs that cross at 120 degree angles.

*'''Ring Beam''' - Ever expanding beam that decreases in power the wider it gets.  Probably be fairly nasty in close or in tightly packed formations of ships.  Increasing power increases the damage per ring while the rate stays constant.
**Light Form - Orange rings which propogate along a 30 degree arc in front of the weapon.
**Medium Form - Orange/Red rings which are similar in operation to light version but more powerful.
**Heavy Form - Red rings which are similar to medium version but more powerful.

*'''Shock Shield''' - Cascading energy shield that simply zaps foes which get too close to the ship.
**Light Form - Minor static discharges with decent damage per second for their class, but limited range.
**Medium Form - Similar in terms of good damage per second and function, but slightly improved range and a bit of a travel delay.
**Heavy Form - Same, but with an additional range upgrade and increased travel delay.

'''Mines'''

Class of weapons which are meant to serve as a tactical deterrent rather than a true offensive tool.  Most will be of a form which hampers progress, imobilizes foes, or degrades system performance.

*'''Concussion Mines''' - Explosive mines which do a high damage individually, but have a very low damage per second when used as a weapon.
**Light Form - Small, self propelled mines that move fairly quickly to catch fighters but have a hard time beating more than light armor.
**Medium Form - Larger, propelled mines that move near cruiser speeds and can tackle medium armor and lower.
**Heavy Form - Huge, slow, or even stationary, mines which knock big holes in capital ships but can be evaded easily by lesser classes.

*'''EMP Mines''' - Electromagnetic mines which send off an electronics disabling pulse when approached by ships.
**Light Form - Similar to concussion of same size but disable weapons and thrust on ships they hit for a short time.
**Medium Form - Similar to the above, but made to handle the heavier systems of cruisers.
**Heavy Form - Huge EMP weapons that can disable capital ships for a short time, but are easily avoided and visible.

===Vehicles ===

This mod will contain four groupings of vehicles which will roughly be divided by their physical size, function, and potential firepower.  Three of these subdivisions will be the purvey of players and will consist of vessels which can be used to take the war to their foes.  The fourth grouping will only house two vessels per map and will function more as a mobile command-post for the war effort than a true vehicle.

Listed in order of increasing size, the three vehicle classes will be:

#Fighter
#Cruiser
#Capital 
#Command

Each of these classes will possess the same ability to assemble into formations and may eventually possess the ability to mix formations.  However, within the first generation, single type formations will be the norm to simplify group and battery fire.  To handle weapon allocation for each type of ship, they will have a selection of weapon or equipment &quot;hard points&quot; which will vary with size.  The vision for these hard points is that when allocating equipment to a ship or group of ships, they would choose varying sizes of weapons which would each eat a certain number of points on the surface.  Then, depending on the numbers of weapons chosen, the effects would be generated from a turret or barrel location corresponding to the first section of each block.

For example:

A cruiser might have:
*(4) Forward slots
*(3) Port slots
*(3) Starboard slots

These could be filled with:
*'''Forward:''' (1) L-PulseBeam, (1) L-PulseBeam, (2) M - PulseBeam
*'''Port:''' - (3) H-GattlingCannon
*'''Starboard:''' - (3) H-GattlingCannon

Depending on final design, this would allow even the smallest fighters to do signfigant damage to larger, heavily armored groups if they were willing to sacrifice utility to do so.  A good example of this might be capital ship hunting torpedo fighters.

===Maps ===

The maps for this modification are going to be solely space based maps with full three dimensional movement.  Due to the nature of a two sided conflict, they will probably be most often aligned along a central axis around which the general conflict is organized.  The first such map envisioned for testing purposes was a simple asteroid cloud design, in which the command ships would be partitioned from one another by a large cloud of asteroids within the center region of the map or possibly just by smaller clumps of asteroids.

A secondary idea would be for the rubble of a decrepit space station, from which parts can be disassembled for resources.  Mining from such an object would probably produce a more refined form of resources, and as such, might allow for increased harvesting speed and increased game speed.

Currently, the backdrop for such levels was envisioned as a simple black backdrop with stars.  However, after looking over some of Foxpaw's work and scanning back over my prior experience with the Homeworld line, it seems as though a colored backdrop which emulated something like the center of a nebula might be a more fitting choice, as it would provide a more interesting world and more &quot;ooo, aaahhh&quot; factor.  Plus, it might explain why render distances are low. (The cloud's obscuring them, yeah, thats it.)

===Music ===

As I'm not currently a mixer of game music, I might have to farm this aspect out to someone who knows what they're doing.  However, as the form of music I envision is mainly ambient or electronica with a sparse, &quot;airy&quot; feel, I might be able to pick up the technical know how to create it.  Not sure yet.

For examples of the general type of work I'm holding in my wee little brain follow these:

(Watch out for the OCRemix links, as djpretzel fills his site with a staggering number of popups) 

[http://www.vgmix.com/song_view.php?song_id=814 destructo - The Lost Horizon]

[http://www.ocremix.org/detailmix.php?mixid=OCR00354 Mazedude - Surface ofthe Moon]

[http://www.ocremix.org/detailmix.php?mixid=OCR01048 The Wingless - One Girl in All the World]

[http://www.ocremix.org/detailmix.php?mixid=OCR00322 AmIEvil - Metroid MindofMother]

[http://www.ocremix.org/detailmix.php?mixid=OCR01127 ABG - Ada's Groove] (Possibly a bit too fast and invasive)

Incidentally, most of these are off my own mp3 organizational structure fittingly titled &quot;Space Mixes&quot;

==Closing Comments and Appendix ==

Alright, from all that it looks like I've got a bit of work on my hands.  As I've already received comments from folks doing similar work, it also looks like I'm stepping into an area that's already being explored.  The mod mentioned above, [[Legacy:Foxpaw/Cosmic_Fury|Cosmic Fury]], encompasses a number of ideas which I could see application for in my own work.  (Although the hand construction of ships by component seems a bit large in scope for my own designs.  In addition, the [[Legacy:NickR|Dark Frontier]] mod seen on the wiki and on NickR's own [http://www.planetunreal.com/nickr/ site] seems to cover some of the space warfare gaps quite well.  I'll have to look over my design and see what aspects can be modified so that I'm not just rehashing work and so that I can broaden the UT community at large.

-Araes-

----

==Comments ==

'''NickR:''' Nice idea. :D I would say that though, because I'm doing something very similar! Maybe we should coordinate are efforts so that our features don't heavily overlap.

'''Araes:''' I wouldn't be opposed to that Nick, as I kind of figured that since it seemed like a good idea someone had to have already though of it first.  Lemme get the rest of the information down for this and then maybe we can discuss some kind of arrangement.  I assume the mod you are talking about is the new mod on your [http://www.planetunreal.com/nickr/ Arcade Site], that references improving on Natural Selection?

'''Foxpaw:''' I think he was referring to the space combat one, &quot;Dark Frontier.&quot; ;)

'''Araes:''' Alright, I guess I'll let him respond whenever he gets back, but if his Dark Frontier were to be the next USpace, I would imagine it as less of a tactical RTS type, like Natural Selection, and more of a team, ship-based DM or objective map.  Unfortunately, not a lot of info besides his site and the wiki notes.  Ah well.

'''NickR:''' I was referring to Dark Frontier which will be a space combat fighter mod with undertones of rpg and rts elements, I think I might also do a development journal while I produce this. The other mod I mentioned which is based on the Natural Selection mod is more of a side project.</text>
    </revision>
    <revision>
      <id>1514</id>
      <timestamp>2004-03-12T06:17:43Z</timestamp>
      <contributor>
        <ip>Araes</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">All work Copyright © 2004 by Team Araes

Version 0.5

March 10th, 2004

==Introduction ==

The purpose of this mod is to create a Total Conversion for Unreal Tournament 2004 in the form of an RTS like space mod.  Initial plans for the first release are to have a single playable map with two teams.  Like a standard RTS, the gameplay will progress from a relatively low technology level at the beginning of any match, through a series of increasing tech advances, which give access to further weaponry, vehicles, and tactical options.  Within each of the teams, there will be a single individual whos purpose it is to coordinate the actions of his team and provide the rest of the players with the resources they need to achieve conquest.

==General Structure ==

The important features of this mod are as follows:

*RTS like game play with advancing tech levels and upgradable weaponry.
**Automated or Commander controlled resource gathering.
*Varying classes of vehicles progressing from light fighters to heavy cruisers.
*Varying classes of weapons progressing from light weapons to heavy capital guns.
*Primarily ship-to-ship combat emphasis.  Light if any troop combat.
**Formations of ships controlled by a single individual.
**Coordinated fire from within these formations.
**Turret fire from within capital cruisers (Probably adaptable from standard UT2k4 space combat).
**Scouting ranges for each ship (Either hard-coded or swappable sensor statistics)
*At least one ship for each side from each class of ship, and a mothership for command duties on release.
*At least one weapon of both projectile and beam types for each each weapon class.
*At least one playable and balanced map for use upon release.
*At least one original ambient music track for inclusion with the first map.
*A set of general plug-ins for the normal GUI.
*A specialized GUI for the commander in which all ships within the scouted range may be seen, selected, and given orders.

Currently this is just planned as a fun, personal project, with few goals for something like the MSU or similar.  Most of the coding is intended to be done by the creator, but I may change my mind later if it looks too immense.

==Game Environment ==

More fully fleshed story coming in a bit.  Generally, two races are at war.  However, due to the energy limitations of travel, they have found that it is most efficient to take only what is required to manufacture the weapons of war with them when they move.  To actually engage in combat, they will find locations of high resources and manufacture the implements of their enemy's destruction as needed.

==Special Features ==

As I did a quick listing of all the features up above, I'll just jump right into the specific sections for each new feature and the subtopics of vehicles, weapon design, sounds, ect...

===Ship Formations ===

The purpose of this feature is to allow small groups of players (as little as 16 to a map) to engage in large scale space warfare.  Not much fun flying around in the vastness of space when there are only a few ships to fight, so I propose instead to allow each player to control as many ships as needed to achieve their goals (within reason for the engine) and use attack formations to organize them for whatever their goals may be.  These formations will start as single ships of any class and will be expandable through shape algorithms.  For instance, in a simple arrangement I might like to have my ships organized into a cone to allow every ship in the group to fire their forward mounted weapons.  As such, I will control the movement of the cone as if I were the point dragging the rest of them along.  The cone itself can extend off to the rear as far as it wants, since new ships can simply be added in a circular stair-case or ring pattern.  The same would work for X's, strings, walls, spheres, ect...

I have several options which I have been considering for the creation of these constructs.  The first is based upon an expandable vehicle model, in which each additional vehicle's position is hard aligned to the lead ship, and the entire assembly moves as if it were a single structure.  i.e. 8 ships formed into the above cone concept would simply move as if they were one really big conical ship.

The next idea was instead to use something like the behavior which mines exhibit, possibly even tapping into this code.  During movement, there would be a position to some reference of the main ship, which would call each of the other &quot;follower&quot; ships.  Rather than working over the limited range of a mine, however, this calling would function over any distance, and if the main ship moved, this reference point would also ship accordingly.  As such, the entire assembly would move forward in a huge game of follow the leader, with each subship always being a slight step behind.  This would have the advantage of a more loosely based structure, which could accomodate things like two large groups colliding, without all of them becoming hopelessly entwined.  In addition, you would also be able to do things like chose a ship you wanted to have from the assembled lot and just have it fly out into position.

===Coordinated Firing ===

To control firing from both formations of ships and large batteries of turrets, it would be necessary to create a system for aligning their targets.  For example, when manning the broadside guns of a capital ship, some fire arcs would naturally be out of direct alignment with the gunner.  If not compensated for correctly, these extra shots would essentially be wasted, as they couldn't be accurately aimed at small targets with any precision.

My initial thought for correcting this problem was to have a single, instantaneous, tracer shot which would be fired with each button press.  This would have no animation, but would provide a painter for Bot manned weapons to home in on.  Each of these Bot guns would then fire their own weapons in time with the gunner's to simulate the effect of coordinated battery fire.  The same concept holds for a ship formation as well.  Naturally, someone else has already run into and corrected for this problem.  Namely Foxpaw with his [[Legacy:Foxpaw/Cosmic_Fury|Cosmic Fury]] mod, so maybe he'll have further insight once I get out of the n00b stage.

===Characters/Classes ===

*'''Commander''' - This class is the one calling all the shots.  They are housed within each team's mothership and have access to overviews of the total action.  They can't directly attack anyone, however, they can command Bot controlled vehicles to perform tasks, issue commands to formations of human controlled ships, and provide needed tactical information for assaults.  This position would best be served as a voted position for each team, or an automatic appointment for the player with the best score from each round (possible waived for good performance by the prior Commander).

*'''Pilots/Grunts''' - Basically everybody else.  These players fly most/all of the ships, man the capital turrets, and perform the majority of tactical assaults.  They have few special abilities per say, except for an ability to man nearly any form of weapon known.

===Weapons ===

The weapons section is divided into two sub-segments.  Weapon types (beam/projectile/mine) and weapon classes (Light/Medium/Heavy).  Each basic weapon concept has three levels of power which correspond to its class and there are several variations within the basic beam and projectile classes.

'''Projectile Weapons'''

Series of weapons which use rechargable ammunition that is flung from the ship/turret at high speeds.  Ammunition can be renewed through the steady expenditure of resources.  Generally greater damage per shot than beam weapons, but require more skill to apply their full damage.  No problems with energy drain, however.

*'''Gattling Cannon''' - A weapon firing high speed streams of shots, which shifts form rather than power/shot with each class increase.
**Light Form - A single stream of shots which hits only in the center of the targeting region and has minimal spread due to vehicle compensation.
**Medium Form - Three streams of shots, which can have their angular alignment adjusted using the right mouse button.  i.e. The spread and coverage of the shots can be widened or concentrated for the application.
**Heavy Form - Six streams of shots, which cover varying angular cross sections and can be expanded and contracted in the form of two aligned cones with varying base diameters.  (The second group has a slightly wider spread)

*'''Flak Gun''' - A weapon firing exploding shots which send off further cascades of exploding debris in a spherical pattern.
**Light Form - A single projectile shot which explodes on impact or at a set distance from the ship (can be set with right button).
**Medium Form - A single shot which explodes at a set distance which can be set or triggered and fires off four smaller exploding shots when it explodes.
**Heavy Form - A single shot which explodes at a set distance that can be set or triggered, fires off four smaller exploding shots when it explodes, and each of which also fires off 2-4 smaller shots when they explode.

*'''Seeker Missiles''' - Quick homing missiles that fire in greater and greater numbers with increasing class and have a fast fire rate.
**Light Form - Fires one heat seeking missile that tracks on any target in the reticle, much like an Avril.
**Medium Form - Fires two missiles, but functions similarly.
**Heavy Form - Fires three missiles, but functions similarly.

*'''Torpedoes''' - Limited or no-homing rockets that are meant as counters to larger ships.  Slow rate of fire and travel time.
**Light Form - Fires a single torpedo that has a good ratio of damage per second and per shot, but is easy to dodge.
**Medium Form - Bulkier form of the torpedo that is meant for taking down medium and larger ships.  Fighters will rarely be hit by it.
**Heavy Form - Huge torpedo that is meant for taking down capital monstrosities and beats even the heaviest armors.

'''Beam Weapons'''

Series of weapons which are powered from the ships systems.  Usually lower power per shot, however, they are easily tracked in most cases and require only the power of the ship to function.  However, they must be monitored or they will empty the ship reserves and hamper its other functions.

*'''Pulse Beam''' - Classic &quot;zapping&quot; beam weapon, which has a short initiation time, a somewhat quick travel time, and then a short pause before the next firing cycle.
**Light Form - Pencil thin beam that does a minor amount of damage.  Very small initiation time before firing.
**Medium Form - Slightly larger beam which scales up the damage accordingly, and has a slightly longer initialization time.
**Heavy Form - Arm or greater width beam that can punch through every form of armor, but has a long initialization delay.
**Macross Style? - Possible super capital weapon that requires devotion to one ship.  Takes up a large number of forward firing slots, has a long delay, but basically eradicates things in its path.  Only an idea, probably bad for balance.

*'''Energy Blades''' - Shot like beam weapon which fires out gliding discs of energy.  Each form has curve arcs which can be adjusted with the right button of the mouse.
**Light Form - Single stream of discs which can be curved side to side in flight.
**Medium Form - Two streams of discs which naturally curve and can have the distance at which the beams cross adjusted.
**Heavy Form - Similar to the medium form, but with three discs that cross at 120 degree angles.

*'''Ring Beam''' - Ever expanding beam that decreases in power the wider it gets.  Probably be fairly nasty in close or in tightly packed formations of ships.  Increasing power increases the damage per ring while the rate stays constant.
**Light Form - Orange rings which propogate along a 30 degree arc in front of the weapon.
**Medium Form - Orange/Red rings which are similar in operation to light version but more powerful.
**Heavy Form - Red rings which are similar to medium version but more powerful.

*'''Shock Shield''' - Cascading energy shield that simply zaps foes which get too close to the ship.
**Light Form - Minor static discharges with decent damage per second for their class, but limited range.
**Medium Form - Similar in terms of good damage per second and function, but slightly improved range and a bit of a travel delay.
**Heavy Form - Same, but with an additional range upgrade and increased travel delay.

'''Mines'''

Class of weapons which are meant to serve as a tactical deterrent rather than a true offensive tool.  Most will be of a form which hampers progress, imobilizes foes, or degrades system performance.

*'''Concussion Mines''' - Explosive mines which do a high damage individually, but have a very low damage per second when used as a weapon.
**Light Form - Small, self propelled mines that move fairly quickly to catch fighters but have a hard time beating more than light armor.
**Medium Form - Larger, propelled mines that move near cruiser speeds and can tackle medium armor and lower.
**Heavy Form - Huge, slow, or even stationary, mines which knock big holes in capital ships but can be evaded easily by lesser classes.

*'''EMP Mines''' - Electromagnetic mines which send off an electronics disabling pulse when approached by ships.
**Light Form - Similar to concussion of same size but disable weapons and thrust on ships they hit for a short time.
**Medium Form - Similar to the above, but made to handle the heavier systems of cruisers.
**Heavy Form - Huge EMP weapons that can disable capital ships for a short time, but are easily avoided and visible.

===Vehicles ===

This mod will contain four groupings of vehicles which will roughly be divided by their physical size, function, and potential firepower.  Three of these subdivisions will be the purvey of players and will consist of vessels which can be used to take the war to their foes.  The fourth grouping will only house two vessels per map and will function more as a mobile command-post for the war effort than a true vehicle.

Listed in order of increasing size, the three vehicle classes will be:

#Fighter
#Cruiser
#Capital 
#Command

Each of these classes will possess the same ability to assemble into formations and may eventually possess the ability to mix formations.  However, within the first generation, single type formations will be the norm to simplify group and battery fire.  To handle weapon allocation for each type of ship, they will have a selection of weapon or equipment &quot;hard points&quot; which will vary with size.  The vision for these hard points is that when allocating equipment to a ship or group of ships, they would choose varying sizes of weapons which would each eat a certain number of points on the surface.  Then, depending on the numbers of weapons chosen, the effects would be generated from a turret or barrel location corresponding to the first section of each block.

For example:

A cruiser might have:
*(4) Forward slots
*(3) Port slots
*(3) Starboard slots

These could be filled with:
*'''Forward:''' (1) L-PulseBeam, (1) L-PulseBeam, (2) M - PulseBeam
*'''Port:''' - (3) H-GattlingCannon
*'''Starboard:''' - (3) H-GattlingCannon

Depending on final design, this would allow even the smallest fighters to do signfigant damage to larger, heavily armored groups if they were willing to sacrifice utility to do so.  A good example of this might be capital ship hunting torpedo fighters.

===Maps ===

The maps for this modification are going to be solely space based maps with full three dimensional movement.  Due to the nature of a two sided conflict, they will probably be most often aligned along a central axis around which the general conflict is organized.  The first such map envisioned for testing purposes was a simple asteroid cloud design, in which the command ships would be partitioned from one another by a large cloud of asteroids within the center region of the map or possibly just by smaller clumps of asteroids.

A secondary idea would be for the rubble of a decrepit space station, from which parts can be disassembled for resources.  Mining from such an object would probably produce a more refined form of resources, and as such, might allow for increased harvesting speed and increased game speed.

Currently, the backdrop for such levels was envisioned as a simple black backdrop with stars.  However, after looking over some of Foxpaw's work and scanning back over my prior experience with the Homeworld line, it seems as though a colored backdrop which emulated something like the center of a nebula might be a more fitting choice, as it would provide a more interesting world and more &quot;ooo, aaahhh&quot; factor.  Plus, it might explain why render distances are low. (The cloud's obscuring them, yeah, thats it.)

===Music ===

As I'm not currently a mixer of game music, I might have to farm this aspect out to someone who knows what they're doing.  However, as the form of music I envision is mainly ambient or electronica with a sparse, &quot;airy&quot; feel, I might be able to pick up the technical know how to create it.  Not sure yet.

For examples of the general type of work I'm holding in my wee little brain follow these:

(Watch out for the OCRemix links, as djpretzel fills his site with a staggering number of popups) 

[http://www.vgmix.com/song_view.php?song_id=814 destructo - The Lost Horizon]

[http://www.ocremix.org/detailmix.php?mixid=OCR00354 Mazedude - Surface ofthe Moon]

[http://www.ocremix.org/detailmix.php?mixid=OCR01048 The Wingless - One Girl in All the World]

[http://www.ocremix.org/detailmix.php?mixid=OCR00322 AmIEvil - Metroid MindofMother]

[http://www.ocremix.org/detailmix.php?mixid=OCR01127 ABG - Ada's Groove] (Possibly a bit too fast and invasive)

Incidentally, most of these are off my own mp3 organizational structure fittingly titled &quot;Space Mixes&quot;

==Closing Comments and Appendix ==

Alright, from all that it looks like I've got a bit of work on my hands.  As I've already received comments from folks doing similar work, it also looks like I'm stepping into an area that's already being explored.  The mod mentioned above, [[Legacy:Foxpaw/Cosmic_Fury|Cosmic Fury]], encompasses a number of ideas which I could see application for in my own work.  (Although the hand construction of ships by component seems a bit large in scope for my own designs.  In addition, the [[Legacy:NickR|Dark Horizons]] mod seen on the wiki and on NickR's own [http://www.planetunreal.com/nickr/ site] seems to cover some of the space warfare gaps quite well.  I'll have to look over my design and see what aspects can be modified so that I'm not just rehashing work and so that I can broaden the UT community at large.

-Araes-

----

==Comments ==

'''NickR:''' Nice idea. :D I would say that though, because I'm doing something very similar! Maybe we should coordinate are efforts so that our features don't heavily overlap.

'''Araes:''' I wouldn't be opposed to that Nick, as I kind of figured that since it seemed like a good idea someone had to have already though of it first.  Lemme get the rest of the information down for this and then maybe we can discuss some kind of arrangement.  I assume the mod you are talking about is the new mod on your [http://www.planetunreal.com/nickr/ Arcade Site], that references improving on Natural Selection?

'''Foxpaw:''' I think he was referring to the space combat one, &quot;Dark Frontier.&quot; ;)

'''Araes:''' Alright, I guess I'll let him respond whenever he gets back, but if his Dark Frontier were to be the next USpace, I would imagine it as less of a tactical RTS type, like Natural Selection, and more of a team, ship-based DM or objective map.  Unfortunately, not a lot of info besides his site and the wiki notes.  Ah well.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ArcaneSpeech</title>
    <id>379</id>
    <revision>
      <id>1283</id>
      <timestamp>2006-12-02T03:16:08Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Orphan page hunting.</comment>
      <text xml:space="preserve">===Life, My Universe, and Everything===

====Brief History====

Hi. I'm ArcaneSpeech. Born 17 November 1982, I've been a coder since 1990, when I learned good ol' '''GW-BASIC'''. (Does anyone remember that magazine, ''3-2-1 Contact''? With the ''BASIC Training'' articles?) Although I graduated through other versions (namely QBasic, QuickBASIC, and VB), I didn't recover from the disease until 1995, when my dad bought a nice, shiny copy of ''Micro$oft Visual C++ 4.0''. While Dad tried unsuccessfully to get Win95 to stop crashing every time he typed the word 'unix', I desperately tried to remember the '''''%#$@''''' semicolon at the end of each line. Still, I vowed never to go back to the monstrosity that was BASIC.

Fast forward to the present. Now out of high-school and holding down a respectable career as a job hunter, I discovered Unreal Tournament in 2001 (yes, I live under a rock). Love at first fight. When I played it for the first time, my jaw dropped at how realistic it all looked. (Stop looking at me like that! I told you, I live under a rock!) Then I looked under the hood, and thought I'd died and gone to heaven. I'd studied Java a little (enough to use it, with my now-extensive C++ self-education) and knew I could work with this UnrealScript stuff. I wanted to alter unreality.

====Shameless Self-Pity====

In the beginning, most of my UScript projects went the way most of my C++ projects did &amp;ndash; stillborn. I'm pretty sure I have ADD. If I don't care &amp;ndash; and I mean '''care''' about something, it doesn't get done. Even when I care, unless I plan out what I'm doing, think it over carefully, and ''research'' all parts of it, my projects tend to stall when they hit a bump or a bug that I just don't know how to handle. When I search for an answer, ADD sets in after the twenty-third article that bears no relation to my problem. That's when the Unreal Wiki came to my rescue.

====Ode to the Wiki====

For the past year, I've been blundering through the UnrealEd class browser, desperately trying to find out wtf is going on. Everything I've done has been an attempt at understanding the unbelievably complex machine that is the Unreal Engine. Thanks to the Wiki, I've learned more about the Unreal Engine in the past few days than I learned in the past year. Sixty-five-thousand-five-hundred-thirty-five thanks to each and every one of the [[:Category:Legacy Personal Page]]!

----

'''capt. k.:'''  Hehehe.  Ten points to anyone who can name where the &quot;Basic Training&quot; section of 3-2-1 Contact orignated.  :)

'''Tarquin:''' My vote is Chiark Orbital.

'''capt. k.:'''  Sometime in the early 80's the print publishing arm of CTW started a computer magazine called &quot;Enter&quot; to accompany their 3-2-1 Contact, Electric Company, and Sesame Street magazines.  I don't recall if there was a show to go along with it, but probably not, as the magazine was short-lived.  Probably because back then computers were still just hobby machines and expensive toys &amp;ndash; when it was incorporated into 3-2-1 Contact, there was actually a big stink about it from Contact readers, who felt that it was a waste of space because not everyone owned a computer.  Still, they're worth digging up if you want to read about hot technologies at the time, like the TRS-80 and Commodore PET.

'''Ars-Magna:''' I'm definitely younger than you, but I got 3-2-1 Contact as a kid as well. That was after the &quot;Basic Training&quot; section was removed, though, I think.

BTW, Arcane, I have serious ADD too. The computer is about the only thing I can focus on (besides movies and music). I have had a love for programming since I was about 7, and I believe I finally completed my first program at the age of 13, and that's just because I got paid a whopping $800 to do it. (I worked literally hundreds of hours on that project.) Being ADD is tough, especially when Ritalin, Adderol and the other meds don't help. Best of luck to you, if you have ADD. It sucks.

'''EntropicLqd:''' Welcome to the Wiki :).  I definately don't have ADD and I probably complete about 10% (less than that probably looking at the number of project directories littering my HD) of everything I start.  I figure out the hard interesting stuff and then get bored doing the drudgery and think of a new whizzy idea that would be more interesting to do.  Maze games are about the only ones I've finished consistently so far.  Weird that.

'''SavannahLion:''' 1982? I'm older than you and I don't even remember those Basic articles. I started cutting my teeth on an Atari XEGS With the Atari-Basic manual that came with it. I'm pretty sure I left my sanity there since A: I had no one to turn to if I had questions about what was in that manual and B: I knew squit about how to type so it would take me an hour just to create a dozen lines of code and C: My dad is a carpenter. I'm going to dig up my old 3-2-1 magazines and see what's in there.

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1284</id>
      <timestamp>2002-09-11T07:38:44Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Welcome</comment>
      <text xml:space="preserve">===Life, My Universe, and Everything===

====Brief History====

Hi. I'm ArcaneSpeech. Born 17 November 1982, I've been a coder since 1990, when I learned good ol' '''GW-BASIC'''. (Does anyone remember that magazine, ''3-2-1 Contact''? With the ''BASIC Training'' articles?) Although I graduated through other versions (namely QBasic, QuickBASIC, and VB), I didn't recover from the disease until 1995, when my dad bought a nice, shiny copy of ''Micro$oft Visual C++ 4.0''. While Dad tried unsuccessfully to get Win95 to stop crashing every time he typed the word 'unix', I desperately tried to remember the '''''%#$@''''' semicolon at the end of each line. Still, I vowed never to go back to the monstrosity that was BASIC.

Fast forward to the present. Now out of high-school and holding down a respectable career as a job hunter, I discovered Unreal Tournament in 2001 (yes, I live under a rock). Love at first fight. When I played it for the first time, my jaw dropped at how realistic it all looked. (Stop looking at me like that! I told you, I live under a rock!) Then I looked under the hood, and thought I'd died and gone to heaven. I'd studied Java a little (enough to use it, with my now-extensive C++ self-education) and knew I could work with this UnrealScript stuff. I wanted to alter unreality.

====Shameless Self-Pity====

In the beginning, most of my UScript projects went the way most of my C++ projects did &amp;ndash; stillborn. I'm pretty sure I have ADD. If I don't care &amp;ndash; and I mean '''care''' about something, it doesn't get done. Even when I care, unless I plan out what I'm doing, think it over carefully, and ''research'' all parts of it, my projects tend to stall when they hit a bump or a bug that I just don't know how to handle. When I search for an answer, ADD sets in after the twenty-third article that bears no relation to my problem. That's when the Unreal Wiki came to my rescue.

====Ode to the Wiki====

For the past year, I've been blundering through the UnrealEd class browser, desperately trying to find out wtf is going on. Everything I've done has been an attempt at understanding the unbelievably complex machine that is the Unreal Engine. Thanks to the Wiki, I've learned more about the Unreal Engine in the past few days than I learned in the past year. Sixty-five-thousand-five-hundred-thirty-five thanks to each and every one of the [[:Category:Legacy Personal Page]]!

----

'''capt. k.:'''  Hehehe.  Ten points to anyone who can name where the &quot;Basic Training&quot; section of 3-2-1 Contact orignated.  :)

'''Tarquin:''' My vote is Chiark Orbital.

'''capt. k.:'''  Sometime in the early 80's the print publishing arm of CTW started a computer magazine called &quot;Enter&quot; to accompany their 3-2-1 Contact, Electric Company, and Sesame Street magazines.  I don't recall if there was a show to go along with it, but probably not, as the magazine was short-lived.  Probably because back then computers were still just hobby machines and expensive toys &amp;ndash; when it was incorporated into 3-2-1 Contact, there was actually a big stink about it from Contact readers, who felt that it was a waste of space because not everyone owned a computer.  Still, they're worth digging up if you want to read about hot technologies at the time, like the TRS-80 and Commodore PET.

'''Ars-Magna:''' I'm definitely younger than you, but I got 3-2-1 Contact as a kid as well. That was after the &quot;Basic Training&quot; section was removed, though, I think.

BTW, Arcane, I have serious ADD too. The computer is about the only thing I can focus on (besides movies and music). I have had a love for programming since I was about 7, and I believe I finally completed my first program at the age of 13, and that's just because I got paid a whopping $800 to do it. (I worked literally hundreds of hours on that project.) Being ADD is tough, especially when Ritalin, Adderol and the other meds don't help. Best of luck to you, if you have ADD. It sucks.

'''EntropicLqd:''' Welcome to the Wiki :).  I definately don't have ADD and I probably complete about 10% (less than that probably looking at the number of project directories littering my HD) of everything I start.  I figure out the hard interesting stuff and then get bored doing the drudgery and think of a new whizzy idea that would be more interesting to do.  Maze games are about the only ones I've finished consistently so far.  Weird that.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1285</id>
      <timestamp>2003-02-28T01:51:09Z</timestamp>
      <contributor>
        <ip>SavannahLion</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Life, My Universe, and Everything===

====Brief History====

Hi. I'm ArcaneSpeech. Born 17 November 1982, I've been a coder since 1990, when I learned good ol' '''GW-BASIC'''. (Does anyone remember that magazine, ''3-2-1 Contact''? With the ''BASIC Training'' articles?) Although I graduated through other versions (namely QBasic, QuickBASIC, and VB), I didn't recover from the disease until 1995, when my dad bought a nice, shiny copy of ''Micro$oft Visual C++ 4.0''. While Dad tried unsuccessfully to get Win95 to stop crashing every time he typed the word 'unix', I desperately tried to remember the '''''%#$@''''' semicolon at the end of each line. Still, I vowed never to go back to the monstrosity that was BASIC.

Fast forward to the present. Now out of high-school and holding down a respectable career as a job hunter, I discovered Unreal Tournament in 2001 (yes, I live under a rock). Love at first fight. When I played it for the first time, my jaw dropped at how realistic it all looked. (Stop looking at me like that! I told you, I live under a rock!) Then I looked under the hood, and thought I'd died and gone to heaven. I'd studied Java a little (enough to use it, with my now-extensive C++ self-education) and knew I could work with this UnrealScript stuff. I wanted to alter unreality.

====Shameless Self-Pity====

In the beginning, most of my UScript projects went the way most of my C++ projects did &amp;ndash; stillborn. I'm pretty sure I have ADD. If I don't care &amp;ndash; and I mean '''care''' about something, it doesn't get done. Even when I care, unless I plan out what I'm doing, think it over carefully, and ''research'' all parts of it, my projects tend to stall when they hit a bump or a bug that I just don't know how to handle. When I search for an answer, ADD sets in after the twenty-third article that bears no relation to my problem. That's when the Unreal Wiki came to my rescue.

====Ode to the Wiki====

For the past year, I've been blundering through the UnrealEd class browser, desperately trying to find out wtf is going on. Everything I've done has been an attempt at understanding the unbelievably complex machine that is the Unreal Engine. Thanks to the Wiki, I've learned more about the Unreal Engine in the past few days than I learned in the past year. Sixty-five-thousand-five-hundred-thirty-five thanks to each and every one of the [[:Category:Legacy Personal Page]]!

----

'''capt. k.:'''  Hehehe.  Ten points to anyone who can name where the &quot;Basic Training&quot; section of 3-2-1 Contact orignated.  :)

'''Tarquin:''' My vote is Chiark Orbital.

'''capt. k.:'''  Sometime in the early 80's the print publishing arm of CTW started a computer magazine called &quot;Enter&quot; to accompany their 3-2-1 Contact, Electric Company, and Sesame Street magazines.  I don't recall if there was a show to go along with it, but probably not, as the magazine was short-lived.  Probably because back then computers were still just hobby machines and expensive toys &amp;ndash; when it was incorporated into 3-2-1 Contact, there was actually a big stink about it from Contact readers, who felt that it was a waste of space because not everyone owned a computer.  Still, they're worth digging up if you want to read about hot technologies at the time, like the TRS-80 and Commodore PET.

'''Ars-Magna:''' I'm definitely younger than you, but I got 3-2-1 Contact as a kid as well. That was after the &quot;Basic Training&quot; section was removed, though, I think.

BTW, Arcane, I have serious ADD too. The computer is about the only thing I can focus on (besides movies and music). I have had a love for programming since I was about 7, and I believe I finally completed my first program at the age of 13, and that's just because I got paid a whopping $800 to do it. (I worked literally hundreds of hours on that project.) Being ADD is tough, especially when Ritalin, Adderol and the other meds don't help. Best of luck to you, if you have ADD. It sucks.

'''EntropicLqd:''' Welcome to the Wiki :).  I definately don't have ADD and I probably complete about 10% (less than that probably looking at the number of project directories littering my HD) of everything I start.  I figure out the hard interesting stuff and then get bored doing the drudgery and think of a new whizzy idea that would be more interesting to do.  Maze games are about the only ones I've finished consistently so far.  Weird that.

'''SavannahLion:''' 1982? I'm older than you and I don't even remember those Basic articles. I started cutting my teeth on an Atari XEGS With the Atari-Basic manual that came with it. I'm pretty sure I left my sanity there since A: I had no one to turn to if I had questions about what was in that manual and B: I knew squit about how to type so it would take me an hour just to create a dozen lines of code and C: My dad is a carpenter. I'm going to dig up my old 3-2-1 magazines and see what's in there.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Architecture</title>
    <id>352</id>
    <revision>
      <id>1218</id>
      <timestamp>2006-12-02T03:18:08Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Orphan page hunting.</comment>
      <text xml:space="preserve">This page is the hub for all things to do with the actual building of the Unreal world. Here, architecture is about creating an environment for players to move about in. Here on the Unreal Wiki we've pretty much split the topic between ''technique'' (this page) and ''design'' ([[Legacy:Map Design|Map Design]]).

Prior to [[Legacy:UT2003|UT2003]], all architecture was made with [[Legacy:CSG|CSG]] in [[Legacy:UnrealEd|UnrealEd]]. This treated the [[Legacy:Unreal World|Unreal World]] as a giant lump of clay, which the mapper then hollowed out with primitive shapes: the [[Legacy:Brush|brush]]es. The [[Legacy:Build|build]] process then compiles a [[Legacy:BSP|BSP]] from the brushes, and the mapper applies stored textures to the visible surfaces.

This method still exists in UT2003/4, but there's now an extra layer on top of this: [[Legacy:Static Mesh|static mesh]]es. These are hardware-cached elements which add a tremendous amount of detail to a map at a relatively small extra processing cost. A static mesh is a saved resource, like a [[Legacy:Texture|texture]]. They ''can'' be made in UnrealEd, but this is not optimal: it's best to use other applications. 

Lastly, there is the [[Legacy:Terrain|terrain]] system, which is another thing yet again. 

So making the Unreal world believable to the players boils down to three things: 
* [[Legacy:Building With CSG|Building With CSG]]
* [[Legacy:Building With Static Meshes|Building With Static Meshes]]
* [[Legacy:Terrain|Terrain]]

==Related Topics ==
* [[Legacy:Architecture/Discuss|Architecture/Discuss]]
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Making Architecture|Making Architecture]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Planning|Map Planning]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1219</id>
      <timestamp>2005-12-02T22:43:57Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is the hub for all things to do with the actual building of the Unreal world. Here, architecture is about creating an environment for players to move about in. Here on the Unreal Wiki we've pretty much split the topic between ''technique'' (this page) and ''design'' ([[Legacy:Map Design|Map Design]]).

Prior to [[Legacy:UT2003|UT2003]], all architecture was made with [[Legacy:CSG|CSG]] in [[Legacy:UnrealEd|UnrealEd]]. This treated the [[Legacy:Unreal World|Unreal World]] as a giant lump of clay, which the mapper then hollowed out with primitive shapes: the [[Legacy:Brush|brush]]es. The [[Legacy:Build|build]] process then compiles a [[Legacy:BSP|BSP]] from the brushes, and the mapper applies stored textures to the visible surfaces.

This method still exists in UT2003/4, but there's now an extra layer on top of this: [[Legacy:Static Mesh|static mesh]]es. These are hardware-cached elements which add a tremendous amount of detail to a map at a relatively small extra processing cost. A static mesh is a saved resource, like a [[Legacy:Texture|texture]]. They ''can'' be made in UnrealEd, but this is not optimal: it's best to use other applications. 

Lastly, there is the [[Legacy:Terrain|terrain]] system, which is another thing yet again. 

So making the Unreal world believable to the players boils down to three things: 
* [[Legacy:Building With CSG|Building With CSG]]
* [[Legacy:Building With Static Meshes|Building With Static Meshes]]
* [[Legacy:Terrain|Terrain]]

==Related Topics ==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Making Architecture|Making Architecture]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1220</id>
      <timestamp>2006-01-04T02:58:29Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is the hub for all things to do with the actual building of the Unreal world. Here, architecture is about creating an environment for players to move about in. Here on the Unreal Wiki we've pretty much split the topic between ''technique'' (this page) and ''design'' ([[Legacy:Map Design|Map Design]]).

Prior to [[Legacy:UT2003|UT2003]], all architecture was made with [[Legacy:CSG|CSG]] in [[Legacy:UnrealEd|UnrealEd]]. This treated the [[Legacy:Unreal World|Unreal World]] as a giant lump of clay, which the mapper then hollowed out with primitive shapes: the [[Legacy:Brush|brush]]es. The [[Legacy:Build|build]] process then compiles a [[Legacy:BSP|BSP]] from the brushes, and the mapper applies stored textures to the visible surfaces.

This method still exists in UT2003/4, but there's now an extra layer on top of this: [[Legacy:Static Mesh|static mesh]]es. These are hardware-cached elements which add a tremendous amount of detail to a map at a relatively small extra processing cost. A static mesh is a saved resource, like a [[Legacy:Texture|texture]]. They ''can'' be made in UnrealEd, but this is not optimal: it's best to use other applications. 

Lastly, there is the [[Legacy:Terrain|terrain]] system, which is another thing yet again. 

So making the Unreal world believable to the players boils down to three things: 
* [[Legacy:Building With CSG|Building With CSG]]
* [[Legacy:Building With Static Meshes|Building With Static Meshes]]
* [[Legacy:Terrain|Terrain]]

==Related Topics ==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Making Architecture|Making Architecture]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Planning|Map Planning]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Architecture/Discuss</title>
    <id>351</id>
    <revision>
      <id>1216</id>
      <timestamp>2003-01-05T18:57:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Discussion page for the Architecture topic header page

''Tao'':Hey tarq,I think your new organization for the [[Legacy:Architecture|architecture]] section is maybe a little too complex and unfriendly to browse. Maybe we should put the more basic stuff at the beginning (brush,addition/substracion,etc...). It looks a bit like a tech doc... hey excuse my critics,you're doing a tremendous job :)
:''Tarquin''  It's a fair point. I've been pondering that page for a few days. I like the &quot;Creating Shapes&quot; section, because that groups all the ways of changing the red builder brush, though the actual header name I just made up on the spot ;-)&lt;br /&gt;I'm not sure what everyone had against [[Legacy:Beginner Topics|Beginner Topics]], maybe that could become the &quot;introduction to mapping&quot; topic list, or maybe have a &quot;basics&quot; section at the top of the [[Legacy:Architecture|architecture]] page.&lt;br /&gt;At some point I'll be digging up everything I've posted on semisolids to BuF-Ed... that'll be pretty technical!
:''Tao'': IMHO for example ,and for the sake of making it accessible to complete begginers who don't know where to look and who could be submersed by the quantity of information: [[Legacy:Subtraction And Addition|subtraction and addition]] should be read before [[Legacy:Intersect|Intersect]], 'brush clipping' or 'vertex editing'. The 'beginners topic' section is copycat of 'tutorial', a complete noob would be confused. What I mean is the noob should be able to read all in one go and have it clear in his head.
:''Tarq'': I agree that thematic order &amp; n00b-advisory order are not the same. My idea for the [[Legacy:Beginner Topics|Beginner Topics]] was that it would be a selection of links from places like Architecture, arranged in n00b-friendly order with extra explanations &amp; also links to n00b-specific tutorials. Alternatively, we could have a sub-page like Architecture/Beginners.&lt;br /&gt;Anyway, the sections after &quot;Creating Shapes&quot; are still messy, I'm finding it a really hard topic to organize logically :-)
:''TossMonkey'': Personally I think this whole site is the best idea ever. Anyway, I moved that Artistic thingy I originally put in the UnrealEd Tips section into the design section, mainly because it would be more suited there. I am not hugely keen on the layout of this site, it's a wee bit mind boggling with all this info :D
:''Machismo'': err how about a general section with links to web page reference material for architecture like gothic, industrial etc. like this page http://www.kent.k12.wa.us/staff/cspears/middle_ages/architecture.html

:'''Tarquin:''' great idea, Mach! 

:''Machismo'': hey tarquin i've been collecting a host of sites with gothic architecture. i've compiled it into a PDF file should I upload it somewhere ... need authors permission first though :p

I think there is a problem looming in that level building has changed in some very significant ways from previous versions of the engine.  In fact the numerous changes across the engine are bound to cause trouble not just in this section.  I think now is the time to dicuss how info applicable to Unreal/UT/RUNE/Wot/Undying is going to be distinguished from UT2003 onwards info.  Simply putting what has changed sections and various notes is not a good way to deal with it.  Shot of editing all pages to have headers what, other ways can this info be reorganized?  Does anyone have a new structure proposal for adding in pages?  Maybe we need a set of icons for pages (which doen't help text searches though)?  If something isn't done now in the early stages of transition, the wiki could become a big mess.  Already some areas are starting to fragment and get confusing.  Imagine what it might be like for someone without the knowledge of years of following the various engine developments? At least a clear well thought out presentation of UT2003+ material should be made, as though starting from scratch.  Then the older material can be back filled. -Gith

----

'''Balu''': I wonder if we should include links to texture/mesh/whatever-collections somewhere. Those could be nice ressources for mappers searching for things to get their new map ready

'''Tarquin:''' Sure.</text>
    </revision>
    <revision>
      <id>1217</id>
      <timestamp>2003-01-05T17:18:03Z</timestamp>
      <contributor>
        <ip>Balu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Discussion page for the Architecture topic header page

''Tao'':Hey tarq,I think your new organization for the [[Legacy:Architecture|architecture]] section is maybe a little too complex and unfriendly to browse. Maybe we should put the more basic stuff at the beginning (brush,addition/substracion,etc...). It looks a bit like a tech doc... hey excuse my critics,you're doing a tremendous job :)
:''Tarquin''  It's a fair point. I've been pondering that page for a few days. I like the &quot;Creating Shapes&quot; section, because that groups all the ways of changing the red builder brush, though the actual header name I just made up on the spot ;-)&lt;br /&gt;I'm not sure what everyone had against [[Legacy:Beginner Topics|Beginner Topics]], maybe that could become the &quot;introduction to mapping&quot; topic list, or maybe have a &quot;basics&quot; section at the top of the [[Legacy:Architecture|architecture]] page.&lt;br /&gt;At some point I'll be digging up everything I've posted on semisolids to BuF-Ed... that'll be pretty technical!
:''Tao'': IMHO for example ,and for the sake of making it accessible to complete begginers who don't know where to look and who could be submersed by the quantity of information: [[Legacy:Subtraction And Addition|subtraction and addition]] should be read before [[Legacy:Intersect|Intersect]], 'brush clipping' or 'vertex editing'. The 'beginners topic' section is copycat of 'tutorial', a complete noob would be confused. What I mean is the noob should be able to read all in one go and have it clear in his head.
:''Tarq'': I agree that thematic order &amp; n00b-advisory order are not the same. My idea for the [[Legacy:Beginner Topics|Beginner Topics]] was that it would be a selection of links from places like Architecture, arranged in n00b-friendly order with extra explanations &amp; also links to n00b-specific tutorials. Alternatively, we could have a sub-page like Architecture/Beginners.&lt;br /&gt;Anyway, the sections after &quot;Creating Shapes&quot; are still messy, I'm finding it a really hard topic to organize logically :-)
:''TossMonkey'': Personally I think this whole site is the best idea ever. Anyway, I moved that Artistic thingy I originally put in the UnrealEd Tips section into the design section, mainly because it would be more suited there. I am not hugely keen on the layout of this site, it's a wee bit mind boggling with all this info :D
:''Machismo'': err how about a general section with links to web page reference material for architecture like gothic, industrial etc. like this page http://www.kent.k12.wa.us/staff/cspears/middle_ages/architecture.html

:'''Tarquin:''' great idea, Mach! 

:''Machismo'': hey tarquin i've been collecting a host of sites with gothic architecture. i've compiled it into a PDF file should I upload it somewhere ... need authors permission first though :p

I think there is a problem looming in that level building has changed in some very significant ways from previous versions of the engine.  In fact the numerous changes across the engine are bound to cause trouble not just in this section.  I think now is the time to dicuss how info applicable to Unreal/UT/RUNE/Wot/Undying is going to be distinguished from UT2003 onwards info.  Simply putting what has changed sections and various notes is not a good way to deal with it.  Shot of editing all pages to have headers what, other ways can this info be reorganized?  Does anyone have a new structure proposal for adding in pages?  Maybe we need a set of icons for pages (which doen't help text searches though)?  If something isn't done now in the early stages of transition, the wiki could become a big mess.  Already some areas are starting to fragment and get confusing.  Imagine what it might be like for someone without the knowledge of years of following the various engine developments? At least a clear well thought out presentation of UT2003+ material should be made, as though starting from scratch.  Then the older material can be back filled. -Gith

----

'''Balu''': I wonder if we should include links to texture/mesh/whatever-collections somewhere. Those could be nice ressources for mappers searching for things to get their new map ready</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Archnemesis</title>
    <id>445</id>
    <revision>
      <id>1477</id>
      <timestamp>2003-10-28T21:39:46Z</timestamp>
      <contributor>
        <ip>Gso57-101-131.triad.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Intro===

I have been working on a mod with several custom gametypes and have found that there are no in depth tutorials

on the subject. I have learned alot from UnrealWiki, 3DBuzz, and the many forums, and have

decided to bring it all together here.  What I am going to attempt is a series of step by step tutorials 

in which beginners can learn how to make a custom gametype with mulitple player classes ala Team Fortress Classic

and a menu in which they can select the players.  
  

===The Hunted for UT2003===

I have decided to use this tutorial to lay the foundations of a Hunted mod.  Basically what I will end up with is a mod where you use a custom shortcut to start the game, which will open with its own customized spalsh panel and main menu.  From there, when you start an instant action game, it will open another menu which will let you select from 5 different classes:
*Classes
*#Sniper
*#Soidler
*#Heavy Weapons 
*#Medic
*#The President

From there I will customize several characteristics of each player class:
*Weapons Loadout
*Mesh and textures
*Max Health
*Voice Pack
*HUD

The goal here is to create tutorials thru which the beginner can lay the foundations of a mod in only a few simple lessons.  I am not going to delve too much into the game rules etc, because I do not know alot about them.  I know absolutely nothng about net code.  As I learn, I may continue the tutorials.  But for know I will leave it to others who know more than I to pick up where I leave off.

====Credit Where Credit is Due====

My class selection menus are based heavily on the Riftwar Mod by RegularX, whose tutorial on the subject is part of UnrealWiki, so I would like to take a moment to give him credit.  I also will refer to tutorials by J. Giles at Sega 500 Scripting.  His powerpoint presentations are a very good starting point for beginners like myself.

'''Note:''' I have recieved permission from both of these authors to reproduce code that they have written, which I do referencing them as the original authors.

I would also like to thank everyone involved with Mastering Unreal, as the classes as well as the people in them have been most informative.  As I said before, I am only a beginner who has drawn this info from many sources and I want to bring it together here as a way of &quot;paying it forward&quot;.

So let the tutorials begin!

[[Legacy:Hunted2003|Hunted2003]]  
 

===Comments===

'''MythOpus:''' Hey man , and Welcome to the Wiki!  I'm trying to make a mod myself but have no idea on how to make new gametypes or all this stuff you need to make a mod.  The gametype tut here just isn't good enough ;)  i'm looking forward to your tuts :cool:

'''Wormbo:''' Welcome to the wiki. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1478</id>
      <timestamp>2003-10-27T11:23:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>oops</comment>
      <text xml:space="preserve">===Intro===

I have been working on a mod with several custom gametypes and have found that there are no in depth tutorials

on the subject. I have learned alot from UnrealWiki, 3DBuzz, and the many forums, and have

decided to bring it all together here.  What I am going to attempt is a series of step by step tutorials 

in which beginners can learn how to make a custom gametype with mulitple player classes ala Team Fortress Classic

and a menu in which they can select the players.  
  

===The Hunted for UT2003===

I have decided to use this tutorial to lay the foundations of a Hunted mod.  Basically what I will end up with is a mod where you use a custom shortcut to start the game, which will open with its own customized spalsh panel and main menu.  From there, when you start an instant action game, it will open another menu which will let you select from 5 different classes:
*Classes
*#Sniper
*#Soidler
*#Heavy Weapons 
*#Medic
*#The President

From there I will customize several characteristics of each player class:
*Weapons Loadout
*Mesh and textures
*Max Health
*Voice Pack
*HUD

The goal here is to create tutorials thru which the beginner can lay the foundations of a mod in only a few simple lessons.  I am not going to delve too much into the game rules etc, because I do not know alot about them.  I know absolutely nothng about net code.  As I learn, I may continue the tutorials.  But for know I will leave it to others who know more than I to pick up where I leave off.

====Credit Where Credit is Due====

My class selection menus are based heavily on the Riftwar Mod by RegularX, whose tutorial on the subject is part of UnrealWiki, so I would like to take a moment to give him credit.  I also will refer to tutorials by J. Giles at Sega 500 Scripting.  His powerpoint presentations are a very good starting point for beginners like myself.  I would also like to thank everyone involved with Mastering Unreal, as the classes as well as the people in them have been most informative.  As I said before, I am only a beginner who has drawn this info from many sources and I want to bring it together here as a way of &quot;paying it forward&quot;.

So let the tutorials begin!

[[Legacy:Hunted2003|Hunted2003]]  
 

===Comments===

'''MythOpus:''' Hey man , and Welcome to the Wiki!  I'm trying to make a mod myself but have no idea on how to make new gametypes or all this stuff you need to make a mod.  The gametype tut here just isn't good enough ;)  i'm looking forward to your tuts :cool:

'''Wormbo:''' Welcome to the wiki. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Arelius</title>
    <id>495</id>
    <revision>
      <id>1571</id>
      <timestamp>2006-05-24T21:33:24Z</timestamp>
      <contributor>
        <ip>64-167-48-130.ded.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Nicholas Ray===

----

===Comments===

'''Tarquin:''' Hi, welcome to Unreal Wiki. :)

'''Arelius:''' Thanks, tis a wonderful place to be!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1572</id>
      <timestamp>2005-12-06T08:32:40Z</timestamp>
      <contributor>
        <ip>C-67-174-240-249.hsd1.ca.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Nicholas Ray===

My Blog: http://Arelius.1up.com

----

===Comments===

'''Tarquin:''' Hi, welcome to Unreal Wiki. :)

'''Arelius:''' Thanks, tis a wonderful place to be!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Arena</title>
    <id>353</id>
    <revision>
      <id>1221</id>
      <timestamp>2008-02-08T16:53:34Z</timestamp>
      <contributor>
        <ip>Ip599363c1.rubicom.hu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; Arena (Package: Botpack)}}

The base class of all arena mutators like Rocket Launcher Arena or InstaGib DM. Only one Arena mutator is allowed at the same time. If you use two Arena mutators at the same time (e.g. Shock Arena and InstaGib DM), you'll end up with NO weapons at all, not even pickups!

==Properties ==
; name WeaponName : The name of the arena [[Legacy:Weapon (UT)|Weapon (UT)]]'s class.
; string WeaponString : The actor to replace weapons on the map with. (usually the arena weapon)
; name AmmoName : The name of the arena weapon's [[Legacy:Ammo (UT)|Ammo (UT)]] class. Use 'NullAmmo' (or any other non-existant class name) if the weapon doesn't have ammo.
; string AmmoString : The actor to replace ammo pickups on the map with. (usually the arena weapon's ammo class)

The arena weapon's class is also specified in the DefaultWeapon value.

When you create Arena Mutators, you might want to note that DeathmatchPlus and TournamentPlayer both have this same function that forces the pre-caching of weapon meshes that your mutator will never use because you only allow one weapon (usually). It's easy to fix this in any new arena mutators you create. 

Just override '''both''' of those functions anywhere in your code like this:

(This would have been the way to do it in InstagibDM, but you want to remove the right weapon meshes for your mutator.)

&lt;uscript&gt;
/*
function PreCacheReferences()
{
	//never called - here to force precaching of meshes
	spawn(class'TMale1');
	spawn(class'TMale2');
	spawn(class'TFemale1');
	spawn(class'TFemale2');
	spawn(class'ImpactHammer');
	spawn(class'Translocator');
	spawn(class'Enforcer');
	spawn(class'UT_Biorifle');
	spawn(class'ShockRifle');
	spawn(class'PulseGun');
	spawn(class'Ripper');
	spawn(class'Minigun2');
	spawn(class'UT_FlakCannon');
	spawn(class'UT_Eightball');
	spawn(class'SniperRifle');
}
*/
function class&lt;TournamentPlayer&gt;PreCacheReferences()
{
	//never called - here to force precaching of meshes
	//RegWeaps removed by CH3Z
	spawn(class'TMale1');
	spawn(class'TMale2');
	spawn(class'TFemale1');
	spawn(class'TFemale2');
	spawn(class'ShockRifle');

}
function class&lt;DeathmatchPlus&gt;PreCacheReferences()
{
	//never called - here to force precaching of meshes
	//RegWeaps removed by CH3Z
	spawn(class'TMale1');
	spawn(class'TMale2');
	spawn(class'TFemale1');
	spawn(class'TFemale2');
	spawn(class'ShockRifle');

}
&lt;/uscript&gt;

(Force is hardly ever the wise choice. ;))

==Known subclasses ==

* [[Legacy:Specific_Arena_Mutators|FlakArena]]
* [[Legacy:Specific_Arena_Mutators|ImpactArena]]
* [[Legacy:Specific_Arena_Mutators|InstaGibDM]]
* [[Legacy:Specific_Arena_Mutators|MinigunArena]]
* [[Legacy:Specific_Arena_Mutators|PulseArena]]
* [[Legacy:Specific_Arena_Mutators|RocketArena]]
* [[Legacy:Specific_Arena_Mutators|ShockArena]]
* [[Legacy:Specific_Arena_Mutators|SniperArena]]

* [[Legacy:EnhancedItems/EnhancedArena|EnhancedItems/EnhancedArena]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1222</id>
      <timestamp>2006-08-22T17:38:54Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; Arena (Package: Botpack)}}

The base class of all arena mutators like Rocket Launcher Arena or InstaGib DM. Only one Arena mutator is allowed at the same time.

==Properties ==
; name WeaponName : The name of the arena [[Legacy:Weapon (UT)|Weapon (UT)]]'s class.
; string WeaponString : The actor to replace weapons on the map with. (usually the arena weapon)
; name AmmoName : The name of the arena weapon's [[Legacy:Ammo (UT)|Ammo (UT)]] class. Use 'NullAmmo' (or any other non-existant class name) if the weapon doesn't have ammo.
; string AmmoString : The actor to replace ammo pickups on the map with. (usually the arena weapon's ammo class)

The arena weapon's class is also specified in the DefaultWeapon value.

When you create Arena Mutators, you might want to note that DeathmatchPlus and TournamentPlayer both have this same function that forces the pre-caching of weapon meshes that your mutator will never use because you only allow one weapon (usually). It's easy to fix this in any new arena mutators you create. 

Just override '''both''' of those functions anywhere in your code like this:

(This would have been the way to do it in InstagibDM, but you want to remove the right weapon meshes for your mutator.)

&lt;uscript&gt;
/*
function PreCacheReferences()
{
	//never called - here to force precaching of meshes
	spawn(class'TMale1');
	spawn(class'TMale2');
	spawn(class'TFemale1');
	spawn(class'TFemale2');
	spawn(class'ImpactHammer');
	spawn(class'Translocator');
	spawn(class'Enforcer');
	spawn(class'UT_Biorifle');
	spawn(class'ShockRifle');
	spawn(class'PulseGun');
	spawn(class'Ripper');
	spawn(class'Minigun2');
	spawn(class'UT_FlakCannon');
	spawn(class'UT_Eightball');
	spawn(class'SniperRifle');
}
*/
function class&lt;TournamentPlayer&gt;PreCacheReferences()
{
	//never called - here to force precaching of meshes
	//RegWeaps removed by CH3Z
	spawn(class'TMale1');
	spawn(class'TMale2');
	spawn(class'TFemale1');
	spawn(class'TFemale2');
	spawn(class'ShockRifle');

}
function class&lt;DeathmatchPlus&gt;PreCacheReferences()
{
	//never called - here to force precaching of meshes
	//RegWeaps removed by CH3Z
	spawn(class'TMale1');
	spawn(class'TMale2');
	spawn(class'TFemale1');
	spawn(class'TFemale2');
	spawn(class'ShockRifle');

}
&lt;/uscript&gt;

(Force is hardly ever the wise choice. ;))

==Known subclasses ==

* [[Legacy:Specific_Arena_Mutators|FlakArena]]
* [[Legacy:Specific_Arena_Mutators|ImpactArena]]
* [[Legacy:Specific_Arena_Mutators|InstaGibDM]]
* [[Legacy:Specific_Arena_Mutators|MinigunArena]]
* [[Legacy:Specific_Arena_Mutators|PulseArena]]
* [[Legacy:Specific_Arena_Mutators|RocketArena]]
* [[Legacy:Specific_Arena_Mutators|ShockArena]]
* [[Legacy:Specific_Arena_Mutators|SniperArena]]

* [[Legacy:EnhancedItems/EnhancedArena|EnhancedItems/EnhancedArena]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Armor</title>
    <id>28319</id>
    <revision>
      <id>39986</id>
      <timestamp>2009-11-14T20:13:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Armor Damage Absorption</title>
    <id>364</id>
    <revision>
      <id>1246</id>
      <timestamp>2002-05-28T23:10:14Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">When a [[Legacy:Pawn (UT)|Pawn (UT)]] takes damage it allows its [[Legacy:Inventory (UT)|Inventory (UT)]] items to reduce the damage by calling the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function of the first item in the inventory chain, but only if the Pawn's &lt;tt&gt;bIsPlayer&lt;/tt&gt; property is &lt;tt&gt;True&lt;/tt&gt; and the Pawn's &lt;tt&gt;ReducedDamageType&lt;/tt&gt; property is not 'All'.&lt;br /&gt;

The damage reduction process is divided into two steps:
# Create a list of armor items and sort it by priority.
# Let the single items in that list reduce the damage until either the damage is 0 or the end of the list is reached.

==Creating the List ==

When building the list of armor items ''every'' item in the Pawn's inventory list is checked even if its &lt;tt&gt;bIsAnArmor&lt;/tt&gt; is &lt;tt&gt;False&lt;/tt&gt;. (e.g. the Relic of Redemption is not an armor item, but still uses armor functions to check for probably deadly hits.)&lt;br&gt;

The list is built by the recursively called &lt;tt&gt;PrioritizeArmor&lt;/tt&gt; function:

&lt;uscript&gt;
function inventory PrioritizeArmor( int Damage, name DamageType, vector HitLocation )
{
    local Inventory FirstArmor, InsertAfter;
    
    if ( Inventory != None )
        FirstArmor = Inventory.PrioritizeArmor(Damage, DamageType, HitLocation);
    else
        FirstArmor = None;
    
    if ( bIsAnArmor)
    {
        if ( FirstArmor == None )
        {
            nextArmor = None;
            return self;
        }
    
        // insert this armor into the prioritized armor list
        if ( FirstArmor.ArmorPriority(DamageType) &lt; ArmorPriority(DamageType) )
        {
            nextArmor = FirstArmor;
            return self;
        }
        InsertAfter = FirstArmor;
        while ( (InsertAfter.nextArmor != None) 
                &amp;&amp; (InsertAfter.nextArmor.ArmorPriority(DamageType) &gt; ArmorPriority(DamageType)) )
            InsertAfter = InsertAfter.nextArmor;
        
        nextArmor = InsertAfter.nextArmor;
        InsertAfter.nextArmor = self;
    }
    return FirstArmor;
}
&lt;/uscript&gt;

If there is at least one more item in the inventory chain that item's &lt;tt&gt;PrioritizeArmor&lt;/tt&gt; function is called and returns the first item of a sorted list of all armors behind this item in the inventory chain. That item is stored in the &lt;tt&gt;FirstArmor&lt;/tt&gt; variable. When &quot;&lt;tt&gt;if (bIsAnArmor)&lt;/tt&gt;&quot; is reached and the &lt;tt&gt;FirstArmor&lt;/tt&gt; variable still contains &lt;tt&gt;None&lt;/tt&gt; there are no armor items in the inventory chain behind this item, so if this item ''is'' an armor it will be returned as the first (and only) item of the armor list to either the previous &lt;tt&gt;PrioitizeArmor&lt;/tt&gt; function or to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function.

If the armor list is not empty the return values of the &lt;tt&gt;ArmorPriority&lt;/tt&gt; functions of this item and of the items in the armor list are compared until the correct position for this item is found. The item is inserted into the list then and the first item of the list (which could also be this item) is returned to either the previous &lt;tt&gt;PrioitizeArmor&lt;/tt&gt; function or to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function.

When code execution is returned to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function it has a reference to the complete and sorted list of armor items.

==Reducing Damage ==

Now the items can start reducing the damage. The items in the armor list now receive &lt;tt&gt;ArmorAbsorbDamage&lt;/tt&gt; calls untill the damage is 0 or the end of the list is reached.

By default the &lt;tt&gt;ArmorAbsorbDamage&lt;/tt&gt; function works like this:

# If the damage type is not 'Drowned' the item's &lt;tt&gt;ArmorImpactEffect&lt;/tt&gt; function is called.
# If the damage type is not 'None' and matches either &lt;tt&gt;ProtectionType1&lt;/tt&gt; or &lt;tt&gt;ProtectionType2&lt;/tt&gt; a damage of 0 si returned meaning all damage has been absorbed without using the armor's charge.
# If the damage type is 'Drowned' the full damage is returned meaning no damage has been absorbed at all.
# An &quot;armor damage&quot; value is calculated: &lt;tt&gt;ArmorDamage = (Damage * ArmorAbsorption) / 100&lt;/tt&gt;&lt;br /&gt;If the armor damage is greater than or equal to the armor's &lt;tt&gt;Charge&lt;/tt&gt; the armor damage is reduced to &lt;tt&gt;Charge&lt;/tt&gt; and the item is destroyed. If there's more charge than armor damage &lt;tt&gt;Charge&lt;/tt&gt; is reduced by &lt;tt&gt;ArmorDamage&lt;/tt&gt;.&lt;br /&gt;In both cases &lt;tt&gt;Damage - ArmorDamage&lt;/tt&gt; is returned as the new damage value to be processed by the next armor item.

==Related Topics ==
* [[Legacy:Taking Damage|Taking Damage]]</text>
    </revision>
    <revision>
      <id>1247</id>
      <timestamp>2002-04-27T21:09:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When a [[Legacy:Pawn (UT)|Pawn (UT)]] takes damage it allows its [[Legacy:Inventory (UT)|Inventory (UT)]] items to reduce the damage by calling the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function of the first item in the inventory chain, but only if the Pawn's &lt;tt&gt;bIsPlayer&lt;/tt&gt; property is &lt;tt&gt;True&lt;/tt&gt; and the Pawn's &lt;tt&gt;ReducedDamageType&lt;/tt&gt; property is not 'All'.&lt;br /&gt;

The damage reduction process is divided into two steps:
# Create a list of armor items and sort it by priority.
# Let the single items in that list reduce the damage until either the damage is 0 or the end of the list is reached.

==Creating the list ==

When building the list of armor items ''every'' item in the Pawn's inventory list is checked even if its &lt;tt&gt;bIsAnArmor&lt;/tt&gt; is &lt;tt&gt;False&lt;/tt&gt;. (e.g. the Relic of Redemption is not an armor item, but still uses armor functions to check for probably deadly hits.)&lt;br&gt;

The list is built by the recursively called &lt;tt&gt;PrioritizeArmor&lt;/tt&gt; function:

{{classbox|code@function inventory PrioritizeArmor( int Damage, name DamageType, vector HitLocation )}}

{
    local Inventory FirstArmor, InsertAfter;
    
    if ( Inventory != None )
        FirstArmor = Inventory.PrioritizeArmor(Damage, DamageType, HitLocation);
    else
        FirstArmor = None;
    
    if ( bIsAnArmor)
    {
        if ( FirstArmor == None )
        {
            nextArmor = None;
            return self;
        }
    
        // insert this armor into the prioritized armor list
        if ( FirstArmor.ArmorPriority(DamageType) &lt; ArmorPriority(DamageType) )
        {
            nextArmor = FirstArmor;
            return self;
        }
        InsertAfter = FirstArmor;
        while ( (InsertAfter.nextArmor != None) 
                &amp;&amp; (InsertAfter.nextArmor.ArmorPriority(DamageType) &gt; ArmorPriority(DamageType)) )
            InsertAfter = InsertAfter.nextArmor;
        
        nextArmor = InsertAfter.nextArmor;
        InsertAfter.nextArmor = self;
    }
    return FirstArmor;

}@@

If there is at least one more item in the inventory chain that item's &lt;tt&gt;PrioritizeArmor&lt;/tt&gt; function is called and returns the first item of a sorted list of all armors behind this item in the inventory chain. That item is stored in the &lt;tt&gt;FirstArmor&lt;/tt&gt; variable. When &quot;&lt;tt&gt;if (bIsAnArmor)&lt;/tt&gt;&quot; is reached and the &lt;tt&gt;FirstArmor&lt;/tt&gt; variable still contains &lt;tt&gt;None&lt;/tt&gt; there are no armor items in the inventory chain behind this item, so if this item ''is'' an armor it will be returned as the first (and only) item of the armor list to either the previous &lt;tt&gt;PrioitizeArmor&lt;/tt&gt; function or to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function.&lt;br&gt;

If the armor list is not empty the return values of the &lt;tt&gt;ArmorPriority&lt;/tt&gt; functions of this item and of the items in the armor list are compared until the correct position for this item is found. The item is inserted into the list then and the first item of the list (which could also be this item) is returned to either the previous &lt;tt&gt;PrioitizeArmor&lt;/tt&gt; function or to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function.&lt;br&gt;

When code execution is returned to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function it has a reference to the complete and sorted list of armor items.

==Reducing damage ==

Now the items can start reducing the damage. The items in the armor list now receive &lt;tt&gt;ArmorAbsorbDamage&lt;/tt&gt; calls untill the damage is 0 or the end of the list is reached.&lt;br&gt;

By default the &lt;tt&gt;ArmorAbsorbDamage&lt;/tt&gt; function works like this:&lt;br&gt;
# If the damage type is not 'Drowned' the item's &lt;tt&gt;ArmorImpactEffect&lt;/tt&gt; function is called.
# If the damage type is not 'None' and matches either &lt;tt&gt;ProtectionType1&lt;/tt&gt; or &lt;tt&gt;ProtectionType2&lt;/tt&gt; a damage of 0 si returned meaning all damage has been absorbed without using the armor's charge.
# If the damage type is 'Drowned' the full damage is returned meaning no damage has been absorbed at all.
# An &quot;armor damage&quot; value is calculated: &lt;tt&gt;ArmorDamage = (Damage * ArmorAbsorption) / 100&lt;/tt&gt;&lt;br /&gt;If the armor damage is greater than or equal to the armor's &lt;tt&gt;Charge&lt;/tt&gt; the armor damage is reduced to &lt;tt&gt;Charge&lt;/tt&gt; and the item is destroyed. If there's more charge than armor damage &lt;tt&gt;Charge&lt;/tt&gt; is reduced by &lt;tt&gt;ArmorDamage&lt;/tt&gt;.&lt;br /&gt;In both cases &lt;tt&gt;Damage - ArmorDamage&lt;/tt&gt; is returned as the new damage value to be processed by the next armor item.

==Related topics ==
* [[Legacy:Taking Damage|Taking Damage]]</text>
    </revision>
    <revision>
      <id>1248</id>
      <timestamp>2002-05-03T16:37:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>wookeed</comment>
      <text xml:space="preserve">When a [[Legacy:Pawn (UT)|Pawn (UT)]] takes damage it allows its [[Legacy:Inventory (UT)|Inventory (UT)]] items to reduce the damage by calling the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function of the first item in the inventory chain, but only if the Pawn's &lt;tt&gt;bIsPlayer&lt;/tt&gt; property is &lt;tt&gt;True&lt;/tt&gt; and the Pawn's &lt;tt&gt;ReducedDamageType&lt;/tt&gt; property is not 'All'.&lt;br /&gt;

The damage reduction process is divided into two steps:
# Create a list of armor items and sort it by priority.
# Let the single items in that list reduce the damage until either the damage is 0 or the end of the list is reached.

==Creating the list ==

When building the list of armor items ''every'' item in the Pawn's inventory list is checked even if its &lt;tt&gt;bIsAnArmor&lt;/tt&gt; is &lt;tt&gt;False&lt;/tt&gt;. (e.g. the Relic of Redemption is not an armor item, but still uses armor functions to check for probably deadly hits.)&lt;br&gt;

The list is built by the recursively called &lt;tt&gt;PrioritizeArmor&lt;/tt&gt; function:

&lt;uscript&gt;
function inventory PrioritizeArmor( int Damage, name DamageType, vector HitLocation )
{
    local Inventory FirstArmor, InsertAfter;
    
    if ( Inventory != None )
        FirstArmor = Inventory.PrioritizeArmor(Damage, DamageType, HitLocation);
    else
        FirstArmor = None;
    
    if ( bIsAnArmor)
    {
        if ( FirstArmor == None )
        {
            nextArmor = None;
            return self;
        }
    
        // insert this armor into the prioritized armor list
        if ( FirstArmor.ArmorPriority(DamageType) &lt; ArmorPriority(DamageType) )
        {
            nextArmor = FirstArmor;
            return self;
        }
        InsertAfter = FirstArmor;
        while ( (InsertAfter.nextArmor != None) 
                &amp;&amp; (InsertAfter.nextArmor.ArmorPriority(DamageType) &gt; ArmorPriority(DamageType)) )
            InsertAfter = InsertAfter.nextArmor;
        
        nextArmor = InsertAfter.nextArmor;
        InsertAfter.nextArmor = self;
    }
    return FirstArmor;
}
&lt;/uscript&gt;

If there is at least one more item in the inventory chain that item's &lt;tt&gt;PrioritizeArmor&lt;/tt&gt; function is called and returns the first item of a sorted list of all armors behind this item in the inventory chain. That item is stored in the &lt;tt&gt;FirstArmor&lt;/tt&gt; variable. When &quot;&lt;tt&gt;if (bIsAnArmor)&lt;/tt&gt;&quot; is reached and the &lt;tt&gt;FirstArmor&lt;/tt&gt; variable still contains &lt;tt&gt;None&lt;/tt&gt; there are no armor items in the inventory chain behind this item, so if this item ''is'' an armor it will be returned as the first (and only) item of the armor list to either the previous &lt;tt&gt;PrioitizeArmor&lt;/tt&gt; function or to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function.

If the armor list is not empty the return values of the &lt;tt&gt;ArmorPriority&lt;/tt&gt; functions of this item and of the items in the armor list are compared until the correct position for this item is found. The item is inserted into the list then and the first item of the list (which could also be this item) is returned to either the previous &lt;tt&gt;PrioitizeArmor&lt;/tt&gt; function or to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function.

When code execution is returned to the &lt;tt&gt;ReduceDamage&lt;/tt&gt; function it has a reference to the complete and sorted list of armor items.

==Reducing damage ==

Now the items can start reducing the damage. The items in the armor list now receive &lt;tt&gt;ArmorAbsorbDamage&lt;/tt&gt; calls untill the damage is 0 or the end of the list is reached.

By default the &lt;tt&gt;ArmorAbsorbDamage&lt;/tt&gt; function works like this:

# If the damage type is not 'Drowned' the item's &lt;tt&gt;ArmorImpactEffect&lt;/tt&gt; function is called.
# If the damage type is not 'None' and matches either &lt;tt&gt;ProtectionType1&lt;/tt&gt; or &lt;tt&gt;ProtectionType2&lt;/tt&gt; a damage of 0 si returned meaning all damage has been absorbed without using the armor's charge.
# If the damage type is 'Drowned' the full damage is returned meaning no damage has been absorbed at all.
# An &quot;armor damage&quot; value is calculated: &lt;tt&gt;ArmorDamage = (Damage * ArmorAbsorption) / 100&lt;/tt&gt;&lt;br /&gt;If the armor damage is greater than or equal to the armor's &lt;tt&gt;Charge&lt;/tt&gt; the armor damage is reduced to &lt;tt&gt;Charge&lt;/tt&gt; and the item is destroyed. If there's more charge than armor damage &lt;tt&gt;Charge&lt;/tt&gt; is reduced by &lt;tt&gt;ArmorDamage&lt;/tt&gt;.&lt;br /&gt;In both cases &lt;tt&gt;Damage - ArmorDamage&lt;/tt&gt; is returned as the new damage value to be processed by the next armor item.

==Related topics ==
* [[Legacy:Taking Damage|Taking Damage]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Armor2</title>
    <id>365</id>
    <revision>
      <id>1249</id>
      <timestamp>2002-05-28T19:15:10Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Created</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; Armor2}}

==Body Armour ==

The body armour provides 100 points of armour protection when picked up.  It can be combined with the [[Legacy:ThighPads|ThighPads]] to get 150 armour points.  The armour has an absorption rating of 75 and an absorption priority of 7.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ArmorPickup</title>
    <id>434</id>
    <revision>
      <id>1455</id>
      <timestamp>2005-12-18T04:55:06Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]]  &gt;&gt; ArmorPickup (Package: Engine)}}

{{innerbox| For state behavoir of this item refer to the parent class [[Legacy:Pickup|Pickup]].

}}

==Functions==

===Inherited From [[Legacy:Pickup|Pickup]]===
; float BotDesireability( [[Legacy:Pawn|Pawn]] Bot ) : This determines the AI for desireability of the [[Legacy:Pickup|Pickup]].  The desirability is based on the respawn time and the amount of armor that the bot currently has.  

==Related Topics==
* [[Legacy:ShieldPickup|ShieldPickup]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1456</id>
      <timestamp>2003-08-17T06:02:51Z</timestamp>
      <contributor>
        <ip>Burtlo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]]  &gt;&gt; ArmorPickup}}

{{innerbox| For state behavoir of this item refer to the parent class [[Legacy:Pickup|Pickup]].

}}

==Properties ==

==Methods ==

; float	BotDesireability ([[Legacy:Pawn|pawn]] Bot) : Overriden. This determines the AI for desireability of the [[Legacy:Pickup|Pickup]].  The desirability is based on the respawn time and the amount of armor that the bot currently has.  

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1457</id>
      <timestamp>2003-08-17T08:28:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]]  &gt;&gt; ArmorPickup (Package: Engine)}}

{{innerbox| For state behavoir of this item refer to the parent class [[Legacy:Pickup|Pickup]].

}}

==Properties ==

==Methods ==

===Inherited From [[Legacy:Pickup|Pickup]]===
; float BotDesireability ([[Legacy:Pawn|Pawn]] Bot) : This determines the AI for desireability of the [[Legacy:Pickup|Pickup]].  The desirability is based on the respawn time and the amount of armor that the bot currently has.  

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ArrayIndexer</title>
    <id>506</id>
    <revision>
      <id>1596</id>
      <timestamp>2006-08-15T14:13:39Z</timestamp>
      <contributor>
        <ip>Panorama.wcss.wroc.pl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About==

ArrayIndexer is a [[Legacy:WOTgreal|WOTgreal]] macro that updates indexes of selected defaultproperties array items. It's handy when you reorder array items and dont want to upddate the index numbers manually.

==Before==

&lt;uscript&gt;
defaultproperties
{
    DeathSounds(0)=Sound'NewDeath.fn_death01'
    DeathSounds(3)=Sound'NewDeath.fn_death04'
    DeathSounds(4)=Sound'NewDeath.fn_death05'
    DeathSounds(1)=Sound'NewDeath.fn_death02'
    DeathSounds(2)=Sound'NewDeath.fn_death03'
}
&lt;/uscript&gt;

==After==

&lt;uscript&gt;
defaultproperties
{
    DeathSounds(0)=Sound'NewDeath.fn_death01'
    DeathSounds(1)=Sound'NewDeath.fn_death04'
    DeathSounds(2)=Sound'NewDeath.fn_death05'
    DeathSounds(3)=Sound'NewDeath.fn_death02'
    DeathSounds(4)=Sound'NewDeath.fn_death03'
}
&lt;/uscript&gt;	

==Code==

&lt;uscript&gt;
program ArrayIndexer
begin
    // ========================================================================
    //  UnrealScript ArrayIndexer
    //
    //  Copyright 2005 Roman Switch` Dzieciol, neai o2.pl
    //  http://wiki.beyondunreal.com/wiki/Switch
    // ========================================================================

    cpos := 0;

    // ========================================================================


    BlockBeginX, BlockBeginY := BlockBegin();
    BlockEndX, BlockEndY := BlockEnd();

    for line:=BlockBeginY to BlockEndY step 1 do
    begin
        SetCursorXY(0,line);
        sline := CurrentLine();

        lpos := Pos('(',sline);
        if (lpos &lt;&gt; 0) then
        begin
            sleft := Copy(sline,0,lpos);
        	rpos := Pos(')',sline);
	        if (rpos &lt;&gt; 0) then
	        begin
            	sright := Copy(sline,rpos,Length(sline)-rpos+1);
            	sline := sleft + IntToStr(cpos) + sright;
            	cpos := cpos + 1;
                SetCurrentLine(sline);
	        end;
        end;
	end;
end;
&lt;/uscript&gt;

[[Category:Legacy WOTgreal Macro|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ArrowSpawner</title>
    <id>371</id>
    <revision>
      <id>1263</id>
      <timestamp>2002-06-08T14:23:52Z</timestamp>
      <contributor>
        <ip>198.164.127.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ArrowSpawner}}

This subclass of the ArrowSpawner enables you to use a trigger to set it off. The original ArrowSpawner could be set off using a trigger but it would go on forever, the following script (scripted by [[Legacy:Tarquin|Tarquin]]) gives you the ability to tell the ArrowSpawner how many arrows to shoot before it turns off. To use the CountingArrowSpawner, go in the actor class / Effects / ArrowSpawner and choose CountingArrowSpawner. Put it in your map at the desired location, then set up a [[Legacy:Trigger|Trigger]] so that the CountingArrowSpawner is activated when triggered. Then, right-click the CountingArrowSpawner, then click CountingArrowSpawner Properties, now, click the '+' beside CountingArrowSpawner and finally, input the number of arrows desired to be shot before deactivation, that's it.

==Extending ==

For an arrow spawner which fires a set number of arrows then stops, use this script. See [[Legacy:Create A Subclass|Create A Subclass]] for instructions.

: The ArrowSpawner still goes on forever when activated with a trigger.
:: Will look into it tomorrow.  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
:: Fixed and tested.  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

&lt;uscript&gt;
//=============================================================================
// CountingArrowSpawner.
//=============================================================================
class CountingArrowSpawner extends ArrowSpawner;

var() int ArrowCount ;
var int ArrowsToFire ;

state Active
{
	Ignores Trigger, UnTrigger ;
	function Timer()
	{
		local Arrow a;
		//Instigator.ClientMessage( &quot;ArrowCount =&quot; @ ArrowsToFire );

		if ( ArrowsToFire &gt; 0) {
			if ( ArrowsToFire == 1) {
				SetTimer(0.0, False);
				
				GoToState('');
			}
			a = Spawn(class'Arrow',, '', Location+Vector(Rotation)*20);			
			a.Speed = ArrowSpeed;
			ArrowsToFire--;
			SetTimer(RepeatDelay, True);
		}
		else {
			a = Spawn(class'Arrow',,, Location+Vector(Rotation)*20);
			a.Speed = ArrowSpeed;
			SetTimer(RepeatDelay, True);
		}
	}

Begin:
	ArrowsToFire = ArrowCount ;
	SetTimer(TriggerDelay, True);
}
&lt;/uscript&gt;

===Notes ===

The property ArrowsToShootAfterDeactivated no longer has any effect. Some jiggery-pokery with a PreBeginPlay would fix this; add it to ArrowCount, for example &amp;ndash; but not terribly logical.</text>
    </revision>
    <revision>
      <id>1264</id>
      <timestamp>2002-06-08T14:21:59Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ArrowSpawner}}

This subclass of the ArrowSpawner enables you to use a trigger to set it off. The original ArrowSpawner could be set off using a trigger but it would go on forever, the following script (scripted by [[Legacy:Tarquin|Tarquin]]) gives you the abbility to tell the ArrowSpawner how many arrows to shoot before it turns off. To use the CountingArrowSpawner, go in the actor class / Effects / ArrowSpawner and choose CountingArrowSpawner. Put it in your map at the desired location, then set up a [[Legacy:Trigger|Trigger]] so that the CountingArrowSpawner is activated when triggered. Then, right-click the CountingArrowSpawner, then click CountingArrowSpawner Properties, now, click the '+' beside CountingArrowSpawner and finally, input the number of arrows desired to be shot before deactivation, that's it.

==Extending ==

For an arrow spawner which fires a set number of arrows then stops, use this script. See [[Legacy:Create A Subclass|Create A Subclass]] for instructions.

: The ArrowSpawner still goes on forever when activated with a trigger.
:: Will look into it tomorrow.  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
:: Fixed and tested.  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

&lt;uscript&gt;
//=============================================================================
// CountingArrowSpawner.
//=============================================================================
class CountingArrowSpawner extends ArrowSpawner;

var() int ArrowCount ;
var int ArrowsToFire ;

state Active
{
	Ignores Trigger, UnTrigger ;
	function Timer()
	{
		local Arrow a;
		//Instigator.ClientMessage( &quot;ArrowCount =&quot; @ ArrowsToFire );

		if ( ArrowsToFire &gt; 0) {
			if ( ArrowsToFire == 1) {
				SetTimer(0.0, False);
				
				GoToState('');
			}
			a = Spawn(class'Arrow',, '', Location+Vector(Rotation)*20);			
			a.Speed = ArrowSpeed;
			ArrowsToFire--;
			SetTimer(RepeatDelay, True);
		}
		else {
			a = Spawn(class'Arrow',,, Location+Vector(Rotation)*20);
			a.Speed = ArrowSpeed;
			SetTimer(RepeatDelay, True);
		}
	}

Begin:
	ArrowsToFire = ArrowCount ;
	SetTimer(TriggerDelay, True);
}
&lt;/uscript&gt;

===Notes ===

The property ArrowsToShootAfterDeactivated no longer has any effect. Some jiggery-pokery with a PreBeginPlay would fix this; add it to ArrowCount, for example &amp;ndash; but not terribly logical.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ars-Magna</title>
    <id>376</id>
    <revision>
      <id>1275</id>
      <timestamp>2002-09-29T22:52:31Z</timestamp>
      <contributor>
        <ip>Ars-Magna</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Hi, and welcome to the Wiki.  :-)  Please add yourself to the list of [[Legacy:Project Contributors|Project Contributors]].

'''Tarquin:'''  Hi &amp; welcome :D

Thank you. :-) This is a great place for me to get tips on UnrealEd and provide a few of my own (I don't purport to know much.) I guess I can link to my site from here, where I am going to (but haven't yet) add a UT section. I really enjoy making maps, though most of them are fairly crappy. Most of my maps are CTF maps. I'm planning on working on mutators/mods in the future, possibly even some for UT2003.

[http://ut.pozytron.com/ The unreal media centre (umc)]

Anyone who contributes to the UnrealWiki is welcomed to the umc. Please send me an email, and I'll be glad to upgrade your account so you can post reviews and such.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Test]] Umm, just a test... :-)

The UT2003 demo has been hosted by my site since about a day after its release, and it has extremely low traffic. If you still want a copy go check it out!

'''Tarquin:'''  Don't worry too much about layout &amp; stuff. There's a few pages on [[Legacy:MetaTopics|MetaTopics]] where we thrashed out conventions.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1276</id>
      <timestamp>2002-07-23T02:57:31Z</timestamp>
      <contributor>
        <ip>Ars-Magna</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Hi, and welcome to the Wiki.  :-)  Please add yourself to the list of [[Legacy:Project Contributors|Project Contributors]].

'''Tarquin:'''  Hi &amp; welcome :D

Thank you. :-) This is a great place for me to get tips on UnrealEd and provide a few of my own (I don't purport to know much.) I guess I can link to my site from here, where I am going to (but haven't yet) add a UT section. I really enjoy making maps, though most of them are fairly crappy. Most of my maps are CTF maps. I'm planning on working on mutators/mods in the future, possibly even some for UT2003.

[http://ut.pozytron.com/ My UT Page]

'''Tarquin:'''  Don't worry too much about layout &amp; stuff. There's a few pages on [[Legacy:MetaTopics|MetaTopics]] where we thrashed out conventions.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1277</id>
      <timestamp>2002-09-21T18:22:16Z</timestamp>
      <contributor>
        <ip>Ars-Magna</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Hi, and welcome to the Wiki.  :-)  Please add yourself to the list of [[Legacy:Project Contributors|Project Contributors]].

'''Tarquin:'''  Hi &amp; welcome :D

Thank you. :-) This is a great place for me to get tips on UnrealEd and provide a few of my own (I don't purport to know much.) I guess I can link to my site from here, where I am going to (but haven't yet) add a UT section. I really enjoy making maps, though most of them are fairly crappy. Most of my maps are CTF maps. I'm planning on working on mutators/mods in the future, possibly even some for UT2003.

[http://ut.pozytron.com/ The unreal media centre (umc)]

Anyone who contributes to the UnrealWiki is welcomed to the umc. Please send me an email, and I'll be glad to upgrade your account so you can post reviews and such.

The UT2003 demo has been hosted by my site since about a day after its release, and it has extremely low traffic. I fyou still want a copy go check it out!

'''Tarquin:'''  Don't worry too much about layout &amp; stuff. There's a few pages on [[Legacy:MetaTopics|MetaTopics]] where we thrashed out conventions.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ars-Magna/Test</title>
    <id>381</id>
    <revision>
      <id>1288</id>
      <timestamp>2002-09-30T00:02:54Z</timestamp>
      <contributor>
        <ip>Ars-Magna</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">It was successful!!!

==Comments ==

The comments need to stay!!!!!</text>
    </revision>
    <revision>
      <id>1289</id>
      <timestamp>2002-09-30T00:01:58Z</timestamp>
      <contributor>
        <ip>NODE1.HOSTING-NETWORK.COM</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">It was successful!!! Try 2...

==Comments ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Artificial Intelligence</title>
    <id>354</id>
    <revision>
      <id>1223</id>
      <timestamp>2007-11-09T13:49:26Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <comment>These comments belong on your personal page, mod page or somewhere other than a class page.-SuperApe</comment>
      <text xml:space="preserve">Artificial Intelligence, or AI, refers to any automated mechanism which serves the purpose of acting autonomously or as if controlled by naturally intelligent design.  In games, they normally refer to automated players (Bots), either opponents or teammates.  They can also refer to simple Scripts, Monsters or other Non-Player Characters (NPCs).  In the Unreal engine, AI can refer to either the designing the behavior of stock AI agents, like bots, or it can refer to custom AI agents such as NPCs.

==AI Basics==

These are some general concepts common to all forms of artificial intelligence.
; Interaction : The AI construct will react to stimuli
; Purpose : The construct will have a purpose of goal to which is was designed to achieve

==Scripts==

[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s and [[Legacy:Trigger Systems|Trigger Systems]] are some means of automating a series of actions.  This is the most basic form of AI although they can also be used to modify the behavior of more sophisticated AI, like bots, in cases where custom behavior is required for a particular map.  For example, see [[Legacy:DefensePoint|DefensePoint]] and [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]].

===Script Support===

This is the current hierarchy for script support on the wiki.
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]] &amp;ndash; Using ScriptedActions with a stand-alone ScriptedTriggerController
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.

==Bots==

Bots are automated player characters; agents that act as if controlled by a human player.  Bots are stock AI characters that will follow designed behavior called [[Legacy:Bot Support|Bot Support]].  Bot support is encorporated into each map's design by the level designer, as each map is different and requires custom behavior for Bots to perform as well as human players.

===Bot Support===

This is the current hierarchy for bot support on the wiki.
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; A hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Pathing Lifts|Pathing Lifts]]
*** [[Legacy:Pathing Kickers|Pathing Kickers]]
*** [[Legacy:Pathing Translocators|Pathing Translocators]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:SnipingVolume|SnipingVolume]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]] &amp;ndash; A tutorial on defense points
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots' motivations
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Techniques to ensure reliable bot support

==NPCs==

Non-Player Characters are any artificially intelligent agent that are not players.

===Monsters===

Monsters are NPCs that act only as an enemy to all players.

====Monster Support====

This is the current hierarchy for monster support on the wiki.
* [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for Unreal monster support
** [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; Coding the behavior of UT monsters and NPCs via this parent class
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial implementing UT ScriptedPawn Monster AI.
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial using UT2004 Monsters
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; An exploration of a custom Monster AI construct
* [[Legacy:AI Scripting|AI Scripting]] ([[Legacy:Unreal 2|Unreal 2]] only)
** [[Legacy:AI Scripting Reference|AI Scripting Reference]]

===Miscellaneous Characters===

NPCs can do more than just attack players.  Custom NPCs can be made to affect the game in a number of different ways.

====NPC Support====

This is the current hierarchy for custom NPC support on the wiki.
* [[Legacy:NPC Support|NPC Support]] &amp;ndash; A hub for creating custom Non-Player Characters in Unreal.
** [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)construction of the NaliCow NPC in UT2004.

==External Links==

===UDN Links===
* [[udn2:AIReferenceDocument]]
* [[udn2:AIControllers]]

===Technical Research and Development Links===
* [http://www.a-i.com/ Ai-Reseach] - A website devoted to the discussion and exploration of Artificial Intelligence.
* [http://www.aaai.org/AITopics/ AI Topics] - A dynamic library of introductory information about Artificial Intelligence.
* [http://www.jair.org/ Journal of Artificial Intelligence Research] - An international electronic and print journal covering all areas of Artificial Intelligence.
* [http://ijcai.org/ International Joint Conference on Artificial Intelligence] - The main international gathering of researchers in AI.
* [http://www-aig.jpl.nasa.gov/ JPL Artificial Intelligence Group] -  The Artificial Intelligence Group performs basic research in the areas of Artificial Intelligence Planning and Scheduling, with applications to science analysis, spacecraft commanding, deep space network operations, and space transportation systems.

===Game Specific Links===
* [http://www.gameai.com/ai.html The Game AI Page] - Dedicated to the topic of Artificial Intelligence in games.

===Miscelaneous===
* [http://www.jabberwacky.com/ jabberwacky] - Just for fun, have a conversation with an AI agent.

==Related Topics==
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
** [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]
** [[Legacy:FPS AI Architecture, Continued|FPS AI Architecture, Continued]]
* [[Legacy:Genetic Programming|Genetic Programming]]
* [[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees and Linked Lists To Represent Group Hierarchy]]
* [[Legacy:Unreal Engine And Game Code Overview|Unreal Engine and Game Code Overview]]
* [[Legacy:Bot|Bot]] and [[Legacy:XBot|xBot]]
* [[Legacy:MonsterController|MonsterController]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Created.  This is meant to be the super topic page for all AI (bots, monsters, custom NPCs, etc.)  Working...

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1224</id>
      <timestamp>2007-11-09T01:18:13Z</timestamp>
      <contributor>
        <ip>C-76-117-131-41.hsd1.pa.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Artificial Intelligence, or AI, refers to any automated mechanism which serves the purpose of acting autonomously or as if controlled by naturally intelligent design.  In games, they normally refer to automated players (Bots), either opponents or teammates.  They can also refer to simple Scripts, Monsters or other Non-Player Characters (NPCs).  In the Unreal engine, AI can refer to either the designing the behavior of stock AI agents, like bots, or it can refer to custom AI agents such as NPCs.

==AI Basics==

These are some general concepts common to all forms of artificial intelligence.
; Interaction : The AI construct will react to stimuli
; Purpose : The construct will have a purpose of goal to which is was designed to achieve

==Scripts==

[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s and [[Legacy:Trigger Systems|Trigger Systems]] are some means of automating a series of actions.  This is the most basic form of AI although they can also be used to modify the behavior of more sophisticated AI, like bots, in cases where custom behavior is required for a particular map.  For example, see [[Legacy:DefensePoint|DefensePoint]] and [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]].

===Script Support===

This is the current hierarchy for script support on the wiki.
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]] &amp;ndash; Using ScriptedActions with a stand-alone ScriptedTriggerController
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.

==Bots==

Bots are automated player characters; agents that act as if controlled by a human player.  Bots are stock AI characters that will follow designed behavior called [[Legacy:Bot Support|Bot Support]].  Bot support is encorporated into each map's design by the level designer, as each map is different and requires custom behavior for Bots to perform as well as human players.

===Bot Support===

This is the current hierarchy for bot support on the wiki.
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; A hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Pathing Lifts|Pathing Lifts]]
*** [[Legacy:Pathing Kickers|Pathing Kickers]]
*** [[Legacy:Pathing Translocators|Pathing Translocators]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:SnipingVolume|SnipingVolume]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]] &amp;ndash; A tutorial on defense points
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots' motivations
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Techniques to ensure reliable bot support

==NPCs==

Non-Player Characters are any artificially intelligent agent that are not players.

===Monsters===

Monsters are NPCs that act only as an enemy to all players.

====Monster Support====

This is the current hierarchy for monster support on the wiki.
* [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for Unreal monster support
** [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; Coding the behavior of UT monsters and NPCs via this parent class
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial implementing UT ScriptedPawn Monster AI.
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial using UT2004 Monsters
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; An exploration of a custom Monster AI construct
* [[Legacy:AI Scripting|AI Scripting]] ([[Legacy:Unreal 2|Unreal 2]] only)
** [[Legacy:AI Scripting Reference|AI Scripting Reference]]

===Miscellaneous Characters===

NPCs can do more than just attack players.  Custom NPCs can be made to affect the game in a number of different ways.

====NPC Support====

This is the current hierarchy for custom NPC support on the wiki.
* [[Legacy:NPC Support|NPC Support]] &amp;ndash; A hub for creating custom Non-Player Characters in Unreal.
** [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)construction of the NaliCow NPC in UT2004.

==External Links==

===UDN Links===
* [[udn2:AIReferenceDocument]]
* [[udn2:AIControllers]]

===Technical Research and Development Links===
* [http://www.a-i.com/ Ai-Reseach] - A website devoted to the discussion and exploration of Artificial Intelligence.
* [http://www.aaai.org/AITopics/ AI Topics] - A dynamic library of introductory information about Artificial Intelligence.
* [http://www.jair.org/ Journal of Artificial Intelligence Research] - An international electronic and print journal covering all areas of Artificial Intelligence.
* [http://ijcai.org/ International Joint Conference on Artificial Intelligence] - The main international gathering of researchers in AI.
* [http://www-aig.jpl.nasa.gov/ JPL Artificial Intelligence Group] -  The Artificial Intelligence Group performs basic research in the areas of Artificial Intelligence Planning and Scheduling, with applications to science analysis, spacecraft commanding, deep space network operations, and space transportation systems.

===Game Specific Links===
* [http://www.gameai.com/ai.html The Game AI Page] - Dedicated to the topic of Artificial Intelligence in games.

===Miscelaneous===
* [http://www.jabberwacky.com/ jabberwacky] - Just for fun, have a conversation with an AI agent.

==Related Topics==
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
** [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]
** [[Legacy:FPS AI Architecture, Continued|FPS AI Architecture, Continued]]
* [[Legacy:Genetic Programming|Genetic Programming]]
* [[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees and Linked Lists To Represent Group Hierarchy]]
* [[Legacy:Unreal Engine And Game Code Overview|Unreal Engine and Game Code Overview]]
* [[Legacy:Bot|Bot]] and [[Legacy:XBot|xBot]]
* [[Legacy:MonsterController|MonsterController]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Created.  This is meant to be the super topic page for all AI (bots, monsters, custom NPCs, etc.)  Working...

Vaptor: i noticed that the Standard bot ai and monster ai is Laggy and is able to crash the game in ut2004

 I Fixed up the monster code for a friends invasion server and found by simply limiting it to not look for

enemys when its hunting someone.

I noticed it kept dumping the info about the target between states, only reason it didn't stop is it 

Executed another target scan loop.

epic used same sorta twisted logic in their bots which has me wondering if it got worse in ut3.

again 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1225</id>
      <timestamp>2007-11-09T13:49:10Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <text xml:space="preserve">Artificial Intelligence, or AI, refers to any automated mechanism which serves the purpose of acting autonomously or as if controlled by naturally intelligent design.  In games, they normally refer to automated players (Bots), either opponents or teammates.  They can also refer to simple Scripts, Monsters or other Non-Player Characters (NPCs).  In the Unreal engine, AI can refer to either the designing the behavior of stock AI agents, like bots, or it can refer to custom AI agents such as NPCs.

==AI Basics==

These are some general concepts common to all forms of artificial intelligence.
; Interaction : The AI construct will react to stimuli
; Purpose : The construct will have a purpose of goal to which is was designed to achieve

==Scripts==

[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s and [[Legacy:Trigger Systems|Trigger Systems]] are some means of automating a series of actions.  This is the most basic form of AI although they can also be used to modify the behavior of more sophisticated AI, like bots, in cases where custom behavior is required for a particular map.  For example, see [[Legacy:DefensePoint|DefensePoint]] and [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]].

===Script Support===

This is the current hierarchy for script support on the wiki.
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]] &amp;ndash; Using ScriptedActions with a stand-alone ScriptedTriggerController
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.

==Bots==

Bots are automated player characters; agents that act as if controlled by a human player.  Bots are stock AI characters that will follow designed behavior called [[Legacy:Bot Support|Bot Support]].  Bot support is encorporated into each map's design by the level designer, as each map is different and requires custom behavior for Bots to perform as well as human players.

===Bot Support===

This is the current hierarchy for bot support on the wiki.
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; A hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Pathing Lifts|Pathing Lifts]]
*** [[Legacy:Pathing Kickers|Pathing Kickers]]
*** [[Legacy:Pathing Translocators|Pathing Translocators]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:SnipingVolume|SnipingVolume]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]] &amp;ndash; A tutorial on defense points
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots' motivations
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Techniques to ensure reliable bot support

==NPCs==

Non-Player Characters are any artificially intelligent agent that are not players.

===Monsters===

Monsters are NPCs that act only as an enemy to all players.

====Monster Support====

This is the current hierarchy for monster support on the wiki.
* [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for Unreal monster support
** [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; Coding the behavior of UT monsters and NPCs via this parent class
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial implementing UT ScriptedPawn Monster AI.
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial using UT2004 Monsters
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; An exploration of a custom Monster AI construct
* [[Legacy:AI Scripting|AI Scripting]] ([[Legacy:Unreal 2|Unreal 2]] only)
** [[Legacy:AI Scripting Reference|AI Scripting Reference]]

===Miscellaneous Characters===

NPCs can do more than just attack players.  Custom NPCs can be made to affect the game in a number of different ways.

====NPC Support====

This is the current hierarchy for custom NPC support on the wiki.
* [[Legacy:NPC Support|NPC Support]] &amp;ndash; A hub for creating custom Non-Player Characters in Unreal.
** [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)construction of the NaliCow NPC in UT2004.

==External Links==

===UDN Links===
* [[udn2:AIReferenceDocument]]
* [[udn2:AIControllers]]

===Technical Research and Development Links===
* [http://www.a-i.com/ Ai-Reseach] - A website devoted to the discussion and exploration of Artificial Intelligence.
* [http://www.aaai.org/AITopics/ AI Topics] - A dynamic library of introductory information about Artificial Intelligence.
* [http://www.jair.org/ Journal of Artificial Intelligence Research] - An international electronic and print journal covering all areas of Artificial Intelligence.
* [http://ijcai.org/ International Joint Conference on Artificial Intelligence] - The main international gathering of researchers in AI.
* [http://www-aig.jpl.nasa.gov/ JPL Artificial Intelligence Group] -  The Artificial Intelligence Group performs basic research in the areas of Artificial Intelligence Planning and Scheduling, with applications to science analysis, spacecraft commanding, deep space network operations, and space transportation systems.

===Game Specific Links===
* [http://www.gameai.com/ai.html The Game AI Page] - Dedicated to the topic of Artificial Intelligence in games.

===Miscelaneous===
* [http://www.jabberwacky.com/ jabberwacky] - Just for fun, have a conversation with an AI agent.

==Related Topics==
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
** [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]
** [[Legacy:FPS AI Architecture, Continued|FPS AI Architecture, Continued]]
* [[Legacy:Genetic Programming|Genetic Programming]]
* [[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees and Linked Lists To Represent Group Hierarchy]]
* [[Legacy:Unreal Engine And Game Code Overview|Unreal Engine and Game Code Overview]]
* [[Legacy:Bot|Bot]] and [[Legacy:XBot|xBot]]
* [[Legacy:MonsterController|MonsterController]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Created.  This is meant to be the super topic page for all AI (bots, monsters, custom NPCs, etc.)  Working...

'''Vaptor:''' i noticed that the Standard bot ai and monster ai is Laggy and is able to crash the game in ut2004.  I Fixed up the monster code for a friends invasion server and found by simply limiting it to not look for enemys when its hunting someone. I noticed it kept dumping the info about the target between states, only reason it didn't stop is it executed another target scan loop.  Epic used same sorta twisted logic in their bots which has me wondering if it got worse in ut3 again.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44232</id>
      <timestamp>2011-01-08T12:56:20Z</timestamp>
      <contributor>
        <username>Shadow knight</username>
        <id>1953</id>
      </contributor>
      <comment>/* Miscelaneous */</comment>
      <text xml:space="preserve">Artificial Intelligence, or AI, refers to any automated mechanism which serves the purpose of acting autonomously or as if controlled by naturally intelligent design.  In games, they normally refer to automated players (Bots), either opponents or teammates.  They can also refer to simple Scripts, Monsters or other Non-Player Characters (NPCs).  In the Unreal engine, AI can refer to either the designing the behavior of stock AI agents, like bots, or it can refer to custom AI agents such as NPCs.

==AI Basics==

These are some general concepts common to all forms of artificial intelligence.
; Interaction : The AI construct will react to stimuli
; Purpose : The construct will have a purpose of goal to which is was designed to achieve

==Scripts==

[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s and [[Legacy:Trigger Systems|Trigger Systems]] are some means of automating a series of actions.  This is the most basic form of AI although they can also be used to modify the behavior of more sophisticated AI, like bots, in cases where custom behavior is required for a particular map.  For example, see [[Legacy:DefensePoint|DefensePoint]] and [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]].

===Script Support===

This is the current hierarchy for script support on the wiki.
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
*** [[Legacy:ScriptedTrigger|ScriptedTrigger]] &amp;ndash; Using ScriptedActions with a stand-alone ScriptedTriggerController
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.

==Bots==

Bots are automated player characters; agents that act as if controlled by a human player.  Bots are stock AI characters that will follow designed behavior called [[Legacy:Bot Support|Bot Support]].  Bot support is encorporated into each map's design by the level designer, as each map is different and requires custom behavior for Bots to perform as well as human players.

===Bot Support===

This is the current hierarchy for bot support on the wiki.
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; A hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Pathing Lifts|Pathing Lifts]]
*** [[Legacy:Pathing Kickers|Pathing Kickers]]
*** [[Legacy:Pathing Translocators|Pathing Translocators]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:SnipingVolume|SnipingVolume]]
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]] &amp;ndash; A tutorial on defense points
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots' motivations
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Techniques to ensure reliable bot support

==NPCs==

Non-Player Characters are any artificially intelligent agent that are not players.

===Monsters===

Monsters are NPCs that act only as an enemy to all players.

====Monster Support====

This is the current hierarchy for monster support on the wiki.
* [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for Unreal monster support
** [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; Coding the behavior of UT monsters and NPCs via this parent class
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial implementing UT ScriptedPawn Monster AI.
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial using UT2004 Monsters
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; An exploration of a custom Monster AI construct
* [[Legacy:AI Scripting|AI Scripting]] ([[Legacy:Unreal 2|Unreal 2]] only)
** [[Legacy:AI Scripting Reference|AI Scripting Reference]]

===Miscellaneous Characters===

NPCs can do more than just attack players.  Custom NPCs can be made to affect the game in a number of different ways.

====NPC Support====

This is the current hierarchy for custom NPC support on the wiki.
* [[Legacy:NPC Support|NPC Support]] &amp;ndash; A hub for creating custom Non-Player Characters in Unreal.
** [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)construction of the NaliCow NPC in UT2004.

==External Links==

===UDN Links===
* [[udn2:AIReferenceDocument]]
* [[udn2:AIControllers]]

===Technical Research and Development Links===
* [http://www.a-i.com/ Ai-Reseach] - A website devoted to the discussion and exploration of Artificial Intelligence.
* [http://www.aaai.org/AITopics/ AI Topics] - A dynamic library of introductory information about Artificial Intelligence.
* [http://www.jair.org/ Journal of Artificial Intelligence Research] - An international electronic and print journal covering all areas of Artificial Intelligence.
* [http://ijcai.org/ International Joint Conference on Artificial Intelligence] - The main international gathering of researchers in AI.
* [http://www-aig.jpl.nasa.gov/ JPL Artificial Intelligence Group] -  The Artificial Intelligence Group performs basic research in the areas of Artificial Intelligence Planning and Scheduling, with applications to science analysis, spacecraft commanding, deep space network operations, and space transportation systems.

===Game Specific Links===
* [http://www.gameai.com/ai.html The Game AI Page] - Dedicated to the topic of Artificial Intelligence in games.

===Miscelaneous===
* [http://pogamut.cuni.cz/ Pogamut] - a free middleware for creating UT bots AI in Java (for UDK, UT2004 and UE2)
* [http://www.jabberwacky.com/ jabberwacky] - Just for fun, have a conversation with an AI agent.

==Related Topics==
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
** [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]
** [[Legacy:FPS AI Architecture, Continued|FPS AI Architecture, Continued]]
* [[Legacy:Genetic Programming|Genetic Programming]]
* [[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees and Linked Lists To Represent Group Hierarchy]]
* [[Legacy:Unreal Engine And Game Code Overview|Unreal Engine and Game Code Overview]]
* [[Legacy:Bot|Bot]] and [[Legacy:XBot|xBot]]
* [[Legacy:MonsterController|MonsterController]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Created.  This is meant to be the super topic page for all AI (bots, monsters, custom NPCs, etc.)  Working...

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Artillery Tower</title>
    <id>514</id>
    <revision>
      <id>1611</id>
      <timestamp>2007-06-19T23:30:39Z</timestamp>
      <contributor>
        <ip>Marduk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off [the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a room in the tower will open and a large bomb will appear in the ammo room of the other team, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

ammo is distributed from a console in the ammo room, the player walks up to the console and a screen opens up asking what ammo the person wants, the player selects it and then has to wait for the ammo to be created, this varies from ammo to ammo, some taking less than a second, others taking much longer.some ideas for ammo I have:

[acid ammo, that burns the tower when it hits it for a while

[interceptor ammo, little rockets that try to hit enemy ammo when they are shot out of the mortar

[napalm bomb, when it hits it sprays unlit napalm all over the place, which then ignites soon after

[bombshell, basic ammo that makes a small explosion when it hits

[scatter bomb, when it's hit by enemy fire it splits into smaller shells that do moderate damage

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)</text>
    </revision>
    <revision>
      <id>1612</id>
      <timestamp>2007-06-19T19:53:17Z</timestamp>
      <contributor>
        <ip>Marduk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a large bomb will appear in the ammo room, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AsbestosSuit</title>
    <id>421</id>
    <revision>
      <id>1422</id>
      <timestamp>2003-05-09T19:15:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Suits|Suits]] &gt;&gt; AsbestosSuit (Package: UnrealI)}}

When picked up you can't take damage of the types 'Burned' or 'Frozen'.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1423</id>
      <timestamp>2003-05-09T14:15:31Z</timestamp>
      <contributor>
        <ip>Ben 2500</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When picked up lets you go into the green slime with out being hurt.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault</title>
    <id>372</id>
    <revision>
      <id>1265</id>
      <timestamp>2004-09-02T20:03:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; [[Legacy:TeamGamePlus|TeamGamePlus]] &gt;&gt; Assault (Package: BotPack)}}

Unreal Tournament's Assault game type. One team assaults a base guarded by the other team and has to fulfill a given number of tasks within limited time; the other team has to prevent that. After a round has ended (because the assaulting team has completed its mission or the time ran out), assaulters and defenders switch positions.

Assault games consist of two matches. The way Assault manages to remember which half it's in, despite completely reloading the map (and hence all the variables in the [[Legacy:GameInfo (UT)|GameInfo (UT)]] or anywhere else in the map for that matter) is to save the variables to UnrealTournament.ini. These variables are loaded when the second match of the Assault game starts.

This gametype's class is called [[Legacy:ASGameInfo|ASGameInfo]] in UT2004.

== Properties ===

===Config Properties ===
; int Defenses : 
; float SavedTime : The time the first team needed to win the match.
; int NumDefenses : 
; int CurrentDefender : The defending team's ID. (1 or 2)
; bool bDefenseSet : 
; bool bTiePartOne : 
; string GameCode : A unique string used by stats logging to keep track of which games belong together.
; int Part : The current part of the Assault game. 1 for the first match, 2 for the rematch.

===Localized Properties ===
; string AttackMessage : 
; string DefendMessage : 
; string TieMessage : 
; string WinMessage : 
; string ObjectivesMessage : 
; string DefenderSuccess : 

===Other Properties ===
; [[Legacy:TeamInfo (UT)|TeamInfo (UT)]] Defender, Attacker : TeamInfos of attacking and defening team.
; [[Legacy:FortStandard|FortStandard]] Fort[16], BestFort : 
; int Destroyer : 
; int numForts : 
; float LastIncoming : 
; [[Legacy:SpectatorCam|SpectatorCam]] EndCam : 
; bool bAssaultWon : 
; bool bFortDown : 
; [[Legacy:Pawn (UT)|Pawn (UT)]] Leader[4] : Current leader of each team. (used by [[Legacy:Bot (UT)|Bot (UT)]]s)

==Methods ==
; FallBackTo (name F, int Priority) : 
; RemoveFort ([[Legacy:FortStandard|FortStandard]] F, [[Legacy:Pawn (UT)|Pawn (UT)]] Instigator) : 
; bool BestFortFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:FortStandard|FortStandard]] oldFort, [[Legacy:FortStandard|FortStandard]] currentFort) : 
; [[Legacy:FortStandard|FortStandard]] AttackFort ([[Legacy:Bot (UT)|Bot (UT)]] aBot, out byte bMultiSame) : 
; bool FindPathToFortFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:Actor|Actor]] Dest) : 
; bool SendBotToGoal ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : 
; bool AttackOnlyLocalFort ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : 
; bool WaitForPoint ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : Returns true when leader has died/respawned, and bots should wait for him to show back up before advancing instead of falling back to the start point.
; ElectNewLeaderFor ([[Legacy:Bot (UT)|Bot (UT)]] OldLeader) : 
; bool HandleTieUp ([[Legacy:Bot (UT)|Bot (UT)]] Bumper, [[Legacy:Bot (UT)|Bot (UT)]] Bumpee) : 
; bool NeverStakeOut ([[Legacy:Bot (UT)|Bot (UT)]] Other) : 

==Related Topics ==
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1266</id>
      <timestamp>2004-01-10T17:28:56Z</timestamp>
      <contributor>
        <ip>Smattbac</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; [[Legacy:TeamGamePlus|TeamGamePlus]] &gt;&gt; Assault (Package: BotPack)}}

Unreal Tournament's Assault game type. One team assaults a base guarded by the other team and has to fulfill a given number of tasks within limited time; the other team has to prevent that. After a round has ended (because the assaulting team has completed its mission or the time ran out), assaulters and defenders switch positions.

Assault games consist of two matches. The way Assault manages to remember which half it's in, despite completely reloading the map (and hence all the variables in the [[Legacy:GameInfo (UT)|GameInfo (UT)]] or anywhere else in the map for that matter) is to save the variables to UnrealTournament.ini. These variables are loaded when the second match of the Assault game starts.

== Properties ===

===Config Properties ===
; int Defenses : 
; float SavedTime : The time the first team needed to win the match.
; int NumDefenses : 
; int CurrentDefender : The defending team's ID. (1 or 2)
; bool bDefenseSet : 
; bool bTiePartOne : 
; string GameCode : A unique string used by stats logging to keep track of which games belong together.
; int Part : The current part of the Assault game. 1 for the first match, 2 for the rematch.

===Localized Properties ===
; string AttackMessage : 
; string DefendMessage : 
; string TieMessage : 
; string WinMessage : 
; string ObjectivesMessage : 
; string DefenderSuccess : 

===Other Properties ===
; [[Legacy:TeamInfo (UT)|TeamInfo (UT)]] Defender, Attacker : TeamInfos of attacking and defening team.
; [[Legacy:FortStandard|FortStandard]] Fort[16], BestFort : 
; int Destroyer : 
; int numForts : 
; float LastIncoming : 
; [[Legacy:SpectatorCam|SpectatorCam]] EndCam : 
; bool bAssaultWon : 
; bool bFortDown : 
; [[Legacy:Pawn (UT)|Pawn (UT)]] Leader[4] : Current leader of each team. (used by [[Legacy:Bot (UT)|Bot (UT)]]s)

==Methods ==
; FallBackTo (name F, int Priority) : 
; RemoveFort ([[Legacy:FortStandard|FortStandard]] F, [[Legacy:Pawn (UT)|Pawn (UT)]] Instigator) : 
; bool BestFortFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:FortStandard|FortStandard]] oldFort, [[Legacy:FortStandard|FortStandard]] currentFort) : 
; [[Legacy:FortStandard|FortStandard]] AttackFort ([[Legacy:Bot (UT)|Bot (UT)]] aBot, out byte bMultiSame) : 
; bool FindPathToFortFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:Actor|Actor]] Dest) : 
; bool SendBotToGoal ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : 
; bool AttackOnlyLocalFort ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : 
; bool WaitForPoint ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : Returns true when leader has died/respawned, and bots should wait for him to show back up before advancing instead of falling back to the start point.
; ElectNewLeaderFor ([[Legacy:Bot (UT)|Bot (UT)]] OldLeader) : 
; bool HandleTieUp ([[Legacy:Bot (UT)|Bot (UT)]] Bumper, [[Legacy:Bot (UT)|Bot (UT)]] Bumpee) : 
; bool NeverStakeOut ([[Legacy:Bot (UT)|Bot (UT)]] Other) : 

==Related Topics ==
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial</title>
    <id>482</id>
    <revision>
      <id>1545</id>
      <timestamp>2007-08-13T14:23:57Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Introduction==

This tutorial is intended to cover everything one needs to know to successfully build a map (and a good map) for the Assault gametype in [[Legacy:UT2004|UT2004]].  It does, however, assume you have a fair amount of prior knowledge about map building in general and how to do most basic map-building tasks.  If you're just starting out you may want to read some of the other [[Legacy:Mapping Lessons|more basic tutorials]] on map building before tackling this one.

In the interest of brevity, this tutorial makes heavy use of links to smaller mini-tutorial pages for basic tasks, (such as how to [[Legacy:Add An Actor|Add an Actor]], and so on).  If you find that despite being familiar with most of the basics there is still a procedure mentioned here which you don't know how to do, simply click on the link to be taken to a page with more detailed information on how to accomplish that sort of task.

==The Tutorial==

With all that having been said, let's get on to the good stuff.  This tutorial is organized in a series of sections which cover different aspects of building an Assault map, starting at the beginning and leading naturally from one to the next.  It is strongly recommended that you read this tutorial through from beginning to end at least once.  The sections are as follows:

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Getting Started]]: Understanding what it means to make an Assault map, and planning and building the basic map from which all else follows.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]: How to build a first objective, and then how to blow it up.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]: The basics of handling spawn points for Assault maps.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]: Bot pathing and other things you need to know about how objectives affect gameplay.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]: Creating a second type of objective, handling map progression, and what to do when it's all over.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]: Some ins and outs of other types of objectives you can add to your map.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Vehicles And Turrets]]: Vehicle spawns, defending camps, and related issues.

===Finishing and Polishing your map.===
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WrapUp]]:  A few last notes and thoughts now that you're a real Assault mapper.

==Other Resources==

===Tutorial Map Files===
;http://www.foogod.com/AS-Tutorial/AS-Tutorial1.zip: The basic map of &quot;Tutorial Valley&quot;, on which this tutorial is based.
;http://www.foogod.com/AS-Tutorial/AS-Tutorial2.zip: Tutorial Valley with a first objective (including everything up through &quot;Attacking and Defending&quot;)
;http://www.foogod.com/AS-Tutorial/AS-Tutorial3.zip: AS-Tutorial3 with the insides of the base built (as described in the beginning of &quot;Continuing the Assault&quot;)
;http://www.foogod.com/AS-Tutorial/AS-Tutorial4.zip: Tutorial Valley with a second objective, progressing spawns, and round ending (including everything up through the end of &quot;Continuing the Assault&quot;)

===Related Wiki Topics===
;[[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]: Various miscellaneous tips and notes from MarZer (and possibly others) about effective Assault mapping in UT2004.
;[[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]: Some information on mapping for the older style of Assault in the original Unreal Tournament game.

==Notes==

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

==Related Topics==
* [[Legacy:Beginners Guide To Mapping|Beginners Guide To Mapping]]
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your maps
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Assault|Assault]]
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
* [[Legacy:FortStandard|FortStandard]]

==Discussion==

''Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.''

'''Anon:''' Pleeeaaasseee add the last parts to the tutorials... like now :P:) please, thanks. The tutorial was already very good and helped me alot , so now i'm desperate for the final lessons.

'''Blip2:''' I've been thinking of finishing this (if Foogod isn't arround anymore), maybe have a few drafts up tonight

'''King Mango:''' Excellent work.

'''SuperApe:''' Yeah, this looks great.

----

[[:Category:Legacy Tutorial]] | [[:Category:Legacy Mapping]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1546</id>
      <timestamp>2007-08-13T13:32:31Z</timestamp>
      <contributor>
        <ip>H-184-24.A189.cust.bahnhof.se</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

This tutorial is intended to cover everything one needs to know to successfully build a map (and a good map) for the Assault gametype in [[Legacy:UT2004|UT2004]].  It does, however, assume you have a fair amount of prior knowledge about map building in general and how to do most basic map-building tasks.  If you're just starting out you may want to read some of the other [[Legacy:Mapping Lessons|more basic tutorials]] on map building before tackling this one.

[http://www.brandsearch.org/Internet/Directory web directory]

In the interest of brevity, this tutorial makes heavy use of links to smaller mini-tutorial pages for basic tasks, (such as how to [[Legacy:Add An Actor|Add an Actor]], and so on).  If you find that despite being familiar with most of the basics there is still a procedure mentioned here which you don't know how to do, simply click on the link to be taken to a page with more detailed information on how to accomplish that sort of task.

==The Tutorial==

With all that having been said, let's get on to the good stuff.  This tutorial is organized in a series of sections which cover different aspects of building an Assault map, starting at the beginning and leading naturally from one to the next.  It is strongly recommended that you read this tutorial through from beginning to end at least once.  The sections are as follows:

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Getting Started]]: Understanding what it means to make an Assault map, and planning and building the basic map from which all else follows.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]: How to build a first objective, and then how to blow it up.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]: The basics of handling spawn points for Assault maps.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]: Bot pathing and other things you need to know about how objectives affect gameplay.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]: Creating a second type of objective, handling map progression, and what to do when it's all over.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]: Some ins and outs of other types of objectives you can add to your map.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Vehicles And Turrets]]: Vehicle spawns, defending camps, and related issues.

===Finishing and Polishing your map.===
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WrapUp]]:  A few last notes and thoughts now that you're a real Assault mapper.

==Other Resources==

===Tutorial Map Files===
;http://www.foogod.com/AS-Tutorial/AS-Tutorial1.zip: The basic map of &quot;Tutorial Valley&quot;, on which this tutorial is based.
;http://www.foogod.com/AS-Tutorial/AS-Tutorial2.zip: Tutorial Valley with a first objective (including everything up through &quot;Attacking and Defending&quot;)
;http://www.foogod.com/AS-Tutorial/AS-Tutorial3.zip: AS-Tutorial3 with the insides of the base built (as described in the beginning of &quot;Continuing the Assault&quot;)
;http://www.foogod.com/AS-Tutorial/AS-Tutorial4.zip: Tutorial Valley with a second objective, progressing spawns, and round ending (including everything up through the end of &quot;Continuing the Assault&quot;)

===Related Wiki Topics===
;[[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]: Various miscellaneous tips and notes from MarZer (and possibly others) about effective Assault mapping in UT2004.
;[[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]: Some information on mapping for the older style of Assault in the original Unreal Tournament game.

==Notes==

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

==Related Topics==
* [[Legacy:Beginners Guide To Mapping|Beginners Guide To Mapping]]
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your maps
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Assault|Assault]]
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
* [[Legacy:FortStandard|FortStandard]]

==Discussion==

''Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.''

'''Anon:''' Pleeeaaasseee add the last parts to the tutorials... like now :P:) please, thanks. The tutorial was already very good and helped me alot , so now i'm desperate for the final lessons.

'''Blip2:''' I've been thinking of finishing this (if Foogod isn't arround anymore), maybe have a few drafts up tonight

'''King Mango:''' Excellent work.

'''SuperApe:''' Yeah, this looks great.

----

[[:Category:Legacy Tutorial]] | [[:Category:Legacy Mapping]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Adding Vehicles And Turrets</title>
    <id>491</id>
    <revision>
      <id>1562</id>
      <timestamp>2007-01-31T12:11:00Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In assault vehicles can be used in more ways that any other gametype and can seriously affect gameplay so you should be careful when placing vehicles see [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] for more information on where and why to place vehicles.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WrapUp]]'''

==Setting Up a vehicle==

When placing an ONS vehicle (the standard ones) in an AS map there are no specific factories for each of the vehicles they must be set in a property of an ASVehicleFactory. Unless you set it up in the display options there will only be an actor in the UEd [[Legacy:Viewport|viewport]] until the vehicle spawns inside the actual game.

Vehicles designed only for assault though (the turrets) have individual factories, this will be discussed further on.

===Placing the actor===

Go into the actor browser and in Actor&gt;&gt;SVehicle there will be ASVehicleFactory take this and put one into your map (use the root level of this to add a standard vehicle)

It will appear as a car icon and when the paths are rebuilt a navigation point will appear under it

===Setting which Vehicle you want===

To set which vehicle to use go to the SVehicleFactory sub-menu and select in the vehicleclass list. See [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] for the names that you should use.

===Properties that you might want to change===

Open the properties of the ASVehicleFactory and browse the the ASVehicleFactory sub-menu there are a list of options all unique to the assault gametype:
; bEnterteamunlocks : If the vehicle is locked (when bVehicleTeamLock is set to true) the vehicle will unlock if a player gets in and out of the vehicle and this is set to true
; bVehicleTeamLock : When the vehicle spawns and this is set to true only the team specified in VehicleTeam will be able to enter it
; bRespawnwhenDestroyed : When set to true the vehicle will respawn when it is destroyed after the time specified in the RespawnDelay field
; bSpawnProtected : If set to true the vehicle cannot be damaged before a player enters it
; VehicleHealth : You can specify the health of the vehicle here if you don't want it at the default specified in coding (setting it to 0 will be default)
; VehicleTeam : Sets the initial team of the vehicle (see bEnterteamunlocks) 0 = Attackers, 1 = Defenders

That's about it for setting up a basic vehicle, there is a list of other properties and what they do further down

==Setting up a Sentinel or Turret==

To place a sentinel or turret expand the ASVehicleFactory branch and place one of the following:
* ASVehicleFactory_IonCannon - Massive Ion Cannon (as in RobotFactory)
* ASVehicleFactory_MinigunTurret - (As in Convoy)
* ASVehicleFactory_SentinelCeiling - You cannot get into these and are generally used as spawn protection or objectives to destroy
* ASVehicleFactory_SentinelFloor - As above but you place them of the floor
* ASVehicleFactory_Turret - Turrets as in the ones on Mothership
* ASVehicleFactory_LinkTurret - Link Turrets - can heal other vehicles but also destroy them very quickly

Once place they can be setup as in the vehicles section but there are a few more properties to take into account for turrets

; AIVisiblity : This is how far the turret (and bots in it) can 'see' - If it is a sentinel, link turret or a mothership turret it will automatically shoot at anyone in the other team within that range (the others will not) setting it to 0 will mean that it will not automatically shoot at anyone. In other turrets it will limit how far the bot can 'see' and fire at targets.

===Making bots use turrets===

Bots will not use the control panels (below) and therefore will never use the Mothership Turrets (ASVehicleFactory_Turret) and Link Turrets (ASVehicleFactory_LinkTurret). You therefore need to set the AIVisiblity (see above) if you want the turrets to fire in bot matches.

Bots will manually get into both the ion cannon and minigun turrets if both of the following apply:
* There is a path to the turret and space to get in (applies mostly to ion cannon as you can only get in at the ladder)
* The current objectives tag is listed under ASVehicleFactory_IonCannon/MinigunTurret (maximum of 6 objectives - cannot be increased without recoding)

===Making the turret 'remote controlled'===

If you want the turret to be controlled through a wall panel (as in mothership) you have to do the following:

* Place a Triggers&gt;&gt;SVehicleTrigger&gt;&gt;Trigger_ASUseandPossess&gt;&gt;Trigger_ASTurretControlPanel

Set the following properties in the Trigger_ASTurretControlPanel:
; Trigger_ASUseandPossess&gt;&gt;AssaultTeam : Only the team (or all) will be able to use this panel
; Trigger_ASUseandPossess&gt;&gt;PawnTag : This must be the same as the ASVehicleFactory&gt;&gt;VehicleTag of the turret

* Make sure that in addition to setting the Trigger_ASUseandPossess&gt;&gt;AssaultTeam that you set the team correctly on the turret itself (see above (bVehicleTeamLock etc.) as you either may not be able to get into the turret using the panel.
* You can also get into both the link turrets and Mothership turrets manually (if the bVehicleTeamLock etc... (see above) is set correctly) by standing on top of the turret and pressing your 'use' key
* You can only remote control the mothership turrets and link turrets the others will not work!

==Making the Vehicle Spawn or 'Unspawn' when triggered==

This applies to both sentinels, turrets and vehicles.

* bEnabled states if the vehicle will spawn at the beginning of the game. If not true it will only spawn when triggered and depending on the TriggeredFunction may change during the game.
* TriggeredFunction can be set in one of the following states
** EVASF_ToggleEnabled - When the factory is triggered it will switch between being enabled and disabled (depending on what bEnabled starts at)
** EVASF_TriggeredSpawn - When the factory is triggered it will switch between being enabled and disabled (depending on what bEnabled starts at) BUT WILL DESTROY THE VEHICLE WHEN DISABLED!!!

===Force Destroy===

When a factory is triggered from enabled to disabled it will not destroy the vehicle but only stop it from respawning when it is next destroyed. This means that if you want to force a vehicle to destroy you must do the following. In the PlayerSpawnManager used previously in the tutorial there is a field called DisabledVehicleFactoriesTag adding a field here and entering the Events&gt;&gt;Tag of any VehicleFactory, when the PlayerSpawnManager is disabled the vehicle will not only vanish (no explosions) but the factory will set bEnabled to false. Which is essential when using sentinel for spawn areas that are used by both teams.

==Extra Properties==

These might be useful when doing more complex things with vehicles

; AIVisibility : only used for turrets (see below)
; Announcement_Destroyed : Put the name of a sound file in here and when the vehicle is destroyed everyone will here it
; bHighScoreKill : When set to true this will earn the person who destroys the vehicle a trophy and some points
; bHUDTrackVehicle : When set to true the vehicle will have a visible icon on the HUD showing health and position (It is only posible to have one vehicle (that is spawned) at a time with this, if you have more than one it will rotate as the vehicle with it dies)
; bKeyVehicle : When set to true the vehicle will have a health bar above it for all players
; bSpawnBuildEffect : When the vehicle is about to spawn or respawn you will get the nice red or blue rings and a warning if you are in the way (the time of the warning can be set in MaxSpawnBlockCount (in seconds))
; VehicleEvent : This is triggered when the vehicle is destroyed
; VehicleLinkHealMult : How much the link gun heals the vehicle, 0 = link gun won't heal it, 1 = link gun will heal vehicles very quickly

The few that I have left out need only be changed in very strange circumstances...

If you need help please email blip2@dogmatix.net or comment below - I check fairly regularly.

==Discussion==

'''SuperApe:''' This is an excellent series of tutorials.  Well done.

'''Blip2:''' meh I only did this page

'''FreshMeat:''' Followed these directions exactly, my remote control turret doesn't work. You can't get in, though it will shoot automatically. When the turret is killed, the correct panel explodes like it would if the thing were remote control. Any tips?

'''Herr General:'''I can't help you with that, even though it works in my map

'''Blip2:''' Freshmeat: see above - I've added a bit

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1563</id>
      <timestamp>2006-10-12T02:04:39Z</timestamp>
      <contributor>
        <ip>H69.214.40.69.ip.alltel.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In assault vehicles can be used in more ways that any other gametype and can seriously affect gameplay so you should be careful when placing vehicles see [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] for more information on where and why to place vehicles.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WrapUp]]'''

==Setting Up a vehicle==

When placing an ONS vehicle (the standard ones) in an AS map there are no specific factories for each of the vehicles they must be set in a property of an ASVehicleFactory. Unless you set it up in the display options there will only be an actor in the UEd [[Legacy:Viewport|viewport]] until the vehicle spawns inside the actual game.

Vehicles designed only for assault though (the turrets) have individual factories, this will be discussed further on.

===Placing the actor===

Go into the actor browser and in Actor&gt;&gt;SVehicle there will be ASVehicleFactory take this and put one into your map (use the root level of this to add a standard vehicle)

It will appear as a car icon and when the paths are rebuilt a navigation point will appear under it

===Setting which Vehicle you want===

To set which vehicle to use go to the SVehicleFactory sub-menu and select in the vehicleclass list. See [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] for the names that you should use.

===Properties that you might want to change===

Open the properties of the ASVehicleFactory and browse the the ASVehicleFactory sub-menu there are a list of options all unique to the assault gametype:
; bEnterteamunlocks : If the vehicle is locked (when bVehicleTeamLock is set to true) the vehicle will unlock if a player gets in and out of the vehicle and this is set to true
; bVehicleTeamLock : When the vehicle spawns and this is set to true only the team specified in VehicleTeam will be able to enter it
; bRespawnwhenDestroyed : When set to true the vehicle will respawn when it is destroyed after the time specified in the RespawnDelay field
; bSpawnProtected : If set to true the vehicle cannot be damaged before a player enters it
; VehicleHealth : You can specify the health of the vehicle here if you don't want it at the default specified in coding (setting it to 0 will be default)
; VehicleTeam : Sets the initial team of the vehicle (see bEnterteamunlocks) 0 = Attackers, 1 = Defenders

Thats about it for setting up a basic vehicle, there is a list of other properties and what they do futher down

==Setting up a Sentinel or Turret==

To place a sentinel or turret expand the ASVehicleFactory branch and place one of the following:
* ASVehicleFactory_IonCannon - Massive Ion Cannon (as in RobotFactory)
* ASVehicleFactory_MinigunTurret - (As in Convoy)
* ASVehicleFactory_SentinelCeiling - You cannot get into these and are generally used as spawn protection or objectives to destroy
* ASVehicleFactory_SentinelFloor - As above but you place them of the floor
* ASVehicleFactory_Turret - Turrets as in the ones on Mothership
* ASVehicleFactory_LinkTurret - Link Turrets - can heal other vehicles but also destroy them very quickly

Once place they can be setup as in the vehicles section but there are a few more properties to take into account for turrets

; AIVisiblity : This is how far the turret (and bots in it) can 'see' - If it is a sentinel, link turret or a mothership turret it will automatically shoot at anyone in the other team within that range (the others will not) setting it to 0 will mean that it will not automatically shoot at anyone.

===Making the turret 'remote controlled'===

If you want the turret to be controlled through a wall panel (as in mothership) you have to do the following:

* Place a Triggers&gt;&gt;SVehicleTrigger&gt;&gt;Trigger_ASUseandPossess&gt;&gt;Trigger_ASTurretControlPanel

Set the following properties in the Trigger_ASTurretControlPanel:
; Trigger_ASUseandPossess&gt;&gt;AssaultTeam : Only the team (or all) will be able to use this panel
; Trigger_ASUseandPossess&gt;&gt;PawnTag : This must be the same as the ASVehicleFactory&gt;&gt;VehicleTag of the turret

You can only remote control the mothership turrets and the link turret this was the others will not work!

==Making the Vehicle Spawn or 'Unspawn' when triggered==

This applies to both sentinels, turrets and vehicles.

* bEnabled states if the vehicle will spawn at the beginning of the game. If not true it will only spawn when triggered and depending on the TriggeredFunction may change during the game.
* TriggeredFunction can be set in one of the following states
** EVASF_ToggleEnabled - When the factory is triggered it will switch between being enabled and disabled (depending on what bEnabled starts at)
** EVASF_TriggeredSpawn - When the factory is triggered it will switch between being enabled and disabled (depending on what bEnabled starts at) BUT WILL DESTROY THE VEHICLE WHEN DISABLED!!!

===Force Destroy===

When a factory is triggered from enabled to disabled it will not destroy the vehicle but only stop it from respawning when it is next destroyed. This means that if you want to force a vehicle to destroy you must do the following. In the PlayerSpawnManager used previously in the tutorial there is a field called DisabledVehicleFactoriesTag adding a field here and entering the Events&gt;&gt;Tag of any VehicleFactory, when the PlayerSpawnManager is disabled the vehicle will not only vanish (no explosions) but the factory will set bEnabled to false. Which is essential when using sentinel for spawn areas that are used by both teams.

==Extra Properties==

These might be useful when doing more complex things with vehicles

; AIVisibility : only used for turrets (see below)
; Announcement_Destroyed : Put the name of a sound file in here and when the vehicle is destroyed everyone will here it
; bHighScoreKill : When set to true this will earn the person who destroys the vehicle a trophy and some points
; bHUDTrackVehicle : When set to true the vehicle will have a visible icon on the HUD showing health and position (It is only posible to have one vehicle (that is spawned) at a time with this, if you have more than one it will rotate as the vehicle with it dies)
; bKeyVehicle : When set to true the vehicle will have a health bar above it for all players
; bSpawnBuildEffect : When the vehicle is about to spawn or respawn you will get the nice red or blue rings and a warning if you are in the way (the time of the warning can be set in MaxSpawnBlockCount (in seconds))
; VehicleEvent : This is triggered when the vehicle is destroyed
; VehicleLinkHealMult : How much the link gun heals the vehicle, 0 = link gun won't heal it, 1 = link gun will heal vehicles very quickly

The few that I have left out need only be changed in very strange circumstances...

I hope what I have done so far has satisfied everyones curiosities if you want more please email me at blip2@dogmatix.net with suggestions.

==Discussion==

'''SuperApe:''' This is an excellent series of tutorials.  Well done.

'''Blip2:''' meh I only did this page

'''FreshMeat:''' Followed these directions exactly, my remote controll turret doesn't work. You can't get in, though it will shoot automatically. When the turret is killed, the correct panel explodes like it would if the thing were remote controll. Any tips?

'''Herr General:'''I can't help you with that, even though it works in my map

...</text>
    </revision>
    <revision>
      <id>1564</id>
      <timestamp>2007-01-31T12:10:09Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>adding more stuff and changing my email &gt;&lt;</comment>
      <text xml:space="preserve">In assault vehicles can be used in more ways that any other gametype and can seriously affect gameplay so you should be careful when placing vehicles see [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] for more information on where and why to place vehicles.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WrapUp]]'''

==Setting Up a vehicle==

When placing an ONS vehicle (the standard ones) in an AS map there are no specific factories for each of the vehicles they must be set in a property of an ASVehicleFactory. Unless you set it up in the display options there will only be an actor in the UEd [[Legacy:Viewport|viewport]] until the vehicle spawns inside the actual game.

Vehicles designed only for assault though (the turrets) have individual factories, this will be discussed further on.

===Placing the actor===

Go into the actor browser and in Actor&gt;&gt;SVehicle there will be ASVehicleFactory take this and put one into your map (use the root level of this to add a standard vehicle)

It will appear as a car icon and when the paths are rebuilt a navigation point will appear under it

===Setting which Vehicle you want===

To set which vehicle to use go to the SVehicleFactory sub-menu and select in the vehicleclass list. See [[Legacy:Vehicle Gameplay|Vehicle Gameplay]] for the names that you should use.

===Properties that you might want to change===

Open the properties of the ASVehicleFactory and browse the the ASVehicleFactory sub-menu there are a list of options all unique to the assault gametype:
; bEnterteamunlocks : If the vehicle is locked (when bVehicleTeamLock is set to true) the vehicle will unlock if a player gets in and out of the vehicle and this is set to true
; bVehicleTeamLock : When the vehicle spawns and this is set to true only the team specified in VehicleTeam will be able to enter it
; bRespawnwhenDestroyed : When set to true the vehicle will respawn when it is destroyed after the time specified in the RespawnDelay field
; bSpawnProtected : If set to true the vehicle cannot be damaged before a player enters it
; VehicleHealth : You can specify the health of the vehicle here if you don't want it at the default specified in coding (setting it to 0 will be default)
; VehicleTeam : Sets the initial team of the vehicle (see bEnterteamunlocks) 0 = Attackers, 1 = Defenders

That's about it for setting up a basic vehicle, there is a list of other properties and what they do further down

==Setting up a Sentinel or Turret==

To place a sentinel or turret expand the ASVehicleFactory branch and place one of the following:
* ASVehicleFactory_IonCannon - Massive Ion Cannon (as in RobotFactory)
* ASVehicleFactory_MinigunTurret - (As in Convoy)
* ASVehicleFactory_SentinelCeiling - You cannot get into these and are generally used as spawn protection or objectives to destroy
* ASVehicleFactory_SentinelFloor - As above but you place them of the floor
* ASVehicleFactory_Turret - Turrets as in the ones on Mothership
* ASVehicleFactory_LinkTurret - Link Turrets - can heal other vehicles but also destroy them very quickly

Once place they can be setup as in the vehicles section but there are a few more properties to take into account for turrets

; AIVisiblity : This is how far the turret (and bots in it) can 'see' - If it is a sentinel, link turret or a mothership turret it will automatically shoot at anyone in the other team within that range (the others will not) setting it to 0 will mean that it will not automatically shoot at anyone. In other turrets it will limit how far the bot can 'see' and fire at targets.

===Making bot use turrets===

Bots will not use the control panels (below) and therefore will never use the Mothership Turrets (ASVehicleFactory_Turret) and Link Turrets (ASVehicleFactory_LinkTurret). You therefore need to set the AIVisiblity (see above) if you want the turrets to fire in bot matches.

Bots will manually get into both the ion cannon and minigun turrets if both of the following apply:
* There is a path to the turret and space to get in (applies mostly to ion cannon as you can only get in at the ladder)
* The current objectives tag is listed under ASVehicleFactory_IonCannon/MinigunTurret (maximum of 6 objectives - cannot be increased without recoding)

===Making the turret 'remote controlled'===

If you want the turret to be controlled through a wall panel (as in mothership) you have to do the following:

* Place a Triggers&gt;&gt;SVehicleTrigger&gt;&gt;Trigger_ASUseandPossess&gt;&gt;Trigger_ASTurretControlPanel

Set the following properties in the Trigger_ASTurretControlPanel:
; Trigger_ASUseandPossess&gt;&gt;AssaultTeam : Only the team (or all) will be able to use this panel
; Trigger_ASUseandPossess&gt;&gt;PawnTag : This must be the same as the ASVehicleFactory&gt;&gt;VehicleTag of the turret

* Make sure that in addition to setting the Trigger_ASUseandPossess&gt;&gt;AssaultTeam that you set the team correctly on the turret itself (see above (bVehicleTeamLock etc.) as you either may not be able to get into the turret using the panel.
* You can also get into both the link turrets and Mothership turrets manually (if the bVehicleTeamLock etc... (see above) is set correctly) by standing on top of the turret and pressing your 'use' key
* You can only remote control the mothership turrets and link turrets the others will not work!

==Making the Vehicle Spawn or 'Unspawn' when triggered==

This applies to both sentinels, turrets and vehicles.

* bEnabled states if the vehicle will spawn at the beginning of the game. If not true it will only spawn when triggered and depending on the TriggeredFunction may change during the game.
* TriggeredFunction can be set in one of the following states
** EVASF_ToggleEnabled - When the factory is triggered it will switch between being enabled and disabled (depending on what bEnabled starts at)
** EVASF_TriggeredSpawn - When the factory is triggered it will switch between being enabled and disabled (depending on what bEnabled starts at) BUT WILL DESTROY THE VEHICLE WHEN DISABLED!!!

===Force Destroy===

When a factory is triggered from enabled to disabled it will not destroy the vehicle but only stop it from respawning when it is next destroyed. This means that if you want to force a vehicle to destroy you must do the following. In the PlayerSpawnManager used previously in the tutorial there is a field called DisabledVehicleFactoriesTag adding a field here and entering the Events&gt;&gt;Tag of any VehicleFactory, when the PlayerSpawnManager is disabled the vehicle will not only vanish (no explosions) but the factory will set bEnabled to false. Which is essential when using sentinel for spawn areas that are used by both teams.

==Extra Properties==

These might be useful when doing more complex things with vehicles

; AIVisibility : only used for turrets (see below)
; Announcement_Destroyed : Put the name of a sound file in here and when the vehicle is destroyed everyone will here it
; bHighScoreKill : When set to true this will earn the person who destroys the vehicle a trophy and some points
; bHUDTrackVehicle : When set to true the vehicle will have a visible icon on the HUD showing health and position (It is only posible to have one vehicle (that is spawned) at a time with this, if you have more than one it will rotate as the vehicle with it dies)
; bKeyVehicle : When set to true the vehicle will have a health bar above it for all players
; bSpawnBuildEffect : When the vehicle is about to spawn or respawn you will get the nice red or blue rings and a warning if you are in the way (the time of the warning can be set in MaxSpawnBlockCount (in seconds))
; VehicleEvent : This is triggered when the vehicle is destroyed
; VehicleLinkHealMult : How much the link gun heals the vehicle, 0 = link gun won't heal it, 1 = link gun will heal vehicles very quickly

The few that I have left out need only be changed in very strange circumstances...

If you need help please email blip2@dogmatix.net or comment below - I check fairly regularly.

==Discussion==

'''SuperApe:''' This is an excellent series of tutorials.  Well done.

'''Blip2:''' meh I only did this page

'''FreshMeat:''' Followed these directions exactly, my remote control turret doesn't work. You can't get in, though it will shoot automatically. When the turret is killed, the correct panel explodes like it would if the thing were remote control. Any tips?

'''Herr General:'''I can't help you with that, even though it works in my map

'''Blip2:''' Freshmeat: see above - I've added a bit

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Attacking And Defending</title>
    <id>487</id>
    <revision>
      <id>1554</id>
      <timestamp>2007-01-31T12:29:23Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]'''

----

==Attacking and Defending==

Ok, we've got our map and all of our objectives, and places for players to spawn and equipment for them to use.  We just need a couple more things to make this a fully functional Assault scenario.

==Bot Pathing==

The basic bot pathing for Assault is no different from most of the other gametypes.  Start out by laying out an appropriate grid of [[Legacy:PathNode|PathNode]]s around the map, so the bots know where they can and where they can't go.  Once you've got a basic network down, and checked it to make sure that everything's reachable and all the other standard [[Legacy:Bot Pathing|bot pathing]] issues, fire up the map in the game and give it a try with some bots to see how it goes.

You'll notice at this point that the attacking bots are able to find and attack the objective automatically, and the defenders are defending as well, but you might also notice something else:  For the most part, the bots are always following the same path to attack the objective.  This is not a good thing (predictable bots make for uninteresting levels).  How do we fix this?

The answer is [[Legacy:AssaultPath|AssaultPath]]s.  If you've made Capture the Flag, Bombing Run, or other &quot;goal-type&quot; maps before, AssaultPaths may already be familiar to you, but in case they aren't, here's a quick summary:

An AssaultPath actor allows you to specify one of several alternate routes to reach an objective.  All AssaultPath actors which share a common AssaultPath-&gt;PathTag are part of the same assault path (each AssaultPath actor can have up to four PathTags, so it can be part of up to four different assault paths).  Ordinarily, when a bot is deciding how to reach an objective, it picks the shortest route it can find to get wherever it wants to go and follows it.  However, if there are AssaultPath actors associated with the objective, the bot will instead look at all of the assault paths available for that objective, and randomly choose one to follow.  Instead of finding the quickest path to the objective, the bot will then look for the quickest path to the first AssaultPath actor in its chosen assault path and go there instead.  Then it will repeat that process with the next AssaultPath (if there is one) in the path, until it runs out of AssaultPaths associated with the particular path it's following.  Once it gets to the last AssaultPath actor for the assault path, it then falls back to its default behavior of finding the quickest route to the game objective from there.

One important point to note from this is that the AssaultPaths really don't define whole paths.  Instead, what they really do is tell the bot &quot;go here first, and then proceed from here&quot;.  This means that in most cases you will not need very many AssaultPath actors if you're careful about where you put them.  In a lot of cases, you'll only need one AssaultPath actor for each path you want to define (simply put it someplace where you want the bot to go first, and where the quickest route from there to the objective is a good path for the bot to take anyway, such as at one of the entrances to a base, for example).  You do not need to lay out long strings of AssaultPath actors for bots.  They're smart enough to figure out how to get where they're going already, you just need to give them a pointer here or there if the way they choose isn't the best one.

In the case of our map, all of the bots are going to take the same route until they get around the bend in the valley anyway, so there's no need to fiddle with that part.  We will want them to attempt to attack the base from both sides, though, so we'll need an AssaultPath actor on either side of the base to direct the bots to go to one side or the other.

[[Legacy:Add An Actor|Add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;AssaultPath on the left side of the base near the entrance (you may want to replace an existing NavigationPoint with the new AssaultPath).  Open up its properties window and [[Legacy:Set The Following Properties|set the following properties]]:

* AssaultPath-&gt;ObjectiveTag = BaseDoor
* AssaultPath-&gt;PathTag[0] = leftpath

Now also add an AssaultPath on the right side of the base near the entrance on that side.  Set its properties as follows:

* AssaultPath-&gt;ObjectiveTag = BaseDoor
* AssaultPath-&gt;PathTag[0] = rightpath

That's really all there is to it.  [[Legacy:Rebuild|Rebuild]] everything and fire it up to give it a try.  The bots should now be attacking the base from both sides.

There is one other behavior associated with AssaultPaths:  When bots reach an AssaultPath actor, they will sometimes wait to &quot;regroup&quot; with other bots on their team at that point before continuing on.  In many cases, this is a useful feature, as it automatically adds some additional tactical ramifications to the bot attack patterns, but in some cases (such as when an AssaultPath is particularly exposed, or you want bots to attack individually for some reason), this behavior can be undesirable.  In these cases, you can set the AssaultPath-&gt;bNoGrouping parameter to True, which will disable this behavior at that particular AssaultPath point (we don't need to do this with any of our AssaultPaths in this case, though).

Just to add a little more variety to make things more interesting, let's add two more paths with slightly different routes so that even if a bot is attacking a particular side, they won't always be taking quite the same route to get there.  Create two more AssaultPaths with similar properties to the previous ones, but set their PathTags to &quot;otherleft&quot; and &quot;otherright&quot;, and place them in alternate spots to the left and to the right of the base (you may want to position some further out and some closer in, so the bots follow significantly different paths to get to them as soon as they turn the corner.  Take into consideration available cover and other strategic factors).  Adjust as necessary to get reasonable variation without having needlessly long routes.  You can also adjust the AssaultPath-&gt;Priority properties to determine how likely it is that a bot will choose a particular path to follow.

For more help with bot pathing see [[Legacy:Pathing For Assault|Pathing for Assault]]

==Defense Points==

Ok, so we've added some strategy to the attacking bots, but the defending bots are still doing their own simple bot things (which basically means they're all huddling around the objective).  Time to make them a bit smarter too (again, if you've made CTF, Domination, or similar maps some of this may already be familiar).  To do this, we'll be using some [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] actors.  UnrealScriptedSequences are a fairly powerful way to script a lot of different bot behaviors, but the behavior we're interested in at the moment is just to set up some &quot;defense points&quot; which tell the bots &quot;this is a good place to stand and shoot at things&quot;.  As it happens, this sort of UnrealScriptedSequence is so common that it's built in as the default behavior if you create an UnrealScriptedSequence but don't give it a custom script of its own.

This makes defense points fairly easy to use:  Simply pick a spot, and [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Keypoint&gt;&gt;AIScript&gt;&gt;ScriptedSequence&gt;&gt;UnrealScriptedSequence.  There are a few other things we'll need to do, though:

* Go to the objective this defense point will be associated with (in this case, our door).  Open its properties, and find the GameObjective-&gt;DefenseScriptTags property.  Set this property to an appropriate tag name (say, &quot;BaseDoorDefense&quot;).  Now, go to your UnrealScriptedSequence actor, and set its Events-&gt;Tag to the same value (&quot;BaseDoorDefense&quot;).  This will cause the defense point to automatically be active when the right objective is active, and disabled otherwise.
* When selected, you'll notice that the UnrealScriptedSequence actor has a little red arrow protruding from it (look very carefully, it's a little hard to see).  This indicates the direction that a bot will face when using this defense point.  Rotate the actor appropriately to make sure the bot will be facing the right direction.

There are also a few other properties which you may want to change, depending on the circumstances:

;UnrealScriptedSequence-&gt;WeaponPreference: When using this defense point, use this weapon.
;UnrealScriptedSequence-&gt;Priority: Relative priority of this defense point compared with the others for this objective.  The higher this value, the more likely a bot will choose this script when deciding what to do.
;UnrealScriptedSequence-&gt;bSniping: If True, this defense point marks a spot which the bot should snipe from.  It will stay here, crouch, and shoot at anything which enters the associated [[Legacy:SnipingVolume|SnipingVolume]].
;UnrealScriptedSequence-&gt;SnipingVolumeTag: The tag of the [[Legacy:SnipingVolume|SnipingVolume]] to use for bSniping (Note: You don't have to have a SnipingVolume.  If you don't have one, bots will just snipe at anything they see).
;UnrealScriptedSequence-&gt;bRoamingScript: If True, the bot will not stay in this spot while using this script, but will roam around.  Since defense points don't really have &quot;scripts&quot;, and their main point is to say &quot;go here&quot;, this usually isn't that useful, but it can be used, for example, to say something like &quot;pick this weapon and then patrol this general area with it&quot;.

(For more information on defense points, take a look at [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] and [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point In UT200x]])

You will want to put some careful thought into where you place defense points around your map.  Keep in mind that a defending bot's natural inclination is to stay close to the objective, so you don't really need to put defense points there, but you will usually want to put some out in advance positions so that the defenders will intercept the attackers before they get too close.  Don't place defense points too close to walls or other obstacles, or bots' vision may be obstructed and they may not defend as well as they should.  Also keep in mind that bots will pick which defense point to use partially based on whether the WeaponPreference setting matches their own preferred weapon (and whether they have that weapon on them), so make sure to have a variety of defense points appropriate for different types of weapons, to suit different bots' tastes (also note that the PreferredWeapon property is only a suggestion, so sometimes bots will completely ignore it.  It's good to place defense points in locations which are effective with a variety of weapon types for this reason).

A well placed defense point can dramatically improve defending bots' chances of holding off the attackers, but a poorly placed defense point can take one or more defenders effectively out of the action or make them sitting ducks for the attackers, severely hampering the defense of the objective.  Be careful where you place defense points and be sure to test them thoroughly by observing how bots of different skill levels use them in real gameplay.  You will likely have to adjust the locations and priorities of your defense points several times until you get a configuration that works well and reliably.

==Critical Volumes==

There is one last little detail which we should add to our objective, which will make defending easier both for bots and humans alike.  You may have noticed when playing this level up to now that the DestroyableObjective_SM actor will automatically flash the HUD icon and play the warning sound when people start shooting at it.  This is good, but what would be more useful is if it didn't actually wait until somebody was in the process of blowing it up before saying something about it.  We can add this functionality with what's known as a &quot;critical volume&quot;.

The first thing we want to do is to create a new [[Legacy:ASCriticalObjectiveVolume|ASCriticalObjectiveVolume]] in the map.  This volume should be big enough (and the right shape) to enclose any parts of the map which one might consider &quot;close to the objective&quot;.  For our purposes, let's create a simple cylinder-shaped builder brush with Height=1024 and OuterRadius=2048, then place it over all of the area surrounding the base, and create a new ASCriticalObjectiveVolume there.

The next step is to associate this new volume with our objective.  Open the ASCriticalObjectiveVolume's properties, and set its Events-&gt;Tag to some appropriate value (something like, say, &quot;BaseDoorCriticalVolume&quot;).  Now we need to open up the properties for our base door DestroyableObjective_SM actor, and set its GameObjective-&gt;CriticalObjectiveVolumeTag to the same tag name.

That should do it.  Now whenever an attacker enters our new volume, it will automatically set off the &quot;objective in danger&quot; alarm, alerting the defenders that attackers are in the vicinity.  (Note that this will also affect bot behavior, as the bots automatically know when this alarm goes off to fall back and defend the objective more closely, too.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
    <revision>
      <id>1555</id>
      <timestamp>2004-12-16T05:54:35Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]'''

----

==Attacking and Defending==

Ok, we've got our map and all of our objectives, and places for players to spawn and equipment for them to use.  We just need a couple more things to make this a fully functional Assault scenario.

==Bot Pathing==

The basic bot pathing for Assault is no different from most of the other gametypes.  Start out by laying out an appropriate grid of [[Legacy:PathNode|PathNode]]s around the map, so the bots know where they can and where they can't go.  Once you've got a basic network down, and checked it to make sure that everything's reachable and all the other standard [[Legacy:Bot Pathing|bot pathing]] issues, fire up the map in the game and give it a try with some bots to see how it goes.

You'll notice at this point that the attacking bots are able to find and attack the objective automatically, and the defenders are defending as well, but you might also notice something else:  For the most part, the bots are always following the same path to attack the objective.  This is not a good thing (predictable bots make for uninteresting levels).  How do we fix this?

The answer is [[Legacy:AssaultPath|AssaultPath]]s.  If you've made Capture the Flag, Bombing Run, or other &quot;goal-type&quot; maps before, AssaultPaths may already be familiar to you, but in case they aren't, here's a quick summary:

An AssaultPath actor allows you to specify one of several alternate routes to reach an objective.  All AssaultPath actors which share a common AssaultPath-&gt;PathTag are part of the same assault path (each AssaultPath actor can have up to four PathTags, so it can be part of up to four different assault paths).  Ordinarily, when a bot is deciding how to reach an objective, it picks the shortest route it can find to get wherever it wants to go and follows it.  However, if there are AssaultPath actors associated with the objective, the bot will instead look at all of the assault paths available for that objective, and randomly choose one to follow.  Instead of finding the quickest path to the objective, the bot will then look for the quickest path to the first AssaultPath actor in its chosen assault path and go there instead.  Then it will repeat that process with the next AssaultPath (if there is one) in the path, until it runs out of AssaultPaths associated with the particular path it's following.  Once it gets to the last AssaultPath actor for the assault path, it then falls back to its default behavior of finding the quickest route to the game objective from there.

One important point to note from this is that the AssaultPaths really don't define whole paths.  Instead, what they really do is tell the bot &quot;go here first, and then proceed from here&quot;.  This means that in most cases you will not need very many AssaultPath actors if you're careful about where you put them.  In a lot of cases, you'll only need one AssaultPath actor for each path you want to define (simply put it someplace where you want the bot to go first, and where the quickest route from there to the objective is a good path for the bot to take anyway, such as at one of the entrances to a base, for example).  You do not need to lay out long strings of AssaultPath actors for bots.  They're smart enough to figure out how to get where they're going already, you just need to give them a pointer here or there if the way they choose isn't the best one.

In the case of our map, all of the bots are going to take the same route until they get around the bend in the valley anyway, so there's no need to fiddle with that part.  We will want them to attempt to attack the base from both sides, though, so we'll need an AssaultPath actor on either side of the base to direct the bots to go to one side or the other.

[[Legacy:Add An Actor|Add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;AssaultPath on the left side of the base near the entrance (you may want to replace an existing NavigationPoint with the new AssaultPath).  Open up its properties window and [[Legacy:Set The Following Properties|set the following properties]]:

* AssaultPath-&gt;ObjectiveTag = BaseDoor
* AssaultPath-&gt;PathTag[0] = leftpath

Now also add an AssaultPath on the right side of the base near the entrance on that side.  Set its properties as follows:

* AssaultPath-&gt;ObjectiveTag = BaseDoor
* AssaultPath-&gt;PathTag[0] = rightpath

That's really all there is to it.  [[Legacy:Rebuild|Rebuild]] everything and fire it up to give it a try.  The bots should now be attacking the base from both sides.

There is one other behavior associated with AssaultPaths:  When bots reach an AssaultPath actor, they will sometimes wait to &quot;regroup&quot; with other bots on their team at that point before continuing on.  In many cases, this is a useful feature, as it automatically adds some additional tactical ramifications to the bot attack patterns, but in some cases (such as when an AssaultPath is particularly exposed, or you want bots to attack individually for some reason), this behavior can be undesirable.  In these cases, you can set the AssaultPath-&gt;bNoGrouping parameter to True, which will disable this behavior at that particular AssaultPath point (we don't need to do this with any of our AssaultPaths in this case, though).

Just to add a little more variety to make things more interesting, let's add two more paths with slightly different routes so that even if a bot is attacking a particular side, they won't always be taking quite the same route to get there.  Create two more AssaultPaths with similar properties to the previous ones, but set their PathTags to &quot;otherleft&quot; and &quot;otherright&quot;, and place them in alternate spots to the left and to the right of the base (you may want to position some further out and some closer in, so the bots follow significantly different paths to get to them as soon as they turn the corner.  Take into consideration available cover and other strategic factors).  Adjust as necessary to get reasonable variation without having needlessly long routes.  You can also adjust the AssaultPath-&gt;Priority properties to determine how likely it is that a bot will choose a particular path to follow.

==Defense Points==

Ok, so we've added some strategy to the attacking bots, but the defending bots are still doing their own simple bot things (which basically means they're all huddling around the objective).  Time to make them a bit smarter too (again, if you've made CTF, Domination, or similar maps some of this may already be familiar).  To do this, we'll be using some [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] actors.  UnrealScriptedSequences are a fairly powerful way to script a lot of different bot behaviors, but the behavior we're interested in at the moment is just to set up some &quot;defense points&quot; which tell the bots &quot;this is a good place to stand and shoot at things&quot;.  As it happens, this sort of UnrealScriptedSequence is so common that it's built in as the default behavior if you create an UnrealScriptedSequence but don't give it a custom script of its own.

This makes defense points fairly easy to use:  Simply pick a spot, and [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Keypoint&gt;&gt;AIScript&gt;&gt;ScriptedSequence&gt;&gt;UnrealScriptedSequence.  There are a few other things we'll need to do, though:

* Go to the objective this defense point will be associated with (in this case, our door).  Open its properties, and find the GameObjective-&gt;DefenseScriptTags property.  Set this property to an appropriate tag name (say, &quot;BaseDoorDefense&quot;).  Now, go to your UnrealScriptedSequence actor, and set its Events-&gt;Tag to the same value (&quot;BaseDoorDefense&quot;).  This will cause the defense point to automatically be active when the right objective is active, and disabled otherwise.
* When selected, you'll notice that the UnrealScriptedSequence actor has a little red arrow protruding from it (look very carefully, it's a little hard to see).  This indicates the direction that a bot will face when using this defense point.  Rotate the actor appropriately to make sure the bot will be facing the right direction.

There are also a few other properties which you may want to change, depending on the circumstances:

;UnrealScriptedSequence-&gt;WeaponPreference: When using this defense point, use this weapon.
;UnrealScriptedSequence-&gt;Priority: Relative priority of this defense point compared with the others for this objective.  The higher this value, the more likely a bot will choose this script when deciding what to do.
;UnrealScriptedSequence-&gt;bSniping: If True, this defense point marks a spot which the bot should snipe from.  It will stay here, crouch, and shoot at anything which enters the associated [[Legacy:SnipingVolume|SnipingVolume]].
;UnrealScriptedSequence-&gt;SnipingVolumeTag: The tag of the [[Legacy:SnipingVolume|SnipingVolume]] to use for bSniping (Note: You don't have to have a SnipingVolume.  If you don't have one, bots will just snipe at anything they see).
;UnrealScriptedSequence-&gt;bRoamingScript: If True, the bot will not stay in this spot while using this script, but will roam around.  Since defense points don't really have &quot;scripts&quot;, and their main point is to say &quot;go here&quot;, this usually isn't that useful, but it can be used, for example, to say something like &quot;pick this weapon and then patrol this general area with it&quot;.

(For more information on defense points, take a look at [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] and [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point In UT200x]])

You will want to put some careful thought into where you place defense points around your map.  Keep in mind that a defending bot's natural inclination is to stay close to the objective, so you don't really need to put defense points there, but you will usually want to put some out in advance positions so that the defenders will intercept the attackers before they get too close.  Don't place defense points too close to walls or other obstacles, or bots' vision may be obstructed and they may not defend as well as they should.  Also keep in mind that bots will pick which defense point to use partially based on whether the WeaponPreference setting matches their own preferred weapon (and whether they have that weapon on them), so make sure to have a variety of defense points appropriate for different types of weapons, to suit different bots' tastes (also note that the PreferredWeapon property is only a suggestion, so sometimes bots will completely ignore it.  It's good to place defense points in locations which are effective with a variety of weapon types for this reason).

A well placed defense point can dramatically improve defending bots' chances of holding off the attackers, but a poorly placed defense point can take one or more defenders effectively out of the action or make them sitting ducks for the attackers, severely hampering the defense of the objective.  Be careful where you place defense points and be sure to test them thoroughly by observing how bots of different skill levels use them in real gameplay.  You will likely have to adjust the locations and priorities of your defense points several times until you get a configuration that works well and reliably.

==Critical Volumes==

There is one last little detail which we should add to our objective, which will make defending easier both for bots and humans alike.  You may have noticed when playing this level up to now that the DestroyableObjective_SM actor will automatically flash the HUD icon and play the warning sound when people start shooting at it.  This is good, but what would be more useful is if it didn't actually wait until somebody was in the process of blowing it up before saying something about it.  We can add this functionality with what's known as a &quot;critical volume&quot;.

The first thing we want to do is to create a new [[Legacy:ASCriticalObjectiveVolume|ASCriticalObjectiveVolume]] in the map.  This volume should be big enough (and the right shape) to enclose any parts of the map which one might consider &quot;close to the objective&quot;.  For our purposes, let's create a simple cylinder-shaped builder brush with Height=1024 and OuterRadius=2048, then place it over all of the area surrounding the base, and create a new ASCriticalObjectiveVolume there.

The next step is to associate this new volume with our objective.  Open the ASCriticalObjectiveVolume's properties, and set its Events-&gt;Tag to some appropriate value (something like, say, &quot;BaseDoorCriticalVolume&quot;).  Now we need to open up the properties for our base door DestroyableObjective_SM actor, and set its GameObjective-&gt;CriticalObjectiveVolumeTag to the same tag name.

That should do it.  Now whenever an attacker enters our new volume, it will automatically set off the &quot;objective in danger&quot; alarm, alerting the defenders that attackers are in the vicinity.  (Note that this will also affect bot behavior, as the bots automatically know when this alarm goes off to fall back and defend the objective more closely, too.)

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Continuing The Assault</title>
    <id>489</id>
    <revision>
      <id>1557</id>
      <timestamp>2006-07-15T18:44:08Z</timestamp>
      <contributor>
        <ip>66-239-63-229.starstream.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

----

==Continuing the Assault==

So now we have a pretty complete first objective, including reasonably sophisticated bot attacking and defending behaviors, objective warnings, and all that good stuff.  The attackers come over the hill, they fight their way through the opposition, eventually blow up the door, and then proceed triumphantly through the doorway and ...off the edge of the world.  Hmm..  Looks like it's time to build the rest of our map, huh?

The next logical objective from our backstory is for our heroes to proceed into the depths of the base, presumably navigate through a few hallways, and find themselves at the power core, which they will then need to trigger to overload somehow.  As mentioned before, it can add some interest and strategy to a game when there's more than one way to reach an objective, so let's build our base symmetrically, with a path on either side leading to a central chamber for the power core.

From my planning stage, I've already done some thinking about the rest of the assault, and so it happens I've already made a sketch for this stage of things as well, which looks something like this:

[[Image:Legacy_astut-sketch2.png|center|]]

Note here that I've planned things so that the defenders will start out behind the objective and need to come forward past it to meet the attackers.  This is often a good idea for a couple of reasons:

* It reduces the likelihood that defenders who aren't intimately familiar with the map will get confused about what's where and which direction they should be heading:  There's only one way to go, and it takes you to both the objective and the direction the attackers are coming from.
* It keeps the defender spawn point out of the middle of the combat.  This both means that defenders probably won't spawn right on top of a rocket blast, and also means that attackers don't have the problem of that guy they just killed suddenly respawning behind them and blowing them away.
* It makes some logical sense (and things that make sense always make a level more intuitive to play).  Defenders are going to be coming out from the deeper levels of things to meet the attack, they don't suddenly appear in the middle of attacker-held territory.

Again, I'm not going to bore you with a lot of basic mapbuilding details here.  Let's just assume we've built this part of the map for now, and we've got a few hallways leading to a central room with a power core:

[[Image:Legacy_astut-inside.jpeg|center|]]

==Adding a HoldObjective==

Ok, so we've got a power core, and some routes to it, now we need something to do when the attackers get there.  For this part of things, we'll use a different kind of objective known as a [[Legacy:HoldObjective|HoldObjective]].  As the name implies, a HoldObjective is simply one that an attacker must touch and &quot;hold&quot; (by continuing to touch it) for a certain amount of time in order to complete it (the most common way that HoldObjectives are represented in Assault maps is as levers that need to be pulled).

We'll set up some sort of a console in front of the power core which the attackers will need to get to long enough to do whatever one does to start an overload in a power core.  Start by [[Legacy:Add A Static Mesh|adding a Static Mesh]] for a console (something like, say, AlleriaHardware.Miscellaneous.pConsoleA01AL) a little bit in front of the power core (if you're using that console mesh, you'll need something for the back of it too.  I used AlleriaHardware.Miscellaneous.RingCon01AL for that).

Now we need the actual objective.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;JumpDest&gt;&gt;JumpSpot&gt;&gt;GameObjective&gt;&gt;ProximityObjective&gt;&gt;HoldObjective to the map, and place it right in front of the console we just placed.  This is where we'll want people to stand to trigger the objective.  Make sure it's placed so that its collision cylinder is resting on the ground (this will ensure that the objective effects show up in the right place).  Since the HoldObjective just shows up as an icon in the editor, to do this part of things, it often helps to select [[Legacy:Radii View|Radii View]] in the 3D viewport to get an idea of what the collision cylinder for the HoldObjective is.  Next, open the HoldObjective's properties window, and [[Legacy:Set The Following Properties|set the following properties]]:

* Events-&gt;Tag = CoreObjective
* Events-&gt;Event = CoreObjectiveCompleted
* GameObjective-&gt;ObjectiveName = the Power Core
* GameObjective-&gt;LocationPrefix = Near
* GameObjective-&gt;LocationPostfix = 
* GameObjective-&gt;Score = 10
* Assault-&gt;DrawDistThresHold = 0
* Assault-&gt;Objective_Info_Attacker = Trigger an Overload in the Power Core
* Assault-&gt;Objective_Info_Defender = Defend the Power Core
* Assault-&gt;ObjectiveDescription = Flip the Lever to Trigger an Overload
* GameObjective-&gt;DestructionMessage = Power Core Overload Sequence Activated!

(For those who don't remember, all of the above properties are explained in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]])  There are also a couple of additional properties specific to HoldObjectives which you'll want to set:

; HoldObjective-&gt;bLocationFX = True: This will cause the HoldObjective to display a flashing indicator where it's located in the map indicating that players should &quot;stand here&quot;.
; ProximityObjective-&gt;ConstraintPawnClass = UnrealPawn: (this is the default) This specifies what type of actor something has to be in order to trigger this HoldObjective.  The default will match any UnrealPawn (which basically means any player or bot in any form).  For some types of objectives (such as vehicle-based ones), you may want to narrow this to a more specific class of actor.

Now, all HoldObjectives need to be associated with a mover of some kind.  It's actually the movement and position of this mover which determines how close to &quot;completed&quot; the objective is (when the mover reaches its end point, the objective has been accomplished).  For simplicity, we'll just create a lever which needs to be flipped, and associate that mover with our HoldObjective, so [[Legacy:Create A Mover|create a mover]] using the Rahnem_Glacier.Base.plunger static mesh, and place it so that it looks like it's attached to the console next to where we put the HoldObjective.  For [[Legacy:Keyframe|keyframe]] 0, rotate it appropriately so it looks like it's in the flipped-up position.  Now set it to [[Legacy:Keyframe|keyframe]] 1, and rotate it so that it's in the flipped-down position (if you're having a bit of trouble with the rotations here, try setting Roll and Yaw both to -16384, and use Pitch to adjust the lever angle).  There, now we have a flippable lever and a HoldObjective, we just need to tie them together.

Go into the HoldObjective's properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* HoldObjective-&gt;MoverTag = CoreObjectiveLever

Now, go into the new mover's properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* Events-&gt;Tag = CoreObjectiveLever
* Events-&gt;Event = CoreObjective
* Object-&gt;InitialState = TriggerAdvance
* Mover-&gt;MoverEncroachType = ME_IgnoreWhenEncroach
* Mover-&gt;MoveTime = The time you want the hold objective to 'last' for

There.  Now, what will happen is this:

# When somebody stands on the HoldObjective, it will send a trigger event to its HoldObjective-&gt;MoverTag, which in this case is our CoreObjectiveLever.
# The lever is set to TriggerAdvance, which means it will start moving when it's triggered, and stop moving when it's untriggered.
# If whoever's standing on the HoldObjective stops standing on it, it will send an untrigger event to the lever, which will cause it to stop moving.
# Once the lever reaches the end of its movement, it will trigger its Events-&gt;Event, which is set to the tag value for our HoldObjective.
# When the HoldObjective gets triggered, it will consider itself &quot;completed&quot; and deactivate itself, accomplishing the goal.
# When the HoldObjective is completed (after the time set in Mover-&gt;MoveTime), in addition to deactivating itself as an objective, it will also trigger its own Events-&gt;Event, which in this case is set to CoreObjectiveCompleted.  You can use this event (in a ScriptedTrigger or elsewhere) to have things happen when this objective has been completed.
# Throughout the whole process, the HUD indicators for the objective which show how close to &quot;completed&quot; it is will all look at the position of the HoldObjective-&gt;MoverTag mover to see how far it is through its movement, and draw that as a percent-completed in all the indicators.

There's only one little factor left:  How do we set how long somebody has to stand on the objective to complete it?  Remember what I said earlier: It's the movement of the mover which determines how &quot;complete&quot; the objective is, so to determine how long it takes to complete the objective, all we need to do is change how long it takes the mover to do its movement.  Go into the lever's properties, and set its Mover-&gt;MoveTime to something appropriate, like say 5.  This will make it so that the attackers have to stand on the HoldObjective for a total amount of 5 seconds before it will be completed (I know it doesn't sound like much, but 5 seconds can be a long time when you're being shot at from all sides)

===Objective Ordering===

Now that we have more than one objective in our map, it's important to talk for a minute about objective ordering.  The game does most of the hard work of objective management for you by automatically progressing from one objective to the next as goals are accomplished by the attackers, but how does it know which objective is &quot;first&quot;, and then which is &quot;next&quot;?

As it turns out, this is all handled by the GameObjective-&gt;DefensePriority property.  All of the GameObjectives in a given level are ordered in descending DefensePriority.  That means that the GameObjective with the highest DefensePriority value is the first objective of the assault, and the one with the lowest DefensePriority is the last one.

This may seem counterintuitive at first, because one would expect the objectives to be numbered in the order they're completed, but think of it this way:  At any point in time, all of the defenders look at all of the active objectives and try to decide which one is the most important one for them to defend.  Obviously, the most important objective to defend is the first one, which the attackers are going to be reaching first, so that objective should have the highest DefensePriority.  If they succeed in defending the first (most important) objective, then they don't need to worry about any of the others.  If they fail to defend that objective and it falls, then they will need to fall back to the next most important one and try to defend that instead.  Based on this logic, the first objective should have the highest DefensePriority, and the last one the lowest.  Because of this, the game also treats the objectives this way when displaying them on the HUD and deciding what the attackers should be going for as well. 

Note that it's also possible (and perfectly legal) to give two objectives the same DefensePriority.  What this does is cause both objectives to be the current objective at the same time, and both will need to be completed before moving on to the next objective.  An example of this is the shield generators in AS-RobotFactory or the ion generator switches in AS-Glacier.  Also note that it doesn't really matter what values you use for DefensePriority, what matters is simply whether one objective's value is higher or lower than another one's.

So, every time you add a new GameObjective, it's a good idea to check all of your DefensePriority settings to make sure they're in the right order.  For our little map here, let's set our new HoldObjective's DefensePriority to 0 and set our earlier door objective's DefensePriority to 1.

==PlayerStart Management==

Ok, everything's all set up for our second objective, and after the door gets blown up, the new HoldObjective becomes the next target for the attackers automatically.  There's still a problem, though:  The defenders are still spawning on the roof, even though they've failed to defend the door, and the attackers are still spawning way back at the beginning, which makes for a long run to get to the power core.  We want to have the spawn points change when the door gets destroyed to reflect the progress that the attackers have made.

The first thing we'll need to do, obviously, is to set up some new PlayerStarts for the defenders back behind the power core.  As before, we've got a fair amount of room, so let's put down 16 of them (8 on each side of the hallway).  Now make sure all of these new PlayerStarts have a TeamNumber of 2, to make them a new group which is separate from either of the previous groups (0 and 1).  (While we're here, you might want to put down a couple of WeaponLockers too, so the defenders have something to shoot with.  (Choice of weapons is left as an exercise for the reader :) ))

Next, we need a PlayerSpawnManager for this new group of PlayerStarts.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Info&gt;&gt;PlayerSpawnManager near the PlayerStarts, and [[Legacy:Set The Following Properties|set the following properties]]:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Defenders
* PlayerSpawnManager-&gt;bEnabled = False
* PlayerSpawnManager-&gt;PlayerStartTeam = 2

Note that we set this one to bEnabled = False.  This is because we don't want this group of PlayerStarts to be active at the start of the game, we only want people to start spawning here once the door has been destroyed and we activate this group.  There is one more property we want to set as well:

* PlayerSpawnManager-&gt;bAllowTeleporting = True

This property indicates that when this group of PlayerStarts becomes active, players will be able to hit the 'Q' key to instantly teleport to the new spawn point, so they don't have to run back from wherever they are to get close to the new objective, which can be very handy and is something you'll usually want to set.

Ok, now we've got the new PlayerSpawn area set up, how do we activate it?  You remember that ScriptedTrigger we set up to generate the explosion when the door blew up?  Well, we can use it for more than just explosions.  First, though, we'll need to give our PlayerSpawnManagers some distinctive tags so we can refer to them in the script.  Go to the new PlayerSpawnManager we just created and set its Events-&gt;Tag to something appropriate, like &quot;DefenderSpawnCore&quot;.  Now go to the original defender PlayerSpawnManager on top of the roof and set its Events-&gt;Tag to &quot;DefenderSpawnDoor&quot;.

Now go back to the ScriptedTrigger for the door and open its properties.  Go to the AIScript-&gt;Actions property, and [[Legacy:Add An Inline Object|add a couple more inline objects]] to the end:

;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = DefenderSpawnCore
;* bEnabled = True
;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = DefenderSpawnDoor
;* bEnabled = False

Now once the door gets blown up, the ScriptedTrigger will automatically enable the new spawn point for the defenders, and disable the old one.  Now what about the Attackers?

Well, we could set up some new PlayerStarts for them too, maybe somewhere near the door... but wait, we've already got some PlayerStarts near the door (the ones the defenders were using).  Too bad we can't just re-use those for the attackers now, right?  Well, as it happens we can.  In fact, all we have to do is create a new PlayerSpawnManager, and set it up as follows:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Attackers
* PlayerSpawnManager-&gt;bEnabled = False
* PlayerSpawnManager-&gt;PlayerStartTeam = 1
* PlayerSpawnManager-&gt;bAllowTeleporting = True

Note that the PlayerStartTeam is set to 1, which means this PlayerSpawnManager uses the same PlayerStarts as the defender PlayerSpawnManager we created originally.  This doesn't cause a problem because, as with the previous one we just set up, this PlayerSpawnManager is set bEnabled = False, which means we won't get attackers and defenders both spawning here as soon as the game starts.  However, now that we have this PlayerSpawnManager set up, this means we can turn on the ability for attackers to spawn here later, when it's appropriate (after we've deactivated the defender PlayerSpawnManager which was using this group).

The only thing that's left is to set up the ScriptedTrigger to change the attacker PlayerSpawnManagers the same as we did for the defenders.  Again, we're going to need our PlayerSpawnManagers to have tag names, so set Events-&gt;Tag on the new one we just created to be &quot;AttackerSpwanCore&quot;, and go back to the old one and set its Events-&gt;Tag to &quot;AttackerSpawnDoor&quot;.  Now in the ScriptedTrigger's AIScript-Actions property, add the following entries to the end of the list:

;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = AttackerSpawnCore
;* bEnabled = True
;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = AttackerSpawnDoor
;* bEnabled = False

There we go!  Now when the first objective is completed, the defenders will automatically fall back to their new spawn point inside the base, and the attackers will be able to start spawning on top of the roof so they won't have to run as far to get inside.

==Critical Objective Volumes, Bot Pathing, Etc.==

Setting up [[Legacy:Bot Pathing|bot pathing]] and [[Legacy:ASCriticalObjectiveVolume|ASCriticalObjectiveVolume]]s and such is pretty much all the same for this objective as it was for our previous one.  It is important to note, however, that critical objective volumes are particularly important for HoldObjectives, because unlike DestroyableObjectives which sound their alert as soon as somebody hits them (from a distance), the first warning you'll get by default from a HoldObjective is when the attacker is already right on top of it, which in many cases is too late to do a lot.

Also, when pathing the second part of our map here, it is worth noting that we will need to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;[[Legacy:BlockedPath|BlockedPath]] at the outer door to tell bots that they can't go that way initially (because the door is there).  Once you've placed the BlockedPath actor (and done whatever you need to to make it fit into the bot path network the way you want), set its Events-&gt;Tag to something appropriate (say, &quot;DoorPath&quot;), and then go to the ScriptedTrigger's AIScript-&gt;Actions property again and add another action:

; Action_TRIGGEREVENT:
;* Event = DoorPath

Thus, when the door gets destroyed, in addition to showing the explosion and rearranging the spawn points, it will also unblock the path through the door so the bots know they can go that way now.

==Ending the Round==

So now we've got our whole (short) assault put together.  The attackers come around the valley, blow up the door, infiltrate the base, make their way to the power core, and set it to overload, and they win!  But wait, something's wrong here: They don't actually win.  Sure, all the objectives get completed, but then the game just keeps going until the timer finishes counting down, with nothing left for anybody to accomplish.  We need to make the game end the round when the last objective is completed, so that the attackers can celebrate their success, and the defenders will get a try at things.

In Assault, ending the round is accomplished using a [[Legacy:Trigger_ASRoundEnd|Trigger_ASRoundEnd]] actor.  One of the last things we need to do before this map will be complete, therefore, is to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Triggers&gt;&gt;Trigger_ASRoundEnd to the map.  It doesn't really matter where you put it, but it's generally a good idea to put it somewhere near the last objective so it's easy to find later.  The Trigger_ASRoundEnd actor is very easy to use.  Simply set its Events-&gt;Tag property to some appropriate name (I usually use something obvious like &quot;RoundEnd&quot;), and then set that event up to be triggered when the last objective is completed (you can either do this by just setting that name in the last objective's Events-&gt;Event property or, assuming you want to have other things (explosions, etc) happen when the objective is completed, simply add an Action_TRIGGEREVENT action to the appropriate ScriptedTrigger to trigger the &quot;RoundEnd&quot; event along with everything else).

There's just one other little detail left, which you may have noticed.  When the round ends, the default behavior for the game is to switch to a camera view of the current objective, which you can rotate around.  Often, however, the default ending view for an objective isn't in the right place, or doesn't show the best scene, and you might wish to change it.  In fact, when the game ends while people are still attacking the base door, the default view in our map isn't really ideal, so let's change that.  Here's how we go about it:

First, we need to set up an [[Legacy:ASCinematic_Camera|ASCinematic_Camera]] to indicate where the view should be located and what it should be pointing at.  To do this, [[Legacy:Add An Actor|add an Actor]]&gt;&gt;ASCinematic_Camera to the map where you would like it, and rotate it appropriately.  An easy way to get the placement and rotation the way you'd like it is to position your 3D view in the editor the way you want the camera's view to be, then find your editor camera (the little eye icon) in one of the 2D views, right-click on it, and bring up its properties.  Note down the Movement-&gt;Location and Movement-&gt;Rotation values, and then when you create your ASCinematic_Camera, simply type in those same values for it.

Now to associate it with the game objective.  Go into the ASCinematic_Camera's properties and set its Events-&gt;Tag to some appropriate value such as, say, BaseDoorCamera.  Now open up the properties for our base door DestroyableObjective_SM, and set its Assault-&gt;EndCameraTag to the same value.  Now whenever the round ends while the base door is the active objective, it will show a view from our new camera position instead of the default.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
    <revision>
      <id>1558</id>
      <timestamp>2006-06-15T20:42:23Z</timestamp>
      <contributor>
        <ip>C-24-218-45-76.hsd1.ma.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

----

==Continuing the Assault==

So now we have a pretty complete first objective, including reasonably sophisticated bot attacking and defending behaviors, objective warnings, and all that good stuff.  The attackers come over the hill, they fight their way through the opposition, eventually blow up the door, and then proceed triumphantly through the doorway and ...off the edge of the world.  Hmm..  Looks like it's time to build the rest of our map, huh?

The next logical objective from our backstory is for our heroes to proceed into the depths of the base, presumably navigate through a few hallways, and find themselves at the power core, which they will then need to trigger to overload somehow.  As mentioned before, it can add some interest and strategy to a game when there's more than one way to reach an objective, so let's build our base symmetrically, with a path on either side leading to a central chamber for the power core.

From my planning stage, I've already done some thinking about the rest of the assault, and so it happens I've already made a sketch for this stage of things as well, which looks something like this:

[[Image:Legacy_astut-sketch2.png|center|]]

Note here that I've planned things so that the defenders will start out behind the objective and need to come forward past it to meet the attackers.  This is often a good idea for a couple of reasons:

* It reduces the likelihood that defenders who aren't intimately familiar with the map will get confused about what's where and which direction they should be heading:  There's only one way to go, and it takes you to both the objective and the direction the attackers are coming from.
* It keeps the defender spawn point out of the middle of the combat.  This both means that defenders probably won't spawn right on top of a rocket blast, and also means that attackers don't have the problem of that guy they just killed suddenly respawning behind them and blowing them away.
* It makes some logical sense (and things that make sense always make a level more intuitive to play).  Defenders are going to be coming out from the deeper levels of things to meet the attack, they don't suddenly appear in the middle of attacker-held territory.

Again, I'm not going to bore you with a lot of basic mapbuilding details here.  Let's just assume we've built this part of the map for now, and we've got a few hallways leading to a central room with a power core:

[[Image:Legacy_astut-inside.jpeg|center|]]

==Adding a HoldObjective==

Ok, so we've got a power core, and some routes to it, now we need something to do when the attackers get there.  For this part of things, we'll use a different kind of objective known as a [[Legacy:HoldObjective|HoldObjective]].  As the name implies, a HoldObjective is simply one that an attacker must touch and &quot;hold&quot; (by continuing to touch it) for a certain amount of time in order to complete it (the most common way that HoldObjectives are represented in Assault maps is as levers that need to be pulled).

We'll set up some sort of a console in front of the power core which the attackers will need to get to long enough to do whatever one does to start an overload in a power core.  Start by [[Legacy:Add A Static Mesh|adding a Static Mesh]] for a console (something like, say, AlleriaHardware.Miscellaneous.pConsoleA01AL) a little bit in front of the power core (if you're using that console mesh, you'll need something for the back of it too.  I used AlleriaHardware.Miscellaneous.RingCon01AL for that).

Now we need the actual objective.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;JumpDest&gt;&gt;JumpSpot&gt;&gt;GameObjective&gt;&gt;ProximityObjective&gt;&gt;HoldObjective to the map, and place it right in front of the console we just placed.  This is where we'll want people to stand to trigger the objective.  Make sure it's placed so that its collision cylinder is resting on the ground (this will ensure that the objective effects show up in the right place).  Since the HoldObjective just shows up as an icon in the editor, to do this part of things, it often helps to select [[Legacy:Radii View|Radii View]] in the 3D viewport to get an idea of what the collision cylinder for the HoldObjective is.  Next, open the HoldObjective's properties window, and [[Legacy:Set The Following Properties|set the following properties]]:

* Events-&gt;Tag = CoreObjective
* Events-&gt;Event = CoreObjectiveCompleted
* GameObjective-&gt;ObjectiveName = the Power Core
* GameObjective-&gt;LocationPrefix = Near
* GameObjective-&gt;LocationPostfix = 
* GameObjective-&gt;Score = 10
* Assault-&gt;DrawDistThresHold = 0
* Assault-&gt;Objective_Info_Attacker = Trigger an Overload in the Power Core
* Assault-&gt;Objective_Info_Defender = Defend the Power Core
* Assault-&gt;ObjectiveDescription = Flip the Lever to Trigger an Overload
* GameObjective-&gt;DestructionMessage = Power Core Overload Sequence Activated!

(For those who don't remember, all of the above properties are explained in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]])  There are also a couple of additional properties specific to HoldObjectives which you'll want to set:

; HoldObjective-&gt;bLocationFX = True: This will cause the HoldObjective to display a flashing indicator where it's located in the map indicating that players should &quot;stand here&quot;.
; ProximityObjective-&gt;ConstraintPawnClass = UnrealPawn: (this is the default) This specifies what type of actor something has to be in order to trigger this HoldObjective.  The default will match any UnrealPawn (which basically means any player or bot in any form).  For some types of objectives (such as vehicle-based ones), you may want to narrow this to a more specific class of actor.

Now, all HoldObjectives need to be associated with a mover of some kind.  It's actually the movement and position of this mover which determines how close to &quot;completed&quot; the objective is (when the mover reaches its end point, the objective has been accomplished).  For simplicity, we'll just create a lever which needs to be flipped, and associate that mover with our HoldObjective, so [[Legacy:Create A Mover|create a mover]] using the Rahnem_Glacier.Base.plunger static mesh, and place it so that it looks like it's attached to the console next to where we put the HoldObjective.  For [[Legacy:Keyframe|keyframe]] 0, rotate it appropriately so it looks like it's in the flipped-up position.  Now set it to [[Legacy:Keyframe|keyframe]] 1, and rotate it so that it's in the flipped-down position (if you're having a bit of trouble with the rotations here, try setting Roll and Yaw both to -16384, and use Pitch to adjust the lever angle).  There, now we have a flippable lever and a HoldObjective, we just need to tie them together.

Go into the HoldObjective's properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* HoldObjective-&gt;MoverTag = CoreObjectiveLever

Now, go into the new mover's properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* Events-&gt;Tag = CoreObjectiveLever
* Events-&gt;Event = CoreObjective
* Object-&gt;InitialState = TriggerAdvance
* Mover-&gt;MoverEncroachType = ME_IgnoreWhenEncroach
* Mover-&gt;MoveTime = The time you want the hold objective to 'last' for

There.  Now, what will happen is this:

# When somebody stands on the HoldObjective, it will send a trigger event to its HoldObjective-&gt;MoverTag, which in this case is our CoreObjectiveLever.
# The lever is set to TriggerAdvance, which means it will start moving when it's triggered, and stop moving when it's untriggered.
# If whoever's standing on the HoldObjective stops standing on it, it will send an untrigger event to the lever, which will cause it to stop moving.
# Once the lever reaches the end of its movement, it will trigger its Events-&gt;Event, which is set to the tag value for our HoldObjective.
# When the HoldObjective gets triggered, it will consider itself &quot;completed&quot; and deactivate itself, accomplishing the goal.
# When the HoldObjective is completed (after the time set in Mover-&gt;MoveTime), in addition to deactivating itself as an objective, it will also trigger its own Events-&gt;Event, which in this case is set to CoreObjectiveCompleted.  You can use this event (in a ScriptedTrigger or elsewhere) to have things happen when this objective has been completed.
# Throughout the whole process, the HUD indicators for the objective which show how close to &quot;completed&quot; it is will all look at the position of the HoldObjective-&gt;MoverTag mover to see how far it is through its movement, and draw that as a percent-completed in all the indicators.

There's only one little factor left:  How do we set how long somebody has to stand on the objective to complete it?  Remember what I said earlier: It's the movement of the mover which determines how &quot;complete&quot; the objective is, so to determine how long it takes to complete the objective, all we need to do is change how long it takes the mover to do its movement.  Go into the lever's properties, and set its Mover-&gt;MoveTime to something appropriate, like say 5.  This will make it so that the attackers have to stand on the HoldObjective for a total amount of 5 seconds before it will be completed (I know it doesn't sound like much, but 5 seconds can be a long time when you're being shot at from all sides)

===Objective Ordering===

Now that we have more than one objective in our map, it's important to talk for a minute about objective ordering.  The game does most of the hard work of objective management for you by automatically progressing from one objective to the next as goals are accomplished by the attackers, but how does it know which objective is &quot;first&quot;, and then which is &quot;next&quot;?

As it turns out, this is all handled by the GameObjective-&gt;DefensePriority property.  All of the GameObjectives in a given level are ordered in descending DefensePriority.  That means that the GameObjective with the highest DefensePriority value is the first objective of the assault, and the one with the lowest DefensePriority is the last one.

This may seem counterintuitive at first, because one would expect the objectives to be numbered in the order they're completed, but think of it this way:  At any point in time, all of the defenders look at all of the active objectives and try to decide which one is the most important one for them to defend.  Obviously, the most important objective to defend is the first one, which the attackers are going to be reaching first, so that objective should have the highest DefensePriority.  If they succeed in defending the first (most important) objective, then they don't need to worry about any of the others.  If they fail to defend that objective and it falls, then they will need to fall back to the next most important one and try to defend that instead.  Based on this logic, the first objective should have the highest DefensePriority, and the last one the lowest.  Because of this, the game also treats the objectives this way when displaying them on the HUD and deciding what the attackers should be going for as well. 

Note that it's also possible (and perfectly legal) to give two objectives the same DefensePriority.  What this does is cause both objectives to be the current objective at the same time, and both will need to be completed before moving on to the next objective.  An example of this is the shield generators in AS-RobotFactory or the ion generator switches in AS-Glacier.  Also note that it doesn't really matter what values you use for DefensePriority, what matters is simply whether one objective's value is higher or lower than another one's.

So, every time you add a new GameObjective, it's a good idea to check all of your DefensePriority settings to make sure they're in the right order.  For our little map here, let's set our new HoldObjective's DefensePriority to 0 and set our earlier door objective's DefensePriority to 1.

==PlayerStart Management==

Ok, everything's all set up for our second objective, and after the door gets blown up, the new HoldObjective becomes the next target for the attackers automatically.  There's still a problem, though:  The defenders are still spawning on the roof, even though they've failed to defend the door, and the attackers are still spawning way back at the beginning, which makes for a long run to get to the power core.  We want to have the spawn points change when the door gets destroyed to reflect the progress that the attackers have made.

The first thing we'll need to do, obviously, is to set up some new PlayerStarts for the defenders back behind the power core.  As before, we've got a fair amount of room, so let's put down 16 of them (8 on each side of the hallway).  Now make sure all of these new PlayerStarts have a TeamNumber of 2, to make them a new group which is separate from either of the previous groups (0 and 1).  (While we're here, you might want to put down a couple of WeaponLockers too, so the defenders have something to shoot with.  (Choice of weapons is left as an exercise for the reader :) ))

Next, we need a PlayerSpawnManager for this new group of PlayerStarts.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Info&gt;&gt;PlayerSpawnManager near the PlayerStarts, and [[Legacy:Set The Following Properties|set the following properties]]:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Defenders
* PlayerSpawnManager-&gt;bEnabled = False
* PlayerSpawnManager-&gt;PlayerStartTeam = 2

Note that we set this one to bEnabled = False.  This is because we don't want this group of PlayerStarts to be active at the start of the game, we only want people to start spawning here once the door has been destroyed and we activate this group.  There is one more property we want to set as well:

* PlayerSpawnManager-&gt;bAllowTeleporting = True

This property indicates that when this group of PlayerStarts becomes active, players will be able to hit the 'Q' key to instantly teleport to the new spawn point, so they don't have to run back from wherever they are to get close to the new objective, which can be very handy and is something you'll usually want to set.

Ok, now we've got the new PlayerSpawn area set up, how do we activate it?  You remember that ScriptedTrigger we set up to generate the explosion when the door blew up?  Well, we can use it for more than just explosions.  First, though, we'll need to give our PlayerSpawnManagers some distinctive tags so we can refer to them in the script.  Go to the new PlayerSpawnManager we just created and set its Events-&gt;Tag to something appropriate, like &quot;DefenderSpawnCore&quot;.  Now go to the original defender PlayerSpawnManager on top of the roof and set its Events-&gt;Tag to &quot;DefenderSpawnDoor&quot;.

Now go back to the ScriptedTrigger for the door and open its properties.  Go to the AIScript-&gt;Actions property, and [[Legacy:Add An Inline Object|add a couple more inline objects]] to the end:

;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = DefenderSpawnCore
;* bEnabled = True
;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = DefenderSpawnDoor
;* bEnabled = False

Now once the door gets blown up, the ScriptedTrigger will automatically enable the new spawn point for the defenders, and disable the old one.  Now what about the Attackers?

Well, we could set up some new PlayerStarts for them too, maybe somewhere near the door... but wait, we've already got some PlayerStarts near the door (the ones the defenders were using).  Too bad we can't just re-use those for the attackers now, right?  Well, as it happens we can.  In fact, all we have to do is create a new PlayerSpawnManager, and set it up as follows:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Attackers
* PlayerSpawnManager-&gt;bEnabled = False
* PlayerSpawnManager-&gt;PlayerStartTeam = 1
* PlayerSpawnManager-&gt;bAllowTeleporting = True

Note that the PlayerStartTeam is set to 1, which means this PlayerSpawnManager uses the same PlayerStarts as the defender PlayerSpawnManager we created originally.  This doesn't cause a problem because, as with the previous one we just set up, this PlayerSpawnManager is set bEnabled = False, which means we won't get attackers and defenders both spawning here as soon as the game starts.  However, now that we have this PlayerSpawnManager set up, this means we can turn on the ability for attackers to spawn here later, when it's appropriate (after we've deactivated the defender PlayerSpawnManager which was using this group).

The only thing that's left is to set up the ScriptedTrigger to change the attacker PlayerSpawnManagers the same as we did for the defenders.  Again, we're going to need our PlayerSpawnManagers to have tag names, so set Events-&gt;Tag on the new one we just created to be &quot;AttackerSpwanCore&quot;, and go back to the old one and set its Events-&gt;Tag to &quot;AttackerSpawnDoor&quot;.  Now in the ScriptedTrigger's AIScript-Actions property, add the following entries to the end of the list:

;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = AttackerSpawnCore
;* bEnabled = True
;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = AttackerSpawnDoor
;* bEnabled = False

There we go!  Now when the first objective is completed, the defenders will automatically fall back to their new spawn point inside the base, and the attackers will be able to start spawning on top of the roof so they won't have to run as far to get inside.

==Critical Objective Volumes, Bot Pathing, Etc.==

Setting up [[Legacy:Bot Pathing|bot pathing]] and [[Legacy:ASCriticalObjectiveVolume|ASCriticalObjectiveVolume]]s and such is pretty much all the same for this objective as it was for our previous one.  It is important to note, however, that critical objective volumes are particularly important for HoldObjectives, because unlike DestroyableObjectives which sound their alert as soon as somebody hits them (from a distance), the first warning you'll get by default from a HoldObjective is when the attacker is already right on top of it, which in many cases is too late to do a lot.

Also, when pathing the second part of our map here, it is worth noting that we will need to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;[[Legacy:BlockedPath|BlockedPath]] at the outer door to tell bots that they can't go that way initially (because the door is there).  Once you've placed the BlockedPath actor (and done whatever you need to to make it fit into the bot path network the way you want), set its Events-&gt;Tag to something appropriate (say, &quot;DoorPath&quot;), and then go to the ScriptedTrigger's AIScript-&gt;Actions property again and add another action:

; Action_TRIGGEREVENT:
;* Event = DoorPath

Thus, when the door gets destroyed, in addition to showing the explosion and rearranging the spawn points, it will also unblock the path through the door so the bots know they can go that way now.

==Ending the Round==

So now we've got our whole (short) assault put together.  The attackers come around the valley, blow up the door, infiltrate the base, make their way to the power core, and set it to overload, and they win!  But wait, something's wrong here: They don't actually win.  Sure, all the objectives get completed, but then the game just keeps going until the timer finishes counting down, with nothing left for anybody to accomplish.  We need to make the game end the round when the last objective is completed, so that the attackers can celebrate their success, and the defenders will get a try at things.

In Assault, ending the round is accomplished using a [[Legacy:Trigger_ASRoundEnd|Trigger_ASRoundEnd]] actor.  One of the last things we need to do before this map will be complete, therefore, is to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Triggers&gt;&gt;Trigger_ASRoundEnd to the map.  It doesn't really matter where you put it, but it's generally a good idea to put it somewhere near the last objective so it's easy to find later.  The Trigger_ASRoundEnd actor is very easy to use.  Simply set its Events-&gt;Tag property to some appropriate name (I usually use something obvious like &quot;RoundEnd&quot;), and then set that event up to be triggered when the last objective is completed (you can either do this by just setting that name in the last objective's Events-&gt;Event property or, assuming you want to have other things (explosions, etc) happen when the objective is completed, simply add an Action_TRIGGEREVENT action to the appropriate ScriptedTrigger to trigger the &quot;RoundEnd&quot; event along with everything else).

There's just one other little detail left, which you may have noticed.  When the round ends, the default behavior for the game is to switch to a camera view of the current objective, which you can rotate around.  Often, however, the default ending view for an objective isn't in the right place, or doesn't show the best scene, and you might wish to change it.  In fact, when the game ends while people are still attacking the base door, the default view in our map isn't really ideal, so let's change that.  Here's how we go about it:

First, we need to set up an [[Legacy:ASCinematic_Camera|ASCinematic_Camera]] to indicate where the view should be located and what it should be pointing at.  To do this, [[Legacy:Add An Actor|add an Actor]]&gt;&gt;ASCinematic_Camera to the map where you would like it, and rotate it appropriately.  An easy way to get the placement and rotation the way you'd like it is to position your 3D view in the editor the way you want the camera's view to be, then find your editor camera (the little eye icon) in one of the 2D views, right-click on it, and bring up its properties.  Note down the Movement-&gt;Location and Movement-&gt;Rotation values, and then when you create your ASCinematic_Camera, simply type in those same values for it.

Now to associate it with the game objective.  Go into the ASCinematic_Camera's properties and set its Events-&gt;Tag to some appropriate value such as, say, BaseDoorCamera.  Now open up the properties for our base door DestroyableObjective_SM, and set its Assault-&gt;EndCameraTag to the same value.  Now whenever the round ends while the base door is the active objective, it will show a view from our new camera position instead of the default.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
    <revision>
      <id>1559</id>
      <timestamp>2006-07-15T18:38:12Z</timestamp>
      <contributor>
        <ip>66-239-63-229.starstream.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

----

==Continuing the Assault==

So now we have a pretty complete first objective, including reasonably sophisticated bot attacking and defending behaviors, objective warnings, and all that good stuff.  The attackers come over the hill, they fight their way through the opposition, eventually blow up the door, and then proceed triumphantly through the doorway and ...off the edge of the world.  Hmm..  Looks like it's time to build the rest of our map, huh?

The next logical objective from our backstory is for our heroes to proceed into the depths of the base, presumably navigate through a few hallways, and find themselves at the power core, which they will then need to trigger to overload somehow.  As mentioned before, it can add some interest and strategy to a game when there's more than one way to reach an objective, so let's build our base symmetrically, with a path on either side leading to a central chamber for the power core.

From my planning stage, I've already done some thinking about the rest of the assault, and so it happens I've already made a sketch for this stage of things as well, which looks something like this:

[[Image:Legacy_astut-sketch2.png|center|]]

Note here that I've planned things so that the defenders will start out behind the objective and need to come forward past it to meet the attackers.  This is often a good idea for a couple of reasons:

* It reduces the likelihood that defenders who aren't intimately familiar with the map will get confused about what's where and which direction they should be heading:  There's only one way to go, and it takes you to both the objective and the direction the attackers are coming from.
* It keeps the defender spawn point out of the middle of the combat.  This both means that defenders probably won't spawn right on top of a rocket blast, and also means that attackers don't have the problem of that guy they just killed suddenly respawning behind them and blowing them away.
* It makes some logical sense (and things that make sense always make a level more intuitive to play).  Defenders are going to be coming out from the deeper levels of things to meet the attack, they don't suddenly appear in the middle of attacker-held territory.

Again, I'm not going to bore you with a lot of basic mapbuilding details here.  Let's just assume we've built this part of the map for now, and we've got a few hallways leading to a central room with a power core:

[[Image:Legacy_astut-inside.jpeg|center|]]

==Adding a HoldObjective==

Ok, so we've got a power core, and some routes to it, now we need something to do when the attackers get there.  For this part of things, we'll use a different kind of objective known as a [[Legacy:HoldObjective|HoldObjective]].  As the name implies, a HoldObjective is simply one that an attacker must touch and &quot;hold&quot; (by continuing to touch it) for a certain amount of time in order to complete it (the most common way that HoldObjectives are represented in Assault maps is as levers that need to be pulled).

We'll set up some sort of a console in front of the power core which the attackers will need to get to long enough to do whatever one does to start an overload in a power core.  Start by [[Legacy:Add A Static Mesh|adding a Static Mesh]] for a console (something like, say, AlleriaHardware.Miscellaneous.pConsoleA01AL) a little bit in front of the power core (if you're using that console mesh, you'll need something for the back of it too.  I used AlleriaHardware.Miscellaneous.RingCon01AL for that).

Now we need the actual objective.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;JumpDest&gt;&gt;JumpSpot&gt;&gt;GameObjective&gt;&gt;ProximityObjective&gt;&gt;HoldObjective to the map, and place it right in front of the console we just placed.  This is where we'll want people to stand to trigger the objective.  Make sure it's placed so that its collision cylinder is resting on the ground (this will ensure that the objective effects show up in the right place).  Since the HoldObjective just shows up as an icon in the editor, to do this part of things, it often helps to select [[Legacy:Radii View|Radii View]] in the 3D viewport to get an idea of what the collision cylinder for the HoldObjective is.  Next, open the HoldObjective's properties window, and [[Legacy:Set The Following Properties|set the following properties]]:

* Events-&gt;Tag = CoreObjective
* Events-&gt;Event = CoreObjectiveCompleted
* GameObjective-&gt;ObjectiveName = the Power Core
* GameObjective-&gt;LocationPrefix = Near
* GameObjective-&gt;LocationPostfix = 
* GameObjective-&gt;Score = 10
* Assault-&gt;DrawDistThresHold = 0
* Assault-&gt;Objective_Info_Attacker = Trigger an Overload in the Power Core
* Assault-&gt;Objective_Info_Defender = Defend the Power Core
* Assault-&gt;ObjectiveDescription = Flip the Lever to Trigger an Overload
* GameObjective-&gt;DestructionMessage = Power Core Overload Sequence Activated!

(For those who don't remember, all of the above properties are explained in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]])  There are also a couple of additional properties specific to HoldObjectives which you'll want to set:

; HoldObjective-&gt;bLocationFX = True: This will cause the HoldObjective to display a flashing indicator where it's located in the map indicating that players should &quot;stand here&quot;.
; ProximityObjective-&gt;ConstraintPawnClass = UnrealPawn: (this is the default) This specifies what type of actor something has to be in order to trigger this HoldObjective.  The default will match any UnrealPawn (which basically means any player or bot in any form).  For some types of objectives (such as vehicle-based ones), you may want to narrow this to a more specific class of actor.

Now, all HoldObjectives need to be associated with a mover of some kind.  It's actually the movement and position of this mover which determines how close to &quot;completed&quot; the objective is (when the mover reaches its end point, the objective has been accomplished).  For simplicity, we'll just create a lever which needs to be flipped, and associate that mover with our HoldObjective, so [[Legacy:Create A Mover|create a mover]] using the Rahnem_Glacier.Base.plunger static mesh, and place it so that it looks like it's attached to the console next to where we put the HoldObjective.  For [[Legacy:Keyframe|keyframe]] 0, rotate it appropriately so it looks like it's in the flipped-up position.  Now set it to [[Legacy:Keyframe|keyframe]] 1, and rotate it so that it's in the flipped-down position (if you're having a bit of trouble with the rotations here, try setting Roll and Yaw both to -16384, and use Pitch to adjust the lever angle).  There, now we have a flippable lever and a HoldObjective, we just need to tie them together.

Go into the HoldObjective's properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* HoldObjective-&gt;MoverTag = CoreObjectiveLever

Now, go into the new mover's properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* Events-&gt;Tag = CoreObjectiveLever
* Events-&gt;Event = CoreObjective
* Object-&gt;InitialState = TriggerAdvance
* Mover-&gt;MoverEncroachType = ME_IgnoreWhenEncroach
* Mover-&gt;MoveTime = The time you want the hold objective to 'last' for

There.  Now, what will happen is this:

# When somebody stands on the HoldObjective, it will send a trigger event to its HoldObjective-&gt;MoverTag, which in this case is our CoreObjectiveLever.
# The lever is set to TriggerAdvance, which means it will start moving when it's triggered, and stop moving when it's untriggered.
# If whoever's standing on the HoldObjective stops standing on it, it will send an untrigger event to the lever, which will cause it to stop moving.
# Once the lever reaches the end of its movement, it will trigger its Events-&gt;Event, which is set to the tag value for our HoldObjective.
# When the HoldObjective gets triggered, it will consider itself &quot;completed&quot; and deactivate itself, accomplishing the goal.
# When the HoldObjective is completed (after the time set in Mover-&gt;MoveTime), in addition to deactivating itself as an objective, it will also trigger its own Events-&gt;Event, which in this case is set to CoreObjectiveCompleted.  You can use this event (in a ScriptedTrigger or elsewhere) to have things happen when this objective has been completed.
# Throughout the whole process, the HUD indicators for the objective which show how close to &quot;completed&quot; it is will all look at the position of the HoldObjective-&gt;MoverTag mover to see how far it is through its movement, and draw that as a percent-completed in all the indicators.

There's only one little factor left:  How do we set how long somebody has to stand on the objective to complete it?  Remember what I said earlier: It's the movement of the mover which determines how &quot;complete&quot; the objective is, so to determine how long it takes to complete the objective, all we need to do is change how long it takes the mover to do its movement.  Go into the lever's properties, and set its Mover-&gt;MoveTime to something appropriate, like say 5.  This will make it so that the attackers have to stand on the HoldObjective for a total amount of 5 seconds before it will be completed (I know it doesn't sound like much, but 5 seconds can be a long time when you're being shot at from all sides)

===Objective Ordering===

Now that we have more than one objective in our map, it's important to talk for a minute about objective ordering.  The game does most of the hard work of objective management for you by automatically progressing from one objective to the next as goals are accomplished by the attackers, but how does it know which objective is &quot;first&quot;, and then which is &quot;next&quot;?

As it turns out, this is all handled by the GameObjective-&gt;DefensePriority property.  All of the GameObjectives in a given level are ordered in descending DefensePriority.  That means that the GameObjective with the highest DefensePriority value is the first objective of the assault, and the one with the lowest DefensePriority is the last one.

This may seem counterintuitive at first, because one would expect the objectives to be numbered in the order they're completed, but think of it this way:  At any point in time, all of the defenders look at all of the active objectives and try to decide which one is the most important one for them to defend.  Obviously, the most important objective to defend is the first one, which the attackers are going to be reaching first, so that objective should have the highest DefensePriority.  If they succeed in defending the first (most important) objective, then they don't need to worry about any of the others.  If they fail to defend that objective and it falls, then they will need to fall back to the next most important one and try to defend that instead.  Based on this logic, the first objective should have the highest DefensePriority, and the last one the lowest.  Because of this, the game also treats the objectives this way when displaying them on the HUD and deciding what the attackers should be going for as well. 

Note that it's also possible (and perfectly legal) to give two objectives the same DefensePriority.  What this does is cause both objectives to be the current objective at the same time, and both will need to be completed before moving on to the next objective.  An example of this is the shield generators in AS-RobotFactory or the ion generator switches in AS-Glacier.  Also note that it doesn't really matter what values you use for DefensePriority, what matters is simply whether one objective's value is higher or lower than another one's.

So, every time you add a new GameObjective, it's a good idea to check all of your DefensePriority settings to make sure they're in the right order.  For our little map here, let's set our new HoldObjective's DefensePriority to 0 and set our earlier door objective's DefensePriority to 1.

==PlayerStart Management==

Ok, everything's all set up for our second objective, and after the door gets blown up, the new HoldObjective becomes the next target for the attackers automatically.  There's still a problem, though:  The defenders are still spawning on the roof, even though they've failed to defend the door, and the attackers are still spawning way back at the beginning, which makes for a long run to get to the power core.  We want to have the spawn points change when the door gets destroyed to reflect the progress that the attackers have made.

The first thing we'll need to do, obviously, is to set up some new PlayerStarts for the defenders back behind the power core.  As before, we've got a fair amount of room, so let's put down 16 of them (8 on each side of the hallway).  Now make sure all of these new PlayerStarts have a TeamNumber of 2, to make them a new group which is separate from either of the previous groups (0 and 1).  (While we're here, you might want to put down a couple of WeaponLockers too, so the defenders have something to shoot with.  (Choice of weapons is left as an exercise for the reader :) ))

Next, we need a PlayerSpawnManager for this new group of PlayerStarts.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Info&gt;&gt;PlayerSpawnManager near the PlayerStarts, and [[Legacy:Set The Following Properties|set the following properties]]:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Defenders
* PlayerSpawnManager-&gt;bEnabled = False
* PlayerSpawnManager-&gt;PlayerStartTeam = 2

Note that we set this one to bEnabled = False.  This is because we don't want this group of PlayerStarts to be active at the start of the game, we only want people to start spawning here once the door has been destroyed and we activate this group.  There is one more property we want to set as well:

* PlayerSpawnManager-&gt;bAllowTeleporting = True

This property indicates that when this group of PlayerStarts becomes active, players will be able to hit the 'Q' key to instantly teleport to the new spawn point, so they don't have to run back from wherever they are to get close to the new objective, which can be very handy and is something you'll usually want to set.

Ok, now we've got the new PlayerSpawn area set up, how do we activate it?  You remember that ScriptedTrigger we set up to generate the explosion when the door blew up?  Well, we can use it for more than just explosions.  First, though, we'll need to give our PlayerSpawnManagers some distinctive tags so we can refer to them in the script.  Go to the new PlayerSpawnManager we just created and set its Events-&gt;Tag to something appropriate, like &quot;DefenderSpawnCore&quot;.  Now go to the original defender PlayerSpawnManager on top of the roof and set its Events-&gt;Tag to &quot;DefenderSpawnDoor&quot;.

Now go back to the ScriptedTrigger for the door and open its properties.  Go to the AIScript-&gt;Actions property, and [[Legacy:Add An Inline Object|add a couple more inline objects]] to the end:

;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = DefenderSpawnCore
;* bEnabled = True
;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = DefenderSpawnDoor
;* bEnabled = False

Now once the door gets blown up, the ScriptedTrigger will automatically enable the new spawn point for the defenders, and disable the old one.  Now what about the Attackers?

Well, we could set up some new PlayerStarts for them too, maybe somewhere near the door... but wait, we've already got some PlayerStarts near the door (the ones the defenders were using).  Too bad we can't just re-use those for the attackers now, right?  Well, as it happens we can.  In fact, all we have to do is create a new PlayerSpawnManager, and set it up as follows:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Attackers
* PlayerSpawnManager-&gt;bEnabled = False
* PlayerSpawnManager-&gt;PlayerStartTeam = 1
* PlayerSpawnManager-&gt;bAllowTeleporting = True

Note that the PlayerStartTeam is set to 1, which means this PlayerSpawnManager uses the same PlayerStarts as the defender PlayerSpawnManager we created originally.  This doesn't cause a problem because, as with the previous one we just set up, this PlayerSpawnManager is set bEnabled = False, which means we won't get attackers and defenders both spawning here as soon as the game starts.  However, now that we have this PlayerSpawnManager set up, this means we can turn on the ability for attackers to spawn here later, when it's appropriate (after we've deactivated the defender PlayerSpawnManager which was using this group).

The only thing that's left is to set up the ScriptedTrigger to change the attacker PlayerSpawnManagers the same as we did for the defenders.  Again, we're going to need our PlayerSpawnManagers to have tag names, so set Events-&gt;Tag on the new one we just created to be &quot;AttackerSpwanCore&quot;, and go back to the old one and set its Events-&gt;Tag to &quot;AttackerSpawnDoor&quot;.  Now in the ScriptedTrigger's AIScript-Actions property, add the following entries to the end of the list:

;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = AttackerSpawnCore
;* bEnabled = True
;ACTION_ASSetPlayerSpawnArea:
;* PlayerSpawnManagerTag = AttackerSpawnDoor
;* bEnabled = False

There we go!  Now when the first objective is completed, the defenders will automatically fall back to their new spawn point inside the base, and the attackers will be able to start spawning on top of the roof so they won't have to run as far to get inside.

==Critical Objective Volumes, Bot Pathing, Etc.==

Setting up [[Legacy:Bot Pathing|bot pathing]] and [[Legacy:ASCriticalObjectiveVolume|ASCriticalObjectiveVolume]]s and such is pretty much all the same for this objective as it was for our previous one.  It is important to note, however, that critical objective volumes are particularly important for HoldObjectives, because unlike DestroyableObjectives which sound their alert as soon as somebody hits them (from a distance), the first warning you'll get by default from a HoldObjective is when the attacker is already right on top of it, which in many cases is too late to do a lot.

Also, when pathing the second part of our map here, it is worth noting that we will need to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;[[Legacy:BlockedPath|BlockedPath]] at the outer door to tell bots that they can't go that way initially (because the door is there).  Once you've placed the BlockedPath actor (and done whatever you need to to make it fit into the bot path network the way you want), set its Events-&gt;Tag to something appropriate (say, &quot;DoorPath&quot;), and then go to the ScriptedTrigger's AIScript-&gt;Actions property again and add another action:

; Action_TRIGGEREVENT:
;* Event = DoorPath

Thus, when the door gets destroyed, in addition to showing the explosion and rearranging the spawn points, it will also unblock the path through the door so the bots know they can go that way now.

==Ending the Round==

So now we've got our whole (short) assault put together.  The attackers come around the valley, blow up the door, infiltrate the base, make their way to the power core, and set it to overload, and they win!  But wait, something's wrong here: They don't actually win.  Sure, all the objectives get completed, but then the game just keeps going until the timer finishes counting down, with nothing left for anybody to accomplish.  We need to make the game end the round when the last objective is completed, so that the attackers can celebrate their success, and the defenders will get a try at things.

In Assault, ending the round is accomplished using a [[Legacy:Trigger_ASRoundEnd|Trigger_ASRoundEnd]] actor.  One of the last things we need to do before this map will be complete, therefore, is to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Triggers&gt;&gt;Trigger_ASRoundEnd to the map.  It doesn't really matter where you put it, but it's generally a good idea to put it somewhere near the last objective so it's easy to find later.  The Trigger_ASRoundEnd actor is very easy to use.  Simply set its Events-&gt;Tag property to some appropriate name (I usually use something obvious like &quot;RoundEnd&quot;), and then set that event up to be triggered when the last objective is completed (you can either do this by just setting that name in the last objective's Events-&gt;Event property or, assuming you want to have other things (explosions, etc) happen when the objective is completed, simply add an Action_TRIGGEREVENT action to the appropriate ScriptedTrigger to trigger the &quot;RoundEnd&quot; event along with everything else).

There's just one other little detail left, which you may have noticed.  When the round ends, the default behavior for the game is to switch to a camera view of the current objective, which you can rotate around.  Often, however, the default ending view for an objective isn't in the right place, or doesn't show the best scene, and you might wish to change it.  In fact, when the game ends while people are still attacking the base door, the default view in our map isn't really ideal, so let's change that.  Here's how we go about it:

First, we need to set up an [[Legacy:ASCinematic_Camera|ASCinematic_Camera]] to indicate where the view should be located and what it should be pointing at.  To do this, [[Legacy:Add An Actor|add an Actor]]&gt;&gt;ASCinematic_Camera to the map where you would like it, and rotate it appropriately.  An easy way to get the placement and rotation the way you'd like it is to position your 3D view in the editor the way you want the camera's view to be, then find your editor camera (the little eye icon) in one of the 2D views, right-click on it, and bring up its properties.  Note down the Movement-&gt;Location and Movement-&gt;Rotation values, and then when you create your ASCinematic_Camera, simply type in those same values for it.

Now to associate it with the game objective.  Go into the ASCinematic_Camera's properties and set its Events-&gt;Tag to some appropriate value such as, say, BaseDoorCamera.  Now open up the properties for our base door DestroyableObjective_SM, and set its Assault-&gt;EndCameraTag to the same value.  Now whenever the round ends while the base door is the active objective, it will show a view from our new camera position instead of the default.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==

Bcaseb: wait, when adding the holdobjective, it says to edit the mover properties. i made the 2 keyframes for the switch, but how the heck do i edit it as a mover? its a bit confusing.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Creating A Destroyable Objective</title>
    <id>485</id>
    <revision>
      <id>1550</id>
      <timestamp>2005-01-14T02:35:49Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Getting Started]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]'''

----

==Creating a Destroyable Objective==

As you might notice from the map creation directions, or from looking at the map itself, this base isn't that hard to get into.  It doesn't even have a door!  Our first objective in this tutorial, therefore, is going to be a destroyable door, that will (try to) protect the entrance to the stronghold.

There are a couple of different ways we can do destroyable objectives, but the one which is almost always what we'll want to use is a [[Legacy:DestroyableObjective_SM|DestroyableObjective_SM]], which uses the flexibility of static meshes to automatically adjust its representation within the world it inhabits.

==DestroyableObjective_SM==

The first step is to [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;NavigationPoint&gt;&gt;JumpDest&gt;&gt;JumpSpot&gt;&gt;GameObjective&gt;&gt;DestroyableObjective&gt;&gt;DestroyableObjective_SM.  This actor combines several different functions in one convenient package:
* It's a [[Legacy:GameObjective|GameObjective]].  GameObjectives do several things:
** They have text strings which display on the HUD directing people to attack or defend them when the time comes.
** They automatically draw the little flashing HUD displays indicating where they are, how close to completion they are, and whether they're under attack at the moment.
** Bots automatically know when GameObjectives need to be attacked or defended, and will act accordingly.
* The DestroyableObjective_SM shows a static mesh, just like a [[Legacy:StaticMesh|StaticMesh]] actor does.  Moreover, when this objective is the active one, this mesh will flash on the screen in addition to the HUD icon, showing players where they should be shooting.
* When the objective is destroyed, the DestroyableObjective_SM will also automatically change its static mesh to another one (generally, one that looks like a blown-up version of whatever it's supposed to be).

As you can see, the actor already does most of the work for us, there are only a few things we'll need to fiddle with.  First, we'll deal with the properties which apply to any objective you might place in your map.  Open the properties window for the new actor and [[Legacy:Set The Following Properties|set the following properties]]:

; Events-&gt;Tag = BaseDoor: This property is used in many places, so you should generally make it something descriptive and easy to remember.
; GameObjective-&gt;ObjectiveName = the Base Door: This is used to print location messages, so make it something that makes sense to a human.
; GameObjective-&gt;LocationPrefix = Near: This is the text that's printed in front of the ObjectiveName when describing where somebody is (i.e. &quot;Near the Base Door&quot;).
; GameObjective-&gt;LocationPostfix = : This is the text that's printed after the ObjectiveName in location descriptions (for example, we might put &quot;area&quot; for &quot;the Base Door area&quot;).  We'll just leave it at the default empty string.
; GameObjective-&gt;Score = 10: How many points are awarded to the attacker who completes this objective?
; Assault-&gt;DrawDistThresHold = 0: How close does an attacker have to be for the game to show the crosshairs and health bar of this objective (when it's visible) instead of the triangular icon?  (0 means it's always shown as soon as the objective becomes visible, no matter how far away it is).
; Assault-&gt;Objective_Info_Attacker = Penetrate the Base's Outer Defenses: The message shown on the screen to attackers when this is the active objective.
; Assault-&gt;Objective_Info_Defender = Prevent the Attackers from Infiltrating the Base: The message shown to defenders when this is the active objective.
; Assault-&gt;ObjectiveDescription = Destroy the door to enter the base: A brief message of what people need to do to accomplish this goal.
; GameObjective-&gt;DestructionMessage = Base Outer Defenses Breached!: The message displayed to both sides when the objective has been completed.

Now for the bits which are specific to the DestroyableObjective_SM class.  You've probably already noticed that this actor starts out with a default untextured box mesh, which we will want to change.  For our purposes, we'll just borrow from RobotFactory, which has a nice door mesh we can use (and more importantly, a destroyed version we can use for the destroyed mesh).  This mesh can be found in the Plutonic_BP2_static package as Door.FactoryGateDoor, so go into the DestroyableObjective_SM actor's properties and [[Legacy:Set The Resource Property|set the resource property]] Display-&gt;StaticMesh to Plutonic_BP2_static.Door.FactoryGateDoor.

As you might notice, the door from RobotFactory is a bit large for our purposes, so we'll scale it down to about half size by setting the Display-&gt;DrawScale property to 0.55.  Now we can position it into place over the entrance to the base.  It's still a bit taller than we need, but that's ok.  Just move it down so the top of the door meets the top of the door frame, and we'll let the extra stay hidden under the floor.

Next, we need to set the destroyed version.  The destroyed version of the factory door from RobotFactory is Plutonic_BP2_static.Factory.door_destroyed, so in the DestroyableObjective_SM Properties, simply [[Legacy:Set The Resource Property|set the resource property]] DestroyableObjective_SM-&gt;DestroyedStaticMesh to Plutonic_BP2_static.Factory.door_destroyed.  That was easy, wasn't it?

Now would be a good time to check to make sure that our door will look right when it's been blown up.  When the destroyable objective is destroyed, it simply changes the Display-&gt;StaticMesh it's using to the value of DestroyableObjective_SM-&gt;DestroyedStaticMesh instead, so we can do the same thing in the editor to check how it will look.  Just temporarily set Display-&gt;StaticMesh to Plutonic_BP2_static.Factory.door_destroyed and take a look.  The particularly astute here will notice that something doesn't look right.  The destroyed door actually doesn't line up the same way as the normal one does.

Did we do something wrong?  Nope.  Believe it or not, Epic screwed up, and if you look closely at RobotFactory while you're playing it, it has the same problem.  The origin of the destroyed door mesh is at the bottom, but the origin of the regular door mesh is in the center, so they don't line up.  This illustrates an important point when designing meshes for destroyable objectives:  Make sure their origins match up, because you can't adjust this in the actor.  Also note that since the actor just changes the setting for the Display-&gt;StaticMesh property when it gets destroyed, all of the other settings will be applied to the different mesh as well.  This means, for example, that any skins you use in Display-&gt;Skins to change the appearance of the original mesh will also be applied to the destroyed mesh when it gets put in place, so if you're going to use your own skins, you'll need to make sure that the two meshes map their textures in compatible ways.

In any case, the glitch with the destroyed door mesh is annoying, but we'll leave it for now.  For a more polished level, you'll probably want to make sure things like this are fixed (by creating your own meshes correctly, or by loading up the broken mesh in a 3D modeller, adjusting the origin, and saving the fixed version in your own package to use instead (Remember: as tempting as it may be, [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]])).  Anyway, moving along...

The last thing we need to do is to tell the game how much punishment our door will be able to take before finally giving up the ghost.  This is done by setting the DestroyableObjective-&gt;DamageCapacity property to the amount of damage it can take.  For our purposes, let's set it to about 2000, which should be enough to make somebody with a rocket launcher work a bit, but still not be impossibly tough to get through.

In general, there are a couple of other properties one may want to fiddle with as well:

;DestroyableObjective-&gt;AIShootOffset: This determines where bots will aim when trying to shoot this objective, relative to its origin.  For our purposes here, (0,0,0) is fine, since that's roughly the middle of the door, but if the origin of your static mesh isn't actually in the mesh, or there's something else covering that part of it, you may want to ajust this so the bots know to shoot some other part of it instead.  (Note that the crosshairs displayed to players when they approach the objective are always shown at (0,0,0), and as far as I know that can't be changed, so you will generally want to put the mesh's origin where you want people to shoot anyway, so that it looks right to human players)
;DestroyableObjective-&gt;DamageEventThreshold:
;DestroyableObjective-&gt;TakeDamageEvent: These allow you to set a threshold at which the objective will trigger an event once it has taken a certain amount of damage, but before it actually gets to the point of blowing up.  This can be used, for example, to trigger an &quot;almost destroyed&quot; warning, or to make things look more damaged as the attackers get closer to actually breaking through.

There, we now have a door which can be blown up by the attackers as one of the objectives for the assault.  Go ahead and fire up the game and give it a try!

==Explosions==

Ok, so we've got our door, and we can blow it up, and the game takes care of all the proper objectivey things like announcing it and showing it on the HUD and so forth, but there's still something missing.  When the door gets blown up, sure, the mesh changes to a blown up version, but that's it.  In the words of Marvin the Martian, &quot;Where's the kaboom?!  There's supposed to be an earth-shattering kaboom!&quot;

Obviously, we're going to want to make some things happen when the door goes kablooey.  All GameObjectives will trigger their Events-&gt;Event when they have been completed (in this case, when the door's been destroyed), so go into the properties for the DestroyableObjective_SM object, and set the Events-&gt;Event property to some appropriate name, let's say &quot;DoorDestroyed&quot;.  Now we'll use a [[Legacy:ScriptedTrigger|ScriptedTrigger]] to perform a few different actions for us when that event gets triggered.  [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Keypoint&gt;&gt;AIScript&gt;&gt;ScriptedSequence&gt;&gt;ScriptedTrigger to the map near the door (so it's easy to find), bring up its properties, and [[Legacy:Add An Inline Object|add an inline object]] or three to the AIScript-&gt;Actions property to define what this ScriptedTrigger should do.  We'll want something along the following lines:

;Action_WAITFOREVENT:
;* ExternalEvent = DoorDestroyed
;Action_TRIGGEREVENT:
;* Event = DoorExplosion
;ACTION_PlayExplosionSound:
;* SoundEmitterActorTag = BaseDoor
;* SoundVolumeScale = 2.0
;* SoundRadiusScale = 1.0
;* SoundPitchScale = 1.0

This will trigger the explosion event, and play the explosion sound.  Note that the SoundEmitterActorTag in the ACTION_PlayExplosionSound action is the same as the tag we gave to the door objective earlier.  This means that the explosion will sound like it's coming from that object.  Now, for the actual explosion, we'll do two things:  We'll need to set up an [[Legacy:Emitter|Emitter]] to show the visual explosion, and we'll also create a [[Legacy:ViewShaker|ViewShaker]] actor to shake the camera a bit, to give it a bit of &quot;oomph&quot;.  But wait a minute, there's a problem here..

We could just create the Emitter and the ViewShaker, and set their tags to &quot;DoorExplosion&quot;, so they get triggered by the ScriptedTrigger.  In fact, this would work fine, in single-player mode.  Unfortunately, this doesn't work in network play.  It turns out that in client-server mode, ScriptedTriggers only run on the server.  Things like Emitters and ViewShakers, on the other hand, only run on the clients, so we need some way for the ScriptedTrigger on the server to trigger an event on the clients to show the explosion.  The answer to this is a [[Legacy:NetworkTrigger|NetworkTrigger]].

NetworkTriggers are very easy to use.  Simply [[Legacy:Add An Actor|add an Actor]]&gt;&gt;NetworkTrigger to the map (doesn't matter where, but let's keep it close to the ScriptedTrigger), and set its Events-&gt;Tag to &quot;DoorExplosion&quot; (the event that happens on the server).  Then, set its Events-&gt;Event to &quot;DoorExplosionClient&quot; (an event we want to happen on the client side).  Now whenever the server triggers a DoorExplosion event, the NetworkTrigger will trigger a DoorExplosionClient event on the client side of things.

Now [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Emitter and place it just a little bit in front of the door.  Open up its properties, and set its Events-&gt;Tag to &quot;DoorExplosionClient&quot;.  Now, go to Emitter-&gt;Emitters and [[Legacy:Add An Inline Object|add an inline object]] of a new [[Legacy:SpriteEmitter|SpriteEmitter]].  In the new SpriteEmitter, you'll want to set the following properties:

* Color-&gt;Opacity = 0.4
* Fading-&gt;FadeOut = True
* Fading-&gt;FadeOutStartTime = 0.5
* Local-&gt;Disabled = True
* Local-&gt;RespawnDeadParticles = False
* Location-&gt;StartLocationShape = PTLS_Sphere
* Location-&gt;SphereRadiusRange = (Min=-300, Max=300)
* Size-&gt;UseSizeScale = True
* Size-&gt;UseRegularSizeScale = False
* Size-&gt;SizeScale[0] = (RlativeSize=10, RelativeTime=1)
* Spawning-&gt;InitialParticlesPerSecond = 10
* Texture-&gt;Texture = Texture'VMParticleTextures.TankFiringP.CloudParticleOrangeBMPtex'
* Texture-&gt;TextureUSubdivisions = 4
* Texture-&gt;TextureVSubdivisions = 4
* Texture-&gt;UseRandomSubdivision = True
* Time-&gt;LifetimeRange = (Min=1, Max=1)

This will create a visual blast when the door is destroyed.  Obviously, we could get a lot more sophisticated than this, including making a few smaller explosions around the area, varying the colors, making smoke, and throwing door bits around with a [[Legacy:MeshEmitter|MeshEmitter]] if we wanted to, but this isn't a tutorial on Emitters, so we'll leave that as an exercise for another time. 

Now we need to [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Triggers&gt;&gt;ViewShaker.  Place it next to the emitter, open its properties, and set its Events-&gt;Tag property to &quot;DoorExplosionClient&quot;.  We could also customize what sort of shaking to produce by modifying the other properties under the ViewShaker section of the properties window, but for now the defaults will work fine.

We now have a door that goes &quot;Boom!&quot; like any respectable door should when it gets blown up.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
    <revision>
      <id>1551</id>
      <timestamp>2005-01-13T23:24:32Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Creating Tutorial Valley</title>
    <id>484</id>
    <revision>
      <id>1548</id>
      <timestamp>2006-07-02T11:56:55Z</timestamp>
      <contributor>
        <ip>81-227-246-156-o1038.telia.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For those following along on the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] who want to build the tutorial map themselves (or are just curious how it was done), here are the steps needed to build our cozy little place I like to call &quot;Tutorial Valley&quot;.  After following these steps you should have something pretty close to the example map (which is also available for download.  See the link from the main page of the tutorial).

Anyway, the steps are as follows:

# Set the 3D view to Textured mode.  This will make it easier to see what we're doing before lights are added.
# [[Legacy:Subtract A Space|Subtract a Space]] of size 8192x8192, height 4096.  (It doesn't matter what texture you give it, because we'll be setting all the walls to &quot;Fake Backdrop&quot; for a skybox later anyway.  In these situations I like to use something semi-transparent like Editor.MaterialArrow to remind me that these walls are there, but they aren't &quot;real&quot;)
# [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Info&gt;&gt;[[Legacy:ZoneInfo|ZoneInfo]] to the subtracted space (doesn't really matter where; I like to put it near the center).
# Add a terrain using [[Legacy:Terrain Mode|Terrain Mode]].  Make the terrain 128x128 in size.  Place the new TerrainInfo actor in the center of the subtracted space.  (note that by using the Terrain Tool to create the terrain, it automagically sets TerrainZone to true in the ZoneInfo we just added, which is good, because we'll need that)
# Choose an appropriate dirt texture (say AbbaddonTerrain.ground.dirt01GO) in the Texture Browser, and then add a base layer to the new terrain using Terrain Mode tool.  Be sure that the &quot;Alpha Fill&quot; setting in the new layer window is set to white (255,255,255).  (if you now [[Legacy:Rebuild|rebuild]] the map, a flat terrain should appear covering the entire width and depth of the subtracted space.  If it doesn't, double-check the TerrainZone setting in the ZoneInfo, and make sure the 3D view is set to Textured mode instead of Dynamic Lighting.)
# Use the Paint and Smoothing tools in the Terrain Mode window to shape the terrain into a curved valley, with hilly peaks all around.
# Choose an appropriate grass-like texture in the Texture Browser and create a second layer.  This time, set the &quot;Alpha Fill&quot; setting to black (0,0,0) (this will cause the layer to be initially completely hidden).  Use the Paint tool from the Terrain window to paint the grass texture over the floor of the valley.  (Use a little bit of variation, in the real world, grass doesn't all grow uniformally)  [Note: There is apparently no actual &quot;grass&quot; texture shipped in any of the modules of the entire UT2004 game.  I had to create my own (by taking the &quot;ground.moss01ar&quot; texture from the &quot;ArboreaTerrain&quot; package, loading it into a paint program, adjusting the color to be greener, and blurring it slightly).  You can just use the moss01ar texture itself (as many maps apparently do for grass), but it won't look as good.]
# Choose a rock texture (such as AbaddonTerrain.ground.flr18go) and create another layer for the Terrain.  Again, set the initial alpha fill to black (0,0,0).  Paint this texture over the hills and peaks surrounding the valley.
# Open the Static Mesh Browser and load the &quot;ArboreaHardware&quot; package.  Select the Organics.ArbGrassA static mesh.  Go to the Terrain Mode window and create a new decoration layer using this mesh.  '''Tip:''' We could create a new alphamap for the density of the decoration layer, but instead, set the density map for the deco layer to be the same one already used for the alphamap for the grass layer.  This way, anywhere grass is painted will automatically get grass meshes as well, and the grass meshes will change automatically if you change the grass layer. (Note: the deco layer meshes won't show up yet until you change some of the properties mentioned in the next step)
# Now we want to tweak some aspects of our new terrain to make things look a bit better.  Select the TerrainInfo actor in the map, and [[Legacy:Set The Following Properties|set the following properties]]:
#;TerrainInfo-&gt;Layers[0] (the dirt): (No changes needed)
#;TerrainInfo-&gt;Layers[1] (the grass):
#;* UScale = 4
#;* VScale = 4
#;* TextureRotation = 4096
#;TerrainInfo-&gt;Layers[2] (the rocks):
#;* UScale = 32
#;* VScale = 32
#;TerrainInfo-&gt;DecoLayers[0] (the grass meshes):
#;* AlignToTerrain = 1
#;* DensityMultiplier = (Min=0.5, Max=0.5)
#;* DrawOrder = SORT_BackToFront
#;* FadeOutRadius = (Min=1000, Max=2000)
#;* RandomYaw = 1
#;* ScaleMultiplier:
#;** X = (Min=0.5, Max=1)
#;** Y = (Min=0.5, Max=1)
#;** Z = (Min=0.25, Max=5)

# [[Legacy:Building A SkyBox|Create a Skybox]] outside of the area we're using for the map.  We'll just use a clear blue sky for now, so create a ConstantColor texture with a nice shade of blue and set all the walls of the skybox to that texture (for simplicity, make them unlit, so they show up the right color even without a light in the skybox).  Next, set all the walls of our big space to &quot;Fake Backdrop&quot; so we can see the skybox through them (and so that the sunlight actor in the next step works properly).
# 
[[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Light&gt;&gt;[[Legacy:Sunlight|Sunlight]] inside our space.  Set the LightColor-&gt;Brightness to 80, and point it downwards at a slight angle.  (You should now be able to [[Legacy:Rebuild|rebuild]] the map and turn on Dynamic Lighting and see a nice peaceful, sunlit valley)

[[Image:Legacy_astut-terrain.jpeg|center|]]



# Open the properties for the ZoneInfo actor and set the ZoneLight-&gt;AmbientBrightness to 32.  In the real world, light gets reflected off of all kinds of things so even if you're not in direct sunlight there's still some light.  This will keep the shadows from being pitch black and make things feel more realistic.  (Note: Don't set AmbientLight too high, though, or static meshes will look strange (for some reason, static meshes don't get lit the same way by AmbientLight as everything else does, so they'll come out looking too light).)
# Pick a basic concrete texture, such as HumanoidArchitecture.Bases.bas10HA, and at one end of the valley, add a &quot;cube&quot; brush of size (height=128,width=1024,breadth=3072) and place it on the floor of the valley against the wall.  Add another of the same size and also place it on the ground right in front of the first one.  Use the [[Legacy:Vertex Editing|Vertex Editing]] tool to move the front vertexes of the front slab closer together into a trapezoidal shape.  Now we have an underlying slab for our new base structure. (Note that whenever you change the shape of a brush you need to [[Legacy:Rebuild|rebuild]] the world geometry before you will see the change in the world.)
# Add another box of size (h=896,w=256,b=3072).  Form it into a similar (upright) trapezoidal shape, and place it standing on the base slab, against the wall of the valley.  This will represent the front wall of the part of the base which is dug into the mountain.
# Adjust the terrain shape so that it meets our concrete slabs around all the edges, and nothing is poking up through the slabs.
# The door to the actual base will be in the center of the upright slab, but we need some protection for it so a frontal attack isn't trivially easy.  Add another vertical concrete slab of size (h=512,w=128,b=1024) about 1024 units in front of the back wall.
# For added support, and to give the defenders somewhere good to spawn, we'll build a ceiling stretching out from the back wall to the front wall, but we'll make this one a different texture.  Choose the &quot;Grates.grt025T&quot; texture from the &quot;Shiptech&quot; package, and add another box of size (h=64,w=1024,b=896).  Place it so that it connects the top of the front wall with the back wall.
# Now that we have all the basic BSP in place for the base, it's time to fiddle with textures.  Adjust the scaling and position so that they look good and line up well with the edges and other pieces.
# Add some appropriate static meshes to make the base look more interesting.  Five HumanoidHardware.Beams.jribbedcolumn01HA meshes (with a Z DrawScale3D of 2)  will give it a good feeling of solidity, and we will add a couple of SG_LO_meshes.Cielings.LO_lee_arch meshes (DrawScale=2, partially embedded into the front wall) to look like extra supports and give a bit of added protection for the front of the roof.  Add an X_cp_Evil.sg_Evildoorframe1 in the center of the back wall, the top should be protruding out of the roof (this both gives us a starting doorframe, and produces a nifty bit of some sort of equipment on the roof, for character).  Finally, take a SG_LO_meshes.Doors.sg_Mech_ruggedframe2, set the X coordinate of its DrawScale3D to 0.75, place it against the back wall, and move it down so that the top forms a base for the &quot;equipment&quot; on the roof, to form an imposing, technological front for our base (this will also serve double-duty as a way for the defenders to climb down from the roof on either side).  I also added a HumanoidHardware.Miscellaneous.MDoor01HA (DrawScale=1.5) around the remaining exposed area of the back wall for an actual door frame.
# Now, there is one problem here.  The collision hull for the sg_Mech_ruggedframe2 is broken.  If you try to walk on top of the sides of it when climbing down from the roof, you will notice that your character actually falls partway into the mesh, which just breaks the whole illusion of reality.  To fix this bug in the mesh, we'll need to create a couple of [[Legacy:BlockingVolume|BlockingVolume]]s to cover these portions so that people can stand on them correctly.  Since these are an irregular shape, the best way to do this is to open the [[Legacy:2D Shape Editor|2D Shape Editor]], create a shape which is close to what we want, and extrude it into a brush shape.  Then create the BlockingVolumes from this brush and place them over the &quot;ramps&quot;.
# 
There's just one last touch left for the entrance to our base:  An actual entrance to our base.  We need to carve a hole in the back wall to lead into the rest of the underground base.  Make the builder brush into a (h=288,w=256,b=512) box, and place it inside the back wall, centered with where we want the door to be (this should be just slightly bigger than the mesh we've got for our doorframe), then hit the subtract button, and presto, we have a hole.  But now we've got another problem: the hole is covered by terrain.  To fix this, go into Terrain Mode and select the &quot;Visibility&quot; tool.  Set the inner and outer radius down to 1, and (very carefully) control-click the particular terrain cells which are blocking the passage. (we will want to actually build the rest of the base later, but for now we'll stop here)

[[Image:Legacy_astut-base.jpeg|center|]]



# Now it's time for a bit more decoration of the rest of the landscape.  In the AntalusStatic package, there are a number of static meshes for cedar trees.  Place some of these in appropriate places around the valley.  For dense forest areas, we can overlap some of the tree group meshes to make them look even denser.  Don't forget to vary the sizes appropriately.
# There is another problem here.  There is apparently a bug in the rendering engine which causes the grass meshes from our decoration layer to draw even when they should be obscured by the tree leaves, which looks really strange.  This is apparently due to a rendering glitch with Shaders (a Shader is used to make the branch texture in the default tree mesh two-sided, so it shows from underneath too).  Since all we need is for the texture to be two-sided, we can get around this by using something other than a Shader which gives us the option of making something two-sided.  Create a new ColorModifier based on the basic AntalusTextures.All.cedarbranch texture, set it to be two-sided, and we'll use that instead (this gives us the added benefit that we can tweak the tree colors if we want to).  Set this new texture as a skin in place of the default tree branch texture for all of the tree static mesh actors.  Fixed!
# Now, in the real world, evergreens and grass do not get along well (evergreens produce too much shade and cover the ground with needles so that grass can't really grow under them).  To emulate this, create another terrain layer using the ArboreaTerrain.ground.Twig01AR texture to look like needles and twigs (UScale=2,VScale=2) and paint this underneath all of the trees.  You will also need to un-paint the grass in those areas (even if the twig layer is on top of the grass, the grass layer is connected to the grass meshes, so you'll get tufts of grass popping up through your nice twigs if you don't).
# Now find some nice boulder meshes (such as CB-Desert1.Rocks.AW-PointyRock1a, ArboreaLanscape.Cliffs.littlerock01, and CB-Desert2.Rocks.CB-rock3), and place some of them around the valley in appropriate spots.  Rotate and scale them so they don't all look like the same rock, and to keep things consistent, skin them with the same texture used for the rocky peaks around the valley.
# Un-paint the grass under the edges of the rocks where we would expect them to shade it out, so we'll see some dirt instead.
# Finally, we need some ambience.  Add two or three AmbientSound actors around the edge of the valley with some wind sounds (OutdoorAmbience.BThunder.wind1, SoundRadius=500, SoundVolume=200, and vary the SoundPitch between 32 and 64).  Now add an AmbientSound with Sound-&gt;AmbientSound set to None, and then add an entry to its Sound-&gt;SoundEmitters property to generate an intermittent sound.  Set the EmitInterval to 10, EmitVariance to 5, and EmitSound to Sound'OutdoorAmbience.BThunder.bird2'. Create similar AmbientSounds with some other bird sounds (such as bird4, bird5, or bird6) and scatter them around the trees to make them sound inhabited.

[[Image:Legacy_astut-valley.jpeg|center|]]

There we have it, a nice peaceful sunlit little valley full of green grass and happy birds, ready to be drenched in blood!

Now might be a good time to add a temporary PlayerStart, fire up the map in the game, and have a nice leisurely stroll about your new world (make sure all the terrain's navigable, looks and sounds right in-game, etc.)  Then, on to the real fun...

(There are a couple of touches which could still be added.  Our skybox could use a bit of work, for example, by adding some clouds and a sun with a corona, and possibly some continuation of the terrain into the distance so it looks better if somebody goes up high enough in flying camera mode (alternately, we might just want to bring the ceiling down low enough that they can't do this).  Realistically, some blocking volumes should also be erected around the sides of the valley to make sure people don't find a way up onto the peaks where they're not supposed to be (which could potentially screw up the planned assault balance), and we could probably make the base look a bit better with some more carefully chosen meshes, or some custom building, but we'll leave these details for the time being)

(Return to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Getting Started]] section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]])

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==

Stino: Maybe the grass is a little to green :d

Hoyr: There is a couple of good grass textures in the ArenaTex package :)</text>
    </revision>
    <revision>
      <id>1549</id>
      <timestamp>2006-04-16T08:13:11Z</timestamp>
      <contributor>
        <ip>D51A40A27.access.telenet.be</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For those following along on the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] who want to build the tutorial map themselves (or are just curious how it was done), here are the steps needed to build our cozy little place I like to call &quot;Tutorial Valley&quot;.  After following these steps you should have something pretty close to the example map (which is also available for download.  See the link from the main page of the tutorial).

Anyway, the steps are as follows:

# Set the 3D view to Textured mode.  This will make it easier to see what we're doing before lights are added.
# [[Legacy:Subtract A Space|Subtract a Space]] of size 8192x8192, height 4096.  (It doesn't matter what texture you give it, because we'll be setting all the walls to &quot;Fake Backdrop&quot; for a skybox later anyway.  In these situations I like to use something semi-transparent like Editor.MaterialArrow to remind me that these walls are there, but they aren't &quot;real&quot;)
# [[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Info&gt;&gt;[[Legacy:ZoneInfo|ZoneInfo]] to the subtracted space (doesn't really matter where; I like to put it near the center).
# Add a terrain using [[Legacy:Terrain Mode|Terrain Mode]].  Make the terrain 128x128 in size.  Place the new TerrainInfo actor in the center of the subtracted space.  (note that by using the Terrain Tool to create the terrain, it automagically sets TerrainZone to true in the ZoneInfo we just added, which is good, because we'll need that)
# Choose an appropriate dirt texture (say AbbaddonTerrain.ground.dirt01GO) in the Texture Browser, and then add a base layer to the new terrain using Terrain Mode tool.  Be sure that the &quot;Alpha Fill&quot; setting in the new layer window is set to white (255,255,255).  (if you now [[Legacy:Rebuild|rebuild]] the map, a flat terrain should appear covering the entire width and depth of the subtracted space.  If it doesn't, double-check the TerrainZone setting in the ZoneInfo, and make sure the 3D view is set to Textured mode instead of Dynamic Lighting.)
# Use the Paint and Smoothing tools in the Terrain Mode window to shape the terrain into a curved valley, with hilly peaks all around.
# Choose an appropriate grass-like texture in the Texture Browser and create a second layer.  This time, set the &quot;Alpha Fill&quot; setting to black (0,0,0) (this will cause the layer to be initially completely hidden).  Use the Paint tool from the Terrain window to paint the grass texture over the floor of the valley.  (Use a little bit of variation, in the real world, grass doesn't all grow uniformally)  [Note: There is apparently no actual &quot;grass&quot; texture shipped in any of the modules of the entire UT2004 game.  I had to create my own (by taking the &quot;ground.moss01ar&quot; texture from the &quot;ArboreaTerrain&quot; package, loading it into a paint program, adjusting the color to be greener, and blurring it slightly).  You can just use the moss01ar texture itself (as many maps apparently do for grass), but it won't look as good.]
# Choose a rock texture (such as AbaddonTerrain.ground.flr18go) and create another layer for the Terrain.  Again, set the initial alpha fill to black (0,0,0).  Paint this texture over the hills and peaks surrounding the valley.
# Open the Static Mesh Browser and load the &quot;ArboreaHardware&quot; package.  Select the Organics.ArbGrassA static mesh.  Go to the Terrain Mode window and create a new decoration layer using this mesh.  '''Tip:''' We could create a new alphamap for the density of the decoration layer, but instead, set the density map for the deco layer to be the same one already used for the alphamap for the grass layer.  This way, anywhere grass is painted will automatically get grass meshes as well, and the grass meshes will change automatically if you change the grass layer. (Note: the deco layer meshes won't show up yet until you change some of the properties mentioned in the next step)
# Now we want to tweak some aspects of our new terrain to make things look a bit better.  Select the TerrainInfo actor in the map, and [[Legacy:Set The Following Properties|set the following properties]]:
#;TerrainInfo-&gt;Layers[0] (the dirt): (No changes needed)
#;TerrainInfo-&gt;Layers[1] (the grass):
#;* UScale = 4
#;* VScale = 4
#;* TextureRotation = 4096
#;TerrainInfo-&gt;Layers[2] (the rocks):
#;* UScale = 32
#;* VScale = 32
#;TerrainInfo-&gt;DecoLayers[0] (the grass meshes):
#;* AlignToTerrain = 1
#;* DensityMultiplier = (Min=0.5, Max=0.5)
#;* DrawOrder = SORT_BackToFront
#;* FadeOutRadius = (Min=1000, Max=2000)
#;* RandomYaw = 1
#;* ScaleMultiplier:
#;** X = (Min=0.5, Max=1)
#;** Y = (Min=0.5, Max=1)
#;** Z = (Min=0.25, Max=5)

# [[Legacy:Building A SkyBox|Create a Skybox]] outside of the area we're using for the map.  We'll just use a clear blue sky for now, so create a ConstantColor texture with a nice shade of blue and set all the walls of the skybox to that texture (for simplicity, make them unlit, so they show up the right color even without a light in the skybox).  Next, set all the walls of our big space to &quot;Fake Backdrop&quot; so we can see the skybox through them (and so that the sunlight actor in the next step works properly).
# 
[[Legacy:Add An Actor|Add an Actor]]&gt;&gt;Light&gt;&gt;[[Legacy:Sunlight|Sunlight]] inside our space.  Set the LightColor-&gt;Brightness to 80, and point it downwards at a slight angle.  (You should now be able to [[Legacy:Rebuild|rebuild]] the map and turn on Dynamic Lighting and see a nice peaceful, sunlit valley)

[[Image:Legacy_astut-terrain.jpeg|center|]]



# Open the properties for the ZoneInfo actor and set the ZoneLight-&gt;AmbientBrightness to 32.  In the real world, light gets reflected off of all kinds of things so even if you're not in direct sunlight there's still some light.  This will keep the shadows from being pitch black and make things feel more realistic.  (Note: Don't set AmbientLight too high, though, or static meshes will look strange (for some reason, static meshes don't get lit the same way by AmbientLight as everything else does, so they'll come out looking too light).)
# Pick a basic concrete texture, such as HumanoidArchitecture.Bases.bas10HA, and at one end of the valley, add a &quot;cube&quot; brush of size (height=128,width=1024,breadth=3072) and place it on the floor of the valley against the wall.  Add another of the same size and also place it on the ground right in front of the first one.  Use the [[Legacy:Vertex Editing|Vertex Editing]] tool to move the front vertexes of the front slab closer together into a trapezoidal shape.  Now we have an underlying slab for our new base structure. (Note that whenever you change the shape of a brush you need to [[Legacy:Rebuild|rebuild]] the world geometry before you will see the change in the world.)
# Add another box of size (h=896,w=256,b=3072).  Form it into a similar (upright) trapezoidal shape, and place it standing on the base slab, against the wall of the valley.  This will represent the front wall of the part of the base which is dug into the mountain.
# Adjust the terrain shape so that it meets our concrete slabs around all the edges, and nothing is poking up through the slabs.
# The door to the actual base will be in the center of the upright slab, but we need some protection for it so a frontal attack isn't trivially easy.  Add another vertical concrete slab of size (h=512,w=128,b=1024) about 1024 units in front of the back wall.
# For added support, and to give the defenders somewhere good to spawn, we'll build a ceiling stretching out from the back wall to the front wall, but we'll make this one a different texture.  Choose the &quot;Grates.grt025T&quot; texture from the &quot;Shiptech&quot; package, and add another box of size (h=64,w=1024,b=896).  Place it so that it connects the top of the front wall with the back wall.
# Now that we have all the basic BSP in place for the base, it's time to fiddle with textures.  Adjust the scaling and position so that they look good and line up well with the edges and other pieces.
# Add some appropriate static meshes to make the base look more interesting.  Five HumanoidHardware.Beams.jribbedcolumn01HA meshes (with a Z DrawScale3D of 2)  will give it a good feeling of solidity, and we will add a couple of SG_LO_meshes.Cielings.LO_lee_arch meshes (DrawScale=2, partially embedded into the front wall) to look like extra supports and give a bit of added protection for the front of the roof.  Add an X_cp_Evil.sg_Evildoorframe1 in the center of the back wall, the top should be protruding out of the roof (this both gives us a starting doorframe, and produces a nifty bit of some sort of equipment on the roof, for character).  Finally, take a SG_LO_meshes.Doors.sg_Mech_ruggedframe2, set the X coordinate of its DrawScale3D to 0.75, place it against the back wall, and move it down so that the top forms a base for the &quot;equipment&quot; on the roof, to form an imposing, technological front for our base (this will also serve double-duty as a way for the defenders to climb down from the roof on either side).  I also added a HumanoidHardware.Miscellaneous.MDoor01HA (DrawScale=1.5) around the remaining exposed area of the back wall for an actual door frame.
# Now, there is one problem here.  The collision hull for the sg_Mech_ruggedframe2 is broken.  If you try to walk on top of the sides of it when climbing down from the roof, you will notice that your character actually falls partway into the mesh, which just breaks the whole illusion of reality.  To fix this bug in the mesh, we'll need to create a couple of [[Legacy:BlockingVolume|BlockingVolume]]s to cover these portions so that people can stand on them correctly.  Since these are an irregular shape, the best way to do this is to open the [[Legacy:2D Shape Editor|2D Shape Editor]], create a shape which is close to what we want, and extrude it into a brush shape.  Then create the BlockingVolumes from this brush and place them over the &quot;ramps&quot;.
# 
There's just one last touch left for the entrance to our base:  An actual entrance to our base.  We need to carve a hole in the back wall to lead into the rest of the underground base.  Make the builder brush into a (h=288,w=256,b=512) box, and place it inside the back wall, centered with where we want the door to be (this should be just slightly bigger than the mesh we've got for our doorframe), then hit the subtract button, and presto, we have a hole.  But now we've got another problem: the hole is covered by terrain.  To fix this, go into Terrain Mode and select the &quot;Visibility&quot; tool.  Set the inner and outer radius down to 1, and (very carefully) control-click the particular terrain cells which are blocking the passage. (we will want to actually build the rest of the base later, but for now we'll stop here)

[[Image:Legacy_astut-base.jpeg|center|]]



# Now it's time for a bit more decoration of the rest of the landscape.  In the AntalusStatic package, there are a number of static meshes for cedar trees.  Place some of these in appropriate places around the valley.  For dense forest areas, we can overlap some of the tree group meshes to make them look even denser.  Don't forget to vary the sizes appropriately.
# There is another problem here.  There is apparently a bug in the rendering engine which causes the grass meshes from our decoration layer to draw even when they should be obscured by the tree leaves, which looks really strange.  This is apparently due to a rendering glitch with Shaders (a Shader is used to make the branch texture in the default tree mesh two-sided, so it shows from underneath too).  Since all we need is for the texture to be two-sided, we can get around this by using something other than a Shader which gives us the option of making something two-sided.  Create a new ColorModifier based on the basic AntalusTextures.All.cedarbranch texture, set it to be two-sided, and we'll use that instead (this gives us the added benefit that we can tweak the tree colors if we want to).  Set this new texture as a skin in place of the default tree branch texture for all of the tree static mesh actors.  Fixed!
# Now, in the real world, evergreens and grass do not get along well (evergreens produce too much shade and cover the ground with needles so that grass can't really grow under them).  To emulate this, create another terrain layer using the ArboreaTerrain.ground.Twig01AR texture to look like needles and twigs (UScale=2,VScale=2) and paint this underneath all of the trees.  You will also need to un-paint the grass in those areas (even if the twig layer is on top of the grass, the grass layer is connected to the grass meshes, so you'll get tufts of grass popping up through your nice twigs if you don't).
# Now find some nice boulder meshes (such as CB-Desert1.Rocks.AW-PointyRock1a, ArboreaLanscape.Cliffs.littlerock01, and CB-Desert2.Rocks.CB-rock3), and place some of them around the valley in appropriate spots.  Rotate and scale them so they don't all look like the same rock, and to keep things consistent, skin them with the same texture used for the rocky peaks around the valley.
# Un-paint the grass under the edges of the rocks where we would expect them to shade it out, so we'll see some dirt instead.
# Finally, we need some ambience.  Add two or three AmbientSound actors around the edge of the valley with some wind sounds (OutdoorAmbience.BThunder.wind1, SoundRadius=500, SoundVolume=200, and vary the SoundPitch between 32 and 64).  Now add an AmbientSound with Sound-&gt;AmbientSound set to None, and then add an entry to its Sound-&gt;SoundEmitters property to generate an intermittent sound.  Set the EmitInterval to 10, EmitVariance to 5, and EmitSound to Sound'OutdoorAmbience.BThunder.bird2'. Create similar AmbientSounds with some other bird sounds (such as bird4, bird5, or bird6) and scatter them around the trees to make them sound inhabited.

[[Image:Legacy_astut-valley.jpeg|center|]]

There we have it, a nice peaceful sunlit little valley full of green grass and happy birds, ready to be drenched in blood!

Now might be a good time to add a temporary PlayerStart, fire up the map in the game, and have a nice leisurely stroll about your new world (make sure all the terrain's navigable, looks and sounds right in-game, etc.)  Then, on to the real fun...

(There are a couple of touches which could still be added.  Our skybox could use a bit of work, for example, by adding some clouds and a sun with a corona, and possibly some continuation of the terrain into the distance so it looks better if somebody goes up high enough in flying camera mode (alternately, we might just want to bring the ceiling down low enough that they can't do this).  Realistically, some blocking volumes should also be erected around the sides of the valley to make sure people don't find a way up onto the peaks where they're not supposed to be (which could potentially screw up the planned assault balance), and we could probably make the base look a bit better with some more carefully chosen meshes, or some custom building, but we'll leave these details for the time being)

(Return to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Getting Started]] section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]])

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==

Stino: Maybe the grass is a little to green :d</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Discussion</title>
    <id>488</id>
    <revision>
      <id>1556</id>
      <timestamp>2004-11-21T20:21:47Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a page to hold all the general comments, old questions, and thread discussions related to the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] and its subsections.  Please feel free to post questions and comments on the individual pages themselves.  This page is mainly used to move old discussions to after a while to keep the main pages tidy and less confusing for new users.

==General Discussion==

==Discussion on Specific Sections==

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Getting Started]]===

====[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating Tutorial Valley]]====

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]===

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts And The PlayerSpawnManager]]===

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]===

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]===

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Other Objectives]]===

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Vehicles And Turrets]]===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Getting Started</title>
    <id>483</id>
    <revision>
      <id>1547</id>
      <timestamp>2004-11-21T20:00:16Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <minor/>
      <comment>(sigh.. it sucks being a perfectionist)</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]'''

----

==Getting Started==

Assault mapping is easily the most complex and demanding of any of the game types to map for.  This is because it requires not only most of the skills needed to make all of the other map types combined, but also throws in quite a few quirks of its own.  Tempting though it may be, do not try to make an assault map for your first ever mapping experience.  Instead, it is strongly recommended that you have some experience mapping several other game types and have all the basics down before you start considering an assault map.

That having been said, while assault mapping is one of the most challenging forms of mapping for UT2004, it can also be very rewarding.  There are a few things to keep in mind when starting out, however:

==Planning the Map==

Ok, so you're starting a new map.  The first thing to do is fire up UnrealEd, right?  ''Wrong.''  You're not just making another Capture the Flag, or even Onslaught, map here.  This is Assault, and Assault takes planning.  If you want your map to be any good at all you'll need to start thinking about a lot of details before you sit down to start building.

Get out a pencil and pad of paper (or a text editor and a drawing program if you prefer).  You're going to need it.

===Backstory===

For a lot of folks, this seems like something that should be an afterthought at most.  This is Unreal Tournament.  You go around and shoot people.  Who cares about a story?  And this is pretty much true for most of the other game types out there, but for assault, having an idea for a bit of backstory and premise for your map before you begin is really one of the first things you should do, and can be surprisingly important.

A backstory can provide several key factors for your map creation:

* It can give you a good key as to what the world should look and feel like, and more importantly what the obstacles are and where you should be placing them.  What would attackers realistically need to do in this scenario?  How would the defenders try to stop them?  Consistent goals that fit with a premise can not only improve the believability for the players, but often help with balance and timing issues later on.
* As a corrolary to the previous point, a backstory can give players a better intuitive feel for how the level works and what they'll need to accomplish.  An assault level where the goals seem to be completely arbitrary and confusingly placed can be very frustrating to play.  On the other hand, if the player starts out with an idea of what the map is all about, and where they need to go and what they need to do at each stage flow naturally from that foundation, it can make playing less confusing and more enjoyable for everyone involved.
* A backstory that the player can really get into can give a map a lot more depth and make it much more compelling to play.  This is actually one of the big advantages to the Assault gametype.  The degree to which the gameplay is customized to each map can make each one a lot more interesting than the &quot;same game with new scenery&quot; effect one typically gets with new maps for most other gametypes.  Exploit this fact and build from it to create a compelling world for your participants to be part of and it will only enhance the game that much more.

So, that having been said, here's a few questions you'll want to answer before you start:
* Who are these people?  Are the teams military troops on a campaign?  Bands of citizens in a lawless world trying to survive?  Eco-terrorists fighting to save a cute fuzzy animal?  There are more possibilities than you might think at first glance.
* How did they get here?  Is this the culmination to a great crusade across half a planet?  Did the attackers just parachute in from orbital drop-ships?  Did a covert op go bad and now one team is stuck deep inside enemy territory?  
* Why is the other team trying to stop them?  Defenders are people too, and they have their own stories.
* What happens when the attackers succeed with their mission?  What does this mean for the larger universe?
* What happens when the defenders succeed in stopping them?

Think about details.  Write it all down in a few paragraphs.  You'll be glad you did later.  (Note that this shouldn't be set in stone, though.  You may well need to go back and revisit this premise and tweak some things here and there as you're building the map.  That's a natural part of the building process too.)

===Objectives===

Now that you've got a good idea of what the story behind your scenario is, it's time to start thinking in mapper terms.  Your story should already have given you a few ideas about what obstacles and objectives are going to be involved in the assault.  Now you need to think about how you're going to implement them.

Take a good read through the rest of this tutorial with an eye to the types of objectives you have to work with.  For your map you'll likely want somewhere between five and ten objectives from beginning to end.  How many depends a lot on how the gameplay works out and how long it takes people to get through them, so you may need to adjust things as you go.  Pick four or five really important objectives that exemplify what the story is all about, and then think about places you might add more or ways you might substitute alternates if it looks like the gameplay needs it.  You want to get a starting plan, but don't get too tied down to anything at this stage, because you never know what you might have to change later.

It's very important here to think about the timing of your objectives.  To maintain a consistent feel of progress and keep the game fun, you want the objectives to be well spread out over the progress of the level, so there aren't any places where people feel like they're whizzing through things or bogged down in one place forever.  Also keep an eye on the total game time.  The default time in the game for one round of an Assault map is ten minutes, and this is a good ballpark to shoot for.  Too much shorter than this and people won't feel they've really accomplished anything.  Too much longer than this, and people will start wondering if they'll ever see the end of things.  Got too many ideas for a ten-minute map?  That's ok, that just gives you more to start with when you get to making your next map!  There's always a next map, so don't blow all your good ideas at once.

Ok, got your basic objectives?  Take a minute to think about the requirements that your objectives will have in order to be challenging, but not impossible.  If you've got a destroyable objective, for example, you don't want it in plain sight where the attackers can just shoot it from their spawn points.  You need something in the way that they'll have to navigate past to get to where they can attack the target.  Have a HoldObjective?  You need to put it somewhere where the defenders can try to blow away the person who's getting too close to it, but at the same time you don't want it so defensible that the attackers never get near it.  Take some ideas from other maps that work well, too.  Once you've got some basic ideas for how you'll do all this, this should lead you right into the next step...

===Layout===

Now it's time to start putting everything together into an actual map.  From your backstory you've probably already got an idea of what the scenery should look like.  From your objectives, you have some idea of how the gameplay will need to progress, and what sort of obstacles you'll want to have in the way.  Next you'll want to think about travel.

One of the challenging aspects of Assault is that the attackers need to manage to push their way through the defense to get at the objective, and this usually means a lot of running, dodging, shooting, and so on (you know, the fun stuff).  To do that we're going to need some distance between the attackers' spawn point and the objective under attack.  For each stage, you'll want some room to maneuver, and you might have a good number of people on each team, so think fairly open spaces.  On the other hand, you'll want to include some objects to duck behind, navigate around, jump from, and otherwise make things interesting.  For at least some of your objectives, try to come up with a couple of different routes to get to them.  This adds uncertainty for both the attackers and defenders and can make the game more interesting.  Be careful with more than two routes, however, since if you're not careful this can make things very frustrating for the defenders and very easy for the attackers.  Also be really careful of &quot;sneaky&quot; routes.  Often they seem like a neat way to add a clever twist to the attack, but a secret attack route that none of the defenders know about can let the attackers just breeze through, and that's no fun for the defense.

You'll also want to think about where the spawn points for the attackers and defenders will be.  You want to make sure there's a fair amount of room, because you might have a large number of players on each team, but you also want to make them somewhat protected, so one side can't just start shooting at the other as soon as they spawn (the attackers need a chance to get near the objective, and the defenders need time to get ready for them).  You'll also want to put the defender spawn point a little bit out of the way of the battle, so that they aren't respawning right on top of rocket blasts.

For each stage of the assault, draw out a rough sketch of the layout of that area.  Plot out your anticipated attack routes, and figure out where good places would be for the defenders to lie in wait.  This will come in handy later when you get to bot pathing, and it also gives you a chance to keep an eye on balance.

===Balance===

Now if you've been thinking carefully about all of the bits up to this point, you've probably already got this mostly covered, but this is still the time to stop, step back from all your plans, and look at the whole map from the perspective of the players on both sides.  Are all the objectives achievable within the game's time limit?  Are they defendable for long enough to keep the attackers at bay until the time runs out?  Are there any things you're going to want to be careful of that might tip the balance one way or the other while building the map?

There are always some little balance issues and question marks at the end of planning.  Just keep them in mind as you actually build the map, and with a little fiddling you can probably work them out as you go.  You can't fix what you don't know is a problem, though, so try to make sure you know where your gremlins are beforehand so you're ready for them when you get to that part of the map.

==Creating the Basic Map==

Ok, now for the fun part.  We get to start building!  You've already got a good idea for what you want your map to look like, and you're familiar with all the basics from your previous experience building other maps, so I won't bore you with a lot of details here.  For the purposes of our example, we'll use a fairly simple scenario.  The first thing we'll need is a backstory, perhaps something like:

{{innerbox| Over a period of many years, a ruthless band of criminal thugs have been building a stronghold in the mountains of an otherwise peaceful farming planet towards the outer rim.  Recently, these thugs have taken advantage of the military's preoccupation with an uprising in on the far side of inhabited space to harrass and terrorize the inhabitants of several colonies both on their own planet and its close neighbors, safe from retribution in their mountain bunker.  The local governments, being unable to handle the situation themselves, have pooled what money they can spare and managed to hire a small band of mercenaries to hopefully take care of the problem once and for all.

 With the help of layout plans to the stronghold obtained from a spy who had managed to infiltrate the gang a few months earlier, a plan has been devised to penetrate the enemy's bunker and overload their power generator, destroying the entire complex.  The mercenary team has been airlifed into a small valley just over the hill from the entrance to the enemy base, and must successfully breach the outer defenses, reach the power core at the center of the base, and initiate the overload sequence.  Of course, should they fail, there is the likelihood that the thugs will launch a severe retribution against the colonies which attacked them, placing many innocent lives in jeopardy.

}}

There, that ought to do for now.  For our example map, we'll start with a simple plan for a first objective:

[[Image:Legacy_astut-sketch.png|center|]]

(The attackers will start around a bend in the valley, and try to blow up the base door to get inside.  We have the option of a few different attack routes, places people can take cover, etc.)

So we'll sit down in the editor and put together a map based on this plan.  After a little bit of work, we might have something that looks a little bit like this:

[[Image:Legacy_astut-valley.jpeg|center|]]

For those who would like to follow along (or are curious), all of the steps needed to create this map are detailed in &quot;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating Tutorial Valley]]&quot;.  Alternately, you can just download the starting map (see the link on the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] page) and go from there.

==DefaultGameType==

The last thing we need to do is tell the game that this is an Assault level, so it knows to load the appropriate game rules.  This is not strictly necessary, as the game type is usually specified explicitly in single-player mode by choosing it from the menu, and in network mode by whoever sets up the server, but it's still good practice to do it as there are a few situations where it can actually be important.  To do this, go into the [[Legacy:Level Properties|Level Properties]] and set the LevelInfo-&gt;DefaultGameType to &quot;UT2k4Assault.ASGameInfo&quot;.

(UnrealEd will usually also do this for you if you save your map with an &quot;AS-&quot; prefix, but it doesn't hurt to double-check)

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/Other Objectives</title>
    <id>490</id>
    <revision>
      <id>1560</id>
      <timestamp>2006-06-20T05:06:42Z</timestamp>
      <contributor>
        <ip>64-110-209-1.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>Linked Next Tutorial</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Vehicles And Turrets]] ''(still being written)''

----

==Other Objectives==

So far you've made your way through creating a pretty complete (if a little short) assault map, including a couple of different types of objectives and all the little bits and pieces that go with them.  At this point you might be wondering a bit about what kind of options you have beyond what's been shown here when you're putting together your own maps.  Well, here's some possibilities:

==Objective Types==

The UT2004 game comes with several different types of GameObjectives which are useful in Assault maps.  Some of these can even be combined with other mapping elements to produce even more possibilities:

===DestroyableObjective===

These have been pretty well covered in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]].  The obvious use for these is doors, of course, but keep in mind that there's a lot of other things that can be destroyed, and a lot of ways to destroy something.  For example, in our tutorial so far, we've been rather assuming that somebody was stupid enough to make a power core with an overload sequence that couldn't be turned off by the bad guys once they've dealt with the pesky invaders.  To add a bit of realism, we could add a DestroyableObjective to blow up the console after one has flipped the lever, to prevent deactivation of the overload.  For this application, it could just be a quick (doesn't take much to blow it up) thing, but little details like this can add a lot to the feel of a game.

===HoldObjective===

Again, these have been pretty well covered in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]].  It is important to note, however, that there are a lot of possible applications for this sort of objective.  It's actually rather unfortunate that these seem to have been relegated almost entirely to &quot;flip the lever&quot; sort of goals, because they can do a lot more.

Firstly, keep in mind that while every HoldObjective has to have an associated mover to make it work, this mover doesn't even have to be visible anywhere in the game world (you can even stick it off in solid space somewhere).  Also note that if your mover is visible, there's nothing that says it has to have only two keyframes or just a simple movement.  There's also nothing that says it has to be small.  Be creative!

There are also a couple of variations you can try to add some spice to your HoldObjectives:

; Change the Mover's Object-&gt;InitialState property: The normal way to use them is with an InitialState of TriggerAdvance, but if you set it to TriggerControl instead, then the mover will automatically start moving back to its &quot;home&quot; position when there isn't somebody standing on the HoldObjective.  This means that all of a sudden, the objective has become a lot harder because as soon as the attacker who reached it gets killed (or bumped off or whatever), the objective starts &quot;healing&quot; itself.
; Be creative with where you put the HoldObjective: For example, you can put it on a moving platform (you can even put it on top of its own mover, so that the objective becomes &quot;ride this platform from A to B&quot;, etc), and [[Legacy:Attaching Actors|attach it to the mover]] so it moves with it.
; Use more than one mover: Nothing says that only one mover can have the same tag.  Set up several movers with the MoverTag tag and set them to do different things.  Combine this with the &quot;hidden mover&quot; trick and give them different durations and you have a way to trigger events at various points throughout the completion process (just make sure that only the mover which takes the longest is the one which sends an event back to the HoldObjective to disable it).  As an example, this technique is used in AS-Convoy to trigger the spawning of C4 packs at timed points while one is standing outside the door.

===TouchObjective===

The ProximityObjective&gt;&gt;TouchObjective is pretty simple: If a member of the attacking team touches it (enters its collision cylinder), it's completed.  This can be made a bit more sophisticated, however, by changing the ProximityObjective-&gt;ConstraintPawnClass to, for example, require that the attacker touching it be driving a particular type of vehicle (&quot;Get the hellbender to the checkpoint!&quot;), etc.

===UseObjective===

Again, the ProximityObjective&gt;&gt;UseObjective is also pretty simple: An attacker must get to it and hit the &quot;use&quot; key in order to complete it.  The collision cylinder of this objective determines how close somebody has to get before trying to &quot;use&quot; it.

===DestroyVehicleObjective===

As you might be able to guess from the name, this objective type is used for cases where you want somebody to have to destroy a particular vehicle in order to complete the objective.  Unlike most objectives, it doesn't matter where you place this one, and the way you use it isn't actually in the objective actor but mostly in your vehicle factory.

Now, we haven't gotten to vehicles yet in the tutorial (but we'll get there in the next section!), but suffice to say here that whenever you want a vehicle to be in your assault map, you need to place an ASVehicleFactory actor where you want it to spawn to generate the vehicle.  Once you have the DestroyVehicleObjective placed in your map, and you also have an ASVehicleFactory which is going to spawn the vehicle you want destroyed, you need to [[Legacy:Match These Tags|match these tags]]:

* DestroyVehicleObjective: Events-&gt;Tag
* ASVehicleFactory: ASVehicleFactory-&gt;VehicleEvent

And the rest is pretty much automatic.  Obviously, depending on your application, you may want to trigger the factory to spawn the vehicle when the objective becomes active, set it not to respawn when destroyed, etc.  Obviously, you will also want to set all the standard objective properties (event messages, etc) on the DestroyVehicelObjective actor.

Keep in mind that turrets are also spawned using ASVehicleFactory actors, and thus can also be used with a DestroyVehicleObjective (&quot;Destroy the plasma turret!&quot;).

===TriggeredObjective===

The TriggeredObjective is basically a &quot;generic&quot; objective which can be used in many cases when you want to do something not handled by any of the other objective types.  This objective will be completed when something somewhere triggers it (by generating an event which matches its Events-&gt;Tag).  The something somewhere can be a Trigger, or a ScriptedTrigger (it can technically be other kinds of actors too, but if you do this bots may get confused about how to attack the objective, so in general try to stick to Triggers and ScriptedTriggers.  Even when doing that, however, you may run into problems if you get too complicated.  Test thoroughly.).

Note that the HUD displays generated by a TriggeredObjective will show as being wherever the TriggeredObjective actor is placed, so you will generally want to place it near where the attackers will need to be to do whatever it is that will generate the trigger event or things might get confusing.

It should be noted that a particular type of trigger actor which may be useful in this context (and elsewhere) is the Triggers&gt;&gt;Trigger&gt;&gt;Trigger_ASTeam actor.  This is a basic (proximity) trigger which will only trigger if a member of the correct assault team (attackers or defenders) touches it.  You can choose which team triggers the actor by setting its Trigger_ASTeam-&gt;AssaultTeam property.

==Using Optional Objectives==

One last thing which isn't exactly a type of objective, but is something to consider when choosing objectives for your map is the use of optional objectives.  These are objectives which do not have to be completed in order to successfully complete the map, but can make things easier for the attackers or are otherwise significant events.  Examples of these include the bridge control at the beginning of AS-Glacier, and the forward weapon cache in AS-Convoy.

In order to make an objective which is optional, simply go into its properties and set its GameObjective-&gt;bOptionalObjective property to True.  As with other objectives, you can determine when optional objectives become active using their DefensePriority setting, but they won't prevent the next objective from becoming active as well.

==Other Neat Tricks==

===Flashing Objective Icons===

Is the flashing indicator displayed when somebody gets close to your objective not quite right?  You can change it by changing the objective's GameObjective-&gt;ObjectiveTypeIcon to a different texture.  There are several useful animated icons available in the AS_FX_TX package under the Icons group (use the FinalBlend ones) including a hellbender and ion tank icon.  Don't like those?  Make your own!

===Flashing Static Meshes===

Want to make it a bit clearer where people are supposed to be going or what they're supposed to be doing?  You can take a significant piece of scenery (or two) and make it flash when a particular objective becomes active (for example, a pad on the ground that indicates where to drive a vehicle, or for a UseObjective, make the control panel (or whatever is supposed to be used) flash).  To do this, go into the objective's properties and set its Assault-&gt;PhysicalObjectiveActorsTag to the tag of the static mesh(es) you want to flash when that objective becomes active.

----

(The next section is currently being written.  We apologize for the inconvenience.)

'''Return to the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] main page'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
    <revision>
      <id>1561</id>
      <timestamp>2005-01-14T03:13:38Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]]'''

'''Next Section: Adding Vehicles and Turrets''' ''(being written)''

----

==Other Objectives==

So far you've made your way through creating a pretty complete (if a little short) assault map, including a couple of different types of objectives and all the little bits and pieces that go with them.  At this point you might be wondering a bit about what kind of options you have beyond what's been shown here when you're putting together your own maps.  Well, here's some possibilities:

==Objective Types==

The UT2004 game comes with several different types of GameObjectives which are useful in Assault maps.  Some of these can even be combined with other mapping elements to produce even more possibilities:

===DestroyableObjective===

These have been pretty well covered in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]].  The obvious use for these is doors, of course, but keep in mind that there's a lot of other things that can be destroyed, and a lot of ways to destroy something.  For example, in our tutorial so far, we've been rather assuming that somebody was stupid enough to make a power core with an overload sequence that couldn't be turned off by the bad guys once they've dealt with the pesky invaders.  To add a bit of realism, we could add a DestroyableObjective to blow up the console after one has flipped the lever, to prevent deactivation of the overload.  For this application, it could just be a quick (doesn't take much to blow it up) thing, but little details like this can add a lot to the feel of a game.

===HoldObjective===

Again, these have been pretty well covered in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Continuing The Assault]].  It is important to note, however, that there are a lot of possible applications for this sort of objective.  It's actually rather unfortunate that these seem to have been relegated almost entirely to &quot;flip the lever&quot; sort of goals, because they can do a lot more.

Firstly, keep in mind that while every HoldObjective has to have an associated mover to make it work, this mover doesn't even have to be visible anywhere in the game world (you can even stick it off in solid space somewhere).  Also note that if your mover is visible, there's nothing that says it has to have only two keyframes or just a simple movement.  There's also nothing that says it has to be small.  Be creative!

There are also a couple of variations you can try to add some spice to your HoldObjectives:

; Change the Mover's Object-&gt;InitialState property: The normal way to use them is with an InitialState of TriggerAdvance, but if you set it to TriggerControl instead, then the mover will automatically start moving back to its &quot;home&quot; position when there isn't somebody standing on the HoldObjective.  This means that all of a sudden, the objective has become a lot harder because as soon as the attacker who reached it gets killed (or bumped off or whatever), the objective starts &quot;healing&quot; itself.
; Be creative with where you put the HoldObjective: For example, you can put it on a moving platform (you can even put it on top of its own mover, so that the objective becomes &quot;ride this platform from A to B&quot;, etc), and [[Legacy:Attaching Actors|attach it to the mover]] so it moves with it.
; Use more than one mover: Nothing says that only one mover can have the same tag.  Set up several movers with the MoverTag tag and set them to do different things.  Combine this with the &quot;hidden mover&quot; trick and give them different durations and you have a way to trigger events at various points throughout the completion process (just make sure that only the mover which takes the longest is the one which sends an event back to the HoldObjective to disable it).  As an example, this technique is used in AS-Convoy to trigger the spawning of C4 packs at timed points while one is standing outside the door.

===TouchObjective===

The ProximityObjective&gt;&gt;TouchObjective is pretty simple: If a member of the attacking team touches it (enters its collision cylinder), it's completed.  This can be made a bit more sophisticated, however, by changing the ProximityObjective-&gt;ConstraintPawnClass to, for example, require that the attacker touching it be driving a particular type of vehicle (&quot;Get the hellbender to the checkpoint!&quot;), etc.

===UseObjective===

Again, the ProximityObjective&gt;&gt;UseObjective is also pretty simple: An attacker must get to it and hit the &quot;use&quot; key in order to complete it.  The collision cylinder of this objective determines how close somebody has to get before trying to &quot;use&quot; it.

===DestroyVehicleObjective===

As you might be able to guess from the name, this objective type is used for cases where you want somebody to have to destroy a particular vehicle in order to complete the objective.  Unlike most objectives, it doesn't matter where you place this one, and the way you use it isn't actually in the objective actor but mostly in your vehicle factory.

Now, we haven't gotten to vehicles yet in the tutorial (but we'll get there in the next section!), but suffice to say here that whenever you want a vehicle to be in your assault map, you need to place an ASVehicleFactory actor where you want it to spawn to generate the vehicle.  Once you have the DestroyVehicleObjective placed in your map, and you also have an ASVehicleFactory which is going to spawn the vehicle you want destroyed, you need to [[Legacy:Match These Tags|match these tags]]:

* DestroyVehicleObjective: Events-&gt;Tag
* ASVehicleFactory: ASVehicleFactory-&gt;VehicleEvent

And the rest is pretty much automatic.  Obviously, depending on your application, you may want to trigger the factory to spawn the vehicle when the objective becomes active, set it not to respawn when destroyed, etc.  Obviously, you will also want to set all the standard objective properties (event messages, etc) on the DestroyVehicelObjective actor.

Keep in mind that turrets are also spawned using ASVehicleFactory actors, and thus can also be used with a DestroyVehicleObjective (&quot;Destroy the plasma turret!&quot;).

===TriggeredObjective===

The TriggeredObjective is basically a &quot;generic&quot; objective which can be used in many cases when you want to do something not handled by any of the other objective types.  This objective will be completed when something somewhere triggers it (by generating an event which matches its Events-&gt;Tag).  The something somewhere can be a Trigger, or a ScriptedTrigger (it can technically be other kinds of actors too, but if you do this bots may get confused about how to attack the objective, so in general try to stick to Triggers and ScriptedTriggers.  Even when doing that, however, you may run into problems if you get too complicated.  Test thoroughly.).

Note that the HUD displays generated by a TriggeredObjective will show as being wherever the TriggeredObjective actor is placed, so you will generally want to place it near where the attackers will need to be to do whatever it is that will generate the trigger event or things might get confusing.

It should be noted that a particular type of trigger actor which may be useful in this context (and elsewhere) is the Triggers&gt;&gt;Trigger&gt;&gt;Trigger_ASTeam actor.  This is a basic (proximity) trigger which will only trigger if a member of the correct assault team (attackers or defenders) touches it.  You can choose which team triggers the actor by setting its Trigger_ASTeam-&gt;AssaultTeam property.

==Using Optional Objectives==

One last thing which isn't exactly a type of objective, but is something to consider when choosing objectives for your map is the use of optional objectives.  These are objectives which do not have to be completed in order to successfully complete the map, but can make things easier for the attackers or are otherwise significant events.  Examples of these include the bridge control at the beginning of AS-Glacier, and the forward weapon cache in AS-Convoy.

In order to make an objective which is optional, simply go into its properties and set its GameObjective-&gt;bOptionalObjective property to True.  As with other objectives, you can determine when optional objectives become active using their DefensePriority setting, but they won't prevent the next objective from becoming active as well.

==Other Neat Tricks==

===Flashing Objective Icons===

Is the flashing indicator displayed when somebody gets close to your objective not quite right?  You can change it by changing the objective's GameObjective-&gt;ObjectiveTypeIcon to a different texture.  There are several useful animated icons available in the AS_FX_TX package under the Icons group (use the FinalBlend ones) including a hellbender and ion tank icon.  Don't like those?  Make your own!

===Flashing Static Meshes===

Want to make it a bit clearer where people are supposed to be going or what they're supposed to be doing?  You can take a significant piece of scenery (or two) and make it flash when a particular objective becomes active (for example, a pad on the ground that indicates where to drive a vehicle, or for a UseObjective, make the control panel (or whatever is supposed to be used) flash).  To do this, go into the objective's properties and set its Assault-&gt;PhysicalObjectiveActorsTag to the tag of the static mesh(es) you want to flash when that objective becomes active.

----

(The next section is currently being written.  We apologize for the inconvenience.)

'''Return to the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] main page'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/PlayerStarts And The PlayerSpawnManager</title>
    <id>486</id>
    <revision>
      <id>1552</id>
      <timestamp>2007-06-05T15:36:12Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>Added a comment about ForcedPawnClass and spacefighters</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

----

==PlayerStarts and the PlayerSpawnManager==

Now it's time to set up how we're going to get players into this nice map of ours.  As you may have guessed, we're going to need two groups of PlayerStarts, one for the attackers and one for the defenders.

It's important to note here that you want to have at least as many PlayerSpawns in any given spot as you will have people on one team.  If there are too few PlayerSpawns for a given team somewhere, this can cause a bottleneck in gameplay, annoying players, and potentially throwing off the balance of the game.  The game engine will also complain bitterly in the log if it can't find somewhere to spawn somebody when it needs to.

==Attacker Spawns==

Let's start by placing some PlayerStarts for the attacking team at the far end of the valley from the base.  It's always better to have too many than too few, and we've deliberately left ourselves a reasonable space for it, so let's put down around 16 or so (16 for each side, so our map can support up to 32 players in a game, which should be more than people will usually want to do).  The next thing we want to do is set the PlayerStart-&gt;TeamNumber property on all of the PlayerStarts in this group to a unique number.  In this case, they should all default to 0, which is fine for here, so we'll leave that (but it doesn't hurt to check to make sure they all actually are set to 0).

That should do it, right?  Well, not quite.  Unlike for other game types, PlayerSpawn management for Assault is a bit more complicated.  Despite the name of the property, in Assault, PlayerStart-&gt;TeamNumber does not actually determine what team uses a PlayerStart.  Instead, the TeamNumber property is actually used to group PlayerStarts into groups (all PlayerStarts with the same TeamNumber are in the same group), and we use another actor to actually control how each group is used (you'll see why this is useful later).  What we need to do now is tell the game that &quot;PlayerSpawns in group 0&quot; (that is, all the PlayerSpawns in the game with a TeamNumber of 0) should be where the attacking team initially spawns.  To do this, [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Info&gt;&gt;[[Legacy:PlayerSpawnManager|PlayerSpawnManager]] actor to the map (it doesn't matter where, but put it close to the PlayerSpawns we just created so that it's easy to find later).  Open up the PlayerSpawnManager Properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Attackers
* PlayerSpawnManager-&gt;bEnabled = True
* PlayerSpawnManager-&gt;PlayerStartTeam = 0

Setting PlayerStartTeam to 0 tells the game that this PlayerSpawnManager will affect any PlayerSpawns which have a TeamNumber of 0.  bEnabled tells it that this group of PlayerStarts will be active as soon as the game starts, and setting AssaultTeam to EPSM_Attackers, tells it that the attacking team should spawn here.

==Defender Spawns==

Next, we'll set up the PlayerSpawns for the defenders.  We'll have them spawn on top of the base roof, so go there and put down the same number of PlayerSpawn actors as we gave to the attackers (16).  Now, select all of the defender PlayerSpawns, bring up their properties, and set PlayerSpawn-&gt;TeamNumber to 1.  We now have a group of PlayerSpawns which are part of &quot;group 1&quot; instead of the &quot;group 0&quot; we created for the attackers.

Now create a PlayerSpawnManager actor for the defending team, somewhere near group 1.  Open up its properties, and set the following:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Defenders
* PlayerSpawnManager-&gt;bEnabled = True
* PlayerSpawnManager-&gt;PlayerStartTeam = 1

Now we have a second PlayerSpawnManager, which affects all PlayerSpawns with a TeamNumber of 1 (&quot;group 1&quot;), is initially active when the game starts, and tells the game that defenders should spawn here.

==Equipment and Supplies==

With a lot of other game types, obtaining the right weapons and ammo are part of the challenge, and thus they're scattered about the map in various locations where people can track down and grab what they want.  Assault is a timed challenge, however, and spending a lot of time running all over the place to stock up on weapons every time you die before you can rejoin the assault is both annoying to players and problematic to game flow, so most Assault maps make a point of placing most of the stuff players are going to need conveniently right next to where they're going to spawn, so they can load up quickly and get back into the fight.

The compact way to go about this for weapons and ammo is to use a few [[Legacy:WeaponLocker|WeaponLocker]]s at each spawn area with appropriate weapons for the task at hand.  You will generally want at least a couple of WeaponLockers in each spawn area, so that everybody isn't rushing to one point as soon as they spawn and causing a big traffic accident.  For each of our two spawn areas, let's [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Pickup&gt;&gt;WeaponLocker or two.  For each WeaponLocker, we will now need to tell the game what type of weapons we should be supplying.  To do this, open the properties, go to the WeaponLocker-&gt;Weapons property, and [[Legacy:Extend The Dynamic Array|extend the dynamic array]] for each weapon type you want the given locker to carry.  For each new array entry, select the WeaponClass property and choose what type of weapon to use (Note: &quot;SniperRifle&quot; is actually the Lightning Gun.  The real sniper rifle is &quot;ClassicSniperRifle&quot;).  That's about all there is to it!

You will want to put a bit of thought into what weapons you will have in which lockers, of course.  The choice of available weapons can affect not only the enjoyability of the game for the players but how the balance works out (for example, if the defenders all get rocket launchers and shock rifles, and the attackers only get bio rifles, it can make it a lot harder for the attackers to actually get close enough to complete the objective.  This isn't necessarily a bad thing, though.  Tweaking available weapons is a good way to make adjustments if you find out that part of your map has balance issues).  You also don't want to just give everybody everything off the bat, because part of Assault is also the challenge of using what you've been given to achieve a goal.  Realism also plays a role too, of course.  What self-respecting army would go in to blow up a blast door but arm their soldiers with only flak cannons?

Also, keep in mind that just because you've got WeaponLockers in place doesn't mean you can't hide a goodie or two elsewhere in the map for people to discover and pick up (such as sticking a Flak Cannon behind the crates in RobotFactory, for example).  Be creative.  Is there some weapon that would be really useful in a particular scenario?  Make people put some effort into finding or obtaining it.

For the purposes of our map, we will give the attackers:
;Rocket Launcher: We are going to be blowing things up after all..
;Lightning Gun (&quot;SniperRifle&quot; in the properties): To pick off pesky defenders from a safe distance.
;Flak Cannon: Challenging for attacking with, but might be useful to those skilled with it.
;Link Gun: Good at doing damage to doors as a backup for the rocket launcher, and a decent short-to-mid range weapon for those who can use it.
;Minigun: Just because it's always a fun choice for mowing down opposition.

For a little variety, let's give our defenders:
;Lightning Gun (&quot;SniperRifle&quot;): For picking off pesky attackers as they come over the hill.
;Bio Rifle: Very useful for defending things, for those who know how to use it.
;Flak Cannon: For those not skilled enough for the Bio Rifle :)
;Shock Rifle: Handy for keeping an oncoming horde at a distance.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==

'''Kirk:''' Not truly related to the topic at hand, but the [[Legacy:PlayerSpawnManager|PlayerSpawnManager]] also has something called a ForcedPawnClass. Here you can enter the [[Legacy:Pawn|Pawn]] you want the player to spawn as. This is particularly useful to spawn a player as/in a vehicle, most notably an [[Legacy:ASVehicle_SpaceFighter|ASVehicle_SpaceFighter]]. The spawnmanager assigns the player to a spawn group as described, so the spacefighter spawns at one of the [[Legacy:PlayerStart|PlayerStart]]s that have that group set as their team number. Don't forget to set OverridePawnClass to ESPM_ForcedPawnClass (or at least I think that is necessary for it to work).</text>
    </revision>
    <revision>
      <id>1553</id>
      <timestamp>2004-11-21T20:08:46Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

This page is a section of the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]].  If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.

'''Previous Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Destroyable Objective]]'''

'''Next Section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

----

==PlayerStarts and the PlayerSpawnManager==

Now it's time to set up how we're going to get players into this nice map of ours.  As you may have guessed, we're going to need two groups of PlayerStarts, one for the attackers and one for the defenders.

It's important to note here that you want to have at least as many PlayerSpawns in any given spot as you will have people on one team.  If there are too few PlayerSpawns for a given team somewhere, this can cause a bottleneck in gameplay, annoying players, and potentially throwing off the balance of the game.  The game engine will also complain bitterly in the log if it can't find somewhere to spawn somebody when it needs to.

==Attacker Spawns==

Let's start by placing some PlayerStarts for the attacking team at the far end of the valley from the base.  It's always better to have too many than too few, and we've deliberately left ourselves a reasonable space for it, so let's put down around 16 or so (16 for each side, so our map can support up to 32 players in a game, which should be more than people will usually want to do).  The next thing we want to do is set the PlayerStart-&gt;TeamNumber property on all of the PlayerStarts in this group to a unique number.  In this case, they should all default to 0, which is fine for here, so we'll leave that (but it doesn't hurt to check to make sure they all actually are set to 0).

That should do it, right?  Well, not quite.  Unlike for other game types, PlayerSpawn management for Assault is a bit more complicated.  Despite the name of the property, in Assault, PlayerStart-&gt;TeamNumber does not actually determine what team uses a PlayerStart.  Instead, the TeamNumber property is actually used to group PlayerStarts into groups (all PlayerStarts with the same TeamNumber are in the same group), and we use another actor to actually control how each group is used (you'll see why this is useful later).  What we need to do now is tell the game that &quot;PlayerSpawns in group 0&quot; (that is, all the PlayerSpawns in the game with a TeamNumber of 0) should be where the attacking team initially spawns.  To do this, [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Info&gt;&gt;[[Legacy:PlayerSpawnManager|PlayerSpawnManager]] actor to the map (it doesn't matter where, but put it close to the PlayerSpawns we just created so that it's easy to find later).  Open up the PlayerSpawnManager Properties, and [[Legacy:Set The Following Properties|set the following properties]]:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Attackers
* PlayerSpawnManager-&gt;bEnabled = True
* PlayerSpawnManager-&gt;PlayerStartTeam = 0

Setting PlayerStartTeam to 0 tells the game that this PlayerSpawnManager will affect any PlayerSpawns which have a TeamNumber of 0.  bEnabled tells it that this group of PlayerStarts will be active as soon as the game starts, and setting AssaultTeam to EPSM_Attackers, tells it that the attacking team should spawn here.

==Defender Spawns==

Next, we'll set up the PlayerSpawns for the defenders.  We'll have them spawn on top of the base roof, so go there and put down the same number of PlayerSpawn actors as we gave to the attackers (16).  Now, select all of the defender PlayerSpawns, bring up their properties, and set PlayerSpawn-&gt;TeamNumber to 1.  We now have a group of PlayerSpawns which are part of &quot;group 1&quot; instead of the &quot;group 0&quot; we created for the attackers.

Now create a PlayerSpawnManager actor for the defending team, somewhere near group 1.  Open up its properties, and set the following:

* PlayerSpawnManager-&gt;AssaultTeam = EPSM_Defenders
* PlayerSpawnManager-&gt;bEnabled = True
* PlayerSpawnManager-&gt;PlayerStartTeam = 1

Now we have a second PlayerSpawnManager, which affects all PlayerSpawns with a TeamNumber of 1 (&quot;group 1&quot;), is initially active when the game starts, and tells the game that defenders should spawn here.

==Equipment and Supplies==

With a lot of other game types, obtaining the right weapons and ammo are part of the challenge, and thus they're scattered about the map in various locations where people can track down and grab what they want.  Assault is a timed challenge, however, and spending a lot of time running all over the place to stock up on weapons every time you die before you can rejoin the assault is both annoying to players and problematic to game flow, so most Assault maps make a point of placing most of the stuff players are going to need conveniently right next to where they're going to spawn, so they can load up quickly and get back into the fight.

The compact way to go about this for weapons and ammo is to use a few [[Legacy:WeaponLocker|WeaponLocker]]s at each spawn area with appropriate weapons for the task at hand.  You will generally want at least a couple of WeaponLockers in each spawn area, so that everybody isn't rushing to one point as soon as they spawn and causing a big traffic accident.  For each of our two spawn areas, let's [[Legacy:Add An Actor|add an Actor]]&gt;&gt;Pickup&gt;&gt;WeaponLocker or two.  For each WeaponLocker, we will now need to tell the game what type of weapons we should be supplying.  To do this, open the properties, go to the WeaponLocker-&gt;Weapons property, and [[Legacy:Extend The Dynamic Array|extend the dynamic array]] for each weapon type you want the given locker to carry.  For each new array entry, select the WeaponClass property and choose what type of weapon to use (Note: &quot;SniperRifle&quot; is actually the Lightning Gun.  The real sniper rifle is &quot;ClassicSniperRifle&quot;).  That's about all there is to it!

You will want to put a bit of thought into what weapons you will have in which lockers, of course.  The choice of available weapons can affect not only the enjoyability of the game for the players but how the balance works out (for example, if the defenders all get rocket launchers and shock rifles, and the attackers only get bio rifles, it can make it a lot harder for the attackers to actually get close enough to complete the objective.  This isn't necessarily a bad thing, though.  Tweaking available weapons is a good way to make adjustments if you find out that part of your map has balance issues).  You also don't want to just give everybody everything off the bat, because part of Assault is also the challenge of using what you've been given to achieve a goal.  Realism also plays a role too, of course.  What self-respecting army would go in to blow up a blast door but arm their soldiers with only flak cannons?

Also, keep in mind that just because you've got WeaponLockers in place doesn't mean you can't hide a goodie or two elsewhere in the map for people to discover and pick up (such as sticking a Flak Cannon behind the crates in RobotFactory, for example).  Be creative.  Is there some weapon that would be really useful in a particular scenario?  Make people put some effort into finding or obtaining it.

For the purposes of our map, we will give the attackers:
;Rocket Launcher: We are going to be blowing things up after all..
;Lightning Gun (&quot;SniperRifle&quot; in the properties): To pick off pesky defenders from a safe distance.
;Flak Cannon: Challenging for attacking with, but might be useful to those skilled with it.
;Link Gun: Good at doing damage to doors as a backup for the rocket launcher, and a decent short-to-mid range weapon for those who can use it.
;Minigun: Just because it's always a fun choice for mowing down opposition.

For a little variety, let's give our defenders:
;Lightning Gun (&quot;SniperRifle&quot;): For picking off pesky attackers as they come over the hill.
;Bio Rifle: Very useful for defending things, for those who know how to use it.
;Flak Cannon: For those not skilled enough for the Bio Rifle :)
;Shock Rifle: Handy for keeping an oncoming horde at a distance.

----

'''Proceed to the next section: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Attacking And Defending]]'''

----

This tutorial was originally written and contributed to the Wiki community by [[Legacy:Foogod|Foogod]].  Questions and comments are welcome!  Please either leave them on my personal page or at the bottom of the relevant tutorial page.  If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).

Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] page.  Look there for older comments and thread discussions.

==Comments:==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault Mapping Tutorial/WrapUp</title>
    <id>492</id>
    <revision>
      <id>1565</id>
      <timestamp>2007-03-05T20:22:44Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===The end to an assault map is to polish it.===

==1. Botpathing==

-Right click on the spot you want to place a pathnode and and right click and then click &quot;Add a pathnode here&quot;.-

Make a chain of these throughoutt your level to key areas (weapons, vehicles, objectives, defence areas, etc.) and then rebuild.

-Make sure you don't place them to far apart. -

-View paths by right clicking the titble bar of the viewport you want to view it in and click &quot;show paths&quot; and you will see lines connecting your pathnodes. -

-Green indicate good paths-

-Yellow indicate that a problem could happen-

-Red indicates that a problem is detected with that path-

-A lot of pathing problems are just improper spacing-

-To make vehicle paths goto the Actor Browser and click -

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]] &gt;&gt; Chosen Actor  }}

and then click the one you want to place. Goto your map and right click and click &quot;add flyng pathnode/Roadpathnode here&quot;.

-Add jumpspots to allow jumping of bots to keypoints.-

-You can test out the rest of the actors in NavigationPoints to get different effects.-

-If you have an objectve, vheicle, or playerstart they have navigation points that act as pathnodes. A playerstart acts as a pathnode by itself.-

==2. Adding scenery==

Add scenery to add to the realism of your map.

Don't pick scenery just becuase it looks cool. An example is where you make a temple styled map and choose shiptech walls and floors for the walls. This can be done if the maps backstory,matinee, or other scenery fits, but can be odd.

Make sure to test your scenery from different angles to detect holes, and misalighnment.

Scenery can also be used to add obstacles, and shorcuts to your map. Make sure you make paths to fit your scenery.

==3. Add efects==

Add emitters, precipitation, mesh effects and decorations to add to realism to your map. 

The same goes for effects as for scenery, make sure it fits your map. An example would be if you have a space map and you make a fire torch, it it just doesn't seem right.

Emitters can be triggered and be directional. Your scenery and effects can also be interactive as to be triggered by an objective,switch, volume, or other type of actor/event.

==4. Add ambience,fog, and skybox effects.==

You can add ambience sound, precipitation and small efects for a skybox.

Adding level ambience is easy: goto view &gt;&gt; level properties. Then goto Audio. Specify volume and the &quot;song&quot; to be added. The song is just and .OGG file in your music directory in ut2004 folder. Don't include the .ogg extension when listing it here.

You can convert an mp3, wav, etc to .ogg with Audacity. Audacity is free and is very reliable for sound conversion, creation, and editing.  [http://audacity.sourceforge.net/ Download]

Add fog by going to ZoneLight under level properties and changing fog color and distance and other values to suite your needs. 

Skybox effects can be movers, decorations, karma objects, textures, emitters, and mesh effects.

Test how it looks by clicking on the viewport you want to view it in and right click its title and bar click view backdrop.  Make sure your in the view of the surface that has the fake backdrop.

==5. Beta test==

-Have your friends, servers, online people, beta test your map for bugs,improvements, and functionality. They can say how good/bad it is. They can also test how it plays, and online glitches bugs, look and feel of your map. Then after you fix errors and improve beta test again then release it for the public.-

'''Blip2:''' You might want to read the rest of the tut before posting this - botpathing is covered - it also really doesn't have anything new to say...</text>
    </revision>
    <revision>
      <id>1566</id>
      <timestamp>2007-03-04T20:13:18Z</timestamp>
      <contributor>
        <ip>Abdlwibas01-pool1-a11.abdlwi.tds.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===The end to an assault map is to polish it.===

==1. Botpathing==

-Right click on the spot you want to place a pathnode and and right click and then click &quot;Add a pathnode here&quot;.-

Make a chain of these throughoutt your level to key areas (weapons, vehicles, objectives, defence areas, etc.) and then rebuild.

-Make sure you don't place them to far apart. -

-View paths by right clicking the titble bar of the viewport you want to view it in and click &quot;show paths&quot; and you will see lines connecting your pathnodes. -

-Green indicate good paths-

-Yellow indicate that a problem could happen-

-Red indicates that a problem is detected with that path-

-A lot of pathing problems are just improper spacing-

-To make vehicle paths goto the Actor Browser and click -

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]] &gt;&gt; Chosen Actor  }}

and then click the one you want to place. Goto your map and right click and click &quot;add flyng pathnode/Roadpathnode here&quot;.

-Add jumpspots to allow jumping of bots to keypoints.-

-You can test out the rest of the actors in NavigationPoints to get different effects.-

-If you have an objectve, vheicle, or playerstart they have navigation points that act as pathnodes. A playerstart acts as a pathnode by itself.-

==2. Adding scenery==

Add scenery to add to the realism of your map.

Don't pick scenery just becuase it looks cool. An example is where you make a temple styled map and choose shiptech walls and floors for the walls. This can be done if the maps backstory,matinee, or other scenery fits, but can be odd.

Make sure to test your scenery from different angles to detect holes, and misalighnment.

Scenery can also be used to add obstacles, and shorcuts to your map. Make sure you make paths to fit your scenery.

==3. Add efects==

Add emitters, precipitation, mesh effects and decorations to add to realism to your map. 

The same goes for effects as for scenery, make sure it fits your map. An example would be if you have a space map and you make a fire torch, it it just doesn't seem right.

Emitters can be triggered and be directional. Your scenery and effects can also be interactive as to be triggered by an objective,switch, volume, or other type of actor/event.

==4. Add ambience,fog, and skybox effects.==

You can add ambience sound, precipitation and small efects for a skybox.

Adding level ambience is easy: goto view &gt;&gt; level properties. Then goto Audio. Specify volume and the &quot;song&quot; to be added. The song is just and .OGG file in your music directory in ut2004 folder. Don't include the .ogg extension when listing it here.

You can convert an mp3, wav, etc to .ogg with Audacity. Audacity is free and is very reliable for sound conversion, creation, and editing.  [http://audacity.sourceforge.net/ Download]

Add fog by going to ZoneLight under level properties and changing fog color and distance and other values to suite your needs. 

Skybox effects can be movers, decorations, karma objects, textures, emitters, and mesh effects.

Test how it looks by clicking on the viewport you want to view it in and right click its title and bar click view backdrop.  Make sure your in the view of the surface that has the fake backdrop.

==5. Beta test==

-Have your friends, servers, online people, beta test your map for bugs,improvements, and functionality. They can say how good/bad it is. They can also test how it plays, and online glitches bugs, look and feel of your map. Then after you fix errors and improve beta test again then release it for the public.-</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assault2Uzi</title>
    <id>460</id>
    <revision>
      <id>1509</id>
      <timestamp>2005-12-25T18:19:39Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Creating an Uzi===

====Changing the AssaultRifle's Spread and Rate of Fire properties====

===Where to start?===

The first hurdle, but fortunatly not a very big one. Assuming that you downloaded the UT2003 source and have [[Legacy:UnCodeX|UnCodeX]] installed, we can start to look for classes which relate to the AssaultRifle in game.In UnCodeX you can find classes by pressing Ctrl+F,and  in the search area typing Assault. THis will then find the classes with Assault in thier name, keep searching till you find AssaultRifle and open that file.

If you look through the code and down to the defaultproperties you will notice that there is no mention of spread or anything which seems to control the rate of fire? however you will notice the FireModeClass(0) and (1) variables and what they assigned to. So now we know search for the class AssaultFire in UnCodeX and open AssaultFire. Looking at the defaultproperties here we have found that there are mentions of spread and also rate of fire so we want to extend this file also finally we want to extend AssaultRiflePickup so we can place the new weapon in our maps.

====Files You should have found====
*AssaultRifle.uc
*AssaultFire.uc
*AssaultRiflePickup.uc

===Starting the code===

First thing we want to do is make our uzi class, as we have no new models or sounds we can just use the AssaultRifle &quot;as is&quot; in the game. Subclassing the AssaultRifle will save us a lot of code. So create a file called Uzi.uc and add the code:

&lt;USCRIPT&gt;//===============================

// Uzi.uc 

//===============================

class Uzi extends AssaultRifle;&lt;/USCRIPT&gt;

We only need to add a few defaultproperties, in this class which will make it different from the assault rifle

&lt;USCRIPT&gt;

defaultproperties

{
  ItemName=&quot;Uzi&quot;                     //Name of item
  FireModeClass(0)=UziFire           //This refers to the primary 
                                     //Firemode and points to
                                     //UziFire Class
  PickupClass=class'UziPickup'       //This is the Class pointed to
                                     //for pick up in the game

}
&lt;/USCRIPT&gt;
 
*Things To Do
##What files too look at
##Make first changes -ROF and Spread {code snippet}
##Use Log tp show that spread is not changing even though we overide function.
##Highlight problem of subclassing super.func()/super(class).func()
##Correct Problem code {snipet}
##Possibly make mut for in game or run through commands to bring it in game?

==Discussion==

'''SuperApe:''' Incomplete?  Needs linkage?

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1510</id>
      <timestamp>2004-03-07T16:25:53Z</timestamp>
      <contributor>
        <ip>Rhodan</ip>
      </contributor>
      <comment>Made a start</comment>
      <text xml:space="preserve">===Creating an Uzi===

====Changing the AssaultRifle's Spread and Rate of Fire properties====

===Where to start?===

The first hurdle, but fortunatly not a very big one. Assuming that you downloaded the UT2003 source and have [[Legacy:UnCodeX|UnCodeX]] installed, we can start to look for classes which relate to the AssaultRifle in game.In UnCodeX you can find classes by pressing Ctrl+F,and  in the search area typing Assault. THis will then find the classes with Assault in thier name, keep searching till you find AssaultRifle and open that file.

If you look through the code and down to the defaultproperties you will notice that there is no mention of spread or anything which seems to control the rate of fire? however you will notice the FireModeClass(0) and (1) variables and what they assigned to. So now we know search for the class AssaultFire in UnCodeX and open AssaultFire. Looking at the defaultproperties here we have found that there are mentions of spread and also rate of fire so we want to extend this file also finally we want to extend AssaultRiflePickup so we can place the new weapon in our maps.

====Files You should have found====
*AssaultRifle.uc
*AssaultFire.uc
*AssaultRiflePickup.uc

===Starting the code===

First thing we want to do is make our uzi class, as we have no new models or sounds we can just use the AssaultRifle &quot;as is&quot; in the game. Subclassing the AssaultRifle will save us a lot of code. So create a file called Uzi.uc and add the code:

&lt;USCRIPT&gt;//===============================

// Uzi.uc 

//===============================

class Uzi extends AssaultRifle;&lt;/USCRIPT&gt;

We only need to add a few defaultproperties, in this class which will make it different from the assault rifle

&lt;USCRIPT&gt;

defaultproperties

{
  ItemName=&quot;Uzi&quot;                     //Name of item
  FireModeClass(0)=UziFire           //This refers to the primary 
                                     //Firemode and points to
                                     //UziFire Class
  PickupClass=class'UziPickup'       //This is the Class pointed to
                                     //for pick up in the game

}
&lt;/USCRIPT&gt;
 
*Things To Do
##What files too look at
##Make first changes -ROF and Spread {code snippet}
##Use Log tp show that spread is not changing even though we overide function.
##Highlight problem of subclassing super.func()/super(class).func()
##Correct Problem code {snipet}
##Possibly make mut for in game or run through commands to bring it in game?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultAmmoPickup</title>
    <id>28287</id>
    <revision>
      <id>39944</id>
      <timestamp>2009-11-14T18:24:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultFire</title>
    <id>28527</id>
    <revision>
      <id>40228</id>
      <timestamp>2009-11-17T11:02:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultGrenade</title>
    <id>28351</id>
    <revision>
      <id>40018</id>
      <timestamp>2009-11-14T20:19:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultInfo</title>
    <id>508</id>
    <revision>
      <id>1600</id>
      <timestamp>2006-12-06T07:31:29Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Class header added</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; AssaultInfo (Package: BotPack)}}

===Assault Info:===

An Assault Info Actor allows for that cool little screen that appears when you press F3 during a UT match. It allows you to set up screen shots of each objective and put a short background to your level.

====Assault Info Properties:====

NumShots

The total number of rows to show on the HUD when the Assault Info is displayed. This denotes the number of screenshots that will be visible.

====ObjDesc (0-7)====

Allows you to describe your level objectives. It may be possible to use multiple actors to make more objectives, the scroll bars in the window seem to work.

====ObjShots (0-7)====

Assign screenshots that will be shown in the display here. Import these like your average Screenshot UT into the MyLevel package, ensure to give them meaningful names.

There isn’t a lot else to be said really, the code just declares the class and defines some variables.

===Discussion:===

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1601</id>
      <timestamp>2006-03-24T10:22:41Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>Added my notes. Ported from Mapping For AS (UT), well most of it.</comment>
      <text xml:space="preserve">===Assault Info:===

An Assault Info Actor allows for that cool little screen that appears when you press F3 during a UT match. It allows you to set up screen shots of each objective and put a short background to your level.

Assault Info Properties:

NumShots

The total number of rows to show on the HUD when the Assault Info is displayed. This denotes the number of screenshots that will be visible.

====ObjDesc (0-7)====

Allows you to describe your level objectives. It may be possible to use multiple actors to make more objectives, the scroll bars in the window seem to work.

====ObjShots (0-7)====

Assign screenshots that will be shown in the display here. Import these like your average Screenshot UT into the MyLevel package, ensure to give them meaningful names.

There isn’t a lot else to be said really, the code just declares the class and defines some variables.

===Discussion:===</text>
    </revision>
    <revision>
      <id>1602</id>
      <timestamp>2006-03-24T10:22:56Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Assault Info:===

An Assault Info Actor allows for that cool little screen that appears when you press F3 during a UT match. It allows you to set up screen shots of each objective and put a short background to your level.

====Assault Info Properties:====

NumShots

The total number of rows to show on the HUD when the Assault Info is displayed. This denotes the number of screenshots that will be visible.

====ObjDesc (0-7)====

Allows you to describe your level objectives. It may be possible to use multiple actors to make more objectives, the scroll bars in the window seem to work.

====ObjShots (0-7)====

Assign screenshots that will be shown in the display here. Import these like your average Screenshot UT into the MyLevel package, ensure to give them meaningful names.

There isn’t a lot else to be said really, the code just declares the class and defines some variables.

===Discussion:===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultPath</title>
    <id>412</id>
    <revision>
      <id>1364</id>
      <timestamp>2006-04-17T16:48:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; AssaultPath (Package: UnrealGame)}}

This actor is used in [[Legacy:Bot Pathing|Bot Pathing]] to specify alternate routes for attackers in team games. Bots are attacking a [[Legacy:GameObjective|GameObjective]], and AssaultPath actors are used to give them different routes towards it.

==Properties==

===AssaultPath Group===
; bool bEnabled :  if false, this AssaultPath is no longer active: bots will ignore it (and presumably treat it as a dumb NavigationPoint). Trigger this actor to toggle this variable.
; bool bNoGrouping : By default, bots will wait at this point to reform squads. Set to true to prevent this behaviour.   
; bool bNoReturn :  By default, bots will use this path on the return from the objective. Set to true to prevent this behaviour.   
; bool bReturnOnly : This path must only be used for return from the objective. 
; name ObjectiveTag : Match this to the Event -&gt; Tag of the objective the bots are attacking
; name PathTag[4] : The name of the route through this AssaultPath. More than one route can go through a given AssaultPath, and a route can involve several AssaultPath actors.
; int Position :  specifies relative position in a chain of AssaultPaths with the same PathTag and the same ObjectiveTag. Low numbers are furthest from the objective. In other words, bots travel along an increasing sequence of numbers (0,1,2,...) to attack the enemy, and decreasing to return home.
; float Priority : 0 to 1, higher means heavier weighting when determining whether to use this path

===Hidden===
; [[Legacy:GameObjective|GameObjective]] AssociatedObjective : The GameObjective this AssaultPath has been associated with through the ObjectiveTag property.
; AssaultPath NextPath : Reference to the next item in the associated [[Legacy:GameObjective|GameObjective]]'s AlternatePaths [[Legacy:Linked List|linked List]].

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1365</id>
      <timestamp>2005-12-18T04:48:42Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; AssaultPath (Package: UnrealGame)}}

This actor is used in [[Legacy:Bot Pathing|Bot Pathing]] to specify alternate routes for attackers in team games. Bots are attacking a [[Legacy:GameObjective|GameObjective]], and AssaultPath actors are used to give them different routes towards it.

==Properties==

===AssaultPath Group===
; bool bEnabled :  if false, this AssaultPath is no longer active: bots will ignore it (and presumably treat it as a dumb NavigationPoint). Trigger this actor to toggle this variable.
; bool bNoGrouping : By default, bots will wait at this point to reform squads. Set to true to prevent this behaviour.   
; bool bNoReturn :  By default, bots will use this path on the return from the objective. Set to true to prevent this behaviour.   
; bool bReturnOnly : This path must only be used for return from the objective. 
; name ObjectiveTag : Match this to the Event -&gt; Tag of the objective the bots are attacking
; name PathTag[4] : The name of the route through this AssaultPath. More than one route can go through a given AssaultPath, and a route can involve several AssaultPath actors.
; int Position :  specifies relative position in a chain of AssaultPaths with the same PathTag and the same ObjectiveTag. Low numbers are furthest from the objective. In other words, bots travel along an increasing sequence of numbers (0,1,2,...) to attack the enemy, and decreasing to return home.
; float Priority : 0 to 1, higher means heavier weighting when determining whether to use this path

===Hidden===
; [[Legacy:GameObjective|GameObjective]] AssociatedObjective : 
; AssaultPath NextPath : [[Legacy:Linked List|Linked List]] of AssaultPaths for the associated [[Legacy:GameObjective|GameObjective]].

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultRandomizer</title>
    <id>497</id>
    <revision>
      <id>1577</id>
      <timestamp>2005-04-25T17:49:45Z</timestamp>
      <contributor>
        <ip>204.196.71.91</ip>
      </contributor>
      <minor/>
      <comment>Added reference to AS-OceanFloor.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; AssaultRandomizer (Package: Botpack)}}

The AssaultRandomizer is a special type of [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] used in a small number of [[Legacy:Assault|Assault]] maps for UT.  It contains only one new property called '''ToggledCost''', a float variable indicating how much extra cost this node imparts on the navigation paths around it.  The AssaultRandomizer will toggle this cost on or off by being triggered, and the cost only applies to [[Legacy:Bot (UT)|Bot (UT)]]s on the attacking team.

For an example of how to place AssaultRandomizers, open AS-OceanFloor in UnrealEd.

==Related Topics ==
*[[Legacy:Mapping For AS (UT)|Mapping for AS (UT)]]
*[[Legacy:Assault|Assault]]
*[[Legacy:AssaultInfo|AssaultInfo]]
*[[Legacy:FortStandard|FortStandard]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssaultRifle</title>
    <id>403</id>
    <revision>
      <id>1343</id>
      <timestamp>2006-10-22T08:13:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; AssaultRifle (Package: xWeapons)}}

Assault Rifle is one of the two main weapons that a character starts out with in any type of game. It is a basic weapon that can deal damage but the pain it inflicts is not one to be rivaled to higher weapons like the Flak Cannon, Rocket Launcher, or perhaps lightning gun (if wielded correctly). The maximum ammunition for the Assault Rifle is 100 bullets.

The Assault Rifle also contains grenades that can be activated by the alternative fire button. The grenades can be fired at different rates depending how long the alternative fire button is held down. The grenades will promptly detonate 5 seconds from launch. These grenades can also affect the character that shot it. Max amount of grenades: 8

===Ammo pickups===

Ammo Pickups can be found as a cartridge of bullets with a round case of grenades.

Provides only 4 grenades.

----

[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy Class (UT2004)]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;rarr; needs property and function descriptions
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1344</id>
      <timestamp>2006-10-21T04:26:51Z</timestamp>
      <contributor>
        <ip>C-71-229-236-215.hsd1.co.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*Corrected Grenades spelling for last word</comment>
      <text xml:space="preserve">Assault Rifle is one of the two main weapons that a character starts out with in any type of game. It is a basic weapon that can deal damage but the pain it inflicts is not one to be rivaled to higher weapons like the Flak Cannon, Rocket Launcher, or perhaps lightning gun (if wielded correctly). The maximum ammunition for the Assault Rifle is 100 bullets.

The Assault Rifle also contains grenades that can be activated by the alternative fire button. The grenades can be fired at different rates depending how long the alternative fire button is held down. The grenades will promptly detonate 5 seconds from launch. These grenades can also affect the character that shot it. Max amount of grenades: 8

===Ammo pickups===

Ammo Pickups can be found as a cartridge of bullets with a round case of grenades.

Provides only 4 grenades.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssertMover</title>
    <id>28844</id>
    <revision>
      <id>42771</id>
      <timestamp>2010-03-30T16:16:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Assigning Music To Maps</title>
    <id>493</id>
    <revision>
      <id>1567</id>
      <timestamp>2005-03-22T10:03:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The music selection for a map is set in the [[Legacy:Level Properties|level properties]] through [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties -&gt; Audio.

If you want to use a track that you have already imported into your map (see [[Legacy:Importing Music|Importing Music]] for how), or that came with the game you are mapping for, you need to make sure the track is selected in the [[Legacy:Music Browser|Music Browser]]. Click the Use button in the Song section of the level properties. The package name and music track will appear in the text box.

Now, save the map and [[Legacy:Playtest|playtest]] it to see if everything works.

==Related Topics ==
* [[Legacy:Music|Music]]
* [[Legacy:Importing Music|Importing Music]]

==Comments ==

'''Tarquin:''' I can't get songs to play in the music browser :(

'''Wormbo:''' You won't hear anything unless you turn on the music in Unreal Tournament.

'''DirkFirst:''' I've made a component [[Legacy:DynaMusic|DynaMusic]] that will let you have an optional music track (Meaning people won't need the music package to play the map) :)

'''Birelli:''' All text (including comments) above this was ported over from the [[Legacy:Music|Music]] page.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1568</id>
      <timestamp>2005-03-22T00:30:48Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Assigning Music to Maps ==

The music selection for a map is set in the [[Legacy:Level Properties|level properties]] through [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties -&gt; Audio.

If you want to use a track that you have already imported into your map (see [[Legacy:Importing Music|Importing Music]] for how), or that came with the game you are mapping for, you need to make sure the track is selected in the [[Legacy:Music Browser|Music Browser]]. Click the Use button in the Song section of the level properties. The package name and music track will appear in the text box.

Now, save the map and [[Legacy:Playtest|playtest]] it to see if everything works.

==Related Topics ==
* [[Legacy:Music|Music]]
* [[Legacy:Importing Music|Importing Music]]

==Comments ==

'''Tarquin:''' I can't get songs to play in the music browser :(

'''Wormbo:''' You won't hear anything unless you turn on the music in Unreal Tournament.

'''DirkFirst:''' I've made a component [[Legacy:DynaMusic|DynaMusic]] that will let you have an optional music track (Meaning people won't need the music package to play the map) :)

'''Birelli:''' All text (including comments) above this was ported over from the [[Legacy:Music|Music]] page.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssociativeArray</title>
    <id>440</id>
    <revision>
      <id>1469</id>
      <timestamp>2005-11-18T20:23:23Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">When learning [[Legacy:UnrealScript|UnrealScript]] I found the idea of operator overloading very enticing. These pages describe the design and implementation of an associative array, providing (I hope) some insight into how UnrealScript operators are overloaded.

==Overview  ==

An [[Wikipedia:associative array]] is an array that is indexed by something ''other'' than a sequence of small integers. C++ has &lt;tt&gt;std::map&lt;/tt&gt;, Perl has its &lt;tt&gt;hash&lt;/tt&gt;, and JavaScript has its structures. The power of these structures is that using them is ''just like'' using a regular array; assuming that &lt;tt&gt;AA&lt;/tt&gt; is a &lt;tt&gt;map&lt;/tt&gt; from string to string, the following C++ code should make sense:

&lt;uscript&gt;
AA[&quot;pet&quot;] = &quot;dog&quot;;
AA[&quot;car&quot;] = &quot;jaguar&quot;;
AA[&quot;programming language&quot;] = &quot;UnrealScript&quot;;

cout &lt;&lt; AA[&quot;programming language&quot;] &lt;&lt; endl;   // C++ output statement
&lt;/uscript&gt;
 

Associative arrays are powerful data structures; much of their power stems from their &quot;natural&quot; notation. [[Legacy:UnrealScript|UnrealScript's]] [[Legacy:Scripting_Operators|operator overloading]] provides a chance to implement associative arrays with a &quot;natural&quot; notation (for an appropriately loose definition of natural).

This proof of concept focuses on implementing an associative array indexed by strings and containing strings. There are three phases of implementation:

* Selecting a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DataStructure|datastructure]] to associate key/value pairs of strings.
* Selecting [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OperatorOverloading|operators]] to wrap the data structure in &quot;natural&quot; notation.
* Making [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iterator|iterators]] to traverse the contents of the associative array.

The remainder of this page discusses the high-level design of the each phase; the copiously commented code for each phase is included in its own subpage.

==Data Structure==

An associtive array associates keys drawn from some domain with values drawn from some domain. Thus it is a mapping from key space to value space.

Depending on speed requirements and restrictions placed on key and vlaue types, such a mapping could be implemented with a hard-coded function, a linear array of pairs, a haash table of pairs, or a tree of pairs. This is a representative rather than an exhaustive list.

A function is a good, compact representation if it is easy to hard-code the relationship between key and value types. Not an option for associative arrays.

A linear list of pairs could be implemented as a [[Legacy:Dynamic_Array|UT2K3 dynamic array]] of structs or objects. An unsorted list is easy to insert into but costly to look things up in; a sorted list is faster for lookup but more costly for insertion. The overall cost is just a little bit too high; besides, this is a chance to play with [[Legacy:UnrealScript|UnrealScript]] and that seems too easy.

A hash table is fast for lookup and insertion but a good hash function is difficult to design. Also, a hash table makes in-order traversal of the data difficult without another data structure.

A binary search tree is a good compromise with fairly fast insertion, fairly fast lookup, and easy ordered traversal (assuming the tree is close to balanced). Other, more complex, trees can make tight guarantees on performance. This proof of concept uses a simple BST

For demonstration purposes, we use strings as both keys and values. The only real restriction on the types is that key values must be comparable with &lt;tt&gt;&amp;lt;&lt;/tt&gt; and &lt;tt&gt;----&lt;/tt&gt;. The ordering requirement can be relaxed with a linear list or hash table.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DataStructure]] presents the code that implements the BST nodes and BST. The decision was made that an associative array is single valued.

==Operators ==

After implementing an association between keys and values, it is necessary to wrap calls to the impelemntation functions in [[Legacy:UnrealScript|UnrealScript]] operators.

===Diversion: Picking Operators===

By preference, overloading either &lt;tt&gt;[]&lt;/tt&gt; or &lt;tt&gt;()&lt;/tt&gt; would make the associative array notation most natural. [[Legacy:UnrealScript|UnrealScript]] does not treat either pair of symbols as an operator so they cannot be overloaded. The UT [[Legacy:Dynamic_Array|dynamic arrays]] implementation used the &lt;tt&gt;&amp;lt;&amp;lt;&lt;/tt&gt; operator for assignment and paired the &lt;tt&gt;&amp;lt;&amp;gt;&lt;/tt&gt; operators for refering to elements in the array. Treating the &lt;tt&gt;&amp;lt;&lt;/tt&gt; and &lt;tt&gt;&amp;gt;&lt;/tt&gt; operators as angle brackets produced a pleasing appearance as in

&lt;uscript&gt;
if (best&lt;&quot;movie&quot;&gt; == &quot;Road Warrior&quot;)
  log(&quot;Programmer is too old.&quot;);
&lt;/uscript&gt;

The only thing missing is an assignment operator. Using the left-shift operator breaks the &quot;naturalness&quot; of using the associative array as an array and the assignment operator (&lt;tt&gt;=&lt;/tt&gt;) is not available for redefinition. &lt;tt&gt;&amp;gt;=&lt;/tt&gt; (greater-than equals) ''is'' available and it can make for some very &quot;natural&quot; assignment statements:

&lt;uscript&gt;
best&lt;&quot;icecream&quot;&gt;= &quot;vanilla&quot;;
best&lt;&quot;vegetable&quot;&gt;= &quot;califlower&quot;;
best&lt;&quot;stooge&quot;&gt;= &quot;moe&quot;;
&lt;/uscript&gt;

There cannot be a space between the &lt;tt&gt;&amp;gt;&lt;/tt&gt; and the &lt;tt&gt;=&lt;/tt&gt; (it has to parse as a single symbol for the operator look up to trigger) but that is a small price to pay for something that looks like assignment to an element in an array.

----

Now for the hard part: &lt;tt&gt;best&amp;lt;&quot;icecream&lt;/tt&gt; can be the prefix to either an assignment statement ''or'' an evaluation of a value in the associative array. In computer science speak, we want &lt;tt&gt;best&amp;lt;&quot;icecream&lt;/tt&gt; to represent either an ''l-value'' (left-hand side of an assignment) or an ''r-value'' (right-hand side of an assignemnt statement). Note that [[Legacy:UnrealScript|UnrealScript]] has no way of knowing, parsing left-to-right, what the following context of the given prefix is.

In C++ (and in Perl, under the hood) the problem is solved using ''references''; the &lt;tt&gt;[]&lt;/tt&gt; operator typically returns a reference to the element in the &quot;array&quot; and the compiler can convert a reference (really an l-value) into an r-value at need. [[Legacy:UnrealScript|UnrealScript]] has no reference type so that solution is not possible.

Inspired by the [[Legacy:Dynamic_Array|Dynamic_Array]] for UT, this solution uses a ''proxy'' class. In [[Legacy:Dynamic_Array|Dynamic_Array]] the author uses a special type to represent the indices for setting values; here the prefix expression (the array, the angle bracket, and the key string) will return a type that can behave as either an l-value or an r-value.

&lt;tt&gt;AAProxy&lt;/tt&gt; serves this role by keeping track of a location inside an associative array. If it is followed by a &lt;tt&gt;&amp;gt;&lt;/tt&gt; it returns the value stored at that location. If it is followed by a &lt;tt&gt;&amp;gt;=&lt;/tt&gt; it sets the value at that location to the value of the expression following the operator. Yes, this is far, far too clever to be considered good code; in my humble opinion, it is also far, far too clever to be considered bad code.

===Diversion: Operator Precedence===

Both [[Legacy:Operators|Operators]] and [[Legacy:Scripting_Operators|Scripting_Operators]] cover operator precedence. [[Legacy:Scripting_Operators|Scripting_Operators]] does leave the impression that when scripting an operator, the compiler pays attention to the precedence number you set for the operator. This may be the case when defining operators that are not already part of the system. It is most definitely '''not''' the case when defining (or should that be redefining) operators that already exist. So the &lt;tt&gt;&amp;gt;=&lt;/tt&gt; operator has precedence 24 as defined in &lt;tt&gt;Object.uc&lt;/tt&gt; and any version I define will have that same precedence ''no matter what number I put as its precedence''.

This became a problem when defining the &lt;tt&gt;&amp;gt;=&lt;/tt&gt; operator. It is supposed to be an assignment operator so it should bind very loosely. In particular, it should probably bind more loosely than &lt;tt&gt;$&lt;/tt&gt; so that the following line assigns &quot;golden-delicious&quot; to the associative array entry &quot;apple&quot;:

&lt;uscript&gt;
AA&lt;&quot;apple&quot;&gt;=&quot;golden&quot;$&quot;-delicious&quot;;
&lt;/uscript&gt;

Unfortunately, the line assigns the value &quot;golden&quot; to the entry, concatenates &quot;golden&quot; with &quot;-delicious&quot; and throws away the value of the expression. The following parentheses are necessary:

&lt;uscript&gt;
AA&lt;&quot;apple&quot;&gt;=(&quot;golden&quot;$&quot;-delicious&quot;);
&lt;/uscript&gt;

----

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OperatorOverloading]] presents the code for the &lt;tt&gt;AAProxy&lt;/tt&gt; and the demonstration commandlet. [[Legacy:UnrealScript|UnrealScript]] restricts the use of overloaded operators to the decendents of the class defining them; without access to &lt;tt&gt;Object&lt;/tt&gt;, the associative array operators are defined in the commandlet. This limits the usefulness of the associative array.

==Iterator==

It is not possible to write an [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Iterator|iterator]] in script alone. Without access to the engine source code, the &lt;tt&gt;AssociativeArrayIterator&lt;/tt&gt; was designed to emulate the iterators in C++'s STL. So the iterator is a class that behaves like a pointer at a location in the associative array. The &quot;only&quot; way to get an iterator is through a call to an iterator generating function of an associated array: &lt;tt&gt;AssociativeArray::begin()&lt;/tt&gt; or &lt;tt&gt;AssociativeArray::end()&lt;/tt&gt;.

&lt;tt&gt;begin()&lt;/tt&gt; returns an &lt;tt&gt;AssociativeArrayIterator&lt;/tt&gt; that refers to the first element in the array (if there is one) and &lt;tt&gt;end()&lt;/tt&gt; returns an iterator that is one ''past'' the last element in the associative array (this is C++'s standard asymetry). With appropriately defined &lt;tt&gt;++&lt;/tt&gt; and &lt;tt&gt;!=&lt;/tt&gt; operators for iterators, the following loop should visit every element in the associative array:

&lt;uscript&gt;
local AssociatveArrayIterator it;

for (it = best.begin(); it != best.end(); ++i) {
  // visit element referred to by it here
}
&lt;/uscript&gt;

We need some manner of &quot;visiting&quot; the elements. One solution is to use two functions, one to get the key and the other to get the value at the location referred to by the iterator. This is done here with &lt;tt&gt;first()&lt;/tt&gt; and &lt;tt&gt;second()&lt;/tt&gt; so to log the key/value pairs, the following code works:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    log(it.first() $ &quot;/&quot; $ it.second(), 'AssociativeArray');
}
&lt;/uscript&gt;

This is nice. Could we use operators? Sure. Assume you only need the value (not the key) associated with each element. Then the following notation works:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    log(&quot;Value: &quot; $ &lt;it&gt; , 'AssociativeArray');
}
&lt;/uscript&gt;

But what if we wanted to append &quot;'s&quot; to every value. Could it be done? With the mechanics we have already developed, having &lt;tt&gt;&amp;lt;it&lt;/tt&gt; return an &lt;tt&gt;AAProxy&lt;/tt&gt;, it can use the same r-value/l-value determination used for regular array access with iterators. So you can add the &quot;'s&quot; with the following code:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    &lt;it&gt;= &lt;it&gt; $ &quot;'s&quot;;
}
&lt;/uscript&gt;

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iterator]] presents the code for the iterator and its supporting stack. The actual algorithm for traversing a BST is described in the embedded comments.

==Extensions ==

It may be hard to believe after looking at the amount written about this silly proof of concept but there is more that could be done. The operations on the array could be extended (but notation would have to be found), iterators could be extended (forward and reverse, iterator invalidation), and it could easily be made more efficient.

The BST implementation could be extended with a mechanism for removing nodes. It would be nice to come up with an obvious, natural notation for deleting a node. There is also no way to check whether a given key is in the associative array (no way to differentiate between a stored empty string and a key that is not present).

The iterator could be more closely associated with the associative array in such a way that the iterator could be invalidated (or corrected, perahps) when the associative array changes. Invalidation could be accomplished with a list of active iterators (iterators on the array) that is checked when the array changes.

Using &lt;tt&gt;new&lt;/tt&gt; is the standard way of allocating binary search tree nodes. In [[Legacy:UnrealScript|UnrealScript]] it would be more efficient to maintain a dynamic array of BST nodes; this would be even more advantageous when deletion is possible. The associative array could keep a free list threaded through the dynamic array or it could compact the array on occasion (iterators would have to be invalidated in this case, too).

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Dynamic Array|Dynamic Array]]
* [[Legacy:Operators|Operators]]
* [[Legacy:Scripting Operators|Scripting Operators]]
* [[Legacy:Iterator|Iterator]]

==Discussion==

'''El Muerte TDS:''' Nice concept, too bad that this adds a lot of overhead. Usualy it's better to just create a Key-Value struct and a dynamic array of this struct. The engine does support associative arrays, it's called Map. But there are no unrealscript bindings for it.

'''''Bcladd:''''' Of course this adds a great deal of overhead; all the preparation is done so the loop for traversing the structure appears &quot;natural&quot;. Only argument against the straight dynamic array of key/value pairs is the cost of lookup and insertion (both O(''n'')). Actually, the implementation of associative array (and iterator) could be changed very easily and the operator notation still used. Note that I wrote this implementation before I had ever seen the insides of the engine.

'''El Muerte TDS:''' The cost of lookup and insertion for a dynamic array is less than using object references and function calls in unreal script. Functions have to be lookup in each object before they are executed. 

'''''Bcladd:''''' Point taken: the constant cost of multiple (recursive) function calls from script outweights the asymptotic performance benefits of the binary tree for any realistic number of entries. This really is just a write up of my playing with operator overloading from script. Since I got great pleasure out of the [[Legacy:Dynamic Array|UT dynamic array]] code, I thought someone might find the hackery here interesting.

'''Mychaeel:''' El Muerte &amp;ndash; Without wanting to go into details at this time (and without claiming intimate knowledge of the Unreal engine), I am rather sure that function invocations in UnrealScript are constant-time and rather efficient at that.  I expect that after loading an UnrealScript class into memory all function references in function calls are directly resolved as pointers to the C++ &quot;UnrealScript function&quot; objects that are stored as such in UnrealScript code packages; involving any sort of hash or array lookup in calling an UnrealScript function on engine level would strike me as needlessly inefficient.

Bcladd &amp;ndash; It's a real pity I don't have the time to look into your code right now, but from what I've seen at a first glance I'm pretty intrigued by your approach.  I'll certainly have a closer look when I've got my normal share of free time back.</text>
    </revision>
    <revision>
      <id>1470</id>
      <timestamp>2003-09-04T23:04:48Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When learning [[Legacy:UnrealScript|UnrealScript]] I found the idea of operator overloading very enticing. These pages describe the design and implementation of an associative array, providing (I hope) some insight into how UnrealScript operators are overloaded.

==Associative Arrays==
    

An associative array is an array that is indexed by something ''other'' than a sequence of small integers. C++ has &lt;tt&gt;std::map&lt;/tt&gt;, Perl has its &lt;tt&gt;hash&lt;/tt&gt;, and JavaScript has its structures. The power of these structures is that using them is ''just like'' using a regular array; assuming that &lt;tt&gt;AA&lt;/tt&gt; is a &lt;tt&gt;map&lt;/tt&gt; from string to string, the following C++ code should make sense:

&lt;uscript&gt;
AA[&quot;pet&quot;] = &quot;dog&quot;;
AA[&quot;car&quot;] = &quot;jaguar&quot;;
AA[&quot;programming language&quot;] = &quot;UnrealScript&quot;;

cout &lt;&lt; AA[&quot;programming language&quot;] &lt;&lt; endl;   // C++ output statement
&lt;/uscript&gt;
 

Associative arrays are powerful data structures; much of their power stems from their &quot;natural&quot; notation. [[Legacy:UnrealScript|UnrealScript's]] [[Legacy:Scripting_Operators|operator overloading]] provides a chance to implement associative arrays with a &quot;natural&quot; notation (for an appropriately loose definition of natural).

This proof of concept focuses on implementing an associative array indexed by strings and containing strings. There are three phases of implementation:

* Selecting a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DataStructure|datastructure]] to associate key/value pairs of strings.
* Selecting [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OperatorOverloading|operators]] to wrap the data structure in &quot;natural&quot; notation.
* Making [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iterator|iterators]] to traverse the contents of the associative array.

The remainder of this page discusses the high-level design of the each phase; the copiously commented code for each phase is included in its own subpage.

==Data Structure==

An associtive array associates keys drawn from some domain with values drawn from some domain. Thus it is a mapping from key space to value space.

Depending on speed requirements and restrictions placed on key and vlaue types, such a mapping could be implemented with a hard-coded function, a linear array of pairs, a haash table of pairs, or a tree of pairs. This is a representative rather than an exhaustive list.

A function is a good, compact representation if it is easy to hard-code the relationship between key and value types. Not an option for associative arrays.

A linear list of pairs could be implemented as a [[Legacy:Dynamic_Array|UT2K3 dynamic array]] of structs or objects. An unsorted list is easy to insert into but costly to look things up in; a sorted list is faster for lookup but more costly for insertion. The overall cost is just a little bit too high; besides, this is a chance to play with [[Legacy:UnrealScript|UnrealScript]] and that seems too easy.

A hash table is fast for lookup and insertion but a good hash function is difficult to design. Also, a hash table makes in-order traversal of the data difficult without another data structure.

A binary search tree is a good compromise with fairly fast insertion, fairly fast lookup, and easy ordered traversal (assuming the tree is close to balanced). Other, more complex, trees can make tight guarantees on performance. This proof of concept uses a simple BST

For demonstration purposes, we use strings as both keys and values. The only real restriction on the types is that key values must be comparable with &lt;tt&gt;&amp;lt;&lt;/tt&gt; and &lt;tt&gt;----&lt;/tt&gt;. The ordering requirement can be relaxed with a linear list or hash table.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DataStructure]] presents the code that implements the BST nodes and BST. The decision was made that an associative array is single valued.

==Operators==

After implementing an association between keys and values, it is necessary to wrap calls to the impelemntation functions in [[Legacy:UnrealScript|UnrealScript]] operators.

===Diversion: Picking Operators===

By preference, overloading either &lt;tt&gt;[]&lt;/tt&gt; or &lt;tt&gt;()&lt;/tt&gt; would make the associative array notation most natural. [[Legacy:UnrealScript|UnrealScript]] does not treat either pair of symbols as an operator so they cannot be overloaded. The UT [[Legacy:Dynamic_Array|dynamic arrays]] implementation used the &lt;tt&gt;&amp;lt;&amp;lt;&lt;/tt&gt; operator for assignment and paired the &lt;tt&gt;&amp;lt;&amp;gt;&lt;/tt&gt; operators for refering to elements in the array. Treating the &lt;tt&gt;&amp;lt;&lt;/tt&gt; and &lt;tt&gt;&amp;gt;&lt;/tt&gt; operators as angle brackets produced a pleasing appearance as in

&lt;uscript&gt;
if (best&lt;&quot;movie&quot;&gt; == &quot;Road Warrior&quot;)
  log(&quot;Programmer is too old.&quot;);
&lt;/uscript&gt;

The only thing missing is an assignment operator. Using the left-shift operator breaks the &quot;naturalness&quot; of using the associative array as an array and the assignment operator (&lt;tt&gt;=&lt;/tt&gt;) is not available for redefinition. &lt;tt&gt;&amp;gt;=&lt;/tt&gt; (greater-than equals) ''is'' available and it can make for some very &quot;natural&quot; assignment statements:

&lt;uscript&gt;
best&lt;&quot;icecream&quot;&gt;= &quot;vanilla&quot;;
best&lt;&quot;vegetable&quot;&gt;= &quot;califlower&quot;;
best&lt;&quot;stooge&quot;&gt;= &quot;moe&quot;;
&lt;/uscript&gt;

There cannot be a space between the &lt;tt&gt;&amp;gt;&lt;/tt&gt; and the &lt;tt&gt;=&lt;/tt&gt; (it has to parse as a single symbol for the operator look up to trigger) but that is a small price to pay for something that looks like assignment to an element in an array.

----

Now for the hard part: &lt;tt&gt;best&amp;lt;&quot;icecream&lt;/tt&gt; can be the prefix to either an assignment statement ''or'' an evaluation of a value in the associative array. In computer science speak, we want &lt;tt&gt;best&amp;lt;&quot;icecream&lt;/tt&gt; to represent either an ''l-value'' (left-hand side of an assignment) or an ''r-value'' (right-hand side of an assignemnt statement). Note that [[Legacy:UnrealScript|UnrealScript]] has no way of knowing, parsing left-to-right, what the following context of the given prefix is.

In C++ (and in Perl, under the hood) the problem is solved using ''references''; the &lt;tt&gt;[]&lt;/tt&gt; operator typically returns a reference to the element in the &quot;array&quot; and the compiler can convert a reference (really an l-value) into an r-value at need. [[Legacy:UnrealScript|UnrealScript]] has no reference type so that solution is not possible.

Inspired by the [[Legacy:Dynamic_Array|Dynamic_Array]] for UT, this solution uses a ''proxy'' class. In [[Legacy:Dynamic_Array|Dynamic_Array]] the author uses a special type to represent the indices for setting values; here the prefix expression (the array, the angle bracket, and the key string) will return a type that can behave as either an l-value or an r-value.

&lt;tt&gt;AAProxy&lt;/tt&gt; serves this role by keeping track of a location inside an associative array. If it is followed by a &lt;tt&gt;&amp;gt;&lt;/tt&gt; it returns the value stored at that location. If it is followed by a &lt;tt&gt;&amp;gt;=&lt;/tt&gt; it sets the value at that location to the value of the expression following the operator. Yes, this is far, far too clever to be considered good code; in my humble opinion, it is also far, far too clever to be considered bad code.

===Diversion: Operator Precedence===

Both [[Legacy:Operators|Operators]] and [[Legacy:Scripting_Operators|Scripting_Operators]] cover operator precedence. [[Legacy:Scripting_Operators|Scripting_Operators]] does leave the impression that when scripting an operator, the compiler pays attention to the precedence number you set for the operator. This may be the case when defining operators that are not already part of the system. It is most definitely '''not''' the case when defining (or should that be redefining) operators that already exist. So the &lt;tt&gt;&amp;gt;=&lt;/tt&gt; operator has precedence 24 as defined in &lt;tt&gt;Object.uc&lt;/tt&gt; and any version I define will have that same precedence ''no matter what number I put as its precedence''.

This became a problem when defining the &lt;tt&gt;&amp;gt;=&lt;/tt&gt; operator. It is supposed to be an assignment operator so it should bind very loosely. In particular, it should probably bind more loosely than &lt;tt&gt;$&lt;/tt&gt; so that the following line assigns &quot;golden-delicious&quot; to the associative array entry &quot;apple&quot;:

&lt;uscript&gt;
AA&lt;&quot;apple&quot;&gt;=&quot;golden&quot;$&quot;-delicious&quot;;
&lt;/uscript&gt;

Unfortunately, the line assigns the value &quot;golden&quot; to the entry, concatenates &quot;golden&quot; with &quot;-delicious&quot; and throws away the value of the expression. The following parentheses are necessary:

&lt;uscript&gt;
AA&lt;&quot;apple&quot;&gt;=(&quot;golden&quot;$&quot;-delicious&quot;);
&lt;/uscript&gt;

----

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OperatorOverloading]] presents the code for the &lt;tt&gt;AAProxy&lt;/tt&gt; and the demonstration commandlet. [[Legacy:UnrealScript|UnrealScript]] restricts the use of overloaded operators to the decendents of the class defining them; without access to &lt;tt&gt;Object&lt;/tt&gt;, the associative array operators are defined in the commandlet. This limits the usefulness of the associative array.

==Iterator==

It is not possible to write an [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Iterator|iterator]] in script alone. Without access to the engine source code, the &lt;tt&gt;AssociativeArrayIterator&lt;/tt&gt; was designed to emulate the iterators in C++'s STL. So the iterator is a class that behaves like a pointer at a location in the associative array. The &quot;only&quot; way to get an iterator is through a call to an iterator generating function of an associated array: &lt;tt&gt;AssociativeArray::begin()&lt;/tt&gt; or &lt;tt&gt;AssociativeArray::end()&lt;/tt&gt;.

&lt;tt&gt;begin()&lt;/tt&gt; returns an &lt;tt&gt;AssociativeArrayIterator&lt;/tt&gt; that refers to the first element in the array (if there is one) and &lt;tt&gt;end()&lt;/tt&gt; returns an iterator that is one ''past'' the last element in the associative array (this is C++'s standard asymetry). With appropriately defined &lt;tt&gt;++&lt;/tt&gt; and &lt;tt&gt;!=&lt;/tt&gt; operators for iterators, the following loop should visit every element in the associative array:

&lt;uscript&gt;
local AssociatveArrayIterator it;

for (it = best.begin(); it != best.end(); ++i) {
  // visit element referred to by it here
}
&lt;/uscript&gt;

We need some manner of &quot;visiting&quot; the elements. One solution is to use two functions, one to get the key and the other to get the value at the location referred to by the iterator. This is done here with &lt;tt&gt;first()&lt;/tt&gt; and &lt;tt&gt;second()&lt;/tt&gt; so to log the key/value pairs, the following code works:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    log(it.first() $ &quot;/&quot; $ it.second(), 'AssociativeArray');
}
&lt;/uscript&gt;

This is nice. Could we use operators? Sure. Assume you only need the value (not the key) associated with each element. Then the following notation works:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    log(&quot;Value: &quot; $ &lt;it&gt; , 'AssociativeArray');
}
&lt;/uscript&gt;

But what if we wanted to append &quot;'s&quot; to every value. Could it be done? With the mechanics we have already developed, having &lt;tt&gt;&amp;lt;it&lt;/tt&gt; return an &lt;tt&gt;AAProxy&lt;/tt&gt;, it can use the same r-value/l-value determination used for regular array access with iterators. So you can add the &quot;'s&quot; with the following code:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    &lt;it&gt;= &lt;it&gt; $ &quot;'s&quot;;
}
&lt;/uscript&gt;

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iterator]] presents the code for the iterator and its supporting stack. The actual algorithm for traversing a BST is described in the embedded comments.

==Extensions==

It may be hard to believe after looking at the amount written about this silly proof of concept but there is more that could be done. The operations on the array could be extended (but notation would have to be found), iterators could be extended (forward and reverse, iterator invalidation), and it could easily be made more efficient.

The BST implementation could be extended with a mechanism for removing nodes. It would be nice to come up with an obvious, natural notation for deleting a node. There is also no way to check whether a given key is in the associative array (no way to differentiate between a stored empty string and a key that is not present).

The iterator could be more closely associated with the associative array in such a way that the iterator could be invalidated (or corrected, perahps) when the associative array changes. Invalidation could be accomplished with a list of active iterators (iterators on the array) that is checked when the array changes.

Using &lt;tt&gt;new&lt;/tt&gt; is the standard way of allocating binary search tree nodes. In [[Legacy:UnrealScript|UnrealScript]] it would be more efficient to maintain a dynamic array of BST nodes; this would be even more advantageous when deletion is possible. The associative array could keep a free list threaded through the dynamic array or it could compact the array on occasion (iterators would have to be invalidated in this case, too).

==Related Topics==

* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Dynamic Array|Dynamic Array]]
* [[Legacy:Operators|Operators]]
* [[Legacy:Scripting Operators|Scripting Operators]]
* [[Legacy:Iterator|Iterator]]

==Discussion==

'''El Muerte TDS:''' Nice concept, too bad that this adds a lot of overhead. Usualy it's better to just create a Key-Value struct and a dynamic array of this struct. The engine does support associative arrays, it's called Map. But there are no unrealscript bindings for it.

'''''Bcladd:''''' Of course this adds a great deal of overhead; all the preparation is done so the loop for traversing the structure appears &quot;natural&quot;. Only argument against the straight dynamic array of key/value pairs is the cost of lookup and insertion (both O(''n'')). Actually, the implementation of associative array (and iterator) could be changed very easily and the operator notation still used. Note that I wrote this implementation before I had ever seen the insides of the engine.

'''El Muerte TDS:''' The cost of lookup and insertion for a dynamic array is less than using object references and function calls in unreal script. Functions have to be lookup in each object before they are executed. 

'''''Bcladd:''''' Point taken: the constant cost of multiple (recursive) function calls from script outweights the asymptotic performance benefits of the binary tree for any realistic number of entries. This really is just a write up of my playing with operator overloading from script. Since I got great pleasure out of the [[Legacy:Dynamic Array|UT dynamic array]] code, I thought someone might find the hackery here interesting.

'''Mychaeel:''' El Muerte:  Without wanting to go into details at this time (and without claiming intimate knowledge of the Unreal engine), I am rather sure that function invocations in UnrealScript are constant-time and rather efficient at that.  I expect that after loading an UnrealScript class into memory all function references in function calls are directly resolved as pointers to the C++ &quot;UnrealScript function&quot; objects that are stored as such in UnrealScript code packages; involving any sort of hash or array lookup in calling an UnrealScript function on engine level would strike me as needlessly inefficient.</text>
    </revision>
    <revision>
      <id>1471</id>
      <timestamp>2004-08-11T12:49:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">When learning [[Legacy:UnrealScript|UnrealScript]] I found the idea of operator overloading very enticing. These pages describe the design and implementation of an associative array, providing (I hope) some insight into how UnrealScript operators are overloaded.

==Overview==
    

An [[Wikipedia:associative array]] is an array that is indexed by something ''other'' than a sequence of small integers. C++ has &lt;tt&gt;std::map&lt;/tt&gt;, Perl has its &lt;tt&gt;hash&lt;/tt&gt;, and JavaScript has its structures. The power of these structures is that using them is ''just like'' using a regular array; assuming that &lt;tt&gt;AA&lt;/tt&gt; is a &lt;tt&gt;map&lt;/tt&gt; from string to string, the following C++ code should make sense:

&lt;uscript&gt;
AA[&quot;pet&quot;] = &quot;dog&quot;;
AA[&quot;car&quot;] = &quot;jaguar&quot;;
AA[&quot;programming language&quot;] = &quot;UnrealScript&quot;;

cout &lt;&lt; AA[&quot;programming language&quot;] &lt;&lt; endl;   // C++ output statement
&lt;/uscript&gt;
 

Associative arrays are powerful data structures; much of their power stems from their &quot;natural&quot; notation. [[Legacy:UnrealScript|UnrealScript's]] [[Legacy:Scripting_Operators|operator overloading]] provides a chance to implement associative arrays with a &quot;natural&quot; notation (for an appropriately loose definition of natural).

This proof of concept focuses on implementing an associative array indexed by strings and containing strings. There are three phases of implementation:

* Selecting a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DataStructure|datastructure]] to associate key/value pairs of strings.
* Selecting [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OperatorOverloading|operators]] to wrap the data structure in &quot;natural&quot; notation.
* Making [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iterator|iterators]] to traverse the contents of the associative array.

The remainder of this page discusses the high-level design of the each phase; the copiously commented code for each phase is included in its own subpage.

==Data Structure==

An associtive array associates keys drawn from some domain with values drawn from some domain. Thus it is a mapping from key space to value space.

Depending on speed requirements and restrictions placed on key and vlaue types, such a mapping could be implemented with a hard-coded function, a linear array of pairs, a haash table of pairs, or a tree of pairs. This is a representative rather than an exhaustive list.

A function is a good, compact representation if it is easy to hard-code the relationship between key and value types. Not an option for associative arrays.

A linear list of pairs could be implemented as a [[Legacy:Dynamic_Array|UT2K3 dynamic array]] of structs or objects. An unsorted list is easy to insert into but costly to look things up in; a sorted list is faster for lookup but more costly for insertion. The overall cost is just a little bit too high; besides, this is a chance to play with [[Legacy:UnrealScript|UnrealScript]] and that seems too easy.

A hash table is fast for lookup and insertion but a good hash function is difficult to design. Also, a hash table makes in-order traversal of the data difficult without another data structure.

A binary search tree is a good compromise with fairly fast insertion, fairly fast lookup, and easy ordered traversal (assuming the tree is close to balanced). Other, more complex, trees can make tight guarantees on performance. This proof of concept uses a simple BST

For demonstration purposes, we use strings as both keys and values. The only real restriction on the types is that key values must be comparable with &lt;tt&gt;&amp;lt;&lt;/tt&gt; and &lt;tt&gt;----&lt;/tt&gt;. The ordering requirement can be relaxed with a linear list or hash table.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DataStructure]] presents the code that implements the BST nodes and BST. The decision was made that an associative array is single valued.

==Operators==

After implementing an association between keys and values, it is necessary to wrap calls to the impelemntation functions in [[Legacy:UnrealScript|UnrealScript]] operators.

===Diversion: Picking Operators===

By preference, overloading either &lt;tt&gt;[]&lt;/tt&gt; or &lt;tt&gt;()&lt;/tt&gt; would make the associative array notation most natural. [[Legacy:UnrealScript|UnrealScript]] does not treat either pair of symbols as an operator so they cannot be overloaded. The UT [[Legacy:Dynamic_Array|dynamic arrays]] implementation used the &lt;tt&gt;&amp;lt;&amp;lt;&lt;/tt&gt; operator for assignment and paired the &lt;tt&gt;&amp;lt;&amp;gt;&lt;/tt&gt; operators for refering to elements in the array. Treating the &lt;tt&gt;&amp;lt;&lt;/tt&gt; and &lt;tt&gt;&amp;gt;&lt;/tt&gt; operators as angle brackets produced a pleasing appearance as in

&lt;uscript&gt;
if (best&lt;&quot;movie&quot;&gt; == &quot;Road Warrior&quot;)
  log(&quot;Programmer is too old.&quot;);
&lt;/uscript&gt;

The only thing missing is an assignment operator. Using the left-shift operator breaks the &quot;naturalness&quot; of using the associative array as an array and the assignment operator (&lt;tt&gt;=&lt;/tt&gt;) is not available for redefinition. &lt;tt&gt;&amp;gt;=&lt;/tt&gt; (greater-than equals) ''is'' available and it can make for some very &quot;natural&quot; assignment statements:

&lt;uscript&gt;
best&lt;&quot;icecream&quot;&gt;= &quot;vanilla&quot;;
best&lt;&quot;vegetable&quot;&gt;= &quot;califlower&quot;;
best&lt;&quot;stooge&quot;&gt;= &quot;moe&quot;;
&lt;/uscript&gt;

There cannot be a space between the &lt;tt&gt;&amp;gt;&lt;/tt&gt; and the &lt;tt&gt;=&lt;/tt&gt; (it has to parse as a single symbol for the operator look up to trigger) but that is a small price to pay for something that looks like assignment to an element in an array.

----

Now for the hard part: &lt;tt&gt;best&amp;lt;&quot;icecream&lt;/tt&gt; can be the prefix to either an assignment statement ''or'' an evaluation of a value in the associative array. In computer science speak, we want &lt;tt&gt;best&amp;lt;&quot;icecream&lt;/tt&gt; to represent either an ''l-value'' (left-hand side of an assignment) or an ''r-value'' (right-hand side of an assignemnt statement). Note that [[Legacy:UnrealScript|UnrealScript]] has no way of knowing, parsing left-to-right, what the following context of the given prefix is.

In C++ (and in Perl, under the hood) the problem is solved using ''references''; the &lt;tt&gt;[]&lt;/tt&gt; operator typically returns a reference to the element in the &quot;array&quot; and the compiler can convert a reference (really an l-value) into an r-value at need. [[Legacy:UnrealScript|UnrealScript]] has no reference type so that solution is not possible.

Inspired by the [[Legacy:Dynamic_Array|Dynamic_Array]] for UT, this solution uses a ''proxy'' class. In [[Legacy:Dynamic_Array|Dynamic_Array]] the author uses a special type to represent the indices for setting values; here the prefix expression (the array, the angle bracket, and the key string) will return a type that can behave as either an l-value or an r-value.

&lt;tt&gt;AAProxy&lt;/tt&gt; serves this role by keeping track of a location inside an associative array. If it is followed by a &lt;tt&gt;&amp;gt;&lt;/tt&gt; it returns the value stored at that location. If it is followed by a &lt;tt&gt;&amp;gt;=&lt;/tt&gt; it sets the value at that location to the value of the expression following the operator. Yes, this is far, far too clever to be considered good code; in my humble opinion, it is also far, far too clever to be considered bad code.

===Diversion: Operator Precedence===

Both [[Legacy:Operators|Operators]] and [[Legacy:Scripting_Operators|Scripting_Operators]] cover operator precedence. [[Legacy:Scripting_Operators|Scripting_Operators]] does leave the impression that when scripting an operator, the compiler pays attention to the precedence number you set for the operator. This may be the case when defining operators that are not already part of the system. It is most definitely '''not''' the case when defining (or should that be redefining) operators that already exist. So the &lt;tt&gt;&amp;gt;=&lt;/tt&gt; operator has precedence 24 as defined in &lt;tt&gt;Object.uc&lt;/tt&gt; and any version I define will have that same precedence ''no matter what number I put as its precedence''.

This became a problem when defining the &lt;tt&gt;&amp;gt;=&lt;/tt&gt; operator. It is supposed to be an assignment operator so it should bind very loosely. In particular, it should probably bind more loosely than &lt;tt&gt;$&lt;/tt&gt; so that the following line assigns &quot;golden-delicious&quot; to the associative array entry &quot;apple&quot;:

&lt;uscript&gt;
AA&lt;&quot;apple&quot;&gt;=&quot;golden&quot;$&quot;-delicious&quot;;
&lt;/uscript&gt;

Unfortunately, the line assigns the value &quot;golden&quot; to the entry, concatenates &quot;golden&quot; with &quot;-delicious&quot; and throws away the value of the expression. The following parentheses are necessary:

&lt;uscript&gt;
AA&lt;&quot;apple&quot;&gt;=(&quot;golden&quot;$&quot;-delicious&quot;);
&lt;/uscript&gt;

----

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OperatorOverloading]] presents the code for the &lt;tt&gt;AAProxy&lt;/tt&gt; and the demonstration commandlet. [[Legacy:UnrealScript|UnrealScript]] restricts the use of overloaded operators to the decendents of the class defining them; without access to &lt;tt&gt;Object&lt;/tt&gt;, the associative array operators are defined in the commandlet. This limits the usefulness of the associative array.

==Iterator==

It is not possible to write an [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Iterator|iterator]] in script alone. Without access to the engine source code, the &lt;tt&gt;AssociativeArrayIterator&lt;/tt&gt; was designed to emulate the iterators in C++'s STL. So the iterator is a class that behaves like a pointer at a location in the associative array. The &quot;only&quot; way to get an iterator is through a call to an iterator generating function of an associated array: &lt;tt&gt;AssociativeArray::begin()&lt;/tt&gt; or &lt;tt&gt;AssociativeArray::end()&lt;/tt&gt;.

&lt;tt&gt;begin()&lt;/tt&gt; returns an &lt;tt&gt;AssociativeArrayIterator&lt;/tt&gt; that refers to the first element in the array (if there is one) and &lt;tt&gt;end()&lt;/tt&gt; returns an iterator that is one ''past'' the last element in the associative array (this is C++'s standard asymetry). With appropriately defined &lt;tt&gt;++&lt;/tt&gt; and &lt;tt&gt;!=&lt;/tt&gt; operators for iterators, the following loop should visit every element in the associative array:

&lt;uscript&gt;
local AssociatveArrayIterator it;

for (it = best.begin(); it != best.end(); ++i) {
  // visit element referred to by it here
}
&lt;/uscript&gt;

We need some manner of &quot;visiting&quot; the elements. One solution is to use two functions, one to get the key and the other to get the value at the location referred to by the iterator. This is done here with &lt;tt&gt;first()&lt;/tt&gt; and &lt;tt&gt;second()&lt;/tt&gt; so to log the key/value pairs, the following code works:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    log(it.first() $ &quot;/&quot; $ it.second(), 'AssociativeArray');
}
&lt;/uscript&gt;

This is nice. Could we use operators? Sure. Assume you only need the value (not the key) associated with each element. Then the following notation works:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    log(&quot;Value: &quot; $ &lt;it&gt; , 'AssociativeArray');
}
&lt;/uscript&gt;

But what if we wanted to append &quot;'s&quot; to every value. Could it be done? With the mechanics we have already developed, having &lt;tt&gt;&amp;lt;it&lt;/tt&gt; return an &lt;tt&gt;AAProxy&lt;/tt&gt;, it can use the same r-value/l-value determination used for regular array access with iterators. So you can add the &quot;'s&quot; with the following code:

&lt;uscript&gt;
for (it = best.begin(); it != best.end(); ++i) {
    &lt;it&gt;= &lt;it&gt; $ &quot;'s&quot;;
}
&lt;/uscript&gt;

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iterator]] presents the code for the iterator and its supporting stack. The actual algorithm for traversing a BST is described in the embedded comments.

==Extensions==

It may be hard to believe after looking at the amount written about this silly proof of concept but there is more that could be done. The operations on the array could be extended (but notation would have to be found), iterators could be extended (forward and reverse, iterator invalidation), and it could easily be made more efficient.

The BST implementation could be extended with a mechanism for removing nodes. It would be nice to come up with an obvious, natural notation for deleting a node. There is also no way to check whether a given key is in the associative array (no way to differentiate between a stored empty string and a key that is not present).

The iterator could be more closely associated with the associative array in such a way that the iterator could be invalidated (or corrected, perahps) when the associative array changes. Invalidation could be accomplished with a list of active iterators (iterators on the array) that is checked when the array changes.

Using &lt;tt&gt;new&lt;/tt&gt; is the standard way of allocating binary search tree nodes. In [[Legacy:UnrealScript|UnrealScript]] it would be more efficient to maintain a dynamic array of BST nodes; this would be even more advantageous when deletion is possible. The associative array could keep a free list threaded through the dynamic array or it could compact the array on occasion (iterators would have to be invalidated in this case, too).

==Related Topics==

* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Dynamic Array|Dynamic Array]]
* [[Legacy:Operators|Operators]]
* [[Legacy:Scripting Operators|Scripting Operators]]
* [[Legacy:Iterator|Iterator]]

==Discussion==

'''El Muerte TDS:''' Nice concept, too bad that this adds a lot of overhead. Usualy it's better to just create a Key-Value struct and a dynamic array of this struct. The engine does support associative arrays, it's called Map. But there are no unrealscript bindings for it.

'''''Bcladd:''''' Of course this adds a great deal of overhead; all the preparation is done so the loop for traversing the structure appears &quot;natural&quot;. Only argument against the straight dynamic array of key/value pairs is the cost of lookup and insertion (both O(''n'')). Actually, the implementation of associative array (and iterator) could be changed very easily and the operator notation still used. Note that I wrote this implementation before I had ever seen the insides of the engine.

'''El Muerte TDS:''' The cost of lookup and insertion for a dynamic array is less than using object references and function calls in unreal script. Functions have to be lookup in each object before they are executed. 

'''''Bcladd:''''' Point taken: the constant cost of multiple (recursive) function calls from script outweights the asymptotic performance benefits of the binary tree for any realistic number of entries. This really is just a write up of my playing with operator overloading from script. Since I got great pleasure out of the [[Legacy:Dynamic Array|UT dynamic array]] code, I thought someone might find the hackery here interesting.

'''Mychaeel:''' El Muerte &amp;ndash; Without wanting to go into details at this time (and without claiming intimate knowledge of the Unreal engine), I am rather sure that function invocations in UnrealScript are constant-time and rather efficient at that.  I expect that after loading an UnrealScript class into memory all function references in function calls are directly resolved as pointers to the C++ &quot;UnrealScript function&quot; objects that are stored as such in UnrealScript code packages; involving any sort of hash or array lookup in calling an UnrealScript function on engine level would strike me as needlessly inefficient.

Bcladd &amp;ndash; It's a real pity I don't have the time to look into your code right now, but from what I've seen at a first glance I'm pretty intrigued by your approach.  I'll certainly have a closer look when I've got my normal share of free time back.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssociativeArray/DataStructure</title>
    <id>441</id>
    <revision>
      <id>1472</id>
      <timestamp>2003-09-04T00:46:09Z</timestamp>
      <contributor>
        <ip>Bcladd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Associative Array Data Scructures==

Associative arrays are implemented as an unbalance binary search tree (BST). Thus there is a node type and a tree type. Both are Unreal classes (having the nodes be objects makes it easy to declare new ones on the fly).

===AssciativeArrrayNode===

A tree is built up of linked nodes. This is the node class with &quot;pointers&quot; at left and right subtrees as well as the parent node.

&lt;uscript&gt;
class AssociativeArrayNode
    extends Object;
/* A binary search tree (BST) node. Nodes are ordered on their key; the
   key must be a type that supports &lt; and ==. Associated with each key is a
   value; value can be any arbitrary type that supports assignment.

   This is really just a struct (no member functions). A class is used to
   permit the new operator in UnrealScript to work correctly. 
*/
var string key;
var string value;
var AssociativeArrayNode left_child, right_child, parent;

defaultproperties 
{
  parent=None
  left_child=None
  right_child=None
}
&lt;/uscript&gt;

===AssociativeArray===

This is the implementation of the BST.

&lt;uscript&gt;
class AssociativeArray
    extends Object;
/* Associative Array: Demonstration of operator overloading using UnrealScript.

   Inspired by DynamicArray code on the BeyondUnreal Wiki:
   http://wiki.beyondunreal.com/wiki/Dynamic_Array

   Uses a simple binary tree to hold pairs of strings with other strings;
   the key and data types could both be changed with little pain.
*/


/* Reference to the actual data structure. Under the hood, the associative
   array is a binary search tree (BST). Should search time prove a
   limitation, this proof of concept could be augmented with a smarter data
   structure (red-black tree, hash table, etc.).
*/
var AssociativeArrayNode root;

/* Since end() returns an iterator with the same value every time, it should
   be kept around after its first creation.
*/
var private AssociativeArrayIterator end_;


/* The number of elements in the associative array. This is a private field to
   limit access to it to the getLength function. Performance could be enhanced
   by making the member data publically visible if all clients of associative
   array could be trusted not to change it.
*/
var private int length;

/* return the number of elements in the associative array. */
function int getLength()
{
  return length;
} // getLength

/* insert a key/value pair into the associative array. */
function insert(coerce string key, string value) 
{
  p_insert(key, value, root);
} // insert

/* return the value matching the given key, if one exists; returns &quot;&quot; and
   leaves the associative array unchanged if there is no entry with the
   given key. Since &quot;&quot; could be a legal value, use count to determine
   whether or not a key is in the associative array.
*/
function string lookup(coerce string key) 
{
  local AssociativeArrayNode foundNode;
  foundNode = p_lookup(key, root);
  if (foundNode != None) {
    return foundNode.value;
  } else {
    return &quot;&quot;;
  }
} // lookup

/* return the number of entries for the given key. Since the associative
   array is really a map, only 0 (no such entry) or 1 (an entry for the key)
   are valid return values. The name &quot;count&quot; comes from the C++ STL.
*/
function int count(coerce string key) 
{
  local AssociativeArrayNode foundNode;
  foundNode = p_lookup(key, root);
  if (foundNode != None) {
    return 1;
  } else {
    return 0;
  }
} // count

/* log the contents of the associative array. Useful for debugging.
 */
function show() 
{
  p_show(root);
} // show

// -------------------------------------------------------------------------
// &quot;Iterator&quot; functions
// -------------------------------------------------------------------------
/* UnrealScript iterators are native functions. Without access to the C++
   portions of the engine, it is impossible to create new ones. As an
   intermediary step, the following functions return beginning and ending
   &quot;iterator&quot; values modeled on C++ iterators. begin() returns an iterator
   &quot;pointing to&quot; the first element in the associative array. end() returns
   one just past the end of all elements in the associative array.

   This means, in a C++/STL-esque manner (and assuming appropriate operator
   overloading), a loop across the whole array would look like this:

   local AssociativeArrayIterator it;
   for (it = someAA.begin(); it != someAA.end(); ++it) {
     // it.first() and it.second() refer to key and value of each pair in turn
   }
*/
/* Returns an iterator for the first element of the associative array. */
function AssociativeArrayIterator begin() 
{
  local AssociativeArrayIterator retval;

  retval = new(None) class'AssociativeArrayIterator';
  retval.init(self);
  return retval;
} // begin

/* Returns an iterator just past the end of this associative array. */
function AssociativeArrayIterator end() 
{
  if (end_ == None) {
    end_ = new(None) class'AssociativeArrayIterator';
    end_.init(self, true);
  }
  return end_;
} // end

// -------------------------------------------------------------------------
// Implementation functions
// -------------------------------------------------------------------------
/* Recursive implementations of binary search tree functions for inserting,
   lookup, and printing. The &quot;p_&quot; prefix shows that they are protected
   funcitons.
*/

/* insert key/value pair in the tree rooted at curr. */
protected function p_insert(string key, string value,
                            out AssociativeArrayNode curr) 
{
  if (curr == None) {
    curr = new(None) class'AssociativeArrayNode';
    curr.key = key;
    curr.value = value;
    length++;
  } else if (key &lt; curr.key) {
    p_insert(key, value, curr.left_child);
  } else if (key &gt; curr.key) {
    p_insert(key, value, curr.right_child);
  } else { // curr.key == key
    curr.value = value;
  }
}

/* Return a reference to the node with the given key;
   None if there isn't one. */
protected function AssociativeArrayNode p_lookup(string key,
                                                 AssociativeArrayNode curr) 
{
  if (curr == None) {
    return None;
  } else if (key &lt; curr.key) {
    return p_lookup(key, curr.left_child);
  } else if (key &gt; curr.key) {
    return p_lookup(key, curr.right_child);
  } else {
    return curr;
  }
}

/* In-order traversal of binary search tree calling log on each entry */
protected function p_show(AssociativeArrayNode curr) 
{
  if (curr != None) {
    p_show(curr.left_child);
    log(&quot;[&quot;$curr.key$&quot;] = &quot;$curr.value);
    p_show(curr.right_child);
  }
} // p_show

defaultproperties 
{
  root = None
  length = 0
} // defaultproperties
// AssociativeArray
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssociativeArray/Iterator</title>
    <id>443</id>
    <revision>
      <id>1475</id>
      <timestamp>2003-09-04T00:49:11Z</timestamp>
      <contributor>
        <ip>Bcladd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Iterator==

A script-only iterator must use a different syntax from the built-in [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Iterator|iterators]]. The syntax used here is &quot;close&quot; to that used in C++'s STL. Traversing an unthreaded binary search tree in order requires keeping track of the progress of the traversal; this is done in the activation stack in a recursive solution. It must be done explicitly with an iterator.

===AssociativeArrayIterator===

'''Warning''' this code is not insertion safe. That is, if elements are added to the associative array during a traversal, there is no way of knowing whether the nodes will be visited in the traversal. It is even less deletion save but this implementation of associative arrays doesn't support deletion.

&lt;uscript&gt;
class AssociativeArrayIterator
    extends Object;
/* A forward, read-only, in-order iterator for traversing an associative
   array (a binary search tree (BST)). The iterator is associated with a
   particular associative array, keeping track of its current position and
   a stack of &quot;open&quot; nodes.

   An in-order traversal visits the nodes of a BST in sorted order by their
   keys. The typical description of the traversal is recursive: &quot;left
   subtree, current node, right subtree&quot;. This means: do an in-order
   traversal of the left subtree, then visit the current node, then do an
   in-order traversal of the right subtree. Called on the root node of the
   tree, this will visit each node in sorted key order.

   An iterator cannot be recursive: each call to next should return the
   next element in the collection being interated over. Thus the iterator
   must capture the state of one step in the recursive, in-order
   traversal. The iterator uses a stack to keep a collection of &quot;opened&quot;
   but not yet visited nodes. These are exactly the nodes that would have
   been current in each recursive call down to the node being visited
   (curr_); the stack simulates the calling stack for the recursive version
   of the function and we can push and pop &quot;activation records&quot;, one at a
   time, to complete a traversal of the BST.
*/

/* The state of an iterator is captured in the binary tree being traversed,
   the current node, and the collection of open but not visited nodes.
*/
var private AssociativeArray tree_;
var private AssociativeArrayNode curr_;
var private AssociativeArrayNodeStack stack_;
/* Traversal order is determined by the contents of stack; the iterator must
   know when to push the root node onto the stack */
var private bool started_;

/* Initialize the iterator. aaTree is the associative array this iterator
   is iterating across. bSetCurrentNodeNone is set true if the current node
   should NOT be set to the first node in the tree. This backward logic is
   required to handle the &quot;optionalness&quot; of the parameter; if no parameter
   is provided on the call, the boolean value is false.
*/
function init(AssociativeArray aaTree, optional bool bSetCurrentNodeNone) 
{
  started_ = false;
  tree_ = aaTree;
  stack_ = new(None) class'AssociativeArrayNodeStack';
  if (!bSetCurrentNodeNone)
    next();
} // init

/* Get the first value from the current iterator position, the key in the
   key/value pair. */
function string first() 
{
  return curr_.key;
} // first

/* get the second value from the current iterator position, the value in
   the key/value pair. */
function string second() 
{
  return curr_.value;
} // second

function AssociativeArray getCollection()
{
  return tree_;
} // getCollection

function string getIndex()
{
  return curr_.key;
} // getIndex

function dump()
{
  local string dumpString;
  
  dumpString = Name$&quot;.dump(): &quot;
               $&quot;started_ = &quot;$started_
               $&quot;, tree_ = &quot;$tree_
               $&quot;, stack_ = &quot;$stack_
               $&quot;, curr_ = &quot;$curr_;
  if (curr_ != None)
    dumpString = dumpString
                 $&quot;, curr_.key = &quot;$curr_.key
                 $&quot;, curr_.value = &quot;$curr_.value;
  log(dumpString, 'DevAssociativeArray');
} // dump


/* Comparison operator calls this function */
function bool same(AssociativeArrayIterator other) 
{
  return ((tree_ == other.tree_) &amp;&amp; (curr_ == other.curr_));
} // same

/* advance to the next element. The next element is the left-most child of
   the root (first time through) or the left-most child of the right
   subtree (think about BST deletion routines and finding successor of a
   node to be deleted). */
function next() 
{
  local AssociativeArrayNode p;
  
  if (!started_) {
    p = tree_.root;
  } else {
    p = curr_;
    if (p != None)
      p = p.right_child;
  }

  do {
    while (p != None) {
      stack_.push(p);
      p = p.left_child;
    } // push all the left children

    if (!stack_.isEmpty()) {
      p = stack_.pop();
      started_ = true;
      curr_ = p;
      return;
    }
  } until (stack_.isEmpty());
  curr_ = None;
} // next()

defaultproperties 
{
  started_ = false
}
&lt;/uscript&gt;

===AssociativeArrayNodeStack===

The explicit state of an iteration in progress. A stack of &lt;tt&gt;AssociativeArrayNode&lt;/tt&gt;s.

&lt;uscript&gt;
class AssociativeArrayNodeStack
    extends Object;
/* A stack of array nodes; used to implement iterators. */


/* Implementation of the stack itself. Top of the stack is at
   impl[impl.Length-1]
*/
var private array&lt;AssociativeArrayNode&gt; impl;

/* is the stack currently empty? */
function bool isEmpty() 
{
  return (impl.Length == 0);
} // isEmpty

/* Push the given AssociateArrayNode on the top of the stack. */
function push(AssociativeArrayNode a)
{
  impl[impl.Length] = a;
} // push

/* Pop and top together: Return and remove the top element from the stack.
   If there is no such node, return None. */
function AssociativeArrayNode pop() 
{
  local AssociativeArrayNode retval;
  
  if (!isEmpty()) {
    retval = impl[impl.Length-1];
    impl.Remove(impl.Length - 1, 1);
    return retval;
  } else {
    return None;
  }
} // pop
// AssociativeArrayNodeStack
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AssociativeArray/OperatorOverloading</title>
    <id>442</id>
    <revision>
      <id>1473</id>
      <timestamp>2005-11-18T20:21:48Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Operators ==

Associative arrays use angle brackets as a &quot;natural&quot; notation. The operators are defined in the demonstration commandlet; they should be defined in a root-ward class so they can be used widely. This is just a proof of concept.

===AADemoCommandlet===

The commandlet contains the definitions and some demonstration code.

&lt;uscript&gt;
class AADemoCommandlet
    extends Commandlet;

/* The left-angle bracket operator. Returns an AAProxy, a proxy that can
   be converted either to a string or to a &quot;reference&quot; to a string. The
   operator parameters are an associative array  and the string index
   into the array. */
final operator(24) AAProxy &lt; (out AssociativeArray A, coerce string index) 
{
  local AAProxy aa;
  aa = new(None) class'AAProxy';
  aa.init(A, index);
  return aa; 
} // operator &lt;

/* The right-angle bracket operator; a postoperator as it finishes an
   expression with an AAProxy (an associative array generated the proxy).
   This converts a proxy to an r-value (a string) */
final postoperator string &gt; (AAProxy proxy) 
{
  return proxy.r_value();
} // operator &gt;

/* The combined right-angle bracket and assignment operator. It takes the
   rhs of the operator (a string) and assigns the value to the appropriate
   slot in the array. This operator converts the AAProxy into an
   l-value. */
final operator(24) string &gt;= (AAProxy A, coerce string value) 
{
  return A.l_value(value);
} // operator &gt;=

/* The left-angle bracket for use with AssociativeArrayIterator. Note that
   it returns an AAProxy permitting the &gt; and &gt;= operators defined above to
   be used on the right end of an iterator expression. */
final preoperator AAProxy &lt; (AssociativeArrayIterator ai)
{
  local AAProxy aa;
  aa = new(None) class'AAProxy';
  aa.init(ai.getCollection(), ai.getIndex());
  return aa;
} // operator &lt;

/* preoperator increment for iterators. No postoperator is defined because
   it requires creation of a temporary iterator and I didn't feel like
   worrying about where the spare copy went. */
final preoperator AssociativeArrayIterator ++(out AssociativeArrayIterator ai) 
{
  ai.next();
  return ai;
} // operator ++

/* iterator's not equality comparison. Equality would be easy to write and
   this could have been defined in terms of equality but the extra function
   call seemed a waste (given script speed). */
final operator(26) bool != (AssociativeArrayIterator lhs,
                            AssociativeArrayIterator rhs) 
{
  return !lhs.same(rhs);
}

/* Main function of the commandlet. Ignores its input arguments and
   demonstrates the use of the associative array operators and
   iterators. */
function int main(string args) 
{
  local AssociativeArray A;
  local AssociativeArrayIterator i;

      // construct a new, initially empty associative array
  A = new(None) class'AssociativeArray';

      // populate the array with some values; note that the &quot;&gt;=&quot; is one symbol
  A&lt;&quot;fish&quot;&gt;=   &quot;shark&quot;;
  A&lt;&quot;dog&quot;&gt;=    (&quot;new&quot;$&quot;found&quot;$&quot;land&quot;); // parentheses are required
  A&lt;&quot;cat&quot;&gt;=    &quot;persian&quot;;
  A&lt;&quot;cow&quot;&gt;=    &quot;zebu&quot;;
  A&lt;&quot;bird&quot;&gt;=   &quot;penguin&quot;;
  A&lt;&quot;rodent&quot;&gt;= &quot;gerbil&quot;;

      // i iterates across the elements within the associative array 
      // first and second return the key and value portions of an associative
      // array entry
  for(i = A.begin(); i != A.end(); ++i) {
    log(&quot;A&lt;&quot; $ i.first() $ &quot;&gt; = &quot; $ i.second());    
  }

      // modify the contents of the associative array; put each entry inside
      // curly braces
  for(i = A.begin(); i != A.end(); ++i) {
    &lt;i&gt;= (&quot;{&quot; $ i.second() $ &quot;}&quot;);
  }

  for(i = A.begin(); i != A.end(); ++i) {
    log(&quot;&lt;i&gt; = &quot;$&lt;i&gt;); // this will just print out the values in the array
  }

      // if an element doesn't exist, returns &quot;&quot; without inserting an item
  log(&quot;No such item: A&lt;\&quot;gamma\&quot;&gt; = &quot;$A&lt;&quot;gamma&quot;&gt;);

  return 0;
} // main
//AADemoCommandlet
&lt;/uscript&gt;

===AAProxy===

The demonstration uses an &lt;tt&gt;AAProxy&lt;/tt&gt; type. This type tracks a location in an associative array and permits that entry to be returned or set. It is simply a reference some associative array and a string index. This is enough informatino to either insert or retrieve a value in the associative array.

&lt;uscript&gt;
class AAProxy extends Object;
/* AAProxy - Associative Array proxy class. The proxy is returned by the &lt;
 indexing operator and can be converted to either a l-value or an r-value
 (okay, almost an r-value; the proxy can set the underlying element in
 the Associative Array). */

/* An AAProxy serves as in the stead of an associative array element.  To
 be able to simulate an r-value, the array and the index must both be
 kept in the proxy. Both are private to limit access to the three
 interface functions. */
var private AssociativeArray A;
var private string ndx;

/* init - initializes the proxy object with an associative array and
   an index. */
function init(AssociativeArray AA, string index) 
{
  A = AA;
  ndx = index;
} // init

/* Read the value from the given location in the associative
   array. Effectively convert the proxy to an r-value representing the
   given element in the associative array.*/
function string r_value() 
{
  return A.lookup(ndx);
} // r_value

/* Set the value represented by the proxy to the value provided as a
   parameter to this function. Effectively convert the proxy to an l-value
   representing the given element in the associative array. */
function string l_value(string v) 
{
  A.insert(ndx, v);
  return v;
} // l_value
&lt;/uscript&gt;

==Related Links==
* [[Legacy:AssociativeArray|AssociativeArray]] &amp;ndash; Main topic

==Discussion==

'''SuperApe:''' This page needs linkage: related topics, category tags, etc.</text>
    </revision>
    <revision>
      <id>1474</id>
      <timestamp>2003-09-04T00:47:37Z</timestamp>
      <contributor>
        <ip>Bcladd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Operators==

Associative arrays use angle brackets as a &quot;natural&quot; notation. The operators are defined in the demonstration commandlet; they should be defined in a root-ward class so they can be used widely. This is just a proof of concept.

===AADemoCommandlet===

The commandlet contains the definitions and some demonstration code.

&lt;uscript&gt;
class AADemoCommandlet
    extends Commandlet;

/* The left-angle bracket operator. Returns an AAProxy, a proxy that can
   be converted either to a string or to a &quot;reference&quot; to a string. The
   operator parameters are an associative array  and the string index
   into the array. */
final operator(24) AAProxy &lt; (out AssociativeArray A, coerce string index) 
{
  local AAProxy aa;
  aa = new(None) class'AAProxy';
  aa.init(A, index);
  return aa; 
} // operator &lt;

/* The right-angle bracket operator; a postoperator as it finishes an
   expression with an AAProxy (an associative array generated the proxy).
   This converts a proxy to an r-value (a string) */
final postoperator string &gt; (AAProxy proxy) 
{
  return proxy.r_value();
} // operator &gt;

/* The combined right-angle bracket and assignment operator. It takes the
   rhs of the operator (a string) and assigns the value to the appropriate
   slot in the array. This operator converts the AAProxy into an
   l-value. */
final operator(24) string &gt;= (AAProxy A, coerce string value) 
{
  return A.l_value(value);
} // operator &gt;=

/* The left-angle bracket for use with AssociativeArrayIterator. Note that
   it returns an AAProxy permitting the &gt; and &gt;= operators defined above to
   be used on the right end of an iterator expression. */
final preoperator AAProxy &lt; (AssociativeArrayIterator ai)
{
  local AAProxy aa;
  aa = new(None) class'AAProxy';
  aa.init(ai.getCollection(), ai.getIndex());
  return aa;
} // operator &lt;

/* preoperator increment for iterators. No postoperator is defined because
   it requires creation of a temporary iterator and I didn't feel like
   worrying about where the spare copy went. */
final preoperator AssociativeArrayIterator ++(out AssociativeArrayIterator ai) 
{
  ai.next();
  return ai;
} // operator ++

/* iterator's not equality comparison. Equality would be easy to write and
   this could have been defined in terms of equality but the extra function
   call seemed a waste (given script speed). */
final operator(26) bool != (AssociativeArrayIterator lhs,
                            AssociativeArrayIterator rhs) 
{
  return !lhs.same(rhs);
}

/* Main function of the commandlet. Ignores its input arguments and
   demonstrates the use of the associative array operators and
   iterators. */
function int main(string args) 
{
  local AssociativeArray A;
  local AssociativeArrayIterator i;

      // construct a new, initially empty associative array
  A = new(None) class'AssociativeArray';

      // populate the array with some values; note that the &quot;&gt;=&quot; is one symbol
  A&lt;&quot;fish&quot;&gt;=   &quot;shark&quot;;
  A&lt;&quot;dog&quot;&gt;=    (&quot;new&quot;$&quot;found&quot;$&quot;land&quot;); // parentheses are required
  A&lt;&quot;cat&quot;&gt;=    &quot;persian&quot;;
  A&lt;&quot;cow&quot;&gt;=    &quot;zebu&quot;;
  A&lt;&quot;bird&quot;&gt;=   &quot;penguin&quot;;
  A&lt;&quot;rodent&quot;&gt;= &quot;gerbil&quot;;

      // i iterates across the elements within the associative array 
      // first and second return the key and value portions of an associative
      // array entry
  for(i = A.begin(); i != A.end(); ++i) {
    log(&quot;A&lt;&quot; $ i.first() $ &quot;&gt; = &quot; $ i.second());    
  }

      // modify the contents of the associative array; put each entry inside
      // curly braces
  for(i = A.begin(); i != A.end(); ++i) {
    &lt;i&gt;= (&quot;{&quot; $ i.second() $ &quot;}&quot;);
  }

  for(i = A.begin(); i != A.end(); ++i) {
    log(&quot;&lt;i&gt; = &quot;$&lt;i&gt;); // this will just print out the values in the array
  }

      // if an element doesn't exist, returns &quot;&quot; without inserting an item
  log(&quot;No such item: A&lt;\&quot;gamma\&quot;&gt; = &quot;$A&lt;&quot;gamma&quot;&gt;);

  return 0;
} // main
//AADemoCommandlet
&lt;/uscript&gt;

===AAProxy===

The demonstration uses an &lt;tt&gt;AAProxy&lt;/tt&gt; type. This type tracks a location in an associative array and permits that entry to be returned or set. It is simply a reference some associative array and a string index. This is enough informatino to either insert or retrieve a value in the associative array.

&lt;uscript&gt;
class AAProxy extends Object;
/* AAProxy - Associative Array proxy class. The proxy is returned by the &lt;
 indexing operator and can be converted to either a l-value or an r-value
 (okay, almost an r-value; the proxy can set the underlying element in
 the Associative Array). */

/* An AAProxy serves as in the stead of an associative array element.  To
 be able to simulate an r-value, the array and the index must both be
 kept in the proxy. Both are private to limit access to the three
 interface functions. */
var private AssociativeArray A;
var private string ndx;

/* init - initializes the proxy object with an associative array and
   an index. */
function init(AssociativeArray AA, string index) 
{
  A = AA;
  ndx = index;
} // init

/* Read the value from the given location in the associative
   array. Effectively convert the proxy to an r-value representing the
   given element in the associative array.*/
function string r_value() 
{
  return A.lookup(ndx);
} // r_value

/* Set the value represented by the proxy to the value provided as a
   parameter to this function. Effectively convert the proxy to an l-value
   representing the given element in the associative array. */
function string l_value(string v) 
{
  A.insert(ndx, v);
  return v;
} // l_value
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AttachMover</title>
    <id>367</id>
    <revision>
      <id>1253</id>
      <timestamp>2006-12-06T07:38:30Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Mover (UT)|Mover (UT)]] &gt;&gt; AttachMover  (Package: UnrealShare)}}

related topics:

* [[Legacy:Attaching Actors|Attaching Actors]] covers how to use the AttachMover

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1254</id>
      <timestamp>2003-01-23T20:49:34Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Mover|Mover]] &gt;&gt; AttachMover}}

related topics:

* [[Legacy:Attaching Actors|Attaching Actors]] covers how to use the AttachMover

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Attaching Actors</title>
    <id>359</id>
    <revision>
      <id>1235</id>
      <timestamp>2006-04-07T07:58:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This tutorial discusses attaching actors to a mover and assumes you already know  about:
* [[Legacy:Actor Overview|Actor Overview]]: adding actors, setting properties
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]

Any actors attached to a mover will follow the mover. You can attach smoke generators to leave a trail of smoke or attach a fighter jet decoration to fly around your map.

Attached actors can be anywhere in the map; they don't have to touch the mover or even be anywhere near it. The mover can be hidden (in solid space) and the actors will appear to move independently. Attached actors will always move relative to the movement of the mover; if the mover moves 64 units to the left, so will the attached actor.

==Method 1: Attach Tag==

To attach any actor to a mover, [[Legacy:Match These Tags|match these tags]]:
* The Mover's Events -&gt; Tag 
* The Actor's Movement -&gt; AttachTag 

Most actors can be attached in this way. There are three possible pitfalls however.

===Non-unique Tag===

In order for this to work there must be ''only one'' actor (mover or otherwise) in the game with the same Tag as the actor's AttachTag. If the same tag is used by your mover and another object, the attached actor will not know which object to follow, and will not move.  You will have to give your mover a unique tag before you can successfully attach other things to it in this way.

===bStatic ===

Most actors can be attached in this way. The principal cause of an actor not moving with the mover is that it has the property '''bStatic''' set to true by default (for example [[Legacy:PlayerStart|PlayerStart]]s and [[Legacy:Volume|Volume]]s).

You will need to change this property for the actor you want to attach: see [[Legacy:Actor Properties Window|Actor Properties Window]] for how to edit hidden properties. However, this may cause problems in netplay. Another solution is to [[Legacy:Create A Subclass|Create a subclass]] for the item you want to attach, and change the default value of bStatic for the new custom class.

===bCollideActors===

Bizzarely, Collision.bCollideActors must be true for attachment to work, or the attached item may just drift off casually into the void in a straight line. (This was observed when attaching a rotating mover to the arm of another rotating mover. No other Collision flags appear to be needed.)

==Method 2: AttachMovers (UT only) ==

This method is an alternative, available in [[Legacy:UT|UT]] and other games of that generation which have the [[Legacy:AttachMover|AttachMover]] class. To add special movers, right-click the ''Add Mover'' [[Legacy:Toolbox|toolbox]] button instead of just clicking it: choose &quot;AttachMover&quot; from the small pop-up menu.

An AttachMover has the same properties as a normal mover, you can have it BumpOpenTimed so it will open when you touch it, TriggerOpenTimed so you can trigger it (see [[Legacy:Activating A Mover|Activating a mover]] for more on this). The only difference is that in the properties of the mover there is now a new option.

===Attaching Actors ===

Unreal uses tags to tie actors to the AttachMover, the same way [[Legacy:Trigger|Trigger]]s work. The same name must be present in two different places. It doesn't matter what the text is, but something descriptive may help later. 'Blah' will do, as will 'Attach' or 'AttachedBarrel'. The following properties must match:

* The AttachMover's AttachMover -&gt; AttachTag
* The Actor's Events -&gt; Tag 

Now you may have to set a few other properties on the actor to get this to work. Check the actors have the following properties set:
* Advanced -&gt; bMovable = True
* Advanced -&gt; bStatic = False

Also, it is a good idea to turn the attached actor's collision ''off''.  If the actor has it's collision properties set to True, it can cause all sorts of problems (i.e. your actor may not move properly). If you need collision, try using an invisible mover to create the illusion of collision. Alternatively, in the case of Karma-simulated actors, collision can be manually disabled between two actors without affecting those object's collision with the remainder of objects in the world.

Now test your map. When the mover moves, the actor should move with it.

===Warnings===
* If your actor does not move with the mover, check the bMovable and bStatic properties of the actor.  Lights are one example.

* Do not attach any NavigationPoint or any actor that alters the bot's pathing to a mover.  

* Do not attach an actor to more than one mover.

Actors that are attached to a mover follow its location, but only the yaw of its rotation.  If you need to have your actors follow rotational movement around the other axes as well, check the [[Legacy:ActorAttacher|ActorAttacher]] component.

==Ideas==

===Triggered Kicker===

You can try attaching a [[Legacy:Kicker|Kicker]] to a mover to make a triggered jump pad. Just add the kicker somewhere below the kicker where it won't effect players, then attach it to a mover which will move it up enough so that it kicks people. This can be quite fun for things like Human Cannons &lt;insert evil laugh here&gt;. 
: Alternatively, see the [[Legacy:Kicker|Kicker]] actor page for a subclass which does this. 

===Moving Skybox===

You can also attach a [[Legacy:SkyZoneInfo|SkyZoneInfo]] to movers. I've tried this one and it's pretty cool. Try creating a circular [[Legacy:SkyBox|SkyBox]], then add a mover in the very center of it that rotates constantly. You will want to make sure that you can't see it at any point though :) After that, add your  SkyZoneInfo somewhere near the perimeter of the skybox and attach it to the mover.

You will want to check that ''bDirectional = True'' in the advanced properties of it so that it is facing the correct way (say you are doing a flying ship or something :) ) Also, you can try tilting it sideways in towards the center of the skybox so that the entire map is sloped inwards as you would on a moterbike (This can make you feel sick after a while :) )

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]] properties
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]] properties
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties
* [[Legacy:ActorAttacher|ActorAttacher]] component for UT
* [[Legacy:Movable Lights|Movable Lights]] making lights move

==Comments==

'''Foxpaw:''' Can this be renamed, since it deals only with attaching things to movers, and not attaching things to bones, or just using plain old attach or setbase?

'''Tarquin:''' &quot;Attaching to movers&quot;?

'''Foxpaw:''' That could work. Alternatively we could add stuff on those other topics here, though admittedly I've never had any success with the &quot;Attach&quot; function and only sporadic results with Setbase.

'''MythOpus:''' I suggest making a base page called Attaching or something and have subpages for attaching actors to movers and bones etc...

~~ Sounds good :)

~~ Thanks :)  I think I'll get right no it then.  Can you rename this page to Attaching_To_Movers or something?  And do you want it to be a sub-page of &quot; Attaching_Stuff &quot; or just a page on it's own?

'''GTD-Carthage:''' I've done everything correctly but no matter what happens, BlockPlayer actors don't move with the attachmover. I've tied up everything correctly and even investigated twice. Are BlockPlayer actors really just static actors?

'''Ragdoll:''' I dont know about other games, but in [[Legacy:Devastation|Devastation]] if you try to change bStatic to false to attach an actor you will get a violent crash when played online. You even get a message in the map check errors box saying &quot;actor X is bStatic=False, but is bStatic by default, map will fail in netplay&quot;.

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] ''this tute has only been partially freshed up for UT2003.'' 
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1236</id>
      <timestamp>2005-12-10T12:36:33Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>Attaching actors can cause a crash in some games</comment>
      <text xml:space="preserve">This tutorial discusses attaching actors to a mover and assumes you already know  about:
* [[Legacy:Actor Overview|Actor Overview]]: adding actors, setting properties
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]

Any actors attached to a mover will follow the mover. You can attach smoke generators to leave a trail of smoke or attach a fighter jet decoration to fly around your map.

Attached actors can be anywhere in the map; they don't have to touch the mover or even be anywhere near it. The mover can be hidden (in solid space) and the actors will appear to move independently. Attached actors will always move relative to the movement of the mover; if the mover moves 64 units to the left, so will the attached actor.

==Method 1: Attach Tag==

To attach any actor to a mover, [[Legacy:Match These Tags|match these tags]]:
* The Mover's Events -&gt; Tag 
* The Actor's Movement -&gt; AttachTag 

Most actors can be attached in this way. There are three possible pitfalls however.

===Non-unique Tag===

In order for this to work there must be ''only one'' actor (mover or otherwise) in the game with the same Tag as the actor's AttachTag. If the same tag is used by your mover and another object, the attached actor will not know which object to follow, and will not move.  You will have to give your mover a unique tag before you can successfully attach other things to it in this way.

===bStatic ===

Most actors can be attached in this way. The principal cause of an actor not moving with the mover is that it has the property '''bStatic''' set to true by default (for example [[Legacy:PlayerStart|PlayerStart]]s and [[Legacy:Volume|Volume]]s).

You will need to change this property for the actor you want to attach: see [[Legacy:Actor Properties Window|Actor Properties Window]] for how to edit hidden properties. However, this may cause problems in netplay. Another solution is to [[Legacy:Create A Subclass|Create a subclass]] for the item you want to attach, and change the default value of bStatic for the new custom class.

===bCollideActors===

Bizzarely, Collision.bCollideActors must be true for attachment to work, or the attached item may just drift off casually into the void in a straight line. (This was observed when attaching a rotating mover to the arm of another rotating mover. No other Collision flags appear to be needed.)

==Method 2: AttachMovers (UT only) ==

This method is an alternative, available in [[Legacy:UT|UT]] and other games of that generation which have the [[Legacy:AttachMover|AttachMover]] class. To add special movers, right-click the ''Add Mover'' [[Legacy:Toolbox|toolbox]] button instead of just clicking it: choose &quot;AttachMover&quot; from the small pop-up menu.

An AttachMover has the same properties as a normal mover, you can have it BumpOpenTimed so it will open when you touch it, TriggerOpenTimed so you can trigger it (see [[Legacy:Activating A Mover|Activating a mover]] for more on this). The only difference is that in the properties of the mover there is now a new option.

===Attaching Actors ===

Unreal uses tags to tie actors to the AttachMover, the same way [[Legacy:Trigger|Trigger]]s work. The same name must be present in two different places. It doesn't matter what the text is, but something descriptive may help later. 'Blah' will do, as will 'Attach' or 'AttachedBarrel'. The following properties must match:

* The AttachMover's AttachMover -&gt; AttachTag
* The Actor's Events -&gt; Tag 

Now you may have to set a few other properties on the actor to get this to work. Check the actors have the following properties set:
* Advanced -&gt; bMovable = True
* Advanced -&gt; bStatic = False

Also, it is a good idea to turn the attached actor's collision ''off''.  If the actor has it's collision properties set to True, it can cause all sorts of problems (i.e. your actor may not move properly). If you need collision, try using an invisible mover to create the illusion of collision. Alternatively, in the case of Karma-simulated actors, collision can be manually disabled between two actors without affecting those object's collision with the remainder of objects in the world.

Now test your map. When the mover moves, the actor should move with it.

===Warnings===
* If your actor does not move with the mover, check the bMovable and bStatic properties of the actor.  Lights are one example.

* Do not attach any NavigationPoint or any actor that alters the bot's pathing to a mover.  

* Do not attach an actor to more than one mover.

Actors that are attached to a mover follow its location, but only the yaw of its rotation.  If you need to have your actors follow rotational movement around the other axes as well, check the [[Legacy:ActorAttacher|ActorAttacher]] component.

==Ideas==

===Triggered Kicker===

You can try attaching a [[Legacy:Kicker|Kicker]] to a mover to make a triggered jump pad. Just add the kicker somewhere below the kicker where it won't effect players, then attach it to a mover which will move it up enough so that it kicks people. This can be quite fun for things like Human Cannons &lt;insert evil laugh here&gt;. 
: Alternatively, see the [[Legacy:Kicker|Kicker]] actor page for a subclass which does this. 

===Moving Skybox===

You can also attach a [[Legacy:SkyZoneInfo|SkyZoneInfo]] to movers. I've tried this one and it's pretty cool. Try creating a circular [[Legacy:SkyBox|SkyBox]], then add a mover in the very center of it that rotates constantly. You will want to make sure that you can't see it at any point though :) After that, add your  SkyZoneInfo somewhere near the perimeter of the skybox and attach it to the mover.

You will want to check that ''bDirectional = True'' in the advanced properties of it so that it is facing the correct way (say you are doing a flying ship or something :) ) Also, you can try tilting it sideways in towards the center of the skybox so that the entire map is sloped inwards as you would on a moterbike (This can make you feel sick after a while :) )

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]] properties
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]] properties
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties
* [[Legacy:ActorAttacher|ActorAttacher]] component for UT
* [[Legacy:Movable Lights|Movable Lights]] making lights move

==Comments==

'''Foxpaw:''' Can this be renamed, since it deals only with attaching things to movers, and not attaching things to bones, or just using plain old attach or setbase?

'''Tarquin:''' &quot;Attaching to movers&quot;?

'''Foxpaw:''' That could work. Alternatively we could add stuff on those other topics here, though admittedly I've never had any success with the &quot;Attach&quot; function and only sporadic results with Setbase.

'''MythOpus:''' I suggest making a base page called Attaching or something and have subpages for attaching actors to movers and bones etc...

~~ Sounds good :)

~~ Thanks :)  I think I'll get right no it then.  Can you rename this page to Attaching_To_Movers or something?  And do you want it to be a sub-page of &quot; Attaching_Stuff &quot; or just a page on it's own?

'''GTD-Carthage:''' I've done everything correctly but no matter what happens, BlockPlayer actors don't move with the attachmover. I've tied up everything correctly and even investigated twice. Are BlockPlayer actors really just static actors?

'''Ragdoll:''' I dont know about other games, but in [[Legacy:Devastation|Devastation]] if you try to change bStatic to false to attach an actor you will get a violent crash when played online. You even get a message in the map check errors box saying &quot;actor X is bStatic=False, but is bStatic by default, map will fail in netplay&quot;.

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] ''this tute has only been partially freshed up for UT2003.'' 
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1237</id>
      <timestamp>2006-04-06T21:06:06Z</timestamp>
      <contributor>
        <ip>CDN-CE-CHLM-T2-03.chelmsfdrdc2.ma.boston.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">This tutorial discusses attaching actors to a mover and assumes you already know  about:
* [[Legacy:Actor Overview|Actor Overview]]: adding actors, setting properties
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]

Any actors attached to a mover will follow the mover. You can attach smoke generators to leave a trail of smoke or attach a fighter jet decoration to fly around your map.

Attached actors can be anywhere in the map; they don't have to touch the mover or even be anywhere near it. The mover can be hidden (in solid space) and the actors will appear to move independently. Attached actors will always move relative to the movement of the mover; if the mover moves 64 units to the left, so will the attached actor.

==Method 1: Attach Tag==

To attach any actor to a mover, [[Legacy:Match These Tags|match these tags]]:
* The Mover's Events -&gt; Tag 
* The Actor's Movement -&gt; AttachTag 

Most actors can be attached in this way. There are three possible pitfalls however.

===Non-unique Tag===

In order for this to work there must be ''only one'' actor (mover or otherwise) in the game with the same Tag as the actor's AttachTag. If the same tag is used by your mover and another object, the attached actor will not know which object to follow, and will not move.  You will have to give your mover a unique tag before you can successfully attach other things to it in this way.

===bStatic ===

Most actors can be attached in this way. The principal cause of an actor not moving with the mover is that it has the property '''bStatic''' set to true by default (for example [[Legacy:PlayerStart|PlayerStart]]s and [[Legacy:Volume|Volume]]s).

You will need to change this property for the actor you want to attach: see [[Legacy:Actor Properties Window|Actor Properties Window]] for how to edit hidden properties. However, this may cause problems in netplay. Another solution is to [[Legacy:Create A Subclass|Create a subclass]] for the item you want to attach, and change the default value of bStatic for the new custom class.

===bCollideActors===

Bizzarely, Collision.bCollideActors must be true for attachment to work, or the attached item may just drift off casually into the void in a straight line. (This was observed when attaching a rotating mover to the arm of another rotating mover. No other Collision flags appear to be needed.)

==Method 2: AttachMovers (UT only) ==

This method is an alternative, available in [[Legacy:UT|UT]] and other games of that generation which have the [[Legacy:AttachMover|AttachMover]] class. To add special movers, right-click the ''Add Mover'' [[Legacy:Toolbox|toolbox]] button instead of just clicking it: choose &quot;AttachMover&quot; from the small pop-up menu.

An AttachMover has the same properties as a normal mover, you can have it BumpOpenTimed so it will open when you touch it, TriggerOpenTimed so you can trigger it (see [[Legacy:Activating A Mover|Activating a mover]] for more on this). The only difference is that in the properties of the mover there is now a new option.

===Attaching Actors ===

Unreal uses tags to tie actors to the AttachMover, the same way [[Legacy:Trigger|Trigger]]s work. The same name must be present in two different places. It doesn't matter what the text is, but something descriptive may help later. 'Blah' will do, as will 'Attach' or 'AttachedBarrel'. The following properties must match:

* The AttachMover's AttachMover -&gt; AttachTag
* The Actor's Events -&gt; Tag 

Now you may have to set a few other properties on the actor to get this to work. Check the actors have the following properties set:
* Advanced -&gt; bMovable = True
* Advanced -&gt; bStatic = False

Also, it is a good idea to turn the attached actor's collision ''off''.  If the actor has it's collision properties set to True, it can cause all sorts of problems (i.e. your actor may not move properly). If you need collision, try using an invisible mover to create the illusion of collision. Alternatively, in the case of Karma-simulated actors, collision can be manually disabled between two actors without affecting those object's collision with the remainder of objects in the world.

Now test your map. When the mover moves, the actor should move with it.

===Warnings===
* If your actor does not move with the mover, check the bMovable and bStatic properties of the actor.  Lights are one example.

* Do not attach any NavigationPoint or any actor that alters the bot's pathing to a mover.  

* Do not attach an actor to more than one mover.

Actors that are attached to a mover follow its location, but only the yaw of its rotation.  If you need to have your actors follow rotational movement around the other axes as well, check the [[Legacy:ActorAttacher|ActorAttacher]] component.

==Ideas==

===Triggered Kicker===

You can try attaching a [[Legacy:Kicker|Kicker]] to a mover to make a triggered jump pad. Just add the kicker somewhere below the kicker where it won't effect players, then attach it to a mover which will move it up enough so that it kicks people. This can be quite fun for things like Human Cannons &lt;insert evil laugh here&gt;. 
: Alternatively, see the [[Legacy:Kicker|Kicker]] actor page for a subclass which does this. 

===Moving Skybox===

You can also attach a [[Legacy:SkyZoneInfo|SkyZoneInfo]] to movers. I've tried this one and it's pretty cool. Try creating a circular [[Legacy:SkyBox|SkyBox]], then add a mover in the very center of it that rotates constantly. You will want to make sure that you can't see it at any point though :) After that, add your  SkyZoneInfo somewhere near the perimeter of the skybox and attach it to the mover.

You will want to check that ''bDirectional = True'' in the advanced properties of it so that it is facing the correct way (say you are doing a flying ship or something :) ) Also, you can try tilting it sideways in towards the center of the skybox so that the entire map is sloped inwards as you would on a moterbike (This can make you feel sick after a while :) )

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]] properties
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]] properties
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties
* [[Legacy:ActorAttacher|ActorAttacher]] component for UT
* [[Legacy:Movable Lights|Movable Lights]] making lights move

==Comments==

'''Foxpaw:''' Can this be renamed, since it deals only with attaching things to movers, and not attaching things to bones, or just using plain old attach or setbase?

'''Tarquin:''' &quot;Attaching to movers&quot;?

'''Foxpaw:''' That could work. Alternatively we could add stuff on those other topics here, though admittedly I've never had any success with the &quot;Attach&quot; function and only sporadic results with Setbase.

'''MythOpus:''' I suggest making a base page called Attaching or something and have subpages for attaching actors to movers and bones etc...

~~ Sounds good :)

~~ Thanks :)  I think I'll get right no it then.  Can you rename this page to Attaching_To_Movers or something?  And do you want it to be a sub-page of &quot; Attaching_Stuff &quot; or just a page on it's own?

'''GTD-Carthage:''' I've done everything correctly but no matter what happens, BlockPlayer actors don't move with the attachmover. I've tied up everything correctly and even investigated twice. Are BlockPlayer actors really just static actors?

'''Ragdoll:''' I dont know about other games, but in [[Legacy:Devastation|Devastation]] if you try to change bStatic to false to attach an actor you will get a violent crash when played online. You even get a message in the map check errors box saying &quot;actor X is bStatic=False, but is bStatic by default, map will fail in netplay&quot;.

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] ''this tute has only been partially freshed up for UT2003.'' 

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42529</id>
      <timestamp>2010-02-10T01:10:01Z</timestamp>
      <contributor>
        <username>Musha</username>
        <id>2089</id>
      </contributor>
      <text xml:space="preserve">This tutorial discusses attaching actors to a mover and assumes you already know  about:
* [[Legacy:Actor Overview|Actor Overview]]: adding actors, setting properties
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]

Any actors attached to a mover will follow the mover. You can attach smoke generators to leave a trail of smoke or attach a fighter jet decoration to fly around your map.

Attached actors can be anywhere in the map; they don't have to touch the mover or even be anywhere near it. The mover can be hidden (in solid space) and the actors will appear to move independently. Attached actors will always move relative to the movement of the mover; if the mover moves 64 units to the left, so will the attached actor.

==Method 1: Attach Tag==

To attach any actor to a mover, [[Legacy:Match These Tags|match these tags]]:
* The Mover's Events -&gt; Tag 
* The Actor's Movement -&gt; AttachTag 

Most actors can be attached in this way. There are three possible pitfalls however.

===Non-unique Tag===

In order for this to work there must be ''only one'' actor (mover or otherwise) in the game with the same Tag as the actor's AttachTag. If the same tag is used by your mover and another object, the attached actor will not know which object to follow, and will not move.  You will have to give your mover a unique tag before you can successfully attach other things to it in this way.

===bStatic ===

Most actors can be attached in this way. The principal cause of an actor not moving with the mover is that it has the property '''bStatic''' set to true by default (for example [[Legacy:PlayerStart|PlayerStart]]s and [[Legacy:Volume|Volume]]s).

You will need to change this property for the actor you want to attach: see [[Legacy:Actor Properties Window|Actor Properties Window]] for how to edit hidden properties. However, this may cause problems in netplay. Another solution is to [[Legacy:Create A Subclass|Create a subclass]] for the item you want to attach, and change the default value of bStatic for the new custom class.

===bCollideActors===

Bizzarely, Collision.bCollideActors must be true for attachment to work, or the attached item may just drift off casually into the void in a straight line. (This was observed when attaching a rotating mover to the arm of another rotating mover. No other Collision flags appear to be needed.)

==Method 2: AttachMovers (UT only) ==

This method is an alternative, available in [[Legacy:UT|UT]] and other games of that generation which have the [[Legacy:AttachMover|AttachMover]] class. To add special movers, right-click the ''Add Mover'' [[Legacy:Toolbox|toolbox]] button instead of just clicking it: choose &quot;AttachMover&quot; from the small pop-up menu.

An AttachMover has the same properties as a normal mover, you can have it BumpOpenTimed so it will open when you touch it, TriggerOpenTimed so you can trigger it (see [[Legacy:Activating A Mover|Activating a mover]] for more on this). The only difference is that in the properties of the mover there is now a new option.

===Attaching Actors ===

Unreal uses tags to tie actors to the AttachMover, the same way [[Legacy:Trigger|Trigger]]s work. The same name must be present in two different places. It doesn't matter what the text is, but something descriptive may help later. 'Blah' will do, as will 'Attach' or 'AttachedBarrel'. The following properties must match:

* The AttachMover's AttachMover -&gt; AttachTag
* The Actor's Events -&gt; Tag 

Now you may have to set a few other properties on the actor to get this to work. Check the actors have the following properties set:
* Advanced -&gt; bMovable = True
* Advanced -&gt; bStatic = False

Also, it is a good idea to turn the attached actor's collision ''off''.  If the actor has it's collision properties set to True, it can cause all sorts of problems (i.e. your actor may not move properly). If you need collision, try using an invisible mover to create the illusion of collision. Alternatively, in the case of Karma-simulated actors, collision can be manually disabled between two actors without affecting those object's collision with the remainder of objects in the world.

Now test your map. When the mover moves, the actor should move with it.

===Warnings===
* If your actor does not move with the mover, check the bMovable and bStatic properties of the actor.  Lights are one example.

* Do not attach any NavigationPoint or any actor that alters the bot's pathing to a mover.  

* Do not attach an actor to more than one mover.

Actors that are attached to a mover follow its location, but only the yaw of its rotation.  If you need to have your actors follow rotational movement around the other axes as well, check the [[Legacy:ActorAttacher|ActorAttacher]] component.

==Ideas==

===Triggered Kicker===

You can try attaching a [[Legacy:Kicker|Kicker]] to a mover to make a triggered jump pad. Just add the kicker somewhere below the kicker where it won't effect players, then attach it to a mover which will move it up enough so that it kicks people. This can be quite fun for things like Human Cannons &lt;insert evil laugh here&gt;. 
: Alternatively, see the [[Legacy:Kicker|Kicker]] actor page for a subclass which does this. 

===Moving Skybox===

You can also attach a [[Legacy:SkyZoneInfo|SkyZoneInfo]] to movers. I've tried this one and it's pretty cool. Try creating a circular [[Legacy:SkyBox|SkyBox]], then add a mover in the very center of it that rotates constantly. You will want to make sure that you can't see it at any point though :) After that, add your  SkyZoneInfo somewhere near the perimeter of the skybox and attach it to the mover.

You will want to check that ''bDirectional = True'' in the advanced properties of it so that it is facing the correct way (say you are doing a flying ship or something :) ) Also, you can try tilting it sideways in towards the center of the skybox so that the entire map is sloped inwards as you would on a moterbike (This can make you feel sick after a while :) )

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]] properties
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]] properties
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties
* [[Legacy:ActorAttacher|ActorAttacher]] component for UT
* [[Legacy:Movable Lights|Movable Lights]] making lights move

==Comments==

'''Foxpaw:''' Can this be renamed, since it deals only with attaching things to movers, and not attaching things to bones, or just using plain old attach or setbase?

'''Tarquin:''' &quot;Attaching to movers&quot;?

'''Foxpaw:''' That could work. Alternatively we could add stuff on those other topics here, though admittedly I've never had any success with the &quot;Attach&quot; function and only sporadic results with Setbase.

'''MythOpus:''' I suggest making a base page called Attaching or something and have subpages for attaching actors to movers and bones etc...

~~ Sounds good :)

~~ Thanks :)  I think I'll get right no it then.  Can you rename this page to Attaching_To_Movers or something?  And do you want it to be a sub-page of &quot; Attaching_Stuff &quot; or just a page on it's own?

'''GTD-Carthage:''' I've done everything correctly but no matter what happens, BlockPlayer actors don't move with the attachmover. I've tied up everything correctly and even investigated twice. Are BlockPlayer actors really just static actors?

'''Ragdoll:''' I dont know about other games, but in [[Legacy:Devastation|Devastation]] if you try to change bStatic to false to attach an actor you will get a violent crash when played online. You even get a message in the map check errors box saying &quot;actor X is bStatic=False, but is bStatic by default, map will fail in netplay&quot;.

'''Musha:''' What kinds of actors can be attached to a mover?  I'm trying to attach a weapon base to a mover, but for the life of me, I can't get it to work.  Can these types of actors just not be attached to a mover?  I understand that this will be excluded from bot pathing, but since its a player-activated assault objective, it doesn't matter.

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] ''this tute has only been partially freshed up for UT2003.'' 
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42530</id>
      <timestamp>2010-02-10T21:27:50Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This tutorial discusses attaching actors to a mover and assumes you already know  about:
* [[Legacy:Actor Overview|Actor Overview]]: adding actors, setting properties
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]

Any actors attached to a mover will follow the mover. You can attach smoke generators to leave a trail of smoke or attach a fighter jet decoration to fly around your map.

Attached actors can be anywhere in the map; they don't have to touch the mover or even be anywhere near it. The mover can be hidden (in solid space) and the actors will appear to move independently. Attached actors will always move relative to the movement of the mover; if the mover moves 64 units to the left, so will the attached actor.

==Method 1: Attach Tag==

To attach any actor to a mover, [[Legacy:Match These Tags|match these tags]]:
* The Mover's Events -&gt; Tag 
* The Actor's Movement -&gt; AttachTag 

Most actors can be attached in this way. There are three possible pitfalls however.

===Non-unique Tag===

In order for this to work there must be ''only one'' actor (mover or otherwise) in the game with the same Tag as the actor's AttachTag. If the same tag is used by your mover and another object, the attached actor will not know which object to follow, and will not move.  You will have to give your mover a unique tag before you can successfully attach other things to it in this way.

===bStatic ===

Most actors can be attached in this way. The principal cause of an actor not moving with the mover is that it has the property '''bStatic''' set to true by default (for example [[Legacy:PlayerStart|PlayerStart]]s and [[Legacy:Volume|Volume]]s).

You will need to change this property for the actor you want to attach: see [[Legacy:Actor Properties Window|Actor Properties Window]] for how to edit hidden properties. However, this may cause problems in netplay. Another solution is to [[Legacy:Create A Subclass|Create a subclass]] for the item you want to attach, and change the default value of bStatic for the new custom class.

===bCollideActors===

Bizzarely, Collision.bCollideActors must be true for attachment to work, or the attached item may just drift off casually into the void in a straight line. (This was observed when attaching a rotating mover to the arm of another rotating mover. No other Collision flags appear to be needed.)

==Method 2: AttachMovers (UT only) ==

This method is an alternative, available in [[Legacy:UT|UT]] and other games of that generation which have the [[Legacy:AttachMover|AttachMover]] class. To add special movers, right-click the ''Add Mover'' [[Legacy:Toolbox|toolbox]] button instead of just clicking it: choose &quot;AttachMover&quot; from the small pop-up menu.

An AttachMover has the same properties as a normal mover, you can have it BumpOpenTimed so it will open when you touch it, TriggerOpenTimed so you can trigger it (see [[Legacy:Activating A Mover|Activating a mover]] for more on this). The only difference is that in the properties of the mover there is now a new option.

===Attaching Actors ===

Unreal uses tags to tie actors to the AttachMover, the same way [[Legacy:Trigger|Trigger]]s work. The same name must be present in two different places. It doesn't matter what the text is, but something descriptive may help later. 'Blah' will do, as will 'Attach' or 'AttachedBarrel'. The following properties must match:

* The AttachMover's AttachMover -&gt; AttachTag
* The Actor's Events -&gt; Tag 

Now you may have to set a few other properties on the actor to get this to work. Check the actors have the following properties set:
* Advanced -&gt; bMovable = True
* Advanced -&gt; bStatic = False

Also, it is a good idea to turn the attached actor's collision ''off''.  If the actor has it's collision properties set to True, it can cause all sorts of problems (i.e. your actor may not move properly). If you need collision, try using an invisible mover to create the illusion of collision. Alternatively, in the case of Karma-simulated actors, collision can be manually disabled between two actors without affecting those object's collision with the remainder of objects in the world.

Now test your map. When the mover moves, the actor should move with it.

===Warnings===
* If your actor does not move with the mover, check the bMovable and bStatic properties of the actor.  Lights are one example.

* Do not attach any NavigationPoint or any actor that alters the bot's pathing to a mover.  

* Do not attach an actor to more than one mover.

Actors that are attached to a mover follow its location, but only the yaw of its rotation.  If you need to have your actors follow rotational movement around the other axes as well, check the [[Legacy:ActorAttacher|ActorAttacher]] component.

==Ideas==

===Triggered Kicker===

You can try attaching a [[Legacy:Kicker|Kicker]] to a mover to make a triggered jump pad. Just add the kicker somewhere below the kicker where it won't effect players, then attach it to a mover which will move it up enough so that it kicks people. This can be quite fun for things like Human Cannons &lt;insert evil laugh here&gt;. 
: Alternatively, see the [[Legacy:Kicker|Kicker]] actor page for a subclass which does this. 

===Moving Skybox===

You can also attach a [[Legacy:SkyZoneInfo|SkyZoneInfo]] to movers. I've tried this one and it's pretty cool. Try creating a circular [[Legacy:SkyBox|SkyBox]], then add a mover in the very center of it that rotates constantly. You will want to make sure that you can't see it at any point though :) After that, add your  SkyZoneInfo somewhere near the perimeter of the skybox and attach it to the mover.

You will want to check that ''bDirectional = True'' in the advanced properties of it so that it is facing the correct way (say you are doing a flying ship or something :) ) Also, you can try tilting it sideways in towards the center of the skybox so that the entire map is sloped inwards as you would on a moterbike (This can make you feel sick after a while :) )

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]] properties
* [[Legacy:Actor (UT)/Events|Actor (UT)/Events]] properties
* [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]] properties
* [[Legacy:ActorAttacher|ActorAttacher]] component for UT
* [[Legacy:Movable Lights|Movable Lights]] making lights move

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] ''this tute has only been partially freshed up for UT2003.'' 
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Attaching To Bones</title>
    <id>459</id>
    <revision>
      <id>1507</id>
      <timestamp>2006-04-14T21:34:35Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>found a way around</comment>
      <text xml:space="preserve">A [[Legacy:Bone|bone]] is part of a [[Legacy:Skeletal Mesh|skeletal mesh]].  The standard skeletal mesh for the [[Legacy:Pawn|pawn]] includes the head, right leg, left leg, right foot, left foot, right hand, left hand, right shoulder, left shoulder, and the spine.  Using [[Legacy:UnrealScript|UnrealScript]], you can attach almost anything to any bone of a given mesh.

Here, we'll discuss how you can attach actors to bones.  For instance if you wanted an actor to follow a pawn around, you could attach it to a bone of that pawn.  Or, if you wanted to attach emitters to the legs of a pawn, you would have to attach the emitters to both leg bones. An example of this is the Speed Combo in [[Legacy:UT2003|UT2003]].

==Introduction==

We'll start by putting you through a very basic walkthrough.  We'll spawn a custom trigger, attach it to the 'spine' of the pawn and then we will spawn Emitters and attach them to both legs.  I suggest making a new package and call it AttachingToBones or something easy (see [[Legacy:Set Up Package Folders|Set Up Package Folders]] for help with this).

==Step One==

First, we need to create the custom trigger.  Create the following:

&lt;uscript&gt;
class SpineTrigger extends Trigger;

//We aren't going to make this do anything because
//this is just a walkthrough on how you can attach something to a bone

DefaultProperties
{
      bHidden=False //We want this false so you can see that it actually attached itself to the spine.
}
&lt;/uscript&gt;

==Step Two==

Now we need to spawn this trigger and attach it to the pawn.  The following mutator code should do this with no problem at all.

&lt;uscript&gt;
class MutAttachToBones extends Mutator;

var trigger BoneTrigger; //We need this variable or, it won't recognize what your trying to attach.

function ModifyPlayer(Pawn Other)
{
  local xPawn x;
   x = xPawn(Other);

  BoneTrigger = Spawn(class'SpineTrigger', x,, x.Location, x.Rotation);
  x.AttachToBone(BoneTrigger, 'spine'); //AttachToBone I believe is a native function so it can work in all actors.
                             //'spine' is the bone name.  If you wanted you could replace this with any other bone name.
}

DefaultProperties
{
GroupName=&quot;AttachingStuffToBone&quot;
FriendlyName=&quot;AttachingStuffToBone&quot;
Description=&quot;Attaching Stuff ToBone.|| This will attach the triggers and the emitters to the pawn..&quot;
}
&lt;/uscript&gt;

==Step Three==

Next, we will put attaching emitters into the mix.  Add the following bits of code. (pulled from the SpeedCombo source)

&lt;uscript&gt;
    var xEmitter LeftTrail, RightTrail; //Put this line just under the first variable

    //Put these lines of code just under your BoneTrigger lines of code.
    LeftTrail = Spawn(class'SpeedTrail', x,, x.Location, x.Rotation); //SpeedTrail is already created :).
    x.AttachToBone(LeftTrail, 'lfoot'); //lfoot = Left Foot

    RightTrail = Spawn(class'SpeedTrail', x,, x.Location, x.Rotation);
    x.AttachToBone(RightTrail, 'rfoot');//rfoot = Right Foot
&lt;/uscript&gt;

==Step Four==

Compile :).  Your basically done now.  All you have to do is create our .INT file for the mutator and the package that you put the code in.  When all is well, load up [[Legacy:UT2003|UT2003]].  Start a match with your Mutator selected.  When the match starts, go to your console and type '''behindview 1'''.  Now walk around.  You should see the trigger attached to your spine and the emitters attached to your feet.

==Related Topics==
* [[Legacy:Bone Names|Bone Names]]

==Discussion==

'''EricBlade:''' I'm attempting to attach a beam emitter to a player, which works great, using the normal bHardAttach and SetBase(), however, I wanted a little more realism for attachment, so I attached it to the player's Right Hand bone.  This works great, as long as I'm not in first person view.  If I'm in first person view, the emitter is invisible.  Is this because the player pawn isn't drawn, while in first person?  Is there a way around that?

'''SuperApe:''' You guessed it.  Third-person view draws the xPawn just like you see other teammates and enemies.  But, First-person view draws entirely different meshes for your weapons and turns off your xPawn.  If you want your beam emitter to be on the &quot;weapon hand&quot;, first I'd make sure you know which one it is (since you can configure it to be Right, Left, Center or Hidden in UT200x), then I'd try two things: 1) try to &quot;piggy back&quot; on the First-Person Weapon mesh so you automatically get it's walk/run bobbing motion, then if not that, 2) try attaching your beam emitter to the Controller instead and make your own bobbing to try and match the First-Person weapon meshes.  It seems #2 would be decidedly more difficult, but it's something to try.

'''Xian:''' Not sure how it works in UE2, since UE1 doesn't have bones (well it does, but no support for it from UScript), but I for one would keep a pointer to the attachemnt then use RenderOverlays and Canvas.DrawActor();

OK this is how I'd do it in UE1, IF I had bone support:

&lt;uscript&gt;
function AttachIt (PlayerController Other) // at least I think the PalyerController is the main &quot;player&quot; in UE2
{
  local Actor MyAttachment; // Obviously &lt;Actor&gt; here would be replaced by your Object type

  MyAttachment = Spawn(class'Actor', Other,, Other.Location, Other.Rotation);
  Other.AttachToBone(MyAttachment,'whatever');
  Xian(Other).MyAttachment = MyAttachment;
}
&lt;/uscript&gt;

Ok that'd be the basic attachment (small reference, I didn't get the point of the xPawn conversion... it's just useless code since the function is available to all Actor class... anyway...)

And this is in a your PlayerPawn (I assume it's the PlayerController in UE2):

&lt;uscript&gt;
function RenderOverlays (Canvas Canvas) // if this function doesn't exist in UE2 use PostRender
{
  if (MyAttachment != None)
     Canvas.DrawActor(MyAttachment,False);

  // don't forget to call the super :)
}
&lt;/uscript&gt;

I'm sorry I can't give you a detailed enough example but if you worked with both engines you'll know how to port what I showed you properly. Although I doubt it's the case but if it still doesn't work try setting bHidden to False in your attachment(s) :)

'''SuperApe:''' I see the economy of this suggestion.  I think it depends on the detail you'd want from this attachment.  If you want it to interact with the world in 3D, as a beam emitter shooting from the arm might, a HUDOverlay may not do it.

'''Xian:''' well Canvas.DrawActor() is limited to drawing ONLY the mesh itself. However... there are ways around it. Remember the Pulse Gun from UT ? It has the beam sprite/model, the green long one. You could use that in another effect or a &quot;fake&quot; projectile which would have 0 damage with a bit of adjusted code. This approach might work in UE2 if you have such a firing animation/sprite/model. So what I am saying is use DrawActor() for the mesh but the firing effect or whatever it does would be a separate thing... although you could prolly use a PostRender() call in that as well if it is all just texture drawing and not real animation (where Actor-&gt;Effects classes should be used). But I think you get the idea :) Such code &quot;hacks&quot; are quite efficient if done properly. Engine limitations should not stop you.

'''EricBlade:''' What I ended up doing is, since I'm moving a projector and emitter and light around every tick, anyway, I just made it so that the emitter gets reset to GetBoneCoords('rhand',1).Origin as it's position, and that works just about as well :)</text>
    </revision>
    <revision>
      <id>1508</id>
      <timestamp>2006-04-14T18:50:30Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A [[Legacy:Bone|bone]] is part of a [[Legacy:Skeletal Mesh|skeletal mesh]].  The standard skeletal mesh for the [[Legacy:Pawn|pawn]] includes the head, right leg, left leg, right foot, left foot, right hand, left hand, right shoulder, left shoulder, and the spine.  Using [[Legacy:UnrealScript|UnrealScript]], you can attach almost anything to any bone of a given mesh.

Here, we'll discuss how you can attach actors to bones.  For instance if you wanted an actor to follow a pawn around, you could attach it to a bone of that pawn.  Or, if you wanted to attach emitters to the legs of a pawn, you would have to attach the emitters to both leg bones. An example of this is the Speed Combo in [[Legacy:UT2003|UT2003]].

==Introduction==

We'll start by putting you through a very basic walkthrough.  We'll spawn a custom trigger, attach it to the 'spine' of the pawn and then we will spawn Emitters and attach them to both legs.  I suggest making a new package and call it AttachingToBones or something easy (see [[Legacy:Set Up Package Folders|Set Up Package Folders]] for help with this).

==Step One==

First, we need to create the custom trigger.  Create the following:

&lt;uscript&gt;
class SpineTrigger extends Trigger;

//We aren't going to make this do anything because
//this is just a walkthrough on how you can attach something to a bone

DefaultProperties
{
      bHidden=False //We want this false so you can see that it actually attached itself to the spine.
}
&lt;/uscript&gt;

==Step Two==

Now we need to spawn this trigger and attach it to the pawn.  The following mutator code should do this with no problem at all.

&lt;uscript&gt;
class MutAttachToBones extends Mutator;

var trigger BoneTrigger; //We need this variable or, it won't recognize what your trying to attach.

function ModifyPlayer(Pawn Other)
{
  local xPawn x;
   x = xPawn(Other);

  BoneTrigger = Spawn(class'SpineTrigger', x,, x.Location, x.Rotation);
  x.AttachToBone(BoneTrigger, 'spine'); //AttachToBone I believe is a native function so it can work in all actors.
                             //'spine' is the bone name.  If you wanted you could replace this with any other bone name.
}

DefaultProperties
{
GroupName=&quot;AttachingStuffToBone&quot;
FriendlyName=&quot;AttachingStuffToBone&quot;
Description=&quot;Attaching Stuff ToBone.|| This will attach the triggers and the emitters to the pawn..&quot;
}
&lt;/uscript&gt;

==Step Three==

Next, we will put attaching emitters into the mix.  Add the following bits of code. (pulled from the SpeedCombo source)

&lt;uscript&gt;
    var xEmitter LeftTrail, RightTrail; //Put this line just under the first variable

    //Put these lines of code just under your BoneTrigger lines of code.
    LeftTrail = Spawn(class'SpeedTrail', x,, x.Location, x.Rotation); //SpeedTrail is already created :).
    x.AttachToBone(LeftTrail, 'lfoot'); //lfoot = Left Foot

    RightTrail = Spawn(class'SpeedTrail', x,, x.Location, x.Rotation);
    x.AttachToBone(RightTrail, 'rfoot');//rfoot = Right Foot
&lt;/uscript&gt;

==Step Four==

Compile :).  Your basically done now.  All you have to do is create our .INT file for the mutator and the package that you put the code in.  When all is well, load up [[Legacy:UT2003|UT2003]].  Start a match with your Mutator selected.  When the match starts, go to your console and type '''behindview 1'''.  Now walk around.  You should see the trigger attached to your spine and the emitters attached to your feet.

==Related Topics==
* [[Legacy:Bone Names|Bone Names]]

==Discussion==

'''EricBlade:''' I'm attempting to attach a beam emitter to a player, which works great, using the normal bHardAttach and SetBase(), however, I wanted a little more realism for attachment, so I attached it to the player's Right Hand bone.  This works great, as long as I'm not in first person view.  If I'm in first person view, the emitter is invisible.  Is this because the player pawn isn't drawn, while in first person?  Is there a way around that?

'''SuperApe:''' You guessed it.  Third-person view draws the xPawn just like you see other teammates and enemies.  But, First-person view draws entirely different meshes for your weapons and turns off your xPawn.  If you want your beam emitter to be on the &quot;weapon hand&quot;, first I'd make sure you know which one it is (since you can configure it to be Right, Left, Center or Hidden in UT200x), then I'd try two things: 1) try to &quot;piggy back&quot; on the First-Person Weapon mesh so you automatically get it's walk/run bobbing motion, then if not that, 2) try attaching your beam emitter to the Controller instead and make your own bobbing to try and match the First-Person weapon meshes.  It seems #2 would be decidedly more difficult, but it's something to try.

'''Xian:''' Not sure how it works in UE2, since UE1 doesn't have bones (well it does, but no support for it from UScript), but I for one would keep a pointer to the attachemnt then use RenderOverlays and Canvas.DrawActor();

OK this is how I'd do it in UE1, IF I had bone support:

&lt;uscript&gt;
function AttachIt (PlayerController Other) // at least I think the PalyerController is the main &quot;player&quot; in UE2
{
  local Actor MyAttachment; // Obviously &lt;Actor&gt; here would be replaced by your Object type

  MyAttachment = Spawn(class'Actor', Other,, Other.Location, Other.Rotation);
  Other.AttachToBone(MyAttachment,'whatever');
  Xian(Other).MyAttachment = MyAttachment;
}
&lt;/uscript&gt;

Ok that'd be the basic attachment (small reference, I didn't get the point of the xPawn conversion... it's just useless code since the function is available to all Actor class... anyway...)

And this is in a your PlayerPawn (I assume it's the PlayerController in UE2):

&lt;uscript&gt;
function RenderOverlays (Canvas Canvas) // if this function doesn't exist in UE2 use PostRender
{
  if (MyAttachment != None)
     Canvas.DrawActor(MyAttachment,False);

  // don't forget to call the super :)
}
&lt;/uscript&gt;

I'm sorry I can't give you a detailed enough example but if you worked with both engines you'll know how to port what I showed you properly. Although I doubt it's the case but if it still doesn't work try setting bHidden to False in your attachment(s) :)

'''SuperApe:''' I see the economy of this suggestion.  I think it depends on the detail you'd want from this attachment.  If you want it to interact with the world in 3D, as a beam emitter shooting from the arm might, a HUDOverlay may not do it.

'''Xian:''' well Canvas.DrawActor() is limited to drawing ONLY the mesh itself. However... there are ways around it. Remember the Pulse Gun from UT ? It has the beam sprite/model, the green long one. You could use that in another effect or a &quot;fake&quot; projectile which would have 0 damage with a bit of adjusted code. This approach might work in UE2 if you have such a firing animation/sprite/model. So what I am saying is use DrawActor() for the mesh but the firing effect or whatever it does would be a separate thing... although you could prolly use a PostRender() call in that as well if it is all just texture drawing and not real animation (where Actor-&gt;Effects classes should be used). But I think you get the idea :) Such code &quot;hacks&quot; are quite efficient if done properly. Engine limitations should not stop you.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AttractCamera</title>
    <id>28857</id>
    <revision>
      <id>42784</id>
      <timestamp>2010-03-30T16:19:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Augmentation (DX)</title>
    <id>413</id>
    <revision>
      <id>1366</id>
      <timestamp>2004-08-11T10:53:08Z</timestamp>
      <contributor>
        <ip>213-162-109-219.mikear552.adsl.metronet.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the parent class of all augmentations.

Note that augmentations cannot be given to a player unless they are specified in the player class' augmentationSystem.augClasses[] variable. augmentationSystem is an [[Legacy:AugmentationManager (DX)|AugmentationManager (DX)]] class and each [[Legacy:DeusExPlayer (DX)|DeusExPlayer (DX)]] owns one.

====Properties====
;bool bAutomatic
;float EnergyRate : amount of bioelectric energy used per minute
;int CurrentLevel [travel] : upgrade level (0-3) of the aug
;int MaxLevel : maximum possible upgrade level. 3 by default
;texture icon : aug icon (used on aug screen?)
;int IconWidth, IconHeight : aug icon's dimensions
;texture smallIcon : small aug icon (used on HUD?)
;bool bAlwaysActive : true for IFF etc. where the aug is always on
;bool bBoosted [travel] : used in conjunection with BoostAugs (a property of [[Legacy:AugmentationManager (DX)|AugmentationManager (DX)]])
;int HotKeyNum [travel] : the hotkey (3-12?) assigned to this particular aug for this particular player
;Augmentation next [travel] : the next aug in the aug chain
;bool bUsingMedbot
;DeusExPlayer Player : player that this aug belongs to
;float LevelValues[4] : &quot;values&quot; associated with each level of the aug. The values are applied in different ways for different augs, e.g. it could be the damage scale of shots with ballistic protection or the amount of energy drain for cloak (these are examples - not necessarily true)
;bool bHasIt [travel] : specifies whether the player actually has this aug. The player is &quot;given&quot; all the aug classes at the start of the game but they are not available until this property is true
;bool bIsActive [travel] : is it turned on?
;enum EAugmentationLocation AugmentationLocation : where the aug belongs. Options are: LOC_Cranial, LOC_Eye, LOC_Torso, LOC_Arm, LOC_Leg, LOC_Subdermal, or LOC_Default.
;int MPConflictSlot : the augs are all paired in MP, and the MPConflictSlot configures these pairs. e.g. cloak and vision augs have the same MPConflictSlot.
;sound ActivateSound, DeactivateSound, LoopSound : sounds played on activation, deactivation, and when the aug is on respectively.

==Localized strings==

var localized string

EnergyRateLabel, OccupiesSlotLabel, AugLocsText[7];

var() localized string

AugActivated, AugDeactivated, AugmentationName, Description, MPInfo, AugAlreadyHave, AugNowHave, AugNowHaveAtLevel, AlwaysActiveLabel, CanUpgradeLabel, CurrentLevelLabel, MaximumLabel;

====Associated classes====

The Augmentation classes are the bare bones of the aug system. If you're planning on making new augs or editing existing augs you should

also look at the following:
* [[Legacy:AugmentationManager (DX)|AugmentationManager (DX)]]
* [[Legacy:DeusExPlayer (DX)|DeusExPlayer (DX)]]
* Possibly [[Legacy:AugmentationDisplayWindow (DX)|AugmentationDisplayWindow (DX)]]

To make new augs you will definitely have to modify AugmentationManager either on-the-fly or via a new AugmentationManager class (which will then need a new DeusExPlayer class).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Authorizer</title>
    <id>5061</id>
    <revision>
      <id>11709</id>
      <timestamp>2008-05-05T08:29:57Z</timestamp>
      <contributor>
        <username>Raven</username>
        <id>16</id>
      </contributor>
      <comment>[[Legacy:Authorizer]] moved to [[UE1:Authorizer]]</comment>
      <text xml:space="preserve">#REDIRECT [[UE1:Authorizer]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AutoDoor</title>
    <id>516</id>
    <revision>
      <id>1615</id>
      <timestamp>2007-07-27T13:39:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Door]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Door|Door]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AutoLadder</title>
    <id>515</id>
    <revision>
      <id>1613</id>
      <timestamp>2007-08-01T14:41:23Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <comment>Revert</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Ladder|Ladder]]</text>
    </revision>
    <revision>
      <id>1614</id>
      <timestamp>2007-08-01T14:33:08Z</timestamp>
      <contributor>
        <ip>Ce-bg1-1-primary.opb.interbusiness.it</ip>
      </contributor>
      <comment>Good site</comment>
      <text xml:space="preserve">free motorola ringtone converter

Half a loaf is better than no bread</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AutoLoader</title>
    <id>409</id>
    <revision>
      <id>1357</id>
      <timestamp>2007-11-18T17:06:03Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; AutoLoader (Package: ConfigManager)}}

Here's an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Example]] on how to use this class

&lt;uscript line&gt;
//-----------------------------------------------------------
//	ConfigManager.AutoLoader
//
//	This class has two functions:
//	1. Perform all required ini changes needed for your mod.  Will also UNDO
//	   any changes made to the ini if your mod is deactivated.
//	   Additional benefit of auto-installation of your mutator on a dedicated
//	   server (to enable set bEnableMyLoader=True in defaultproperties)
//
//	2.	Pass FillPlayInfo() calls to mutators which are not part of the game's
//		mutator list (such as mutators which only require ServerActors= lines in ini)
//
//-----------------------------------------------------------
class AutoLoader extends Info
	abstract;

// Quick note about debugging - By setting DEBUG=True in defaultproperties of your
// AutoLoader subclass when compiling, you can receive large amounts of debug data.
// However, you will quickly encounter the 1024 byte limit if you use ucc.exe to
// start the testing server.  By starting a server using the &quot;ut2003 -server&quot; command,
// you will bypass this limit, since ut2003.exe does not have these limitations.

var const bool DEBUG;
var const bool DEBUGPROPS;

var ConfigMaster				Manager; 			// Pointer to ConfigMaster mutator
var string						InteractionClass;	// Not yet implemented

//=======================================
//	Loading ServerActors
//=======================================
// Pointer to GameEngine
var GameEngine					GE;

// This loader includes a server-side only mutator or server actor
// that will not be part of the mutator chain (will receive FillPlayInfo() calls)
var() bool						bIncludeServerActor;

// Classname of the ServerActor this loader loads
// 	Same value as what would otherwise be your mod's
// 	ServerActors= line in the .ini file.
var() string ActorClass;

// Friendly Name of the Server Actor class
// 	Used by webadmin/adminmenu as the name of the server actor
var() localized string 			FriendlyName;
var() localized string			ActorDescription;

// Lock this loader to a certain version (or higher) of your mod
var() string			RequiredVersion;	// Required version of actor
var() localized string 	VersionWarning;		// Message to write to server log if version not enough
var() localized string 	DownloadMsg;		// Message to write to log

//=======================================
//	Automatic configuration changes
//=======================================
// A single ini change
struct IniEntry
{
	var() string ClassFrom;	// Class which contains the setting we want to change
	var() string PropName;	// Name of the variable we're trying to change
	var() string PropValue;	// Value to apply
};

// Array of ini settings required by this mod
var() 	array&lt;IniEntry&gt;					RequiredIniEntries;
var 	array&lt;Property&gt;					Properties;


//###################################################################
//###################################################################
//
//  Public methods - should be subclassed to customize loader's response

// if return true, loader class will be spawned
static function bool IsActive()
{
	return false;
}

// should be subclassed - set loader to active/will be included next match
static function bool EnableLoader(optional string SpecialActor)
{
	return false;
}

// should be subclassed
static function bool DisableLoader(optional string SpecialActor)
{
	return true;
}

// called on all loader classes - used to activate loader based on active mutators
static function bool CheckCurrentMutators(string URL)
{
	return false;
}

// called on all loader classes which have bIncludeServerActor=True - used to activate loader based on manual ServerActor entry
static function bool CheckStrayActors(string ServerActors)
{
	local int i;
	local bool bAddMe;

	if (default.bIncludeServerActor)
		if (InStr(ServerActors,default.ActorClass) != -1)
			bAddMe = EnableLoader();

	for (i = 0; i &lt; default.RequiredIniEntries.Length; i++)
		if (!bAddMe &amp;&amp; default.RequiredIniEntries[i].ClassFrom ~= &quot;Engine.GameEngine&quot; &amp;&amp; default.RequiredIniEntries[i].PropName ~= &quot;ServerActors&quot;)
			if (InStr(ServerActors,default.RequiredIniEntries[i].PropValue) != -1)
				bAddMe = EnableLoader();

	if (default.DEBUG)
	{
		log(default.Class@&quot;Received string value:&quot;$ServerActors,'CheckStrayActors');
		log(default.Class@&quot;Returning&quot;@bAddMe,'CheckStrayActors');
	}
	return bAddMe;
}

// Only managed actors can be added to Ladder profiles
// Normally, only the ActorClass of your loader (if bIncludeServerActor=True) would be need to be managed
static function array&lt;string&gt; GetManagedActors()
{
	local int i;
	local string A, B, C;
	local array&lt;string&gt; ABC;

	i = -1;
	while (static.AddManagedActor(i++,A,B,C))
		ABC[ABC.Length] = A$&quot;,&quot;$B$&quot;,&quot;$C;

	return ABC;
}

// Managed actors will be passed FillPlayInfo() calls
static function bool AddManagedActor(int Idx, out string ActorClassName, out string ActorName, out string ActorDesc)
{
	if (Idx == -1 &amp;&amp; default.bIncludeServerActor)
	{
		ActorClassName = default.ActorClass;
		ActorName = default.FriendlyName;
		ActorDesc = default.ActorDescription;
		return true;
	}

	return false;
}

// Optional hook for version filtering
static function bool MatchesVersion(float ActorVersion, optional bool bExact, optional string NewURL)
{
	local float CurrentVersion;
	local string LogText;

	if (default.RequiredVersion == &quot;&quot;)
		return true;

	CurrentVersion = float(default.RequiredVersion);

	// Return false if loader version is higher than actor version
	// Return false if loader version is lower than actor version and bExact=True
	if ((ActorVersion &lt; CurrentVersion) || (ActorVersion &gt; CurrentVersion &amp;&amp; bExact))
	{
		if (default.VersionWarning != &quot;&quot;)
		{
			LogText = static.ReplaceTag(default.VersionWarning,&quot;%CurVer%&quot;,CurrentVersion);
			LogText = static.ReplaceTag(LogText,&quot;%ReqVer%&quot;,ActorVersion);
			log(LogText);
		}

		if (NewURL != &quot;&quot;)
			log(static.ReplaceTag(default.DownloadMsg,&quot;%URL%&quot;,NewURL));

		return false;
	}

	return true;
}

// To prevent your loader from causing a server crash, add your checks here
// return false to prevent your loader from being loaded

// You only need to override this function if bIncludeServerActor=False in your loader,
// or if you have RequiredIniChanges that reference additional custom packages
static function bool ValidateLoader()
{
	local class&lt;Info&gt;	MyActor;

	if (default.bIncludeServerActor &amp;&amp; default.ActorClass != &quot;&quot;)
	{
		// Specify True for 3rd param in DynamicLoadObject to prevent log spam if MyActor isn't on server
		MyActor = class&lt;Info&gt;(DynamicLoadObject(default.ActorClass,class'Class',True));
		if (MyActor == None)
			return false;
	}

	return true;
}

// Hook for loader to cancel external removal request, or effect any specialized ini changes to make before removal
function bool AcceptRemoval(optional array&lt;Property&gt; Props)
{
	if (Props.Length &gt; 0)
		Properties = Props;

	RemoveMe();
	return true;
}

// should be subclassed
// always use &quot;return !bEnableMyLoader;&quot;
// see LadderLoader.LadderLoader or TeamBalanceLoader.BalanceLoader for examples
function bool WantsToBeDisabled()
{
	return false;
}

// called for each RequiredIniEntry
// return true to apply the RequiredIniEntry.PropValue
function bool ObjectNeedsUpdate(Object O, string PropName, string PropValue)
{
	local string Temp;

	Temp = O.GetPropertyText(PropName);
	if ( InStr(Caps(Temp),Caps(PropValue)) &lt; 0 )
		return true;

	return false;
}

// notification of pending update - return false to skip update for loader
function bool ApplyUpdate()
{
	if (DEBUG) log(class@&quot;Returning&quot;@IsActive(),'ApplyUpdate');
	return IsActive();
}

// return -1 if want to simply add entry
// return index of array entry if want to overwrite
function int CheckArrayEntry(string PropName, array&lt;string&gt; PropArray)
{
	return -1;
}

// To maintain consistency, always add to &quot;Server Actors&quot; page
// static function FillPlayInfo(PlayInfo PI)
// {
// 		Super.FillPlayInfo(PI);
//		PI.AddSetting(&quot;ServerActors&quot;,....
// }
//
//###################################################################
//###################################################################
//
//	Public Final Methods
//	These are used to operate the internal mechanisms of the auto loader system.
//
//

// Called by ConfigMaster when Level.ServerTravel is called

// Removes loader if WantsToBeDisabled() returns True
// Applies value for RequiredIniProperties if ObjectNeedsUpdate returns true
final function UpdateConfiguration(array&lt;Property&gt; Props)
{
	local Object 			O;
	local Property			P;

	local string 			N,V;
	local int 				i, j;

	local array&lt;string&gt;		Arr;
	local string			ArrS;

	if (DEBUG)
		log(&quot;Update configuration in&quot;@class,'UpdateConfiguration');

	ResetConfig();
	Properties = Props;

	if (WantsToBeDisabled())
	{
		RemoveMe();
		return;
	}

	if (bIncludeServerActor &amp;&amp; ActorClass != &quot;&quot;)
	{
		O = GetObjectOfClass(class'Engine.GameEngine');
		if (O != None)
		{
			if (ObjectNeedsUpdate(O, &quot;ServerActors&quot;, ActorClass))
			{
				ArrS = O.GetPropertyText(&quot;ServerActors&quot;);
				if (ArrS != &quot;&quot;)
					Arr = GenerateArray(ArrS);

				j = -1;
				if (Arr.Length &gt; 0)
					j = CheckArrayEntry(&quot;ServerActors&quot;, Arr);

				if (j &lt; 0)
					O.SetPropertyText(&quot;ServerActors&quot;,AddDynArrayMember(O,&quot;ServerActors&quot;,ActorClass));

				else O.SetPropertyText(&quot;ServerActors&quot;,InsertArrayMember(O, &quot;ServerActors&quot;, ActorClass, j));
				O.SaveConfig();
			}
		}
	}

	for (i = 0;i&lt;RequiredIniEntries.Length;i++)
	{
		O = GetObjectForEntry(RequiredIniEntries[i]);
		if (O == None) continue;

		if (!ObjectNeedsUpdate(O, RequiredIniEntries[i].PropName, RequiredIniEntries[i].PropValue)) continue;

		N = RequiredIniEntries[i].PropName;
		V = RequiredIniEntries[i].PropValue;
		P = GetProperty(O, N);
		if (DEBUG)
			log(class@&quot;got property&quot;@p,'UpdateConfiguration');

		if (P == None) continue;

		j = -1;

		if (PropIsArray(P))
		{
			ArrS = O.GetPropertyText(N);
			if (ArrS != &quot;&quot;)
				Arr = GenerateArray(ArrS);

			if (Arr.Length &gt; 0)
				j = CheckArrayEntry(N, Arr);

			if (j &lt; 0)
				O.SetPropertyText(N,AddDynArrayMember(O,N,V));

			else O.SetPropertyText(N,InsertArrayMember(O, N, V, j));
		}

		else
		{
			StoreDefaultValue(O, N);
			O.SetPropertyText(N,V);
		}

		O.SaveConfig();
	}
}

// Regarding OriginalValues
final function StoreDefaultValue(Object O, string PropName)
{
	local int i, idx;
	local IniEntry NewDefault;
	local string CurrentValue, Quote;
	local array&lt;string&gt; Ar;

	if (DEBUG)
		log(class@&quot;storing default&quot;@o@propname,'StoreDefaultValue');

	for (i = 0; i &lt; ConfigMaster(Owner).OriginalValues.Length; i++)
		if (ConfigMaster(Owner).OriginalValues[i].ClassFrom == string(O.Class) &amp;&amp; ConfigMaster(Owner).OriginalValues[i].PropName == PropName)
			return;

	NewDefault.ClassFrom = string(O.Class);
	// Check if this property name is a single array member
	i = -1; idx = -1;
	i = InStr(PropName, &quot;§&quot;);
	if (i != -1)
	{
		idx = int(Left(PropName, i));
		PropName = Mid(PropName, i + 1);
		CurrentValue = O.GetPropertyText(PropName);
		Ar = GenerateArray(CurrentValue);
		CurrentValue = Ar[idx];

		// Remove literal string wrapper
		if (Left(CurrentValue,1) == &quot;\&quot;&quot;)
		{
			CurrentValue = Mid(CurrentValue,1,Len(CurrentValue) - 2);
			Quote = &quot;¶&quot;;
		}
		CurrentValue = idx $ &quot;§&quot; $ CurrentValue $ Quote;
	}

	else CurrentValue = O.GetPropertyText(PropName);

	NewDefault.PropName = PropName;
	NewDefault.PropValue = CurrentValue;
	if (DEBUG)
		log(class@&quot;old value:&quot;@NewDefault.PropValue,'StoreDefaultValue');

	ConfigMaster(Owner).OriginalValues[ConfigMaster(Owner).OriginalValues.Length] = NewDefault;
	ConfigMaster(Owner).SaveConfig();
}

final function bool RestoreOriginalValue(Object O, string PropName)
{
	local int i, j, idx;
	local string CurrentValue, StoredValue;
	local array&lt;string&gt; Ar;

	for (i = 0; i &lt; ConfigMaster(Owner).OriginalValues.Length; i++)
	{
		if (ConfigMaster(Owner).OriginalValues[i].ClassFrom ~= string(O.Class) &amp;&amp; ConfigMaster(Owner).OriginalValues[i].PropName ~= PropName)
		{
			StoredValue = ConfigMaster(Owner).OriginalValues[i].PropValue;
			// First check if this was a single array member
			j = InStr(StoredValue, &quot;§&quot;);
			if (j != -1)
			{
				idx = int(Left(StoredValue, j));
				StoredValue = Mid(StoredValue, j + 1);
				if (Right(StoredValue, 1) == &quot;¶&quot;)
				{
					StoredValue = Left(StoredValue, Len(StoredValue) - 1);
					StoredValue = &quot;\&quot;&quot; $ StoredValue $ &quot;\&quot;&quot;;
				}
				CurrentValue = O.GetPropertyText(PropName);
				Ar = GenerateArray(CurrentValue);
				Ar[idx] = StoredValue;
				StoredValue = &quot;(&quot; $ Join(Ar,&quot;,&quot;,True) $&quot;)&quot;;
			}

			if (DEBUG)
				log(class@&quot;Assigning&quot;@StoredValue@&quot;to property&quot;@string(O.Class)$&quot;.&quot;$PropName,'RestoreOriginalValue');
			O.SetPropertyText(PropName, StoredValue);
			O.SaveConfig();
			break;
		}
	}

	if (i &lt; ConfigMaster(Owner).OriginalValues.Length)
	{
		ConfigMaster(Owner).OriginalValues.Remove(i, 1);
		ConfigMaster(Owner).SaveConfig();
		return true;
	}

	return false;
}

//###################################################################
//###################################################################
//
//	Internal Methods
//	These are used to control the internal operation of the loader itself.
//	These methods may only be called by other methods within the loader.
//

protected final function RemoveMe()
{
	local int i;
	local Object O;
	local Property P;

	if (DEBUG)
		log(class@&quot;being removed.&quot;,'RemoveMe');

	if (bIncludeServerActor &amp;&amp; ActorClass != &quot;&quot;)
	{
		O = GetObjectOfClass(class'Engine.GameEngine');
		if (O != None)
			RemoveArrayEntry(O, &quot;ServerActors&quot;, ActorClass);
	}

	for (i = 0; i &lt; RequiredIniEntries.Length; i++)
	{
		O = GetObjectForEntry(RequiredIniEntries[i]);
		if (O == None) continue;

		P = GetProperty(O,RequiredIniEntries[i].PropName);
		if (P != None &amp;&amp; PropIsArray(P))
			RemoveArrayEntry(O,RequiredIniEntries[i].PropName,RequiredIniEntries[i].PropValue);

		else RestoreOriginalValue(O, RequiredIniEntries[i].PropName);
	}

	DisableLoader();
}

protected final function string InsertArrayMember(Object Obj, string PropName, string NewValue, int Pos)
{
	local string CurValue, Quote, Tmp;
	local array&lt;string&gt;	Members;
	local bool bStatic;

	if (Obj == None)
	{
		Warn(&quot;Object is None&quot;);
		return &quot;&quot;;
	}

	CurValue = Obj.GetPropertyText(PropName);
	Members = GenerateArray(CurValue);

	if (DEBUG)
	{
		log(class$&quot;:Inserting new member at position&quot;@Pos@&quot;to&quot;@Obj$&quot;.&quot;$PropName$&quot;:&quot;@NewValue,'InsertArrayMember');
		log(class$&quot;:Current Value:&quot;$CurValue,'InsertArrayMember');
	}

// Check for literal string
	if (InStr(Caps(CurValue), Caps(NewValue)) &lt; 0 &amp;&amp; Members.Length &gt; 0)
	{
		bStatic = Left(Members[pos], Len(PropName) + 1) ~= (PropName $ &quot;[&quot;);
		Tmp = StringIf(bStatic, Mid(Members[pos],InStr(Members[pos],&quot;=&quot;) + 1), Members[0]);
		Quote = StringIf(Left(Tmp,1) == &quot;\&quot;&quot; &amp;&amp; Left(NewValue,1) != &quot;\&quot;&quot;,&quot;\&quot;&quot;,&quot;&quot;);

		NewValue = StringIf(bStatic, PropName $ &quot;=&quot; $ Quote $ NewValue $ Quote, Quote $ NewValue $ Quote);
		if (DEBUG)
			log(InStr(Caps(CurValue),Caps(NewValue))@InStr(Caps(CurValue),Caps(NewValue))&lt;0@Caps(CurValue)@&quot;||&quot;@Caps(NewValue),'AddDynArrayMember');

		if (NewValue != &quot;&quot; &amp;&amp; Pos &gt; -1)
		{
			StoreDefaultValue(Obj, Pos$&quot;§&quot;$PropName);
			Members[Pos] = NewValue;
		}

		CurValue = &quot;(&quot; $ Join(Members,&quot;,&quot;,True) $ &quot;)&quot;;
	}

	if (DEBUG)
	{
		log(class@&quot;Returning:&quot;$CurValue,'InsertArrayMember');
		log(class@&quot;&quot;,'InsertArrayMember');
	}

	return CurValue;
}

// Currently, UT2003 does not support setting static arrays through the use of SetPropertyText
protected final function string AddStaticArrayMember(Object Obj, string PropName, string NewValue)
{
	local int i;
	local array&lt;string&gt;	Members;
	local string Quote, TempValue, CurValue;

	if (Obj == None)
	{
		Warn(&quot;Object was None for property&quot;@PropName);
		return &quot;&quot;;
	}

	CurValue = Obj.GetPropertyText(PropName);
	Members = GenerateArray(CurValue);

	if (InStr(Caps(CurValue), Caps(NewValue)) &lt; 0)
	{
		if (Members.Length &gt; 0)
		{
			TempValue = Mid(Members[0],InStr(Members[0],&quot;=&quot;)+1);

			// Check for literal string
			Quote = StringIf(Left(TempValue,1) == &quot;\&quot;&quot; &amp;&amp; Left(NewValue,1) != &quot;\&quot;&quot;, &quot;\&quot;&quot;, &quot;&quot;);
			for (i = 0; i &lt; Members.Length; i++)
			{
				if (Members[i] == &quot;&quot;)
				{
					Members[i] = PropName $ &quot;[&quot; $ i $ &quot;]=&quot; $ Quote $ NewValue $ Quote;
					break;
				}
			}
			CurValue = &quot;(&quot; $ Join(Members,&quot;,&quot;) $&quot;)&quot;;
		}

		else CurValue = &quot;(&quot; $ PropName $ &quot;[0]=&quot; $ NewValue $ &quot;)&quot;;
	}

	return CurValue;
}

protected final function string AddDynArrayMember(Object Obj, string PropName, string NewValue)
{
	local string CurValue, Quote;
	local array&lt;string&gt;	Members;

	if (Obj == None)
	{
		Warn(&quot;Object is None&quot;);
		return &quot;&quot;;
	}

	CurValue = Obj.GetPropertyText(PropName);
	Members = GenerateArray(CurValue);
	if (DEBUG)
	{
		log(class$&quot;:Adding new member to&quot;@Obj$&quot;.&quot;$PropName$&quot;:&quot;@NewValue,'AddDynArrayMember');
		log(class$&quot;:Current Value:&quot;$CurValue,'AddDynArrayMember');
	}

// Check for literal string
	if (InStr(Caps(CurValue), Caps(NewValue)) &lt; 0)
	{
		if (Members.Length &gt; 0)
		{
			if (DEBUG)
				log(InStr(Caps(CurValue),Caps(NewValue))@InStr(Caps(CurValue),Caps(NewValue))&lt;0@Caps(CurValue)@&quot;||&quot;@Caps(NewValue),'AddDynArrayMember');

			Quote = StringIf(Left(Members[0],1) == &quot;\&quot;&quot; &amp;&amp; Left(NewValue,1) != &quot;\&quot;&quot;, &quot;\&quot;&quot;, &quot;&quot;);
			Members[Members.Length] = Quote $ NewValue $ Quote;
			CurValue = &quot;(&quot; $ Join(Members,&quot;,&quot;,True) $ &quot;)&quot;;
		}
		else CurValue = &quot;(&quot; $ NewValue $ &quot;)&quot;;
	}

	if (DEBUG)
	{
		log(class@&quot;Returning:&quot;$CurValue,'AddDynArrayMember');
		log(class@&quot;&quot;,'AddDynArrayMember');
	}

	return CurValue;
}

// UT2003 currently does not support setting the value of static arrays
protected final function RemoveArrayEntry(Object O, string PropName, string PropValue)
{
	local int i, j;
	local array&lt;string&gt; Members;
	local string ArrayString, Quote, Tmp;
	local bool bStatic;

	if (O == None)
	{
		Warn(&quot;Object was none for property&quot;@PropName);
		return;
	}

	ArrayString = O.GetPropertyText(PropName);
	if (ArrayString == &quot;&quot;)
	{
		Warn(&quot;Property was not found:&quot;@PropName);
		return;
	}

	if (DEBUG)
	{
		log(class$&quot;: Removing array member&quot;@string(O.Class)$&quot;.&quot;$PropName$&quot;:&quot;$ArrayString,'RemoveArrayEntry');
		log(class$&quot;: Member to be removed:&quot;$PropValue,'RemoveArrayEntry');
	}

	Members = GenerateArray(ArrayString);
	bStatic = Left(Members[0], Len(PropName) + 1) ~= (PropName $ &quot;[&quot;);
	Tmp = StringIf(bStatic, Mid(Members[0],InStr(Members[0],&quot;=&quot;) + 1), Members[0]);
	Quote = StringIf(Left(Tmp,1) == &quot;\&quot;&quot; &amp;&amp; Left(PropValue,1) != &quot;\&quot;&quot;,&quot;\&quot;&quot;,&quot;&quot;);

	PropValue = StringIf(bStatic, PropName $ &quot;=&quot; $ Quote $ PropValue $ Quote, Quote $ PropValue $ Quote);
	for (i = 0; i &lt; Members.Length; i++)
	{
		if (DEBUG)
			log(class@&quot;Comparing&quot;@i@PropValue@&quot;to&quot;@Members[i],'RemoveArrayEntry');

		if (Members[i] ~= PropValue)
			break;
	}

	if (i &lt; Members.Length)
	{
		if (DEBUG) log(class@&quot;Removing array member&quot;@i$&quot;:&quot;$Members[i],'RemoveArrayEntry');

		// Check if we should restore a previous value
		for (j = 0; j &lt; ConfigMaster(Owner).OriginalValues.Length; j++)
		{
			if (DEBUG)
			{
				log(class@&quot;Checking Backup Value&quot;@j@&quot;class:&quot;$ConfigMaster(Owner).OriginalValues[j].ClassFrom@&quot;against&quot;@string(O.Class),'RemoveArrayEntry');
				log(class@&quot;Checking Backup Value&quot;@j@&quot;Property:&quot;$ConfigMaster(Owner).OriginalValues[j].PropName@&quot;against&quot;@PropName,'RemoveArrayEntry');
			}

			if (ConfigMaster(Owner).OriginalValues[j].ClassFrom ~= string(O.Class) &amp;&amp;
				ConfigMaster(Owner).OriginalValues[j].PropName ~= PropName )
			{
				RestoreOriginalValue(O, PropName);
				break;
			}
		}

		if (j &lt; ConfigMaster(Owner).OriginalValues.Length)
			return;

		Members.Remove(i,1);
	}

	else return;

	PropValue = &quot;(&quot; $ Join(Members,&quot;,&quot;) $ &quot;)&quot;;
	if (DEBUG)
		log(class@&quot;Assigning&quot;@PropValue@&quot;to property&quot;@string(O.Class)$&quot;.&quot;$PropName,'RemoveArrayEntry');
	O.SetPropertyText(PropName,PropValue);
	O.SaveConfig();
	if (DEBUG)
		log(class@&quot;Returning&quot;@O.GetPropertyText(PropName),'RemoveArrayEntry');
}

// Just a function to handle safe object creation
protected final function Object GetObjectForEntry(IniEntry ThisEntry)
{
	local Object O;
	local class&lt;Object&gt; OClass;

	if (DEBUG)
		log(class@&quot;Getting&quot;@ThisEntry.ClassFrom@ThisEntry.PropName@ThisEntry.PropValue,'GetObjectForEntry');

	OClass = class&lt;Object&gt;(DynamicLoadObject(ThisEntry.ClassFrom,class'Class'));
	if (OClass == None)
	{
		Warn(&quot;Could not load class&quot;@ThisEntry.ClassFrom);
		return None;
	}

	O = GetObjectOfClass(OClass);
	if (O == None)
		Warn(&quot;Unable to access object for class&quot;@OClass);

	return O;
}

protected final function Object GetObjectOfClass(class&lt;Object&gt; ObjClass)
{
	local Object Obj;
	local Actor A;

	if (DEBUG)
		log(class@&quot;Finding&quot;@ObjClass,'GetObjectOfClass');

	// Check for GameEngine
	if (ObjClass == class'GameEngine')
		return GE;

	// First try the easy way
	foreach AllObjects(ObjClass,Obj)
		return Obj;

	// Object may not be loaded right now, so attempt to load it
	// If actor, spawn it
	if (ClassIsChildOf(ObjClass,class'Actor'))
	{
		A = Spawn(class&lt;Actor&gt;(ObjClass));
		A.GoToState('');
		return A;
	}

	// if object, new it
	Obj = new(None) ObjClass;

	// might be property
	if (Obj == None)
		Obj = new(Class) ObjClass;

	// Don't know if this will even work ?
	if (Obj == None)
		Obj = New(ObjClass.default.Outer) ObjClass;

	if (DEBUG)
	{
		log(class@&quot;Could not create new object&quot;@ObjClass,'GetObjectOfClass');
		log(class@ObjClass@&quot;outer is&quot;@ObjClass.default.Outer,'GetObjectOfClass');
		log(class@&quot;&quot;,'GetObjectOfClass');
	}

	return Obj;
}

protected final function Property GetProperty(Object O, string PropName)
{
	local int i;
	local Class ClassOuter;
	local bool classexact, classchild, propn, seenclass;

	for (i=0;i&lt;Properties.Length;i++)
	{
		seenclass = Class(Properties[i].Outer) == ClassOuter;

		ClassOuter = Class(Properties[i].Outer);
		if (DEBUGPROPS)
		{
			if (ClassOuter == None)
			{
				log(class@&quot;Property Outer is not a class!&quot;,'GetProperty');
				continue;
			}

			if (!seenclass)
			{
				log(class@&quot;Compare Obj Class&quot;@O.Class@&quot;to&quot;@Properties[i].Outer,'GetProperty');
				if (O.Class==Properties[i].Outer)
					classexact = true;
			}

			if (!classchild &amp;&amp; ClassIsChildOf(O.Class,ClassOuter))
			{
				log(class@&quot;Obj class&quot;@O.Class@&quot;is child of&quot;@ClassOuter,'GetProperty');
				classchild = true;
			}

			else if (!classchild &amp;&amp; ClassIsChildOf(ClassOuter,O.Class))
			{
				log(class@&quot;Obj class&quot;@O.Class@&quot;is parent of&quot;@ClassOuter,'GetProperty');
				classchild = true;
			}

			if (!propn &amp;&amp; classexact)
			{
				log(class@&quot;Compare Name&quot;@PropName@&quot;to&quot;@Properties[i].Name,'GetProperty');
				if (PropName == string(Properties[i].Name))
					propn = true;
			}
		}

		if ((ClassIsChildOf(O.Class,ClassOuter)||O.Class == Properties[i].Outer||ClassIsChildOf(ClassOuter,O.Class)) &amp;&amp; string(Properties[i].Name) == PropName)
		{
			if (DEBUG)
			{
				log(class@&quot;Returning Property&quot;@Properties[i],'GetProperty');
				log(class@&quot;&quot;,'GetProperty');
			}

			return Properties[i];
		}
	}

	return None;
}

protected final function bool PropIsArray(Property P)
{
	if (DEBUG)
		log(class@&quot;Checking Property&quot;@P.Outer$&quot;.&quot;$P.Name$&quot;:&quot;@P.Class,'PropIsArray');
	return P.Class == class'ArrayProperty';
}

protected static final function array&lt;string&gt; GenerateArray(string ArrayString)
{
	local array&lt;string&gt;	Members;
	local int i;
	local string S;

	if (ArrayString != &quot;&quot;)
	{
		// Remove the array wrapper ( )
		ArrayString = Mid(ArrayString,1,Len(ArrayString)-2);

		// If string contains internal containers, then have to split differently
		if (Left(ArrayString,1) == &quot;(&quot;)
		{
			do {
				do {
					if (Left(ArrayString,1) == &quot;)&quot;)
						i--;
					else if (Left(ArrayString,1) == &quot;(&quot;)
						i++;
					Eat(S, ArrayString, 1);
				} until (i == 0);

				Members[Members.Length] = S;
				S = &quot;&quot;;
				if (ArrayString != &quot;&quot; &amp;&amp; Left(ArrayString,1) == &quot;,&quot;)
					ArrayString = Mid(ArrayString,1);
			} until (ArrayString == &quot;&quot;);
		}

		else Split2(ArrayString,&quot;,&quot;,Members);
	}

	return Members;
}

protected static final function bool NotInPlayInfo(PlayInfo PI, class&lt;Info&gt; NewInfo)
{
	local int i;
	if (PI == None)
	{
		Warn(&quot;Invalid PlayInfo Object!&quot;);
		return false;
	}

	for (i=0;i&lt;PI.InfoClasses.Length;i++)
	{
		if (PI.InfoClasses[i] == NewInfo)
			return false;
	}

	return true;
}


//###################################################################
//###################################################################
//
//	Utility Methods
//	These are used perform various tedious operations.
//
// Moves Num elements from Source to Dest
static final function Eat(out string Dest, out string Source, int Num)
{
	Dest = Dest $ Left(Source, Num);
	Source = Mid(Source, Num);
}

static final function string StringIf(bool Condition, string IfTrue, string IfFalse)
{
	if (Condition) return IfTrue;
	return IfFalse;
}

// Based on AccessControlIni &amp; Object.ReplaceText()
static final function string ReplaceTag(string from, string tag, coerce string with)
{
	local int i;
	local string t;

	// InStr() is case-sensitive
	i = InStr(Caps(from), Caps(tag));
	while (i != -1)
	{
		t = t $ Left(from,i) $ with;
		from = mid(from,i+len(tag));
		i = InStr(Caps(from), Caps(tag));
	}

	t = t $ from;
	return t;
}

// Following functions from wUtils103 by El_Muerte[TDS]
// Included by permission (copied to avoid package dependancy)

// Shifts an element off a string
// example (delim = ' '): 'this is a string' -&gt; 'is a string'
// if quotechar = &quot; : '&quot;this is&quot; a string' -&gt; 'a string'
static final function string StrShift(out string line, string delim, optional string quotechar)
{
    local int delimpos, quotepos;
    local string result;

    if ( quotechar != &quot;&quot; &amp;&amp; Left(line, Len(quotechar)) == quotechar ) {
        do {
            quotepos = InstrFrom(line, quotechar, quotepos + 1);
        } until (quotepos == -1 || quotepos + Len(quotechar) == Len(line)
                || Mid(line, quotepos + len(quotechar), len(delim)) == delim);
    }
    if ( quotepos != -1 ) {
        delimpos = InstrFrom(line, delim, quotepos);
    }
    else {
        delimpos = Instr(line, delim);
    }

    if (delimpos == -1)
    {
        result = line;
        line = &quot;&quot;;
    }
    else {
        result = Left(line,delimpos);
        line = Mid(line,delimpos+len(delim));
    }
    if ( quotechar != &quot;&quot; &amp;&amp; Left(result, Len(quotechar)) == quotechar ) {
      result = Mid(result, Len(quotechar), Len(result)-(Len(quotechar)*2));
    }
    return result;
}

// Join the elements of a string array to an array
static final function string Join(array&lt; string &gt; ar, optional string delim, optional bool bIgnoreEmpty)
{
  local string result;
  local int i;
  for (i = 0; i &lt; ar.length; i++)
  {
    if (bIgnoreEmpty &amp;&amp; ar[i] == &quot;&quot;) continue;
    if (result != &quot;&quot;) result = result$delim;
    result = result$ar[i];
  }

  return result;
}

// Fixed split method
// no problems when it starts with a delim
// no problems with ending spaces
// delim can be a string
static final function int Split2(coerce string src, string delim, out array&lt;string&gt; parts, optional bool ignoreEmpty, optional string quotechar)
{
  local string temp;
  Parts.Remove(0, Parts.Length);
  if (delim == &quot;&quot; || Src == &quot;&quot; ) return 0;
  while (src != &quot;&quot;)
  {
    temp = StrShift(src, delim, quotechar);
    if (temp == &quot;&quot;)
    {
      if (!ignoreEmpty)
      {
        parts.length = parts.length+1;
        parts[parts.length-1] = temp;
      }
    }
    else {
      parts.length = parts.length+1;
      parts[parts.length-1] = temp;
    }
  }
  return parts.length;
}

// InStr starting from an offset
static final function int InStrFrom(coerce string StrText, coerce string StrPart, optional int OffsetStart)
{
  local int OffsetPart;

  OffsetPart = InStr(Mid(StrText, OffsetStart), StrPart);
  if (OffsetPart &gt;= 0)
    OffsetPart += OffsetStart;
  return OffsetPart;
}
&lt;/uscript&gt;

----

'''Wormbo:''' Hmm, a little documentation instead of the source code wouldn't hurt. E.g. how can you use this to enable/disable a server actor?

'''El Muerte TDS:''' like this: [http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/ChatFilterLoader/Classes/ChatFilterLoader.uc?rev=1.7&amp;content-type=text/x-cvsweb-markup ChatFilter AutoLoader], maybe write a [/example] based on it... first lunch

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1358</id>
      <timestamp>2005-12-27T15:31:20Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; AutoLoader (Package: ConfigManager)}}

Here's an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Example]] on how to use this class

&lt;uscript line&gt;
//-----------------------------------------------------------
//	ConfigManager.AutoLoader
//
//	This class has two functions:
//	1. Perform all required ini changes needed for your mod.  Will also UNDO
//	   any changes made to the ini if your mod is deactivated.
//	   Additional benefit of auto-installation of your mutator on a dedicated
//	   server (to enable set bEnableMyLoader=True in defaultproperties)
//
//	2.	Pass FillPlayInfo() calls to mutators which are not part of the game's
//		mutator list (such as mutators which only require ServerActors= lines in ini)
//
//-----------------------------------------------------------
class AutoLoader extends Info
	abstract;

// Quick note about debugging - By setting DEBUG=True in defaultproperties of your
// AutoLoader subclass when compiling, you can receive large amounts of debug data.
// However, you will quickly encounter the 1024 byte limit if you use ucc.exe to
// start the testing server.  By starting a server using the &quot;ut2003 -server&quot; command,
// you will bypass this limit, since ut2003.exe does not have these limitations.

var const bool DEBUG;
var const bool DEBUGPROPS;

var ConfigMaster				Manager; 			// Pointer to ConfigMaster mutator
var string						InteractionClass;	// Not yet implemented

//=======================================
//	Loading ServerActors
//=======================================
// Pointer to GameEngine
var GameEngine					GE;

// This loader includes a server-side only mutator or server actor
// that will not be part of the mutator chain (will receive FillPlayInfo() calls)
var() bool						bIncludeServerActor;

// Classname of the ServerActor this loader loads
// 	Same value as what would otherwise be your mod's
// 	ServerActors= line in the .ini file.
var() string ActorClass;

// Friendly Name of the Server Actor class
// 	Used by webadmin/adminmenu as the name of the server actor
var() localized string 			FriendlyName;
var() localized string			ActorDescription;

// Lock this loader to a certain version (or higher) of your mod
var() string			RequiredVersion;	// Required version of actor
var() localized string 	VersionWarning;		// Message to write to server log if version not enough
var() localized string 	DownloadMsg;		// Message to write to log

//=======================================
//	Automatic configuration changes
//=======================================
// A single ini change
struct IniEntry
{
	var() string ClassFrom;	// Class which contains the setting we want to change
	var() string PropName;	// Name of the variable we're trying to change
	var() string PropValue;	// Value to apply
};

// Array of ini settings required by this mod
var() 	array&lt;IniEntry&gt;					RequiredIniEntries;
var 	array&lt;Property&gt;					Properties;


//###################################################################
//###################################################################
//
//  Public methods - should be subclassed to customize loader's response

// if return true, loader class will be spawned
static function bool IsActive()
{
	return false;
}

// should be subclassed - set loader to active/will be included next match
static function bool EnableLoader(optional string SpecialActor)
{
	return false;
}

// should be subclassed
static function bool DisableLoader(optional string SpecialActor)
{
	return true;
}

// called on all loader classes - used to activate loader based on active mutators
static function bool CheckCurrentMutators(string URL)
{
	return false;
}

// called on all loader classes which have bIncludeServerActor=True - used to activate loader based on manual ServerActor entry
static function bool CheckStrayActors(string ServerActors)
{
	local int i;
	local bool bAddMe;

	if (default.bIncludeServerActor)
		if (InStr(ServerActors,default.ActorClass) != -1)
			bAddMe = EnableLoader();

	for (i = 0; i &lt; default.RequiredIniEntries.Length; i++)
		if (!bAddMe &amp;&amp; default.RequiredIniEntries[i].ClassFrom ~= &quot;Engine.GameEngine&quot; &amp;&amp; default.RequiredIniEntries[i].PropName ~= &quot;ServerActors&quot;)
			if (InStr(ServerActors,default.RequiredIniEntries[i].PropValue) != -1)
				bAddMe = EnableLoader();

	if (default.DEBUG)
	{
		log(default.Class@&quot;Received string value:&quot;$ServerActors,'CheckStrayActors');
		log(default.Class@&quot;Returning&quot;@bAddMe,'CheckStrayActors');
	}
	return bAddMe;
}

// Only managed actors can be added to Ladder profiles
// Normally, only the ActorClass of your loader (if bIncludeServerActor=True) would be need to be managed
static function array&lt;string&gt; GetManagedActors()
{
	local int i;
	local string A, B, C;
	local array&lt;string&gt; ABC;

	i = -1;
	while (static.AddManagedActor(i++,A,B,C))
		ABC[ABC.Length] = A$&quot;,&quot;$B$&quot;,&quot;$C;

	return ABC;
}

// Managed actors will be passed FillPlayInfo() calls
static function bool AddManagedActor(int Idx, out string ActorClassName, out string ActorName, out string ActorDesc)
{
	if (Idx == -1 &amp;&amp; default.bIncludeServerActor)
	{
		ActorClassName = default.ActorClass;
		ActorName = default.FriendlyName;
		ActorDesc = default.ActorDescription;
		return true;
	}

	return false;
}

// Optional hook for version filtering
static function bool MatchesVersion(float ActorVersion, optional bool bExact, optional string NewURL)
{
	local float CurrentVersion;
	local string LogText;

	if (default.RequiredVersion == &quot;&quot;)
		return true;

	CurrentVersion = float(default.RequiredVersion);

	// Return false if loader version is higher than actor version
	// Return false if loader version is lower than actor version and bExact=True
	if ((ActorVersion &lt; CurrentVersion) || (ActorVersion &gt; CurrentVersion &amp;&amp; bExact))
	{
		if (default.VersionWarning != &quot;&quot;)
		{
			LogText = static.ReplaceTag(default.VersionWarning,&quot;%CurVer%&quot;,CurrentVersion);
			LogText = static.ReplaceTag(LogText,&quot;%ReqVer%&quot;,ActorVersion);
			log(LogText);
		}

		if (NewURL != &quot;&quot;)
			log(static.ReplaceTag(default.DownloadMsg,&quot;%URL%&quot;,NewURL));

		return false;
	}

	return true;
}

// To prevent your loader from causing a server crash, add your checks here
// return false to prevent your loader from being loaded

// You only need to override this function if bIncludeServerActor=False in your loader,
// or if you have RequiredIniChanges that reference additional custom packages
static function bool ValidateLoader()
{
	local class&lt;Info&gt;	MyActor;

	if (default.bIncludeServerActor &amp;&amp; default.ActorClass != &quot;&quot;)
	{
		// Specify True for 3rd param in DynamicLoadObject to prevent log spam if MyActor isn't on server
		MyActor = class&lt;Info&gt;(DynamicLoadObject(default.ActorClass,class'Class',True));
		if (MyActor == None)
			return false;
	}

	return true;
}

// Hook for loader to cancel external removal request, or effect any specialized ini changes to make before removal
function bool AcceptRemoval(optional array&lt;Property&gt; Props)
{
	if (Props.Length &gt; 0)
		Properties = Props;

	RemoveMe();
	return true;
}

// should be subclassed
// always use &quot;return !bEnableMyLoader;&quot;
// see LadderLoader.LadderLoader or TeamBalanceLoader.BalanceLoader for examples
function bool WantsToBeDisabled()
{
	return false;
}

// called for each RequiredIniEntry
// return true to apply the RequiredIniEntry.PropValue
function bool ObjectNeedsUpdate(Object O, string PropName, string PropValue)
{
	local string Temp;

	Temp = O.GetPropertyText(PropName);
	if ( InStr(Caps(Temp),Caps(PropValue)) &lt; 0 )
		return true;

	return false;
}

// notification of pending update - return false to skip update for loader
function bool ApplyUpdate()
{
	if (DEBUG) log(class@&quot;Returning&quot;@IsActive(),'ApplyUpdate');
	return IsActive();
}

// return -1 if want to simply add entry
// return index of array entry if want to overwrite
function int CheckArrayEntry(string PropName, array&lt;string&gt; PropArray)
{
	return -1;
}

// To maintain consistency, always add to &quot;Server Actors&quot; page
// static function FillPlayInfo(PlayInfo PI)
// {
// 		Super.FillPlayInfo(PI);
//		PI.AddSetting(&quot;ServerActors&quot;,....
// }
//
//###################################################################
//###################################################################
//
//	Public Final Methods
//	These are used to operate the internal mechanisms of the auto loader system.
//
//

// Called by ConfigMaster when Level.ServerTravel is called

// Removes loader if WantsToBeDisabled() returns True
// Applies value for RequiredIniProperties if ObjectNeedsUpdate returns true
final function UpdateConfiguration(array&lt;Property&gt; Props)
{
	local Object 			O;
	local Property			P;

	local string 			N,V;
	local int 				i, j;

	local array&lt;string&gt;		Arr;
	local string			ArrS;

	if (DEBUG)
		log(&quot;Update configuration in&quot;@class,'UpdateConfiguration');

	ResetConfig();
	Properties = Props;

	if (WantsToBeDisabled())
	{
		RemoveMe();
		return;
	}

	if (bIncludeServerActor &amp;&amp; ActorClass != &quot;&quot;)
	{
		O = GetObjectOfClass(class'Engine.GameEngine');
		if (O != None)
		{
			if (ObjectNeedsUpdate(O, &quot;ServerActors&quot;, ActorClass))
			{
				ArrS = O.GetPropertyText(&quot;ServerActors&quot;);
				if (ArrS != &quot;&quot;)
					Arr = GenerateArray(ArrS);

				j = -1;
				if (Arr.Length &gt; 0)
					j = CheckArrayEntry(&quot;ServerActors&quot;, Arr);

				if (j &lt; 0)
					O.SetPropertyText(&quot;ServerActors&quot;,AddDynArrayMember(O,&quot;ServerActors&quot;,ActorClass));

				else O.SetPropertyText(&quot;ServerActors&quot;,InsertArrayMember(O, &quot;ServerActors&quot;, ActorClass, j));
				O.SaveConfig();
			}
		}
	}

	for (i = 0;i&lt;RequiredIniEntries.Length;i++)
	{
		O = GetObjectForEntry(RequiredIniEntries[i]);
		if (O == None) continue;

		if (!ObjectNeedsUpdate(O, RequiredIniEntries[i].PropName, RequiredIniEntries[i].PropValue)) continue;

		N = RequiredIniEntries[i].PropName;
		V = RequiredIniEntries[i].PropValue;
		P = GetProperty(O, N);
		if (DEBUG)
			log(class@&quot;got property&quot;@p,'UpdateConfiguration');

		if (P == None) continue;

		j = -1;

		if (PropIsArray(P))
		{
			ArrS = O.GetPropertyText(N);
			if (ArrS != &quot;&quot;)
				Arr = GenerateArray(ArrS);

			if (Arr.Length &gt; 0)
				j = CheckArrayEntry(N, Arr);

			if (j &lt; 0)
				O.SetPropertyText(N,AddDynArrayMember(O,N,V));

			else O.SetPropertyText(N,InsertArrayMember(O, N, V, j));
		}

		else
		{
			StoreDefaultValue(O, N);
			O.SetPropertyText(N,V);
		}

		O.SaveConfig();
	}
}

// Regarding OriginalValues
final function StoreDefaultValue(Object O, string PropName)
{
	local int i, idx;
	local IniEntry NewDefault;
	local string CurrentValue, Quote;
	local array&lt;string&gt; Ar;

	if (DEBUG)
		log(class@&quot;storing default&quot;@o@propname,'StoreDefaultValue');

	for (i = 0; i &lt; ConfigMaster(Owner).OriginalValues.Length; i++)
		if (ConfigMaster(Owner).OriginalValues[i].ClassFrom == string(O.Class) &amp;&amp; ConfigMaster(Owner).OriginalValues[i].PropName == PropName)
			return;

	NewDefault.ClassFrom = string(O.Class);
	// Check if this property name is a single array member
	i = -1; idx = -1;
	i = InStr(PropName, &quot;§&quot;);
	if (i != -1)
	{
		idx = int(Left(PropName, i));
		PropName = Mid(PropName, i + 1);
		CurrentValue = O.GetPropertyText(PropName);
		Ar = GenerateArray(CurrentValue);
		CurrentValue = Ar[idx];

		// Remove literal string wrapper
		if (Left(CurrentValue,1) == &quot;\&quot;&quot;)
		{
			CurrentValue = Mid(CurrentValue,1,Len(CurrentValue) - 2);
			Quote = &quot;¶&quot;;
		}
		CurrentValue = idx $ &quot;§&quot; $ CurrentValue $ Quote;
	}

	else CurrentValue = O.GetPropertyText(PropName);

	NewDefault.PropName = PropName;
	NewDefault.PropValue = CurrentValue;
	if (DEBUG)
		log(class@&quot;old value:&quot;@NewDefault.PropValue,'StoreDefaultValue');

	ConfigMaster(Owner).OriginalValues[ConfigMaster(Owner).OriginalValues.Length] = NewDefault;
	ConfigMaster(Owner).SaveConfig();
}

final function bool RestoreOriginalValue(Object O, string PropName)
{
	local int i, j, idx;
	local string CurrentValue, StoredValue;
	local array&lt;string&gt; Ar;

	for (i = 0; i &lt; ConfigMaster(Owner).OriginalValues.Length; i++)
	{
		if (ConfigMaster(Owner).OriginalValues[i].ClassFrom ~= string(O.Class) &amp;&amp; ConfigMaster(Owner).OriginalValues[i].PropName ~= PropName)
		{
			StoredValue = ConfigMaster(Owner).OriginalValues[i].PropValue;
			// First check if this was a single array member
			j = InStr(StoredValue, &quot;§&quot;);
			if (j != -1)
			{
				idx = int(Left(StoredValue, j));
				StoredValue = Mid(StoredValue, j + 1);
				if (Right(StoredValue, 1) == &quot;¶&quot;)
				{
					StoredValue = Left(StoredValue, Len(StoredValue) - 1);
					StoredValue = &quot;\&quot;&quot; $ StoredValue $ &quot;\&quot;&quot;;
				}
				CurrentValue = O.GetPropertyText(PropName);
				Ar = GenerateArray(CurrentValue);
				Ar[idx] = StoredValue;
				StoredValue = &quot;(&quot; $ Join(Ar,&quot;,&quot;,True) $&quot;)&quot;;
			}

			if (DEBUG)
				log(class@&quot;Assigning&quot;@StoredValue@&quot;to property&quot;@string(O.Class)$&quot;.&quot;$PropName,'RestoreOriginalValue');
			O.SetPropertyText(PropName, StoredValue);
			O.SaveConfig();
			break;
		}
	}

	if (i &lt; ConfigMaster(Owner).OriginalValues.Length)
	{
		ConfigMaster(Owner).OriginalValues.Remove(i, 1);
		ConfigMaster(Owner).SaveConfig();
		return true;
	}

	return false;
}

//###################################################################
//###################################################################
//
//	Internal Methods
//	These are used to control the internal operation of the loader itself.
//	These methods may only be called by other methods within the loader.
//

protected final function RemoveMe()
{
	local int i;
	local Object O;
	local Property P;

	if (DEBUG)
		log(class@&quot;being removed.&quot;,'RemoveMe');

	if (bIncludeServerActor &amp;&amp; ActorClass != &quot;&quot;)
	{
		O = GetObjectOfClass(class'Engine.GameEngine');
		if (O != None)
			RemoveArrayEntry(O, &quot;ServerActors&quot;, ActorClass);
	}

	for (i = 0; i &lt; RequiredIniEntries.Length; i++)
	{
		O = GetObjectForEntry(RequiredIniEntries[i]);
		if (O == None) continue;

		P = GetProperty(O,RequiredIniEntries[i].PropName);
		if (P != None &amp;&amp; PropIsArray(P))
			RemoveArrayEntry(O,RequiredIniEntries[i].PropName,RequiredIniEntries[i].PropValue);

		else RestoreOriginalValue(O, RequiredIniEntries[i].PropName);
	}

	DisableLoader();
}

protected final function string InsertArrayMember(Object Obj, string PropName, string NewValue, int Pos)
{
	local string CurValue, Quote, Tmp;
	local array&lt;string&gt;	Members;
	local bool bStatic;

	if (Obj == None)
	{
		Warn(&quot;Object is None&quot;);
		return &quot;&quot;;
	}

	CurValue = Obj.GetPropertyText(PropName);
	Members = GenerateArray(CurValue);

	if (DEBUG)
	{
		log(class$&quot;:Inserting new member at position&quot;@Pos@&quot;to&quot;@Obj$&quot;.&quot;$PropName$&quot;:&quot;@NewValue,'InsertArrayMember');
		log(class$&quot;:Current Value:&quot;$CurValue,'InsertArrayMember');
	}

// Check for literal string
	if (InStr(Caps(CurValue), Caps(NewValue)) &lt; 0 &amp;&amp; Members.Length &gt; 0)
	{
		bStatic = Left(Members[pos], Len(PropName) + 1) ~= (PropName $ &quot;[&quot;);
		Tmp = StringIf(bStatic, Mid(Members[pos],InStr(Members[pos],&quot;=&quot;) + 1), Members[0]);
		Quote = StringIf(Left(Tmp,1) == &quot;\&quot;&quot; &amp;&amp; Left(NewValue,1) != &quot;\&quot;&quot;,&quot;\&quot;&quot;,&quot;&quot;);

		NewValue = StringIf(bStatic, PropName $ &quot;=&quot; $ Quote $ NewValue $ Quote, Quote $ NewValue $ Quote);
		if (DEBUG)
			log(InStr(Caps(CurValue),Caps(NewValue))@InStr(Caps(CurValue),Caps(NewValue))&lt;0@Caps(CurValue)@&quot;||&quot;@Caps(NewValue),'AddDynArrayMember');

		if (NewValue != &quot;&quot; &amp;&amp; Pos &gt; -1)
		{
			StoreDefaultValue(Obj, Pos$&quot;§&quot;$PropName);
			Members[Pos] = NewValue;
		}

		CurValue = &quot;(&quot; $ Join(Members,&quot;,&quot;,True) $ &quot;)&quot;;
	}

	if (DEBUG)
	{
		log(class@&quot;Returning:&quot;$CurValue,'InsertArrayMember');
		log(class@&quot;&quot;,'InsertArrayMember');
	}

	return CurValue;
}

// Currently, UT2003 does not support setting static arrays through the use of SetPropertyText
protected final function string AddStaticArrayMember(Object Obj, string PropName, string NewValue)
{
	local int i;
	local array&lt;string&gt;	Members;
	local string Quote, TempValue, CurValue;

	if (Obj == None)
	{
		Warn(&quot;Object was None for property&quot;@PropName);
		return &quot;&quot;;
	}

	CurValue = Obj.GetPropertyText(PropName);
	Members = GenerateArray(CurValue);

	if (InStr(Caps(CurValue), Caps(NewValue)) &lt; 0)
	{
		if (Members.Length &gt; 0)
		{
			TempValue = Mid(Members[0],InStr(Members[0],&quot;=&quot;)+1);

			// Check for literal string
			Quote = StringIf(Left(TempValue,1) == &quot;\&quot;&quot; &amp;&amp; Left(NewValue,1) != &quot;\&quot;&quot;, &quot;\&quot;&quot;, &quot;&quot;);
			for (i = 0; i &lt; Members.Length; i++)
			{
				if (Members[i] == &quot;&quot;)
				{
					Members[i] = PropName $ &quot;[&quot; $ i $ &quot;]=&quot; $ Quote $ NewValue $ Quote;
					break;
				}
			}
			CurValue = &quot;(&quot; $ Join(Members,&quot;,&quot;) $&quot;)&quot;;
		}

		else CurValue = &quot;(&quot; $ PropName $ &quot;[0]=&quot; $ NewValue $ &quot;)&quot;;
	}

	return CurValue;
}

protected final function string AddDynArrayMember(Object Obj, string PropName, string NewValue)
{
	local string CurValue, Quote;
	local array&lt;string&gt;	Members;

	if (Obj == None)
	{
		Warn(&quot;Object is None&quot;);
		return &quot;&quot;;
	}

	CurValue = Obj.GetPropertyText(PropName);
	Members = GenerateArray(CurValue);
	if (DEBUG)
	{
		log(class$&quot;:Adding new member to&quot;@Obj$&quot;.&quot;$PropName$&quot;:&quot;@NewValue,'AddDynArrayMember');
		log(class$&quot;:Current Value:&quot;$CurValue,'AddDynArrayMember');
	}

// Check for literal string
	if (InStr(Caps(CurValue), Caps(NewValue)) &lt; 0)
	{
		if (Members.Length &gt; 0)
		{
			if (DEBUG)
				log(InStr(Caps(CurValue),Caps(NewValue))@InStr(Caps(CurValue),Caps(NewValue))&lt;0@Caps(CurValue)@&quot;||&quot;@Caps(NewValue),'AddDynArrayMember');

			Quote = StringIf(Left(Members[0],1) == &quot;\&quot;&quot; &amp;&amp; Left(NewValue,1) != &quot;\&quot;&quot;, &quot;\&quot;&quot;, &quot;&quot;);
			Members[Members.Length] = Quote $ NewValue $ Quote;
			CurValue = &quot;(&quot; $ Join(Members,&quot;,&quot;,True) $ &quot;)&quot;;
		}
		else CurValue = &quot;(&quot; $ NewValue $ &quot;)&quot;;
	}

	if (DEBUG)
	{
		log(class@&quot;Returning:&quot;$CurValue,'AddDynArrayMember');
		log(class@&quot;&quot;,'AddDynArrayMember');
	}

	return CurValue;
}

// UT2003 currently does not support setting the value of static arrays
protected final function RemoveArrayEntry(Object O, string PropName, string PropValue)
{
	local int i, j;
	local array&lt;string&gt; Members;
	local string ArrayString, Quote, Tmp;
	local bool bStatic;

	if (O == None)
	{
		Warn(&quot;Object was none for property&quot;@PropName);
		return;
	}

	ArrayString = O.GetPropertyText(PropName);
	if (ArrayString == &quot;&quot;)
	{
		Warn(&quot;Property was not found:&quot;@PropName);
		return;
	}

	if (DEBUG)
	{
		log(class$&quot;: Removing array member&quot;@string(O.Class)$&quot;.&quot;$PropName$&quot;:&quot;$ArrayString,'RemoveArrayEntry');
		log(class$&quot;: Member to be removed:&quot;$PropValue,'RemoveArrayEntry');
	}

	Members = GenerateArray(ArrayString);
	bStatic = Left(Members[0], Len(PropName) + 1) ~= (PropName $ &quot;[&quot;);
	Tmp = StringIf(bStatic, Mid(Members[0],InStr(Members[0],&quot;=&quot;) + 1), Members[0]);
	Quote = StringIf(Left(Tmp,1) == &quot;\&quot;&quot; &amp;&amp; Left(PropValue,1) != &quot;\&quot;&quot;,&quot;\&quot;&quot;,&quot;&quot;);

	PropValue = StringIf(bStatic, PropName $ &quot;=&quot; $ Quote $ PropValue $ Quote, Quote $ PropValue $ Quote);
	for (i = 0; i &lt; Members.Length; i++)
	{
		if (DEBUG)
			log(class@&quot;Comparing&quot;@i@PropValue@&quot;to&quot;@Members[i],'RemoveArrayEntry');

		if (Members[i] ~= PropValue)
			break;
	}

	if (i &lt; Members.Length)
	{
		if (DEBUG) log(class@&quot;Removing array member&quot;@i$&quot;:&quot;$Members[i],'RemoveArrayEntry');

		// Check if we should restore a previous value
		for (j = 0; j &lt; ConfigMaster(Owner).OriginalValues.Length; j++)
		{
			if (DEBUG)
			{
				log(class@&quot;Checking Backup Value&quot;@j@&quot;class:&quot;$ConfigMaster(Owner).OriginalValues[j].ClassFrom@&quot;against&quot;@string(O.Class),'RemoveArrayEntry');
				log(class@&quot;Checking Backup Value&quot;@j@&quot;Property:&quot;$ConfigMaster(Owner).OriginalValues[j].PropName@&quot;against&quot;@PropName,'RemoveArrayEntry');
			}

			if (ConfigMaster(Owner).OriginalValues[j].ClassFrom ~= string(O.Class) &amp;&amp;
				ConfigMaster(Owner).OriginalValues[j].PropName ~= PropName )
			{
				RestoreOriginalValue(O, PropName);
				break;
			}
		}

		if (j &lt; ConfigMaster(Owner).OriginalValues.Length)
			return;

		Members.Remove(i,1);
	}

	else return;

	PropValue = &quot;(&quot; $ Join(Members,&quot;,&quot;) $ &quot;)&quot;;
	if (DEBUG)
		log(class@&quot;Assigning&quot;@PropValue@&quot;to property&quot;@string(O.Class)$&quot;.&quot;$PropName,'RemoveArrayEntry');
	O.SetPropertyText(PropName,PropValue);
	O.SaveConfig();
	if (DEBUG)
		log(class@&quot;Returning&quot;@O.GetPropertyText(PropName),'RemoveArrayEntry');
}

// Just a function to handle safe object creation
protected final function Object GetObjectForEntry(IniEntry ThisEntry)
{
	local Object O;
	local class&lt;Object&gt; OClass;

	if (DEBUG)
		log(class@&quot;Getting&quot;@ThisEntry.ClassFrom@ThisEntry.PropName@ThisEntry.PropValue,'GetObjectForEntry');

	OClass = class&lt;Object&gt;(DynamicLoadObject(ThisEntry.ClassFrom,class'Class'));
	if (OClass == None)
	{
		Warn(&quot;Could not load class&quot;@ThisEntry.ClassFrom);
		return None;
	}

	O = GetObjectOfClass(OClass);
	if (O == None)
		Warn(&quot;Unable to access object for class&quot;@OClass);

	return O;
}

protected final function Object GetObjectOfClass(class&lt;Object&gt; ObjClass)
{
	local Object Obj;
	local Actor A;

	if (DEBUG)
		log(class@&quot;Finding&quot;@ObjClass,'GetObjectOfClass');

	// Check for GameEngine
	if (ObjClass == class'GameEngine')
		return GE;

	// First try the easy way
	foreach AllObjects(ObjClass,Obj)
		return Obj;

	// Object may not be loaded right now, so attempt to load it
	// If actor, spawn it
	if (ClassIsChildOf(ObjClass,class'Actor'))
	{
		A = Spawn(class&lt;Actor&gt;(ObjClass));
		A.GoToState('');
		return A;
	}

	// if object, new it
	Obj = new(None) ObjClass;

	// might be property
	if (Obj == None)
		Obj = new(Class) ObjClass;

	// Don't know if this will even work ?
	if (Obj == None)
		Obj = New(ObjClass.default.Outer) ObjClass;

	if (DEBUG)
	{
		log(class@&quot;Could not create new object&quot;@ObjClass,'GetObjectOfClass');
		log(class@ObjClass@&quot;outer is&quot;@ObjClass.default.Outer,'GetObjectOfClass');
		log(class@&quot;&quot;,'GetObjectOfClass');
	}

	return Obj;
}

protected final function Property GetProperty(Object O, string PropName)
{
	local int i;
	local Class ClassOuter;
	local bool classexact, classchild, propn, seenclass;

	for (i=0;i&lt;Properties.Length;i++)
	{
		seenclass = Class(Properties[i].Outer) == ClassOuter;

		ClassOuter = Class(Properties[i].Outer);
		if (DEBUGPROPS)
		{
			if (ClassOuter == None)
			{
				log(class@&quot;Property Outer is not a class!&quot;,'GetProperty');
				continue;
			}

			if (!seenclass)
			{
				log(class@&quot;Compare Obj Class&quot;@O.Class@&quot;to&quot;@Properties[i].Outer,'GetProperty');
				if (O.Class==Properties[i].Outer)
					classexact = true;
			}

			if (!classchild &amp;&amp; ClassIsChildOf(O.Class,ClassOuter))
			{
				log(class@&quot;Obj class&quot;@O.Class@&quot;is child of&quot;@ClassOuter,'GetProperty');
				classchild = true;
			}

			else if (!classchild &amp;&amp; ClassIsChildOf(ClassOuter,O.Class))
			{
				log(class@&quot;Obj class&quot;@O.Class@&quot;is parent of&quot;@ClassOuter,'GetProperty');
				classchild = true;
			}

			if (!propn &amp;&amp; classexact)
			{
				log(class@&quot;Compare Name&quot;@PropName@&quot;to&quot;@Properties[i].Name,'GetProperty');
				if (PropName == string(Properties[i].Name))
					propn = true;
			}
		}

		if ((ClassIsChildOf(O.Class,ClassOuter)||O.Class == Properties[i].Outer||ClassIsChildOf(ClassOuter,O.Class)) &amp;&amp; string(Properties[i].Name) == PropName)
		{
			if (DEBUG)
			{
				log(class@&quot;Returning Property&quot;@Properties[i],'GetProperty');
				log(class@&quot;&quot;,'GetProperty');
			}

			return Properties[i];
		}
	}

	return None;
}

protected final function bool PropIsArray(Property P)
{
	if (DEBUG)
		log(class@&quot;Checking Property&quot;@P.Outer$&quot;.&quot;$P.Name$&quot;:&quot;@P.Class,'PropIsArray');
	return P.Class == class'ArrayProperty';
}

protected static final function array&lt;string&gt; GenerateArray(string ArrayString)
{
	local array&lt;string&gt;	Members;
	local int i;
	local string S;

	if (ArrayString != &quot;&quot;)
	{
		// Remove the array wrapper ( )
		ArrayString = Mid(ArrayString,1,Len(ArrayString)-2);

		// If string contains internal containers, then have to split differently
		if (Left(ArrayString,1) == &quot;(&quot;)
		{
			do {
				do {
					if (Left(ArrayString,1) == &quot;)&quot;)
						i--;
					else if (Left(ArrayString,1) == &quot;(&quot;)
						i++;
					Eat(S, ArrayString, 1);
				} until (i == 0);

				Members[Members.Length] = S;
				S = &quot;&quot;;
				if (ArrayString != &quot;&quot; &amp;&amp; Left(ArrayString,1) == &quot;,&quot;)
					ArrayString = Mid(ArrayString,1);
			} until (ArrayString == &quot;&quot;);
		}

		else Split2(ArrayString,&quot;,&quot;,Members);
	}

	return Members;
}

protected static final function bool NotInPlayInfo(PlayInfo PI, class&lt;Info&gt; NewInfo)
{
	local int i;
	if (PI == None)
	{
		Warn(&quot;Invalid PlayInfo Object!&quot;);
		return false;
	}

	for (i=0;i&lt;PI.InfoClasses.Length;i++)
	{
		if (PI.InfoClasses[i] == NewInfo)
			return false;
	}

	return true;
}


//###################################################################
//###################################################################
//
//	Utility Methods
//	These are used perform various tedious operations.
//
// Moves Num elements from Source to Dest
static final function Eat(out string Dest, out string Source, int Num)
{
	Dest = Dest $ Left(Source, Num);
	Source = Mid(Source, Num);
}

static final function string StringIf(bool Condition, string IfTrue, string IfFalse)
{
	if (Condition) return IfTrue;
	return IfFalse;
}

// Based on AccessControlIni &amp; Object.ReplaceText()
static final function string ReplaceTag(string from, string tag, coerce string with)
{
	local int i;
	local string t;

	// InStr() is case-sensitive
	i = InStr(Caps(from), Caps(tag));
	while (i != -1)
	{
		t = t $ Left(from,i) $ with;
		from = mid(from,i+len(tag));
		i = InStr(Caps(from), Caps(tag));
	}

	t = t $ from;
	return t;
}

// Following functions from wUtils103 by El_Muerte[TDS]
// Included by permission (copied to avoid package dependancy)

// Shifts an element off a string
// example (delim = ' '): 'this is a string' -&gt; 'is a string'
// if quotechar = &quot; : '&quot;this is&quot; a string' -&gt; 'a string'
static final function string StrShift(out string line, string delim, optional string quotechar)
{
    local int delimpos, quotepos;
    local string result;

    if ( quotechar != &quot;&quot; &amp;&amp; Left(line, Len(quotechar)) == quotechar ) {
        do {
            quotepos = InstrFrom(line, quotechar, quotepos + 1);
        } until (quotepos == -1 || quotepos + Len(quotechar) == Len(line)
                || Mid(line, quotepos + len(quotechar), len(delim)) == delim);
    }
    if ( quotepos != -1 ) {
        delimpos = InstrFrom(line, delim, quotepos);
    }
    else {
        delimpos = Instr(line, delim);
    }

    if (delimpos == -1)
    {
        result = line;
        line = &quot;&quot;;
    }
    else {
        result = Left(line,delimpos);
        line = Mid(line,delimpos+len(delim));
    }
    if ( quotechar != &quot;&quot; &amp;&amp; Left(result, Len(quotechar)) == quotechar ) {
      result = Mid(result, Len(quotechar), Len(result)-(Len(quotechar)*2));
    }
    return result;
}

// Join the elements of a string array to an array
static final function string Join(array&lt; string &gt; ar, optional string delim, optional bool bIgnoreEmpty)
{
  local string result;
  local int i;
  for (i = 0; i &lt; ar.length; i++)
  {
    if (bIgnoreEmpty &amp;&amp; ar[i] == &quot;&quot;) continue;
    if (result != &quot;&quot;) result = result$delim;
    result = result$ar[i];
  }

  return result;
}

// Fixed split method
// no problems when it starts with a delim
// no problems with ending spaces
// delim can be a string
static final function int Split2(coerce string src, string delim, out array&lt;string&gt; parts, optional bool ignoreEmpty, optional string quotechar)
{
  local string temp;
  Parts.Remove(0, Parts.Length);
  if (delim == &quot;&quot; || Src == &quot;&quot; ) return 0;
  while (src != &quot;&quot;)
  {
    temp = StrShift(src, delim, quotechar);
    if (temp == &quot;&quot;)
    {
      if (!ignoreEmpty)
      {
        parts.length = parts.length+1;
        parts[parts.length-1] = temp;
      }
    }
    else {
      parts.length = parts.length+1;
      parts[parts.length-1] = temp;
    }
  }
  return parts.length;
}

// InStr starting from an offset
static final function int InStrFrom(coerce string StrText, coerce string StrPart, optional int OffsetStart)
{
  local int OffsetPart;

  OffsetPart = InStr(Mid(StrText, OffsetStart), StrPart);
  if (OffsetPart &gt;= 0)
    OffsetPart += OffsetStart;
  return OffsetPart;
}
&lt;/uscript&gt;

----

'''Wormbo:''' Hmm, a little documentation instead of the source code wouldn't hurt. E.g. how can you use this to enable/disable a server actor?

'''El Muerte TDS:''' like this: [http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/ChatFilterLoader/Classes/ChatFilterLoader.uc?rev=1.7&amp;content-type=text/x-cvsweb-markup ChatFilter AutoLoader], maybe write a [/example] based on it... first lunch

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AutoLoader/Example</title>
    <id>426</id>
    <revision>
      <id>1434</id>
      <timestamp>2003-06-05T10:12:57Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an example based on the [[Legacy:AutoLoader|AutoLoader]] for ChatFilter

&lt;uscript&gt;
class ChatFilterLoader extends AutoLoader;

var config bool bEnabled;
&lt;/uscript&gt;

We use this variable to give the user the ability to enable or disable the server actor from within the WebAdmin. This is just a forward variable, you have to do the check enabled state during the init of your server actor.

&lt;uscript&gt;
event PreBeginPlay()
{
  class'ChatFilter'.default.bEnabled = bEnabled;
  Super.PreBeginPlay();
}
&lt;/uscript&gt;

Here is where we set the real enabled flag of the server actor. Ofcourse this has effect on the next map.

&lt;uscript&gt;
static function bool IsActive()
{
  return true;
}
&lt;/uscript&gt;

This loader is always active.

&lt;uscript&gt;
static function bool EnableLoader(optional string SpecialActor)
{
  default.bEnabled = True;
  return true;
}

static function bool DisableLoader(optional string SpecialActor)
{
  default.bEnabled = False;
  return true;
}
&lt;/uscript&gt;

These are used to toggle the enable status of the server actor, if you don't use an enabled option like I did you can just ignore these. Always return true, unless something failed when setting the enabled status, for example when it requires an other server actor to be active too.

&lt;uscript&gt;
function bool ApplyUpdate()
{
  return default.bEnabled;
}
&lt;/uscript&gt;

Since we always have to change things in the configuration for this ServerActor we always want to apply an update when it's active.

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PI)
{
  Super.FillPlayInfo(PI);
  PI.AddSetting(&quot;Server Actors&quot;, &quot;bEnabled&quot;, &quot;Chat Filter&quot;, 10, 255, &quot;Check&quot;);
}
&lt;/uscript&gt;

Add a setting to the default -&gt; server actors page on the WebAdmin to enable/disable this server actor.

&lt;uscript&gt;
function bool ObjectNeedsUpdate(Object O, string PropName, string PropValue)
{
  if (Caps(PropName) == &quot;SERVERPACKAGES&quot;)
  {
    if (!class'ChatFilter'.default.bCheckNicknames &amp;&amp; !class'ChatFilter'.default.bFriendlyMessage &amp;&amp; !Super.ObjectNeedsUpdate(O, PropName, PropValue))
    {
      RemoveArrayEntry(O, PropName, PropValue);
      return false;
    }
  }
  return Super.ObjectNeedsUpdate(O, PropName, PropValue);
}
&lt;/uscript&gt;

ChatFilter requires a ServerPackage for some settings, here we check if it's required to change the value of the ServerPackages. 

&lt;uscript&gt;
function int CheckArrayEntry(string PropName, array&lt;string&gt; PropArray)
{
  local int i;
  if (Caps(PropName) == &quot;SERVERPACKAGES&quot;)
  {
    for (i = 0; i &lt; PropArray.Length; i++)
    {
      if (Caps(PropArray[i]) == &quot;\&quot;CHATFILTERMSG\&quot;&quot;)
      {
        return i;
      }
      if (Caps(PropArray[i]) == &quot;\&quot;CHATFILTERMSG151\&quot;&quot;)
      {
        return i;
      }
      if (Caps(PropArray[i]) == &quot;\&quot;CHATFILTERMSG152\&quot;&quot;)
      {
        return i;
      }
    }
  }
  return -1;
}
&lt;/uscript&gt;

ChatFilter had some updates to the server package a couple of time. Because we don't want the old serverpackages still in the list (because we don't need them anyway), we have to remove them. The above routine checks the server actors list for packages with our name (note the double quotes).

Return the index of the entry to want removed from the ini file. Or -1 if you don't want anything removed.

&lt;uscript&gt;
defaultproperties
{
  bEnabled=true
  bIncludeServerActor=True
  ActorClass=&quot;ChatFilter.ChatFilter&quot;
  FriendlyName=&quot;ChatFilter&quot;
  ActorDescription=&quot;Filter chats on the server&quot;
  RequiredIniEntries(0)=(ClassFrom=&quot;Engine.GameEngine&quot;,PropName=&quot;ServerPackages&quot;,PropValue=&quot;ChatFilterMsg154&quot;)
}
&lt;/uscript&gt;

This is the real magic of the AutoLoader, usualy you only have to use this part to write an AutoLoader.
; bIncludeServerActor : setting this to true will add the ActorClass to the ServerActors list
; ActorClass : the class name of the ServerActor that this AutoLoader is for
; FriendlyName : the friendly name to be used
; ActorDescription : an description for the ServerActor
; RequiredIniEntries(0) : This is an dynamic array containing addition changes to the ini file. These entries will automatically be added/removed when the AutoLoader is enabled/disabled.

==.int file ==

To make this all work you have to create a .int file with the following content

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=ConfigManager.AutoLoader,Name=ChatFilterLoader.ChatFilterLoader,Description=&quot;Filter chats on the server&quot;)
&lt;/uscript&gt;

Now where the server restarts this new loader will be found.</text>
    </revision>
    <revision>
      <id>1435</id>
      <timestamp>2003-06-05T10:11:55Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an example based on the [[Legacy:AutoLoader|AutoLoader]] for ChatFilter

&lt;uscript&gt;
class ChatFilterLoader extends AutoLoader;

var config bool bEnabled;
&lt;/uscript&gt;

We use this variable to give the user the ability to enable or disable the server actor from within the WebAdmin. This is just a forward variable, you have to do the check enabled state during the init of your server actor.

&lt;uscript&gt;
event PreBeginPlay()
{
  class'ChatFilter'.default.bEnabled = bEnabled;
  Super.PreBeginPlay();
}
&lt;/uscript&gt;

Here is where we set the real enabled flag of the server actor. Ofcourse this has effect on the next map.

&lt;uscript&gt;
static function bool IsActive()
{
  return true;
}
&lt;/uscript&gt;

This loader is always active.

&lt;uscript&gt;
static function bool EnableLoader(optional string SpecialActor)
{
  default.bEnabled = True;
  return true;
}

static function bool DisableLoader(optional string SpecialActor)
{
  default.bEnabled = False;
  return true;
}
&lt;/uscript&gt;

These are used to toggle the enable status of the server actor, if you don't use an enabled option like I did you can just ignore these. Always return true, unless something failed when setting the enabled status, for example when it requires an other server actor to be active too.

&lt;uscript&gt;
function bool ApplyUpdate()
{
  return default.bEnabled;
}
&lt;/uscript&gt;

Since we always have to change things in the configuration for this ServerActor we always want to apply an update when it's active.

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PI)
{
  Super.FillPlayInfo(PI);
  PI.AddSetting(&quot;Server Actors&quot;, &quot;bEnabled&quot;, &quot;Chat Filter&quot;, 10, 255, &quot;Check&quot;);
}
&lt;/uscript&gt;

Add a setting to the default -&gt; server actors page on the WebAdmin to enable/disable this server actor.

&lt;uscript&gt;
function bool ObjectNeedsUpdate(Object O, string PropName, string PropValue)
{
  if (Caps(PropName) == &quot;SERVERPACKAGES&quot;)
  {
    if (!class'ChatFilter'.default.bCheckNicknames &amp;&amp; !class'ChatFilter'.default.bFriendlyMessage &amp;&amp; !Super.ObjectNeedsUpdate(O, PropName, PropValue))
    {
      RemoveArrayEntry(O, PropName, PropValue);
      return false;
    }
  }
  return Super.ObjectNeedsUpdate(O, PropName, PropValue);
}
&lt;/uscript&gt;

ChatFilter requires a ServerPackage for some settings, here we check if it's required to change the value of the ServerPackages. 

&lt;uscript&gt;
function int CheckArrayEntry(string PropName, array&lt;string&gt; PropArray)
{
  local int i;
  if (Caps(PropName) == &quot;SERVERPACKAGES&quot;)
  {
    for (i = 0; i &lt; PropArray.Length; i++)
    {
      if (Caps(PropArray[i]) == &quot;\&quot;CHATFILTERMSG\&quot;&quot;)
      {
        return i;
      }
      if (Caps(PropArray[i]) == &quot;\&quot;CHATFILTERMSG151\&quot;&quot;)
      {
        return i;
      }
      if (Caps(PropArray[i]) == &quot;\&quot;CHATFILTERMSG152\&quot;&quot;)
      {
        return i;
      }
    }
  }
  return -1;
}
&lt;/uscript&gt;

ChatFilter had some updates to the server package a couple of time. Because we don't want the old serverpackages still in the list (because we don't need them anyway), we have to remove them. The above routine checks the server actors list for packages with our name (note the double quotes).

&lt;uscript&gt;
defaultproperties
{
  bEnabled=true
  bIncludeServerActor=True
  ActorClass=&quot;ChatFilter.ChatFilter&quot;
  FriendlyName=&quot;ChatFilter&quot;
  ActorDescription=&quot;Filter chats on the server&quot;
  RequiredIniEntries(0)=(ClassFrom=&quot;Engine.GameEngine&quot;,PropName=&quot;ServerPackages&quot;,PropValue=&quot;ChatFilterMsg154&quot;)
}
&lt;/uscript&gt;

This is the real magic of the AutoLoader, usualy you only have to use this part to write an AutoLoader.
; bIncludeServerActor : setting this to true will add the ActorClass to the ServerActors list
; ActorClass : the class name of the ServerActor that this AutoLoader is for
; FriendlyName : the friendly name to be used
; ActorDescription : an description for the ServerActor
; RequiredIniEntries(0) : This is an dynamic array containing addition changes to the ini file. These entries will automatically be added/removed when the AutoLoader is enabled/disabled.

==.int file ==

To make this all work you have to create a .int file with the following content

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=ConfigManager.AutoLoader,Name=ChatFilterLoader.ChatFilterLoader,Description=&quot;Filter chats on the server&quot;)
&lt;/uscript&gt;

Now where the server restarts this new loader will be found.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:AutoMag</title>
    <id>28851</id>
    <revision>
      <id>42778</id>
      <timestamp>2010-03-30T16:18:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Automated Component</title>
    <id>430</id>
    <revision>
      <id>1443</id>
      <timestamp>2004-09-29T10:15:15Z</timestamp>
      <contributor>
        <ip>219-88-205-170.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>one more time now</comment>
      <text xml:space="preserve">The new internal management system for [[Legacy:GUIMultiComponent|GUIMultiComponent]]s enables you to automatically create variables of the desired type, without casting.  It also handles initialization, tab order, and render weight for each automated component.  It involves two new specifiers: one for classes - ''instanced'', and one for properties - ''automated''.

&lt;uscript&gt;
var automated GUIButton FantasticButton;

defaultproperties
{
    Begin Object Class=GUIButton Name=FantaticButtonTemplate
        OnClick=InternalOnClick
        WinWidth=0.06
        WinHeight=0.04
        bBoundToParent=True
        bScaleToParent=True
    End Object

    FantasticButton = FantasticButtonTemplate
}
&lt;/uscript&gt;

'''Instanced''' is a class modifier that was added in UT2004.  It indicates that all objects of this class should be instanced.  For an explanation of what that means, exactly, see [[Legacy:Subobject|Subobject]]. 

'''Automated''' is a variable modifier that was added in UT2004.  This modifier is currently used only in the GUI, and indicates that the object assigned to this variable should be automatically added to the Controls array when the class is initialized.  This auto-assignment is handled by the native function GUIMultiComponent.InitializeControls, which is called from GUIMultiComponent.InitComponent().  InitializeControls() iterates through all properties of the class, and builds a list of object properties (or arrays of object properties) marked automated.  Any objects assigned to an automated object variable are added to the GUIMultiComponent's Controls array.

GUIMultiComponent defines two arrays of GUIComponents - Controls and Components.  

The Controls array contains all GUIComponents defined and initialized in that menu (note: I use &quot;menu&quot;, but this applies to any subclass of [[Legacy:GUIMultiComponent|GUIMultiComponent]], not just [[Legacy:GUIPage|GUIPage]]).  When using automated controls, the controls array will be sorted natively by '''RenderWeight''', a property of [[Legacy:GUIComponent|GUIComponent]].  Any components added to a menu after the menu has already been initialized (via AddComponent() or AppendComponent()) will be inserted into the menu's Controls array according to RenderWeight.  The menu is drawn first, followed by Controls[0], then Controls[1], etc. until controls have been drawn.

The Components array contains all controls on the page that are have bTabStop set to True.  Generally, Components are controls on the page that can accept input, such as buttons, edit boxes, and tabs.  The components array is sorted by '''TabOrder''', a property of [[Legacy:GUIComponent|GUIComponent]].  The Components array will always be automatically managed, regardless of whether you are using automated components or not.  [[Legacy:GUIMultiComponent|GUIMultiComponent]] provides methods for manipulating both the Controls and the Components array.

You cannot use automated components if you have any controls defined in defaultproperties.  InitializeControls() checks if there are any existing members defined for the Controls array in the class's default properties, and if so, simply returns.  If you wish to use automated components in a subclass of another menu which defines its Controls in defaultproperties (UT2003-Style), set bAlwaysAutomate to true in your subclass's defaultproperties.  When InitializeControls() is called, if bAlwaysAutomate is true, it will first empty the Controls array, then proceed to rebuild it using only automated components.  Of course, you could assign Controls in defaultproperties, then set bAlwaysAutomate=True, but there wouldn't really be much point to that... :)

UT2004's GUI uses automated components exclusively, and I'd highly recommend doing the same - it makes managing controls MUCH easier.

===AutoPositioning===

&lt;uscript&gt;
// Auto-positioning - accounts for bBoundToParent &amp; bScaleToParent
native final function AutoPosition(
		array&lt;GUIComponent&gt; Components,
		float LeftBound, float UpperBound, float RightBound, float LowerBound,
		float LeftPad, float UpperPad, float RightPad, float LowerPad,
		optional int NumberOfColumns, optional float ColumnPadding
		);
&lt;/uscript&gt;

GUIComponent.AutoPosition() is a native function that will automatically position an array of GUIComponents within the bounds passed to the function.  It takes eleven parameters.  The first parameter is an array of GUIComponents that will be positioned.  The next four parameters define the bounds of the area that you wish the components to be positions within, and the next four parameters specify the amount of padding to add to each side.  These parameters must be actual screen values, not scaled values (For example, pass in the value of ActualTop(), not WinTop).  The final two parameters are optional, and allows you to break the components into columns.

AutoPosition() first applies the padding values, then divides the length of the passed-in array by the difference between the lower bound and the upper bound to find the component offset.  It adjusts each of the array member's WinWidth, WinLeft values based on the values passed into the function, and adjust each array member's WinTop value based on component offset.  It does NOT modify the WinHeight value of the components.  If the total number of components multiplied by the offset value would be greater than the bounded area, AutoPosition() writes an error to the log, and returns.  AutoPosition() accounts for the bBoundToParent and bScaleToParent values, and internally adjusts the ratios of the components accordingly.

A closely related function is AutoPositionOn().  This function is simply a wrapper for AutoPosition(), by allowing you to specify a component (such as a background image) that you would like to use for positioning, with parameters for padding percentages.

[[Legacy:GUISectionBackground|GUISectionBackground]] was sort of the evolution of AutoPosition &amp; AutoPositionOn().  GUISectionBackground is essentially a background image that auto-positions other components.  [[Legacy:GUISectionBackground|GUISectionBackground]] has modifiable background &amp; header images, and you feed it components to be managed using its ManageComponent() function.

====Multiple instancing====

One of the largest benefits of using AutoPosition() to position your components is that you can very easily take advantage of multiple instancing.  Multiple instancing is where you have one templated subobject definition, but assign multiple variables to it.

&lt;uscript&gt;
	Begin Object class=GUIImage Name=HUDPreviewImage
 		ImageStyle=ISTY_Scaled
 		ImageColor=(R=255,G=255,B=255,A=255)
 		WinHeight=0.5
		RenderWeight=0.51
	End Object
	i_HUDTop=HUDPreviewImage
	i_HUDTopRight=HUDPreviewImage
	i_HUDTopLeft=HUDPreviewImage
	i_HUDMiddleRight=HUDPreviewImage
	i_HUDMiddleLeft=HUDPreviewImage
	i_HUDMiddleRight=HUDPreviewImage
	i_HUDBottomLeft=HUDPreviewImage
	i_HUDBottomRight=HUDPreviewImage
	i_HUDBottom=HUDPreviewImage
&lt;/uscript&gt;

You can then pass these components to AutoPosition() as an array, and they will be automatically positioned for you.  If you need to make changes to the original template image, you'd only need to make this change in one place.  Likewise, if you wanted to add additional components, or remove components, you'd need only to add/remove the assignments in default properties.  No more resizing dozens of components in design mode every time you change one option! :)

===Overriding automated subobject definitions===

----

'''Mychaeel:''' That's a very neat set of new features you're describing here.  :-)  It's just a bit of a pity that it's specific to the GUI classes and not made so generic that all classes could benefit from it &amp;ndash; by allowing the &quot;automated&quot; keyword in any class, introducing an &quot;InitObject&quot; event in [[Legacy:Object|Object]] and defining a native &quot;InitObjects&quot; function in Object instead of InitComponents in [[Legacy:GUIMultiComponent|GUIMultiComponent]].

===Advanced use of Ingame Gui Designer===

Before reading this, you will want to read the mention of the Gui Designer in [[Legacy:GUIController|GUIController]] which allows you to move GUI components around in the menus ingame and play with their properties.

There have been a few additions to the in-game menu authoring system. The most noticable is that when you select a component a properties window (a la UnrealEd) will appear where you can edit the selected component. Obviously you need to be running in windowed mode for this to happen.

[[Image:Legacy_gui_editor_screen1.jpeg|]]

When you declare a variable as automated it will show up in the last category on this menu. If you expand the automated variable you will have two options as usual with adding new elements in the editor. You can select a previously created button or you can go down one and click New. Here it will give you a list of classes that you can put into your automated variable. For example, if you declare an automated GUIButton then the list of possible classes that variable can be include GUIButton, GUIComboButton, GUIEditBox. Once created you can set all of it's attributes of size and appearance. If you then hit CTRL+X while you have the top level menu selected it will export the Object definitions for '''ALL''' your automated variables. You could then just copy and paste it into the default properties. (It turns out to not be that easy)

Here's where I'm a little confused about what they intended. The controls do not actaully instantiate on the menu and you can't visually manipulate them unless you add them to the Controls array in the editor window. I thought one of the advantages of an automated variable is that when you create it it is automatically added to the Controls array at run-time so you don't have to mess with filling in the array yourself. 

Anyway, I'll just explain how I did it and let someone else correct me. So after filling in the automated variables with the types of controls each of them is assigned an automatically generated name. I then add them to the Controls array so I can visually manipulate them on the screen so I go to Menu-&gt;Controls in the editor window and select '''Add'''. In the drop-down box select the automatically generated name that was given to the control you want to instantiate. Note you can also select from the other controls that are declared in other objects. After that click the ''Init'' button. Now the control should appear on the screen and you can edit it. One thing to note is that the control specified by the automated variable is _not_ a template. If you change the instantiated control then it changes the automated variable declaration too. Therefore you couldn't have two different buttons that used the same class, you'd have to make a seperate class for each.

So once you've got everything set up you can select the top level menu and hit CTRL+X (I've had to hit it a couple of times before for it to actually copy sometimes, dunno) and it will export the menu to the clipboard.

Ok, a couple of things that confuse me about the exportet text. It starts with an Object declaration of the Menu itself, this isn't what we want I don't think so I just delete that. Ok, now notice that it does assign the object you've created to the automated variable, '''BUT''' on mine at least it doesn't corrently identify the package (ie. Package.GUIButton1 instead of VTactics.TestMenu.GUIButton1). So I have to change that for each control. Also, I delete the ToolTip entry. Now since we instantiated the controls in the Control array you'll also notice the entries in that array (ie. Controls(0)=GUIButton'VTactics.TestMenu.GUIButton1'). I also delete these entries since being automated they are added at run-time.

I checked with with someone &quot;in the know&quot; and he said that everything I wrote above is pretty much accurate. He said that because of it's unpolished state the built-in GUI Designer still isn't quite ready for full fledged menu creation but more for just tweaking. He also said that he was planning on fixing a few of the above problems with the exported menu definitions so that there wouldn't be a need for as much clean-up afterwards. He said he knows the whole process is pretty rough still but that's why he made the GUIDesigner.dll self contained so it could be easily upgraded later.

'''RegularX:''' Great info.  I might have to post a bounty for decent tutorials on starting from scratch with some of this stuff.  It looks immensely powerful drifting through the UScript code, but unfortunately it also looks just plain immense. For stuff I'm trying to get down for the next MSUC deadline, I might have to stick to 2k3 GUI, just because it's what I'm familiar with...

TODO :

===The finer art of 'default vs. instanced'===</text>
    </revision>
    <revision>
      <id>1444</id>
      <timestamp>2004-03-29T15:28:45Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>Instructions for design mode</comment>
      <text xml:space="preserve">The new internal management system for [[Legacy:GUIMultiComponent|GUIMultiComponent]]s enables you to automatically create variables of the desired type, without casting.  It also handles initialization, tab order, and render weight for each automated component.  It involves two new specifiers: one for classes - ''instanced'', and one for properties - ''automated''.

&lt;uscript&gt;
var automated GUIButton FantasticButton;

defaultproperties
{
    Begin Object Class=GUIButton Name=FantaticButtonTemplate
        OnClick=InternalOnClick
        WinWidth=0.06
        WinHeight=0.04
        bBoundToParent=True
        bScaleToParent=True
    End Object

    FantasticButton = FantasticButtonTemplate
}
&lt;/uscript&gt;

'''Instanced''' is a class modifier that was added in UT2004.  It indicates that all objects of this class should be instanced.  For an explanation of what that means, exactly, see [[Legacy:Subobject|Subobject]]. 

'''Automated''' is a variable modifier that was added in UT2004.  This modifier is currently used only in the GUI, and indicates that the object assigned to this variable should be automatically added to the Controls array when the class is initialized.  This auto-assignment is handled by the native function GUIMultiComponent.InitializeControls, which is called from GUIMultiComponent.InitComponent().  InitializeControls() iterates through all properties of the class, and builds a list of object properties (or arrays of object properties) marked automated.  Any objects assigned to an automated object variable are added to the GUIMultiComponent's Controls array.

GUIMultiComponent defines two arrays of GUIComponents - Controls and Components.  

The Controls array contains all GUIComponents defined and initialized in that menu (note: I use &quot;menu&quot;, but this applies to any subclass of [[Legacy:GUIMultiComponent|GUIMultiComponent]], not just [[Legacy:GUIPage|GUIPage]]).  When using automated controls, the controls array will be sorted natively by '''RenderWeight''', a property of [[Legacy:GUIComponent|GUIComponent]].  Any components added to a menu after the menu has already been initialized (via AddComponent() or AppendComponent()) will be inserted into the menu's Controls array according to RenderWeight.  The menu is drawn first, followed by Controls[0], then Controls[1], etc. until controls have been drawn.

The Components array contains all controls on the page that are have bTabStop set to True.  Generally, Components are controls on the page that can accept input, such as buttons, edit boxes, and tabs.  The components array is sorted by '''TabOrder''', a property of [[Legacy:GUIComponent|GUIComponent]].  The Components array will always be automatically managed, regardless of whether you are using automated components or not.  [[Legacy:GUIMultiComponent|GUIMultiComponent]] provides methods for manipulating both the Controls and the Components array.

You cannot use automated components if you have any controls defined in defaultproperties.  InitializeControls() checks if there are any existing members defined for the Controls array in the class's default properties, and if so, simply returns.  If you wish to use automated components in a subclass of another menu which defines its Controls in defaultproperties (UT2003-Style), set bAlwaysAutomate to true in your subclass's defaultproperties.  When InitializeControls() is called, if bAlwaysAutomate is true, it will first empty the Controls array, then proceed to rebuild it using only automated components.  Of course, you could assign Controls in defaultproperties, then set bAlwaysAutomate=True, but there wouldn't really be much point to that... :)

UT2004's GUI uses automated components exclusively, and I'd highly recommend doing the same - it makes managing controls MUCH easier.

===AutoPositioning===

&lt;uscript&gt;
// Auto-positioning - accounts for bBoundToParent &amp; bScaleToParent
native final function AutoPosition(
		array&lt;GUIComponent&gt; Components,
		float LeftBound, float UpperBound, float RightBound, float LowerBound,
		float LeftPad, float UpperPad, float RightPad, float LowerPad,
		optional int NumberOfColumns, optional float ColumnPadding
		);
&lt;/uscript&gt;

GUIComponent.AutoPosition() is a native function that will automatically position an array of GUIComponents within the bounds passed to the function.  It takes eleven parameters.  The first parameter is an array of GUIComponents that will be positioned.  The next four parameters define the bounds of the area that you wish the components to be positions within, and the next four parameters specify the amount of padding to add to each side.  These parameters must be actual screen values, not scaled values (For example, pass in the value of ActualTop(), not WinTop).  The final two parameters are optional, and allows you to break the components into columns.

AutoPosition() first applies the padding values, then divides the length of the passed-in array by the difference between the lower bound and the upper bound to find the component offset.  It adjusts each of the array member's WinWidth, WinLeft values based on the values passed into the function, and adjust each array member's WinTop value based on component offset.  It does NOT modify the WinHeight value of the components.  If the total number of components multiplied by the offset value would be greater than the bounded area, AutoPosition() writes an error to the log, and returns.  AutoPosition() accounts for the bBoundToParent and bScaleToParent values, and internally adjusts the ratios of the components accordingly.

A closely related function is AutoPositionOn().  This function is simply a wrapper for AutoPosition(), by allowing you to specify a component (such as a background image) that you would like to use for positioning, with parameters for padding percentages.

[[Legacy:GUISectionBackground|GUISectionBackground]] was sort of the evolution of AutoPosition &amp; AutoPositionOn().  GUISectionBackground is essentially a background image that auto-positions other components.  [[Legacy:GUISectionBackground|GUISectionBackground]] has modifiable background &amp; header images, and you feed it components to be managed using its ManageComponent() function.

====Multiple instancing====

One of the largest benefits of using AutoPosition() to position your components is that you can very easily take advantage of multiple instancing.  Multiple instancing is where you have one templated subobject definition, but assign multiple variables to it.

&lt;uscript&gt;
	Begin Object class=GUIImage Name=HUDPreviewImage
 		ImageStyle=ISTY_Scaled
 		ImageColor=(R=255,G=255,B=255,A=255)
 		WinHeight=0.5
		RenderWeight=0.51
	End Object
	i_HUDTop=HUDPreviewImage
	i_HUDTopRight=HUDPreviewImage
	i_HUDTopLeft=HUDPreviewImage
	i_HUDMiddleRight=HUDPreviewImage
	i_HUDMiddleLeft=HUDPreviewImage
	i_HUDMiddleRight=HUDPreviewImage
	i_HUDBottomLeft=HUDPreviewImage
	i_HUDBottomRight=HUDPreviewImage
	i_HUDBottom=HUDPreviewImage
&lt;/uscript&gt;

You can then pass these components to AutoPosition() as an array, and they will be automatically positioned for you.  If you need to make changes to the original template image, you'd only need to make this change in one place.  Likewise, if you wanted to add additional components, or remove components, you'd need only to add/remove the assignments in default properties.  No more resizing dozens of components in design mode every time you change one option! :)

===Overriding automated subobject definitions===

===The finer art of 'default vs. instanced'===

----

'''Mychaeel:''' That's a very neat set of new features you're describing here.  :-)  It's just a bit of a pity that it's specific to the GUI classes and not made so generic that all classes could benefit from it &amp;ndash; by allowing the &quot;automated&quot; keyword in any class, introducing an &quot;InitObject&quot; event in [[Legacy:Object|Object]] and defining a native &quot;InitObjects&quot; function in Object instead of InitComponents in [[Legacy:GUIMultiComponent|GUIMultiComponent]].

'''Evolution:''' **edit** I've removed my previous response, because I was just plain wrong.  :)  Yes, it is a shame - perhaps next game  ;)

'''JoeDark:''' Ok, this is my experience with messing around with automated vars in the menu system. I don't know how exactly they are supposed to be used so if there is a better/easier way please do tell ;) All this applies to the menus, so I don't know how it would work anywhere else.

There have been a few additions to the in-game menu authoring system. The most noticable is that when you select a component a properties window (a la UnrealEd) will appear where you can edit the selected component. Obviously you need to be running in windowed mode for this to happen.

[[Image:Legacy_gui_editor_screen1.jpeg|]]

When you declare a variable as automated it will show up in the last category on this menu. If you expand the automated variable you will have two options as usual with adding new elements in the editor. You can select a previously created button or you can go down one and click New. Here it will give you a list of classes that you can put into your automated variable. For example, if you declare an automated GUIButton then the list of possible classes that variable can be include GUIButton, GUIComboButton, GUIEditBox. Once created you can set all of it's attributes of size and appearance. If you then hit CTRL+X while you have the top level menu selected it will export the Object definitions for '''ALL''' your automated variables. You could then just copy and paste it into the default properties. (It turns out to not be that easy)

Here's where I'm a little confused about what they intended. The controls do not actaully instantiate on the menu and you can't visually manipulate them unless you add them to the Controls array in the editor window. I thought one of the advantages of an automated variable is that when you create it it is automatically added to the Controls array at run-time so you don't have to mess with filling in the array yourself. 

Anyway, I'll just explain how I did it and let someone else correct me. So after filling in the automated variables with the types of controls each of them is assigned an automatically generated name. I then add them to the Controls array so I can visually manipulate them on the screen so I go to Menu-&gt;Controls in the editor window and select '''Add'''. In the drop-down box select the automatically generated name that was given to the control you want to instantiate. Note you can also select from the other controls that are declared in other objects. After that click the ''Init'' button. Now the control should appear on the screen and you can edit it. One thing to note is that the control specified by the automated variable is _not_ a template. If you change the instantiated control then it changes the automated variable declaration too. Therefore you couldn't have two different buttons that used the same class, you'd have to make a seperate class for each.

So once you've got everything set up you can select the top level menu and hit CTRL+X (I've had to hit it a couple of times before for it to actually copy sometimes, dunno) and it will export the menu to the clipboard.

Ok, a couple of things that confuse me about the exportet text. It starts with an Object declaration of the Menu itself, this isn't what we want I don't think so I just delete that. Ok, now notice that it does assign the object you've created to the automated variable, '''BUT''' on mine at least it doesn't corrently identify the package (ie. Package.GUIButton1 instead of VTactics.TestMenu.GUIButton1). So I have to change that for each control. Also, I delete the ToolTip entry. Now since we instantiated the controls in the Control array you'll also notice the entries in that array (ie. Controls(0)=GUIButton'VTactics.TestMenu.GUIButton1'). I also delete these entries since being automated they are added at run-time.

So anyway, that's my experience with them so far. I definitely feel like I'm missing something because it almost seems like it's just as much effort with all of the editing of the exported text as the previous method of menu creation. Someone else please feel free to ''show me the light'' ;)

'''JoeDark:''' Ok, I talked to someone &quot;in the know&quot; and he said that everything I wrote above is pretty much accurate. He said that because of it's unpolished state the built-in GUI Designer still isn't quite ready for full fledged menu creation but more for just tweaking. He also said that he was planning on fixing a few of the above problems with the exported menu definitions so that there wouldn't be a need for as much clean-up afterwards. He said he knows the whole process is pretty rough still but that's why he made the GUIDesigner.dll self contained so it could be easily upgraded later.

'''RegularX:''' Great info.  I might have to post a bounty for decent tutorials on starting from scratch with some of this stuff.  It looks immensely powerful drifting through the UScript code, but unfortunately it also looks just plain immense. For stuff I'm trying to get down for the next MSUC deadline, I might have to stick to 2k3 GUI, just because it's what I'm familiar with...

'''Enigmatic:''' Out of curiosity and general usefulness, could you please explain to me how you get into the &quot;Menu Authoring Mode&quot; within UT2004?

'''Evolution:''' First, you must change the value of GUIController.bModAuthor to True.  Do this in the User.ini prior to starting the game, or from within the game using the console command 'set guicontroller bmodauthor true'.  Once that's done, press Ctrl+Alt+D to enter designer mode.  Once there, hold F1 for a list of valid commands.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1445</id>
      <timestamp>2004-09-29T10:13:46Z</timestamp>
      <contributor>
        <ip>219-88-205-170.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>Whoops, broken link</comment>
      <text xml:space="preserve">The new internal management system for [[Legacy:GUIMultiComponent|GUIMultiComponent]]s enables you to automatically create variables of the desired type, without casting.  It also handles initialization, tab order, and render weight for each automated component.  It involves two new specifiers: one for classes - ''instanced'', and one for properties - ''automated''.

&lt;uscript&gt;
var automated GUIButton FantasticButton;

defaultproperties
{
    Begin Object Class=GUIButton Name=FantaticButtonTemplate
        OnClick=InternalOnClick
        WinWidth=0.06
        WinHeight=0.04
        bBoundToParent=True
        bScaleToParent=True
    End Object

    FantasticButton = FantasticButtonTemplate
}
&lt;/uscript&gt;

'''Instanced''' is a class modifier that was added in UT2004.  It indicates that all objects of this class should be instanced.  For an explanation of what that means, exactly, see [[Legacy:Subobject|Subobject]]. 

'''Automated''' is a variable modifier that was added in UT2004.  This modifier is currently used only in the GUI, and indicates that the object assigned to this variable should be automatically added to the Controls array when the class is initialized.  This auto-assignment is handled by the native function GUIMultiComponent.InitializeControls, which is called from GUIMultiComponent.InitComponent().  InitializeControls() iterates through all properties of the class, and builds a list of object properties (or arrays of object properties) marked automated.  Any objects assigned to an automated object variable are added to the GUIMultiComponent's Controls array.

GUIMultiComponent defines two arrays of GUIComponents - Controls and Components.  

The Controls array contains all GUIComponents defined and initialized in that menu (note: I use &quot;menu&quot;, but this applies to any subclass of [[Legacy:GUIMultiComponent|GUIMultiComponent]], not just [[Legacy:GUIPage|GUIPage]]).  When using automated controls, the controls array will be sorted natively by '''RenderWeight''', a property of [[Legacy:GUIComponent|GUIComponent]].  Any components added to a menu after the menu has already been initialized (via AddComponent() or AppendComponent()) will be inserted into the menu's Controls array according to RenderWeight.  The menu is drawn first, followed by Controls[0], then Controls[1], etc. until controls have been drawn.

The Components array contains all controls on the page that are have bTabStop set to True.  Generally, Components are controls on the page that can accept input, such as buttons, edit boxes, and tabs.  The components array is sorted by '''TabOrder''', a property of [[Legacy:GUIComponent|GUIComponent]].  The Components array will always be automatically managed, regardless of whether you are using automated components or not.  [[Legacy:GUIMultiComponent|GUIMultiComponent]] provides methods for manipulating both the Controls and the Components array.

You cannot use automated components if you have any controls defined in defaultproperties.  InitializeControls() checks if there are any existing members defined for the Controls array in the class's default properties, and if so, simply returns.  If you wish to use automated components in a subclass of another menu which defines its Controls in defaultproperties (UT2003-Style), set bAlwaysAutomate to true in your subclass's defaultproperties.  When InitializeControls() is called, if bAlwaysAutomate is true, it will first empty the Controls array, then proceed to rebuild it using only automated components.  Of course, you could assign Controls in defaultproperties, then set bAlwaysAutomate=True, but there wouldn't really be much point to that... :)

UT2004's GUI uses automated components exclusively, and I'd highly recommend doing the same - it makes managing controls MUCH easier.

===AutoPositioning===

&lt;uscript&gt;
// Auto-positioning - accounts for bBoundToParent &amp; bScaleToParent
native final function AutoPosition(
		array&lt;GUIComponent&gt; Components,
		float LeftBound, float UpperBound, float RightBound, float LowerBound,
		float LeftPad, float UpperPad, float RightPad, float LowerPad,
		optional int NumberOfColumns, optional float ColumnPadding
		);
&lt;/uscript&gt;

GUIComponent.AutoPosition() is a native function that will automatically position an array of GUIComponents within the bounds passed to the function.  It takes eleven parameters.  The first parameter is an array of GUIComponents that will be positioned.  The next four parameters define the bounds of the area that you wish the components to be positions within, and the next four parameters specify the amount of padding to add to each side.  These parameters must be actual screen values, not scaled values (For example, pass in the value of ActualTop(), not WinTop).  The final two parameters are optional, and allows you to break the components into columns.

AutoPosition() first applies the padding values, then divides the length of the passed-in array by the difference between the lower bound and the upper bound to find the component offset.  It adjusts each of the array member's WinWidth, WinLeft values based on the values passed into the function, and adjust each array member's WinTop value based on component offset.  It does NOT modify the WinHeight value of the components.  If the total number of components multiplied by the offset value would be greater than the bounded area, AutoPosition() writes an error to the log, and returns.  AutoPosition() accounts for the bBoundToParent and bScaleToParent values, and internally adjusts the ratios of the components accordingly.

A closely related function is AutoPositionOn().  This function is simply a wrapper for AutoPosition(), by allowing you to specify a component (such as a background image) that you would like to use for positioning, with parameters for padding percentages.

[[Legacy:GUISectionBackground|GUISectionBackground]] was sort of the evolution of AutoPosition &amp; AutoPositionOn().  GUISectionBackground is essentially a background image that auto-positions other components.  [[Legacy:GUISectionBackground|GUISectionBackground]] has modifiable background &amp; header images, and you feed it components to be managed using its ManageComponent() function.

====Multiple instancing====

One of the largest benefits of using AutoPosition() to position your components is that you can very easily take advantage of multiple instancing.  Multiple instancing is where you have one templated subobject definition, but assign multiple variables to it.

&lt;uscript&gt;
	Begin Object class=GUIImage Name=HUDPreviewImage
 		ImageStyle=ISTY_Scaled
 		ImageColor=(R=255,G=255,B=255,A=255)
 		WinHeight=0.5
		RenderWeight=0.51
	End Object
	i_HUDTop=HUDPreviewImage
	i_HUDTopRight=HUDPreviewImage
	i_HUDTopLeft=HUDPreviewImage
	i_HUDMiddleRight=HUDPreviewImage
	i_HUDMiddleLeft=HUDPreviewImage
	i_HUDMiddleRight=HUDPreviewImage
	i_HUDBottomLeft=HUDPreviewImage
	i_HUDBottomRight=HUDPreviewImage
	i_HUDBottom=HUDPreviewImage
&lt;/uscript&gt;

You can then pass these components to AutoPosition() as an array, and they will be automatically positioned for you.  If you need to make changes to the original template image, you'd only need to make this change in one place.  Likewise, if you wanted to add additional components, or remove components, you'd need only to add/remove the assignments in default properties.  No more resizing dozens of components in design mode every time you change one option! :)

===Overriding automated subobject definitions===

----

'''Mychaeel:''' That's a very neat set of new features you're describing here.  :-)  It's just a bit of a pity that it's specific to the GUI classes and not made so generic that all classes could benefit from it &amp;ndash; by allowing the &quot;automated&quot; keyword in any class, introducing an &quot;InitObject&quot; event in [[Legacy:Object|Object]] and defining a native &quot;InitObjects&quot; function in Object instead of InitComponents in [[Legacy:GUIMultiComponent|GUIMultiComponent]].

===Advanced use of Ingame Gui Designer===

Before reading this, you will want to read the mention of the Gui Designer in [[Legacy:[GUIController|[GUIController]]] which allows you to move GUI components around in the menus ingame and play with their properties.

There have been a few additions to the in-game menu authoring system. The most noticable is that when you select a component a properties window (a la UnrealEd) will appear where you can edit the selected component. Obviously you need to be running in windowed mode for this to happen.

[[Image:Legacy_gui_editor_screen1.jpeg|]]

When you declare a variable as automated it will show up in the last category on this menu. If you expand the automated variable you will have two options as usual with adding new elements in the editor. You can select a previously created button or you can go down one and click New. Here it will give you a list of classes that you can put into your automated variable. For example, if you declare an automated GUIButton then the list of possible classes that variable can be include GUIButton, GUIComboButton, GUIEditBox. Once created you can set all of it's attributes of size and appearance. If you then hit CTRL+X while you have the top level menu selected it will export the Object definitions for '''ALL''' your automated variables. You could then just copy and paste it into the default properties. (It turns out to not be that easy)

Here's where I'm a little confused about what they intended. The controls do not actaully instantiate on the menu and you can't visually manipulate them unless you add them to the Controls array in the editor window. I thought one of the advantages of an automated variable is that when you create it it is automatically added to the Controls array at run-time so you don't have to mess with filling in the array yourself. 

Anyway, I'll just explain how I did it and let someone else correct me. So after filling in the automated variables with the types of controls each of them is assigned an automatically generated name. I then add them to the Controls array so I can visually manipulate them on the screen so I go to Menu-&gt;Controls in the editor window and select '''Add'''. In the drop-down box select the automatically generated name that was given to the control you want to instantiate. Note you can also select from the other controls that are declared in other objects. After that click the ''Init'' button. Now the control should appear on the screen and you can edit it. One thing to note is that the control specified by the automated variable is _not_ a template. If you change the instantiated control then it changes the automated variable declaration too. Therefore you couldn't have two different buttons that used the same class, you'd have to make a seperate class for each.

So once you've got everything set up you can select the top level menu and hit CTRL+X (I've had to hit it a couple of times before for it to actually copy sometimes, dunno) and it will export the menu to the clipboard.

Ok, a couple of things that confuse me about the exportet text. It starts with an Object declaration of the Menu itself, this isn't what we want I don't think so I just delete that. Ok, now notice that it does assign the object you've created to the automated variable, '''BUT''' on mine at least it doesn't corrently identify the package (ie. Package.GUIButton1 instead of VTactics.TestMenu.GUIButton1). So I have to change that for each control. Also, I delete the ToolTip entry. Now since we instantiated the controls in the Control array you'll also notice the entries in that array (ie. Controls(0)=GUIButton'VTactics.TestMenu.GUIButton1'). I also delete these entries since being automated they are added at run-time.

I checked with with someone &quot;in the know&quot; and he said that everything I wrote above is pretty much accurate. He said that because of it's unpolished state the built-in GUI Designer still isn't quite ready for full fledged menu creation but more for just tweaking. He also said that he was planning on fixing a few of the above problems with the exported menu definitions so that there wouldn't be a need for as much clean-up afterwards. He said he knows the whole process is pretty rough still but that's why he made the GUIDesigner.dll self contained so it could be easily upgraded later.

'''RegularX:''' Great info.  I might have to post a bounty for decent tutorials on starting from scratch with some of this stuff.  It looks immensely powerful drifting through the UScript code, but unfortunately it also looks just plain immense. For stuff I'm trying to get down for the next MSUC deadline, I might have to stick to 2k3 GUI, just because it's what I'm familiar with...

TODO :

===The finer art of 'default vs. instanced'===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Automatic Turret</title>
    <id>357</id>
    <revision>
      <id>1231</id>
      <timestamp>2002-09-16T18:25:08Z</timestamp>
      <contributor>
        <ip>Host217-34-66-254.in-addr.btopenworld.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There are two built-in types of Automatic Turrets. They are the [[Legacy:TeamCannon|TeamCannon]] and the [[Legacy:TeamCannon|MinigunCannon]], which is a subclass of TeamCannon.  These types of actors are most frequently used in maps for the Capture the Flag and Assault gametypes, as well as a few good custom gametypes. And most importantly, for a stress reliever: just put 20-30 of them across CTF-face, add bots, spectate, and enjoy!

'''Ars-Magna:''' Random Tidbit&amp;ndash;you can kill the turrets, and even better, you can telefrag them!

A note on those turrets in CTF games: The [[Legacy:CTF|CTF]] game code has a major bug concerning [[Legacy:Pawn (UT)|Pawn (UT)]]s without a [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] like Unreal monsters or the turrets. Every time a non-player pawn (neither Bot nor PlayerPawn) kills a player an Accessed None error is logged and also Bots might get confused because of the badly written CTF code.

'''ProjectX:''' I think we should put all of the sections of the actor's properties in pages like this, because people will know what they are, yes, but they won't know how to use one. I would do it personally, but i don't know how to use them either!</text>
    </revision>
    <revision>
      <id>1232</id>
      <timestamp>2002-08-19T14:56:02Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There are two built-in types of Automatic Turrets. They are the [[Legacy:TeamCannon|TeamCannon]] and the [[Legacy:TeamCannon|MinigunCannon]], which is a subclass of TeamCannon.  These types of actors are most frequently used in maps for the Capture the Flag and Assault gametypes, as well as a few good custom gametypes. And most importantly, for a stress reliever: just put 20-30 of them across CTF-face, add bots, spectate, and enjoy!

'''Ars-Magna:''' Random Tidbit&amp;ndash;you can kill the turrets, and even better, you can telefrag them!

A note on those turrets in CTF games: The [[Legacy:CTF|CTF]] game code has a major bug concerning [[Legacy:Pawn (UT)|Pawn (UT)]]s without a [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] like Unreal monsters or the turrets. Every time a non-player pawn (neither Bot nor PlayerPawn) kills a player an Accessed None error is logged and also Bots might get confused because of the badly written CTF code.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Axe56/Developer Journal</title>
    <id>433</id>
    <revision>
      <id>1452</id>
      <timestamp>2006-04-10T21:46:26Z</timestamp>
      <contributor>
        <ip>Adsl-70-231-236-26.dsl.snfc21.sbcglobal.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===The Page of Axe!===

====(no not the deodorant haha)====

Well I finally got around to creating a page on the wiki.

===About Me===
*I mainly map, but I do have abstract ideas or ponderous ponderings occasionally and I will most likely post'em here!
*I have been mapping for nearly 3 years now starting with Unreal, Moving to Unreal Tournament and now on Unreal Tournament 2003.
*I have yet to get everything under my belt, so I learn something new everytime I need to...
*Not sure if I'm alone here or not, but the editor isn't easy to master!

;[http://www.mvpb.com Maximum Velocity Paintball]

===Journal===

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

===April 10th, 2006===

====Almost 3 years later eh? - I'm currently studying for a B.S. Degree in Game art and Design (past year and a half... nother year and a half to go... horray for halfway through!) -both mods have pretty much died, and the past year has been an insane experience of body and mind... horray for life no? -I'm excited to be working in unreal again, and have grand expectations for future maps =]

School is finally starting to get interesting, and it seems like I'll finally be able to start using all the knowledge I've gathered on the unreal engine. - this quarter requires my own private unreal level, as well, I'm workiing with 6 other students to create a unique and georgous level. (I'll post some screens when it's finished.) 

===July 10th, 2003===

====Well! It's been a lil while now hasen't it ;)====

I'm still working with this map you see below, haha, I've learned quite a bit with terrain functions (more I know) haha.

I now have my own website which I do update rather regularly, but it is still in the process of being &quot;settled&quot; into, so pardon my dust! http://tower56.urfclan.com

===April 20th, 2003===

====Nature Is Wonderful====

Well, I've been learning much about decolayers, layers, and lighting, distance fog, and everything else! Here's some screenshots of what I've been able to produce, and I am very happy with how things are going.

&lt;br /&gt;Copy Paste the address below to see a large image if you so wish to.

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/natural01.jpg&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/natural01.jpg

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/3.gif&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/3.gif

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/7.gif&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/7.gif

&lt;br /&gt;Hopefully I'll have time to develop this page as I go.

Thanks!

~Axe

----

'''ZxAnPhOrIaN:''' Congrats on creating your own developer journal page! ;)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1453</id>
      <timestamp>2003-07-11T06:07:50Z</timestamp>
      <contributor>
        <ip>Adsl-63-205-68-184.dsl.snfc21.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===The Page of Axe!===

====(no not the deodorant haha)====

Well I finally got around to creating a page on the wiki.

===About Me===
*I mainly map, but I do have abstract ideas or ponderous ponderings occasionally and I will most likely post'em here!
*I have been mapping for nearly 3 years now starting with Unreal, Moving to Unreal Tournament and now on Unreal Tournament 2003.
*I have yet to get everything under my belt, so I learn something new everytime I need to...
*Not sure if I'm alone here or not, but the editor isn't easy to master!
*I have not ever, released a map to the public, if I'm not happy with how it looks, I sure as heck ain't gonna release it.&lt;br /&gt;Although I have not released any maps to the public, I am fortunate enough to belong to two modification teams, both for UT2k3.
;[http://www.unrealism.com/blackwidow Black Widow]
;[http://www.mvpb.com Maximum Velocity Paintball]

===Journal===

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

===July 10th, 2003===

====Well! It's been a lil while now hasen't it ;)====

I'm still working with this map you see below, haha, I've learned quite a bit with terrain functions (more I know) haha.

I now have my own website which I do update rather regularly, but it is still in the process of being &quot;settled&quot; into, so pardon my dust! http://tower56.urfclan.com

===April 20th, 2003===

====Nature Is Wonderful====

Well, I've been learning much about decolayers, layers, and lighting, distance fog, and everything else! Here's some screenshots of what I've been able to produce, and I am very happy with how things are going.

&lt;br /&gt;Copy Paste the address below to see a large image if you so wish to.

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/natural01.jpg&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/natural01.jpg

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/3.gif&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/3.gif

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/7.gif&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/7.gif

&lt;br /&gt;Hopefully I'll have time to develop this page as I go.

Thanks!

~Axe

----

'''ZxAnPhOrIaN:''' Congrats on creating your own developer journal page! ;)</text>
    </revision>
    <revision>
      <id>1454</id>
      <timestamp>2003-08-05T09:43:08Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===The Page of Axe!===

====(no not the deodorant haha)====

Well I finally got around to creating a page on the wiki.

===About Me===
*I mainly map, but I do have abstract ideas or ponderous ponderings occasionally and I will most likely post'em here!
*I have been mapping for nearly 3 years now starting with Unreal, Moving to Unreal Tournament and now on Unreal Tournament 2003.
*I have yet to get everything under my belt, so I learn something new everytime I need to...
*Not sure if I'm alone here or not, but the editor isn't easy to master!
*I have not ever, released a map to the public, if I'm not happy with how it looks, I sure as heck ain't gonna release it.&lt;br /&gt;Although I have not released any maps to the public, I am fortunate enough to belong to two modification teams, both for UT2k3.
;[http://www.unrealism.com/blackwidow Black Widow]
;[http://www.mvpb.com Maximum Velocity Paintball]

===Journal===

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

===July 10th, 2003===

====Well! It's been a lil while now hasen't it ;)====

I'm still working with this map you see below, haha, I've learned quite a bit with terrain functions (more I know) haha.

I now have my own website which I do update rather regularly, but it is still in the process of being &quot;settled&quot; into, so pardon my dust! http://tower56.urfclan.com

===April 20th, 2003===

====Nature Is Wonderful====

Well, I've been learning much about decolayers, layers, and lighting, distance fog, and everything else! Here's some screenshots of what I've been able to produce, and I am very happy with how things are going.

&lt;br /&gt;Copy Paste the address below to see a large image if you so wish to.

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/natural01.jpg&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/natural01.jpg

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/3.gif&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/3.gif

&lt;img src=&quot;http://www.unrealism.com/blackwidow/images/axemap/7.gif&quot; width=&quot;200&quot; height=&quot;150&quot; border=&quot;0&quot;&gt;

www.unrealism.com/blackwidow/images/axemap/7.gif

&lt;br /&gt;Hopefully I'll have time to develop this page as I go.

Thanks!

~Axe

----

'''ZxAnPhOrIaN:''' Congrats on creating your own developer journal page! ;)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BB Drac</title>
    <id>569</id>
    <revision>
      <id>1746</id>
      <timestamp>2003-05-25T13:07:48Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">BB Drac runs an unreal editing site somewhere.

'''Tarquin:''' I can't remember offhand what he added here, but I remember telling him to add himself to the contributors list :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BM.Deathwind</title>
    <id>585</id>
    <revision>
      <id>1780</id>
      <timestamp>2003-01-14T21:23:15Z</timestamp>
      <contributor>
        <ip>BM.Deathwind</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Jan 13, 2k3===

Move along folks, nothing to see here.  Perhaps when I figure out which way is up...

===Jan 14, 2k3===

Who am I? What do I do? Why am I here?  

Well ... I am BM.Deathwind (aka MP3Chuck, elsewhere).  I am a student, [http://www.rmpmusic.com musician], and gamer.  I'm also co-leader of what's becoming a TC for UT2k3, called Blades of Legends.  I'll put a link when the site is no longer in &quot;beta&quot; stage.  Hopefully we'll be hosted by PlanetUnreal by then... :)  Basically, Blades of Legends will be a multi-player TC influenced by (but NOT based upon) the worlds of Warcraft and Lord of the Rings.  Gameplay, at this point, will include Humans, Elves, and Orcs. Beyond that, things are still being changed/designed/confirmed.  My job(s) are Project Lead, Music/Soundtrack, and some Coding.  Possibly some collaborative mapping, as well.  So hopefully I'll have plenty to contribute along the line.  It will undoubtably be a long-term project...

===Comments===

 /\             /\
 || This way up ||
 ||             ||

'''Wormbo:''' Welcome to the Wiki. Enjoy your stay and have a good time figuring out which way is up. ;) When you're done with that, you could add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you want.

'''BM.Deathwind:''' Heh ... thanks.  I was considering adding myself to the contributors list, but figured I'd wait until I'd contributed something. :D  That'll come with  time, no doubt. :)

'''ZxAnPhOrIaN:''' welcome! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1781</id>
      <timestamp>2003-01-13T23:05:44Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Jan 13, 2k3===

Move along folks, nothing to see here.  Perhaps when I figure out which way is up...

===Comments===

 /\             /\
 || This way up ||
 ||             ||

'''Wormbo:''' Welcome to the Wiki. Enjoy your stay and have a good time figuring out which way is up. ;) When you're done with that, you could add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you want.

'''BM.Deathwind:''' Heh ... thanks.  I was considering adding myself to the contributors list, but figured I'd wait until I'd contributed something. :D  That'll come with  time, no doubt. :)

'''ZxAnPhOrIaN:''' welcome! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1782</id>
      <timestamp>2003-01-14T21:11:15Z</timestamp>
      <contributor>
        <ip>BM.Deathwind</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Jan 13, 2k3===

Move along folks, nothing to see here.  Perhaps when I figure out which way is up...

===Jan 14, 2k3===

Who am I? What do I do? Why am I here?  

Well ... I am BM.Deathwind (aka MP3Chuck, elsewhere).  I am a student, musician, and gamer.  I'm also co-leader of what's becoming a TC for UT2k3, called Blades of Legends.  I'll put a link when the site is no longer in &quot;beta&quot; stage.  Hopefully we'll be hosted by PlanetUnreal by then... :)  Basically, Blades of Legends will be a multi-player TC influenced by (but NOT based upon) the worlds of Warcraft and Lord of the Rings.  Gameplay, at this point, will include Humans, Elves, and Orcs. Beyond that, things are still being changed/designed/confirmed.  My job(s) are Project Lead, Music/Soundtrack, and some Coding.  Possibly some collaborative mapping, as well.  So hopefully I'll have plenty to contribute along the line.  It will undoubtably be a long-term project...

===Comments===

 /\             /\
 || This way up ||
 ||             ||

'''Wormbo:''' Welcome to the Wiki. Enjoy your stay and have a good time figuring out which way is up. ;) When you're done with that, you could add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you want.

'''BM.Deathwind:''' Heh ... thanks.  I was considering adding myself to the contributors list, but figured I'd wait until I'd contributed something. :D  That'll come with  time, no doubt. :)

'''ZxAnPhOrIaN:''' welcome! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BOZO</title>
    <id>589</id>
    <revision>
      <id>1791</id>
      <timestamp>2004-09-14T04:24:54Z</timestamp>
      <contributor>
        <ip>BOZO</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Personal Page]]

'''BOZO:'''Howdy folks and welcome to my page. I plan on adding some stuff in here when I have time and helping out on the Wiki. It has actually come in handy a few times for me so I feel obligated to help right back.

I've been messing with Unreal since Unreal I. My first clan was the &lt;NDP&gt; clan - The NewDefinitionsofPain. Bunch of good buddies there - had a totally blast. I then discovered the Unreal Editor and Pandoras Box was opened wide. I started out trying my hand at Mapping - I laughingly recall some of my first &quot;Maps&quot; now. Pretty cruddy if I say so...anyways I got better and actually made a decent level or two before discovering the joys of scripting. I took to that like a fish in water. My first public project was the very first IP Logger/Ban Tool for Unreal I called, interestingly enough, &quot;IPLogger&quot;. It actually got used on quite a few servers when I released it. It taught me lots about Replication - the bugbear of learning how to program in UnrealScript. Another fun bit people may not be too familiar with is that there are currently 4 different versions of Unreal I (builds) that you can commonly come across running on servers today. Each has its own benefits/drawbacks - I had to learn how to write stuff that worked across multiple versions also. Helped me learn a bit more indepth package stuff... 

I then got involved working on a mod for Unreal I called &quot;Crystal Castles&quot; that was loosely based on the old arcade game of the same name. Myself and a couple of other folks did work on it and released it in 2003 to the General Public. I still run a server to this day. It had the distinction of being the first TC Mod to be released in several years for Unreal I. UT2003 had already been released by this time. Note: I totally skipped the UT phenomenon. Was having too much fun with Unreal I. For this mod I ended up doing most of the Programming, Model building, Animation, and Map construction.

Again a great learning experience all around. I ended up doing lots of stuff that had never been done before in Unreal.

About two months prior to our &quot;Crystal Castles&quot; Unreal I release, the &quot;Make Something Unreal&quot; contest for UT2003 was announced. Just after our release I jumped in to start our UT2003 conversion now titled &quot;Crystal Chaos&quot;. We worked diligently to convert our stuff - some of the old team kinda drifted away - a new member joined. Anyways I again got to do most of the Programming and Model building. Unfortunately all our old stuff was vertex mesh and animation thus I had to spend an inordinate amount of time trying to figure out how to convert stuff to the new skeletal and static mesh formats. I was using Milkshape as my Modelling tool - as you may know the custom Animation export never got working correctly - thus I spent tons of time wasted there trying to figure that out. Then decided to mess with Maya PLE - guess what you can't do custom Animation there either. Thus I was stuck for our weapon models so no real good animation going on....I finally gave up until later.

Anyways this whole time I was doing this - I was also totally rewriting our Weapon code from scratch - we have multimode weapons in our mod - No stock support for that so I was reinventing the wheel - again... Also our big bit from Unreal I was our bunch of custom Inventory Items. I had to recreate all that stuff once again for UT2003 since it really does not provide 100% stock support for activatable and carryable inventory either - looks like they almost included enough to make it work - anyways I filled in the gaps. Also had to split all our stuff into the seperate Pickup and Inventory classes.I spent some time adding some new items and functionality not in our previous Unreal I release.

We finally had enough converted just a little before the Phase 3 entry deadline for the contest to actually submit something that was recognizable as a game. (Big change going from Unreal I to UT2003) They changed the rules though and you suddenly had to make things work for UT2004. I of course waited til the last minute to do the conversion and promptly got bit by the WeaponFire object base snafu...darn Epic...

So even though we were VERY buggy we entered what we had for the Phase 3 entry. None of our weapons worked over the network. Someone must have seen through the glaring problems though since we got an honorable mention for one of our Gametypes!!

My team and I kept plodding on to correct all our outstanding issues and actually created a stable and halfway polished mod in time for the Phase 4 contest entry time. We entered &quot;Crystal Chaos&quot; as our TC FPS Mod entry. Maybe they will ask us to enter the Grand Prize contest - not holding my breath though...

So all that brings me to today. Now that my spare time is no longer totally consumed in my fruitless pursuit of a &quot;kudos&quot; for my mad programming skills - I find that I might actually have time to pass on my hard garnered knowledge...

Enough of me lurking in the backwaters of the Unreal realm. I'm coming out into the Light...

Greetings!!

BOZO

bozo@newdefinitionsofpain.com

===Comments===

'''MythOpus:''' Welcome To The Wiki BOZO.  Enjoy Your Stay Here.

'''El Muerte:''' its BOZO. And welcome.

'''EntropicLqd:''' Hi, Welcome to the Wiki.  Enjoy your stay here :)

'''BOZO:''' Thanks for the welcome folks!

   
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1792</id>
      <timestamp>2004-09-13T13:00:46Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>LoL!!! Sorry Bozo, slip of the finger.</comment>
      <text xml:space="preserve">[[:Category:Legacy Personal Page]]

'''BOZO:'''Howdy folks and welcome to my page. I plan on adding some stuff in here when I have time and helping out on the Wiki. It has actually come in handy a few times for me so I feel obligated to help right back.

I've been messing with Unreal since Unreal I. My first clan was the &lt;NDP&gt; clan - The NewDefinitionsofPain. Bunch of good buddies there - had a totally blast. I then discovered the Unreal Editor and Pandoras Box was opened wide. I started out trying my hand at Mapping - I laughingly recall some of my first &quot;Maps&quot; now. Pretty cruddy if I say so...anyways I got better and actually made a decent level or two before discovering the joys of scripting. I took to that like a fish in water. My first public project was the very first IP Logger/Ban Tool for Unreal I called, interestingly enough, &quot;IPLogger&quot;. It actually got used on quite a few servers when I released it. It taught me lots about Replication - the bugbear of learning how to program in UnrealScript. Another fun bit people may not be too familiar with is that there are currently 4 different versions of Unreal I (builds) that you can commonly come across running on servers today. Each has its own benefits/drawbacks - I had to learn how to write stuff that worked across multiple versions also. Helped me learn a bit more indepth package stuff... 

I then got involved working on a mod for Unreal I called &quot;Crystal Castles&quot; that was loosely based on the old arcade game of the same name. Myself and a couple of other folks did work on it and released it in 2003 to the General Public. I still run a server to this day. It had the distinction of being the first TC Mod to be released in several years for Unreal I. UT2003 had already been released by this time. Note: I totally skipped the UT phenomenon. Was having too much fun with Unreal I. For this mod I ended up doing most of the Programming, Model building, Animation, and Map construction.

Again a great learning experience all around. I ended up doing lots of stuff that had never been done before in Unreal.

About two months prior to our &quot;Crystal Castles&quot; Unreal I release, the &quot;Make Something Unreal&quot; contest for UT2003 was announced. Just after our release I jumped in to start our UT2003 conversion now titled &quot;Crystal Chaos&quot;. We worked diligently to convert our stuff - some of the old team kinda drifted away - a new member joined. Anyways I again got to do most of the Programming and Model building. Unfortunately all our old stuff was vertex mesh and animation thus I had to spend an inordinate amount of time trying to figure out how to convert stuff to the new skeletal and static mesh formats. I was using Milkshape as my Modelling tool - as you may know the custom Animation export never got working correctly - thus I spent tons of time wasted there trying to figure that out. Then decided to mess with Maya PLE - guess what you can't do custom Animation there either. Thus I was stuck for our weapon models so no real good animation going on....I finally gave up until later.

Anyways this whole time I was doing this - I was also totally rewriting our Weapon code from scratch - we have multimode weapons in our mod - No stock support for that so I was reinventing the wheel - again... Also our big bit from Unreal I was our bunch of custom Inventory Items. I had to recreate all that stuff once again for UT2003 since it really does not provide 100% stock support for activatable and carryable inventory either - looks like they almost included enough to make it work - anyways I filled in the gaps. Also had to split all our stuff into the seperate Pickup and Inventory classes.I spent some time adding some new items and functionality not in our previous Unreal I release.

We finally had enough converted just a little before the Phase 3 entry deadline for the contest to actually submit something that was recognizable as a game. (Big change going from Unreal I to UT2003) They changed the rules though and you suddenly had to make things work for UT2004. I of course waited til the last minute to do the conversion and promptly got bit by the WeaponFire object base snafu...darn Epic...

So even though we were VERY buggy we entered what we had for the Phase 3 entry. None of our weapons worked over the network. Someone must have seen through the glaring problems though since we got an honorable mention for one of our Gametypes!!

My team and I kept plodding on to correct all our outstanding issues and actually created a stable and halfway polished mod in time for the Phase 4 contest entry time. We entered &quot;Crystal Chaos&quot; as our TC FPS Mod entry. Maybe they will ask us to enter the Grand Prize contest - not holding my breath though...

So all that brings me to today. Now that my spare time is no longer totally consumed in my fruitless pursuit of a &quot;kudos&quot; for my mad programming skills - I find that I might actually have time to pass on my hard garnered knowledge...

Enough of me lurking in the backwaters of the Unreal realm. I'm coming out into the Light...

Greetings!!

BOZO

bozo@newdefinitionsofpain.com

===Comments===

'''MythOpus:''' Welcome To The Wiki BOZO.  Enjoy Your Stay Here.

'''El Muerte:''' its BOZO. And welcome.

'''EntropicLqd:''' Hi, Welcome to the Wiki.  Enjoy your stay here :)

   
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BRISK</title>
    <id>570</id>
    <revision>
      <id>1747</id>
      <timestamp>2002-08-16T13:37:49Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===.news ===

Found the site yesterday, joined the site today.

===.plan ===

====.tc ====

I'm planning on TCing UT 2003.

(Odd, I believe I just gerundized an acronym... I wonder if that's proper?)

If not a TC, then a new game type and some new weapons at the very least. I'm mulling over my own ideas currently, but I welcome new ones.

====.thought ====

Got something you'd like to see in a UT 2003 mod / mutator? &lt;br /&gt;Dump 'em here: jer@harbornet.com.

No promises, but I'll give props where they're due in my readme.

----

'''Tarquin:''' Hello BRISK. Welcome to the Unreal Wiki.

'''Mychaeel:''' Don't forget to add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.  :-)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki. :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1748</id>
      <timestamp>2002-08-16T10:39:14Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===.news ===

Found the site yesterday, joined the site today.

===.plan ===

====.tc ====

I'm planning on TCing UT 2003.

(Odd, I believe I just gerundized an acronym... I wonder if that's proper?)

If not a TC, then a new game type and some new weapons at the very least. I'm mulling over my own ideas currently, but I welcome new ones.

====.thought ====

Got something you'd like to see in a UT 2003 mod / mutator? &lt;br /&gt;Dump 'em here: jer@harbornet.com.

No promises, but I'll give props where they're due in my readme.

----

'''Tarquin:''' Hello BRISK. Welcome to the Unreal Wiki.

'''Mychaeel:''' Don't forget to add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.  :-)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BSP</title>
    <id>545</id>
    <revision>
      <id>1686</id>
      <timestamp>2006-12-06T09:49:23Z</timestamp>
      <contributor>
        <ip>Ripper Hugme</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">;BSP: '''B'''inary '''S'''pace '''P'''artition.  A technique for determining polygon order and therefore visibility by cutting a world space into convex regions. Each cut splits the world into two subregions, hence the word &quot;binary&quot;.

==Why BSP==

The purpose of BSP is to greatly reduce the amount of work the game engine has to perform in real time to draw [[Legacy:Polygon|polygon]]s on the player's screen.
* The world is divided, or cut into regions.
* Each point where a cut occurs is called a node.  
* The collection of nodes and its associated edges are called a data structure or the [[Legacy:BSP Tree|BSP Tree]].
* The rendering engine uses the BSP Tree to determine
** collision occurance
** surface visibility or occlussion
* The BSP partitioning process is invoked by the map builder before the map is played and is known as compiling.
* Most 3D game maps use BSP.

The complexity of geometry and the BSP Tree slows the compilation process, also known as the [[Legacy:Build|build]].

==How UnrealEd handles BSP==
* The build process is invoked manually to create the BSP tree. 
* 
The interface implies that the following happens
*# process CSG brushes to create surfaces in 3D
*# process the surfaces to create a BSP tree

The two parts of the process are probably more intertwined, since a simple geometry rebuild produces BSP cuts.  See also [[Legacy:BSP Hole|BSP hole]].


==Examples of BSP behaviour==

===Regions are (usually) maximal===

* Make a 256 cube
* Subtract it twice, one on top of the other. 
* Build. 
* Now add a pillar 512 high, 64x64 base. 
* 
In Zone view, the pillar sides have ''not'' been cut by BSP

Before the pillar is added, both subtracts are treated as one single region. This means that you can make subtractive trim.

''article on this is on the way &amp;ndash; Tarquin''. 


===Trim around the base of a room===
* make a subtract the same base size as the room and 32 high. 
* Subtract this
* Make the room brush smaller too so they don't overlap

===Another method===
* Use clipping to split the room subtract 32 units above the floor. 
* Use split, not clip.  Split creates two brushes.  See [[Legacy:Making Trim|Making Trim]]

==Comments==

'''inio:''' This test may be pointless, as I believe that there can only be BSP cuts along planes on which surfaces exist.  As far as I can tell the BSP is not built progressively brush-by-brush.  Instead, all CSG is done, splitting polygons only when necessary for geometry reasons.  Once this big polygon list is generated the BSP is built from that.  Because no polygons remain on the plane cutting the 512x256x256 room in half after CSG, there cannot be a BSP cut on that plane and there is no reason to cut the polys on the tower in the middle.  Either that, or it does some recombination after BSP generation, but that seems algorithmically harder to me and I would expect the extra vertices to be left around (which they aren't).

'''Tarquin:''' Yes, I see what you mean. Some lines you see in zone view are just divisions of a surface, they're not necessarily BSP cuts.

'''Sobiwan:'''~ A picture is worth a thousand words.  :)

'''Jimbo:''' I'm not sure I've ever seen this question asked before but does anyone know if it's possible to convert the BSP construction of a UT2003 map over to a Quake III map?

'''Foxpaw:''' Though it's probrably possible. It's questionably legal to do so. You would need permission to port a map to a different game. There is, to my knowledge, no ready-made utilities for this purpose. It's also worth mentioning that a lot (but not all) of the world geometry in UnrealEngine2 is composed of static meshes, which, if imported into Quake 3, would likely strain your system beyond all belief. However, there are maps with lots of BSP in them, and porting them should be possible with the use of a custom utility that you will have to create in the programming language of your choice. (Or possibly find someone to create the utility for you, but it may be somewhat time consuming to make.)

One minor point I should make too, is that although we usually call it &quot;BSP,&quot; BSP is technically an optimization performed on the &quot;CSG,&quot; which refers to the actual geometry. :D

Anyways, you can get the raw vertex and polygon information from UnrealEd, then you will need to write (or have someone else write) a program to convert it to a Quake-friendly format. See [[Legacy:Brush|Brush]] and [[Legacy:Brush Hacking|Brush Hacking]] for the relevant info on how you can get the raw vertex and polygon data from UnrealEd.

'''Draconx:''' You also must remember that Quake3 and UT handle geometry in vastly different ways, UT's CSG is the thing that says &quot;the world is currently filled up, let's cut holes out of it and run around inside them!&quot;, whereas in Quake3 you start with the world being empty, and you create floor, ceilings, and walls by filling up this empty space.  (I could be wrong on that one, I've never done any quake3 mapping before).  So you're stuck with more than just doing a simple conversion from one format to another, you've got to completely reconstruct the world geometry using quake3's system.

In short, I think you'd be better off playing Chaos in Space from Team Arena ;)

'''Jimbo:''' Hehe... thanks for the insight guys. I recently completed this map: http://fragme.org/Downloads/Maps/TempleOfChaos.zip and was just wondering if it was possible. By the way... what do you guys think of it? My email is in the readme file. :)

'''Ripper_hugme:''' What Draconx is saying is right that's the way Quake 3's BSP works (note this is also the same with HL1 and 2 and related games, and other games based on the quake or source engine). As for porting CSG to QBSP, you'd want to export to the native editor formats such as .vmf's (Source) or Worldcraft so you can edit them without the need to de-compile. 

==Related Topics==
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:BSP Tree|BSP Tree]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1687</id>
      <timestamp>2005-01-04T15:36:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">;BSP: '''B'''inary '''S'''pace '''P'''artition.  A technique for determining polygon order and therefore visibility by cutting a world space into convex regions. Each cut splits the world into two subregions, hence the word &quot;binary&quot;.

==Why BSP==

The purpose of BSP is to greatly reduce the amount of work the game engine has to perform in real time to draw [[Legacy:Polygon|polygon]]s on the player's screen.
* The world is divided, or cut into regions.
* Each point where a cut occurs is called a node.  
* The collection of nodes and its associated edges are called a data structure or the [[Legacy:BSP Tree|BSP Tree]].
* The rendering engine uses the BSP Tree to determine
** collision occurance
** surface visibility or occlussion
* The BSP partitioning process is invoked by the map builder before the map is played and is known as compiling.
* Most 3D game maps use BSP.

The complexity of geometry and the BSP Tree slows the compilation process, also known as the [[Legacy:Build|build]].

==How UnrealEd handles BSP==
* The build process is invoked manually to create the BSP tree. 
* 
The interface implies that the following happens
*# process CSG brushes to create surfaces in 3D
*# process the surfaces to create a BSP tree

The two parts of the process are probably more intertwined, since a simple geometry rebuild produces BSP cuts.  See also [[Legacy:BSP Hole|BSP hole]].


==Examples of BSP behaviour==

===Regions are (usually) maximal===

* Make a 256 cube
* Subtract it twice, one on top of the other. 
* Build. 
* Now add a pillar 512 high, 64x64 base. 
* 
In Zone view, the pillar sides have ''not'' been cut by BSP

Before the pillar is added, both subtracts are treated as one single region. This means that you can make subtractive trim.

''article on this is on the way &amp;ndash; Tarquin''. 


===Trim around the base of a room===
* make a subtract the same base size as the room and 32 high. 
* Subtract this
* Make the room brush smaller too so they don't overlap

===Another method===
* Use clipping to split the room subtract 32 units above the floor. 
* Use split, not clip.  Split creates two brushes.  See [[Legacy:Making Trim|Making Trim]]

==Comments==

'''inio:''' This test may be pointless, as I believe that there can only be BSP cuts along planes on which surfaces exist.  As far as I can tell the BSP is not built progressively brush-by-brush.  Instead, all CSG is done, splitting polygons only when necessary for geometry reasons.  Once this big polygon list is generated the BSP is built from that.  Because no polygons remain on the plane cutting the 512x256x256 room in half after CSG, there cannot be a BSP cut on that plane and there is no reason to cut the polys on the tower in the middle.  Either that, or it does some recombination after BSP generation, but that seems algorithmically harder to me and I would expect the extra vertices to be left around (which they aren't).

'''Tarquin:''' Yes, I see what you mean. Some lines you see in zone view are just divisions of a surface, they're not necessarily BSP cuts.

'''Sobiwan:'''~ A picture is worth a thousand words.  :)

'''Jimbo:''' I'm not sure I've ever seen this question asked before but does anyone know if it's possible to convert the BSP construction of a UT2003 map over to a Quake III map?

'''Foxpaw:''' Though it's probrably possible. It's questionably legal to do so. You would need permission to port a map to a different game. There is, to my knowledge, no ready-made utilities for this purpose. It's also worth mentioning that a lot (but not all) of the world geometry in UnrealEngine2 is composed of static meshes, which, if imported into Quake 3, would likely strain your system beyond all belief. However, there are maps with lots of BSP in them, and porting them should be possible with the use of a custom utility that you will have to create in the programming language of your choice. (Or possibly find someone to create the utility for you, but it may be somewhat time consuming to make.)

One minor point I should make too, is that although we usually call it &quot;BSP,&quot; BSP is technically an optimization performed on the &quot;CSG,&quot; which refers to the actual geometry. :D

Anyways, you can get the raw vertex and polygon information from UnrealEd, then you will need to write (or have someone else write) a program to convert it to a Quake-friendly format. See [[Legacy:Brush|Brush]] and [[Legacy:Brush Hacking|Brush Hacking]] for the relevant info on how you can get the raw vertex and polygon data from UnrealEd.

'''Draconx:''' You also must remember that Quake3 and UT handle geometry in vastly different ways, UT's CSG is the thing that says &quot;the world is currently filled up, let's cut holes out of it and run around inside them!&quot;, whereas in Quake3 you start with the world being empty, and you create floor, ceilings, and walls by filling up this empty space.  (I could be wrong on that one, I've never done any quake3 mapping before).  So you're stuck with more than just doing a simple conversion from one format to another, you've got to completely reconstruct the world geometry using quake3's system.

In short, I think you'd be better off playing Chaos in Space from Team Arena ;)

'''Jimbo:''' Hehe... thanks for the insight guys. I recently completed this map: http://fragme.org/Downloads/Maps/TempleOfChaos.zip and was just wondering if it was possible. By the way... what do you guys think of it? My email is in the readme file. :)

==Related Topics==
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:BSP Tree|BSP Tree]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BSP Hole</title>
    <id>541</id>
    <revision>
      <id>1675</id>
      <timestamp>2006-05-20T04:50:36Z</timestamp>
      <contributor>
        <ip>Pool-71-105-113-177.lsanca.dsl-w.verizon.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A '''BSP hole''' is an error in the [[Legacy:BSP Tree|BSP Tree]] which results in visual and physical errors when editing and playing a map.

==Symptoms==

Holes can manifest themselves as:
* a player can walk through walls and fall through floors. 
* a spot of the map where the player dies for no reason
* an invisible obstacle
* leaking zones: level full of water for example. These tend to happen when zone sheets touch complex brushes. First check the the [[Legacy:Zone Portal|zone portal]] brush is large enough to properly seal off the zone.
* a surface which doesn't display the texture properly by revealing:
** parts of the map which shouldn't be visible from that location
** a black area in UnrealEd's 3D viewport which produces a [[Legacy:HOM|HOM]] (hall of mirrors) effect in the game. 

If the surface belongs to a [[Legacy:Semisolid|semisolid]] brush, see [[Legacy:Semisolid Errors|semisolid errors]].

[[Image:Legacy_legaltoon_goblin_bsphole.gif|center|An error in the BSP tree affects part of a wall and floor.  A black hole or &quot;hall of mirrors&quot; is the result.]]

==Locate the Offender==

Find the hole in Zone/Portal view. The edges of the hole correspond to a BSP cut. Identifying which part of the geometry makes this cut can often solve the problem.

===The Mychaeel Patented BSP Hole Detector===

It's much easier to spot Hall of Mirrors in maps if the screen is covered with a translucent red fog; at Hall of Mirrors locations, the fog builds up to a solid red blotch and makes discovering Hall of Mirrors pretty easy. You can achieve this with the following console command, which you can also achieve with [[Legacy:Binding Keys|binding keys]]:
 set PlayerPawn ConstantGlowFog (X=0.3)

==Possible Cures==

===Rearrange===
* Put brushes on the grid (see [[Legacy:Keeping Brushes Snapped To The Grid|Keeping brushes snapped to the grid]]). If your brush dimensions aren't [[Legacy:Grid|grid]] units (e.g. 100 units wide instead of 96, 112 or 128, then you have angered the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]]. You'll have to remake them. Tough.)

* Changing the order often solves the problem. If additive brushes get BSP errors then it often helps if you put them to the end of the BSP rebuild sequence. 
** Select the diseased brush, ''Right Click''. If it is a subtractive brush move it 'to first'. If it is an additive brush move it 'to last'.
** Export the brush and delete. Add again during a later rebuild.
* Change the way the geometry is put together: use subtracts in a different way.

===Simplify===

Either outright simplify the geometry in the area, or add a [[Legacy:Zone Portal|zone portal]] somewhere judicious, thus splitting one zone into two smaller ones. This way the geometry inside the zone won't be that complex.

===Make It Permanent===

When brushes are rotated, stretched or vertex edited, it is important the changes are made set to [[Legacy:Transform Permanently|transform permanently]].  Anything not made permanent is prone to introduce math errors, which is inherited to the BSP Tree when built.

===Semisolids===

Use more [[Legacy:Semisolid|semisolid]]s for decoration or brushes a player/bot cant reach 

'''Ragdoll:''' As i said over on the [[Legacy:Semisolid|Semisolid]] Page, the use of semisolids where the player wont touch them is a myth. Use semis as much as possible for a low node count, although there are limitations.

===Merge Polygons===

Just recently when I was making a &quot;cloud&quot; for my level, I went to rebuild my geometry and then there were about 5 to 10 BSP holes! With frustration, I aligned the textures on the cloud and then I merged the polygons. After that, for a reason I don't know why, the BSP holes vanished!

===Desperation===
* Move the brush that is causing the BSP hole some minor distance. 
* [http://forums.beyondunreal.com/showthread.php?threadid=88347 88347] on how to manage BSP cuts
* [http://forums.beyondunreal.com/showthread.php?threadid=75868 75868] (I know I'm lazy,hopefully somebody will sum up).
* Offer the Unreal Goblin your car keys. ''Stupid Grin''
* Try to reduce [[Legacy:Node Count|node count]] (no idea why)

===Last Resort===

The sliders in the [[Legacy:Build|Build]] window should be your last solution. 

===But wait! [[Legacy:Evil_blue_dude|evil_blue_dude]] has found an experimental method to solving this!===

Say you have a floor that your are falling through. [[Legacy:Evil_blue_dude|evil_blue_dude]] would suggest [[Legacy:Brush Sinking|brush sinking]] another brush (doesn't have to be complex, just a cube will do) into the offending floor, and add, retexture/align, etc.

Won't even know it as there.

OK. [[Legacy:Evil_blue_dude|evil_blue_dude]] is done with his spree of shameless self promotion.

==Prevention==

===Stay on the grid===

Keep brushes snapped to the grid. Use multiples of powers of 2 for dimensions, so vertices are on the grid too.

Try and keep a large grid size: 32 or 16 should be fine for most brushwork; drop down to 8, 4 or 2 for fine detail.

Of course this is not always possible (especially when you want to add details) but it's better to keep the exceptions at a minimal level. Also on that note think in the powers of 2 when working with your maps, like 2-4-8-16-32-64-128...

===Semisolids===

Use [[Legacy:Semisolid|semisolid]] brushes for complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Stairs|Making Stairs]]

===Keep it simple===

If an 8 sided cylinder will do, don't bother with 16 or 32 sides. Add curved brushes as semisolids.

===Desperation===
* The last resort is to intersect/deintersect brushes before adding them. If you need to do this, go back to &quot;stay on the grid&quot; above.

* If you're using the [[Legacy:Grid|grid]] there's no need to intersect since everything will join perfectly; if you're off-grid you're doomed anyway.

* Overlapping brushes do not create BSP errors.

==Technical==

Brush collision information is assigned incorrectly by the BSP compiler and UnrealEd then displays the BSP anomaly that interferes with gameplay.  BSP holes can be either missing sections of additive brushes (usually a rectangular section of wall) that you can see through to geometry that should be occluded from your perspective; or, the 3D Grid ''Black Space'' triangle interposed usually at the confluence of two brushes. They're UGLY and terrifying. 

You can see BSP holes in the Zone Portal view; and not in the BSP cuts view. And, you can view information about BSP Tree depth in the Rebuild/Level Statistics.&lt;br /&gt;

See, a description of [[Legacy:BSP Tree|BSP Tree]] for clarification of the mechanics involved.

==Questions and Answers==

===Strange BSP Hole When Rebuilding All===

'''Question:''' 

When I only build the geometry there are NO BSP holes. But when I build all there are LOTS of BSP holes!  Does anybody know how this is possible?  And how I can resolve it?  Thanks!

'''EntropicLqd Answers:'''
* If you haven't added any zone portals to your map yet then do so - this changes the BSP tree and will either solve your problem or move the Hall of Mirrors effects.
* Make sure that all of the your zone portals are added to the level last - see [[Legacy:Brush Order|Brush Order]].
* Are your semi-solids added to the level after your adds and subtracts?  I've seen strange Hall of Mirrors and clipping problems with semi-solids aligned perfectly/overlapping with subtracted and added brushes.
* Take a quick tour of your level in the editor and see if you can re-arrange the order of the brushes (move as many subtracts to the start as you can).  Be careful when doing this - you can shaft your level if you are not careful.
* Do you have zone portals overlapping areas that were subtracted after the zone portal was added?
* Have a look at the [[Legacy:Help Desk|Help Desk]] page - there are some other Hall of Mirrors type problems on there.
:Apart from that, see if you can identify the piece of geometry that is causing the error and either remove it, or see if you can simplify it in some way.  Good luck.

===Random Invisible Collision Hulls and Hall of Mirrors===

'''Question:'''  
:I've got two problems:  1. I have invisible collision hulls randomly appearing in my maps and I can't get rid of them; 2. The dreaded Hall of Mirrors randomly appears too, HELP ME!!!

'''EntropicLqd Answers:'''
:Mmmmm, nice problems.  The worst case I've ever had of Hall of Mirrors and unwanted collisions was when building DOM-Cruising.  The map is based on two boats traveling through the water.  The boats are solid brushes hollowed out to make room for the stuff &quot;below deck&quot;.  The first time I built the map I simply placed a zone portal (for the water) across the entire level.  This gave me the sort of pain you describe.  In the end I had to add my zone, subtract my solid boat brush (to make a boat shaped hole in the zone), and then re-add the boat brush.
:Have you ordered all of your zone portals to be the last things processed?  That can sometimes help.  If you haven't zoned your level yet then consider doing so - Zoning affects the positions Hall of Mirrors and ICHs appear.  Messing about with the order of geometry can also sometimes help - but be careful with it - you can royally screw up your level doing it.
:Are the Hall of Mirrors and ICHs appearing in areas of particular complexity?  If so, can you reduce the compexity of that area?  Have you got any semi-solids intersecting (or with one surface touching) a solid brush?  I've had that cause me real pain (I was building celing lights).

'''Tarquin:''' How on earth can ICHs appear at random? You mean you're getting blocked by invisible stuff? That's a [[Legacy:BSP Hole|BSP Hole]]

'''Ragdoll:''' A good way of detecting collision BSP errors (you fall through a floor) is to enable show paths. Paths will not form over dodgy BSP.

==Comments==

(Attribute to ChrisToth, most, if not all useful information on BSP Holes, causes, diagnostics, and corrective action.)

BSP Holes can also appear after converting a static mesh to a brush, and the problem sometimes does line up with the culprit on one of the three axis points. ''Web Raines''

'''Tarquin''':  There's a lot of very useful technical info that's been moved to the end of it. This stuff needs to be reintegrated here, or in [[Legacy:BSP|BSP]] or [[Legacy:BSP Tree|BSP Tree]]

'''Lucy''': I've been doing some complex geometry that often resultsin inexplicable mapholes. This may not work in all instances for bsp holes, but it's working in mine at least. If a complex piece of brush work is causing BSP holes, I take the complex section and intersect a cube onto it to turn it into a single brush. I turn that single brush into a static mesh and then place the static mesh where I want it. Then, I convert it back into a brush. Align the brush with the static mesh. Delete the mesh, deintersect the brush and add. Seems to work quite effectively. But I worry about any potential performance issues resulting from this. The result has a lot more cuts through the brush, so unless someone can do some stress testing to see how much of a performance hit this is, use it sparingly.

==Related Topics==
* [[Legacy:Hall Of Mirrors|Hall of Mirrors]]
* [[Legacy:BSP Hole Background|BSP Hole Background]] collected on the [http://forums.beyondunreal.com/ BeyondUnreal's General Editing Forum]
* [http://unreal.gamedesign.net/bspfaq.html BSP Frequently Asked Questions]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1676</id>
      <timestamp>2006-01-25T10:13:48Z</timestamp>
      <contributor>
        <ip>Lucy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''BSP hole''' is an error in the [[Legacy:BSP Tree|BSP Tree]] which results in visual and physical errors when editing and playing a map.

==Symptoms==

Holes can manifest themselves as:
* a player can walk through walls and fall through floors. 
* a spot of the map where the player dies for no reason
* an invisible obstacle
* leaking zones: level full of water for example. These tend to happen when zone sheets touch complex brushes. First check the the [[Legacy:Zone Portal|zone portal]] brush is large enough to properly seal off the zone.
* a surface which doesn't display the texture properly by revealing:
** parts of the map which shouldn't be visible from that location
** a black area in UnrealEd's 3D viewport which produces a [[Legacy:HOM|HOM]] (hall of mirrors) effect in the game. 

If the surface belongs to a [[Legacy:Semisolid|semisolid]] brush, see [[Legacy:Semisolid Errors|semisolid errors]].

[[Image:Legacy_legaltoon_goblin_bsphole.gif|center|An error in the BSP tree affects part of a wall and floor.  A black hole or &quot;hall of mirrors&quot; is the result.]]

==Locate the Offender==

Find the hole in Zone/Portal view. The edges of the hole correspond to a BSP cut. Identifying which part of the geometry makes this cut can often solve the problem.

===The Mychaeel Patented BSP Hole Detector===

It's much easier to spot Hall of Mirrors in maps if the screen is covered with a translucent red fog; at Hall of Mirrors locations, the fog builds up to a solid red blotch and makes discovering Hall of Mirrors pretty easy. You can achieve this with the following console command, which you can also achieve with [[Legacy:Binding Keys|binding keys]]:
 set PlayerPawn ConstantGlowFog (X=0.3)

==Possible Cures==

===Rearrange===
* Put brushes on the grid (see [[Legacy:Keeping Brushes Snapped To The Grid|Keeping brushes snapped to the grid]]). If your brush dimensions aren't [[Legacy:Grid|grid]] units (e.g. 100 units wide instead of 96, 112 or 128, then you have angered the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]]. You'll have to remake them. Tough.)

* Changing the order often solves the problem. If additive brushes get BSP errors then it often helps if you put them to the end of the BSP rebuild sequence. 
** Select the diseased brush, ''Right Click''. If it is a substractive brush move it 'to first'. If it is an additive brush move it 'to last'.
** Export the brush and delete. Add again during a later rebuild.
* Change the way the geometry is put together: use subtracts in a different way.

===Simplify===

Either outright simplify the geometry in the area, or add a [[Legacy:Zone Portal|zone portal]] somewhere judicious, thus splitting one zone into two smaller ones. This way the geometry inside the zone won't be that complex.

===Make It Permanent===

When brushes are rotated, stretched or vertex edited, it is important the changes are made set to [[Legacy:Transform Permanently|transform permanently]].  Anything not made permanent is prone to introduce math errors, which is inherited to the BSP Tree when built.

===Semisolids===

Use more [[Legacy:Semisolid|semisolid]]s for decoration or brushes a player/bot cant reach 

'''Ragdoll:''' As i said over on the [[Legacy:Semisolid|Semisolid]] Page, the use of semisolids where the player wont touch them is a myth. Use semis as much as possible for a low node count, although there are limitations.

===Merge Polygons===

Just recently when I was making a &quot;cloud&quot; for my level, I went to rebuild my geometry and then there were about 5 to 10 BSP holes! With frustration, I aligned the textures on the cloud and then I merged the polygons. After that, for a reason I don't know why, the BSP holes vanished!

===Desperation===
* Move the brush that is causing the BSP hole some minor distance. 
* [http://forums.beyondunreal.com/showthread.php?threadid=88347 88347] on how to manage BSP cuts
* [http://forums.beyondunreal.com/showthread.php?threadid=75868 75868] (I know I'm lazy,hopefully somebody will sum up).
* Offer the Unreal Goblin your car keys. ''Stupid Grin''
* Try to reduce [[Legacy:Node Count|node count]] (no idea why)

===Last Resort===

The sliders in the [[Legacy:Build|Build]] window should be your last solution. 

===But wait! [[Legacy:Evil_blue_dude|evil_blue_dude]] has found an experimental method to solving this!===

Say you have a floor that your are falling through. [[Legacy:Evil_blue_dude|evil_blue_dude]] would suggest [[Legacy:Brush Sinking|brush sinking]] another brush (doesn't have to be complex, just a cube will do) into the offending floor, and add, retexture/align, etc.

Won't even know it as there.

OK. [[Legacy:Evil_blue_dude|evil_blue_dude]] is done with his spree of shameless self promotion.

==Prevention==

===Stay on the grid===

Keep brushes snapped to the grid. Use multiples of powers of 2 for dimensions, so vertices are on the grid too.

Try and keep a large grid size: 32 or 16 should be fine for most brushwork; drop down to 8, 4 or 2 for fine detail.

Of course this is not always possible (especially when you want to add details) but it's better to keep the exceptions at a minimal level. Also on that note think in the powers of 2 when working with your maps, like 2-4-8-16-32-64-128...

===Semisolids===

Use [[Legacy:Semisolid|semisolid]] brushes for complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Stairs|Making Stairs]]

===Keep it simple===

If an 8 sided cylinder will do, don't bother with 16 or 32 sides. Add curved brushes as semisolids.

===Desperation===
* The last resort is to intersect/deintersect brushes before adding them. If you need to do this, go back to &quot;stay on the grid&quot; above.

* If you're using the [[Legacy:Grid|grid]] there's no need to intersect since everything will join perfectly; if you're off-grid you're doomed anyway.

* Overlapping brushes do not create BSP errors.

==Technical==

Brush collision information is assigned incorrectly by the BSP compiler and UnrealEd then displays the BSP anomaly that interferes with gameplay.  BSP holes can be either missing sections of additive brushes (usually a rectangular section of wall) that you can see through to geometry that should be occluded from your perspective; or, the 3D Grid ''Black Space'' triangle interposed usually at the confluence of two brushes. They're UGLY and terrifying. 

You can see BSP holes in the Zone Portal view; and not in the BSP cuts view. And, you can view information about BSP Tree depth in the Rebuild/Level Statistics.&lt;br /&gt;

See, a description of [[Legacy:BSP Tree|BSP Tree]] for clarification of the mechanics involved.

==Questions and Answers==

===Strange BSP Hole When Rebuilding All===

'''Question:''' 

When I only build the geometry there are NO BSP holes. But when I build all there are LOTS of BSP holes!  Does anybody know how this is possible?  And how I can resolve it?  Thanks!

'''EntropicLqd Answers:'''
* If you haven't added any zone portals to your map yet then do so - this changes the BSP tree and will either solve your problem or move the Hall of Mirrors effects.
* Make sure that all of the your zone portals are added to the level last - see [[Legacy:Brush Order|Brush Order]].
* Are your semi-solids added to the level after your adds and subtracts?  I've seen strange Hall of Mirrors and clipping problems with semi-solids aligned perfectly/overlapping with subtracted and added brushes.
* Take a quick tour of your level in the editor and see if you can re-arrange the order of the brushes (move as many subtracts to the start as you can).  Be careful when doing this - you can shaft your level if you are not careful.
* Do you have zone portals overlapping areas that were subtracted after the zone portal was added?
* Have a look at the [[Legacy:Help Desk|Help Desk]] page - there are some other Hall of Mirrors type problems on there.
:Apart from that, see if you can identify the piece of geometry that is causing the error and either remove it, or see if you can simplify it in some way.  Good luck.

===Random Invisible Collision Hulls and Hall of Mirrors===

'''Question:'''  
:I've got two problems:  1. I have invisible collision hulls randomly appearing in my maps and I can't get rid of them; 2. The dreaded Hall of Mirrors randomly appears too, HELP ME!!!

'''EntropicLqd Answers:'''
:Mmmmm, nice problems.  The worst case I've ever had of Hall of Mirrors and unwanted collisions was when building DOM-Cruising.  The map is based on two boats traveling through the water.  The boats are solid brushes hollowed out to make room for the stuff &quot;below deck&quot;.  The first time I built the map I simply placed a zone portal (for the water) across the entire level.  This gave me the sort of pain you describe.  In the end I had to add my zone, subtract my solid boat brush (to make a boat shaped hole in the zone), and then re-add the boat brush.
:Have you ordered all of your zone portals to be the last things processed?  That can sometimes help.  If you haven't zoned your level yet then consider doing so - Zoning affects the positions Hall of Mirrors and ICHs appear.  Messing about with the order of geometry can also sometimes help - but be careful with it - you can royally screw up your level doing it.
:Are the Hall of Mirrors and ICHs appearing in areas of particular complexity?  If so, can you reduce the compexity of that area?  Have you got any semi-solids intersecting (or with one surface touching) a solid brush?  I've had that cause me real pain (I was building celing lights).

'''Tarquin:''' How on earth can ICHs appear at random? You mean you're getting blocked by invisible stuff? That's a [[Legacy:BSP Hole|BSP Hole]]

==Comments==

(Attribute to ChrisToth, most, if not all useful information on BSP Holes, causes, diagnostics, and corrective action.)

BSP Holes can also appear after converting a static mesh to a brush, and the problem sometimes does line up with the culprit on one of the three axis points. ''Web Raines''

'''Tarquin''':  There's a lot of very useful technical info that's been moved to the end of it. This stuff needs to be reintegrated here, or in [[Legacy:BSP|BSP]] or [[Legacy:BSP Tree|BSP Tree]]

'''Lucy''': I've been doing some complex geometry that often resultsin inexplicable mapholes. This may not work in all instances for bsp holes, but it's working in mine at least. If a complex piece of brush work is causing BSP holes, I take the complex section and intersect a cube onto it to turn it into a single brush. I turn that single brush into a static mesh and then place the static mesh where I want it. Then, I convert it back into a brush. Align the brush with the static mesh. Delete the mesh, deintersect the brush and add. Seems to work quite effectively. But I worry about any potential performance issues resulting from this. The result has a lot more cuts through the brush, so unless someone can do some stress testing to see how much of a performance hit this is, use it sparingly.

==Related Topics==
* [[Legacy:Hall Of Mirrors|Hall of Mirrors]]
* [[Legacy:BSP Hole Background|BSP Hole Background]] collected on the [http://forums.beyondunreal.com/ BeyondUnreal's General Editing Forum]
* [http://unreal.gamedesign.net/bspfaq.html BSP Frequently Asked Questions]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1677</id>
      <timestamp>2006-03-16T22:31:00Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <comment>A useful way of detecting tricky holes</comment>
      <text xml:space="preserve">A '''BSP hole''' is an error in the [[Legacy:BSP Tree|BSP Tree]] which results in visual and physical errors when editing and playing a map.

==Symptoms==

Holes can manifest themselves as:
* a player can walk through walls and fall through floors. 
* a spot of the map where the player dies for no reason
* an invisible obstacle
* leaking zones: level full of water for example. These tend to happen when zone sheets touch complex brushes. First check the the [[Legacy:Zone Portal|zone portal]] brush is large enough to properly seal off the zone.
* a surface which doesn't display the texture properly by revealing:
** parts of the map which shouldn't be visible from that location
** a black area in UnrealEd's 3D viewport which produces a [[Legacy:HOM|HOM]] (hall of mirrors) effect in the game. 

If the surface belongs to a [[Legacy:Semisolid|semisolid]] brush, see [[Legacy:Semisolid Errors|semisolid errors]].

[[Image:Legacy_legaltoon_goblin_bsphole.gif|center|An error in the BSP tree affects part of a wall and floor.  A black hole or &quot;hall of mirrors&quot; is the result.]]

==Locate the Offender==

Find the hole in Zone/Portal view. The edges of the hole correspond to a BSP cut. Identifying which part of the geometry makes this cut can often solve the problem.

===The Mychaeel Patented BSP Hole Detector===

It's much easier to spot Hall of Mirrors in maps if the screen is covered with a translucent red fog; at Hall of Mirrors locations, the fog builds up to a solid red blotch and makes discovering Hall of Mirrors pretty easy. You can achieve this with the following console command, which you can also achieve with [[Legacy:Binding Keys|binding keys]]:
 set PlayerPawn ConstantGlowFog (X=0.3)

==Possible Cures==

===Rearrange===
* Put brushes on the grid (see [[Legacy:Keeping Brushes Snapped To The Grid|Keeping brushes snapped to the grid]]). If your brush dimensions aren't [[Legacy:Grid|grid]] units (e.g. 100 units wide instead of 96, 112 or 128, then you have angered the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]]. You'll have to remake them. Tough.)

* Changing the order often solves the problem. If additive brushes get BSP errors then it often helps if you put them to the end of the BSP rebuild sequence. 
** Select the diseased brush, ''Right Click''. If it is a substractive brush move it 'to first'. If it is an additive brush move it 'to last'.
** Export the brush and delete. Add again during a later rebuild.
* Change the way the geometry is put together: use subtracts in a different way.

===Simplify===

Either outright simplify the geometry in the area, or add a [[Legacy:Zone Portal|zone portal]] somewhere judicious, thus splitting one zone into two smaller ones. This way the geometry inside the zone won't be that complex.

===Make It Permanent===

When brushes are rotated, stretched or vertex edited, it is important the changes are made set to [[Legacy:Transform Permanently|transform permanently]].  Anything not made permanent is prone to introduce math errors, which is inherited to the BSP Tree when built.

===Semisolids===

Use more [[Legacy:Semisolid|semisolid]]s for decoration or brushes a player/bot cant reach 

'''Ragdoll:''' As i said over on the [[Legacy:Semisolid|Semisolid]] Page, the use of semisolids where the player wont touch them is a myth. Use semis as much as possible for a low node count, although there are limitations.

===Merge Polygons===

Just recently when I was making a &quot;cloud&quot; for my level, I went to rebuild my geometry and then there were about 5 to 10 BSP holes! With frustration, I aligned the textures on the cloud and then I merged the polygons. After that, for a reason I don't know why, the BSP holes vanished!

===Desperation===
* Move the brush that is causing the BSP hole some minor distance. 
* [http://forums.beyondunreal.com/showthread.php?threadid=88347 88347] on how to manage BSP cuts
* [http://forums.beyondunreal.com/showthread.php?threadid=75868 75868] (I know I'm lazy,hopefully somebody will sum up).
* Offer the Unreal Goblin your car keys. ''Stupid Grin''
* Try to reduce [[Legacy:Node Count|node count]] (no idea why)

===Last Resort===

The sliders in the [[Legacy:Build|Build]] window should be your last solution. 

===But wait! [[Legacy:Evil_blue_dude|evil_blue_dude]] has found an experimental method to solving this!===

Say you have a floor that your are falling through. [[Legacy:Evil_blue_dude|evil_blue_dude]] would suggest [[Legacy:Brush Sinking|brush sinking]] another brush (doesn't have to be complex, just a cube will do) into the offending floor, and add, retexture/align, etc.

Won't even know it as there.

OK. [[Legacy:Evil_blue_dude|evil_blue_dude]] is done with his spree of shameless self promotion.

==Prevention==

===Stay on the grid===

Keep brushes snapped to the grid. Use multiples of powers of 2 for dimensions, so vertices are on the grid too.

Try and keep a large grid size: 32 or 16 should be fine for most brushwork; drop down to 8, 4 or 2 for fine detail.

Of course this is not always possible (especially when you want to add details) but it's better to keep the exceptions at a minimal level. Also on that note think in the powers of 2 when working with your maps, like 2-4-8-16-32-64-128...

===Semisolids===

Use [[Legacy:Semisolid|semisolid]] brushes for complex architecture:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Stairs|Making Stairs]]

===Keep it simple===

If an 8 sided cylinder will do, don't bother with 16 or 32 sides. Add curved brushes as semisolids.

===Desperation===
* The last resort is to intersect/deintersect brushes before adding them. If you need to do this, go back to &quot;stay on the grid&quot; above.

* If you're using the [[Legacy:Grid|grid]] there's no need to intersect since everything will join perfectly; if you're off-grid you're doomed anyway.

* Overlapping brushes do not create BSP errors.

==Technical==

Brush collision information is assigned incorrectly by the BSP compiler and UnrealEd then displays the BSP anomaly that interferes with gameplay.  BSP holes can be either missing sections of additive brushes (usually a rectangular section of wall) that you can see through to geometry that should be occluded from your perspective; or, the 3D Grid ''Black Space'' triangle interposed usually at the confluence of two brushes. They're UGLY and terrifying. 

You can see BSP holes in the Zone Portal view; and not in the BSP cuts view. And, you can view information about BSP Tree depth in the Rebuild/Level Statistics.&lt;br /&gt;

See, a description of [[Legacy:BSP Tree|BSP Tree]] for clarification of the mechanics involved.

==Questions and Answers==

===Strange BSP Hole When Rebuilding All===

'''Question:''' 

When I only build the geometry there are NO BSP holes. But when I build all there are LOTS of BSP holes!  Does anybody know how this is possible?  And how I can resolve it?  Thanks!

'''EntropicLqd Answers:'''
* If you haven't added any zone portals to your map yet then do so - this changes the BSP tree and will either solve your problem or move the Hall of Mirrors effects.
* Make sure that all of the your zone portals are added to the level last - see [[Legacy:Brush Order|Brush Order]].
* Are your semi-solids added to the level after your adds and subtracts?  I've seen strange Hall of Mirrors and clipping problems with semi-solids aligned perfectly/overlapping with subtracted and added brushes.
* Take a quick tour of your level in the editor and see if you can re-arrange the order of the brushes (move as many subtracts to the start as you can).  Be careful when doing this - you can shaft your level if you are not careful.
* Do you have zone portals overlapping areas that were subtracted after the zone portal was added?
* Have a look at the [[Legacy:Help Desk|Help Desk]] page - there are some other Hall of Mirrors type problems on there.
:Apart from that, see if you can identify the piece of geometry that is causing the error and either remove it, or see if you can simplify it in some way.  Good luck.

===Random Invisible Collision Hulls and Hall of Mirrors===

'''Question:'''  
:I've got two problems:  1. I have invisible collision hulls randomly appearing in my maps and I can't get rid of them; 2. The dreaded Hall of Mirrors randomly appears too, HELP ME!!!

'''EntropicLqd Answers:'''
:Mmmmm, nice problems.  The worst case I've ever had of Hall of Mirrors and unwanted collisions was when building DOM-Cruising.  The map is based on two boats traveling through the water.  The boats are solid brushes hollowed out to make room for the stuff &quot;below deck&quot;.  The first time I built the map I simply placed a zone portal (for the water) across the entire level.  This gave me the sort of pain you describe.  In the end I had to add my zone, subtract my solid boat brush (to make a boat shaped hole in the zone), and then re-add the boat brush.
:Have you ordered all of your zone portals to be the last things processed?  That can sometimes help.  If you haven't zoned your level yet then consider doing so - Zoning affects the positions Hall of Mirrors and ICHs appear.  Messing about with the order of geometry can also sometimes help - but be careful with it - you can royally screw up your level doing it.
:Are the Hall of Mirrors and ICHs appearing in areas of particular complexity?  If so, can you reduce the compexity of that area?  Have you got any semi-solids intersecting (or with one surface touching) a solid brush?  I've had that cause me real pain (I was building celing lights).

'''Tarquin:''' How on earth can ICHs appear at random? You mean you're getting blocked by invisible stuff? That's a [[Legacy:BSP Hole|BSP Hole]]

'''Ragdoll:''' A good way of detecting collision BSP errors (you fall through a floor) is to enable show paths. Paths will not form over dodgy BSP.

==Comments==

(Attribute to ChrisToth, most, if not all useful information on BSP Holes, causes, diagnostics, and corrective action.)

BSP Holes can also appear after converting a static mesh to a brush, and the problem sometimes does line up with the culprit on one of the three axis points. ''Web Raines''

'''Tarquin''':  There's a lot of very useful technical info that's been moved to the end of it. This stuff needs to be reintegrated here, or in [[Legacy:BSP|BSP]] or [[Legacy:BSP Tree|BSP Tree]]

'''Lucy''': I've been doing some complex geometry that often resultsin inexplicable mapholes. This may not work in all instances for bsp holes, but it's working in mine at least. If a complex piece of brush work is causing BSP holes, I take the complex section and intersect a cube onto it to turn it into a single brush. I turn that single brush into a static mesh and then place the static mesh where I want it. Then, I convert it back into a brush. Align the brush with the static mesh. Delete the mesh, deintersect the brush and add. Seems to work quite effectively. But I worry about any potential performance issues resulting from this. The result has a lot more cuts through the brush, so unless someone can do some stress testing to see how much of a performance hit this is, use it sparingly.

==Related Topics==
* [[Legacy:Hall Of Mirrors|Hall of Mirrors]]
* [[Legacy:BSP Hole Background|BSP Hole Background]] collected on the [http://forums.beyondunreal.com/ BeyondUnreal's General Editing Forum]
* [http://unreal.gamedesign.net/bspfaq.html BSP Frequently Asked Questions]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BSP Hole Background</title>
    <id>553</id>
    <revision>
      <id>1706</id>
      <timestamp>2005-12-29T19:38:10Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Keep &quot;HOM&quot; there for clarity.</comment>
      <text xml:space="preserve">&lt;table bgcolor=&quot;#cccccc&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;font color=black size=+2&gt;The All-Time Most Humongeous BSP Hole Rant&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

----

''Nuclear Fuzz Grunge assembled this information from posts at the BeyondUnreal Editing Forum:''

&quot;In the interests of providing the Planet Unreal Editing Community with hard data on BSP Holes, I have conducted an exhaustive search of past Editing Forum threads on the subject and assembled the most practical and informative posts into an authoritive synopsis. 

The following BSP Intel, from the Illustrious UnrealEdMonger, ''Chris Toth.hu'', is undoubtedly, the ultimate BSP Hole indoctrination: 

OK ... It's the time for answers. The BSP is a data structure indeed, ... it's static too. Rebuilding the BSP creates a binary tree of the geometry of the level. It contains the collision information, hierarchy ... etc of the walls, floors, brush based objects etc. When the engine renders the actual scene of the game it looks for the needed polygons in the BSP tree and ignores the irrelevant ones. (This is occlusion.) The complexity of the local geometry can slow down this process as well as the complexity of the tree at the local geometry. (Vica versa) If your BSP tree is deep then the renderer must search several levels for the needed parts. You can see info about BSP depth in the Rebuild/Level Statistics. BSP cuts build up your binary tree which describes it's parts using the nodes for identification.

The BSP hole is a piece of messed up collision info. It can convert non-colliding space into solid space (You can't walk there) or areas can lose collision (walk-thru-walls). Sometimes it allows you to walk into solid space...and since you cannot exist inside solid space you'll be killed. The borders of the unexisting solid space can reach into walls/floors and it'll prevent the raytracer to light those areas (unlit dark areas) or it can hang into Walls/Floors ... so during the Optimalization phase the area will be treated as unneeded and will be removed. (Black parts/transparent polygons and HOMs (Hall of Mirror effect) ... HOMs are BSP holes on the outer parts of the map where you would see the Grid in the editor ... )

You can see BSP holes in the Zone Portal view and not in the BSP cuts view. (They are easily noticable black streaks or transparent parts.) The last part of the elimination tips ... you can change the settings. And this is sometimes good. It changes the method of creating cuts so you can balance the BSP depth/nodecount with it. I remember Myscha wrote these tips when UEd 1.0 shipped and there were bugs with those rebuild options. They are fixed in UEd 2.0 ... so you can change them as you want. (But those are the Optimal values set by default ... )

''The Unreal Engine uses Binary Space partition trees to store 3 dimensional data.'' So imagine that the whole level is made out of a large sheet of matter. Now you would need to fold the sheet to form rooms, walls ... etc like in origami. This is done by dividing the superspace into numerous sub-spaces by assigning nodes to key locations of the superspace. Then the nodes create convex parts (segments, polygons) from the superspace they can be sorted into a tree. With this method the engine can determine which areas of the map are solid geometry and have collision and which are not. Sometimes the BSP gets messed up and certain parts will lose collision, get collision or partially lose collision. When they lose collision you'll be able to walk through walls fall through floors. If an area gets collision then you won't be able to walk into those areas and it is likely that you will see black polys around those areas, since those polys are &quot;out of the BSP&quot; and they don't get textured this way. If something partially loses collision that means that the borders of the collision are killed and you are able to walk into solid space. Since nothing can exist inside solid space you'll get killed. There are several methods for getting rid of BSP holes. 

* Simplify the geometry in the area.
* Use more semisolids (They don't cut up the BSP so they can't cause BSP errors in solid geometry but they can mess around with other semi-solids and non-solids) 
* Try to reduce node count (semisolids, build settings ... ) 
* If additive brushes get BSP errors then it often helps if you put them to the end of the BSP rebuild sequence. (and sometimes changing them to semisolid too)

(Note: if something is at the end of the queue then if it has subtractions inside then the subtraction will ba applied first and then the added brush will fill the space. So nothing will happen...you'll have the brush unhollowed. You would need to intersect that brush first and add it afterwards. -Zone off the area. This way the geometry inside the zone won't be that complex.) 

''Here's even more excellent advice, concerning the statistic: the Node to Polygon Ratio.''

An average proportion of 2 or 3 nodes per poly is still good but don't let it go higher because it makes your map slower and it increases the possibility of getting BSP holes.

''Advice concerning the Build Options sliders (in the Properties Window)''

The sliders (Build Options) should be your last solution. Try changing brush order, solidity, adjusting brush locations (Align everything to the grid!). Try to keep things simple. If it's high poly and complex then it'll cause high nodecounts as well. If the nodecounts are high, then: 

# It will play like crap, and 
# It'll create a complex BSP data structure that can result in BSP holes. 

Change it's solidity to semi-solid. This will reduce the nodecount and it will probably make any BSP hole disappear. If it's not caused by the nodecount but by the complexity of the brush then you can't do too much about it ... you need to make it less-complex. It's like trying to build a sphere with a large extrapolation. Don't use spheres with large Extrapolation ... they are difficulties for the BSP compiler.It will nuke your BSP. If nothing helped then use the sliders! Push the first slider towards Limit cuts ... 12 or 13 usually does the trick.

----

Much Appreciation to ''ChrisToth.hu''.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:Hall Of Mirrors|Hall Of Mirrors]] (aka, ''HOM'')
* [[Legacy:Troubleshooting|Troubleshooting]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1707</id>
      <timestamp>2005-12-29T16:59:08Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>HOM -&gt; Hall Of Mirrors</comment>
      <text xml:space="preserve">&lt;table bgcolor=&quot;#cccccc&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;font color=black size=+2&gt;The All-Time Most Humongeous BSP Hole Rant&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

----

''Nuclear Fuzz Grunge assembled this information from posts at the BeyondUnreal Editing Forum:''

&quot;In the interests of providing the Planet Unreal Editing Community with hard data on BSP Holes, I have conducted an exhaustive search of past Editing Forum threads on the subject and assembled the most practical and informative posts into an authoritive synopsis. 

The following BSP Intel, from the Illustrious UnrealEdMonger, ''Chris Toth.hu'', is undoubtedly, the ultimate BSP Hole indoctrination: 

OK ... It's the time for answers. The BSP is a data structure indeed, ... it's static too. Rebuilding the BSP creates a binary tree of the geometry of the level. It contains the collision information, hierarchy ... etc of the walls, floors, brush based objects etc. When the engine renders the actual scene of the game it looks for the needed polygons in the BSP tree and ignores the irrelevant ones. (This is occlusion.) The complexity of the local geometry can slow down this process as well as the complexity of the tree at the local geometry. (Vica versa) If your BSP tree is deep then the renderer must search several levels for the needed parts. You can see info about BSP depth in the Rebuild/Level Statistics. BSP cuts build up your binary tree which describes it's parts using the nodes for identification.

The BSP hole is a piece of messed up collision info. It can convert non-colliding space into solid space (You can't walk there) or areas can lose collision (walk-thru-walls). Sometimes it allows you to walk into solid space...and since you cannot exist inside solid space you'll be killed. The borders of the unexisting solid space can reach into walls/floors and it'll prevent the raytracer to light those areas (unlit dark areas) or it can hang into Walls/Floors ... so during the Optimalization phase the area will be treated as unneeded and will be removed. (Black parts/transparent polygons and HOMs (Hall of Mirror effect) ... HOMs are BSP holes on the outer parts of the map where you would see the Grid in the editor ... )

You can see BSP holes in the Zone Portal view and not in the BSP cuts view. (They are easily noticable black streaks or transparent parts.) The last part of the elimination tips ... you can change the settings. And this is sometimes good. It changes the method of creating cuts so you can balance the BSP depth/nodecount with it. I remember Myscha wrote these tips when UEd 1.0 shipped and there were bugs with those rebuild options. They are fixed in UEd 2.0 ... so you can change them as you want. (But those are the Optimal values set by default ... )

''The Unreal Engine uses Binary Space partition trees to store 3 dimensional data.'' So imagine that the whole level is made out of a large sheet of matter. Now you would need to fold the sheet to form rooms, walls ... etc like in origami. This is done by dividing the superspace into numerous sub-spaces by assigning nodes to key locations of the superspace. Then the nodes create convex parts (segments, polygons) from the superspace they can be sorted into a tree. With this method the engine can determine which areas of the map are solid geometry and have collision and which are not. Sometimes the BSP gets messed up and certain parts will lose collision, get collision or partially lose collision. When they lose collision you'll be able to walk through walls fall through floors. If an area gets collision then you won't be able to walk into those areas and it is likely that you will see black polys around those areas, since those polys are &quot;out of the BSP&quot; and they don't get textured this way. If something partially loses collision that means that the borders of the collision are killed and you are able to walk into solid space. Since nothing can exist inside solid space you'll get killed. There are several methods for getting rid of BSP holes. 

* Simplify the geometry in the area.
* Use more semisolids (They don't cut up the BSP so they can't cause BSP errors in solid geometry but they can mess around with other semi-solids and non-solids) 
* Try to reduce node count (semisolids, build settings ... ) 
* If additive brushes get BSP errors then it often helps if you put them to the end of the BSP rebuild sequence. (and sometimes changing them to semisolid too)

(Note: if something is at the end of the queue then if it has subtractions inside then the subtraction will ba applied first and then the added brush will fill the space. So nothing will happen...you'll have the brush unhollowed. You would need to intersect that brush first and add it afterwards. -Zone off the area. This way the geometry inside the zone won't be that complex.) 

''Here's even more excellent advice, concerning the statistic: the Node to Polygon Ratio.''

An average proportion of 2 or 3 nodes per poly is still good but don't let it go higher because it makes your map slower and it increases the possibility of getting BSP holes.

''Advice concerning the Build Options sliders (in the Properties Window)''

The sliders (Build Options) should be your last solution. Try changing brush order, solidity, adjusting brush locations (Align everything to the grid!). Try to keep things simple. If it's high poly and complex then it'll cause high nodecounts as well. If the nodecounts are high, then: 

# It will play like crap, and 
# It'll create a complex BSP data structure that can result in BSP holes. 

Change it's solidity to semi-solid. This will reduce the nodecount and it will probably make any BSP hole disappear. If it's not caused by the nodecount but by the complexity of the brush then you can't do too much about it ... you need to make it less-complex. It's like trying to build a sphere with a large extrapolation. Don't use spheres with large Extrapolation ... they are difficulties for the BSP compiler.It will nuke your BSP. If nothing helped then use the sliders! Push the first slider towards Limit cuts ... 12 or 13 usually does the trick.

----

Much Appreciation to ''ChrisToth.hu''.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:Hall Of Mirrors|Hall Of Mirrors]]
* [[Legacy:Troubleshooting|Troubleshooting]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BSP Tree</title>
    <id>549</id>
    <revision>
      <id>1697</id>
      <timestamp>2003-08-14T19:24:54Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <comment>A little more information for the diagram</comment>
      <text xml:space="preserve">==Introduction and Background ==

&lt;br /&gt;

Binary Space Partioning (BSP)-trees were first described in 1969 by Shumacker et al., it was hardly meant to be an algorithm used to develop entertainment products, but since the beginning of the 1990’s BSP-trees have been used in the gaming industry to improve performance and make it possible to use more details in the maps . The first game ever to use the technology was Doom, created by John Carmack and John Romero, two legends in the gaming industry. Since then almost all First Person Shooting (FPS) games have been using that technique. 

BSP trees were first introduced to solve the hidden surface removal problem in real time. The original concept was developed for a static scene with a changing viewpoint; the classic computer game application, and it works as a two-phase process. In the first phase a BSP tree of the scene is constructed (once during the level build) and in the second phase the viewpoint is compared with this structure to determine visibility. BSP trees are not a graphic object representation, but a way of partitioning space so that we can solve certain rendering requirements in an efficient manner.

The need of removing polygons that are not visible has always been extremely high in the gaming industry, even though graphic cards evolve at gigantic rates and things that were true a couple years ago are not even remotely true these days. When a game is created a goal frame rate is set. The lowest acceptable rate on a target system use to be around 30 frames/second. A couple of years ago this meant putting out over 5000 textured polygons per frame could be too much. These days there are graphic cards in the market with the ability to draw hundreds of million of polygons per second during optimal conditions. Still there is a need of removing hidden parts. Why? Each hidden polygon that is drawn could be replaced by a polygon that is visible, hence increasing the detail in the scenes, making the game visually more attractive. The question is how far one should go to remove hidden polygons. To remove a hidden part heavy computations are needed to be done, such as view frustum culling and portal  rendering. The CPU-time used to do these computations could be used to enhance other effects in the game, such as AI and collision detection. Hence there is a lot to take in to consideration when developing algorithms for removal of hidden surfaces. There are almost no games that go so far as to remove each polygon that is hidden. Most games are satisfied with the removal of whole sets of polygons, such as nodes, objects etc. They do not consider individual polygons, so it seems like the correct way to go is to accept some overdraw to limit the computations when removing hidden surfaces. 

In reality, most computer graphics and three dimensional games applications are made up of scenes where the object compexity (number of polygons per object) is much greater than the scene complexity (number of objects per scene) and for the BSP Tree approach to be useful we have to deal with the polygons within objects rather than entire objects. 

BSP trees are an extension of the painter's algorithm; which works by drawing all the polygons in a scene in back-to-front order, so that polygons in the background are drawn first, and polygons in the foreground are drawn over them.

A Binary Space Partition Tree (BSP Tree) is a very effective method to render scenes in a 3 dimensional game envoironment. A transversal of the BSP tree determines which objects in a scene are furthest from the camera. After which, the Game Engine will render the polygons in the order of furthest to closest, employing occlusion correctly, so that the player sees everything in a realistic manner.
 

A BSP Tree sorts the polygons into a tree of nodes quickly and efficiently at loadup, so then we can easily know which

polygons are furthest from the camera at run-time.

&lt;br&gt;

==The Unreal Engine Core BSP Build Process ==

So, here's the explanation of the Unreal Engine BSP in a nutshell.
 

An average Unreal Tournament Level consists of several thousand polygons and only about 200-400 are on screen in each frame. This is a small portion of the overall polycount and the engine has to determine which polys are visible and which are not. The Unreal engine uses a data structure, the ''BSP'' (''B''inary ''S''pace ''P''artition) for this process.

When you rebuild the BSP the BSP compiler starts splitting up the level. First it splits it into two halves, then it bisects these two halves and the resulting ones as well and so on...until it gets a very small split where a threshold facecount is reached. (and preferably it's convex) The cut planes are determined by the ''nodes'' which are assigned during the BSP compiling based brush geometry. 

The parent child relation of the cuts shows a tree structure which can be used for the visibility checking of the polys. (-&gt; Z-Buffering) 

Example:

You have a box which is split into four halves by bisecting the box and the resulting smaller boxes. 
* Box
** A
*** A1 
*** A2
** B
*** B1 
*** B2

If you see only A1 then the whole B branch can be ignored. And the children of A2 as well. (If they existed) You can see that it's a fast process this way.

Here's another example of a BSP tree in 2D:

[[Image:Legacy_bsp_diagram.gif|center|numbers are &quot;nodes&quot;, letters are leaves.  Note that nodes 5 and 8 combine to form a single polygon edge.]]

The BSP is also used for collision detection. See also [[Legacy:BSP Hole|BSP Hole]].

All solid and subtracted brushes use the BSP so they create BSP cuts and raise the nodecount. As you see the example I've shown you was really simple but if we are talking about thousands of polys then the amount of nodes is a very important influencing factor of the framerate. If you see more cuts the engine has to compute more to get the visible polys. In addition to this if the BSP is too complex you'll have greater chances for getting BSP holes.

The position of the cuts is also important. If their placement gets unbalanced then the resulting BSP tree will be deeper but less nodes will be needed. This means that the overall nodecount will be lower but some places of your map will have high occlusion times thus low framerates. The over-balanced tree is the other side of the problem.

You can control the cut balance through the Rebuild Options' first slider in UnrealEd, although it's generally not advisable to mess around with those settings because they are already set to the optimal values.

The second slider controls the priority of Portals when choosing the cut planes. A high priority will solve zoning issues where the zone portal can separate the two zones properly but it will break the &quot;natural balance&quot; of the tree. If you lower the priority then the portals won't alter the tree that much but you will get leaky zones.

Messing with these sliders, however, should be reserved for the High Wizards of UnrealEd.  The default settings are almost always near-optimal and significant deviation from them can send your map into [[Legacy:BSP Hole|BSP Hole]] or performance hell.

[[Legacy:Semisolid|Semisolid]] and [[Legacy:Nonsolid|nonsolid]] brushes don't create cuts in the BSP so they can be used for decorations without the risk of getting high nodecounts. On the other hand they can't hide objects behind them through the BSP so their rendering can be slower than for large solid brushes. They can also create collision errors for the same reason.

The BSP Tree is a static data structure, (it is pre-determined before the Level Map loads in Unreal Tournament), and stores information only about non-movable constructive solid geometry. Movers are not incorporated in the Level BSP Tree.

That's it for now. If I made mistakes or you have additions edit it...:)

I hope it's clear.

'''inio:''' seemed pretty clear, though there's a lot more going on for visibility determination than you talk about (it's actually a front-to-back process IIRC).  Classically (pre-DOOM) BSPs were used only for depth sorting in early flat-shaded games and CAD apps as the sorting stage of a painter's algo, so you're correct to that extent.

----

==BSP Tree Frequently Asked Questions ==

For more information on BSP Tree Methods, read this website page on: [ftp://ftp.sgi.com/other/bspfaq/faq/bspfaq.html BSP Frequently Asked Questions]&lt;br&gt;

----

An excellent technical paper on the BSP Tree process as used in 3D games can be found at:

[http://www.flipcode.com/misc/SamuelRanta-Eskola_BSPTrees.pdf Binary Space Partitioning Trees and Polygon Removal in Real Time 3D Rendering]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1698</id>
      <timestamp>2003-07-15T17:17:33Z</timestamp>
      <contributor>
        <ip>Proxym.medical-intern.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction and Background ==

&lt;br /&gt;

Binary Space Partioning (BSP)-trees were first described in 1969 by Shumacker et al., it was hardly meant to be an algorithm used to develop entertainment products, but since the beginning of the 1990’s BSP-trees have been used in the gaming industry to improve performance and make it possible to use more details in the maps . The first game ever to use the technology was Doom, created by John Carmack and John Romero, two legends in the gaming industry. Since then almost all First Person Shooting (FPS) games have been using that technique. 

BSP trees were first introduced to solve the hidden surface removal problem in real time. The original concept was developed for a static scene with a changing viewpoint; the classic computer game application, and it works as a two-phase process. In the first phase a BSP tree of the scene is constructed (once during the level build) and in the second phase the viewpoint is compared with this structure to determine visibility. BSP trees are not a graphic object representation, but a way of partitioning space so that we can solve certain rendering requirements in an efficient manner.

The need of removing polygons that are not visible has always been extremely high in the gaming industry, even though graphic cards evolve at gigantic rates and things that were true a couple years ago are not even remotely true these days. When a game is created a goal frame rate is set. The lowest acceptable rate on a target system use to be around 30 frames/second. A couple of years ago this meant putting out over 5000 textured polygons per frame could be too much. These days there are graphic cards in the market with the ability to draw hundreds of million of polygons per second during optimal conditions. Still there is a need of removing hidden parts. Why? Each hidden polygon that is drawn could be replaced by a polygon that is visible, hence increasing the detail in the scenes, making the game visually more attractive. The question is how far one should go to remove hidden polygons. To remove a hidden part heavy computations are needed to be done, such as view frustum culling and portal  rendering. The CPU-time used to do these computations could be used to enhance other effects in the game, such as AI and collision detection. Hence there is a lot to take in to consideration when developing algorithms for removal of hidden surfaces. There are almost no games that go so far as to remove each polygon that is hidden. Most games are satisfied with the removal of whole sets of polygons, such as nodes, objects etc. They do not consider individual polygons, so it seems like the correct way to go is to accept some overdraw to limit the computations when removing hidden surfaces. 

In reality, most computer graphics and three dimensional games applications are made up of scenes where the object compexity (number of polygons per object) is much greater than the scene complexity (number of objects per scene) and for the BSP Tree approach to be useful we have to deal with the polygons within objects rather than entire objects. 

BSP trees are an extension of the painter's algorithm; which works by drawing all the polygons in a scene in back-to-front order, so that polygons in the background are drawn first, and polygons in the foreground are drawn over them.

A Binary Space Partition Tree (BSP Tree) is a very effective method to render scenes in a 3 dimensional game envoironment. A transversal of the BSP tree determines which objects in a scene are furthest from the camera. After which, the Game Engine will render the polygons in the order of furthest to closest, employing occlusion correctly, so that the player sees everything in a realistic manner.
 

A BSP Tree sorts the polygons into a tree of nodes quickly and efficiently at loadup, so then we can easily know which

polygons are furthest from the camera at run-time.

&lt;br&gt;

==The Unreal Engine Core BSP Build Process ==

So, here's the explanation of the Unreal Engine BSP in a nutshell.
 

An average Unreal Tournament Level consists of several thousand polygons and only about 200-400 are on screen in each frame. This is a small portion of the overall polycount and the engine has to determine which polys are visible and which are not. The Unreal engine uses a data structure, the ''BSP'' (''B''inary ''S''pace ''P''artition) for this process.

When you rebuild the BSP the BSP compiler starts splitting up the level. First it splits it into two halves, then it bisects these two halves and the resulting ones as well and so on...until it gets a very small split where a threshold facecount is reached. (and preferably it's convex) Th cut planes are determined by the ''nodes'' which are assigned during the BSP compiling. 

The parent child relation of the cuts shows a tree structure which can be used for the visibility checking of the polys. (-&gt; Z-Buffering) 

Example:

You have a box which is split into four halves by bisecting the box and the resulting smaller boxes. 
* Box
** A
*** A1 
*** A2
** B
*** B1 
*** B2

If you see only A1 then the whole B branch can be ignored. And the children of A2 as well. (If they existed) You can see that it's a fast process this way.

The BSP is also used for collision detection. See also [[Legacy:BSP Hole|BSP Hole]].

All solid and subtracted brushes use the BSP so they create BSP cuts and raise the nodecount. As you see the example I've shown you was really simple but if we are talking about thousands of polys then the amount of nodes is a very important influencing factor of the framerate. If you see more cuts the engine has to compute more to get the visible polys. In addition to this if the BSP is too complex you'll have greater chances for getting BSP holes.

[[Legacy:Semisolid|Semisolid]] and [[Legacy:Nonsolid|nonsolid]] brushes don't create cuts in the BSP so they can be used for decorations without the risk of getting high nodecounts. On the other hand their visibility can't be checked through the BSP so their rendering is slower than for solid brushes. They can create collision errors due to the same reason.

The position of the cuts is also important. If their placement gets unbalanced then the resulting BSP tree will be deeper but less nodes will be needed. This means that the overall nodecount will be lower but some places of your map will have high occlusion times thus low framerates. The over-balanced tree is the other side of the problem.

You can control the cut balance through the Rebuild Options' first slider in UnrealEd, although it's generally not advisable to mess around with those settings because they are already set to the optimal values.

The second slider controls the priority of Portals when choosing the cut planes. A high priority will solve zoning issues where the zone portal can separate the two zones properly but it will break the &quot;natural balance&quot; of the tree. If you lower the priority then the portals won't alter the tree that much but you will get leaky zones.

The BSP Tree is a static data structure, (it is pre-determined before the Level Map loads in Unreal Tournament), and stores information only about non-movable constructive solid geometry. Movers are not incorporated in the Level BSP Tree.

That's it for now. If I made mistakes or you have additions edit it...:)

I hope it's clear.

----

==BSP Tree Frequently Asked Questions ==

For more information on BSP Tree Methods, read this website page on: [ftp://ftp.sgi.com/other/bspfaq/faq/bspfaq.html BSP Frequently Asked Questions]&lt;br&gt;

----

An excellent technical paper on the BSP Tree process as used in 3D games can be found at:

[http://www.flipcode.com/misc/SamuelRanta-Eskola_BSPTrees.pdf Binary Space Partitioning Trees and Polygon Removal in Real Time 3D Rendering]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1699</id>
      <timestamp>2003-08-13T08:09:17Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction and Background ==

&lt;br /&gt;

Binary Space Partioning (BSP)-trees were first described in 1969 by Shumacker et al., it was hardly meant to be an algorithm used to develop entertainment products, but since the beginning of the 1990’s BSP-trees have been used in the gaming industry to improve performance and make it possible to use more details in the maps . The first game ever to use the technology was Doom, created by John Carmack and John Romero, two legends in the gaming industry. Since then almost all First Person Shooting (FPS) games have been using that technique. 

BSP trees were first introduced to solve the hidden surface removal problem in real time. The original concept was developed for a static scene with a changing viewpoint; the classic computer game application, and it works as a two-phase process. In the first phase a BSP tree of the scene is constructed (once during the level build) and in the second phase the viewpoint is compared with this structure to determine visibility. BSP trees are not a graphic object representation, but a way of partitioning space so that we can solve certain rendering requirements in an efficient manner.

The need of removing polygons that are not visible has always been extremely high in the gaming industry, even though graphic cards evolve at gigantic rates and things that were true a couple years ago are not even remotely true these days. When a game is created a goal frame rate is set. The lowest acceptable rate on a target system use to be around 30 frames/second. A couple of years ago this meant putting out over 5000 textured polygons per frame could be too much. These days there are graphic cards in the market with the ability to draw hundreds of million of polygons per second during optimal conditions. Still there is a need of removing hidden parts. Why? Each hidden polygon that is drawn could be replaced by a polygon that is visible, hence increasing the detail in the scenes, making the game visually more attractive. The question is how far one should go to remove hidden polygons. To remove a hidden part heavy computations are needed to be done, such as view frustum culling and portal  rendering. The CPU-time used to do these computations could be used to enhance other effects in the game, such as AI and collision detection. Hence there is a lot to take in to consideration when developing algorithms for removal of hidden surfaces. There are almost no games that go so far as to remove each polygon that is hidden. Most games are satisfied with the removal of whole sets of polygons, such as nodes, objects etc. They do not consider individual polygons, so it seems like the correct way to go is to accept some overdraw to limit the computations when removing hidden surfaces. 

In reality, most computer graphics and three dimensional games applications are made up of scenes where the object compexity (number of polygons per object) is much greater than the scene complexity (number of objects per scene) and for the BSP Tree approach to be useful we have to deal with the polygons within objects rather than entire objects. 

BSP trees are an extension of the painter's algorithm; which works by drawing all the polygons in a scene in back-to-front order, so that polygons in the background are drawn first, and polygons in the foreground are drawn over them.

A Binary Space Partition Tree (BSP Tree) is a very effective method to render scenes in a 3 dimensional game envoironment. A transversal of the BSP tree determines which objects in a scene are furthest from the camera. After which, the Game Engine will render the polygons in the order of furthest to closest, employing occlusion correctly, so that the player sees everything in a realistic manner.
 

A BSP Tree sorts the polygons into a tree of nodes quickly and efficiently at loadup, so then we can easily know which

polygons are furthest from the camera at run-time.

&lt;br&gt;

==The Unreal Engine Core BSP Build Process ==

So, here's the explanation of the Unreal Engine BSP in a nutshell.
 

An average Unreal Tournament Level consists of several thousand polygons and only about 200-400 are on screen in each frame. This is a small portion of the overall polycount and the engine has to determine which polys are visible and which are not. The Unreal engine uses a data structure, the ''BSP'' (''B''inary ''S''pace ''P''artition) for this process.

When you rebuild the BSP the BSP compiler starts splitting up the level. First it splits it into two halves, then it bisects these two halves and the resulting ones as well and so on...until it gets a very small split where a threshold facecount is reached. (and preferably it's convex) The cut planes are determined by the ''nodes'' which are assigned during the BSP compiling based brush geometry. 

The parent child relation of the cuts shows a tree structure which can be used for the visibility checking of the polys. (-&gt; Z-Buffering) 

Example:

You have a box which is split into four halves by bisecting the box and the resulting smaller boxes. 
* Box
** A
*** A1 
*** A2
** B
*** B1 
*** B2

If you see only A1 then the whole B branch can be ignored. And the children of A2 as well. (If they existed) You can see that it's a fast process this way.

Here's another example of a BSP tree in 2D:

[[Image:Legacy_bsp_diagram.gif|center|numbers are &quot;nodes&quot;, letters are leaves.]]

The BSP is also used for collision detection. See also [[Legacy:BSP Hole|BSP Hole]].

All solid and subtracted brushes use the BSP so they create BSP cuts and raise the nodecount. As you see the example I've shown you was really simple but if we are talking about thousands of polys then the amount of nodes is a very important influencing factor of the framerate. If you see more cuts the engine has to compute more to get the visible polys. In addition to this if the BSP is too complex you'll have greater chances for getting BSP holes.

The position of the cuts is also important. If their placement gets unbalanced then the resulting BSP tree will be deeper but less nodes will be needed. This means that the overall nodecount will be lower but some places of your map will have high occlusion times thus low framerates. The over-balanced tree is the other side of the problem.

You can control the cut balance through the Rebuild Options' first slider in UnrealEd, although it's generally not advisable to mess around with those settings because they are already set to the optimal values.

The second slider controls the priority of Portals when choosing the cut planes. A high priority will solve zoning issues where the zone portal can separate the two zones properly but it will break the &quot;natural balance&quot; of the tree. If you lower the priority then the portals won't alter the tree that much but you will get leaky zones.

Messing with these sliders, however, should be reserved for the High Wizards of UnrealEd.  The default settings are almost always near-optimal and significant deviation from them can send your map into [[Legacy:BSP Hole|BSP Hole]] or performance hell.

[[Legacy:Semisolid|Semisolid]] and [[Legacy:Nonsolid|nonsolid]] brushes don't create cuts in the BSP so they can be used for decorations without the risk of getting high nodecounts. On the other hand they can't hide objects behind them through the BSP so their rendering can be slower than for large solid brushes. They can also create collision errors for the same reason.

The BSP Tree is a static data structure, (it is pre-determined before the Level Map loads in Unreal Tournament), and stores information only about non-movable constructive solid geometry. Movers are not incorporated in the Level BSP Tree.

That's it for now. If I made mistakes or you have additions edit it...:)

I hope it's clear.

'''inio:''' seemed pretty clear, though there's a lot more going on for visibility determination than you talk about (it's actually a front-to-back process IIRC).  Classically (pre-DOOM) BSPs were used only for depth sorting in early flat-shaded games and CAD apps as the sorting stage of a painter's algo, so you're correct to that extent.

----

==BSP Tree Frequently Asked Questions ==

For more information on BSP Tree Methods, read this website page on: [ftp://ftp.sgi.com/other/bspfaq/faq/bspfaq.html BSP Frequently Asked Questions]&lt;br&gt;

----

An excellent technical paper on the BSP Tree process as used in 3D games can be found at:

[http://www.flipcode.com/misc/SamuelRanta-Eskola_BSPTrees.pdf Binary Space Partitioning Trees and Polygon Removal in Real Time 3D Rendering]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP Item 01 Building A Preview Map</title>
    <id>675</id>
    <revision>
      <id>1976</id>
      <timestamp>2008-02-23T19:52:57Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Note: This page needs to be edited to reflect the downloadable file - they do not match''

===A quick test level to see our mesh in game===

Ok one more material to paint the ground with is needed, I used the setup shown in '''Tile #01'''...

''If over the next bit you only see a black screen in your render viewport, try turning the lighting mode (in the bar across the top of the actual render view port) to unlit mode''

Minimize the Generic Browser, and make a Cube Brush that is X 2048, Y 2048, Z 2

Add the brush, right click it, and then Select All Surfaces, expand the Generic Browser, and apply the texture by selecting the Soil Texture we just made, then select the steam vent, and shut the Generic Browser, right-click on the ground in roughly the middle, Add Actor, and then choose to Add the Static Mesh (should be the one at the top of the list).

Move it to desired location, ensuring that the square base is burried one unit below the ground, you will likely have to drop the drag grid to do this, it is under View in the menu bar, I needed to drop it to one, unless you want real headaches in the process of level desgin, never turn the draw grid off, at least when trying to get things to aline, sometimes, especially with meshes you might have to take it off - just to get that extra look of perfection, but not this time ;)

Finally a light and a sky are needed. Select the Generic Browser again, and go to the tab at the top which is called Actors, slide down to the entry called Light, expand it, and select SkyLight, Right click anywhere on the ground and add the light to illuminate the scene. Go back to the Generic Browser ''(don't forget to move back to the Generic tab at the top)'', and under the file menu, open, and provided you installed to the default place, you will find UN-Sky under the following directory tree, C:/Program Files/Unreal Tournament 3/UT Game/CookedPC/Environments, open it, and then look for it in the list at the bottom left of the Generic Browser, click it, search for a good sky, like S_UN_Sky_SM_SkyDome03, drop it on your terrain with the right click, and add actor that we did with the steam vent (exactly the same), move it down, so that from roughly eye level you can't see the black, the black area causes a wierd feedback when it is visible, it looks horrible, but we are only testing this mesh, not building a level, and this should suffice to view it in the editor.

Up in the top tool bar, click the Build All button (a cube with a light bulb on it) You will prolly get a few warnings, they are unimportant for this task, right click on the ground some where, and go to the option in the drop down menu that reads ''Play From Here (Ctrl Spectates)''

You should have a pretty good idea of how it looks from with in the game now, don't fall off the edge :p (See '''Tile #02''').

As a final thought I decided that 3 variants of the mesh would be required to stop the players eye from bleeding, below in '''Tile #03''' is an example of what I made....

===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

===Image Tiles===

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_12.jpeg|center|Tile #01: Nothing that exciting...]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_13.jpeg|center|Tile #02: Pew Pew Pew!!!]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_14.jpeg|center|Tile #03: A room for testing the steam vents, untweaked lights have been placed to give it a bit of a better feel, the meshes have also been scaled and rotated to add to varience]]</text>
    </revision>
    <revision>
      <id>1977</id>
      <timestamp>2008-02-23T19:46:39Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP Item 01 Cascade Particles</title>
    <id>674</id>
    <revision>
      <id>1974</id>
      <timestamp>2008-02-23T19:51:38Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''ToDo: Add more images of the Cascade particle emitter browser, showing the steps described in this section.''

First thing I need to do is make the particle material. I use the setup shown in '''Tiles #01 and #02'''

I gave all the rotators different speeds, ranging for about 15 to 25, some of them I made negative to increase the turbulance. Everything else I left at default values. ''Note: the textures are using the channels independantly, the first texturesample connects using the red channel, the second the green, and the third is connected to the blue.''

By adding these 3 values and dividing to get the average I combine them to produce a swirling nebulous looing particle, the shade of grey is also independant to the transparency of the sprite, and the rotator values for each color channel should be set to quite different speeds.

After connection the 1st block to the emmisive channel, and the second to the opacity, I click the main block (where te other blocks output connects too) and change the global properties of the material.

BlendMode should be BLEND_Additive, so that the combined textures are added together.

LightingModel should be set to MLM_Unlit.

The particle is done, I click the left most green tick at the top, then close the material editor.

Next you can either right-click in the preview panel, or go through the File menu to make a new ''ParticleSystem'', after a few seconds cascade should open, if it doesn't double click the new ParticleSystem you have just made to open the editor.

In the pannel on the top right, Right-Click and add a new ''ParticleSpriteEmmiter''.

Making sure the Particle Emmiter is selected in the top right, go down to the bottom and left and change the following properties...

RequiredModule -&gt; bUseLocalSpace ''to Checked''

RequiredModule -&gt; SpawnRate -&gt; Constant ''to about 25''

In the top right select the LifeTime tab, and change these properties...

Lifetime -&gt; Distribution -&gt; Min ''to 2.5''

Lifetime -&gt; Distribution -&gt; Max ''to 3.0''

The next tab in the top right is Initial Size, select it and change the following...

StartSize -&gt; Distrbution -&gt; Max -&gt; X ''to 256''

StartSize -&gt; Distrbution -&gt; Max -&gt; Y ''to 256''

StartSize -&gt; Distrbution -&gt; Max -&gt; Z ''to 256''

StartSize -&gt; Distrbution -&gt; Min -&gt; X ''to 224''

StartSize -&gt; Distrbution -&gt; Min -&gt; Y ''to 224''

StartSize -&gt; Distrbution -&gt; Min -&gt; Z ''to 224''

For Initial Velocity in the top right, change the following in the bottom left...

StartVelocity -&gt; Distrbution -&gt; Max -&gt; X ''to 8''

StartVelocity -&gt; Distrbution -&gt; Max -&gt; Y ''to 8''

StartVelocity -&gt; Distrbution -&gt; Max -&gt; Z ''to 160''

StartVelocity -&gt; Distrbution -&gt; Max -&gt; X ''to -8''

StartVelocity -&gt; Distrbution -&gt; Max -&gt; Y ''to -8''

StartVelocity -&gt; Distrbution -&gt; Max -&gt; Z ''to 128''

In the top right you will now need to right-click directly below the list item in the list and add '''Location -&gt; Initial Location'', this will allow us to determine where the objects will spawn, I have used the following values in the bottom left...

StartLocation -&gt; Disxtribution -&gt; Max -&gt; X ''to 2''

StartLocation -&gt; Disxtribution -&gt; Max -&gt; Y ''to 2''

StartLocation -&gt; Disxtribution -&gt; Max -&gt; Z ''to 2''

StartLocation -&gt; Disxtribution -&gt; Min -&gt; X ''to -2''

StartLocation -&gt; Disxtribution -&gt; Min -&gt; Y ''to -2''

StartLocation -&gt; Disxtribution -&gt; Min -&gt; Z ''to -2''

To make the fog fade out, we need to add a '''Color -&gt; Color Over Life''' to the list in the top left. You will then need to look for a button on the new '''Color Over Life''' tab, it looks like a green squigly line, and is on the top most right hand side of the tab. this will add a graph in the bottom right.

Going over to the bottom left section of the screen, you will see a little blue triangle pointing down on the farthest most right hand side of '''ColorOverLife -&gt; Distribution''', left click this and select '''DistributionVectorConstantCurve'''.

On the right where the graph is, hide the color graph by removing the yellow dot on the right of the tab named ColorOverLife, and ensure that the AlphaOverLife has a dot on the right hand side. Then using right click on the almost purple line, add a node, and move it to about 0.1,0, so that the particles start their alpha at about 0.25, add another node, and move it to 1,0, so that by the time the particle has reached the end of it's life it's alpha equals 0 or totally invisible.

Another tab needs to be added to the top right called '''Size -&gt; Size By Life''', add it's graph by clicking the squigly line on the right, in the bottom left some properties need to be changed...

LifeMultiplier -&gt; Distribution -&gt; ConstantCurve -&gt; LockedAxes ''to EDVLF_XYZ''

With the LifeMultiplier -&gt; Distribution, click the blue triangle pointing down and select '''DistributionVectorConstantCurve''', and on the bottom right pannel, where the graphs are make sure the only thing visible is the LifeMultiplier graph, by ensuring it is the only one with a yellow dot in the right side of it.

Add a node on the graph, and move it to around 0.1,0 - then add another and move it to 1,1 - this will make the steam start at off with a 0.1 multiplier, gradually rising to 1.0, making it grow as it rises, combining this with the alpha, it should also fade out as well.

Manipulate the image in the top left till you have a view you like, and go to the menu bar and select '''View -&gt; Save Cam Position''', then close the editor.

By selecting this emmiter in the Generic Tab of the Generic Browser, and the Emitter actor in the Actor tab, you can then right click and add these to the ground in the 3D render preview of the toolset.

===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Building A Preview Map|BaSCP Item 01 Building a Preview Map]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_15.jpeg|center|Tile #01: The methods I use to make the emissive channel for the steam sprites.]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_16.jpeg|center|Tile #02: The methods I use to make the opacity channel for the steam sprites.]]</text>
    </revision>
    <revision>
      <id>1975</id>
      <timestamp>2008-02-23T19:46:19Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Building A Preview Map|BaSCP Item 01 Building a Preview Map]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP Item 01 Mesh Import</title>
    <id>673</id>
    <revision>
      <id>1972</id>
      <timestamp>2008-02-23T19:50:48Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===UT3 Mesh Import===

First of all you need to export the mesh from 3DS Max, I'm not going to go into details on how to use the file system, but the settings I use for the actuall export are shown in '''Tile #01'''... (You need to export as .ASE file (the ascii file format))

====Getting back to the textures I used...====

You will notice that I have also in the following example made normal maps, the soil normal map was made by running through some erosion filters in texture maker, then converting it to grey scale, maximizing contrast, and finally being converted to a noraml map by using [http://developer.nvidia.com/object/photoshop_dds_plugins.html Nvidia DDS Tools plugin for Photoshop], this normal map is what will give the texture its rough surfaced 3D look. See '''Tile #02, and #03'''.

====And on with the importing...====

Ok, I start up the editor, and when it has loaded, I make a new ''Additive'' level, I save it, and give it a name such as '''DM-Test''', I open the generic browser, and click import under the file menu, and select both textures (all 4 in my case because I have normal maps), I also take the time and care not to click OK to all, I have no idea why I do this, it just seems logical to me, but I ensure that the ''CompressionSettings'' drop down is set to TC_Default for regular textures, and ''TC_NormalMap'' for normal maps and I do the same for ''LODGroup''. I also import the mesh.

The name you give to the Package is important, when making a map, wether it be a DeathMatch or other type, you should always have your content stored in a package which is the same name.

In these tutorials however, I am breaking from this standard, for one main reason, mainly I have not started my level yet, and I want to keep my content in one main file, I am naming my package ''ASphinx-Content'', keep in mind, that when I do start making my level though, I intend to '''Duplicate''' the content that I use to a file that matches the levels name. Unless you intend making a content pack, '''**do not**''' distribute your content file ''e.g.(ASphinx-Content)'' with your map, if your map don't work without this content file, then you have done something wrong when assigning a material, texture, or something else to your level, also ''be aware'' this method also increases overhead, if you want to speed and refine the process, import/create your content directly into a file of the same name as your map ''(eg. If DM-Siesmic is the name of the map, then DM-Siesmic should also be the name of your content package)''.

As for the group, it is like a sub-directory, or a folder to contain various things you import, much like your computers filesystem, it is mainly used for catagorizing the things you import to speed up searching for things, you could just have textures and meshes as your groups, or you could use DiffuseTextures, NormalMaps, and Meshes as your groups, it really doesn't matter, and is left to personal preference.

I make a new material called SteamVent_Mat, and open the material editor, see '''Tile #04''' to see what I have done in the Material Editor.

I then go to the mesh and open up its properties, the first thing I then do is go back to the generic browser, and select the material we just made, and apply it to the mesh, this is done by unfolding the properties as shown in '''Tile #05'''.

With the material applied, a few things still need to be done, the next thing on the list is to make a quick collision map, you can find the Collision -&gt; Auto Convex Collision, and use the settings shown on '''Tile #06''', there are better ways to do this, which I will probably cover later when we actually import this into more than just a test file.

Last thing to do is get a good angle and take a shot for the Generic Browser, this can found under Tool -&gt; Save Thumbnail Angle.

===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Cascade Particles|BaSCP Item 01 Cascade Particles]]

===Image Tiles===

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_08.jpeg|center|Tile #01: My export settings, note I have increased the Decimal Precision, while not absolutely nescesary, I like it like that, becuase I tend to always opt for the uber kill quality settings]]

[[Image:Legacy_DMSiesmic_Soil_NormalSeemless.jpeg|center|Tile #02: Soil Normal texture]]

[[Image:Legacy_DMSiesmic_Mud_NormalSeemless.jpeg|center|Tile #03: Mud Normal texture]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_09.jpeg|center|Tile #04: A few big things happen here, take a look at the vertexcolor component, it is what determines which pattern will be applied from the vertex painting we done, nothing more really needs to be done except to LERP the two materials together using this pattern, LERP stands for Linear Interpolate, it is a straight ramp from 0.0 to 1.0, as opposed to cubic or sinisoid interpolate, which measure the distance between the two numbers in such a way that the distance between the fractions are not equal, this basically means that there should be no distortion ''(note cubic and sinsoid interpolate don't exist in the material editor, for the point that they are next to useless in the world of textures)''. You will notice I have 3 Lerps, they all use the same VertexColor map, but have different inputs and connect to different functions in the material, the textures are Lerp'd to Diffuse, the normal maps are Lerp'd to Normal, and then I have two constants that are Lerp'd to the Specular, Specular determines the amount of light that bounces back at you, a value of 0.05 is used for the soil, as it drinks the light in and gives little back, the effect gives it a very dull sheen, the mud gets a value of 0.15, giving it a much stronger effects, making it look more like it is wet, ''without some sort of specular lighting, the normal maps are not readily apparent'']]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_10.jpeg|center|Tile #05: By selecting a material and clicking the green arrow pointing left next to Material, I apply or material to the mesh]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_11.jpeg|center|Tile #06: Totally maxed out, and even then honestly not accurate enough for me :(]]</text>
    </revision>
    <revision>
      <id>1973</id>
      <timestamp>2008-02-23T19:45:37Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Cascade Particles|BaSCP Item 01 Cascade Particles]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP Item 01 Static Meshes</title>
    <id>672</id>
    <revision>
      <id>1970</id>
      <timestamp>2008-02-23T19:49:07Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Static Meshes===

The mesh I wanted to make would use both of these textures, namely it was a steam vent which would eventually have steam pouring from the top of a mound.

I fired up 3DS Max, and roughly modeled what looked like a vent, I started with a plane, broken into a 6x6 grid that measured 256x256 generic units, converted to editable poly, and then started moving the vertices to where I wanted them. ''Tip: to view the divisions between the grid in 3DS Max press F4''

I came up with what is shown in '''Tile #01'''

After this, I added a HSDS modifier and selected the inner region, I'll note now, that I wanted the outside square to remain square, and with a 0 altitude on the z axis, this would make it easier to place when I got into the game, I also went to the lengths to ensure that the center vertex was exactly 256 units high, the ones on the north/east/south/west of it I made 128 units high (kind of like a + shape of vertices were selected and then I moved them to the apropriate height), and the ones on the NE/NW/SE/SW (the x shape of the center) I made 48 units, then I shifted them all in the x-y plane, while keeping the outside vertices in their original location!

I selected the inner region as shown in '''Tile #02'''

On the right hand side in the roll out, I then clicked the subdivide button, which smooths the image a lot, this is good, becuase it is supposed to be a steam vent, not a sharp spike in the ground, my next task was to drop the center vertice (the one that was at 256 height in the Z axis, which you may note is no longer this height) down to the ground, ie a zero on the z axis to produce the center of the steam vent.

I could have aditionally tweaked the vertices, but didn't because I was a little worried about loosing the smooth effect.

After this I selected a different set of polygons as shown in '''Tile #03''', and subdivided again.

And one more time with yet another different set of polys, as shown in '''Tile #04'''.

Everything seemed to be going great, I wanted one more level of subdividing, but thought I would manipulate some vertices a bit more at this point, looking at the top of the steam vent I thought it was looking pretty flat, and wanted to put some altitude variation into that, after this I selected the polys shown in '''Tile #05''' and did a final subdivide.

At this point I noticed that the corners of my square had moved in due to the HSDS smoothing modifier, I quickly moved them back to their corners at the proper 128,128 -128,128 128,-128 -128,128 positions, making sure the outside shape remained a perfect square.

I was happy with model, and later did others to produce varience in game.

The task of skinning came next, I chose to use the vertex paint method for a smooth transition from soil to mud, I thought a bit that the terrain itself would, atleast where these vents were, be a mix of mud and other textures anyhow, and that not a spec of solid soil should be seen, I added the vertexpaint modifier.

A new panel pops up, at its top are a few images of cubes, I picked the shaded representation of the vertex colors(the second cube on my version). They can be seen in '''Tile #06'''

A little bit below this, there are 6 more buttons, 3 wide ones on the right, and 3 thin ones on the left, the tooltip reads paint on the top right one, and erase below that, and finally the color picker below that, I chose to use a black, not sure why, it just seemed like the logical choice, we are after all effectivly painting an alpha channel that determines the transparency between our two textures here. These buttons can be seen in '''Tile #06'''.

I paint my pattern onto the mesh, merging the two appropriatly to make a smooth transition form the soil ground to the muddy slope and top, I end up with something looking the mesh shown in '''Tile #06'''

I'm not sure if the next step is actually required, since we are only going to be assigning one material to the mesh, but I'll quickly go through the process anyhow.

In the 3DS Max material editor, found in the top toolbar, designated by 4 spheres coloured red, green, blue and white, select the first material, then click the button that has the label Standard and change it to Multi/Sub Object, it will ask you if you want to discard or keep the material that used to be in slot you have changed, since you need to be taught this, I assume you are new to 3DS Max, and I will recomend you discard, but leave the choice for yourself.

The interface changes dramitcally, click the button labeled Set Number and set it too 1, because we will only be using one material, which will actually be a mix of two textures ;)

Down the bottom of the interface the long list of textures should shrink to contain only the one, click the button which should be labeled something like ''Material #xx ( Standard )'', then change the drop down from Blinn to Phong at the top, UT3 uses phong. and then in the tiny little square button next to the Diffuse color swatch in the Basic Parameters, and select Mix.

Where it say color #1, go to the button labeled none, click it, select bitmap, and then load the soil texture (note the color in the swatch is black, it will replace the black sections we just painted), and then do the same for color #2 except load the mud texture, which should replace the white section of the mesh.

The third one in the list is called Mix Amount, this is the map which determines the pattern of the two textures, you ''could'' use perlin noise for an unpredictable response, but what we want here is the vector color, if you click the square button, you should see Vertex Color about 3rd from the bottom, select it, and we are almost done, climb back out of the mix, to the top texture in the drop down list, and then apply it to the object (by selecting the object and clicking the third button directly below the texture sphere swatches), you won't see the texture in the viewport, but it should be there when we render.

There is one last thing to do, and that is add an edit poly modifier, select the border of the square from underneath, and cap it with the cap button in the roll out. If you see textures fighting after having done this, don't feel to worried, the fact that it will be placed slightly below ground level will totally cover this problem up when we place them in the editor.

When I rendered my one it look like the one shown in '''Tile #07'''

I was modestly happy with it, there was room for improvement, and I could take that up with my next few variants, but this was satisfactory for what I wanted.

Now I needed to import it into the game...

===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Mesh Import|BaSCP Item 01 Mesh Import]]

===Image Tiles===

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_01.jpeg|center|Tile #01: Part #01 of the steam vent, nothing really to look at yet]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_02.jpeg|center|Tile #02: These are the polygons I selected...]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_03.jpeg|center|Tile #03: Basically all that has been done is that the outer 3 polys on each corner have been deslected]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_04.jpeg|center|Tile #04: The outer circle of polys was removed this time before subdividing]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_05.jpeg|center|Tile #05: Notice only a ring is selected, the the 4 center square are not, basically we are just trying to add a final smooth to the altered top of the cone]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_06.jpeg|center|Tile #06: The alpha map fades from balck through to white, and represents the opacity of one texture over the other]]

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_07.jpeg|center|Tile #07: A simple steam vent]]</text>
    </revision>
    <revision>
      <id>1971</id>
      <timestamp>2008-02-23T19:44:58Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Navigation===

====Back====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Mesh Import|BaSCP Item 01 Mesh Import]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP Item 01 Textures</title>
    <id>671</id>
    <revision>
      <id>1968</id>
      <timestamp>2008-02-23T19:44:09Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Textures===

I went and did a google search to find images, I wanted some kind of soil, and some mud, considering my theme, I had to choose something that looked like it would fit. '''(Refer to Tiles #01, and #02 below)'''

I wasn't overly thrilled with the images, they were not quite what I had in mind, but I had spent enough time searching, and there was lots yet to be done.

''It should be noted that I used a lot higher resolution image than shown here''

I used the ISampler function of Texture Maker (see [[Legacy:BaSCP Tools Links|BaSCP Tools Links]]) to make the textures seemless, it can be found under the tools drop down menu, and is labeled Isampler Resynthesis.

I normally use the settings shown in '''Tile #03''', but feel free to tweak it to your hearts desire, ''Note: if you don't already have a seemless texture, make sure the ignore borders checkbox is ticked, otherwise you will get a very ugly texture.''

From the above images I made the textures found in '''Tile #04, and #05'''.

I also made an alpha texture.

Using Texture Maker, I ran off 3x 512x512 new images, I used the '''Generator''' function with the preset '''BumpMap'' at its default settings, and stored all 3 on my hard drive.

I opened them up in photoshop, and made a new 512x512 image that was 8-bit GreyScale, I went to the '''Layers''' tab on one of the floating toolbars, and clicked the button '''Create New Fill or Adjustment Layer''', and chose '''Gradient'', I selected a black through white greyscale gradeint and made it radial, so that I had a white dot in the center of a black background which was smoothly blending between the grey scale.

For the 3 images that I had made in texture maker, I went to the '''Channels''' tab on the same floating toolbar, and added an extra channel, I then copied the dot into this new channel for each of them.

I then made a 512x512 RGB image.

I went back to the images from texture maker, and with the 4th channel selected and visible (the grey dot), I clicked the '''Load Channel as Selection''', I then changed back to the main RGB Channel, and copied, I went to the new, blank image that I had just made (the RGB image), and pasted what I had copied into the red channel, the 2nd texture from texture make I repeated the process, except I copied it into the green channel, and the third Texture Maker image into the blue channel. 

I could have kept going with the textures, but I decided to change courses here and produce a static mesh to test them out in game, there were reasons for this, and they were that I was not overly happy with this result, I tend to muck around a lot when making things, and you should be aware that changing tasks (and in my case moving around the house between computers) slows things down, effeciency can be important to some people, but I tend to prefer to take my time. The final result looked like '''Tile #06'''.

After this I was done with textures.

===Navigation===

====Table of contents====

[[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]]

====Next Section====

[[Legacy:BaSCP Item 01 Static Meshes|BaSCP Item 01 Static Meshes]]

===Image Tiles===

[[Image:Legacy_DMSiesmic_SandImage.jpeg|center|Tile #01: Sand Image - A photograph that was used as a base texture for the map]]

[[Image:Legacy_DMSiesmic_MudImage.jpeg|center|Tile #02: Mud Image - A photograph that was used as a base texture for the map]]

[[Image:Legacy_DMSiesmic_ISampler.jpeg|center|Tile #03: ISampler Resynthesis - Acidsphinx's favourite settings]]

[[Image:Legacy_DMSiesmic_SoilTextureSeemless.jpeg|center|Tile #04: Tileable Seemless Soil Texture made with Texture Maker]]

[[Image:Legacy_DMSiesmic_MudTextureSeemless.jpeg|center|Tile #05: Tileable Seemless Mud Texture made with Texture Maker]]

[[Image:Legacy_DMSiesmic_SteamParticleBlend.jpeg|center|Tile #06: A 3 channel alpha map to determine what the steam particle looks like]]</text>
    </revision>
    <revision>
      <id>1969</id>
      <timestamp>2008-02-23T19:38:52Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Textures===

I went and did a google search to find images, I wanted some kind of soil, and some mud, considering my theme, I had to choose something that looked like it would fit. '''(Refer to Tiles #01, and #02 below)'''

I wasn't overly thrilled with the images, they were not quite what I had in mind, but I had spent enough time searching, and there was lots yet to be done.

''It should be noted that I used a lot higher resolution image than shown here''

I used the ISampler function of Texture Maker (see [[Legacy:BaSCP Tools Links|BaSCP Tools Links]]) to make the textures seemless, it can be found under the tools drop down menu, and is labeled Isampler Resynthesis.

I normally use the settings shown in '''Tile #03''', but feel free to tweak it to your hearts desire, ''Note: if you don't already have a seemless texture, make sure the ignore borders checkbox is ticked, otherwise you will get a very ugly texture.''

From the above images I made the textures found in '''Tile #04, and #05'''.

I also made an alpha texture.

Using Texture Maker, I ran off 3x 512x512 new images, I used the '''Generator''' function with the preset '''BumpMap'' at its default settings, and stored all 3 on my hard drive.

I opened them up in photoshop, and made a new 512x512 image that was 8-bit GreyScale, I went to the '''Layers''' tab on one of the floating toolbars, and clicked the button '''Create New Fill or Adjustment Layer''', and chose '''Gradient'', I selected a black through white greyscale gradeint and made it radial, so that I had a white dot in the center of a black background which was smoothly blending between the grey scale.

For the 3 images that I had made in texture maker, I went to the '''Channels''' tab on the same floating toolbar, and added an extra channel, I then copied the dot into this new channel for each of them.

I then made a 512x512 RGB image.

I went back to the images from texture maker, and with the 4th channel selected and visible (the grey dot), I clicked the '''Load Channel as Selection''', I then changed back to the main RGB Channel, and copied, I went to the new, blank image that I had just made (the RGB image), and pasted what I had copied into the red channel, the 2nd texture from texture make I repeated the process, except I copied it into the green channel, and the third Texture Maker image into the blue channel. 

I could have kept going with the textures, but I decided to change courses here and produce a static mesh to test them out in game, there were reasons for this, and they were that I was not overly happy with this result, I tend to muck around a lot when making things, and you should be aware that changing tasks (and in my case moving around the house between computers) slows things down, effeciency can be important to some people, but I tend to prefer to take my time. The final result looked like '''Tile #06'''.

After this I was done with textures.

===Navigation===

====Table of contents====

[[Legacy:Acidsphinx'S Journal Into UT3|Acidsphinx's Journal into UT3]]

====Next Section====

[[Legacy:Part 01 DM-Siesmic Canyon Static Meshes|Part 01 DM-Siesmic Canyon Static Meshes]]

===Image Tiles===

[[Image:Legacy_DMSiesmic_SandImage.jpeg|center|Tile #01: Sand Image - A photograph that was used as a base texture for the map]]

[[Image:Legacy_DMSiesmic_MudImage.jpeg|center|Tile #02: Mud Image - A photograph that was used as a base texture for the map]]

[[Image:Legacy_DMSiesmic_ISampler.jpeg|center|Tile #03: ISampler Resynthesis - Acidsphinx's favourite settings]]

[[Image:Legacy_DMSiesmic_SoilTextureSeemless.jpeg|center|Tile #04: Tileable Seemless Soil Texture made with Texture Maker]]

[[Image:Legacy_DMSiesmic_MudTextureSeemless.jpeg|center|Tile #05: Tileable Seemless Mud Texture made with Texture Maker]]

[[Image:Legacy_DMSiesmic_SteamParticleBlend.jpeg|center|Tile #06: A 3 channel alpha map to determine what the steam particle looks like]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP Steam Vents</title>
    <id>670</id>
    <revision>
      <id>1966</id>
      <timestamp>2008-02-23T19:47:05Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:BaSCP Item 01 Textures|BaSCP Item 01 Textures]]

[[Legacy:BaSCP Item 01 Static Meshes|BaSCP Item 01 Static Meshes]]

[[Legacy:BaSCP Item 01 Mesh Import|BaSCP Item 01 Mesh Import]]

[[Legacy:BaSCP Item 01 Cascade Particles|BaSCP Item 01 Cascade Particles]]

[[Legacy:BaSCP Item 01 Building A Preview Map|BaSCP Item 01 Building a Preview Map]]

===Navigation===

====Back====

[[Legacy:Brimstone And Sulphur Content Pack Documentation And Links|Brimstone And Sulphur Content Pack Documentation And Links]]</text>
    </revision>
    <revision>
      <id>1967</id>
      <timestamp>2008-02-23T19:41:45Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:BaSCP Item 01 Textures|BaSCP Item 01 Textures]]

[[Legacy:BaSCP Item 01 Static Meshes|BaSCP Item 01 Static Meshes]]

[[Legacy:BaSCP Item 01 Mesh Import|BaSCP Item 01 Mesh Import]]

[[Legacy:BaSCP Item 01 Cascade Particles|BaSCP Item 01 Cascade Particles]]

[[Legacy:BaSCP Item 01 Building A Preview Map|BaSCP Item 01 Building a Preview Map]]

===Back===

[[Legacy:Brimstone And Sulphur Content Pack Documentation And Links|Brimstone And Sulphur Content Pack Documentation And Links]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaSCP-Item01 Details</title>
    <id>669</id>
    <revision>
      <id>1965</id>
      <timestamp>2008-02-23T19:33:15Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Contains the following directory structure...
* Static Meshes
** SteamVent.ASE - one of the meshes described in the tutorail.
** SteamVent_Dual.ASE - A variant of SteamVent.ASE, not described in the tutorial, yet similar to the other.
* Textures
** AlphaMaps
*** SteamParticleBlend.bmp - A 3 Alpha Blend texture 512x512 used to shape and color the steam rising from the vents.
** Diffuse Textures
*** Mud_Diffuse.bmp - A tileable seemless texture that looks like mud.
*** Soil_Diffuse.bmp - A tileable seemless texture that looks like soil.
** Normal Maps
*** Mud_Normal.bmp - A tileable seemless normal map that is used to give texture to the mud.
*** Soil_Normal.bmp - A tileable seemless normal map that is used to give texture to the soil.
** Original Images
*** Mud.jpg - The original image used to make the mud textures.
*** Sand0062_L.jpg - The original image used to make the soil textures.
* UT3
** UTGame
*** Published
**** CookedPC
***** CustomMaps
****** DM-SiesmicCanyonPart-01.ut3 - A playable demo of the finished product of the first tutorial part.

===Back===

[[Legacy:Brimstone And Sulphur Content Pack Documentation And Links|Brimstone And Sulphur Content Pack Documentation And Links]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BallAmmo</title>
    <id>28629</id>
    <revision>
      <id>40485</id>
      <timestamp>2010-01-14T08:57:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BallLauncher</title>
    <id>637</id>
    <revision>
      <id>1895</id>
      <timestamp>2004-02-03T17:46:16Z</timestamp>
      <contributor>
        <ip>Off-Kilter</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; BallLauncher}}

The BallLauncher is what players use to shoot the ball (bomb) in Bombing Run games. It is a specialized weapon which is selected automatically when a player picks up the ball. The only way to get rid of the BallLauncher is to shoot the ball. When the player has the ball, he regains health via this weapon.

==Properties ==
; AITarget : Current actor to shoot the ball at or to for bots.
; HealAccum
; HealRate : How fast player is healed while holding BallLauncher.
; launchedBall : Flag to indicate whether ball has just been shot.
; PassAmbient : Sound to play while using alt-fire to target another player for a pass.
; PassTarget : Current player to pass ball to.
; PassTargetLocked
; PassTargetLockedForce
; PassTargetLost
; PassTargetLostForce
; SwitchTestTime : Last time we checked the weapon correctness in Tick. See Tick below for what that means.

==Methods ==
; BotFire : Does dirty work of helping bots to shoot the ball to a target, be it another player or the goal.
; BringUp : Sets current weapon to BallLauncher and stores off previous weapon for later.
; CanAttack : Always true.
; DrawWeaponInfo : Draw pass target reticle on HUD ('''Off-Kilter:''' At least I think that's what it does :P)
; HasAmmo : Return true if player has the ball, false otherwise. Ensures player cannot bring this weapon up without holding the ball essentially.
; ModifyPawn : Heals the holder if their health is below 100%
; NextWeapon : Switches to pending weapon if BallLauncher is current.
; OutOfAmmo : Does nothing.
; PrevWeapon : Switches to pending weapon if BallLauncher is current.
; PutDown : Never let the player put the weapon away if the player still has the ball.
; RecommendWeapon : If player has ball, BallLauncher gets highest recommendation. If player does not have ball, BallLauncher is never recommended.
; SetAITarget : Does what it says.
; ShootHoop : Called from BotFire to do the mechanics of shooting ball to the current AITarget.
; StartFire
; SynchronizeWeapon
; Tick : Makes sure that BallLauncher is current when player has the ball and not current otherwise.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1896</id>
      <timestamp>2004-02-02T22:16:05Z</timestamp>
      <contributor>
        <ip>Off-Kilter</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; BallLauncher}}

The BallLauncher is what players use to shoot the ball (bomb) in Bombing Run games. It is a specialized weapon which is selected automatically when a player picks up the ball. The only way to get rid of the BallLauncher is to shoot the ball. When the player has the ball, he regains health via this weapon.

==Properties ==
; AITarget
; HealAccum
; HealRate
; launchedBall
; PassAmbient
; PassTarget
; PassTargetLocked
; PassTargetLockedForce
; PassTargetLost
; PassTargetLostForce
; SwitchTestTime

==Methods ==
; BotFire
; BringUp : Sets current weapon to BallLauncher and stores off previous weapon for later.
; CanAttack : Always true.
; DrawWeaponInfo : Draw pass target reticle on HUD ('''Off-Kilter:''' At least I think that's what it does :P)
; HasAmmo : Return true if player has the ball.
; ModifyPawn : Heals the holder if their health is below 100%
; NextWeapon : Switches to pending weapon if BallLauncher is current.
; OutOfAmmo : Does nothing.
; PrevWeapon : Switches to pending weapon if BallLauncher is current.
; PutDown : Never let the player put the weapon away if the player still has the ball.
; RecommendWeapon : If player has ball, BallLauncher gets highest recommendation. If player does not have ball, BallLauncher is never recommended.
; SetAITarget
; ShootHoop : Called from BotFire to shoot into the goal.
; StartFire
; SynchronizeWeapon
; Tick

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BallShoot</title>
    <id>28429</id>
    <revision>
      <id>40101</id>
      <timestamp>2009-11-15T08:30:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BallTarget</title>
    <id>28357</id>
    <revision>
      <id>40024</id>
      <timestamp>2009-11-15T07:49:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Balu</title>
    <id>550</id>
    <revision>
      <id>1700</id>
      <timestamp>2003-01-31T17:47:47Z</timestamp>
      <contributor>
        <ip>Balu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">http://www.b-a-l-u.de/images/balu_l.gif ... don't ask - I am told that I look like that bear when dancing... :-D

{{innerbox| &quot;Look for the bare necessities!&quot; &amp;rarr; Balu in Disneys &quot;Jungle Book&quot;

}}

Check out my [[Legacy:Balu/Developer Journal|Balu/Developer Journal]] - if I did not add anything interesting yet, go check out the [[Legacy:Home Page|Home Page]] of this wiki (or even [http://www.b-a-l-u.de/ my one])...

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1701</id>
      <timestamp>2003-01-07T14:15:32Z</timestamp>
      <contributor>
        <ip>Trystan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| &quot;Look for the bare necessities!&quot; 

 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;ndash; Balu in Disneys &quot;Jungle Book&quot;

}}

Check out my [[Legacy:Balu/Developer Journal|Balu/Developer Journal]] - if I did not add anything interesting yet, go check out the [[Legacy:Home_Page|Home_Page]] :-)...

===Notes &amp; Comments ===

I really need to figure out how to list pages that I changed or even better that I changed and people change afterwards :-)

'''Mychaeel:''' Welcome to the Wiki.  Please add your name to the [[Legacy:Project Contributors|Project Contributors]]. &amp;ndash; There is no feature that lists all pages edited by a certain contributor; then again, it's all Open Content anyway.  :-)

'''Balu:''' I thought so, but it would be nice e.g. you sometimes ask something and want to get notified that someone added his opinion or similar. Some Wikis support &quot;notifications&quot; or similar.

'''Mychaeel:''' Ours doesn't (or at least doesn't have that feature activated), but have a look at the [[Legacy:Wiki Integration/Browser Sidebar|Wiki Integration/Browser Sidebar]] page:  You can set up your own set of Wiki page bookmarks in your browser sidebar, and they'll display &quot;Updated!&quot; when they have been changed.

'''Trystan:''' Welcome home Balu.  I simply make it a point to visit the Wiki daily and keep up on the latest changes.  While there's a lot of changes you'll find activity is usually centered around 10 to 15 pages a day.  One person will edit it and five more will swoop in to add their knowledge.  It's kind of weird.  o_O  Of course I have more free time at work than others. =)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1702</id>
      <timestamp>2003-01-31T17:42:16Z</timestamp>
      <contributor>
        <ip>Balu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">http://www.b-a-l-u.de/images/balu_l.gif ... don't ask - I am told that I look like that bear when dancing... :-D

{{innerbox| &quot;Look for the bare necessities!&quot; &amp;rarr; Balu in Disneys &quot;Jungle Book&quot;

}}

Check out my [[Legacy:Balu/Developer Journal|Balu/Developer Journal]] - if I did not add anything interesting yet, go check out the [[Legacy:Home Page|Home Page]]...

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44357</id>
      <timestamp>2011-04-06T14:18:22Z</timestamp>
      <contributor>
        <username>Kenneth Bhatt</username>
        <id>2226</id>
      </contributor>
      <text xml:space="preserve">http://www.b-a-l-u.de/images/balu_l.gif ... don't ask - I am told that I look like that bear when dancing... :-D  [http://www.slow-computer-solutions.org/  fix slow computer]

{{innerbox| &quot;Look for the bare necessities!&quot; &amp;rarr; Balu in Disneys &quot;Jungle Book&quot;

}}

Check out my [[Legacy:Balu/Developer Journal|Balu/Developer Journal]] - if I did not add anything interesting yet, go check out the [[Legacy:Home Page|Home Page]] of this wiki (or even [http://www.b-a-l-u.de/ my one])...

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44365</id>
      <timestamp>2011-04-06T19:57:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Kenneth Bhatt|Kenneth Bhatt]] ([[User talk:Kenneth Bhatt|Talk]]) to last revision by [[User:Balu|Balu]]</comment>
      <text xml:space="preserve">http://www.b-a-l-u.de/images/balu_l.gif ... don't ask - I am told that I look like that bear when dancing... :-D

{{innerbox| &quot;Look for the bare necessities!&quot; &amp;rarr; Balu in Disneys &quot;Jungle Book&quot;

}}

Check out my [[Legacy:Balu/Developer Journal|Balu/Developer Journal]] - if I did not add anything interesting yet, go check out the [[Legacy:Home Page|Home Page]] of this wiki (or even [http://www.b-a-l-u.de/ my one])...

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Balu/Developer Journal</title>
    <id>522</id>
    <revision>
      <id>1629</id>
      <timestamp>2003-08-05T09:44:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">==Intro ==

I am really, really really a newbie in all those UScript-stuff, but after looking around a while reading through some tutorials here and on other pages (that all included nice Info, but not for UT2003) I got stuck in this nice little wiki.

So let's see if I can (and will) collect some infos here that might help others :-)

==Things to figure out ==
* How to make things (walls) explode
** [http://udn.epicgames.com/pub/Content/EmittersExamples/ Example how to break glass using Emitters]

* How to create timed bombs a player can put on the ground
** Perhaps the Redeemer-Projectile-Explosion can jump in here?
** or [[Legacy:ExplosionChain|ExplosionChain]]

* How to create pickups that modify the bombs settings

* How to create pickups that make people do things (huh?)

* How to change the viewpoint of the cam looking at the player
** BehindView 1 might be a starting point...

==Links / Bookmarks ==

http://wiki.beyondunreal.com/wiki &amp;rarr; guess you know already...

http://www.planetunreal.com/architectonic/first_level.html &amp;rarr; a must read UnrealED 3.0 tutorial

http://www.3dbuzz.com &amp;rarr; nice tutorial videos on creating a map (you have to register though)

==Foobar: ==

Hits: |||||||

(please add a | on a visit ;))

'''LegalAssassin''' noted: It's FUBAR, Fücked Up Beyond All Recognition/ Legal ;)

'''Balu:''' Nah, it's not: [http://catb.org/~esr/jargon/html/entry/foobar.html foobar]

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1630</id>
      <timestamp>2003-02-01T15:40:16Z</timestamp>
      <contributor>
        <ip>LINC</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Intro ==

I am really, really really a newbie in all those UScript-stuff, but after looking around a while reading through some tutorials here and on other pages (that all included nice Info, but not for UT2003) I got stuck in this nice little wiki.

So let's see if I can (and will) collect some infos here that might help others :-)

==Things to figure out ==
* How to make things (walls) explode
** [http://udn.epicgames.com/pub/Content/EmittersExamples/ Example how to break glass using Emitters]

* How to create timed bombs a player can put on the ground
** Perhaps the Redeemer-Projectile-Explosion can jump in here?
** or [[Legacy:ExplosionChain|ExplosionChain]]

* How to create pickups that modify the bombs settings

* How to create pickups that make people do things (huh?)

* How to change the viewpoint of the cam looking at the player
** BehindView 1 might be a starting point...

==Links / Bookmarks ==

http://wiki.beyondunreal.com/wiki &amp;rarr; guess you know already...

http://www.planetunreal.com/architectonic/first_level.html &amp;rarr; a must read UnrealED 3.0 tutorial

http://www.3dbuzz.com &amp;rarr; nice tutorial videos on creating a map (you have to register though)

==Foobar: ==

Hits: ||||||

(please add a | on a visit ;))

'''LegalAssassin''' noted: It's FUBAR, Fücked Up Beyond All Recognition/ Legal ;)

'''Balu:''' Nah, it's not: [http://catb.org/~esr/jargon/html/entry/foobar.html foobar]</text>
    </revision>
    <revision>
      <id>1631</id>
      <timestamp>2003-04-22T02:55:58Z</timestamp>
      <contributor>
        <ip>Axe56</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Intro ==

I am really, really really a newbie in all those UScript-stuff, but after looking around a while reading through some tutorials here and on other pages (that all included nice Info, but not for UT2003) I got stuck in this nice little wiki.

So let's see if I can (and will) collect some infos here that might help others :-)

==Things to figure out ==
* How to make things (walls) explode
** [http://udn.epicgames.com/pub/Content/EmittersExamples/ Example how to break glass using Emitters]

* How to create timed bombs a player can put on the ground
** Perhaps the Redeemer-Projectile-Explosion can jump in here?
** or [[Legacy:ExplosionChain|ExplosionChain]]

* How to create pickups that modify the bombs settings

* How to create pickups that make people do things (huh?)

* How to change the viewpoint of the cam looking at the player
** BehindView 1 might be a starting point...

==Links / Bookmarks ==

http://wiki.beyondunreal.com/wiki &amp;rarr; guess you know already...

http://www.planetunreal.com/architectonic/first_level.html &amp;rarr; a must read UnrealED 3.0 tutorial

http://www.3dbuzz.com &amp;rarr; nice tutorial videos on creating a map (you have to register though)

==Foobar: ==

Hits: |||||||

(please add a | on a visit ;))

'''LegalAssassin''' noted: It's FUBAR, Fücked Up Beyond All Recognition/ Legal ;)

'''Balu:''' Nah, it's not: [http://catb.org/~esr/jargon/html/entry/foobar.html foobar]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Barrel</title>
    <id>631</id>
    <revision>
      <id>1881</id>
      <timestamp>2007-11-18T16:50:10Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Decoration|Decoration]]}}

It's just a wooden barrel. You can shoot it and it shatters.

==Further Reading==

* [[Legacy:ReviveBarrel|ReviveBarrel]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1882</id>
      <timestamp>2007-11-18T07:59:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>page should probably be split (stock UT class, custom UT/UT2004 clases)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Decoration|Decoration]]}}

It's just a wooden barrel. You can shoot it and it shatters.

==Extending  ==

A respawning barrel.

Remaining problems:
* no effect of any kind when the barrel reappears. You might want some sort of swishy wizz or something
* you can be standing where the barrel really is when it reappears, and then you're sort of inside it

To use this script in your map: [[Legacy:Create A Subclass|Create A Subclass]].

&lt;uscript&gt;
//=============================================================================
// ReviveBarrel.
//=============================================================================
class ReviveBarrel extends Barrel;

var() float TimeToRespawn;
var int InitialHealth;

function PreBeginPlay()
{
  super.PreBeginPlay();
  InitialHealth = Health;
}

function Vanish(bool bVanish)
{
  bHidden = bVanish;
  bBlockActors = !bVanish;
  bBlockPlayers = !bVanish;
  bProjTarget = !bVanish;
}

simulated function Frag(class&lt;fragment&gt; FragType, vector Momentum, float DSize, int NumFrags) 
{
  local int i;
  local actor A, Toucher;
  local Fragment s;

  if ( bOnlyTriggerable )
    return; 
  if (Event!='')
    foreach AllActors( class 'Actor', A, Event )
      A.Trigger( Toucher, pawn(Toucher) );
  if ( Region.Zone.bDestructive )
  {
    Destroy();
    return;
  }
  for (i=0 ; i&lt;NumFrags ; i++) 
  {
    s = Spawn( FragType, Owner);
    s.CalcVelocity(Momentum,0);
    s.DrawScale = DSize*0.5+0.7*DSize*FRand();
  }

  GotoState('Absent');
}

state Absent 
{
Begin:
  Health = InitialHealth; // restore health
  Vanish(true);

  Sleep( TimeToRespawn );

  Vanish(false);

  GotoState('Animate');
}

&lt;/uscript&gt;

'''Wormbo:''' You should toggle bHidden instead of changing the DrawType.

'''Tarquin:''' Thanks :) Had to sort out blocking as well. Mych will not like me calling that function Vanish() but I can't think of a better name :(

'''Wormbo:''' What about &quot;SetVisibility&quot; or &quot;SetHidden&quot;?

'''Tarquin:''' Great! Thanks :)

'''Foxpaw:''' It might not hurt to have both, sort of. It's a little bit of overhead at the interpreter level, but not that big of a deal. In my GUI classes I use a SetHidden function, then a Show and Hide function that are just one-line functions that call SetHidden( false ) and SetHidden( true ) respectively. Effectively it's the same, but I guess it kind of helps the readability. If you're into that sort of thing. :D

'''Tarquin:''' I was thinking this could make a tutorial about subclassing and states, but it's not very neat what with inheriting one state from Barrel and a load of code from Decoration. So I guess for SetHidden it's a case of what's clearest for people to read. Your idea of Show() just being a call to setHidden is neat, but I don't know how easy to grasp it would be.

'''Dirk Fist:''' I call that a wrapper function, and it can greatly increase the readability of complex code. Although its impact here is minimal. If you put the definition of Hide() and Show() immediately above SetHidden() the relationship is clear to anyone that looks.

'''xX)(Xx:''' Doesnt appear to work for some reason

'''MythOpus:'''  I do believe this script can be used only for Unreal 1 and MAYBE Unreal Tournament.  Anything higher than those games wouldn't have the class 'Barrel'.

'''Bullet:''' And what about replication here? Don't we need to replicate the two new variables?

'''Wormbo:''' No, damage and respawning is handled on the serverside.

'''LionsPhil:''' Pedantically, unless UT's interpreter does automatic inlining of functions (and maybe it does &amp;ndash; it's got to be fairly optimised, and possibly optimising), the Hide()/Show() wrappers will add an extra stack frame when calling and cause a ''tiny'' performance hit. This is probably not measurable, however.

'''Foxpaw:''' It doesn't automatically make functions inline - doing so would prevent polymorphism from working properly. An eye toward polymorphism is possibly why it was implemented that way, plus it looks a bit cleaner, I guess. Technically if you did put those functions inline you could replace the variable lookups with constant values and then eliminate the inversion operations too. However, in this instance we are looking at something a function that will get called at most once in a few seconds, and the runtime of it as-is is in the nanoseconds.

Personally I would probrably optimize it, but for this page, I think that readability to novice coders is more important than the speed gain.

'''AlexKotsch''' I made a respawning barrel and it doesn't have the problem of being inside the barrel

&lt;uscript&gt;
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class DECO_Barrel extends DECO_Smashable;

#exec OBJ LOAD FILE=..\StaticMeshes\ONS-BPJW1.usx

//=============================================================================
// defaultproperties
//=============================================================================

var   float    Damage;
var	  float	   DamageRadius;
var   float	   MomentumTransfer;
var   class&lt;DamageType&gt;	   MyDamageType;
var int Ted;
var int MaxTed;
var float TedRate;

  function BreakApart(vector HitLocation, vector momentum)
{
	// If we are single player or on a listen server, just spawn the actor, otherwise
	// bHidden will trigger the effect

	if (Level.NetMode == NM_ListenServer || Level.NetMode == NM_StandAlone)
	{
		if ( (EffectWhenDestroyed!=None ) &amp;&amp; EffectIsRelevant(location,false) )
			Spawn( EffectWhenDestroyed, Owner,, Location );
	}

	gotostate('Exploding');
}

state Exploding
{
	function BeginState()
	{
		super.BeginState();
		PlaySound(sound'WeaponSounds.BExplosion3',,2.5*TransientSoundVolume);
		Ted = 1;
		   SetTimer(TedRate, true);
                   Timer();
                }

                	}
                	
 simulated function Timer()
	{
		Ted = Ted++;
        	if (Ted == MaxTed)
	        {
        		SetTimer(0.0, false);
                         	BlowUp(Location);
                }
                  }

function BlowUp(vector Location)
{
	HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, Location );
		gotostate('Broken');
}

defaultproperties
{
     MaxTed=15
     TedRate=.025
     bImperviusToPlayer=False
     EffectWhenDestroyed=Class'UT2k4Assault.FX_ExplodingBarrel'
     Health=50
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'AS_Decos.ExplodingBarrel'
     DamageRadius=90.000000
     Damage=90.000000
     MomentumTransfer=50000.000000
     MyDamageType=Class'XWeapons.DamTypeRocket'
     PrePivot=(Z=40.000000)
     AmbientGlow=48
     CollisionRadius=25.000000
     CollisionHeight=32.000000
}

&lt;/uscript&gt;

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bartje321</title>
    <id>643</id>
    <revision>
      <id>1909</id>
      <timestamp>2005-03-08T13:25:53Z</timestamp>
      <contributor>
        <ip>Cp396022-a.ndwrt1.lb.home.nl</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Bartje321==
;===Projects
:Invasion everywere: [http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=385831 UT2004 Forum] 
:Ons-Map: [http://members.home.nl/bartje321/preview/ Preview]
:Dropship (Site) 

;===Contact
:Webpage: http://members.home.nl/bartje321/ut/
:E-mail &amp; Msn: Bartje321@home.nl

==GuestBook==
;

'''Bartje321:'''add something if you like :)

'''Tarquin:''' Welcome to the Unreal Wiki! :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

'''Bartje321:''' i sure do, realy usefull site

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1910</id>
      <timestamp>2004-06-30T16:05:09Z</timestamp>
      <contributor>
        <ip>Bartje321</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Bartje321==
;===Projects
:Invasion everywere: [http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=385831 UT2004 Forum] 
:Desperation: [http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=386159 UT2004 Forum]
:Dropship (Site) 

;===Contact
:Webpage: http://members.home.nl
:E-mail &amp; Msn: Bartje321@home.nl

==GuestBook==
;

'''Bartje321:'''add something if you like :)

'''Tarquin:''' Welcome to the Unreal Wiki! :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

'''Bartje321:''' i sure do, realy usefull site

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Base Directory</title>
    <id>609</id>
    <revision>
      <id>1829</id>
      <timestamp>2004-04-28T18:26:41Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>removed from Category To Do -- all relevant pages link here now</comment>
      <text xml:space="preserve">Most [[Legacy:Unreal Engine|Unreal Engine]] games have a similar directory structure. For example, in [[Legacy:UT2003|UT2003]], you might have:

: C:\Unreal Tournament 2003\System for the main system files
: C:\Unreal Tournament 2003\Maps for the map files

But because 
# a user may have installed in a different place on their hard drive
# something might apply to several games

on the Unreal Wiki we write {Base Directory} to mean &quot;the base directory of the game you're currently working with&quot;. So you might see something like:

: {Base Directory}\System
: {Base Directory}\Maps

Wiki writers can copy the following snippet of text to make the link:

:&lt;nowiki&gt;{[[Legacy:Base Directory|Base Directory]]}\&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package|Package]]</text>
    </revision>
    <revision>
      <id>1830</id>
      <timestamp>2003-11-20T17:25:57Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Most [[Legacy:Unreal Engine|Unreal Engine]] games have a similar directory structure. For example, in [[Legacy:UT2003|UT2003]], you might have:

: C:\Unreal Tournament 2003\System for the main system files
: C:\Unreal Tournament 2003\Maps for the map files

But because 
# a user may have installed in a different place on their hard drive
# something might apply to several games

on the Unreal Wiki we write {Base Directory} to mean &quot;the base directory of the game you're currently working with&quot;. So you might see something like:

: {Base Directory}\System
: {Base Directory}\Maps

Wiki writers can copy the following snippet of text to make the link:

:&lt;nowiki&gt;{[[Legacy:Base Directory|Base Directory]]}\&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package|Package]]

----

[[:Category:Legacy To Do]] &amp;ndash; link to this page from anywhere appropriate.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33206</id>
      <timestamp>2008-11-08T13:07:23Z</timestamp>
      <contributor>
        <username>AcelbOdron</username>
        <id>1562</id>
      </contributor>
      <minor/>
      <comment>nolitrocr</comment>
      <text xml:space="preserve">latreldar
Most [[Legacy:Unreal Engine|Unreal Engine]] games have a similar directory structure. For example, in [[Legacy:UT2003|UT2003]], you might have:

: C:\Unreal Tournament 2003\System for the main system files
: C:\Unreal Tournament 2003\Maps for the map files

But because 
# a user may have installed in a different place on their hard drive
# something might apply to several games

on the Unreal Wiki we write {Base Directory} to mean &quot;the base directory of the game you're currently working with&quot;. So you might see something like:

: {Base Directory}\System
: {Base Directory}\Maps

Wiki writers can copy the following snippet of text to make the link:

:&lt;nowiki&gt;{[[Legacy:Base Directory|Base Directory]]}\&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package|Package]]</text>
    </revision>
    <revision>
      <id>33207</id>
      <timestamp>2008-11-08T18:07:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/AcelbOdron|AcelbOdron]] ([[User talk:AcelbOdron|Talk]]); changed back to last version by [[User:Ironblayde|Ironblayde]]</comment>
      <text xml:space="preserve">Most [[Legacy:Unreal Engine|Unreal Engine]] games have a similar directory structure. For example, in [[Legacy:UT2003|UT2003]], you might have:

: C:\Unreal Tournament 2003\System for the main system files
: C:\Unreal Tournament 2003\Maps for the map files

But because 
# a user may have installed in a different place on their hard drive
# something might apply to several games

on the Unreal Wiki we write {Base Directory} to mean &quot;the base directory of the game you're currently working with&quot;. So you might see something like:

: {Base Directory}\System
: {Base Directory}\Maps

Wiki writers can copy the following snippet of text to make the link:

:&lt;nowiki&gt;{[[Legacy:Base Directory|Base Directory]]}\&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package|Package]]</text>
    </revision>
    <revision>
      <id>43140</id>
      <timestamp>2010-04-29T22:17:24Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <comment>Redirected page to [[Base Directory]]</comment>
      <text xml:space="preserve">#REDIRECT [[Base Directory]]</text>
    </revision>
    <revision>
      <id>43143</id>
      <timestamp>2010-04-29T22:33:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Undo revision 43140 by [[Special:Contributions/00zX|00zX]] ([[User talk:00zX|Talk]]) - don't delete legacy content!</comment>
      <text xml:space="preserve">{{legacy page|new=[[Base Directory]]}}
Most [[Legacy:Unreal Engine|Unreal Engine]] games have a similar directory structure. For example, in [[Legacy:UT2003|UT2003]], you might have:

: C:\Unreal Tournament 2003\System for the main system files
: C:\Unreal Tournament 2003\Maps for the map files

But because 
# a user may have installed in a different place on their hard drive
# something might apply to several games

on the Unreal Wiki we write {Base Directory} to mean &quot;the base directory of the game you're currently working with&quot;. So you might see something like:

: {Base Directory}\System
: {Base Directory}\Maps

Wiki writers can copy the following snippet of text to make the link:

:&lt;nowiki&gt;{[[Legacy:Base Directory|Base Directory]]}\&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package|Package]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Base Textures</title>
    <id>582</id>
    <revision>
      <id>1774</id>
      <timestamp>2008-02-08T08:25:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">==Resources ==

===Mayang's Free Textures ===

A huge amount of free base textures, most in outrageous (1600 x 1200) resolution.

http://www.mayang.com/textures/

===Textures Library ===

Free textures for download, more than 1350 pictures in our library.

http://textures.z7server.com/

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1775</id>
      <timestamp>2008-02-08T02:53:16Z</timestamp>
      <contributor>
        <ip>Cpe-75-80-151-39.san.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">qwertyuiopasdfghjklzxcvbnm</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Base64</title>
    <id>648</id>
    <revision>
      <id>1920</id>
      <timestamp>2004-09-21T16:19:17Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Wikipedia:Base64]] is a data encoding scheme whereby binary-encoded data is converted to printable ASCII characters. It is defined as a MIME content transfer encoding for use in internet e-mail. The only characters used are the upper- and lower-case Roman alphabet characters (A-Z, a-z), the numerals (0-9), and the &quot;+&quot; and &quot;/&quot; symbols, with the &quot;=&quot; symbol as a special suffix code.

Base64 is used in emails but also for basic HTTP authentication. However, base64 is not even close to anything secure. In other words, don't use it for securing information.

==Code==

&lt;uscript&gt;
/**
	base64 encode an input array
*/
static function array&lt;string&gt; Base64Encode(array&lt;string&gt; indata, out array&lt;string&gt; B64Lookup)
{
	local array&lt;string&gt; result;
	local int i, dl, n;
	local string res;
	local array&lt;byte&gt; inp;
	local array&lt;string&gt; outp;

	if (B64Lookup.length != 64) Base64EncodeLookupTable(B64Lookup);

	// convert string to byte array
	for (n = 0; n &lt; indata.length; n++)
	{
		res = indata[n];
		outp.length = 0;
		inp.length = 0;
		for (i = 0; i &lt; len(res); i++)
		{
			inp[inp.length] = Asc(Mid(res, i, 1));
		}

		dl = inp.length;
		// fix byte array
		if ((dl%3) == 1)
		{
			inp[inp.length] = 0;
			inp[inp.length] = 0;
		}
		if ((dl%3) == 2)
		{
			inp[inp.length] = 0;
		}
		i = 0;
		while (i &lt; dl)
		{
			outp[outp.length] = B64Lookup[(inp[i] &gt;&gt; 2)];
			outp[outp.length] = B64Lookup[((inp[i]&amp;3)&lt;&lt;4) | (inp[i+1]&gt;&gt;4)];
			outp[outp.length] = B64Lookup[((inp[i+1]&amp;15)&lt;&lt;2) | (inp[i+2]&gt;&gt;6)];
			outp[outp.length] = B64Lookup[(inp[i+2]&amp;63)];
			i += 3;
		}
		// pad result
		if ((dl%3) == 1)
		{
			outp[outp.length-1] = &quot;=&quot;;
			outp[outp.length-2] = &quot;=&quot;;
		}
		if ((dl%3) == 2)
		{
			outp[outp.length-1] = &quot;=&quot;;
		}

		res = &quot;&quot;;
		for (i = 0; i &lt; outp.length; i++)
		{
			res = res$outp[i];
		}
		result[result.length] = res;
	}

	return result;
}

/**
	Decode a base64 encoded string
*/
static function array&lt;string&gt; Base64Decode(array&lt;string&gt; indata)
{
	local array&lt;string&gt; result;
	local int i, dl, n, padded;
	local string res;
	local array&lt;byte&gt; inp;
	local array&lt;string&gt; outp;

	// convert string to byte array
	for (n = 0; n &lt; indata.length; n++)
	{
		res = indata[n];
		outp.length = 0;
		inp.length = 0;
		padded = 0;
		for (i = 0; i &lt; len(res); i++)
		{
			dl = Asc(Mid(res, i, 1));
			// convert base64 ascii to base64 index
			if ((dl &gt;= 65) &amp;&amp; (dl &lt;= 90)) dl -= 65; // cap alpha
			else if ((dl &gt;= 97) &amp;&amp; (dl &lt;= 122)) dl -= 71; // low alpha
			else if ((dl &gt;= 48) &amp;&amp; (dl &lt;= 57)) dl += 4; // digits
			else if (dl == 43) dl = 62;
			else if (dl == 47) dl = 63;
			else if (dl == 61) padded++;
			inp[inp.length] = dl;
		}

		dl = inp.length;
		i = 0;
		while (i &lt; dl)
		{
			outp[outp.length] = Chr((inp[i] &lt;&lt; 2) | (inp[i+1] &gt;&gt; 4));
			outp[outp.length] = Chr(((inp[i+1]&amp;15)&lt;&lt;4) | (inp[i+2]&gt;&gt;2));
			outp[outp.length] = Chr(((inp[i+2]&amp;3)&lt;&lt;6) | (inp[i+3]));
			i += 4;
		}
		outp.length = outp.length-padded;

		res = &quot;&quot;;
		for (i = 0; i &lt; outp.length; i++)
		{
			res = res$outp[i];
		}
		result[result.length] = res;
	}

	return result;
}

/**
	Generate the base 64 encode lookup table
*/
static function Base64EncodeLookupTable(out array&lt;string&gt; LookupTable)
{
	local int i;
	for (i = 0; i &lt; 26; i++)
	{
		LookupTable[i] = Chr(i+65);
	}
	for (i = 0; i &lt; 26; i++)
	{
		LookupTable[i+26] = Chr(i+97);
	}
	for (i = 0; i &lt; 10; i++)
	{
		LookupTable[i+52] = Chr(i+48);
	}
	LookupTable[62] = &quot;+&quot;;
	LookupTable[63] = &quot;/&quot;;
}
&lt;/uscript&gt;

==License==

This code is part of the [[Legacy:LibHTTP|LibHTTP]] package which is released under the [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]]

Copyright 2003/2004 Michiel &quot;[[Legacy:El Muerte|El Muerte]]&quot; Hendriks

==Related Articles==
* [http://www.ietf.org/rfc/rfc1341.txt RFC 1341] &amp;rarr; the MIME rfc explains the base64 encoding algorithm

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaseDirectory</title>
    <id>28565</id>
    <revision>
      <id>40266</id>
      <timestamp>2009-11-17T11:10:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirected page to [[Legacy:Base Directory]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Base Directory]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BaseGUIController</title>
    <id>610</id>
    <revision>
      <id>1831</id>
      <timestamp>2003-05-26T11:35:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; BaseGUIController (Package: Engine)}}

This is just a stub class that should be subclassed to support menus.

==Properties==
; [[Legacy:Material|Material]] DefaultPens[3] : Container to hold some default pens for drawing purposes. These are white, black and grey in that order.

==Methods==
; AutoLoadMenus ( ) [event] : Create a bunch of menus at start up.
; bool OpenMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Opens a new menu and places it on top of the stack.
; bool ReplaceMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Replaces a menu in the stack.  Returns true if success.
; CloseAll (bool bCancel) [event] : 
; bool CloseMenu (optional bool bCanceled) [event] : Close the top menu.  returns true if success.
; InitializeController ( ) [event] : 
; SetControllerStatus (bool On) : 
; SetRequiredGameResolution (string GameRes) [event] : 
; bool NeedsMenuResolution() [event] : Big Hack that should be subclassed.

===Delegates===

OnAdminReply (string Reply) : Called by [[Legacy:PlayerController|PlayerController]].

==Known Subclasses==
* [[Legacy:GUIController|GUIController]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Basic AI Scripting Tutorial</title>
    <id>608</id>
    <revision>
      <id>1826</id>
      <timestamp>2006-02-04T03:20:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a tutorial on UScripting a custom AI.

'''This page is under construction.'''

==Overview==

This tutorial will detail re-construction of the NaliCow NPC for UT2004.  It was originally available in UT as a [[Legacy:Cow|Cow]], but this tutorial will revise its AI design as if it were new.  The stock meshes and sounds that are available will allow us to concentrate purely on the AI that drives its behavior.  We will start will a comprehensive behavior design before coding the elements and constructing the custom classes that will give this NPC life and then implement it in the game environment.

[[Image:Legacy_scriptedpawn.nalicows.jpeg|center|The NaliCow and BabyCow from Unreal Tournament.]]

==Prerequisites==

Although creating only a simple AI for this NPC, this will be an advanced tutorial that assumes a solid understanding of [[Legacy:UnrealScript|UnrealScript]].  This tutorial will assume you know how to [[Legacy:Create A Subclass|Create A Subclass]], [[Legacy:Set Up Package Folders|Set up package folders]], [[Legacy:Launch A Local Netgame|Launch a local netgame]] and [[Legacy:Add EditPackage|Add EditPackage]].  In terms of [[Legacy:Making Mods|Making Mods]], this tutorial will assume that you know about [[Legacy:Replication|Replication]], [[Legacy:Coding Guidelines|Coding Guidelines]] and [[Legacy:Compiling With UCC|Compiling with UCC]].

Even if you aren't confident in your understanding of these many topics, this tutorial will still serve as an overview discussion of designing a simple [[Legacy:Artificial Intelligence|Artificial Intelligence]] construct.

==Behavior Design==

We will begin by defining a design for the NaliCow's behavior.

===AI Design Plan===

The behavior design is the roadmap for our AI scripting, giving us a clear set of coding elements to complete before it's AI takes shape.

Although there are many different methods of designing AI (including sophisticated methods such as neural networks and artificial evolution), with a simple creature like this, our tutorial will follow the most basic and standard method used by all stock Unreal AI; conditional decision-making.  This is the method that takes stimuli as a constant condition or trigger to either do this or that; also known as &quot;if this, then do that&quot;, or &quot;if-then&quot; decision-making.  A common example of this kind of AI is the AI Script in a [[Legacy:ScriptedSequence|ScriptedSequence]], but even Bots use this method, just in an extremely complex form.

We have some features of our NPC already defined for us; it's model, textures, animation and sounds.  Normally, a custom character would be started by defining it's purpose or goal and then design those features around it.  But for this behavior design, we will work &quot;backwards&quot;; starting with those features and finding the purpose and behavior design that fits it.

With that in mind, we will first look at what we have to work with.

===Provided Animation and Sounds===

There are plenty of stock animations provided in UT2004 for the NaliCow even though there is no [[Legacy:Monster|Monster]] subclass for it.  With these animation sequences, we can easily construct an AI design flow that will convey a creature of convincing realism and range of ability.  The following is a list of the NaliCow animations found the [[Legacy:Mesh Browser|Mesh Browser]]. The number of animation frames in the sequence are shown in brackets.  ''Loop'' indicates the last frame matches a common start pose of all other ''Loop'' animations.  ''SingleFrame'' is just one frame, a pose.  ''Sequence'' indicates an animation sequence that is meant to only play through once and does not end on the common starting pose of the ''Loop'' animations.
* '''root''' [20] : Loop.  Bends down to graze.
* '''Breath''' [6] : Loop.  Breathes.  Prone.
* '''Chew''' [7] : Loop.  Chews.
* '''Poop''' [20] : Loop.  Lifts tail and poops.
* '''Shake''' [18] : Loop.  Shakes head, as if shaking off water or dust.
* '''Swish''' [20] : Loop.  Swishes it's tail from side to side and stamps foot.
* '''Walk''' [15] : Loop.  A walk cycle.
* '''Run''' [10] : Loop.  A run cycle.
* '''Landed''' [1] : Single frame.  Indicates recovery from a fall.
* '''TakeHit1''' [1] : Single frame.  Indicates recovery from damage.
* '''TakeHit2''' [1] : Single frame.  Indicates recovery from more damage.
* '''BigHit''' [1] : Single frame.  Indicates recovery from a lot of damage. (both feet in the air)
* '''Dead''' [23] : Sequence.  Indicates a slow death, slumping to the side.
* '''Dead2''' [13] : Sequence.  Death animation, starting from '''TakeHit2''', slumping forward.
* '''Dead3''' [23] : Sequence.  Severe death, starting from '''BigHit''', showing a complete back flip.

These stock sounds are available in the [[Legacy:Sound Browser|Sound Browser]], under &lt;tt&gt;SkaarjPack_rc&lt;/tt&gt;, that relate to the NaliCow:
* '''ambCow''' : Breath of a NaliCow.
* '''cMoo1c''' : NaliCow call. (sounds suspiciously like a Doom creature's death cry)
* '''cMoo2c''' : Another call.
* '''DeathC1c''' : &quot;Urgent&quot; call.
* '''DeathC2c''' : Another &quot;urgent&quot; call.
* '''injurC1c''' : Pained call.
* '''injurC2c''' : A call that sounds a little like, &quot;Ow&quot;.
* '''munch1p''' : A biting sound (normally used for the SkaarjPupae).
* '''shakeC''' : Ears flapping as the NaliCow shakes.
* '''swishC''' : Swishing sound of the NaliCow tail.
* '''Thump''' : Generic hard landing sound.
* '''WalkC''' : NaliCow footstep.

===AI Design Flow===

With these pieces, we can begin to analyze the potential behavior and assemble the design in such a way that we understand how one piece leads to the next.

* Some of these pieces indicate behavior that's initiated by the NaliCow; such as Grazing, Swishing, Pooping.  Others are behaviors that are in reaction to external stimuli; such as TakeHit or Death.
* We know we will want the NaliCow to navigate from place to place.  Some decision making will involve where to go and whether to walk or run.  Running away from danger will serve a self-preservation purpose while walking toward a goal, such as another NaliCow, may serve to support the idea these are real creatures (an immersion purpose) through a percieved flocking behavior.
* Obvious connections can be made between the animation sequences and the sounds that correspond to them.  We will want to have these sounds play whenever those animations are played.  Other connections can be made between some of these pieces, where one will likely lead to another; such as Grazing leading to Chewing, a TakeHit leading to either Death or Run, etc.
* One piece of this behavior, Pooping, appears to need an extra effect; the NaliCowPoop itself.  It will have to be an extra actor class with it's own code.

We can see a prone state, where the '''Breath''' animation and '''ambCow''' sound would be looped.  This appears to be a good place to start.  We will be able to branch out from this prone state to any other looping animation sequence and corresponding sound, building up the behavior design flow, piece by piece.

The following chart attempts to describe all the possible behaviors, their animation, their sound and what behaviors might preceed and follow them.

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |
===='''NaliCow Behaviors'''====
 
|-
|
| style=&quot;text-align: center&quot; |'''1. Prone'''
| style=&quot;text-align: center&quot; |'''2. Graze'''
| style=&quot;text-align: center&quot; |'''3. Chew'''
| style=&quot;text-align: center&quot; |'''4. Poop'''
| style=&quot;text-align: center&quot; |'''5. Shake'''
| style=&quot;text-align: center&quot; |'''6. Swish'''
| style=&quot;text-align: center&quot; |'''7. Walk'''
| style=&quot;text-align: center&quot; |'''8. Run'''
| style=&quot;text-align: center&quot; |'''9. Land'''
| style=&quot;text-align: center&quot; |'''10. TakeHit'''
| style=&quot;text-align: center&quot; |'''11. Dying''' 
|-
| style=&quot;text-align: left&quot; |'''Animation'''
|Breath
|root
|Chew
|Poop
|Shake
|Swish
|Walk
|Run
|Landed
|TakeHit1, 2 or BigHit
|Dead, 2, 3 
|-
| style=&quot;text-align: left&quot; |'''Sound'''
|ambCow
|munch1p
|munch1p
|cMoo1c, 2c
|shakeC
|swishC
|WalkC
|WalkC
|Thump
|injurC1c, 2c
|DeathC1c, 2c 
|-
| style=&quot;text-align: left&quot; |'''Lead From'''
|1-7
|1-7
|2
|1-7
|1-7
|1-7
|1-10
|7-10
|7 or 8**
|1-9***
|10 
|-
| style=&quot;text-align: left&quot; |'''Lead To'''
|1-7
|3
|1-7
|1-7*
|1-7
|1-7
|1-8
|7-8
|1, 5, 7
|7, 8, 11
|''None''&amp;dagger; 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |* &amp;ndash; ''A NaliCowPoop actor should be spawned during this behavior.'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |** &amp;ndash; ''This behavior will activate immeditately upon landing from a fall, without waiting for animation loops to end..'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |*** &amp;ndash; ''This behavior will activate immeditately upon taking damage, without waiting for animation loops to end.'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |&amp;dagger; &amp;ndash; ''The NaliCow carcass will DeRes and disappear a short time after this behavior.'' 
|}

==Coding Elements==

With the AI Design Flow sketched out, we will be able to code the AI behaviors appropriately.  But first, we will have to complete the code that will handle the basic tasks these behaviors will have to perform.  These tasks include animation, sound, movement, damage, death, etc.

===Animation &amp; Sound===

As shown in the above chart, animation sequences and sounds are linked together.  A couple exceptions to that rule include animations that can play one of a few available sounds and actions that play one animation, but more than one sound, such as Walk or Run, where two footsteps should be heard.  We will use the animation sequence as a handle for the action and have that dictate the possible sounds.

&lt;uscript&gt;
// DisplayBehavior() takes a BehaviorIndex value and sets the appropriate animation and sound.
// Degrees of behavior will be taken into account via an optional arguement.
function DisplayBehavior( int BehaviorIndex, optional int Degree )
{
    switch( BehaviorIndex ) {
        case(1) :
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
        case(2) : 
            Acting( 'root', sound'SkaarjPack_rc.munch1p', true ); break;
        case(3) : 
            Acting( 'Chew', sound'SkaarjPack_rc.munch1p', true ); break;
        case(4) : 
            if ( FRand() &gt; 0.5 )
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo1c', false );
            else
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo2c', false );
            break;
        case(5) : 
            Acting( 'Shake', sound'SkaarjPack_rc.shakeC', true ); break;
        case(6) : 
            Acting( 'Swish', sound'SkaarjPack_rc.swishC', true ); break;
        case(7) : 
            Acting( 'Walk', sound'SkaarjPack_rc.WalkC', true ); break;
        case(8) : 
            Acting( 'Run', sound'SkaarjPack_rc.WalkC', true ); break;
        case(9) : 
            Acting( 'Landed', sound'SkaarjPack_rc.Thump', false ); break;
        case(10) : 
            if ( Degree &lt; 2 )
                Acting( 'TakeHit', sound'SkaarjPack_rc.cMoo1c', false );
            else if ( Degree == 2 )
                Acting( 'TakeHit2', sound'SkaarjPack_rc.injurC1c', false );
            else if ( Degree == 3 )
                Acting( 'BigHit', sound'SkaarjPack_rc.injurC2c', false );
            break;
        case(11) : 
            if ( Degree &lt; 2 )
                Acting( 'Dead', sound'SkaarjPack_rc.cMoo2c', false );
            else if ( Degree == 2 )
                Acting( 'Dead2', sound'SkaarjPack_rc.DeathC1c', false );
            else if ( Degree == 3 )
                Acting( 'Dead3', sound'SkaarjPack_rc.DeathC2c', false );
            break;
        default : 
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
     }
}

// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, 1.0, 0.1 );
    else
        PlayAnim( Anim, 1.0, 0.1 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = 1.0;
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
	SimAnim.TweenRate = 0.1;
    PlaySound( Soundname, SLOT_Misc );
}
&lt;/uscript&gt;

===Navigation===

This is our first decision-making code.  We will need our AI to decide where to go and what to look at.  Controllers use MoveTarget and ViewTarget by default.  They are the Destination and Focus for the controller.  We will simply alter those properties based on desires of self-preservation.

First, if we have reached our destination, we want to be able to select another one reasonably.  Next, if another Actor has hurt our NPC, we want our AI to avoid it.  So we will do checks to make sure the selected destination or focus is not the Actor that hurt our NPC.  We will also avoid any Actor who Bumps or Touches our NPC, as if it had hurt it.  If the NPC is Bumped, Touched or Triggered, we will have our NPC Walk away, or if already Walking, perhaps begin to Run.  Finally, we want to know if our NPC is stuck, trying to reach a destination but not able to progress from it's current Location.  We will do a simple check to ensure it makes progress when it Walks or Runs, and if not, we will select another destination.

&lt;uscript&gt;
var		Actor		HurtingActor;	// An Actor to get away from.
var		vector		OldLocation;	// Used to determine if stuck.

// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );
}

// ReachedDestination() is originally defined in Pawn.
// MoveTarget and other relevant properties are defined in Controller.
function bool ReachedDestination( Actor OldTarget )
{
    local   Actor   NewTarget, A;
    local   NavigationPoint    NP;

    forEach VisibleActors( class'Actor', A )
        if ( A != OldTarget &amp;&amp; A != HurtingActor )
            NewTarget = A;

    if ( A == None )
        forEach RadiusActors( class'NavigationPoint', NP, 1024 )
            if ( FRand() &gt; 0.5 &amp;&amp; NP != OldTarget &amp;&amp; FastTrace( NP.Location ) )
            {
                A = NP;
                NewTarget = A;
            }

    if ( A == None )
        forEach AllActors( class'Actor', A )
            if ( FRand() &gt; 0.5 &amp;&amp; A != HurtingActor &amp;&amp; A != OldTarget &amp;&amp; A != self &amp;&amp; !A.IsA('Controller') )
                NewTarget = A;

    if ( NewTarget != None )
    {
        Controller.MoveTarget = NewTarget;
        Controller.Destination = NewTarget.Location;
        Controller.FocalPoint = NewTarget.Location;
        Controller.Focus = NewTarget;
    }
    else
    {
        if ( HurtingActor != None )
        {
            Controller.Destination = ( Location - HurtingActor.Location );
            Controller.FocalPoint = Controller.Destination;
        }
        else
        {
            Controller.Destination = vector( Rotation ) * ( 512 * FRand() + 512 );
            Controller.FocalPoint = Controller.Destination;
        }
    }
}

// Trigger() is originally defined in Actor.
function Trigger( Actor Other, Pawn EventInstigator )
{
    if ( self.IsInState('Run') )
        return;
	if ( self.IsInState('Walk') )
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Touch() is originally defined in Actor.
function Touch( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') )
        return;
	GotoState('Walk');
}

// Bump() is originally defined in Actor.
function Bump( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') &amp;&amp; ( FRand() &lt; 0.9 ) )  // Chance to calm.
        return;
	if ( self.IsInState('Walk') &amp;&amp; ( FRand() &gt; 0.9 ) )  // Change due to startle.
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}
&lt;/uscript&gt;

And then somewhere in during movement, we will perform checks to determine if the character has reached it's destination or if it's gotten stuck while traveling.

===Movement===

We need our NPC NaliCow to travel to destinations.  It's default Physics will be PHYS_Walking.  So unless we find that the character should be falling, we're just going to concern ourselves with ground movement.  Our checks determining if the NPCs destination is reached or if the NPC is stuck will also happen during movement.  We also want the ability to halt all movement by defining a zero SpeedRatio, so that our character does not slide around while showing an animation with it's feet firmly planted.  At this point, we will also introduce another property bStartled that will indicate the NaliCow has been recently hurt or otherwise made to react.  We will take advantage of the fact that movement will be checked often and use it to make a few decisions about bStartle, either to react to it by Running or to calm back down.  bStartled will be set to true during damage.

&lt;uscript&gt;
var		bool		bStartled;		// Recently startled.

// MoveCheck() deals with periodic checks for bStartled, DamageTaken and falling.
// Then moves the character in direction of Rotation and at speed of SpeedRatio.
function MoveCheck( float SpeedRatio )
{
	DamageTaken = 0;  // Reset most recent damage memory.

	if ( Base == None )  // Should be falling.
	{
		if ( Physics != PHYS_Falling )
			SetPhysics( PHYS_Falling );
		return;
	}

	if ( Controller.MoveTarget == None )
		ReachedDestination( self );

    if ( VSize( Controller.MoveTarget.Location - Location ) &lt; 64 )
   	    ReachedDestination( Controller.MoveTarget );

    if ( VSize( OldLocation - Location ) &lt; 48 )
   	    ReachedDestination( Controller.MoveTarget );

    OldLocation = Location;

    RotationRate.Yaw = SpeedRatio * 20000;
   	Velocity = ( SpeedRatio * GroundSpeed ) * vector( Rotation );
    Acceleration = Velocity;

	if ( FRand() &gt; 0.95 )  // Chance to calm down.
		bStartled = false;
	if ( bStartled &amp;&amp; !self.IsInState('Run') )
		GotoState('Run');  // React to startle.	
}
&lt;/uscript&gt;

During Walk and Run behaviors, we will want to update the character's movement, based on any changes to Rotation.  The following code uses a Tick() function to constantly update the movement.  We only need to do this during certain behaviors, so we will only use this code within a state designated for either Walk or Run.  Normally, SetTimer() and Timer() functions set to activate every tenth of a second or so are used in place of Tick(), but this code is not particularly expensive.

&lt;uscript&gt;
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( 0.5 * GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }
&lt;/uscript&gt;

===Damage===

When our NPC gets hurt, we want to display specific behavior and effects.  The effects needed here are blood puffs that emit from the character at the appropriate angle to which it was hurt.  The behavior will be similar to those in Navigation, as the Instigator of the damage will automatically become the NPCs HurtingActor, the Actor to avoid.  Any damage will cause our NPC to react by Running, unless it recieves enough damage to bring the Health down to zero.  In that case, our NPC will switch to a Dying state.  A new property, DamageTaken, is introduced to keep track of the most recent damage inflicted on our NaliCow.  This will be used to determine the Degree to specify for our TakeHit and Dying behavior displays and it will serve to remind the NaliCow to Run away from danger.

&lt;uscript&gt;
var		int			DamageTaken;	// Most recent damage amount.

// TakeDamage() is originally defined in Actor.
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    HurtingActor = InstigatedBy;
	DamageTaken = Damage;
	bStartled = true;

    Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

    if ( DamageTaken &gt; 3 )
        spawn( class'STR_green_blood_puff',,, HitLocation, Rotator( Momentum ) );

    if ( Controller != None &amp;&amp; ( Controller.MoveTarget == HurtingActor || Controller.Focus == HurtingActor ) )
		ReachedDestination( HurtingActor );  // Do not approach HurtingActor.

    if ( Health &gt; 0 )
        GotoState('TakeHit');
    else if ( !self.IsInState('Dying') )
        GotoState('Dying');
}
&lt;/uscript&gt;

===Death===

When our NPC dies, it will be switched to a Dying state.  Switching to a unique state will allow us to Ignore various functions, like Bump or Touch, which would cause further behavior.  At the beginning of this state, our NPC should stop all animation.  After displaying the appropriate Dying behavior, it should stay still for a short time before removing itself from the gameworld for the sake of garbage collection.  The typical garbage collection method in Unreal involves a simple check for any player currently looking at the Actor, and if no player is, delete it.  If a player happens to be watching our character at this time, we will DeRez it's Mesh, a typical function where the Skin is changed to a gently flashing texture before the Actor is deleted.  It visually lets players know this Actor is about to be removed.  On Clients, this function will be called by a TornOff() event, which signals the Client has been given control of this actor.  We will use bTearOff to signal to Clients that this NaliCow is dead and should be removed.  If not explicitly removed via Destroy(), this NPC will be automatically destroyed after a set time defined with Lifespan.

The following code shows the Dying behavior state.

&lt;uscript&gt;
state Dying
{
    Ignores Trigger, Touch, Bump, Landed, Died;

    function Timer()
    {
        SetPhysics( PHYS_None );
        SetCollision( false, false );
        Lifespan = 3.0;
        if ( PlayerCanSeeMe() )
            DeRez();
        else
            Destroy();
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 4.0, false );
    }

    Begin:
        StopAnimating();
        DisplayBehavior( 11, Min( ( DamageTaken / 20 ), 3 ) );
        MoveCheck( 0.0 );
        if ( Level.NetMode == NM_DedicatedServer )
        {
            SetPhysics( PHYS_None );
            SetCollision( false, false );
            LifeSpan = 3.0;
            bTearOff = true;
        }
}
&lt;/uscript&gt;

Our DeRez function is made available on Clients and can be called from a TornOff() event.

&lt;uscript&gt;
// TornOff() is originally defined in Actor.
event TornOff()
{
    if ( PlayerCanSeeMe() )
        DeRez();
    else
        Destroy();
}

// DeRez() will signal removal of the dead NaliCow.
simulated function DeRez()
{
    if ( Level.NetMode == NM_DedicatedServer )
        return;

    Skins.length = 0;
    Skins[0] = Material'DeRez.Shaders.DeRezFinalBody';  
}
&lt;/uscript&gt;

Sometimes Pawns are asked to die automatically.  The following function will catch any &quot;automatic death&quot; event, such as being crushed by a Mover or Telefragged.

&lt;uscript&gt;
// Died() is originally defined in Pawn.
function Died( Controller Killer, class&lt;DamageType&gt; DamageType, vector HitLocation )
{
	TakeDamage( Health, None, Location, vect(0,0,-1), class'Crushed' );
}
&lt;/uscript&gt;

===Effects===

Besides the blood puffs needed to indicate Damage, the only effect this NPC needs is it's poop.  When it performs its Poop behavior, we will want a separate Actor, a Projectile, to spawn at the appropriate place and drop to the ground.

We will use this line during the Poop behavior to spawn the NaliCowPoop in the appropriate location and orientation; towards the back of the character and pointing down.

&lt;uscript&gt;
	spawn( class'NaliCowPoop',, 'Poop', ( Location + ( vector(Rotation) * -24 ) ), rotator( vect(0,0,-1) ) );
&lt;/uscript&gt;

==Class Construction==

Our NPC mostly uses functions and methods already found in the Pawn class.  Because this character is not meant to respawn, pickup [[Legacy:Adrenaline|Adrenaline]], carry [[Legacy:Inventory|Inventory]], etc., a simple Pawn subclass can be used without a custom Controller.  The AI can be coded into the custom Pawn class, NaliCow, and we can use the default AIController.

For the effects, the NaliCowPoop, we will use make a custom subclass from the Projectile class, BioGlob.

===NaliCow===

With our code elements defined, we can simply begin to piece them together within a Pawn subclass called NaliCow.  Along the way, we will make decisions about any further behaviors needed, such as a simple Turn behavior, where the Walk animation is played but the character only spins in place, or a redefinition of the Landed() event to make sure the character reacts appropriately if bStartled.  We will also make decisions about the frequency and chance that any given behavior be initiated from any other.  Most of the time, a simple random chance filtered through a switch statement will suffice.

A state will be defined for each behavior, allowing us to completely control the character, including it's movement and further behavior.

Putting together this NPC character requires the use of properties and methods, some will be custom, but most of which have been defined in the Pawn, Actor or Controller classes.  

====Pawn Default Properties====
; (Advanced) float Lifespan : Pawn default is 0.  We keep it there by default, but will be modifying it in game.
; (Collision) int CollisionHeight : Pawn default is 74.  Our default will be 34.
; (Collision) SurfaceType : Pawn default is EST_Default.  Our default will be EST_Flesh.
; (Display) [[Legacy:Mesh|Mesh]] Mesh : Our default is &lt;tt&gt;VertMesh'SkaarjPack_rc.NaliCow'&lt;/tt&gt;.
; (Movement) Physics : Pawn default is PHYS_None.  Our default will be PHYS_Walking.
; (Movement) rotator RotationRate : Pawn default RotationRate.Yaw is 20000.  We keep it there by default, but will be modifying it in game.
; (Movement) vector Velocity, Acceleration : These two properties are used during Movement.
; (None) [[Legacy:Controller|Controller]] Controller : By default Pawns automatically spawn a Controller of Pawn.ControllerClass during PreBeginPlay().  This will be our handle to the Controller.
; (None) class&lt;[[Legacy:Controller|Controller]]&gt; ControllerClass : Pawn default value is [[Legacy:AIController|AIController]].  We keep it there by default.
; (None) int GroundSpeed : Pawn default value is 440.  Our default value will be 100.
; (None) int Health : Pawn default value is 100.  We keep it there by default, but will be modifying it in game.
; (None) bool bReplicateAnimations : Pawn default is false.  Our default value will be true.  For use with SimAnim struct.
; (None) SimAnims : This struct is used for Animation Replication.  Includes AnimSequence, bAnimLoop, etc.
; (None) bool bTearOff : This property is used to make the Client the owner of the actor, making it &quot;TornOff&quot; and no longer replicated to new Clients.  We will use this during Death only.
; (Sound) bool bFullVolume : Pawn default is false.  Our default value will be true.
; (Sound) int SoundRadius : Pawn default is 160.  Our default value will be 512.

====Pawn Default Methods====
; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) : This function is originally defined in Actor.  It will allow an Anim Sequence to play.
; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) : This function is originally defined in Actor.  It will allow an Anim Sequence to loop. 
; StopAnimating() : This function is originally defined in Actor.
; PlaySound( Sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) : This function is originally defined in Actor.  It will allow a Sound to play.
; SetPhysics( EPhysics newPhysics ) : This function is originally defined in Actor.  We will use it when in a Dying state.
; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) : This function is originally defined in Actor.  We will use it when in a Dying state.
; bool PlayerCanSeeMe() : This function is originally defined in Actor.  It returns true when a player has a line of sight to this Actor.  We will use it when in a Dying state.
; AnimEnd( int Channel ) : This event is originally defined in Actor.  It is called when the current animation sequence has played through.  This will allow us to switch from action to action at an appropriate time.
; Landed( vector HitNormal ) : This event is originally defined in Actor.  It is called when the Actor has landed on a Base after falling.
; TornOff() : This event is a signal that this actor is no longer being replicated to new Clients and is now set to &lt;tt&gt;Role == ROLE_Authority&lt;/tt&gt; on the Clients.  We will use this for removal of a dead NaliCow on Clients.

====AIController Properties====
; (None) Actor MoveTarget : Originally defined in Controller, this is the Actor to move toward.
; (None) vector Destination : Originally defined in Controller, this is the vector (Location) to move toward.  We will use this to set desired location.
; (None) vector FocalPoint : Originally defined in Controller, this is the vector to look toward.  We will use this to set desired rotation.
; (None) Actor Focus: Originally defined in Controller, this is the Actor to look toward.

====Final Source Code====

The following is the AI Source Code for a NaliCow NPC, using all the available animations and sounds to convey believable behavior.

&lt;uscript&gt;
//=============================================================================
// NaliCow.
// NaliCow Non-Player Character for UT2004.
// by SuperApe -- Dec 2005
// ( Based on Mesh animations and sounds from Epic Games )
//=============================================================================
class NaliCow extends Pawn
    placeable;

var     Actor       HurtingActor;   // An Actor to get away from.
var     vector      OldLocation;    // Used to determine if stuck.
var		int			DamageTaken;	// Most recent damage amount.
var		bool		bStartled;		// Recently startled.

// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );
}

// DisplayBehavior() takes a BehaviorIndex value and sets the appropriate animation and sound.
// Degrees of behavior will be taken into account via an optional arguement.
function DisplayBehavior( int BehaviorIndex, optional int Degree )
{
    switch( BehaviorIndex ) {
        case(1) :
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
        case(2) : 
            Acting( 'root', sound'SkaarjPack_rc.munch1p', true ); break;
        case(3) : 
            Acting( 'Chew', sound'SkaarjPack_rc.munch1p', true ); break;
        case(4) : 
            if ( FRand() &gt; 0.5 )
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo1c', false );
            else
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo2c', false );
            break;
        case(5) : 
            Acting( 'Shake', sound'SkaarjPack_rc.shakeC', true ); break;
        case(6) : 
            Acting( 'Swish', sound'SkaarjPack_rc.swishC', true ); break;
        case(7) : 
            Acting( 'Walk', sound'SkaarjPack_rc.WalkC', true ); break;
        case(8) : 
            Acting( 'Run', sound'SkaarjPack_rc.WalkC', true ); break;
        case(9) : 
            Acting( 'Landed', sound'SkaarjPack_rc.Thump', false ); break;
        case(10) : 
            if ( Degree &lt; 2 )
                Acting( 'TakeHit', sound'SkaarjPack_rc.cMoo1c', false );
            else if ( Degree == 2 )
                Acting( 'TakeHit2', sound'SkaarjPack_rc.injurC1c', false );
            else if ( Degree == 3 )
                Acting( 'BigHit', sound'SkaarjPack_rc.injurC2c', false );
            break;
        case(11) : 
            if ( Degree &lt; 2 )
                Acting( 'Dead', sound'SkaarjPack_rc.cMoo2c', false );
            else if ( Degree == 2 )
                Acting( 'Dead2', sound'SkaarjPack_rc.DeathC1c', false );
            else if ( Degree == 3 )
                Acting( 'Dead3', sound'SkaarjPack_rc.DeathC2c', false );
            break;
        default : 
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
     }
}

// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, 1.0, 0.1 );
    else
		PlayAnim( Anim, 1.0, 0.1 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = 1.0;
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
    SimAnim.TweenRate = 0.1;
    PlaySound( Soundname, SLOT_Misc );
}

// MoveCheck() deals with periodic checks for bStartled, DamageTaken and falling.
// Then moves the character in direction of Rotation and at speed of SpeedRatio.
function MoveCheck( float SpeedRatio )
{
	DamageTaken = 0;  // Reset most recent damage memory.

	if ( Base == None )  // Should be falling.
	{
		if ( Physics != PHYS_Falling )
			SetPhysics( PHYS_Falling );
		return;
	}

	if ( Controller.MoveTarget == None )
		ReachedDestination( self );

    if ( VSize( Controller.MoveTarget.Location - Location ) &lt; 64 )
   	    ReachedDestination( Controller.MoveTarget );

    if ( VSize( OldLocation - Location ) &lt; 48 )
   	    ReachedDestination( Controller.MoveTarget );

    OldLocation = Location;

    RotationRate.Yaw = SpeedRatio * 20000;
   	Velocity = ( SpeedRatio * GroundSpeed ) * vector( Rotation );
    Acceleration = Velocity;

	if ( FRand() &gt; 0.95 )  // Chance to calm down.
		bStartled = false;
	if ( bStartled &amp;&amp; !self.IsInState('Run') )
		GotoState('Run');  // React to startle.	
}

// ReachedDestination() is originally defined in Pawn.
// MoveTarget and other relevant properties are defined in Controller.
function bool ReachedDestination( Actor OldTarget )
{
    local   Actor   NewTarget, A;
    local   NavigationPoint    NP;

    forEach VisibleActors( class'Actor', A )
        if ( A != OldTarget &amp;&amp; A != HurtingActor )
            NewTarget = A;

    if ( A == None )
        forEach RadiusActors( class'NavigationPoint', NP, 1024 )
            if ( FRand() &gt; 0.5 &amp;&amp; NP != OldTarget &amp;&amp; FastTrace( NP.Location ) )
            {
                A = NP;
                NewTarget = A;
            }

    if ( A == None )
        forEach AllActors( class'Actor', A )
            if ( FRand() &gt; 0.5 &amp;&amp; A != HurtingActor &amp;&amp; A != OldTarget &amp;&amp; A != self &amp;&amp; !A.IsA('Controller') )
                NewTarget = A;

    if ( NewTarget != None )
    {
        Controller.MoveTarget = NewTarget;
        Controller.Destination = NewTarget.Location;
        Controller.FocalPoint = NewTarget.Location;
        Controller.Focus = NewTarget;
    }
    else
    {
        if ( HurtingActor != None )
        {
            Controller.Destination = ( Location - HurtingActor.Location );
            Controller.FocalPoint = Controller.Destination;
        }
        else
        {
            Controller.Destination = vector( Rotation ) * ( 512 * FRand() + 512 );
            Controller.FocalPoint = Controller.Destination;
        }
    }
}

// Trigger() is originally defined in Actor.
function Trigger( Actor Other, Pawn EventInstigator )
{
    if ( self.IsInState('Run') )
        return;
	if ( self.IsInState('Walk') )
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Touch() is originally defined in Actor.
function Touch( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') )
        return;
	GotoState('Walk');
}

// Bump() is originally defined in Actor.
function Bump( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') &amp;&amp; ( FRand() &lt; 0.9 ) )  // Chance to calm.
        return;
	if ( self.IsInState('Walk') &amp;&amp; ( FRand() &gt; 0.9 ) )  // Change due to startle.
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Landed() is originally defined in Actor.
event Landed( vector HitNormal )
{
	Super.Landed( HitNormal );

	if ( Velocity.Z &gt; -200 )  // Slow enough fall to forgive landing.
		return;

	if ( DamageTaken == 0 )
		GotoState('Land');
	else
		GotoState('TakeHit');
}

// TakeDamage() is originally defined in Actor.
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    HurtingActor = InstigatedBy;
	DamageTaken = Damage;
	bStartled = true;

    Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

	if ( DamageTaken &gt; 3 )
	    spawn( class'STR_green_blood_puff',,, HitLocation, Rotator( Momentum ) );

    if ( Controller != None &amp;&amp; ( Controller.MoveTarget == HurtingActor || Controller.Focus == HurtingActor ) )
		ReachedDestination( HurtingActor );  // Do not approach HurtingActor.

    if ( Health &gt; 0 )
        GotoState('TakeHit');
    else if ( !self.IsInState('Dying') )
        GotoState('Dying');
}

// Died() is originally defined in Pawn.
function Died( Controller Killer, class&lt;DamageType&gt; DamageType, vector HitLocation )
{
	TakeDamage( Health, None, Location, vect(0,0,-1), class'Crushed' );
}

// TornOff() is originally defined in Actor.
event TornOff()
{
    if ( PlayerCanSeeMe() )
        DeRez();
    else
        Destroy();
}

// DeRez() will signal removal of the dead NaliCow.
simulated function DeRez()
{
    if ( Level.NetMode == NM_DedicatedServer )
        return;

    Skins.length = 0;
    Skins[0] = Material'DeRez.Shaders.DeRezFinalBody';  
}

auto state() Prone
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Turn');        break;
            case(1) : GotoState('Graze');       break;
            case(2) : GotoState('Poop');        break;
            case(3) : GotoState('Shake');       break;
            case(4) : GotoState('Swish');       break;
            case(5) : GotoState('Walk');        break;
            default : DisplayBehavior( 1 );     break;
        }
    }

    Begin:
        DisplayBehavior( 1 );
		MoveCheck( 0.0 );
        if ( HurtingActor != None )
            if ( FRand() &gt; 0.95 )  // Chance to forgive HurtingActor.
                HurtingActor = None;
}

state() Turn
{
    event AnimEnd( int Channel )
    {
        RotationRate.Yaw = 0;
        GotoState('Prone');
    }

    Begin:
		MoveCheck( 0.0 );
        if ( DesiredRotation != Rotation )
        {
            RotationRate.Yaw = 10000;
            DisplayBehavior( 7 );
        }
        else
            GotoState('Prone');
}

state() Graze
{
    event AnimEnd( int Channel )
    {
        GotoState('Chew');
    }

    Begin:
        DisplayBehavior( 2 );
		MoveCheck( 0.0 );
}

state() Chew
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 15;
        switch ( X ) {
            case(0) : GotoState('Prone');       break;
            case(1) : GotoState('Graze');       break;
            case(2) : GotoState('Poop');        break;
            case(3) : GotoState('Shake');       break;
            case(4) : GotoState('Swish');       break;
            case(5) : GotoState('Walk');        break;
            default : DisplayBehavior( 3 );     break;
        }
    }

    Begin:
        DisplayBehavior( 3 );
		MoveCheck( 0.0 );
}

state Poop
{
    function Timer()
    {
        spawn( class'NaliCowPoop',, 'Poop', ( Location + ( vector(Rotation) * -24 ) ), rotator( vect(0,0,-1) ) );
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Shake');       break;
            case(2) : GotoState('Swish');       break;
            case(3) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 4 );
		MoveCheck( 0.0 );
        SetTimer( 1.0, false );
}

state() Shake
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Poop');        break;

            case(2) : DisplayBehavior( 5 );     break;
            case(3) : GotoState('Swish');       break;
            case(4) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 5 );
		MoveCheck( 0.0 );
}

state Swish
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Poop');        break;
            case(2) : GotoState('Shake');       break;
            case(3) : DisplayBehavior( 6 );     break;
            case(4) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 6 );
		MoveCheck( 0.0 );
}

state Walk
{
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( 0.5 * GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Prone');							break;
            case(1) : GotoState('Turn');							break;
            case(1) : GotoState('Graze');							break;
            case(2) : GotoState('Poop');							break;
            case(3) : GotoState('Shake');							break;
            case(4) : GotoState('Swish');							break;
            default : DisplayBehavior( 7 ); MoveCheck( 0.5 );		break;
        }
    }

    Begin:
        DisplayBehavior( 7 );
		MoveCheck( 0.5 );
}

state Run
{
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 10;
        switch ( X ) {
            case(0) : GotoState('Walk');							break;
            default : DisplayBehavior( 8 ); MoveCheck( 1.0 );		break;
        }
    }

    Begin:
        DisplayBehavior( 8 );
		MoveCheck( 1.0 );
}

state Land
{
    function Timer()
    {
        local   int     X;

		if ( bStartled )  // Always run if startled.
		{
			GotoState('Run');
			return;
		}

        X = FRand() * 10;
        switch ( X ) {
            case(0) : GotoState('Prone');   break;
            case(1) : GotoState('Turn');    break;
            case(2) : GotoState('Shake');   break;
            default : GotoState('Walk');    break;
        }
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 0.2, false );
    }

    Begin:
        DisplayBehavior( 9 );
		MoveCheck( 0.0 );
}

state TakeHit
{
    function Timer()
    {
        GotoState('Run');
    }

    event AnimEnd( int Channel )
    {
        if ( Health &lt; 1 )
            GotoState('Dying');
        else
            SetTimer( 0.2, false );
    }

    Begin:
        DisplayBehavior( 10, Min( ( DamageTaken / 15 ), 3 ) );
        MoveCheck( 0.0 );
}

state Dying
{
    Ignores Trigger, Touch, Bump, Landed, Died;

    function Timer()
    {
        SetPhysics( PHYS_None );
        SetCollision( false, false );
        Lifespan = 3.0;
        if ( PlayerCanSeeMe() )
            DeRez();
        else
            Destroy();
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 4.0, false );
    }

    Begin:
        StopAnimating();
        DisplayBehavior( 11, Min( ( DamageTaken / 20 ), 3 ) );
        MoveCheck( 0.0 );
        if ( Level.NetMode == NM_DedicatedServer )
        {
            SetPhysics( PHYS_None );
            SetCollision( false, false );
            LifeSpan = 3.0;
            bTearOff = true;
        }
}

defaultProperties 
{
    CollisionHeight=34
    SurfaceType=EST_Flesh
    Mesh=VertMesh'SkaarjPack_rc.NaliCow'
    Physics=PHYS_Walking
    GroundSpeed=100
    bReplicateAnimations=true
    bFullVolume=true
    SoundRadius=512
}
&lt;/uscript&gt;

===NaliCowPoop===

An obvious Projectile to use for this NaliCowPoop Actor is the BioRifle's Projectile, BioGlob.  It uses a Mesh that automatically drips, jiggles and splats like our desired NaliCowPoop should.  We will need to make a custom subclass of BioGlob, change its Texture, Lighting and alter some of it's default code to prevent it from causing Damage.

====BioGlob Default Properties====
; (Display) Skins : It's default Skins are set for BioRifle ammo.  We will set it to &lt;tt&gt;Texture'XEffectMat.goop.SlimeSkin'&lt;/tt&gt;.
; (Movement) vector Velocity : The BioGlob starts with a lot of velocity by default, we will set it to vect(0,0,0) during PostBeginPlay().
; (Lighting) int AmbientGlow : BioGlobs have an AmbientGlow by default.  We will set this to zero.
; (Lighting) bool bUnlit : BioGlobs are unlit by default.  We will set this to false.
; (Lighting) bool bDynamicLight : BioGlobs glow by default.  We will set this to false.
; (Lighting) LightType : We will set this to LT_None.
; float RestTime : This property is originally defined in BioGlob.  It determines how long the BioGlob sits before it calls BlowUp().  We will set this value to 10.0.
; int BaseDamage : This property is originally defined in BioGlob.  We will make sure this doesn't cause damage by setting it to 0.

====BioGlob Default Methods====
; BlowUp( vector HitLocation ) : This function is originally defined in BioGlob.  We will modify it to not cause damage and instead switch to a Shriveling state, which shrinks the BioGlob and &quot;pops&quot; it.

====Final Source Code====

&lt;uscript&gt;
//=============================================================================
// NaliCowPoop.
// The effects result of the NaliCow Poop behavior.
// by SuperApe -- Dec 2005
//=============================================================================
class NaliCowPoop extends BioGlob;

function PostBeginPlay()
{
	Super.PostBeginPlay();

	Velocity = vect(0,0,0);
}

// BlowUp() is originally defined in BioGlob.
function BlowUp( vector HitLocation )
{
	GotoState('Shriveling');
}

defaultProperties
{
	Skins(0)=Texture'XEffectMat.goop.SlimeSkin'
	AmbientGlow=0
	bUnlit=false
	bDynamicLight=false
	LightType=LT_None
	RestTime=10.0
	BaseDamage=0
}
&lt;/uscript&gt;

==Testing and Implementation==

The new NPC character should be tested thoroughly to ensure it is behaving reliably both as a character and as a game object.

===Compiling===

If you're familiar with [[Legacy:Compiling With UCC|Compiling With UCC]], then you can skip this section.

The steps for compiling our NPC code are as follows:

# Find your UT2004 base directory.  This is usually &lt;tt&gt;C:/UT2004/&lt;/tt&gt;.  We will refer to this as &lt;tt&gt;.../UT2004/&lt;/tt&gt; from this point on.
# Create a subdirectory there for our NaliCow code, &lt;tt&gt;.../UT2004/NaliCow/&lt;/tt&gt;, and create a subdirectory within that for our Classes, &lt;tt&gt;.../UT2004/NaliCow/Classes&lt;/tt&gt;
# Within that Classes subdirectory, create a simple (text) file with a .uc extention called, &quot;NaliCow.uc&quot;, and another called, &quot;NaliCowPoop.uc&quot;.
# Copy the above final source code for the NaliCow and paste it into the .uc file.  Do the same for the NaliCowPoop code.
# Find your &lt;tt&gt;.../UT2004/System/UT2004.ini&lt;/tt&gt; file and edit it with a text editor.  Find the &lt;tt&gt;EditPackages=&lt;/tt&gt; block and add &lt;tt&gt;EditPackages=NaliCow&lt;/tt&gt; to the end of the block.  This will make sure the compiling application knows which subdirectory to look for things to compile.
# In Windows, use StartMenu -&gt; Run... to launch &lt;tt&gt;.../UT2004/System/ucc make&lt;/tt&gt;.
# If there were no errors, you will now have a &lt;tt&gt;.../UT2004/System/NaliCow.u&lt;/tt&gt; package file. (Note that to ''re-compile'' a package, you must remove it from the &lt;tt&gt;.../UT2004/System/&lt;/tt&gt; subdirectory, or else the compiling application will skip it.)
# If there were errors, they are in the ucc log file, &lt;tt&gt;.../UT2004/System/ucc.txt&lt;/tt&gt;, and will tell you which line number the error came from.

===Implementation===

Now, we will bring our NPC into the game environment to test and debug.

# Within Ued, open a map suitable for testing our NPC.
# In the [[Legacy:Actor Browser|Actor Browser]], go to File -&gt; Open... and select our &lt;tt&gt;NaliCow.u&lt;/tt&gt; package file.
# Add an Actor -&gt; Pawn -&gt; NaliCow to the map.
# Configure the desired properties, if any.
# Hit the Playtest (&quot;Joystick&quot;) button on the [[Legacy:Toolbar|Toolbar]].

Now you have the ability to test it's behaviors under a variety of situations.  This is a good idea to do with any new AI construct.  Be vigilant and thorough in your testing to find all the possible bugs.

Some helpful [[Legacy:Console Commands|Console Commands]] to use during testing are:

; summon NaliCow.NaliCow : This spawns a default NaliCow, placed directly in front of your view.
; addbots &lt;int NumberOfBots&gt; : This adds bots to the map.
; killall &lt;class KillClass&gt; : This destroys all objects of the given KillClass.
; allweapons : Gives all weapons and default ammo.
; map &lt;name MapName&gt; : Starts a new match within the MapName provided.  Note that '''map autoplay''' will re-start the current map within Ued's memory.

===Replication===

If you know how to [[Legacy:Launch A Local Netgame|Launch a Local Netgame]], you may skip this section.

Testing Replication is important to ensure that what you have made offline will work just as well online.

# Save a map with at least a few NaliCows in it, different settings, etc.  Save it to the &lt;tt&gt;.../UT2004/Maps/&lt;/tt&gt; subdirectory with a valid [[Legacy:Map File Prefix|Map File Prefix]].
# Launch UT2004 and Host a game.  Pick your custom map and click on '''Dedicated'''.  The menu window will disappear and a server log window will open as the game launches in the background.
# Launch UT2004 again.  Bring down the console and type, &lt;tt&gt;map 127.0.0.1&lt;/tt&gt;, to join the local server you just started.
# Once there for the first time, bring up the menu by hitting Esc and save this local server as one of your &quot;Favs&quot; for easier Joining in the future.

Now, you're seeing what a slow Dial-Up client player sees.  There will be some lag due to your machine handling both the Server and Client at the same time.  However, this is important to see what imformation is being Replicated properly and what isn't.

For pinpointing the problems, it's useful to use Logs to be called either on the DedicatedServer or not.  See also [[Legacy:Netcode Idioms|Netcode Idioms]].  The Logs are found at &lt;tt&gt;.../UT2004/System/Server.txt&lt;/tt&gt; for the Server and &lt;tt&gt;.../UT2004/System/UT2004.txt&lt;/tt&gt; for the Client.

==Further Development==

Beyond this basic NaliCow NPC, more can be done to improve behavior, realism, gameplay or ease of use.

===DrawScale Adjustments===

Based on the DrawScale property, several adjustments can be made during PostBeginPlay() to make sure the NaliCow behaves, moves and sounds properly.  The result is a simple one-property adjustment that can be made to make a small, fast baby cow or a big, slow older cow.  We will use a separate function that can be called from PostBeginPlay(), AdjustForSize().  Before the adjustments are made, we can make sure the DrawScale is within a reasonable size range.

&lt;uscript&gt;
// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );

	AdjustForSize();
}

// AdjustForSize() will make various adjustments according to DrawScale.
function AdjustForSize()
{
	if ( DrawScale &gt; 3.0 || DrawScale &lt; 0.5 )
		SetDrawScale( FClamp( DrawScale, 3.0, 0.5 ) );
	SetCollisionSize( 34 * DrawScale, 34 * DrawScale );
	Mass = 100 * DrawScale;
	Health = 100 * DrawScale;
	SoundRadius = 512 * DrawScale;
	SoundPitch = 128 / DrawScale;
	if ( DrawScale &gt; 1.5 )
		bCanBeBaseForPawns = true;
}
&lt;/uscript&gt;

Other functions and elements will also have to be changed based on DrawScale.  Changes to the AnimationRate, RotationRate, SoundVolume, SoundPitch, NaliCowPoop DrawScale and RestTime, etc. can all be made to reflect the size of the NaliCow.  For example, the Acting() function can be altered to look like this:

&lt;uscript&gt;
// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, ( 1.0 / DrawScale ), ( 1.0 / DrawScale )/10 );
    else
		PlayAnim( Anim, ( 1.0 / DrawScale ), ( 1.0 / DrawScale )/10 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = ( 1.0 / DrawScale );
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
	SimAnim.TweenRate = ( 1.0 / DrawScale )/10;
    PlaySound( Soundname, SLOT_Misc, ( DrawScale * 2 ),,, ( SoundPitch / 128 ) );
}
&lt;/uscript&gt;

===Cow and Baby Relationships===

The original [[Legacy:Cow|Cow]] and BabyCow UT creatures had properties to define their relationships.  These can be reproduced with our NaliCow to perform the same behaviors.

====bHasBaby and BabyCow====

In UT, the property bHasBaby was meant to automatically spawn a BabyCow (a smaller version) for this Cow.  BabyCows were not meant to be explicitly placed in maps.  A simple modification to PostBeginPlay() should allow us to use our new DrawScale adjustments to do this easily.

&lt;uscript&gt;
var()		bool		bHasBaby;		// This NaliCow will spawn a smaller &quot;Baby&quot; at map start.
var  		NaliCow		Mama;			// This NaliCow is a &quot;Baby&quot; and should stay close to &quot;Mama&quot;.

event PostBeginPlay()
{
	local	NaliCow		Baby;

	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );

	AdjustForSize();
	
	if ( bHasBaby )
		while ( Baby == None )
		{
			Baby = spawn( class'NaliCow', self,, Location + ( VRand() * ( 64 + CollisionRadius ) ), Rotation );
			if ( Baby != None )
			{
				Baby.Mama = self;
				Baby.SetDrawScale( DrawScale / 2 );
				Baby.AdjustForSize();
			}
		}
}
&lt;/uscript&gt;

Also, we should encourage the BabyCow to stay close to its &quot;Mama&quot;.  We will do this with a modification to ReachedDestination().  The following code will be added to ReachedDestination() just before NewTarget is assigned to the Controller attributes.

&lt;uscript&gt;
	if ( Mama != None )
		NewTarget = Mama;
&lt;/uscript&gt;

====bStayClose and WanderRadius====

bStayClose modified the behavior of the Cow so that it's Movement destinations were never more than WanderRadius UU away from it's starting Location.  ''Note: Although there is a '''home''' property defined in Controller, it is defined as a NavigationPoint and won't serve this purpose.''

&lt;uscript&gt;
var()		bool		bStayClose;		// This NaliCow will only select MoveTargets within WanderRadius.
var()		int 		WanderRadius;	// The radius from Home that MoveTargets will be selected.
var  		vector		Home;			// The Location this NaliCow started at.
&lt;/uscript&gt;

And the following code will be added to the end of ReachedDestination().

&lt;uscript&gt;
	if ( bStayClose &amp;&amp; WanderRadius &gt; 0 &amp;&amp; 
		( VSize( NewTarget.Location - Home ) &gt; WanderRadius || 
			VSize( Controller.Destination - Home ) &gt; WanderRadius ) )
	{
		Controller.Destination = Home + ( VRand() * ( FRand() * WanderRadius ) );
		Controller.FocalPoint = Controller.Destination;
	}
&lt;/uscript&gt;

===Ridable NaliCows===

An extra gameplay feature could be to have players be able to ride and loosely steer larger NaliCows.  You may have noticed the &lt;tt&gt;bCanBeBaseForPawns&lt;/tt&gt; property set during AdjustForSize() in the section above.  This will allow larger cows to support and carry Pawns.  Once a player has managed to get on top of one, a simple UsedBy() function can enable them to press Use and become a special Pawn to the NaliCow.

&lt;uscript&gt;
var		Pawn		Rider;			// PlayerPawn riding this cow.

// UsedBy() is originally defined in Actor.
function UsedBy( Pawn P )
{
	if ( !bCanBeBaseForPawns )
		return;

	if ( Rider == None )
	{
		Rider = P;
		if ( PlayerController( Rider.Controller ) != None )
			PlayerController( Rider.Controller ).bBehindView = true;
	}

	if ( P == Rider )
	{
		Controller.Destination = Location + ( vector( rot(0,1,0) * Rider.Controller.Rotation.Yaw ) * 1024 );
		Controller.FocalPoint = Controller.Destination;
		if ( !self.IsInState('Run') )
			GotoState('Run');
		else
			PlaySound( sound'SkaarjPack_rc.injurC1c', SLOT_Misc, ( DrawScale * 2 ),,, ( SoundPitch / 128 ) );
	}
}
&lt;/uscript&gt;

Once the player has become a Rider to the NaliCow, the NaliCow's Controller's Destinations are subject to the whims of the Rider.Controller.  The Rider.Controller also is automatically set to bBehindView to give a visual cue that the change has taken place.  By pressing the Use key, the NaliCow is urged to keep Running.  When the NaliCow reaches it's Destinations, we'll keep the player in control by adding a little code to the top of ReachedDestination().

&lt;uscript&gt;
    if ( Rider != None )
    {
        if ( VSize( Rider.Location - Location ) &gt; ( CollisionHeight + Rider.CollisionHeight ) )
        {
            if ( PlayerController( Rider.Controller ) != None )
                PlayerController( Rider.Controller ).bBehindView = false;
            Rider = None;  // Rider has left.
        }
        else
        {
            Controller.Destination = Location + ( vector( rot(0,1,0) * Rider.Controller.Rotation.Yaw ) * 1024 );
            Controller.FocalPoint = Controller.Destination;
            return true;
        }
    }
&lt;/uscript&gt;

To stop being a Rider, the player can simply move off the NaliCow.  The bBehindView setting will return after the NaliCow has reached it's next Destination.

==External Links==

Other links to basic AI scripting tutorials should be listed here:
* [http://www.langsuyar.com/articles/u2_tutorialsmain.html Mattias Worch's Unreal 2 Tutorials] '''(broken)''' :
: Mattias Worch worked on the Unreal 2 team and has written a few useful tutorials on AI scripting. The tutorials on this page directly relating to AI scripting are &quot;Set up Dialog and AI Scripting for a Level,&quot; and &quot;Create a Basic AI Script.&quot; Please note that the copyright on these tutorials allows us to link to them, but not to &quot;wikify&quot; the tutorials and place them here. If you would like to have a tutorial on the Wiki, I'm sure that everyone would appreciate if someone were to read over these tutorials and experiment with AI scripting until they had a complete enough understanding to place an original tutorial here.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic on all AI (bots, Monsters, NPCs, etc.)
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:UnrealScript|UnrealScript]]

==Discussion==

'''Tarquin:''' Link to documentation wiki pages, if they exist, or start writing them! That's a good way to start.

'''Foxpaw:''' I actually don't have any experience with AI scripting myself, I was just using the random page function and thought this page could use a bit of refactoring.

'''SuperApe:''' The above link is dead.  Yes, we need links or some tuts on the wiki itself.

'''SuperApe:''' I will most likely take over this page and revive it.  Linking to [[Legacy:NPC Support|NPC Support]] and others.  My thought is to take the Mesh for the NaliCow and re-construct it's AI coding as an NPC for UT2004. (I never had UT, so this will be a from scratch effort that I look forward to)  Tutorial outlined.  Working...

'''SuperApe:''' This is a tutorial on UScripting a custom AI.  Comments welcome.

'''Solid Snake:''' Hmmm, I don't really like some of the code in here as I think it could be a lot better.

'''SuperApe:''' I'll do my best to take that as constructive criticism, but it would really help if you could elaborate.  I guess, '''This page is under construction.'''

'''SuperApe:''' After spending some time with [[Legacy:Monster|Monster]]s, I see a much easier way to do this.  I will redo this tutorial, taking advantage of the all Pawn functions, instead of &quot;re-inventing the wheel&quot;, like I do above.  This will make sounds and animation play better.  The code will be much smaller.  However, I will need to build a custom Controller, as MonsterController does not have a &quot;pacifist&quot; setting. ;)  Other than that, it should be much more generalized and applicable to other people's projects.  Working...

'''SuperApe:''' Something like this, plus a new MonsterController to favor Wandering, avoid Hunting, Attacking, StakeOut, etc.

&lt;uscript&gt;
//=============================================================================
// NaliCow.
// Recreation of UT NaliCow.
// by SuperApe -- Jan 2006
//=============================================================================
class NaliCow extends Monster
	placeable;

var()	bool        bHasBaby;       // Spawns a smaller &quot;Baby&quot; at map start.
var()	bool        bStayClose;     // Only select MoveTargets within WanderRadius.
var()	int         WanderRadius;   // The radius from Home that MoveTargets will be selected.

var		name		DeathAnim[4];  // Death animations.
var		name		InjureAnim[4];  // Injury animations.

var		name		IdleAnim[6];  // Idle animations.
var		sound		IdleSounds[6];  // Idle sounds.

function PostBeginPlay()

{
	Super.PostBeginPlay();

	// FIXME: Make attitude ignore, friendly or fear players only.
}

// This stand-alone creature should avoid being placed in a roster.  Skip UnrealPawn's PostNetBeginPlay().
simulated function PostBeginNetPlay()
{
	// Do Pawn's PostNetBeginPlay()
	local playercontroller P;

	if ( Level.bDropDetail || (Level.DetailMode == DM_Low) )
		MaxLights = Min(4,MaxLights);
	if ( Role == ROLE_Authority )
		return;
	if ( (Controller != None) &amp;&amp; (Controller.Pawn == None) )
	{
		Controller.Pawn = self;
		if ( (PlayerController(Controller) != None)
			&amp;&amp; (PlayerController(Controller).ViewTarget == Controller) )
			PlayerController(Controller).SetViewTarget(self);
	}

	if ( Role == ROLE_AutonomousProxy )
		bUpdateEyeHeight = true;

	if ( (PlayerReplicationInfo != None)
		&amp;&amp; (PlayerReplicationInfo.Owner == None) )
	{
		PlayerReplicationInfo.SetOwner(Controller);
		if ( left(PlayerReplicationInfo.PlayerName, 5) ~= &quot;PRESS&quot; )
		{
			P = Level.GetLocalPlayerController();
			if ( (P.PlayerReplicationInfo != None) &amp;&amp; !(left(PlayerReplicationInfo.PlayerName, 5) ~= &quot;PRESS&quot;) )
				bScriptPostRender = true;
		}
	}
	PlayWaiting();

	// Do xPawn's PostNetBeginPlay()
	MultiJumpRemaining = MaxMultiJump;
	bCanDoubleJump = CanMultiJump();
}

function Step()
{
	PlaySound(sound'SkaarjPack_rc.WalkC', SLOT_Interact);
}

simulated function AnimEnd(int Channel)
{
	local 	name	Anim, New;
	local 	float	frame, rate;
	local	int		n;
	local	BioGlob	B;

    if( Level.TimeSeconds - LastPainSound &lt; MinTimeBetweenPainSounds )
        return;  // Allow pain to play through.

	if ( Channel == 0 )
	{
		GetAnimParams(0, Anim,frame,rate);
		if ( Anim == 'Swish' || Anim == 'Shake' || Anim == 'Poop' )
			n = int( FRand() * 6 );		
		if ( ( Anim != 'Breath' || Anim != 'Chew' ) &amp;&amp; Anim == IdleAnim[n] )
			n = int( FRand() * 6 );

		if ( Anim == 'Poop' )
		{
			B = spawn( class'BioGlob', self,, Location - ( vector( Rotation ) * 24 ) );
			B.Velocity = vect(0,0,0);
			B.bDynamicLight = false;
			B.AmbientGlow = 0;
			B.RestTime *= 2.0;
			B.BaseDamage = 0;
			B.Damage = 0;
			B.Skins[0] = Texture'XEffectMat.goop.SlimeSkin';
			if ( FRand() &gt; 0.5 )
				IdleSounds[3] = sound'SkaarjPack_rc.cMoo1c';
			else
				IdleSounds[3] = sound'SkaarjPack_rc.cMoo2c';
		}
		if ( Anim == 'root' )
			n = 2;
		if ( FRand() &gt; 0.8 )
			n = 0;

		IdleWeaponAnim = IdleAnim[n];
		PlayAnim( IdleAnim[n] );
		PlaySound( IdleSounds[n] );
	}
	Super.AnimEnd(Channel);
}

function PlayTakeHit(vector HitLocation, int Damage, class&lt;DamageType&gt; DamageType)
{
	local	int		i;

    if( Level.TimeSeconds - LastPainSound &lt; MinTimeBetweenPainSounds )
        return;

	i = Clamp( ( Damage / 15 ), 0, 3 );
	PlayAnim( InjureAnim[i] );

    LastPainSound = Level.TimeSeconds;
	if ( i == 1 )
		PlaySound(sound'SkaarjPack_rc.cMoo1c', SLOT_Pain, 2*TransientSoundVolume,, 200);
	else if ( i == 2 )
		PlaySound(sound'SkaarjPack_rc.injurC1c', SLOT_Pain, 2*TransientSoundVolume,, 200);
	else
		PlaySound(sound'SkaarjPack_rc.injurC2c', SLOT_Pain, 2*TransientSoundVolume,, 200);
}

simulated function PlayDying(class&lt;DamageType&gt; DamageType, vector HitLoc)
{
	AmbientSound = None;
    bCanTeleport = false; 
    bReplicateMovement = false;
    bTearOff = true;
    bPlayedDeath = true;
		
	HitDamageType = DamageType; // these are replicated to other clients
    TakeHitLocation = HitLoc;
	LifeSpan = RagdollLifeSpan;

    GotoState('Dying');
		
	Velocity += TearOffMomentum;
    BaseEyeHeight = Default.BaseEyeHeight;
    SetPhysics(PHYS_Falling);

	PlayAnim(DeathAnim[Rand(4)],1.2,0.05);		
}

defaultproperties
{
     DeathAnim(0)=&quot;Dead&quot;
     DeathAnim(1)=&quot;Dead2&quot;
     DeathAnim(2)=&quot;Dead3&quot;
     DeathAnim(3)=&quot;Dead3&quot;
     InjureAnim(0)=&quot;TakeHit&quot;
     InjureAnim(1)=&quot;TakeHit2&quot;
     InjureAnim(2)=&quot;BigHit&quot;
     InjureAnim(3)=&quot;BigHit&quot;
     IdleAnim(0)=&quot;Breath&quot;
     IdleAnim(1)=&quot;root&quot;
     IdleAnim(2)=&quot;Chew&quot;
     IdleAnim(3)=&quot;Poop&quot;
     IdleAnim(4)=&quot;Shake&quot;
     IdleAnim(5)=&quot;Swish&quot;
     IdleSounds(0)=Sound'SkaarjPack_rc.Cow.ambCow'
     IdleSounds(1)=Sound'SkaarjPack_rc.Pupae.munch1p'
     IdleSounds(2)=Sound'SkaarjPack_rc.Pupae.munch1p'
     IdleSounds(3)=Sound'SkaarjPack_rc.Cow.cMoo2c'
     IdleSounds(4)=Sound'SkaarjPack_rc.Cow.shakeC'
     IdleSounds(5)=Sound'SkaarjPack_rc.Cow.swishC'
     StartingAnim=&quot;Breath&quot;
     bMeleeFighter=False
     bCanDodge=False
     HitSound(0)=Sound'SkaarjPack_rc.Cow.injurC1c'
     HitSound(1)=Sound'SkaarjPack_rc.Cow.injurC2c'
     HitSound(2)=Sound'SkaarjPack_rc.Cow.injurC1c'
     HitSound(3)=Sound'SkaarjPack_rc.Cow.injurC2c'
     DeathSound(0)=Sound'SkaarjPack_rc.Cow.cMoo2c'
     DeathSound(1)=Sound'SkaarjPack_rc.Cow.DeathC1c'
     DeathSound(2)=Sound'SkaarjPack_rc.Cow.DeathC2c'
     DeathSound(3)=Sound'SkaarjPack_rc.Cow.DeathC2c'
     bCanDodgeDoubleJump=False
     WallDodgeAnims(0)=&quot;Landed&quot;
     WallDodgeAnims(1)=&quot;Landed&quot;
     WallDodgeAnims(2)=&quot;Landed&quot;
     WallDodgeAnims(3)=&quot;Landed&quot;
     IdleHeavyAnim=&quot;Breath&quot;
     IdleRifleAnim=&quot;Breath&quot;
     bCanJump=False
     bCanClimbLadders=False
     bCanStrafe=False
     bCanDoubleJump=False
     bCanUse=False
     MeleeRange=80.000000
     GroundSpeed=100.000000
     WaterSpeed=75.000000
     JumpZ=75.000000
     ControllerClass=Class'MonsterController'
     MovementAnims(0)=&quot;Run&quot;
     MovementAnims(1)=&quot;Run&quot;
     MovementAnims(2)=&quot;Run&quot;
     MovementAnims(3)=&quot;Run&quot;
     TurnLeftAnim=&quot;Walk&quot;
     TurnRightAnim=&quot;Walk&quot;
     SwimAnims(0)=&quot;Run&quot;
     SwimAnims(1)=&quot;Run&quot;
     SwimAnims(2)=&quot;Run&quot;
     SwimAnims(3)=&quot;Run&quot;
     WalkAnims(0)=&quot;Walk&quot;
     WalkAnims(1)=&quot;Walk&quot;
     WalkAnims(2)=&quot;Walk&quot;
     WalkAnims(3)=&quot;Walk&quot;
     AirAnims(0)=&quot;Landed&quot;
     AirAnims(1)=&quot;Landed&quot;
     AirAnims(2)=&quot;Landed&quot;
     AirAnims(3)=&quot;Landed&quot;
     TakeoffAnims(0)=&quot;Landed&quot;
     TakeoffAnims(1)=&quot;Landed&quot;
     TakeoffAnims(2)=&quot;Landed&quot;
     TakeoffAnims(3)=&quot;Landed&quot;
     LandAnims(0)=&quot;Landed&quot;
     LandAnims(1)=&quot;Landed&quot;
     LandAnims(2)=&quot;Landed&quot;
     LandAnims(3)=&quot;Landed&quot;
     DoubleJumpAnims(0)=&quot;Landed&quot;
     DoubleJumpAnims(1)=&quot;Landed&quot;
     DoubleJumpAnims(2)=&quot;Landed&quot;
     DoubleJumpAnims(3)=&quot;Landed&quot;
     DodgeAnims(0)=&quot;Landed&quot;
     DodgeAnims(1)=&quot;Landed&quot;
     DodgeAnims(2)=&quot;Landed&quot;
     DodgeAnims(3)=&quot;Landed&quot;
     AirStillAnim=&quot;Landed&quot;
     TakeoffStillAnim=&quot;Landed&quot;
     IdleCrouchAnim=&quot;Breath&quot;
     IdleSwimAnim=&quot;Walk&quot;
     IdleWeaponAnim=&quot;Breath&quot;
     IdleRestAnim=&quot;Breath&quot;
     Mesh=VertMesh'SkaarjPack_rc.NaliCow'
     PrePivot=(Z=0.000000)
     CollisionRadius=34.000000
     CollisionHeight=34.000000
}
&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1827</id>
      <timestamp>2006-01-04T04:36:40Z</timestamp>
      <contributor>
        <ip>203-79-73-148.paradise.net.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a tutorial on UScripting a custom AI.

==Overview==

This tutorial will detail re-construction of the NaliCow NPC for UT2004.  It was originally available in UT as a [[Legacy:Cow|Cow]], but this tutorial will revise its AI design as if it were new.  The stock meshes and sounds that are available will allow us to concentrate purely on the AI that drives its behavior.  We will start will a comprehensive behavior design before coding the elements and constructing the custom classes that will give this NPC life and then implement it in the game environment.

[[Image:Legacy_scriptedpawn.nalicows.jpeg|center|The NaliCow and BabyCow from Unreal Tournament.]]

==Prerequisites==

Although creating only a simple AI for this NPC, this will be an advanced tutorial that assumes a solid understanding of [[Legacy:UnrealScript|UnrealScript]].  This tutorial will assume you know how to [[Legacy:Create A Subclass|Create A Subclass]], [[Legacy:Set Up Package Folders|Set up package folders]], [[Legacy:Launch A Local Netgame|Launch a local netgame]] and [[Legacy:Add EditPackage|Add EditPackage]].  In terms of [[Legacy:Making Mods|Making Mods]], this tutorial will assume that you know about [[Legacy:Replication|Replication]], [[Legacy:Coding Guidelines|Coding Guidelines]] and [[Legacy:Compiling With UCC|Compiling with UCC]].

Even if you aren't confident in your understanding of these many topics, this tutorial will still serve as an overview discussion of designing a simple [[Legacy:Artificial Intelligence|Artificial Intelligence]] construct.

==Behavior Design==

We will begin by defining a design for the NaliCow's behavior.

===AI Design Plan===

The behavior design is the roadmap for our AI scripting, giving us a clear set of coding elements to complete before it's AI takes shape.

Although there are many different methods of designing AI (including sophisticated methods such as neural networks and artificial evolution), with a simple creature like this, our tutorial will follow the most basic and standard method used by all stock Unreal AI; conditional decision-making.  This is the method that takes stimuli as a constant condition or trigger to either do this or that; also known as &quot;if this, then do that&quot;, or &quot;if-then&quot; decision-making.  A common example of this kind of AI is the AI Script in a [[Legacy:ScriptedSequence|ScriptedSequence]], but even Bots use this method, just in an extremely complex form.

We have some features of our NPC already defined for us; it's model, textures, animation and sounds.  Normally, a custom character would be started by defining it's purpose or goal and then design those features around it.  But for this behavior design, we will work &quot;backwards&quot;; starting with those features and finding the purpose and behavior design that fits it.

With that in mind, we will first look at what we have to work with.

===Provided Animation and Sounds===

There are plenty of stock animations provided in UT2004 for the NaliCow even though there is no [[Legacy:Monster|Monster]] subclass for it.  With these animation sequences, we can easily construct an AI design flow that will convey a creature of convincing realism and range of ability.  The following is a list of the NaliCow animations found the [[Legacy:Mesh Browser|Mesh Browser]]. The number of animation frames in the sequence are shown in brackets.  ''Loop'' indicates the last frame matches a common start pose of all other ''Loop'' animations.  ''SingleFrame'' is just one frame, a pose.  ''Sequence'' indicates an animation sequence that is meant to only play through once and does not end on the common starting pose of the ''Loop'' animations.
* '''root''' [20] : Loop.  Bends down to graze.
* '''Breath''' [6] : Loop.  Breathes.  Prone.
* '''Chew''' [7] : Loop.  Chews.
* '''Poop''' [20] : Loop.  Lifts tail and poops.
* '''Shake''' [18] : Loop.  Shakes head, as if shaking off water or dust.
* '''Swish''' [20] : Loop.  Swishes it's tail from side to side and stamps foot.
* '''Walk''' [15] : Loop.  A walk cycle.
* '''Run''' [10] : Loop.  A run cycle.
* '''Landed''' [1] : Single frame.  Indicates recovery from a fall.
* '''TakeHit1''' [1] : Single frame.  Indicates recovery from damage.
* '''TakeHit2''' [1] : Single frame.  Indicates recovery from more damage.
* '''BigHit''' [1] : Single frame.  Indicates recovery from a lot of damage. (both feet in the air)
* '''Dead''' [23] : Sequence.  Indicates a slow death, slumping to the side.
* '''Dead2''' [13] : Sequence.  Death animation, starting from '''TakeHit2''', slumping forward.
* '''Dead3''' [23] : Sequence.  Severe death, starting from '''BigHit''', showing a complete back flip.

These stock sounds are available in the [[Legacy:Sound Browser|Sound Browser]], under &lt;tt&gt;SkaarjPack_rc&lt;/tt&gt;, that relate to the NaliCow:
* '''ambCow''' : Breath of a NaliCow.
* '''cMoo1c''' : NaliCow call. (sounds suspiciously like a Doom creature's death cry)
* '''cMoo2c''' : Another call.
* '''DeathC1c''' : &quot;Urgent&quot; call.
* '''DeathC2c''' : Another &quot;urgent&quot; call.
* '''injurC1c''' : Pained call.
* '''injurC2c''' : A call that sounds a little like, &quot;Ow&quot;.
* '''munch1p''' : A biting sound (normally used for the SkaarjPupae).
* '''shakeC''' : Ears flapping as the NaliCow shakes.
* '''swishC''' : Swishing sound of the NaliCow tail.
* '''Thump''' : Generic hard landing sound.
* '''WalkC''' : NaliCow footstep.

===AI Design Flow===

With these pieces, we can begin to analyze the potential behavior and assemble the design in such a way that we understand how one piece leads to the next.

* Some of these pieces indicate behavior that's initiated by the NaliCow; such as Grazing, Swishing, Pooping.  Others are behaviors that are in reaction to external stimuli; such as TakeHit or Death.
* We know we will want the NaliCow to navigate from place to place.  Some decision making will involve where to go and whether to walk or run.  Running away from danger will serve a self-preservation purpose while walking toward a goal, such as another NaliCow, may serve to support the idea these are real creatures (an immersion purpose) through a percieved flocking behavior.
* Obvious connections can be made between the animation sequences and the sounds that correspond to them.  We will want to have these sounds play whenever those animations are played.  Other connections can be made between some of these pieces, where one will likely lead to another; such as Grazing leading to Chewing, a TakeHit leading to either Death or Run, etc.
* One piece of this behavior, Pooping, appears to need an extra effect; the NaliCowPoop itself.  It will have to be an extra actor class with it's own code.

We can see a prone state, where the '''Breath''' animation and '''ambCow''' sound would be looped.  This appears to be a good place to start.  We will be able to branch out from this prone state to any other looping animation sequence and corresponding sound, building up the behavior design flow, piece by piece.

The following chart attempts to describe all the possible behaviors, their animation, their sound and what behaviors might preceed and follow them.

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |
===='''NaliCow Behaviors'''====
 
|-
|
| style=&quot;text-align: center&quot; |'''1. Prone'''
| style=&quot;text-align: center&quot; |'''2. Graze'''
| style=&quot;text-align: center&quot; |'''3. Chew'''
| style=&quot;text-align: center&quot; |'''4. Poop'''
| style=&quot;text-align: center&quot; |'''5. Shake'''
| style=&quot;text-align: center&quot; |'''6. Swish'''
| style=&quot;text-align: center&quot; |'''7. Walk'''
| style=&quot;text-align: center&quot; |'''8. Run'''
| style=&quot;text-align: center&quot; |'''9. Land'''
| style=&quot;text-align: center&quot; |'''10. TakeHit'''
| style=&quot;text-align: center&quot; |'''11. Dying''' 
|-
| style=&quot;text-align: left&quot; |'''Animation'''
|Breath
|root
|Chew
|Poop
|Shake
|Swish
|Walk
|Run
|Landed
|TakeHit1, 2 or BigHit
|Dead, 2, 3 
|-
| style=&quot;text-align: left&quot; |'''Sound'''
|ambCow
|munch1p
|munch1p
|cMoo1c, 2c
|shakeC
|swishC
|WalkC
|WalkC
|Thump
|injurC1c, 2c
|DeathC1c, 2c 
|-
| style=&quot;text-align: left&quot; |'''Lead From'''
|1-7
|1-7
|2
|1-7
|1-7
|1-7
|1-10
|7-10
|7 or 8**
|1-9***
|10 
|-
| style=&quot;text-align: left&quot; |'''Lead To'''
|1-7
|3
|1-7
|1-7*
|1-7
|1-7
|1-8
|7-8
|1, 5, 7
|7, 8, 11
|''None''&amp;dagger; 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |* &amp;ndash; ''A NaliCowPoop actor should be spawned during this behavior.'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |** &amp;ndash; ''This behavior will activate immeditately upon landing from a fall, without waiting for animation loops to end..'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |*** &amp;ndash; ''This behavior will activate immeditately upon taking damage, without waiting for animation loops to end.'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |&amp;dagger; &amp;ndash; ''The NaliCow carcass will DeRes and disappear a short time after this behavior.'' 
|}

==Coding Elements==

With the AI Design Flow sketched out, we will be able to code the AI behaviors appropriately.  But first, we will have to complete the code that will handle the basic tasks these behaviors will have to perform.  These tasks include animation, sound, movement, damage, death, etc.

===Animation &amp; Sound===

As shown in the above chart, animation sequences and sounds are linked together.  A couple exceptions to that rule include animations that can play one of a few available sounds and actions that play one animation, but more than one sound, such as Walk or Run, where two footsteps should be heard.  We will use the animation sequence as a handle for the action and have that dictate the possible sounds.

&lt;uscript&gt;
// DisplayBehavior() takes a BehaviorIndex value and sets the appropriate animation and sound.
// Degrees of behavior will be taken into account via an optional arguement.
function DisplayBehavior( int BehaviorIndex, optional int Degree )
{
    switch( BehaviorIndex ) {
        case(1) :
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
        case(2) : 
            Acting( 'root', sound'SkaarjPack_rc.munch1p', true ); break;
        case(3) : 
            Acting( 'Chew', sound'SkaarjPack_rc.munch1p', true ); break;
        case(4) : 
            if ( FRand() &gt; 0.5 )
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo1c', false );
            else
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo2c', false );
            break;
        case(5) : 
            Acting( 'Shake', sound'SkaarjPack_rc.shakeC', true ); break;
        case(6) : 
            Acting( 'Swish', sound'SkaarjPack_rc.swishC', true ); break;
        case(7) : 
            Acting( 'Walk', sound'SkaarjPack_rc.WalkC', true ); break;
        case(8) : 
            Acting( 'Run', sound'SkaarjPack_rc.WalkC', true ); break;
        case(9) : 
            Acting( 'Landed', sound'SkaarjPack_rc.Thump', false ); break;
        case(10) : 
            if ( Degree &lt; 2 )
                Acting( 'TakeHit', sound'SkaarjPack_rc.cMoo1c', false );
            else if ( Degree == 2 )
                Acting( 'TakeHit2', sound'SkaarjPack_rc.injurC1c', false );
            else if ( Degree == 3 )
                Acting( 'BigHit', sound'SkaarjPack_rc.injurC2c', false );
            break;
        case(11) : 
            if ( Degree &lt; 2 )
                Acting( 'Dead', sound'SkaarjPack_rc.cMoo2c', false );
            else if ( Degree == 2 )
                Acting( 'Dead2', sound'SkaarjPack_rc.DeathC1c', false );
            else if ( Degree == 3 )
                Acting( 'Dead3', sound'SkaarjPack_rc.DeathC2c', false );
            break;
        default : 
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
     }
}

// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, 1.0, 0.1 );
    else
        PlayAnim( Anim, 1.0, 0.1 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = 1.0;
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
	SimAnim.TweenRate = 0.1;
    PlaySound( Soundname, SLOT_Misc );
}
&lt;/uscript&gt;

===Navigation===

This is our first decision-making code.  We will need our AI to decide where to go and what to look at.  Controllers use MoveTarget and ViewTarget by default.  They are the Destination and Focus for the controller.  We will simply alter those properties based on desires of self-preservation.

First, if we have reached our destination, we want to be able to select another one reasonably.  Next, if another Actor has hurt our NPC, we want our AI to avoid it.  So we will do checks to make sure the selected destination or focus is not the Actor that hurt our NPC.  We will also avoid any Actor who Bumps or Touches our NPC, as if it had hurt it.  If the NPC is Bumped, Touched or Triggered, we will have our NPC Walk away, or if already Walking, perhaps begin to Run.  Finally, we want to know if our NPC is stuck, trying to reach a destination but not able to progress from it's current Location.  We will do a simple check to ensure it makes progress when it Walks or Runs, and if not, we will select another destination.

&lt;uscript&gt;
var		Actor		HurtingActor;	// An Actor to get away from.
var		vector		OldLocation;	// Used to determine if stuck.

// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );
}

// ReachedDestination() is originally defined in Pawn.
// MoveTarget and other relevant properties are defined in Controller.
function bool ReachedDestination( Actor OldTarget )
{
    local   Actor   NewTarget, A;
    local   NavigationPoint    NP;

    forEach VisibleActors( class'Actor', A )
        if ( A != OldTarget &amp;&amp; A != HurtingActor )
            NewTarget = A;

    if ( A == None )
        forEach RadiusActors( class'NavigationPoint', NP, 1024 )
            if ( FRand() &gt; 0.5 &amp;&amp; NP != OldTarget &amp;&amp; FastTrace( NP.Location ) )
            {
                A = NP;
                NewTarget = A;
            }

    if ( A == None )
        forEach AllActors( class'Actor', A )
            if ( FRand() &gt; 0.5 &amp;&amp; A != HurtingActor &amp;&amp; A != OldTarget &amp;&amp; A != self &amp;&amp; !A.IsA('Controller') )
                NewTarget = A;

    if ( NewTarget != None )
    {
        Controller.MoveTarget = NewTarget;
        Controller.Destination = NewTarget.Location;
        Controller.FocalPoint = NewTarget.Location;
        Controller.Focus = NewTarget;
    }
    else
    {
        if ( HurtingActor != None )
        {
            Controller.Destination = ( Location - HurtingActor.Location );
            Controller.FocalPoint = Controller.Destination;
        }
        else
        {
            Controller.Destination = vector( Rotation ) * ( 512 * FRand() + 512 );
            Controller.FocalPoint = Controller.Destination;
        }
    }
}

// Trigger() is originally defined in Actor.
function Trigger( Actor Other, Pawn EventInstigator )
{
    if ( self.IsInState('Run') )
        return;
	if ( self.IsInState('Walk') )
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Touch() is originally defined in Actor.
function Touch( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') )
        return;
	GotoState('Walk');
}

// Bump() is originally defined in Actor.
function Bump( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') &amp;&amp; ( FRand() &lt; 0.9 ) )  // Chance to calm.
        return;
	if ( self.IsInState('Walk') &amp;&amp; ( FRand() &gt; 0.9 ) )  // Change due to startle.
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}
&lt;/uscript&gt;

And then somewhere in during movement, we will perform checks to determine if the character has reached it's destination or if it's gotten stuck while traveling.

===Movement===

We need our NPC NaliCow to travel to destinations.  It's default Physics will be PHYS_Walking.  So unless we find that the character should be falling, we're just going to concern ourselves with ground movement.  Our checks determining if the NPCs destination is reached or if the NPC is stuck will also happen during movement.  We also want the ability to halt all movement by defining a zero SpeedRatio, so that our character does not slide around while showing an animation with it's feet firmly planted.  At this point, we will also introduce another property bStartled that will indicate the NaliCow has been recently hurt or otherwise made to react.  We will take advantage of the fact that movement will be checked often and use it to make a few decisions about bStartle, either to react to it by Running or to calm back down.  bStartled will be set to true during damage.

&lt;uscript&gt;
var		bool		bStartled;		// Recently startled.

// MoveCheck() deals with periodic checks for bStartled, DamageTaken and falling.
// Then moves the character in direction of Rotation and at speed of SpeedRatio.
function MoveCheck( float SpeedRatio )
{
	DamageTaken = 0;  // Reset most recent damage memory.

	if ( Base == None )  // Should be falling.
	{
		if ( Physics != PHYS_Falling )
			SetPhysics( PHYS_Falling );
		return;
	}

	if ( Controller.MoveTarget == None )
		ReachedDestination( self );

    if ( VSize( Controller.MoveTarget.Location - Location ) &lt; 64 )
   	    ReachedDestination( Controller.MoveTarget );

    if ( VSize( OldLocation - Location ) &lt; 48 )
   	    ReachedDestination( Controller.MoveTarget );

    OldLocation = Location;

    RotationRate.Yaw = SpeedRatio * 20000;
   	Velocity = ( SpeedRatio * GroundSpeed ) * vector( Rotation );
    Acceleration = Velocity;

	if ( FRand() &gt; 0.95 )  // Chance to calm down.
		bStartled = false;
	if ( bStartled &amp;&amp; !self.IsInState('Run') )
		GotoState('Run');  // React to startle.	
}
&lt;/uscript&gt;

During Walk and Run behaviors, we will want to update the character's movement, based on any changes to Rotation.  The following code uses a Tick() function to constantly update the movement.  We only need to do this during certain behaviors, so we will only use this code within a state designated for either Walk or Run.  Normally, SetTimer() and Timer() functions set to activate every tenth of a second or so are used in place of Tick(), but this code is not particularly expensive.

&lt;uscript&gt;
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( 0.5 * GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }
&lt;/uscript&gt;

===Damage===

When our NPC gets hurt, we want to display specific behavior and effects.  The effects needed here are blood puffs that emit from the character at the appropriate angle to which it was hurt.  The behavior will be similar to those in Navigation, as the Instigator of the damage will automatically become the NPCs HurtingActor, the Actor to avoid.  Any damage will cause our NPC to react by Running, unless it recieves enough damage to bring the Health down to zero.  In that case, our NPC will switch to a Dying state.  A new property, DamageTaken, is introduced to keep track of the most recent damage inflicted on our NaliCow.  This will be used to determine the Degree to specify for our TakeHit and Dying behavior displays and it will serve to remind the NaliCow to Run away from danger.

&lt;uscript&gt;
var		int			DamageTaken;	// Most recent damage amount.

// TakeDamage() is originally defined in Actor.
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    HurtingActor = InstigatedBy;
	DamageTaken = Damage;
	bStartled = true;

    Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

    if ( DamageTaken &gt; 3 )
        spawn( class'STR_green_blood_puff',,, HitLocation, Rotator( Momentum ) );

    if ( Controller != None &amp;&amp; ( Controller.MoveTarget == HurtingActor || Controller.Focus == HurtingActor ) )
		ReachedDestination( HurtingActor );  // Do not approach HurtingActor.

    if ( Health &gt; 0 )
        GotoState('TakeHit');
    else if ( !self.IsInState('Dying') )
        GotoState('Dying');
}
&lt;/uscript&gt;

===Death===

When our NPC dies, it will be switched to a Dying state.  Switching to a unique state will allow us to Ignore various functions, like Bump or Touch, which would cause further behavior.  At the beginning of this state, our NPC should stop all animation.  After displaying the appropriate Dying behavior, it should stay still for a short time before removing itself from the gameworld for the sake of garbage collection.  The typical garbage collection method in Unreal involves a simple check for any player currently looking at the Actor, and if no player is, delete it.  If a player happens to be watching our character at this time, we will DeRez it's Mesh, a typical function where the Skin is changed to a gently flashing texture before the Actor is deleted.  It visually lets players know this Actor is about to be removed.  If not explicitly removed via Destroy(), this NPC will be automatically destroyed after a set time defined with Lifespan.

The following code shows our complete Dying behavior state.

&lt;uscript&gt;
state Dying
{
    Ignores Trigger, Touch, Bump, Landed, Died;

    function Timer()
    {
        SetPhysics( PHYS_None );
        SetCollision( false, false );
        Lifespan = 3.0;
        if ( PlayerCanSeeMe() )
            DeRez();
        else
            Destroy();
    }

    function DeRez()
    {
        Skins.length = 0;
        Skins[0] = Material'DeRez.Shaders.DeRezFinalBody';
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 4.0, false );
    }

    Begin:
        StopAnimating();
        DisplayBehavior( 11, Min( ( DamageTaken / 20 ), 3 ) );
		MoveCheck( 0.0 );
}
&lt;/uscript&gt;

Sometimes Pawns are asked to die automatically.  The following function will catch any &quot;automatic death&quot; event, such as being crushed by a Mover or Telefragged.

&lt;uscript&gt;
// Died() is originally defined in Pawn.
function Died( Controller Killer, class&lt;DamageType&gt; DamageType, vector HitLocation )
{
	TakeDamage( Health, None, Location, vect(0,0,-1), class'Crushed' );
}
&lt;/uscript&gt;

===Effects===

Besides the blood puffs needed to indicate Damage, the only effect this NPC needs is it's poop.  When it performs its Poop behavior, we will want a separate Actor, a Projectile, to spawn at the appropriate place and drop to the ground.

We will use this line during the Poop behavior to spawn the NaliCowPoop in the appropriate location and orientation; towards the back of the character and pointing down.

&lt;uscript&gt;
	spawn( class'NaliCowPoop',, 'Poop', ( Location + ( vector(Rotation) * -24 ) ), rotator( vect(0,0,-1) ) );
&lt;/uscript&gt;

==Class Construction==

Our NPC mostly uses functions and methods already found in the Pawn class.  Because this character is not meant to respawn, pickup [[Legacy:Adrenaline|Adrenaline]], carry [[Legacy:Inventory|Inventory]], etc., a simple Pawn subclass can be used without a custom Controller.  The AI can be coded into the custom Pawn class, NaliCow, and we can use the default AIController.

For the effects, the NaliCowPoop, we will use make a custom subclass from the Projectile class, BioGlob.

===NaliCow===

With our code elements defined, we can simply begin to piece them together within a Pawn subclass called NaliCow.  Along the way, we will make decisions about any further behaviors needed, such as a simple Turn behavior, where the Walk animation is played but the character only spins in place, or a redefinition of the Landed() event to make sure the character reacts appropriately if bStartled.  We will also make decisions about the frequency and chance that any given behavior be initiated from any other.  Most of the time, a simple random chance filtered through a switch statement will suffice.

A state will be defined for each behavior, allowing us to completely control the character, including it's movement and further behavior.

Putting together this NPC character requires the use of properties and methods, some will be custom, but most of which have been defined in the Pawn, Actor or Controller classes.  

====Pawn Default Properties====
; (Advanced) float Lifespan : Pawn default is 0.  We keep it there by default, but will be modifying it in game.
; (Collision) int CollisionHeight : Pawn default is 74.  Our default will be 34.
; (Collision) SurfaceType : Pawn default is EST_Default.  Our default will be EST_Flesh.
; (Display) [[Legacy:Mesh|Mesh]] Mesh : Our default is &lt;tt&gt;VertMesh'SkaarjPack_rc.NaliCow'&lt;/tt&gt;.
; (Movement) Physics : Pawn default is PHYS_None.  Our default will be PHYS_Walking.
; (Movement) rotator RotationRate : Pawn default RotationRate.Yaw is 20000.  We keep it there by default, but will be modifying it in game.
; (Movement) vector Velocity, Acceleration : These two properties are used during Movement.
; (None) [[Legacy:Controller|Controller]] Controller : By default Pawns automatically spawn a Controller of Pawn.ControllerClass during PreBeginPlay().  This will be our handle to the Controller.
; (None) class&lt;[[Legacy:Controller|Controller]]&gt; ControllerClass : Pawn default value is [[Legacy:AIController|AIController]].  We keep it there by default.
; (None) int GroundSpeed : Pawn default value is 440.  Our default value will be 100.
; (None) int Health : Pawn default value is 100.  We keep it there by default, but will be modifying it in game.
; (None) bool bReplicateAnimations : Pawn default is false.  Our default value will be true.  For use with SimAnim struct.
; (None) SimAnims : This struct is used for Animation Replication.  Includes AnimSequence, bAnimLoop, etc.
; (Sound) bool bFullVolume : Pawn default is false.  Our default value will be true.
; (Sound) int SoundRadius : Pawn default is 160.  Our default value will be 512.

====Pawn Default Methods====
; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) : This function is originally defined in Actor.  It will allow an Anim Sequence to play.
; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) : This function is originally defined in Actor.  It will allow an Anim Sequence to loop. 
; StopAnimating() : This function is originally defined in Actor.
; PlaySound( Sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) : This function is originally defined in Actor.  It will allow a Sound to play.
; SetPhysics( EPhysics newPhysics ) : This function is originally defined in Actor.  We will use it when in a Dying state.
; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) : This function is originally defined in Actor.  We will use it when in a Dying state.
; bool PlayerCanSeeMe() : This function is originally defined in Actor.  It returns true when a player has a line of sight to this Actor.  We will use it when in a Dying state.
; AnimEnd( int Channel ) : This event is originally defined in Actor.  It is called when the current animation sequence has played through.  This will allow us to switch from action to action at an appropriate time.
; Landed( vector HitNormal ) : This event is originally defined in Actor.  It is called when the Actor has landed on a Base after falling.

====AIController Properties====
; (None) Actor MoveTarget : Originally defined in Controller, this is the Actor to move toward.
; (None) vector Destination : Originally defined in Controller, this is the vector (Location) to move toward.  We will use this to set desired location.
; (None) vector FocalPoint : Originally defined in Controller, this is the vector to look toward.  We will use this to set desired rotation.
; (None) Actor Focus: Originally defined in Controller, this is the Actor to look toward.

====Final Source Code====

The following is the AI Source Code for a NaliCow NPC, using all the available animations and sounds to convey believable behavior.

&lt;uscript&gt;
//=============================================================================
// NaliCow.
// NaliCow Non-Player Character for UT2004.
// by SuperApe -- Dec 2005
// ( Based on Mesh animations and sounds from Epic Games )
//=============================================================================
class NaliCow extends Pawn
    placeable;

var     Actor       HurtingActor;   // An Actor to get away from.
var     vector      OldLocation;    // Used to determine if stuck.
var		int			DamageTaken;	// Most recent damage amount.
var		bool		bStartled;		// Recently startled.

// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );
}

// DisplayBehavior() takes a BehaviorIndex value and sets the appropriate animation and sound.
// Degrees of behavior will be taken into account via an optional arguement.
function DisplayBehavior( int BehaviorIndex, optional int Degree )
{
    switch( BehaviorIndex ) {
        case(1) :
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
        case(2) : 
            Acting( 'root', sound'SkaarjPack_rc.munch1p', true ); break;
        case(3) : 
            Acting( 'Chew', sound'SkaarjPack_rc.munch1p', true ); break;
        case(4) : 
            if ( FRand() &gt; 0.5 )
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo1c', false );
            else
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo2c', false );
            break;
        case(5) : 
            Acting( 'Shake', sound'SkaarjPack_rc.shakeC', true ); break;
        case(6) : 
            Acting( 'Swish', sound'SkaarjPack_rc.swishC', true ); break;
        case(7) : 
            Acting( 'Walk', sound'SkaarjPack_rc.WalkC', true ); break;
        case(8) : 
            Acting( 'Run', sound'SkaarjPack_rc.WalkC', true ); break;
        case(9) : 
            Acting( 'Landed', sound'SkaarjPack_rc.Thump', false ); break;
        case(10) : 
            if ( Degree &lt; 2 )
                Acting( 'TakeHit', sound'SkaarjPack_rc.cMoo1c', false );
            else if ( Degree == 2 )
                Acting( 'TakeHit2', sound'SkaarjPack_rc.injurC1c', false );
            else if ( Degree == 3 )
                Acting( 'BigHit', sound'SkaarjPack_rc.injurC2c', false );
            break;
        case(11) : 
            if ( Degree &lt; 2 )
                Acting( 'Dead', sound'SkaarjPack_rc.cMoo2c', false );
            else if ( Degree == 2 )
                Acting( 'Dead2', sound'SkaarjPack_rc.DeathC1c', false );
            else if ( Degree == 3 )
                Acting( 'Dead3', sound'SkaarjPack_rc.DeathC2c', false );
            break;
        default : 
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
     }
}

// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, 1.0, 0.1 );
    else
		PlayAnim( Anim, 1.0, 0.1 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = 1.0;
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
    SimAnim.TweenRate = 0.1;
    PlaySound( Soundname, SLOT_Misc );
}

// MoveCheck() deals with periodic checks for bStartled, DamageTaken and falling.
// Then moves the character in direction of Rotation and at speed of SpeedRatio.
function MoveCheck( float SpeedRatio )
{
	DamageTaken = 0;  // Reset most recent damage memory.

	if ( Base == None )  // Should be falling.
	{
		if ( Physics != PHYS_Falling )
			SetPhysics( PHYS_Falling );
		return;
	}

	if ( Controller.MoveTarget == None )
		ReachedDestination( self );

    if ( VSize( Controller.MoveTarget.Location - Location ) &lt; 64 )
   	    ReachedDestination( Controller.MoveTarget );

    if ( VSize( OldLocation - Location ) &lt; 48 )
   	    ReachedDestination( Controller.MoveTarget );

    OldLocation = Location;

    RotationRate.Yaw = SpeedRatio * 20000;
   	Velocity = ( SpeedRatio * GroundSpeed ) * vector( Rotation );
    Acceleration = Velocity;

	if ( FRand() &gt; 0.95 )  // Chance to calm down.
		bStartled = false;
	if ( bStartled &amp;&amp; !self.IsInState('Run') )
		GotoState('Run');  // React to startle.	
}

// ReachedDestination() is originally defined in Pawn.
// MoveTarget and other relevant properties are defined in Controller.
function bool ReachedDestination( Actor OldTarget )
{
    local   Actor   NewTarget, A;
    local   NavigationPoint    NP;

    forEach VisibleActors( class'Actor', A )
        if ( A != OldTarget &amp;&amp; A != HurtingActor )
            NewTarget = A;

    if ( A == None )
        forEach RadiusActors( class'NavigationPoint', NP, 1024 )
            if ( FRand() &gt; 0.5 &amp;&amp; NP != OldTarget &amp;&amp; FastTrace( NP.Location ) )
            {
                A = NP;
                NewTarget = A;
            }

    if ( A == None )
        forEach AllActors( class'Actor', A )
            if ( FRand() &gt; 0.5 &amp;&amp; A != HurtingActor &amp;&amp; A != OldTarget &amp;&amp; A != self &amp;&amp; !A.IsA('Controller') )
                NewTarget = A;

    if ( NewTarget != None )
    {
        Controller.MoveTarget = NewTarget;
        Controller.Destination = NewTarget.Location;
        Controller.FocalPoint = NewTarget.Location;
        Controller.Focus = NewTarget;
    }
    else
    {
        if ( HurtingActor != None )
        {
            Controller.Destination = ( Location - HurtingActor.Location );
            Controller.FocalPoint = Controller.Destination;
        }
        else
        {
            Controller.Destination = vector( Rotation ) * ( 512 * FRand() + 512 );
            Controller.FocalPoint = Controller.Destination;
        }
    }
}

// Trigger() is originally defined in Actor.
function Trigger( Actor Other, Pawn EventInstigator )
{
    if ( self.IsInState('Run') )
        return;
	if ( self.IsInState('Walk') )
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Touch() is originally defined in Actor.
function Touch( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') )
        return;
	GotoState('Walk');
}

// Bump() is originally defined in Actor.
function Bump( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') &amp;&amp; ( FRand() &lt; 0.9 ) )  // Chance to calm.
        return;
	if ( self.IsInState('Walk') &amp;&amp; ( FRand() &gt; 0.9 ) )  // Change due to startle.
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Landed() is originally defined in Actor.
event Landed( vector HitNormal )
{
	Super.Landed( HitNormal );

	if ( Velocity.Z &gt; -200 )  // Slow enough fall to forgive landing.
		return;

	if ( DamageTaken == 0 )
		GotoState('Land');
	else
		GotoState('TakeHit');
}

// TakeDamage() is originally defined in Actor.
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    HurtingActor = InstigatedBy;
	DamageTaken = Damage;
	bStartled = true;

    Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

	if ( DamageTaken &gt; 3 )
	    spawn( class'STR_green_blood_puff',,, HitLocation, Rotator( Momentum ) );

    if ( Controller != None &amp;&amp; ( Controller.MoveTarget == HurtingActor || Controller.Focus == HurtingActor ) )
		ReachedDestination( HurtingActor );  // Do not approach HurtingActor.

    if ( Health &gt; 0 )
        GotoState('TakeHit');
    else if ( !self.IsInState('Dying') )
        GotoState('Dying');
}

// Died() is originally defined in Pawn.
function Died( Controller Killer, class&lt;DamageType&gt; DamageType, vector HitLocation )
{
	TakeDamage( Health, None, Location, vect(0,0,-1), class'Crushed' );
}

auto state() Prone
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Turn');        break;
            case(1) : GotoState('Graze');       break;
            case(2) : GotoState('Poop');        break;
            case(3) : GotoState('Shake');       break;
            case(4) : GotoState('Swish');       break;
            case(5) : GotoState('Walk');        break;
            default : DisplayBehavior( 1 );     break;
        }
    }

    Begin:
        DisplayBehavior( 1 );
		MoveCheck( 0.0 );
        if ( HurtingActor != None )
            if ( FRand() &gt; 0.95 )  // Chance to forgive HurtingActor.
                HurtingActor = None;
}

state() Turn
{
    event AnimEnd( int Channel )
    {
        RotationRate.Yaw = 0;
        GotoState('Prone');
    }

    Begin:
		MoveCheck( 0.0 );
        if ( DesiredRotation != Rotation )
        {
            RotationRate.Yaw = 10000;
            DisplayBehavior( 7 );
        }
        else
            GotoState('Prone');
}

state() Graze
{
    event AnimEnd( int Channel )
    {
        GotoState('Chew');
    }

    Begin:
        DisplayBehavior( 2 );
		MoveCheck( 0.0 );
}

state() Chew
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 15;
        switch ( X ) {
            case(0) : GotoState('Prone');       break;
            case(1) : GotoState('Graze');       break;
            case(2) : GotoState('Poop');        break;
            case(3) : GotoState('Shake');       break;
            case(4) : GotoState('Swish');       break;
            case(5) : GotoState('Walk');        break;
            default : DisplayBehavior( 3 );     break;
        }
    }

    Begin:
        DisplayBehavior( 3 );
		MoveCheck( 0.0 );
}

state Poop
{
    function Timer()
    {
        spawn( class'NaliCowPoop',, 'Poop', ( Location + ( vector(Rotation) * -24 ) ), rotator( vect(0,0,-1) ) );
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Shake');       break;
            case(2) : GotoState('Swish');       break;
            case(3) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 4 );
		MoveCheck( 0.0 );
        SetTimer( 1.0, false );
}

state() Shake
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Poop');        break;

            case(2) : DisplayBehavior( 5 );     break;
            case(3) : GotoState('Swish');       break;
            case(4) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 5 );
		MoveCheck( 0.0 );
}

state Swish
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Poop');        break;
            case(2) : GotoState('Shake');       break;
            case(3) : DisplayBehavior( 6 );     break;
            case(4) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 6 );
		MoveCheck( 0.0 );
}

state Walk
{
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( 0.5 * GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Prone');							break;
            case(1) : GotoState('Turn');							break;
            case(1) : GotoState('Graze');							break;
            case(2) : GotoState('Poop');							break;
            case(3) : GotoState('Shake');							break;
            case(4) : GotoState('Swish');							break;
            default : DisplayBehavior( 7 ); MoveCheck( 0.5 );		break;
        }
    }

    Begin:
        DisplayBehavior( 7 );
		MoveCheck( 0.5 );
}

state Run
{
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 10;
        switch ( X ) {
            case(0) : GotoState('Walk');							break;
            default : DisplayBehavior( 8 ); MoveCheck( 1.0 );		break;
        }
    }

    Begin:
        DisplayBehavior( 8 );
		MoveCheck( 1.0 );
}

state Land
{
    function Timer()
    {
        local   int     X;

		if ( bStartled )  // Always run if startled.
		{
			GotoState('Run');
			return;
		}

        X = FRand() * 10;
        switch ( X ) {
            case(0) : GotoState('Prone');   break;
            case(1) : GotoState('Turn');    break;
            case(2) : GotoState('Shake');   break;
            default : GotoState('Walk');    break;
        }
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 0.2, false );
    }

    Begin:
        DisplayBehavior( 9 );
		MoveCheck( 0.0 );
}

state TakeHit
{
    function Timer()
    {
        GotoState('Run');
    }

    event AnimEnd( int Channel )
    {
        if ( Health &lt; 1 )
            GotoState('Dying');
        else
            SetTimer( 0.2, false );
    }

    Begin:
        DisplayBehavior( 10, Min( ( DamageTaken / 15 ), 3 ) );
        MoveCheck( 0.0 );
}

state Dying
{
    Ignores Trigger, Touch, Bump, Landed, Died;

    function Timer()
    {
        SetPhysics( PHYS_None );
        SetCollision( false, false );
        Lifespan = 3.0;
        if ( PlayerCanSeeMe() )
            DeRez();
        else
            Destroy();
    }

    function DeRez()
    {
        Skins.length = 0;
        Skins[0] = Material'DeRez.Shaders.DeRezFinalBody';
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 4.0, false );
    }

    Begin:
        StopAnimating();
        DisplayBehavior( 11, Min( ( DamageTaken / 15 ), 3 ) );
		MoveCheck( 0.0 );
}

defaultProperties 
{
    CollisionHeight=34
    SurfaceType=EST_Flesh
    Mesh=VertMesh'SkaarjPack_rc.NaliCow'
    Physics=PHYS_Walking
    GroundSpeed=100
    bReplicateAnimations=true
    bFullVolume=true
    SoundRadius=512
}
&lt;/uscript&gt;

===NaliCowPoop===

An obvious Projectile to use for this NaliCowPoop Actor is the BioRifle's Projectile, BioGlob.  It uses a Mesh that automatically drips, jiggles and splats like our desired NaliCowPoop should.  We will need to make a custom subclass of BioGlob, change its Texture, Lighting and alter some of it's default code to prevent it from causing Damage.

====BioGlob Default Properties====
; (Display) Skins : It's default Skins are set for BioRifle ammo.  We will set it to &lt;tt&gt;Texture'XEffectMat.goop.SlimeSkin'&lt;/tt&gt;.
; (Movement) vector Velocity : The BioGlob starts with a lot of velocity by default, we will set it to vect(0,0,0) during PostBeginPlay().
; (Lighting) int AmbientGlow : BioGlobs have an AmbientGlow by default.  We will set this to zero.
; (Lighting) bool bUnlit : BioGlobs are unlit by default.  We will set this to false.
; (Lighting) bool bDynamicLight : BioGlobs glow by default.  We will set this to false.
; (Lighting) LightType : We will set this to LT_None.
; float RestTime : This property is originally defined in BioGlob.  It determines how long the BioGlob sits before it calls BlowUp().  We will set this value to 10.0.
; int BaseDamage : This property is originally defined in BioGlob.  We will make sure this doesn't cause damage by setting it to 0.

====BioGlob Default Methods====
; BlowUp( vector HitLocation ) : This function is originally defined in BioGlob.  We will modify it to not cause damage and instead switch to a Shriveling state, which shrinks the BioGlob and &quot;pops&quot; it.

====Final Source Code====

&lt;uscript&gt;
//=============================================================================
// NaliCowPoop.
// The effects result of the NaliCow Poop behavior.
// by SuperApe -- Dec 2005
//=============================================================================
class NaliCowPoop extends BioGlob;

function PostBeginPlay()
{
	Super.PostBeginPlay();

	Velocity = vect(0,0,0);
}

// BlowUp() is originally defined in BioGlob.
function BlowUp( vector HitLocation )
{
	GotoState('Shriveling');
}

defaultProperties
{
	Skins(0)=Texture'XEffectMat.goop.SlimeSkin'
	AmbientGlow=0
	bUnlit=false
	bDynamicLight=false
	LightType=LT_None
	RestTime=10.0
	BaseDamage=0
}
&lt;/uscript&gt;

==Testing and Implementation==

The new NPC character should be tested thoroughly to ensure it is behaving reliably both as a character and as a game object.

===Compiling===

If you're familiar with [[Legacy:Compiling With UCC|Compiling With UCC]], then you can skip this section.

The steps for compiling our NPC code are as follows:

# Find your UT2004 base directory.  This is usually &lt;tt&gt;C:/UT2004/&lt;/tt&gt;.  We will refer to this as &lt;tt&gt;.../UT2004/&lt;/tt&gt; from this point on.
# Create a subdirectory there for our NaliCow code, &lt;tt&gt;.../UT2004/NaliCow/&lt;/tt&gt;, and create a subdirectory within that for our Classes, &lt;tt&gt;.../UT2004/NaliCow/Classes&lt;/tt&gt;
# Within that Classes subdirectory, create a simple (text) file with a .uc extention called, &quot;NaliCow.uc&quot;, and another called, &quot;NaliCowPoop.uc&quot;.
# Copy the above final source code for the NaliCow and paste it into the .uc file.  Do the same for the NaliCowPoop code.
# Find your &lt;tt&gt;.../UT2004/System/UT2004.ini&lt;/tt&gt; file and edit it with a text editor.  Find the &lt;tt&gt;EditPackages=&lt;/tt&gt; block and add &lt;tt&gt;EditPackages=NaliCow&lt;/tt&gt; to the end of the block.  This will make sure the compiling application knows which subdirectory to look for things to compile.
# In Windows, use StartMenu -&gt; Run... to launch &lt;tt&gt;.../UT2004/System/ucc make&lt;/tt&gt;.
# If there were no errors, you will now have a &lt;tt&gt;.../UT2004/System/NaliCow.u&lt;/tt&gt; package file. (Note that to ''re-compile'' a package, you must remove it from the &lt;tt&gt;.../UT2004/System/&lt;/tt&gt; subdirectory, or else the compiling application will skip it.)
# If there were errors, they are in the ucc log file, &lt;tt&gt;.../UT2004/System/ucc.txt&lt;/tt&gt;, and will tell you which line number the error came from.

===Implementation===

Now, we will bring our NPC into the game environment to test and debug.

# Within Ued, open a map suitable for testing our NPC.
# In the [[Legacy:Actor Browser|Actor Browser]], go to File -&gt; Open... and select our &lt;tt&gt;NaliCow.u&lt;/tt&gt; package file.
# Add an Actor -&gt; Pawn -&gt; NaliCow to the map.
# Configure the desired properties, if any.
# Hit the Playtest (&quot;Joystick&quot;) button on the [[Legacy:Toolbar|Toolbar]].

Now you have the ability to test it's behaviors under a variety of situations.  This is a good idea to do with any new AI construct.  Be vigilant and thorough in your testing to find all the possible bugs.

Some helpful [[Legacy:Console Commands|Console Commands]] to use during testing are:

; summon NaliCow.NaliCow : This spawns a default NaliCow, placed directly in front of your view.
; addbots &lt;int NumberOfBots&gt; : This adds bots to the map.
; killall &lt;class KillClass&gt; : This destroys all objects of the given KillClass.
; allweapons : Gives all weapons and default ammo.
; map &lt;name MapName&gt; : Starts a new match within the MapName provided.  Note that '''map autoplay''' will re-start the current map within Ued's memory.

===Replication===

If you know how to [[Legacy:Launch A Local Netgame|Launch a Local Netgame]], you may skip this section.

Testing Replication is important to ensure that what you have made offline will work just as well online.

# Save a map with at least a few NaliCows in it, different settings, etc.  Save it to the &lt;tt&gt;.../UT2004/Maps/&lt;/tt&gt; subdirectory with a valid [[Legacy:Map File Prefix|Map File Prefix]].
# Launch UT2004 and Host a game.  Pick your custom map and click on '''Dedicated'''.  The menu window will disappear and a server log window will open as the game launches in the background.
# Launch UT2004 again.  Bring down the console and type, &lt;tt&gt;map 127.0.0.1&lt;/tt&gt;, to join the local server you just started.
# Once there for the first time, bring up the menu by hitting Esc and save this local server as one of your &quot;Favs&quot; for easier Joining in the future.

Now, you're seeing what a slow Dial-Up client player sees.  There will be some lag due to your machine handling both the Server and Client at the same time.  However, this is important to see what imformation is being Replicated properly and what isn't.

For pinpointing the problems, it's useful to use Logs to be called either on the DedicatedServer or not.  See also [[Legacy:Netcode Idioms|Netcode Idioms]].  The Logs are found at &lt;tt&gt;.../UT2004/System/Server.txt&lt;/tt&gt; for the Server and &lt;tt&gt;.../UT2004/System/UT2004.txt&lt;/tt&gt; for the Client.

==Further Development==

Beyond this basic NaliCow NPC, more can be done to improve behavior, realism, gameplay or ease of use.

===DrawScale Adjustments===

Based on the DrawScale property, several adjustments can be made during PostBeginPlay() to make sure the NaliCow behaves, moves and sounds properly.  The result is a simple one-property adjustment that can be made to make a small, fast baby cow or a big, slow older cow.  We will use a separate function that can be called from PostBeginPlay(), AdjustForSize().  Before the adjustments are made, we can make sure the DrawScale is within a reasonable size range.

&lt;uscript&gt;
// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );

	AdjustForSize();
}

// AdjustForSize() will make various adjustments according to DrawScale.
function AdjustForSize()
{
	if ( DrawScale &gt; 3.0 || DrawScale &lt; 0.5 )
		SetDrawScale( FClamp( DrawScale, 3.0, 0.5 ) );
	SetCollisionSize( 34 * DrawScale, 34 * DrawScale );
	Mass = 100 * DrawScale;
	Health = 100 * DrawScale;
	SoundRadius = 512 * DrawScale;
	SoundPitch = 128 / DrawScale;
	if ( DrawScale &gt; 1.5 )
		bCanBeBaseForPawns = true;
}
&lt;/uscript&gt;

Other functions and elements will also have to be changed based on DrawScale.  Changes to the AnimationRate, RotationRate, SoundVolume, SoundPitch, NaliCowPoop DrawScale and RestTime, etc. can all be made to reflect the size of the NaliCow.  For example, the Acting() function can be altered to look like this:

&lt;uscript&gt;
// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, ( 1.0 / DrawScale ), ( 1.0 / DrawScale )/10 );
    else
		PlayAnim( Anim, ( 1.0 / DrawScale ), ( 1.0 / DrawScale )/10 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = ( 1.0 / DrawScale );
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
	SimAnim.TweenRate = ( 1.0 / DrawScale )/10;
    PlaySound( Soundname, SLOT_Misc, ( DrawScale * 2 ),,, ( SoundPitch / 128 ) );
}
&lt;/uscript&gt;

===Cow and Baby Relationships===

The original [[Legacy:Cow|Cow]] and BabyCow UT creatures had properties to define their relationships.  These can be reproduced with our NaliCow to perform the same behaviors.

====bHasBaby and BabyCow====

In UT, the property bHasBaby was meant to automatically spawn a BabyCow (a smaller version) for this Cow.  BabyCows were not meant to be explicitly placed in maps.  A simple modification to PostBeginPlay() should allow us to use our new DrawScale adjustments to do this easily.

&lt;uscript&gt;
var()		bool		bHasBaby;		// This NaliCow will spawn a smaller &quot;Baby&quot; at map start.
var  		NaliCow		Mama;			// This NaliCow is a &quot;Baby&quot; and should stay close to &quot;Mama&quot;.

event PostBeginPlay()
{
	local	NaliCow		Baby;

	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );

	AdjustForSize();
	
	if ( bHasBaby )
		while ( Baby == None )
		{
			Baby = spawn( class'NaliCow', self,, Location + ( VRand() * ( 64 + CollisionRadius ) ), Rotation );
			if ( Baby != None )
			{
				Baby.Mama = self;
				Baby.SetDrawScale( DrawScale / 2 );
				Baby.AdjustForSize();
			}
		}
}
&lt;/uscript&gt;

Also, we should encourage the BabyCow to stay close to its &quot;Mama&quot;.  We will do this with a modification to ReachedDestination().  The following code will be added to ReachedDestination() just before NewTarget is assigned to the Controller attributes.

&lt;uscript&gt;
	if ( Mama != None )
		NewTarget = Mama;
&lt;/uscript&gt;

====bStayClose and WanderRadius====

bStayClose modified the behavior of the Cow so that it's Movement destinations were never more than WanderRadius UU away from it's starting Location.  ''Note: Although there is a '''home''' property defined in Controller, it is defined as a NavigationPoint and won't serve this purpose.''

&lt;uscript&gt;
var()		bool		bStayClose;		// This NaliCow will only select MoveTargets within WanderRadius.
var()		int 		WanderRadius;	// The radius from Home that MoveTargets will be selected.
var  		vector		Home;			// The Location this NaliCow started at.
&lt;/uscript&gt;

And the following code will be added to the end of ReachedDestination().

&lt;uscript&gt;
	if ( bStayClose &amp;&amp; WanderRadius &gt; 0 &amp;&amp; 
		( VSize( NewTarget.Location - Home ) &gt; WanderRadius || 
			VSize( Controller.Destination - Home ) &gt; WanderRadius ) )
	{
		Controller.Destination = Home + ( VRand() * ( FRand() * WanderRadius ) );
		Controller.FocalPoint = Controller.Destination;
	}
&lt;/uscript&gt;

===Ridable NaliCows===

An extra gameplay feature could be to have players be able to ride and loosely steer larger NaliCows.  You may have noticed the &lt;tt&gt;bCanBeBaseForPawns&lt;/tt&gt; property set during AdjustForSize() in the section above.  This will allow larger cows to support and carry Pawns.  Once a player has managed to get on top of one, a simple UsedBy() function can enable them to press Use and become a special Pawn to the NaliCow.

&lt;uscript&gt;
var		Pawn		Rider;			// PlayerPawn riding this cow.

// UsedBy() is originally defined in Actor.
function UsedBy( Pawn P )
{
	if ( !bCanBeBaseForPawns )
		return;

	if ( Rider == None )
	{
		Rider = P;
		if ( PlayerController( Rider.Controller ) != None )
			PlayerController( Rider.Controller ).bBehindView = true;
	}

	if ( P == Rider )
	{
		Controller.Destination = Location + ( vector( rot(0,1,0) * Rider.Controller.Rotation.Yaw ) * 1024 );
		Controller.FocalPoint = Controller.Destination;
		if ( !self.IsInState('Run') )
			GotoState('Run');
		else
			PlaySound( sound'SkaarjPack_rc.injurC1c', SLOT_Misc, ( DrawScale * 2 ),,, ( SoundPitch / 128 ) );
	}
}
&lt;/uscript&gt;

Once the player has become a Rider to the NaliCow, the NaliCow's Controller's Destinations are subject to the whims of the Rider.Controller.  The Rider.Controller also is automatically set to bBehindView to give a visual cue that the change has taken place.  By pressing the Use key, the NaliCow is urged to keep Running.  When the NaliCow reaches it's Destinations, we'll keep the player in control by adding a little code to the top of ReachedDestination().

&lt;uscript&gt;
    if ( Rider != None )
    {
        if ( VSize( Rider.Location - Location ) &gt; ( CollisionHeight + Rider.CollisionHeight ) )
        {
            if ( PlayerController( Rider.Controller ) != None )
                PlayerController( Rider.Controller ).bBehindView = false;
            Rider = None;  // Rider has left.
        }
        else
        {
            Controller.Destination = Location + ( vector( rot(0,1,0) * Rider.Controller.Rotation.Yaw ) * 1024 );
            Controller.FocalPoint = Controller.Destination;
            return true;
        }
    }
&lt;/uscript&gt;

To stop being a Rider, the player can simply move off the NaliCow.  The bBehindView setting will return after the NaliCow has reached it's next Destination.

==External Links==

Other links to basic AI scripting tutorials should be listed here:
* [http://www.langsuyar.com/articles/u2_tutorialsmain.html Mattias Worch's Unreal 2 Tutorials] '''(broken)''' :
: Mattias Worch worked on the Unreal 2 team and has written a few useful tutorials on AI scripting. The tutorials on this page directly relating to AI scripting are &quot;Set up Dialog and AI Scripting for a Level,&quot; and &quot;Create a Basic AI Script.&quot; Please note that the copyright on these tutorials allows us to link to them, but not to &quot;wikify&quot; the tutorials and place them here. If you would like to have a tutorial on the Wiki, I'm sure that everyone would appreciate if someone were to read over these tutorials and experiment with AI scripting until they had a complete enough understanding to place an original tutorial here.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic on all AI (bots, Monsters, NPCs, etc.)
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:UnrealScript|UnrealScript]]

==Discussion==

'''Tarquin:''' Link to documentation wiki pages, if they exist, or start writing them! That's a good way to start.

'''Foxpaw:''' I actually don't have any experience with AI scripting myself, I was just using the random page function and thought this page could use a bit of refactoring.

'''SuperApe:''' The above link is dead.  Yes, we need links or some tuts on the wiki itself.

'''SuperApe:''' I will most likely take over this page and revive it.  Linking to [[Legacy:NPC Support|NPC Support]] and others.  My thought is to take the Mesh for the NaliCow and re-construct it's AI coding as an NPC for UT2004. (I never had UT, so this will be a from scratch effort that I look forward to)  Tutorial outlined.  Working...

'''SuperApe:''' This is a tutorial on UScripting a custom AI.  Comments welcome.

'''Solid Snake:''' Hmmm, I don't really like some of the code in here as I think it could be a lot better.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1828</id>
      <timestamp>2006-01-04T21:55:52Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a tutorial on UScripting a custom AI.

'''This page is under construction.'''

==Overview==

This tutorial will detail re-construction of the NaliCow NPC for UT2004.  It was originally available in UT as a [[Legacy:Cow|Cow]], but this tutorial will revise its AI design as if it were new.  The stock meshes and sounds that are available will allow us to concentrate purely on the AI that drives its behavior.  We will start will a comprehensive behavior design before coding the elements and constructing the custom classes that will give this NPC life and then implement it in the game environment.

[[Image:Legacy_scriptedpawn.nalicows.jpeg|center|The NaliCow and BabyCow from Unreal Tournament.]]

==Prerequisites==

Although creating only a simple AI for this NPC, this will be an advanced tutorial that assumes a solid understanding of [[Legacy:UnrealScript|UnrealScript]].  This tutorial will assume you know how to [[Legacy:Create A Subclass|Create A Subclass]], [[Legacy:Set Up Package Folders|Set up package folders]], [[Legacy:Launch A Local Netgame|Launch a local netgame]] and [[Legacy:Add EditPackage|Add EditPackage]].  In terms of [[Legacy:Making Mods|Making Mods]], this tutorial will assume that you know about [[Legacy:Replication|Replication]], [[Legacy:Coding Guidelines|Coding Guidelines]] and [[Legacy:Compiling With UCC|Compiling with UCC]].

Even if you aren't confident in your understanding of these many topics, this tutorial will still serve as an overview discussion of designing a simple [[Legacy:Artificial Intelligence|Artificial Intelligence]] construct.

==Behavior Design==

We will begin by defining a design for the NaliCow's behavior.

===AI Design Plan===

The behavior design is the roadmap for our AI scripting, giving us a clear set of coding elements to complete before it's AI takes shape.

Although there are many different methods of designing AI (including sophisticated methods such as neural networks and artificial evolution), with a simple creature like this, our tutorial will follow the most basic and standard method used by all stock Unreal AI; conditional decision-making.  This is the method that takes stimuli as a constant condition or trigger to either do this or that; also known as &quot;if this, then do that&quot;, or &quot;if-then&quot; decision-making.  A common example of this kind of AI is the AI Script in a [[Legacy:ScriptedSequence|ScriptedSequence]], but even Bots use this method, just in an extremely complex form.

We have some features of our NPC already defined for us; it's model, textures, animation and sounds.  Normally, a custom character would be started by defining it's purpose or goal and then design those features around it.  But for this behavior design, we will work &quot;backwards&quot;; starting with those features and finding the purpose and behavior design that fits it.

With that in mind, we will first look at what we have to work with.

===Provided Animation and Sounds===

There are plenty of stock animations provided in UT2004 for the NaliCow even though there is no [[Legacy:Monster|Monster]] subclass for it.  With these animation sequences, we can easily construct an AI design flow that will convey a creature of convincing realism and range of ability.  The following is a list of the NaliCow animations found the [[Legacy:Mesh Browser|Mesh Browser]]. The number of animation frames in the sequence are shown in brackets.  ''Loop'' indicates the last frame matches a common start pose of all other ''Loop'' animations.  ''SingleFrame'' is just one frame, a pose.  ''Sequence'' indicates an animation sequence that is meant to only play through once and does not end on the common starting pose of the ''Loop'' animations.
* '''root''' [20] : Loop.  Bends down to graze.
* '''Breath''' [6] : Loop.  Breathes.  Prone.
* '''Chew''' [7] : Loop.  Chews.
* '''Poop''' [20] : Loop.  Lifts tail and poops.
* '''Shake''' [18] : Loop.  Shakes head, as if shaking off water or dust.
* '''Swish''' [20] : Loop.  Swishes it's tail from side to side and stamps foot.
* '''Walk''' [15] : Loop.  A walk cycle.
* '''Run''' [10] : Loop.  A run cycle.
* '''Landed''' [1] : Single frame.  Indicates recovery from a fall.
* '''TakeHit1''' [1] : Single frame.  Indicates recovery from damage.
* '''TakeHit2''' [1] : Single frame.  Indicates recovery from more damage.
* '''BigHit''' [1] : Single frame.  Indicates recovery from a lot of damage. (both feet in the air)
* '''Dead''' [23] : Sequence.  Indicates a slow death, slumping to the side.
* '''Dead2''' [13] : Sequence.  Death animation, starting from '''TakeHit2''', slumping forward.
* '''Dead3''' [23] : Sequence.  Severe death, starting from '''BigHit''', showing a complete back flip.

These stock sounds are available in the [[Legacy:Sound Browser|Sound Browser]], under &lt;tt&gt;SkaarjPack_rc&lt;/tt&gt;, that relate to the NaliCow:
* '''ambCow''' : Breath of a NaliCow.
* '''cMoo1c''' : NaliCow call. (sounds suspiciously like a Doom creature's death cry)
* '''cMoo2c''' : Another call.
* '''DeathC1c''' : &quot;Urgent&quot; call.
* '''DeathC2c''' : Another &quot;urgent&quot; call.
* '''injurC1c''' : Pained call.
* '''injurC2c''' : A call that sounds a little like, &quot;Ow&quot;.
* '''munch1p''' : A biting sound (normally used for the SkaarjPupae).
* '''shakeC''' : Ears flapping as the NaliCow shakes.
* '''swishC''' : Swishing sound of the NaliCow tail.
* '''Thump''' : Generic hard landing sound.
* '''WalkC''' : NaliCow footstep.

===AI Design Flow===

With these pieces, we can begin to analyze the potential behavior and assemble the design in such a way that we understand how one piece leads to the next.

* Some of these pieces indicate behavior that's initiated by the NaliCow; such as Grazing, Swishing, Pooping.  Others are behaviors that are in reaction to external stimuli; such as TakeHit or Death.
* We know we will want the NaliCow to navigate from place to place.  Some decision making will involve where to go and whether to walk or run.  Running away from danger will serve a self-preservation purpose while walking toward a goal, such as another NaliCow, may serve to support the idea these are real creatures (an immersion purpose) through a percieved flocking behavior.
* Obvious connections can be made between the animation sequences and the sounds that correspond to them.  We will want to have these sounds play whenever those animations are played.  Other connections can be made between some of these pieces, where one will likely lead to another; such as Grazing leading to Chewing, a TakeHit leading to either Death or Run, etc.
* One piece of this behavior, Pooping, appears to need an extra effect; the NaliCowPoop itself.  It will have to be an extra actor class with it's own code.

We can see a prone state, where the '''Breath''' animation and '''ambCow''' sound would be looped.  This appears to be a good place to start.  We will be able to branch out from this prone state to any other looping animation sequence and corresponding sound, building up the behavior design flow, piece by piece.

The following chart attempts to describe all the possible behaviors, their animation, their sound and what behaviors might preceed and follow them.

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |
===='''NaliCow Behaviors'''====
 
|-
|
| style=&quot;text-align: center&quot; |'''1. Prone'''
| style=&quot;text-align: center&quot; |'''2. Graze'''
| style=&quot;text-align: center&quot; |'''3. Chew'''
| style=&quot;text-align: center&quot; |'''4. Poop'''
| style=&quot;text-align: center&quot; |'''5. Shake'''
| style=&quot;text-align: center&quot; |'''6. Swish'''
| style=&quot;text-align: center&quot; |'''7. Walk'''
| style=&quot;text-align: center&quot; |'''8. Run'''
| style=&quot;text-align: center&quot; |'''9. Land'''
| style=&quot;text-align: center&quot; |'''10. TakeHit'''
| style=&quot;text-align: center&quot; |'''11. Dying''' 
|-
| style=&quot;text-align: left&quot; |'''Animation'''
|Breath
|root
|Chew
|Poop
|Shake
|Swish
|Walk
|Run
|Landed
|TakeHit1, 2 or BigHit
|Dead, 2, 3 
|-
| style=&quot;text-align: left&quot; |'''Sound'''
|ambCow
|munch1p
|munch1p
|cMoo1c, 2c
|shakeC
|swishC
|WalkC
|WalkC
|Thump
|injurC1c, 2c
|DeathC1c, 2c 
|-
| style=&quot;text-align: left&quot; |'''Lead From'''
|1-7
|1-7
|2
|1-7
|1-7
|1-7
|1-10
|7-10
|7 or 8**
|1-9***
|10 
|-
| style=&quot;text-align: left&quot; |'''Lead To'''
|1-7
|3
|1-7
|1-7*
|1-7
|1-7
|1-8
|7-8
|1, 5, 7
|7, 8, 11
|''None''&amp;dagger; 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |* &amp;ndash; ''A NaliCowPoop actor should be spawned during this behavior.'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |** &amp;ndash; ''This behavior will activate immeditately upon landing from a fall, without waiting for animation loops to end..'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |*** &amp;ndash; ''This behavior will activate immeditately upon taking damage, without waiting for animation loops to end.'' 
|-
| colspan=&quot;12&quot; style=&quot;text-align: center&quot; |&amp;dagger; &amp;ndash; ''The NaliCow carcass will DeRes and disappear a short time after this behavior.'' 
|}

==Coding Elements==

With the AI Design Flow sketched out, we will be able to code the AI behaviors appropriately.  But first, we will have to complete the code that will handle the basic tasks these behaviors will have to perform.  These tasks include animation, sound, movement, damage, death, etc.

===Animation &amp; Sound===

As shown in the above chart, animation sequences and sounds are linked together.  A couple exceptions to that rule include animations that can play one of a few available sounds and actions that play one animation, but more than one sound, such as Walk or Run, where two footsteps should be heard.  We will use the animation sequence as a handle for the action and have that dictate the possible sounds.

&lt;uscript&gt;
// DisplayBehavior() takes a BehaviorIndex value and sets the appropriate animation and sound.
// Degrees of behavior will be taken into account via an optional arguement.
function DisplayBehavior( int BehaviorIndex, optional int Degree )
{
    switch( BehaviorIndex ) {
        case(1) :
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
        case(2) : 
            Acting( 'root', sound'SkaarjPack_rc.munch1p', true ); break;
        case(3) : 
            Acting( 'Chew', sound'SkaarjPack_rc.munch1p', true ); break;
        case(4) : 
            if ( FRand() &gt; 0.5 )
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo1c', false );
            else
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo2c', false );
            break;
        case(5) : 
            Acting( 'Shake', sound'SkaarjPack_rc.shakeC', true ); break;
        case(6) : 
            Acting( 'Swish', sound'SkaarjPack_rc.swishC', true ); break;
        case(7) : 
            Acting( 'Walk', sound'SkaarjPack_rc.WalkC', true ); break;
        case(8) : 
            Acting( 'Run', sound'SkaarjPack_rc.WalkC', true ); break;
        case(9) : 
            Acting( 'Landed', sound'SkaarjPack_rc.Thump', false ); break;
        case(10) : 
            if ( Degree &lt; 2 )
                Acting( 'TakeHit', sound'SkaarjPack_rc.cMoo1c', false );
            else if ( Degree == 2 )
                Acting( 'TakeHit2', sound'SkaarjPack_rc.injurC1c', false );
            else if ( Degree == 3 )
                Acting( 'BigHit', sound'SkaarjPack_rc.injurC2c', false );
            break;
        case(11) : 
            if ( Degree &lt; 2 )
                Acting( 'Dead', sound'SkaarjPack_rc.cMoo2c', false );
            else if ( Degree == 2 )
                Acting( 'Dead2', sound'SkaarjPack_rc.DeathC1c', false );
            else if ( Degree == 3 )
                Acting( 'Dead3', sound'SkaarjPack_rc.DeathC2c', false );
            break;
        default : 
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
     }
}

// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, 1.0, 0.1 );
    else
        PlayAnim( Anim, 1.0, 0.1 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = 1.0;
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
	SimAnim.TweenRate = 0.1;
    PlaySound( Soundname, SLOT_Misc );
}
&lt;/uscript&gt;

===Navigation===

This is our first decision-making code.  We will need our AI to decide where to go and what to look at.  Controllers use MoveTarget and ViewTarget by default.  They are the Destination and Focus for the controller.  We will simply alter those properties based on desires of self-preservation.

First, if we have reached our destination, we want to be able to select another one reasonably.  Next, if another Actor has hurt our NPC, we want our AI to avoid it.  So we will do checks to make sure the selected destination or focus is not the Actor that hurt our NPC.  We will also avoid any Actor who Bumps or Touches our NPC, as if it had hurt it.  If the NPC is Bumped, Touched or Triggered, we will have our NPC Walk away, or if already Walking, perhaps begin to Run.  Finally, we want to know if our NPC is stuck, trying to reach a destination but not able to progress from it's current Location.  We will do a simple check to ensure it makes progress when it Walks or Runs, and if not, we will select another destination.

&lt;uscript&gt;
var		Actor		HurtingActor;	// An Actor to get away from.
var		vector		OldLocation;	// Used to determine if stuck.

// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );
}

// ReachedDestination() is originally defined in Pawn.
// MoveTarget and other relevant properties are defined in Controller.
function bool ReachedDestination( Actor OldTarget )
{
    local   Actor   NewTarget, A;
    local   NavigationPoint    NP;

    forEach VisibleActors( class'Actor', A )
        if ( A != OldTarget &amp;&amp; A != HurtingActor )
            NewTarget = A;

    if ( A == None )
        forEach RadiusActors( class'NavigationPoint', NP, 1024 )
            if ( FRand() &gt; 0.5 &amp;&amp; NP != OldTarget &amp;&amp; FastTrace( NP.Location ) )
            {
                A = NP;
                NewTarget = A;
            }

    if ( A == None )
        forEach AllActors( class'Actor', A )
            if ( FRand() &gt; 0.5 &amp;&amp; A != HurtingActor &amp;&amp; A != OldTarget &amp;&amp; A != self &amp;&amp; !A.IsA('Controller') )
                NewTarget = A;

    if ( NewTarget != None )
    {
        Controller.MoveTarget = NewTarget;
        Controller.Destination = NewTarget.Location;
        Controller.FocalPoint = NewTarget.Location;
        Controller.Focus = NewTarget;
    }
    else
    {
        if ( HurtingActor != None )
        {
            Controller.Destination = ( Location - HurtingActor.Location );
            Controller.FocalPoint = Controller.Destination;
        }
        else
        {
            Controller.Destination = vector( Rotation ) * ( 512 * FRand() + 512 );
            Controller.FocalPoint = Controller.Destination;
        }
    }
}

// Trigger() is originally defined in Actor.
function Trigger( Actor Other, Pawn EventInstigator )
{
    if ( self.IsInState('Run') )
        return;
	if ( self.IsInState('Walk') )
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Touch() is originally defined in Actor.
function Touch( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') )
        return;
	GotoState('Walk');
}

// Bump() is originally defined in Actor.
function Bump( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') &amp;&amp; ( FRand() &lt; 0.9 ) )  // Chance to calm.
        return;
	if ( self.IsInState('Walk') &amp;&amp; ( FRand() &gt; 0.9 ) )  // Change due to startle.
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}
&lt;/uscript&gt;

And then somewhere in during movement, we will perform checks to determine if the character has reached it's destination or if it's gotten stuck while traveling.

===Movement===

We need our NPC NaliCow to travel to destinations.  It's default Physics will be PHYS_Walking.  So unless we find that the character should be falling, we're just going to concern ourselves with ground movement.  Our checks determining if the NPCs destination is reached or if the NPC is stuck will also happen during movement.  We also want the ability to halt all movement by defining a zero SpeedRatio, so that our character does not slide around while showing an animation with it's feet firmly planted.  At this point, we will also introduce another property bStartled that will indicate the NaliCow has been recently hurt or otherwise made to react.  We will take advantage of the fact that movement will be checked often and use it to make a few decisions about bStartle, either to react to it by Running or to calm back down.  bStartled will be set to true during damage.

&lt;uscript&gt;
var		bool		bStartled;		// Recently startled.

// MoveCheck() deals with periodic checks for bStartled, DamageTaken and falling.
// Then moves the character in direction of Rotation and at speed of SpeedRatio.
function MoveCheck( float SpeedRatio )
{
	DamageTaken = 0;  // Reset most recent damage memory.

	if ( Base == None )  // Should be falling.
	{
		if ( Physics != PHYS_Falling )
			SetPhysics( PHYS_Falling );
		return;
	}

	if ( Controller.MoveTarget == None )
		ReachedDestination( self );

    if ( VSize( Controller.MoveTarget.Location - Location ) &lt; 64 )
   	    ReachedDestination( Controller.MoveTarget );

    if ( VSize( OldLocation - Location ) &lt; 48 )
   	    ReachedDestination( Controller.MoveTarget );

    OldLocation = Location;

    RotationRate.Yaw = SpeedRatio * 20000;
   	Velocity = ( SpeedRatio * GroundSpeed ) * vector( Rotation );
    Acceleration = Velocity;

	if ( FRand() &gt; 0.95 )  // Chance to calm down.
		bStartled = false;
	if ( bStartled &amp;&amp; !self.IsInState('Run') )
		GotoState('Run');  // React to startle.	
}
&lt;/uscript&gt;

During Walk and Run behaviors, we will want to update the character's movement, based on any changes to Rotation.  The following code uses a Tick() function to constantly update the movement.  We only need to do this during certain behaviors, so we will only use this code within a state designated for either Walk or Run.  Normally, SetTimer() and Timer() functions set to activate every tenth of a second or so are used in place of Tick(), but this code is not particularly expensive.

&lt;uscript&gt;
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( 0.5 * GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }
&lt;/uscript&gt;

===Damage===

When our NPC gets hurt, we want to display specific behavior and effects.  The effects needed here are blood puffs that emit from the character at the appropriate angle to which it was hurt.  The behavior will be similar to those in Navigation, as the Instigator of the damage will automatically become the NPCs HurtingActor, the Actor to avoid.  Any damage will cause our NPC to react by Running, unless it recieves enough damage to bring the Health down to zero.  In that case, our NPC will switch to a Dying state.  A new property, DamageTaken, is introduced to keep track of the most recent damage inflicted on our NaliCow.  This will be used to determine the Degree to specify for our TakeHit and Dying behavior displays and it will serve to remind the NaliCow to Run away from danger.

&lt;uscript&gt;
var		int			DamageTaken;	// Most recent damage amount.

// TakeDamage() is originally defined in Actor.
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    HurtingActor = InstigatedBy;
	DamageTaken = Damage;
	bStartled = true;

    Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

    if ( DamageTaken &gt; 3 )
        spawn( class'STR_green_blood_puff',,, HitLocation, Rotator( Momentum ) );

    if ( Controller != None &amp;&amp; ( Controller.MoveTarget == HurtingActor || Controller.Focus == HurtingActor ) )
		ReachedDestination( HurtingActor );  // Do not approach HurtingActor.

    if ( Health &gt; 0 )
        GotoState('TakeHit');
    else if ( !self.IsInState('Dying') )
        GotoState('Dying');
}
&lt;/uscript&gt;

===Death===

When our NPC dies, it will be switched to a Dying state.  Switching to a unique state will allow us to Ignore various functions, like Bump or Touch, which would cause further behavior.  At the beginning of this state, our NPC should stop all animation.  After displaying the appropriate Dying behavior, it should stay still for a short time before removing itself from the gameworld for the sake of garbage collection.  The typical garbage collection method in Unreal involves a simple check for any player currently looking at the Actor, and if no player is, delete it.  If a player happens to be watching our character at this time, we will DeRez it's Mesh, a typical function where the Skin is changed to a gently flashing texture before the Actor is deleted.  It visually lets players know this Actor is about to be removed.  On Clients, this function will be called by a TornOff() event, which signals the Client has been given control of this actor.  We will use bTearOff to signal to Clients that this NaliCow is dead and should be removed.  If not explicitly removed via Destroy(), this NPC will be automatically destroyed after a set time defined with Lifespan.

The following code shows the Dying behavior state.

&lt;uscript&gt;
state Dying
{
    Ignores Trigger, Touch, Bump, Landed, Died;

    function Timer()
    {
        SetPhysics( PHYS_None );
        SetCollision( false, false );
        Lifespan = 3.0;
        if ( PlayerCanSeeMe() )
            DeRez();
        else
            Destroy();
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 4.0, false );
    }

    Begin:
        StopAnimating();
        DisplayBehavior( 11, Min( ( DamageTaken / 20 ), 3 ) );
        MoveCheck( 0.0 );
        if ( Level.NetMode == NM_DedicatedServer )
        {
            SetPhysics( PHYS_None );
            SetCollision( false, false );
            LifeSpan = 3.0;
            bTearOff = true;
        }
}
&lt;/uscript&gt;

Our DeRez function is made available on Clients and can be called from a TornOff() event.

&lt;uscript&gt;
// TornOff() is originally defined in Actor.
event TornOff()
{
    if ( PlayerCanSeeMe() )
        DeRez();
    else
        Destroy();
}

// DeRez() will signal removal of the dead NaliCow.
simulated function DeRez()
{
    if ( Level.NetMode == NM_DedicatedServer )
        return;

    Skins.length = 0;
    Skins[0] = Material'DeRez.Shaders.DeRezFinalBody';  
}
&lt;/uscript&gt;

Sometimes Pawns are asked to die automatically.  The following function will catch any &quot;automatic death&quot; event, such as being crushed by a Mover or Telefragged.

&lt;uscript&gt;
// Died() is originally defined in Pawn.
function Died( Controller Killer, class&lt;DamageType&gt; DamageType, vector HitLocation )
{
	TakeDamage( Health, None, Location, vect(0,0,-1), class'Crushed' );
}
&lt;/uscript&gt;

===Effects===

Besides the blood puffs needed to indicate Damage, the only effect this NPC needs is it's poop.  When it performs its Poop behavior, we will want a separate Actor, a Projectile, to spawn at the appropriate place and drop to the ground.

We will use this line during the Poop behavior to spawn the NaliCowPoop in the appropriate location and orientation; towards the back of the character and pointing down.

&lt;uscript&gt;
	spawn( class'NaliCowPoop',, 'Poop', ( Location + ( vector(Rotation) * -24 ) ), rotator( vect(0,0,-1) ) );
&lt;/uscript&gt;

==Class Construction==

Our NPC mostly uses functions and methods already found in the Pawn class.  Because this character is not meant to respawn, pickup [[Legacy:Adrenaline|Adrenaline]], carry [[Legacy:Inventory|Inventory]], etc., a simple Pawn subclass can be used without a custom Controller.  The AI can be coded into the custom Pawn class, NaliCow, and we can use the default AIController.

For the effects, the NaliCowPoop, we will use make a custom subclass from the Projectile class, BioGlob.

===NaliCow===

With our code elements defined, we can simply begin to piece them together within a Pawn subclass called NaliCow.  Along the way, we will make decisions about any further behaviors needed, such as a simple Turn behavior, where the Walk animation is played but the character only spins in place, or a redefinition of the Landed() event to make sure the character reacts appropriately if bStartled.  We will also make decisions about the frequency and chance that any given behavior be initiated from any other.  Most of the time, a simple random chance filtered through a switch statement will suffice.

A state will be defined for each behavior, allowing us to completely control the character, including it's movement and further behavior.

Putting together this NPC character requires the use of properties and methods, some will be custom, but most of which have been defined in the Pawn, Actor or Controller classes.  

====Pawn Default Properties====
; (Advanced) float Lifespan : Pawn default is 0.  We keep it there by default, but will be modifying it in game.
; (Collision) int CollisionHeight : Pawn default is 74.  Our default will be 34.
; (Collision) SurfaceType : Pawn default is EST_Default.  Our default will be EST_Flesh.
; (Display) [[Legacy:Mesh|Mesh]] Mesh : Our default is &lt;tt&gt;VertMesh'SkaarjPack_rc.NaliCow'&lt;/tt&gt;.
; (Movement) Physics : Pawn default is PHYS_None.  Our default will be PHYS_Walking.
; (Movement) rotator RotationRate : Pawn default RotationRate.Yaw is 20000.  We keep it there by default, but will be modifying it in game.
; (Movement) vector Velocity, Acceleration : These two properties are used during Movement.
; (None) [[Legacy:Controller|Controller]] Controller : By default Pawns automatically spawn a Controller of Pawn.ControllerClass during PreBeginPlay().  This will be our handle to the Controller.
; (None) class&lt;[[Legacy:Controller|Controller]]&gt; ControllerClass : Pawn default value is [[Legacy:AIController|AIController]].  We keep it there by default.
; (None) int GroundSpeed : Pawn default value is 440.  Our default value will be 100.
; (None) int Health : Pawn default value is 100.  We keep it there by default, but will be modifying it in game.
; (None) bool bReplicateAnimations : Pawn default is false.  Our default value will be true.  For use with SimAnim struct.
; (None) SimAnims : This struct is used for Animation Replication.  Includes AnimSequence, bAnimLoop, etc.
; (None) bool bTearOff : This property is used to make the Client the owner of the actor, making it &quot;TornOff&quot; and no longer replicated to new Clients.  We will use this during Death only.
; (Sound) bool bFullVolume : Pawn default is false.  Our default value will be true.
; (Sound) int SoundRadius : Pawn default is 160.  Our default value will be 512.

====Pawn Default Methods====
; bool PlayAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) : This function is originally defined in Actor.  It will allow an Anim Sequence to play.
; bool LoopAnim( name Sequence, optional float Rate, optional float TweenTime, optional int Channel ) : This function is originally defined in Actor.  It will allow an Anim Sequence to loop. 
; StopAnimating() : This function is originally defined in Actor.
; PlaySound( Sound Sound, optional ESoundSlot Slot, optional float Volume, optional bool bNoOverride, optional float Radius, optional float Pitch, optional bool Attenuate ) : This function is originally defined in Actor.  It will allow a Sound to play.
; SetPhysics( EPhysics newPhysics ) : This function is originally defined in Actor.  We will use it when in a Dying state.
; SetCollision( optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ) : This function is originally defined in Actor.  We will use it when in a Dying state.
; bool PlayerCanSeeMe() : This function is originally defined in Actor.  It returns true when a player has a line of sight to this Actor.  We will use it when in a Dying state.
; AnimEnd( int Channel ) : This event is originally defined in Actor.  It is called when the current animation sequence has played through.  This will allow us to switch from action to action at an appropriate time.
; Landed( vector HitNormal ) : This event is originally defined in Actor.  It is called when the Actor has landed on a Base after falling.
; TornOff() : This event is a signal that this actor is no longer being replicated to new Clients and is now set to &lt;tt&gt;Role == ROLE_Authority&lt;/tt&gt; on the Clients.  We will use this for removal of a dead NaliCow on Clients.

====AIController Properties====
; (None) Actor MoveTarget : Originally defined in Controller, this is the Actor to move toward.
; (None) vector Destination : Originally defined in Controller, this is the vector (Location) to move toward.  We will use this to set desired location.
; (None) vector FocalPoint : Originally defined in Controller, this is the vector to look toward.  We will use this to set desired rotation.
; (None) Actor Focus: Originally defined in Controller, this is the Actor to look toward.

====Final Source Code====

The following is the AI Source Code for a NaliCow NPC, using all the available animations and sounds to convey believable behavior.

&lt;uscript&gt;
//=============================================================================
// NaliCow.
// NaliCow Non-Player Character for UT2004.
// by SuperApe -- Dec 2005
// ( Based on Mesh animations and sounds from Epic Games )
//=============================================================================
class NaliCow extends Pawn
    placeable;

var     Actor       HurtingActor;   // An Actor to get away from.
var     vector      OldLocation;    // Used to determine if stuck.
var		int			DamageTaken;	// Most recent damage amount.
var		bool		bStartled;		// Recently startled.

// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );
}

// DisplayBehavior() takes a BehaviorIndex value and sets the appropriate animation and sound.
// Degrees of behavior will be taken into account via an optional arguement.
function DisplayBehavior( int BehaviorIndex, optional int Degree )
{
    switch( BehaviorIndex ) {
        case(1) :
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
        case(2) : 
            Acting( 'root', sound'SkaarjPack_rc.munch1p', true ); break;
        case(3) : 
            Acting( 'Chew', sound'SkaarjPack_rc.munch1p', true ); break;
        case(4) : 
            if ( FRand() &gt; 0.5 )
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo1c', false );
            else
                Acting( 'Poop', sound'SkaarjPack_rc.cMoo2c', false );
            break;
        case(5) : 
            Acting( 'Shake', sound'SkaarjPack_rc.shakeC', true ); break;
        case(6) : 
            Acting( 'Swish', sound'SkaarjPack_rc.swishC', true ); break;
        case(7) : 
            Acting( 'Walk', sound'SkaarjPack_rc.WalkC', true ); break;
        case(8) : 
            Acting( 'Run', sound'SkaarjPack_rc.WalkC', true ); break;
        case(9) : 
            Acting( 'Landed', sound'SkaarjPack_rc.Thump', false ); break;
        case(10) : 
            if ( Degree &lt; 2 )
                Acting( 'TakeHit', sound'SkaarjPack_rc.cMoo1c', false );
            else if ( Degree == 2 )
                Acting( 'TakeHit2', sound'SkaarjPack_rc.injurC1c', false );
            else if ( Degree == 3 )
                Acting( 'BigHit', sound'SkaarjPack_rc.injurC2c', false );
            break;
        case(11) : 
            if ( Degree &lt; 2 )
                Acting( 'Dead', sound'SkaarjPack_rc.cMoo2c', false );
            else if ( Degree == 2 )
                Acting( 'Dead2', sound'SkaarjPack_rc.DeathC1c', false );
            else if ( Degree == 3 )
                Acting( 'Dead3', sound'SkaarjPack_rc.DeathC2c', false );
            break;
        default : 
            Acting( 'Breath', sound'SkaarjPack_rc.ambCow', true ); break;
     }
}

// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, 1.0, 0.1 );
    else
		PlayAnim( Anim, 1.0, 0.1 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = 1.0;
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
    SimAnim.TweenRate = 0.1;
    PlaySound( Soundname, SLOT_Misc );
}

// MoveCheck() deals with periodic checks for bStartled, DamageTaken and falling.
// Then moves the character in direction of Rotation and at speed of SpeedRatio.
function MoveCheck( float SpeedRatio )
{
	DamageTaken = 0;  // Reset most recent damage memory.

	if ( Base == None )  // Should be falling.
	{
		if ( Physics != PHYS_Falling )
			SetPhysics( PHYS_Falling );
		return;
	}

	if ( Controller.MoveTarget == None )
		ReachedDestination( self );

    if ( VSize( Controller.MoveTarget.Location - Location ) &lt; 64 )
   	    ReachedDestination( Controller.MoveTarget );

    if ( VSize( OldLocation - Location ) &lt; 48 )
   	    ReachedDestination( Controller.MoveTarget );

    OldLocation = Location;

    RotationRate.Yaw = SpeedRatio * 20000;
   	Velocity = ( SpeedRatio * GroundSpeed ) * vector( Rotation );
    Acceleration = Velocity;

	if ( FRand() &gt; 0.95 )  // Chance to calm down.
		bStartled = false;
	if ( bStartled &amp;&amp; !self.IsInState('Run') )
		GotoState('Run');  // React to startle.	
}

// ReachedDestination() is originally defined in Pawn.
// MoveTarget and other relevant properties are defined in Controller.
function bool ReachedDestination( Actor OldTarget )
{
    local   Actor   NewTarget, A;
    local   NavigationPoint    NP;

    forEach VisibleActors( class'Actor', A )
        if ( A != OldTarget &amp;&amp; A != HurtingActor )
            NewTarget = A;

    if ( A == None )
        forEach RadiusActors( class'NavigationPoint', NP, 1024 )
            if ( FRand() &gt; 0.5 &amp;&amp; NP != OldTarget &amp;&amp; FastTrace( NP.Location ) )
            {
                A = NP;
                NewTarget = A;
            }

    if ( A == None )
        forEach AllActors( class'Actor', A )
            if ( FRand() &gt; 0.5 &amp;&amp; A != HurtingActor &amp;&amp; A != OldTarget &amp;&amp; A != self &amp;&amp; !A.IsA('Controller') )
                NewTarget = A;

    if ( NewTarget != None )
    {
        Controller.MoveTarget = NewTarget;
        Controller.Destination = NewTarget.Location;
        Controller.FocalPoint = NewTarget.Location;
        Controller.Focus = NewTarget;
    }
    else
    {
        if ( HurtingActor != None )
        {
            Controller.Destination = ( Location - HurtingActor.Location );
            Controller.FocalPoint = Controller.Destination;
        }
        else
        {
            Controller.Destination = vector( Rotation ) * ( 512 * FRand() + 512 );
            Controller.FocalPoint = Controller.Destination;
        }
    }
}

// Trigger() is originally defined in Actor.
function Trigger( Actor Other, Pawn EventInstigator )
{
    if ( self.IsInState('Run') )
        return;
	if ( self.IsInState('Walk') )
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Touch() is originally defined in Actor.
function Touch( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') )
        return;
	GotoState('Walk');
}

// Bump() is originally defined in Actor.
function Bump( Actor Other )
{
    HurtingActor = Other;
    if ( self.IsInState('Run') &amp;&amp; ( FRand() &lt; 0.9 ) )  // Chance to calm.
        return;
	if ( self.IsInState('Walk') &amp;&amp; ( FRand() &gt; 0.9 ) )  // Change due to startle.
	{
		GotoState('Run');
		return;
	}
	GotoState('Walk');
}

// Landed() is originally defined in Actor.
event Landed( vector HitNormal )
{
	Super.Landed( HitNormal );

	if ( Velocity.Z &gt; -200 )  // Slow enough fall to forgive landing.
		return;

	if ( DamageTaken == 0 )
		GotoState('Land');
	else
		GotoState('TakeHit');
}

// TakeDamage() is originally defined in Actor.
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    HurtingActor = InstigatedBy;
	DamageTaken = Damage;
	bStartled = true;

    Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

	if ( DamageTaken &gt; 3 )
	    spawn( class'STR_green_blood_puff',,, HitLocation, Rotator( Momentum ) );

    if ( Controller != None &amp;&amp; ( Controller.MoveTarget == HurtingActor || Controller.Focus == HurtingActor ) )
		ReachedDestination( HurtingActor );  // Do not approach HurtingActor.

    if ( Health &gt; 0 )
        GotoState('TakeHit');
    else if ( !self.IsInState('Dying') )
        GotoState('Dying');
}

// Died() is originally defined in Pawn.
function Died( Controller Killer, class&lt;DamageType&gt; DamageType, vector HitLocation )
{
	TakeDamage( Health, None, Location, vect(0,0,-1), class'Crushed' );
}

// TornOff() is originally defined in Actor.
event TornOff()
{
    if ( PlayerCanSeeMe() )
        DeRez();
    else
        Destroy();
}

// DeRez() will signal removal of the dead NaliCow.
simulated function DeRez()
{
    if ( Level.NetMode == NM_DedicatedServer )
        return;

    Skins.length = 0;
    Skins[0] = Material'DeRez.Shaders.DeRezFinalBody';  
}

auto state() Prone
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Turn');        break;
            case(1) : GotoState('Graze');       break;
            case(2) : GotoState('Poop');        break;
            case(3) : GotoState('Shake');       break;
            case(4) : GotoState('Swish');       break;
            case(5) : GotoState('Walk');        break;
            default : DisplayBehavior( 1 );     break;
        }
    }

    Begin:
        DisplayBehavior( 1 );
		MoveCheck( 0.0 );
        if ( HurtingActor != None )
            if ( FRand() &gt; 0.95 )  // Chance to forgive HurtingActor.
                HurtingActor = None;
}

state() Turn
{
    event AnimEnd( int Channel )
    {
        RotationRate.Yaw = 0;
        GotoState('Prone');
    }

    Begin:
		MoveCheck( 0.0 );
        if ( DesiredRotation != Rotation )
        {
            RotationRate.Yaw = 10000;
            DisplayBehavior( 7 );
        }
        else
            GotoState('Prone');
}

state() Graze
{
    event AnimEnd( int Channel )
    {
        GotoState('Chew');
    }

    Begin:
        DisplayBehavior( 2 );
		MoveCheck( 0.0 );
}

state() Chew
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 15;
        switch ( X ) {
            case(0) : GotoState('Prone');       break;
            case(1) : GotoState('Graze');       break;
            case(2) : GotoState('Poop');        break;
            case(3) : GotoState('Shake');       break;
            case(4) : GotoState('Swish');       break;
            case(5) : GotoState('Walk');        break;
            default : DisplayBehavior( 3 );     break;
        }
    }

    Begin:
        DisplayBehavior( 3 );
		MoveCheck( 0.0 );
}

state Poop
{
    function Timer()
    {
        spawn( class'NaliCowPoop',, 'Poop', ( Location + ( vector(Rotation) * -24 ) ), rotator( vect(0,0,-1) ) );
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Shake');       break;
            case(2) : GotoState('Swish');       break;
            case(3) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 4 );
		MoveCheck( 0.0 );
        SetTimer( 1.0, false );
}

state() Shake
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Poop');        break;

            case(2) : DisplayBehavior( 5 );     break;
            case(3) : GotoState('Swish');       break;
            case(4) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 5 );
		MoveCheck( 0.0 );
}

state Swish
{
    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Graze');       break;
            case(1) : GotoState('Poop');        break;
            case(2) : GotoState('Shake');       break;
            case(3) : DisplayBehavior( 6 );     break;
            case(4) : GotoState('Walk');        break;
            default : GotoState('Prone');       break;
        }
    }

    Begin:
        DisplayBehavior( 6 );
		MoveCheck( 0.0 );
}

state Walk
{
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( 0.5 * GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 20;
        switch ( X ) {
            case(0) : GotoState('Prone');							break;
            case(1) : GotoState('Turn');							break;
            case(1) : GotoState('Graze');							break;
            case(2) : GotoState('Poop');							break;
            case(3) : GotoState('Shake');							break;
            case(4) : GotoState('Swish');							break;
            default : DisplayBehavior( 7 ); MoveCheck( 0.5 );		break;
        }
    }

    Begin:
        DisplayBehavior( 7 );
		MoveCheck( 0.5 );
}

state Run
{
    function Tick( float DeltaTime )
    {
        if ( Physics == PHYS_Walking &amp;&amp; DamageTaken == 0 )
        {
            Velocity = ( GroundSpeed ) * vector( Rotation );
            Acceleration = Velocity;
        }
    }

    event AnimEnd( int Channel )
    {
        local   int     X;

        X = FRand() * 10;
        switch ( X ) {
            case(0) : GotoState('Walk');							break;
            default : DisplayBehavior( 8 ); MoveCheck( 1.0 );		break;
        }
    }

    Begin:
        DisplayBehavior( 8 );
		MoveCheck( 1.0 );
}

state Land
{
    function Timer()
    {
        local   int     X;

		if ( bStartled )  // Always run if startled.
		{
			GotoState('Run');
			return;
		}

        X = FRand() * 10;
        switch ( X ) {
            case(0) : GotoState('Prone');   break;
            case(1) : GotoState('Turn');    break;
            case(2) : GotoState('Shake');   break;
            default : GotoState('Walk');    break;
        }
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 0.2, false );
    }

    Begin:
        DisplayBehavior( 9 );
		MoveCheck( 0.0 );
}

state TakeHit
{
    function Timer()
    {
        GotoState('Run');
    }

    event AnimEnd( int Channel )
    {
        if ( Health &lt; 1 )
            GotoState('Dying');
        else
            SetTimer( 0.2, false );
    }

    Begin:
        DisplayBehavior( 10, Min( ( DamageTaken / 15 ), 3 ) );
        MoveCheck( 0.0 );
}

state Dying
{
    Ignores Trigger, Touch, Bump, Landed, Died;

    function Timer()
    {
        SetPhysics( PHYS_None );
        SetCollision( false, false );
        Lifespan = 3.0;
        if ( PlayerCanSeeMe() )
            DeRez();
        else
            Destroy();
    }

    event AnimEnd( int Channel )
    {
        SetTimer( 4.0, false );
    }

    Begin:
        StopAnimating();
        DisplayBehavior( 11, Min( ( DamageTaken / 20 ), 3 ) );
        MoveCheck( 0.0 );
        if ( Level.NetMode == NM_DedicatedServer )
        {
            SetPhysics( PHYS_None );
            SetCollision( false, false );
            LifeSpan = 3.0;
            bTearOff = true;
        }
}

defaultProperties 
{
    CollisionHeight=34
    SurfaceType=EST_Flesh
    Mesh=VertMesh'SkaarjPack_rc.NaliCow'
    Physics=PHYS_Walking
    GroundSpeed=100
    bReplicateAnimations=true
    bFullVolume=true
    SoundRadius=512
}
&lt;/uscript&gt;

===NaliCowPoop===

An obvious Projectile to use for this NaliCowPoop Actor is the BioRifle's Projectile, BioGlob.  It uses a Mesh that automatically drips, jiggles and splats like our desired NaliCowPoop should.  We will need to make a custom subclass of BioGlob, change its Texture, Lighting and alter some of it's default code to prevent it from causing Damage.

====BioGlob Default Properties====
; (Display) Skins : It's default Skins are set for BioRifle ammo.  We will set it to &lt;tt&gt;Texture'XEffectMat.goop.SlimeSkin'&lt;/tt&gt;.
; (Movement) vector Velocity : The BioGlob starts with a lot of velocity by default, we will set it to vect(0,0,0) during PostBeginPlay().
; (Lighting) int AmbientGlow : BioGlobs have an AmbientGlow by default.  We will set this to zero.
; (Lighting) bool bUnlit : BioGlobs are unlit by default.  We will set this to false.
; (Lighting) bool bDynamicLight : BioGlobs glow by default.  We will set this to false.
; (Lighting) LightType : We will set this to LT_None.
; float RestTime : This property is originally defined in BioGlob.  It determines how long the BioGlob sits before it calls BlowUp().  We will set this value to 10.0.
; int BaseDamage : This property is originally defined in BioGlob.  We will make sure this doesn't cause damage by setting it to 0.

====BioGlob Default Methods====
; BlowUp( vector HitLocation ) : This function is originally defined in BioGlob.  We will modify it to not cause damage and instead switch to a Shriveling state, which shrinks the BioGlob and &quot;pops&quot; it.

====Final Source Code====

&lt;uscript&gt;
//=============================================================================
// NaliCowPoop.
// The effects result of the NaliCow Poop behavior.
// by SuperApe -- Dec 2005
//=============================================================================
class NaliCowPoop extends BioGlob;

function PostBeginPlay()
{
	Super.PostBeginPlay();

	Velocity = vect(0,0,0);
}

// BlowUp() is originally defined in BioGlob.
function BlowUp( vector HitLocation )
{
	GotoState('Shriveling');
}

defaultProperties
{
	Skins(0)=Texture'XEffectMat.goop.SlimeSkin'
	AmbientGlow=0
	bUnlit=false
	bDynamicLight=false
	LightType=LT_None
	RestTime=10.0
	BaseDamage=0
}
&lt;/uscript&gt;

==Testing and Implementation==

The new NPC character should be tested thoroughly to ensure it is behaving reliably both as a character and as a game object.

===Compiling===

If you're familiar with [[Legacy:Compiling With UCC|Compiling With UCC]], then you can skip this section.

The steps for compiling our NPC code are as follows:

# Find your UT2004 base directory.  This is usually &lt;tt&gt;C:/UT2004/&lt;/tt&gt;.  We will refer to this as &lt;tt&gt;.../UT2004/&lt;/tt&gt; from this point on.
# Create a subdirectory there for our NaliCow code, &lt;tt&gt;.../UT2004/NaliCow/&lt;/tt&gt;, and create a subdirectory within that for our Classes, &lt;tt&gt;.../UT2004/NaliCow/Classes&lt;/tt&gt;
# Within that Classes subdirectory, create a simple (text) file with a .uc extention called, &quot;NaliCow.uc&quot;, and another called, &quot;NaliCowPoop.uc&quot;.
# Copy the above final source code for the NaliCow and paste it into the .uc file.  Do the same for the NaliCowPoop code.
# Find your &lt;tt&gt;.../UT2004/System/UT2004.ini&lt;/tt&gt; file and edit it with a text editor.  Find the &lt;tt&gt;EditPackages=&lt;/tt&gt; block and add &lt;tt&gt;EditPackages=NaliCow&lt;/tt&gt; to the end of the block.  This will make sure the compiling application knows which subdirectory to look for things to compile.
# In Windows, use StartMenu -&gt; Run... to launch &lt;tt&gt;.../UT2004/System/ucc make&lt;/tt&gt;.
# If there were no errors, you will now have a &lt;tt&gt;.../UT2004/System/NaliCow.u&lt;/tt&gt; package file. (Note that to ''re-compile'' a package, you must remove it from the &lt;tt&gt;.../UT2004/System/&lt;/tt&gt; subdirectory, or else the compiling application will skip it.)
# If there were errors, they are in the ucc log file, &lt;tt&gt;.../UT2004/System/ucc.txt&lt;/tt&gt;, and will tell you which line number the error came from.

===Implementation===

Now, we will bring our NPC into the game environment to test and debug.

# Within Ued, open a map suitable for testing our NPC.
# In the [[Legacy:Actor Browser|Actor Browser]], go to File -&gt; Open... and select our &lt;tt&gt;NaliCow.u&lt;/tt&gt; package file.
# Add an Actor -&gt; Pawn -&gt; NaliCow to the map.
# Configure the desired properties, if any.
# Hit the Playtest (&quot;Joystick&quot;) button on the [[Legacy:Toolbar|Toolbar]].

Now you have the ability to test it's behaviors under a variety of situations.  This is a good idea to do with any new AI construct.  Be vigilant and thorough in your testing to find all the possible bugs.

Some helpful [[Legacy:Console Commands|Console Commands]] to use during testing are:

; summon NaliCow.NaliCow : This spawns a default NaliCow, placed directly in front of your view.
; addbots &lt;int NumberOfBots&gt; : This adds bots to the map.
; killall &lt;class KillClass&gt; : This destroys all objects of the given KillClass.
; allweapons : Gives all weapons and default ammo.
; map &lt;name MapName&gt; : Starts a new match within the MapName provided.  Note that '''map autoplay''' will re-start the current map within Ued's memory.

===Replication===

If you know how to [[Legacy:Launch A Local Netgame|Launch a Local Netgame]], you may skip this section.

Testing Replication is important to ensure that what you have made offline will work just as well online.

# Save a map with at least a few NaliCows in it, different settings, etc.  Save it to the &lt;tt&gt;.../UT2004/Maps/&lt;/tt&gt; subdirectory with a valid [[Legacy:Map File Prefix|Map File Prefix]].
# Launch UT2004 and Host a game.  Pick your custom map and click on '''Dedicated'''.  The menu window will disappear and a server log window will open as the game launches in the background.
# Launch UT2004 again.  Bring down the console and type, &lt;tt&gt;map 127.0.0.1&lt;/tt&gt;, to join the local server you just started.
# Once there for the first time, bring up the menu by hitting Esc and save this local server as one of your &quot;Favs&quot; for easier Joining in the future.

Now, you're seeing what a slow Dial-Up client player sees.  There will be some lag due to your machine handling both the Server and Client at the same time.  However, this is important to see what imformation is being Replicated properly and what isn't.

For pinpointing the problems, it's useful to use Logs to be called either on the DedicatedServer or not.  See also [[Legacy:Netcode Idioms|Netcode Idioms]].  The Logs are found at &lt;tt&gt;.../UT2004/System/Server.txt&lt;/tt&gt; for the Server and &lt;tt&gt;.../UT2004/System/UT2004.txt&lt;/tt&gt; for the Client.

==Further Development==

Beyond this basic NaliCow NPC, more can be done to improve behavior, realism, gameplay or ease of use.

===DrawScale Adjustments===

Based on the DrawScale property, several adjustments can be made during PostBeginPlay() to make sure the NaliCow behaves, moves and sounds properly.  The result is a simple one-property adjustment that can be made to make a small, fast baby cow or a big, slow older cow.  We will use a separate function that can be called from PostBeginPlay(), AdjustForSize().  Before the adjustments are made, we can make sure the DrawScale is within a reasonable size range.

&lt;uscript&gt;
// PostBeginPlay() is originally defined in Actor().
// We will use it to make sure an AIController is spawned for our NaliCow.
event PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );

	AdjustForSize();
}

// AdjustForSize() will make various adjustments according to DrawScale.
function AdjustForSize()
{
	if ( DrawScale &gt; 3.0 || DrawScale &lt; 0.5 )
		SetDrawScale( FClamp( DrawScale, 3.0, 0.5 ) );
	SetCollisionSize( 34 * DrawScale, 34 * DrawScale );
	Mass = 100 * DrawScale;
	Health = 100 * DrawScale;
	SoundRadius = 512 * DrawScale;
	SoundPitch = 128 / DrawScale;
	if ( DrawScale &gt; 1.5 )
		bCanBeBaseForPawns = true;
}
&lt;/uscript&gt;

Other functions and elements will also have to be changed based on DrawScale.  Changes to the AnimationRate, RotationRate, SoundVolume, SoundPitch, NaliCowPoop DrawScale and RestTime, etc. can all be made to reflect the size of the NaliCow.  For example, the Acting() function can be altered to look like this:

&lt;uscript&gt;
// Acting() loops the given animation sequence name and plays the given sound.
// For Replication purposes, animation is normally looped.  Sequences may be interupted each AnimEnd().
function Acting( name Anim, sound Soundname, bool bLoop )
{
    if ( bLoop )
        LoopAnim( Anim, ( 1.0 / DrawScale ), ( 1.0 / DrawScale )/10 );
    else
		PlayAnim( Anim, ( 1.0 / DrawScale ), ( 1.0 / DrawScale )/10 );
    SimAnim.AnimSequence = Anim;
    SimAnim.AnimRate = ( 1.0 / DrawScale );
    if ( bLoop )
        SimAnim.bAnimLoop = true;
    else
        SimAnim.bAnimLoop = false;
	SimAnim.TweenRate = ( 1.0 / DrawScale )/10;
    PlaySound( Soundname, SLOT_Misc, ( DrawScale * 2 ),,, ( SoundPitch / 128 ) );
}
&lt;/uscript&gt;

===Cow and Baby Relationships===

The original [[Legacy:Cow|Cow]] and BabyCow UT creatures had properties to define their relationships.  These can be reproduced with our NaliCow to perform the same behaviors.

====bHasBaby and BabyCow====

In UT, the property bHasBaby was meant to automatically spawn a BabyCow (a smaller version) for this Cow.  BabyCows were not meant to be explicitly placed in maps.  A simple modification to PostBeginPlay() should allow us to use our new DrawScale adjustments to do this easily.

&lt;uscript&gt;
var()		bool		bHasBaby;		// This NaliCow will spawn a smaller &quot;Baby&quot; at map start.
var  		NaliCow		Mama;			// This NaliCow is a &quot;Baby&quot; and should stay close to &quot;Mama&quot;.

event PostBeginPlay()
{
	local	NaliCow		Baby;

	Super.PostBeginPlay();
	
	if ( ( ControllerClass != None ) &amp;&amp; ( Controller == None ) )
		Controller = spawn( ControllerClass );
	if ( Controller != None )
		Controller.Possess( self );

	AdjustForSize();
	
	if ( bHasBaby )
		while ( Baby == None )
		{
			Baby = spawn( class'NaliCow', self,, Location + ( VRand() * ( 64 + CollisionRadius ) ), Rotation );
			if ( Baby != None )
			{
				Baby.Mama = self;
				Baby.SetDrawScale( DrawScale / 2 );
				Baby.AdjustForSize();
			}
		}
}
&lt;/uscript&gt;

Also, we should encourage the BabyCow to stay close to its &quot;Mama&quot;.  We will do this with a modification to ReachedDestination().  The following code will be added to ReachedDestination() just before NewTarget is assigned to the Controller attributes.

&lt;uscript&gt;
	if ( Mama != None )
		NewTarget = Mama;
&lt;/uscript&gt;

====bStayClose and WanderRadius====

bStayClose modified the behavior of the Cow so that it's Movement destinations were never more than WanderRadius UU away from it's starting Location.  ''Note: Although there is a '''home''' property defined in Controller, it is defined as a NavigationPoint and won't serve this purpose.''

&lt;uscript&gt;
var()		bool		bStayClose;		// This NaliCow will only select MoveTargets within WanderRadius.
var()		int 		WanderRadius;	// The radius from Home that MoveTargets will be selected.
var  		vector		Home;			// The Location this NaliCow started at.
&lt;/uscript&gt;

And the following code will be added to the end of ReachedDestination().

&lt;uscript&gt;
	if ( bStayClose &amp;&amp; WanderRadius &gt; 0 &amp;&amp; 
		( VSize( NewTarget.Location - Home ) &gt; WanderRadius || 
			VSize( Controller.Destination - Home ) &gt; WanderRadius ) )
	{
		Controller.Destination = Home + ( VRand() * ( FRand() * WanderRadius ) );
		Controller.FocalPoint = Controller.Destination;
	}
&lt;/uscript&gt;

===Ridable NaliCows===

An extra gameplay feature could be to have players be able to ride and loosely steer larger NaliCows.  You may have noticed the &lt;tt&gt;bCanBeBaseForPawns&lt;/tt&gt; property set during AdjustForSize() in the section above.  This will allow larger cows to support and carry Pawns.  Once a player has managed to get on top of one, a simple UsedBy() function can enable them to press Use and become a special Pawn to the NaliCow.

&lt;uscript&gt;
var		Pawn		Rider;			// PlayerPawn riding this cow.

// UsedBy() is originally defined in Actor.
function UsedBy( Pawn P )
{
	if ( !bCanBeBaseForPawns )
		return;

	if ( Rider == None )
	{
		Rider = P;
		if ( PlayerController( Rider.Controller ) != None )
			PlayerController( Rider.Controller ).bBehindView = true;
	}

	if ( P == Rider )
	{
		Controller.Destination = Location + ( vector( rot(0,1,0) * Rider.Controller.Rotation.Yaw ) * 1024 );
		Controller.FocalPoint = Controller.Destination;
		if ( !self.IsInState('Run') )
			GotoState('Run');
		else
			PlaySound( sound'SkaarjPack_rc.injurC1c', SLOT_Misc, ( DrawScale * 2 ),,, ( SoundPitch / 128 ) );
	}
}
&lt;/uscript&gt;

Once the player has become a Rider to the NaliCow, the NaliCow's Controller's Destinations are subject to the whims of the Rider.Controller.  The Rider.Controller also is automatically set to bBehindView to give a visual cue that the change has taken place.  By pressing the Use key, the NaliCow is urged to keep Running.  When the NaliCow reaches it's Destinations, we'll keep the player in control by adding a little code to the top of ReachedDestination().

&lt;uscript&gt;
    if ( Rider != None )
    {
        if ( VSize( Rider.Location - Location ) &gt; ( CollisionHeight + Rider.CollisionHeight ) )
        {
            if ( PlayerController( Rider.Controller ) != None )
                PlayerController( Rider.Controller ).bBehindView = false;
            Rider = None;  // Rider has left.
        }
        else
        {
            Controller.Destination = Location + ( vector( rot(0,1,0) * Rider.Controller.Rotation.Yaw ) * 1024 );
            Controller.FocalPoint = Controller.Destination;
            return true;
        }
    }
&lt;/uscript&gt;

To stop being a Rider, the player can simply move off the NaliCow.  The bBehindView setting will return after the NaliCow has reached it's next Destination.

==External Links==

Other links to basic AI scripting tutorials should be listed here:
* [http://www.langsuyar.com/articles/u2_tutorialsmain.html Mattias Worch's Unreal 2 Tutorials] '''(broken)''' :
: Mattias Worch worked on the Unreal 2 team and has written a few useful tutorials on AI scripting. The tutorials on this page directly relating to AI scripting are &quot;Set up Dialog and AI Scripting for a Level,&quot; and &quot;Create a Basic AI Script.&quot; Please note that the copyright on these tutorials allows us to link to them, but not to &quot;wikify&quot; the tutorials and place them here. If you would like to have a tutorial on the Wiki, I'm sure that everyone would appreciate if someone were to read over these tutorials and experiment with AI scripting until they had a complete enough understanding to place an original tutorial here.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic on all AI (bots, Monsters, NPCs, etc.)
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:UnrealScript|UnrealScript]]

==Discussion==

'''Tarquin:''' Link to documentation wiki pages, if they exist, or start writing them! That's a good way to start.

'''Foxpaw:''' I actually don't have any experience with AI scripting myself, I was just using the random page function and thought this page could use a bit of refactoring.

'''SuperApe:''' The above link is dead.  Yes, we need links or some tuts on the wiki itself.

'''SuperApe:''' I will most likely take over this page and revive it.  Linking to [[Legacy:NPC Support|NPC Support]] and others.  My thought is to take the Mesh for the NaliCow and re-construct it's AI coding as an NPC for UT2004. (I never had UT, so this will be a from scratch effort that I look forward to)  Tutorial outlined.  Working...

'''SuperApe:''' This is a tutorial on UScripting a custom AI.  Comments welcome.

'''Solid Snake:''' Hmmm, I don't really like some of the code in here as I think it could be a lot better.

'''SuperApe:''' I'll do my best to take that as constructive criticism, but it would really help if you could elaborate.  I guess, '''This page is under construction.'''

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Basic Bot Pathing</title>
    <id>548</id>
    <revision>
      <id>1694</id>
      <timestamp>2008-03-07T13:52:44Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Fixed broken link. Original site no longer has the page, using a cached copy from archive.org</comment>
      <text xml:space="preserve">This is an introductory tutorial on Basic Bot Pathing, aka Pathing.  To better understand the concepts and elements of a bot path network, see [[Legacy:Bot Pathing|Bot Pathing]].

==Prerequisites==

This tutorial assumes you know many of the [[:Category:Legacy Basic Procedure]]s: [[Legacy:Create A Room|Create a Room]], [[Legacy:Add An Actor|Add an Actor]], [[Legacy:Set The Following Properties|Set the following Properties]] and [[Legacy:Match These Tags|Match these Tags]].  It assumes you have already been through many of the [[Legacy:Mapping Lessons|Mapping Lessons]] and have a custom map of your own, ready to implement [[Legacy:Bot Pathing|Bot Pathing]].

==Overview==

Pathing is a necessary step before release of any custom map, and the better the pathing is, the better the reviews your map will receive.

Bots navigate a map by moving through a network of [[Legacy:NavigationPoint|NavigationPoint]]s, the simplest of which is called a [[Legacy:PathNode|PathNode]]. When a bot wants to get somewhere, the game finds the node nearest his current position and the node nearest his objective, calculates the shortest path through the network from one to the other, and tells the bot to follow that path. Thus, in order to get bots to play your map, you need to place enough PathNodes for bots to be able to use them to get to anywhere they might need to go.

==Placing Basic PathNodes==

Simply right-click on the location where you want to place a pathnode, and then select &quot;Place PathNode Here.&quot;  Build up the botpath network by placing more PathNodes at junctions and intersections where you want your bots to be able to go.  You'll need to [[Legacy:Rebuild|Rebuild]] your paths (use the Build Paths button on the [[Legacy:Toolbar|Toolbar]]) for any changes you make to take effect.  While you don't need to litter the map with PathNodes, it's important to make sure of a few things:

* Each intersection or junction has a PathNode.
* Changes in elevation or line-of-sight are marked with a PathNode. (such as the top and bottom of a staircase)
* Long stretches between PathNodes are filled in with enough nodes to link them together.
* Any tight hallway has a PathNode set at either end, in the center of the entrance and exit.
* Lines-of-sight between PathNodes are clear. (Imagine bots may travel in straight lines between connected PathNodes)
* Various actors such as inventory items act as pathnodes themselves, so there is no need to place a node right on top of them.

See the tips section below for more info.

==Viewing The Path Network==

To see the path network you're building, right-click on the grey bar at the top of the 3D viewport to bring up the [[Legacy:Viewport Context Menu|Viewport Context Menu]] and select &quot;Show Paths&quot; under the view submenu.

==Buidling The Path Network==

Be careful not to place too many; an excessive number of nodes may slow your map down, and is likely to confuse bots.  A good strategy is to start with only the PathNodes you know you'll need.  Then try to Build Paths.  If you get errors regarding &quot;orphaned&quot; or &quot;stranded&quot; nodes, you can adjust them or add more to link them together.  Add a few more and try to Build Paths again.  Little by little, you'll be adding only the PathNodes necessary and limiting overkill.  Too many pathnodes can slow the map down and make the network overly complicated &amp;ndash; your goal should be to cover all of the map with the minimum of nodes.

===Tips===
* '''Line of Sight''' For a bot to be able to move from node to node, the two nodes must be within a line-of-sight of one another, and not too far apart.  See &quot;Viewing the Path Network&quot; above. 
* '''Distances'''  See how far two nodes can be moved apart before the connection dissapears to get a good esitmation of the maximum distance.  A distance of 300 to 700 [[Legacy:UU|UU]]s seems to work well. Place them closer together on uneven or broken ground and farther apart on open floors. No farther then 300 to 350 on steps and ramps. The distance must be at least 50[[Legacy:UU|UU]], otherwise [[Legacy:UnrealEd|UnrealEd]] will notify you that your paths are too close together upon rebuild.
* '''No space to add nodes''' If you ever select Add PathNode and nothing appears, it means that there wasn't room to add it. Keep trying in different spots nearby or momentarily turn off grid snap until it works.
* '''Minimize the number of nodes''' Don't forget that too many NavigationPoints can slow the map down; the more nodes in the network, the more time it takes to calculate a path through it. So don't go overboard.  Try to economize as much as possible.
* '''Bots like inventory items'''.  MiniHealth pickups, for example, ''can'' be used as incentive to follow a route.  Remember that inventory items also act as pathnodes, whether they are spawned or not, so there's no need to put a pathnode at the item. Keep in mind that bots may go out of their way to collect them.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]] for how Inventory items should best be added.

==Other NavigationPoints==

Once you've got the whole level covered with PathNodes, you can begin to look for special points that need more than a basic PathNode NavigationPoint.  JumpSpots, for example, are points that are good destinations from a jump.  You would want to identify any PathNode near the edge of or at the bottom of a ledge and replace it with a JumpSpot.

Other types of NavigationPoints such as [[Legacy:PlayerStart|PlayerStart]]s, [[Legacy:FlagBase|FlagBase]]s in CTF maps, [[Legacy:ControlPoint|ControlPoint]]s in Domination maps, [[Legacy:Pickup|Pickup]]s and [[Legacy:InventorySpot|InventorySpot]]s also act as nodes in the botpath network, so you don't need to add PathNodes near those items.

===Placing Other NavigationPoint actors===

Bring up the [[Legacy:Actor Browser|Actor Browser]], select the type of NavigationPoint you wish.  In the 3D view, place a node by right-clicking on the floor and selecting the &quot;Place &lt;YourActor&gt; Here&quot; option.

When it's time to handle the more advanced bot behaviors such as riding lifts, using jump pads, ImpactJumping, Translocator use, etc., here are some specific pages to look over:
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* The full list of available [[Legacy:NavigationPoint|NavigationPoint]]s
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.

==Testing &amp; Troubleshooting==

While working on the bot support, you will need to make sure the botplay is working.  You will have to focus on the bots as they try to play in the map.  By spectating a bots-only game, you can identify trouble spots or behaviors that you'd like to change.

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinately in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Bot Mind|Bot Mind]] and [[Legacy:Testing Botplay|Testing Botplay]] for more on troubleshooting and how to determine what the bot's goals are.

==External Links ==
* [http://web.archive.org/web/20060504134611/http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]
* [http://blitz.unrealplayground.com/tutorials/bots.html Advanced Bot Pathing Tutorial] by Blitz

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Map Design|Map Design]]
** [[Legacy:Inventory Item Placement|Inventory Item Placement]] &amp;ndash; Placing inventory items from a gameplay standpoint

==Discussion==

'''SuperApe:''' Revised to look more like a tutorial.  Comments welcome.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1695</id>
      <timestamp>2006-09-24T03:07:07Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is an introductory tutorial on Basic Bot Pathing, aka Pathing.

==Prerequisites==

This tutorial assumes you know many of the [[:Category:Legacy Basic Procedure]]s: [[Legacy:Create A Room|Create a Room]], [[Legacy:Add An Actor|Add an Actor]], [[Legacy:Set The Following Properties|Set the following Properties]] and [[Legacy:Match These Tags|Match these Tags]].  It assumes you have already been through many of the [[Legacy:Mapping Lessons|Mapping Lessons]] and have a custom map of your own, ready to implement [[Legacy:Bot Support|Bot Support]].

==Overview==

Pathing is a necessary step before release of any custom map, and the better the pathing is, the better the reviews your map will receive.

Bots navigate a map by moving through a network of [[Legacy:NavigationPoint|NavigationPoint]]s, the simplest of which is called a [[Legacy:PathNode|PathNode]]. When a bot wants to get somewhere, the game finds the node nearest his current position and the node nearest his objective, calculates the shortest path through the network from one to the other, and tells the bot to follow that path. Thus, in order to get bots to play your map, you need to place enough PathNodes for bots to be able to use them to get to anywhere they might need to go.

==Placing Basic PathNodes==

Simply right-click on the location where you want to place a pathnode, and then select &quot;Place PathNode Here.&quot; Build up the botpath network by placing more PathNodes at junctions and intersections where you want your bots to be able to go.  You'll need to [[Legacy:Rebuild|Rebuild]] your paths (use the Build Paths button on the [[Legacy:Toolbar|Toolbar]]) for any changes you make to take effect.  While you don't need to litter the map with PathNodes, it's important to make sure of a few things:

* Each intersection or junction has a PathNode.
* Changes in elevation or line-of-sight are marked with a PathNode. (such as the top and bottom of a staircase)
* Long stretches between PathNodes are filled in with enough nodes to link them together.
* Any tight hallway has a PathNode set at either end, in the center of the entrance and exit.
* Lines-of-sight between PathNodes are clear. (Imagine bots may travel in straight lines between connected PathNodes)
* Various actors such as inventory items act as pathnodes themselves, so there is no need to place a node right on top of them.

See the tips section below for more info.

==Placing [[Legacy:Bot Pathing|Advanced PathNodes]]==

Bring up the [[Legacy:Actor Browser|Actor Browser]], and under NavigationPoint, select the type of PathNode you wish to create to make it your current actor.  In the 3D view, place a node by right-clicking on the floor and clicking the option with the name of the PathNode actor you just selected. 

==Viewing The Path Network==

To see the path network you're building, right-click on the grey bar at the top of the 3D viewport to bring up the [[Legacy:Viewport Context Menu|Viewport Context Menu]] and select &quot;Show Paths&quot; under the view submenu.

==Buidling The Path Network==

Be careful not to place too many; an excessive number of nodes may slow your map down, and is likely to confuse bots.  A good strategy is to start with only the PathNodes you know you'll need.  Then try to Build Paths.  If you get errors regarding &quot;orphaned&quot; or &quot;stranded&quot; nodes, you can adjust them or add more to link them together.  Add a few more and try to Build Paths again.  Little by little, you'll be adding only the PathNodes necessary and limiting overkill.  Too many pathnodes can slow the map down and make the network overly complicated &amp;ndash; your goal should be to cover all of the map with the minimum of nodes.

===Tips===
* '''Line of Sight''' For a bot to be able to move from one node to another, the two nodes must be within a line-of-sight of one another, and not too far apart. See &quot;Viewing the Path Network&quot; Above, and then   see how far two nodes can be moved apart before the connection dissapears to get a good esitmation of the max. distance.
* '''Distances''' A distance of 300 to 700 [[Legacy:UU|UU]]s seems to work well. Place them closer together on uneven or broken ground and farther apart on open floors. No farther then 300 to 350 on steps and ramps. The absolute minimum distance should be 50[[Legacy:UU|UU]]. [[Legacy:UnrealEd|UnrealEd]] will notify you if your paths are too close together.
* '''No space to add nodes''' If you ever select Add PathNode and nothing appears, it means that there wasn't room to add it. Keep trying in different spots nearby until it works.  You can check the ScriptEditor for error messages that indicate why the PathNode wasn't placed.
* '''Minimize the number of nodes''' Don't forget that too many NavigationPoints can slow the map down; the more nodes in the network, the more time it takes to calculate a path through it. So don't go overboard.  Try to economize as much as possible. Too many nodes can also cause bots to start running in circles or other erratic behavior.
* '''Bots like inventory items'''.  MiniHealth pickups, for example, ''can'' be used as incentive to follow a route.  Remember that inventory items also act as pathnodes, whether they are spawned or not, so there's no need to put a pathnode at the item. Keep in mind that bots will go out of there way to collect them. '''See [[Legacy:Inventory Item Placement|Inventory Item Placement]] for how these items should best be added.

==Other NavigationPoints==

Once you've got the whole level covered with PathNodes, you can begin to look for special points that need more than a basic PathNode NavigationPoint.  JumpSpots, for example, are points that are good destinations from a jump.  You would want to identify any PathNode near the edge of or at the bottom of a ledge and replace it with a JumpSpot.

Other types of NavigationPoints such as [[Legacy:PlayerStart|PlayerStart]]s, [[Legacy:FlagBase|FlagBase]]s in CTF maps, [[Legacy:ControlPoint|ControlPoint]]s in Domination maps, [[Legacy:Pickup|Pickup]]s and [[Legacy:InventorySpot|InventorySpot]]s also act as nodes in the botpath network, so you don't need to add PathNodes near those items.

When it's time to handle the more advanced bot behaviors such as riding lifts, using jump pads, ImpactJumping, Translocator use, etc., here are some specific pages to look over:
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
* The full list of available [[Legacy:NavigationPoint|NavigationPoint]]s
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.

==Testing &amp; Troubleshooting==

While working on the bot support, you will need to make sure the botplay is working.  You will have to focus on the bots as they try to play in the map.  By spectating a bots-only game, you can identify trouble spots or behaviors that you'd like to change.

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinately in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Bot Mind|Bot Mind]] and [[Legacy:Testing Botplay|Testing Botplay]] for more on troubleshooting and how to determine what the bot's goals are.

==External Links ==
* [http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]
* [http://blitz.unrealplayground.com/tutorials/bots.html Advanced Bot Pathing Tutorial] by Blitz

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Inventory Item Placement|Inventory Item Placement]] &amp;ndash; How to place inventory items, from a gameplay standpoint.
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Design|Map Design]]

==Discussion==

'''SuperApe:''' Revised to look more like a tutorial.  Comments welcome.

'''Bob_The_Beheader:''' Pathnodes can be created without having to bring up the [[Legacy:Actor Browser|Actor Browser]]. On the right-click menu there is a command &quot;Add Path Node Here.&quot; Path node does not need to be selected in the actor browser for this to appear. It works with PlayerStarts and Lights as well.

'''SuperApe:''' Very true.  Thanks for the revision.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1696</id>
      <timestamp>2007-12-26T23:56:19Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is an introductory tutorial on Basic Bot Pathing, aka Pathing.  To better understand the concepts and elements of a bot path network, see [[Legacy:Bot Pathing|Bot Pathing]].

==Prerequisites==

This tutorial assumes you know many of the [[:Category:Legacy Basic Procedure]]s: [[Legacy:Create A Room|Create a Room]], [[Legacy:Add An Actor|Add an Actor]], [[Legacy:Set The Following Properties|Set the following Properties]] and [[Legacy:Match These Tags|Match these Tags]].  It assumes you have already been through many of the [[Legacy:Mapping Lessons|Mapping Lessons]] and have a custom map of your own, ready to implement [[Legacy:Bot Pathing|Bot Pathing]].

==Overview==

Pathing is a necessary step before release of any custom map, and the better the pathing is, the better the reviews your map will receive.

Bots navigate a map by moving through a network of [[Legacy:NavigationPoint|NavigationPoint]]s, the simplest of which is called a [[Legacy:PathNode|PathNode]]. When a bot wants to get somewhere, the game finds the node nearest his current position and the node nearest his objective, calculates the shortest path through the network from one to the other, and tells the bot to follow that path. Thus, in order to get bots to play your map, you need to place enough PathNodes for bots to be able to use them to get to anywhere they might need to go.

==Placing Basic PathNodes==

Simply right-click on the location where you want to place a pathnode, and then select &quot;Place PathNode Here.&quot;  Build up the botpath network by placing more PathNodes at junctions and intersections where you want your bots to be able to go.  You'll need to [[Legacy:Rebuild|Rebuild]] your paths (use the Build Paths button on the [[Legacy:Toolbar|Toolbar]]) for any changes you make to take effect.  While you don't need to litter the map with PathNodes, it's important to make sure of a few things:

* Each intersection or junction has a PathNode.
* Changes in elevation or line-of-sight are marked with a PathNode. (such as the top and bottom of a staircase)
* Long stretches between PathNodes are filled in with enough nodes to link them together.
* Any tight hallway has a PathNode set at either end, in the center of the entrance and exit.
* Lines-of-sight between PathNodes are clear. (Imagine bots may travel in straight lines between connected PathNodes)
* Various actors such as inventory items act as pathnodes themselves, so there is no need to place a node right on top of them.

See the tips section below for more info.

==Viewing The Path Network==

To see the path network you're building, right-click on the grey bar at the top of the 3D viewport to bring up the [[Legacy:Viewport Context Menu|Viewport Context Menu]] and select &quot;Show Paths&quot; under the view submenu.

==Buidling The Path Network==

Be careful not to place too many; an excessive number of nodes may slow your map down, and is likely to confuse bots.  A good strategy is to start with only the PathNodes you know you'll need.  Then try to Build Paths.  If you get errors regarding &quot;orphaned&quot; or &quot;stranded&quot; nodes, you can adjust them or add more to link them together.  Add a few more and try to Build Paths again.  Little by little, you'll be adding only the PathNodes necessary and limiting overkill.  Too many pathnodes can slow the map down and make the network overly complicated &amp;ndash; your goal should be to cover all of the map with the minimum of nodes.

===Tips===
* '''Line of Sight''' For a bot to be able to move from node to node, the two nodes must be within a line-of-sight of one another, and not too far apart.  See &quot;Viewing the Path Network&quot; above. 
* '''Distances'''  See how far two nodes can be moved apart before the connection dissapears to get a good esitmation of the maximum distance.  A distance of 300 to 700 [[Legacy:UU|UU]]s seems to work well. Place them closer together on uneven or broken ground and farther apart on open floors. No farther then 300 to 350 on steps and ramps. The distance must be at least 50[[Legacy:UU|UU]], otherwise [[Legacy:UnrealEd|UnrealEd]] will notify you that your paths are too close together upon rebuild.
* '''No space to add nodes''' If you ever select Add PathNode and nothing appears, it means that there wasn't room to add it. Keep trying in different spots nearby or momentarily turn off grid snap until it works.
* '''Minimize the number of nodes''' Don't forget that too many NavigationPoints can slow the map down; the more nodes in the network, the more time it takes to calculate a path through it. So don't go overboard.  Try to economize as much as possible.
* '''Bots like inventory items'''.  MiniHealth pickups, for example, ''can'' be used as incentive to follow a route.  Remember that inventory items also act as pathnodes, whether they are spawned or not, so there's no need to put a pathnode at the item. Keep in mind that bots may go out of their way to collect them.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]] for how Inventory items should best be added.

==Other NavigationPoints==

Once you've got the whole level covered with PathNodes, you can begin to look for special points that need more than a basic PathNode NavigationPoint.  JumpSpots, for example, are points that are good destinations from a jump.  You would want to identify any PathNode near the edge of or at the bottom of a ledge and replace it with a JumpSpot.

Other types of NavigationPoints such as [[Legacy:PlayerStart|PlayerStart]]s, [[Legacy:FlagBase|FlagBase]]s in CTF maps, [[Legacy:ControlPoint|ControlPoint]]s in Domination maps, [[Legacy:Pickup|Pickup]]s and [[Legacy:InventorySpot|InventorySpot]]s also act as nodes in the botpath network, so you don't need to add PathNodes near those items.

===Placing Other NavigationPoint actors===

Bring up the [[Legacy:Actor Browser|Actor Browser]], select the type of NavigationPoint you wish.  In the 3D view, place a node by right-clicking on the floor and selecting the &quot;Place &lt;YourActor&gt; Here&quot; option.

When it's time to handle the more advanced bot behaviors such as riding lifts, using jump pads, ImpactJumping, Translocator use, etc., here are some specific pages to look over:
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* The full list of available [[Legacy:NavigationPoint|NavigationPoint]]s
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.

==Testing &amp; Troubleshooting==

While working on the bot support, you will need to make sure the botplay is working.  You will have to focus on the bots as they try to play in the map.  By spectating a bots-only game, you can identify trouble spots or behaviors that you'd like to change.

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinately in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Bot Mind|Bot Mind]] and [[Legacy:Testing Botplay|Testing Botplay]] for more on troubleshooting and how to determine what the bot's goals are.

==External Links ==
* [http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]
* [http://blitz.unrealplayground.com/tutorials/bots.html Advanced Bot Pathing Tutorial] by Blitz

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Map Design|Map Design]]
** [[Legacy:Inventory Item Placement|Inventory Item Placement]] &amp;ndash; Placing inventory items from a gameplay standpoint

==Discussion==

'''SuperApe:''' Revised to look more like a tutorial.  Comments welcome.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43891</id>
      <timestamp>2010-08-16T18:57:39Z</timestamp>
      <contributor>
        <ip>207.172.203.39</ip>
      </contributor>
      <comment>/* External Links */ The link to Blitz' tutorial was dead -- web.archive.org to the rescue!</comment>
      <text xml:space="preserve">This is an introductory tutorial on Basic Bot Pathing, aka Pathing.  To better understand the concepts and elements of a bot path network, see [[Legacy:Bot Pathing|Bot Pathing]].

==Prerequisites==

This tutorial assumes you know many of the [[:Category:Legacy Basic Procedure]]s: [[Legacy:Create A Room|Create a Room]], [[Legacy:Add An Actor|Add an Actor]], [[Legacy:Set The Following Properties|Set the following Properties]] and [[Legacy:Match These Tags|Match these Tags]].  It assumes you have already been through many of the [[Legacy:Mapping Lessons|Mapping Lessons]] and have a custom map of your own, ready to implement [[Legacy:Bot Pathing|Bot Pathing]].

==Overview==

Pathing is a necessary step before release of any custom map, and the better the pathing is, the better the reviews your map will receive.

Bots navigate a map by moving through a network of [[Legacy:NavigationPoint|NavigationPoint]]s, the simplest of which is called a [[Legacy:PathNode|PathNode]]. When a bot wants to get somewhere, the game finds the node nearest his current position and the node nearest his objective, calculates the shortest path through the network from one to the other, and tells the bot to follow that path. Thus, in order to get bots to play your map, you need to place enough PathNodes for bots to be able to use them to get to anywhere they might need to go.

==Placing Basic PathNodes==

Simply right-click on the location where you want to place a pathnode, and then select &quot;Place PathNode Here.&quot;  Build up the botpath network by placing more PathNodes at junctions and intersections where you want your bots to be able to go.  You'll need to [[Legacy:Rebuild|Rebuild]] your paths (use the Build Paths button on the [[Legacy:Toolbar|Toolbar]]) for any changes you make to take effect.  While you don't need to litter the map with PathNodes, it's important to make sure of a few things:

* Each intersection or junction has a PathNode.
* Changes in elevation or line-of-sight are marked with a PathNode. (such as the top and bottom of a staircase)
* Long stretches between PathNodes are filled in with enough nodes to link them together.
* Any tight hallway has a PathNode set at either end, in the center of the entrance and exit.
* Lines-of-sight between PathNodes are clear. (Imagine bots may travel in straight lines between connected PathNodes)
* Various actors such as inventory items act as pathnodes themselves, so there is no need to place a node right on top of them.

See the tips section below for more info.

==Viewing The Path Network==

To see the path network you're building, right-click on the grey bar at the top of the 3D viewport to bring up the [[Legacy:Viewport Context Menu|Viewport Context Menu]] and select &quot;Show Paths&quot; under the view submenu.

==Buidling The Path Network==

Be careful not to place too many; an excessive number of nodes may slow your map down, and is likely to confuse bots.  A good strategy is to start with only the PathNodes you know you'll need.  Then try to Build Paths.  If you get errors regarding &quot;orphaned&quot; or &quot;stranded&quot; nodes, you can adjust them or add more to link them together.  Add a few more and try to Build Paths again.  Little by little, you'll be adding only the PathNodes necessary and limiting overkill.  Too many pathnodes can slow the map down and make the network overly complicated &amp;ndash; your goal should be to cover all of the map with the minimum of nodes.

===Tips===
* '''Line of Sight''' For a bot to be able to move from node to node, the two nodes must be within a line-of-sight of one another, and not too far apart.  See &quot;Viewing the Path Network&quot; above. 
* '''Distances'''  See how far two nodes can be moved apart before the connection dissapears to get a good esitmation of the maximum distance.  A distance of 300 to 700 [[Legacy:UU|UU]]s seems to work well. Place them closer together on uneven or broken ground and farther apart on open floors. No farther then 300 to 350 on steps and ramps. The distance must be at least 50[[Legacy:UU|UU]], otherwise [[Legacy:UnrealEd|UnrealEd]] will notify you that your paths are too close together upon rebuild.
* '''No space to add nodes''' If you ever select Add PathNode and nothing appears, it means that there wasn't room to add it. Keep trying in different spots nearby or momentarily turn off grid snap until it works.
* '''Minimize the number of nodes''' Don't forget that too many NavigationPoints can slow the map down; the more nodes in the network, the more time it takes to calculate a path through it. So don't go overboard.  Try to economize as much as possible.
* '''Bots like inventory items'''.  MiniHealth pickups, for example, ''can'' be used as incentive to follow a route.  Remember that inventory items also act as pathnodes, whether they are spawned or not, so there's no need to put a pathnode at the item. Keep in mind that bots may go out of their way to collect them.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]] for how Inventory items should best be added.

==Other NavigationPoints==

Once you've got the whole level covered with PathNodes, you can begin to look for special points that need more than a basic PathNode NavigationPoint.  JumpSpots, for example, are points that are good destinations from a jump.  You would want to identify any PathNode near the edge of or at the bottom of a ledge and replace it with a JumpSpot.

Other types of NavigationPoints such as [[Legacy:PlayerStart|PlayerStart]]s, [[Legacy:FlagBase|FlagBase]]s in CTF maps, [[Legacy:ControlPoint|ControlPoint]]s in Domination maps, [[Legacy:Pickup|Pickup]]s and [[Legacy:InventorySpot|InventorySpot]]s also act as nodes in the botpath network, so you don't need to add PathNodes near those items.

===Placing Other NavigationPoint actors===

Bring up the [[Legacy:Actor Browser|Actor Browser]], select the type of NavigationPoint you wish.  In the 3D view, place a node by right-clicking on the floor and selecting the &quot;Place &lt;YourActor&gt; Here&quot; option.

When it's time to handle the more advanced bot behaviors such as riding lifts, using jump pads, ImpactJumping, Translocator use, etc., here are some specific pages to look over:
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* The full list of available [[Legacy:NavigationPoint|NavigationPoint]]s
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.

==Testing &amp; Troubleshooting==

While working on the bot support, you will need to make sure the botplay is working.  You will have to focus on the bots as they try to play in the map.  By spectating a bots-only game, you can identify trouble spots or behaviors that you'd like to change.

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinately in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Bot Mind|Bot Mind]] and [[Legacy:Testing Botplay|Testing Botplay]] for more on troubleshooting and how to determine what the bot's goals are.

==External Links ==
* [http://web.archive.org/web/20060504134611/http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]
* [http://web.archive.org/web/20080615150030/blitz.unrealplayground.com/tutorials/bots.html] by Blitz

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Map Design|Map Design]]
** [[Legacy:Inventory Item Placement|Inventory Item Placement]] &amp;ndash; Placing inventory items from a gameplay standpoint

==Discussion==

'''SuperApe:''' Revised to look more like a tutorial.  Comments welcome.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43892</id>
      <timestamp>2010-08-16T18:59:29Z</timestamp>
      <contributor>
        <ip>207.172.203.39</ip>
      </contributor>
      <comment>/* External Links */ Put back the link text (whoops!)</comment>
      <text xml:space="preserve">This is an introductory tutorial on Basic Bot Pathing, aka Pathing.  To better understand the concepts and elements of a bot path network, see [[Legacy:Bot Pathing|Bot Pathing]].

==Prerequisites==

This tutorial assumes you know many of the [[:Category:Legacy Basic Procedure]]s: [[Legacy:Create A Room|Create a Room]], [[Legacy:Add An Actor|Add an Actor]], [[Legacy:Set The Following Properties|Set the following Properties]] and [[Legacy:Match These Tags|Match these Tags]].  It assumes you have already been through many of the [[Legacy:Mapping Lessons|Mapping Lessons]] and have a custom map of your own, ready to implement [[Legacy:Bot Pathing|Bot Pathing]].

==Overview==

Pathing is a necessary step before release of any custom map, and the better the pathing is, the better the reviews your map will receive.

Bots navigate a map by moving through a network of [[Legacy:NavigationPoint|NavigationPoint]]s, the simplest of which is called a [[Legacy:PathNode|PathNode]]. When a bot wants to get somewhere, the game finds the node nearest his current position and the node nearest his objective, calculates the shortest path through the network from one to the other, and tells the bot to follow that path. Thus, in order to get bots to play your map, you need to place enough PathNodes for bots to be able to use them to get to anywhere they might need to go.

==Placing Basic PathNodes==

Simply right-click on the location where you want to place a pathnode, and then select &quot;Place PathNode Here.&quot;  Build up the botpath network by placing more PathNodes at junctions and intersections where you want your bots to be able to go.  You'll need to [[Legacy:Rebuild|Rebuild]] your paths (use the Build Paths button on the [[Legacy:Toolbar|Toolbar]]) for any changes you make to take effect.  While you don't need to litter the map with PathNodes, it's important to make sure of a few things:

* Each intersection or junction has a PathNode.
* Changes in elevation or line-of-sight are marked with a PathNode. (such as the top and bottom of a staircase)
* Long stretches between PathNodes are filled in with enough nodes to link them together.
* Any tight hallway has a PathNode set at either end, in the center of the entrance and exit.
* Lines-of-sight between PathNodes are clear. (Imagine bots may travel in straight lines between connected PathNodes)
* Various actors such as inventory items act as pathnodes themselves, so there is no need to place a node right on top of them.

See the tips section below for more info.

==Viewing The Path Network==

To see the path network you're building, right-click on the grey bar at the top of the 3D viewport to bring up the [[Legacy:Viewport Context Menu|Viewport Context Menu]] and select &quot;Show Paths&quot; under the view submenu.

==Buidling The Path Network==

Be careful not to place too many; an excessive number of nodes may slow your map down, and is likely to confuse bots.  A good strategy is to start with only the PathNodes you know you'll need.  Then try to Build Paths.  If you get errors regarding &quot;orphaned&quot; or &quot;stranded&quot; nodes, you can adjust them or add more to link them together.  Add a few more and try to Build Paths again.  Little by little, you'll be adding only the PathNodes necessary and limiting overkill.  Too many pathnodes can slow the map down and make the network overly complicated &amp;ndash; your goal should be to cover all of the map with the minimum of nodes.

===Tips===
* '''Line of Sight''' For a bot to be able to move from node to node, the two nodes must be within a line-of-sight of one another, and not too far apart.  See &quot;Viewing the Path Network&quot; above. 
* '''Distances'''  See how far two nodes can be moved apart before the connection dissapears to get a good esitmation of the maximum distance.  A distance of 300 to 700 [[Legacy:UU|UU]]s seems to work well. Place them closer together on uneven or broken ground and farther apart on open floors. No farther then 300 to 350 on steps and ramps. The distance must be at least 50[[Legacy:UU|UU]], otherwise [[Legacy:UnrealEd|UnrealEd]] will notify you that your paths are too close together upon rebuild.
* '''No space to add nodes''' If you ever select Add PathNode and nothing appears, it means that there wasn't room to add it. Keep trying in different spots nearby or momentarily turn off grid snap until it works.
* '''Minimize the number of nodes''' Don't forget that too many NavigationPoints can slow the map down; the more nodes in the network, the more time it takes to calculate a path through it. So don't go overboard.  Try to economize as much as possible.
* '''Bots like inventory items'''.  MiniHealth pickups, for example, ''can'' be used as incentive to follow a route.  Remember that inventory items also act as pathnodes, whether they are spawned or not, so there's no need to put a pathnode at the item. Keep in mind that bots may go out of their way to collect them.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]] for how Inventory items should best be added.

==Other NavigationPoints==

Once you've got the whole level covered with PathNodes, you can begin to look for special points that need more than a basic PathNode NavigationPoint.  JumpSpots, for example, are points that are good destinations from a jump.  You would want to identify any PathNode near the edge of or at the bottom of a ledge and replace it with a JumpSpot.

Other types of NavigationPoints such as [[Legacy:PlayerStart|PlayerStart]]s, [[Legacy:FlagBase|FlagBase]]s in CTF maps, [[Legacy:ControlPoint|ControlPoint]]s in Domination maps, [[Legacy:Pickup|Pickup]]s and [[Legacy:InventorySpot|InventorySpot]]s also act as nodes in the botpath network, so you don't need to add PathNodes near those items.

===Placing Other NavigationPoint actors===

Bring up the [[Legacy:Actor Browser|Actor Browser]], select the type of NavigationPoint you wish.  In the 3D view, place a node by right-clicking on the floor and selecting the &quot;Place &lt;YourActor&gt; Here&quot; option.

When it's time to handle the more advanced bot behaviors such as riding lifts, using jump pads, ImpactJumping, Translocator use, etc., here are some specific pages to look over:
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* The full list of available [[Legacy:NavigationPoint|NavigationPoint]]s
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.

==Testing &amp; Troubleshooting==

While working on the bot support, you will need to make sure the botplay is working.  You will have to focus on the bots as they try to play in the map.  By spectating a bots-only game, you can identify trouble spots or behaviors that you'd like to change.

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinately in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Bot Mind|Bot Mind]] and [[Legacy:Testing Botplay|Testing Botplay]] for more on troubleshooting and how to determine what the bot's goals are.

==External Links ==
* [http://web.archive.org/web/20060504134611/http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]
* [http://web.archive.org/web/20080615150030/blitz.unrealplayground.com/tutorials/bots.html Advanced Bot Pathing Tutorial] by Blitz

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Map Design|Map Design]]
** [[Legacy:Inventory Item Placement|Inventory Item Placement]] &amp;ndash; Placing inventory items from a gameplay standpoint

==Discussion==

'''SuperApe:''' Revised to look more like a tutorial.  Comments welcome.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Basic Procedure</title>
    <id>24053</id>
    <revision>
      <id>33731</id>
      <timestamp>2008-12-19T17:08:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirecting to [[Category:Legacy Basic Procedure]]</comment>
      <text xml:space="preserve">#REDIRECT [[:Category:Legacy Basic Procedure]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Basic ScriptedPawn Tutorial</title>
    <id>662</id>
    <revision>
      <id>1950</id>
      <timestamp>2006-12-23T16:31:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a tutorial that sets up a UT NPC (Monster) via [[Legacy:ScriptedPawn|ScriptedPawn]].

For a tutorial on using UT2004 [[Legacy:Monster|Monster]]s, see [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]].

==Prerequisites==

You should already be familiar with [[Legacy:Bot Pathing|Bot Pathing]], [[Legacy:Testing Botplay|Testing Botplay]] and [[Legacy:Bot Mind|Bot Mind]].  Although we're not dealing with bots, creatures use the same bot path network and perform many similar actions in navigation.  You should also be familiar with the properties available on [[Legacy:ScriptedPawn|ScriptedPawn]].

==Overview==

&quot;Scripting&quot; [[Legacy:Pawn (UT)|Pawn (UT)]]s was a common practice for mappers in [[Legacy:UT|UT]].  Whether scripting advanced bot support or setting up monsters to patrol the level, the native AI of the UT Pawns was used in conjuction with [[Legacy:AIScript|AIScript]]s to create relatively realistic behavior.

This tutorial will show how to implement UT creatures, subclasses of ScriptedPawn.

==Tutorial==

This is a general tutorial and guide designed to demonstrate the implementation of several different creatures set to perform several different tasks.  After completing this tutorial, you should have a good idea how these AI functions work and be able to experiment combining them in different ways, with different settings, etc.

===Setting Up===

You should start with a bot pathed map that is working properly.  See also [[Legacy:Bot Pathing|Bot Pathing]].

====Classes Used====
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:HomeBase|HomeBase]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:CreatureFactory|CreatureFactory]]
* [[Legacy:SpawnPoint|SpawnPoint]]

===Retreating===

This is an automatic function rather than an explicit Order.  The creature can be made to retreat to a specific spot if hurt or otherwise frightened.
# Place a creature in the map and enter a unique Tag that will be used to associate this creature with a HomeBase.
# Place a HomeBase somewhere in the map.  This will the place the creature will retreat to.  Likely places to retreat to include out of the way places, spots &quot;deeper&quot; into the map's layout or objective sequence, or where other creatures can be found to help this creature in combat.
# Enter the Tag of the HomeBase to match the creature's Tag.
# Decide an appropriate Extend to set for the HomeBase.  This is the radius (in UU) that the creature's &quot;home&quot; extends from the HomeBase actor.  Note that the creature will only consider themselves at &quot;home&quot; if they are within the Extend and have a line of sight to the HomeBase.
# Decide an appropriate LookDir for the HomeBase.  This is the direction the creature will face once they are at &quot;home.&quot;

===Alarm===

Although this is not an explicit Order, Alarm functions can direct a creature to perform complex tasks when an enemy player is first seen.  In practical terms, the creature will attempt to perform these tasks at all cost.  After the task is complete, the creature will attack the enemy, if still available.  After combat, the creature will return to a RestFormation or resume it's normal Orders.
# Place a creature in the map and enter a unique AlarmTag that will be used to associate this creature with it's AlarmPoint.
# Place an AlarmPoint in a spot that will represent a destination for the task the creature is to perform once &quot;alarmed&quot;.  This could be a spot near other creatures to help in combat, it could be an actual alarm trigger (a switch the creature activates to set off an audible alarm sound), or it could be a better tactical position to attack from.  While the specific tasks the creature is to perform can vary, the main idea is that it will travel to this AlarmPoint once &quot;alarmed&quot;.
# You may add additional AlarmPoints as long as they all have a unique Tag.  Place as many additional AlarmPoints as you like.  These will make the creature travel from the first AlarmPoint to the next in a series until the last AlarmPoint is reached.
# Enter the Tag of the next AlarmPoint in the NextAlarm property of this AlarmPoint.  Move on to the next AlarmPoint in the series and continue to enter the NextAlarm property until all are properly associated.
# Decide if the creature should perform a specific animation sequence when this AlarmPoint is reached.  If so, enter the name of the animation sequence in the AlarmAnim property of the AlarmPoint.  A list of animation sequece names can be found in the [[Legacy:Mesh Browser|Mesh Browser]].  Note that animation sequences are specific to the creature used.
# Decide if the creature should play a specific sound while at this AlarmPoint.  Enter the sound in the AlarmSound property of the AlarmPoint.
# If no AlarmAnim is used, decide if the creature should pause and play default waiting animations when this AlarmPoint is reached.  Enter the time to pause (in seconds) in the PauseTime property on the AlarmPoint.
# The creature can be made to shoot at any actor when this AlarmPoint is reached.  Enter the Tag of the actor in the ShootTarget property on this AlarmPoint.

Note: The AlarmPoint actor has many other properties with which to adjust the creature's behavior.  In conjunction with other AlarmPoints, Triggers, etc., the creature can be made to perform complex behavior once a player enemy is detected.  See also [[Legacy:AlarmPoint|AlarmPoint]]. ''(See also Steve Polge's guide linked to at the bottom of this page.  Some properties on the AlarmPoint page here on the wiki are suspect.)''

===Waiting===

This is the default Order.  The creature will wait near its location, sometimes randomly wandering, until a player enemy is seen to attack.  After combat, the creature will return to a waiting state.
# Place a creature in the map and enter &quot;Waiting&quot; in the Orders property, if it isn't already set.
# That's it.  You may want to rotate the creature to face a particular direction at match start, but after a short while, it will wander and change it's location and rotation on its own.

===Ambushing===

The creature will find a place to wait in ambush for a player to attack.  Once combat is over, the creature will find another spot to ambush from and again wait for a player to attack.
# Place a creature in the map and enter &quot;Ambushing&quot; in the Orders property.
# Enter a unique OrderTag that will be used to associate this creature with it's AmbushPoints.
# Place AmbushPoints in the map at places where the creature can reach, can watch out for players, and hopefully can attack from with some element of suprise.  A ledge, a side passage or a hole are likely places to Ambush from.  Place as many as you like.
# Enter the Tag of these AmbushPoints to match your creature's OrderTag.  This will associate the creature to these AmbushPoints.
# Decide whether to set bFixedStart to true on the creature or not.  If true, the creature will always start the match at the placed position and travel to a random AmbushPoint to ambush players.  If false, the creature will be teleported to a random AmbushPoint at match start.
# Decide whether to set bSniping to true on the various AmbushPoints.  If true, the creature will likely snipe from that position when it sees a player to attack.
# Adjust the SightRadius on the various AmbushPoints, if necessary.  This is the radius (in UU) that will be used by the creature when it is waiting to ambush at this point.

===Patroling===

The creature will move from spot to spot in a patrol route until a player enemy is seen to attack.  After combat, the creature will return to the patrol route and continue to patrol.
# Place a creature in your map and enter &quot;Patroling&quot; in the Orders property.
# Enter a unique OrderTag that will be used to match this creature with a starting PatrolPoint. ''(suggested name, &quot;Patrol1&quot;)''
# Place a series of PatrolPoints in the map to define the patroling route for this creature.  The creature will follow the normal path network to get from PatrolPoint to PatrolPoint, so you do not need to define each corner.  Instead, find places that might be good to have this creature pause while patroling.  A room, a lookout, a switchback or dead end are likely places to place PatrolPoints.  Place as many as you like.
# Enter the Tag of the first PatrolPoint to match the creature's OrderTag.  This will associate the creature with this patrol route and further associate this PatrolPoint as the creature's start.
# Enter the NextPatrol property of this PatrolPoint to match the Tag of the next PatrolPoint in the series along this patrol route.  Enter the Tag of the next PatrolPoint to match.
# Repeat 4-5 until the patrol route is defined.  Match the NextPatrol property of the last PatrolPoint with the Tag of the first PatrolPoint in the route to complete the loop.
# Decide whether to set bFixedStart to true on the creature.  If true, the creature will always start the match at the placed position and travel to the starting PatrolPoint.  If false, the creature will be teleported to the starting PatrolPoint at match start.
# Decide whether to set bDelayedPatrol to true on the creature.  If true, the creature will wait at the placed location until it is triggered before it will travel to the first PatrolPoint and begin the patrol.
# Decide whether the creature should perform a specific animation sequence while at this PatrolPoint.  The creature can be made to play an animation, pause using standard waiting animations or neither and simply move on to the next PatrolPoint.  If a specific animation sequence is desired, enter the name of the sequence in the PatrolAnim property of the PatrolPoint.  A list of animation sequences can be found in the [[Legacy:Mesh Browser|Mesh Browser]].  Note that animation sequences are specific to the creature used.
# If an animation sequence is used, the creature can be made to loop the animation sequence a number of times.  Enter the desired number of sequence loops in the NumAnims property of the PatrolPoint.
# Decide whether the creature should play a specific sound while performing an animation sequence at this PatrolPoint.  Enter the sound in the PatrolSound property of the PatrolPoint.
# If no PatrolAnim is defined but a pause is desired, enter the number of seconds to pause in the PauseTime properties of the PatrolPoint.

===Guarding===

The creature will guard an item.  It will stay at its placed location until an enemy player is seen, when it will challenge the player to combat.  After combat, the creature will return to the placed location and continue to guard the item.  If the item is touched, the creature will consider the &quot;toucher&quot; an enemy.
# Place a creature in the map and set its Order property to &quot;Guarding&quot;.  It's a good idea to place the creature near the item to be guarded, or at least within a line of sight to that item or the area surrounding the item.
# Enter a unique Tag on the item that will associate it with the creature guarding it.  Match the creature's OrderTag to the Tag of the item.

===PawnSpecific Orders===

Some individual creatures have unique Orders or functions.  See also the [[Legacy:ScriptedPawn|ScriptedPawn]] subclasses for the various creatures.

===CreatureFactory and SpawnPoints===

CreatureFactory is a subclass of [[Legacy:ThingFactory|ThingFactory]].  SpawnPoints are associated to factories to provide a suitable place to spawn an actor.  CreatureFactories are specifically designed to spawn creatures in-game and give appropriate settings to various properties.
# Place a CreatureFactory in the map.  Thing and CreatureFactories can either be triggered externally or activated via Touch, just like a Trigger.  For this tutorial, place the CreatureFactory in a spot where a player is likely to walk by.  We will set this CreatureFactory to spawn the creature when touched.
# Place a SpawnPoint somewhere in the map that will allow access to the bot path network and give enough space for the creature to be spawned.  Also rotate the SpawnPoint to a good orientation for the creature to be spawned.
# Enter a unique Tag on the SpawnPoint that will associate it with the CreatureFactory.  Match the CreatureFactory's Tag to the SpawnPoint Tag.
# Place as many additional SpawnPoints as you like, up to a total of 16.  Make sure their Tags all match the Tag of the CreatureFactory.  Spawned creatures will appear randomly at one of these SpawnPoints.
# Set the ThingFactory-&gt;Prototype property on the CreatureFactory to the desired creature to spawn.
# Set the ThingFactory-&gt;MaxItems property on the CreatureFactory to the maximum number of creatures this factory will allow in game at one time.
# Set the ThingFactory-&gt;Capacity property on the CreatureFactory to the maximum number of total creatures to spawn.  After this number is reached, the factory will shut down.  A value of -1 here indicates the factory should never shut down.
# Set the ThingFactory-&gt;Interval property to the (average) number of seconds to wait before this factory is ready to spawn the next creature.  Note that spawning several creature with an interval of zero will likely cause a &quot;hiccup&quot;, where the engine stalls momentarily while spawning.  Set the interval to something small instead, like 0.1
# Set the ThingFactory-&gt;bOnlyPlayerTouched property on the CreatureFactory to true.  For this tutorial, we want the player to trigger the factory when it touches it, but we don't want other creatures to trigger it.  If true, only player pawns are able to activate this factory.
# Decide if the ThingFactory-&gt;bCovert property on the CreatureFactory should be set to false.  It is set to true by default.  If true, the creature will only be spawned if a player is unable to see it spawned, otherwise the factory will wait.  If your SpawnPoint is in plain sight but you'd like creatures to spawn at it even if a player sees the creature appear from (seemingly) nowhere, this could be set to false.
# Decide if the ThingFactory-&gt;bStoppable property on the CreatureFactory should be set to true.  If true, the factory will spawn creatures if Touched (or triggered) and will stop spawning creatures when it is unTouched.
# Set the CreatureFactory-&gt;Orders, OrderTag and AlarmTag properties on the CreatureFactory to those desired property settings for the spawned creatures.
# If the game is set to CoOp mode, decide if extra creatures should be spawned from this factory.  Enter the number of extra creatures to spawn in the AddedCoopCapacity property on the CreatureFactory.

NOTE: Creatures spawned from a given SpawnPoint will have their Event set to match the Tag of the CreatureFactory (and the SpawnPoint).  That way, once the creature is killed, it will automatically trigger a new creature to be spawned.

==External Links==

===Steve Polge's Docs===
* [http://unreal.epicgames.com/AI.htm Unreal Creature Care and Feeding Guide] &amp;ndash; The definitive reference.

===Matthias Worch's Tutorials===

Matthias Worch, who worked on the Unreal 2 team, has written a couple of tutorials that are highly useful. He's even provided a small demo level.

'''Set up dialog and AI scripting for a level''' and '''Create a basic AI script''' are the articles of interest here.
* [http://www.langsuyar.com/articles/u2_tutorialsmain.html Worch's Unreal 2 Tutorials]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
*** [[Legacy:Bot Support (UT)|Bot Support (UT)]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
* [[Legacy:AIScript|AIScript]]
* [[Legacy:AI Scripting Reference|AI Scripting Reference]]
* [[Legacy:Ucs File|Ucs File]] (U2 only) ''?''

==Discussion==

'''SuperApe:''' This tutorial needs to be written.  The external links above might be used to help write an original tutorial.  This tutorial should at least cover Patroling and Ambushing.

'''SuperApe:''' I've been working with the original ScriptedPawn code from UT.  I believe I know how all this works, but I don't have UT.  If no one writes this soon, I will probably take a crack at it, based on what I'm seeing in the code.

'''SuperApe:''' Although I do not have UT, I am now familiar with the code that these AI systems ran on, having looked at the code for ScriptedPawn.  I am writing this tutorial with the stipulation that it may not be complete or completely accurrate.  However, it should be close at the very least.

'''SuperApe:''' Finished the tutorial.  Let me know if there are any problems.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1951</id>
      <timestamp>2006-04-01T00:08:06Z</timestamp>
      <contributor>
        <ip>192.251.69.74</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a tutorial that sets up a UT NPC (Monster) via [[Legacy:ScriptedPawn|ScriptedPawn]].

For a tutorial on using UT2004 [[Legacy:Monster|Monster]]s, see [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]].

==Prerequisites==

You should already be familiar with [[Legacy:Bot Pathing|Bot Pathing]], [[Legacy:Testing Botplay|Testing Botplay]] and [[Legacy:Bot Mind|Bot Mind]].  Although we're not dealing with bots, creatures use the same bot path network and perform many similar actions in navigation.  You should also be familiar with the properties available on [[Legacy:ScriptedPawn|ScriptedPawn]].

==Overview==

&quot;Scripting&quot; [[Legacy:Pawn (UT)|Pawn (UT)]]s was a common practice for mappers in [[Legacy:UT|UT]].  Whether scripting advanced bot support or setting up monsters to patrol the level, the native AI of the UT Pawns was used in conjuction with [[Legacy:AIScript|AIScript]]s to create relatively realistic behavior.

This tutorial will show how to implement UT creatures, subclasses of ScriptedPawn.

==Tutorial==

This is a general tutorial and guide designed to demonstrate the implementation of several different creatures set to perform several different tasks.  After completing this tutorial, you should have a good idea how these AI functions work and be able to experiment combining them in different ways, with different settings, etc.

===Setting Up===

You should start with a bot pathed map that is working properly.  See also [[Legacy:Bot Pathing|Bot Pathing]].

====Classes Used====
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:HomeBase|HomeBase]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:CreatureFactory|CreatureFactory]]
* [[Legacy:SpawnPoint|SpawnPoint]]

===Retreating===

This is an automatic function rather than an explicit Order.  The creature can be made to retreat to a specific spot if hurt or otherwise frightened.
# Place a creature in the map and enter a unique Tag that will be used to associate this creature with a HomeBase.
# Place a HomeBase somewhere in the map.  This will the place the creature will retreat to.  Likely places to retreat to include out of the way places, spots &quot;deeper&quot; into the map's layout or objective sequence, or where other creatures can be found to help this creature in combat.
# Enter the Tag of the HomeBase to match the creature's Tag.
# Decide an appropriate Extend to set for the HomeBase.  This is the radius (in UU) that the creature's &quot;home&quot; extends from the HomeBase actor.  Note that the creature will only consider themselves at &quot;home&quot; if they are within the Extend and have a line of sight to the HomeBase.
# Decide an appropriate LookDir for the HomeBase.  This is the direction the creature will face once they are at &quot;home.&quot;

===Alarm===

Although this is not an explicit Order, Alarm functions can direct a creature to perform complex tasks when an enemy player is first seen.  In practical terms, the creature will attempt to perform these tasks at all cost.  After the task is complete, the creature will attack the enemy, if still available.  After combat, the creature will return to a RestFormation or resume it's normal Orders.
# Place a creature in the map and enter a unique AlarmTag that will be used to associate this creature with it's AlarmPoint.
# Place an AlarmPoint in a spot that will represent a destination for the task the creature is to perform once &quot;alarmed&quot;.  This could be a spot near other creatures to help in combat, it could be an actual alarm trigger (a switch the creature activates to set off an audible alarm sound), or it could be a better tactical position to attack from.  While the specific tasks the creature is to perform can vary, the main idea is that it will travel to this AlarmPoint once &quot;alarmed&quot;.
# You may add additional AlarmPoints as long as they all have a unique Tag.  Place as many additional AlarmPoints as you like.  These will make the creature travel from the first AlarmPoint to the next in a series until the last AlarmPoint is reached.
# Enter the Tag of the next AlarmPoint in the NextAlarm property of this AlarmPoint.  Move on to the next AlarmPoint in the series and continue to enter the NextAlarm property until all are properly associated.
# Decide if the creature should perform a specific animation sequence when this AlarmPoint is reached.  If so, enter the name of the animation sequence in the AlarmAnim property of the AlarmPoint.  A list of animation sequece names can be found in the [[Legacy:Mesh Browser|Mesh Browser]].  Note that animation sequences are specific to the creature used.
# Decide if the creature should play a specific sound while at this AlarmPoint.  Enter the sound in the AlarmSound property of the AlarmPoint.
# If no AlarmAnim is used, decide if the creature should pause and play default waiting animations when this AlarmPoint is reached.  Enter the time to pause (in seconds) in the PauseTime property on the AlarmPoint.
# The creature can be made to shoot at any actor when this AlarmPoint is reached.  Enter the Tag of the actor in the ShootTarget property on this AlarmPoint.

Note: The AlarmPoint actor has many other properties with which to adjust the creature's behavior.  In conjunction with other AlarmPoints, Triggers, etc., the creature can be made to perform complex behavior once a player enemy is detected.  See also [[Legacy:AlarmPoint|AlarmPoint]]. ''(See also Steve Polge's guide linked to at the bottom of this page.  Some properties on the AlarmPoint page here on the wiki are suspect.)''

===Waiting===

This is the default Order.  The creature will wait near its location, sometimes randomly wandering, until a player enemy is seen to attack.  After combat, the creature will return to a waiting state.
# Place a creature in the map and enter &quot;Waiting&quot; in the Orders property, if it isn't already set.
# That's it.  You may want to rotate the creature to face a particular direction at match start, but after a short while, it will wander and change it's location and rotation on its own.

===Ambushing===

The creature will find a place to wait in ambush for a player to attack.  Once combat is over, the creature will find another spot to ambush from and again wait for a player to attack.
# Place a creature in the map and enter &quot;Ambushing&quot; in the Orders property.
# Enter a unique OrderTag that will be used to associate this creature with it's AmbushPoints.
# Place AmbushPoints in the map at places where the creature can reach, can watch out for players, and hopefully can attack from with some element of suprise.  A ledge, a side passage or a hole are likely places to Ambush from.  Place as many as you like.
# Enter the Tag of these AmbushPoints to match your creature's OrderTag.  This will associate the creature to these AmbushPoints.
# Decide whether to set bFixedStart to true on the creature or not.  If true, the creature will always start the match at the placed position and travel to a random AmbushPoint to ambush players.  If false, the creature will be teleported to a random AmbushPoint at match start.
# Decide whether to set bSniping to true on the various AmbushPoints.  If true, the creature will likely snipe from that position when it sees a player to attack.
# Adjust the SightRadius on the various AmbushPoints, if necessary.  This is the radius (in UU) that will be used by the creature when it is waiting to ambush at this point.

===Patroling===

The creature will move from spot to spot in a patrol route until a player enemy is seen to attack.  After combat, the creature will return to the patrol route and continue to patrol.
# Place a creature in your map and enter &quot;Patroling&quot; in the Orders property.
# Enter a unique OrderTag that will be used to match this creature with a starting PatrolPoint. ''(suggested name, &quot;Patrol1&quot;)''
# Place a series of PatrolPoints in the map to define the patroling route for this creature.  The creature will follow the normal path network to get from PatrolPoint to PatrolPoint, so you do not need to define each corner.  Instead, find places that might be good to have this creature pause while patroling.  A room, a lookout, a switchback or dead end are likely places to place PatrolPoints.  Place as many as you like.
# Enter the Tag of the first PatrolPoint to match the creature's OrderTag.  This will associate the creature with this patrol route and further associate this PatrolPoint as the creature's start.
# Enter the NextPatrol property of this PatrolPoint to match the Tag of the next PatrolPoint in the series along this patrol route.  Enter the Tag of the next PatrolPoint to match.
# Repeat 4-5 until the patrol route is defined.  Match the NextPatrol property of the last PatrolPoint with the Tag of the first PatrolPoint in the route to complete the loop.
# Decide whether to set bFixedStart to true on the creature.  If true, the creature will always start the match at the placed position and travel to the starting PatrolPoint.  If false, the creature will be teleported to the starting PatrolPoint at match start.
# Decide whether to set bDelayedPatrol to true on the creature.  If true, the creature will wait at the placed location until it is triggered before it will travel to the first PatrolPoint and begin the patrol.
# Decide whether the creature should perform a specific animation sequence while at this PatrolPoint.  The creature can be made to play an animation, pause using standard waiting animations or neither and simply move on to the next PatrolPoint.  If a specific animation sequence is desired, enter the name of the sequence in the PatrolAnim property of the PatrolPoint.  A list of animation sequences can be found in the [[Legacy:Mesh Browser|Mesh Browser]].  Note that animation sequences are specific to the creature used.
# If an animation sequence is used, the creature can be made to loop the animation sequence a number of times.  Enter the desired number of sequence loops in the NumAnims property of the PatrolPoint.
# Decide whether the creature should play a specific sound while performing an animation sequence at this PatrolPoint.  Enter the sound in the PatrolSound property of the PatrolPoint.
# If no PatrolAnim is defined but a pause is desired, enter the number of seconds to pause in the PauseTime properties of the PatrolPoint.

===Guarding===

The creature will guard an item.  It will stay at its placed location until an enemy player is seen, when it will challenge the player to combat.  After combat, the creature will return to the placed location and continue to guard the item.  If the item is touched, the creature will consider the &quot;toucher&quot; an enemy.
# Place a creature in the map and set its Order property to &quot;Guarding&quot;.  It's a good idea to place the creature near the item to be guarded, or at least within a line of sight to that item or the area surrounding the item.
# Enter a unique Tag on the item that will associate it with the creature guarding it.  Match the creature's OrderTag to the Tag of the item.

===PawnSpecific Orders===

Some individual creatures have unique Orders or functions.  See also the [[Legacy:ScriptedPawn|ScriptedPawn]] subclasses for the various creatures.

===CreatureFactory and SpawnPoints===

CreatureFactory is a subclass of [[Legacy:ThingFactory|ThingFactory]].  SpawnPoints are associated to factories to provide a suitable place to spawn an actor.  CreatureFactories are specifically designed to spawn creatures in-game and give appropriate settings to various properties.
# Place a CreatureFactory in the map.  Thing and CreatureFactories can either be triggered externally or activated via Touch, just like a Trigger.  For this tutorial, place the CreatureFactory in a spot where a player is likely to walk by.  We will set this CreatureFactory to spawn the creature when touched.
# Place a SpawnPoint somewhere in the map that will allow access to the bot path network and give enough space for the creature to be spawned.  Also rotate the SpawnPoint to a good orientation for the creature to be spawned.
# Enter a unique Tag on the SpawnPoint that will associate it with the CreatureFactory.  Match the CreatureFactory's Tag to the SpawnPoint Tag.
# Place as many additional SpawnPoints as you like, up to a total of 16.  Make sure their Tags all match the Tag of the CreatureFactory.  Spawned creatures will appear randomly at one of these SpawnPoints.
# Set the ThingFactory-&gt;Prototype property on the CreatureFactory to the desired creature to spawn.
# Set the ThingFactory-&gt;MaxItems property on the CreatureFactory to the maximum number of creatures this factory will allow in game at one time.
# Set the ThingFactory-&gt;Capacity property on the CreatureFactory to the maximum number of total creatures to spawn.  After this number is reached, the factory will shut down.  A value of -1 here indicates the factory should never shut down.
# Set the ThingFactory-&gt;Interval property to the (average) number of seconds to wait before this factory is ready to spawn the next creature.
# Set the ThingFactory-&gt;bOnlyPlayerTouched property on the CreatureFactory to true.  For this tutorial, we want the player to trigger the factory when it touches it, but we don't want other creatures to trigger it.  If true, only player pawns are able to activate this factory.
# Decide if the ThingFactory-&gt;bCovert property on the CreatureFactory should be set to true.  If true, the creature will only be spawned if a player is unable to see it spawned.  If your SpawnPoint is in plain sight, this should be set to false.
# Decide if the ThingFactory-&gt;bStoppable property on the CreatureFactory should be set to true.  If true, the factory will stop spawning creatures when it is unTouched.
# Set the Orders, OrderTag and AlarmTag properties on the CreatureFactory to those desired property settings for the spawned creatures.
# If the game is set to coop mode, decide if extra creatures should be spawned from this factory.  Enter the number of extra creatures to spawn in the AddedCoopCapacity property on the CreatureFactory.

NOTE: Creatures spawned from a given SpawnPoint will have their Event set to match the Tag of the CreatureFactory (and the SpawnPoint).  That way, once the creature is killed, it will automatically trigger a new creature to be spawned.

==External Links==

===Steve Polge's Docs===
* [http://unreal.epicgames.com/AI.htm Unreal Creature Care and Feeding Guide] &amp;ndash; The definitive reference.

===Matthias Worch's Tutorials===

Matthias Worch, who worked on the Unreal 2 team, has written a couple of tutorials that are highly useful. He's even provided a small demo level.

'''Set up dialog and AI scripting for a level''' and '''Create a basic AI script''' are the articles of interest here.
* [http://www.langsuyar.com/articles/u2_tutorialsmain.html Worch's Unreal 2 Tutorials]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
*** [[Legacy:Bot Support (UT)|Bot Support (UT)]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
* [[Legacy:AIScript|AIScript]]
* [[Legacy:AI Scripting Reference|AI Scripting Reference]]
* [[Legacy:Ucs File|Ucs File]] (U2 only) ''?''

==Discussion==

'''SuperApe:''' This tutorial needs to be written.  The external links above might be used to help write an original tutorial.  This tutorial should at least cover Patroling and Ambushing.

'''SuperApe:''' I've been working with the original ScriptedPawn code from UT.  I believe I know how all this works, but I don't have UT.  If no one writes this soon, I will probably take a crack at it, based on what I'm seeing in the code.

'''SuperApe:''' Although I do not have UT, I am now familiar with the code that these AI systems ran on, having looked at the code for ScriptedPawn.  I am writing this tutorial with the stipulation that it may not be complete or completely accurrate.  However, it should be close at the very least.

'''SuperApe:''' Finished the tutorial.  Let me know if there are any problems.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Basic Weapon Class</title>
    <id>667</id>
    <revision>
      <id>1959</id>
      <timestamp>2008-03-25T05:33:18Z</timestamp>
      <contributor>
        <ip>Tkodark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''PLEASE NOTE:''' This page is finished, at least, [[Legacy:Computergod666|computergod666]] thinks so. You are free to add content at any time if you find something's missing.

==Creating Unreal Weapons==

As far as I know, everything is the same for Weapons as TournamentWeapons (except for a few things like replication.)

==Creating a new TournamentWeapon==

===The firing routines===

Every weapon needs at least two firing modes. These are covered by two functions in the TournamentWeapon class: &lt;pre&gt;function Fire(float Value)&lt;/pre&gt;and&lt;pre&gt;function AltFire(float Value)&lt;/pre&gt;. These functions are set up so that you can simply specify whether the weapon is an instant hit weapon or if it fires projectiles, and what the class for Projectile and Alt Projectile are. These three values are specified by the variables &quot;bInstantHit&quot;, &quot;ProjectileClass&quot;, and &quot;AltProjectileClass&quot;. You can choose to use these functions and finish your weapon as is, but that's never as interesting as writing these routines yourself.

Fire looks something like this in TournamentWeapon:

&lt;uscript&gt;
function Fire( float Value )
{
 if ( (AmmoType == None) &amp;&amp; (AmmoName != None) )
 {
  // ammocheck
  GiveAmmo(Pawn(Owner));
 }
 if (AmmoType.UseAmmo(1))
 {
  GotoState('NormalFire');
  bPointing=True;
  bCanClientFire = true;
  ClientFire(Value);
  if (bInstantHit == true)
   TraceFire(0.0);
  else
   ProjectileFire(ProjectileClass, ProjSpeed, false);
 }
}&lt;/uscript&gt;

The ammocheck code is not really important right now. However, you can use it for a weapon that is not supposed to run out of ammo, to give the player more ammo.

The line that says &quot;(if AmmoType.UseAmmo(1))&quot; attempts to use 1 unit of ammunition. If you are out of ammo, this fails and the weapon doesn't fire.

The line that begins with GoToState('NormalFire'); tells the weapon to activate that state. In TournamentWeapon, this state temporarily disables forcing bots or players to fire, and allows the user to add handling for things that need to happen before, during, or after firing. See [[Legacy:Chainguns And Shotguns|Chainguns and Shotguns]] for more on using firing states.

The next three lines starting after GoToState('NormalFire') are for client/server interaction. We don't need to worry about them right now.

The TournamentWeapon class allows you to simply pick a projectile class to fire. If your weapon is a projectile weapon, make sure you set bInstantHit to False, and specify the ProjectileClass. Use of TraceFire will be covered in [[Legacy:Hitscan Weapons|Hitscan weapons]]. Alternatively, you can simply delete the code for the TraceFire() call.

Please note that setting the ProjSpeed value for ProjectileFire will not change the speed of the projectile. This parameter is just for bots to adjust their aim to compensate for moving targets.

The same things are true for AltFire.

===Ammo===

So we made the weapon use 1 unit of ammo per shot. That ammo has to come from somewhere! The AmmoName property is a class name that specifies what ammo class to use. The maximum amount of ammo you can carry is determined by the ammo class itself, but you can specify how much ammo you want to be in the gun when you pick it up. That is set by the PickupAmmoCount property. This can be any positive integer value, but if you try to pick up more than you can carry, your ammo just tops off.

So now, you can make a functioning weapon. Create a subclass of TournamentWeapon. All you need to put in the file are these lines:

&lt;uscript&gt;class MyWeapon extends TournamentWeapon;

defaultproperties
{
 ProjectileClass=Class'Botpack.ShockProj'
 AltProjectileClass=Class'Botpack.WarShell'
 bInstantHit=false
 AmmoName=Class'Botpack.miniammo'
 PickupAmmoCount=150
}
&lt;/uscript&gt;

Hehe. That is an extremely overpowered weapon with way too much ammunition. Please don't do that: overpowered weapons get boring way too quickly. So pick some slightly more sensible values, then compile.

So now you should have a functioning projectile weapon. However, if you put it in a map, you will notice that you can't see it. Even if you do manage to pick it up, you will not be able to see the first-person model. It will also be completely silent when it fires. Now, we need to give it a mesh, then some routines to animate it and play firing sounds.

===Adding meshes===

There are three meshes for every weapon in Unreal Tournament:
# The first-person mesh. This mesh is what you see when you are using the weapon. It is usually the most detailed version, and should include an animation for everything it does.
# The third-person mesh. This is what everyone else sees when you are using the weapon. This version is usually not as detailed as the first-person mesh, and it includes only the animations that you would be able to see well from a distance, like firing.
# The pickup mesh. This is what you see on the ground. It has no animations because at the most, it is meant to revolve slowly.

These three meshes are specified by three default variables: PlayerViewMesh, PickupMesh, and ThirdPersonMesh. You would specify them like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 //...
}&lt;/uscript&gt;

Next, you need to specify the distance the first-person mesh is from the center of the screen. This is specified by a vector called PlayerViewOffset. For the vector's components, positive X is vertical, toward the top of the screen (!), positive Y is horizontal toward the right of the screen, and positive Z is toward yourself. You may want to check the mesh itself, and this part usually requires some trial-and-error unless you made the mesh yourself. In the example above, I was trying to give the Quad Shot some code (It wasn't used in Unreal), but there weren't any values for PlayerViewOffset, so I had to figure it out myself. Now you can add this line to defaultproperties:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
}&lt;/uscript&gt;

One other thing you may want to change is a vector called FireOffset. This vector specifies where the projectile (or trace) should show up relative to the center of your screen, in first-person view. You may have to experiment with this, because it will have to match up reasonably well with the muzzle of your weapon.

Now, you have some meshes for your weapon! Let's make them do something...

===Animations===

Animation allows you to see the weapon in action. Your weapon will need at least two functions to handle animation: PlayFiring() and PlayAltFiring(). For most weapons, they contain code that plays an animation and a sound. Here is a very generic set of routines:

&lt;uscript&gt;function PlayFiring()
{
 PlayAnim('Fire', 1.0, 0.05);
 PlayOwnedSound(FireSound, SLOT_Misc, 1.0);
}

function PlayAltFiring()
{
 PlayAnim('AltFire', 1.0, 0.05);
 PlayOwnedSound(AltFireSound, SLOT_Misc, 1.0);
}&lt;/uscript&gt;

PlayAnim plays an animation from the mesh you have selected. The first parameter is the name of the animation. You can figure this out in the UnrealEd mesh browser if you are using an existing mesh, or you should know it if you created the mesh yourself. The second parameter is the relative playback speed of the animation. A value of 1.0 plays it at 'normal speed', 2.0 plays it twice as fast, 0.5 plays it half as fast, etc. The third parameter is the amount of time to tween from the previous animation to this one.

See [[Legacy:Actor/Methods|Actor/Methods]] for more information on PlayAnim and PlayOwnedSound.

'''A note about animation'''

As I said earlier, there is a first-person and a third-person mesh. Playing an animation will animate both meshes: you don't have to make one call for each mesh. All you will need is these routines. Of course, you can also write your own. The Flak Cannon has a PlayReloading() function which it uses after it fires. This type of animation will be discussed in [[Legacy:Chainguns And Shotguns|Chainguns and shotguns]].

FireSound and AltFireSound are defined for every TournamentWeapon. You can set these to a sound resource in the defaultproperties section, like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
 FireSound=Sound'Botpack.AMSD.ImpactAltFireRelease'
 AltFireSound=Sound'MyPackage.Group1.altfire1'
 //...
}&lt;/uscript&gt;

You can also define your own sounds by adding a line at the top of the file like this:
 var Sound OverheatSound;

Now, you should have a functioning, firing weapon that you can see and pick up ammo for. This is only a projectile weapon. To make an instant-hit weapon, read [[Legacy:Hitscan Weapons|Hitscan weapons]].

'''TkoDark''' I need help fixing this i put this weapon in my map and now i cant fix it or get rid of it. can you  e mail or im me computergod666? When i play the map i can pick the weapon up and change to it but it doesnt shoot or do anything, i messed up somewhere. I don't know how to fix it. In the editor (ued2.0) it is in the search for actors and i can go to it, but i cant see it so i cant click on it and delete it. thanks TKO 

Ps where do i get your grenade launcher and vehicles? very cool! Email-tkodark@yahoo.com</text>
    </revision>
    <revision>
      <id>1960</id>
      <timestamp>2008-02-06T21:42:52Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''PLEASE NOTE:''' This page is finished, at least, [[Legacy:Computergod666|computergod666]] thinks so. You are free to add content at any time if you find something's missing.

==Creating Unreal Weapons==

As far as I know, everything is the same for Weapons as TournamentWeapons (except for a few things like replication.)

==Creating a new TournamentWeapon==

===The firing routines===

Every weapon needs at least two firing modes. These are covered by two functions in the TournamentWeapon class: &lt;pre&gt;function Fire(float Value)&lt;/pre&gt;and&lt;pre&gt;function AltFire(float Value)&lt;/pre&gt;. These functions are set up so that you can simply specify whether the weapon is an instant hit weapon or if it fires projectiles, and what the class for Projectile and Alt Projectile are. These three values are specified by the variables &quot;bInstantHit&quot;, &quot;ProjectileClass&quot;, and &quot;AltProjectileClass&quot;. You can choose to use these functions and finish your weapon as is, but that's never as interesting as writing these routines yourself.

Fire looks something like this in TournamentWeapon:

&lt;uscript&gt;
function Fire( float Value )
{
 if ( (AmmoType == None) &amp;&amp; (AmmoName != None) )
 {
  // ammocheck
  GiveAmmo(Pawn(Owner));
 }
 if (AmmoType.UseAmmo(1))
 {
  GotoState('NormalFire');
  bPointing=True;
  bCanClientFire = true;
  ClientFire(Value);
  if (bInstantHit == true)
   TraceFire(0.0);
  else
   ProjectileFire(ProjectileClass, ProjSpeed, false);
 }
}&lt;/uscript&gt;

The ammocheck code is not really important right now. However, you can use it for a weapon that is not supposed to run out of ammo, to give the player more ammo.

The line that says &quot;(if AmmoType.UseAmmo(1))&quot; attempts to use 1 unit of ammunition. If you are out of ammo, this fails and the weapon doesn't fire.

The line that begins with GoToState('NormalFire'); tells the weapon to activate that state. In TournamentWeapon, this state temporarily disables forcing bots or players to fire, and allows the user to add handling for things that need to happen before, during, or after firing. See [[Legacy:Chainguns And Shotguns|Chainguns and Shotguns]] for more on using firing states.

The next three lines starting after GoToState('NormalFire') are for client/server interaction. We don't need to worry about them right now.

The TournamentWeapon class allows you to simply pick a projectile class to fire. If your weapon is a projectile weapon, make sure you set bInstantHit to False, and specify the ProjectileClass. Use of TraceFire will be covered in [[Legacy:Hitscan Weapons|Hitscan weapons]]. Alternatively, you can simply delete the code for the TraceFire() call.

Please note that setting the ProjSpeed value for ProjectileFire will not change the speed of the projectile. This parameter is just for bots to adjust their aim to compensate for moving targets.

The same things are true for AltFire.

===Ammo===

So we made the weapon use 1 unit of ammo per shot. That ammo has to come from somewhere! The AmmoName property is a class name that specifies what ammo class to use. The maximum amount of ammo you can carry is determined by the ammo class itself, but you can specify how much ammo you want to be in the gun when you pick it up. That is set by the PickupAmmoCount property. This can be any positive integer value, but if you try to pick up more than you can carry, your ammo just tops off.

So now, you can make a functioning weapon. Create a subclass of TournamentWeapon. All you need to put in the file are these lines:

&lt;uscript&gt;class MyWeapon extends TournamentWeapon;

defaultproperties
{
 ProjectileClass=Class'Botpack.ShockProj'
 AltProjectileClass=Class'Botpack.WarShell'
 bInstantHit=false
 AmmoName=Class'Botpack.miniammo'
 PickupAmmoCount=150
}
&lt;/uscript&gt;

Hehe. That is an extremely overpowered weapon with way too much ammunition. Please don't do that: overpowered weapons get boring way too quickly. So pick some slightly more sensible values, then compile.

So now you should have a functioning projectile weapon. However, if you put it in a map, you will notice that you can't see it. Even if you do manage to pick it up, you will not be able to see the first-person model. It will also be completely silent when it fires. Now, we need to give it a mesh, then some routines to animate it and play firing sounds.

===Adding meshes===

There are three meshes for every weapon in Unreal Tournament:
# The first-person mesh. This mesh is what you see when you are using the weapon. It is usually the most detailed version, and should include an animation for everything it does.
# The third-person mesh. This is what everyone else sees when you are using the weapon. This version is usually not as detailed as the first-person mesh, and it includes only the animations that you would be able to see well from a distance, like firing.
# The pickup mesh. This is what you see on the ground. It has no animations because at the most, it is meant to revolve slowly.

These three meshes are specified by three default variables: PlayerViewMesh, PickupMesh, and ThirdPersonMesh. You would specify them like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 //...
}&lt;/uscript&gt;

Next, you need to specify the distance the first-person mesh is from the center of the screen. This is specified by a vector called PlayerViewOffset. For the vector's components, positive X is vertical, toward the top of the screen (!), positive Y is horizontal toward the right of the screen, and positive Z is toward yourself. You may want to check the mesh itself, and this part usually requires some trial-and-error unless you made the mesh yourself. In the example above, I was trying to give the Quad Shot some code (It wasn't used in Unreal), but there weren't any values for PlayerViewOffset, so I had to figure it out myself. Now you can add this line to defaultproperties:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
}&lt;/uscript&gt;

One other thing you may want to change is a vector called FireOffset. This vector specifies where the projectile (or trace) should show up relative to the center of your screen, in first-person view. You may have to experiment with this, because it will have to match up reasonably well with the muzzle of your weapon.

Now, you have some meshes for your weapon! Let's make them do something...

===Animations===

Animation allows you to see the weapon in action. Your weapon will need at least two functions to handle animation: PlayFiring() and PlayAltFiring(). For most weapons, they contain code that plays an animation and a sound. Here is a very generic set of routines:

&lt;uscript&gt;function PlayFiring()
{
 PlayAnim('Fire', 1.0, 0.05);
 PlayOwnedSound(FireSound, SLOT_Misc, 1.0);
}

function PlayAltFiring()
{
 PlayAnim('AltFire', 1.0, 0.05);
 PlayOwnedSound(AltFireSound, SLOT_Misc, 1.0);
}&lt;/uscript&gt;

PlayAnim plays an animation from the mesh you have selected. The first parameter is the name of the animation. You can figure this out in the UnrealEd mesh browser if you are using an existing mesh, or you should know it if you created the mesh yourself. The second parameter is the relative playback speed of the animation. A value of 1.0 plays it at 'normal speed', 2.0 plays it twice as fast, 0.5 plays it half as fast, etc. The third parameter is the amount of time to tween from the previous animation to this one.

See [[Legacy:Actor/Methods|Actor/Methods]] for more information on PlayAnim and PlayOwnedSound.

'''A note about animation'''

As I said earlier, there is a first-person and a third-person mesh. Playing an animation will animate both meshes: you don't have to make one call for each mesh. All you will need is these routines. Of course, you can also write your own. The Flak Cannon has a PlayReloading() function which it uses after it fires. This type of animation will be discussed in [[Legacy:Chainguns And Shotguns|Chainguns and shotguns]].

FireSound and AltFireSound are defined for every TournamentWeapon. You can set these to a sound resource in the defaultproperties section, like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
 FireSound=Sound'Botpack.AMSD.ImpactAltFireRelease'
 AltFireSound=Sound'MyPackage.Group1.altfire1'
 //...
}&lt;/uscript&gt;

You can also define your own sounds by adding a line at the top of the file like this:
 var Sound OverheatSound;

Now, you should have a functioning, firing weapon that you can see and pick up ammo for. This is only a projectile weapon. To make an instant-hit weapon, read [[Legacy:Hitscan Weapons|Hitscan weapons]].</text>
    </revision>
    <revision>
      <id>1961</id>
      <timestamp>2008-03-14T19:19:43Z</timestamp>
      <contributor>
        <ip>Tkodark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''PLEASE NOTE:''' This page is finished, at least, [[Legacy:Computergod666|computergod666]] thinks so. You are free to add content at any time if you find something's missing.

==Creating Unreal Weapons==

As far as I know, everything is the same for Weapons as TournamentWeapons (except for a few things like replication.)

==Creating a new TournamentWeapon==

===The firing routines===

Every weapon needs at least two firing modes. These are covered by two functions in the TournamentWeapon class: &lt;pre&gt;function Fire(float Value)&lt;/pre&gt;and&lt;pre&gt;function AltFire(float Value)&lt;/pre&gt;. These functions are set up so that you can simply specify whether the weapon is an instant hit weapon or if it fires projectiles, and what the class for Projectile and Alt Projectile are. These three values are specified by the variables &quot;bInstantHit&quot;, &quot;ProjectileClass&quot;, and &quot;AltProjectileClass&quot;. You can choose to use these functions and finish your weapon as is, but that's never as interesting as writing these routines yourself.

Fire looks something like this in TournamentWeapon:

&lt;uscript&gt;
function Fire( float Value )
{
 if ( (AmmoType == None) &amp;&amp; (AmmoName != None) )
 {
  // ammocheck
  GiveAmmo(Pawn(Owner));
 }
 if (AmmoType.UseAmmo(1))
 {
  GotoState('NormalFire');
  bPointing=True;
  bCanClientFire = true;
  ClientFire(Value);
  if (bInstantHit == true)
   TraceFire(0.0);
  else
   ProjectileFire(ProjectileClass, ProjSpeed, false);
 }
}&lt;/uscript&gt;

The ammocheck code is not really important right now. However, you can use it for a weapon that is not supposed to run out of ammo, to give the player more ammo.

The line that says &quot;(if AmmoType.UseAmmo(1))&quot; attempts to use 1 unit of ammunition. If you are out of ammo, this fails and the weapon doesn't fire.

The line that begins with GoToState('NormalFire'); tells the weapon to activate that state. In TournamentWeapon, this state temporarily disables forcing bots or players to fire, and allows the user to add handling for things that need to happen before, during, or after firing. See [[Legacy:Chainguns And Shotguns|Chainguns and Shotguns]] for more on using firing states.

The next three lines starting after GoToState('NormalFire') are for client/server interaction. We don't need to worry about them right now.

The TournamentWeapon class allows you to simply pick a projectile class to fire. If your weapon is a projectile weapon, make sure you set bInstantHit to False, and specify the ProjectileClass. Use of TraceFire will be covered in [[Legacy:Hitscan Weapons|Hitscan weapons]]. Alternatively, you can simply delete the code for the TraceFire() call.

Please note that setting the ProjSpeed value for ProjectileFire will not change the speed of the projectile. This parameter is just for bots to adjust their aim to compensate for moving targets.

The same things are true for AltFire.

===Ammo===

So we made the weapon use 1 unit of ammo per shot. That ammo has to come from somewhere! The AmmoName property is a class name that specifies what ammo class to use. The maximum amount of ammo you can carry is determined by the ammo class itself, but you can specify how much ammo you want to be in the gun when you pick it up. That is set by the PickupAmmoCount property. This can be any positive integer value, but if you try to pick up more than you can carry, your ammo just tops off.

So now, you can make a functioning weapon. Create a subclass of TournamentWeapon. All you need to put in the file are these lines:

&lt;uscript&gt;class MyWeapon extends TournamentWeapon;

defaultproperties
{
 ProjectileClass=Class'Botpack.ShockProj'
 AltProjectileClass=Class'Botpack.WarShell'
 bInstantHit=false
 AmmoName=Class'Botpack.miniammo'
 PickupAmmoCount=150
}
&lt;/uscript&gt;

Hehe. That is an extremely overpowered weapon with way too much ammunition. Please don't do that: overpowered weapons get boring way too quickly. So pick some slightly more sensible values, then compile.

So now you should have a functioning projectile weapon. However, if you put it in a map, you will notice that you can't see it. Even if you do manage to pick it up, you will not be able to see the first-person model. It will also be completely silent when it fires. Now, we need to give it a mesh, then some routines to animate it and play firing sounds.

===Adding meshes===

There are three meshes for every weapon in Unreal Tournament:
# The first-person mesh. This mesh is what you see when you are using the weapon. It is usually the most detailed version, and should include an animation for everything it does.
# The third-person mesh. This is what everyone else sees when you are using the weapon. This version is usually not as detailed as the first-person mesh, and it includes only the animations that you would be able to see well from a distance, like firing.
# The pickup mesh. This is what you see on the ground. It has no animations because at the most, it is meant to revolve slowly.

These three meshes are specified by three default variables: PlayerViewMesh, PickupMesh, and ThirdPersonMesh. You would specify them like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 //...
}&lt;/uscript&gt;

Next, you need to specify the distance the first-person mesh is from the center of the screen. This is specified by a vector called PlayerViewOffset. For the vector's components, positive X is vertical, toward the top of the screen (!), positive Y is horizontal toward the right of the screen, and positive Z is toward yourself. You may want to check the mesh itself, and this part usually requires some trial-and-error unless you made the mesh yourself. In the example above, I was trying to give the Quad Shot some code (It wasn't used in Unreal), but there weren't any values for PlayerViewOffset, so I had to figure it out myself. Now you can add this line to defaultproperties:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
}&lt;/uscript&gt;

One other thing you may want to change is a vector called FireOffset. This vector specifies where the projectile (or trace) should show up relative to the center of your screen, in first-person view. You may have to experiment with this, because it will have to match up reasonably well with the muzzle of your weapon.

Now, you have some meshes for your weapon! Let's make them do something...

===Animations===

Animation allows you to see the weapon in action. Your weapon will need at least two functions to handle animation: PlayFiring() and PlayAltFiring(). For most weapons, they contain code that plays an animation and a sound. Here is a very generic set of routines:

&lt;uscript&gt;function PlayFiring()
{
 PlayAnim('Fire', 1.0, 0.05);
 PlayOwnedSound(FireSound, SLOT_Misc, 1.0);
}

function PlayAltFiring()
{
 PlayAnim('AltFire', 1.0, 0.05);
 PlayOwnedSound(AltFireSound, SLOT_Misc, 1.0);
}&lt;/uscript&gt;

PlayAnim plays an animation from the mesh you have selected. The first parameter is the name of the animation. You can figure this out in the UnrealEd mesh browser if you are using an existing mesh, or you should know it if you created the mesh yourself. The second parameter is the relative playback speed of the animation. A value of 1.0 plays it at 'normal speed', 2.0 plays it twice as fast, 0.5 plays it half as fast, etc. The third parameter is the amount of time to tween from the previous animation to this one.

See [[Legacy:Actor/Methods|Actor/Methods]] for more information on PlayAnim and PlayOwnedSound.

'''A note about animation'''

As I said earlier, there is a first-person and a third-person mesh. Playing an animation will animate both meshes: you don't have to make one call for each mesh. All you will need is these routines. Of course, you can also write your own. The Flak Cannon has a PlayReloading() function which it uses after it fires. This type of animation will be discussed in [[Legacy:Chainguns And Shotguns|Chainguns and shotguns]].

FireSound and AltFireSound are defined for every TournamentWeapon. You can set these to a sound resource in the defaultproperties section, like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
 FireSound=Sound'Botpack.AMSD.ImpactAltFireRelease'
 AltFireSound=Sound'MyPackage.Group1.altfire1'
 //...
}&lt;/uscript&gt;

You can also define your own sounds by adding a line at the top of the file like this:
 var Sound OverheatSound;

Now, you should have a functioning, firing weapon that you can see and pick up ammo for. This is only a projectile weapon. To make an instant-hit weapon, read [[Legacy:Hitscan Weapons|Hitscan weapons]].

'''TkoDark''' I need help fixing this i put this weapon in my map and now i cant fix it or get rid of it. can you  e mail or im me computergod666? When i play the map i can pick the weapon up and change to it but it doesnt shoot or do anything, i messed up somewhere. I don't know how to fix it. In the editor (ued2.0) it is in the search for actors and i can go to it, but i cant see it so i cant click on it and delete it. thanks TKO Ps where do i get your grenade launcher and vehicles? very cool!</text>
    </revision>
    <revision>
      <id>1962</id>
      <timestamp>2008-03-14T19:29:34Z</timestamp>
      <contributor>
        <ip>Tkodark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''PLEASE NOTE:''' This page is finished, at least, [[Legacy:Computergod666|computergod666]] thinks so. You are free to add content at any time if you find something's missing.

==Creating Unreal Weapons==

As far as I know, everything is the same for Weapons as TournamentWeapons (except for a few things like replication.)

==Creating a new TournamentWeapon==

===The firing routines===

Every weapon needs at least two firing modes. These are covered by two functions in the TournamentWeapon class: &lt;pre&gt;function Fire(float Value)&lt;/pre&gt;and&lt;pre&gt;function AltFire(float Value)&lt;/pre&gt;. These functions are set up so that you can simply specify whether the weapon is an instant hit weapon or if it fires projectiles, and what the class for Projectile and Alt Projectile are. These three values are specified by the variables &quot;bInstantHit&quot;, &quot;ProjectileClass&quot;, and &quot;AltProjectileClass&quot;. You can choose to use these functions and finish your weapon as is, but that's never as interesting as writing these routines yourself.

Fire looks something like this in TournamentWeapon:

&lt;uscript&gt;
function Fire( float Value )
{
 if ( (AmmoType == None) &amp;&amp; (AmmoName != None) )
 {
  // ammocheck
  GiveAmmo(Pawn(Owner));
 }
 if (AmmoType.UseAmmo(1))
 {
  GotoState('NormalFire');
  bPointing=True;
  bCanClientFire = true;
  ClientFire(Value);
  if (bInstantHit == true)
   TraceFire(0.0);
  else
   ProjectileFire(ProjectileClass, ProjSpeed, false);
 }
}&lt;/uscript&gt;

The ammocheck code is not really important right now. However, you can use it for a weapon that is not supposed to run out of ammo, to give the player more ammo.

The line that says &quot;(if AmmoType.UseAmmo(1))&quot; attempts to use 1 unit of ammunition. If you are out of ammo, this fails and the weapon doesn't fire.

The line that begins with GoToState('NormalFire'); tells the weapon to activate that state. In TournamentWeapon, this state temporarily disables forcing bots or players to fire, and allows the user to add handling for things that need to happen before, during, or after firing. See [[Legacy:Chainguns And Shotguns|Chainguns and Shotguns]] for more on using firing states.

The next three lines starting after GoToState('NormalFire') are for client/server interaction. We don't need to worry about them right now.

The TournamentWeapon class allows you to simply pick a projectile class to fire. If your weapon is a projectile weapon, make sure you set bInstantHit to False, and specify the ProjectileClass. Use of TraceFire will be covered in [[Legacy:Hitscan Weapons|Hitscan weapons]]. Alternatively, you can simply delete the code for the TraceFire() call.

Please note that setting the ProjSpeed value for ProjectileFire will not change the speed of the projectile. This parameter is just for bots to adjust their aim to compensate for moving targets.

The same things are true for AltFire.

===Ammo===

So we made the weapon use 1 unit of ammo per shot. That ammo has to come from somewhere! The AmmoName property is a class name that specifies what ammo class to use. The maximum amount of ammo you can carry is determined by the ammo class itself, but you can specify how much ammo you want to be in the gun when you pick it up. That is set by the PickupAmmoCount property. This can be any positive integer value, but if you try to pick up more than you can carry, your ammo just tops off.

So now, you can make a functioning weapon. Create a subclass of TournamentWeapon. All you need to put in the file are these lines:

&lt;uscript&gt;class MyWeapon extends TournamentWeapon;

defaultproperties
{
 ProjectileClass=Class'Botpack.ShockProj'
 AltProjectileClass=Class'Botpack.WarShell'
 bInstantHit=false
 AmmoName=Class'Botpack.miniammo'
 PickupAmmoCount=150
}
&lt;/uscript&gt;

Hehe. That is an extremely overpowered weapon with way too much ammunition. Please don't do that: overpowered weapons get boring way too quickly. So pick some slightly more sensible values, then compile.

So now you should have a functioning projectile weapon. However, if you put it in a map, you will notice that you can't see it. Even if you do manage to pick it up, you will not be able to see the first-person model. It will also be completely silent when it fires. Now, we need to give it a mesh, then some routines to animate it and play firing sounds.

===Adding meshes===

There are three meshes for every weapon in Unreal Tournament:
# The first-person mesh. This mesh is what you see when you are using the weapon. It is usually the most detailed version, and should include an animation for everything it does.
# The third-person mesh. This is what everyone else sees when you are using the weapon. This version is usually not as detailed as the first-person mesh, and it includes only the animations that you would be able to see well from a distance, like firing.
# The pickup mesh. This is what you see on the ground. It has no animations because at the most, it is meant to revolve slowly.

These three meshes are specified by three default variables: PlayerViewMesh, PickupMesh, and ThirdPersonMesh. You would specify them like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 //...
}&lt;/uscript&gt;

Next, you need to specify the distance the first-person mesh is from the center of the screen. This is specified by a vector called PlayerViewOffset. For the vector's components, positive X is vertical, toward the top of the screen (!), positive Y is horizontal toward the right of the screen, and positive Z is toward yourself. You may want to check the mesh itself, and this part usually requires some trial-and-error unless you made the mesh yourself. In the example above, I was trying to give the Quad Shot some code (It wasn't used in Unreal), but there weren't any values for PlayerViewOffset, so I had to figure it out myself. Now you can add this line to defaultproperties:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
}&lt;/uscript&gt;

One other thing you may want to change is a vector called FireOffset. This vector specifies where the projectile (or trace) should show up relative to the center of your screen, in first-person view. You may have to experiment with this, because it will have to match up reasonably well with the muzzle of your weapon.

Now, you have some meshes for your weapon! Let's make them do something...

===Animations===

Animation allows you to see the weapon in action. Your weapon will need at least two functions to handle animation: PlayFiring() and PlayAltFiring(). For most weapons, they contain code that plays an animation and a sound. Here is a very generic set of routines:

&lt;uscript&gt;function PlayFiring()
{
 PlayAnim('Fire', 1.0, 0.05);
 PlayOwnedSound(FireSound, SLOT_Misc, 1.0);
}

function PlayAltFiring()
{
 PlayAnim('AltFire', 1.0, 0.05);
 PlayOwnedSound(AltFireSound, SLOT_Misc, 1.0);
}&lt;/uscript&gt;

PlayAnim plays an animation from the mesh you have selected. The first parameter is the name of the animation. You can figure this out in the UnrealEd mesh browser if you are using an existing mesh, or you should know it if you created the mesh yourself. The second parameter is the relative playback speed of the animation. A value of 1.0 plays it at 'normal speed', 2.0 plays it twice as fast, 0.5 plays it half as fast, etc. The third parameter is the amount of time to tween from the previous animation to this one.

See [[Legacy:Actor/Methods|Actor/Methods]] for more information on PlayAnim and PlayOwnedSound.

'''A note about animation'''

As I said earlier, there is a first-person and a third-person mesh. Playing an animation will animate both meshes: you don't have to make one call for each mesh. All you will need is these routines. Of course, you can also write your own. The Flak Cannon has a PlayReloading() function which it uses after it fires. This type of animation will be discussed in [[Legacy:Chainguns And Shotguns|Chainguns and shotguns]].

FireSound and AltFireSound are defined for every TournamentWeapon. You can set these to a sound resource in the defaultproperties section, like this:

&lt;uscript&gt;defaultproperties
{
 //...
 PlayerViewMesh=LODMesh'UnrealI.QuadShotHeld'
 PickupMesh=LODMesh'UnrealI.QuadShotPickup'
 ThirdPersonMesh=LODMesh'UnrealI.flakm'
 PlayerViewOffset=(X=-15.000,Y=15.000,Z=-30.000)
 //...
 FireSound=Sound'Botpack.AMSD.ImpactAltFireRelease'
 AltFireSound=Sound'MyPackage.Group1.altfire1'
 //...
}&lt;/uscript&gt;

You can also define your own sounds by adding a line at the top of the file like this:
 var Sound OverheatSound;

Now, you should have a functioning, firing weapon that you can see and pick up ammo for. This is only a projectile weapon. To make an instant-hit weapon, read [[Legacy:Hitscan Weapons|Hitscan weapons]].

'''TkoDark''' I need help fixing this i put this weapon in my map and now i cant fix it or get rid of it. can you  e mail or im me computergod666? When i play the map i can pick the weapon up and change to it but it doesnt shoot or do anything, i messed up somewhere. I don't know how to fix it. In the editor (ued2.0) it is in the search for actors and i can go to it, but i cant see it so i cant click on it and delete it. thanks TKO Ps where do i get your grenade launcher and vehicles? very cool! Email-tkodark@yahoo.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BatchExport</title>
    <id>599</id>
    <revision>
      <id>1810</id>
      <timestamp>2007-03-01T18:07:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:BatchExportCommandlet|BatchExportCommandlet]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BatchExportCommandlet</title>
    <id>554</id>
    <revision>
      <id>1708</id>
      <timestamp>2006-02-01T23:53:19Z</timestamp>
      <contributor>
        <ip>C-24-15-200-251.hsd1.il.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchExportCommandlet}}

A native commandlet for exporting objects from Unreal packages.

==Syntax ==

'''UCC BatchExport''' ''&lt;package filename&gt;'' ''&lt;export class&gt;'' ''&lt;export extension&gt;'' ''&lt;export path&gt;''

==Example ==

At the command line in a DOS box:
 C:\UnrealTournament\System&gt; UCC BatchExport Engine class uc ..\Engine\Classes

This exports all scripts in the Engine package (System\Engine.u) to C:\UnrealTournament\Engine\Classes.

==Parameters ==
; package filename : The package with or without extension and directory. (e.g. &lt;tt&gt;Botpack.u&lt;/tt&gt;, &lt;tt&gt;..\Maps\CTF-Face.unr&lt;/tt&gt; or just &lt;tt&gt;CTF-Face&lt;/tt&gt;)
; export class : The type of objects to export from the package. (e.g. &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;texture&lt;/tt&gt;, etc.)
; export extension : Extension used for the exported files. (e.g. for class: &lt;tt&gt;uc&lt;/tt&gt;, for textures: &lt;tt&gt;bmp&lt;/tt&gt; or &lt;tt&gt;pcx&lt;/tt&gt;)
; export path : The path to save the files to. The directory will be created if it doesn't exist.

==Recognized Classes/Extensions In UT2004 ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT2003 ==

'''Note:''' In UT2003 the class exporter has a bug. In v2107 (unpatched version) UnrealEd and UCC BatchExport crash when processing certain classes. In v2136 (first official UT2003 patch) they don't export objects created in the [[Legacy:Default Properties|default properties]] block. These objects are vital for [[Legacy:Emitter|Emitter]] and GUI classes. You shouldn't extract the sources, but download them from the [[Legacy:Class Tree|Class Tree]] page. (These came directly from Epic.)

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|uc, h
|When you specify ''h'' you always get exactly this result for all classes:&lt;pre&gt;#endif


#ifndef NAMES_ONLY
#undef AUTOGENERATE_NAME
#undef AUTOGENERATE_FUNCTION
#endif NAMES_ONLY

#if _MSC_VER
#pragma pack (pop)
#endif&lt;/pre&gt; 
|-
|Texture
|bmp, pcx  
|-
|Sound
|wav 
|-
|Music
|*
|You can specify any extension. Note that these are most likely S3M, XM or IT files. (Use a module player to find it out. 
|-
|Level
|t3d
|Exports the complete map with all actors and brushes. 
|-
|Model
|t3d
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''. 
|-
|Polys
|t3d
|Exports polygons (?) to files named ''Polys#.t3d'' 
|-
|TextBuffer
|txt
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other. Maps have an additional text buffer with camera settings for UnrealEd:&lt;pre&gt;CAMERAVERT=.5226449
CAMERALEFT=.5033383
CAMERARIGHT=.5006847&lt;/pre&gt; 
|}

==Related Topics ==
* [[Legacy:Compiling With UCC|Compiling with UCC]]
* [[Legacy:File Format|File Format]]

===Discussion ===

'''SabbathCat:''' I've been trying to export model files using UCC in UnrealTournament, and the t3d export doesn't appear to work. I've tried many variations, is it that the UT version of UCC doesn't recognise .PSK?

I'm trying to export the XanMKII model to have a go at re-mapping it.

'''Wormbo:''' An object of class &lt;code&gt;Model&lt;/code&gt; is the actual shape of a [[Legacy:Brush|brush]] actor. It has nothing to do with skeletal or vertex meshes, which both can't be exported through UCC BatchExport. The above tables can be concidered complete already.

'''SabbathCat:''' Ah right, makes sense.  Thanks Wormbo! :)

'''Graphik:''' What ''can'' be used to export vertex meshes?

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1709</id>
      <timestamp>2004-11-21T19:01:11Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>Export vertex meshes from UnrealEngine1?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchExportCommandlet}}

A native commandlet for exporting objects from Unreal packages.

==Syntax ==

'''UCC BatchExport''' ''&lt;package filename&gt;'' ''&lt;export class&gt;'' ''&lt;export extension&gt;'' ''&lt;export path&gt;''

==Example ==

At the command line in a DOS box:
 C:\UnrealTournament\System&gt; UCC BatchExport Engine class uc ..\Engine\Classes

This exports all scripts in the Engine package (System\Engine.u) to C:\UnrealTournament\Engine\Classes.

==Parameters ==
; package filename : The package with or without extension and directory. (e.g. &lt;tt&gt;Botpack.u&lt;/tt&gt;, &lt;tt&gt;..\Maps\CTF-Face.unr&lt;/tt&gt; or just &lt;tt&gt;CTF-Face&lt;/tt&gt;)
; export class : The type of objects to export from the package. (e.g. &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;texture&lt;/tt&gt;, etc.)
; export extension : Extension used for the exported files. (e.g. for class: &lt;tt&gt;uc&lt;/tt&gt;, for textures: &lt;tt&gt;bmp&lt;/tt&gt; or &lt;tt&gt;pcx&lt;/tt&gt;)
; export path : The path to save the files to. The directory will be created if it doesn't exist.

==Recognized Classes/Extensions In UT2003 ==

'''Note:''' In UT2003 the class exporter has a bug. In v2107 (unpatched version) UnrealEd and UCC BatchExport crash when processing certain classes. In v2136 (first official UT2003 patch) they don't export objects created in the [[Legacy:Default Properties|default properties]] block. These objects are vital for [[Legacy:Emitter|Emitter]] and GUI classes. You shouldn't extract the sources, but download them from the [[Legacy:Class Tree|Class Tree]] page. (These came directly from Epic.)

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|uc, h
|When you specify ''h'' you always get exactly this result for all classes:&lt;pre&gt;#endif


#ifndef NAMES_ONLY
#undef AUTOGENERATE_NAME
#undef AUTOGENERATE_FUNCTION
#endif NAMES_ONLY

#if _MSC_VER
#pragma pack (pop)
#endif&lt;/pre&gt; 
|-
|Texture
|bmp, pcx  
|-
|Sound
|wav 
|-
|Music
|*
|You can specify any extension. Note that these are most likely S3M, XM or IT files. (Use a module player to find it out. 
|-
|Level
|t3d
|Exports the complete map with all actors and brushes. 
|-
|Model
|t3d
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''. 
|-
|Polys
|t3d
|Exports polygons (?) to files named ''Polys#.t3d'' 
|-
|TextBuffer
|txt
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other. Maps have an additional text buffer with camera settings for UnrealEd:&lt;pre&gt;CAMERAVERT=.5226449
CAMERALEFT=.5033383
CAMERARIGHT=.5006847&lt;/pre&gt; 
|}

==Related Topics ==
* [[Legacy:Compiling With UCC|Compiling with UCC]]
* [[Legacy:File Format|File Format]]

===Discussion ===

'''SabbathCat:''' I've been trying to export model files using UCC in UnrealTournament, and the t3d export doesn't appear to work. I've tried many variations, is it that the UT version of UCC doesn't recognise .PSK?

I'm trying to export the XanMKII model to have a go at re-mapping it.

'''Wormbo:''' An object of class &lt;code&gt;Model&lt;/code&gt; is the actual shape of a [[Legacy:Brush|brush]] actor. It has nothing to do with skeletal or vertex meshes, which both can't be exported through UCC BatchExport. The above tables can be concidered complete already.

'''SabbathCat:''' Ah right, makes sense.  Thanks Wormbo! :)

'''Graphik:''' What ''can'' be used to export vertex meshes?

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1710</id>
      <timestamp>2006-02-01T23:50:07Z</timestamp>
      <contributor>
        <ip>C-24-15-200-251.hsd1.il.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchExportCommandlet}}

A native commandlet for exporting objects from Unreal packages.

==Syntax ==

'''UCC BatchExport''' ''&lt;package filename&gt;'' ''&lt;export class&gt;'' ''&lt;export extension&gt;'' ''&lt;export path&gt;''

==Example ==

At the command line in a DOS box:
 C:\UnrealTournament\System&gt; UCC BatchExport Engine class uc ..\Engine\Classes

This exports all scripts in the Engine package (System\Engine.u) to C:\UnrealTournament\Engine\Classes.

==Parameters ==
; package filename : The package with or without extension and directory. (e.g. &lt;tt&gt;Botpack.u&lt;/tt&gt;, &lt;tt&gt;..\Maps\CTF-Face.unr&lt;/tt&gt; or just &lt;tt&gt;CTF-Face&lt;/tt&gt;)
; export class : The type of objects to export from the package. (e.g. &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;texture&lt;/tt&gt;, etc.)
; export extension : Extension used for the exported files. (e.g. for class: &lt;tt&gt;uc&lt;/tt&gt;, for textures: &lt;tt&gt;bmp&lt;/tt&gt; or &lt;tt&gt;pcx&lt;/tt&gt;)
; export path : The path to save the files to. The directory will be created if it doesn't exist.

==Recognized Classes/Extensions In UT2004 ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Mesh
|T3D
|Exports all Skeletal Meshes in an animation package.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT2003 ==

'''Note:''' In UT2003 the class exporter has a bug. In v2107 (unpatched version) UnrealEd and UCC BatchExport crash when processing certain classes. In v2136 (first official UT2003 patch) they don't export objects created in the [[Legacy:Default Properties|default properties]] block. These objects are vital for [[Legacy:Emitter|Emitter]] and GUI classes. You shouldn't extract the sources, but download them from the [[Legacy:Class Tree|Class Tree]] page. (These came directly from Epic.)

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|uc, h
|When you specify ''h'' you always get exactly this result for all classes:&lt;pre&gt;#endif


#ifndef NAMES_ONLY
#undef AUTOGENERATE_NAME
#undef AUTOGENERATE_FUNCTION
#endif NAMES_ONLY

#if _MSC_VER
#pragma pack (pop)
#endif&lt;/pre&gt; 
|-
|Texture
|bmp, pcx  
|-
|Sound
|wav 
|-
|Music
|*
|You can specify any extension. Note that these are most likely S3M, XM or IT files. (Use a module player to find it out. 
|-
|Level
|t3d
|Exports the complete map with all actors and brushes. 
|-
|Model
|t3d
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''. 
|-
|Polys
|t3d
|Exports polygons (?) to files named ''Polys#.t3d'' 
|-
|TextBuffer
|txt
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other. Maps have an additional text buffer with camera settings for UnrealEd:&lt;pre&gt;CAMERAVERT=.5226449
CAMERALEFT=.5033383
CAMERARIGHT=.5006847&lt;/pre&gt; 
|}

==Related Topics ==
* [[Legacy:Compiling With UCC|Compiling with UCC]]
* [[Legacy:File Format|File Format]]

===Discussion ===

'''SabbathCat:''' I've been trying to export model files using UCC in UnrealTournament, and the t3d export doesn't appear to work. I've tried many variations, is it that the UT version of UCC doesn't recognise .PSK?

I'm trying to export the XanMKII model to have a go at re-mapping it.

'''Wormbo:''' An object of class &lt;code&gt;Model&lt;/code&gt; is the actual shape of a [[Legacy:Brush|brush]] actor. It has nothing to do with skeletal or vertex meshes, which both can't be exported through UCC BatchExport. The above tables can be concidered complete already.

'''SabbathCat:''' Ah right, makes sense.  Thanks Wormbo! :)

'''Graphik:''' What ''can'' be used to export vertex meshes?

'''FrostByte:''' (UT2004) I'm not sure if the Mesh class is an alias for the Model class in the above list. I was just able to extract Meshes from an animation package (.ukx) 

via: UCC BatchExport HumanMaleA Mesh t3d ..\HumanMaleA (from within the Animations directory) 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35469</id>
      <timestamp>2009-10-12T17:03:13Z</timestamp>
      <contributor>
        <ip>86.10.229.28</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchExportCommandlet}}

A native commandlet for exporting objects from Unreal packages.

==Syntax ==

'''UCC BatchExport''' ''&lt;package filename&gt;'' ''&lt;export class&gt;'' ''&lt;export extension&gt;'' ''&lt;export path&gt;''

==Example ==

At the command line in a DOS box:
 C:\UnrealTournament\System&gt; UCC BatchExport Engine class uc ..\Engine\Classes

This exports all scripts in the Engine package (System\Engine.u) to C:\UnrealTournament\Engine\Classes.

==Parameters ==
; package filename : The package with or without extension and directory. (e.g. &lt;tt&gt;Botpack.u&lt;/tt&gt;, &lt;tt&gt;..\Maps\CTF-Face.unr&lt;/tt&gt; or just &lt;tt&gt;CTF-Face&lt;/tt&gt;)
; export class : The type of objects to export from the package. (e.g. &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;texture&lt;/tt&gt;, etc.)
; export extension : Extension used for the exported files. (e.g. for class: &lt;tt&gt;uc&lt;/tt&gt;, for textures: &lt;tt&gt;bmp&lt;/tt&gt; or &lt;tt&gt;pcx&lt;/tt&gt;)
; export path : The path to save the files to. The directory will be created if it doesn't exist.

==Recognized Classes/Extensions In UT2004 ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT2003 ==

'''Note:''' In UT2003 the class exporter has a bug. In v2107 (unpatched version) UnrealEd and UCC BatchExport crash when processing certain classes. In v2136 (first official UT2003 patch) they don't export objects created in the [[Legacy:Default Properties|default properties]] block. These objects are vital for [[Legacy:Emitter|Emitter]] and GUI classes. You shouldn't extract the sources, but download them from the [[Legacy:Class Tree|Class Tree]] page. (These came directly from Epic.)

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|uc, h
|When you specify ''h'' you always get exactly this result for all classes:&lt;pre&gt;#endif


#ifndef NAMES_ONLY
#undef AUTOGENERATE_NAME
#undef AUTOGENERATE_FUNCTION
#endif NAMES_ONLY

#if _MSC_VER
#pragma pack (pop)
#endif&lt;/pre&gt; 
|-
|Texture
|bmp, pcx  
|-
|Sound
|wav 
|-
|Music
|*
|You can specify any extension. Note that these are most likely S3M, XM or IT files. (Use a module player to find it out. 
|-
|Level
|t3d
|Exports the complete map with all actors and brushes. 
|-
|Model
|t3d
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''. 
|-
|Polys
|t3d
|Exports polygons (?) to files named ''Polys#.t3d'' 
|-
|TextBuffer
|txt
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other. Maps have an additional text buffer with camera settings for UnrealEd:&lt;pre&gt;CAMERAVERT=.5226449
CAMERALEFT=.5033383
CAMERARIGHT=.5006847&lt;/pre&gt; 
|}

==Related Topics ==
* [[Legacy:Compiling With UCC|Compiling with UCC]]
* [[Legacy:File Format|File Format]]

===Discussion ===

'''SabbathCat:''' I've been trying to export model files using UCC in UnrealTournament, and the t3d export doesn't appear to work. I've tried many variations, is it that the UT version of UCC doesn't recognise .PSK?

I'm trying to export the XanMKII model to have a go at re-mapping it.

'''Wormbo:''' An object of class &lt;code&gt;Model&lt;/code&gt; is the actual shape of a [[Legacy:Brush|brush]] actor. It has nothing to do with skeletal or vertex meshes, which both can't be exported through UCC BatchExport. The above tables can be concidered complete already.

'''SabbathCat:''' Ah right, makes sense.  Thanks Wormbo! :)

'''Graphik:''' What ''can'' be used to export vertex meshes?

'''Dan:''' Try UTPT, WOTGreal or Umodel ;)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35470</id>
      <timestamp>2009-10-12T17:05:30Z</timestamp>
      <contributor>
        <ip>86.10.229.28</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchExportCommandlet}}

A native commandlet for exporting objects from Unreal packages.

==Syntax ==

'''UCC BatchExport''' ''&lt;package filename&gt;'' ''&lt;export class&gt;'' ''&lt;export extension&gt;'' ''&lt;export path&gt;''

==Example ==

At the command line in a DOS box:
 C:\UnrealTournament\System&gt; UCC BatchExport Engine class uc ..\Engine\Classes

This exports all scripts in the Engine package (System\Engine.u) to C:\UnrealTournament\Engine\Classes.

==Parameters ==
; package filename : The package with or without extension and directory. (e.g. &lt;tt&gt;Botpack.u&lt;/tt&gt;, &lt;tt&gt;..\Maps\CTF-Face.unr&lt;/tt&gt; or just &lt;tt&gt;CTF-Face&lt;/tt&gt;)
; export class : The type of objects to export from the package. (e.g. &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;texture&lt;/tt&gt;, etc.)
; export extension : Extension used for the exported files. (e.g. for class: &lt;tt&gt;uc&lt;/tt&gt;, for textures: &lt;tt&gt;bmp&lt;/tt&gt; or &lt;tt&gt;pcx&lt;/tt&gt;)
; export path : The path to save the files to. The directory will be created if it doesn't exist.

==Recognized Classes/Extensions In UT2004 ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT2003 ==

'''Note:''' In UT2003 the class exporter has a bug. In v2107 (unpatched version) UnrealEd and UCC BatchExport crash when processing certain classes. In v2136 (first official UT2003 patch) they don't export objects created in the [[Legacy:Default Properties|default properties]] block. These objects are vital for [[Legacy:Emitter|Emitter]] and GUI classes. You shouldn't extract the sources, but download them from the [[Legacy:Class Tree|Class Tree]] page. (These came directly from Epic.)

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|UC, H
|UC exports the actual class scripts, H exports headers. ''(?)''
|-
|Texture
|BMP, PCX, DDS, TGA, UPT
|TGA export only works on RGA8 textures, DDS exports DXT compressed textures. BMP and PCX only work for 8-bit textures. UPT exports to UPaint textures.
|-
|Sound
|WAV 
|-
|Level
|T3D, OBJ, STL
|Exports the complete map with all actors and brushes.
|-
|Model
|T3D
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''.
|-
|Object
|T3D
|This exports all objects in a package. Here 'Objects' are also functions, states, actors, classes (no code, no [[Legacy:Default Properties|default properties]], only the name) and (that's the useful part) [[Legacy:Subobject|subobject]]s declared in the [[Legacy:Default Properties|Default Properties]] and texture [[Legacy:Modifier|modifier]]s.
|-
|Polys
|T3D, OBJ
|Exports polygons (?) to files named ''Polys#.t3d''
|-
|Prefab
|T3D 
|-
|StaticMesh
|T3D
|Exports StaticMeshes (probably converted to brushes?)
|-
|TextBuffer
|TXT
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other.
|}

==Recognized Classes/Extensions In UT ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Export Class'''
| style=&quot;text-align: center&quot; |'''Allowed Extensions'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|Class
|uc, h
|When you specify ''h'' you always get exactly this result for all classes:&lt;pre&gt;#endif


#ifndef NAMES_ONLY
#undef AUTOGENERATE_NAME
#undef AUTOGENERATE_FUNCTION
#endif NAMES_ONLY

#if _MSC_VER
#pragma pack (pop)
#endif&lt;/pre&gt; 
|-
|Texture
|bmp, pcx  
|-
|Sound
|wav 
|-
|Music
|*
|You can specify any extension. Note that these are most likely S3M, XM or IT files. (Use a module player to find it out. 
|-
|Level
|t3d
|Exports the complete map with all actors and brushes. 
|-
|Model
|t3d
|Exports all brushes used in a map. The [[Legacy:Red Builder Brush|Red Builder Brush]] is exported to ''Brush.t3d'' while all other brushes result in files named ''Model#.t3d''. 
|-
|Polys
|t3d
|Exports polygons (?) to files named ''Polys#.t3d'' 
|-
|TextBuffer
|txt
|Exports all kinds of text sources in the package. Script code is exported as ''ScriptCode.txt'' for each class, so the files will instantly overwrite each other. Maps have an additional text buffer with camera settings for UnrealEd:&lt;pre&gt;CAMERAVERT=.5226449
CAMERALEFT=.5033383
CAMERARIGHT=.5006847&lt;/pre&gt; 
|}

==Related Topics ==
* [[Legacy:Compiling With UCC|Compiling with UCC]]
* [[Legacy:File Format|File Format]]

===Discussion ===

'''SabbathCat:''' I've been trying to export model files using UCC in UnrealTournament, and the t3d export doesn't appear to work. I've tried many variations, is it that the UT version of UCC doesn't recognise .PSK?

I'm trying to export the XanMKII model to have a go at re-mapping it.

'''Wormbo:''' An object of class &lt;code&gt;Model&lt;/code&gt; is the actual shape of a [[Legacy:Brush|brush]] actor. It has nothing to do with skeletal or vertex meshes, which both can't be exported through UCC BatchExport. The above tables can be concidered complete already.

'''SabbathCat:''' Ah right, makes sense.  Thanks Wormbo! :)

'''Graphik:''' What ''can'' be used to export vertex meshes?

'''Gizzy:''' Try UTPT, WOTGreal or Umodel. Theres a small trick involving some code to export a selection of Vertex or Skeletal meshes and save them to their own .u file. If someone could point me to the right page, I could add the code and a small guide.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BatchImportCommandlet</title>
    <id>590</id>
    <revision>
      <id>1793</id>
      <timestamp>2005-04-01T05:51:26Z</timestamp>
      <contributor>
        <ip>Dandel1984</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchImportCommandlet (Package: Editor)}}

A native commandlet for importing multiple files into a package.

==Syntax==

'''UCC Editor.BatchImport''' ''&lt;package filename&gt;'' ''&lt;import type&gt;'' ''&lt;wildcard&gt;''

==Example==

At the command line in a DOS box:
 C:\UT2003\System&gt; UCC Editor.BatchImport ..\Sounds\MyNewSoundPackage.uax audio D:\UTSounds\MySounds\*.wav

This imports all wave files in the D:\UTSounds\MySounds directory into the package MyNewSoundPackage.uax.

==Parameters==
; package filename : Name of the (new) package with path and file extension.
; import type : The type of resource to import. This could be something like &quot;Audio&quot;, &quot;Texture&quot; or &quot;StaticMesh&quot;.
; wildcard : A wildcard specifying the location of the file(s) to import.

==How does This Work?==

The BatchImport commandlet only executes import console commands for every file that matches the specified wildcard. The command looks like this:

''&lt;import type&gt;'' '''import package=&quot;'''&lt;i&gt;package name&lt;/i&gt;'''&quot; file=&quot;'''&lt;i&gt;path and name of matching file&lt;/i&gt;'''&quot; name=&quot;'''&lt;i&gt;name of file without extension&lt;/i&gt;'''&quot;'''

Note that the import type isn't an object class, it's actually a console command.

==Known Import Types And Extensions==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Import Type'''''
| style=&quot;text-align: center&quot; |'''''Extension(s)'''''
| style=&quot;text-align: center&quot; |'''''Notes'''''
|-
|Audio
|wav
|Sounds
|-
|Texture
|pcx, bmp, tga, dds
|Textures will be imported with default settings, i.e. not masked, default LOD set ''(which one?)'', etc.
|-
|StaticMesh
|lwo, T3D ''(others?)''
|Static Meshes will be imported with collision and no additional commands are executed (e.g. STATICMESH SETPROJECTION MESH=''someMesh'' AREAID=''number'')
|}

'''Note:''' the T3D format on StaticMesh will error on import if the proper textures are not in place before hand ( exactly properly done).

==Related Topics==
* [[Legacy:Exec Directive|Exec Directive]]
* [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]]
* [[Legacy:UnrealEd Console|UnrealEd Console]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1794</id>
      <timestamp>2003-02-18T05:52:06Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchImportCommandlet (Package: Editor)}}

A native commandlet for importing multiple files into a package.

==Syntax==

'''UCC Editor.BatchImport''' ''&lt;package filename&gt;'' ''&lt;import type&gt;'' ''&lt;wildcard&gt;''

==Example==

At the command line in a DOS box:
 C:\UT2003\System&gt; UCC Editor.BatchImport ..\Sounds\MyNewSoundPackage.uax audio D:\UTSounds\MySounds\*.wav

This imports all wave files in the D:\UTSounds\MySounds directory into the package MyNewSoundPackage.uax.

==Parameters==
; package filename : Name of the (new) package with path and file extension.
; import type : The type of resource to import. This could be something like &quot;Audio&quot;, &quot;Texture&quot; or &quot;StaticMesh&quot;.
; wildcard : A wildcard specifying the location of the file(s) to import.

==How does This Work?==

The BatchImport commandlet only executes import console commands for every file that matches the specified wildcard. The command looks like this:

''&lt;import type&gt;'' '''import package=&quot;'''&lt;i&gt;package name&lt;/i&gt;'''&quot; file=&quot;'''&lt;i&gt;path and name of matching file&lt;/i&gt;'''&quot; name=&quot;'''&lt;i&gt;name of file without extension&lt;/i&gt;'''&quot;'''

Note that the import type isn't an object class, it's actually a console command.

==Known Import Types And Extensions==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Import Type'''''
| style=&quot;text-align: center&quot; |'''''Extension(s)'''''
| style=&quot;text-align: center&quot; |'''''Notes'''''
|-
|Audio
|wav
|Sounds
|-
|Texture
|pcx, bmp, tga, dds
|Textures will be imported with default settings, i.e. not masked, default LOD set ''(which one?)'', etc.
|-
|StaticMesh
|lwo ''(others?)''
|Static Meshes will be imported with collision and no additional commands are executed (e.g. STATICMESH SETPROJECTION MESH=''someMesh'' AREAID=''number'')
|}

==Related Topics==
* [[Legacy:Exec Directive|Exec Directive]]
* [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]]
* [[Legacy:UnrealEd Console|UnrealEd Console]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1795</id>
      <timestamp>2005-03-31T23:08:27Z</timestamp>
      <contributor>
        <ip>Dandel1984</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; BatchImportCommandlet (Package: Editor)}}

A native commandlet for importing multiple files into a package.

==Syntax==

'''UCC Editor.BatchImport''' ''&lt;package filename&gt;'' ''&lt;import type&gt;'' ''&lt;wildcard&gt;''

==Example==

At the command line in a DOS box:
 C:\UT2003\System&gt; UCC Editor.BatchImport ..\Sounds\MyNewSoundPackage.uax audio D:\UTSounds\MySounds\*.wav

This imports all wave files in the D:\UTSounds\MySounds directory into the package MyNewSoundPackage.uax.

==Parameters==
; package filename : Name of the (new) package with path and file extension.
; import type : The type of resource to import. This could be something like &quot;Audio&quot;, &quot;Texture&quot; or &quot;StaticMesh&quot;.
; wildcard : A wildcard specifying the location of the file(s) to import.

==How does This Work?==

The BatchImport commandlet only executes import console commands for every file that matches the specified wildcard. The command looks like this:

''&lt;import type&gt;'' '''import package=&quot;'''&lt;i&gt;package name&lt;/i&gt;'''&quot; file=&quot;'''&lt;i&gt;path and name of matching file&lt;/i&gt;'''&quot; name=&quot;'''&lt;i&gt;name of file without extension&lt;/i&gt;'''&quot;'''

Note that the import type isn't an object class, it's actually a console command.

==Known Import Types And Extensions==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Import Type'''''
| style=&quot;text-align: center&quot; |'''''Extension(s)'''''
| style=&quot;text-align: center&quot; |'''''Notes'''''
|-
|Audio
|wav
|Sounds
|-
|Texture
|pcx, bmp, tga, dds
|Textures will be imported with default settings, i.e. not masked, default LOD set ''(which one?)'', etc.
|-
|StaticMesh
|lwo, T3D ''(others?)''
|Static Meshes will be imported with collision and no additional commands are executed (e.g. STATICMESH SETPROJECTION MESH=''someMesh'' AREAID=''number'')
|}

==Related Topics==
* [[Legacy:Exec Directive|Exec Directive]]
* [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]]
* [[Legacy:UnrealEd Console|UnrealEd Console]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BattleCrafts</title>
    <id>655</id>
    <revision>
      <id>1934</id>
      <timestamp>2005-01-24T01:25:43Z</timestamp>
      <contributor>
        <ip>Blind Rob</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">BattleCrafts is a Mod curently being worked on for UT2004

the webpage can be found here - http://battlecrafts.c-aces.com/

Here are some of the things BattleCrafts changes about gameplay

*Infantry
**Most of the infantry weapons have recoil, which can be reduced by shooting bursts, slow movement and crouching.
**Hitting the head will always increase the damage.
**Ballistic projectiles will fly a downward curve, so you need to aim up to compensate.
**The grenades of the M72-ApG bounce from walls and ceilings, but explode on ground.
**The Vendetta Torpedolauncher has two firemodes: Lock on the target once and launch the torpedo in follow-mode or launch it in a precise interception-mode which seeks your currently locked target. 

*Vehicles
**Vehicles have limited ammo
**the spawn points turn into places were you can buy, fix and reload vehicles
**the weapons on the vehicles have been altered to make them into just about new vehicles 
**some vehicles take more dammage in difrent places, like under and behind</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bcladd</title>
    <id>623</id>
    <revision>
      <id>1862</id>
      <timestamp>2003-09-04T12:02:12Z</timestamp>
      <contributor>
        <ip>Bcladd</ip>
      </contributor>
      <comment>* Added a (short) intro</comment>
      <text xml:space="preserve">Thank you all for the welcome. I have been lurking around since I started learning [[Legacy:UnrealScript|UnrealScript]] at the beginning of 2003. In fact, I think this UnrealWiki taught me the language. This is going to be shockingly short for someone as long-winded as I am (take a look at [[Legacy:AssociativeArray|AssociativeArray]] if you need proof). I think this is an amazingly well focused community resource and I am happy to be able to contribute when I can. 

----

'''nytrogen:''' Welcome to the Wiki. :tup: I've seen you here for a while without any personal page. Here you go. :-D

'''MythOpus:''' Consider this my Welcome too &lt;Add Copied Welcome From Tarquin here&gt;

'''EntropicLqd:''' Greetings.

'''Tarquin:''' Hi there. :) The [[Legacy:AssociativeArray|AssociativeArray]] pages are really interesting stuff, BTW. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1863</id>
      <timestamp>2003-09-04T09:00:18Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

'''nytrogen:''' Welcome to the Wiki. :tup: I've seen you here for a while without any personal page. Here you go. :-D

'''MythOpus:''' Consider this my Welcome too &lt;Add Copied Welcome From Tarquin here&gt;

'''EntropicLqd:''' Greetings.

'''Tarquin:''' Hi there. :) The [[Legacy:AssociativeArray|AssociativeArray]] pages are really interesting stuff, BTW. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BeamEmitter</title>
    <id>28414</id>
    <revision>
      <id>40086</id>
      <timestamp>2009-11-15T08:27:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bean</title>
    <id>521</id>
    <revision>
      <id>1626</id>
      <timestamp>2003-01-09T22:03:37Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Contact Bean @ [mailto:bean@planetunreal.com bean@planetunreal.com]

===Sites===

[http://www.planetunreal.com/bean Bean - Level Design] My Personal site with my maps and textures.

[http://www.planetunreal.com/unrealed UnrealED.exe] I lend a hand here.

===Bio===

Been mapping since Duke Nukem 3D. I LOVE level design, texture creation, 3d modelling, and basically anything to do with gaming. I live for this stuff.

I also like playing guitar, listening to ear-bleeding amounts of music, long walks on the beach, and candlelight dinners.

----

'''Mychaeel:'''   Umm yeah.  Welcome to the Wiki.  :-)

'''Tarquin:'''  Hello Bean :)   

'''Bean:''' heya Tarquin. I've been dying to add to this. What a great project. It seems like everything is turning out great.

'''Tarquin:'''  :) Welcome aboard.

'''Bean''' Glad to lend a hand =D

'''Tarquin:'''  I've added you to [[Legacy:Project Contributors|Project Contributors]].

'''Bean:''' Heeey cool.

'''C0ry:''' Thx Bean.. nice to meet you :)

'''Kerlin:''' Thanks for the info from the leveldesigner.com forum regarding default lighting, I added it to [[Legacy:UnrealEd Beginner FAQ|UnrealEd Beginner FAQ]]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1627</id>
      <timestamp>2002-07-24T01:30:35Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <minor/>
      <comment>My strong feelings.</comment>
      <text xml:space="preserve">Contact Bean @ [mailto:bean@planetunreal.com bean@planetunreal.com]

===Sites===

[http://www.planetunreal.com/bean Bean - Level Design] My Personal site with my maps and textures.

[http://www.planetunreal.com/unrealed UnrealED.exe] I lend a hand here.

===Bio===

Been mapping since Duke Nukem 3D. I LOVE level design, texture creation, 3d modelling, and basically anything to do with gaming. I live for this stuff.

I also like playing guitar, listening to ear-bleeding amounts of music, long walks on the beach, and candlelight dinners.

----

'''Mychaeel:'''   Umm yeah.  Welcome to the Wiki.  :-)

'''Tarquin:'''  Hello Bean :)   

'''Bean:''' heya Tarquin. I've been dying to add to this. What a great project. It seems like everything is turning out great.

'''Tarquin:'''  :) Welcome aboard.

'''Bean''' Glad to lend a hand =D

'''Tarquin:'''  I've added you to [[Legacy:Project Contributors|Project Contributors]].

'''Bean:''' Heeey cool.

'''C0ry:''' Thx Bean.. nice to meet you :)

'''Dma:'''  GameSpy sucks, dude!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1628</id>
      <timestamp>2002-12-05T06:18:27Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Contact Bean @ [mailto:bean@planetunreal.com bean@planetunreal.com]

===Sites===

[http://www.planetunreal.com/bean Bean - Level Design] My Personal site with my maps and textures.

[http://www.planetunreal.com/unrealed UnrealED.exe] I lend a hand here.

===Bio===

Been mapping since Duke Nukem 3D. I LOVE level design, texture creation, 3d modelling, and basically anything to do with gaming. I live for this stuff.

I also like playing guitar, listening to ear-bleeding amounts of music, long walks on the beach, and candlelight dinners.

----

'''Mychaeel:'''   Umm yeah.  Welcome to the Wiki.  :-)

'''Tarquin:'''  Hello Bean :)   

'''Bean:''' heya Tarquin. I've been dying to add to this. What a great project. It seems like everything is turning out great.

'''Tarquin:'''  :) Welcome aboard.

'''Bean''' Glad to lend a hand =D

'''Tarquin:'''  I've added you to [[Legacy:Project Contributors|Project Contributors]].

'''Bean:''' Heeey cool.

'''C0ry:''' Thx Bean.. nice to meet you :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bean/Developer Journal</title>
    <id>618</id>
    <revision>
      <id>1849</id>
      <timestamp>2003-08-05T09:44:50Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">==Hello!==

What's Goin On:

=====7.08.2002=====

Lately, I've been busy gearing up for mapping in UT2003. The static mesh system is great imo. I've already started modelling static meshes for a map I am planning. Creating meshes should give me good practice in 3ds max, I'm starting to become a 3ds max enthusiast. :p

As for my editing, The only thing I think needs improvement are my art skills. I was really contemplating the other day buying an electronic art pad :) Honestly, I think I have enough (da basics) to get by, as I'm really push myself to be a better mapper and modeller. Doing this for fun for about a year and a half, I can say i'm really starting to improve. Hopefully, i'll shine in UT2003 and land a job. :D

Peace.

==Maps==

===CTF-Kashmir===

[http://www.planetunreal.com/unrealcore/maps-packs.htm Mappack released], contains CTF-Kashmir.

Here are my thoughts on my map: (Gothic Theme)
* The Red Base turned out pretty well. You really don't need items to entice bots to use [[Legacy:AlternatePath|AlternatePath]]s. But, use the APs like [[Legacy:PathNode|PathNode]]s, or they will become uninterested and run away towards the nearest pathnode to the flag. It was pretty funny watching a bot start to run up stairs, then jump off to go the nearest pathnode. I tried to create a tense atmosphere by picking and choose bright and dim lights. As usual, everyone pointed out that my lights were too dim for them. I guess my monitor brightness is higher then everyone else. :p
* The red base is basically about 75% of my DM-Kashmir level. It's kinda weird how my mapping has progressed in just a few months. I liked the arches and the texture set, so i figured I would screw around with the theme.
* I didn't want to go crazy with trim like every other map I see. So, I tried to add trim ONLY where it would enhance the look of the area. Notably: The replicated arches leading to the red flag, tops and bottoms of pillars, intro to blue base, and doorways.
* As for lighting, it's my basic style of lighting: Dim, slightly colored. I think the lighting is one of my favorite parts of this map. 
* The [[Legacy:SkyBox|SkyBox]] turned out great. It's usually difficult to get a pleasing skybox to compliment your outdoors areas, but this went well with it. I ALWAYS make a new clouds. I hate UT's cloud textures (nothing personal Epic, DE).
* With the red base, I was trying to give a dark, devilish feel. Adding the winds and moans, coupled with the obvious red subtext, it matches well. I was going to use the a devil texture with glowing eyes, but the corona seemed to shrink after every rebuilt, so I tossed that. 
* With the blue base, I attempted to pull off an &quot;angel&quot; type feel, with the angel texture greeting you as you enter the base. The light blue lighting in the base is almost white when you look at it, give it a pure look. I gave the blue base less decoration to help enhance the pure feeling.
* Yes, I like symbolism in maps.

'''ZxAnPhOrIaN:'''  Hey!? This sounds like my level that I'm making, but mine is in actual Heaven and Hell!

==Textures==

I have put up two photoshop tutorials up in various places :D. On [http://www.planetunreal.com/unrealed Unrealed.exe], I put up a quick tut on how to tile a texture base a while back, and at [http://www.geocities.com/beanmap my site] I put a tut in how to create bump maps for use in the next gen games. I really should write up more tutorials for Unrealed.exe, but there is really not much I can add that is not already there. :p

I have &quot;released&quot; two texture packs so far. One is basically...umm... basic textures. Base textures at that. the second one I have created is a photosource nature pack, which turned out pretty good. I think I need to work on my l33t tiling skills. i pretty happy with them, but they are very simple. The next pack I created will probably be more of a detailed pack than just base textures. 

Tiling is pretty easy if you take your time. The clone stamp tool is GREAT for tiling. Be careful when setting a brush to use, because a soft one will add quite a amount of unpleasent blurring. I'm going to try cut 'n' paste w/ clone stamp to tile a texture, maybe the results will be more pleasing.

Just for those who don't know, tiling is easiest done with ''Filter -&gt; Offset'' and setting it to half the texture size, and painting over the overlap. The easiest way IMO.

==Other Schtuff==

===How I Map===

I thought I would take time to show how I create a UT map from beginning to end. I will add to this as I improve. (This will all change with UT2003).

First, the ideas for my maps come from anywhere. I've drawn inspiration from movie sets to simple doodles. I make maps in either one of two ways.
# Know a concrete theme and go from there.
# Develop a theme from brainstorming and sketching.

I almost NEVER say &quot;I'm gonna do a (insert theme here) map&quot;, because 85% of the time, I'll draw a blank on flow and architecture. I usually deduce the general theme by the sketches that are in front of me. 

I start the development of a map by sketching first, getting something on paper. My first sketches usually consist of some top-down floor plans of a room or two and architecture and lighting ideas. I'll do about 2-3 pages worth before I'll start to put the pieces together to form a theme with the map. If nothing comes together, I'll save those sketches for some other time, sit back, and start over. It usually doesn't take more than an hour to come up with something concrete to elaborate on.

After things start to go well, I put together some flow idea. My maps are either:
# Architecture dictates flow.
# Flow dictates architecture.

It is usually the latter. Ultimately, most of the deco in my maps gets added last.

After I've come up with the preliminary sketches for about half of the map, I jump into the editor. I just start throwing stuff out, building and building, simple. I throw out about 50% of the stuff that was oringinally sketched and then placed into the editor. I guess i'm just really picky. :) I place the basic floor layout for as much as the level as I can, then  decorate as simple as I can. These decorations are just placeholders for the final eye candy. Textures are choosen on usability. If I need to create new textures, I do (which is usually rare). When it comes to ending the layout, It comes down to how many players you want this to be, and what kind of action the map will have.

When I feel pleased with the layout, I move to decorating the map. The final layout is never &quot;final&quot; for me until it's gone through the testing and is uploaded to the web. :)

Decoration consists of adding structural brushes, architectural brushes, and eye candy. Here is where i try my best to keep a close eye on node count and frame rate. I try to stay in the region of 200-250 polys/scene. One thing I like to do for each room is create a &quot;focal point&quot;. This is something which looks cool and draw the players attention in the room. A good focal point is a shine of light, an arch, something that will make the player think &quot;hey, that's pretty neat&quot;. For CTF maps, placement of the banners and colored lighting are EXCELLENT focal points. Shadows are great focal points for hallways.

Half of my lighting for a map is created during the layout stage, and the rest is done while/after decorating. Most lighting is pretty basic admittedly. There is not much you can do with lighting in UT, given the technical limitations. I've seen some great uses of lighting, but no map has incredible lighting that makes your jaw drop. What I like to do light -wise is make plesent looking lights with a small tint of color. Plain white is very boring. Adding a small washed out hint of yellow or blue makes a huge difference. For florescent lights or mechanical-looking lights, i prefer to add a hint of yellow. Adding a almost inaudible hum to the light adds so much to the atmosphere. 

Pathnoding, what is there to say? It's tedious, it isnt very fun, and can mean the difference between a good map and a great map. So, not much to say except: Pathnode, testing, rinse, repeat.

If i think of anything else to add, I'll be sure to. :D

----

==Comments==

'''Bean:''' Sorry for the spelling mistakes. :)

'''Tarquin:'''  I can't spot any. Anyway, I've made a few terms into links :)

'''Tarquin:'''  quick question: is that with Photoshop?

'''Bean:''' Yep, I should make note that all art stuff I do is with photoshop.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1850</id>
      <timestamp>2002-06-25T06:08:29Z</timestamp>
      <contributor>
        <ip>Bean</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Maps==

===CTF-Kashmir===

Mappack released, contains CTF-Kashmir [http://www.planetunreal.com/unrealcore/maps-packs.htm HERE].

Here are my thoughts on my map: (Gothic Theme)
* The Red Base turned out pretty well. You really don't need items to entice bots to use [[Legacy:AlternatePath|AlternatePath]]s. But, use the APs like [[Legacy:PathNode|PathNode]]s, or they will become uninterested and run away towards the nearest pathnode to the flag. It was pretty funny watching a bot start to run up stairs, then jump off to go the nearest pathnode. I tried to create a tense atmosphere by picking and choose bright and dim lights. As usual, everyone pointed out that my lights were too dim for them. I guess my monitor brightness is higher then everyone else. :p
* The red base is basically about 75% of my DM-Kashmir level. It's kinda weird how my mapping has progressed in just a few months. I liked the arches and the texture set, so i figured I would screw around with the theme.
* I didn't want to go crazy with trim like every other map I see. So, I tried to add trim ONLY where it would enhance the look of the area. Notably: The replicated arches leading to the red flag, tops and bottoms of pillars, intro to blue base, and doorways.
* As for lighting, it's my basic style of lighting: Dim, slightly colored. I think the lighting is one of my favorite parts of this map. 
* The [[Legacy:SkyBox|SkyBox]] turned out great. It's usually difficult to get a pleasing skybox to compliment your outdoors areas, but this went well with it. I ALWAYS make a new clouds. I hate UT's cloud textures (nothing personal Epic, DE).
* With the red base, I was trying to give a dark, devilish feel. Adding the winds and moans, coupled with the obvious red subtext, it matches well. I was going to use the a devil texture with glowing eyes, but the corona seemed to shrink after every rebuilt, so I tossed that. 
* With the blue base, I attempted to pull off an &quot;angel&quot; type feel, with the angel texture greeting you as you enter the base. The light blue lighting in the base is almost white when you look at it, give it a pure look. I gave the blue base less decoration to help enhance the pure feeling.
* Yes, I like symbolism in maps.

'''ZxAnPhOrIaN:'''  Hey!? This sounds like my level that I'm making, but mine is in actual Heaven and Hell!

==Textures==

I have put up two photoshop tutorials up in various places :D. On [http://www.planetunreal.com/unrealed Unrealed.exe], I put up a quick tut on how to tile a texture base a while back, and at [http://www.geocities.com/beanmap my site] I put a tut in how to create bump maps for use in the next gen games. I really should write up more tutorials for Unrealed.exe, but there is really not much I can add that is not already there. :p

I have &quot;released&quot; two texture packs so far. One is basically...umm... basic textures. Base textures at that. the second one I have created is a photosource nature pack, which turned out pretty good. I think I need to work on my l33t tiling skills. i pretty happy with them, but they are very simple. The next pack I created will probably be more of a detailed pack than just base textures. 

Tiling is pretty easy if you take your time. The clone stamp tool is GREAT for tiling. Be careful when setting a brush to use, because a soft one will add quite a amount of unpleasent blurring. I'm going to try cut 'n' paste w/ clone stamp to tile a texture, maybe the results will be more pleasing.

Just for those who don't know, tiling is easiest done with ''Filter -&gt; Offset'' and setting it to half the texture size, and painting over the overlap. The easiest way IMO.

==Other Schtuff==

===How I Map===

I thought I would take time to show how I create a UT map from beginning to end. I will add to this as I improve. (This will all change with UT2003).

First, the ideas for my maps come from anywhere. I've drawn inspiration from movie sets to simple doodles. I make maps in either one of two ways.
# Know a concrete theme and go from there.
# Develop a theme from brainstorming and sketching.

I almost NEVER say &quot;I'm gonna do a (insert theme here) map&quot;, because 85% of the time, I'll draw a blank on flow and architecture. I usually deduce the general theme by the sketches that are in front of me. 

I start the development of a map by sketching first, getting something on paper. My first sketches usually consist of some top-down floor plans of a room or two and architecture and lighting ideas. I'll do about 2-3 pages worth before I'll start to put the pieces together to form a theme with the map. If nothing comes together, I'll save those sketches for some other time, sit back, and start over. It usually doesn't take more than an hour to come up with something concrete to elaborate on.

After things start to go well, I put together some flow idea. My maps are either:
# Architecture dictates flow.
# Flow dictates architecture.

It is usually the latter. Ultimately, most of the deco in my maps gets added last.

After I've come up with the preliminary sketches for about half of the map, I jump into the editor. I just start throwing stuff out, building and building, simple. I throw out about 50% of the stuff that was oringinally sketched and then placed into the editor. I guess i'm just really picky. :) I place the basic floor layout for as much as the level as I can, then  decorate as simple as I can. These decorations are just placeholders for the final eye candy. Textures are choosen on usability. If I need to create new textures, I do (which is usually rare). When it comes to ending the layout, It comes down to how many players you want this to be, and what kind of action the map will have.

When I feel pleased with the layout, I move to decorating the map. The final layout is never &quot;final&quot; for me until it's gone through the testing and is uploaded to the web. :)

Decoration consists of adding structural brushes, architectural brushes, and eye candy. Here is where i try my best to keep a close eye on node count and frame rate. I try to stay in the region of 200-250 polys/scene. One thing I like to do for each room is create a &quot;focal point&quot;. This is something which looks cool and draw the players attention in the room. A good focal point is a shine of light, an arch, something that will make the player think &quot;hey, that's pretty neat&quot;. For CTF maps, placement of the banners and colored lighting are EXCELLENT focal points. Shadows are great focal points for hallways.

Half of my lighting for a map is created during the layout stage, and the rest is done while/after decorating. Most lighting is pretty basic admittedly. There is not much you can do with lighting in UT, given the technical limitations. I've seen some great uses of lighting, but no map has incredible lighting that makes your jaw drop. What I like to do light -wise is make plesent looking lights with a small tint of color. Plain white is very boring. Adding a small washed out hint of yellow or blue makes a huge difference. For florescent lights or mechanical-looking lights, i prefer to add a hint of yellow. Adding a almost inaudible hum to the light adds so much to the atmosphere. 

Pathnoding, what is there to say? It's tedious, it isnt very fun, and can mean the difference between a good map and a great map. So, not much to say except: Pathnode, testing, rinse, repeat.

If i think of anything else to add, I'll be sure to. :D

----

==Comments==

'''Bean:''' Sorry for the spelling mistakes. :)

'''Tarquin:'''  I can't spot any. Anyway, I've made a few terms into links :)

'''Tarquin:'''  quick question: is that with Photoshop?

'''Bean:''' Yep, I should make note that all art stuff I do is with photoshop.</text>
    </revision>
    <revision>
      <id>1851</id>
      <timestamp>2002-07-08T06:15:17Z</timestamp>
      <contributor>
        <ip>Bean</ip>
      </contributor>
      <comment>brief what's up</comment>
      <text xml:space="preserve">==Hello!==

What's Goin On:

=====7.08.2002=====

Lately, I've been busy gearing up for mapping in UT2003. The static mesh system is great imo. I've already started modelling static meshes for a map I am planning. Creating meshes should give me good practice in 3ds max, I'm starting to become a 3ds max enthusiast. :p

As for my editing, The only thing I think needs improvement are my art skills. I was really contemplating the other day buying an electronic art pad :) Honestly, I think I have enough (da basics) to get by, as I'm really push myself to be a better mapper and modeller. Doing this for fun for about a year and a half, I can say i'm really starting to improve. Hopefully, i'll shine in UT2003 and land a job. :D

Peace.

==Maps==

===CTF-Kashmir===

Mappack released, contains CTF-Kashmir [http://www.planetunreal.com/unrealcore/maps-packs.htm HERE].

Here are my thoughts on my map: (Gothic Theme)
* The Red Base turned out pretty well. You really don't need items to entice bots to use [[Legacy:AlternatePath|AlternatePath]]s. But, use the APs like [[Legacy:PathNode|PathNode]]s, or they will become uninterested and run away towards the nearest pathnode to the flag. It was pretty funny watching a bot start to run up stairs, then jump off to go the nearest pathnode. I tried to create a tense atmosphere by picking and choose bright and dim lights. As usual, everyone pointed out that my lights were too dim for them. I guess my monitor brightness is higher then everyone else. :p
* The red base is basically about 75% of my DM-Kashmir level. It's kinda weird how my mapping has progressed in just a few months. I liked the arches and the texture set, so i figured I would screw around with the theme.
* I didn't want to go crazy with trim like every other map I see. So, I tried to add trim ONLY where it would enhance the look of the area. Notably: The replicated arches leading to the red flag, tops and bottoms of pillars, intro to blue base, and doorways.
* As for lighting, it's my basic style of lighting: Dim, slightly colored. I think the lighting is one of my favorite parts of this map. 
* The [[Legacy:SkyBox|SkyBox]] turned out great. It's usually difficult to get a pleasing skybox to compliment your outdoors areas, but this went well with it. I ALWAYS make a new clouds. I hate UT's cloud textures (nothing personal Epic, DE).
* With the red base, I was trying to give a dark, devilish feel. Adding the winds and moans, coupled with the obvious red subtext, it matches well. I was going to use the a devil texture with glowing eyes, but the corona seemed to shrink after every rebuilt, so I tossed that. 
* With the blue base, I attempted to pull off an &quot;angel&quot; type feel, with the angel texture greeting you as you enter the base. The light blue lighting in the base is almost white when you look at it, give it a pure look. I gave the blue base less decoration to help enhance the pure feeling.
* Yes, I like symbolism in maps.

'''ZxAnPhOrIaN:'''  Hey!? This sounds like my level that I'm making, but mine is in actual Heaven and Hell!

==Textures==

I have put up two photoshop tutorials up in various places :D. On [http://www.planetunreal.com/unrealed Unrealed.exe], I put up a quick tut on how to tile a texture base a while back, and at [http://www.geocities.com/beanmap my site] I put a tut in how to create bump maps for use in the next gen games. I really should write up more tutorials for Unrealed.exe, but there is really not much I can add that is not already there. :p

I have &quot;released&quot; two texture packs so far. One is basically...umm... basic textures. Base textures at that. the second one I have created is a photosource nature pack, which turned out pretty good. I think I need to work on my l33t tiling skills. i pretty happy with them, but they are very simple. The next pack I created will probably be more of a detailed pack than just base textures. 

Tiling is pretty easy if you take your time. The clone stamp tool is GREAT for tiling. Be careful when setting a brush to use, because a soft one will add quite a amount of unpleasent blurring. I'm going to try cut 'n' paste w/ clone stamp to tile a texture, maybe the results will be more pleasing.

Just for those who don't know, tiling is easiest done with ''Filter -&gt; Offset'' and setting it to half the texture size, and painting over the overlap. The easiest way IMO.

==Other Schtuff==

===How I Map===

I thought I would take time to show how I create a UT map from beginning to end. I will add to this as I improve. (This will all change with UT2003).

First, the ideas for my maps come from anywhere. I've drawn inspiration from movie sets to simple doodles. I make maps in either one of two ways.
# Know a concrete theme and go from there.
# Develop a theme from brainstorming and sketching.

I almost NEVER say &quot;I'm gonna do a (insert theme here) map&quot;, because 85% of the time, I'll draw a blank on flow and architecture. I usually deduce the general theme by the sketches that are in front of me. 

I start the development of a map by sketching first, getting something on paper. My first sketches usually consist of some top-down floor plans of a room or two and architecture and lighting ideas. I'll do about 2-3 pages worth before I'll start to put the pieces together to form a theme with the map. If nothing comes together, I'll save those sketches for some other time, sit back, and start over. It usually doesn't take more than an hour to come up with something concrete to elaborate on.

After things start to go well, I put together some flow idea. My maps are either:
# Architecture dictates flow.
# Flow dictates architecture.

It is usually the latter. Ultimately, most of the deco in my maps gets added last.

After I've come up with the preliminary sketches for about half of the map, I jump into the editor. I just start throwing stuff out, building and building, simple. I throw out about 50% of the stuff that was oringinally sketched and then placed into the editor. I guess i'm just really picky. :) I place the basic floor layout for as much as the level as I can, then  decorate as simple as I can. These decorations are just placeholders for the final eye candy. Textures are choosen on usability. If I need to create new textures, I do (which is usually rare). When it comes to ending the layout, It comes down to how many players you want this to be, and what kind of action the map will have.

When I feel pleased with the layout, I move to decorating the map. The final layout is never &quot;final&quot; for me until it's gone through the testing and is uploaded to the web. :)

Decoration consists of adding structural brushes, architectural brushes, and eye candy. Here is where i try my best to keep a close eye on node count and frame rate. I try to stay in the region of 200-250 polys/scene. One thing I like to do for each room is create a &quot;focal point&quot;. This is something which looks cool and draw the players attention in the room. A good focal point is a shine of light, an arch, something that will make the player think &quot;hey, that's pretty neat&quot;. For CTF maps, placement of the banners and colored lighting are EXCELLENT focal points. Shadows are great focal points for hallways.

Half of my lighting for a map is created during the layout stage, and the rest is done while/after decorating. Most lighting is pretty basic admittedly. There is not much you can do with lighting in UT, given the technical limitations. I've seen some great uses of lighting, but no map has incredible lighting that makes your jaw drop. What I like to do light -wise is make plesent looking lights with a small tint of color. Plain white is very boring. Adding a small washed out hint of yellow or blue makes a huge difference. For florescent lights or mechanical-looking lights, i prefer to add a hint of yellow. Adding a almost inaudible hum to the light adds so much to the atmosphere. 

Pathnoding, what is there to say? It's tedious, it isnt very fun, and can mean the difference between a good map and a great map. So, not much to say except: Pathnode, testing, rinse, repeat.

If i think of anything else to add, I'll be sure to. :D

----

==Comments==

'''Bean:''' Sorry for the spelling mistakes. :)

'''Tarquin:'''  I can't spot any. Anyway, I've made a few terms into links :)

'''Tarquin:'''  quick question: is that with Photoshop?

'''Bean:''' Yep, I should make note that all art stuff I do is with photoshop.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Beefcake</title>
    <id>645</id>
    <revision>
      <id>1913</id>
      <timestamp>2004-07-27T18:58:35Z</timestamp>
      <contributor>
        <ip>Beefcake</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Vehicle Code==

[[Legacy:WeaponSystemFramework|WeaponSystemFramework]] - This is still a WIP but already can be used to implement new vehicle weapons with an easy to understand replication process.

[[Legacy:ONSManualGunPawn|ONSManualGunPawn]]

[[Legacy:ONSManualGun|ONSManualGun]]

[[Legacy:ONSStationaryWeaponPawn|ONSStationaryWeaponPawn]]</text>
    </revision>
    <revision>
      <id>1914</id>
      <timestamp>2004-07-27T18:57:45Z</timestamp>
      <contributor>
        <ip>Beefcake</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Vehicle Code==

[[Legacy:WeaponSystemFramework|WeaponSystemFramework]] - This is still a WIP but already can be used to implement new vehicle weapons with an easy to understand replication process.

[[Legacy:ONSManualGunPawn|ONSManualGunPawn]]

[[Legacy:ONSManualGun|ONSManualGun]]

[[Legacy:ONSStationaryWeaponPawn|ONSStationaryWeaponPawn]]

[[Legacy:ONSStationaryWeapon|ONSStationaryWeapon]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Beginner Topics</title>
    <id>523</id>
    <revision>
      <id>1632</id>
      <timestamp>2006-11-26T12:58:33Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Change link from Glass to Making Windows</comment>
      <text xml:space="preserve">This page has links to tutorials aimed at specifically at beginners, and other topics that beginners should cover.

Like the rest of the site, it's under constant development. If you are a beginner and do not find these pages suffiencently helpful, then you are invited to do one of the following:
* Add a comment to this page
* Add a comment to the article
* Insert questions into the text of an article
* Improve the article yourself

If you add a page from here please also add a link for it under the section head, eg &quot;Basic Lighting&quot; should get a link somewhere on the [[Legacy:Lighting|Lighting]] section page. Tutorials should also get a link on the [[Legacy:Mapping Lessons|Mapping Lessons]] page.

====First Steps with UnrealEd ====

This is work in progress, intended to be a sequence of tutorials starting from absolute scratch.
# [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]]
# [[Legacy:Create A Room|Create A Room]]
# [[Legacy:Beginners Guide To Mapping|Beginners Guide to Mapping]]

====Getting Around UnrealEd ====

Links to topics about the interface:
* [[Legacy:Toolbox|Toolbox]] covers all the buttons down the left-hand side of the screen
* [[Legacy:Toolbar|Toolbar]] covers the toolbar that runs beneath the menu
* [[Legacy:Right-Click Menu|Right-click menu]] covers all the actions available in the context menus
* [[Legacy:UnrealEd Interface|UnrealEd interface]] has links to the above, and also to reference on all the windows and option dialogs you'll encounter

====Basic Stuff ====
* Creating a mover
* [[Legacy:Making Windows|Making Windows]]
* [[Legacy:Zone Portal|Zone Portal]]s and making zones
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]]: Botpathing is the procedure of adding special marker points to a map. UnrealEd interlinks these to create a network that the bots understand to get around the level. 
* [[Legacy:Building A SkyBox|Building a SkyBox]]
* Making [[Legacy:Corona|Corona]]s

====Don't Believe the Hype ====
* Common [[Legacy:UnrealEd Myths|UnrealEd myths]] exploded

==N00b questions ==

Post questions here, no matter how simple or basic.

; What does &lt;insert abbreviation/acronym/term here&gt; stand for? : See the [[Legacy:Terminology|Terminology]] page.

====From Cyberbass ====

So far I've understood much of the stuff on the site. Some suggestions are:
** Put a screen shot of the Snap to Grid check box. I still can't find it! I have &quot;Show Full Log Window&quot;, &quot;Toggle Vertex Snap&quot;, &quot;Toggle Drag Grid&quot;, &quot;Drag Grid Size&quot;, &quot;Toggle Rotation Grid&quot; and &quot;Maximize Viewport&quot;. No Snap To Grid checkbox listed. A picture of it would help.
:: Tarquin: thanks for your comments. I'll take a screenie of the snap to grid button next time I'm using UEd. :-)

====From Amstelbier ====

Nice site, lots of very usefull info for a starting mapper like me.

Could somebody give me any advice on texturing a terrain? for some reason i don't get the alpha right..

'''ZxAnPhOrIaN:''' The alpha is a pure white image. Also put questions on the [[Legacy:Help Desk|Help Desk]] page. ;)</text>
    </revision>
    <revision>
      <id>1633</id>
      <timestamp>2003-03-15T20:23:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>I actually meant &quot;exploded&quot;, lol</comment>
      <text xml:space="preserve">This page has links to tutorials aimed at specifically at beginners, and other topics that beginners should cover.

Like the rest of the site, it's under constant development. If you are a beginner and do not find these pages suffiencently helpful, then you are invited to do one of the following:
* Add a comment to this page
* Add a comment to the article
* Insert questions into the text of an article
* Improve the article yourself

If you add a page from here please also add a link for it under the section head, eg &quot;Basic Lighting&quot; should get a link somewhere on the [[Legacy:Lighting|Lighting]] section page. Tutorials should also get a link on the [[Legacy:Mapping Lessons|Mapping Lessons]] page.

====First Steps with UnrealEd ====

This is work in progress, intended to be a sequence of tutorials starting from absolute scratch.
# [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]]
# [[Legacy:Create A Room|Create A Room]]
# [[Legacy:Beginners Guide To Mapping|Beginners Guide to Mapping]]

====Getting Around UnrealEd ====

Links to topics about the interface:
* [[Legacy:Toolbox|Toolbox]] covers all the buttons down the left-hand side of the screen
* [[Legacy:Toolbar|Toolbar]] covers the toolbar that runs beneath the menu
* [[Legacy:Right-Click Menu|Right-click menu]] covers all the actions available in the context menus
* [[Legacy:UnrealEd Interface|UnrealEd interface]] has links to the above, and also to reference on all the windows and option dialogs you'll encounter

====Basic Stuff ====
* Creating a mover
* Making [[Legacy:Glass|Glass]]
* [[Legacy:Zone Portal|Zone Portal]]s and making zones
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]]: Botpathing is the procedure of adding special marker points to a map. UnrealEd interlinks these to create a network that the bots understand to get around the level. 
* [[Legacy:Building A SkyBox|Building a SkyBox]]
* Making [[Legacy:Corona|Corona]]s

====Don't Believe the Hype ====
* Common [[Legacy:UnrealEd Myths|UnrealEd myths]] exploded

==N00b questions ==

Post questions here, no matter how simple or basic.

; What does &lt;insert abbreviation/acronym/term here&gt; stand for? : See the [[Legacy:Terminology|Terminology]] page.

====From Cyberbass ====

So far I've understood much of the stuff on the site. Some suggestions are:
** Put a screen shot of the Snap to Grid check box. I still can't find it! I have &quot;Show Full Log Window&quot;, &quot;Toggle Vertex Snap&quot;, &quot;Toggle Drag Grid&quot;, &quot;Drag Grid Size&quot;, &quot;Toggle Rotation Grid&quot; and &quot;Maximize Viewport&quot;. No Snap To Grid checkbox listed. A picture of it would help.
:: Tarquin: thanks for your comments. I'll take a screenie of the snap to grid button next time I'm using UEd. :-)

====From Amstelbier ====

Nice site, lots of very usefull info for a starting mapper like me.

Could somebody give me any advice on texturing a terrain? for some reason i don't get the alpha right..

'''ZxAnPhOrIaN:''' The alpha is a pure white image. Also put questions on the [[Legacy:Help Desk|Help Desk]] page. ;)</text>
    </revision>
    <revision>
      <id>1634</id>
      <timestamp>2003-03-15T21:56:53Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>Ok, cool ;) (weird)</comment>
      <text xml:space="preserve">This page has links to tutorials aimed at specifically at beginners, and other topics that beginners should cover.

Like the rest of the site, it's under constant development. If you are a beginner and do not find these pages suffiencently helpful, then you are invited to do one of the following:
* Add a comment to this page
* Add a comment to the article
* Insert questions into the text of an article
* Improve the article yourself

If you add a page from here please also add a link for it under the section head, eg &quot;Basic Lighting&quot; should get a link somewhere on the [[Legacy:Lighting|Lighting]] section page. Tutorials should also get a link on the [[Legacy:Mapping Lessons|Mapping Lessons]] page.

====First Steps with UnrealEd ====

This is work in progress, intended to be a sequence of tutorials starting from absolute scratch.
# [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]]
# [[Legacy:Create A Room|Create A Room]]
# [[Legacy:Beginners Guide To Mapping|Beginners Guide to Mapping]]

====Getting Around UnrealEd ====

Links to topics about the interface:
* [[Legacy:Toolbox|Toolbox]] covers all the buttons down the left-hand side of the screen
* [[Legacy:Toolbar|Toolbar]] covers the toolbar that runs beneath the menu
* [[Legacy:Right-Click Menu|Right-click menu]] covers all the actions available in the context menus
* [[Legacy:UnrealEd Interface|UnrealEd interface]] has links to the above, and also to reference on all the windows and option dialogs you'll encounter

====Basic Stuff ====
* Creating a mover
* Making [[Legacy:Glass|Glass]]
* [[Legacy:Zone Portal|Zone Portal]]s and making zones
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]]: Botpathing is the procedure of adding special marker points to a map. UnrealEd interlinks these to create a network that the bots understand to get around the level. 
* [[Legacy:Building A SkyBox|Building a SkyBox]]
* Making [[Legacy:Corona|Corona]]s

====Don't Believe the Hype ====
* Common [[Legacy:UnrealEd Myths|UnrealEd myths]] exploded

==N00b questions ==

Post questions here, no matter how simple or basic.

; What does &lt;insert abbreviation/acronym/term here&gt; stand for? : See the [[Legacy:Terminology|Terminology]] page.

====From Cyberbass ====

So far I've understood much of the stuff on the site. Some suggestions are:
** Put a screen shot of the Snap to Grid check box. I still can't find it! I have &quot;Show Full Log Window&quot;, &quot;Toggle Vertex Snap&quot;, &quot;Toggle Drag Grid&quot;, &quot;Drag Grid Size&quot;, &quot;Toggle Rotation Grid&quot; and &quot;Maximize Viewport&quot;. No Snap To Grid checkbox listed. A picture of it would help.
:: Tarquin: thanks for your comments. I'll take a screenie of the snap to grid button next time I'm using UEd. :-)

====From Amstelbier ====

Nice site, lots of very usefull info for a starting mapper like me.

Could somebody give me any advice on texturing a terrain? for some reason i don't get the alpha right..

'''ZxAnPhOrIaN:''' The alpha is a pure white image. Also put questions on the [[Legacy:Help Desk|Help Desk]] page. ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Beginner's Guide To The Edit Mesh Modifier</title>
    <id>575</id>
    <revision>
      <id>1758</id>
      <timestamp>2005-12-18T00:43:11Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">//note: in progress and don't worry, I'll brush up on my wiki markup ;)

===Getting Started with 3D Studio Max Using the Edit Mesh Modifier ===

====Introduction ====

This tutorial was made for [[Legacy:3D Studio Max|3D Studio Max]] 4.x although 95% of it can be applied to earlier versions (2.x and up).

With the advent of [[Legacy:UT2003|UT2003]] and its use of [[Legacy:Static Mesh|static mesh]]es in level design, it's become important for an amateur mapper to know a third party modelling package such as 3dStudio Max if they want to create unigue meshes rather than using the ones that came with the game. [[Legacy:BSP|BSP]] is frowned upon now, and creating meshes in Unrealed and converting them to static meshes is &quot;sub-optimal&quot;. Not to mention creating high poly stuff in the editor is only slightly better than a sharp stick in the eye.

OK, so you've got Max, you've made a box or something, now what? In Max, meshes are manipulated through the use of Modifiers. Let's go through the concept of a Modifier real quick.

====Modifiers ====

Different Modifiers are used to modify a meshes shape, create an animation effect, add random noise to a mesh, map texture coordinates onto a mesh, modify those coordinates, and a multide of other things. Some basic ones are Bend, Twist, Taper, UVW Map (to create the texture coordinates for your meshes) and the most important and the one you will use the most, Edit Mesh. It's the main modifier used to manipulate your mesh on what's called a &quot;Sub-Object&quot; level. The sub-objects of your mesh include vertices (plural for vertex), edges, faces, polygons, and elements. More on these later...

First, let's set up your Modifier sets so that you can easily get to the ones you use most rather than having to select them from a list of the multitude of Modifiers available everytime you use it. Here's how to do it:

'''Configuring Your Modifier Set'''

*Select the Edit panel located near the top right of Max's interface. It' the curved blue symbol. 

[[Image:Legacy_EMT_Fig1.gif|center|Figure 1]]

*Right click where it says Modifier List and select Show Buttons so it's checked. You should now see around 8 buttons beneath where it says Modifier List. This is set by default in Max 3.x and earlier versions so skip this step if you have an older version of Max.

[[Image:Legacy_EMT_Fig2.gif|center|Figure 2]]

*Right click the Modifier List again and select Configure Modifier Sets. A new window will pop up that lets you choose what Modifiers you want to have listed in your buttons area. On the list to the left, scroll down until you see Edit Mesh (keep looking, it's there) and drag and drop it on top of a button to the right in the same window. Any will do, even one that is already assigned a Modifier. You can drag other modifiers over that you may find useful, such as Extrude, Lathe, and Edit Spline which I won't go into in this tutorial. Notice that you can also specify the number of buttons displayed and that you can Save button configurations. Once finished, hit OK. Here's my set:

[[Image:Legacy_EMT_Fig3.gif|center|Figure 3]]

Ok, now let's make a box. Click on the Create tab in the top right corner of Max's interface that has the arrow symbol in it. It's just to the left of the Edit tab. Press the Box button and create your box out in the top view by left clicking the mouse and dragging out a square shape, then moving the mouse to define it's height. You probably already know this part but I'm just trying to cover all the bases so chill out! :)

[[Image:Legacy_EMT_Fig4.gif|center|Figure 4]]

Now go back to the Edit tab while your box is selected and you should see something like this:

[[Image:Legacy_EMT_Fig5.gif|center|Figure 5]]

You can fine tune the box's dimensions by typing them in at the bottom and you can define how many segments it's split into along each axis. Give it a good 6 segments so we'll have plenty to work with. Now hit the Edit Mesh button that you configured earlier. You should see something like this:

[[Image:Legacy_EMT_Fig6.gif|center|Figure 6]]

Next Page: [[Legacy:The Edit Mesh Modifier|The Edit Mesh Modifier]]

                                                                                                                                  

----

[[:Category:Legacy Modeling]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; In progress?
[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1759</id>
      <timestamp>2004-12-23T01:53:28Z</timestamp>
      <contributor>
        <ip>Host02.houseofprinting.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">//note: in progress and don't worry, I'll brush up on my wiki markup ;)

===Getting Started with 3D Studio Max Using the Edit Mesh Modifier ===

====Introduction ====

This tutorial was made for [[Legacy:3D Studio Max|3D Studio Max]] 4.x although 95% of it can be applied to earlier versions (2.x and up).

With the advent of [[Legacy:UT2003|UT2003]] and its use of [[Legacy:Static Mesh|static mesh]]es in level design, it's become important for an amateur mapper to know a third party modelling package such as 3dStudio Max if they want to create unigue meshes rather than using the ones that came with the game. [[Legacy:BSP|BSP]] is frowned upon now, and creating meshes in Unrealed and converting them to static meshes is &quot;sub-optimal&quot;. Not to mention creating high poly stuff in the editor is only slightly better than a sharp stick in the eye.

OK, so you've got Max, you've made a box or something, now what? In Max, meshes are manipulated through the use of Modifiers. Let's go through the concept of a Modifier real quick.

====Modifiers ====

Different Modifiers are used to modify a meshes shape, create an animation effect, add random noise to a mesh, map texture coordinates onto a mesh, modify those coordinates, and a multide of other things. Some basic ones are Bend, Twist, Taper, UVW Map (to create the texture coordinates for your meshes) and the most important and the one you will use the most, Edit Mesh. It's the main modifier used to manipulate your mesh on what's called a &quot;Sub-Object&quot; level. The sub-objects of your mesh include vertices (plural for vertex), edges, faces, polygons, and elements. More on these later...

First, let's set up your Modifier sets so that you can easily get to the ones you use most rather than having to select them from a list of the multitude of Modifiers available everytime you use it. Here's how to do it:

'''Configuring Your Modifier Set'''

*Select the Edit panel located near the top right of Max's interface. It' the curved blue symbol. 

[[Image:Legacy_EMT_Fig1.gif|center|Figure 1]]

*Right click where it says Modifier List and select Show Buttons so it's checked. You should now see around 8 buttons beneath where it says Modifier List. This is set by default in Max 3.x and earlier versions so skip this step if you have an older version of Max.

[[Image:Legacy_EMT_Fig2.gif|center|Figure 2]]

*Right click the Modifier List again and select Configure Modifier Sets. A new window will pop up that lets you choose what Modifiers you want to have listed in your buttons area. On the list to the left, scroll down until you see Edit Mesh (keep looking, it's there) and drag and drop it on top of a button to the right in the same window. Any will do, even one that is already assigned a Modifier. You can drag other modifiers over that you may find useful, such as Extrude, Lathe, and Edit Spline which I won't go into in this tutorial. Notice that you can also specify the number of buttons displayed and that you can Save button configurations. Once finished, hit OK. Here's my set:

[[Image:Legacy_EMT_Fig3.gif|center|Figure 3]]

Ok, now let's make a box. Click on the Create tab in the top right corner of Max's interface that has the arrow symbol in it. It's just to the left of the Edit tab. Press the Box button and create your box out in the top view by left clicking the mouse and dragging out a square shape, then moving the mouse to define it's height. You probably already know this part but I'm just trying to cover all the bases so chill out! :)

[[Image:Legacy_EMT_Fig4.gif|center|Figure 4]]

Now go back to the Edit tab while your box is selected and you should see something like this:

[[Image:Legacy_EMT_Fig5.gif|center|Figure 5]]

You can fine tune the box's dimensions by typing them in at the bottom and you can define how many segments it's split into along each axis. Give it a good 6 segments so we'll have plenty to work with. Now hit the Edit Mesh button that you configured earlier. You should see something like this:

[[Image:Legacy_EMT_Fig6.gif|center|Figure 6]]

Next Page: [[Legacy:The Edit Mesh Modifier|The Edit Mesh Modifier]]

                                                                                                                                  

http://buy-cialis.kucko.com http://buy-levitra.kucko.com http://buy-viagra-online.kucko.com http://buy-viagra.kucko.com http://cheap-cialis.kucko.com http://cheap-levitra.kucko.com http://cheap-viagra.kucko.com http://cialis-online.kucko.com http://cialis-viagra.kucko.com http://cialis.kucko.com http://generic-cialis.kucko.com http://generic-viagra.kucko.com http://levitra-online.kucko.com http://levitra.kucko.com http://order-viagra.kucko.com http://viagra-levitra.kucko.com http://viagra-online.kucko.com http://viagra-prescription.kucko.com http://viagra.kucko.com http://adult-dating.adultfriendfindernow.com http://adult-finder.adultfriendfindernow.com http://adult-friend-find.adultfriendfindernow.com http://adult-friend-finder-coupon.adultfriendfindernow.com http://adult-friend-finder.adultfriendfindernow.com http://adult-friend.adultfriendfindernow.com http://adult-personals.adultfriendfindernow.com http://adult-sex.adultfriendfindernow.com http://adultfriendfinder-com.adultfriendfindernow.com http://adultfriendfinder.adultfriendfindernow.com http://free-adult-personals.adultfriendfindernow.com http://friend-finder.adultfriendfindernow.com http://photo-personals.adultfriendfindernow.com http://sex-personals.adultfriendfindernow.com http://adult-dating.adultfriendsite.com http://adult-finder.adultfriendsite.com http://adult-friend-find.adultfriendsite.com http://adult-friend-finder-coupon.adultfriendsite.com http://adult-friend-finder.adultfriendsite.com http://adult-friend.adultfriendsite.com http://adult-personals.adultfriendsite.com http://adult-sex.adultfriendsite.com http://adultfriendfinder-com.adultfriendsite.com http://adultfriendfinder.adultfriendsite.com http://free-adult-personals.adultfriendsite.com http://friend-finder.adultfriendsite.com http://photo-personals.adultfriendsite.com http://sex-personals.adultfriendsite.com http://adult-dating.dating999.com http://adult-personals.dating999.com http://christian-dating-service.dating999.com http://christian-dating.dating999.com http://dating-personals.dating999.com http://dating-service.dating999.com http://dating-site.dating999.com http://dating-web-site.dating999.com http://dating.dating999.com http://free-dating.dating999.com http://free-personals.dating999.com http://internet-dating-service.dating999.com http://internet-dating.dating999.com http://on-line-dating.dating999.com http://online-dating-service.dating999.com http://online-dating.dating999.com http://personals.dating999.com http://photo-personals.dating999.com http://singles-dating.dating999.com http://buy-cialis.findbestpills.com http://buy-levitra.findbestpills.com http://buy-viagra-online.findbestpills.com http://buy-viagra.findbestpills.com http://cheap-cialis.findbestpills.com http://cheap-levitra.findbestpills.com http://cheap-viagra.findbestpills.com http://cialis-online.findbestpills.com http://cialis-viagra.findbestpills.com http://cialis.findbestpills.com http://generic-cialis.findbestpills.com http://generic-viagra.findbestpills.com http://levitra-online.findbestpills.com http://levitra.findbestpills.com http://order-viagra.findbestpills.com http://viagra-levitra.findbestpills.com http://viagra-online.findbestpills.com http://viagra-prescription.findbestpills.com http://viagra.findbestpills.com http://adipex-online.diet-pills-now.net http://adipex.diet-pills-now.net http://buy-adipex.diet-pills-now.net http://buy-didrex.diet-pills-now.net http://buy-phentermine.diet-pills-now.net http://buy-propecia.diet-pills-now.net http://buy-soma.diet-pills-now.net http://buy-tramadol.diet-pills-now.net http://buy-ultram.diet-pills-now.net http://carisoprodol.diet-pills-now.net http://cheap-adipex.diet-pills-now.net http://cheap-didrex.diet-pills-now.net http://cheap-phentermine.diet-pills-now.net http://cheap-propecia.diet-pills-now.net http://cheap-soma.diet-pills-now.net http://cheap-tramadol.diet-pills-now.net http://didrex-online.diet-pills-now.net http://didrex.diet-pills-now.net http://order-phentermine.diet-pills-now.net http://phentermine-online.diet-pills-now.net http://phentermine-prescription.diet-pills-now.net http://phentermine.diet-pills-now.net http://propecia.diet-pills-now.net http://purchase-phentermine.diet-pills-now.net http://soma-online.diet-pills-now.net http://soma.diet-pills-now.net http://tramadol-online.diet-pills-now.net http://tramadol.diet-pills-now.net http://ultram-online.diet-pills-now.net http://ultram.diet-pills-now.net http://adult-sex-toys.fabuloussextoys.com http://adult-toy-store.fabuloussextoys.com http://adult-toys.fabuloussextoys.com http://anal-toy.fabuloussextoys.com http://big-dildo.fabuloussextoys.com http://brutal-dildo.fabuloussextoys.com http://dildo-vibrator.fabuloussextoys.com http://dildo.fabuloussextoys.com http://huge-dildo.fabuloussextoys.com http://jack-rabbit-vibrator.fabuloussextoys.com http://rabbit-vibrator.fabuloussextoys.com http://sex-movie.fabuloussextoys.com http://sex-shop.fabuloussextoys.com http://sex-toy-shop.fabuloussextoys.com http://sex-toy-store.fabuloussextoys.com http://sex-toy.fabuloussextoys.com http://sex-toys.fabuloussextoys.com http://sex-videos.fabuloussextoys.com http://vibrator.fabuloussextoys.com http://vibrators.fabuloussextoys.com</text>
    </revision>
    <revision>
      <id>1760</id>
      <timestamp>2004-12-23T03:46:57Z</timestamp>
      <contributor>
        <ip>C-24-18-76-107.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">//note: in progress and don't worry, I'll brush up on my wiki markup ;)

===Getting Started with 3D Studio Max Using the Edit Mesh Modifier ===

====Introduction ====

This tutorial was made for [[Legacy:3D Studio Max|3D Studio Max]] 4.x although 95% of it can be applied to earlier versions (2.x and up).

With the advent of [[Legacy:UT2003|UT2003]] and its use of [[Legacy:Static Mesh|static mesh]]es in level design, it's become important for an amateur mapper to know a third party modelling package such as 3dStudio Max if they want to create unigue meshes rather than using the ones that came with the game. [[Legacy:BSP|BSP]] is frowned upon now, and creating meshes in Unrealed and converting them to static meshes is &quot;sub-optimal&quot;. Not to mention creating high poly stuff in the editor is only slightly better than a sharp stick in the eye.

OK, so you've got Max, you've made a box or something, now what? In Max, meshes are manipulated through the use of Modifiers. Let's go through the concept of a Modifier real quick.

====Modifiers ====

Different Modifiers are used to modify a meshes shape, create an animation effect, add random noise to a mesh, map texture coordinates onto a mesh, modify those coordinates, and a multide of other things. Some basic ones are Bend, Twist, Taper, UVW Map (to create the texture coordinates for your meshes) and the most important and the one you will use the most, Edit Mesh. It's the main modifier used to manipulate your mesh on what's called a &quot;Sub-Object&quot; level. The sub-objects of your mesh include vertices (plural for vertex), edges, faces, polygons, and elements. More on these later...

First, let's set up your Modifier sets so that you can easily get to the ones you use most rather than having to select them from a list of the multitude of Modifiers available everytime you use it. Here's how to do it:

'''Configuring Your Modifier Set'''

*Select the Edit panel located near the top right of Max's interface. It' the curved blue symbol. 

[[Image:Legacy_EMT_Fig1.gif|center|Figure 1]]

*Right click where it says Modifier List and select Show Buttons so it's checked. You should now see around 8 buttons beneath where it says Modifier List. This is set by default in Max 3.x and earlier versions so skip this step if you have an older version of Max.

[[Image:Legacy_EMT_Fig2.gif|center|Figure 2]]

*Right click the Modifier List again and select Configure Modifier Sets. A new window will pop up that lets you choose what Modifiers you want to have listed in your buttons area. On the list to the left, scroll down until you see Edit Mesh (keep looking, it's there) and drag and drop it on top of a button to the right in the same window. Any will do, even one that is already assigned a Modifier. You can drag other modifiers over that you may find useful, such as Extrude, Lathe, and Edit Spline which I won't go into in this tutorial. Notice that you can also specify the number of buttons displayed and that you can Save button configurations. Once finished, hit OK. Here's my set:

[[Image:Legacy_EMT_Fig3.gif|center|Figure 3]]

Ok, now let's make a box. Click on the Create tab in the top right corner of Max's interface that has the arrow symbol in it. It's just to the left of the Edit tab. Press the Box button and create your box out in the top view by left clicking the mouse and dragging out a square shape, then moving the mouse to define it's height. You probably already know this part but I'm just trying to cover all the bases so chill out! :)

[[Image:Legacy_EMT_Fig4.gif|center|Figure 4]]

Now go back to the Edit tab while your box is selected and you should see something like this:

[[Image:Legacy_EMT_Fig5.gif|center|Figure 5]]

You can fine tune the box's dimensions by typing them in at the bottom and you can define how many segments it's split into along each axis. Give it a good 6 segments so we'll have plenty to work with. Now hit the Edit Mesh button that you configured earlier. You should see something like this:

[[Image:Legacy_EMT_Fig6.gif|center|Figure 6]]

Next Page: [[Legacy:The Edit Mesh Modifier|The Edit Mesh Modifier]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Beginners Guide To Mapping</title>
    <id>567</id>
    <revision>
      <id>1741</id>
      <timestamp>2007-10-14T19:47:21Z</timestamp>
      <contributor>
        <ip>74.167.109.165</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">As far as I could tell, there was no single page to introduce a beginner to mapping with UnrealEd. I am still a beginner myself, so I figure I might be able to write a good beginner's tutorial (that or waste a lot of my time :D).

'''Tarquin:'''  There's [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] and [[Legacy:Create A Room|Create a room]], which have been very &quot;under construction&quot; for a long, long time. I've started laying down an overview of the concepts involved in map-making on [[Legacy:Unreal Geometry|Unreal Geometry]], but, again, it's a rough draft. You're free to merge things if you like, or keep them as seperate articles covering different aspects from different angles. It's been said that different people want different styles of tutorial. I like the idea of a a &quot;complete map in 20 minutes&quot; page.

'''Tarquin:'''  Suggestions for a rename, since at the mo this page clashes a bit with... [[Legacy:Mapping Lessons|Mapping Lessons]] and [[Legacy:Beginner Topics|Beginner Topics]]
* [[Legacy:A Map In Minutes|A map in minutes]]
* [[Legacy:My First Map|My First Map]] &amp;ndash; very Microsoft!

'''musicalglass:'''  I think this should be &quot;The Complete Guide to Mapping&quot; the final repository for all lenghthy explainations in depth and [[Legacy:Create A Room|Create A Room]] should be what is now [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Functional Map]] simple and to the point. For more info go here.

'''Tarquin:''' Well... we'd more or less decided to scrap this page and have its contents split into several [[Legacy:Mapping Lessons|Mapping Lessons]] pages. Just one of those things I hadn't got round to yet :(

==Overview==

===Goal===

I will teach you how to build a simple map from scratch, including [[Legacy:Teleporter|teleporter]]s, [[Legacy:Making Liquids (UT)|liquid]]s, [[Legacy:Making Lifts|lifts]], [[Legacy:SkyBox|SkyBox]]es, [[Legacy:Making Doors|doors]], and [[Legacy:Making Windows|glass]].

===Assumptions===

I assume you have at least briefly played UT, know how to operate a PC, and know what cheese is. :-)

==Let's get started!==

The idea here is to demonstrate with utmost simplicity, how the construction process works. Assuming that you have already opened UnrealEd and are building with a NEW level. (Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; File &gt; New.)

A window will open, covering your screen with several confusing toolbars and windows.

===The views ===

The windows are like views into your world. The one on the top left is like a blueprint, or top-down view of your map. The one on the top-right is a frontal view of your map, and the bottom right one is a side view. All three of the views I mentioned previously are 2D. They show no perspective and always are focused in one direction. The bottom-left view is the 3D view, similar to what you might see in UT with software rendering on.

====Moving around in the 2D views====
* Drag the mouse with either mouse button held down to scroll through the view.
* Drag the mouse with both buttons held down if you want to zoom in or out.

====Moving around in the 3D view====
* Drag the mouse with the left mouse button held down to move forward and turn left or right.
* Drag the mouse with the right mouse button held down to look up and down and turn left or right.
* Drag the mouse with both mouse buttons held down to move up and down and &quot;sidestep&quot; left or right.

====More on viewports====
* [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]
* [[Legacy:Mouse Control|Mouse control]]

===The Toolbars===

You will notice several toolbars, also. Many of the buttons in these toolbars are irrelevant to you at this point, so I will explain just a few now, and more as we progress farther into this tutorial.

====The top toolbar====

[[Image:Legacy_interface.toolbar.png|]]

The toolbar at the top of the screen has the following different buttons in it. (Sorry, this is a rather cheap ripoff of other people's graphics :D I'm just too lazy to make my own. Thanks guys!) You don't really need to worry about the buttons with an asterisk (*) next to them at this point. Perhaps I'll explain them better in a future tutorial. (full list on [[Legacy:Toolbar|toolbar]])

# This group of buttons contains the omnipresent '''New''', '''Open''', and '''Save''' buttons which work just like in most other programs.
# This group of buttons has odd icons, but simply represent the '''Undo''' and '''Redo''' actions.
# '''''Search for Actors'''''*
# '''Actor Browser''': This button lets you browse through all the actors, so you can place them in your level. I'll explain it in more detail later on.
# '''''Group Browser'''''*
# '''''Music Browser'''''*
# '''''Sound Browser'''''*
# '''Texture Browser''': This button lets you browse through all the textures, so you can use them in your level. I'll explain it in more detail later on as well.
# '''''Mesh Browser'''''*
# '''''2D Shape Editor'''''*
# '''''UnrealScript Editor'''''*
# '''''Actor Properties'''''*
# '''''Texture Properties'''''*
# '''Build Geometry''': This builds all the geometry in your map, so the game knows what's what as far as surfaces and rooms go. (That's a very basic way of putting it, but don't worry abou it. My advice is to let UT do all the hard work for you.)
# '''Build Lighting''': Clicking this button will build all the dynamic lighting. Basically this makes your level beautiful. :-)
# '''''Build Paths'''''*
# '''Build All''': Clicking this button is the same as clicking buttons 14, 15, and 16. It builds all the geometry, lighting, and paths in your level.
# '''''Build Settings'''''*
# '''Play Map!''': After you have built and saved your level, you can click this magic button to test out your map in the game. It automagically loads UT and then your level, with a few bots thrown in for good measure.

====The side toolbars====

see [[Legacy:Toolbox|toolbox]]

====The viewport toolbars====

see [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]

====More on toolbars====

See [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==OK, enough of that crap! I wanna make a level!==

Fair enough. Everyone always wants to get started right away. I did, tried some crappy tutorials, got confused, read more, got more confused, and gradually began to understand. ;-)

Imagine the world to be a big piece of cheese. &quot;Why cheese, Ars,&quot; you ask. Well, because
# I like cheese. It smells good, tastes good, and even better&amp;ndash;it's good for you!
# The world in UT is sort of like a big, solid substance. I could of picked clay, but that would be boring, and Jello is clear.
# Cheese sometimes grows weird moldy stuff on it, which is cool in a gross sort of way.

Ah! How the hell did I get sidetracked onto cheese? Well, think about if you had a universe of cheese. How would you make a room in it? You'd carve it out&amp;ndash;in other words, you'd '''subtract''' it. You could '''add''' cheese to that room if you wanted to have stairs or doors or lifts or whatever.

UT is the same way. To make a room in UT you need to subtract it from the world.

===Now, to make that room...===

You can think of brushes being 3-dimensional shapes that create the world like Lego blocks. In the toolbox, find the 3rd group of buttons; all greenish shapes (see picture). This is the brushbuilders group.

A room will be created initially with a single brush, and you can use any shape or primitive. The simplest is the cube mentioned above. So, left click the cube brushbuilder at the top of the left column, this produces the cube with a default height, length, and breadth (256 by 256 by 256 Unreal units). Ok,...for reference the actual TournamentPlayer height is about 80 or 85 world units high.

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

You should see a shape made of dotted red lines in the UnrealEd Viewports: a square in the orthogonal viewports and a cube in the 3D viewport. This is the red builder brush. It's your cookie-cutter. It can take on any shape: try clicking on any of the brushbuilder buttons. 

The red builder brush isn't actually a part of the Unreal world. (This is where the cookie-cutting analogy starts to break down, unfortunately). The RBB is like a blueprint of a brush: you make it into any shape you like, and then tell UnrealEd &quot;I'll have a brush of this shape please&quot;.

Now, right click the button for the cube brushbuilder. A properties dialogue window pops up that allows you to enter the actual values for the height, length, and breadth of the cube. Make some alterations: generally using numbers that correspond the grid dimensions works best with the Unreal Engine, so it is suggested that you use numbers like, 8, 16, 32, 64, 128, 256, 512, and 1024 as your cube dimensions. Try these: Height &gt; 512, Length &gt; 512, and Breadth &gt; 1024. In any of the 2D (Top, Front, or Side), or, 3D views (Wireframe, Textured, or Dynamic Light) you will see the [[Legacy:Red Builder Brush|red builder brush]] shape alter to the dimensions that you have selected. Maximize the Textured 3D view so that it encompasses the entire screen. The Total Blackness with the pale blue grid lines in the view is considered to be ''solid'' by the Unreal Engine. It's just an abstract notion, but, gives us a logical order for our brush operations.

====Why 512?====

This is approximately 5 times as tall as a human. See [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].

Click [[Legacy:Build|build]] and close the window.

'''pingz:''' According to that link, 1 foot = 16 UU.  So 512uu is 32 feet tall or a little more than 5 times the heigh of a 6 foot tall human ( 5 1/3 to be exact ).

===OK, now I have a red cube in the world. What next?===

You can move the cube around in one of the 2D views by holding down CTRL and dragging. This cube is the '''active brush'''. Most mappers call it the [[Legacy:Red Builder Brush|red builder brush]], and that name is used throughout this site. We have to subtract it to make it into a room. Remember my crappy cheese analogy?

'''Tarquin:'''  I've removed the &quot;active brush&quot; page, as there's not much point in two adjacent links going to the same place. [[Legacy:Terminology|Terminology]] gives the term too and sends to the RBB page. You're right to give it the correct name, but out of habit at BuF we call it the RBB ;) BTW, the cheese analogy is good. I always say clay, but cheese is tastier.

====How do I subtract it?====

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

We are going to subtract the Cube Brush from that ''solid world'' and create open space for our game level. This defines the collision properties of the [[Legacy:CSG|CSG]], or Constructive Solid Geometry so that our players will interact in a realistic manner with the world we create. There are three ways to Subtract a Brush:
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Subtract.
* enter the command '''brush subtract''' in the [[Legacy:UnrealEd Console|UnrealEd Console]] box at the bottom of the screen.
* you can press the subtract Brush button in the Brush operations section of the toolbox at the left of the Editor screen.(It's #2. If you hold your cursor over it it says &quot;Subtract&quot; in the ToolTip.)

When you do this, the Editor will create the rectangular shape with a default texture, which is a hideous bubbly white, two dimensional visible wall pattern. If we had opened the [[Legacy:Texture Browser|Texture Browser]], and selected any texture before subtracting that cube brush, the resultant room would have that selected texture showing on all six sides (ceiling, walls and floor).

You have now created another brush (Confusing, huh?). This brush, however, is not the active brush. It really exists in the world, as a room. To keep from confusing you throughout the rest of this tutorial, when I say &quot;brush&quot; you can interpret it as &quot;red builder brush&quot;.

Look in your 3D view. Practice flying around in there, and fly into your new room. It's pretty ugly right now. To improve it, we'll add custom textures and dynamic lighting.

====More on Geometry====
* [[Legacy:Unreal Geometry|Unreal Geometry]]
* [[Legacy:CSG|CSG]]
* [[Legacy:Brushbuilders|Brushbuilders]]
* [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]

==Textures==

When you create a new room in UnrealEd, it automatically picks an ugly texture for you (how thoughtful!). You probably would prefer to use your own textures.

===Browsing through the textures===

This is pretty simple. Just click the texture browser button in the top toolbar (#8). A window will pop up, maybe with some textures already in it. This window has yet another toolbar in it. For now, just click the open button (like a folder). The open file dialog box will appear. Look through the list of texture packages. Pick one you like. For starting out, I recommend the &quot;Ancient&quot; texture pack. It has lots of cool textures.

See how there's two popup menus in the texture browser? The one on top shows the available packages of textures, and the bottom one shows the different texture classes. Select &quot;walls&quot; from the second popup menu and pick a texture you want for the walls in your room. You can now close the texture browser, or minimize it&amp;ndash;whichever you prefer.

===Applying the texture===

Go to the 3D view. You should have screwed around enough by now to understand the gist of how to fly around. If you haven't, I suggest you try it now.

====I'm done screwing around!====

Good. Fly over to the wall you want to put your newly selected texture on. ALT-click the wall. This will place your texture there instantly. Go ahead and place our texture all over the the walls in your room. When you're ready to move on, you should know how to texture the ceiling and floor with the texture of your choice. If not, here's...

====A brief Recap====
* Open the texture browser.
* Open the texture package you want, unless you already have.
* Find a good texture, select it, and close the browser.
* Find the surface you wish to texture in the 3D view.
* ALT-click it.

====More on Textures====
* [[Legacy:Using Textures|Using Textures]]
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Decorating Rooms With Textures|Decorating Rooms with Textures]]
* [[Legacy:Texture (UT)|Texture (UT)]]
* [[Legacy:Texture Package|Texture Package]]

==Lighting==

Now that you've had fun exploring and texturing your room (ha!), you can add some lighting. Right click somewhere on the ceiling in the 3D view. The [[Legacy:Surface Context Menu|surface context menu]] will pop up. Pick &quot;Add light here&quot; to add a light. You will see an ugly torch appear. Don't worry, the torch won't show up in the game&amp;ndash;it just helps you see where the light is in the editor. Ctrl-drag your light around if you want.

===More on Lighting===
* [[Legacy:Lighting Basics|Lighting Basics]]
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Shadows|Shadows]]
* [[Legacy:Light (UT)|Light (UT)]]s

==Let's add the playerstart and go!==

Pushy, are ye? OK, click on the pawn button (#4) in the top toolbar. This brings up the [[Legacy:Actor Classes Browser|actor classes browser]] window. Click on the plus next to [[Legacy:NavigationPoint|NavigationPoint]], and then select the item &quot;[[Legacy:PlayerStart|PlayerStart]].&quot;

Open the 3D view and fly to a position where you can see the floor of your room. Right-click it and select &quot;Add PlayerStart Here&quot; from the [[Legacy:Surface Context Menu|surface context menu]].

===Build the level===

Click icon #17 in the top toolbar to build your level.

(See [[Legacy:Map Build Errors|Map Build Errors]] if you have a problem.)

===Playtest the Level!===

Now, you can click on the joystick button (#19). This will open Unreal Tournament and allow you to play your level for the first time.

==More rooms==

Kind of boring with only one room, isn't it? You probably experienced [[Legacy:Spawndeath|spawndeath]], for one thing. You obviously need more rooms and playerstarts.

If you click on your red builder brush and then ctrl-drag it to somewhere right of your first room, then pick subtract, you will create another room like the first. To connect the two you need to create a hallway between them.

Do this by right-clicking the cube icon again and typing in the values 128 for height, width and breadth. This creates a small hallway. ctrl drag the brush and your rooms around so the hallway is in the right place, and pick subtract.

Check it out in the 3D view. Move your hallway and/or rooms around until it is just how you like it. Now you can add more PlayerStarts, lights, and maybe retexture the hallway and rooms.

===It sucks that I have to move all my rooms around just to make a hallway!===

Stop complaining. All you have to do is make a hallway that is slightly too big, position it so it overlaps both rooms you want connected, and click the Intersect button.

====It didn't work!====

Well, that just changes the shape of the brush. You also need to subtract the new brush. Cut it out of the cheese, remember? Also, if you screwed up, it could be that you didn't overlap both rooms. The brush shouldn't be too big to begin with, either. make sure it doesn't poke out of the other side of one of the rooms or you will get unpleasant results.

====Cool. Now I have 2 rooms. But my map still sucks!====

Read on, and quit yer whining, would ya? Thanks :-) Why don't you add more rooms? Just connect more rooms to the first like you did before, and add lighting and textures.

==Let's add some pickups!==

Why not? This is a particularly easy step. All pickups are actors. Remember our good ol' friend, the PlayerStart? It was an actor too, right?

===Weapons and Ammo===

Go back to the Actor Class Browser. Remember, it's button #4 in the top toolbar. Expand the &quot;Inventory&quot; class, then the &quot;Weapon&quot; class, then the &quot;TournamentWeapon&quot; class. Often you'll see this referred to like this:

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]]}}

You will see several choices. Pick a weapon you want in your map, and close or minimize the Actor class browser.

Right-click somewhere in the 3D view and pick &quot;Add &lt;&lt;the weapon you picked&gt;&gt; here.&quot; CTRL-drag it to where you want it in the 2D views. Repeat these steps with whatever weapons you want.

====What about ammo?====

Yes, this is confusing, because ammo is not in the same place as the weapons. Ammo is in

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]]}}

Place ammo the same way you would place weapons.

====More about Weapons and Ammo====
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:TournamentWeapon|TournamentWeapon]]
* [[Legacy:Ammo (UT)|Ammo (UT)]]
* [[Legacy:TournamentAmmo|TournamentAmmo]]

===Health and Powerups===

====More about Health and Powerups====

==Liquids==

===How to make Liquids===

OK, all you need to do is subtract an area that will be filled with the liquid you want, whether it's water, lava, slime, or tar.

Now, create a [[Legacy:Sheet|sheet]] brush that is slightly bigger than your water pit. The sheet brush button is the top-right one in the brush toolbar. Align the brush in the 2D viewports so it completely seals off the liquid filled &quot;room&quot;.

Now, to add it to the room! Click the &quot;Add Special Brush&quot; button (#5 in the &quot;Brush Operations&quot; toolbar, as seen below.) From the popup menu, choose &quot;Water&quot; (Choose it even if you want lava, slime, or tar). Also, check the &quot;2-Sided&quot; box. Click OK, and then Close.

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

Congratulations! You're almost there! Now, you have to decide which type of liquid you want.

====Water====

You can find a nice water texture in the ''FireEng'' &gt; ''Water'' texture package. It has great ripply effects and everything. After you have applied the water texture, go to the Actor Class Browser. Select

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:WaterZone|WaterZone]]}}

and stick it inside of the area that is to be filled with water.

====Lava====

Lava is done the same exact way as water, except that you should pick a good lava texture and place a

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:LavaZone|LavaZone]]}}

in the lava pit instead. A nice lava texture can be found in the ''FireEng'' &gt; ''lava'' package.

====Slime====

Slime is done just like lava and water, except you use a, you guessed it, [[Legacy:SlimeZone|SlimeZone]]. You can find a good slime texture in the ''Liquids'' package. You'll also find a few other nice water textures.

====Tar====

Tar, in case you were wondering, is not dangerous to the player, per se. However, it slows down the player's movement greatly. It is done the same way as all of the above except with a [[Legacy:TarZone|TarZone]] actor. A good tar texture is in the ''Liquids'' package as well.

===More on Liquids===
* [[Legacy:Making Liquids (UT)|Making Liquids (UT)]]

==Discussion==

'''Ars-Magna:''' I have a lot more to do on this, but I'm too tired to do it tonight. :-) Hope this will be able to help someone!

'''Sobiwan:''' I combed over this page in comparison with [[Legacy:Mapping Lessons|Mapping Lessons]] and have determined that this page is redundant.  I say (Delete Me).

'''Wormbo:''' Really delete this now?

'''SoH_Ghost3021:''' It looks good to me!

'''dwjp:''' This is ace... tried the &quot;Mapping lessons&quot; got well confused this makes more sense for a starter.  Excellent work...using the demo version mind so not all the bits are the same but works never-the-less....love the cheese!

'''SuperApe:''' Someone needs to make a decision on this.  For now, I've removed the Delete Me tag and added Refactor Me and To Do tags.  Check and compare with [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] and [[Legacy:Create A Room|Create a room]].  I can't tell if the language used here is &quot;user friendly&quot; or just needlessly unprofessional and sloppy.  The organization sure needs a lot of work.  Did a little markup.

'''Tgusagalpa:'''Everything here is repetitive.  Should I say [[:Category:Legacy Delete Me]]?

'''New Guy:''' Considering this is the first week I've ever touched mapping in UT, this portion of beyond unreal has been the single most helpful to me. Please don't delete this! ( I apologize for editing, but I really don't want this to be pitched out )

----

[[:Category:Legacy To Do]] &amp;ndash; If not refactored, really go through this and make it a) for beginners, b) look like other tutorials, c) link up, d) update for UT200x, e) edit down to a manageable size ''(i.e., this doesn't need to cover everything under the sun, just the beginner stuff)''

[[:Category:Legacy Refactor Me]] &amp;ndash; If not seriously worked on, refactor into [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Create A Room|Create a room]] or maybe [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]], then remove.
[[Category:Legacy Delete Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1742</id>
      <timestamp>2007-01-18T21:22:24Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <minor/>
      <comment>Added link to [[Map Build Errors]]</comment>
      <text xml:space="preserve">As far as I could tell, there was no single page to introduce a beginner to mapping with UnrealEd. I am still a beginner myself, so I figure I might be able to write a good beginner's tutorial (that or waste a lot of my time :D).

'''Tarquin:'''  There's [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] and [[Legacy:Create A Room|Create a room]], which have been very &quot;under construction&quot; for a long, long time. I've started laying down an overview of the concepts involved in map-making on [[Legacy:Unreal Geometry|Unreal Geometry]], but, again, it's a rough draft. You're free to merge things if you like, or keep them as seperate articles covering different aspects from different angles. It's been said that different people want different styles of tutorial. I like the idea of a a &quot;complete map in 20 minutes&quot; page.

'''Tarquin:'''  Suggestions for a rename, since at the mo this page clashes a bit with... [[Legacy:Mapping Lessons|Mapping Lessons]] and [[Legacy:Beginner Topics|Beginner Topics]]
* [[Legacy:A Map In Minutes|A map in minutes]]
* [[Legacy:My First Map|My First Map]] &amp;ndash; very Microsoft!

'''musicalglass:'''  I think this should be &quot;The Complete Guide to Mapping&quot; the final repository for all lenghthy explainations in depth and [[Legacy:Create A Room|Create A Room]] should be what is now [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Functional Map]] simple and to the point. For more info go here.

'''Tarquin:''' Well... we'd more or less decided to scrap this page and have its contents split into several [[Legacy:Mapping Lessons|Mapping Lessons]] pages. Just one of those things I hadn't got round to yet :(

==Overview==

===Goal===

I will teach you how to build a simple map from scratch, including [[Legacy:Teleporter|teleporter]]s, [[Legacy:Making Liquids (UT)|liquid]]s, [[Legacy:Making Lifts|lifts]], [[Legacy:SkyBox|SkyBox]]es, [[Legacy:Making Doors|doors]], and [[Legacy:Making Windows|glass]].

===Assumptions===

I assume you have at least briefly played UT, know how to operate a PC, and know what cheese is. :-)

==Let's get started!==

The idea here is to demonstrate with utmost simplicity, how the construction process works. Assuming that you have already opened UnrealEd and are building with a NEW level. (Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; File &gt; New.)

A window will open, covering your screen with several confusing toolbars and windows.

===The views ===

The windows are like views into your world. The one on the top left is like a blueprint, or top-down view of your map. The one on the top-right is a frontal view of your map, and the bottom right one is a side view. All three of the views I mentioned previously are 2D. They show no perspective and always are focused in one direction. The bottom-left view is the 3D view, similar to what you might see in UT with software rendering on.

====Moving around in the 2D views====
* Drag the mouse with either mouse button held down to scroll through the view.
* Drag the mouse with both buttons held down if you want to zoom in or out.

====Moving around in the 3D view====
* Drag the mouse with the left mouse button held down to move forward and turn left or right.
* Drag the mouse with the right mouse button held down to look up and down and turn left or right.
* Drag the mouse with both mouse buttons held down to move up and down and &quot;sidestep&quot; left or right.

====More on viewports====
* [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]
* [[Legacy:Mouse Control|Mouse control]]

===The Toolbars===

You will notice several toolbars, also. Many of the buttons in these toolbars are irrelevant to you at this point, so I will explain just a few now, and more as we progress farther into this tutorial.

====The top toolbar====

[[Image:Legacy_interface.toolbar.png|]]

The toolbar at the top of the screen has the following different buttons in it. (Sorry, this is a rather cheap ripoff of other people's graphics :D I'm just too lazy to make my own. Thanks guys!) You don't really need to worry about the buttons with an asterisk (*) next to them at this point. Perhaps I'll explain them better in a future tutorial. (full list on [[Legacy:Toolbar|toolbar]])

# This group of buttons contains the omnipresent '''New''', '''Open''', and '''Save''' buttons which work just like in most other programs.
# This group of buttons has odd icons, but simply represent the '''Undo''' and '''Redo''' actions.
# '''''Search for Actors'''''*
# '''Actor Browser''': This button lets you browse through all the actors, so you can place them in your level. I'll explain it in more detail later on.
# '''''Group Browser'''''*
# '''''Music Browser'''''*
# '''''Sound Browser'''''*
# '''Texture Browser''': This button lets you browse through all the textures, so you can use them in your level. I'll explain it in more detail later on as well.
# '''''Mesh Browser'''''*
# '''''2D Shape Editor'''''*
# '''''UnrealScript Editor'''''*
# '''''Actor Properties'''''*
# '''''Texture Properties'''''*
# '''Build Geometry''': This builds all the geometry in your map, so the game knows what's what as far as surfaces and rooms go. (That's a very basic way of putting it, but don't worry abou it. My advice is to let UT do all the hard work for you.)
# '''Build Lighting''': Clicking this button will build all the dynamic lighting. Basically this makes your level beautiful. :-)
# '''''Build Paths'''''*
# '''Build All''': Clicking this button is the same as clicking buttons 14, 15, and 16. It builds all the geometry, lighting, and paths in your level.
# '''''Build Settings'''''*
# '''Play Map!''': After you have built and saved your level, you can click this magic button to test out your map in the game. It automagically loads UT and then your level, with a few bots thrown in for good measure.

====The side toolbars====

see [[Legacy:Toolbox|toolbox]]

====The viewport toolbars====

see [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]

====More on toolbars====

See [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==OK, enough of that crap! I wanna make a level!==

Fair enough. Everyone always wants to get started right away. I did, tried some crappy tutorials, got confused, read more, got more confused, and gradually began to understand. ;-)

Imagine the world to be a big piece of cheese. &quot;Why cheese, Ars,&quot; you ask. Well, because
# I like cheese. It smells good, tastes good, and even better&amp;ndash;it's good for you!
# The world in UT is sort of like a big, solid substance. I could of picked clay, but that would be boring, and Jello is clear.
# Cheese sometimes grows weird moldy stuff on it, which is cool in a gross sort of way.

Ah! How the hell did I get sidetracked onto cheese? Well, think about if you had a universe of cheese. How would you make a room in it? You'd carve it out&amp;ndash;in other words, you'd '''subtract''' it. You could '''add''' cheese to that room if you wanted to have stairs or doors or lifts or whatever.

UT is the same way. To make a room in UT you need to subtract it from the world.

===Now, to make that room...===

You can think of brushes being 3-dimensional shapes that create the world like Lego blocks. In the toolbox, find the 3rd group of buttons; all greenish shapes (see picture). This is the brushbuilders group.

A room will be created initially with a single brush, and you can use any shape or primitive. The simplest is the cube mentioned above. So, left click the cube brushbuilder at the top of the left column, this produces the cube with a default height, length, and breadth (256 by 256 by 256 Unreal units). Ok,...for reference the actual TournamentPlayer height is about 80 or 85 world units high.

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

You should see a shape made of dotted red lines in the UnrealEd Viewports: a square in the orthogonal viewports and a cube in the 3D viewport. This is the red builder brush. It's your cookie-cutter. It can take on any shape: try clicking on any of the brushbuilder buttons. 

The red builder brush isn't actually a part of the Unreal world. (This is where the cookie-cutting analogy starts to break down, unfortunately). The RBB is like a blueprint of a brush: you make it into any shape you like, and then tell UnrealEd &quot;I'll have a brush of this shape please&quot;.

Now, right click the button for the cube brushbuilder. A properties dialogue window pops up that allows you to enter the actual values for the height, length, and breadth of the cube. Make some alterations: generally using numbers that correspond the grid dimensions works best with the Unreal Engine, so it is suggested that you use numbers like, 8, 16, 32, 64, 128, 256, 512, and 1024 as your cube dimensions. Try these: Height &gt; 512, Length &gt; 512, and Breadth &gt; 1024. In any of the 2D (Top, Front, or Side), or, 3D views (Wireframe, Textured, or Dynamic Light) you will see the [[Legacy:Red Builder Brush|red builder brush]] shape alter to the dimensions that you have selected. Maximize the Textured 3D view so that it encompasses the entire screen. The Total Blackness with the pale blue grid lines in the view is considered to be ''solid'' by the Unreal Engine. It's just an abstract notion, but, gives us a logical order for our brush operations.

====Why 512?====

This is approximately 5 times as tall as a human. See [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].

Click [[Legacy:Build|build]] and close the window.

'''pingz:''' According to that link, 1 foot = 16 UU.  So 512uu is 32 feet tall or a little more than 5 times the heigh of a 6 foot tall human ( 5 1/3 to be exact ).

===OK, now I have a red cube in the world. What next?===

You can move the cube around in one of the 2D views by holding down CTRL and dragging. This cube is the '''active brush'''. Most mappers call it the [[Legacy:Red Builder Brush|red builder brush]], and that name is used throughout this site. We have to subtract it to make it into a room. Remember my crappy cheese analogy?

'''Tarquin:'''  I've removed the &quot;active brush&quot; page, as there's not much point in two adjacent links going to the same place. [[Legacy:Terminology|Terminology]] gives the term too and sends to the RBB page. You're right to give it the correct name, but out of habit at BuF we call it the RBB ;) BTW, the cheese analogy is good. I always say clay, but cheese is tastier.

====How do I subtract it?====

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

We are going to subtract the Cube Brush from that ''solid world'' and create open space for our game level. This defines the collision properties of the [[Legacy:CSG|CSG]], or Constructive Solid Geometry so that our players will interact in a realistic manner with the world we create. There are three ways to Subtract a Brush:
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Subtract.
* enter the command '''brush subtract''' in the [[Legacy:UnrealEd Console|UnrealEd Console]] box at the bottom of the screen.
* you can press the subtract Brush button in the Brush operations section of the toolbox at the left of the Editor screen.(It's #2. If you hold your cursor over it it says &quot;Subtract&quot; in the ToolTip.)

When you do this, the Editor will create the rectangular shape with a default texture, which is a hideous bubbly white, two dimensional visible wall pattern. If we had opened the [[Legacy:Texture Browser|Texture Browser]], and selected any texture before subtracting that cube brush, the resultant room would have that selected texture showing on all six sides (ceiling, walls and floor).

You have now created another brush (Confusing, huh?). This brush, however, is not the active brush. It really exists in the world, as a room. To keep from confusing you throughout the rest of this tutorial, when I say &quot;brush&quot; you can interpret it as &quot;red builder brush&quot;.

Look in your 3D view. Practice flying around in there, and fly into your new room. It's pretty ugly right now. To improve it, we'll add custom textures and dynamic lighting.

====More on Geometry====
* [[Legacy:Unreal Geometry|Unreal Geometry]]
* [[Legacy:CSG|CSG]]
* [[Legacy:Brushbuilders|Brushbuilders]]
* [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]

==Textures==

When you create a new room in UnrealEd, it automatically picks an ugly texture for you (how thoughtful!). You probably would prefer to use your own textures.

===Browsing through the textures===

This is pretty simple. Just click the texture browser button in the top toolbar (#8). A window will pop up, maybe with some textures already in it. This window has yet another toolbar in it. For now, just click the open button (like a folder). The open file dialog box will appear. Look through the list of texture packages. Pick one you like. For starting out, I recommend the &quot;Ancient&quot; texture pack. It has lots of cool textures.

See how there's two popup menus in the texture browser? The one on top shows the available packages of textures, and the bottom one shows the different texture classes. Select &quot;walls&quot; from the second popup menu and pick a texture you want for the walls in your room. You can now close the texture browser, or minimize it&amp;ndash;whichever you prefer.

===Applying the texture===

Go to the 3D view. You should have screwed around enough by now to understand the gist of how to fly around. If you haven't, I suggest you try it now.

====I'm done screwing around!====

Good. Fly over to the wall you want to put your newly selected texture on. ALT-click the wall. This will place your texture there instantly. Go ahead and place our texture all over the the walls in your room. When you're ready to move on, you should know how to texture the ceiling and floor with the texture of your choice. If not, here's...

====A brief Recap====
* Open the texture browser.
* Open the texture package you want, unless you already have.
* Find a good texture, select it, and close the browser.
* Find the surface you wish to texture in the 3D view.
* ALT-click it.

====More on Textures====
* [[Legacy:Using Textures|Using Textures]]
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Decorating Rooms With Textures|Decorating Rooms with Textures]]
* [[Legacy:Texture (UT)|Texture (UT)]]
* [[Legacy:Texture Package|Texture Package]]

==Lighting==

Now that you've had fun exploring and texturing your room (ha!), you can add some lighting. Right click somewhere on the ceiling in the 3D view. The [[Legacy:Surface Context Menu|surface context menu]] will pop up. Pick &quot;Add light here&quot; to add a light. You will see an ugly torch appear. Don't worry, the torch won't show up in the game&amp;ndash;it just helps you see where the light is in the editor. Ctrl-drag your light around if you want.

===More on Lighting===
* [[Legacy:Lighting Basics|Lighting Basics]]
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Shadows|Shadows]]
* [[Legacy:Light (UT)|Light (UT)]]s

==Let's add the playerstart and go!==

Pushy, are ye? OK, click on the pawn button (#4) in the top toolbar. This brings up the [[Legacy:Actor Classes Browser|actor classes browser]] window. Click on the plus next to [[Legacy:NavigationPoint|NavigationPoint]], and then select the item &quot;[[Legacy:PlayerStart|PlayerStart]].&quot;

Open the 3D view and fly to a position where you can see the floor of your room. Right-click it and select &quot;Add PlayerStart Here&quot; from the [[Legacy:Surface Context Menu|surface context menu]].

===Build the level===

Click icon #17 in the top toolbar to build your level.

(See [[Legacy:Map Build Errors|Map Build Errors]] if you have a problem.)

===Playtest the Level!===

Now, you can click on the joystick button (#19). This will open Unreal Tournament and allow you to play your level for the first time.

==More rooms==

Kind of boring with only one room, isn't it? You probably experienced [[Legacy:Spawndeath|spawndeath]], for one thing. You obviously need more rooms and playerstarts.

If you click on your red builder brush and then ctrl-drag it to somewhere right of your first room, then pick subtract, you will create another room like the first. To connect the two you need to create a hallway between them.

Do this by right-clicking the cube icon again and typing in the values 128 for height, width and breadth. This creates a small hallway. ctrl drag the brush and your rooms around so the hallway is in the right place, and pick subtract.

Check it out in the 3D view. Move your hallway and/or rooms around until it is just how you like it. Now you can add more PlayerStarts, lights, and maybe retexture the hallway and rooms.

===It sucks that I have to move all my rooms around just to make a hallway!===

Stop complaining. All you have to do is make a hallway that is slightly too big, position it so it overlaps both rooms you want connected, and click the Intersect button.

====It didn't work!====

Well, that just changes the shape of the brush. You also need to subtract the new brush. Cut it out of the cheese, remember? Also, if you screwed up, it could be that you didn't overlap both rooms. The brush shouldn't be too big to begin with, either. make sure it doesn't poke out of the other side of one of the rooms or you will get unpleasant results.

====Cool. Now I have 2 rooms. But my map still sucks!====

Read on, and quit yer whining, would ya? Thanks :-) Why don't you add more rooms? Just connect more rooms to the first like you did before, and add lighting and textures.

==Let's add some pickups!==

Why not? This is a particularly easy step. All pickups are actors. Remember our good ol' friend, the PlayerStart? It was an actor too, right?

===Weapons and Ammo===

Go back to the Actor Class Browser. Remember, it's button #4 in the top toolbar. Expand the &quot;Inventory&quot; class, then the &quot;Weapon&quot; class, then the &quot;TournamentWeapon&quot; class. Often you'll see this referred to like this:

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]]}}

You will see several choices. Pick a weapon you want in your map, and close or minimize the Actor class browser.

Right-click somewhere in the 3D view and pick &quot;Add &lt;&lt;the weapon you picked&gt;&gt; here.&quot; CTRL-drag it to where you want it in the 2D views. Repeat these steps with whatever weapons you want.

====What about ammo?====

Yes, this is confusing, because ammo is not in the same place as the weapons. Ammo is in

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]]}}

Place ammo the same way you would place weapons.

====More about Weapons and Ammo====
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:TournamentWeapon|TournamentWeapon]]
* [[Legacy:Ammo (UT)|Ammo (UT)]]
* [[Legacy:TournamentAmmo|TournamentAmmo]]

===Health and Powerups===

====More about Health and Powerups====

==Liquids==

===How to make Liquids===

OK, all you need to do is subtract an area that will be filled with the liquid you want, whether it's water, lava, slime, or tar.

Now, create a [[Legacy:Sheet|sheet]] brush that is slightly bigger than your water pit. The sheet brush button is the top-right one in the brush toolbar. Align the brush in the 2D viewports so it completely seals off the liquid filled &quot;room&quot;.

Now, to add it to the room! Click the &quot;Add Special Brush&quot; button (#5 in the &quot;Brush Operations&quot; toolbar, as seen below.) From the popup menu, choose &quot;Water&quot; (Choose it even if you want lava, slime, or tar). Also, check the &quot;2-Sided&quot; box. Click OK, and then Close.

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

Congratulations! You're almost there! Now, you have to decide which type of liquid you want.

====Water====

You can find a nice water texture in the ''FireEng'' &gt; ''Water'' texture package. It has great ripply effects and everything. After you have applied the water texture, go to the Actor Class Browser. Select

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:WaterZone|WaterZone]]}}

and stick it inside of the area that is to be filled with water.

====Lava====

Lava is done the same exact way as water, except that you should pick a good lava texture and place a

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:LavaZone|LavaZone]]}}

in the lava pit instead. A nice lava texture can be found in the ''FireEng'' &gt; ''lava'' package.

====Slime====

Slime is done just like lava and water, except you use a, you guessed it, [[Legacy:SlimeZone|SlimeZone]]. You can find a good slime texture in the ''Liquids'' package. You'll also find a few other nice water textures.

====Tar====

Tar, in case you were wondering, is not dangerous to the player, per se. However, it slows down the player's movement greatly. It is done the same way as all of the above except with a [[Legacy:TarZone|TarZone]] actor. A good tar texture is in the ''Liquids'' package as well.

===More on Liquids===
* [[Legacy:Making Liquids (UT)|Making Liquids (UT)]]

==Discussion==

'''Ars-Magna:''' I have a lot more to do on this, but I'm too tired to do it tonight. :-) Hope this will be able to help someone!

'''Sobiwan:''' I combed over this page in comparison with [[Legacy:Mapping Lessons|Mapping Lessons]] and have determined that this page is redundant.  I say (Delete Me).

'''Wormbo:''' Really delete this now?

'''SoH_Ghost3021:''' It looks good to me!

'''dwjp:''' This is ace... tried the &quot;Mapping lessons&quot; got well confused this makes more sense for a starter.  Excellent work...using the demo version mind so not all the bits are the same but works never-the-less....love the cheese!

'''SuperApe:''' Someone needs to make a decision on this.  For now, I've removed the Delete Me tag and added Refactor Me and To Do tags.  Check and compare with [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] and [[Legacy:Create A Room|Create a room]].  I can't tell if the language used here is &quot;user friendly&quot; or just needlessly unprofessional and sloppy.  The organization sure needs a lot of work.  Did a little markup.

'''Tgusagalpa:'''Everything here is repetitive.  Should I say [[:Category:Legacy Delete Me]]?

----

[[:Category:Legacy To Do]] &amp;ndash; If not refactored, really go through this and make it a) for beginners, b) look like other tutorials, c) link up, d) update for UT200x, e) edit down to a manageable size ''(i.e., this doesn't need to cover everything under the sun, just the beginner stuff)''

[[:Category:Legacy Refactor Me]] &amp;ndash; If not seriously worked on, refactor into [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Create A Room|Create a room]] or maybe [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]], then remove.
[[Category:Legacy Delete Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Beginners Guide To UScript</title>
    <id>652</id>
    <revision>
      <id>1926</id>
      <timestamp>2005-12-04T22:40:29Z</timestamp>
      <contributor>
        <ip>King Mango</ip>
      </contributor>
      <minor/>
      <comment>added comment about beginners and scripting.</comment>
      <text xml:space="preserve">==Beginners Guide to UScript==

'''''This document is under heavy development and is not meant to be read yet'''''

'''Bullet:''' I'm not sure wether I will finish it or keep it up because I currently don't see a way to bring in an order into the stuff I want to tell to the beginners. Anyway I will try to and yes that's it so far.

This site is meant to be an introduction for Beginners what to do and how handle the problems any Beginner may experience.

When I started to learn UScript I had no problems with the syntax or anything that was in connection with the language itself. The main problem was how to do things now, how to find out where I have to change what to get what I want.

===Requisites===

This text is going to handle the where to do and not the how to do. That means you should be familiar with the basics of UScript, how to declare variables, create classes, compile code and so on. If you don’t met one of these requisites you'd better read the respective tutorial and come back later.

===Here we go===

Export or download the UT2004 [[Legacy:UnrealScript Source|UnrealScript Source]] and start to read. The best thing to start with are files starting with Mut*. Those files contain the most simple code because they are the mutators shipped with UT2004. Read them and try to understand at least a bit and try to remember tricks they used to achieve their goal. There may be a time where you'd need them. Keep on reading. You need to get an overview over the engine as fast as possible because THEN you can write useful things because THEN you know where to put the screw driver to.

If you want to read more advanced code, go read the weapon source located in XWeapons/. There is everything that has to do with weapons such as their projectiles their pickup-classes and so on. Always have a look at the used functions and their parameters.

If you find a super.SomeFunction() then find out what the base class is and search for SomeFunction there. For weapons for example you may find a few references with super.DoSomething() and will find them in [[Legacy:Weapon|Weapon]].uc located in Engine/

If you have a lot of time and a clear brain then you might want to read [[Legacy:Actor|Actor]].uc or [[Legacy:Pawn|Pawn]].uc which are both located in Engine/.

===About a weapon===

The most interesting thing for beginners to do is to modify weapons. If you edit the weapons you can get good effects with small effort! But weapons aren't that easy to understand in UT2004 because they consist not only of one, but a few classes. Here I will try to give an overview over them although my knowledge with weapons isn't that advanced because I'm still a beginner ;)

At the beginning there is a class. The [[Legacy:Weapon|Weapon]] class, Weapon.uc located in Engine/. It contains any stuff a weapon would need without defining it too straight. Every weapon differs from the others in some way but Weapon.uc is defined to be abstract enough to suit any weapon (if you read the class definition you may notice the abstact keyword). That is: Any weapon has two fire modes (which are of class [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]). Fire and Alt Fire. Plus every weapon keeps track of the ammo remaining for the two fire modes. Then there is a set of functions like MaxOutAmmo(), SuperMaxOutAmmo() and so on. If you want to learn more about the functions '''every''' weapon has to offer you may read [[Legacy:Weapon|Weapon]] now.

Every weapon has to have a pickup class, a subclass of [[Legacy:WeaponPickup|WeaponPickup]]. This class defines the appearence and behaviour of your weapon when dropped, how much ammo it will contain and so on. To be honest I didn't have a look at this class but I don't think there's too much of black magic ;)

Every weapon also has a WeaponAttachment class, and this is how the weapon looks from the third person.  You can put in effects here like glows or w/e that would appear when looking at someone carrying it.

The next thing to do is to choose between weapons with projectiles or instant-hit weapons.

Projectile weapons spawn real objects when fired. Examples are the rocket launcher, the redeemer, the Link Gun primary fire and so on.

Instant-hit weapons are weapons that check for a hit '''instant'''ly when fired. Best example would be the lightning gun or the Shock Rifle primary or the Super Shock Rifle. There is no time between the shot and the hit.

This difference is made by the base class they use for their fire class. As mentioned above every weapons has two fire modes. These fire modes are defined by subclasses of either [[Legacy:InstantFire|InstantFire]] ,or [[Legacy:ProjectileFire|ProjectileFire]]. Whenever someone fires his/her weapon, it calls the corresponding fire mode class.

===Weapons: I want to fire now. Instantly.===

So this is the section about InstantFire weapons. InstantFire weapons are rather simple.

Whenever the player starts to fire the fire mode class will be told about this event by a call to its &lt;code&gt;InstantFire.DoFireEffect()&lt;/code&gt; function. There it basically launch a trace for to see where and what we hit

and then launches the corresponding effect such as a blue beam in case of the [[Legacy:ShockRifle|ShockRifle]].

The trace part is in fact a bit more complicated because it has to deal with different hit cases such as vehicles, world geometry and the reflection of the beam but with a bit of time you can solve this bit of black magic by looking at DoTrace() in [[Legacy:InstantFire|InstantFire]].

===Weapons: No, projectiles please.===

'''''TODO'''''

'''Quick Notes here:''''' Launches projectiles, SeekingProjectile aims for a target, and yes.

'''Tarquin:''' You might want to take a look at [[Legacy:UnrealScript Lessons|UnrealScript Lessons]], and see how this page might fit into the sequence of tutes there :)

'''Bullet:''' SIR YES SIR :D Will have a look at it at a latter time, okay?

'''RegularX:''' To be honest, I would recommend not jumping into weapons right away.  Use a vampire mutator or something like that.  Weapon code is actually pretty complicated and even more so in UT2004.  I used weapons as a starting point when I wrote the UTutes and kinda regretted it.  Just a suggestion.

'''Syntax_Error:''' Agreed, RegualrX. The weapon tutorial I am writing is meant for more advanced modders who want to really get into UnrealScript that would be useful to a larger mod or TC. My tutorial assumes you have a basic understanding of Uscript, as in a mutator. Sometimes the simpliest weapon ideas are fairly difficult to actually script in. For example, dual pistols seems like a simple extend of assault rifle, but I swear I cannot get them to animate correctly. Just my 2 cents ;)

'''King Mango''' Beginner's guide? I think the problem with script is that the people who are good at it have been involved in programming of some sort for so long that they have forgotten what it's like to know nothing about scripting/coding. For someone with no knowledge of any programming language I have found UScript the door that just won't open. The Buzz tutes are great if all you want to do is make the same exact thing they made. All that is is monkey see monkey do. Well that's the end of my rant.</text>
    </revision>
    <revision>
      <id>1927</id>
      <timestamp>2005-02-25T01:40:55Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <minor/>
      <comment>some grammar/spelling fixes</comment>
      <text xml:space="preserve">==Beginners Guide to UScript==

'''''This document is under heavy development and is not meant to be read yet'''''

'''Bullet:''' I'm not sure wether I will finish it or keep it up because I currently don't see a way to bring in an order into the stuff I want to tell to the beginners. Anyway I will try to and yes that's it so far.

This site is meant to be an introduction for Beginners what to do and how handle the problems any Beginner may experience.

When I started to learn UScript I had no problems with the syntax or anything that was in connection with the language itself. The main problem was how to do things now, how to find out where I have to change what to get what I want.

===Requisites===

This text is going to handle the where to do and not the how to do. That means you should be familiar with the basics of UScript, how to declare variables, create classes, compile code and so on. If you don’t met one of these requisites you'd better read the respective tutorial and come back later.

===Here we go===

Export or download the UT2004 [[Legacy:UnrealScript Source|UnrealScript Source]] and start to read. The best thing to start with are files starting with Mut*. Those files contain the most simple code because they are the mutators shipped with UT2004. Read them and try to understand at least a bit and try to remember tricks they used to achieve their goal. There may be a time where you'd need them. Keep on reading. You need to get an overview over the engine as fast as possible because THEN you can write useful things because THEN you know where to put the screw driver to.

If you want to read more advanced code, go read the weapon source located in XWeapons/. There is everything that has to do with weapons such as their projectiles their pickup-classes and so on. Always have a look at the used functions and their parameters.

If you find a super.SomeFunction() then find out what the base class is and search for SomeFunction there. For weapons for example you may find a few references with super.DoSomething() and will find them in [[Legacy:Weapon|Weapon]].uc located in Engine/

If you have a lot of time and a clear brain then you might want to read [[Legacy:Actor|Actor]].uc or [[Legacy:Pawn|Pawn]].uc which are both located in Engine/.

===About a weapon===

The most interesting thing for beginners to do is to modify weapons. If you edit the weapons you can get good effects with small effort! But weapons aren't that easy to understand in UT2004 because they consist not only of one, but a few classes. Here I will try to give an overview over them although my knowledge with weapons isn't that advanced because I'm still a beginner ;)

At the beginning there is a class. The [[Legacy:Weapon|Weapon]] class, Weapon.uc located in Engine/. It contains any stuff a weapon would need without defining it too straight. Every weapon differs from the others in some way but Weapon.uc is defined to be abstract enough to suit any weapon (if you read the class definition you may notice the abstact keyword). That is: Any weapon has two fire modes (which are of class [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]). Fire and Alt Fire. Plus every weapon keeps track of the ammo remaining for the two fire modes. Then there is a set of functions like MaxOutAmmo(), SuperMaxOutAmmo() and so on. If you want to learn more about the functions '''every''' weapon has to offer you may read [[Legacy:Weapon|Weapon]] now.

Every weapon has to have a pickup class, a subclass of [[Legacy:WeaponPickup|WeaponPickup]]. This class defines the appearence and behaviour of your weapon when dropped, how much ammo it will contain and so on. To be honest I didn't have a look at this class but I don't think there's too much of black magic ;)

Every weapon also has a WeaponAttachment class, and this is how the weapon looks from the third person.  You can put in effects here like glows or w/e that would appear when looking at someone carrying it.

The next thing to do is to choose between weapons with projectiles or instant-hit weapons.

Projectile weapons spawn real objects when fired. Examples are the rocket launcher, the redeemer, the Link Gun primary fire and so on.

Instant-hit weapons are weapons that check for a hit '''instant'''ly when fired. Best example would be the lightning gun or the Shock Rifle primary or the Super Shock Rifle. There is no time between the shot and the hit.

This difference is made by the base class they use for their fire class. As mentioned above every weapons has two fire modes. These fire modes are defined by subclasses of either [[Legacy:InstantFire|InstantFire]] ,or [[Legacy:ProjectileFire|ProjectileFire]]. Whenever someone fires his/her weapon, it calls the corresponding fire mode class.

===Weapons: I want to fire now. Instantly.===

So this is the section about InstantFire weapons. InstantFire weapons are rather simple.

Whenever the player starts to fire the fire mode class will be told about this event by a call to its &lt;code&gt;InstantFire.DoFireEffect()&lt;/code&gt; function. There it basically launch a trace for to see where and what we hit

and then launches the corresponding effect such as a blue beam in case of the [[Legacy:ShockRifle|ShockRifle]].

The trace part is in fact a bit more complicated because it has to deal with different hit cases such as vehicles, world geometry and the reflection of the beam but with a bit of time you can solve this bit of black magic by looking at DoTrace() in [[Legacy:InstantFire|InstantFire]].

===Weapons: No, projectiles please.===

'''''TODO'''''

'''Quick Notes here:''''' Launches projectiles, SeekingProjectile aims for a target, and yes.

'''Tarquin:''' You might want to take a look at [[Legacy:UnrealScript Lessons|UnrealScript Lessons]], and see how this page might fit into the sequence of tutes there :)

'''Bullet:''' SIR YES SIR :D Will have a look at it at a latter time, okay?

'''RegularX:''' To be honest, I would recommend not jumping into weapons right away.  Use a vampire mutator or something like that.  Weapon code is actually pretty complicated and even more so in UT2004.  I used weapons as a starting point when I wrote the UTutes and kinda regretted it.  Just a suggestion.</text>
    </revision>
    <revision>
      <id>1928</id>
      <timestamp>2005-02-25T05:39:26Z</timestamp>
      <contributor>
        <ip>Syntax Error</ip>
      </contributor>
      <comment>RE to RegualrX</comment>
      <text xml:space="preserve">==Beginners Guide to UScript==

'''''This document is under heavy development and is not meant to be read yet'''''

'''Bullet:''' I'm not sure wether I will finish it or keep it up because I currently don't see a way to bring in an order into the stuff I want to tell to the beginners. Anyway I will try to and yes that's it so far.

This site is meant to be an introduction for Beginners what to do and how handle the problems any Beginner may experience.

When I started to learn UScript I had no problems with the syntax or anything that was in connection with the language itself. The main problem was how to do things now, how to find out where I have to change what to get what I want.

===Requisites===

This text is going to handle the where to do and not the how to do. That means you should be familiar with the basics of UScript, how to declare variables, create classes, compile code and so on. If you don’t met one of these requisites you'd better read the respective tutorial and come back later.

===Here we go===

Export or download the UT2004 [[Legacy:UnrealScript Source|UnrealScript Source]] and start to read. The best thing to start with are files starting with Mut*. Those files contain the most simple code because they are the mutators shipped with UT2004. Read them and try to understand at least a bit and try to remember tricks they used to achieve their goal. There may be a time where you'd need them. Keep on reading. You need to get an overview over the engine as fast as possible because THEN you can write useful things because THEN you know where to put the screw driver to.

If you want to read more advanced code, go read the weapon source located in XWeapons/. There is everything that has to do with weapons such as their projectiles their pickup-classes and so on. Always have a look at the used functions and their parameters.

If you find a super.SomeFunction() then find out what the base class is and search for SomeFunction there. For weapons for example you may find a few references with super.DoSomething() and will find them in [[Legacy:Weapon|Weapon]].uc located in Engine/

If you have a lot of time and a clear brain then you might want to read [[Legacy:Actor|Actor]].uc or [[Legacy:Pawn|Pawn]].uc which are both located in Engine/.

===About a weapon===

The most interesting thing for beginners to do is to modify weapons. If you edit the weapons you can get good effects with small effort! But weapons aren't that easy to understand in UT2004 because they consist not only of one, but a few classes. Here I will try to give an overview over them although my knowledge with weapons isn't that advanced because I'm still a beginner ;)

At the beginning there is a class. The [[Legacy:Weapon|Weapon]] class, Weapon.uc located in Engine/. It contains any stuff a weapon would need without defining it too straight. Every weapon differs from the others in some way but Weapon.uc is defined to be abstract enough to suit any weapon (if you read the class definition you may notice the abstact keyword). That is: Any weapon has two fire modes (which are of class [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]]). Fire and Alt Fire. Plus every weapon keeps track of the ammo remaining for the two fire modes. Then there is a set of functions like MaxOutAmmo(), SuperMaxOutAmmo() and so on. If you want to learn more about the functions '''every''' weapon has to offer you may read [[Legacy:Weapon|Weapon]] now.

Every weapon has to have a pickup class, a subclass of [[Legacy:WeaponPickup|WeaponPickup]]. This class defines the appearence and behaviour of your weapon when dropped, how much ammo it will contain and so on. To be honest I didn't have a look at this class but I don't think there's too much of black magic ;)

Every weapon also has a WeaponAttachment class, and this is how the weapon looks from the third person.  You can put in effects here like glows or w/e that would appear when looking at someone carrying it.

The next thing to do is to choose between weapons with projectiles or instant-hit weapons.

Projectile weapons spawn real objects when fired. Examples are the rocket launcher, the redeemer, the Link Gun primary fire and so on.

Instant-hit weapons are weapons that check for a hit '''instant'''ly when fired. Best example would be the lightning gun or the Shock Rifle primary or the Super Shock Rifle. There is no time between the shot and the hit.

This difference is made by the base class they use for their fire class. As mentioned above every weapons has two fire modes. These fire modes are defined by subclasses of either [[Legacy:InstantFire|InstantFire]] ,or [[Legacy:ProjectileFire|ProjectileFire]]. Whenever someone fires his/her weapon, it calls the corresponding fire mode class.

===Weapons: I want to fire now. Instantly.===

So this is the section about InstantFire weapons. InstantFire weapons are rather simple.

Whenever the player starts to fire the fire mode class will be told about this event by a call to its &lt;code&gt;InstantFire.DoFireEffect()&lt;/code&gt; function. There it basically launch a trace for to see where and what we hit

and then launches the corresponding effect such as a blue beam in case of the [[Legacy:ShockRifle|ShockRifle]].

The trace part is in fact a bit more complicated because it has to deal with different hit cases such as vehicles, world geometry and the reflection of the beam but with a bit of time you can solve this bit of black magic by looking at DoTrace() in [[Legacy:InstantFire|InstantFire]].

===Weapons: No, projectiles please.===

'''''TODO'''''

'''Quick Notes here:''''' Launches projectiles, SeekingProjectile aims for a target, and yes.

'''Tarquin:''' You might want to take a look at [[Legacy:UnrealScript Lessons|UnrealScript Lessons]], and see how this page might fit into the sequence of tutes there :)

'''Bullet:''' SIR YES SIR :D Will have a look at it at a latter time, okay?

'''RegularX:''' To be honest, I would recommend not jumping into weapons right away.  Use a vampire mutator or something like that.  Weapon code is actually pretty complicated and even more so in UT2004.  I used weapons as a starting point when I wrote the UTutes and kinda regretted it.  Just a suggestion.

'''Syntax_Error:''' Agreed, RegualrX. The weapon tutorial I am writing is meant for more advanced modders who want to really get into UnrealScript that would be useful to a larger mod or TC. My tutorial assumes you have a basic understanding of Uscript, as in a mutator. Sometimes the simpliest weapon ideas are fairly difficult to actually script in. For example, dual pistols seems like a simple extend of assault rifle, but I swear I cannot get them to animate correctly. Just my 2 cents ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Behemoth</title>
    <id>28488</id>
    <revision>
      <id>40189</id>
      <timestamp>2009-11-17T10:56:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ben 2500/Developer Journal</title>
    <id>619</id>
    <revision>
      <id>1852</id>
      <timestamp>2003-08-05T09:45:04Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">I started Editing about three years ago, and it was pretty hard because I didnt have the internet or any other source to find out how to make my own UT levels.  I slowly got better and better by looking at other levels and until I knew about every thing there was to know about it.  Now Can do anything with it and I still spend all of my time on it because I dont have the internet at my house.:( I've made at least 50 maps and all of them are well done but I dont have any one to give them to.:Pissed: Started scripting about 2-3 months ago so im just a n00b Scripter.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1853</id>
      <timestamp>2003-02-07T15:44:11Z</timestamp>
      <contributor>
        <ip>Ben 2500</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I started Editing about three years ago, and it was pretty hard because I didnt have the internet or any other source to find out how to make my own UT levels.  I slowly got better and better by looking at other levels and until I knew about every thing there was to know about it.  Now Can do anything with it and I still spend all of my time on it because I dont have the internet at my house.:(  I've made at least 50 maps and all of them are well done but I dont have any one to give them to.:Pissed:</text>
    </revision>
    <revision>
      <id>1854</id>
      <timestamp>2003-04-30T14:29:38Z</timestamp>
      <contributor>
        <ip>Ben 2500</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I started Editing about three years ago, and it was pretty hard because I didnt have the internet or any other source to find out how to make my own UT levels.  I slowly got better and better by looking at other levels and until I knew about every thing there was to know about it.  Now Can do anything with it and I still spend all of my time on it because I dont have the internet at my house.:( I've made at least 50 maps and all of them are well done but I dont have any one to give them to.:Pissed: Started scripting about 2-3 months ago so im just a n00b Scripter.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ben2500</title>
    <id>626</id>
    <revision>
      <id>1870</id>
      <timestamp>2005-03-15T03:43:39Z</timestamp>
      <contributor>
        <ip>Ca07-ch01-bl09.va-ashburn0.sa.earthlink.net</ip>
      </contributor>
      <comment>New Forum</comment>
      <text xml:space="preserve">I have just gotten the Internet at my house and i think its here to stay this time :)

I have a web page now and you can go to it here http://home.earthlink.net/~pburkart/

If you go to my web page please fill out the form there.

I now have maps and mutators to download now on my website, but right now they are all for the first UT.  I will make things for the new one as soon as I can. :)

I added a link to this site.  hope nobody minds.

My site will probaly be complete in less than a week, takes a long time since im the only one working on it.

I only have one map and it isnt a very good one because I was just trying to make a quick map for Assault.

===UT 2004 Map Descriptions===

===Assault===

AS-Convoy - This scenario is a recreation of the recovery of the Nexus prototype missiles by the NEG military, after they were stolen by the Hellions. NEG forces pinpointed the location of the cache due to a hidden homing device on these devastating weapons of mass destruction. The exact location of the missiles could only be pinpointed during the short period when they were being transferred from one location to another above ground on Taron, and the military had no choice but to strike at this time.

AS-FallenCity - Following the human/skaarj war, many of Earth's cities lay in ruins.  When the New Earth Government attempted to assert its authority over these areas, they were confronted by many rebel groups, often covertly financed by the great corporations, which had established bases in the destroyed cities. This scenario recreates the destruction of a rebel command center by NEG forces. In keeping with the historical battle, the attacker's insertion point is a distance away from the command center, because of the heavy anti-aircraft protection around the bunker.

AS-Glacier - In one of the most daring acts of the mostly covert Corporation Wars, Izanagi Corporation's research facility on Lamdon 3 was raided and destroyed by a strike force from the Axon Research Corporation, despite the protection offered by the elite NEG ThunderCrash force.  This scenario recreates that mission.  Axon was able to not only destroy the facility, but also retrieve the advanced plasma ion tank under development there.  You must infiltrate the facility, steal the plasma ion tank, and destroy the entire facility.

AS-Junkyard - This scenario is based on an infamous episode of a popular Holovision program. In the original episode, two teams of mechanics were competing to make their vehicle operational and escape the junk yard. The unexpected twist occurred when the losing team pulled out some makeshift weapons and pounded the other team into oblivion before they could make their escape. Since there was no explicit rule forbidding violence in the competition, they were declared the winners, and a new Tournament classic was born.

AS-MotherShip - First contact with the Skaarj came during the recovery of the prison transporter Vortex Rikers on Na Pali. Within a year the Skaarj had pushed humanity back to the brink of destruction. This scenario replicates the final battle for Earth, and the stunning victory by humans in the face of almost certain defeat. A Skaarj Mothership orbited the Earth, and rained death upon the planet in preparation for the final landing. In a daring suicide mission, the humans attacked the Skaarj Mothership in small one man fighters, hoping to exploit a flaw in the Mothership defenses their analysis had revealed.

AS-RobotFactory - This scenario is a recreation of the Liandri robot uprising on the mechanical asteroid of LBX-7683 and the subsequent quelling of this rebellion by human forces. LBX-7683 was an outpost for research and development of the next generation of Liandri robots. Liandri's best scientists were able to introduce increasingly sophisticated artificial intelligence into the machines that they designed. Eventually, they rebelled against the humans and took the asteroid as their own, brutally disposing of their creators and mining the rich materials embedded within the rock for their own gain. Liandri's commanders devised a plan to strike directly at the production facility manufacturing the robots. During an all-out assault on the world, a small team was inserted with the sole goal of destroying the AI generators, thereby destroying the ability of the machines to reproduce themselves and ending this uprising.

===Bombing Run===

BR-BridgeOfFate - Two sides, a huge cave in between, one bridge going from side to side, bridging the gap between two teams, bridging the gap between hope and despair.

BR-Colossus - Whether attacking by ground or through the air via boost tunnels, expect heavy resistance as your opponents take advantage of terrain and technology to block your path.  Maps will be available for those with poor navigational skills.

BR-Serenity - Feel the gentle breeze on your skin, hear the claiming sounds of the forest, watch the fireflies dance in the clearing and surrender yourself to a growing sense of serenity.  Now ... collect your Flak Cannon and wreak havoc!

===Capture The Flag===

CTF-1on1-Joust - Chaos and death wait for those that stop to take a breath.  Don’t think… don’t pause… don’t even blink, Welcome to the league’s futuristic take on the ancient art of jousting.

CTF-AbsoluteZero- Absolute Zero was initially constructed as a scientific outpost to study glacial drift. Over the years, global warming and massive earth tremors nearly shook the base off of its foundation. The researchers and scientists were hastily evacuated and Liandri quickly purchased the base for the tournament. The warm reception given to you by your team may help offset the sub-zero temperatures, but don't get too comfortable, your foes have something much colder in store for you...

CTF-BridgeOfFate - Two sides, a huge cave in between, one bridge going from side to side, bridging the gap between two teams, bridging the gap between hope and despair.

CTF-FaceClassic - This island-asteroid and its two towers have proven to be a perfect setting for Tournament CTF matches, so face your enemy and let the games begin.

CTF-Grassyknoll - A warm breeze through the trees brings the stink of hot metal and sulphur, and the coppery scent of blood. Somewhere ahead crazed laughter echoes the report of a plasma rifle, taunting an unseen enemy. The sizzle of scorched flesh is the only answer. There's no magic bullets here, no conspiracy, just a gauntlet of enemies to overcome and finally bring the flag home. 

CTF-January - After a somewhat failed renovation attempt in 2358, the Liandri Corporation authorized a the restructuring and repair of facility 32356.  Nearly 3 years later, the gates are open, let the water run red.  Welcome to facility 32356-a … codenamed “January”!

CTF-MoonDragon - In the depths of ancient Korea, hidden high up in the Mountain of the Moon Dragon, battles rage between brave warriors.

CTF-Smote - The earth trembles beneath your feet, and the sky rains fire and ash down on you from above. The path to victory is as treacherous and deadly as the enemies you face on the battlefield, and less forgiving.

CTF-TwinTombs - Winter has fallen on the tombs and the dead are restless.  This elegant recreation of the twin tombs of brothers Ramses III and Rudamon has a reputation for speed, brutality, and treachery, just like the pharaohs interred within.

===Team\Death Match===

DM-1on1-Albatross - From the ancient days of the Tournament comes a classic 1on1 arena, renovated and redesigned to once again mediate in the fate of bloodshed. Do not be fooled by its ostensible simplicity, for those who command design will always dominate in this arena.

DM-1on1-Desolation - Desiring isolation, an artist built his new home on a towering skyscraper where he could escape from civilization. On top of his home sat his private museum of art, art never to be seen by the public eye till his tragic death. Found next to his decaying body, the artists will stated that his museum be turned into a 1 on 1 arena for the tournament, his only enjoyment in life next to art. No longer the tallest nor grandest skyscraper, it has come to be known as the Tower of Desolation.

DM-1on1-Idoma - Small atmospheric map set in a building constructed out of lots of wood and metal.

DM-1on1-Irondust - Piece of cake? Yeah you bet... Prepare to get dusted Ironman!

DM-1on1-Roughinery - The remnant of an old refinery now serves as a location for your duels. Use its intricate layout to your advantage and don't lose track of your enemy.

DM-1on1-Spirit - This ancient structure once had a high religious significance to its inhabitants. However since their departure, the spirit of this old place of worship has become jaded. Now only the spirits of fallen combatants can be heard...will you join them?

DM-1on1-Spirit - This ancient structure once had a high religious significance to its inhabitants. However since their departure, the spirit of this old place of worship has become jaded. Now only the spirits of fallen combatants can be heard...will you join them?

DM-1on1-Squader - Once a section of a hidden military research facility, this cold structure now hosts some of the premiere 1 on 1 duels from the Tournament. The pressure is on.....how will you handle the spotlight?

DM-1on1-Trite - Watch your back and stay alert in this abandoned facility or you may end up as cold as the steel which surrounds you...

DM-Corrugation - After many years of tournament battles, this arena is slowly being eaten away by successive rocket and shock rifle blasts. Add your contribution to it's destruction.

DM-curse4 - Feel the walls closing in on you? A little claustrophobia maybe? When the flak starts flying and the shock combos fill the air, as you find yourself backed into a corner by a relentless pursuer you'll come to learn the meaning of the word cursed.

DM-Deck17 - Enter Deck 17 - Magma Refinery... Deck 16's HOT neighbor.

DM-DesertIsle - Under a searing sun, one little stream means life itself to this island of green in an ocean of sand. What will be left when its waters run red?

DM-Gestalt - Sitting just below the ever-thinning polar ice caps, the Gestalt Research Center will chill its inhabitants to their bones.  In fact, bones may be all that's left to chill, since this location has been added to the growing list of tournament settings.

DM-Goliath - High above Calaban VII, Goliath class orbital power stations provide the thriving colonies below with both power and protection.  Virtually immune to small arms fire, the platforms have become popular staging arenas for the tournaments.  Occasional radiation leakage has resulted in arenas that are not only entertaining, but self-cleaning too.

DM-HyperBlast2 - Thanks to Magnetic Anti-Vacuum Resonance technology, combatants are able to battle outside of Xan's 'HyperBlast' arena ship for an extended period of time. Use extreme caution though, one mistake and you'll find yourself floating in space.

DM-Metallurgy - Separating the fast from the slow, the strong from the weak, the skilled from the incompetent - Metallurgy will test your mettle.

DM-Morpheus3 - LMC knew they had found an excellent arena at the very top of a newly constructed Galaxyscraper Superstructure. Thanks to the modern miracle of super tensile solids, these three buildings reach a staggering 12 miles high at their pinnacle. The thin atmosphere and reduced influence of Earth's gravity provide an interesting test of the Tournament athlete's ability to adapt and conquer in extreme environments.

DM-Rankin - A medium sized map set in an old industrial building, in the middle of a heavy thunderstorm.

DM-Rrajigar - Fight in the Rrajigar mines.

DM-Sulphur - Wish you were here? Probably not. Since the loss of the O-Zone Layer, this venue of Weather Control Stations has been become home to permanent storms and high winds. The endless sulphuric acid rain that lashes down has rotted these once proud examples of technological progress into nothing more than rusting hulks that dominate the skyline.

===Domination===

DOM-Access - Seal off the Domination point of your choice by controlling the Access button in the middle of the arena.

DOM-Aswan - Deep in the heart of the Ocean of Dunes, a small oasis of civilization welcomes the weary traveler. Any who step through the gates of the Temple of Aswan are welcome, though none may leave without taking part in the trials. The Anubans have used the trials as a means to test their prospective competitors for hundreds of years. Success means fame and glory, failure means the scavengers pick the meat from your bones. Are you really that thirsty?

DOM-Atlantis - This great, mythical metropolis may have sunk to the darkest depths of the ocean, but that doesn't necessarily mean it's off limits to the Tournament. Even though it's located 20,000 leagues under the sea, strange Atantean powers ensure that the competitors won't get so much as a toe wet.

DOM-Conduit - The ebb and flow of static charge in the Conduit, harnessed to sate the requirements of an energy hungry society. The ebb and flow of a team battle in the Conduit, broadcast to sate the requirements of a depraved, bloodthirsty society.

DOM-Renascent - Deep within the Gen Mo' kai forests lies the key to rebirth.  Unfortunately for tournament participants that manage to find this arena, that key happens to be death.

===Invasion===

ONS-ArcticStronghold - Stationed at 24,000 feet and veiled behind blinding fog and constant snow, Arctic Stronghold provided the perfect place to conduct unsanctioned military experiments for use against the Skaarj. Restructured for Onslaught, this arena allows several paths to your enemy, and countless paths to death for the foolish or unwary.

ONS-Crossfire - In 2352, an anomalous volcanic eruption on the outskirts of Jerusalem partially unearthed a city far below the lost city of Ekron. Four years of intensive excavation revealed a civilization that predated all known human history. Purchased by Liandri corporation for the price of excavation, the souls of arena combatants now join the forgotten dead of the unremembered past.

ONS-Dawn - When Government prospectors happened upon this planet, Liandri knew they had found their next Onslaught arena. A primordial world still in the early stages of life, the lush landscape and rolling hills provide a serene and fitting environment for wholesale destruction.

ONS-Dria - Set among the crumbling ruins of the last Nali fortress, these icefields were the final stand of the Nali against the Skaarj. Driving their Stone Giants before them, the Skaarj lay siege to the city for three weeks, at last breaking down the perimeter wall and wiping out all within for their effrontery. Now an arena of Onslaught, the vast range of this location will test the teamwork and focus of the very best.

ONS-FrostBite - Don't be deceived by the apparent simplicity found in this frozen waste. Although it's among the smallest arenas for Onslaught, Frostbite is defined by frenetic pace and pitched battles.

ONS-Primeval - Nestled away in the darkness of the Primeval Forest, this Onslaught arena is a favorite of loggers and treehuggers alike.

ONS-RedPlanet - Deep-space exploration has revealed a phenomenon never before observed-a planetary system with NO sun. Infra-Red light reacting with carbon dioxide in the high atmosphere bathes the planet in a searing, blood-red glow. Experiments have shown that more than 18 hours on this planet will cause irreversible insanity. You won't live that long...

ONS-Severance - Eons past, the inhabitants of these forgotten ruins summoned a being of elemental darkness, which they imprisoned and lulled to sleep with the blood of countless sacrifices. In the stillness between battles, one can sometimes hear the voice of this titan, roused from sleep, awaiting your blood.

ONS-Torlan - Set on the dried outskirts of a lush jungle continent, two factions clash in fierce combat for control of a major communications tower and its adjacent power supply. With the dam holding back the waters from the nearby jungle, the dried out riverbed running across the battlefield allows for an easy attack route into enemy territory and could provide a decisive victor with ownership of the enormous Comm-tower as the reward.

===Discussion===

'''Daid303:''' &quot;I added a link to this site.  hope nobody minds.&quot; I don't think we'll mind getting more people here, that's where the site is here for, if it wasn't ment for everybody it would probly have a password lock or something like that.

'''Ben2500:''' Thanks. :)

'''Daid303:''' Oh, I also found a page called [[Legacy:Ben 2500|Ben 2500]] is that yours?

'''Ben2500:''' Yes thats mine.  Somebody can delete that.  I didnt really try to make a new page but I'll just keep this one.  does anybody know where I can find a code for letting people register at my site and let them login, or maybe a code that will automatically put something unto my site when somebody fills out a form?

'''Foxpaw:''' That's neat. Where is this information from? Or was the game released and nobody told me?

'''Ben2500:''' I found it in the system folder that came with the UT2004 Demo.  I hope that not all maps need a int file now.  What is the 3rd Super weapon that it talks about while exiting the UT2004 Demo?

'''Ben2500:''' Will UT2005 be another update or will it be running on an all new game engine?

'''MythOpus:''' It will likely be a new game and it will also be very likely that they'll call it something else other than having 2005 at the end.

'''Ben2500:''' I need help with running UT2004.  The cd player doesnt detect the UT2004 cd for some reason.

'''MythOpus:''' Are you sure the UT2k4 cd's aren't actually Ut2k4 Dvd's?  If so, you need a DVD-Rom drive to use the cd.

'''Ben2500:''' Can't get code to look right on web page keeps changing when I save it.

'''Ben2500:''' I am planning on making a Total conversion for UT2004 with the help of my friend.  I was wondering if there was anybody that knows how to make models for weapons and peoplethat might wanna help.  My friend was supposed to do the modeling for the characters and weapons but I dont think hes smart enough, and with out a modeler we will only be able to make it a really big mod.  I will be posting some information on it and some Pics soon on my website, at http://home.earthlink.net/~pburkart/  The gametype is mostly written up and the weapon sounds are alreay done and there isnt a proble with making textures, so all there is left to do is make the levels, weapons, Models, and lots of testing.  I have also put a download on my site that will replace the current UT2004.exe file with a new one that doesnt require the cd to play it.

'''Ben2500:''' Come visit my forum at http://ben2500.proboards30.com/index.cgi

'''Ben2500:''' someone please go to my forum and post something.  I have a few post but once it gets started it will go good.

'''Ben2500:''' My site has made it into 13th place in the unreal top 200 sites.

'''Ben2500:''' Will any Unreal Tournament downloads work on the Unreal Tournament Demo.

'''GRAF1K:''' No. You need the retail version to run mods.

'''Ben2500:''' Will the next UT be UT2005 or UT2006?

'''Graphik:''' http://www.beyondunreal.com/main/future/future.php

'''Ben2500:''' Does anybody know where I can find Static mesh packages to download for my UT2003 maps or other things?

'''Ben2500:''' New Forum up and running.  Unreal Ed Tutorials and lots of other things http://www.getfreeforum.com/forums/index.php?mforum=GamingForum&amp;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1871</id>
      <timestamp>2005-02-05T22:16:26Z</timestamp>
      <contributor>
        <ip>Ca07-ch01-bl02.va-ashburn0.sa.earthlink.net</ip>
      </contributor>
      <comment>Static Meshes!!!!!!!!!!!!!</comment>
      <text xml:space="preserve">I have just gotten the Internet at my house and i think its here to stay this time :)

I have a web page now and you can go to it here http://home.earthlink.net/~pburkart/

If you go to my web page please fill out the form there.

I now have maps and mutators to download now on my website, but right now they are all for the first UT.  I will make things for the new one as soon as I can. :)

I added a link to this site.  hope nobody minds.

My site will probaly be complete in less than a week, takes a long time since im the only one working on it.

I only have one map and it isnt a very good one because I was just trying to make a quick map for Assault.

===UT 2004 Map Descriptions===

===Assault===

AS-Convoy - This scenario is a recreation of the recovery of the Nexus prototype missiles by the NEG military, after they were stolen by the Hellions. NEG forces pinpointed the location of the cache due to a hidden homing device on these devastating weapons of mass destruction. The exact location of the missiles could only be pinpointed during the short period when they were being transferred from one location to another above ground on Taron, and the military had no choice but to strike at this time.

AS-FallenCity - Following the human/skaarj war, many of Earth's cities lay in ruins.  When the New Earth Government attempted to assert its authority over these areas, they were confronted by many rebel groups, often covertly financed by the great corporations, which had established bases in the destroyed cities. This scenario recreates the destruction of a rebel command center by NEG forces. In keeping with the historical battle, the attacker's insertion point is a distance away from the command center, because of the heavy anti-aircraft protection around the bunker.

AS-Glacier - In one of the most daring acts of the mostly covert Corporation Wars, Izanagi Corporation's research facility on Lamdon 3 was raided and destroyed by a strike force from the Axon Research Corporation, despite the protection offered by the elite NEG ThunderCrash force.  This scenario recreates that mission.  Axon was able to not only destroy the facility, but also retrieve the advanced plasma ion tank under development there.  You must infiltrate the facility, steal the plasma ion tank, and destroy the entire facility.

AS-Junkyard - This scenario is based on an infamous episode of a popular Holovision program. In the original episode, two teams of mechanics were competing to make their vehicle operational and escape the junk yard. The unexpected twist occurred when the losing team pulled out some makeshift weapons and pounded the other team into oblivion before they could make their escape. Since there was no explicit rule forbidding violence in the competition, they were declared the winners, and a new Tournament classic was born.

AS-MotherShip - First contact with the Skaarj came during the recovery of the prison transporter Vortex Rikers on Na Pali. Within a year the Skaarj had pushed humanity back to the brink of destruction. This scenario replicates the final battle for Earth, and the stunning victory by humans in the face of almost certain defeat. A Skaarj Mothership orbited the Earth, and rained death upon the planet in preparation for the final landing. In a daring suicide mission, the humans attacked the Skaarj Mothership in small one man fighters, hoping to exploit a flaw in the Mothership defenses their analysis had revealed.

AS-RobotFactory - This scenario is a recreation of the Liandri robot uprising on the mechanical asteroid of LBX-7683 and the subsequent quelling of this rebellion by human forces. LBX-7683 was an outpost for research and development of the next generation of Liandri robots. Liandri's best scientists were able to introduce increasingly sophisticated artificial intelligence into the machines that they designed. Eventually, they rebelled against the humans and took the asteroid as their own, brutally disposing of their creators and mining the rich materials embedded within the rock for their own gain. Liandri's commanders devised a plan to strike directly at the production facility manufacturing the robots. During an all-out assault on the world, a small team was inserted with the sole goal of destroying the AI generators, thereby destroying the ability of the machines to reproduce themselves and ending this uprising.

===Bombing Run===

BR-BridgeOfFate - Two sides, a huge cave in between, one bridge going from side to side, bridging the gap between two teams, bridging the gap between hope and despair.

BR-Colossus - Whether attacking by ground or through the air via boost tunnels, expect heavy resistance as your opponents take advantage of terrain and technology to block your path.  Maps will be available for those with poor navigational skills.

BR-Serenity - Feel the gentle breeze on your skin, hear the claiming sounds of the forest, watch the fireflies dance in the clearing and surrender yourself to a growing sense of serenity.  Now ... collect your Flak Cannon and wreak havoc!

===Capture The Flag===

CTF-1on1-Joust - Chaos and death wait for those that stop to take a breath.  Don’t think… don’t pause… don’t even blink, Welcome to the league’s futuristic take on the ancient art of jousting.

CTF-AbsoluteZero- Absolute Zero was initially constructed as a scientific outpost to study glacial drift. Over the years, global warming and massive earth tremors nearly shook the base off of its foundation. The researchers and scientists were hastily evacuated and Liandri quickly purchased the base for the tournament. The warm reception given to you by your team may help offset the sub-zero temperatures, but don't get too comfortable, your foes have something much colder in store for you...

CTF-BridgeOfFate - Two sides, a huge cave in between, one bridge going from side to side, bridging the gap between two teams, bridging the gap between hope and despair.

CTF-FaceClassic - This island-asteroid and its two towers have proven to be a perfect setting for Tournament CTF matches, so face your enemy and let the games begin.

CTF-Grassyknoll - A warm breeze through the trees brings the stink of hot metal and sulphur, and the coppery scent of blood. Somewhere ahead crazed laughter echoes the report of a plasma rifle, taunting an unseen enemy. The sizzle of scorched flesh is the only answer. There's no magic bullets here, no conspiracy, just a gauntlet of enemies to overcome and finally bring the flag home. 

CTF-January - After a somewhat failed renovation attempt in 2358, the Liandri Corporation authorized a the restructuring and repair of facility 32356.  Nearly 3 years later, the gates are open, let the water run red.  Welcome to facility 32356-a … codenamed “January”!

CTF-MoonDragon - In the depths of ancient Korea, hidden high up in the Mountain of the Moon Dragon, battles rage between brave warriors.

CTF-Smote - The earth trembles beneath your feet, and the sky rains fire and ash down on you from above. The path to victory is as treacherous and deadly as the enemies you face on the battlefield, and less forgiving.

CTF-TwinTombs - Winter has fallen on the tombs and the dead are restless.  This elegant recreation of the twin tombs of brothers Ramses III and Rudamon has a reputation for speed, brutality, and treachery, just like the pharaohs interred within.

===Team\Death Match===

DM-1on1-Albatross - From the ancient days of the Tournament comes a classic 1on1 arena, renovated and redesigned to once again mediate in the fate of bloodshed. Do not be fooled by its ostensible simplicity, for those who command design will always dominate in this arena.

DM-1on1-Desolation - Desiring isolation, an artist built his new home on a towering skyscraper where he could escape from civilization. On top of his home sat his private museum of art, art never to be seen by the public eye till his tragic death. Found next to his decaying body, the artists will stated that his museum be turned into a 1 on 1 arena for the tournament, his only enjoyment in life next to art. No longer the tallest nor grandest skyscraper, it has come to be known as the Tower of Desolation.

DM-1on1-Idoma - Small atmospheric map set in a building constructed out of lots of wood and metal.

DM-1on1-Irondust - Piece of cake? Yeah you bet... Prepare to get dusted Ironman!

DM-1on1-Roughinery - The remnant of an old refinery now serves as a location for your duels. Use its intricate layout to your advantage and don't lose track of your enemy.

DM-1on1-Spirit - This ancient structure once had a high religious significance to its inhabitants. However since their departure, the spirit of this old place of worship has become jaded. Now only the spirits of fallen combatants can be heard...will you join them?

DM-1on1-Spirit - This ancient structure once had a high religious significance to its inhabitants. However since their departure, the spirit of this old place of worship has become jaded. Now only the spirits of fallen combatants can be heard...will you join them?

DM-1on1-Squader - Once a section of a hidden military research facility, this cold structure now hosts some of the premiere 1 on 1 duels from the Tournament. The pressure is on.....how will you handle the spotlight?

DM-1on1-Trite - Watch your back and stay alert in this abandoned facility or you may end up as cold as the steel which surrounds you...

DM-Corrugation - After many years of tournament battles, this arena is slowly being eaten away by successive rocket and shock rifle blasts. Add your contribution to it's destruction.

DM-curse4 - Feel the walls closing in on you? A little claustrophobia maybe? When the flak starts flying and the shock combos fill the air, as you find yourself backed into a corner by a relentless pursuer you'll come to learn the meaning of the word cursed.

DM-Deck17 - Enter Deck 17 - Magma Refinery... Deck 16's HOT neighbor.

DM-DesertIsle - Under a searing sun, one little stream means life itself to this island of green in an ocean of sand. What will be left when its waters run red?

DM-Gestalt - Sitting just below the ever-thinning polar ice caps, the Gestalt Research Center will chill its inhabitants to their bones.  In fact, bones may be all that's left to chill, since this location has been added to the growing list of tournament settings.

DM-Goliath - High above Calaban VII, Goliath class orbital power stations provide the thriving colonies below with both power and protection.  Virtually immune to small arms fire, the platforms have become popular staging arenas for the tournaments.  Occasional radiation leakage has resulted in arenas that are not only entertaining, but self-cleaning too.

DM-HyperBlast2 - Thanks to Magnetic Anti-Vacuum Resonance technology, combatants are able to battle outside of Xan's 'HyperBlast' arena ship for an extended period of time. Use extreme caution though, one mistake and you'll find yourself floating in space.

DM-Metallurgy - Separating the fast from the slow, the strong from the weak, the skilled from the incompetent - Metallurgy will test your mettle.

DM-Morpheus3 - LMC knew they had found an excellent arena at the very top of a newly constructed Galaxyscraper Superstructure. Thanks to the modern miracle of super tensile solids, these three buildings reach a staggering 12 miles high at their pinnacle. The thin atmosphere and reduced influence of Earth's gravity provide an interesting test of the Tournament athlete's ability to adapt and conquer in extreme environments.

DM-Rankin - A medium sized map set in an old industrial building, in the middle of a heavy thunderstorm.

DM-Rrajigar - Fight in the Rrajigar mines.

DM-Sulphur - Wish you were here? Probably not. Since the loss of the O-Zone Layer, this venue of Weather Control Stations has been become home to permanent storms and high winds. The endless sulphuric acid rain that lashes down has rotted these once proud examples of technological progress into nothing more than rusting hulks that dominate the skyline.

===Domination===

DOM-Access - Seal off the Domination point of your choice by controlling the Access button in the middle of the arena.

DOM-Aswan - Deep in the heart of the Ocean of Dunes, a small oasis of civilization welcomes the weary traveler. Any who step through the gates of the Temple of Aswan are welcome, though none may leave without taking part in the trials. The Anubans have used the trials as a means to test their prospective competitors for hundreds of years. Success means fame and glory, failure means the scavengers pick the meat from your bones. Are you really that thirsty?

DOM-Atlantis - This great, mythical metropolis may have sunk to the darkest depths of the ocean, but that doesn't necessarily mean it's off limits to the Tournament. Even though it's located 20,000 leagues under the sea, strange Atantean powers ensure that the competitors won't get so much as a toe wet.

DOM-Conduit - The ebb and flow of static charge in the Conduit, harnessed to sate the requirements of an energy hungry society. The ebb and flow of a team battle in the Conduit, broadcast to sate the requirements of a depraved, bloodthirsty society.

DOM-Renascent - Deep within the Gen Mo' kai forests lies the key to rebirth.  Unfortunately for tournament participants that manage to find this arena, that key happens to be death.

===Invasion===

ONS-ArcticStronghold - Stationed at 24,000 feet and veiled behind blinding fog and constant snow, Arctic Stronghold provided the perfect place to conduct unsanctioned military experiments for use against the Skaarj. Restructured for Onslaught, this arena allows several paths to your enemy, and countless paths to death for the foolish or unwary.

ONS-Crossfire - In 2352, an anomalous volcanic eruption on the outskirts of Jerusalem partially unearthed a city far below the lost city of Ekron. Four years of intensive excavation revealed a civilization that predated all known human history. Purchased by Liandri corporation for the price of excavation, the souls of arena combatants now join the forgotten dead of the unremembered past.

ONS-Dawn - When Government prospectors happened upon this planet, Liandri knew they had found their next Onslaught arena. A primordial world still in the early stages of life, the lush landscape and rolling hills provide a serene and fitting environment for wholesale destruction.

ONS-Dria - Set among the crumbling ruins of the last Nali fortress, these icefields were the final stand of the Nali against the Skaarj. Driving their Stone Giants before them, the Skaarj lay siege to the city for three weeks, at last breaking down the perimeter wall and wiping out all within for their effrontery. Now an arena of Onslaught, the vast range of this location will test the teamwork and focus of the very best.

ONS-FrostBite - Don't be deceived by the apparent simplicity found in this frozen waste. Although it's among the smallest arenas for Onslaught, Frostbite is defined by frenetic pace and pitched battles.

ONS-Primeval - Nestled away in the darkness of the Primeval Forest, this Onslaught arena is a favorite of loggers and treehuggers alike.

ONS-RedPlanet - Deep-space exploration has revealed a phenomenon never before observed-a planetary system with NO sun. Infra-Red light reacting with carbon dioxide in the high atmosphere bathes the planet in a searing, blood-red glow. Experiments have shown that more than 18 hours on this planet will cause irreversible insanity. You won't live that long...

ONS-Severance - Eons past, the inhabitants of these forgotten ruins summoned a being of elemental darkness, which they imprisoned and lulled to sleep with the blood of countless sacrifices. In the stillness between battles, one can sometimes hear the voice of this titan, roused from sleep, awaiting your blood.

ONS-Torlan - Set on the dried outskirts of a lush jungle continent, two factions clash in fierce combat for control of a major communications tower and its adjacent power supply. With the dam holding back the waters from the nearby jungle, the dried out riverbed running across the battlefield allows for an easy attack route into enemy territory and could provide a decisive victor with ownership of the enormous Comm-tower as the reward.

===Discussion===

'''Daid303:''' &quot;I added a link to this site.  hope nobody minds.&quot; I don't think we'll mind getting more people here, that's where the site is here for, if it wasn't ment for everybody it would probly have a password lock or something like that.

'''Ben2500:''' Thanks. :)

'''Daid303:''' Oh, I also found a page called [[Legacy:Ben 2500|Ben 2500]] is that yours?

'''Ben2500:''' Yes thats mine.  Somebody can delete that.  I didnt really try to make a new page but I'll just keep this one.  does anybody know where I can find a code for letting people register at my site and let them login, or maybe a code that will automatically put something unto my site when somebody fills out a form?

'''Foxpaw:''' That's neat. Where is this information from? Or was the game released and nobody told me?

'''Ben2500:''' I found it in the system folder that came with the UT2004 Demo.  I hope that not all maps need a int file now.  What is the 3rd Super weapon that it talks about while exiting the UT2004 Demo?

'''Ben2500:''' Will UT2005 be another update or will it be running on an all new game engine?

'''MythOpus:''' It will likely be a new game and it will also be very likely that they'll call it something else other than having 2005 at the end.

'''Ben2500:''' I need help with running UT2004.  The cd player doesnt detect the UT2004 cd for some reason.

'''MythOpus:''' Are you sure the UT2k4 cd's aren't actually Ut2k4 Dvd's?  If so, you need a DVD-Rom drive to use the cd.

'''Ben2500:''' Can't get code to look right on web page keeps changing when I save it.

'''Ben2500:''' I am planning on making a Total conversion for UT2004 with the help of my friend.  I was wondering if there was anybody that knows how to make models for weapons and peoplethat might wanna help.  My friend was supposed to do the modeling for the characters and weapons but I dont think hes smart enough, and with out a modeler we will only be able to make it a really big mod.  I will be posting some information on it and some Pics soon on my website, at http://home.earthlink.net/~pburkart/  The gametype is mostly written up and the weapon sounds are alreay done and there isnt a proble with making textures, so all there is left to do is make the levels, weapons, Models, and lots of testing.  I have also put a download on my site that will replace the current UT2004.exe file with a new one that doesnt require the cd to play it.

'''Ben2500:''' Come visit my forum at http://ben2500.proboards30.com/index.cgi

'''Ben2500:''' someone please go to my forum and post something.  I have a few post but once it gets started it will go good.

'''Ben2500:''' My site has made it into 13th place in the unreal top 200 sites.

'''Ben2500:''' Will any Unreal Tournament downloads work on the Unreal Tournament Demo.

'''GRAF1K:''' No. You need the retail version to run mods.

'''Ben2500:''' Will the next UT be UT2005 or UT2006?

'''Graphik:''' http://www.beyondunreal.com/main/future/future.php

'''Ben2500:''' Does anybody know where I can find Static mesh packages to download for my UT2003 maps or other things?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BesigedB</title>
    <id>524</id>
    <revision>
      <id>1635</id>
      <timestamp>2003-05-27T09:43:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I have arrived. Rar

-[[Legacy:BesigedB|BesigedB]]-

'''Mychaeel:''' The [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] has been informed and will take care of that. Keep tea and cookies handy.

'''Wormbo:''' The Goblin is not pleased by the absence of tea and cookies on this page. ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1636</id>
      <timestamp>2002-04-13T10:57:54Z</timestamp>
      <contributor>
        <ip>BesigedB</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I have arrived. Rar

-[[Legacy:BesigedB|BesigedB]]-

:&lt;i&gt;The [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] has been informed and will take care of that. Keep tea and cookies handy. &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BeyondCompare</title>
    <id>632</id>
    <revision>
      <id>1883</id>
      <timestamp>2005-06-06T03:30:37Z</timestamp>
      <contributor>
        <ip>Torin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A rather advanced file/folder comparison tool.

Among the things it can do:
* Define &quot;filters&quot; to decide what's a true changed line, and changes to ignore
* Side by side file comparison with color-coding
* Comparison view lets you move lines between files, insert them, edit them, etc.

Available at http://www.scootersoftware.com/

----

'''Xhiris:''' I've been using this to compare the [[Legacy:Deus Ex|Deus Ex]] classes with the [[Legacy:UT|UT]] ones, and it's been a lifesaver.  It's got a &quot;diff&quot; view a lot like [[Legacy:Visual SourceSafe|Visual SourceSafe]], but it even shows changes at the character level.  I'm actually considering this for work, it's that good.

'''Torin:''' Currently [[Legacy:BeyondCompare|BeyondCompare]] is a 30-Day free trial...5 June 2005

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1884</id>
      <timestamp>2004-01-28T02:07:52Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A rather advanced file/folder comparison tool.

Among the things it can do:
* Define &quot;filters&quot; to decide what's a true changed line, and changes to ignore
* Side by side file comparison with color-coding
* Comparison view lets you move lines between files, insert them, edit them, etc.

Available at http://www.scootersoftware.com/

----

'''Xhiris:''' I've been using this to compare the [[Legacy:Deus Ex|Deus Ex]] classes with the [[Legacy:UT|UT]] ones, and it's been a lifesaver.  It's got a &quot;diff&quot; view a lot like [[Legacy:Visual SourceSafe|Visual SourceSafe]], but it even shows changes at the character level.  I'm actually considering this for work, it's that good.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BigHeadRules</title>
    <id>622</id>
    <revision>
      <id>1860</id>
      <timestamp>2005-12-16T19:51:30Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameRules|GameRules]] &gt;&gt; BigHeadRules (Package: UnrealGame)}}

The BigHeadRules class affects the size of the [[Legacy:Pawn|Pawn]]'s head after they have made a kill or died.

==Properties==
; BigHeadMutator : The [[Legacy:MutBigHead|MutBigHead]] object associated with this GameRules actor, which is used to ''GetHeadScaleFor'' after a controlled [[Legacy:Pawn|Pawn]] has successfully killed another Pawn.

==Functions==
; ScoreKill ( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed ) : Alters the size of the Killer's head, based on Deaths vs Score, after any kill is made.

==Source Code Walkthrough==

This might be useful to further demonstrate custom [[Legacy:GameRules|GameRules]] scripting.  

&lt;uscript&gt;
class BigHeadRules extends GameRules;

var MutBigHead BigHeadMutator;

function ScoreKill(Controller Killer, Controller Killed)
{
	if ( (Killer != None) &amp;&amp; (Killer.Pawn != None) )
		Killer.Pawn.SetHeadScale(BigHeadMutator.GetHeadScaleFor(Killer.Pawn));

	if ( NextGameRules != None )
		NextGameRules.ScoreKill(Killer,Killed);
}

defaultproperties
{
}
&lt;/uscript&gt;

First lets look after the action, at the use of the variable ''NextGameRules''.  ''NextGameRules'' is the next [[Legacy:GameRules|GameRules]] in the [[Legacy:Linked List|linked list]] of GameRules.  If you neglect to add these two lines of code in a GameRules function, any GameRules loaded after this GameRules will not have a chance to augment play. 

This simply states that if the Killer exists and that the Killer happens to be a [[Legacy:Pawn|Pawn]], then in fact increase the size of the head on the Killer's [[Legacy:Pawn|Pawn]].  The size factor is determined by the function ''GetHeadScaleFor'' inside [[Legacy:MutBigHead|MutBigHead]].

&lt;uscript&gt;
function float GetHeadScaleFor(Pawn P)
{
	local float NewScale;
	
	if ( abs(P.PlayerReplicationInfo.Deaths) &lt; 1 )
		NewScale = P.PlayerReplicationInfo.Score + 1;
	else
		NewScale = (P.PlayerReplicationInfo.Score+1)/(P.PlayerReplicationInfo.Deaths+1);
	return FClamp(NewScale, 0.5, 4.0);	
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:MutBigWheel|MutBigWheel]] &amp;ndash; UT2004 only

==Discussion==

'''Burtlo:''' Thought I would use the subclasses as a great oppurtunity to show how [[Legacy:GameRules|GameRules]] work.

'''SuperApe:''' Fine idea.  I've also used the code for this and [[Legacy:MutVampire|MutVampire]] to learn about [[Legacy:GameRules|GameRules]] and [[Legacy:Mutator|Mutator]] classes.  Nice and concice. :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1861</id>
      <timestamp>2003-08-11T21:55:05Z</timestamp>
      <contributor>
        <ip>Burtlo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameRules|GameRules]] &gt;&gt; BigHeadRules (Package: UnrealGame)}}

The BigHeadRules class affects the gameplay be increasing the size of the [[Legacy:Controller|Controller]]'s head after they have made a kill.

==Properties==
;None

==Variables ==
;BigHeadMutator : is an object of the [[Legacy:MutBigHead|MutBigHead]] class which is used to ''GetHeadScaleFor'' the [[Legacy:Pawn|Pawn]] that has performed the successfully killed another [[Legacy:Controller|Controller]].

==Methods==
; ScoreKill ([[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed) : Augments the size of the Killer's head after they have made a successful kill of another [[Legacy:Controller|Controller]]. 

==Known Subclases==
;None

----

==Code Walkthrough.==

I thought that these would be useful examples to further demonstrate writing a [[Legacy:GameRules|GameRules]] for your game.  

&lt;uscript&gt;
class BigHeadRules extends GameRules;

var MutBigHead BigHeadMutator;

function ScoreKill(Controller Killer, Controller Killed)
{
	if ( (Killer != None) &amp;&amp; (Killer.Pawn != None) )
		Killer.Pawn.SetHeadScale(BigHeadMutator.GetHeadScaleFor(Killer.Pawn));

	if ( NextGameRules != None )
		NextGameRules.ScoreKill(Killer,Killed);
}

defaultproperties
{
}
&lt;/uscript&gt;

{{innerbox|First lets look after the action, at the use of the variable ''NextGameRules''.  ''NextGameRules'' is the next [[Legacy:GameRules|GameRules]] in the [[Legacy:Linked List|linked list]] of GameRules.  If you neglect to add these two lines of code in a GameRules function, any GameRules loaded after this GameRules will not have a chance to augment play. 

}}

This simply states that if the Killer exists and that the Killer happens to be a [[Legacy:Pawn|Pawn]], then in fact increase the size of the head on the Killer's [[Legacy:Pawn|Pawn]].  The size factor is determined by the function ''GetHeadScaleFor'' inside [[Legacy:MutBigHead|MutBigHead]].

&lt;uscript&gt;
function float GetHeadScaleFor(Pawn P)
{
	local float NewScale;
	
	if ( abs(P.PlayerReplicationInfo.Deaths) &lt; 1 )
		NewScale = P.PlayerReplicationInfo.Score + 1;
	else
		NewScale = (P.PlayerReplicationInfo.Score+1)/(P.PlayerReplicationInfo.Deaths+1);
	return FClamp(NewScale, 0.5, 4.0);	
}
&lt;/uscript&gt;

----

'''Burtlo:''' Thought I would use the subclasses as a great oppurtunity to show how [[Legacy:GameRules|GameRules]] work.  
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bilinear Filtering</title>
    <id>656</id>
    <revision>
      <id>1935</id>
      <timestamp>2005-03-03T23:18:19Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==What is &quot;filtering&quot; anyway?==

When an image is transformed (scaled, rotated, etc.) you often face the problem that there is simply not enough data to assign values to all pixels.  If an image's height and width are doubled, you are increasing the number of pixels by a factor of four.  You can assign data to a quarter of those pixels 100% reliably, but you need to guess, or '''interpolate''' values for all the pixels in between.  The simplest way is just to use the value of the nearest known pixel.  This is known as ''point'' or ''nearest neighbour'' interpolation, and can result in a blocky, unappealing image to look at and - in the case of a size reduction - can even cause large, noticable gaps in lines.

Bilinear interpolation is a way of guessing pixel values in order to create a smoother image.

{|

|-
|
|
[[Image:Legacy_texture_filter_example_small.png|center|No filter]]

|
[[Image:Legacy_texture_filter_example_point.png|center|3x Scale Point filter]]

|
[[Image:Legacy_texture_filter_example_bilinear.png|center|3x Scale Bilinear filter]]

|}

==So what uses bilinear filtering?==

In games, bilinear filtering is primarily used to apply a texture to a surface.  As you look around the world, the 2D shape of the surface is altered (vertices further away from the viewpoint appear closer together), and the texture must be transformed to fit the new shape.  If you've played older shooters (i.e. Doom) you can see how aliased and pixelated the texture looks when using point filtering for this process.

Bilinear filtering will make these textures look smoother and more convincing.  However, on a surface that extends into the distance, the texture can get less and less clear as it gets further from the viewpoint.  This is where the mipmapping technique comes in to play - by creating several smaller, clear versions of the same texture, you can apply the larger versions close to the viewpoint and the smaller versions further away to result in an overall sharper texture application.

However even this has its drawbacks:  Now that we're applying multiple textures to one surface and filtering them separately, there is often noticable lines where there is a change in mip level.  These lines look VERY unrealistic when you move, as they maintain a constant distance from the viewpoint (thus you have lines which appear to move as you move).  This is where [[Legacy:Trilinear Filtering|Trilinear Filtering]] comes into play, by adding a third linear filter between the mipmap levels, these lines are eliminated.

There is another type of filtering, called [[Legacy:Anisotropic Filtering|Anisotropic Filtering]], which works WITH bilinear/trilinear filtering to make far away textures appear *very* clear.

==The math behind bilinear interpolation==

The general idea when interpolating bilinearly is that the colour of an unknown pixel should be spaced proportionally between the colour values of the pixels around it. Therefore if an unknown pixel is halfway between two known pixels, its colour value should be halfway between their values.  If the unknown pixel is closer to one of the known pixels, it should be closer to that pixel's colour.

More specifically, if the known pixels have values V1 and V2, and the distances from the unknown pixels are D1 and D2, the unknown pixel should have the value:

&lt;uscript&gt;V = (V1 * D2 + V2 * D1) / (D1 + D2)&lt;/uscript&gt;

This equation will work for interpolating along a line, and is called ''linear interpolation''  However, it is a bit more complicated for images, as they are comprised of horizontal '''and''' vertical lines.  We must use a combination of 2 linear filters - horizontal and vertical - to create the desired effect.  This results in a ''bilinear interpolation''.

When interpolating bilinearly, four reference pixels are required.  The pixel we are trying to determine the value of will lie somewhere in the square defined by those reference pixels.  Say we are trying to find the value of pixel at (X0, Y0), with our 4 reference pixels being at (x1, y1), (x2, y1), (x1, y2), (x2, y2).  If those pixels have values of V11, V12, V21, and V22, we will start by interpolating horizontally between the 2 horizontal pairs of pixels.

&lt;uscript&gt;V1 = (V11 * dx2 + V21 * dx1) / (dx1 + dx2)
V2 = (V12 * dx2 + V22 * dx1) / (dx1 + dx2)&lt;/uscript&gt;

We will then interpolate these new values vertically to get our known value.

&lt;uscript&gt;V = [(V11 * dx2 + V21 * dx1) / (dx1 + dx2) * dy2 + (V12 * dx2 + V22 * dx1) / (dx1 + dx2) * dy1)] / (dy1 + dy2)

  = (V11 * dx2 * dy2 + V21 * dx1 * dy2 + V12 * dx2 * dy1 + V22 * dx1 * dy1) / (dx1 + dx2) / (dy1 + dy2)&lt;/uscript&gt;

Now since all our reference pixels are adjacent to each other, dx1 + dx2 = 1, and dy1 + dy2 = 1.  Substitute:

&lt;uscript&gt;V = V11 * dx2 * dy2 + V21 * dx1 * dy2 + V12 * dx2 * dy1 + V22 * dx1 * dy1&lt;/uscript&gt;

----

'''Draconx:''' I'm not very good at explaining myself when it comes to equations.  I also don't think I formatted this particularly well.  Perhaps someone could clean this up a bit? :P

'''Foxpaw:''' Err, isn't the title of this page extremely misleading? Bilinear filtering is one method by which different mipmaps are interpolated between when a frame is rendered, not the method by which the mipmaps are generated.

Bilinear interpolation would be a much more accurate name for this page.

'''Draconx:''' I added a thing about bilinear filtering's application in games.  A bilinear filter is simply a transformation that uses bilinear interpolation, but it is not technically a requirement for mipmapping, nor is mipmapping a requirement for bilinear filtering of textures onto a surface.  And interpolating BETWEEN the mipmaps is a function of [[Legacy:Trilinear Filtering|Trilinear Filtering]] - which mipmaps are required for.  Trilinear filtering is simply bilinearly filtered mipmaps with linear interpolation between them.</text>
    </revision>
    <revision>
      <id>1936</id>
      <timestamp>2005-03-02T05:26:06Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When an image is transformed (scaled, rotated, etc.) you often face the problem that there is simply not enough data to assign values to all pixels.  If an image's height and width are doubled, you are increasing the number of pixels by a factor of four.  You can assign data to a quarter of those pixels 100% reliably, but you need to guess, or '''interpolate''' values for all the pixels in between.  The simplest way is just to use the value of the nearest known pixel.  This is known as ''point'' or ''nearest neighbour'' interpolation, and can result in a blocky, unappealing image to look at and - in the case of a size reduction - can even cause large, noticable gaps in lines.

Bilinear interpolation is a way of guessing pixel values in order to create a smoother image.  The general idea is that the colour of an unknown pixel should be spaced proportionally between the colour values of the pixels around it.  Therefore if an unknown pixel is halfway between two known pixels, its colour value should be halfway between their values.  If the unknown pixel is closer to one of the known pixels, it should be closer to that pixel's colour.

{|

|-
|
|
[[Image:Legacy_texture_filter_example_small.png|center|No filter]]

|
[[Image:Legacy_texture_filter_example_point.png|center|Point filter]]

|
[[Image:Legacy_texture_filter_example_bilinear.png|center|Bilinear filter]]

|}

More specifically, if the known pixels have values V1 and V2, and the distances from the unknown pixels are D1 and D2, the unknown pixel should have the value:

&lt;uscript&gt;V = (V1 * D2 + V2 * D1) / (D1 + D2)&lt;/uscript&gt;

This equation will work for interpolating along a line, and is called ''linear interpolation''  However, it is a bit more complicated for images, as they are comprised of horizontal '''and''' vertical lines.  We must use a combination of 2 linear filters - horizontal and vertical - to create the desired effect.  This results in a ''bilinear interpolation''.

When interpolating bilinearly, four reference pixels are required.  The pixel we are trying to determine the value of will lie somewhere in the square defined by those reference pixels.  Say we are trying to find the value of pixel at (X0, Y0), with our 4 reference pixels being at (x1, y1), (x2, y1), (x1, y2), (x2, y2).  If those pixels have values of V11, V12, V21, and V22, we will start by interpolating horizontally between the 2 horizontal pairs of pixels.

&lt;uscript&gt;V1 = (V11 * dx2 + V21 * dx1) / (dx1 + dx2)
V2 = (V12 * dx2 + V22 * dx1) / (dx1 + dx2)&lt;/uscript&gt;

We will then interpolate these new values vertically to get our known value.

&lt;uscript&gt;V = [(V11 * dx2 + V21 * dx1) / (dx1 + dx2) * dy2 + (V12 * dx2 + V22 * dx1) / (dx1 + dx2) * dy1)] / (dy1 + dy2)

  = (V11 * dx2 * dy2 + V21 * dx1 * dy2 + V12 * dx2 * dy1 + V22 * dx1 * dy1) / (dx1 + dx2) / (dy1 + dy2)&lt;/uscript&gt;

Now since all our reference pixels are adjacent to each other, dx1 + dx2 = 1, and dy1 + dy2 = 1.  Substitute:

&lt;uscript&gt;V = V11 * dx2 * dy2 + V21 * dx1 * dy2 + V12 * dx2 * dy1 + V22 * dx1 * dy1&lt;/uscript&gt;

----

'''Draconx:''' I'm not very good at explaining myself when it comes to equations.  I also don't think I formatted this particularly well.  Perhaps someone could clean this up a bit? :P

'''Foxpaw:''' Err, isn't the title of this page extremely misleading? Bilinear filtering is one method by which different mipmaps are interpolated between when a frame is rendered, not the method by which the mipmaps are generated.

Bilinear interpolation would be a much more accurate name for this page.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BinarySearch</title>
    <id>572</id>
    <revision>
      <id>1751</id>
      <timestamp>2004-08-19T08:51:39Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A Binary Search is a fast way of searching a ''sorted'' array.

==For this to work:==
*The array must be sorted in ascending order. [[Legacy:QuickSort|QuickSort]] is good for this.
*The array to be searched is called MyArray.
*The Algorithm will return the element number if SearchString is found, otherwise it will return -1.
*The values Low and High represent the position range that is to be searched.

==Algorithm==

# If High is smaller than Low produce -1 and quit the algorithm, as it has not found what it was looking for
# Set Middle (the holder for the number of the partition element) to (Low+High)/2 - which would be the midle of the array.
# If MyArray[Middle] is equal to SearchString (You've found it!) Return Middle and quit the algorithm. &lt;br /&gt;else, if SearchString is smaller than MyArray[Middle] then set High to Middle - 1, altering the range to be searched to the lower half of the current range.&lt;br /&gt;else, if SearchString is larger than MyArray[Middle] then set Low to Middle + 1, altering the range to be searched to the upper half of the current range.
# Go back to 1.

==Code==

&lt;uscript&gt;
Function Int BinarySearch(Int Low, Int High, String SearchString)
{
//  low is the lower index, high is the upper index
//  of the region of array a that is to be sorted

    Local Int Middle;

    while (Low &lt;= High) //only run while low is less than or equal to high.
        {
        Middle = (Low + High) / 2; //Set 'Middle' to be some midpoint
    
        if (MyArray[Middle] ~= SearchString) //if its found, return the array element
            Return Middle;

        if (MyArray[Middle] &gt; SearchString) //if the SearchString is less, adjust the 'high' value accordingly.
            High = Middle - 1;
        else if (MyArray[Middle] &lt; SearchString) //if the SearchString is more, adjust the 'low' value accordingly
            Low = Middle + 1;
        }
    Return -1; //if it fails, return -1.            
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Open Source|Open Source]]
* [[Legacy:QuickSort|QuickSort]]

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1752</id>
      <timestamp>2002-09-09T23:13:32Z</timestamp>
      <contributor>
        <ip>Will</ip>
      </contributor>
      <minor/>
      <comment>punctuation...</comment>
      <text xml:space="preserve">A Binary Search is a fast way of searching a ''sorted'' array.

====For this to work:====
*The array must be sorted in ascending order. [[Legacy:QuickSort|QuickSort]] is good for this.
*The array to be searched is called MyArray.
*The Algorithm will return the element number if SearchString is found, otherwise it will return -1.
*The values Low and High represent the position range that is to be searched.

====Algorithm====

# If High is smaller than Low produce -1 and quit the algorithm, as it has not found what it was looking for
# Set Middle (the holder for the number of the partition element) to (Low+High)/2 - which would be the midle of the array.
# If MyArray[Middle] is equal to SearchString (You've found it!) Return Middle and quit the algorithm. &lt;br /&gt;else, if SearchString is smaller than MyArray[Middle] then set High to Middle - 1, altering the range to be searched to the lower half of the current range.&lt;br /&gt;else, if SearchString is larger than MyArray[Middle] then set Low to Middle + 1, altering the range to be searched to the upper half of the current range.
# Go back to 1.

====Code====

&lt;uscript&gt;
Function Int BinarySearch(Int Low, Int High, String SearchString)
{
//  low is the lower index, high is the upper index
//  of the region of array a that is to be sorted

    Local Int Middle;

    while (Low &lt;= High) //only run while low is less than or equal to high.
        {
        Middle = (Low + High) / 2; //Set 'Middle' to be some midpoint
    
        if (MyArray[Middle] ~= SearchString) //if its found, return the array element
            Return Middle;

        if (MyArray[Middle] &gt; SearchString) //if the SearchString is less, adjust the 'high' value accordingly.
            High = Middle - 1;
        else if (MyArray[Middle] &lt; SearchString) //if the SearchString is more, adjust the 'low' value accordingly
            Low = Middle + 1;
        }
    Return -1; //if it fails, return -1.            
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1753</id>
      <timestamp>2003-05-23T15:24:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A Binary Search is a fast way of searching a ''sorted'' array.

==For this to work:==
*The array must be sorted in ascending order. [[Legacy:QuickSort|QuickSort]] is good for this.
*The array to be searched is called MyArray.
*The Algorithm will return the element number if SearchString is found, otherwise it will return -1.
*The values Low and High represent the position range that is to be searched.

==Algorithm==

# If High is smaller than Low produce -1 and quit the algorithm, as it has not found what it was looking for
# Set Middle (the holder for the number of the partition element) to (Low+High)/2 - which would be the midle of the array.
# If MyArray[Middle] is equal to SearchString (You've found it!) Return Middle and quit the algorithm. &lt;br /&gt;else, if SearchString is smaller than MyArray[Middle] then set High to Middle - 1, altering the range to be searched to the lower half of the current range.&lt;br /&gt;else, if SearchString is larger than MyArray[Middle] then set Low to Middle + 1, altering the range to be searched to the upper half of the current range.
# Go back to 1.

==Code==

&lt;uscript&gt;
Function Int BinarySearch(Int Low, Int High, String SearchString)
{
//  low is the lower index, high is the upper index
//  of the region of array a that is to be sorted

    Local Int Middle;

    while (Low &lt;= High) //only run while low is less than or equal to high.
        {
        Middle = (Low + High) / 2; //Set 'Middle' to be some midpoint
    
        if (MyArray[Middle] ~= SearchString) //if its found, return the array element
            Return Middle;

        if (MyArray[Middle] &gt; SearchString) //if the SearchString is less, adjust the 'high' value accordingly.
            High = Middle - 1;
        else if (MyArray[Middle] &lt; SearchString) //if the SearchString is more, adjust the 'low' value accordingly
            Low = Middle + 1;
        }
    Return -1; //if it fails, return -1.            
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Open Source|Open Source]]
* [[Legacy:QuickSort|QuickSort]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Binding Editor Commands</title>
    <id>558</id>
    <revision>
      <id>1718</id>
      <timestamp>2003-10-27T01:21:01Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:UnrealEd Console|UnrealEd console]] commands can be assigned to toolbox buttons (see  [[Legacy:Custom Toolbox Buttons|Custom Toolbox Buttons]]) or to keys.

==Binding to Keys ==
* Open the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window
* Advanced -&gt; Raw Key Bindings
* select a key
* Type in the command

===Examples ===
* &quot;POLY TEXMULT UU=0 VV=0 UV=-1 VU=1&quot;. This will create a shortcut key that rotates a surface texture by 90&amp;deg;.
* ACTOR ADD CLASS=&lt;CLASS&gt; 

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1719</id>
      <timestamp>2003-05-25T09:11:21Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">[[Legacy:UnrealEd Console|UnrealEd console]] commands can be assigned to toolbox buttons (see  [[Legacy:Custom Toolbox Buttons|Custom Toolbox Buttons]]) or to keys.

==Binding to Keys ==

Open the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window, and under Advanced -&gt; Raw Key Bindings select a key, preferably an unused one. Paste in the command.

===Examples ===
* &quot;POLY TEXMULT UU=0 VV=0 UV=-1 VU=1&quot;. This will create a shorcut key that rotates a surface texture by 90&amp;deg;.
* ACTOR ADD CLASS=&lt;CLASS&gt; (question: where does the actor get added? centre of the map?)

External link: http://www.langsuyar.com/unreal/unrealed.html

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1720</id>
      <timestamp>2003-10-26T21:09:15Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>removed dead link</comment>
      <text xml:space="preserve">[[Legacy:UnrealEd Console|UnrealEd console]] commands can be assigned to toolbox buttons (see  [[Legacy:Custom Toolbox Buttons|Custom Toolbox Buttons]]) or to keys.

==Binding to Keys ==
* Open the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window
* Advanced -&gt; Raw Key Bindings
* select a key
* Type in the command

===Examples ===
* &quot;POLY TEXMULT UU=0 VV=0 UV=-1 VU=1&quot;. This will create a shortcut key that rotates a surface texture by 90&amp;deg;.
* ACTOR ADD CLASS=&lt;CLASS&gt; 

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Binding Keys</title>
    <id>565</id>
    <revision>
      <id>1736</id>
      <timestamp>2007-07-12T10:03:49Z</timestamp>
      <contributor>
        <ip>Cpe-071-068-084-050.carolina.res.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*x value was backwards</comment>
      <text xml:space="preserve">To '''''bind''''' a key means to assign an in-game command with that of a button on a keyboard, mouse or joystick (or other input device).

==Binding Keys==

There are two methods for binding keys to commands. Both work in all [[Legacy:Unreal Engine|Unreal Engine]] games (confirm this please).

===Using the in-game console.===

The syntax for the command is:
 set input &lt;key&gt; &lt;command&gt;

For example:
 set input Z Behindview 1 | OnRelease Behindview 0

Note, for Deus Ex, the syntax is (Deus Ex uses Extension.InputExt rather than Engine.Input for its input class):
 set inputext &lt;key&gt; &lt;command&gt;

So, if I wanted to bind the g key to activate god mode, the syntax would be:
 set inputext g god

===Edit the User.ini file===

The other method is to edit the [[Legacy:User.Ini|User.ini]] file. Under the section [Engine.Input], there should be many lines like this:
 W=MoveForward

Keys can easily be bound to commands by finding the appropriate line and editing it. The syntax is
 &lt;key&gt;=&lt;command&gt;

For example:
 Z=Behindview 1 | OnRelease Behindview 0

(In both cases, the keybind makes it such that when the 'Z' button is held down, it switches to BehindView (third-person view). When you release the key, it goes back to normal (first-person) view.)

Multiple commands can be bound to one key by separating the commands with the pipe character (&quot;&lt;TT&gt;{|

|}
&lt;/TT&gt;&quot;).

Other useful binding commands are PipedSwitchWeapon and SwitchToLastWeapon.  Consider the following bind.

 V=PipedSwitchWeapon 3 | PipedSwitchWeapon 7

This will bind the Bio Rifle and the Flak Cannon to the V key such that if you have both weapons you will be able to toggle between them by repeated presses of the V key.  If you only have a single weapon out of the two pressing the V key will switch to the weapon you have.

 R=SwitchWeapon 1| AltFire | OnRelease SwitchToLastWeapon

This binding will cause the R key to bring up the shield when the key is pressed, and then revert to the weapon you were holding when you pressed the R key.

Bindings not only work with keys, but also for mouse and joystick buttons:
 MouseWheelDown=NextWeapon
 Joy1=Fire

===But how do Epic/DE assign keys in the Configure Controls menus?===

This differs from version to version of the Unreal Engine.  Unreal Tournament has third-party developer (i.e. mod makers) key bind support - this means we can add new keys to the bottom of the pre-existing Configure Key list.

Games such as Deus Ex, if you want to define a new key, you have to replace the entire menu(!) which is a more inefficent use of code.  However, both methods work - but you'd be made to replace the entire Configure Key menu in UT!

===How to add keybinds to UT===

[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] - This class allows you to set your button names and aliases so players can configure their own controls.

===How to add keybinds to UT2003===

As of version 2179, [[Legacy:UT2003|UT2003]] now has a similar class - [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]].

==Using Aliases==

An '''''alias''''' is a short command that represents one or more commands. Aliases can be made in the User.ini file, again under the [Engine.Input] section.

To create an alias, find an empty alias line like this one:

&lt;pre&gt; Aliases[36]=(Command=,Alias=)&lt;/pre&gt;

If there aren't any, then make your own, adding a new number. The line can be modified to make an alias. The syntax is:

&lt;pre&gt; Aliases[&lt;number&gt;]=(Command=&quot;&lt;command(s)&gt;&quot;,Alias=&quot;&lt;alias name&gt;&quot;)&lt;/pre&gt;

For example, say I want to make a new command called &quot;wireframe&quot; that turns on wireframe mode. This might be how I go about doing it:

&lt;pre&gt; Aliases[36]=(Command=&quot;rmode 1&quot;,Alias=&quot;wireframe&quot;)&lt;/pre&gt;

===Toggle Commands===

Aliases can be used in a clever way in combination with binds. Suppose I want to make it so that pressing X will toggle between wireframe mode and normal mode. It might seem rather difficult at first, but with a couple of aliases and a keybind it is quite simple:

&lt;pre&gt;
 Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
 Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
 X=wireframe
&lt;/pre&gt;

The way this works is, pressing X runs the command &quot;wireframe&quot;. This alias sets the rmode to wireframe, and then changes the X bind to run the command &quot;nowireframe&quot;. When X is pressed again, the command &quot;nowireframe&quot; reverts the rmode back to normal, and it rebinds X to &quot;wireframe&quot; again. With a little modification, this method can easily be extended to cycle between several commands.

===Content that needs to pay a visit to the UnrealEd Goblin===
; Aliases : Keys must have an alias function name. This alias will call an exec function in your player class if you have one. This is good for one time use functions like QSFire()

; Buttons : If you need to know when the player releases or is holding a button, you must have an input button variable, and an alias binding.

; Input Button Variable : the player class must contain your button variables (var input byte bMyButton;)...the button is true when held, false when not.

; Alias Binding : In order to prevent 'Bad button command' from logging when you press your button, you have to bind it. To do this while inside UT press '~' to bring up your console, then type PREFERENCES &lt;enter&gt; to bring up Advanced Options. Select ADVANCED, KEY ALAISES, ALIASES, then go down to an empty space and enter your alias name and the command parameter BUTTON bMyButton.

==Related Topics==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]
* [[Legacy:InputKeyMap | Input Key Mapping]]

==Discussion ==

'''ZxAnPhOrIaN:''' I use the menu and windows key on my keyboard for the behindview 0 and 1 commands.

'''Bcladd:''' Don't mean to seem dim but I cannot find the class [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] anywhere in my 2199 source tree nor is it referenced in any of the source code. I am guessing the reference to it above should probably be eliminated.

'''PleaseLoveMe:''' No, it's there.  Check Object -&gt; GUI -&gt; GUIUserKeyBinding in the object tree.  I recommend using WOTgreal for editing uscript because it makes it easier to find such things.

'''Tarquin:''' How do you create a binding that toggles, eg &quot;Rmode 1 / rmode 5&quot;?

'''Mychaeel:''' You can't.  The only thing you could do is make a binding that switches to &quot;rmode 1&quot; when pressed and back to &quot;rmode 5&quot; when released:  &quot;rmode 1 | onrelease rmode 5&quot;.

'''Tarquin:''' Pity :( I remember Quake had a neat trick of the binding for the keypress ''creating'' the binding for the release, and vice versa.

'''Wormbo:''' It's possible with aliases:

&lt;pre&gt;
Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
X=wireframe
&lt;/pre&gt;

'''DemonThing:''' Alright, I clarified the article a bit (I think), and added a little section on aliases. (Thanks Wormbo for pointing that out)

'''Rock-SoLiD:''' Here is a present to all the UT'99 folks.  A working ViewToggle.  Could not find this anywhere online so I had to use my mind a bit following the above wireframe alias.  Thanks Wormbo.

&lt;pre&gt;
Aliases[26]=(Command=&quot;behindview 1 | set input x 1stperson&quot;,Alias=3rdperson)
Aliases[27]=(Command=&quot;behindview 0 | set input x 3rdperson&quot;,Alias=1stperson)
x=3rdperson
&lt;/pre&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1737</id>
      <timestamp>2007-07-03T08:55:41Z</timestamp>
      <contributor>
        <ip>Rock-SoLiD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">To '''''bind''''' a key means to assign an in-game command with that of a button on a keyboard, mouse or joystick (or other input device).

==Binding Keys==

There are two methods for binding keys to commands. Both work in all [[Legacy:Unreal Engine|Unreal Engine]] games (confirm this please).

===Using the in-game console.===

The syntax for the command is:
 set input &lt;key&gt; &lt;command&gt;

For example:
 set input Z Behindview 1 | OnRelease Behindview 0

Note, for Deus Ex, the syntax is (Deus Ex uses Extension.InputExt rather than Engine.Input for its input class):
 set inputext &lt;key&gt; &lt;command&gt;

So, if I wanted to bind the g key to activate god mode, the syntax would be:
 set inputext g god

===Edit the User.ini file===

The other method is to edit the [[Legacy:User.Ini|User.ini]] file. Under the section [Engine.Input], there should be many lines like this:
 W=MoveForward

Keys can easily be bound to commands by finding the appropriate line and editing it. The syntax is
 &lt;key&gt;=&lt;command&gt;

For example:
 Z=Behindview 1 | OnRelease Behindview 0

(In both cases, the keybind makes it such that when the 'Z' button is held down, it switches to BehindView (third-person view). When you release the key, it goes back to normal (first-person) view.)

Multiple commands can be bound to one key by separating the commands with the pipe character (&quot;&lt;TT&gt;{|

|}
&lt;/TT&gt;&quot;).

Other useful binding commands are PipedSwitchWeapon and SwitchToLastWeapon.  Consider the following bind.

 V=PipedSwitchWeapon 3 | PipedSwitchWeapon 7

This will bind the Bio Rifle and the Flak Cannon to the V key such that if you have both weapons you will be able to toggle between them by repeated presses of the V key.  If you only have a single weapon out of the two pressing the V key will switch to the weapon you have.

 R=SwitchWeapon 1| AltFire | OnRelease SwitchToLastWeapon

This binding will cause the R key to bring up the shield when the key is pressed, and then revert to the weapon you were holding when you pressed the R key.

Bindings not only work with keys, but also for mouse and joystick buttons:
 MouseWheelDown=NextWeapon
 Joy1=Fire

===But how do Epic/DE assign keys in the Configure Controls menus?===

This differs from version to version of the Unreal Engine.  Unreal Tournament has third-party developer (i.e. mod makers) key bind support - this means we can add new keys to the bottom of the pre-existing Configure Key list.

Games such as Deus Ex, if you want to define a new key, you have to replace the entire menu(!) which is a more inefficent use of code.  However, both methods work - but you'd be made to replace the entire Configure Key menu in UT!

===How to add keybinds to UT===

[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] - This class allows you to set your button names and aliases so players can configure their own controls.

===How to add keybinds to UT2003===

As of version 2179, [[Legacy:UT2003|UT2003]] now has a similar class - [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]].

==Using Aliases==

An '''''alias''''' is a short command that represents one or more commands. Aliases can be made in the User.ini file, again under the [Engine.Input] section.

To create an alias, find an empty alias line like this one:

&lt;pre&gt; Aliases[36]=(Command=,Alias=)&lt;/pre&gt;

If there aren't any, then make your own, adding a new number. The line can be modified to make an alias. The syntax is:

&lt;pre&gt; Aliases[&lt;number&gt;]=(Command=&quot;&lt;command(s)&gt;&quot;,Alias=&quot;&lt;alias name&gt;&quot;)&lt;/pre&gt;

For example, say I want to make a new command called &quot;wireframe&quot; that turns on wireframe mode. This might be how I go about doing it:

&lt;pre&gt; Aliases[36]=(Command=&quot;rmode 1&quot;,Alias=&quot;wireframe&quot;)&lt;/pre&gt;

===Toggle Commands===

Aliases can be used in a clever way in combination with binds. Suppose I want to make it so that pressing X will toggle between wireframe mode and normal mode. It might seem rather difficult at first, but with a couple of aliases and a keybind it is quite simple:

&lt;pre&gt;
 Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
 Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
 X=wireframe
&lt;/pre&gt;

The way this works is, pressing X runs the command &quot;wireframe&quot;. This alias sets the rmode to wireframe, and then changes the X bind to run the command &quot;nowireframe&quot;. When X is pressed again, the command &quot;nowireframe&quot; reverts the rmode back to normal, and it rebinds X to &quot;wireframe&quot; again. With a little modification, this method can easily be extended to cycle between several commands.

===Content that needs to pay a visit to the UnrealEd Goblin===
; Aliases : Keys must have an alias function name. This alias will call an exec function in your player class if you have one. This is good for one time use functions like QSFire()

; Buttons : If you need to know when the player releases or is holding a button, you must have an input button variable, and an alias binding.

; Input Button Variable : the player class must contain your button variables (var input byte bMyButton;)...the button is true when held, false when not.

; Alias Binding : In order to prevent 'Bad button command' from logging when you press your button, you have to bind it. To do this while inside UT press '~' to bring up your console, then type PREFERENCES &lt;enter&gt; to bring up Advanced Options. Select ADVANCED, KEY ALAISES, ALIASES, then go down to an empty space and enter your alias name and the command parameter BUTTON bMyButton.

==Related Topics==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]
* [[Legacy:InputKeyMap | Input Key Mapping]]

==Discussion ==

'''ZxAnPhOrIaN:''' I use the menu and windows key on my keyboard for the behindview 0 and 1 commands.

'''Bcladd:''' Don't mean to seem dim but I cannot find the class [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] anywhere in my 2199 source tree nor is it referenced in any of the source code. I am guessing the reference to it above should probably be eliminated.

'''PleaseLoveMe:''' No, it's there.  Check Object -&gt; GUI -&gt; GUIUserKeyBinding in the object tree.  I recommend using WOTgreal for editing uscript because it makes it easier to find such things.

'''Tarquin:''' How do you create a binding that toggles, eg &quot;Rmode 1 / rmode 5&quot;?

'''Mychaeel:''' You can't.  The only thing you could do is make a binding that switches to &quot;rmode 1&quot; when pressed and back to &quot;rmode 5&quot; when released:  &quot;rmode 1 | onrelease rmode 5&quot;.

'''Tarquin:''' Pity :( I remember Quake had a neat trick of the binding for the keypress ''creating'' the binding for the release, and vice versa.

'''Wormbo:''' It's possible with aliases:

&lt;pre&gt;
Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
X=wireframe
&lt;/pre&gt;

'''DemonThing:''' Alright, I clarified the article a bit (I think), and added a little section on aliases. (Thanks Wormbo for pointing that out)

'''Rock-SoLiD:''' Here is a present to all the UT'99 folks.  A working ViewToggle.  Could not find this anywhere on the net so I had to use my mind a bit following the wireframe alias.  Thanks Wormbo.

&lt;pre&gt;
Aliases[26]=(Command=&quot;behindview 1 | set input x 1stperson&quot;,Alias=3rdperson)
Aliases[27]=(Command=&quot;behindview 0 | set input x 3rdperson&quot;,Alias=1stperson)
x=1stperson
&lt;/pre&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1738</id>
      <timestamp>2007-07-03T08:59:17Z</timestamp>
      <contributor>
        <ip>Rock-SoLiD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">To '''''bind''''' a key means to assign an in-game command with that of a button on a keyboard, mouse or joystick (or other input device).

==Binding Keys==

There are two methods for binding keys to commands. Both work in all [[Legacy:Unreal Engine|Unreal Engine]] games (confirm this please).

===Using the in-game console.===

The syntax for the command is:
 set input &lt;key&gt; &lt;command&gt;

For example:
 set input Z Behindview 1 | OnRelease Behindview 0

Note, for Deus Ex, the syntax is (Deus Ex uses Extension.InputExt rather than Engine.Input for its input class):
 set inputext &lt;key&gt; &lt;command&gt;

So, if I wanted to bind the g key to activate god mode, the syntax would be:
 set inputext g god

===Edit the User.ini file===

The other method is to edit the [[Legacy:User.Ini|User.ini]] file. Under the section [Engine.Input], there should be many lines like this:
 W=MoveForward

Keys can easily be bound to commands by finding the appropriate line and editing it. The syntax is
 &lt;key&gt;=&lt;command&gt;

For example:
 Z=Behindview 1 | OnRelease Behindview 0

(In both cases, the keybind makes it such that when the 'Z' button is held down, it switches to BehindView (third-person view). When you release the key, it goes back to normal (first-person) view.)

Multiple commands can be bound to one key by separating the commands with the pipe character (&quot;&lt;TT&gt;{|

|}
&lt;/TT&gt;&quot;).

Other useful binding commands are PipedSwitchWeapon and SwitchToLastWeapon.  Consider the following bind.

 V=PipedSwitchWeapon 3 | PipedSwitchWeapon 7

This will bind the Bio Rifle and the Flak Cannon to the V key such that if you have both weapons you will be able to toggle between them by repeated presses of the V key.  If you only have a single weapon out of the two pressing the V key will switch to the weapon you have.

 R=SwitchWeapon 1| AltFire | OnRelease SwitchToLastWeapon

This binding will cause the R key to bring up the shield when the key is pressed, and then revert to the weapon you were holding when you pressed the R key.

Bindings not only work with keys, but also for mouse and joystick buttons:
 MouseWheelDown=NextWeapon
 Joy1=Fire

===But how do Epic/DE assign keys in the Configure Controls menus?===

This differs from version to version of the Unreal Engine.  Unreal Tournament has third-party developer (i.e. mod makers) key bind support - this means we can add new keys to the bottom of the pre-existing Configure Key list.

Games such as Deus Ex, if you want to define a new key, you have to replace the entire menu(!) which is a more inefficent use of code.  However, both methods work - but you'd be made to replace the entire Configure Key menu in UT!

===How to add keybinds to UT===

[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] - This class allows you to set your button names and aliases so players can configure their own controls.

===How to add keybinds to UT2003===

As of version 2179, [[Legacy:UT2003|UT2003]] now has a similar class - [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]].

==Using Aliases==

An '''''alias''''' is a short command that represents one or more commands. Aliases can be made in the User.ini file, again under the [Engine.Input] section.

To create an alias, find an empty alias line like this one:

&lt;pre&gt; Aliases[36]=(Command=,Alias=)&lt;/pre&gt;

If there aren't any, then make your own, adding a new number. The line can be modified to make an alias. The syntax is:

&lt;pre&gt; Aliases[&lt;number&gt;]=(Command=&quot;&lt;command(s)&gt;&quot;,Alias=&quot;&lt;alias name&gt;&quot;)&lt;/pre&gt;

For example, say I want to make a new command called &quot;wireframe&quot; that turns on wireframe mode. This might be how I go about doing it:

&lt;pre&gt; Aliases[36]=(Command=&quot;rmode 1&quot;,Alias=&quot;wireframe&quot;)&lt;/pre&gt;

===Toggle Commands===

Aliases can be used in a clever way in combination with binds. Suppose I want to make it so that pressing X will toggle between wireframe mode and normal mode. It might seem rather difficult at first, but with a couple of aliases and a keybind it is quite simple:

&lt;pre&gt;
 Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
 Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
 X=wireframe
&lt;/pre&gt;

The way this works is, pressing X runs the command &quot;wireframe&quot;. This alias sets the rmode to wireframe, and then changes the X bind to run the command &quot;nowireframe&quot;. When X is pressed again, the command &quot;nowireframe&quot; reverts the rmode back to normal, and it rebinds X to &quot;wireframe&quot; again. With a little modification, this method can easily be extended to cycle between several commands.

===Content that needs to pay a visit to the UnrealEd Goblin===
; Aliases : Keys must have an alias function name. This alias will call an exec function in your player class if you have one. This is good for one time use functions like QSFire()

; Buttons : If you need to know when the player releases or is holding a button, you must have an input button variable, and an alias binding.

; Input Button Variable : the player class must contain your button variables (var input byte bMyButton;)...the button is true when held, false when not.

; Alias Binding : In order to prevent 'Bad button command' from logging when you press your button, you have to bind it. To do this while inside UT press '~' to bring up your console, then type PREFERENCES &lt;enter&gt; to bring up Advanced Options. Select ADVANCED, KEY ALAISES, ALIASES, then go down to an empty space and enter your alias name and the command parameter BUTTON bMyButton.

==Related Topics==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]
* [[Legacy:InputKeyMap | Input Key Mapping]]

==Discussion ==

'''ZxAnPhOrIaN:''' I use the menu and windows key on my keyboard for the behindview 0 and 1 commands.

'''Bcladd:''' Don't mean to seem dim but I cannot find the class [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] anywhere in my 2199 source tree nor is it referenced in any of the source code. I am guessing the reference to it above should probably be eliminated.

'''PleaseLoveMe:''' No, it's there.  Check Object -&gt; GUI -&gt; GUIUserKeyBinding in the object tree.  I recommend using WOTgreal for editing uscript because it makes it easier to find such things.

'''Tarquin:''' How do you create a binding that toggles, eg &quot;Rmode 1 / rmode 5&quot;?

'''Mychaeel:''' You can't.  The only thing you could do is make a binding that switches to &quot;rmode 1&quot; when pressed and back to &quot;rmode 5&quot; when released:  &quot;rmode 1 | onrelease rmode 5&quot;.

'''Tarquin:''' Pity :( I remember Quake had a neat trick of the binding for the keypress ''creating'' the binding for the release, and vice versa.

'''Wormbo:''' It's possible with aliases:

&lt;pre&gt;
Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
X=wireframe
&lt;/pre&gt;

'''DemonThing:''' Alright, I clarified the article a bit (I think), and added a little section on aliases. (Thanks Wormbo for pointing that out)

'''Rock-SoLiD:''' Here is a present to all the UT'99 folks.  A working ViewToggle.  Could not find this anywhere online so I had to use my mind a bit following the above wireframe alias.  Thanks Wormbo.

&lt;pre&gt;
Aliases[26]=(Command=&quot;behindview 1 | set input x 1stperson&quot;,Alias=3rdperson)
Aliases[27]=(Command=&quot;behindview 0 | set input x 3rdperson&quot;,Alias=1stperson)
x=1stperson
&lt;/pre&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44865</id>
      <timestamp>2012-01-24T15:21:48Z</timestamp>
      <contributor>
        <username>Crusher</username>
        <id>2266</id>
      </contributor>
      <text xml:space="preserve">To '''''bind''''' a key means to assign an in-game command with that of a button on a keyboard, mouse or joystick (or other input device).

==Binding Keys==

There are two methods for binding keys to commands. Both work in all [[Legacy:Unreal Engine|Unreal Engine]] games (confirm this please).

===Using the in-game console.===

The syntax for the command is:
 set input &lt;key&gt; &lt;command&gt;

For example:
 set input Z Behindview 1 | OnRelease Behindview 0

Note, for Deus Ex, the syntax is (Deus Ex uses Extension.InputExt rather than Engine.Input for its input class):
 set inputext &lt;key&gt; &lt;command&gt;

So, if I wanted to bind the g key to activate god mode, the syntax would be:
 set inputext g god

===Edit the User.ini file===

The other method is to edit the [[Legacy:User.Ini|User.ini]] file. Under the section [Engine.Input], there should be many lines like this:
 W=MoveForward

Keys can easily be bound to commands by finding the appropriate line and editing it. The syntax is
 &lt;key&gt;=&lt;command&gt;

For example:
 Z=Behindview 1 | OnRelease Behindview 0

(In both cases, the keybind makes it such that when the 'Z' button is held down, it switches to BehindView (third-person view). When you release the key, it goes back to normal (first-person) view.)

Multiple commands can be bound to one key by separating the commands with the pipe character (&quot;&lt;TT&gt;{|

|}
&lt;/TT&gt;&quot;).

Other useful binding commands are PipedSwitchWeapon and SwitchToLastWeapon.  Consider the following bind.

 V=PipedSwitchWeapon 3 | PipedSwitchWeapon 7

This will bind the Bio Rifle and the Flak Cannon to the V key such that if you have both weapons you will be able to toggle between them by repeated presses of the V key.  If you only have a single weapon out of the two pressing the V key will switch to the weapon you have.

 R=SwitchWeapon 1| AltFire | OnRelease SwitchToLastWeapon

This binding will cause the R key to bring up the shield when the key is pressed, and then revert to the weapon you were holding when you pressed the R key.

Bindings not only work with keys, but also for mouse and joystick buttons:
 MouseWheelDown=NextWeapon
 Joy1=Fire

===But how do Epic/DE assign keys in the Configure Controls menus?===

This differs from version to version of the Unreal Engine.  Unreal Tournament has third-party developer (i.e. mod makers) key bind support - this means we can add new keys to the bottom of the pre-existing Configure Key list.

Games such as Deus Ex, if you want to define a new key, you have to replace the entire menu(!) which is a more inefficent use of code.  However, both methods work - but you'd be made to replace the entire Configure Key menu in UT!

===How to add keybinds to UT===

[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] - This class allows you to set your button names and aliases so players can configure their own controls.

===How to add keybinds to UT2003===

As of version 2179, [[Legacy:UT2003|UT2003]] now has a similar class - [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]].

==Using Aliases==

An '''''alias''''' is a short command that represents one or more commands. Aliases can be made in the User.ini file, again under the [Engine.Input] section.

To create an alias, find an empty alias line like this one:

&lt;pre&gt; Aliases[36]=(Command=,Alias=)&lt;/pre&gt;

If there aren't any, then make your own, adding a new number. The line can be modified to make an alias. The syntax is:

&lt;pre&gt; Aliases[&lt;number&gt;]=(Command=&quot;&lt;command(s)&gt;&quot;,Alias=&quot;&lt;alias name&gt;&quot;)&lt;/pre&gt;

For example, say I want to make a new command called &quot;wireframe&quot; that turns on wireframe mode. This might be how I go about doing it:

&lt;pre&gt; Aliases[36]=(Command=&quot;rmode 1&quot;,Alias=&quot;wireframe&quot;)&lt;/pre&gt;

===Toggle Commands===

Aliases can be used in a clever way in combination with binds. Suppose I want to make it so that pressing X will toggle between wireframe mode and normal mode. It might seem rather difficult at first, but with a couple of aliases and a keybind it is quite simple:

&lt;pre&gt;
 Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
 Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
 X=wireframe
&lt;/pre&gt;

The way this works is, pressing X runs the command &quot;wireframe&quot;. This alias sets the rmode to wireframe, and then changes the X bind to run the command &quot;nowireframe&quot;. When X is pressed again, the command &quot;nowireframe&quot; reverts the rmode back to normal, and it rebinds X to &quot;wireframe&quot; again. With a little modification, this method can easily be extended to cycle between several commands.

===Content that needs to pay a visit to the UnrealEd Goblin===
; Aliases : Keys must have an alias function name. This alias will call an exec function in your player class if you have one. This is good for one time use functions like QSFire()

; Buttons : If you need to know when the player releases or is holding a button, you must have an input button variable, and an alias binding.

; Input Button Variable : the player class must contain your button variables (var input byte bMyButton;)...the button is true when held, false when not.

; Alias Binding : In order to prevent 'Bad button command' from logging when you press your button, you have to bind it. To do this while inside UT press '~' to bring up your console, then type PREFERENCES &lt;enter&gt; to bring up Advanced Options. Select ADVANCED, KEY ALAISES, ALIASES, then go down to an empty space and enter your alias name and the command parameter BUTTON bMyButton.

==Related Topics==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]
* [[Legacy:InputKeyMap | Input Key Mapping]]

==Discussion ==

'''ZxAnPhOrIaN:''' I use the menu and windows key on my keyboard for the behindview 0 and 1 commands.

'''Bcladd:''' Don't mean to seem dim but I cannot find the class [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] anywhere in my 2199 source tree nor is it referenced in any of the source code. I am guessing the reference to it above should probably be eliminated.

'''PleaseLoveMe:''' No, it's there.  Check Object -&gt; GUI -&gt; GUIUserKeyBinding in the object tree.  I recommend using WOTgreal for editing uscript because it makes it easier to find such things.

'''Tarquin:''' How do you create a binding that toggles, eg &quot;Rmode 1 / rmode 5&quot;?

'''Mychaeel:''' You can't.  The only thing you could do is make a binding that switches to &quot;rmode 1&quot; when pressed and back to &quot;rmode 5&quot; when released:  &quot;rmode 1 | onrelease rmode 5&quot;.

'''Tarquin:''' Pity :( I remember Quake had a neat trick of the binding for the keypress ''creating'' the binding for the release, and vice versa.

'''Wormbo:''' It's possible with aliases:

&lt;pre&gt;
Aliases[38]=(Command=&quot;rmode 1 | set input X nowireframe&quot;,Alias=&quot;wireframe&quot;)
Aliases[39]=(Command=&quot;rmode 5 | set input X wireframe&quot;,Alias=&quot;nowireframe&quot;)
X=wireframe
&lt;/pre&gt;

'''DemonThing:''' Alright, I clarified the article a bit (I think), and added a little section on aliases. (Thanks Wormbo for pointing that out)

'''Rock-SoLiD:''' Here is a present to all the UT'99 folks.  A working ViewToggle.  Could not find this anywhere online so I had to use my mind a bit following the above wireframe alias.  Thanks Wormbo.

&lt;pre&gt;
Aliases[26]=(Command=&quot;behindview 1 | set input x 1stperson&quot;,Alias=3rdperson)
Aliases[27]=(Command=&quot;behindview 0 | set input x 3rdperson&quot;,Alias=1stperson)
x=3rdperson
&lt;/pre&gt;

'''Crusher:''' If anyone is looking to bind keys to UT Taunts or CTF Commands (like: &quot;You like that&quot; or &quot;Take their flag&quot;) there is a cool tool called the UT Speech Binder. It can be found at www.UT99.org ... this is a link to the topic itself 
http://www.ut99.org/viewtopic.php?f=12&amp;t=3628&amp;p=34909#p34909

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BioAmmo</title>
    <id>28294</id>
    <revision>
      <id>39951</id>
      <timestamp>2009-11-14T18:24:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BioAmmoPickup</title>
    <id>28297</id>
    <revision>
      <id>39954</id>
      <timestamp>2009-11-14T18:26:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BioChargedFire</title>
    <id>28338</id>
    <revision>
      <id>40005</id>
      <timestamp>2009-11-14T20:15:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BioFear</title>
    <id>525</id>
    <revision>
      <id>1637</id>
      <timestamp>2002-05-22T14:37:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; BioFear}}

'''BioFear''' is an actor that marks a location that [[Legacy:Bot (UT)|Bot (UT)]]s are afraid of.  It is automatically created by the [[Legacy:Ut_biorifle|bio rifle]]'s [[Legacy:UT_BioGel|projectiles]] where they hit the ground and keeps bots from running over gel blobs lying around.  Don't add BioFear actors manually; they don't work that way.

A BioFear's [[Legacy:Actor (UT)/Collision|CollisionRadius]] is initially 200 world units, and shrinks by 25 units each time the BioFear is touched.  When the CollisionRadius has shrunken below 120 world units, the BioFear is automatically destroyed.

Tempering this, I believe that the [[Legacy:FearSpot|FearSpot]] actor for both Unreal and Unreal Tournament is capable of filling this role, and it works for all [[Legacy:Pawn (UT)|Pawn (UT)]]s.

==Properties ==
; bInitiallyActive : No effect; not used whatsoever.  (It was supposedly meant to provide a way to specify whether a BioFear actor was initially active, but that's mere speculation.)

==Known Subclasses ==
* [[Legacy:DeathFear|DeathFear]]</text>
    </revision>
    <revision>
      <id>1638</id>
      <timestamp>2002-01-31T09:21:38Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; BioFear}}

This is an actor for Unreal Tournament that marks a location that Unreal Tournament's bots are afraid of.  It is automatically created by the [[Legacy:Ut_biorifle|bio rifle]]'s [[Legacy:UT_BioGel|projectiles]] where they hit the ground and keeps bots from running over gel blobs lying around.  Don't add BioFear actors manually; they don't work that way.

Tempering this, I believe that the [[Legacy:FearSpot|FearSpot]] actor for both Unreal and Unreal Tournament is capable of filling this role, and it works for all [[Legacy:Pawn (UT)|Pawn (UT)]]s.</text>
    </revision>
    <revision>
      <id>1639</id>
      <timestamp>2002-05-22T07:17:58Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; BioFear}}

'''BioFear''' is an actor that marks a location that [[Legacy:Bot (UT)|Bot (UT)]]s are afraid of.  It is automatically created by the [[Legacy:Ut_biorifle|bio rifle]]'s [[Legacy:UT_BioGel|projectiles]] where they hit the ground and keeps bots from running over gel blobs lying around.  Don't add BioFear actors manually; they don't work that way.

A BioFear's [[Legacy:Actor (UT)/Collision|CollisionRadius]] shrinks by 25 world units (initial size is 200 world units) each time the BioFear is touched.  When the CollisionRadius has shrunken below 120 world units, the BioFear is automatically destroyed.

Tempering this, I believe that the [[Legacy:FearSpot|FearSpot]] actor for both Unreal and Unreal Tournament is capable of filling this role, and it works for all [[Legacy:Pawn (UT)|Pawn (UT)]]s.

==Properties ==
; bInitiallyActive : No effect; not used whatsoever.  (It was supposedly meant to provide a way to specify whether a BioFear actor was initially active, but that's mere speculation.)

==Known Subclasses ==
* [[Legacy:DeathFear|DeathFear]]</text>
    </revision>
    <revision>
      <id>40128</id>
      <timestamp>2009-11-15T18:47:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed capitalization</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; BioFear}}

'''BioFear''' is an actor that marks a location that [[Legacy:Bot (UT)|Bot (UT)]]s are afraid of.  It is automatically created by the [[Legacy:UT_BioRifle|bio rifle]]'s [[Legacy:UT_BioGel|projectiles]] where they hit the ground and keeps bots from running over gel blobs lying around.  Don't add BioFear actors manually; they don't work that way.

A BioFear's [[Legacy:Actor (UT)/Collision|CollisionRadius]] is initially 200 world units, and shrinks by 25 units each time the BioFear is touched.  When the CollisionRadius has shrunken below 120 world units, the BioFear is automatically destroyed.

Tempering this, I believe that the [[Legacy:FearSpot|FearSpot]] actor for both Unreal and Unreal Tournament is capable of filling this role, and it works for all [[Legacy:Pawn (UT)|Pawn (UT)]]s.

==Properties ==
; bInitiallyActive : No effect; not used whatsoever.  (It was supposedly meant to provide a way to specify whether a BioFear actor was initially active, but that's mere speculation.)

==Known Subclasses ==
* [[Legacy:DeathFear|DeathFear]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BioFire</title>
    <id>28347</id>
    <revision>
      <id>40014</id>
      <timestamp>2009-11-14T20:17:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Birelli</title>
    <id>526</id>
    <revision>
      <id>1640</id>
      <timestamp>2005-12-29T03:40:23Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <text xml:space="preserve">My e-mail is currently [mailto:ut_birelli@hotmail.com ut_birelli@hotmail.com].

===Released Maps===

=====Unreal Tournament=====

[http://nalicity.beyondunreal.com/map_hub.php?mid=5692 JB-Cavern-III] - [http://nalicity.beyondunreal.com Nalicity]

[http://dynamic4.gamespy.com/~multictf/maps/CavernV2/cavernv2.php CTFM-Cavern] - [http://www.planetunreal.com/multictf/multilab Multilab]

[http://dynamic4.gamespy.com/~multictf/maps/Trivest/trivest.php CTFM-Trivest] - [http://www.planetunreal.com/multictf/multilab Multilab]

=====UT2004=====

[http://www.planetjailbreak.com JB-Cavern] - Bundled with JB2004 (Created in conjuction with [http://spoondog.beyondunreal.com Spoondog])

[http://nalicity.beyondunreal.com/map_hub.php?mid=8083 JB-Alarscia] - [http://nalicity.beyondunreal.com NaliCity]

===Mapping Journals===
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/JB-StationDecater]] (UT)
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/JB-Baruro]] (UT2003)

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1641</id>
      <timestamp>2002-10-18T23:39:47Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">My home page is http://www.ironflame.com/dana4/ut.

My e-mail is currently [mailto:ut_birelli@hotmail.com ut_birelli@hotmail.com].

I usually hang out mainly in #utjb on irc.enterthegame.com, you can find me there, usually EST Evenings, although Real Life TM often interferes with this.d

I currently have some details on making JB-StationDecater in [[Legacy:Developer Journals/Birelli|Developer Journals/Birelli]]. I've since abandoned the project (I've uninstalled UT to make way for [[Legacy:UT2003|UT2003]], since my HD wasn't big enough to fit them both (at least not without deleting 2 or 3 games, and all of the ones left I actually play frequently). I might discuss some of my ideas on mapping for UT2003 soon, especially about Jailbreak, but not yet, I need to play around in UED 3 more first.

===Favorite Games (in no particular order)===

UT

SW: Tie Fighter

Castles: Siege and Conquest

Conquest of The New World

Warcraft II

Starcraft (and BW)

Myst for Mac

Riven

F1 2000/1

Rollercoaster Tycoon

Caesar III

SimCity 2000

GTA 2 (hopefully soon 3)

A-10 Attack

Stars

Snood (for the Mac, never tried it on the PC)

Escape Velocity

EV: Override

===Games that I own that aren't favorites===
*Things to keep in mind
**Some of these were gifts
**A &quot;*&quot; Means I played it and was underwhelmed, although I may like the game even so
**This is a '''very''' incomplete list that I may update if I think of things

X-Wing

X-W vs. Tie

UT2003 *

The Sims

Fifa 2001

NHL 2001

Titanic

Star Wars Pit Droids

Sim Tower

Sim Farm

Sim City 3000 *

Comanche

Myst III: Exile (close to favorite)

Myst for PC *** (horrible conversion)

EV: Nova *

Cythera

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1642</id>
      <timestamp>2005-01-19T16:21:29Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">My e-mail is currently [mailto:birelli@beyondunreal.com birelli@beyondunreal.com].

===Released Maps===

=====Unreal Tournament=====

[http://nalicity.beyondunreal.com/map_hub.php?mid=5692 JB-Cavern-III] - [http://nalicity.beyondunreal.com Nalicity]

[http://dynamic4.gamespy.com/~multictf/maps/CavernV2/cavernv2.php CTFM-Cavern] - [http://www.planetunreal.com/multictf/multilab Multilab]

[http://dynamic4.gamespy.com/~multictf/maps/Trivest/trivest.php CTFM-Trivest] - [http://www.planetunreal.com/multictf/multilab Multilab]

=====UT2004=====

[http://www.planetjailbreak.com JB-Cavern] - Bundled with JB2004 (Created in conjuction with [http://spoondog.beyondunreal.com Spoondog])

[http://nalicity.beyondunreal.com/map_hub.php?mid=8083 JB-Alarscia] - [http://nalicity.beyondunreal.com NaliCity]

===Mapping Journals===
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/JB-StationDecater]] (UT)
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/JB-Baruro]] (UT2003)

===Guestbook ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Birelli/JB-Baruro</title>
    <id>614</id>
    <revision>
      <id>1840</id>
      <timestamp>2003-08-12T05:26:35Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==JB-Baruro==

Alright, using a random name generator from an old game I have, I came up with the name &quot;Baruro&quot;, so, that's what it is now.

===News===

[[Image:Legacy_Bir-Baruro-Shot1.jpeg|right|New switch room, compare it with the old one directly below. It's amazing what a little less light and some girders and trim will do.]]

[[Image:Legacy_Bir-NameTBA-Shot2.jpeg|right|Switch room, looking outward towards the &quot;foyer&quot; of the base, the switch is the blue wheel on the right of the picture.]]

[[Image:Legacy_Bir-NameTBA-Shot3.jpeg|right|The foyer of red base, looking across the room, the walkways curving up into the ceiling are the exits of the jail, which is through the &quot;holes&quot; in the roof (which will have glass eventually). Also, the large opening to the main &quot;hallway&quot; is a window and will be filled with glass.]]

* June 16, 2003 - As you can see on the right, I've updated one of the pics to show visually what I'm doing to the map. Basically, I cut roughly half the lights from the map (probably a bit more actually), and changed the remaining lights in each base to be team-colored. I then filled up a lot of the empty visual space in each base with girders and trim around all the edges, which makes each room feel much more full and complete to me. I'm very happy so far with how the map looks, except for the center area, which I think still looks a little bland (but not nearly as bland as before I took all those lights out). Anyways, I'm finishing up the touches and should be ready to release a second beta version soon.

* June 15, 2003 - Another update today, I posted up a &quot;beta&quot; version of the map to the core dev forums, and got back some good feedback from SpoonDog about things I should try to spruce up the map's looks a bit. I finally got around to downloading the DDS plugin for Photoshop from NVidia, and that was a very good thing to do. Combined with my newfound realization that you can skin static meshes, I edited the texture on my lightboxes to have red and blue tints, so now I can make realistic team lighting (which is one of the things Spoon suggested). Also I need to find something for the doors, Tahngarth has suggested some sort of wall panel, so maybe I'll take another browse through the standard meshes for something nice tomorrow. I also went on a light-bashing spree, which has made the map a lot darker and a ''lot'' cooler looking. I'm feeling pretty good about how the map is shaping up, but I've now got a lot more work to do. Luckily, I've got nothing else planned for tomorrow :).

* June 15, 2003 - I've added an arena into the map now, but more importantly I've botpathed the entire thing.  Right now my major concerns are that the bots seem to get stuck on my jump pads (I knew it couldn't be '''that''' easy :/), some other minor pathing issues, and that the map is very slow FPS-wise with bots in it. I'm considering taking out the nice beautiful window in each base and replacing it with a large anti-portal, but it adds so much asthetic/tactical value to the map that I'm hoping I don't have to do that.

* June 14, 2003 - Well, I've got some pics up that, although they're a little low-quality, should give some idea of the basic look of the map. I'm going to be putting in an arena soon (it will be above the switch room, much as the jail is above the foyer). I've also done my first jump pads in UT2003, and I can't say enough about how incredibly awesome this is. It takes no work at all, you just tell it what path node to target and voila, I was jumping up and down in excitement (not literally) for 10 minutes when I first used them. From my initial impressions of the in-game scale, I think this map should be able to handle 10-16 players, it's quite large, a little larger than I thought I was making it before I got in-game.

===Comments/Suggestions===

'''Mychaeel:''' Delete the old images when you don't need them anymore.

'''Birelli:''' How do I delete an image? I don't see a way to do that anywhere. I'm not using Bir-NameTBA-Shot1 any more, do you (an admin) have to delete it?

'''Mychaeel:''' At the bottom of the image uploader page there's a checkbox.  You'll find your way from there.

'''Birelli:''' Ah, I just noticed your response, sorry it took me so long. One image deleted (all the others are in use I think).

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1841</id>
      <timestamp>2003-06-16T17:31:29Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==JB-Baruro==

Alright, using a random name generator from an old game I have, I came up with the name &quot;Baruro&quot;, so, that's what it is now.

===News===

[[Image:Legacy_Bir-Baruro-Shot1.jpeg|right|New switch room, compare it with the old one directly below. It's amazing what a little less light and some girders and trim will do.]]

[[Image:Legacy_Bir-NameTBA-Shot2.jpeg|right|Switch room, looking outward towards the &quot;foyer&quot; of the base, the switch is the blue wheel on the right of the picture.]]

[[Image:Legacy_Bir-NameTBA-Shot3.jpeg|right|The foyer of red base, looking across the room, the walkways curving up into the ceiling are the exits of the jail, which is through the &quot;holes&quot; in the roof (which will have glass eventually). Also, the large opening to the main &quot;hallway&quot; is a window and will be filled with glass.]]

* June 16, 2003 - As you can see on the right, I've updated one of the pics to show visually what I'm doing to the map. Basically, I cut roughly half the lights from the map (probably a bit more actually), and changed the remaining lights in each base to be team-colored. I then filled up a lot of the empty visual space in each base with girders and trim around all the edges, which makes each room feel much more full and complete to me. I'm very happy so far with how the map looks, except for the center area, which I think still looks a little bland (but not nearly as bland as before I took all those lights out). Anyways, I'm finishing up the touches and should be ready to release a second beta version soon.

* June 15, 2003 - Another update today, I posted up a &quot;beta&quot; version of the map to the core dev forums, and got back some good feedback from SpoonDog about things I should try to spruce up the map's looks a bit. I finally got around to downloading the DDS plugin for Photoshop from NVidia, and that was a very good thing to do. Combined with my newfound realization that you can skin static meshes, I edited the texture on my lightboxes to have red and blue tints, so now I can make realistic team lighting (which is one of the things Spoon suggested). Also I need to find something for the doors, Tahngarth has suggested some sort of wall panel, so maybe I'll take another browse through the standard meshes for something nice tomorrow. I also went on a light-bashing spree, which has made the map a lot darker and a ''lot'' cooler looking. I'm feeling pretty good about how the map is shaping up, but I've now got a lot more work to do. Luckily, I've got nothing else planned for tomorrow :).

* June 15, 2003 - I've added an arena into the map now, but more importantly I've botpathed the entire thing.  Right now my major concerns are that the bots seem to get stuck on my jump pads (I knew it couldn't be '''that''' easy :/), some other minor pathing issues, and that the map is very slow FPS-wise with bots in it. I'm considering taking out the nice beautiful window in each base and replacing it with a large anti-portal, but it adds so much asthetic/tactical value to the map that I'm hoping I don't have to do that.

* June 14, 2003 - Well, I've got some pics up that, although they're a little low-quality, should give some idea of the basic look of the map. I'm going to be putting in an arena soon (it will be above the switch room, much as the jail is above the foyer). I've also done my first jump pads in UT2003, and I can't say enough about how incredibly awesome this is. It takes no work at all, you just tell it what path node to target and voila, I was jumping up and down in excitement (not literally) for 10 minutes when I first used them. From my initial impressions of the in-game scale, I think this map should be able to handle 10-16 players, it's quite large, a little larger than I thought I was making it before I got in-game.

===Comments/Suggestions===

'''Mychaeel:''' Delete the old images when you don't need them anymore.

'''Birelli:''' How do I delete an image? I don't see a way to do that anywhere. I'm not using Bir-NameTBA-Shot1 any more, do you (an admin) have to delete it?

'''Mychaeel:''' At the bottom of the image uploader page there's a checkbox.  You'll find your way from there.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Birelli/JB-StationDecater</title>
    <id>613</id>
    <revision>
      <id>1838</id>
      <timestamp>2003-08-12T05:31:38Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>:o, didn't expect THAT to happen ;)</comment>
      <text xml:space="preserve">==JB-StationDecater ==

[[Image:Legacy_Bir-Dec-Alpha1.jpeg|right|View of the inside of jail with the chatting bay off to the left, scoreboard center, and news page right.]]

[[Image:Legacy_Bir-Dec-Alpha2.jpeg|right|View out from the inside of the blue jail.]]

[[Image:Legacy_Bir-Dec-Alpha3.jpeg|right|Entrance to blue base.]]

[[Image:Legacy_Bir-Dec-Alpha4.jpeg|right|:-)]]

*Status update on this map: I lost the actual map files I was working on amidst scrubbing of this computer and installing a newer version of Windows. With a little work on the jails I think it could've been pretty ready to go, although if I went back now I'd probably scrub half the Geometry and redo it ;). In short, no release coming, I'm gonna leave this here though, as it might conceivably have some value as a journal, even though I can't see what ;).

*First off, where I began. The original concept here was a platform in the middle of space, and I thought it looked cool to have little diagonal beams coming off the sides up to two platforms on either side of it. I'm not sure I explained that very well. Anyways, it all started with one simple little set of maybe a dozen brushes that I like the look of. This is basically how all of my maps get started, imo it's part of the reason they aren't all that great. My recommendation is to start with an overall plan, like I did with JB-Nharwax. I really liked the way that turned out, certainly my best work yet, but it suffered from many many pathnoding bugs which I will probably redesign small sections of the level around to accomodate.

*Ok, once I had something I liked and decide to expand upon, I played around with different ways to connect the main platforms with some other ones above that. I originally based the next part of the design on those umbrella fountains outside of pools which probably don't even exist anymore ;-). Basically, I was going to make a large pillar with a platform on top, with a series of cannons on the bottom to spray fire at opponents trying to make their way through the middle area. I eventually discarded this as profoundly too hard to handle, especially in a JB map where it doesn't just slow a player down, it literally ends their game for up to several minutes if the cannons get lucky.

*Eventually, I got a system of walkways and platforms leading up to a final middle-upper platform that I decided would be the entrance to the base. I then faced the problem that stalled my last couple attempts at space maps: How to make the base. The problem is, you can't simply make blocks and &quot;dig&quot; through them, because the player can see the outside of the base, and tunneling through the side of the skybox would look so extremely weird that its just not plausible. I've already seen two fixes: 

#this one is ala CTF-Face: Make a cool outside shape like a pyramid or something and tunnel into that.

#The other option is kind of the lazy man's way out: Just plop a teleporter/warpgate type device at one end and make it come out inside a facility: bizarre and patently avoiding the issue. I decided that I would try a totally different approach:

#I just made a gargantuan wall, with a nice little &quot;kink&quot;. (a sloped part in the middle right above the playing area with walls going up from either end, you'll get all this I hope in the pic I'll provide at some point). Then, I tunneled into and &quot;behind&quot; the wall. (The wall hides the fact that the interior base is carved out of space &quot;behind&quot; the fake backdrop). 

*I then proceeded to create a rough outline of the base, which is basically centered around a central cylinder &quot;release switch room&quot;. I added a glass window between the entrance and the cylinder, with paths leading from the entry around behind and up over the cylinder. There are also a couple transporters at the back that take you up to sniping platforms up high on the wall. I decided one upper approach I made was way too easy to release from, because you could just drop onto the switch ala JB-Raid, which is an excellent map, way beyond my capabilities, but really suffered from not plugging up the entrance right over the flag base.

*I decided upon what to me was a novel solution to this problem: I created blocks and added them flush to the surrounding wall and ceiling, and closed off the upper passage. This way, if I ever convert it to CTF I can just delete two brushes and the easy-in, not-so-easy-out route through the ceiling is functional again. I think you'll see where it used to go if you ride the lift up at the entrance to each base, it's kind of obvious the path used to branch both ways, but it works decently I think.

*I then added some cool &quot;laser-like&quot; effects on the sides of the gargantuan wall to give it some flavor. I ended up reworking the texture I used into bright red and blue to make navigation really really easy in the middle. Then, I put some decorations in the skybox and made it rotate. I like the effect of it as a large space station rotating to produce gravity (never mind that it wouldn't actually produce gravity but bah, it looks cool :-). 

*Just today I added in the jails, with neat-looking laser-doors, some nice screens, and a little &quot;chatting bay&quot; (which I'll make a masked texture label for tomorrow probably), which makes the ScreenSlidePageChat screen less likely to be &quot;talked into&quot; inadvertently. I then finished up with some trim on the interior room of the base, a platform, and a laser-trip like release switch which I may have to tweak a bit to look less tacky.

*My last bit today was playing around with the screens aligning them right and talking to SpoonDog on #utjb from inside my map.

Well, that's what I have so far, I'll keep writing as it comes, and get a couple pics up at some point to illustrate a couple key things I said.

My apologies for the extra-fuzzy pics, they were really beautiful until I overdid trying to make the file size smaller :-\

==Comments ==

'''Birelli:''' Feel free to comment on stuff I didn't make clear, or what you think of what I wrote, or anything.

'''Mychaeel:'''  I took the liberty of arranging the images in a slightly different way.  Look good &amp;ndash; I'm looking forward to testing the first release...

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1839</id>
      <timestamp>2003-08-12T05:18:35Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==JB-StationDecater ==

[[Image:Legacy_Bir-Dec-Alpha1.jpeg|right|View of the inside of jail with the chatting bay off to the left, scoreboard center, and news page right.]]

[[Image:Legacy_Bir-Dec-Alpha2.jpeg|right|View out from the inside of the blue jail.]]

[[Image:Legacy_Bir-Dec-Alpha3.jpeg|right|Entrance to blue base.]]

[[Image:Legacy_Bir-Dec-Alpha4.jpeg|right|:-)]]

*First off, where I began. The original concept here was a platform in the middle of space, and I thought it looked cool to have little diagonal beams coming off the sides up to two platforms on either side of it. I'm not sure I explained that very well. Anyways, it all started with one simple little set of maybe a dozen brushes that I like the look of. This is basically how all of my maps get started, imo it's part of the reason they aren't all that great. My recommendation is to start with an overall plan, like I did with JB-Nharwax. I really liked the way that turned out, certainly my best work yet, but it suffered from many many pathnoding bugs which I will probably redesign small sections of the level around to accomodate.

*Ok, once I had something I liked and decide to expand upon, I played around with different ways to connect the main platforms with some other ones above that. I originally based the next part of the design on those umbrella fountains outside of pools which probably don't even exist anymore ;-). Basically, I was going to make a large pillar with a platform on top, with a series of cannons on the bottom to spray fire at opponents trying to make their way through the middle area. I eventually discarded this as profoundly too hard to handle, especially in a JB map where it doesn't just slow a player down, it literally ends their game for up to several minutes if the cannons get lucky.

*Eventually, I got a system of walkways and platforms leading up to a final middle-upper platform that I decided would be the entrance to the base. I then faced the problem that stalled my last couple attempts at space maps: How to make the base. The problem is, you can't simply make blocks and &quot;dig&quot; through them, because the player can see the outside of the base, and tunneling through the side of the skybox would look so extremely weird that its just not plausible. I've already seen two fixes: 

#this one is ala CTF-Face: Make a cool outside shape like a pyramid or something and tunnel into that.

#The other option is kind of the lazy man's way out: Just plop a teleporter/warpgate type device at one end and make it come out inside a facility: bizarre and patently avoiding the issue. I decided that I would try a totally different approach:

#I just made a gargantuan wall, with a nice little &quot;kink&quot;. (a sloped part in the middle right above the playing area with walls going up from either end, you'll get all this I hope in the pic I'll provide at some point). Then, I tunneled into and &quot;behind&quot; the wall. (The wall hides the fact that the interior base is carved out of space &quot;behind&quot; the fake backdrop). 

*I then proceeded to create a rough outline of the base, which is basically centered around a central cylinder &quot;release switch room&quot;. I added a glass window between the entrance and the cylinder, with paths leading from the entry around behind and up over the cylinder. There are also a couple transporters at the back that take you up to sniping platforms up high on the wall. I decided one upper approach I made was way too easy to release from, because you could just drop onto the switch ala JB-Raid, which is an excellent map, way beyond my capabilities, but really suffered from not plugging up the entrance right over the flag base.

*I decided upon what to me was a novel solution to this problem: I created blocks and added them flush to the surrounding wall and ceiling, and closed off the upper passage. This way, if I ever convert it to CTF I can just delete two brushes and the easy-in, not-so-easy-out route through the ceiling is functional again. I think you'll see where it used to go if you ride the lift up at the entrance to each base, it's kind of obvious the path used to branch both ways, but it works decently I think.

*I then added some cool &quot;laser-like&quot; effects on the sides of the gargantuan wall to give it some flavor. I ended up reworking the texture I used into bright red and blue to make navigation really really easy in the middle. Then, I put some decorations in the skybox and made it rotate. I like the effect of it as a large space station rotating to produce gravity (never mind that it wouldn't actually produce gravity but bah, it looks cool :-). 

*Just today I added in the jails, with neat-looking laser-doors, some nice screens, and a little &quot;chatting bay&quot; (which I'll make a masked texture label for tomorrow probably), which makes the ScreenSlidePageChat screen less likely to be &quot;talked into&quot; inadvertently. I then finished up with some trim on the interior room of the base, a platform, and a laser-trip like release switch which I may have to tweak a bit to look less tacky.

*My last bit today was playing around with the screens aligning them right and talking to SpoonDog on #utjb from inside my map.

Well, that's what I have so far, I'll keep writing as it comes, and get a couple pics up at some point to illustrate a couple key things I said.

My apologies for the extra-fuzzy pics, they were really beautiful until I overdid trying to make the file size smaller :-\

==Comments ==

'''Birelli:''' Feel free to comment on stuff I didn't make clear, or what you think of what I wrote, or anything.

'''Mychaeel:'''  I took the liberty of arranging the images in a slightly different way.  Look good &amp;ndash; I'm looking forward to testing the first release...

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bisclavret</title>
    <id>640</id>
    <revision>
      <id>1902</id>
      <timestamp>2004-05-13T19:37:12Z</timestamp>
      <contributor>
        <ip>Bisclavret</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===ModMutators===

Bisclavret

My goal in modding UT and UT2004 is not to create anything earth-shattering. The mods are directed toward providing an &quot;alternate&quot; weapon to each of the defaults that shipped with either game.

[[Legacy:Bisclavret/Developer Journal|Bisclavret/Developer Journal]]

----

&lt;u&gt;UT ModWeapons&lt;/u&gt;: This weapon pack provides enhanced versions of the default wepons shipped with the game.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:ShockRifle|ShockRifle]] &gt;&gt; LARC}}

The LARC fires a more powerfull blue-green beam as the primary fire, and a plasma dart as the secondary.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_BioRifle|UT_BioRifle]] &gt;&gt; CausticBioRifle}}

The caustic biorifle fires red globs that explode, even when they touch each other. The secondary fires a gigantic red glob.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_FlakCannon|UT_FlakCannon]] &gt;&gt; RazorFlakCannon}}

The razor-flak cannon fires a barrage of miniature razors into a target. The secondary fire flak shell explodes into a plethora of flying blades.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_EightBall|UT_EightBall]] &gt;&gt; RainMaker}}

The rainmaker fires biological rockets and grenades, as well as a bonous for a target lock.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:SniperRifle(UT)|SniperRifle(UT)]] &gt;&gt; EnhancedSniperRifle}}

The enhanced sniper rifle's bullets explode on impact.

----

&lt;u&gt;UT2004 ModWeapons&lt;/u&gt;:

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:FuryRifle|FuryRifle]]}}

The Fury Rifle is a custom replacement for the Shock Rifle. The firing rate is high, and instead of the normal alternate fire, the rifle fires a shock grenade.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:CausicBioRifle|CausicBioRifle]]}}

Yes-the caustic bio rifle makes a triumphant return for UT2004! The Causic Bio-Rifle is loaded with a type of goo that bursts into flames the instant it comes into contact with air.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:ModSniperRifle|ModSniperRifle]]}}

The Infra-red Sniper Rifle expands on the sniper rilfe in UT2004, adding a specialized scope that allows the user to view other players and projectiles through walls. As an added bonous, shooting another player in the arm will cause him to drop his weapon.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Scarab|Scarab]]}}

The Scarab fires needles that inject a toxin which causes temporary disorientation and lasting damage.

----

&lt;u&gt;UT ModMutators&lt;/u&gt;: The mutator package that accompnies &lt;u&gt;UT ModWeapons&lt;/u&gt; includes all of the weapon arenas that replace, say, only the shock rifle with the LARC and while all other weapons are not changed. Each weapon in &lt;u&gt;UT ModWeapons&lt;/u&gt; has it's own arena mutator, so you can mix and match different variations of weapon selection.

Along with the arena-style mutators, &lt;u&gt;UT ModMutators&lt;/u&gt; includes the &lt;u&gt;Increasing Damage&lt;/u&gt; mutator, and the &lt;u&gt;CarrotArena&lt;/u&gt;

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; IncreasingDamage}}

The Increasing Damage mutator awards a little bit of damage amp to a player each time he or she scores a kill. When in use, your damage and purple UDamage light are increased each time you manage to kill someone. The damage amp limit for any player is 5 times the damage.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:HealthArena|HealthArena]] &gt;&gt; CarrotArena}}

The &lt;u&gt;HealthArena&lt;/u&gt; included in &lt;u&gt;ModMutators&lt;/u&gt; is intended to be usefull in &quot;leveling&quot; the playing field in terms of health pickups so as to create a more challenging match.

&lt;u&gt;CarrotArena&lt;/u&gt; is a wierd mutator that replaces all health pickups with small carrots that each boost your health by 25 points. Anyone who remembers &lt;i&gt;Jazz Jackrabbit 2&lt;/i&gt; will get a kick out of it.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; LARCArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; CausticBioRifleArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; RazorFlakCannonArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; RainmakerArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; EnhancedSniperRifleArena}}

----

&lt;u&gt;UT2004 ModMutators&lt;/u&gt;: The mutator package that accompnies &lt;u&gt;UT2004 ModWeapons&lt;/u&gt; .

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; Headless}}

Removes everyone's head, complete with bloody spurting effects! (Now compatable with the Hulk mutator!)

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Combo|Combo]] &gt;&gt; Hulk}}

Morph into the hulk!

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Combo|Combo]] &gt;&gt; Wound}}

Spawn a massive amount of bloody chunks! to, uh, confuse the enemy!

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; FuryRifle Arena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; CausticBioRifle Arena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; IRSniperRifleArena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; ScarabArena}}

----

&lt;u&gt;UT2004 ModVehicles&lt;/u&gt;: A small experiment with the bomber craft. More soon

----

&lt;u&gt;Current Projects&lt;/u&gt;:

&lt;u&gt;GameTypes&lt;/u&gt;:

&lt;u&gt;Swap Team Game&lt;/u&gt;: Every time you are killed, you switch teams. A team wins when they have aquired all of the players in the match.

&lt;u&gt;Enhanced Swap Team Game&lt;/u&gt;: An extension of the Swap Team Game, the match allows you to play in specially designed arenas.

----

&lt;u&gt;Other Stuff&lt;/u&gt;:

&lt;u&gt;MineLayer&lt;/u&gt;: An enhanced grenade launcher that is able to place mines. The types are configurable in the mutator menu.

&lt;u&gt;Bouncy / sticky bio globs&lt;/u&gt;: A bio rifle that fires globs that bounce around until they get stuck to a player.

&lt;u&gt;Skarrj Blades&lt;/u&gt;: Rip-off from the predator.

&lt;u&gt;Increasing Damage Mutator 2004&lt;/u&gt;

&lt;u&gt;EMP Grenades&lt;/u&gt;: Causes vehicles to go haywire, than explode.

&lt;u&gt;Tesla Nuke&lt;/u&gt;: Think redeemer times ten.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1903</id>
      <timestamp>2004-05-10T22:21:49Z</timestamp>
      <contributor>
        <ip>Dialup-4.155.24.77.Dial1.Baltimore1.Level3.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===ModMutators===

Bisclavret

My goal in modding UT and UT2004 is not to create anything earth-shattering. The mods are directed toward providing an &quot;alternate&quot; weapon to each of the defaults that shipped with either game.

----

&lt;u&gt;UT ModWeapons&lt;/u&gt;: This weapon pack provides enhanced versions of the default wepons shipped with the game.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:ShockRifle|ShockRifle]] &gt;&gt; LARC}}

The LARC fires a more powerfull blue-green beam as the primary fire, and a plasma dart as the secondary.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_BioRifle|UT_BioRifle]] &gt;&gt; CausticBioRifle}}

The caustic biorifle fires red globs that explode, even when they touch each other. The secondary fires a gigantic red glob.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_FlakCannon|UT_FlakCannon]] &gt;&gt; RazorFlakCannon}}

The razor-flak cannon fires a barrage of miniature razors into a target. The secondary fire flak shell explodes into a plethora of flying blades.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_EightBall|UT_EightBall]] &gt;&gt; RainMaker}}

The rainmaker fires biological rockets and grenades, as well as a bonous for a target lock.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:SniperRifle(UT)|SniperRifle(UT)]] &gt;&gt; EnhancedSniperRifle}}

The enhanced sniper rifle's bullets explode on impact.

----

&lt;u&gt;UT2004 ModWeapons&lt;/u&gt;:

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:FuryRifle|FuryRifle]]}}

The Fury Rifle is a custom replacement for the Shock Rifle. The firing rate is high, and instead of the normal alternate fire, the rifle fires a shock grenade.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:CausicBioRifle|CausicBioRifle]]}}

Yes-the caustic bio rifle makes a triumphant return for UT2004! The Causic Bio-Rifle is loaded with a type of goo that bursts into flames the instant it comes into contact with air.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:ModSniperRifle|ModSniperRifle]]}}

The Infra-red Sniper Rifle expands on the sniper rilfe in UT2004, adding a specialized scope that allows the user to view other players and projectiles through walls. As an added bonous, shooting another player in the arm will cause him to drop his weapon.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Scarab|Scarab]]}}

The Scarab fires needles i that inject a toxin which causes temporary disorientationand lasting damage.

----

&lt;u&gt;UT ModMutators&lt;/u&gt;: The mutator package that accompnies &lt;u&gt;UT ModWeapons&lt;/u&gt; includes all of the weapon arenas that replace, say, only the shock rifle with the LARC and while all other weapons are not changed. Each weapon in &lt;u&gt;UT ModWeapons&lt;/u&gt; has it's own arena mutator, so you can mix and match different variations of weapon selection.

Along with the arena-style mutators, &lt;u&gt;UT ModMutators&lt;/u&gt; includes the &lt;u&gt;Increasing Damage&lt;/u&gt; mutator, and the &lt;u&gt;CarrotArena&lt;/u&gt;

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; IncreasingDamage}}

The Increasing Damage mutator awards a little bit of damage amp to a player each time he or she scores a kill. When in use, your damage and purple UDamage light are increased each time you manage to kill someone. The damage amp limit for any player is 5 times the damage.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:HealthArena|HealthArena]] &gt;&gt; CarrotArena}}

The &lt;u&gt;HealthArena&lt;/u&gt; included in &lt;u&gt;ModMutators&lt;/u&gt; is intended to be usefull in &quot;leveling&quot; the playing field in terms of health pickups so as to create a more challenging match.

&lt;u&gt;CarrotArena&lt;/u&gt; is a wierd mutator that replaces all health pickups with small carrots that each boost your health by 25 points. Anyone who remembers &lt;i&gt;Jazz Jackrabbit 2&lt;/i&gt; will get a kick out of it.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; LARCArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; CausticBioRifleArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; RazorFlakCannonArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; RainmakerArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; EnhancedSniperRifleArena}}

----

&lt;u&gt;UT2004 ModMutators&lt;/u&gt;: The mutator package that accompnies &lt;u&gt;UT2004 ModWeapons&lt;/u&gt; .

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; Headless}}

Removes everyone's head, complete with bloody spurting effects! (Now compatable with the Hulk mutator!)

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Combo|Combo]] &gt;&gt; Hulk}}

Morph into the hulk!

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Combo|Combo]] &gt;&gt; Wound}}

Spawn a massive amount of bloody chunks! to, uh, confuse the enemy!

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; FuryRifle Arena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; CausticBioRifle Arena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; IRSniperRifleArena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; ScarabArena}}

----

&lt;u&gt;UT2004 ModVehicles&lt;/u&gt;: A small experiment with the bomber craft. More soon

----

&lt;u&gt;Current Projects&lt;/u&gt;:

&lt;u&gt;GameTypes&lt;/u&gt;:

&lt;u&gt;Swap Team Game&lt;/u&gt;: Every time you are killed, you switch teams. A team wins when they have aquired all of the players in the match.

&lt;u&gt;Enhanced Swap Team Game&lt;/u&gt;: An extension of the Swap Team Game, the match allows you to play in specially designed arenas.

----

&lt;u&gt;Other Stuff&lt;/u&gt;:

&lt;u&gt;MineLayer&lt;/u&gt;: An enhanced grenade launcher that is able to place mines. The types are configurable in the mutator menu.

&lt;u&gt;Bouncy / sticky bio globs&lt;/u&gt;: A bio rifle that fires bio globs that bounce around until they get stuck to a player.

&lt;u&gt;Skarrj Blades&lt;/u&gt;: Rip-off from the predator.

&lt;u&gt;Increasing Damage Mutator 2004&lt;/u&gt;

&lt;u&gt;EMP Grenades&lt;/u&gt;: Causes vehicles to go haywire, than explode.

&lt;u&gt;Tesla Nuke&lt;/u&gt;: Think redeemer times ten.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1904</id>
      <timestamp>2004-05-11T20:06:14Z</timestamp>
      <contributor>
        <ip>Bisclavret</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===ModMutators===

Bisclavret

My goal in modding UT and UT2004 is not to create anything earth-shattering. The mods are directed toward providing an &quot;alternate&quot; weapon to each of the defaults that shipped with either game.

----

&lt;u&gt;UT ModWeapons&lt;/u&gt;: This weapon pack provides enhanced versions of the default wepons shipped with the game.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:ShockRifle|ShockRifle]] &gt;&gt; LARC}}

The LARC fires a more powerfull blue-green beam as the primary fire, and a plasma dart as the secondary.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_BioRifle|UT_BioRifle]] &gt;&gt; CausticBioRifle}}

The caustic biorifle fires red globs that explode, even when they touch each other. The secondary fires a gigantic red glob.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_FlakCannon|UT_FlakCannon]] &gt;&gt; RazorFlakCannon}}

The razor-flak cannon fires a barrage of miniature razors into a target. The secondary fire flak shell explodes into a plethora of flying blades.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:UT_EightBall|UT_EightBall]] &gt;&gt; RainMaker}}

The rainmaker fires biological rockets and grenades, as well as a bonous for a target lock.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[Legacy:SniperRifle(UT)|SniperRifle(UT)]] &gt;&gt; EnhancedSniperRifle}}

The enhanced sniper rifle's bullets explode on impact.

----

&lt;u&gt;UT2004 ModWeapons&lt;/u&gt;:

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:FuryRifle|FuryRifle]]}}

The Fury Rifle is a custom replacement for the Shock Rifle. The firing rate is high, and instead of the normal alternate fire, the rifle fires a shock grenade.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:CausicBioRifle|CausicBioRifle]]}}

Yes-the caustic bio rifle makes a triumphant return for UT2004! The Causic Bio-Rifle is loaded with a type of goo that bursts into flames the instant it comes into contact with air.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:ModSniperRifle|ModSniperRifle]]}}

The Infra-red Sniper Rifle expands on the sniper rilfe in UT2004, adding a specialized scope that allows the user to view other players and projectiles through walls. As an added bonous, shooting another player in the arm will cause him to drop his weapon.

{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Scarab|Scarab]]}}

The Scarab fires needles that inject a toxin which causes temporary disorientation and lasting damage.

----

&lt;u&gt;UT ModMutators&lt;/u&gt;: The mutator package that accompnies &lt;u&gt;UT ModWeapons&lt;/u&gt; includes all of the weapon arenas that replace, say, only the shock rifle with the LARC and while all other weapons are not changed. Each weapon in &lt;u&gt;UT ModWeapons&lt;/u&gt; has it's own arena mutator, so you can mix and match different variations of weapon selection.

Along with the arena-style mutators, &lt;u&gt;UT ModMutators&lt;/u&gt; includes the &lt;u&gt;Increasing Damage&lt;/u&gt; mutator, and the &lt;u&gt;CarrotArena&lt;/u&gt;

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; IncreasingDamage}}

The Increasing Damage mutator awards a little bit of damage amp to a player each time he or she scores a kill. When in use, your damage and purple UDamage light are increased each time you manage to kill someone. The damage amp limit for any player is 5 times the damage.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:HealthArena|HealthArena]] &gt;&gt; CarrotArena}}

The &lt;u&gt;HealthArena&lt;/u&gt; included in &lt;u&gt;ModMutators&lt;/u&gt; is intended to be usefull in &quot;leveling&quot; the playing field in terms of health pickups so as to create a more challenging match.

&lt;u&gt;CarrotArena&lt;/u&gt; is a wierd mutator that replaces all health pickups with small carrots that each boost your health by 25 points. Anyone who remembers &lt;i&gt;Jazz Jackrabbit 2&lt;/i&gt; will get a kick out of it.

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; LARCArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; CausticBioRifleArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; RazorFlakCannonArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; RainmakerArena}}

{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; EnhancedSniperRifleArena}}

----

&lt;u&gt;UT2004 ModMutators&lt;/u&gt;: The mutator package that accompnies &lt;u&gt;UT2004 ModWeapons&lt;/u&gt; .

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; Headless}}

Removes everyone's head, complete with bloody spurting effects! (Now compatable with the Hulk mutator!)

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Combo|Combo]] &gt;&gt; Hulk}}

Morph into the hulk!

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Combo|Combo]] &gt;&gt; Wound}}

Spawn a massive amount of bloody chunks! to, uh, confuse the enemy!

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; FuryRifle Arena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; CausticBioRifle Arena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; IRSniperRifleArena}}

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; ScarabArena}}

----

&lt;u&gt;UT2004 ModVehicles&lt;/u&gt;: A small experiment with the bomber craft. More soon

----

&lt;u&gt;Current Projects&lt;/u&gt;:

&lt;u&gt;GameTypes&lt;/u&gt;:

&lt;u&gt;Swap Team Game&lt;/u&gt;: Every time you are killed, you switch teams. A team wins when they have aquired all of the players in the match.

&lt;u&gt;Enhanced Swap Team Game&lt;/u&gt;: An extension of the Swap Team Game, the match allows you to play in specially designed arenas.

----

&lt;u&gt;Other Stuff&lt;/u&gt;:

&lt;u&gt;MineLayer&lt;/u&gt;: An enhanced grenade launcher that is able to place mines. The types are configurable in the mutator menu.

&lt;u&gt;Bouncy / sticky bio globs&lt;/u&gt;: A bio rifle that fires globs that bounce around until they get stuck to a player.

&lt;u&gt;Skarrj Blades&lt;/u&gt;: Rip-off from the predator.

&lt;u&gt;Increasing Damage Mutator 2004&lt;/u&gt;

&lt;u&gt;EMP Grenades&lt;/u&gt;: Causes vehicles to go haywire, than explode.

&lt;u&gt;Tesla Nuke&lt;/u&gt;: Think redeemer times ten.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bisclavret/Developer Journal</title>
    <id>571</id>
    <revision>
      <id>1750</id>
      <timestamp>2005-07-12T08:16:18Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>renamed from [[Developer's Journal]]</comment>
      <text xml:space="preserve">===Bisclavret / Developer's Journal===

Coding To do:

-Automatic Turrets integration into onslaught-

-Finish the Scarab and-

-MineLayer weapons-

-Bouncy bio globs-

-Skarrj Blades-

-Increasing Damage mutator 2004-

-EMP Grenades-

----

SwapTeam Maps:

-ST_Icebound-

----

Contibuters:

-Jim Jatho (automatic turrets)-

'''MythOpus:''' [[Legacy:DeleteMe|DeleteMe]] or Rename?

'''Mychaeel:''' Renamed it.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1749</id>
      <timestamp>2005-07-12T08:16:55Z</timestamp>
      <contributor>
        <ip>64-110-208-223.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>Thanks (deleted comments)</comment>
      <text xml:space="preserve">===Bisclavret / Developer's Journal===

Coding To do:

-Automatic Turrets integration into onslaught-

-Finish the Scarab and-

-MineLayer weapons-

-Bouncy bio globs-

-Skarrj Blades-

-Increasing Damage mutator 2004-

-EMP Grenades-

----

SwapTeam Maps:

-ST_Icebound-

----

Contibuters:

-Jim Jatho (automatic turrets)-

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bitmap</title>
    <id>527</id>
    <revision>
      <id>1643</id>
      <timestamp>2003-05-13T17:36:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Bitmap (Package: Engine)}}

The base class for [[Legacy:Texture (UT)|Texture (UT)]].

This class also exists in UT2003, but only contains the comment &quot;Deprecated&quot;. The corresponding UT2003 class is [[Legacy:BitmapMaterial|BitmapMaterial]].

==Properties ==

===Texture Group ===
; [[Legacy:Palette|Palette]] Palette :  The palette used by this bitmap.  Multiple bitmaps can share a single palette, thus saving valuable memory.
; int UClamp (const)
; int VClamp (const): Since bitmap sizes are bound to be powers of two (32, 64, 128, 256...), these two properties can be used to specify the ''actual'' size of the image on this bitmap.  Some custom UnrealScript code even honors that (but textures on [[Legacy:Brush|brush]] surfaces and [[Legacy:Mesh|mesh]]es don't).

===UnrealScript-Only Propeties ===
; int InternalTime[2] (const) :  
; ETextureFormat Format (const) :  
; color MaxColor (const) :  
; color MipZero (const) :  
; byte UBits (const) :  
; int USize (const) :  
; byte VBits (const) :  
; int VSize (const) :  

==Enums ==

===ETextureFormat ===
; TEXF_P8 : The texture uses an 8 bit palette, i.e. 256 colors.
; TEXF_RGB32 : 
; TEXF_RGB64 : 
; TEXF_DXT1 : Texture is DXT1 compressed.
; TEXF_RGB24 : 

==Known subclasses ==
* [[Legacy:Texture (UT)|Texture (UT)]]</text>
    </revision>
    <revision>
      <id>1644</id>
      <timestamp>2002-01-29T16:18:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Object|Object]] &gt;&gt; Bitmap}}

''Bitmap'', the base class for [[Legacy:Texture (UT)|Texture (UT)]].

==Properties ==

====Palette ====
: The [[Legacy:Palette|palette]] used by this bitmap (provided it is in a palettized format, but the Unreal engine doesn't support any other formats at the time of this writing &amp;mdash; Unreal 2's engine probably will, though).  Multiple bitmaps can share a single palette, thus saving valuable memory.

====UClamp, VClamp ====
: Since bitmap sizes are bound to be powers of two (32, 64, 128, 256...), these two properties can be used to specify the &lt;i&gt;actual&lt;/i&gt; size of the image on this bitmap.  Some custom UnrealScript code even honors that (but [[Legacy:Texture (UT)|Texture (UT)]]s on [[Legacy:Brush|brush]] surfaces and [[Legacy:Mesh|mesh]]es don't).

==Known subclasses ==

[[Legacy:Texture (UT)|Texture (UT)]]&lt;br /&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bitmap (DX)</title>
    <id>636</id>
    <revision>
      <id>1894</id>
      <timestamp>2004-02-10T05:07:41Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; Bitmap (Engine)}}

An abstract bitmap.

==Deus Ex differences==
** Deus Ex does not give an Alpha channel value in defaultproperties

==Properties==
; ETextureFormat Format : 
; int InternalTime[2] : 
; color MaxColor : 
; color MipZero : 
; byte UBits : 
; int UClamp : 
; int USize : 
; byte VBits : 
; int VSize : 

===Texture===
; palette Palette : 
; int VClamp : 

==Enums==

===ETextureFormat===

Texture format
; TEXF_P8 :
; TEXF_RGB32 :
; TEXF_RGB64 :
; TEXF_DXT1 :
; TEXF_RGB24 :

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BitmapMaterial</title>
    <id>583</id>
    <revision>
      <id>1776</id>
      <timestamp>2005-12-29T01:15:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; BitmapMaterial (Package: Engine)}}

Abstract base class for Textures and ScriptedTextures.

==Properties==

===Texture Group===
; int UClamp : Set equal to your texture's horizontal pixels 
; int VClamp : Set equal to your texture's vertical pixels 
; ETexClampMode UClampMode : Horizontal clamp mode 
; ETexClampMode VClampMode : Vertical clamp mode 

===TextureFormat Group===
; ETextureFormat Format (const, editconst) : 

===Hidden===
; byte UBits :  
; int USize :  
; byte VBits :  
; int VSize :  

==Enums==

===ETextureFormat===
; TEXF_P8 : The texture uses an 8 bit palette, i.e. 256 colors.
; TEXF_RGBA7 : 
; TEXF_RGB16 : 
; TEXF_DXT1 : Texture is DXT1 compressed.
; TEXF_RGB8 : 
; TEXF_RGBA8 : Red, Green, Blue and Alpha channels each use 8 bits/pixel.
; TEXF_NODATA : No data?
; TEXF_DXT3 : Texture is DXT3 compressed.
; TEXF_DXT5 : Texture is DXT5 compressed
; TEXF_L8 : 
; TEXF_G16 : Used for terrain heightmaps
; TEXF_RRRGGGBBB : 

See [[Legacy:Texture Format|texture format]] for more.

===ETexClampMode===

This determines what happens at the edge of a texture when panned or otherwise manipulated.
; TC_Wrap : Duplicates the texture past its edges. (Make sure your texture has matching edges, or you'll get an obvious line where the texture repeats.)
; TC_Clamp : Endlessly repeats the edge pixels. 

==Known Subclasses==
* [[Legacy:ScriptedTexture|ScriptedTexture]]
* [[Legacy:ShadowBitmapMaterial|ShadowBitmapMaterial]]
* [[Legacy:Texture|Texture]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1777</id>
      <timestamp>2005-08-07T04:58:40Z</timestamp>
      <contributor>
        <ip>65-73-151-96.br1.hnv.mi.frontiernet.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; BitmapMaterial (Package: Engine)}}

Abstract base class for Textures and ScriptedTextures.

==Properties ==

===Texture Group ===
; int UClamp : Set equal to your texture's horizontal pixels 
; int VClamp : Set equal to your texture's vertical pixels 
; ETexClampMode UClampMode : Horizontal clamp mode 
; ETexClampMode VClampMode : Vertical clamp mode 

===TextureFormat Group ===
; ETextureFormat Format (const, editconst) : 

===UnrealScript-Only Properties ===
; byte UBits :  
; int USize :  
; byte VBits :  
; int VSize :  

==Enums ==

===ETextureFormat ===
; TEXF_P8 : The texture uses an 8 bit palette, i.e. 256 colors.
; TEXF_RGBA7 : 
; TEXF_RGB16 : 
; TEXF_DXT1 : Texture is DXT1 compressed.
; TEXF_RGB8 : 
; TEXF_RGBA8 : Red, Green, Blue and Alpha channels each use 8 bits/pixel.
; TEXF_NODATA : No data?
; TEXF_DXT3 : Texture is DXT3 compressed.
; TEXF_DXT5 : Texture is DXT5 compressed
; TEXF_L8 : 
; TEXF_G16 : Used for terrain heightmaps
; TEXF_RRRGGGBBB : 

See [[Legacy:Texture Format|texture format]] for more.

===ETexClampMode ===

This determines what happens at the edge of a texture when panned or otherwise manipulated.
; TC_Wrap : Duplicates the texture past its edges. (Make sure your texture has matching edges, or you'll get an obvious line where the texture repeats.)
; TC_Clamp : Endlessly repeats the edge pixels. 

==Known Subclasses ==
* [[Legacy:ScriptedTexture|ScriptedTexture]]
* [[Legacy:ShadowBitmapMaterial|ShadowBitmapMaterial]]
* [[Legacy:Texture|Texture]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bitty</title>
    <id>653</id>
    <revision>
      <id>1929</id>
      <timestamp>2005-02-27T17:46:25Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <minor/>
      <comment>Minor link edits</comment>
      <text xml:space="preserve">===1/13/05===

Well, I came here tonight to find some info on a mutator I'm working on, and the dang thing was spammed.  I finally decided to get off my arse and help out reverting the pages, and put this here while I'm at it. ;o)

==Stuff I'm working on==

I'm involved with a few projects, under the umbrella of [http://www.unitedscriptors.org United Scriptors].  We're just getting started as a group, but we're a (very) loose group of people from various clans tossing around ideas and creating mods.  I'm currently in the process of merging my code for a sniper rifle in with a bunch of ideas others in the group have been giving me.

I'm also starting the planning for a spawn protection mutator and a scoreboard that'll show efficiency along with the normal stuff.  The scoreboard's nothing big, it's more for personal consumption on the server I admin ([http://www.notyouraverage.com/ shameless plug for my clan]).

'''Mosquito:''' Hey, weclome mate. And thanks for helping revert the pages. That spaming was something incredible!

'''Tarquin:''' welcome to the unreal wiki, and thanks for the spam reverting. it looks like you guys were under heavy attack while I was asleep :(

'''EntropicLqd:''' Hi, welcome to the Wiki.  Thanks for the de-spam - mucho appreciated.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1930</id>
      <timestamp>2005-01-14T09:20:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===1/13/05===

Well, I came here tonight to find some info on a mutator I'm working on, and the dang thing was spammed.  I finally decided to get off my arse and help out reverting the pages, and put this here while I'm at it. ;o)

==Stuff I'm working on==

I'm involved with a few projects, under the umbrella of [http://unitedscriptors.org/phpBB2/ United Scriptors].  We're just getting started as a group, but we're a (very) loose group of people from various clans tossing around ideas and creating mods.  I'm currently in the process of merging my code for a [http://www.bitgood.org/unreal/ sniper rifle] in with a bunch of ideas others in the group have been giving me.

I'm also starting the planning for a spawn protection mutator and a scoreboard that'll show efficiency along with the normal stuff.  The scoreboard's nothing big, it's more for personal consumption on the server I admin ([http://www.notyouraverage.com/ shameless plug for my clan]).

'''Mosquito:''' Hey, weclome mate. And thanks for helping revert the pages. That spaming was something incredible!

'''Tarquin:''' welcome to the unreal wiki, and thanks for the spam reverting. it looks like you guys were under heavy attack while I was asleep :(

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1931</id>
      <timestamp>2005-01-14T09:26:10Z</timestamp>
      <contributor>
        <ip>Cellgate.btcellnet.net</ip>
      </contributor>
      <comment>welcome and thanks.</comment>
      <text xml:space="preserve">===1/13/05===

Well, I came here tonight to find some info on a mutator I'm working on, and the dang thing was spammed.  I finally decided to get off my arse and help out reverting the pages, and put this here while I'm at it. ;o)

==Stuff I'm working on==

I'm involved with a few projects, under the umbrella of [http://unitedscriptors.org/phpBB2/ United Scriptors].  We're just getting started as a group, but we're a (very) loose group of people from various clans tossing around ideas and creating mods.  I'm currently in the process of merging my code for a [http://www.bitgood.org/unreal/ sniper rifle] in with a bunch of ideas others in the group have been giving me.

I'm also starting the planning for a spawn protection mutator and a scoreboard that'll show efficiency along with the normal stuff.  The scoreboard's nothing big, it's more for personal consumption on the server I admin ([http://www.notyouraverage.com/ shameless plug for my clan]).

'''Mosquito:''' Hey, weclome mate. And thanks for helping revert the pages. That spaming was something incredible!

'''Tarquin:''' welcome to the unreal wiki, and thanks for the spam reverting. it looks like you guys were under heavy attack while I was asleep :(

'''EntropicLqd:''' Hi, welcome to the Wiki.  Thanks for the de-spam - mucho appreciated.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bjorn</title>
    <id>573</id>
    <revision>
      <id>1754</id>
      <timestamp>2003-08-17T10:42:19Z</timestamp>
      <contributor>
        <ip>Lindeijer.xs4all.nl</ip>
      </contributor>
      <comment>fixed url</comment>
      <text xml:space="preserve">===About me ===

Hello, I'm Bj&amp;oslash;rn. I have been modding for the UT2003 total convertion [http://ua.unrealism.com/ Unreal Annihilation], which is an attempt to recreate the game of Total Annihilation with the UT2003 engine (and mix Battle Zone elements). This Wiki thing seems ultra cool, I hope to find some pages waiting for a usefull contribution.

You can contact me through MSN: b_lindeijer@hotmail.com

===Discussion ===

'''Bj&amp;oslash;rn:''' So, hi fellow Wiki developers! :-)

'''ZxAnPhOrIaN:''' Hey! Welcome to the wiki! :) :tup: Hooah!! I beat all of yah!!!!!!!!!

'''Tarquin:''' Hello. Beaten again by Zxan. Darn. ;) Welcome to the Unreal Wiki, Bjorn. I think you'll find pages in need of attention all over the place... ;)

'''ZxAnPhOrIaN:''' HEHEHE............... /me trails off into oblivion

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1755</id>
      <timestamp>2002-10-12T01:20:49Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About me ===

Hello, I'm Bj&amp;oslash;rn. I am currently modding for the UT2003 total convertion [http://www.imahosting.com/maxoverkill/ Unreal Annihilation] (or TA:UT), which is an attempt to recreate the game of Total Annihilation with the UT2003 engine (and mix Battle Zone elements). This Wiki thing seems ultra cool, I hope to find some pages waiting for a usefull contribution.

You can contact me through MSN: b_lindeijer@hotmail.com

===Discussion ===

'''Bjorn:''' So, hi fellow Wiki developers! :-)

'''ZxAnPhOrIaN:''' Hey! Welcome to the wiki! :) :tup: Hooah!! I beat all of yah!!!!!!!!!

'''Tarquin:''' Hello. Beaten again by Zxan. Darn. ;) Welcome to the Unreal Wiki, Bjorn. I think you'll find pages in need of attention all over the place... ;)

'''ZxAnPhOrIaN:''' HEHEHE............... /me trails off into oblivion

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blaaguuu</title>
    <id>598</id>
    <revision>
      <id>1808</id>
      <timestamp>2005-09-24T08:41:28Z</timestamp>
      <contributor>
        <ip>C-67-168-191-212.hsd1.wa.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Contact ===

if you want to contact me, for any reason, here are soem good ways:

'''E-mail:''''' blaaguuu@comcast.net

'''MSN IM:''' duh... ^^^

'''AIM:''' blaaguuu

'''IRC:''' #ballers #clansop #bloodpit @ irc.progameplayer.com

===What I do ===

My skills when it comes to Unreal are mainly Coding and Mapping

I love helping people out with all of those, so if you are havign any troubles, feel free to contact me by the means above.

I usually keep myself pretty busy, but if you need someone for Coding or Mapping for a project of yours, drop me a line, and i might be inclined to join you.

===Abotu Meh ===

My name is Devon Carlson... i enjoy just about anything relating to computers, and LOVE the Unreal engine with all my hearts :D

as of 4/11/03 I am a purple belt in 2 martial arts, Judo and Wing Chun Do, and have participated in 3 competitions. 

and BTW, I am teh typ0 king... I have been pretty careful about re-reading my changes here and catching as much as i can, but there are still in abundance, and I apologise ;) (had to edit atleast 10 typos in that sentance alone)

===Projects ===

Here are some of my Mod/Mutator/Mapping projects:

==BloodPit - Mod ==

http://bloodpit.dbcenter.org

BloodPit is, in simplest terms, Sumo Wrestling with a shield gun.

BloodPit is round based, and the point of the game is just like Team DeathMatch - kill the other team before they can kill you.

There are 3 ways to kill an oponent - by boostign them into the Pit - by jumping on their head (each head stomp does 50 damage, and pressign the crouch key after jumpign makes you stomp down quickly) - and finaly, by juggling the enemy in the air 3 times, without them touching the ground.

'''Project Progress:''' Public Beta 1.0 released. about 40% done on 1.1

'''My Job:''' the coder, a little mapping

===Discussion ===

moo?

'''ZxAnPhOrIaN:''' moo

'''GRAF!K:''' Moo? o_O I wonder how I'd refactor this to document mode... ;-)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1809</id>
      <timestamp>2003-05-12T02:08:03Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">===Contact ===

if you want to contact me, for any reason, here are soem good ways:

'''E-mail:''''' blaaguuu@hotmail.com

'''MSN IM:''' duh... ^^^

'''AIM:''' blaaguuu

'''IRC:''' #ballers #clansop #bloodpit @ irc.progameplayer.com

===What I do ===

My skills when it comes to Unreal are Coding, Mapping, Modeling, and kicking butt online ;)

I love helping people out with all of those, so if you are havign any troubles, feel free to contact me by the means above.

I usually keep myself pretty busy, but if you need someone for Coding or Mapping for a project of yours, drop me a line, and i might be inclined to join you.

===Abotu Meh ===

My name is Devon Carlson... i enjoy just about anything relating to computers, and LOVE the Unreal engine with all my hearts :D

as of 4/11/03 I am a purple belt in 2 martial arts, Judo and Wing Chun Do, and have participated in 3 competitions (placed 2nd in 1!!!!). 

and BTW, I am teh typ0 king... I have been pretty careful about re-reading my changes here and catching as much as i can, but there are still in abundance, and I apologise ;) (had to edit atleast 10 typos in that sentance alone)

===Projects ===

Here are some of my Mod/Mutator/Mapping projects:

==BloodPit - Mod ==

http://bloodpit.dbcenter.org

BloodPit is, in simplest terms, Sumo Wrestling with a shield gun.

BloodPit is round based, and the point of the game is just like Team DeathMatch - kill the other team before they can kill you.

There are 3 ways to kill an oponent - by boostign them into the Pit - by jumping on their head (each head stomp does 50 damage, and pressign the crouch key after jumpign makes you stomp down quickly) - and finaly, by juggling the enemy in the air 3 times, without them touching the ground.

'''Project Progress:''' Public Beta 1.0 released. about 40% done on 1.1

'''My Job:''' the coder, a little mapping

==Sentry Weapons ==

[[Legacy:Mod Ideas/Sentry Weapons|Sentry Weapons]]

deploy a Sentry Weapon that would be a tripod with the weapon you have selected on top 

'''Project Progress:''' very early coding

'''My Job:''' haven't actually started work on it yet, but i came up with the idea, and will probably be the coder

==Space Fighter Mod ==

[[Legacy:Mod Ideas/Space Fighter Mod|Space Fighter Mod]]

BF1942 meets Tie-Fighter.....sorta....

'''Project Progress:''' still in planning stages

'''My Job:''' helping theorize gameplay, will proabbly do some coding, and maybe mapping

===Discussion ===

moo?

'''ZxAnPhOrIaN:''' moo

'''GRAF!K:''' Moo? o_O I wonder how I'd refactor this to document mode... ;-)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlackHornet</title>
    <id>621</id>
    <revision>
      <id>1858</id>
      <timestamp>2003-08-07T12:38:36Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">More will come.....

while waiting check out the Mod im working on.

http://www.globalwarzone.net

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1859</id>
      <timestamp>2003-08-07T12:35:44Z</timestamp>
      <contributor>
        <ip>BlackHornet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">More will come.....

while waiting check out the Mod im working on.

http://www.globalwarzone.net</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BladeHopper</title>
    <id>28476</id>
    <revision>
      <id>40177</id>
      <timestamp>2009-11-17T10:54:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blain</title>
    <id>616</id>
    <revision>
      <id>1845</id>
      <timestamp>2003-07-03T21:01:33Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi.  I'm Blain.

===My Story===

I've wanted to make video games all my life.  I was writing design docs when I was ten (crappy ones, mind you).  I had visions.  But life (school, work, and playing games) was always in the way.  That's changed, and now I'm standing in the possibility of being one of the world's best game designers.  The world looks pretty awesome from in here. :D

===My Relationship to UT===

I messed around with UT script a while back, trying to make a UT version of Turok 2's hilarious Monkey Tag gametype.  I never got past the model changing code, but I was instantly impressed with the time based, state based, and networking based model used by UnrealScript.  It's an awesome tool.

===My Relationship to Wikis===

Martin Pool introduced me to Wiki's when we worked together at HP.  I'm still a relative newbie, though.

===Previous Mod Experience===
* Coauthored 24 DM levels in Godless 1, 2, &amp; 3.
* Authored a few single player and co-op levels (unreleased)
* Coasted the SlaughterDM project to completion ;)
* DM Map01 for Ninja DOOM (unreleased)
* Authored numerous DM sound packs
* Authored and made simple new textures for Godless Tag
* Created and maintained a web site for Godless and sound pack projects and misc. DOOM philosophizing
* wrote text files, made level titles, made intermission screens, and performed other polishing work for many of the above

===Previous Mod Ideas===

====Doomio Kart====

Concept: using the DOOM source, programatically cut the sprites off at the waist, superimpose a go-kart, and let `em rip!

High Level Work Breakdown:

version 0: The Basics
*Remove Weapons
*Draw characters with go-karts
*Change physics code &amp; control
*Add new linedef types to define race track
*Create test map
*add sfx

version 1: An actual race!
*create HUD
*network code to drive against humans
*add cooler test maps
*polish, polish, polish

version 2: Oooh!  Pretty!
*special &quot;dust&quot; effects for mud, shallows, etc.
*adding &quot;drive off&quot; zones
*special &quot;poof&quot; effects for driving off zones (into space, lava, slime, water)
*replacing character on track after drive off
*polish, polish, polish

version 3: Single player
*add bots
*add code to fill out network games with bots
*add menu option to turn bots off
*add time trial
*add ghost race
*polish, polish, polish

version 4: We'll need guns.  Lots of guns.
*Add weapons
*Add menu for choosing weapons or no weapons
*Add game code for DeathMatch
*Add DM test level
*Add menu for choosing racing or DM
*Add weapon use to bots
*polish, polish, polish

version 5:
*polish, polish, polish :)

----

'''Mychaeel:''' Welcome to the Wiki. &amp;ndash; Are you working professionally as a game designer today?

----

'''Blain:''' Thank you Mychaeel.  I'm very glad to be here.  &amp;ndash; I am not a pro yet,  but I have an idea that will change the world, so it can't be long now. ;)

----

'''Dark Pulse:''' Well, I hope it goes well. I wish to enter game design myself (Thanks no less to UT, heh.) I do know that if I keep practicing mapping, it will improve. I wish you luck, sir.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1846</id>
      <timestamp>2003-07-03T18:06:26Z</timestamp>
      <contributor>
        <ip>Blain</ip>
      </contributor>
      <comment>A response to Mychaeel and a lot more about my past.</comment>
      <text xml:space="preserve">Hi.  I'm Blain.

===My Story===

I've wanted to make video games all my life.  I was writing design docs when I was ten (crappy ones, mind you).  I had visions.  But life (school, work, and playing games) was always in the way.  That's changed, and now I'm standing in the possibility of being one of the world's best game designers.  The world looks pretty awesome from in here. :D

===My Relationship to UT===

I messed around with UT script a while back, trying to make a UT version of Turok 2's hilarious Monkey Tag gametype.  I never got past the model changing code, but I was instantly impressed with the time based, state based, and networking based model used by UnrealScript.  It's an awesome tool.

===My Relationship to Wikis===

Martin Pool introduced me to Wiki's when we worked together at HP.  I'm still a relative newbie, though.

===Previous Mod Experience===
* Coauthored 24 DM levels in Godless 1, 2, &amp; 3.
* Authored a few single player and co-op levels (unreleased)
* Coasted the SlaughterDM project to completion ;)
* DM Map01 for Ninja DOOM (unreleased)
* Authored numerous DM sound packs
* Authored and made simple new textures for Godless Tag
* Created and maintained a web site for Godless and sound pack projects and misc. DOOM philosophizing
* wrote text files, made level titles, made intermission screens, and performed other polishing work for many of the above

===Previous Mod Ideas===

====Doomio Kart====

Concept: using the DOOM source, programatically cut the sprites off at the waist, superimpose a go-kart, and let `em rip!

High Level Work Breakdown:

version 0: The Basics
*Remove Weapons
*Draw characters with go-karts
*Change physics code &amp; control
*Add new linedef types to define race track
*Create test map
*add sfx

version 1: An actual race!
*create HUD
*network code to drive against humans
*add cooler test maps
*polish, polish, polish

version 2: Oooh!  Pretty!
*special &quot;dust&quot; effects for mud, shallows, etc.
*adding &quot;drive off&quot; zones
*special &quot;poof&quot; effects for driving off zones (into space, lava, slime, water)
*replacing character on track after drive off
*polish, polish, polish

version 3: Single player
*add bots
*add code to fill out network games with bots
*add menu option to turn bots off
*add time trial
*add ghost race
*polish, polish, polish

version 4: We'll need guns.  Lots of guns.
*Add weapons
*Add menu for choosing weapons or no weapons
*Add game code for DeathMatch
*Add DM test level
*Add menu for choosing racing or DM
*Add weapon use to bots
*polish, polish, polish

version 5:
*polish, polish, polish :)

----

'''Mychaeel:''' Welcome to the Wiki. &amp;ndash; Are you working professionally as a game designer today?

----

'''Blain:''' Thank you Mychaeel.  I'm very glad to be here.  &amp;ndash; I am not a pro yet,  but I have an idea that will change the world, so it can't be long now. ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blender</title>
    <id>625</id>
    <revision>
      <id>1867</id>
      <timestamp>2008-01-23T20:27:15Z</timestamp>
      <contributor>
        <ip>Mrkat</ip>
      </contributor>
      <minor/>
      <comment>corrected link typo</comment>
      <text xml:space="preserve">'''Blender''' is &quot;... open source software for 3D modeling, animation, rendering, post-production, interactive creation and playback. Available for all major operating systems under the GNU General Public License.&quot;

Blender is feature-rich but has an unusual graphical user interface.  It can be used to create static meshes for the unreal engine via a plugin, exporting UVs, smooth groups and vertex painting.

==Blender Website==
* [http://www.blender3d.org The Blender Website] (for blender downloads and info)
* [http://www.blenderartists.org Blender Artists] - Formerly known as Elysiun (user community forums for user help and questions)
* The [http://www.blender.org Blender Development and Community site]  (info and forums for the development of the open source blender)
* [http://www.blenderman.org/ Blenderman site]  (for articles and vtms, but do note to download vtms and models free registration is required)

==File Formats==

===Export Plugins===

====Goofos's ASE exporter====

Exporter now available for 2.4x and above

There *is* another ASE exporter for both 2.36 and 2.37a versions of Blender

(note : script version 2.37a will work in Blender 2.37a up, so it works with 2.40 and 2.41 as well. 2.36 on the other hand, will ONLY work with Blender 2.36)
* Download from [http://www.katsbits.com/htm/tools_utilities.htm#ase KatsBits] (thanks Kat!)   
* Also check the [http://www.doom3world.org/phpbb2/viewtopic.php?t=9275 development thread] for info on usage,  

* [http://www.katsbits.com/htm/tutorials/blender_video_tutorial_terrain.htm Video tutorials for creating] low-poly terrain objects in blender, using Goofos's ASE exporter, 
* [http://www.katsbits.com/htm/tutorials/doom_3_texture_blending.htm Vertex Painting] but I'm not sure if Unreal makes use of, 

Any further questions can be posted there or on [http://www.katsbits.com/cgi-bin/ikonboard.cgi  Kat's forums], again at Quake3Bits.

'''Sweavo:''' Does UT2004 use vertex painting?  I'm just being an editor here, not an author!

====Doc Holiday's Blender to .ASE====

* http://www.neewo.de/Files/USM11Script.zip (updated to 1.1, fixed scale issues)
* A [http://www.katsbits.com/htm/tutorials/doom_3_prepping_models.htm tutorial for this plugin] in the context of doom 3 

====Cambo's Blender to .ASE====

* http://blenderartists.org/forum/showthread?t=45180
* [http://blendpolis.serverpool.org/f/article_view.php?faq=6&amp;fldAuto=13 Tutorial in German]  (try google translation)

'''NOTE:''' when using the export script, it will throw an error if it does not find the default .00x after the datablock name of the texture.

====Optimus_P-Fat's PSK/PSA Export Script====

* download from [http://www.p-fat.net/ p-fat.net]

'''NOTES:''' please read the caveats on p-fat.net before using this script. There are a few things it doesn't handle that you must do to your mesh before the export, like converting all quads to triangles. This script is still very much &quot;alpha&quot;, but seems to work fine for meshes, armatures, and animations. 

===Import Plugins===

Blender supports many file formats for reading.

'''Sweavo:''' - but can it import meshes from UT?

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Comments==

'''Kat [23 Jan 08]''' corrected link typo

'''Kat [20 Mar 07]''' Links to Quake3Bits changed to Katsbits (new home)

'''Kat [13 May 06]''' New forums are up http://www.katsbits.com/cgi-bin/ikonboard.cgi 

'''Tychon:''' My main question is, can Blender support the export of animations used in Unreal? If so, I think it would be an excellent solution. Free and powerful.

'''Enos Shenk:''' I guess i need to learn UV stuff then. If i could figure out the plugin. Since it comes with no documentation at all.

'''Tychon:''' The Blender webpage has some decent tutorials and the like, I recommend looking through them.

'''Enos Shenk:''' Im not too worried about figuring out UV, i just cant figure out the plugin. No matter what i do, when i run it, it says &quot;INVALID&quot; and wont let me export. Of course the plugin has no documentation, no explanation on what it expects to be able to export, and the website about it is in german or something.

'''veryhappy:''' I've tried it and got the same error but i thought that was my fault because i don't know how to use blender.I've located other exporter (not tried it yet but looks like it will work)

'''Enos Shenk:''' Ive got it working good. Works great, it just tends to export meshes very tiny, so you have to play with drawscale alot when you get it in the map. Just make sure every face on your object has UV texturing. The image name you use for your UV textures, if its the same name as a texture you have loaded in ued, will be automatically applied when you import the .ase.

'''Dandel1984:''' I am working on a script for ase formatting that i will try to get bundled into blender, but as for the animation, and i am also trying to code a script for support to be added with psk files.

&quot;&quot;&quot;3D-Penguin:&quot;&quot;&quot; afaik &quot;static mesh exporter&quot; implicates no animation data because of the &quot;static&quot;. And Doc Holiday has the title of the script written in english. 

Anyway if you want to get into Blender make sure you do at least the Tuts for the interface BEFORE you do anything else or you will swear like a junkyard guard. Interface is excellent once you got the hang of it. However there is a good support for BVH animation data, so if you could get that into UnrealEd that would be fine. 

BTW. look at Milkshape for animated meshes and UnrealEd support.

'''soon-to-be modeller:'''  I found this link for a BETA psk exporter, maybe it will help?
                               http://wiki.blender.org/bin/view.pl/Blenderwiki/PSK_Export_Details

'''Bob_The_Beheader:''' Personally, comming from taking 2 years of CAD in highschool, and then taking a class requiring students to learn [[Legacy:Softimage|Softimage]], I cannot stand Blender. The layout and process of creation with it is so different, I would reccomend that anyone used to different modelling/animation software think twice before using this program. Of course, it may be worth a try...

'''Star Weaver:''' Personally, I use blender because I probably won't be able to afford full versions of any of the commerical modeling programs within five or ten years and the free versions just weren't working out for me. OTOH, I have minimal other platform experience and probably won't be getting into the field professionally, and it does what I want it to.

On that note, I've modified Doc Holiday's exporter to work with Blender 244 and to add a global scale field that lets you stay at sane blender units without upscaling every time you export (128/1 works pretty well). I'm not sure if I should post the modified code, though, there isn't a liscence notice in the file.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1868</id>
      <timestamp>2007-06-15T02:54:04Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <comment>Comments. Link tweak.</comment>
      <text xml:space="preserve">'''Blender''' is &quot;... open source software for 3D modeling, animation, rendering, post-production, interactive creation and playback. Available for all major operating systems under the GNU General Public License.&quot;

Blender is feature-rich but has an unusual graphical user interface.  It can be used to create static meshes for the unreal engine via a plugin, exporting UVs, smooth groups and vertex painting.

==Blender Website==
* [http://www.blender3d.org The Blender Website] (for blender downloads and info)
* [http://www.blenderartists.org Blender Artists] - Formerly known as Elysiun (user community forums for user help and questions)
* The [http://www.blender.org Blender Development and Community site]  (info and forums for the development of the open source blender)
* [http://www.blenderman.org/ Blenderman site]  (for articles and vtms, but do note to download vtms and models free registration is required)

==File Formats==

===Export Plugins===

====Goofos's ASE exporter====

Exporter now available for 2.4x and above

There *is* another ASE exporter for both 2.36 and 2.37a versions of Blender

(note : script version 2.37a will work in Blender 2.37a up, so it works with 2.40 and 2.41 as well. 2.36 on the other hand, will ONLY work with Blender 2.36)
* Download from [http://www.katsbits.com/htm/tools_utilities.htm#ase KatsBits] (thanks Kat!)   
* Also check the [http://www.doom3world.org/phpbb2/viewtopic.php?t=9275 development thread] for info on usage,  

* [http://www.katsbits.com/htm/tutorials/blender_video_tutorial_terrain.htm Video tutorials for creating] low-poly terrain objects in blender, using Goofos's ASE exporter, 
* [http://www.katbits.com/htm/tutorials/doom_3_texture_blending.htm Vertex Painting] but I'm not sure if Unreal makes use of, 

Any further questions can be posted there or on [http://www.katsbits.com/cgi-bin/ikonboard.cgi  Kat's forums], again at Quake3Bits.

'''Sweavo:''' Does UT2004 use vertex painting?  I'm just being an editor here, not an author!

====Doc Holiday's Blender to .ASE====

* http://www.neewo.de/Files/USM11Script.zip (updated to 1.1, fixed scale issues)
* A [http://www.katsbits.com/htm/tutorials/doom_3_prepping_models.htm tutorial for this plugin] in the context of doom 3 

====Cambo's Blender to .ASE====

* http://blenderartists.org/forum/showthread?t=45180
* [http://blendpolis.serverpool.org/f/article_view.php?faq=6&amp;fldAuto=13 Tutorial in German]  (try google translation)

'''NOTE:''' when using the export script, it will throw an error if it does not find the default .00x after the datablock name of the texture.

===Import Plugins===

Blender supports many file formats for reading.

'''Sweavo:''' - but can it import meshes from UT?

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Comments==

'''Kat [20 Mar 07]''' Links to Quake3Bits changed to Katsbits (new home)

'''Kat [13 May 06]''' New forums are up http://www.katsbits.com/cgi-bin/ikonboard.cgi 

'''Tychon:''' My main question is, can Blender support the export of animations used in Unreal? If so, I think it would be an excellent solution. Free and powerful.

'''Enos Shenk:''' I guess i need to learn UV stuff then. If i could figure out the plugin. Since it comes with no documentation at all.

'''Tychon:''' The Blender webpage has some decent tutorials and the like, I recommend looking through them.

'''Enos Shenk:''' Im not too worried about figuring out UV, i just cant figure out the plugin. No matter what i do, when i run it, it says &quot;INVALID&quot; and wont let me export. Of course the plugin has no documentation, no explanation on what it expects to be able to export, and the website about it is in german or something.

'''veryhappy:''' I've tried it and got the same error but i thought that was my fault because i don't know how to use blender.I've located other exporter (not tried it yet but looks like it will work)

'''Enos Shenk:''' Ive got it working good. Works great, it just tends to export meshes very tiny, so you have to play with drawscale alot when you get it in the map. Just make sure every face on your object has UV texturing. The image name you use for your UV textures, if its the same name as a texture you have loaded in ued, will be automatically applied when you import the .ase.

'''Dandel1984:''' I am working on a script for ase formatting that i will try to get bundled into blender, but as for the animation, and i am also trying to code a script for support to be added with psk files.

&quot;&quot;&quot;3D-Penguin:&quot;&quot;&quot; afaik &quot;static mesh exporter&quot; implicates no animation data because of the &quot;static&quot;. And Doc Holiday has the title of the script written in english. 

Anyway if you want to get into Blender make sure you do at least the Tuts for the interface BEFORE you do anything else or you will swear like a junkyard guard. Interface is excellent once you got the hang of it. However there is a good support for BVH animation data, so if you could get that into UnrealEd that would be fine. 

BTW. look at Milkshape for animated meshes and UnrealEd support.

'''soon-to-be modeller:'''  I found this link for a BETA psk exporter, maybe it will help?
                               http://wiki.blender.org/bin/view.pl/Blenderwiki/PSK_Export_Details

'''Bob_The_Beheader:''' Personally, comming from taking 2 years of CAD in highschool, and then taking a class requiring students to learn [[Legacy:Softimage|Softimage]], I cannot stand Blender. The layout and process of creation with it is so different, I would reccomend that anyone used to different modelling/animation software think twice before using this program. Of course, it may be worth a try...

'''Star Weaver:''' Personally, I use blender because I probably won't be able to afford full versions of any of the commerical modeling programs within five or ten years and the free versions just weren't working out for me. OTOH, I have minimal other platform experience and probably won't be getting into the field professionally, and it does what I want it to.

On that note, I've modified Doc Holiday's exporter to work with Blender 244 and to add a global scale field that lets you stay at sane blender units without upscaling every time you export (128/1 works pretty well). I'm not sure if I should post the modified code, though, there isn't a liscence notice in the file.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1869</id>
      <timestamp>2007-09-24T06:03:01Z</timestamp>
      <contributor>
        <ip>Optimus P-Fat</ip>
      </contributor>
      <comment>*Added link to my PSK/PSA export script for Blender</comment>
      <text xml:space="preserve">'''Blender''' is &quot;... open source software for 3D modeling, animation, rendering, post-production, interactive creation and playback. Available for all major operating systems under the GNU General Public License.&quot;

Blender is feature-rich but has an unusual graphical user interface.  It can be used to create static meshes for the unreal engine via a plugin, exporting UVs, smooth groups and vertex painting.

==Blender Website==
* [http://www.blender3d.org The Blender Website] (for blender downloads and info)
* [http://www.blenderartists.org Blender Artists] - Formerly known as Elysiun (user community forums for user help and questions)
* The [http://www.blender.org Blender Development and Community site]  (info and forums for the development of the open source blender)
* [http://www.blenderman.org/ Blenderman site]  (for articles and vtms, but do note to download vtms and models free registration is required)

==File Formats==

===Export Plugins===

====Goofos's ASE exporter====

Exporter now available for 2.4x and above

There *is* another ASE exporter for both 2.36 and 2.37a versions of Blender

(note : script version 2.37a will work in Blender 2.37a up, so it works with 2.40 and 2.41 as well. 2.36 on the other hand, will ONLY work with Blender 2.36)
* Download from [http://www.katsbits.com/htm/tools_utilities.htm#ase KatsBits] (thanks Kat!)   
* Also check the [http://www.doom3world.org/phpbb2/viewtopic.php?t=9275 development thread] for info on usage,  

* [http://www.katsbits.com/htm/tutorials/blender_video_tutorial_terrain.htm Video tutorials for creating] low-poly terrain objects in blender, using Goofos's ASE exporter, 
* [http://www.katbits.com/htm/tutorials/doom_3_texture_blending.htm Vertex Painting] but I'm not sure if Unreal makes use of, 

Any further questions can be posted there or on [http://www.katsbits.com/cgi-bin/ikonboard.cgi  Kat's forums], again at Quake3Bits.

'''Sweavo:''' Does UT2004 use vertex painting?  I'm just being an editor here, not an author!

====Doc Holiday's Blender to .ASE====

* http://www.neewo.de/Files/USM11Script.zip (updated to 1.1, fixed scale issues)
* A [http://www.katsbits.com/htm/tutorials/doom_3_prepping_models.htm tutorial for this plugin] in the context of doom 3 

====Cambo's Blender to .ASE====

* http://blenderartists.org/forum/showthread?t=45180
* [http://blendpolis.serverpool.org/f/article_view.php?faq=6&amp;fldAuto=13 Tutorial in German]  (try google translation)

'''NOTE:''' when using the export script, it will throw an error if it does not find the default .00x after the datablock name of the texture.

====Optimus_P-Fat's PSK/PSA Export Script====

* download from [http://www.p-fat.net/ p-fat.net]

'''NOTES:''' please read the caveats on p-fat.net before using this script. There are a few things it doesn't handle that you must do to your mesh before the export, like converting all quads to triangles. This script is still very much &quot;alpha&quot;, but seems to work fine for meshes, armatures, and animations. 

===Import Plugins===

Blender supports many file formats for reading.

'''Sweavo:''' - but can it import meshes from UT?

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Comments==

'''Kat [20 Mar 07]''' Links to Quake3Bits changed to Katsbits (new home)

'''Kat [13 May 06]''' New forums are up http://www.katsbits.com/cgi-bin/ikonboard.cgi 

'''Tychon:''' My main question is, can Blender support the export of animations used in Unreal? If so, I think it would be an excellent solution. Free and powerful.

'''Enos Shenk:''' I guess i need to learn UV stuff then. If i could figure out the plugin. Since it comes with no documentation at all.

'''Tychon:''' The Blender webpage has some decent tutorials and the like, I recommend looking through them.

'''Enos Shenk:''' Im not too worried about figuring out UV, i just cant figure out the plugin. No matter what i do, when i run it, it says &quot;INVALID&quot; and wont let me export. Of course the plugin has no documentation, no explanation on what it expects to be able to export, and the website about it is in german or something.

'''veryhappy:''' I've tried it and got the same error but i thought that was my fault because i don't know how to use blender.I've located other exporter (not tried it yet but looks like it will work)

'''Enos Shenk:''' Ive got it working good. Works great, it just tends to export meshes very tiny, so you have to play with drawscale alot when you get it in the map. Just make sure every face on your object has UV texturing. The image name you use for your UV textures, if its the same name as a texture you have loaded in ued, will be automatically applied when you import the .ase.

'''Dandel1984:''' I am working on a script for ase formatting that i will try to get bundled into blender, but as for the animation, and i am also trying to code a script for support to be added with psk files.

&quot;&quot;&quot;3D-Penguin:&quot;&quot;&quot; afaik &quot;static mesh exporter&quot; implicates no animation data because of the &quot;static&quot;. And Doc Holiday has the title of the script written in english. 

Anyway if you want to get into Blender make sure you do at least the Tuts for the interface BEFORE you do anything else or you will swear like a junkyard guard. Interface is excellent once you got the hang of it. However there is a good support for BVH animation data, so if you could get that into UnrealEd that would be fine. 

BTW. look at Milkshape for animated meshes and UnrealEd support.

'''soon-to-be modeller:'''  I found this link for a BETA psk exporter, maybe it will help?
                               http://wiki.blender.org/bin/view.pl/Blenderwiki/PSK_Export_Details

'''Bob_The_Beheader:''' Personally, comming from taking 2 years of CAD in highschool, and then taking a class requiring students to learn [[Legacy:Softimage|Softimage]], I cannot stand Blender. The layout and process of creation with it is so different, I would reccomend that anyone used to different modelling/animation software think twice before using this program. Of course, it may be worth a try...

'''Star Weaver:''' Personally, I use blender because I probably won't be able to afford full versions of any of the commerical modeling programs within five or ten years and the free versions just weren't working out for me. OTOH, I have minimal other platform experience and probably won't be getting into the field professionally, and it does what I want it to.

On that note, I've modified Doc Holiday's exporter to work with Blender 244 and to add a global scale field that lets you stay at sane blender units without upscaling every time you export (128/1 works pretty well). I'm not sure if I should post the modified code, though, there isn't a liscence notice in the file.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42395</id>
      <timestamp>2010-01-17T20:03:42Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>/* Export Plugins */</comment>
      <text xml:space="preserve">'''Blender''' is &quot;... open source software for 3D modeling, animation, rendering, post-production, interactive creation and playback. Available for all major operating systems under the GNU General Public License.&quot;

Blender is feature-rich but has an unusual graphical user interface.  It can be used to create static meshes for the unreal engine via a plugin, exporting UVs, smooth groups and vertex painting.

==Blender Website==
* [http://www.blender3d.org The Blender Website] (for blender downloads and info)
* [http://www.blenderartists.org Blender Artists] - Formerly known as Elysiun (user community forums for user help and questions)
* The [http://www.blender.org Blender Development and Community site]  (info and forums for the development of the open source blender)
* [http://www.blenderman.org/ Blenderman site]  (for articles and vtms, but do note to download vtms and models free registration is required)

==File Formats==

===Export Plugins===

====Goofos's ASE exporter====

Exporter now available for 2.4x and above

There *is* another ASE exporter for both 2.36 and 2.37a versions of Blender

(note : script version 2.37a will work in Blender 2.37a up, so it works with 2.40 and 2.41 as well. 2.36 on the other hand, will ONLY work with Blender 2.36)
* Download from [http://www.katsbits.com/htm/tools_utilities.htm#ase KatsBits] (thanks Kat!)   
* Also check the [http://www.doom3world.org/phpbb2/viewtopic.php?t=9275 development thread] for info on usage,  

* [http://www.katsbits.com/htm/tutorials/blender_video_tutorial_terrain.htm Video tutorials for creating] low-poly terrain objects in blender, using Goofos's ASE exporter, 
* [http://www.katsbits.com/htm/tutorials/doom_3_texture_blending.htm Vertex Painting] but I'm not sure if Unreal makes use of, 

Any further questions can be posted there or on [http://www.katsbits.com/cgi-bin/ikonboard.cgi  Kat's forums], again at Quake3Bits.

'''Sweavo:''' Does UT2004 use vertex painting?  I'm just being an editor here, not an author!

====Doc Holiday's Blender to .ASE====

* http://www.neewo.de/Files/USM11Script.zip (updated to 1.1, fixed scale issues)
* A [http://www.katsbits.com/htm/tutorials/doom_3_prepping_models.htm tutorial for this plugin] in the context of doom 3 

====Cambo's Blender to .ASE====

* http://blenderartists.org/forum/showthread?t=45180
* [http://blendpolis.serverpool.org/f/article_view.php?faq=6&amp;fldAuto=13 Tutorial in German]  (try google translation)

'''NOTE:''' when using the export script, it will throw an error if it does not find the default .00x after the datablock name of the texture.

====Optimus_P-Fat's PSK/PSA Export Script====

* Download from [http://www.p-fat.net/ p-fat.net]

'''NOTES:''' please read the caveats on p-fat.net before using this script. There are a few things it doesn't handle that you must do to your mesh before the export, like converting all quads to triangles. This script is still very much &quot;alpha&quot;, but seems to work fine for meshes, armatures, and animations.

====Darknet's PSK/PSA Export Script====

This is basing on P-Fat's script and has some enhancements.

* Latest version available at [http://forums.epicgames.com/showthread.php?t=602953 Epic's Forum]

====PSK/PSA Export Script by unknown author====

This shall facilitate the export of animated meshes and models to Epic's Unreal Engine's *.psk and *.psa format. Requires at least Blender 2.45 and a full Python installation.

===Import Plugins===

Blender supports many file formats for reading.

'''Sweavo:''' - but can it import meshes from UT?

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Comments==

'''Kat [23 Jan 08]''' corrected link typo

'''Kat [20 Mar 07]''' Links to Quake3Bits changed to Katsbits (new home)

'''Kat [13 May 06]''' New forums are up http://www.katsbits.com/cgi-bin/ikonboard.cgi 

'''Tychon:''' My main question is, can Blender support the export of animations used in Unreal? If so, I think it would be an excellent solution. Free and powerful.

'''Enos Shenk:''' I guess i need to learn UV stuff then. If i could figure out the plugin. Since it comes with no documentation at all.

'''Tychon:''' The Blender webpage has some decent tutorials and the like, I recommend looking through them.

'''Enos Shenk:''' Im not too worried about figuring out UV, i just cant figure out the plugin. No matter what i do, when i run it, it says &quot;INVALID&quot; and wont let me export. Of course the plugin has no documentation, no explanation on what it expects to be able to export, and the website about it is in german or something.

'''veryhappy:''' I've tried it and got the same error but i thought that was my fault because i don't know how to use blender.I've located other exporter (not tried it yet but looks like it will work)

'''Enos Shenk:''' Ive got it working good. Works great, it just tends to export meshes very tiny, so you have to play with drawscale alot when you get it in the map. Just make sure every face on your object has UV texturing. The image name you use for your UV textures, if its the same name as a texture you have loaded in ued, will be automatically applied when you import the .ase.

'''Dandel1984:''' I am working on a script for ase formatting that i will try to get bundled into blender, but as for the animation, and i am also trying to code a script for support to be added with psk files.

&quot;&quot;&quot;3D-Penguin:&quot;&quot;&quot; afaik &quot;static mesh exporter&quot; implicates no animation data because of the &quot;static&quot;. And Doc Holiday has the title of the script written in english. 

Anyway if you want to get into Blender make sure you do at least the Tuts for the interface BEFORE you do anything else or you will swear like a junkyard guard. Interface is excellent once you got the hang of it. However there is a good support for BVH animation data, so if you could get that into UnrealEd that would be fine. 

BTW. look at Milkshape for animated meshes and UnrealEd support.

'''soon-to-be modeller:'''  I found this link for a BETA psk exporter, maybe it will help?
                               http://wiki.blender.org/bin/view.pl/Blenderwiki/PSK_Export_Details

'''Bob_The_Beheader:''' Personally, comming from taking 2 years of CAD in highschool, and then taking a class requiring students to learn [[Legacy:Softimage|Softimage]], I cannot stand Blender. The layout and process of creation with it is so different, I would reccomend that anyone used to different modelling/animation software think twice before using this program. Of course, it may be worth a try...

'''Star Weaver:''' Personally, I use blender because I probably won't be able to afford full versions of any of the commerical modeling programs within five or ten years and the free versions just weren't working out for me. OTOH, I have minimal other platform experience and probably won't be getting into the field professionally, and it does what I want it to.

On that note, I've modified Doc Holiday's exporter to work with Blender 244 and to add a global scale field that lets you stay at sane blender units without upscaling every time you export (128/1 works pretty well). I'm not sure if I should post the modified code, though, there isn't a liscence notice in the file.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42400</id>
      <timestamp>2010-01-17T20:09:33Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>/* Import Plugins */</comment>
      <text xml:space="preserve">'''Blender''' is &quot;... open source software for 3D modeling, animation, rendering, post-production, interactive creation and playback. Available for all major operating systems under the GNU General Public License.&quot;

Blender is feature-rich but has an unusual graphical user interface.  It can be used to create static meshes for the unreal engine via a plugin, exporting UVs, smooth groups and vertex painting.

==Blender Website==
* [http://www.blender3d.org The Blender Website] (for blender downloads and info)
* [http://www.blenderartists.org Blender Artists] - Formerly known as Elysiun (user community forums for user help and questions)
* The [http://www.blender.org Blender Development and Community site]  (info and forums for the development of the open source blender)
* [http://www.blenderman.org/ Blenderman site]  (for articles and vtms, but do note to download vtms and models free registration is required)

==File Formats==

===Export Plugins===

====Goofos's ASE exporter====

Exporter now available for 2.4x and above

There *is* another ASE exporter for both 2.36 and 2.37a versions of Blender

(note : script version 2.37a will work in Blender 2.37a up, so it works with 2.40 and 2.41 as well. 2.36 on the other hand, will ONLY work with Blender 2.36)
* Download from [http://www.katsbits.com/htm/tools_utilities.htm#ase KatsBits] (thanks Kat!)   
* Also check the [http://www.doom3world.org/phpbb2/viewtopic.php?t=9275 development thread] for info on usage,  

* [http://www.katsbits.com/htm/tutorials/blender_video_tutorial_terrain.htm Video tutorials for creating] low-poly terrain objects in blender, using Goofos's ASE exporter, 
* [http://www.katsbits.com/htm/tutorials/doom_3_texture_blending.htm Vertex Painting] but I'm not sure if Unreal makes use of, 

Any further questions can be posted there or on [http://www.katsbits.com/cgi-bin/ikonboard.cgi  Kat's forums], again at Quake3Bits.

'''Sweavo:''' Does UT2004 use vertex painting?  I'm just being an editor here, not an author!

====Doc Holiday's Blender to .ASE====

* http://www.neewo.de/Files/USM11Script.zip (updated to 1.1, fixed scale issues)
* A [http://www.katsbits.com/htm/tutorials/doom_3_prepping_models.htm tutorial for this plugin] in the context of doom 3 

====Cambo's Blender to .ASE====

* http://blenderartists.org/forum/showthread?t=45180
* [http://blendpolis.serverpool.org/f/article_view.php?faq=6&amp;fldAuto=13 Tutorial in German]  (try google translation)

'''NOTE:''' when using the export script, it will throw an error if it does not find the default .00x after the datablock name of the texture.

====Optimus_P-Fat's PSK/PSA Export Script====

* Download from [http://www.p-fat.net/ p-fat.net]

'''NOTES:''' please read the caveats on p-fat.net before using this script. There are a few things it doesn't handle that you must do to your mesh before the export, like converting all quads to triangles. This script is still very much &quot;alpha&quot;, but seems to work fine for meshes, armatures, and animations.

====Darknet's PSK/PSA Export Script====

This is basing on P-Fat's script and has some enhancements.

* Latest version available at [http://forums.epicgames.com/showthread.php?t=602953 Epic's Forum]

====PSK/PSA Export Script by unknown author====

This shall facilitate the export of animated meshes and models to Epic's Unreal Engine's *.psk and *.psa format. Requires at least Blender 2.45 and a full Python installation.

===Import Plugins===

Blender supports many file formats for reading.

'''Sweavo:''' - but can it import meshes from UT?

====Goofos's ASE importer====
It is written for Blender 2.42/2.43 but should also work in newer versions.
The ASE import script will bring in mesh data as well as any UVWmap and vertex paint data found on the selected ASE model.

* Download at [http://www.katsbits.com/files/blender/goofosASE_import_15Aug06.zip Katsbits]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Comments==

'''Kat [23 Jan 08]''' corrected link typo

'''Kat [20 Mar 07]''' Links to Quake3Bits changed to Katsbits (new home)

'''Kat [13 May 06]''' New forums are up http://www.katsbits.com/cgi-bin/ikonboard.cgi 

'''Tychon:''' My main question is, can Blender support the export of animations used in Unreal? If so, I think it would be an excellent solution. Free and powerful.

'''Enos Shenk:''' I guess i need to learn UV stuff then. If i could figure out the plugin. Since it comes with no documentation at all.

'''Tychon:''' The Blender webpage has some decent tutorials and the like, I recommend looking through them.

'''Enos Shenk:''' Im not too worried about figuring out UV, i just cant figure out the plugin. No matter what i do, when i run it, it says &quot;INVALID&quot; and wont let me export. Of course the plugin has no documentation, no explanation on what it expects to be able to export, and the website about it is in german or something.

'''veryhappy:''' I've tried it and got the same error but i thought that was my fault because i don't know how to use blender.I've located other exporter (not tried it yet but looks like it will work)

'''Enos Shenk:''' Ive got it working good. Works great, it just tends to export meshes very tiny, so you have to play with drawscale alot when you get it in the map. Just make sure every face on your object has UV texturing. The image name you use for your UV textures, if its the same name as a texture you have loaded in ued, will be automatically applied when you import the .ase.

'''Dandel1984:''' I am working on a script for ase formatting that i will try to get bundled into blender, but as for the animation, and i am also trying to code a script for support to be added with psk files.

&quot;&quot;&quot;3D-Penguin:&quot;&quot;&quot; afaik &quot;static mesh exporter&quot; implicates no animation data because of the &quot;static&quot;. And Doc Holiday has the title of the script written in english. 

Anyway if you want to get into Blender make sure you do at least the Tuts for the interface BEFORE you do anything else or you will swear like a junkyard guard. Interface is excellent once you got the hang of it. However there is a good support for BVH animation data, so if you could get that into UnrealEd that would be fine. 

BTW. look at Milkshape for animated meshes and UnrealEd support.

'''soon-to-be modeller:'''  I found this link for a BETA psk exporter, maybe it will help?
                               http://wiki.blender.org/bin/view.pl/Blenderwiki/PSK_Export_Details

'''Bob_The_Beheader:''' Personally, comming from taking 2 years of CAD in highschool, and then taking a class requiring students to learn [[Legacy:Softimage|Softimage]], I cannot stand Blender. The layout and process of creation with it is so different, I would reccomend that anyone used to different modelling/animation software think twice before using this program. Of course, it may be worth a try...

'''Star Weaver:''' Personally, I use blender because I probably won't be able to afford full versions of any of the commerical modeling programs within five or ten years and the free versions just weren't working out for me. OTOH, I have minimal other platform experience and probably won't be getting into the field professionally, and it does what I want it to.

On that note, I've modified Doc Holiday's exporter to work with Blender 244 and to add a global scale field that lets you stay at sane blender units without upscaling every time you export (128/1 works pretty well). I'm not sure if I should post the modified code, though, there isn't a liscence notice in the file.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42547</id>
      <timestamp>2010-02-20T20:29:33Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>/* PSK/PSA Export Script by unknown author */  Added the link I forgot</comment>
      <text xml:space="preserve">'''Blender''' is &quot;... open source software for 3D modeling, animation, rendering, post-production, interactive creation and playback. Available for all major operating systems under the GNU General Public License.&quot;

Blender is feature-rich but has an unusual graphical user interface.  It can be used to create static meshes for the unreal engine via a plugin, exporting UVs, smooth groups and vertex painting.

==Blender Website==
* [http://www.blender3d.org The Blender Website] (for blender downloads and info)
* [http://www.blenderartists.org Blender Artists] - Formerly known as Elysiun (user community forums for user help and questions)
* The [http://www.blender.org Blender Development and Community site]  (info and forums for the development of the open source blender)
* [http://www.blenderman.org/ Blenderman site]  (for articles and vtms, but do note to download vtms and models free registration is required)

==File Formats==

===Export Plugins===

====Goofos's ASE exporter====

Exporter now available for 2.4x and above

There *is* another ASE exporter for both 2.36 and 2.37a versions of Blender

(note : script version 2.37a will work in Blender 2.37a up, so it works with 2.40 and 2.41 as well. 2.36 on the other hand, will ONLY work with Blender 2.36)
* Download from [http://www.katsbits.com/htm/tools_utilities.htm#ase KatsBits] (thanks Kat!)   
* Also check the [http://www.doom3world.org/phpbb2/viewtopic.php?t=9275 development thread] for info on usage,  

* [http://www.katsbits.com/htm/tutorials/blender_video_tutorial_terrain.htm Video tutorials for creating] low-poly terrain objects in blender, using Goofos's ASE exporter, 
* [http://www.katsbits.com/htm/tutorials/doom_3_texture_blending.htm Vertex Painting] but I'm not sure if Unreal makes use of, 

Any further questions can be posted there or on [http://www.katsbits.com/cgi-bin/ikonboard.cgi  Kat's forums], again at Quake3Bits.

'''Sweavo:''' Does UT2004 use vertex painting?  I'm just being an editor here, not an author!

====Doc Holiday's Blender to .ASE====

* http://www.neewo.de/Files/USM11Script.zip (updated to 1.1, fixed scale issues)
* A [http://www.katsbits.com/htm/tutorials/doom_3_prepping_models.htm tutorial for this plugin] in the context of doom 3 

====Cambo's Blender to .ASE====

* http://blenderartists.org/forum/showthread?t=45180
* [http://blendpolis.serverpool.org/f/article_view.php?faq=6&amp;fldAuto=13 Tutorial in German]  (try google translation)

'''NOTE:''' when using the export script, it will throw an error if it does not find the default .00x after the datablock name of the texture.

====Optimus_P-Fat's PSK/PSA Export Script====

* Download from [http://www.p-fat.net/ p-fat.net]

'''NOTES:''' please read the caveats on p-fat.net before using this script. There are a few things it doesn't handle that you must do to your mesh before the export, like converting all quads to triangles. This script is still very much &quot;alpha&quot;, but seems to work fine for meshes, armatures, and animations.

====Darknet's PSK/PSA Export Script====

This is basing on P-Fat's script and has some enhancements.

* Latest version available at [http://forums.epicgames.com/showthread.php?t=602953 Epic's Forum]

====PSK/PSA Export Script by unknown author====

This shall facilitate the export of animated meshes and models to Epic's Unreal Engine's *.psk and *.psa format. Requires at least Blender 2.45 and a full Python installation.

* Download at [http://www.katsbits.com/htm/tools_utilities.htm#unreal Katsbits]

===Import Plugins===

Blender supports many file formats for reading.

'''Sweavo:''' - but can it import meshes from UT?

====Goofos's ASE importer====
It is written for Blender 2.42/2.43 but should also work in newer versions.
The ASE import script will bring in mesh data as well as any UVWmap and vertex paint data found on the selected ASE model.

* Download at [http://www.katsbits.com/files/blender/goofosASE_import_15Aug06.zip Katsbits]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]

==Comments==

'''Kat [23 Jan 08]''' corrected link typo

'''Kat [20 Mar 07]''' Links to Quake3Bits changed to Katsbits (new home)

'''Kat [13 May 06]''' New forums are up http://www.katsbits.com/cgi-bin/ikonboard.cgi 

'''Tychon:''' My main question is, can Blender support the export of animations used in Unreal? If so, I think it would be an excellent solution. Free and powerful.

'''Enos Shenk:''' I guess i need to learn UV stuff then. If i could figure out the plugin. Since it comes with no documentation at all.

'''Tychon:''' The Blender webpage has some decent tutorials and the like, I recommend looking through them.

'''Enos Shenk:''' Im not too worried about figuring out UV, i just cant figure out the plugin. No matter what i do, when i run it, it says &quot;INVALID&quot; and wont let me export. Of course the plugin has no documentation, no explanation on what it expects to be able to export, and the website about it is in german or something.

'''veryhappy:''' I've tried it and got the same error but i thought that was my fault because i don't know how to use blender.I've located other exporter (not tried it yet but looks like it will work)

'''Enos Shenk:''' Ive got it working good. Works great, it just tends to export meshes very tiny, so you have to play with drawscale alot when you get it in the map. Just make sure every face on your object has UV texturing. The image name you use for your UV textures, if its the same name as a texture you have loaded in ued, will be automatically applied when you import the .ase.

'''Dandel1984:''' I am working on a script for ase formatting that i will try to get bundled into blender, but as for the animation, and i am also trying to code a script for support to be added with psk files.

&quot;&quot;&quot;3D-Penguin:&quot;&quot;&quot; afaik &quot;static mesh exporter&quot; implicates no animation data because of the &quot;static&quot;. And Doc Holiday has the title of the script written in english. 

Anyway if you want to get into Blender make sure you do at least the Tuts for the interface BEFORE you do anything else or you will swear like a junkyard guard. Interface is excellent once you got the hang of it. However there is a good support for BVH animation data, so if you could get that into UnrealEd that would be fine. 

BTW. look at Milkshape for animated meshes and UnrealEd support.

'''soon-to-be modeller:'''  I found this link for a BETA psk exporter, maybe it will help?
                               http://wiki.blender.org/bin/view.pl/Blenderwiki/PSK_Export_Details

'''Bob_The_Beheader:''' Personally, comming from taking 2 years of CAD in highschool, and then taking a class requiring students to learn [[Legacy:Softimage|Softimage]], I cannot stand Blender. The layout and process of creation with it is so different, I would reccomend that anyone used to different modelling/animation software think twice before using this program. Of course, it may be worth a try...

'''Star Weaver:''' Personally, I use blender because I probably won't be able to afford full versions of any of the commerical modeling programs within five or ten years and the free versions just weren't working out for me. OTOH, I have minimal other platform experience and probably won't be getting into the field professionally, and it does what I want it to.

On that note, I've modified Doc Holiday's exporter to work with Blender 244 and to add a global scale field that lets you stay at sane blender units without upscaling every time you export (128/1 works pretty well). I'm not sure if I should post the modified code, though, there isn't a liscence notice in the file.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43496</id>
      <timestamp>2010-06-20T11:21:21Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <comment>Redirected to new page which contains all information that was given here, so it's not necessary to have the same stuff twice.</comment>
      <text xml:space="preserve">#REDIRECT [[Blender]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blind Rob</title>
    <id>654</id>
    <revision>
      <id>1932</id>
      <timestamp>2005-11-13T03:12:59Z</timestamp>
      <contributor>
        <ip>Cpe-24-161-29-49.hvc.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">hey there,im me

----

'''Tarquin:''' Hi, welcome to unreal wiki :)

'''EntropicLqd:''' Hello and welcome.  Enjoy your stay here.

'''blindrob''' thanks :P

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1933</id>
      <timestamp>2005-03-16T20:12:52Z</timestamp>
      <contributor>
        <ip>24-161-21-133.hvc.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">whoot, im me

chek out http://battlecrafts.c-aces.com/

----

'''Tarquin:''' Hi, welcome to unreal wiki :)

'''EntropicLqd:''' Hello and welcome.  Enjoy your stay here.

'''blindrob''' thanks :P

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blip2</title>
    <id>659</id>
    <revision>
      <id>1942</id>
      <timestamp>2007-08-06T12:13:27Z</timestamp>
      <contributor>
        <ip>Engineer.dogmatix.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I'm a assault mapper/coder (who is slowly learning how to mesh/texture) for UT2004 and starting to plan a range of mods and maps for UT3.

===Links===

[http://sector6.dogmatix.net/] &lt;&lt;- Where most of my maps/concepts are located

==Tutorials on the wiki==

[[Legacy:Modifying Vehicle Weapons|Modifying Vehicle Weapons]]

[[Legacy:Assault Mapping Tutorial/Adding Vehicles And Turrets|Assault Mapping Tutorial/Adding Vehicles And Turrets]]

blip2

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1943</id>
      <timestamp>2007-08-06T12:12:15Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>revert (damn spammers :-P)</comment>
      <text xml:space="preserve">I'm a assault mapper/coder (who is slowly learning how to mesh/texture) for UT2004 and starting to plan a range of mods and maps for UT2007.

==Currently working on:==

===Learning UnrealEd 4 and [[Legacy:Kismet|Kismet]]===

Learning the general functions of the new editor through roboblitz (particularly matinees)

===Onslaught Map (UT2007)===

Still of course in basic brainstorming in regards of gameplay but general layout and theme are pretty much set.

I'm currently working on style and design of Buildings and Static Meshes.

===Pillargun Building Mod (UT2007)===

Still in beta testing but can be played at:

[ut2004://unreal.dogmatix.net:7777]

===Links===

[http://unreal.dogmatix.net/] &lt;&lt;- Where most of my stuff is (going to be) displayed

==Tutorials on the wiki==

[[Legacy:Modifying Vehicle Weapons|Modifying Vehicle Weapons]]

[[Legacy:Assault Mapping Tutorial/Adding Vehicles And Turrets|Assault Mapping Tutorial/Adding Vehicles And Turrets]]

blip2

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Block Wars/DesignDocument</title>
    <id>629</id>
    <revision>
      <id>1876</id>
      <timestamp>2005-01-14T03:47:39Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">'''Name:''' Block Wars

'''Type:''' Total Conversion

'''Outline:''' Block wars is based on a game by Games Workshop set in the Judge Dredd universe.  In Block Wars, the objective is to completely destroy the enemies building.  In order to do this you must deal enough damage to each floor so that the entire building collapses.  In order to deal enough damage to a floor to cause it to collapse, you must destroy all rooms on that floor.  When a room (or floor) collapses, no character may enter it.  The 2 buildings will be connected through any various number of ways.

==Features==

===Classes===
*'''Madman:''' Fast and furious, this character has only a little health.  A bonus is killing him will not count as a TK if he is on your team.
*'''CityCorp:''' Your average blocker (a resident of the buildings), they guard the building zealously.  The can put out fires and defuse bombs.
*'''Superhero:''' Limited to one per team, the character can fly and is incredibly tough.  Unfortunately, he can't set bombs, start fires, spray graffiti, or loot.  He is just &quot;too nice&quot;
*'''Punks:''' The kids know how to use weapons.  However, they are mostly used to deface the enemy block with gobs of graffiti.  They are also the only class that can use hoverboards.
*'''Fatties:''' This class is so fat they have to roll on wheels.  The have incredible health, but are exteremly slow.  However, they can deal damage by ramming enemies.

===Weapons===
*'''Knife:''' Your average sharp instrument of death.
*'''Stump Gun:''' Pump-action lethality in your hands.
*'''Spitgun:''' Fires lead at an incredible rate.
*'''Demo Charge:''' Used for demolishing those impetus neighbors.
*'''Flamethrower:''' Setting things on fire is always fun.
*'''Spray Paint:''' Non-Lethal but very demeaning to the soul
*'''Missile Launcher:''' Launches little balls of furious death.
*'''Missile Defense Lazer:''' Shoot down those pesky missiles, or just cause vehicles to explode.  Either way, this is a fun gun.

===Utilities===
*'''Armor:''' Protects your fragile form.
*'''Hoverboard:''' Allows the user to fly.
*'''Jetpack:''' Same as hoverboard.
*'''Various others'''

===Maps===
*'''Line of Fire:''' The buildings are directly across from each other.  Let the slaughter begin!

===Features===
*You may set a room on fire to deal it damage and potentially burn down the whole building
*You can fly
*Vehicles to traverse the streets
*You may spray paint a room or window to increase your total points.
*After a while another team is spawned called the &quot;Judges&quot;.  Their goal is to kill every last one of the blockers.  When they spawn spawning is turned off for the blockers.  As soon as all blockers are dead, the game ends.

==Team==

===Leaders===
*Dragonmaw: Lead Modelling, Founder

==Comments==

'''MythOpus:''' Nice idea, It'll take some time to code however...  what will the spray paint do in the game though?  I might start coding for this soon :D

'''MythOpus:''' Oopsies !  I don't think you should have it on this page.  It might confuse people ;)  IMO you should make it a subclass of your personal page or move this to the ModIdeas page :D

'''Dragonmaw:''' Yeah I need to set it as a subclass.  The Spray Paint ingame will, when used, cause a selectable image to appear on the surface you are spraying on.  And it would be great if you could help code, since I only know basic code.  I'm more of a modeller/mapper than anything.</text>
    </revision>
    <revision>
      <id>1877</id>
      <timestamp>2005-01-14T03:35:29Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">'''Name:''' Block Wars

'''Type:''' Total Conversion

'''Outline:''' Block wars is based on a game by Games Workshop set in the Judge Dredd universe.  In Block Wars, the objective is to completely destroy the enemies building.  In order to do this you must deal enough damage to each floor so that the entire building collapses.  In order to deal enough damage to a floor to cause it to collapse, you must destroy all rooms on that floor.  When a room (or floor) collapses, no character may enter it.  The 2 buildings will be connected through any various number of ways.

==Features==

===Classes===
*'''Madman:''' Fast and furious, this character has only a little health.  A bonus is killing him will not count as a TK if he is on your team.
*'''CityCorp:''' Your average blocker (a resident of the buildings), they guard the building zealously.  The can put out fires and defuse bombs.
*'''Superhero:''' Limited to one per team, the character can fly and is incredibly tough.  Unfortunately, he can't set bombs, start fires, spray graffiti, or loot.  He is just &quot;too nice&quot;
*'''Punks:''' The kids know how to use weapons.  However, they are mostly used to deface the enemy block with gobs of graffiti.  They are also the only class that can use hoverboards.
*'''Fatties:''' This class is so fat they have to roll on wheels.  The have incredible health, but are exteremly slow.  However, they can deal damage by ramming enemies.

===Weapons===
*'''Knife:''' Your average sharp instrument of death.
*'''Stump Gun:''' Pump-action lethality in your hands.
*'''Spitgun:''' Fires lead at an incredible rate.
*'''Demo Charge:''' Used for demolishing those impetus neighbors.
*'''Flamethrower:''' Setting things on fire is always fun.
*'''Spray Paint:''' Non-Lethal but very demeaning to the soul
*'''Missile Launcher:''' Launches little balls of furious death.
*'''Missile Defense Lazer:''' Shoot down those pesky missiles, or just cause vehicles to explode.  Either way, this is a fun gun.

===Utilities===
*'''Armor:''' Protects your fragile form.
*'''Hoverboard:''' Allows the user to fly.
*'''Jetpack:''' Same as hoverboard.
*'''Various others'''

===Maps===
*'''Line of Fire:''' The buildings are directly across from each other.  Let the slaughter begin!

===Features===
*You may set a room on fire to deal it damage and potentially burn down the whole building
*You can fly
*Vehicles to traverse the streets
*You may spray paint a room or window to increase your total points.
*After a while another team is spawned called the &quot;Judges&quot;.  Their goal is to kill every last one of the blockers.  When they spawn spawning is turned off for the blockers.  As soon as all blockers are dead, the game ends.

==Team==

===Leaders===
*Dragonmaw: Lead Modelling, Founder

==Comments==

'''MythOpus:''' Nice idea, It'll take some time to code however...  what will the spray paint do in the game though?  I might start coding for this soon :D

'''MythOpus:''' Oopsies !  I don't think you should have it on this page.  It might confuse people ;)  IMO you should make it a subclass of your personal page or move this to the ModIdeas page :D

'''Dragonmaw:''' Yeah I need to set it as a subclass.  The Spray Paint ingame will, when used, cause a selectable image to appear on the surface you are spraying on.  And it would be great if you could help code, since I only know basic code.  I'm more of a modeller/mapper than anything.</text>
    </revision>
    <revision>
      <id>1878</id>
      <timestamp>2005-01-14T03:42:36Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlockAll</title>
    <id>528</id>
    <revision>
      <id>1645</id>
      <timestamp>2005-12-29T03:40:55Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; BlockAll}}

A BlockAll is an actor that is designed to work sort of like [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]. The big difference is that a BlockAll actor has an upright [[Legacy:Collision Cylinder|collision cylinder]], as do all actors. What this basically means is that the Actor has two collision numbers: A collision height and a collision radius. The &quot;collision&quot; created by an actor extends upward and downward the amount of &quot;collision height&quot; (so the overall collision created is twice the collision height!). The collision is in the shape of a cylinder, and collision radius is the radius of that cylinder.

To change the collision size of the BlockAll actor:

#Open up its properties by right-clicking the actor and going to properties
#Expand &lt;i&gt;Collision&lt;/i&gt;
#Set its &lt;i&gt;[[Legacy:Actor (UT)/Collision|CollisionHeight]]&lt;/i&gt; and &lt;i&gt;[[Legacy:Actor (UT)/Collision|CollisionRadius]]&lt;/i&gt;

Note: You could also use the BlockAll actor to just block players by setting &lt;i&gt;bBlockActors&lt;/i&gt; to false, but this would be bad form, as you should use the [[Legacy:BlockPlayer|BlockPlayer]] actor instead to avoid confusion.

To see the collision of any actor select the actor and set up the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] (or just one), to be &lt;i&gt;Actor &gt;&gt; Radii View&lt;/i&gt; in the [[Legacy:Right-Click Menu|right-click menu]].

===Attaching a BlockAll to a mover ===

BlockAll actors don't move when attached to movers because Advanced.bStatic is set to True by default. Set this to False to cure the problem. See [[Legacy:Attaching Actors|Attaching Actors]] for more.

===Shortcomings ===

The BlockAll actor can act a little strange at times. BlockAll actors, when fired at, &quot;absorb&quot; the weaponry. In other words the secondary fire of the shock rifle or any bio gel just vanishes instead of exploding. Also, a line of BlockAll actors used to cover an opening will have a slightly strange collision as it is &quot;bumpy&quot; - when you walk along it pressed against it you keep moving in and out of the little crevices created by the collision cylinders. Finally, the primary fire of the flak cannon can actually work its way through a BlockAll actor, maybe someone else who understands it could explain why... The BlockAll actor is best used in small places like a tiny window or even better in a place you don't expect the player to ever get, but they just might manage it so it would be good for insurance. For &quot;normal&quot; windows an [[Legacy:Invisible Collision Hull|invisible collision hull]] will probably work better.</text>
    </revision>
    <revision>
      <id>1646</id>
      <timestamp>2002-06-25T17:01:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; BlockAll}}

A BlockAll is an actor that is designed to work sort of like [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]. The big difference is that a BlockAll actor has an upright [[Legacy:Collision Cylinder|collision cylinder]], as do all actors. What this basically means is that the Actor has two collision numbers: A collision height and a collision radius. The &quot;collision&quot; created by an actor extends upward and downward the amount of &quot;collision height&quot; (so the overall collision created is twice the collision height!). The collision is in the shape of a cylinder, and collision radius is the radius of that cylinder.

To change the collision size of the BlockAll actor:

#Open up its properties by right-clicking the actor and going to properties
#Expand &lt;i&gt;Collision&lt;/i&gt;
#Set its &lt;i&gt;[[Legacy:Actor (UT)/Collision|CollisionHeight]]&lt;/i&gt; and &lt;i&gt;[[Legacy:Actor (UT)/Collision|CollisionRadius]]&lt;/i&gt;

Note: You could also use the BlockAll actor to just block players by setting &lt;i&gt;bBlockActors&lt;/i&gt; to false, but this would be bad form, as you should use the [[Legacy:BlockPlayer|BlockPlayer]] actor instead to avoid confusion.

To see the collision of any actor select the actor and set up the [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] (or just one), to be &lt;i&gt;Actor &gt;&gt; Radii View&lt;/i&gt; in the [[Legacy:Right-Click Menu|right-click menu]].

===Attaching a BlockAll to a mover ===

BlockAll actors dpn't move when attached to movers because Advanced.bStatic is set to True by default. Set this to False to cure the problem. See [[Legacy:Attaching Actors|Attaching Actors]] for more.

===Examples ===

Here is an example of what a window that utilizes BlockAll actors for collision would look like in UED:

http://www.ironflame.com/dana4/ut/pics/blockallex.jpg

This might look a little strange at first, and it can act a little strange too. BlockAll actors, when fired at, &quot;absorb&quot; the weaponry. In other words the secondary fire of the shock rifle or any bio gel just vanishes instead of exploding. Also, a line of BlockAll actors such as this will have a slightly strange collision as it is &quot;bumpy&quot; - when you walk along it pressed against it you keep moving in and out of the little crevices. Finally, the primary fire of the flak cannon can actually work its way through a BlockAll actor, maybe someone else who understands it could explain why... The BlockAll actor is best used in small places like a tiny window or even better in a place you don't expect the player to ever get but they just might manage it so it would be good for insurance. In cases like the one above an [[Legacy:Invisible Collision Hull|invisible collision hull]] will probably work better.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlockMonsters</title>
    <id>665</id>
    <revision>
      <id>1956</id>
      <timestamp>2007-09-15T19:03:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; BlockMonster (Package: Engine)}}

The BlockMonster actor is almost exactly the same as the [[Legacy:BlockPlayer|BlockPlayer]] actor, with the simple difference that it blocks monsters ([[Legacy:ScriptedPawn|ScriptedPawn]]'s), as opposed to bots and players.

==Notes==
* It does block Translocators.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1957</id>
      <timestamp>2007-09-14T22:39:47Z</timestamp>
      <contributor>
        <ip>C-71-205-154-168.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; BlockMonster (Package: Engine)}}

The BlockMonster actor is almost exactly the same as the [[Legacy:BlockPlayer|BlockPlayer]] actor, with the simple difference that it blocks monsters ([[Legacy:ScriptedPawn|ScriptedPawn]]'s), as opposed to bots and players.

Note: It does block Translocators.
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlockPlayer</title>
    <id>530</id>
    <revision>
      <id>1649</id>
      <timestamp>2003-05-27T08:17:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>added category and basic procedure links; BTW: *monsterbump* :-)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; BlockPlayer (Package: Engine)}}

The BlockPlayer actor is pretty similar to the [[Legacy:BlockAll|BlockAll]] actor, so I'm just going to discuss the differences here. The BlockPlayer actor, unlike the [[Legacy:BlockAll|BlockAll]] actor, only blocks players, bots, and translocators. BlockPlayer actors are perfect for putting a top on your level without causing weapons to explode right above the playing field. There are several problems with the BlockPlayer actor however that I'll go over here:

* The bCollideActors boolean under collision is ''incorrect'' by default, unlike the [[Legacy:BlockAll|BlockAll]] actor, which is fine.
* In my experience small collision height values (like under 128), lead to the translocator being able to go past the actor and other weird behavior.

[[Legacy:Set The Following Properties|Set the following properties]] to make the BlockPlayer actor work:
* Collision -&gt; bCollideActors = true
* Collision -&gt; CollisionHeight and CollisionRadius as desired

To see the collision of any actor enable ''Actor -&gt; Radii View'' in the [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] and select the actor.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1650</id>
      <timestamp>2002-01-29T09:31:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; BlockPlayer}}

The BlockPlayer actor is pretty similar to the [[Legacy:BlockAll|BlockAll]] actor, so I'm just going to discuss the differences here. The BlockPlayer actor, unlike the [[Legacy:BlockAll|BlockAll]] actor, only blocks players, bots, and translocators. BlockPlayer actors are perfect for putting a top on your level without causing weapons to explode right above the playing field. There are several problems with the BlockPlayer actor however that I'll go over here:

* The &lt;i&gt;[[Legacy:Actor (UT)/Collision|bCollideActors]]&lt;/i&gt; boolean under collision is ''incorrect'' by default, unlike the [[Legacy:BlockAll|BlockAll]] actor, which is fine
* In my experience small collision height values (like under 128), lead to the translocator being able to go past the actor and other weird behavior.

To correctly set the BlockPlayer's properties:

#Right-click the actor and bring up the properties window
#Expand &lt;i&gt;Collision&lt;/i&gt;
#set &lt;i&gt;[[Legacy:Actor (UT)/Collision|bCollideActors]]&lt;/i&gt; to ''True''
#set the &lt;i&gt;[[Legacy:Actor (UT)/Collision|CollisionHeight]]&lt;/i&gt; and &lt;i&gt;[[Legacy:Actor (UT)/Collision|CollisionRadius]]&lt;/i&gt; as desired

To see the collision of any actor select the actor and set up [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] (or just one), to be &lt;i&gt;Actor &gt;&gt; Radii View&lt;/i&gt; in the [[Legacy:Right-Click Menu|right-click menu]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlockablePath</title>
    <id>666</id>
    <revision>
      <id>1958</id>
      <timestamp>2007-11-18T07:55:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Unfortunately a [[Legacy:BlockedPath|BlockedPath]] is an one-way actor; once it is triggered, there is no way to make it blocked again.  However, it would be simple enough to create a two-way BlockedPath with just a few lines of UnrealScript, and it even works.  Also note that setting a path node's ''ExtraCost'' to anything less than said 100,000,000 doesn't reliably prevent bots from using this path.  (...fill in detailed description here.)

The code necessary to make a BlockedPath actor that can be toggled follows below. [[Legacy:Create A Subclass|Create A Subclass]] explains how to add this to a map.

&lt;uscript&gt;
class BlockablePath extends NavigationPoint

var() bool bInitiallyActive

function Trigger( actor Other, pawn EventInstigator )
{
     bInitiallyActive=!bInitiallyActive;

     if (bInitiallyActive)
         ExtraCost=100000000;
     else
         ExtraCost=0;
 }

 function PostBeginPlay()
 {
     if (bInitiallyActive)
         ExtraCost=100000000;
     else
         ExtraCost=0;
 }
&lt;/uscript&gt;

==Comments ==

'''PiX''' So does this custom class replicate on dedicated servers?

'''Wormbo:''' Paths are generally only used on the server. There's absolutely no need to replicate them.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlockedPath</title>
    <id>529</id>
    <revision>
      <id>1647</id>
      <timestamp>2007-11-18T07:54:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>this is actually a stock class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; BlockedPath (Package: BotPack)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; BlockedPath (Package: GamePlay)}}

The BlockedPath actor works by telling the AI of Pawns in the level that it is ''extremely'' inadvisable to set a course that leads through this point in the navigation network. This is done by setting an ''ExtraCost'' value of precisely 100,000,000 in the BlockedPath's properties. However, a BlockedPath can be unblocked simply by [[Legacy:Trigger|trigger]]ing it.  While this is of no consequence to players, it is of much use to mappers who are trying to get good bot support into their levels, and is often used in Assault maps.

==Related Topics ==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
* [[Legacy:BlockablePath|BlockablePath]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1648</id>
      <timestamp>2007-11-17T23:30:18Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-58-176.dslaccess.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; BlockedPath (Package: BotPack)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; BlockedPath (Package: GamePlay)}}

The BlockedPath actor works by telling the AI of Pawns in the level that it is ''extremely'' inadvisable to set a course that leads through this point in the navigation network. This is done by setting an ''ExtraCost'' value of precisely 100,000,000 in the BlockedPath's properties. However, a BlockedPath can be unblocked simply by [[Legacy:Trigger|trigger]]ing it.  While this is of no consequence to players, it is of much use to mappers who are trying to get good bot support into their levels, and is often used in Assault maps.

==Extending ==

Unfortunately a BlockedPath is an one-way actor; once it is triggered, there is no way to make it blocked again.  However, it would be simple enough to create a two-way BlockedPath with just a few lines of UnrealScript, and it even works.  Also note that setting a path node's ''ExtraCost'' to anything less than said 100,000,000 doesn't reliably prevent bots from using this path.  (...fill in detailed description here.)

The code necessary to make a BlockedPath actor that can be toggled follows below. [[Legacy:Create A Subclass|Create A Subclass]] explains how to add this to a map.

&lt;uscript&gt;
class BlockablePath extends NavigationPoint

var() bool bInitiallyActive

function Trigger( actor Other, pawn EventInstigator )
{
     bInitiallyActive=!bInitiallyActive;

     if (bInitiallyActive)
         ExtraCost=100000000;
     else
         ExtraCost=0;
 }

 function PostBeginPlay()
 {
     if (bInitiallyActive)
         ExtraCost=100000000;
     else
         ExtraCost=0;
 }
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]

==Comments ==

'''PiX''' So does this custom class replicate on dedicated servers?

'''Wormbo:''' Paths are generally only used on the server. There's absolutely no need to replicate them.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlockingVolume</title>
    <id>587</id>
    <revision>
      <id>1785</id>
      <timestamp>2005-11-30T19:40:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; BlockingVolume}}

A Blocking Volume is a Brush that only provides collision. It replaces [[Legacy:UT|UT]]'s [[Legacy:Invisible Collision Hull|Invisible Collision Hull]], which was prone to semisolid errors.

It's basically an invisible brush that is there for the only purpose of blocking actors from moving into a space. These can be used for complex objects where you may want to make them nonsolid, but still block movement (for map efficiency reasons), or if there's a space that a player could become trapped in so you do what's best for them and keep them out of it (unless you decide to make said space a killzone, always good for a couple laughs :)).

By default classblocking is disabled, and the blocking volume will block players, but not projectiles.

==Relevant Properties==
; bClassBlocker : This makes the BlockingVolume block classes from the array, and ONLY these classes. If this property is true, the Collision settings have no effect.

===Collision ===

The settings for what the BV blocks are under [[Legacy:Actor/Collision|Actor/Collision]].

==Related Topics==
* A [[Legacy:BlockAll|BlockAll]] actor is an upright collision cylinder, but does not interfere with the [[Legacy:BSP|BSP]].

==Discussion==

'''Highlander:''' Re:Blocking Projectiles. Try setting bBlockZeroExtendTraces or bBlockNonZeroExtentTraces to true or fiddle with the settings under collision. (Not at home system so cant check)

'''Radiosity:''' It's bBlockZeroExtentTraces to block projectiles :) bBlockNonZeroExtentTraces is used for players and bots and is true by default in a blocking volume.

'''King Mango''' Class blocker is not exactly that simple. I tried using a class blocker for vehicles. No matter what class I entered they still fell through. I tried ONSHoverTank, ONSPRV, ONSVehicle etc... Had to set bBlockZeroExtentTraces to true before it would block vehicles.

But the real reason I'm here is to find out if anyone has sussed how to block a player only? Shock secondary is a NonZeroExtent trace so a BV will block those if it is set to block players. Also, I tried to set UnrealPlayer and xPlayer to class but also these will not block unless the correct extent setting is chosen. Seems kind of pointless to have a class blocker? I think it's broken.

'''Wormbo:''' [[Legacy:UnrealPlayer|UnrealPlayer]] and [[Legacy:XPlayer|xPlayer]] are [[Legacy:Controller|Controller]] classes, what you want to block are [[Legacy:Pawn|Pawn]]s, e.g. [[Legacy:XPawn|xPawn]]. Note that the guided [[Legacy:RedeemerWarhead|RedeemerWarhead]] and [[Legacy:Vehicle|Vehicle]]s are Pawns as well.

'''Aero:''' See here... I have sheets that are BlockingVolume (UT2004), but they dont block anything. Is it because I need cubes for them? Or is it because the sheets are not solid (If so how do I make them solid?)? Someone, help meh. =D

'''zugy:''' Sheets act as non-solids regardless of the type you set them to...use cubes...

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1786</id>
      <timestamp>2005-08-12T21:41:01Z</timestamp>
      <contributor>
        <ip>Pcp02134595pcs.gardnc01.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; BlockingVolume}}

A Blocking Volume is a Brush that only provides collision. It replaces [[Legacy:UT|UT]]'s [[Legacy:Invisible Collision Hull|Invisible Collision Hull]], which was prone to semisolid errors.

It's basically an invisible brush that is there for the only purpose of blocking actors from moving into a space. These can be used for complex objects where you may want to make them nonsolid, but still block movement (for map efficiency reasons), or if there's a space that a player could become trapped in so you do what's best for them and keep them out of it (unless you decide to make said space a killzone, always good for a couple laughs :)).

By default classblocking is disabled, and the blocking volume will block players, but not projectiles.

==Relevant Properties==

; bClassBlocker : This makes the BlockingVolume block classes from the array, and ONLY these classes. If this property is true, the Collision settings have no effect.

===Collision ===

The settings for what the BV blocks are under [[Legacy:Actor/Collision|Actor/Collision]].

==Related Topics==
* A [[Legacy:BlockAll|BlockAll]] actor is an upright collision cylinder, but does not interfere with the [[Legacy:BSP|BSP]].

'''Highlander:''' Re:Blocking Projectiles. Try setting bBlockZeroExtendTraces or bBlockNonZeroExtentTraces to true or fiddle with the settings under collision. (Not at home system so cant check)

'''Radiosity:''' It's bBlockZeroExtentTraces to block projectiles :) bBlockNonZeroExtentTraces is used for players and bots and is true by default in a blocking volume.

'''King Mango''' Class blocker is not exactly that simple. I tried using a class blocker for vehicles. No matter what class I entered they still fell through. I tried ONSHoverTank, ONSPRV, ONSVehicle etc... Had to set bBlockZeroExtentTraces to true before it would block vehicles.

But the real reason I'm here is to find out if anyone has sussed how to block a player only? Shock secondary is a NonZeroExtent trace so a BV will block those if it is set to block players. Also, I tried to set UnrealPlayer and xPlayer to class but also these will not block unless the correct extent setting is chosen. Seems kind of pointless to have a class blocker? I think it's broken.

'''Wormbo:''' [[Legacy:UnrealPlayer|UnrealPlayer]] and [[Legacy:XPlayer|xPlayer]] are [[Legacy:Controller|Controller]] classes, what you want to block are [[Legacy:Pawn|Pawn]]s, e.g. [[Legacy:XPawn|xPawn]]. Note that the guided [[Legacy:RedeemerWarhead|RedeemerWarhead]] and [[Legacy:Vehicle|Vehicle]]s are Pawns as well.

'''Aero:''' See here... I have sheets that are BlockingVolume (UT2004), but they dont block anything. Is it because I need cubes for them? Or is it because the sheets are not solid (If so how do I make them solid?)? Someone, help meh. =D

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1787</id>
      <timestamp>2005-08-13T03:03:04Z</timestamp>
      <contributor>
        <ip>Zugy</ip>
      </contributor>
      <comment>response</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; BlockingVolume}}

A Blocking Volume is a Brush that only provides collision. It replaces [[Legacy:UT|UT]]'s [[Legacy:Invisible Collision Hull|Invisible Collision Hull]], which was prone to semisolid errors.

It's basically an invisible brush that is there for the only purpose of blocking actors from moving into a space. These can be used for complex objects where you may want to make them nonsolid, but still block movement (for map efficiency reasons), or if there's a space that a player could become trapped in so you do what's best for them and keep them out of it (unless you decide to make said space a killzone, always good for a couple laughs :)).

By default classblocking is disabled, and the blocking volume will block players, but not projectiles.

==Relevant Properties==

; bClassBlocker : This makes the BlockingVolume block classes from the array, and ONLY these classes. If this property is true, the Collision settings have no effect.

===Collision ===

The settings for what the BV blocks are under [[Legacy:Actor/Collision|Actor/Collision]].

==Related Topics==
* A [[Legacy:BlockAll|BlockAll]] actor is an upright collision cylinder, but does not interfere with the [[Legacy:BSP|BSP]].

'''Highlander:''' Re:Blocking Projectiles. Try setting bBlockZeroExtendTraces or bBlockNonZeroExtentTraces to true or fiddle with the settings under collision. (Not at home system so cant check)

'''Radiosity:''' It's bBlockZeroExtentTraces to block projectiles :) bBlockNonZeroExtentTraces is used for players and bots and is true by default in a blocking volume.

'''King Mango''' Class blocker is not exactly that simple. I tried using a class blocker for vehicles. No matter what class I entered they still fell through. I tried ONSHoverTank, ONSPRV, ONSVehicle etc... Had to set bBlockZeroExtentTraces to true before it would block vehicles.

But the real reason I'm here is to find out if anyone has sussed how to block a player only? Shock secondary is a NonZeroExtent trace so a BV will block those if it is set to block players. Also, I tried to set UnrealPlayer and xPlayer to class but also these will not block unless the correct extent setting is chosen. Seems kind of pointless to have a class blocker? I think it's broken.

'''Wormbo:''' [[Legacy:UnrealPlayer|UnrealPlayer]] and [[Legacy:XPlayer|xPlayer]] are [[Legacy:Controller|Controller]] classes, what you want to block are [[Legacy:Pawn|Pawn]]s, e.g. [[Legacy:XPawn|xPawn]]. Note that the guided [[Legacy:RedeemerWarhead|RedeemerWarhead]] and [[Legacy:Vehicle|Vehicle]]s are Pawns as well.

'''Aero:''' See here... I have sheets that are BlockingVolume (UT2004), but they dont block anything. Is it because I need cubes for them? Or is it because the sheets are not solid (If so how do I make them solid?)? Someone, help meh. =D

'''zugy:''' Sheets act as non-solids regardless of the type you set them to...use cubes...

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blood Effects</title>
    <id>560</id>
    <revision>
      <id>1724</id>
      <timestamp>2006-03-26T01:16:22Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>Perhaps time to write an updated version of this?</comment>
      <text xml:space="preserve">===How to Make Blood Effects in UnrealED 2.0===

''By JustaAverageKid'' 

'''''Summary of It all'''''
* Make sheet where blood will go [correct size]
* Add the blood texture you want
* Make it Modulated Unlit and Two-Sided

----

Hello, hello! So you wanna learn how to make a nice looking blood effect on a wall?? Well it's quite simple, truth to be told. So let's get started. I assume you know how to make a basic level and all that good stuff. So get to where you want the blood effect and open the [[Legacy:Texture Browser|Texture Browser]]. Click the first drop-down menu [see screenshot] and select engine. Not too bad, yet. Is it? 

[[Image:Legacy_bloodfx1.jpeg|center|Makes your mouth water, no? ...no.]]

Agh, now we see these millions of textures and essential images and stuff, so try not to go berserk in here :) Anyways, scroll scroll scroll down til you find the blood-like effects, they should look like this. 

: would typing &quot;blood&quot; into the filter box be quicker?

[[Image:Legacy_bloodfx2.jpeg|center|I think most all textures with these gray backgrounds fit this tutorial, go ahead and see!]]

#Select blood texture you want
#Check its size ([[Legacy:Right-Click Menu|right-click menu]] -&gt; ''Properties'')
#Make a [[Legacy:Sheet|sheet]] with matching characteristics
#Add it where it's needed (You can make it a [[Legacy:Semisolid|semisolid]] if you'd like, it won't hurt; I've found that [[Legacy:BSP|BSP]] and HOM errors occur frequently if you use a cube to do this, so use sheets :); one more thing, don't intersect the sheet and what you are adding it to or BSP and HOM errors come hovering back) 

Ok, now it feels solid but there's one more thing, the gray crud! Well that's too bad, we'll leave it there. 

'''THE END'''

Hahaha, j/k select the blood effect and go to its [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] and enter these selections:
* modulated
* two-sided
* unlit

Congratulations! You've got the bloody thing done. 

[[Image:Legacy_bloodfx3.jpeg|center|Make sure unlit is selected or else when your lighting is done, your blood effect will have shadows and a mind of its own O_O]]

'''''FINAL RESULTS''''':

[[Image:Legacy_bloodfxfinal.jpeg|center|IMHO, I think these blood effects should only be done on walls and ceilings, not floors because a player often uses seeing blood effects to notify the trail of his/her enemy. Normally blood doesnt spatter onto walls &amp; ceilings]]

===Discussion===

'''EricBlade:''' I see that this specifically states in UEd 2, I don't know if UEd 2 had Projectors, but this tutorial could probably be updated for use of Projectors, or a new one that specifically relates to UEd 3 .. that would be the preferred way of doing something like this now, wouldn't it?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1725</id>
      <timestamp>2003-05-25T09:44:13Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">===How to Make Blood Effects in UnrealED 2.0===

''By JustaAverageKid'' 

'''''Summary of It all'''''
* Make sheet where blood will go [correct size]
* Add the blood texture you want
* Make it Modulated Unlit and Two-Sided

----

Hello, hello! So you wanna learn how to make a nice looking blood effect on a wall?? Well it's quite simple, truth to be told. So let's get started. I assume you know how to make a basic level and all that good stuff. So get to where you want the blood effect and open the [[Legacy:Texture Browser|Texture Browser]]. Click the first drop-down menu [see screenshot] and select engine. Not too bad, yet. Is it? 

[[Image:Legacy_bloodfx1.jpeg|center|Makes your mouth water, no? ...no.]]

Agh, now we see these millions of textures and essential images and stuff, so try not to go berserk in here :) Anyways, scroll scroll scroll down til you find the blood-like effects, they should look like this. 

: would typing &quot;blood&quot; into the filter box be quicker?

[[Image:Legacy_bloodfx2.jpeg|center|I think most all textures with these gray backgrounds fit this tutorial, go ahead and see!]]

#Select blood texture you want
#Check its size ([[Legacy:Right-Click Menu|right-click menu]] -&gt; ''Properties'')
#Make a [[Legacy:Sheet|sheet]] with matching characteristics
#Add it where it's needed (You can make it a [[Legacy:Semisolid|semisolid]] if you'd like, it won't hurt; I've found that [[Legacy:BSP|BSP]] and HOM errors occur frequently if you use a cube to do this, so use sheets :); one more thing, don't intersect the sheet and what you are adding it to or BSP and HOM errors come hovering back) 

Ok, now it feels solid but there's one more thing, the gray crud! Well that's too bad, we'll leave it there. 

'''THE END'''

Hahaha, j/k select the blood effect and go to its [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] and enter these selections:
* modulated
* two-sided
* unlit

Congratulations! You've got the bloody thing done. 

[[Image:Legacy_bloodfx3.jpeg|center|Make sure unlit is selected or else when your lighting is done, your blood effect will have shadows and a mind of its own O_O]]

'''''FINAL RESULTS''''':

[[Image:Legacy_bloodfxfinal.jpeg|center|IMHO, I think these blood effects should only be done on walls and ceilings, not floors because a player often uses seeing blood effects to notify the trail of his/her enemy. Normally blood doesnt spatter onto walls &amp; ceilings]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bloom</title>
    <id>649</id>
    <revision>
      <id>1921</id>
      <timestamp>2007-11-18T16:52:43Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''bloom''' is a lenticular halo. This page shows how to implement this visual effect in [[Legacy:UT2004|UT2004]].

Blooms are another type of effect seen around lights. While [[Legacy:Corona|corona]]s form the fuzzy glow you see around a light at night, or the rays which seem to shoot out from the light of the sun, blooms are a color-banded halo which is usually visible surrounding the corona. They are only seen when a person's pupils are dilated enough. (And [[Legacy:Lens Flare|lens flare]]s are a natural phenomena that occurs when light is refracted many times by some sort of lens, creating several images of geometric shapes to appear from a single light source.  Given that fact, you'll find that lens flares are often over used and appear where they ought not to in 3D graphics.  In other words, you need a compund lens system for a lens flare. They aren't seen purely with the naked eye.)

See the result on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Screenshots]] page, or [http://files.ego-creations.de/ut2004/BloomEffect_Mutator.zip Download here] (don't post public, please). Use for whatever you want, but it would be nice if you let [[Legacy:Jarronis, The Vampiric Unicorn|me]] know and add me in the credits (at least for the idea).

==Code==

At first, let take a look at the mutator:

&lt;uscript&gt;
//-----------------------------------------------------------
// Bloom Mutator
// Creates Interaction and handles
// rendering of the bloom-texture
//-----------------------------------------------------------
#exec OBJ LOAD FILE=DreamTex.utx
class Bloom extends Mutator;

var bool bAffectSpectators; // If this is set to true, an interaction will be created for spectators
var bool bAffectPlayers; // If this is set to true, an interaction will be created for players
var bool bHasInteraction;
var ScriptedTexture st;
var Actor bMesh;
var BloomInteraction BI;

function PreBeginPlay()
{
    //Log(&quot;ICU Mutator Started&quot;); // Always comment out your logs unless they're errors
}

simulated function Tick(float DeltaTime)
{
    local PlayerController PC;


    // If the player has an interaction already, exit function.
    if (bHasInteraction)
        Return;
    PC = Level.GetLocalPlayerController();

    // Run a check to see whether this mutator should create an interaction for the player
    if ( PC != None &amp;&amp; ((PC.PlayerReplicationInfo.bIsSpectator &amp;&amp; bAffectSpectators) || (bAffectPlayers &amp;&amp; !PC.PlayerReplicationInfo.bIsSpectator)) )
    {
        st=ScriptedTexture(Level.ObjectPool.AllocateObject( class'ScriptedTexture' ) );
        st.Client=self;
        //change this for different 'bloom-map' qualities
        st.SetSize(256,256);

        PC.Player.InteractionMaster.AddInteraction(&quot;Dreamland.BloomInteraction&quot;, PC.Player); // Create the interaction
        bHasInteraction = True; // Set the variable so this lot isn't called again
        bMesh=Spawn(class'BloomMesh');
        //A FinalBlend with FB_Brighten
        FinalBlend(bMesh.Skins[0]).Material=st;

        BloomInteraction(PC.Player.LocalInteractions[PC.Player.LocalInteractions.Length-1]).St=st;
        BloomInteraction(PC.Player.LocalInteractions[PC.Player.LocalInteractions.Length-1]).BMesh=bMesh;
        BI=BloomInteraction(PC.Player.LocalInteractions[PC.Player.LocalInteractions.Length-1]);
    }
}

event RenderTexture(ScriptedTexture Tex)
{
    local PlayerController PC;
    local vector camloc;
    local Rotator camrot;
    local Actor camactor;
    local Color tAlpha;



    talpha.R=238;
    talpha.G=238;
    talpha.B=238;


    PC = Level.GetLocalPlayerController();
    PC.PlayerCalcView(camactor,camloc,camrot);
    //log(&quot;RenderEvent&quot;);

    Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,camactor,camloc,camrot,PC.DefaultFOV,false);
    //Lightfilter is a FinalBlend with FB_Darken
    //The Light-threshold is controlled via talpha;
    //Colored Bloom should be possible with unequal RGB values (untested)
    Tex.DrawTile(0,0,Tex.USize,Tex.VSize,0,0,16,16,FinalBlend'DreamTex.Lightfilter',talpha);

}



DefaultProperties
{
     bAffectSpectators=true
     bAffectPlayers=true
     RemoteRole=ROLE_SimulatedProxy
     bAlwaysRelevant=true
     FriendlyName=&quot;Bloom&quot;
     Description=&quot;Adds Bloom to the gameplay.&quot;
}
&lt;/uscript&gt;

This mutator creates an interaction, which i'll discuss later. Additionally a simple rectangle mesh is spawned. The only spcial thing aboput this mesh is, that its UV-Coordinates do not cover the whole range, but only a horizontal 4:3 part of it. It took some time to figure out that a mesh with a full UV-Range will squeeze the bloom. 

This mutator also is responsible for rendering the ScriptedTexture which is uses as the material for the FinalBlend which is in turn the skin of the bloom mesh. 

The basic idea is to render the whole frame again into the ScriptedTexture and then filter the bright parts with a FinalBlend (FB_Darken). But that just the first part. 

&lt;uscript&gt;
//-----------------------------------------------------------
// Renders the bloom-mesh several times to create a blur effect
//-----------------------------------------------------------
class BloomInteraction extends Interaction;

var ScriptedTexture St;
var Actor BMesh;
var float dist;
var float fov;
var float dev;
var bool bEnableBloom,bXBloom;
var float devX;
var vector CamPos,X,Y,Z;
var Rotator CamRot;

event NotifyLevelChange()
{
        Master.RemoveInteraction(self);
        assert( St != None );
        ViewportOwner.Actor.Level.ObjectPool.FreeObject( St );

    //  (destroy any actors spawned by this interaction)
    //  (clean up any uscript objects that have been loaded)
}

function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{

    if ((Key == IK_PageUp) &amp;&amp; (Action == IST_Release)) devX+=0.25;
    if ((Key == IK_PageDown) &amp;&amp; (Action == IST_Release) &amp;&amp; (devX&gt;0)) devX-=0.25;
    if ((Key == IK_Home) &amp;&amp; (Action == IST_Release))bEnableBloom=!bEnableBloom;
    if ((Key == IK_End) &amp;&amp; (Action == IST_Release))bXBloom=!bXBloom;
    if ((Key == IK_Insert) &amp;&amp; (Action == IST_Release)) dev+=0.05;
    if ((Key == IK_Delete) &amp;&amp; (Action == IST_Release) &amp;&amp; (dev&gt;0)) dev-=0.05;
    log(&quot;dev&quot;);
    log(dev);
}

//not used currently
function RenderBloomLayer(Canvas c, float devX, float mZ, float mY, float dev)
{
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(mZ*Z+mY*Y)*dev);
    C.DrawActor(bMesh,false,true);
}

function PostRender(canvas Canvas)
{


    local Font UsedFont;
    if(!bEnableBloom)return;
	if(UsedFont==None){
        UsedFont = Font(DynamicLoadObject(&quot;SECFonts.Arial&quot;, class'Font'));
    }
	Canvas.Font = UsedFont;
	Canvas.FontScaleX = 1;
	Canvas.FontScaleY = 1;
    Canvas.Style=ViewportOwner.Actor.ERenderStyle.STY_Normal;


    Canvas.DrawColor.R=255;
    Canvas.DrawColor.G=255;
    Canvas.DrawColor.B=255;
    //calc this frame
    st.Revision++;

    Canvas.GetCameraLocation(campos,camrot);


    bMesh.SetRotation(camrot);
    ViewportOwner.Actor.GetAxes(camrot,X,Y,Z);

    //moved to init
    //FinalBlend(bMesh.Skins[0]).Material=st;


    Canvas.SetPos(10,240);




    if(!bXBloom)
    {
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+Z*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)-Z*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+Y*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)-Y*dev);
    Canvas.DrawActor(bMesh,false,true);
    Canvas.DrawText(&quot;XBloom&quot;);
    }
    else
    {
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(Z+Y)*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(-Z+Y)*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(-X-Y)*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(-Y+Z)*dev);
    Canvas.DrawActor(bMesh,false,true);
    Canvas.DrawText(&quot;DoubleBloom&quot;);
    }

    Canvas.SetPos(10,200);
    Canvas.DrawText(&quot;Bloom Active&quot;);

    //innerglow

    if(!bXBloom)
    {
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+Z*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)-Z*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+Y*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)-Y*dev/2);
    Canvas.DrawActor(bMesh,false,true);

    }
    else
    {
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(Z+Y)*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(-Z+Y)*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(-Y-Z)*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(-Y+Z)*dev/2);
    Canvas.DrawActor(bMesh,false,true);

    }
}

DefaultProperties
{
    bVisible=true
    bActive=true
    dist=40
    fov=90
    dev=0.28
    devX=1.6
    bEnableBloom=true
    bXBloom=false
}
&lt;/uscript&gt;

Well, as it says, it renders the mesh at different positions to create a blur effect. The &quot;Dev&quot;-Property will just move the mesh the blur along the axis of the screen, while &quot;DevX&quot; will create a perspective-blur. 

This is the BloomMesh-class:

&lt;uscript&gt;
class BloomMesh extends Actor;

DefaultProperties
{
    DrawType =              DT_StaticMesh
    StaticMesh =            StaticMesh'DreamStat.BlurMesh'
    bUnlit =                true
    bStatic =               false
    bAlwaysRelevant =       true
    bNoDelete =             false
    bHardAttach =           true
    bHidden=                true
    Skins[0]=               FinalBlend'DreamTex.BloomFB'
    DrawScale =             1;
    bAcceptsProjectors =    false;
    RemoteRole =            ROLE_None;
}
&lt;/uscript&gt;

The Material &quot;BloomFB&quot; is a FinalBlend with FB_Brighten, but no material assigned to it, this is done in the code. &quot;Lightfilter&quot; is a Finalblend with FB_Darken an a pure white, or bright gray texture assigned to it.

==Notes==

Recently I had the idea to use the BloomMesh for both filtering the lights and for the bloom-effect itself. Maybe this could solve the terrain, banding and overlit problems, as no redundant RGB data is stored in the texture. This method would apply the Lightfilter to the BloomMesh and not to the ScriptedTexture itself,  as long as RenderTexture is called, after this, the material is switched back to BloomFB.

For larger mods, or TC's this could be made map, or even zone-dependant, to create individual effects. It could be even possibly to create distant-dependant bloom-effects, by changing the zone fog values to a near black before rendering and applying the scripted texture several times. 

Objects nearer at the camera can receive a larger glow than objects more away.

I'm honestly not the one who is made to understand UScript-Replication, so if you see any issues that make my code network-incompatible, please let me know here.

===Problems===

Sometimes, a ScriptedTexture does not render ParticleSystems correctly, displaying them boxes. Maybe this is an  Z-Buffer Issue, or, the ScriptedTexture does not like certain Rendertypes of Particles, Subtractive, f.i.

It seems, a scripted Texture renders Terrain completely different as normally, making terrain extremely blurry with the bloom-effect.

Because the ScriptedTexture, rendering all the level again(and filtering the bright parts), has to be applied several times on canvas, dealing a hard punch on the framerate.

Actors, that are rendered via PostRender/DrawOverlay calls, are not visible for any calls of DrawPortal, of course. They still show up when the bloom is active, but they become transparent. I think i can solve this problem by creating a 'real' actor, giving it the same mesh/animation as the desired 1stPV-Actor(most commonly weapons models) 

==Comments==

'''j3rky:''' Interesting idea, and the screenshot looks promising... i'd like to see some code snippets :)

'''MythOpus:''' Looks rather beautiful.  Good Job! :tup:

'''El Muerte:''' looks nice, but, is it worth it ?

'''Jarronis, The Vampiric Unicorn:''' Well, if you have around 80FPS and you don't know where to put them, why not? Of course, my hardware isn't good enough to manage this, but i'm working on a 'light versions' too. 

'''Foxpaw:''' Hmm, I like the way that looks. It's almost like high dynamic range lighting.

'''DJPaul:''' Can I/we get the code for this?  It'll be useful for a project that I am working on.

'''Jarronis, The Vampiric Unicorn:''' Of course, i'll make this open source, once i cleaned up the code, and added enough configurable properties. 

'''j3rky:''' Actually, I think it would be more usefull to see some code that doesn't feature a lot of extras. That way the basic idea behind the implementation becomes more obvious. It shouldn't be your goal to provide a working does-it-all library - that's something the individual programmer can and should do.

'''Foxpaw:''' I'm finding it somewhat difficult to understand how this works from your code. What is the code for the BloomMesh class? It apparently must have some as it has something in it's Skins array which doesn't appear to be put there by the interaction or the mutator.

As best I can tell, you render the world onto your scripted texture, then LightFilter is drawn on top of it. Lightfilter I'm guessing is an all-white texture, so since it has FB_Darken, and is drawn mostly opaque, all but the most brightly lit parts of the scripted texture will be wiped out and made completely black.

Then, you draw the mostly-black-but-dim-in-areas-that-should-get-brightened mesh with FB_Brighten, to brighten only the areas that remain on the scriptedtexture. The mesh appears to be drawn several times with slight offsets, which I'm guessing is so that instead of directly brightening only the brighter areas, (with hard edges) the bloommesh is shifted around to make the lightening &quot;spill over&quot; onto nearby areas.

Is that correct? The BloomMesh class is missing and of course there's little information on what the materials used contain, so I'm guessing at how it works.

'''Graphik:''' I'm drooling. Added this to [[Legacy:Featured Pages|Featured Pages]].

'''El Muerte:''' A little note: never use the &lt;code&gt;assert()&lt;/code&gt; function. It will trigger an engine shutdown when the expression is false. UnrealScript should never do this. 

'''Jarronis, The Vampiric Unicorn:''' Of course, i wouldn't do that normally, but interactions sometimes show strange behavior when handling Null-Objects. Sometimes they tend to crash anyway if you even attempt to check if they are &quot;None&quot; with an if expression. 

Foxpaw is right concerning how the code works. The BloomMesh(derived from Actor) class has no code, just some defaultproperties, that make sure this thing isn't replicated, unlit, etc. It's Skin is a predefined FinalBlend with FB_Brighten, but no Material assigned, because i'm doing that in the code.

I'll add Material descriptions and the missing class later, of course.

'''Tarquin:''' This is now on [[Legacy:Featured Pages|Featured Pages]] &amp;ndash; so could we bring it out of walled garden space please and into the main project namespace? Thanks :)

'''DJPaul:''' The BloomMesh is client-side only, I presume?  Also, have you made any progress fixing this from a first person view?  And whilst I plan to add this to my project in the next few days, is there any chance of screenshots that demonstrate the transparent-meshes-whilst-in-first-person so that I can appreciate how distracting this effect is a s a signifcant part of my mod is first-person.

'''Foxpaw:''' Unfortunately, I don't see how the first-person could be fixed without resorting to a hack. The issue is that the first person weapon is not drawn in DrawPortal because it is not drawn normally as part of the world - it is itself drawn in PostRender(). So, it would be more accurate to say that your first person weapon is like a part of the HUD, rather than being a part of the world.

This can be solved, as Jarronis mentioned, by having the first person weapon be part of the world. However, that of course is going to be a hack and won't work for mods that use something different for their first person weapons. It would also involve replacing some other classes, which would be somewhat invasive and prone to incompatibilities with other mods.

You might be able to work around it by copying the same code that draws the weapon onto the canvas, to have the weapon itself drawn onto the scriptedtexture after drawing the world onto it. However, now that I think about it some more, the bloommesh should be getting drawn beneath the weapon, and so should not be visible over top of it, so maybe the cause is soemthing different from what I was thinking. Hrmm. I'll see if I can get this working and see if I can figure out what's going on there.

Also, what mesh did you use for the bloommesh, or did you create your own? Also, does the bloommesh compensate in any way for different resolutions (and hence, different aspect ratios on the monitor) or different POV settings? If not it seems like it might look funny when zoomed in on the sniper rifle, for example.

'''Jarronis, The Vampiric Unicorn:''' I created my own mesh, though it is nothing more than a rectangle with an 4:3, so it should work on resolution that have the same ratio. Not that the UV-Coords must be map in the same way, this means, not the whole UV-&quot;Square&quot; but the biggest 4:3 part of it.

As long as you zoom in(decreasing the FOV), everything is just fine, because the mesh floats in front of the camera as a virtual canvas. Increasing FOV will make the bordes become visible.

Drawing the weapon directly onto the ScriptedTexture is not possible i think, because ScriptedTextures unfortunately don't have a DrawActor-Function. As said, another solution can be an actor that has the same Mesh, Animation und position like the FPV-Weapon, but this one is only visible during the RenderTexture event of the texture. So, copying code from the Postrender/DrawOverlay-Function might be a good idea for determining the position, the rest must be done via animation-replication. 

In general, i would suggest mod-authors to modify the code, as is fit to them, such as implenting the routines in a HUD instead of Interaction, which always draws ontop of the HUD.

'''DJPaul:''' I've been away too long to remember how these functions interact and how things are rendered; for simplicity's sake, on my part, I think I will wait to see if anyone comes up with a fix for this and otherwise leave it out of my code.

'''Foxpaw:''' Hrmm, I tried the code above, substituting in a mesh of my own and making the appropriate materials, but the effect I get isn't as nice. The &quot;bloom&quot; effect has visible contours on my setup, like the kind you get when you convert a colorful image to 256 color palettized. Is there any other settings you changed on the materials that are pertinent to making the effect look good?

'''Foxpaw:''' Actually it looks like I spoke too soon. It only does that in my mod. In UT2004 it doesn't do that. Wierd. (Actually, I would speculate that it probrably still exists in UT2004, but UT2004 doesn't have the same smooth gradient background that would make such an effect noticeable. Hmmm.

Also it should be mentioned that the bloommesh has to have bHidden=true, otherwise it will look wierd when moving - because otherwise the bloommesh from the last frame gets rendered onto the scriptedtexture.

Also I see what is going on with the weapons. My initial speculation was correct. Your bloommesh is getting drawn after the weapon, so it gets drawn on top of it. This causes it to appear &quot;translucent&quot; when in reality a translucent version of the world is being applied to it. I believe this because it seems logical and the transparency is greater over brighter objects, which would be the objects doing more brightening on the bloommesh. The least invasive workaround would be to draw the weapon on after drawing the bloommesh - so it would end up getting drawn twice, which is less than ideal but that way you don't have to have a custom controller or anything to work around it.

'''DJPaul:''' What sort of function would you use for that?  HUD.Postrender/DrawOverlay as was mentioned in Jarronis' post above?

'''Foxpaw:''' PostRender. The exact same place as the bloommesh is drawn in - just draw it after drawing the bloommesh. This won't prevent the first drawing, but then you can draw over the &quot;translucent&quot; version with a new one that won't have the bloommesh on top of it. This may look a bit strange for weapons with transparent bits, though, I haven't tried.

Also, I haven't had any problems with emitters, like you had Jarronis. I had them at first, but setting bHidden to true on the bloommesh fixed them.

'''DJPaul:''' It would be appreciated if someone would upload the missing class that is mentioned, and the bloomesh  as I cannot model anything.  Thanks.

'''Foxpaw:''' Also I found a line that I think is a typo. One of the bloom offset thingies references X, when I think you meant to type Z.

The comment about zooming in with the sniper rifle is, the &quot;zoom&quot; on the sniper rifle does not affect the location of the camera - it alters the FOV. However, I tried that and it doesn't seem to hurt anything when the FOV is tightened. I did notice that the overlay when zooming in with the lightning gun ends up being very bright, but again, there's not much that can be done about that.

I've also noticed some glitchy behaviour when moving with the bloom on - sometimes the apparent light level makes a sudden shift. I'm guessing that this is related to the &quot;deviation&quot; of the glow.

Okay, I'm also changing my stance on the emitters again - Emitters seem fine, but some xEmitters seem to have a kind of square around them. This is probrably simply an imperfect texture, and the imperfection is amplified. (Most modulated textures, for example, start to look wierd if you put a lot of them on top of each other.)

Also, it turns out my speculation was right in that UT2004 does suffer from the same issue of looking like an indexed image, it's just not as noticeable because there isn't much in the way of color gradients. However, I did notice a color gradient (the sky in DM-Antalus) and it had the same &quot;banding&quot; issue.

Also, I've noticed that the bloom effect varies a lot on different levels. I don't really know if anything can be done about that as it is likely related to the level's general brightness. For instance, in DM-Antalus it's very bright, kind of overdone-looking. However, on DM-TrainingDay, it's barely visible. (Except for some wierd artifacts visible out the windows.) On ONS-Torlan, the distance fog is lit up like a Christmas tree.

Also, I optimized the code in the interaction slightly, which may also increase readability somewhat. Here's what I changed it to:

&lt;uscript&gt;
function PostRender(canvas Canvas)
{
  local vector BaseDisplacement;
  
  if (!bEnableBloom)
    return;

  st.Revision++;

  Canvas.Reset();
  Canvas.GetCameraLocation(campos,camrot);

  BMesh.SetRotation(Rot(0,0,-16384) CoordRot Camrot);
  BMesh.GetAxes(Camrot,X,Y,Z);

  BaseDisplacement = CamPos + (dist-devX) * vector(CamRot);
  Y *= dev;
  Z *= dev;
    
  if(!bXBloom)
  {
    bMesh.SetLocation(BaseDisplacement+Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Z);
  }
  else
  {
    bMesh.SetLocation(BaseDisplacement+Z+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)-Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Y)+Z);
  }


  BaseDisplacement = CamPos + (Dist-(DevX/2))*Vector(CamRot);
  Y *= 0.5;
  Z *= 0.5;

  if(!bXBloom)
  {
    bMesh.SetLocation(BaseDisplacement+Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Y);
    Canvas.DrawActor(bMesh,false,true);
  }
  else
  {
    bMesh.SetLocation(BaseDisplacement+Z+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)-Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Y)+Z);
    Canvas.DrawActor(bMesh,false,true);
  }
}
&lt;/uscript&gt;

'''Graphik:''' See tarquin's comment above. May I please move this to a public page (a subpage of [[Legacy:Lighting|Lighting]] perhaps) rather than your personal page?

'''Jarronis, The Vampiric Unicorn:''' Of course move it into project name space, or into [[Legacy:Lighting|Lighting]] as you desire.

Thank you, Foxpaw, for the typo. I mixed them up before, so i probably just forgot to change that. 

I noticed the color-banding and overlit issue too, if you you look close to screenshots you can see them there too. That's why i mentionend that especially talpha(the light treshold) cannot be the same maps. Dark maps can handle a lower talpha, resulting in brighter bloom-maps, but especially outdoor maps are overlit easily, so the threshhold must be higher. 

A general problem is that FB_Darken don't work that i want too, i think. It seems that the textures stores kind of 'negative' RGB-Values. So when you add them up, by drawing them ontop of each other several times, the colors that should be 'zero' show up again. That's also where the banding-effect takes place. 

'''Jarronis, The Vampiric Unicorn:''' I found a hack for the FPV Problem. Just add &lt;code&gt;ViewportOwner.Actor.Pawn.Weapon.RenderOverlays(Canvas);&lt;/code&gt; at the end of the posternder - routine of the interaction. This will prevent the weapon becoming translucent. However, the weapon still won't be included into the bloom-lighting. I tried to set the weapons bHidden to false, when calling RenderTexture, because everytime RenderOverlay is called, the weapon's Rotation/Location is recalculated and drawn directly. In theory, when calling RenderOverlay in the interaction(although is shouldn't be necessary because the HUD already did it the same frame), setting bHidden to false, and then rendering the texture, the weapon should be visible in the bloom layer.

My result was that the weapon actually shows up but in a wrong position. For some strange reasons, the weapons position seems to be reset, after RenderOverlay has been called.

'''Graphik:''' Moved.

'''Jarronis, The Vampiric Unicorn:'''Thank you. I found the problem. I was wrong, the position stays same, but the FPV-Weapons are drawn at a different FOV, which is weird for my purpose.

I tried it with this:

&lt;uscript&gt;
event RenderTexture(ScriptedTexture Tex)
{
    local PlayerController PC;
    local vector camloc;
    local Rotator camrot;
    local Actor camactor;
    local Color tAlpha;



    talpha.R=238;
    talpha.G=238;
    talpha.B=238;


    PC = Level.GetLocalPlayerController();
    PC.PlayerCalcView(camactor,camloc,camrot);
    //log(&quot;RenderEvent&quot;);
    //make weapons visible
    PC.Pawn.Weapon.bHidden=false;
    Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,camactor,camloc,camrot,PC.DefaultFOV,false);
    //Lightfilter is a FinalBlend with FB_Darken
    //The Light-threshold is controlled via talpha;
    //Colored Bloom should be possible with unequal RGB values (untested)
    Tex.DrawTile(0,0,Tex.USize,Tex.VSize,0,0,16,16,FinalBlend'DreamTex.Lightfilter',talpha);
    //hide weapon
    PC.Pawn.Weapon.bHidden=true;

}
&lt;/uscript&gt;

It works just fine, except when the weapon-bloom disappears when you are too close to a wall, because of the z-buffer, but that's another problem. Well, in the RenderOverlay-function, DrawActor is called with a weapon-specific FOV which lies around 60 to 70. Well, Standard-Player-FOV is around 90, and that's the whole problem. So mod-makers: Match you FPV-Weapon's FOV to the Player-FOV and it will work fine.

'''Foxpaw:''' Did some more experimentation today. I was noticing a slight glitchiness, but when you posted your BloomMesh I thought I'd compare it to mine to see if there was any differences. I had forgotten to make mine bUnlit. This resolved some glitchiness with the apparent amount of bloom varying at different areas in the level.

I had an idea regarding the banding but it was a no-go. I was thinking to myself. I thought, &quot;It looks like what you get when you convert a 24 bit color image to 8-bit palletized.&quot; I responded by thinking, &quot;maybe that's because the color compression of the scripted texture is 8-bit palletized, seing as how that's the default compression type.&quot; I deftly replied with &quot;Holy Compression Batman, you're right!&quot;, while doing my best mental impression of err. that guy that played batman.

Long story short, I changed the texture compression type, I tried a bunch of the options, but it didn't fix the banding. It seems like that might be a piece of the puzzle though, so to speak.

I'm also a little unclear on what exactly you are planning with the lightfilter in your recent edit. Do you mean as in, putting the lightmap on the scripted texture, making it visible, then doing DrawPortal again with the filter over top?

'''Jarronis, The Vampiric Unicorn:''' I used this code as an alternative RenderTexture:

&lt;uscript&gt;
    PC = Level.GetLocalPlayerController();
    PC.PlayerCalcView(camactor,camloc,camrot);
    bMesh.bHidden=false;
    bMesh.Skins[0]=FinalBlend'DreamTex.Lightfilter';
    Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,camactor,camloc,camrot,PC.DefaultFOV,false);
    bMesh.Skins[0]=FinalBlend'DreamTex.BloomFB';
    FinalBlend(bMesh.Skins[0]).Material=st;
    bMesh.bHidden=true;
&lt;/uscript&gt;

Unfortunately it didn't work. It seems that DrawPortal has problems with rendering FinalBlends. 

I don't think that the band-problem can be resolved completely. Because all colors are added up more or less, the difference between to colors become greater.

'''Foxpaw:''' Hrm.. That actually worked fairly well on my mod. The sun was nicely brightened as was my white spacecraft, but the nebula background wasn't all bandy. It doesn't seem to work well in UT2004 though. I have to go to class now, but I'll experiment more when I return.

'''Jarronis, The Vampiric Unicorn:''' Cool. Let me know if you got it working in UT2004, unless i don't get it. This solution don't creates redundant RGB-Data, which add up and create the banding-effect. 

It think it might be a z-buffer issue, because if Standard-UT2004 clears the z-buffer while rendering the HUD.

When you use this solution you should'nt use a pure white texture, because then the FB would suctract everything, all light gray should do the trick, but i guess you already figured this out.

'''Mosquito:''' could this effect be intensified, sorta like the blur effect in farcry? If it causes such a performance hit, it could just be a hit effect or a shell effect.

'''Jarronis, The Vampiric Unicorn:''' Variations of this effect are nearly limitless. You can play with different Blendmodes, Filters and offsets to achieve different effects.

'''Foxpaw:''' Actually, I was using an all-white texture. Now I know why the scriptedtexture was ending up completely black in UT2004. ;)

However, there's a new problem posed by using this method. Because you are using something that exists in world space as your light filter, it can get clipped by other objects. That means that if you are really close to some grass or something, the grass doesn't get filtered and as such is blindingly bright. This turned out to be why my mod was working.. because my entire ship was between the clipping plane and the bloom mesh. This problem should be fixable by simply reducing the drawscale of the bloommesh and moving it closer to the camera, until it's right next to the clipping plane.

However, erm... All of that is fairly irrelevant, as now that I got it working using the bloommesh as a light filter, it still has the banding. :(

I did get a strange insight though - the darkening light filter doesn't appear to actually push all pixels down a set amount (thus causing anything below a certain threshold to bottom out at 0, as one would think.) I set the scriptedtexture's FinalBlend to FB_Overwrite instead of FB_Brighten, and noticed that, while the scriptedtexture is darker than the scene, it still seems to have all of the same detail, even at very high &quot;light thresholds.&quot; I now believe that the entire scene is being patterned around when the bloommesh is drawn, but is 'most noticeable' around brighter objects, as they cause the most brightening. I think we need to find a new way of filtering out the bright parts, but I'm not sure how we can go about doing that. It's possible but unlikely that the CO_Subtract of a combiner would behave the way we though that FB_Darken was. Maybe that's worth a try.

Curses, now you've got me thinking about all kinds of things I might try with these filtering techniques. Previously I couldn't think of any way to implement a pixel-shader-esque effect like this in UScript because I didn't know of any way to get color data of pixels - now that I see how you've done this the possibilities seem endless. Hrmm.

And Mosquito, I've already nicknamed the bloom effect, &quot;drunken mode&quot; or &quot;hangover mode&quot; because I have the blur and the light threshold fairly high. ;) The effect at high levels of dev is quite comparable to far cry's hit effect.

'''Foxpaw:''' Using Combiners for any texture math is probrably a good idea regardless as they are handled by the video card and will somewhat reduce the speed penalty.

But erm... Combiners apparently do have different behaviour on their subtract than does Darken. But, err.. it appears that large subtractions (subtracting 240 for instance) actually produces a 'negative' of the view.

'''Foxpaw:''' Scratch that. Apparently CO_Subtract subtracts the FIRST material from the SECOND, so the order is reversed. No more negatives ;)

'''Jarronis, The Vampiric Unicorn:''' If you want to know, what a &quot;drunken&quot; effect is, combine bloom with motionblur...

I had the same idea on using a combiner, but i wasn't sure about it, because a Combiner demands at least one constant texture. Using combiners also produces more 'overhead', it think, because the materials have more complex hierarchy.

By the way, this &quot;project&quot; just was meant to be hobby-coding-project from me, and now it turned this large thing... I'm drooling....

'''Foxpaw:''' Err, well, you see, using Combiners actually produces drastically less overhead. To make a long story short, the overhead of combining the LightFilter and the scriptedtexture is effectively trivial. The transformation is reliably predictable, so the video card can be fed a little program that executes very quickly on purpose built hardware (the shader pipeline) instead of interpreting instructions and blitting textures in RAM.

Plus the Combiner method actually does the filtering we want, completely wiping out any light below a certain threshold. :D

However, we have a new problem: Now that we have something that's actually subtracting 238 from each pixel and bottoming out at 0, even the brightest of bright things is now only a brightness of 17, which is pretty dim. So now, I can't even see the bloom effect. (Though if I set the finalblend to FB_Overwrite I can see that it's there.) We now need a way to increase the brightness of non-zero pixels without increasing the brightness of zero pixels. Unfortunately, CO_Multiply won't work, as it interprets 255 as 1.0 and everything less as some fraction. We could just draw the additive texture a bunch of times, but that's probrably not the ideal solution. Any ideas on how we can control the brightness of the bloom effect, without changing the lightfilter?

'''Foxpaw:''' Another idea, we might be able to get better control over the effects and reduce the performance hit to almost nothing if we can find a way to prevent the world from being rendered by default, and then drawing our DrawPortal result + the Bloom effect as FB_Overwrite. Highly modified TCs like mine might be able to do this as I can have the playercontroller reside in a box way out in the middle of nowhere so everything will be occluded, and then have the playercontroller basically &quot;watch TV&quot; which would be the DrawPortal taken from the Pawn's first person view. However, that won't work for any mod using UT2004s default Pawn behaviour.

'''Jarronis, The Vampiric Unicorn:''' We could reverse the texture using another combiner, then multiply, and then reverse again... &quot;negative multiplication.&quot;

'''Foxpaw:''' Hrrmmm. I don't think that will work. If we take the negative of the texture using another combiner, the 0s become 255s, which will then get multiplied by some fraction, so when we take the negative again, they won't be zeros anymore..

'''Foxpaw:''' Err.. hemm. I've hit a brick wall. Apparently, the Unreal Engine doesn't like certain combinations of Materials. If I put the scriptedtexture directly into a finalblend I can use FB_Brighten with no problems. If I put it into a combiner with CO_Subtract, then put that into a final blend, all the blend modes ''except'' for FB_Brighten and FB_Darken work. I tried to get around this by simply using DrawTile to put the Combiner onto a second scriptedtexture, but that seems to cause GPFs.

FB_Translucent does work, but it's not quite the same effect. I've tried using a combiner to add the combiner to the original st, and then displaying that with FB_Overwrite, which works, but there doesn't appear to be any way to get the &quot;blur&quot; effect, which is of course essential, otherwise it just makes the bright areas look washed out. I tried just using a ton of combiners and TexOscillators to get the blur effect, but that just gave me the default texture, which says to me that the maximum length of a shader program has been reached. (255 lines in Shader Model 2.0, which is what UnrealEngine2 uses.)

So, I'm somewhat at a loss for what to do there. The FB_Brighten is important to get the desired effect. FB_Translucent gives hard edges and some of the detail on the light for instance (detail textures and such) spill over onto the &quot;glow&quot; area.

'''Foxpaw:''' Blech. I had an idea to work around the previous issue by taking another DrawPortal of the partially filtered image.. but that didn't work out. It appeared to be working, but it turns out that only the coronas were working because the coronas take time to fade out and so were getting in the frame unintentionally.

'''Jarronis, The Vampiric Unicorn:''' Eureka, i got the Combiner working by turning on Modulate2X and Modulate4X. The effect is certainly there even with FB_Brighten, but it is quite dim. 

'''Jarronis, The Vampiric Unicorn:''' Hm, strike that maybe, i'm not sure if it was this, or some other changes in the code, that made it running.

'''Tarquin:''' it's best to generall avoid subpages. 'Bloom' is a perfectly good title &amp;ndash; 'lighting bloom' or 'bloom effect' if you guys think that's better. Could someone with a decent text editor please promote all the headings by one level? thanks :)

'''DJPaul:''' Clever chaps, if I implement this code as is from the top of the page, if you come up with any changes to improve it or fix issues, will I end up ripping it all out or will it most likely be a change of just one class?  I'm deciding whether to implement it now or put it in later.

'''Foxpaw:''' The current system I've been using is quite different from the original code, but the original code is enough to see how it is done. The original code used a finalblend with FB_Darken, which doesn't work the way we expected, and produced bands of color on areas that should have had smooth contours. The Combiner method I've used so far didn't seem to be working, and a slightly different method &quot;worked&quot; but made the colors look washed out. So, I'm still experimenting.

I'll try playing around with Modulate2X and Modulate4X. I don't see why that would make any difference to the not drawing, but it might be useful anyway. The UDN says that it only works with CO_Multiply, and makes the result brighter. So, we may be able to multiply the filtered out light with a straight white texture and Modulate4X to make it brighter. I'll give it a shot.

'''Jarronis, The Vampiric Unicorn:''' I'm currently cleaning up my code, so i can make an demonstration mutator. In case major spread is desired, someone should upload this to an official mirror, because my ISP's have limited bandwith.

'''Foxpaw:''' Modulate2X and Modulate4X was perfect for increasing the brightness of the filtered image, but I still can get it to actually draw onto the screen. Turns out that the problem I was having before that I attributed to the max shader length being reached was actually due to something else - I was using a ConstantColor material instead of a white bitmap, and mistakenly assumed that a ConstantColor still counted as a constant bitmap material. Now that I've fixed that I got a stage further, but FB_Brighten still doesn't seem to want to work. FB_Darken works though, so I'm left wondering if this is some bizarre behaviour of FB_Brighten (as in, remember how FB_Darken didn't actually directly subtract RGB values like we thought? Maybe FB_Brighten is doing something funny that's making it impossible to see.)

Did you get your working using a combiner for the filter? If so I'd be interested to see where your code differs from mine.

'''Foxpaw:''' Huzzah! FinalBlend wouldn't draw FB_Brighten for me but using a Shader with OB_Brighten seems to. Now I'll see if I can tweak the dev and such to get the desired effect.

'''Jarronis, The Vampiric Unicorn:''' Yeah, i got it working with a combiner(and without a shader). Well maybe your bitmap is just to bright, did you try a darker one?

'''Foxpaw:''' Well, when you upload the demo mutator I'll see how that effect compares to the one I got. The final effect that I got with the combiner and shader seems technically correct but looks a little exact for my liking, so I'm eager to see what you came up with.

'''Jarronis, The Vampiric Unicorn:''' Well, used both approaches. The brighter one(which formerly uses only the FB) i called PowerBloom, but it also used the combiner with a black texture, which should make no difference, than using the FB alone. For a strange reason, the combiner eliminated all particle-errors, even if used with the pure black texture. 

The other method used the combiner with a very light gray, which makes a more &quot;selective&quot; bloom.

I'd plan to implement a configuration menu for the mutator, where you can choose which method shall be used, along other options.

'''Foxpaw:''' I'm confused. You used only the FinalBlend, no combiners? How did you get rid of the banding?

'''Jarronis, The Vampiric Unicorn:''' Of course i used combiners, but, when using PowerBloom, they are &quot;disabled&quot;, by using a black texture. Yet, PowerBloom should only be used on maps where the banding-effect is not clearly visible, as DM-CBP2-Achilles (as in the screenshots.)

'''Foxpaw:''' So.. err, if you use a black texture with the combiner, no filtering would take place at all, so wouldn't you then end up with just a really blurry and very bright view?

'''Jarronis, The Vampiric Unicorn:''' Yeah, but i still used the old Lightfilter on the ScriptedTexture too, so the bloom does not look &quot;capped&quot;. So by using the both techniques it's a matter of the right individual settings for each map to look good.

'''T1:''' Up there it says something about needing a lens for a lens flare. It's true you can't see lens flares with the naked eye, but eyes still have lenses, so that's kind of inaccurate. Sorry for being nitpicky.

'''Foxpaw:''' Fixed. :D

'''Graphik:''' Glad you added a link to a demo mutator, but why so hidden in the page?

'''Jarronis, The Vampiric Unicorn:''' Well, i didn't want it to post here in the comment area...

'''Foxpaw:''' Hmm. I like the demonstration mutator, though it looks a lot like the initial finalblend method you posted up here. The mutator still has the &quot;see-through&quot; weapons and has the banding, even with the &quot;power bloom&quot; turned off.

As best I can tell, any FinalBlend using FB_Darken is going to cause that banding, as FB_Darken appears to do more of a division instead of a subtraction. This results in rounding making similar colors appear to be the same color. Maybe the banding could be fixed by hiding the skybox when you do the DrawPortal, that might cause HOMs, but it might not. Skyboxes seem to be the area where the banding is most noticeable as they often have smooth color gradients.

Also the bloommesh doesn't adjust for different aspect ratios. This is ''probrably'' easy to accomplish, as I think that the Canvas has a function to get the resolution of the screen, so it'd be something like BloomMesh.SetDrawScale3D( Canvas.SizeX / 800, Canvas.SizeY / 600, 1 ); or something very similar. 800x600 is of course, only an example resolution, I don't know what resolution you designed it for.

Also I noticed with the PowerBloom off the terrain gets all blotchy. (I noticed this with my own experimentations as well.) Maybe you could keep a linked list of terraininfos and make them all bHidden before doing the drawportal? That might cause HOMs or other undesireable behaviour though, but it's a shot.

Except for the terrain issue and the banding in the skybox though, I think the bloom is very cool.

'''Jarronis, The Vampiric Unicorn:''' Thanks. Hm, i think i can solve the transluent weapon problem, by disabling general HUD-Rendering and then use the interaction to call the HUD's PostRender() function. The Mesh was designed 1024*768.

'''Mosquito:''' With powerbloom it seems to had a level of desaturation and realism to the image, and the unsual effect on the terrain is actually very interesting, Could it could be recreated to create a kind of [http://www.cs.wisc.edu/graphics/Gallery/NPRQuake/ NPR] (Non-PhotoRealistic Rendering) effect?

'''Jarronis, The Vampiric Unicorn:''' Interresting idea. I'm sure, NPR could be done this way. But i think the (usually) terrain issue is a bug of the DrawPortal-function of ScriptedTexture. Maybe it will be fixed in an future patch.

'''Foxpaw:''' The stuff on that NPR quake example would probrably be a little trickier to do. Pretty much all three methods rely on drawing things in wireframe mode (though with occlusion) and then tweaking the way that the wireframes are drawn. You might be able to do something like that with materials, but I'm not sure if you'd be able to do it on-the-fly like this, primarily as I don't know any way that you could get both wireframes drawn and still have proper z-buffering. The rendering methods used there look relatively simple to do, if you had access to the renderer, but unfortunately we don't. It might be possible to do that if you had the native headers.

Not that I'm saying for sure that it's not possible, as it's always possible that someone might come up with a clever scheme to get a visual effect without accessing the renderer directly. (as was done here.)

'''T1:''' Is there anyway to make it so that those screenshots need a link to open up, here on 56k I hate to wait for them to load.

'''Graphik:''' The majority have broadband and would likely prefer things as they are. If you have a 56k you're going to be doing a lot of waiting. Get used to it. ;)

'''Tarquin:''' you could feasibly crop the screenshots to show just a portion of the image.  would say about 300x300 pixels, and perhaps glue the before / after images side by side. The big advantage of this page not being a subpage any more is that we can make a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Screenshots]] page. :) I'll repeat my request for the heading levels to be corrected :)

'''T1:''' Thanks.

'''Graphik:''' Heading levels corrected.

'''Uncommon:''' The download link seems broken.

'''Wormbo:''' Works fine for me.

'''Uncommon:''' Ah, I see. My downloads window was in back, and the link also took me to an incomplete-looking page, so I got confused. Cool effects :)  I'm kind of surprised how little impact the motion blur has on performance.

'''OlympusMons:''' Havent read all of this, is it all relevant could use a [[:Category:Legacy Refactor Me]]

'''Moron:''' This is pretty good, I use a setting of 20 for the threshold and turn on the power bloom (it has nasty FX on the terrain for me otherwise). The only problem is that it seems to blur the terrain layers, regardless of whether whether they are bright or not. Has there been a fix for this yet (I'm not a coder, I only downloaded the mutator) or is it not possible?

'''Jan:''' Is there an alternate download?

'''SuperApe:''' Added category custom class tag.  The download link is broken. (&quot;404 page not found&quot;)  It looks like we'd only need some specific info on the BloomMesh and DreamTex to reproduce the latest version.  On [http://wiki.beyondunreal.com/wiki/Jarronis,_The_Vampiric_Unicorn Jarronis' page], it's mentioned the BloomMesh is a rectangle, so I assume a plane mesh.  It would be nice to see a download of the latest version.  This effect sure looks like what is being done in the next gen games; all the launch titles for XBox360 seems to have this effect (Call of Duty2, Quake4, Killzone, etc)  Really neat stuff. :)

'''Jan:''' Reproduced version:

http://files.ego-creations.de/ut2004/BloomEffect_Mutator.zip

'''Olga''' Updated download link. [http://www.websamba.com/Jarronis/Dreamland.rar Original Link]

'''GG-Xtreme:''' For some reason, I can only use XBloom and DoubleBloom, but I would like to use the bloom shown in the screenshots. Is it the same one with a different name, or is that a different version of the mutator? I would really like the bloom in the screenshots because XBloom and DoubleBloom don't look anything like it.

'''Ambershee:''' It's pretty impressive. I find it amusing how it also applies it to the GUI though =p

'''Xaklse:''' Just a note to let you all know that colored Bloom is possible and looks nice; just modify tAlpha RGB values of RenderTexture function. Thanks for your effort, Jarronis.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1922</id>
      <timestamp>2007-08-08T21:38:56Z</timestamp>
      <contributor>
        <ip>184.23.220.87.dynamic.jazztel.es</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''bloom''' is a lenticular halo. This page shows how to implement this visual effect in [[Legacy:UT2004|UT2004]].

Blooms are another type of effect seen around lights. While [[Legacy:Corona|corona]]s form the fuzzy glow you see around a light at night, or the rays which seem to shoot out from the light of the sun, blooms are a color-banded halo which is usually visible surrounding the corona. They are only seen when a person's pupils are dilated enough. (And [[Legacy:Lens Flare|lens flare]]s are a natural phenomena that occurs when light is refracted many times by some sort of lens, creating several images of geometric shapes to appear from a single light source.  Given that fact, you'll find that lens flares are often over used and appear where they ought not to in 3D graphics.  In other words, you need a compund lens system for a lens flare. They aren't seen purely with the naked eye.)

See the result on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Screenshots]] page, or [http://files.ego-creations.de/ut2004/BloomEffect_Mutator.zip Download here] (don't post public, please). Use for whatever you want, but it would be nice if you let [[Legacy:Jarronis, The Vampiric Unicorn|me]] know and add me in the credits (at least for the idea).

==Code==

At first, let take a look at the mutator:

&lt;uscript&gt;
//-----------------------------------------------------------
// Bloom Mutator
// Creates Interaction and handles
// rendering of the bloom-texture
//-----------------------------------------------------------
#exec OBJ LOAD FILE=DreamTex.utx
class Bloom extends Mutator;

var bool bAffectSpectators; // If this is set to true, an interaction will be created for spectators
var bool bAffectPlayers; // If this is set to true, an interaction will be created for players
var bool bHasInteraction;
var ScriptedTexture st;
var Actor bMesh;
var BloomInteraction BI;

function PreBeginPlay()
{
    //Log(&quot;ICU Mutator Started&quot;); // Always comment out your logs unless they're errors
}

simulated function Tick(float DeltaTime)
{
    local PlayerController PC;


    // If the player has an interaction already, exit function.
    if (bHasInteraction)
        Return;
    PC = Level.GetLocalPlayerController();

    // Run a check to see whether this mutator should create an interaction for the player
    if ( PC != None &amp;&amp; ((PC.PlayerReplicationInfo.bIsSpectator &amp;&amp; bAffectSpectators) || (bAffectPlayers &amp;&amp; !PC.PlayerReplicationInfo.bIsSpectator)) )
    {
        st=ScriptedTexture(Level.ObjectPool.AllocateObject( class'ScriptedTexture' ) );
        st.Client=self;
        //change this for different 'bloom-map' qualities
        st.SetSize(256,256);

        PC.Player.InteractionMaster.AddInteraction(&quot;Dreamland.BloomInteraction&quot;, PC.Player); // Create the interaction
        bHasInteraction = True; // Set the variable so this lot isn't called again
        bMesh=Spawn(class'BloomMesh');
        //A FinalBlend with FB_Brighten
        FinalBlend(bMesh.Skins[0]).Material=st;

        BloomInteraction(PC.Player.LocalInteractions[PC.Player.LocalInteractions.Length-1]).St=st;
        BloomInteraction(PC.Player.LocalInteractions[PC.Player.LocalInteractions.Length-1]).BMesh=bMesh;
        BI=BloomInteraction(PC.Player.LocalInteractions[PC.Player.LocalInteractions.Length-1]);
    }
}

event RenderTexture(ScriptedTexture Tex)
{
    local PlayerController PC;
    local vector camloc;
    local Rotator camrot;
    local Actor camactor;
    local Color tAlpha;



    talpha.R=238;
    talpha.G=238;
    talpha.B=238;


    PC = Level.GetLocalPlayerController();
    PC.PlayerCalcView(camactor,camloc,camrot);
    //log(&quot;RenderEvent&quot;);

    Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,camactor,camloc,camrot,PC.DefaultFOV,false);
    //Lightfilter is a FinalBlend with FB_Darken
    //The Light-threshold is controlled via talpha;
    //Colored Bloom should be possible with unequal RGB values (untested)
    Tex.DrawTile(0,0,Tex.USize,Tex.VSize,0,0,16,16,FinalBlend'DreamTex.Lightfilter',talpha);

}



DefaultProperties
{
     bAffectSpectators=true
     bAffectPlayers=true
     RemoteRole=ROLE_SimulatedProxy
     bAlwaysRelevant=true
     FriendlyName=&quot;Bloom&quot;
     Description=&quot;Adds Bloom to the gameplay.&quot;
}
&lt;/uscript&gt;

This mutator creates an interaction, which i'll discuss later. Additionally a simple rectangle mesh is spawned. The only spcial thing aboput this mesh is, that its UV-Coordinates do not cover the whole range, but only a horizontal 4:3 part of it. It took some time to figure out that a mesh with a full UV-Range will squeeze the bloom. 

This mutator also is responsible for rendering the ScriptedTexture which is uses as the material for the FinalBlend which is in turn the skin of the bloom mesh. 

The basic idea is to render the whole frame again into the ScriptedTexture and then filter the bright parts with a FinalBlend (FB_Darken). But that just the first part. 

&lt;uscript&gt;
//-----------------------------------------------------------
// Renders the bloom-mesh several times to create a blur effect
//-----------------------------------------------------------
class BloomInteraction extends Interaction;

var ScriptedTexture St;
var Actor BMesh;
var float dist;
var float fov;
var float dev;
var bool bEnableBloom,bXBloom;
var float devX;
var vector CamPos,X,Y,Z;
var Rotator CamRot;

event NotifyLevelChange()
{
        Master.RemoveInteraction(self);
        assert( St != None );
        ViewportOwner.Actor.Level.ObjectPool.FreeObject( St );

    //  (destroy any actors spawned by this interaction)
    //  (clean up any uscript objects that have been loaded)
}

function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{

    if ((Key == IK_PageUp) &amp;&amp; (Action == IST_Release)) devX+=0.25;
    if ((Key == IK_PageDown) &amp;&amp; (Action == IST_Release) &amp;&amp; (devX&gt;0)) devX-=0.25;
    if ((Key == IK_Home) &amp;&amp; (Action == IST_Release))bEnableBloom=!bEnableBloom;
    if ((Key == IK_End) &amp;&amp; (Action == IST_Release))bXBloom=!bXBloom;
    if ((Key == IK_Insert) &amp;&amp; (Action == IST_Release)) dev+=0.05;
    if ((Key == IK_Delete) &amp;&amp; (Action == IST_Release) &amp;&amp; (dev&gt;0)) dev-=0.05;
    log(&quot;dev&quot;);
    log(dev);
}

//not used currently
function RenderBloomLayer(Canvas c, float devX, float mZ, float mY, float dev)
{
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(mZ*Z+mY*Y)*dev);
    C.DrawActor(bMesh,false,true);
}

function PostRender(canvas Canvas)
{


    local Font UsedFont;
    if(!bEnableBloom)return;
	if(UsedFont==None){
        UsedFont = Font(DynamicLoadObject(&quot;SECFonts.Arial&quot;, class'Font'));
    }
	Canvas.Font = UsedFont;
	Canvas.FontScaleX = 1;
	Canvas.FontScaleY = 1;
    Canvas.Style=ViewportOwner.Actor.ERenderStyle.STY_Normal;


    Canvas.DrawColor.R=255;
    Canvas.DrawColor.G=255;
    Canvas.DrawColor.B=255;
    //calc this frame
    st.Revision++;

    Canvas.GetCameraLocation(campos,camrot);


    bMesh.SetRotation(camrot);
    ViewportOwner.Actor.GetAxes(camrot,X,Y,Z);

    //moved to init
    //FinalBlend(bMesh.Skins[0]).Material=st;


    Canvas.SetPos(10,240);




    if(!bXBloom)
    {
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+Z*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)-Z*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+Y*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)-Y*dev);
    Canvas.DrawActor(bMesh,false,true);
    Canvas.DrawText(&quot;XBloom&quot;);
    }
    else
    {
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(Z+Y)*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(-Z+Y)*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(-X-Y)*dev);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX)*vector(camrot)+(-Y+Z)*dev);
    Canvas.DrawActor(bMesh,false,true);
    Canvas.DrawText(&quot;DoubleBloom&quot;);
    }

    Canvas.SetPos(10,200);
    Canvas.DrawText(&quot;Bloom Active&quot;);

    //innerglow

    if(!bXBloom)
    {
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+Z*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)-Z*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+Y*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)-Y*dev/2);
    Canvas.DrawActor(bMesh,false,true);

    }
    else
    {
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(Z+Y)*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(-Z+Y)*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(-Y-Z)*dev/2);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(campos+(dist-devX/2)*vector(camrot)+(-Y+Z)*dev/2);
    Canvas.DrawActor(bMesh,false,true);

    }
}

DefaultProperties
{
    bVisible=true
    bActive=true
    dist=40
    fov=90
    dev=0.28
    devX=1.6
    bEnableBloom=true
    bXBloom=false
}
&lt;/uscript&gt;

Well, as it says, it renders the mesh at different positions to create a blur effect. The &quot;Dev&quot;-Property will just move the mesh the blur along the axis of the screen, while &quot;DevX&quot; will create a perspective-blur. 

This is the BloomMesh-class:

&lt;uscript&gt;
class BloomMesh extends Actor;

DefaultProperties
{
    DrawType =              DT_StaticMesh
    StaticMesh =            StaticMesh'DreamStat.BlurMesh'
    bUnlit =                true
    bStatic =               false
    bAlwaysRelevant =       true
    bNoDelete =             false
    bHardAttach =           true
    bHidden=                true
    Skins[0]=               FinalBlend'DreamTex.BloomFB'
    DrawScale =             1;
    bAcceptsProjectors =    false;
    RemoteRole =            ROLE_None;
}
&lt;/uscript&gt;

The Material &quot;BloomFB&quot; is a FinalBlend with FB_Brighten, but no material assigned to it, this is done in the code. &quot;Lightfilter&quot; is a Finalblend with FB_Darken an a pure white, or bright gray texture assigned to it.

==Notes==

Recently I had the idea to use the BloomMesh for both filtering the lights and for the bloom-effect itself. Maybe this could solve the terrain, banding and overlit problems, as no redundant RGB data is stored in the texture. This method would apply the Lightfilter to the BloomMesh and not to the ScriptedTexture itself,  as long as RenderTexture is called, after this, the material is switched back to BloomFB.

For larger mods, or TC's this could be made map, or even zone-dependant, to create individual effects. It could be even possibly to create distant-dependant bloom-effects, by changing the zone fog values to a near black before rendering and applying the scripted texture several times. 

Objects nearer at the camera can receive a larger glow than objects more away.

I'm honestly not the one who is made to understand UScript-Replication, so if you see any issues that make my code network-incompatible, please let me know here.

===Problems===

Sometimes, a ScriptedTexture does not render ParticleSystems correctly, displaying them boxes. Maybe this is an  Z-Buffer Issue, or, the ScriptedTexture does not like certain Rendertypes of Particles, Subtractive, f.i.

It seems, a scripted Texture renders Terrain completely different as normally, making terrain extremely blurry with the bloom-effect.

Because the ScriptedTexture, rendering all the level again(and filtering the bright parts), has to be applied several times on canvas, dealing a hard punch on the framerate.

Actors, that are rendered via PostRender/DrawOverlay calls, are not visible for any calls of DrawPortal, of course. They still show up when the bloom is active, but they become transparent. I think i can solve this problem by creating a 'real' actor, giving it the same mesh/animation as the desired 1stPV-Actor(most commonly weapons models) 

==Comments==

'''j3rky:''' Interesting idea, and the screenshot looks promising... i'd like to see some code snippets :)

'''MythOpus:''' Looks rather beautiful.  Good Job! :tup:

'''El Muerte:''' looks nice, but, is it worth it ?

'''Jarronis, The Vampiric Unicorn:''' Well, if you have around 80FPS and you don't know where to put them, why not? Of course, my hardware isn't good enough to manage this, but i'm working on a 'light versions' too. 

'''Foxpaw:''' Hmm, I like the way that looks. It's almost like high dynamic range lighting.

'''DJPaul:''' Can I/we get the code for this?  It'll be useful for a project that I am working on.

'''Jarronis, The Vampiric Unicorn:''' Of course, i'll make this open source, once i cleaned up the code, and added enough configurable properties. 

'''j3rky:''' Actually, I think it would be more usefull to see some code that doesn't feature a lot of extras. That way the basic idea behind the implementation becomes more obvious. It shouldn't be your goal to provide a working does-it-all library - that's something the individual programmer can and should do.

'''Foxpaw:''' I'm finding it somewhat difficult to understand how this works from your code. What is the code for the BloomMesh class? It apparently must have some as it has something in it's Skins array which doesn't appear to be put there by the interaction or the mutator.

As best I can tell, you render the world onto your scripted texture, then LightFilter is drawn on top of it. Lightfilter I'm guessing is an all-white texture, so since it has FB_Darken, and is drawn mostly opaque, all but the most brightly lit parts of the scripted texture will be wiped out and made completely black.

Then, you draw the mostly-black-but-dim-in-areas-that-should-get-brightened mesh with FB_Brighten, to brighten only the areas that remain on the scriptedtexture. The mesh appears to be drawn several times with slight offsets, which I'm guessing is so that instead of directly brightening only the brighter areas, (with hard edges) the bloommesh is shifted around to make the lightening &quot;spill over&quot; onto nearby areas.

Is that correct? The BloomMesh class is missing and of course there's little information on what the materials used contain, so I'm guessing at how it works.

'''Graphik:''' I'm drooling. Added this to [[Legacy:Featured Pages|Featured Pages]].

'''El Muerte:''' A little note: never use the &lt;code&gt;assert()&lt;/code&gt; function. It will trigger an engine shutdown when the expression is false. UnrealScript should never do this. 

'''Jarronis, The Vampiric Unicorn:''' Of course, i wouldn't do that normally, but interactions sometimes show strange behavior when handling Null-Objects. Sometimes they tend to crash anyway if you even attempt to check if they are &quot;None&quot; with an if expression. 

Foxpaw is right concerning how the code works. The BloomMesh(derived from Actor) class has no code, just some defaultproperties, that make sure this thing isn't replicated, unlit, etc. It's Skin is a predefined FinalBlend with FB_Brighten, but no Material assigned, because i'm doing that in the code.

I'll add Material descriptions and the missing class later, of course.

'''Tarquin:''' This is now on [[Legacy:Featured Pages|Featured Pages]] &amp;ndash; so could we bring it out of walled garden space please and into the main project namespace? Thanks :)

'''DJPaul:''' The BloomMesh is client-side only, I presume?  Also, have you made any progress fixing this from a first person view?  And whilst I plan to add this to my project in the next few days, is there any chance of screenshots that demonstrate the transparent-meshes-whilst-in-first-person so that I can appreciate how distracting this effect is a s a signifcant part of my mod is first-person.

'''Foxpaw:''' Unfortunately, I don't see how the first-person could be fixed without resorting to a hack. The issue is that the first person weapon is not drawn in DrawPortal because it is not drawn normally as part of the world - it is itself drawn in PostRender(). So, it would be more accurate to say that your first person weapon is like a part of the HUD, rather than being a part of the world.

This can be solved, as Jarronis mentioned, by having the first person weapon be part of the world. However, that of course is going to be a hack and won't work for mods that use something different for their first person weapons. It would also involve replacing some other classes, which would be somewhat invasive and prone to incompatibilities with other mods.

You might be able to work around it by copying the same code that draws the weapon onto the canvas, to have the weapon itself drawn onto the scriptedtexture after drawing the world onto it. However, now that I think about it some more, the bloommesh should be getting drawn beneath the weapon, and so should not be visible over top of it, so maybe the cause is soemthing different from what I was thinking. Hrmm. I'll see if I can get this working and see if I can figure out what's going on there.

Also, what mesh did you use for the bloommesh, or did you create your own? Also, does the bloommesh compensate in any way for different resolutions (and hence, different aspect ratios on the monitor) or different POV settings? If not it seems like it might look funny when zoomed in on the sniper rifle, for example.

'''Jarronis, The Vampiric Unicorn:''' I created my own mesh, though it is nothing more than a rectangle with an 4:3, so it should work on resolution that have the same ratio. Not that the UV-Coords must be map in the same way, this means, not the whole UV-&quot;Square&quot; but the biggest 4:3 part of it.

As long as you zoom in(decreasing the FOV), everything is just fine, because the mesh floats in front of the camera as a virtual canvas. Increasing FOV will make the bordes become visible.

Drawing the weapon directly onto the ScriptedTexture is not possible i think, because ScriptedTextures unfortunately don't have a DrawActor-Function. As said, another solution can be an actor that has the same Mesh, Animation und position like the FPV-Weapon, but this one is only visible during the RenderTexture event of the texture. So, copying code from the Postrender/DrawOverlay-Function might be a good idea for determining the position, the rest must be done via animation-replication. 

In general, i would suggest mod-authors to modify the code, as is fit to them, such as implenting the routines in a HUD instead of Interaction, which always draws ontop of the HUD.

'''DJPaul:''' I've been away too long to remember how these functions interact and how things are rendered; for simplicity's sake, on my part, I think I will wait to see if anyone comes up with a fix for this and otherwise leave it out of my code.

'''Foxpaw:''' Hrmm, I tried the code above, substituting in a mesh of my own and making the appropriate materials, but the effect I get isn't as nice. The &quot;bloom&quot; effect has visible contours on my setup, like the kind you get when you convert a colorful image to 256 color palettized. Is there any other settings you changed on the materials that are pertinent to making the effect look good?

'''Foxpaw:''' Actually it looks like I spoke too soon. It only does that in my mod. In UT2004 it doesn't do that. Wierd. (Actually, I would speculate that it probrably still exists in UT2004, but UT2004 doesn't have the same smooth gradient background that would make such an effect noticeable. Hmmm.

Also it should be mentioned that the bloommesh has to have bHidden=true, otherwise it will look wierd when moving - because otherwise the bloommesh from the last frame gets rendered onto the scriptedtexture.

Also I see what is going on with the weapons. My initial speculation was correct. Your bloommesh is getting drawn after the weapon, so it gets drawn on top of it. This causes it to appear &quot;translucent&quot; when in reality a translucent version of the world is being applied to it. I believe this because it seems logical and the transparency is greater over brighter objects, which would be the objects doing more brightening on the bloommesh. The least invasive workaround would be to draw the weapon on after drawing the bloommesh - so it would end up getting drawn twice, which is less than ideal but that way you don't have to have a custom controller or anything to work around it.

'''DJPaul:''' What sort of function would you use for that?  HUD.Postrender/DrawOverlay as was mentioned in Jarronis' post above?

'''Foxpaw:''' PostRender. The exact same place as the bloommesh is drawn in - just draw it after drawing the bloommesh. This won't prevent the first drawing, but then you can draw over the &quot;translucent&quot; version with a new one that won't have the bloommesh on top of it. This may look a bit strange for weapons with transparent bits, though, I haven't tried.

Also, I haven't had any problems with emitters, like you had Jarronis. I had them at first, but setting bHidden to true on the bloommesh fixed them.

'''DJPaul:''' It would be appreciated if someone would upload the missing class that is mentioned, and the bloomesh  as I cannot model anything.  Thanks.

'''Foxpaw:''' Also I found a line that I think is a typo. One of the bloom offset thingies references X, when I think you meant to type Z.

The comment about zooming in with the sniper rifle is, the &quot;zoom&quot; on the sniper rifle does not affect the location of the camera - it alters the FOV. However, I tried that and it doesn't seem to hurt anything when the FOV is tightened. I did notice that the overlay when zooming in with the lightning gun ends up being very bright, but again, there's not much that can be done about that.

I've also noticed some glitchy behaviour when moving with the bloom on - sometimes the apparent light level makes a sudden shift. I'm guessing that this is related to the &quot;deviation&quot; of the glow.

Okay, I'm also changing my stance on the emitters again - Emitters seem fine, but some xEmitters seem to have a kind of square around them. This is probrably simply an imperfect texture, and the imperfection is amplified. (Most modulated textures, for example, start to look wierd if you put a lot of them on top of each other.)

Also, it turns out my speculation was right in that UT2004 does suffer from the same issue of looking like an indexed image, it's just not as noticeable because there isn't much in the way of color gradients. However, I did notice a color gradient (the sky in DM-Antalus) and it had the same &quot;banding&quot; issue.

Also, I've noticed that the bloom effect varies a lot on different levels. I don't really know if anything can be done about that as it is likely related to the level's general brightness. For instance, in DM-Antalus it's very bright, kind of overdone-looking. However, on DM-TrainingDay, it's barely visible. (Except for some wierd artifacts visible out the windows.) On ONS-Torlan, the distance fog is lit up like a Christmas tree.

Also, I optimized the code in the interaction slightly, which may also increase readability somewhat. Here's what I changed it to:

&lt;uscript&gt;
function PostRender(canvas Canvas)
{
  local vector BaseDisplacement;
  
  if (!bEnableBloom)
    return;

  st.Revision++;

  Canvas.Reset();
  Canvas.GetCameraLocation(campos,camrot);

  BMesh.SetRotation(Rot(0,0,-16384) CoordRot Camrot);
  BMesh.GetAxes(Camrot,X,Y,Z);

  BaseDisplacement = CamPos + (dist-devX) * vector(CamRot);
  Y *= dev;
  Z *= dev;
    
  if(!bXBloom)
  {
    bMesh.SetLocation(BaseDisplacement+Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Z);
  }
  else
  {
    bMesh.SetLocation(BaseDisplacement+Z+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)-Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Y)+Z);
  }


  BaseDisplacement = CamPos + (Dist-(DevX/2))*Vector(CamRot);
  Y *= 0.5;
  Z *= 0.5;

  if(!bXBloom)
  {
    bMesh.SetLocation(BaseDisplacement+Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Z);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation(BaseDisplacement-Y);
    Canvas.DrawActor(bMesh,false,true);
  }
  else
  {
    bMesh.SetLocation(BaseDisplacement+Z+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)+Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Z)-Y);
    Canvas.DrawActor(bMesh,false,true);
    bMesh.SetLocation((BaseDisplacement-Y)+Z);
    Canvas.DrawActor(bMesh,false,true);
  }
}
&lt;/uscript&gt;

'''Graphik:''' See tarquin's comment above. May I please move this to a public page (a subpage of [[Legacy:Lighting|Lighting]] perhaps) rather than your personal page?

'''Jarronis, The Vampiric Unicorn:''' Of course move it into project name space, or into [[Legacy:Lighting|Lighting]] as you desire.

Thank you, Foxpaw, for the typo. I mixed them up before, so i probably just forgot to change that. 

I noticed the color-banding and overlit issue too, if you you look close to screenshots you can see them there too. That's why i mentionend that especially talpha(the light treshold) cannot be the same maps. Dark maps can handle a lower talpha, resulting in brighter bloom-maps, but especially outdoor maps are overlit easily, so the threshhold must be higher. 

A general problem is that FB_Darken don't work that i want too, i think. It seems that the textures stores kind of 'negative' RGB-Values. So when you add them up, by drawing them ontop of each other several times, the colors that should be 'zero' show up again. That's also where the banding-effect takes place. 

'''Jarronis, The Vampiric Unicorn:''' I found a hack for the FPV Problem. Just add &lt;code&gt;ViewportOwner.Actor.Pawn.Weapon.RenderOverlays(Canvas);&lt;/code&gt; at the end of the posternder - routine of the interaction. This will prevent the weapon becoming translucent. However, the weapon still won't be included into the bloom-lighting. I tried to set the weapons bHidden to false, when calling RenderTexture, because everytime RenderOverlay is called, the weapon's Rotation/Location is recalculated and drawn directly. In theory, when calling RenderOverlay in the interaction(although is shouldn't be necessary because the HUD already did it the same frame), setting bHidden to false, and then rendering the texture, the weapon should be visible in the bloom layer.

My result was that the weapon actually shows up but in a wrong position. For some strange reasons, the weapons position seems to be reset, after RenderOverlay has been called.

'''Graphik:''' Moved.

'''Jarronis, The Vampiric Unicorn:'''Thank you. I found the problem. I was wrong, the position stays same, but the FPV-Weapons are drawn at a different FOV, which is weird for my purpose.

I tried it with this:

&lt;uscript&gt;
event RenderTexture(ScriptedTexture Tex)
{
    local PlayerController PC;
    local vector camloc;
    local Rotator camrot;
    local Actor camactor;
    local Color tAlpha;



    talpha.R=238;
    talpha.G=238;
    talpha.B=238;


    PC = Level.GetLocalPlayerController();
    PC.PlayerCalcView(camactor,camloc,camrot);
    //log(&quot;RenderEvent&quot;);
    //make weapons visible
    PC.Pawn.Weapon.bHidden=false;
    Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,camactor,camloc,camrot,PC.DefaultFOV,false);
    //Lightfilter is a FinalBlend with FB_Darken
    //The Light-threshold is controlled via talpha;
    //Colored Bloom should be possible with unequal RGB values (untested)
    Tex.DrawTile(0,0,Tex.USize,Tex.VSize,0,0,16,16,FinalBlend'DreamTex.Lightfilter',talpha);
    //hide weapon
    PC.Pawn.Weapon.bHidden=true;

}
&lt;/uscript&gt;

It works just fine, except when the weapon-bloom disappears when you are too close to a wall, because of the z-buffer, but that's another problem. Well, in the RenderOverlay-function, DrawActor is called with a weapon-specific FOV which lies around 60 to 70. Well, Standard-Player-FOV is around 90, and that's the whole problem. So mod-makers: Match you FPV-Weapon's FOV to the Player-FOV and it will work fine.

'''Foxpaw:''' Did some more experimentation today. I was noticing a slight glitchiness, but when you posted your BloomMesh I thought I'd compare it to mine to see if there was any differences. I had forgotten to make mine bUnlit. This resolved some glitchiness with the apparent amount of bloom varying at different areas in the level.

I had an idea regarding the banding but it was a no-go. I was thinking to myself. I thought, &quot;It looks like what you get when you convert a 24 bit color image to 8-bit palletized.&quot; I responded by thinking, &quot;maybe that's because the color compression of the scripted texture is 8-bit palletized, seing as how that's the default compression type.&quot; I deftly replied with &quot;Holy Compression Batman, you're right!&quot;, while doing my best mental impression of err. that guy that played batman.

Long story short, I changed the texture compression type, I tried a bunch of the options, but it didn't fix the banding. It seems like that might be a piece of the puzzle though, so to speak.

I'm also a little unclear on what exactly you are planning with the lightfilter in your recent edit. Do you mean as in, putting the lightmap on the scripted texture, making it visible, then doing DrawPortal again with the filter over top?

'''Jarronis, The Vampiric Unicorn:''' I used this code as an alternative RenderTexture:

&lt;uscript&gt;
    PC = Level.GetLocalPlayerController();
    PC.PlayerCalcView(camactor,camloc,camrot);
    bMesh.bHidden=false;
    bMesh.Skins[0]=FinalBlend'DreamTex.Lightfilter';
    Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,camactor,camloc,camrot,PC.DefaultFOV,false);
    bMesh.Skins[0]=FinalBlend'DreamTex.BloomFB';
    FinalBlend(bMesh.Skins[0]).Material=st;
    bMesh.bHidden=true;
&lt;/uscript&gt;

Unfortunately it didn't work. It seems that DrawPortal has problems with rendering FinalBlends. 

I don't think that the band-problem can be resolved completely. Because all colors are added up more or less, the difference between to colors become greater.

'''Foxpaw:''' Hrm.. That actually worked fairly well on my mod. The sun was nicely brightened as was my white spacecraft, but the nebula background wasn't all bandy. It doesn't seem to work well in UT2004 though. I have to go to class now, but I'll experiment more when I return.

'''Jarronis, The Vampiric Unicorn:''' Cool. Let me know if you got it working in UT2004, unless i don't get it. This solution don't creates redundant RGB-Data, which add up and create the banding-effect. 

It think it might be a z-buffer issue, because if Standard-UT2004 clears the z-buffer while rendering the HUD.

When you use this solution you should'nt use a pure white texture, because then the FB would suctract everything, all light gray should do the trick, but i guess you already figured this out.

'''Mosquito:''' could this effect be intensified, sorta like the blur effect in farcry? If it causes such a performance hit, it could just be a hit effect or a shell effect.

'''Jarronis, The Vampiric Unicorn:''' Variations of this effect are nearly limitless. You can play with different Blendmodes, Filters and offsets to achieve different effects.

'''Foxpaw:''' Actually, I was using an all-white texture. Now I know why the scriptedtexture was ending up completely black in UT2004. ;)

However, there's a new problem posed by using this method. Because you are using something that exists in world space as your light filter, it can get clipped by other objects. That means that if you are really close to some grass or something, the grass doesn't get filtered and as such is blindingly bright. This turned out to be why my mod was working.. because my entire ship was between the clipping plane and the bloom mesh. This problem should be fixable by simply reducing the drawscale of the bloommesh and moving it closer to the camera, until it's right next to the clipping plane.

However, erm... All of that is fairly irrelevant, as now that I got it working using the bloommesh as a light filter, it still has the banding. :(

I did get a strange insight though - the darkening light filter doesn't appear to actually push all pixels down a set amount (thus causing anything below a certain threshold to bottom out at 0, as one would think.) I set the scriptedtexture's FinalBlend to FB_Overwrite instead of FB_Brighten, and noticed that, while the scriptedtexture is darker than the scene, it still seems to have all of the same detail, even at very high &quot;light thresholds.&quot; I now believe that the entire scene is being patterned around when the bloommesh is drawn, but is 'most noticeable' around brighter objects, as they cause the most brightening. I think we need to find a new way of filtering out the bright parts, but I'm not sure how we can go about doing that. It's possible but unlikely that the CO_Subtract of a combiner would behave the way we though that FB_Darken was. Maybe that's worth a try.

Curses, now you've got me thinking about all kinds of things I might try with these filtering techniques. Previously I couldn't think of any way to implement a pixel-shader-esque effect like this in UScript because I didn't know of any way to get color data of pixels - now that I see how you've done this the possibilities seem endless. Hrmm.

And Mosquito, I've already nicknamed the bloom effect, &quot;drunken mode&quot; or &quot;hangover mode&quot; because I have the blur and the light threshold fairly high. ;) The effect at high levels of dev is quite comparable to far cry's hit effect.

'''Foxpaw:''' Using Combiners for any texture math is probrably a good idea regardless as they are handled by the video card and will somewhat reduce the speed penalty.

But erm... Combiners apparently do have different behaviour on their subtract than does Darken. But, err.. it appears that large subtractions (subtracting 240 for instance) actually produces a 'negative' of the view.

'''Foxpaw:''' Scratch that. Apparently CO_Subtract subtracts the FIRST material from the SECOND, so the order is reversed. No more negatives ;)

'''Jarronis, The Vampiric Unicorn:''' If you want to know, what a &quot;drunken&quot; effect is, combine bloom with motionblur...

I had the same idea on using a combiner, but i wasn't sure about it, because a Combiner demands at least one constant texture. Using combiners also produces more 'overhead', it think, because the materials have more complex hierarchy.

By the way, this &quot;project&quot; just was meant to be hobby-coding-project from me, and now it turned this large thing... I'm drooling....

'''Foxpaw:''' Err, well, you see, using Combiners actually produces drastically less overhead. To make a long story short, the overhead of combining the LightFilter and the scriptedtexture is effectively trivial. The transformation is reliably predictable, so the video card can be fed a little program that executes very quickly on purpose built hardware (the shader pipeline) instead of interpreting instructions and blitting textures in RAM.

Plus the Combiner method actually does the filtering we want, completely wiping out any light below a certain threshold. :D

However, we have a new problem: Now that we have something that's actually subtracting 238 from each pixel and bottoming out at 0, even the brightest of bright things is now only a brightness of 17, which is pretty dim. So now, I can't even see the bloom effect. (Though if I set the finalblend to FB_Overwrite I can see that it's there.) We now need a way to increase the brightness of non-zero pixels without increasing the brightness of zero pixels. Unfortunately, CO_Multiply won't work, as it interprets 255 as 1.0 and everything less as some fraction. We could just draw the additive texture a bunch of times, but that's probrably not the ideal solution. Any ideas on how we can control the brightness of the bloom effect, without changing the lightfilter?

'''Foxpaw:''' Another idea, we might be able to get better control over the effects and reduce the performance hit to almost nothing if we can find a way to prevent the world from being rendered by default, and then drawing our DrawPortal result + the Bloom effect as FB_Overwrite. Highly modified TCs like mine might be able to do this as I can have the playercontroller reside in a box way out in the middle of nowhere so everything will be occluded, and then have the playercontroller basically &quot;watch TV&quot; which would be the DrawPortal taken from the Pawn's first person view. However, that won't work for any mod using UT2004s default Pawn behaviour.

'''Jarronis, The Vampiric Unicorn:''' We could reverse the texture using another combiner, then multiply, and then reverse again... &quot;negative multiplication.&quot;

'''Foxpaw:''' Hrrmmm. I don't think that will work. If we take the negative of the texture using another combiner, the 0s become 255s, which will then get multiplied by some fraction, so when we take the negative again, they won't be zeros anymore..

'''Foxpaw:''' Err.. hemm. I've hit a brick wall. Apparently, the Unreal Engine doesn't like certain combinations of Materials. If I put the scriptedtexture directly into a finalblend I can use FB_Brighten with no problems. If I put it into a combiner with CO_Subtract, then put that into a final blend, all the blend modes ''except'' for FB_Brighten and FB_Darken work. I tried to get around this by simply using DrawTile to put the Combiner onto a second scriptedtexture, but that seems to cause GPFs.

FB_Translucent does work, but it's not quite the same effect. I've tried using a combiner to add the combiner to the original st, and then displaying that with FB_Overwrite, which works, but there doesn't appear to be any way to get the &quot;blur&quot; effect, which is of course essential, otherwise it just makes the bright areas look washed out. I tried just using a ton of combiners and TexOscillators to get the blur effect, but that just gave me the default texture, which says to me that the maximum length of a shader program has been reached. (255 lines in Shader Model 2.0, which is what UnrealEngine2 uses.)

So, I'm somewhat at a loss for what to do there. The FB_Brighten is important to get the desired effect. FB_Translucent gives hard edges and some of the detail on the light for instance (detail textures and such) spill over onto the &quot;glow&quot; area.

'''Foxpaw:''' Blech. I had an idea to work around the previous issue by taking another DrawPortal of the partially filtered image.. but that didn't work out. It appeared to be working, but it turns out that only the coronas were working because the coronas take time to fade out and so were getting in the frame unintentionally.

'''Jarronis, The Vampiric Unicorn:''' Eureka, i got the Combiner working by turning on Modulate2X and Modulate4X. The effect is certainly there even with FB_Brighten, but it is quite dim. 

'''Jarronis, The Vampiric Unicorn:''' Hm, strike that maybe, i'm not sure if it was this, or some other changes in the code, that made it running.

'''Tarquin:''' it's best to generall avoid subpages. 'Bloom' is a perfectly good title &amp;ndash; 'lighting bloom' or 'bloom effect' if you guys think that's better. Could someone with a decent text editor please promote all the headings by one level? thanks :)

'''DJPaul:''' Clever chaps, if I implement this code as is from the top of the page, if you come up with any changes to improve it or fix issues, will I end up ripping it all out or will it most likely be a change of just one class?  I'm deciding whether to implement it now or put it in later.

'''Foxpaw:''' The current system I've been using is quite different from the original code, but the original code is enough to see how it is done. The original code used a finalblend with FB_Darken, which doesn't work the way we expected, and produced bands of color on areas that should have had smooth contours. The Combiner method I've used so far didn't seem to be working, and a slightly different method &quot;worked&quot; but made the colors look washed out. So, I'm still experimenting.

I'll try playing around with Modulate2X and Modulate4X. I don't see why that would make any difference to the not drawing, but it might be useful anyway. The UDN says that it only works with CO_Multiply, and makes the result brighter. So, we may be able to multiply the filtered out light with a straight white texture and Modulate4X to make it brighter. I'll give it a shot.

'''Jarronis, The Vampiric Unicorn:''' I'm currently cleaning up my code, so i can make an demonstration mutator. In case major spread is desired, someone should upload this to an official mirror, because my ISP's have limited bandwith.

'''Foxpaw:''' Modulate2X and Modulate4X was perfect for increasing the brightness of the filtered image, but I still can get it to actually draw onto the screen. Turns out that the problem I was having before that I attributed to the max shader length being reached was actually due to something else - I was using a ConstantColor material instead of a white bitmap, and mistakenly assumed that a ConstantColor still counted as a constant bitmap material. Now that I've fixed that I got a stage further, but FB_Brighten still doesn't seem to want to work. FB_Darken works though, so I'm left wondering if this is some bizarre behaviour of FB_Brighten (as in, remember how FB_Darken didn't actually directly subtract RGB values like we thought? Maybe FB_Brighten is doing something funny that's making it impossible to see.)

Did you get your working using a combiner for the filter? If so I'd be interested to see where your code differs from mine.

'''Foxpaw:''' Huzzah! FinalBlend wouldn't draw FB_Brighten for me but using a Shader with OB_Brighten seems to. Now I'll see if I can tweak the dev and such to get the desired effect.

'''Jarronis, The Vampiric Unicorn:''' Yeah, i got it working with a combiner(and without a shader). Well maybe your bitmap is just to bright, did you try a darker one?

'''Foxpaw:''' Well, when you upload the demo mutator I'll see how that effect compares to the one I got. The final effect that I got with the combiner and shader seems technically correct but looks a little exact for my liking, so I'm eager to see what you came up with.

'''Jarronis, The Vampiric Unicorn:''' Well, used both approaches. The brighter one(which formerly uses only the FB) i called PowerBloom, but it also used the combiner with a black texture, which should make no difference, than using the FB alone. For a strange reason, the combiner eliminated all particle-errors, even if used with the pure black texture. 

The other method used the combiner with a very light gray, which makes a more &quot;selective&quot; bloom.

I'd plan to implement a configuration menu for the mutator, where you can choose which method shall be used, along other options.

'''Foxpaw:''' I'm confused. You used only the FinalBlend, no combiners? How did you get rid of the banding?

'''Jarronis, The Vampiric Unicorn:''' Of course i used combiners, but, when using PowerBloom, they are &quot;disabled&quot;, by using a black texture. Yet, PowerBloom should only be used on maps where the banding-effect is not clearly visible, as DM-CBP2-Achilles (as in the screenshots.)

'''Foxpaw:''' So.. err, if you use a black texture with the combiner, no filtering would take place at all, so wouldn't you then end up with just a really blurry and very bright view?

'''Jarronis, The Vampiric Unicorn:''' Yeah, but i still used the old Lightfilter on the ScriptedTexture too, so the bloom does not look &quot;capped&quot;. So by using the both techniques it's a matter of the right individual settings for each map to look good.

'''T1:''' Up there it says something about needing a lens for a lens flare. It's true you can't see lens flares with the naked eye, but eyes still have lenses, so that's kind of inaccurate. Sorry for being nitpicky.

'''Foxpaw:''' Fixed. :D

'''Graphik:''' Glad you added a link to a demo mutator, but why so hidden in the page?

'''Jarronis, The Vampiric Unicorn:''' Well, i didn't want it to post here in the comment area...

'''Foxpaw:''' Hmm. I like the demonstration mutator, though it looks a lot like the initial finalblend method you posted up here. The mutator still has the &quot;see-through&quot; weapons and has the banding, even with the &quot;power bloom&quot; turned off.

As best I can tell, any FinalBlend using FB_Darken is going to cause that banding, as FB_Darken appears to do more of a division instead of a subtraction. This results in rounding making similar colors appear to be the same color. Maybe the banding could be fixed by hiding the skybox when you do the DrawPortal, that might cause HOMs, but it might not. Skyboxes seem to be the area where the banding is most noticeable as they often have smooth color gradients.

Also the bloommesh doesn't adjust for different aspect ratios. This is ''probrably'' easy to accomplish, as I think that the Canvas has a function to get the resolution of the screen, so it'd be something like BloomMesh.SetDrawScale3D( Canvas.SizeX / 800, Canvas.SizeY / 600, 1 ); or something very similar. 800x600 is of course, only an example resolution, I don't know what resolution you designed it for.

Also I noticed with the PowerBloom off the terrain gets all blotchy. (I noticed this with my own experimentations as well.) Maybe you could keep a linked list of terraininfos and make them all bHidden before doing the drawportal? That might cause HOMs or other undesireable behaviour though, but it's a shot.

Except for the terrain issue and the banding in the skybox though, I think the bloom is very cool.

'''Jarronis, The Vampiric Unicorn:''' Thanks. Hm, i think i can solve the transluent weapon problem, by disabling general HUD-Rendering and then use the interaction to call the HUD's PostRender() function. The Mesh was designed 1024*768.

'''Mosquito:''' With powerbloom it seems to had a level of desaturation and realism to the image, and the unsual effect on the terrain is actually very interesting, Could it could be recreated to create a kind of [http://www.cs.wisc.edu/graphics/Gallery/NPRQuake/ NPR] (Non-PhotoRealistic Rendering) effect?

'''Jarronis, The Vampiric Unicorn:''' Interresting idea. I'm sure, NPR could be done this way. But i think the (usually) terrain issue is a bug of the DrawPortal-function of ScriptedTexture. Maybe it will be fixed in an future patch.

'''Foxpaw:''' The stuff on that NPR quake example would probrably be a little trickier to do. Pretty much all three methods rely on drawing things in wireframe mode (though with occlusion) and then tweaking the way that the wireframes are drawn. You might be able to do something like that with materials, but I'm not sure if you'd be able to do it on-the-fly like this, primarily as I don't know any way that you could get both wireframes drawn and still have proper z-buffering. The rendering methods used there look relatively simple to do, if you had access to the renderer, but unfortunately we don't. It might be possible to do that if you had the native headers.

Not that I'm saying for sure that it's not possible, as it's always possible that someone might come up with a clever scheme to get a visual effect without accessing the renderer directly. (as was done here.)

'''T1:''' Is there anyway to make it so that those screenshots need a link to open up, here on 56k I hate to wait for them to load.

'''Graphik:''' The majority have broadband and would likely prefer things as they are. If you have a 56k you're going to be doing a lot of waiting. Get used to it. ;)

'''Tarquin:''' you could feasibly crop the screenshots to show just a portion of the image.  would say about 300x300 pixels, and perhaps glue the before / after images side by side. The big advantage of this page not being a subpage any more is that we can make a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Screenshots]] page. :) I'll repeat my request for the heading levels to be corrected :)

'''T1:''' Thanks.

'''Graphik:''' Heading levels corrected.

'''Uncommon:''' The download link seems broken.

'''Wormbo:''' Works fine for me.

'''Uncommon:''' Ah, I see. My downloads window was in back, and the link also took me to an incomplete-looking page, so I got confused. Cool effects :)  I'm kind of surprised how little impact the motion blur has on performance.

'''OlympusMons:''' Havent read all of this, is it all relevant could use a [[:Category:Legacy Refactor Me]]

'''Moron:''' This is pretty good, I use a setting of 20 for the threshold and turn on the power bloom (it has nasty FX on the terrain for me otherwise). The only problem is that it seems to blur the terrain layers, regardless of whether whether they are bright or not. Has there been a fix for this yet (I'm not a coder, I only downloaded the mutator) or is it not possible?

'''Jan:''' Is there an alternate download?

'''SuperApe:''' Added category custom class tag.  The download link is broken. (&quot;404 page not found&quot;)  It looks like we'd only need some specific info on the BloomMesh and DreamTex to reproduce the latest version.  On [http://wiki.beyondunreal.com/wiki/Jarronis,_The_Vampiric_Unicorn Jarronis' page], it's mentioned the BloomMesh is a rectangle, so I assume a plane mesh.  It would be nice to see a download of the latest version.  This effect sure looks like what is being done in the next gen games; all the launch titles for XBox360 seems to have this effect (Call of Duty2, Quake4, Killzone, etc)  Really neat stuff. :)

'''Jan:''' Reproduced version:

http://files.ego-creations.de/ut2004/BloomEffect_Mutator.zip

'''Olga''' Updated download link. [http://www.websamba.com/Jarronis/Dreamland.rar Original Link]

'''GG-Xtreme:''' For some reason, I can only use XBloom and DoubleBloom, but I would like to use the bloom shown in the screenshots. Is it the same one with a different name, or is that a different version of the mutator? I would really like the bloom in the screenshots because XBloom and DoubleBloom don't look anything like it.

'''Ambershee:''' It's pretty impressive. I find it amusing how it also applies it to the GUI though =p

'''Xaklse:''' Just a note to let you all know that colored Bloom is possible and looks nice; just modify tAlpha RGB values of RenderTexture function. Thanks for your effort, Jarronis.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bloom/Screenshots</title>
    <id>650</id>
    <revision>
      <id>1923</id>
      <timestamp>2004-10-30T09:48:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Screenshots of the bloom effect, showing with and without.

[http://home.arcor.de/jarronis/Bloom3.jpg]

[http://home.arcor.de/jarronis/Bloom3r.jpg]

[http://home.arcor.de/jarronis/Bloom2.jpg]

[http://home.arcor.de/jarronis/Bloom2r.jpg]

[http://home.arcor.de/jarronis/Bloom1.jpg]

[http://home.arcor.de/jarronis/Bloom1r.jpg]

As you can see, the primary effect is that the level is much more brighter, but there is a blur effect around bright parts too.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlueShootSpot</title>
    <id>628</id>
    <revision>
      <id>1874</id>
      <timestamp>2004-02-11T19:40:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>#REDIRECT [[ShootSpot]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:ShootSpot|ShootSpot]]</text>
    </revision>
    <revision>
      <id>1875</id>
      <timestamp>2004-02-11T17:19:31Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:ShootSpot|ShootSpot]] &gt;&gt; BlueShootSpot}}

The BlueShootSpot is the actor placed in a map to tell bots a good location to shoot the ball into the blue team's [[Legacy:XBombDelivery|xBombDelivery]] in a [[Legacy:XBombingRun|xBombingRun]] game.

==Tips==
* At least one ShootSpot per BombDelivery is required for bots to run properly in the map. (i.e., without them, the bots will not attempt shoot the ball to the goal.)
* Make sure you can actually shoot the ball through the goal from your spots without resorting to tricky bank shots or shooting in mid-air.
* Bots will seek out these ShootSpots when they're low on health or are outnumbered or otherwise stressed out.  So, make sure you have at least one ShootSpot close to the goal.  Otherwise you'll see bots retreating from the BombDelivery to shoot at it.
* These can be used at &quot;PuntSpots&quot; too.  Note that the bots will try and shoot the ball straight to the goal in an arc, regardless of any obstacles along that arc.
* Bots from either team will use the ShootSpot in a pinch.  While the Red Team's bots shoot at the blue BombDelivery the Blue Team will be punting the ball the other direction from the same spot.

==Related Topics==
* [[Legacy:RedShootSpot|RedShootSpot]]
* [[Legacy:XBombDelivery|xBombDelivery]]
* [[Legacy:Mapping For BR|Mapping for BR]]

==Discussion==

'''SuperApe''': I would really love a suggestion on how to get bots to shoot from a spot in mid-air.  :)

'''GRAF1K:''' Wouldn't you just place a ShootSpot in the air? Or will that not work?  ('''SuperApe''': unfortunately, no.  I've tried.)

'''Foxpaw:''' I think that Shootspots are basically a special type of pathnode, and can't be placed in mid-air if they're going to work. Which is not to say you couldn't make the following hack:

Have a special actor, JumpShootSpot or whatever. When touched by a pawn, it checks to see if A) that pawn is bot controlled, and B) that pawn has the ball. If those checks pass, it forces the bot to face the direction it's going to shoot the ball in, and when the bot reaches a certain radius, (smaller than it's collision radius, to give some time for the mid-air aiming) the JumpShootSpot calls the pawns weapons firecontrollers fire function and discharges the ball, all with no actual input from the bot AI!

As an added advantage, this would also allow you to implement bank-shots for bots.

'''Off-Kilter:''' BTW, near as I can tell from the code, the shoot spots are actually coded wrong (blue is team 0, red is team 1), but it doesn't seem to matter because the code doesn't care about the team at all for the most part. Only thing I saw is when xBombDelivery comes into being... it checks to see whether any shoot spots exist with the team == the team of the gate. It doesn't matter at all where they are on the map either :-P So I think people end up putting the blue shoot spot in front of blue gate and vice versa (which is 'right'), and the code still all works because both gates have shoot spots on the map with the right team (though at the wrong gate if you consider team number). I hope what I just said makes sense, and if I'm wrong, please correct me. I am working on a multi-team BR mod so that's why I discovered this oddity. Oh, and to answer SuperApe's message above... shoot spots aren't manditory. It'll work fine without them, though they'll never try to shoot the ball.

'''SuperApe:''' Thanks, OK.  :)  That's what I figured; I corrected it above.  I noticed the backwards TeamNumber too, and I came to the conclusion that although the Blue team defends the Blue xBombDelivery, it's the Red team that needs to shoot at the Blue xBombDelivery.  So, I assume that would be why the BlueShootSpot 'uses' the Red team's number.  I had a feeling the TeamNumber on the ShootSpots were being ignored.  Makes you wonder why they made two actors for ShootSpots.  ;)  Good luck on the Mod, sounds like fun. (in-game alliances come to mind)

'''Off-Kilter:''' Heh. I just found out why they have two classes... they use FindPathTowardNearest in the AI, so they just look for the class. And apparently Red does look for BlueShootSpots, and vice versa (team number is still ignored) This is gonna make my 4-team BR interesting :P

===Merge?===

'''Tarquin:''' Could we merge [[Legacy:RedShootSpot|RedShootSpot]] with this and put the result in [[Legacy:ShootSpot|ShootSpot]]? They're the same class, but with just a team difference, right?

'''Off-Kilter:''' Well these classes do have extra properties (team number), so I think having a separate page here makes a certain degree of sense. Particularly if you are trying to find something or view the hierarchy. However, I do think we could push much of the common discussion upwards, sure.

'''SuperApe:''' What he said. ;) :tup:
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BlueSuperShockBeam</title>
    <id>28652</id>
    <revision>
      <id>40508</id>
      <timestamp>2010-01-14T09:02:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blurr</title>
    <id>663</id>
    <revision>
      <id>1952</id>
      <timestamp>2006-11-29T01:04:13Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hi,

I've just found this site, and think it's pretty cool. The terrain tutorials helped me out a lot here. I've already made a map ([[Legacy:Blurr/DM-Bunker|Blurr/DM-Bunker]]), and I am currently working on another one. I am a Coldfusion developer, and I've taken up mapping as a hobby.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blurr/CTF-Battlefield</title>
    <id>597</id>
    <revision>
      <id>1807</id>
      <timestamp>2006-11-29T01:03:40Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <comment>*Created Journal for my next map: CTF-Battlefield</comment>
      <text xml:space="preserve">==Work Begins!==

===The Plan===

The flag will be situated on a beam that sticks out from a platform. This platform and strip will be above ground level, and players will neet to get to the platform and run across the beam to get the flag. Should I make the person able to simply jump off the beam, or run back onto the platform?

In the center of the map there will be another two platforms that will provide good protection to the team that controls them. This will proabably be a large map with an outdoor place in between, with said towers beng well above ground level, so they will be able to see everything (but not each other). I also plan to make an underground route that would be more complicated to get through, but not as defendable. I'll try to post some screenshots as I work.

I've got a lot of work ahead of me! (And some studying)

==Comments==
 
 

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Blurr/DM-Bunker</title>
    <id>596</id>
    <revision>
      <id>1805</id>
      <timestamp>2006-11-28T20:48:27Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Download!==

You can download the map from FileFront here:

External Link: http://files.filefront.com/DM_Bunkerut2/;6263708;;/fileinfo.html

==The Map==

This map consists of 3 rooms, connected in a triangle-like fasion. The Map supports 11 players. The map may not look too good, but my friends and I think that it's really fun to play. You won't go to far without running into someone.

==History==

This is a map that I put together over two weeks. I'm looking for somone to do some static meshes for the map. If you think you can help, e-mail me at alex@blisserv.net. I haven't added full bot support for it yet. (Bots move strangely)

==Screenshots==

===Room One===

[[Image:Legacy_DM-Bunker-Screenshot-Blurr-1.jpeg|]]

===Room Two===

[[Image:Legacy_DM-Bunker-screenshot-Blurr-2.jpeg|]]

===Room Three===

[[Image:Legacy_DM-Bunker-Screenshot-Blurr-3.jpeg|]]

==Discussion==

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1806</id>
      <timestamp>2006-11-28T00:00:57Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Download!==

You can download the map from FileFront here:

External Link: http://files.filefront.com/DM_Bunkerut2/;6257715;;/fileinfo.html

==The Map==

This map consists of 3 rooms, connected in a triangle-like fasion. The Map supports 11 players.

==History==

This is a map that I put together over two weeks. I'm looking for somone to do some static meshes for the map. If you think you can help, e-mail me at alex@blisserv.net. I haven't added full bot support for it yet. (Bots move strangely)

==Screenshots==

===Room One===

[[Image:Legacy_DM-Bunker-Screenshot-Blurr-1.jpeg|]]

===Room Two===

[[Image:Legacy_DM-Bunker-screenshot-Blurr-2.jpeg|]]

===Room Three===

[[Image:Legacy_DM-Bunker-Screenshot-Blurr-3.jpeg|]]

==Discussion==

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bob Joel</title>
    <id>639</id>
    <revision>
      <id>1900</id>
      <timestamp>2004-02-18T09:56:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==My Personal Page==

+

===Intro===

+

Hello there, I would be Bob Joel(aka: Gage, Peleg, Morovan, etc..). I'm a mapper/modeller/musician, and am currently laying out the ground work for my mod, which at the moment is going by the name &quot;Furious Pavement&quot;. The wiki has been a great deal of help to me in the past, and I 'd really like to contribute somehow, so we'll see where things go from here!

+

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello, welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1901</id>
      <timestamp>2004-02-17T22:54:13Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>hi</comment>
      <text xml:space="preserve">==My Personal Page==

+

===Intro===

+

Hello there, I would be Bob Joel(aka: Gage, Peleg, Morovan, etc..). I'm a mapper/modeller/musician, and am currently laying out the ground work for my mod, which at the moment is going by the name &quot;Furious Pavement&quot;. The wiki has been a great deal of help to me in the past, and I 'd really like to contribute somehow, so we'll see where things go from here!

+

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bob The Beheader</title>
    <id>661</id>
    <revision>
      <id>1947</id>
      <timestamp>2007-01-12T22:45:59Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>Overhaul to my personal page</comment>
      <text xml:space="preserve">Bob_The_Beheader

(This page is a work in progress)

===About Me:===

I'm 19 years old, and a sohomore at the University of Puget Sound, in Tacoma. I got into Unreal Tournament during the summer of '05. Anyways, Im an undeclared Computer Science major. Funny, because UPS is a liberal arts school. I thought that it would be a good idea to go into the CSCI field with some background in other stuff, too.

I have always wondered how programmers created the beautiful 3D world we see in video games. I got started programming with QBasic for DOS when I was about 12 (Because Object Oriented programming was way to advanced a concept for my 12 year old brain to grasp). Unfortunatly, this made it very difficult for me to pick up Object Oriented programmming later on, because I was trying to think about Objects and classes in terms of Procedural subroutines. Of course, it didn't help that I also started learning assembly language (see below). Anyways, I think that conceptually, modern video games, like UT, cannot be understood through procedural concepts. I nearly had a heart attack when I first looked at some UnrealScript, and tried to understand it with procedural concepts. :)

Now that I'm in college, and taking computer science classes (which I've got to be at in about 1/2 an hour) I finally understand Object Oriented programming. Yes! I am now housebroken of all the old school procedural Basic crap that I've been mired in for years! 

However, every time I start editing some UScript, I slowly become more frustrated with Java. Why can't Java do some of the stuff that UScript can do???

===Mapping/Modding for UT:===

Also, and probably the most interesting of all of these, I've got a concept for a CTF map. see [[Legacy:Map Ideas/CTF-Sentinel|Map Ideas/CTF-Sentinel]]

==Discussion==

'''SuperApe:''' Hi, Bob.  I've disabled the Category Category tag, as that should only be used to tag Category Pages.  This is a Category Personal Page; nothing more.  :)

'''Solid Snake:''' Nothing wrong with using ASM, but even so it's pretty hard to get into without some formal training.

'''Bob_The_Beheader:''' I'm going to be taking an ASM class this sememster

===See Also:===

my rant, [[Legacy:To Many Projects Rant|To Many Projects Rant]]

my map idea, [[Legacy:Map Ideas/CTF-Sentinel|Map Ideas/CTF-Sentinel]]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1948</id>
      <timestamp>2005-12-07T18:46:53Z</timestamp>
      <contributor>
        <ip>222-153-152-77.jetstream.xtra.co.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bob_The_Beheader

(This page is a work in progress)

===About Me:===

I'm 18 years old, and a freshman at the University of Puget Sound, in Tacoma. I got into Unreal Tournament only recently, with 2004.

I have always wondered how programmers created the beautiful 3D world we see in video games. You see, I got started programming with QBasic for DOS when I was about 12 (Because Object Oriented programming was way to advanced a concept for my 12 year old brain to grasp). Unfortunatly, this made it very difficult for me to pick up Object Oriented programmming later on, because I was trying to think about Objects and classes in terms of Procedural subroutines. Of course, it didn't help that I also started learning assembly language (see below). Anyways, I think that conceptually, modern video games, like UT, cannot be understood through procedural concepts. I nearly had a heart attack when I first looked at some UnrealScript, and tried to understand it with procedural concepts. :)

Now that I'm in college, and taking computer science classes (which I've got to be at in about 1/2 an hour) I finally understand Object Oriented programming. Yes! I am now housebroken of all the old school procedural Basic crap that I've been mired in for years. 

===Assembly Language:===

Yes, I'm partial to assembly language. Please don't ridicule me for saying so, but I actually think it is, in a way, the most powerful programming language in existance. This is because it works directly with the CPU. The programmer can control every last aspect of what the CPU does at any point in a program. It interfaces directly with hardware. Higher level programming languages put a buffer between the programmer and the CPU (I don't mean the physical computer science definition of &quot;buffer,&quot; rather the philisophical definition as a barrier or a shield from a concept) While saving a lot of time when writing a program, and saving the programmer from having to memorize various codes and addresses their program will use, and saving the programmer the trouble of having to learn Hexidecimal (which should, in my opinion, be used by everyone, even in fields outside computer science), higer level languages do not grant the programmer full access to the power of the CPU and it's instruction set. I believe that this is especially apparent in code optimization. 

(Will finish this section later)

===Unreal Tournament and other FSP Computer Games:===

I remember playing a little UT99 back in middle school, and thinking that it was a pretty kick-ass game. However, that was during the emergance of Counter-Strike as the #1 online game, so people around me wern't really paying much attention to UT. Counter-Strike was the first game I'd ever played on a LAN, and my experiance with it in the Computer Science classroom during lunchtime was something I have never since experianced. 20 people at computers arrainged in a squarish configuration, shouting back and forth at one another...good times...Even the girls, who usually seemed not terribly interested in FSP games, got into it as much as the guys did. This may sound perverted, but, it was really cool to kill someone in a game and know that you'd just outplayed and killed your friend across the room from you ;). No need to type text messages, no stupid voice-chat that makes everyone sound like a shitburger... Awesome...

===Mapping/Modding for UT:===

Currently I'm learning to code for UT2004, specifically, making weapons.

I am also working on a deathmatch map of my dorm. Thank god I got ahold of a digital camera for the textures...:)

Also, and probably the most interesting of all of these, I've got a concept for a CTF map (doesn't everyone :rolleyes:). I'm going to describe it here as soon as I can figure out how to communicate this concept without causing brain hemorrhaging in anyone who reads this :).

==Discussion==

'''SuperApe:''' Hi, Bob.  I've disabled the Category Category tag, as that should only be used to tag Category Pages.  This is a Category Personal Page; nothing more.  :)

'''Solid Snake:''' Nothing wrong with using ASM, but even so it's pretty hard to get into without some formal training.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1949</id>
      <timestamp>2006-10-22T22:42:57Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>Changes in my opinion twards various subjects. I  am a 19 year old sophomore now</comment>
      <text xml:space="preserve">Bob_The_Beheader

(This page is a work in progress)

===About Me:===

I'm 19 years old, and a sohomore at the University of Puget Sound, in Tacoma. I got into Unreal Tournament during the summer of '05. Anyways, Im an undeclared Computer Science major. Funny, because UPS is a liberal arts school. I thought that it would be a good idea to go into the CSCI field with some background in other stuff, too.

I have always wondered how programmers created the beautiful 3D world we see in video games. I got started programming with QBasic for DOS when I was about 12 (Because Object Oriented programming was way to advanced a concept for my 12 year old brain to grasp). Unfortunatly, this made it very difficult for me to pick up Object Oriented programmming later on, because I was trying to think about Objects and classes in terms of Procedural subroutines. Of course, it didn't help that I also started learning assembly language (see below). Anyways, I think that conceptually, modern video games, like UT, cannot be understood through procedural concepts. I nearly had a heart attack when I first looked at some UnrealScript, and tried to understand it with procedural concepts. :)

Now that I'm in college, and taking computer science classes (which I've got to be at in about 1/2 an hour) I finally understand Object Oriented programming. Yes! I am now housebroken of all the old school procedural Basic crap that I've been mired in for years! 

However, every time I start editing some UScript, I slowly become more frustrated with Java. Why can't Java do some of the stuff that UScript can do???

===Unreal Tournament and other FSP Computer Games:===

I remember playing a little UT99 back in middle school and thinking that it was a pretty kick-ass game. However, that was during the emergance of Counter-Strike as the #1 online game, so people around me wern't really paying much attention to UT. Counter-Strike was the first game I'd ever played on a LAN, and my experiance with it in the Computer Science classroom during lunchtime was something I have never since experianced. 20 people at computers arrainged in a squarish configuration, shouting back and forth at one another...good times...Even the girls, who usually seemed not terribly interested in FSP games, got into it as much as the guys did. This may sound perverted, but, it was really cool to kill someone in a game and know that you'd just outplayed and killed your friend across the room from you ;) I guess im not the first person to have said that. No need to type text messages, no stupid voice-chat that makes everyone sound like a shitburger... Awesome...

===Mapping/Modding for UT:===

Currently I'm learning to code for UT2004, specifically, making weapons.

Also, and probably the most interesting of all of these, I've got a concept for a CTF map. see [[Map

==Discussion==

'''SuperApe:''' Hi, Bob.  I've disabled the Category Category tag, as that should only be used to tag Category Pages.  This is a Category Personal Page; nothing more.  :)

'''Solid Snake:''' Nothing wrong with using ASM, but even so it's pretty hard to get into without some formal training.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Boff</title>
    <id>615</id>
    <revision>
      <id>1842</id>
      <timestamp>2006-12-20T09:24:15Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Restored</comment>
      <text xml:space="preserve">==Boff's Little Hole in the Ground...==

'''Boff:''' I will update this page but I don't have much time for blogs with my various other porjects and REAL LIFE interveneing (spelling?).

===Comments and Guestbook===

'''SuperApe:''' Welcome to the wiki. :)  Please make sure pages you add, especially class pages, have proper formatting and include all the important sub-sections.  (Note: [[Legacy:MiniAmmo|MiniAmmo]] already existed, but see some minor corrections to your [[Legacy:Miniammo|Miniammo]] page as an example.)  See also [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] and [[Legacy:Guidelines On Page Creation|Guidelines on Page Creation]].  Thanks for your help. :)

'''Tarquin:''' Hi Boff. Welcome to the wiki! *hands you the anti-goblin pills*

'''Boff:'''Thanks guys, the pills should help a little!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1843</id>
      <timestamp>2006-11-23T19:44:31Z</timestamp>
      <contributor>
        <ip>Client-82-20-0-138.brhm.adsl.virgin.net</ip>
      </contributor>
      <comment>Page restored</comment>
      <text xml:space="preserve">==Boff's Little Hole in the Ground...==

===Myself:===

I'm Boff, a small time amateur programmer by night and god knows what by day, I'm an insomniac so don't expect me to do anything during daylight hours. I've only been with UT since October 2005. I love retro-games (I still play the 

original DOOM, the sequels were so disappointing) so when a friend of mine showed me the original UT I had to get a copy. I found one on E-Bay and wasted no time setting up a league, more on that later. I'm a mapper by default 

but I am able to use Photoshop and I learn pretty quickly so if you want a texture artist or mapper that can work up to 18 hours a day without complaints then e-mail me at GVG at wowmail.com.

===GVG - My League:===

Green Versus Gold, my Unreal Tournament League. I set it up in October 2005 after I played a couple of hours on-line, with a little coercion I got eleven other friends into the game and now we game twice monthly in a big game through 

each game type, DM, TDM, CTF, DOM and AS with frenzied smaller DMs in the interval. I record each major game using the DEMOREC command on the console and we publish them amongst the league players, we even have our own forum as the 

Beyond Unreal Forums are on the banned list at college so we have to use our own. Upon stumbling upon UnrealEd on my HDD and learning the basics from Wolf I proceeded to build all the arenas for future GVG league fights. Take a look at 

the league site, I apologise for the Geocities but my wallet has a huge hole in it, sigh. www.gvg-ut.co.nr

====Pros of Mapping for a league:====

*I'm the only mapper among us so I get loads of cool ideas coming from active gamers.
*Input on my own designs from a community that is active rather than a couple of crusty other mappers that moan at every tiny little error.

====Cons of Mapping for a league:====

*Eleven players trying to get to the top of your to-do list, it grows 
  daily.*
*You get moaned at when the map crashes during net play and have to think fast to prevent yourself from being virus-ed into oblivion and all your precious work lost.
*There's no one to turn to if things go wrong as I am the only one... 

:sobs:

Over all its great because I get all the best ideas and my maps become dynamic, they literally change daily. I release a map on Monday and by Friday I have something that barely resembles the original. Also I have a fixed and 

varied Beta Testing base for my maps before they're released to the public, something I am yet to do.

===My purpose on the Wiki:===

Since Wolf taught me only the basics of map implementation I found you guys and downloaded the Offline Wiki. It has become my bible, Tarquin this was a great idea to set up, my compliments to yourself and Mychaeel for such an 

ambitious project. During my unwilling wakefulness when the Goblin has bitten me too many time I have read much of the old documentation, I salute you for sticking to the project through all that spamming, hacking and the Gobbo&amp;nbsp; 

knows what else (If you wondering what I'm talking about, in the Warhammer World a goblin is generally referred to as a Gobbo). I intend to see the entire UT Class tree documented and all UT documentation ordered, a mammoth 

goal for a Forum and Site admin that considers himself complete nOOb with everything, but I have a lot of time to spare and so I'll give it my best shot.

===WikiMarkup===

I'm still learning with this interesting little piece of an idea. I'll do my best but I keep messing it up. Sorry!

===Current Projects===

GVG - My online UnrealTournament league

===Comments and Guestbook===

'''SuperApe:''' Welcome to the wiki. :)  Please make sure pages you add, especially class pages, have proper formatting and include all the important sub-sections.  (Note: [[Legacy:MiniAmmo|MiniAmmo]] already existed, but see some minor corrections to your [[Legacy:Miniammo|Miniammo]] page as an example.)  See also [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] and [[Legacy:Guidelines On Page Creation|Guidelines on Page Creation]].  Thanks for your help. :)

'''Tarquin:''' Hi Boff. Welcome to the wiki! *hands you the anti-goblin pills*

'''Boff:'''Thanks guys, the pills should help a little!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1844</id>
      <timestamp>2006-12-19T23:11:05Z</timestamp>
      <contributor>
        <ip>Ool-45716451.dyn.optonline.net</ip>
      </contributor>
      <minor/>
      <comment>Unknown</comment>
      <text xml:space="preserve">I have to say your site is great

http://7387.4.1u05648d.info .

http://8987.4.qjo9ca.info .

http://8757.4.qjo9ca.info .

http://6996.4.v32ee09q.info .

http://2389.4.35k31ypm1.info .</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Boksha</title>
    <id>562</id>
    <revision>
      <id>1728</id>
      <timestamp>2004-07-19T13:54:05Z</timestamp>
      <contributor>
        <ip>Boksha</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">*Current projects: 
**Making a correctly working 2d scrolling platform game in UT2k4.
**Finish CTF map for beta testable version.

----

'''Wormbo:''' Welcome to the Wiki, Boksha. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Boksha:''' Whoah. I never even noticed this page. Darn. :P

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1729</id>
      <timestamp>2004-06-06T11:38:05Z</timestamp>
      <contributor>
        <ip>A80-126-143-193.adsl.xs4all.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Boksha:''' Whoah. I never even noticed this page. Darn. :P

'''Wormbo:''' Welcome to the Wiki, Boksha. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1730</id>
      <timestamp>2004-07-19T13:53:05Z</timestamp>
      <contributor>
        <ip>Boksha</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Current project: 

Making a correctly working 2d scrolling platform game in UT2k4.

Finish CTF map for beta testable version.

'''Wormbo:''' Welcome to the Wiki, Boksha. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Boksha:''' Whoah. I never even noticed this page. Darn. :P

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BombingRunSquadAI</title>
    <id>633</id>
    <revision>
      <id>1885</id>
      <timestamp>2006-01-04T00:30:40Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:SquadAI|SquadAI]] &gt;&gt; BombingRunSquadAI (Package: UnrealGame)}}

This class controls the Bot AI for the [[Legacy:XBombingRun|XBombingRun]] game type.

==Properties==

; [[Legacy:GameObject|GameObject]] Bomb : A reference to the xBombFlag in the game.
; [[Legacy:GameObject|GameObject]] BombBase : A reference to the [[Legacy:XBombSpawn|xBombSpawn]] object in the game. This is where the ball starts life.
; [[Legacy:GameObject|GameObject]] EnemyBase : A reference to the enemy base. If the squad is on blue team, this is the red teams' base. This is really an [[Legacy:XBombDelivery|xBombDelivery]].
; [[Legacy:GameObject|GameObject]] HomeBase : A reference to this squad's team base. This is really an [[Legacy:XBombDelivery|xBombDelivery]].
; float LastSeeFlagCarrier : The last time a bot on this squad saw the enemy holding the ball. Helps to deliver the &quot;Enemy ball carrier is here&quot; messages.
; [[Legacy:Bot|Bot]] PassTarget : The bot the ball will be passed to.
; float ScoringRand : A number used to help randomize the squad's actions if someone is holding the ball.
; [[Legacy:Bot|Bot]] SelfPasser : A reference to a bot who will be passing the ball to itself.
; class&lt;[[Legacy:ShootSpot|ShootSpot]]&gt; ShootSpotClass : Array of two references to a [[Legacy:RedShootSpot|RedShootSpot]] and [[Legacy:BlueShootSpot|BlueShootSpot]]. The red team looks for BlueShootSpots and vice versa.

==Functions==
; AssignCombo( [[Legacy:Bot|Bot]] B ) : Allow combo to be assigned unless GetOrders() returns &quot;Attack&quot;.
; bool AllowDetourTo( [[Legacy:Bot|Bot]] B, [[Legacy:NavigationPoint|NavigationPoint]] N ) : If the bot has the ball, never detour. Else only allow detours for health packs if in proximity.
; bool AllowImpactJumpBy( [[Legacy:Bot|Bot]] B ) : Overridden to not allow this when a bot has the ball.
; bool AllowTaunt( [[Legacy:Bot|Bot]] B ) : Allows taunt randomly about half the time when a bot is not busy with important things.
; bool AllowTranslocationBy( [[Legacy:Bot|Bot]] B ) : Doesn't allow bot to translocate when it has the ball.
; AssignCombo : Doesn't do combos while the squad is attacking.
; BombTakenBy( [[Legacy:Controller|Controller]] C ) : Sets squad leader to ball carrier and causes squad to converge on ball at adjusted speeds if they are headed that way.
; bool CheckSquadObjectives( [[Legacy:Bot|Bot]] B ) : The important part. Controls squad movements and actions. 
; Actor FormationCenter() : Causes squad to converge on whatever its objective is. If none, it will attempt to converge on the ball carrier. Worst case, it picks the squad leader as the target of convergence.
; bool GoPickupBomb( [[Legacy:Bot|Bot]] B ) : Does the mechanics of causing a bot to pick up the bomb if noone has it and it's close by.
; float ModifyThreat( float current, [[Legacy:Pawn|Pawn]] NewThreat, bool bThreatVisible, [[Legacy:Bot|Bot]] B ) : Adjusts threat level if it's the ball carrier and close to this squad's home base. Also adjusts level based on if controller is human controlled, etc.
; bool MustKeepEnemy( [[Legacy:Pawn|Pawn]] E ) : If the enemy is the bomb holder, keep after him at all cost.
; bool OrdersForBombCarrier( [[Legacy:Bot|Bot]] B ) : Helps the ball carrier decide what to do. It will try to use speed, pass the ball, etc.
; bool OverrideFollowPlayer( [[Legacy:Bot|Bot]] B ) : If Bomb is at home, return false.  If Bot B is near HomeBase, call and return TellBotHowToDisable(B).  Otherwise, return false.
; PassToSelf( [[Legacy:Bot|Bot]] B ) : Controls how a bot does a self-pass.
; bool PreferShootScore( [[Legacy:Bot|Bot]] B ) : Attempts to decide whether a bot should shoot the ball through the goal or run it in. Factors such as score, game time, and bot health are considered.
; byte PriorityObjective( [[Legacy:Bot|Bot]] B ) : If bot has the ball, bot has slightly elevated objective. If near enemy base, high priority is given. If the ball is being held by anyone, bot receives a priority objective of 1. Else it's zero. 
; Actor SetFacingActor( [[Legacy:Bot|Bot]] B ) : Helps bots point the right way when reaching nodes like ShootSpots if the bot has the ball.
; bool ShouldDeferTo( [[Legacy:Controller|Controller]] C ) : Always defer to the ball carrier.
; bool TryPassTo( vector V, [[Legacy:Bot|Bot]] CarrierBot, [[Legacy:Pawn|Pawn]] Recipient ) :

==Related Topics==
* [[Legacy:Mapping For BR|Mapping For BR]]
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Bot|Bot]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1886</id>
      <timestamp>2004-02-06T23:15:24Z</timestamp>
      <contributor>
        <ip>Off-Kilter</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:SquadAI|SquadAI]] &gt;&gt; BombingRunSquadAI}}

This class controls the bot AI for the [[Legacy:XBombingRun|XBombingRun]] game type.

==Properties==
; Bomb : A reference to the xBombFlag in the game.
; BombBase : A reference to the [[Legacy:XBombSpawn|xBombSpawn]] object in the game. This is where the ball starts life.
; EnemyBase : A reference to the enemy base. If the squad is on blue team, this is the red teams' base. This is really an [[Legacy:XBombDelivery|xBombDelivery]].
; HomeBase : A reference to this squad's team base. This is really an [[Legacy:XBombDelivery|xBombDelivery]].
; LastSeeFlagCarrier : The last time a bot on this squad saw the enemy holding the ball. Helps to deliver the &quot;Enemy ball carrier is here&quot; messages.
; PassTarget : The bot the ball will be passed to.
; ScoringRand : A number used to help randomize the squad's actions if someone is holding the ball.
; SelfPasser : A reference to a bot who will be passing the ball to itself.
; ShootSpotClass : Array of two references to a [[Legacy:RedShootSpot|RedShootSpot]] and [[Legacy:BlueShootSpot|BlueShootSpot]]. The red team looks for BlueShootSpots and vice versa.

==Methods==
; AllowDetourTo : If the bot has the ball, never detour. Else only allow detours for health packs if in proximity.
; AllowImpactJumpBy : Overridden to not allow this when a bot has the ball.
; AllowTaunt : Allows taunt randomly about half the time when a bot is not busy with important things.
; AllowTranslocationBy : Doesn't allow bot to translocate when it has the ball.
; AssignCombo : Doesn't do combos while the squad is attacking.
; BombTakenBy : Sets squad leader to ball carrier and causes squad to converge on ball at adjusted speeds if they are headed that way.
; CheckSquadObjectives : The important part. Controls squad movements and actions. 
; FormationCenter : Causes squad to converge on whatever its objective is. If none, it will attempt to converge on the ball carrier. Worst case, it picks the squad leader as the target of convergence.
; GoPickupBomb : Does the mechanics of causing a bot to pick up the bomb if noone has it and it's close by.
; ModifyThreat : Adjusts threat level if it's the ball carrier and close to this squad's home base. Also adjusts level based on if controller is human controlled, etc.
; MustKeepEnemy : If the enemy is the bomb holder, keep after him at all cost.
; OrdersForBombCarrier : Helps the ball carrier decide what to do. It will try to use speed, pass the ball, etc.
; PassToSelf : Controls how a bot does a self-pass.
; PreferShootScore : Attempts to decide whether a bot should shoot the ball through the goal or run it in. Factors such as score, game time, and bot health are considered.
; PriorityObjective : If bot has the ball, bot has slightly elevated objective. If near enemy base, high priority is given. If the ball is being held by anyone, bot receives a priority objective of 1. Else it's zero. 
; SetFacingActor : Helps bots point the right way when reaching nodes like ShootSpots if the bot has the ball.
; ShouldDeferTo : Always defer to the ball carrier.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1887</id>
      <timestamp>2006-01-04T00:29:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:SquadAI|SquadAI]] &gt;&gt; BombingRunSquadAI (Package: UnrealGame)}}

This class controls the Bot AI for the [[Legacy:XBombingRun|XBombingRun]] game type.

==Properties==
; [GameObject] Bomb : A reference to the xBombFlag in the game.
; [GameObject] BombBase : A reference to the [[Legacy:XBombSpawn|xBombSpawn]] object in the game. This is where the ball starts life.
; [GameObject] EnemyBase : A reference to the enemy base. If the squad is on blue team, this is the red teams' base. This is really an [[Legacy:XBombDelivery|xBombDelivery]].
; [GameObject] HomeBase : A reference to this squad's team base. This is really an [[Legacy:XBombDelivery|xBombDelivery]].
; float LastSeeFlagCarrier : The last time a bot on this squad saw the enemy holding the ball. Helps to deliver the &quot;Enemy ball carrier is here&quot; messages.
; [[Legacy:Bot|Bot]] PassTarget : The bot the ball will be passed to.
; float ScoringRand : A number used to help randomize the squad's actions if someone is holding the ball.
; [[Legacy:Bot|Bot]] SelfPasser : A reference to a bot who will be passing the ball to itself.
; class&lt;[[Legacy:ShootSpot|ShootSpot]]&gt; ShootSpotClass : Array of two references to a [[Legacy:RedShootSpot|RedShootSpot]] and [[Legacy:BlueShootSpot|BlueShootSpot]]. The red team looks for BlueShootSpots and vice versa.

==Functions==
; AssignCombo( [[Legacy:Bot|Bot]] B ) : Allow combo to be assigned unless GetOrders() returns &quot;Attack&quot;.
; bool AllowDetourTo( [[Legacy:Bot|Bot]] B, [[Legacy:NavigationPoint|NavigationPoint]] N ) : If the bot has the ball, never detour. Else only allow detours for health packs if in proximity.
; bool AllowImpactJumpBy( [[Legacy:Bot|Bot]] B ) : Overridden to not allow this when a bot has the ball.
; bool AllowTaunt( [[Legacy:Bot|Bot]] B ) : Allows taunt randomly about half the time when a bot is not busy with important things.
; bool AllowTranslocationBy( [[Legacy:Bot|Bot]] B ) : Doesn't allow bot to translocate when it has the ball.
; AssignCombo : Doesn't do combos while the squad is attacking.
; BombTakenBy( [[Legacy:Controller|Controller]] C ) : Sets squad leader to ball carrier and causes squad to converge on ball at adjusted speeds if they are headed that way.
; bool CheckSquadObjectives( [[Legacy:Bot|Bot]] B ) : The important part. Controls squad movements and actions. 
; Actor FormationCenter() : Causes squad to converge on whatever its objective is. If none, it will attempt to converge on the ball carrier. Worst case, it picks the squad leader as the target of convergence.
; bool GoPickupBomb( [[Legacy:Bot|Bot]] B ) : Does the mechanics of causing a bot to pick up the bomb if noone has it and it's close by.
; float ModifyThreat( float current, [[Legacy:Pawn|Pawn]] NewThreat, bool bThreatVisible, [[Legacy:Bot|Bot]] B ) : Adjusts threat level if it's the ball carrier and close to this squad's home base. Also adjusts level based on if controller is human controlled, etc.
; bool MustKeepEnemy( [[Legacy:Pawn|Pawn]] E ) : If the enemy is the bomb holder, keep after him at all cost.
; bool OrdersForBombCarrier( [[Legacy:Bot|Bot]] B ) : Helps the ball carrier decide what to do. It will try to use speed, pass the ball, etc.
; bool OverrideFollowPlayer( [[Legacy:Bot|Bot]] B ) : If Bomb is at home, return false.  If Bot B is near HomeBase, call and return TellBotHowToDisable(B).  Otherwise, return false.
; PassToSelf( [[Legacy:Bot|Bot]] B ) : Controls how a bot does a self-pass.
; bool PreferShootScore( [[Legacy:Bot|Bot]] B ) : Attempts to decide whether a bot should shoot the ball through the goal or run it in. Factors such as score, game time, and bot health are considered.
; byte PriorityObjective( [[Legacy:Bot|Bot]] B ) : If bot has the ball, bot has slightly elevated objective. If near enemy base, high priority is given. If the ball is being held by anyone, bot receives a priority objective of 1. Else it's zero. 
; Actor SetFacingActor( [[Legacy:Bot|Bot]] B ) : Helps bots point the right way when reaching nodes like ShootSpots if the bot has the ball.
; bool ShouldDeferTo( [[Legacy:Controller|Controller]] C ) : Always defer to the ball carrier.
; bool TryPassTo( vector V, [[Legacy:Bot|Bot]] CarrierBot, [[Legacy:Pawn|Pawn]] Recipient ) :

==Related Topics==
* [[Legacy:Mapping For BR|Mapping For BR]]
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Bot|Bot]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BombingRunTeamAI</title>
    <id>638</id>
    <revision>
      <id>1897</id>
      <timestamp>2005-12-03T00:22:23Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]]  &gt;&gt; [[Legacy:TeamAI|TeamAI]] &gt;&gt; BombingRunTeamAI}}

This class controls the team AI for the [[Legacy:XBombingRun|XBombingRun]] game type.

==Properties==
; Bomb : A reference to the [[Legacy:XBombFlag|Bomb]] in the current Bombing Run game.
; BombBase : A reference to the [[Legacy:XBombSpawn|Bomb Spawn]].
; EnemyBase : A reference to the opposing team's [[Legacy:XBombDelivery|Bomb Gate]].
; HomeBase : A reference to this team's  [[Legacy:XBombDelivery|Bomb Gate]].
; LastGotFlag

==Methods==
; AddSquadWithLeader :
; SetObjectiveLists :

==Related Topics==
* [[Legacy:BombingRunSquadAI|BombingRunSquadAI]]
* [[Legacy:Mapping For BR|Mapping For BR]]
* [[Legacy:Bot Support|Bot Support]]

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Fill in function definitions, including arguements, return variable types, etc.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1898</id>
      <timestamp>2004-02-06T23:12:34Z</timestamp>
      <contributor>
        <ip>Off-Kilter</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]]  &gt;&gt; [[Legacy:TeamAI|TeamAI]] &gt;&gt; BombingRunTeamAI}}

This class controls the team AI for the Bombing Run game type.

==Properties==
; Bomb : A reference to the [[Legacy:XBombFlag|Bomb]] in the current Bombing Run game.
; BombBase : A reference to the [[Legacy:XBombSpawn|Bomb Spawn]].
; EnemyBase : A reference to the opposing team's [[Legacy:XBombDelivery|Bomb Gate]].
; HomeBase : A reference to this team's  [[Legacy:XBombDelivery|Bomb Gate]].
; LastGotFlag

==Methods==
; AddSquadWithLeader
; SetObjectiveLists

==Related Classes==

[[Legacy:BombingRunSquadAI|BombingRunSquadAI]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1899</id>
      <timestamp>2004-02-06T23:15:03Z</timestamp>
      <contributor>
        <ip>Off-Kilter</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]]  &gt;&gt; [[Legacy:TeamAI|TeamAI]] &gt;&gt; BombingRunTeamAI}}

This class controls the team AI for the [[Legacy:XBombingRun|XBombingRun]] game type.

==Properties==
; Bomb : A reference to the [[Legacy:XBombFlag|Bomb]] in the current Bombing Run game.
; BombBase : A reference to the [[Legacy:XBombSpawn|Bomb Spawn]].
; EnemyBase : A reference to the opposing team's [[Legacy:XBombDelivery|Bomb Gate]].
; HomeBase : A reference to this team's  [[Legacy:XBombDelivery|Bomb Gate]].
; LastGotFlag

==Methods==
; AddSquadWithLeader
; SetObjectiveLists

==Related Classes==

[[Legacy:BombingRunSquadAI|BombingRunSquadAI]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bone Names</title>
    <id>581</id>
    <revision>
      <id>1772</id>
      <timestamp>2007-04-20T21:22:49Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Types of Bones==

Bones cause a lot of confusion among Unreal Engine modders (and possibly licensees too). Part of this is the naming scheme. There are 2 types of bones, which do not share names and are in no way related. The names of some coincide, but that does not indicate that they are the same bone, thus adding to the confusion. The two type of bones are [[Legacy:Skeletal Mesh|skeletal mesh]] animation bones and [[Legacy:Karma|Karma]] ragdoll bones. Ragdoll bones exist only in [[Legacy:UT2003|UT2003]]. 

; Skeletal Animation Bones: These are the bones used when creating skeletal animation to import via UnrealEd. These are the bones affected by PlayAnim and LoopAnim. These names can be viewed through the UnreadEd [[Legacy:Animation Browser|Animation Browser]] by clicking View -&gt; Bonenames.

; Karma Ragdoll Bones: These are the &quot;bone&quot; definitions used by the [[Legacy:Karma Ragdoll|Karma Ragdoll]] physics. They do not interact in any way with Skeletal Animation bones, however, they can interact to a limited extent with script bones. You can find the information on these bones in the .ka files in the KarmaData subdirectory of the directory in which UT2003 was installed. These files have some formatting but can be deciphered with relative ease.

==Skeletal Animation Bones==

'''Foxpaw:''' I vote that we break this into subpages - one subpage for each model, and it would include that model's Skeletal Animation Bones, Karma Ragdoll Bones, and known script bones.

====Jugg====

 Bip01
  +- Bip01 Pelvis
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Foot
      |           +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 L Foot
      |           +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      |   +- Bip01 Ponytail1
                      |       +- Bip01 Ponytail11
                      |           +- Bip01 Ponytail12
                      |               +- Bip01 Ponytail13
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm
                      |               +- Bip01 R Hand
                      |               +- Bone_weapon
                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand

====HumanFemaleA====

Note: The HumanMaleA is the same but without the ponytail bones.

 Bip01
  +- Bip01 Pelvis
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Foot
      |           +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 L Foot
      |           +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      |   +- Bip01 Ponytail1
                      |       +- Bip01 Ponytail11
                      |           +- Bip01 Ponytail12
                      |               +- Bip01 Ponytail13
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm

                      |               +- Bip01 R Hand
                      |                   +- Bip01 R Finger0
                      |                   +- Bone_weapon
                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand
                                          +- Bip01 L Finger0

====Bot====

 Bip01
  +- Bip01 Pelvis
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Foot
      |           +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 L Foot
      |           +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm
                      |               +- Bip01 R Hand
                      |                   +- Bip01 R Finger0
                      |                   |   +- Bip01 R Finger01
                      |                   |       +- Bip01 R Finger02
                      |                   +- Bone_weapon
                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand
                                          +- Bip01 L Finger0
                                              +- Bip01 L Finger01
                                                  +- Bip01 L Finger02

====Aliens====

 Bip01
  +- Bip01 Pelvis
      +- Bip01 Tail
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Horselink
      |           +- Bip01 R Foot
      |               +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 R Horselink
      |           +- Bip01 L Foot
      |               +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      |   +- Bip01 Ponytail1
                      |   |   +- Bip01 Ponytail11
                      |   |       +- Bip01 Ponytail12
                      |   |           +- Bip01 Ponytail13
                      |   +- Bone_Rtentacle1
                      |   |   +- Bone_Rtentacle2
                      |   |       +- Bone_Rtentacle3
                      |   +- Bone_Ltentacle1

                      |       +- Bone_Ltentacle2
                      |           +- Bone_Ltentacle3
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm
                      |               +- Bip01 R Hand
                      |                   +- Bip01 R Finger0
                      |                   +- Bone_weapon

                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand
                                          +- Bip01 L Finger0

==Karma Ragdoll Bones==

'''Foxpaw:''' Someone feel free to fill this in, or follow my suggestion above.

==Bones in UnrealScript==

Following section should be moved somewhere, eg [[Legacy:Attaching To Bones|Attaching To Bones]].

You can refer to individual bones using some native functions in UnrealScript. When referring to these bones, you can use the full name of the bone, though this works only for bones set up in the defaultproperties if the bone name has a space in it, in my experience. As an alternative, you can refer to a bone using it's '''attachalias.''' If the bone name does not have a space in it, you can just use the full name of the bone.

AttachAliases can be set up in the Animations browser in UnrealEd. Select the '''Mesh''' tab in the animation properties box to the right of the 3D pane of the animations browser. From there, expand '''attach''', and then expand '''sockets'''. This reveals a dynamic array of attachment information, including the attachaliases and some options for the facing of actor attached to that bone.

Here is an example of how to refer to bones in Unrealscript:

&lt;uscript&gt;
  // Substitite Actor for the actor you want to attach, and lfarm for the
  // attachalias or name of the bone you want to use.
  AttachToBone( Actor, 'lfarm' );

  // Use this to detach it from that bone. You do not need to specify what bone
  // it is attached to.
  DetachFromBone( Actor );
&lt;/uscript&gt;

==Comments==

'''Holim''' Then what about weapon bones? I've seen the bones used in the weapon animations except when you play the animations the links seem to be able to scale and move!? Is there any rigged weapon models out there in MAX format?

'''FrozenCow''' Bone_L_shoulder and Bone_R_shoulder of the Bot need to be Bone_Lshoulder and Bone_Rshoulder

'''Tarquin:''' if you're suggesting a correction, go ahead and make it in the page :)

'''MythOpus:''' Can anyone get the MONSTER bone names?

'''Wormbo:''' Those are no skeletal meshes, so they don't have any bone names.

'''Newbie:''' Yes, vehicles and monsters have no bones. Only players. (Kinda makes sense dont it :P) I also fixed Bone_L_shoulder and Bone_R_shoulder to Bone_Lshoulder and Bone_Rshoulder.

'''Wormbo:''' Actually, [[Legacy:SVehicle|SVehicle]]s do have bones for wheels, turrets etc.

'''MythOpus:''' Well that just sucks!  I was all pumped up to attach emitters to them after I saw that they sub-classed xPawn... so how can I attach an emitter to a monster without attaching it to a specific bone and have it follow it around?

'''Ass2iN:''' Yea, Wormbo was right SVehicles do have bones. Mythopus I have no idea how you could attatch an emitter to a monster without bones. Sry :(

'''Lilguy:''' You could always use SetBase() but that won't let you attach it to something like a foot that moves around very much; It will always have the same relative offset. That might be good enough, but it'll look funny if you tried to do something like attach a piece of armor or something, since the attachment won't keep up with the animation.

'''LionsPhil:''' Which are the karma bones? The .ka files are (invalid &amp;ndash; multiple duplicate IDs) XML, and each asset entity has 'geometry', 'model', 'part' (I suspect it's this one, after poking KAT), 'no_collision' (ok, it isn't this one ;) ) and 'joint' (nor this) entities. Annoyingly, all have IDs containing spaces, yet actors which use these bone names such as [[Legacy:KConstraint|KConstraint]] define the type of arguments such as &lt;code&gt;KConstraintBone1&lt;/code&gt; as &lt;code&gt;name&lt;/code&gt;, and UnrealEd refuses to keep spaces in these values (or any characters after the first space).

'''Switch`:''' Names with spaces need double quotes.

'''LionsPhil:''' *slaps forehead* Thanks...I ''really'' should have thought of that...

'''Guest:'''(TurkeyFromHell) Would it be possible to determine the nearest bone that a projectile would hit on impact? ok so that wasnt a good way to word that, here's a better way to put it: projectile hits the player -&gt; how would i figure out which bone(s) of the mesh it would hit? is there a way to determine the nearest bone to the vector HitLocation?

'''EricBlade:''' UT04 has a function &quot;GetNearestBone&quot; or something similar.  '03 may have had it, but it doesn't appear to be a part of the stock engine in 2226, as my game is missing it, and has to calculate it on it's own. :(</text>
    </revision>
    <revision>
      <id>1773</id>
      <timestamp>2007-04-16T00:11:09Z</timestamp>
      <contributor>
        <ip>C-71-62-144-202.hsd1.va.comcast.net</ip>
      </contributor>
      <comment>question about projectile/bones</comment>
      <text xml:space="preserve">==Types of Bones==

Bones cause a lot of confusion among Unreal Engine modders (and possibly licensees too). Part of this is the naming scheme. There are 2 types of bones, which do not share names and are in no way related. The names of some coincide, but that does not indicate that they are the same bone, thus adding to the confusion. The two type of bones are [[Legacy:Skeletal Mesh|skeletal mesh]] animation bones and [[Legacy:Karma|Karma]] ragdoll bones. Ragdoll bones exist only in [[Legacy:UT2003|UT2003]]. 

; Skeletal Animation Bones: These are the bones used when creating skeletal animation to import via UnrealEd. These are the bones affected by PlayAnim and LoopAnim. These names can be viewed through the UnreadEd [[Legacy:Animation Browser|Animation Browser]] by clicking View -&gt; Bonenames.

; Karma Ragdoll Bones: These are the &quot;bone&quot; definitions used by the [[Legacy:Karma Ragdoll|Karma Ragdoll]] physics. They do not interact in any way with Skeletal Animation bones, however, they can interact to a limited extent with script bones. You can find the information on these bones in the .ka files in the KarmaData subdirectory of the directory in which UT2003 was installed. These files have some formatting but can be deciphered with relative ease.

==Skeletal Animation Bones==

'''Foxpaw:''' I vote that we break this into subpages - one subpage for each model, and it would include that model's Skeletal Animation Bones, Karma Ragdoll Bones, and known script bones.

====Jugg====

 Bip01
  +- Bip01 Pelvis
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Foot
      |           +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 L Foot
      |           +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      |   +- Bip01 Ponytail1
                      |       +- Bip01 Ponytail11
                      |           +- Bip01 Ponytail12
                      |               +- Bip01 Ponytail13
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm
                      |               +- Bip01 R Hand
                      |               +- Bone_weapon
                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand

====HumanFemaleA====

Note: The HumanMaleA is the same but without the ponytail bones.

 Bip01
  +- Bip01 Pelvis
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Foot
      |           +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 L Foot
      |           +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      |   +- Bip01 Ponytail1
                      |       +- Bip01 Ponytail11
                      |           +- Bip01 Ponytail12
                      |               +- Bip01 Ponytail13
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm

                      |               +- Bip01 R Hand
                      |                   +- Bip01 R Finger0
                      |                   +- Bone_weapon
                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand
                                          +- Bip01 L Finger0

====Bot====

 Bip01
  +- Bip01 Pelvis
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Foot
      |           +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 L Foot
      |           +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm
                      |               +- Bip01 R Hand
                      |                   +- Bip01 R Finger0
                      |                   |   +- Bip01 R Finger01
                      |                   |       +- Bip01 R Finger02
                      |                   +- Bone_weapon
                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand
                                          +- Bip01 L Finger0
                                              +- Bip01 L Finger01
                                                  +- Bip01 L Finger02

====Aliens====

 Bip01
  +- Bip01 Pelvis
      +- Bip01 Tail
      +- Bip01 R Thigh
      |   +- Bip01 R Calf
      |       +- Bip01 R Horselink
      |           +- Bip01 R Foot
      |               +- Bip01 R Toe0
      +- Bip01 L Thigh
      |   +- Bip01 L Calf
      |       +- Bip01 R Horselink
      |           +- Bip01 L Foot
      |               +- Bip01 L Toe0
      +- Bip01 Spine
          +- Bip01 Spine1
              +- Bip01 Spine2
                  +- Bip01 Neck
                      +- Bip01 Head
                      |   +- Bip01 Ponytail1
                      |   |   +- Bip01 Ponytail11
                      |   |       +- Bip01 Ponytail12
                      |   |           +- Bip01 Ponytail13
                      |   +- Bone_Rtentacle1
                      |   |   +- Bone_Rtentacle2
                      |   |       +- Bone_Rtentacle3
                      |   +- Bone_Ltentacle1

                      |       +- Bone_Ltentacle2
                      |           +- Bone_Ltentacle3
                      +- Bip01 R Clavicle
                      |   +- Bone_Rshoulder
                      |       +- Bip01 R Upperarm
                      |           +- Bip01 R Forearm
                      |               +- Bip01 R Hand
                      |                   +- Bip01 R Finger0
                      |                   +- Bone_weapon

                      +- Bip01 L Clavicle
                          +- Bone_Lshoulder
                              +- Bip01 L Upperarm
                                  +- Bip01 L Forearm
                                      +- Bip01 L Hand
                                          +- Bip01 L Finger0

==Karma Ragdoll Bones==

'''Foxpaw:''' Someone feel free to fill this in, or follow my suggestion above.

==Bones in UnrealScript==

Following section should be moved somewhere, eg [[Legacy:Attaching To Bones|Attaching To Bones]].

You can refer to individual bones using some native functions in UnrealScript. When referring to these bones, you can use the full name of the bone, though this works only for bones set up in the defaultproperties if the bone name has a space in it, in my experience. As an alternative, you can refer to a bone using it's '''attachalias.''' If the bone name does not have a space in it, you can just use the full name of the bone.

AttachAliases can be set up in the Animations browser in UnrealEd. Select the '''Mesh''' tab in the animation properties box to the right of the 3D pane of the animations browser. From there, expand '''attach''', and then expand '''sockets'''. This reveals a dynamic array of attachment information, including the attachaliases and some options for the facing of actor attached to that bone.

Here is an example of how to refer to bones in Unrealscript:

&lt;uscript&gt;
  // Substitite Actor for the actor you want to attach, and lfarm for the
  // attachalias or name of the bone you want to use.
  AttachToBone( Actor, 'lfarm' );

  // Use this to detach it from that bone. You do not need to specify what bone
  // it is attached to.
  DetachFromBone( Actor );
&lt;/uscript&gt;

==Comments==

'''Holim''' Then what about weapon bones? I've seen the bones used in the weapon animations except when you play the animations the links seem to be able to scale and move!? Is there any rigged weapon models out there in MAX format?

'''FrozenCow''' Bone_L_shoulder and Bone_R_shoulder of the Bot need to be Bone_Lshoulder and Bone_Rshoulder

'''Tarquin:''' if you're suggesting a correction, go ahead and make it in the page :)

'''MythOpus:''' Can anyone get the MONSTER bone names?

'''Wormbo:''' Those are no skeletal meshes, so they don't have any bone names.

'''Newbie:''' Yes, vehicles and monsters have no bones. Only players. (Kinda makes sense dont it :P) I also fixed Bone_L_shoulder and Bone_R_shoulder to Bone_Lshoulder and Bone_Rshoulder.

'''Wormbo:''' Actually, [[Legacy:SVehicle|SVehicle]]s do have bones for wheels, turrets etc.

'''MythOpus:''' Well that just sucks!  I was all pumped up to attach emitters to them after I saw that they sub-classed xPawn... so how can I attach an emitter to a monster without attaching it to a specific bone and have it follow it around?

'''Ass2iN:''' Yea, Wormbo was right SVehicles do have bones. Mythopus I have no idea how you could attatch an emitter to a monster without bones. Sry :(

'''Lilguy:''' You could always use SetBase() but that won't let you attach it to something like a foot that moves around very much; It will always have the same relative offset. That might be good enough, but it'll look funny if you tried to do something like attach a piece of armor or something, since the attachment won't keep up with the animation.

'''LionsPhil:''' Which are the karma bones? The .ka files are (invalid &amp;ndash; multiple duplicate IDs) XML, and each asset entity has 'geometry', 'model', 'part' (I suspect it's this one, after poking KAT), 'no_collision' (ok, it isn't this one ;) ) and 'joint' (nor this) entities. Annoyingly, all have IDs containing spaces, yet actors which use these bone names such as [[Legacy:KConstraint|KConstraint]] define the type of arguments such as &lt;code&gt;KConstraintBone1&lt;/code&gt; as &lt;code&gt;name&lt;/code&gt;, and UnrealEd refuses to keep spaces in these values (or any characters after the first space).

'''Switch`:''' Names with spaces need double quotes.

'''LionsPhil:''' *slaps forehead* Thanks...I ''really'' should have thought of that...

'''Guest:'''(TurkeyFromHell) Would it be possible to determine the nearest bone that a projectile would hit on impact? ok so that wasnt a good way to word that, here's a better way to put it: projectile hits the player -&gt; how would i figure out which bone(s) of the mesh it would hit? is there a way to determine the nearest bone to the vector HitLocation?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bonehed316</title>
    <id>657</id>
    <revision>
      <id>1937</id>
      <timestamp>2005-06-22T00:10:26Z</timestamp>
      <contributor>
        <ip>Bonehed316</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====First article/code sample====

[[Legacy:Bonehed316/ShadowSource|ShadowSource]]

====Intro====

Well, since my mod has shut down shop (*sniff*), and since it is summer and I currently have nothing that resembles a life (for various reasons I won't discuss), I've decided to go ahead and make a wiki page to share code samples which I have created over the years, possibly some tutorials or something.  Who knows.  Or maybe I'll just forget about it and this will be the end of it, lol.  

Once I get some useful content lined up, I will probably make some modifications here.  In the mean time, I will post a bit about myself and my experiences, for anyone who might not already know (which is probably most people).

My first experience with UT development was mapping.  Why, I dont know.  Probably because I have always been artistic (believe it or not) and so it only seemed natural to begin level design.  I followed the tutorials at [http://www.planetunreal.com/architectonic/ PU].  I vaguely remember the experience now, but I know that it was fun, and appealed to me.  Later I followed some of Angel Mapper's tutorials, which have helped tons of people.  Later on I got to help her out with uscript (a little bit), which is great (makes you feel all warm and fuzzy inside :)).  My first attempts at mapping were..lackluster at best.  I was one of those who attempted to make &quot;another deck16 remake&quot; to which I will never speak of again.  The BSP was horrid, the design sucked (but was true to the original, sort of), and all of that good stuff.  I'm proud of Teddie for making his Deck17 so great.  Speaking of whom, where has he gone?  Is he alive?  I hope his family is well.

Anywho, next I moved on to Viridian 2003.  I would like to take what credit there is to take for myself, but an Atari forum member named GUI was a big inspiration to the design of the map (dont confuse my suckyness with his skill).  However, a lot of people apparently enjoy the map, which can be found in various locations, such as [http://www.fasterfiles.com/pafiledb.php?action=file&amp;id=492 Faster Files].

After that I started learning to model, which I found substantially more difficult than it was worth (probably due to me over thinking).  I subsequently stopped modeling, and thus quit mapping (the two seem to go together to me).  Besides, I was becoming a decent programmer.

Speaking of programming, uscript was my first language.  Actually, Java was my FIRST language, but I learned uscript concurrently, and have since forgotten 99% of what little I learned of java.  No offense to java programmers, but I cant find a use for java outside of the internet.  My first project in uscript was a flag mutator for UT99, which modified the flag textures to be custom for our servers.  It was pretty hard at the time, but looking back it was really very simple (and my implementation sucked, heh).  

My next venture was in to cheat protection for UT99.  I wrote a custom cheat protection for our server (I was co-admin).  The protection was pretty decent, but I'll admit that at first I had no idea what I was doing.  Once I had everything figured out, it was a different story, however.  I dont want to get in to any specifics here, however.

At the same time, I developed a VB.NET program (yeah, I know) to parse the server log for entries related to my protection, so that the events could be stored in a database and sorted by player or IP, enabling admins to track and manage player's activities more easily, without having to sift through thousands of lines of log, which REALLY isnt fun.  Later I ported the program to C++.  Actually, it was managed c++, (.NET), so it wasnt really that hard, lol.  Most of the UI was copy/paste back into Visual Studio, and the code porting was fairly easy.  The hardest part was the if statement, in VB you type &quot;If&quot; and in c++ its &quot;if&quot; and every time I went to change it, I kept typing &quot;ff&quot; (changing the I to an f).  I repeated this mistake almost EVERY TIME, lol.  I blame the right half of my brain being bored and messing with me by manipulating my left hand to type an f instead of an i.  It does that from time to time.  Never fun when you're driving home...

Moving on, lol.  I also made a modified MapVote mutator for UT99, called x3dfxMapVote, which apparently is pretty popular.  It adds 8 programmable buttons to the UI to  allow you to vote for mutator configurations (set by the admin), as well as the normal voting for which map.  Some other small changes have been made to the code, including some minor replication fixes, but no other major changes.  I still support it (although the feedback I get is few and far between, so bug fixes usually take ages).  You can find news and updates on the [http://forums.beyondunreal.com/showthread.php?p=1836850 Post in BDB's forum] which he made sticky. :)  I do give out the source to anyone who asks, incase there are bugs or..whatever.  There are probably lots of bugs, lol.  Most of which may never get fixed because I dont know they exist.  :rolleyes:

After the UT99 hacks got out of conrol, I decided to throw in the towel and move to UT2004.  I had no experience with the game (except mapping for UT2003, which was a big help, but I sucked).  So to get my feet wet, I decided to join a Mod.  I found a recruiting post for [http://www.edeneclipse.com Eden Eclipse], and sent them a mail to apply.  They got back to me, and asked what I wanted to do.  I started to become an LD, but upon realizing (again) that I suck, I decided to try to join as a programmer, lol.  That worked out very well.  Within a month or so I was the Lead (not to brag, but that's pretty good!).  Actually, I was the only one willing to do the work of lead, and the current lead was leaving, lol.  But still...

Anyway, so that's where I've been for a little over a year now.  We produced a demo (two versions) for the MSUC contest, we were even finalists in phase 4, which we are very proud of.  The mod, however, was too big, and lacked reliable people, and so we werent able to develop everything as much as we had hoped.  After much struggle, the project has been put aside (until it can be completed properly).  Most of the core members will probably stick together.  I may follow them, I'm not really sure just yet.  Doing so would involve switching to the Doom3 engine, or whichever is decided.  Not sure I want to do that, but who knows?

So anyway, being a part of a single player mod gives you a lot of experience (especially when you're the lead and doing a large portion of the work).  I dont take credit for all of the code, as I had a lot of help from some really great people.

Recently I have begun making my own game engine in c++ (unmanaged, real c++) and directx9 (also unmanaged), which maybe I will talk about here later on.  There isn't much to it yet, as I'm still trying to get my head around the whole thing at once (which is very painful, really).  Once I get something decent, I might post samples.  

So while I have some free time, I figure I might as well do something useful with it (right?).  Anyway, I've written more here than I expected to.  I'm pretty wordy usually, and my posts turn into essays pretty fast, lol.  

===Comments===

'''MythOpus:''' Welcome To The Wiki :D

'''Blueneptune:''' Hey Bonehead316!  You remember me, right?  Of course you do; I'm your favorite AI coder :D  Good to see you're still in the business ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1938</id>
      <timestamp>2005-06-20T01:30:57Z</timestamp>
      <contributor>
        <ip>Blueneptune</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well, since my mod has shut down shop (*sniff*), and since it is summer and I currently have nothing that resembles a life (for various reasons I won't discuss), I've decided to go ahead and make a wiki page to share code samples which I have created over the years, possibly some tutorials or something.  Who knows.  Or maybe I'll just forget about it and this will be the end of it, lol.  

Once I get some useful content lined up, I will probably make some modifications here.  In the mean time, I will post a bit about myself and my experiences, for anyone who might not already know (which is probably most people).

My first experience with UT development was mapping.  Why, I dont know.  Probably because I have always been artistic (believe it or not) and so it only seemed natural to begin level design.  I followed the tutorials at [http://www.planetunreal.com/architectonic/ PU].  I vaguely remember the experience now, but I know that it was fun, and appealed to me.  Later I followed some of Angel Mapper's tutorials, which have helped tons of people.  Later on I got to help her out with uscript (a little bit), which is great (makes you feel all warm and fuzzy inside :)).  My first attempts at mapping were..lackluster at best.  I was one of those who attempted to make &quot;another deck16 remake&quot; to which I will never speak of again.  The BSP was horrid, the design sucked (but was true to the original, sort of), and all of that good stuff.  I'm proud of Teddie for making his Deck17 so great.  Speaking of whom, where has he gone?  Is he alive?  I hope his family is well.

Anywho, next I moved on to Viridian 2003.  I would like to take what credit there is to take for myself, but an Atari forum member named GUI was a big inspiration to the design of the map (dont confuse my suckyness with his skill).  However, a lot of people apparently enjoy the map, which can be found in various locations, such as [http://www.fasterfiles.com/pafiledb.php?action=file&amp;id=492 Faster Files].

After that I started learning to model, which I found substantially more difficult than it was worth (probably due to me over thinking).  I subsequently stopped modeling, and thus quit mapping (the two seem to go together to me).  Besides, I was becoming a decent programmer.

Speaking of programming, uscript was my first language.  Actually, Java was my FIRST language, but I learned uscript concurrently, and have since forgotten 99% of what little I learned of java.  No offense to java programmers, but I cant find a use for java outside of the internet.  My first project in uscript was a flag mutator for UT99, which modified the flag textures to be custom for our servers.  It was pretty hard at the time, but looking back it was really very simple (and my implementation sucked, heh).  

My next venture was in to cheat protection for UT99.  I wrote a custom cheat protection for our server (I was co-admin).  The protection was pretty decent, but I'll admit that at first I had no idea what I was doing.  Once I had everything figured out, it was a different story, however.  I dont want to get in to any specifics here, however.

At the same time, I developed a VB.NET program (yeah, I know) to parse the server log for entries related to my protection, so that the events could be stored in a database and sorted by player or IP, enabling admins to track and manage player's activities more easily, without having to sift through thousands of lines of log, which REALLY isnt fun.  Later I ported the program to C++.  Actually, it was managed c++, (.NET), so it wasnt really that hard, lol.  Most of the UI was copy/paste back into Visual Studio, and the code porting was fairly easy.  The hardest part was the if statement, in VB you type &quot;If&quot; and in c++ its &quot;if&quot; and every time I went to change it, I kept typing &quot;ff&quot; (changing the I to an f).  I repeated this mistake almost EVERY TIME, lol.  I blame the right half of my brain being bored and messing with me by manipulating my left hand to type an f instead of an i.  It does that from time to time.  Never fun when you're driving home...

Moving on, lol.  I also made a modified MapVote mutator for UT99, called x3dfxMapVote, which apparently is pretty popular.  It adds 8 programmable buttons to the UI to  allow you to vote for mutator configurations (set by the admin), as well as the normal voting for which map.  Some other small changes have been made to the code, including some minor replication fixes, but no other major changes.  I still support it (although the feedback I get is few and far between, so bug fixes usually take ages).  You can find news and updates on the [http://forums.beyondunreal.com/showthread.php?p=1836850 Post in BDB's forum] which he made sticky. :)  I do give out the source to anyone who asks, incase there are bugs or..whatever.  There are probably lots of bugs, lol.  Most of which may never get fixed because I dont know they exist.  :rolleyes:

After the UT99 hacks got out of conrol, I decided to throw in the towel and move to UT2004.  I had no experience with the game (except mapping for UT2003, which was a big help, but I sucked).  So to get my feet wet, I decided to join a Mod.  I found a recruiting post for [http://www.edeneclipse.com Eden Eclipse], and sent them a mail to apply.  They got back to me, and asked what I wanted to do.  I started to become an LD, but upon realizing (again) that I suck, I decided to try to join as a programmer, lol.  That worked out very well.  Within a month or so I was the Lead (not to brag, but that's pretty good!).  Actually, I was the only one willing to do the work of lead, and the current lead was leaving, lol.  But still...

Anyway, so that's where I've been for a little over a year now.  We produced a demo (two versions) for the MSUC contest, we were even finalists in phase 4, which we are very proud of.  The mod, however, was too big, and lacked reliable people, and so we werent able to develop everything as much as we had hoped.  After much struggle, the project has been put aside (until it can be completed properly).  Most of the core members will probably stick together.  I may follow them, I'm not really sure just yet.  Doing so would involve switching to the Doom3 engine, or whichever is decided.  Not sure I want to do that, but who knows?

So anyway, being a part of a single player mod gives you a lot of experience (especially when you're the lead and doing a large portion of the work).  I dont take credit for all of the code, as I had a lot of help from some really great people.

Recently I have begun making my own game engine in c++ (unmanaged, real c++) and directx9 (also unmanaged), which maybe I will talk about here later on.  There isn't much to it yet, as I'm still trying to get my head around the whole thing at once (which is very painful, really).  Once I get something decent, I might post samples.  

So while I have some free time, I figure I might as well do something useful with it (right?).  Anyway, I've written more here than I expected to.  I'm pretty wordy usually, and my posts turn into essays pretty fast, lol.  

===Comments===

'''MythOpus:''' Welcome To The Wiki :D

'''Blueneptune:''' Hey Bonehead316!  You remember me, right?  Of course you do; I'm your favorite AI coder :D  Good to see you're still in the business ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bonehed316/ShadowSource</title>
    <id>658</id>
    <revision>
      <id>1939</id>
      <timestamp>2005-06-25T05:15:48Z</timestamp>
      <contributor>
        <ip>Bonehed316</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">As many others have done, I have created some form of shadows using projectors.  There are other methods, including SquirrelZero's [[Legacy:SquirrelZero/RealtimeShadows|RealtimeShadows]], which are good indeed, but the workload is per pawn, and performed each tick, and therefor is, and will always be, very slow. 

Next there is a method, which is very similar to my own, called [[Legacy:Sourced_Player_Shadows|Sourced_Player_Shadows]].  There are also some others, but I cant find the links right off hand, and I'm sure there are some which I've never thought of myself.  I am not familiar with other methods, so I will not comment on them, nor compare directly with any of them.

The method I worked on, which is by no means a superb solution, is to use an actor I call a ShadowSource to handle attaching and detaching shadow projectors, and also act as a &quot;source&quot; of the shadow itself.  It uses the Touch() and UnTouch() functions to spawn and destroy shadow projectors.  The projectors use a reference to the ShadowSource as a location from which the shadow should be cast.  A level designer would place these ShadowSources wherever a static mesh that represents a light source exists, and the code will take care of the rest.

Once the idea is down, the code here is trivial: 

&lt;uscript&gt;
class ShadowSource extends Actor
	placeable;

var class&lt;ShadowBitmapMaterial&gt; TextureDetailClass;
var array&lt;DynamicShadow&gt; Shadows;

var() enum EShadowDetail        // shadow detail level
{
	SD_Low,                 // 64x64
	SD_Medium,              // 128x128
	SD_High,                // 256x256
	SD_Highest,             // 512x512
} ShadowDetail;

var() DynamicShadow.EShadowEffect ShadowEffect;		// the type of light effect for this shadow
var() int MaxFOV;					// adjusts rotation to compensate for FOV
var() float FOVScale;					// scales FOV to change the size of the shadow
var() int MaxTraceDistance;				// how far the projector can draw
var(ShadowSourceEffect) float PhaseScale;		// used to control light effects, result may vary depending on the effect used

// fire effect specific variables
var(ShadowSourceEffect) int FireFlickerMagnitude;	// how far the fire flicker is allowed to move
var(ShadowSourceEffect) int FireFlickerSpeed;		// how fast the shadow moves

// Initialize anything
event PostBeginPlay()
{
	GetShadowTexture();
}

// sets the shadow texture depending on the selected detail setting
// each class is simply a subclass of ShadowBitmapMaterial with a different USize and VSize
function GetShadowTexture()
{
	Switch(ShadowDetail)
	{
		case SD_Low: TextureDetailClass = Class'ShadowDetailLow'; break;
		case SD_Medium: TextureDetailClass = Class'ShadowDetailMedium';break;
		case SD_High:   TextureDetailClass = Class'ShadowDetailHigh';break;
		case SD_Highest: TextureDetailClass = Class'ShadowDetailHighest'; break;
		default: TextureDetailClass = Class'ShadowDetailLow'; break;
	}
}

function DynamicShadow SpawnShadow(Pawn P)
{
	local DynamicShadow DynamicShadow;

	DynamicShadow = Spawn(class'DynamicShadow',self,,P.Location);
	if (DynamicShadow != None)
	{
		DynamicShadow.ShadowActor = P;
		DynamicShadow.Instigator = P;
		DynamicShadow.ShadowEffect = ShadowEffect;
		DynamicShadow.FireFlickerMagnitude = FireFlickerMagnitude;
		DynamicShadow.FireFlickerSpeed = FireFlickerSpeed;
		DynamicShadow.PhaseScale = PhaseScale;
		DynamicShadow.bBlobShadow = False;
		DynamicShadow.FOVScale = FOVScale;
		DynamicShadow.MaxFOV = MaxFOV;
		DynamicShadow.MaxTraceDistance = MaxTraceDistance;
		DynamicShadow.ShadowTexture = ShadowBitmapMaterial( Level.ObjectPool.AllocateObject(TextureDetailClass) );
		DynamicShadow.InitShadow();
	}
	return DynamicShadow;
}

// pawns are given a shadow when they touch
event Touch(Actor Other)
{
	if (Pawn(Other) != None)
		Shadows[Shadows.Length] = SpawnShadow(Pawn(Other));
}

// pawns are removed from the shadow list when they untouch, and the shadow is destroyed
event UnTouch(Actor Other)
{
	local int i;

	if (Pawn(Other) != None)
	{
		i = GetShadowIndex(Other);
		if (i &gt; -1)
		{
			Shadows[i].Destroy();
			Shadows.Remove(i,1);
		}
	}
}

// returns the index of an actor within the shadow array
function int GetShadowIndex(Actor A)
{
	local int i;

	for (i=0;i&lt;Shadows.Length;++i)
	{
		if (Shadows[i].ShadowActor == A)
			return i;
	}
	return -1;
}

defaultproperties
{
	bHidden=True
	ShadowDetail=SD_Medium
	ShadowEffect=SE_Normal

	FireFlickerMagnitude=60
	FireFlickerSpeed=20
	PhaseScale=0.5
	MaxFOV=70
	FOVScale=0.9
	MaxTraceDistance=1000

	bCollideActors=True
	bUseCylinderCollision=True
	CollisionHeight=500
	CollisionRadius=500
}
&lt;/uscript&gt;

The key here is that the CollisionHeight and CollisionRadius are what effect how close to the source you have to be to recieve a shadow from it.  Adjusting this radius is important to the concept.  Basic projector properties can be controlled with the exposed variables, and more can be added easily, and subclasses of ShadowSource can be created which have even more functionality, if that is the method you prefer.

As you can see, the real magic is all in the projector class.  The beauty is that the projector draws itself, from the location of the ShadowSource that owns it.  This way, the overhead of sorting lights and shadow projectors is eliminated.  The projector simply draws until it is destroyed.

The projector is listed here:

&lt;uscript&gt;
class DynamicShadow extends ShadowProjector;

// various shadow effects can exist here
var enum EShadowEffect
{
	SE_Normal,
	SE_Fire,
} ShadowEffect;

// these are set by the shadow source
var int FireFlickerMagnitude;
var int FireFlickerSpeed;
var int MaxFOV;
var float PhaseScale, FOVScale;

//hack for interpolating crouch distance over time when pawn stands up again
var float crouchtime;
var vector CurrentFirePos, TargetFirePos;
var array&lt;vector&gt; FirePositions;

// This must be called by the ShadowSource to initialize the projector to start drawing
function InitShadow()
{
	if (ShadowActor != None)
	{
		ShadowTexture.bBlobShadow = bBlobShadow;
		ShadowTexture.ShadowActor = ShadowActor;
		ProjTexture = ShadowTexture;

		if (ProjTexture != None)
		{
			// UpdateShadows is time driven, to allow shadow animating
			UpdateShadows(0.03);  // start the shadow rendering, and enable tick
			Enable('Tick');
		}
		// timer is used for fire effect, but could be used for others as well, so 
		// we start it up here as well
		SetTimer(FRand(),true);
	}
}

event Destroyed()
{
	if (ShadowTexture != None)
	{
		ShadowTexture.ShadowActor = None;

		if (!ShadowTexture.Invalid)
			Level.ObjectPool.FreeObject(ShadowTexture);

		ShadowTexture = None;
		ProjTexture = None;
	}

	Super.Destroyed();
}

event Tick(float dt)
{
	UpdateShadows(dt);
}

function Timer()
{
	if(ShadowEffect == SE_Fire)
	{
		// random target positions for fire flicker, and random timer rate
		TargetFirePos = FirePositions[Rand(FirePositions.Length)] * Rand(FireFlickerMagnitude);
		TimerRate = FRand() * PhaseScale;
	}
	else
		bTimerLoop=False;       // disable timer loop for non-effect shadows

}

// we use our own update shadow function
function UpdateShadow();

// updates location, rotation, and FOV
function UpdateShadows(float dt)
{
	local vector Diff, ShadowLocation, RandVec, instloc;
	local rotator AdjustedRotation;
	local Plane BoundingSphere;

	DetachProjector(True);

	// check to make sure we should draw, maybe this should also destroy the projector
	if (Instigator.bHidden || !bShadowActive || ShadowTexture == None || Instigator == None)
		return;

	instloc = Instigator.Location;

	// hack for fixing shadow detaching from pawn when crouching
	// crouchheight based on anim time, values may vary
	if (Instigator.bIsCrouched)
		crouchtime = FMin(crouchtime+dt*5,0.5);
	else if (crouchtime &gt; 0.0)
		crouchtime -= dt*2;

	instloc.Z -= (Instigator.CrouchHeight*crouchtime);

	if (ShadowTexture.Invalid)
	{
		Destroy();
		return;
	}

	if(ShadowEffect == SE_Fire)
	{
		// move a bit closer to the target position
		RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		// if we have moved too far out of range, begin moving back to the shadow source
		if( VSize(CurrentFirePos) &gt;  FireFlickerMagnitude)
		{
			TargetFirePos = FirePositions[0];       // reset back to 0,0,0
			RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		}
		// if we have already reached our target position, pick a new one
		else if( VSize(TargetFirePos - RandVec) &gt; VSize(TargetFirePos - CurrentFirePos) )
		{
			TargetFirePos = FirePositions[Rand(FirePositions.Length)] * Rand(FireFlickerMagnitude);
			RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		}

		CurrentFirePos = RandVec;
	}

	Diff = ( Owner.Location + RandVec ) - instloc;
	LightDistance = VSize(Diff);
	ShadowLocation = instloc + (4 * Normal(Diff));
	if (VSize(ShadowLocation-instloc) &gt; LightDistance)
		ShadowLocation = instloc;
	SetLocation(ShadowLocation);

	BoundingSphere = Instigator.GetRenderBoundingSphere();
	FOV = (Atan(BoundingSphere.W*2 + 160, LightDistance) * 180/PI)*FOVScale;
	SetDrawScale( LightDistance * tan(0.5 * FOV * PI / 180) / (0.5 * ShadowTexture.USize) );

	// adjust rotation to fix the FOV causing the shadow to detatch from the player
	AdjustedRotation = rotator(instloc-(Owner.Location + RandVec));
	AdjustedRotation.Pitch -= 1408*(FOV/MaxFOV);
	SetRotation(AdjustedRotation);

	LightDirection = -vector(AdjustedRotation);

	ShadowTexture.LightDirection = LightDirection;
	ShadowTexture.LightDistance = LightDistance;
	ShadowTexture.LightFOV = FOV;

	// cull more if we havent rendered this pawn in 5 seconds
	if (Level.TimeSeconds - Instigator.LastRenderTime &gt; 5)
		CullDistance = 0.25*Default.CullDistance;
	else
		CullDistance = Default.CullDistance;

	// cull shadows much earlier if below min framerate
	// ..this may or may not be desired, it does get rather ugly
	if (Level.bDropDetail)
		ShadowTexture.CullDistance = 0.5*CullDistance;
	else
		ShadowTexture.CullDistance = CullDistance;
	ShadowTexture.Dirty = true;

	AttachProjector();
}

defaultproperties
{
	bGradient=True
	CullDistance=1800.f

	// directional offsets for target pos movements
	// 1. origin (will move back to the shadow source)
	FirePositions(0)=(X=0,Y=0,Z=0)
	// 2. ordinal directions (will move along one axis)
	FirePositions(1)=(X=1,Y=0,Z=0)
	FirePositions(2)=(X=-1,Y=0,Z=0)
	FirePositions(3)=(X=0,Y=1,Z=0)
	FirePositions(4)=(X=0,Y=-1,Z=0)
	FirePositions(5)=(X=0,Y=0,Z=1)
	FirePositions(6)=(X=0,Y=0,Z=-1)
	// 3. diagonal on axis directions (will move on two axes)
	FirePositions(7)=(X=0,Y=1,Z=1)
	FirePositions(8)=(X=1,Y=0,Z=1)
	FirePositions(9)=(X=0,Y=-1,Z=1)
	FirePositions(10)=(X=-1,Y=0,Z=1)
	FirePositions(11)=(X=-1,Y=0,Z=-1)
	FirePositions(12)=(X=0,Y=-1,Z=-1)
	FirePositions(13)=(X=1,Y=0,Z=-1)
	FirePositions(14)=(X=0,Y=-1,Z=-1)
	// 4. diagonal mid axis directions (will move on three axes)
	FirePositions(15)=(X=1,Y=1,Z=-1)
	FirePositions(16)=(X=1,Y=-1,Z=-1)
	FirePositions(17)=(X=-1,Y=-1,Z=-1)
	FirePositions(18)=(X=-1,Y=1,Z=-1)
	FirePositions(19)=(X=-1,Y=1,Z=1)
	FirePositions(20)=(X=1,Y=1,Z=1)
	FirePositions(21)=(X=1,Y=-1,Z=1)
	FirePositions(22)=(X=-1,Y=-1,Z=1)
}
&lt;/uscript&gt;

===Issues to consider===

First, the code is largely untested in practical play, but does work.  Issues to consider, which have not been specifically tested include:

* '''What happens if a pawn is spawned inside the CollisionRadius of a ShadowSource?'''
** If Touch() is called correctly, then everything works properly, but if not...
* '''What happens if a pawn is killed inside the CollisionRadius of a ShadowSource?'''
** Only if UnTouch() is called when the pawn dies will the shadow be destroyed
* '''What about other light effects?'''

===Comments===

'''Blueneptune:''' It appears that the shadow projectors will clip off pieces of the shadow that are out of their FOV angle.  This happens often when near a light since the projector is always so close to the shadowed actor.  This solution is bad for the shadow texture sharpness, but I found that setting the projector to the light's location works much better for shadow clipping (unless the mesh being shadowed encapsulates the light).  As said, it's bad for the shadow sharpness and it often needs adjustments to the rotation since it's set too low.

'''Bonehed316:''' A compromise solution would be to set the projector location somewhere between the source and the pawn.  Also I need to put some pics up, and get a working demo, I think.  Maybe one day.

'''MythOpus:''' To solve the problems of a pawn dying inside the actors collision zone, when spawning the projectors, set the owner of the projector to that of the pawn it is being created on.  Then in the projector class, have it destroy itself when it's owner = none.  

'''Foxpaw:''' Untouch() will not get called when a pawn is destroyed, but I believe it will be called when a pawn actor is destroyed (and removed from the world). So the pawn would continue to have the projector acting on it while it was ragdolling.

Mythopus' solution is good but instead of using Owner I would use a variable declared in the projector and use that to store the pawn. I am wary of using Owner because Owner has some special implications when it comes to replication that I'd generally prefer not to worry about. Since the projector would be client-side, I don't THINK that you would have problems with this, but it might not hurt to store it in an internal variable instead of Owner.

'''Bonehed316:''' It uses the owning pawn as its Instigator as well, so that could be checked, since it's already used.  I think the Owner should be the ShadowSource (logically this is accurate, but I'm not sure about the replication implications).  As far as I know though, the shadow is destroyed when the Pawn dies, but the ShadowSource's list would not be updated, which must also be solved .  This could probably be solved by calling a new function on the ShadowSource from the Projector's Destroyed() function which would remove itself from the ShadowSource's array iff Instigator == None (which, correct me if I'm wrong, means the Instigator was killed).

'''Bonehed316:''' Also the ShadowSource needs to destroy any projectors that exist if/when it is destroyed.  The garbage collector might still get them, but I think this is important anyway.</text>
    </revision>
    <revision>
      <id>1940</id>
      <timestamp>2005-06-25T02:36:59Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">As many others have done, I have created some form of shadows using projectors.  There are other methods, including SquirrelZero's [[Legacy:SquirrelZero/RealtimeShadows|RealtimeShadows]], which are good indeed, but the workload is per pawn, and performed each tick, and therefor is, and will always be, very slow. 

Next there is a method, which is very similar to my own, called [[Legacy:Sourced_Player_Shadows|Sourced_Player_Shadows]].  There are also some others, but I cant find the links right off hand, and I'm sure there are some which I've never thought of myself.  I am not familiar with other methods, so I will not comment on them, nor compare directly with any of them.

The method I worked on, which is by no means a superb solution, is to use an actor I call a ShadowSource to handle attaching and detaching shadow projectors, and also act as a &quot;source&quot; of the shadow itself.  It uses the Touch() and UnTouch() functions to spawn and destroy shadow projectors.  The projectors use a reference to the ShadowSource as a location from which the shadow should be cast.  A level designer would place these ShadowSources wherever a static mesh that represents a light source exists, and the code will take care of the rest.

Once the idea is down, the code here is trivial: 

&lt;uscript&gt;
class ShadowSource extends Actor
	placeable;

var class&lt;ShadowBitmapMaterial&gt; TextureDetailClass;
var array&lt;DynamicShadow&gt; Shadows;

var() enum EShadowDetail        // shadow detail level
{
	SD_Low,                 // 64x64
	SD_Medium,              // 128x128
	SD_High,                // 256x256
	SD_Highest,             // 512x512
} ShadowDetail;

var() DynamicShadow.EShadowEffect ShadowEffect;		// the type of light effect for this shadow
var() int MaxFOV;					// adjusts rotation to compensate for FOV
var() float FOVScale;					// scales FOV to change the size of the shadow
var() int MaxTraceDistance;				// how far the projector can draw
var(ShadowSourceEffect) float PhaseScale;		// used to control light effects, result may vary depending on the effect used

// fire effect specific variables
var(ShadowSourceEffect) int FireFlickerMagnitude;	// how far the fire flicker is allowed to move
var(ShadowSourceEffect) int FireFlickerSpeed;		// how fast the shadow moves

// Initialize anything
event PostBeginPlay()
{
	GetShadowTexture();
}

// sets the shadow texture depending on the selected detail setting
// each class is simply a subclass of ShadowBitmapMaterial with a different USize and VSize
function GetShadowTexture()
{
	Switch(ShadowDetail)
	{
		case SD_Low: TextureDetailClass = Class'ShadowDetailLow'; break;
		case SD_Medium: TextureDetailClass = Class'ShadowDetailMedium';break;
		case SD_High:   TextureDetailClass = Class'ShadowDetailHigh';break;
		case SD_Highest: TextureDetailClass = Class'ShadowDetailHighest'; break;
		default: TextureDetailClass = Class'ShadowDetailLow'; break;
	}
}

function DynamicShadow SpawnShadow(Pawn P)
{
	local DynamicShadow DynamicShadow;

	DynamicShadow = Spawn(class'DynamicShadow',self,,P.Location);
	if (DynamicShadow != None)
	{
		DynamicShadow.ShadowActor = P;
		DynamicShadow.Instigator = P;
		DynamicShadow.ShadowEffect = ShadowEffect;
		DynamicShadow.FireFlickerMagnitude = FireFlickerMagnitude;
		DynamicShadow.FireFlickerSpeed = FireFlickerSpeed;
		DynamicShadow.PhaseScale = PhaseScale;
		DynamicShadow.bBlobShadow = False;
		DynamicShadow.FOVScale = FOVScale;
		DynamicShadow.MaxFOV = MaxFOV;
		DynamicShadow.MaxTraceDistance = MaxTraceDistance;
		DynamicShadow.ShadowTexture = ShadowBitmapMaterial( Level.ObjectPool.AllocateObject(TextureDetailClass) );
		DynamicShadow.InitShadow();
	}
	return DynamicShadow;
}

// pawns are given a shadow when they touch
event Touch(Actor Other)
{
	if (Pawn(Other) != None)
		Shadows[Shadows.Length] = SpawnShadow(Pawn(Other));
}

// pawns are removed from the shadow list when they untouch, and the shadow is destroyed
event UnTouch(Actor Other)
{
	local int i;

	if (Pawn(Other) != None)
	{
		i = GetShadowIndex(Other);
		if (i &gt; -1)
		{
			Shadows[i].Destroy();
			Shadows.Remove(i,1);
		}
	}
}

// returns the index of an actor within the shadow array
function int GetShadowIndex(Actor A)
{
	local int i;

	for (i=0;i&lt;Shadows.Length;++i)
	{
		if (Shadows[i].ShadowActor == A)
			return i;
	}
	return -1;
}

defaultproperties
{
	bHidden=True
	ShadowDetail=SD_Medium
	ShadowEffect=SE_Normal

	FireFlickerMagnitude=60
	FireFlickerSpeed=20
	PhaseScale=0.5
	MaxFOV=70
	FOVScale=0.9
	MaxTraceDistance=1000

	bCollideActors=True
	bUseCylinderCollision=True
	CollisionHeight=500
	CollisionRadius=500
}
&lt;/uscript&gt;

The key here is that the CollisionHeight and CollisionRadius are what effect how close to the source you have to be to recieve a shadow from it.  Adjusting this radius is important to the concept.  Basic projector properties can be controlled with the exposed variables, and more can be added easily, and subclasses of ShadowSource can be created which have even more functionality, if that is the method you prefer.

As you can see, the real magic is all in the projector class.  The beauty is that the projector draws itself, from the location of the ShadowSource that owns it.  This way, the overhead of sorting lights and shadow projectors is eliminated.  The projector simply draws until it is destroyed.

The projector is listed here:

&lt;uscript&gt;
class DynamicShadow extends ShadowProjector;

// various shadow effects can exist here
var enum EShadowEffect
{
	SE_Normal,
	SE_Fire,
} ShadowEffect;

// these are set by the shadow source
var int FireFlickerMagnitude;
var int FireFlickerSpeed;
var int MaxFOV;
var float PhaseScale, FOVScale;

//hack for interpolating crouch distance over time when pawn stands up again
var float crouchtime;
var vector CurrentFirePos, TargetFirePos;
var array&lt;vector&gt; FirePositions;

// This must be called by the ShadowSource to initialize the projector to start drawing
function InitShadow()
{
	if (ShadowActor != None)
	{
		ShadowTexture.bBlobShadow = bBlobShadow;
		ShadowTexture.ShadowActor = ShadowActor;
		ProjTexture = ShadowTexture;

		if (ProjTexture != None)
		{
			// UpdateShadows is time driven, to allow shadow animating
			UpdateShadows(0.03);  // start the shadow rendering, and enable tick
			Enable('Tick');
		}
		// timer is used for fire effect, but could be used for others as well, so 
		// we start it up here as well
		SetTimer(FRand(),true);
	}
}

event Destroyed()
{
	if (ShadowTexture != None)
	{
		ShadowTexture.ShadowActor = None;

		if (!ShadowTexture.Invalid)
			Level.ObjectPool.FreeObject(ShadowTexture);

		ShadowTexture = None;
		ProjTexture = None;
	}

	Super.Destroyed();
}

event Tick(float dt)
{
	UpdateShadows(dt);
}

function Timer()
{
	if(ShadowEffect == SE_Fire)
	{
		// random target positions for fire flicker, and random timer rate
		TargetFirePos = FirePositions[Rand(FirePositions.Length)] * Rand(FireFlickerMagnitude);
		TimerRate = FRand() * PhaseScale;
	}
	else
		bTimerLoop=False;       // disable timer loop for non-effect shadows

}

// we use our own update shadow function
function UpdateShadow();

// updates location, rotation, and FOV
function UpdateShadows(float dt)
{
	local vector Diff, ShadowLocation, RandVec, instloc;
	local rotator AdjustedRotation;
	local Plane BoundingSphere;

	DetachProjector(True);

	// check to make sure we should draw, maybe this should also destroy the projector
	if (Instigator.bHidden || !bShadowActive || ShadowTexture == None || Instigator == None)
		return;

	instloc = Instigator.Location;

	// hack for fixing shadow detaching from pawn when crouching
	// crouchheight based on anim time, values may vary
	if (Instigator.bIsCrouched)
		crouchtime = FMin(crouchtime+dt*5,0.5);
	else if (crouchtime &gt; 0.0)
		crouchtime -= dt*2;

	instloc.Z -= (Instigator.CrouchHeight*crouchtime);

	if (ShadowTexture.Invalid)
	{
		Destroy();
		return;
	}

	if(ShadowEffect == SE_Fire)
	{
		// move a bit closer to the target position
		RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		// if we have moved too far out of range, begin moving back to the shadow source
		if( VSize(CurrentFirePos) &gt;  FireFlickerMagnitude)
		{
			TargetFirePos = FirePositions[0];       // reset back to 0,0,0
			RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		}
		// if we have already reached our target position, pick a new one
		else if( VSize(TargetFirePos - RandVec) &gt; VSize(TargetFirePos - CurrentFirePos) )
		{
			TargetFirePos = FirePositions[Rand(FirePositions.Length)] * Rand(FireFlickerMagnitude);
			RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		}

		CurrentFirePos = RandVec;
	}

	Diff = ( Owner.Location + RandVec ) - instloc;
	LightDistance = VSize(Diff);
	ShadowLocation = instloc + (4 * Normal(Diff));
	if (VSize(ShadowLocation-instloc) &gt; LightDistance)
		ShadowLocation = instloc;
	SetLocation(ShadowLocation);

	BoundingSphere = Instigator.GetRenderBoundingSphere();
	FOV = (Atan(BoundingSphere.W*2 + 160, LightDistance) * 180/PI)*FOVScale;
	SetDrawScale( LightDistance * tan(0.5 * FOV * PI / 180) / (0.5 * ShadowTexture.USize) );

	// adjust rotation to fix the FOV causing the shadow to detatch from the player
	AdjustedRotation = rotator(instloc-(Owner.Location + RandVec));
	AdjustedRotation.Pitch -= 1408*(FOV/MaxFOV);
	SetRotation(AdjustedRotation);

	LightDirection = -vector(AdjustedRotation);

	ShadowTexture.LightDirection = LightDirection;
	ShadowTexture.LightDistance = LightDistance;
	ShadowTexture.LightFOV = FOV;

	// cull more if we havent rendered this pawn in 5 seconds
	if (Level.TimeSeconds - Instigator.LastRenderTime &gt; 5)
		CullDistance = 0.25*Default.CullDistance;
	else
		CullDistance = Default.CullDistance;

	// cull shadows much earlier if below min framerate
	// ..this may or may not be desired, it does get rather ugly
	if (Level.bDropDetail)
		ShadowTexture.CullDistance = 0.5*CullDistance;
	else
		ShadowTexture.CullDistance = CullDistance;
	ShadowTexture.Dirty = true;

	AttachProjector();
}

defaultproperties
{
	bGradient=True
	CullDistance=1800.f

	// directional offsets for target pos movements
	// 1. origin (will move back to the shadow source)
	FirePositions(0)=(X=0,Y=0,Z=0)
	// 2. ordinal directions (will move along one axis)
	FirePositions(1)=(X=1,Y=0,Z=0)
	FirePositions(2)=(X=-1,Y=0,Z=0)
	FirePositions(3)=(X=0,Y=1,Z=0)
	FirePositions(4)=(X=0,Y=-1,Z=0)
	FirePositions(5)=(X=0,Y=0,Z=1)
	FirePositions(6)=(X=0,Y=0,Z=-1)
	// 3. diagonal on axis directions (will move on two axes)
	FirePositions(7)=(X=0,Y=1,Z=1)
	FirePositions(8)=(X=1,Y=0,Z=1)
	FirePositions(9)=(X=0,Y=-1,Z=1)
	FirePositions(10)=(X=-1,Y=0,Z=1)
	FirePositions(11)=(X=-1,Y=0,Z=-1)
	FirePositions(12)=(X=0,Y=-1,Z=-1)
	FirePositions(13)=(X=1,Y=0,Z=-1)
	FirePositions(14)=(X=0,Y=-1,Z=-1)
	// 4. diagonal mid axis directions (will move on three axes)
	FirePositions(15)=(X=1,Y=1,Z=-1)
	FirePositions(16)=(X=1,Y=-1,Z=-1)
	FirePositions(17)=(X=-1,Y=-1,Z=-1)
	FirePositions(18)=(X=-1,Y=1,Z=-1)
	FirePositions(19)=(X=-1,Y=1,Z=1)
	FirePositions(20)=(X=1,Y=1,Z=1)
	FirePositions(21)=(X=1,Y=-1,Z=1)
	FirePositions(22)=(X=-1,Y=-1,Z=1)
}
&lt;/uscript&gt;

===Issues to consider===

First, the code is largely untested in practical play, but does work.  Issues to consider, which have not been specifically tested include:

* '''What happens if a pawn is spawned inside the CollisionRadius of a ShadowSource?'''
** If Touch() is called correctly, then everything works properly, but if not...
* '''What happens if a pawn is killed inside the CollisionRadius of a ShadowSource?'''
** Only if UnTouch() is called when the pawn dies will the shadow be destroyed
* '''What about other light effects?'''

===Comments===

'''Blueneptune:''' It appears that the shadow projectors will clip off pieces of the shadow that are out of their FOV angle.  This happens often when near a light since the projector is always so close to the shadowed actor.  This solution is bad for the shadow texture sharpness, but I found that setting the projector to the light's location works much better for shadow clipping (unless the mesh being shadowed encapsulates the light).  As said, it's bad for the shadow sharpness and it often needs adjustments to the rotation since it's set too low.

'''Bonehed316:''' A compromise solution would be to set the projector location somewhere between the source and the pawn.  Also I need to put some pics up, and get a working demo, I think.  Maybe one day.

'''MythOpus:''' To solve the problems of a pawn dying inside the actors collision zone, when spawning the projectors, set the owner of the projector to that of the pawn it is being created on.  Then in the projector class, have it destroy itself when it's owner = none.  

'''Foxpaw:''' Untouch() will not get called when a pawn is destroyed, but I believe it will be called when a pawn actor is destroyed (and removed from the world). So the pawn would continue to have the projector acting on it while it was ragdolling.

Mythopus' solution is good but instead of using Owner I would use a variable declared in the projector and use that to store the pawn. I am wary of using Owner because Owner has some special implications when it comes to replication that I'd generally prefer not to worry about. Since the projector would be client-side, I don't THINK that you would have problems with this, but it might not hurt to store it in an internal variable instead of Owner.</text>
    </revision>
    <revision>
      <id>1941</id>
      <timestamp>2005-06-25T05:11:19Z</timestamp>
      <contributor>
        <ip>Bonehed316</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">As many others have done, I have created some form of shadows using projectors.  There are other methods, including SquirrelZero's [[Legacy:SquirrelZero/RealtimeShadows|RealtimeShadows]], which are good indeed, but the workload is per pawn, and performed each tick, and therefor is, and will always be, very slow. 

Next there is a method, which is very similar to my own, called [[Legacy:Sourced_Player_Shadows|Sourced_Player_Shadows]].  There are also some others, but I cant find the links right off hand, and I'm sure there are some which I've never thought of myself.  I am not familiar with other methods, so I will not comment on them, nor compare directly with any of them.

The method I worked on, which is by no means a superb solution, is to use an actor I call a ShadowSource to handle attaching and detaching shadow projectors, and also act as a &quot;source&quot; of the shadow itself.  It uses the Touch() and UnTouch() functions to spawn and destroy shadow projectors.  The projectors use a reference to the ShadowSource as a location from which the shadow should be cast.  A level designer would place these ShadowSources wherever a static mesh that represents a light source exists, and the code will take care of the rest.

Once the idea is down, the code here is trivial: 

&lt;uscript&gt;
class ShadowSource extends Actor
	placeable;

var class&lt;ShadowBitmapMaterial&gt; TextureDetailClass;
var array&lt;DynamicShadow&gt; Shadows;

var() enum EShadowDetail        // shadow detail level
{
	SD_Low,                 // 64x64
	SD_Medium,              // 128x128
	SD_High,                // 256x256
	SD_Highest,             // 512x512
} ShadowDetail;

var() DynamicShadow.EShadowEffect ShadowEffect;		// the type of light effect for this shadow
var() int MaxFOV;					// adjusts rotation to compensate for FOV
var() float FOVScale;					// scales FOV to change the size of the shadow
var() int MaxTraceDistance;				// how far the projector can draw
var(ShadowSourceEffect) float PhaseScale;		// used to control light effects, result may vary depending on the effect used

// fire effect specific variables
var(ShadowSourceEffect) int FireFlickerMagnitude;	// how far the fire flicker is allowed to move
var(ShadowSourceEffect) int FireFlickerSpeed;		// how fast the shadow moves

// Initialize anything
event PostBeginPlay()
{
	GetShadowTexture();
}

// sets the shadow texture depending on the selected detail setting
// each class is simply a subclass of ShadowBitmapMaterial with a different USize and VSize
function GetShadowTexture()
{
	Switch(ShadowDetail)
	{
		case SD_Low: TextureDetailClass = Class'ShadowDetailLow'; break;
		case SD_Medium: TextureDetailClass = Class'ShadowDetailMedium';break;
		case SD_High:   TextureDetailClass = Class'ShadowDetailHigh';break;
		case SD_Highest: TextureDetailClass = Class'ShadowDetailHighest'; break;
		default: TextureDetailClass = Class'ShadowDetailLow'; break;
	}
}

function DynamicShadow SpawnShadow(Pawn P)
{
	local DynamicShadow DynamicShadow;

	DynamicShadow = Spawn(class'DynamicShadow',self,,P.Location);
	if (DynamicShadow != None)
	{
		DynamicShadow.ShadowActor = P;
		DynamicShadow.Instigator = P;
		DynamicShadow.ShadowEffect = ShadowEffect;
		DynamicShadow.FireFlickerMagnitude = FireFlickerMagnitude;
		DynamicShadow.FireFlickerSpeed = FireFlickerSpeed;
		DynamicShadow.PhaseScale = PhaseScale;
		DynamicShadow.bBlobShadow = False;
		DynamicShadow.FOVScale = FOVScale;
		DynamicShadow.MaxFOV = MaxFOV;
		DynamicShadow.MaxTraceDistance = MaxTraceDistance;
		DynamicShadow.ShadowTexture = ShadowBitmapMaterial( Level.ObjectPool.AllocateObject(TextureDetailClass) );
		DynamicShadow.InitShadow();
	}
	return DynamicShadow;
}

// pawns are given a shadow when they touch
event Touch(Actor Other)
{
	if (Pawn(Other) != None)
		Shadows[Shadows.Length] = SpawnShadow(Pawn(Other));
}

// pawns are removed from the shadow list when they untouch, and the shadow is destroyed
event UnTouch(Actor Other)
{
	local int i;

	if (Pawn(Other) != None)
	{
		i = GetShadowIndex(Other);
		if (i &gt; -1)
		{
			Shadows[i].Destroy();
			Shadows.Remove(i,1);
		}
	}
}

// returns the index of an actor within the shadow array
function int GetShadowIndex(Actor A)
{
	local int i;

	for (i=0;i&lt;Shadows.Length;++i)
	{
		if (Shadows[i].ShadowActor == A)
			return i;
	}
	return -1;
}

defaultproperties
{
	bHidden=True
	ShadowDetail=SD_Medium
	ShadowEffect=SE_Normal

	FireFlickerMagnitude=60
	FireFlickerSpeed=20
	PhaseScale=0.5
	MaxFOV=70
	FOVScale=0.9
	MaxTraceDistance=1000

	bCollideActors=True
	bUseCylinderCollision=True
	CollisionHeight=500
	CollisionRadius=500
}
&lt;/uscript&gt;

The key here is that the CollisionHeight and CollisionRadius are what effect how close to the source you have to be to recieve a shadow from it.  Adjusting this radius is important to the concept.  Basic projector properties can be controlled with the exposed variables, and more can be added easily, and subclasses of ShadowSource can be created which have even more functionality, if that is the method you prefer.

As you can see, the real magic is all in the projector class.  The beauty is that the projector draws itself, from the location of the ShadowSource that owns it.  This way, the overhead of sorting lights and shadow projectors is eliminated.  The projector simply draws until it is destroyed.

The projector is listed here:

&lt;uscript&gt;
class DynamicShadow extends ShadowProjector;

// various shadow effects can exist here
var enum EShadowEffect
{
	SE_Normal,
	SE_Fire,
} ShadowEffect;

// these are set by the shadow source
var int FireFlickerMagnitude;
var int FireFlickerSpeed;
var int MaxFOV;
var float PhaseScale, FOVScale;

//hack for interpolating crouch distance over time when pawn stands up again
var float crouchtime;
var vector CurrentFirePos, TargetFirePos;
var array&lt;vector&gt; FirePositions;

// This must be called by the ShadowSource to initialize the projector to start drawing
function InitShadow()
{
	if (ShadowActor != None)
	{
		ShadowTexture.bBlobShadow = bBlobShadow;
		ShadowTexture.ShadowActor = ShadowActor;
		ProjTexture = ShadowTexture;

		if (ProjTexture != None)
		{
			// UpdateShadows is time driven, to allow shadow animating
			UpdateShadows(0.03);  // start the shadow rendering, and enable tick
			Enable('Tick');
		}
		// timer is used for fire effect, but could be used for others as well, so 
		// we start it up here as well
		SetTimer(FRand(),true);
	}
}

event Destroyed()
{
	if (ShadowTexture != None)
	{
		ShadowTexture.ShadowActor = None;

		if (!ShadowTexture.Invalid)
			Level.ObjectPool.FreeObject(ShadowTexture);

		ShadowTexture = None;
		ProjTexture = None;
	}

	Super.Destroyed();
}

event Tick(float dt)
{
	UpdateShadows(dt);
}

function Timer()
{
	if(ShadowEffect == SE_Fire)
	{
		// random target positions for fire flicker, and random timer rate
		TargetFirePos = FirePositions[Rand(FirePositions.Length)] * Rand(FireFlickerMagnitude);
		TimerRate = FRand() * PhaseScale;
	}
	else
		bTimerLoop=False;       // disable timer loop for non-effect shadows

}

// we use our own update shadow function
function UpdateShadow();

// updates location, rotation, and FOV
function UpdateShadows(float dt)
{
	local vector Diff, ShadowLocation, RandVec, instloc;
	local rotator AdjustedRotation;
	local Plane BoundingSphere;

	DetachProjector(True);

	// check to make sure we should draw, maybe this should also destroy the projector
	if (Instigator.bHidden || !bShadowActive || ShadowTexture == None || Instigator == None)
		return;

	instloc = Instigator.Location;

	// hack for fixing shadow detaching from pawn when crouching
	// crouchheight based on anim time, values may vary
	if (Instigator.bIsCrouched)
		crouchtime = FMin(crouchtime+dt*5,0.5);
	else if (crouchtime &gt; 0.0)
		crouchtime -= dt*2;

	instloc.Z -= (Instigator.CrouchHeight*crouchtime);

	if (ShadowTexture.Invalid)
	{
		Destroy();
		return;
	}

	if(ShadowEffect == SE_Fire)
	{
		// move a bit closer to the target position
		RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		// if we have moved too far out of range, begin moving back to the shadow source
		if( VSize(CurrentFirePos) &gt;  FireFlickerMagnitude)
		{
			TargetFirePos = FirePositions[0];       // reset back to 0,0,0
			RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		}
		// if we have already reached our target position, pick a new one
		else if( VSize(TargetFirePos - RandVec) &gt; VSize(TargetFirePos - CurrentFirePos) )
		{
			TargetFirePos = FirePositions[Rand(FirePositions.Length)] * Rand(FireFlickerMagnitude);
			RandVec = CurrentFirePos + (Normal(TargetFirePos - CurrentFirePos) * (FireFlickerSpeed * dt));
		}

		CurrentFirePos = RandVec;
	}

	Diff = ( Owner.Location + RandVec ) - instloc;
	LightDistance = VSize(Diff);
	ShadowLocation = instloc + (4 * Normal(Diff));
	if (VSize(ShadowLocation-instloc) &gt; LightDistance)
		ShadowLocation = instloc;
	SetLocation(ShadowLocation);

	BoundingSphere = Instigator.GetRenderBoundingSphere();
	FOV = (Atan(BoundingSphere.W*2 + 160, LightDistance) * 180/PI)*FOVScale;
	SetDrawScale( LightDistance * tan(0.5 * FOV * PI / 180) / (0.5 * ShadowTexture.USize) );

	// adjust rotation to fix the FOV causing the shadow to detatch from the player
	AdjustedRotation = rotator(instloc-(Owner.Location + RandVec));
	AdjustedRotation.Pitch -= 1408*(FOV/MaxFOV);
	SetRotation(AdjustedRotation);

	LightDirection = -vector(AdjustedRotation);

	ShadowTexture.LightDirection = LightDirection;
	ShadowTexture.LightDistance = LightDistance;
	ShadowTexture.LightFOV = FOV;

	// cull more if we havent rendered this pawn in 5 seconds
	if (Level.TimeSeconds - Instigator.LastRenderTime &gt; 5)
		CullDistance = 0.25*Default.CullDistance;
	else
		CullDistance = Default.CullDistance;

	// cull shadows much earlier if below min framerate
	// ..this may or may not be desired, it does get rather ugly
	if (Level.bDropDetail)
		ShadowTexture.CullDistance = 0.5*CullDistance;
	else
		ShadowTexture.CullDistance = CullDistance;
	ShadowTexture.Dirty = true;

	AttachProjector();
}

defaultproperties
{
	bGradient=True
	CullDistance=1800.f

	// directional offsets for target pos movements
	// 1. origin (will move back to the shadow source)
	FirePositions(0)=(X=0,Y=0,Z=0)
	// 2. ordinal directions (will move along one axis)
	FirePositions(1)=(X=1,Y=0,Z=0)
	FirePositions(2)=(X=-1,Y=0,Z=0)
	FirePositions(3)=(X=0,Y=1,Z=0)
	FirePositions(4)=(X=0,Y=-1,Z=0)
	FirePositions(5)=(X=0,Y=0,Z=1)
	FirePositions(6)=(X=0,Y=0,Z=-1)
	// 3. diagonal on axis directions (will move on two axes)
	FirePositions(7)=(X=0,Y=1,Z=1)
	FirePositions(8)=(X=1,Y=0,Z=1)
	FirePositions(9)=(X=0,Y=-1,Z=1)
	FirePositions(10)=(X=-1,Y=0,Z=1)
	FirePositions(11)=(X=-1,Y=0,Z=-1)
	FirePositions(12)=(X=0,Y=-1,Z=-1)
	FirePositions(13)=(X=1,Y=0,Z=-1)
	FirePositions(14)=(X=0,Y=-1,Z=-1)
	// 4. diagonal mid axis directions (will move on three axes)
	FirePositions(15)=(X=1,Y=1,Z=-1)
	FirePositions(16)=(X=1,Y=-1,Z=-1)
	FirePositions(17)=(X=-1,Y=-1,Z=-1)
	FirePositions(18)=(X=-1,Y=1,Z=-1)
	FirePositions(19)=(X=-1,Y=1,Z=1)
	FirePositions(20)=(X=1,Y=1,Z=1)
	FirePositions(21)=(X=1,Y=-1,Z=1)
	FirePositions(22)=(X=-1,Y=-1,Z=1)
}
&lt;/uscript&gt;

===Issues to consider===

First, the code is largely untested in practical play, but does work.  Issues to consider, which have not been specifically tested include:

* '''What happens if a pawn is spawned inside the CollisionRadius of a ShadowSource?'''
** If Touch() is called correctly, then everything works properly, but if not...
* '''What happens if a pawn is killed inside the CollisionRadius of a ShadowSource?'''
** Only if UnTouch() is called when the pawn dies will the shadow be destroyed
* '''What about other light effects?'''

===Comments===

'''Blueneptune:''' It appears that the shadow projectors will clip off pieces of the shadow that are out of their FOV angle.  This happens often when near a light since the projector is always so close to the shadowed actor.  This solution is bad for the shadow texture sharpness, but I found that setting the projector to the light's location works much better for shadow clipping (unless the mesh being shadowed encapsulates the light).  As said, it's bad for the shadow sharpness and it often needs adjustments to the rotation since it's set too low.

'''Bonehed316:''' A compromise solution would be to set the projector location somewhere between the source and the pawn.  Also I need to put some pics up, and get a working demo, I think.  Maybe one day.

'''MythOpus:''' To solve the problems of a pawn dying inside the actors collision zone, when spawning the projectors, set the owner of the projector to that of the pawn it is being created on.  Then in the projector class, have it destroy itself when it's owner = none.  

'''Foxpaw:''' Untouch() will not get called when a pawn is destroyed, but I believe it will be called when a pawn actor is destroyed (and removed from the world). So the pawn would continue to have the projector acting on it while it was ragdolling.

Mythopus' solution is good but instead of using Owner I would use a variable declared in the projector and use that to store the pawn. I am wary of using Owner because Owner has some special implications when it comes to replication that I'd generally prefer not to worry about. Since the projector would be client-side, I don't THINK that you would have problems with this, but it might not hurt to store it in an internal variable instead of Owner.

'''Bonehed316:''' It uses the owning pawn as its Instigator as well, so that could be checked, since it's already used.  I think the Owner should be the ShadowSource (logically this is accurate, but I'm not sure about the replication implications).  As far as I know though, the shadow is destroyed when the Pawn dies, but the ShadowSource's list would not be updated, which must also be solved .  This could probably be solved by calling a new function on the ShadowSource from the Projector's Destroyed() function which would remove itself from the ShadowSource's array iff Instigator == None (which, correct me if I'm wrong, means the Instigator was killed).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BonzoESC</title>
    <id>595</id>
    <revision>
      <id>1803</id>
      <timestamp>2005-03-19T01:01:56Z</timestamp>
      <contributor>
        <ip>BonzoESC</ip>
      </contributor>
      <comment>changed status of mod idea</comment>
      <text xml:space="preserve">Homepage: http://bonzoesc.net

Email: bonzoesc@bonzoesc.net

Location: Melbourne, FL

While I am familiar with the workflows for mapping, modeling, and programming, the only things I've actually released at this point are my UT2004 Server Query Image (in PHP) and Racing Suicide Mantas, both available within a link or two from [http://bonzoesc.net/ut2004/].

Projects:

[[Legacy:Mod_Ideas/RacingSuicideMantas|Mod_Ideas/RacingSuicideMantas]] - Currently at 0.10.1 public, no development.</text>
    </revision>
    <revision>
      <id>1804</id>
      <timestamp>2004-04-01T02:33:42Z</timestamp>
      <contributor>
        <ip>BonzoESC</ip>
      </contributor>
      <comment>Added content to reflect recent stuff.</comment>
      <text xml:space="preserve">Homepage: http://bonzoesc.net

Email: bonzoesc@bonzoesc.net

Location: Melbourne, FL

While I am familiar with the workflows for mapping, modeling, and programming, the only things I've actually released at this point are my UT2004 Server Query Image (in PHP) and Racing Suicide Mantas, both available within a link or two from [http://bonzoesc.net/ut2004/].

Projects:

[[Legacy:Mod_Ideas/RacingSuicideMantas|Mod_Ideas/RacingSuicideMantas]] - Currently at 0.10.1 public, developing 0.10.2.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Boolean</title>
    <id>624</id>
    <revision>
      <id>1864</id>
      <timestamp>2005-12-18T00:32:41Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Named after its inventor, French mathematician George Boole, Boolean arithmetic is a small subset of discrete mathematics.  Specifically, it is the study of systems in which a variable or expression may take on exactly one of two distinct values.  Common definitions of these value pairs are: True/False, On/Off, and Yes/No.  Boolean values are represented in [[Legacy:UnrealScript|UnrealScript]] with the 'bool' variable type.

see '''Boolean Operators''' on the [Operators] page for operators the produce and work with boolean values.

See [[Wikipedia:Boolean_Algebra]] for an in-depth definition and some theory discussion.

==Related Topics==
* [[Legacy:Terminology|Terminology]]

==Discussion==

'''inio:''' None of the other primitive types have pages of their own, why should this?  If it is worth keeping around, shouldn't it be 'bool' to match the UnrealScript variable type?  

'''Tarquin:''' you could just put this material on to Wikipedia and link to [[Wikipedia:Boolean]] :D (but the original writer has to do this because of Wikipedia's GFDL.)</text>
    </revision>
    <revision>
      <id>1865</id>
      <timestamp>2005-04-29T12:11:42Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Named after its inventor, French mathematician George Boole, Boolean arithmetic is a small subset of discrete mathematics.  Specifically, it is the study of systems in which a variable or expression may take on exactly one of two distinct values.  Common definitions of these value pairs are: True/False, On/Off, and Yes/No.  Boolean values are represented in [[Legacy:UnrealScript|UnrealScript]] with the 'bool' variable type.

see '''Boolean Operators''' on the [Operators] page for operators the produce and work with boolean values.

See [[Wikipedia:Boolean_Algebra]] for an in-depth definition and some theory discussion.

----

==Discussion==

'''inio:''' None of the other primitive types have pages of their own, why should this?  If it is worth keeping around, shouldn't it be 'bool' to match the UnrealScript variable type?  

'''Tarquin:''' you could just put this material on to Wikipedia and link to [[Wikipedia:Boolean]] :D (but the original writer has to do this because of Wikipedia's GFDL.)

'''FatalOverdose'''Are there special rules to do with using boolean variables in structs?

'''Mychaeel:''' None that I know of.  What are you thinking of?</text>
    </revision>
    <revision>
      <id>1866</id>
      <timestamp>2005-07-03T06:13:01Z</timestamp>
      <contributor>
        <ip>213.177.251.156.adsl.griffin.net.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Named after its inventor, French mathematician George Boole, Boolean arithmetic is a small subset of discrete mathematics.  Specifically, it is the study of systems in which a variable or expression may take on exactly one of two distinct values.  Common definitions of these value pairs are: True/False, On/Off, and Yes/No.  Boolean values are represented in [[Legacy:UnrealScript|UnrealScript]] with the 'bool' variable type.

see '''Boolean Operators''' on the [Operators] page for operators the produce and work with boolean values.

See [[Wikipedia:Boolean_Algebra]] for an in-depth definition and some theory discussion.

----

==Discussion==

'''inio:''' None of the other primitive types have pages of their own, why should this?  If it is worth keeping around, shouldn't it be 'bool' to match the UnrealScript variable type?  

'''Tarquin:''' you could just put this material on to Wikipedia and link to [[Wikipedia:Boolean]] :D (but the original writer has to do this because of Wikipedia's GFDL.)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BossDM</title>
    <id>28329</id>
    <revision>
      <id>39996</id>
      <timestamp>2009-11-14T20:14:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot</title>
    <id>634</id>
    <revision>
      <id>1888</id>
      <timestamp>2007-07-03T14:52:07Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; Bot}}

The Bot class contains most of the details of the AI implementation, except for team-related functions which are mostly handled by the [[Legacy:SquadAI|SquadAI]]. It also has some game-specific code, referencing [[Legacy:TransLauncher|TransLauncher]] for translocator hopping (that is, using the translocator just to get you somewhere faster), and [[Legacy:BallLauncher|BallLauncher]] for self-passing in Bombing Run.

==Properties==

Nearly all Bot properties are hidden. (exception: OrderNames)

===AI Magic Numbers===
; AngleConvert = 0.0000958738 (const) : 2*PI/65536

===AI Flags===
; bool bCanFire : used by TacticalMove and Charging states
; bool bStrafeDir
; bool bCanLeadTarget : Lead target with projectile attack.
; bool bChangeDir : Tactical move boolean.
; bool bFrustrated : Being attacked in certain states causes frustration, and a frustrated bot is more aggressive.
; bool bInitLifeMessage : Keeps track of whether the bot has sent messages like &quot;I've got your back&quot; or &quot;I'm in position&quot;. Used by squad AIs.
; bool bReachedGatherPoint : Used for gathering a squad at an [[Legacy:AlternatePath|AlternatePath]]. Used by squad AIs.
; bool bFinalStretch : True if the bot is almost at its destination objective (ie a flag base). Set by squad AIs.
; bool bJumpy : Likes to jump around if true.
; bool bHasTranslocator
; bool bHasImpactHammer
; bool bTacticalDoubleJump : True when the bot is going to double jump.
; bool bWasNearObjective : Used by &lt;tt&gt;[[Legacy:GameObjective|GameObjective]].BotNearObjective&lt;/tt&gt;.
; bool bPlannedShot : Used for self-passing in Bombing Run.
; bool bHasFired : The bot has recently fired its weapon.
; bool bForcedDirection : Keeps the bot moving in the same direction for tactical moves.
; bool bFireSuccess : Determined by the [[Legacy:Weapon|Weapon]]'s &lt;tt&gt;BotFire&lt;/tt&gt; method, which indicates if the weapon actually fired.
; bool bStoppedFiring : Set to true in the &lt;tt&gt;StopFiring&lt;/tt&gt; method.
; bool bEnemyIsVisible
; bool bTranslocatorHop : Used during a translocator hop maneuver. Also referenced by [[Legacy:TransLauncher|TransLauncher]].
; bool bEnemyEngaged : Used by [[Legacy:SquadAI|SquadAI]] when finding defense scripts.
; bool bMustCharge : Used in &lt;tt&gt;FightEnemy&lt;/tt&gt; to determine if the bot should charge the enemy while attacking.
; bool bPursuingFlag : Used by [[Legacy:CTFSquadAI|CTFSquadAI]].
; bool bJustLanded : The bot has just recently landed from a fall.
; bool bSingleTestSection : Used in ReviewJumpSpots
; bool bRecommendFastMove : One of the factors in deciding whether to do a translocator hop in &lt;tt&gt;FaceActor&lt;/tt&gt;. May also be set by the squad AI (as in [[Legacy:BombingRunSquadAI|BombingRunSquadAI]]).

===Translocating===
; actor TranslocationTarget : The actor at which the bot is shooting its translocator. Used for translocator hopping, and also set by [[Legacy:JumpSpot|JumpSpot]]. Not to be confused with the [[Legacy:TransBeacon|TransBeacon]] property of the same name.
; actor RealTranslocationTarget : There doesn't seem to be any instance where this is set differently from TranslocationTarget.
; actor ImpactTarget : Used for impact/shield jumping.
; float TranslocFreq : Set by [[Legacy:TransLancher|TransLancher]] to help bots keep from exceeding its charge.
; float NextTranslocTime :

===Messages===
; name OldMessageType : Type of last message sent. Used in the &lt;tt&gt;SendMessage&lt;/tt&gt; function to keep from repeating the same message too much.
; int OldMessageID : Last message ID, as with OldMessageType.

===Advanced AI Attributes===
; vector HidingSpot : Used to track down enemies after losing sight of them.
; float Aggressiveness : 0.0 to 1.0 (typically)
; float LastAttractCheck :
; [[Legacy:NavigationPoint|NavigationPoint]] BlockedPath :
; float AcquireTime : time at which current enemy was acquired
; float Aggression
; float LoseEnemyCheckTime : Used in &lt;tt&gt;LoseEnemy&lt;/tt&gt; to keep from calling &lt;tt&gt;Squad.LostEnemy()&lt;/tt&gt; too often.
; actor StartleActor : The last actor passed to &lt;tt&gt;Startle()&lt;/tt&gt;
; float StartTacticalTime : Set in &lt;tt&gt;TacticalMove.PickDestination&lt;/tt&gt;

===Modifiable AI Attributes===
; float BaseAlertness
; float Accuracy : -1 to 1 (0 is default, higher is more accurate)
; float BaseAggressiveness : 0 to 1 (0.3 default, higher is more aggressive)
; float StrafingAbility : -1 to 1 (higher uses strafing more)
; float CombatStyle : -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee.
; float Tactics
; float TranslocUse : 0 to 1 - higher means more likely to use.
; float ReactionTime
; class&lt;[[Legacy:Weapon|Weapon]]&gt; FavoriteWeapon

==Team AI Attributes==
; string GoalString : For debugging - used to show what bot is thinking (with 'ShowDebug').
; string SoakString : For debugging - shows problem when soaking.
; [[Legacy:SquadAI|SquadAI]] Squad : The [[Legacy:SquadAI|SquadAI]] that the bot is in.
; [[Legacy:Bot|Bot]] NextSquadMember : Linked list of members of this squad
; float ReTaskTime : Time when squad will retask bot (delayed to avoid hitches).
; int FormationPosition : Determined by the squad's [[Legacy:RestingFormation|RestingFormation]].

===Scripted Sequences===
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] GoalScript : [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] bot is moving toward (assigned by [[Legacy:TeamAI|TeamAI]]).
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] EnemyAcquisitionScript : Determined by &lt;tt&gt;GoalScript&lt;/tt&gt;.
; [[Legacy:Vehicle|Vehicle]] FormerVehicle :
; enum&lt;EScriptFollow&gt; ScriptedCombat : See the &lt;tt&gt;EScriptFollow&lt;/tt&gt; enum.

===ChooseAttachMode() state===
; int ChoosingAttackLevel : Used to detect nested calls to &lt;tt&gt;WhatToDoNext&lt;/tt&gt;.
; float ChooseAttackTime : Used in &lt;tt&gt;WhatToDoNext&lt;/tt&gt; to detect when it gets called too often (more than 3 times a second).
; int ChooseAttackCounter : How many times &lt;tt&gt;WhatToDoNext&lt;/tt&gt; has been called in the current level time second.
; float EnemyVisibilityTime : The last time when the enemy became visible.
; [[Legacy:Pawn|Pawn]] VisibleEnemy : Helps determine if the enemy is visible.
; [[Legacy:Pawn|Pawn]] OldEnemy : Marked with &quot;FIXME TEMP&quot;.
; float StopStartTime : Time that the bot started standing still (sniping, waiting for mover, etc.).
; float LastRespawnTime : Used by [[Legacy:CTFSquadAI|CTFSquadAI]] in determining whether to pursue an enemy flag carrier.
; float FailedHuntTime : The last time that the bot could not find a path to its enemy.
; [[Legacy:Pawn|Pawn]] FailedHuntEnemy : The last enemy to which the bot could not find a path.

===Inventory Search===
; float LastSearchTime
; float LastSearchWeight
; float CampTime
; int LastTaunt
; int NumRandomJumps : Attempts to free bot from being stuck.
; string ComboNames[4]

===Weapon Check===
; float LastFireAttempt
; float GatherTime
; name OrderNames[16]
; name OldOrders
; [[Legacy:Controller|Controller]] OldOrderGiver

===1vs1 Enemy Location Model===
; vector LastKnownPosition
; vector LastKillerPosition

===ReviewJumpSpots===
; [[Legacy:NavigationPoint|NavigationPoint]] TestStart
; int TestPath
; name TestLabel

==Enums==

===EScriptFollow===
; FOLLOWSCRIPT_IgnoreAllStimuli
; FOLLOWSCRIPT_IgnoreEnemies
; FOLLOWSCRIPT_StayOnScript
; FOLLOWSCRIPT_LeaveScriptForCombat

==Known Subclasses==
* [[Legacy:XBot|xBot]]
** [[Legacy:InvasionBot|InvasionBot]]

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial for basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]]
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Related Classes==
* [[Legacy:Controller Overview|Controller Overview]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:ScriptedSequence|ScriptedSequence]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

===Related Bot AI Classes===

The following classes and subclasses thereof are involved in UT200x bot support AI.  Certain game objects have AI components telling bots what to do with them.
* [[Legacy:TeamAI|TeamAI]] - Creates squads, assigns bots to them and changes the objectives of squads based on the objectives of the [[Legacy:Gametype|gametype]].
* [[Legacy:SquadAI|SquadAI]] - Team of bots following a Squad Leader.
* [[Legacy:GameObjective|GameObjective]] - Immobile (though possibly destructible) markers for relevant places in a map:  CTF flag bases, Bombing Run bomb spawn points, goal hoops, Domination control points and so on.
* [[Legacy:Weapon|Weapon]] - Weapon inventory items.
* [[Legacy:NavigationPoint|NavigationPoint]] - Various NavigationPoints, like [[Legacy:Door|Door]], [[Legacy:LiftExit|LiftExit]], etc., have code or critical properties that work with other bot support actors.

==Discussion==

'''SuperApe:''' Removed &quot;function description links&quot; to other pages.  Only [[Legacy:Bot/Weapon Management|Bot/Weapon Management]] was made and it was utterly useless.  Added To Do tag.  Filled in all property variable types.

----

[[:Category:Legacy To Do]] &amp;ndash; Add functions definitions.
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1889</id>
      <timestamp>2005-11-16T22:00:00Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; Bot}}

The Bot class contains most of the details of the AI implementation, except for team-related functions which are mostly handled by the [[Legacy:SquadAI|SquadAI]]. It also has some game-specific code, referencing [[Legacy:TransLauncher|TransLauncher]] for translocator hopping (that is, using the translocator just to get you somewhere faster), and [[Legacy:BallLauncher|BallLauncher]] for self-passing in Bombing Run.

==Properties==

===AI Flags===
; bCanFire : used by TacticalMove and Charging states
; bStrafeDir
; bCanLeadTarget : Lead target with projectile attack.
; bChangeDir : Tactical move boolean.
; bFrustrated : Being attacked in certain states causes frustration, and a frustrated bot is more aggressive.
; bInitLifeMessage : Keeps track of whether the bot has sent messages like &quot;I've got your back&quot; or &quot;I'm in position&quot;. Used by squad AIs.
; bReachedGatherPoint : Used for gathering a squad at an [[Legacy:AlternatePath|AlternatePath]]. Used by squad AIs.
; bFinalStretch : True if the bot is almost at its destination objective (ie a flag base). Set by squad AIs.
; bJumpy : Likes to jump around if true.
; bHasTranslocator
; bHasImpactHammer
; bTacticalDoubleJump : True when the bot is going to double jump.
; bWasNearObjective : Used by &lt;tt&gt;[[Legacy:GameObjective|GameObjective]].BotNearObjective&lt;/tt&gt;.
; bPlannedShot : Used for self-passing in Bombing Run.
; bHasFired : The bot has recently fired its weapon.
; bForcedDirection : Keeps the bot moving in the same direction for tactical moves.
; bFireSuccess : Determined by the [[Legacy:Weapon|Weapon]]'s &lt;tt&gt;BotFire&lt;/tt&gt; method, which indicates if the weapon actually fired.
; bStoppedFiring : Set to true in the &lt;tt&gt;StopFiring&lt;/tt&gt; method.
; bEnemyIsVisible
; bTranslocatorHop : Used during a translocator hop maneuver. Also referenced by [[Legacy:TransLauncher|TransLauncher]].
; bEnemyEngaged : Used by [[Legacy:SquadAI|SquadAI]] when finding defense scripts.
; bMustCharge : Used in &lt;tt&gt;FightEnemy&lt;/tt&gt; to determine if the bot should charge the enemy while attacking.
; bPursuingFlag : Used by [[Legacy:CTFSquadAI|CTFSquadAI]].
; bJustLanded : The bot has just recently landed from a fall.
; bSingleTestSection : Used in ReviewJumpSpots
; bRecommendFastMove : One of the factors in deciding whether to do a translocator hop in &lt;tt&gt;FaceActor&lt;/tt&gt;. May also be set by the squad AI (as in [[Legacy:BombingRunSquadAI|BombingRunSquadAI]]).

===Translocating===
; TranslocationTarget : The actor at which the bot is shooting its translocator. Used for translocator hopping, and also set by [[Legacy:JumpSpot|JumpSpot]]. Not to be confused with the [[Legacy:TransBeacon|TransBeacon]] property of the same name.
; RealTranslocationTarget : There doesn't seem to be any instance where this is set differently from TranslocationTarget.
; ImpactTarget : Used for impact/shield jumping.
; TranslocFreq : Set by [[Legacy:TransLancher|TransLancher]] to help bots keep from exceeding its charge.

===Messages===
; OldMessageType : Type of last message sent. Used in the &lt;tt&gt;SendMessage&lt;/tt&gt; function to keep from repeating the same message too much.
; OldMessageID : Last message ID, as with OldMessageType.

===Advanced AI Attributes===
; HidingSpot : Used to track down enemies after losing sight of them.
; Aggressiveness : 0.0 to 1.0 (typically)
; LastAttractCheck
; BlockedPath
; AcquireTime : time at which current enemy was acquired
; Aggression
; LoseEnemyCheckTime : Used in &lt;tt&gt;LoseEnemy&lt;/tt&gt; to keep from calling &lt;tt&gt;Squad.LostEnemy()&lt;/tt&gt; too often.
; StartleActor : The last actor passed to &lt;tt&gt;Startle()&lt;/tt&gt;
; StartTacticalTime : Set in &lt;tt&gt;TacticalMove.PickDestination&lt;/tt&gt;

===Modifiable AI Attributes===
; BaseAlertness
; Accuracy : -1 to 1 (0 is default, higher is more accurate)
; BaseAggressiveness : 0 to 1 (0.3 default, higher is more aggressive)
; StrafingAbility : -1 to 1 (higher uses strafing more)
; CombatStyle : -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee.
; Tactics
; TranslocUse : 0 to 1 - higher means more likely to use.
; ReactionTime
; FavoriteWeapon

==Team AI Attributes==
; GoalString : For debugging - used to show what bot is thinking (with 'ShowDebug').
; SoakString : For debugging - shows problem when soaking.
; Squad : The [[Legacy:SquadAI|SquadAI]] that the bot is in.
; NextSquadMember : Linked list of members of this squad
; ReTaskTime : Time when squad will retask bot (delayed to avoid hitches).
; FormationPosition : Determined by the squad's [[Legacy:RestingFormation|RestingFormation]].

===Scripted Sequences===
; GoalScript : [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] bot is moving toward (assigned by [[Legacy:TeamAI|TeamAI]]).
; EnemyAcquisitionScript : Determined by &lt;tt&gt;GoalScript&lt;/tt&gt;.
; ScriptedCombat : See the &lt;tt&gt;EScriptFollow&lt;/tt&gt; enum.

===ChooseAttachMode() state===
; ChoosingAttackLevel : Used to detect nested calls to &lt;tt&gt;WhatToDoNext&lt;/tt&gt;.
; ChooseAttackTime : Used in &lt;tt&gt;WhatToDoNext&lt;/tt&gt; to detect when it gets called too often (more than 3 times a second).
; ChooseAttackCounter : How many times &lt;tt&gt;WhatToDoNext&lt;/tt&gt; has been called in the current level time second.
; EnemyVisibilityTime : The last time when the enemy became visible.
; VisibleEnemy : Helps determine if the enemy is visible.
; OldEnemy : Marked with &quot;FIXME TEMP&quot;.
; StopStartTime : Time that the bot started standing still (sniping, waiting for mover, etc.).
; LastRespawnTime : Used by [[Legacy:CTFSquadAI|CTFSquadAI]] in determining whether to pursue an enemy flag carrier.
; FailedHuntTime : The last time that the bot could not find a path to its enemy.
; FailedHuntEnemy : The last enemy to which the bot could not find a path.

===Inventory Search===
; LastSearchTime
; LastSearchWeight
; CampTime
; LastTaunt
; NumRandomJumps : Attempts to free bot from being stuck.
; ComboNames[4]

===Weapon Check===
; LastFireAttempt
; GatherTime
; OrderNames[16]

===1vs1 Enemy Location Model===
; LastKnownPosition
; LastKillerPosition

===ReviewJumpSpots===
; TestStart
; TestPath
; TestLabel

==Enums==

===EScriptFollow===
; FOLLOWSCRIPT_IgnoreAllStimuli
; FOLLOWSCRIPT_IgnoreEnemies
; FOLLOWSCRIPT_StayOnScript
; FOLLOWSCRIPT_LeaveScriptForCombat

==Known Subclasses==
* [[Legacy:XBot|xBot]]
** [[Legacy:InvasionBot|InvasionBot]]

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:[Basic Bot Pathing|[Basic Bot Pathing]] &amp;ndash; A tutorial for basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]]
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Related Classes==
* [[Legacy:SquadAI|SquadAI]]
* [[Legacy:TeamAI|TeamAI]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:ScriptedSequence|ScriptedSequence]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Discussion==

'''SuperApe:''' Removed &quot;function description links&quot; to other pages.  Only [[Legacy:Bot/Weapon Management|Bot/Weapon Management]] was made and it was utterly useless.  Called for a refactor to this page.

----

[[:Category:Legacy To Do]] &amp;ndash; Add functions definitions.
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1890</id>
      <timestamp>2005-11-21T18:37:06Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; Bot}}

The Bot class contains most of the details of the AI implementation, except for team-related functions which are mostly handled by the [[Legacy:SquadAI|SquadAI]]. It also has some game-specific code, referencing [[Legacy:TransLauncher|TransLauncher]] for translocator hopping (that is, using the translocator just to get you somewhere faster), and [[Legacy:BallLauncher|BallLauncher]] for self-passing in Bombing Run.

==Properties==

Nearly all Bot properties are hidden. (exception: OrderNames)

===AI Magic Numbers===
; AngleConvert = 0.0000958738 (const) : 2*PI/65536

===AI Flags===
; bool bCanFire : used by TacticalMove and Charging states
; bool bStrafeDir
; bool bCanLeadTarget : Lead target with projectile attack.
; bool bChangeDir : Tactical move boolean.
; bool bFrustrated : Being attacked in certain states causes frustration, and a frustrated bot is more aggressive.
; bool bInitLifeMessage : Keeps track of whether the bot has sent messages like &quot;I've got your back&quot; or &quot;I'm in position&quot;. Used by squad AIs.
; bool bReachedGatherPoint : Used for gathering a squad at an [[Legacy:AlternatePath|AlternatePath]]. Used by squad AIs.
; bool bFinalStretch : True if the bot is almost at its destination objective (ie a flag base). Set by squad AIs.
; bool bJumpy : Likes to jump around if true.
; bool bHasTranslocator
; bool bHasImpactHammer
; bool bTacticalDoubleJump : True when the bot is going to double jump.
; bool bWasNearObjective : Used by &lt;tt&gt;[[Legacy:GameObjective|GameObjective]].BotNearObjective&lt;/tt&gt;.
; bool bPlannedShot : Used for self-passing in Bombing Run.
; bool bHasFired : The bot has recently fired its weapon.
; bool bForcedDirection : Keeps the bot moving in the same direction for tactical moves.
; bool bFireSuccess : Determined by the [[Legacy:Weapon|Weapon]]'s &lt;tt&gt;BotFire&lt;/tt&gt; method, which indicates if the weapon actually fired.
; bool bStoppedFiring : Set to true in the &lt;tt&gt;StopFiring&lt;/tt&gt; method.
; bool bEnemyIsVisible
; bool bTranslocatorHop : Used during a translocator hop maneuver. Also referenced by [[Legacy:TransLauncher|TransLauncher]].
; bool bEnemyEngaged : Used by [[Legacy:SquadAI|SquadAI]] when finding defense scripts.
; bool bMustCharge : Used in &lt;tt&gt;FightEnemy&lt;/tt&gt; to determine if the bot should charge the enemy while attacking.
; bool bPursuingFlag : Used by [[Legacy:CTFSquadAI|CTFSquadAI]].
; bool bJustLanded : The bot has just recently landed from a fall.
; bool bSingleTestSection : Used in ReviewJumpSpots
; bool bRecommendFastMove : One of the factors in deciding whether to do a translocator hop in &lt;tt&gt;FaceActor&lt;/tt&gt;. May also be set by the squad AI (as in [[Legacy:BombingRunSquadAI|BombingRunSquadAI]]).

===Translocating===
; actor TranslocationTarget : The actor at which the bot is shooting its translocator. Used for translocator hopping, and also set by [[Legacy:JumpSpot|JumpSpot]]. Not to be confused with the [[Legacy:TransBeacon|TransBeacon]] property of the same name.
; actor RealTranslocationTarget : There doesn't seem to be any instance where this is set differently from TranslocationTarget.
; actor ImpactTarget : Used for impact/shield jumping.
; float TranslocFreq : Set by [[Legacy:TransLancher|TransLancher]] to help bots keep from exceeding its charge.
; float NextTranslocTime :

===Messages===
; name OldMessageType : Type of last message sent. Used in the &lt;tt&gt;SendMessage&lt;/tt&gt; function to keep from repeating the same message too much.
; int OldMessageID : Last message ID, as with OldMessageType.

===Advanced AI Attributes===
; vector HidingSpot : Used to track down enemies after losing sight of them.
; float Aggressiveness : 0.0 to 1.0 (typically)
; float LastAttractCheck :
; [[Legacy:NavigationPoint|NavigationPoint]] BlockedPath :
; float AcquireTime : time at which current enemy was acquired
; float Aggression
; float LoseEnemyCheckTime : Used in &lt;tt&gt;LoseEnemy&lt;/tt&gt; to keep from calling &lt;tt&gt;Squad.LostEnemy()&lt;/tt&gt; too often.
; actor StartleActor : The last actor passed to &lt;tt&gt;Startle()&lt;/tt&gt;
; float StartTacticalTime : Set in &lt;tt&gt;TacticalMove.PickDestination&lt;/tt&gt;

===Modifiable AI Attributes===
; float BaseAlertness
; float Accuracy : -1 to 1 (0 is default, higher is more accurate)
; float BaseAggressiveness : 0 to 1 (0.3 default, higher is more aggressive)
; float StrafingAbility : -1 to 1 (higher uses strafing more)
; float CombatStyle : -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee.
; float Tactics
; float TranslocUse : 0 to 1 - higher means more likely to use.
; float ReactionTime
; class&lt;[[Legacy:Weapon|Weapon]]&gt; FavoriteWeapon

==Team AI Attributes==
; string GoalString : For debugging - used to show what bot is thinking (with 'ShowDebug').
; string SoakString : For debugging - shows problem when soaking.
; [[Legacy:SquadAI|SquadAI]] Squad : The [[Legacy:SquadAI|SquadAI]] that the bot is in.
; [[Legacy:Bot|Bot]] NextSquadMember : Linked list of members of this squad
; float ReTaskTime : Time when squad will retask bot (delayed to avoid hitches).
; int FormationPosition : Determined by the squad's [[Legacy:RestingFormation|RestingFormation]].

===Scripted Sequences===
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] GoalScript : [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] bot is moving toward (assigned by [[Legacy:TeamAI|TeamAI]]).
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] EnemyAcquisitionScript : Determined by &lt;tt&gt;GoalScript&lt;/tt&gt;.
; [[Legacy:Vehicle|Vehicle]] FormerVehicle :
; enum&lt;EScriptFollow&gt; ScriptedCombat : See the &lt;tt&gt;EScriptFollow&lt;/tt&gt; enum.

===ChooseAttachMode() state===
; int ChoosingAttackLevel : Used to detect nested calls to &lt;tt&gt;WhatToDoNext&lt;/tt&gt;.
; float ChooseAttackTime : Used in &lt;tt&gt;WhatToDoNext&lt;/tt&gt; to detect when it gets called too often (more than 3 times a second).
; int ChooseAttackCounter : How many times &lt;tt&gt;WhatToDoNext&lt;/tt&gt; has been called in the current level time second.
; float EnemyVisibilityTime : The last time when the enemy became visible.
; [[Legacy:Pawn|Pawn]] VisibleEnemy : Helps determine if the enemy is visible.
; [[Legacy:Pawn|Pawn]] OldEnemy : Marked with &quot;FIXME TEMP&quot;.
; float StopStartTime : Time that the bot started standing still (sniping, waiting for mover, etc.).
; float LastRespawnTime : Used by [[Legacy:CTFSquadAI|CTFSquadAI]] in determining whether to pursue an enemy flag carrier.
; float FailedHuntTime : The last time that the bot could not find a path to its enemy.
; [[Legacy:Pawn|Pawn]] FailedHuntEnemy : The last enemy to which the bot could not find a path.

===Inventory Search===
; float LastSearchTime
; float LastSearchWeight
; float CampTime
; int LastTaunt
; int NumRandomJumps : Attempts to free bot from being stuck.
; string ComboNames[4]

===Weapon Check===
; float LastFireAttempt
; float GatherTime
; name OrderNames[16]
; name OldOrders
; [[Legacy:Controller|Controller]] OldOrderGiver

===1vs1 Enemy Location Model===
; vector LastKnownPosition
; vector LastKillerPosition

===ReviewJumpSpots===
; [[Legacy:NavigationPoint|NavigationPoint]] TestStart
; int TestPath
; name TestLabel

==Enums==

===EScriptFollow===
; FOLLOWSCRIPT_IgnoreAllStimuli
; FOLLOWSCRIPT_IgnoreEnemies
; FOLLOWSCRIPT_StayOnScript
; FOLLOWSCRIPT_LeaveScriptForCombat

==Known Subclasses==
* [[Legacy:XBot|xBot]]
** [[Legacy:InvasionBot|InvasionBot]]

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial for basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]]
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Related Classes==
* [[Legacy:Controller Overview|Controller Overview]]
* [[Legacy:SquadAI|SquadAI]]
* [[Legacy:TeamAI|TeamAI]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:ScriptedSequence|ScriptedSequence]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Discussion==

'''SuperApe:''' Removed &quot;function description links&quot; to other pages.  Only [[Legacy:Bot/Weapon Management|Bot/Weapon Management]] was made and it was utterly useless.  Added To Do tag.  Filled in all property variable types.

----

[[:Category:Legacy To Do]] &amp;ndash; Add functions definitions.
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>39976</id>
      <timestamp>2009-11-14T19:14:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Translocating */ fixed typo in link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; Bot}}

The Bot class contains most of the details of the AI implementation, except for team-related functions which are mostly handled by the [[Legacy:SquadAI|SquadAI]]. It also has some game-specific code, referencing [[Legacy:TransLauncher|TransLauncher]] for translocator hopping (that is, using the translocator just to get you somewhere faster), and [[Legacy:BallLauncher|BallLauncher]] for self-passing in Bombing Run.

==Properties==

Nearly all Bot properties are hidden. (exception: OrderNames)

===AI Magic Numbers===
; AngleConvert = 0.0000958738 (const) : 2*PI/65536

===AI Flags===
; bool bCanFire : used by TacticalMove and Charging states
; bool bStrafeDir
; bool bCanLeadTarget : Lead target with projectile attack.
; bool bChangeDir : Tactical move boolean.
; bool bFrustrated : Being attacked in certain states causes frustration, and a frustrated bot is more aggressive.
; bool bInitLifeMessage : Keeps track of whether the bot has sent messages like &quot;I've got your back&quot; or &quot;I'm in position&quot;. Used by squad AIs.
; bool bReachedGatherPoint : Used for gathering a squad at an [[Legacy:AlternatePath|AlternatePath]]. Used by squad AIs.
; bool bFinalStretch : True if the bot is almost at its destination objective (ie a flag base). Set by squad AIs.
; bool bJumpy : Likes to jump around if true.
; bool bHasTranslocator
; bool bHasImpactHammer
; bool bTacticalDoubleJump : True when the bot is going to double jump.
; bool bWasNearObjective : Used by &lt;tt&gt;[[Legacy:GameObjective|GameObjective]].BotNearObjective&lt;/tt&gt;.
; bool bPlannedShot : Used for self-passing in Bombing Run.
; bool bHasFired : The bot has recently fired its weapon.
; bool bForcedDirection : Keeps the bot moving in the same direction for tactical moves.
; bool bFireSuccess : Determined by the [[Legacy:Weapon|Weapon]]'s &lt;tt&gt;BotFire&lt;/tt&gt; method, which indicates if the weapon actually fired.
; bool bStoppedFiring : Set to true in the &lt;tt&gt;StopFiring&lt;/tt&gt; method.
; bool bEnemyIsVisible
; bool bTranslocatorHop : Used during a translocator hop maneuver. Also referenced by [[Legacy:TransLauncher|TransLauncher]].
; bool bEnemyEngaged : Used by [[Legacy:SquadAI|SquadAI]] when finding defense scripts.
; bool bMustCharge : Used in &lt;tt&gt;FightEnemy&lt;/tt&gt; to determine if the bot should charge the enemy while attacking.
; bool bPursuingFlag : Used by [[Legacy:CTFSquadAI|CTFSquadAI]].
; bool bJustLanded : The bot has just recently landed from a fall.
; bool bSingleTestSection : Used in ReviewJumpSpots
; bool bRecommendFastMove : One of the factors in deciding whether to do a translocator hop in &lt;tt&gt;FaceActor&lt;/tt&gt;. May also be set by the squad AI (as in [[Legacy:BombingRunSquadAI|BombingRunSquadAI]]).

===Translocating===
; actor TranslocationTarget : The actor at which the bot is shooting its translocator. Used for translocator hopping, and also set by [[Legacy:JumpSpot|JumpSpot]]. Not to be confused with the [[Legacy:TransBeacon|TransBeacon]] property of the same name.
; actor RealTranslocationTarget : There doesn't seem to be any instance where this is set differently from TranslocationTarget.
; actor ImpactTarget : Used for impact/shield jumping.
; float TranslocFreq : Set by [[Legacy:TransLauncher|TransLauncher]] to help bots keep from exceeding its charge.
; float NextTranslocTime :

===Messages===
; name OldMessageType : Type of last message sent. Used in the &lt;tt&gt;SendMessage&lt;/tt&gt; function to keep from repeating the same message too much.
; int OldMessageID : Last message ID, as with OldMessageType.

===Advanced AI Attributes===
; vector HidingSpot : Used to track down enemies after losing sight of them.
; float Aggressiveness : 0.0 to 1.0 (typically)
; float LastAttractCheck :
; [[Legacy:NavigationPoint|NavigationPoint]] BlockedPath :
; float AcquireTime : time at which current enemy was acquired
; float Aggression
; float LoseEnemyCheckTime : Used in &lt;tt&gt;LoseEnemy&lt;/tt&gt; to keep from calling &lt;tt&gt;Squad.LostEnemy()&lt;/tt&gt; too often.
; actor StartleActor : The last actor passed to &lt;tt&gt;Startle()&lt;/tt&gt;
; float StartTacticalTime : Set in &lt;tt&gt;TacticalMove.PickDestination&lt;/tt&gt;

===Modifiable AI Attributes===
; float BaseAlertness
; float Accuracy : -1 to 1 (0 is default, higher is more accurate)
; float BaseAggressiveness : 0 to 1 (0.3 default, higher is more aggressive)
; float StrafingAbility : -1 to 1 (higher uses strafing more)
; float CombatStyle : -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee.
; float Tactics
; float TranslocUse : 0 to 1 - higher means more likely to use.
; float ReactionTime
; class&lt;[[Legacy:Weapon|Weapon]]&gt; FavoriteWeapon

==Team AI Attributes==
; string GoalString : For debugging - used to show what bot is thinking (with 'ShowDebug').
; string SoakString : For debugging - shows problem when soaking.
; [[Legacy:SquadAI|SquadAI]] Squad : The [[Legacy:SquadAI|SquadAI]] that the bot is in.
; [[Legacy:Bot|Bot]] NextSquadMember : Linked list of members of this squad
; float ReTaskTime : Time when squad will retask bot (delayed to avoid hitches).
; int FormationPosition : Determined by the squad's [[Legacy:RestingFormation|RestingFormation]].

===Scripted Sequences===
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] GoalScript : [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] bot is moving toward (assigned by [[Legacy:TeamAI|TeamAI]]).
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] EnemyAcquisitionScript : Determined by &lt;tt&gt;GoalScript&lt;/tt&gt;.
; [[Legacy:Vehicle|Vehicle]] FormerVehicle :
; enum&lt;EScriptFollow&gt; ScriptedCombat : See the &lt;tt&gt;EScriptFollow&lt;/tt&gt; enum.

===ChooseAttachMode() state===
; int ChoosingAttackLevel : Used to detect nested calls to &lt;tt&gt;WhatToDoNext&lt;/tt&gt;.
; float ChooseAttackTime : Used in &lt;tt&gt;WhatToDoNext&lt;/tt&gt; to detect when it gets called too often (more than 3 times a second).
; int ChooseAttackCounter : How many times &lt;tt&gt;WhatToDoNext&lt;/tt&gt; has been called in the current level time second.
; float EnemyVisibilityTime : The last time when the enemy became visible.
; [[Legacy:Pawn|Pawn]] VisibleEnemy : Helps determine if the enemy is visible.
; [[Legacy:Pawn|Pawn]] OldEnemy : Marked with &quot;FIXME TEMP&quot;.
; float StopStartTime : Time that the bot started standing still (sniping, waiting for mover, etc.).
; float LastRespawnTime : Used by [[Legacy:CTFSquadAI|CTFSquadAI]] in determining whether to pursue an enemy flag carrier.
; float FailedHuntTime : The last time that the bot could not find a path to its enemy.
; [[Legacy:Pawn|Pawn]] FailedHuntEnemy : The last enemy to which the bot could not find a path.

===Inventory Search===
; float LastSearchTime
; float LastSearchWeight
; float CampTime
; int LastTaunt
; int NumRandomJumps : Attempts to free bot from being stuck.
; string ComboNames[4]

===Weapon Check===
; float LastFireAttempt
; float GatherTime
; name OrderNames[16]
; name OldOrders
; [[Legacy:Controller|Controller]] OldOrderGiver

===1vs1 Enemy Location Model===
; vector LastKnownPosition
; vector LastKillerPosition

===ReviewJumpSpots===
; [[Legacy:NavigationPoint|NavigationPoint]] TestStart
; int TestPath
; name TestLabel

==Enums==

===EScriptFollow===
; FOLLOWSCRIPT_IgnoreAllStimuli
; FOLLOWSCRIPT_IgnoreEnemies
; FOLLOWSCRIPT_StayOnScript
; FOLLOWSCRIPT_LeaveScriptForCombat

==Known Subclasses==
* [[Legacy:XBot|xBot]]
** [[Legacy:InvasionBot|InvasionBot]]

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial for basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
*** [[Legacy:Creating And Using ScriptedActions|Creating And Using ScriptedActions]]
*** [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]]
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Related Classes==
* [[Legacy:Controller Overview|Controller Overview]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:ScriptedSequence|ScriptedSequence]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

===Related Bot AI Classes===

The following classes and subclasses thereof are involved in UT200x bot support AI.  Certain game objects have AI components telling bots what to do with them.
* [[Legacy:TeamAI|TeamAI]] - Creates squads, assigns bots to them and changes the objectives of squads based on the objectives of the [[Legacy:Gametype|gametype]].
* [[Legacy:SquadAI|SquadAI]] - Team of bots following a Squad Leader.
* [[Legacy:GameObjective|GameObjective]] - Immobile (though possibly destructible) markers for relevant places in a map:  CTF flag bases, Bombing Run bomb spawn points, goal hoops, Domination control points and so on.
* [[Legacy:Weapon|Weapon]] - Weapon inventory items.
* [[Legacy:NavigationPoint|NavigationPoint]] - Various NavigationPoints, like [[Legacy:Door|Door]], [[Legacy:LiftExit|LiftExit]], etc., have code or critical properties that work with other bot support actors.

==Discussion==

'''SuperApe:''' Removed &quot;function description links&quot; to other pages.  Only [[Legacy:Bot/Weapon Management|Bot/Weapon Management]] was made and it was utterly useless.  Added To Do tag.  Filled in all property variable types.

----

[[:Category:Legacy To Do]] &amp;ndash; Add functions definitions.
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot (P2)</title>
    <id>28868</id>
    <revision>
      <id>42795</id>
      <timestamp>2010-03-30T16:20:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot (UT)</title>
    <id>579</id>
    <revision>
      <id>1767</id>
      <timestamp>2006-04-07T07:54:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; Bot (Package: Botpack)}}

Base class for all [[Legacy:Artificial Intelligence|AI]]-controlled players in Unreal Tournament. See also [[Legacy:Bots|Bots]], the corresponding base class in [[Legacy:Unreal 1|Unreal 1]].

The behaviour of the bots is determined by their current state and what orders they have (if any).  Essentially, the bot takes a stimulus like the desire for a weapon, or spotting another pawn, and determines an action based upon it's own internal state and orders.  Sometimes the bot will change it's own internal state to enable it to better deal with the action it wishes to perform.

At its most basic the bot AI can be boiled down to the following actions below repeated ''ad nauseum''.
* Find big guns and ammunition.
* See other pawn - attack other pawn.

For a slightly more detailed view of the bot AI see the [[Legacy:Bot Support (UT)|Bot Support (UT)]] page.

==Known Subclasses==
* [[Legacy:HumanBotPlus|HumanBotPlus]]
* [[Legacy:SkaarjBot|SkaarjBot]]

==Orders==
; Point : If a bot has &quot;Point&quot; orders then it can command other bots.  I vaguely remember seeing a limit to the number of bots each bot could command somewhere in the code but I wouldn't bet anything on it (not even a pair of smelly old socks).
; Follow : This order will cause the bot to follow the pawn that gave the &quot;follow&quot; order.  The Actor that gave the order is assigned to the ''OrderObject'' property.
; Hold : Bots under this order will attempt to hold the position that they have been assigned.
; Defend : Bots under this order will find a nice spot to camp and set up their tent.
; Attack : Bots under this order will enter a search and destroy mode, or, attempt to capture the flag, control point, or complete the next objective.
; FreeLance : Bots under this order will do whatever they decide is necessary.  In deathmatch games they collect inventory until they find someone to fight.  In team games they decide what to do based upon the current state of the game.

==States==
; StartUp : The initial starting state for a bot.
; Holding : 
; Hold : 
; Roaming : 
; Wandering : 
; Acquisition : 
; Attacking : 
; Retreating : 
; Fallback : 
; Charging : In this state the bot will rush at it's enemy with no regard for the continued well being of either itself or its target.
; TacticalMove : 
; Hunting : 
; StakeOut : 
; TakeHit : 
; ImpactJumping : 
; FallingState : 
; RangedAttack : 
; VictoryDance : 
; GameEnded : This state is entered when the game has ended.  It essentially prevents the bots from moving around and doing things once the game is over.
; Dying : This is the state that is entered when the bot has been killed and is busy &quot;dying&quot; (presumably leaking decals all over the place and generally making a mess).
; FindAir : 

==Functions==

See [[Legacy:Bot (UT)/Graphics And Animation|graphics and animation]] functions for the list of functions used to handle pawn animations and graphics.

==AI Functions==
; function [[Legacy:EAttitude|eAttitude]] AttitudeTo( [[Legacy:Pawn (UT)|Pawn (UT)]] Other ) : This function determines the bot's attitude towards the ''Other'' pawn.  The function can return any of the following attitudes: ''fear'', ''hate'', ''ignore'', and ''friendly''.  The primary driver for the bot's attitude towards ''Other'' is the function [[Legacy:DeathMatchPlus|DeathMatchPlus]].AssessBotAttitude() (This function is overidden in the game type classes).  The attitude calculated is then set to ''friendly'' if ''Other'' is on the same team as the bot and the game is a team game.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1768</id>
      <timestamp>2003-05-23T16:30:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; Bot (Package: Botpack)}}

Base class for all [[Legacy:Artificial Intelligence|AI]]-controlled players in Unreal Tournament. See also [[Legacy:Bots|Bots]], the corresponding base class in [[Legacy:Unreal 1|Unreal 1]].

The behaviour of the bots is determined by their current state and what orders they have (if any).  Essentially, the bot takes a stimulus like the desire for a weapon, or spotting another pawn, and determines an action based upon it's own internal state and orders.  Sometimes the bot will change it's own internal state to enable it to better deal with the action it wishes to perform.

At its most basic the bot AI can be boiled down to the following actions below repeated ''ad nauseum''.
* Find big guns and ammunition.
* See other pawn - attack other pawn.

For a slightly more detailed view of the bot AI see the [[Legacy:Bot Support (UT)|Bot Support (UT)]] page.

==Known Subclasses ==
* [[Legacy:HumanBotPlus|HumanBotPlus]]
* [[Legacy:SkaarjBot|SkaarjBot]]

==Orders ==
; Point : If a bot has &quot;Point&quot; orders then it can command other bots.  I vaguely remember seeing a limit to the number of bots each bot could command somewhere in the code but I wouldn't bet anything on it (not even a pair of smelly old socks).
; Follow : This order will cause the bot to follow the pawn that gave the &quot;follow&quot; order.  The Actor that gave the order is assigned to the ''OrderObject'' property.
; Hold : Bots under this order will attempt to hold the position that they have been assigned.
; Defend : Bots under this order will find a nice spot to camp and set up their tent.
; Attack : Bots under this order will enter a search and destroy mode, or, attempt to capture the flag, control point, or complete the next objective.
; FreeLance : Bots under this order will do whatever they decide is necessary.  In deathmatch games they collect inventory until they find someone to fight.  In team games they decide what to do based upon the current state of the game.

==States ==
; StartUp : The initial starting state for a bot.
; Holding : 
; Hold : 
; Roaming : 
; Wandering : 
; Acquisition : 
; Attacking : 
; Retreating : 
; Fallback : 
; Charging : In this state the bot will rush at it's enemy with no regard for the continued well being of either itself or its target.
; TacticalMove : 
; Hunting : 
; StakeOut : 
; TakeHit : 
; ImpactJumping : 
; FallingState : 
; RangedAttack : 
; VictoryDance : 
; GameEnded : This state is entered when the game has ended.  It essentially prevents the bots from moving around and doing things once the game is over.
; Dying : This is the state that is entered when the bot has been killed and is busy &quot;dying&quot; (presumably leaking decals all over the place and generally making a mess).
; FindAir : 

==Functions ==

See [[Legacy:Bot (UT)/Graphics And Animation|graphics and animation]] functions for the list of functions used to handle pawn animations and graphics.

==AI Functions ==
; function [[Legacy:EAttitude|eAttitude]] AttitudeTo( [[Legacy:Pawn (UT)|Pawn (UT)]] Other ) : This function determines the bot's attitude towards the ''Other'' pawn.  The function can return any of the following attitudes: ''fear'', ''hate'', ''ignore'', and ''friendly''.  The primary driver for the bot's attitude towards ''Other'' is the function [[Legacy:DeathMatchPlus|DeathMatchPlus]].AssessBotAttitude() (This function is overidden in the game type classes).  The attitude calculated is then set to ''friendly'' if ''Other'' is on the same team as the bot and the game is a team game.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1769</id>
      <timestamp>2006-04-06T21:05:54Z</timestamp>
      <contributor>
        <ip>Mail.belltel.ph</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; Bot (Package: Botpack)}}

Base class for all [[Legacy:Artificial Intelligence|AI]]-controlled players in Unreal Tournament. See also [[Legacy:Bots|Bots]], the corresponding base class in [[Legacy:Unreal 1|Unreal 1]].

The behaviour of the bots is determined by their current state and what orders they have (if any).  Essentially, the bot takes a stimulus like the desire for a weapon, or spotting another pawn, and determines an action based upon it's own internal state and orders.  Sometimes the bot will change it's own internal state to enable it to better deal with the action it wishes to perform.

At its most basic the bot AI can be boiled down to the following actions below repeated ''ad nauseum''.
* Find big guns and ammunition.
* See other pawn - attack other pawn.

For a slightly more detailed view of the bot AI see the [[Legacy:Bot Support (UT)|Bot Support (UT)]] page.

==Known Subclasses ==
* [[Legacy:HumanBotPlus|HumanBotPlus]]
* [[Legacy:SkaarjBot|SkaarjBot]]

==Orders ==
; Point : If a bot has &quot;Point&quot; orders then it can command other bots.  I vaguely remember seeing a limit to the number of bots each bot could command somewhere in the code but I wouldn't bet anything on it (not even a pair of smelly old socks).
; Follow : This order will cause the bot to follow the pawn that gave the &quot;follow&quot; order.  The Actor that gave the order is assigned to the ''OrderObject'' property.
; Hold : Bots under this order will attempt to hold the position that they have been assigned.
; Defend : Bots under this order will find a nice spot to camp and set up their tent.
; Attack : Bots under this order will enter a search and destroy mode, or, attempt to capture the flag, control point, or complete the next objective.
; FreeLance : Bots under this order will do whatever they decide is necessary.  In deathmatch games they collect inventory until they find someone to fight.  In team games they decide what to do based upon the current state of the game.

==States ==
; StartUp : The initial starting state for a bot.
; Holding : 
; Hold : 
; Roaming : 
; Wandering : 
; Acquisition : 
; Attacking : 
; Retreating : 
; Fallback : 
; Charging : In this state the bot will rush at it's enemy with no regard for the continued well being of either itself or its target.
; TacticalMove : 
; Hunting : 
; StakeOut : 
; TakeHit : 
; ImpactJumping : 
; FallingState : 
; RangedAttack : 
; VictoryDance : 
; GameEnded : This state is entered when the game has ended.  It essentially prevents the bots from moving around and doing things once the game is over.
; Dying : This is the state that is entered when the bot has been killed and is busy &quot;dying&quot; (presumably leaking decals all over the place and generally making a mess).
; FindAir : 

==Functions ==

See [[Legacy:Bot (UT)/Graphics And Animation|graphics and animation]] functions for the list of functions used to handle pawn animations and graphics.

==AI Functions ==
; function [[Legacy:EAttitude|eAttitude]] AttitudeTo( [[Legacy:Pawn (UT)|Pawn (UT)]] Other ) : This function determines the bot's attitude towards the ''Other'' pawn.  The function can return any of the following attitudes: ''fear'', ''hate'', ''ignore'', and ''friendly''.  The primary driver for the bot's attitude towards ''Other'' is the function [[Legacy:DeathMatchPlus|DeathMatchPlus]].AssessBotAttitude() (This function is overidden in the game type classes).  The attitude calculated is then set to ''friendly'' if ''Other'' is on the same team as the bot and the game is a team game.

----

[[:Category:Legacy Class (UT)]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot (UT)/Graphics And Animation</title>
    <id>578</id>
    <revision>
      <id>1766</id>
      <timestamp>2002-04-30T10:58:10Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Created page for my sins.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:Bot (UT)|Bot (UT)]] / Graphics and Animation Functions}}

''Note'': This section maybe be pointless, but I'm including it for completeness sake.  and you never know, someone might want to finish it off.

; function PlayLookAround() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayChallenge() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayCombatMove() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayDeathHit( float Damage, vector HitLocation, name damageType, vector Momentum ) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayDyingSound() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayFiring() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayFlip() : &lt;i&gt;Finish me&lt;/i&gt;
; simulated function PlayFootStep() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayGutHit( float tweentime ) : &lt;i&gt;Finish me - Default location specific take hits  - make sure pain frames are named right&lt;/i&gt;
; function PlayHeadHit( float tweentime) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayHit( float Damage, vector HitLocation, name damageType, vector Momentum ) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayHitAnim( vector HitLocation, float Damage ) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayLeftHit( float tweentime ) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayMeleeAttack() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayMovingAttack() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayOutOfWater() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayRightHit( float tweentime ) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayRangedAttack() : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayTakeHitSound( int damage, name damageType, int Mult ) : &lt;i&gt;Finish me&lt;/i&gt;
; function PlayWaving() : &lt;i&gt;Finish me&lt;/i&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot 40</title>
    <id>588</id>
    <revision>
      <id>1788</id>
      <timestamp>2004-02-06T13:31:17Z</timestamp>
      <contributor>
        <ip>Wc5.york.ac.uk</ip>
      </contributor>
      <comment>DM-Deck_40 released</comment>
      <text xml:space="preserve">===Bot_40===

====Friday 6/2/2004 (13:37pm gmt!)====

Finished a map finally! DM-Deck_40 is released! look here for the map: http://www.unrealplayground.com/mapper.php?id=314

Here is a screenshot if you want to look at it first, but you really should just download it straight away and not delay :p http://forums.unrealplayground.com/attachment.php?attachmentid=15442&amp;stc=1

====Tuesday 27/1/2004====

Wow I am still alive O_o. Well all goes well and I am studying compsci at york uni = time of meh life :p Anyways mapping kinda dropped off to basiclly being non-existant, but I still do some now and again and I am finally just about done with a map (for the first time in about a year O_o). The map is a Deck16 remake, or it was supposed to be, but it changed so much it doesn't really have much to do with the original at all now. Since I've been working on it for so long there is a lot of stuff which isn't up to my current standard of work (mainly the lighting and some architecture and theming) but I'm not that bothered because I seem to have just about reached the limits of the old engine in terms of making a playable map under 350 polys. It's currently in beta form but I will release the final version sometime over then next few days. Keep checking http://www.unrealplayground.com/mapper.php?id=314 (the current one listed is just the beta)

====Sunday 3/8/2003====

Erm, it looks like I might abandon this map aswell, so much for finishing it no matter what. But at least this time it's because I realised I did 2-3 things completly wrong which is why the map sucks. Too generic, like a standard industrial map only ancient theme (hard to describe, but the map had no character). No proper set out theme. It was just a ancient temple thing in the desert, but when you were in the temple itself there was no sense of location, you could have been in the jungle for all you know, it needed more outside areas to make it feel more real. It didn't seem to have any purpose either, it was just a random temple in the desert, not in a special location or anything. Finally the architecture was poor. Individual rooms were okish but if you put them together then there was absoloutly no coherance between them in terms of style. One room was all angular and had lots of bars and roof beams etc. the next room was all curvy architecture and looked nothing like the first except for the textures.

Anyways, enough rant. I've got myself working on a not-so top secret map for UT that may surprise people. (well, it may surprise people just because I might actually release a map!)

====Sunday 20/7/2003====

Errr, just felt the need to update to say that I am still alive and mapping. UT2k3 map has been progressing slowly for the last month or so. It's my &quot;transition&quot; from UT to UT2k3 map or something, so it's not massively detailed. It's all custom meshes, but it looks more like a really high poly UT map rather than a UT2k3 map. Also, it's ancient style, so it brings back some sort of oldsk00l UT theme :)

Anyways, the gameplay will probably suck, so don't expect much there, I'm not sure how it will turn out in the end but I've already abandoned about 5 UT2k3 maps when they are about 50% done so I intend to finish this no matter what!

====Monday 30/6/2003====

Terrain tutorial is slightly updated with a few minor fixes. And a downloadable version is available[http://members.fortunecity.com/bot40/Terrain/Part5.html here!].

There is now another bit added on [http://members.fortunecity.com/bot40/Terrain/Beach.html making a beach], there are also a few other tips in there!

====Wednesday 25/6/2003====

Hey, I'm not doing too badly on updating this page more than once a century (unlike my site)! A few bits of news:
*Wrote a [http://members.fortunecity.com/bot40/Terrain/Part1.html tutorial] on making terrain in UT. Will definatly be adding smaller misc. tutorials to the end of it in the future.
*CTF-Wether got [http://www.unrealplayground.com/review.php?id=704 reviewed] at Unreal Playground (69/100) Not bad for a 2 day map!
*RealLife boring stuff (don't read): Exams have gone ok so far, I only have one more to do which is my final physics exam (tomorrow), then I will be done with school &amp; exams forever! I feel quite confident about getting into York uni now, the only exam I really struggled with was the Pure3 maths paper but I still did ok in that I think. All I need now is my 18th birthday so I can celebrate in style!
*Completly unrelated side note: HAHAHA @ General Studies :p

====Friday 30/5/2003====

And update within a week of the previous!!!! Don't expect them to be anything like that frequent in the future, it's only cuz I'm extremly bored.

Anyways, I was working on a techy type map but it went all wrong and started sucking badly so I had to abandon yet another map (don't tell claw, he doesn't know this map exists in the first place) :\

I'm just messing with some ancient themed stuff atm, should be an interesting change from all the high tech maps for UT2k3. It prolly won't turn into a map, it's just for me to practice some meshes more than anything else.

====Friday 23/5/2003====

I lack motivation for everything at the moment, but I have not been unproductive for the entire of the last 3-4 months. I've released 2 new UT maps, CTF-SuperStyler and CTF-Wether. Also, I started making a flyby for UT2k3 though the bsp was too complex and I had to abandon it.

You can always go here to see what maps I've released http://nalicity.beyondunreal.com/view_author.php?aid=1990

Oh ya, and ignore CTF-AreaZlalFactoryAlphaBase40, it's just a joke map really :\

And anything I mentioned about some terrain map below, ignore, I abandoned it cuz it was going nothing like what I originally wanted.

====Sunday 2/3/2003====

y4y, got an offer from York uni to do computer science so I passed the interview. Bad thing is I gotta get AAB in my A-Levels to get in. I'm gonna have to start doing some work for once...hmmm...maybe not :p Also got a working Radeon 9700 so I've been able to do some serious mapping (See [[Legacy:Bot 40/Developer Journal|my developer journal]] for details on that)

On the downside I got shedloads of computer studies coursework to be doing. And also I've had the worst run of cards at poker ever. Haven't had a decent hand for like, 3 months so money is also a problem. Thought I'm convinced my game has really improved as of late (funny how fast you learn to protect your chips when you get no decent hands) so when I do start getting some good cards the bankroll should start soaring :p

Also, I just saw the jackass movie. Leetage, for most of it it's just hilarious, for the rest, it just makes you cringe (arggg @ paper cuts and yellow snow cone :\)

Just finished downloading Deathball 1.5 yesturday. Definatly an improvement over 1.4. Haven't had long enough to test it properly yet though. It makes it a bit easier (and enjoyable) for defenders now which is nice seeing as I'm always a defender.

I'm so glad the ball dribbing has gone. I have no problem with people using it when they are in loads of space and want to speed up the attack, but the real annoyance is when someone manages to get behind the defense, you can't catch up with them. OK, maybe the defence cocked up to get in that position in the first place but when you have 200 ping like I have, it's much easier to miss a volley or ball interception so sometimes when that happens the offence runs past you while you're still in the air. It's nice to see that now, a goal is a result of the offence using good passing/positioning and setting up the attack well rather than the offence just doing &quot;No brainer dribbling&quot; and any goals being the result of a defender's mistake rather than an attacker doing something good.

Currently I'm looking forward to offsides, that's gonna own. Should add a new level of depth for both attackers and defenders.

I always like to have some extra skill put into the game to keep it fresh. I know a lot of people resent any major changes to the gameplay because they have become to used to the game. But for me, a lot of the fun is trying out a new version, figuring out the best tactics for situations and learning to master it. It's almost like when you buy a new game, a lot of the fun is involved in learning to play the game well rather than actually playing it (which does get stale after so long)

====Saturday 8/2/2003====

Err I'll prolly use this page more for general ranting about life and boring stuff just to get it out of my system so you prolly won't want to read any of this crap unless you're a total w3rdo :p

I'll try to keep my developer's journal more for mapping progress rather than general moaning.

(Let me see if I can get this link to work... [[Legacy:Bot 40/Developer Journal|My developer journal]]

Anyways, I sent off my Radeon9700 to be replaced for the second time, still waiting for a reply. If it doesn't get replaced this time I'm gonna get completly pissed off. Also I got a deadline for 50% of the written work for my computer studies coursework tomorrow and I haven't even started. I never learn. nm, I got 4 hours @ school to rush something off :\

Even worse though is my uni interview which I've got on saturday. That's gonna suck big time. It's my first formal interview so I hope I don't fuck it up lol. Scary :p

----

'''Tarquin:''' Hello :) welcome to the site. good lunk with the uni interview :D

'''Bot 40:'''Thanks :)

'''Wormbo:''' Welcome to the Wiki. Have a nice stay. :D

'''Piglet:''' Hey. I applied for computer science at York too, they rejected me :( so now im looking at going to Canterbury ABB or Swansea BBB, oh yes and HI

'''Claw:''' WEEEE Bot, since when do you have a Wiki page?

'''Bot 40:''' Since quite a while ago. I also have a dev. journal but I'm far too lazy to update that. I think I'll just stick to this page :) Linking here for news from my site was the best idea ever. Now I never ever have to update my site with news. And the maps just links to my nc map list so that automatically updates. The lack of effort required now is quite fantastic.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1789</id>
      <timestamp>2003-08-03T13:43:10Z</timestamp>
      <contributor>
        <ip>Bot 40</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Bot_40===

====Sunday 3/8/2003====

Erm, it looks like I might abandon this map aswell, so much for finishing it no matter what. But at least this time it's because I realised I did 2-3 things completly wrong which is why the map sucks. Too generic, like a standard industrial map only ancient theme (hard to describe, but the map had no character). No proper set out theme. It was just a ancient temple thing in the desert, but when you were in the temple itself there was no sense of location, you could have been in the jungle for all you know, it needed more outside areas to make it feel more real. It didn't seem to have any purpose either, it was just a random temple in the desert, not in a special location or anything. Finally the architecture was poor. Individual rooms were okish but if you put them together then there was absoloutly no coherance between them in terms of style. One room was all angular and had lots of bars and roof beams etc. the next room was all curvy architecture and looked nothing like the first except for the textures.

Anyways, enough rant. I've got myself working on a not-so top secret map for UT that may surprise people. (well, it may surprise people just because I might actually release a map!)

====Sunday 20/7/2003====

Errr, just felt the need to update to say that I am still alive and mapping. UT2k3 map has been progressing slowly for the last month or so. It's my &quot;transition&quot; from UT to UT2k3 map or something, so it's not massively detailed. It's all custom meshes, but it looks more like a really high poly UT map rather than a UT2k3 map. Also, it's ancient style, so it brings back some sort of oldsk00l UT theme :)

Anyways, the gameplay will probably suck, so don't expect much there, I'm not sure how it will turn out in the end but I've already abandoned about 5 UT2k3 maps when they are about 50% done so I intend to finish this no matter what!

====Monday 30/6/2003====

Terrain tutorial is slightly updated with a few minor fixes. And a downloadable version is available[http://members.fortunecity.com/bot40/Terrain/Part5.html here!].

There is now another bit added on [http://members.fortunecity.com/bot40/Terrain/Beach.html making a beach], there are also a few other tips in there!

====Wednesday 25/6/2003====

Hey, I'm not doing too badly on updating this page more than once a century (unlike my site)! A few bits of news:
*Wrote a [http://members.fortunecity.com/bot40/Terrain/Part1.html tutorial] on making terrain in UT. Will definatly be adding smaller misc. tutorials to the end of it in the future.
*CTF-Wether got [http://www.unrealplayground.com/review.php?id=704 reviewed] at Unreal Playground (69/100) Not bad for a 2 day map!
*RealLife boring stuff (don't read): Exams have gone ok so far, I only have one more to do which is my final physics exam (tomorrow), then I will be done with school &amp; exams forever! I feel quite confident about getting into York uni now, the only exam I really struggled with was the Pure3 maths paper but I still did ok in that I think. All I need now is my 18th birthday so I can celebrate in style!
*Completly unrelated side note: HAHAHA @ General Studies :p

====Friday 30/5/2003====

And update within a week of the previous!!!! Don't expect them to be anything like that frequent in the future, it's only cuz I'm extremly bored.

Anyways, I was working on a techy type map but it went all wrong and started sucking badly so I had to abandon yet another map (don't tell claw, he doesn't know this map exists in the first place) :\

I'm just messing with some ancient themed stuff atm, should be an interesting change from all the high tech maps for UT2k3. It prolly won't turn into a map, it's just for me to practice some meshes more than anything else.

====Friday 23/5/2003====

I lack motivation for everything at the moment, but I have not been unproductive for the entire of the last 3-4 months. I've released 2 new UT maps, CTF-SuperStyler and CTF-Wether. Also, I started making a flyby for UT2k3 though the bsp was too complex and I had to abandon it.

You can always go here to see what maps I've released http://nalicity.beyondunreal.com/view_author.php?aid=1990

Oh ya, and ignore CTF-AreaZlalFactoryAlphaBase40, it's just a joke map really :\

And anything I mentioned about some terrain map below, ignore, I abandoned it cuz it was going nothing like what I originally wanted.

====Sunday 2/3/2003====

y4y, got an offer from York uni to do computer science so I passed the interview. Bad thing is I gotta get AAB in my A-Levels to get in. I'm gonna have to start doing some work for once...hmmm...maybe not :p Also got a working Radeon 9700 so I've been able to do some serious mapping (See [[Legacy:Bot 40/Developer Journal|my developer journal]] for details on that)

On the downside I got shedloads of computer studies coursework to be doing. And also I've had the worst run of cards at poker ever. Haven't had a decent hand for like, 3 months so money is also a problem. Thought I'm convinced my game has really improved as of late (funny how fast you learn to protect your chips when you get no decent hands) so when I do start getting some good cards the bankroll should start soaring :p

Also, I just saw the jackass movie. Leetage, for most of it it's just hilarious, for the rest, it just makes you cringe (arggg @ paper cuts and yellow snow cone :\)

Just finished downloading Deathball 1.5 yesturday. Definatly an improvement over 1.4. Haven't had long enough to test it properly yet though. It makes it a bit easier (and enjoyable) for defenders now which is nice seeing as I'm always a defender.

I'm so glad the ball dribbing has gone. I have no problem with people using it when they are in loads of space and want to speed up the attack, but the real annoyance is when someone manages to get behind the defense, you can't catch up with them. OK, maybe the defence cocked up to get in that position in the first place but when you have 200 ping like I have, it's much easier to miss a volley or ball interception so sometimes when that happens the offence runs past you while you're still in the air. It's nice to see that now, a goal is a result of the offence using good passing/positioning and setting up the attack well rather than the offence just doing &quot;No brainer dribbling&quot; and any goals being the result of a defender's mistake rather than an attacker doing something good.

Currently I'm looking forward to offsides, that's gonna own. Should add a new level of depth for both attackers and defenders.

I always like to have some extra skill put into the game to keep it fresh. I know a lot of people resent any major changes to the gameplay because they have become to used to the game. But for me, a lot of the fun is trying out a new version, figuring out the best tactics for situations and learning to master it. It's almost like when you buy a new game, a lot of the fun is involved in learning to play the game well rather than actually playing it (which does get stale after so long)

====Saturday 8/2/2003====

Err I'll prolly use this page more for general ranting about life and boring stuff just to get it out of my system so you prolly won't want to read any of this crap unless you're a total w3rdo :p

I'll try to keep my developer's journal more for mapping progress rather than general moaning.

(Let me see if I can get this link to work... [[Legacy:Bot 40/Developer Journal|My developer journal]]

Anyways, I sent off my Radeon9700 to be replaced for the second time, still waiting for a reply. If it doesn't get replaced this time I'm gonna get completly pissed off. Also I got a deadline for 50% of the written work for my computer studies coursework tomorrow and I haven't even started. I never learn. nm, I got 4 hours @ school to rush something off :\

Even worse though is my uni interview which I've got on saturday. That's gonna suck big time. It's my first formal interview so I hope I don't fuck it up lol. Scary :p

----

'''Tarquin:''' Hello :) welcome to the site. good lunk with the uni interview :D

'''Bot 40:'''Thanks :)

'''Wormbo:''' Welcome to the Wiki. Have a nice stay. :D

'''Piglet:''' Hey. I applied for computer science at York too, they rejected me :( so now im looking at going to Canterbury ABB or Swansea BBB, oh yes and HI

'''Claw:''' WEEEE Bot, since when do you have a Wiki page?

'''Bot 40:''' Since quite a while ago. I also have a dev. journal but I'm far too lazy to update that. I think I'll just stick to this page :) Linking here for news from my site was the best idea ever. Now I never ever have to update my site with news. And the maps just links to my nc map list so that automatically updates. The lack of effort required now is quite fantastic.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1790</id>
      <timestamp>2004-01-27T16:12:56Z</timestamp>
      <contributor>
        <ip>Wc5.york.ac.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Bot_40===

====Tuesday 27/1/2004====

Wow I am still alive O_o. Well all goes well and I am studying compsci at york uni = time of meh life :p Anyways mapping kinda dropped off to basiclly being non-existant, but I still do some now and again and I am finally just about done with a map (for the first time in about a year O_o). The map is a Deck16 remake, or it was supposed to be, but it changed so much it doesn't really have much to do with the original at all now. Since I've been working on it for so long there is a lot of stuff which isn't up to my current standard of work (mainly the lighting and some architecture and theming) but I'm not that bothered because I seem to have just about reached the limits of the old engine in terms of making a playable map under 350 polys. It's currently in beta form but I will release the final version sometime over then next few days. Keep checking http://www.unrealplayground.com/mapper.php?id=314 (the current one listed is just the beta)

====Sunday 3/8/2003====

Erm, it looks like I might abandon this map aswell, so much for finishing it no matter what. But at least this time it's because I realised I did 2-3 things completly wrong which is why the map sucks. Too generic, like a standard industrial map only ancient theme (hard to describe, but the map had no character). No proper set out theme. It was just a ancient temple thing in the desert, but when you were in the temple itself there was no sense of location, you could have been in the jungle for all you know, it needed more outside areas to make it feel more real. It didn't seem to have any purpose either, it was just a random temple in the desert, not in a special location or anything. Finally the architecture was poor. Individual rooms were okish but if you put them together then there was absoloutly no coherance between them in terms of style. One room was all angular and had lots of bars and roof beams etc. the next room was all curvy architecture and looked nothing like the first except for the textures.

Anyways, enough rant. I've got myself working on a not-so top secret map for UT that may surprise people. (well, it may surprise people just because I might actually release a map!)

====Sunday 20/7/2003====

Errr, just felt the need to update to say that I am still alive and mapping. UT2k3 map has been progressing slowly for the last month or so. It's my &quot;transition&quot; from UT to UT2k3 map or something, so it's not massively detailed. It's all custom meshes, but it looks more like a really high poly UT map rather than a UT2k3 map. Also, it's ancient style, so it brings back some sort of oldsk00l UT theme :)

Anyways, the gameplay will probably suck, so don't expect much there, I'm not sure how it will turn out in the end but I've already abandoned about 5 UT2k3 maps when they are about 50% done so I intend to finish this no matter what!

====Monday 30/6/2003====

Terrain tutorial is slightly updated with a few minor fixes. And a downloadable version is available[http://members.fortunecity.com/bot40/Terrain/Part5.html here!].

There is now another bit added on [http://members.fortunecity.com/bot40/Terrain/Beach.html making a beach], there are also a few other tips in there!

====Wednesday 25/6/2003====

Hey, I'm not doing too badly on updating this page more than once a century (unlike my site)! A few bits of news:
*Wrote a [http://members.fortunecity.com/bot40/Terrain/Part1.html tutorial] on making terrain in UT. Will definatly be adding smaller misc. tutorials to the end of it in the future.
*CTF-Wether got [http://www.unrealplayground.com/review.php?id=704 reviewed] at Unreal Playground (69/100) Not bad for a 2 day map!
*RealLife boring stuff (don't read): Exams have gone ok so far, I only have one more to do which is my final physics exam (tomorrow), then I will be done with school &amp; exams forever! I feel quite confident about getting into York uni now, the only exam I really struggled with was the Pure3 maths paper but I still did ok in that I think. All I need now is my 18th birthday so I can celebrate in style!
*Completly unrelated side note: HAHAHA @ General Studies :p

====Friday 30/5/2003====

And update within a week of the previous!!!! Don't expect them to be anything like that frequent in the future, it's only cuz I'm extremly bored.

Anyways, I was working on a techy type map but it went all wrong and started sucking badly so I had to abandon yet another map (don't tell claw, he doesn't know this map exists in the first place) :\

I'm just messing with some ancient themed stuff atm, should be an interesting change from all the high tech maps for UT2k3. It prolly won't turn into a map, it's just for me to practice some meshes more than anything else.

====Friday 23/5/2003====

I lack motivation for everything at the moment, but I have not been unproductive for the entire of the last 3-4 months. I've released 2 new UT maps, CTF-SuperStyler and CTF-Wether. Also, I started making a flyby for UT2k3 though the bsp was too complex and I had to abandon it.

You can always go here to see what maps I've released http://nalicity.beyondunreal.com/view_author.php?aid=1990

Oh ya, and ignore CTF-AreaZlalFactoryAlphaBase40, it's just a joke map really :\

And anything I mentioned about some terrain map below, ignore, I abandoned it cuz it was going nothing like what I originally wanted.

====Sunday 2/3/2003====

y4y, got an offer from York uni to do computer science so I passed the interview. Bad thing is I gotta get AAB in my A-Levels to get in. I'm gonna have to start doing some work for once...hmmm...maybe not :p Also got a working Radeon 9700 so I've been able to do some serious mapping (See [[Legacy:Bot 40/Developer Journal|my developer journal]] for details on that)

On the downside I got shedloads of computer studies coursework to be doing. And also I've had the worst run of cards at poker ever. Haven't had a decent hand for like, 3 months so money is also a problem. Thought I'm convinced my game has really improved as of late (funny how fast you learn to protect your chips when you get no decent hands) so when I do start getting some good cards the bankroll should start soaring :p

Also, I just saw the jackass movie. Leetage, for most of it it's just hilarious, for the rest, it just makes you cringe (arggg @ paper cuts and yellow snow cone :\)

Just finished downloading Deathball 1.5 yesturday. Definatly an improvement over 1.4. Haven't had long enough to test it properly yet though. It makes it a bit easier (and enjoyable) for defenders now which is nice seeing as I'm always a defender.

I'm so glad the ball dribbing has gone. I have no problem with people using it when they are in loads of space and want to speed up the attack, but the real annoyance is when someone manages to get behind the defense, you can't catch up with them. OK, maybe the defence cocked up to get in that position in the first place but when you have 200 ping like I have, it's much easier to miss a volley or ball interception so sometimes when that happens the offence runs past you while you're still in the air. It's nice to see that now, a goal is a result of the offence using good passing/positioning and setting up the attack well rather than the offence just doing &quot;No brainer dribbling&quot; and any goals being the result of a defender's mistake rather than an attacker doing something good.

Currently I'm looking forward to offsides, that's gonna own. Should add a new level of depth for both attackers and defenders.

I always like to have some extra skill put into the game to keep it fresh. I know a lot of people resent any major changes to the gameplay because they have become to used to the game. But for me, a lot of the fun is trying out a new version, figuring out the best tactics for situations and learning to master it. It's almost like when you buy a new game, a lot of the fun is involved in learning to play the game well rather than actually playing it (which does get stale after so long)

====Saturday 8/2/2003====

Err I'll prolly use this page more for general ranting about life and boring stuff just to get it out of my system so you prolly won't want to read any of this crap unless you're a total w3rdo :p

I'll try to keep my developer's journal more for mapping progress rather than general moaning.

(Let me see if I can get this link to work... [[Legacy:Bot 40/Developer Journal|My developer journal]]

Anyways, I sent off my Radeon9700 to be replaced for the second time, still waiting for a reply. If it doesn't get replaced this time I'm gonna get completly pissed off. Also I got a deadline for 50% of the written work for my computer studies coursework tomorrow and I haven't even started. I never learn. nm, I got 4 hours @ school to rush something off :\

Even worse though is my uni interview which I've got on saturday. That's gonna suck big time. It's my first formal interview so I hope I don't fuck it up lol. Scary :p

----

'''Tarquin:''' Hello :) welcome to the site. good lunk with the uni interview :D

'''Bot 40:'''Thanks :)

'''Wormbo:''' Welcome to the Wiki. Have a nice stay. :D

'''Piglet:''' Hey. I applied for computer science at York too, they rejected me :( so now im looking at going to Canterbury ABB or Swansea BBB, oh yes and HI

'''Claw:''' WEEEE Bot, since when do you have a Wiki page?

'''Bot 40:''' Since quite a while ago. I also have a dev. journal but I'm far too lazy to update that. I think I'll just stick to this page :) Linking here for news from my site was the best idea ever. Now I never ever have to update my site with news. And the maps just links to my nc map list so that automatically updates. The lack of effort required now is quite fantastic.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot 40/Developer Journal</title>
    <id>620</id>
    <revision>
      <id>1855</id>
      <timestamp>2003-08-05T09:45:31Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===Bot_40's Developer Journal===

====Sunday 2/3/2003====

OK, I got some stuff done on what was StoneForts]I[ but I'm not going to call it that now cuz I've gone off the name. Plus the fact that there won't be much of the forts left and they won't even be stone (Just brick ruins). I'll be making meshes like the ones in Ruination (same textures) but I got a specific idea what I want so the default ones won't do. Unfortunatly I'm having trouble getting a copy of 3D Studio Max 5 (I wanna bake lightmaps for the ruin meshes) so I won't be doing much more work on the map till I can do that.

I am able to post some pics here though which is good. Not much to see so far, all that's there is the cliff meshes, terrain, fog, and trees. It's more to show the atmosphere more than anything cuz there's so much more to go in yet. The lighting that you see is probably staying much the way it is although there is lots more to go in. Please don't tell me it's all too plain, I'm gonna put in some bright orange torches along the paths which should make some nice contrast with the dreary fog.

[[Image:Legacy_MapWithTerrainAndFogEtc1.jpeg|]] 

[[Image:Legacy_MapWithTerrainAndFogEtc2.jpeg|]]

====Saturday 8/2/2003====

Wiiii testing, wow this works. This is leet. I only just started messing with teh wiki a bit and it's leet pwnd btw

errrr, blagh, probably just use this page for ranting and posting any thoughts and stuff I've got. It's quicker than updating my site and I haven't got a html editor atm (the reason why my paeg hasn't been updated for like, 10 years)

I don't really care if anything here doesn't make sense, I'm only using the page for ranting and posting random thoughts so if it looks like bullshit, it probably is :p Anyways, it will prolly give the page more character...or something...errr...yeah :)

I finally got a new graphics card, my old one wouldn't run the editor and the game ran like shit. Anyways, I got this Radeon 9700 but it turned out the fan was faulty and didn't work unless I have my PC case on it's side. So I sent it back (After 1-2 days fiddling with the ed of course :p). Anyways, it got sent back saying there was no fault so I sent a barrage of angry emails. Gotta send it back yet again in the next 1-2 days so I won't be able to use the editor again :\

eerrr ya, anyways, working on a ctf map, CTF-StoneForts]l[. It's gonna be a terrain based map (*Yawn*) but hopefully it'll be a bit original. It's based around a very narrow and tall canyon, lots of rain, fog, greyness, sad music etc... A very dreary atmosphere.

I got most of the cliffs done in 3DSM today, I finally got to grips with the main features so I was working pretty fast (for once :p) The cliffs are about 12,000 polys atm (That's with the entire map in view) but they are broken up into 8 meshes so with a few anti portals I can push that down a bit. Then that will leave me 50,000 or so polys in view to use on the ruins which will be the bases. No I ain't using those ruination meshes (which already are starting to look old), this map is made of strictly custom stuff :p

I also tried the terrain editor for the first time, pretty nice but I found it really fiddly to use, probably because I'm working on a rather small scale for it. It's probably better with larger scale terrains.

Anyways, I did half the terrain and I'm looking for a way to rotate the terrain for the other side of the map, I fear this may be virtually impossible though, I may have to redo the terrain from scratch for the other side which sucks :\

I was listening to OW-Ronin.umx which I got off furpile.com. Leet track, anyways, it kinda inspired me to make a space station like map so I'll probably do that after I've finished my current map. Ya, I normally get all my inspiration from listening to music, I guess I'm like that. Like, I was listing to OW-Machina and it made me think of an old factory, but not like a generic richrig factory, I mean a REALLY bashed up one that's completly fallen apart, smashed concrete and twisted metal beams everywhere, sunlight streaming through open ceilings, a really depressing environment. Dunno if I'll ever get round to doing that.

wow, I got so much done today, it's been ages since I did some serious mapping, feels great to be back in action. Feels like shit to have all these new problems, hopefully I'll get to grips with these small problems though then I can start pumping out pure leetness again :)

----

'''ZxAnPhOrIaN:''' Do you wan't the fog color and sunlight? I will be glad to give you that! :)

'''Bot 40:'''Nah, thanks but I got the fog and sunlight just about the way I want it now. Hopefully when I get my graphics card back I will be able to post some pics

'''Bot 40:''' Hmm, I'm assuming it's ok to post pics of my map here and host them on the wiki. Not like I'm remote linking or anything.

'''Mosquito:''' Nice looking map I've been to real world places that Look like that... And is that a Shield rock or old riverbed? Because if its a Shield Rock it would be crumbling at the edges and leaving stones on the ground. It looks like a Riverbed tho.. and some Rocks on the ground for good measure (sunk into the ground: deco layer) If you wanna look realistic.

'''Bot 40:'''Err, I need to put a small river/stream at the bottom, will put some debris there also. don't know what a shield rock is...

----

'''ZxAnPhOrIaN:''' Wow... Can you walk up that grade?

'''Bot 40:''' Ya, it's not as steep as it looks. I think it's just the camera angle :\

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1856</id>
      <timestamp>2003-03-03T20:15:43Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Bot_40's Developer Journal===

====Sunday 2/3/2003====

OK, I got some stuff done on what was StoneForts]I[ but I'm not going to call it that now cuz I've gone off the name. Plus the fact that there won't be much of the forts left and they won't even be stone (Just brick ruins). I'll be making meshes like the ones in Ruination (same textures) but I got a specific idea what I want so the default ones won't do. Unfortunatly I'm having trouble getting a copy of 3D Studio Max 5 (I wanna bake lightmaps for the ruin meshes) so I won't be doing much more work on the map till I can do that.

I am able to post some pics here though which is good. Not much to see so far, all that's there is the cliff meshes, terrain, fog, and trees. It's more to show the atmosphere more than anything cuz there's so much more to go in yet. The lighting that you see is probably staying much the way it is although there is lots more to go in. Please don't tell me it's all too plain, I'm gonna put in some bright orange torches along the paths which should make some nice contrast with the dreary fog.

[[Image:Legacy_MapWithTerrainAndFogEtc1.jpeg|]] 

[[Image:Legacy_MapWithTerrainAndFogEtc2.jpeg|]]

====Saturday 8/2/2003====

Wiiii testing, wow this works. This is leet. I only just started messing with teh wiki a bit and it's leet pwnd btw

errrr, blagh, probably just use this page for ranting and posting any thoughts and stuff I've got. It's quicker than updating my site and I haven't got a html editor atm (the reason why my paeg hasn't been updated for like, 10 years)

I don't really care if anything here doesn't make sense, I'm only using the page for ranting and posting random thoughts so if it looks like bullshit, it probably is :p Anyways, it will prolly give the page more character...or something...errr...yeah :)

I finally got a new graphics card, my old one wouldn't run the editor and the game ran like shit. Anyways, I got this Radeon 9700 but it turned out the fan was faulty and didn't work unless I have my PC case on it's side. So I sent it back (After 1-2 days fiddling with the ed of course :p). Anyways, it got sent back saying there was no fault so I sent a barrage of angry emails. Gotta send it back yet again in the next 1-2 days so I won't be able to use the editor again :\

eerrr ya, anyways, working on a ctf map, CTF-StoneForts]l[. It's gonna be a terrain based map (*Yawn*) but hopefully it'll be a bit original. It's based around a very narrow and tall canyon, lots of rain, fog, greyness, sad music etc... A very dreary atmosphere.

I got most of the cliffs done in 3DSM today, I finally got to grips with the main features so I was working pretty fast (for once :p) The cliffs are about 12,000 polys atm (That's with the entire map in view) but they are broken up into 8 meshes so with a few anti portals I can push that down a bit. Then that will leave me 50,000 or so polys in view to use on the ruins which will be the bases. No I ain't using those ruination meshes (which already are starting to look old), this map is made of strictly custom stuff :p

I also tried the terrain editor for the first time, pretty nice but I found it really fiddly to use, probably because I'm working on a rather small scale for it. It's probably better with larger scale terrains.

Anyways, I did half the terrain and I'm looking for a way to rotate the terrain for the other side of the map, I fear this may be virtually impossible though, I may have to redo the terrain from scratch for the other side which sucks :\

I was listening to OW-Ronin.umx which I got off furpile.com. Leet track, anyways, it kinda inspired me to make a space station like map so I'll probably do that after I've finished my current map. Ya, I normally get all my inspiration from listening to music, I guess I'm like that. Like, I was listing to OW-Machina and it made me think of an old factory, but not like a generic richrig factory, I mean a REALLY bashed up one that's completly fallen apart, smashed concrete and twisted metal beams everywhere, sunlight streaming through open ceilings, a really depressing environment. Dunno if I'll ever get round to doing that.

wow, I got so much done today, it's been ages since I did some serious mapping, feels great to be back in action. Feels like shit to have all these new problems, hopefully I'll get to grips with these small problems though then I can start pumping out pure leetness again :)

----

'''ZxAnPhOrIaN:''' Do you wan't the fog color and sunlight? I will be glad to give you that! :)

'''Bot 40:'''Nah, thanks but I got the fog and sunlight just about the way I want it now. Hopefully when I get my graphics card back I will be able to post some pics

'''Bot 40:''' Hmm, I'm assuming it's ok to post pics of my map here and host them on the wiki. Not like I'm remote linking or anything.

'''Mosquito:''' Nice looking map I've been to real world places that Look like that... And is that a Shield rock or old riverbed? Because if its a Shield Rock it would be crumbling at the edges and leaving stones on the ground. It looks like a Riverbed tho.. and some Rocks on the ground for good measure (sunk into the ground: deco layer) If you wanna look realistic.

----

'''ZxAnPhOrIaN:''' Wow... Can you walk up that grade?</text>
    </revision>
    <revision>
      <id>1857</id>
      <timestamp>2003-03-04T18:06:24Z</timestamp>
      <contributor>
        <ip>Bot 40</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Bot_40's Developer Journal===

====Sunday 2/3/2003====

OK, I got some stuff done on what was StoneForts]I[ but I'm not going to call it that now cuz I've gone off the name. Plus the fact that there won't be much of the forts left and they won't even be stone (Just brick ruins). I'll be making meshes like the ones in Ruination (same textures) but I got a specific idea what I want so the default ones won't do. Unfortunatly I'm having trouble getting a copy of 3D Studio Max 5 (I wanna bake lightmaps for the ruin meshes) so I won't be doing much more work on the map till I can do that.

I am able to post some pics here though which is good. Not much to see so far, all that's there is the cliff meshes, terrain, fog, and trees. It's more to show the atmosphere more than anything cuz there's so much more to go in yet. The lighting that you see is probably staying much the way it is although there is lots more to go in. Please don't tell me it's all too plain, I'm gonna put in some bright orange torches along the paths which should make some nice contrast with the dreary fog.

[[Image:Legacy_MapWithTerrainAndFogEtc1.jpeg|]] 

[[Image:Legacy_MapWithTerrainAndFogEtc2.jpeg|]]

====Saturday 8/2/2003====

Wiiii testing, wow this works. This is leet. I only just started messing with teh wiki a bit and it's leet pwnd btw

errrr, blagh, probably just use this page for ranting and posting any thoughts and stuff I've got. It's quicker than updating my site and I haven't got a html editor atm (the reason why my paeg hasn't been updated for like, 10 years)

I don't really care if anything here doesn't make sense, I'm only using the page for ranting and posting random thoughts so if it looks like bullshit, it probably is :p Anyways, it will prolly give the page more character...or something...errr...yeah :)

I finally got a new graphics card, my old one wouldn't run the editor and the game ran like shit. Anyways, I got this Radeon 9700 but it turned out the fan was faulty and didn't work unless I have my PC case on it's side. So I sent it back (After 1-2 days fiddling with the ed of course :p). Anyways, it got sent back saying there was no fault so I sent a barrage of angry emails. Gotta send it back yet again in the next 1-2 days so I won't be able to use the editor again :\

eerrr ya, anyways, working on a ctf map, CTF-StoneForts]l[. It's gonna be a terrain based map (*Yawn*) but hopefully it'll be a bit original. It's based around a very narrow and tall canyon, lots of rain, fog, greyness, sad music etc... A very dreary atmosphere.

I got most of the cliffs done in 3DSM today, I finally got to grips with the main features so I was working pretty fast (for once :p) The cliffs are about 12,000 polys atm (That's with the entire map in view) but they are broken up into 8 meshes so with a few anti portals I can push that down a bit. Then that will leave me 50,000 or so polys in view to use on the ruins which will be the bases. No I ain't using those ruination meshes (which already are starting to look old), this map is made of strictly custom stuff :p

I also tried the terrain editor for the first time, pretty nice but I found it really fiddly to use, probably because I'm working on a rather small scale for it. It's probably better with larger scale terrains.

Anyways, I did half the terrain and I'm looking for a way to rotate the terrain for the other side of the map, I fear this may be virtually impossible though, I may have to redo the terrain from scratch for the other side which sucks :\

I was listening to OW-Ronin.umx which I got off furpile.com. Leet track, anyways, it kinda inspired me to make a space station like map so I'll probably do that after I've finished my current map. Ya, I normally get all my inspiration from listening to music, I guess I'm like that. Like, I was listing to OW-Machina and it made me think of an old factory, but not like a generic richrig factory, I mean a REALLY bashed up one that's completly fallen apart, smashed concrete and twisted metal beams everywhere, sunlight streaming through open ceilings, a really depressing environment. Dunno if I'll ever get round to doing that.

wow, I got so much done today, it's been ages since I did some serious mapping, feels great to be back in action. Feels like shit to have all these new problems, hopefully I'll get to grips with these small problems though then I can start pumping out pure leetness again :)

----

'''ZxAnPhOrIaN:''' Do you wan't the fog color and sunlight? I will be glad to give you that! :)

'''Bot 40:'''Nah, thanks but I got the fog and sunlight just about the way I want it now. Hopefully when I get my graphics card back I will be able to post some pics

'''Bot 40:''' Hmm, I'm assuming it's ok to post pics of my map here and host them on the wiki. Not like I'm remote linking or anything.

'''Mosquito:''' Nice looking map I've been to real world places that Look like that... And is that a Shield rock or old riverbed? Because if its a Shield Rock it would be crumbling at the edges and leaving stones on the ground. It looks like a Riverbed tho.. and some Rocks on the ground for good measure (sunk into the ground: deco layer) If you wanna look realistic.

'''Bot 40:'''Err, I need to put a small river/stream at the bottom, will put some debris there also. don't know what a shield rock is...

----

'''ZxAnPhOrIaN:''' Wow... Can you walk up that grade?

'''Bot 40:''' Ya, it's not as steep as it looks. I think it's just the camera angle :\</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot Mind</title>
    <id>647</id>
    <revision>
      <id>1917</id>
      <timestamp>2007-10-31T18:39:44Z</timestamp>
      <contributor>
        <ip>Ip59936373.rubicom.hu</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">Bots are controlled by programming code that strictly follows a support system in the map. The code is in the [[Legacy:UnrealScript|UnrealScript]] classes, and the support system is in the botpath network (see [[Legacy:Bot Pathing|Bot Pathing]]).

In order to act more like free-thinking humans, bots must be given a wide range of options at any point in the map.  To understand why bots act the way they do and how to make them act differently, it helps to understand how a bot thinks. See also [[Legacy:Bot|Bot]] and [[Legacy:Mind Reader|Mind Reader]] for UT.

==Perception==

Bots see the world in two ways: where they can go and what they want.  At any given moment, a bot's attention is on their immediate goal (an adrenaline powerup, a gun, an enemy, a flag) and how they plan to get there.

Bots know where all items are in a map.  They even know exactly when items will respawn, if the WeaponsStay option isn't used.

Bots know how to move around a map because of a network of Bot Paths the mapper has designed.  Bots automatically know which route is shortest and even which paths are blocked no matter where they are in the map.

Distance fog does not affect bot visibility. If someone is in their field of view, they will be spotted no matter the fog density. 

==Goals==

Usually &quot;what they want&quot; is the most powerful item that's closest to them.  Normally &quot;how they get there&quot; is simply the shortest route.  Depending on circumstances such as [[Legacy:AssaultPath|AssaultPath]]s, bot orders, [[Legacy:AIScript|AIScript]]s, weapon preferences or gametype rules, these goals change.

Bots are single-minded and completely forgetful.  They approach their immediate goal with no knowledge of what they were just doing, so bots can get stuck doing something, stopping, and doing it again.  Their immediate goal momentarily changed, then changed back.  This can be observed as a spastic stutter followed by a resting pose and, if the bot is truly stuck, will be followed by suicide so the bot can respawn.  This is typically called &quot;getting stuck&quot;, and it happens when a bot cannot reach a goal, although the map's botplay design says they can.

==Squads==

A squad is two or more bots controlled by the actions of a leader.  Squads are formed when one player or bot calls for backup or a bot volunteers. (''&quot;I got your back.&quot;'')  A leader will move and act normally, while the rest of the squad follows the leader no matter what happens.  Following bots will fire on enemies on sight, but will not chase them unless their leader decides to.  Following bots who are killed will search for their leader immediately upon respawning.  Following bots in the middle of a firefight will often retreat to seek out their leader who just died and has respawned elsewhere.

Following bots move to the path nodes nearest the leader, and once there if there is no movement by the leader, feel free to move around a little; to the next node or two, in order to get an extra powerup or fire on an enemy.  In other words, following bots still have their own goals in mind, but they simply can't act on them if the leader's actions conflict.

==GameType==

Depending on [[Legacy:Gametype|gametype]], bots will be given certain rules and guidelines to follow.  These rules often supersede the bots' individual goals.  They know that in CTF, ''&quot;Attack their base.&quot;'' means retrieve the enemy flag and bring it back to our base.  In DDOM, bots know that holding both DominationPoints is the key to scoring.  Typically gametypes with more complex rules require higher skilled bots to perform well.

==Skill Levels==

At various skill levels, different pre-programmed tactics are engaged.  This gives the player a greater challenge for each increase in enemy bot skill level.  A mapper designs botplay keeping in mind that lower skill bots have limitations.  ''(The following is a loose description, but it's been checked against the Bot code.  Actual limitations are a little technical, but this gives a good idea of what's happening.)''

; Novice :Run at 60% of full speed, No translocator use, Will not move while engaged in combat unless very weak, Limited perception; field of view 30&amp;deg;, modified by BaseAlertness, Weak aim that can range ~30&amp;deg; off target, Slow to turn ''(RotationRate.Yaw = 30000, less than 1/2 turn per second, adjusted by ReactionTime)''.
; Average : Run at 70% speed, No translocator use, slightly higher accuracy.  Turn just a little more than 1/2 per second, adjusted by ReactionTime.
; Experienced :Run at 80% speed.  Translocator use.  Will move and fire simultaeously.  Field of view 40&amp;deg;, modified by BaseAlertness.  Turn more than 1/2 per second, adjusted by ReactionTime.
; Skilled :Run at 90% speed.  Can DoubleJump.  Field of view 60&amp;deg;, modified by BaseAlertness.  Turn more than 5/8 per second, adjusted by ReactionTime.
; Adept :Run at full speed.  Will dodge enemy fire.  Will close in on enemy.  Aim &quot;leads&quot; the target.  Field of view 80&amp;deg;, modified by BaseAlertness.  Turn almost 3/4 per second, adjusted by ReactionTime.
; Masterful :ImpactJump use.  Shock combo use.  Will switch target enemies during combat. Will stop to replenish powernodes instead of heading straight for a vehicle.  Field of view 100&amp;deg;, modified by BaseAlertness.  Turn almost 7/8 per second, adjusted by ReactionTime.
; Inhuman :Will dodge enemy aim.  No limits on perception; field of view 120&amp;deg;, modified by BaseAlertness. Will evacuate a vehicle if it is unable to avoid and will be destroyed by an incoming avril.  Turn all the way around in less than 1 second, adjusted by ReactionTime.
; Godlike :All strategies and tactics are engaged.  Omniperceptive; they see players and objects even without line of sight.  Highest level of accuracy, ranging less than 1&amp;deg; off target.  Turn 1/2 times per one second, adjusted by ReactionTime.

==Special behavior==

Some special events or settings effect individual bot behavior.

===Bot Attributes===

Custom attributes are set up for each player model.  Aggressiveness, Combat Tactics, Favorite Weapon, etc. are values used as extra impulses to alter the normal goal and path finding code.

===Revenge===

If a bot is killed, sometimes the bot will seek out the killer as their immediate goal. They can still be distracted by items or combat.  Pawns who have hurt the bot are added to a list of Enemies.  The bot will seek them out in the order they were listed until all Enemies are dead (removed) or the bot has died. Players have priority on this list.

==Navigation Points==

Bot paths govern the routes bots plan to take from their position to their immediate goal.  These paths are made up of connections between items, like the weapons in the map or nodes added specifically to the bot path network.  These connections have limitations of length and by available navigating space.  In  [[Legacy:UnrealEd|UnrealEd]], these connections will show up as lines that are color coded to indicate the size of available navigating space, whether a path is forcably blocked, or to indicate a special kind of connection, such as a JumpPad destination.  

Too many pathnodes in one spot can result in bots getting stuck.  Too few pathnodes in your map can result in inefficient navigation.  See also [[Legacy:NavigationPoint|NavigationPoint]].

==PlayerStarts and Items==

Bot automatically assume a [[Legacy:PlayerStart|PlayerStart]] is a safe place to be, as are spawn points for weapons and items.  Because a map's item, weapon, and PlayerStart balance takes precedence, these nodes normally make up the start of the bot path network.

==Bot Movement Along the Path Network==

The bot movement is actually quite simple. The bot first decides where it wants to end up. Usually a powerup or a weapon, but sometimes it is an enemy flag, ball, ball gate, etc. If that object is not a pathnode itself, it finds the pathnode nearest its goal. If it is a pathnode than the object itself is used.

The bot then finds the pathnode nearest itself. It then traces the &quot;best&quot; path from its goal/goal's nearest pathnode to the nearest pathnode. It then makes a beeline from pathnode to pathnode until it reaches its goal. The bot will interpolate a little bit to prevent it from suddenly changing direction when it touches a pathnode. Note that a bot will generally only make beelines between pathnodes, so you must place a pathnode at any place that the bot is going to have to turn. If the lines connecting pathnodes cross ANY solid obstacle, the bots will probably (but not always) have problems getting around that obstacle. 

Bots do not generally seek out other players, preferring to find pickups until the player eventually finds itself within their field of view. If the player runs away the bot may &quot;hunt&quot; it for a short while. During this time the bot has the target player as its &quot;goal&quot; actor.

==Bot Confusion==

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinitely in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Testing Botplay|Testing Botplay]] for techniques to determine bot's goals.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of bot pathing
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Discussion==

'''SuperApe:''' When merged with [[Legacy:Testing Botplay|Testing Botplay]], this page was meant to be a helpful reference in troubleshooting problems with botplay.  The bot motivations are outlined here, the techniques for testing botplay are there.  I wouldn't have separated them, personally.

'''amitakartok:''' The bot's aim isn't means where is the crosshair . For example, an AVRiL will always hit the intended target regardless of skill level and Novice bots in AS-Mothership have the same aiming capabilities as a Godlike bot (because the fighter's lasers are ignores all aim modifiers, e.g. Auto Aim; bots' aiming probably depends on this kind of modifiers). I also repeatedly observed that if the player wasn't visible, only the flying drone of his/her SPMA, the first bot seeing it have took it down immediately.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1918</id>
      <timestamp>2005-12-17T01:11:02Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Bots are controlled by programming code that strictly follows a support system in the map. The code is in the [[Legacy:UnrealScript|UnrealScript]] classes, and the support system is in the botpath network (see [[Legacy:Bot Pathing|Bot Pathing]]).

In order to act more like free-thinking humans, bots must be given a wide range of options at any point in the map.  To understand why bots act the way they do and how to make them act differently, it helps to understand how a bot thinks. See also [[Legacy:Bot|Bot]] and [[Legacy:Mind Reader|Mind Reader]] for UT.

==Perception==

Bots see the world in two ways: where they can go and what they want.  At any given moment, a bot's attention is on their immediate goal (an adrenaline powerup, a gun, an enemy, a flag) and how they plan to get there.

Bots know where all items are in a map.  They even know exactly when items will respawn, if the WeaponsStay option isn't used.

Bots know how to move around a map because of a network of Bot Paths the mapper has designed.  Bots automatically know which route is shortest and even which paths are blocked no matter where they are in the map.

==Goals==

Usually &quot;what they want&quot; is the most powerful item that's closest to them.  Normally &quot;how they get there&quot; is simply the shortest route.  Depending on circumstances such as [[Legacy:AssaultPath|AssaultPath]]s, bot orders, [[Legacy:AIScript|AIScript]]s, weapon preferences or gametype rules, these goals change.

Bots are single-minded and completely forgetful.  They approach their immediate goal with no knowledge of what they were just doing, so bots can get stuck doing something, stopping, and doing it again.  Their immediate goal momentarily changed, then changed back.  This can be observed as a spastic stutter followed by a resting pose and, if the bot is truly stuck, will be followed by suicide so the bot can respawn.  This is typically called &quot;getting stuck&quot;, and it happens when a bot cannot reach a goal, although the map's botplay design says they can.

==Squads==

A squad is two or more bots controlled by the actions of a leader.  Squads are formed when one player or bot calls for backup or a bot volunteers. (''&quot;I got your back.&quot;'')  A leader will move and act normally, while the rest of the squad follows the leader no matter what happens.  Following bots will fire on enemies on sight, but will not chase them unless their leader decides to.  Following bots who are killed will search for their leader immediately upon respawning.  Following bots in the middle of a firefight will often retreat to seek out their leader who just died and has respawned elsewhere.

Following bots move to the path nodes nearest the leader, and once there if there is no movement by the leader, feel free to move around a little; to the next node or two, in order to get an extra powerup or fire on an enemy.  In other words, following bots still have their own goals in mind, but they simply can't act on them if the leader's actions conflict.

==GameType==

Depending on [[Legacy:Gametype|gametype]], bots will be given certain rules and guidelines to follow.  These rules often supercede the bots' individual goals.  They know that in CTF, ''&quot;Attack their base.&quot;'' means retrieve the enemy flag and bring it back to our base.  In DDOM, bots know that holding both DominationPoints is the key to scoring.  Typically gametypes with more complex rules require higher skilled bots to perform well.

==Skill Levels==

At various skill levels, different pre-programmed tactics are engaged.  This gives the player a greater challenge for each increase in enemy bot skill level.  A mapper designs botplay keeping in mind that lower skill bots have limitations.  ''(The following is an approximation; actual limitations still to be confirmed.)''

; Novice :Run at one third the speed, No translocator use, Will not move while engaged in combat unless very weak, Limited perception; field of view less than 60&amp;deg;, Weak aim that can range ~30&amp;deg; off target, Slow to turn.
; Average :Run at half speed, No translocator use, slightly higher perception and accuracy. 
; Experienced :Run at three-quarter speed.  Translocator use.  Will move and fire simultaeously.
; Skilled :Run at full speed.
; Adept :Will dodge enemy fire.  Will close in on enemy.
; Masterful :ImpactJump use.  Shock combo use.  Will switch target enemies during combat.
; Inhuman :Will dodge enemy aim.  No limits on perception; field of view above 90&amp;deg;.
; Godlike :All strategies and tactics are engaged.  Omniperceptive; they see players and objects even without line of sight.  Highest level of accuracy, ranging less than 1&amp;deg; off target.  Aim &quot;leads&quot; the target.

==Special behavior==

Some special events or settings effect individual bot behavior.

===Bot Attributes===

Custom attributes are set up for each player model.  Aggressiveness, Combat Tactics, Favorite Weapon, etc. are values used as extra impulses to alter the normal goal and path finding code.

===Revenge===

If a bot is killed, sometimes the bot will seek out the killer as their immediate goal. They can still be distracted by items or combat.  Pawns who have hurt the bot are added to a list of Enemies.  The bot will seek them out in the order they were listed until all Enemies are dead (removed) or the bot has died.

==Navigation Points==

Bot paths govern the routes bots plan to take from their postition to their immediate goal.  These paths are made up of connections between items, like the weapons in the map or nodes added specifically to the bot path network.  These connections have limitations of length and by available navigating space.  In  [[Legacy:UnrealEd|UnrealEd]], these connections will show up as lines that are color coded to indicate the size of available navigating space, whether a path is forcably blocked, or to indicate a special kind of connection, such as a JumpPad destination.  

Too many pathnodes in one spot can result in bots getting stuck.  Too few pathnodes in your map can result in inefficient navigation.  See also [[Legacy:NavigationPoint|NavigationPoint]].

==PlayerStarts and Items==

Bot automatically assume a [[Legacy:PlayerStart|PlayerStart]] is a safe place to be, as are spawn points for weapons and items.  Because a map's item, weapon, and PlayerStart balance takes precedence, these nodes normally make up the start of the bot path network.

==Bot Movement Along the Path Network==

The bot movement is actually quite simple. The bot first decides where it wants to end up. Usually a powerup or a weapon, but sometimes it is an enemy flag, ball, ball gate, etc. If that object is not a pathnode itself, it finds the pathnode nearest its goal. If it is a pathnode than the object itself is used.

The bot then finds the pathnode nearest itself. It then traces the &quot;best&quot; path from its goal/goal's nearest pathnode to the nearest pathnode. It then makes a beeline from pathnode to pathnode until it reaches its goal. The bot will interpolate a little bit to prevent it from suddenly changing direction when it touches a pathnode. Note that a bot will generally only make beelines between pathnodes, so you must place a pathnode at any place that the bot is going to have to turn. If the lines connecting pathnodes cross ANY solid obstacle, the bots will probrably (but not always) have problems getting around that obstacle. 

Bots do not generally seek out other players, preferring to find pickups until the player eventually finds itself within their field of view. If the player runs away the bot may &quot;hunt&quot; it for a short while. During this time the bot has the target player as its &quot;goal&quot; actor.

==Bot Confusion==

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinately in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Testing Botplay|Testing Botplay]] for techniques to detemine bot's goals.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of bot pathing
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Discussion==

'''SuperApe:''' When merged with [[Legacy:Testing Botplay|Testing Botplay]], this page was meant to be a helpful reference in troubleshooting problems with botplay.  The bot motivations are outlined here, the techniques for testing botplay are there.  I wouldn't have separated them, personally.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1919</id>
      <timestamp>2007-10-04T13:12:33Z</timestamp>
      <contributor>
        <ip>Ip599364c2.rubicom.hu</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">Bots are controlled by programming code that strictly follows a support system in the map. The code is in the [[Legacy:UnrealScript|UnrealScript]] classes, and the support system is in the botpath network (see [[Legacy:Bot Pathing|Bot Pathing]]).

In order to act more like free-thinking humans, bots must be given a wide range of options at any point in the map.  To understand why bots act the way they do and how to make them act differently, it helps to understand how a bot thinks. See also [[Legacy:Bot|Bot]] and [[Legacy:Mind Reader|Mind Reader]] for UT.

==Perception==

Bots see the world in two ways: where they can go and what they want.  At any given moment, a bot's attention is on their immediate goal (an adrenaline powerup, a gun, an enemy, a flag) and how they plan to get there.

Bots know where all items are in a map.  They even know exactly when items will respawn, if the WeaponsStay option isn't used.

Bots know how to move around a map because of a network of Bot Paths the mapper has designed.  Bots automatically know which route is shortest and even which paths are blocked no matter where they are in the map.

==Goals==

Usually &quot;what they want&quot; is the most powerful item that's closest to them.  Normally &quot;how they get there&quot; is simply the shortest route.  Depending on circumstances such as [[Legacy:AssaultPath|AssaultPath]]s, bot orders, [[Legacy:AIScript|AIScript]]s, weapon preferences or gametype rules, these goals change.

Bots are single-minded and completely forgetful.  They approach their immediate goal with no knowledge of what they were just doing, so bots can get stuck doing something, stopping, and doing it again.  Their immediate goal momentarily changed, then changed back.  This can be observed as a spastic stutter followed by a resting pose and, if the bot is truly stuck, will be followed by suicide so the bot can respawn.  This is typically called &quot;getting stuck&quot;, and it happens when a bot cannot reach a goal, although the map's botplay design says they can.

==Squads==

A squad is two or more bots controlled by the actions of a leader.  Squads are formed when one player or bot calls for backup or a bot volunteers. (''&quot;I got your back.&quot;'')  A leader will move and act normally, while the rest of the squad follows the leader no matter what happens.  Following bots will fire on enemies on sight, but will not chase them unless their leader decides to.  Following bots who are killed will search for their leader immediately upon respawning.  Following bots in the middle of a firefight will often retreat to seek out their leader who just died and has respawned elsewhere.

Following bots move to the path nodes nearest the leader, and once there if there is no movement by the leader, feel free to move around a little; to the next node or two, in order to get an extra powerup or fire on an enemy.  In other words, following bots still have their own goals in mind, but they simply can't act on them if the leader's actions conflict.

==GameType==

Depending on [[Legacy:Gametype|gametype]], bots will be given certain rules and guidelines to follow.  These rules often supersede the bots' individual goals.  They know that in CTF, ''&quot;Attack their base.&quot;'' means retrieve the enemy flag and bring it back to our base.  In DDOM, bots know that holding both DominationPoints is the key to scoring.  Typically gametypes with more complex rules require higher skilled bots to perform well.

==Skill Levels==

At various skill levels, different pre-programmed tactics are engaged.  This gives the player a greater challenge for each increase in enemy bot skill level.  A mapper designs botplay keeping in mind that lower skill bots have limitations.  ''(The following is a loose description, but it's been checked against the Bot code.  Actual limitations are a little technical, but this gives a good idea of what's happening.)''

; Novice :Run at 60% of full speed, No translocator use, Will not move while engaged in combat unless very weak, Limited perception; field of view 30&amp;deg;, modified by BaseAlertness, Weak aim that can range ~30&amp;deg; off target, Slow to turn ''(RotationRate.Yaw = 30000, less than 1/2 turn per second, adjusted by ReactionTime)''.
; Average : Run at 70% speed, No translocator use, slightly higher accuracy.  Turn just a little more than 1/2 per second, adjusted by ReactionTime.
; Experienced :Run at 80% speed.  Translocator use.  Will move and fire simultaeously.  Field of view 40&amp;deg;, modified by BaseAlertness.  Turn more than 1/2 per second, adjusted by ReactionTime.
; Skilled :Run at 90% speed.  Can DoubleJump.  Field of view 60&amp;deg;, modified by BaseAlertness.  Turn more than 5/8 per second, adjusted by ReactionTime.
; Adept :Run at full speed.  Will dodge enemy fire.  Will close in on enemy.  Aim &quot;leads&quot; the target.  Field of view 80&amp;deg;, modified by BaseAlertness.  Turn almost 3/4 per second, adjusted by ReactionTime.
; Masterful :ImpactJump use.  Shock combo use.  Will switch target enemies during combat. Will stop to replenish powernodes instead of heading straight for a vehicle.  Field of view 100&amp;deg;, modified by BaseAlertness.  Turn almost 7/8 per second, adjusted by ReactionTime.
; Inhuman :Will dodge enemy aim.  No limits on perception; field of view 120&amp;deg;, modified by BaseAlertness. Will evacuate a vehicle if it is unable to avoid and will be destroyed by an incoming avril.  Turn all the way around in less than 1 second, adjusted by ReactionTime.
; Godlike :All strategies and tactics are engaged.  Omniperceptive; they see players and objects even without line of sight.  Highest level of accuracy, ranging less than 1&amp;deg; off target.  Turn 1/2 times per one second, adjusted by ReactionTime.

==Special behavior==

Some special events or settings effect individual bot behavior.

===Bot Attributes===

Custom attributes are set up for each player model.  Aggressiveness, Combat Tactics, Favorite Weapon, etc. are values used as extra impulses to alter the normal goal and path finding code.

===Revenge===

If a bot is killed, sometimes the bot will seek out the killer as their immediate goal. They can still be distracted by items or combat.  Pawns who have hurt the bot are added to a list of Enemies.  The bot will seek them out in the order they were listed until all Enemies are dead (removed) or the bot has died.

==Navigation Points==

Bot paths govern the routes bots plan to take from their position to their immediate goal.  These paths are made up of connections between items, like the weapons in the map or nodes added specifically to the bot path network.  These connections have limitations of length and by available navigating space.  In  [[Legacy:UnrealEd|UnrealEd]], these connections will show up as lines that are color coded to indicate the size of available navigating space, whether a path is forcably blocked, or to indicate a special kind of connection, such as a JumpPad destination.  

Too many pathnodes in one spot can result in bots getting stuck.  Too few pathnodes in your map can result in inefficient navigation.  See also [[Legacy:NavigationPoint|NavigationPoint]].

==PlayerStarts and Items==

Bot automatically assume a [[Legacy:PlayerStart|PlayerStart]] is a safe place to be, as are spawn points for weapons and items.  Because a map's item, weapon, and PlayerStart balance takes precedence, these nodes normally make up the start of the bot path network.

==Bot Movement Along the Path Network==

The bot movement is actually quite simple. The bot first decides where it wants to end up. Usually a powerup or a weapon, but sometimes it is an enemy flag, ball, ball gate, etc. If that object is not a pathnode itself, it finds the pathnode nearest its goal. If it is a pathnode than the object itself is used.

The bot then finds the pathnode nearest itself. It then traces the &quot;best&quot; path from its goal/goal's nearest pathnode to the nearest pathnode. It then makes a beeline from pathnode to pathnode until it reaches its goal. The bot will interpolate a little bit to prevent it from suddenly changing direction when it touches a pathnode. Note that a bot will generally only make beelines between pathnodes, so you must place a pathnode at any place that the bot is going to have to turn. If the lines connecting pathnodes cross ANY solid obstacle, the bots will probably (but not always) have problems getting around that obstacle. 

Bots do not generally seek out other players, preferring to find pickups until the player eventually finds itself within their field of view. If the player runs away the bot may &quot;hunt&quot; it for a short while. During this time the bot has the target player as its &quot;goal&quot; actor.

==Bot Confusion==

Occasionally a bot can get &quot;stuck&quot; and moves from one node to another, back and forth.  The cause is related to the bot's current goal; a pickup, a LiftExit, etc.  For one reason or another, the bot believes the goal is reachable, but it cannot reach it, so it turns back only to decide it should try and reach it again.  That behavior can continue on indefinitely in some cases.  The are two possible solutions for this:
# Place another node to allow the bot to reach their goal.
# Move things around a bit; either the PathNodes or the bot's goal item.

See also [[Legacy:Testing Botplay|Testing Botplay]] for techniques to determine bot's goals.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of bot pathing
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support

==Discussion==

'''SuperApe:''' When merged with [[Legacy:Testing Botplay|Testing Botplay]], this page was meant to be a helpful reference in troubleshooting problems with botplay.  The bot motivations are outlined here, the techniques for testing botplay are there.  I wouldn't have separated them, personally.

'''amitakartok:''' From what I observed, in UT2k3/2k4 bots seem to be giving priority to players if they come to choose a target. The only exception is if others are carrying a ball/flag, the bots shoot them, of course. I also repeatedly saw bots shoot multiple rounds into the player's corpse, even if they're on the same side and it was a teamkill. It's a scripting glitch? Can anyone confirm it?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot Pathing</title>
    <id>646</id>
    <revision>
      <id>1915</id>
      <timestamp>2007-02-23T16:05:20Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the [[Legacy:Bot Support|Bot Support]] system that allows bots to run around a map via a network of waypoints, or '''bot paths'''.  This page describes the concepts and elements of bot path networks.  For a simple tutorial, see [[Legacy:Basic Bot Pathing|Basic Bot Pathing]].

'''If you are new to bot pathing''', see the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial.   After that, [[Legacy:Testing Botplay|Testing Botplay]] will help clean up any problem areas in the bot path.  When problems arise, see [[Legacy:Bot Mind|Bot Mind]] because understanding the bot's behavior can help.  For special tasks you'd like bots to do, try [[Legacy:Strategic Bots|Strategic Bots]] or reviewing the list of available [[Legacy:NavigationPoint|NavigationPoint]]s for options that handle bot support.

==Overview ==

The AI code that drives bots doesn't have the power to interpret the 3D maps we see them in.  Instead, a map has to have a set of waypoints, joined together to make a network which the bots follow. 

These waypoints are mostly actors of the class [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]]. PathNodes are special actors specifically designed to tell bots of places that are safe and easy to travel.  These nodes make up the bulk of most bot path networks. Other types allow bots to tackle more complex things, such as lifts, jumping, translocating and camping. 

Unless specifically told so, bots assume they can simply walk, run or jump through the entire bot path network.  Simple obstacles like doors, lifts and ladders pose problems for bots and require special nodes to help them navigate as players do.

===A Quick Note About Automatically Building The Path Network===

'''''NOTE:''''' It is the UnrealEd community consensus that use of '''any''' of these automatic pathnode network generators creates an inferior Bot Navigation system for your map. It is '''highly''' recommended that you do the pathing manually.

There are actually three [[Legacy:UnrealEd Console|UnrealEd Console]] commands that will automatically build a botpath network for your map:

 ''PATHS BUILD''  auto create pathnode network - opt=1
 ''PATHS BUILD HIGHOPT'' auto create pathnode network - opt=2            
 ''PATHS BUILD LOWOPT'' auto create pathnode network - opt=0

Also, [[Legacy:PathLogic|PathLogic]] is a third-party application that lets you build the path network from within the game: you walk around your map, dropping path nodes as you go.

==Seeing The Network ==

In UnrealEd 3, use Show Paths to troubleshoot the network after re-building paths. Do [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt;  View -&gt; Show Paths.  It's possible to hide everything except the paths, which can be quite handy. Once the paths are visible, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and the 3D viewport shows just the network (see [[Legacy:Hiding Actors|Hiding Actors]] for more on this). This is basically your map as a bot sees it: just a network. 

While running a game, you can see the paths a bot is considering (the route it is attempting) when you use &lt;tt&gt;showdebug&lt;/tt&gt;, one of the [[Legacy:Console Commands|Console Commands]] for UT200x.  This will also show a lot of other information pertaining to the bot's weapon, pawn, controller status, etc.

You should see a bunch of  lines connecting the pathnodes. They are color coded depending on their nature:

===UT200x Color Codes===

The color of the line between path nodes indicates to bots the general width of the path and therefore the ease with which to use it.
; White:  A nice, wide path for the bots to follow. The bots will have no trouble following this path, seeing this as the most availble route to take.  Bots will also see these paths as traversable by vehicles. See [[Legacy:Pathing For Vehicles|Pathing for Vehicles]].
; Green: Not as good as a white path, but still a perfectly good path. Bots prefer white paths but generally there are other factors that influence their decision so this is not as big of an issue.
; Blue: This path is technically a good path, but is quite narrow. Bots will prefer a green or white path but will attempt to take this one if it is the only path available.
; Purple: Purple paths designate jumpspots, lifts, teleporters, etc. They have their own UnrealScript to define how bots feel about this type of path. If paths are not shown, a pink arc will show the expected path that a pawn will take when launched from the jumppad. When paths are shown this pink line will disappear.
; Light Purple: A path that takes the bot up or down a ladder.
; Yellow: A forced path. Used to tell bots that this path is available when the editor doesn't automatically connect two nodes. A path must be specifically set as forced in the pathnode properties.
; Red: A proscribed path. The pathnodes joined by this line, while technically connected, should never be used by bots. However, that is not to say that a bot will not end up at the other pathnode as a result of being hit, etc. and may continue along the path by &quot;skipping&quot; over the proscribed path. A path must be specifically set as proscibed in the pathnode properties.

===UT Color Codes===

In UT, there is only two colors of path - good ones and bad ones. Blue paths are good paths that the bots should have no trouble with. Red paths are not very good paths but the bot will attempt them anyway if it has no blue paths to take.

==Special Navigation Points==

===JumpSpots===

JumpSpots are nodes that tell bots of good landing spots, good jumping '''destinations'''.  They include information telling the bots whether the destination requires DoubleJumping, ImpactJumping or LiftJumping to reach it.  They are also used to indicate good spots to translocate to.  See also [[Legacy:JumpSpot|JumpSpot]].

===AssaultPaths===

These nodes are used to indicate a good route to attack the enemy.  They not only add nodes to the bot path network, they label particular routes and are used give them a path weight that indicates to a bot how &quot;good&quot; the route is.  Assault paths can also be used in games that require back and forth movement from one base to the other, as in CTF, to tell bots of better return routes.  See also [[Legacy:AssaultPath|AssaultPath]].

===GameObjectives===

These are game goals, objects that players must handle to play the game.  CTF FlagBases, Double Domination DomPoints, Bombing Run BombSpawns or BombDeliveries, Onslaught Nodes and Cores are all GameObjectives.  Some of these are configured to indicate to bots if they should be defended, if they are destroyable, what [[Legacy:AIScript|AIScript]]s should be used to defend it, etc.  See also [[Legacy:GameObjective|GameObjective]].

===RoadPathNodes &amp; FlyingPathNodes (UT2004)===

These nodes are used for vehicles.  They require the widest, clearest path possible (white color coded).  They can be spread much farther apart than normal PathNodes.  It is critical to have a full route of clear (White) [[Legacy:RoadPathNode|RoadPathNode]]s (or [[Legacy:FlyingPathNode|FlyingPathNode]]s) from one GameObjective to another and to the vehicle factories in order for bots to effectively use vehicles.  See also [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]].

==Special Handling==

Inevitably, mappers will encounter situations that require tweaking of the bot's normal  navigation system.  Sometimes the default bot path network will include a path leading directly into an obvious hazard.  Sometimes the bots will need to be told a specific path to take from a particular node.  Sometimes, a system complex behaviors is needed for specific purposes in a map.

===Forced Paths===

All nodes that deal with navigation (from PlayerStarts to Vehicle Path nodes) have an array available to define Forced Paths.  A forced path is a specific directive to bots traveling from a node, of which node to go to next.

===Proscribed Paths===

All node that deal with navigation also have Proscribed Paths.  Proscribed Paths tell bots of forbidden nodes to travel to from the node they're on.  It is the opposite of a Forced Path.

===AIScripts &amp; ScriptedSequences===

Bots can be told very specific things to do with an AIscript.  An AIscript is a series of commands designed to override the normal Bot, TeamAI and SquadAI code with custom behavior.  Almost anything that a player can do, can be achieved using AIscipts.  A ScriptedSequence is an actor with a customizable array of actions it will perform.  Some of these actions can be used to control bots, much like a simplified version of an AIScript.  Often they are used as Defensive Scripts or Sniper Scripts.  However, a misguided Script can simply make the bot predictable and easy to defeat.  See also [[Legacy:Creating And Using ScriptedActions|Creating and Using ScriptedActions]], [[Legacy:ScriptedAction|ScriptedAction]], [[Legacy:ScriptedSequence|ScriptedSequence]] and [[Legacy:Strategic Bots|Strategic Bots]].

==Pathing Special Areas==

===Water ===

Don't place pathnodes above water but in it or bots will bob up and down under the pathnode trying to reach it.

===Lifts===

A lift system has an entry point and an exit point.  Bots need to know where those points are and where the lift currently is.  This is described with LiftCenter and LiftExit actors.  See also [[Legacy:Pathing Lifts|Pathing Lifts]].

===Ladders===

In UT2003/UT2004, a ladder is a special volume that allows a player inside to move up and down instead of forward and back.  Bots need to be told where to enter and exit the ladder volume.  This is done with Ladder actors.  See also [[Legacy:Add A Ladder|Add A Ladder]].

===JumpPads===

JumpPads are nodes that throw players and bots through the air to a destination node, like an ordinary PathNode.  Bots know what that destination node is by the ForcedPath described in the UTJumpPad actor.  See also [[Legacy:UTJumpPad|UTJumpPad]] and [[Legacy:Pathing Kickers|Pathing Kickers]].

===Doors===

Bots need to know if doors are closed they need to be opened to travel or shoot through.  This is done with a Door actor.  The Door actor tells the bots if there are any external triggers to open the door.  The Door actor can also tell bots to ingore the path through the door if it is closed; used for locked or triggered doors that block the path.  See also [[Legacy:Door|Door]].

===Teleporters===

Teleporters simply hook up to the bot path network by the two end point nodes.  Bots immediately know how to use them to navigate.  See also [[Legacy:Teleportation Basics|Teleportation Basics]].

==Pathing Topics==

Other pages cover in detail how to make bots tackle more complex elements of their environment:
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Pathing Kickers|Pathing Kickers]]
* [[Legacy:Pathing Translocators|Pathing Translocators]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]

==Basic Bot Pathing Tutorial==
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensures reliable bot support

==External Links ==
* [http://unreal.epicgames.com/ut2ai.htm UT200x Botpathing by Steven Polge]
* [http://www.leveldesigner.com/index.php?action=doc&amp;ID=172 UT200x Advanced Bot Pathing Tutorial by Blitz]
* [http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]

==Discussion ==

'''SuperApe:''' Revision done.  What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1916</id>
      <timestamp>2006-12-09T21:49:48Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>Paths building through floors?</comment>
      <text xml:space="preserve">The [[Legacy:Bot Support|Bot Support]] system that allows bots to run around a map needs a network of waypoints, or '''bot paths'''.  This page describes the concepts and elements of bot path networks.

==Overview ==

'''If you are new to bot pathing, see the [[Legacy:Basic Bot Pathing|Basic Bot Pathing Tutorial]]'''.   After that, [[Legacy:Testing Botplay|Testing Botplay]] is an important task.  When problems arise, see [[Legacy:Bot Mind|Bot Mind]] because understanding the bot's behavior can help.  For special tasks you'd like bots to do, try [[Legacy:Strategic Bots|Strategic Bots]] or reviewing the list of available [[Legacy:NavigationPoint|NavigationPoint]]s for options that handle bot support.

The AI code that drives bots doesn't have the power to interpret the 3D maps we see them in.  Instead, a map has to have a set of waypoints, joined together to make a network which the bots follow. 

These waypoints are mostly actors of the class [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]]. PathNodes are special actors specifically designed to tell bots of places that are safe and easy to travel.  These nodes make up the bulk of most bot path networks. Other types allow bots to tackle more complex things, such as lifts, jumping, translocating and camping. 

Unless specifically told so, bots assume they can simply walk, run or jump through the entire bot path network.  Simple obstacles like doors, lifts and ladders pose problems for bots and require special nodes to help them navigate as players do.

===Automatically Building The Network===

There are actually three [[Legacy:UnrealEd Console|UnrealEd Console]] commands that will automatically build a botpath network for your map:

 ''PATHS BUILD''  auto create pathnode network - opt=1
 ''PATHS BUILD HIGHOPT'' auto create pathnode network - opt=2            
 ''PATHS BUILD LOWOPT'' auto create pathnode network - opt=0

Also, [[Legacy:PathLogic|PathLogic]] is a third-party application that lets you build the path network from within the game: you walk around your map, dropping path nodes as you go.

'''''NOTE:''''' It is the UnrealEd community consensus that use of any of these automatic pathnode network generators creates an inferior Bot Navigation system for your map. It is '''highly''' recommended that you do the pathing manually.

==Seeing The Network ==

In UnrealEd 3, use Show Paths to troubleshoot the network after re-building paths. Do [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt;  View -&gt; Show Paths.  It's possible to hide everything except the paths, which can be quite handy. Once the paths are visible, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and the 3D viewport shows just the network (see [[Legacy:Hiding Actors|Hiding Actors]] for more on this). This is basically your map as a bot sees it: just a network. 

While running a game, you can see the paths a bot is considering (the route it is attempting) when you use &lt;tt&gt;showdebug&lt;/tt&gt;, one of the [[Legacy:Console Commands|Console Commands]] for UT200x.  This will also show a lot of other information pertaining to the bot's weapon, pawn, controller status, etc.

You should see a bunch of  lines connecting the pathnodes. They are color coded depending on their nature:

===UT200x Color Codes===

The color of the line between path nodes indicates to bots the general width of the path and therefore the ease with which to use it.
; White:  A nice, wide path for the bots to follow. The bots will have no trouble following this path, seeing this as the most availble route to take.  Bots will also see these paths as traversable by vehicles. See [[Legacy:Pathing For Vehicles|Pathing for Vehicles]].
; Green: Not as good as a white path, but still a perfectly good path. Bots prefer white paths but generally there are other factors that influence their decision so this is not as big of an issue.
; Blue: This path is technically a good path, but is quite narrow. Bots will prefer a green or white path but will attempt to take this one if it is the only path available.
; Purple: Purple paths designate jumpspots, lifts, teleporters, etc. They have their own UnrealScript to define how bots feel about this type of path. If paths are not shown, a pink arc will show the expected path that a pawn will take when launched from the jumppad. When paths are shown this pink line will disappear.
; Light Purple: A path that takes the bot up or down a ladder.
; Yellow: A forced path. Used to tell bots that this path is available when the editor doesn't automatically connect two nodes. A path must be specifically set as forced in the pathnode properties.
; Red: A proscribed path. The pathnodes joined by this line, while technically connected, should never be used by bots. However, that is not to say that a bot will not end up at the other pathnode as a result of being hit, etc. and may continue along the path by &quot;skipping&quot; over the proscribed path. A path must be specifically set as proscibed in the pathnode properties.

===UT Color Codes===

In UT, there is only two colors of path - good ones and bad ones. Blue paths are good paths that the bots should have no trouble with. Red paths are not very good paths but the bot will attempt them anyway if it has no blue paths to take.

==Special Navigation Points==

===JumpSpots===

JumpSpots are nodes that tell bots of good landing spots, good jumping '''destinations'''.  They include information telling the bots whether the destination requires DoubleJumping, ImpactJumping or LiftJumping to reach it.  They are also used to indicate good spots to translocate to.  See also [[Legacy:JumpSpot|JumpSpot]].

===AssaultPaths===

These nodes are used to indicate a good route to attack the enemy.  They not only add nodes to the bot path network, they label particular routes and are used give them a path weight that indicates to a bot how &quot;good&quot; the route is.  Assault paths can also be used in games that require back and forth movement from one base to the other, as in CTF, to tell bots of better return routes.  See also [[Legacy:AssaultPath|AssaultPath]].

===GameObjectives===

These are game goals, objects that players must handle to play the game.  CTF FlagBases, Double Domination DomPoints, Bombing Run BombSpawns or BombDeliveries, Onslaught Nodes and Cores are all GameObjectives.  Some of these are configured to indicate to bots if they should be defended, if they are destroyable, what [[Legacy:AIScript|AIScript]]s should be used to defend it, etc.  See also [[Legacy:GameObjective|GameObjective]].

===RoadPathNodes &amp; FlyingPathNodes (UT2004)===

These nodes are used for vehicles.  They require the widest, clearest path possible (white color coded).  They can be spread much farther apart than normal PathNodes.  It is critical to have a full route of clear (White) [[Legacy:RoadPathNode|RoadPathNode]]s (or [[Legacy:FlyingPathNode|FlyingPathNode]]s) from one GameObjective to another and to the vehicle factories in order for bots to effectively use vehicles.  See also [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]].

==Special Handling==

Inevitably, mappers will encounter situations that require tweaking of the bot's normal  navigation system.  Sometimes the default bot path network will include a path leading directly into an obvious hazard.  Sometimes the bots will need to be told a specific path to take from a particular node.  Sometimes, a system complex behaviors is needed for specific purposes in a map.

===Forced Paths===

All nodes that deal with navigation (from PlayerStarts to Vehicle Path nodes) have an array available to define Forced Paths.  A forced path is a specific directive to bots traveling from a node, of which node to go to next.

===Proscribed Paths===

All node that deal with navigation also have Proscribed Paths.  Proscribed Paths tell bots of forbidden nodes to travel to from the node they're on.  It is the opposite of a Forced Path.

===AIScripts &amp; ScriptedSequences===

Bots can be told very specific things to do with an AIscript.  An AIscript is a series of commands designed to override the normal Bot, TeamAI and SquadAI code with custom behavior.  Almost anything that a player can do, can be achieved using AIscipts.  A ScriptedSequence is an actor with a customizable array of actions it will perform.  Some of these actions can be used to control bots, much like a simplified version of an AIScript.  Often they are used as Defensive Scripts or Sniper Scripts.  However, a misguided Script can simply make the bot predictable and easy to defeat.  See also [[Legacy:Creating And Using ScriptedActions|Creating and Using ScriptedActions]], [[Legacy:ScriptedAction|ScriptedAction]], [[Legacy:ScriptedSequence|ScriptedSequence]] and [[Legacy:Strategic Bots|Strategic Bots]].

==Pathing Special Areas==

===Water ===

Don't place pathnodes above water but in it or bots will bob up and down under the pathnode trying to reach it.

===Lifts===

A lift system has an entry point and an exit point.  Bots need to know where those points are and where the lift currently is.  This is described with LiftCenter and LiftExit actors.  See also [[Legacy:Pathing Lifts|Pathing Lifts]].

===Ladders===

In UT2003/UT2004, a ladder is a special volume that allows a player inside to move up and down instead of forward and back.  Bots need to be told where to enter and exit the ladder volume.  This is done with Ladder actors.  See also [[Legacy:Add A Ladder|Add A Ladder]].

===JumpPads===

JumpPads are nodes that throw players and bots through the air to a destination node, like an ordinary PathNode.  Bots know what that destination node is by the ForcedPath described in the UTJumpPad actor.  See also [[Legacy:UTJumpPad|UTJumpPad]] and [[Legacy:Pathing Kickers|Pathing Kickers]].

===Doors===

Bots need to know if doors are closed they need to be opened to travel or shoot through.  This is done with a Door actor.  The Door actor tells the bots if there are any external triggers to open the door.  The Door actor can also tell bots to ingore the path through the door if it is closed; used for locked or triggered doors that block the path.  See also [[Legacy:Door|Door]].

===Teleporters===

Teleporters simply hook up to the bot path network by the two end point nodes.  Bots immediately know how to use them to navigate.  See also [[Legacy:Teleportation Basics|Teleportation Basics]].

==Pathing Topics==

Other pages cover in detail how to make bots tackle more complex elements of their environment:
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Pathing Kickers|Pathing Kickers]]
* [[Legacy:Pathing Translocators|Pathing Translocators]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]

==Basic Bot Pathing Tutorial==
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensures reliable bot support

==External Links ==
* [http://unreal.epicgames.com/ut2ai.htm UT200x Botpathing by Steven Polge]
* [http://www.leveldesigner.com/index.php?action=doc&amp;ID=172 UT200x Advanced Bot Pathing Tutorial by Blitz]
* [http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]

==Discussion ==

'''SuperApe:''' Revision done.  What do you think?

'''Bob_The_Beheader:''' This page is too similer to the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] Tutorial page. It would be better if this page were more focused on the types of pathNodes that can be created, as opposed to how to create paths in the first place.

'''Tarquin:''' Um.... this area of the wiki has been rearranged soooo many times... I sort of see what you mean though, the section on 'Automatically Building The Network' is a bit too specific for this page.I think [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] was made to satisfy people who want a simple tutorial approach to the subject, and the rest of the pages are for the rest of us ;)

'''SuperApe:''' I'd be happy to discuss this.  This page is meant to discuss the concepts behind bot pathing: the ideas, the actors used, the overview.  The Basic Bot Pathing page is a tutorial to help a newb go from zero to path network.  Originally, the Bot Support pages were all over the place and a general mess.  Some of which I felt compelled to leave in, organized somehow.  That 'Auto Build' section is one of those leftovers.  Someone at one point wanted that point made, although the general consensus is it's a bad way to bot path.  So, what specific changes are you thinking of, Bob?

'''IceCreamYou:''' I haven't noticed that bots will take Forcedpaths over better (shorter) options.  There are a few places in my maps where I've forced paths simply to let the bots know they can get somewhere, and they still often choose other ways.  Can someone confirm this?

'''SuperApe:''' That's true.  ForcedPaths will make sure the path is including in the botpath network, but it doesn't preclude bots from using other routes, especially ones they think are better.  To stop them from traveling on other paths, define them as ProscribedPaths.

'''IceCreamYou:''' Okay, that's what I thought.  I changed the offending passage.

'''EricBlade:''' I have a map where paths always build through floors, but only to pickups, which causes my bots to become really confused trying to fall through the floors.  Since there's apparently no wya to proscribe paths that go to pickups, is there anything I can do for that?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33222</id>
      <timestamp>2008-11-14T14:52:12Z</timestamp>
      <contributor>
        <username>Evil-System</username>
        <id>1589</id>
      </contributor>
      <text xml:space="preserve">This is the [[Legacy:Bot Support|Bot Support]] system that allows bots to run around a map via a network of waypoints, or '''bot paths'''.  This page describes the concepts and elements of bot path networks.  For a simple tutorial, see [[Legacy:Basic Bot Pathing|Basic Bot Pathing]].

'''If you are new to bot pathing''', see the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial.   After that, [[Legacy:Testing Botplay|Testing Botplay]] will help clean up any problem areas in the bot path.  When problems arise, see [[Legacy:Bot Mind|Bot Mind]] because understanding the bot's behavior can help.  For special tasks you'd like bots to do, try [[Legacy:Strategic Bots|Strategic Bots]] or reviewing the list of available [[Legacy:NavigationPoint|NavigationPoint]]s for options that handle bot support.

==Overview ==

The AI code that drives bots doesn't have the power to interpret the 3D maps we see them in.  Instead, a map has to have a set of waypoints, joined together to make a network which the bots follow. 

These waypoints are mostly actors of the class [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]]. PathNodes are special actors specifically designed to tell bots of places that are safe and easy to travel.  These nodes make up the bulk of most bot path networks. Other types allow bots to tackle more complex things, such as lifts, jumping, translocating and camping. 

Unless specifically told so, bots assume they can simply walk, run or jump through the entire bot path network.  Simple obstacles like doors, lifts and ladders pose problems for bots and require special nodes to help them navigate as players do.

===A Quick Note About Automatically Building The Path Network===

'''''NOTE:''''' It is the UnrealEd community consensus that use of '''any''' of these automatic pathnode network generators creates an inferior Bot Navigation system for your map. It is '''highly''' recommended that you do the pathing manually.

There are actually three [[Legacy:UnrealEd Console|UnrealEd Console]] commands that will automatically build a botpath network for your map:

 ''PATHS BUILD''  auto create pathnode network - opt=1
 ''PATHS BUILD HIGHOPT'' auto create pathnode network - opt=2            
 ''PATHS BUILD LOWOPT'' auto create pathnode network - opt=0

Also, [[Legacy:PathLogic|PathLogic]] is a third-party application that lets you build the path network from within the game: you walk around your map, dropping path nodes as you go.

==Seeing The Network ==

In UnrealEd 3, use Show Paths to troubleshoot the network after re-building paths. Do [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt;  View -&gt; Show Paths.  It's possible to hide everything except the paths, which can be quite handy. Once the paths are visible, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and the 3D viewport shows just the network (see [[Legacy:Hiding Actors|Hiding Actors]] for more on this). This is basically your map as a bot sees it: just a network. 

While running a game, you can see the paths a bot is considering (the route it is attempting) when you use &lt;tt&gt;showdebug&lt;/tt&gt;, one of the [[Legacy:Console Commands|Console Commands]] for UT200x.  This will also show a lot of other information pertaining to the bot's weapon, pawn, controller status, etc.

You should see a bunch of  lines connecting the pathnodes. They are color coded depending on their nature:

===UT200x Color Codes===

The color of the line between path nodes indicates to bots the general width of the path and therefore the ease with which to use it.
; White:  A nice, wide path for the bots to follow. The bots will have no trouble following this path, seeing this as the most availble route to take.  Bots will also see these paths as traversable by vehicles. See [[Legacy:Pathing For Vehicles|Pathing for Vehicles]].
; Green: Not as good as a white path, but still a perfectly good path. Bots prefer white paths but generally there are other factors that influence their decision so this is not as big of an issue.
; Blue: This path is technically a good path, but is quite narrow. Bots will prefer a green or white path but will attempt to take this one if it is the only path available.
; Purple: Purple paths designate jumpspots, lifts, teleporters, etc. They have their own UnrealScript to define how bots feel about this type of path. If paths are not shown, a pink arc will show the expected path that a pawn will take when launched from the jumppad. When paths are shown this pink line will disappear.
; Light Purple: A path that takes the bot up or down a ladder.
; Yellow: A forced path. Used to tell bots that this path is available when the editor doesn't automatically connect two nodes. A path must be specifically set as forced in the pathnode properties.
; Red: A proscribed path. The pathnodes joined by this line, while technically connected, should never be used by bots. However, that is not to say that a bot will not end up at the other pathnode as a result of being hit, etc. and may continue along the path by &quot;skipping&quot; over the proscribed path. A path must be specifically set as proscibed in the pathnode properties.

===UT Color Codes===

In UT, there is only two colors of path - good ones and bad ones. Blue paths are good paths that the bots should have no trouble with. Red paths are not very good paths but the bot will attempt them anyway if it has no blue paths to take.

==Special Navigation Points==

===JumpSpots===

JumpSpots are nodes that tell bots of good landing spots, good jumping '''destinations'''.  They include information telling the bots whether the destination requires DoubleJumping, ImpactJumping or LiftJumping to reach it.  They are also used to indicate good spots to translocate to.  See also [[Legacy:JumpSpot|JumpSpot]].

===AssaultPaths===

These nodes are used to indicate a good route to attack the enemy.  They not only add nodes to the bot path network, they label particular routes and are used give them a path weight that indicates to a bot how &quot;good&quot; the route is.  Assault paths can also be used in games that require back and forth movement from one base to the other, as in CTF, to tell bots of better return routes.  See also [[Legacy:AssaultPath|AssaultPath]].

===GameObjectives===

These are game goals, objects that players must handle to play the game.  CTF FlagBases, Double Domination DomPoints, Bombing Run BombSpawns or BombDeliveries, Onslaught Nodes and Cores are all GameObjectives.  Some of these are configured to indicate to bots if they should be defended, if they are destroyable, what [[Legacy:AIScript|AIScript]]s should be used to defend it, etc.  See also [[Legacy:GameObjective|GameObjective]].

===RoadPathNodes &amp; FlyingPathNodes (UT2004)===

These nodes are used for vehicles.  They require the widest, clearest path possible (white color coded).  They can be spread much farther apart than normal PathNodes.  It is critical to have a full route of clear (White) [[Legacy:RoadPathNode|RoadPathNode]]s (or [[Legacy:FlyingPathNode|FlyingPathNode]]s) from one GameObjective to another and to the vehicle factories in order for bots to effectively use vehicles.  See also [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]].

==Special Handling==

Inevitably, mappers will encounter situations that require tweaking of the bot's normal  navigation system.  Sometimes the default bot path network will include a path leading directly into an obvious hazard.  Sometimes the bots will need to be told a specific path to take from a particular node.  Sometimes, a system complex behaviors is needed for specific purposes in a map.

===Forced Paths===

All nodes that deal with navigation (from PlayerStarts to Vehicle Path nodes) have an array available to define Forced Paths.  A forced path is a specific directive to bots traveling from a node, of which node to go to next.

===Proscribed Paths===

All node that deal with navigation also have Proscribed Paths.  Proscribed Paths tell bots of forbidden nodes to travel to from the node they're on.  It is the opposite of a Forced Path.

===AIScripts &amp; ScriptedSequences===

Bots can be told very specific things to do with an AIscript.  An AIscript is a series of commands designed to override the normal Bot, TeamAI and SquadAI code with custom behavior.  Almost anything that a player can do, can be achieved using AIscipts.  A ScriptedSequence is an actor with a customizable array of actions it will perform.  Some of these actions can be used to control bots, much like a simplified version of an AIScript.  Often they are used as Defensive Scripts or Sniper Scripts.  However, a misguided Script can simply make the bot predictable and easy to defeat.  See also [[Legacy:Creating And Using ScriptedActions|Creating and Using ScriptedActions]], [[Legacy:ScriptedAction|ScriptedAction]], [[Legacy:ScriptedSequence|ScriptedSequence]] and [[Legacy:Strategic Bots|Strategic Bots]].

==Pathing Special Areas==

===Water ===

Don't place pathnodes above water but in it or bots will bob up and down under the pathnode trying to reach it.

===Lifts===

A lift system has an entry point and an exit point.  Bots need to know where those points are and where the lift currently is.  This is described with LiftCenter and LiftExit actors.  See also [[Legacy:Pathing Lifts|Pathing Lifts]].

===Ladders===

In UT2003/UT2004, a ladder is a special volume that allows a player inside to move up and down instead of forward and back.  Bots need to be told where to enter and exit the ladder volume.  This is done with Ladder actors.  See also [[Legacy:Add A Ladder|Add A Ladder]].

===JumpPads===

JumpPads are nodes that throw players and bots through the air to a destination node, like an ordinary PathNode.  Bots know what that destination node is by the ForcedPath described in the UTJumpPad actor.  See also [[Legacy:UTJumpPad|UTJumpPad]] and [[Legacy:Pathing Kickers|Pathing Kickers]].

===Doors===

Bots need to know if doors are closed they need to be opened to travel or shoot through.  This is done with a Door actor.  The Door actor tells the bots if there are any external triggers to open the door.  The Door actor can also tell bots to ingore the path through the door if it is closed; used for locked or triggered doors that block the path.  See also [[Legacy:Door|Door]].

===Teleporters===

Teleporters simply hook up to the bot path network by the two end point nodes.  Bots immediately know how to use them to navigate.  See also [[Legacy:Teleportation Basics|Teleportation Basics]].

==Pathing Topics==

Other pages cover in detail how to make bots tackle more complex elements of their environment:
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Pathing Kickers|Pathing Kickers]]
* [[Legacy:Pathing Translocators|Pathing Translocators]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]

==Basic Bot Pathing Tutorial==
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensures reliable bot support

==External Links ==
* [http://unreal.epicgames.com/ut2ai.htm UT200x Botpathing by Steven Polge]
* [http://www.leveldesigner.com/index.php?action=doc&amp;ID=172 UT200x Advanced Bot Pathing Tutorial by Blitz]
* [http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]

==Discussion ==

'''SuperApe:''' Revision done.  What do you think?
'''Evil-System:''' I don't understand how to get a specific ScriptedCharacter to start patrolling at one point. I have 3 patrol points set up the way I want, and a ScriptedCharacter nearby, and I want him to move the first point, and go to the second one and just walk back and forth between the second and third point.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33223</id>
      <timestamp>2008-11-14T14:52:42Z</timestamp>
      <contributor>
        <username>Evil-System</username>
        <id>1589</id>
      </contributor>
      <text xml:space="preserve">This is the [[Legacy:Bot Support|Bot Support]] system that allows bots to run around a map via a network of waypoints, or '''bot paths'''.  This page describes the concepts and elements of bot path networks.  For a simple tutorial, see [[Legacy:Basic Bot Pathing|Basic Bot Pathing]].

'''If you are new to bot pathing''', see the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] tutorial.   After that, [[Legacy:Testing Botplay|Testing Botplay]] will help clean up any problem areas in the bot path.  When problems arise, see [[Legacy:Bot Mind|Bot Mind]] because understanding the bot's behavior can help.  For special tasks you'd like bots to do, try [[Legacy:Strategic Bots|Strategic Bots]] or reviewing the list of available [[Legacy:NavigationPoint|NavigationPoint]]s for options that handle bot support.

==Overview ==

The AI code that drives bots doesn't have the power to interpret the 3D maps we see them in.  Instead, a map has to have a set of waypoints, joined together to make a network which the bots follow. 

These waypoints are mostly actors of the class [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]]. PathNodes are special actors specifically designed to tell bots of places that are safe and easy to travel.  These nodes make up the bulk of most bot path networks. Other types allow bots to tackle more complex things, such as lifts, jumping, translocating and camping. 

Unless specifically told so, bots assume they can simply walk, run or jump through the entire bot path network.  Simple obstacles like doors, lifts and ladders pose problems for bots and require special nodes to help them navigate as players do.

===A Quick Note About Automatically Building The Path Network===

'''''NOTE:''''' It is the UnrealEd community consensus that use of '''any''' of these automatic pathnode network generators creates an inferior Bot Navigation system for your map. It is '''highly''' recommended that you do the pathing manually.

There are actually three [[Legacy:UnrealEd Console|UnrealEd Console]] commands that will automatically build a botpath network for your map:

 ''PATHS BUILD''  auto create pathnode network - opt=1
 ''PATHS BUILD HIGHOPT'' auto create pathnode network - opt=2            
 ''PATHS BUILD LOWOPT'' auto create pathnode network - opt=0

Also, [[Legacy:PathLogic|PathLogic]] is a third-party application that lets you build the path network from within the game: you walk around your map, dropping path nodes as you go.

==Seeing The Network ==

In UnrealEd 3, use Show Paths to troubleshoot the network after re-building paths. Do [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt;  View -&gt; Show Paths.  It's possible to hide everything except the paths, which can be quite handy. Once the paths are visible, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and the 3D viewport shows just the network (see [[Legacy:Hiding Actors|Hiding Actors]] for more on this). This is basically your map as a bot sees it: just a network. 

While running a game, you can see the paths a bot is considering (the route it is attempting) when you use &lt;tt&gt;showdebug&lt;/tt&gt;, one of the [[Legacy:Console Commands|Console Commands]] for UT200x.  This will also show a lot of other information pertaining to the bot's weapon, pawn, controller status, etc.

You should see a bunch of  lines connecting the pathnodes. They are color coded depending on their nature:

===UT200x Color Codes===

The color of the line between path nodes indicates to bots the general width of the path and therefore the ease with which to use it.
; White:  A nice, wide path for the bots to follow. The bots will have no trouble following this path, seeing this as the most availble route to take.  Bots will also see these paths as traversable by vehicles. See [[Legacy:Pathing For Vehicles|Pathing for Vehicles]].
; Green: Not as good as a white path, but still a perfectly good path. Bots prefer white paths but generally there are other factors that influence their decision so this is not as big of an issue.
; Blue: This path is technically a good path, but is quite narrow. Bots will prefer a green or white path but will attempt to take this one if it is the only path available.
; Purple: Purple paths designate jumpspots, lifts, teleporters, etc. They have their own UnrealScript to define how bots feel about this type of path. If paths are not shown, a pink arc will show the expected path that a pawn will take when launched from the jumppad. When paths are shown this pink line will disappear.
; Light Purple: A path that takes the bot up or down a ladder.
; Yellow: A forced path. Used to tell bots that this path is available when the editor doesn't automatically connect two nodes. A path must be specifically set as forced in the pathnode properties.
; Red: A proscribed path. The pathnodes joined by this line, while technically connected, should never be used by bots. However, that is not to say that a bot will not end up at the other pathnode as a result of being hit, etc. and may continue along the path by &quot;skipping&quot; over the proscribed path. A path must be specifically set as proscibed in the pathnode properties.

===UT Color Codes===

In UT, there is only two colors of path - good ones and bad ones. Blue paths are good paths that the bots should have no trouble with. Red paths are not very good paths but the bot will attempt them anyway if it has no blue paths to take.

==Special Navigation Points==

===JumpSpots===

JumpSpots are nodes that tell bots of good landing spots, good jumping '''destinations'''.  They include information telling the bots whether the destination requires DoubleJumping, ImpactJumping or LiftJumping to reach it.  They are also used to indicate good spots to translocate to.  See also [[Legacy:JumpSpot|JumpSpot]].

===AssaultPaths===

These nodes are used to indicate a good route to attack the enemy.  They not only add nodes to the bot path network, they label particular routes and are used give them a path weight that indicates to a bot how &quot;good&quot; the route is.  Assault paths can also be used in games that require back and forth movement from one base to the other, as in CTF, to tell bots of better return routes.  See also [[Legacy:AssaultPath|AssaultPath]].

===GameObjectives===

These are game goals, objects that players must handle to play the game.  CTF FlagBases, Double Domination DomPoints, Bombing Run BombSpawns or BombDeliveries, Onslaught Nodes and Cores are all GameObjectives.  Some of these are configured to indicate to bots if they should be defended, if they are destroyable, what [[Legacy:AIScript|AIScript]]s should be used to defend it, etc.  See also [[Legacy:GameObjective|GameObjective]].

===RoadPathNodes &amp; FlyingPathNodes (UT2004)===

These nodes are used for vehicles.  They require the widest, clearest path possible (white color coded).  They can be spread much farther apart than normal PathNodes.  It is critical to have a full route of clear (White) [[Legacy:RoadPathNode|RoadPathNode]]s (or [[Legacy:FlyingPathNode|FlyingPathNode]]s) from one GameObjective to another and to the vehicle factories in order for bots to effectively use vehicles.  See also [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]].

==Special Handling==

Inevitably, mappers will encounter situations that require tweaking of the bot's normal  navigation system.  Sometimes the default bot path network will include a path leading directly into an obvious hazard.  Sometimes the bots will need to be told a specific path to take from a particular node.  Sometimes, a system complex behaviors is needed for specific purposes in a map.

===Forced Paths===

All nodes that deal with navigation (from PlayerStarts to Vehicle Path nodes) have an array available to define Forced Paths.  A forced path is a specific directive to bots traveling from a node, of which node to go to next.

===Proscribed Paths===

All node that deal with navigation also have Proscribed Paths.  Proscribed Paths tell bots of forbidden nodes to travel to from the node they're on.  It is the opposite of a Forced Path.

===AIScripts &amp; ScriptedSequences===

Bots can be told very specific things to do with an AIscript.  An AIscript is a series of commands designed to override the normal Bot, TeamAI and SquadAI code with custom behavior.  Almost anything that a player can do, can be achieved using AIscipts.  A ScriptedSequence is an actor with a customizable array of actions it will perform.  Some of these actions can be used to control bots, much like a simplified version of an AIScript.  Often they are used as Defensive Scripts or Sniper Scripts.  However, a misguided Script can simply make the bot predictable and easy to defeat.  See also [[Legacy:Creating And Using ScriptedActions|Creating and Using ScriptedActions]], [[Legacy:ScriptedAction|ScriptedAction]], [[Legacy:ScriptedSequence|ScriptedSequence]] and [[Legacy:Strategic Bots|Strategic Bots]].

==Pathing Special Areas==

===Water ===

Don't place pathnodes above water but in it or bots will bob up and down under the pathnode trying to reach it.

===Lifts===

A lift system has an entry point and an exit point.  Bots need to know where those points are and where the lift currently is.  This is described with LiftCenter and LiftExit actors.  See also [[Legacy:Pathing Lifts|Pathing Lifts]].

===Ladders===

In UT2003/UT2004, a ladder is a special volume that allows a player inside to move up and down instead of forward and back.  Bots need to be told where to enter and exit the ladder volume.  This is done with Ladder actors.  See also [[Legacy:Add A Ladder|Add A Ladder]].

===JumpPads===

JumpPads are nodes that throw players and bots through the air to a destination node, like an ordinary PathNode.  Bots know what that destination node is by the ForcedPath described in the UTJumpPad actor.  See also [[Legacy:UTJumpPad|UTJumpPad]] and [[Legacy:Pathing Kickers|Pathing Kickers]].

===Doors===

Bots need to know if doors are closed they need to be opened to travel or shoot through.  This is done with a Door actor.  The Door actor tells the bots if there are any external triggers to open the door.  The Door actor can also tell bots to ingore the path through the door if it is closed; used for locked or triggered doors that block the path.  See also [[Legacy:Door|Door]].

===Teleporters===

Teleporters simply hook up to the bot path network by the two end point nodes.  Bots immediately know how to use them to navigate.  See also [[Legacy:Teleportation Basics|Teleportation Basics]].

==Pathing Topics==

Other pages cover in detail how to make bots tackle more complex elements of their environment:
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Pathing Kickers|Pathing Kickers]]
* [[Legacy:Pathing Translocators|Pathing Translocators]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]

==Basic Bot Pathing Tutorial==
* [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main topic
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensures reliable bot support

==External Links ==
* [http://unreal.epicgames.com/ut2ai.htm UT200x Botpathing by Steven Polge]
* [http://www.leveldesigner.com/index.php?action=doc&amp;ID=172 UT200x Advanced Bot Pathing Tutorial by Blitz]
* [http://www.planetunreal.com/nucleus/UED2_pathing.html The Nucleus - Basic Bot Pathing]

==Discussion ==

'''SuperApe:''' Revision done.  What do you think?

'''Evil-System:''' I don't understand how to get a specific ScriptedCharacter to start patrolling at one point. I have 3 patrol points set up the way I want, and a ScriptedCharacter nearby, and I want him to move the first point, and go to the second one and just walk back and forth between the second and third point.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot Support</title>
    <id>577</id>
    <revision>
      <id>1764</id>
      <timestamp>2006-02-16T16:30:09Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Bot Support''' and '''Botplay''' are both terms used to describe a map's support system for bots: artificially intelligent players that can act as if they were human.  The term botplay is often used the same way the term [[Legacy:Gameplay|Gameplay]] is used to describe the playability of a particular map.

==Overview==

One of the reasons for the success of the Unreal engine games is the realistic AI, which includes bots that appear to play as if they were human.  This is accomplished with the coordination of two elements: the bot support of the map as created by the level designer and the [[Legacy:Bot|Bot]] class AI construct.

Each map should contain a &quot;system of waypoints&quot; in the words of Epic programmer Steve Polge.  This is commonly called the '''Bot Path Network''', and it is up to the mapper to design this network by placing special actors in the map.  This bot path network defines the safe areas for a bot player to occupy in the map.  Bots are able to walk, run, and jump to get to a desired point of the map with the help of the bot path network.  Special objects within the map can also provide more complex behavior beyond navigation.  They use the bot path network to tell them where they can get to, what is the most direct route to take and even which route goal might be more desirable or shortest.  Game Objects, custom ScriptedSequences and the GameInfo object will be providing the answer to why they might want to go there or what tactics they should follow once the route goal is reached.

The UnrealScript code in the [[Legacy:Bot|Bot]] class interacts with the code in the [[Legacy:NavigationPoint|NavigationPoint]] classes, [[Legacy:GameObject|GameObject]] classes, [[Legacy:GameInfo|GameInfo]] classes, any [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s and custom AI objects to create a believable player character with objectives to achieve.

==Bot Support Topics==

This is the current hierarchy of bot support pages on the wiki.
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing.
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.
** [[Legacy:SnipingVolume|SnipingVolume]]
** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]] &amp;ndash; A tutorial on defense points.
* [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots' motivations.
* [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Techniques to ensure reliable bot support.

==External Links ==
* [http://unreal.epicgames.com/UT_AI.htm UT AI for Level Designers] by Steven Polge.
* [http://blitz.unrealplayground.com/tutorials/bots.html UT200x Advanced Bot Pathing Tutorial] by Blitz.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic on all AI (Monsters, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Bot Support (UT)|Bot Support (UT)]]
* [[Legacy:Mind Reader|Mind Reader]] (for UT)

==Discussion==

'''SuperApe:''' Re-revision done.  What do you think?

'''Ragdoll:''' Looks good. I added a link to assault path.

'''SuperApe:''' Thanks for the complement.  Actually, [[Legacy:AssaultPath|AssaultPath]] is a special NavPoint whose use is covered under [[Legacy:Bot Pathing|Bot Pathing]] as well as the individual [[Legacy:Gametype|Gametype]] &quot;Mapping For&quot; pages for which it is useful, like CTF, DDOM, BR, etc.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1765</id>
      <timestamp>2006-01-05T10:32:53Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Bot Support''' and '''Botplay''' are both terms used to describe a map's support system for bots: artificially intelligent players that can act as if they were human.  The term botplay is often used the same way the term [[Legacy:Gameplay|Gameplay]] is used to describe the playability of a particular map.

==Overview==

One of the reasons for the success of the Unreal engine games is the realistic AI, which includes bots that appear to play as if they were human.  This is accomplished with the coordination of two elements: the bot support of the map as created by the level designer and the [[Legacy:Bot|Bot]] class AI construct.

Each map should contain a &quot;system of waypoints&quot; in the words of Epic programmer Steve Polge.  This is commonly called the '''Bot Path Network''', and it is up to the mapper to design this network by placing special actors in the map.  This bot path network defines the safe areas for a bot player to occupy in the map.  Bots are able to walk, run, and jump to get to a desired point of the map with the help of the bot path network.  Special objects within the map can also provide more complex behavior beyond navigation.  They use the bot path network to tell them where they can get to, what is the most direct route to take and even which route goal might be more desirable or shortest.  Game Objects, custom ScriptedSequences and the GameInfo object will be providing the answer to why they might want to go there or what tactics they should follow once the route goal is reached.

The UnrealScript code in the [[Legacy:Bot|Bot]] class interacts with the code in the [[Legacy:NavigationPoint|NavigationPoint]] classes, [[Legacy:GameObject|GameObject]] classes, [[Legacy:GameInfo|GameInfo]] classes, any [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s and custom AI objects to create a believable player character with objectives to achieve.

==Bot Support Topics==

This is the current hierarchy of bot support pages on the wiki.
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network.
** [[Legacy:Pathing Lifts|Pathing Lifts]]
** [[Legacy:Pathing Kickers|Pathing Kickers]]
** [[Legacy:Pathing Translocators|Pathing Translocators]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing.
* [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support.
** [[Legacy:SnipingVolume|SnipingVolume]]
** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]] &amp;ndash; A tutorial on defense points.
* [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots' motivations.
* [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Techniques to ensure reliable bot support.
* [[Legacy:AssaultPath|AssaultPath]] &amp;ndash; A technique to get bots to take different paths to an objective. Useful in CTF.

==External Links ==
* [http://unreal.epicgames.com/UT_AI.htm UT AI for Level Designers] by Steven Polge.
* [http://blitz.unrealplayground.com/tutorials/bots.html UT200x Advanced Bot Pathing Tutorial] by Blitz.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic on all AI (Monsters, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Bot Support (UT)|Bot Support (UT)]]
* [[Legacy:Mind Reader|Mind Reader]] (for UT)

==Discussion==

'''SuperApe:''' Re-revision done.  What do you think?

'''Ragdoll:''' Looks good. I added a link to assault path.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot Support (UT)</title>
    <id>580</id>
    <revision>
      <id>1770</id>
      <timestamp>2006-09-26T23:39:21Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page relates to Unreal Tournament.  See [[Legacy:Bot Support|Bot Support]] for an overview over bot support for UT200x.

==Bot Pathing for UT==
* [[Legacy:Pathing Kickers|Pathing Kickers]] (UT)
* [[Legacy:TrapSpringer|TrapSpringer]] (UT)
* [[Legacy:BotCandy|BotCandy]] &amp;ndash; Items used to lure bots along paths

==Monsters==
* [[Legacy:ScriptedPawn|ScriptedPawn]]s
* [[Legacy:FlockPawn|FlockPawn]]s
* [[Legacy:CreatureFactory|CreatureFactory]]

==Fixed stuff==
* [[Legacy:Automatic Turret|Automatic Turret]]s

==Introduction==

===Disclaimer===

This page is an attempt to provide an overview of how the Unreal Tournament Bot AI works.  Be warned that this page has been written based on ideas derived from guesswork, by someone who has no clue.  Any inconsistencies and inaccuracies are either accidental, a result of the nature of the source data (i.e. random), or simply down to incompetence, stupidity, and laziness on the author’s part.

===Background Information===

Firstly, although the UT bots may seem smarter than most of the people you know this is not the case.  They are remarkably dumb.  And they don’t get bored - ever.  If you place a bot in a map with no inventory items and no targets to shoot at it will simply stand there admiring the scenery and checking its weapon.  After all, a bot needs some motivation to move around.  This motivation is provided in the form of inventory (objects to collect such as ammo, weapons, and health), targets to shoot at (other players), and game targets (control points, flags, and objectives).

The way in which a bot will behave is determined by what state it is in, and what orders it has received.  For an overview of states see the text in [[Legacy:State|State]] or [[Legacy:InitialState|InitialState]].  A bot is able to change the state that it is in based upon external stimulus such as being shot at, seeing other players, and the desire for a bigger gun.  It is this ability that allows the bot to behave in an appropriate manner to its environment.

The state a bot is able to enter is dependent upon the game type being played.  I'll start with a discussion of the death match game and with luck move on to the other game types.

==The Deathmatch Game==

===In the Beginning===

On entry to the game the bot is most likely to drop into the ''Roaming'' state with orders of ''FreeLance''.  Essentially the roaming state means that the bot will wander around the map looking for big guns, ammunition, power-ups, and other cool inventory items (like relics).  Don’t be fooled into thinking that the bot is looking for a target - it isn’t.

When a bot sees (or &quot;hears&quot;) another player it will change state to ''Acquisition''.  In the acquisition state the bot will decide where it needs to be so it can attack the player.  Once it has figured that out it drops into the ''Attacking'' state.

===Fighting With Style===

The ''Attacking'' state is pretty self explanatory.  In this state the bot is in full combat mode.  It’s trying to utterly annihilate it's selected enemy.  From an attacking state the bot has a number of options.  It can either go into a ''RangedAttack'' state (used to perform the combo move), or enter any of the following states: ''Retreating'', ''StakeOut'', ''Hunting'', and ''TacticalMove'' (although this only really applies to the team game types).

&lt;i&gt;To be continued when I have more time and enthusiasm - come back NFG&lt;/i&gt;

Stuff that eventually got written:
* [[Legacy:Monster Support|Monster Support]]
* [[Legacy:PatrolPoint|PatrolPoint]]s and [[Legacy:ScriptedPawn|ScriptedPawn]]s
* The [[Legacy:BlockedPath|BlockedPath]] Actor

==Related Topics==
* [[Legacy:Mind Reader|Mind Reader]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]] (UT200x)
** [[Legacy:Monster Support|Monster Support]]
*** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Unknown (author):''' Ideas for things to cover:
* Every game type has a specific function &lt;tt&gt;FindSpecialAttractionFor(Bot aBot)&lt;/tt&gt; that controls the primary AI and sets up the bot &quot;orders&quot;. A page on how AI code governs player and pawn activities in game might be interesting.
* Could we get stuff on advanced pathnodes? Eg, how to use TastyPellet-style pathnodes in a map to force bots to go places.

'''SuperApe:''' This is an interesting page.  It gives us used to UT200x some insight into the workings of the ScriptedPawn.  If someone fluent in UT could fill in the ScriptedPawn stuff that would be great.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1771</id>
      <timestamp>2005-11-02T01:08:11Z</timestamp>
      <contributor>
        <ip>Pool1418.cvx6-bradley.dialup.earthlink.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page relates to Unreal Tournament.  See [[Legacy:Bot Navigation|Bot Navigation]] for an overview over bot support for UT2003.

* [[Legacy:Pathing Kickers|Pathing Kickers]] (kickers seem very different in 2k3 &amp;ndash; probably obsolete)
* [[Legacy:TrapSpringer|TrapSpringer]] (probably UT only?)
* [[Legacy:BotCandy|BotCandy]] &amp;ndash; irresistible to bots (no idea)

==Monsters ==
* [[Legacy:ScriptedPawn|ScriptedPawn]]s
* [[Legacy:FlockPawn|FlockPawn]]s
* [[Legacy:CreatureFactory|CreatureFactory]]

==Fixed stuff ==
* [[Legacy:Automatic Turret|Automatic Turret]]s

==Introduction ==

===Disclaimer ===

This page is an attempt to provide an overview of how the Unreal Tournament Bot AI works.  Be warned that this page has been written based on ideas derived from guesswork, by someone who has no clue.  Any inconsistencies and inaccuracies are either accidental, a result of the nature of the source data (i.e. random), or simply down to incompetence, stupidity, and laziness on the author’s part.

===Background Information ===

Firstly, although the UT bots may seem smarter than most of the people you know this is not the case.  They are remarkably dumb.  And they don’t get bored - ever.  If you place a bot in a map with no inventory items and no targets to shoot at it will simply stand there admiring the scenery and checking its weapon.  After all, a bot needs some motivation to move around.  This motivation is provided in the form of inventory (objects to collect such as ammo, weapons, and health), targets to shoot at (other players), and game targets (control points, flags, and objectives).

The way in which a bot will behave is determined by what state it is in, and what orders it has received.  For an overview of states see the text in [[Legacy:State|State]] or [[Legacy:InitialState|InitialState]].  A bot is able to change the state that it is in based upon external stimulus such as being shot at, seeing other players, and the desire for a bigger gun.  It is this ability that allows the bot to behave in an appropriate manner to its environment.

The state a bot is able to enter is dependent upon the game type being played.  I'll start with a discussion of the death match game and with luck move on to the other game types.

==The Deathmatch Game ==

===In the Beginning ===

On entry to the game the bot is most likely to drop into the ''Roaming'' state with orders of ''FreeLance''.  Essentially the roaming state means that the bot will wander around the map looking for big guns, ammunition, power-ups, and other cool inventory items (like relics).  Don’t be fooled into thinking that the bot is looking for a target - it isn’t.

When a bot sees (or &quot;hears&quot;) another player it will change state to ''Acquisition''.  In the acquisition state the bot will decide where it needs to be so it can attack the player.  Once it has figured that out it drops into the ''Attacking'' state.

===Fighting With Style ===

The ''Attacking'' state is pretty self explanatory.  In this state the bot is in full combat mode.  It’s trying to utterly annihilate it's selected enemy.  From an attacking state the bot has a number of options.  It can either go into a ''RangedAttack'' state (used to perform the combo move), or enter any of the following states: ''Retreating'', ''StakeOut'', ''Hunting'', and ''TacticalMove'' (although this only really applies to the team game types).

&lt;i&gt;To be continued when I have more time and enthusiasm - come back NFG&lt;/i&gt;

Stuff that never got written:

* Monster and Bot Support
* PatrolPoints and ScriptedPawns
* The BlockedPath Actor

==Discussion==

Ideas for things to cover:

* Every game type has a specific function &lt;tt&gt;FindSpecialAttractionFor(Bot aBot)&lt;/tt&gt; that controls the primary AI and sets up the bot &quot;orders&quot;. A page on how AI code governs player and pawn activities in game might be interesting.
* Could we get stuff on advanced pathnodes? Eg, how to use TastyPellet-style pathnodes in a map to force bots to go places.

----

[[:Category:Legacy To Do]], but don't knock yourself out, since I don't think many people map for UT any more.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot Vision</title>
    <id>584</id>
    <revision>
      <id>1778</id>
      <timestamp>2007-11-18T16:55:00Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bots can snipe through pea-soup fog... 

'''EntropicLqd:''' I have a problem - my bots can snipe me from a mile away in dense fog.  This is somewhat unfair since I can't actually see them (nor they me).  I've tried reducing the bot's sight radius but that has had no effect.  Anyone have any other thoughts on making the bots only able to see very close targets?  I've included the code (from my mutator subclass) I'm using to adjust the sight radius below.

&lt;uscript&gt;
function ModifyPlayer( Pawn Other ) {
	if ( Other.Controller != None )	{
		if ( Other.Controller.bIsPlayer &amp;&amp; !Other.IsHumanControlled() ) {
			Log(&quot;Sight radius adjusted&quot;);
// repEndDist is the end distance of the fog
			Other.SightRadius = repEndDist / 8;
		}
	}
}
&lt;/uscript&gt;
: '''I'm still stuck on this one.'''

'''ZxAnPhOrIaN:''' I need that code for my level, wich uses dense fog.

'''EntropicLqd:''' The SightRadius is reset within the function Bot.ResetSkill().  This in turn is called from Bot.Possess(), Bot.InitialiseSkill(), and Bot.Restart().  My guess is that the SightRadius value is being reset to it's original value after the ModifyPlayer() function is called.  I'll have a go at proving that tonight if I get time.
: What are the implicatons of changing the ''Bot.Default.SightRadius'' value within the mutator?  Will it screw up subsequent normal games or will the value be reset with each new game?

'''Mychaeel:''' In Unreal Tournament changes to a class's default properties persisted over level switches.  I'm not so sure about that in UT2003 &amp;ndash; it would be worth finding out for sure.

'''EntropicLqd:''' In UT2003 changes to a class's default properties persist not only over level changes, but also for the life of that instance of UT2003 - the value is not reset until you quit and re-load UT2003.  Not only that but the SightRadius has bugger all effect on how far the bots can see to attack things - irrespective of what the code claims.  I suspect the real problem lies within the AI attack code being able to pick out targets that the bot's ''can't see'' as it were.

'''Foxpaw:''' You could make a mutator that would subclass the bots - not the most compatible solution but maybe someone could find a better way. What you really want to do is to modify the Controller's PickTarget function... but you can't do that because it's native and final. So modify whatever calls it. Picktarget can take an argument that gives a maximum range for selecting a target. I'm not sure where it's called from. You could maybe call PickTarget every X amount of time (much more frequently than the bot's normally would) though that would not be very elegant. If you could find when the function is called you could maybe modify that function to pass an arbitrary maximum range to target people through the fog.

==Bot Vision - Better than X-Ray ==

If you've ever spent any time attempting to make a mod that restricts the distance players can see, or their peripheral vision then you'll know that getting the Bots to behave in a believable manner is hard.  This page will describe my on-going thoughts and musings on how to get things working in the manner you wish.

===Finding Objects and General Navigation ===

Now, in general a Bot's view of the world is a network of nodes.  Some of the paths between the nodes are &quot;more expensive&quot; than others, and a Bot will generally try and take the easiest path to wherever it is trying to get to.  Generally, this may be armour, health, a weapon, or another pick up.  Left to it's own devices a Bot will quite happily run around a level collecting stuff.  The Bot knows where everything on the level is - because it can navigate through the network of nodes to find any object in the level.  Remember, the nodes are placed on the level as [[Legacy:PathNode|PathNode]] objects, Inventory items, and other such stuff.

When a Bot has decided to go somewhere it stores information about it's route through the level in its Controller.  This makes sense - the controller is responsible to directing the Bot, and the pawn (representing the Bot in game) is responsible for the animation.  This distinction is more or less true.  I'm not convinced that it is as cut and dried as that.  It's best to think of the Controller as the Bot's brain, and the Pawn as the Bot's representation in the world.

The Controller class has some useful attributes to support this navigation, reproduced below for your pleasure and enjoyment.

&lt;uscript&gt;
var Actor     RouteCache[16]; // A cache of pathnodes the Bot needs to travel along to reach its goal?
var [[ReachSpec]] CurrentPath;
var vector    CurrentPathDir; // Direction the bot needs to travel to remain on it's &quot;path&quot;
var Actor     RouteGoal;      // final destination for current route
var float     RouteDist;      // total distance for current route
var float     LastRouteFind;  // time at which last route finding occured

// Some useful functions for Bot navigation are:
//Navigation functions - return the next path toward the goal
native(518) final function Actor FindPathTo(vector aPoint);
native(517) final function Actor FindPathToward(actor anActor, optional bool bWeightDetours);
native final function Actor FindPathToIntercept(Pawn P, Actor RouteGoal, optional bool bWeightDetours);
native final function Actor FindPathTowardNearest(class&lt;NavigationPoint&gt; GoalClass, optional bool bWeightDetours);
native(525) final function NavigationPoint FindRandomDest();
&lt;/uscript&gt;

===Seeing Enemies and Shooting at Them ===

So, how do Bots see other players?  Well, there are a few functions and attributes that would appear to affect this part of the Bot's behaviour.  In my experience none of them seem to work well in low visibility conditions.  I've listed all the ones I can find below.

&lt;uscript&gt;
// From the Controller class
float FovAngle; // The Field of View from the player's (human or bot) point of view

// Enemy information
var Pawn   Enemy;         // A reference to the current Enemy of the bot
var Actor  Target;
var vector LastSeenPos;   // enemy position when I last saw enemy (auto updated if EnemyNotVisible() enabled)
var vector LastSeeingPos; // position where I last saw enemy (auto updated if EnemyNotVisible enabled)
var float  LastSeenTime;

// LineOfSightTo() returns true if any of several points of Other is visible (origin, top, bottom)
native(514) final function bool LineOfSightTo(actor Other);

// CanSee() similar to line of sight, but also takes into account Pawn's peripheral (how big is that?) vision
native(533) final function bool CanSee(Pawn Other); 

function bool WouldReactToSeeing(Pawn Seen)
event HearNoise( float Loudness, Actor NoiseMaker);
event SeePlayer( Pawn Seen );	// called when a player (bIsPlayer==true) pawn is seen
event SeeMonster( Pawn Seen );	// called when a non-player (bIsPlayer==false) pawn is seen
event EnemyNotVisible();


// From the ScriptedController class
function bool CheckIfNearPlayer(float Distance);


// From the Bot class
// Calls the CanAttack() function of the current weapon to see if Other is in range
function bool CanAttack(Actor Other);

event SeePlayer(Pawn SeenPlayer); // Called when a player has been seen
function SetPeripheralVision(); // Set's the peripheral vision of a Bot based on skill

// SetAlertness()
// Change creature's alertness, and appropriately modify attributes used by engine for
// determining seeing and hearing.  SeePlayer() is affected by PeripheralVision, and
// also by SightRadius and the target's visibility HearNoise() is affected by HearingThreshold
function SetAlertness(float NewAlertness);

// Attempts to determine if Bot has line of sight to Target deltatime from now.
function bool CheckFutureSight(float deltatime);
&lt;/uscript&gt;

Irritatingly the control for the Bot's &quot;sight&quot; does not solely rest with the Controller.  There are some attributes of the [[Legacy:Pawn|Pawn]] class that have an impact.  The most obvious one of these is '''SightRadius''', which is allegdly the Bot's maximum seeing distance.  However, as I have proved conclusively the Bot's maximum seeing distance != the Bot's attacking distance.

==The SightRadius variable and its effect within the game: ==

I've experimented a lot with AI and this SightRadius variable while developing AI for CasterMod. I found out, that the suggestions on this page are not completely right about this variable and the AI function. '''THE SIGHTRADIUS VARIABLE DOES DETERMINE HOW FAR A BOT CAN SEE OPPONENTS. '''

===The Problem:===

The real problem here is that, once it has an enemy assigned, it tries to attack if possible. There are as mentioned above a load of functions to tell the bot what it can see. Three of them are of major importance. These are '''LineOfSightTo()''', '''CanSee()''' and '''SeePlayer()'''.
*'''LineOfSightTo()''' 
**LineOfSightTo() sais whether anything (solid as world geometry) blocks the direct view to the enemy. It does not consider FOV or SightRadius of the bot. 
*'''CanSee()'''
**CanSee() goes a step further. It checks the LineOfSightTo() and then checks whether the enemy is in the bots FOV. It still does not use the SightRadius for calculation. 
*'''SeePlayer()'''
**Now in contrast to the two functions above SeePlayer() takes everything , means LineOfSight, FOV and SightRadius into account, but as you can see it is not a boolean function, but an event called natively. What it does is to assign an enemy it sees just now. This can also be done by HearNoise() without being able to see the enemy or by getting hit by an enemy. After that assignment of an enemy the bot only uses LineOfSight() and CanSee() to check whether it can still see the enemy. That is the main problem.

===Solutions:===

I worked out some solutions which I currently implement into CasterMod. For one thing enemies should only be assigned if the bot does see them, so if it hears a noise it should not take on the enemy that produced it, but instead turn to the source of the noise. If it can now properly see the enemy SeePlayer() gets called by the engine. Problem 1 solved.

Now to keep the bot from shooting at enemies it can't see we have to create a new function for check if it can see them properly. My experiments with this variable and the SeePlayer() function had the following result. SightRadius is the maximum range a bot can see some player with the Visibility==128 (default). So it can see someone with Visibility==255 almost twice as wide. 

This results in a simple UScript function for the check:

&lt;uscript&gt;
function bool IsVisibleToMe(Pawn ThisPawn)
{
      local float Distance;         //Distance between my pawn and pawn in question
      local float VisFactor;        //converted visibility of enemy in float ranging from 0-2

      If (!CanSee(ThisPawn))        //view blocked or looking in other direction
             return false;

      Distance = VSize(ThisPawn.Location - Pawn.Location);
      VisFactor = ThisPawn.Visibility / 128;

      If ( (Distance/VisFactor) &lt;= Pawn.SightRadius) //can see enemy
             return true;
      return false;
}
&lt;/uscript&gt;

Now you'd have to replace the CanSee() and LineOfSightTo() calls everywhere you feel it's necessary with this function, e.g. before shooting someone. Notice that you may have to go very deeply into the bot code in order to do this.

Then you'd have to change SightRadius accordingly to the conditions in the Zone the bot is in. If there's distance fog in closer range then SightRadius, set SightRadius to fog distance. Anyway, you should change the default SightRadius value from 12000 to sth., well, about 3000-4000. This is about as far away as you could usually notice an opponent in game as a human being without sniperrifle. Hope this contribution helped you understanding how bot vision basically works in Ut200x.:)

&lt;i&gt;(by Hazard.ep)&lt;/i&gt;

'''ZxAnPhOrIaN:''' Is sight radius how far the bot can see weapons, powerups, triggers, etc?

'''Wormbo:''' It would be possible to reset the bot's target to None from an external actor if the distance to the enemy gets too big. The Tick function might be handy (and hacky ;)) here.

'''UArch''' would be intresting to expand this and add light/shadow detection into it, could be useful for stealth based games (like thievery for ut), i created a small mutator which adjusts pawns visibility so you can be stealthy in unreal/ut against the monsters (fun in coop)

==SeePlayer function ==

This function is called by the engine on the AI when it can see a pawn where bIsPlayer == true. It is not called every tick, but instead at a rate based on the visibility of the pawn being seen and the distance between the AI and the pawn compared to the sightradius value of the AI's pawn. This is not a steady rate, but a rather sporadic one, especially near the lower threshold (I'm not sure how this rate is calculated).

There is a simple threshold to this function. It is only called if the distance/sighradius &lt;= visibility/128. This means that by changing the visibility of a pawn the range at which the AI can see it can be decreased or increased. 

i.e. if a pawn's visibility is 64, it can only be seen when closer than half the AI's sightradius.

==Discussion==

'''SuperApe:''' This page looks to be exclusively related to modding with bots in mind.  I do not think this should be refactored into the bot navigation family of pages.  This should be linked by and grouped with Mod-related pages only.

----

[[:Category:Legacy Journal]]

[[:Category:Legacy Refactor Me]] &amp;ndash; Find a place for this in terms of Modding for bots.
[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1779</id>
      <timestamp>2006-12-31T17:47:46Z</timestamp>
      <contributor>
        <ip>82-43-90-2.cable.ubr08.croy.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bots can snipe through pea-soup fog... 

'''EntropicLqd:''' I have a problem - my bots can snipe me from a mile away in dense fog.  This is somewhat unfair since I can't actually see them (nor they me).  I've tried reducing the bot's sight radius but that has had no effect.  Anyone have any other thoughts on making the bots only able to see very close targets?  I've included the code (from my mutator subclass) I'm using to adjust the sight radius below.

&lt;uscript&gt;
function ModifyPlayer( Pawn Other ) {
	if ( Other.Controller != None )	{
		if ( Other.Controller.bIsPlayer &amp;&amp; !Other.IsHumanControlled() ) {
			Log(&quot;Sight radius adjusted&quot;);
// repEndDist is the end distance of the fog
			Other.SightRadius = repEndDist / 8;
		}
	}
}
&lt;/uscript&gt;
: '''I'm still stuck on this one.'''

'''ZxAnPhOrIaN:''' I need that code for my level, wich uses dense fog.

'''EntropicLqd:''' The SightRadius is reset within the function Bot.ResetSkill().  This in turn is called from Bot.Possess(), Bot.InitialiseSkill(), and Bot.Restart().  My guess is that the SightRadius value is being reset to it's original value after the ModifyPlayer() function is called.  I'll have a go at proving that tonight if I get time.
: What are the implicatons of changing the ''Bot.Default.SightRadius'' value within the mutator?  Will it screw up subsequent normal games or will the value be reset with each new game?

'''Mychaeel:''' In Unreal Tournament changes to a class's default properties persisted over level switches.  I'm not so sure about that in UT2003 &amp;ndash; it would be worth finding out for sure.

'''EntropicLqd:''' In UT2003 changes to a class's default properties persist not only over level changes, but also for the life of that instance of UT2003 - the value is not reset until you quit and re-load UT2003.  Not only that but the SightRadius has bugger all effect on how far the bots can see to attack things - irrespective of what the code claims.  I suspect the real problem lies within the AI attack code being able to pick out targets that the bot's ''can't see'' as it were.

'''Foxpaw:''' You could make a mutator that would subclass the bots - not the most compatible solution but maybe someone could find a better way. What you really want to do is to modify the Controller's PickTarget function... but you can't do that because it's native and final. So modify whatever calls it. Picktarget can take an argument that gives a maximum range for selecting a target. I'm not sure where it's called from. You could maybe call PickTarget every X amount of time (much more frequently than the bot's normally would) though that would not be very elegant. If you could find when the function is called you could maybe modify that function to pass an arbitrary maximum range to target people through the fog.

==Bot Vision - Better than X-Ray ==

If you've ever spent any time attempting to make a mod that restricts the distance players can see, or their peripheral vision then you'll know that getting the Bots to behave in a believable manner is hard.  This page will describe my on-going thoughts and musings on how to get things working in the manner you wish.

===Finding Objects and General Navigation ===

Now, in general a Bot's view of the world is a network of nodes.  Some of the paths between the nodes are &quot;more expensive&quot; than others, and a Bot will generally try and take the easiest path to wherever it is trying to get to.  Generally, this may be armour, health, a weapon, or another pick up.  Left to it's own devices a Bot will quite happily run around a level collecting stuff.  The Bot knows where everything on the level is - because it can navigate through the network of nodes to find any object in the level.  Remember, the nodes are placed on the level as [[Legacy:PathNode|PathNode]] objects, Inventory items, and other such stuff.

When a Bot has decided to go somewhere it stores information about it's route through the level in its Controller.  This makes sense - the controller is responsible to directing the Bot, and the pawn (representing the Bot in game) is responsible for the animation.  This distinction is more or less true.  I'm not convinced that it is as cut and dried as that.  It's best to think of the Controller as the Bot's brain, and the Pawn as the Bot's representation in the world.

The Controller class has some useful attributes to support this navigation, reproduced below for your pleasure and enjoyment.

&lt;uscript&gt;
var Actor     RouteCache[16]; // A cache of pathnodes the Bot needs to travel along to reach its goal?
var [[ReachSpec]] CurrentPath;
var vector    CurrentPathDir; // Direction the bot needs to travel to remain on it's &quot;path&quot;
var Actor     RouteGoal;      // final destination for current route
var float     RouteDist;      // total distance for current route
var float     LastRouteFind;  // time at which last route finding occured

// Some useful functions for Bot navigation are:
//Navigation functions - return the next path toward the goal
native(518) final function Actor FindPathTo(vector aPoint);
native(517) final function Actor FindPathToward(actor anActor, optional bool bWeightDetours);
native final function Actor FindPathToIntercept(Pawn P, Actor RouteGoal, optional bool bWeightDetours);
native final function Actor FindPathTowardNearest(class&lt;NavigationPoint&gt; GoalClass, optional bool bWeightDetours);
native(525) final function NavigationPoint FindRandomDest();
&lt;/uscript&gt;

===Seeing Enemies and Shooting at Them ===

So, how do Bots see other players?  Well, there are a few functions and attributes that would appear to affect this part of the Bot's behaviour.  In my experience none of them seem to work well in low visibility conditions.  I've listed all the ones I can find below.

&lt;uscript&gt;
// From the Controller class
float FovAngle; // The Field of View from the player's (human or bot) point of view

// Enemy information
var Pawn   Enemy;         // A reference to the current Enemy of the bot
var Actor  Target;
var vector LastSeenPos;   // enemy position when I last saw enemy (auto updated if EnemyNotVisible() enabled)
var vector LastSeeingPos; // position where I last saw enemy (auto updated if EnemyNotVisible enabled)
var float  LastSeenTime;

// LineOfSightTo() returns true if any of several points of Other is visible (origin, top, bottom)
native(514) final function bool LineOfSightTo(actor Other);

// CanSee() similar to line of sight, but also takes into account Pawn's peripheral (how big is that?) vision
native(533) final function bool CanSee(Pawn Other); 

function bool WouldReactToSeeing(Pawn Seen)
event HearNoise( float Loudness, Actor NoiseMaker);
event SeePlayer( Pawn Seen );	// called when a player (bIsPlayer==true) pawn is seen
event SeeMonster( Pawn Seen );	// called when a non-player (bIsPlayer==false) pawn is seen
event EnemyNotVisible();


// From the ScriptedController class
function bool CheckIfNearPlayer(float Distance);


// From the Bot class
// Calls the CanAttack() function of the current weapon to see if Other is in range
function bool CanAttack(Actor Other);

event SeePlayer(Pawn SeenPlayer); // Called when a player has been seen
function SetPeripheralVision(); // Set's the peripheral vision of a Bot based on skill

// SetAlertness()
// Change creature's alertness, and appropriately modify attributes used by engine for
// determining seeing and hearing.  SeePlayer() is affected by PeripheralVision, and
// also by SightRadius and the target's visibility HearNoise() is affected by HearingThreshold
function SetAlertness(float NewAlertness);

// Attempts to determine if Bot has line of sight to Target deltatime from now.
function bool CheckFutureSight(float deltatime);
&lt;/uscript&gt;

Irritatingly the control for the Bot's &quot;sight&quot; does not solely rest with the Controller.  There are some attributes of the [[Legacy:Pawn|Pawn]] class that have an impact.  The most obvious one of these is '''SightRadius''', which is allegdly the Bot's maximum seeing distance.  However, as I have proved conclusively the Bot's maximum seeing distance != the Bot's attacking distance.

==The SightRadius variable and its effect within the game: ==

I've experimented a lot with AI and this SightRadius variable while developing AI for CasterMod. I found out, that the suggestions on this page are not completely right about this variable and the AI function. '''THE SIGHTRADIUS VARIABLE DOES DETERMINE HOW FAR A BOT CAN SEE OPPONENTS. '''

===The Problem:===

The real problem here is that, once it has an enemy assigned, it tries to attack if possible. There are as mentioned above a load of functions to tell the bot what it can see. Three of them are of major importance. These are '''LineOfSightTo()''', '''CanSee()''' and '''SeePlayer()'''.
*'''LineOfSightTo()''' 
**LineOfSightTo() sais whether anything (solid as world geometry) blocks the direct view to the enemy. It does not consider FOV or SightRadius of the bot. 
*'''CanSee()'''
**CanSee() goes a step further. It checks the LineOfSightTo() and then checks whether the enemy is in the bots FOV. It still does not use the SightRadius for calculation. 
*'''SeePlayer()'''
**Now in contrast to the two functions above SeePlayer() takes everything , means LineOfSight, FOV and SightRadius into account, but as you can see it is not a boolean function, but an event called natively. What it does is to assign an enemy it sees just now. This can also be done by HearNoise() without being able to see the enemy or by getting hit by an enemy. After that assignment of an enemy the bot only uses LineOfSight() and CanSee() to check whether it can still see the enemy. That is the main problem.

===Solutions:===

I worked out some solutions which I currently implement into CasterMod. For one thing enemies should only be assigned if the bot does see them, so if it hears a noise it should not take on the enemy that produced it, but instead turn to the source of the noise. If it can now properly see the enemy SeePlayer() gets called by the engine. Problem 1 solved.

Now to keep the bot from shooting at enemies it can't see we have to create a new function for check if it can see them properly. My experiments with this variable and the SeePlayer() function had the following result. SightRadius is the maximum range a bot can see some player with the Visibility==128 (default). So it can see someone with Visibility==255 almost twice as wide. 

This results in a simple UScript function for the check:

&lt;uscript&gt;
function bool IsVisibleToMe(Pawn ThisPawn)
{
      local float Distance;         //Distance between my pawn and pawn in question
      local float VisFactor;        //converted visibility of enemy in float ranging from 0-2

      If (!CanSee(ThisPawn))        //view blocked or looking in other direction
             return false;

      Distance = VSize(ThisPawn.Location - Pawn.Location);
      VisFactor = ThisPawn.Visibility / 128;

      If ( (Distance/VisFactor) &lt;= Pawn.SightRadius) //can see enemy
             return true;
      return false;
}
&lt;/uscript&gt;

Now you'd have to replace the CanSee() and LineOfSightTo() calls everywhere you feel it's necessary with this function, e.g. before shooting someone. Notice that you may have to go very deeply into the bot code in order to do this.

Then you'd have to change SightRadius accordingly to the conditions in the Zone the bot is in. If there's distance fog in closer range then SightRadius, set SightRadius to fog distance. Anyway, you should change the default SightRadius value from 12000 to sth., well, about 3000-4000. This is about as far away as you could usually notice an opponent in game as a human being without sniperrifle. Hope this contribution helped you understanding how bot vision basically works in Ut200x.:)

&lt;i&gt;(by Hazard.ep)&lt;/i&gt;

'''ZxAnPhOrIaN:''' Is sight radius how far the bot can see weapons, powerups, triggers, etc?

'''Wormbo:''' It would be possible to reset the bot's target to None from an external actor if the distance to the enemy gets too big. The Tick function might be handy (and hacky ;)) here.

'''UArch''' would be intresting to expand this and add light/shadow detection into it, could be useful for stealth based games (like thievery for ut), i created a small mutator which adjusts pawns visibility so you can be stealthy in unreal/ut against the monsters (fun in coop)

==SeePlayer function ==

This function is called by the engine on the AI when it can see a pawn where bIsPlayer == true. It is not called every tick, but instead at a rate based on the visibility of the pawn being seen and the distance between the AI and the pawn compared to the sightradius value of the AI's pawn. This is not a steady rate, but a rather sporadic one, especially near the lower threshold (I'm not sure how this rate is calculated).

There is a simple threshold to this function. It is only called if the distance/sighradius &lt;= visibility/128. This means that by changing the visibility of a pawn the range at which the AI can see it can be decreased or increased. 

i.e. if a pawn's visibility is 64, it can only be seen when closer than half the AI's sightradius.

==Discussion==

'''SuperApe:''' This page looks to be exclusively related to modding with bots in mind.  I do not think this should be refactored into the bot navigation family of pages.  This should be linked by and grouped with Mod-related pages only.

----

[[:Category:Legacy Custom Class]]

[[:Category:Legacy Refactor Me]] &amp;ndash; Find a place for this in terms of Modding for bots.
[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bot/Weapon Management</title>
    <id>557</id>
    <revision>
      <id>1716</id>
      <timestamp>2005-11-16T21:55:18Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>waster of a mouse click.  refactor and remove.</comment>
      <text xml:space="preserve">; RateWeapon : returns the Weapon's AIRating, a slightly randomized 

==Discussion==

'''SuperApe:''' What a waste of a click.  refactor and remove.  All &quot;Bot/&quot; page ideas are hereby scrapped, this was the first and only one actually made.

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Into [[Legacy:Bot|Bot]] and remove.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1717</id>
      <timestamp>2004-04-15T11:46:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">; RateWeapon : returns the Weapon's AIRating, a slightly randomized</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BotCandy</title>
    <id>559</id>
    <revision>
      <id>1721</id>
      <timestamp>2005-11-17T02:09:30Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Many [[Legacy:UT|UT]] mods lacked good bot support, some used the basic [[Legacy:Bot Support (UT)|Bot Support (UT)]], which is great for running around, collecting weapons and killing anything you see. However, once you remove the pickups you'll notice that bots will only travel between HomeBase, DefensePoint and similar actors, and objective based actors such as [[Legacy:FlagBase|FlagBase]] or actors special to the mod.

In order to fix this despite the coder's lack of time/interest which haunts many mods, I found a work-around.

The idea is based on the simple fact that bots are hunting [[Legacy:Pickup|Pickup]]s. Sadly, we can't have that in the map. Instead we will have to cheat the bots into thinking they are hunting weapons. To do this, do the following:

# Place an Actor &gt;&gt; Inventory &gt;&gt; Pickup &gt;&gt; TournamentPickup &gt;&gt; [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
# Open Actor Properties and set its Filter -&gt; OddsOfAppearing to 0
# Set the Inventory -&gt; MaxDesireability to an appropriate number (The higher number, the higher odds of bots going there)

The desireability detirmines how sweet the candy is, making bots want it more. When a bot runs over the candy, it is &quot;picked up&quot; despite not really existing, ensuring bots will have to move on searching for the next piece of candy. Place these candy at keypoints, intersections or in areas the bots are ignoring.

'''LegalAssassin'''

''This technique was used in TTR-Nuenen''

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] (UT200x)
* [[Legacy:Bot Support (UT)|Bot Support (UT)]]

==Discussion==

'''SabbathCat:''' Is the Filter -&gt; OddsOfAppearing=0 supposed to keep the [[Legacy:UT_ShieldBelt|UT_ShieldBelt]] from being displayed?

It still shows up for me. Maybe setting its DrawType = DT_None and BCollideActors=False ? 

'''LegalAssassin:''' It works for me. Perhaps Advanced -&gt; bHidden = True would do the trick?

'''Wormbo:''' OddsOfAppearing actually prevents the pickup from being spawned altogether, which is something completely differnet than visually hiding it. If you only hide it can still be picked up. If you make it untouchable, bots will likely get stuck there because they try to reach it and can't pick it up. OddsOfAppearing has the advantage, that UnrealEd still creates an InventorySpot for the pickup, but the pickup itself will never exist in the game.

'''Legal:''' Yes, but I can't see how it couldn't work, ie still being visible. Either SabbathCat did something wrong or it works, but still shows. If it's the second one, you should try to make it invisible.</text>
    </revision>
    <revision>
      <id>1722</id>
      <timestamp>2004-08-15T09:16:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Many [[Legacy:UT|UT]] mods lacked good bot support, some used the basic UT [[Legacy:Navigation AI|Navigation AI]], which is great for running around, collecting weapons and killing anything you see. However, once you remove the pickups you'll notice that bots will only travel between HomeBase, DefensePoint and similar actors, and objective based actors such as [[Legacy:FlagBase|FlagBase]] or actors special to the mod.

In order to fix this despite the coder's lack of time/interest which haunts many mods, I found a work-around.

The idea is based on the simple fact that bots are hunting [[Legacy:Pickup|Pickup]]s. Sadly, we can't have that in the map. Instead we will have to cheat the bots into thinking they are hunting weapons. To do this, do the following:

# Place an Actor &gt;&gt; Inventory &gt;&gt; Pickup &gt;&gt; TournamentPickup &gt;&gt; [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
# Open Actor Properties and set its Filter -&gt; OddsOfAppearing to 0
# Set the Inventory -&gt; MaxDesireability to an appropriate number (The higher number, the higher odds of bots going there)

The desireability detirmines how sweet the candy is, making bots want it more. When a bot runs over the candy, it is &quot;picked up&quot; despite not really existing, ensuring bots will have to move on searching for the next piece of candy. Place these candy at keypoints, intersections or in areas the bots are ignoring.

'''LegalAssassin'''

''This technique was used in TTR-Nuenen''

----

'''SabbathCat:''' Is the Filter -&gt; OddsOfAppearing=0 supposed to keep the [[Legacy:UT_ShieldBelt|UT_ShieldBelt]] from being displayed?

It still shows up for me. Maybe setting its DrawType = DT_None and BCollideActors=False ? 

'''LegalAssassin:''' It works for me. Perhaps Advanced -&gt; bHidden = True would do the trick?

'''Wormbo:''' OddsOfAppearing actually prevents the pickup from being spawned altogether, which is something completely differnet than visually hiding it. If you only hide it can still be picked up. If you make it untouchable, bots will likely get stuck there because they try to reach it and can't pick it up. OddsOfAppearing has the advantage, that UnrealEd still creates an InventorySpot for the pickup, but the pickup itself will never exist in the game.</text>
    </revision>
    <revision>
      <id>1723</id>
      <timestamp>2004-08-15T09:38:03Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>'</comment>
      <text xml:space="preserve">Many [[Legacy:UT|UT]] mods lacked good bot support, some used the basic UT [[Legacy:Navigation AI|Navigation AI]], which is great for running around, collecting weapons and killing anything you see. However, once you remove the pickups you'll notice that bots will only travel between HomeBase, DefensePoint and similar actors, and objective based actors such as [[Legacy:FlagBase|FlagBase]] or actors special to the mod.

In order to fix this despite the coder's lack of time/interest which haunts many mods, I found a work-around.

The idea is based on the simple fact that bots are hunting [[Legacy:Pickup|Pickup]]s. Sadly, we can't have that in the map. Instead we will have to cheat the bots into thinking they are hunting weapons. To do this, do the following:

# Place an Actor &gt;&gt; Inventory &gt;&gt; Pickup &gt;&gt; TournamentPickup &gt;&gt; [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
# Open Actor Properties and set its Filter -&gt; OddsOfAppearing to 0
# Set the Inventory -&gt; MaxDesireability to an appropriate number (The higher number, the higher odds of bots going there)

The desireability detirmines how sweet the candy is, making bots want it more. When a bot runs over the candy, it is &quot;picked up&quot; despite not really existing, ensuring bots will have to move on searching for the next piece of candy. Place these candy at keypoints, intersections or in areas the bots are ignoring.

'''LegalAssassin'''

''This technique was used in TTR-Nuenen''

----

'''SabbathCat:''' Is the Filter -&gt; OddsOfAppearing=0 supposed to keep the [[Legacy:UT_ShieldBelt|UT_ShieldBelt]] from being displayed?

It still shows up for me. Maybe setting its DrawType = DT_None and BCollideActors=False ? 

'''LegalAssassin:''' It works for me. Perhaps Advanced -&gt; bHidden = True would do the trick?

'''Wormbo:''' OddsOfAppearing actually prevents the pickup from being spawned altogether, which is something completely differnet than visually hiding it. If you only hide it can still be picked up. If you make it untouchable, bots will likely get stuck there because they try to reach it and can't pick it up. OddsOfAppearing has the advantage, that UnrealEd still creates an InventorySpot for the pickup, but the pickup itself will never exist in the game.

'''Legal:''' Yes, but I can't see how it couldn't work, ie still being visible. Either SabbathCat did something wrong or it works, but still shows. If it's the second one, you should try to make it invisible.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BotInfo</title>
    <id>28564</id>
    <revision>
      <id>40265</id>
      <timestamp>2009-11-17T11:10:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BotReplicationInfo</title>
    <id>551</id>
    <revision>
      <id>1703</id>
      <timestamp>2002-04-20T17:27:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] &gt;&gt; BotReplicationInfo}}

The PRI subclass used by UT [[Legacy:Bot (UT)|Bot (UT)]]s.

==Properties ==
; [[Legacy:Actor|Actor]] OrderObject :
; name RealOrders :
; [[Legacy:Pawn (UT)|Pawn (UT)]] RealOrderGiver :
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RealOrderGiverPRI :

==Methods ==
; function SetRealOrderGiver([[Legacy:Pawn (UT)|Pawn (UT)]] P) :</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bots</title>
    <id>561</id>
    <revision>
      <id>1726</id>
      <timestamp>2003-05-23T16:31:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; Bots (Package: UnrealShare)}}

Base class for all [[Legacy:Artificial Intelligence|AI]]-controlled players in [[Legacy:Unreal 1|Unreal 1]].

See also [[Legacy:Bot (UT)|Bot (UT)]], the corresponding base class in UT.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1727</id>
      <timestamp>2003-02-10T14:34:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; Bots}}

Base class for all [[Legacy:Artificial Intelligence|AI]]-controlled players in Unreal.  (See also [[Legacy:Bot (UT)|Bot (UT)]], the corresponding base class in [[Legacy:Unreal Tournament|Unreal Tournament]].)

----

==Bots in general ==

(also in non-Unreal engine games)
;BOT: automated monster that emulate how players fight deathmatch and get items.

Mod Bots:
* [FrikBot], pluggable.
* ReaperBot, do cheats, hard to beat.
* OmicronBot, finne tunned.
* glBOT, tomaz engine-built-in bot

Related webs

* [FrikBot]s web page, with is WayPoint depot.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Boxer</title>
    <id>600</id>
    <revision>
      <id>1811</id>
      <timestamp>2007-06-18T23:43:42Z</timestamp>
      <contributor>
        <ip>Ip68-231-63-152.ph.ph.cox.net</ip>
      </contributor>
      <comment>*created page</comment>
      <text xml:space="preserve">@right@Boxer

Boxer is a full-featured programmer's [[Legacy:Text Editor|text editor]] available from [http://www.boxersoftware.com Boxer Software].

Features include color syntax highlighting, Perl regular expressions for search and replace, a C-like macro

language, project support, remote FTP file editing, auto-complete, and file\ sizes to 2GB.

A single-user license is priced at $59.99. 

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Braagh</title>
    <id>664</id>
    <revision>
      <id>1953</id>
      <timestamp>2008-01-14T01:10:58Z</timestamp>
      <contributor>
        <ip>Braagh</ip>
      </contributor>
      <comment>update</comment>
      <text xml:space="preserve">===My Work===

As of yet I really have nothing to show...BUT soon I shall have...something.

Actually I have been working on a small map that will probably be a 1v1 map for ut3. Will upload images when it gets to a viewable point.

====Total Destruction====

The map I had been working on has totally destroyed itself in one of the weirdest glitches in the history of mankind. I turned off the computer, and then the next day turned it back on, as I do everyday. I proceeded to attempt to open the map from the map folder, and saw nothing. NOTHING. Every map had been deleted. I decided, &quot;Well, I have some backups, I'll just get one of those.&quot; Those were gone too. I proceeded to search the entire hard drive for any Unreal Tournament 2004 map files to find nothing. The computer had taken it upon itself to delete every last map file from the computer, and the only one remaining was one I had on my flashdrive, and that one was a few months old, making it totally pointless to attempt to make up that lost time.

This is a screenshot from that map:

[[Image:Legacy_combustionnew2.jpeg|center|]]

----

'''braagh:''' Hello!

'''Tarquin:''' Hello! Welcome to the wiki. Those screenshots look pretty good :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1954</id>
      <timestamp>2007-03-12T20:37:37Z</timestamp>
      <contributor>
        <ip>Braagh</ip>
      </contributor>
      <comment>Help!</comment>
      <text xml:space="preserve">===The Name===

&quot;braagh&quot; started as random gibberish after flicking the analog stick around and mashing on the 'X' button. I've become attached to the name as it is easy to remember and I have never tried to sign up for something and have say &quot;You can't be that name because it already exists,&quot; or something like that.

Oh yeah, it's pronounced brawg, not brag. Most people can't pronounce &quot;aa&quot; and it can get annoying.

===Me===

I am 15 years old, and I am a noob. I have been working with UEd for about a year, and have been jumping from level concept to concept as I taught myself as much as I could in that time. I find new stuff, and forget old stuff, almost constantly. I am just beginning to teach myself Unreal Script and Maya(and I have a good source).

At the moment, you won't find me anywhere else really. My good computer isn't connected to the internet, making it hard to play games or anything. I finally bought the router last week, but now I need 75ft (!) of cable.

===My Work===

I have a large number of unreleased maps, you know, blobs of pixels and polygons that kind of look like something and are kind of fun. I've just begun (if by ''just'' I mean three months of work filled with crashes, unfixable errors, staying up way to late, and forgetting to eat) working on a level I call &quot;Combustion&quot;.

Here are some example pictures:

@block@combustion1 Main room.

@block@combustion2 Side room.

@block@combustion3 Other side room.

The concept is a reasearch/mining facility that was closed after the location became unstable. There are frequent tremors, and lava has seeped into the main facility.

====What's Been Done====

This level actually began in June of 2006. I had two weeks of summer break before I was going to work, and in that time I wanted to do as much as I could on the computer, and on video games in general. I created a simple CTF map called &quot;CTF-Combustion.&quot; It was the first map I finalized, though all it was was a simple two base map with four bridges in between, all of which were above the deadly lava pit in the center. Basically it was the first picture up above, without the terrain, or any of the interesting meshes.

After my job started(it was my first), I began to play around with the Hammer editor for Half-Life 2. I found that it didn't provide enough variety for textures and things, and even simple tasks took far more time than in UEd. I also knew that the new engine was going to be coming out, so I decided at the end of summer that I would begin mapping in UEd again.

I played with a few ideas, though most of them were eliminated or postponed due to either my inability or realizing that pulling of the concept would take an absurd amount of time.

=====Resurrection=====

At the end of October I decided to resurrect Combustion as a new map, with better, well, everything. I worked and worked for a few weeks, and it began to look like what I wanted.

=====Disaster=====

Then, disaster struck. Just like it always does. Over Christmas break my level decided to, as I call it, &quot;eat itself&quot;. Basically, the UEd goblin wiped my map, and I had forgot to backup the map. Yeah... I was kind of annoyed.

So I decided, well I'll work on a different map. I basically built a bunch of BSP and then decided that I didn't like the concept anymore.

Then, after that short break I began again. The restart was very quick, and it looked slightly better. Finally, I got to the point where I was adding static meshes to the map, when I realized that the way the map was going there was no way I would be able to balance the map completely for good gamepley. About the same time, I realized that I had a rectangular layer on the terrain, and it would crash every time I would edit the terrain. So, in turn I decided to change the map design to a DM rather than a CTF. This was around The beginning of February.

Since then I have heavily altered the bulk of the design, finally added a number of static meshes, and began to iron out certain problems.

====To Do====

There is alot to do on this level. The lighting is all test lighting(in fact these pictures were taken on a level I am using to test projectors), and most of it was just stuck in so I could at least kind of see where I was going. If you look at the third you can see a floating lantern that I am using to test the way I want it to move.

Obviously I'm going to need to test. A lot. And I'm going to need a lot of blocking volumes.

I am planning to add a new weapon. This will teach me quite a few things, and it will provide me with a more suitable hidden weapon for this level. The super weapons would be far to hard to use in this level design, so instead I am going to create a close quarters super weapon (similar to the flak cannon, but much more powerful, and a bit more destructive). I may be looking for help with this...:)

===Update 1===

Yay, I got more done on Combustion. It's looking a lot better(it's looking more like what I intended at least). Here's new screenshots:

Sorry about the goofy sizing. (My time is limited and I had to do it by hand.)

@block@combustionnew1

[[Image:Legacy_combustionnew2.jpeg|center|]]

@block@combustionnew3

@block@combustionnew4

@block@combustionnew5

====HELP!!!====

=====Problem 1=====

But, I need help. Please. I don't think I can find these in the wiki, and I don't have time to wander around on the internet right now(school projects are attacking). 

Sorry about the goofy sizing. (My time is limited and I had to do it by hand.)

@block@helpme2 This shouldn't look like this.

@block@helpme3 It should look like this.

The texture that acts strangely appears fine in the editor, but shrinks in game. The texture is a material switcher that switches between a transparent texture oscillator and an opaque texture oscillator. Is there a way to fix this, or should I just try another method?

=====Problem 2=====

This isn't so much a glitch, as something I forget how to fix.

@block@helpme1 Weird shadows in corners...

I completely forget how to fix this.

===The Wiki===

I want to help with this project. There are areas that are seriously lacking, and others which just don't make sense. I will probably see if I can help with projectors(as that's what I'm playing with at the moment), and anything else I see that I could be helpful with. I'm happy to join the community.

I've started to piece together a tutorial about projectors;

[[Legacy:Braagh'S Projector Happy Fun Time|Braagh's Projector Happy Fun Time]]

----

'''braagh:''' Hello!

'''Tarquin:''' Hello! Welcome to the wiki. Those screenshots look pretty good :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1955</id>
      <timestamp>2007-03-14T19:41:41Z</timestamp>
      <contributor>
        <ip>Braagh</ip>
      </contributor>
      <minor/>
      <comment>figured it out, sorta</comment>
      <text xml:space="preserve">===The Name===

&quot;braagh&quot; started as random gibberish after flicking the analog stick around and mashing on the 'X' button. I've become attached to the name as it is easy to remember and I have never tried to sign up for something and have say &quot;You can't be that name because it already exists,&quot; or something like that.

Oh yeah, it's pronounced brawg, not brag. Most people can't pronounce &quot;aa&quot; and it can get annoying.

===Me===

I am 15 years old, and I am a noob. I have been working with UEd for about a year, and have been jumping from level concept to concept as I taught myself as much as I could in that time. I find new stuff, and forget old stuff, almost constantly. I am just beginning to teach myself Unreal Script and Maya(and I have a good source).

At the moment, you won't find me anywhere else really. My good computer isn't connected to the internet, making it hard to play games or anything. I finally bought the router last week, but now I need 75ft (!) of cable.

===My Work===

I have a large number of unreleased maps, you know, blobs of pixels and polygons that kind of look like something and are kind of fun. I've just begun (if by ''just'' I mean three months of work filled with crashes, unfixable errors, staying up way to late, and forgetting to eat) working on a level I call &quot;Combustion&quot;.

Here are some example pictures:

@block@combustion1 Main room.

@block@combustion2 Side room.

@block@combustion3 Other side room.

The concept is a reasearch/mining facility that was closed after the location became unstable. There are frequent tremors, and lava has seeped into the main facility.

====What's Been Done====

This level actually began in June of 2006. I had two weeks of summer break before I was going to work, and in that time I wanted to do as much as I could on the computer, and on video games in general. I created a simple CTF map called &quot;CTF-Combustion.&quot; It was the first map I finalized, though all it was was a simple two base map with four bridges in between, all of which were above the deadly lava pit in the center. Basically it was the first picture up above, without the terrain, or any of the interesting meshes.

After my job started(it was my first), I began to play around with the Hammer editor for Half-Life 2. I found that it didn't provide enough variety for textures and things, and even simple tasks took far more time than in UEd. I also knew that the new engine was going to be coming out, so I decided at the end of summer that I would begin mapping in UEd again.

I played with a few ideas, though most of them were eliminated or postponed due to either my inability or realizing that pulling of the concept would take an absurd amount of time.

=====Resurrection=====

At the end of October I decided to resurrect Combustion as a new map, with better, well, everything. I worked and worked for a few weeks, and it began to look like what I wanted.

=====Disaster=====

Then, disaster struck. Just like it always does. Over Christmas break my level decided to, as I call it, &quot;eat itself&quot;. Basically, the UEd goblin wiped my map, and I had forgot to backup the map. Yeah... I was kind of annoyed.

So I decided, well I'll work on a different map. I basically built a bunch of BSP and then decided that I didn't like the concept anymore.

Then, after that short break I began again. The restart was very quick, and it looked slightly better. Finally, I got to the point where I was adding static meshes to the map, when I realized that the way the map was going there was no way I would be able to balance the map completely for good gamepley. About the same time, I realized that I had a rectangular layer on the terrain, and it would crash every time I would edit the terrain. So, in turn I decided to change the map design to a DM rather than a CTF. This was around The beginning of February.

Since then I have heavily altered the bulk of the design, finally added a number of static meshes, and began to iron out certain problems.

====To Do====

There is alot to do on this level. The lighting is all test lighting(in fact these pictures were taken on a level I am using to test projectors), and most of it was just stuck in so I could at least kind of see where I was going. If you look at the third you can see a floating lantern that I am using to test the way I want it to move.

Obviously I'm going to need to test. A lot. And I'm going to need a lot of blocking volumes.

I am planning to add a new weapon. This will teach me quite a few things, and it will provide me with a more suitable hidden weapon for this level. The super weapons would be far to hard to use in this level design, so instead I am going to create a close quarters super weapon (similar to the flak cannon, but much more powerful, and a bit more destructive). I may be looking for help with this...:)

===Update 1===

Yay, I got more done on Combustion. It's looking a lot better(it's looking more like what I intended at least). Here's new screenshots:

Sorry about the goofy sizing. (My time is limited and I had to do it by hand.)

@block@combustionnew1

[[Image:Legacy_combustionnew2.jpeg|center|]]

@block@combustionnew3

@block@combustionnew4

@block@combustionnew5

====HELP!!!====

But, I need help. Please. I don't think I can find these in the wiki, and I don't have time to wander around on the internet right now(school projects are attacking). 

Sorry about the goofy sizing. (My time is limited and I had to do it by hand.)

@block@helpme2 This shouldn't look like this.

@block@helpme3 It should look like this.

The texture that acts strangely in the editor, until I click on it once, then it appears fine in the editor. Once I start the level it shrinks and appears very strangely. The texture is a material switcher that switches between a transparent texture oscillator and an opaque texture oscillator. Is there a way to fix this, or should I just try another method?

===The Wiki===

I want to help with this project. There are areas that are seriously lacking, and others which just don't make sense. I will probably see if I can help with projectors(as that's what I'm playing with at the moment), and anything else I see that I could be helpful with. I'm happy to join the community.

I've started to piece together a tutorial about projectors;

[[Legacy:Braagh'S Projector Happy Fun Time|Braagh's Projector Happy Fun Time]]

----

'''braagh:''' Hello!

'''Tarquin:''' Hello! Welcome to the wiki. Those screenshots look pretty good :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43555</id>
      <timestamp>2010-06-28T18:11:57Z</timestamp>
      <contributor>
        <ip>141.166.185.23</ip>
      </contributor>
      <comment>/* My Work */</comment>
      <text xml:space="preserve">Hi, this is my old page, but I would like it deleted.</text>
    </revision>
    <revision>
      <id>43556</id>
      <timestamp>2010-06-28T19:34:50Z</timestamp>
      <contributor>
        <ip>141.166.185.23</ip>
      </contributor>
      <comment>Delete this, please?</comment>
      <text xml:space="preserve">Hi, this is my old page, but I would like it deleted.
While I know this is a legacy page, it would be personal preference to have it removed.

{{delete}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Breaking Glass UT2003</title>
    <id>642</id>
    <revision>
      <id>1906</id>
      <timestamp>2007-08-08T14:27:14Z</timestamp>
      <contributor>
        <ip>Dinoboy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial applies to UT2003/2004.

==The Concept==

To make a window that breaks in your map, you need two things. A movable brush that represents the window in its whole state, and an [[Legacy:Emitter|Emitter]] to spawn in for the shattering glass fragments that spill out when the window gets &quot;Broken&quot;.

You will need to understand the basic use of [[Legacy:Mover|Mover]]s, [[Legacy:Trigger|Trigger]]s and [[Legacy:ScriptedTrigger|ScriptedTrigger]]s

==The Mover==

If you don't already have a nice glass material set up, make one now. I suggest reading about [[Legacy:Shader|Shader]]s, using Opacity in your shader, and maybe Specularity if you want it to look really nice.

In 2003/2004 movers may only be made with [[Legacy:Static Mesh|static mesh]]es, so we will use [[Legacy:BSP|BSP]] to create our window to start with. Apply your window texture to a thin additive brush that fits as your window. Right click on the additive brush after you create it, and choose Convert -&gt; To Static Mesh. Enter myLevel as your package, and give it whatever name you wish. Now if you look in the static mesh browser, you should see your window mesh.

Back in the edit, click on the Add Mover button to add your window mesh as a movable brush. Move it into place, and set this as the base with Mover -&gt; Key 0.  Now right click the mover and choose Mover -&gt; Key 1, then move the window somewhere out of view, preferably completely outside the level, right click it again and choose Mover -&gt; Key 0 (Base). The window should snap back into its base position.

We need to set up some properties in our mover to make it dissapear from view when shot. So open the properties window for the mover.

We will change:

* '''Object -&gt; InitialState''' to '''TriggerOpenTimed'''
* '''Mover -&gt; MoveTime''' to '''0'''
* '''Mover -&gt; StayOpenTime''' to however long you want your window to stay broken before respawning. This value is in seconds.
* '''Mover -&gt; bDamageTriggered''' to '''True'''
* '''Mover -&gt; DamageThreshold''' to '''1'''
* '''Display -&gt; bShadowCast''' to '''False''' or else the window will cast a shadow, and look bad when it breaks.

Now hopefully we have a pane of glass that when shot, moves (In 0 seconds) off the map, giving the illusion that it has been destroyed.

But now we need shattering fragments of glass to complete the illusion.

====The Special Effects====

This section is a compilation of several different resources on creating breaking glass.  Many of them had 90% of the information necessary but none had 100%.  So everyone who made a breaking glass tut, your stuff is used in here, thanks, you rock.

The falling shards of glass require you to set up an emitter to produce the shards, and a second custom actor class to spawn them.  First: the emitter:

Select &quot;Emitter&quot; from the actor classes (or Network Emitter&quot; to make it playable online), and place it in your level.  There are certain things that must be set up correctly for the breaking glass to spawn the way you want it to:

* Advanced -&gt; bDirectional = True.  This is necessary to align the shards with the window.
* Advanced -&gt; bNoDelete = '''FALSE'''.  This is required for the emitter to be spawned when called by the &quot;spawner&quot; actor.
* Emitter -&gt;
** Acceleration -&gt; Acceleration - Z = -950.  This simulates normal gravity in allowing the shards to fall.
** Collision -&gt; DampingFactorRange - X Max/Min = .9 / .8  Y Max/Min = .5  Z Max/Min = .3 / .2  (''It's important to note that in 2004 range properties windows, Max is '''first''', then Min.'', even though they are displayed as min/max at the top of the listing.)
** Collision -&gt; UseCollision = True.  Else your shards will fall through the floor and keep going.  o_O
** General -&gt; MaxParticles = ~2000.  This is variable depending on the size of your window and of yuur shards.  Once you get more than 5000 or so particles at once, it starts to drag down your average PC, so if your level has 7 breakable windows, don't give them 4000 particles each.  If necessary, spawn a fewer number of larger shards to save CPU cycles.
** Local -&gt; RespawnDeadParticles = False.  You want a broken window, not a glass fountain.
** Location -&gt; StartLocationRange -&gt; Y Max/Min = +/- half the width of your window.  Example, if your window is 512UU wide, Y range is 256 / -256.  Same for Z range, Max/Min = +/- half the height of your window.
** '''Rotation -&gt; UseRotationFrom = PTRS_Actor.'''  This is critical if you wish to have more than one breaking glass in your level, from different angles.
** Spawning -&gt; AutomaticInitialSpawning = False.  It is going to be triggered.
** Spawning -&gt; InitialParticlesPerSecond = 50000.  This releases all particles in a fraction of a second.
** Spawning -&gt; ParticlesPerSecond = 0.  Again, not a fountain.
** Texture -&gt; DrawStyle = PTDS_Transluscent
** Texture -&gt; Texture - Select the shard texture from your texture browser window, then return here and click &quot;Use&quot; to insert it into your texture line.
** Texture -&gt; TextureUSubdivisions &amp; TextureVSubdivisions-&gt; Divide your texture up by shards. For example, if your texture is two shards wide by two shards high, your U and V subdivions are 2 each.
** Time -&gt; LifetimeRange = Set this to whatever.  If your window respawns, set it to no more than the &quot;Open Time&quot; of your window mover.  Else, set it to whatever you wish, 100000 to stay forever, but remember that particles eat up resources as long as they remain in your level.
** Velocity -&gt; StartVelocityRange - X Max/Min = 200 / -200.  Y Max/Min = 100 / -100

At this point, the effect of the emitter should be visible in any 3d views you have open.  You can use this to tweak the settings of your emitter to get the look you want.

Once you've created your emitter, align it with your window, and use rotation to point the directional arrow in the desired direction, I recommend an angle somewhat downward and away from the window, to make sure your axis rotation is set up properly.

Now, its time to set it up to be spawned when someone shoots your window.  Leave your emitter properties window open for now.

Go back to your Actor browser window, right-click on Emitter, and click New to create a new custom subclass of Emitter.&lt;br /&gt;In the creation window, change MyPackage to MyLevel (this is a must), set a group if you wish, and set the name however you wish.  For reference, I will use BreakingGlassEmitter.

An UnrealScript window will pop open.  You can click &quot;Compile Changed&quot; now if you wish, or later when we create the spawner.  Either way, close this window.

Now expand the Emitters section and right-click on BreakingGlassEmitter.  If it is not visible in your window, simply uncheck the &quot;Placeable Only&quot; box and it will appear.  Click on Default Properties, and a properties window will appear similar to the one for your emitter.  Open up the Emitters section of your BreakingGlassEmitter, and click the Add button.  Now go to the Emitters section of the properties window of your emitter, and copy the full name from the Emitters -&gt; 0 field, &quot;SpriteEmitter'myLevel.SpriteEmitter0&quot; or something similar.  Paste it into the corresponding field in your BreakingGlassEmitter and hit Enter.  All the properties of your emitter will be copied into this actor subclass.

Now change a few settings:
* Advanced -&gt; bDirectional = True
* Advanced -&gt; bNoDelete = FALSE

Now close all these properties windows and delete your template emitter, it is no longer needed.

Go back to your Actors browser window, right click on Emitter, and click New to create your second custom subclass.  Package is still myLevel, Group is completely up to you, Name is whatever, we will use BreakingGlassSpawner for reference.

When the UnrealScript window pops up, type or copy / paste this into the script:

&lt;UScript&gt;

class BreakingGlassSpawner extends Actor
     placeable;

event Trigger(Actor Other, Pawn EventInstigator)

{Spawn(class'myLevel.BreakingGlassEmitter',,,Self.Location,Self.Rotation);}
&lt;/UScript&gt;

Now compile changed scripts and close your window.  In the Actor browser, you should be able to see both your custom subclasses, BreakingGlassEmitter and BreakingGlassSpawner.  Right-click on BreakingGlassSpawner, click Default Properties, and check the following settings:
*Advanced -&gt; bDirectional = True
*'''Advanced -&gt; bNoDelete = True''' (this is where you must do this)

Now Add your BreakingGlassSpawner actor to the level, and align it with the window where you had placed the emitter previously.  Set the Event -&gt; Event of your window mover to something like Window1 or BreakGlass or whatever, then set the Event -&gt; Tag of your BreakingGlassSpawner to match.  Save, rebuild, save, give it a go!

''(Note: some of the steps taken here are very likely redundant, for example, setting the directional to True for the Emitter AND BOTH actor subclasses, if someone can verify that this will still function with certain steps excluded, feel free to remove them.)''

----

Now the UDN page gives a very vague explanation of creating an actor to spawn this emitter. I followed more of Robo's excellent instructions and instead used a [[Legacy:ScriptedTrigger|ScriptedTrigger]] to accomplish this.

----

The UDN says to make a spawner class but I used a ScriptedTrigger for spawning my emitters. The advantages of using a ScriptedTrigger are that you can spawn your emitter class at the location of ANY ScriptedTrigger without having to have location and rotation data for the emitter class. You can also add a breaking glass sound effect to play within the ScriptedTrigger.

# Add your glass window mover to your map. For its key1, move it away out of the map so it will be hidden when it's shot.

# Expand the &quot;MoverEvents&quot; section and set the following values..

OpeningEvent = breakglass1

# Expand the &quot;Object&quot; section and set its InitialState to &quot;TriggerOpenTimed&quot;.

# Add a ScriptedTrigger to your map and move it to be in the same position as your mover. Also rotate it so it's facing the right way for when your glass breaks.

# Open the ScriptedTriggers properties, expand its Events section, and set its tag to &quot;breakglass1&quot;.

# Now for the meat. Expand its AIScript&quot; section...

* Add a new event of Action_WAITFOREVENT type, and in its ExternalEvent = breakglass1
* Add a new event of Action_SpawnActor and select your emitter class as the actor to spawn.
* Add a new event of type Action_PLAYSOUND. Set its sound to be a breaking glass sound. We are using this method because it gives you better control over the sound than the mover does.
* Add a new event of type Action_GOTOACTION. Leave its setting at 0

Ok that should do it. Rebuild your map and test it out. When you shoot the mover it should immediatly move out of view, the breaking glass emitter will be spawned, showering broken glass from where the ScriptedTrigger is, and play a breaking glass noise.

This method should work well and it has the added bonus that you can add more breaking glass movers and ScriptedTriggers to have a whole glasshouse of breakable glass windows. Even better they respawn after the time you set in your movers &quot;StayOpenTime' value.

Hopefully that helps you out 

----

It certainly helped me out, and as any good mapper should, im adding what ive learned to the wiki :)

'''LionsPhil:''' This is neat, but if a player is standing on the glass (e.g. because you want other players to be able to shoot that player's footing away &amp;gt;&lt;nowiki&gt;=)=&lt;/nowiki&gt; ), it will fling them in the direction of the mover's 'broken' position. Is there really no generic &quot;breakable&quot; smesh-based actor (think Half-Life 1's brush-based [http://collective.valve-erc.com/index.php?ent=func_breakable func_breakable], or [[Legacy:DestroyableObjective SM|DestroyableObjective SM]] without the objective ties) in UT?

'''Foxpaw:''' I believe destroyable [[Legacy:Decoration|Decoration]]s behave in this manner. If not you could easily code such an actor.

'''Bonehed316:''' I've got some code for breakable objects which...I could distribute.  It doesnt use the old mover hack, but actually a StaticMeshActor which is destroyed (or possibly hidden/collisions disabled).  Maybe I'll clean it up for distribution.  I used to host a breakable glass script which worked with the mover method, but that has long since been lost.

'''Messiah:''' It says in the script extends Actor, but this should be Emitter. Atleast this script doesn't work this way. 

'''VitalOverdose''': I cant see anything about replication does this work online?

'''Guru:'''  I have a major problem!!! The tutorial says click on the breaking glass actor under effects, but i don't have &quot;breaking glass&quot; or &quot;exploding wall&quot; under effects. How do i get a breaking glass actor?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1907</id>
      <timestamp>2006-05-30T16:44:37Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial applies to UT2003/2004.

==The Concept==

To make a window that breaks in your map, you need two things. A movable brush that represents the window in its whole state, and an [[Legacy:Emitter|Emitter]] to spawn in for the shattering glass fragments that spill out when the window gets &quot;Broken&quot;.

You will need to understand the basic use of [[Legacy:Mover|Mover]]s, [[Legacy:Trigger|Trigger]]s and [[Legacy:ScriptedTrigger|ScriptedTrigger]]s

==The Mover==

If you don't already have a nice glass material set up, make one now. I suggest reading about [[Legacy:Shader|Shader]]s, using Opacity in your shader, and maybe Specularity if you want it to look really nice.

In 2003/2004 movers may only be made with [[Legacy:Static Mesh|static mesh]]es, so we will use [[Legacy:BSP|BSP]] to create our window to start with. Apply your window texture to a thin additive brush that fits as your window. Right click on the additive brush after you create it, and choose Convert -&gt; To Static Mesh. Enter myLevel as your package, and give it whatever name you wish. Now if you look in the static mesh browser, you should see your window mesh.

Back in the edit, click on the Add Mover button to add your window mesh as a movable brush. Move it into place, and set this as the base with Mover -&gt; Key 0.  Now right click the mover and choose Mover -&gt; Key 1, then move the window somewhere out of view, preferably completely outside the level, right click it again and choose Mover -&gt; Key 0 (Base). The window should snap back into its base position.

We need to set up some properties in our mover to make it dissapear from view when shot. So open the properties window for the mover.

We will change:

* '''Object -&gt; InitialState''' to '''TriggerOpenTimed'''
* '''Mover -&gt; MoveTime''' to '''0'''
* '''Mover -&gt; StayOpenTime''' to however long you want your window to stay broken before respawning. This value is in seconds.
* '''Mover -&gt; bDamageTriggered''' to '''True'''
* '''Mover -&gt; DamageThreshold''' to '''1'''
* '''Display -&gt; bShadowCast''' to '''False''' or else the window will cast a shadow, and look bad when it breaks.

Now hopefully we have a pane of glass that when shot, moves (In 0 seconds) off the map, giving the illusion that it has been destroyed.

But now we need shattering fragments of glass to complete the illusion.

====The Special Effects====

This section is a compilation of several different resources on creating breaking glass.  Many of them had 90% of the information necessary but none had 100%.  So everyone who made a breaking glass tut, your stuff is used in here, thanks, you rock.

The falling shards of glass require you to set up an emitter to produce the shards, and a second custom actor class to spawn them.  First: the emitter:

Select &quot;Emitter&quot; from the actor classes (or Network Emitter&quot; to make it playable online), and place it in your level.  There are certain things that must be set up correctly for the breaking glass to spawn the way you want it to:

* Advanced -&gt; bDirectional = True.  This is necessary to align the shards with the window.
* Advanced -&gt; bNoDelete = '''FALSE'''.  This is required for the emitter to be spawned when called by the &quot;spawner&quot; actor.
* Emitter -&gt;
** Acceleration -&gt; Acceleration - Z = -950.  This simulates normal gravity in allowing the shards to fall.
** Collision -&gt; DampingFactorRange - X Max/Min = .9 / .8  Y Max/Min = .5  Z Max/Min = .3 / .2  (''It's important to note that in 2004 range properties windows, Max is '''first''', then Min.'', even though they are displayed as min/max at the top of the listing.)
** Collision -&gt; UseCollision = True.  Else your shards will fall through the floor and keep going.  o_O
** General -&gt; MaxParticles = ~2000.  This is variable depending on the size of your window and of yuur shards.  Once you get more than 5000 or so particles at once, it starts to drag down your average PC, so if your level has 7 breakable windows, don't give them 4000 particles each.  If necessary, spawn a fewer number of larger shards to save CPU cycles.
** Local -&gt; RespawnDeadParticles = False.  You want a broken window, not a glass fountain.
** Location -&gt; StartLocationRange -&gt; Y Max/Min = +/- half the width of your window.  Example, if your window is 512UU wide, Y range is 256 / -256.  Same for Z range, Max/Min = +/- half the height of your window.
** '''Rotation -&gt; UseRotationFrom = PTRS_Actor.'''  This is critical if you wish to have more than one breaking glass in your level, from different angles.
** Spawning -&gt; AutomaticInitialSpawning = False.  It is going to be triggered.
** Spawning -&gt; InitialParticlesPerSecond = 50000.  This releases all particles in a fraction of a second.
** Spawning -&gt; ParticlesPerSecond = 0.  Again, not a fountain.
** Texture -&gt; DrawStyle = PTDS_Transluscent
** Texture -&gt; Texture - Select the shard texture from your texture browser window, then return here and click &quot;Use&quot; to insert it into your texture line.
** Texture -&gt; TextureUSubdivisions &amp; TextureVSubdivisions-&gt; Divide your texture up by shards. For example, if your texture is two shards wide by two shards high, your U and V subdivions are 2 each.
** Time -&gt; LifetimeRange = Set this to whatever.  If your window respawns, set it to no more than the &quot;Open Time&quot; of your window mover.  Else, set it to whatever you wish, 100000 to stay forever, but remember that particles eat up resources as long as they remain in your level.
** Velocity -&gt; StartVelocityRange - X Max/Min = 200 / -200.  Y Max/Min = 100 / -100

At this point, the effect of the emitter should be visible in any 3d views you have open.  You can use this to tweak the settings of your emitter to get the look you want.

Once you've created your emitter, align it with your window, and use rotation to point the directional arrow in the desired direction, I recommend an angle somewhat downward and away from the window, to make sure your axis rotation is set up properly.

Now, its time to set it up to be spawned when someone shoots your window.  Leave your emitter properties window open for now.

Go back to your Actor browser window, right-click on Emitter, and click New to create a new custom subclass of Emitter.&lt;br /&gt;In the creation window, change MyPackage to MyLevel (this is a must), set a group if you wish, and set the name however you wish.  For reference, I will use BreakingGlassEmitter.

An UnrealScript window will pop open.  You can click &quot;Compile Changed&quot; now if you wish, or later when we create the spawner.  Either way, close this window.

Now expand the Emitters section and right-click on BreakingGlassEmitter.  If it is not visible in your window, simply uncheck the &quot;Placeable Only&quot; box and it will appear.  Click on Default Properties, and a properties window will appear similar to the one for your emitter.  Open up the Emitters section of your BreakingGlassEmitter, and click the Add button.  Now go to the Emitters section of the properties window of your emitter, and copy the full name from the Emitters -&gt; 0 field, &quot;SpriteEmitter'myLevel.SpriteEmitter0&quot; or something similar.  Paste it into the corresponding field in your BreakingGlassEmitter and hit Enter.  All the properties of your emitter will be copied into this actor subclass.

Now change a few settings:
* Advanced -&gt; bDirectional = True
* Advanced -&gt; bNoDelete = FALSE

Now close all these properties windows and delete your template emitter, it is no longer needed.

Go back to your Actors browser window, right click on Emitter, and click New to create your second custom subclass.  Package is still myLevel, Group is completely up to you, Name is whatever, we will use BreakingGlassSpawner for reference.

When the UnrealScript window pops up, type or copy / paste this into the script:

&lt;UScript&gt;

class BreakingGlassSpawner extends Actor
     placeable;

event Trigger(Actor Other, Pawn EventInstigator)

{Spawn(class'myLevel.BreakingGlassEmitter',,,Self.Location,Self.Rotation);}
&lt;/UScript&gt;

Now compile changed scripts and close your window.  In the Actor browser, you should be able to see both your custom subclasses, BreakingGlassEmitter and BreakingGlassSpawner.  Right-click on BreakingGlassSpawner, click Default Properties, and check the following settings:
*Advanced -&gt; bDirectional = True
*'''Advanced -&gt; bNoDelete = True''' (this is where you must do this)

Now Add your BreakingGlassSpawner actor to the level, and align it with the window where you had placed the emitter previously.  Set the Event -&gt; Event of your window mover to something like Window1 or BreakGlass or whatever, then set the Event -&gt; Tag of your BreakingGlassSpawner to match.  Save, rebuild, save, give it a go!

''(Note: some of the steps taken here are very likely redundant, for example, setting the directional to True for the Emitter AND BOTH actor subclasses, if someone can verify that this will still function with certain steps excluded, feel free to remove them.)''

----

Now the UDN page gives a very vague explanation of creating an actor to spawn this emitter. I followed more of Robo's excellent instructions and instead used a [[Legacy:ScriptedTrigger|ScriptedTrigger]] to accomplish this.

----

The UDN says to make a spawner class but I used a ScriptedTrigger for spawning my emitters. The advantages of using a ScriptedTrigger are that you can spawn your emitter class at the location of ANY ScriptedTrigger without having to have location and rotation data for the emitter class. You can also add a breaking glass sound effect to play within the ScriptedTrigger.

# Add your glass window mover to your map. For its key1, move it away out of the map so it will be hidden when it's shot.

# Expand the &quot;MoverEvents&quot; section and set the following values..

OpeningEvent = breakglass1

# Expand the &quot;Object&quot; section and set its InitialState to &quot;TriggerOpenTimed&quot;.

# Add a ScriptedTrigger to your map and move it to be in the same position as your mover. Also rotate it so it's facing the right way for when your glass breaks.

# Open the ScriptedTriggers properties, expand its Events section, and set its tag to &quot;breakglass1&quot;.

# Now for the meat. Expand its AIScript&quot; section...

* Add a new event of Action_WAITFOREVENT type, and in its ExternalEvent = breakglass1
* Add a new event of Action_SpawnActor and select your emitter class as the actor to spawn.
* Add a new event of type Action_PLAYSOUND. Set its sound to be a breaking glass sound. We are using this method because it gives you better control over the sound than the mover does.
* Add a new event of type Action_GOTOACTION. Leave its setting at 0

Ok that should do it. Rebuild your map and test it out. When you shoot the mover it should immediatly move out of view, the breaking glass emitter will be spawned, showering broken glass from where the ScriptedTrigger is, and play a breaking glass noise.

This method should work well and it has the added bonus that you can add more breaking glass movers and ScriptedTriggers to have a whole glasshouse of breakable glass windows. Even better they respawn after the time you set in your movers &quot;StayOpenTime' value.

Hopefully that helps you out 

----

It certainly helped me out, and as any good mapper should, im adding what ive learned to the wiki :)

'''LionsPhil:''' This is neat, but if a player is standing on the glass (e.g. because you want other players to be able to shoot that player's footing away &amp;gt;&lt;nowiki&gt;=)=&lt;/nowiki&gt; ), it will fling them in the direction of the mover's 'broken' position. Is there really no generic &quot;breakable&quot; smesh-based actor (think Half-Life 1's brush-based [http://collective.valve-erc.com/index.php?ent=func_breakable func_breakable], or [[Legacy:DestroyableObjective SM|DestroyableObjective SM]] without the objective ties) in UT?

'''Foxpaw:''' I believe destroyable [[Legacy:Decoration|Decoration]]s behave in this manner. If not you could easily code such an actor.

'''Bonehed316:''' I've got some code for breakable objects which...I could distribute.  It doesnt use the old mover hack, but actually a StaticMeshActor which is destroyed (or possibly hidden/collisions disabled).  Maybe I'll clean it up for distribution.  I used to host a breakable glass script which worked with the mover method, but that has long since been lost.

'''Messiah:''' It says in the script extends Actor, but this should be Emitter. Atleast this script doesn't work this way. 

'''VitalOverdose''': I cant see anything about replication does this work online?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1908</id>
      <timestamp>2007-08-08T14:26:45Z</timestamp>
      <contributor>
        <ip>Dinoboy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial applies to UT2003/2004.

==The Concept==

To make a window that breaks in your map, you need two things. A movable brush that represents the window in its whole state, and an [[Legacy:Emitter|Emitter]] to spawn in for the shattering glass fragments that spill out when the window gets &quot;Broken&quot;.

You will need to understand the basic use of [[Legacy:Mover|Mover]]s, [[Legacy:Trigger|Trigger]]s and [[Legacy:ScriptedTrigger|ScriptedTrigger]]s

==The Mover==

If you don't already have a nice glass material set up, make one now. I suggest reading about [[Legacy:Shader|Shader]]s, using Opacity in your shader, and maybe Specularity if you want it to look really nice.

In 2003/2004 movers may only be made with [[Legacy:Static Mesh|static mesh]]es, so we will use [[Legacy:BSP|BSP]] to create our window to start with. Apply your window texture to a thin additive brush that fits as your window. Right click on the additive brush after you create it, and choose Convert -&gt; To Static Mesh. Enter myLevel as your package, and give it whatever name you wish. Now if you look in the static mesh browser, you should see your window mesh.

Back in the edit, click on the Add Mover button to add your window mesh as a movable brush. Move it into place, and set this as the base with Mover -&gt; Key 0.  Now right click the mover and choose Mover -&gt; Key 1, then move the window somewhere out of view, preferably completely outside the level, right click it again and choose Mover -&gt; Key 0 (Base). The window should snap back into its base position.

We need to set up some properties in our mover to make it dissapear from view when shot. So open the properties window for the mover.

We will change:

* '''Object -&gt; InitialState''' to '''TriggerOpenTimed'''
* '''Mover -&gt; MoveTime''' to '''0'''
* '''Mover -&gt; StayOpenTime''' to however long you want your window to stay broken before respawning. This value is in seconds.
* '''Mover -&gt; bDamageTriggered''' to '''True'''
* '''Mover -&gt; DamageThreshold''' to '''1'''
* '''Display -&gt; bShadowCast''' to '''False''' or else the window will cast a shadow, and look bad when it breaks.

Now hopefully we have a pane of glass that when shot, moves (In 0 seconds) off the map, giving the illusion that it has been destroyed.

But now we need shattering fragments of glass to complete the illusion.

====The Special Effects====

This section is a compilation of several different resources on creating breaking glass.  Many of them had 90% of the information necessary but none had 100%.  So everyone who made a breaking glass tut, your stuff is used in here, thanks, you rock.

The falling shards of glass require you to set up an emitter to produce the shards, and a second custom actor class to spawn them.  First: the emitter:

Select &quot;Emitter&quot; from the actor classes (or Network Emitter&quot; to make it playable online), and place it in your level.  There are certain things that must be set up correctly for the breaking glass to spawn the way you want it to:

* Advanced -&gt; bDirectional = True.  This is necessary to align the shards with the window.
* Advanced -&gt; bNoDelete = '''FALSE'''.  This is required for the emitter to be spawned when called by the &quot;spawner&quot; actor.
* Emitter -&gt;
** Acceleration -&gt; Acceleration - Z = -950.  This simulates normal gravity in allowing the shards to fall.
** Collision -&gt; DampingFactorRange - X Max/Min = .9 / .8  Y Max/Min = .5  Z Max/Min = .3 / .2  (''It's important to note that in 2004 range properties windows, Max is '''first''', then Min.'', even though they are displayed as min/max at the top of the listing.)
** Collision -&gt; UseCollision = True.  Else your shards will fall through the floor and keep going.  o_O
** General -&gt; MaxParticles = ~2000.  This is variable depending on the size of your window and of yuur shards.  Once you get more than 5000 or so particles at once, it starts to drag down your average PC, so if your level has 7 breakable windows, don't give them 4000 particles each.  If necessary, spawn a fewer number of larger shards to save CPU cycles.
** Local -&gt; RespawnDeadParticles = False.  You want a broken window, not a glass fountain.
** Location -&gt; StartLocationRange -&gt; Y Max/Min = +/- half the width of your window.  Example, if your window is 512UU wide, Y range is 256 / -256.  Same for Z range, Max/Min = +/- half the height of your window.
** '''Rotation -&gt; UseRotationFrom = PTRS_Actor.'''  This is critical if you wish to have more than one breaking glass in your level, from different angles.
** Spawning -&gt; AutomaticInitialSpawning = False.  It is going to be triggered.
** Spawning -&gt; InitialParticlesPerSecond = 50000.  This releases all particles in a fraction of a second.
** Spawning -&gt; ParticlesPerSecond = 0.  Again, not a fountain.
** Texture -&gt; DrawStyle = PTDS_Transluscent
** Texture -&gt; Texture - Select the shard texture from your texture browser window, then return here and click &quot;Use&quot; to insert it into your texture line.
** Texture -&gt; TextureUSubdivisions &amp; TextureVSubdivisions-&gt; Divide your texture up by shards. For example, if your texture is two shards wide by two shards high, your U and V subdivions are 2 each.
** Time -&gt; LifetimeRange = Set this to whatever.  If your window respawns, set it to no more than the &quot;Open Time&quot; of your window mover.  Else, set it to whatever you wish, 100000 to stay forever, but remember that particles eat up resources as long as they remain in your level.
** Velocity -&gt; StartVelocityRange - X Max/Min = 200 / -200.  Y Max/Min = 100 / -100

At this point, the effect of the emitter should be visible in any 3d views you have open.  You can use this to tweak the settings of your emitter to get the look you want.

Once you've created your emitter, align it with your window, and use rotation to point the directional arrow in the desired direction, I recommend an angle somewhat downward and away from the window, to make sure your axis rotation is set up properly.

Now, its time to set it up to be spawned when someone shoots your window.  Leave your emitter properties window open for now.

Go back to your Actor browser window, right-click on Emitter, and click New to create a new custom subclass of Emitter.&lt;br /&gt;In the creation window, change MyPackage to MyLevel (this is a must), set a group if you wish, and set the name however you wish.  For reference, I will use BreakingGlassEmitter.

An UnrealScript window will pop open.  You can click &quot;Compile Changed&quot; now if you wish, or later when we create the spawner.  Either way, close this window.

Now expand the Emitters section and right-click on BreakingGlassEmitter.  If it is not visible in your window, simply uncheck the &quot;Placeable Only&quot; box and it will appear.  Click on Default Properties, and a properties window will appear similar to the one for your emitter.  Open up the Emitters section of your BreakingGlassEmitter, and click the Add button.  Now go to the Emitters section of the properties window of your emitter, and copy the full name from the Emitters -&gt; 0 field, &quot;SpriteEmitter'myLevel.SpriteEmitter0&quot; or something similar.  Paste it into the corresponding field in your BreakingGlassEmitter and hit Enter.  All the properties of your emitter will be copied into this actor subclass.

Now change a few settings:
* Advanced -&gt; bDirectional = True
* Advanced -&gt; bNoDelete = FALSE

Now close all these properties windows and delete your template emitter, it is no longer needed.

Go back to your Actors browser window, right click on Emitter, and click New to create your second custom subclass.  Package is still myLevel, Group is completely up to you, Name is whatever, we will use BreakingGlassSpawner for reference.

When the UnrealScript window pops up, type or copy / paste this into the script:

&lt;UScript&gt;

class BreakingGlassSpawner extends Actor
     placeable;

event Trigger(Actor Other, Pawn EventInstigator)

{Spawn(class'myLevel.BreakingGlassEmitter',,,Self.Location,Self.Rotation);}
&lt;/UScript&gt;

Now compile changed scripts and close your window.  In the Actor browser, you should be able to see both your custom subclasses, BreakingGlassEmitter and BreakingGlassSpawner.  Right-click on BreakingGlassSpawner, click Default Properties, and check the following settings:
*Advanced -&gt; bDirectional = True
*'''Advanced -&gt; bNoDelete = True''' (this is where you must do this)

Now Add your BreakingGlassSpawner actor to the level, and align it with the window where you had placed the emitter previously.  Set the Event -&gt; Event of your window mover to something like Window1 or BreakGlass or whatever, then set the Event -&gt; Tag of your BreakingGlassSpawner to match.  Save, rebuild, save, give it a go!

''(Note: some of the steps taken here are very likely redundant, for example, setting the directional to True for the Emitter AND BOTH actor subclasses, if someone can verify that this will still function with certain steps excluded, feel free to remove them.)''

----

Now the UDN page gives a very vague explanation of creating an actor to spawn this emitter. I followed more of Robo's excellent instructions and instead used a [[Legacy:ScriptedTrigger|ScriptedTrigger]] to accomplish this.

----

The UDN says to make a spawner class but I used a ScriptedTrigger for spawning my emitters. The advantages of using a ScriptedTrigger are that you can spawn your emitter class at the location of ANY ScriptedTrigger without having to have location and rotation data for the emitter class. You can also add a breaking glass sound effect to play within the ScriptedTrigger.

# Add your glass window mover to your map. For its key1, move it away out of the map so it will be hidden when it's shot.

# Expand the &quot;MoverEvents&quot; section and set the following values..

OpeningEvent = breakglass1

# Expand the &quot;Object&quot; section and set its InitialState to &quot;TriggerOpenTimed&quot;.

# Add a ScriptedTrigger to your map and move it to be in the same position as your mover. Also rotate it so it's facing the right way for when your glass breaks.

# Open the ScriptedTriggers properties, expand its Events section, and set its tag to &quot;breakglass1&quot;.

# Now for the meat. Expand its AIScript&quot; section...

* Add a new event of Action_WAITFOREVENT type, and in its ExternalEvent = breakglass1
* Add a new event of Action_SpawnActor and select your emitter class as the actor to spawn.
* Add a new event of type Action_PLAYSOUND. Set its sound to be a breaking glass sound. We are using this method because it gives you better control over the sound than the mover does.
* Add a new event of type Action_GOTOACTION. Leave its setting at 0

Ok that should do it. Rebuild your map and test it out. When you shoot the mover it should immediatly move out of view, the breaking glass emitter will be spawned, showering broken glass from where the ScriptedTrigger is, and play a breaking glass noise.

This method should work well and it has the added bonus that you can add more breaking glass movers and ScriptedTriggers to have a whole glasshouse of breakable glass windows. Even better they respawn after the time you set in your movers &quot;StayOpenTime' value.

Hopefully that helps you out 

----

It certainly helped me out, and as any good mapper should, im adding what ive learned to the wiki :)

'''LionsPhil:''' This is neat, but if a player is standing on the glass (e.g. because you want other players to be able to shoot that player's footing away &amp;gt;&lt;nowiki&gt;=)=&lt;/nowiki&gt; ), it will fling them in the direction of the mover's 'broken' position. Is there really no generic &quot;breakable&quot; smesh-based actor (think Half-Life 1's brush-based [http://collective.valve-erc.com/index.php?ent=func_breakable func_breakable], or [[Legacy:DestroyableObjective SM|DestroyableObjective SM]] without the objective ties) in UT?

'''Foxpaw:''' I believe destroyable [[Legacy:Decoration|Decoration]]s behave in this manner. If not you could easily code such an actor.

'''Bonehed316:''' I've got some code for breakable objects which...I could distribute.  It doesnt use the old mover hack, but actually a StaticMeshActor which is destroyed (or possibly hidden/collisions disabled).  Maybe I'll clean it up for distribution.  I used to host a breakable glass script which worked with the mover method, but that has long since been lost.

'''Messiah:''' It says in the script extends Actor, but this should be Emitter. Atleast this script doesn't work this way. 

'''VitalOverdose''': I cant see anything about replication does this work online?

'''Guru'''  I have a major problem!!! The tutorial says click on the breaking glass actor under effects, but i don't have &quot;breaking glass&quot; or &quot;exploding wall&quot; under effects. How do i get a breaking glass actor?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BreakingGlass</title>
    <id>531</id>
    <revision>
      <id>1651</id>
      <timestamp>2006-01-01T16:30:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>redirecting ExplodingWall</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:ExplodingWall|ExplodingWall]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bright</title>
    <id>591</id>
    <revision>
      <id>1796</id>
      <timestamp>2004-03-13T09:50:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It's a texture utility [[Legacy:Application|application]] made by Epic. See [[Legacy:Color Blending|Color Blending]] for more on using it.

http://udn.epicgames.com/pub/Content/TextureSpecifications/bright181.zip

==Related Topics==
* [[Legacy:Graphics Application|Graphics Application]]

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1797</id>
      <timestamp>2003-03-03T17:10:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It's a texture utility [[Legacy:Application|application]]

http://udn.epicgames.com/pub/Content/TextureSpecifications/bright181.zip

See also [[Legacy:Graphics Application|Graphics Application]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brimstone And Sulphur Content Pack Documentation And Links</title>
    <id>668</id>
    <revision>
      <id>1963</id>
      <timestamp>2008-02-23T19:47:58Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Items===

Item #01: [[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]] - Shows how I made a Steam Vent, with information on all aspects of its design, including '''Textures''' (made with Texture Maker and Photoshop), '''Static Meshes''' (Made with 3DS Max), '''Materials''' (Made with UTEd4), and '''Particles''' (Made with UTEd4 - Cascade Component).''Original Author: AcidSphinx''

Item #02: [[Legacy:BaSCP Hot Water|BaSCP Hot Water]] - Shows how I made a Water Volume, with information on all aspects of its design, including '''Textures''' (made with Texture Maker and Photoshop), '''Materials''' (Made with UTEd4), and '''Particles''' (Made with UTEd4 - Cascade Componet), as well as information on various editor related features such as '''Height Fogs''', and '''Post Process Volumes'''.''Original Author: AcidSphinx''

===File Links===

[http://files.filefront.com/DM+BaSCP+Item017z/;9689293;/fileinfo.html DM-BaSCP-Item01.7z] Item #01 of the tutorails asociated file, hosted on FileFront.[[Legacy:BaSCP-Item01 Details|BaSCP-Item01 Details]]

'''Size: 14.76 MB (15,480,938 Bytes)'''

===Navigation===

====Back====

[[Legacy:Acidsphinx'S Journal Into UT3|Acidsphinx's Journal Into UT3]]</text>
    </revision>
    <revision>
      <id>1964</id>
      <timestamp>2008-02-23T19:32:31Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Items===

Item #01: [[Legacy:BaSCP Steam Vents|BaSCP Steam Vents]] - Shows how I made a Steam Vent, with information on all aspects of its design, including '''Textures''' (made with Texture Maker and Photoshop), '''Static Meshes''' (Made with 3DS Max), '''Materials''' (Made with UTEd4), and '''Particles''' (Made with UTEd4 - Cascade Component).''Original Author: AcidSphinx''

Item #02: [[Legacy:BaSCP Hot Water|BaSCP Hot Water]] - Shows how I made a Water Volume, with information on all aspects of its design, including '''Textures''' (made with Texture Maker and Photoshop), '''Materials''' (Made with UTEd4), and '''Particles''' (Made with UTEd4 - Cascade Componet), as well as information on various editor related features such as '''Height Fogs''', and '''Post Process Volumes'''.''Original Author: AcidSphinx''

===File Links===

[http://files.filefront.com/DM+BaSCP+Item017z/;9689293;/fileinfo.html DM-BaSCP-Item01.7z] Item #01 of the tutorails asociated file, hosted on FileFront.[[Legacy:BaSCP-Item01 Details|BaSCP-Item01 Details]]

'''Size: 14.76 MB (15,480,938 Bytes)'''

===Back===

[[Legacy:Acidsphinx'S Journal Into UT3|Acidsphinx's Journal Into UT3]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BroadcastHandler</title>
    <id>28264</id>
    <revision>
      <id>39921</id>
      <timestamp>2009-11-14T18:03:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush</title>
    <id>532</id>
    <revision>
      <id>1652</id>
      <timestamp>2006-04-07T07:59:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Brush (Package: Engine)}}
:

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Brush (Package: Engine)}}

'''Brushes''' are wireframe models, made directly within UnrealEd, which are used by the  [[Legacy:Build|build]] process to compile the [[Legacy:BSP|BSP]] world. In general, brushes are simple shapes, such as cubes and cylinders. The [[Legacy:Unreal Engine|Unreal Engine]] differs from most other 3D engines in that its brushes combine with [[Legacy:CSG|CSG]]: they can be additive or subtractive, removing or adding matter to the world.

==Default brush colours ==

The brush wireframes are coloured according to the brush [[Legacy:Solidity|solidity]]. These global colours can be changed under [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]].
* Active : red, hence the name ''[[Legacy:Red Builder Brush|red builder brush]]''
* Subtractive: yellow
* Additive: blue
* Semisolid: pink
* Non-Solid: green
* Zone Portal: yellow-green

==Properties ==
; bColored &amp; BrushColor : set the flag to true and choose your own colours for an individual brush...
; CsgOper : sets the brush CSG type. This is equivalent to doing '''[[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; CSG''' to change between additive and subtractive CSG types.
;*CSG_Active
;*CSG_Add
;*CSG_Subtract
;*CSG_Intersect
;*CSG_Deintersect
; MainScale &amp; PostScale : see [[Legacy:Brush Scaling|brush scaling]] and [[Legacy:Brush Transformation|brush transformation]].
;*Scale &amp;ndash; a summary readout of sub items
;** X, Y, Z
;*SheerAxis
;* Sheer None, Sheer ZX, etc
;* SheerRate
; PolyFlags : The [[Legacy:PolyFlags|PolyFlags]] property overrides the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] for all this brush's surfaces. This is set on brushes made with the [[Legacy:Add Special|Add Special]] command.

==Known subclasses ==
* [[Legacy:Mover (UT)|Mover (UT)]] &amp;ndash; in [[Legacy:UT|UT]] and similar versions of the engine, movers are a special type of brush. In [[Legacy:UT2003|UT2003]] and later, movers are [[Legacy:Static Mesh|static mesh]]es.

==Related Topics ==

Making brushes
* [[Legacy:Red Builder Brush|Red Builder Brush]] has a complete list
* [[Legacy:Brushbuilders|Brushbuilders]]

Working with brushes:
* [[Legacy:Brush Order|Brush Order]]
* [[Legacy:Brush Context Menu|Brush Context Menu]]
* [[Legacy:Brush Duplication|Brush Duplication]]
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]
* Brush [[Legacy:Intersect|Intersect]]

Brush [[Legacy:Toolbox|toolbox]] modes
* [[Legacy:Brush Clipping|Brush Clipping]]
* [[Legacy:Brush Scaling|Brush Scaling]]
* [[Legacy:Brush Rotate|Brush Rotate]]

Brush techniques
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Hacking|Brush Hacking]] (for the l33t...)
* [[Legacy:Brush Transformation|Brush Transformation]]

Types of Brush
* Brush [[Legacy:Solidity|Solidity]]: [[Legacy:Solid|Solid]], [[Legacy:Semisolid|Semisolid]], [[Legacy:Nonsolid|Nonsolid]]
* [[Legacy:Hardware Brush|Hardware Brush]]

General
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Design|Map Design]]

==Technical ==

===weird brush mojo ===

(Tarquin writes...)

Just been playing around trying to see if it's possible to pre-merge polys in the building process... it's not, but if anyone from Epic reads this, please nudge Warren, I think it would be a good idea.

Anyway... I was copying brushes and pasting to Textpad to see how merged polys are stored internally. (yes, it's another of those &quot;gather round the fireside with tarquin&quot; moments, as he tells an interminable story where two lines would suffice...)

Two kinds of behaviour spotted. Some brushes look like this:
 Begin Brush Name=Model4
 Begin PolyList
  ... blah
 Brush=Model'MyLevel.Model4'

and some skip the whole &quot;Begin brush&quot; thing, and just have:
 Brush=Model'MyLevel.Model4'

So... what's happening here? Does UnrealEd secretly keep models of brushes that are the same? I made a second cube after I'd made 2D-ed sheets, and this one was fully defined.

My initial hypothesis is this:
* brushes made with the same incarnation of the RBB are only stored once as a model. any beyond the first &quot;stamp&quot; are stored with a reference to the model of the first.
* this would seem to imply (unless there's a later optimization phase) that there's a way to keep map filesize down here.

: &lt;i&gt;So what happens if you intersect a brush after it's been made - does it then reference the model the brush ws built from? &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]&lt;/i&gt;.

:&lt;i&gt;I think it's as follows:  First off, UnrealEd &lt;b&gt;always&lt;/b&gt; keeps the brush geometry in a Model object that's referenced from the Brush object (at least that is confirmed).  I'm guessing that UnrealEd fails to copy the Model object to the clipboard due to some confusion in some cases, nothing more.&lt;br /&gt;&lt;br /&gt;In any case, you can do some pretty interesting things by manually editing what has been copied to the clipboard.  If you, for instance, give two brushes the same model reference, vertex editing one instance of that brush will automagically vertex-edit all other instances as well (and real-time).  Since I guess that unused model objects won't be saved along with the map, I suppose that can indeed serve to save some file space (not too much though since the rendered, cut world polygons are stored separately) and probably even as a comfortable editing tool.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

* Link: [[Legacy:Brush Hacking|Brush Hacking]] ;-)

[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]
[[Category:Legacy Class (RTNP)|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1653</id>
      <timestamp>2004-10-27T14:56:46Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Brush (Package: Engine)}}
:

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Brush (Package: Engine)}}

'''Brushes''' are wireframe models, made directly within UnrealEd, which are used by the  [[Legacy:Build|build]] process to compile the [[Legacy:BSP|BSP]] world. In general, brushes are simple shapes, such as cubes and cylinders. The [[Legacy:Unreal Engine|Unreal Engine]] differs from most other 3D engines in that its brushes combine with [[Legacy:CSG|CSG]]: they can be additive or subtractive, removing or adding matter to the world.

==Default brush colours ==

The brush wireframes are coloured according to the brush [[Legacy:Solidity|solidity]]. These global colours can be changed under [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]].
* Active : red, hence the name ''[[Legacy:Red Builder Brush|red builder brush]]''
* Subtractive: yellow
* Additive: blue
* Semisolid: pink
* Non-Solid: green
* Zone Portal: yellow-green

==Properties ==
; bColored &amp; BrushColor : set the flag to true and choose your own colours for an individual brush...
; CsgOper : sets the brush CSG type. This is equivalent to doing '''[[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; CSG''' to change between additive and subtractive CSG types.
;*CSG_Active
;*CSG_Add
;*CSG_Subtract
;*CSG_Intersect
;*CSG_Deintersect
; MainScale &amp; PostScale : see [[Legacy:Brush Scaling|brush scaling]] and [[Legacy:Brush Transformation|brush transformation]].
;*Scale &amp;ndash; a summary readout of sub items
;** X, Y, Z
;*SheerAxis
;* Sheer None, Sheer ZX, etc
;* SheerRate
; PolyFlags : The [[Legacy:PolyFlags|PolyFlags]] property overrides the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] for all this brush's surfaces. This is set on brushes made with the [[Legacy:Add Special|Add Special]] command.

==Known subclasses ==
* [[Legacy:Mover (UT)|Mover (UT)]] &amp;ndash; in [[Legacy:UT|UT]] and similar versions of the engine, movers are a special type of brush. In [[Legacy:UT2003|UT2003]] and later, movers are [[Legacy:Static Mesh|static mesh]]es.

==Related Topics ==

Making brushes
* [[Legacy:Red Builder Brush|Red Builder Brush]] has a complete list
* [[Legacy:Brushbuilders|Brushbuilders]]

Working with brushes:
* [[Legacy:Brush Order|Brush Order]]
* [[Legacy:Brush Context Menu|Brush Context Menu]]
* [[Legacy:Brush Duplication|Brush Duplication]]
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]
* Brush [[Legacy:Intersect|Intersect]]

Brush [[Legacy:Toolbox|toolbox]] modes
* [[Legacy:Brush Clipping|Brush Clipping]]
* [[Legacy:Brush Scaling|Brush Scaling]]
* [[Legacy:Brush Rotate|Brush Rotate]]

Brush techniques
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Hacking|Brush Hacking]] (for the l33t...)
* [[Legacy:Brush Transformation|Brush Transformation]]

Types of Brush
* Brush [[Legacy:Solidity|Solidity]]: [[Legacy:Solid|Solid]], [[Legacy:Semisolid|Semisolid]], [[Legacy:Nonsolid|Nonsolid]]
* [[Legacy:Hardware Brush|Hardware Brush]]

General
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Design|Map Design]]

==Technical ==

===weird brush mojo ===

(Tarquin writes...)

Just been playing around trying to see if it's possible to pre-merge polys in the building process... it's not, but if anyone from Epic reads this, please nudge Warren, I think it would be a good idea.

Anyway... I was copying brushes and pasting to Textpad to see how merged polys are stored internally. (yes, it's another of those &quot;gather round the fireside with tarquin&quot; moments, as he tells an interminable story where two lines would suffice...)

Two kinds of behaviour spotted. Some brushes look like this:
 Begin Brush Name=Model4
 Begin PolyList
  ... blah
 Brush=Model'MyLevel.Model4'

and some skip the whole &quot;Begin brush&quot; thing, and just have:
 Brush=Model'MyLevel.Model4'

So... what's happening here? Does UnrealEd secretly keep models of brushes that are the same? I made a second cube after I'd made 2D-ed sheets, and this one was fully defined.

My initial hypothesis is this:
* brushes made with the same incarnation of the RBB are only stored once as a model. any beyond the first &quot;stamp&quot; are stored with a reference to the model of the first.
* this would seem to imply (unless there's a later optimization phase) that there's a way to keep map filesize down here.

: &lt;i&gt;So what happens if you intersect a brush after it's been made - does it then reference the model the brush ws built from? &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]&lt;/i&gt;.

:&lt;i&gt;I think it's as follows:  First off, UnrealEd &lt;b&gt;always&lt;/b&gt; keeps the brush geometry in a Model object that's referenced from the Brush object (at least that is confirmed).  I'm guessing that UnrealEd fails to copy the Model object to the clipboard due to some confusion in some cases, nothing more.&lt;br /&gt;&lt;br /&gt;In any case, you can do some pretty interesting things by manually editing what has been copied to the clipboard.  If you, for instance, give two brushes the same model reference, vertex editing one instance of that brush will automagically vertex-edit all other instances as well (and real-time).  Since I guess that unused model objects won't be saved along with the map, I suppose that can indeed serve to save some file space (not too much though since the rendered, cut world polygons are stored separately) and probably even as a comfortable editing tool.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

* Link: [[Legacy:Brush Hacking|Brush Hacking]] ;-)

----

[[:Category:Legacy Class (UT)]]

[[:Category:Legacy Class (UT2003)]]

''(actually any Unreal engine game)''
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1654</id>
      <timestamp>2006-04-06T21:06:08Z</timestamp>
      <contributor>
        <ip>Softbank220001036197.bbtec.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Brush (Package: Engine)}}
:

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Brush (Package: Engine)}}

'''Brushes''' are wireframe models, made directly within UnrealEd, which are used by the  [[Legacy:Build|build]] process to compile the [[Legacy:BSP|BSP]] world. In general, brushes are simple shapes, such as cubes and cylinders. The [[Legacy:Unreal Engine|Unreal Engine]] differs from most other 3D engines in that its brushes combine with [[Legacy:CSG|CSG]]: they can be additive or subtractive, removing or adding matter to the world.

==Default brush colours ==

The brush wireframes are coloured according to the brush [[Legacy:Solidity|solidity]]. These global colours can be changed under [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]].
* Active : red, hence the name ''[[Legacy:Red Builder Brush|red builder brush]]''
* Subtractive: yellow
* Additive: blue
* Semisolid: pink
* Non-Solid: green
* Zone Portal: yellow-green

==Properties ==
; bColored &amp; BrushColor : set the flag to true and choose your own colours for an individual brush...
; CsgOper : sets the brush CSG type. This is equivalent to doing '''[[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; CSG''' to change between additive and subtractive CSG types.
;*CSG_Active
;*CSG_Add
;*CSG_Subtract
;*CSG_Intersect
;*CSG_Deintersect
; MainScale &amp; PostScale : see [[Legacy:Brush Scaling|brush scaling]] and [[Legacy:Brush Transformation|brush transformation]].
;*Scale &amp;ndash; a summary readout of sub items
;** X, Y, Z
;*SheerAxis
;* Sheer None, Sheer ZX, etc
;* SheerRate
; PolyFlags : The [[Legacy:PolyFlags|PolyFlags]] property overrides the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] for all this brush's surfaces. This is set on brushes made with the [[Legacy:Add Special|Add Special]] command.

==Known subclasses ==
* [[Legacy:Mover (UT)|Mover (UT)]] &amp;ndash; in [[Legacy:UT|UT]] and similar versions of the engine, movers are a special type of brush. In [[Legacy:UT2003|UT2003]] and later, movers are [[Legacy:Static Mesh|static mesh]]es.

==Related Topics ==

Making brushes
* [[Legacy:Red Builder Brush|Red Builder Brush]] has a complete list
* [[Legacy:Brushbuilders|Brushbuilders]]

Working with brushes:
* [[Legacy:Brush Order|Brush Order]]
* [[Legacy:Brush Context Menu|Brush Context Menu]]
* [[Legacy:Brush Duplication|Brush Duplication]]
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]
* Brush [[Legacy:Intersect|Intersect]]

Brush [[Legacy:Toolbox|toolbox]] modes
* [[Legacy:Brush Clipping|Brush Clipping]]
* [[Legacy:Brush Scaling|Brush Scaling]]
* [[Legacy:Brush Rotate|Brush Rotate]]

Brush techniques
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Hacking|Brush Hacking]] (for the l33t...)
* [[Legacy:Brush Transformation|Brush Transformation]]

Types of Brush
* Brush [[Legacy:Solidity|Solidity]]: [[Legacy:Solid|Solid]], [[Legacy:Semisolid|Semisolid]], [[Legacy:Nonsolid|Nonsolid]]
* [[Legacy:Hardware Brush|Hardware Brush]]

General
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Design|Map Design]]

==Technical ==

===weird brush mojo ===

(Tarquin writes...)

Just been playing around trying to see if it's possible to pre-merge polys in the building process... it's not, but if anyone from Epic reads this, please nudge Warren, I think it would be a good idea.

Anyway... I was copying brushes and pasting to Textpad to see how merged polys are stored internally. (yes, it's another of those &quot;gather round the fireside with tarquin&quot; moments, as he tells an interminable story where two lines would suffice...)

Two kinds of behaviour spotted. Some brushes look like this:
 Begin Brush Name=Model4
 Begin PolyList
  ... blah
 Brush=Model'MyLevel.Model4'

and some skip the whole &quot;Begin brush&quot; thing, and just have:
 Brush=Model'MyLevel.Model4'

So... what's happening here? Does UnrealEd secretly keep models of brushes that are the same? I made a second cube after I'd made 2D-ed sheets, and this one was fully defined.

My initial hypothesis is this:
* brushes made with the same incarnation of the RBB are only stored once as a model. any beyond the first &quot;stamp&quot; are stored with a reference to the model of the first.
* this would seem to imply (unless there's a later optimization phase) that there's a way to keep map filesize down here.

: &lt;i&gt;So what happens if you intersect a brush after it's been made - does it then reference the model the brush ws built from? &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]&lt;/i&gt;.

:&lt;i&gt;I think it's as follows:  First off, UnrealEd &lt;b&gt;always&lt;/b&gt; keeps the brush geometry in a Model object that's referenced from the Brush object (at least that is confirmed).  I'm guessing that UnrealEd fails to copy the Model object to the clipboard due to some confusion in some cases, nothing more.&lt;br /&gt;&lt;br /&gt;In any case, you can do some pretty interesting things by manually editing what has been copied to the clipboard.  If you, for instance, give two brushes the same model reference, vertex editing one instance of that brush will automagically vertex-edit all other instances as well (and real-time).  Since I guess that unused model objects won't be saved along with the map, I suppose that can indeed serve to save some file space (not too much though since the rendered, cut world polygons are stored separately) and probably even as a comfortable editing tool.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

* Link: [[Legacy:Brush Hacking|Brush Hacking]] ;-)

----

[[:Category:Legacy Class (UT)]]

[[:Category:Legacy Class (UT2003)]]

''(actually any Unreal engine game)''

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Clipping</title>
    <id>535</id>
    <revision>
      <id>1661</id>
      <timestamp>2004-04-06T22:22:14Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">[[Image:Legacy_button.mode.clip.gif|left|]]

'''Brush clipping mode''' is a tool for changing the shape of brushes. You can think of it as attacking a brush with a knife or a cheese slicer. It can:
* Clip: Throw away the part of a brush that lies on one side of a plane
* Split: divide a brush into two new brushes along a plane. Note that the [[Legacy:Red Builder Brush|red builder brush]] can't be split.

==Overview ==

The clipping tool is handy for trimming multiple brushes at once, or sometimes slicing up a brush that can't stick out at all. Basically all you do is select the clipping tool, hold Ctrl, and click on two vertices to place the two 'pins'. Then grab the pins and move them wherever you want to create your cutting plane. The side with the little tick (T) on it is the side that gets cut off. You can use the flip button to reverse the tick (uber handy - just get the pins where you want and flip the thingy until its right). The cut button is what you press to actually lop off part of the brush. 

The split button will cut one brush into two separate brushes, this will not work on the builder brush itself, but will work on any other brush already placed in the level. The delete button just gets rid of the pins. 

==Uses ==
* [[Legacy:Making Ramps|making ramps]]
* trimming brushes
* splitting brushes to split surfaces

==Basic 2D clipping ==

The basic steps of using this tool:
# select the brush you want to clip
# select the tool in the [[Legacy:Toolbox|toolbox]]
# CTRL + right-click in an orthogonal viewport to add a pin: you need 2.
# Move the pins as you would normal actors: then red line between them is the clip line. The tick mark on the midpoint points toward the part to discard when clipping.
# Clip or split: the commands are in [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Brush Clip and in the 2nd [[Legacy:Toolbox|toolbox]] group.

==3D clipping ==

3D clipping is for when the part that needs removing does not line up with the top, side, or front views.

====Example ====

[[Image:Legacy_clip3d.jpeg|left|]]

If you built a cube, 256x256x256 units in size, and then placed two clip markers (pins) in the top view, 128 units in from one of the corners. Clipping this brush will result in a cube that is missing one edge - the top and bottom faces both having five sides, with five other vertical faces in between. Two of the original corners (vertices) of the cube will have been cut away. Now lets say you build another cube of the same size, but only want to remove one of the corners. None of the 2D viewports are looking in the correct direction, because the corner needs a cut that is slanted in all three dimensions. You need 3D clipping.

====How to do 3D clipping  ====

To do 3D clipping, add a third clip marker:
* CTRL + Right-Click on one of the 2D viewports as before.
* Move the third clip marker to the desired position.
* Look in the 3D view and make sure the tick mark (called the 'normal') is facing towards the part you want to cut away.
** (If you are splitting the brush to make two brushes, the normal does not matter.)
* Select the brush you want to clip in any viewport.
* Click the cut button.

Note, with 2D clipping, it is important which viewport you use. Clipping is always done by a plane - think of it as a large blade. If you use the top view, the blade will cut straight down on the line connecting the two pins. If you use the side view, the blade cuts sideways. You can do diagonal cuts in 2D, but they will only slope one way - as you look at them in 2D. In 3D, three points are enough to define any plane, and so if you have three pins, UnrealEd performs a 3D clip no matter what view port you are in.

====Example ====

[[Image:Legacy_clip3d2.jpeg|left|]]

To cut one corner from a 256x256x256 cube, add two clip markers like before, then add a third, and place it 128 units DOWNWARDS from the corner. Check their positions in all the views, check the normal is facing the right way, then hack off your corner!

====Uses ====

3D clipping can be used to create complex shapes, and is especially useful for shaving bits off cubes to make boulder shapes and rock formations.

==Troubleshooting ==

If you have problems clipping/cutting a brush:
* Make sure the brush you want to clip is selected.
* If you have recently moved the brush, rebuild geometry before clipping.

* the [[Legacy:Red Builder Brush|red builder brush]] can't be split, only clipped.
* Clipping sometimes either doesnt work at all or clips in the wrong place: this is to do with the brush's current scaling or rotation.
** To solve this, transform the brush permanently by doing '''[[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]'''
* saving the map wipes the clipping points

==Related Topics ==
* Reference for the [[Legacy:Toolbox|Toolbox]] 
* [[Legacy:UnrealEd Interface|UnrealEd interface]]
* [[Legacy:Architecture|Architecture]] topics
* [[Legacy:Making Ramps|Making Ramps]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1662</id>
      <timestamp>2003-05-25T08:49:41Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==Introduction ==

[[Image:Legacy_button.mode.clip.gif|left|]]

Brush clipping mode is a tool for changing the shape of brushes. It can:
* Clip: Throw away the part of a brush that lies on one side of a plane
* Split: divide a brush into two new brushes along a plane. Note that the [[Legacy:Red Builder Brush|red builder brush]] can't be split.

====Brush clipping overview in 5 seconds flat ====

The clipping tool is rarely used, but I find it handy for trimming multiple brushes at once, or sometimes slicing up a brush that can't stick out at all. Basically all you do is select the clipping tool, hold Ctrl, and click on two vertices to place the two 'pins'. Then grab the pins and move them wherever you want to create your cutting plane. The side with the little tick (T) on it is the side that gets cut off (I think anyways... checked:yes). You can use the flip button to reverse the tick (uber handy - just get the pins where you want and flip the thingy until its right). The cut button is what you press to actually lop off part of the brush. And the split button is supposed to turn one brush into two... but I dont remember it working right last time I tried (though it has been a while). Also note that the builder brush can't be split. And the delete button just gets rid of the pins. 

==Uses ==
* making slopes
* trimming brushes
* splitting brushes to split surfaces

==Basic 2D clipping ==

The basic steps of using this tool:
# select the brush you want to clip
# select the tool in the [[Legacy:Toolbox|toolbox]]
# CTRL + right-click in an orthogonal viewport to add a pin: you need 2.
# Move the pins as you would normal actors: then red line between them is the clip line. The tick mark on the midpoint points toward the part to discard when clipping.
# Clip or split: the commands are in [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Brush Clip and in the 2nd [[Legacy:Toolbox|toolbox]] group.

==3D clipping ==

3D clipping is for when the part that needs removing does not line up with the top, side, or front views.

====Example ====

[[Image:Legacy_clip3d.jpeg|left|]]

If you built a cube, 256x256x256 units in size, and then placed two clip markers (pins) in the top view, 128 units in from one of the corners. Clipping this brush will result in a cube that is missing one edge - the top and bottom faces both having five sides, with five other vertical faces in between. Two of the original corners (vertices) of the cube will have been cut away. Now lets say you build another cube of the same size, but only want to remove one of the corners. None of the 2D viewports are looking in the correct direction, because the corner needs a cut that is slanted in all three dimensions. You need 3D clipping.

====How to do 3D clipping  ====

To do 3D clipping, add a third clip marker:
* CTRL + Right-Click on one of the 2D viewports as before.
* Move the third clip marker to the desired position.
* Look in the 3D view and make sure the tick mark (called the 'normal') is facing towards the part you want to cut away.
** (If you are splitting the brush to make two brushes, the normal does not matter.)
* Select the brush you want to clip in any viewport.
* Click the cut button.

Note, with 2D clipping, it is important which viewport you use. Clipping is always done by a plane - think of it as a large blade. If you use the top view, the blade will cut straight down on the line connecting the two pins. If you use the side view, the blade cuts sideways. You can do diagonal cuts in 2D, but they will only slope one way - as you look at them in 2D. In 3D, three points are enough to define any plane, and so if you have three pins, UnrealEd performs a 3D clip no matter what view port you are in.

====Example ====

[[Image:Legacy_clip3d2.jpeg|left|]]

To cut one corner from a 256x256x256 cube, add two clip markers like before, then add a third, and place it 128 units DOWNWARDS from the corner. Check their positions in all the views, check the normal is facing the right way, then hack off your corner!

====Uses ====

3D clipping can be used to create complex shapes, and is especially useful for shaving bits off cubes to make boulder shapes and rock formations.

==Troubleshooting ==

If you have problems clipping/cutting a brush:
* Make sure the brush you want to clip is selected.
* If you have recently moved the brush, rebuild geometry before clipping.

* the [[Legacy:Red Builder Brush|red builder brush]] can't be split, only clipped.
* Clipping sometimes either doesnt work at all or clips in the wrong place: this is to do with the brush's current scaling or rotation.
** To solve this, transform the brush permanently by doing '''[[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]'''
* saving the map wipes the clipping points

==Related Topics ==
* Reference for the [[Legacy:Toolbox|Toolbox]] 
* [[Legacy:UnrealEd Interface|UnrealEd interface]]
* [[Legacy:Architecture|Architecture]] topics

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1663</id>
      <timestamp>2003-12-10T14:28:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.clip.gif|left|]]

'''Brush clipping mode''' is a tool for changing the shape of brushes. You can think of it as attacking a brush with a knife or a cheese slicer. It can:
* Clip: Throw away the part of a brush that lies on one side of a plane
* Split: divide a brush into two new brushes along a plane. Note that the [[Legacy:Red Builder Brush|red builder brush]] can't be split.

==Overview ==

The clipping tool is rarely used, but it is handy for trimming multiple brushes at once, or sometimes slicing up a brush that can't stick out at all. Basically all you do is select the clipping tool, hold Ctrl, and click on two vertices to place the two 'pins'. Then grab the pins and move them wherever you want to create your cutting plane. The side with the little tick (T) on it is the side that gets cut off. You can use the flip button to reverse the tick (uber handy - just get the pins where you want and flip the thingy until its right). The cut button is what you press to actually lop off part of the brush. 

The split button will cut one brush into two separate brushes, this will not work on the builder brush itself, but will work on any other brush already placed in the level. The delete button just gets rid of the pins. 

==Uses ==
* [[Legacy:Making Ramps|making ramps]]
* trimming brushes
* splitting brushes to split surfaces

==Basic 2D clipping ==

The basic steps of using this tool:
# select the brush you want to clip
# select the tool in the [[Legacy:Toolbox|toolbox]]
# CTRL + right-click in an orthogonal viewport to add a pin: you need 2.
# Move the pins as you would normal actors: then red line between them is the clip line. The tick mark on the midpoint points toward the part to discard when clipping.
# Clip or split: the commands are in [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Brush Clip and in the 2nd [[Legacy:Toolbox|toolbox]] group.

==3D clipping ==

3D clipping is for when the part that needs removing does not line up with the top, side, or front views.

====Example ====

[[Image:Legacy_clip3d.jpeg|left|]]

If you built a cube, 256x256x256 units in size, and then placed two clip markers (pins) in the top view, 128 units in from one of the corners. Clipping this brush will result in a cube that is missing one edge - the top and bottom faces both having five sides, with five other vertical faces in between. Two of the original corners (vertices) of the cube will have been cut away. Now lets say you build another cube of the same size, but only want to remove one of the corners. None of the 2D viewports are looking in the correct direction, because the corner needs a cut that is slanted in all three dimensions. You need 3D clipping.

====How to do 3D clipping  ====

To do 3D clipping, add a third clip marker:
* CTRL + Right-Click on one of the 2D viewports as before.
* Move the third clip marker to the desired position.
* Look in the 3D view and make sure the tick mark (called the 'normal') is facing towards the part you want to cut away.
** (If you are splitting the brush to make two brushes, the normal does not matter.)
* Select the brush you want to clip in any viewport.
* Click the cut button.

Note, with 2D clipping, it is important which viewport you use. Clipping is always done by a plane - think of it as a large blade. If you use the top view, the blade will cut straight down on the line connecting the two pins. If you use the side view, the blade cuts sideways. You can do diagonal cuts in 2D, but they will only slope one way - as you look at them in 2D. In 3D, three points are enough to define any plane, and so if you have three pins, UnrealEd performs a 3D clip no matter what view port you are in.

====Example ====

[[Image:Legacy_clip3d2.jpeg|left|]]

To cut one corner from a 256x256x256 cube, add two clip markers like before, then add a third, and place it 128 units DOWNWARDS from the corner. Check their positions in all the views, check the normal is facing the right way, then hack off your corner!

====Uses ====

3D clipping can be used to create complex shapes, and is especially useful for shaving bits off cubes to make boulder shapes and rock formations.

==Troubleshooting ==

If you have problems clipping/cutting a brush:
* Make sure the brush you want to clip is selected.
* If you have recently moved the brush, rebuild geometry before clipping.

* the [[Legacy:Red Builder Brush|red builder brush]] can't be split, only clipped.
* Clipping sometimes either doesnt work at all or clips in the wrong place: this is to do with the brush's current scaling or rotation.
** To solve this, transform the brush permanently by doing '''[[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]'''
* saving the map wipes the clipping points

==Related Topics ==
* Reference for the [[Legacy:Toolbox|Toolbox]] 
* [[Legacy:UnrealEd Interface|UnrealEd interface]]
* [[Legacy:Architecture|Architecture]] topics
* [[Legacy:Making Ramps|Making Ramps]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Context Menu</title>
    <id>564</id>
    <revision>
      <id>1733</id>
      <timestamp>2006-12-28T02:43:29Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">To access the Brush Context Menu, right click on a brush (such as the Red Builder Brush). The following options will be available...

; '''&lt;&lt;i&gt;class&lt;/i&gt;&gt; properties''' : opens the floating [[Legacy:Actor Properties Window|actor properties window]] for this actor or group of actors.
; Movers : commands to show mover polys in the BSP and change the keyframe. See [[Legacy:Mover|mover]].
; reset : reset rotation, pivot, scaling or all. Use the reset rotation command as frequently as possible to avoid [[Legacy:Brush Rotate|gimbal lock]] errors
; transform : Apply [[Legacy:Brush Transformation|Brush Transformation]].  See [[Legacy:Transform Permanently|Transform Permanently]].

; order : brings selection to front or back of the [[Legacy:Brush Order|Brush Order]]. 
; '''polygons''' : opens polygons submenu
:: '''To Brush''': use on a world brush to make the [[Legacy:Red Builder Brush|red builder brush]] take on its shape.
:: '''From Brush''': use on a world brush to make it take the current shape of the red builder brush.
:: '''Merge''': merges coplanar faces of a brush. See [[Legacy:Merge Polygons|Merge Polygons]].
:: '''Seperate''': seperates faces that have been previously merged. See [[Legacy:Merge Polygons|Merge Polygons]].
; '''Solidity''' : changes [[Legacy:Solidity|Solidity]].
; CSG :

; '''Select all &lt;&lt;i&gt;class&lt;/i&gt;&gt;''' : selects all of the same of the selected actor.
; select all : selects everything in the world, such as brushes, actors, lights, etc... 
*Note: If used on an actor/brush that is part of a group, it will select all in the particular group.
; select none : deselects everything that is currently selected.
; select brushes : allows selection of ALL brushes that are Additive, Subtractive, Semi-Solid, or Non-Solid.

;duplicate: creates a copy of a selected actor/brush. The characteristics and values of the selected actor/brush are carried over to the duplicate.  See [[Legacy:Brush Duplication|Brush Duplication]].
;delete: deletes selected actors.
;edit script: opens the script of the selected object's class in the script editor window.
;make current: when used on an actor, it makes it the currently selected actor in the add &lt;class&gt; here option in the right click menu.

==Related Topics==
* Something here

==Comments==

(needs tidying)

IS this now identical to [[Legacy:Actor Context Menu|Actor Context Menu]] in UEd3?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1734</id>
      <timestamp>2006-06-01T09:59:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>don't put underscores in page links, please</comment>
      <text xml:space="preserve">; '''&lt;&lt;i&gt;class&lt;/i&gt;&gt; properties''' : opens the floating [[Legacy:Actor Properties Window|actor properties window]] for this actor or group of actors.
; Movers : commands to show mover polys in the BSP and change the keyframe. See [[Legacy:Mover|mover]].
; reset : reset rotation, pivot, scaling or all. Use the reset rotation command as frequently as possible to avoid [[Legacy:Brush Rotate|gimbal lock]] errors
; transform : Apply [[Legacy:Brush Transformation|Brush Transformation]].  See [[Legacy:Transform Permanently|Transform Permanently]].

; order : brings selection to front or back of the [[Legacy:Brush Order|Brush Order]]. 
; '''polygons''' : opens polygons submenu
:: '''To Brush''': use on a world brush to make the [[Legacy:Red Builder Brush|red builder brush]] take on its shape.
:: '''From Brush''': use on a world brush to make it take the current shape of the red builder brush.
:: '''Merge''': merges coplanar faces of a brush. See [[Legacy:Merge Polygons|Merge Polygons]].
:: '''Seperate''': seperates faces that have been previously merged. See [[Legacy:Merge Polygons|Merge Polygons]].
; '''Solidity''' : changes [[Legacy:Solidity|Solidity]].
; CSG :

; '''Select all &lt;&lt;i&gt;class&lt;/i&gt;&gt;''' : selects all of the same of the selected actor.
; select all : selects everything in the world, such as brushes, actors, lights, etc... 
*Note: If used on an actor/brush that is part of a group, it will select all in the particular group.
; select none : deselects everything that is currently selected.
; select brushes : allows selection of ALL brushes that are Additive, Subtractive, Semi-Solid, or Non-Solid.

;duplicate: creates a copy of a selected actor/brush. The characteristics and values of the selected actor/brush are carried over to the duplicate.  See [[Legacy:Brush Duplication|Brush Duplication]].
;delete: deletes selected actors.
;edit script: opens the script of the selected object's class in the script editor window.
;make current: when used on an actor, it makes it the currently selected actor in the add &lt;class&gt; here option in the right click menu.

==Related Topics==
* Something here

==Comments==

(needs tidying)

IS this now identical to [[Legacy:Actor Context Menu|Actor Context Menu]] in UEd3?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1735</id>
      <timestamp>2006-12-28T02:40:50Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">(Please tell us where to access the Brush Context Menu.)

; '''&lt;&lt;i&gt;class&lt;/i&gt;&gt; properties''' : opens the floating [[Legacy:Actor Properties Window|actor properties window]] for this actor or group of actors.
; Movers : commands to show mover polys in the BSP and change the keyframe. See [[Legacy:Mover|mover]].
; reset : reset rotation, pivot, scaling or all. Use the reset rotation command as frequently as possible to avoid [[Legacy:Brush Rotate|gimbal lock]] errors
; transform : Apply [[Legacy:Brush Transformation|Brush Transformation]].  See [[Legacy:Transform Permanently|Transform Permanently]].

; order : brings selection to front or back of the [[Legacy:Brush Order|Brush Order]]. 
; '''polygons''' : opens polygons submenu
:: '''To Brush''': use on a world brush to make the [[Legacy:Red Builder Brush|red builder brush]] take on its shape.
:: '''From Brush''': use on a world brush to make it take the current shape of the red builder brush.
:: '''Merge''': merges coplanar faces of a brush. See [[Legacy:Merge Polygons|Merge Polygons]].
:: '''Seperate''': seperates faces that have been previously merged. See [[Legacy:Merge Polygons|Merge Polygons]].
; '''Solidity''' : changes [[Legacy:Solidity|Solidity]].
; CSG :

; '''Select all &lt;&lt;i&gt;class&lt;/i&gt;&gt;''' : selects all of the same of the selected actor.
; select all : selects everything in the world, such as brushes, actors, lights, etc... 
*Note: If used on an actor/brush that is part of a group, it will select all in the particular group.
; select none : deselects everything that is currently selected.
; select brushes : allows selection of ALL brushes that are Additive, Subtractive, Semi-Solid, or Non-Solid.

;duplicate: creates a copy of a selected actor/brush. The characteristics and values of the selected actor/brush are carried over to the duplicate.  See [[Legacy:Brush Duplication|Brush Duplication]].
;delete: deletes selected actors.
;edit script: opens the script of the selected object's class in the script editor window.
;make current: when used on an actor, it makes it the currently selected actor in the add &lt;class&gt; here option in the right click menu.

==Related Topics==
* Something here

==Comments==

(needs tidying)

IS this now identical to [[Legacy:Actor Context Menu|Actor Context Menu]] in UEd3?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Deletion</title>
    <id>566</id>
    <revision>
      <id>1739</id>
      <timestamp>2003-02-04T20:13:27Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Note:'''  Read about how to delete brushes on [[Legacy:Actor Overview|Actor Overview]].

Some mappers delete the [[Legacy:Brush|brush]] actors from the final version of their map. If no further [[Legacy:Build|build]]ing of geometry and BSP is performed, the absence of the brushes has no effect on the game.

In UT2003, it doesn't matter much if you brush delete because static meshes cure that file-size problem.

===Pros ===

* Reduced filesize.  (Usually not much if the map is compressed.)
* Hides secret tricks such as [[Legacy:Jailbreak|Jailbreak]] escape routes, although people will usually rather use &quot;ghost&quot; to figure them out than open your map in UnrealEd anyway.
* Superficially hides &quot;l33t brushwork so it can't be nicked.&quot;  See below for how to reveal it anyway.

===Cons ===

* Brushwork can still be revealed and copied.  Since the [[Legacy:BSP|BSP]] is still present, you can simply [[Legacy:Intersect|intersect]] (which defeats all &quot;security considerations&quot;).
* Commonly considered antisocial in the Unreal community.  (Those who just want to steal geometry still can, but those who honestly want to learn from your skills can't.)
* Crashes when you try to select the brush that belonged to the deleted brushes surfaces (Shift-Click on surface).

----

'''Bot 40:''' I always delete(d) my brushes in maps just to keep the filesize down. I'm on a 56Ghey so it takes a long time to upload as well as download ya know :-) I always keep a copy of the map with brushes on my HD and put a note in the readme so anyone who wants to look at the brushes can if they want.</text>
    </revision>
    <revision>
      <id>1740</id>
      <timestamp>2003-02-04T19:41:31Z</timestamp>
      <contributor>
        <ip>Bot 40</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Note:'''  Read about how to delete brushes on [[Legacy:Actor Overview|Actor Overview]].

Some mappers delete the [[Legacy:Brush|brush]] actors from the final version of their map. If no further [[Legacy:Build|build]]ing of geometry and BSP is performed, the absence of the brushes has no effect on the game.

===Pros ===

* Reduced filesize.  (Usually not much if the map is compressed.)
* Hides secret tricks such as [[Legacy:Jailbreak|Jailbreak]] escape routes, although people will usually rather use &quot;ghost&quot; to figure them out than open your map in UnrealEd anyway.
* Superficially hides &quot;l33t brushwork so it can't be nicked.&quot;  See below for how to reveal it anyway.

===Cons ===

* Brushwork can still be revealed and copied.  Since the [[Legacy:BSP|BSP]] is still present, you can simply [[Legacy:Intersect|intersect]] (which defeats all &quot;security considerations&quot;).
* Commonly considered antisocial in the Unreal community.  (Those who just want to steal geometry still can, but those who honestly want to learn from your skills can't.)
* Crashes when you try to select the brush that belonged to the deleted brushes surfaces (Shift-Click on surface).

----

'''Bot 40:''' I always delete(d) my brushes in maps just to keep the filesize down. I'm on a 56Ghey so it takes a long time to upload as well as download ya know :-) I always keep a copy of the map with brushes on my HD and put a note in the readme so anyone who wants to look at the brushes can if they want.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Duplication</title>
    <id>552</id>
    <revision>
      <id>1704</id>
      <timestamp>2006-06-01T08:01:56Z</timestamp>
      <contributor>
        <ip>Pool-71-105-113-177.lsanca.dsl-w.verizon.net</ip>
      </contributor>
      <comment>*added keyboard shortcut and link to relevant material</comment>
      <text xml:space="preserve">Duplicating a [[Legacy:Brush|brush]] is an easy way to populate your map with shapes that can then be used to [[Legacy:Build|build]] your map.

# Select a brush
# Hit CTRL-W or SHIFT-D
# Note that in UnrealEd 2, this sometimes crashes. The problem appears to be that UnrealEd tries to place the new brush to a certain distance of the original, and if the grid size is too large relative to the distance between vertices, this is off-grid and when it attempts to put the vertices back on-grid, they collapse together. See [[Legacy:Crashing_UnrealEd|Crashing_UnrealEd]].

==Making Clones==

===Simple way===
# Shape the [[Legacy:Red Builder Brush|red builder brush]], with the [[Legacy:Brushbuilders|brushbuilders]] and any clipping, intersecting, etc operations
# [[Legacy:CSG|CSG]] add or subtract several copies of it

===Applying Ready-Textured Clones===
# Choose one of the brushbuilders or [[Legacy:2D Shape Editor|2D Shape Editor]] to create a brush for the red builder brush
# Apply any [[Legacy:Brush Transformation|Brush Transformation]]
# Add or subtract the brush from the map

# Apply [[Legacy:Texture|texture]]s to it 

# 
Move the red builder brush out of the way, select the brush and choose 
: [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polygons -&gt; To Brush.

The red builder brush will then wrap onto the brush.  It will also take on all the texture settings, so it will be textured like the first when you  add or subtract another brush.  This is particularly useful for repeating architecturual structures such as pillars or girders.


==Related Topics==
* [[Legacy:Merge Polygons|Merge Polygons]] is used to line up textures on a brush [[Legacy:Surface|surface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1705</id>
      <timestamp>2003-09-30T21:36:53Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <minor/>
      <comment>removed excessive interlinking</comment>
      <text xml:space="preserve">Duplicating a [[Legacy:Brush|brush]] is an easy way to populate your map with shapes that can then be used to [[Legacy:Build|build]] your map.

# Select a brush
# Hit CTRL-W
# Note that in UnrealEd 2, this sometimes crashes. The problem appears to be that UnrealEd tries to place the new brush to a certain distance of the original, and if the grid size is too large relative to the distance between vertices, this is off-grid and when it attempts to put the vertices back on-grid, they collapse together.

==Making Clones==

===Simple way===
# Shape the [[Legacy:Red Builder Brush|red builder brush]], with the [[Legacy:Brushbuilders|brushbuilders]] and any clipping, intersecting, etc operations
# [[Legacy:CSG|CSG]] add or subtract several copies of it

===Applying Ready-Textured Clones===
# Choose one of the brushbuilders or [[Legacy:2D Shape Editor|2D Shape Editor]] to create a brush for the red builder brush
# Apply any [[Legacy:Brush Transformation|Brush Transformation]]
# Add or subtract the brush from the map

# Apply [[Legacy:Texture|texture]]s to it 

# 
Move the red builder brush out of the way, select the brush and choose 
: [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polygons -&gt; To Brush.

The red builder brush will then wrap onto the brush.  It will also take on all the texture settings, so it will be textured like the first when you  add or subtract another brush.  This is particularly useful for repeating architecturual structures such as pillars or girders.


==Related Topics==
* [[Legacy:Merge Polygons|Merge Polygons]] is used to line up textures on a brush [[Legacy:Surface|surface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Exporting And Importing</title>
    <id>536</id>
    <revision>
      <id>1664</id>
      <timestamp>2004-08-05T08:27:28Z</timestamp>
      <contributor>
        <ip>C-67-170-242-238.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An exported .t3d brush file is also called a prefab.

==Exporting a Brush ==

# Create the shape you want exported in the world. This means actually make it out of &quot;matter&quot;.
# Get the texturing on your object the way you want it.
# [[Legacy:Intersect|Intersect]] the object you want to make a prefab.
# Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Export
# Choose a directory to save the .t3d file to and export it.

==Importing a Brush ==
# Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Import
# Navigate to the .t3d file you want to import, select it, and click open.
# Click merge faces if you want the editor to merge co-planar faces. If you don't know what this means, leave it unchecked, because you can always do this later yourself once it's added by doing [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polys -&gt; Merge.
# I always leave the radio buttons alone since I don't understand what they do but perhaps someone who does could fill this in... '''Bean:''' It's best to not merge faces and to change it to a nonsolid using the radio buttons. This reduces most BSP problems right off the bat. If those options cause problems, you could always play around with others. :)
# Click ''OK'', your red brush is now the shape of your prefab and will have the same textures when you add it as it did when the prefab was created.

==Notes ==

===Re-Importing Errors ===

One note I'll add is ''be careful'' saving your cherished brush masterpiece by exporting it.  UnrealEd's import process does ''not'' look at the the &quot;Normal&quot; attribute for polygons in the .t3d file during its import process.  Rather, it recalculates them.  If brushes are too complex or step on UnrealEd's toes in the wrong way (I've never nailed down exactly what), you'll get a bad normal calculation on some surfaces and they will refuse to take lighting properly... from then and forever and ever... amen.

If you have uber cool and complex brushes that you must keep, put them in a warehouse (a big subtracted cube somewhere off to the side) in your map.

===Brush Save ===

'''Tarquin:'''  The ''Save Brush as'' and ''Open Brush'' commands are allegely fubar.... hmm. Though ''Open Brush'' works. Urm... this calls for a page that actually summarizes all the export/import commands. [[Legacy:Data Import And Export|Data Import and Export]].

==Related Topics ==
* [[Legacy:File Format|File Format]]
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; Converts prefabs to [[Legacy:Decoration|decoration]]s
* [http://www.unrealroc.com/Converter.html UnrealROC] Converters for VRML/X3D/OBJ/3DMF

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1665</id>
      <timestamp>2003-08-05T02:47:24Z</timestamp>
      <contributor>
        <ip>DaveA</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">An exported .t3d brush file is also called a prefab.

==Exporting a Brush ==

# Create the shape you want exported in the world. This means actually make it out of &quot;matter&quot;.
# Get the texturing on your object the way you want it.
# [[Legacy:Intersect|Intersect]] the object you want to make a prefab.
# Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Export
# Choose a directory to save the .t3d file to and export it.

==Importing a Brush ==
# Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Import
# Navigate to the .t3d file you want to import, select it, and click open.
# Click merge faces if you want the editor to merge co-planar faces. If you don't know what this means, leave it unchecked, because you can always do this later yourself once it's added by doing [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polys -&gt; Merge.
# I always leave the radio buttons alone since I don't understand what they do but perhaps someone who does could fill this in... '''Bean:''' It's best to not merge faces and to change it to a nonsolid using the radio buttons. This reduces most BSP problems right off the bat. If those options cause problems, you could always play around with others. :)
# Click ''OK'', your red brush is now the shape of your prefab and will have the same textures when you add it as it did when the prefab was created.

==Notes ==

===Re-Importing Errors ===

One note I'll add is ''be careful'' saving your cherished brush masterpiece by exporting it.  UnrealEd's import process does ''not'' look at the the &quot;Normal&quot; attribute for polygons in the .t3d file during its import process.  Rather, it recalculates them.  If brushes are too complex or step on UnrealEd's toes in the wrong way (I've never nailed down exactly what), you'll get a bad normal calculation on some surfaces and they will refuse to take lighting properly... from then and forever and ever... amen.

If you have uber cool and complex brushes that you must keep, put them in a warehouse (a big subtracted cube somewhere off to the side) in your map.

===Brush Save ===

'''Tarquin:'''  The ''Save Brush as'' and ''Open Brush'' commands are allegely fubar.... hmm. Though ''Open Brush'' works. Urm... this calls for a page that actually summarizes all the export/import commands. [[Legacy:Data Import And Export|Data Import and Export]].

==Related Topics ==
* [[Legacy:File Format|File Format]]
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; Converts prefabs to [[Legacy:Decoration|decoration]]s
* [http://darendash.home.comcast.net/Converter.html UnrealROC] Converters for VRML/X3D/OBJ/3DMF

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Hacking</title>
    <id>556</id>
    <revision>
      <id>1713</id>
      <timestamp>2003-05-25T09:43:05Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==Filthy brush hacking techniques ==

A quote from [[Legacy:Brush|Brush]]...

{{innerbox|''...you can do some pretty interesting things by manually editing what has been copied to the clipboard.  If you, for instance, give two brushes the same model reference, vertex editing one instance of that brush will automagically vertex-edit all other instances as well (and real-time).  Since I guess that unused model objects won't be saved along with the map, I suppose that can indeed serve to save some file space (not too much though since the rendered, cut world polygons are stored separately) and probably even as a comfortable editing tool.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]''

}}

:''Tarquin'': I have just successfully edited a brush in Textpad. I've removed the two cap surfaces of a quarter-torus to make a bendy sheet tube! wahey!

Pasting back to Ued takes an age, be patient.

It's also possible to change the class of the brush actor, and get a [[Legacy:CSG|CSG]] entity of another class. I've tried this with a subclass of Brush and the geometry build treats it like a normal brush. I have no idea if this would work with other classes, and I have no idea if this might actually be useful for something.

==ReCasting Movers ==

Situation: you have a mover all made and set up nicely, keyframes and all, but you now find it should be a different [[Legacy:Mover|Mover]] class. Do this:
# copy it
# paste to a text editor (eg TextPad)
# change the class there
# subtract 32.0 from Location X,Y,Z (because when pasting back into the map, UnrealEd moves it by that amount. This counters that effect)
# select all the text and copy it
# paste in UnrealEd

==The Model info in Brushes ==

'''Tarquin:''' Weirdness: I've copied the same mover object twice. the only difference was that I moved it away from the origin and the 2nd time there is no Model information in Textpad

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1714</id>
      <timestamp>2002-08-24T17:20:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Filthy brush hacking techniques ==

A quote from [[Legacy:Brush|Brush]]...

{{innerbox|''...you can do some pretty interesting things by manually editing what has been copied to the clipboard.  If you, for instance, give two brushes the same model reference, vertex editing one instance of that brush will automagically vertex-edit all other instances as well (and real-time).  Since I guess that unused model objects won't be saved along with the map, I suppose that can indeed serve to save some file space (not too much though since the rendered, cut world polygons are stored separately) and probably even as a comfortable editing tool.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]''

}}

:''Tarquin'': I have just successfully edited a brush in Textpad. I've removed the two cap surfaces of a quarter-torus to make a bendy sheet tube! wahey!

Pasting back to Ued takes an age, be patient.

It's also possible to change the class of the brush actor, and get a [[Legacy:CSG|CSG]] entity of another class. I've tried this with a subclass of Brush and the geometry build treats it like a normal brush. I have no idea if this would work with other classes, and I have no idea if this might actually be useful for something.

==ReCasting Movers ==

Situation: you have a mover all made and set up nicely, keyframes and all, but you now find it should be a different [[Legacy:Mover|Mover]] class. Do this:
# copy it
# paste to a text editor (eg TextPad)
# change the class there
# subtract 32.0 from Location X,Y,Z (because when pasting back into the map, UnrealEd moves it by that amount. This counters that effect)
# select all the text and copy it
# paste in UnrealEd</text>
    </revision>
    <revision>
      <id>1715</id>
      <timestamp>2002-08-24T17:24:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Filthy brush hacking techniques ==

A quote from [[Legacy:Brush|Brush]]...

{{innerbox|''...you can do some pretty interesting things by manually editing what has been copied to the clipboard.  If you, for instance, give two brushes the same model reference, vertex editing one instance of that brush will automagically vertex-edit all other instances as well (and real-time).  Since I guess that unused model objects won't be saved along with the map, I suppose that can indeed serve to save some file space (not too much though since the rendered, cut world polygons are stored separately) and probably even as a comfortable editing tool.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]''

}}

:''Tarquin'': I have just successfully edited a brush in Textpad. I've removed the two cap surfaces of a quarter-torus to make a bendy sheet tube! wahey!

Pasting back to Ued takes an age, be patient.

It's also possible to change the class of the brush actor, and get a [[Legacy:CSG|CSG]] entity of another class. I've tried this with a subclass of Brush and the geometry build treats it like a normal brush. I have no idea if this would work with other classes, and I have no idea if this might actually be useful for something.

==ReCasting Movers ==

Situation: you have a mover all made and set up nicely, keyframes and all, but you now find it should be a different [[Legacy:Mover|Mover]] class. Do this:
# copy it
# paste to a text editor (eg TextPad)
# change the class there
# subtract 32.0 from Location X,Y,Z (because when pasting back into the map, UnrealEd moves it by that amount. This counters that effect)
# select all the text and copy it
# paste in UnrealEd

==The Model info in Brushes ==

'''Tarquin:''' Weirdness: I've copied the same mover object twice. the only difference was that I moved it away from the origin and the 2nd time there is no Model information in Textpad</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Order</title>
    <id>537</id>
    <revision>
      <id>1666</id>
      <timestamp>2006-11-25T17:19:28Z</timestamp>
      <contributor>
        <ip>88-110-64-166.dynamic.dsl.as9105.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">All [[Legacy:Brush|brush]]es in UnrealEd have an order. The editor, when rebuilding the level, starts with the first brush in line and goes through every brush in sucession. The default brush order is simply the order in which you added or subtracted the brushes. To change the order of a brush, do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Order -&gt; First ''or'' Last.

Brush order is very important when you add brushes into a room. If you add the brush first, and then subtract the room, the brush you added will effectively be &quot;erased&quot; by the subtractive brush. If this happens, either set the order of the subtractive brush to first to make it subtract before you add the other brush, or set the order of the additive brush to last so that the room is first subtracted and then the additive brush is added in.

This case is rather simple, there are often much more complicated situations that arise. Just remember to try to follow a logical order when you build the level. If you plan the order well to begin with, you will never have to re-order your brushes later.

Note:  there are exceptions to this.  Sometimes brush order can be blamed for such things as movers which become invisible, and other such miscellaneous problems with geometry.  To fix some of these, there is a good technique to try once you have finished building onto your map.  First, simultaneously select all the semisolid brushes in the level and order them to last.  Then do this again with all nonsolids, and finally with all movers.  Rebuild afterwards.  In this way, you'll have the brushes ordered in such a way as to never create conflicts, and there is a good chance that any display problems you originally had with brushes will be fixed.

See also [[Legacy:CSG|CSG]].

'''Flashman:''' Another use that I have found brush order to be a lifesaver/important is when you get halfway through building a level and then find that it would be really neat if you could put a window across a courtyard, but it means that your buildings need an exterior. Rather then try to do it all with subtracts, you can do one big cube subtract first and then build the outside of your buildings with adds/semisolids. Select all the new geometry and [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Order -&gt; First.

N.B. before you build, make sure that no subtracts co-incide with any semisolids you have placed, if this is the case then select the offending semisolid and [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; [[Legacy:Solidity|Solidity]] -&gt; Solid

'''JustaAverageKid:''' Phwoo! This tool saved my life when I killed off one of my prime subtraction boxes (which held a bunch of other added material) by accident =P

'''Techno_JF:'''  Brush order is also the basis for a building technique I have heard of.  When building an outdoor map, a mapper will occasionally underestimate the amount of room they require for the map.  Putting in extra subtractive brushes to simply extend the open space would technically work, but it drastically increases the risk of creating BSP holes.

Instead, just subtract a larger brush for the basic outdoor area, directly over the existing work.  When you do it, you'll suddenly see all your work in the outdoor area vanish.  (Don't worry; it's still there.)  Go into the 3D wireframe mode.  Delete the old brush that defined the borders of the subtracted area, and then select the new brush and order it to be first.  When you rebuild, you'll see everything come back the way it was, except that it's now inside your newer, larger open area!

'''Tarquin:''' True......... but wouldn't you just vertex edit the original subract to make it bigger? :)

'''Kedren:''' Or, you could just select the brush that represents the outdoor area and scale it up :) Rebuild the map, and everything fits.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1667</id>
      <timestamp>2004-06-22T11:03:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">All [[Legacy:Brush|brush]]es in UnrealEd have an order. The editor, when rebuilding the level, starts with the first brush in line and goes through every brush in sucession. The default brush order is simply the order in which you added or subtracted the brushes. To change the order of a brush, do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Order -&gt; First ''or'' Last.

Brush order is very important when you add brushes into a room. If you add the brush first, and then subtract the room, the brush you added will effectively be &quot;erased&quot; by the subtractive brush. If this happens, either set the order of the subtractive brush to first to make it subtract before you add the other brush, or set the order of the additive brush to last so that the room is first subtracted and then the additive brush is added in.

This case is rather simple, there are often much more complicated situations that arise. Just remember to try to follow a logical order when you build the level. If you plan the order well to begin with, you will never have to re-order your brushes later.

Note:  there are exceptions to this.  Sometimes brush order can be blamed for such things as movers which become invisible, and other such miscellaneous problems with geometry.  To fix some of these, there is a good technique to try once you have finished building onto your map.  First, simultaneously select all the semisolid brushes in the level and order them to last.  Then do this again with all nonsolids, and finally with all movers.  Rebuild afterwards.  In this way, you'll have the brushes ordered in such a way as to never create conflicts, and there is a good chance that any display problems you originally had with brushes will be fixed.

See also [[Legacy:CSG|CSG]].

'''Flashman:''' Another use that I have found brush order to be a lifesaver/important is when you get halfway through building a level and then find that it would be really neat if you could put a window across a courtyard, but it means that your buildings need an exterior. Rather then try to do it all with subtracts, you can do one big cube subtract first and then build the outside of your buildings with adds/semisolids. Select all the new geometry and [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Order -&gt; First.

N.B. before you build, make sure that no subtracts co-incide with any semisolids you have placed, if this is the case then select the offending semisolid and [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; [[Legacy:Solidity|Solidity]] -&gt; Solid

'''JustaAverageKid:''' Phwoo! This tool saved my life when I killed off one of my prime subtraction boxes (which held a bunch of other added material) by accident =P

'''Techno_JF:'''  Brush order is also the basis for a building technique I have heard of.  When building an outdoor map, a mapper will occasionally underestimate the amount of room they require for the map.  Putting in extra subtractive brushes to simply extend the open space would technically work, but it drastically increases the risk of creating BSP holes.

Instead, just subtract a larger brush for the basic outdoor area, directly over the existing work.  When you do it, you'll suddenly see all your work in the outdoor area vanish.  (Don't worry; it's still there.)  Go into the 3D wireframe mode.  Delete the old brush that defined the borders of the subtracted area, and then select the new brush and order it to be first.  When you rebuild, you'll see everything come back the way it was, except that it's now inside your newer, larger open area!

'''Tarquin:''' True......... but wouldn't you just vertex edit the original subract to make it bigger? :)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Preservation</title>
    <id>568</id>
    <revision>
      <id>1743</id>
      <timestamp>2005-12-26T20:05:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Well, most of you might be wondering what &lt;nowiki&gt; 'brush preservation' &lt;/nowiki&gt; is and what it is used for. Brush Preservation is preserving the [[Legacy:Red Builder Brush|Red Builder Brush]] for future use.

==How to preserve the brush==
* Create the brush (RBB)
* Manipulate the brush to liking
* Use Transform -&gt; Transform Permantly 
* Copy the RBB (CTRL-C)
* Paste the RBB (CTRL-V)
* You should now see a brush with a grey outline.

How to make the grey outlined brush the RBB.

* Select the grey outlined brush in the 2d viewport
* Use Polygons -&gt; To Brush
* You should see a RBB sculpted out of the grey brush.
* Use the RBB to make geometry

===Techniques===

==FAQ==
* When I made the grey outlined brush the brush vanishes when I deselect it?

Don't be mad! Just look for it in the 2d viewport and it will be there!

* When I save the map and reopen it, the grey brush in the 2d viewport vanishes?

Press the Show All Actors button in the toolbox.

==Discussion==

'''ZxAnPhOrIaN:''' The preceeding might need clarification or rewriting. :) Also, I made up that name (Brush Preservation). :P

'''Tarquin:''' &quot;Why isn't anybody reading or commenting this page?&quot; &amp;ndash; I havent commented because I'm a bit confused by it... Why not just add the brush to the map in a corner somewhere? You can read the RBB from the Additive Brush later with Polygons -&gt; To Brush. There's [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]] too. You can copy - paste to a text file too.

'''ZxAnPhOrIaN:''' Well, it's better because you don't have to rebuild when you use the copied brush.

'''ZxAnPhOrIaN:''' Also subtlely cuts down on the size.

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Determine if this can be reworked into an existing page and removed with a DeleteMe tag.
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1744</id>
      <timestamp>2002-08-03T21:10:49Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well, most of you might be wondering what &lt;nowiki&gt; 'brush preservation' &lt;/nowiki&gt; is and what it is used for. Brush Preservation is what the title means, brush preservation. It is merely preserving the [[Legacy:Red Builder Brush|Red Builder Brush]] for future use.

'''ZxAnPhOrIaN:''' The following might need clarification or rewriting. :) Also, I made up that name (Brush Preservation). :P

'''Tarquin:''' &quot;Why isn't anybody reading or commenting this page?&quot; &amp;ndash; I havent commented because I'm a bit confused by it... Why not just add the brush to the map in a corner somewhere? You can read the RBB from the Additive Brush later with Polygons -&gt; To Brush. There's [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]] too. You can copy - paste to a text file too.

'''ZxAnPhOrIaN:''' Well, it's better because you don't have to rebuild when you use the copied brush.

==How to preserve the brush ==

* Create the brush (RBB)
* Manipulate the brush to liking
* Use Transform -&gt; Transform Permantly 
* Copy the RBB (CTRL-C)
* Paste the RBB (CTRL-V)
* You should now see a brush with a grey outline.

How to make the grey outlined brush the RBB.

* Select the grey outlined brush in the 2d viewport
* Use Polygons -&gt; To Brush
* You should see a RBB sculpted out of the grey brush.
* Use the RBB to make geometry

===Techniques ===

==FAQ ==

===When I made the grey outlined brush the brush vanishes when I deselect it? ===

Don't be mad! Just look for it in the 2d viewport and it will be there!

===When I save the map and reopen it, the grey brush in the 2d viewport vanishes? ===

Press the Show All Actors button in the toolbox.

==Comments ==

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1745</id>
      <timestamp>2002-08-03T21:12:37Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well, most of you might be wondering what &lt;nowiki&gt; 'brush preservation' &lt;/nowiki&gt; is and what it is used for. Brush Preservation is what the title means, brush preservation. It is merely preserving the [[Legacy:Red Builder Brush|Red Builder Brush]] for future use.

'''ZxAnPhOrIaN:''' The following might need clarification or rewriting. :) Also, I made up that name (Brush Preservation). :P

'''Tarquin:''' &quot;Why isn't anybody reading or commenting this page?&quot; &amp;ndash; I havent commented because I'm a bit confused by it... Why not just add the brush to the map in a corner somewhere? You can read the RBB from the Additive Brush later with Polygons -&gt; To Brush. There's [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]] too. You can copy - paste to a text file too.

'''ZxAnPhOrIaN:''' Well, it's better because you don't have to rebuild when you use the copied brush.

'''ZxAnPhOrIaN:''' Also subtlely cuts down on the size.

==How to preserve the brush ==

* Create the brush (RBB)
* Manipulate the brush to liking
* Use Transform -&gt; Transform Permantly 
* Copy the RBB (CTRL-C)
* Paste the RBB (CTRL-V)
* You should now see a brush with a grey outline.

How to make the grey outlined brush the RBB.

* Select the grey outlined brush in the 2d viewport
* Use Polygons -&gt; To Brush
* You should see a RBB sculpted out of the grey brush.
* Use the RBB to make geometry

===Techniques ===

==FAQ ==

===When I made the grey outlined brush the brush vanishes when I deselect it? ===

Don't be mad! Just look for it in the 2d viewport and it will be there!

===When I save the map and reopen it, the grey brush in the 2d viewport vanishes? ===

Press the Show All Actors button in the toolbox.

==Comments ==

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Rotate</title>
    <id>538</id>
    <revision>
      <id>1668</id>
      <timestamp>2004-04-22T06:55:01Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.rotate.gif|center|]]

One of the interface modes in UnrealEd's [[Legacy:Toolbox|toolbox]]. This mode lets you rotate Brushes or Actors such as meshes. Icon actors which have their [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bDirectional flag set such as [[Legacy:Spotlight|Spotlight]] can also be rotated like this. Any selection of multiple actors will rotate about the [[Legacy:Pivot|pivot]].

''Note: do not confuse rotation, something you the mapper does to actors in UnrealEd, with [[Legacy:Rotator|rotator]]s, a type of UnrealScript variable that describes a rotation.''

==How it works ==

You must select one or several elements to rotate. Then,  in any type of [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], hold down CTRL, click one of the mouse button combinations listed below and drag to rotate the objects. The table below shows:

# The rotation direction
# the axis of rotation this is equivalent to
# the orthogonal viewport in which this rotation is most clearly seen
# the mouse movement to perform this rotation: hold CTRL, click the indicated button and drag in the indicated direction

{|

|-
|'''Rotation'''
|'''Axis'''
|'''Viewport'''
|'''Mouse''' 
|-
|Yaw
|z-axis
|Top view
|RMB, drag left or right 
|-
|Pitch
|y-axis
|Front view
|LMB,  drag left or right 
|-
|Roll
|x-axis
|Side view
|LMB+RMB, drag up or down
|}

Brushes and actors are rotated around their [[Legacy:Pivot|pivot]] point; this can be set outside of the brush.

'''Important note:''' When rotating brushes the proportions of the brush(es) won't be preserved unless you first do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform permanently]].

==Simple rotation ==

Alternatively, simple rotation can be performed in orthogonal viewports in [[Legacy:Camera Movement|Camera Movement]] mode. CTRL+right-drag rotates in a different direction for each view type, as in the list above, eg: yaw in top view.  

==Problems ==

; The brush shape distorts : 
This is because the brush has scaling applied. Either:
* [[Legacy:Transform Permanently|transform permanently]] before rotating, to fix the scaling into the shape of the brush
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Scaling to remove the scaling.
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Rotation to unrotate the brush.

See [[Legacy:Brush Transformation|Brush Transformation]] for more on this.


; The brush shoots off into the distance : 
This is due to the position of the [[Legacy:Pivot|pivot]]. One of the following should work:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Pivot
* ALT + click on the brush's origin



; The brush rotates in the wrong axis : 
This is due to '''Gimbal lock''', a consequence of using Euler angles to describe rotation in 3D. In other words, sometimes the pitch, yaw, roll system that the Unreal engine uses causes unexpected results. Here's how to see it:
# create a brush, ideally something that's not symmetrical in all dimensions. A cylinder or stairs will do.
# rotate 90 degrees in top view
# switch to side view and rotate. urg!

This is not a bug, it's a mathematical consequence. If you like, it's a bug in the universe. Here's how to work around it:
* once you're done with a particular orientation, remember to reset brush rotation with the [[Legacy:Brush Context Menu|Brush Context Menu]]. That way you're starting from scratch again.
* if you have to rotate in more than one axis, perform the rotations in the same order as Unreal: pitch, yaw, roll: side view, top view, front view. This won't solve all problems, but rotating in two axes in that order should be fine.


==Beginner Tips on Rotation ==
* Only rotate with the pivot point for the brush in the center of the brush.
* Use the 2d views for rotating where the rotated brush will align with the X, Y or Z axis.
* Edit the brush properties and do precise rotation in the Movement - Rotation - (pitch, roll, yaw) values.  This is generally easier to get the exact rotation than rotating in one of the 2d views. Here are some useful values:
* | '''Value''' | '''Degrees''' |
* |&gt;  8192      |&gt;  45
* |&gt; 16384      |&gt;  90
* |&gt; 24576      |&gt; 135
* |&gt; 32768      |&gt; 180
* Rotate the brush such that its vertices are aligned with the grid points.  This makes it significantly easier to align texture in your finished map. See [[Legacy:Surface Alignment|Surface Alignment]]
* Consider [[Legacy:Brush_Clipping|Brush_Clipping]] to trim down one or more sides of a cube to get the shape you desire.  This has the advantage of allowing you to have one or two sides still parallel to X, Y or Z axis.  This greatly helps when aligning the brush to the floor and also in aligning texture.

==Related Topics ==
* [[Legacy:Toolbox|Toolbox]] reference page
* [[Legacy:Mouse Control|Mouse Control]] full reference of mouse actions
* [[Legacy:UnrealEd Interface|UnrealEd interface]] reference page
* [[Legacy:Architecture|Architecture]] main topic page

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1669</id>
      <timestamp>2003-10-02T23:35:18Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.rotate.gif|center|]]

One of the interface modes in UnrealEd's [[Legacy:Toolbox|toolbox]]. This mode lets you rotate Brushes or Actors such as meshes. Icon actors which have their [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bDirectional flag set such as [[Legacy:Spotlight|Spotlight]] can also be rotated like this. Any selection of multiple actors will rotate about the [[Legacy:Pivot|pivot]].

==How it works ==

You must select one or several elements to rotate. Then,  in any type of [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], hold down CTRL, click one of the mouse button combinations listed below and drag to rotate the objects. The table below shows:

# The rotation direction
# the axis of rotation this is equivalent to
# the orthogonal viewport in which this rotation is most clearly seen
# the mouse movement to perform this rotation: hold CTRL, click the indicated button and drag in the indicated direction

{|

|-
|'''Rotation'''
|'''Axis'''
|'''Viewport'''
|'''Mouse''' 
|-
|Yaw
|z-axis
|Top view
|RMB, drag left or right 
|-
|Pitch
|y-axis
|Front view
|LMB,  drag left or right 
|-
|Roll
|x-axis
|Side view
|LMB+RMB, drag up or down
|}

Brushes and actors are rotated around their [[Legacy:Pivot|pivot]] point; this can be set outside of the brush.

'''Important note:''' When rotating brushes the proportions of the brush(es) won't be preserved unless you first do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform permanently]].

==Simple rotation ==

Alternatively, simple rotation can be performed in orthogonal viewports in [[Legacy:Camera Movement|Camera Movement]] mode. CTRL+right-drag rotates in a different direction for each view type, as in the list above, eg: yaw in top view.  

==Problems ==

; The brush shape distorts : 
This is because the brush has scaling applied. Either:
* [[Legacy:Transform Permanently|transform permanently]] before rotating, to fix the scaling into the shape of the brush
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Scaling to remove the scaling.
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Rotation to unrotate the brush.

See [[Legacy:Brush Transformation|Brush Transformation]] for more on this.


; The brush shoots off into the distance : 
This is due to the position of the [[Legacy:Pivot|pivot]]. One of the following should work:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Pivot
* ALT + click on the brush's origin



; The brush rotates in the wrong axis : 
This is due to '''Gimbal lock''', a consequence of using Euler angles to describe rotation in 3D. In other words, sometimes the pitch, yaw, roll system that the Unreal engine uses causes unexpected results. Here's how to see it:
# create a brush, ideally something that's not symmetrical in all dimensions. A cylinder or stairs will do.
# rotate 90 degrees in top view
# switch to side view and rotate. urg!

This is not a bug, it's a mathematical consequence. If you like, it's a bug in the universe. Here's how to work around it:
* once you're done with a particular orientation, remember to reset brush rotation with the [[Legacy:Brush Context Menu|Brush Context Menu]]. That was you're starting from scratch again.
* if you have to rotate in more than one axis, perform the rotations in the same order as Unreal: pitch, yaw, roll: side view, top view, front view. This won't solve all problems, but rotating in two axes in that order should be fine.


==Beginner Tips on Rotation ==
* Only rotate with the pivot point for the brush in the center of the brush.
* Use the 2d views for rotating where the rotated brush will align with the X, Y or Z axis.
* Edit the brush properties and do precise rotation in the Movement - Rotation - (pitch, roll, yaw) values.  This is generally easier to get the exact rotation than rotating in one of the 2d views. Here are some useful values:
* | '''Value''' | '''Degrees''' |
* |&gt;  8192      |&gt;  45
* |&gt; 16384      |&gt;  90
* |&gt; 24576      |&gt; 135
* |&gt; 32768      |&gt; 180
* Rotate the brush such that its vertices are aligned with the grid points.  This makes it significantly easier to align texture in your finished map. See [[Legacy:Surface Alignment|Surface Alignment]]
* Consider [[Legacy:Brush_Clipping|Brush_Clipping]] to trim down one or more sides of a cube to get the shape you desire.  This has the advantage of allowing you to have one or two sides still parallel to X, Y or Z axis.  This greatly helps when aligning the brush to the floor and also in aligning texture.

==Related Topics ==
* [[Legacy:Toolbox|Toolbox]] reference page
* [[Legacy:Mouse Control|Mouse Control]] full reference of mouse actions
* [[Legacy:UnrealEd Interface|UnrealEd interface]] reference page
* [[Legacy:Architecture|Architecture]] main topic page
* [[Legacy:Rotator|Rotator]]s can affect any [[Legacy:Actor|actor]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1670</id>
      <timestamp>2003-10-03T11:07:55Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.rotate.gif|center|]]

One of the interface modes in UnrealEd's [[Legacy:Toolbox|toolbox]]. This mode lets you rotate Brushes or Actors such as meshes. Icon actors which have their [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bDirectional flag set such as [[Legacy:Spotlight|Spotlight]] can also be rotated like this. Any selection of multiple actors will rotate about the [[Legacy:Pivot|pivot]].

''Note: do not confuse rotation, something you the mapper does to actors in UnrealEd, with [[Legacy:Rotator|rotator]]s, a type of UnrealScript variable that describes a rotation.''

==How it works ==

You must select one or several elements to rotate. Then,  in any type of [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], hold down CTRL, click one of the mouse button combinations listed below and drag to rotate the objects. The table below shows:

# The rotation direction
# the axis of rotation this is equivalent to
# the orthogonal viewport in which this rotation is most clearly seen
# the mouse movement to perform this rotation: hold CTRL, click the indicated button and drag in the indicated direction

{|

|-
|'''Rotation'''
|'''Axis'''
|'''Viewport'''
|'''Mouse''' 
|-
|Yaw
|z-axis
|Top view
|RMB, drag left or right 
|-
|Pitch
|y-axis
|Front view
|LMB,  drag left or right 
|-
|Roll
|x-axis
|Side view
|LMB+RMB, drag up or down
|}

Brushes and actors are rotated around their [[Legacy:Pivot|pivot]] point; this can be set outside of the brush.

'''Important note:''' When rotating brushes the proportions of the brush(es) won't be preserved unless you first do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform permanently]].

==Simple rotation ==

Alternatively, simple rotation can be performed in orthogonal viewports in [[Legacy:Camera Movement|Camera Movement]] mode. CTRL+right-drag rotates in a different direction for each view type, as in the list above, eg: yaw in top view.  

==Problems ==

; The brush shape distorts : 
This is because the brush has scaling applied. Either:
* [[Legacy:Transform Permanently|transform permanently]] before rotating, to fix the scaling into the shape of the brush
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Scaling to remove the scaling.
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Rotation to unrotate the brush.

See [[Legacy:Brush Transformation|Brush Transformation]] for more on this.


; The brush shoots off into the distance : 
This is due to the position of the [[Legacy:Pivot|pivot]]. One of the following should work:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Pivot
* ALT + click on the brush's origin



; The brush rotates in the wrong axis : 
This is due to '''Gimbal lock''', a consequence of using Euler angles to describe rotation in 3D. In other words, sometimes the pitch, yaw, roll system that the Unreal engine uses causes unexpected results. Here's how to see it:
# create a brush, ideally something that's not symmetrical in all dimensions. A cylinder or stairs will do.
# rotate 90 degrees in top view
# switch to side view and rotate. urg!

This is not a bug, it's a mathematical consequence. If you like, it's a bug in the universe. Here's how to work around it:
* once you're done with a particular orientation, remember to reset brush rotation with the [[Legacy:Brush Context Menu|Brush Context Menu]]. That was you're starting from scratch again.
* if you have to rotate in more than one axis, perform the rotations in the same order as Unreal: pitch, yaw, roll: side view, top view, front view. This won't solve all problems, but rotating in two axes in that order should be fine.


==Beginner Tips on Rotation ==
* Only rotate with the pivot point for the brush in the center of the brush.
* Use the 2d views for rotating where the rotated brush will align with the X, Y or Z axis.
* Edit the brush properties and do precise rotation in the Movement - Rotation - (pitch, roll, yaw) values.  This is generally easier to get the exact rotation than rotating in one of the 2d views. Here are some useful values:
* | '''Value''' | '''Degrees''' |
* |&gt;  8192      |&gt;  45
* |&gt; 16384      |&gt;  90
* |&gt; 24576      |&gt; 135
* |&gt; 32768      |&gt; 180
* Rotate the brush such that its vertices are aligned with the grid points.  This makes it significantly easier to align texture in your finished map. See [[Legacy:Surface Alignment|Surface Alignment]]
* Consider [[Legacy:Brush_Clipping|Brush_Clipping]] to trim down one or more sides of a cube to get the shape you desire.  This has the advantage of allowing you to have one or two sides still parallel to X, Y or Z axis.  This greatly helps when aligning the brush to the floor and also in aligning texture.

==Related Topics ==
* [[Legacy:Toolbox|Toolbox]] reference page
* [[Legacy:Mouse Control|Mouse Control]] full reference of mouse actions
* [[Legacy:UnrealEd Interface|UnrealEd interface]] reference page
* [[Legacy:Architecture|Architecture]] main topic page

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34438</id>
      <timestamp>2009-05-24T14:44:34Z</timestamp>
      <contributor>
        <username>Pcride</username>
        <id>710</id>
      </contributor>
      <comment>/* Beginner Tips on Rotation */</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.rotate.gif|center|]]

One of the interface modes in UnrealEd's [[Legacy:Toolbox|toolbox]]. This mode lets you rotate Brushes or Actors such as meshes. Icon actors which have their [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bDirectional flag set such as [[Legacy:Spotlight|Spotlight]] can also be rotated like this. Any selection of multiple actors will rotate about the [[Legacy:Pivot|pivot]].

''Note: do not confuse rotation, something you the mapper does to actors in UnrealEd, with [[Legacy:Rotator|rotator]]s, a type of UnrealScript variable that describes a rotation.''

==How it works ==

You must select one or several elements to rotate. Then,  in any type of [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], hold down CTRL, click one of the mouse button combinations listed below and drag to rotate the objects. The table below shows:

# The rotation direction
# the axis of rotation this is equivalent to
# the orthogonal viewport in which this rotation is most clearly seen
# the mouse movement to perform this rotation: hold CTRL, click the indicated button and drag in the indicated direction

{|

|-
|'''Rotation'''
|'''Axis'''
|'''Viewport'''
|'''Mouse''' 
|-
|Yaw
|z-axis
|Top view
|RMB, drag left or right 
|-
|Pitch
|y-axis
|Front view
|LMB,  drag left or right 
|-
|Roll
|x-axis
|Side view
|LMB+RMB, drag up or down
|}

Brushes and actors are rotated around their [[Legacy:Pivot|pivot]] point; this can be set outside of the brush.

'''Important note:''' When rotating brushes the proportions of the brush(es) won't be preserved unless you first do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform permanently]].

==Simple rotation ==

Alternatively, simple rotation can be performed in orthogonal viewports in [[Legacy:Camera Movement|Camera Movement]] mode. CTRL+right-drag rotates in a different direction for each view type, as in the list above, eg: yaw in top view.  

==Problems ==

; The brush shape distorts : 
This is because the brush has scaling applied. Either:
* [[Legacy:Transform Permanently|transform permanently]] before rotating, to fix the scaling into the shape of the brush
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Scaling to remove the scaling.
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Rotation to unrotate the brush.

See [[Legacy:Brush Transformation|Brush Transformation]] for more on this.


; The brush shoots off into the distance : 
This is due to the position of the [[Legacy:Pivot|pivot]]. One of the following should work:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Pivot
* ALT + click on the brush's origin



; The brush rotates in the wrong axis : 
This is due to '''Gimbal lock''', a consequence of using Euler angles to describe rotation in 3D. In other words, sometimes the pitch, yaw, roll system that the Unreal engine uses causes unexpected results. Here's how to see it:
# create a brush, ideally something that's not symmetrical in all dimensions. A cylinder or stairs will do.
# rotate 90 degrees in top view
# switch to side view and rotate. urg!

This is not a bug, it's a mathematical consequence. If you like, it's a bug in the universe. Here's how to work around it:
* once you're done with a particular orientation, remember to reset brush rotation with the [[Legacy:Brush Context Menu|Brush Context Menu]]. That way you're starting from scratch again.
* if you have to rotate in more than one axis, perform the rotations in the same order as Unreal: pitch, yaw, roll: side view, top view, front view. This won't solve all problems, but rotating in two axes in that order should be fine.


==Beginner Tips on Rotation ==
* Only rotate with the pivot point for the brush in the center of the brush.
* Use the 2d views for rotating where the rotated brush will align with the X, Y or Z axis.
* Edit the brush properties and do precise rotation in the Movement - Rotation - (pitch, roll, yaw) values.  This is generally easier to get the exact rotation than rotating in one of the 2d views. Here are some useful values:
* | '''Value''' | '''Degrees''' |
* |&gt;  8192      |&gt;  45
* |&gt; 16384      |&gt;  90
* |&gt; 24576      |&gt; 135
* |&gt; 32768      |&gt; 180
* Rotate the brush such that its vertices are aligned with the grid points.  This makes it significantly easier to align texture in your finished map. See [[Legacy:Surface Alignment|Surface Alignment]]
* Consider [[Legacy:Brush_Clipping|Brush_Clipping]] to trim down one or more sides of a cube to get the shape you desire.  This has the advantage of allowing you to have one or two sides still parallel to X, Y or Z axis.  This greatly helps when aligning the brush to the floor and also in aligning texture.


Need to know how to rotate the brush while the pivot rotates as well. A red arrow will indicate the direction its pointing by using Bdirectional= TRUE. This does not rotate using the actor rotate.
[[File:http://gradax.com/images/Capture.JPG]]

==Related Topics ==
* [[Legacy:Toolbox|Toolbox]] reference page
* [[Legacy:Mouse Control|Mouse Control]] full reference of mouse actions
* [[Legacy:UnrealEd Interface|UnrealEd interface]] reference page
* [[Legacy:Architecture|Architecture]] main topic page

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34440</id>
      <timestamp>2009-05-25T11:01:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Pcride|Pcride]] ([[User talk:Pcride|Talk]]) to last version by [[User:Ironblayde|Ironblayde]]</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.rotate.gif|center|]]

One of the interface modes in UnrealEd's [[Legacy:Toolbox|toolbox]]. This mode lets you rotate Brushes or Actors such as meshes. Icon actors which have their [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bDirectional flag set such as [[Legacy:Spotlight|Spotlight]] can also be rotated like this. Any selection of multiple actors will rotate about the [[Legacy:Pivot|pivot]].

''Note: do not confuse rotation, something you the mapper does to actors in UnrealEd, with [[Legacy:Rotator|rotator]]s, a type of UnrealScript variable that describes a rotation.''

==How it works ==

You must select one or several elements to rotate. Then,  in any type of [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], hold down CTRL, click one of the mouse button combinations listed below and drag to rotate the objects. The table below shows:

# The rotation direction
# the axis of rotation this is equivalent to
# the orthogonal viewport in which this rotation is most clearly seen
# the mouse movement to perform this rotation: hold CTRL, click the indicated button and drag in the indicated direction

{|

|-
|'''Rotation'''
|'''Axis'''
|'''Viewport'''
|'''Mouse''' 
|-
|Yaw
|z-axis
|Top view
|RMB, drag left or right 
|-
|Pitch
|y-axis
|Front view
|LMB,  drag left or right 
|-
|Roll
|x-axis
|Side view
|LMB+RMB, drag up or down
|}

Brushes and actors are rotated around their [[Legacy:Pivot|pivot]] point; this can be set outside of the brush.

'''Important note:''' When rotating brushes the proportions of the brush(es) won't be preserved unless you first do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform permanently]].

==Simple rotation ==

Alternatively, simple rotation can be performed in orthogonal viewports in [[Legacy:Camera Movement|Camera Movement]] mode. CTRL+right-drag rotates in a different direction for each view type, as in the list above, eg: yaw in top view.  

==Problems ==

; The brush shape distorts : 
This is because the brush has scaling applied. Either:
* [[Legacy:Transform Permanently|transform permanently]] before rotating, to fix the scaling into the shape of the brush
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Scaling to remove the scaling.
* do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Rotation to unrotate the brush.

See [[Legacy:Brush Transformation|Brush Transformation]] for more on this.


; The brush shoots off into the distance : 
This is due to the position of the [[Legacy:Pivot|pivot]]. One of the following should work:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Reset -&gt; Reset Pivot
* ALT + click on the brush's origin



; The brush rotates in the wrong axis : 
This is due to '''Gimbal lock''', a consequence of using Euler angles to describe rotation in 3D. In other words, sometimes the pitch, yaw, roll system that the Unreal engine uses causes unexpected results. Here's how to see it:
# create a brush, ideally something that's not symmetrical in all dimensions. A cylinder or stairs will do.
# rotate 90 degrees in top view
# switch to side view and rotate. urg!

This is not a bug, it's a mathematical consequence. If you like, it's a bug in the universe. Here's how to work around it:
* once you're done with a particular orientation, remember to reset brush rotation with the [[Legacy:Brush Context Menu|Brush Context Menu]]. That way you're starting from scratch again.
* if you have to rotate in more than one axis, perform the rotations in the same order as Unreal: pitch, yaw, roll: side view, top view, front view. This won't solve all problems, but rotating in two axes in that order should be fine.


==Beginner Tips on Rotation ==
* Only rotate with the pivot point for the brush in the center of the brush.
* Use the 2d views for rotating where the rotated brush will align with the X, Y or Z axis.
* Edit the brush properties and do precise rotation in the Movement - Rotation - (pitch, roll, yaw) values.  This is generally easier to get the exact rotation than rotating in one of the 2d views. Here are some useful values:
* | '''Value''' | '''Degrees''' |
* |&gt;  8192      |&gt;  45
* |&gt; 16384      |&gt;  90
* |&gt; 24576      |&gt; 135
* |&gt; 32768      |&gt; 180
* Rotate the brush such that its vertices are aligned with the grid points.  This makes it significantly easier to align texture in your finished map. See [[Legacy:Surface Alignment|Surface Alignment]]
* Consider [[Legacy:Brush_Clipping|Brush_Clipping]] to trim down one or more sides of a cube to get the shape you desire.  This has the advantage of allowing you to have one or two sides still parallel to X, Y or Z axis.  This greatly helps when aligning the brush to the floor and also in aligning texture.

==Related Topics ==
* [[Legacy:Toolbox|Toolbox]] reference page
* [[Legacy:Mouse Control|Mouse Control]] full reference of mouse actions
* [[Legacy:UnrealEd Interface|UnrealEd interface]] reference page
* [[Legacy:Architecture|Architecture]] main topic page

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Scaling</title>
    <id>539</id>
    <revision>
      <id>1671</id>
      <timestamp>2005-12-26T20:15:16Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.scale.gif|left|]]

One of the interface modes in the UnrealEd [[Legacy:Toolbox|toolbox]]. This mode lets you scale brushes.

Note that many mappers have found this tool to be buggy: scaling a brush in one axis sometimes causes it to grow in another axis by a non-integer amount. Suggested alternatives are vertex editing, numeric scaling and facedrag mode, all explained below. (this is [[Legacy:Tarquin|tarquin]]'s personal crusade... don't use brush scaling!)

==Visual Scaling==

You must select the brush to scale and keep the ''CTRL'' key pressed.

Then move the mouse over one of the Orthogonal (2d) view, while having the &lt;u&gt;left button&lt;/u&gt; or &lt;u&gt;right button&lt;/u&gt; pressed.

Left button produces an horizontal scaling ,while right button produces a vertical scaling.Depending on which of the orthogonal view you're operating the brush will be scaled in one of its 3 axes.

Brush are scaled around their [[Legacy:Pivot|pivot]] point, which can be set outside of the brush.

==Alternatives==

===Numeric Scaling===

Enter the scaling factors manually in the [[Legacy:Brush|Brush]] properties, MainScale &amp; PostScale.

See also [[Legacy:Brush Transformation|Brush Transformation]]

===Vertex Editing===

Select two corners and stretch it out. (see [[Legacy:Vertex Editing|vertex editing]] for more detail...)

===Facedrag Mode===

This is an experimental mode which can only be accessed with a console command. See [[Legacy:Face Drag|Face drag]] mode.

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Toolbar|Toolbar]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1672</id>
      <timestamp>2003-05-25T09:08:05Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">[[Image:Legacy_button.mode.scale.gif|left|]]

One of the interface modes in the UnrealEd [[Legacy:Toolbox|toolbox]]. This mode lets you scale brushes.

Note that many mappers have found this tool to be buggy: scaling a brush in one axis sometimes causes it to grow in another axis by a non-integer amount. Suggested alternatives are vertex editing, numeric scaling and facedrag mode, all explained below. (this is [[Legacy:Tarquin|tarquin]]'s personal crusade... don't use brush scaling!)

==Visual Scaling ==

You must select the brush to scale and keep the ''CTRL'' key pressed.

Then move the mouse over one of the Orthogonal (2d) view, while having the &lt;u&gt;left button&lt;/u&gt; or &lt;u&gt;right button&lt;/u&gt; pressed.

Left button produces an horizontal scaling ,while right button produces a vertical scaling.Depending on which of the orthogonal view you're operating the brush will be scaled in one of its 3 axes.

Brush are scaled around their [[Legacy:Pivot|pivot]] point, which can be set outside of the brush.

==Alternatives to the Brush Scaling tool ==

===Numeric Scaling ===

Enter the scaling factors manually in the [[Legacy:Brush|Brush]] properties, MainScale &amp; PostScale.

see also [[Legacy:Brush Transformation|Brush Transformation]]

===Vertex Editing ===

Select two corners and stretch it out. (see [[Legacy:Vertex Editing|vertex editing]] for more detail...)

===Facedrag mode ===

This is an experimental mode which can only be accessed with a console command. See [[Legacy:Face Drag|Face drag]] mode.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44378</id>
      <timestamp>2011-04-25T09:37:33Z</timestamp>
      <contributor>
        <ip>67.142.130.33</ip>
      </contributor>
      <text xml:space="preserve">[[Image:Legacy_button.mode.scale.gif|left|]]

One of the interface modes in the UnrealEd [[Legacy:Toolbox|toolbox]]. This mode lets you scale brushes.

Note that many mappers have found this tool to be buggy: scaling a brush in one axis sometimes causes it to grow in another axis by a non-integer amount. Suggested alternatives are vertex editing, numeric scaling and facedrag mode, all explained below. (this is [[Legacy:Tarquin|tarquin]]'s personal crusade... don't use brush scaling!)

==Visual Scaling==

You must select the brush to scale and keep the ''CTRL'' key pressed.

Then move the mouse over one of the Orthogonal (2d) view, while having the &lt;u&gt;left button&lt;/u&gt; or &lt;u&gt;right button&lt;/u&gt; pressed.

Left button produces an horizontal scaling ,while right button produces a vertical scaling.Depending on which of the orthogonal view you're operating the brush will be scaled in one of its 3 axes.

Brush are scaled around their [[Legacy:Pivot|pivot]] point, which can be set outside of the brush.

==Tips==

Never scale an already placed brush, or the vertices will dislodge from the grid.  If you plan on being a frequent user of the tool, always scale the builder brush, apply transformation, and then place the brush.

If you must scale an already placed brush, perform a &quot;&quot;Polygons-&gt;To Brush&quot; (aka &quot;Map Brush Get&quot;), so that the red builder brush takes on the shape of the placed brush, delete the placed brush, scale your builder brush, place a new brush, fix the ordering if you need to.

Remember to apply transformation before rotating, or it will skew.

You can either reset the builder brush, or apply transformation to the builder brush, to get it to take on predictable shapes when selecting presets, rather than scaled equivalents.

Never scale too much, too fast (i.e. zooming way out in the viewport and shooting the mouse down-screen) or it will bug out, neglect the grid, and maybe even start blipping in the opposite direction.  If this happens, its best to just reload the map, or perhaps perform a &quot;map brush get&quot; in order to reset the scaling values.

A brush will reach limits as to how small it will scale.  A standard 256 cubed cube will not scale much below 16 units, because it is function upon the original values.  To scale smaller, scale down, make sure it is still sitting on the grid, apply transformation so it takes on the new values, and continue to scale.

The brush scales away from the selected vertex, so selecting the center vertex and scaling it in all directions in atleast 2 of the 2d viewports will ensure that all the vertices of a cube are on the grid.  Get used to checking all the possible vertices of a cube, and making sure you have scaled all polygon-relevant vertices onto the grid before you place the brush.

It is best to scale from a 2d viewport, and to select vertices from the 3d viewport.

The mode is known as &quot;BrushSnap&quot; in Ued2, rather than &quot;BrushScale&quot;, because it scales according to the grid.  BrushScale ignores the grid, and should be avoided.

Scaling complex brushes will have unintended consequences, such as stairs being to large to step on, or polygons stretching larger the farther they are from the selected vertex (an effect easily of notice in a &quot;hollowed&quot; brush).  Scaling works best with symetrical shapes, such as cubes or cylinders.

While in BrushSnap mode, vertices cannot be selected in the 3d viewport, so one has to switch to camera mode to do this.  It is best to bind keys for switching between camera mode and scaling mode, as well as applying transformation, because a mapper who frequently uses this tool will have to switch between these so often.

If you need to scale something in a diagonal direction, turn it along the y or x axis first, scale it, and then rotate it back.  Otherwise, the outside polygons will be larger than the inside.

==Alternatives==

===Numeric Scaling===

Enter the scaling factors manually in the [[Legacy:Brush|Brush]] properties, MainScale &amp; PostScale.

See also [[Legacy:Brush Transformation|Brush Transformation]]

===Vertex Editing===

Select two corners and stretch it out. (see [[Legacy:Vertex Editing|vertex editing]] for more detail...)

===Facedrag Mode===

This is an experimental mode which can only be accessed with a console command. See [[Legacy:Face Drag|Face drag]] mode.

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Toolbar|Toolbar]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Sinking</title>
    <id>546</id>
    <revision>
      <id>1688</id>
      <timestamp>2005-11-19T19:58:28Z</timestamp>
      <contributor>
        <ip>King Mango</ip>
      </contributor>
      <minor/>
      <comment>added comment about sinking</comment>
      <text xml:space="preserve">This is a technique for adding texture detail to geometry. To see it in action:

# build a simple cube and subtract it
# build a smaller cube, and place the [[Legacy:Red Builder Brush|red builder brush]] in solid space, so one face of the RBB is coplanar with a surface of the subtracted cube.
# add the current shape to the world.

One surface of the additive brush will be visible. This surface &quot;overrides&quot; the larger surface of the subtractive brush. Note that [[Legacy:Brush Order|brush order]] is important.

[[Image:Legacy_brush_sinking.gif|center|'''Left:''' 3D view &amp;ndash; '''Right:''' Side 2D view]]

==Examples ==
* The carpeting in UT's DM-Gothic
* Trim in UT's DM-Grinder
* DM-Falkenstein

==Comments ==

'''Tarquin:''' As far as I can tell this technique splits polys but doesn't create BSP cuts.

'''The G.o.a.T:''' Isn't it better to first substract that smaller cube and then add the smaller cube in that substracted space. I heard that once and I usually do it that way too :/

'''Tarquin:''' subtracting the small cube isn't necessary. The Epic maps add trim brushes into solid space.

'''Birelli:''' yes, but some of the Epic maps are falling apart at the seams. Try rebuilding one and look for some extra BSP errors. They are definitely unstable but just made workable for the release.

'''The G.o.a.T:''' Looking at the Epic maps ain't such a good idea always. There are lots of maps in UT which have messy brushwork, errors (from a technical point a view). To name one DM-Deck16][, this map has several errors.

'''Tarquin:'''  I haven't had any problems adding into solid space to make trim. CliffyB does it &amp; he tends to have good brushwork. We need the l33t BSP expertise of ChrisToth on this one. 

'''The G.o.a.T:''' I always make trims with semisolids ;)

'''EntropicLqd:''' I generally down one of two things to make co-planar trim.  The first is to subtract the brush then re-add it (keeping it the same size) to make the trim, and the second is to use multiple subtractions (use subtracted brushes to create the planes) but I tend not to plan far enough ahead to use this one (unless I'm building a pit).  I've found that smiply adding a brush into solid space will give you some nasty HOM effects.  I've also had it cause some odd collision errors as well.

'''Tarquin:''' The maker of DM-Falkenstein has just informed me that he's used this technique in that map with no problems. It is, AFAIK a design feature of the engine. (I'll maybe draw up a list of things to ask Epic...)

'''W0RF:''' One way or the other, subtracting and re-adding seems to be less advisable than it used to be.  Adding into subtracted space that borders The Great Barrier seems to produce HOM at random times.

'''King Mango''' Subtracting and then adding in the same shape only adds unnecessarily to the complexity of the BSP. If you have problems with sinking, it is because of something else in your level.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1689</id>
      <timestamp>2005-01-14T00:36:54Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>1690</id>
      <timestamp>2005-01-14T02:11:34Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">This is a technique for adding texture detail to geometry. To see it in action:

# build a simple cube and subtract it
# build a smaller cube, and place the [[Legacy:Red Builder Brush|red builder brush]] in solid space, so one face of the RBB is coplanar with a surface of the subtracted cube.
# add the current shape to the world.

One surface of the additive brush will be visible. This surface &quot;overrides&quot; the larger surface of the subtractive brush. Note that [[Legacy:Brush Order|brush order]] is important.

[[Image:Legacy_brush_sinking.gif|center|'''Left:''' 3D view &amp;ndash; '''Right:''' Side 2D view]]

==Examples ==
* The carpeting in UT's DM-Gothic
* Trim in UT's DM-Grinder
* DM-Falkenstein

==Comments ==

'''Tarquin:''' As far as I can tell this technique splits polys but doesn't create BSP cuts.

'''The G.o.a.T:''' Isn't it better to first substract that smaller cube and then add the smaller cube in that substracted space. I heard that once and I usually do it that way too :/

'''Tarquin:''' subtracting the small cube isn't necessary. The Epic maps add trim brushes into solid space.

'''Birelli:''' yes, but some of the Epic maps are falling apart at the seams. Try rebuilding one and look for some extra BSP errors. They are definitely unstable but just made workable for the release.

'''The G.o.a.T:''' Looking at the Epic maps ain't such a good idea always. There are lots of maps in UT which have messy brushwork, errors (from a technical point a view). To name one DM-Deck16][, this map has several errors.

'''Tarquin:'''  I haven't had any problems adding into solid space to make trim. CliffyB does it &amp; he tends to have good brushwork. We need the l33t BSP expertise of ChrisToth on this one. 

'''The G.o.a.T:''' I always make trims with semisolids ;)

'''EntropicLqd:''' I generally down one of two things to make co-planar trim.  The first is to subtract the brush then re-add it (keeping it the same size) to make the trim, and the second is to use multiple subtractions (use subtracted brushes to create the planes) but I tend not to plan far enough ahead to use this one (unless I'm building a pit).  I've found that smiply adding a brush into solid space will give you some nasty HOM effects.  I've also had it cause some odd collision errors as well.

'''Tarquin:''' The maker of DM-Falkenstein has just informed me that he's used this technique in that map with no problems. It is, AFAIK a design feature of the engine. (I'll maybe draw up a list of things to ask Epic...)

'''W0RF:''' One way or the other, subtracting and re-adding seems to be less advisable than it used to be.  Adding into subtracted space that borders The Great Barrier seems to produce HOM at random times.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brush Transformation</title>
    <id>540</id>
    <revision>
      <id>1673</id>
      <timestamp>2006-09-11T09:58:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Brush transformations changes the position, scale or skew of a [[Legacy:Brush|brush]].

==Brush Transformation Modes==
* [[Legacy:Brush Scaling|Brush Scaling]] is used to increase or decrease size
* You can [[Legacy:Brush Rotate|brush rotate]] around all 3 axis
* Mirroring, also known as flipping or reflecting, is done through the [[Legacy:Brush Context Menu|Brush Context Menu]]
* Brush sheering, also known as skewing, is also done through the Brush Context Menu
* Moving a brush is technically a transformation

These transformations do not change the coordinates of the vertices that define the brush; the transformation is applied internally to the brush.  This allows you to make revert back to the original transformation at any time.  

===How to Transform===

Transforming a brush can be achieved in two ways:
# Graphically using the transform modes found in the [[Legacy:Toolbox|toolbox]]
# Numerically using the brush properties window.  

===Two sides to Every Coin===

Transforming a [[Legacy:Brush|brush]] instead of [[Legacy:Vertex Editing|vertex editing]] into a new position or shape allows you to:
* easily make big changes
* undo
* experiment

However:
* errors can occur when combining transformations 
* vertex editing and [[Legacy:Brush Clipping|brush clipping]] do not always work correctly on a transformed brush

===Make it permanent===

Applying [[Legacy:Transform Permanently|Transform permanently]] to a brush
* applies the transformation
* resets all numerical entries (except for location).
* is accessible from the Brush Context Menu.

[[Legacy:Brush Clipping|Brush clipping]], [[Legacy:Vertex Editing|vertex editing]] or further transformations can be applied with impunity, but it's no longer possible to read the previous transformation numbers.

==Related Topics==
* [[Legacy:Brush Hacking|Brush Hacking]]
* [[Legacy:Brushbuilders|Brushbuilders]]

==Comments==

'''Sobiwan:''' I admit it; I'm a butcher.  :)

'''Tarquin:''' Yeah... I'd like to save some of my overview stuff, so I'll shove it down here for now. But this thing is that brush transformations are completely different under UEd 3. Rotations, at least, now transform immediately. I think this is a step back in terms of usefulness; I have no idea why they've changed it.

'''Sobiwan:''' Fair enough.  I dont use UEd3, so I dont learn about it and didnt know about it.  That overview is one hell of a read though!  There is probably a way to losslessly compress the verbage.  :)

'''bmw5002:''' UEd3 doesn't have the numerical brush scale property (or im stupid)! Arrrg!

'''Tarquin:''' no, you're not stupid. They've removed brush scaling. There's still a numeral scaling dialog somewhere, but it's now an immediate transformation of vertex co-ordinates.

{X-dArKwUn-X} I thought it would be a cool idea to take a well known level, and jack-up the total size, to make it look like your bug-sized, but every time I use the scaler OR edit the MainScale/PostScale, all the brushes end up inside eachother, creating hell and bsp holes galore. How do I do this?

'''Wormbo:''' To resize a map properly, you not only have to rescale the brushes (preferably with an integer scaling factor or one that can be written as 1 divided once or several times by 2 so everything stays on the grid) but also have to update the brush positions accordingly.

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]

----

'''Brush transformations''' are mathematical operations carried out on a [[Legacy:Brush|brush]]. Quick high-school geometry refresher: matrix transformations of 3D space can be classified into:
* rotations
* scaling in 1, 2 or 3 axes
* reflections, which are secretly a scaling of -1 in one axis
* skews

UnrealEd can perform all these operations on a brush (though skewing is a little bizarre). The following actions are brush transformations:
* Scaling with [[Legacy:Brush Scaling|Brush Scaling]] mode
* Rotations with [[Legacy:Brush Rotate|Brush rotate]] mode or [[Legacy:Camera Mode|camera mode]]
* Reflections commands in the [[Legacy:Brush Context Menu|Brush Context Menu]]
* Brush sheer mode (possibly)
* Numerical scaling in the Properties.Brush properties: scale and sheer
* Numerical rotation in Properties.Movement.Rotation
* simply moving a brush is in fact also (technically) a brush transformation

All of these changes to a brush do not change the actual co-ordinates of the points that make up the wireframe. Here's a rough analogy: suppose you're making a cartoon and animating a famous mouse. You have a cel with Mickey on a background. Suppose you want to rotate the mouse for some reason: you could erase the picture on the cel and redraw it at an angle. Or, you could just rotate the sheet of celluloid. 

UnrealEd's brush transformations are the same: they keep the wireframe fixed internally and apply numerical transformations to the object that you see and the [[Legacy:BSP|BSP]] compiler processes. To extend the Mickey analogy, the cel can also be stretched, flipped or skewed.

The following properties of the brush are involved:

* MainScale &amp; PostScale (need to figure out exaclty how these work)
** Scale
** SheerAxis
** SheerRate
* Rotation
* Location

Each brush effectively has its own 'local' axes and co-ordinates. The upshot is that this approach has advantages and disadvantages:

===Advantages ===
* undoing or reversing a transformation restores the brush's previous state perfectly. There's no possibility of round-off errors, the way that performing 1 / 3 * 3 on a calculator can give 0.999999.
* it's easy to determine the orientation of a brush, to then apply it other brushes when making complex geometry

===Disadvantages ===
* combining transformations can produce unexpected results, for example gimbal lock when rotating in several axes, or when scaling and rotating
* [[Legacy:Vertex Editing|vertex editing]] and [[Legacy:Brush Clipping|brush clipping]] can have unexpected results on a scaled or rotated brush. 

==Transforming permanently ==

This command in the [[Legacy:Brush Context Menu|Brush Context Menu]] resets all transformations (except location) and keeps the brush shape the same by applying the transformation calculations to the wireframe coordinates. The brush can then be clipped, vertex-edited or have further transformations applied with impunity, but at a cost: it's no longer possible to read off what transformations got it into the current state.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1674</id>
      <timestamp>2006-09-11T02:51:36Z</timestamp>
      <contributor>
        <ip>User-12lmlql.cable.mindspring.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Brush transformations changes the position, scale or skew of a [[Legacy:Brush|brush]].

==Brush Transformation Modes==
* [[Legacy:Brush Scaling|Brush Scaling]] is used to increase or decrease size
* You can [[Legacy:Brush Rotate|brush rotate]] around all 3 axis
* Mirroring, also known as flipping or reflecting, is done through the [[Legacy:Brush Context Menu|Brush Context Menu]]
* Brush sheering, also known as skewing, is also done through the Brush Context Menu
* Moving a brush is technically a transformation

These transformations do not change the coordinates of the vertices that define the brush; the transformation is applied internally to the brush.  This allows you to make revert back to the original transformation at any time.  

===How to Transform===

Transforming a brush can be achieved in two ways:
# Graphically using the transform modes found in the [[Legacy:Toolbox|toolbox]]
# Numerically using the brush properties window.  

===Two sides to Every Coin===

Transforming a [[Legacy:Brush|brush]] instead of [[Legacy:Vertex Editing|vertex editing]] into a new position or shape allows you to:
* easily make big changes
* undo
* experiment

However:
* errors can occur when combining transformations 
* vertex editing and [[Legacy:Brush Clipping|brush clipping]] do not always work correctly on a transformed brush

===Make it permanent===

Applying [[Legacy:Transform Permanently|Transform permanently]] to a brush
* applies the transformation
* resets all numerical entries (except for location).
* is accessible from the Brush Context Menu.

[[Legacy:Brush Clipping|Brush clipping]], [[Legacy:Vertex Editing|vertex editing]] or further transformations can be applied with impunity, but it's no longer possible to read the previous transformation numbers.

==Related Topics==
* [[Legacy:Brush Hacking|Brush Hacking]]
* [[Legacy:Brushbuilders|Brushbuilders]]

==Comments==

'''Sobiwan:''' I admit it; I'm a butcher.  :)

'''Tarquin:''' Yeah... I'd like to save some of my overview stuff, so I'll shove it down here for now. But this thing is that brush transformations are completely different under UEd 3. Rotations, at least, now transform immediately. I think this is a step back in terms of usefulness; I have no idea why they've changed it.

'''Sobiwan:''' Fair enough.  I dont use UEd3, so I dont learn about it and didnt know about it.  That overview is one hell of a read though!  There is probably a way to losslessly compress the verbage.  :)

'''bmw5002:''' UEd3 doesn't have the numerical brush scale property (or im stupid)! Arrrg!

'''Tarquin:''' no, you're not stupid. They've removed brush scaling. There's still a numeral scaling dialog somewhere, but it's now an immediate transformation of vertex co-ordinates.

{X-dArKwUn-X} I thought it would be a cool idea to take a well known level, and jack-up the total size, to make it look like your bug-sized, but every time I use the scaler OR edit the MainScale/PostScale, all the brushes end up inside eachother, creating hell and bsp holes galore. How do I do this?

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]

----

'''Brush transformations''' are mathematical operations carried out on a [[Legacy:Brush|brush]]. Quick high-school geometry refresher: matrix transformations of 3D space can be classified into:
* rotations
* scaling in 1, 2 or 3 axes
* reflections, which are secretly a scaling of -1 in one axis
* skews

UnrealEd can perform all these operations on a brush (though skewing is a little bizarre). The following actions are brush transformations:
* Scaling with [[Legacy:Brush Scaling|Brush Scaling]] mode
* Rotations with [[Legacy:Brush Rotate|Brush rotate]] mode or [[Legacy:Camera Mode|camera mode]]
* Reflections commands in the [[Legacy:Brush Context Menu|Brush Context Menu]]
* Brush sheer mode (possibly)
* Numerical scaling in the Properties.Brush properties: scale and sheer
* Numerical rotation in Properties.Movement.Rotation
* simply moving a brush is in fact also (technically) a brush transformation

All of these changes to a brush do not change the actual co-ordinates of the points that make up the wireframe. Here's a rough analogy: suppose you're making a cartoon and animating a famous mouse. You have a cel with Mickey on a background. Suppose you want to rotate the mouse for some reason: you could erase the picture on the cel and redraw it at an angle. Or, you could just rotate the sheet of celluloid. 

UnrealEd's brush transformations are the same: they keep the wireframe fixed internally and apply numerical transformations to the object that you see and the [[Legacy:BSP|BSP]] compiler processes. To extend the Mickey analogy, the cel can also be stretched, flipped or skewed.

The following properties of the brush are involved:

* MainScale &amp; PostScale (need to figure out exaclty how these work)
** Scale
** SheerAxis
** SheerRate
* Rotation
* Location

Each brush effectively has its own 'local' axes and co-ordinates. The upshot is that this approach has advantages and disadvantages:

===Advantages ===
* undoing or reversing a transformation restores the brush's previous state perfectly. There's no possibility of round-off errors, the way that performing 1 / 3 * 3 on a calculator can give 0.999999.
* it's easy to determine the orientation of a brush, to then apply it other brushes when making complex geometry

===Disadvantages ===
* combining transformations can produce unexpected results, for example gimbal lock when rotating in several axes, or when scaling and rotating
* [[Legacy:Vertex Editing|vertex editing]] and [[Legacy:Brush Clipping|brush clipping]] can have unexpected results on a scaled or rotated brush. 

==Transforming permanently ==

This command in the [[Legacy:Brush Context Menu|Brush Context Menu]] resets all transformations (except location) and keeps the brush shape the same by applying the transformation calculations to the wireframe coordinates. The brush can then be clipped, vertex-edited or have further transformations applied with impunity, but at a cost: it's no longer possible to read off what transformations got it into the current state.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BrushBuilder</title>
    <id>533</id>
    <revision>
      <id>1655</id>
      <timestamp>2005-09-01T15:14:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; BrushBuilder (Package: Editor)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; BrushBuilder (Package: Editor)}}

This is the base class for [[Legacy:UnrealEd|UnrealEd]]'s [[Legacy:Brushbuilders|Brushbuilders]] (mappers should read that page for information on how to use the tools). The rest of this page is more of interest to coders who want to understand or make new brushbuilders. 

==UnrealEd==

The brushbuilder buttons that appear in UnrealEd's [[Legacy:Toolbox|toolbox]] are generated by subclasses of this base class. UnrealEd creates an interface button for all the first non-abstract child classes, ie:

+ Object

++ BrushBuilder 

+++ MyChildClass &amp;ndash; is loaded

++++ MyGrandchildClass  &amp;ndash; isn't loaded

+++ MyAbstractChildClass &amp;ndash; abstract, not loaded

++++ MyOtherGrandchildClass &amp;ndash; is loaded

Functions are inherited as you'd expect, but properties defined in a parent class won't appear in the parameters. In other words, only properties that would appear under the classname if this were a regular actor appear in the brushbuilder parameters box.

==Interface ==

Each script needs a Build() event; this is called when the user clicks the interface icons or the Build button in the parameters window. The parameters seen here correspond to editable variables declared in the class. 

==Functions ==

Several native functions perform the basic building commands. 

Rough notes on brush creation: 
: This is pure speculation on my (tarquin's) part. The vertex building commands add points as vectors to a dynamic array. The poly building commands then pick these out to define the polys. The array is then discarded for the resulting brush, as can be seen in a brush itself ([[Legacy:Brush Hacking|Brush Hacking]]), each poly has a segregated vertex list. At the construction stage, however, a vertex from the array can be used for several polys.
: BrginBrush() reinitialises the vertex array. This is kept for each class, not in the RBB, so there's (unfortunately) no cross-talk possible between brushbuilder classes.

===BadParameters ===

&lt;uscript&gt;
BadParameters( optional string Message )
&lt;/uscript&gt;

This function produces a dialog box in UnrealEd displaying ''Message'' and an OK button. It should be called to alert the user of parameters that are out of range, or incompatible options. To span the messgae over several lines in the dialog box, use a string expression with &quot;$ Chr(13) $&quot;. The Epic brushbuilder scripts have a block of input-checking conditions after declaring any local variables in the Build() function.

&lt;uscript&gt;
if( MyParameter &lt;= 0 )
	return BadParameters();
if( HALisUnhappy )
	return BadParameters(&quot;I'm sorry, David, I can't let you do that.&quot;);
if( Confustication &amp;&amp; MyParameter &gt; 16 )
	BadParameters(&quot;You are about to make a brush that can't be used as a subtract. Click to proceed.&quot;);
&lt;/uscript&gt;

A little innovation of Tarquin's not seen in the native builders is using &lt;code&gt;BadParameters()&lt;/code&gt; without &lt;code&gt;return&lt;/code&gt; as seen in the third example above, to warn the user of non-fatal problems: when the user clicks OK the builder will proceed. If you intend to release your builder, it's vital that you prevent the user from crashing UEd or creating BSP errors in their levels as a result of bad parameters.

===Setting up===

&lt;uscript&gt;
BeginBrush( bool MergeCoplanars , name Group )
&lt;/uscript&gt;

This initialises the [[Legacy:Red Builder Brush|red builder brush]]. If not included, the vertices and polys from the last build with this class persist, and the brush will be a horrible mess (even if it doesn't look like a mess, polys will be super-imposed. Try applying a masked texture to see!)

; MergeCoplanars : if set to true, the resulting brush will have coplanar sets of polygons merged. Note that non-adjacent polys will be merged if their textures are oriented in the same direction &amp;ndash; the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] does this sometimes. Since texture orientation is determined (I think) by the order in which the vertices are listed in the poly definition function call, some care may be needed.
; Group : Sets the group name of the brush. Not sure of its purpose. The build-in brushbuilders allow the user to specify this.  

&lt;uscript&gt;
EndBrush()
&lt;/uscript&gt;

This wraps up the brush building process. Used to close the Build function thus: 

&lt;uscript&gt;
return EndBrush();
&lt;/uscript&gt;

===Vertex building ===

Two functions add vertices to the list, taking the position either from a vector or 3 seperate co-ordinates:

&lt;uscript&gt;
int Vertexv( vector V );
int Vertex3f( float x, float y, float z );
&lt;/uscript&gt;

They return the index of the vertex just created. 

===Vertex inspection ===

&lt;uscript&gt;
GetVertexCount()
&lt;/uscript&gt;

Returns the number of vertices currently in the internal array. Since these start with 0, this number is also the index of the next vertex to be built. This is useful for poly building within a function call, as seen in Epic's CylinderBuilders for example.  

&lt;uscript&gt;
GetVertex( int i )
&lt;/uscript&gt;

Returns the position vector of a vertex from the array. Useful for bug-tracking, thus:

&lt;uscript&gt;
// show me the location of vertex i:
log(i $ &quot;: &quot; $ (GetVertex(i))); 
&lt;/uscript&gt;

There is also a function GetPolyCount(), which I assume returns the number of polys defined.

===Poly building ===

Several functions define polygons. They all take similar parameters. 

&lt;uscript&gt;
// build a 3-sided polygon:
Poly3i( Direction, i, j, k, ItemName, PolyFlags )

// build a 4-sided polygon:
Poly4i( Direction, i, j, k, l, ItemName, PolyFlags )

// build a polygon with any number of sides:
PolyBegin( Direction, ItemName, PolyFlags )
Polyi( i )
PolyEnd()
&lt;/uscript&gt;

Poly3i and Poly4i build polys from 3 and 4 points. PolyBegin, Polyi and PolyEnd work together to build a poly from any number of points. Polyi is often placed inside a for() loop (see [[Legacy:Flow Syntax|Flow Syntax]]). Their parameters all work in the same way.

; int Direction : Determines which way the poly faces. This should be +1 or -1, though I suspect any value will work and the sign will determine the result. With Direction=1, the vertices are taken in an anti-clockwise direction when looking at the poly from the exterior. When working out which order to take vertices, remember the [[Legacy:Unreal World|Unreal World]] uses a left-handed co-ordinate system. As a last resort, list them in sequence, try building and if the poly is visible from the wrong side, flip the value of Direction or re-order them.

; int i, int j, int k, int l : specifies an item from the vertex array.

; optional name ItemName : a name for the poly. Polys are grouped by name as a convenience to the mapper. The name itself doesn't matter. This is used only for the SHIFT+I command (see [[Legacy:Surface Selection|Surface Selection]]). This can be set with an expression: see [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]].

; optional int PolyFlags : flags for that polygon. Omit this parameter to make regular polys; set to 0x00000108 for a two-sided sheet. See [[Legacy:PolyFlags|PolyFlags]] for the full list.

==Properties ==

Two properties are unused by the script but are read by UnrealEd to create the interface. Set them in [[Legacy:Default Properties|default properties]].

; BitmapFilename : the bitmap file to display on the button. This must be stored in {[[Legacy:Base Directory|Base Directory]]}/System/editorres. The value required is the name of the file without the .BMP extension.
; ToolTip : The hint text that appears when the user hovers the mouse pointer on the button.

==Known Subclasses ==

Built-in:
* [[Legacy:ConeBuilder|ConeBuilder]]
* [[Legacy:CubeBuilder|CubeBuilder]]
* [[Legacy:CurvedStairBuilder|CurvedStairBuilder]]
* [[Legacy:CylinderBuilder|CylinderBuilder]]
* [[Legacy:LinearStairBuilder|LinearStairBuilder]]
* [[Legacy:SheetBuilder|SheetBuilder]]
* [[Legacy:SpiralStairBuilder|SpiralStairBuilder]]
* [[Legacy:TerrainBuilder|TerrainBuilder]]
* [[Legacy:TetrahedronBuilder|TetrahedronBuilder]]
* [[Legacy:VolumetricBuilder|VolumetricBuilder]]

Custom:
* [[Legacy:TarquinBuilderBase|TarquinBuilderBase]] (not yet released)
* [[Legacy:TarquinCylinderBuilder|TarquinCylinderBuilder]]
* [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]]
* [[Legacy:TarquinPanoramaBuilder|TarquinPanoramaBuilder]]
* [[Legacy:TarquinTorusBuilder|TarquinTorusBuilder]]

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]]: reference page for the built-in brushbuilders
* [[Legacy:Red Builder Brush|Red builder brush]]
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] explains how to create your own scripts

==Custom Brushbuilders ==

These add extra buttons to the interface.
* [http://www.planetunreal.com/tarquin/ Tarquin's UT], home of his custom brush builders.
** [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]]
** [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]]
* [[Legacy:Zxanphorian Brushbuilders|Zxanphorian Brushbuilders]]
* [http://www.unrealediting.de/files/index.php3?view=buttons Framebuilder], by JohnMcL.
* [http://members.home.com/darendash/ Unreal Realm Of Concepts], home of the Platonic Solids builder. 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1656</id>
      <timestamp>2004-07-22T04:29:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the class definition for Brushbuilder intended for coders who want to understand or make new brushbuilders.  Mappers should see [[Legacy:Brushbuilders|Brushbuilders]] for how to use it.

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; BrushBuilder (Package: Editor)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; BrushBuilder (Package: Editor)}}

The brushbuilder buttons that appear in UnrealEd's [[Legacy:Toolbox|toolbox]] are generated by subclasses of this base class. UnrealEd creates an interface button for all the first non-abstract child classes, ie:

{{classbox|[[Legacy:Object|Object]] &gt;&gt; BrushBuilder &gt;&gt; MyChildClass ''is loaded''}}

{{classbox|[[Legacy:Object|Object]] &gt;&gt; BrushBuilder &gt;&gt; MyChildClass &gt;&gt; MyGrandchildClass  ''isn't loaded''}}

{{classbox|[[Legacy:Object|Object]] &gt;&gt; BrushBuilder &gt;&gt; MyAbstractChildClass &gt;&gt; MyGrandchildClass ''is loaded''}}

==Interface ==

Each script needs a Build() event; this is called when the user clicks the interface icons or the Build button in the parameters window. The parameters seen here correspond to editable variables declared in the class. 

==Functions ==

Several native functions perform the basic building commands. 

Rough notes on brush creation: 
: This is pure speculation on my (tarquin's) part. The vertex building commands add points as vectors to a dynamic array. The poly building commands then pick these out to define the polys. The array is then discarded for the resulting brush, as can be seen in a brush itself ([[Legacy:Brush Hacking|Brush Hacking]]), each poly has a segregated vertex list. At the construction stage, however, a vertex from the array can be used for several polys.
: BrginBrush() reinitialises the vertex array. This is kept for each class, not in the RBB, so there's (unfortunately) no cross-talk possible between brushbuilder classes.

===BadParameters ===

&lt;uscript&gt;
BadParameters( optional string Message )
&lt;/uscript&gt;

This function produces a dialog box in UnrealEd displaying ''Message'' and an OK button. It should be called to alert the user of parameters that are out of range, or incompatible options. To span the messgae over several lines in the dialog box, use a string expression with &quot;$ Chr(13) $&quot;. The Epic brushbuilder scripts have a block of input-checking conditions after declaring any local variables in the Build() function.

&lt;uscript&gt;
if( MyParameter &lt;= 0 )
	return BadParameters();
if( HALisUnhappy )
	return BadParameters(&quot;I'm sorry, David, I can't let you do that.&quot;);
if( Confustication &amp;&amp; MyParameter &gt; 16 )
	BadParameters(&quot;You are about to make a brush that can't be used as a subtract. Click to proceed.&quot;);
&lt;/uscript&gt;

A little innovation of Tarquin's not seen in the native builders is using &lt;code&gt;BadParameters()&lt;/code&gt; without &lt;code&gt;return&lt;/code&gt; as seen in the third example above, to warn the user of non-fatal problems: when the user clicks OK the builder will proceed. If you intend to release your builder, it's vital that you prevent the user from crashing UEd or creating BSP errors in their levels as a result of bad parameters.

===Setting up===

&lt;uscript&gt;
BeginBrush( bool MergeCoplanars , name Group )
&lt;/uscript&gt;

This initialises the [[Legacy:Red Builder Brush|red builder brush]]. If not included, the vertices and polys from the last build with this class persist, and the brush will be a horrible mess (even if it doesn't look like a mess, polys will be super-imposed. Try applying a masked texture to see!)

; MergeCoplanars : if set to true, the resulting brush will have coplanar sets of polygons merged. Note that non-adjacent polys will be merged if their textures are oriented in the same direction &amp;ndash; the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] does this sometimes. Since texture orientation is determined (I think) by the order in which the vertices are listed in the poly definition function call, some care may be needed.
; Group : Sets the group name of the brush. Not sure of its purpose. The build-in brushbuilders allow the user to specify this.  

&lt;uscript&gt;
EndBrush()
&lt;/uscript&gt;

This wraps up the brush building process. Used to close the Build function thus: 

&lt;uscript&gt;
return EndBrush();
&lt;/uscript&gt;

===Vertex building ===

Two functions add vertices to the list, taking the position either from a vector or 3 seperate co-ordinates:

&lt;uscript&gt;
int Vertexv( vector V );
int Vertex3f( float x, float y, float z );
&lt;/uscript&gt;

They return the index of the vertex just created. 

===Vertex inspection ===

&lt;uscript&gt;
GetVertexCount()
&lt;/uscript&gt;

Returns the number of vertices currently in the internal array. Since these start with 0, this number is also the index of the next vertex to be built. This is useful for poly building within a function call, as seen in Epic's CylinderBuilders for example.  

&lt;uscript&gt;
GetVertex( int i )
&lt;/uscript&gt;

Returns the position vector of a vertex from the array. Useful for bug-tracking, thus:

&lt;uscript&gt;
// show me the location of vertex i:
log(i $ &quot;: &quot; $ (GetVertex(i))); 
&lt;/uscript&gt;

There is also a function GetPolyCount(), which I assume returns the number of polys defined.

===Poly building ===

Several functions define polygons. They all take similar parameters. 

&lt;uscript&gt;
// build a 3-sided polygon:
Poly3i( Direction, i, j, k, ItemName, PolyFlags )

// build a 4-sided polygon:
Poly4i( Direction, i, j, k, l, ItemName, PolyFlags )

// build a polygon with any number of sides:
PolyBegin( Direction, ItemName, PolyFlags )
Polyi( i )
PolyEnd()
&lt;/uscript&gt;

Poly3i and Poly4i build polys from 3 and 4 points. PolyBegin, Polyi and PolyEnd work together to build a poly from any number of points. Polyi is often placed inside a for() loop (see [[Legacy:Flow Syntax|Flow Syntax]]). Their parameters all work in the same way.

; int Direction : Determines which way the poly faces. This should be +1 or -1, though I suspect any value will work and the sign will determine the result. With Direction=1, the vertices are taken in an anti-clockwise direction when looking at the poly from the exterior. When working out which order to take vertices, remember the [[Legacy:Unreal World|Unreal World]] uses a left-handed co-ordinate system. As a last resort, list them in sequence, try building and if the poly is visible from the wrong side, flip the value of Direction or re-order them.

; int i, int j, int k, int l : specifies an item from the vertex array.

; optional name ItemName : a name for the poly. Polys are grouped by name as a convenience to the mapper. The name itself doesn't matter. This is used only for the SHIFT+I command (see [[Legacy:Surface Selection|Surface Selection]]). This can be set with an expression: see [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]].

; optional int PolyFlags : flags for that polygon. Omit this parameter to make regular polys; set to 0x00000108 for a two-sided sheet. See [[Legacy:PolyFlags|PolyFlags]] for the full list.

==Properties ==

Two properties are unused by the script but are read by UnrealEd to create the interface. Set them in [[Legacy:Default Properties|default properties]].

; BitmapFilename : the bitmap file to display on the button. This must be stored in {[[Legacy:Base Directory|Base Directory]]}/System/editorres. The value required is the name of the file without the .BMP extension.
; ToolTip : The hint text that appears when the user hovers the mouse pointer on the button.

==Known Subclasses ==

Built-in:
* [[Legacy:ConeBuilder|ConeBuilder]]
* [[Legacy:CubeBuilder|CubeBuilder]]
* [[Legacy:CurvedStairBuilder|CurvedStairBuilder]]
* [[Legacy:CylinderBuilder|CylinderBuilder]]
* [[Legacy:LinearStairBuilder|LinearStairBuilder]]
* [[Legacy:SheetBuilder|SheetBuilder]]
* [[Legacy:SpiralStairBuilder|SpiralStairBuilder]]
* [[Legacy:TerrainBuilder|TerrainBuilder]]
* [[Legacy:TetrahedronBuilder|TetrahedronBuilder]]
* [[Legacy:VolumetricBuilder|VolumetricBuilder]]

Custom:
* [[Legacy:TarquinBuilderBase|TarquinBuilderBase]] (not yet released)
* [[Legacy:TarquinCylinderBuilder|TarquinCylinderBuilder]]
* [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]]
* [[Legacy:TarquinPanoramaBuilder|TarquinPanoramaBuilder]]
* [[Legacy:TarquinTorusBuilder|TarquinTorusBuilder]]

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]]: reference page for the built-in brushbuilders
* [[Legacy:Red Builder Brush|Red builder brush]]
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] explains how to create your own scripts

==Custom Brushbuilders ==

These add extra buttons to the interface.
* [http://www.planetunreal.com/tarquin/ Tarquin's UT], home of his custom brush builders.
** [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]]
** [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]]
* [[Legacy:Zxanphorian Brushbuilders|Zxanphorian Brushbuilders]]
* [http://www.unrealediting.de/files/index.php3?view=buttons Framebuilder], by JohnMcL.
* [http://members.home.com/darendash/ Unreal Realm Of Concepts], home of the Platonic Solids builder. 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1657</id>
      <timestamp>2005-09-01T15:12:57Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; BrushBuilder (Package: Editor)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; BrushBuilder (Package: Editor)}}

This is the base class for [[Legacy:UnrealEd|UnrealEd]]'s [[Legacy:Brushbuilders|Brushbuilders]] (mappers should read that page for information on how to use the tools). The rest of this page is more of interest to coders who want to understand or make new brushbuilders. 

==UnrealEd==

The brushbuilder buttons that appear in UnrealEd's [[Legacy:Toolbox|toolbox]] are generated by subclasses of this base class. UnrealEd creates an interface button for all the first non-abstract child classes, ie:

+ Object

++ BrushBuilder 

+++ MyChildClass &amp;ndash; is loaded

++++ MyGrandchildClass  &amp;ndash; isn't loaded

+++ MyAbstractChildClass &amp;ndash; abstract, not loaded

++++ MyOtherGrandchildClass &amp;ndash; is loaded

Functions are inherited as you'd expect, but properties defined in a parent class won't appear in the parameters.

==Interface ==

Each script needs a Build() event; this is called when the user clicks the interface icons or the Build button in the parameters window. The parameters seen here correspond to editable variables declared in the class. 

==Functions ==

Several native functions perform the basic building commands. 

Rough notes on brush creation: 
: This is pure speculation on my (tarquin's) part. The vertex building commands add points as vectors to a dynamic array. The poly building commands then pick these out to define the polys. The array is then discarded for the resulting brush, as can be seen in a brush itself ([[Legacy:Brush Hacking|Brush Hacking]]), each poly has a segregated vertex list. At the construction stage, however, a vertex from the array can be used for several polys.
: BrginBrush() reinitialises the vertex array. This is kept for each class, not in the RBB, so there's (unfortunately) no cross-talk possible between brushbuilder classes.

===BadParameters ===

&lt;uscript&gt;
BadParameters( optional string Message )
&lt;/uscript&gt;

This function produces a dialog box in UnrealEd displaying ''Message'' and an OK button. It should be called to alert the user of parameters that are out of range, or incompatible options. To span the messgae over several lines in the dialog box, use a string expression with &quot;$ Chr(13) $&quot;. The Epic brushbuilder scripts have a block of input-checking conditions after declaring any local variables in the Build() function.

&lt;uscript&gt;
if( MyParameter &lt;= 0 )
	return BadParameters();
if( HALisUnhappy )
	return BadParameters(&quot;I'm sorry, David, I can't let you do that.&quot;);
if( Confustication &amp;&amp; MyParameter &gt; 16 )
	BadParameters(&quot;You are about to make a brush that can't be used as a subtract. Click to proceed.&quot;);
&lt;/uscript&gt;

A little innovation of Tarquin's not seen in the native builders is using &lt;code&gt;BadParameters()&lt;/code&gt; without &lt;code&gt;return&lt;/code&gt; as seen in the third example above, to warn the user of non-fatal problems: when the user clicks OK the builder will proceed. If you intend to release your builder, it's vital that you prevent the user from crashing UEd or creating BSP errors in their levels as a result of bad parameters.

===Setting up===

&lt;uscript&gt;
BeginBrush( bool MergeCoplanars , name Group )
&lt;/uscript&gt;

This initialises the [[Legacy:Red Builder Brush|red builder brush]]. If not included, the vertices and polys from the last build with this class persist, and the brush will be a horrible mess (even if it doesn't look like a mess, polys will be super-imposed. Try applying a masked texture to see!)

; MergeCoplanars : if set to true, the resulting brush will have coplanar sets of polygons merged. Note that non-adjacent polys will be merged if their textures are oriented in the same direction &amp;ndash; the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] does this sometimes. Since texture orientation is determined (I think) by the order in which the vertices are listed in the poly definition function call, some care may be needed.
; Group : Sets the group name of the brush. Not sure of its purpose. The build-in brushbuilders allow the user to specify this.  

&lt;uscript&gt;
EndBrush()
&lt;/uscript&gt;

This wraps up the brush building process. Used to close the Build function thus: 

&lt;uscript&gt;
return EndBrush();
&lt;/uscript&gt;

===Vertex building ===

Two functions add vertices to the list, taking the position either from a vector or 3 seperate co-ordinates:

&lt;uscript&gt;
int Vertexv( vector V );
int Vertex3f( float x, float y, float z );
&lt;/uscript&gt;

They return the index of the vertex just created. 

===Vertex inspection ===

&lt;uscript&gt;
GetVertexCount()
&lt;/uscript&gt;

Returns the number of vertices currently in the internal array. Since these start with 0, this number is also the index of the next vertex to be built. This is useful for poly building within a function call, as seen in Epic's CylinderBuilders for example.  

&lt;uscript&gt;
GetVertex( int i )
&lt;/uscript&gt;

Returns the position vector of a vertex from the array. Useful for bug-tracking, thus:

&lt;uscript&gt;
// show me the location of vertex i:
log(i $ &quot;: &quot; $ (GetVertex(i))); 
&lt;/uscript&gt;

There is also a function GetPolyCount(), which I assume returns the number of polys defined.

===Poly building ===

Several functions define polygons. They all take similar parameters. 

&lt;uscript&gt;
// build a 3-sided polygon:
Poly3i( Direction, i, j, k, ItemName, PolyFlags )

// build a 4-sided polygon:
Poly4i( Direction, i, j, k, l, ItemName, PolyFlags )

// build a polygon with any number of sides:
PolyBegin( Direction, ItemName, PolyFlags )
Polyi( i )
PolyEnd()
&lt;/uscript&gt;

Poly3i and Poly4i build polys from 3 and 4 points. PolyBegin, Polyi and PolyEnd work together to build a poly from any number of points. Polyi is often placed inside a for() loop (see [[Legacy:Flow Syntax|Flow Syntax]]). Their parameters all work in the same way.

; int Direction : Determines which way the poly faces. This should be +1 or -1, though I suspect any value will work and the sign will determine the result. With Direction=1, the vertices are taken in an anti-clockwise direction when looking at the poly from the exterior. When working out which order to take vertices, remember the [[Legacy:Unreal World|Unreal World]] uses a left-handed co-ordinate system. As a last resort, list them in sequence, try building and if the poly is visible from the wrong side, flip the value of Direction or re-order them.

; int i, int j, int k, int l : specifies an item from the vertex array.

; optional name ItemName : a name for the poly. Polys are grouped by name as a convenience to the mapper. The name itself doesn't matter. This is used only for the SHIFT+I command (see [[Legacy:Surface Selection|Surface Selection]]). This can be set with an expression: see [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]].

; optional int PolyFlags : flags for that polygon. Omit this parameter to make regular polys; set to 0x00000108 for a two-sided sheet. See [[Legacy:PolyFlags|PolyFlags]] for the full list.

==Properties ==

Two properties are unused by the script but are read by UnrealEd to create the interface. Set them in [[Legacy:Default Properties|default properties]].

; BitmapFilename : the bitmap file to display on the button. This must be stored in {[[Legacy:Base Directory|Base Directory]]}/System/editorres. The value required is the name of the file without the .BMP extension.
; ToolTip : The hint text that appears when the user hovers the mouse pointer on the button.

==Known Subclasses ==

Built-in:
* [[Legacy:ConeBuilder|ConeBuilder]]
* [[Legacy:CubeBuilder|CubeBuilder]]
* [[Legacy:CurvedStairBuilder|CurvedStairBuilder]]
* [[Legacy:CylinderBuilder|CylinderBuilder]]
* [[Legacy:LinearStairBuilder|LinearStairBuilder]]
* [[Legacy:SheetBuilder|SheetBuilder]]
* [[Legacy:SpiralStairBuilder|SpiralStairBuilder]]
* [[Legacy:TerrainBuilder|TerrainBuilder]]
* [[Legacy:TetrahedronBuilder|TetrahedronBuilder]]
* [[Legacy:VolumetricBuilder|VolumetricBuilder]]

Custom:
* [[Legacy:TarquinBuilderBase|TarquinBuilderBase]] (not yet released)
* [[Legacy:TarquinCylinderBuilder|TarquinCylinderBuilder]]
* [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]]
* [[Legacy:TarquinPanoramaBuilder|TarquinPanoramaBuilder]]
* [[Legacy:TarquinTorusBuilder|TarquinTorusBuilder]]

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]]: reference page for the built-in brushbuilders
* [[Legacy:Red Builder Brush|Red builder brush]]
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] explains how to create your own scripts

==Custom Brushbuilders ==

These add extra buttons to the interface.
* [http://www.planetunreal.com/tarquin/ Tarquin's UT], home of his custom brush builders.
** [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]]
** [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]]
* [[Legacy:Zxanphorian Brushbuilders|Zxanphorian Brushbuilders]]
* [http://www.unrealediting.de/files/index.php3?view=buttons Framebuilder], by JohnMcL.
* [http://members.home.com/darendash/ Unreal Realm Of Concepts], home of the Platonic Solids builder. 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BrushBuilder (DX)</title>
    <id>635</id>
    <revision>
      <id>1891</id>
      <timestamp>2006-11-26T03:59:16Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Removed Delegates heading, because there are no Delegates</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; BrushBuilder (Editor)}}

Base class of UnrealEd brush builders.

==Notes==
* [[Legacy:Unreal Tournament|Unreal Tournament]] has two new properties for [[Legacy:UnrealEd 2|UnrealEd 2]]:
** BitmapFilename
** Tooltip

==Properties==
; name Group : 
; bool MergeCoplanars : 
; array&lt;BuilderPoly&gt; Polys : 
; array&lt;vector&gt; Vertices : 

==Structures==

===BuilderPoly===

; int Direction : 
; name Item : 
; int PolyFlags : 
; array&lt;int&gt; VertexIndices : 

==Functions==
; bool BadParameters( optional string msg ): 
;  BeginBrush( bool MergeCoplanars , name Group ): 
; bool EndBrush( ): 
; int GetPolyCount( ): 
; vector GetVertex( int i ): 
; int GetVertexCount( ): 
;  Poly3i( int Direction , int i , int j , int k , optional name ItemName , optional int PolyFlags ): 
;  Poly4i( int Direction , int i , int j , int k , int l , optional name ItemName , optional int PolyFlags ): 
;  PolyBegin( int Direction , optional name ItemName , optional int PolyFlags ): 
;  PolyEnd( ): 
;  Polyi( int i ): 
; int Vertex3f( float x , float y , float z ): 
; int Vertexv( vector v ): 

==Events==
; bool Build( ): 

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1892</id>
      <timestamp>2004-02-01T04:12:25Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Deus Ex|Deus Ex]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]}}

BrushBuilder: Base class of UnrealEd brush builders.

==Notes==
* [[Legacy:Unreal Tournament|Unreal Tournament]] has two new properties (for UnrealEd 2.0?:
** BitmapFilename
** Tooltip

==Properties==
; name Group : 
; bool MergeCoplanars : 
; array&lt;BuilderPoly&gt; Polys : 
; array&lt;vector&gt; Vertices : 

==Structures==

===BuilderPoly===

; int Direction : 
; name Item : 
; int PolyFlags : 
; array&lt;int&gt; VertexIndices : 

==Delegates==

==Functions==
; bool BadParameters( optional string msg ): 
;  BeginBrush( bool MergeCoplanars , name Group ): 
; bool EndBrush( ): 
; int GetPolyCount( ): 
; vector GetVertex( int i ): 
; int GetVertexCount( ): 
;  Poly3i( int Direction , int i , int j , int k , optional name ItemName , optional int PolyFlags ): 
;  Poly4i( int Direction , int i , int j , int k , int l , optional name ItemName , optional int PolyFlags ): 
;  PolyBegin( int Direction , optional name ItemName , optional int PolyFlags ): 
;  PolyEnd( ): 
;  Polyi( int i ): 
; int Vertex3f( float x , float y , float z ): 
; int Vertexv( vector v ): 

==Events==
; bool Build( ):</text>
    </revision>
    <revision>
      <id>1893</id>
      <timestamp>2004-02-10T05:09:16Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; BrushBuilder (Editor)}}

Base class of UnrealEd brush builders.

==Notes==
* [[Legacy:Unreal Tournament|Unreal Tournament]] has two new properties for [[Legacy:UnrealEd 2|UnrealEd 2]]:
** BitmapFilename
** Tooltip

==Properties==
; name Group : 
; bool MergeCoplanars : 
; array&lt;BuilderPoly&gt; Polys : 
; array&lt;vector&gt; Vertices : 

==Structures==

===BuilderPoly===

; int Direction : 
; name Item : 
; int PolyFlags : 
; array&lt;int&gt; VertexIndices : 

==Delegates==

==Functions==
; bool BadParameters( optional string msg ): 
;  BeginBrush( bool MergeCoplanars , name Group ): 
; bool EndBrush( ): 
; int GetPolyCount( ): 
; vector GetVertex( int i ): 
; int GetVertexCount( ): 
;  Poly3i( int Direction , int i , int j , int k , optional name ItemName , optional int PolyFlags ): 
;  Poly4i( int Direction , int i , int j , int k , int l , optional name ItemName , optional int PolyFlags ): 
;  PolyBegin( int Direction , optional name ItemName , optional int PolyFlags ): 
;  PolyEnd( ): 
;  Polyi( int i ): 
; int Vertex3f( float x , float y , float z ): 
; int Vertexv( vector v ): 

==Events==
; bool Build( ): 

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brushbuilders</title>
    <id>534</id>
    <revision>
      <id>1658</id>
      <timestamp>2006-11-26T13:01:53Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Change link from Glass to Making Windows</comment>
      <text xml:space="preserve">'''Brushbuilders''' are tools which forge the [[Legacy:Red Builder Brush|red builder brush]] into basic shapes.  They are the 3rd group of buttons in the UnrealEd [[Legacy:Toolbox|toolbox]].  Coders that want to understand or make new ones should see the class definition of [[Legacy:BrushBuilder|BrushBuilder]].

==Brushbuilders interface ==

To apply the shape to the red builder brush, either:
* Click a button to forge the red builder brush with the default shape and dimensions.
* Right-click a button to open the floating Brushbuilder parameters window.

===Parameters ===

Numeric parameters accept a mathematical expression, for example &quot;=64+128&quot; or &quot;=4*(256+128)&quot;. 

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Operator'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;*&lt;/code&gt;
|Multiplication
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;/&lt;/code&gt;
|Division
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;+&lt;/code&gt;
|Addition
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;-&lt;/code&gt;
|Subtraction
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;()&lt;/code&gt;
|Grouping, for example: &lt;code&gt;=(128+64)/2=&lt;/code&gt; yields &lt;code&gt;96&lt;/code&gt;
|}

Parameters with a mini drop-down menu (true/false and [[Legacy:Enumeration|enumeration]]s) can be advanced to the next option by double-clicking the parameter name or the value box.

Each brushbuilder remembers its own parameters throughout the UnrealEd session

If shapes seem distorted or rotated, check the red builder brush for [[Legacy:Brush Transformation|brush transformation]]; do [[Legacy:Transform Permanently|transform permanently]] to quickly cure this.

==Default Builders ==

{|

|-
|
===Cube ===

Creates cubes and box shapes in general.
: Default: 256x256x256 cube

===Cylinder ===

Creates cylinders
: Default: 8 sided cylinder, 256 height, 512 radius.

===Tetrahedron ===

Builds an approximation of a sphere. Tears the [[Legacy:BSP|BSP]] to shreds, so use sparingly.

===Spiral Stairs ===

These can't be used as a subtractive brush, as they leave sheet polys between each step. Use the alternative [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]] from the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack instead.

===Terrain ===

Creates a tesselated cube for use in creating terrain. ''This is a leftover from [[Legacy:UnrealEd 2|UnrealEd 2]]; realistic [[Legacy:Terrain|terrain]] is now made separately. In pre-[[Legacy:UT2003|UT2003]] versions, it is recommended to use an external terrain generator or [[Legacy:3D Studio Max|3D Studio Max]] to create pleasing, more realistic terrain.  See [[Legacy:Making Terrain (UT)|Making Terrain (UT)]].''



|
[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

|
===Sheet ===

Creates rectangular [[Legacy:Sheet|sheet]] brushes, used to make [[Legacy:Making Windows|glass]], [[Legacy:Zone Portal|zone portal]]s etc. For more complex shapes, use the [[Legacy:2D Shape Editor|2D Shape Editor]].

===Cone ===

Creates a cone.

===Curved Stairs ===

Creates a curved staircase.

===Linear Stairs ===

Creates a standard staircase.

===Volumetric ===

Makes a collection of [[Legacy:Sheet|sheet]]s forming a star. Ideal for chains and fire: it's recommended to set '''NumSheets''' to 2 for chains and 3 for fire. Since these are sheets, [[Legacy:Intersect|intersect]]ing while the red builder brush is in this shape has unexpected results. See [[Legacy:VolumetricBuilder|VolumetricBuilder]].


|}

==Custom BrushBuilders ==

UnrealEd also support plug-in brushbuilders. See the list at [[Legacy:Custom Brushbuilder|Custom Brushbuilder]], [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]] and [[Legacy:Scripting Custom Brushbuilders|scripting custom Brushbuilders]] for details on how to create them.

==Related Topics==
* [[Legacy:Subtract A Space|Subtract A Space]] &amp;ndash; a simple tutorial which shows how to use brushbuilders to make a plain room
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; a simple tutorial which shows how to use brushbuilders to add a block to a subtracted space.
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==Comments ==

'''Birelli:''' I like the new format Tarq. I think it helps those of us who have no concept of basic shapes to figure out what's what (j/k). The only thing I think should be changed is the spacing of the columns, the two sides' entries would look better if they all matched up horizontally. I'm not sure how to achieve this though, maybe it's not possible with the wiki markup as it stands :-\.

'''Tarquin:'''  tx :). can't do the spacing thing though, as there's no rowspan in wiki tables.

'''Mychaeel:'''  What about splitting the image in its individual rows?  Then you could even line the descriptions up with their respective button rows.

'''Flashman:''' Has anyone done one of these for UED 3.0? the differences are subtle, but having the new stuff on the same page moght be confusing. /me volunteers to make the new one

'''Tarquin:''' Just update above, if the differences are very small.

'''Sobiwan:''' Since this page is named as the plural version [[Legacy:BrushBuilder|BrushBuilder]], I suggest we rename this to ''using brushbuilders'' to clarify this page's intent

'''Tarquin:''' harder to link to. If you really think we should have a clear difference, I'd say {{Brushbuilder tool}}s.  Look at how this page is linked from [[:Category:Legacy Basic Procedure]] pages.

'''lazy oli''' when i want to add a sphere to the room, it usually doesn't work. players fall through some of the triangles while 

others seem to be solid. sort of a noob question but does anybody have an idea why?

'''Wormbo:''' It's called [[Legacy:BSP Hole|BSP hole]]s.

'''lazy oli''' Thanks.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1659</id>
      <timestamp>2004-12-08T22:27:19Z</timestamp>
      <contributor>
        <ip>OlympusMons</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Brushbuilders''' are tools which forge the [[Legacy:Red Builder Brush|red builder brush]] into basic shapes.  They are the 3rd group of buttons in the UnrealEd [[Legacy:Toolbox|toolbox]].  Coders that want to understand or make new ones should see the class definition of [[Legacy:BrushBuilder|BrushBuilder]].

==Brushbuilders interface ==

To apply the shape to the red builder brush, either:
* Click a button to forge the red builder brush with the default shape and dimensions.
* Right-click a button to open the floating Brushbuilder parameters window.

===Parameters ===

Numeric parameters accept a mathematical expression, for example &quot;=64+128&quot; or &quot;=4*(256+128)&quot;. 

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Operator'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;*&lt;/code&gt;
|Multiplication
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;/&lt;/code&gt;
|Division
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;+&lt;/code&gt;
|Addition
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;-&lt;/code&gt;
|Subtraction
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;()&lt;/code&gt;
|Grouping, for example: &lt;code&gt;=(128+64)/2=&lt;/code&gt; yields &lt;code&gt;96&lt;/code&gt;
|}

Parameters with a mini drop-down menu (true/false and [[Legacy:Enumeration|enumeration]]s) can be advanced to the next option by double-clicking the parameter name or the value box.

Each brushbuilder remembers its own parameters throughout the UnrealEd session

If shapes seem distorted or rotated, check the red builder brush for [[Legacy:Brush Transformation|brush transformation]]; do [[Legacy:Transform Permanently|transform permanently]] to quickly cure this.

==Default Builders ==

{|

|-
|
===Cube ===

Creates cubes and box shapes in general.
: Default: 256x256x256 cube

===Cylinder ===

Creates cylinders
: Default: 8 sided cylinder, 256 height, 512 radius.

===Tetrahedron ===

Builds an approximation of a sphere. Tears the [[Legacy:BSP|BSP]] to shreds, so use sparingly.

===Spiral Stairs ===

These can't be used as a subtractive brush, as they leave sheet polys between each step. Use the alternative [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]] from the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack instead.

===Terrain ===

Creates a tesselated cube for use in creating terrain. ''This is a leftover from [[Legacy:UnrealEd 2|UnrealEd 2]]; realistic [[Legacy:Terrain|terrain]] is now made separately. In pre-[[Legacy:UT2003|UT2003]] versions, it is recommended to use an external terrain generator or [[Legacy:3D Studio Max|3D Studio Max]] to create pleasing, more realistic terrain.  See [[Legacy:Making Terrain (UT)|Making Terrain (UT)]].''



|
[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

|
===Sheet ===

Creates rectangular [[Legacy:Sheet|sheet]] brushes, used to make [[Legacy:Glass|glass]], [[Legacy:Zone Portal|zone portal]]s etc. For more complex shapes, use the [[Legacy:2D Shape Editor|2D Shape Editor]].

===Cone ===

Creates a cone.

===Curved Stairs ===

Creates a curved staircase.

===Linear Stairs ===

Creates a standard staircase.

===Volumetric ===

Makes a collection of [[Legacy:Sheet|sheet]]s forming a star. Ideal for chains and fire: it's recommended to set '''NumSheets''' to 2 for chains and 3 for fire. Since these are sheets, [[Legacy:Intersect|intersect]]ing while the red builder brush is in this shape has unexpected results. See [[Legacy:VolumetricBuilder|VolumetricBuilder]].


|}

==Custom BrushBuilders ==

UnrealEd also support plug-in brushbuilders. See the list at [[Legacy:Custom Brushbuilder|Custom Brushbuilder]], [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]] and [[Legacy:Scripting Custom Brushbuilders|scripting custom Brushbuilders]] for details on how to create them.

==Related Topics==
* [[Legacy:Subtract A Space|Subtract A Space]] &amp;ndash; a simple tutorial which shows how to use brushbuilders to make a plain room
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; a simple tutorial which shows how to use brushbuilders to add a block to a subtracted space.
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==Comments ==

'''Birelli:''' I like the new format Tarq. I think it helps those of us who have no concept of basic shapes to figure out what's what (j/k). The only thing I think should be changed is the spacing of the columns, the two sides' entries would look better if they all matched up horizontally. I'm not sure how to achieve this though, maybe it's not possible with the wiki markup as it stands :-\.

'''Tarquin:'''  tx :). can't do the spacing thing though, as there's no rowspan in wiki tables.

'''Mychaeel:'''  What about splitting the image in its individual rows?  Then you could even line the descriptions up with their respective button rows.

'''Flashman:''' Has anyone done one of these for UED 3.0? the differences are subtle, but having the new stuff on the same page moght be confusing. /me volunteers to make the new one

'''Tarquin:''' Just update above, if the differences are very small.

'''Sobiwan:''' Since this page is named as the plural version [[Legacy:BrushBuilder|BrushBuilder]], I suggest we rename this to ''using brushbuilders'' to clarify this page's intent

'''Tarquin:''' harder to link to. If you really think we should have a clear difference, I'd say {{Brushbuilder tool}}s.  Look at how this page is linked from [[:Category:Legacy Basic Procedure]] pages.

'''lazy oli''' when i want to add a sphere to the room, it usually doesn't work. players fall through some of the triangles while 

others seem to be solid. sort of a noob question but does anybody have an idea why?

'''Wormbo:''' It's called [[Legacy:BSP Hole|BSP hole]]s.

'''lazy oli''' Thanks.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1660</id>
      <timestamp>2006-04-07T07:50:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">'''Brushbuilders''' are tools which forge the [[Legacy:Red Builder Brush|red builder brush]] into basic shapes.  They are the 3rd group of buttons in the UnrealEd [[Legacy:Toolbox|toolbox]].  Coders that want to understand or make new ones should see the class definition of [[Legacy:BrushBuilder|BrushBuilder]].

==Brushbuilders interface ==

To apply the shape to the red builder brush, either:
* Click a button to forge the red builder brush with the default shape and dimensions.
* Right-click a button to open the floating Brushbuilder parameters window.

===Parameters ===

Numeric parameters accept a mathematical expression, for example &quot;=64+128&quot; or &quot;=4*(256+128)&quot;. 

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Operator'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;*&lt;/code&gt;
|Multiplication
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;/&lt;/code&gt;
|Division
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;+&lt;/code&gt;
|Addition
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;-&lt;/code&gt;
|Subtraction
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;()&lt;/code&gt;
|Grouping, for example: &lt;code&gt;=(128+64)/2=&lt;/code&gt; yields &lt;code&gt;96&lt;/code&gt;
|}

Parameters with a mini drop-down menu (true/false and [[Legacy:Enumeration|enumeration]]s) can be advanced to the next option by double-clicking the parameter name or the value box.

Each brushbuilder remembers its own parameters throughout the UnrealEd session

If shapes seem distorted or rotated, check the red builder brush for [[Legacy:Brush Transformation|brush transformation]]; do [[Legacy:Transform Permanently|transform permanently]] to quickly cure this.

==Default Builders ==

{|

|-
|
===Cube ===

Creates cubes and box shapes in general.
: Default: 256x256x256 cube

===Cylinder ===

Creates cylinders
: Default: 8 sided cylinder, 256 height, 512 radius.

===Tetrahedron ===

Builds an approximation of a sphere. Tears the [[Legacy:BSP|BSP]] to shreds, so use sparingly.

===Spiral Stairs ===

These can't be used as a subtractive brush, as they leave sheet polys between each step. Use the alternative [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]] from the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack instead.

===Terrain ===

Creates a tesselated cube for use in creating terrain. ''This is a leftover from [[Legacy:UnrealEd 2|UnrealEd 2]]; realistic [[Legacy:Terrain|terrain]] is now made separately. In pre-[[Legacy:UT2003|UT2003]] versions, it is recommended to use an external terrain generator or [[Legacy:3D Studio Max|3D Studio Max]] to create pleasing, more realistic terrain.  See [[Legacy:Making Terrain (UT)|Making Terrain (UT)]].''



|
[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

|
===Sheet ===

Creates rectangular [[Legacy:Sheet|sheet]] brushes, used to make [[Legacy:Glass|glass]], [[Legacy:Zone Portal|zone portal]]s etc. For more complex shapes, use the [[Legacy:2D Shape Editor|2D Shape Editor]].

===Cone ===

Creates a cone.

===Curved Stairs ===

Creates a curved staircase.

===Linear Stairs ===

Creates a standard staircase.

===Volumetric ===

Makes a collection of [[Legacy:Sheet|sheet]]s forming a star. Ideal for chains and fire: it's recommended to set '''NumSheets''' to 2 for chains and 3 for fire. Since these are sheets, [[Legacy:Intersect|intersect]]ing while the red builder brush is in this shape has unexpected results. See [[Legacy:VolumetricBuilder|VolumetricBuilder]].


|}

==Custom BrushBuilders ==

UnrealEd also support plug-in brushbuilders. See the list at [[Legacy:Custom Brushbuilder|Custom Brushbuilder]], [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]] and [[Legacy:Scripting Custom Brushbuilders|scripting custom Brushbuilders]] for details on how to create them.

==Related Topics==
* [[Legacy:Subtract A Space|Subtract A Space]] &amp;ndash; a simple tutorial which shows how to use brushbuilders to make a plain room
* [[Legacy:Adding A Block|Adding a Block]] &amp;ndash; a simple tutorial which shows how to use brushbuilders to add a block to a subtracted space.
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==Comments ==

'''Birelli:''' I like the new format Tarq. I think it helps those of us who have no concept of basic shapes to figure out what's what (j/k). The only thing I think should be changed is the spacing of the columns, the two sides' entries would look better if they all matched up horizontally. I'm not sure how to achieve this though, maybe it's not possible with the wiki markup as it stands :-\.

'''Tarquin:'''  tx :). can't do the spacing thing though, as there's no rowspan in wiki tables.

'''Mychaeel:'''  What about splitting the image in its individual rows?  Then you could even line the descriptions up with their respective button rows.

'''Flashman:''' Has anyone done one of these for UED 3.0? the differences are subtle, but having the new stuff on the same page moght be confusing. /me volunteers to make the new one

'''Tarquin:''' Just update above, if the differences are very small.

'''Sobiwan:''' Since this page is named as the plural version [[Legacy:BrushBuilder|BrushBuilder]], I suggest we rename this to ''using brushbuilders'' to clarify this page's intent

'''Tarquin:''' harder to link to. If you really think we should have a clear difference, I'd say {{Brushbuilder tool}}s.  Look at how this page is linked from [[:Category:Legacy Basic Procedure]] pages.

'''lazy oli''' when i want to add a sphere to the room, it usually doesn't work. players fall through some of the triangles while 

others seem to be solid. sort of a noob question but does anybody have an idea why?

'''Wormbo:''' It's called [[Legacy:BSP Hole|BSP hole]]s.

'''lazy oli''' Thanks.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Brute</title>
    <id>563</id>
    <revision>
      <id>1731</id>
      <timestamp>2005-12-01T19:28:21Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Mark up, edit for UT2004, related topics, subclass tree, category tags</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Brute}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; [[Legacy:Monster|Monster]] &gt;&gt; Brute (Package: SkaarjPack)}}

[[Image:Legacy_scriptedpawn.brutes.jpeg|center|''From left:  LesserBrute, Brute, and Behemoth.  A standard Brute is slightly taller than a SkaarjTrooper.'']]

Brutes are genetically engineered creatures designed to serve the Skaarj as beasts of burden or as sentries.  No one knows if they were designed from scratch by the Skaarj, or if the Skaarj enslaved them and modified them to suit their current role.  All Brutes are armed with rocket pistols that they wield the way a Human would wield a pair of a normal pistols.

Despite their size and firing tendencies, Brutes are severely limited in combat by their low agility and near-nonexistent intelligence, typically preferring to stand stationary to launch rockets, or to charge straight at their target in an attempt to engage in melee combat.

Remember, if you see a brute with a shield belt, get cover!  His rockets have heat-seeking abilities.  This model is typically known as a Battle Brute.  (Operation:  Na Pali only.)

[http://www.planetunreal.com/teamvortex/help/data/docs/brute.html Alternative Story]

==Properties==
; WhipDamage : This byte variable determines the base amount of damage that the Brute does whenever it swats at a target with its rocket pistol.
; bTurret : If this variable is set to True, then the Brute will not walk or move around at all.  It just basically does nothing but turn in place and fire rockets at its targets.

==Known Subclasses==
 Brute
     +- LesserBrute (UT only)
     +- [[Legacy:Behemoth|Behemoth]]

==Related Topics==
* [[Legacy:Monster Support|Monster Support]]
* [[Legacy:Invasion|Invasion]] (UT2004 gametype)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1732</id>
      <timestamp>2004-05-20T01:26:56Z</timestamp>
      <contributor>
        <ip>64-216-188-176.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Brute}}

{{classbox|  [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Brute &gt;&gt; LesserBrute}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Brute &gt;&gt; Behemoth}}

&lt;br /&gt;

[[Image:Legacy_scriptedpawn.brutes.jpeg|center|&lt;i&gt;From left:  LesserBrute, Brute, and Behemoth.  A standard Brute is slightly taller than a SkaarjTrooper.&lt;/i&gt;]]

&lt;br&gt;

Brutes are genetically engineered creatures designed to serve the Skaarj as beasts of burden or as sentries.  No one knows if they were designed from scratch by the Skaarj, or if the Skaarj enslaved them and modified them to suit their current role.  All Brutes are armed with rocket pistols that they wield the way a Human would wield a pair of a normal pistols.&lt;br&gt;&lt;br&gt;

Despite their size and firing tendencies, Brutes are severely limited in combat by their low agility and near-nonexistent intelligence, typically preferring to stand stationary to launch rockets, or to charge straight at their target in an attempt to engage in melee combat.

Remember, if you see a brute with a shield belt, get cover!  His rockets have heat-seeking abilities.  This model is typically known as a Battle Brute.  (Operation:  Na Pali only.)

[http://www.planetunreal.com/teamvortex/help/data/docs/brute.html Alternative Story]

===Properties ===

For mappers, all Brutes have two additional variables to work with.

; WhipDamage : This byte variable determines the base amount of damage that the Brute does whenever it swats at a target with its rocket pistol.
; bTurret : If this variable is set to True, then the Brute will not walk or move around at all.  It just basically does nothing but turn in place and fire rockets at its targets.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce</title>
    <id>601</id>
    <revision>
      <id>1812</id>
      <timestamp>2005-07-25T13:14:35Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">BruteForce is a programming language I ([[Legacy:El Muerte TDS|El Muerte TDS]]) specified. It's being compiled and executed from within  the Unreal Warfare engine.

I thought it would be intresting if I explained how I designed it and how it works. Some things might be usefull for other people.

The latest source code of BruteForce is avilable from my [[Legacy:CVS|CVS]] repository, module name: ''BruteForce''

Or you can download a snapshot of the source code here: http://unreal.student.utwente.nl/Source/BruteForce-source.zip

==Step 1: the specification ==

The most important part of a language, that can be a programming language or even a file format, is the specification. This is usualy done using [http://www.garshol.priv.no/download/text/bnf.html EBNF] format.

The EBNF specification defines how the source code should be written, if the source code doesn't match all the rules of the EBNF specification it can not be compiled.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF|Read more about the BruteForce EBNF specification]]

==Step 2+3: the parser and compiler ==

Now you have to write the parser that checks if the input source conforms to your EBNF specification. The easiest way to do that is to use a [[Legacy:Tokenizer|tokenizer]] to retreive the significant blocks from the source file.

I've named by parser class ''compiler'' because it will also compile the source file to usefull data for the execution of the code. Usualy the parser will also compile the input source to an internal format, for later processing/execution. So that's why I will handle both at the same time.

The compiler will translate the input code to a Abstract Syntax Tree ([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST]]), the AST is a tree representation of the input code. This tree makes it easier to do something with the code. The main advatage of a tree over a stack machine is that you can execute tree nodes and always return to that node by reference, very usefull in while loops. Basically a tree works the same like a stack machine, but the jumps are just more friendlier to use than labels.

Your language has to be readable for humans, at least that is the nicest way. But you AST has to be easy to read for a machine. So what's the diffirent, well a machine wants to know what it has to do as fast as possible, it doesn't want to look ahead to see what it has to do, this is not efficient. This comes down to that your tree has to use a prefix notation, but mostlikely you designed your language to use infix.

&lt;uscript&gt;
x = 1 + 2 // infix
= x + 1 2 // prefix
&lt;/uscript&gt;

So during compiling you need to translate the infix notation to prefix.

The easiest way to create a parser for your language is to create a [[Wikipedia:Recursive descent parser]], e.g. each non terminal is a new function. This might result in a lot of small functions or even function that just call another function, but that doesn't matter. Maybe in the future you want to extend your language and you will be happy that you did it this way.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Compiler|The parser + compiler]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST|Abstract Syntax Tree (AST)]]

==Step 4: the checker (optional) ==

After you compiled your input source to a AST you may want to check if the content is correct, e.g. check for unresolved variables/functions/... or even do range checking or other content checking.

The parser/compiler only checks if the course is correctly used not if you didn't do ''stupid'' things. This is what the checker does.

The step is not required to do and I left it out in the current version. The only problem you get is that you program might crash or returns undesireable information.

The code of the checker is basically the same as that of the interpreter, it also walks through the AST, except that it doesn't interpret the code, it doesn't calculate the values. So run time errors (e.g. divide by zero) are not checked by the checker.

==Step 5: the interpreter ==

When you have created the AST you can execute/interpret it and return a result. All the interpreter has to do is walk down the tree. For this it's also best to write a recursive descent parser, but note that it does ''not'' work the same way like with the parser/compiler. This one is much easier since you can see at the tree node where you have to go.

Unlike with the parser you do have to pass arguments to the diffirent functions, each function receives the current tree node to process. This way you can easily create a while loop by calling the same function with the same node.

Expressions return results, there are two common ways to pass these results up the tree to the node where they are used.  

One way is to use a data stack where you push and pop the to/from. For this to work you have to create the logic for the stack administration (e.g. the push and pop). Using the static is what usualy is done in assambler languages (and finally in the CPU).

An other, modern, way is to return the results of a function, this might involve storing the results in local variables, but it's generaly easier to write and use (specially for debugging).

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Interpreter]]

===Step 5.1: the scope ===

While interpreting your AST you need to keep track of functions and variables used. You also might need to keep track of global and local definitions. For this you needs to create a class that keeps track of this. I've called it ''the scope''. This stores the declarations and values and returns them when the interpreter requests it. 

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scope]]

==Step 6: combining it all ==

Now combine all seperate pieces into one thing that you can use.

Create a tokenizer ans pass it the source code. Create an AST and a Compiler and pass the compiler the tokenizer and AST. Create an interpreter and pass it the AST and your Scope.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Main]]

==Issues/things to think about ==

===Type complete ===

I designed BruteForce to be type complete, this means that every type is treated equally, each type is automatically casted to an other type when needed.

Ofcourse this can result in intresting issues like what to do with operators. As a general rule the left side defines the type, ofcourse this will also be confusing sometimes.

&lt;uscript&gt;
// easy ones
&quot;some string&quot; + &quot;other string&quot; = &quot;some stringother string&quot; 
&quot;string&quot; + 123.67 = &quot;string123.67&quot;
123 + &quot;56&quot; = 179 

// a little bit difficult
123 + &quot;weird stuff&quot; = 123 + 0 = 123 // &quot;weird stuff&quot; is not a number so it's 0
true &amp;&amp; &quot;&quot; = true &amp;&amp; false          // an empty string, or for int/float 0 equals to false

// weird
&quot;string 1&quot; - &quot;string&quot; = ??   // maybe &quot; 1&quot;
&quot;string&quot; - 1 = ??            // maybe &quot;strin&quot;
&quot;string 1&quot; * &quot;string&quot; = ??   // I've got no idea
&quot;string 1&quot; * 2 = ??          // maybe &quot;string 1string 1&quot;
&quot;string 1&quot; / &quot;string&quot; = ?? 
&lt;/uscript&gt;

===Function declarations ===

Function declarations are great, using the AST and Scope it's even very easy, when you reach a function declaration just add the declaration with type ''function'' and as value the node where the function begins.

When that function is called jou just lookup the function in the scope and execute the returned node.

==Related articles ==

===BruteForce documents ===
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Compiler]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Interpreter]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Main]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scope]]
* [[Legacy:Tokenizer|Tokenizer]]

===Other documents ===
* [[Wikipedia:Abstract syntax tree]]
* [http://www.garshol.priv.no/download/text/bnf.html BNF and EBNF: What are they and how do they work?]
* [http://www.antlr.org ANTLR] - ANother Tool for Language Recognition

----

==Discussion ==

'''Tarquin:''' very interesting. care to tell us what it's useful for &amp;ndash; what advatages does this have over Uscript?

'''Mychaeel:''' Sounds like a case study to me, not anything with an actual intent or purpose. &amp;ndash; How's the compiler's and interpreter's performance?

'''El Muerte TDS:''' Just started on it for fun, I am following a course about translaters and compilers at the uni at the moment and this makes it more intresting. As for the performance, the sample script on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF]] page takes about 50ms to compile and 170ms to execute (and calculate the first 10 dates). I think the most time is used by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scope]] class, need to improve this somehow.

'''Zedsquared''' I think this is all great fun and doesn't need a reason at all :) El Muerte, why not go on to create a radical 3d debugging environment for code written in bruteforce seeing as how you've got this 3d engine sitting there doing nothing ATM... seems such a shame to restrict output to the log :) 

One possible use for this: Write a 'core war 3D' mod where you can get together online, code up simple AI for some sort of combat actors in real time and get them battling... I was thinking along these lines for my GP stuff but the 'language' such as it is would only appeal to lisp hackers, bruteforce is much more friendly. All very geeky I know but I reckon the world needs more geeky games :) 

'''Tarquin:''' Hey, I'm a mathematician! I know all about things which serve no purpose but are elegant! ;) ElM, do you want to write a short paragraph on this to submit to BU news? 

'''El Muerte TDS:''' eek, an mathematician :D Uhm, this is news worthy ? Lemme use my excelent writing skills, ... uhm... uhm...

'''Tarquin:''' I can make something up if you like :)  it's not newsworthy that I'm a mathematician... ;) but I think a language written in Uscrip is kinda cool... we should show it off!

'''hc:''' Could you set up a BruteForce download that doesn't require you to use cvs? (I'm behind a firewall...)

'''El Muerte:''' check the top of the page for a zip file containing a snapshot from the CVS

'''hc:''' Thanks!

'''MythOpus:''' Quick question:  You've stated that it is being compiled and executed within the engine... Does that mean that one could write something up when you are running the game (whatever game/mod that would be) and compile it/execute it without getting out of the game.  I hate how you have to write your code, compile it, start the game, exit the game, make changes, delete the .u file, re-compile and do it all over again.  Would that be neccesary with this?  And also, is BruteForce an alternative to UScript, in that you could write up a mutator and/or complete total conversion using BF for use with the Unreal Engine?

'''El Muerte:''' bruteforce is ''not'' an alternative to unrealscript. It's just a programming language written using unrealscript. You can not use it to write a mutator or total conversion (not unless you also add all required bindings between bruteforce and the unrealengine, but that's just a waste of time because you already have unrealscript).</text>
    </revision>
    <revision>
      <id>1813</id>
      <timestamp>2005-07-25T07:20:32Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>question</comment>
      <text xml:space="preserve">BruteForce is a programming language I ([[Legacy:El Muerte TDS|El Muerte TDS]]) specified. It's being compiled and executed from within  the Unreal Warfare engine.

I thought it would be intresting if I explained how I designed it and how it works. Some things might be usefull for other people.

The latest source code of BruteForce is avilable from my [[Legacy:CVS|CVS]] repository, module name: ''BruteForce''

Or you can download a snapshot of the source code here: http://unreal.student.utwente.nl/Source/BruteForce-source.zip

==Step 1: the specification ==

The most important part of a language, that can be a programming language or even a file format, is the specification. This is usualy done using [http://www.garshol.priv.no/download/text/bnf.html EBNF] format.

The EBNF specification defines how the source code should be written, if the source code doesn't match all the rules of the EBNF specification it can not be compiled.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF|Read more about the BruteForce EBNF specification]]

==Step 2+3: the parser and compiler ==

Now you have to write the parser that checks if the input source conforms to your EBNF specification. The easiest way to do that is to use a [[Legacy:Tokenizer|tokenizer]] to retreive the significant blocks from the source file.

I've named by parser class ''compiler'' because it will also compile the source file to usefull data for the execution of the code. Usualy the parser will also compile the input source to an internal format, for later processing/execution. So that's why I will handle both at the same time.

The compiler will translate the input code to a Abstract Syntax Tree ([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST]]), the AST is a tree representation of the input code. This tree makes it easier to do something with the code. The main advatage of a tree over a stack machine is that you can execute tree nodes and always return to that node by reference, very usefull in while loops. Basically a tree works the same like a stack machine, but the jumps are just more friendlier to use than labels.

Your language has to be readable for humans, at least that is the nicest way. But you AST has to be easy to read for a machine. So what's the diffirent, well a machine wants to know what it has to do as fast as possible, it doesn't want to look ahead to see what it has to do, this is not efficient. This comes down to that your tree has to use a prefix notation, but mostlikely you designed your language to use infix.

&lt;uscript&gt;
x = 1 + 2 // infix
= x + 1 2 // prefix
&lt;/uscript&gt;

So during compiling you need to translate the infix notation to prefix.

The easiest way to create a parser for your language is to create a [[Wikipedia:Recursive descent parser]], e.g. each non terminal is a new function. This might result in a lot of small functions or even function that just call another function, but that doesn't matter. Maybe in the future you want to extend your language and you will be happy that you did it this way.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Compiler|The parser + compiler]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST|Abstract Syntax Tree (AST)]]

==Step 4: the checker (optional) ==

After you compiled your input source to a AST you may want to check if the content is correct, e.g. check for unresolved variables/functions/... or even do range checking or other content checking.

The parser/compiler only checks if the course is correctly used not if you didn't do ''stupid'' things. This is what the checker does.

The step is not required to do and I left it out in the current version. The only problem you get is that you program might crash or returns undesireable information.

The code of the checker is basically the same as that of the interpreter, it also walks through the AST, except that it doesn't interpret the code, it doesn't calculate the values. So run time errors (e.g. divide by zero) are not checked by the checker.

==Step 5: the interpreter ==

When you have created the AST you can execute/interpret it and return a result. All the interpreter has to do is walk down the tree. For this it's also best to write a recursive descent parser, but note that it does ''not'' work the same way like with the parser/compiler. This one is much easier since you can see at the tree node where you have to go.

Unlike with the parser you do have to pass arguments to the diffirent functions, each function receives the current tree node to process. This way you can easily create a while loop by calling the same function with the same node.

Expressions return results, there are two common ways to pass these results up the tree to the node where they are used.  

One way is to use a data stack where you push and pop the to/from. For this to work you have to create the logic for the stack administration (e.g. the push and pop). Using the static is what usualy is done in assambler languages (and finally in the CPU).

An other, modern, way is to return the results of a function, this might involve storing the results in local variables, but it's generaly easier to write and use (specially for debugging).

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Interpreter]]

===Step 5.1: the scope ===

While interpreting your AST you need to keep track of functions and variables used. You also might need to keep track of global and local definitions. For this you needs to create a class that keeps track of this. I've called it ''the scope''. This stores the declarations and values and returns them when the interpreter requests it. 

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scope]]

==Step 6: combining it all ==

Now combine all seperate pieces into one thing that you can use.

Create a tokenizer ans pass it the source code. Create an AST and a Compiler and pass the compiler the tokenizer and AST. Create an interpreter and pass it the AST and your Scope.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Main]]

==Issues/things to think about ==

===Type complete ===

I designed BruteForce to be type complete, this means that every type is treated equally, each type is automatically casted to an other type when needed.

Ofcourse this can result in intresting issues like what to do with operators. As a general rule the left side defines the type, ofcourse this will also be confusing sometimes.

&lt;uscript&gt;
// easy ones
&quot;some string&quot; + &quot;other string&quot; = &quot;some stringother string&quot; 
&quot;string&quot; + 123.67 = &quot;string123.67&quot;
123 + &quot;56&quot; = 179 

// a little bit difficult
123 + &quot;weird stuff&quot; = 123 + 0 = 123 // &quot;weird stuff&quot; is not a number so it's 0
true &amp;&amp; &quot;&quot; = true &amp;&amp; false          // an empty string, or for int/float 0 equals to false

// weird
&quot;string 1&quot; - &quot;string&quot; = ??   // maybe &quot; 1&quot;
&quot;string&quot; - 1 = ??            // maybe &quot;strin&quot;
&quot;string 1&quot; * &quot;string&quot; = ??   // I've got no idea
&quot;string 1&quot; * 2 = ??          // maybe &quot;string 1string 1&quot;
&quot;string 1&quot; / &quot;string&quot; = ?? 
&lt;/uscript&gt;

===Function declarations ===

Function declarations are great, using the AST and Scope it's even very easy, when you reach a function declaration just add the declaration with type ''function'' and as value the node where the function begins.

When that function is called jou just lookup the function in the scope and execute the returned node.

==Related articles ==

===BruteForce documents ===
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Compiler]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Interpreter]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Main]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scope]]
* [[Legacy:Tokenizer|Tokenizer]]

===Other documents ===
* [[Wikipedia:Abstract syntax tree]]
* [http://www.garshol.priv.no/download/text/bnf.html BNF and EBNF: What are they and how do they work?]
* [http://www.antlr.org ANTLR] - ANother Tool for Language Recognition

----

==Discussion ==

'''Tarquin:''' very interesting. care to tell us what it's useful for &amp;ndash; what advatages does this have over Uscript?

'''Mychaeel:''' Sounds like a case study to me, not anything with an actual intent or purpose. &amp;ndash; How's the compiler's and interpreter's performance?

'''El Muerte TDS:''' Just started on it for fun, I am following a course about translaters and compilers at the uni at the moment and this makes it more intresting. As for the performance, the sample script on the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF]] page takes about 50ms to compile and 170ms to execute (and calculate the first 10 dates). I think the most time is used by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scope]] class, need to improve this somehow.

'''Zedsquared''' I think this is all great fun and doesn't need a reason at all :) El Muerte, why not go on to create a radical 3d debugging environment for code written in bruteforce seeing as how you've got this 3d engine sitting there doing nothing ATM... seems such a shame to restrict output to the log :) 

One possible use for this: Write a 'core war 3D' mod where you can get together online, code up simple AI for some sort of combat actors in real time and get them battling... I was thinking along these lines for my GP stuff but the 'language' such as it is would only appeal to lisp hackers, bruteforce is much more friendly. All very geeky I know but I reckon the world needs more geeky games :) 

'''Tarquin:''' Hey, I'm a mathematician! I know all about things which serve no purpose but are elegant! ;) ElM, do you want to write a short paragraph on this to submit to BU news? 

'''El Muerte TDS:''' eek, an mathematician :D Uhm, this is news worthy ? Lemme use my excelent writing skills, ... uhm... uhm...

'''Tarquin:''' I can make something up if you like :)  it's not newsworthy that I'm a mathematician... ;) but I think a language written in Uscrip is kinda cool... we should show it off!

'''hc:''' Could you set up a BruteForce download that doesn't require you to use cvs? (I'm behind a firewall...)

'''El Muerte:''' check the top of the page for a zip file containing a snapshot from the CVS

'''hc:''' Thanks!

'''MythOpus:''' Quick question:  You've stated that it is being compiled and executed within the engine... Does that mean that one could write something up when you are running the game (whatever game/mod that would be) and compile it/execute it without getting out of the game.  I hate how you have to write your code, compile it, start the game, exit the game, make changes, delete the .u file, re-compile and do it all over again.  Would that be neccesary with this?  And also, is BruteForce an alternative to UScript, in that you could write up a mutator and/or complete total conversion using BF for use with the Unreal Engine?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce/AST</title>
    <id>603</id>
    <revision>
      <id>1816</id>
      <timestamp>2003-04-23T15:04:08Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Example tree ==

It's wise to write a function to draw the current AST, this way you can easily spot errors.

The PrintTree() below gives the following tree for this piece of code:

&lt;uscript&gt;
var int x;          
var int y;          
x = 1+2*3-5;        
y = (x+2)/5;        
print(&quot;&quot;+x+&quot; &quot;+y);  
&lt;/uscript&gt;

 +&amp;ndash; var              
 |   +&amp;ndash; int          
 |   +&amp;ndash; x            
 +&amp;ndash; var              
 |   +&amp;ndash; int          
 |   +&amp;ndash; y            
 +&amp;ndash; =                
 |   +&amp;ndash; x            
 |   +&amp;ndash; -            
 |   |   +&amp;ndash; +        
 |   |   |   +&amp;ndash; 1    
 |   |   |   +&amp;ndash; *    
 |   |   |   |   +&amp;ndash; 2
 |   |   |   |   +&amp;ndash; 3
 |   |   +&amp;ndash; 5        
 +&amp;ndash; =                
 |   +&amp;ndash; y            
 |   +&amp;ndash; /            
 |   |   +&amp;ndash; +        
 |   |   |   +&amp;ndash; x    
 |   |   |   +&amp;ndash; 2    
 |   |   +&amp;ndash; 5        
 +&amp;ndash; print            
 |   +&amp;ndash; +            
 |   |   +&amp;ndash; +        
 |   |   |   +&amp;ndash; +    
 |   |   |   |   +&amp;ndash;  
 |   |   |   |   +&amp;ndash; x
 |   |   |   +&amp;ndash;      
 |   |   +&amp;ndash; y        

==The code ==

&lt;uscript&gt;
/**
  The compiled code ready to be executed
*/
class AST extends Object config(BruteForce);

enum NodeType
{
  NT_Keyword,
  NT_Identifier,
  NT_String,
  NT_Integer,
  NT_Float,
  NT_Boolean,
  NT_Function,
};
&lt;/uscript&gt;

These are the kind of tree nodes we have in the tree. The most important is the NT_Keyword, this defines a piece of code to execute, it's usualy a root node.

&lt;uscript&gt;

struct Node
{
  var NodeType type;
  var string value;
  var int parent;
  var array&lt;int&gt; children;
};
var config array&lt;Node&gt; Tree;
&lt;/uscript&gt;

A tree is simply an array with all nodes, each node has pointers to it's children and a pointer to it's parent. These pointers are actualy just the index in the array.

&lt;uscript&gt;

var private int currentNode;
&lt;/uscript&gt;

The current root node

&lt;uscript&gt;

function Create()
{
  Tree.length = 0;
  currentNode = -1;
}

/**
  The real add node
*/
private function int AddNode(NodeType inType, string inValue, int inParent)
{
  local int i;
  i = Tree.length;
  Tree.length = i+1;
  Tree[i].type = inType;
  Tree[i].value = inValue;
  Tree[i].parent = inParent;
  if (inParent &gt; -1)
  {
    Tree[inParent].children.length = Tree[inParent].children.length+1;
    Tree[inParent].children[Tree[inParent].children.length-1] = i;
  }
  return i;
}
&lt;/uscript&gt;

This will add a node to the tree, and as child to it's parent (when set).

&lt;uscript&gt;

/**
  Open a new Root to the tree
*/
function AddRoot(NodeType inType, string inValue)
{
  currentNode = AddNode(inType, inValue, currentNode);
}
&lt;/uscript&gt;

This will add a new node and set the current root node to the newly added node.

&lt;uscript&gt;

/**
  Close a Root node 
*/
function CloseRoot()
{
  currentNode = Tree[currentNode].parent;
}
&lt;/uscript&gt;

Close the current root by setting the root node to the previous root node.

&lt;uscript&gt;

/**
  Add a child to the current node, doesn't set a new root
*/
function AddChild(NodeType inType, string inValue)
{
  AddNode(inType, inValue, currentNode);
}

/**
  Move previous node down a notch
*/
function SwitchNode()
{
  local int lastSib;
  // set new parent
  lastSib = Tree[Tree[currentNode].parent].children[Tree[Tree[currentNode].parent].children.length-2];
  Tree[currentNode].children.length = Tree[currentNode].children.length+1;
  Tree[currentNode].children[Tree[currentNode].children.length-1] = lastSib;
  // remove child pointer from previous parent
  Tree[Tree[lastSib].parent].children.remove(Tree[Tree[lastSib].parent].children.length-2 ,1);
}
&lt;/uscript&gt;

This will move the previous node added to a child of the last added root node

&lt;uscript&gt;

/**
  Print the tree
*/
function PrintTree()
{
  local int i;
  for (i = 0; i &lt; Tree.length; i++)
  {
    if (Tree[i].parent == -1) PrintSubTree(i, 0);
  }
}
&lt;/uscript&gt;

This will make an ASCII drawing of the current state of the AST, as you can see above.

&lt;uscript&gt;

/**
  Internal function for printing the tree
*/
private function PrintSubTree(int root, int depth)
{
  local int i;
  local string tmp;
  for (i = 0; i &lt; depth; i++) tmp = tmp$&quot;|   &quot;;
  Log(tmp$&quot;+--&quot;@Tree[root].value);
  for (i = 0; i &lt; Tree[root].children.length; i++)
  {
    PrintSubTree(Tree[root].children[i], depth+1);
  }
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1817</id>
      <timestamp>2003-04-22T21:27:45Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
/**
  The compiled code ready to be executed
*/
class AST extends Object config(BruteForce);

enum NodeType
{
  NT_Keyword,
  NT_Identifier,
  NT_String,
  NT_Integer,
  NT_Float,
  NT_Boolean,
  NT_Function,
};

struct Node
{
  var NodeType type;
  var string value;
  var int parent;
  var array&lt;int&gt; children;
};
var config array&lt;Node&gt; Tree;

var private int currentNode;

function Create()
{
  Tree.length = 0;
  currentNode = -1;
}

/*
AddRoot
|
+- AddChild
|
+- AddRoot
   |
   +- AddChild
   |
   +- AddChild
   CloseRoot
CloseRoot
*/

/**
  The real add node
*/
private function int AddNode(NodeType inType, string inValue, int inParent)
{
  local int i;
  i = Tree.length;
  Tree.length = i+1;
  Tree[i].type = inType;
  Tree[i].value = inValue;
  Tree[i].parent = inParent;
  if (inParent &gt; -1)
  {
    Tree[inParent].children.length = Tree[inParent].children.length+1;
    Tree[inParent].children[Tree[inParent].children.length-1] = i;
  }
  return i;
}

/**
  Open a new Root to the tree
*/
function AddRoot(NodeType inType, string inValue)
{
  currentNode = AddNode(inType, inValue, currentNode);
}

/**
  Close a Root node 
*/
function CloseRoot()
{
  currentNode = Tree[currentNode].parent;
}

/**
  Add a child to the current node, doesn't set a new root
*/
function AddChild(NodeType inType, string inValue)
{
  AddNode(inType, inValue, currentNode);
}

/**
  Move previous node down a notch
*/
function SwitchNode()
{
  local int lastSib;
  // set new parent
  lastSib = Tree[Tree[currentNode].parent].children[Tree[Tree[currentNode].parent].children.length-2];
  Tree[currentNode].children.length = Tree[currentNode].children.length+1;
  Tree[currentNode].children[Tree[currentNode].children.length-1] = lastSib;
  // remove child pointer from previous parent
  Tree[Tree[lastSib].parent].children.remove(Tree[Tree[lastSib].parent].children.length-2 ,1);
}

/**
  Print the tree
*/
function PrintTree()
{
  local int i;
  for (i = 0; i &lt; Tree.length; i++)
  {
    if (Tree[i].parent == -1) PrintSubTree(i, 0);
  }
}

/**
  Internal function for printing the tree
*/
private function PrintSubTree(int root, int depth)
{
  local int i;
  local string tmp;
  for (i = 0; i &lt; depth; i++) tmp = tmp$&quot;--&quot;;
  Log(tmp@Tree[root].value);
  for (i = 0; i &lt; Tree[root].children.length; i++)
  {
    PrintSubTree(Tree[root].children[i], depth+1);
  }
}
&lt;/uscript&gt;

'''El Muerte TDS:''' need to describe this</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce/Compiler</title>
    <id>604</id>
    <revision>
      <id>1818</id>
      <timestamp>2003-04-23T13:16:11Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
/**
  Analyse and compile the language (create an AST)
*/
class Compiler extends Object dependsOn(Tokenizer) dependsOn(AST);

// terminals
const __BEGIN                 = &quot;begin&quot;;
const __END                   = &quot;end&quot;;
const __SEMICOLON             = &quot;;&quot;;
const __VAR                   = &quot;var&quot;;
const __INTEGER               = &quot;int&quot;;
const __STRING                = &quot;string&quot;;
const __FLOAT                 = &quot;float&quot;;
const __BOOLEAN               = &quot;bool&quot;;
const __FUNC                  = &quot;function&quot;;
const __BECOMES               = &quot;=&quot;;
const __WHILE                 = &quot;while&quot;;
const __DO                    = &quot;do&quot;;
const __IF                    = &quot;if&quot;;
const __THEN                  = &quot;then&quot;;
const __ELSE                  = &quot;else&quot;;
const __LT                    = &quot;&lt;&quot;;
const __LE                    = &quot;&lt;=&quot;;
const __GT                    = &quot;&gt;&quot;;
const __GE                    = &quot;&gt;=&quot;;
const __EQ                    = &quot;==&quot;;
const __NE                    = &quot;!=&quot;;
const __AND                   = &quot;&amp;&amp;&quot;;
const __OR                    = &quot;||&quot;;
const __PLUS                  = &quot;+&quot;;
const __MINUS                 = &quot;-&quot;;
const __MULTIPLY              = &quot;*&quot;;
const __DIVIDE                = &quot;/&quot;;
const __MOD                   = &quot;%&quot;;
const __NOT                   = &quot;!&quot;;
const __LBRACK                = &quot;(&quot;;
const __RBRACK                = &quot;)&quot;;
const __TRUE                  = &quot;true&quot;;
const __FALSE                 = &quot;false&quot;;
const __COMMA                 = &quot;,&quot;;
// terminals -- end
&lt;/uscript&gt;

All the terminals as defined in the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF|grammar]], it's best to use constant instead of inline strings because this prevents you from making typos and it will also make it easier to change terminal. For example if you want to use '''{''' ... '''}''' instead of '''begin''' ... '''end''' you can simply change the constant value.

&lt;uscript&gt;
var private Tokenizer t;
var private AST a;

function Compile(Tokenizer tokenizer, AST tree)
{
  t = tokenizer;
  a = tree;
  _program();
}
&lt;/uscript&gt;

The main function of this class, this will start the parsing of the code.

&lt;uscript&gt;

function bool has(Tokenizer.tokenType token, optional string text)
{
  if (text == &quot;&quot;) return token ~= t.currentToken();
  return (text ~= t.tokenString()) &amp;&amp; (token ~= t.currentToken());
}
&lt;/uscript&gt;

The function has checks if the current token has the correct type, and optional if the token string is equal to the input. 

&lt;uscript&gt;

function require(Tokenizer.tokenType token, optional string text)
{
  local bool res;
  res = has(token, text);
  if (!res)
  {
    Warn(&quot;Expected (&quot;$token$&quot;) \&quot;&quot;$text$&quot;\&quot; but has (&quot;$t.currentToken()$&quot;) \&quot;&quot;$t.tokenString()$&quot;\&quot; @ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

Require does the same as ''has()'' except that if the result is false it will abort the whole compilation. ''Require'' is used to check for tokens that have to be there in order to for the language to be conform to the specification. 

Currently it uses ''assert()'' to stop the compilation, this will ofcourse stop the whole system, you may want to write a diffirent instruction here to stop compiling.

&lt;uscript&gt;

function _program()
{
  _declarations();
  _statements();
  require(TT_EOF);
}
&lt;/uscript&gt;

The initial rule, note that it requires an end of file at the end, this is to ensure that no more declarations are possible after the main code has been finished.

&lt;uscript&gt;

function _declarations()
{
  while (has(TT_Identifier, __VAR) || has(TT_Identifier, __FUNC))
  {
    if (has(TT_Identifier, __VAR)) _declaration();
    else if (has(TT_Identifier, __FUNC)) _function();
    require(TT_Literal, __SEMICOLON);
    t.nextToken();
  }
}
&lt;/uscript&gt;

The declaration block, a declaration is either a '''var''' or '''function''', while this is true we keep reading declarations. When it's not true it has to be a statement.

&lt;uscript&gt;

function _declaration()
{
  a.AddRoot(NT_Keyword, __VAR);
  t.nextToken(); // __VAR
  _type();
  require(TT_Identifier);
  a.AddChild(NT_Identifier, t.tokenString());
  t.nextToken();
  a.CloseRoot();
}
&lt;/uscript&gt;

A variable declaration, we start by adding a new root node to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST]], next we decent into the type specification where type is added to the current root node. Next we should get the variable identifier which we also add to the current root node.

At the end we close the current root node, everything required for a ''var'' AST node is not in the root node so we can close it to start with a new one.

&lt;uscript&gt;

function _type()
{
  if (has(TT_Identifier, __INTEGER)) 
  {
    a.AddChild(NT_Keyword, __INTEGER);
    t.nextToken();
  }
  else if (has(TT_Identifier, __STRING)) 
  {
    a.AddChild(NT_Keyword, __STRING);
    t.nextToken();
  }
  else if (has(TT_Identifier, __FLOAT)) 
  {
    a.AddChild(NT_Keyword, __FLOAT);
    t.nextToken();
  }
  else if (has(TT_Identifier, __BOOLEAN)) 
  {
    a.AddChild(NT_Keyword, __BOOLEAN);
    t.nextToken();
  }
  else {
    Warn(&quot;Unrecognised type:&quot;@t.tokenString()@&quot;@ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

We only support four types at the moment, if the encounter something else it's wrong and we abort the compilation.

&lt;uscript&gt;

function _function()
{
  a.AddRoot(NT_Keyword, __FUNC);
  t.nextToken(); // function
  _type();
  require(TT_Identifier);
  a.AddRoot(NT_Identifier, t.tokenString()); // function name
  t.nextToken();
  require(TT_Literal, __LBRACK);
  t.nextToken();
  _arguments();  
  require(TT_Literal, __RBRACK);
  a.CloseRoot();
  t.nextToken();
  _declarations();
  require(TT_Identifier, __BEGIN);
  t.nextToken();
  _statements();
  require(TT_Identifier, __END);
  t.nextToken();
  a.CloseRoot();
}
&lt;/uscript&gt;

We received a function declarations, we start by adding a new root node of type ''function''. Just like with the variable declaration we add the type of the function to the root node and the name of the function. But, unlike with the variable name we make the function name the new root node, to this root node we will add the function arguments. 

After we added the arguments, if any, we close the root node (the function name) and we start adding a declarations and statements block to the function root node.

Note that I don't add the '''begin''', '''end''', etc to the AST. We don't need these things in the AST because in the AST we know how many ''children'' a block has.

&lt;uscript&gt;

function _arguments()
{
  while (!has(TT_Literal, __RBRACK))
  {
    a.AddRoot(NT_Keyword, __VAR);
    _type();
    require(TT_Identifier);
    a.AddChild(NT_Identifier, t.tokenString());
    t.nextToken();
    a.CloseRoot();
    if (has(TT_Literal, __SEMICOLON)) t.nextToken();
    else break;
  }
}
&lt;/uscript&gt;

The function arguments are just defined as local variable of the function, the only reason we added them as children of the function name instead of the function because it's easy to assign values to those when we call the function.

&lt;uscript&gt;

function _statements()
{
  while (!(has(TT_Identifier, __END) || has(TT_EOF)))
  {
    _statement();
    require(TT_Literal, __SEMICOLON);
    t.nextToken();
  }
}
&lt;/uscript&gt;

Statements are read until the end of file.

&lt;uscript&gt;

function _statement()
{
  if (has(TT_Identifier, __WHILE)) _whiledo();
  else if (has(TT_Identifier, __IF)) _ifthenelse();
  else if (has(TT_Identifier)) _assignment();
  else {
    Warn(&quot;Unrecognised statement:&quot;@t.tokenString()@&quot;@ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

As defined in the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF]] a statement can be a '''while ... do''', an '''if ... then ... else''' or an assignment. When we have something else as the current token something has to be wrong and we stop with compiling.

&lt;uscript&gt;

function _whiledo()
{
  a.AddRoot(NT_Keyword, __WHILE);
  t.nextToken(); // WHILE
  _expr();
  require(TT_Identifier, __DO);
  t.nextToken();
  _codeblock();
  a.CloseRoot();
}
&lt;/uscript&gt;

A while to begins with adding the new root node of type ''while'', after that we add a child node with the expression, and a child node of a codeblock (these child nodes are added by the called functions)

&lt;uscript&gt;

function _codeblock()
{
  if (has(TT_Identifier, __BEGIN))
  {
    a.AddRoot(NT_Keyword, __BEGIN);
    t.nextToken();
    _statements();
    require(TT_Identifier, __END);
    t.nextToken();
    a.CloseRoot();
  }
  else {
    _statement();
  }
}
&lt;/uscript&gt;

If the code block starts with a begin we open a new root node because a code block may only add one child node to the current root node. This new root node will then get more than a group of statements and an '''end''' which will close the root node.

If the code block doesn't start with a '''begin''' we asume it's just a single statement.

&lt;uscript&gt;

function _ifthenelse()
{
  a.AddRoot(NT_Keyword, __IF);
  t.nextToken(); // IF
  _expr();
  require(TT_Identifier, __THEN);
  t.nextToken();
  _codeblock();
  if (has(TT_Identifier, __ELSE))
  {
    t.nextToken();
    _codeblock();
  }
  a.CloseRoot();
}
&lt;/uscript&gt;

This works just like the '''while ... do''' except that there might be a third child to be added to the '''if''' root node, the '''else''' is optional.

&lt;uscript&gt;

function _assignment()
{
  local string tmp;
  tmp = t.tokenString();
  t.nextToken();
  if (has(TT_Literal, __LBRACK)) _functioncall(tmp);
  else {
    a.AddRoot(NT_Keyword, __BECOMES);
    a.AddChild(NT_Identifier, tmp);
    require(TT_Operator, __BECOMES);
    t.nextToken();
    _expr();
    a.CloseRoot();
  }
}
&lt;/uscript&gt;

An assignment starts with a identifier, however this identifier can be a variable or a function, so we have to take a look at the next token if it's either a '''becomes''' or a left bracket. For this we had to make the compiler look a head one token (e.g. LL(2)).

If it's really an assigment we will add a new root node of type '''becomes''' and we assign the childs identifier and expression to that node.

&lt;uscript&gt;

function _expr()
{
  _boolex();
}
&lt;/uscript&gt;

This is an nice example of a useless looking function, but it might be usefull in the future when we want to add an operator with a lower precendance than the boolean expressions.

&lt;uscript&gt;

function _boolex()
{  
  _accum();
  while (has(TT_Operator, __LT)||has(TT_Operator, __LE)||has(TT_Operator, __GT)||has(TT_Operator, __GE)||
    has(TT_Operator, __EQ)||has(TT_Operator, __NE)||has(TT_Operator, __AND)||has(TT_Operator, __OR))
  {
    a.AddRoot(NT_Keyword, t.tokenString());
    a.SwitchNode();
    t.nextToken();
    _accum();
    a.CloseRoot();
  }
}
&lt;/uscript&gt;

Well here is where it's get difficult, we first decent into the _accum() function which will finally result into a child node that can have a complete sub tree, or just a single child node. After that we might get one or more boolean operators. This is the infix notation, but we want to make our AST prefix. So we add a new root node for the current boolean operator and switch that root node around with the last child node in the current root.

Let's take the following code: &lt;code&gt;x = 1 + 2&lt;/code&gt;

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |''before swap''
| style=&quot;text-align: center&quot; |''after swap'' 
|-
|
 =
  x
  1
  +
   2

|
 =
  x
  +
   1
   2

|
|}

The same applies to the following few functions below

&lt;uscript&gt;

function _accum()
{
  _mult();
  while (has(TT_Operator, __PLUS)||has(TT_Operator, __MINUS))
  {
    a.AddRoot(NT_Keyword, t.tokenString());
    a.SwitchNode();
    t.nextToken();
    _mult();
    a.CloseRoot();
  }
}

function _mult()
{
  _preop();
  while (has(TT_Operator, __MULTIPLY)||has(TT_Operator, __DIVIDE)||has(TT_Operator, __MOD))
  {
    a.AddRoot(NT_Keyword, t.tokenString());
    a.SwitchNode();
    t.nextToken();
    _preop();
    a.CloseRoot();
  }
}

function _preop()
{
  local bool open;
  open = false;
  if (has(TT_Operator, __MINUS))
  {
    open = true;
    a.AddRoot(NT_Keyword, __MINUS);
    a.AddChild(NT_Integer, &quot;0&quot;);
    t.nextToken();
  }
  else if (has(TT_Operator, __NOT))
  {
    open = true;
    a.AddRoot(NT_Keyword, __NOT);
    t.nextToken();
  }
  _operand();
  if (open) a.CloseRoot();
}
&lt;/uscript&gt;

For the '''-''' preoperator I've added a hack, it will be inserted into the AST as if it was &lt;code&gt;0 - operand&lt;/code&gt;

&lt;uscript&gt;

function _operand()
{
  local string tmp;
  if (has(TT_Identifier, __TRUE))
  {
    a.AddChild(NT_Boolean, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Identifier, __FALSE))
  {
    a.AddChild(NT_Boolean, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Identifier))
  {    
    tmp = t.tokenString();
    t.nextToken();
    if (has(TT_Literal, __LBRACK)) // is function ??
    {
      _functioncall(tmp);
    }
    else {
      a.AddChild(NT_Identifier, tmp);
    }
  }
  else if (has(TT_Integer))
  {
    a.AddChild(NT_Integer, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_String))
  {
    a.AddChild(NT_String, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Float))
  {
    a.AddChild(NT_Float, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Literal, __LBRACK))
  {
    t.nextToken();
    _expr();
    require(TT_Literal, __RBRACK);
    t.nextToken();
  }
  else {
    Warn(&quot;Unexpected token:&quot;@t.tokenString()@&quot;@ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

The operand function is the finaly stop, first we check if the the identifier is either a '''true''' or a '''false''', if not we check if the identifier is either a variable or a function call. If it's just a variable we will add a normal child to the current root node.

Next we check if it is a inline constant, or an expression between braces.

If everything fails we have something wierd and stop compiling.

&lt;uscript&gt;

function _functioncall(string name)
{
  a.AddRoot(NT_Function, name);
  t.nextToken();
  while (!has(TT_Literal, __RBRACK))
  {
    _expr();
    if (has(TT_Literal, __COMMA)) t.nextToken();
    else break;
  }
  require(TT_Literal, __RBRACK);
  t.nextToken(); // __RBRACK
  a.CloseRoot();
}
&lt;/uscript&gt;

If it's a function call we will add a new root with the function name, and give it the type ''function'', as child nodes we add the arguments passed to it. And finally close the function call root.

----</text>
    </revision>
    <revision>
      <id>1819</id>
      <timestamp>2003-04-23T13:15:14Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
/**
  Analyse and compile the language (create an AST)
*/
class Compiler extends Object dependsOn(Tokenizer) dependsOn(AST);

// terminals
const __BEGIN                 = &quot;begin&quot;;
const __END                   = &quot;end&quot;;
const __SEMICOLON             = &quot;;&quot;;
const __VAR                   = &quot;var&quot;;
const __INTEGER               = &quot;int&quot;;
const __STRING                = &quot;string&quot;;
const __FLOAT                 = &quot;float&quot;;
const __BOOLEAN               = &quot;bool&quot;;
const __FUNC                  = &quot;function&quot;;
const __BECOMES               = &quot;=&quot;;
const __WHILE                 = &quot;while&quot;;
const __DO                    = &quot;do&quot;;
const __IF                    = &quot;if&quot;;
const __THEN                  = &quot;then&quot;;
const __ELSE                  = &quot;else&quot;;
const __LT                    = &quot;&lt;&quot;;
const __LE                    = &quot;&lt;=&quot;;
const __GT                    = &quot;&gt;&quot;;
const __GE                    = &quot;&gt;=&quot;;
const __EQ                    = &quot;==&quot;;
const __NE                    = &quot;!=&quot;;
const __AND                   = &quot;&amp;&amp;&quot;;
const __OR                    = &quot;||&quot;;
const __PLUS                  = &quot;+&quot;;
const __MINUS                 = &quot;-&quot;;
const __MULTIPLY              = &quot;*&quot;;
const __DIVIDE                = &quot;/&quot;;
const __MOD                   = &quot;%&quot;;
const __NOT                   = &quot;!&quot;;
const __LBRACK                = &quot;(&quot;;
const __RBRACK                = &quot;)&quot;;
const __TRUE                  = &quot;true&quot;;
const __FALSE                 = &quot;false&quot;;
const __COMMA                 = &quot;,&quot;;
// terminals -- end
&lt;/uscript&gt;

All the terminals as defined in the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF|grammar]], it's best to use constant instead of inline strings because this prevents you from making typos and it will also make it easier to change terminal. For example if you want to use '''{''' ... '''}''' instead of '''begin''' ... '''end''' you can simply change the constant value.

&lt;uscript&gt;
var private Tokenizer t;
var private AST a;

function Compile(Tokenizer tokenizer, AST tree)
{
  t = tokenizer;
  a = tree;
  _program();
}
&lt;/uscript&gt;

The main function of this class, this will start the parsing of the code.

&lt;uscript&gt;

function bool has(Tokenizer.tokenType token, optional string text)
{
  if (text == &quot;&quot;) return token ~= t.currentToken();
  return (text ~= t.tokenString()) &amp;&amp; (token ~= t.currentToken());
}
&lt;/uscript&gt;

The function has checks if the current token has the correct type, and optional if the token string is equal to the input. 

&lt;uscript&gt;

function require(Tokenizer.tokenType token, optional string text)
{
  local bool res;
  res = has(token, text);
  if (!res)
  {
    Warn(&quot;Expected (&quot;$token$&quot;) \&quot;&quot;$text$&quot;\&quot; but has (&quot;$t.currentToken()$&quot;) \&quot;&quot;$t.tokenString()$&quot;\&quot; @ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

Require does the same as ''has()'' except that if the result is false it will abort the whole compilation. ''Require'' is used to check for tokens that have to be there in order to for the language to be conform to the specification. 

Currently it uses ''assert()'' to stop the compilation, this will ofcourse stop the whole system, you may want to write a diffirent instruction here to stop compiling.

&lt;uscript&gt;

function _program()
{
  _declarations();
  _statements();
  require(TT_EOF);
}
&lt;/uscript&gt;

The initial rule, note that it requires an end of file at the end, this is to ensure that no more declarations are possible after the main code has been finished.

&lt;uscript&gt;

function _declarations()
{
  while (has(TT_Identifier, __VAR) || has(TT_Identifier, __FUNC))
  {
    if (has(TT_Identifier, __VAR)) _declaration();
    else if (has(TT_Identifier, __FUNC)) _function();
    require(TT_Literal, __SEMICOLON);
    t.nextToken();
  }
}
&lt;/uscript&gt;

The declaration block, a declaration is either a '''var''' or '''function''', while this is true we keep reading declarations. When it's not true it has to be a statement.

&lt;uscript&gt;

function _declaration()
{
  a.AddRoot(NT_Keyword, __VAR);
  t.nextToken(); // __VAR
  _type();
  require(TT_Identifier);
  a.AddChild(NT_Identifier, t.tokenString());
  t.nextToken();
  a.CloseRoot();
}
&lt;/uscript&gt;

A variable declaration, we start by adding a new root node to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AST]], next we decent into the type specification where type is added to the current root node. Next we should get the variable identifier which we also add to the current root node.

At the end we close the current root node, everything required for a ''var'' AST node is not in the root node so we can close it to start with a new one.

&lt;uscript&gt;

function _type()
{
  if (has(TT_Identifier, __INTEGER)) 
  {
    a.AddChild(NT_Keyword, __INTEGER);
    t.nextToken();
  }
  else if (has(TT_Identifier, __STRING)) 
  {
    a.AddChild(NT_Keyword, __STRING);
    t.nextToken();
  }
  else if (has(TT_Identifier, __FLOAT)) 
  {
    a.AddChild(NT_Keyword, __FLOAT);
    t.nextToken();
  }
  else if (has(TT_Identifier, __BOOLEAN)) 
  {
    a.AddChild(NT_Keyword, __BOOLEAN);
    t.nextToken();
  }
  else {
    Warn(&quot;Unrecognised type:&quot;@t.tokenString()@&quot;@ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

We only support four types at the moment, if the encounter something else it's wrong and we abort the compilation.

&lt;uscript&gt;

function _function()
{
  a.AddRoot(NT_Keyword, __FUNC);
  t.nextToken(); // function
  _type();
  require(TT_Identifier);
  a.AddRoot(NT_Identifier, t.tokenString()); // function name
  t.nextToken();
  require(TT_Literal, __LBRACK);
  t.nextToken();
  _arguments();  
  require(TT_Literal, __RBRACK);
  a.CloseRoot();
  t.nextToken();
  _declarations();
  require(TT_Identifier, __BEGIN);
  t.nextToken();
  _statements();
  require(TT_Identifier, __END);
  t.nextToken();
  a.CloseRoot();
}
&lt;/uscript&gt;

We received a function declarations, we start by adding a new root node of type ''function''. Just like with the variable declaration we add the type of the function to the root node and the name of the function. But, unlike with the variable name we make the function name the new root node, to this root node we will add the function arguments. 

After we added the arguments, if any, we close the root node (the function name) and we start adding a declarations and statements block to the function root node.

Note that I don't add the '''begin''', '''end''', etc to the AST. We don't need these things in the AST because in the AST we know how many ''children'' a block has.

&lt;uscript&gt;

function _arguments()
{
  while (!has(TT_Literal, __RBRACK))
  {
    a.AddRoot(NT_Keyword, __VAR);
    _type();
    require(TT_Identifier);
    a.AddChild(NT_Identifier, t.tokenString());
    t.nextToken();
    a.CloseRoot();
    if (has(TT_Literal, __SEMICOLON)) t.nextToken();
    else break;
  }
}
&lt;/uscript&gt;

The function arguments are just defined as local variable of the function, the only reason we added them as children of the function name instead of the function because it's easy to assign values to those when we call the function.

&lt;uscript&gt;

function _statements()
{
  while (!(has(TT_Identifier, __END) || has(TT_EOF)))
  {
    _statement();
    require(TT_Literal, __SEMICOLON);
    t.nextToken();
  }
}
&lt;/uscript&gt;

Statements are read until the end of file.

&lt;uscript&gt;

function _statement()
{
  if (has(TT_Identifier, __WHILE)) _whiledo();
  else if (has(TT_Identifier, __IF)) _ifthenelse();
  else if (has(TT_Identifier)) _assignment();
  else {
    Warn(&quot;Unrecognised statement:&quot;@t.tokenString()@&quot;@ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

As defined in the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EBNF]] a statement can be a '''while ... do''', an '''if ... then ... else''' or an assignment. When we have something else as the current token something has to be wrong and we stop with compiling.

&lt;uscript&gt;

function _whiledo()
{
  a.AddRoot(NT_Keyword, __WHILE);
  t.nextToken(); // WHILE
  _expr();
  require(TT_Identifier, __DO);
  t.nextToken();
  _codeblock();
  a.CloseRoot();
}
&lt;/uscript&gt;

A while to begins with adding the new root node of type ''while'', after that we add a child node with the expression, and a child node of a codeblock (these child nodes are added by the called functions)

&lt;uscript&gt;

function _codeblock()
{
  if (has(TT_Identifier, __BEGIN))
  {
    a.AddRoot(NT_Keyword, __BEGIN);
    t.nextToken();
    _statements();
    require(TT_Identifier, __END);
    t.nextToken();
    a.CloseRoot();
  }
  else {
    _statement();
  }
}
&lt;/uscript&gt;

If the code block starts with a begin we open a new root node because a code block may only add one child node to the current root node. This new root node will then get more than a group of statements and an '''end''' which will close the root node.

If the code block doesn't start with a '''begin''' we asume it's just a single statement.

&lt;uscript&gt;

function _ifthenelse()
{
  a.AddRoot(NT_Keyword, __IF);
  t.nextToken(); // IF
  _expr();
  require(TT_Identifier, __THEN);
  t.nextToken();
  _codeblock();
  if (has(TT_Identifier, __ELSE))
  {
    t.nextToken();
    _codeblock();
  }
  a.CloseRoot();
}
&lt;/uscript&gt;

This works just like the '''while ... do''' except that there might be a third child to be added to the '''if''' root node, the '''else''' is optional.

&lt;uscript&gt;

function _assignment()
{
  local string tmp;
  tmp = t.tokenString();
  t.nextToken();
  if (has(TT_Literal, __LBRACK)) _functioncall(tmp);
  else {
    a.AddRoot(NT_Keyword, __BECOMES);
    a.AddChild(NT_Identifier, tmp);
    require(TT_Operator, __BECOMES);
    t.nextToken();
    _expr();
    a.CloseRoot();
  }
}
&lt;uscript&gt;
An assignment starts with a identifier, however this identifier can be a variable or a function, so we have to take a look at the next token if it's either a '''becomes''' or a left bracket. For this we had to make the compiler look a head one token (e.g. LL(2)).
If it's really an assigment we will add a new root node of type '''becomes''' and we assign the childs identifier and expression to that node.
&lt;/uscript&gt;

function _expr()

{
  _boolex();

}

&lt;/uscript&gt;

This is an nice example of a useless looking function, but it might be usefull in the future when we want to add an operator with a lower precendance than the boolean expressions.

&lt;uscript&gt;

function _boolex()
{  
  _accum();
  while (has(TT_Operator, __LT)||has(TT_Operator, __LE)||has(TT_Operator, __GT)||has(TT_Operator, __GE)||
    has(TT_Operator, __EQ)||has(TT_Operator, __NE)||has(TT_Operator, __AND)||has(TT_Operator, __OR))
  {
    a.AddRoot(NT_Keyword, t.tokenString());
    a.SwitchNode();
    t.nextToken();
    _accum();
    a.CloseRoot();
  }
}
&lt;/uscript&gt;

Well here is where it's get difficult, we first decent into the _accum() function which will finally result into a child node that can have a complete sub tree, or just a single child node. After that we might get one or more boolean operators. This is the infix notation, but we want to make our AST prefix. So we add a new root node for the current boolean operator and switch that root node around with the last child node in the current root.

Let's take the following code: &lt;code&gt;x = 1 + 2&lt;/code&gt;

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |''before swap''
| style=&quot;text-align: center&quot; |''after swap'' 
|-
|
 =
  x
  1
  +
   2

|
 =
  x
  +
   1
   2

|
|}

The same applies to the following few functions below

&lt;uscript&gt;

function _accum()
{
  _mult();
  while (has(TT_Operator, __PLUS)||has(TT_Operator, __MINUS))
  {
    a.AddRoot(NT_Keyword, t.tokenString());
    a.SwitchNode();
    t.nextToken();
    _mult();
    a.CloseRoot();
  }
}

function _mult()
{
  _preop();
  while (has(TT_Operator, __MULTIPLY)||has(TT_Operator, __DIVIDE)||has(TT_Operator, __MOD))
  {
    a.AddRoot(NT_Keyword, t.tokenString());
    a.SwitchNode();
    t.nextToken();
    _preop();
    a.CloseRoot();
  }
}

function _preop()
{
  local bool open;
  open = false;
  if (has(TT_Operator, __MINUS))
  {
    open = true;
    a.AddRoot(NT_Keyword, __MINUS);
    a.AddChild(NT_Integer, &quot;0&quot;);
    t.nextToken();
  }
  else if (has(TT_Operator, __NOT))
  {
    open = true;
    a.AddRoot(NT_Keyword, __NOT);
    t.nextToken();
  }
  _operand();
  if (open) a.CloseRoot();
}
&lt;/uscript&gt;

For the '''-''' preoperator I've added a hack, it will be inserted into the AST as if it was &lt;code&gt;0 - operand&lt;/code&gt;

&lt;uscript&gt;

function _operand()
{
  local string tmp;
  if (has(TT_Identifier, __TRUE))
  {
    a.AddChild(NT_Boolean, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Identifier, __FALSE))
  {
    a.AddChild(NT_Boolean, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Identifier))
  {    
    tmp = t.tokenString();
    t.nextToken();
    if (has(TT_Literal, __LBRACK)) // is function ??
    {
      _functioncall(tmp);
    }
    else {
      a.AddChild(NT_Identifier, tmp);
    }
  }
  else if (has(TT_Integer))
  {
    a.AddChild(NT_Integer, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_String))
  {
    a.AddChild(NT_String, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Float))
  {
    a.AddChild(NT_Float, t.tokenString());
    t.nextToken();
  }
  else if (has(TT_Literal, __LBRACK))
  {
    t.nextToken();
    _expr();
    require(TT_Literal, __RBRACK);
    t.nextToken();
  }
  else {
    Warn(&quot;Unexpected token:&quot;@t.tokenString()@&quot;@ &quot;$t.currentLine()$&quot;,&quot;$t.currentPos());
    assert(false);
  }
}
&lt;/uscript&gt;

The operand function is the finaly stop, first we check if the the identifier is either a '''true''' or a '''false''', if not we check if the identifier is either a variable or a function call. If it's just a variable we will add a normal child to the current root node.

Next we check if it is a inline constant, or an expression between braces.

If everything fails we have something wierd and stop compiling.

&lt;uscript&gt;

function _functioncall(string name)
{
  a.AddRoot(NT_Function, name);
  t.nextToken();
  while (!has(TT_Literal, __RBRACK))
  {
    _expr();
    if (has(TT_Literal, __COMMA)) t.nextToken();
    else break;
  }
  require(TT_Literal, __RBRACK);
  t.nextToken(); // __RBRACK
  a.CloseRoot();
}
&lt;/uscript&gt;

If it's a function call we will add a new root with the function name, and give it the type ''function'', as child nodes we add the arguments passed to it. And finally close the function call root.

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce/EBNF</title>
    <id>602</id>
    <revision>
      <id>1814</id>
      <timestamp>2003-04-23T12:18:20Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">If you don't understand this first read about [http://www.garshol.priv.no/download/text/bnf.html EBNF].

==Non terminals ==

  PROGRAM               ::= DECLARATIONS STATEMENTS

It's not that difficult to allow declarations everywhere in the code, it's just that I prefer to have it at the top. This way it's easy to find the declaration when you are looking at the code.
  DECLARATIONS          ::= ((DECLARATION|FUNCTION) SEMICOLON)*

Well ok, this allows you to mix variable declarations and function declarations, but that's up to you. You might prefer to declare vars first and then function. This gives you the freedom.

Note that this rule may be empty. I use the semicolon as a divider of parts, and it's checked here and not in the declaration/function because it's part of the block, seperating the elements.
  DECLARATION           ::= VAR TYPE IDENTIFIER

C style variable declaration, but prefixed with a '''var''' keyword. This is to make it a bit easier for the parser.
  TYPE                  ::= INTEGER
                          | STRING
                          | FLOAT
                          | BOOLEAN

We've got four types, I've not thought about custom type declarations.
  IDENTIFIER            ::= __implicit__

Identifiers are returned by the tokenizer so I haven't added it to the language specification.
  FUNCTION              ::= FUNC TYPE IDENTIFIER LBRACK ARGUMENTS RBRACK DECLARATIONS BEGIN STATEMENTS END

A function declaration including body. You always have to return a type, this is used to declare the always present local variable ''result'' (just like in [[Legacy:Pascal|Pascal]] functions). Before the function body you can define local variables (and even functions). The function body is encapsued with a '''begin''' and '''end''' just like in [[Legacy:Pascal|Pascal]]. I like this way, ok it's more to write but it makes to code more ''readable'', ok I just like it since I can easily replace it with '''{'''  and '''}''' or whatever I want.
  ARGUMENTS             ::= (TYPE LVALUE (SEMICOLON TYPE LVALUE)*)?

Function arguments are optional, and to prevent you from adding a semicolon after the last argument I used this construction. It's doesn't matter for the resulting AST, just the parser.
  STATEMENTS            ::= (STATEMENT SEMICOLON)*

Zero or more statements, yes it's possible to define a program without any code to be executed, this might be usefull for function declarations to be reused or something.
  STATEMENT             ::= ASSIGNMENT
                          | WHILEDO
                          | IFTHENELSE

A statement can be everything, an assignment or a control block like '''while''' ... '''do''' or '''if''' ... '''then''' ... '''else'''. It's easy to add new kind of statements here.
  ASSIGNMENT            ::= IDENTIFIER BECOMES EXPR
                          | FUNCTIONCALL

Well this is the reason why BruteForce is no longer LL(1), because I have to look a head to see if it's an assignment or an function call. Both start with an identifier. I could work around it but this would require me to add a keyword to one of them. For example &lt;code&gt;'''call''' function_name()&lt;/code&gt;
  WHILEDO               ::= WHILE EXPR DO CODEBLOCK
  CODEBLOCK             ::= STATEMENT
                          | (BEGIN STATEMENTS END)

The '''while''' and '''if''' control blocks accept code blocks this is either one statement or more, because more statements qould require to use the semicolon to divide them a code block will start with '''begin''' and end with '''end''' .
  IFTHENELSE            ::= IF EXPR THEN CODEBLOCK (ELSE CODEBLOCK)?

I've made the else part optional, empty '''else''' parts are just ugly and it can easily be avoided since it's a diffirence between a semicolon and '''else'''
  EXPR                  ::= BOOLEX

Here's an nice example of a pretty useless rule, but maybe when I want to extend expression with something that has a lower precendence than a boolean expression I would only need to update one rule instead of a lot.

The following rules define the operator precedance, the sooner the lower the priority. The definition below allows constructs like:

&lt;uscript&gt;
1+2+3+4+5 
1*2+3/5&lt;=4+1
&lt;/uscript&gt;
  BOOLEX                ::= ACCUM ((LT|LE|GT|GE|EQ|NE) ACCUM)*
  ACCUM                 ::= MULT ((PLUS|MINUS) MULT)*
  MULT                  ::= PREOP ((MULTIPLY|DIVIDE) PREOP)*
  PREOP                 ::= (MINUS|NOT)? OPERAND
  OPERAND               ::= IDENTIFIER
                          | FUNCTIONCALL
                          | INTVALUE
                          | FLOATVALUE
                          | STRINGVALUE
                          | BOOLVALUE
                          | LBRACK EXPR RBRACK

An operant is either a constant value, a variable identifier, a function call or again an expression between braches. These expressions between braces are very important, it allows you to overrule the operator precedance. You won't see these braces in the AST anymore because they are no longer needed in there, the operators are already set in the correct order.
  FUNCTIONCALL          ::= IDENTIFIER LBRACK (EXPR (COMMA EXPR)*)? RBRACK

The arguments of a function call are expressions, this allows you to use a constant or expression besides the normal identifiers.
  INTVALUE              ::= __implicit__
  FLOATVALUE            ::= __implicit__
  STRINGVALUE           ::= __implicit__
  BOOLVALUE             ::= TRUE|FALSE

Boolean values are returned as an identifier by the tokenizer, so we need to filter those out manualy.

==Terminals ==

  BEGIN                 ::= 'begin'
  END                   ::= 'end'
  SEMICOLON             ::= ';'
  VAR                   ::= 'var'
  INTEGER               ::= 'int'
  STRING                ::= 'string'
  FLOAT                 ::= 'float'
  BOOLEAN               ::= 'bool'
  FUNC                  ::= 'function'
  BECOMES               ::= '='
  WHILE                 ::= 'while'
  DO                    ::= 'do'
  IF                    ::= 'if'
  THEN                  ::= 'then'
  ELSE                  ::= 'else'
  LT                    ::= '&lt;'
  LE                    ::= '&lt;='
  GT                    ::= '&gt;'
  GE                    ::= '&gt;='
  EQ                    ::= '=='
  NE                    ::= '!='
  PLUS                  ::= '+'
  MINUS                 ::= '-'
  MULTIPLY              ::= '*'
  DIVIDE                ::= '/'
  MOD                   ::= '%'
  NOT                   ::= '!'
  LBRACK                ::= '('
  RBRACK                ::= ')'
  TRUE                  ::= 'true'
  FALSE                 ::= 'false'
  COMMA                 ::= ','

==Sample code ==

Here's a piece of example code that will print all easters dates from 2003 to 2012, unless you provide diffirent values on the input

&lt;uscript&gt;
var int y;
var int ey;

function string easter(int year)
  var int m;
  var int d;
  var int g;
  var int c;
  var int x;
  var int z;
  var int b;
  var int e;
begin
  g = year % 19 + 1;         
  c = (year / 100) + 1;
  x = (3*c / 4) - 12;
  z = ((8*c + 5) / 25) - 5;
  b = (5*year / 4) - x - 10;
  e = (11*g + 20 + z - x);
  e = e % 30;                     
  if e &lt; 0 then e = e+30;
  if (((e == 25)+(g&gt;11) == 2) + (e==24)) &gt; 0 then e = e+1;
  d = 44-e;
  if d &lt; 21 then d = d+30;
  d = d+7-((b+d) - ((b+d)/7)*7);
  if d&gt;31 then m = 4 else m = 3;
  if d&gt;31 then d = d-31;
  result = &quot;&quot;+year+&quot;-&quot;+m+&quot;-&quot;+d;
end;

y = 2003;
ey = 2012;

if (argc() == 1) then ey = Int(argv(0));
if (argc() == 2) then begin
  y = Int(argv(0));
  ey = Int(argv(1));
end;
print(&quot;Day of Easter for &quot;+y+&quot;-&quot;+ey+&quot;.&quot;);

while (y &lt;= ey) do begin
  print(easter(y));
  y = y+1;
end;
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1815</id>
      <timestamp>2003-04-22T21:24:57Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>is this readable ?</comment>
      <text xml:space="preserve">If you don't understand this first read about [http://www.garshol.priv.no/download/text/bnf.html EBNF].

==Non terminals ==

  PROGRAM               ::= DECLARATIONS STATEMENTS

It's not that difficult to allow declarations everywhere in the code, it's just that I prefer to have it at the top. This way it's easy to find the declaration when you are looking at the code.
  DECLARATIONS          ::= ((DECLARATION|FUNCTION) SEMICOLON)*

Well ok, this allows you to mix variable declarations and function declarations, but that's up to you. You might prefer to declare vars first and then function. This gives you the freedom.

Note that this rule may be empty. I use the semicolon as a divider of parts, and it's checked here and not in the declaration/function because it's part of the block, seperating the elements.
  DECLARATION           ::= VAR TYPE IDENTIFIER

C style variable declaration, but prefixed with a '''var''' keyword. This is to make it a bit easier for the parser.
  TYPE                  ::= INTEGER
                          | STRING
                          | FLOAT
                          | BOOLEAN

We've got four types, I've not thought about custom type declarations.
  IDENTIFIER            ::= __implicit__

Identifiers are returned by the tokenizer so I haven't added it to the language specification.
  FUNCTION              ::= FUNC TYPE IDENTIFIER LBRACK ARGUMENTS RBRACK DECLARATIONS BEGIN STATEMENTS END

A function declaration including body. You always have to return a type, this is used to declare the always present local variable ''result'' (just like in [[Legacy:Pascal|Pascal]] functions). Before the function body you can define local variables (and even functions). The function body is encapsued with a '''begin''' and '''end''' just like in [[Legacy:Pascal|Pascal]]. I like this way, ok it's more to write but it makes to code more ''readable'', ok I just like it since I can easily replace it with '''{'''  and '''}''' or whatever I want.
  ARGUMENTS             ::= (TYPE LVALUE (SEMICOLON TYPE LVALUE)*)?

Function arguments are optional, and to prevent you from adding a semicolon after the last argument I used this construction. It's doesn't matter for the resulting AST, just the parser.
  STATEMENTS            ::= (STATEMENT SEMICOLON)*

Zero or more statements, yes it's possible to define a program without any code to be executed, this might be usefull for function declarations to be reused or something.
  STATEMENT             ::= ASSIGNMENT
                          | WHILEDO
                          | IFTHENELSE

A statement can be everything, an assignment or a control block like '''while''' ... '''do''' or '''if''' ... '''then''' ... '''else'''. It's easy to add new kind of statements here.
  ASSIGNMENT            ::= IDENTIFIER BECOMES EXPR
                          | FUNCTIONCALL

Well this is the reason why BruteForce is no longer LL(1), because I have to look a head to see if it's an assignment or an function call. Both start with an identifier. I could work around it but this would require me to add a keyword to one of them. For example &lt;code&gt;'''call''' function_name()&lt;/code&gt;
  WHILEDO               ::= WHILE EXPR DO CODEBLOCK
  CODEBLOCK             ::= STATEMENT
                          | (BEGIN STATEMENTS END)

The '''while''' and '''if''' control blocks accept code blocks this is either one statement or more, because more statements qould require to use the semicolon to divide them a code block will start with '''begin''' and end with '''end''' .
  IFTHENELSE            ::= IF EXPR THEN CODEBLOCK (ELSE CODEBLOCK)?

I've made the else part optional, empty '''else''' parts are just ugly and it can easily be avoided since it's a diffirence between a semicolon and '''else'''
  EXPR                  ::= BOOLEX

Here's an nice example of a pretty useless rule, but maybe when I want to extend expression with something that has a lower precendence than a boolean expression I would only need to update one rule instead of a lot.

The following rules define the operator precedance, the sooner the lower the priority. The definition below allows constructs like:

&lt;uscript&gt;
1+2+3+4+5 
1*2+3/5&lt;=4+1
&lt;/uscript&gt;
  BOOLEX                ::= ACCUM ((LT|LE|GT|GE|EQ|NE) ACCUM)*
  ACCUM                 ::= MULT ((PLUS|MINUS) MULT)*
  MULT                  ::= PREOP ((MULTIPLY|DIVIDE) PREOP)*
  PREOP                 ::= (MINUS|NOT)? OPERAND
  OPERAND               ::= IDENTIFIER
                          | FUNCTIONCALL
                          | INTVALUE
                          | FLOATVALUE
                          | STRINGVALUE
                          | BOOLVALUE
                          | LBRACK EXPR RBRACK

An operant is either a constant value, a variable identifier, a function call or again an expression between braches. These expressions between braces are very important, it allows you to overrule the operator precedance. You won't see these braces in the AST anymore because they are no longer needed in there, the operators are already set in the correct order.
  FUNCTIONCALL          ::= IDENTIFIER LBRACK (EXPR (COMMA EXPR)*)? RBRACK

The arguments of a function call are expressions, this allows you to use a constant or expression besides the normal identifiers.
  INTVALUE              ::= __implicit__
  FLOATVALUE            ::= __implicit__
  STRINGVALUE           ::= __implicit__
  BOOLVALUE             ::= TRUE|FALSE

Boolean values are returned as an identifier by the tokenizer, so we need to filter those out manualy.

==Terminals ==

  BEGIN                 ::= 'begin'
  END                   ::= 'end'
  SEMICOLON             ::= ';'
  VAR                   ::= 'var'
  INTEGER               ::= 'int'
  STRING                ::= 'string'
  FLOAT                 ::= 'float'
  BOOLEAN               ::= 'bool'
  FUNC                  ::= 'function'
  UNDERSCORE            ::= '_'
  BECOMES               ::= '='
  WHILE                 ::= 'while'
  DO                    ::= 'do'
  IF                    ::= 'if'
  THEN                  ::= 'then'
  ELSE                  ::= 'else'
  LT                    ::= '&lt;'
  LE                    ::= '&lt;='
  GT                    ::= '&gt;'
  GE                    ::= '&gt;='
  EQ                    ::= '=='
  NE                    ::= '!='
  PLUS                  ::= '+'
  MINUS                 ::= '-'
  MULTIPLY              ::= '*'
  DIVIDE                ::= '/'
  NOT                   ::= '!'
  LBRACK                ::= '('
  RBRACK                ::= ')'
  TRUE                  ::= 'true'
  FALSE                 ::= 'false'
  COMMA                 ::= ','

==Sample code ==

Here's a piece of example code that will print all easters dates from 2003 to 2012, unless you provide diffirent values on the input

&lt;uscript&gt;
var int y;
var int ey;

function string easter(int year)
  var int m;
  var int d;
  var int g;
  var int c;
  var int x;
  var int z;
  var int b;
  var int e;
begin
  g = year % 19 + 1;         
  c = (year / 100) + 1;
  x = (3*c / 4) - 12;
  z = ((8*c + 5) / 25) - 5;
  b = (5*year / 4) - x - 10;
  e = (11*g + 20 + z - x);
  e = e % 30;                     
  if e &lt; 0 then e = e+30;
  if (((e == 25)+(g&gt;11) == 2) + (e==24)) &gt; 0 then e = e+1;
  d = 44-e;
  if d &lt; 21 then d = d+30;
  d = d+7-((b+d) - ((b+d)/7)*7);
  if d&gt;31 then m = 4 else m = 3;
  if d&gt;31 then d = d-31;
  result = &quot;&quot;+year+&quot;-&quot;+m+&quot;-&quot;+d;
end;

y = 2003;
ey = 2012;

if (argc() == 1) then ey = Int(argv(0));
if (argc() == 2) then begin
  y = Int(argv(0));
  ey = Int(argv(1));
end;
print(&quot;Day of Easter for &quot;+y+&quot;-&quot;+ey+&quot;.&quot;);

while (y &lt;= ey) do begin
  print(easter(y));
  y = y+1;
end;
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce/Interpreter</title>
    <id>605</id>
    <revision>
      <id>1820</id>
      <timestamp>2003-04-24T15:40:37Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class Interpreter extends Object dependsOn(AST) dependsOn(Scope) dependsOn(Compiler);

var private AST a;
var private Scope s;
var private array&lt;string&gt; input;

// keywords
const __BEGIN                 = &quot;begin&quot;;
const __VAR                   = &quot;var&quot;;
const __INTEGER               = &quot;int&quot;;
const __STRING                = &quot;string&quot;;
const __FLOAT                 = &quot;float&quot;;
const __BOOLEAN               = &quot;bool&quot;;
const __FUNC                  = &quot;function&quot;;
const __BECOMES               = &quot;=&quot;;
const __WHILE                 = &quot;while&quot;;
const __IF                    = &quot;if&quot;;
const __LT                    = &quot;&lt;&quot;;
const __LE                    = &quot;&lt;=&quot;;
const __GT                    = &quot;&gt;&quot;;
const __GE                    = &quot;&gt;=&quot;;
const __EQ                    = &quot;==&quot;;
const __NE                    = &quot;!=&quot;;
const __AND                   = &quot;&amp;&amp;&quot;;
const __OR                    = &quot;||&quot;;
const __PLUS                  = &quot;+&quot;;
const __MINUS                 = &quot;-&quot;;
const __MULTIPLY              = &quot;*&quot;;
const __DIVIDE                = &quot;/&quot;;
const __MOD                   = &quot;%&quot;;
const __NOT                   = &quot;!&quot;;
const __TRUE                  = &quot;true&quot;;
const __FALSE                 = &quot;false&quot;;
// terminals -- end
&lt;/uscript&gt;

These are the keywords that we can encounter in the AST

&lt;uscript&gt;

const FUNCRESULT              = &quot;result&quot;;
&lt;/uscript&gt;

the name of the default local variable of function, the one that will contain the result.

&lt;uscript&gt;

function Create(AST inAst, Scope inScope, array&lt;string&gt; inInput)
{
  a = inAst;
  s = inScope;
  input = inInput;
}

function Execute()
{
  local int i;
  for (i = 0; i &lt; a.Tree.length; i++)
  {
    if (a.Tree[i].parent == -1) ExecuteRoot(i);
  }
}
&lt;/uscript&gt;

Execute will walk through all the tree nodes to search for the main root nodes, without a parent, and execute those.

&lt;uscript&gt;

private function ExecuteRoot(int node)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __VAR) _var(node);
    if (a.Tree[node].value == __BECOMES) _assignment(node);
    if (a.Tree[node].value == __IF) _ifthenelse(node);
    if (a.Tree[node].value == __WHILE) _whiledo(node);
    if (a.Tree[node].value == __FUNC) _function(node);
  }
  if (a.Tree[node].type == NT_Function)
  {
    d = _functioncall(node);
  }
}
&lt;/uscript&gt;

This will execute a root node. A root node can be a variable or function declaration, an assigment, if statement , while statement or a function call.

Each node type has it's own way of handling, but basically it's all the same. Each function will be called with the current AST node to use.

&lt;uscript&gt;

/**
  returns the value of the nth child
*/
private function string ChildValue(int node, optional int n)
{
  return a.Tree[a.Tree[node].children[n]].value;
}

/**
  returns the id of the nth child
*/
private function int Child(int node, optional int n)
{
  return a.Tree[node].children[n];
}
&lt;/uscript&gt;

These two function has as only purpose to keep the code below a bit more readable. Just imagine what a mess it would be if I repeated the above code in the rest of the class.

&lt;uscript&gt;

/**
  converts BruteForce bool to UScript bool
*/
private function bool boolean(string in)
{
  return !(in ~= __FALSE);
}

/**
  uscript bool to BruteForce bool
*/
private function string boolToString(bool in)
{
  if (in) return __TRUE;
  else return __FALSE;
}
&lt;/uscript&gt;

We can't use the built-in boolean type cast because out bools are ''true'' and ''false'' instead of ''not 0'' and ''0''.

&lt;uscript&gt;

/**
  Convert from one type to the other
*/
private function Scope.Declaration typeCast(Scope.Declaration d, Scope.DeclarationType type)
{
  if (d.type == type) return d;
  if (type == DT_Int)
  {
    if (d.type == DT_Bool) d.value = String(Int(boolean(d.value)));
    else d.value = String(Int(d.value));
    d.type = DT_Int;
  }
  else if (type == DT_Int)
  {
    if (d.type == DT_Bool) d.value = String(Float(boolean(d.value)));
    else d.value = String(Float(d.value));
    d.type = DT_Float;
  }
  else if (type == DT_Bool)
  {
    if (d.type == DT_String) d.value = boolToString(d.value != &quot;&quot;);
    else if (d.type == DT_Int) d.value = boolToString(Int(d.value) != 0);
    else if (d.type == DT_Float) d.value = boolToString(Float(d.value) != 0.0);
    else d.value = boolToString(Boolean(d.value));
    d.type = DT_Bool;
  }
  else if (type == DT_String)
  {
    d.type = DT_String;
  }
  return d;
}
&lt;/uscript&gt;

This function makes type completeness possible, each type will be converted into an other type.

&lt;uscript&gt;

private function _var(int node, optional string initval)
{
                   // name                                 value
  s.newDeclaration(ChildValue(node, 1), s.stringToType(ChildValue(node, 0)), initval);
}
&lt;/uscript&gt;

Declare a new variable in the current scope. The optional initval is used during the passing of the function arguments.

&lt;uscript&gt;

private function _assignment(int node)
{                  // name              expression            left hand type
  s.setDeclaration(ChildValue(node, 0), typeCast(_expr(Child(node, 1)), s.getType(ChildValue(node, 0))).value );
}

private function _ifthenelse(int node)
{
  if (boolean(typeCast(_expr(Child(node, 0)), DT_Bool).value)) //if true
  {
    _codeblock(Child(node, 1)); // then
  }
  else if (a.Tree[node].children.length &gt;= 3) // else
  {
    _codeblock(Child(node, 2));
  }
}
&lt;/uscript&gt;

Check if the first child node evaluates to ''true'', and if so execute the second child node which is the ''then'' statement. If not check if there's a third child (the optional ''else'' part), and execute it.

&lt;uscript&gt;

private function _whiledo(int node)
{
  while (boolean(typeCast(_expr(Child(node, 0)), DT_Bool).value)) //while true
  {
    _codeblock(Child(node, 1)); // do
  }  
}

private function _codeblock(int node)
{
  local int i;
  if ((a.Tree[node].type == NT_Keyword) &amp;&amp; (a.Tree[node].value == __BEGIN))
  {
    for (i = 0; i &lt; a.Tree[node].children.length; i++)
    {
      ExecuteRoot(a.Tree[node].children[i]);
    }
  }
  else {
    ExecuteRoot(node);
  }
}
&lt;/uscript&gt;

If the current node is a ''begin'' root node we will execute all it's children, if not it's just a single statement and we execute that one.

Note that I just call the ExecuteRoot function, this means that there is a possibility for inline variable and function declaration even tho the language specification doesn't allow it the interpreter accepts it.

&lt;uscript&gt;

private function Scope.Declaration _expr(int node, optional Scope.DeclarationType type)
{
  return _boolex(node, type);
}

private function Scope.Declaration _boolex(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __LT)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &lt; Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &lt; Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &lt; Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &lt; _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __LE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &lt;= Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &lt;= Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &lt;= Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &lt;= _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __GT)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &gt; Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &gt; Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &gt; Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &gt; _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __GE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &gt;= Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &gt;= Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &gt;= Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &gt;= _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __EQ)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) == Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) == Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Boolean(d.value) == Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) d.value = boolToString(d.value == _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __NE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) != Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) != Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Boolean(d.value) != Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) d.value = boolToString(d.value != _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __AND)
    {
      d = _expr(Child(node, 0));
      d.value = boolToString( Boolean(d.value) &amp;&amp; Boolean(_expr(Child(node, 1)).value) );
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __OR)
    {
      d = _expr(Child(node, 0));
      d.value = boolToString(Boolean(d.value) || Boolean(_expr(Child(node, 1)).value));
      d.type = DT_Bool;
      return d;
    }
  }
  return _accum(node, type);
}
&lt;/uscript&gt;

Right hand side will be type casted to the left hand side, that's why we temporarily save the result of the left hand side so that we can pass the type to the right hand side.

&lt;uscript&gt;

private function Scope.Declaration _accum(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __PLUS)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = String(Int(d.value) + Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) + Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) &amp;&amp; !Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) d.value = d.value $ _expr(Child(node, 1), type).value;
      return d;
    }
    else if (a.Tree[node].value == __MINUS)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = String(Int(d.value) - Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) - Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) &amp;&amp; !Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) _expr(Child(node, 1), type).value;
      return d;
    }
  }
  return _mult(node, type);
}

private function Scope.Declaration _mult(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __MULTIPLY)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = String(Int(d.value) * Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) * Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) || Boolean(_expr(Child(node, 1), type).value)); 
      if (type == DT_String) _expr(Child(node, 1), type); // ??
      return d;
    }
    else if (a.Tree[node].value == __DIVIDE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value =  String(Int(d.value) / Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) / Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) || !Boolean(_expr(Child(node, 1), type).value)); 
      if (type == DT_String) _expr(Child(node, 1), type); //?
      return d;
    }
    else if (a.Tree[node].value == __MOD)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value =  String(Int(Int(d.value) % Int(_expr(Child(node, 1), type).value)));
      if (type == DT_Float) d.value = String(Float(d.value) % Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) _expr(Child(node, 1), type); // ??
      if (type == DT_String) _expr(Child(node, 1), type); //?
      return d;
    }
  }
  return _preop(node, type);
}

private function Scope.Declaration _preop(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __NOT)
    {
      d.type = DT_Bool;
      d.value = BoolToString(!Boolean(_expr(Child(node, 0), DT_Bool).value));
      return d;
    }
  }
  return _operand(node, type);
}

private function Scope.Declaration _operand(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  d.value = a.Tree[node].value;
  if (a.Tree[node].type == NT_Identifier)
  {
    d = s.getDeclaration(a.Tree[node].value);
  }
  else if (a.Tree[node].type == NT_String)
  {
    d.type = DT_String;
  }
  else if (a.Tree[node].type == NT_Boolean)
  {
    d.type = DT_Bool;
  }
  else if (a.Tree[node].type == NT_Integer)
  {
    d.type = DT_Int;
  }
  else if (a.Tree[node].type == NT_Float)
  {
    d.type = DT_Float;
  }
  else if (a.Tree[node].type == NT_Function)
  {
    d = _functioncall(node);
  }
  else {
    Warn(&quot;Unexpected node:&quot;@a.Tree[node].value);
    Assert(false);
  }
  if ((type != DT_None) &amp;&amp; (d.type != type)) d = typeCast(d, type); // from to
  return d;
}

private function Scope.Declaration _functioncall(int node)
{
  local Scope.Declaration d;
  if (a.Tree[node].value ~= &quot;print&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_String);
    log(d.value);
    return d;
  }
  if (a.Tree[node].value ~= &quot;argc&quot;)
  {
    d.type = DT_Int;
    d.value = String(input.length);
    return d;
  }
  if (a.Tree[node].value ~= &quot;argv&quot;)
  {
    d.type = DT_String;
    d.value = input[Int(_expr(Child(node, 0), DT_Int).value)];
    return d;
  }
  if (a.Tree[node].value ~= &quot;int&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_Int);
    return d;
  }
  if (a.Tree[node].value ~= &quot;float&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_Float);
    return d;
  }
  if (a.Tree[node].value ~= &quot;string&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_String);
    return d;
  }
  if (a.Tree[node].value ~= &quot;bool&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_Bool);
    return d;
  }
  else {
    d = s.getDeclaration(a.Tree[node].value, DT_Function);
    d = _execfunction(int(d.value), node);
    return d;
  }
  Warn(&quot;Undeclared function:&quot;@a.Tree[node].value);
  Assert(false);
}
&lt;/uscript&gt;

First check if the function call is a built-in function, otherwise look if there's a custom function defined. If so, execute that node.

&lt;uscript&gt;

private function _function(int node)
{
  //               function name        
  s.newDeclaration(ChildValue(node, 1), DT_Function, string(node));
}
&lt;/uscript&gt;

A function declaration, just take the first node and skip the rest. We only need to read the rest when the function is executed.

&lt;uscript&gt;

private function Scope.Declaration _execfunction(int func, int node)
{
  local Scope.Declaration d;
  local int i, j;
  s.openScope();                      
  s.newDeclaration(FUNCRESULT, s.stringToType(ChildValue(func, 0))); // return type
  j = Child(func, 1);
  for (i = 0; i &lt; a.tree[j].children.length; i++)
  {
    _var(Child(j, i), _expr(Child(node, i)).value);
  }
  for (i = 2; i &lt; a.tree[func].children.length; i++) // 0 = return type, 1 = function name
  {
    ExecuteRoot(a.Tree[func].children[i]);
  }
  d = s.getDeclaration(FUNCRESULT);
  s.closeScope();
  return d;
}
&lt;/uscript&gt;

Jump to the node where the function is declared. We need node of the function call because we need to input arguments. We only read the number of argument that are defined. So it's possible to enter more arguments in a function call than required, we just ignore them.

Each function argument is a local variable with an initial value, which would be the result of the expression passed to it.

When we enter the function we will first open a new scope level, this is to distinguish local and global variables. A local and global variable may have the same name, but the most local variable is just.</text>
    </revision>
    <revision>
      <id>1821</id>
      <timestamp>2003-04-22T21:28:52Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class Interpreter extends Object dependsOn(AST) dependsOn(Scope) dependsOn(Compiler);

var private AST a;
var private Scope s;
var private array&lt;string&gt; input;

// keywords
const __BEGIN                 = &quot;begin&quot;;
const __VAR                   = &quot;var&quot;;
const __INTEGER               = &quot;int&quot;;
const __STRING                = &quot;string&quot;;
const __FLOAT                 = &quot;float&quot;;
const __BOOLEAN               = &quot;bool&quot;;
const __FUNC                  = &quot;function&quot;;
const __BECOMES               = &quot;=&quot;;
const __WHILE                 = &quot;while&quot;;
const __IF                    = &quot;if&quot;;
const __LT                    = &quot;&lt;&quot;;
const __LE                    = &quot;&lt;=&quot;;
const __GT                    = &quot;&gt;&quot;;
const __GE                    = &quot;&gt;=&quot;;
const __EQ                    = &quot;==&quot;;
const __NE                    = &quot;!=&quot;;
const __AND                   = &quot;&amp;&amp;&quot;;
const __OR                    = &quot;||&quot;;
const __PLUS                  = &quot;+&quot;;
const __MINUS                 = &quot;-&quot;;
const __MULTIPLY              = &quot;*&quot;;
const __DIVIDE                = &quot;/&quot;;
const __MOD                   = &quot;%&quot;;
const __NOT                   = &quot;!&quot;;
const __TRUE                  = &quot;true&quot;;
const __FALSE                 = &quot;false&quot;;
// terminals -- end
const FUNCRESULT              = &quot;result&quot;;

function Create(AST inAst, Scope inScope, array&lt;string&gt; inInput)
{
  a = inAst;
  s = inScope;
  input = inInput;
}

function Execute()
{
  local int i;
  for (i = 0; i &lt; a.Tree.length; i++)
  {
    if (a.Tree[i].parent == -1) ExecuteRoot(i);
  }
}

private function ExecuteRoot(int node)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __VAR) _var(node);
    if (a.Tree[node].value == __BECOMES) _assignment(node);
    if (a.Tree[node].value == __IF) _ifthenelse(node);
    if (a.Tree[node].value == __WHILE) _whiledo(node);
    if (a.Tree[node].value == __FUNC) _function(node);
  }
  if (a.Tree[node].type == NT_Function)
  {
    d = _functioncall(node);
  }
}

/**
  returns the value of the nth child
*/
private function string ChildValue(int node, optional int n)
{
  return a.Tree[a.Tree[node].children[n]].value;
}

/**
  returns the id of the nth child
*/
private function int Child(int node, optional int n)
{
  return a.Tree[node].children[n];
}

/**
  converts BruteForce bool to UScript bool
*/
private function bool boolean(string in)
{
  return !(in ~= __FALSE);
}

/**
  uscript bool to BruteForce bool
*/
private function string boolToString(bool in)
{
  if (in) return __TRUE;
  else return __FALSE;
}

/**
  Convert from one type to the other
*/
private function Scope.Declaration typeCast(Scope.Declaration d, Scope.DeclarationType type)
{
  if (d.type == type) return d;
  if (type == DT_Int)
  {
    if (d.type == DT_Bool) d.value = String(Int(boolean(d.value)));
    else d.value = String(Int(d.value));
    d.type = DT_Int;
  }
  else if (type == DT_Int)
  {
    if (d.type == DT_Bool) d.value = String(Float(boolean(d.value)));
    else d.value = String(Float(d.value));
    d.type = DT_Float;
  }
  else if (type == DT_Bool)
  {
    if (d.type == DT_String) d.value = boolToString(d.value != &quot;&quot;);
    else if (d.type == DT_Int) d.value = boolToString(Int(d.value) != 0);
    else if (d.type == DT_Float) d.value = boolToString(Float(d.value) != 0.0);
    else d.value = boolToString(Boolean(d.value));
    d.type = DT_Bool;
  }
  else if (type == DT_String)
  {
    d.type = DT_String;
  }
  return d;
}

private function _var(int node, optional string initval)
{
                   // name                                 value
  s.newDeclaration(ChildValue(node, 1), s.stringToType(ChildValue(node, 0)), initval);
}

private function _assignment(int node)
{                  // name              expression            left hand type
  s.setDeclaration(ChildValue(node, 0), typeCast(_expr(Child(node, 1)), s.getType(ChildValue(node, 0))).value );
}

private function _ifthenelse(int node)
{
  if (boolean(typeCast(_expr(Child(node, 0)), DT_Bool).value)) //if true
  {
    _codeblock(Child(node, 1)); // then
  }
  else if (a.Tree[node].children.length &gt;= 3) // else
  {
    _codeblock(Child(node, 2));
  }
}

private function _whiledo(int node)
{
  while (boolean(typeCast(_expr(Child(node, 0)), DT_Bool).value)) //while true
  {
    _codeblock(Child(node, 1)); // do
  }  
}

private function _codeblock(int node)
{
  local int i;
  if ((a.Tree[node].type == NT_Keyword) &amp;&amp; (a.Tree[node].value == __BEGIN))
  {
    for (i = 0; i &lt; a.Tree[node].children.length; i++)
    {
      ExecuteRoot(a.Tree[node].children[i]);
    }
  }
  else {
    ExecuteRoot(node);
  }
}

private function Scope.Declaration _expr(int node, optional Scope.DeclarationType type)
{
  return _boolex(node, type);
}

private function Scope.Declaration _boolex(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __LT)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &lt; Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &lt; Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &lt; Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &lt; _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __LE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &lt;= Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &lt;= Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &lt;= Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &lt;= _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __GT)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &gt; Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &gt; Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &gt; Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &gt; _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __GE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) &gt;= Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) &gt;= Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Int(Boolean(d.value)) &gt;= Int(Boolean(_expr(Child(node, 1), type).value)));
      if (type == DT_String) d.value = boolToString(d.value &gt;= _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __EQ)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) == Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) == Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Boolean(d.value) == Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) d.value = boolToString(d.value == _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __NE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = boolToString(Int(d.value) != Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = boolToString(Float(d.value) != Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = boolToString(Boolean(d.value) != Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) d.value = boolToString(d.value != _expr(Child(node, 1), type).value);
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __AND)
    {
      d = _expr(Child(node, 0));
      d.value = boolToString( Boolean(d.value) &amp;&amp; Boolean(_expr(Child(node, 1)).value) );
      d.type = DT_Bool;
      return d;
    }
    else if (a.Tree[node].value == __OR)
    {
      d = _expr(Child(node, 0));
      d.value = boolToString(Boolean(d.value) || Boolean(_expr(Child(node, 1)).value));
      d.type = DT_Bool;
      return d;
    }
  }
  return _accum(node, type);
}

private function Scope.Declaration _accum(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __PLUS)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = String(Int(d.value) + Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) + Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) &amp;&amp; !Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) d.value = d.value $ _expr(Child(node, 1), type).value;
      return d;
    }
    else if (a.Tree[node].value == __MINUS)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = String(Int(d.value) - Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) - Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) &amp;&amp; !Boolean(_expr(Child(node, 1), type).value));
      if (type == DT_String) _expr(Child(node, 1), type).value;
      return d;
    }
  }
  return _mult(node, type);
}

private function Scope.Declaration _mult(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __MULTIPLY)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value = String(Int(d.value) * Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) * Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) || Boolean(_expr(Child(node, 1), type).value)); 
      if (type == DT_String) _expr(Child(node, 1), type); // ??
      return d;
    }
    else if (a.Tree[node].value == __DIVIDE)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value =  String(Int(d.value) / Int(_expr(Child(node, 1), type).value));
      if (type == DT_Float) d.value = String(Float(d.value) / Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) d.value = String(Boolean(d.value) || !Boolean(_expr(Child(node, 1), type).value)); 
      if (type == DT_String) _expr(Child(node, 1), type); //?
      return d;
    }
    else if (a.Tree[node].value == __MOD)
    {
      d = _expr(Child(node, 0), type);
      type = d.type;
      if (type == DT_Int) d.value =  String(Int(Int(d.value) % Int(_expr(Child(node, 1), type).value)));
      if (type == DT_Float) d.value = String(Float(d.value) % Float(_expr(Child(node, 1), type).value));
      if (type == DT_Bool) _expr(Child(node, 1), type); // ??
      if (type == DT_String) _expr(Child(node, 1), type); //?
      return d;
    }
  }
  return _preop(node, type);
}

private function Scope.Declaration _preop(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  if (a.Tree[node].type == NT_Keyword)
  {
    if (a.Tree[node].value == __NOT)
    {
      d.type = DT_Bool;
      d.value = BoolToString(!Boolean(_expr(Child(node, 0), DT_Bool).value));
      return d;
    }
  }
  return _operand(node, type);
}

private function Scope.Declaration _operand(int node, optional Scope.DeclarationType type)
{
  local Scope.Declaration d;
  d.value = a.Tree[node].value;
  if (a.Tree[node].type == NT_Identifier)
  {
    d = s.getDeclaration(a.Tree[node].value);
  }
  else if (a.Tree[node].type == NT_String)
  {
    d.type = DT_String;
  }
  else if (a.Tree[node].type == NT_Boolean)
  {
    d.type = DT_Bool;
  }
  else if (a.Tree[node].type == NT_Integer)
  {
    d.type = DT_Int;
  }
  else if (a.Tree[node].type == NT_Float)
  {
    d.type = DT_Float;
  }
  else if (a.Tree[node].type == NT_Function)
  {
    d = _functioncall(node);
  }
  else {
    Warn(&quot;Unexpected node:&quot;@a.Tree[node].value);
    Assert(false);
  }
  if ((type != DT_None) &amp;&amp; (d.type != type)) d = typeCast(d, type); // from to
  return d;
}

private function Scope.Declaration _functioncall(int node)
{
  local Scope.Declaration d;
  if (a.Tree[node].value ~= &quot;print&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_String);
    log(d.value);
    return d;
  }
  if (a.Tree[node].value ~= &quot;argc&quot;)
  {
    d.type = DT_Int;
    d.value = String(input.length);
    return d;
  }
  if (a.Tree[node].value ~= &quot;argv&quot;)
  {
    d.type = DT_String;
    d.value = input[Int(_expr(Child(node, 0), DT_Int).value)];
    return d;
  }
  if (a.Tree[node].value ~= &quot;int&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_Int);
    return d;
  }
  if (a.Tree[node].value ~= &quot;float&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_Float);
    return d;
  }
  if (a.Tree[node].value ~= &quot;string&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_String);
    return d;
  }
  if (a.Tree[node].value ~= &quot;bool&quot;)
  {
    d = typeCast(_expr(Child(node, 0)), DT_Bool);
    return d;
  }
  else {
    d = s.getDeclaration(a.Tree[node].value, DT_Function);
    d = _execfunction(int(d.value), node);
    return d;
  }
  Warn(&quot;Undeclared function:&quot;@a.Tree[node].value);
  Assert(false);
}

private function _function(int node)
{
  //               function name        
  s.newDeclaration(ChildValue(node, 1), DT_Function, string(node));
}

private function Scope.Declaration _execfunction(int func, int node)
{
  local Scope.Declaration d;
  local int i, j;
  s.openScope();                      
  s.newDeclaration(FUNCRESULT, s.stringToType(ChildValue(func, 0))); // return type
  j = Child(func, 1);
  for (i = 0; i &lt; a.tree[j].children.length; i++)
  {
    _var(Child(j, i), _expr(Child(node, i)).value);
  }
  for (i = 2; i &lt; a.tree[func].children.length; i++) // 0 = return type, 1 = function name
  {
    ExecuteRoot(a.Tree[func].children[i]);
  }
  d = s.getDeclaration(FUNCRESULT);
  s.closeScope();
  return d;
}
&lt;/uscript&gt;

'''El Muerte TDS:''' need to describe this</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce/Main</title>
    <id>607</id>
    <revision>
      <id>1824</id>
      <timestamp>2003-04-27T09:08:05Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class BruteForce extends Commandlet config(BruteForce);

var private Tokenizer t;
var private Scope s;
var private Compiler c;
var private AST a;
var private Interpreter i;

var config array&lt;string&gt; Code;
&lt;/uscript&gt;

Just edit the BruteForce.ini file to change the code.

&lt;uscript&gt;
var array&lt;string&gt; Input;
&lt;/uscript&gt;

The input, with argc() and argv() function you can get this info from within BruteForce

&lt;uscript&gt;

/* Main */

event int Main( string Parms )
{
  local int n;
  local bool showTree, saveTree, noCompile;
  showTree = false;
  saveTree = false;
  noCompile = false;
  class'wString'.static.split2(Parms, &quot; &quot;, Input, true, &quot;\&quot;&quot;);
  for (n = input.length-1; n &gt;= 0; n--)
  {
    if (input[n] ~= &quot;-showtree&quot;)
    {
      input.remove(n, 1);
      showTree = true;
    }
    else if (input[n] ~= &quot;-savetree&quot;)
    {
      input.remove(n, 1);
      saveTree = true;
    }
    else if (input[n] ~= &quot;-nocompile&quot;)
    {
      input.remove(n, 1);
      noCompile = true;
    }
  }
&lt;/uscript&gt;

Process the commandline arguments, we have three special case parameters that we use for certain parts: 

-showtree will display the AST-

-savetree will save the tree to the config file, if the tree is saved you no longer need to compile the code-

-nocompile don't compile the code, just execute the AST-

&lt;uscript&gt;
    
  s = new class'Scope';  
  a = new class'AST';
  i = new class'Interpreter';
   
  if (!noCompile)
  {
    t = new class'Tokenizer';
    c = new class'Compiler';
    t.Create(Code);
    a.Create();
    StopWatch(false);
    t.nextToken();
    c.Compile(t, a);
    Log(&quot;Compile time: &quot;);
    StopWatch(true);
  }

  if (showTree) a.printTree();

  StopWatch(false);
  i.Create(a, s, input);
  i.Execute();
  Log(&quot;Execution time: &quot;);
  StopWatch(true);

  if (saveTree) a.SaveConfig();

  return 0;
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1825</id>
      <timestamp>2003-04-22T21:29:59Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class BruteForce extends Commandlet config(BruteForce);

var private Tokenizer t;
var private Scope s;
var private Compiler c;
var private AST a;
var private Interpreter i;
var config array&lt;string&gt; Code;
var array&lt;string&gt; Input;

/* Main */

event int Main( string Parms )
{
  local int n;
  local bool showTree, saveTree, noCompile;
  showTree = false;
  saveTree = false;
  noCompile = false;
  class'wString'.static.split2(Parms, &quot; &quot;, Input, true, &quot;\&quot;&quot;);
  for (n = input.length-1; n &gt;= 0; n--)
  {
    if (input[n] ~= &quot;-showtree&quot;)
    {
      input.remove(n, 1);
      showTree = true;
    }
    else if (input[n] ~= &quot;-savetree&quot;)
    {
      input.remove(n, 1);
      saveTree = true;
    }
    else if (input[n] ~= &quot;-nocompile&quot;)
    {
      input.remove(n, 1);
      noCompile = true;
    }
  }
    
  s = new class'Scope';  
  a = new class'AST';
  i = new class'Interpreter';
   
  if (!noCompile)
  {
    t = new class'Tokenizer';
    c = new class'Compiler';
    t.Create(Code);
    a.Create();
    StopWatch(false);
    t.nextToken();
    c.Compile(t, a);
    Log(&quot;Compile time: &quot;);
    StopWatch(true);
  }

  if (showTree) a.printTree();

  StopWatch(false);
  i.Create(a, s, input);
  i.Execute();
  Log(&quot;Execution time: &quot;);
  StopWatch(true);

  if (saveTree) a.SaveConfig();

  return 0;
}
&lt;/uscript&gt;

'''El Muerte TDS:''' need to describe this</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BruteForce/Scope</title>
    <id>606</id>
    <revision>
      <id>1822</id>
      <timestamp>2003-04-27T09:03:16Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
/**
  Keep track of declarations in diffirent scopes
*/
class Scope extends Object exportstructs;

var private int ScopeLevel;
var int verbose;

enum DeclarationType
{
  DT_None,
  DT_String,
  DT_Int,
  DT_Float,
  DT_Bool,
  DT_Function,
};
&lt;/uscript&gt;

The diffirent types of declarations we have. The DT_None is a safe guard to be used for optional function arguments and should not be used for actualy declarations.

&lt;uscript&gt;

struct Declaration
{
  var string name;
  var string value;
  var int scopelevel;
  var DeclarationType type;
};
var array&lt;Declaration&gt; declarations;
&lt;/uscript&gt;

The value can be anything: a string, an int or even a tree node. 

&lt;uscript&gt;

function Declaration getDeclaration(string name, optional DeclarationType type)
{
  local int i;
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel &lt;= ScopeLevel))
    {
      if (verbose&gt; 0 ) log(ScopeLevel$&quot;] getDeclaration(&quot;$name$&quot;, &quot;$type$&quot;)&quot;, 'Scope');
      if ((type != DT_None) &amp;&amp; (declarations[i].type != type))
      {
        Warn(&quot;Declaration type doesn't match:&quot;@name@&quot;has&quot;@declarations[i].type@&quot;requested&quot;@type);
        Assert(false);
      }
      return declarations[i];
    }
  }
  Warn(&quot;Undeclared identifier:&quot;@name);
  Assert(false);
}
&lt;/uscript&gt;

Look up a declaration in the declaration table. We start from the bottom because the the variables with the highest scope level are at the bottom and mostlikely they are used more that the low level scope declarations.

We also check the declaration type to match the requested type. This is only used to divide functions and normal variables at the moment.

&lt;uscript&gt;

function DeclarationType getType(string name)
{
  local int i;
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel &lt;= ScopeLevel))
    {
      if (verbose&gt; 0 ) log(ScopeLevel$&quot;] getType(&quot;$name$&quot;) =&quot;@declarations[i].type, 'Scope');
      return declarations[i].type;
    }
  }
  Warn(&quot;Undeclared identifier:&quot;@name);
  Assert(false);
}

function string setDeclaration(string name, string value, optional DeclarationType type)
{
  local int i;
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel &lt;= ScopeLevel))
    {
      if (verbose&gt; 0 ) log(ScopeLevel$&quot;] setDeclaration(&quot;$name$&quot;, &quot;$value$&quot;, &quot;$type$&quot;)&quot;, 'Scope');
      declarations[i].value = value;
      return declarations[i].value;
    }
  }
  Warn(&quot;Undeclared identifier:&quot;@name);
  Assert(false);
}

function newDeclaration(string name, optional DeclarationType type, optional string value)
{
  local int i;
  for (i = 0; i &lt; declarations.length; i++)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel == ScopeLevel))
    {
      Warn(&quot;Identifier redeclared:&quot;@name);
      Assert(false);
    }
  }
  if (verbose&gt; 0 ) log(ScopeLevel$&quot;] newDeclaration(&quot;$name$&quot;, &quot;$type$&quot;)&quot;, 'Scope');
  declarations.length = i+1;
  declarations[i].name = name;
  declarations[i].scopelevel = ScopeLevel;
  declarations[i].value = value;
  declarations[i].type = type;
}

function openScope()
{
  if (verbose&gt; 0 ) log(ScopeLevel$&quot;] openScope()&quot;, 'Scope');
  ScopeLevel++;
}
&lt;/uscript&gt;

openScope is easy, it just increases the current scope level, new declarations will automatically be put in this scope level.

&lt;uscript&gt;

function closeScope()
{
  local int i;
  if (verbose&gt; 0 ) log(ScopeLevel$&quot;] closeScope()&quot;, 'Scope');
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if (declarations[i].scopelevel &gt;= ScopeLevel)
    {
      declarations.remove(i, 1);
    }
  }
  ScopeLevel--;
}
&lt;/uscript&gt;

On closeScope we need to remove all previously declared variables in this, or higher, scope. After that we decrease the scope level.

&lt;uscript&gt;

static function DeclarationType stringToType(string type)
{
  if (type ~= &quot;string&quot;) return DT_String;
  else if (type ~= &quot;int&quot;) return DT_Int;
  else if (type ~= &quot;float&quot;) return DT_Float;
  else if (type ~= &quot;bool&quot;) return DT_Bool;
  Warn(&quot;Unknown type&quot;@type);
  assert(false);
}
&lt;/uscript&gt;

Convert a string to a declaration type.

&lt;uscript&gt;

defaultproperties
{
  ScopeLevel=0
  verbose=0
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>1823</id>
      <timestamp>2003-04-22T21:29:16Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
/**
  Keep track of declarations in diffirent scopes
*/
class Scope extends Object exportstructs;

var private int ScopeLevel;
var int verbose;

enum DeclarationType
{
  DT_None,
  DT_String,
  DT_Int,
  DT_Float,
  DT_Bool,
  DT_Function,
};

struct Declaration
{
  var string name;
  var string value;
  var int scopelevel;
  var DeclarationType type;
};
var array&lt;Declaration&gt; declarations;

function Declaration getDeclaration(string name, optional DeclarationType type)
{
  local int i;
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel &lt;= ScopeLevel))
    {
      if (verbose&gt; 0 ) log(ScopeLevel$&quot;] getDeclaration(&quot;$name$&quot;, &quot;$type$&quot;)&quot;, 'Scope');
      if ((type != DT_None) &amp;&amp; (declarations[i].type != type))
      {
        Warn(&quot;Declaration type doesn't match:&quot;@name@&quot;has&quot;@declarations[i].type@&quot;requested&quot;@type);
        Assert(false);
      }
      return declarations[i];
    }
  }
  Warn(&quot;Undeclared identifier:&quot;@name);
  Assert(false);
}

function DeclarationType getType(string name)
{
  local int i;
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel &lt;= ScopeLevel))
    {
      if (verbose&gt; 0 ) log(ScopeLevel$&quot;] getType(&quot;$name$&quot;) =&quot;@declarations[i].type, 'Scope');
      return declarations[i].type;
    }
  }
  Warn(&quot;Undeclared identifier:&quot;@name);
  Assert(false);
}

function string setDeclaration(string name, string value, optional DeclarationType type)
{
  local int i;
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel &lt;= ScopeLevel))
    {
      if (verbose&gt; 0 ) log(ScopeLevel$&quot;] setDeclaration(&quot;$name$&quot;, &quot;$value$&quot;, &quot;$type$&quot;)&quot;, 'Scope');
      declarations[i].value = value;
      return declarations[i].value;
    }
  }
  Warn(&quot;Undeclared identifier:&quot;@name);
  Assert(false);
}

function newDeclaration(string name, optional DeclarationType type, optional string value)
{
  local int i;
  for (i = 0; i &lt; declarations.length; i++)
  {
    if ((declarations[i].name ~= name) &amp;&amp; (declarations[i].scopelevel == ScopeLevel))
    {
      Warn(&quot;Identifier redeclared:&quot;@name);
      Assert(false);
    }
  }
  if (verbose&gt; 0 ) log(ScopeLevel$&quot;] newDeclaration(&quot;$name$&quot;, &quot;$type$&quot;)&quot;, 'Scope');
  declarations.length = i+1;
  declarations[i].name = name;
  declarations[i].scopelevel = ScopeLevel;
  declarations[i].value = value;
  declarations[i].type = type;
}

function openScope()
{
  if (verbose&gt; 0 ) log(ScopeLevel$&quot;] openScope()&quot;, 'Scope');
  ScopeLevel++;
}

function closeScope()
{
  local int i;
  if (verbose&gt; 0 ) log(ScopeLevel$&quot;] closeScope()&quot;, 'Scope');
  for (i = declarations.length-1; i &gt;= 0; i--)
  {
    if (declarations[i].scopelevel &gt;= ScopeLevel)
    {
      declarations.remove(i, 1);
    }
  }
  ScopeLevel--;
}

static function DeclarationType stringToType(string type)
{
  if (type ~= &quot;string&quot;) return DT_String;
  else if (type ~= &quot;int&quot;) return DT_Int;
  else if (type ~= &quot;float&quot;) return DT_Float;
  else if (type ~= &quot;bool&quot;) return DT_Bool;
  Warn(&quot;Unknown type&quot;@type);
  assert(false);
}

defaultproperties
{
  ScopeLevel=0
  verbose=0
}
&lt;/uscript&gt;

'''El Muerte TDS:''' need to describe this</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bslayerw</title>
    <id>627</id>
    <revision>
      <id>1872</id>
      <timestamp>2003-10-05T01:38:41Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Welcome !</comment>
      <text xml:space="preserve">==Discussion==

'''GRAF1K:''' Welcome to the Unreal Wiki, Bslayerw. :-) :tup:

'''MythOpus:''' Hey Bslayerw, welcloem to the wiki :D  You've been around here before no?</text>
    </revision>
    <revision>
      <id>1873</id>
      <timestamp>2003-10-04T22:58:53Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>Welcome</comment>
      <text xml:space="preserve">==Discussion==

'''GRAF1K:''' Welcome to the Unreal Wiki, Bslayerw. :-) :tup:</text>
    </revision>
    <revision>
      <id>35407</id>
      <timestamp>2009-09-10T08:11:46Z</timestamp>
      <contributor>
        <ip>222.255.21.180</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">7GuBJm  &lt;a href=&quot;http://lsvhiuoiozcu.com/&quot;&gt;lsvhiuoiozcu&lt;/a&gt;, [url=http://ljtpivamqohy.com/]ljtpivamqohy[/url], [link=http://gfwbqlxtxeym.com/]gfwbqlxtxeym[/link], http://apzkhljytcaz.com/</text>
    </revision>
    <revision>
      <id>35408</id>
      <timestamp>2009-09-10T11:09:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/222.255.21.180|222.255.21.180]] ([[User talk:222.255.21.180|Talk]]) to last revision by [[User:MythOpus|MythOpus]]</comment>
      <text xml:space="preserve">==Discussion==

'''GRAF1K:''' Welcome to the Unreal Wiki, Bslayerw. :-) :tup:

'''MythOpus:''' Hey Bslayerw, welcloem to the wiki :D  You've been around here before no?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bubble</title>
    <id>28501</id>
    <revision>
      <id>40202</id>
      <timestamp>2009-11-17T10:58:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Build</title>
    <id>544</id>
    <revision>
      <id>1683</id>
      <timestamp>2007-01-18T21:11:40Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <minor/>
      <comment>Fixed/changed link to Map Build Errors page</comment>
      <text xml:space="preserve">==The Build Process==

In the unreal engine, as in most 3d game engines, you can't play the game straight after adding the last piece of architecture and a player start. You need to build it, also known as compiling it.  This process can take anywhere from a few seconds to an hour (based on year 2002 PC performance).

This automatic process consists of several stages:

# [[Legacy:Applying Structural Brushes|Applying structural brushes]]
# [[Legacy:Zoning|Zoning]]
# [[Legacy:Illumination Occluding|Illumination occluding]]
# [[Legacy:Adding Detail Brushes|adding detail brushes]]
# [[Legacy:Building Polygons|Building polygons]]
# [[Legacy:Merging Planars|Merging planars]]
# [[Legacy:Partitioning|Partitioning]]
# [[Legacy:Zoning|Zoning]]
# [[Legacy:Illumination Occluding|Illumination occluding]]
# [[Legacy:Optimizing Geometry|Optimizing Geometry]]
# [[Legacy:Allocating Meshes|Allocating Meshes]]
# [[Legacy:Computing Visibility|Computing Visibility]]
# [[Legacy:Raytracing|Raytracing]]
# [[Legacy:Adding ReachSpecs|Adding reachSpecs]]

===Start the Rebuild===

To launch the process you have a row of dedicated icons in the [[Legacy:Toolbar|Toolbar]].

[[Image:Legacy_interface.toolbar.png|center|]]

* ''14'' The cube only rebuilds the geometry. No lights are computed and any existing lighting is removed (steps 1 - 7). 
* ''15'' The light bulb icon only calculates the texture illumination (when applying new brushes or rescaling textures on brushes) (steps 12-13).
* ''16'' Launches the navigation Array rebuild (steps 14 -15).
* ''17'' The icon with a cube and a light bulb builds according to the options held in the [[Legacy:Build Window|Build Window]].
* ''18'' The last icon, horizontal sliders, opens the [[Legacy:Build Window|Build Window]] itself.

==Build options==

===Quality===

{|

|-
|Setting
|Advantage
|Disadvantage 
|-
|Lame
|quick build times
|can create unnecessary polys 
|-
|Good
|decent build times, pretty accurate
|not accurate enough for final build
|-
|Optimal
|automatically merges polys
|longest build time
|
|}

===Understanding the Slider===

The slider bar allows the map builder to optimize the map for speed.  It makes adjustments to the number of BSP cuts which affects performance and frame.   Few maps are perfectly open or highly occluding, so the number of cuts must be determined per map.  

====Lower ====
* creates a sparse BSP tree
* quick to lookup the BSP tree which renders the scene 
* best on open areas where little occlusion occurs 
* disadvntage: may need to lookup more in the BSP tree when occluding areas are encountered 

====Higher ====
* dense BSP tree
* the BSP tree knows which items are drawn in front of the other ahead of time
* Best used when many occluding surfaces
* disadvantage: can overdraw areas when in non-occluding or open areas

The default of 15 cuts has been found best for most maps.

==Other stuff ==
* Rebuild on visible actors option is extremely useful.  Needs a mention here &amp; link to [[Legacy:Hiding Actors|Hiding Actors]]
* Talk about errors and solutions when reviewing the logfile on a build

==Technical stuff ==

&quot;adding detail brush&quot; refers to the semisolid brushes. Evidence for this: the number of detail brushes is equal to the number of semisolids. 

Eg: 
* The structural brushes count goes up to 359 / 512. 
* Number of semisolids in the map (use MAP SELECT SEMISOLIDS) = 153

==Related Topics ==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:BSP|BSP]]
* [[Legacy:Map Build Errors|Map Build Errors]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1684</id>
      <timestamp>2006-04-07T01:11:02Z</timestamp>
      <contributor>
        <ip>210.3.43.5</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==The Build Process==

In the unreal engine, as in most 3d game engines, you can't play the game straight after adding the last piece of architecture and a player start. You need to build it, also known as compiling it.  This process can take anywhere from a few seconds to an hour (based on year 2002 PC performance).

This automatic process consists of several stages:

# [[Legacy:Applying Structural Brushes|Applying structural brushes]]
# [[Legacy:Zoning|Zoning]]
# [[Legacy:Illumination Occluding|Illumination occluding]]
# [[Legacy:Adding Detail Brushes|adding detail brushes]]
# [[Legacy:Building Polygons|Building polygons]]
# [[Legacy:Merging Planars|Merging planars]]
# [[Legacy:Partitioning|Partitioning]]
# [[Legacy:Zoning|Zoning]]
# [[Legacy:Illumination Occluding|Illumination occluding]]
# [[Legacy:Optimizing Geometry|Optimizing Geometry]]
# [[Legacy:Allocating Meshes|Allocating Meshes]]
# [[Legacy:Computing Visibility|Computing Visibility]]
# [[Legacy:Raytracing|Raytracing]]
# [[Legacy:Adding ReachSpecs|Adding reachSpecs]]

===Start the Rebuild===

To launch the process you have a row of dedicated icons in the [[Legacy:Toolbar|Toolbar]].

[[Image:Legacy_interface.toolbar.png|center|]]

* ''14'' The cube only rebuilds the geometry. No lights are computed and any existing lighting is removed (steps 1 - 7). 
* ''15'' The light bulb icon only calculates the texture illumination (when applying new brushes or rescaling textures on brushes) (steps 12-13).
* ''16'' Launches the navigation Array rebuild (steps 14 -15).
* ''17'' The icon with a cube and a light bulb builds according to the options held in the [[Legacy:Build Window|Build Window]].
* ''18'' The last icon, horizontal sliders, opens the [[Legacy:Build Window|Build Window]] itself.

==Build options==

===Quality===

{|

|-
|Setting
|Advantage
|Disadvantage 
|-
|Lame
|quick build times
|can create unnecessary polys 
|-
|Good
|decent build times, pretty accurate
|not accurate enough for final build
|-
|Optimal
|automatically merges polys
|longest build time
|
|}

===Understanding the Slider===

The slider bar allows the map builder to optimize the map for speed.  It makes adjustments to the number of BSP cuts which affects performance and frame.   Few maps are perfectly open or highly occluding, so the number of cuts must be determined per map.  

====Lower ====
* creates a sparse BSP tree
* quick to lookup the BSP tree which renders the scene 
* best on open areas where little occlusion occurs 
* disadvntage: may need to lookup more in the BSP tree when occluding areas are encountered 

====Higher ====
* dense BSP tree
* the BSP tree knows which items are drawn in front of the other ahead of time
* Best used when many occluding surfaces
* disadvantage: can overdraw areas when in non-occluding or open areas

The default of 15 cuts has been found best for most maps.

==Other stuff ==
* Rebuild on visible actors option is extremely useful.  Needs a mention here &amp; link to [[Legacy:Hiding Actors|Hiding Actors]]
* Talk about errors and solutions when reviewing the logfile on a build

==Technical stuff ==

&quot;adding detail brush&quot; refers to the semisolid brushes. Evidence for this: the number of detail brushes is equal to the number of semisolids. 

Eg: 
* The structural brushes count goes up to 359 / 512. 
* Number of semisolids in the map (use MAP SELECT SEMISOLIDS) = 153

==Related Topics ==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:BSP|BSP]]
* [[Legacy:Map Check Errors|Map Check Errors]]

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1685</id>
      <timestamp>2006-04-07T07:31:03Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==The Build Process==

In the unreal engine, as in most 3d game engines, you can't play the game straight after adding the last piece of architecture and a player start. You need to build it, also known as compiling it.  This process can take anywhere from a few seconds to an hour (based on year 2002 PC performance).

This automatic process consists of several stages:

# [[Legacy:Applying Structural Brushes|Applying structural brushes]]
# [[Legacy:Zoning|Zoning]]
# [[Legacy:Illumination Occluding|Illumination occluding]]
# [[Legacy:Adding Detail Brushes|adding detail brushes]]
# [[Legacy:Building Polygons|Building polygons]]
# [[Legacy:Merging Planars|Merging planars]]
# [[Legacy:Partitioning|Partitioning]]
# [[Legacy:Zoning|Zoning]]
# [[Legacy:Illumination Occluding|Illumination occluding]]
# [[Legacy:Optimizing Geometry|Optimizing Geometry]]
# [[Legacy:Allocating Meshes|Allocating Meshes]]
# [[Legacy:Computing Visibility|Computing Visibility]]
# [[Legacy:Raytracing|Raytracing]]
# [[Legacy:Adding ReachSpecs|Adding reachSpecs]]

===Start the Rebuild===

To launch the process you have a row of dedicated icons in the [[Legacy:Toolbar|Toolbar]].

[[Image:Legacy_interface.toolbar.png|center|]]

* ''14'' The cube only rebuilds the geometry. No lights are computed and any existing lighting is removed (steps 1 - 7). 
* ''15'' The light bulb icon only calculates the texture illumination (when applying new brushes or rescaling textures on brushes) (steps 12-13).
* ''16'' Launches the navigation Array rebuild (steps 14 -15).
* ''17'' The icon with a cube and a light bulb builds according to the options held in the [[Legacy:Build Window|Build Window]].
* ''18'' The last icon, horizontal sliders, opens the [[Legacy:Build Window|Build Window]] itself.

==Build options==

===Quality===

{|

|-
|Setting
|Advantage
|Disadvantage 
|-
|Lame
|quick build times
|can create unnecessary polys 
|-
|Good
|decent build times, pretty accurate
|not accurate enough for final build
|-
|Optimal
|automatically merges polys
|longest build time
|
|}

===Understanding the Slider===

The slider bar allows the map builder to optimize the map for speed.  It makes adjustments to the number of BSP cuts which affects performance and frame.   Few maps are perfectly open or highly occluding, so the number of cuts must be determined per map.  

====Lower ====
* creates a sparse BSP tree
* quick to lookup the BSP tree which renders the scene 
* best on open areas where little occlusion occurs 
* disadvntage: may need to lookup more in the BSP tree when occluding areas are encountered 

====Higher ====
* dense BSP tree
* the BSP tree knows which items are drawn in front of the other ahead of time
* Best used when many occluding surfaces
* disadvantage: can overdraw areas when in non-occluding or open areas

The default of 15 cuts has been found best for most maps.

==Other stuff ==
* Rebuild on visible actors option is extremely useful.  Needs a mention here &amp; link to [[Legacy:Hiding Actors|Hiding Actors]]
* Talk about errors and solutions when reviewing the logfile on a build

==Technical stuff ==

&quot;adding detail brush&quot; refers to the semisolid brushes. Evidence for this: the number of detail brushes is equal to the number of semisolids. 

Eg: 
* The structural brushes count goes up to 359 / 512. 
* Number of semisolids in the map (use MAP SELECT SEMISOLIDS) = 153

==Related Topics ==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* [[Legacy:BSP|BSP]]
* [[Legacy:Map Check Errors|Map Check Errors]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Build Window</title>
    <id>547</id>
    <revision>
      <id>1691</id>
      <timestamp>2003-05-25T09:19:54Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">This window holds the options for rebuilding a map

The process itself is described in [[Legacy:Build|Build]]

==The Stats Tab ==

This shows:

====Geometry ====
* Total [[Legacy:Brush|brush]]es in the map
* Total [[Legacy:Zone|zone]]s in the map

====BSP ====
* Total [[Legacy:Polycount|polycount]]
* Total [[Legacy:Node Count|node count]]
* The ratio of the above two numbers

Max Depth, Avg depth: no idea

A map made ofa single cube gives these two as 5 and 6. How the Average can be higher than the maximum of somewhat baffling.

====Lighting ====

Again, the single cube map gives: 6(0). Adding a light makes this 7(1). Adding a ton of cubes seems to make no difference. Weird.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1692</id>
      <timestamp>2002-04-30T11:09:47Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This window holds the options for rebuilding a map

The process itself is described in [[Legacy:Build|Build]]</text>
    </revision>
    <revision>
      <id>1693</id>
      <timestamp>2002-05-13T11:10:16Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This window holds the options for rebuilding a map

The process itself is described in [[Legacy:Build|Build]]

==The Stats Tab ==

This shows:

====Geometry ====
* Total [[Legacy:Brush|brush]]es in the map
* Total [[Legacy:Zone|zone]]s in the map

====BSP ====
* Total [[Legacy:Polycount|polycount]]
* Total [[Legacy:Node Count|node count]]
* The ratio of the above two numbers

Max Depth, Avg depth: no idea

A map made ofa single cube gives these two as 5 and 6. How the Average can be higher than the maximum of somewhat baffling.

====Lighting ====

Again, the single cube map gives: 6(0). Adding a light makes this 7(1). Adding a ton of cubes seems to make no difference. Weird.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Building A SkyBox</title>
    <id>542</id>
    <revision>
      <id>1678</id>
      <timestamp>2008-02-28T09:53:23Z</timestamp>
      <contributor>
        <ip>Poa78-1-87-88-58-237.dsl.club-internet.fr</ip>
      </contributor>
      <comment>Just a tweak about sunlights</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

[[Legacy:Sunlight|Sunlight]]s are a special kind of light, casting parrallel shadows. They had to be placed in a skybox and pointed at the SkyZoneInfo actor to be effective.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[Legacy:SceneCaptureCubeMapActor|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[Legacy:SceneCaptureCubeMapComponent|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[Legacy:SceneCapture2DActor|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1679</id>
      <timestamp>2008-02-22T01:46:11Z</timestamp>
      <contributor>
        <ip>WesBelden</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

In UT2003, you must have a skybox for using the [[Legacy:Sunlight|Sunlight]] Actor.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[Legacy:SceneCaptureCubeMapActor|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[Legacy:SceneCaptureCubeMapComponent|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[Legacy:SceneCapture2DActor|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Camera Vector and connect its output to the Texture Sample's UVs input.

Once you're done, your material setup should be similar to the one shown below.

@block@SkyWindowMat Material setup for the sky box cube map

The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

'''Wormbo:''' I've added this from memory. Someone please verify these steps and then remove this comment.

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; UT3 fake sky box needs verification
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1680</id>
      <timestamp>2008-02-27T22:43:07Z</timestamp>
      <contributor>
        <ip>WesBelden</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

In UT2003, you must have a skybox for using the [[Legacy:Sunlight|Sunlight]] Actor.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[Legacy:SceneCaptureCubeMapActor|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[Legacy:SceneCaptureCubeMapComponent|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[Legacy:SceneCapture2DActor|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32293</id>
      <timestamp>2008-05-31T19:10:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* UT3 Fake Skybox */ linked to new class pages</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

[[Legacy:Sunlight|Sunlight]]s are a special kind of light, casting parrallel shadows. They had to be placed in a skybox and pointed at the SkyZoneInfo actor to be effective.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[UE3:SceneCaptureCubeMapActor (UT3)|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[UE3:SceneCaptureCubeMapComponent (UT3)|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[UE3:SceneCapture2DActor (UT3)|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35395</id>
      <timestamp>2009-09-02T15:17:19Z</timestamp>
      <contributor>
        <ip>79.68.224.239</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

[[Legacy:Sunlight|Sunlight]]s are a special kind of light, casting parrallel shadows. They had to be placed in a skybox and pointed at the SkyZoneInfo actor to be effective.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[UE3:SceneCaptureCubeMapActor (UT3)|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[UE3:SceneCaptureCubeMapComponent (UT3)|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[UE3:SceneCapture2DActor (UT3)|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

'''Guest:''' What happens if, instead of  making a sky box, you make an 8 sided sky box. Would it look better, or just not work?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35396</id>
      <timestamp>2009-09-02T18:08:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Discussion */ well, yes</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

[[Legacy:Sunlight|Sunlight]]s are a special kind of light, casting parrallel shadows. They had to be placed in a skybox and pointed at the SkyZoneInfo actor to be effective.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[UE3:SceneCaptureCubeMapActor (UT3)|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[UE3:SceneCaptureCubeMapComponent (UT3)|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[UE3:SceneCapture2DActor (UT3)|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

'''Guest:''' What happens if, instead of  making a sky box, you make an 8 sided sky box. Would it look better, or just not work?

It really doesn't matter what shape you create for the sky zone, what matters is how the final result looks like. Common skybox textures are designed to be used on cube surfaces, though. —[[User:Wormbo|Wormbo]] 18:08, 2 September 2009 (UTC)

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43975</id>
      <timestamp>2010-09-09T18:53:59Z</timestamp>
      <contributor>
        <username>TheKiller</username>
        <id>2188</id>
      </contributor>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

[[Legacy:Sunlight|Sunlight]]s are a special kind of light, casting parrallel shadows. They had to be placed in a skybox and pointed at the SkyZoneInfo actor to be effective.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[UE3:SceneCaptureCubeMapActor (UT3)|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[UE3:SceneCaptureCubeMapComponent (UT3)|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[UE3:SceneCapture2DActor (UT3)|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

==Discussion==

'''TheKiller:''' The Skybox Instructions are only working in SinglePlayer Mode
To get them working in Multiplayer You have to add a ZoneInfo icon to the Map So the Sky will be displayed

'''FreshMeat:''' Please go into more detail about how to create a skybox without a static mesh. All I have tried have come out with distorted textures, and looking quite obviously like a box with a sky painted on it.

'''Switch`:''' The skyzoneinfo actor must be exactly in the center of the box. Enter the location manually in skyzoneinfo properties.

'''SuperApe:''' External link added to good tutorial for more realism in skyboxes.

'''Hellkeeper:''' Switch`, The Skyzoneinfo can be anywhere inside the skybox, and does not absolutely have to be in the center of it.

'''WesBelden:''' Sorry to pester, but the link to the UT3 Fake Skybox post comes up with an invalid post message. I've searched the UT3 forum but couldn't find anything on skyboxes :-|. If you have the info and could C&amp;P as a placeholder on this page that'd be really helpful! :).

'''Wormbo:''' Unfortunately BUF's database suffered a fatal harddisk crash a while ago, taking out a large number of posts. I'll see if I can write that tutorial again from memory.

'''WesBelden:''' I've just tried the above steps without any luck. I'll try again tomorrow when I'm actually awake; just to clarify though, should the material be applied to the 6 sides of a subtracted area, or should it only be applied to one surface, simulating a window? 

'''Wormbo:''' Being awake certainly helps when learning new things: ;)

{{innerbox| The material can now be applied to the window surface through which the sky box should be visible from within the main area of your map.

}}

'''WesBelden:''' Heheh, thanks :). After running through the steps again my house mate and I managed to get the fake skybox working to a degree. The texture displayed the fake skybox area and updated great whilst moving around, however the view given was always that of looking up towards the fake skybox's ceiling, no matter what surface (or its orientation) it was applied to. Rotating the SceneCaptureMapActor didn't have an effect. Is there any way of specifying which direction it should be looking at (I had assumed it would just show the direction based on the normal of the surface it was being applied to)?

'''WesBelden:''' After a helpful reply in the Epic forums (causing me to slap my face and make silly, self reproaching noises), I've finally managed to get it working; section updated.

'''Guest:''' What happens if, instead of  making a sky box, you make an 8 sided sky box. Would it look better, or just not work?

It really doesn't matter what shape you create for the sky zone, what matters is how the final result looks like. Common skybox textures are designed to be used on cube surfaces, though. —[[User:Wormbo|Wormbo]] 18:08, 2 September 2009 (UTC)

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43977</id>
      <timestamp>2010-09-09T20:52:42Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <minor/>
      <comment>Moved to discussion page</comment>
      <text xml:space="preserve">==Introduction==

The [[Legacy:SkyBox|SkyBox]] is a method of adding a continuous sky above a map.

A nice skybox adds greatly to the realism of an outdoor map or an indoor map with windows.  It also adds to the realistic effect of moving from one point to another one in a map.

A skybox is much better than adding a small box containing sky [[Legacy:Texture (UT)|Texture (UT)]]s just outside of each individual window.

A skybox can be almost any shape but a box is usually used because it is easier to align the textures than a cylinder, trapezoid, or sphere.  A sphere should be avoided because of texture alignment problems.

Probably the best way to get to understand the design of the skybox is just open a map in UnrealEd that has sky that you like. They are generally simple; just a cube with size selected to fit the textures used, lighting, and one or two transparent sheets on top for the actual sky texture. I would suggest the CTF-EpicBoy skybox as an optimal design. They can be quite complex, however, with multiple movers and decorations, and numerous textures with different surface properties set.  

[[Legacy:Sunlight|Sunlight]]s are a special kind of light, casting parrallel shadows. They had to be placed in a skybox and pointed at the SkyZoneInfo actor to be effective.

==A Simple SkyBox==
* Subtract a box some distance away from your level (If it is too close, it may cast a shadow!)  The size depends on the backdrop textures you plan to use.  Say you're using a texture set consisting of 8 panels and each is 512x512.  A skybox that is 1024x1024x512 high should suffice. A typical skybox is 128*1024*1024.
* Make sure your textures are aligned.  You may have to select ''No Smooth'' in the [[Legacy:Surface Properties|surface properties]] to prevent seams at the edges of the sky box itself.
* You can also throw in a sheet with a moon texture in the sky or some clouds for extra foggy effect.
* Do your lighting to get it looking the way you want it.
* Add a [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; [[Legacy:SkyZoneInfo|SkyZoneInfo]] actor in the middle of the skybox.
* Back on your level, select the surfaces on which you want the sky depicted. Open the [[Legacy:Surface Properties Window|Surface Properties Window]] and in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] tab check ''Fake Backdrop'' and ''Unlit''. If you don't make it unlit than your level's lighting might spoil the nice lighting in your skybox. Experiment with this aspect if you'd like.
* Rebuild your level.
* To see the skybox projected on surfaces in the editor, make sure [[Legacy:Realtime Preview|realtime preview]] mode is turned on in the 3D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].

==Advanced Skyboxes==

You can create [[Legacy:MultiSkyBox|MultiSkyBox]] or a [[Legacy:Rotating Skybox|rotating skybox]].

==Static Mesh Skyboxes==

This is another way of creating a nice skybox. Im using Devastation for the basic tutorial, but im sure the procedure for other editors should be roughly the same. 

'''Tarquin:''' Needs rewriting so it DOESN'T use Devastation 

# subtract a box a little bit away from your level. Make it 1024x1024x1024. The size does'nt really matter that much, but its better to be too big rather than too small.

# Go into the Embarcadero package and look for the sky static mesh. Many of the static mesh packages in devastation have a suitable mesh in them, so feel free to use another one.

# Place the static mesh inside the box, roughly in the middle. Add a SkyZone Info actor right in the middle of the static mesh sky.

# The fake backdrop procedure remains the same using this method so refer to the previous section for information on how to get the skybox to work.

# Re[[Legacy:Build|build]] your level. To view the sky, right click on a 3d Viewport and select View-&gt;Show backdrop.

Note: you can add another static mesh around the skyzone info too for added effect, although this is not vital.

==UT3 Skydome==

UT3 no longer uses sky boxes. Instead of setting a fake backdrop surface property, maps with outdoor view now need to be crated with additive geometry and a sky dome static mesh. Open any retail map to see how that works.

==UT3 Fake Skybox==

While UT3 no longer has SkyZoneInfos and dedicated sky boxes, it is still possible to fake the effect with a cube map material. This cube map can either be created from a set of textures or you can use the [[UE3:SceneCaptureCubeMapActor (UT3)|SceneCaptureCubeMapActor]] to capture a live view of an actual sky box like it was done in earlier generations of the Unreal Engine.

'''Note:''' A fake sky box like this will only provide visuals. Unlike in earlier engine generations, lights in the sky box will ''not'' affect anything in the main area!

Here's how a sky box with the SceneCaptureCubeMapActor should be set up:

# Create your map and sky box area as usual
# [[Legacy:Add An Actor|Add an actor]] &gt;&gt; SceneCaptureActor &gt;&gt; SceneCaptureCubeMapActor to your sky box as if it was a SkyZonInfo. SceneCaptureActors are not static, so you could even animate it using [[Legacy:Kismet|Kismet]]/[[Legacy:Matinee|Matinee]].
# Now you need to set up the properties of the [[UE3:SceneCaptureCubeMapComponent (UT3)|SceneCaptureCubeMapComponent]] in the SceneCaptureCubeMapActor's SceneCaptureActor -&gt; SceneCapture property.&lt;br /&gt;In its Capture group, [[Legacy:Set The Following Properties|set the following properties]]:
#; bEnableFog : Set this to True if your sky box uses fog, otherwise keep it false.
#; ClearColor : Set this to your sky box fog color.
#; FarPlane : Set this high enough so all visible parts of the skybox are closer than this value.
#; NearPlane : Set this to a value low enough that objects close to the SceneCaptureCubeMapActor are not clipped.
#; ViewMode : Make sure this is set to SceneCapView_Lit, otherwise lights and/or shadows in your sky box will be ignored.
#; FrameRate : Set this to 0 for a still-image sky box and otherwise to a reasonably high value so your skybox animation doesn't look choppy. This property has a huge impact on the performance of your map and higher values may cause the player's frame rate to drop due to the additional rendering work.
#; TextureTarget : This is where the actual magic happens. Use the Generic Browser's File -&gt; New... menu to create a new &quot;RenderToTextureCube&quot; and assign that texture to this property. Tweak the texture's size to an acceptable value so it won't blur out when a player gets close to the window in your map's main area, but don't make it too larger either because that will affect performance similar to increasing your in-game screen resolution.

Now that you have a static TextureCube or a dynamic TextureRenderTargetCube. Note that the above procedure is very similar to setting up a surveillance camera, except that you use [[UE3:SceneCapture2DActor (UT3)|SceneCapture2DActor]] instead of SceneCaptureCubeMapActor and RenderToTexture instead of RenderToTextureCube.

Now you only need to create a material that you can apply to the surfaces where your sky box should be visible:

# In the Generic Browser do File -&gt; New... to create a new Material, which will translate the cube map into the backdrop effect.
# Open the new material in the Material Editor.
# Add a new Texture Sample, set its Texture property to the cube map of your sky box and connect its RGB output (black) to the material's Emissive input.
# Add a new Multiply and connect its output to the Texture Sample's UV input.
# Add a new Vector Transform.
# Add a new Constant3Vector, entering the RGB values as 1, 1, -1 respectively.
# Connect the Constant3Vector and the Vector Transform to the Multiply 
# Add a new Camera Vector and connect its output to the Vector Transform's input.

Once you're done, your material setup should be similar to the one shown below.

[[Image:Legacy_fakeSkyBoxMaterial.jpeg|center|Material setup for the sky box cube map]]

The material can now be applied to the window surface (or the sides of a subtracted cube) through which the sky box should be visible from within the main area of your map.

Note: For anyone interested, the Multiply is used here to flip the Z because otherwise the material would display the captured area inverted in the Z axis. Additionally, Multiply can be replaced with Divide (with the same RGB values) if  Vector Transform links to the A input and the Constant3Vector links to the B input (A / B).

==Experiment==
:...with colored lighting, various textures and translucency effects.  [[Legacy:Colors|Colors]]
:...with moving the skybox info actor around in your skybox and see what happens in your perspective view at the fake back drop.  You'll need to have real time enabled in perspective view.
:...with other shapes.  ''A skybox does not have to be a box!''
:...with [[Legacy:Fog|fog]], but it might slow down your level a little.  &amp;rarr;[[Legacy:Zxanphorian|Zxanphorian]] 
:The Panorama brushbuilder is designed to quickly create a set of sheets to use with the skybox mountain and Skyscraper textures. You can find it in the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack.

==External Links==
* [http://www.outpt.co.uk/tut005.php Skybox/FogRing Tutorial], hosted by outpt.co.uk

==Related Topics==
* [[Legacy:Terragen|Terragen]] is a free, photo realistic environment rendering program.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Building An Outside Area</title>
    <id>555</id>
    <revision>
      <id>1711</id>
      <timestamp>2005-10-23T03:58:29Z</timestamp>
      <contributor>
        <ip>Dsl-135.252.240.220.dsl.comindico.com.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

Some maps are entirely indoors. This type has very defined limits on where you can go, and logically so - the only exits to the building are locked. (or in many cases, do not seem to exist! :P) Outdoors, unfortunately, there is a lot more freedom which can make it difficult to constrain people to a certain playing area. Obviously the level can only be so large, so eventually you will have to limit the freedom provided by an outdoor area.

==Freedom Must Have Limits==

Unfortunately, it can be difficult to do so logically. In real life you could probrably walk for hours without any real obstacle preventing you from going further. In Unreal maps this cannot be the case. To maintain the illusion of being outside a realistic limit is necessary. Some maps are surrounded by something hazardous that a player cannot pass through, others have impassable terrain, such as mountains, to block the player from reaching the edge of the designed area. A third option is to have the area surrounded by &quot;nothing,&quot; such as a space station or asteroid. The players cannot leave the play area because they would simply fall off the edge.

One possible solution is to have the level surrounded by killzones set to a damage type saying something similar to &quot;x left the map&quot;

Usually it is not very realistic to have an area entirely surrounded by impassable terrain or hazards, otherwise how would the players have gotten there? Unfortunately, there is rarely an option. Sometimes this can be alleviated by placing a dropship or other form of locomotion in the vicinity, or a sealed-off (with external doors, or debris) passage. Most of the time, however, players will not be particularly concerned with how they got there, so this is more of a finishing touch and can be omitted if it does not fit the theme of your map.

==The Wild Blue Yonder==

Outdoor maps will, almost without exception have a [[Legacy:SkyBox|SkyBox]]. This is a means of making the sky appear to be very far away, much more so than the actual &quot;roof&quot; of the outdoor area. [[Legacy:Building A SkyBox|Building A SkyBox]] explains how to make one. Also be aware that the &quot;roof&quot; of the outdoor area should be very high up, and the &quot;walls&quot; of the main subtracted space should be a fair distance beyond whatever constrains the players to the play area. This is to prevent players from shooting the &quot;roof&quot;/&quot;walls&quot; and also to prevent them from impacting on either if they leave the play area with great velocity, such as from a rocket jump or a hammer jump.

==&quot;Mobile&quot; Outdoor Levels==

Some maps appear to be in motion - this is, of course, just an illusion. The illusion is based on having things move rapidly past the level, typically in the skybox. Usually a zone or volume is set up so the player will die if they leave whatever it is that is &quot;moving.&quot; Examples of this effect can be seen in DM-Oblivion, DM-HyperBlast, and AS-HiSpeed, among others.

The simplest way to create this effect is to put textures on the walls/skybox that pan. In UT, you will need to set the surfaces to use U or V pan. (or both) In UT2003 you will need to make a TexPanner to use on the surfaces. This is recommended only for the most &quot;background&quot; layer of the effect, though it is often sufficient. If you want your &quot;mobile&quot; level to have lots of eyecandy, attaching actors to unseen movers can make the level appear to &quot;pass&quot; other stationary objects such as signs/animals/asteroids/people/rocks/etc.

This effect is used primarily outdoors, but can be used outside a window on an indoor level if the level's theme dictates it.

'''MythOpus:''' Couldn't you use the RockingSkyBox for a 'motion' effect also?

'''VICIOUS713:''' Is there a way to have large ships and things circle around a non-mobile level, or even have drop ships and fighters just pass by on random intervals? 

'''W0RF:'''  It can be done.  Hourences implemented this in DM-Redkin.  Perhaps he could provide input on how this was done.  I think an actor had to be coded to get the plane to pass at regular intervals.

'''EntropicLqd:''' The easiest way to do it is simply put the &quot;circling thing&quot; in the skybox.  Scale can be a bit of a problem though.  An alternative would be to move the ZoneInfo within the SkyBox itself around - but you might need a custom ZoneInfo to do that.

'''MythOpus:''' Would a ship attached to a looping mover work?  You could attach the ship(s) to movers and have them go around the skybox (in and out, in and out of the bsp).  If you had more than one then you could make it seem more random.

'''EntropicLqd:''' Yes, that should work.  I wrote an Interpolating SkyZone actor for UT.  It allowed you to set a path that the Sky Zone's ZoneInfo would follow.  If someone wants it I could probably port it to UT2004 with a bit of work.

'''Evilmrfrank:''' That does not need to be coded at all.  Just use the dispatcher trigger to send it into the level at ceartain timed periods.

'''MythOpus:'''Aren't Dispatchers taken out of UT2004 and replaced with scripted triggers :P

'''Evilmrfrank:''' Not sure, I just assumed it was talking about the original since it talked about hammer jumping.

'''Tarquin:''' that's just because it's old &amp; hasn't been updated.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1712</id>
      <timestamp>2005-09-28T16:15:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

Some maps are entirely indoors. This type has very defined limits on where you can go, and logically so - the only exits to the building are locked. (or in many cases, do not seem to exist! :P) Outdoors, unfortunately, there is a lot more freedom which can make it difficult to constrain people to a certain playing area. Obviously the level can only be so large, so eventually you will have to limit the freedom provided by an outdoor area.

==Freedom Must Have Limits==

Unfortunately, it can be difficult to do so logically. In real life you could probrably walk for hours without any real obstacle preventing you from going further. In Unreal maps this cannot be the case. To maintain the illusion of being outside a realistic limit is necessary. Some maps are surrounded by something hazardous that a player cannot pass through, others have impassable terrain, such as mountains, to block the player from reaching the edge of the designed area. A third option is to have the area surrounded by &quot;nothing,&quot; such as a space station or asteroid. The players cannot leave the play area because they would simply fall off the edge.

Usually it is not very realistic to have an area entirely surrounded by impassable terrain or hazards, otherwise how would the players have gotten there? Unfortunately, there is rarely an option. Sometimes this can be alleviated by placing a dropship or other form of locomotion in the vicinity, or a sealed-off (with external doors, or debris) passage. Most of the time, however, players will not be particularly concerned with how they got there, so this is more of a finishing touch and can be omitted if it does not fit the theme of your map.

==The Wild Blue Yonder==

Outdoor maps will, almost without exception have a [[Legacy:SkyBox|SkyBox]]. This is a means of making the sky appear to be very far away, much more so than the actual &quot;roof&quot; of the outdoor area. [[Legacy:Building A SkyBox|Building A SkyBox]] explains how to make one. Also be aware that the &quot;roof&quot; of the outdoor area should be very high up, and the &quot;walls&quot; of the main subtracted space should be a fair distance beyond whatever constrains the players to the play area. This is to prevent players from shooting the &quot;roof&quot;/&quot;walls&quot; and also to prevent them from impacting on either if they leave the play area with great velocity, such as from a rocket jump or a hammer jump.

==&quot;Mobile&quot; Outdoor Levels==

Some maps appear to be in motion - this is, of course, just an illusion. The illusion is based on having things move rapidly past the level, typically in the skybox. Usually a zone or volume is set up so the player will die if they leave whatever it is that is &quot;moving.&quot; Examples of this effect can be seen in DM-Oblivion, DM-HyperBlast, and AS-HiSpeed, among others.

The simplest way to create this effect is to put textures on the walls/skybox that pan. In UT, you will need to set the surfaces to use U or V pan. (or both) In UT2003 you will need to make a TexPanner to use on the surfaces. This is recommended only for the most &quot;background&quot; layer of the effect, though it is often sufficient. If you want your &quot;mobile&quot; level to have lots of eyecandy, attaching actors to unseen movers can make the level appear to &quot;pass&quot; other stationary objects such as signs/animals/asteroids/people/rocks/etc.

This effect is used primarily outdoors, but can be used outside a window on an indoor level if the level's theme dictates it.

'''MythOpus:''' Couldn't you use the RockingSkyBox for a 'motion' effect also?

'''VICIOUS713:''' Is there a way to have large ships and things circle around a non-mobile level, or even have drop ships and fighters just pass by on random intervals? 

'''W0RF:'''  It can be done.  Hourences implemented this in DM-Redkin.  Perhaps he could provide input on how this was done.  I think an actor had to be coded to get the plane to pass at regular intervals.

'''EntropicLqd:''' The easiest way to do it is simply put the &quot;circling thing&quot; in the skybox.  Scale can be a bit of a problem though.  An alternative would be to move the ZoneInfo within the SkyBox itself around - but you might need a custom ZoneInfo to do that.

'''MythOpus:''' Would a ship attached to a looping mover work?  You could attach the ship(s) to movers and have them go around the skybox (in and out, in and out of the bsp).  If you had more than one then you could make it seem more random.

'''EntropicLqd:''' Yes, that should work.  I wrote an Interpolating SkyZone actor for UT.  It allowed you to set a path that the Sky Zone's ZoneInfo would follow.  If someone wants it I could probably port it to UT2004 with a bit of work.

'''Evilmrfrank:''' That does not need to be coded at all.  Just use the dispatcher trigger to send it into the level at ceartain timed periods.

'''MythOpus:'''Aren't Dispatchers taken out of UT2004 and replaced with scripted triggers :P

'''Evilmrfrank:''' Not sure, I just assumed it was talking about the original since it talked about hammer jumping.

'''Tarquin:''' that's just because it's old &amp; hasn't been updated.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Building With CSG</title>
    <id>611</id>
    <revision>
      <id>1832</id>
      <timestamp>2006-11-26T13:02:57Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Change link from Glass to Making Windows</comment>
      <text xml:space="preserve">This page covers making [[Legacy:Architecture|Architecture]] the old-fashioned way: with CSG brushes that compile into a [[Legacy:BSP|BSP]]. 

For a gentle introduction to the concepts of unreal building, see [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Unreal World|Unreal World]] &amp; [[Legacy:Unreal Geometry|Unreal Geometry]].

==Creating Shapes ==

All building starts with the [[Legacy:Red Builder Brush|red builder brush]]. This is in a way a 3D cursor, which the mapper shapes and edits before using it to imprint a new brush on the world. 

The red bruilder brush can be given new shapes with:
* [[Legacy:Brushbuilders|Brushbuilders]], the standard brush shapes in the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]
* [[Legacy:2D Shape Editor|2D Shape Editor]], a simple &amp; powerful tool for making more complex shapes

Once you have a basic shape, it can be edited with the following techniques:
* [[Legacy:Intersect|Intersect]]ion and Deintersection
* [[Legacy:Brush Clipping|Brush Clipping]] 
* [[Legacy:Vertex Editing|Vertex Editing]] 
* [[Legacy:Brush Transformation|Brush Transformation]]

It is important to align brushes and vertices to grid, to reduce chance of [[Legacy:BSP Hole|BSP hole]]s:
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping brushes snapped to the grid]]
* The [[Legacy:Snap To Grid|Snap to Grid]] feature

Brush shapes can be saved to disk and reused in other maps:
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]

==Creating Space ==

Making world brushes out of the red builder brush:
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Order|Brush Order]]
* The [[Legacy:Build|Build]] process

==Technical ==

Technical specifics on the objects and tools used in creating architecture.
* [[Legacy:Brush|Brush]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BSP|BSP]]

==Architectural features ==

Techniques for making complex architexture.
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Stairs|Making Stairs]]
* [[Legacy:Making Terrain (UT)|Making Terrain (UT)]] 
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Trim|Making Trim]]
* [[Legacy:Making Trim With The Extruder|Making Trim with the Extruder]]
* [[Legacy:Making Flames|Making Flames]]
* [[Legacy:Building A SkyBox|Building A SkyBox]]

==Effects ==
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]: [[Legacy:Making Windows|Glass]] and [[Legacy:Texture Effects|masked textures]].
* WarpZones
* The [[Legacy:SkyBox|SkyBox]]
* [[Legacy:Making Liquids|Making Liquids]]
** Aquariums &amp; stuff
** [[Legacy:Making Waterfalls|Making waterfalls]]

==Special surfaces ==
* [[Legacy:Making Windows|Making Windows]]
* [[Legacy:Fluid Surfaces|Fluid Surfaces]]

==Facts &amp; Techniques ==
* [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]
* The [[Legacy:Snap To Grid|Snap to Grid]] feature
* [[Legacy:UnrealEd Tips|UnrealEd tips]]: add any general tips here for now!
* [[Legacy:Brush Duplication|Brush Duplication]] (more of an interface thing but here for now)

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Optimization|Map optimization]]</text>
    </revision>
    <revision>
      <id>1833</id>
      <timestamp>2003-05-28T12:31:28Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page covers making [[Legacy:Architecture|Architecture]] the old-fashioned way: with CSG brushes that compile into a [[Legacy:BSP|BSP]]. 

For a gentle introduction to the concepts of unreal building, see [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Unreal World|Unreal World]] &amp; [[Legacy:Unreal Geometry|Unreal Geometry]].

==Creating Shapes ==

All building starts with the [[Legacy:Red Builder Brush|red builder brush]]. This is in a way a 3D cursor, which the mapper shapes and edits before using it to imprint a new brush on the world. 

The red bruilder brush can be given new shapes with:
* [[Legacy:Brushbuilders|Brushbuilders]], the standard brush shapes in the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]
* [[Legacy:2D Shape Editor|2D Shape Editor]], a simple &amp; powerful tool for making more complex shapes

Once you have a basic shape, it can be edited with the following techniques:
* [[Legacy:Intersect|Intersect]]ion and Deintersection
* [[Legacy:Brush Clipping|Brush Clipping]] 
* [[Legacy:Vertex Editing|Vertex Editing]] 
* [[Legacy:Brush Transformation|Brush Transformation]]

Brush shapes can be saved to disk and reused in other maps:
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]

==Creating Space ==

Making world brushes out of the red builder brush:
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Order|Brush Order]]
* The [[Legacy:Build|Build]] process

==Technical ==

Technical specifics on the objects and tools used in creating architecture.
* [[Legacy:Brush|Brush]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BSP|BSP]]

==Architectural features ==

Techniques for making complex architexture.
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Stairs|Making Stairs]]
* [[Legacy:Making Terrain (UT)|Making Terrain (UT)]] 
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Trim|Making Trim]]
* [[Legacy:Making Trim With The Extruder|Making Trim with the Extruder]]
* [[Legacy:Making Flames|Making Flames]]
* [[Legacy:Building A SkyBox|Building A SkyBox]]

==Effects ==
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]: [[Legacy:Glass|Glass]] and [[Legacy:Texture Effects|masked textures]].
* WarpZones
* The [[Legacy:SkyBox|SkyBox]]
* [[Legacy:Making Liquids|Making Liquids]]
** Aquariums &amp; stuff
** [[Legacy:Making Waterfalls|Making waterfalls]]

==Special surfaces ==
* [[Legacy:Making Windows|Making Windows]]
* [[Legacy:Fluid Surfaces|Fluid Surfaces]]

==Facts &amp; Techniques ==
* [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]
* The [[Legacy:Snap To Grid|Snap to Grid]] feature
* [[Legacy:UnrealEd Tips|UnrealEd tips]]: add any general tips here for now!
* [[Legacy:Brush Duplication|Brush Duplication]] (more of an interface thing but here for now)

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Optimization|Map optimization]]</text>
    </revision>
    <revision>
      <id>1834</id>
      <timestamp>2004-11-02T16:42:15Z</timestamp>
      <contributor>
        <ip>Nat4-3.iti.lt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page covers making [[Legacy:Architecture|Architecture]] the old-fashioned way: with CSG brushes that compile into a [[Legacy:BSP|BSP]]. 

For a gentle introduction to the concepts of unreal building, see [[Legacy:Mapping Lessons|Mapping Lessons]], [[Legacy:Unreal World|Unreal World]] &amp; [[Legacy:Unreal Geometry|Unreal Geometry]].

==Creating Shapes ==

All building starts with the [[Legacy:Red Builder Brush|red builder brush]]. This is in a way a 3D cursor, which the mapper shapes and edits before using it to imprint a new brush on the world. 

The red bruilder brush can be given new shapes with:
* [[Legacy:Brushbuilders|Brushbuilders]], the standard brush shapes in the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]
* [[Legacy:2D Shape Editor|2D Shape Editor]], a simple &amp; powerful tool for making more complex shapes

Once you have a basic shape, it can be edited with the following techniques:
* [[Legacy:Intersect|Intersect]]ion and Deintersection
* [[Legacy:Brush Clipping|Brush Clipping]] 
* [[Legacy:Vertex Editing|Vertex Editing]] 
* [[Legacy:Brush Transformation|Brush Transformation]]

It is important to align brushes and vertices to grid, to reduce chance of [[Legacy:BSP Hole|BSP hole]]s:
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping brushes snapped to the grid]]
* The [[Legacy:Snap To Grid|Snap to Grid]] feature

Brush shapes can be saved to disk and reused in other maps:
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]

==Creating Space ==

Making world brushes out of the red builder brush:
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Order|Brush Order]]
* The [[Legacy:Build|Build]] process

==Technical ==

Technical specifics on the objects and tools used in creating architecture.
* [[Legacy:Brush|Brush]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BSP|BSP]]

==Architectural features ==

Techniques for making complex architexture.
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Stairs|Making Stairs]]
* [[Legacy:Making Terrain (UT)|Making Terrain (UT)]] 
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Trim|Making Trim]]
* [[Legacy:Making Trim With The Extruder|Making Trim with the Extruder]]
* [[Legacy:Making Flames|Making Flames]]
* [[Legacy:Building A SkyBox|Building A SkyBox]]

==Effects ==
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]: [[Legacy:Glass|Glass]] and [[Legacy:Texture Effects|masked textures]].
* WarpZones
* The [[Legacy:SkyBox|SkyBox]]
* [[Legacy:Making Liquids|Making Liquids]]
** Aquariums &amp; stuff
** [[Legacy:Making Waterfalls|Making waterfalls]]

==Special surfaces ==
* [[Legacy:Making Windows|Making Windows]]
* [[Legacy:Fluid Surfaces|Fluid Surfaces]]

==Facts &amp; Techniques ==
* [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]
* The [[Legacy:Snap To Grid|Snap to Grid]] feature
* [[Legacy:UnrealEd Tips|UnrealEd tips]]: add any general tips here for now!
* [[Legacy:Brush Duplication|Brush Duplication]] (more of an interface thing but here for now)

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Optimization|Map optimization]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Building With Static Meshes</title>
    <id>612</id>
    <revision>
      <id>1835</id>
      <timestamp>2004-06-23T08:48:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The introduction of [[Legacy:Static Mesh|Static Mesh]]es has radically changed how maps are built. In the [[Legacy:The Curse Of Static Meshes|The Curse Of Static Meshes]] article, mappers explain their problems with this new technique. Here you'll find solutions.

==Acclimatizing ==

rough thoughts to refactor:

* to get an idea of how to use SMs, use RMODE 3 in game, or [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Show -&gt; Static meshes. 
* despite what has been said, maps are not mere boxes with meshes: many maps still have a reasonably complex [[Legacy:BSP|BSP]], with things like subtracts for lowered floor areas (in the first map of the DD ladder)

Getting used to SM... some rough ideas:

* adapt DavidM's old advice about mapping for UT: copy. Take a UT2003 map you like &amp;ndash; then rip it up and rip it off. Copy the style. Make corridors, entrances, walkways etc the same way as in that map. If you feel brave, load up the SM packages it uses and experiment with the other SMs in those packages.

==Problems==

Quick cures for static mesh ailments:

===Finding the right mesh===

Epic's mesh packages are notorious for being an absolute mess, with no logic to the way the meshes are organized. (Hello? 80% of meshes in &quot;misc&quot; group?)

Try our [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]]. There's also an app being worked on that will let you search them by keyword.

===Meshes stuck in maps===

If you want to use any of the static meshes Epic's or Digital Extremes' mappers put into their maps' [[Legacy:MyLevel|MyLevel]] [[Legacy:Package|package]]s, you do not have to re-import them into your own MyLevel package. Simply load the map they're in in the static mesh browser as if it was a static mesh package (in fact, since it contains static meshes, it's as good as one).

However, some players delete standard maps they do not like from their hard drive &amp;ndash; mention the dependency in your map's accompanying text file.

===PrePivot===

Some meshes are ''always'' off-grid, no matter what you do to. This appears to be down to shoddy work on the part of Epic. 

Use [[Legacy:Actor/Display|Display]] -&gt; PrePivot to put awkward meshes back on grid.

===Scaling Textures===

SMs can be scaled to any size, which is great! But the texture they carry is scaled too, and sometimes this looks like crud if you make the mesh too large. 

Create a [[Legacy:TexScaler|TexScaler]] in [[Legacy:MyLevel|MyLevel]] to rescale textures in a flash for static meshes you've scaled. For example, if you have doubled the size of the mesh, halved the size fo the texture to compensate.

===Bad lights===

A number of light meshes have the actual light part displaying a material that is ''set to unlit''. You can find normal versions of the material if you look in the [[Legacy:Texture Package|texture package]] it comes from, eg UCGeneric.

===No back face===

Meshes with no back face &amp;ndash; eg the windows in DM-Oceanic.

You might have to put two meshes back to back, or create a two-side version of the material that is applied. Or use CSG brushes to fill in the gaps.

==Customizing ==

See [[Legacy:StaticMeshActor|StaticMeshActor]] for useful properties that can be set to alter individual placed static meshes; see [[Legacy:Static Mesh|Static Mesh]] for properties of the actual resource that can be edited.

Briefly, you can change the following aspects of a placed mesh:
* size
* rotation
* displayed textures

==Opinions on static mesh mapping ==
* [[Legacy:The Curse Of Static Meshes|The Curse Of Static Meshes]] &amp;ndash; the ''curse''

----

''anything below here please refactor or delete!''

----

{{innerbox| 
Lee Perry (of Epic) writes on the Polycount Message Boards:

&quot;Levels and environment meshes are far more my area of expertise. There's many factors that go into your frame rate of course, but it's normal to have about 30K to 60K polys *in view* at any time. Your level could have a great great GREAT deal more than than, it's all about what's visible, and there's many (easy to use) new tools to help with visibility, such as anti-portals and volumes.

For the most part we build level shells out of BSP at about 2-5 times the polys of a UT level, and then we populate it very densely with environment static meshes. These are built (most of the time) in a modular fashion, and pull a lot of the weight level textures used to in UT. Instead of slapping a texture on a wall, now you grab a couple of models and stick in front of the wall. The modular designs allow for a great deal of detail in a level without having to meticulously model a high-detail level. Building static mesh sets is pretty fun stuff, especially when you get the payoff of seeing them all over the web in everyone's levels, and largely used in ways you never would of expected.

You could model 2-3 basic walls (built with edges on a grid prederably), make a door, maybe a cieling piece or two, maybe 2 good decoration pieces if you feel like it, and voilà you'll have 9000 user maps using your prefabs everywhere they can fit them. It's cool to walk into a room you modeled, and not really recognize it because it was built so differently than you intended&quot;

and

&quot;Oh, BTW, for sea surfaces, you'd most likely drop in a dynamic water plane and it would be generated realistically in a way that should never tile. And you can set things like mesh resolution, wave height, etc... on that&quot;



}}

Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636.html?00168 Polycount Message Board]

==General Forum on Static Meshes ==

Amid cries that &quot;Unreal Mapping is over&quot;, let's establish some rough ideas. First of all, people should realize that they're discussing based on suppositions.

Models may come to be treated much like textures are currently treated. That is:
* no-one complains that they can only use UT bundled textures, 
* there's plenty of variety bundled with the game
* Epic mappers such as CliffyB have previously expressed surprise at the originality with which l33t community mappers use the built-in textures
* some people will specialize and create model packs, the same way people produced texture packs.

Model creating will become an extra job in the process of making environments; this is a natural direction to take since the complexity of the worlds is increasing.

Some more information taken from the Polycount message board (once again eepers stumps up the goods).

{{innerbox| 
Lee Perry (of Epic) writes some more on the Polycount Message Boards:

Actually, Ent, the prefab modeling and level design questions are completely what I'm most familiar with, so no prob at all, ask away, detailed as you like!

No, nothing has replaced zones. They are still the best and fastest way to break up a map. Volume is a general term that could be anything from a damage volume to a volume that changes the physics within it. I imagine you're pretty much refering to &quot;anti-portal volumes though (APV's if you will)&quot;

An APV or simple Anti-portal sheet is something you use only when zoning won't do the trick for you. Rooms connected by hallways and so forth should still be zones, but if a room is really big with an object in the middle, you stick an APV in it, and it helps obscure things behind it (in the same zone). Another key use is in terrain. Say you've got a map with big hills on it. The whole outside is a single zone, but you don't wanna go drawing the whole world when you're outside. So you take an anti-portal and stick it in your major hills so the engine knows it doesn't need to draw things on the other side.

APVs can be any convex shape, preferably with low polys. Honestly I don't think once in the game has one been used that wasn't a simple cube though. it's not a big precision-mesh-fitting operation. Too many anti-portals start to outweigh the benefits of themselves as well, don't go dropping them in every little item just in case someone crouches behind it.

Naming areas can be done in Zone Infos, or a volume can be dragged over an area that does nothing but change the location name.

I don't know why anyone would claim APVs don't work in multiplayer, they're a key factor in getting maps running fast. They do.

Fog does occlude polys beyond it, yes. Unless a material specifically states it's double sided, the engine doesn't draw the backs of polys. It's still a good idea to delete polys you won't see, because there's still overhead with those polys as the engine runs around talking to the vid card trying to decide wether it needs to draw them or not.

Level polys vary a great deal, it's just one of many aspects you keep in mind. Overdraw from loads of particles have a big hit (learn to make efficient emitters!), some materials slow it, etc. But if you're just looking for a ballpark... 20K to 45K polys in view, onscreen, is pretty reasonable. As said before though, it varies widely. You can find cases where a test level pushes 600K polys at a steady 50 FPS, and you can find cases with loads of materials and overdraw and gameplay issues that runs 12K polys at 15FPS.

Luckily there are many tools in game that let you pull up stats and see exactly where your framerate is going as you run around a level, it's pretty easy to spot problem areas.



}}

Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636-9.html Polycount Message Board]

And heres some more fromthe same thread.  Lee Perry is one patient guy.

{{innerbox| &quot;The way it works is this... if you're looking through an anti-portal and you see a little corner of a wall mesh sticking out behind it, the whole wall mesh gets drawn. If you move so as the whole thing is out of view, obscured by the volume, the whole mesh isn't drawn. So making a complicated volume for this use will generally not make it work better, you're always going to be moving around and seeing things around corners. It's best to use the simplest shape to get the job done.&quot;

}}

==Static Meshes and Collision ==

Here's some more fascinating information taken from the UT Modelling thread over at polycount (Props to Lee Perry again :)).

{{innerbox| &quot;Collision for static meshes is specified in the editor. Bullets and line-trace effects will default to per-polygon no-fuss collision. Player collision will too, but it's a good idea to make a simplified version in editor to reduce this, it gets expensive when you've got 16 people running around your area. That's an easy task, BTW, even though it sounds like a drag, Karma will benefit from that step anyway.

 Karma collision *CAN* use per-poly collision, but it gets expensive quick. As with player collision, it's best to bring in your wall, build a relatively simplified BSP surface around it, and designate that as that object's collision. You only have to do that once. As you do that, every instance of that wall mesh throughout the level gains that same collision.&quot;

 Also, if that's not something you're jazzed about, or you've got something that should really just be a cylinder or a box, in the little mesh browser you can create a collision mesh with like 2 clicks. They're called DOPs, and essentially you tell it which of the simple shapes you want and it shrink wraps that primative to your object. It's very fast, very user friendly, and it speeds up player and karma collision calculation VASTLY. BSP shells generally are only resorted to if a DOP shape isn't really appropriate.

 By using these two collision techniques, there's really very few places you need to make any kind of blocking volumes.&quot;

}}

==Related Topics ==
* [[Legacy:Static Mesh|Static Mesh]] &amp;ndash; Definition &amp; basics
* [[Legacy:Static Mesh Modeling|Static Mesh Modeling]] &amp;ndash; creating your own
* [[Legacy:Static Mesh Package|Static Mesh Package]] &amp;ndash; listing of the default SM packages 
* [[Legacy:Hardware Brush|Hardware Brush]]

----

'''EntropicLqd:''' I've been thinking about this whole prefab thing and it occurs to me that in order to make effective use of the prefabs you will need to make your BSP/geometry corridors wider than you would expect.  Otherwise when you add your &quot;prefab wall&quot; the interior space within your corridor (or room) will be smaller than anticipated.  Some questions that could do with answering around this are:
* Do prefabs have a front and back (a side from which they are not visible)?  It would seem a sensible.
* Should prefabs be algined with world geometry, or, do they need to sit slightly in front of the BSP'd wall (like in UT when you have 2 add brushes in the same place you see texture tears).

'''Mychaeel:''' You certainly ''can'' make prefabs that don't have a back side, and to achieve a 3D effect, they'll have to sit a bit in front of a wall.

'''Aphex:''' I presume meshes are treated the same way as our old friends semi-solids (though probably without the bsp errors ;) so you dont need to align them with anything, and they are separate from the BSP.

----

'''EntropicLqd:''' I pity the poor bugger that winds up refactoring all this information.  I'd have a go but it scares me.

'''Flashman:''' Well sed Ent m8 :) btw: i'm currently making architecture that has no backfacing polys where I can guarantee there will be a wall/floor etc. It's just a matter of preference &amp; performance :) apart from probs with texture alignment (probably my MAX un1337ness) the seem to go in fine!

----

[[:Category:Legacy Mapping]]

[[Legacy:Refactor Me|Refactor me]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1836</id>
      <timestamp>2003-10-24T10:51:39Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>refactor me</comment>
      <text xml:space="preserve">* [[Legacy:Static Mesh|Static Mesh]] &amp;ndash;  Definition &amp; basics
* [[Legacy:Static Mesh Modeling|Static Mesh Modeling]]
* [[Legacy:Static Mesh Package|Static Mesh Package]] &amp;ndash; listing of the default SM packages 

rough thoughts to refactor into a proper page:

* to get an idea of how to use SMs, use RMODE 3 in game, or [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Show -&gt; Static meshes. 
* despite what has been said, maps are not mere boxes with meshes: many maps still have a reasonably complex [[Legacy:BSP|BSP]], with things like subtracts for lowered floor areas (in the first map of the DD ladder)

==Acclimatizing ==

Getting used to SM... some rough ideas:

* adapt DavidM's old advice about mapping for UT: copy. Take a UT2003 map you like &amp;ndash; then rip it up and rip it off. Copy the style. Make corridors, entrances, walkways etc the same way as in that map. If you feel brave, load up the SM packages it uses and experiment with the other SMs in those packages.

==Customizing ==

See [[Legacy:StaticMeshActor|StaticMeshActor]] for useful properties that can be set to alter individual placed static meshes; see [[Legacy:Static Mesh|Static Mesh]] for properties of the actual resource that can be edited.

==Problems ==
* meshes with no back face &amp;ndash; eg the windows in DM-Oceanic

==Opinions on static mesh mapping ==
* [[Legacy:The Curse Of Static Meshes|The Curse Of Static Meshes]] &amp;ndash; the ''curse''

----

''anything below here please refactor or delete!''

==Using the Epic Meshes ==

(stealing shamelessly from Mych's post)

If you want to use any of the static meshes Epic's or Digital Extremes' mappers put into their maps' [[Legacy:MyLevel|MyLevel]] [[Legacy:Package|package]]s, you do not have to re-import them into your own MyLevel package. Simply load the map they're in in the static mesh browser as if it was a static mesh package (in fact, since it contains static meshes, it's as good as one)

----

{{innerbox| 
Lee Perry (of Epic) writes on the Polycount Message Boards:

&quot;Levels and environment meshes are far more my area of expertise. There's many factors that go into your frame rate of course, but it's normal to have about 30K to 60K polys *in view* at any time. Your level could have a great great GREAT deal more than than, it's all about what's visible, and there's many (easy to use) new tools to help with visibility, such as anti-portals and volumes.

For the most part we build level shells out of BSP at about 2-5 times the polys of a UT level, and then we populate it very densely with environment static meshes. These are built (most of the time) in a modular fashion, and pull a lot of the weight level textures used to in UT. Instead of slapping a texture on a wall, now you grab a couple of models and stick in front of the wall. The modular designs allow for a great deal of detail in a level without having to meticulously model a high-detail level. Building static mesh sets is pretty fun stuff, especially when you get the payoff of seeing them all over the web in everyone's levels, and largely used in ways you never would of expected.

You could model 2-3 basic walls (built with edges on a grid prederably), make a door, maybe a cieling piece or two, maybe 2 good decoration pieces if you feel like it, and voilà you'll have 9000 user maps using your prefabs everywhere they can fit them. It's cool to walk into a room you modeled, and not really recognize it because it was built so differently than you intended&quot;

and

&quot;Oh, BTW, for sea surfaces, you'd most likely drop in a dynamic water plane and it would be generated realistically in a way that should never tile. And you can set things like mesh resolution, wave height, etc... on that&quot;



}}

Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636.html?00168 Polycount Message Board]

==General Forum on Static Meshes ==

Amid cries that &quot;Unreal Mapping is over&quot;, let's establish some rough ideas. First of all, people should realize that they're discussing based on suppositions.

Models may come to be treated much like textures are currently treated. That is:
* no-one complains that they can only use UT bundled textures, 
* there's plenty of variety bundled with the game
* Epic mappers such as CliffyB have previously expressed surprise at the originality with which l33t community mappers use the built-in textures
* some people will specialize and create model packs, the same way people produced texture packs.

Model creating will become an extra job in the process of making environments; this is a natural direction to take since the complexity of the worlds is increasing.

Some more information taken from the Polycount message board (once again eepers stumps up the goods).

{{innerbox| 
Lee Perry (of Epic) writes some more on the Polycount Message Boards:

Actually, Ent, the prefab modeling and level design questions are completely what I'm most familiar with, so no prob at all, ask away, detailed as you like!

No, nothing has replaced zones. They are still the best and fastest way to break up a map. Volume is a general term that could be anything from a damage volume to a volume that changes the physics within it. I imagine you're pretty much refering to &quot;anti-portal volumes though (APV's if you will)&quot;

An APV or simple Anti-portal sheet is something you use only when zoning won't do the trick for you. Rooms connected by hallways and so forth should still be zones, but if a room is really big with an object in the middle, you stick an APV in it, and it helps obscure things behind it (in the same zone). Another key use is in terrain. Say you've got a map with big hills on it. The whole outside is a single zone, but you don't wanna go drawing the whole world when you're outside. So you take an anti-portal and stick it in your major hills so the engine knows it doesn't need to draw things on the other side.

APVs can be any convex shape, preferably with low polys. Honestly I don't think once in the game has one been used that wasn't a simple cube though. it's not a big precision-mesh-fitting operation. Too many anti-portals start to outweigh the benefits of themselves as well, don't go dropping them in every little item just in case someone crouches behind it.

Naming areas can be done in Zone Infos, or a volume can be dragged over an area that does nothing but change the location name.

I don't know why anyone would claim APVs don't work in multiplayer, they're a key factor in getting maps running fast. They do.

Fog does occlude polys beyond it, yes. Unless a material specifically states it's double sided, the engine doesn't draw the backs of polys. It's still a good idea to delete polys you won't see, because there's still overhead with those polys as the engine runs around talking to the vid card trying to decide wether it needs to draw them or not.

Level polys vary a great deal, it's just one of many aspects you keep in mind. Overdraw from loads of particles have a big hit (learn to make efficient emitters!), some materials slow it, etc. But if you're just looking for a ballpark... 20K to 45K polys in view, onscreen, is pretty reasonable. As said before though, it varies widely. You can find cases where a test level pushes 600K polys at a steady 50 FPS, and you can find cases with loads of materials and overdraw and gameplay issues that runs 12K polys at 15FPS.

Luckily there are many tools in game that let you pull up stats and see exactly where your framerate is going as you run around a level, it's pretty easy to spot problem areas.



}}

Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636-9.html Polycount Message Board]

And heres some more fromthe same thread.  Lee Perry is one patient guy.

{{innerbox| &quot;The way it works is this... if you're looking through an anti-portal and you see a little corner of a wall mesh sticking out behind it, the whole wall mesh gets drawn. If you move so as the whole thing is out of view, obscured by the volume, the whole mesh isn't drawn. So making a complicated volume for this use will generally not make it work better, you're always going to be moving around and seeing things around corners. It's best to use the simplest shape to get the job done.&quot;

}}

==Static Meshes and Collision ==

Here's some more fascinating information taken from the UT Modelling thread over at polycount (Props to Lee Perry again :)).

{{innerbox| &quot;Collision for static meshes is specified in the editor. Bullets and line-trace effects will default to per-polygon no-fuss collision. Player collision will too, but it's a good idea to make a simplified version in editor to reduce this, it gets expensive when you've got 16 people running around your area. That's an easy task, BTW, even though it sounds like a drag, Karma will benefit from that step anyway.

 Karma collision *CAN* use per-poly collision, but it gets expensive quick. As with player collision, it's best to bring in your wall, build a relatively simplified BSP surface around it, and designate that as that object's collision. You only have to do that once. As you do that, every instance of that wall mesh throughout the level gains that same collision.&quot;

 Also, if that's not something you're jazzed about, or you've got something that should really just be a cylinder or a box, in the little mesh browser you can create a collision mesh with like 2 clicks. They're called DOPs, and essentially you tell it which of the simple shapes you want and it shrink wraps that primative to your object. It's very fast, very user friendly, and it speeds up player and karma collision calculation VASTLY. BSP shells generally are only resorted to if a DOP shape isn't really appropriate.

 By using these two collision techniques, there's really very few places you need to make any kind of blocking volumes.&quot;

}}

==Related Topics ==
* [[Legacy:Hardware Brush|Hardware Brush]]

----

'''EntropicLqd:''' I've been thinking about this whole prefab thing and it occurs to me that in order to make effective use of the prefabs you will need to make your BSP/geometry corridors wider than you would expect.  Otherwise when you add your &quot;prefab wall&quot; the interior space within your corridor (or room) will be smaller than anticipated.  Some questions that could do with answering around this are:
* Do prefabs have a front and back (a side from which they are not visible)?  It would seem a sensible.
* Should prefabs be algined with world geometry, or, do they need to sit slightly in front of the BSP'd wall (like in UT when you have 2 add brushes in the same place you see texture tears).

'''Mychaeel:''' You certainly ''can'' make prefabs that don't have a back side, and to achieve a 3D effect, they'll have to sit a bit in front of a wall.

'''Aphex:''' I presume meshes are treated the same way as our old friends semi-solids (though probably without the bsp errors ;) so you dont need to align them with anything, and they are separate from the BSP.

----

'''EntropicLqd:''' I pity the poor bugger that winds up refactoring all this information.  I'd have a go but it scares me.

'''Flashman:''' Well sed Ent m8 :) btw: i'm currently making architecture that has no backfacing polys where I can guarantee there will be a wall/floor etc. It's just a matter of preference &amp; performance :) apart from probs with texture alignment (probably my MAX un1337ness) the seem to go in fine!

----

[[:Category:Legacy Mapping]]

[[Legacy:Refactor Me|Refactor me]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1837</id>
      <timestamp>2004-05-25T09:36:28Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The introduction of [[Legacy:Static Mesh|Static Mesh]]es has radically changed how maps are built.

==Acclimatizing ==

rough thoughts to refactor:

* to get an idea of how to use SMs, use RMODE 3 in game, or [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Show -&gt; Static meshes. 
* despite what has been said, maps are not mere boxes with meshes: many maps still have a reasonably complex [[Legacy:BSP|BSP]], with things like subtracts for lowered floor areas (in the first map of the DD ladder)

Getting used to SM... some rough ideas:

* adapt DavidM's old advice about mapping for UT: copy. Take a UT2003 map you like &amp;ndash; then rip it up and rip it off. Copy the style. Make corridors, entrances, walkways etc the same way as in that map. If you feel brave, load up the SM packages it uses and experiment with the other SMs in those packages.

==Problems==

Quick cures for static mesh ailments:

===Finding the right mesh===

Epic's mesh packages are notorious for being an absolute mess, with no logic to the way the meshes are organized. (Hello? 80% of meshes in &quot;misc&quot; group?)

Try our [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]]. There's also an app being worked on that will let you search them by keyword.

===Meshes stuck in maps===

If you want to use any of the static meshes Epic's or Digital Extremes' mappers put into their maps' [[Legacy:MyLevel|MyLevel]] [[Legacy:Package|package]]s, you do not have to re-import them into your own MyLevel package. Simply load the map they're in in the static mesh browser as if it was a static mesh package (in fact, since it contains static meshes, it's as good as one).

However, some players delete standard maps they do not like from their hard drive &amp;ndash; mention the dependency in your map's accompanying text file.

===PrePivot===

Some meshes are ''always'' off-grid, no matter what you do to. This appears to be down to shoddy work on the part of Epic. 

Use [[Legacy:Actor/Display|Display]] -&gt; PrePivot to put awkward meshes back on grid.

===Scaling Textures===

SMs can be scaled to any size, which is great! But the texture they carry is scaled too, and sometimes this looks like crud if you make the mesh too large. 

Create a [[Legacy:TexScaler|TexScaler]] in [[Legacy:MyLevel|MyLevel]] to rescale textures in a flash for static meshes you've scaled.

===Bad lights===

A number of light meshes have the actual light part displaying a material that is ''set to unlit''. You can find normal versions of the material if you look in the [[Legacy:Texture Package|texture package]] it comes from, eg UCGeneric.

===No back face===

Meshes with no back face &amp;ndash; eg the windows in DM-Oceanic.

You might have to put two meshes back to back, or create a two-side version of the material that is applied. Or use CSG brushes to fill in the gaps.

==Customizing ==

See [[Legacy:StaticMeshActor|StaticMeshActor]] for useful properties that can be set to alter individual placed static meshes; see [[Legacy:Static Mesh|Static Mesh]] for properties of the actual resource that can be edited.

==Opinions on static mesh mapping ==
* [[Legacy:The Curse Of Static Meshes|The Curse Of Static Meshes]] &amp;ndash; the ''curse''

----

''anything below here please refactor or delete!''

----

{{innerbox| 
Lee Perry (of Epic) writes on the Polycount Message Boards:

&quot;Levels and environment meshes are far more my area of expertise. There's many factors that go into your frame rate of course, but it's normal to have about 30K to 60K polys *in view* at any time. Your level could have a great great GREAT deal more than than, it's all about what's visible, and there's many (easy to use) new tools to help with visibility, such as anti-portals and volumes.

For the most part we build level shells out of BSP at about 2-5 times the polys of a UT level, and then we populate it very densely with environment static meshes. These are built (most of the time) in a modular fashion, and pull a lot of the weight level textures used to in UT. Instead of slapping a texture on a wall, now you grab a couple of models and stick in front of the wall. The modular designs allow for a great deal of detail in a level without having to meticulously model a high-detail level. Building static mesh sets is pretty fun stuff, especially when you get the payoff of seeing them all over the web in everyone's levels, and largely used in ways you never would of expected.

You could model 2-3 basic walls (built with edges on a grid prederably), make a door, maybe a cieling piece or two, maybe 2 good decoration pieces if you feel like it, and voilà you'll have 9000 user maps using your prefabs everywhere they can fit them. It's cool to walk into a room you modeled, and not really recognize it because it was built so differently than you intended&quot;

and

&quot;Oh, BTW, for sea surfaces, you'd most likely drop in a dynamic water plane and it would be generated realistically in a way that should never tile. And you can set things like mesh resolution, wave height, etc... on that&quot;



}}

Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636.html?00168 Polycount Message Board]

==General Forum on Static Meshes ==

Amid cries that &quot;Unreal Mapping is over&quot;, let's establish some rough ideas. First of all, people should realize that they're discussing based on suppositions.

Models may come to be treated much like textures are currently treated. That is:
* no-one complains that they can only use UT bundled textures, 
* there's plenty of variety bundled with the game
* Epic mappers such as CliffyB have previously expressed surprise at the originality with which l33t community mappers use the built-in textures
* some people will specialize and create model packs, the same way people produced texture packs.

Model creating will become an extra job in the process of making environments; this is a natural direction to take since the complexity of the worlds is increasing.

Some more information taken from the Polycount message board (once again eepers stumps up the goods).

{{innerbox| 
Lee Perry (of Epic) writes some more on the Polycount Message Boards:

Actually, Ent, the prefab modeling and level design questions are completely what I'm most familiar with, so no prob at all, ask away, detailed as you like!

No, nothing has replaced zones. They are still the best and fastest way to break up a map. Volume is a general term that could be anything from a damage volume to a volume that changes the physics within it. I imagine you're pretty much refering to &quot;anti-portal volumes though (APV's if you will)&quot;

An APV or simple Anti-portal sheet is something you use only when zoning won't do the trick for you. Rooms connected by hallways and so forth should still be zones, but if a room is really big with an object in the middle, you stick an APV in it, and it helps obscure things behind it (in the same zone). Another key use is in terrain. Say you've got a map with big hills on it. The whole outside is a single zone, but you don't wanna go drawing the whole world when you're outside. So you take an anti-portal and stick it in your major hills so the engine knows it doesn't need to draw things on the other side.

APVs can be any convex shape, preferably with low polys. Honestly I don't think once in the game has one been used that wasn't a simple cube though. it's not a big precision-mesh-fitting operation. Too many anti-portals start to outweigh the benefits of themselves as well, don't go dropping them in every little item just in case someone crouches behind it.

Naming areas can be done in Zone Infos, or a volume can be dragged over an area that does nothing but change the location name.

I don't know why anyone would claim APVs don't work in multiplayer, they're a key factor in getting maps running fast. They do.

Fog does occlude polys beyond it, yes. Unless a material specifically states it's double sided, the engine doesn't draw the backs of polys. It's still a good idea to delete polys you won't see, because there's still overhead with those polys as the engine runs around talking to the vid card trying to decide wether it needs to draw them or not.

Level polys vary a great deal, it's just one of many aspects you keep in mind. Overdraw from loads of particles have a big hit (learn to make efficient emitters!), some materials slow it, etc. But if you're just looking for a ballpark... 20K to 45K polys in view, onscreen, is pretty reasonable. As said before though, it varies widely. You can find cases where a test level pushes 600K polys at a steady 50 FPS, and you can find cases with loads of materials and overdraw and gameplay issues that runs 12K polys at 15FPS.

Luckily there are many tools in game that let you pull up stats and see exactly where your framerate is going as you run around a level, it's pretty easy to spot problem areas.



}}

Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636-9.html Polycount Message Board]

And heres some more fromthe same thread.  Lee Perry is one patient guy.

{{innerbox| &quot;The way it works is this... if you're looking through an anti-portal and you see a little corner of a wall mesh sticking out behind it, the whole wall mesh gets drawn. If you move so as the whole thing is out of view, obscured by the volume, the whole mesh isn't drawn. So making a complicated volume for this use will generally not make it work better, you're always going to be moving around and seeing things around corners. It's best to use the simplest shape to get the job done.&quot;

}}

==Static Meshes and Collision ==

Here's some more fascinating information taken from the UT Modelling thread over at polycount (Props to Lee Perry again :)).

{{innerbox| &quot;Collision for static meshes is specified in the editor. Bullets and line-trace effects will default to per-polygon no-fuss collision. Player collision will too, but it's a good idea to make a simplified version in editor to reduce this, it gets expensive when you've got 16 people running around your area. That's an easy task, BTW, even though it sounds like a drag, Karma will benefit from that step anyway.

 Karma collision *CAN* use per-poly collision, but it gets expensive quick. As with player collision, it's best to bring in your wall, build a relatively simplified BSP surface around it, and designate that as that object's collision. You only have to do that once. As you do that, every instance of that wall mesh throughout the level gains that same collision.&quot;

 Also, if that's not something you're jazzed about, or you've got something that should really just be a cylinder or a box, in the little mesh browser you can create a collision mesh with like 2 clicks. They're called DOPs, and essentially you tell it which of the simple shapes you want and it shrink wraps that primative to your object. It's very fast, very user friendly, and it speeds up player and karma collision calculation VASTLY. BSP shells generally are only resorted to if a DOP shape isn't really appropriate.

 By using these two collision techniques, there's really very few places you need to make any kind of blocking volumes.&quot;

}}

==Related Topics ==
* [[Legacy:Static Mesh|Static Mesh]] &amp;ndash; Definition &amp; basics
* [[Legacy:Static Mesh Modeling|Static Mesh Modeling]] &amp;ndash; creating your own
* [[Legacy:Static Mesh Package|Static Mesh Package]] &amp;ndash; listing of the default SM packages 
* [[Legacy:Hardware Brush|Hardware Brush]]

----

'''EntropicLqd:''' I've been thinking about this whole prefab thing and it occurs to me that in order to make effective use of the prefabs you will need to make your BSP/geometry corridors wider than you would expect.  Otherwise when you add your &quot;prefab wall&quot; the interior space within your corridor (or room) will be smaller than anticipated.  Some questions that could do with answering around this are:
* Do prefabs have a front and back (a side from which they are not visible)?  It would seem a sensible.
* Should prefabs be algined with world geometry, or, do they need to sit slightly in front of the BSP'd wall (like in UT when you have 2 add brushes in the same place you see texture tears).

'''Mychaeel:''' You certainly ''can'' make prefabs that don't have a back side, and to achieve a 3D effect, they'll have to sit a bit in front of a wall.

'''Aphex:''' I presume meshes are treated the same way as our old friends semi-solids (though probably without the bsp errors ;) so you dont need to align them with anything, and they are separate from the BSP.

----

'''EntropicLqd:''' I pity the poor bugger that winds up refactoring all this information.  I'd have a go but it scares me.

'''Flashman:''' Well sed Ent m8 :) btw: i'm currently making architecture that has no backfacing polys where I can guarantee there will be a wall/floor etc. It's just a matter of preference &amp; performance :) apart from probs with texture alignment (probably my MAX un1337ness) the seem to go in fine!

----

[[:Category:Legacy Mapping]]

[[Legacy:Refactor Me|Refactor me]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Built-In Struct</title>
    <id>660</id>
    <revision>
      <id>1944</id>
      <timestamp>2005-12-16T19:33:45Z</timestamp>
      <contributor>
        <ip>King Mango</ip>
      </contributor>
      <minor/>
      <comment>Asked question about ordering of vectors</comment>
      <text xml:space="preserve">These structs are declared in [[Legacy:Object|Object]] and can be used everywhere in [[Legacy:UT2003|UT2003]]'s [[Legacy:UnrealScript|UnrealScript]]. Many of these have [[Legacy:Operators|operators]] defined for them. 

See [[Legacy:Built-In Structs (UT)|Built-in Structs (UT)]] for the UT built-in structs.

==GUID ==

A globally unique identifier.

&lt;uscript&gt;
struct Guid
{
	var int A, B, C, D;
};
&lt;/uscript&gt;

==Vector ==

A point or direction vector in 3d space.

&lt;uscript&gt;
struct Vector
{
	var() config float X, Y, Z;
};
&lt;/uscript&gt;

See also [[Legacy:Vector|vector]], and [[Legacy:Useful Maths Functions|Useful Maths Functions]] for some useful vector assignment operators.

You can specify constant vectors in code by using &lt;code&gt;vect(x,y,z)&lt;/code&gt;, where x, y and z must be float literals, i.e. actual numbers.

==Plane (extends Vector) ==

A plane definition in 3D space. See [[Legacy:Plane|Plane]].

&lt;uscript&gt;
struct Plane extends Vector
{
	                       // inherited: normal vector X, Y, Z
	var() config float W;  // distance from origin
};
&lt;/uscript&gt;

This could also be used to describe a sphere: X, Y, Z is the location of the sphere's center and W is the radius.

==Rotator ==

An orthogonal rotation in 3d space. See [[Legacy:Rotator|Rotator]].

&lt;uscript&gt;
struct Rotator
{
	var() config int Pitch, Yaw, Roll;
};
&lt;/uscript&gt;

You can specify constant rotators in code by using &lt;code&gt;rot(pitch,yaw,roll)&lt;/code&gt;, where pitch yaw and roll must be integer literals, i.e. actual numbers.

'''KingMango''' Is there a reason Pitch, Yaw and Roll are out of order from where I always see them other places? Pitch, Roll, Yaw, which conveniently correspond alphabetically to X,Y and Z.

==Coords ==

An arbitrary coordinate system in 3d space.

&lt;uscript&gt;
struct Coords
{
	var() config vector Origin, XAxis, YAxis, ZAxis;
};
&lt;/uscript&gt;

==Quaternion ==

See [[Legacy:Quaternion|Quaternion]].

&lt;uscript&gt;
struct Quat
{
	var() config float X, Y, Z, W;
};
&lt;/uscript&gt;

==Range ==

Used to generate random values between Min and Max.

&lt;uscript&gt;
struct Range
{
	var() config float Min;
	var() config float Max;
};
&lt;/uscript&gt;

It seems you can specify constant ranges in code by using &lt;code&gt;rng(min,max)&lt;/code&gt;, where min and max must be float literals, i.e. actual numbers, but this causes a &quot;Bad expr token 35&quot; compiler crash in UT2003 v2225 and probably also earlier versions. It might be a feature in later engine versions.

==RangeVector ==

Vector of Ranges.

&lt;uscript&gt;
struct RangeVector
{
	var() config range X;
	var() config range Y;
	var() config range Z;
};
&lt;/uscript&gt;

==Scale ==

A scale and sheering.

&lt;uscript&gt;
struct Scale
{
	var() config vector Scale;
	var() config float SheerRate;
	var() config enum ESheerAxis
	{
		SHEER_None,
		SHEER_XY,
		SHEER_XZ,
		SHEER_YX,
		SHEER_YZ,
		SHEER_ZX,
		SHEER_ZY,
	} SheerAxis;
};
&lt;/uscript&gt;

==Color ==

An RGBA color.

&lt;uscript&gt;
struct Color
{
	var() config byte R, G, B;  // red, green, blue color components
	var() config byte A;        // alpha component
};
&lt;/uscript&gt;

See also the page on custom [[Legacy:Color Operators|Color Operators]].

Note that many functions and class variables don't use this struct for colours, eg [[Legacy:ZoneInfo|ZoneInfo]]'s ViewFog.

==Box ==

A bounding box. (Note the name change from UT: BoundingBox)

&lt;uscript&gt;
struct Box
{
	var vector Min, Max;
	var byte IsValid;
};
&lt;/uscript&gt;

==IntBox ==

&lt;uscript&gt;
struct IntBox
{
    var int X1, Y1, X2, Y2;
};
&lt;/uscript&gt;

==FloatBox ==

&lt;uscript&gt;
struct FloatBox
{
    var float X1, Y1, X2, Y2;
};
&lt;/uscript&gt;

==BoundingVolume (extends Box) ==

A bounding box sphere together.

&lt;uscript&gt;
struct BoundingVolume extends Box
{
	var plane Sphere;
};
&lt;/uscript&gt;

==Matrix ==

A 4x4 matrix.

&lt;uscript&gt;
struct Matrix
{
	var() Plane XPlane;
	var() Plane YPlane;
	var() Plane ZPlane;
	var() Plane WPlane;
};
&lt;/uscript&gt;

==InterpCurvePoint ==

A single interpolation point used in the InterpCurve struct.  It maps an input value to a particular output value.  See InterpCurve below for more details.

&lt;uscript&gt;
struct InterpCurvePoint
{
	var() float InVal;
	var() float OutVal;
};
&lt;/uscript&gt;

==InterpCurve ==

A struct which holds output values for a set of input values.  The array which is formed is used to query for an interpolated output value for any input value. See [[Legacy:Global Function|Global Function]]s InterpCurveEval, InterpCurveGetOutputRange, and InterpCurveGetInputDomain for more details.

&lt;uscript&gt;
struct InterpCurve
{
	var() array&lt;InterpCurvePoint&gt;	Points;
};
&lt;/uscript&gt;

==CompressedPosition ==

&lt;uscript&gt;
struct CompressedPosition
{
	var vector Location;
	var rotator Rotation;
	var vector Velocity;
};
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Variable Type|Variable Type]] &amp;ndash; covers how to define structs 
* [[Legacy:Object|Object]] class
* [[Legacy:Operators|Operators]]</text>
    </revision>
    <revision>
      <id>1945</id>
      <timestamp>2005-04-04T09:24:50Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">These structs are declared in [[Legacy:Object|Object]] and can be used everywhere in [[Legacy:UT2003|UT2003]]'s [[Legacy:UnrealScript|UnrealScript]]. Many of these have [[Legacy:Operators|operators]] defined for them.

See [[Legacy:Built-In Structs (UT)|Built-in Structs (UT)]] for the UT built-in structs.

==GUID ==

A globally unique identifier.

&lt;uscript&gt;
struct Guid
{
	var int A, B, C, D;
};
&lt;/uscript&gt;

==Vector ==

A point or direction vector in 3d space.

&lt;uscript&gt;
struct Vector
{
	var() config float X, Y, Z;
};
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for some useful vector assignment operators.

You can specify constant vectors in code by using &lt;code&gt;vect(x,y,z)&lt;/code&gt;, where x, y and z must be float literals, i.e. actual numbers.

==Plane (extends Vector) ==

A plane definition in 3D space. See [[Legacy:Plane|Plane]].

&lt;uscript&gt;
struct Plane extends Vector
{
	                       // inherited: normal vector X, Y, Z
	var() config float W;  // distance from origin
};
&lt;/uscript&gt;

This could also be used to describe a sphere: X, Y, Z is the location of the sphere's center and W is the radius.

==Rotator ==

An orthogonal rotation in 3d space. See [[Legacy:Rotator|Rotator]].

&lt;uscript&gt;
struct Rotator
{
	var() config int Pitch, Yaw, Roll;
};
&lt;/uscript&gt;

You can specify constant rotators in code by using &lt;code&gt;rot(pitch,yaw,roll)&lt;/code&gt;, where pitch yaw and roll must be integer literals, i.e. actual numbers.

==Coords ==

An arbitrary coordinate system in 3d space.

&lt;uscript&gt;
struct Coords
{
	var() config vector Origin, XAxis, YAxis, ZAxis;
};
&lt;/uscript&gt;

==Quaternion ==

See [[Legacy:Quaternion|Quaternion]].

&lt;uscript&gt;
struct Quat
{
	var() config float X, Y, Z, W;
};
&lt;/uscript&gt;

==Range ==

Used to generate random values between Min and Max.

&lt;uscript&gt;
struct Range
{
	var() config float Min;
	var() config float Max;
};
&lt;/uscript&gt;

It seems you can specify constant ranges in code by using &lt;code&gt;rng(min,max)&lt;/code&gt;, where min and max must be float literals, i.e. actual numbers, but this causes a &quot;Bad expr token 35&quot; compiler crash in UT2003 v2225 and probably also earlier versions. It might be a feature in later engine versions.

==RangeVector ==

Vector of Ranges.

&lt;uscript&gt;
struct RangeVector
{
	var() config range X;
	var() config range Y;
	var() config range Z;
};
&lt;/uscript&gt;

==Scale ==

A scale and sheering.

&lt;uscript&gt;
struct Scale
{
	var() config vector Scale;
	var() config float SheerRate;
	var() config enum ESheerAxis
	{
		SHEER_None,
		SHEER_XY,
		SHEER_XZ,
		SHEER_YX,
		SHEER_YZ,
		SHEER_ZX,
		SHEER_ZY,
	} SheerAxis;
};
&lt;/uscript&gt;

==Color ==

An RGBA color.

&lt;uscript&gt;
struct Color
{
	var() config byte R, G, B;  // red, green, blue color components
	var() config byte A;        // alpha component
};
&lt;/uscript&gt;

See also the page on custom [[Legacy:Color Operators|Color Operators]].

Note that many functions and class variables don't use this struct for colours, eg [[Legacy:ZoneInfo|ZoneInfo]]'s ViewFog.

==Box ==

A bounding box. (Note the name change from UT: BoundingBox)

&lt;uscript&gt;
struct Box
{
	var vector Min, Max;
	var byte IsValid;
};
&lt;/uscript&gt;

==IntBox ==

&lt;uscript&gt;
struct IntBox
{
    var int X1, Y1, X2, Y2;
};
&lt;/uscript&gt;

==FloatBox ==

&lt;uscript&gt;
struct FloatBox
{
    var float X1, Y1, X2, Y2;
};
&lt;/uscript&gt;

==BoundingVolume (extends Box) ==

A bounding box sphere together.

&lt;uscript&gt;
struct BoundingVolume extends Box
{
	var plane Sphere;
};
&lt;/uscript&gt;

==Matrix ==

A 4x4 matrix.

&lt;uscript&gt;
struct Matrix
{
	var() Plane XPlane;
	var() Plane YPlane;
	var() Plane ZPlane;
	var() Plane WPlane;
};
&lt;/uscript&gt;

==InterpCurvePoint ==

A single interpolation point used in the InterpCurve struct.  It maps an input value to a particular output value.  See InterpCurve below for more details.

&lt;uscript&gt;
struct InterpCurvePoint
{
	var() float InVal;
	var() float OutVal;
};
&lt;/uscript&gt;

==InterpCurve ==

A struct which holds output values for a set of input values.  The array which is formed is used to query for an interpolated output value for any input value. See [[Legacy:Global Function|Global Function]]s InterpCurveEval, InterpCurveGetOutputRange, and InterpCurveGetInputDomain for more details.

&lt;uscript&gt;
struct InterpCurve
{
	var() array&lt;InterpCurvePoint&gt;	Points;
};
&lt;/uscript&gt;

==CompressedPosition ==

&lt;uscript&gt;
struct CompressedPosition
{
	var vector Location;
	var rotator Rotation;
	var vector Velocity;
};
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Object|Object]] class
* [[Legacy:Operators|Operators]]</text>
    </revision>
    <revision>
      <id>1946</id>
      <timestamp>2005-08-15T14:58:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">These structs are declared in [[Legacy:Object|Object]] and can be used everywhere in [[Legacy:UT2003|UT2003]]'s [[Legacy:UnrealScript|UnrealScript]]. Many of these have [[Legacy:Operators|operators]] defined for them. 

See [[Legacy:Built-In Structs (UT)|Built-in Structs (UT)]] for the UT built-in structs.

==GUID ==

A globally unique identifier.

&lt;uscript&gt;
struct Guid
{
	var int A, B, C, D;
};
&lt;/uscript&gt;

==Vector ==

A point or direction vector in 3d space.

&lt;uscript&gt;
struct Vector
{
	var() config float X, Y, Z;
};
&lt;/uscript&gt;

See also [[Legacy:Vector|vector]], and [[Legacy:Useful Maths Functions|Useful Maths Functions]] for some useful vector assignment operators.

You can specify constant vectors in code by using &lt;code&gt;vect(x,y,z)&lt;/code&gt;, where x, y and z must be float literals, i.e. actual numbers.

==Plane (extends Vector) ==

A plane definition in 3D space. See [[Legacy:Plane|Plane]].

&lt;uscript&gt;
struct Plane extends Vector
{
	                       // inherited: normal vector X, Y, Z
	var() config float W;  // distance from origin
};
&lt;/uscript&gt;

This could also be used to describe a sphere: X, Y, Z is the location of the sphere's center and W is the radius.

==Rotator ==

An orthogonal rotation in 3d space. See [[Legacy:Rotator|Rotator]].

&lt;uscript&gt;
struct Rotator
{
	var() config int Pitch, Yaw, Roll;
};
&lt;/uscript&gt;

You can specify constant rotators in code by using &lt;code&gt;rot(pitch,yaw,roll)&lt;/code&gt;, where pitch yaw and roll must be integer literals, i.e. actual numbers.

==Coords ==

An arbitrary coordinate system in 3d space.

&lt;uscript&gt;
struct Coords
{
	var() config vector Origin, XAxis, YAxis, ZAxis;
};
&lt;/uscript&gt;

==Quaternion ==

See [[Legacy:Quaternion|Quaternion]].

&lt;uscript&gt;
struct Quat
{
	var() config float X, Y, Z, W;
};
&lt;/uscript&gt;

==Range ==

Used to generate random values between Min and Max.

&lt;uscript&gt;
struct Range
{
	var() config float Min;
	var() config float Max;
};
&lt;/uscript&gt;

It seems you can specify constant ranges in code by using &lt;code&gt;rng(min,max)&lt;/code&gt;, where min and max must be float literals, i.e. actual numbers, but this causes a &quot;Bad expr token 35&quot; compiler crash in UT2003 v2225 and probably also earlier versions. It might be a feature in later engine versions.

==RangeVector ==

Vector of Ranges.

&lt;uscript&gt;
struct RangeVector
{
	var() config range X;
	var() config range Y;
	var() config range Z;
};
&lt;/uscript&gt;

==Scale ==

A scale and sheering.

&lt;uscript&gt;
struct Scale
{
	var() config vector Scale;
	var() config float SheerRate;
	var() config enum ESheerAxis
	{
		SHEER_None,
		SHEER_XY,
		SHEER_XZ,
		SHEER_YX,
		SHEER_YZ,
		SHEER_ZX,
		SHEER_ZY,
	} SheerAxis;
};
&lt;/uscript&gt;

==Color ==

An RGBA color.

&lt;uscript&gt;
struct Color
{
	var() config byte R, G, B;  // red, green, blue color components
	var() config byte A;        // alpha component
};
&lt;/uscript&gt;

See also the page on custom [[Legacy:Color Operators|Color Operators]].

Note that many functions and class variables don't use this struct for colours, eg [[Legacy:ZoneInfo|ZoneInfo]]'s ViewFog.

==Box ==

A bounding box. (Note the name change from UT: BoundingBox)

&lt;uscript&gt;
struct Box
{
	var vector Min, Max;
	var byte IsValid;
};
&lt;/uscript&gt;

==IntBox ==

&lt;uscript&gt;
struct IntBox
{
    var int X1, Y1, X2, Y2;
};
&lt;/uscript&gt;

==FloatBox ==

&lt;uscript&gt;
struct FloatBox
{
    var float X1, Y1, X2, Y2;
};
&lt;/uscript&gt;

==BoundingVolume (extends Box) ==

A bounding box sphere together.

&lt;uscript&gt;
struct BoundingVolume extends Box
{
	var plane Sphere;
};
&lt;/uscript&gt;

==Matrix ==

A 4x4 matrix.

&lt;uscript&gt;
struct Matrix
{
	var() Plane XPlane;
	var() Plane YPlane;
	var() Plane ZPlane;
	var() Plane WPlane;
};
&lt;/uscript&gt;

==InterpCurvePoint ==

A single interpolation point used in the InterpCurve struct.  It maps an input value to a particular output value.  See InterpCurve below for more details.

&lt;uscript&gt;
struct InterpCurvePoint
{
	var() float InVal;
	var() float OutVal;
};
&lt;/uscript&gt;

==InterpCurve ==

A struct which holds output values for a set of input values.  The array which is formed is used to query for an interpolated output value for any input value. See [[Legacy:Global Function|Global Function]]s InterpCurveEval, InterpCurveGetOutputRange, and InterpCurveGetInputDomain for more details.

&lt;uscript&gt;
struct InterpCurve
{
	var() array&lt;InterpCurvePoint&gt;	Points;
};
&lt;/uscript&gt;

==CompressedPosition ==

&lt;uscript&gt;
struct CompressedPosition
{
	var vector Location;
	var rotator Rotation;
	var vector Velocity;
};
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Variable Type|Variable Type]] &amp;ndash; covers how to define structs 
* [[Legacy:Object|Object]] class
* [[Legacy:Operators|Operators]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Built-In Structs (UT)</title>
    <id>576</id>
    <revision>
      <id>1761</id>
      <timestamp>2008-02-12T12:25:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added to category</comment>
      <text xml:space="preserve">These structs are declared in [[Legacy:Object|Object]] and can be used everywhere in [[Legacy:UT|UT]]'s UnrealScript.  Many of these have [[Legacy:Operators|operators]] defined for them.

See [[Legacy:Built-In Struct|Built-In Struct]] for the UT2003 built-in structs.

===GUID ===

A globally unique identifier.

&lt;uscript&gt;
struct Guid
{
	var int A, B, C, D;
};
&lt;/uscript&gt;

===Vector ===

A point or direction vector in 3d space.

&lt;uscript&gt;
struct Vector
{
	var() config float X, Y, Z;
};
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for some useful vector assignment operators.

===Plane (extends Vector) ===

A plane definition in 3D space. See [[Legacy:Plane|Plane]].

&lt;uscript&gt;
struct Plane extends Vector
{
	                       // inherited: normal vector X, Y, Z
	var() config float W;  // distance from origin
};
&lt;/uscript&gt;

This could also be used to describe a sphere: X, Y, Z is the location of the sphere's center and W is the radius.

===Rotator ===

An orthogonal rotation in 3d space. See [[Legacy:Rotator|Rotator]].

&lt;uscript&gt;
struct Rotator
{
	var() config int Pitch, Yaw, Roll;
};
&lt;/uscript&gt;

===Coords ===

An arbitrary coordinate system in 3d space.

&lt;uscript&gt;
struct Coords
{
	var() config vector Origin, XAxis, YAxis, ZAxis;
};
&lt;/uscript&gt;

===Scale ===

A scale and sheering.

&lt;uscript&gt;
struct Scale
{
	var() config vector Scale;
	var() config float SheerRate;
	var() config enum ESheerAxis
	{
		SHEER_None,
		SHEER_XY,
		SHEER_XZ,
		SHEER_YX,
		SHEER_YZ,
		SHEER_ZX,
		SHEER_ZY,
	} SheerAxis;
};
&lt;/uscript&gt;

===Color ===

An RGB color.

&lt;uscript&gt;
struct Color
{
	var() config byte R, G, B;  // red, green, blue color components
	var() config byte A;        // alpha component
};
&lt;/uscript&gt;

See also the page on custom [[Legacy:Color Operators|Color Operators]].

Note that many functions and class variables don't use this struct for colours, eg [[Legacy:ZoneInfo|ZoneInfo]]'s ViewFog.

===BoundingBox ===

A bounding box.

&lt;uscript&gt;
struct BoundingBox
{
	var vector Min, Max;
	var byte IsValid;
};
&lt;/uscript&gt;

===BoundingVolume ===

A bounding box sphere together.

&lt;uscript&gt;
struct BoundingVolume extends BoundingBox
{
	var plane Sphere;
};
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Object|Object]] class
* [[Legacy:Operators|Operators]]

[[Category:Legacy Struct|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1762</id>
      <timestamp>2002-11-09T20:02:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">These structs are declared in [[Legacy:Object|Object]] and can be used everywhere in [[Legacy:UT|UT]]'s UnrealScript.

Many of these have [[Legacy:Operators|operators]] defined for them.

===GUID ===

A globally unique identifier.

&lt;uscript&gt;
struct Guid
{
	var int A, B, C, D;
};
&lt;/uscript&gt;

===Vector ===

A point or direction vector in 3d space.

&lt;uscript&gt;
struct Vector
{
	var() config float X, Y, Z;
};
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for some useful vector assignment operators.

===Plane (extends Vector) ===

A plane definition in 3D space.

&lt;uscript&gt;
struct Plane extends Vector
{
	                       // inherited: normal vector X, Y, Z
	var() config float W;  // distance from origin
};
&lt;/uscript&gt;

This could also be used to describe a sphere: X, Y, Z is the location of the sphere's center and W is the radius.

===Rotator ===

An orthogonal rotation in 3d space. See [[Legacy:Rotator|Rotator]].

&lt;uscript&gt;
struct Rotator
{
	var() config int Pitch, Yaw, Roll;
};
&lt;/uscript&gt;

===Coords ===

An arbitrary coordinate system in 3d space.

&lt;uscript&gt;
struct Coords
{
	var() config vector Origin, XAxis, YAxis, ZAxis;
};
&lt;/uscript&gt;

===Scale ===

A scale and sheering.

&lt;uscript&gt;
struct Scale
{
	var() config vector Scale;
	var() config float SheerRate;
	var() config enum ESheerAxis
	{
		SHEER_None,
		SHEER_XY,
		SHEER_XZ,
		SHEER_YX,
		SHEER_YZ,
		SHEER_ZX,
		SHEER_ZY,
	} SheerAxis;
};
&lt;/uscript&gt;

===Color ===

An RGB color.

&lt;uscript&gt;
struct Color
{
	var() config byte R, G, B;  // red, green, blue color components
	var() config byte A;        // alpha component
};
&lt;/uscript&gt;

See also the page on custom [[Legacy:Color Operators|Color Operators]].

Note that many functions and class variables don't use this struct for colours, eg [[Legacy:ZoneInfo|ZoneInfo]]'s ViewFog.

===BoundingBox ===

A bounding box.

&lt;uscript&gt;
struct BoundingBox
{
	var vector Min, Max;
	var byte IsValid;
};
&lt;/uscript&gt;

===BoundingVolume ===

A bounding box sphere together.

&lt;uscript&gt;
struct BoundingVolume extends BoundingBox
{
	var plane Sphere;
};
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Object|Object]] class
* [[Legacy:Built-In Struct|Built-In Struct]] (UT2003)
* [[Legacy:Operators|Operators]]</text>
    </revision>
    <revision>
      <id>1763</id>
      <timestamp>2003-08-20T13:47:03Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>Moved UT2003 link.  Added [[plane]] link.</comment>
      <text xml:space="preserve">These structs are declared in [[Legacy:Object|Object]] and can be used everywhere in [[Legacy:UT|UT]]'s UnrealScript.  Many of these have [[Legacy:Operators|operators]] defined for them.

See [[Legacy:Built-In Struct|Built-In Struct]] for the UT2003 built-in structs.

===GUID ===

A globally unique identifier.

&lt;uscript&gt;
struct Guid
{
	var int A, B, C, D;
};
&lt;/uscript&gt;

===Vector ===

A point or direction vector in 3d space.

&lt;uscript&gt;
struct Vector
{
	var() config float X, Y, Z;
};
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for some useful vector assignment operators.

===Plane (extends Vector) ===

A plane definition in 3D space. See [[Legacy:Plane|Plane]].

&lt;uscript&gt;
struct Plane extends Vector
{
	                       // inherited: normal vector X, Y, Z
	var() config float W;  // distance from origin
};
&lt;/uscript&gt;

This could also be used to describe a sphere: X, Y, Z is the location of the sphere's center and W is the radius.

===Rotator ===

An orthogonal rotation in 3d space. See [[Legacy:Rotator|Rotator]].

&lt;uscript&gt;
struct Rotator
{
	var() config int Pitch, Yaw, Roll;
};
&lt;/uscript&gt;

===Coords ===

An arbitrary coordinate system in 3d space.

&lt;uscript&gt;
struct Coords
{
	var() config vector Origin, XAxis, YAxis, ZAxis;
};
&lt;/uscript&gt;

===Scale ===

A scale and sheering.

&lt;uscript&gt;
struct Scale
{
	var() config vector Scale;
	var() config float SheerRate;
	var() config enum ESheerAxis
	{
		SHEER_None,
		SHEER_XY,
		SHEER_XZ,
		SHEER_YX,
		SHEER_YZ,
		SHEER_ZX,
		SHEER_ZY,
	} SheerAxis;
};
&lt;/uscript&gt;

===Color ===

An RGB color.

&lt;uscript&gt;
struct Color
{
	var() config byte R, G, B;  // red, green, blue color components
	var() config byte A;        // alpha component
};
&lt;/uscript&gt;

See also the page on custom [[Legacy:Color Operators|Color Operators]].

Note that many functions and class variables don't use this struct for colours, eg [[Legacy:ZoneInfo|ZoneInfo]]'s ViewFog.

===BoundingBox ===

A bounding box.

&lt;uscript&gt;
struct BoundingBox
{
	var vector Min, Max;
	var byte IsValid;
};
&lt;/uscript&gt;

===BoundingVolume ===

A bounding box sphere together.

&lt;uscript&gt;
struct BoundingVolume extends BoundingBox
{
	var plane Sphere;
};
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Object|Object]] class
* [[Legacy:Operators|Operators]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bulldog</title>
    <id>586</id>
    <revision>
      <id>1783</id>
      <timestamp>2006-02-20T10:51:10Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; Bulldog (Package: Vehicles)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; Bulldog (Package: Vehicles)}}

This is the first vehicle included with an Unreal gametype.  It was introduced in UT2003, but was only available as a test map, &quot;VehicleDemo&quot;.  This is a Karma based vehicle (KVehicle).  It is equipped with a homing rocket launcher.

'''Note:''' As the bulldog is not an [[Legacy:ONSVehicle|ONSVehicle]] or [[Legacy:ASVehicle|ASVehicle]] class, the UT2004 version does not contain the proper code to navigate.  While you are able to spawn a Bulldog from other Vehicle Factories and enter it, players will be unable to drive it or fire its weapon without custom modification.  See '''UT2004 Bulldog Fix''' below.

==Properties==

===Main===
; float FireInterval :
; float TargettingInterval :
; vector RocketFireOffset : Position (car ref frame) that rockets are launched from.
; float TargettingRange :
; Material TargetMaterial :
; vector HeadlightCoronaOffset[8] :
; float TriggerSpeedThresh : Maximum speed at which you can get in the vehicle.

====Wheel Slip and Dust====
; float	DustSlipRate :  Ratio between dust kicked up and amount wheels are slipping.
; float DustSlipThresh :

====Bulldog Sounds====
; float EnginePitchScale :
; sound BulldogStartSound :
; sound BulldogIdleSound :
; float HitSoundThreshold :
; sound BulldogSquealSound :
; float SquealVelThresh :
; sound BulldogHitSound :

====Bulldog Forces====
; string BulldogStartForce :
; string BulldogIdleForce :
; string BulldogSquealForce :
; string BulldogHitForce :

====Destroyed Bulldog====
; class&lt;Actor&gt; DestroyedEffect :
; sound DestroyedSound :

===Hidden===
; float	UntilNextImpact : Used to prevent triggering sounds continuously.
; float	DustDrop : Distance below centre of tire to place dust.

====Bulldog Triggers====
; vector FrontTriggerOffset (const) :
; BulldogTrigger FLTrigger :
; BulldogTrigger FRTrigger :
; BulldogTrigger FlipTrigger :
; bool TriggerState : true for on, false for off.
; bool FlipTriggerState :

====Headlight Projector====
; vector HeadlightOffset (const) :
; BulldogHeadlight Headlight :
; bool HeadlightOn :

====Light Materials====
; Material ReverseMaterial :
; Material BrakeMaterial :
; Material TailOffMaterial :
; Material HeadlightOnMaterial :
; Material HeadlightOffMaterial :
; BulldogHeadlightCorona HeadlightCorona[8] :

====Wheel Dirt Emitter====
; BulldogDust Dust[4] : ''FL, FR, RL, RR''

====Weapon====
; float FireCountdown :
; float SinceLastTargetting :
; [[Legacy:Pawn|Pawn]] CurrentTarget :

==Functions==

(incomplete)

==Events==

==UT2004 Bulldog Fix==

The Bulldog in UT2004 is broken for a number of reasons; in part due to a move of KVehicle from a subclass of Pawn to a subclass of Vehicle, but also due to other changes that enable Vehicle support in UT2004.

===Source Code===

To fix it, you'll need to [[Legacy:Create A Subclass|Create A Subclass]] of the Bulldog, ModifiedBulldog, and use this custom code.  For a tutorial on using custom code, see [[Legacy:Mapping Hello World|Mapping Hello World]].  ('''Note:''' If you use the Script Editor to compile this code, omit the ''defaultProperties'' block and set those manually for each class.)

&lt;uscript&gt;
//=============================================================================
// ModifiedBulldog.
// Uses Vehicle.KDriverEnter() instead of KVehicle.KDriverEnter(), etc.
// by SuperApe -- Dec 2005
//=============================================================================
class ModifiedBulldog extends Bulldog
	placeable;

var(Bulldog) sound     BulldogShutDownSound;

function Timer()
{
	// Finished start sound
	AmbientSound = BulldogIdleSound;
}

function KDriverEnter( Pawn P )
{
	local Controller C;


	AmbientSound = BulldogStartSound;
	SetTimer( 1.0, false );

	bDriving = True;
	StuckCount = 0;

	// We don't have pre-defined exit positions here, so we use the original player location as an exit point
	if ( !bRelativeExitPos )
	{
		PlayerEnterredRotation = P.Rotation;
		ExitPositions[0] =  P.Location + Vect(0,0,16);
	}

	// Set pawns current controller to control the vehicle pawn instead
	C = P.Controller;
	if ( !bCanCarryFlag &amp;&amp; ( C.PlayerReplicationInfo.HasFlag != None )  )
		P.DropFlag();

	Driver = P;
	Driver.StartDriving( Self );

	// Disconnect PlayerController from Driver and connect to SVehicle.
	C.bVehicleTransition = true; // to keep Bots from doing Restart()
	C.Unpossess();
	Driver.SetOwner( self ); // This keeps the driver relevant.
	C.Possess( self );
	C.bVehicleTransition = false;

	DrivingStatusChanged();

	if ( PlayerController( C ) != None )
		VehicleLostTime = 0;

	AttachFlag( PlayerReplicationInfo.HasFlag );

	Level.Game.DriverEnteredVehicle( self, P );

	ReceiveLocalizedMessage( class'Vehicles.BulldogMessage', 1 );
}

event bool KDriverLeave( bool bForceLeave )
{
	local Controller C;
	local PlayerController	PC;
	local bool havePlaced;
	local Pawn	OldDriver;
	local	int 	i;

	if( !bForceLeave &amp;&amp; !Level.Game.CanLeaveVehicle(self, Driver) )
		return false;

	if ( (PlayerReplicationInfo != None) &amp;&amp; (PlayerReplicationInfo.HasFlag != None) )
		Driver.HoldFlag(PlayerReplicationInfo.HasFlag);

	// Do nothing if we're not being driven
	if (Controller == None )
		return false;

	// Before we can exit, we need to find a place to put the driver.
	// Iterate over array of possible exit locations.

	if ( (Driver != None) &amp;&amp; (!bRemoteControlled || bHideRemoteDriver) )
    {
	    Driver.bHardAttach = false;
	    Driver.bCollideWorld = true;
	    Driver.SetCollision(true, true);
	    havePlaced = PlaceExitingDriver();

	    // If we could not find a place to put the driver, leave driver inside as before.
	    if (!havePlaced &amp;&amp; !bForceLeave )
	    {
	        Driver.bHardAttach = true;
	        Driver.bCollideWorld = false;
	        Driver.SetCollision(false, false);
	        return false;
	    }
	}

	bDriving = False;

	// Turn off bulldog headlights
	Headlight.DetachProjector();
	Skins[2] = HeadlightOffMaterial;
	for(i=0; i&lt;8; i++)
		HeadlightCorona[i].bHidden = true;

	// Reconnect Controller to Driver.
	C = Controller;
	if (C.RouteGoal == self)
		C.RouteGoal = None;
	if (C.MoveTarget == self)
		C.MoveTarget = None;
	C.bVehicleTransition = true;
	Controller.UnPossess();

	if ( (Driver != None) &amp;&amp; (Driver.Health &gt; 0) )
	{
		Driver.SetOwner( C );
		C.Possess( Driver );

		PC = PlayerController(C);
		if ( PC != None )
			PC.ClientSetViewTarget( Driver ); // Set playercontroller to view the person that got out

		Driver.StopDriving( Self );
	}
	C.bVehicleTransition = false;

	if ( C == Controller )	// If controller didn't change, clear it...
		Controller = None;

	Level.Game.DriverLeftVehicle(self, Driver);

	// Car now has no driver
	OldDriver = Driver;
	Driver = None;

	DriverLeft();

	// Put brakes on before you get out :)
    Throttle	= 0;
    Steering	= 0;
	Rise		= 0;

	PlaySound( BulldogShutDownSound, SLOT_Misc );

	// If we succesfully got out of the car, make driver visible again.
	OldDriver.bHidden = false;
	AmbientSound = None;
	return true;
}

function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation,
						Vector Momentum, class&lt;DamageType&gt; DamageType)
{
	Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

	KAddImpulse( Momentum, HitLocation);
}

defaultproperties
{
     DestroyedEffect=Class'myLevel.DECO_DestroyedBulldog'
     DestroyedSound=Sound'ONSVehicleSounds-S.Explosions.VehicleExplosion01'
     BulldogShutDownSound=Sound'ONSVehicleSounds-S.PRV.PRVStop01'
     BulldogStartSound=Sound'ONSVehicleSounds-S.PRV.PRVStart01'
     BulldogIdleSound=Sound'ONSVehicleSounds-S.RV.RVEng01'
     BulldogSquealSound=Sound'ONSVehicleSounds-S.PRV.DirtSkid03'
     BulldogHitSound=Sound'ONSVehicleSounds-S.CollisionSounds.VehicleCollision04'
     HornSounds(0)=Sound'ONSVehicleSounds-S.Horns.Horn03'
     bDontPossess=False
     Begin Object Class=KarmaParamsRBFull Name=KarmaParamsRBFull1
         KInertiaTensor(0)=20.000000
         KInertiaTensor(3)=30.000000
         KInertiaTensor(5)=48.000000
         KCOMOffset=(X=0.800000,Z=-0.700000)
         KLinearDamping=0.000000
         KAngularDamping=0.000000
         KStartEnabled=True
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=True
         KFriction=1.600000
     End Object
     KParams=KarmaParamsRBFull'myLevel.KarmaParamsRBFull1'
}
&lt;/uscript&gt;

This ModifiedBulldog uses a static mesh as a Destroyed Vehicle mesh.  It's a subclass of Decoration -&gt; DECO_Smashable.  Here's it's code:

&lt;uscript&gt;
//=============================================================================
// DECO_DestroyedBulldog.
//=============================================================================
class DECO_DestroyedBulldog extends DECO_Smashable
	placeable;

defaultproperties
{
     EffectWhenDestroyed=Class'XEffects.RocketExplosion'
     Health=100
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'BulldogMeshes.Simple.S_Chassis'
     Physics=PHYS_Falling
     LifeSpan=5.000000
     DrawScale=0.400000
     Skins(0)=Texture'AS_Vehicles_TX.IonPlasmaTank.IonTankBodyDEAD'
}
&lt;/uscript&gt;

===ModifiedBulldog Notes===

&lt;u&gt;Things that work&lt;/u&gt;:
* You can get in and out of the Bulldog and other vehicles.
* You can hear the horn, startup, idle and shutdown sounds (borrowed heavily from ONS vehicles)
* The destroyed Bulldog shows a mesh, not just a RocketExplosion effect.
* Headlights come on when driving, go off when not.
* All normal drivability and [[Legacy:BulldogRocket|BulldogRocket]] turret functionality, including homing rockets to vehicles or players with hud display on lock. 

&lt;u&gt;Things that don't work&lt;/u&gt;:
* If you jump out and the Bulldog keeps rolling (it has no parking brake without a driver, ATM) you loose the [[Legacy:BulldogTrigger|BulldogTrigger]]s that enable you to get back in.
* The Deco_DestroyedBulldog mesh doesn't quite fall and hit the ground like it should, the tires simply disappear and there's no neat explosion or smoke.
* The Bulldog &quot;dust&quot; and &quot;rocks&quot; trail behind the bulldog no matter what terrain (or BSP) it's on. (should probably take the level's dust color property)

===Technical Notes===

The code for KVehicle, KCar and Bulldog is exactly the same as in UT2003, but it was it's interaction with Vehicle and [[Legacy:Controller|Controller]] code that seemed to cause problems.  The main things that were breaking the Bulldog were KVehicle.KDriverEnter() and KVehicles.KDriverLeave(), although there were many disabled things in the Bulldog code like sounds and the KAddImpulse when it gets hit.

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic for Vehicles
* [[Legacy:KVehicleFactory|KVehicleFactory]] &amp;ndash; Vehicle Factory for KVehicles
** [[Legacy:BulldogFactory|BulldogFactory]] &amp;ndash; KVehicleFactory that spawns Bulldogs
* [[Legacy:Karma|Karma]] &amp;ndash; Main topic for Karma
* [[Legacy:BulldogRocket|BulldogRocket]]
* [[Legacy:Modifying The Bulldog|Modifying the Bulldog]]
* [[Legacy:Bulldog Player|Bulldog Player]] &amp;ndash; Mod to have players spawn as a bulldog
* [[Legacy:Mod Ideas/Mini Bulldogs|Mod Ideas/Mini Bulldogs]]

==Discussion==

'''SuperApe:''' I've been curious about this since UT2004 came out.  Although, this just reminds me how badly the Bulldog handles; bad shocks that flop around and the momentum keeps the front tires from gripping enough to steer well.  I'm still not sure exactly what part of those KVehicle functions broke it.  Any thoughts on this are welcome here in the Discussion section.  I will update the source code when we know more.

'''DaWrecka:''' On the subject of Bulldog handling, I did play around with this some in UT2003...While I stress I've NOT tried this with UT2004, in 2k3 I found cranking up the KActorGravScale of the Bulldog's KParams actually made it handle more-or-less as you would expect a jeep-thing to handle. A value of 3 worked nicely. That's assuming the level was in normal gravity of course...Reduced level gravity would bollocks the whole thing up just like normal.

'''Sweavo:''' I wonder whether a better idea is to steal the hellbender code and re-mesh it as a bulldog...  Not that I'll get time to do that but there we go.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1784</id>
      <timestamp>2006-02-20T02:16:21Z</timestamp>
      <contributor>
        <ip>DaWrecka</ip>
      </contributor>
      <minor/>
      <comment>* Added to discussion</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; Bulldog (Package: Vehicles)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; Bulldog (Package: Vehicles)}}

This is the first vehicle included with an Unreal gametype.  It was introduced in UT2003, but was only available as a test map, &quot;VehicleDemo&quot;.  This is a Karma based vehicle (KVehicle).  It is equipped with a homing rocket launcher.

'''Note:''' As the bulldog is not an [[Legacy:ONSVehicle|ONSVehicle]] or [[Legacy:ASVehicle|ASVehicle]] class, the UT2004 version does not contain the proper code to navigate.  While you are able to spawn a Bulldog from other Vehicle Factories and enter it, players will be unable to drive it or fire its weapon without custom modification.  See '''UT2004 Bulldog Fix''' below.

==Properties==

===Main===
; float FireInterval :
; float TargettingInterval :
; vector RocketFireOffset : Position (car ref frame) that rockets are launched from.
; float TargettingRange :
; Material TargetMaterial :
; vector HeadlightCoronaOffset[8] :
; float TriggerSpeedThresh : Maximum speed at which you can get in the vehicle.

====Wheel Slip and Dust====
; float	DustSlipRate :  Ratio between dust kicked up and amount wheels are slipping.
; float DustSlipThresh :

====Bulldog Sounds====
; float EnginePitchScale :
; sound BulldogStartSound :
; sound BulldogIdleSound :
; float HitSoundThreshold :
; sound BulldogSquealSound :
; float SquealVelThresh :
; sound BulldogHitSound :

====Bulldog Forces====
; string BulldogStartForce :
; string BulldogIdleForce :
; string BulldogSquealForce :
; string BulldogHitForce :

====Destroyed Bulldog====
; class&lt;Actor&gt; DestroyedEffect :
; sound DestroyedSound :

===Hidden===
; float	UntilNextImpact : Used to prevent triggering sounds continuously.
; float	DustDrop : Distance below centre of tire to place dust.

====Bulldog Triggers====
; vector FrontTriggerOffset (const) :
; BulldogTrigger FLTrigger :
; BulldogTrigger FRTrigger :
; BulldogTrigger FlipTrigger :
; bool TriggerState : true for on, false for off.
; bool FlipTriggerState :

====Headlight Projector====
; vector HeadlightOffset (const) :
; BulldogHeadlight Headlight :
; bool HeadlightOn :

====Light Materials====
; Material ReverseMaterial :
; Material BrakeMaterial :
; Material TailOffMaterial :
; Material HeadlightOnMaterial :
; Material HeadlightOffMaterial :
; BulldogHeadlightCorona HeadlightCorona[8] :

====Wheel Dirt Emitter====
; BulldogDust Dust[4] : ''FL, FR, RL, RR''

====Weapon====
; float FireCountdown :
; float SinceLastTargetting :
; [[Legacy:Pawn|Pawn]] CurrentTarget :

==Functions==

(incomplete)

==Events==

==UT2004 Bulldog Fix==

The Bulldog in UT2004 is broken for a number of reasons; in part due to a move of KVehicle from a subclass of Pawn to a subclass of Vehicle, but also due to other changes that enable Vehicle support in UT2004.

===Source Code===

To fix it, you'll need to [[Legacy:Create A Subclass|Create A Subclass]] of the Bulldog, ModifiedBulldog, and use this custom code.  For a tutorial on using custom code, see [[Legacy:Mapping Hello World|Mapping Hello World]].  ('''Note:''' If you use the Script Editor to compile this code, omit the ''defaultProperties'' block and set those manually for each class.)

&lt;uscript&gt;
//=============================================================================
// ModifiedBulldog.
// Uses Vehicle.KDriverEnter() instead of KVehicle.KDriverEnter(), etc.
// by SuperApe -- Dec 2005
//=============================================================================
class ModifiedBulldog extends Bulldog
	placeable;

var(Bulldog) sound     BulldogShutDownSound;

function Timer()
{
	// Finished start sound
	AmbientSound = BulldogIdleSound;
}

function KDriverEnter( Pawn P )
{
	local Controller C;


	AmbientSound = BulldogStartSound;
	SetTimer( 1.0, false );

	bDriving = True;
	StuckCount = 0;

	// We don't have pre-defined exit positions here, so we use the original player location as an exit point
	if ( !bRelativeExitPos )
	{
		PlayerEnterredRotation = P.Rotation;
		ExitPositions[0] =  P.Location + Vect(0,0,16);
	}

	// Set pawns current controller to control the vehicle pawn instead
	C = P.Controller;
	if ( !bCanCarryFlag &amp;&amp; ( C.PlayerReplicationInfo.HasFlag != None )  )
		P.DropFlag();

	Driver = P;
	Driver.StartDriving( Self );

	// Disconnect PlayerController from Driver and connect to SVehicle.
	C.bVehicleTransition = true; // to keep Bots from doing Restart()
	C.Unpossess();
	Driver.SetOwner( self ); // This keeps the driver relevant.
	C.Possess( self );
	C.bVehicleTransition = false;

	DrivingStatusChanged();

	if ( PlayerController( C ) != None )
		VehicleLostTime = 0;

	AttachFlag( PlayerReplicationInfo.HasFlag );

	Level.Game.DriverEnteredVehicle( self, P );

	ReceiveLocalizedMessage( class'Vehicles.BulldogMessage', 1 );
}

event bool KDriverLeave( bool bForceLeave )
{
	local Controller C;
	local PlayerController	PC;
	local bool havePlaced;
	local Pawn	OldDriver;
	local	int 	i;

	if( !bForceLeave &amp;&amp; !Level.Game.CanLeaveVehicle(self, Driver) )
		return false;

	if ( (PlayerReplicationInfo != None) &amp;&amp; (PlayerReplicationInfo.HasFlag != None) )
		Driver.HoldFlag(PlayerReplicationInfo.HasFlag);

	// Do nothing if we're not being driven
	if (Controller == None )
		return false;

	// Before we can exit, we need to find a place to put the driver.
	// Iterate over array of possible exit locations.

	if ( (Driver != None) &amp;&amp; (!bRemoteControlled || bHideRemoteDriver) )
    {
	    Driver.bHardAttach = false;
	    Driver.bCollideWorld = true;
	    Driver.SetCollision(true, true);
	    havePlaced = PlaceExitingDriver();

	    // If we could not find a place to put the driver, leave driver inside as before.
	    if (!havePlaced &amp;&amp; !bForceLeave )
	    {
	        Driver.bHardAttach = true;
	        Driver.bCollideWorld = false;
	        Driver.SetCollision(false, false);
	        return false;
	    }
	}

	bDriving = False;

	// Turn off bulldog headlights
	Headlight.DetachProjector();
	Skins[2] = HeadlightOffMaterial;
	for(i=0; i&lt;8; i++)
		HeadlightCorona[i].bHidden = true;

	// Reconnect Controller to Driver.
	C = Controller;
	if (C.RouteGoal == self)
		C.RouteGoal = None;
	if (C.MoveTarget == self)
		C.MoveTarget = None;
	C.bVehicleTransition = true;
	Controller.UnPossess();

	if ( (Driver != None) &amp;&amp; (Driver.Health &gt; 0) )
	{
		Driver.SetOwner( C );
		C.Possess( Driver );

		PC = PlayerController(C);
		if ( PC != None )
			PC.ClientSetViewTarget( Driver ); // Set playercontroller to view the person that got out

		Driver.StopDriving( Self );
	}
	C.bVehicleTransition = false;

	if ( C == Controller )	// If controller didn't change, clear it...
		Controller = None;

	Level.Game.DriverLeftVehicle(self, Driver);

	// Car now has no driver
	OldDriver = Driver;
	Driver = None;

	DriverLeft();

	// Put brakes on before you get out :)
    Throttle	= 0;
    Steering	= 0;
	Rise		= 0;

	PlaySound( BulldogShutDownSound, SLOT_Misc );

	// If we succesfully got out of the car, make driver visible again.
	OldDriver.bHidden = false;
	AmbientSound = None;
	return true;
}

function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation,
						Vector Momentum, class&lt;DamageType&gt; DamageType)
{
	Super.TakeDamage( Damage, InstigatedBy, HitLocation, Momentum, DamageType );

	KAddImpulse( Momentum, HitLocation);
}

defaultproperties
{
     DestroyedEffect=Class'myLevel.DECO_DestroyedBulldog'
     DestroyedSound=Sound'ONSVehicleSounds-S.Explosions.VehicleExplosion01'
     BulldogShutDownSound=Sound'ONSVehicleSounds-S.PRV.PRVStop01'
     BulldogStartSound=Sound'ONSVehicleSounds-S.PRV.PRVStart01'
     BulldogIdleSound=Sound'ONSVehicleSounds-S.RV.RVEng01'
     BulldogSquealSound=Sound'ONSVehicleSounds-S.PRV.DirtSkid03'
     BulldogHitSound=Sound'ONSVehicleSounds-S.CollisionSounds.VehicleCollision04'
     HornSounds(0)=Sound'ONSVehicleSounds-S.Horns.Horn03'
     bDontPossess=False
     Begin Object Class=KarmaParamsRBFull Name=KarmaParamsRBFull1
         KInertiaTensor(0)=20.000000
         KInertiaTensor(3)=30.000000
         KInertiaTensor(5)=48.000000
         KCOMOffset=(X=0.800000,Z=-0.700000)
         KLinearDamping=0.000000
         KAngularDamping=0.000000
         KStartEnabled=True
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=True
         KFriction=1.600000
     End Object
     KParams=KarmaParamsRBFull'myLevel.KarmaParamsRBFull1'
}
&lt;/uscript&gt;

This ModifiedBulldog uses a static mesh as a Destroyed Vehicle mesh.  It's a subclass of Decoration -&gt; DECO_Smashable.  Here's it's code:

&lt;uscript&gt;
//=============================================================================
// DECO_DestroyedBulldog.
//=============================================================================
class DECO_DestroyedBulldog extends DECO_Smashable
	placeable;

defaultproperties
{
     EffectWhenDestroyed=Class'XEffects.RocketExplosion'
     Health=100
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'BulldogMeshes.Simple.S_Chassis'
     Physics=PHYS_Falling
     LifeSpan=5.000000
     DrawScale=0.400000
     Skins(0)=Texture'AS_Vehicles_TX.IonPlasmaTank.IonTankBodyDEAD'
}
&lt;/uscript&gt;

===ModifiedBulldog Notes===

&lt;u&gt;Things that work&lt;/u&gt;:
* You can get in and out of the Bulldog and other vehicles.
* You can hear the horn, startup, idle and shutdown sounds (borrowed heavily from ONS vehicles)
* The destroyed Bulldog shows a mesh, not just a RocketExplosion effect.
* Headlights come on when driving, go off when not.
* All normal drivability and [[Legacy:BulldogRocket|BulldogRocket]] turret functionality, including homing rockets to vehicles or players with hud display on lock. 

&lt;u&gt;Things that don't work&lt;/u&gt;:
* If you jump out and the Bulldog keeps rolling (it has no parking brake without a driver, ATM) you loose the [[Legacy:BulldogTrigger|BulldogTrigger]]s that enable you to get back in.
* The Deco_DestroyedBulldog mesh doesn't quite fall and hit the ground like it should, the tires simply disappear and there's no neat explosion or smoke.
* The Bulldog &quot;dust&quot; and &quot;rocks&quot; trail behind the bulldog no matter what terrain (or BSP) it's on. (should probably take the level's dust color property)

===Technical Notes===

The code for KVehicle, KCar and Bulldog is exactly the same as in UT2003, but it was it's interaction with Vehicle and [[Legacy:Controller|Controller]] code that seemed to cause problems.  The main things that were breaking the Bulldog were KVehicle.KDriverEnter() and KVehicles.KDriverLeave(), although there were many disabled things in the Bulldog code like sounds and the KAddImpulse when it gets hit.

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topic for Vehicles
* [[Legacy:KVehicleFactory|KVehicleFactory]] &amp;ndash; Vehicle Factory for KVehicles
** [[Legacy:BulldogFactory|BulldogFactory]] &amp;ndash; KVehicleFactory that spawns Bulldogs
* [[Legacy:Karma|Karma]] &amp;ndash; Main topic for Karma
* [[Legacy:BulldogRocket|BulldogRocket]]
* [[Legacy:Modifying The Bulldog|Modifying the Bulldog]]
* [[Legacy:Bulldog Player|Bulldog Player]] &amp;ndash; Mod to have players spawn as a bulldog
* [[Legacy:Mod Ideas/Mini Bulldogs|Mod Ideas/Mini Bulldogs]]

==Discussion==

'''SuperApe:''' I've been curious about this since UT2004 came out.  Although, this just reminds me how badly the Bulldog handles; bad shocks that flop around and the momentum keeps the front tires from gripping enough to steer well.  I'm still not sure exactly what part of those KVehicle functions broke it.  Any thoughts on this are welcome here in the Discussion section.  I will update the source code when we know more.

'''DaWrecka:''' On the subject of Bulldog handling, I did play around with this some in UT2003...While I stress I've NOT tried this with UT2004, in 2k3 I found cranking up the KActorGravScale of the Bulldog's KParams actually made it handle more-or-less as you would expect a jeep-thing to handle. A value of 3 worked nicely. That's assuming the level was in normal gravity of course...Reduced level gravity would bollocks the whole thing up just like normal.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bulldog Player</title>
    <id>630</id>
    <revision>
      <id>1879</id>
      <timestamp>2007-11-15T06:14:09Z</timestamp>
      <contributor>
        <ip>IZiMO</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Making the bulldog the player pawn ==

I'm a bit of a uscript n00b and this is aimed at n00bs.  Just delete it if it doesn't really belong.  And please edit it if it's really crap or just too simple :/

If you want the player to spawn as a bulldog, this is how you do it.  Keep in mind that the player actually is the bulldog so they can never exit the vehicle.

OK, the first thing to do is to create a new bulldog which subclasses the old one. We have to do this because it's not as simple as setting the pawn class in the game info class.

&lt;uscript&gt;class NewBulldog extends Bulldog
    placeable;

simulated event Destroyed()
{
    Driver = None;
    super.Destroyed();
}

function PostSpawn(Pawn p)
{
    local PlayerController pc;

    Driver = p;
    pc = BulldogSpawnPlayer(p.Controller);
    pc.GotoState('PlayerDriving');
    ClientKDriverEnter(pc);
}&lt;/uscript&gt;

The first thing that is done is in event destroyed.  Because this new car won't be the same as other vehicles ie. there is no pawn inside doing the driving, it is driving itself; we have to tell the vehicle that there is no longer a driver before it is destroyed, or else it gets messy and eventually throws back a critical error.

Then there's the PostSpawn function.  This function is called straight after the player spawns from the game info class.  If nothing is done after the car spawns, it doesn't act like a car, the chassis just spins around when the mouse is moved.  The parameter p is just the bulldog that has spawned.  So first the driver is set to the car itself, because there is no driver.  

Then the PlayerController class is set to PlayerDriving so the car acts like a car.  Then the function ClientKDriverEnter is called, which does some stuff to the HUD (but it is also vital to the car driving, I don't know why :/ ).

Now, since there is no pawn inside the vehicle driving, we have to prevent the player from exiting when they are in the PlayerDriving state.  So we create a new PlayerController class.  This is fairly messy so please edit it if there is a better way to do it.

&lt;uscript&gt;class BulldogSpawnPlayer extends xPlayer;

state PlayerDriving
{
ignores SeePlayer, HearNoise, Bump;

    function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot)
    {

    }

    exec function Fire(optional float F)
    {
        local KVehicle DrivenVehicle;

        DrivenVehicle = KVehicle(Pawn);
        if(DrivenVehicle != None)
        {
            DrivenVehicle.VehicleFire(false);
            DrivenVehicle.bVehicleIsFiring = true;
        }
    }

    exec function AltFire(optional float F)
    {
        local KVehicle DrivenVehicle;

        DrivenVehicle = KVehicle(Pawn);
        if(DrivenVehicle != None)
        {
            DrivenVehicle.VehicleFire(true);
            DrivenVehicle.bVehicleIsAltFiring = true;
        }
    }

    // Set the throttle, steering etc. for the vehicle based on the input provided
    function ProcessDrive(float InForward, float InStrafe, bool InJump)
    {
        local KVehicle DrivenVehicle;

        DrivenVehicle = KVehicle(Pawn);

        if(DrivenVehicle == None)
        {
            log(&quot;PlayerDriving.PlayerMove: No Vehicle&quot;);
            return;
        }

        // check for 'jump' to throw the driver out.
/*        if(InJump &amp;&amp; Role == ROLE_Authority)
        {
            DrivenVehicle.bGetOut = true;
            return;
        }*/

        //log(&quot;Drive:&quot;$InForward$&quot; Steer:&quot;$InStrafe);

        if(InForward &gt; 1)
            DrivenVehicle.Throttle = 1;
        else if(InForward &lt; -1)
            DrivenVehicle.Throttle = -1;
        else
            DrivenVehicle.Throttle = 0;

        if(InStrafe &lt; -1)
            DrivenVehicle.Steering = 1;
        else if(InStrafe &gt; 1)
            DrivenVehicle.Steering = -1;
        else
            DrivenVehicle.Steering = 0;
	}

    function PlayerMove( float DeltaTime )
    {
        local KVehicle DrivenVehicle;

        // Only servers can actually do the driving logic.
        if(Role &lt; ROLE_Authority)
            ServerDrive(aForward, aStrafe, bPressedJump);
        else
            ProcessDrive(aForward, aStrafe, bPressedJump);

        // If the vehicle is being controlled here - set replicated variables.
        DrivenVehicle = KVehicle(Pawn);
        if(DrivenVehicle != None)
        {
            if(bFire == 0 &amp;&amp; DrivenVehicle.bVehicleIsFiring)
            {
                DrivenVehicle.VehicleCeaseFire(false);
                DrivenVehicle.bVehicleIsFiring = false;
            }

            if(bAltFire == 0 &amp;&amp; DrivenVehicle.bVehicleIsAltFiring)
            {
                DrivenVehicle.VehicleCeaseFire(true);
                DrivenVehicle.bVehicleIsAltFiring = false;
            }
        }

        // update 'looking' rotation - no affect on driving
        UpdateRotation(DeltaTime, 2);
    }

    function BeginState()
    {
        CleanOutSavedMoves();
    }

    function EndState()
    {
        CleanOutSavedMoves();
    }
}

defaultproperties
{
     PawnClass=Class'BulldogSpawn.NewBulldog'
}&lt;/uscript&gt;

I have just copied the state PlayerDriving from this class's parent and commented out the vehicle exit code.This is messy because I don't know how to do it any better.

&lt;uscript&gt;        // check for 'jump' to throw the driver out.
/*        if(InJump &amp;&amp; Role == ROLE_Authority)
        {
            DrivenVehicle.bGetOut = true;
            return;
        }*/&lt;/uscript&gt;

The only other thing from this class is the PawnClass is set to the new bulldog created before in defaultproperties.  This is pretty important ;).

The final thing to do is in the game info class.

&lt;uscript&gt;class BulldogSpawn extends xDeathMatch;

function RestartPlayer(Controller aPlayer) {
    Super.RestartPlayer(aPlayer);

    NewBulldog(aPlayer.Pawn).PostSpawn(aPlayer.Pawn);
}

defaultproperties
{
     MapPrefix=&quot;BS&quot;
     BeaconName=&quot;BS&quot;
     GameName=&quot;Bulldog Spawn&quot;
     PlayerControllerClassName=&quot;BulldogSpawn.BulldogSpawnPlayer&quot;
}&lt;/uscript&gt;

All that is done here is when the new bulldog spawns, the PostSpawn function is called that was written earlier.  Then in defaultproperties the PlayerController class is set to the one which was written earlier.  And voila, you spawn as the bulldog.  Hopefully some people will find this useful :).

----

Hi, I tried all this out but i dont seem to ge it to work, can someone help me out,

I named my map bs-test and also putted in a bulldogfactory and stuff to 

get bulldogs into my map. What else do i have to do to get it right ?

Greetz

----

to get this example to work (ut2003):

1. save the above classes as separate files with the filenames that correspond to the the class name (eg: NewBulldog class -&gt; NewBulldog.uc)

2. save these files under the directory [ut2003 home dir]/BulldogSpawn

3. edit UT2003.ini, underneath the [Editor.EditorEngine] section where the other EditPackages=xxxxxxx enrties are, add the line EditPackages=BulldogSpawn

4. navigate to [ut2003 home dir]/System at the prompt and type 'ucc make'

5. from this system directory type 'UT2003 VehicleDemo?Game=BulldogSpawn.BulldogSpawn'

ps. bit of an unfair advantage, but try 'UT2003 VehicleDemo?Game=BulldogSpawn.BulldogSpawn?NumBots=20'

cheers

ehendrikd

==Discussion ==

'''iZiMO:''' If you're creating a KVehicle subclass you could just overwrite the KDriverLeave function and make it simply always return false..? This prevents the player from leaving the vehicle and saves copying the whole Driving state from the controller class</text>
    </revision>
    <revision>
      <id>1880</id>
      <timestamp>2005-03-30T07:32:12Z</timestamp>
      <contributor>
        <ip>213-132-169-38.multikabel.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Making the bulldog the player pawn ==

I'm a bit of a uscript n00b and this is aimed at n00bs.  Just delete it if it doesn't really belong.  And please edit it if it's really crap or just too simple :/

If you want the player to spawn as a bulldog, this is how you do it.  Keep in mind that the player actually is the bulldog so they can never exit the vehicle.

OK, the first thing to do is to create a new bulldog which subclasses the old one. We have to do this because it's not as simple as setting the pawn class in the game info class.

&lt;uscript&gt;class NewBulldog extends Bulldog
    placeable;

simulated event Destroyed()
{
    Driver = None;
    super.Destroyed();
}

function PostSpawn(Pawn p)
{
    local PlayerController pc;

    Driver = p;
    pc = BulldogSpawnPlayer(p.Controller);
    pc.GotoState('PlayerDriving');
    ClientKDriverEnter(pc);
}&lt;/uscript&gt;

The first thing that is done is in event destroyed.  Because this new car won't be the same as other vehicles ie. there is no pawn inside doing the driving, it is driving itself; we have to tell the vehicle that there is no longer a driver before it is destroyed, or else it gets messy and eventually throws back a critical error.

Then there's the PostSpawn function.  This function is called straight after the player spawns from the game info class.  If nothing is done after the car spawns, it doesn't act like a car, the chassis just spins around when the mouse is moved.  The parameter p is just the bulldog that has spawned.  So first the driver is set to the car itself, because there is no driver.  

Then the PlayerController class is set to PlayerDriving so the car acts like a car.  Then the function ClientKDriverEnter is called, which does some stuff to the HUD (but it is also vital to the car driving, I don't know why :/ ).

Now, since there is no pawn inside the vehicle driving, we have to prevent the player from exiting when they are in the PlayerDriving state.  So we create a new PlayerController class.  This is fairly messy so please edit it if there is a better way to do it.

&lt;uscript&gt;class BulldogSpawnPlayer extends xPlayer;

state PlayerDriving
{
ignores SeePlayer, HearNoise, Bump;

    function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot)
    {

    }

    exec function Fire(optional float F)
    {
        local KVehicle DrivenVehicle;

        DrivenVehicle = KVehicle(Pawn);
        if(DrivenVehicle != None)
        {
            DrivenVehicle.VehicleFire(false);
            DrivenVehicle.bVehicleIsFiring = true;
        }
    }

    exec function AltFire(optional float F)
    {
        local KVehicle DrivenVehicle;

        DrivenVehicle = KVehicle(Pawn);
        if(DrivenVehicle != None)
        {
            DrivenVehicle.VehicleFire(true);
            DrivenVehicle.bVehicleIsAltFiring = true;
        }
    }

    // Set the throttle, steering etc. for the vehicle based on the input provided
    function ProcessDrive(float InForward, float InStrafe, bool InJump)
    {
        local KVehicle DrivenVehicle;

        DrivenVehicle = KVehicle(Pawn);

        if(DrivenVehicle == None)
        {
            log(&quot;PlayerDriving.PlayerMove: No Vehicle&quot;);
            return;
        }

        // check for 'jump' to throw the driver out.
/*        if(InJump &amp;&amp; Role == ROLE_Authority)
        {
            DrivenVehicle.bGetOut = true;
            return;
        }*/

        //log(&quot;Drive:&quot;$InForward$&quot; Steer:&quot;$InStrafe);

        if(InForward &gt; 1)
            DrivenVehicle.Throttle = 1;
        else if(InForward &lt; -1)
            DrivenVehicle.Throttle = -1;
        else
            DrivenVehicle.Throttle = 0;

        if(InStrafe &lt; -1)
            DrivenVehicle.Steering = 1;
        else if(InStrafe &gt; 1)
            DrivenVehicle.Steering = -1;
        else
            DrivenVehicle.Steering = 0;
	}

    function PlayerMove( float DeltaTime )
    {
        local KVehicle DrivenVehicle;

        // Only servers can actually do the driving logic.
        if(Role &lt; ROLE_Authority)
            ServerDrive(aForward, aStrafe, bPressedJump);
        else
            ProcessDrive(aForward, aStrafe, bPressedJump);

        // If the vehicle is being controlled here - set replicated variables.
        DrivenVehicle = KVehicle(Pawn);
        if(DrivenVehicle != None)
        {
            if(bFire == 0 &amp;&amp; DrivenVehicle.bVehicleIsFiring)
            {
                DrivenVehicle.VehicleCeaseFire(false);
                DrivenVehicle.bVehicleIsFiring = false;
            }

            if(bAltFire == 0 &amp;&amp; DrivenVehicle.bVehicleIsAltFiring)
            {
                DrivenVehicle.VehicleCeaseFire(true);
                DrivenVehicle.bVehicleIsAltFiring = false;
            }
        }

        // update 'looking' rotation - no affect on driving
        UpdateRotation(DeltaTime, 2);
    }

    function BeginState()
    {
        CleanOutSavedMoves();
    }

    function EndState()
    {
        CleanOutSavedMoves();
    }
}

defaultproperties
{
     PawnClass=Class'BulldogSpawn.NewBulldog'
}&lt;/uscript&gt;

I have just copied the state PlayerDriving from this class's parent and commented out the vehicle exit code.This is messy because I don't know how to do it any better.

&lt;uscript&gt;        // check for 'jump' to throw the driver out.
/*        if(InJump &amp;&amp; Role == ROLE_Authority)
        {
            DrivenVehicle.bGetOut = true;
            return;
        }*/&lt;/uscript&gt;

The only other thing from this class is the PawnClass is set to the new bulldog created before in defaultproperties.  This is pretty important ;).

The final thing to do is in the game info class.

&lt;uscript&gt;class BulldogSpawn extends xDeathMatch;

function RestartPlayer(Controller aPlayer) {
    Super.RestartPlayer(aPlayer);

    NewBulldog(aPlayer.Pawn).PostSpawn(aPlayer.Pawn);
}

defaultproperties
{
     MapPrefix=&quot;BS&quot;
     BeaconName=&quot;BS&quot;
     GameName=&quot;Bulldog Spawn&quot;
     PlayerControllerClassName=&quot;BulldogSpawn.BulldogSpawnPlayer&quot;
}&lt;/uscript&gt;

All that is done here is when the new bulldog spawns, the PostSpawn function is called that was written earlier.  Then in defaultproperties the PlayerController class is set to the one which was written earlier.  And voila, you spawn as the bulldog.  Hopefully some people will find this useful :).

----

Hi, I tried all this out but i dont seem to ge it to work, can someone help me out,

I named my map bs-test and also putted in a bulldogfactory and stuff to 

get bulldogs into my map. What else do i have to do to get it right ?

Greetz

----

to get this example to work (ut2003):

1. save the above classes as separate files with the filenames that correspond to the the class name (eg: NewBulldog class -&gt; NewBulldog.uc)

2. save these files under the directory [ut2003 home dir]/BulldogSpawn

3. edit UT2003.ini, underneath the [Editor.EditorEngine] section where the other EditPackages=xxxxxxx enrties are, add the line EditPackages=BulldogSpawn

4. navigate to [ut2003 home dir]/System at the prompt and type 'ucc make'

5. from this system directory type 'UT2003 VehicleDemo?Game=BulldogSpawn.BulldogSpawn'

ps. bit of an unfair advantage, but try 'UT2003 VehicleDemo?Game=BulldogSpawn.BulldogSpawn?NumBots=20'

cheers

ehendrikd</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BulldogFactory</title>
    <id>594</id>
    <revision>
      <id>1801</id>
      <timestamp>2005-12-03T00:33:50Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KVehicleFactory|KVehicleFactory]] &gt;&gt; [[Legacy:KVehicleFactory|KVehicleFactory]] &gt;&gt; [[Legacy:BulldogFactory|BulldogFactory]] }}

Spawns [[Legacy:Bulldog|Bulldog]]s (See [[Legacy:KVehicleFactory|KVehicleFactory]] for info)

==Related Topics==
* [[Legacy:Bulldog|Bulldog]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1802</id>
      <timestamp>2003-03-26T01:44:24Z</timestamp>
      <contributor>
        <ip>Violator</ip>
      </contributor>
      <comment>BulldogFactory</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:KVehicleFactory|KVehicleFactory]] &gt;&gt; [[Legacy:BulldogFactory|BulldogFactory]] }}

Spawns [[Legacy:Bulldog|Bulldog]]s (See [[Legacy:KVehicleFactory|KVehicleFactory]] for info)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BulldogHeadlight</title>
    <id>28665</id>
    <revision>
      <id>40521</id>
      <timestamp>2010-01-14T09:05:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BulldogRocket</title>
    <id>28494</id>
    <revision>
      <id>40195</id>
      <timestamp>2009-11-17T10:57:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BulldogTire</title>
    <id>593</id>
    <revision>
      <id>1800</id>
      <timestamp>2003-03-26T01:26:08Z</timestamp>
      <contributor>
        <ip>Violator</ip>
      </contributor>
      <comment>BulldogTire</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:KTire|KTire]] &gt;&gt; [[Legacy:BulldogTire|BulldogTire]] }}

A descendant of [[Legacy:KTire|KTire]] used by the [[Legacy:Bulldog|Bulldog]]. Adds no extra functionality that I can see...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BulldogTrigger</title>
    <id>28519</id>
    <revision>
      <id>40220</id>
      <timestamp>2009-11-17T11:01:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Bullet</title>
    <id>651</id>
    <revision>
      <id>1924</id>
      <timestamp>2004-12-29T17:35:55Z</timestamp>
      <contributor>
        <ip>Dsl-082-082-072-096.arcor-ip.net</ip>
      </contributor>
      <comment>Found out that category personal page thingy</comment>
      <text xml:space="preserve">==Bullet==

Well. Thats me :)

===About me===

This is the second attempt to do something useful in UScript now. I'm a real UScript newbie but fortunately I've got longer experience in other programming languages like C/C++/Perl/little PHP/little Assembler. This makes it easy for me to learn Uscript because I don't have to fight with the syntax. The only problem is to get the connections behind all this code.

===Stuff I'm doing===

At the moment I'm tinkering around a bit and are trying to do rather useless stuff like ShieldGuns spawning Warheads or creating ShieldGuns that should lock projectiles hitting the Shield to the gun and stuff.

In the end only the Warhead launching ShieldGun worked but that's another story ;)

----

Yesterday I finished my Impulse Gun which I'm kind of proud of because it's the first useful modification I made :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1925</id>
      <timestamp>2004-12-12T00:16:56Z</timestamp>
      <contributor>
        <ip>Dsl-082-083-160-147.arcor-ip.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Bullet==

Well. Thats me :)

===About me===

This is the second attempt to do something useful in UScript now. I'm a real UScript newbie but fortunately I've got longer experience in other programming languages like C/C++/Perl/little PHP/little Assembler. This makes it easy for me to learn Uscript because I don't have to fight with the syntax. The only problem is to get the connections behind all this code.

===Stuff I'm doing===

At the moment I'm tinkering around a bit and are trying to do rather useless stuff like ShieldGuns spawning Warheads or creating ShieldGuns that should lock projectiles hitting the Shield to the gun and stuff.

In the end only the Warhead launching ShieldGun worked but that's another story ;)

----

Yesterday I finished my Impulse Gun which I'm kind of proud of because it's the first useful modification I made :D</text>
    </revision>
  </page>
  <page>
    <title>Legacy:BulletBox</title>
    <id>543</id>
    <revision>
      <id>1681</id>
      <timestamp>2002-08-01T10:25:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>I don't think RifleShell needs its own page</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; BulletBox}}

Ammo for the UT Sniper Rifle ([[Legacy:SniperRifle|SniperRifle]]). The BulletBox gives 10 rounds per pickup with a maximum capacity of 50 rounds. The subclass RifleShell only gives one round per pickup.

==Known subclasses ==
* RifleShell</text>
    </revision>
    <revision>
      <id>1682</id>
      <timestamp>2002-03-30T18:07:55Z</timestamp>
      <contributor>
        <ip>The G.O.A.T</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; BulletBox}}

==Known subclasses ==
* [[Legacy:RifleShell|RifleShell]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Burtlo</title>
    <id>617</id>
    <revision>
      <id>1847</id>
      <timestamp>2003-08-17T09:39:55Z</timestamp>
      <contributor>
        <ip>Burtlo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Franklin Webber===

----

====[http://students.washington.edu/frankw/ Personal Data]====

* Attributes.
** Aspriring Unrealscript programmer.
** College Student.
** Married with Children.

====Projects / Code.====

[http://students.washington.edu/frankw/java/ Project Portfolio] - Java, PHP, and XML.

[http://students.washington.edu/frankw/unreal/ Running Man]  - Unreal Mod and Development Journal 

----

====Guestbook.====

'''Wormbo:''' Welcome to the Wiki and happy coding! :)

'''Burtlo:''' Thanks.  I'm new to Wiki and new to Unrealscript.  I'm very interested in writing material to help other developers figure things out.  As my current growing pains are the tutorials that get you started but don't take you any further.  Luckily I seem to be piecing it together.

'''Wormbo:''' Nice work adding all those class pages, but please try to explain what functions and varaibles are used for, not what their code does. Also please try to figure out which functions were inherited from superclasses.

'''Burtlo:''' I hope I'm not making too much work for you, by putting up half-ass pages.  I'll take your suggestions and your fixes and apply them in the future to the next few pages that I write.  Thanks for for working behind me.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1848</id>
      <timestamp>2003-08-17T08:42:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Franklin Webber===

----

====[http://students.washington.edu/frankw/ Personal Data]====

* Attributes.
** Aspriring Unrealscript programmer.
** College Student.
** Married with Children.

====Projects / Code.====

[http://students.washington.edu/frankw/java/ Project Portfolio] - Java, PHP, and XML.

[http://students.washington.edu/frankw/unreal/ Running Man]  - Unreal Mod and Development Journal 

----

====Guestbook.====

'''Wormbo:''' Welcome to the Wiki and happy coding! :)

'''Burtlo:''' Thanks.  I'm new to Wiki and new to Unrealscript.  I'm very interested in writing material to help other developers figure things out.  As my current growing pains are the tutorials that get you started but don't take you any further.  Luckily I seem to be piecing it together.

'''Wormbo:''' Nice work adding all those class pages, but please try to explain what functions and varaibles are used for, not what their code does. Also please try to figure out which functions were inherited from superclasses.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Buu</title>
    <id>644</id>
    <revision>
      <id>1911</id>
      <timestamp>2004-07-22T15:46:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

Well I'm Buu, I'm from a small town in the Netherlands called Yerseke, and I play UT. I'm 14 years old and i'm doing bilingual education (most subjects fully in English, but my grammar sucks :/ ) and I'm in the 3rd grade now :-)

----

I'm mapping for a few months right now and I'm (I think at least) finished with a large outdoor CTF map called Mountain Wars. I've just submitted it into Nali City and I hope U like it :D.

I'm going to create more outdoor maps, because I like 'em and they are big :D

==My Work==

I'm just a n00b, I think, but here are my maps:

My first map [http://nalicity.beyondunreal.com/map_hub.php?mid=7510 CTF-MountainWars]. A large outdoor map. Pleez try it, It's not that bad i think :D

More on the way!

==My Work @ the Wiki==

Just filling up those ugly question marks with what I know for UT. Maybe not needed, but who cares :D

==Guest Book==

'''EntropicLqd:''' Hi, Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello! Welcome :) I've moved the page you made to [[Legacy:FlakAmmo|FlakAmmo]] BTW.

'''Buu:''' Thanks! Do you guys think it is needed to create pages that are wanted even if they probably aren't read? I'm doing some to get rid of those annoying question marks, but I think no one will ever read them. Isn't it more helpful to delete the links?

'''Guest:''' There's no harm in just leaving the '?' links. :)

'''Buu:''' I know, but it just doesn't look OK. and someone made those links, so they probably want that the page is filled.

'''Tarquin:''' That's not exactly how a wiki works. We tend to make links ''just in case'' there's a page there one day :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1912</id>
      <timestamp>2004-07-22T08:00:34Z</timestamp>
      <contributor>
        <ip>Buu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

Well I'm Buu, I'm from a small town in the Netherlands called Yerseke, and I play UT. I'm 14 years old and i'm doing bilingual education (most subjects fully in English, but my grammar sucks :/ ) and I'm in the 3rd grade now :-)

----

I'm mapping for a few months right now and I'm (I think at least) finished with a large outdoor CTF map called Mountain Wars. I've just submitted it into Nali City and I hope U like it :D.

I'm going to create more outdoor maps, because I like 'em and they are big :D

==My Work==

I'm just a n00b, I think, but here are my maps:

My first map [http://nalicity.beyondunreal.com/map_hub.php?mid=7510 CTF-MountainWars]. A large outdoor map. Pleez try it, It's not that bad i think :D

More on the way!

==My Work @ the Wiki==

Just filling up those ugly question marks with what I know for UT. Maybe not needed, but who cares :D

==Guest Book==

'''EntropicLqd:''' Hi, Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello! Welcome :) I've moved the page you made to [[Legacy:FlakAmmo|FlakAmmo]] BTW.

'''Buu:''' Thanks! Do you guys think it is needed to create pages that are wanted even if they probably aren't read? I'm doing some to get rid of those annoying question marks, but I think no one will ever read them. Isn't it more helpful to delete the links?

'''Guest:''' There's no harm in just leaving the '?' links. :)

'''Buu:''' I know, but it just doesn't look OK. and someone made those links, so they probably want that the page is filled.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:C--B</title>
    <id>700</id>
    <revision>
      <id>2035</id>
      <timestamp>2002-10-18T19:52:04Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki! :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''ZxAnPhOrIaN:''' Beat by wormbo... *sigh* (shame, shame, shame) anyway, Welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2036</id>
      <timestamp>2002-10-18T09:07:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki! :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:C0ry</title>
    <id>720</id>
    <revision>
      <id>2080</id>
      <timestamp>2002-07-06T13:49:52Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Cory Vogel

Programmer

====Email====

fusion815@cox.net

====ICQ====

156411501

====AIM====

Fizz815

====Articles On Wiki====

[[Legacy:An AI Concept|An AI Concept]]

[[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees and Linked Lists to Represent Group Hierarchy]]

====Messages====

'''Mychaeel:'''  Welcome to the Wiki.  :-)

'''Tarquin:'''  Hi there. I see you made it. Welcome aboard :)

'''ZxAnPhOrIaN:'''  Hey! ;-)

'''C0ry:''' Thnx...

'''Bean:''' Welcome C0ry. =]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2081</id>
      <timestamp>2002-06-20T00:48:13Z</timestamp>
      <contributor>
        <ip>C0ry</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Cory Vogel

Programmer

====Email====

fusion815@cox.net

====ICQ====

156411501

====AIM====

Fizz815

====Articles On Wiki====

[[Legacy:An AI Concept|An AI Concept]]

====Messages====

'''Mychaeel:'''  Welcome to the Wiki.  :-)

'''Tarquin:'''  Hi there. I see you made it. Welcome aboard :)

'''ZxAnPhOrIaN:'''  Hey! ;-)

'''C0ry:''' Thnx...

'''Bean:''' Welcome C0ry. =]</text>
    </revision>
    <revision>
      <id>2082</id>
      <timestamp>2002-06-23T00:46:23Z</timestamp>
      <contributor>
        <ip>C0ry</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Cory Vogel

Programmer

====Email====

fusion815@cox.net

====ICQ====

156411501

====AIM====

Fizz815

====Articles On Wiki====

[[Legacy:An AI Concept|An AI Concept]]

[[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees and Linked Lists to Represent Group Hierarchy]]

====Messages====

'''Mychaeel:'''  Welcome to the Wiki.  :-)

'''Tarquin:'''  Hi there. I see you made it. Welcome aboard :)

'''ZxAnPhOrIaN:'''  Hey! ;-)

'''C0ry:''' Thnx...

'''Bean:''' Welcome C0ry. =]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CC Units For UA</title>
    <id>836</id>
    <revision>
      <id>2341</id>
      <timestamp>2003-10-06T09:13:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

===October 5, 2003===

Here is a pic of the punisher for (I hope) UA! (In MS3D)

[[Image:Legacy_Punisher.gif|center|The punisher in all its unskinned glory!  This is a basic model, not the final version]]

==Comments==

'''Foxpaw:''' What's CC? And what's UA?

'''Dragonmaw:''' CC is one of the 2 official expansions for Total Annihilation.  UA is Unreal Annihilation, a mod focused on recreating TA in UT2003.

'''RDGDanClark:''' I think this is meant to be linked under Dragonmaw's personal page...

'''GRAF1K:''' Please do move this below your personal page, and when you do, please use a more descriptive name. BTW &amp;ndash; I can't see the pic.</text>
    </revision>
    <revision>
      <id>2342</id>
      <timestamp>2003-10-06T08:30:35Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

===October 5, 2003===

Here is a pic of the punisher for (I hope) UA! (In MS3D)

[[Image:Legacy_Punisher.gif|center|The punisher in all it's unskinned glory!  This is a basic model, not the final version]]

==Comments==

'''Foxpaw:''' What's CC? And what's UA?

'''Dragonmaw:''' CC is one of the 2 official expansions for Total Annihilation.  UA is Unreal Annihilation, a mod focused on recreating TA in UT2003.

'''RDGDanClark:''' I think this is meant to be linked under Dragonmaw's personal page...

'''GRAF1K:''' Please do move this below your personal page, and when you do, please use a more descriptive name. BTW &amp;ndash; I can't see the pic.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CH Earthquake</title>
    <id>907</id>
    <revision>
      <id>2498</id>
      <timestamp>2006-02-20T13:13:29Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==CH_Earthquake==

As the normal Earthquake but for the ChaosUT Mod.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CH3Z/Developer Journal</title>
    <id>829</id>
    <revision>
      <id>2326</id>
      <timestamp>2006-01-19T18:29:49Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==[[Legacy:UnrealScript For Non-Programmers|UnrealScript For Non-Programmers]]==

...used to reside here, but i have dumped it out to the public of this wiki in hopes that it might get the help it needs. It was stagnet here for years.

==[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Places To Start]]==

...is a new tutorial I have in progress. I don't intend for it to sit around here long. I will finish it soon, or get it to a point where is functional and can grow more and more and then make it public. 

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2327</id>
      <timestamp>2005-07-09T16:51:22Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>* just blew up the stump.</comment>
      <text xml:space="preserve">[[Legacy:UnrealScript For Non-Programmers|UnrealScript For Non-Programmers]] used to reside here, but i have dumped it out to the public of this wiki in hopes that it might get the help it needs. It was stagnet here for years. 

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CHNullHUD</title>
    <id>719</id>
    <revision>
      <id>2078</id>
      <timestamp>2007-08-13T14:22:37Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD (UT)|HUD (UT)]] &gt;&gt; [[Legacy:ChallengeHUD|ChallengeHUD]] &gt;&gt; CHNullHUD}}

Used by the [[Legacy:UTIntro|UTIntro]] game type which is used for cinematic cut scenes in Unreal Tournament.

* Paints the entire screen black for 1.5 game seconds after start.  (That effect isn't visible on Direct3D, just with OpenGL.)
* After 82 seconds, fades the text &quot;Press ESC to begin&quot; in at the bottom of the screen.

----

'''Mychaeel:'''  Does anybody have a clue ''why'' that 1.5-second blackout is done?  It had us baffled for a while when Snowdog made the [[Legacy:Jailbreak|Jailbreak]] credits flyby.</text>
    </revision>
    <revision>
      <id>2079</id>
      <timestamp>2007-08-13T13:25:06Z</timestamp>
      <contributor>
        <ip>H-184-24.A189.cust.bahnhof.se</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD (UT)|HUD (UT)]] &gt;&gt; [[Legacy:ChallengeHUD|ChallengeHUD]] &gt;&gt; CHNullHUD}}

Used by the [[Legacy:UTIntro|UTIntro]] game type which is used for cinematic cut scenes in Unreal Tournament.

* Paints the entire screen black for 1.5 game seconds after start.  (That effect isn't visible on Direct3D, just with OpenGL.)
* After 82 seconds, fades the text &quot;Press ESC to begin&quot; in at the bottom of the screen.

----

'''Mychaeel:'''  Does anybody have a clue ''why'' that 1.5-second blackout is done?  It had us baffled for a while when Snowdog made the [[Legacy:Jailbreak|Jailbreak]] credits flyby.

* [http://www.resumesplanet.com resume service]</text>
    </revision>
    <revision>
      <id>43326</id>
      <timestamp>2010-05-21T17:38:31Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD (UT)|HUD (UT)]] &gt;&gt; [[Legacy:ChallengeHUD|ChallengeHUD]] &gt;&gt; CHNullHUD}}

Used by the [[Legacy:UTIntro|UTIntro]] game type which is used for cinematic cut scenes in Unreal Tournament.

* Paints the entire screen black for 1.5 game seconds after [http://www.resumesplanet.com resume service] start.  (That effect isn't visible on Direct3D, just with OpenGL.)
* After 82 seconds, fades the text &quot;Press ESC to begin&quot; in at the bottom of the screen.

----

'''Mychaeel:'''  Does anybody have a clue ''why'' that 1.5-second blackout is done?  It had us baffled for a while when Snowdog made the [[Legacy:Jailbreak|Jailbreak]] credits flyby.</text>
    </revision>
    <revision>
      <id>43341</id>
      <timestamp>2010-05-22T04:23:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:EntropicLqd|EntropicLqd]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD (UT)|HUD (UT)]] &gt;&gt; [[Legacy:ChallengeHUD|ChallengeHUD]] &gt;&gt; CHNullHUD}}

Used by the [[Legacy:UTIntro|UTIntro]] game type which is used for cinematic cut scenes in Unreal Tournament.

* Paints the entire screen black for 1.5 game seconds after start.  (That effect isn't visible on Direct3D, just with OpenGL.)
* After 82 seconds, fades the text &quot;Press ESC to begin&quot; in at the bottom of the screen.

----

'''Mychaeel:'''  Does anybody have a clue ''why'' that 1.5-second blackout is done?  It had us baffled for a while when Snowdog made the [[Legacy:Jailbreak|Jailbreak]] credits flyby.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CHSpectator</title>
    <id>28510</id>
    <revision>
      <id>40211</id>
      <timestamp>2009-11-17T11:00:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CHurCH</title>
    <id>914</id>
    <revision>
      <id>2509</id>
      <timestamp>2007-04-08T18:47:11Z</timestamp>
      <contributor>
        <ip>CHurCH</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">- - - - - - &gt; CHurCH &lt; - - -

Hayya there I am church, also known as [NfC] CHurCH or [NfC] K!tt3N depending on my mood.

Well I am working on two different projects for UT2004 at the mo, DSF Franchise, (A UT2004 Machinama)

and 

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;RainKingdom&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
A description will come soon but let just say, larger ver of UT2004RPG&lt;/div&gt;&lt;/div&gt;

(A UT2004 TC)

well I will update soon.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2510</id>
      <timestamp>2007-04-01T21:43:01Z</timestamp>
      <contributor>
        <ip>CHurCH</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''About Mwa'''''

Heyya all you out there I am a long time Offline browser, now if only more sites would do that we would all be fine!

'''''My UT Project'''''

Well what am I doing with UT? Well that is simple, I am machinamaring or what ever you would call it. I'm not all that too crash hot at it but well we are getting on, the ruff cut for the first epesode is down so now we just have to get a re-take of a cut and well the video will be done and then onto the voice. FUN!!!

'''''My UT Exp'''''

Been messing around since UT99 but I got my start with the style of editor with Red Faction and ported over with well as I said UT99.

'''''Can I help you?'''''

Most likely not, but hell, it couldn't hurt to ask and I will see what I can tell you.

'''''Can you help me?'''''

Yes, I need some help with a few things actualy, well first of I need some custom models for weapons and some new shiney Static Meshs that will fit well with a nice brand new prototype spacecraft. Big one at that! Well if you can help just say so.

'''''END'''''

Well to end my page, Hi!
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CRC32</title>
    <id>716</id>
    <revision>
      <id>2072</id>
      <timestamp>2006-02-05T08:13:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''CRC32''' ([[Wikipedia:Cyclic Redundancy Check]]) is an algorithm that digests data into a 32-bit checksum.  Small changes of the digested data yield large changes of the produced checksum.  It is (fundamentally) impossible to retrieve the original data from the calculated checksum.

Checksums have a lot of uses.  The implementation below is used in a [[Legacy:Jailbreak|Jailbreak]] class that transmits statistics data to a central stats server.  The client knows the secret password necessary to authenticate itself with the server; but to keep that password from being sent over the Internet in clear text, the client calculates a checksum over the transmitted stats data ''and'' the password.  The server, knowing the password as well, can then validate the data and the client's authenticity by calculating the same checksum itself and comparing it to the given one.

(A more sophisticated algorithm would have the server send the client a challenge first that's also digested by the checksum algorithm.  That way the server could be sure that the client really is aware of the password and not just copying a prior overheard request.)

==Implementation ==

The following implementation in UnrealScript has been created by [[Legacy:Mychaeel|Mychaeel]] for the [[Legacy:Jailbreak|Jailbreak]] mod.  Feel free to use and modify.

&lt;uscript&gt;
var private int CrcTable[256];


// ============================================================================
// CrcInit
//
// Initializes CrcTable and prepares it for use with Crc.
// ============================================================================

final function CrcInit() {

  const CrcPolynomial = 0xedb88320;

  local int CrcValue;
  local int IndexBit;
  local int IndexEntry;
  
  for (IndexEntry = 0; IndexEntry &lt; 256; IndexEntry++) {
    CrcValue = IndexEntry;

    for (IndexBit = 8; IndexBit &gt; 0; IndexBit--)
      if ((CrcValue &amp; 1) != 0)
        CrcValue = (CrcValue &gt;&gt;&gt; 1) ^ CrcPolynomial;
      else
        CrcValue = CrcValue &gt;&gt;&gt; 1;
    
    CrcTable[IndexEntry] = CrcValue;
    }
  }


// ============================================================================
// Crc
//
// Calculates and returns a checksum of the given string. Call CrcInit before.
// ============================================================================

final function int Crc(coerce string Text) {

  local int CrcValue;
  local int IndexChar;
  
  CrcValue = 0xffffffff;
  
  for (IndexChar = 0; IndexChar &lt; Len(Text); IndexChar++)
    CrcValue = (CrcValue &gt;&gt;&gt; 8) ^ CrcTable[Asc(Mid(Text, IndexChar, 1)) ^ (CrcValue &amp; 0xff)];

  return CrcValue;
  }
&lt;/uscript&gt;

==Discussion==

'''Wormbo:''' Looks like Asc()'s unicode-support breaks the Crc() function when passing in strings that contain certain characters in UT2004: E.g. when passing in an &quot;ä&quot; as the parameter of a commandlet from a DOS prompt Asc() returns 65508 and 65508 ^ (something &amp; 0xff) will always be greater than 255, which is the CrcTable's maximum possible index.

A potential fix could be:

&lt;uscript&gt;
final function int Crc(coerce string Text)
{
  local int CrcValue;
  local int IndexChar;
  local int StrLen;
  
  CrcValue = 0xffffffff;
  StrLen = Len(Text);
  for (IndexChar = 0; IndexChar &lt; StrLen; IndexChar++)
    CrcValue = (CrcValue &gt;&gt;&gt; 8) ^ CrcTable[(Asc(Mid(Text, IndexChar, 1)) ^ CrcValue) &amp; 0xff];

  return CrcValue;
}
&lt;/uscript&gt;

This also improves performance for large strings by by calling Len() only once.

'''Jimboh:''' Hmm, what if I want to find the crc of a stream of data?

&lt;uscript&gt;
final function int Crc(coerce string Text, int oldCrc, bool useOldCrc)
{
    local int CrcValue;
    local int IndexChar;
    local int StrLen;

    CrcValue = 0xffffffff;
    if (useOldCrc)
        CrcValue = oldCrc;

    StrLen = Len(Text);
    for (IndexChar = 0; IndexChar &lt; StrLen; IndexChar++)
        CrcValue = (CrcValue &gt;&gt;&gt; 8) ^ CrcTable[(Asc(Mid(Text, IndexChar, 1)) ^ CrcValue) &amp; 0xff];

    return CrcValue;
}
&lt;/uscript&gt;

Also, is there a reason why this implementation uses a string instead of a byte array? Are byte arrays slower to read or something?

'''Wormbo:''' For small amounts of data it's not a problem. For larger data, however, strings are much slower than byte arrays. If you already have your data in byte array form, by all means calculate the CRC directly from it. Whether you convert a string to byte array first or use the string version of the CRC function directly doesn't make a difference, though.

==Related Links==

* [http://www.geocities.com/SiliconValley/Pines/8659/crc.htm A Painless Guide to CRC Error Detection Algorithms]
* [http://www.rad.com/networks/1994/err_con/crc.htm Cyclic Redundancy Check (CRC)]

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2073</id>
      <timestamp>2006-02-05T01:01:56Z</timestamp>
      <contributor>
        <ip>Jimboh</ip>
      </contributor>
      <comment>*Support for streamed data, as well as a quesiton</comment>
      <text xml:space="preserve">'''CRC32''' ([[Wikipedia:Cyclic Redundancy Check]]) is an algorithm that digests data into a 32-bit checksum.  Small changes of the digested data yield large changes of the produced checksum.  It is (fundamentally) impossible to retrieve the original data from the calculated checksum.

Checksums have a lot of uses.  The implementation below is used in a [[Legacy:Jailbreak|Jailbreak]] class that transmits statistics data to a central stats server.  The client knows the secret password necessary to authenticate itself with the server; but to keep that password from being sent over the Internet in clear text, the client calculates a checksum over the transmitted stats data ''and'' the password.  The server, knowing the password as well, can then validate the data and the client's authenticity by calculating the same checksum itself and comparing it to the given one.

(A more sophisticated algorithm would have the server send the client a challenge first that's also digested by the checksum algorithm.  That way the server could be sure that the client really is aware of the password and not just copying a prior overheard request.)

==Implementation ==

The following implementation in UnrealScript has been created by [[Legacy:Mychaeel|Mychaeel]] for the [[Legacy:Jailbreak|Jailbreak]] mod.  Feel free to use and modify.

&lt;uscript&gt;
var private int CrcTable[256];


// ============================================================================
// CrcInit
//
// Initializes CrcTable and prepares it for use with Crc.
// ============================================================================

final function CrcInit() {

  const CrcPolynomial = 0xedb88320;

  local int CrcValue;
  local int IndexBit;
  local int IndexEntry;
  
  for (IndexEntry = 0; IndexEntry &lt; 256; IndexEntry++) {
    CrcValue = IndexEntry;

    for (IndexBit = 8; IndexBit &gt; 0; IndexBit--)
      if ((CrcValue &amp; 1) != 0)
        CrcValue = (CrcValue &gt;&gt;&gt; 1) ^ CrcPolynomial;
      else
        CrcValue = CrcValue &gt;&gt;&gt; 1;
    
    CrcTable[IndexEntry] = CrcValue;
    }
  }


// ============================================================================
// Crc
//
// Calculates and returns a checksum of the given string. Call CrcInit before.
// ============================================================================

final function int Crc(coerce string Text) {

  local int CrcValue;
  local int IndexChar;
  
  CrcValue = 0xffffffff;
  
  for (IndexChar = 0; IndexChar &lt; Len(Text); IndexChar++)
    CrcValue = (CrcValue &gt;&gt;&gt; 8) ^ CrcTable[Asc(Mid(Text, IndexChar, 1)) ^ (CrcValue &amp; 0xff)];

  return CrcValue;
  }
&lt;/uscript&gt;

==Discussion==

'''Wormbo:''' Looks like Asc()'s unicode-support breaks the Crc() function when passing in strings that contain certain characters in UT2004: E.g. when passing in an &quot;ä&quot; as the parameter of a commandlet from a DOS prompt Asc() returns 65508 and 65508 ^ (something &amp; 0xff) will always be greater than 255, which is the CrcTable's maximum possible index.

A potential fix could be:

&lt;uscript&gt;
final function int Crc(coerce string Text)
{
  local int CrcValue;
  local int IndexChar;
  local int StrLen;
  
  CrcValue = 0xffffffff;
  StrLen = Len(Text);
  for (IndexChar = 0; IndexChar &lt; StrLen; IndexChar++)
    CrcValue = (CrcValue &gt;&gt;&gt; 8) ^ CrcTable[(Asc(Mid(Text, IndexChar, 1)) ^ CrcValue) &amp; 0xff];

  return CrcValue;
}
&lt;/uscript&gt;

This also improves performance for large strings by by calling Len() only once.

'''Jimboh:''' Hmm, what if I want to find the crc of a stream of data?

&lt;uscript&gt;
final function int Crc(coerce string Text, int oldCrc, bool useOldCrc)
{
    local int CrcValue;
    local int IndexChar;
    local int StrLen;

    CrcValue = 0xffffffff;
    if (useOldCrc)
        CrcValue = oldCrc;

    StrLen = Len(Text);
    for (IndexChar = 0; IndexChar &lt; StrLen; IndexChar++)
        CrcValue = (CrcValue &gt;&gt;&gt; 8) ^ CrcTable[(Asc(Mid(Text, IndexChar, 1)) ^ CrcValue) &amp; 0xff];

    return CrcValue;
}
&lt;/uscript&gt;

Also, is there a reason why this implementation uses a string instead of a byte array? Are byte arrays slower to read or something?

==Related Links==

* [http://www.geocities.com/SiliconValley/Pines/8659/crc.htm A Painless Guide to CRC Error Detection Algorithms]
* [http://www.rad.com/networks/1994/err_con/crc.htm Cyclic Redundancy Check (CRC)]

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CSG</title>
    <id>714</id>
    <revision>
      <id>2066</id>
      <timestamp>2003-10-15T15:06:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>n00b-check please?</comment>
      <text xml:space="preserve">'''Constructive Solid Geometry''' (CSG) is a technique for defining a detailed space by building it up gradually with simple shapes. This is what the [[Legacy:Unreal Engine|Unreal Engine]] uses to define the basic [[Legacy:Unreal World|Unreal World]]. 

==Cookie dough==

The Unreal world is of course is three-dimensional, but let's imagine something simpler. Suppose you have a big sheet of rolled-out dough on a kitchen worktop and some square cookie cutters. You can create an open space in the sheet by stamping out squares. This is '''subtracting''' from the world.

Now suppose the cookie cutters are magical: you can also set them to add dough back in. So if you have a big cutter and a little cutter, you could subtract the big cutter, then use the little one to add a bit back in, maybe along an edge or in a corner. This is '''adding''' to the world.

This technique is pretty much what happens when a mapper works in [[Legacy:UnrealEd|UnrealEd]]: removing chunks of 3D space and sometimes putting bits back in. 

==Brushes==

There is one crucial difference between the cookie dough and Unreal. With the dough, the subtractions or additions were made immediately, and once they are made the cookie cutter moves on. 

In Unreal, each subtraction or addition to the space is represented by a '''brush'''. These are 3D wireframes that represent the shape that is being added or subtracted. You'll see the effects of CSG operations immediately, but brushes will always be there in the map. A brush can be moved, resized, rotated or deleted. To extend the cookie analogy, we're cutting the dough but keeping a copy of the cutter that made it in that place. At any point we can restore the dough and quickly run through all the cookie cutter operations again: this is the '''build process'''.

----

Constructive Solid Geometry (from now on referred to as CSG) refers to the technique of building up a three dimensional area of space (volume if you want to be more precise) from geometric shapes that either create space or fill space.

===A Quick Mind Game ===

Perhaps the easiest way to think of it is in terms of the addition and subtraction of shapes.  Imagine that you have a large solid block of ''stuff''.  Imagine that you have a cursor in the shape of a small cube that you can move around in this block of stuff.  Using the cursor you can add stuff, or delete (subtract) stuff at the press of a button.  If you were to move your cursor into the center of your block and press the subtract button you'd have a hollow cubic space in the middle of your block of stuff.

Still with me?

Now, without moving the cursor, press the add button.  Your small cubic space has just vanished.  It's been filled with stuff by the addition you just did.

===The Reality ===

CSG works just like the mind game above.  Using what is known as a brush (known as the [[Legacy:Red Builder Brush|red builder brush]] in Unreal Editing parlance) shapes are subtracted from and added to (or ''painted'' into, keeping with the brush analogy) the solid block of stuff that makes up the [[Legacy:Unreal World|Unreal World]].  It really is just like adding and subtracting numbers with one vitally important difference.

When a shape is subtracted or added to the world it leaves a small wireframe of effect behind to mark its boundaries (this is also confusingly known as a brush).  When shapes overlap only the last operation to be performed on the overlapping areas actually has an effect.  The order in which operations are performed is important.  In Unreal Editing speak this is known as the [[Legacy:Brush Order|brush order]].

====A quick change of pace ====

When the world is built (called the [[Legacy:Build|build]] process) brushes are processed in the order they were placed within the world, to create a tree of visible surfaces, the [[Legacy:BSP Tree|BSP Tree]].  It is this tree of surfaces that you see while playing in an Unreal world.

==A Note About UT2003 ==

One of the big differences between making maps for Unreal Tournament and Unreal Tournament 2003 is that far less CSG is used to create its levels.  In a UT2003 map, space is hollowed out (and occasionally added) of the solid world using CSG and then populated using [[Legacy:Static Mesh|Static Mesh]]es.  See [[Legacy:Building With Static Meshes|Building With Static Meshes]] for more information.

==Related Topics==
* [[Wikipedia:Constructive Solid Geometry]] - has some nice pictures that illustrate the CSG operations

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2067</id>
      <timestamp>2003-05-25T09:11:43Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==Constructive Solid Geometry (CSG) ==

Constructive Solid Geometry (from now on referred to as CSG) refers to the technique of building up a three dimensional area of space (volume if you want to be more precise) from geometric shapes that either create space or fill space.

===A Quick Mind Game ===

Perhaps the easiest way to think of it is in terms of the addition and subtraction of shapes.  Imagine that you have a large solid block of ''stuff''.  Imagine that you have a cursor in the shape of a small cube that you can move around in this block of stuff.  Using the cursor you can add stuff, or delete (subtract) stuff at the press of a button.  If you were to move your cursor into the center of your block and press the subtract button you'd have a hollow cubic space in the middle of your block of stuff.

Still with me?

Now, without moving the cursor, press the add button.  Your small cubic space has just vanished.  It's been filled with stuff by the addition you just did.

===The Reality ===

CSG works just like the mind game above.  Using what is known as a brush (known as the [[Legacy:Red Builder Brush|red builder brush]] in Unreal Editing parlance) shapes are subtracted from and added to (or ''painted'' into, keeping with the brush analogy) the solid block of stuff that makes up the [[Legacy:Unreal World|Unreal World]].  It really is just like adding and subtracting numbers with one vitally important difference.

When a shape is subtracted or added to the world it leaves a small wireframe of effect behind to mark its boundaries (this is also confusingly known as a brush).  When shapes overlap only the last operation to be performed on the overlapping areas actually has an effect.  The order in which operations are performed is important.  In Unreal Editing speak this is known as the [[Legacy:Brush Order|brush order]].

====A quick change of pace ====

When the world is built (called the [[Legacy:Build|build]] process) brushes are processed in the order they were placed within the world, to create a tree of visible surfaces, the [[Legacy:BSP Tree|BSP Tree]].  It is this tree of surfaces that you see while playing in an Unreal world.

==A Note About UT2003 ==

One of the big differences between making maps for Unreal Tournament and Unreal Tournament 2003 is that far less CSG is used to create its levels.  In a UT2003 map, space is hollowed out (and occasionally added) of the solid world using CSG and then populated using [[Legacy:Static Mesh|Static Mesh]]es.  See [[Legacy:Building With Static Meshes|Building With Static Meshes]] for more information.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2068</id>
      <timestamp>2003-10-15T15:05:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>n00b-check please?</comment>
      <text xml:space="preserve">'''Constructive Solid Geometry''' (CSG) is a technique for defining a detailed space by building it up gradually with simple shapes. This is what the [[Legacy:Unreal Engine|Unreal Engine]] uses to define the basic [[Legacy:Unreal World|Unreal World]]. 

==Cookie dough==

The Unreal world is of course is three-dimensional, but let's imagine something simpler. Suppose you have a big sheet of rolled-out dough on a kitchen worktop and some square cookie cutters. You can create an open space in the sheet by stamping out squares. This is '''subtracting''' from the world.

Now suppose the cookie cutters are magical: you can also set them to add dough back in. So if you have a big cutter and a little cutter, you could subtract the big cutter, then use the little one to add a bit back in, maybe along an edge or in a corner. This is '''adding''' to the world.

This technique is pretty much what happens when a mapper works in [[Legacy:UnrealEd|UnrealEd]]: removing chunks of 3D space and sometimes putting bits back in. 

==Brushes==

There is one crucial difference between the cookie dough and Unreal. With the dough, the subtractions or additions were made immediately, and once they are made the cookie cutter moves on. 

In Unreal, each subtraction or addition to the space is represented by a '''brush'''. These are 3D wireframes that represent the shape that is being added or subtracted. You'll see the effects of CSG operations immediately, but brushes will always be there in the map. A brush can be moved, resized, rotated or deleted. To extend the cookie analogy, we're cutting the dough but keeping a copy of the cutter that made it in that place. At any point we can restore the dough and quickly run through all the cookie cutter operations again: this is the '''build process'''.

----

Constructive Solid Geometry (from now on referred to as CSG) refers to the technique of building up a three dimensional area of space (volume if you want to be more precise) from geometric shapes that either create space or fill space.

===A Quick Mind Game ===

Perhaps the easiest way to think of it is in terms of the addition and subtraction of shapes.  Imagine that you have a large solid block of ''stuff''.  Imagine that you have a cursor in the shape of a small cube that you can move around in this block of stuff.  Using the cursor you can add stuff, or delete (subtract) stuff at the press of a button.  If you were to move your cursor into the center of your block and press the subtract button you'd have a hollow cubic space in the middle of your block of stuff.

Still with me?

Now, without moving the cursor, press the add button.  Your small cubic space has just vanished.  It's been filled with stuff by the addition you just did.

===The Reality ===

CSG works just like the mind game above.  Using what is known as a brush (known as the [[Legacy:Red Builder Brush|red builder brush]] in Unreal Editing parlance) shapes are subtracted from and added to (or ''painted'' into, keeping with the brush analogy) the solid block of stuff that makes up the [[Legacy:Unreal World|Unreal World]].  It really is just like adding and subtracting numbers with one vitally important difference.

When a shape is subtracted or added to the world it leaves a small wireframe of effect behind to mark its boundaries (this is also confusingly known as a brush).  When shapes overlap only the last operation to be performed on the overlapping areas actually has an effect.  The order in which operations are performed is important.  In Unreal Editing speak this is known as the [[Legacy:Brush Order|brush order]].

====A quick change of pace ====

When the world is built (called the [[Legacy:Build|build]] process) brushes are processed in the order they were placed within the world, to create a tree of visible surfaces, the [[Legacy:BSP Tree|BSP Tree]].  It is this tree of surfaces that you see while playing in an Unreal world.

==A Note About UT2003 ==

One of the big differences between making maps for Unreal Tournament and Unreal Tournament 2003 is that far less CSG is used to create its levels.  In a UT2003 map, space is hollowed out (and occasionally added) of the solid world using CSG and then populated using [[Legacy:Static Mesh|Static Mesh]]es.  See [[Legacy:Building With Static Meshes|Building With Static Meshes]] for more information.

==Related Topics==
* [[Wikipedia:Constructive Solid Geometry]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTF</title>
    <id>701</id>
    <revision>
      <id>2037</id>
      <timestamp>2002-09-11T11:47:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>redirected to CTFGame</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:CTFGame (UT)|CTFGame (UT)]]</text>
    </revision>
    <revision>
      <id>2038</id>
      <timestamp>2002-04-03T12:04:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''Capture the Flag (CTF):'' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mapping]]</text>
    </revision>
    <revision>
      <id>2039</id>
      <timestamp>2002-04-03T12:05:11Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Capture the Flag (CTF):'' Standard Unreal Tournament [[Legacy:Gametypes|game type]]. Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mapping]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTF-Magma</title>
    <id>824</id>
    <revision>
      <id>2315</id>
      <timestamp>2004-04-15T07:17:22Z</timestamp>
      <contributor>
        <ip>Crunchywomble</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">CTF-Magma is one of the most technology laden of all the built-in UT 2003 maps, so picking it apart is a great way to learn about making fancy maps.

==The Brushes==

Turn off static mesh display.  You'll notice that the mountain is still there, are are some strange little platforms under each castle.  I'm not quite sure of the platforms under the castles.

The mountain is built as geometry so that it could be made a separate zone.  Because of the way they set up the doorways, most of the time you can't see past the little door zones, and therefore can't see the mesh of the inside of the castle.

==The Zones==

There's something funny going on with the zoning of this level.  for some reason the zone portal around the mountain is actually 5 separate brushes.  I'm assuming that this is because the engine determines visibility through the bounding box of each zone portal brush separately, not the combination of all the portal polys.  This results in some or all of the gometry on the far side, and all smaller objects, not being drawn.  if they had used a single big brush made in the 2d shape editor it would have been pointless.

==The Meshes (except castles)==

The entire world is static meshes.  Most of these meshes show off multi-texturing.  Some example of how multi-texturing is use include:
* lava rivers flowing through the stationary lava
* smooth blend between the lava lake and the lava pouring into the pits
* blending of textures on the areas you can walk
* fringe where the ground meets the lava

All of these meshes use two different textures that have been cross-faded using the vertex color of the mesh.

Also, for all the meshes that the player collides with that aren't trivial (such as the little islands), there are separate collision meshes that have much lower polygon counts.  This speeds up collision and karma, and reduces server CPU usage when there's LOTs of players playing.

==The Castles==

Go into lighting-only mode.  Notice that the castles are flat white?  That's because they have had a pre-rendered light map applied to them and have been marked as bUnlit.  I assume that these maps were made by some feature of [[Legacy:3D Studio Max|3D Studio Max]] that allows you to render lighting into a texture map.  These light maps are then combined with the texture maps on the castle using multi-texturing.

==The Materials==

The materials used on the static meshes in this map show off just about every feature there is.  Look through all of them and try to figure out how they work.

----

'''inio:''' I've been doing a lot of looking at this map the past week or two, so I figured I'd share what I've learned  If there's anything you'd like to see expanded or covered in more detail, just add a comment.

----

'''crunchywomble''' Yeah, I'd love to know more about what you've discovered in this level. It's definatly my favourite for texture and mesh use. I'm trying to emulate the lava flow effect for a level, and I'd love any insights you'd care to share.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2316</id>
      <timestamp>2003-07-19T22:09:37Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">CTF-Magma is one of the most technology laden of all the built-in UT 2003 maps, so picking it apart is a great way to learn about making fancy maps.

==The Brushes==

Turn off static mesh display.  You'll notice that the mountain is still there, are are some strange little platforms under each castle.  I'm not quite sure of the platforms under the castles.

The mountain is built as geometry so that it could be made a separate zone.  Because of the way they set up the doorways, most of the time you can't see past the little door zones, and therefore can't see the mesh of the inside of the castle.

==The Zones==

There's something funny going on with the zoning of this level.  for some reason the zone portal around the mountain is actually 5 separate brushes.  I'm assuming that this is because the engine determines visibility through the bounding box of each zone portal brush separately, not the combination of all the portal polys.  This results in some or all of the gometry on the far side, and all smaller objects, not being drawn.  if they had used a single big brush made in the 2d shape editor it would have been pointless.

==The Meshes (except castles)==

The entire world is static meshes.  Most of these meshes show off multi-texturing.  Some example of how multi-texturing is use include:
* lava rivers flowing through the stationary lava
* smooth blend between the lava lake and the lava pouring into the pits
* blending of textures on the areas you can walk
* fringe where the ground meets the lava

All of these meshes use two different textures that have been cross-faded using the vertex color of the mesh.

Also, for all the meshes that the player collides with that aren't trivial (such as the little islands), there are separate collision meshes that have much lower polygon counts.  This speeds up collision and karma, and reduces server CPU usage when there's LOTs of players playing.

==The Castles==

Go into lighting-only mode.  Notice that the castles are flat white?  That's because they have had a pre-rendered light map applied to them and have been marked as bUnlit.  I assume that these maps were made by some feature of [[Legacy:3D Studio Max|3D Studio Max]] that allows you to render lighting into a texture map.  These light maps are then combined with the texture maps on the castle using multi-texturing.

==The Materials==

The materials used on the static meshes in this map show off just about every feature there is.  Look through all of them and try to figure out how they work.

----

'''inio:''' I've been doing a lot of looking at this map the past week or two, so I figured I'd share what I've learned  If there's anything you'd like to see expanded or covered in more detail, just add a comment.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFBase</title>
    <id>773</id>
    <revision>
      <id>2203</id>
      <timestamp>2003-04-06T12:47:22Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <comment>Removed link to CTFBase in header.. We're in there already ;p</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; CTFBase}}

This is the parent class of xRealCTFBase, which is in turn the parent class of xBlueFlagBase and xRedFlagBase, which is what you'll actually place in the level for a [[Legacy:CTF|CTF]] map.

Normally there is no need to change any properties of any of these except for those inherited from the [[Legacy:GameObjective|GameObjective]] parent class, and those only for specialized bot support.</text>
    </revision>
    <revision>
      <id>2204</id>
      <timestamp>2003-01-03T05:17:24Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:CTFBase|CTFBase]] }}

This is the parent class of xRealCTFBase, which is in turn the parent class of xBlueFlagBase and xRedFlagBase, which is what you'll actually place in the level for a [[Legacy:CTF|CTF]] map.

Normally there is no need to change any properties of any of these except for those inherited from the [[Legacy:GameObjective|GameObjective]] parent class, and those only for specialized bot support.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFFlag</title>
    <id>848</id>
    <revision>
      <id>2366</id>
      <timestamp>2005-12-27T17:54:02Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>animation answer</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; [[Legacy:GameObject|GameObject]] &gt;&gt; CTFFlag}}

This is the flag in Capture the Flag. The two subclasses, [[Legacy:XBlueFlag|xBlueFlag]] and [[Legacy:XRedFlag|xRedFlag]], have their default properties set up with the corresponding skin and light color, and they also initate the animation loop.

&lt;code&gt;SameTeamTouch&lt;/code&gt; and &lt;code&gt;ValidHolder&lt;/code&gt; are the two functions most important to CTF gameplay.

==Properties==
; TeamNum : Which [[Legacy:Team_Number|team]] the flag belongs to.
; Team : The [[Legacy:UnrealTeamInfo|UnrealTeamInfo]] for the flag's team.
; OldHolder : The flag's previous holder.
; GRI : The current [[Legacy:GameReplicationInfo|GameReplicationInfo]]. Appalently not used outside of &lt;code&gt;UpdateForTeam&lt;/code&gt;.

==Methods==
; UpdateForTeam : Apply the team's symbol to the flag's skin.
; SetGRI : Calls &lt;code&gt;UpdateForTeam&lt;/code&gt;.
; SameTeam : Is the given [[Legacy:Controller|Controller]] on the flag's team?
; SameTeamTouch :  Overridden in &lt;code&gt;Dropped&lt;/code&gt; state.
; CheckPain : Overridden in &lt;code&gt;Dropped&lt;/code&gt; state.

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Calls &lt;code&gt;SetGRI&lt;/code&gt;.
; Landed : Return to standard &quot;on the ground&quot; orientation.
; FellOutOfWorld : Sends the flag home.

===Inherited from [[Legacy:GameObject|GameObject]]===
; SetHolder : Alert the [[Legacy:CTFSquadAI|CTFSquadAI]]s of the event.
; Drop : Gives the flag some velocity and random spin.
; ValidHolder : For teammates, calls &lt;code&gt;SameTeamTouch&lt;/code&gt;. Otherwise, enemy players can pick up the flag.
; LogReturned
; LogDropped

===Home state===
; SameTeamTouch : If the player is carrying a flag, a point is scored.
; LogTaken
; Timer : Makes sure the flag really is on the base.
; BeginState : Makes the base visible instead of the flag.
; EndState : Makes the flag visible instead of the base.

===Held state===
; Timer : Sends the flag home if the holder is somehow lost.
; BeginState : Just sets the timer. The [[Legacy:GameObject|GameObject]] function calls [[Legacy:UnrealPawn|UnrealPawn]].HoldGameObject to make the flag get physically carried.
; EndState

===Dropped state===
; SameTeamTouch : A teammate has touched the flag, so it goes home.
; LogTaken
; CheckFit : Make sure the flag can actually fit where it was dropped. Otherwise it goes home.
; CheckPain
; TakeDamage
; PhysicsVolumeChange
; BeginState : Sets up collision properties.
; EndState
; Timer : Broadcasts a message, then lets [[Legacy:GameObject|GameObject]] do the sending home.

==Known Subclasses==
* [[Legacy:XBlueFlag|xBlueFlag]]
* [[Legacy:XRedFlag|xRedFlag]]

==Related Topics==
* [[Legacy:CTFBase|CTFBase]]
* [[Legacy:CTFGame|CTFGame]]

==Discussion==

'''Uncommon:''' Anyone have an idea why the animation is set up in the subclasses? It's exactly the same in both.

'''SuperApe:''' These are Mesh animations.  See the [[Legacy:Mesh Browser|Mesh Browser]].

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2367</id>
      <timestamp>2004-01-29T19:03:18Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; [[Legacy:GameObject|GameObject]] &gt;&gt; CTFFlag}}

This is the flag in Capture the Flag. The two subclasses, [[Legacy:XBlueFlag|xBlueFlag]] and [[Legacy:XRedFlag|xRedFlag]], have their default properties set up with the corresponding skin and light color, and they also initate the animation loop.

&lt;code&gt;SameTeamTouch&lt;/code&gt; and &lt;code&gt;ValidHolder&lt;/code&gt; are the two functions most important to CTF gameplay.

'''Uncommon:''' Anyone have an idea why the animation is set up in the subclasses? It's exactly the same in both.

==Properties ==
; TeamNum : Which [[Legacy:Team_Number|team]] the flag belongs to.
; Team : The [[Legacy:UnrealTeamInfo|UnrealTeamInfo]] for the flag's team.
; OldHolder : The flag's previous holder.
; GRI : The current [[Legacy:GameReplicationInfo|GameReplicationInfo]]. Appalently not used outside of &lt;code&gt;UpdateForTeam&lt;/code&gt;.

==Methods==
; UpdateForTeam : Apply the team's symbol to the flag's skin.
; SetGRI : Calls &lt;code&gt;UpdateForTeam&lt;/code&gt;.

; SameTeam : Is the given [[Legacy:Controller|Controller]] on the flag's team?
; SameTeamTouch :  Overridden in &lt;code&gt;Dropped&lt;/code&gt; state.
; CheckPain : Overridden in &lt;code&gt;Dropped&lt;/code&gt; state.

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Calls &lt;code&gt;SetGRI&lt;/code&gt;.
; Landed : Return to standard &quot;on the ground&quot; orientation.
; FellOutOfWorld : Sends the flag home.

===Inherited from [[Legacy:GameObject|GameObject]]===
; SetHolder : Alert the [[Legacy:CTFSquadAI|CTFSquadAI]]s of the event.
; Drop : Gives the flag some velocity and random spin.
; ValidHolder : For teammates, calls &lt;code&gt;SameTeamTouch&lt;/code&gt;. Otherwise, enemy players can pick up the flag.
; LogReturned
; LogDropped

===Home state===
; SameTeamTouch : If the player is carrying a flag, a point is scored.
; LogTaken
; Timer : Makes sure the flag really is on the base.
; BeginState : Makes the base visible instead of the flag.
; EndState : Makes the flag visible instead of the base.

===Held state===
; Timer : Sends the flag home if the holder is somehow lost.
; BeginState : Just sets the timer. The [[Legacy:GameObject|GameObject]] function calls [[Legacy:UnrealPawn|UnrealPawn]].HoldGameObject to make the flag get physically carried.
; EndState

===Dropped state===
; SameTeamTouch : A teammate has touched the flag, so it goes home.
; LogTaken
; CheckFit : Make sure the flag can actually fit where it was dropped. Otherwise it goes home.
; CheckPain
; TakeDamage
; PhysicsVolumeChange
; BeginState : Sets up collision properties.
; EndState
; Timer : Broadcasts a message, then lets [[Legacy:GameObject|GameObject]] do the sending home.

==Known Subclasses==
* [[Legacy:XBlueFlag|xBlueFlag]]
* [[Legacy:XRedFlag|xRedFlag]]

==Related Topics==
* [[Legacy:CTFBase|CTFBase]]
* [[Legacy:CTFGame|CTFGame]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFFlag (UT)</title>
    <id>28395</id>
    <revision>
      <id>40067</id>
      <timestamp>2009-11-15T08:24:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFGame</title>
    <id>846</id>
    <revision>
      <id>2361</id>
      <timestamp>2005-12-02T23:54:22Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; CTFGame}}

==Functions==

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Calls SetTeamFlags.

===Inherited from [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]===
; SpawnWait

===Inherited from [[Legacy:GameInfo|GameInfo]]===
; Logout : Make a player drop his flags when he leaves.
; CheckEndGame : Set the focus to the winning team's flag at the end.
; DiscardInventory : Make players drop their flags along with everything else.

===Other Methods===
; SetTeamFlags : Hook up the flags with the [[Legacy:CTFTeamAI|CTFTeamAI]] objects.
; ScoreFlag : Called when a flag is scored or returned.

==Known subclasses ==
* [[Legacy:XCTFGame|xCTFGame]]
* [[Legacy:XVehicleCTFGame|xVehicleCTFGame]]

==Related Topics ==
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; A little more description on the function definitions (arguments, return variable types, etc.)
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2362</id>
      <timestamp>2004-01-29T06:20:53Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; CTFGame}}

==Methods ==

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Calls SetTeamFlags.

===Inherited from [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]===
; SpawnWait

===Inherited from [[Legacy:GameInfo|GameInfo]]===
; Logout : Make a player drop his flags when he leaves.
; CheckEndGame : Set the focus to the winning team's flag at the end.
; DiscardInventory : Make players drop their flags along with everything else.

===Other Methods===
; SetTeamFlags : Hook up the flags with the [[Legacy:CTFTeamAI|CTFTeamAI]] objects.
; ScoreFlag : Called when a flag is scored or returned.

==Known subclasses ==
* [[Legacy:XCTFGame|xCTFGame]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2363</id>
      <timestamp>2005-10-31T17:39:34Z</timestamp>
      <contributor>
        <ip>Pool0829.cvx7-bradley.dialup.earthlink.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; CTFGame}}

==Methods ==

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Calls SetTeamFlags.

===Inherited from [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]===
; SpawnWait

===Inherited from [[Legacy:GameInfo|GameInfo]]===
; Logout : Make a player drop his flags when he leaves.
; CheckEndGame : Set the focus to the winning team's flag at the end.
; DiscardInventory : Make players drop their flags along with everything else.

===Other Methods===
; SetTeamFlags : Hook up the flags with the [[Legacy:CTFTeamAI|CTFTeamAI]] objects.
; ScoreFlag : Called when a flag is scored or returned.

==Known subclasses ==
* [[Legacy:XCTFGame|xCTFGame]]
* [[Legacy:XVehicleCTFGame|xVehicleCTFGame]]

==Related Topics ==
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFGame (P2)</title>
    <id>28894</id>
    <revision>
      <id>42824</id>
      <timestamp>2010-03-31T11:03:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFGame (UT)</title>
    <id>766</id>
    <revision>
      <id>2187</id>
      <timestamp>2004-05-22T19:56:30Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; [[Legacy:TeamGamePlus|TeamGamePlus]] &gt;&gt; CTFGame (Package: BotPack)}}

CTF is a standard Unreal Tournament game type.

Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

'''Note:''' CTF code doesn't correctly handle non-player Pawns like [[Legacy:TeamCannon|TeamCannon]] and other [[Legacy:StationaryPawn|StationaryPawn]]s.

See [[Legacy:CTFGame|CTFGame]] and [[Legacy:XCTFGame|xCTFGame]] for the UT2003 version(s) of this class.

==Properties ==
; sound CaptureSound[4] : Capture sounds for each flag. This variable and other parts of the CTF code are designed for four teams although CTF is a two-team game type.
; sound ReturnSound : Sound for returning the flag.
; float LastGotFlag : Indicates the last time a bot sent the voice message, &quot;I've got our flag.&quot; The game ensures that at least six seconds must pass between instances of this voice message, so you don't get flooded with them.
; float LastSeeFlagCarrier : Same as LastGotFlag, but used for the message, &quot;Enemy flag carrier is here!&quot;

==Methods ==
; ScoreFlag ([[Legacy:Pawn (UT)|Pawn (UT)]] Scorer, [[Legacy:CTFFlag (UT)|CTFFlag (UT)]] theFlag) : 
; bool FindPathToBase ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:FlagBase|FlagBase]] aBase) : 

==Related Topics ==
* [[Legacy:Mapping For CTF|Mapping for CTF]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2188</id>
      <timestamp>2004-01-29T06:36:05Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; [[Legacy:TeamGamePlus|TeamGamePlus]] &gt;&gt; CTFGame (Package: BotPack)}}

CTF is a standard Unreal Tournament game type.

Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

'''Note:''' CTF code doesn't correctly handle non-player Pawns like [[Legacy:TeamCannon|TeamCannon]] and other [[Legacy:StationaryPawn|StationaryPawn]]s.

See [[Legacy:CTFGame|CTFGame]] and [[Legacy:XCTFGame|xCTFGame]] for the UT2003 version(s) of this class.

==Properties ==
; sound CaptureSound[4] : Capture sounds for each flag. This variable and other parts of the CTF code are designed for four teams although CTF is a two-team game type.
; sound ReturnSound : Sound for returning the flag.
; float LastGotFlag : 
; float LastSeeFlagCarrier : 

==Methods ==
; ScoreFlag ([[Legacy:Pawn (UT)|Pawn (UT)]] Scorer, [[Legacy:CTFFlag (UT)|CTFFlag (UT)]] theFlag) : 
; bool FindPathToBase ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:FlagBase|FlagBase]] aBase) : 

==Related Topics ==
* [[Legacy:Mapping For CTF|Mapping for CTF]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFHUDMessage</title>
    <id>899</id>
    <revision>
      <id>2481</id>
      <timestamp>2005-06-14T20:03:19Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An example of a simple Localizedmessage, &lt;code&gt;CTFHUDMessage&lt;/code&gt;.

&lt;uscript&gt;
class CTFHUDMessage extends LocalMessage;

// CTF Messages
//
// Switch 0: You have the flag message.
//
// Switch 1: Enemy has the flag message.

var(Message) localized string YouHaveFlagString;
var(Message) localized string EnemyHasFlagString;
var(Message) color RedColor, YellowColor;

static function color GetColor(
	optional int Switch,
	optional PlayerReplicationInfo RelatedPRI_1, 
	optional PlayerReplicationInfo RelatedPRI_2
	)
{
	if (Switch == 0)
		return Default.YellowColor;
	else
		return Default.RedColor;
}

static function string GetString(
	optional int Switch,
	optional PlayerReplicationInfo RelatedPRI_1, 
	optional PlayerReplicationInfo RelatedPRI_2,
	optional Object OptionalObject
	)
{
	if (Switch == 0)
	    return Default.YouHaveFlagString;
    else
	    return Default.EnemyHasFlagString;
}

defaultproperties
{
     YouHaveFlagString=&quot;You have the flag, return to base!&quot;
     EnemyHasFlagString=&quot;The enemy has your flag, recover it!&quot;
     RedColor=(R=255,A=255)
     YellowColor=(G=255,R=255,A=255)
     bIsPartiallyUnique=True
     bIsConsoleMessage=False
     bFadeMessage=True
     Lifetime=1
     DrawColor=(G=160,R=0)
     StackMode=SM_Down
     PosY=0.100000
     FontSize=1
}

&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>2482</id>
      <timestamp>2005-06-14T20:02:21Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An example of a simple Localizedmessage, @@CTFHUDMessage@@.

&lt;uscript&gt;
class CTFHUDMessage extends LocalMessage;

// CTF Messages
//
// Switch 0: You have the flag message.
//
// Switch 1: Enemy has the flag message.

var(Message) localized string YouHaveFlagString;
var(Message) localized string EnemyHasFlagString;
var(Message) color RedColor, YellowColor;

static function color GetColor(
	optional int Switch,
	optional PlayerReplicationInfo RelatedPRI_1, 
	optional PlayerReplicationInfo RelatedPRI_2
	)
{
	if (Switch == 0)
		return Default.YellowColor;
	else
		return Default.RedColor;
}

static function string GetString(
	optional int Switch,
	optional PlayerReplicationInfo RelatedPRI_1, 
	optional PlayerReplicationInfo RelatedPRI_2,
	optional Object OptionalObject
	)
{
	if (Switch == 0)
	    return Default.YouHaveFlagString;
    else
	    return Default.EnemyHasFlagString;
}

defaultproperties
{
     YouHaveFlagString=&quot;You have the flag, return to base!&quot;
     EnemyHasFlagString=&quot;The enemy has your flag, recover it!&quot;
     RedColor=(R=255,A=255)
     YellowColor=(G=255,R=255,A=255)
     bIsPartiallyUnique=True
     bIsConsoleMessage=False
     bFadeMessage=True
     Lifetime=1
     DrawColor=(G=160,R=0)
     StackMode=SM_Down
     PosY=0.100000
     FontSize=1
}

&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFMessage</title>
    <id>28896</id>
    <revision>
      <id>42826</id>
      <timestamp>2010-03-31T11:03:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFReplicationInfo</title>
    <id>708</id>
    <revision>
      <id>2055</id>
      <timestamp>2003-05-27T10:04:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:GameReplicationInfo (UT)|GameReplicationInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]] &gt;&gt; CTFReplicationInfo}}

Extends [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]] by a list of [[Legacy:CTF|CTF]] flags for up to four teams.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2056</id>
      <timestamp>2002-04-17T17:06:03Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:GameReplicationInfo|GameReplicationInfo]] &gt;&gt; [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]] &gt;&gt; CTFReplicationInfo}}

Extends [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]] by a list of [[Legacy:CTF|CTF]] flags for up to four teams.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFSquadAI</title>
    <id>850</id>
    <revision>
      <id>2370</id>
      <timestamp>2005-12-21T05:38:05Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:SquadAI|SquadAI]] &gt;&gt; CTFSquadAI}}

CTFSquadAI contains all of the AI code for Capture the Flag. &lt;tt&gt;CheckSquadObjectives&lt;/tt&gt; is where most of the action is.

==Properties==
; LastSeeFlagCarrier : The last time the enemy flag carrier was seen by a squad member
; FriendlyFlag : The team's [[Legacy:CTFFlag|CTFFlag]].
; EnemyFlag : The enemy team's flag.
; ReturnPath : The next [[Legacy:AssaultPath|AssaultPath]] on the way back to base for the flag carrier.
; ReturnPathTag : The tag of the path that the flag carrier is following.

==Methods==
; AssignCombo : Doesn't do combos while the squad is attacking.
; AllowDetourTo : Allows the flag carrier to detour only in certain circumstances, such as if the home flag needs to be recovered.
; FindPathToObjective : This is where &lt;tt&gt;ReturnPath&lt;/tt&gt; is used.
; AllowTranslocationBy : Doesn't let bots with flags translocate.
; GoPickupFlag : Tells a bot to go touch and return the team's flag.
; FormationCenter : Either the SquadObjective (the enemy flag base), the enemy flag carrier, or the squad leader, in that order.
; OrdersForFlagCarrier : Separates out the flag carrier logic from &lt;tt&gt;CheckSquadObjectives&lt;/tt&gt;.
; MustKeepEnemy : Don't give up on the enemy flag carrier.
; NearEnemyBase : In the same zone as the enemy flag (if the flags are in different zones), or use &lt;tt&gt;BotNearObjective&lt;/tt&gt; (from [[Legacy:GameObjective|GameObjective]]).
; NearHomeBase : Essentially the opposite of &lt;tt&gt;NearEnemyBase&lt;/tt&gt;.
; FlagNearBase : Is the flag reasonably close to its base?
; CheckSquadObjectives : The main AI decision-making function.
; EnemyFlagTakenBy : A squad member has picked up the enemy flag. Called by &lt;tt&gt;[[Legacy:CTFFlag|CTFFlag]].SetHolder&lt;/tt&gt;.
; AllowTaunt : Don't taunt if you're carrying a flag or if your team's flag is out.
; ShouldDeferTo : Always defer to the flag carrier.
; PriorityObjective : Depends on whethere the bot is carrying a flag, whether it's close to scoring, and if the team's flag is out.
; ModifyThreat : Threat level is higher near the enemy flag base.

==Related Topics==
* [[Legacy:CTFGame|CTFGame]]
* [[Legacy:CTFTeamAI|CTFTeamAI]]
* [[Legacy:CTFFlag|CTFFlag]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For CTF|Mapping for CTF]]
** [[Legacy:Mapping For VCTF|Mapping for VCTF]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2371</id>
      <timestamp>2004-01-30T19:53:27Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] -&gt; [[Legacy:Info|Info]] -&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] -&gt; [[Legacy:SquadAI|SquadAI]] -&gt; CTFSquadAI}}

CTFSquadAI contains all of the AI code for Capture the Flag. &lt;tt&gt;CheckSquadObjectives&lt;/tt&gt; is where most of the action is.

==Properties==
; LastSeeFlagCarrier : The last time the enemy flag carrier was seen by a squad member
; FriendlyFlag : The team's [[Legacy:CTFFlag|CTFFlag]].
; EnemyFlag : The enemy team's flag.
; ReturnPath : The next [[Legacy:AssaultPath|AssaultPath]] on the way back to base for the flag carrier.
; ReturnPathTag : The tag of the path that the flag carrier is following.

==Methods==
; AssignCombo : Doesn't do combos while the squad is attacking.
; AllowDetourTo : Allows the flag carrier to detour only in certain circumstances, such as if the home flag needs to be recovered.
; FindPathToObjective : This is where &lt;tt&gt;ReturnPath&lt;/tt&gt; is used.
; AllowTranslocationBy : Doesn't let bots with flags translocate.
; GoPickupFlag : Tells a bot to go touch and return the team's flag.
; FormationCenter : Either the SquadObjective (the enemy flag base), the enemy flag carrier, or the squad leader, in that order.
; OrdersForFlagCarrier : Separates out the flag carrier logic from &lt;tt&gt;CheckSquadObjectives&lt;/tt&gt;.
; MustKeepEnemy : Don't give up on the enemy flag carrier.
; NearEnemyBase : In the same zone as the enemy flag (if the flags are in different zones), or use &lt;tt&gt;BotNearObjective&lt;/tt&gt; (from [[Legacy:GameObjective|GameObjective]]).
; NearHomeBase : Essentially the opposite of &lt;tt&gt;NearEnemyBase&lt;/tt&gt;.
; FlagNearBase : Is the flag reasonably close to its base?
; CheckSquadObjectives : The main AI decision-making function.
; EnemyFlagTakenBy : A squad member has picked up the enemy flag. Called by &lt;tt&gt;[[Legacy:CTFFlag|CTFFlag]].SetHolder&lt;/tt&gt;.
; AllowTaunt : Don't taunt if you're carrying a flag or if your team's flag is out.
; ShouldDeferTo : Always defer to the flag carrier.
; PriorityObjective : Depends on whethere the bot is carrying a flag, whether it's close to scoring, and if the team's flag is out.
; ModifyThreat : Threat level is higher near the enemy flag base.

==Related Classes==
* [[Legacy:CTFGame|CTFGame]]
* [[Legacy:CTFTeamAI|CTFTeamAI]]
* [[Legacy:CTFFlag|CTFFlag]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2372</id>
      <timestamp>2004-01-30T20:18:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; [[Legacy:SquadAI|SquadAI]] &gt;&gt; CTFSquadAI}}

CTFSquadAI contains all of the AI code for Capture the Flag. &lt;tt&gt;CheckSquadObjectives&lt;/tt&gt; is where most of the action is.

==Properties==
; LastSeeFlagCarrier : The last time the enemy flag carrier was seen by a squad member
; FriendlyFlag : The team's [[Legacy:CTFFlag|CTFFlag]].
; EnemyFlag : The enemy team's flag.
; ReturnPath : The next [[Legacy:AssaultPath|AssaultPath]] on the way back to base for the flag carrier.
; ReturnPathTag : The tag of the path that the flag carrier is following.

==Methods==
; AssignCombo : Doesn't do combos while the squad is attacking.
; AllowDetourTo : Allows the flag carrier to detour only in certain circumstances, such as if the home flag needs to be recovered.
; FindPathToObjective : This is where &lt;tt&gt;ReturnPath&lt;/tt&gt; is used.
; AllowTranslocationBy : Doesn't let bots with flags translocate.
; GoPickupFlag : Tells a bot to go touch and return the team's flag.
; FormationCenter : Either the SquadObjective (the enemy flag base), the enemy flag carrier, or the squad leader, in that order.
; OrdersForFlagCarrier : Separates out the flag carrier logic from &lt;tt&gt;CheckSquadObjectives&lt;/tt&gt;.
; MustKeepEnemy : Don't give up on the enemy flag carrier.
; NearEnemyBase : In the same zone as the enemy flag (if the flags are in different zones), or use &lt;tt&gt;BotNearObjective&lt;/tt&gt; (from [[Legacy:GameObjective|GameObjective]]).
; NearHomeBase : Essentially the opposite of &lt;tt&gt;NearEnemyBase&lt;/tt&gt;.
; FlagNearBase : Is the flag reasonably close to its base?
; CheckSquadObjectives : The main AI decision-making function.
; EnemyFlagTakenBy : A squad member has picked up the enemy flag. Called by &lt;tt&gt;[[Legacy:CTFFlag|CTFFlag]].SetHolder&lt;/tt&gt;.
; AllowTaunt : Don't taunt if you're carrying a flag or if your team's flag is out.
; ShouldDeferTo : Always defer to the flag carrier.
; PriorityObjective : Depends on whethere the bot is carrying a flag, whether it's close to scoring, and if the team's flag is out.
; ModifyThreat : Threat level is higher near the enemy flag base.

==Related Classes==
* [[Legacy:CTFGame|CTFGame]]
* [[Legacy:CTFTeamAI|CTFTeamAI]]
* [[Legacy:CTFFlag|CTFFlag]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CTFTeamAI</title>
    <id>28393</id>
    <revision>
      <id>40065</id>
      <timestamp>2009-11-15T08:24:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CVS</title>
    <id>717</id>
    <revision>
      <id>2074</id>
      <timestamp>2006-03-28T22:05:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''CVS''' (Concurrent Versions System) is a [[Legacy:Version Control|Version Control]] system: it allows development teams to keep track of collectively edited files.  It works for arbitary files much like the Wiki does for pages, but with much smarter handling of concurrent edits of the same text files (like source code files):  Edits that don't collide (on a per-line basis) are merged into one document.

The Unreal Wiki's scripts and styles are maintained in a CVS repository.  See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki]] for more information and for a quick walkthrough on using CVS.

==Idea==

{{innerbox| I can't imagine programming without it... that would be like parachuting without a parachute!

 : ''Brian Fitzpatrick''

}}

Users ''check out'' a ''module'' from a ''repository'', thus getting a work copy of it.  By ''updating'' that work copy they can get the latest version of that module from the repository; non-colliding edits of text files are ''merged'' into the local files (rather than overwriting local changes).  After updating, users can ''commit'' their changes to the repository along with a ''log entry''.  (Editing ''collisions'' must be resolved manually after updating the local copy before being able to commit changes.)

CVS keeps track of all changes and allows users to view every file's ''history'' (the list of log entries associated with a file) and any prior version of a file.

See also http://www.cvshome.org.

==Setup==

CVS is based on a client/server architecture, even if both client and server run on the same machine (and perhaps offline).  That architecture makes it very easy for whole development teams to access a single repository that always keeps the most current files.

CVS and most (all?) of its clients are [http://www.opensource.org/docs/definition.html Open Source] and thus '''free of charge'''.

===Windows===

====Client====
; CVS Command Line Client : Stand-alone command line tool; most other (graphical) clients are just front-ends for this one. &lt;br /&gt;http://www.cvshome.org/dev/codewindow.html

; TortoiseCVS : TortoiseCVS lets you work with files under CVS version control directly from Windows Explorer. It's freely available under the GPL. &lt;br /&gt;http://www.tortoisecvs.org

; WinCvs : Graphical front-end for the CVS command-line client for Windows.  Includes the command-line client. &lt;br /&gt;http://www.wincvs.org (mirrored at http://cvsgui.sourceforge.net)

; LinCVS : Powerful and easy to use graphical frontend for the CVS command-line client. It runs on Windows, Linux/Unix and Mac OS X. &lt;br /&gt;http://www.lincvs.org

; WOTgreal: All-round coding development tool for UnrealScript &amp;ndash; now includes simple source control for CVS repositories (update, commit, add). &lt;br /&gt;http://www.wotgreal.com

Links to more graphical CVS front-ends for Windows can also be found on the [http://www.cvshome.org/dev/codewindow.html command line client download page].

====Server====
; CVS Server for NT : Runs as a Windows NT service. &lt;br /&gt;http://www.cvsnt.org

Using the ''passwd file'' authentication method is probably the most convenient way to go unless you want to create user accounts for all CVS users on your NT system.  For the ''passwd file'' method to work, create a (single) Windows NT user with exactly the permissions necessary to read/write-access the repository and specify it as your users' ''real user name'' in the &lt;code&gt;passwd&lt;/code&gt; file you're creating.

===Mac===

====Client====
; MacCvs : WinCvs's Mac brother. (Not to be confused with MacCVS below.)&lt;br /&gt;http://www.cvsgui.org

; MacCVS : CVS client for the Mac, sponsored by Netscape and Mozilla.org.  (Not to be confused with MacCvs above.  Note the different spelling.) &lt;br /&gt;http://www.maccvs.org

; LinCVS : Powerful and easy to use graphical frontend for the CVS command-line client. It runs on Windows, Linux/Unix and Mac OS X. &lt;br /&gt;http://www.lincvs.org

===Unix/Linux===

CVS is bundled with most distributions.  Check &lt;code&gt;man cvs&lt;/code&gt; for more information.

; LinCVS : Powerful and easy to use graphical frontend for the CVS command-line client. It runs on Windows, Linux/Unix and Mac OS X. &lt;br /&gt;http://www.lincvs.org

==Troubleshooting==
; How do I rename a file in a CVS repository? : The simplest way is by deleting the file with its old name and re-adding it with its new name; that way you lose its entire logging history though. If you have direct file system access to the repository directory, you can also [http://www.astro.cf.ac.uk/cgi-bin/info2www?(cvs)Rename%20by%20copying rename by copying] &amp;ndash; that method keeps the file's history and still allows you to check out old revisions by tag (though not by date).

; Help!  It says we have a lock but no one is doing anything! : Go into the CVS home of the project you're working on and delete any files named #cvs.lock or anything similar.  Have the person who created the lock attempt to check in or out again to see if the problem reappears before deciding it's been dealt with.  The easiest solution if the problem becomes chronic is to have the developer who's causing locks to recheckout everything from CVS.

; It says my password is incorrect, but I've double checked it. : Passwords are case sensitive for most systems.  Ensure that the password was typed in the case that you're attempting to use.  The problem might not be your password, it might also be your username.  Most modern systems won't tell you whether the username or password is incorrect to keep crackers from guessing usernames.

; I just deleted a file and re-added it.  The only difference was in capitalization, but now the CVS repository is acting plain crazy! : Simple answer:  Don't do this.  Not unless you plan on editing the repository files by hand.  To solve the problem remove the old, miscapitalized file from the CVS repository Attic, and any copies of the file from the repository itself.  Then re-add the file to the repository, recommit it, and you should be good to go.  The first paragraph above, &quot;Help!  It says we have a lock but no one is doing anything!&quot; can be caused by trying to rename a file with only capitalization changes.

==External Links==
* [[Wiki:ConcurrentVersionsSystem]]
* [http://www.sourceforge.org SourceForge], an Open Source development site offering version control, bug tracking and much more to Open Source developers.

==Related Topics==
* [[Legacy:Version Control|Version Control]]

==Discussion==

'''pakman:''' Added link to a mirror for WinCVS, original link was dead month ago, though works now.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2075</id>
      <timestamp>2006-01-05T06:09:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''CVS''' (Concurrent Versions System) is a system that allows development teams to keep track of collectively edited files.  It works for arbitary files much like the Wiki does for pages, but with much smarter handling of concurrent edits of the same text files (like source code files):  Edits that don't collide (on a per-line basis) are merged into one document.

The Unreal Wiki's scripts and styles are maintained in a CVS repository.  See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki]] for more information and for a quick walkthrough on using CVS.

==Idea==

{{innerbox| I can't imagine programming without it... that would be like parachuting without a parachute!

 : ''Brian Fitzpatrick''

}}

Users ''check out'' a ''module'' from a ''repository'', thus getting a work copy of it.  By ''updating'' that work copy they can get the latest version of that module from the repository; non-colliding edits of text files are ''merged'' into the local files (rather than overwriting local changes).  After updating, users can ''commit'' their changes to the repository along with a ''log entry''.  (Editing ''collisions'' must be resolved manually after updating the local copy before being able to commit changes.)

CVS keeps track of all changes and allows users to view every file's ''history'' (the list of log entries associated with a file) and any prior version of a file.

See also http://www.cvshome.org.

==Setup==

CVS is based on a client/server architecture, even if both client and server run on the same machine (and perhaps offline).  That architecture makes it very easy for whole development teams to access a single repository that always keeps the most current files.

CVS and most (all?) of its clients are [http://www.opensource.org/docs/definition.html Open Source] and thus '''free of charge'''.

===Windows===

====Client====
; CVS Command Line Client : Stand-alone command line tool; most other (graphical) clients are just front-ends for this one. &lt;br /&gt;http://www.cvshome.org/dev/codewindow.html

; TortoiseCVS : TortoiseCVS lets you work with files under CVS version control directly from Windows Explorer. It's freely available under the GPL. &lt;br /&gt;http://www.tortoisecvs.org

; WinCvs : Graphical front-end for the CVS command-line client for Windows.  Includes the command-line client. &lt;br /&gt;http://www.wincvs.org (mirrored at http://cvsgui.sourceforge.net)

; LinCVS : Powerful and easy to use graphical frontend for the CVS command-line client. It runs on Windows, Linux/Unix and Mac OS X. &lt;br /&gt;http://www.lincvs.org

; WOTgreal: All-round coding development tool for UnrealScript &amp;ndash; now includes simple source control for CVS repositories (update, commit, add). &lt;br /&gt;http://www.wotgreal.com

Links to more graphical CVS front-ends for Windows can also be found on the [http://www.cvshome.org/dev/codewindow.html command line client download page].

====Server====
; CVS Server for NT : Runs as a Windows NT service. &lt;br /&gt;http://www.cvsnt.org

Using the ''passwd file'' authentication method is probably the most convenient way to go unless you want to create user accounts for all CVS users on your NT system.  For the ''passwd file'' method to work, create a (single) Windows NT user with exactly the permissions necessary to read/write-access the repository and specify it as your users' ''real user name'' in the &lt;code&gt;passwd&lt;/code&gt; file you're creating.

===Mac===

====Client====
; MacCvs : WinCvs's Mac brother. (Not to be confused with MacCVS below.)&lt;br /&gt;http://www.cvsgui.org

; MacCVS : CVS client for the Mac, sponsored by Netscape and Mozilla.org.  (Not to be confused with MacCvs above.  Note the different spelling.) &lt;br /&gt;http://www.maccvs.org

; LinCVS : Powerful and easy to use graphical frontend for the CVS command-line client. It runs on Windows, Linux/Unix and Mac OS X. &lt;br /&gt;http://www.lincvs.org

===Unix/Linux===

CVS is bundled with most distributions.  Check &lt;code&gt;man cvs&lt;/code&gt; for more information.

; LinCVS : Powerful and easy to use graphical frontend for the CVS command-line client. It runs on Windows, Linux/Unix and Mac OS X. &lt;br /&gt;http://www.lincvs.org

==Troubleshooting==
; How do I rename a file in a CVS repository? : The simplest way is by deleting the file with its old name and re-adding it with its new name; that way you lose its entire logging history though. If you have direct file system access to the repository directory, you can also [http://www.astro.cf.ac.uk/cgi-bin/info2www?(cvs)Rename%20by%20copying rename by copying] &amp;ndash; that method keeps the file's history and still allows you to check out old revisions by tag (though not by date).

; Help!  It says we have a lock but no one is doing anything! : Go into the CVS home of the project you're working on and delete any files named #cvs.lock or anything similar.  Have the person who created the lock attempt to check in or out again to see if the problem reappears before deciding it's been dealt with.  The easiest solution if the problem becomes chronic is to have the developer who's causing locks to recheckout everything from CVS.

; It says my password is incorrect, but I've double checked it. : Passwords are case sensitive for most systems.  Ensure that the password was typed in the case that you're attempting to use.  The problem might not be your password, it might also be your username.  Most modern systems won't tell you whether the username or password is incorrect to keep crackers from guessing usernames.

; I just deleted a file and re-added it.  The only difference was in capitalization, but now the CVS repository is acting plain crazy! : Simple answer:  Don't do this.  Not unless you plan on editing the repository files by hand.  To solve the problem remove the old, miscapitalized file from the CVS repository Attic, and any copies of the file from the repository itself.  Then re-add the file to the repository, recommit it, and you should be good to go.  The first paragraph above, &quot;Help!  It says we have a lock but no one is doing anything!&quot; can be caused by trying to rename a file with only capitalization changes.

==External Links==
* [[Wiki:ConcurrentVersionsSystem]]
* [http://www.sourceforge.org SourceForge], an Open Source development site offering version control, bug tracking and much more to Open Source developers.

==Related Topics==
* [[Legacy:Version Control|Version Control]]

==Discussion==

'''pakman:''' Added link to a mirror for WinCVS, original link was dead month ago, though works now.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CVS/Wiki</title>
    <id>718</id>
    <revision>
      <id>2076</id>
      <timestamp>2003-01-09T22:39:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>* how does it know where to send it</comment>
      <text xml:space="preserve">The Unreal Wiki's scripts and styles (and various other files, like the user interface graphics) are maintained in a CVS repository.  Send an email to mychaeel@beyondunreal.com if you feel you'd like to have access to this repository (with a short explanation why, if it's not evident).

A more general introduction to [[Legacy:CVS|CVS]] is available on, well, [[Legacy:CVS|CVS]].

==Getting Started ==

Head over to [[Legacy:CVS|CVS]], select a CVS client of your choice for your operating system and install it.  I'll be explaining the steps using [http://www.wincvs.org WinCvs], but generally they're always the same.




[[Image:Legacy_cvs-checkout-settings.gif|right|]]

First thing you'll have to do after this is '''checking out''' the files from the repository.  You'll only have to do this once; see &quot;Updating&quot; below for how to get the latest versions of the files later.  Select ''Create'' -&gt; ''Checkout module'', and you'll be presented with the following dialog box.

* In the ''Enter the module name and path'' field (at the top), enter &lt;code&gt;UnrealWiki&lt;/code&gt;.  That is the name I have given the entire bunch of files in the repository.

* In the ''Local folder to checkout to'', enter (or better: select using the button with the three dots to the right of this field) the folder on your harddisk you want the files to be copied to.  Note that the client will create a subdirectory &lt;code&gt;UnrealWiki&lt;/code&gt; in the folder you select.  If you don't like that name, click the ''Override'' checkbox above and enter whatever other name is more to your liking in the ''Checkout as'' field.

[[Image:Legacy_cvs-checkout-general.gif|right|]]

After that, click the ''General'' tab.

* The ''CVSROOT'' setting contains your '''user name''', the '''CVS server address''' and the '''repository location''' on that server.  If you send me an email as detailed above, I'll give you this information.

* In the ''Authentication'' drop-down box select &quot;passwd file on the cvs server&quot;.

[[Image:Legacy_cvs-checkout-globals.gif|right|]]

Then click the ''Globals'' tab.

* Uncheck the ''Checkout read-only'' option.

* If you're on a really slow Internet connection, you can check ''Use TCP/IP compression'' to have the data transparently compressed before it's sent to or received from the CVS server.  If you have a really fast connection, the processing overhead required by that compression usually takes more time than using it saves.




Make sure you're '''connected to the Internet''' and click ''OK''.  The client will then connect to the CVS server and download all files, copying them to your harddisk at the location you specified.  Congrats!  There they are.

'''Mychaeel:'''  Somewhere in the process you'll have to enter your password... can't remember exactly where though, I'm afraid.  I'll use tarquin to find out.  ;-)

'''Tarquin:''' I'm not sure either. I'm in the process of getting Wikipedia's code.  I had to do Menu -&gt; Admin -&gt; Login... to give a password, but that was after an unsuccessful attempt, which meant CVS picked up ''where'' I was trying to log into (the login dialog has only a field for the password. So if you do that first, how does it know where to send it?).

==Updating ==

To get the latest versions of the files in your work directory after you initially checked them out, you'll have to '''update''' your working copy.




[[Image:Legacy_cvs-update.gif|right|]]

For that, select the directory or the file (or multiple files) you want to update in WinCvs's browser.  Select ''Modify'' -&gt; ''Update selection'' and you'll be presented with this dialog box.

* The option ''Create missing directories that exist in the repository'' is handy if you know that somebody added a directory (with files in it) in the repository.  Otherwise you can leave it off.

* Use ''Get the clean copy'' if you messed with the files in your local working copy but want to discard those changes.  The client will create a backup copy of those files on your harddisk and overwrite the originals with the latest versions from the repository.

Note that updating a file doesn't discard or overwrite any changes you made on it.  Changes that were committed since you updated the last time will be merged with your local copy &amp;ndash; after that process you'll have a file that contains your own changes ''and'' the changes other people made and committed to the repository.

If a change you made ''collides'' with another one of another person, you'll get an '''edit conflict''' and will be warned by the client.  Then you'll have to manually go through the affected file and sort everything out before you can commit your own changes.



If you just want to see what was changed without actually updating anything, select ''Query'' -&gt; ''Query update'' and watch WinCvs's log window.  It'll give you the same information it gives you when actually updating, but it'll keep your files (and the repository's files) untouched.

==Committing Changes ==

You can edit your local copy at will.  When you've changed something you want to put back in the repository, you'll have to '''commit''' your changes.

'''Before you commit, always update''' (see above).  If you're lucky, CVS will refuse to work if you made any changes that conflict with other changes that were committed by other people since you made your last update.  If you're less lucky, the client will hang or crash.

[[Image:Legacy_cvs-commit.gif|right|]]

To do that, select the files you have changed in WinCvs's browser and select ''Modify'' -&gt; ''Commit selection''.  A dialog box pops up that asks you to enter a log message.

* Only commit stuff that '''actually works''' (compiles without errors, is parsed correctly, or whatever is applicable).

* Always '''commit files with cross-dependent changes at the same time.'''  In the example in the screenshot, I've changed the [[Legacy:Wookee|Wookee]] formatter to generate HTML that requires a new CSS style; so I'm committing the changed .css files that include this new style along.

* Related to the previous item:  '''Don't commit files that have unrelated changes at the same time.'''  Every change deserves its own log message.

* '''Make your log messages verbose''' &amp;ndash; we'd like to be able to understand what you did (and possibly why you did it).  Include the names of the files you changed (along the lines of what's shown in the screenshot) so we can quickly see which files are affected by the change you committed.

Click ''OK'' and the client will upload your changes to the CVS server.

==Questions? ==

This is Wiki.  Add them here.

----

'''Tarquin:'''  Any particular reason why all the files in my CVS directory are read-only?

'''Mychaeel:'''  There's a &quot;Checkout read-only&quot; option in the &quot;General&quot; tab of the dialog box that appears when checking out files.  Do you have that enabled?  (I thought it was disabled by default; if it's not, I'll have to add that to the description above.)

'''Tarquin:'''  It was checked by default. 

'''Tarquin:'''  Fixed. I changed their status from windows ... I'll see what happens next time I check out files. I've committed changes BTW. woohoo!

'''Tarquin:'''  Next question: how does CVS decide if the next version number after 1.3 is 1.4 or 1.3.1 ?

'''Mychaeel:'''  That must be manually specified when committing a file; otherwise CVS will happily continue incrementing the version number following the dot.  I don't see yet how that would work with WinCvs though.  The other parts of the number initially displayed as 1.1.1.1 are related to branching; see [http://www-es.fernuni-hagen.de/cgi-bin/info2html?(cvs)Branches%20and%20revisions this page] for more info.

'''Tarquin:'''  I see. I thought something like 1.3.1 was for a small change, which my last update was. I think we can live without branching... :)

'''Mychaeel:'''  Well, actually there's a benefit of regarding all sorts of changes the same by unanimously incrementing the last partial version number &amp;ndash; you're relieved from the duty of (reproducibly) judging whether a change is a &quot;small&quot; or a &quot;large&quot; one.  For that matter, all changes committed to the repository should be &quot;small&quot; ones, at least and definitely in terms of the amount of text necessary to describe them in the log.  (Where &quot;Fixed typo&quot; would have the same subjective size as &quot;Implemented world formula.&quot;)</text>
    </revision>
    <revision>
      <id>2077</id>
      <timestamp>2002-07-24T21:23:21Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The Unreal Wiki's scripts and styles (and various other files, like the user interface graphics) are maintained in a CVS repository.  Send an email to mychaeel@beyondunreal.com if you feel you'd like to have access to this repository (with a short explanation why, if it's not evident).

A more general introduction to [[Legacy:CVS|CVS]] is available on, well, [[Legacy:CVS|CVS]].

==Getting Started ==

Head over to [[Legacy:CVS|CVS]], select a CVS client of your choice for your operating system and install it.  I'll be explaining the steps using [http://www.wincvs.org WinCvs], but generally they're always the same.




[[Image:Legacy_cvs-checkout-settings.gif|right|]]

First thing you'll have to do after this is '''checking out''' the files from the repository.  You'll only have to do this once; see &quot;Updating&quot; below for how to get the latest versions of the files later.  Select ''Create'' -&gt; ''Checkout module'', and you'll be presented with the following dialog box.

* In the ''Enter the module name and path'' field (at the top), enter &lt;code&gt;UnrealWiki&lt;/code&gt;.  That is the name I have given the entire bunch of files in the repository.

* In the ''Local folder to checkout to'', enter (or better: select using the button with the three dots to the right of this field) the folder on your harddisk you want the files to be copied to.  Note that the client will create a subdirectory &lt;code&gt;UnrealWiki&lt;/code&gt; in the folder you select.  If you don't like that name, click the ''Override'' checkbox above and enter whatever other name is more to your liking in the ''Checkout as'' field.

[[Image:Legacy_cvs-checkout-general.gif|right|]]

After that, click the ''General'' tab.

* The ''CVSROOT'' setting contains your '''user name''', the '''CVS server address''' and the '''repository location''' on that server.  If you send me an email as detailed above, I'll give you this information.

* In the ''Authentication'' drop-down box select &quot;passwd file on the cvs server&quot;.

[[Image:Legacy_cvs-checkout-globals.gif|right|]]

Then click the ''Globals'' tab.

* Uncheck the ''Checkout read-only'' option.

* If you're on a really slow Internet connection, you can check ''Use TCP/IP compression'' to have the data transparently compressed before it's sent to or received from the CVS server.  If you have a really fast connection, the processing overhead required by that compression usually takes more time than using it saves.




Make sure you're '''connected to the Internet''' and click ''OK''.  The client will then connect to the CVS server and download all files, copying them to your harddisk at the location you specified.  Congrats!  There they are.

'''Mychaeel:'''  Somewhere in the process you'll have to enter your password... can't remember exactly where though, I'm afraid.  I'll use tarquin to find out.  ;-)

==Updating ==

To get the latest versions of the files in your work directory after you initially checked them out, you'll have to '''update''' your working copy.




[[Image:Legacy_cvs-update.gif|right|]]

For that, select the directory or the file (or multiple files) you want to update in WinCvs's browser.  Select ''Modify'' -&gt; ''Update selection'' and you'll be presented with this dialog box.

* The option ''Create missing directories that exist in the repository'' is handy if you know that somebody added a directory (with files in it) in the repository.  Otherwise you can leave it off.

* Use ''Get the clean copy'' if you messed with the files in your local working copy but want to discard those changes.  The client will create a backup copy of those files on your harddisk and overwrite the originals with the latest versions from the repository.

Note that updating a file doesn't discard or overwrite any changes you made on it.  Changes that were committed since you updated the last time will be merged with your local copy &amp;ndash; after that process you'll have a file that contains your own changes ''and'' the changes other people made and committed to the repository.

If a change you made ''collides'' with another one of another person, you'll get an '''edit conflict''' and will be warned by the client.  Then you'll have to manually go through the affected file and sort everything out before you can commit your own changes.



If you just want to see what was changed without actually updating anything, select ''Query'' -&gt; ''Query update'' and watch WinCvs's log window.  It'll give you the same information it gives you when actually updating, but it'll keep your files (and the repository's files) untouched.

==Committing Changes ==

You can edit your local copy at will.  When you've changed something you want to put back in the repository, you'll have to '''commit''' your changes.

'''Before you commit, always update''' (see above).  If you're lucky, CVS will refuse to work if you made any changes that conflict with other changes that were committed by other people since you made your last update.  If you're less lucky, the client will hang or crash.

[[Image:Legacy_cvs-commit.gif|right|]]

To do that, select the files you have changed in WinCvs's browser and select ''Modify'' -&gt; ''Commit selection''.  A dialog box pops up that asks you to enter a log message.

* Only commit stuff that '''actually works''' (compiles without errors, is parsed correctly, or whatever is applicable).

* Always '''commit files with cross-dependent changes at the same time.'''  In the example in the screenshot, I've changed the [[Legacy:Wookee|Wookee]] formatter to generate HTML that requires a new CSS style; so I'm committing the changed .css files that include this new style along.

* Related to the previous item:  '''Don't commit files that have unrelated changes at the same time.'''  Every change deserves its own log message.

* '''Make your log messages verbose''' &amp;ndash; we'd like to be able to understand what you did (and possibly why you did it).  Include the names of the files you changed (along the lines of what's shown in the screenshot) so we can quickly see which files are affected by the change you committed.

Click ''OK'' and the client will upload your changes to the CVS server.

==Questions? ==

This is Wiki.  Add them here.

----

'''Tarquin:'''  Any particular reason why all the files in my CVS directory are read-only?

'''Mychaeel:'''  There's a &quot;Checkout read-only&quot; option in the &quot;General&quot; tab of the dialog box that appears when checking out files.  Do you have that enabled?  (I thought it was disabled by default; if it's not, I'll have to add that to the description above.)

'''Tarquin:'''  It was checked by default. 

'''Tarquin:'''  Fixed. I changed their status from windows ... I'll see what happens next time I check out files. I've committed changes BTW. woohoo!

'''Tarquin:'''  Next question: how does CVS decide if the next version number after 1.3 is 1.4 or 1.3.1 ?

'''Mychaeel:'''  That must be manually specified when committing a file; otherwise CVS will happily continue incrementing the version number following the dot.  I don't see yet how that would work with WinCvs though.  The other parts of the number initially displayed as 1.1.1.1 are related to branching; see [http://www-es.fernuni-hagen.de/cgi-bin/info2html?(cvs)Branches%20and%20revisions this page] for more info.

'''Tarquin:'''  I see. I thought something like 1.3.1 was for a small change, which my last update was. I think we can live without branching... :)

'''Mychaeel:'''  Well, actually there's a benefit of regarding all sorts of changes the same by unanimously incrementing the last partial version number &amp;ndash; you're relieved from the duty of (reproducibly) judging whether a change is a &quot;small&quot; or a &quot;large&quot; one.  For that matter, all changes committed to the repository should be &quot;small&quot; ones, at least and definitely in terms of the amount of text necessary to describe them in the log.  (Where &quot;Fixed typo&quot; would have the same subjective size as &quot;Implemented world formula.&quot;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cache Cleaner</title>
    <id>915</id>
    <revision>
      <id>2511</id>
      <timestamp>2007-11-19T18:58:24Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A Cache cleaner extracts files from your cache and writes them, with proper names, to your hard drive.

==Who Cares? ==

When you play online, if you don't have a particular map, texture, or other package, the server sends you it.  So the first time you play VCTF-WS-StupidDeathRocket2k4 on someones SUPER1337BALLISTIC-MMORPGOMGZ-M/-\tr&gt;&lt;-XXRelicxz server, you'll get awfully familiar with the black screen showing a percentage-done indicator.

UT2004 places these downloaded files in your Cache subdirectory, with garbled names, and keeps the filename in Cache/Cache.ini, so next time you need those packages they don't need to be downloaded again.

HOWEVER.  Files can expire from the cache, so after so much playing with new maps and weapons and other features, you will find yourself having to download VCTF-WS-StupidDeathRocket-2k4 all over again.

Cache cleaners alleviate this problem.  They scan the Cache.ini file and offer you a list of files to be extracted.  Then you click &quot;go&quot; and the cache cleaner renames the files and moves them to a suitable directory.  Once VCTF-WS-StupidDeathRocket-2k4.ut2 is in your Maps directory, it won't need to be downloaded again.

==Where to get them ==

I've used at least two cache cleaners in the past.  However, at the time of writing, I was unable to find one on the net for free, so I wrote my own in python.  If you are fortunate enough to have cygwin, this python script will run more-or-less out-of-the-box.  [[Legacy:Utft|utft]]

[[Category:Legacy Toolchain|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2512</id>
      <timestamp>2007-11-15T17:57:48Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Explained what a cache cleaner is and why you want one.</comment>
      <text xml:space="preserve">A Cache cleaner extracts files from your cache and writes them, with proper names, to your hard drive.

==Who Cares? ==

When you play online, if you don't have a particular map, texture, or other package, the server sends you it.  So the first time you play VCTF-WS-StupidDeathRocket2k4 on someones SUPER1337BALLISTIC-MMORPGOMGZ-M/-\tr&gt;&lt;-XXRelicxz server, you'll get awfully familiar with the black screen showing a percentage-done indicator.

UT2004 places these downloaded files in your Cache subdirectory, with garbled names, and keeps the filename in Cache/Cache.ini, so next time you need those packages they don't need to be downloaded again.

HOWEVER.  Files can expire from the cache, so after so much playing with new maps and weapons and other features, you will find yourself having to download VCTF-WS-StupidDeathRocket-2k4 all over again.

Cache cleaners alleviate this problem.  They scan the Cache.ini file and offer you a list of files to be extracted.  Then you click &quot;go&quot; and the cache cleaner renames the files and moves them to a suitable directory.  Once VCTF-WS-StupidDeathRocket-2k4.ut2 is in your Maps directory, it won't need to be downloaded again.

==Where to get them ==

I've used at least two cache cleaners in the past.  However, at the time of writing, I was unable to find one on the net for free, so I wrote my own in python.  If you are fortunate enough to have cygwin, this python script will run more-or-less out-of-the-box.  [[Legacy:Utft|utft]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CacheManager</title>
    <id>28873</id>
    <revision>
      <id>42800</id>
      <timestamp>2010-03-30T16:20:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Calvin</title>
    <id>755</id>
    <revision>
      <id>2161</id>
      <timestamp>2002-10-10T20:11:34Z</timestamp>
      <contributor>
        <ip>Host217-34-67-154.in-addr.btopenworld.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: (please add yourself to the [[Legacy:Project_Contributors|Project_Contributors]] Page!)

'''Calvin:''' You are way too fast ;)  You posted that on this page before I even knew it existed.  I will add myself to the [[Legacy:Project_Contributors|Project_Contributors]] Page when I feel I have contributed something.  This may be a long while down the road.  For the present I think I will limit myself to correcting grammar and spelling errors I come across, so long as no one objects.  Thanks for the welcome!

'''ZxAnPhOrIaN:''' lol :P Contributing means that you edited a page! So, you edited [[Legacy:Making Mods/Building A Team|Making Mods/Building A Team]] so you contributed to the wiki!!

'''ProjectX:''' He's right you know, and anyway, enjoy the page, it's not used for much :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2162</id>
      <timestamp>2002-10-10T19:01:31Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: (please add yourself to the [[Legacy:Project_Contributors|Project_Contributors]] Page!)

'''Calvin:''' You are way too fast ;)  You posted that on this page before I even knew it existed.  I will add myself to the [[Legacy:Project_Contributors|Project_Contributors]] Page when I feel I have contributed something.  This may be a long while down the road.  For the present I think I will limit myself to correcting grammar and spelling errors I come across, so long as no one objects.  Thanks for the welcome!

'''ZxAnPhOrIaN:''' lol :P Contributing means that you edited a page! So, you edited [[Legacy:Making Mods/Building A Team|Making Mods/Building A Team]] so you contributed to the wiki!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Camera</title>
    <id>710</id>
    <revision>
      <id>2059</id>
      <timestamp>2003-10-06T15:56:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:PlayerPawn|PlayerPawn]] &gt;&gt; Camera (Package: Engine)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:PlayerController|PlayerController]] &gt;&gt; Camera (Package: Engine)}}

A camera, used in UnrealEd.

See also:
* [[Legacy:Camera Movement|Camera Movement]] mode in UnrealEd.
* [[Legacy:CameraSpot|CameraSpot]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2060</id>
      <timestamp>2003-10-06T15:52:35Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:PlayerPawn|PlayerPawn]] &gt;&gt; Camera}}

A camera, used in UnrealEd.

See also:
* [[Legacy:Camera Movement|Camera Movement]] mode in UnrealEd.
* [[Legacy:CameraSpot|CameraSpot]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Camera Movement</title>
    <id>706</id>
    <revision>
      <id>2049</id>
      <timestamp>2004-11-03T10:26:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You should be able to see four [[Legacy:UnrealEd Viewport|viewports]] when you first open UnrealEd.

Camera mode is the default [[Legacy:Toolbox|toolbox]] mode. This allows you to move your view around the grid, and also move actors, depending on which mouse buttons and modiier keys you use. In all of the 2D views, there will be a camera actor visible:

[[Image:Legacy_camera_actor.png|center|]]

This is a directional actor with a red arrow, indicating the position and view direction of the 3D viewport camera.

==Moving the camera==

===Movement in the 2D views===

Hold down the left or right button, then move the mouse in the direction you want to go. The left button moves the view more slowly than the right one. To zoom in and out, hold down both buttons, then move the mouse forward or backward.

===Movement in the the 3D view===
* The left button moves the camera forwards and backwards with corresponding movement of the mouse.
* Moving the mouse forward and back with the right button held will alter the pitch of the camera.
* Either button singly held will let you swing the camera left or right (yaw). 
* Both buttons together control height of the camera (z-axis), and left-right movement.
* ALT and moving the mouse will dip left or right (roll).

The camera actor will change position in the 2D viewports in correspondence to your movements, but only when they refresh (click inside them to make this happen).

==Moving actors ==

You can also move selected actors in this mode. Actor movement requires a keyboard modifier:
; CONTROL : move just the selected actors
; SHIFT : move the actors and the camera

* Left button, left &amp; right: x-axis
* Right button, left &amp; right: y-axis
* Both buttons, up &amp; down: z-axis (same as camera movement above)

==Other commands ==
* SHIFT + CONTROL + Click on a surface to select the associated [[Legacy:Brush|brush]]. Note: if you have deleted this brush since [[Legacy:Rebuild|rebuild]]ing, UnrealEd will probably crash!

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; full reference
* [[Legacy:Mouse Control|Mouse Control]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2050</id>
      <timestamp>2003-08-31T21:01:14Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <comment>Replaced broken image with a new one</comment>
      <text xml:space="preserve">You should be able to see four [[Legacy:UnrealEd Viewport|viewports]] when you first open UnrealEd 2.0

Camera mode is the default mode, in which you can move your view around the grid. In all of the 2D views, there will be a camera actor visible:&lt;br /&gt;&lt;br&gt;

[[Image:Legacy_camera_actor.png|center|]]

This is a directional actor with a red arrow, indicating the position and view direction of the 3D viewport camera.

====Movement in the 2D views: ====

Hold down the left or right button, then move the mouse in the direction you want to go. The left button moves the view more slowly than the right one. To zoom in and out, hold down both buttons, then move the mouse forward or backward.

====Movement in the the 3D view: ====

* The left button moves the camera forwards and backwards with corresponding movement of the mouse.
* Moving the mouse forward and back with the right button held will alter the pitch of the camera.
* Either button singly held will let you swing the camera left or right (Yaw). 
* Both buttons together control elevation of the camera, and left-right movement.

The camera actor will change position in the 2D viewports in correspondence to your movements, but only when they refresh (click inside them to make this happen).

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2051</id>
      <timestamp>2003-10-06T15:57:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You should be able to see four [[Legacy:UnrealEd Viewport|viewports]] when you first open UnrealEd.

Camera mode is the default [[Legacy:Toolbox|toolbox]] mode, in which you can move your view around the grid. In all of the 2D views, there will be a camera actor visible:

[[Image:Legacy_camera_actor.png|center|]]

This is a directional actor with a red arrow, indicating the position and view direction of the 3D viewport camera.

==Moving the camera==

===Movement in the 2D views===

Hold down the left or right button, then move the mouse in the direction you want to go. The left button moves the view more slowly than the right one. To zoom in and out, hold down both buttons, then move the mouse forward or backward.

===Movement in the the 3D view===
* The left button moves the camera forwards and backwards with corresponding movement of the mouse.
* Moving the mouse forward and back with the right button held will alter the pitch of the camera.
* Either button singly held will let you swing the camera left or right (yaw). 
* Both buttons together control height of the camera (z-axis), and left-right movement.
* ALT and moving the mouse will dip left or right (roll).

The camera actor will change position in the 2D viewports in correspondence to your movements, but only when they refresh (click inside them to make this happen).

==Moving actors ==

You can also move selected actors in this mode. Actor movement requires a keyboard modifier:
; CONTROL : move just the selected actors
; SHIFT : move the actors and the camera

* Left button, left &amp; right: x-axis
* Right button, left &amp; right: y-axis
* Both buttons, up &amp; down: z-axis (same as camera movement above)

==Other commands ==
* SHIFT + CONTROL + Click on a surface to select the associated [[Legacy:Brush|brush]]. Note: if you have deleted this brush since [[Legacy:Rebuild|rebuild]]ing, UnrealEd will probably crash!

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; full reference
* [[Legacy:Mouse Control|Mouse Control]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CameraEffect</title>
    <id>863</id>
    <revision>
      <id>2403</id>
      <timestamp>2005-01-14T00:07:11Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; CameraEffect}}

Base class for camera effects like screen overlays or motionblur.

==How To Use==

Only the first camera effect of a certain class actually works. However, any CameraEffect object can be added as often to a [[Legacy:PlayerController|PlayerController]]'s CameraEffects array as you want without breaking anything.

Your best bet when working with camera effects is to find an existing CameraEffect of the desired class in the local PlayerController's CameraEffects array and use that. If there isn't any, just fetch one from the [[Legacy:ObjectPool|ObjectPool]].

This function will do exactly that:

&lt;uscript&gt;
//=============================================================================
// FindCameraEffect
//
// Looks for an existing CameraEffect object in the CameraEffects array first.
// Only if it doesn't find one, it takes one from the ObjectPool.
// That CameraEffect will be returned.
//=============================================================================

simulated function CameraEffect FindCameraEffect(class&lt;CameraEffect&gt; CameraEffectClass)
{
  local PlayerController PlayerControllerLocal;
  local CameraEffect CameraEffectFound;
  local int i;
  
  PlayerControllerLocal = Level.GetLocalPlayerController();
  if ( PlayerControllerLocal != None ) {
    for (i = 0; i &lt; PlayerControllerLocal.CameraEffects.Length; i++)
      if ( PlayerControllerLocal.CameraEffects[i].Class == CameraEffectClass ) {
        CameraEffectFound = PlayerControllerLocal.CameraEffects[i];
        log(&quot;Found&quot;@CameraEffectFound@&quot;in CammeraEffects array&quot;);
        break;
      }
    if ( CameraEffectFound == None ) {
      CameraEffectFound = CameraEffect(Level.ObjectPool.AllocateObject(CameraEffectClass));
      log(&quot;Got&quot;@CameraEffectFound@&quot;from ObjectPool&quot;);
    }
    if ( CameraEffectFound != None )
      PlayerControllerLocal.AddCameraEffect(CameraEffectFound);
  }
  return CameraEffectFound;
}
&lt;/uscript&gt;

The CameraEffect class will be added to the CameraEffects array, whether it is already there or not. This way you can simply remove one reference from the array if you don't need the CameraEffect anymore.

If no more references to the CameraEffect are left in the array you can free the CameraEffect object and put it back in the [[Legacy:ObjectPool|ObjectPool]]. The following function will do that automatically for you:

&lt;uscript&gt;
//=============================================================================
// RemoveCameraEffect
//
// Removes one reference to the CameraEffect from the CameraEffects array. If
// there are any more references to the same CameraEffect object, they remain
// there. The CameraEffect will be put back in the ObjectPool if no other
// references to it are left in the CameraEffects array.
//=============================================================================

simulated function RemoveCameraEffect(CameraEffect CameraEffect)
{
  local PlayerController PlayerControllerLocal;
  local int i;
  
  PlayerControllerLocal = Level.GetLocalPlayerController();
  if ( PlayerControllerLocal != None ) {
    PlayerControllerLocal.RemoveCameraEffect(CameraEffect);
    for (i = 0; i &lt; PlayerControllerLocal.CameraEffects.Length; i++)
      if ( PlayerControllerLocal.CameraEffects[i] == CameraEffect ) {
        log(CameraEffect@&quot;still in CameraEffects array&quot;);
        return;
      }
    log(&quot;Freeing&quot;@CameraEffect);
    Level.ObjectPool.FreeObject(CameraEffect);
  }
}
&lt;/uscript&gt;

These two functions are not part of the CameraEffect. You will have to implement them yourself.

==Known Subclasses==
* [[Legacy:CameraOverlay|CameraOverlay]]
* [[Legacy:MotionBlur|MotionBlur]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2404</id>
      <timestamp>2005-01-13T23:19:50Z</timestamp>
      <contributor>
        <ip>Lepam03.pamlico.k12.nc.us</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CameraOverlay</title>
    <id>912</id>
    <revision>
      <id>2507</id>
      <timestamp>2006-10-19T22:03:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:CameraEffect|CameraEffect]] &gt;&gt; CameraOverlay}}

Draws a material onto the entire screen.

See [[Legacy:CameraEffect|CameraEffect]] for instructions on how to use the camera overlay and other camera effects correctly.

==Properties==
; color OverlayColor : Color of the material to draw. Use white (R, B, G and A set to 255) to draw it in its original colors. This works exactly like the [[Legacy:Canvas|Canvas]] DrawColor.
; [[Legacy:Material|Material]] OverlayMaterial : The material to overlay.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CameraSpot</title>
    <id>676</id>
    <revision>
      <id>1978</id>
      <timestamp>2007-11-18T16:58:01Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; CameraSpot}}

When triggered, '''CameraSpot''' sets the instigator's viewpoint to its own location and direction, creating a Duke Nukem-like surveillance camera effect.  When untriggered, resets the player's viewpoint to first-person view again.

More information and download:  [http://www.planetunreal.com/screen/cameraspot/ CameraSpot homepage] 

Created by [[Legacy:Mychaeel|Mychaeel]].

[[Category:Legacy Dead Links|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1979</id>
      <timestamp>2002-08-19T14:55:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; CameraSpot}}

When triggered, '''CameraSpot''' sets the instigator's viewpoint to its own location and direction, creating a Duke Nukem-like surveillance camera effect.  When untriggered, resets the player's viewpoint to first-person view again.

More information and download:  [http://www.planetunreal.com/screen/cameraspot/ CameraSpot homepage] 

Created by [[Legacy:Mychaeel|Mychaeel]].

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CameraText</title>
    <id>884</id>
    <revision>
      <id>2449</id>
      <timestamp>2004-10-16T02:41:09Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:CameraEffect|CameraEffect]] &gt;&gt; CameraText (Package: Shell)}}

==Properties ==
; color OverlayColor :  
; Font OverlayFont :  font for text  
; bool OverlayShadow :  whether to draw drop shadow  
; Color OverlayShadowColor :  shadow color  
; float OverlayShadowX :  x offset for shadow  
; float OverlayShadowY :  y offset for shadow  
; String OverlayText :  text to display  

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CameraTextureClient</title>
    <id>776</id>
    <revision>
      <id>2210</id>
      <timestamp>2004-06-09T23:39:32Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>Removed dead angelmapper link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; CameraTextureClient (Package: Gameplay)}}

This actor is used to make cameras. It acts as a bridge between an actor used as a camera, and a scripted texture which displays the image. This actor's position is unimportant (but for the sake of mapper sanity, it's helpful to put it near to the camera or the screen).

Info for coders: CameraTextureClient are declared as bNoDelete=True, so they can't be spawned from UnrealScript.

==Properties ==

===CameraTextureClient Group ===
; name CameraTag : Match the [[Legacy:Tag|Tag]] of the actor being used as the camera. Only the last actor with this tag is used as the camera.
; [[Legacy:ScriptedTexture|ScriptedTexture]] DestTexture : The ScriptedTexture used to draw the camera view. The camera view will be drawn on this texture, no matter where and how often you use it. To get two different camera views you have to use two different ScriptedTextures. (and two different CameraTextureClients, but I think that's obvious ;))
; float FOV : The FOV to use for the camera. The default FOV is 60.
; float RefreshRate : The maximum number of updates per second for the ScriptedTexture used as DestTexture. The default refresh rate is 60.

===Hidden ===
; [[Legacy:Actor|Actor]] CameraActor : A reference to the actual camera actor. This is set in the PostBeginPlay function.

==External Links ==

[http://www.unrealops.com/modules.php?op=modload&amp;name=Reviews&amp;file=index&amp;req=showcontent&amp;id=24 Tutorial]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2211</id>
      <timestamp>2004-01-19T15:40:12Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; CameraTextureClient (Package: Gameplay)}}

This actor is used to make cameras. It acts as a bridge between an actor used as a camera, and a scripted texture which displays the image. This actor's position is unimportant (but for the sake of mapper sanity, it's helpful to put it near to the camera or the screen).

http://angelmapper.com/cameratutorial

Info for coders: CameraTextureClient are declared as bNoDelete=True, so they can't be spawned from UnrealScript.

==Properties ==

===CameraTextureClient Group ===
; name CameraTag : Match the [[Legacy:Tag|Tag]] of the actor being used as the camera. Only the last actor with this tag is used as the camera.
; [[Legacy:ScriptedTexture|ScriptedTexture]] DestTexture : The ScriptedTexture used to draw the camera view. The camera view will be drawn on this texture, no matter where and how often you use it. To get two different camera views you have to use two different ScriptedTextures. (and two different CameraTextureClients, but I think that's obvious ;))
; float FOV : The FOV to use for the camera. The default FOV is 60.
; float RefreshRate : The maximum number of updates per second for the ScriptedTexture used as DestTexture. The default refresh rate is 60.

===Hidden ===
; [[Legacy:Actor|Actor]] CameraActor : A reference to the actual camera actor. This is set in the PostBeginPlay function.

==External Links ==

[http://www.unrealops.com/modules.php?op=modload&amp;name=Reviews&amp;file=index&amp;req=showcontent&amp;id=24 Tutorial]

----

'''DeepQantas:''' It seems the Angel Mapper link doesn't work. I went through the angelmapper.com to find the tutorial and it directed me to this page. Seems to be the same tutorial you're talking about:

http://www.unrealops.com/modules.php?op=modload&amp;name=Reviews&amp;file=index&amp;req=showcontent&amp;id=24

(Btw, my first edit, yay)

'''Tarquin:''' Thanks for the update! :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34351</id>
      <timestamp>2009-04-22T02:26:18Z</timestamp>
      <contributor>
        <username>Jacen</username>
        <id>1306</id>
      </contributor>
      <minor/>
      <comment>Link to http://www.angelmapper.com/gamedev/tutorials/securitycamera.htm security cameras tutorial</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; CameraTextureClient (Package: Gameplay)}}

This actor is used to make cameras. It acts as a bridge between an actor used as a camera, and a scripted texture which displays the image. This actor's position is unimportant (but for the sake of mapper sanity, it's helpful to put it near to the camera or the screen).

Info for coders: CameraTextureClient are declared as bNoDelete=True, so they can't be spawned from UnrealScript.

==Properties ==

===CameraTextureClient Group ===
; name CameraTag : Match the [[Legacy:Tag|Tag]] of the actor being used as the camera. Only the last actor with this tag is used as the camera.
; [[Legacy:ScriptedTexture|ScriptedTexture]] DestTexture : The ScriptedTexture used to draw the camera view. The camera view will be drawn on this texture, no matter where and how often you use it. To get two different camera views you have to use two different ScriptedTextures. (and two different CameraTextureClients, but I think that's obvious ;))
; float FOV : The FOV to use for the camera. The default FOV is 60.
; float RefreshRate : The maximum number of updates per second for the ScriptedTexture used as DestTexture. The default refresh rate is 60.

===Hidden ===
; [[Legacy:Actor|Actor]] CameraActor : A reference to the actual camera actor. This is set in the PostBeginPlay function.

==External Links ==

[http://www.unrealops.com/modules.php?op=modload&amp;name=Reviews&amp;file=index&amp;req=showcontent&amp;id=24 Tutorial]

[http://www.angelmapper.com/gamedev/tutorials/securitycamera.htm Security Camera Tutorial] from angelmapper.com

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CameraTitle</title>
    <id>780</id>
    <revision>
      <id>2218</id>
      <timestamp>2004-10-16T02:39:33Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:CameraEffect|CameraEffect]] &gt;&gt; CameraTitle (Package: Shell)}}

Camera effect that displays a material at a specified size and position.

==Properties==
; color OverlayColor
; [[Legacy:Material|Material]] OverlayMaterial : What to display.
; float OverlaySizeFactor: size relative to screen width (1.0=full width, 0.5=half, etc.)
; float OverlayXPos: center of object as % of width (0.0=left, 1.0=right)
; float OverlayYPos: center of object as % of height (0.0=top, 1.0=bottom)
; [[Legacy:Actor/Display|ERenderStyle]] OverlayStyle: style to use when drawing material

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CamperZone</title>
    <id>900</id>
    <revision>
      <id>2483</id>
      <timestamp>2007-08-10T20:54:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| ... &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; CamperZone}}

I found a custom ZoneInfo that kills you when you stay in too long. Some of the comments are in french but the code itself works just fine. Also you can set the time in UnrealEd itself.

When you go in the zone you will see a timer in the chat saying how much time you have left. 

This zone is the best for CTF campers or you can use it for a room with a limit time that you can enter like a redeemer room with lots of pickups. 

&lt;uscript&gt;

class CamperZone extends ZoneInfo;

// Time to live once inside the zone
var() int  KillTimeR;

struct PlayerDansLaZone
{
	var Pawn P;        
	var int TempsSurvi;  //Set a maximum time they can sit there. Once it finishes they are killed.
};
var PlayerDansLaZone PZ[64];

function PostBeginPlay(){
	SetTimer(1,true);
}
event Timer(){
	local int i;
	for(i=0;i&lt;64;i++)
		if( PZ[i].P != None ){
			PZ[i].TempsSurvi--;
			if( PZ[i].TempsSurvi == 0 ){
				if( Level.Game.bGameEnded ){
					PZ[i].P.PlayerReplicationInfo.Score+=4;
					SetTimer(0,false);
					}
				BroadcastMessage(&quot;&quot;@PZ[i].P.PlayerReplicationInfo.PlayerName@&quot;is now a Dead Camper &quot;, false, 'CriticalEvent');
			    PZ[i].P.health = -1000;
				PZ[i].P.Died( None, '', PZ[i].P.Location );
			    PZ[i].P.PlayerReplicationInfo.Score-=0;
				}
			else
				PZ[i].P.ClientMessage(&quot;Time left to move your ass :&quot;@(PZ[i].TempsSurvi));
			
		}
}
// Uses the function of the superclass to add to our list of people to kill in the zone
event ActorEntered( actor Other )
{
	// Executes the function from the superclass to prevent problems with the zone as a whole
	super.ActorEntered(Other);
	// Neither a bot nor a player : Reset and do nothing more
	if( !Other.IsA('TournamentPlayer') &amp;&amp; !Other.IsA('Bot') )
		return;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].P=Pawn(Other);
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].TempsSurvi=KillTimeR;
}
// Resets when the player/bot leaves the zone
event ActorLeaving( actor Other )
{
	super.ActorLeaving(Other);
	if( !Other.IsA('TournamentPlayer') &amp;&amp; !Other.IsA('Bot') )
		return;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].P=none;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].TempsSurvi=0;
}


&lt;/uscript&gt;

this is NOT my code i found it in a map called CTF-(SLv)DragonBall_AC.unr (used with rocketx or strangeloves)

[WJF]Cyborg

'''Tarquin:''' It might be a good idea to try to contact the author of that map &amp; ask for permission to host the script here

'''Cyborg''' the map whas maked by OrgaZmo i cant find him anywhere</text>
    </revision>
    <revision>
      <id>2484</id>
      <timestamp>2006-06-15T14:37:50Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| ... &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; CamperZone}}

I found a custom ZoneInfo that kills you when you stay in too long. Some of the comments are in french but the code itself works just fine. Also you can set the time in UnrealEd itself.

When you go in the zone you will see a timer in the chat saying how much time you have left. 

This zone is the best for CTF campers or you can use it for a room with a limit time that you can enter like a redeemer room with lots of pickups. 

&lt;uscript&gt;

class CamperZone extends ZoneInfo;

// Time to live once inside the zone
var() int  KillTimeR;

struct PlayerDansLaZone
{
	var Pawn P;        
	var int TempsSurvi;  //Set a maximum time they can sit there. Once it finishes they are killed.
};
var PlayerDansLaZone PZ[64];

function PostBeginPlay(){
	SetTimer(1,true);
}
event Timer(){
	local int i;
	for(i=0;i&lt;64;i++)
		if( PZ[i].P != None ){
			PZ[i].TempsSurvi--;
			if( PZ[i].TempsSurvi == 0 ){
				if( Level.Game.bGameEnded ){
					PZ[i].P.PlayerReplicationInfo.Score+=4;
					SetTimer(0,false);
					}
				BroadcastMessage(&quot;&quot;@PZ[i].P.PlayerReplicationInfo.PlayerName@&quot;is now a Dead Camper &quot;, false, 'CriticalEvent');
			    PZ[i].P.health = -1000;
				PZ[i].P.Died( None, '', PZ[i].P.Location );
			    PZ[i].P.PlayerReplicationInfo.Score-=0;
				}
			else
				PZ[i].P.ClientMessage(&quot;Time left to move your ass :&quot;@(PZ[i].TempsSurvi));
			
		}
}
// Uses the function of the superclass to add to our list of people to kill in the zone
event ActorEntered( actor Other )
{
	// Executes the function from the superclass to prevent problems with the zone as a whole
	super.ActorEntered(Other);
	// Neither a bot nor a player : Reset and do nothing more
	if( !Other.IsA('TournamentPlayer') &amp;&amp; !Other.IsA('Bot') )
		return;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].P=Pawn(Other);
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].TempsSurvi=KillTimeR;
}
// Resets when the player/bot leaves the zone
event ActorLeaving( actor Other )
{
	super.ActorLeaving(Other);
	if( !Other.IsA('TournamentPlayer') &amp;&amp; !Other.IsA('Bot') )
		return;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].P=none;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].TempsSurvi=0;
}


&lt;/uscript&gt;

this is NOT my code i found it in a map called CTF-(SLv)DragonBall_AC.unr (used with rocketx or strangeloves)

[WJF]Cyborg

'''Tarquin:''' It might be a good idea to try to contact the author of that map &amp; ask for permission to host the script here

'''Cyborg''' the map whas maked by OrgaZmo i cant find him anywhere</text>
    </revision>
    <revision>
      <id>2485</id>
      <timestamp>2007-08-10T14:49:31Z</timestamp>
      <contributor>
        <ip>P5B074359.dip0.t-ipconnect.de</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| ... &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; CamperZone}}

[http://www.wisetranslations.com translation]

I found a custom ZoneInfo that kills you when you stay in too long. Some of the comments are in french but the code itself works just fine. Also you can set the time in UnrealEd itself.

When you go in the zone you will see a timer in the chat saying how much time you have left. 

This zone is the best for CTF campers or you can use it for a room with a limit time that you can enter like a redeemer room with lots of pickups. 

&lt;uscript&gt;

class CamperZone extends ZoneInfo;

// Time to live once inside the zone
var() int  KillTimeR;

struct PlayerDansLaZone
{
	var Pawn P;        
	var int TempsSurvi;  //Set a maximum time they can sit there. Once it finishes they are killed.
};
var PlayerDansLaZone PZ[64];

function PostBeginPlay(){
	SetTimer(1,true);
}
event Timer(){
	local int i;
	for(i=0;i&lt;64;i++)
		if( PZ[i].P != None ){
			PZ[i].TempsSurvi--;
			if( PZ[i].TempsSurvi == 0 ){
				if( Level.Game.bGameEnded ){
					PZ[i].P.PlayerReplicationInfo.Score+=4;
					SetTimer(0,false);
					}
				BroadcastMessage(&quot;&quot;@PZ[i].P.PlayerReplicationInfo.PlayerName@&quot;is now a Dead Camper &quot;, false, 'CriticalEvent');
			    PZ[i].P.health = -1000;
				PZ[i].P.Died( None, '', PZ[i].P.Location );
			    PZ[i].P.PlayerReplicationInfo.Score-=0;
				}
			else
				PZ[i].P.ClientMessage(&quot;Time left to move your ass :&quot;@(PZ[i].TempsSurvi));
			
		}
}
// Uses the function of the superclass to add to our list of people to kill in the zone
event ActorEntered( actor Other )
{
	// Executes the function from the superclass to prevent problems with the zone as a whole
	super.ActorEntered(Other);
	// Neither a bot nor a player : Reset and do nothing more
	if( !Other.IsA('TournamentPlayer') &amp;&amp; !Other.IsA('Bot') )
		return;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].P=Pawn(Other);
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].TempsSurvi=KillTimeR;
}
// Resets when the player/bot leaves the zone
event ActorLeaving( actor Other )
{
	super.ActorLeaving(Other);
	if( !Other.IsA('TournamentPlayer') &amp;&amp; !Other.IsA('Bot') )
		return;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].P=none;
	PZ[Pawn(Other).PlayerReplicationInfo.PlayerID].TempsSurvi=0;
}


&lt;/uscript&gt;

this is NOT my code i found it in a map called CTF-(SLv)DragonBall_AC.unr (used with rocketx or strangeloves)

[WJF]Cyborg

'''Tarquin:''' It might be a good idea to try to contact the author of that map &amp; ask for permission to host the script here

'''Cyborg''' the map whas maked by OrgaZmo i cant find him anywhere</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Camus</title>
    <id>770</id>
    <revision>
      <id>2196</id>
      <timestamp>2002-12-27T14:49:53Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">at least i dont consider myself a noob anymore :)  i frequently post long, difficult questions to beyondunreal forums.  many of my biggest problems turn out to be really stupid quirks (couldnt use my own meshes/textures for ages because i didnt know u must have a group specified hehe)

hopefully i'll finish something before the next generation of UT!

----

'''Wormbo:''' Hi and welcome to the Wiki! :)

'''ZxAnPhOrIaN:''' welcome! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2197</id>
      <timestamp>2002-12-27T10:30:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">at least i dont consider myself a noob anymore :)  i frequently post long, difficult questions to beyondunreal forums.  many of my biggest problems turn out to be really stupid quirks (couldnt use my own meshes/textures for ages because i didnt know u must have a group specified hehe)

hopefully i'll finish something before the next generation of UT!

----

'''Wormbo:''' Hi and welcome to the Wiki! :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CanadEHn</title>
    <id>904</id>
    <revision>
      <id>2492</id>
      <timestamp>2006-03-01T09:01:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I play CTF with the XxxXESR mostly on my clan server where my ingame name is »G.o.D«CanadEHn. My clan is »Guardians of Death«. I am one of the founding members. We create mostly maps with a few exceptions. The »G.o.D« website is http://www.guardiansofdeath.com . The site isn't updated all that often but there is a link to our forums which are constantly viewed.

'''Tarquin:''' Hi, welcome to the wiki</text>
    </revision>
    <revision>
      <id>2493</id>
      <timestamp>2006-02-28T21:11:57Z</timestamp>
      <contributor>
        <ip>CPE02e018f902ff-CM014310122683.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I play CTF with the XxxXESR mostly on my clan server where my ingame name is »G.o.D«CanadEHn. My clan is »Guardians of Death«. I am one of the founding members. We create mostly maps with a few exceptions. The »G.o.D« website is http://www.guardiansofdeath.com . The site isn't updated all that often but there is a link to our forums which are constantly viewed.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cannon</title>
    <id>779</id>
    <revision>
      <id>2216</id>
      <timestamp>2003-01-24T22:56:49Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Decoration (UT)|Decoration (UT)]] &gt;&gt; Cannon}}

This decoration, when triggered, will point in the direction of the player.  Under normal circumstances in Unreal Tournament, the cannon will not shoot no matter how many times you trigger it.

==Properties ==

===Cannon Group ===
;ActivateSound : The sound the cannon makes when it is activated.
;DeactivateDistance :
;Drop :
;ExplodeSound :
;FireSound :
;Health : The amount of damage the cannon can take before being destroyed.
;SampleTime :
;TrackingRate :

==Quirks ==

If you type in fly after you die in a deathmatch game (needs testing in CTF, Domination and Assault), you can move around as a 'ghost.' By this, I mean the player has reached zero health and has no inventory.  A simple way to do this is to type in &quot;suicide&quot; and then type in &quot;fly.&quot;  While in this 'ghost' state, you can go back to walking or ghost mode.  If a cannon has been activated before, it will track and shoot at you in this 'ghost' state.  This is the first time I remember getting the cannon to work.

==Known Subclasses ==
* HugeCannon (A cannon with a larger drawscale and more health.)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2217</id>
      <timestamp>2003-01-23T20:46:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Decoration (UT)|Decoration (UT)]] &gt;&gt; Cannon}}

This decoration, when triggered, will point in the direction of the player.  Under normal circumstances in Unreal Tournament, the cannon will not shoot no matter how many times you trigger it.

==Properties ==

===Cannon Group ===
;Health : The amount of damage the cannon can take before being destroyed.

==Quirks ==

If you type in fly after you die in a deathmatch game (needs testing in CTF, Domination and Assault), you can move around as a 'ghost.' By this, I mean the player has reached zero health and has no inventory.  A simple way to do this is to type in &quot;suicide&quot; and then type in &quot;fly.&quot;  While in this 'ghost' state, you can go back to walking or ghost mode.  If a cannon has been activated before, it will track and shoot at you in this 'ghost' state.  This is the first time I remember getting the cannon to work.

==Known Subclasses ==
* HugeCannon (A cannon with a larger drawscale and more health.)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Canvas</title>
    <id>677</id>
    <revision>
      <id>1980</id>
      <timestamp>2008-01-17T21:51:38Z</timestamp>
      <contributor>
        <ip>Cpe-24-242-14-200.elp.res.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Canvas (Package: Engine)}}

The '''Canvas''' is a wrapper for methods for drawing text, [[Legacy:Texture|Texture]]s and [[Legacy:Mesh|mesh]]es on the local player's screen.  Canvas objects are passed to various events and functions in the various classes, e.g. [[Legacy:HUD|HUD]], [[Legacy:Weapon|Weapon]], [[Legacy:GUI|GUI]] classes and [[Legacy:Interaction|Interaction]]s.

See [[Legacy:Canvas (UT)|Canvas (UT)]] for Canvas properties and methods available in UT.

==Properties ==
; bool bCenter : Whether to center the text.
; bool bNoSmooth : Whether bilinear filtering should ''not'' be applied.
; bool bRenderLevel : Will render the level if enabled.
; float ClipX, ClipY : Width and height of the clipping region.
; float CurX, CurY : Current position for drawing relative to origin set by OrgX/OrgY.
; float OrgX, OrgY : Origin for drawing and upper left corner of the clipping window.
; int SizeX, SizeY :  Zero-based actual dimensions.  
; float SpaceX, SpaceY :  Spacing for after executing one of the Draw* methods, i.e. this contains the screen size of the last drawn element.
; byte Style : The values of this variable correspond to the ''ERenderStyle'' enum of the [[Legacy:Actor|Actor]] class.
; color DrawColor : Color to use for drawing. White (R=255,G=255,B=255) means draw everything in its default colors. If any color component is lower than 255 the specific color component of the [[Legacy:Material|Material]] or Font will be drawn darker. Alpha values specify the opacity of the drawn Material or Font. (A=255 means completely opaque) Also see [[Legacy:Color Blending|color blending]].
; Plane ColorModulate : Modulate all colors by this before rendering.
; float CurYL :  Largest Y size since DrawText.
; float FontScaleX, FontScaleY : 
; font Font : Font for DrawText.
; font MedFont :
; font SmallFont :
; font TinyFont : 
; string MedFontName, SmallFontName, TinyFontName : 
; [[Legacy:Viewport|Viewport]] Viewport (const) : Viewport that owns the canvas.
; pointer pCanvasUtil (const) : Used internally.

===UT2004 only===
; bool bForceAlpha : Force all drawing to be alpha'ed.
; float	ForcedAlpha : How much to force.

==Methods ==

===Texture Drawing===
; DrawTile( [[Legacy:Material|Material]] Mat, float XL, float YL, float U, float V, float UL, float VL ) : This draws a rectangle within the material onto the screen. The upper left of the material will be at the current pen position. 
;;Mat : The material to draw.
;;XL, YL : Width and height of the material on the screen, in number of pixels.
;;U, V : coordinates, within the material, of the upper left of the rectangular window.
;;UL, VL : width and height, in pixels, of the window within the material. 
; DrawTileClipped( [[Legacy:Material|Material]] Mat, float XL, float YL, float U, float V, float UL, float VL ) : Like DrawTile, but the material is clipped according to the region set by OrgX/OrgY and ClipX/ClipY.
; DrawTileStretched( [[Legacy:Material|Material]] Mat, float XL, float YL ) : Draws the whole material stretched to the specified size. The texture is divided into four parts and only the pixels along the horizontal and vertical center lines are stretched.
; DrawTileJustified( [[Legacy:Material|Material]] Mat, byte Justification, float XL, float YL ) : 
; DrawTileScaled( [[Legacy:Material|Material]] Mat, float XScale, float YScale ) : Draws the whole material scaled as specified by the multipliers.
; DrawPattern( [[Legacy:Material|Material]] Tex, float XL, float YL, float Scale ) : Draws the scaled material and repeats it to fill a rectangle of the specified size.
; DrawIcon( [[Legacy:Texture|Texture]] Tex, float Scale ) : Draws the whole texture once with the specified scaling. Unlike most other draw functions, this one doesn't work with all [[Legacy:Material|Material]] classes. Only materials subclassed from [[Legacy:Texture|Texture]] can be used, i.e. you can't use it to draw modifiers (shaders, etc.) or [[Legacy:ScriptedTexture|ScriptedTexture]]s.
; DrawRect( [[Legacy:Texture|Texture]] Tex, float RectX, float RectY ) : Draws the whole texture stretched to the specified size.
; DrawVertical( float X, float height ) : Draw a vertical line. The line's color is specified through DrawColor.
; DrawHorizontal( float Y, float width ) : Draw a horizontal line.
; DrawLine( int direction, float size ) : DrawLine is special as it saves it's original position. Direction: 0 = up, 1 = down, 2 = left, 3 = right
; DrawBracket( float width, float height, float bracket_size ) : 
; DrawBox( Canvas canvas, float width, float height ) : Draws a box of the specified size. For some reason this function doesn't draw on the Canvas object you call it from, but needs a Canvas object as the first parameter.

===Text Drawing===
; DrawText( coerce string Text, optional bool CR ) : 
; DrawTextClipped( coerce string Text, optional bool bCheckHotKey ) : 
; StrLen( coerce string String, out float XL, out float YL ) : Get the size of a string when it would be drawn using the current font. The text will be wrapped according to the canvas width.
; TextSize( coerce string String, out float XL, out float YL ) : Get the size of a string when it would be drawn using the current font. The text will be clipped at the 
; WrapStringToArray( string Text, out array&lt;string&gt; OutArray, float dx, string EOL ) : Takes Text and splits it based on how it would fit in the limitation of dx. Also will make a split when it encounters the characters contained in EOL. You can then use the strings of OutArray to make wrapped text by iterating through the array and placing each line of text one step lower than the last. dx would work best as an equation like Canvas.SizeX * 0.2 (20% of the Canvas width).
; WrapText( out String Text, out String Line, float dx, Font F, float FontScaleX ) (static) : 
; DrawTextJustified( coerce string String, byte Justification, float x1, float y1, float x2, float y2 ) : Draws String into the box starting at (x1, y1) and ending at (x2, y2). It justifies the text left, center or right, if justification is 0, 1 or 2 respectively.
; DrawScreenText( string Text, float X, float Y, EDrawPivot Pivot ) : 

===Actor Drawing===
; DrawActor( [[Legacy:Actor|Actor]] A, bool WireFrame, optional bool ClearZ, optional float DisplayFOV ) : 
; DrawScreenActor( [[Legacy:Actor|Actor]] A, optional float FOV, optional bool WireFrame, optional bool ClearZ ) : 
; DrawPortal( int X, int Y, int Width, int Height, [[Legacy:Actor|Actor]] CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ ) : It doesn't work when using OpenGL. ('''Note:''' The ClearZ argument does nothing, you have to manually clear the Z-buffer or you get strange results.  Call the '''Clear''' function below with ClearZ '''true''' before '''DrawPortal''')
;* '''kiff:''' no longer supported in UT3
; vector WorldToScreen( vector WorldLoc ) : Converts the given absolute world coordinates to canvas coordinates. The returned vector's X and Y components contain the coordinates. ''What is the Z component? a dot product of an angle maybe? &amp;ndash; Wormbo''
;* '''Missilemaster:''' If WorldLoc is behind you, X and Y are the same as when it's ahead of you, but Z changes from being &lt; 1 to being &gt; 1. So, you'll probably want to put &quot;if( Z &lt; 1.0 )&quot; in front of any drawing functions with this or whatever you draw will also appear when WorldLoc is behind you. ( Worked for me, at least. )
;* '''Sonic:''' Also when Z == 1.0 the teambeacon above players heads dissapears but doing if(Z == 1.0) wont work you will need to do if(float(string(Z)) == 1) so that it limits Z to 2 decimal places, i noticed without the float &gt; string &gt; float conversion it doesnt want to work.
; GetCameraLocation( out vector CameraLocation, out rotator CameraRotation ) : Returns the camera's location and rotation.
; Clear( optional bool ClearRGB, optional bool ClearZ ) : 
; SetScreenLight( int index, vector Position, color lightcolor, float radius ) : 
; SetScreenProjector( int index, vector Position, color color, float radius, [[Legacy:Texture|Texture]] tex ) :

===Other Functions===
; Reset() : Resets the canvas properties.
; SetPos( float X, float Y ) : Sets CurX/Y.
; SetOrigin( float X, float Y ) : Sets OrgX/Y.
; SetClip( float X, float Y ) : Sets ClipX/Y.
; SetDrawColor( byte R, byte G, byte B, optional byte A ) : Sets the DrawColor.
; Color MakeColor( byte R, byte G, byte B, optional byte A ) (static) : Returns a Color struct with the specified values. When A is not specified or set to 0, then A=255 is used.

===Native Functions===

&lt;UScript&gt;

native(464) final function StrLen( coerce string String, out float XL, out float YL ); // Wrapped!

native(465) final function DrawText( coerce string Text, optional bool CR );

native(466) final function DrawTile( material Mat, float XL, float YL, float U, float V, float UL, float VL );

native(467) final function DrawActor( Actor A, bool WireFrame, optional bool ClearZ, optional float DisplayFOV );

native(468) final function DrawTileClipped( Material Mat, float XL, float YL, float U, float V, float UL, float VL );

native(469) final function DrawTextClipped( coerce string Text, optional bool bCheckHotKey );

native(470) final function TextSize( coerce string String, out float XL, out float YL ); // Clipped!

native(480) final function DrawPortal( int X, int Y, int Width, int Height, actor CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ );

native final function vector WorldToScreen( vector WorldLoc );

native final function GetCameraLocation( out vector CameraLocation, out rotator CameraRotation );

native final function SetScreenLight( int index, vector Position, color lightcolor, float radius );

native final function SetScreenProjector( int index, vector Position, color color, float radius, texture tex );

native final function DrawScreenActor( Actor A, optional float FOV, optional bool WireFrame, optional bool ClearZ );

native final function Clear(optional bool ClearRGB, optional bool ClearZ);

native final function WrapStringToArray(string Text, out array&lt;string&gt; OutArray, float dx, optional string EOL);

static native final function WrapText( out String Text, out String Line, float dx, Font F, float FontScaleX );

native final function DrawTilePartialStretched( Material Mat, float XL, float YL ); // rjp

native final function DrawTileStretched(material Mat, float XL, float YL);

native final function DrawTileJustified(material Mat, byte Justification, float XL, float YL);

native final function DrawTileScaled(material Mat, float XScale, float YScale);

native final function DrawTextJustified(coerce string String, byte Justification, float x1, float y1, float x2, float y2);

native final function DrawActorClipped( Actor A, bool WireFrame, float Left, float Top, float Width, float Height, optional bool ClearZ, optional float DisplayFOV);

&lt;/UScript&gt;

==External Links==
* [[udn2:CanvasReference]]

==Related Topics==
* [[Legacy:HUD|HUD]] and [[Legacy:HUD Interactions|HUD Interactions]]
* [[Legacy:HudOverlay|HudOverlay]]
** [[Legacy:ScriptedHudOverlay|ScriptedHudOverlay]]

==Discussion==

'''TurkeyFromHell:''' Dude idk when you stuck those in here, but i am eternally grateful you did.. because i can't really do a google search through all my class sources for &quot;native render&quot; and find the DrawActor function now can I? :D &lt;3 Maybe I'll finally be able to draw stuff through walls -.-... we'll see :P

'''OlympusMons:''' Added the native functions, Im not sure if they are ut2k4 only or not so someone might want to check that. I hope Im doing good here, not sure if this is where these native functions should be going or not, the formatting might need to be changed also. Help please :P

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1981</id>
      <timestamp>2007-09-14T14:52:44Z</timestamp>
      <contributor>
        <ip>AC8F351D.ipt.aol.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Canvas (Package: Engine)}}

The '''Canvas''' is a wrapper for methods for drawing text, [[Legacy:Texture|Texture]]s and [[Legacy:Mesh|mesh]]es on the local player's screen.  Canvas objects are passed to various events and functions in the various classes, e.g. [[Legacy:HUD|HUD]], [[Legacy:Weapon|Weapon]], [[Legacy:GUI|GUI]] classes and [[Legacy:Interaction|Interaction]]s.

See [[Legacy:Canvas (UT)|Canvas (UT)]] for Canvas properties and methods available in UT.

==Properties ==
; bool bCenter : Whether to center the text.
; bool bNoSmooth : Whether bilinear filtering should ''not'' be applied.
; bool bRenderLevel : Will render the level if enabled.
; float ClipX, ClipY : Width and height of the clipping region.
; float CurX, CurY : Current position for drawing relative to origin set by OrgX/OrgY.
; float OrgX, OrgY : Origin for drawing and upper left corner of the clipping window.
; int SizeX, SizeY :  Zero-based actual dimensions.  
; float SpaceX, SpaceY :  Spacing for after executing one of the Draw* methods, i.e. this contains the screen size of the last drawn element.
; byte Style : The values of this variable correspond to the ''ERenderStyle'' enum of the [[Legacy:Actor|Actor]] class.
; color DrawColor : Color to use for drawing. White (R=255,G=255,B=255) means draw everything in its default colors. If any color component is lower than 255 the specific color component of the [[Legacy:Material|Material]] or Font will be drawn darker. Alpha values specify the opacity of the drawn Material or Font. (A=255 means completely opaque) Also see [[Legacy:Color Blending|color blending]].
; Plane ColorModulate : Modulate all colors by this before rendering.
; float CurYL :  Largest Y size since DrawText.
; float FontScaleX, FontScaleY : 
; font Font : Font for DrawText.
; font MedFont :
; font SmallFont :
; font TinyFont : 
; string MedFontName, SmallFontName, TinyFontName : 
; [[Legacy:Viewport|Viewport]] Viewport (const) : Viewport that owns the canvas.
; pointer pCanvasUtil (const) : Used internally.

===UT2004 only===
; bool bForceAlpha : Force all drawing to be alpha'ed.
; float	ForcedAlpha : How much to force.

==Methods ==

===Texture Drawing===
; DrawTile( [[Legacy:Material|Material]] Mat, float XL, float YL, float U, float V, float UL, float VL ) : This draws a rectangle within the material onto the screen. The upper left of the material will be at the current pen position. 
;;Mat : The material to draw.
;;XL, YL : Width and height of the material on the screen, in number of pixels.
;;U, V : coordinates, within the material, of the upper left of the rectangular window.
;;UL, VL : width and height, in pixels, of the window within the material. 
; DrawTileClipped( [[Legacy:Material|Material]] Mat, float XL, float YL, float U, float V, float UL, float VL ) : Like DrawTile, but the material is clipped according to the region set by OrgX/OrgY and ClipX/ClipY.
; DrawTileStretched( [[Legacy:Material|Material]] Mat, float XL, float YL ) : Draws the whole material stretched to the specified size. The texture is divided into four parts and only the pixels along the horizontal and vertical center lines are stretched.
; DrawTileJustified( [[Legacy:Material|Material]] Mat, byte Justification, float XL, float YL ) : 
; DrawTileScaled( [[Legacy:Material|Material]] Mat, float XScale, float YScale ) : Draws the whole material scaled as specified by the multipliers.
; DrawPattern( [[Legacy:Material|Material]] Tex, float XL, float YL, float Scale ) : Draws the scaled material and repeats it to fill a rectangle of the specified size.
; DrawIcon( [[Legacy:Texture|Texture]] Tex, float Scale ) : Draws the whole texture once with the specified scaling. Unlike most other draw functions, this one doesn't work with all [[Legacy:Material|Material]] classes. Only materials subclassed from [[Legacy:Texture|Texture]] can be used, i.e. you can't use it to draw modifiers (shaders, etc.) or [[Legacy:ScriptedTexture|ScriptedTexture]]s.
; DrawRect( [[Legacy:Texture|Texture]] Tex, float RectX, float RectY ) : Draws the whole texture stretched to the specified size.
; DrawVertical( float X, float height ) : Draw a vertical line. The line's color is specified through DrawColor.
; DrawHorizontal( float Y, float width ) : Draw a horizontal line.
; DrawLine( int direction, float size ) : DrawLine is special as it saves it's original position. Direction: 0 = up, 1 = down, 2 = left, 3 = right
; DrawBracket( float width, float height, float bracket_size ) : 
; DrawBox( Canvas canvas, float width, float height ) : Draws a box of the specified size. For some reason this function doesn't draw on the Canvas object you call it from, but needs a Canvas object as the first parameter.

===Text Drawing===
; DrawText( coerce string Text, optional bool CR ) : 
; DrawTextClipped( coerce string Text, optional bool bCheckHotKey ) : 
; StrLen( coerce string String, out float XL, out float YL ) : Get the size of a string when it would be drawn using the current font. The text will be wrapped according to the canvas width.
; TextSize( coerce string String, out float XL, out float YL ) : Get the size of a string when it would be drawn using the current font. The text will be clipped at the 
; WrapStringToArray( string Text, out array&lt;string&gt; OutArray, float dx, string EOL ) : Takes Text and splits it based on how it would fit in the limitation of dx. Also will make a split when it encounters the characters contained in EOL. You can then use the strings of OutArray to make wrapped text by iterating through the array and placing each line of text one step lower than the last. dx would work best as an equation like Canvas.SizeX * 0.2 (20% of the Canvas width).
; WrapText( out String Text, out String Line, float dx, Font F, float FontScaleX ) (static) : 
; DrawTextJustified( coerce string String, byte Justification, float x1, float y1, float x2, float y2 ) : Draws String into the box starting at (x1, y1) and ending at (x2, y2). It justifies the text left, center or right, if justification is 0, 1 or 2 respectively.
; DrawScreenText( string Text, float X, float Y, EDrawPivot Pivot ) : 

===Actor Drawing===
; DrawActor( [[Legacy:Actor|Actor]] A, bool WireFrame, optional bool ClearZ, optional float DisplayFOV ) : 
; DrawScreenActor( [[Legacy:Actor|Actor]] A, optional float FOV, optional bool WireFrame, optional bool ClearZ ) : 
; DrawPortal( int X, int Y, int Width, int Height, [[Legacy:Actor|Actor]] CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ ) : It doesn't work when using OpenGL. ('''Note:''' The ClearZ argument does nothing, you have to manually clear the Z-buffer or you get strange results.  Call the '''Clear''' function below with ClearZ '''true''' before '''DrawPortal''')
; vector WorldToScreen( vector WorldLoc ) : Converts the given absolute world coordinates to canvas coordinates. The returned vector's X and Y components contain the coordinates. ''What is the Z component? a dot product of an angle maybe? &amp;ndash; Wormbo''
;* '''Missilemaster:''' If WorldLoc is behind you, X and Y are the same as when it's ahead of you, but Z changes from being &lt; 1 to being &gt; 1. So, you'll probably want to put &quot;if( Z &lt; 1.0 )&quot; in front of any drawing functions with this or whatever you draw will also appear when WorldLoc is behind you. ( Worked for me, at least. )
;* '''Sonic:''' Also when Z == 1.0 the teambeacon above players heads dissapears but doing if(Z == 1.0) wont work you will need to do if(float(string(Z)) == 1) so that it limits Z to 2 decimal places, i noticed without the float &gt; string &gt; float conversion it doesnt want to work.
; GetCameraLocation( out vector CameraLocation, out rotator CameraRotation ) : Returns the camera's location and rotation.
; Clear( optional bool ClearRGB, optional bool ClearZ ) : 
; SetScreenLight( int index, vector Position, color lightcolor, float radius ) : 
; SetScreenProjector( int index, vector Position, color color, float radius, [[Legacy:Texture|Texture]] tex ) :

===Other Functions===
; Reset() : Resets the canvas properties.
; SetPos( float X, float Y ) : Sets CurX/Y.
; SetOrigin( float X, float Y ) : Sets OrgX/Y.
; SetClip( float X, float Y ) : Sets ClipX/Y.
; SetDrawColor( byte R, byte G, byte B, optional byte A ) : Sets the DrawColor.
; Color MakeColor( byte R, byte G, byte B, optional byte A ) (static) : Returns a Color struct with the specified values. When A is not specified or set to 0, then A=255 is used.

===Native Functions===

&lt;UScript&gt;

native(464) final function StrLen( coerce string String, out float XL, out float YL ); // Wrapped!

native(465) final function DrawText( coerce string Text, optional bool CR );

native(466) final function DrawTile( material Mat, float XL, float YL, float U, float V, float UL, float VL );

native(467) final function DrawActor( Actor A, bool WireFrame, optional bool ClearZ, optional float DisplayFOV );

native(468) final function DrawTileClipped( Material Mat, float XL, float YL, float U, float V, float UL, float VL );

native(469) final function DrawTextClipped( coerce string Text, optional bool bCheckHotKey );

native(470) final function TextSize( coerce string String, out float XL, out float YL ); // Clipped!

native(480) final function DrawPortal( int X, int Y, int Width, int Height, actor CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ );

native final function vector WorldToScreen( vector WorldLoc );

native final function GetCameraLocation( out vector CameraLocation, out rotator CameraRotation );

native final function SetScreenLight( int index, vector Position, color lightcolor, float radius );

native final function SetScreenProjector( int index, vector Position, color color, float radius, texture tex );

native final function DrawScreenActor( Actor A, optional float FOV, optional bool WireFrame, optional bool ClearZ );

native final function Clear(optional bool ClearRGB, optional bool ClearZ);

native final function WrapStringToArray(string Text, out array&lt;string&gt; OutArray, float dx, optional string EOL);

static native final function WrapText( out String Text, out String Line, float dx, Font F, float FontScaleX );

native final function DrawTilePartialStretched( Material Mat, float XL, float YL ); // rjp

native final function DrawTileStretched(material Mat, float XL, float YL);

native final function DrawTileJustified(material Mat, byte Justification, float XL, float YL);

native final function DrawTileScaled(material Mat, float XScale, float YScale);

native final function DrawTextJustified(coerce string String, byte Justification, float x1, float y1, float x2, float y2);

native final function DrawActorClipped( Actor A, bool WireFrame, float Left, float Top, float Width, float Height, optional bool ClearZ, optional float DisplayFOV);

&lt;/UScript&gt;

==External Links==
* [[udn2:CanvasReference]]

==Related Topics==
* [[Legacy:HUD|HUD]] and [[Legacy:HUD Interactions|HUD Interactions]]
* [[Legacy:HudOverlay|HudOverlay]]
** [[Legacy:ScriptedHudOverlay|ScriptedHudOverlay]]

==Discussion==

'''TurkeyFromHell:''' Dude idk when you stuck those in here, but i am eternally grateful you did.. because i can't really do a google search through all my class sources for &quot;native render&quot; and find the DrawActor function now can I? :D &lt;3 Maybe I'll finally be able to draw stuff through walls -.-... we'll see :P

'''OlympusMons:''' Added the native functions, Im not sure if they are ut2k4 only or not so someone might want to check that. I hope Im doing good here, not sure if this is where these native functions should be going or not, the formatting might need to be changed also. Help please :P

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Canvas (UT)</title>
    <id>767</id>
    <revision>
      <id>2189</id>
      <timestamp>2006-07-03T19:51:07Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Canvas (Package: Engine)}}

The '''Canvas''' is a wrapper for methods for drawing text, [[Legacy:Texture (UT)|texture]]s and [[Legacy:Mesh|mesh]]es on the local player's screen. Canvas objects are passed to various events and functions in the following classes:

{|

|-
|'''Class'''
|'''Comments''' 
|-
|[[Legacy:Actor (UT)|Actor (UT)]]
|Declares the event '''RenderOverlays'''.  RenderOverlays is called automatically when this actor is the local [[Legacy:PlayerPawn|PlayerPawn]]'s ViewTarget.
|-
|[[Legacy:Console|Console]]
|Declares the events '''PreRender''' and '''PostRender'''. PreRender is automatically called on each frame before the world is rendered and PostRender afterwards.
|-
|[[Legacy:Pawn (UT)|Pawn (UT)]]
|Declares the events '''PreRender''' and '''PostRender''' (see above).  Called on each frame for any Pawn possessed by the local player.
|-
|[[Legacy:HUD (UT)|HUD (UT)]]
|Declares the events '''PreRender''' and '''PostRender''' (see above).  Called on each frame while the HUD is visible.  In addition, '''RenderOverlays''' (declared in [[Legacy:Actor (UT)|Actor (UT)]]) is called by [[Legacy:PlayerPawn|PlayerPawn]] on each frame in its own RenderOverlays event.  If you create your own [[Legacy:HUD (UT)|HUD (UT)]] subclass, it's usually a better idea to overwrite just some of the other functions declared in HUD or [[Legacy:ChallengeHUD|ChallengeHUD]] (or a deeper subclass) which take care of drawing individual parts of the HUD.
|-
|[[Legacy:ScoreBoard|ScoreBoard]]
|Declares the function '''ShowScores''', called by ChallengeHUD on each frame in PostRender when the scoreboard is displayed.  Overwrite this function in a subclass to implement your own scoreboard.
|-
|[[Legacy:Mutator (UT)|Mutator (UT)]]
|Declares the event '''PostRender''', called by ChallengeHUD on each frame in PostRender if this mutator has registered itself as a HUD mutator.
|-
|[[Legacy:Weapon (UT)|Weapon (UT)]]
|'''RenderOverlays''' and '''PostRender''' (declared in Actor) are called by [[Legacy:Pawn (UT)|Pawn (UT)]] on each frame in RenderOverlays/PostRender when this weapon is currently active.  (See also the bOwnsCrosshair property in [[Legacy:Weapon (UT)|Weapon (UT)]].)
|-
|[[Legacy:UWindowWindow|UWindowWindow]]
|'''BeforePaint''', '''Paint''' and '''AfterPaint''' are called each frame to draw the window or dialog control.
|}

See [[Legacy:Canvas|Canvas]] for Canvas properties and methods available in UT2003.

'''Sobiwan:''' I looked for the function PostRender() in the the above classes and every one of them calls PostRender (canvas Canvas).  Since functions can pass a class type and a name, is the syntax for this case PostRender (type name)?   Is it saying &quot;run the postrender function on the class type canvas on the class name Canvas&quot;?  I dont understand why not just pass the type (canvas) since that is its name.

'''RDGDanClark:''' The function needs to know the type of variable that you're passing it, in all cases. What they've done here is a pretty good example of bad programming style. Just as you should never have a variable in your code of type &lt;tt&gt;int&lt;/tt&gt; called &lt;tt&gt;Int&lt;/tt&gt; or of type &lt;tt&gt;float&lt;/tt&gt; called &lt;tt&gt;Float&lt;/tt&gt;, you should never have a variable of type &lt;tt&gt;canvas&lt;/tt&gt; called &lt;tt&gt;Canvas&lt;/tt&gt;. You're right about the translation though, it is saying &quot;run the PostRender function using a passed variable of type &lt;tt&gt;canvas&lt;/tt&gt; that is called &lt;tt&gt;Canvas&lt;/tt&gt;&quot;.

==Properties ==
; float ClipX, ClipY :
; float CurX, CurY :
; float OrgX, OrgY :
; float SpaceX, SpaceY :
; float SizeX, SizeY (const) : Zero-based actual dimensions.
; float CurYL :
; byte Style : The values of this variable correspond to the ''ERenderStyle'' enum of the [[Legacy:Actor (UT)|Actor (UT)]] class, but that can't be used in this class.
; bool bCenter :
; bool bNoSmooth : Whether bilinear filtering should ''not'' be applied.
; color DrawColor : Color to use for drawing. White (R=255,G=255,B=255) means draw everything in its default colors. If any color component is lower than 255 the specific color component of the [[Legacy:Texture (UT)|Texture (UT)]] or Font will be drawn darker. (or more translucent, see [[Legacy:Color Blending|color blending]])
; Font Font :
; Font SmallFont, MedFont, BigFont, LargeFont :
; [[Legacy:Viewport|Viewport]] ViewPort (const) :
; float Z :

==Methods ==

===Texture Drawing ===
; DrawTile ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float U, float V, float UL, float VL) : This draws a rectangle within the texture onto the screen. The upper left of the texture will be at the current pen position. 
;* Tex  - the texture to draw.
;* XL, YL - width and height on the screen, in number of pixels.
;* U, V - coordinates, within the texture, of the upper left of the rectangular window.
;* UL, VL - width and height, in pixels, of the window within the texture. 

; DrawTileClipped ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float U, float V, float UL, float VL) :
; DrawPattern ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float Scale) : This draws the specifed texture onto the screen, tiling it to fit a rectangle.  The upper left of the rectangle will be at the current pen position.
;* Tex - the texture to draw.
;* XL, YL - width and height of the rectangle.
;* Scale - scale the texture (proportionately) by this ratio.

:'''Draconx:''' There are some bizarre things I've noticed with this function.  Try using it to draw onto a UWindow, then move that UWindow around to see an interesting effect.  I will have to investigate exactly what this function does later.  For drawing tiled backgrounds on UWindows, the DrawTile() function (defined in [[Legacy:UWindowWindow|UWindowWindow]]) seems to work much better.

; DrawIcon ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float Scale) : This draws and proportionately scales the specified texture onto the screen.  The upper left of the texture will be at the current pen position.
;* Tex - the texture to draw.
;* Scale - scale the texture by this ratio.

; DrawRect ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float RectX, float RectY) : This draws and disproportionately scales the specified texture onto the screen.  The upper left of the texture will be at the current pen position.
;* Tex - the texture to draw.
;* RectX - the new width of the texture
;* RectY - the new height of the texture

=== Text Drawing ==
; StrLen (coerce string String, out float XL, out float YL) : Get the size of a string when it would be drawn by DrawText() using the current font.
; DrawText (coerce string Text, optional bool CR) :
; DrawTextClipped (coerce string Text, optional bool bCheckHotKey) :
; TextSize (coerce string String, out float XL, out float YL) : Get the size of a string when it would be drawn by DrawTextClipped() using the current font.

===Actor Drawing ===
; DrawActor ([[Legacy:Actor (UT)|Actor (UT)]] A, bool WireFrame, optional bool ClearZ) : Draws the actor A at its current location, whether it's actually visible or not. The actor can be drawn as wire frame or how it actually looks. ClearZ causes the actor to be drawn on top of everything else, i.e. it will be visible even if it would normally be (partially or completely) obscured by other objects.
; DrawClippedActor ([[Legacy:Actor (UT)|Actor (UT)]] A, bool WireFrame, int X, int Y, int XB, int YB, optional bool ClearZ) : Same as DrawActor(), but only draws within the rectangle specified by X, Y, XB and YB.

===Misc Stuff ===
; DrawPortal (int X, int Y, int Width, int Height, [[Legacy:Actor (UT)|Actor (UT)]] CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ) : '''Note:''' This doesn't draw sprites (this includes particles and coronas) correctly in UT.
; Reset ( ) : Resets the canvas properties.
; SetPos (float X, float Y) : Sets the drawing position.
; SetOrigin (float X, float Y) : Sets the origin of the canvas by changing the OrgX and OrgY properties.
; SetClip (float X, float Y) : Sets the clipping size of the canvas by changing the ClipX and ClipY properties.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2190</id>
      <timestamp>2004-10-21T05:41:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Canvas (Package: Engine)}}

The '''Canvas''' is a wrapper for methods for drawing text, [[Legacy:Texture (UT)|texture]]s and [[Legacy:Mesh|mesh]]es on the local player's screen. Canvas objects are passed to various events and functions in the following classes:

{|

|-
|'''Class'''
|'''Comments''' 
|-
|[[Legacy:Actor (UT)|Actor (UT)]]
|Declares the event '''RenderOverlays'''.  RenderOverlays is called automatically when this actor is the local [[Legacy:PlayerPawn|PlayerPawn]]'s ViewTarget.
|-
|[[Legacy:Console|Console]]
|Declares the events '''PreRender''' and '''PostRender'''. PreRender is automatically called on each frame before the world is rendered and PostRender afterwards.
|-
|[[Legacy:Pawn (UT)|Pawn (UT)]]
|Declares the events '''PreRender''' and '''PostRender''' (see above).  Called on each frame for any Pawn possessed by the local player.
|-
|[[Legacy:HUD (UT)|HUD (UT)]]
|Declares the events '''PreRender''' and '''PostRender''' (see above).  Called on each frame while the HUD is visible.  In addition, '''RenderOverlays''' (declared in [[Legacy:Actor (UT)|Actor (UT)]]) is called by [[Legacy:PlayerPawn|PlayerPawn]] on each frame in its own RenderOverlays event.  If you create your own [[Legacy:HUD (UT)|HUD (UT)]] subclass, it's usually a better idea to overwrite just some of the other functions declared in HUD or [[Legacy:ChallengeHUD|ChallengeHUD]] (or a deeper subclass) which take care of drawing individual parts of the HUD.
|-
|[[Legacy:ScoreBoard|ScoreBoard]]
|Declares the function '''ShowScores''', called by ChallengeHUD on each frame in PostRender when the scoreboard is displayed.  Overwrite this function in a subclass to implement your own scoreboard.
|-
|[[Legacy:Mutator (UT)|Mutator (UT)]]
|Declares the event '''PostRender''', called by ChallengeHUD on each frame in PostRender if this mutator has registered itself as a HUD mutator.
|-
|[[Legacy:Weapon (UT)|Weapon (UT)]]
|'''RenderOverlays''' and '''PostRender''' (declared in Actor) are called by [[Legacy:Pawn (UT)|Pawn (UT)]] on each frame in RenderOverlays/PostRender when this weapon is currently active.  (See also the bOwnsCrosshair property in [[Legacy:Weapon (UT)|Weapon (UT)]].)
|-
|[[Legacy:UWindowWindow|UWindowWindow]]
|'''BeforePaint''', '''Paint''' and '''AfterPaint''' are called each frame to draw the window or dialog control.
|}

See [[Legacy:Canvas|Canvas]] for Canvas properties and methods available in UT2003.

'''Sobiwan:''' I looked for the function PostRender() in the the above classes and every one of them calls PostRender (canvas Canvas).  Since functions can pass a class type and a name, is the syntax for this case PostRender (type name)?   Is it saying &quot;run the postrender function on the class type canvas on the class name Canvas&quot;?  I dont understand why not just pass the type (canvas) since that is its name.

'''RDGDanClark:''' The function needs to know the type of variable that you're passing it, in all cases. What they've done here is a pretty good example of bad programming style. Just as you should never have a variable in your code of type &lt;tt&gt;int&lt;/tt&gt; called &lt;tt&gt;Int&lt;/tt&gt; or of type &lt;tt&gt;float&lt;/tt&gt; called &lt;tt&gt;Float&lt;/tt&gt;, you should never have a variable of type &lt;tt&gt;canvas&lt;/tt&gt; called &lt;tt&gt;Canvas&lt;/tt&gt;. You're right about the translation though, it is saying &quot;run the PostRender function using a passed variable of type &lt;tt&gt;canvas&lt;/tt&gt; that is called &lt;tt&gt;Canvas&lt;/tt&gt;&quot;.

==Properties ==
; float ClipX, ClipY :
; float CurX, CurY :
; float OrgX, OrgY :
; float SpaceX, SpaceY :
; float SizeX, SizeY (const) : Zero-based actual dimensions.
; float CurYL :
; byte Style : The values of this variable correspond to the ''ERenderStyle'' enum of the [[Legacy:Actor (UT)|Actor (UT)]] class, but that can't be used in this class.
; bool bCenter :
; bool bNoSmooth : Whether bilinear filtering should ''not'' be applied.
; color DrawColor : Color to use for drawing. White (R=255,G=255,B=255) means draw everything in its default colors. If any color component is lower than 255 the specific color component of the [[Legacy:Texture (UT)|Texture (UT)]] or Font will be drawn darker. (or more translucent, see [[Legacy:Color Blending|color blending]])
; Font Font :
; Font SmallFont, MedFont, BigFont, LargeFont :
; [[Legacy:Viewport|Viewport]] ViewPort (const) :
; float Z :

==Methods ==

===Texture Drawing ===
; DrawTile ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float U, float V, float UL, float VL) : This draws a rectangle within the texture onto the screen. The upper left of the texture will be at the current pen position. 
;* Tex  - the texture to draw.
;* XL, YL - Width and height on the screen, in number of pixels.
;* U, V - coordinates, within the texture, of the upper left of the rectangular window.
;* UL, VL - width and height, in pixels, of the window within the texture. 

; DrawTileClipped ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float U, float V, float UL, float VL) :
; DrawPattern ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float Scale) :
; DrawIcon ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float Scale) : This draws and proportionately scales the specified texture onto the screen.  The upper left of the texture will be at the current pen position.
;* Tex - the texture to draw.
;* Scale - scale the texture by this ratio.

; DrawRect ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float RectX, float RectY) : This draws and disproportionately scales the specified texture onto the screen.  The upper left of the texture will be at the current pen position.
;* Tex - the texture to draw.
;* RectX - the new width of the texture
;* RectY - the new height of the texture

=== Text Drawing ==
; StrLen (coerce string String, out float XL, out float YL) : Get the size of a string when it would be drawn by DrawText() using the current font.
; DrawText (coerce string Text, optional bool CR) :
; DrawTextClipped (coerce string Text, optional bool bCheckHotKey) :
; TextSize (coerce string String, out float XL, out float YL) : Get the size of a string when it would be drawn by DrawTextClipped() using the current font.

===Actor Drawing ===
; DrawActor ([[Legacy:Actor (UT)|Actor (UT)]] A, bool WireFrame, optional bool ClearZ) : Draws the actor A at its current location, whether it's actually visible or not. The actor can be drawn as wire frame or how it actually looks. ClearZ causes the actor to be drawn on top of everything else, i.e. it will be visible even if it would normally be (partially or completely) obscured by other objects.
; DrawClippedActor ([[Legacy:Actor (UT)|Actor (UT)]] A, bool WireFrame, int X, int Y, int XB, int YB, optional bool ClearZ) : Same as DrawActor(), but only draws within the rectangle specified by X, Y, XB and YB.

===Misc Stuff ===
; DrawPortal (int X, int Y, int Width, int Height, [[Legacy:Actor (UT)|Actor (UT)]] CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ) : '''Note:''' This doesn't draw sprites (this includes particles and coronas) correctly in UT.
; Reset ( ) : Resets the canvas properties.
; SetPos (float X, float Y) : Sets the drawing position.
; SetOrigin (float X, float Y) : Sets the origin of the canvas by changing the OrgX and OrgY properties.
; SetClip (float X, float Y) : Sets the clipping size of the canvas by changing the ClipX and ClipY properties.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2191</id>
      <timestamp>2005-10-25T15:25:52Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*Added notes on DrawPattern()</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Canvas (Package: Engine)}}

The '''Canvas''' is a wrapper for methods for drawing text, [[Legacy:Texture (UT)|texture]]s and [[Legacy:Mesh|mesh]]es on the local player's screen. Canvas objects are passed to various events and functions in the following classes:

{|

|-
|'''Class'''
|'''Comments''' 
|-
|[[Legacy:Actor (UT)|Actor (UT)]]
|Declares the event '''RenderOverlays'''.  RenderOverlays is called automatically when this actor is the local [[Legacy:PlayerPawn|PlayerPawn]]'s ViewTarget.
|-
|[[Legacy:Console|Console]]
|Declares the events '''PreRender''' and '''PostRender'''. PreRender is automatically called on each frame before the world is rendered and PostRender afterwards.
|-
|[[Legacy:Pawn (UT)|Pawn (UT)]]
|Declares the events '''PreRender''' and '''PostRender''' (see above).  Called on each frame for any Pawn possessed by the local player.
|-
|[[Legacy:HUD (UT)|HUD (UT)]]
|Declares the events '''PreRender''' and '''PostRender''' (see above).  Called on each frame while the HUD is visible.  In addition, '''RenderOverlays''' (declared in [[Legacy:Actor (UT)|Actor (UT)]]) is called by [[Legacy:PlayerPawn|PlayerPawn]] on each frame in its own RenderOverlays event.  If you create your own [[Legacy:HUD (UT)|HUD (UT)]] subclass, it's usually a better idea to overwrite just some of the other functions declared in HUD or [[Legacy:ChallengeHUD|ChallengeHUD]] (or a deeper subclass) which take care of drawing individual parts of the HUD.
|-
|[[Legacy:ScoreBoard|ScoreBoard]]
|Declares the function '''ShowScores''', called by ChallengeHUD on each frame in PostRender when the scoreboard is displayed.  Overwrite this function in a subclass to implement your own scoreboard.
|-
|[[Legacy:Mutator (UT)|Mutator (UT)]]
|Declares the event '''PostRender''', called by ChallengeHUD on each frame in PostRender if this mutator has registered itself as a HUD mutator.
|-
|[[Legacy:Weapon (UT)|Weapon (UT)]]
|'''RenderOverlays''' and '''PostRender''' (declared in Actor) are called by [[Legacy:Pawn (UT)|Pawn (UT)]] on each frame in RenderOverlays/PostRender when this weapon is currently active.  (See also the bOwnsCrosshair property in [[Legacy:Weapon (UT)|Weapon (UT)]].)
|-
|[[Legacy:UWindowWindow|UWindowWindow]]
|'''BeforePaint''', '''Paint''' and '''AfterPaint''' are called each frame to draw the window or dialog control.
|}

See [[Legacy:Canvas|Canvas]] for Canvas properties and methods available in UT2003.

'''Sobiwan:''' I looked for the function PostRender() in the the above classes and every one of them calls PostRender (canvas Canvas).  Since functions can pass a class type and a name, is the syntax for this case PostRender (type name)?   Is it saying &quot;run the postrender function on the class type canvas on the class name Canvas&quot;?  I dont understand why not just pass the type (canvas) since that is its name.

'''RDGDanClark:''' The function needs to know the type of variable that you're passing it, in all cases. What they've done here is a pretty good example of bad programming style. Just as you should never have a variable in your code of type &lt;tt&gt;int&lt;/tt&gt; called &lt;tt&gt;Int&lt;/tt&gt; or of type &lt;tt&gt;float&lt;/tt&gt; called &lt;tt&gt;Float&lt;/tt&gt;, you should never have a variable of type &lt;tt&gt;canvas&lt;/tt&gt; called &lt;tt&gt;Canvas&lt;/tt&gt;. You're right about the translation though, it is saying &quot;run the PostRender function using a passed variable of type &lt;tt&gt;canvas&lt;/tt&gt; that is called &lt;tt&gt;Canvas&lt;/tt&gt;&quot;.

==Properties ==
; float ClipX, ClipY :
; float CurX, CurY :
; float OrgX, OrgY :
; float SpaceX, SpaceY :
; float SizeX, SizeY (const) : Zero-based actual dimensions.
; float CurYL :
; byte Style : The values of this variable correspond to the ''ERenderStyle'' enum of the [[Legacy:Actor (UT)|Actor (UT)]] class, but that can't be used in this class.
; bool bCenter :
; bool bNoSmooth : Whether bilinear filtering should ''not'' be applied.
; color DrawColor : Color to use for drawing. White (R=255,G=255,B=255) means draw everything in its default colors. If any color component is lower than 255 the specific color component of the [[Legacy:Texture (UT)|Texture (UT)]] or Font will be drawn darker. (or more translucent, see [[Legacy:Color Blending|color blending]])
; Font Font :
; Font SmallFont, MedFont, BigFont, LargeFont :
; [[Legacy:Viewport|Viewport]] ViewPort (const) :
; float Z :

==Methods ==

===Texture Drawing ===
; DrawTile ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float U, float V, float UL, float VL) : This draws a rectangle within the texture onto the screen. The upper left of the texture will be at the current pen position. 
;* Tex  - the texture to draw.
;* XL, YL - width and height on the screen, in number of pixels.
;* U, V - coordinates, within the texture, of the upper left of the rectangular window.
;* UL, VL - width and height, in pixels, of the window within the texture. 

; DrawTileClipped ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float U, float V, float UL, float VL) :
; DrawPattern ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float XL, float YL, float Scale) : This draws the specifed texture onto the screen, tiling it to fit a rectangle.  The upper left of the rectangle will be at the current pen position.
;* Tex - the texture to draw.
;* XL, YL - width and height of the rectangle.
;* Scale - scale the texture (proportionately) by this ratio.

:'''Draconx:''' There are some bizarre things I've noticed with this function.  Try using it to draw onto a UWindow, then move that UWindow around to see an interesting effect.  I will have to investigate exactly what this function does later.  For drawing tiled backgrounds on UWindows, the DrawTile() function (defined in UWindowWindow) seems to work much better.

; DrawIcon ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float Scale) : This draws and proportionately scales the specified texture onto the screen.  The upper left of the texture will be at the current pen position.
;* Tex - the texture to draw.
;* Scale - scale the texture by this ratio.

; DrawRect ([[Legacy:Texture (UT)|Texture (UT)]] Tex, float RectX, float RectY) : This draws and disproportionately scales the specified texture onto the screen.  The upper left of the texture will be at the current pen position.
;* Tex - the texture to draw.
;* RectX - the new width of the texture
;* RectY - the new height of the texture

=== Text Drawing ==
; StrLen (coerce string String, out float XL, out float YL) : Get the size of a string when it would be drawn by DrawText() using the current font.
; DrawText (coerce string Text, optional bool CR) :
; DrawTextClipped (coerce string Text, optional bool bCheckHotKey) :
; TextSize (coerce string String, out float XL, out float YL) : Get the size of a string when it would be drawn by DrawTextClipped() using the current font.

===Actor Drawing ===
; DrawActor ([[Legacy:Actor (UT)|Actor (UT)]] A, bool WireFrame, optional bool ClearZ) : Draws the actor A at its current location, whether it's actually visible or not. The actor can be drawn as wire frame or how it actually looks. ClearZ causes the actor to be drawn on top of everything else, i.e. it will be visible even if it would normally be (partially or completely) obscured by other objects.
; DrawClippedActor ([[Legacy:Actor (UT)|Actor (UT)]] A, bool WireFrame, int X, int Y, int XB, int YB, optional bool ClearZ) : Same as DrawActor(), but only draws within the rectangle specified by X, Y, XB and YB.

===Misc Stuff ===
; DrawPortal (int X, int Y, int Width, int Height, [[Legacy:Actor (UT)|Actor (UT)]] CamActor, vector CamLocation, rotator CamRotation, optional int FOV, optional bool ClearZ) : '''Note:''' This doesn't draw sprites (this includes particles and coronas) correctly in UT.
; Reset ( ) : Resets the canvas properties.
; SetPos (float X, float Y) : Sets the drawing position.
; SetOrigin (float X, float Y) : Sets the origin of the canvas by changing the OrgX and OrgY properties.
; SetClip (float X, float Y) : Sets the clipping size of the canvas by changing the ClipX and ClipY properties.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Canvas (UT3)</title>
    <id>929</id>
    <revision>
      <id>2534</id>
      <timestamp>2008-02-12T13:06:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created class page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT3|UT3]] :: [[Legacy:Object (UT3)|Object (UT3)]] &gt;&gt; Canvas (Package: Engine)}}

A drawing canvas.

Instances of this class are provided for drawing onto the HUD or (since UT3 Patch 2) into a [[Legacy:ScriptedTexture (UT3)|ScriptedTexture (UT3)]].

==Properties==
; [[Legacy:Font (UT3)|Font (UT3)]] Font : Font for DrawText.
; float OrgX
; float OrgY : Origin for drawing.
; float ClipX
; float ClipY : Bottom right clipping region.
; float CurX
; float CurY : Current position for drawing.
; float CurYL : Largest Y size since DrawText.
; color DrawColor : Color for drawing.
; bool bCenter : Whether to center the text.
; bool bNoSmooth : Don't bilinear filter.
; int SizeX
; int SizeY : Zero-based actual dimensions.
; pointer Canvas{FCanvas} : 
; pointer SceneView{FSceneView} : 
; plane ColorModulate : 
; [[Legacy:Texture2D|Texture2D]] DefaultTexture : 

==Structs==

===CanvasIcon===

Specifies a region on a texture.

; [[Legacy:Texture2D|Texture2D]] Texture : Source texture

; float U
; float V : Left upper corner coordinates of the texture region.

; float UL
; float VL : Width and height of the region.

----

[[:Category:Legacy Class (UT3)]]

[[:Category:Legacy To Do]] &amp;ndash; function descriptions
[[Category:Legacy Class (UT3)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Capone</title>
    <id>894</id>
    <revision>
      <id>2469</id>
      <timestamp>2005-01-27T17:56:44Z</timestamp>
      <contributor>
        <ip>Hsdbrg64-110-208-231.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">===A bit about me... ===

I'm 22 years old from Houston, TX. I currently go to college for programming, animation, as well as starting a degree in computer engineering. I've only been around the unreal scene for about a year now. I've learned quite a bit from this wiki as well as a few very talented and patient people. I figure it's about time I get together a few of my creations and write up some tutorials to give back to the community. As soon as I get a bit of freetime I'll see if I can get them posted.

==Contact ==
*Mail: capone@modprojects.com
*IRC: #ut2004mods, #unrealscript on gamesurge.net

==Current Work ==
*Lead Programmer: ([http://unrealprojects.com/usmarshals/index.php LawDogs])
*Project Lead: ([http://www.rivalplayas.com Rival Playas])
*Programmer ([http://www.roadkillwarriors.com RoadKill Warriors])

==Previous work ==
*Programmer ([http://www.hackerz.tc Hackerz])

==Guest Book==

'''EntropicLqd:''' Hi.  Welcome to the Wiki.  Enjoy your stay here. :).

'''Tarquin:''' Hello! :D

'''RegularX:''' Heya Cap.

'''MythOpus:''' Welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2470</id>
      <timestamp>2005-01-27T14:37:00Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===A bit about me... ===

I'm 22 years old from Houston, TX. I currently go to college for programming, animation, as well as starting a degree in computer engineering. I've only been around the unreal scene for about a year now. I've learned quite a bit from this wiki as well as a few very talented and patient people. I figure it's about time I get together a few of my creations and write up some tutorials to give back to the community. As soon as I get a bit of freetime I'll see if I can get them posted.

==Contact ==
*Mail: capone@modprojects.com
*IRC: #ut2004mods, #unrealscript on gamesurge.net

==Current Work ==
*Lead Programmer: ([http://unrealprojects.com/usmarshals/index.php LawDogs])
*Project Lead: ([http://www.rivalplayas.com Rival Playas])
*Programmer ([http://www.roadkillwarriors.com RoadKill Warriors])

==Previous work ==
*Programmer ([http://www.hackerz.tc Hackerz])

==Guest Book==

'''EntropicLqd:''' Hi.  Welcome to the Wiki.  Enjoy your stay here. :).

'''Tarquin:''' Hello! :D

'''RegularX:''' Heya Cap.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Captain Kewl</title>
    <id>678</id>
    <revision>
      <id>1982</id>
      <timestamp>2003-06-01T23:56:58Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|''Captain Kewl'':  Kewlness Incarnate, and the Kewlest of the Kewl.  The standard by which all things kewl are judged.  Think kewl.  Even kewler.  Now even kewler than that.  That's how kewl I am.}}

Contact me at ''jasonyu at boilingpoint dot com''.  I also pathologically poke my head in ''#marathon'' on ''irc.utchat.com'' throughout the day.

AKA &quot;The Eggplant Wizard&quot; on EpicKnights.com.

&lt;br /&gt;&lt;br&gt;

[http://www.boilingpoint.com/~jasonyu/ Lame Placeholder Webpage]&lt;br&gt;

[http://www.boilingpoint.com/~jasonyu/ut/ A Page of Unreal Stuff]&lt;br&gt;

[http://resurrection.bungie.org/forum/index.pl?read=2381 The Secret Origin of Captain Kewl]

----

'''EntropicLqd:''' I just read you XCTF developer journal.  Regarding the bot AI.  I asked the Epic chaps whether you could change the bot AI using a mutator (for the single flag CTF mod I'm writing) .  The answer is yes, but, Steve Polge reccomended that I actually created my own game type for this.  I might have issues otherwise.  Good luck btw.

I would love to see the off-hand grapple as a mutator though - that was my fave mod for Quake :)

: '''captk:''' Alrighty then &amp;ndash; that problem's solved.  Thanks for reading. :)

''TaoPaiPai:'' Hey Jason Is that you?

''Captain K:'' In the flesh.  er, as it were.  Hey all.
:''TaoPaiPai:'' Hey that's me Laurent from 'ew.u' :)

''Tarquin:'' Hi. Welcome aboard :-) 

''ArcaneSpeech:'' Why do people think &quot;kewl&quot; is so cool? Not that it isn't, it's just always irked me for no particular reason.

''Goner:'' Read The Secret Origin of Captain Kewl to find out!

'''GRAF!K:''' You think highly of yourself. ;-) (See top of page)

'''capt.''' And you're not kewl enough to post on my page.  Just wait till I pimp my OMFG 1337 new TC MOD with a bunch of concept drawings and 900,000-poly model renderings in Maya.  That'll show you.

'''GRAF!K:''' ;-)

'''MinisterFish:''' Thanks for the work on the U2ModMenu. Should make some things simpler.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1983</id>
      <timestamp>2003-05-12T18:20:46Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|''Captain Kewl'':  Kewlness Incarnate, and the Kewlest of the Kewl.  The standard by which all things kewl are judged.  Think kewl.  Even kewler.  Now even kewler than that.  That's how kewl I am.}}

Contact me at ''jasonyu at boilingpoint dot com''.  I also pathologically poke my head in ''#marathon'' on ''irc.utchat.com'' throughout the day.

AKA &quot;The Eggplant Wizard&quot; on EpicKnights.com.

&lt;br /&gt;&lt;br&gt;

[http://www.boilingpoint.com/~jasonyu/ Lame Placeholder Webpage]&lt;br&gt;

[http://www.boilingpoint.com/~jasonyu/ut/ A Page of Unreal Stuff]&lt;br&gt;

[http://resurrection.bungie.org/forum/index.pl?read=2381 The Secret Origin of Captain Kewl]

----

'''EntropicLqd:''' I just read you XCTF developer journal.  Regarding the bot AI.  I asked the Epic chaps whether you could change the bot AI using a mutator (for the single flag CTF mod I'm writing) .  The answer is yes, but, Steve Polge reccomended that I actually created my own game type for this.  I might have issues otherwise.  Good luck btw.

I would love to see the off-hand grapple as a mutator though - that was my fave mod for Quake :)

: '''captk:''' Alrighty then &amp;ndash; that problem's solved.  Thanks for reading. :)

''TaoPaiPai:'' Hey Jason Is that you?

''Captain K:'' In the flesh.  er, as it were.  Hey all.
:''TaoPaiPai:'' Hey that's me Laurent from 'ew.u' :)

''Tarquin:'' Hi. Welcome aboard :-) 

''ArcaneSpeech:'' Why do people think &quot;kewl&quot; is so cool? Not that it isn't, it's just always irked me for no particular reason.

''Goner:'' Read The Secret Origin of Captain Kewl to find out!

'''GRAF!K:''' You think highly of yourself. ;-) (See top of page)

'''capt.''' And you're not kewl enough to post on my page.  Just wait till I pimp my OMFG 1337 new TC MOD with a bunch of concept drawings and 900,000-poly model renderings in Maya.  That'll show you.

'''MinisterFish:''' Thanks for the work on the U2ModMenu. Should make some things simpler.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Captain Kewl/Developer Journal</title>
    <id>738</id>
    <revision>
      <id>2120</id>
      <timestamp>2005-01-11T15:30:00Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====05 Oct 2002====

Last monday I made my way to the local EB and forced them to happily sell me a copy of UT2k3 before they were ready to put it up on display.  In the days since, I have spent unhealthy amounts of time studying the new codebase, and can thus far only conclude this:

I am shocked and APPALLED that they have removed the &quot;Fatness&quot; actor display property.

In spite of this tragedy, I feel it is my duty to not only myself but to the greater UT community that I continue in my efforts to contribute.  Thus we take our first steps toward the As-yet-unnamed &quot;XCTF&quot;-based mod.

My working idea for constructing this mod is to use a series of mutators, each responsible for specific rules.  The reason why I chose this is because 1.) A basic CTF gametype already exists in 2k3, and 2.) the additional rules (full weapons), are general enough that they can be effectively applied to virtually any other gametype as well.  Avoid redundancy and insure consistency.

The only real sticking point here is the Grapple.  The difficult part isn't the implementation of the grapple itself, but effective application to the Bot AI.  Would we be able to get away with using mutators for this?  In UT I implemented bot grappling by co-opting the actions induced by the translocator &amp;ndash; none of the AI changes were made to the Bots themselves.  I haven't looked through the 2k3 code in depth yet, but in UT translocation was handled specifically by the navgationpoints and the X-loc itself: the navigationpoint forced the bot to switch to the X-loc and then fire.  Keeping it short, my implementation of the grapple involved simply replacing the X-loc and tweaking where the bot aimed.

So yes, it's possible to get a bot to use a grapple to get to unreachable places without gutting the bot AI.  But something that sticks out in my mind about 2k3 is the way bots USE the X-loc.  As a means of normal travel, even if it's just to the other side of a room.  If we're going to have a grapple, it's only right that we have the bots use it in the same *intelligent* manner it uses the X-loc... which raises the issue of whether or not the same hack can be used.  When using the X-loc to travel, are bots still using navpoints?  Or are they just using fuzzy logic to guess how best to get to their destination?

If it's the latter, then we might have to go the route of tweaking the bot controller AI.  Which is where we have to decide about mutator use.  Would a mutator be the best way to swap controllers?  (Is it even possible with a mutator?)

Mutator construction itself is still pretty straightforward.  Game Rules &amp;ndash; player stats, scoring, and damage modification &amp;ndash; have now been split off from GameInfo.  Thus for a mutator to hook into any of the GameRules functions, you now need to accompany the mutator with GameRules subclass.  It's otherwise pretty much unchanged.

====07 Oct 2002====

The DE particle emission class == cool.  It’s about damn time UT had some proper support for beam effects.

So the grapple is in and more or less functional.  Interesting exercise in aquinting myself with the new structure for weapons; there’s now something like 5 different classes to deal with.  The weapon as an inventory class is still intact, but really now just exists to serve the same purpose as ammo – to show that the weapon exists in the player’s inventory.  Facets of the weapon have been abstracted into wholely separate classes, including ones which represent the weapon as viewed as either a pickup or 3pp, and ones which control the actual weapon behavior.  Which actually makes a whole lot of sense, particularly the different pickup and 3pp classes, but makes things a bit more difficult to keep track of.

The grapple is more or less based on various previous UT implementations, mostly my own.  The weapon fires a projectile which, when it lands, adds a velocity to the player which draws him near.  One nice thing about the WeaponFire class is that the abstraction supports firing modes that are contingent upon the player holding the fire button down; no need for any kind of tick-bound “if ( bFire != 0 )” checks.  Thus the grapple can have two modes:  the first is a Quake-style automatic recall on buttonup, the alternate fire is a normal fire/recall.  The rope is implemented using an xEmitter subclass, largely based on the Ion Painter beam.

I subclassed the xPlayer controller class in order to put in an exec function which grabs the grapple in inventory and co-opts its WeaponFire.  I’m using the alt mode, so calling the “hook” function once will fire the hook, and calling it again, or “unhook”, will recall it.  There’s our offhand grapple.  I’m considering removing this and placing it in an inventory item instead – it would make an offhand/no offhand gametype configuration easier to implement, I think.

The keybinding for the grapple goes to an alias… don’t have my user.ini open right now, but it’s something like “hook | onbuttonup unhook”  I’m a bit trepid about going this route – somehow it evokes that shock combo binding used by people who aren’t coordinated enough to move two fingers.  For a while I was considering implementing another input byte… but then, that would also require using a similar alias, and on top of that, could get pretty nasty code-wise with the grapple needing some controller-specific code; it counters the abstraction I’d like to maintain.  Choose the lesser of two evils, I guess.

Net code is probably a bigger priority than bot support.  Arbitrarily calling AddVelocity for the purpose of pawn locomotion isn’t the most client-friendly thing to do.  Player movement prediction is pretty much how I had it figured while toying with the idea of changing player physics on M:R – all taken care of in the controller’s PlayerMove() function which makes one call to the client and one call to the server – though it’s nice that they now have comments which confirm this.  I’m thinking more and more that I’m going to have to go with a new movement state.  (Hey, if we’re going to mess around with the controller, might as well go all the way.)

====13 Oct 2002====

Um…  [http://www.boilingpoint.com/~jasonyu/ut/ I got distracted].

Anyway.  I ended up going with a new movement state for the playerpawn.  

Each time the user manually presses a key to move in any direction, an acceleration is applied to the pawn.  This acceleration is what causes the player to move – the player’s velocity is what results.  Client prediction doesn’t care about the velocity – the player’s position over time – but instead uses the acceleration – the player’s velocity over time.  That way it can not only determine the client’s position, but also where it will likely be in the next update.

Arbitrarily using AddVelocity doesn’t work, since velocity is neither replicated nor predicted.  The new version of the grapple instead tells the player to accelerate in a given vector and sends the player to the new state, “Hooked”.  There the controller uses state-specific versions of PlayerMove and ProcessMove to handle the changes.  The Hooked state itself is extended from the PlayerFlying state, as we basically want the same thing – to have the player fly – only in this case the player’s acceleration will only be affected by the grapple and no player input.

The magnitude of acceleration for grappling players is 2048, the same amount used for all pawn movenent with the exception of jumping, which I believe is something like 6000.  The latter is more than sufficient, though, as with such a player can easily do instant 180-degree turns and start running in the opposite direction without missing a beat.  The grapple tells the player to cap the maximum air speed at 700, so a grappling player will never move at more than twice as fast as his running speed.  This value will most likely undergo further tweaking.

Oh, and bots can grapple-walk.  Basically done by hacking up the xloc-hop code and refitting it for use with the grapple.  Bots use manual fire on the immediate next node they want to travel to, and when they are pulled close enough, the grapple unhooks.  The  grapple will automatically unhook and drop the bot after two seconds anyway, just to insure that the bot doesn’t somehow get stuck.  Still needs some tweaking – need to write up some better logic for the bots’s grapple aiming.  Keep it from shooting the hook off into space while aiming at an uphill target.  Things like that.  Need to work on getting the bots to grapple on to actual targets, ie high platforms, next.

Seeing the bots use the grapple to get around is extremely, extremely gratifying.

====21 Oct 2002====

And then I passed everything off to the guys at the [http://www.thecgn.com/q2/ Coliseum] to tweak to their hearts' content.

If anyone else is interested in the sources, drop me a note and I'll hook you up.  (Ba-dum-bum-crash!)

====20 Nov 2002====

Something I hacked together, based on a [[Legacy:Lens_Flare|discussion]] from sometime back.

[http://www.boilingpoint.com/~jasonyu/ut/lensflare.jpg]

====21 Nov 2002====

Some tweaking of the textures and placement.  Another screenshot:

[http://www.boilingpoint.com/~jasonyu/ut/lensflare2.jpg]

What I'd like is to be able to somehow hook into however standard coronas are rendered and have the flares mirror that behavior.  I suspect it's somewhere in the native code, though, so I may be SOL.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2121</id>
      <timestamp>2005-01-11T15:08:27Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-scar.boom.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-rosacea.boom.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-product.boom.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-medicine.boom.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://acne-treatment.boom.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Captain Kewl/Mod PR</title>
    <id>737</id>
    <revision>
      <id>2118</id>
      <timestamp>2005-01-11T15:26:04Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bah.  Nobody cares about your 1337 3dsMax renderings of 2000-poly weapon models you can't figure out how to get into the game.  Put up or shut up.

----

'''Mychaeel:''' ...or find a mod team that's interested in your skills.  Unfortunately modellers without coding skills indeed have a technical disadvantage when it comes to Unreal Tournament:  Their models are useless for end users until somebody codes a player class around them.  :-(

'''Mychaeel:''' ...or are you talking about mod teams whose mods don't at all meet the expectations their PR arose?  See [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] and especially the last few comments there.

'''capt. k.:'''  Yeah.  I'm just not opinionated enough to write an entire dissertation.  :)

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2119</id>
      <timestamp>2005-01-11T15:05:54Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-scar.boom.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-rosacea.boom.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-product.boom.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-medicine.boom.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://acne-treatment.boom.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CaptureVolume</title>
    <id>772</id>
    <revision>
      <id>2201</id>
      <timestamp>2007-11-18T17:01:04Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Linking Volumes and Control Points==

''Or, how I learned to stop worrying and love my volume!''

{{innerbox|Goes without saying, but if you sample any of this code please give me credit somewhere in your script.  Also, note that I'm not the cleanest coder in the world, so be sure to check and double check!  Share the love baby!

Props go to the Adster.  Visit his page @ http://www.speakerprojects.com/index.html and tell him he's sexy.

}}

The origin of this page comes from a project I'm currently working. For the mod, it was necessary to track player position and then have an icon fade in and out on the hud.  I'm not going to go into the fades right now since that's a whole monster to itself.  What I'm going to focus on is how to link a control point to a capture volume and, using the two, get it to display icons onto the HUD.

==Writing The Code==

You need to create some new UnrealScript classes. You can either:
* [[Legacy:Create A Subclass|Create a subclass]] in UnrealEd for each of the following scripts,
* or create a [[Legacy:Package|package]] containing all of these classes.

'''Note:''' Using UnrealEd is not recommended.  Instead, use any of the [[Legacy:Text Editor| suggested text editors]].

===CaptureVolume===

The first thing you want to do is [[Legacy:Create A Subclass|create a subclass]] of the [[Legacy:Volume|volume]] class. The volume will be used to track when a player enters (or leaves) a given space.

&lt;uscript&gt;
/*
Extended Volume Class

Graham Ross 9/21/04

An extended volume class to help display the names of
rooms on the HUD

*/
//Graham Ross (thanks Adster!!!)
//An interactive volume to trigger elements on the HUD
// 10/13/04
//=============================================================================

class captureVolume extends PhysicsVolume;

var( ) Int captureVolumeNumber;
var CapturePoint ourCapturePoint;

var int volumeNumber;
var bool inVolume;

simulated function PostBeginPlay( )
{
	local NavigationPoint nP;

	Super.PostBeginPlay( );

	for( nP = Level.NavigationPointList; nP != None; nP = nP.NextNavigationPoint )
	{
		if( !nP.IsA( 'CapturePoint' ) )
			continue;

		if( CapturePoint( nP ).capturePointNumber == captureVolumeNumber )
		{
			ourCapturePoint = CapturePoint( nP );
			ourCapturePoint.SetMaster( self );
			break;
		}
	}
}

event PawnEnteredVolume( Pawn other )
{
	if( ( other.IsPlayerPawn() )
		&amp;&amp; ( ourCapturePoint != None ) &amp;&amp; (other.PlayerReplicationInfo != none))   //is the problem that the capt. point is none?
	{
		if( customPawn( other ) != none )
        	rscPRI(other.PlayerReplicationInfo).cVolumeNumber = captureVolumeNumber;

 		ourCapturePoint.Touched( other);

     }
}

event PawnLeavingVolume( Pawn other )
{
    if((  other  != none )&amp;&amp; ( ourCapturePoint != None )&amp;&amp; (other.PlayerReplicationInfo != none))
    {
		if( customPawn( other ) != none )
        	 rscPRI(other.PlayerReplicationInfo).cVolumeNumber = 0;

		ourCapturePoint.Untouched( other);
    }
}

defaultproperties
{
	captureVolumeNumber=255
	volumeNumber = -1;
}
&lt;/uscript&gt;

So you'll notice there are a few things I'm keeping track of.  First, in the PostBeginPlay function, I'm cycling through all the NavigationPoints in the level.  If it is a CapturePoint (or a subclass of it), I proceed forward and match up the number of capture points to the number of the volume, two attributes I've manually set from within the level.  You'll also notice I have two checks for whether the pawn enters or leaves a volume.  This is the most important part of the code.  When a player enters the volume, it calls the Touched and Untouched functions of the capture point.  We'll get into that part shortly.

'''Note:''' I've set captureVolumeNumber and Volume number to 255 and -1, two out of range types.

===CapturePoint===

Now we move on to creating a custom CapturePoint for our new CaptureVolumes to link to.

&lt;uscript&gt;

//  Graham Ross (Thanks Adster!!!)
// class for altering the function of GameObjective.
//
//=============================================================================

class CapturePoint extends GameObjective
	Placeable;

var( ) localized String captureName;
var( ) Name captureEvent; 
var( ) Int capturePointNumber;

var CaptureVolume captureVolume;

simulated function PostBeginPlay( )
{
	Super.PostBeginPlay( );
}


function SetMaster( CaptureVolume ourCaptureVolume )
{
	if( ourCaptureVolume != None )
		captureVolume = ourCaptureVolume;
}



function Touched( Pawn other)
{

}

function Untouched( Pawn other)
{

}

function ResetPoint( Bool bEnabled )
{


}

defaultproperties
{
   	bHidden=False
	capturePointNumber=-1
	captureName=&quot;A Capture Point&quot;
	bUseCylinderCollision=True
	RemoteRole=ROLE_SimulatedProxy
	bAlwaysRelevant=True
	bStasis=False
	bStatic=False
	bNoDelete=True
	bNetNotify=True
	CollisionRadius=60.000000
	CollisionHeight=40.000000
	DrawScale=0.60000
	bCollideActors=True
	bBlockActors=False
	bBlockPlayers=False
	NetUpdateFrequency=8
	ObjectiveName=&quot;Capture Point&quot;

}
&lt;/uscript&gt;

You'll notice there's not much there.  Basically the only thing I want is the touched and untouched function.  This will allow me to interact easily with the [[Legacy:HUD|HUD]] and draw upon it.  I personally wasn't able to find a way to interact solely using the volume and the HUD.  It's also helpful to note that the triggering is not done by the CapturePoint, but done by the CaptureVolume which then interacts with their specified CapturePoint.

'''Note:''' You must create a custom [[Legacy:Player Replication Info|Player Replication Info]] for your player to hold a single variable that will track the volume number.

===Custom PlayerReplicationInfo===

&lt;uscript&gt;
// Graham Ross
// 10/13/04
//
// Custom PRI to use with my volume and my hud

class rscPRI extends xPlayerReplicationInfo;

var int cVolumeNumber;

defaultproperties
{
       cVolumeNumber = 0
}
&lt;/uscript&gt;

The last bit of code will do the drawing on the hud for us.  I'm using a HUD interaction here, in my opinion the best way to draw on the HUD.

At the top, declare something like this:

&lt;uscript&gt;
var enum volumeNo
{
    VN_None,
    VN_Bal1,
    VN_Bal2
}  VNStatus;
&lt;/uscript&gt;

Later, do something like this...

&lt;uscript&gt;
simulated function checkGlowVariable(canvas c)
{



    switch(rscPRI(pOwner.PlayerReplicationInfo).cVolumeNumber)
      {
         case 0:
               VNStatus = VN_None;  fadeout = true;
               break;

         case 1:
               VNStatus = VN_Bal1;    fadeout = true;
               break;

         case 2:
               VNStatus = VN_Bal2;     fadeout = true;
               break;

         default:

        }

}

&lt;/uscript&gt;

In the DrawHud function (or separate function that will be called) put in the following code:

&lt;uscript&gt; 
simulated function checkGlowInfo()
{

    local byte tempStyle;
    local color tempColor;



    glowMoveX = shiftX;
    glowMoveY = ShiftY;



    tempStyle = Cv.Style;
    tempcolor = Cv.DrawColor;


    cv.SetDrawColor(255, 255, 255, 0);
    cv.SetPos((cv.ClipX - xpos * HUDscaleX), (cv.ClipY - ypos * HUDScaley));
    cv.DrawIcon( LastRoom, sizeIcon * (hudScaleX + hudScaleY));


    cv.SetDrawColor(255, 255, 255, fade);
    cv.SetPos((cv.ClipX - xpos * HUDscaleX), (cv.ClipY - ypos * HUDScaley));
    cv.DrawIcon( pLastRoom, sizeIcon * (hudScaleX + hudScaleY));

    cv.SetDrawColor(255, 255, 255, mapOp);
    cv.SetPos((cv.CLipX  - (xGlow-glowMoveX) * HUDScaleX), (cv.ClipY - (yGlow-glowMoveY) * HUDScaleY));
    cv.DrawIcon( pLastGlow,  sizeGlow * (hudScaleX + hudScaleY));
   
    switch (VNStatus)
    {

       case VN_None:
          resetfade();
          break;

       case VN_Bal1:
          plastRoom = blank;   lastVolume = 12;    pLastGlow = Bal1_g; ShiftX = 5;  ShiftY = 0;
          break;

       case VN_Bal2:
          plastRoom = blank;  lastVolume = 13;   pLastGlow = Bal2_g; ShiftX = -5; ShiftY = 0;
          break;


       default:
          pLastRoom = blank ;
          pLastGlow = Hall_g ;
          resetfade();
          break;
    }
}
&lt;/uscript&gt;

Please note that the reason I'm doing it this way is becuase of my fades.  I faked my fades by having them come in on top of each other, so I needed to track the last icon that came up, then draw it and have it stay to give the appearance of a cross-fade.  You could easily track player position and then have it just pop instantly onto the screen...

==Linking Through UnrealEd==

Okay, hopefully you can just hand this off to a level designer and say &quot;Link the numbers slave of GUI!&quot;.  But for those less fortunate of us, here's how you link the two together.

#* If you've created a package, after you've compiled all your scripts, go to the [[Legacy:Actor Browser|actor browser]] and load the package under the actor classes tab. This will bring your scripts into UEd and allow you to access them and place them on your level. 
#* If you've created classes within UnrealEd, they should already be in the [[Legacy:Actor Browser|actor browser]] once you compile in he [[Legacy:Script Editor|Script Editor]] window.
# [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; CapturePoint. 
# [[Legacy:Add A Volume|Add a Volume]] of the new class, CaptureVolume.
# Now comes the tricky part. Select your capturepoint. Open the actor ptoperites window and set the capturePointNum to a valid number, like 1.  The, go under the events rollout and give it a tag, like MED_CP or something.
# Select the corresponding volume.  Give the volume the name number as the capture point (1) and then under the events rollout set the event name to the tag of the capture point (MED_CP).  This will effectively link the two. Here's a brief overview on how to better [[Legacy:Match These Tags|match these tags]]

That's about it.  If you have problems, make sure your tags match between the two.  Also, another trick I've found is to set the draw coords to somehting like 500 by 500, so you can make sure it's actually drawing and not getting covered by something.

Confused about what 'trigger' means?  Here's a good definition of what [[Legacy:Triggered|triggered]] means.

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2202</id>
      <timestamp>2007-07-08T01:44:49Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>sub headers</comment>
      <text xml:space="preserve">==Linking Volumes and Control Points==

''Or, how I learned to stop worrying and love my volume!''

{{innerbox|Goes without saying, but if you sample any of this code please give me credit somewhere in your script.  Also, note that I'm not the cleanest coder in the world, so be sure to check and double check!  Share the love baby!

Props go to the Adster.  Visit his page @ http://www.speakerprojects.com/index.html and tell him he's sexy.

}}

The origin of this page comes from a project I'm currently working. For the mod, it was necessary to track player position and then have an icon fade in and out on the hud.  I'm not going to go into the fades right now since that's a whole monster to itself.  What I'm going to focus on is how to link a control point to a capture volume and, using the two, get it to display icons onto the HUD.

==Writing The Code==

You need to create some new UnrealScript classes. You can either:
* [[Legacy:Create A Subclass|Create a subclass]] in UnrealEd for each of the following scripts,
* or create a [[Legacy:Package|package]] containing all of these classes.

'''Note:''' Using UnrealEd is not recommended.  Instead, use any of the [[Legacy:Text Editor| suggested text editors]].

===CaptureVolume===

The first thing you want to do is [[Legacy:Create A Subclass|create a subclass]] of the [[Legacy:Volume|volume]] class. The volume will be used to track when a player enters (or leaves) a given space.

&lt;uscript&gt;
/*
Extended Volume Class

Graham Ross 9/21/04

An extended volume class to help display the names of
rooms on the HUD

*/
//Graham Ross (thanks Adster!!!)
//An interactive volume to trigger elements on the HUD
// 10/13/04
//=============================================================================

class captureVolume extends PhysicsVolume;

var( ) Int captureVolumeNumber;
var CapturePoint ourCapturePoint;

var int volumeNumber;
var bool inVolume;

simulated function PostBeginPlay( )
{
	local NavigationPoint nP;

	Super.PostBeginPlay( );

	for( nP = Level.NavigationPointList; nP != None; nP = nP.NextNavigationPoint )
	{
		if( !nP.IsA( 'CapturePoint' ) )
			continue;

		if( CapturePoint( nP ).capturePointNumber == captureVolumeNumber )
		{
			ourCapturePoint = CapturePoint( nP );
			ourCapturePoint.SetMaster( self );
			break;
		}
	}
}

event PawnEnteredVolume( Pawn other )
{
	if( ( other.IsPlayerPawn() )
		&amp;&amp; ( ourCapturePoint != None ) &amp;&amp; (other.PlayerReplicationInfo != none))   //is the problem that the capt. point is none?
	{
		if( customPawn( other ) != none )
        	rscPRI(other.PlayerReplicationInfo).cVolumeNumber = captureVolumeNumber;

 		ourCapturePoint.Touched( other);

     }
}

event PawnLeavingVolume( Pawn other )
{
    if((  other  != none )&amp;&amp; ( ourCapturePoint != None )&amp;&amp; (other.PlayerReplicationInfo != none))
    {
		if( customPawn( other ) != none )
        	 rscPRI(other.PlayerReplicationInfo).cVolumeNumber = 0;

		ourCapturePoint.Untouched( other);
    }
}

defaultproperties
{
	captureVolumeNumber=255
	volumeNumber = -1;
}
&lt;/uscript&gt;

So you'll notice there are a few things I'm keeping track of.  First, in the PostBeginPlay function, I'm cycling through all the NavigationPoints in the level.  If it is a CapturePoint (or a subclass of it), I proceed forward and match up the number of capture points to the number of the volume, two attributes I've manually set from within the level.  You'll also notice I have two checks for whether the pawn enters or leaves a volume.  This is the most important part of the code.  When a player enters the volume, it calls the Touched and Untouched functions of the capture point.  We'll get into that part shortly.

'''Note:''' I've set captureVolumeNumber and Volume number to 255 and -1, two out of range types.

===CapturePoint===

Now we move on to creating a custom CapturePoint for our new CaptureVolumes to link to.

&lt;uscript&gt;

//  Graham Ross (Thanks Adster!!!)
// class for altering the function of GameObjective.
//
//=============================================================================

class CapturePoint extends GameObjective
	Placeable;

var( ) localized String captureName;
var( ) Name captureEvent; 
var( ) Int capturePointNumber;

var CaptureVolume captureVolume;

simulated function PostBeginPlay( )
{
	Super.PostBeginPlay( );
}


function SetMaster( CaptureVolume ourCaptureVolume )
{
	if( ourCaptureVolume != None )
		captureVolume = ourCaptureVolume;
}



function Touched( Pawn other)
{

}

function Untouched( Pawn other)
{

}

function ResetPoint( Bool bEnabled )
{


}

defaultproperties
{
   	bHidden=False
	capturePointNumber=-1
	captureName=&quot;A Capture Point&quot;
	bUseCylinderCollision=True
	RemoteRole=ROLE_SimulatedProxy
	bAlwaysRelevant=True
	bStasis=False
	bStatic=False
	bNoDelete=True
	bNetNotify=True
	CollisionRadius=60.000000
	CollisionHeight=40.000000
	DrawScale=0.60000
	bCollideActors=True
	bBlockActors=False
	bBlockPlayers=False
	NetUpdateFrequency=8
	ObjectiveName=&quot;Capture Point&quot;

}
&lt;/uscript&gt;

You'll notice there's not much there.  Basically the only thing I want is the touched and untouched function.  This will allow me to interact easily with the [[Legacy:HUD|HUD]] and draw upon it.  I personally wasn't able to find a way to interact solely using the volume and the HUD.  It's also helpful to note that the triggering is not done by the CapturePoint, but done by the CaptureVolume which then interacts with their specified CapturePoint.

'''Note:''' You must create a custom [[Legacy:Player Replication Info|Player Replication Info]] for your player to hold a single variable that will track the volume number.

===Custom PlayerReplicationInfo===

&lt;uscript&gt;
// Graham Ross
// 10/13/04
//
// Custom PRI to use with my volume and my hud

class rscPRI extends xPlayerReplicationInfo;

var int cVolumeNumber;

defaultproperties
{
       cVolumeNumber = 0
}
&lt;/uscript&gt;

The last bit of code will do the drawing on the hud for us.  I'm using a HUD interaction here, in my opinion the best way to draw on the HUD.

At the top, declare something like this:

&lt;uscript&gt;
var enum volumeNo
{
    VN_None,
    VN_Bal1,
    VN_Bal2
}  VNStatus;
&lt;/uscript&gt;

Later, do something like this...

&lt;uscript&gt;
simulated function checkGlowVariable(canvas c)
{



    switch(rscPRI(pOwner.PlayerReplicationInfo).cVolumeNumber)
      {
         case 0:
               VNStatus = VN_None;  fadeout = true;
               break;

         case 1:
               VNStatus = VN_Bal1;    fadeout = true;
               break;

         case 2:
               VNStatus = VN_Bal2;     fadeout = true;
               break;

         default:

        }

}

&lt;/uscript&gt;

In the DrawHud function (or separate function that will be called) put in the following code:

&lt;uscript&gt; 
simulated function checkGlowInfo()
{

    local byte tempStyle;
    local color tempColor;



    glowMoveX = shiftX;
    glowMoveY = ShiftY;



    tempStyle = Cv.Style;
    tempcolor = Cv.DrawColor;


    cv.SetDrawColor(255, 255, 255, 0);
    cv.SetPos((cv.ClipX - xpos * HUDscaleX), (cv.ClipY - ypos * HUDScaley));
    cv.DrawIcon( LastRoom, sizeIcon * (hudScaleX + hudScaleY));


    cv.SetDrawColor(255, 255, 255, fade);
    cv.SetPos((cv.ClipX - xpos * HUDscaleX), (cv.ClipY - ypos * HUDScaley));
    cv.DrawIcon( pLastRoom, sizeIcon * (hudScaleX + hudScaleY));

    cv.SetDrawColor(255, 255, 255, mapOp);
    cv.SetPos((cv.CLipX  - (xGlow-glowMoveX) * HUDScaleX), (cv.ClipY - (yGlow-glowMoveY) * HUDScaleY));
    cv.DrawIcon( pLastGlow,  sizeGlow * (hudScaleX + hudScaleY));
   
    switch (VNStatus)
    {

       case VN_None:
          resetfade();
          break;

       case VN_Bal1:
          plastRoom = blank;   lastVolume = 12;    pLastGlow = Bal1_g; ShiftX = 5;  ShiftY = 0;
          break;

       case VN_Bal2:
          plastRoom = blank;  lastVolume = 13;   pLastGlow = Bal2_g; ShiftX = -5; ShiftY = 0;
          break;


       default:
          pLastRoom = blank ;
          pLastGlow = Hall_g ;
          resetfade();
          break;
    }
}
&lt;/uscript&gt;

Please note that the reason I'm doing it this way is becuase of my fades.  I faked my fades by having them come in on top of each other, so I needed to track the last icon that came up, then draw it and have it stay to give the appearance of a cross-fade.  You could easily track player position and then have it just pop instantly onto the screen...

==Linking Through UnrealEd==

Okay, hopefully you can just hand this off to a level designer and say &quot;Link the numbers slave of GUI!&quot;.  But for those less fortunate of us, here's how you link the two together.

#* If you've created a package, after you've compiled all your scripts, go to the [[Legacy:Actor Browser|actor browser]] and load the package under the actor classes tab. This will bring your scripts into UEd and allow you to access them and place them on your level. 
#* If you've created classes within UnrealEd, they should already be in the [[Legacy:Actor Browser|actor browser]] once you compile in he [[Legacy:Script Editor|Script Editor]] window.
# [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; CapturePoint. 
# [[Legacy:Add A Volume|Add a Volume]] of the new class, CaptureVolume.
# Now comes the tricky part. Select your capturepoint. Open the actor ptoperites window and set the capturePointNum to a valid number, like 1.  The, go under the events rollout and give it a tag, like MED_CP or something.
# Select the corresponding volume.  Give the volume the name number as the capture point (1) and then under the events rollout set the event name to the tag of the capture point (MED_CP).  This will effectively link the two. Here's a brief overview on how to better [[Legacy:Match These Tags|match these tags]]

That's about it.  If you have problems, make sure your tags match between the two.  Also, another trick I've found is to set the draw coords to somehting like 500 by 500, so you can make sure it's actually drawing and not getting covered by something.

Confused about what 'trigger' means?  Here's a good definition of what [[Legacy:Triggered|triggered]] means.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Capturing Unreal Video</title>
    <id>679</id>
    <revision>
      <id>1984</id>
      <timestamp>2007-08-07T18:58:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">==Introduction ==

There are many methods and reasons behind capturing footage. You may want to make a movie using [[Legacy:Matinee|Matinee]] or you want an animated level preview. Either way there are different programs to use which help the process.

==Fraps ==

Fraps is a program orginally designed to display your framerate in all OpenGL and DirectX games. It also has the ability to capture the output of any of these games and write them to an avi file. Unfortunately the output file is huge and will no doubt need to be compressed. I would recommend the latest version of DivX. Finally for editing of the avi file you'll probably want to use a program such as Virtual Dub. Fraps does not capture sound at all. OpenGL is the recommended mode of capture for Fraps version 1.9a and below. For 1.9b and above, Geforce users will see DirectX is also recommended along with OpenGL.
* http://www.fraps.com
* http://www.doom9.org/software.htm#divxencs for DivX information

'''ShortCutMan:''' Just a small note, Fraps is in version 2.0 now, and can capture sound with the movie. But

you now have to pay if you want to take for than 30 seconds of video. Its $29.95US.

==Movie Unreal ++ ==

Runs from the command prompt, starts UT with a particular map and outputs a huge stream of BMP or JPEG files at a set framerate.
* http://www.perilith.com/movieunrealplusplus/

==Unreal Movie Studio ==

Unreal Movie Studio is a Matinee style [[Legacy:Gametype|Gametype]] for Unreal Tournament. This is not availble in UT2003. Maps must be edited and have their Gametype set to a special type defined by this package.  Not video capture per se but rather planned, scripted ingame demos. Fully controlled cinematics for single player campaigns or even stand alone movies can be made using the studio, and tutorials are available from the UMS site. See [[Legacy:UMS|UMS]].

==Related Topics ==
* [[Legacy:Application|Application]]</text>
    </revision>
    <revision>
      <id>1985</id>
      <timestamp>2003-12-15T08:02:50Z</timestamp>
      <contributor>
        <ip>ShortCutMan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

There are many methods and reasons behind capturing footage. You may want to make a movie using [[Legacy:Matinee|Matinee]] or you want an animated level preview. Either way there are different programs to use which help the process.

==Fraps ==

Fraps is a program orginally designed to display your framerate in all OpenGL and DirectX games. It also has the ability to capture the output of any of these games and write them to an avi file. Unfortunately the output file is huge and will no doubt need to be compressed. I would recommend the latest version of DivX. Finally for editing of the avi file you'll probably want to use a program such as Virtual Dub. Fraps does not capture sound at all. OpenGL is the recommended mode of capture for Fraps version 1.9a and below. For 1.9b and above, Geforce users will see DirectX is also recommended along with OpenGL.
* http://www.fraps.com
* http://www.doom9.org/software.htm#divxencs for DivX information

'''ShortCutMan:''' Just a small note, Fraps is in version 2.0 now, and can capture sound with the movie. But

you now have to pay if you want to take for than 30 seconds of video. Its $29.95US.

==Movie Unreal ++ ==

Runs from the command prompt, starts UT with a particular map and outputs a huge stream of BMP or JPEG files at a set framerate.
* http://www.perilith.com/movieunrealplusplus/

==Unreal Movie Studio ==

Unreal Movie Studio is a Matinee style [[Legacy:Gametype|Gametype]] for Unreal Tournament. This is not availble in UT2003. Maps must be edited and have their Gametype set to a special type defined by this package.  Not video capture per se but rather planned, scripted ingame demos. Fully controlled cinematics for single player campaigns or even stand alone movies can be made using the studio, and tutorials are available from the UMS site. See [[Legacy:UMS|UMS]].

==Related Topics ==
* [[Legacy:Application|Application]]</text>
    </revision>
    <revision>
      <id>1986</id>
      <timestamp>2007-08-07T14:31:02Z</timestamp>
      <contributor>
        <ip>Arkady.indymedia.org</ip>
      </contributor>
      <comment>*Capturing Unreal Video</comment>
      <text xml:space="preserve">==Introduction ==

There are many methods and reasons behind capturing footage. You may want to make a movie using [[Legacy:Matinee|Matinee]] or you want an animated level preview. Either way there are different programs to use which help the process.

==Fraps ==

Fraps is a program orginally designed to display your framerate in all OpenGL and DirectX games. It also has the ability to capture the output of any of these games and write them to an avi file. Unfortunately the output file is huge and will no doubt need to be compressed. I would recommend the latest version of DivX. Finally for editing of the avi file you'll probably want to use a program such as Virtual Dub. Fraps does not capture sound at all. OpenGL is the recommended mode of capture for Fraps version 1.9a and below. For 1.9b and above, Geforce users will see DirectX is also recommended along with OpenGL.
* http://www.fraps.com
* http://www.doom9.org/software.htm#divxencs for DivX information

'''ShortCutMan:''' Just a small note, Fraps is in version 2.0 now, and can capture sound with the movie. But

you now have to pay if you want to take for than 30 seconds of video. Its $29.95US.

==Movie Unreal ++ ==

Runs from the command prompt, starts UT with a particular map and outputs a huge stream of BMP or JPEG files at a set framerate.
* http://www.perilith.com/movieunrealplusplus/
* [http://www.bestessaytips.com/ best essay tips]

==Unreal Movie Studio ==

Unreal Movie Studio is a Matinee style [[Legacy:Gametype|Gametype]] for Unreal Tournament. This is not availble in UT2003. Maps must be edited and have their Gametype set to a special type defined by this package.  Not video capture per se but rather planned, scripted ingame demos. Fully controlled cinematics for single player campaigns or even stand alone movies can be made using the studio, and tutorials are available from the UMS site. See [[Legacy:UMS|UMS]].

==Related Topics ==
* [[Legacy:Application|Application]]</text>
    </revision>
    <revision>
      <id>43319</id>
      <timestamp>2010-05-21T17:03:48Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve">==Introduction ==

There are many methods and reasons behind capturing footage. You may want to make a [http://www.bestessaytips.com best essay tips] movie using [[Legacy:Matinee|Matinee]] or you want an animated level preview. Either way there are different programs to use which help the process.

==Fraps ==

Fraps is a program orginally designed to display your framerate in all OpenGL and DirectX games. It also has the ability to capture the output of any of these games and write them to an avi file. Unfortunately the output file is huge and will no doubt need to be compressed. I would recommend the latest version of DivX. Finally for editing of the avi file you'll probably want to use a program such as Virtual Dub. Fraps does not capture sound at all. OpenGL is the recommended mode of capture for Fraps version 1.9a and below. For 1.9b and above, Geforce users will see DirectX is also recommended along with OpenGL.
* http://www.fraps.com
* http://www.doom9.org/software.htm#divxencs for DivX information

'''ShortCutMan:''' Just a small note, Fraps is in version 2.0 now, and can capture sound with the movie. But

you now have to pay if you want to take for than 30 seconds of video. Its $29.95US.

==Movie Unreal ++ ==

Runs from the command prompt, starts UT with a particular map and outputs a huge stream of BMP or JPEG files at a set framerate.
* http://www.perilith.com/movieunrealplusplus/

==Unreal Movie Studio ==

Unreal Movie Studio is a Matinee style [[Legacy:Gametype|Gametype]] for Unreal Tournament. This is not availble in UT2003. Maps must be edited and have their Gametype set to a special type defined by this package.  Not video capture per se but rather planned, scripted ingame demos. Fully controlled cinematics for single player campaigns or even stand alone movies can be made using the studio, and tutorials are available from the UMS site. See [[Legacy:UMS|UMS]].

==Related Topics ==
* [[Legacy:Application|Application]]</text>
    </revision>
    <revision>
      <id>43336</id>
      <timestamp>2010-05-22T04:23:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">==Introduction ==

There are many methods and reasons behind capturing footage. You may want to make a movie using [[Legacy:Matinee|Matinee]] or you want an animated level preview. Either way there are different programs to use which help the process.

==Fraps ==

Fraps is a program orginally designed to display your framerate in all OpenGL and DirectX games. It also has the ability to capture the output of any of these games and write them to an avi file. Unfortunately the output file is huge and will no doubt need to be compressed. I would recommend the latest version of DivX. Finally for editing of the avi file you'll probably want to use a program such as Virtual Dub. Fraps does not capture sound at all. OpenGL is the recommended mode of capture for Fraps version 1.9a and below. For 1.9b and above, Geforce users will see DirectX is also recommended along with OpenGL.
* http://www.fraps.com
* http://www.doom9.org/software.htm#divxencs for DivX information

'''ShortCutMan:''' Just a small note, Fraps is in version 2.0 now, and can capture sound with the movie. But

you now have to pay if you want to take for than 30 seconds of video. Its $29.95US.

==Movie Unreal ++ ==

Runs from the command prompt, starts UT with a particular map and outputs a huge stream of BMP or JPEG files at a set framerate.
* http://www.perilith.com/movieunrealplusplus/

==Unreal Movie Studio ==

Unreal Movie Studio is a Matinee style [[Legacy:Gametype|Gametype]] for Unreal Tournament. This is not availble in UT2003. Maps must be edited and have their Gametype set to a special type defined by this package.  Not video capture per se but rather planned, scripted ingame demos. Fully controlled cinematics for single player campaigns or even stand alone movies can be made using the studio, and tutorials are available from the UMS site. See [[Legacy:UMS|UMS]].

==Related Topics ==
* [[Legacy:Application|Application]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Carcass</title>
    <id>743</id>
    <revision>
      <id>2131</id>
      <timestamp>2005-01-14T03:09:23Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Decoration (UT)|Decoration (UT)]] &gt;&gt; Carcass (Package: Engine)}}

The base class for dead bodies and body parts.

==Properties==
; bool bPlayerCarcass : 
; byte flies : 
; byte rats : 
; bool bReducedHeight : 
; bool bDecorative : 
; bool bSlidingCarcass : 
; int CumulativeDamage : 
; [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] PlayerOwner : 
; [[Legacy:Pawn (UT)|Pawn (UT)]] Bugs : 

==Methods==
; CreateReplacement ( ) : 
; Initfor ([[Legacy:Actor (UT)|Actor (UT)]] Other) : 
; ChunkUp (int Damage) : 
; bool AllowChunk (int N, name A) [static, simulated] : 

===State Dead===
; AddFliesAndRats ( ) : 
; CheckZoneCarcasses ( ) : 

==Known Subclasses==
* [[Legacy:CreatureCarcass|CreatureCarcass]] (Contains whole bodies of [[Legacy:Pawn (UT)|Pawn (UT)]]s from Unreal.  These can be mutilated into [[Legacy:CreatureChunks|CreatureChunks]].)
* [[Legacy:CreatureChunks|CreatureChunks]] (Contains body parts such as heads, tails, arms, legs, and guts from Unreal's [[Legacy:Pawn (UT)|Pawn (UT)]]s.
* [[Legacy:UTHumanCarcass|UTHumanCarcass]] 
* [[Legacy:UTCreatureChunks|UTCreatureChunks]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2132</id>
      <timestamp>2005-01-13T23:25:21Z</timestamp>
      <contributor>
        <ip>Lepam03.pamlico.k12.nc.us</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Carrying Multiple Flags</title>
    <id>849</id>
    <revision>
      <id>2368</id>
      <timestamp>2004-11-07T18:06:49Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Carrying multiple flags adds a fun element to flag-related game types, but it's a bit tricky to pull off because certain things weren't quite designed to work that way. There are two parts to making it work: getting the visual effect of the player carrying all those flags, and working around the fact that [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] only has the one &lt;tt&gt;HasFlag&lt;/tt&gt; field.

The visual effect part works completely differently in UT and UT2003/04, because the regular effect of carrying a single flag is different.

==The visual effect in UT==

I'll discuss how this was done in [http://uncommonplace.com/games/ctf4.html CTF4].

The tricky thing about this effect in UT is that when you see a player carrying a flag, the flag you see ''isn't'' the real [[Legacy:CTFFlag (UT)|CTFFlag]] object; the real flag stays where it was and just goes invisible. The effect is apparently some hard-wired thing that the game automatically draws whenever the [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo]]'s HeldFlag field has something in it. So in order to immitate that, I created a HeldFlag class (subclassing [[Legacy:Effects (UT)|Effects (UT)]]) to be the fake carried flag.

In CTF4Flag's Held.BeginState function, it looks at the other flags in the game to see if the new holder is also holding one of them. If so, it creates a HeldFlag object. There are actually three HeldFlag classes, each with a different offset in its default properties. Later flags have a bigger offset than flags picked up earlier.

To get the HeldFlag to follow the player, at first I tried using [[Legacy:PhysicsType|PHYS_Trailer]], but the flag didn't maintain the correct relative location when the player turned. So I ended up having to use a simulated Tick function to constantly update the flag's position. The weird thing is it still doesn't exactly match the behavior of the game's built-in held flag effect, so I have no idea what method they used.

&lt;uscript&gt;
simulated function Tick(float DeltaTime)
{
	local vector X,Y,Z;
	
	GetAxes(Owner.Rotation,X,Y,Z);
	SetLocation(Owner.Location - (X * (28+Distance)) + (Z * 20));
	SetRotation(Owner.Rotation);
	if (Pawn(Owner).PlayerReplicationInfo.HasFlag == None)
		Destroy();
}
&lt;/uscript&gt;

Distance is of course the offset value, and goes up by 10 for each additional held flag.

==The visual effect in UT2003/04==

This one is much easier, because the flag object is actually attached to the player. In fact the behavior is implemented one level down, in the [[Legacy:GameObject|GameObject]] class. In Held.BeginState, it calls the [[Legacy:UnrealPawn|UnrealPawn]] holder's HoldGameObject function. That function anchors the flag to either the pawn itself or one of its bones, depending on whether there's anything in its GameObjBone field.

So in [http://uncommonplace.com/games/flagdom.html Flag Domination], my FDFlag class simply lets all that stuff happen, and then calls SetRelativeLocation to change its offset based on any other flags that might already be held.

&lt;uscript&gt;
game = FDGame(Level.Game);
if (game != none) {
	if (game.bMultiCarry) {
		for (i = 0; i &lt; 3; i++) {
			if (game.Bases[i] == none) continue;
			if (game.Bases[i].myFlag.Holder == Holder)
				holderCount++;
		}
		if (holderCount &gt; 1) {
			relLoc = RelativeLocation;
			if (relLoc == vect(0,0,0))
				relLoc = vect(0,-10,0);
			SetRelativeLocation(relLoc * holderCount);
		}
	}
}
&lt;/uscript&gt;

==Getting around HeldFlag==

This works the same in UT and UT2003/04, and there are two parts to it. One is to make sure that any time you're checking to see if a player is carrying a particular flag, you check the flag's Holder or HolderPRI, and ''not'' the player's HeldFlag field, since HeldFlag could point to another flag that the player is also carrying.

The second is to make sure flags get dropped properly. You just need to make sure that any time a flag's Drop method is called, you go through all the flags and make sure any other flags with the same holder also get dropped. And don't forget to avoid the potential infinite loops where flags are continuously telling each other to Drop.

Here's how I did it in Flag Domination 2003/04. Note that the additional flags also give themselves some additional random velocity so they don't all land in the same place.

&lt;uscript&gt;
if (Holder != none) {
	if (HolderPRI.HasFlag == self) {
		game = FDGame(Level.Game);
		if (game != none)
			if (game.bMultiCarry)
				for (i = 0; i &lt; 3; i++) {
					if (game.Bases[i] == none) break;
					if ((game.Bases[i].myFlag.Holder == Holder) &amp;&amp;
						(game.Bases[i].myFlag != self)) {
						game.Bases[i].myFlag.Drop(newVel);
					}
				}
	}
	else {
		if (VSize(newVel) &lt; Holder.GroundSpeed/2)
			newVel = Holder.GroundSpeed*vector(RotRand());
		newVel *= 1 + 2*FRand();
	}
}
&lt;/uscript&gt;

This was done differently in CTF4 for UT2004 (it's actually in the base 4-team code, and can be used by other 4-team mods). It uses a custom PlayerReplicationInfo class, with a HasFlags dynamic array.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2369</id>
      <timestamp>2004-05-28T17:59:39Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Carrying multiple flags adds a fun element to flag-related game types, but it's a bit tricky to pull off because certain things weren't quite designed to work that way. There are two parts to making it work: getting the visual effect of the player carrying all those flags, and working around the fact that [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] only has the one &lt;tt&gt;HasFlag&lt;/tt&gt; field.

The visual effect part works completely differently in UT and UT2003, because the regular effect of carrying a single flag is different.

==The visual effect in UT==

I'll discuss how this was done in [http://uncommonplace.com/games/ctf4.html CTF4].

The tricky thing about this effect in UT is that when you see a player carrying a flag, the flag you see ''isn't'' the real [[Legacy:CTFFlag (UT)|CTFFlag]] object; the real flag stays where it was and just goes invisible. The effect is apparently some hard-wired thing that the game automatically draws whenever the [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo]]'s HeldFlag field has something in it. So in order to immitate that, I created a HeldFlag class (subclassing [[Legacy:Effects (UT)|Effects (UT)]]) to be the fake carried flag.

In CTF4Flag's Held.BeginState function, it looks at the other flags in the game to see if the new holder is also holding one of them. If so, it creates a HeldFlag object. There are actually three HeldFlag classes, each with a different offset in its default properties. Later flags have a bigger offset than flags picked up earlier.

To get the HeldFlag to follow the player, at first I tried using [[Legacy:PhysicsType|PHYS_Trailer]], but the flag didn't maintain the correct relative location when the player turned. So I ended up having to use a simulated Tick function to constantly update the flag's position. The weird thing is it still doesn't exactly match the behavior of the game's built-in held flag effect, so I have no idea what method they used.

&lt;uscript&gt;
simulated function Tick(float DeltaTime)
{
	local vector X,Y,Z;
	
	GetAxes(Owner.Rotation,X,Y,Z);
	SetLocation(Owner.Location - (X * (28+Distance)) + (Z * 20));
	SetRotation(Owner.Rotation);
	if (Pawn(Owner).PlayerReplicationInfo.HasFlag == None)
		Destroy();
}
&lt;/uscript&gt;

Distance is of course the offset value, and goes up by 10 for each additional held flag.

==The visual effect in UT2003==

This one is much easier, because the flag object is actually attached to the player. In fact the behavior is implemented one level down, in the [[Legacy:GameObject|GameObject]] class. In Held.BeginState, it calls the [[Legacy:UnrealPawn|UnrealPawn]] holder's HoldGameObject function. That function anchors the flag to either the pawn itself or one of its bones, depending on whether there's anything in its GameObjBone field.

So in [http://uncommonplace.com/games/flagdom.html Flag Domination], my FDFlag class simply lets all that stuff happen, and then calls SetRelativeLocation to change its offset based on any other flags that might already be held.

&lt;uscript&gt;
game = FDGame(Level.Game);
if (game != none) {
	if (game.bMultiCarry) {
		for (i = 0; i &lt; 3; i++) {
			if (game.Bases[i] == none) continue;
			if (game.Bases[i].myFlag.Holder == Holder)
				holderCount++;
		}
		if (holderCount &gt; 1) {
			relLoc = RelativeLocation;
			if (relLoc == vect(0,0,0))
				relLoc = vect(0,-10,0);
			SetRelativeLocation(relLoc * holderCount);
		}
	}
}
&lt;/uscript&gt;

==Getting around HeldFlag==

This works the same in UT and UT2003, and there are two parts to it. One is to make sure that any time you're checking to see if a player is carrying a particular flag, you check the flag's Holder or HolderPRI, and ''not'' the player's HeldFlag field, since HeldFlag could point to another flag that the player is also carrying.

The second is to make sure flags get dropped properly. You just need to make sure that any time a flag's Drop method is called, you go through all the flags and make sure any other flags with the same holder also get dropped. And don't forget to avoid the potential infinite loops where flags are continuously telling each other to Drop.

Here's how I did it in Flag Domination 2003. Note that the additional flags also give themselves some additional random velocity so they don't all land in the same place.

&lt;uscript&gt;
if (Holder != none) {
	if (HolderPRI.HasFlag == self) {
		game = FDGame(Level.Game);
		if (game != none)
			if (game.bMultiCarry)
				for (i = 0; i &lt; 3; i++) {
					if (game.Bases[i] == none) break;
					if ((game.Bases[i].myFlag.Holder == Holder) &amp;&amp;
						(game.Bases[i].myFlag != self)) {
						game.Bases[i].myFlag.Drop(newVel);
					}
				}
	}
	else {
		if (VSize(newVel) &lt; Holder.GroundSpeed/2)
			newVel = Holder.GroundSpeed*vector(RotRand());
		newVel *= 1 + 2*FRand();
	}
}
&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Catalyst</title>
    <id>895</id>
    <revision>
      <id>2471</id>
      <timestamp>2007-09-11T09:33:21Z</timestamp>
      <contributor>
        <ip>Jamesmorse.plus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I thought I'd get around to writing a bit about myself on this here Wiki, which I tend to look at frequently but almost never commit to, so, err, hi everybody! Just a note - there was an infiltration developer who used to call themselves Catalyst. I don't know if they're still around, but it's a fairly common online name so just to clarify... I never worked on infiltration, and I spend most of my time playing deathball (hey, it's fun).

==Past Unreal/UT Projects==

I started off coding about 4 or 5 years ago when I bought UT, opened UEd, followed a couple of tutorials and realised I lacked any of the sort of patience required to map properly, but programming sounded fun. So I went off and learned C++ over the summer, then took up UScript pretty much all of my spare time (I was 14/15). I've worked on several projects - including the doomed Matrix:UT mod with a guy named Turgon, who was the one who got me really interested in working with other people really. From there we went on to design a mod called Eden's Wrath which never reached fruition, and I've been working on/designing mods since then, although nothing that's been worth anything just yet (well.. except maybe for the work I did on Deathball, but that was mostly bugfixing). 

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Unreal Wiki.  I hope you enjoy your stay here :)

'''Tarquin:''' Greetings! :)

'''Birelli:''' Greetings from a fellow ex-TEZC Deathball player :)

'''Catalyst:''' old TEZC ruled ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2472</id>
      <timestamp>2007-03-17T21:15:38Z</timestamp>
      <contributor>
        <ip>Bpm195</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I thought I'd get around to writing a bit about myself on this here Wiki, which I tend to look at frequently but almost never commit to, so, err, hi everybody! Just a note - there was an infiltration developer who used to call themselves Catalyst. I don't know if they're still around, but it's a fairly common online name so just to clarify... I never worked on infiltration, and I spend most of my time playing deathball (hey, it's fun). Oh, and I tend to idle in #unrealscript on EnterTheGame as well.

==Past Unreal/UT Projects==

I started off coding about 4 or 5 years ago when I bought UT, opened UEd, followed a couple of tutorials and realised I lacked any of the sort of patience required to map properly, but programming sounded fun. So I went off and learned C++ over the summer, then took up UScript pretty much all of my spare time (I was 14/15). I've worked on several projects - including the doomed Matrix:UT mod with a guy named Turgon, who was the one who got me really interested in working with other people really. From there we went on to design a mod called Eden's Wrath which never reached fruition, and I've been working on/designing mods since then, although nothing that's been worth anything just yet (well.. except maybe for the work I did on Deathball, but that was mostly bugfixing). I've done a few small mutators and I've done up some prototype projects, one of which I'm working on turning into a proper full-fledged mod as soon as the current end-of-semester exams are over (Squadz, if you ever see it. I should have a design doc up soon).

==Other Things==

I'm a first year undergrad computer engineering student at the University of Southampton, England. I like football and I play ultimate frisbee. Also, my favourite colour is... ooh... say, yellow. And I've got a lovely bunch of coconuts ;).

==Just in case you cared==

In case you've wondered if I'm someone or not, I've taken several different names for different reasons over the past few years - Catalyst88 and Lessa are the ones I can currently remember. I prefer to be known just as Catalyst right now though (I think the name suits me for one).

==Aims==
# Have fun in life
# Finish a mod project
# Attempt to contribute more to this wiki :)
# Win the [http://www.fps-sports.net/nadbl/ North American Deathball League] with RusH

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Unreal Wiki.  I hope you enjoy your stay here :)

'''Tarquin:''' Greetings! :)

'''Birelli:''' Greetings from a fellow ex-TEZC Deathball player :)

'''Catalyst:''' old TEZC ruled ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2473</id>
      <timestamp>2007-09-11T09:33:01Z</timestamp>
      <contributor>
        <ip>Jamesmorse.plus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I thought I'd get around to writing a bit about myself on this here Wiki, which I tend to look at frequently but almost never commit to, so, err, hi everybody! Just a note - there was an infiltration developer who used to call themselves Catalyst. I don't know if they're still around, but it's a fairly common online name so just to clarify... I never worked on infiltration, and I spend most of my time playing deathball (hey, it's fun).

==Past Unreal/UT Projects==

I started off coding about 4 or 5 years ago when I bought UT, opened UEd, followed a couple of tutorials and realised I lacked any of the sort of patience required to map properly, but programming sounded fun. So I went off and learned C++ over the summer, then took up UScript pretty much all of my spare time (I was 14/15). I've worked on several projects - including the doomed Matrix:UT mod with a guy named Turgon, who was the one who got me really interested in working with other people really. From there we went on to design a mod called Eden's Wrath which never reached fruition, and I've been working on/designing mods since then, although nothing that's been worth anything just yet (well.. except maybe for the work I did on Deathball, but that was mostly bugfixing). I've done a few small mutators and I've done up some prototype projects, one of which I'm working on turning into a proper full-fledged mod as soon as the current end-of-semester exams are over (Squadz, if you ever see it. I should have a design doc up soon).

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Unreal Wiki.  I hope you enjoy your stay here :)

'''Tarquin:''' Greetings! :)

'''Birelli:''' Greetings from a fellow ex-TEZC Deathball player :)

'''Catalyst:''' old TEZC ruled ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Category Rant</title>
    <id>28354</id>
    <revision>
      <id>40021</id>
      <timestamp>2009-11-14T20:21:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirected page to [[Category:Legacy Rant]]</comment>
      <text xml:space="preserve">#REDIRECT [[Category:Legacy Rant]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Category To Do</title>
    <id>28949</id>
    <revision>
      <id>43181</id>
      <timestamp>2010-05-03T17:10:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirected page to [[Category:Legacy To Do]]</comment>
      <text xml:space="preserve">#REDIRECT [[:Category:Legacy To Do]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Category Tutorial</title>
    <id>28286</id>
    <revision>
      <id>39943</id>
      <timestamp>2009-11-14T18:21:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirected page to [[Category:Legacy Tutorial]]</comment>
      <text xml:space="preserve">#REDIRECT [[Category:Legacy Tutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CaveUT</title>
    <id>898</id>
    <revision>
      <id>2479</id>
      <timestamp>2005-05-26T04:26:16Z</timestamp>
      <contributor>
        <ip>Mth-fgw.ballarat.edu.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===What Is CaveUT?===

''Quoted from the [http://www.planetjeff.net/ut/CaveUT.html CaveUT homepage]''

{{innerbox| CaveUT 2004 is a set of modifications allowing the Unreal Tournament 2004 (UT2004) game engine to display in CAVE-like displays and panoramic digital theaters. It supports off-axis projection for correct perspective and multiple views from the observer's viewpoint.   

}}

I have only re-created the UT2003 version, and thought I would share what was invloved. 

====Overview====

Basically, you set up your machines in a lan-play configuration. The way this mod works is there is one server, and the other machines are simply  spectators, each driving a different point of view.

====More Detail====

The modification includes an open-source opengl32.dll wrapper file (currently only runs on windows) that distorts the projection across the corners of the cave, allowing the view to be consistant across the multiple screen. Each UT200* instance needs to be running in OpenGL driver mode. '''Note:''' This wrapper is generic, I did manage to use it for another OpenGL game.

There is a complete installation and configuration explanation on the CaveUT home site.

====Links====
* [http://www.planetjeff.net/ut/CaveUT.html Home page of CaveUT 2004]
* [http://www.planetjeff.net/ut/CaveUT2003.html Home page of CaveUT 2003]
* [http://www.planetjeff.net/ut/CUTVRGL.html OpenGL Off-Axis Projection Wrapper]</text>
    </revision>
    <revision>
      <id>2480</id>
      <timestamp>2005-05-26T04:23:57Z</timestamp>
      <contributor>
        <ip>Mth-fgw.ballarat.edu.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===What Is CaveUT?===

''Quoted from the [http://www.planetjeff.net/ut/CaveUT.html CaveUT homepage]''

{{innerbox| CaveUT 2004 is a set of modifications allowing the Unreal Tournament 2004 (UT2004) game engine to display in CAVE-like displays and panoramic digital theaters. It supports off-axis projection for correct perspective and multiple views from the observer's viewpoint.   

}}

I have only re-created the UT2003 version, and thought I would share what was invloved. 

====Overview====

Basically, you set up your machines in a lan-play configuration. The way this mod works is there is one server, and the other machines are simply  spectators, each driving a different point of view.

====More Detail====

The modification includes an open-source opengl32.dll wrapper file (currently only runs on windows) that distorts the projection across the corners of the cave, allowing the view to be consistant across the multiple screen. Each UT200* instance needs to be running in OpenGL driver mode. '''Note:''' This wrapper is generic, I did manage to use it for another OpenGL game.

There is a complete installation and configuration explanation on the CaveUT home site.

====Links====
* [http://www.planetjeff.net/ut/CaveUT.html Home page of CaveUT 2004]
* [http://www.planetjeff.net/ut/CaveUT2003.html Home page of CaveUT 2003]
* [http://www.planetjeff.net/ut/CUTVRGL.html OpenGL Off-Axis Projection Wrapper]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ceej</title>
    <id>838</id>
    <revision>
      <id>2345</id>
      <timestamp>2005-01-14T03:36:25Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">I'm working on a modest UT2003 mod with another programmer. Our goal is to see what interesting gameplay we can implement with little or no art asset work. The cross-platformness of the Unreal engine was a real draw. (If only the ucc make tool were also cross-platform!)

My own wiki/blog thing can be found at [http://www.ceejbot.com/blog/ ceejbot.com]. Mod work journal is [http://www.ceejbot.com:8669/blog/comments/UT2003+mod also on my wiki].

This wiki is a life-saver. Without it I suspect we'd have bailed on the Unreal engine and found something better documented. 

email: ceej at spies dot com

Because I am a masochist, and also because I can't afford Max, I have begun work on a set of Lightwave plugins to import and export psk skeletal meshes and psa skeletal animations. The importer is essentially working, and just needs user interface polish. The exporter is in the starting phases. Screenshots and other information are on [http://www.kelpheavyweaponry.com/wiki/show/Unreal+model+export+tools the project page]. I'll probably release the C++ source under a Creative Commons license when I'm done. I wrote some general tools for reading and writing psa and psk files that might come in handy.

At some point I'll need to port the plugins to the PC. (I use Lightwave on OS X, so that's where I'm doing the work.) There are a couple of endian issues that might be gotchas, but it should otherwise be easy.

----

'''Wormbo:''' Hi and welcome to the Wiki. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2346</id>
      <timestamp>2005-01-14T00:03:17Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chain Of Events At Level Startup</title>
    <id>843</id>
    <revision>
      <id>2355</id>
      <timestamp>2006-06-28T08:57:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>some clarifications</comment>
      <text xml:space="preserve">This page describes what happens right after a level was loaded. It lists the startup engine events and the UnrealScript functions subsequently called by those events and gives a short description how these events and functions could be used.

Actors that were created because they are listed in the ServerActors list of a server's [[Legacy:INI File|INI file]] also use the chain of events described on this page. Other actors spawned during this chain of events (e.g. [[Legacy:Mutator|Mutator]]s or [[Legacy:GameRules|GameRules]]) use the [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]] and are not included here (unless UnrealEngine1 is used) except for the last event in this list.

''This whole page is based on a snippet of native UT2004 code posted on the UT2003Mods mailing list. Most parts will be similar in older engine versions, but there might be important differences in the functions called by these events.''

==Chain Of Events==

These are the events directly called from native code. See the sections below for more details about functions called by these events.

Here &quot;all actors&quot; means all actors that were placed in the map by the mapper or were created as ServerActors. Actors that have been created with the Spawn() function or that have received a Destroy() call are excluded from this chain of events.
# the [[Legacy:GameInfo|GameInfo]]'s InitGame() event is called
# the [[Legacy:GameInfo|GameInfo]]'s SetGrammar() event is called ''(UT2004)''
# all [[Legacy:Actor|Actor]]s' PreBeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' BeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' zones are set
# all [[Legacy:Actor|Actor]]s' volumes are set
# all [[Legacy:Actor|Actor]]s' PostBeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' PostNetBeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' SetInitialState() events are called
# all [[Legacy:Actor|Actor]]s either with bShouldBaseAtStartup=True and Physics set to PHYS_None or PHYS_Rotating or with an AttachTag get their base set

After all this players can start joining. This is especially also true for single player/instant action mode and means that the [[Legacy:Chain Of Events When A Player Logs In|chain of events when a player logs in]] is only executed after these events.

===GameInfo.InitGame()===

This initializes the GameInfo. At this point all the mapper-placed actors already exist, they just didn't get any of their initialization functions called yet.
# The [[Legacy:GameProfile|GameProfile]] class specified in the &quot;SaveGame&quot; parameter is loaded and initialized. (if specified)
# The GameSpeed is set according to the &quot;GameSpeed&quot; parameter. (SetGameSpeed(), if specified)
# The base mutator is added via AddMutator().&lt;br /&gt;'''Note:''' Any actors spawned before this or during the base mutator's initialization (see [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]) must have &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; set or they will cause an [[Legacy:Accessed None|Accessed None]] when trying to call the base mutator's CheckRelevance() function and as a result of this destroy themselves.
# The BroadcastHandlerClass is spawned.
# The AccessControl class is spawned. Either the class specified in the &quot;AccessControl&quot; parameter will be used or the AccessControlClass. If neither of those are set, Engine.[[Legacy:AccessControl|AccessControl]] is used.
# All [[Legacy:GameRules|GameRules]] specified in the &quot;GameRules&quot; parameter will be spawned.
# All [[Legacy:Mutator|Mutator]]s specified in the &quot;Mutator&quot; parameter will be added via AddMutator().&lt;br /&gt;AddMutator() only adds a mutator if its GroupName is an empty string or is not the same as the GroupName of any other mutator (including the base mutator) already added. The mutator's &lt;tt&gt;bUserAdded&lt;/tt&gt; variable is set to False for the base mutator and to True for all mutators added via the &quot;Mutator&quot; parameter.

For subclasses of [[Legacy:DeathMatch|DeathMatch]] InitGame() looks for a [[Legacy:LevelGameRules|LevelGameRules]] actor before going though the things described above. The first [[Legacy:LevelGameRules|LevelGameRules]] actor found will receive an UpdateGame() call.

InitGame() also reads some other parameters specified in the level URL, but these mostly don't call any important functions.

===GameInfo.SetGrammar() ''(UT2004)''===

This loads the appropriate speech recognition grammar file.

''(no additional information about this so far)''

===Actor.PreBeginPlay()===

====...in UT2003====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the game's base [[Legacy:Mutator|mutator]]'s CheckRelevance() function is called.

CheckRelevance() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is considered game relevant and CheckRelevance() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base mutator's IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

Finally the result of the base mutator's IsRelevant() function is returned by CheckRelevance() and again, if that result is True the actor will continue to exist, otherwise it will destroy itself.

====...in UT====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the [[Legacy:GameInfo|GameInfo]]'s IsRelevant() function is called.

IsRelevant() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base [[Legacy:Mutator|mutator]]'s IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

If the base mutator's IsRelevant() function returns False the GameInfo's IsRelevant() function also returns False and the actor destroys itself. Otherwise if the bSuperRelevant property is set to 1 GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If the base mutator's IsRelevant() function returns True but the bSuperRelevant property is not set to 1 the GameInfo's IsRelevant() function checks whether the actor may appear in the current difficulty level, if it's a &quot;monster&quot; (a non-player [[Legacy:Pawn (UT)|Pawn (UT)]]) and if there's a random chance for the actor to not appear in the game (&lt;tt&gt;OddsOfAppearing&lt;/tt&gt;). The GameInfo.IsRelevant() function will also update the number of secret goals, item goals and kill goals before returning True and allowing the actor to exist.

===Actor.BeginPlay()===

This event is called after an Actor is considered &quot;relevant&quot; for this game, i.e. no [[Legacy:Mutator|Mutator]] wanted to get rid of it.

Most actors don't use this event, but if you're looking for an event that is called before the actor is initialized, but after the mutator checks are done, then this is the place for you.

===Actor Zones===

At this point the [[Legacy:Actor|Actor]].Region.Zone value becomes valid. This event also causes the ZoneChange() event to be called.

===Actor Volumes===

At this point the [[Legacy:Actor|Actor]].PhysicsVolume value becomes valid. This event also causes the PhysicsVolumeChange() event to be called.

===Actor.PostBeginPlay()===

Most actors use PostBeginPlay() to initialize their UnrealScript values. The actor's PhysicsVolume and Zone are valid but the actor is not yet in any state.

===Actor.PostNetBeginPlay()===

PostNetBeginPlay() is called directly after PostBeginPlay() on the server. On clients it will be called when the initial replication is completed.

===Actor.SetInitialState()===

At this point the actor is concidered &quot;initialized&quot; by the engine (bScriptInitialized is set to True in this event) and the actor's initial state is set. If the [[Legacy:InitialState|InitialState]] property is set, it will be used, otherwise the actor goes to its auto state. Since SetInitialState() is a [[Legacy:Simulated Function|simulated function]] by default this happens on server and clients.

This event uses GotoState to change the state, so during its executing the initial state's BeginState() event is called. The state's state code will however not yet start executing at this point. This will happen after all the events described on this page have finished doing their work.

===Actor Bases===

Actors with an AttachTag other than &lt;tt&gt;None&lt;/tt&gt; are attached to the first actor with a matching [[Legacy:Tag|Tag]] or name via &lt;code&gt;SetBase(theMatchingActor)&lt;/code&gt;. Actors with &lt;tt&gt;bCollideWorld = true&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup = true&lt;/tt&gt; which use either PHYS_None or PHYS_Rotating try to find a suiting base as well. The AttachTag is evaluated first and if set bShouldBaseAtStartup  is ignored, whether or not the AttachTag matches anything.

In both cases when a base is set the actor's BaseChange() event will be called. Note that this final step of startup initialization also includes actors that were &lt;code&gt;Spawn()&lt;/code&gt;ed during any of the previous initialization steps.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]
* [[Legacy:Chain Of Events When A Player Logs In|Chain Of Events When A Player Logs In]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]</text>
    </revision>
    <revision>
      <id>2356</id>
      <timestamp>2006-06-24T04:57:02Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Silly me.</comment>
      <text xml:space="preserve">This page describes what happens right after a level was loaded. It lists the startup engine events and the UnrealScript functions subsequently called by those events and gives a short description how these events and functions could be used.

Actors that were created because they are listed in the ServerActors list of a server's [[Legacy:INI File|INI file]] also use the chain of events described on this page. Other actors spawned during this chain of events (e.g. [[Legacy:Mutator|Mutator]]s or [[Legacy:GameRules|GameRules]]) use the [[Legacy:Chain Of Events When Spawning Actors|chain of events when spawning actors]].

''This whole page is based on a snippet of native UT2004 code posted on the UT2003Mods mailing list. Most parts will be similar in older engine versions, but there might be important differences in the functions called by these events.''

==Chain Of Events==

These are the events directly called from native code. See the sections below for more details about functions called by these events.

Here &quot;all actors&quot; means all actors that were placed in the map by the mapper or were created as ServerActors. Actors that have been created with the Spawn() function or that have received a Destroy() call are excluded from this chain of events.
# the [[Legacy:GameInfo|GameInfo]]'s InitGame() event is called
# the [[Legacy:GameInfo|GameInfo]]'s SetGrammar() event is called ''(UT2004)''
# all [[Legacy:Actor|Actor]]s' PreBeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' BeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' zones are set
# all [[Legacy:Actor|Actor]]s' volumes are set
# all [[Legacy:Actor|Actor]]s' PostBeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' PostNetBeginPlay() events are called
# all [[Legacy:Actor|Actor]]s' SetInitialState() events are called
# all [[Legacy:Actor|Actor]]s either with bShouldBaseAtStartup=True and Physics set to PHYS_None or PHYS_Rotating or with an AttachTag get their base set

After all this players can start joining. This is especially also true for single player/instant action mode.

===GameInfo.InitGame()===

This initializes the GameInfo. At this point all the mapper-placed actors already exist, they just didn't get any of their initialization functions called yet.
# The [[Legacy:GameProfile|GameProfile]] class specified in the &quot;SaveGame&quot; parameter is loaded and initialized. (if specified)
# The GameSpeed is set according to the &quot;GameSpeed&quot; parameter. (SetGameSpeed(), if specified)
# The base mutator is added via AddMutator().&lt;br /&gt;'''Note:''' Any actors spawned before this or during the base mutator's initialization (see [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]) must have &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; set or they will cause an [[Legacy:Accessed None|Accessed None]] when trying to call the base mutator's CheckRelevance() function and as a result of this destroy themselves.
# The BroadcastHandlerClass is spawned.
# The AccessControl class is spawned. Either the class specified in the &quot;AccessControl&quot; parameter will be used or the AccessControlClass. If neither of those are set, Engine.[[Legacy:AccessControl|AccessControl]] is used.
# All [[Legacy:GameRules|GameRules]] specified in the &quot;GameRules&quot; parameter will be spawned.
# All [[Legacy:Mutator|Mutator]]s specified in the &quot;Mutator&quot; parameter will be added via AddMutator().&lt;br /&gt;AddMutator() only adds a mutator if its GroupName is an empty string or is not the same as the GroupName of any other mutator (including the base mutator) already added. The mutator's &lt;tt&gt;bUserAdded&lt;/tt&gt; variable is set to False for the base mutator and to True for all mutators added via the &quot;Mutator&quot; parameter.

For subclasses of [[Legacy:DeathMatch|DeathMatch]] InitGame() looks for a [[Legacy:LevelGameRules|LevelGameRules]] actor before going though the things described above. The first [[Legacy:LevelGameRules|LevelGameRules]] actor found will receive an UpdateGame() call.

InitGame() also reads some other parameters specified in the level URL, but these mostly don't call any important functions.

===GameInfo.SetGrammar() ''(UT2004)''===

This loads the appropriate speech recognition grammar file.

''(no additional information about this so far)''

===Actor.PreBeginPlay()===

====...in UT2003====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the game's base [[Legacy:Mutator|mutator]]'s CheckRelevance() function is called.

CheckRelevance() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is considered game relevant and CheckRelevance() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base mutator's IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

Finally the result of the base mutator's IsRelevant() function is returned by CheckRelevance() and again, if that result is True the actor will continue to exist, otherwise it will destroy itself.

====...in UT====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the [[Legacy:GameInfo|GameInfo]]'s IsRelevant() function is called.

IsRelevant() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base [[Legacy:Mutator|mutator]]'s IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

If the base mutator's IsRelevant() function returns False the GameInfo's IsRelevant() function also returns False and the actor destroys itself. Otherwise if the bSuperRelevant property is set to 1 GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If the base mutator's IsRelevant() function returns True but the bSuperRelevant property is not set to 1 the GameInfo's IsRelevant() function checks whether the actor may appear in the current difficulty level, if it's a &quot;monster&quot; (a non-player [[Legacy:Pawn (UT)|Pawn (UT)]]) and if there's a random chance for the actor to not appear in the game (&lt;tt&gt;OddsOfAppearing&lt;/tt&gt;). The GameInfo.IsRelevant() function will also update the number of secret goals, item goals and kill goals before returning True and allowing the actor to exist.

===Actor.BeginPlay()===

This event is called after an Actor is considered &quot;relevant&quot; for this game, i.e. no [[Legacy:Mutator|Mutator]] wanted to get rid of it.

Most actors don't use this event, but if you're looking for an event that is called before the actor is initialized, but after the mutator checks are done, then this is the place for you.

===Actor Zones===

At this point the [[Legacy:Actor|Actor]].Region.Zone value becomes valid. This event also causes the ZoneChange() event to be called.

===Actor Volumes===

At this point the [[Legacy:Actor|Actor]].PhysicsVolume value becomes valid. This event also causes the PhysicsVolumeChange() event to be called.

===Actor.PostBeginPlay()===

Most actors use PostBeginPlay() to initialize their UnrealScript values. The actor's PhysicsVolume and Zone are valid but the actor is not yet in any state.

===Actor.PostNetBeginPlay()===

PostNetBeginPlay() is called directly after PostBeginPlay() on the server. On clients it will be called when the initial replication is completed.

===Actor.SetInitialState()===

At this point the actor is concidered &quot;initialized&quot; by the engine (bScriptInitialized is set to True in this event) and the actor's initial state is set. If the [[Legacy:InitialState|InitialState]] property is set, it will be used, otherwise the actor goes to its auto state. Since SetInitialState() is a [[Legacy:Simulated Function|simulated function]] by default this happens on server and clients.

This event uses GotoState to change the state, so during its executing the initial state's BeginState() event is called. The state's state code will however not yet start executing at this point. This will happen after all the events described on this page have finished doing their work.

===Actor Bases===

Actors with an AttachTag are attached to the first actor with a matching [[Legacy:Tag|Tag]] via SetBase(). Actors with &lt;tt&gt;bShouldBaseAtStartup = true&lt;/tt&gt; which use either PHYS_None or PHYS_Rotating look for a suiting base as well.

In both cases when a base is set the actor's BaseChange() event will be called.

==Discussion==

'''Daid303:''' I'm not sure what happens if an actor gets spawned in &quot;InitGame&quot;, will it get's there chain of events called 1st? or will it be treated like a 'map' actor, and follow this chain?

'''Wormbo:''' Any actor created with the Spawn() function immediately executes the [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]. In UT200x it will not be treated like map actors at all. I think in earlier versions of UT the *BeginPlay events were executed twice, but that has been fixed.

'''Foxpaw:''' Where does the player &quot;login&quot; for single-player come in? Would I be correct in assuming that it happens sometime after all of the above events have been called and returned? Also, do the actors &quot;exist&quot; in InitGame? That is, if there is an actor on the map, can I find it with AllActors in InitGame?

'''Wormbo:''' The chain of events at player login (we could make a page for this as well :)) happens after the game has started, no matter if it's single player or listen server. Map actors exist during initialization, they just didn't get their *BeginPlay events yet.

'''Tarquin:''' Level.Game.GetNumPlayers() returns 0 in PostBeginPlay. 

'''Wormbo:''' That's actually not surprising. Players and bots (even in single player mode) can only join the game after the startup sequence is done.

'''SuperApe:''' So, even though players have not logged in at InitGame, and there's no local player available to query yet, is there a way to find the local settings to determine, say the Character the local player will use?  I see, &quot;Log: Browse:...&quot; in the Log, that shows the string for the player info well before InitGame.  Where is this string stored until needed?  I guess I've not looked closely at this part of the log, because I'm suprised to see it loads a level called, &quot;Entry&quot;, just to get that string, before loading in the ''real'' level to play.  Interesting.  Any thoughts?

'''Wormbo:''' Try using the Actor.GetURLOption() function. The Entry level is loaded when UT2004 (not the dedicated server, but any mode other mode) is started and stays in memory until UT2004 is closed.

'''SuperApe:''' Thank you, Wormbo.  But, silly me.  I now see the Event GameInfo.InitGame() is defined with the Options string as an input.  I simply parsed it and got the Character string I needed.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chain Of Events When A Player Logs In</title>
    <id>911</id>
    <revision>
      <id>2504</id>
      <timestamp>2006-07-19T02:45:13Z</timestamp>
      <contributor>
        <ip>64-110-208-211.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">''rough layout''

==Serverside UnrealScript Events==
* [[Legacy:GameInfo|GameInfo]].PreLogin() &amp;ndash; propagated to [[Legacy:AccessControl|AccessControl]]; may reject player
* [[Legacy:Mutator|Mutator]].OverrideDownload() &amp;ndash; called on the base mutator for each package the player needs to download, propagates down the mutator [[Legacy:Linked List|linked list]] (only available in UT2003, not in the base engine)
* [[Legacy:GameInfo|GameInfo]].Login() &amp;ndash; propagated to [[Legacy:AccessControl|AccessControl]] and [[Legacy:Mutator|Mutator]]s; spawns the PlayerPawn/PlayerController or rejects player, sets player name, spectator, admin login, other stuff
* [[Legacy:GameInfo|GameInfo]].PostLogin() &amp;ndash; first point at which replicated functions of the new player are actually replicated

==Clientside Initialization Overview==

TODO: What stuff gets replicated? What happens while the loading screen is visible?

==Related Topics==
* [[Legacy:Chain Of Events At Level Startup|Chain Of Events At Level Startup]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2505</id>
      <timestamp>2006-07-18T06:54:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">''rough layout''

==Serverside UnrealScript Events==
* [[Legacy:GameInfo|GameInfo]].PreLogin() &amp;ndash; propagated to [[Legacy:AccessControl|AccessControl]]; may reject player
* [[Legacy:Mutator|Mutator]].OverrideDownload() &amp;ndash; called on the base mutator for each package the player needs to download, propagates down the mutator [[Legacy:Linked List|linked list]] (only available in UT2003, not in the base engine)
* [[Legacy:GameInfo|GameInfo]].Login() &amp;ndash; propagated to [[Legacy:AccessControl|AccessControl]] and [[Legacy:Mutator|Mutator]]s; spawns the PlayerPawn/PlayerController or rejects player, sets player name, spectator, admin login, other stuff
* [[Legacy:GameInfo|GameInfo]].PostLogin() &amp;ndash; first point at which replicated functions of the new player are actually replicated

==Clientside Initialization Overview==

TODO: What stuff gets replicated? What happens while the loading screen is visible?

==Related Topics==
* [[Legacy:Chain Of Events At Level Startup|Chain Of Events At Level Startup]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2506</id>
      <timestamp>2006-07-19T02:28:45Z</timestamp>
      <contributor>
        <ip>58x158x23x39.ap58.ftth.ucom.ne.jp</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[http://groupforums.com/botracel free tracfone ringtone] - tracfone ringtone tracfone ringtones free tracfone ringtone [http://groupforums.com/botracel tracfone ringtones], [http://groupforums.com/domchili free true ringtone] - true ringtone true ringtones free true ringtone [http://groupforums.com/domchili true ringtones], [http://groupforums.com/varoral verizon ringtones] - verizon ringtone verizon ringtones free verizon ringtone [http://groupforums.com/varoral verizon ringtones], [http://groupforums.com/nococt wwe ringtones] - wwe ringtone wwe ringtones free wwe ringtone [http://groupforums.com/nococt wwe ringtones], [http://groupforums.com/coviget generic valium] - buy valium valium prescription generic valium [http://groupforums.com/coviget buy valium], [http://groupforums.com/acelzelolo viagra prescription] - viagra buy viagra viagra prescription [http://groupforums.com/acelzelolo generic viagra], [http://groupforums.com/dargetzel vicodin prescription] - vicodin buy vicodin vicodin prescription [http://groupforums.com/dargetzel buy vicodin], [http://groupforums.com/catrocor cheap xanax] - xanax buy xanax xanax prescription [http://groupforums.com/catrocor buy xanax], [http://groupforums.com/latrocchi order xenical] - xenical prescription generic xenical order xenical [http://groupforums.com/latrocchi order xenical], [http://groupforums.com/aldomrel zocor prescription] - zocor buy zocor zocor prescription [http://groupforums.com/aldomrel generic zocor], [http://ib.groupforums.com/index.php?mforum=botracel tracfone ringtones] - tracfone ringtone tracfone ringtones free tracfone ringtone [http://ib.groupforums.com/index.php?mforum=botracel tracfone ringtones], [http://ib.groupforums.com/index.php?mforum=domchili free true ringtones] - true ringtone true ringtones free true ringtone [http://ib.groupforums.com/index.php?mforum=domchili true ringtones], [http://ib.groupforums.com/index.php?mforum=varoral free verizon ringtones] - verizon ringtone verizon ringtones free verizon ringtone [http://ib.groupforums.com/index.php?mforum=varoral verizon ringtones], [http://ib.groupforums.com/index.php?mforum=nococt wwe ringtones] - wwe ringtone wwe ringtones free wwe ringtone [http://ib.groupforums.com/index.php?mforum=nococt wwe ringtones], [http://ib.groupforums.com/index.php?mforum=coviget valium online] - buy valium valium prescription generic valium [http://ib.groupforums.com/index.php?mforum=coviget valium prescription], [http://ib.groupforums.com/index.php?mforum=acelzelolo cheap viagra] - buy viagra viagra prescription generic viagra [http://ib.groupforums.com/index.php?mforum=acelzelolo viagra prescription], [http://ib.groupforums.com/index.php?mforum=dargetzel order vicodin] - vicodin prescription generic vicodin order vicodin [http://ib.groupforums.com/index.php?mforum=dargetzel buy vicodin], [http://ib.groupforums.com/index.php?mforum=catrocor xanax prescription] - xanax buy xanax xanax prescription [http://ib.groupforums.com/index.php?mforum=catrocor buy xanax], [http://ib.groupforums.com/index.php?mforum=latrocchi generic xenical] - buy xenical xenical prescription generic xenical [http://ib.groupforums.com/index.php?mforum=latrocchi buy xenical], [http://ib.groupforums.com/index.php?mforum=aldomrel cheap zocor] - zocor buy zocor zocor prescription [http://ib.groupforums.com/index.php?mforum=aldomrel order zocor], [http://www.pickaforum.com/p/getreltroc ericsson ringtones] - ericsson ringtone ericsson ringtones free ericsson ringtone [http://www.pickaforum.com/p/getreltroc ericsson ringtones], [http://www.pickaforum.com/p/ortroccaa free free ringtone] - free ringtone free ringtones free free ringtone [http://www.pickaforum.com/p/ortroccaa free ringtones], [http://www.pickaforum.com/p/reltrric funny ringtones] - funny ringtone funny ringtones free funny ringtone [http://www.pickaforum.com/p/reltrric funny ringtones], [http://www.pickaforum.com/p/eltchisit free jazz ringtone] - jazz ringtone jazz ringtones free jazz ringtone [http://www.pickaforum.com/p/eltchisit jazz ringtones], [http://www.pickaforum.com/p/letobasac darvocet online] - buy darvocet darvocet prescription generic darvocet [http://www.pickaforum.com/p/letobasac generic darvocet], [http://www.pickaforum.com/p/catrocob diazepam online] - diazepam prescription generic diazepam order diazepam [http://www.pickaforum.com/p/catrocob buy diazepam], [http://www.pickaforum.com/p/lizeldel generic ephedra] - buy ephedra ephedra prescription generic ephedra [http://www.pickaforum.com/p/lizeldel buy ephedra], [http://www.pickaforum.com/p/eltleto generic ephedrine] - buy ephedrine ephedrine prescription generic ephedrine [http://www.pickaforum.com/p/eltleto generic ephedrine], [http://www.pickaforum.com/p/covial order fastin] - fastin prescription generic fastin order fastin [http://www.pickaforum.com/p/covial generic fastin], [http://www.pickaforum.com/p/elboctroc generic hydrocodone] - buy hydrocodone hydrocodone prescription generic hydrocodone [http://www.pickaforum.com/p/elboctroc order hydrocodone], [http://www.bloghof.net/pub/blogHof/garwest1/adderall.html buy adderall] - buy adderall buy adderall  [http://www.bloghof.net/pub/blogHof/garwest1/adderall.html buy adderall], [http://www.bloghof.net/pub/blogHof/garwest2/ambien.html buy ambien] - buy ambien buy ambien  [http://www.bloghof.net/pub/blogHof/garwest2/ambien.html buy ambien], [http://www.bloghof.net/pub/blogHof/garwest3/cialis.html buy cialis] - buy cialis buy cialis  [http://www.bloghof.net/pub/blogHof/garwest3/cialis.html buy cialis], [http://www.bloghof.net/pub/blogHof/garwest4/cipro.html buy cipro] - buy cipro buy cipro  [http://www.bloghof.net/pub/blogHof/garwest4/cipro.html buy cipro], [http://www.bloghof.net/pub/blogHof/garwest5/clonazepam.html buy clonazepam] - buy clonazepam buy clonazepam  [http://www.bloghof.net/pub/blogHof/garwest5/clonazepam.html buy clonazepam], [http://www.bloghof.net/pub/blogHof/garwest6/codeine.html buy codeine] - buy codeine buy codeine  [http://www.bloghof.net/pub/blogHof/garwest6/codeine.html buy codeine], [http://www.bloghof.net/pub/blogHof/garwest7/darvocet.html buy darvocet] - buy darvocet buy darvocet  [http://www.bloghof.net/pub/blogHof/garwest7/darvocet.html buy darvocet], [http://www.bloghof.net/pub/blogHof/garwest8/diazepam.html buy diazepam] - buy diazepam buy diazepam  [http://www.bloghof.net/pub/blogHof/garwest8/diazepam.html buy diazepam], [http://www.bloghof.net/pub/blogHof/garwest9/ephedra.html buy ephedra] - buy ephedra buy ephedra  [http://www.bloghof.net/pub/blogHof/garwest9/ephedra.html buy ephedra], [http://www.bloghof.net/pub/blogHof/garwest9/ephedrine.html buy ephedrine] - buy ephedrine buy ephedrine  [http://www.bloghof.net/pub/blogHof/garwest9/ephedrine.html buy ephedrine], [http://www.bloghof.net/pub/blogHof/garwest10/hydrocodone.html buy hydrocodone] - buy hydrocodone buy hydrocodone  [http://www.bloghof.net/pub/blogHof/garwest10/hydrocodone.html buy hydrocodone], [http://www.bloghof.net/pub/blogHof/garwest11/klonopin.html buy klonopin] - buy klonopin buy klonopin  [http://www.bloghof.net/pub/blogHof/garwest11/klonopin.html buy klonopin], [http://www.bloghof.net/pub/blogHof/garwest12/lortab.html buy lortab] - buy lortab buy lortab  [http://www.bloghof.net/pub/blogHof/garwest12/lortab.html buy lortab], [http://www.bloghof.net/pub/blogHof/garwest13/meridia.html buy meridia] - buy meridia buy meridia  [http://www.bloghof.net/pub/blogHof/garwest13/meridia.html buy meridia], [http://www.bloghof.net/pub/blogHof/garwest14/morphine.html buy morphine] - buy morphine buy morphine  [http://www.bloghof.net/pub/blogHof/garwest14/morphine.html buy morphine], [http://www.bloghof.net/pub/blogHof/garwest15/norco.html buy norco] - buy norco buy norco  [http://www.bloghof.net/pub/blogHof/garwest15/norco.html buy norco], [http://www.bloghof.net/pub/blogHof/garwest16/pharmacy.html buy pharmacy] - buy pharmacy buy pharmacy  [http://www.bloghof.net/pub/blogHof/garwest16/pharmacy.html buy pharmacy], [http://www.bloghof.net/pub/blogHof/garwest17/phentermine.html buy phentermine] - buy phentermine buy phentermine  [http://www.bloghof.net/pub/blogHof/garwest17/phentermine.html buy phentermine], [http://www.bloghof.net/pub/blogHof/garwest18/ritalin.html buy ritalin] - buy ritalin buy ritalin  [http://www.bloghof.net/pub/blogHof/garwest18/ritalin.html buy ritalin], [http://www.bloghof.net/pub/blogHof/garwest19/soma.html buy soma] - buy soma buy soma  [http://www.bloghof.net/pub/blogHof/garwest19/soma.html buy soma], [http://www.bloghof.net/pub/blogHof/garwest20/tenuate.html buy tenuate] - buy tenuate buy tenuate  [http://www.bloghof.net/pub/blogHof/garwest20/tenuate.html buy tenuate], [http://www.bloghof.net/pub/blogHof/garwest21/valium.html buy valium] - buy valium buy valium  [http://www.bloghof.net/pub/blogHof/garwest21/valium.html buy valium], [http://www.bloghof.net/pub/blogHof/garwest22/viagra.html buy viagra] - buy viagra buy viagra  [http://www.bloghof.net/pub/blogHof/garwest22/viagra.html buy viagra], [http://www.bloghof.net/pub/blogHof/garwest23/vicodin.html buy vicodin] - buy vicodin buy vicodin  [http://www.bloghof.net/pub/blogHof/garwest23/vicodin.html buy vicodin], [http://www.bloghof.net/pub/blogHof/garwest24/xanax.html buy xanax] - buy xanax buy xanax  [http://www.bloghof.net/pub/blogHof/garwest24/xanax.html buy xanax], [http://www.bloghof.net/pub/blogHof/garwest25/xenical.html buy xenical] - buy xenical buy xenical  [http://www.bloghof.net/pub/blogHof/garwest25/xenical.html buy xenical], [http://www.bloghof.net/pub/blogHof/garwest26/zocor.html buy zocor] - buy zocor buy zocor  [http://www.bloghof.net/pub/blogHof/garwest26/zocor.html buy zocor], [http://www.bloghof.net/pub/blogHof/squijher1/alltel-ringtones.html alltel ringtones] - alltel ringtones alltel ringtones  [http://www.bloghof.net/pub/blogHof/squijher1/alltel-ringtones.html alltel ringtones], [http://www.bloghof.net/pub/blogHof/squijher2/cingular-ringtones.html cingular ringtones] - cingular ringtones cingular ringtones  [http://www.bloghof.net/pub/blogHof/squijher2/cingular-ringtones.html cingular ringtones], [http://www.bloghof.net/pub/blogHof/squijher3/cool-ringtones.html cool ringtones] - cool ringtones cool ringtones  [http://www.bloghof.net/pub/blogHof/squijher3/cool-ringtones.html cool ringtones], [http://www.bloghof.net/pub/blogHof/squijher4/free-ringtones.html free ringtones] - free ringtones free ringtones  [http://www.bloghof.net/pub/blogHof/squijher4/free-ringtones.html free ringtones], [http://www.bloghof.net/pub/blogHof/squijher5/funny-ringtones.html funny ringtones] - funny ringtones funny ringtones  [http://www.bloghof.net/pub/blogHof/squijher5/funny-ringtones.html funny ringtones], [http://www.bloghof.net/pub/blogHof/squijher6/midi-ringtones.html midi ringtones] - midi ringtones midi ringtones  [http://www.bloghof.net/pub/blogHof/squijher6/midi-ringtones.html midi ringtones], [http://www.bloghof.net/pub/blogHof/squijher7/mono-ringtones.html mono ringtones] - mono ringtones mono ringtones  [http://www.bloghof.net/pub/blogHof/squijher7/mono-ringtones.html mono ringtones], [http://www.bloghof.net/pub/blogHof/squijher8/motorola-ringtones.html motorola ringtones] - motorola ringtones motorola ringtones  [http://www.bloghof.net/pub/blogHof/squijher8/motorola-ringtones.html motorola ringtones], [http://www.bloghof.net/pub/blogHof/squijher9/mp3-ringtones.html mp3 ringtones] - mp3 ringtones mp3 ringtones  [http://www.bloghof.net/pub/blogHof/squijher9/mp3-ringtones.html mp3 ringtones], [http://www.bloghof.net/pub/blogHof/squijher10/music-ringtones.html music ringtones] - music ringtones music ringtones  [http://www.bloghof.net/pub/blogHof/squijher10/music-ringtones.html music ringtones], [http://www.bloghof.net/pub/blogHof/squijher11/nextel-ringtones.html nextel ringtones] - nextel ringtones nextel ringtones  [http://www.bloghof.net/pub/blogHof/squijher11/nextel-ringtones.html nextel ringtones], [http://www.bloghof.net/pub/blogHof/squijher12/nokia-ringtones.html nokia ringtones] - nokia ringtones nokia ringtones  [http://www.bloghof.net/pub/blogHof/squijher12/nokia-ringtones.html nokia ringtones], [http://www.bloghof.net/pub/blogHof/squijher13/polyphonic-ringtones.html polyphonic ringtones] - polyphonic ringtones polyphonic ringtones  [http://www.bloghof.net/pub/blogHof/squijher13/polyphonic-ringtones.html polyphonic ringtones], [http://www.bloghof.net/pub/blogHof/squijher14/punk-ringtones.html punk ringtones] - punk ringtones punk ringtones  [http://www.bloghof.net/pub/blogHof/squijher14/punk-ringtones.html punk ringtones], [http://www.bloghof.net/pub/blogHof/squijher15/qwest-ringtones.html qwest ringtones] - qwest ringtones qwest ringtones  [http://www.bloghof.net/pub/blogHof/squijher15/qwest-ringtones.html qwest ringtones], [http://www.bloghof.net/pub/blogHof/squijher16/real-ringtones.html real ringtones] - real ringtones real ringtones  [http://www.bloghof.net/pub/blogHof/squijher16/real-ringtones.html real ringtones], [http://www.bloghof.net/pub/blogHof/squijher17/sagem-ringtones.html sagem ringtones] - sagem ringtones sagem ringtones  [http://www.bloghof.net/pub/blogHof/squijher17/sagem-ringtones.html sagem ringtones], [http://www.bloghof.net/pub/blogHof/squijher18/samsung-ringtones.html samsung ringtones] - samsung ringtones samsung ringtones  [http://www.bloghof.net/pub/blogHof/squijher18/samsung-ringtones.html samsung ringtones], [http://www.bloghof.net/pub/blogHof/squijher19/sharp-ringtones.html sharp ringtones] - sharp ringtones sharp ringtones  [http://www.bloghof.net/pub/blogHof/squijher19/sharp-ringtones.html sharp ringtones], [http://www.bloghof.net/pub/blogHof/squijher20/sonyericsson-ringtones.html sonyericsson ringtones] - sonyericsson ringtones sonyericsson ringtones  [http://www.bloghof.net/pub/blogHof/squijher20/sonyericsson-ringtones.html sonyericsson ringtones], [http://www.bloghof.net/pub/blogHof/squijher21/sprint-ringtones.html sprint ringtones] - sprint ringtones sprint ringtones  [http://www.bloghof.net/pub/blogHof/squijher21/sprint-ringtones.html sprint ringtones], [http://www.bloghof.net/pub/blogHof/squijher22/tracfone-ringtones.html tracfone ringtones] - tracfone ringtones tracfone ringtones  [http://www.bloghof.net/pub/blogHof/squijher22/tracfone-ringtones.html tracfone ringtones], [http://www.bloghof.net/pub/blogHof/squijher23/verizon-ringtones.html verizon ringtones] - verizon ringtones verizon ringtones  [http://www.bloghof.net/pub/blogHof/squijher23/verizon-ringtones.html verizon ringtones], [http://www.bloghof.net/pub/blogHof/squijher24/wwe-ringtones.html wwe ringtones] - wwe ringtones wwe ringtones  [http://www.bloghof.net/pub/blogHof/squijher24/wwe-ringtones.html wwe ringtones], [http://nobasleto.2see.de cheap adderall] - adderall prescription generic adderall order adderall [http://nobasleto.2see.de buy adderall], [http://chidarer.2see.de cheap ambien] - ambien prescription generic ambien order ambien [http://chidarer.2see.de generic ambien], [http://erdomdron.2see.de cialis prescription] - cialis buy cialis cialis prescription [http://erdomdron.2see.de order cialis], [http://lirelvi.2see.de cipro online] - cipro buy cipro cipro prescription [http://lirelvi.2see.de buy cipro], [http://drondelbo.2see.de cheap clonazepam] - clonazepam buy clonazepam clonazepam prescription [http://drondelbo.2see.de buy clonazepam], [http://gettaric.2see.de generic codeine] - buy codeine codeine prescription generic codeine [http://gettaric.2see.de generic codeine], [http://accatroc.2see.de darvocet prescription] - darvocet buy darvocet darvocet prescription [http://accatroc.2see.de order darvocet], [http://liacli.2see.de generic diazepam] - buy diazepam diazepam prescription generic diazepam [http://liacli.2see.de order diazepam], [http://drongetor.2see.de ephedra online] - buy ephedra ephedra prescription generic ephedra [http://drongetor.2see.de order ephedra], [http://drgetor2q.2see.de ephedrine online] - ephedrine buy ephedrine ephedrine prescription [http://drgetor2q.2see.de ephedrine prescription], [http://cogetcna.2see.de cheap fastin] - fastin prescription generic fastin order fastin [http://cogetcna.2see.de order fastin], [http://olopassit.2see.de order hydrocodone] - hydrocodone prescription generic hydrocodone order hydrocodone [http://olopassit.2see.de order hydrocodone], [http://oracel-or.2see.de klonopin prescription] - klonopin buy klonopin klonopin prescription [http://oracel-or.2see.de generic klonopin], [http://lipasli.2see.de cheap lortab] - lortab buy lortab lortab prescription [http://lipasli.2see.de order lortab], [http://racdelmon.2see.de cheap meridia] - meridia buy meridia meridia prescription [http://racdelmon.2see.de generic meridia], [http://c4tcotroc.2see.de cheap morphine] - morphine buy morphine morphine prescription [http://c4tcotroc.2see.de order morphine], [http://sitletoleto.2see.de generic norco] - buy norco norco prescription generic norco [http://sitletoleto.2see.de buy norco], [http://licaro.2see.de cheap oxycontin] - oxycontin prescription generic oxycontin order oxycontin [http://licaro.2see.de generic oxycontin], [http://delcnavar.2see.de pharmacy online] - pharmacy buy pharmacy pharmacy prescription [http://delcnavar.2see.de buy pharmacy], [http://c4tcnala.2see.de phentermine prescription] - phentermine buy phentermine phentermine prescription [http://c4tcnala.2see.de phentermine prescription], [http://dronsitla.2see.de ritalin prescription] - ritalin buy ritalin ritalin prescription [http://dronsitla.2see.de order ritalin], [http://eltbocsit.2see.de generic soma] - buy soma soma prescription generic soma [http://eltbocsit.2see.de soma prescription], [http://allabas.2see.de tenuate prescription] - tenuate buy tenuate tenuate prescription [http://allabas.2see.de generic tenuate], [http://relroltroc.2see.de cheap valium] - valium prescription generic valium order valium [http://relroltroc.2see.de order valium], [http://reloutroc.2see.de cheap viagra] - buy viagra viagra prescription generic viagra [http://reloutroc.2see.de viagra prescription], [http://lioubas.2see.de generic vicodin] - buy vicodin vicodin prescription generic vicodin [http://lioubas.2see.de buy vicodin], [http://cdroner.2see.de order xanax] - xanax prescription generic xanax order xanax [http://cdroner.2see.de order xanax], [http://tagetla.2see.de xenical online] - xenical buy xenical xenical prescription [http://tagetla.2see.de xenical prescription], [http://vinoleto.2see.de order zocor] - zocor prescription generic zocor order zocor [http://vinoleto.2see.de zocor prescription], [http://copasdom.2see.de generic zoloft] - buy zoloft zoloft prescription generic zoloft [http://copasdom.2see.de zoloft prescription], [http://ringtones-top.awardspace.com/data/motorola-ringtones/ motorola ringtones] - motorola ringtones motorola ringtones  [http://ringtones-top.awardspace.com/data/motorola-ringtones/ motorola ringtones], [http://ringtones-top.awardspace.com/data/mp3-ringtones/ mp3 ringtones] - mp3 ringtones mp3 ringtones  [http://ringtones-top.awardspace.com/data/mp3-ringtones/ mp3 ringtones], [http://ringtones-top.awardspace.com/data/mtv-ringtones/ mtv ringtones] - mtv ringtones mtv ringtones  [http://ringtones-top.awardspace.com/data/mtv-ringtones/ mtv ringtones], [http://ringtones-top.awardspace.com/data/music-ringtones/ music ringtones] - music ringtones music ringtones  [http://ringtones-top.awardspace.com/data/music-ringtones/ music ringtones], [http://ringtones-top.awardspace.com/data/nextel-ringtones/ nextel ringtones] - nextel ringtones nextel ringtones  [http://ringtones-top.awardspace.com/data/nextel-ringtones/ nextel ringtones], [http://ringtones-top.awardspace.com/data/nokia-ringtones/ nokia ringtones] - nokia ringtones nokia ringtones  [http://ringtones-top.awardspace.com/data/nokia-ringtones/ nokia ringtones], [http://ringtones-top.awardspace.com/data/pantech-ringtones/ pantech ringtones] - pantech ringtones pantech ringtones  [http://ringtones-top.awardspace.com/data/pantech-ringtones/ pantech ringtones], [http://ringtones-top.awardspace.com/data/philips-ringtones/ philips ringtones] - philips ringtones philips ringtones  [http://ringtones-top.awardspace.com/data/philips-ringtones/ philips ringtones], [http://ringtones-top.awardspace.com/data/phone-ringtones/ phone ringtones] - phone ringtones phone ringtones  [http://ringtones-top.awardspace.com/data/phone-ringtones/ phone ringtones], [http://ringtones-top.awardspace.com/data/polyphonic-ringtones/ polyphonic ringtones] - polyphonic ringtones polyphonic ringtones  [http://ringtones-top.awardspace.com/data/polyphonic-ringtones/ polyphonic ringtones], [http://ringtones-top.awardspace.com/data/pop-ringtones/ pop ringtones] - pop ringtones pop ringtones  [http://ringtones-top.awardspace.com/data/pop-ringtones/ pop ringtones], [http://ringtones-top.awardspace.com/data/punk-ringtones/ punk ringtones] - punk ringtones punk ringtones  [http://ringtones-top.awardspace.com/data/punk-ringtones/ punk ringtones], [http://ringtones-top.awardspace.com/data/qwest-ringtones/ qwest ringtones] - qwest ringtones qwest ringtones  [http://ringtones-top.awardspace.com/data/qwest-ringtones/ qwest ringtones], [http://ringtones-top.awardspace.com/data/rap-ringtones/ rap ringtones] - rap ringtones rap ringtones  [http://ringtones-top.awardspace.com/data/rap-ringtones/ rap ringtones], [http://ringtones-top.awardspace.com/data/rave-ringtones/ rave ringtones] - rave ringtones rave ringtones  [http://ringtones-top.awardspace.com/data/rave-ringtones/ rave ringtones], [http://ringtones-top.awardspace.com/data/real-ringtones/ real ringtones] - real ringtones real ringtones  [http://ringtones-top.awardspace.com/data/real-ringtones/ real ringtones], [http://ringtones-top.awardspace.com/data/retro-ringtones/ retro ringtones] - retro ringtones retro ringtones  [http://ringtones-top.awardspace.com/data/retro-ringtones/ retro ringtones], [http://ringtones-top.awardspace.com/data/rock-ringtones/ rock ringtones] - rock ringtones rock ringtones  [http://ringtones-top.awardspace.com/data/rock-ringtones/ rock ringtones], [http://ringtones-top.awardspace.com/data/sagem-ringtones/ sagem ringtones] - sagem ringtones sagem ringtones  [http://ringtones-top.awardspace.com/data/sagem-ringtones/ sagem ringtones], [http://ringtones-top.awardspace.com/data/samsung-ringtones/ samsung ringtones] - samsung ringtones samsung ringtones  [http://ringtones-top.awardspace.com/data/samsung-ringtones/ samsung ringtones], [http://ringtones-top.awardspace.com/data/sexy-ringtones/ sexy ringtones] - sexy ringtones sexy ringtones  [http://ringtones-top.awardspace.com/data/sexy-ringtones/ sexy ringtones], [http://ringtones-top.awardspace.com/data/sharp-ringtones/ sharp ringtones] - sharp ringtones sharp ringtones  [http://ringtones-top.awardspace.com/data/sharp-ringtones/ sharp ringtones], [http://ringtones-top.awardspace.com/data/sony-ringtones/ sony ringtones] - sony ringtones sony ringtones  [http://ringtones-top.awardspace.com/data/sony-ringtones/ sony ringtones], [http://ringtones-top.awardspace.com/data/sonyericsson-ringtones/ sonyericsson ringtones] - sonyericsson ringtones sonyericsson ringtones  [http://ringtones-top.awardspace.com/data/sonyericsson-ringtones/ sonyericsson ringtones], [http://ringtones-top.awardspace.com/data/sprint-ringtones/ sprint ringtones] - sprint ringtones sprint ringtones  [http://ringtones-top.awardspace.com/data/sprint-ringtones/ sprint ringtones], [http://ringtones-top.awardspace.com/data/talking-ringtones/ talking ringtones] - talking ringtones talking ringtones  [http://ringtones-top.awardspace.com/data/talking-ringtones/ talking ringtones], [http://ringtones-top.awardspace.com/data/techno-ringtones/ techno ringtones] - techno ringtones techno ringtones  [http://ringtones-top.awardspace.com/data/techno-ringtones/ techno ringtones], [http://ringtones-top.awardspace.com/data/telus-ringtones/ telus ringtones] - telus ringtones telus ringtones  [http://ringtones-top.awardspace.com/data/telus-ringtones/ telus ringtones], [http://ringtones-top.awardspace.com/data/tmobile-ringtones/ tmobile ringtones] - tmobile ringtones tmobile ringtones  [http://ringtones-top.awardspace.com/data/tmobile-ringtones/ tmobile ringtones], [http://ringtones-top.awardspace.com/data/t-mobile-ringtones/ t-mobile ringtones] - t-mobile ringtones t-mobile ringtones  [http://ringtones-top.awardspace.com/data/t-mobile-ringtones/ t-mobile ringtones], [http://ringtones-top.awardspace.com/data/toques-ringtones/ toques ringtones] - toques ringtones toques ringtones  [http://ringtones-top.awardspace.com/data/toques-ringtones/ toques ringtones], [http://ringtones-top.awardspace.com/data/tracfone-ringtones/ tracfone ringtones] - tracfone ringtones tracfone ringtones  [http://ringtones-top.awardspace.com/data/tracfone-ringtones/ tracfone ringtones], [http://ringtones-top.awardspace.com/data/true-ringtones/ true ringtones] - true ringtones true ringtones  [http://ringtones-top.awardspace.com/data/true-ringtones/ true ringtones], [http://ringtones-top.awardspace.com/data/tv-ringtones/ tv ringtones] - tv ringtones tv ringtones  [http://ringtones-top.awardspace.com/data/tv-ringtones/ tv ringtones], [http://ringtones-top.awardspace.com/data/verizon-ringtones/ verizon ringtones] - verizon ringtones verizon ringtones  [http://ringtones-top.awardspace.com/data/verizon-ringtones/ verizon ringtones], [http://ringtones-top.awardspace.com/data/vocal-ringtones/ vocal ringtones] - vocal ringtones vocal ringtones  [http://ringtones-top.awardspace.com/data/vocal-ringtones/ vocal ringtones], [http://ringtones-top.awardspace.com/data/voice-ringtones/ voice ringtones] - voice ringtones voice ringtones  [http://ringtones-top.awardspace.com/data/voice-ringtones/ voice ringtones], [http://ringtones-top.awardspace.com/data/weird-ringtones/ weird ringtones] - weird ringtones weird ringtones  [http://ringtones-top.awardspace.com/data/weird-ringtones/ weird ringtones], [http://ringtones-top.awardspace.com/data/wwe-ringtones/ wwe ringtones] - wwe ringtones wwe ringtones  [http://ringtones-top.awardspace.com/data/wwe-ringtones/ wwe ringtones],  wwe ringtones</text>
    </revision>
    <revision>
      <id>44073</id>
      <timestamp>2010-10-16T00:46:07Z</timestamp>
      <contributor>
        <username>Rejecht</username>
        <id>1657</id>
      </contributor>
      <comment>/* Serverside UnrealScript Events: fleshed out */</comment>
      <text xml:space="preserve">''rough layout''

==Serverside UnrealScript Events==
# [[Legacy:GameInfo|GameInfo]].PreLogin() &amp;ndash; propagated to [[Legacy:AccessControl|AccessControl]]; may reject player.
## Note: Required packages are downloaded before the Login function is called next.  This can take some time&amp;mdash;the level could change; another player could have gotten the slot.
# [[Legacy:Mutator|Mutator]].OverrideDownload() &amp;ndash; called on the base mutator for each package the player needs to download, propagates down the mutator [[Legacy:Linked List|linked list]] (only available in UT2003, not in the base engine)
# [[Legacy:GameInfo|GameInfo]].Login() &amp;ndash; propagated to [[Legacy:AccessControl|AccessControl]] and [[Legacy:Mutator|Mutator]]s; spawns the PlayerPawn/PlayerController or rejects player, sets player name, spectator, admin login, other stuff:
## Color codes are stripped from URI options passed to the server.
## [[Legacy:Mutator|Mutator]].ModifyLogin is called starting from the BaseMutator.
## Checks if server is at player capacity, in which case non-admin players will get a MaxedOutMessage, but an admin is forced to become a spectator, if the server is not at spectator capacity (?) already.
## Team number is picked; passing in the preferred team [0, 1], or 255 if no team is specified, or if any team will do in a team game, or perhaps if teams are not relevant to the gametype.
## [[Legacy:GameInfo|GameInfo]].FindPlayerStart is called; attempts to find a start spot for the player&amp;mdash;could potentially abort.
## PlayerControllerClass is attempted loaded.
## Spawn player at start spot position and rotation&amp;mdash;could potentially abort if picked start spot could not fit the player (height too low, for instance).  UnrealEd 3 does not necessarily catch scenarios like these during a Reachspecs build.
## GameReplicationInfo reference assigned to player.
## SecurityClass attempted spawned for player.
## PlayerName
## Custom VoicePack
## Player is male or female.
## PlayerID is incremented and assigned to player.
## Admins are assigned administrative privileges.
## bLargeGameVOIP is set to true if the number of players is greater than 20.
## bWelcomePending is set to true.
## Determine whether level was requested to run in test mode.
## If bDelayedStart is true, the PlayerController enters the PlayerWaiting state.
# [[Legacy:GameInfo|GameInfo]].PostLogin() &amp;ndash; first point at which replicated functions of the new player are safe to call.
## [[Legacy:Pawn|Pawn]].ClientSetRotation is called on the Pawn.
## VotingHandler is attempted set.
## Bandwidth is capped for the player.
## [[Legacy:GameInfo|GameInfo]].NotifyLogin is called.
## PlayerID hash is logged.
# [[Legacy:GameInfo|GameInfo]].NotifyLogin() &amp;ndash; calls ServerRequestBanInfo on all PlayerController actors.

==Clientside Initialization Overview==

TODO: What stuff gets replicated? What happens while the loading screen is visible?

==Related Topics==
* [[Legacy:Chain Of Events At Level Startup|Chain Of Events At Level Startup]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain Of Events When Spawning Actors]]

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chain Of Events When Spawning Actors</title>
    <id>844</id>
    <revision>
      <id>2357</id>
      <timestamp>2004-05-23T09:37:18Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page describes what happens when an actor is created via the Spawn() method on a server or client or replicated to a client in a network game. It lists the engine events and the UnrealScript functions subsequently called by those events and gives a short description how these events and functions could be used.

''This page is based on a snipped of native UT2004 code posted on the UT2003Mods mailing list. Most parts will be similar in older engine versions, but there might be important differences in the functions called by these events.''

&lt;uscript&gt;
Spawn( 
  SpawnClass,      // class of actor to spawn
  SpawnOwner,      // what to set the new actor's Owner to
  SpawnTag,        // what to set its Tag to
  SpawnLocation,   // new actor's Location
  SpawnRotation    // new actor's Rotation 
);
&lt;/uscript&gt;

==Before The Actor Is Created==

Before an actual [[Legacy:Actor|Actor]] object is created the native ULevel::SpawnActor() function checks that a class was passed to it and that the class is not abstract and a subclass of actor. Also this class may neither have &lt;tt&gt;bStatic&lt;/tt&gt; nor &lt;tt&gt;bNoDelete&lt;/tt&gt; set to True. The class also won't be spawned when its &lt;tt&gt;bHighDetail&lt;/tt&gt; property is set to True and the [[Legacy:LevelInfo|LevelInfo]]'s &lt;tt&gt;DetailMode&lt;/tt&gt; is set to &lt;tt&gt;DM_Low&lt;/tt&gt; or the LevelInfo indicates a low framerate with &lt;tt&gt;bDropDetail&lt;/tt&gt; or the actor is spawned on a dedicated server.

The final check before creating the actor makes sure the actor fits in the location it should be spawned at. This check will be run for actor classes that collide with the world and for actors spawned on the server with &lt;tt&gt;bCollideWhenPlacing=True&lt;/tt&gt;.

==Chain Of Events==

These are the events directly called from native code after the actor has been created. See the sections below for more details about functions called by these events. For actors created with the Spawn() function on this machine (i.e. not actors created because they were received on a client) all these events are executed from the Spawn() function.
# the [[Legacy:Actor|Actor]]'s initial properties are set:
#* the actor's Tag is initialized with the actor's class name
#* the actor's Region property (especially its Zone) is initialized with the level's [[Legacy:LevelInfo|LevelInfo]] PointRegion
#* the actor's Level property is set to the level's [[Legacy:LevelInfo|LevelInfo]]
#* the actor's XLevel property is set to the Level object itself
#* if this actor was replicated to a client, the actor's Role and RemoteRole are exchanged
#* the actor's Brush property is set to None if it has one, &quot;because moving brushes are not duplicatable&quot;
#* the actor's Location and Rotation are set from the Spawn parameters
#* the actor is added to the collision hash if its &lt;tt&gt;bCollideActors&lt;/tt&gt; is set to True (used e.g. by the CollidingActors and VisibleCollidingActors [[Legacy:Iterator|iterator]] functions) If the actor is touching anything, its Touch() event is called
#* the actor's PhysicsVolume is set to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]]
# the [[Legacy:Actor|Actor]]'s Owner is set from the Spawn parameters
# the [[Legacy:Actor|Actor]]'s Instigator is set to the spawning actor's Instigator
# Karma physics are initialized for the actor
# (in UT the actor's Spawned() event is called, in later engine versions this event is no longer available in UnrealScript)
# the [[Legacy:Actor|Actor]]'s PreBeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s BeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s actual zone and PhysicsVolume are set
# encroachment (overlapping with other actors' collision cylinders) is checked for the actor
# the [[Legacy:Actor|Actor]]'s PostBeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s SetInitialState() event is called
# the actor's base is set if it's None and the actor has &lt;tt&gt;bCollideActors&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup&lt;/tt&gt; set to True and its Physics are set to either PHYS_None or PHYS_Rotating
# the [[Legacy:Actor|Actor]]'s PostNetBeginPlay() event is called if this isn't a replicated actor (i.e. it was created on this machine with the Spawn() function)
# (in UT now all [[Legacy:SpawnNotify|SpawnNotify]] actors receive a SpawnNotification() event if this actor's class is a subclass of the class specified in their ActorClass property, in later engine versions SpawnNotifies are no longer available)
# the [[Legacy:Actor|Actor]]'s actual Tag property is set

The chain of events is halted if the actor's &lt;tt&gt;bDeleteMe&lt;/tt&gt; property becomes True during the initialization, i.e. when any of the events or subsequently called functions destroys the actor.

===Initial Properties===

The actor properties Tag, Region, Level, XLevel, Brush, Location, Rotation and PhysicsVolume are set before any UnrealScript is executed. Note that Region.Zone is set to the [[Legacy:LevelInfo|LevelInfo]], PhysicsVolume is set to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] and Tag is set to the actor's class name.

===Actor Owner===

Before the spawned actor can execute any UnrealScript code its Owner is set. This will call the new owner's GainedChild() event which is the first piece of UnrealScript code executed after the actor was created. At this point the actor's Owner is still None and also its GetStateName() method returns 'None'.

After GainedChild() returns the spawned actor's Instigator is set to the spawning actor's Instigator. (Not the new Owner's Instigator!)

===Karma Physics Initialization ''(UT2003)''===

'' Does this call any UnrealScript events?''

===Actor.Spawned() ''(UT)''===

In UT there is the Spawned() event which is called only for actors created via the Spawn() function, not for actors placed by mappers. This is the first UnrealScript event called for the newly spawned actor and allows to execute code before the [[Legacy:GameInfo|GameInfo]] and the mutators can modify the actor.

===Actor.PreBeginPlay()===

At this point the Owner is properly set, but the actor's GetStateName() method will return the actor's class name.

====...in UT2003====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the game's base [[Legacy:Mutator|mutator]]'s CheckRelevance() function is called.

CheckRelevance() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and CheckRelevance() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base mutator's IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

Finally the result of the base mutator's IsRelevant() function is returned by CheckRelevance() and again, if that result is True the actor will continue to exist, otherwise it will destroy itself.

====...in UT====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the [[Legacy:GameInfo|GameInfo]]'s IsRelevant() function is called.

IsRelevant() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base [[Legacy:Mutator|mutator]]'s IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

If the base mutator's IsRelevant() function returns False the GameInfo's IsRelevant() function also returns False and the actor destroys itself. Otherwise if the bSuperRelevant property is set to 1 GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If the base mutator's IsRelevant() function returns True but the bSuperRelevant property is not set to 1 the GameInfo's IsRelevant() function checks whether the actor may appear in the current difficulty level, if it's a &quot;monster&quot; (a non-player [[Legacy:Pawn (UT)|Pawn (UT)]]) and if there's a random chance for the actor to not appear in the game (&lt;tt&gt;OddsOfAppearing&lt;/tt&gt;). The GameInfo.IsRelevant() function will also update the number of secret goals, item goals and kill goals before returning True and allowing the actor to exist.

===Actor.BeginPlay()===

This event is called after an Actor is concidered &quot;relevant&quot; for this game, i.e. no [[Legacy:Mutator|Mutator]] wanted to get rid of it.

Most actors don't use this event, but if you're looking for an event that is called before the actor is initialized, but after the mutator checks are done, then this is the place for you.

===Actor Zone and PhysicsVolume===

At this point the [[Legacy:Actor|Actor]].Region.Zone value becomes valid. This event also causes the ZoneChange() event to be called, which sees Region.Zone still as the [[Legacy:LevelInfo|LevelInfo]] and the actual zone is passed as the NewZone parameter.

After the zone the PhysicsVolume value becomes valid. This event also causes the PhysicsVolumeChange() event to be called, which sees PhysicsVolume still as the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] and the actual PhysicsVolume is passed as the NewVolume parameter.

===Encroachment Check===

Encroachment is when two actors in the collision hash overlap. In UnrealScript there is the EncroachingOn() event which returns whether the overlapping collision hulls with another actor actually needs to be handled and the EncroachedBy() event which is called for the other actor when EncroachingOn() returned True. The newly spawned actor will be destroyed if other colliding actors detect encroachment with this actor.

===Actor.PostBeginPlay()===

Most actors use PostBeginPlay() to initialize their UnrealScript values. The actor's PhysicsVolume and Zone are valid but the actor is not yet in any state.

===Actor.SetInitialState()===

At this point the actor is concidered &quot;initialized&quot; by the engine (bScriptInitialized is set to True in this event) and the actor's initial state is set. If the [[Legacy:InitialState|InitialState]] property is set, it will be used, otherwise the actor goes to its auto state. Since SetInitialState() is a [[Legacy:Simulated Function|simulated function]] by default this happens on server and clients.

This event uses GotoState to change the state, so during its executing the initial state's BeginState() event is called. The state's state code will however not yet start executing at this point. This will happen after all the events described on this page have finished doing their work.

===Actor Base===

Actors with without a Base, &lt;tt&gt;bCollideActors = true&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup = true&lt;/tt&gt; which use either PHYS_None or PHYS_Rotating try to find a base for themselves.

When a base is set the actor's BaseChange() event will be called.

===Actor.PostNetBeginPlay()===

PostNetBeginPlay() will only be called for actors created with the Spawn() function. For replicated actors this event will be called (if it's marked as &quot;simulated&quot;) by the netcode when the initial variables have been replicated. That means you don't know when it'll happen... but eventually :)

===SpawnNotify.SpawnNotification() ''(UT)''===

In UT there are special [[Legacy:SpawnNotify|SpawnNotify]] actors which receive a SpawnNotification() event if the new actor is a subclass of their configured ActorClass after the new actor has been initialized. The [[Legacy:SpawnNotify|SpawnNotify]] can modify the actor or even spawn a completely different actor which will be returned by the Spawn() function instead of this actor.

===Actor.Tag===

The actor's [[Legacy:Tag|Tag]] property is set to the value passed to the Spawn() function after all initialization events have been executed. The first place where you can access its final value is the code executed after the Spawn() function that created this actor.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Chain Of Events At Level Startup|Chain Of Events At Level Startup]]
* [[Legacy:Destroying Objects|Destroying Objects]] (and Actors)</text>
    </revision>
    <revision>
      <id>2358</id>
      <timestamp>2004-01-29T20:35:05Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>spelling :)</comment>
      <text xml:space="preserve">This page describes what happens when an actor is created via the Spawn() method on a server or client or replicated to a client in a network game. It lists the engine events and the UnrealScript functions subsequently called by those events and gives a short description how these events and functions could be used.

''This page is based on a snipped of native UT2004 code posted on the UT2003Mods mailing list. Most parts will be similar in older engine versions, but there might be important differences in the functions called by these events.''

==Before The Actor Is Created==

Before an actual [[Legacy:Actor|Actor]] object is created the native ULevel::SpawnActor() function checks that a class was passed to it and that the class is not abstract and a subclass of actor. Also this class may neither have &lt;tt&gt;bStatic&lt;/tt&gt; nor &lt;tt&gt;bNoDelete&lt;/tt&gt; set to True. The class also won't be spawned when its &lt;tt&gt;bHighDetail&lt;/tt&gt; property is set to True and the [[Legacy:LevelInfo|LevelInfo]]'s &lt;tt&gt;DetailMode&lt;/tt&gt; is set to &lt;tt&gt;DM_Low&lt;/tt&gt; or the LevelInfo indicates a low framerate with &lt;tt&gt;bDropDetail&lt;/tt&gt; or the actor is spawned on a dedicated server.

The final check before creating the actor makes sure the actor fits in the location it should be spawned at. This check will be run for actor classes that collide with the world and for actors spawned on the server with &lt;tt&gt;bCollideWhenPlacing=True&lt;/tt&gt;.

==Chain Of Events==

These are the events directly called from native code after the actor has been created. See the sections below for more details about functions called by these events. For actors created with the Spawn() function on this machine (i.e. not actors created because they were received on a client) all these events are executed from the Spawn() function.
# the [[Legacy:Actor|Actor]]'s initial properties are set:
#* the actor's Tag is initialized with the actor's class name
#* the actor's Region property (especially its Zone) is initialized with the level's [[Legacy:LevelInfo|LevelInfo]] PointRegion
#* the actor's Level property is set to the level's [[Legacy:LevelInfo|LevelInfo]]
#* the actor's XLevel property is set to the Level object itself
#* if this actor was replicated to a client, the actor's Role and RemoteRole are exchanged
#* the actor's Brush property is set to None if it has one, &quot;because moving brushes are not duplicatable&quot;
#* the actor's Location and Rotation are set
#* the actor is added to the collision hash if its &lt;tt&gt;bCollideActors&lt;/tt&gt; is set to True (used e.g. by the CollidingActors and VisibleCollidingActors [[Legacy:Iterator|iterator]] functions) If the actor is touching anything, its Touch() event is called
#* the actor's PhysicsVolume is set to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]]
# the [[Legacy:Actor|Actor]]'s Owner is set
# the [[Legacy:Actor|Actor]]'s Instigator is set to the spawning actor's Instigator
# Karma physics are initialized for the actor
# (in UT the actor's Spawned() event is called, in later engine versions this event is no longer available in UnrealScript)
# the [[Legacy:Actor|Actor]]'s PreBeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s BeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s actual zone and PhysicsVolume are set
# encroachment (overlapping with other actors' collision cylinders) is checked for the actor
# the [[Legacy:Actor|Actor]]'s PostBeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s SetInitialState() event is called
# the actor's base is set if it's None and the actor has &lt;tt&gt;bCollideActors&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup&lt;/tt&gt; set to True and its Physics are set to either PHYS_None or PHYS_Rotating
# the [[Legacy:Actor|Actor]]'s PostNetBeginPlay() event is called if this isn't a replicated actor (i.e. it was created on this machine with the Spawn() function)
# (in UT now all [[Legacy:SpawnNotify|SpawnNotify]] actors receive a SpawnNotification() event if this actor's class is a subclass of the class specified in their ActorClass property, in later engine versions SpawnNotifies are no longer available)
# the [[Legacy:Actor|Actor]]'s actual Tag property is set

The chain of events is halted if the actor's &lt;tt&gt;bDeleteMe&lt;/tt&gt; property becomes True during the initialization, i.e. when any of the events or subsequently called functions destroys the actor.

===Initial Properties===

The actor properties Tag, Region, Level, XLevel, Brush, Location, Rotation and PhysicsVolume are set before any UnrealScript is executed. Note that Region.Zone is set to the [[Legacy:LevelInfo|LevelInfo]], PhysicsVolume is set to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] and Tag is set to the actor's class name.

===Actor Owner===

Before the spawned actor can execute any UnrealScript code its Owner is set. This will call the new owner's GainedChild() event which is the first piece of UnrealScript code executed after the actor was created. At this point the actor's Owner is still None and also its GetStateName() method returns 'None'.

After GainedChild() returns the spawned actor's Instigator is set to the spawning actor's Instigator. (Not the new Owner's Instigator!)

===Karma Physics Initialization ''(UT2003)''===

'' Does this call any UnrealScript events?''

===Actor.Spawned() ''(UT)''===

In UT there is the Spawned() event which is called only for actors created via the Spawn() function, not for actors placed by mappers. This is the first UnrealScript event called for the newly spawned actor and allows to execute code before the [[Legacy:GameInfo|GameInfo]] and the mutators can modify the actor.

===Actor.PreBeginPlay()===

At this point the Owner is properly set, but the actor's GetStateName() method will return the actor's class name.

====...in UT2003====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the game's base [[Legacy:Mutator|mutator]]'s CheckRelevance() function is called.

CheckRelevance() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and CheckRelevance() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base mutator's IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

Finally the result of the base mutator's IsRelevant() function is returned by CheckRelevance() and again, if that result is True the actor will continue to exist, otherwise it will destroy itself.

====...in UT====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the [[Legacy:GameInfo|GameInfo]]'s IsRelevant() function is called.

IsRelevant() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base [[Legacy:Mutator|mutator]]'s IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

If the base mutator's IsRelevant() function returns False the GameInfo's IsRelevant() function also returns False and the actor destroys itself. Otherwise if the bSuperRelevant property is set to 1 GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If the base mutator's IsRelevant() function returns True but the bSuperRelevant property is not set to 1 the GameInfo's IsRelevant() function checks whether the actor may appear in the current difficulty level, if it's a &quot;monster&quot; (a non-player [[Legacy:Pawn (UT)|Pawn (UT)]]) and if there's a random chance for the actor to not appear in the game (&lt;tt&gt;OddsOfAppearing&lt;/tt&gt;). The GameInfo.IsRelevant() function will also update the number of secret goals, item goals and kill goals before returning True and allowing the actor to exist.

===Actor.BeginPlay()===

This event is called after an Actor is concidered &quot;relevant&quot; for this game, i.e. no [[Legacy:Mutator|Mutator]] wanted to get rid of it.

Most actors don't use this event, but if you're looking for an event that is called before the actor is initialized, but after the mutator checks are done, then this is the place for you.

===Actor Zone and PhysicsVolume===

At this point the [[Legacy:Actor|Actor]].Region.Zone value becomes valid. This event also causes the ZoneChange() event to be called, which sees Region.Zone still as the [[Legacy:LevelInfo|LevelInfo]] and the actual zone is passed as the NewZone parameter.

After the zone the PhysicsVolume value becomes valid. This event also causes the PhysicsVolumeChange() event to be called, which sees PhysicsVolume still as the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] and the actual PhysicsVolume is passed as the NewVolume parameter.

===Encroachment Check===

Encroachment is when two actors in the collision hash overlap. In UnrealScript there is the EncroachingOn() event which returns whether the overlapping collision hulls with another actor actually needs to be handled and the EncroachedBy() event which is called for the other actor when EncroachingOn() returned True. The newly spawned actor will be destroyed if other colliding actors detect encroachment with this actor.

===Actor.PostBeginPlay()===

Most actors use PostBeginPlay() to initialize their UnrealScript values. The actor's PhysicsVolume and Zone are valid but the actor is not yet in any state.

===Actor.SetInitialState()===

At this point the actor is concidered &quot;initialized&quot; by the engine (bScriptInitialized is set to True in this event) and the actor's initial state is set. If the [[Legacy:InitialState|InitialState]] property is set, it will be used, otherwise the actor goes to its auto state. Since SetInitialState() is a [[Legacy:Simulated Function|simulated function]] by default this happens on server and clients.

This event uses GotoState to change the state, so during its executing the initial state's BeginState() event is called. The state's state code will however not yet start executing at this point. This will happen after all the events described on this page have finished doing their work.

===Actor Base===

Actors with without a Base, &lt;tt&gt;bCollideActors = true&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup = true&lt;/tt&gt; which use either PHYS_None or PHYS_Rotating try to find a base for themselves.

When a base is set the actor's BaseChange() event will be called.

===Actor.PostNetBeginPlay()===

PostNetBeginPlay() will only be called for actors created with the Spawn() function. for replicated actors this event will be called by the netcode when the initial variables have been replicated.

===SpawnNotify.SpawnNotification() ''(UT)''===

In UT there are special [[Legacy:SpawnNotify|SpawnNotify]] actors which receive a SpawnNotification() event if the new actor is a subclass of their configured ActorClass after the new actor has been initialized. The [[Legacy:SpawnNotify|SpawnNotify]] can modify the actor or even spawn a completely different actor which will be returned by the Spawn() function instead of this actor.

===Actor.Tag===

The actor's [[Legacy:Tag|Tag]] property is set to the value passed to the Spawn() function after all initialization events have been executed. The first place where you can access its final value is the code executed after the Spawn() function that created this actor.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Chain Of Events At Level Startup|Chain Of Events At Level Startup]]
* [[Legacy:Destroying Objects|Destroying Objects]] (and Actors)</text>
    </revision>
    <revision>
      <id>2359</id>
      <timestamp>2004-03-14T13:47:05Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <text xml:space="preserve">This page describes what happens when an actor is created via the Spawn() method on a server or client or replicated to a client in a network game. It lists the engine events and the UnrealScript functions subsequently called by those events and gives a short description how these events and functions could be used.

''This page is based on a snipped of native UT2004 code posted on the UT2003Mods mailing list. Most parts will be similar in older engine versions, but there might be important differences in the functions called by these events.''

&lt;uscript&gt;
Spawn( 
  SpawnClass,      // class of actor to spawn
  SpawnOwner,      // what to set the new actor's Owner to
  SpawnTag,        // what to set its Tag to
  SpawnLocation,   // new actor's Location
  SpawnRotation    // new actor's Rotation 
);
&lt;/uscript&gt;

==Before The Actor Is Created==

Before an actual [[Legacy:Actor|Actor]] object is created the native ULevel::SpawnActor() function checks that a class was passed to it and that the class is not abstract and a subclass of actor. Also this class may neither have &lt;tt&gt;bStatic&lt;/tt&gt; nor &lt;tt&gt;bNoDelete&lt;/tt&gt; set to True. The class also won't be spawned when its &lt;tt&gt;bHighDetail&lt;/tt&gt; property is set to True and the [[Legacy:LevelInfo|LevelInfo]]'s &lt;tt&gt;DetailMode&lt;/tt&gt; is set to &lt;tt&gt;DM_Low&lt;/tt&gt; or the LevelInfo indicates a low framerate with &lt;tt&gt;bDropDetail&lt;/tt&gt; or the actor is spawned on a dedicated server.

The final check before creating the actor makes sure the actor fits in the location it should be spawned at. This check will be run for actor classes that collide with the world and for actors spawned on the server with &lt;tt&gt;bCollideWhenPlacing=True&lt;/tt&gt;.

==Chain Of Events==

These are the events directly called from native code after the actor has been created. See the sections below for more details about functions called by these events. For actors created with the Spawn() function on this machine (i.e. not actors created because they were received on a client) all these events are executed from the Spawn() function.
# the [[Legacy:Actor|Actor]]'s initial properties are set:
#* the actor's Tag is initialized with the actor's class name
#* the actor's Region property (especially its Zone) is initialized with the level's [[Legacy:LevelInfo|LevelInfo]] PointRegion
#* the actor's Level property is set to the level's [[Legacy:LevelInfo|LevelInfo]]
#* the actor's XLevel property is set to the Level object itself
#* if this actor was replicated to a client, the actor's Role and RemoteRole are exchanged
#* the actor's Brush property is set to None if it has one, &quot;because moving brushes are not duplicatable&quot;
#* the actor's Location and Rotation are set from the Spawn parameters
#* the actor is added to the collision hash if its &lt;tt&gt;bCollideActors&lt;/tt&gt; is set to True (used e.g. by the CollidingActors and VisibleCollidingActors [[Legacy:Iterator|iterator]] functions) If the actor is touching anything, its Touch() event is called
#* the actor's PhysicsVolume is set to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]]
# the [[Legacy:Actor|Actor]]'s Owner is set from the Spawn parameters
# the [[Legacy:Actor|Actor]]'s Instigator is set to the spawning actor's Instigator
# Karma physics are initialized for the actor
# (in UT the actor's Spawned() event is called, in later engine versions this event is no longer available in UnrealScript)
# the [[Legacy:Actor|Actor]]'s PreBeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s BeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s actual zone and PhysicsVolume are set
# encroachment (overlapping with other actors' collision cylinders) is checked for the actor
# the [[Legacy:Actor|Actor]]'s PostBeginPlay() event is called
# the [[Legacy:Actor|Actor]]'s SetInitialState() event is called
# the actor's base is set if it's None and the actor has &lt;tt&gt;bCollideActors&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup&lt;/tt&gt; set to True and its Physics are set to either PHYS_None or PHYS_Rotating
# the [[Legacy:Actor|Actor]]'s PostNetBeginPlay() event is called if this isn't a replicated actor (i.e. it was created on this machine with the Spawn() function)
# (in UT now all [[Legacy:SpawnNotify|SpawnNotify]] actors receive a SpawnNotification() event if this actor's class is a subclass of the class specified in their ActorClass property, in later engine versions SpawnNotifies are no longer available)
# the [[Legacy:Actor|Actor]]'s actual Tag property is set

The chain of events is halted if the actor's &lt;tt&gt;bDeleteMe&lt;/tt&gt; property becomes True during the initialization, i.e. when any of the events or subsequently called functions destroys the actor.

===Initial Properties===

The actor properties Tag, Region, Level, XLevel, Brush, Location, Rotation and PhysicsVolume are set before any UnrealScript is executed. Note that Region.Zone is set to the [[Legacy:LevelInfo|LevelInfo]], PhysicsVolume is set to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] and Tag is set to the actor's class name.

===Actor Owner===

Before the spawned actor can execute any UnrealScript code its Owner is set. This will call the new owner's GainedChild() event which is the first piece of UnrealScript code executed after the actor was created. At this point the actor's Owner is still None and also its GetStateName() method returns 'None'.

After GainedChild() returns the spawned actor's Instigator is set to the spawning actor's Instigator. (Not the new Owner's Instigator!)

===Karma Physics Initialization ''(UT2003)''===

'' Does this call any UnrealScript events?''

===Actor.Spawned() ''(UT)''===

In UT there is the Spawned() event which is called only for actors created via the Spawn() function, not for actors placed by mappers. This is the first UnrealScript event called for the newly spawned actor and allows to execute code before the [[Legacy:GameInfo|GameInfo]] and the mutators can modify the actor.

===Actor.PreBeginPlay()===

At this point the Owner is properly set, but the actor's GetStateName() method will return the actor's class name.

====...in UT2003====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the game's base [[Legacy:Mutator|mutator]]'s CheckRelevance() function is called.

CheckRelevance() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and CheckRelevance() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base mutator's IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

Finally the result of the base mutator's IsRelevant() function is returned by CheckRelevance() and again, if that result is True the actor will continue to exist, otherwise it will destroy itself.

====...in UT====

If the actor has &lt;tt&gt;bGameRelevant == False&lt;/tt&gt; and this event is not executed on a client, the [[Legacy:GameInfo|GameInfo]]'s IsRelevant() function is called.

IsRelevant() first calls the base mutator's AlwaysRelevant() function which recursively calls the other mutators' AlwaysRelevant() functions. If this function returns True the actor is concidered game relevant and GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If AlwaysRelevant() returns False, the base [[Legacy:Mutator|mutator]]'s IsRelevant() function is called. This function calls the mutator's CheckReplacement() function and returns its result if it's False. Otherwise IsRelevant() returns the result of the next mutator's IsRelevant() function.

If the base mutator's IsRelevant() function returns False the GameInfo's IsRelevant() function also returns False and the actor destroys itself. Otherwise if the bSuperRelevant property is set to 1 GameInfo.IsRelevant() returns True resulting in the Actor continuing to exist.

If the base mutator's IsRelevant() function returns True but the bSuperRelevant property is not set to 1 the GameInfo's IsRelevant() function checks whether the actor may appear in the current difficulty level, if it's a &quot;monster&quot; (a non-player [[Legacy:Pawn (UT)|Pawn (UT)]]) and if there's a random chance for the actor to not appear in the game (&lt;tt&gt;OddsOfAppearing&lt;/tt&gt;). The GameInfo.IsRelevant() function will also update the number of secret goals, item goals and kill goals before returning True and allowing the actor to exist.

===Actor.BeginPlay()===

This event is called after an Actor is concidered &quot;relevant&quot; for this game, i.e. no [[Legacy:Mutator|Mutator]] wanted to get rid of it.

Most actors don't use this event, but if you're looking for an event that is called before the actor is initialized, but after the mutator checks are done, then this is the place for you.

===Actor Zone and PhysicsVolume===

At this point the [[Legacy:Actor|Actor]].Region.Zone value becomes valid. This event also causes the ZoneChange() event to be called, which sees Region.Zone still as the [[Legacy:LevelInfo|LevelInfo]] and the actual zone is passed as the NewZone parameter.

After the zone the PhysicsVolume value becomes valid. This event also causes the PhysicsVolumeChange() event to be called, which sees PhysicsVolume still as the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] and the actual PhysicsVolume is passed as the NewVolume parameter.

===Encroachment Check===

Encroachment is when two actors in the collision hash overlap. In UnrealScript there is the EncroachingOn() event which returns whether the overlapping collision hulls with another actor actually needs to be handled and the EncroachedBy() event which is called for the other actor when EncroachingOn() returned True. The newly spawned actor will be destroyed if other colliding actors detect encroachment with this actor.

===Actor.PostBeginPlay()===

Most actors use PostBeginPlay() to initialize their UnrealScript values. The actor's PhysicsVolume and Zone are valid but the actor is not yet in any state.

===Actor.SetInitialState()===

At this point the actor is concidered &quot;initialized&quot; by the engine (bScriptInitialized is set to True in this event) and the actor's initial state is set. If the [[Legacy:InitialState|InitialState]] property is set, it will be used, otherwise the actor goes to its auto state. Since SetInitialState() is a [[Legacy:Simulated Function|simulated function]] by default this happens on server and clients.

This event uses GotoState to change the state, so during its executing the initial state's BeginState() event is called. The state's state code will however not yet start executing at this point. This will happen after all the events described on this page have finished doing their work.

===Actor Base===

Actors with without a Base, &lt;tt&gt;bCollideActors = true&lt;/tt&gt; and &lt;tt&gt;bShouldBaseAtStartup = true&lt;/tt&gt; which use either PHYS_None or PHYS_Rotating try to find a base for themselves.

When a base is set the actor's BaseChange() event will be called.

===Actor.PostNetBeginPlay()===

PostNetBeginPlay() will only be called for actors created with the Spawn() function. for replicated actors this event will be called by the netcode when the initial variables have been replicated.

===SpawnNotify.SpawnNotification() ''(UT)''===

In UT there are special [[Legacy:SpawnNotify|SpawnNotify]] actors which receive a SpawnNotification() event if the new actor is a subclass of their configured ActorClass after the new actor has been initialized. The [[Legacy:SpawnNotify|SpawnNotify]] can modify the actor or even spawn a completely different actor which will be returned by the Spawn() function instead of this actor.

===Actor.Tag===

The actor's [[Legacy:Tag|Tag]] property is set to the value passed to the Spawn() function after all initialization events have been executed. The first place where you can access its final value is the code executed after the Spawn() function that created this actor.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Chain Of Events At Level Startup|Chain Of Events At Level Startup]]
* [[Legacy:Destroying Objects|Destroying Objects]] (and Actors)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChainSaw</title>
    <id>28505</id>
    <revision>
      <id>40206</id>
      <timestamp>2009-11-17T10:59:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chainsaw</title>
    <id>908</id>
    <revision>
      <id>2499</id>
      <timestamp>2006-03-22T10:29:53Z</timestamp>
      <contributor>
        <ip>Proxy-21.swgfl.ifl.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Chainsaw''

Up close and personal killing with an ancient tree cutting tool. Primary fire will inflict massive damage, secondary f secondary fire swings it sideways, perfect for decapitations.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChainsawMelee</title>
    <id>680</id>
    <revision>
      <id>1987</id>
      <timestamp>2003-05-27T09:37:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; ChainsawMelee (Package: Botpack)}}

This mutator replaces the [[Legacy:ImpactHammer|impact hammer]] with the [[Legacy:ChainSaw|Chainsaw]].

It does this by setting &lt;tt&gt;[[Legacy:Mutator|Mutator]].DefaultWeapon&lt;/tt&gt; to &lt;tt&gt;Class'Botpack.ChainSaw'&lt;/tt&gt;.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1988</id>
      <timestamp>2002-04-05T18:46:02Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; ChainsawMelee}}

This mutator replaces the [[Legacy:ImpactHammer|Impact&amp;nbsp;hammer]] with the [[Legacy:ChainSaw|Chainsaw]].

It does this by setting &lt;tt&gt;[[Legacy:Mutator|Mutator]].DefaultWeapon&lt;/tt&gt; to &lt;tt&gt;Class'Botpack.ChainSaw'&lt;/tt&gt;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChallengeBotInfo</title>
    <id>28402</id>
    <revision>
      <id>40074</id>
      <timestamp>2009-11-15T08:25:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChallengeDMP</title>
    <id>740</id>
    <revision>
      <id>2124</id>
      <timestamp>2004-04-19T11:18:57Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; ChallengeDMP}}

'''ExTReMe:''' Please expand on this page with classes ETC... I'm just going quick through and filling in gaps.

It appears all this gametype does is turn rating and challenge mode on, turn timelimit off, and set all weapons to stay on players...</text>
    </revision>
    <revision>
      <id>2125</id>
      <timestamp>2004-04-17T13:08:07Z</timestamp>
      <contributor>
        <ip>Cpc3-ware2-3-0-cust219.lutn.cable.ntl.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; ChallengeDMP}}

'''ExTReMe:''' Please expand on this page with classes ETC... I'm just going quick through and filling in gaps.

It appears all this gametype does is turn rating and challenge mode on, turn timelimit off, and set all weapons to stay on players...
 mooonkeh</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChallengeHUD</title>
    <id>681</id>
    <revision>
      <id>1989</id>
      <timestamp>2002-04-19T23:23:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>added functions, but no descriptions</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD (UT)|HUD (UT)]] &gt;&gt; ChallengeHUD}}

The HUD class used in [[Legacy:DeathMatchPlus|DeathMatchPlus]] and its subclasses. (basically in all UT game types)

==Properties ==
; int SizeY :
; int Count :
; string CurrentMessage :
; float MOTDFadeOutTime :
; float IdentifyFadeTime :
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] IdentifyTarget :
; [[Legacy:Pawn (UT)|Pawn (UT)]] PawnOwner : The Pawn currently managing this HUD. (May be the viewtarget of the owner rather than the owner.)
; [[Legacy:FontInfo|FontInfo]] MyFonts : A FontInfo object used to load different font sizes for messages.
; HUDLocalizedMessage ShortMessageQueue[4] : Up to four messages displayed in the chat area.
; HUDLocalizedMessage LocalMessages[10] : Up to ten messages currently displayed on the screen.
; Texture FaceTexture : 
; float FaceTime :
; color FaceTeam :
; localized string VersionMessage :
; localized string PlayerCountString :
; localized string MapTitleString, MapTitleString2 :
; localized string AuthorString, AuthorString2 :
; localized string RankString :
; localized string SpreadString :
; int PlayerCount :
; bool bTiedScore :
; string ReceivedMessage :
; string ReceivedName :
; [[Legacy:ZoneInfo|ZoneInfo]] ReceivedZone :
; float ReceivedTime :
; Texture TutIconTex :
; int TutIconX, TutIconY :
; float TutIconBlink :
; globalconfig int CrosshairCount :
; globalconfig string CrossHairs[20] :
; Texture CrossHairTextures[20] :
; Texture GrayWeapons[11] :
; Texture FP1[3], FP2[3], FP3[3] :
; int LastReportedTime :
; bool bStartUpMessage :
; bool bForceScores :
; bool bTimeValid :
; bool bLowRes :
; bool bResChanged :
; int OldClipX :
; bool bAlwaysHideFrags :
; bool bHideCenterMessages :
; globalconfig bool bHideAllWeapons :
; globalconfig bool bHideStatus :
; globalconfig bool bHideAmmo :
; globalconfig bool bHideTeamInfo :
; globalconfig bool bHideFrags :
; globalconfig bool bHideHUD :
; globalconfig bool bHideNoviceMessages :
; globalconfig bool bHideFaces :
; globalconfig bool bUseTeamColor :
; globalconfig byte Opacity : should be between 1 and 16
; globalconfig float HUDScale :
; globalconfig bool StatusScale :
; globalconfig bool WeaponScale :
; globalconfig color FavoriteHUDColor :
; globalconfig bool CrosshairColor :
; float Scale :
; byte Style : Set to either ERenderStyle.STY_Normal or (if Opacity &lt; 16 and Level.bHighDetailMode == True ) ERenderStyle.STY_Translucent.
; color BaseColor :
; color UnitColor : R=1, G=1, B=1
; color WhiteColor, RedColor, GreenColor, CyanColor, BlueColor, GoldColor, PurpleColor, TurqColor, GrayColor : The colors white, red, green, etc.
; color HUDColor, SolidHUDColor :
; color FaceColor :
; localized string IdentifyName, IdentifyHealth, IdentifyCallsign :
; localized string LiveFeed :
; float ScoreTime :
; int rank :
; int lead :
; vector HitPos[4] :
; float HitTime[4] :
; float HitDamage[4] :
; float PickupTime : Time index of the last item pickup.
; float WeaponNameFade :
; float MessageFadeTime :
; int MessageFadeCount :
; bool bDrawMessageArea :
; bool bDrawFaceArea :
; float FaceAreaOffset, MinFaceAreaOffset :
; class&lt;[[Legacy:CriticalEventPlus|CriticalEventPlus]]&gt; TimeMessageClass :
; [[Legacy:ServerInfo|ServerInfo]] ServerInfo :
; bool bShowInfo :
; class&lt;[[Legacy:ServerInfo|ServerInfo]]&gt; ServerInfoClass :
; globalconfig string FontInfoClass :

==Functions ==

===Exec functions ===
; exec function SetHUDR (int n) :
; exec function SetHUDG (int n) :
; exec function SetHUDB (int n) :
; exec function ShowServerInfo ( ) :
; exec function GrowHUD ( ) :
; exec function ShrinkHUD ( ) :

===Simulated functions ===
; simulated function PostRender ([[Legacy:Canvas|Canvas]] Canvas) : Main rendering function.
; simulated function ChangeCrosshair (int d) :
; simulated function Texture LoadCrosshair (int c) :
; simulated function HUDSetup ([[Legacy:Canvas|Canvas]] Canvas) : 
; simulated function DrawDigit ([[Legacy:Canvas|Canvas]] Canvas, int d, int Step, float UpScale, out byte bMinus ) : 
; simulated function DrawBigNum ([[Legacy:Canvas|Canvas]] Canvas, int Value, int X, int Y, optional float ScaleFactor) :
; simulated function DrawStatus ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function DrawAmmo ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function DrawFragCount ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function DrawGameSynopsis ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function DrawWeapons ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function DisplayProgressMessage ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function TellTime (int num) : 
; simulated function Tick (float DeltaTime) :
; simulated function DrawMOTD ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function DrawCrossHair ([[Legacy:Canvas|Canvas]] Canvas, int X, int Y) :
; simulated function DrawTypingPrompt ([[Legacy:Canvas|Canvas]] Canvas, [[Legacy:Console|Console]] Console) :
; simulated function Message ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, coerce string Msg, name MsgType) :
; simulated function bool DisplayMessages ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function float DrawNextMessagePart ([[Legacy:Canvas|Canvas]] Canvas, string MString, float XOffset, int YPos) :
; simulated function bool TraceIdentify ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function bool SpecialIdentify ([[Legacy:Canvas|Canvas]] Canvas, [[Legacy:Actor|Actor]] Other) :
; simulated function SetIDColor ([[Legacy:Canvas|Canvas]] Canvas, int type) :
; simulated function DrawTwoColorID ([[Legacy:Canvas|Canvas]] Canvas, string TitleString, string ValueString, int YStart) :
; simulated function bool DrawIdentifyInfo ([[Legacy:Canvas|Canvas]] Canvas) :
; simulated function LocalizedMessage (class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject, optional String CriticalString ) :

===Other functions ===
; function SetDamage (vector HitLoc, float damage) :
; function DrawTalkFace ([[Legacy:Canvas|Canvas]] Canvas, int i, float YPos) :
; function bool DrawSpeechArea ([[Legacy:Canvas|Canvas]] Canvas, float XL, float YL) :
; function Timer ( ) : 
; function UpdateRankAndSpread ( ) :

==Known subclasses ==
* [[Legacy:ChallengeTeamHUD|ChallengeTeamHUD]]
* [[Legacy:CHEOLHUD|CHEOLHUD]]
* [[Legacy:CHNullHUD|CHNullHUD]]
* [[Legacy:CHSpectatorHUD|CHSpectatorHUD]]</text>
    </revision>
    <revision>
      <id>1990</id>
      <timestamp>2002-04-13T09:24:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD (UT)|HUD (UT)]] &gt;&gt; ChallengeHUD}}

The HUD class used in [[Legacy:DeathMatchPlus|DeathMatchPlus]] and its subclasses. (basically in all UT game types)

==Properties ==
; int SizeY :
; int Count :
; string CurrentMessage :
; float MOTDFadeOutTime :
; float IdentifyFadeTime :
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] IdentifyTarget :
; [[Legacy:Pawn (UT)|Pawn (UT)]] PawnOwner : The Pawn currently managing this HUD. (May be the viewtarget of the owner rather than the owner.)
; [[Legacy:FontInfo|FontInfo]] MyFonts : A FontInfo object used to load different font sizes for messages.
; HUDLocalizedMessage ShortMessageQueue[4] : Up to four messages displayed in the chat area.
; HUDLocalizedMessage LocalMessages[10] : Up to ten messages currently displayed on the screen.
; Texture FaceTexture : 
; float FaceTime :
; color FaceTeam :
; localized string VersionMessage :
; localized string PlayerCountString :
; localized string MapTitleString, MapTitleString2 :
; localized string AuthorString, AuthorString2 :
; localized string RankString :
; localized string SpreadString :
; int PlayerCount :
; bool bTiedScore :
; string ReceivedMessage :
; string ReceivedName :
; [[Legacy:ZoneInfo|ZoneInfo]] ReceivedZone :
; float ReceivedTime :
; Texture TutIconTex :
; int TutIconX, TutIconY :
; float TutIconBlink :
; globalconfig int CrosshairCount :
; globalconfig string CrossHairs[20] :
; Texture CrossHairTextures[20] :
; Texture GrayWeapons[11] :
; Texture FP1[3], FP2[3], FP3[3] :
; int LastReportedTime :
; bool bStartUpMessage :
; bool bForceScores :
; bool bTimeValid :
; bool bLowRes :
; bool bResChanged :
; int OldClipX :
; bool bAlwaysHideFrags :
; bool bHideCenterMessages :
; globalconfig bool bHideAllWeapons :
; globalconfig bool bHideStatus :
; globalconfig bool bHideAmmo :
; globalconfig bool bHideTeamInfo :
; globalconfig bool bHideFrags :
; globalconfig bool bHideHUD :
; globalconfig bool bHideNoviceMessages :
; globalconfig bool bHideFaces :
; globalconfig bool bUseTeamColor :
; globalconfig byte Opacity : should be between 1 and 16
; globalconfig float HUDScale :
; globalconfig bool StatusScale :
; globalconfig bool WeaponScale :
; globalconfig color FavoriteHUDColor :
; globalconfig bool CrosshairColor :
; float Scale :
; byte Style : Set to either ERenderStyle.STY_Normal or (if Opacity &lt; 16 and Level.bHighDetailMode == True ) ERenderStyle.STY_Translucent.
; color BaseColor :
; color UnitColor : R=1, G=1, B=1
; color WhiteColor, RedColor, GreenColor, CyanColor, BlueColor, GoldColor, PurpleColor, TurqColor, GrayColor : The colors white, red, green, etc.
; color HUDColor, SolidHUDColor :
; color FaceColor :
; localized string IdentifyName, IdentifyHealth, IdentifyCallsign :
; localized string LiveFeed :
; float ScoreTime :
; int rank :
; int lead :
; vector HitPos[4] :
; float HitTime[4] :
; float HitDamage[4] :
; float PickupTime : Time index of the last item pickup.
; float WeaponNameFade :
; float MessageFadeTime :
; int MessageFadeCount :
; bool bDrawMessageArea :
; bool bDrawFaceArea :
; float FaceAreaOffset, MinFaceAreaOffset :
; class&lt;[[Legacy:CriticalEventPlus|CriticalEventPlus]]&gt; TimeMessageClass :
; [[Legacy:ServerInfo|ServerInfo]] ServerInfo :
; bool bShowInfo :
; class&lt;ServerInfo&gt; ServerInfoClass :
; globalconfig string FontInfoClass :

==Functions ==

==Known subclasses ==
* [[Legacy:ChallengeTeamHUD|ChallengeTeamHUD]]
* [[Legacy:CHEOLHUD|CHEOLHUD]]
* [[Legacy:CHNullHUD|CHNullHUD]]
* [[Legacy:CHSpectatorHUD|CHSpectatorHUD]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChallengeIntro</title>
    <id>739</id>
    <revision>
      <id>2122</id>
      <timestamp>2003-10-24T22:57:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; ChallengeIntro (Package: Botpack)}}

ChallengeIntro is the gametype used for the CityIntro map (the intro that shows up when you start UT).  From what it appears this just tweaks a few things such as making all players spectators (possibilities with subclassing but i wouldnt even bother with it)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2123</id>
      <timestamp>2002-08-15T12:37:15Z</timestamp>
      <contributor>
        <ip>12-245-202-22.client.attbi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; ChallengeIntro}}

'''ExTReMe:''' I just got sick of these empty pages so I'm filling them up with stuff everyone could probably figure out on their own.  Maybe I'll come back to them later and add some useful content.

ChallengeIntro is the gametype used for the CityIntro map (the intro that shows up when you start UT).  From what it appears this just tweaks a few things such as making all players spectators (possibilities with subclassing but i wouldnt even bother with it)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChallengeTeamHUD</title>
    <id>28853</id>
    <revision>
      <id>42780</id>
      <timestamp>2010-03-30T16:19:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChangeViewTrigger</title>
    <id>871</id>
    <revision>
      <id>2420</id>
      <timestamp>2007-11-18T17:01:58Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; ChangeViewTrigger}}

Custom [[Legacy:Actor|Actor]] created by [[Legacy:Kamek|Kamek]] for use in [[Legacy:P2JailBreak|P2JailBreak]]. When Touch() is called, the triggering [[Legacy:PlayerController|PlayerController]]'s viewpoint will be changed to an outside view as defined in the actor's properties.

==Enums==

===EChangeViewType===
;VT_SingleActorView: Player's view changes to the actor designated by ViewTag. Only the first actor found with the matching ViewTag will be used.
;VT_MultipleActorView: Player's view cycles through all actors designated by ViewTag. Interval between camera switching is defined by CameraChangeTime.
;VT_CurrentLeaderView: Player's view changes to that of the highest-ranking non-jailed player on either team. 
;VT_TeammateView: Player's view changes to that of the highest-ranking non-jailed player on the same team.

==Properties==

===ChangeViewTrigger===
;EChangeViewType NewView: Determines how the player's viewpoint is affected when they use this actor.
;float CameraChangeTime: Amount of time in seconds each camera is viewd in VT_MultipleActorView mode.
;name ViewTag: Tag of actor to be viewd in VT_SingleActorView or VT_MultipleActorView.
;string BeginViewingMessage: Message displayed to player when they begin utilizing this actor.
;string EndViewingMessage: Message displayed to player when they stop using this actor.

==How To Use==

Players must be able to touch this actor in order to use it. This can be accomplished either by simply placing the actor where you want the player's view to change, or linking it up to a [[Legacy:Volume|Volume]] if you want multiple people to be able to use this actor. Linking it up to a [[Legacy:Volume|Volume]] via AssociatedActor is probably the best way to use the ChangeViewTrigger.

==Related Links==
* [[Legacy:CameraSpot|CameraSpot]]

[[Category:Legacy Custom Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2421</id>
      <timestamp>2004-11-28T11:46:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>formatting</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; ChangeViewTrigger}}

Custom [[Legacy:Actor|Actor]] created by [[Legacy:Kamek|Kamek]] for use in [[Legacy:P2JailBreak|P2JailBreak]]. When Touch() is called, the triggering [[Legacy:PlayerController|PlayerController]]'s viewpoint will be changed to an outside view as defined in the actor's properties.

==Enums==

===EChangeViewType===
;VT_SingleActorView: Player's view changes to the actor designated by ViewTag. Only the first actor found with the matching ViewTag will be used.
;VT_MultipleActorView: Player's view cycles through all actors designated by ViewTag. Interval between camera switching is defined by CameraChangeTime.
;VT_CurrentLeaderView: Player's view changes to that of the highest-ranking non-jailed player on either team. 
;VT_TeammateView: Player's view changes to that of the highest-ranking non-jailed player on the same team.

==Properties==

===ChangeViewTrigger===
;EChangeViewType NewView: Determines how the player's viewpoint is affected when they use this actor.
;float CameraChangeTime: Amount of time in seconds each camera is viewd in VT_MultipleActorView mode.
;name ViewTag: Tag of actor to be viewd in VT_SingleActorView or VT_MultipleActorView.
;string BeginViewingMessage: Message displayed to player when they begin utilizing this actor.
;string EndViewingMessage: Message displayed to player when they stop using this actor.

==How To Use==

Players must be able to touch this actor in order to use it. This can be accomplished either by simply placing the actor where you want the player's view to change, or linking it up to a [[Legacy:Volume|Volume]] if you want multiple people to be able to use this actor. Linking it up to a [[Legacy:Volume|Volume]] via AssociatedActor is probably the best way to use the ChangeViewTrigger.

==Related Links==
* [[Legacy:CameraSpot|CameraSpot]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Changing Bots Pawn Class</title>
    <id>874</id>
    <revision>
      <id>2426</id>
      <timestamp>2005-12-20T19:05:33Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Changing the Pawn Class for Your Bot==

If your mod just makes changes to the player pawn that don't require any difference in AI from what ships with UT2004, then you can simply override the SpawnBot function in your GameInfo subclass like so:

&lt;uscript&gt;
function Bot SpawnBot(optional string botName)
{
    local Bot B;

    B = Super.SpawnBot();

    if(B != None)
        B.PawnClass = class'YourModsPawnClass';

    return B;
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Spawning Your Own Bot|Spawning Your Own Bot]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Bot Support|Bot Support]]

==Discussion==

'''dataangel:''' This should eventually be integrated into a tutorial on a simple new gametype.</text>
    </revision>
    <revision>
      <id>2427</id>
      <timestamp>2004-06-26T19:10:30Z</timestamp>
      <contributor>
        <ip>Dataangel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Changing the Pawn Class for Your Bot==

If your mod just makes changes to the player pawn that don't require any difference in AI from what ships with UT2004, then you can simply override the SpawnBot function in your GameInfo subclass like so:

&lt;uscript&gt;
function Bot SpawnBot(optional string botName)
{
    local Bot B;

    B = Super.SpawnBot();

    if(B != None)
        B.PawnClass = class'YourModsPawnClass';

    return B;
}
&lt;/uscript&gt;

----

[[Legacy:Spawning_Your_Own_Bot|Spawning_Your_Own_Bot]]

==Discussion==

'''dataangel:''' This should eventually be integrated into a tutorial on a simple new gametype.</text>
    </revision>
    <revision>
      <id>2428</id>
      <timestamp>2004-12-25T11:05:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==Changing the Pawn Class for Your Bot==

If your mod just makes changes to the player pawn that don't require any difference in AI from what ships with UT2004, then you can simply override the SpawnBot function in your GameInfo subclass like so:

&lt;uscript&gt;
function Bot SpawnBot(optional string botName)
{
    local Bot B;

    B = Super.SpawnBot();

    if(B != None)
        B.PawnClass = class'YourModsPawnClass';

    return B;
}
&lt;/uscript&gt;

----

[[Legacy:Spawning_Your_Own_Bot|Spawning_Your_Own_Bot]]

==Discussion==

'''dataangel:''' This should eventually be integrated into a tutorial on a simple new gametype.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Changing The Enforcer (UT)</title>
    <id>882</id>
    <revision>
      <id>2444</id>
      <timestamp>2005-01-09T00:52:33Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Preface==

I once made a map a while back that had every player start with a bio rifle instead of the enforcer.  The guys on BuF were a great help in getting it to work, but alas, a few formats later, the map is lost &amp;ndash; and so, unfortunately, is the code to change the starting weapon.

Rather than asking on BuF again (the old posts with the info I wanted seem to have been deleted), I decided to work out a solution on my own - it's just more fun and more rewarding that way.  It took a while of poking around other mutators and various places on the wiki, but I finally made it work.  Every player starts with a bio rifle, and does not start with the enforcer.

Its been tested in multiplayer games briefly - seems to work just fine.

The only problem I can see with it is that it destroys ALL enforcers in the entire map, not just the ones being held by players.  This was acceptable in my map, but it might not be in yours, and feel free to alter this tut to make it better.  Also I don't have anything to prevent the mutator from being added twice, so don't put more than one instance in your map!

==Step 1:  Starting Out==

This is a simple [[Legacy:Writing And Using An Embedded Mutator|Embedded Mutator]], we're going to start out by making the code to embed it into our map.  Read the Embedded Mutator tutorial for more info on this block of code.

&lt;uscript&gt;//
// BioStart.
//
class BioStart expands Mutator;

var bool bPreBPInitialized;

function PreBeginPlay()
{

    if ( !bPreBPInitialized ) // older versions of UT call this function twice but we
                                         // only want to run our code once!
    {
        bPreBPInitialized = True;

        // Add the mutator by linking it into the Mutator List ala Beppo.
        // This Embedded Mutator makes sense to be 1st after the BaseMutator
        // in the Mutator List...

        Self.NextMutator = Level.Game.BaseMutator.NextMutator; // Make a place in the List

        Level.Game.BaseMutator.NextMutator = Self; // place it 1st after BaseMutator
    }
}&lt;/uscript&gt;

==Step 2:  Giving the Weapon to the Player==

I used a [[Legacy:Useful Mutator Functions|Useful Mutator Function]] here, namely GiveWeapon, to actually give the weapon to the player.

For giving the weapon (i.e. biorifle) to the player, we are going to use the ModifyPlayer function, which gets called whenever a player spawns, and is passed a handle to the spawning player.  So we're going to call our GiveWeapon function every time a player spawns.  Simple!

&lt;uscript&gt;function Weapon GiveWeapon(Pawn PlayerPawn, string aClassName, optional bool bBringUp)
{
    local class&lt;Weapon&gt; WeaponClass;
    local Weapon NewWeapon;

    WeaponClass = class&lt;Weapon&gt;(DynamicLoadObject(aClassName, class'Class'));

    if ( PlayerPawn.FindInventoryType(WeaponClass) != None )
        return None;
    newWeapon = Spawn(WeaponClass);
    if ( newWeapon != None ) {
        newWeapon.RespawnTime = 0.0;
        newWeapon.GiveTo(PlayerPawn);
        newWeapon.bHeldItem = true;
        newWeapon.GiveAmmo(PlayerPawn);
        newWeapon.SetSwitchPriority(PlayerPawn);
        newWeapon.WeaponSet(PlayerPawn);
        newWeapon.AmbientGlow = 0;
        if ( PlayerPawn.IsA('PlayerPawn') )
            newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness);
        else
            newWeapon.GotoState('Idle');
        if ( bBringUp ) {
            PlayerPawn.Weapon.GotoState('DownWeapon');
            PlayerPawn.PendingWeapon = None;
            PlayerPawn.Weapon = newWeapon;
            PlayerPawn.Weapon.BringUp();
        }
    }
    return newWeapon;
}

function ModifyPlayer (Pawn Other)
{
	GiveWeapon(Other, &quot;Botpack.UT_BioRifle&quot;, true);
}&lt;/uscript&gt;

==Step 3:  Those Damn Enforcers==

Great!  The mutator should be working already.  When you spawn you should start with the biorifle!  But then you notice that the Enforcer is still in your inventory... Damn.  Well lets get rid of those little buggers shall we?  (NOTE:  This code will remove ALL enforcers in the map.  If you wish to have enforcers on the ground in your map anyway, this will have to be modified to not remove them.)

For this we are going to use the CheckReplacement function - at some point during map startup every actor in the map is passed through this function, so if that actor is an enforcer, we simply refuse it to be allowed into the map.  All mutators must return true for this function for a particular object if that object is to be allowed in.  So we'll return false simply if the actor IsA() enforcer!

&lt;uscript&gt;function bool CheckReplacement (Actor Other, out byte bSuperRelevant)
{
	if (Other.IsA('enforcer'))
	{
		return false;
	}
	
	return true;
}&lt;/uscript&gt;

==Wrapping Up==

Well there you have it!  Add this mutator into your map, and there you go.  Changing the startup weapon wasn't so hard now was it?  It certainly would have been easier for me to have a tut like this around...  Please feel free to comment in the following section.

==Comments==

'''Draconx:''' Well its my second tut, and not particularly complicated, but its a good starting point for wannabe uscript coders (like me :))  I havent found any problems with it for what it does, aside from those mentioned in the preface.

'''Tarquin:''' Looks good :)</text>
    </revision>
    <revision>
      <id>2445</id>
      <timestamp>2004-08-25T02:39:23Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Preface===

I once made a map a while back that had every player start with a bio rifle instead of the enforcer.  The guys on BuF were a great help in getting it to work, but alas, a few formats later, the map is lost - and so, unfortunately, is the code to change the starting weapon.

Rather than asking on BuF again (the old posts with the info i wanted seem to have been deleted), I decided to work out a solution on my own - it's just more fun and more rewarding that way.  It took a while of poking around other mutators and various places on the wiki, but I finally made it work.  Every player starts with a bio rifle, and does not start with the enforcer.

Its been tested in multiplayer games briefly - seems to work just fine.

The only problem I can see with it is that it destroys ALL enforcers in the entire map, not just the ones being held by players.  This was acceptable in my map, but it might not be in yours, and feel free to alter this tut to make it better.  Also I don't have anything to prevent the mutator from being added twice, so don't put more than one instance in your map!

===Step 1:  Starting Out===

This is a simple [[Legacy:Writing And Using An Embedded Mutator|Embedded Mutator]], we're going to start out by making the code to embed it into our map.  Read the Embedded Mutator tutorial for more info on this block of code.

&lt;uscript&gt;//=============================================================================
// BioStart.
//=============================================================================
class BioStart expands Mutator;

var bool bPreBPInitialized;

function PreBeginPlay()
{

    if ( !bPreBPInitialized ) // older versions of UT call this function twice but we
                                         // only want to run our code once!
    {
        bPreBPInitialized = True;

        // Add the mutator by linking it into the Mutator List ala Beppo.
        // This Embedded Mutator makes sense to be 1st after the BaseMutator
        // in the Mutator List...

        Self.NextMutator = Level.Game.BaseMutator.NextMutator; // Make a place in the List

        Level.Game.BaseMutator.NextMutator = Self; // place it 1st after BaseMutator
    }
}&lt;/uscript&gt;

===Step 2:  Giving the Weapon to the Player===

I used a [[Legacy:Useful Mutator Functions|Useful Mutator Function]] here, namely GiveWeapon, to actually give the weapon to the player.

For giving the weapon (i.e. biorifle) to the player, we are going to use the ModifyPlayer function, which gets called whenever a player spawns, and is passed a handle to the spawning player.  So we're going to call our GiveWeapon function every time a player spawns.  Simple!

&lt;uscript&gt;function Weapon GiveWeapon(Pawn PlayerPawn, string aClassName, optional bool bBringUp)
{
    local class&lt;Weapon&gt; WeaponClass;
    local Weapon NewWeapon;

    WeaponClass = class&lt;Weapon&gt;(DynamicLoadObject(aClassName, class'Class'));

    if ( PlayerPawn.FindInventoryType(WeaponClass) != None )
        return None;
    newWeapon = Spawn(WeaponClass);
    if ( newWeapon != None ) {
        newWeapon.RespawnTime = 0.0;
        newWeapon.GiveTo(PlayerPawn);
        newWeapon.bHeldItem = true;
        newWeapon.GiveAmmo(PlayerPawn);
        newWeapon.SetSwitchPriority(PlayerPawn);
        newWeapon.WeaponSet(PlayerPawn);
        newWeapon.AmbientGlow = 0;
        if ( PlayerPawn.IsA('PlayerPawn') )
            newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness);
        else
            newWeapon.GotoState('Idle');
        if ( bBringUp ) {
            PlayerPawn.Weapon.GotoState('DownWeapon');
            PlayerPawn.PendingWeapon = None;
            PlayerPawn.Weapon = newWeapon;
            PlayerPawn.Weapon.BringUp();
        }
    }
    return newWeapon;
}

function ModifyPlayer (Pawn Other)
{
	GiveWeapon(Other, &quot;Botpack.UT_BioRifle&quot;, true);
}&lt;/uscript&gt;

===Step 3:  Those Damn Enforcers===

Great!  The mutator should be working already.  When you spawn you should start with the biorifle!  But then you notice that the Enforcer is still in your inventory... Damn.  Well lets get rid of those little buggers shall we?  (NOTE:  This code will remove ALL enforcers in the map.  If you wish to have enforcers on the ground in your map anyway, this will have to be modified to not remove them.)

For this we are going to use the CheckReplacement function - at some point during map startup every actor in the map is passed through this function, so if that actor is an enforcer, we simply refuse it to be allowed into the map.  All mutators must return true for this function for a particular object if that object is to be allowed in.  So we'll return false simply if the actor IsA() enforcer!

&lt;uscript&gt;function bool CheckReplacement (Actor Other, out byte bSuperRelevant)
{
	if (Other.IsA('enforcer'))
	{
		return false;
	}
	
	return true;
}&lt;/uscript&gt;

===Wrapping Up===

Well there you have it!  Add this mutator into your map, and there you go.  Changing the startup weapon wasn't so hard now was it?  It certainly would have been earier for me to have a tut like this around...  Please feel free to comment in the following section.

===Comments===

'''Draconx:''' Well its my second tut, and not particularly complicated, but its a good starting point for wannabe uscript coders (like me :))  I havent found any problems with it for what it does, aside from those mentioned in the preface.</text>
    </revision>
    <revision>
      <id>2446</id>
      <timestamp>2004-08-25T08:26:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Preface==

I once made a map a while back that had every player start with a bio rifle instead of the enforcer.  The guys on BuF were a great help in getting it to work, but alas, a few formats later, the map is lost &amp;ndash; and so, unfortunately, is the code to change the starting weapon.

Rather than asking on BuF again (the old posts with the info I wanted seem to have been deleted), I decided to work out a solution on my own - it's just more fun and more rewarding that way.  It took a while of poking around other mutators and various places on the wiki, but I finally made it work.  Every player starts with a bio rifle, and does not start with the enforcer.

Its been tested in multiplayer games briefly - seems to work just fine.

The only problem I can see with it is that it destroys ALL enforcers in the entire map, not just the ones being held by players.  This was acceptable in my map, but it might not be in yours, and feel free to alter this tut to make it better.  Also I don't have anything to prevent the mutator from being added twice, so don't put more than one instance in your map!

==Step 1:  Starting Out==

This is a simple [[Legacy:Writing And Using An Embedded Mutator|Embedded Mutator]], we're going to start out by making the code to embed it into our map.  Read the Embedded Mutator tutorial for more info on this block of code.

&lt;uscript&gt;//
// BioStart.
//
class BioStart expands Mutator;

var bool bPreBPInitialized;

function PreBeginPlay()
{

    if ( !bPreBPInitialized ) // older versions of UT call this function twice but we
                                         // only want to run our code once!
    {
        bPreBPInitialized = True;

        // Add the mutator by linking it into the Mutator List ala Beppo.
        // This Embedded Mutator makes sense to be 1st after the BaseMutator
        // in the Mutator List...

        Self.NextMutator = Level.Game.BaseMutator.NextMutator; // Make a place in the List

        Level.Game.BaseMutator.NextMutator = Self; // place it 1st after BaseMutator
    }
}&lt;/uscript&gt;

==Step 2:  Giving the Weapon to the Player==

I used a [[Legacy:Useful Mutator Functions|Useful Mutator Function]] here, namely GiveWeapon, to actually give the weapon to the player.

For giving the weapon (i.e. biorifle) to the player, we are going to use the ModifyPlayer function, which gets called whenever a player spawns, and is passed a handle to the spawning player.  So we're going to call our GiveWeapon function every time a player spawns.  Simple!

&lt;uscript&gt;function Weapon GiveWeapon(Pawn PlayerPawn, string aClassName, optional bool bBringUp)
{
    local class&lt;Weapon&gt; WeaponClass;
    local Weapon NewWeapon;

    WeaponClass = class&lt;Weapon&gt;(DynamicLoadObject(aClassName, class'Class'));

    if ( PlayerPawn.FindInventoryType(WeaponClass) != None )
        return None;
    newWeapon = Spawn(WeaponClass);
    if ( newWeapon != None ) {
        newWeapon.RespawnTime = 0.0;
        newWeapon.GiveTo(PlayerPawn);
        newWeapon.bHeldItem = true;
        newWeapon.GiveAmmo(PlayerPawn);
        newWeapon.SetSwitchPriority(PlayerPawn);
        newWeapon.WeaponSet(PlayerPawn);
        newWeapon.AmbientGlow = 0;
        if ( PlayerPawn.IsA('PlayerPawn') )
            newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness);
        else
            newWeapon.GotoState('Idle');
        if ( bBringUp ) {
            PlayerPawn.Weapon.GotoState('DownWeapon');
            PlayerPawn.PendingWeapon = None;
            PlayerPawn.Weapon = newWeapon;
            PlayerPawn.Weapon.BringUp();
        }
    }
    return newWeapon;
}

function ModifyPlayer (Pawn Other)
{
	GiveWeapon(Other, &quot;Botpack.UT_BioRifle&quot;, true);
}&lt;/uscript&gt;

==Step 3:  Those Damn Enforcers==

Great!  The mutator should be working already.  When you spawn you should start with the biorifle!  But then you notice that the Enforcer is still in your inventory... Damn.  Well lets get rid of those little buggers shall we?  (NOTE:  This code will remove ALL enforcers in the map.  If you wish to have enforcers on the ground in your map anyway, this will have to be modified to not remove them.)

For this we are going to use the CheckReplacement function - at some point during map startup every actor in the map is passed through this function, so if that actor is an enforcer, we simply refuse it to be allowed into the map.  All mutators must return true for this function for a particular object if that object is to be allowed in.  So we'll return false simply if the actor IsA() enforcer!

&lt;uscript&gt;function bool CheckReplacement (Actor Other, out byte bSuperRelevant)
{
	if (Other.IsA('enforcer'))
	{
		return false;
	}
	
	return true;
}&lt;/uscript&gt;

==Wrapping Up==

Well there you have it!  Add this mutator into your map, and there you go.  Changing the startup weapon wasn't so hard now was it?  It certainly would have been earier for me to have a tut like this around...  Please feel free to comment in the following section.

==Comments==

'''Draconx:''' Well its my second tut, and not particularly complicated, but its a good starting point for wannabe uscript coders (like me :))  I havent found any problems with it for what it does, aside from those mentioned in the preface.

'''Tarquin:''' Looks good :)</text>
    </revision>
    <revision>
      <id>42868</id>
      <timestamp>2010-04-07T12:44:54Z</timestamp>
      <contributor>
        <ip>81.236.19.16</ip>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">==Preface==

I once made a map a while back that had every player start with a bio rifle instead of the enforcer.  The guys on BuF were a great help in getting it to work, but alas, a few formats later, the map is lost &amp;ndash; and so, unfortunately, is the code to change the starting weapon.

Rather than asking on BuF again (the old posts with the info I wanted seem to have been deleted), I decided to work out a solution on my own - it's just more fun and more rewarding that way.  It took a while of poking around other mutators and various places on the wiki, but I finally made it work.  Every player starts with a bio rifle, and does not start with the enforcer.

Its been tested in multiplayer games briefly - seems to work just fine.

The only problem I can see with it is that it destroys ALL enforcers in the entire map, not just the ones being held by players.  This was acceptable in my map, but it might not be in yours, and feel free to alter this tut to make it better.  Also I don't have anything to prevent the mutator from being added twice, so don't put more than one instance in your map!

==Step 1:  Starting Out==

This is a simple [[Legacy:Writing And Using An Embedded Mutator|Embedded Mutator]], we're going to start out by making the code to embed it into our map.  Read the Embedded Mutator tutorial for more info on this block of code.

&lt;uscript&gt;//
// BioStart.
//
class BioStart expands Mutator;

var bool bPreBPInitialized;

function PreBeginPlay()
{

    if ( !bPreBPInitialized ) // older versions of UT call this function twice but we
                                         // only want to run our code once!
    {
        bPreBPInitialized = True;

        // Add the mutator by linking it into the Mutator List ala Beppo.
        // This Embedded Mutator makes sense to be 1st after the BaseMutator
        // in the Mutator List...

        Self.NextMutator = Level.Game.BaseMutator.NextMutator; // Make a place in the List

        Level.Game.BaseMutator.NextMutator = Self; // place it 1st after BaseMutator
    }
}&lt;/uscript&gt;

==Step 2:  Giving the Weapon to the Player==

I used a [[Legacy:Useful Mutator Functions|Useful Mutator Function]] here, namely GiveWeapon, to actually give the weapon to the player.

For giving the weapon (i.e. biorifle) to the player, we are going to use the ModifyPlayer function, which gets called whenever a player spawns, and is passed a handle to the spawning player.  So we're going to call our GiveWeapon function every time a player spawns.  Simple!

&lt;uscript&gt;function Weapon GiveWeapon(Pawn PlayerPawn, string aClassName, optional bool bBringUp)
{
    local class&lt;Weapon&gt; WeaponClass;
    local Weapon NewWeapon;

    WeaponClass = class&lt;Weapon&gt;(DynamicLoadObject(aClassName, class'Class'));

    if ( PlayerPawn.FindInventoryType(WeaponClass) != None )
        return None;
    newWeapon = Spawn(WeaponClass);
    if ( newWeapon != None ) {
        newWeapon.RespawnTime = 0.0;
        newWeapon.GiveTo(PlayerPawn);
        newWeapon.bHeldItem = true;
        newWeapon.GiveAmmo(PlayerPawn);
        newWeapon.SetSwitchPriority(PlayerPawn);
        newWeapon.WeaponSet(PlayerPawn);
        newWeapon.AmbientGlow = 0;
        if ( PlayerPawn.IsA('PlayerPawn') )
            newWeapon.SetHand(PlayerPawn(PlayerPawn).Handedness);
        else
            newWeapon.GotoState('Idle');
        if ( bBringUp ) {
            PlayerPawn.Weapon.GotoState('DownWeapon');
            PlayerPawn.PendingWeapon = None;
            PlayerPawn.Weapon = newWeapon;
            PlayerPawn.Weapon.BringUp();
        }
    }
    return newWeapon;
}

function ModifyPlayer (Pawn Other)
{
	GiveWeapon(Other, &quot;Botpack.UT_BioRifle&quot;, true);
}&lt;/uscript&gt;

==Step 3:  Those Damn Enforcers==

Great!  The mutator should be working already.  When you spawn you should start with the biorifle!  But then you notice that the Enforcer is still in your inventory... Damn.  Well lets get rid of those little buggers shall we?  (NOTE:  This code will remove ALL enforcers in the map.  If you wish to have enforcers on the ground in your map anyway, this will have to be modified to not remove them.)

For this we are going to use the CheckReplacement function - at some point during map startup every actor in the map is passed through this function, so if that actor is an enforcer, we simply refuse it to be allowed into the map.  All mutators must return true for this function for a particular object if that object is to be allowed in.  So we'll return false simply if the actor IsA() enforcer!

&lt;uscript&gt;function bool CheckReplacement (Actor Other, out byte bSuperRelevant)
{
	if (Other.IsA('enforcer'))
	{
		return false;
	}
	
	return true;
}&lt;/uscript&gt;

==Wrapping Up==

Well there you have it!  Add this mutator into your map, and there you go.  Changing the startup weapon wasn't so hard now was it?  It certainly would have been easier for me to have a tut like this around...  Please feel free to comment in the following section.

==Comments==

'''Draconx:''' Well its my second tut, and not particularly complicated, but its a good starting point for wannabe uscript coders (like me :))  I havent found any problems with it for what it does, aside from those mentioned in the preface.

'''Tarquin:''' Looks good :)

'''Uwa:''' If even half the code statements were explained with code comments or in the text, this might be useful for learning.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ChargeLight</title>
    <id>713</id>
    <revision>
      <id>2064</id>
      <timestamp>2003-03-20T20:23:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Light (UT)|Light (UT)]] &gt;&gt; ChargeLight (Package: UnrealShare)}}

This class has some references in the [[Legacy:DispersionPistol|DispersionPistol]] class, but it is not really used.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2065</id>
      <timestamp>2002-06-07T17:30:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Light (UT)|Light (UT)]] &gt;&gt; ChargeLight}}

This class has some references in the [[Legacy:DispersionPistol|DispersionPistol]] class, but it is not really used.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chazums</title>
    <id>765</id>
    <revision>
      <id>2184</id>
      <timestamp>2003-08-04T15:41:39Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>screening [[Category Journal]]</comment>
      <text xml:space="preserve">===General About ===

Age : 21

Occupation : Student

Location : Norwich, England

Contribution : Nothing yet :rolleyes:  -hopefully useful info on coding and Ifeel.

When i do something it will should on my part of the [[:Category:Legacy Journal]] with any luck :)

I thought i ought to contribute seeing as in the 2 weeks or so i've been looking at the UT2003 code Wiki has been an amazing help.  If its not comented in code its straight into the Wiki search :D

I'd also like to say you're damn brave to let people edit all the info here - IMO there are way too many morons around that kinda trust 

----

'''Mychaeel:''' Welcome to the Wiki.  Fortunately most morons seem to miss the challenge of doing bad stuff to the Wiki, and for the few that don't it's very much easier to revert unwanted additions than to add them in the first place.  See [[Legacy:Wiki Protection|Wiki Protection]].

'''Githianki:''' Welcome aboard!

'''Piglet:''' Hello, Welcome etc. Out of interest (with university on my horizon (ie next year)) where are you studying, or does your location give that away?

'''Chazums:''' Thank y'all.  I'm studying at Stafford Uni doing computing Science - the University itsn't bad i suppose tho i am not a great fan of it.  Essex do a good computer course from what my friends say if that the way you're going.

'''Tarquin:''' Hi there. Welcome to the site :) On the subject of how wiki can possibly work, see also [[Legacy:Wiki FAQ|Wiki FAQ]].

'''Chazums:''' With any luck i'll be putting a few tutorials up in the next week or two on Bullet Penetration, extending Hit effect (like the sparks from the mini-gun) and maybe something else - if people are interested

'''Tarquin:''' see [[Legacy:Wiki Site Stats|Wiki site stats]] for an idea of how many people might be interested.... :)

'''Piglet:''' Yeh, I looked at Exeter, seemed fairly good.  In the end I put down Kent at Canterbury BBB as first choice and Swansea BCC as my backup.

'''Chazums:''' Cool, good luck.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2185</id>
      <timestamp>2003-03-19T18:07:22Z</timestamp>
      <contributor>
        <ip>Piglet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===General About ===

Age : 21

Occupation : Student

Location : Norwich, England

Contribution : Nothing yet :rolleyes:  -hopefully useful info on coding and Ifeel.

When i do something it will should on my part of the [[:Category:Legacy Journal]] with any luck :)

I thought i ought to contribute seeing as in the 2 weeks or so i've been looking at the UT2003 code Wiki has been an amazing help.  If its not comented in code its straight into the Wiki search :D

I'd also like to say you're damn brave to let people edit all the info here - IMO there are way too many morons around that kinda trust 

----

'''Mychaeel:''' Welcome to the Wiki.  Fortunately most morons seem to miss the challenge of doing bad stuff to the Wiki, and for the few that don't it's very much easier to revert unwanted additions than to add them in the first place.  See [[Legacy:Wiki Protection|Wiki Protection]].

'''Githianki:''' Welcome aboard!

'''Piglet:''' Hello, Welcome etc. Out of interest (with university on my horizon (ie next year)) where are you studying, or does your location give that away?

'''Chazums:''' Thank y'all.  I'm studying at Stafford Uni doing computing Science - the University itsn't bad i suppose tho i am not a great fan of it.  Essex do a good computer course from what my friends say if that the way you're going.

'''Tarquin:''' Hi there. Welcome to the site :) On the subject of how wiki can possibly work, see also [[Legacy:Wiki FAQ|Wiki FAQ]].

'''Chazums:''' With any luck i'll be putting a few tutorials up in the next week or two on Bullet Penetration, extending Hit effect (like the sparks from the mini-gun) and maybe something else - if people are interested

'''Tarquin:''' see [[Legacy:Wiki Site Stats|Wiki site stats]] for an idea of how many people might be interested.... :)

'''Piglet:''' Yeh, I looked at Exeter, seemed fairly good.  In the end I put down Kent at Canterbury BBB as first choice and Swansea BCC as my backup.

[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2186</id>
      <timestamp>2003-03-20T02:14:28Z</timestamp>
      <contributor>
        <ip>Pc1-staf1-5-cust81.brhm.cable.ntl.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===General About ===

Age : 21

Occupation : Student

Location : Norwich, England

Contribution : Nothing yet :rolleyes:  -hopefully useful info on coding and Ifeel.

When i do something it will should on my part of the [[:Category:Legacy Journal]] with any luck :)

I thought i ought to contribute seeing as in the 2 weeks or so i've been looking at the UT2003 code Wiki has been an amazing help.  If its not comented in code its straight into the Wiki search :D

I'd also like to say you're damn brave to let people edit all the info here - IMO there are way too many morons around that kinda trust 

----

'''Mychaeel:''' Welcome to the Wiki.  Fortunately most morons seem to miss the challenge of doing bad stuff to the Wiki, and for the few that don't it's very much easier to revert unwanted additions than to add them in the first place.  See [[Legacy:Wiki Protection|Wiki Protection]].

'''Githianki:''' Welcome aboard!

'''Piglet:''' Hello, Welcome etc. Out of interest (with university on my horizon (ie next year)) where are you studying, or does your location give that away?

'''Chazums:''' Thank y'all.  I'm studying at Stafford Uni doing computing Science - the University itsn't bad i suppose tho i am not a great fan of it.  Essex do a good computer course from what my friends say if that the way you're going.

'''Tarquin:''' Hi there. Welcome to the site :) On the subject of how wiki can possibly work, see also [[Legacy:Wiki FAQ|Wiki FAQ]].

'''Chazums:''' With any luck i'll be putting a few tutorials up in the next week or two on Bullet Penetration, extending Hit effect (like the sparks from the mini-gun) and maybe something else - if people are interested

'''Tarquin:''' see [[Legacy:Wiki Site Stats|Wiki site stats]] for an idea of how many people might be interested.... :)

'''Piglet:''' Yeh, I looked at Exeter, seemed fairly good.  In the end I put down Kent at Canterbury BBB as first choice and Swansea BCC as my backup.

'''Chazums:''' Cool, good luck.

[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chazums/Developer Journal</title>
    <id>827</id>
    <revision>
      <id>2321</id>
      <timestamp>2003-08-05T09:45:58Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===Trystan===

He's the other guy i'm coding with, if you want to see an a broader view of the classes we're working on in an easy to follow and structured manner go to [[Legacy:Trystan/Developer Journal|Trystan/Developer Journal]]

===The Journal ===

I plan on updating this as i learn more about programming for UT2003.

I also plan to do a tutorial for creating and adding Immersion (Ifeel effects) - if thats ok that is :)

====Moving to UT ====

Before the project i worked with the Half-Life code and its certainly a culture shock when you first start.  Its pretty much like moving to from c++ to Java, if fact to me its ''just'' like that.

After the initial panic I started to look around it a little and i'm growing to really like its structured nature, it makes moving through areas of the code very fast.  

The main problem i'm having with it, being a beginner is finding out where to start and trying not to get lost as there are so many files to open.

So if you're a newbie like me i can '''highly''' recommend a pencil, paper, rubber, packet of buscuits, a whole lot of drink and a comfy chair.  Try and find a small part of the code that has obvious effect and get to know it alter a few values and see what happens.  I found that when taken in small pieces its easier to get my mind around.

===Axis ===

I'm not sure if this is actualy documented anywhere but i'll stick it here just incase.

I just have spent a good few hours trying to get a model to show up properly ingame, the break through came when i discovered the following:

x = z

y = x

z = y

so.....

Increasing '''x''' will make things move '''forward / into the scene'''

Increasing '''y''' will make things move '''to the right of the screen'''

Increasing '''z''' will make things move '''down the screen'''

IMO thats crazy :D

===PlayerViewOffset===

This is contained with the DefaultProperties of &lt;weaponname&gt;.u (see [http://wiki.beyondunreal.com/wiki/Default_Properties_For_Weapons Weapon Properties] )and relates to positioning the weapon model on screen

PlayerViewOffset=(X,Y,Z)

When altering this there are 2 things to remember

1. This value is multiplied later in the code (by 100)

2. That the Axis are set out as above.

===PlayerViewPivot===

This is also in the DefaultProperties of &lt;weaponname&gt;.u (see [http://wiki.beyondunreal.com/wiki/Default_Properties_For_Weapons Weapon Properties])

PlayerViewPivot(Pitch,Yaw,Roll)

16834 = 90 Degree turn
 

====Karmic Quirk ====

It would seem that having a very high value for the speed of a Projectile can have some side effects when interacting with Players.  When a player is killed by a high-speed Projectile it can cause the player to gib or get their limbs torn off.  This can be conpensated by setting a very low value for MomentumTransfer.

===Custom Bot Code ===

This, for the moment, is will be a very, very rough note on how to get bots to use custom pawn settings.

You will need the following things:

custom Pawn

custom Game

custom Roster

custom RosterEntry

so we have in our own .u called MyPackage

MyPawn

MyGame

MyRoster

MyRosterEntry

set MyGame &gt; DefaultProperties &gt; DefaultEnemyRosterClass = MyPackage.MyRoster

make MyRoster a duplicate of a current roster e.g. xTeamRoster.uc

then Replace all the instances of xRosterEntry with MyRosterEntry

make MyRosterEntry a duplicate of a current rosterentry e.g.xRosterEntry.uc

then in the functions :
  static function xRosterEntry CreateRosterEntry(int prIdx)
  static function xRosterEntry CreateRosterEntryCharacter(string CharName)

set xre.PawnClassName = &quot;MyPackage.MyPawn&quot; in both functions

ta-da.

i appologise for the complete mess that this is, but i shall clean it up and make it a proper wiki page - unless someone else wants too.

===PokeTerrain() ===

This comes with the new 2225 patch (i think) and allows you to alter the hightmap of a level on the fly - can you say 'deformable terrain'? :D

===Leaving===

Because i'm not going to be developing for ut2k3 any more i'm, going to up all the work i've done so people can use it :D

should be up mid-week ish.

What its got:

Projectile based bullets (with bullet drop)

Weapon Recoil

Timed respawns (like RtCW)

Re-inforcements (like battlefield)

Reloading

Iron-Sights

Texture specific hit decals and hit effects

Bullet Penetration

Locational Damage

Deformable Terrain (grens will leave craters etc)

maybe other stuff that i've forgot :P
*note this is work in progress code so its not perfect*

if you want me to go through and explain some of the mess leave a comment and i'll reply

[http://homepage.ntlworld.com/steen.charman/code.zip The Code]

[http://homepage.ntlworld.com/steen.charman/CodeAndArt.zip The Code and Art] ( 2 maps, 4 weapons, Slightly Modified Karma model and various art for effects etc)

I would ask that you don't re-use the Art tho please as it will be used on the new project.

----

'''EntropicLqd:''' What you going to be up to then?  Surely you are not quitting modding altogether?

'''Chazums:''' For now i am at the end of my final year of University, the rest of the mod team want to wait and mod for HL2 so maybe that :/

'''TFfF_Renoir''' Thanks, Chazums, for posting your code so that others may learn. I've been coding an UT2k3 mod for a little while, on and off, and these wiki pages are where I've learnt most of the interesting stuff. Can I just check that you don't mind if I use some of your code (appropriately marked as such) in our mod? I've just about learnt enough to start contributing to the wiki, and everyone's leaving to do HL2 :)  

'''Chazums:''' Sure thats what its here for.  Personally i don't think that HL2 can do anything that ut2k3 can't and with the rumours of ut2k4 being at E3 i wouldn't be supprised if UT ends up being better.  Still, you go where the boss says :P

'''Riddler:''' How about .int files and your test map to go with the code?  Looking at code is great, but it would be nice to see it in-engine so we can see what it plays like.

'''Chazums:''' I'll talk to the other guys and see if they mind having their art released.

'''Riddler:''' Thanks, appreciate that.  You can e-mail me at riddler@megamod.d2g.com, or MSN Messenger at MegaRiddler@hotmail.com if you need

'''Chazums:''' There we go all there now ( i think )

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2322</id>
      <timestamp>2003-05-14T23:53:05Z</timestamp>
      <contributor>
        <ip>Adsl-80-152-118.rdu.bellsouth.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Trystan===

He's the other guy i'm coding with, if you want to see an a broader view of the classes we're working on in an easy to follow and structured manner go to [[Legacy:Trystan/Developer Journal|Trystan/Developer Journal]]

===The Journal ===

I plan on updating this as i learn more about programming for UT2003.

I also plan to do a tutorial for creating and adding Immersion (Ifeel effects) - if thats ok that is :)

====Moving to UT ====

Before the project i worked with the Half-Life code and its certainly a culture shock when you first start.  Its pretty much like moving to from c++ to Java, if fact to me its ''just'' like that.

After the initial panic I started to look around it a little and i'm growing to really like its structured nature, it makes moving through areas of the code very fast.  

The main problem i'm having with it, being a beginner is finding out where to start and trying not to get lost as there are so many files to open.

So if you're a newbie like me i can '''highly''' recommend a pencil, paper, rubber, packet of buscuits, a whole lot of drink and a comfy chair.  Try and find a small part of the code that has obvious effect and get to know it alter a few values and see what happens.  I found that when taken in small pieces its easier to get my mind around.

===Axis ===

I'm not sure if this is actualy documented anywhere but i'll stick it here just incase.

I just have spent a good few hours trying to get a model to show up properly ingame, the break through came when i discovered the following:

x = z

y = x

z = y

so.....

Increasing '''x''' will make things move '''forward / into the scene'''

Increasing '''y''' will make things move '''to the right of the screen'''

Increasing '''z''' will make things move '''down the screen'''

IMO thats crazy :D

===PlayerViewOffset===

This is contained with the DefaultProperties of &lt;weaponname&gt;.u (see [http://wiki.beyondunreal.com/wiki/Default_Properties_For_Weapons Weapon Properties] )and relates to positioning the weapon model on screen

PlayerViewOffset=(X,Y,Z)

When altering this there are 2 things to remember

1. This value is multiplied later in the code (by 100)

2. That the Axis are set out as above.

===PlayerViewPivot===

This is also in the DefaultProperties of &lt;weaponname&gt;.u (see [http://wiki.beyondunreal.com/wiki/Default_Properties_For_Weapons Weapon Properties])

PlayerViewPivot(Pitch,Yaw,Roll)

16834 = 90 Degree turn
 

====Karmic Quirk ====

It would seem that having a very high value for the speed of a Projectile can have some side effects when interacting with Players.  When a player is killed by a high-speed Projectile it can cause the player to gib or get their limbs torn off.  This can be conpensated by setting a very low value for MomentumTransfer.

===Custom Bot Code ===

This, for the moment, is will be a very, very rough note on how to get bots to use custom pawn settings.

You will need the following things:

custom Pawn

custom Game

custom Roster

custom RosterEntry

so we have in our own .u called MyPackage

MyPawn

MyGame

MyRoster

MyRosterEntry

set MyGame &gt; DefaultProperties &gt; DefaultEnemyRosterClass = MyPackage.MyRoster

make MyRoster a duplicate of a current roster e.g. xTeamRoster.uc

then Replace all the instances of xRosterEntry with MyRosterEntry

make MyRosterEntry a duplicate of a current rosterentry e.g.xRosterEntry.uc

then in the functions :
  static function xRosterEntry CreateRosterEntry(int prIdx)
  static function xRosterEntry CreateRosterEntryCharacter(string CharName)

set xre.PawnClassName = &quot;MyPackage.MyPawn&quot; in both functions

ta-da.

i appologise for the complete mess that this is, but i shall clean it up and make it a proper wiki page - unless someone else wants too.

===PokeTerrain() ===

This comes with the new 2225 patch (i think) and allows you to alter the hightmap of a level on the fly - can you say 'deformable terrain'? :D

===Leaving===

Because i'm not going to be developing for ut2k3 any more i'm, going to up all the work i've done so people can use it :D

should be up mid-week ish.

What its got:

Projectile based bullets (with bullet drop)

Weapon Recoil

Timed respawns (like RtCW)

Re-inforcements (like battlefield)

Reloading

Iron-Sights

Texture specific hit decals and hit effects

Bullet Penetration

Locational Damage

Deformable Terrain (grens will leave craters etc)

maybe other stuff that i've forgot :P
*note this is work in progress code so its not perfect*

if you want me to go through and explain some of the mess leave a comment and i'll reply

[http://homepage.ntlworld.com/steen.charman/code.zip The Code]

----

'''EntropicLqd:''' What you going to be up to then?  Surely you are not quitting modding altogether?

'''Chazums:''' For now i am at the end of my final year of University, the rest of the mod team want to wait and mod for HL2 so maybe that :/

'''TFfF_Renoir''' Thanks, Chazums, for posting your code so that others may learn. I've been coding an UT2k3 mod for a little while, on and off, and these wiki pages are where I've learnt most of the interesting stuff. Can I just check that you don't mind if I use some of your code (appropriately marked as such) in our mod? I've just about learnt enough to start contributing to the wiki, and everyone's leaving to do HL2 :)  

'''Chazums:''' Sure thats what its here for.  Personally i don't think that HL2 can do anything that ut2k3 can't and with the rumours of ut2k4 being at E3 i wouldn't be supprised if UT ends up being better.  Still, you go where the boss says :P

'''Riddler:''' How about .int files and your test map to go with the code?  Looking at code is great, but it would be nice to see it in-engine so we can see what it plays like.

'''Chazums:''' I'll talk to the other guys and see if they mind having their art released.

'''Riddler:''' Thanks, appreciate that.  You can e-mail me at riddler@megamod.d2g.com, or MSN Messenger at MegaRiddler@hotmail.com if you need</text>
    </revision>
    <revision>
      <id>2323</id>
      <timestamp>2003-05-30T09:19:37Z</timestamp>
      <contributor>
        <ip>Chazums</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Trystan===

He's the other guy i'm coding with, if you want to see an a broader view of the classes we're working on in an easy to follow and structured manner go to [[Legacy:Trystan/Developer Journal|Trystan/Developer Journal]]

===The Journal ===

I plan on updating this as i learn more about programming for UT2003.

I also plan to do a tutorial for creating and adding Immersion (Ifeel effects) - if thats ok that is :)

====Moving to UT ====

Before the project i worked with the Half-Life code and its certainly a culture shock when you first start.  Its pretty much like moving to from c++ to Java, if fact to me its ''just'' like that.

After the initial panic I started to look around it a little and i'm growing to really like its structured nature, it makes moving through areas of the code very fast.  

The main problem i'm having with it, being a beginner is finding out where to start and trying not to get lost as there are so many files to open.

So if you're a newbie like me i can '''highly''' recommend a pencil, paper, rubber, packet of buscuits, a whole lot of drink and a comfy chair.  Try and find a small part of the code that has obvious effect and get to know it alter a few values and see what happens.  I found that when taken in small pieces its easier to get my mind around.

===Axis ===

I'm not sure if this is actualy documented anywhere but i'll stick it here just incase.

I just have spent a good few hours trying to get a model to show up properly ingame, the break through came when i discovered the following:

x = z

y = x

z = y

so.....

Increasing '''x''' will make things move '''forward / into the scene'''

Increasing '''y''' will make things move '''to the right of the screen'''

Increasing '''z''' will make things move '''down the screen'''

IMO thats crazy :D

===PlayerViewOffset===

This is contained with the DefaultProperties of &lt;weaponname&gt;.u (see [http://wiki.beyondunreal.com/wiki/Default_Properties_For_Weapons Weapon Properties] )and relates to positioning the weapon model on screen

PlayerViewOffset=(X,Y,Z)

When altering this there are 2 things to remember

1. This value is multiplied later in the code (by 100)

2. That the Axis are set out as above.

===PlayerViewPivot===

This is also in the DefaultProperties of &lt;weaponname&gt;.u (see [http://wiki.beyondunreal.com/wiki/Default_Properties_For_Weapons Weapon Properties])

PlayerViewPivot(Pitch,Yaw,Roll)

16834 = 90 Degree turn
 

====Karmic Quirk ====

It would seem that having a very high value for the speed of a Projectile can have some side effects when interacting with Players.  When a player is killed by a high-speed Projectile it can cause the player to gib or get their limbs torn off.  This can be conpensated by setting a very low value for MomentumTransfer.

===Custom Bot Code ===

This, for the moment, is will be a very, very rough note on how to get bots to use custom pawn settings.

You will need the following things:

custom Pawn

custom Game

custom Roster

custom RosterEntry

so we have in our own .u called MyPackage

MyPawn

MyGame

MyRoster

MyRosterEntry

set MyGame &gt; DefaultProperties &gt; DefaultEnemyRosterClass = MyPackage.MyRoster

make MyRoster a duplicate of a current roster e.g. xTeamRoster.uc

then Replace all the instances of xRosterEntry with MyRosterEntry

make MyRosterEntry a duplicate of a current rosterentry e.g.xRosterEntry.uc

then in the functions :
  static function xRosterEntry CreateRosterEntry(int prIdx)
  static function xRosterEntry CreateRosterEntryCharacter(string CharName)

set xre.PawnClassName = &quot;MyPackage.MyPawn&quot; in both functions

ta-da.

i appologise for the complete mess that this is, but i shall clean it up and make it a proper wiki page - unless someone else wants too.

===PokeTerrain() ===

This comes with the new 2225 patch (i think) and allows you to alter the hightmap of a level on the fly - can you say 'deformable terrain'? :D

===Leaving===

Because i'm not going to be developing for ut2k3 any more i'm, going to up all the work i've done so people can use it :D

should be up mid-week ish.

What its got:

Projectile based bullets (with bullet drop)

Weapon Recoil

Timed respawns (like RtCW)

Re-inforcements (like battlefield)

Reloading

Iron-Sights

Texture specific hit decals and hit effects

Bullet Penetration

Locational Damage

Deformable Terrain (grens will leave craters etc)

maybe other stuff that i've forgot :P
*note this is work in progress code so its not perfect*

if you want me to go through and explain some of the mess leave a comment and i'll reply

[http://homepage.ntlworld.com/steen.charman/code.zip The Code]

[http://homepage.ntlworld.com/steen.charman/CodeAndArt.zip The Code and Art] ( 2 maps, 4 weapons, Slightly Modified Karma model and various art for effects etc)

I would ask that you don't re-use the Art tho please as it will be used on the new project.

----

'''EntropicLqd:''' What you going to be up to then?  Surely you are not quitting modding altogether?

'''Chazums:''' For now i am at the end of my final year of University, the rest of the mod team want to wait and mod for HL2 so maybe that :/

'''TFfF_Renoir''' Thanks, Chazums, for posting your code so that others may learn. I've been coding an UT2k3 mod for a little while, on and off, and these wiki pages are where I've learnt most of the interesting stuff. Can I just check that you don't mind if I use some of your code (appropriately marked as such) in our mod? I've just about learnt enough to start contributing to the wiki, and everyone's leaving to do HL2 :)  

'''Chazums:''' Sure thats what its here for.  Personally i don't think that HL2 can do anything that ut2k3 can't and with the rumours of ut2k4 being at E3 i wouldn't be supprised if UT ends up being better.  Still, you go where the boss says :P

'''Riddler:''' How about .int files and your test map to go with the code?  Looking at code is great, but it would be nice to see it in-engine so we can see what it plays like.

'''Chazums:''' I'll talk to the other guys and see if they mind having their art released.

'''Riddler:''' Thanks, appreciate that.  You can e-mail me at riddler@megamod.d2g.com, or MSN Messenger at MegaRiddler@hotmail.com if you need

'''Chazums:''' There we go all there now ( i think )</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CheatManager</title>
    <id>872</id>
    <revision>
      <id>2422</id>
      <timestamp>2004-06-10T14:27:09Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:CheatManager|CheatManager]]}}

Object within [[Legacy:PlayerController|PlayerController]] that defines &quot;cheat&quot; commands.

==Functions ==

All functions listed here are exec.
;FreezeFrame (float delay):
;WriteToLog:
;SetFlash (float F):
;SetFogR (float F):
;SetFogG (float F):
;SetFogB (float F):
;LogScriptedSequences:
;Teleport:
;ChangeSize (float F):
;LockCamera:
;SetCameraDist (float F):
;EndPath:
;FreeCamera (bool B):
;CauseEvent (name EventName):
;Amphibious:
;Fly:
;Walk:
;Ghost:
;AllAmmo:
;Invisible (bool B):
;God:
;SloMo (float T):
;SetJumpZ (float F):
;SetGravity (float F):
;SetSpeed (float F):
;KillAll (class&lt;[[Legacy:Actor|Actor]]&gt; aClass):
;KillPawns:
;Avatar (string ClassName):
;Summon (string ClassName):
;PlayersOnly:
;CheatView (class&lt;[[Legacy:Actor|Actor]]&gt; aClass, optional bool bQuiet):
;RememberSpot:
;ViewSelf (optional bool bQuiet):
;ViewPlayer (string S):
;ViewActor (name ActorName):
;ViewBot:
;ViewClass (class&lt;[[Legacy:Actor|Actor]]&gt; aClass, optional bool bQuiet, optional bool bCheat):
;Loaded:

==Related Topics ==
* [[Legacy:Console Commands|Console Commands]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CheckReplacement</title>
    <id>896</id>
    <revision>
      <id>2474</id>
      <timestamp>2006-01-19T22:24:09Z</timestamp>
      <contributor>
        <ip>VitalOverdose</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:UT2004|UT2004]], Version Only.

Ok so you've got your new weapon and you want to use it in a game.  To do this, we create a new weapon [[Legacy:Mutator|Mutator]] and override the CheckReplacement() function.  This function is called for every Actor entering the game (whether being loaded with the map, or spawned on-the-fly), and you can use it to make substitutions and modifications as they are initialized.

==First: Make a subclass of Mutator ==

This will allow you to do all the changes before the level starts, and will automatically iterate though all the level actors, allowing to you to look for any instances of the class you wish to replace. 

&lt;uscript&gt;
class NewWeaponMutator extends Mutator;
&lt;/uscript&gt;

==Second: Swap weapon bases/pickups/etc in CheckReplacement() ==

We use CheckReplacement(), a probing function, to typecast ''Other'' to different subclasses to qualify them and to grab extra info and make substitutions, as needed:

''Note:  The local variables (''i'' and ''L'') are only necessary if your mod is for UT2004 and you want it to work on Onslaught maps.''

&lt;uscript&gt;
function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
{
   local int i;                // for UT2004 Onslaught weapon lockers
   local WeaponLocker L;       // for UT2004 Onslaught weapon lockers

   bSuperRelevant = 0;
&lt;/uscript&gt;

Inside the function the first check is to see if ''Other'' is the right class (xWeaponBase).  This is to stop the second check going wrong:

&lt;uscript&gt;
   if (XWeaponBase(Other) != None) 
&lt;/uscript&gt;

Now that we know that ''Other'' is a xWeaponBase and its WeaponType is the class we want to replace, we override it with our new WeaponType: 

&lt;uscript&gt;
   {
      if (XWeaponBase(Other).WeaponType == Class'WeaponClassWantToReplace') 
         XWeaponbase(Other).WeaponType = Class'NewWeaponClass'; 
      else 
         return true; 
   } 
&lt;/uscript&gt;

As we've only modified weapon bases so far, you need to do the same thing again, checking for the weapon pickup class to grab any stray weapons of that class lying about in the level for whatever reason (e.g. if they are placed on the map itself, or when a player is killed and drops it). Remember the mutator has to work on other people's levels too, so it should be able to cope with any setup they come up with. So we add:

''Note: We use &quot;~=&quot; for a case-insensitive string comparison, but rememeber that class names are fully-qualified.  You &quot;PickupClassWantToReplace&quot; would be something like &quot;XWeapons.Minigun&quot;.''

&lt;uscript&gt;
   else if (WeaponPickup(Other) != None) 
   { 
      if (String(Other.Class) ~= &quot;PickupClassWantToReplace&quot;) 
         ReplaceWith(Other, &quot;NewPickupClass&quot;);
      else 
         return true; 
   }
&lt;/uscript&gt;

This next section is only for UT2004, and adds support for Onslaught mode's WeaponLockers.  Basically, it searches through each WeaponLocker's inventory (array), weapon by weapon, replacing the old weapon class with the new:

&lt;uscript&gt;
   else if ( WeaponLocker(Other) != None )
   {
      L = WeaponLocker(Other);
      for (i = 0; i &lt; L.Weapons.Length; i++)
         if ( string( L.Weapons[i].WeaponClass ) ~= &quot;WeaponClassWantToReplace&quot; )
            L.Weapons[i].WeaponClass = Class'NewWeaponClass';

      return true;
   }
&lt;/uscript&gt;

And now, finish off CheckReplacement() with the following:

&lt;uscript&gt;
   else 
      return true; 

   return false;
}
&lt;/uscript&gt;

==Third: Add default properties to describe the new Mutator==

So that the new weapon mutator has a name and description: 

&lt;uscript&gt;
defaultproperties 
{ 
   FriendlyName=&quot;name in mutator list&quot; 
   Description=&quot;new weapon mutator description&quot; 
}
&lt;/uscript&gt;

-VitalOverdose.-

==Discussion==

'''Geist:''' Yeah, that's better.  I took the liberty of adding the extra '''return false;''' at the end, and a section that supports WeaponLockers from UT2004 Onslaught mode.  Personally, I would have placed '''return false;''' lines where needed, then finish up the function with a '''return true;''', as that would make the logic make more sense... but that doesn't seem to be the style here (or at Epic, as seen in the other weapon mutator scripts).

Btw, I also realize that comments like &quot;if you're making a UT2004 mod&quot; might be redundant, since the top of the page ''seems'' to indicate this page is already UT2004-only.  So if this page is ''meant'' to be UT2004-specific through and through, please remove the extraneous UT2004 comments in the code/text and be more explicit at the top of the page. (how many times can I say &quot;UT2004&quot; in one paragraph?) :)

_'''FatalOverdose''' - thanks , will do that.

'''Sweavo:''' Shouldn't there be a call to NextMutator.CheckReplacement rather than a simple return...?

'''Wormbo:''' CheckReplacement should ''never'' call NextMutator.CheckReplacement(). The function is called by IsRelevant, which also handles the [[Legacy:Linked List|linked list]] stuff.

'''AgentBionicman''' I don't think projectiles are sent through this function anymore. Anyone else notice this?

'''Bonehed316:''' Projectiles arent sent through this function because they have bGameRelevant=True.  This function only works on those actors which are !bGameRelevant.  Maybe there should be a small section which explains how/why this function gets called, and where from?

'''Sweavo:''' seconded.  This page is hit number one for a search for CheckReplacement, but does not tell us what the '''out''' parameter bSuperRelevant does, nor what the return value means.

'''Neuroflare:''' None of the CheckReplacement tutorials I have seen here elaborate on changing out ammo, or am I mistaken?

'''MythOpus:''' I don't think you can change firemodes/ammo because they're set to only be able to be access by the class the references them.. in this case Weapon.</text>
    </revision>
    <revision>
      <id>2475</id>
      <timestamp>2005-08-27T02:44:41Z</timestamp>
      <contributor>
        <ip>Blen2r</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:UT2004|UT2004]], Version Only.

Ok so you've got your new weapon and you want to use it in a game.  To do this, we create a new weapon [[Legacy:Mutator|Mutator]] and override the CheckReplacement() function.  This function is called for every Actor entering the game (whether being loaded with the map, or spawned on-the-fly), and you can use it to make substitutions and modifications as they are initialized.

==First: Make a subclass of Mutator ==

This will allow you to do all the changes before the level starts, and will automatically iterate though all the level actors, allowing to you to look for any instances of the class you wish to replace. 

&lt;uscript&gt;
class NewWeaponMutator extends Mutator;
&lt;/uscript&gt;

==Second: Swap weapon bases/pickups/etc in CheckReplacement() ==

We use CheckReplacement(), a probing function, to typecast ''Other'' to different subclasses to qualify them and to grab extra info and make substitutions, as needed:

''Note:  The local variables (''i'' and ''L'') are only necessary if your mod is for UT2004 and you want it to work on Onslaught maps.''

&lt;uscript&gt;
function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
{
   local int i;                // for UT2004 Onslaught weapon lockers
   local WeaponLocker L;       // for UT2004 Onslaught weapon lockers

   bSuperRelevant = 0;
&lt;/uscript&gt;

Inside the function the first check is to see if ''Other'' is the right class (xWeaponBase).  This is to stop the second check going wrong:

&lt;uscript&gt;
   if (XWeaponBase(Other) != None) 
&lt;/uscript&gt;

Now that we know that ''Other'' is a xWeaponBase and its WeaponType is the class we want to replace, we override it with our new WeaponType: 

&lt;uscript&gt;
   {
      if (XWeaponBase(Other).WeaponType == Class'WeaponClassWantToReplace') 
         XWeaponbase(Other).WeaponType = Class'NewWeaponClass'; 
      else 
         return true; 
   } 
&lt;/uscript&gt;

As we've only modified weapon bases so far, you need to do the same thing again, checking for the weapon pickup class to grab any stray weapons of that class lying about in the level for whatever reason (e.g. if they are placed on the map itself, or when a player is killed and drops it). Remember the mutator has to work on other people's levels too, so it should be able to cope with any setup they come up with. So we add:

''Note: We use &quot;~=&quot; for a case-insensitive string comparison, but rememeber that class names are fully-qualified.  You &quot;PickupClassWantToReplace&quot; would be something like &quot;XWeapons.Minigun&quot;.''

&lt;uscript&gt;
   else if (WeaponPickup(Other) != None) 
   { 
      if (String(Other.Class) ~= &quot;PickupClassWantToReplace&quot;) 
         ReplaceWith(Other, &quot;NewPickupClass&quot;);
      else 
         return true; 
   }
&lt;/uscript&gt;

This next section is only for UT2004, and adds support for Onslaught mode's WeaponLockers.  Basically, it searches through each WeaponLocker's inventory (array), weapon by weapon, replacing the old weapon class with the new:

&lt;uscript&gt;
   else if ( WeaponLocker(Other) != None )
   {
      L = WeaponLocker(Other);
      for (i = 0; i &lt; L.Weapons.Length; i++)
         if ( string( L.Weapons[i].WeaponClass ) ~= &quot;WeaponClassWantToReplace&quot; )
            L.Weapons[i].WeaponClass = Class'NewWeaponClass';

      return true;
   }
&lt;/uscript&gt;

And now, finish off CheckReplacement() with the following:

&lt;uscript&gt;
   else 
      return true; 

   return false;
}
&lt;/uscript&gt;

==Third: Add default properties to describe the new Mutator==

So that the new weapon mutator has a name and description: 

&lt;uscript&gt;
defaultproperties 
{ 
   FriendlyName=&quot;name in mutator list&quot; 
   Description=&quot;new weapon mutator description&quot; 
}
&lt;/uscript&gt;

-FatalOverdose.-

==Discussion==

'''Geist:''' Yeah, that's better.  I took the liberty of adding the extra '''return false;''' at the end, and a section that supports WeaponLockers from UT2004 Onslaught mode.  Personally, I would have placed '''return false;''' lines where needed, then finish up the function with a '''return true;''', as that would make the logic make more sense... but that doesn't seem to be the style here (or at Epic, as seen in the other weapon mutator scripts).

Btw, I also realize that comments like &quot;if you're making a UT2004 mod&quot; might be redundant, since the top of the page ''seems'' to indicate this page is already UT2004-only.  So if this page is ''meant'' to be UT2004-specific through and through, please remove the extraneous UT2004 comments in the code/text and be more explicit at the top of the page. (how many times can I say &quot;UT2004&quot; in one paragraph?) :)

_'''FatalOverdose''' - thanks , will do that.

'''Sweavo:''' Two observations: (1) that return false will never be reached, as you are returning from every branch of the if statement, and (2) Shouldn't there be a call to NextMutator.CheckReplacement rather than a simple return...?  Otherwise you won't be able to have two weapon mutators running at once.

'''AgentBionicman''' I don't think projectiles are sent through this function anymore. Anyone else notice this?

'''Wormbo:''' CheckReplacement should ''never'' call NextMutator.CheckReplacement(). The function is called by IsRelevant, which also handles the [[Legacy:Linked List|linked list]] stuff.

'''Bonehed316:''' Projectiles arent sent through this function because they have bGameRelevant=True.  This function only works on those actors which are !bGameRelevant.  Maybe there should be a small section which explains how/why this function gets called, and where from?

'''Neuroflare:''' None of the CheckReplacement tutorials I have seen here elaborate on changing out ammo, or am I mistaken?

'''MythOpus:''' I don't think you can change firemodes/ammo because they're set to only be able to be access by the class the references them.. in this case Weapon.</text>
    </revision>
    <revision>
      <id>2476</id>
      <timestamp>2006-01-05T11:23:08Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Tidied comments, and requested some definitive content</comment>
      <text xml:space="preserve">[[Legacy:UT2004|UT2004]], Version Only.

Ok so you've got your new weapon and you want to use it in a game.  To do this, we create a new weapon [[Legacy:Mutator|Mutator]] and override the CheckReplacement() function.  This function is called for every Actor entering the game (whether being loaded with the map, or spawned on-the-fly), and you can use it to make substitutions and modifications as they are initialized.

==First: Make a subclass of Mutator ==

This will allow you to do all the changes before the level starts, and will automatically iterate though all the level actors, allowing to you to look for any instances of the class you wish to replace. 

&lt;uscript&gt;
class NewWeaponMutator extends Mutator;
&lt;/uscript&gt;

==Second: Swap weapon bases/pickups/etc in CheckReplacement() ==

We use CheckReplacement(), a probing function, to typecast ''Other'' to different subclasses to qualify them and to grab extra info and make substitutions, as needed:

''Note:  The local variables (''i'' and ''L'') are only necessary if your mod is for UT2004 and you want it to work on Onslaught maps.''

&lt;uscript&gt;
function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
{
   local int i;                // for UT2004 Onslaught weapon lockers
   local WeaponLocker L;       // for UT2004 Onslaught weapon lockers

   bSuperRelevant = 0;
&lt;/uscript&gt;

Inside the function the first check is to see if ''Other'' is the right class (xWeaponBase).  This is to stop the second check going wrong:

&lt;uscript&gt;
   if (XWeaponBase(Other) != None) 
&lt;/uscript&gt;

Now that we know that ''Other'' is a xWeaponBase and its WeaponType is the class we want to replace, we override it with our new WeaponType: 

&lt;uscript&gt;
   {
      if (XWeaponBase(Other).WeaponType == Class'WeaponClassWantToReplace') 
         XWeaponbase(Other).WeaponType = Class'NewWeaponClass'; 
      else 
         return true; 
   } 
&lt;/uscript&gt;

As we've only modified weapon bases so far, you need to do the same thing again, checking for the weapon pickup class to grab any stray weapons of that class lying about in the level for whatever reason (e.g. if they are placed on the map itself, or when a player is killed and drops it). Remember the mutator has to work on other people's levels too, so it should be able to cope with any setup they come up with. So we add:

''Note: We use &quot;~=&quot; for a case-insensitive string comparison, but rememeber that class names are fully-qualified.  You &quot;PickupClassWantToReplace&quot; would be something like &quot;XWeapons.Minigun&quot;.''

&lt;uscript&gt;
   else if (WeaponPickup(Other) != None) 
   { 
      if (String(Other.Class) ~= &quot;PickupClassWantToReplace&quot;) 
         ReplaceWith(Other, &quot;NewPickupClass&quot;);
      else 
         return true; 
   }
&lt;/uscript&gt;

This next section is only for UT2004, and adds support for Onslaught mode's WeaponLockers.  Basically, it searches through each WeaponLocker's inventory (array), weapon by weapon, replacing the old weapon class with the new:

&lt;uscript&gt;
   else if ( WeaponLocker(Other) != None )
   {
      L = WeaponLocker(Other);
      for (i = 0; i &lt; L.Weapons.Length; i++)
         if ( string( L.Weapons[i].WeaponClass ) ~= &quot;WeaponClassWantToReplace&quot; )
            L.Weapons[i].WeaponClass = Class'NewWeaponClass';

      return true;
   }
&lt;/uscript&gt;

And now, finish off CheckReplacement() with the following:

&lt;uscript&gt;
   else 
      return true; 

   return false;
}
&lt;/uscript&gt;

==Third: Add default properties to describe the new Mutator==

So that the new weapon mutator has a name and description: 

&lt;uscript&gt;
defaultproperties 
{ 
   FriendlyName=&quot;name in mutator list&quot; 
   Description=&quot;new weapon mutator description&quot; 
}
&lt;/uscript&gt;

-FatalOverdose.-

==Discussion==

'''Geist:''' Yeah, that's better.  I took the liberty of adding the extra '''return false;''' at the end, and a section that supports WeaponLockers from UT2004 Onslaught mode.  Personally, I would have placed '''return false;''' lines where needed, then finish up the function with a '''return true;''', as that would make the logic make more sense... but that doesn't seem to be the style here (or at Epic, as seen in the other weapon mutator scripts).

Btw, I also realize that comments like &quot;if you're making a UT2004 mod&quot; might be redundant, since the top of the page ''seems'' to indicate this page is already UT2004-only.  So if this page is ''meant'' to be UT2004-specific through and through, please remove the extraneous UT2004 comments in the code/text and be more explicit at the top of the page. (how many times can I say &quot;UT2004&quot; in one paragraph?) :)

_'''FatalOverdose''' - thanks , will do that.

'''Sweavo:''' Shouldn't there be a call to NextMutator.CheckReplacement rather than a simple return...?

'''Wormbo:''' CheckReplacement should ''never'' call NextMutator.CheckReplacement(). The function is called by IsRelevant, which also handles the [[Legacy:Linked List|linked list]] stuff.

'''AgentBionicman''' I don't think projectiles are sent through this function anymore. Anyone else notice this?

'''Bonehed316:''' Projectiles arent sent through this function because they have bGameRelevant=True.  This function only works on those actors which are !bGameRelevant.  Maybe there should be a small section which explains how/why this function gets called, and where from?

'''Sweavo:''' seconded.  This page is hit number one for a search for CheckReplacement, but does not tell us what the '''out''' parameter bSuperRelevant does, nor what the return value means.

'''Neuroflare:''' None of the CheckReplacement tutorials I have seen here elaborate on changing out ammo, or am I mistaken?

'''MythOpus:''' I don't think you can change firemodes/ammo because they're set to only be able to be access by the class the references them.. in this case Weapon.</text>
    </revision>
    <revision>
      <id>35584</id>
      <timestamp>2009-11-03T18:58:13Z</timestamp>
      <contributor>
        <ip>188.89.245.180</ip>
      </contributor>
      <comment>/* Third: Add default properties to describe the new Mutator */</comment>
      <text xml:space="preserve">[[Legacy:UT2004|UT2004]], Version Only.

Ok so you've got your new weapon and you want to use it in a game.  To do this, we create a new weapon [[Legacy:Mutator|Mutator]] and override the CheckReplacement() function.  This function is called for every Actor entering the game (whether being loaded with the map, or spawned on-the-fly), and you can use it to make substitutions and modifications as they are initialized.

==First: Make a subclass of Mutator ==

This will allow you to do all the changes before the level starts, and will automatically iterate though all the level actors, allowing to you to look for any instances of the class you wish to replace. 

&lt;uscript&gt;
class NewWeaponMutator extends Mutator;
&lt;/uscript&gt;

==Second: Swap weapon bases/pickups/etc in CheckReplacement() ==

We use CheckReplacement(), a probing function, to typecast ''Other'' to different subclasses to qualify them and to grab extra info and make substitutions, as needed:

''Note:  The local variables (''i'' and ''L'') are only necessary if your mod is for UT2004 and you want it to work on Onslaught maps.''

&lt;uscript&gt;
function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
{
   local int i;                // for UT2004 Onslaught weapon lockers
   local WeaponLocker L;       // for UT2004 Onslaught weapon lockers

   bSuperRelevant = 0;
&lt;/uscript&gt;

Inside the function the first check is to see if ''Other'' is the right class (xWeaponBase).  This is to stop the second check going wrong:

&lt;uscript&gt;
   if (XWeaponBase(Other) != None) 
&lt;/uscript&gt;

Now that we know that ''Other'' is a xWeaponBase and its WeaponType is the class we want to replace, we override it with our new WeaponType: 

&lt;uscript&gt;
   {
      if (XWeaponBase(Other).WeaponType == Class'WeaponClassWantToReplace') 
         XWeaponbase(Other).WeaponType = Class'NewWeaponClass'; 
      else 
         return true; 
   } 
&lt;/uscript&gt;

As we've only modified weapon bases so far, you need to do the same thing again, checking for the weapon pickup class to grab any stray weapons of that class lying about in the level for whatever reason (e.g. if they are placed on the map itself, or when a player is killed and drops it). Remember the mutator has to work on other people's levels too, so it should be able to cope with any setup they come up with. So we add:

''Note: We use &quot;~=&quot; for a case-insensitive string comparison, but rememeber that class names are fully-qualified.  You &quot;PickupClassWantToReplace&quot; would be something like &quot;XWeapons.Minigun&quot;.''

&lt;uscript&gt;
   else if (WeaponPickup(Other) != None) 
   { 
      if (String(Other.Class) ~= &quot;PickupClassWantToReplace&quot;) 
         ReplaceWith(Other, &quot;NewPickupClass&quot;);
      else 
         return true; 
   }
&lt;/uscript&gt;

This next section is only for UT2004, and adds support for Onslaught mode's WeaponLockers.  Basically, it searches through each WeaponLocker's inventory (array), weapon by weapon, replacing the old weapon class with the new:

&lt;uscript&gt;
   else if ( WeaponLocker(Other) != None )
   {
      L = WeaponLocker(Other);
      for (i = 0; i &lt; L.Weapons.Length; i++)
         if ( string( L.Weapons[i].WeaponClass ) ~= &quot;WeaponClassWantToReplace&quot; )
            L.Weapons[i].WeaponClass = Class'NewWeaponClass';

      return true;
   }
&lt;/uscript&gt;

And now, finish off CheckReplacement() with the following:

&lt;uscript&gt;
   else 
      return true; 

   return false;
}
&lt;/uscript&gt;

==Third: Add default properties to describe the new Mutator==

So that the new weapon mutator has a name and description: 

&lt;uscript&gt;
defaultproperties 
{ 
   FriendlyName=&quot;name in mutator list&quot; 
   Description=&quot;new weapon mutator description&quot; 
   bAddToServerpackages=True // Add this if you use this on a server.
}
&lt;/uscript&gt;

-VitalOverdose.-

==Discussion==

'''Geist:''' Yeah, that's better.  I took the liberty of adding the extra '''return false;''' at the end, and a section that supports WeaponLockers from UT2004 Onslaught mode.  Personally, I would have placed '''return false;''' lines where needed, then finish up the function with a '''return true;''', as that would make the logic make more sense... but that doesn't seem to be the style here (or at Epic, as seen in the other weapon mutator scripts).

Btw, I also realize that comments like &quot;if you're making a UT2004 mod&quot; might be redundant, since the top of the page ''seems'' to indicate this page is already UT2004-only.  So if this page is ''meant'' to be UT2004-specific through and through, please remove the extraneous UT2004 comments in the code/text and be more explicit at the top of the page. (how many times can I say &quot;UT2004&quot; in one paragraph?) :)

_'''FatalOverdose''' - thanks , will do that.

'''Sweavo:''' Shouldn't there be a call to NextMutator.CheckReplacement rather than a simple return...?

'''Wormbo:''' CheckReplacement should ''never'' call NextMutator.CheckReplacement(). The function is called by IsRelevant, which also handles the [[Legacy:Linked List|linked list]] stuff.

'''AgentBionicman''' I don't think projectiles are sent through this function anymore. Anyone else notice this?

'''Bonehed316:''' Projectiles arent sent through this function because they have bGameRelevant=True.  This function only works on those actors which are !bGameRelevant.  Maybe there should be a small section which explains how/why this function gets called, and where from?

'''Sweavo:''' seconded.  This page is hit number one for a search for CheckReplacement, but does not tell us what the '''out''' parameter bSuperRelevant does, nor what the return value means.

'''Neuroflare:''' None of the CheckReplacement tutorials I have seen here elaborate on changing out ammo, or am I mistaken?

'''MythOpus:''' I don't think you can change firemodes/ammo because they're set to only be able to be access by the class the references them.. in this case Weapon.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cheerleaders</title>
    <id>868</id>
    <revision>
      <id>2412</id>
      <timestamp>2004-10-10T09:32:34Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; Cheerleaders (Package: MultiBase)}}

Basic class for the Postal Babes for the winners in MP games.

==Properties ==

===Hidden ===
; sound CheerSound : Body-grinding moaning noises made by the Postal Babes

==Functions ==
; simulated function PlayCheer() : Plays celebration animations and sounds.
; simulated function name GetAnimCheer() : Returns a cheering animation to be used in PlayCheer().

==Known Subclasses ==
 [[Legacy:Cheerleaders|Cheerleaders]]
 +- CheerleadersBlue
 +- CheerleadersBlue2
 +- CheerleadersHot
 |  +- CheerleadersHotBlue
 |  +- CheerleadersHotBlue2
 |  +- CheerleadersHotRed
 |  +- CheerleadersHotRed2
 +- CheerleadersRed
 +- CheerleadersRed2

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2413</id>
      <timestamp>2004-05-27T22:44:00Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Cheerleaders|Cheerleaders]]}}

Basic class for the Postal Babes for the winners in MP games.

===Properties ===
; sound CheerSound : Body-grinding moaning noises made by the Postal Babes

===Functions ===
; simulated function PlayCheer() : Plays celebration animations and sounds.
; simulated function name GetAnimCheer() : Returns a cheering animation to be used in PlayCheer().

===Known Subclasses ===
 [[Legacy:Cheerleader|Cheerleader]]
 +- CheerleaderBlue
 +- CheerleaderBlue2
 +- CheerleaderHot
    +- CheerleaderHotBlue
    +- CheerleaderHotBlue2
    +- CheerleaderHotRed
    +- CheerleaderHotRed2
 +- CheerleaderRed
 +- CheerleaderRed2

===Related Topics ===

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2414</id>
      <timestamp>2004-05-28T04:32:04Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Cheerleaders|Cheerleaders]]}}

Basic class for the Postal Babes for the winners in MP games.

==Properties ==

===Hidden ===
; sound CheerSound : Body-grinding moaning noises made by the Postal Babes

==Functions ==
; simulated function PlayCheer() : Plays celebration animations and sounds.
; simulated function name GetAnimCheer() : Returns a cheering animation to be used in PlayCheer().

==Known Subclasses ==
 [[Legacy:Cheerleaders|Cheerleaders]]
 +- CheerleadersBlue
 +- CheerleadersBlue2
 +- CheerleadersHot
 |  +- CheerleadersHotBlue
 |  +- CheerleadersHotBlue2
 |  +- CheerleadersHotRed
 |  +- CheerleadersHotRed2
 +- CheerleadersRed
 +- CheerleadersRed2

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chemos</title>
    <id>775</id>
    <revision>
      <id>2207</id>
      <timestamp>2006-07-18T06:55:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] page.

'''Trystan:''' Heya Chemos and welcome aboard.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2208</id>
      <timestamp>2006-07-07T07:58:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] page.

'''Trystan:''' Heya Chemos and welcome aboard.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2209</id>
      <timestamp>2006-07-18T04:49:57Z</timestamp>
      <contributor>
        <ip>218.150.32.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.dirare.com'&gt;yellow pages main&lt;/a&gt; : [http://www.dirare.com business yellowpages] - [HTTP://www.dirare.com business yellowpages] : [international directory|http://www.dirare.com] - [international directory|HTTP://www.dirare.com] : http://www.dirare.com/India/ : [[http://www.dirare.com companies of the world]] : [[http://www.dirare.com | YP national]] : &quot;global directory&quot; http://www.dirare.com : [http://www.dirare.com|online directory] &lt;/u&gt;'''Wormbo:''' Welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] page.

'''Trystan:''' Heya Chemos and welcome aboard.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chemos/Developer Journal</title>
    <id>828</id>
    <revision>
      <id>2324</id>
      <timestamp>2003-12-22T02:54:38Z</timestamp>
      <contributor>
        <ip>208-59-121-105.c3-0.129-ubr3.lnh-129.md.cable.rcn.com</ip>
      </contributor>
      <comment>I'm back...</comment>
      <text xml:space="preserve">Ok.  I'm back.  I just got back home, and installed UT2k3 on my new alienware, and I am planning on making many small mods/mutators and generally getting back into the programming spin of things, because I haven't done that in a while.  

The first mod that I'm doing is a small idea I had, I'm planning on rebuiling the HUD to become more &quot;cartoony&quot; for lack of a better term, and then I'm going to attempt 3 mods to it.  

First of all, a popup inventory menu, selection system and general interface to go along with the new interface.  

Second of all, a system where one can gain information (detailed) about the opponents one faces when they look at one and press a button.  Just a couple of simple HUD mods, but we'll see how it goes...

Third of all, a map system similar to GTA 3, where the top-down view of the map is displayed on the radar, and your position tracks along with it.  I'm going to make some linear, flat pane maps to test this out on.  

With all these together, The HUD will look vaguely like a cross between Legend of Zelda:Orcarina of Time, and GTA3...  

*shrug*  Just updating because I haven't in ... 11 months?  Can that be right?</text>
    </revision>
    <revision>
      <id>2325</id>
      <timestamp>2003-08-05T09:46:09Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">Heh, Here we go.  

{{classbox|01/06/03}}

I thought I was a programmer for UT2k3, and indeed thats what I love to do, but lately I've put the UC aside, and taken a broader look at the game, and what I can do for it.  I have ventured into the valley of the mappers for the first time in my life, and its going badly.  I am not quite sure how to make a map, and although I have looked through every tutorial avalible, I'm not sure what I can produce.  I'm still gonna try, I have a couple of texs up, an idea, fleshed out and everything, and some brushes set up in the editor from hell.  I'll try to update as I get things going.  

{{classbox|01/07/03}}

Heh...  Wow how quickly things change.  My idea for a map was based in a solar power collections plant in space.  I had everything from the collection points to the batteries planned out.  Problem started when I took a break to play some old school Final Fantasy (the original).  Bingo.  FF3/6 was an amazing game.  What if I could create the same feel in a 3D app?  I would love to see the status screen, the aproximated cel-shading of characters, and so forth.  And, because RPG types are so common now, I could release my code open source, and make other modders lives much easier.  So here we go.  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FF3]]-ish mod has just officially opened for buisness.  (watch how quickly this dies...  :().

'''Chemos'''

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CheshireCat</title>
    <id>781</id>
    <revision>
      <id>2219</id>
      <timestamp>2003-02-15T05:29:00Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===about me ===

I'm also CheshireCat97 on Infogrames Forums, where I ask a ridiculous number of questions.  I'm very new to UnrealScript, and the degree to which my past programming experience (BASIC, FORTRAN, C, C++, perl, Python) applies to UnrealScript varies, so the syntax often confuses me.  Most of my programming is done in Python - I've used those other languages at one time, but most of them I haven't used recently.  For those who this sort of thing matters, I'm in my mid-twenties.  I don't think it does - one of my co-workers has a very different background than myself, is well over twice (close to thrice I think) my age, and has many of the same interests as myself.   Speaking of work, I work a rather odd job.  I have three days of 12.5 hours each, while I have to be there all of that time, the work is spread out pretty thinly, so there's a lot of time that I'm sitting there with a computer and not much to do.  This is when most of my coding gets done, and my Wiki writing.  The only real trouble is that for those 3 days, I don't have a lot of time to test code.  I also spend two of my four days off from that job at my other job, as a tech support rep for an ISP.

===projects ===

My current (only) UnrealScript project is TacticalDisplay, a mutator derived from Pfhoenix's Radar2003.  I've removed the fading blips, and added a more complex scheme of color coding and different icons to provide more information about objects on the radar display.  Currently, it uses different icons to indicate their relative location along the Z-axis, and colors to differentiate teammates from enemies, and display the status of teammates.  Along the way, I'm learning a lot (but not enough yet!) about replication.  I've also implemented a color edit dialog, which I'll release for general use shortly (TacticalDisplay uses it to let users select color schemes).  I've set up a small page for the mutator at  http://chshrcat.homelinux.net/.  Right now, the version online is pretty much current.  I can't think of anything that's really a &quot;must have&quot; feature, so maybe it's time to not add anything ;-).

===gaming ===

I'm actually not a very big FPS player.  I like RPGs, puzzle games, some racing games, and rail shooters (as long as they're Panzer Dragoon).  I'll probably be getting Panzer Dragoon Orta soon, it sounds like it's possibly at least as good as the Saturn games were.  Generally, I prefer games that are a bit different from the rest of their genre, or that don't really fit into a genre very easily.

===other things ===

I like to write programs to play with numbers - in particular, I will try to write a prime number generator in just about any language I learn.  My last one was in Python, and seemed fast enough, for an interpreted language.  I've also written a small script that's the start of a general-purpose text preprocessor with Python syntax, which is on the Wiki: [[Legacy:Templating In Python|Templating In Python]].

I'm also into anime.  Strangely, I like a large number of anime with mecha in them, but don't like mech anime in general.  I'm particularly fond of Lain and Ghost in the Shell, and I'll also watch almost anything that Yoko Kanno composes for, just to listen to her music.  There are also some less serious thing I like, such as Excel Saga, and others of the &quot;completely senseless wacky comedy&quot; genre.

===contact ===
;email:the_cheshire_cat@eml.cc
;AIM:ChshrCat97
;ICQ:13916223

===Guest Book ===

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.  You write prime number generators .. I write maze generators.

'''CheshireCat:''' Heheheh...  I've written a few of those as well, a very long time ago.  It's fun to write solvers to go with them, too :-)

'''Tarquin:''' Hello, welcome to the site :D 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2220</id>
      <timestamp>2003-02-06T11:22:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===about me ===

I'm also CheshireCat97 on Infogrames Forums, where I ask a ridiculous number of questions.  I'm very new to UnrealScript, and the degree to which my past programming experience (BASIC, FORTRAN, C, C++, perl, Python) applies to UnrealScript varies, so the syntax often confuses me.  Most of my programming is done in Python - I've used those other languages at one time, but most of them I haven't used recently.

===projects ===

My current (only) UnrealScript project is TacticalDisplay, a mutator derived from Pfhoenix's Radar2003.  I've removed the fading blips, and added a more complex scheme of color coding and different icons to provide more information about objects on the radar display.  Currently, it uses different icons to indicate their relative location along the Z-axis, and colors to differentiate teammates from enemies, and display the status of teammates.  Along the way, I'm learning a lot (but not enough yet!) about replication.  I've also implemented a color edit dialog, which I'll release for general use shortly (TacticalDisplay uses it to let users select color schemes).  I've set up a small page for the mutator [http://chshrcat.homelinux.net/ here].  The mutator is still a work in progress, and a lot of my latest development isn't reflected there (yet), but whatever I've put up there should work and have basic features.

===other things ===

I like to write programs to play with numbers - in particular, I will try to write a prime number generator in just about any language I learn.  My last one was in Python, and seemed fast enough, for an interpreted language.

===contact ===

I can be reached at [mailto:the_cheshire_cat@eml.cc the_cheshire_cat@eml.cc]

===Guest Book ===

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.  You write prime number generators .. I write maze generators.

'''CheshireCat:''' Heheheh...  I've written a few of those as well, a very long time ago.  It's fun to write solvers to go with them, too :-)

'''Tarquin:''' Hello, welcome to the site :D 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2221</id>
      <timestamp>2003-02-13T09:06:42Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===about me ===

I'm also CheshireCat97 on Infogrames Forums, where I ask a ridiculous number of questions.  I'm very new to UnrealScript, and the degree to which my past programming experience (BASIC, FORTRAN, C, C++, perl, Python) applies to UnrealScript varies, so the syntax often confuses me.  Most of my programming is done in Python - I've used those other languages at one time, but most of them I haven't used recently.

===projects ===

My current (only) UnrealScript project is TacticalDisplay, a mutator derived from Pfhoenix's Radar2003.  I've removed the fading blips, and added a more complex scheme of color coding and different icons to provide more information about objects on the radar display.  Currently, it uses different icons to indicate their relative location along the Z-axis, and colors to differentiate teammates from enemies, and display the status of teammates.  Along the way, I'm learning a lot (but not enough yet!) about replication.  I've also implemented a color edit dialog, which I'll release for general use shortly (TacticalDisplay uses it to let users select color schemes).  I've set up a small page for the mutator at  http://chshrcat.homelinux.net/.  Right now, the version online is pretty much current.  I can't think of anything that's really a &quot;must have&quot; feature, so maybe it's time to not add anything ;-).

===gaming ===

I'm actually not a very big FPS player.  I like RPGs, puzzle games, some racing games, and rail shooters (as long as they're Panzer Dragoon).  I'll probably be getting Panzer Dragoon Orta soon, it sounds like it's possibly at least as good as the Saturn games were.  Generally, I prefer games that are a bit different from the rest of their genre, or that don't really fit into a genre very easily.

===other things ===

I like to write programs to play with numbers - in particular, I will try to write a prime number generator in just about any language I learn.  My last one was in Python, and seemed fast enough, for an interpreted language.  I've also written a small script that's the start of a general-purpose text preprocessor with Python syntax, which is on the Wiki: [[Legacy:Templating In Python|Templating In Python]].

I'm also into anime.  Strangely, I like a large number of anime with mecha in them, but don't like mech anime in general.  I'm particularly fond of Lain and Ghost in the Shell, and I'll also watch almost anything that Yoko Kanno composes for, just to listen to her music.  There are also some less serious thing I like, such as Excel Saga, and others of the &quot;completely senseless wacky comedy&quot; genre.

===contact ===
;email:the_cheshire_cat@eml.cc
;AIM:ChshrCat97
;ICQ:13916223

===Guest Book ===

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.  You write prime number generators .. I write maze generators.

'''CheshireCat:''' Heheheh...  I've written a few of those as well, a very long time ago.  It's fun to write solvers to go with them, too :-)

'''Tarquin:''' Hello, welcome to the site :D 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CheshireCat/Developer Journal</title>
    <id>787</id>
    <revision>
      <id>2230</id>
      <timestamp>2003-08-05T09:46:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">{{innerbox|I liked Reconn's reverse-chronological journal - I have, shall we say, &quot;borrowed&quot; the idea.  Anyways, if anyone besides me actually reads this, umm, the current day is at the top.  The events of each day are in forward chronological order (not reversed) - call it an experiment, I think this will write and read pretty easily for me.  Generally a horizontal rule between paragraphs means that the second one was written some time later.  I realize some other DJ pages do this as well, Reconn's just happens to be the first one I saw.

}}

====comments ====

please use this area for comments :-)

'''Reconn:''' I'm guessing that when you say (for the bio-soaker) that the alt-fire will have a higher rate of fire, you meant higher as in greater, as in more distance between the shots, as in a slower rate of fire.  Or do I not understand the gameplay mechanic you're using?

'''CheshireCat:''' Sorry if that was unclear...  I meant faster.  The primary fire is a tight stream for doing heavy damage to one target, the alternate is going to produce more slime, but will spread more and have shorter range.

==current project: Bio-Soaker ==

===2/25/2003 ===

I've just added some screenshots for the BioSoaker project: http://mywebpages.comcast.net/cheshirecat97/slime.html.  I could really use some feedback on these, especially in the way of suggestions on fixing the visual effects of the first two.  I think a particle emitter is probably the best way to fix this...

===2/24/2003 ===

Scrapped the sprites, I'm now using the Bio-Rifle glob model with my own scripted behaviors.  I'm still not satisfied with the way the projectiles look when fired, but they interact with the world beautifully.  They stick to floors and walls and slowly spread out, and you get continuous damage while standing in them.  Globs that are close enough together also merge so that there aren't quite so many meshes (it fires a LOT of slime).  For some reason, the flying projectiles don't seem to be hurting players now, I will have to figure out what's wrong there.  Need to fix that, tweak the parameters for the slime physics, tweak the ammo and rate of fire for best gameplay...  and get some screenies up, the slime pools on the ground look nice :-)

===2/23/2003 ===

Some more work on physics, and also on visual effects...  the physics are pretty good, I'm not getting anywhere with visuals.  They look very eh.  I'll post some screenshots later...

===2/20/2003 ===

Some projectile behavior tweaking, which will need testing - they should now bounce off of each other, and all bounces should have a slight random factor to them, so that spraying one spot will cause the shots to spread and form a puddle (hopefully).

----

Something is not quite right with the way projectiles bounce/splash - it looks ''beautiful'' off of walls, but as soon as they hit anything level enough, they land and stick there, even though their Landed() assigns them a new velocity and resets their physics to falling.  Will have to dig around more to see how to implement this, don't really want to go Karma, since tons of Karma objects bumping each other will probably make most players' computers (definitely mine) melt.  Also, doesn't Karma need me to use a mesh for my projectiles?  That'd be a performance hit too...

===2/19/2003 ===

Anyone here familiar with the &quot;super soaker&quot; style of pressurized water gun?  Well, I'm working on a Bio-Rifle replacement that works sort of like that.  Primary fire will fire projectiles rapidly, with rather low damage per projectile.  Secondary fire will fire faster still, but will launch in a wider spread, making it a powerful short-range weapon, and capable of covering a wide area while retreating, but not very effective at long range.  So far, primary fire is implemented (both fires use it now).  The projectiles so far have very simple physics to let them bounce/splash off of walls, and are icky green sprites for now.  Eventually, I'm planning to have a particle emitter triggered while firing, and the projectiles will either be invisible or use the same texture as the particles.  The particles will hopefully provide a decent liquid effect, while the projectiles take care of actually dealing damage.

==previous project: TacticalDisplay ==

===2/19/2003 ===

TacticalDisplay is on hold, and in a state I would pretty much call finished for now :-)

===2/16/2003 ===

Problems solved, it seems.  I do one run over AllActors when the Interaction initializes, and make a list of the static Actors that are of interest.  I also save the array length...  then, to render a frame, I use DynamicActors to append relevant dynamic Actors to that array, and then use the same render loop I had before, looping through my array instead of DynamicActors.  When I get time, I'll look to see which of the tricks I've had to work out aren't documented, and write up pages for them.  Kinda think maybe there should be a &quot;recipes&quot; area, although some of the stuff under [[Legacy:Open Source|Open Source]] is kind of along those lines.  Have some feature ideas, not sure where I'm going next...  I'm thinking of working on a way to let people who join a server configure the mutator, maybe the interaction can catch a key and pop up the standard configuration.  In any case, it would be a great feature for the mod on servers, where client may connect who don't use it already - they could configure their own colors before joining the game.  Also thinking of allowing more advanced zoom control, where players could use a &quot;tdzoom&quot; command with a parameter to zoom to a specific multiplier, or to a specific range, or zoom in or out by a specific factor.  I'd probably still use the keybinding system I have now for it, so there wouldn't be an actual console command, but that doesn't really matter ;-)

===2/15/2003 ===

Hmm, this looks um, not good.  There are a bunch of ways I could get CTF flag bases to be visible, but I don't like any of them.  I could split rendering of each object out into a function, with whatever the performance cost of all those function calls would be, I can iterate over AllActors instead of DynamicActors, which will again not be great for performance...  I'm thinking maybe the best idea is to scan AllActors once, find the bases, and spawn a special actor there to mark them.

----

Screw this.  Every way I try to tackle this either looks ugly or makes me worry about performance.  I don't think I can decide how best to do this until I've done some testing to determine which way will work acceptably.  First shot will be timing AllActors vs. DynamicActors.

----

Thinking about using CollidingActors to pick up most of the things I need to detect.  Comments in Actor.uc say CollidingActors is &quot;much faster&quot; for Actors in &quot;reasonably small radii&quot;.  Highest allowed MaxDetectRange for the mute is 16000, which probably isn't &quot;reasonably small&quot;, so I'll need to test if this is indeed faster at these sizes.  Bonus is it seems that it will find static or dynamic Actors as long as their bCollideActors==True.  Of the objects I'm looking for, this will work for:
* Pawn
* Projectile
* GreedCoinPickup
* GreedDropPoint
* xBombFlag
* xBombDelivery (instead of dynamic xBombDeliveryHole I watched before)
* xDomPoint (instead of dynamic DomLetter I watched before)
* CTFBase

Hey, perfect - that's everything ;-)  Catch is I need to know about players who have flags regardless of radius, I'll use the level pawnlist for this, I'll just make a list of carried flags before I do the CollidingActors loop.  Looks like something like this can very easily fit into my current code - if this works I'll be quite happy.  Ooooooh, Grand Funk on radio, can't code now ;-)

----

Hrm.  Lists page says pawn list isn't visible serverside, so I'd need to use DynamicActors anyways for that.  And that VisibleCollidingActors is slow for radius&gt;900, so I'd imagine CollidingActors is as well.  So maybe I'm back to the mess I had before...

===2/14/2003 ===

First wider public release == first bug report.  Apparently the display never goes away, even if you start another game without the mutator.  Oops, never tried removing the mute, or I would have caught this one.  Apparently none of my friends who test have removed it, either.  Added NotifyLevelChange to remove the interaction.  Also added support for Greed (show coins and drop points), DXT compressed textures, rewrote build scripts - there are now source-stripped binary packages, nice and small, and separate source packages.  Between source stripping and DXT textures, the .u is down from ~300K to ~60K.

----

Fix works, Greed support works, time for bed now.

----

Optimizing (I hope) some of my tests.  Mostly sorting all the type checks based on my guesses at the likelihood of finding such objects, and putting the range check at the very end, under the assumption (hopefully correct) that computing VSize costs more than all of those type checks.  Working on BR Goal and Dom Point display, that and flag bases and I'll have support for pretty much every gametype I ever play ;-)

===2/13/2003 ===

Well, I'm pretty sure that, if not buggy, the code I've just written will work.  I'm not 100% sure on structs and arrays of structs in UScript, so it's slightly iffy ;-)  It compiles, at least, which is a start.  I made a struct to store the relevant information about a flag/ball, and I maintain an array of those.  When I'm scanning for objects to display, if I find a ball or flag, if it is not in the array, I add its information to the array instead of drawing it immediately.  If I find a Pawn, I check its PRI.HasFlag.  When I get the flag from a Pawn, however, I don't ignore it if its already in the array - I just update its coordinates to match those of th Pawn carrying it.  There's also a check before the rest of the logic to mark an object carried by the player so that it will not be drawn.  Since I wrote this one from work, it'll have to wait until I get home to test, but I think this should do the trick.

----

Wow, UScript is very anal about the Length property of dynamic arrays.  It's writable, all right, but doesn't seem to like being set with ++ or += operators.  Once I got that out of the way, though, it seems to work fine.  Flags and balls still lag a bit in net games right after they're picked up, and I'm not sure that that can be fixed, but as soon as the carrier's PRI updates and shows that he's carrying, the flag icon locks right on top of the player icon.

===2/12/2003 ===

I now show bombing run ball and CTF flags!  I think this is pretty much as much as this will ever do...  the only other thing I may do is alter it to draw the ball/flag icon on top of the carrying player when carried, instead of detecting the ball/flag as a separate item, since the lower netpriority of the flags can make their icons lag behind the carrier a bit.  Heh, pulled out hair for a bit because I put the test to draw the new icon for flags inside the big &quot;these objects are the only important things&quot; test.  Question, if anyone knows:  since RadiusActors traverses all Actors, which would be faster, using RadiusActors, or using DynamicActors and checking radius myself?  Anyways, also did some UI cleanup and beautification, and I'll repackage as soon as I've updated the ReadMe ;-)

----

After more playtesting, it looks like I'll have to definitely do separate carried-flag vs loose-flag tracking, the flag just doesn't follow its carrier nicely at all on the display.  Also, it seems that when you pick up the flag or ball, it remains on the display wherever you picked it up.  Best best is probably to make an array to stuff flag-or-ball objects into, and if I find both a player with attached flag, and a flag, use the player's position to draw the icon for that object (after finished scanning through everything).  I'll probably try to arrange it so that if you player is carrying, they won't see the flag/ball icon at all - it would just sit still in the middle of the radar display anyways, and you'd have to be pretty confused to not know whether or not you were carrying ;-)

===2/9/2003 ===

Bleh, woke up at 5ish this morning, after going to bed at 1ish this morning, and couldn't sleep.  This should be an interesting day, good thing work on Sunday is slow.  Anyways...  being up, I decided to try some test code for something I've been thinking about.  I was thinking it would be a neat option effect if Redeemer blasts caused an EMP effect that temporarily disabled the radar display, and would be even more neat if the display showed static until it came back up.  Figuring that generating random noise in my script would be a bad, bad thing, I made up 5 different random static textures, and hacked in code to overlay a random selection of 2 of them on the display each frame.  Looks like crap, it seems like I end up with the same final texture for most frames.  I think maybe I need more noise textures, or else Rand is biased, which I hope isn't the case.  The textures are 256x256, I'm not sure just how many I should add for an effect that's really just eye candy anyways - I don't want to make this mutator unusable on slower machines ;-)  With any luck, I'm crashing after work, so maybe I'll mess with it more tomorrow.  Oh, and here's the new KeyEvent I coded yesterday, which seems to work decently:

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{

	local string tmp;

	if(Action == IST_Release &amp;&amp; Zooming !=0 &amp;&amp; Key == LastKey)
	{
		LastKey=-1;
		Zooming=0;
		return True;
	} else if (Action == IST_Press) {
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
		if (tmp == &quot;tdzoomin&quot;)
		{
			LastKey = Key;
			Zooming = -1;
			return True;
		} else if (tmp ~= &quot;tdzoomout&quot;) {
			LastKey = Key;
			zooming = 1;
			return True;
		}
	}
	return False;
}
&lt;/uscript&gt;

So now, I keep track of the last relevant keydown I had.  If the same key goes back up, I stop the current zoom.  A new keydown that is captured will replace the old zoom with a new one, and save the new key value.  The only catch I've found so far is that if you his ESC while zooming, KeyEvent never catches the keyup, and the zoom will probably go all the way in or out before you get back to the game.  Hitting any zoom key will clear the stuck condition though, so it's a minor nuisance at worst.

Also this morning: moved my ReadMe and .int into my Subversion repository, and rewrote my packaging script to insert the current svn revision into them - now the version listed in the ReadMe and in the mutator menu actually matches the version you get.

----

Sweet - I just talked to Goldenfire, he never did try the debugging build I gave him for his weird zooming issue, but the newest release build, r15, &quot;just works&quot;.

===2/8/2003 ===

Heheheh, that was an adventure.  I found the page on [[Legacy:SpawnNotify|SpawnNotify]], and it seemed like a perfect way to get out of using a DynamicActors iterator every frame - each UT instance could have a SpawnNotify that traps all spawns and maintains a list of only Actors that are important to the mutator (currently Pawns and Projectiles).  Spent half an hour coding it, oops, try to build and that's when I find out this class is gone in UT2k3.  I guess for now I'm stuck with DynamicActors, but on the bright side, the &quot;new&quot; code was in things I haven't modified in a while, and I noticed some things I can fix while I'm in there - two chunks of dead code, one just dead, one quite harmful (causing very bizarre display of projectiles on TacticalDisplay).

I was also hoping that the Delta passed to KeyEvent was the time since the last KeyEvent, and that KeyEvent would get repeated calls while a key was held (there's an action IST_Hold, after all), but this seems to not be the case - some logging code shows one even at keydown, one at keyup, and Delta values which I haven't a clue about (all seemed to be negative integer values).

I also did some testing of StopWatch, supposedly for script timing, hoping that it would let me figure out if an idea I had was &quot;too slow&quot; to use, but it looks like I'll have to just put it in and try to &quot;feel out&quot; the speed impact - see StopWatch on the [[Legacy:Global Function|Global Function]] page for my findings.  Anyways, the idea I'm thinking of is to check on KeyDown, by using ConsoleCommand calls, if the pressed key is currently bound to one of the 2 aliases my Interaction looks for.  This would mean that changes to control configuration are instant, but I don't know what the speed cost might be.  If ConsoleCommand executes reasonably quickly, probably acceptable.  Testing time now :-)

----

That worked out pretty well, the two calls to ConsoleCommand in my KeyEvent handler don't seem to cause any game slowdown or noticeable delay in key handling.

===2/7/2003 ===

Wow.  The word I usually use to describe situations like this is &quot;blecherous&quot;.  The Input tab, as far as I can tell, doesn't load your key bindings from the defaults of some class stored in a .ini, like many other configurable options.  It loops over integers 0-254, and calls PlayerOwner.ConsoleCommand to execute &lt;nowiki&gt;&quot;keyname &lt;i&gt;&quot;, &quot;localizedkeyname &lt;i&gt;&quot;, and &quot;keybinding &lt;keyname&gt;&quot;&lt;/nowiki&gt; for each.  For each key it finds that has an alias, it loops over its list of bindable commands to find one with that alias.  My GUIUserKeyBinding subclass never gets any properties changed and stored in a .ini, so it looks like the only way to do this is to do the same thing.  I'll assign an alias that won't be in use in the GUIUserKeyBinding, and have my Interaction look for the key bound to that command.  Only problems I see here are the nonexistent alias causing trouble (I don't '''think''' it will), and the Interaction not knowing when its key bindings have been changed.  I guess I can expect such troubles when doing things I'm not supposed to ;-)

----

Well, it works.  I still haven't found a way for the Interaction to be notified when bindings change, so what I'm doing for now is to scan for keybindings when the object is created and on level changes.

----

Urk!  One of my friends/playtest victims just got a chance to try the new version, and says the zoom feature is massively broken.  Same game (Instant Action) I last tested it with.  Will debug when I get home, this should be fun...

===2/6/2003 ===

I'm currently messing with key bindings, and finding it surprisingly difficult to make them do what I want.  It's very easy to use the GUIUserKeyBinding class so alias a key to something, but if your mod is a Mutator, and mainly works client-side, it's hard to do much with that.  Exec functions don't work in many places (including Interactions), so you can't easily create new commands to alias to, unless things like PlayerInput or PlayerController, which doesn't really seem good for a little Mutator to grab two keys.

I'm getting user key input now via keys bound to mutate commands, but this isn't good on network.  The Mutate function gets called on the server, which has to pass the data back (via an Inventory item) to modify the client-side Interaction.  My new plan, if I can figure out a way, is to &quot;find&quot; the custom key bindings, and trap the keys they are bound to in the Interaction via KeyEvent.  This would also be better, because I can set flags in the Interaction as to whether the keys are being held, and zoom smoothly and continuously in or out while a key is held.  My other option would be to dig through the Input tab code, and figure out how to add a similar key binding GUI to my Mutator config.

===before I started a journal... ===

I spent about two or three weeks working on a mutator before I started this journal.  Probably the most useful thing I learned during that time was that Inventory objects are your friends, when you want to modify client-side objects from a Mutator.  Just create a subclass of Inventory, and give it to everyone in a ModifyPlayer in your Mutator.  A virtual function in your Inventory subclass can modify its owner, add Interactions to the player (which is what I'm using it for), and all sorts of other things that are difficult to accomplish from within a Mutator class.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2231</id>
      <timestamp>2003-02-25T19:21:03Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <comment>screenshots added</comment>
      <text xml:space="preserve">{{innerbox|I liked Reconn's reverse-chronological journal - I have, shall we say, &quot;borrowed&quot; the idea.  Anyways, if anyone besides me actually reads this, umm, the current day is at the top.  The events of each day are in forward chronological order (not reversed) - call it an experiment, I think this will write and read pretty easily for me.  Generally a horizontal rule between paragraphs means that the second one was written some time later.  I realize some other DJ pages do this as well, Reconn's just happens to be the first one I saw.

}}

====comments ====

please use this area for comments :-)

'''Reconn:''' I'm guessing that when you say (for the bio-soaker) that the alt-fire will have a higher rate of fire, you meant higher as in greater, as in more distance between the shots, as in a slower rate of fire.  Or do I not understand the gameplay mechanic you're using?

'''CheshireCat:''' Sorry if that was unclear...  I meant faster.  The primary fire is a tight stream for doing heavy damage to one target, the alternate is going to produce more slime, but will spread more and have shorter range.

==current project: Bio-Soaker ==

===2/25/2003 ===

I've just added some screenshots for the BioSoaker project: [[Legacy:CheshireCat/Screenshots|CheshireCat/Screenshots]].  I could really use some feedback on these, especially in the way of suggestions on fixing the visual effects of the first two.  I think a particle emitter is probably the best way to fix this...

===2/24/2003 ===

Scrapped the sprites, I'm now using the Bio-Rifle glob model with my own scripted behaviors.  I'm still not satisfied with the way the projectiles look when fired, but they interact with the world beautifully.  They stick to floors and walls and slowly spread out, and you get continuous damage while standing in them.  Globs that are close enough together also merge so that there aren't quite so many meshes (it fires a LOT of slime).  For some reason, the flying projectiles don't seem to be hurting players now, I will have to figure out what's wrong there.  Need to fix that, tweak the parameters for the slime physics, tweak the ammo and rate of fire for best gameplay...  and get some screenies up, the slime pools on the ground look nice :-)

===2/23/2003 ===

Some more work on physics, and also on visual effects...  the physics are pretty good, I'm not getting anywhere with visuals.  They look very eh.  I'll post some screenshots later...

===2/20/2003 ===

Some projectile behavior tweaking, which will need testing - they should now bounce off of each other, and all bounces should have a slight random factor to them, so that spraying one spot will cause the shots to spread and form a puddle (hopefully).

----

Something is not quite right with the way projectiles bounce/splash - it looks ''beautiful'' off of walls, but as soon as they hit anything level enough, they land and stick there, even though their Landed() assigns them a new velocity and resets their physics to falling.  Will have to dig around more to see how to implement this, don't really want to go Karma, since tons of Karma objects bumping each other will probably make most players' computers (definitely mine) melt.  Also, doesn't Karma need me to use a mesh for my projectiles?  That'd be a performance hit too...

===2/19/2003 ===

Anyone here familiar with the &quot;super soaker&quot; style of pressurized water gun?  Well, I'm working on a Bio-Rifle replacement that works sort of like that.  Primary fire will fire projectiles rapidly, with rather low damage per projectile.  Secondary fire will fire faster still, but will launch in a wider spread, making it a powerful short-range weapon, and capable of covering a wide area while retreating, but not very effective at long range.  So far, primary fire is implemented (both fires use it now).  The projectiles so far have very simple physics to let them bounce/splash off of walls, and are icky green sprites for now.  Eventually, I'm planning to have a particle emitter triggered while firing, and the projectiles will either be invisible or use the same texture as the particles.  The particles will hopefully provide a decent liquid effect, while the projectiles take care of actually dealing damage.

==previous project: TacticalDisplay ==

===2/19/2003 ===

TacticalDisplay is on hold, and in a state I would pretty much call finished for now :-)

===2/16/2003 ===

Problems solved, it seems.  I do one run over AllActors when the Interaction initializes, and make a list of the static Actors that are of interest.  I also save the array length...  then, to render a frame, I use DynamicActors to append relevant dynamic Actors to that array, and then use the same render loop I had before, looping through my array instead of DynamicActors.  When I get time, I'll look to see which of the tricks I've had to work out aren't documented, and write up pages for them.  Kinda think maybe there should be a &quot;recipes&quot; area, although some of the stuff under [[Legacy:Open Source|Open Source]] is kind of along those lines.  Have some feature ideas, not sure where I'm going next...  I'm thinking of working on a way to let people who join a server configure the mutator, maybe the interaction can catch a key and pop up the standard configuration.  In any case, it would be a great feature for the mod on servers, where client may connect who don't use it already - they could configure their own colors before joining the game.  Also thinking of allowing more advanced zoom control, where players could use a &quot;tdzoom&quot; command with a parameter to zoom to a specific multiplier, or to a specific range, or zoom in or out by a specific factor.  I'd probably still use the keybinding system I have now for it, so there wouldn't be an actual console command, but that doesn't really matter ;-)

===2/15/2003 ===

Hmm, this looks um, not good.  There are a bunch of ways I could get CTF flag bases to be visible, but I don't like any of them.  I could split rendering of each object out into a function, with whatever the performance cost of all those function calls would be, I can iterate over AllActors instead of DynamicActors, which will again not be great for performance...  I'm thinking maybe the best idea is to scan AllActors once, find the bases, and spawn a special actor there to mark them.

----

Screw this.  Every way I try to tackle this either looks ugly or makes me worry about performance.  I don't think I can decide how best to do this until I've done some testing to determine which way will work acceptably.  First shot will be timing AllActors vs. DynamicActors.

----

Thinking about using CollidingActors to pick up most of the things I need to detect.  Comments in Actor.uc say CollidingActors is &quot;much faster&quot; for Actors in &quot;reasonably small radii&quot;.  Highest allowed MaxDetectRange for the mute is 16000, which probably isn't &quot;reasonably small&quot;, so I'll need to test if this is indeed faster at these sizes.  Bonus is it seems that it will find static or dynamic Actors as long as their bCollideActors==True.  Of the objects I'm looking for, this will work for:
* Pawn
* Projectile
* GreedCoinPickup
* GreedDropPoint
* xBombFlag
* xBombDelivery (instead of dynamic xBombDeliveryHole I watched before)
* xDomPoint (instead of dynamic DomLetter I watched before)
* CTFBase

Hey, perfect - that's everything ;-)  Catch is I need to know about players who have flags regardless of radius, I'll use the level pawnlist for this, I'll just make a list of carried flags before I do the CollidingActors loop.  Looks like something like this can very easily fit into my current code - if this works I'll be quite happy.  Ooooooh, Grand Funk on radio, can't code now ;-)

----

Hrm.  Lists page says pawn list isn't visible serverside, so I'd need to use DynamicActors anyways for that.  And that VisibleCollidingActors is slow for radius&gt;900, so I'd imagine CollidingActors is as well.  So maybe I'm back to the mess I had before...

===2/14/2003 ===

First wider public release == first bug report.  Apparently the display never goes away, even if you start another game without the mutator.  Oops, never tried removing the mute, or I would have caught this one.  Apparently none of my friends who test have removed it, either.  Added NotifyLevelChange to remove the interaction.  Also added support for Greed (show coins and drop points), DXT compressed textures, rewrote build scripts - there are now source-stripped binary packages, nice and small, and separate source packages.  Between source stripping and DXT textures, the .u is down from ~300K to ~60K.

----

Fix works, Greed support works, time for bed now.

----

Optimizing (I hope) some of my tests.  Mostly sorting all the type checks based on my guesses at the likelihood of finding such objects, and putting the range check at the very end, under the assumption (hopefully correct) that computing VSize costs more than all of those type checks.  Working on BR Goal and Dom Point display, that and flag bases and I'll have support for pretty much every gametype I ever play ;-)

===2/13/2003 ===

Well, I'm pretty sure that, if not buggy, the code I've just written will work.  I'm not 100% sure on structs and arrays of structs in UScript, so it's slightly iffy ;-)  It compiles, at least, which is a start.  I made a struct to store the relevant information about a flag/ball, and I maintain an array of those.  When I'm scanning for objects to display, if I find a ball or flag, if it is not in the array, I add its information to the array instead of drawing it immediately.  If I find a Pawn, I check its PRI.HasFlag.  When I get the flag from a Pawn, however, I don't ignore it if its already in the array - I just update its coordinates to match those of th Pawn carrying it.  There's also a check before the rest of the logic to mark an object carried by the player so that it will not be drawn.  Since I wrote this one from work, it'll have to wait until I get home to test, but I think this should do the trick.

----

Wow, UScript is very anal about the Length property of dynamic arrays.  It's writable, all right, but doesn't seem to like being set with ++ or += operators.  Once I got that out of the way, though, it seems to work fine.  Flags and balls still lag a bit in net games right after they're picked up, and I'm not sure that that can be fixed, but as soon as the carrier's PRI updates and shows that he's carrying, the flag icon locks right on top of the player icon.

===2/12/2003 ===

I now show bombing run ball and CTF flags!  I think this is pretty much as much as this will ever do...  the only other thing I may do is alter it to draw the ball/flag icon on top of the carrying player when carried, instead of detecting the ball/flag as a separate item, since the lower netpriority of the flags can make their icons lag behind the carrier a bit.  Heh, pulled out hair for a bit because I put the test to draw the new icon for flags inside the big &quot;these objects are the only important things&quot; test.  Question, if anyone knows:  since RadiusActors traverses all Actors, which would be faster, using RadiusActors, or using DynamicActors and checking radius myself?  Anyways, also did some UI cleanup and beautification, and I'll repackage as soon as I've updated the ReadMe ;-)

----

After more playtesting, it looks like I'll have to definitely do separate carried-flag vs loose-flag tracking, the flag just doesn't follow its carrier nicely at all on the display.  Also, it seems that when you pick up the flag or ball, it remains on the display wherever you picked it up.  Best best is probably to make an array to stuff flag-or-ball objects into, and if I find both a player with attached flag, and a flag, use the player's position to draw the icon for that object (after finished scanning through everything).  I'll probably try to arrange it so that if you player is carrying, they won't see the flag/ball icon at all - it would just sit still in the middle of the radar display anyways, and you'd have to be pretty confused to not know whether or not you were carrying ;-)

===2/9/2003 ===

Bleh, woke up at 5ish this morning, after going to bed at 1ish this morning, and couldn't sleep.  This should be an interesting day, good thing work on Sunday is slow.  Anyways...  being up, I decided to try some test code for something I've been thinking about.  I was thinking it would be a neat option effect if Redeemer blasts caused an EMP effect that temporarily disabled the radar display, and would be even more neat if the display showed static until it came back up.  Figuring that generating random noise in my script would be a bad, bad thing, I made up 5 different random static textures, and hacked in code to overlay a random selection of 2 of them on the display each frame.  Looks like crap, it seems like I end up with the same final texture for most frames.  I think maybe I need more noise textures, or else Rand is biased, which I hope isn't the case.  The textures are 256x256, I'm not sure just how many I should add for an effect that's really just eye candy anyways - I don't want to make this mutator unusable on slower machines ;-)  With any luck, I'm crashing after work, so maybe I'll mess with it more tomorrow.  Oh, and here's the new KeyEvent I coded yesterday, which seems to work decently:

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{

	local string tmp;

	if(Action == IST_Release &amp;&amp; Zooming !=0 &amp;&amp; Key == LastKey)
	{
		LastKey=-1;
		Zooming=0;
		return True;
	} else if (Action == IST_Press) {
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
		if (tmp == &quot;tdzoomin&quot;)
		{
			LastKey = Key;
			Zooming = -1;
			return True;
		} else if (tmp ~= &quot;tdzoomout&quot;) {
			LastKey = Key;
			zooming = 1;
			return True;
		}
	}
	return False;
}
&lt;/uscript&gt;

So now, I keep track of the last relevant keydown I had.  If the same key goes back up, I stop the current zoom.  A new keydown that is captured will replace the old zoom with a new one, and save the new key value.  The only catch I've found so far is that if you his ESC while zooming, KeyEvent never catches the keyup, and the zoom will probably go all the way in or out before you get back to the game.  Hitting any zoom key will clear the stuck condition though, so it's a minor nuisance at worst.

Also this morning: moved my ReadMe and .int into my Subversion repository, and rewrote my packaging script to insert the current svn revision into them - now the version listed in the ReadMe and in the mutator menu actually matches the version you get.

----

Sweet - I just talked to Goldenfire, he never did try the debugging build I gave him for his weird zooming issue, but the newest release build, r15, &quot;just works&quot;.

===2/8/2003 ===

Heheheh, that was an adventure.  I found the page on [[Legacy:SpawnNotify|SpawnNotify]], and it seemed like a perfect way to get out of using a DynamicActors iterator every frame - each UT instance could have a SpawnNotify that traps all spawns and maintains a list of only Actors that are important to the mutator (currently Pawns and Projectiles).  Spent half an hour coding it, oops, try to build and that's when I find out this class is gone in UT2k3.  I guess for now I'm stuck with DynamicActors, but on the bright side, the &quot;new&quot; code was in things I haven't modified in a while, and I noticed some things I can fix while I'm in there - two chunks of dead code, one just dead, one quite harmful (causing very bizarre display of projectiles on TacticalDisplay).

I was also hoping that the Delta passed to KeyEvent was the time since the last KeyEvent, and that KeyEvent would get repeated calls while a key was held (there's an action IST_Hold, after all), but this seems to not be the case - some logging code shows one even at keydown, one at keyup, and Delta values which I haven't a clue about (all seemed to be negative integer values).

I also did some testing of StopWatch, supposedly for script timing, hoping that it would let me figure out if an idea I had was &quot;too slow&quot; to use, but it looks like I'll have to just put it in and try to &quot;feel out&quot; the speed impact - see StopWatch on the [[Legacy:Global Function|Global Function]] page for my findings.  Anyways, the idea I'm thinking of is to check on KeyDown, by using ConsoleCommand calls, if the pressed key is currently bound to one of the 2 aliases my Interaction looks for.  This would mean that changes to control configuration are instant, but I don't know what the speed cost might be.  If ConsoleCommand executes reasonably quickly, probably acceptable.  Testing time now :-)

----

That worked out pretty well, the two calls to ConsoleCommand in my KeyEvent handler don't seem to cause any game slowdown or noticeable delay in key handling.

===2/7/2003 ===

Wow.  The word I usually use to describe situations like this is &quot;blecherous&quot;.  The Input tab, as far as I can tell, doesn't load your key bindings from the defaults of some class stored in a .ini, like many other configurable options.  It loops over integers 0-254, and calls PlayerOwner.ConsoleCommand to execute &lt;nowiki&gt;&quot;keyname &lt;i&gt;&quot;, &quot;localizedkeyname &lt;i&gt;&quot;, and &quot;keybinding &lt;keyname&gt;&quot;&lt;/nowiki&gt; for each.  For each key it finds that has an alias, it loops over its list of bindable commands to find one with that alias.  My GUIUserKeyBinding subclass never gets any properties changed and stored in a .ini, so it looks like the only way to do this is to do the same thing.  I'll assign an alias that won't be in use in the GUIUserKeyBinding, and have my Interaction look for the key bound to that command.  Only problems I see here are the nonexistent alias causing trouble (I don't '''think''' it will), and the Interaction not knowing when its key bindings have been changed.  I guess I can expect such troubles when doing things I'm not supposed to ;-)

----

Well, it works.  I still haven't found a way for the Interaction to be notified when bindings change, so what I'm doing for now is to scan for keybindings when the object is created and on level changes.

----

Urk!  One of my friends/playtest victims just got a chance to try the new version, and says the zoom feature is massively broken.  Same game (Instant Action) I last tested it with.  Will debug when I get home, this should be fun...

===2/6/2003 ===

I'm currently messing with key bindings, and finding it surprisingly difficult to make them do what I want.  It's very easy to use the GUIUserKeyBinding class so alias a key to something, but if your mod is a Mutator, and mainly works client-side, it's hard to do much with that.  Exec functions don't work in many places (including Interactions), so you can't easily create new commands to alias to, unless things like PlayerInput or PlayerController, which doesn't really seem good for a little Mutator to grab two keys.

I'm getting user key input now via keys bound to mutate commands, but this isn't good on network.  The Mutate function gets called on the server, which has to pass the data back (via an Inventory item) to modify the client-side Interaction.  My new plan, if I can figure out a way, is to &quot;find&quot; the custom key bindings, and trap the keys they are bound to in the Interaction via KeyEvent.  This would also be better, because I can set flags in the Interaction as to whether the keys are being held, and zoom smoothly and continuously in or out while a key is held.  My other option would be to dig through the Input tab code, and figure out how to add a similar key binding GUI to my Mutator config.

===before I started a journal... ===

I spent about two or three weeks working on a mutator before I started this journal.  Probably the most useful thing I learned during that time was that Inventory objects are your friends, when you want to modify client-side objects from a Mutator.  Just create a subclass of Inventory, and give it to everyone in a ModifyPlayer in your Mutator.  A virtual function in your Inventory subclass can modify its owner, add Interactions to the player (which is what I'm using it for), and all sorts of other things that are difficult to accomplish from within a Mutator class.</text>
    </revision>
    <revision>
      <id>2232</id>
      <timestamp>2003-02-27T03:04:51Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <comment>moved screenshots offsite</comment>
      <text xml:space="preserve">{{innerbox|I liked Reconn's reverse-chronological journal - I have, shall we say, &quot;borrowed&quot; the idea.  Anyways, if anyone besides me actually reads this, umm, the current day is at the top.  The events of each day are in forward chronological order (not reversed) - call it an experiment, I think this will write and read pretty easily for me.  Generally a horizontal rule between paragraphs means that the second one was written some time later.  I realize some other DJ pages do this as well, Reconn's just happens to be the first one I saw.

}}

====comments ====

please use this area for comments :-)

'''Reconn:''' I'm guessing that when you say (for the bio-soaker) that the alt-fire will have a higher rate of fire, you meant higher as in greater, as in more distance between the shots, as in a slower rate of fire.  Or do I not understand the gameplay mechanic you're using?

'''CheshireCat:''' Sorry if that was unclear...  I meant faster.  The primary fire is a tight stream for doing heavy damage to one target, the alternate is going to produce more slime, but will spread more and have shorter range.

==current project: Bio-Soaker ==

===2/25/2003 ===

I've just added some screenshots for the BioSoaker project: http://mywebpages.comcast.net/cheshirecat97/slime.html.  I could really use some feedback on these, especially in the way of suggestions on fixing the visual effects of the first two.  I think a particle emitter is probably the best way to fix this...

===2/24/2003 ===

Scrapped the sprites, I'm now using the Bio-Rifle glob model with my own scripted behaviors.  I'm still not satisfied with the way the projectiles look when fired, but they interact with the world beautifully.  They stick to floors and walls and slowly spread out, and you get continuous damage while standing in them.  Globs that are close enough together also merge so that there aren't quite so many meshes (it fires a LOT of slime).  For some reason, the flying projectiles don't seem to be hurting players now, I will have to figure out what's wrong there.  Need to fix that, tweak the parameters for the slime physics, tweak the ammo and rate of fire for best gameplay...  and get some screenies up, the slime pools on the ground look nice :-)

===2/23/2003 ===

Some more work on physics, and also on visual effects...  the physics are pretty good, I'm not getting anywhere with visuals.  They look very eh.  I'll post some screenshots later...

===2/20/2003 ===

Some projectile behavior tweaking, which will need testing - they should now bounce off of each other, and all bounces should have a slight random factor to them, so that spraying one spot will cause the shots to spread and form a puddle (hopefully).

----

Something is not quite right with the way projectiles bounce/splash - it looks ''beautiful'' off of walls, but as soon as they hit anything level enough, they land and stick there, even though their Landed() assigns them a new velocity and resets their physics to falling.  Will have to dig around more to see how to implement this, don't really want to go Karma, since tons of Karma objects bumping each other will probably make most players' computers (definitely mine) melt.  Also, doesn't Karma need me to use a mesh for my projectiles?  That'd be a performance hit too...

===2/19/2003 ===

Anyone here familiar with the &quot;super soaker&quot; style of pressurized water gun?  Well, I'm working on a Bio-Rifle replacement that works sort of like that.  Primary fire will fire projectiles rapidly, with rather low damage per projectile.  Secondary fire will fire faster still, but will launch in a wider spread, making it a powerful short-range weapon, and capable of covering a wide area while retreating, but not very effective at long range.  So far, primary fire is implemented (both fires use it now).  The projectiles so far have very simple physics to let them bounce/splash off of walls, and are icky green sprites for now.  Eventually, I'm planning to have a particle emitter triggered while firing, and the projectiles will either be invisible or use the same texture as the particles.  The particles will hopefully provide a decent liquid effect, while the projectiles take care of actually dealing damage.

==previous project: TacticalDisplay ==

===2/19/2003 ===

TacticalDisplay is on hold, and in a state I would pretty much call finished for now :-)

===2/16/2003 ===

Problems solved, it seems.  I do one run over AllActors when the Interaction initializes, and make a list of the static Actors that are of interest.  I also save the array length...  then, to render a frame, I use DynamicActors to append relevant dynamic Actors to that array, and then use the same render loop I had before, looping through my array instead of DynamicActors.  When I get time, I'll look to see which of the tricks I've had to work out aren't documented, and write up pages for them.  Kinda think maybe there should be a &quot;recipes&quot; area, although some of the stuff under [[Legacy:Open Source|Open Source]] is kind of along those lines.  Have some feature ideas, not sure where I'm going next...  I'm thinking of working on a way to let people who join a server configure the mutator, maybe the interaction can catch a key and pop up the standard configuration.  In any case, it would be a great feature for the mod on servers, where client may connect who don't use it already - they could configure their own colors before joining the game.  Also thinking of allowing more advanced zoom control, where players could use a &quot;tdzoom&quot; command with a parameter to zoom to a specific multiplier, or to a specific range, or zoom in or out by a specific factor.  I'd probably still use the keybinding system I have now for it, so there wouldn't be an actual console command, but that doesn't really matter ;-)

===2/15/2003 ===

Hmm, this looks um, not good.  There are a bunch of ways I could get CTF flag bases to be visible, but I don't like any of them.  I could split rendering of each object out into a function, with whatever the performance cost of all those function calls would be, I can iterate over AllActors instead of DynamicActors, which will again not be great for performance...  I'm thinking maybe the best idea is to scan AllActors once, find the bases, and spawn a special actor there to mark them.

----

Screw this.  Every way I try to tackle this either looks ugly or makes me worry about performance.  I don't think I can decide how best to do this until I've done some testing to determine which way will work acceptably.  First shot will be timing AllActors vs. DynamicActors.

----

Thinking about using CollidingActors to pick up most of the things I need to detect.  Comments in Actor.uc say CollidingActors is &quot;much faster&quot; for Actors in &quot;reasonably small radii&quot;.  Highest allowed MaxDetectRange for the mute is 16000, which probably isn't &quot;reasonably small&quot;, so I'll need to test if this is indeed faster at these sizes.  Bonus is it seems that it will find static or dynamic Actors as long as their bCollideActors==True.  Of the objects I'm looking for, this will work for:
* Pawn
* Projectile
* GreedCoinPickup
* GreedDropPoint
* xBombFlag
* xBombDelivery (instead of dynamic xBombDeliveryHole I watched before)
* xDomPoint (instead of dynamic DomLetter I watched before)
* CTFBase

Hey, perfect - that's everything ;-)  Catch is I need to know about players who have flags regardless of radius, I'll use the level pawnlist for this, I'll just make a list of carried flags before I do the CollidingActors loop.  Looks like something like this can very easily fit into my current code - if this works I'll be quite happy.  Ooooooh, Grand Funk on radio, can't code now ;-)

----

Hrm.  Lists page says pawn list isn't visible serverside, so I'd need to use DynamicActors anyways for that.  And that VisibleCollidingActors is slow for radius&gt;900, so I'd imagine CollidingActors is as well.  So maybe I'm back to the mess I had before...

===2/14/2003 ===

First wider public release == first bug report.  Apparently the display never goes away, even if you start another game without the mutator.  Oops, never tried removing the mute, or I would have caught this one.  Apparently none of my friends who test have removed it, either.  Added NotifyLevelChange to remove the interaction.  Also added support for Greed (show coins and drop points), DXT compressed textures, rewrote build scripts - there are now source-stripped binary packages, nice and small, and separate source packages.  Between source stripping and DXT textures, the .u is down from ~300K to ~60K.

----

Fix works, Greed support works, time for bed now.

----

Optimizing (I hope) some of my tests.  Mostly sorting all the type checks based on my guesses at the likelihood of finding such objects, and putting the range check at the very end, under the assumption (hopefully correct) that computing VSize costs more than all of those type checks.  Working on BR Goal and Dom Point display, that and flag bases and I'll have support for pretty much every gametype I ever play ;-)

===2/13/2003 ===

Well, I'm pretty sure that, if not buggy, the code I've just written will work.  I'm not 100% sure on structs and arrays of structs in UScript, so it's slightly iffy ;-)  It compiles, at least, which is a start.  I made a struct to store the relevant information about a flag/ball, and I maintain an array of those.  When I'm scanning for objects to display, if I find a ball or flag, if it is not in the array, I add its information to the array instead of drawing it immediately.  If I find a Pawn, I check its PRI.HasFlag.  When I get the flag from a Pawn, however, I don't ignore it if its already in the array - I just update its coordinates to match those of th Pawn carrying it.  There's also a check before the rest of the logic to mark an object carried by the player so that it will not be drawn.  Since I wrote this one from work, it'll have to wait until I get home to test, but I think this should do the trick.

----

Wow, UScript is very anal about the Length property of dynamic arrays.  It's writable, all right, but doesn't seem to like being set with ++ or += operators.  Once I got that out of the way, though, it seems to work fine.  Flags and balls still lag a bit in net games right after they're picked up, and I'm not sure that that can be fixed, but as soon as the carrier's PRI updates and shows that he's carrying, the flag icon locks right on top of the player icon.

===2/12/2003 ===

I now show bombing run ball and CTF flags!  I think this is pretty much as much as this will ever do...  the only other thing I may do is alter it to draw the ball/flag icon on top of the carrying player when carried, instead of detecting the ball/flag as a separate item, since the lower netpriority of the flags can make their icons lag behind the carrier a bit.  Heh, pulled out hair for a bit because I put the test to draw the new icon for flags inside the big &quot;these objects are the only important things&quot; test.  Question, if anyone knows:  since RadiusActors traverses all Actors, which would be faster, using RadiusActors, or using DynamicActors and checking radius myself?  Anyways, also did some UI cleanup and beautification, and I'll repackage as soon as I've updated the ReadMe ;-)

----

After more playtesting, it looks like I'll have to definitely do separate carried-flag vs loose-flag tracking, the flag just doesn't follow its carrier nicely at all on the display.  Also, it seems that when you pick up the flag or ball, it remains on the display wherever you picked it up.  Best best is probably to make an array to stuff flag-or-ball objects into, and if I find both a player with attached flag, and a flag, use the player's position to draw the icon for that object (after finished scanning through everything).  I'll probably try to arrange it so that if you player is carrying, they won't see the flag/ball icon at all - it would just sit still in the middle of the radar display anyways, and you'd have to be pretty confused to not know whether or not you were carrying ;-)

===2/9/2003 ===

Bleh, woke up at 5ish this morning, after going to bed at 1ish this morning, and couldn't sleep.  This should be an interesting day, good thing work on Sunday is slow.  Anyways...  being up, I decided to try some test code for something I've been thinking about.  I was thinking it would be a neat option effect if Redeemer blasts caused an EMP effect that temporarily disabled the radar display, and would be even more neat if the display showed static until it came back up.  Figuring that generating random noise in my script would be a bad, bad thing, I made up 5 different random static textures, and hacked in code to overlay a random selection of 2 of them on the display each frame.  Looks like crap, it seems like I end up with the same final texture for most frames.  I think maybe I need more noise textures, or else Rand is biased, which I hope isn't the case.  The textures are 256x256, I'm not sure just how many I should add for an effect that's really just eye candy anyways - I don't want to make this mutator unusable on slower machines ;-)  With any luck, I'm crashing after work, so maybe I'll mess with it more tomorrow.  Oh, and here's the new KeyEvent I coded yesterday, which seems to work decently:

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{

	local string tmp;

	if(Action == IST_Release &amp;&amp; Zooming !=0 &amp;&amp; Key == LastKey)
	{
		LastKey=-1;
		Zooming=0;
		return True;
	} else if (Action == IST_Press) {
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
		if (tmp == &quot;tdzoomin&quot;)
		{
			LastKey = Key;
			Zooming = -1;
			return True;
		} else if (tmp ~= &quot;tdzoomout&quot;) {
			LastKey = Key;
			zooming = 1;
			return True;
		}
	}
	return False;
}
&lt;/uscript&gt;

So now, I keep track of the last relevant keydown I had.  If the same key goes back up, I stop the current zoom.  A new keydown that is captured will replace the old zoom with a new one, and save the new key value.  The only catch I've found so far is that if you his ESC while zooming, KeyEvent never catches the keyup, and the zoom will probably go all the way in or out before you get back to the game.  Hitting any zoom key will clear the stuck condition though, so it's a minor nuisance at worst.

Also this morning: moved my ReadMe and .int into my Subversion repository, and rewrote my packaging script to insert the current svn revision into them - now the version listed in the ReadMe and in the mutator menu actually matches the version you get.

----

Sweet - I just talked to Goldenfire, he never did try the debugging build I gave him for his weird zooming issue, but the newest release build, r15, &quot;just works&quot;.

===2/8/2003 ===

Heheheh, that was an adventure.  I found the page on [[Legacy:SpawnNotify|SpawnNotify]], and it seemed like a perfect way to get out of using a DynamicActors iterator every frame - each UT instance could have a SpawnNotify that traps all spawns and maintains a list of only Actors that are important to the mutator (currently Pawns and Projectiles).  Spent half an hour coding it, oops, try to build and that's when I find out this class is gone in UT2k3.  I guess for now I'm stuck with DynamicActors, but on the bright side, the &quot;new&quot; code was in things I haven't modified in a while, and I noticed some things I can fix while I'm in there - two chunks of dead code, one just dead, one quite harmful (causing very bizarre display of projectiles on TacticalDisplay).

I was also hoping that the Delta passed to KeyEvent was the time since the last KeyEvent, and that KeyEvent would get repeated calls while a key was held (there's an action IST_Hold, after all), but this seems to not be the case - some logging code shows one even at keydown, one at keyup, and Delta values which I haven't a clue about (all seemed to be negative integer values).

I also did some testing of StopWatch, supposedly for script timing, hoping that it would let me figure out if an idea I had was &quot;too slow&quot; to use, but it looks like I'll have to just put it in and try to &quot;feel out&quot; the speed impact - see StopWatch on the [[Legacy:Global Function|Global Function]] page for my findings.  Anyways, the idea I'm thinking of is to check on KeyDown, by using ConsoleCommand calls, if the pressed key is currently bound to one of the 2 aliases my Interaction looks for.  This would mean that changes to control configuration are instant, but I don't know what the speed cost might be.  If ConsoleCommand executes reasonably quickly, probably acceptable.  Testing time now :-)

----

That worked out pretty well, the two calls to ConsoleCommand in my KeyEvent handler don't seem to cause any game slowdown or noticeable delay in key handling.

===2/7/2003 ===

Wow.  The word I usually use to describe situations like this is &quot;blecherous&quot;.  The Input tab, as far as I can tell, doesn't load your key bindings from the defaults of some class stored in a .ini, like many other configurable options.  It loops over integers 0-254, and calls PlayerOwner.ConsoleCommand to execute &lt;nowiki&gt;&quot;keyname &lt;i&gt;&quot;, &quot;localizedkeyname &lt;i&gt;&quot;, and &quot;keybinding &lt;keyname&gt;&quot;&lt;/nowiki&gt; for each.  For each key it finds that has an alias, it loops over its list of bindable commands to find one with that alias.  My GUIUserKeyBinding subclass never gets any properties changed and stored in a .ini, so it looks like the only way to do this is to do the same thing.  I'll assign an alias that won't be in use in the GUIUserKeyBinding, and have my Interaction look for the key bound to that command.  Only problems I see here are the nonexistent alias causing trouble (I don't '''think''' it will), and the Interaction not knowing when its key bindings have been changed.  I guess I can expect such troubles when doing things I'm not supposed to ;-)

----

Well, it works.  I still haven't found a way for the Interaction to be notified when bindings change, so what I'm doing for now is to scan for keybindings when the object is created and on level changes.

----

Urk!  One of my friends/playtest victims just got a chance to try the new version, and says the zoom feature is massively broken.  Same game (Instant Action) I last tested it with.  Will debug when I get home, this should be fun...

===2/6/2003 ===

I'm currently messing with key bindings, and finding it surprisingly difficult to make them do what I want.  It's very easy to use the GUIUserKeyBinding class so alias a key to something, but if your mod is a Mutator, and mainly works client-side, it's hard to do much with that.  Exec functions don't work in many places (including Interactions), so you can't easily create new commands to alias to, unless things like PlayerInput or PlayerController, which doesn't really seem good for a little Mutator to grab two keys.

I'm getting user key input now via keys bound to mutate commands, but this isn't good on network.  The Mutate function gets called on the server, which has to pass the data back (via an Inventory item) to modify the client-side Interaction.  My new plan, if I can figure out a way, is to &quot;find&quot; the custom key bindings, and trap the keys they are bound to in the Interaction via KeyEvent.  This would also be better, because I can set flags in the Interaction as to whether the keys are being held, and zoom smoothly and continuously in or out while a key is held.  My other option would be to dig through the Input tab code, and figure out how to add a similar key binding GUI to my Mutator config.

===before I started a journal... ===

I spent about two or three weeks working on a mutator before I started this journal.  Probably the most useful thing I learned during that time was that Inventory objects are your friends, when you want to modify client-side objects from a Mutator.  Just create a subclass of Inventory, and give it to everyone in a ModifyPlayer in your Mutator.  A virtual function in your Inventory subclass can modify its owner, add Interactions to the player (which is what I'm using it for), and all sorts of other things that are difficult to accomplish from within a Mutator class.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chimaira</title>
    <id>759</id>
    <revision>
      <id>2171</id>
      <timestamp>2002-10-21T07:08:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: (im not playing the game that your thinking :) )

'''Wormbo:''' Welcome to the Wiki, Chimaira. Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list. (Zxan, o_O!)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2172</id>
      <timestamp>2002-10-20T18:42:01Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: (im not playing the game that your thinking :) )

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chip</title>
    <id>749</id>
    <revision>
      <id>2145</id>
      <timestamp>2004-04-23T18:30:33Z</timestamp>
      <contributor>
        <ip>DarkArchangel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">i'm &quot;late&quot; getting a personal wiki page &amp; journal going, mainly because i had little confidence that what i am and what i have been doing as a novice modder was in any way interesting to anyone but myself. that's changed a bit lately.

my background:

this year i was officially classified as &quot;old&quot; by my 15-year-old daughter. thanks, dear ;-}. anyway, it goes to show ya that it takes all kinds to make a community, even one devoted to computer gaming &amp; making games.

i'm a graphic designer and occasional illustrator by trade, in the profession since before dtp was anything  more than a random neural fart in some Z80 or 6502 codejockey's mildly chemicalized greymatter. 

i started doing 3D work with Autodesk 3DStudio v.1, got severely addicted, and have managed to feed that habit irregularly for over a decade now, mainly on a hobby basis. more recently i've done 3D work on my Mac, making short low-rez movies and higher-rez stills, and writing scripted plug-ins for the Mac-based 3D app i use(d).

i love movies, have some background in 16mm filmmaking (see, i really AM old!), and it was the possibilities of using game engine tech for movie-like storytelling (aka Machinima) that drew me into the Unreal universe. i'm not really much of a game-player, having spent the years when gaming grew up, mostly growing my family and career, but it's never too late (i hope). my kids got me to play HALO about 18 months ago; it fascinated me, and i started paying much greater attention to the state of gaming art. shouldadunnit longago.

my coding experience reaches way back to Atari 800 BASIC, but is limited in depth &amp;ndash; a smattering of 6502 assembly language, some 486-based DOS level BASIC, RealBASIC (OOP) on the Mac, Pixelscript (a tcl-based language for extending the aforementioned Mac 3D app), AppleScript, and now, Unreal Script. i've always approached programming on a pragmatic basis &amp;ndash; i learn to code what i need to accomplish a specific task &amp;ndash; so there's holes in my skills that would easily pass a pachyderm.

i'm currently planning to resuscitate my web presence, but have to dig up sufficient server space to hold a lot of stills and movies, AND the time to design and mount a website. i need a Pluterday.

here, at least, is a minimal gallery to browse:

http://home.metrocast.net/~chipartist/pizza50

while doing 3D on the Mac, i learned i really like doing tutorials, so perhaps as i progress i'll be able to offer something more to the Wiki community than an occasional observation.

chip

chipartist@metrocast.net

==Tutorials ==

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

[[Legacy:MilkShape For UT2003 Static Meshes|MilkShape For UT2003 Static Meshes]]

==Comments==

'''Tarquin:''' Great work on the milkshape stuff! :D it's worked out nicely not making tutes as subpages: you've been able to split them individually. :)

'''Chip:''' Thanks, tarq. I hope people find the info useful. And thanks for the guidance on Wiki structuring &amp;ndash; it's helped a lot.

'''EntropicLqd:''' Welcome to the Wiki.  Nice to see another oldster kicking about - especially one that's probably older than me :)

'''Chip:''' Howdy, Entropic. I've been around the Wiki a while, just had a real low profile 'til lately. Learnin' lotsa stuff &amp;ndash; your &quot;Customizing the Player View&quot; is a page I hit often &amp;ndash; and startin' to give back a bit.

'''Sobiwan:''' Those Milkshape tuts are great!  Thanks!  If you need web space hosting, there is a 3 YEAR FREE offer @ http://order.1and1.com or you can use Flexihostings.net or possibly beg Mych to donate space.  :)

'''Chip:''' Thanks, Sobiwan, pleased you like the tutorials. My ISP just recently coughed up an additional 30Mb space for subscribers, so things aren't quite so tight, but I'll look into that URL nonetheless.

'''DarkArchangel:''' Hello Chip.

----

[[Legacy:Chip/Developer Journal|chip/Developer Journal]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2146</id>
      <timestamp>2003-10-24T03:24:39Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>danke, Sobiwan</comment>
      <text xml:space="preserve">i'm &quot;late&quot; getting a personal wiki page &amp; journal going, mainly because i had little confidence that what i am and what i have been doing as a novice modder was in any way interesting to anyone but myself. that's changed a bit lately.

my background:

this year i was officially classified as &quot;old&quot; by my 15-year-old daughter. thanks, dear ;-}. anyway, it goes to show ya that it takes all kinds to make a community, even one devoted to computer gaming &amp; making games.

i'm a graphic designer and occasional illustrator by trade, in the profession since before dtp was anything  more than a random neural fart in some Z80 or 6502 codejockey's mildly chemicalized greymatter. 

i started doing 3D work with Autodesk 3DStudio v.1, got severely addicted, and have managed to feed that habit irregularly for over a decade now, mainly on a hobby basis. more recently i've done 3D work on my Mac, making short low-rez movies and higher-rez stills, and writing scripted plug-ins for the Mac-based 3D app i use(d).

i love movies, have some background in 16mm filmmaking (see, i really AM old!), and it was the possibilities of using game engine tech for movie-like storytelling (aka Machinima) that drew me into the Unreal universe. i'm not really much of a game-player, having spent the years when gaming grew up, mostly growing my family and career, but it's never too late (i hope). my kids got me to play HALO about 18 months ago; it fascinated me, and i started paying much greater attention to the state of gaming art. shouldadunnit longago.

my coding experience reaches way back to Atari 800 BASIC, but is limited in depth &amp;ndash; a smattering of 6502 assembly language, some 486-based DOS level BASIC, RealBASIC (OOP) on the Mac, Pixelscript (a tcl-based language for extending the aforementioned Mac 3D app), AppleScript, and now, Unreal Script. i've always approached programming on a pragmatic basis &amp;ndash; i learn to code what i need to accomplish a specific task &amp;ndash; so there's holes in my skills that would easily pass a pachyderm.

i'm currently planning to resuscitate my web presence, but have to dig up sufficient server space to hold a lot of stills and movies, AND the time to design and mount a website. i need a Pluterday.

here, at least, is a minimal gallery to browse:

http://home.metrocast.net/~chipartist/pizza50

while doing 3D on the Mac, i learned i really like doing tutorials, so perhaps as i progress i'll be able to offer something more to the Wiki community than an occasional observation.

chip

chipartist@metrocast.net

==Tutorials ==

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

[[Legacy:MilkShape For UT2003 Static Meshes|MilkShape For UT2003 Static Meshes]]

==Comments==

'''Tarquin:''' Great work on the milkshape stuff! :D it's worked out nicely not making tutes as subpages: you've been able to split them individually. :)

'''Chip:''' Thanks, tarq. I hope people find the info useful. And thanks for the guidance on Wiki structuring &amp;ndash; it's helped a lot.

'''EntropicLqd:''' Welcome to the Wiki.  Nice to see another oldster kicking about - especially one that's probably older than me :)

'''Chip:''' Howdy, Entropic. I've been around the Wiki a while, just had a real low profile 'til lately. Learnin' lotsa stuff &amp;ndash; your &quot;Customizing the Player View&quot; is a page I hit often &amp;ndash; and startin' to give back a bit.

'''Sobiwan:''' Those Milkshape tuts are great!  Thanks!  If you need web space hosting, there is a 3 YEAR FREE offer @ http://order.1and1.com or you can use Flexihostings.net or possibly beg Mych to donate space.  :)

'''Chip:''' Thanks, Sobiwan, pleased you like the tutorials. My ISP just recently coughed up an additional 30Mb space for subscribers, so things aren't quite so tight, but I'll look into that URL nonetheless.

----

[[Legacy:Chip/Developer Journal|chip/Developer Journal]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chip/Developer Journal</title>
    <id>834</id>
    <revision>
      <id>2337</id>
      <timestamp>2003-11-12T12:00:25Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>nada mucho</comment>
      <text xml:space="preserve">10/03/03

i'm fast approaching my first anniversary as a UT2003 modder. it's been an interesting journey so far: tentative explorations with UEd1, on to better-equipped expeditions using UEd3, navigating the dense undergrowth of Unreal Script, surviving an unsatisfactory detour into tc mod team territory, and finally to the here &amp; now, with my first really fully-realized Unreal Script project ready for ... what???

do i just zip it up &amp; find a web slot &amp; hope it gets noticed? pimp the hell out of it on the forums? ask a few possibly amenable wiki/BUF denizens if they'd be willing to test/review/critique the work? the avenues for getting one's stuff out &amp; about can seem  a bit mysterious for those like myself new to the communities of computer gamers &amp; modders.

my project, dubbed ModelViewer, is a development tool, an outgrowth of my experience learning to get a custom character model into UT2003. my first two maps gave me a pretty solid grounding in static mesh techniques and even vertex animation, but since i'm interested in Machinima as much as game-mapping, i wanted to learn about the possibilities for custom character development, i.e., skeletal meshes.

having built, boned, animated and skinned a biped creature in MayaPLE, i soon realized that once the character is alive and kicking (so to speak) in a map, the standard player view options are really not up to the task of close inspection of a model as it does its stuff. that, and the desire to explore modifications to the &quot;camera&quot; through which players view the Unreal universe, led me to produce ModelViewer.

from the draft &quot;operating instructions&quot; i've written for ModelViewer:

----

ModelViewer ... is designed to make in-engine viewing &amp; evaluation of custom character models more versatile. ... ModelViewer gives UT2003 content creators a suite of player viewpoint controls analogous to those of an optical motion picture camera &amp;ndash; pan, tilt, dolly, and zoom &amp;ndash; so that custom character models can be more thoroughly examined &quot;in-engine.&quot;

----

i realized that the anims i had lovingly tweaked in MayaPLE looked subtly different in UT2003 &amp;ndash; motion in an abstract space is harder to evaluate than in an environment that bears at least some resemblance to the &quot;real&quot; world (whatever that is). but unlike MayaPLE or other modeling/animation apps, in UT2003 examination of player models from easily-changed viewpoints, and at various ranges, was a clumsy process at best, requiring (as far as i could tell), either spectating (with no pawn control) or using the limited BehindView and FreeCamera modes (views of the pawn from a relatively fixed distance or viewpoint).

so i scrounged through the classes for viewpoint functions and variables, looked into the possibility of using a mutator (not appropriate), and ended up writing a number of class extensions to gain greater control over how i could view my character in a map. once i had some new viewpoints, the faulty aspects of my character's animations were much easier to pinpoint, analyze, and subsequently eliminate.

but i found the process tedious after a while, since even after the principal view control functions had been debugged, there still remained the need to change various defaultproperties in my xPawn subclass to get the best &quot;performance&quot; from the model, and that meant re-compiling the entire package for every little change. 

about this time i was thinking that this new viewpoint flexibility might be valuable to other modders as well, but i also know that editing and compiling Unreal Script is not everyone's cup o' java, even if it's just changing some default props. so, how to make it all a bit more user-friendly?

config files &amp;ndash; easy to edit, relatively easy to access from Unreal Script &amp;ndash; seemed a good approach, so i set about learning their ins &amp; outs (inputs &amp; outputs???). tests with a few config variables seemed to work well, so i set about setting up a config variable corresponding to nearly every default property in the xPawn class. a few of the value types required for the var declarations were puzzling, but digging through the 2225 source code usually unearthed a solution.

by now the concept of a full-blown dev tool was becoming much better defined &amp;ndash; some custom classes implementing viewpoint controls, a map on which to stage the character model for examination, and a few &quot;template&quot; files into which users could plug their custom model info to make getting a character model into UT2003 a part of the ModelViewer system. with all the xPawn defaultproperties configurable by an easily edited .ini file, character developers could concentrate on character development rather than coding.

and it works. but it does need &quot;other eyes&quot; to scrutinize, both to provide feedback on the controls and to help insure the code isn't hiding some flaws just waiting to do gotchas on unsuspecting users. i don't have the depth in Unreal Scripting to feel really confident in that regard. but as i mentioned above, the protocols in the mod community for asking favors of other modders (e.g., beta evaluations) are, for me, somewhat impenetrable. does one just up &amp; ask?

----

10/30/03

I've been tweaking ModelViewer over the last month, getting the documentation finalized, and it's ready for beta trials. Character modelers and animators should find it useful. I'm also getting some feedback on my UT2003 map CTF-NeonArena, mainly regarding gameplay characteristics, before I put it on a public download site. Interested Wikians can contact me &amp;ndash; always good to have another perspective.

One aspect of the CTF map I found troublesome was getting the movers to work in netplay as they do in standalone. Using a LAN setup, I found that the &quot;hatch&quot; movers on the two flying vehicles don't stay attached to the rest of the vehicle, which is also a set of movers, one of which provides the AttachTag for the others. This is all necessary because the vehicles fly into &quot;parking&quot; positions in the standalone opening cinematic, then drift up and down slowly at station-keeping. The hatches are TriggerOpenTimed and team-specific, and in the cinematic &amp; standalone work great, but in netplay they stay stationary while the rest of the vehicle does its drifting thing. UG-LEE.

The map detects NetMode != NM_Standalone &amp; bypasses the cinematic, just as it does for certain conditions in standalone play, but there must be some replication issues involving movers attached to movers that I wasn't able to trace. The problem seems to only affect attached movers that also have keyframes (the hatches open &amp; close), because the attached movers that form the rest of the vehicle (no keyframes) didn't show the difficulty. 

A few dozen attempted but unsuccessful fixes later I just decided to kill the vehicle drift for netplay; it's only a cosmetic thing, and the hatches look right &amp; still open properly, but I dislike having to compromise. 

Note to self: Must learn more about replication, so as to plan maps better from the get-go.

----

11/03/03 LI hodie. Tempus fugit cum perfrui vita.&lt;br /&gt;(apologies to scholars of linguas caput)

----

11/12/03

working on a tute for the wiki re: skinning. why izzit that a process that seems rather straightforward and efficient when put into practice seems complex and clutzy when put into words? 

the first example's done, but i have to model up a character next, for the &quot;advanced&quot; skinning section.

also doing some small-scale beta testing of MilkShape 1.7's psa/psk exports, using a rudimentary custom skeleton &amp; meshes. results are promising but there are still some issues with the final result in UEd. 
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2338</id>
      <timestamp>2003-11-04T04:42:11Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">10/03/03

i'm fast approaching my first anniversary as a UT2003 modder. it's been an interesting journey so far: tentative explorations with UEd1, on to better-equipped expeditions using UEd3, navigating the dense undergrowth of Unreal Script, surviving an unsatisfactory detour into tc mod team territory, and finally to the here &amp; now, with my first really fully-realized Unreal Script project ready for ... what???

do i just zip it up &amp; find a web slot &amp; hope it gets noticed? pimp the hell out of it on the forums? ask a few possibly amenable wiki/BUF denizens if they'd be willing to test/review/critique the work? the avenues for getting one's stuff out &amp; about can seem  a bit mysterious for those like myself new to the communities of computer gamers &amp; modders.

my project, dubbed ModelViewer, is a development tool, an outgrowth of my experience learning to get a custom character model into UT2003. my first two maps gave me a pretty solid grounding in static mesh techniques and even vertex animation, but since i'm interested in Machinima as much as game-mapping, i wanted to learn about the possibilities for custom character development, i.e., skeletal meshes.

having built, boned, animated and skinned a biped creature in MayaPLE, i soon realized that once the character is alive and kicking (so to speak) in a map, the standard player view options are really not up to the task of close inspection of a model as it does its stuff. that, and the desire to explore modifications to the &quot;camera&quot; through which players view the Unreal universe, led me to produce ModelViewer.

from the draft &quot;operating instructions&quot; i've written for ModelViewer:

----

ModelViewer ... is designed to make in-engine viewing &amp; evaluation of custom character models more versatile. ... ModelViewer gives UT2003 content creators a suite of player viewpoint controls analogous to those of an optical motion picture camera &amp;ndash; pan, tilt, dolly, and zoom &amp;ndash; so that custom character models can be more thoroughly examined &quot;in-engine.&quot;

----

i realized that the anims i had lovingly tweaked in MayaPLE looked subtly different in UT2003 &amp;ndash; motion in an abstract space is harder to evaluate than in an environment that bears at least some resemblance to the &quot;real&quot; world (whatever that is). but unlike MayaPLE or other modeling/animation apps, in UT2003 examination of player models from easily-changed viewpoints, and at various ranges, was a clumsy process at best, requiring (as far as i could tell), either spectating (with no pawn control) or using the limited BehindView and FreeCamera modes (views of the pawn from a relatively fixed distance or viewpoint).

so i scrounged through the classes for viewpoint functions and variables, looked into the possibility of using a mutator (not appropriate), and ended up writing a number of class extensions to gain greater control over how i could view my character in a map. once i had some new viewpoints, the faulty aspects of my character's animations were much easier to pinpoint, analyze, and subsequently eliminate.

but i found the process tedious after a while, since even after the principal view control functions had been debugged, there still remained the need to change various defaultproperties in my xPawn subclass to get the best &quot;performance&quot; from the model, and that meant re-compiling the entire package for every little change. 

about this time i was thinking that this new viewpoint flexibility might be valuable to other modders as well, but i also know that editing and compiling Unreal Script is not everyone's cup o' java, even if it's just changing some default props. so, how to make it all a bit more user-friendly?

config files &amp;ndash; easy to edit, relatively easy to access from Unreal Script &amp;ndash; seemed a good approach, so i set about learning their ins &amp; outs (inputs &amp; outputs???). tests with a few config variables seemed to work well, so i set about setting up a config variable corresponding to nearly every default property in the xPawn class. a few of the value types required for the var declarations were puzzling, but digging through the 2225 source code usually unearthed a solution.

by now the concept of a full-blown dev tool was becoming much better defined &amp;ndash; some custom classes implementing viewpoint controls, a map on which to stage the character model for examination, and a few &quot;template&quot; files into which users could plug their custom model info to make getting a character model into UT2003 a part of the ModelViewer system. with all the xPawn defaultproperties configurable by an easily edited .ini file, character developers could concentrate on character development rather than coding.

and it works. but it does need &quot;other eyes&quot; to scrutinize, both to provide feedback on the controls and to help insure the code isn't hiding some flaws just waiting to do gotchas on unsuspecting users. i don't have the depth in Unreal Scripting to feel really confident in that regard. but as i mentioned above, the protocols in the mod community for asking favors of other modders (e.g., beta evaluations) are, for me, somewhat impenetrable. does one just up &amp; ask?

----

10/30/03

I've been tweaking ModelViewer over the last month, getting the documentation finalized, and it's ready for beta trials. Character modelers and animators should find it useful. I'm also getting some feedback on my UT2003 map CTF-NeonArena, mainly regarding gameplay characteristics, before I put it on a public download site. Interested Wikians can contact me &amp;ndash; always good to have another perspective.

One aspect of the CTF map I found troublesome was getting the movers to work in netplay as they do in standalone. Using a LAN setup, I found that the &quot;hatch&quot; movers on the two flying vehicles don't stay attached to the rest of the vehicle, which is also a set of movers, one of which provides the AttachTag for the others. This is all necessary because the vehicles fly into &quot;parking&quot; positions in the standalone opening cinematic, then drift up and down slowly at station-keeping. The hatches are TriggerOpenTimed and team-specific, and in the cinematic &amp; standalone work great, but in netplay they stay stationary while the rest of the vehicle does its drifting thing. UG-LEE.

The map detects NetMode != NM_Standalone &amp; bypasses the cinematic, just as it does for certain conditions in standalone play, but there must be some replication issues involving movers attached to movers that I wasn't able to trace. The problem seems to only affect attached movers that also have keyframes (the hatches open &amp; close), because the attached movers that form the rest of the vehicle (no keyframes) didn't show the difficulty. 

A few dozen attempted but unsuccessful fixes later I just decided to kill the vehicle drift for netplay; it's only a cosmetic thing, and the hatches look right &amp; still open properly, but I dislike having to compromise. 

Note to self: Must learn more about replication, so as to plan maps better from the get-go.

----

11/03/03 LI hodie. Tempus fugit cum perfrui vita.&lt;br /&gt;(apologies to scholars of linguas caput)
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chongqing Page</title>
    <id>28315</id>
    <revision>
      <id>39982</id>
      <timestamp>2009-11-14T20:10:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{ambox |image = [[Image:Oldwikilogo.png|52px|Legacy content notice]] |text = &lt;p&gt;'''This page previously contained the old Unreal Wiki's &quot;Chongqing Page&quot;.'''&lt;/p&gt;&lt;p&gt;''It was delet…'</comment>
      <text xml:space="preserve">{{ambox
|image = [[Image:Oldwikilogo.png|52px|Legacy content notice]]
|text = &lt;p&gt;'''This page previously contained the old Unreal Wiki's &quot;Chongqing Page&quot;.'''&lt;/p&gt;&lt;p&gt;''It was deleted due to problems caused by its sheer size. See '''http://chongqed.org/''' for the idea behind the original page.''&lt;/p&gt;
}}
; [[/Discuss]] : The original discussion page.
; [[/Statistics]] : Old statistics.
; [[/Temporary Read-Only]], [[/Permanent Read-Only]] : The old wiki's messages displayed to users who automatically got &quot;chongqed&quot;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chongqing Page/Discuss</title>
    <id>887</id>
    <revision>
      <id>2454</id>
      <timestamp>2006-07-18T06:56:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">There are two types of &quot;bans&quot; (actually, read-only states) imposed by the automatic spam filter:

* '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Temporary Read-Only|Temporary Bans]]''' are imposed for adding several, but not too many links to a page.  The page (with the links) is saved, and the user is put on read-only for ten minutes for each link he or she added.

* '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Permanent Read-Only|Permanent Bans]]''' are imposed for adding too many links to a page.  The changes to the page are discarded, and the user is put on read-only permanently.

I'm intentionally keeping the exact number of links required to trigger either of those cases vague.  I'd rather not have spammers fine-tune their spamming attempts using that information.  ;-)

In both cases, an email containing time, IP address, modified page name and submitted page content is dispatched to the [[Legacy:Wiki Admin|wiki admin]]s.  This allows them to react quickly to temporary bans (to revert the changes and make the ban permanent if a spammer was caught, or to undo the automatic ban on false positives), and it serves as proof when filing complaints to the spammers' ISPs.

If somebody would like to be added to the list of users receiving those notification emails, drop [[Legacy:Mychaeel|Mychaeel]] a line.

See also [[Legacy:Chongqing Page/Statistics|Chongqing Page/Statistics]].

==Discussion==

'''Tarquin:''' Just for added fun, I have hacked our page database so even the old revision of the page this guy edited leads to chongqed.org  bwahahahaha :D

'''RavuAlHemio:''' :D You're kicking the spammers anywhere you can, huh? :D

'''anonymous:''' Yes indeed folks go on treating them *******s the hard way. I had real troubles with spammers myself glad to see some action

'''Foxpaw:''' The ones I just posted didn't really have any keywords, not ones legible on my PC, anyway, so I just replaced the keywords with the URL of the sites..

'''MythOpus:''' This spamming is making me mad.  Grr.  I suggest we keep it open to the public to edit as they see fit, but I think we should have people sign up for the privelage.  We could really make use of the passwords in the preferences menu for this and it will help with the spam problem and if it continues then we could easilly find out EXACTLY who is doing it.  Of course, that may go against what this wiki was meant for but still...  Desperate Times, Desperate Measures.

'''Graphik:''' Hello Myth. :)

Times aren't desperate, just annoying. ;) I thought of the same thing, but in the end it is like you said, that's not what a wiki is meant for. Eventually they'll give up; it's very unsatisfying to see your work undone again and again. We already can find out who it is without registration, and I just banned one person today. :)

'''MythOpus:''' Note to all Spammers... Bow now, or bow later... muhahahahaphmuhahaMPH!!

'''Mychaeel:''' I don't really believe in technical means to stop spammers, but since those asian spam links are easy enough to spot and never used anywhere else on the Wiki, I've added a bit of code to the script that redirects people trying to save a page which contains such a link.  Try it yourself...  :-)

'''Foxpaw:''' The spamming has been intense lately. Is there a known reason for the surge in spamming? I don't remember it ever happening less than a year ago, not it seems within the last week or so it's been several spamvertizements a day.

'''Mychaeel:''' I think the one and only reason is that spammers have discovered wikis.  Now, true to their &quot;I'm the only thing that matters in the world&quot; attitude, they hook onto wikis everywhere in order to milk them for whatever benefit they see in doing so until they're dead and useless &amp;ndash; like a deadly virus.  Fortunately for us, their limited view of the world doesn't quite match reality, so there's still hope for the social rest of the world.

'''Tarquin:''' Does Google's bot see old revisions of pages?

'''Mychaeel:''' Our [http://wiki.beyondunreal.com/robots.txt robots.txt] wasn't properly set up to prevent this when I checked (only disallowing access to &lt;code&gt;/cgi-bin/wiki.pl?action=&lt;/code&gt;, not &lt;code&gt;/wiki?action=&lt;/code&gt;).  I've fixed this.

'''OverloadUT:''' I noticed that if you check the &quot;minor edit&quot; box when editing a page, it does not jump to the top of the list on the [[Legacy:Recent Changes|Recent Changes]] page. If a spammer figured this out, couldn't they check that box on all their spammed pages, and it would take much longer to find them?  Or is there some sort of protection against this?

'''Tarquin:''' Yes: set your preferences to see minor edits! :)

'''Mychaeel:''' The [[localcgi:chongqme|chongqing tool]] I added today makes is pretty simple to chongqify stuff added by a spammer; however, it doesn't register those keywords at http://chongqed.org.  The chongqing links still do their purpose, but they lead to an unimpressive &quot;The keyword [...] does not seem to be in the database&quot; page.

'''Foxpaw:''' Just thought of something - this page is going to get huge, and sufficiently huge pages seem to time out when you try to save them - that could become a problem as this page grows. The chongquing tool was very handy though, and just in time, as this spamming binge was enormous.

'''Parallax:''' Pagerank on google is based on the number of links into the linking page. We should have every single page in the wiki containing a link to this Chongqing page so that it gets a very very high page rank. Such a link to this page could be very discreet. That would mean that this page would have more authority when it comes to destroying the page rank of the spammers.

'''Tarquin:''' Yup. We could add it to the footer (in a small font) or something.

'''Foxpaw:''' Not only would that greatly increase loading times for pages on the wiki, but I don't think that it would work. Search engine spiders probrably only recognize a given link/keyword combination once per domain - otherwise spammers wouldn't have to spam wikis and blogs, they could just spam one domain (that they controlled) a whole ton of times.

'''Mychaeel:''' I don't think anybody's talking about adding the links ''on'' this page to the footer &amp;ndash; it's about adding a link ''to'' this page to the footer.  That really wouldn't increase loading times a lot.

'''Wormbo:''' I've just removed over 50% of the links because they were duplicates. Please check that first if you add them so we can keep the page size within reasonable limits. Does linking with an URL as the link text actually help?

'''Halz''' Yeah those URL links under 'Miscellaneous' are less effective chongqing links, particularly as they all point to the same page, rather than specific parts of the chongqed.org database. Also the links like [http://spammers.chongqed.org/Effexor%20and%20weight%20loss Effexor and weight loss] are keywords which you haven't told chongqed.org about. To chongq  effectively, you have to sumbit the spammer to chongqed.org, wait for the keywords to be accepted into the database, and then link using the keywords. So a link like [http://spammers.chongqed.org/business%20transcription Business Transcription] is best. However any links to [http://www.chongqed.org chongqed.org] will help boost its general ranking. Also as Foxpaw was saying, links from various different domains is better than lots of links from just one page, so if you folks have your own homepage, put a link there too!

'''Savannahlion:''' Yep, I've been Chongqed. Initially, this &lt;insert appropriate insult here&gt; started by dumping a few links in the Sandbox. Simple enough, I simply banned him. Problem solved for a few months.

Then he returns, and creates two pages in his interest. Deleted them. A few days later he assaults about eight or so pages with piles of his links. I call him Mr. Seo, as a hint. Unfortunately, the tactic of simply Chngqing his links won't work too well. He's creating wiki links within existing text without regard for context. Links within code where the [ and ] would be misinterpreted. A spam link within the words Counter-Strike, which is woefully outside of the context. Even a link to his spam within a reference to Google. Completely random words. 

I created a patch to prevent his lame additions. This was before I realized Tarquin solved the problem but after 4 hours of site clean up, coding, patching, and testing and 16 hours at work.

I'm going to look intto creating a Chongq page to support all of this. But the details of implemenation are kind of hazy. I'm going to have to mull over implementation details after work. Thank you Tarquin for pointing me in the right direction. But I would still like to pick your brain personally. IRC, ICQ, something.

'''Tarquin:''' A Chongq page simply links to the Chongq site to damage the spammer's google rating. I'm not in a position at the moment to be often on IRC, so you're best off reading up at the Chongq site to see how it works, or catching another wiki admin on our channel. Good luck dealing with this guy. Does his IP change a lot? You can always try banning him. Or you can hack to wiki code to refuse to save edits containing certain words or URLs.

----

'''Zxanphorian:''' OMG to all of those sites!

'''Tarquin:''' I'm thinking we should perhaps post on BuF to ask peopel to help the wiki fight spammers by putting a link to this page on their websites. What do you all think?

'''Foxpaw:''' Hrmm. That would boost the pagerank of this page, but not of Chongqed.org. If possible, copying the text from this page to a google-indexed page on their own site would probrably work better. That way Chongqed.org gets a higher cumulative rank as opposed to those referral links being divided among two sites (here and Chongqed.org).

At least, I don't THINK that being google has a heirarchial sort of system where a link to this page would be recognized as an indirect link to Chongqed.org.

'''Tarquin:''' We're not trying to raise the rating of Chongqed.org, we're trying to connect the keywords the spammers care about with the link to Chongqed.org. So yeah, copying this content works too, but according to the guys at Chongqed.org, making this page highly-linked to will be good too.

'''Foxpaw:''' Err, well, yes, but like I said, I don't think that linking here from elsewhere will do anything except raise the pagerank of this page, with the keywords used to link here. I wouldn't expect it to have any effect on the pagerank of Chongqed.org in combination with the keywords here, as I don't think that google counts indirect references like that. 

However, if they say it will work, I'll take their word for it.

'''ElMuerte:''' we need some magic for this page, e.g.:
* links on this page are read from an arbitrary file
* to add new chongqing links use an addition script, this script will:
** check for duplicates
** ... do more? ...
* Clearly mark the link to the add script, like: &quot;If you want to add spam to this site, please use the following link&quot; 

This makes things easier:
* no duplicates
* no high loading/saving/editing time for this page
* easier to catch new spam on this page

'''Mychaeel:''' I was thinking about extending the [[localcgi:chongqme|Chongq My Links!]] script with duplicate-removal functionality &amp;ndash; I just didn't get around to doing it yet.  (Now I've got my computer set up at home again, so chances are rising that I'll find the time soon.) &amp;ndash; Anyway, I find it amusing that this page is being the main target for spammers these days...  :p

'''Foxpaw:''' It seems like the logical page to spam, if you think about it. Not only do you get the normal &quot;benefit&quot; of posting your links, but you remove any of your links that may have been chongqed previously too.

'''Mychaeel:''' True... though that explanation implies that spammers were that smart, which appears hardly plausible to me (just look at the recent spam attempts &amp;ndash; the link tags were so incompetently crafted that they didn't even work). &amp;ndash; Maybe this sentence from the edit page header is what makes spammers paste their links here: &quot;Note that old page revisions aren't indexed by Google, but the Chongqing Page is.&quot;

'''Joe@Chongqed:''' Hi.  You guys are doing some good chongqing here, thanks.  I just wanted to add to what Tarquin said we said about linking (which I had forgot myself).  By increasing the PageRank for this page it gives the links here more credibility and should help their PageRanks too.  Links from a page with higher PageRank are more valuable.  As mentioned above, links from your footer or sidebar on every page would help the PageRank of this page.  It would also help the PageRank of [http://chongqed.org chongqed.org] if you linked from every page, but the purpose of chongqed.org is to remove junk from wikis.  While more links are great we don't want to clutter up people's wikis so are happy with how you guys are doing it.

I also want to invite you guys to our [http://wiki.chongqed.org chongqed wiki] in case you missed it, its a newer addition.  We use it to discuss chongqing ideas, spammers, antispam protection, etc.  It has been up long enough to attract spammers though, it shows how really stupid spammers are that they attack chongqed.org, not out of revenge, just regular spamming.  We have been learning a lot more about spammers recently.  So far all the ones that have attacked us have found the pages by searching for other spammer's URLs.  They let the other spammers do the dirty work of finding pages where their spam will stay long enough for Google to see it.  So by keeping a clean wiki you should attract fewer spammers.  Because we list lots of spammer URLs (though not links) our page appears to spammers to be a good target.  Although we hate spam, we like being spammed on our wiki, it makes chongqing them that much easier and more fun.

'''Graphik:''' Thanks for the information on your fine service.

I tried to post this once before, but there was an edit conflict; this page was spammed. :rolleyes:

I'm not sure if the links I reverted should be chongqued from here. They were rather 'adult' in nature and might violate  BU's 'no links to porn' hosting condition (In spirit, anyway).

'''Mychaeel:''' Chongqed links point to http://chongqed.org, not porn (unless Chongqed.org has changed its agenda since last time I checked).  So just chongq ahead!

'''Graphik:''' Done. Damn this page is going to be long after a while, so even my cable connection (much more a dial-up user) will start to struggle with it. I suggest that we create a subpage to contain the spammed links. The Chongq My Links! tool can automagically add them to the subpage instead of linking back to here to add them. &lt;insert better-thought-out variant of that idea here&gt;

'''Mychaeel:''' Moved the discussion to a subpage.

'''Graphik:''' An excellent idea, but that doesn't solve the problem of having to load the parent page to chongq links.

'''Mychaeel:''' Right, but neither would keeping the discussion on the main page and putting the links on the subpage...

'''Graphik:''' Ah, I believe there is a misunderstanding. The discussion is being on this page is an excellent idea, as I said.

I was suggesting that the Chongq My Links tool not be located on the same page as the spammed links repository. That way, the tool could automatically add the links to the Chongqing Page without the user ever loading it.

'''Mychaeel:''' Auto-adding links to the [[Legacy:Chongqing Page|Chongqing Page]] through the Chongq My Links! tool isn't in yet (not as trivial as it may sound), but I've added functionality to sort and remove duplicates from the list: Just copy the existing chongqing links into the second textbox and press &quot;Sort and Remove Duplicates&quot;.

----

'''Mychaeel:''' The most recent spammer added the following (badly transcribed) Russian comment amidst his spam links: &quot;Ne udaliyt &amp;ndash; derju pod kontrolem&quot; (followed by a great many exclamation marks).  My father, who knows Russian, tells me that this can be translated as &quot;Don't remove &amp;ndash; I'm keeping it under control!&quot;  :D

'''captaink:''' If you Google the quote, it leads to a Russian SEO forum. o_0

'''Zxanphorian:''' lol

----

'''xX)(Xx:''' When i try to edit a page ( [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] i get sent to the chongqing page, even though im not spamming, i even get sent here when i try to preview what ive done, i think it might be because there is already an off-wiki link there? Or perhaps it doesnt like my IP hehe, well anyway, im not trying to spam, is it possible to find out why this is happening?

'''Tarquin:''' The problem is the phrase 'bGravity...Zone' (without the dots). We set the script up to block a guy who kept writing 'GraViTy...Z'. I'll fix it tomorrow.

'''xX)(Xx:''' Thanks Tarquin :)

Damn spammers :(

'''Wormbo:''' The guy was here again. This time he spammed &quot;GRav.IT.Z&quot; and various dots on several pages and from several IPs.

BTW: The Chongq My Links tool sorts case-insensitive, but removes duplicates case-sensitively based on that sorting. The result is that we get the same key words repeating, e.g. &quot;sports betting&quot;, &quot;Sports Betting&quot;, &quot;sports betting&quot;, &quot;Sports Betting&quot; and so on.

----

'''Mosquito:''' This one has to be the worst yet.

If it wasn't for the quick acting of the BU admin it might not have stopped until the whole wiki was toast.

'''Foxpaw:''' Erm.. I noticed some pages I ended up reverting to their spammed state. I was reverting in batches of 30 or so pages simultaneously so there was some delay between when I checked the recent changes list to when I reverted the page.

'''Mosquito:''' Fair enough. Though, when it came to the page the speed in which the whole spamming was happening was incredible. It would revert one page and then 3 more would be spammed. Coincidentally enough I had the platoon theme playing on my playlist when I loaded the recent pages for the first time

'''Tarquin:''' I expect the spammer was running a bot. :(

'''EntropicLqd:''' Couldn't we update the Edit/Save page functionality to randomly generate the name of the submission form and form elements and store them on the user's session.  Then the update script could compare the fields received with the names held on the session and if they don't match then the update is not performed.  If the labels on the buttons were either images (with generated names) or selected from a larger pool of possible labels (e.g. Save, Update, Store Changes, you get the idea) then you'd effectively disable a bot as it would have nothing to work with.  Hopefully I've explained what I mean.

'''El Muerte:''' Here's an implementation idea that would stop bots. Add an hidden field that contains a hash of the page name and some other stuff. When an edit is submitted the hash is checked to see if it's correct. This way you always have to visit the edit page and can't use an automated POST script. e.g. hash = md5(pageTitle+userAddr+secretKey) . When the submission doesn't have the correct hash the edit page is popped up again with your edited text. This way when you get a new IP assigned in the meanwhile your edit won't be lost.

'''Mychaeel:''' That's a pretty smart idea, I think.  Right now most of the spam seems to be blocked by the link filter, but I'll look into implementing the hash idea as well.

----

'''Mychaeel:''' I've added code that automatically puts people who add too many links to a page on read-only (with a &quot;low&quot; threshold which only causes a temporary ban and a &quot;high&quot; one that causes an immediate permanent ban).  It also dispatches an email to the wiki admin in those cases to ensure they can react in a timely manner if necessary.

'''Foxpaw:''' How many links is &quot;too many?&quot; It seems like a person who was refactoring a page or merging two pages might add a number of links in a single edit and trip the ban.

'''Mychaeel:''' I've currently defined 15 new external links as &quot;too many.&quot;  (Between 5 and 14 new external links, the user is temporarily put on read-only; no harm done by that.  Just sit it out or wait until an admin undoes the auto-ban before it times out.)  I doubt many pages even contain that number of external links.

'''Mychaeel:''' ...and already caught one tonight who tried to add 451 links to [[Legacy:Brush Preservation|Brush Preservation]]...  :D

'''Tarquin:''' I don't think pages have that many external links. At most I usually see maybe up to 5 in the External Links section. Most links on wiki pages are internal. Good work Mych! :D

'''strider:''' Brilliant idea Mychaeel!

'''Mychaeel:''' This afternoon, the spam trap caught a spammer who added the modest amount of 12 links to [[Legacy:Using The Wiki|Using the Wiki]] and thus got temporarily banned at first.  The automatic notification gave me the opportunity to make the ban permanent and revert the changes within minutes.

'''Mychaeel:''' By the way, I'm getting down to business about the &quot;file an official complaint&quot; part.  I've done so for the last two spammers, and we'll see what the response is.

'''Wormbo:''' I can't say which of these two good news I like better. :D

'''strider:''' You can now add rel=nofollow to anchor tags to make it so external links aren't counted in search engine stats.  Wikipedia have already added this feature, and doing this might help kill spam.

'''Mychaeel:''' Spammers don't spam because spam is effective; it's sufficient that somebody ''tells them'' it is.  (That's especially evident in those spam attacks on our wiki with code that didn't even render as links...)  Reducing the effectivity of spam won't help, because the effectivity of spam is a non-issue to spammers.  They ''believe'' it's effective (or are made to by people who sell them spamming services and software), and that's enough.  Spam has become a self-sufficient phenomenon.

That said, the spam filter just caught another one adding 536 links to &quot;Inside The Death Chamber - Exploring Executions&quot; before any damage could be done.  Funnily enough, we don't even have that page.
:'''Wormbo:''' I've removed the wiki link markup to &quot;Inside The Death Chamber - Exploring Executions&quot; from your comment. Someone created that page only with the word &quot;You&quot; on it. After I deleted it, it was created again with the same content.

'''Mychaeel:''' Caught three more in the course of the afternoon before they could do damage.

'''Mosquito:''' Have you considered passing this around to other wikis, I'd imagine some are getting hit pretty hard these days.

'''Mychaeel:''' Actually, I pinched the basic idea for this filter from [[MeatBall:ShotgunSpam]], so other wikis are probably already aware of this idea.  Our implementation just adds auto-banning and email notifications.

'''Mychaeel:''' One of the ISPs I sent a complaint to has sent a reply:

{{innerbox| Dear Sir/Madam,

 

 We have already issued a warning to the user to ensure that such activity is not repeated in future. Hence we would request you to consider this case as closed. The Trouble Ticket Number for this complaint is '2973'.

 

 Please do contact us if the incident repeats again.

 

 Assuring you the best of our services.

 

 Thanking you.

 

 Yours Sincerely,

 

 Antiabuse Support 

}}

E-mail : Antiabuse.Support@relianceinfo.com 

Phone : 91-(022) -30388464

'''Mychaeel:''' ...and one more:

{{innerbox| Hi,

 

 we will take the necessary actions to stop this kind of illegal activity.

 

 Ystävällisin terveisin 

}}

Best Regards 

EUnet Finland 

puh +358 9 4243 3205 

fax +358 9 4243 0601 

Linnoitustie 4 B (Alto) 

02600 Espoo

----

'''EntropicLqd:''' Is the [[Legacy:Recent Changes|Recent Changes]] page indexed?  It occured to me that the recent page reverts were not so much an attempt at vandalising the Wiki page but merely a way of getting a single link listed many times by placing the target link in the change summary.  Might be worth preventing URLs from being placed in the change description.

'''Mychaeel:''' Pages whose URLs look like &lt;code&gt;http://wiki.beyondunreal.com/wiki?...&lt;/code&gt; are exempt from indexing, and after reversal, the spammy summary is removed from [[Legacy:Recent Changes|Recent Changes]] too.  Of course, spammers wouldn't even care about that subtlety if we put it on a flashing banner across the editing page.

Perhaps you're right with that idea, though I'm unclear about why someone would want a plain-text URL spammed somewhere; it's not like any search engine would consider that a &quot;link&quot; to increase the URL target's PageRank.

I could add a bit of code that prevents a page from being saved (and redirects the user elsewhere to an explanation) when an URL is placed in the summary field (and put a hint not to do that in the caption text below).

By the same token, I'll probably extend the link counting algorithm to include prior page revisions created by the same user as well.  I had anticipated this development for a while &amp;ndash; it's a well-established fact that spammers' motivation to spam is not impaired by even the most coarse hints that it's ultimately futile even if it manages to get past any technical measures, as demonstrated by waves of spam emails crafted to bypass spam filters.  I just hadn't been able to get myself to actually implement that.

...which reminds me of shooting off two complaints about those recent spammers.

'''Birelli:''' I think the last two are actually the same spammer. Two spams to a *.*.su both for gambling (presumably) spamming in an unusual way, it's probably the same one. And given that one IP is on the East Coast US, the other in Australia, it's a fair bet that it's a redirect. 

----

'''Joe@Chongqed:'''  Hi.  I saw your Temporary_Read-Only page.  I like the idea.  I added it to our page discussing [http://wiki.chongqed.org//WikiSpam spam protection methods].  I am calling it AutoBan for now, do you have any better name?  You mentioned above the idea comes from ShotGunSpam.  Is this method unique enough to deserve a section of its own or should I just add to our description of ShotGunSpam?

----

'''MythOpus:''' Awhile ago I caught a spammer who edited the actual hyper link of links that were already on a few pages.  I don't think the auto ban incorporates that so is there any way we can shut those spamming possibilities down?  Also, it may be a little over the top but, a captcha system might be a good idea.  Or, we can fake one :)  Make a fake little picture, put it on the editing pages and spam bots would have to type in the special number.  If someone get's a spam bot in we can simply change the pic to something else and change the pass?

'''zugy:''' Hmmm-I wonder...It can't be too hard to generate a security code thing, would it? You see them everywhere, these days.... 

'''Draconx:''' Guah!  That temp ban thing raped me :(  I revert the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page which has &lt;b&gt;twenty-six&lt;/b&gt; external links on it and get owned for 4h 20m :(

'''Mychaeel:''' I had undone your temporary ban within minutes of getting the notification email.  Thanks for the trouble.  :-)

'''zugy:''' Bummer-I was gonna revert that myself except- 1) didn't know how and 2) thought it might be an admin-only kind of thing...

----

'''Guest:''' Mych, have you considered making this page auto-update when a ban or other relevant event took place? I know a feature like this wouldn't code itself, but it seems like you spend a lot of time updating the table.

'''MythOpus:''' Mych, are you have the time of your life or what?

'''Mychaeel:''' Actually, manually keeping track of the auto-bans gets tiring after the first hundred or so.  I'd rather see spammers discouraged or (gasp!) on their way of understanding that what they're doing is wrong on so many levels.

'''MythOpus:''' I'll be waiting for the day when that happens.  Sadly, most spammers these days are getting paid big bucks to do what they do.  It's a shame.  You should consider the auto-update idea though.  I don't think it would be too hard to manage?

'''Mychaeel:''' Mostly I want to confirm that it's really a spamming attempt and not a false positive before I log anything anywhere.

'''T1:''' I have an idea that may work to help slow down people from writing bots that change large amounts of pages with only single links, therefore avoiding the autoban. You could prevent non-registered users from doing many edits at once, by only allowing 1 edit every 10 seconds. Basically you would store a global &quot;last edit time&quot; and every time non-registered-user makes an edit, check if there has been an edit in the last 10 seconds by a non-registered-user (it doesn't matter if it's the same or a different one). If so, then you'd get a new page that said, please wait X seconds, but it still has the textbox with what you wrote so you don't lose your submission. This would prevent that situation some referred to farther up the page where there was bot that was spamming faster than wikizens could revert. The non-registered bot would be slower, but it wouldn't affect non-registered users who aren't spamming very much. You might say that the bot would then simply register before spamming, but you could put a ten second limit on registering also, therefore each time it made an edit, it would still be slower because the autoban or a good wikizen would probably catch it. The only problem I forsee is people that don't register and want to help against a bot, they may not be able to do much except slow it down if they get a lucky shot into the minimal gap between the end of the ten seconds and the next bot attack.

Also, if the ENTIRE text of the page is deleted and replaced with more than two or three links and no non-links, isn't that an obvious spam attempt that should be auto-detected, even if it's less links than the standard autoban link limit?

'''craze:''' i think the Wiki just got a large dose of chongqing, tryed to see if i got my help desk question answered, and woulkda ya look at tehh, massive page edits, all with ad links in em'....

'''T1:''' Another bot prevention method: If some one adds the same text to more than two pages, autotempban. Happens a 3rd time? it's an autopermaban. Now, if only someone would implement these things, it'd slow dow/inconvience/prevent some spammers. Also, the statistics shouldn't be on this page because then probably no one notices actual discussion on this page because they think it's the stats being updated..

'''El Muerte:''' I think the spam check needs a fix to also scan for bad defined links. In this case the bot should have gotten an tempban because he submitted 6 links, but the links were not correct unrealwiki markup.

'''Tarquin:''' I'm locking the wiki for a bit.

'''Wormbo:''' Hmm, all those changes came from different IPs. A coordinated distributed spam attack? I think I smell a botnet.

'''Tarquin:''' I'm looking at our spam detection code, and Mych's use of regexps is beyond me :(

'''Mychaeel:''' The spam trap ''did'' spring &amp;ndash; once for each of the 41 different IP addresses the spammer used.

Currently, the spam trap is very simple.  Yes, we can make it more sophisticated, but in the end it'll always be just a small Perl script, while spammers will always possess some level of human intelligence (even though the fact that this small Perl script of ours manages to outsmart about 99% of them speaks volumes about it).  So, while we can put huge amounts of brains into creating a script which catches an even higher percentage of spammers, we'll still never reach the point where we can be sure it'll catch ''all'' spammers.  I don't think we can currently get any better effort/success ratio than we have already.

Several trusted wikizens here have been given a secret URL to lock the wiki in case of emergency.  Why did nobody use it?

'''T1:''' I know perl myself, and I'd love to lend a hand in improving the script. In my opinion there is nothing that cannot be improved upon, and I find programming much more fun than wikignoming. 99% is still not 100%. Besides, my hard drive on my main pc is messed up, and I have absolutely NOTHING to do right now, so I'd absolutely love to do some semi-constructive programming.

Also, I'm checking for other wikis that got hit by the same spammer, and I've found these so far:

http://www.intertwingly.net/wiki/pie/FrontPage

http://wiki.python.org/moin/AtAudioSprint?action=diff

http://wiki.43folders.com/index.php/Special:Recentchanges

http://wiki.kde.org/tiki-index.php?PHPSESSID=4942f9c1fedf2525cddb6c6e878ea769

'''Tarquin:''' Mych, my thought was actually to make the trap ''simpler'' &amp;ndash; to check purely for URLs, rather than URL links. But if it caught the spammer... cool :) BTW, what does '&amp;#' do in the regexp? (line 4388)

'''T1:''' '&amp;#'????? That's not even in the man page.

:'''Mychaeel:''' It looks for the string &quot;&amp;#&quot; ;-) &amp;ndash; those pattern matches are part of the &quot;old&quot; spam detection code which was added when wikis were flooded by &quot;chinese spam.&quot;  The auto-banning URL filter is somewhere else and indeed simply looks for occurrences of &lt;code&gt;/UTF8_REPLACEMENThttp:/i&lt;/code&gt;.

'''craze:''' although i know very little on the subject, how about having the spam detection script(when tripped) begin to traceroute all edits within the next x secconds/x minuites and check for matching IPs near the end of the list, just to make sure its not just one person with a network of IPs  attacking teh Wiki...(this probably makes no sence...)

'''El Muerte:''' how about using DNSBL to check the host? The wiki doesn't have that many edits so the overhead might be low. Although in the last case it wouldn't have stopped the sammer since he was using a zombie network.

'''Switch`:''' How about adding user registration and blocking anonymous posting? Maybe not exactly in spirit of wiki but this is &quot;The Unreal Engine Documentation Site&quot; for developers by developers first, wiki second.

'''craze:''' ahh thats thwe word i was thinking of, zombie, just check for a common IP twards the end after it starts going through ISPs, just check if someone after the ISPs IP has something after it, if i got this right, IPs twards the end of the list would start to match(xept the last one) in the trace route, then if it starts matching abd the anti spam scripts has been tripped just discard the edit

----

'''MythOpus:''' Another spam attempt just occured.  The spammer mass joined and logged in with several usernames and link spammed some pages.  Apparently, he thought he could trick us by deleting some of the links on the pages as to make us think he deleted all of the links.  When will the maturity level of these 'geniuses' level off with normal standards?

'''Wormbo:''' Did we already discuss these number/letter combinations presented through an image and the user has to type it in? We could add something like this to the edit page for each IP that didn't properly respond to an image yet. After this verification the user or IP won't have to do it again. If verification fails the user will only see the preview page. (so the edits aren't lost)

'''T1:''' Same spammer as last time.

http://wiki.kde.org/

They had such an image verification system, spammers hit them just as hard as us last time, if not harder.

----

'''Wormbo:''' We need a way to revert pages with many links. [[Legacy:Wiki Integration/Browser Sidebar|Wiki Integration/Browser Sidebar]] got overridden with spam and attempts to revert it result in permanent read-only, without any changes to the page.

'''Mychaeel:''' Short-term solutions: Admins are now exempt from the link threshold (should have been that way from the start).  Long-term solution: Reverting a page to a previous version should be allowed by anyone no matter what it does to the number of links.

----

'''Mychaeel:''' That &lt;code&gt;display:&lt;/code&gt;&lt;code&gt; none&lt;/code&gt;-type spam is blocked now as well.

----

'''Tarquin:''' A lot of the links here go to 404s on the Chongqing site.

'''Kartoshka:''' 404s because whoever added the links to the Chongqing page didn't submit them to chongqed.org?</text>
    </revision>
    <revision>
      <id>2455</id>
      <timestamp>2006-06-23T15:37:41Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>404s ?</comment>
      <text xml:space="preserve">There are two types of &quot;bans&quot; (actually, read-only states) imposed by the automatic spam filter:

* '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Temporary Read-Only|Temporary Bans]]''' are imposed for adding several, but not too many links to a page.  The page (with the links) is saved, and the user is put on read-only for ten minutes for each link he or she added.

* '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Permanent Read-Only|Permanent Bans]]''' are imposed for adding too many links to a page.  The changes to the page are discarded, and the user is put on read-only permanently.

I'm intentionally keeping the exact number of links required to trigger either of those cases vague.  I'd rather not have spammers fine-tune their spamming attempts using that information.  ;-)

In both cases, an email containing time, IP address, modified page name and submitted page content is dispatched to the [[Legacy:Wiki Admin|wiki admin]]s.  This allows them to react quickly to temporary bans (to revert the changes and make the ban permanent if a spammer was caught, or to undo the automatic ban on false positives), and it serves as proof when filing complaints to the spammers' ISPs.

If somebody would like to be added to the list of users receiving those notification emails, drop [[Legacy:Mychaeel|Mychaeel]] a line.

See also [[Legacy:Chongqing Page/Statistics|Chongqing Page/Statistics]].

==Discussion==

'''Tarquin:''' Just for added fun, I have hacked our page database so even the old revision of the page this guy edited leads to chongqed.org  bwahahahaha :D

'''RavuAlHemio:''' :D You're kicking the spammers anywhere you can, huh? :D

'''anonymous:''' Yes indeed folks go on treating them *******s the hard way. I had real troubles with spammers myself glad to see some action

'''Foxpaw:''' The ones I just posted didn't really have any keywords, not ones legible on my PC, anyway, so I just replaced the keywords with the URL of the sites..

'''MythOpus:''' This spamming is making me mad.  Grr.  I suggest we keep it open to the public to edit as they see fit, but I think we should have people sign up for the privelage.  We could really make use of the passwords in the preferences menu for this and it will help with the spam problem and if it continues then we could easilly find out EXACTLY who is doing it.  Of course, that may go against what this wiki was meant for but still...  Desperate Times, Desperate Measures.

'''Graphik:''' Hello Myth. :)

Times aren't desperate, just annoying. ;) I thought of the same thing, but in the end it is like you said, that's not what a wiki is meant for. Eventually they'll give up; it's very unsatisfying to see your work undone again and again. We already can find out who it is without registration, and I just banned one person today. :)

'''MythOpus:''' Note to all Spammers... Bow now, or bow later... muhahahahaphmuhahaMPH!!

'''Mychaeel:''' I don't really believe in technical means to stop spammers, but since those asian spam links are easy enough to spot and never used anywhere else on the Wiki, I've added a bit of code to the script that redirects people trying to save a page which contains such a link.  Try it yourself...  :-)

'''Foxpaw:''' The spamming has been intense lately. Is there a known reason for the surge in spamming? I don't remember it ever happening less than a year ago, not it seems within the last week or so it's been several spamvertizements a day.

'''Mychaeel:''' I think the one and only reason is that spammers have discovered wikis.  Now, true to their &quot;I'm the only thing that matters in the world&quot; attitude, they hook onto wikis everywhere in order to milk them for whatever benefit they see in doing so until they're dead and useless &amp;ndash; like a deadly virus.  Fortunately for us, their limited view of the world doesn't quite match reality, so there's still hope for the social rest of the world.

'''Tarquin:''' Does Google's bot see old revisions of pages?

'''Mychaeel:''' Our [http://wiki.beyondunreal.com/robots.txt robots.txt] wasn't properly set up to prevent this when I checked (only disallowing access to &lt;code&gt;/cgi-bin/wiki.pl?action=&lt;/code&gt;, not &lt;code&gt;/wiki?action=&lt;/code&gt;).  I've fixed this.

'''OverloadUT:''' I noticed that if you check the &quot;minor edit&quot; box when editing a page, it does not jump to the top of the list on the [[Legacy:Recent Changes|Recent Changes]] page. If a spammer figured this out, couldn't they check that box on all their spammed pages, and it would take much longer to find them?  Or is there some sort of protection against this?

'''Tarquin:''' Yes: set your preferences to see minor edits! :)

'''Mychaeel:''' The [[localcgi:chongqme|chongqing tool]] I added today makes is pretty simple to chongqify stuff added by a spammer; however, it doesn't register those keywords at http://chongqed.org.  The chongqing links still do their purpose, but they lead to an unimpressive &quot;The keyword [...] does not seem to be in the database&quot; page.

'''Foxpaw:''' Just thought of something - this page is going to get huge, and sufficiently huge pages seem to time out when you try to save them - that could become a problem as this page grows. The chongquing tool was very handy though, and just in time, as this spamming binge was enormous.

'''Parallax:''' Pagerank on google is based on the number of links into the linking page. We should have every single page in the wiki containing a link to this Chongqing page so that it gets a very very high page rank. Such a link to this page could be very discreet. That would mean that this page would have more authority when it comes to destroying the page rank of the spammers.

'''Tarquin:''' Yup. We could add it to the footer (in a small font) or something.

'''Foxpaw:''' Not only would that greatly increase loading times for pages on the wiki, but I don't think that it would work. Search engine spiders probrably only recognize a given link/keyword combination once per domain - otherwise spammers wouldn't have to spam wikis and blogs, they could just spam one domain (that they controlled) a whole ton of times.

'''Mychaeel:''' I don't think anybody's talking about adding the links ''on'' this page to the footer &amp;ndash; it's about adding a link ''to'' this page to the footer.  That really wouldn't increase loading times a lot.

'''Wormbo:''' I've just removed over 50% of the links because they were duplicates. Please check that first if you add them so we can keep the page size within reasonable limits. Does linking with an URL as the link text actually help?

'''Halz''' Yeah those URL links under 'Miscellaneous' are less effective chongqing links, particularly as they all point to the same page, rather than specific parts of the chongqed.org database. Also the links like [http://spammers.chongqed.org/Effexor%20and%20weight%20loss Effexor and weight loss] are keywords which you haven't told chongqed.org about. To chongq  effectively, you have to sumbit the spammer to chongqed.org, wait for the keywords to be accepted into the database, and then link using the keywords. So a link like [http://spammers.chongqed.org/business%20transcription Business Transcription] is best. However any links to [http://www.chongqed.org chongqed.org] will help boost its general ranking. Also as Foxpaw was saying, links from various different domains is better than lots of links from just one page, so if you folks have your own homepage, put a link there too!

'''Savannahlion:''' Yep, I've been Chongqed. Initially, this &lt;insert appropriate insult here&gt; started by dumping a few links in the Sandbox. Simple enough, I simply banned him. Problem solved for a few months.

Then he returns, and creates two pages in his interest. Deleted them. A few days later he assaults about eight or so pages with piles of his links. I call him Mr. Seo, as a hint. Unfortunately, the tactic of simply Chngqing his links won't work too well. He's creating wiki links within existing text without regard for context. Links within code where the [ and ] would be misinterpreted. A spam link within the words Counter-Strike, which is woefully outside of the context. Even a link to his spam within a reference to Google. Completely random words. 

I created a patch to prevent his lame additions. This was before I realized Tarquin solved the problem but after 4 hours of site clean up, coding, patching, and testing and 16 hours at work.

I'm going to look intto creating a Chongq page to support all of this. But the details of implemenation are kind of hazy. I'm going to have to mull over implementation details after work. Thank you Tarquin for pointing me in the right direction. But I would still like to pick your brain personally. IRC, ICQ, something.

'''Tarquin:''' A Chongq page simply links to the Chongq site to damage the spammer's google rating. I'm not in a position at the moment to be often on IRC, so you're best off reading up at the Chongq site to see how it works, or catching another wiki admin on our channel. Good luck dealing with this guy. Does his IP change a lot? You can always try banning him. Or you can hack to wiki code to refuse to save edits containing certain words or URLs.

----

'''Zxanphorian:''' OMG to all of those sites!

'''Tarquin:''' I'm thinking we should perhaps post on BuF to ask peopel to help the wiki fight spammers by putting a link to this page on their websites. What do you all think?

'''Foxpaw:''' Hrmm. That would boost the pagerank of this page, but not of Chongqed.org. If possible, copying the text from this page to a google-indexed page on their own site would probrably work better. That way Chongqed.org gets a higher cumulative rank as opposed to those referral links being divided among two sites (here and Chongqed.org).

At least, I don't THINK that being google has a heirarchial sort of system where a link to this page would be recognized as an indirect link to Chongqed.org.

'''Tarquin:''' We're not trying to raise the rating of Chongqed.org, we're trying to connect the keywords the spammers care about with the link to Chongqed.org. So yeah, copying this content works too, but according to the guys at Chongqed.org, making this page highly-linked to will be good too.

'''Foxpaw:''' Err, well, yes, but like I said, I don't think that linking here from elsewhere will do anything except raise the pagerank of this page, with the keywords used to link here. I wouldn't expect it to have any effect on the pagerank of Chongqed.org in combination with the keywords here, as I don't think that google counts indirect references like that. 

However, if they say it will work, I'll take their word for it.

'''ElMuerte:''' we need some magic for this page, e.g.:
* links on this page are read from an arbitrary file
* to add new chongqing links use an addition script, this script will:
** check for duplicates
** ... do more? ...
* Clearly mark the link to the add script, like: &quot;If you want to add spam to this site, please use the following link&quot; 

This makes things easier:
* no duplicates
* no high loading/saving/editing time for this page
* easier to catch new spam on this page

'''Mychaeel:''' I was thinking about extending the [[localcgi:chongqme|Chongq My Links!]] script with duplicate-removal functionality &amp;ndash; I just didn't get around to doing it yet.  (Now I've got my computer set up at home again, so chances are rising that I'll find the time soon.) &amp;ndash; Anyway, I find it amusing that this page is being the main target for spammers these days...  :p

'''Foxpaw:''' It seems like the logical page to spam, if you think about it. Not only do you get the normal &quot;benefit&quot; of posting your links, but you remove any of your links that may have been chongqed previously too.

'''Mychaeel:''' True... though that explanation implies that spammers were that smart, which appears hardly plausible to me (just look at the recent spam attempts &amp;ndash; the link tags were so incompetently crafted that they didn't even work). &amp;ndash; Maybe this sentence from the edit page header is what makes spammers paste their links here: &quot;Note that old page revisions aren't indexed by Google, but the Chongqing Page is.&quot;

'''Joe@Chongqed:''' Hi.  You guys are doing some good chongqing here, thanks.  I just wanted to add to what Tarquin said we said about linking (which I had forgot myself).  By increasing the PageRank for this page it gives the links here more credibility and should help their PageRanks too.  Links from a page with higher PageRank are more valuable.  As mentioned above, links from your footer or sidebar on every page would help the PageRank of this page.  It would also help the PageRank of [http://chongqed.org chongqed.org] if you linked from every page, but the purpose of chongqed.org is to remove junk from wikis.  While more links are great we don't want to clutter up people's wikis so are happy with how you guys are doing it.

I also want to invite you guys to our [http://wiki.chongqed.org chongqed wiki] in case you missed it, its a newer addition.  We use it to discuss chongqing ideas, spammers, antispam protection, etc.  It has been up long enough to attract spammers though, it shows how really stupid spammers are that they attack chongqed.org, not out of revenge, just regular spamming.  We have been learning a lot more about spammers recently.  So far all the ones that have attacked us have found the pages by searching for other spammer's URLs.  They let the other spammers do the dirty work of finding pages where their spam will stay long enough for Google to see it.  So by keeping a clean wiki you should attract fewer spammers.  Because we list lots of spammer URLs (though not links) our page appears to spammers to be a good target.  Although we hate spam, we like being spammed on our wiki, it makes chongqing them that much easier and more fun.

'''Graphik:''' Thanks for the information on your fine service.

I tried to post this once before, but there was an edit conflict; this page was spammed. :rolleyes:

I'm not sure if the links I reverted should be chongqued from here. They were rather 'adult' in nature and might violate  BU's 'no links to porn' hosting condition (In spirit, anyway).

'''Mychaeel:''' Chongqed links point to http://chongqed.org, not porn (unless Chongqed.org has changed its agenda since last time I checked).  So just chongq ahead!

'''Graphik:''' Done. Damn this page is going to be long after a while, so even my cable connection (much more a dial-up user) will start to struggle with it. I suggest that we create a subpage to contain the spammed links. The Chongq My Links! tool can automagically add them to the subpage instead of linking back to here to add them. &lt;insert better-thought-out variant of that idea here&gt;

'''Mychaeel:''' Moved the discussion to a subpage.

'''Graphik:''' An excellent idea, but that doesn't solve the problem of having to load the parent page to chongq links.

'''Mychaeel:''' Right, but neither would keeping the discussion on the main page and putting the links on the subpage...

'''Graphik:''' Ah, I believe there is a misunderstanding. The discussion is being on this page is an excellent idea, as I said.

I was suggesting that the Chongq My Links tool not be located on the same page as the spammed links repository. That way, the tool could automatically add the links to the Chongqing Page without the user ever loading it.

'''Mychaeel:''' Auto-adding links to the [[Legacy:Chongqing Page|Chongqing Page]] through the Chongq My Links! tool isn't in yet (not as trivial as it may sound), but I've added functionality to sort and remove duplicates from the list: Just copy the existing chongqing links into the second textbox and press &quot;Sort and Remove Duplicates&quot;.

----

'''Mychaeel:''' The most recent spammer added the following (badly transcribed) Russian comment amidst his spam links: &quot;Ne udaliyt &amp;ndash; derju pod kontrolem&quot; (followed by a great many exclamation marks).  My father, who knows Russian, tells me that this can be translated as &quot;Don't remove &amp;ndash; I'm keeping it under control!&quot;  :D

'''captaink:''' If you Google the quote, it leads to a Russian SEO forum. o_0

'''Zxanphorian:''' lol

----

'''xX)(Xx:''' When i try to edit a page ( [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] i get sent to the chongqing page, even though im not spamming, i even get sent here when i try to preview what ive done, i think it might be because there is already an off-wiki link there? Or perhaps it doesnt like my IP hehe, well anyway, im not trying to spam, is it possible to find out why this is happening?

'''Tarquin:''' The problem is the phrase 'bGravity...Zone' (without the dots). We set the script up to block a guy who kept writing 'GraViTy...Z'. I'll fix it tomorrow.

'''xX)(Xx:''' Thanks Tarquin :)

Damn spammers :(

'''Wormbo:''' The guy was here again. This time he spammed &quot;GRav.IT.Z&quot; and various dots on several pages and from several IPs.

BTW: The Chongq My Links tool sorts case-insensitive, but removes duplicates case-sensitively based on that sorting. The result is that we get the same key words repeating, e.g. &quot;sports betting&quot;, &quot;Sports Betting&quot;, &quot;sports betting&quot;, &quot;Sports Betting&quot; and so on.

----

'''Mosquito:''' This one has to be the worst yet.

If it wasn't for the quick acting of the BU admin it might not have stopped until the whole wiki was toast.

'''Foxpaw:''' Erm.. I noticed some pages I ended up reverting to their spammed state. I was reverting in batches of 30 or so pages simultaneously so there was some delay between when I checked the recent changes list to when I reverted the page.

'''Mosquito:''' Fair enough. Though, when it came to the page the speed in which the whole spamming was happening was incredible. It would revert one page and then 3 more would be spammed. Coincidentally enough I had the platoon theme playing on my playlist when I loaded the recent pages for the first time

'''Tarquin:''' I expect the spammer was running a bot. :(

'''EntropicLqd:''' Couldn't we update the Edit/Save page functionality to randomly generate the name of the submission form and form elements and store them on the user's session.  Then the update script could compare the fields received with the names held on the session and if they don't match then the update is not performed.  If the labels on the buttons were either images (with generated names) or selected from a larger pool of possible labels (e.g. Save, Update, Store Changes, you get the idea) then you'd effectively disable a bot as it would have nothing to work with.  Hopefully I've explained what I mean.

'''El Muerte:''' Here's an implementation idea that would stop bots. Add an hidden field that contains a hash of the page name and some other stuff. When an edit is submitted the hash is checked to see if it's correct. This way you always have to visit the edit page and can't use an automated POST script. e.g. hash = md5(pageTitle+userAddr+secretKey) . When the submission doesn't have the correct hash the edit page is popped up again with your edited text. This way when you get a new IP assigned in the meanwhile your edit won't be lost.

'''Mychaeel:''' That's a pretty smart idea, I think.  Right now most of the spam seems to be blocked by the link filter, but I'll look into implementing the hash idea as well.

----

'''Mychaeel:''' I've added code that automatically puts people who add too many links to a page on read-only (with a &quot;low&quot; threshold which only causes a temporary ban and a &quot;high&quot; one that causes an immediate permanent ban).  It also dispatches an email to the wiki admin in those cases to ensure they can react in a timely manner if necessary.

'''Foxpaw:''' How many links is &quot;too many?&quot; It seems like a person who was refactoring a page or merging two pages might add a number of links in a single edit and trip the ban.

'''Mychaeel:''' I've currently defined 15 new external links as &quot;too many.&quot;  (Between 5 and 14 new external links, the user is temporarily put on read-only; no harm done by that.  Just sit it out or wait until an admin undoes the auto-ban before it times out.)  I doubt many pages even contain that number of external links.

'''Mychaeel:''' ...and already caught one tonight who tried to add 451 links to [[Legacy:Brush Preservation|Brush Preservation]]...  :D

'''Tarquin:''' I don't think pages have that many external links. At most I usually see maybe up to 5 in the External Links section. Most links on wiki pages are internal. Good work Mych! :D

'''strider:''' Brilliant idea Mychaeel!

'''Mychaeel:''' This afternoon, the spam trap caught a spammer who added the modest amount of 12 links to [[Legacy:Using The Wiki|Using the Wiki]] and thus got temporarily banned at first.  The automatic notification gave me the opportunity to make the ban permanent and revert the changes within minutes.

'''Mychaeel:''' By the way, I'm getting down to business about the &quot;file an official complaint&quot; part.  I've done so for the last two spammers, and we'll see what the response is.

'''Wormbo:''' I can't say which of these two good news I like better. :D

'''strider:''' You can now add rel=nofollow to anchor tags to make it so external links aren't counted in search engine stats.  Wikipedia have already added this feature, and doing this might help kill spam.

'''Mychaeel:''' Spammers don't spam because spam is effective; it's sufficient that somebody ''tells them'' it is.  (That's especially evident in those spam attacks on our wiki with code that didn't even render as links...)  Reducing the effectivity of spam won't help, because the effectivity of spam is a non-issue to spammers.  They ''believe'' it's effective (or are made to by people who sell them spamming services and software), and that's enough.  Spam has become a self-sufficient phenomenon.

That said, the spam filter just caught another one adding 536 links to &quot;Inside The Death Chamber - Exploring Executions&quot; before any damage could be done.  Funnily enough, we don't even have that page.
:'''Wormbo:''' I've removed the wiki link markup to &quot;Inside The Death Chamber - Exploring Executions&quot; from your comment. Someone created that page only with the word &quot;You&quot; on it. After I deleted it, it was created again with the same content.

'''Mychaeel:''' Caught three more in the course of the afternoon before they could do damage.

'''Mosquito:''' Have you considered passing this around to other wikis, I'd imagine some are getting hit pretty hard these days.

'''Mychaeel:''' Actually, I pinched the basic idea for this filter from [[MeatBall:ShotgunSpam]], so other wikis are probably already aware of this idea.  Our implementation just adds auto-banning and email notifications.

'''Mychaeel:''' One of the ISPs I sent a complaint to has sent a reply:

{{innerbox| Dear Sir/Madam,

 

 We have already issued a warning to the user to ensure that such activity is not repeated in future. Hence we would request you to consider this case as closed. The Trouble Ticket Number for this complaint is '2973'.

 

 Please do contact us if the incident repeats again.

 

 Assuring you the best of our services.

 

 Thanking you.

 

 Yours Sincerely,

 

 Antiabuse Support 

}}

E-mail : Antiabuse.Support@relianceinfo.com 

Phone : 91-(022) -30388464

'''Mychaeel:''' ...and one more:

{{innerbox| Hi,

 

 we will take the necessary actions to stop this kind of illegal activity.

 

 Ystävällisin terveisin 

}}

Best Regards 

EUnet Finland 

puh +358 9 4243 3205 

fax +358 9 4243 0601 

Linnoitustie 4 B (Alto) 

02600 Espoo

----

'''EntropicLqd:''' Is the [[Legacy:Recent Changes|Recent Changes]] page indexed?  It occured to me that the recent page reverts were not so much an attempt at vandalising the Wiki page but merely a way of getting a single link listed many times by placing the target link in the change summary.  Might be worth preventing URLs from being placed in the change description.

'''Mychaeel:''' Pages whose URLs look like &lt;code&gt;http://wiki.beyondunreal.com/wiki?...&lt;/code&gt; are exempt from indexing, and after reversal, the spammy summary is removed from [[Legacy:Recent Changes|Recent Changes]] too.  Of course, spammers wouldn't even care about that subtlety if we put it on a flashing banner across the editing page.

Perhaps you're right with that idea, though I'm unclear about why someone would want a plain-text URL spammed somewhere; it's not like any search engine would consider that a &quot;link&quot; to increase the URL target's PageRank.

I could add a bit of code that prevents a page from being saved (and redirects the user elsewhere to an explanation) when an URL is placed in the summary field (and put a hint not to do that in the caption text below).

By the same token, I'll probably extend the link counting algorithm to include prior page revisions created by the same user as well.  I had anticipated this development for a while &amp;ndash; it's a well-established fact that spammers' motivation to spam is not impaired by even the most coarse hints that it's ultimately futile even if it manages to get past any technical measures, as demonstrated by waves of spam emails crafted to bypass spam filters.  I just hadn't been able to get myself to actually implement that.

...which reminds me of shooting off two complaints about those recent spammers.

'''Birelli:''' I think the last two are actually the same spammer. Two spams to a *.*.su both for gambling (presumably) spamming in an unusual way, it's probably the same one. And given that one IP is on the East Coast US, the other in Australia, it's a fair bet that it's a redirect. 

----

'''Joe@Chongqed:'''  Hi.  I saw your Temporary_Read-Only page.  I like the idea.  I added it to our page discussing [http://wiki.chongqed.org//WikiSpam spam protection methods].  I am calling it AutoBan for now, do you have any better name?  You mentioned above the idea comes from ShotGunSpam.  Is this method unique enough to deserve a section of its own or should I just add to our description of ShotGunSpam?

----

'''MythOpus:''' Awhile ago I caught a spammer who edited the actual hyper link of links that were already on a few pages.  I don't think the auto ban incorporates that so is there any way we can shut those spamming possibilities down?  Also, it may be a little over the top but, a captcha system might be a good idea.  Or, we can fake one :)  Make a fake little picture, put it on the editing pages and spam bots would have to type in the special number.  If someone get's a spam bot in we can simply change the pic to something else and change the pass?

'''zugy:''' Hmmm-I wonder...It can't be too hard to generate a security code thing, would it? You see them everywhere, these days.... 

'''Draconx:''' Guah!  That temp ban thing raped me :(  I revert the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page which has &lt;b&gt;twenty-six&lt;/b&gt; external links on it and get owned for 4h 20m :(

'''Mychaeel:''' I had undone your temporary ban within minutes of getting the notification email.  Thanks for the trouble.  :-)

'''zugy:''' Bummer-I was gonna revert that myself except- 1) didn't know how and 2) thought it might be an admin-only kind of thing...

----

'''Guest:''' Mych, have you considered making this page auto-update when a ban or other relevant event took place? I know a feature like this wouldn't code itself, but it seems like you spend a lot of time updating the table.

'''MythOpus:''' Mych, are you have the time of your life or what?

'''Mychaeel:''' Actually, manually keeping track of the auto-bans gets tiring after the first hundred or so.  I'd rather see spammers discouraged or (gasp!) on their way of understanding that what they're doing is wrong on so many levels.

'''MythOpus:''' I'll be waiting for the day when that happens.  Sadly, most spammers these days are getting paid big bucks to do what they do.  It's a shame.  You should consider the auto-update idea though.  I don't think it would be too hard to manage?

'''Mychaeel:''' Mostly I want to confirm that it's really a spamming attempt and not a false positive before I log anything anywhere.

'''T1:''' I have an idea that may work to help slow down people from writing bots that change large amounts of pages with only single links, therefore avoiding the autoban. You could prevent non-registered users from doing many edits at once, by only allowing 1 edit every 10 seconds. Basically you would store a global &quot;last edit time&quot; and every time non-registered-user makes an edit, check if there has been an edit in the last 10 seconds by a non-registered-user (it doesn't matter if it's the same or a different one). If so, then you'd get a new page that said, please wait X seconds, but it still has the textbox with what you wrote so you don't lose your submission. This would prevent that situation some referred to farther up the page where there was bot that was spamming faster than wikizens could revert. The non-registered bot would be slower, but it wouldn't affect non-registered users who aren't spamming very much. You might say that the bot would then simply register before spamming, but you could put a ten second limit on registering also, therefore each time it made an edit, it would still be slower because the autoban or a good wikizen would probably catch it. The only problem I forsee is people that don't register and want to help against a bot, they may not be able to do much except slow it down if they get a lucky shot into the minimal gap between the end of the ten seconds and the next bot attack.

Also, if the ENTIRE text of the page is deleted and replaced with more than two or three links and no non-links, isn't that an obvious spam attempt that should be auto-detected, even if it's less links than the standard autoban link limit?

'''craze:''' i think the Wiki just got a large dose of chongqing, tryed to see if i got my help desk question answered, and woulkda ya look at tehh, massive page edits, all with ad links in em'....

'''T1:''' Another bot prevention method: If some one adds the same text to more than two pages, autotempban. Happens a 3rd time? it's an autopermaban. Now, if only someone would implement these things, it'd slow dow/inconvience/prevent some spammers. Also, the statistics shouldn't be on this page because then probably no one notices actual discussion on this page because they think it's the stats being updated..

'''El Muerte:''' I think the spam check needs a fix to also scan for bad defined links. In this case the bot should have gotten an tempban because he submitted 6 links, but the links were not correct unrealwiki markup.

'''Tarquin:''' I'm locking the wiki for a bit.

'''Wormbo:''' Hmm, all those changes came from different IPs. A coordinated distributed spam attack? I think I smell a botnet.

'''Tarquin:''' I'm looking at our spam detection code, and Mych's use of regexps is beyond me :(

'''Mychaeel:''' The spam trap ''did'' spring &amp;ndash; once for each of the 41 different IP addresses the spammer used.

Currently, the spam trap is very simple.  Yes, we can make it more sophisticated, but in the end it'll always be just a small Perl script, while spammers will always possess some level of human intelligence (even though the fact that this small Perl script of ours manages to outsmart about 99% of them speaks volumes about it).  So, while we can put huge amounts of brains into creating a script which catches an even higher percentage of spammers, we'll still never reach the point where we can be sure it'll catch ''all'' spammers.  I don't think we can currently get any better effort/success ratio than we have already.

Several trusted wikizens here have been given a secret URL to lock the wiki in case of emergency.  Why did nobody use it?

'''T1:''' I know perl myself, and I'd love to lend a hand in improving the script. In my opinion there is nothing that cannot be improved upon, and I find programming much more fun than wikignoming. 99% is still not 100%. Besides, my hard drive on my main pc is messed up, and I have absolutely NOTHING to do right now, so I'd absolutely love to do some semi-constructive programming.

Also, I'm checking for other wikis that got hit by the same spammer, and I've found these so far:

http://www.intertwingly.net/wiki/pie/FrontPage

http://wiki.python.org/moin/AtAudioSprint?action=diff

http://wiki.43folders.com/index.php/Special:Recentchanges

http://wiki.kde.org/tiki-index.php?PHPSESSID=4942f9c1fedf2525cddb6c6e878ea769

'''Tarquin:''' Mych, my thought was actually to make the trap ''simpler'' &amp;ndash; to check purely for URLs, rather than URL links. But if it caught the spammer... cool :) BTW, what does '&amp;#' do in the regexp? (line 4388)

'''T1:''' '&amp;#'????? That's not even in the man page.

:'''Mychaeel:''' It looks for the string &quot;&amp;#&quot; ;-) &amp;ndash; those pattern matches are part of the &quot;old&quot; spam detection code which was added when wikis were flooded by &quot;chinese spam.&quot;  The auto-banning URL filter is somewhere else and indeed simply looks for occurrences of &lt;code&gt;/UTF8_REPLACEMENThttp:/i&lt;/code&gt;.

'''craze:''' although i know very little on the subject, how about having the spam detection script(when tripped) begin to traceroute all edits within the next x secconds/x minuites and check for matching IPs near the end of the list, just to make sure its not just one person with a network of IPs  attacking teh Wiki...(this probably makes no sence...)

'''El Muerte:''' how about using DNSBL to check the host? The wiki doesn't have that many edits so the overhead might be low. Although in the last case it wouldn't have stopped the sammer since he was using a zombie network.

'''Switch`:''' How about adding user registration and blocking anonymous posting? Maybe not exactly in spirit of wiki but this is &quot;The Unreal Engine Documentation Site&quot; for developers by developers first, wiki second.

'''craze:''' ahh thats thwe word i was thinking of, zombie, just check for a common IP twards the end after it starts going through ISPs, just check if someone after the ISPs IP has something after it, if i got this right, IPs twards the end of the list would start to match(xept the last one) in the trace route, then if it starts matching abd the anti spam scripts has been tripped just discard the edit

----

'''MythOpus:''' Another spam attempt just occured.  The spammer mass joined and logged in with several usernames and link spammed some pages.  Apparently, he thought he could trick us by deleting some of the links on the pages as to make us think he deleted all of the links.  When will the maturity level of these 'geniuses' level off with normal standards?

'''Wormbo:''' Did we already discuss these number/letter combinations presented through an image and the user has to type it in? We could add something like this to the edit page for each IP that didn't properly respond to an image yet. After this verification the user or IP won't have to do it again. If verification fails the user will only see the preview page. (so the edits aren't lost)

'''T1:''' Same spammer as last time.

http://wiki.kde.org/

They had such an image verification system, spammers hit them just as hard as us last time, if not harder.

----

'''Wormbo:''' We need a way to revert pages with many links. [[Legacy:Wiki Integration/Browser Sidebar|Wiki Integration/Browser Sidebar]] got overridden with spam and attempts to revert it result in permanent read-only, without any changes to the page.

'''Mychaeel:''' Short-term solutions: Admins are now exempt from the link threshold (should have been that way from the start).  Long-term solution: Reverting a page to a previous version should be allowed by anyone no matter what it does to the number of links.

----

'''Mychaeel:''' That &lt;code&gt;display:&lt;/code&gt;&lt;code&gt; none&lt;/code&gt;-type spam is blocked now as well.

----

'''Tarquin:''' A lot of the links here go to 404s on the Chongqing site.

'''Kartoshka:''' 404s because whoever added the links to the Chongqing page didn't submit them to chongqed.org?</text>
    </revision>
    <revision>
      <id>2456</id>
      <timestamp>2006-07-18T04:50:03Z</timestamp>
      <contributor>
        <ip>218.150.32.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.areaseo.com'&gt;pagerank main&lt;/a&gt; : [http://www.areaseo.com improve pagerank default] - [HTTP://www.areaseo.com improve pagerank default] : [PageRank 11|http://www.areaseo.com] - [PageRank 11|HTTP://www.areaseo.com] : http://www.areaseo.com/improvepr/ : [[http://www.areaseo.com google rank 20]] : [[http://www.areaseo.com | pagerank 5]] : &quot;online pr16&quot; http://www.areaseo.com : [http://www.areaseo.com|google pr] &lt;/u&gt;There are two types of &quot;bans&quot; (actually, read-only states) imposed by the automatic spam filter:

* '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Temporary Read-Only|Temporary Bans]]''' are imposed for adding several, but not too many links to a page.  The page (with the links) is saved, and the user is put on read-only for ten minutes for each link he or she added.

* '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Permanent Read-Only|Permanent Bans]]''' are imposed for adding too many links to a page.  The changes to the page are discarded, and the user is put on read-only permanently.

I'm intentionally keeping the exact number of links required to trigger either of those cases vague.  I'd rather not have spammers fine-tune their spamming attempts using that information.  ;-)

In both cases, an email containing time, IP address, modified page name and submitted page content is dispatched to the [[Legacy:Wiki Admin|wiki admin]]s.  This allows them to react quickly to temporary bans (to revert the changes and make the ban permanent if a spammer was caught, or to undo the automatic ban on false positives), and it serves as proof when filing complaints to the spammers' ISPs.

If somebody would like to be added to the list of users receiving those notification emails, drop [[Legacy:Mychaeel|Mychaeel]] a line.

See also [[Legacy:Chongqing Page/Statistics|Chongqing Page/Statistics]].

==Discussion==

'''Tarquin:''' Just for added fun, I have hacked our page database so even the old revision of the page this guy edited leads to chongqed.org  bwahahahaha :D

'''RavuAlHemio:''' :D You're kicking the spammers anywhere you can, huh? :D

'''anonymous:''' Yes indeed folks go on treating them *******s the hard way. I had real troubles with spammers myself glad to see some action

'''Foxpaw:''' The ones I just posted didn't really have any keywords, not ones legible on my PC, anyway, so I just replaced the keywords with the URL of the sites..

'''MythOpus:''' This spamming is making me mad.  Grr.  I suggest we keep it open to the public to edit as they see fit, but I think we should have people sign up for the privelage.  We could really make use of the passwords in the preferences menu for this and it will help with the spam problem and if it continues then we could easilly find out EXACTLY who is doing it.  Of course, that may go against what this wiki was meant for but still...  Desperate Times, Desperate Measures.

'''Graphik:''' Hello Myth. :)

Times aren't desperate, just annoying. ;) I thought of the same thing, but in the end it is like you said, that's not what a wiki is meant for. Eventually they'll give up; it's very unsatisfying to see your work undone again and again. We already can find out who it is without registration, and I just banned one person today. :)

'''MythOpus:''' Note to all Spammers... Bow now, or bow later... muhahahahaphmuhahaMPH!!

'''Mychaeel:''' I don't really believe in technical means to stop spammers, but since those asian spam links are easy enough to spot and never used anywhere else on the Wiki, I've added a bit of code to the script that redirects people trying to save a page which contains such a link.  Try it yourself...  :-)

'''Foxpaw:''' The spamming has been intense lately. Is there a known reason for the surge in spamming? I don't remember it ever happening less than a year ago, not it seems within the last week or so it's been several spamvertizements a day.

'''Mychaeel:''' I think the one and only reason is that spammers have discovered wikis.  Now, true to their &quot;I'm the only thing that matters in the world&quot; attitude, they hook onto wikis everywhere in order to milk them for whatever benefit they see in doing so until they're dead and useless &amp;ndash; like a deadly virus.  Fortunately for us, their limited view of the world doesn't quite match reality, so there's still hope for the social rest of the world.

'''Tarquin:''' Does Google's bot see old revisions of pages?

'''Mychaeel:''' Our [http://wiki.beyondunreal.com/robots.txt robots.txt] wasn't properly set up to prevent this when I checked (only disallowing access to &lt;code&gt;/cgi-bin/wiki.pl?action=&lt;/code&gt;, not &lt;code&gt;/wiki?action=&lt;/code&gt;).  I've fixed this.

'''OverloadUT:''' I noticed that if you check the &quot;minor edit&quot; box when editing a page, it does not jump to the top of the list on the [[Legacy:Recent Changes|Recent Changes]] page. If a spammer figured this out, couldn't they check that box on all their spammed pages, and it would take much longer to find them?  Or is there some sort of protection against this?

'''Tarquin:''' Yes: set your preferences to see minor edits! :)

'''Mychaeel:''' The [[localcgi:chongqme|chongqing tool]] I added today makes is pretty simple to chongqify stuff added by a spammer; however, it doesn't register those keywords at http://chongqed.org.  The chongqing links still do their purpose, but they lead to an unimpressive &quot;The keyword [...] does not seem to be in the database&quot; page.

'''Foxpaw:''' Just thought of something - this page is going to get huge, and sufficiently huge pages seem to time out when you try to save them - that could become a problem as this page grows. The chongquing tool was very handy though, and just in time, as this spamming binge was enormous.

'''Parallax:''' Pagerank on google is based on the number of links into the linking page. We should have every single page in the wiki containing a link to this Chongqing page so that it gets a very very high page rank. Such a link to this page could be very discreet. That would mean that this page would have more authority when it comes to destroying the page rank of the spammers.

'''Tarquin:''' Yup. We could add it to the footer (in a small font) or something.

'''Foxpaw:''' Not only would that greatly increase loading times for pages on the wiki, but I don't think that it would work. Search engine spiders probrably only recognize a given link/keyword combination once per domain - otherwise spammers wouldn't have to spam wikis and blogs, they could just spam one domain (that they controlled) a whole ton of times.

'''Mychaeel:''' I don't think anybody's talking about adding the links ''on'' this page to the footer &amp;ndash; it's about adding a link ''to'' this page to the footer.  That really wouldn't increase loading times a lot.

'''Wormbo:''' I've just removed over 50% of the links because they were duplicates. Please check that first if you add them so we can keep the page size within reasonable limits. Does linking with an URL as the link text actually help?

'''Halz''' Yeah those URL links under 'Miscellaneous' are less effective chongqing links, particularly as they all point to the same page, rather than specific parts of the chongqed.org database. Also the links like [http://spammers.chongqed.org/Effexor%20and%20weight%20loss Effexor and weight loss] are keywords which you haven't told chongqed.org about. To chongq  effectively, you have to sumbit the spammer to chongqed.org, wait for the keywords to be accepted into the database, and then link using the keywords. So a link like [http://spammers.chongqed.org/business%20transcription Business Transcription] is best. However any links to [http://www.chongqed.org chongqed.org] will help boost its general ranking. Also as Foxpaw was saying, links from various different domains is better than lots of links from just one page, so if you folks have your own homepage, put a link there too!

'''Savannahlion:''' Yep, I've been Chongqed. Initially, this &lt;insert appropriate insult here&gt; started by dumping a few links in the Sandbox. Simple enough, I simply banned him. Problem solved for a few months.

Then he returns, and creates two pages in his interest. Deleted them. A few days later he assaults about eight or so pages with piles of his links. I call him Mr. Seo, as a hint. Unfortunately, the tactic of simply Chngqing his links won't work too well. He's creating wiki links within existing text without regard for context. Links within code where the [ and ] would be misinterpreted. A spam link within the words Counter-Strike, which is woefully outside of the context. Even a link to his spam within a reference to Google. Completely random words. 

I created a patch to prevent his lame additions. This was before I realized Tarquin solved the problem but after 4 hours of site clean up, coding, patching, and testing and 16 hours at work.

I'm going to look intto creating a Chongq page to support all of this. But the details of implemenation are kind of hazy. I'm going to have to mull over implementation details after work. Thank you Tarquin for pointing me in the right direction. But I would still like to pick your brain personally. IRC, ICQ, something.

'''Tarquin:''' A Chongq page simply links to the Chongq site to damage the spammer's google rating. I'm not in a position at the moment to be often on IRC, so you're best off reading up at the Chongq site to see how it works, or catching another wiki admin on our channel. Good luck dealing with this guy. Does his IP change a lot? You can always try banning him. Or you can hack to wiki code to refuse to save edits containing certain words or URLs.

----

'''Zxanphorian:''' OMG to all of those sites!

'''Tarquin:''' I'm thinking we should perhaps post on BuF to ask peopel to help the wiki fight spammers by putting a link to this page on their websites. What do you all think?

'''Foxpaw:''' Hrmm. That would boost the pagerank of this page, but not of Chongqed.org. If possible, copying the text from this page to a google-indexed page on their own site would probrably work better. That way Chongqed.org gets a higher cumulative rank as opposed to those referral links being divided among two sites (here and Chongqed.org).

At least, I don't THINK that being google has a heirarchial sort of system where a link to this page would be recognized as an indirect link to Chongqed.org.

'''Tarquin:''' We're not trying to raise the rating of Chongqed.org, we're trying to connect the keywords the spammers care about with the link to Chongqed.org. So yeah, copying this content works too, but according to the guys at Chongqed.org, making this page highly-linked to will be good too.

'''Foxpaw:''' Err, well, yes, but like I said, I don't think that linking here from elsewhere will do anything except raise the pagerank of this page, with the keywords used to link here. I wouldn't expect it to have any effect on the pagerank of Chongqed.org in combination with the keywords here, as I don't think that google counts indirect references like that. 

However, if they say it will work, I'll take their word for it.

'''ElMuerte:''' we need some magic for this page, e.g.:
* links on this page are read from an arbitrary file
* to add new chongqing links use an addition script, this script will:
** check for duplicates
** ... do more? ...
* Clearly mark the link to the add script, like: &quot;If you want to add spam to this site, please use the following link&quot; 

This makes things easier:
* no duplicates
* no high loading/saving/editing time for this page
* easier to catch new spam on this page

'''Mychaeel:''' I was thinking about extending the [[localcgi:chongqme|Chongq My Links!]] script with duplicate-removal functionality &amp;ndash; I just didn't get around to doing it yet.  (Now I've got my computer set up at home again, so chances are rising that I'll find the time soon.) &amp;ndash; Anyway, I find it amusing that this page is being the main target for spammers these days...  :p

'''Foxpaw:''' It seems like the logical page to spam, if you think about it. Not only do you get the normal &quot;benefit&quot; of posting your links, but you remove any of your links that may have been chongqed previously too.

'''Mychaeel:''' True... though that explanation implies that spammers were that smart, which appears hardly plausible to me (just look at the recent spam attempts &amp;ndash; the link tags were so incompetently crafted that they didn't even work). &amp;ndash; Maybe this sentence from the edit page header is what makes spammers paste their links here: &quot;Note that old page revisions aren't indexed by Google, but the Chongqing Page is.&quot;

'''Joe@Chongqed:''' Hi.  You guys are doing some good chongqing here, thanks.  I just wanted to add to what Tarquin said we said about linking (which I had forgot myself).  By increasing the PageRank for this page it gives the links here more credibility and should help their PageRanks too.  Links from a page with higher PageRank are more valuable.  As mentioned above, links from your footer or sidebar on every page would help the PageRank of this page.  It would also help the PageRank of [http://chongqed.org chongqed.org] if you linked from every page, but the purpose of chongqed.org is to remove junk from wikis.  While more links are great we don't want to clutter up people's wikis so are happy with how you guys are doing it.

I also want to invite you guys to our [http://wiki.chongqed.org chongqed wiki] in case you missed it, its a newer addition.  We use it to discuss chongqing ideas, spammers, antispam protection, etc.  It has been up long enough to attract spammers though, it shows how really stupid spammers are that they attack chongqed.org, not out of revenge, just regular spamming.  We have been learning a lot more about spammers recently.  So far all the ones that have attacked us have found the pages by searching for other spammer's URLs.  They let the other spammers do the dirty work of finding pages where their spam will stay long enough for Google to see it.  So by keeping a clean wiki you should attract fewer spammers.  Because we list lots of spammer URLs (though not links) our page appears to spammers to be a good target.  Although we hate spam, we like being spammed on our wiki, it makes chongqing them that much easier and more fun.

'''Graphik:''' Thanks for the information on your fine service.

I tried to post this once before, but there was an edit conflict; this page was spammed. :rolleyes:

I'm not sure if the links I reverted should be chongqued from here. They were rather 'adult' in nature and might violate  BU's 'no links to porn' hosting condition (In spirit, anyway).

'''Mychaeel:''' Chongqed links point to http://chongqed.org, not porn (unless Chongqed.org has changed its agenda since last time I checked).  So just chongq ahead!

'''Graphik:''' Done. Damn this page is going to be long after a while, so even my cable connection (much more a dial-up user) will start to struggle with it. I suggest that we create a subpage to contain the spammed links. The Chongq My Links! tool can automagically add them to the subpage instead of linking back to here to add them. &lt;insert better-thought-out variant of that idea here&gt;

'''Mychaeel:''' Moved the discussion to a subpage.

'''Graphik:''' An excellent idea, but that doesn't solve the problem of having to load the parent page to chongq links.

'''Mychaeel:''' Right, but neither would keeping the discussion on the main page and putting the links on the subpage...

'''Graphik:''' Ah, I believe there is a misunderstanding. The discussion is being on this page is an excellent idea, as I said.

I was suggesting that the Chongq My Links tool not be located on the same page as the spammed links repository. That way, the tool could automatically add the links to the Chongqing Page without the user ever loading it.

'''Mychaeel:''' Auto-adding links to the [[Legacy:Chongqing Page|Chongqing Page]] through the Chongq My Links! tool isn't in yet (not as trivial as it may sound), but I've added functionality to sort and remove duplicates from the list: Just copy the existing chongqing links into the second textbox and press &quot;Sort and Remove Duplicates&quot;.

----

'''Mychaeel:''' The most recent spammer added the following (badly transcribed) Russian comment amidst his spam links: &quot;Ne udaliyt &amp;ndash; derju pod kontrolem&quot; (followed by a great many exclamation marks).  My father, who knows Russian, tells me that this can be translated as &quot;Don't remove &amp;ndash; I'm keeping it under control!&quot;  :D

'''captaink:''' If you Google the quote, it leads to a Russian SEO forum. o_0

'''Zxanphorian:''' lol

----

'''xX)(Xx:''' When i try to edit a page ( [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] i get sent to the chongqing page, even though im not spamming, i even get sent here when i try to preview what ive done, i think it might be because there is already an off-wiki link there? Or perhaps it doesnt like my IP hehe, well anyway, im not trying to spam, is it possible to find out why this is happening?

'''Tarquin:''' The problem is the phrase 'bGravity...Zone' (without the dots). We set the script up to block a guy who kept writing 'GraViTy...Z'. I'll fix it tomorrow.

'''xX)(Xx:''' Thanks Tarquin :)

Damn spammers :(

'''Wormbo:''' The guy was here again. This time he spammed &quot;GRav.IT.Z&quot; and various dots on several pages and from several IPs.

BTW: The Chongq My Links tool sorts case-insensitive, but removes duplicates case-sensitively based on that sorting. The result is that we get the same key words repeating, e.g. &quot;sports betting&quot;, &quot;Sports Betting&quot;, &quot;sports betting&quot;, &quot;Sports Betting&quot; and so on.

----

'''Mosquito:''' This one has to be the worst yet.

If it wasn't for the quick acting of the BU admin it might not have stopped until the whole wiki was toast.

'''Foxpaw:''' Erm.. I noticed some pages I ended up reverting to their spammed state. I was reverting in batches of 30 or so pages simultaneously so there was some delay between when I checked the recent changes list to when I reverted the page.

'''Mosquito:''' Fair enough. Though, when it came to the page the speed in which the whole spamming was happening was incredible. It would revert one page and then 3 more would be spammed. Coincidentally enough I had the platoon theme playing on my playlist when I loaded the recent pages for the first time

'''Tarquin:''' I expect the spammer was running a bot. :(

'''EntropicLqd:''' Couldn't we update the Edit/Save page functionality to randomly generate the name of the submission form and form elements and store them on the user's session.  Then the update script could compare the fields received with the names held on the session and if they don't match then the update is not performed.  If the labels on the buttons were either images (with generated names) or selected from a larger pool of possible labels (e.g. Save, Update, Store Changes, you get the idea) then you'd effectively disable a bot as it would have nothing to work with.  Hopefully I've explained what I mean.

'''El Muerte:''' Here's an implementation idea that would stop bots. Add an hidden field that contains a hash of the page name and some other stuff. When an edit is submitted the hash is checked to see if it's correct. This way you always have to visit the edit page and can't use an automated POST script. e.g. hash = md5(pageTitle+userAddr+secretKey) . When the submission doesn't have the correct hash the edit page is popped up again with your edited text. This way when you get a new IP assigned in the meanwhile your edit won't be lost.

'''Mychaeel:''' That's a pretty smart idea, I think.  Right now most of the spam seems to be blocked by the link filter, but I'll look into implementing the hash idea as well.

----

'''Mychaeel:''' I've added code that automatically puts people who add too many links to a page on read-only (with a &quot;low&quot; threshold which only causes a temporary ban and a &quot;high&quot; one that causes an immediate permanent ban).  It also dispatches an email to the wiki admin in those cases to ensure they can react in a timely manner if necessary.

'''Foxpaw:''' How many links is &quot;too many?&quot; It seems like a person who was refactoring a page or merging two pages might add a number of links in a single edit and trip the ban.

'''Mychaeel:''' I've currently defined 15 new external links as &quot;too many.&quot;  (Between 5 and 14 new external links, the user is temporarily put on read-only; no harm done by that.  Just sit it out or wait until an admin undoes the auto-ban before it times out.)  I doubt many pages even contain that number of external links.

'''Mychaeel:''' ...and already caught one tonight who tried to add 451 links to [[Legacy:Brush Preservation|Brush Preservation]]...  :D

'''Tarquin:''' I don't think pages have that many external links. At most I usually see maybe up to 5 in the External Links section. Most links on wiki pages are internal. Good work Mych! :D

'''strider:''' Brilliant idea Mychaeel!

'''Mychaeel:''' This afternoon, the spam trap caught a spammer who added the modest amount of 12 links to [[Legacy:Using The Wiki|Using the Wiki]] and thus got temporarily banned at first.  The automatic notification gave me the opportunity to make the ban permanent and revert the changes within minutes.

'''Mychaeel:''' By the way, I'm getting down to business about the &quot;file an official complaint&quot; part.  I've done so for the last two spammers, and we'll see what the response is.

'''Wormbo:''' I can't say which of these two good news I like better. :D

'''strider:''' You can now add rel=nofollow to anchor tags to make it so external links aren't counted in search engine stats.  Wikipedia have already added this feature, and doing this might help kill spam.

'''Mychaeel:''' Spammers don't spam because spam is effective; it's sufficient that somebody ''tells them'' it is.  (That's especially evident in those spam attacks on our wiki with code that didn't even render as links...)  Reducing the effectivity of spam won't help, because the effectivity of spam is a non-issue to spammers.  They ''believe'' it's effective (or are made to by people who sell them spamming services and software), and that's enough.  Spam has become a self-sufficient phenomenon.

That said, the spam filter just caught another one adding 536 links to &quot;Inside The Death Chamber - Exploring Executions&quot; before any damage could be done.  Funnily enough, we don't even have that page.
:'''Wormbo:''' I've removed the wiki link markup to &quot;Inside The Death Chamber - Exploring Executions&quot; from your comment. Someone created that page only with the word &quot;You&quot; on it. After I deleted it, it was created again with the same content.

'''Mychaeel:''' Caught three more in the course of the afternoon before they could do damage.

'''Mosquito:''' Have you considered passing this around to other wikis, I'd imagine some are getting hit pretty hard these days.

'''Mychaeel:''' Actually, I pinched the basic idea for this filter from [[MeatBall:ShotgunSpam]], so other wikis are probably already aware of this idea.  Our implementation just adds auto-banning and email notifications.

'''Mychaeel:''' One of the ISPs I sent a complaint to has sent a reply:

{{innerbox| Dear Sir/Madam,

 

 We have already issued a warning to the user to ensure that such activity is not repeated in future. Hence we would request you to consider this case as closed. The Trouble Ticket Number for this complaint is '2973'.

 

 Please do contact us if the incident repeats again.

 

 Assuring you the best of our services.

 

 Thanking you.

 

 Yours Sincerely,

 

 Antiabuse Support 

}}

E-mail : Antiabuse.Support@relianceinfo.com 

Phone : 91-(022) -30388464

'''Mychaeel:''' ...and one more:

{{innerbox| Hi,

 

 we will take the necessary actions to stop this kind of illegal activity.

 

 Ystävällisin terveisin 

}}

Best Regards 

EUnet Finland 

puh +358 9 4243 3205 

fax +358 9 4243 0601 

Linnoitustie 4 B (Alto) 

02600 Espoo

----

'''EntropicLqd:''' Is the [[Legacy:Recent Changes|Recent Changes]] page indexed?  It occured to me that the recent page reverts were not so much an attempt at vandalising the Wiki page but merely a way of getting a single link listed many times by placing the target link in the change summary.  Might be worth preventing URLs from being placed in the change description.

'''Mychaeel:''' Pages whose URLs look like &lt;code&gt;http://wiki.beyondunreal.com/wiki?...&lt;/code&gt; are exempt from indexing, and after reversal, the spammy summary is removed from [[Legacy:Recent Changes|Recent Changes]] too.  Of course, spammers wouldn't even care about that subtlety if we put it on a flashing banner across the editing page.

Perhaps you're right with that idea, though I'm unclear about why someone would want a plain-text URL spammed somewhere; it's not like any search engine would consider that a &quot;link&quot; to increase the URL target's PageRank.

I could add a bit of code that prevents a page from being saved (and redirects the user elsewhere to an explanation) when an URL is placed in the summary field (and put a hint not to do that in the caption text below).

By the same token, I'll probably extend the link counting algorithm to include prior page revisions created by the same user as well.  I had anticipated this development for a while &amp;ndash; it's a well-established fact that spammers' motivation to spam is not impaired by even the most coarse hints that it's ultimately futile even if it manages to get past any technical measures, as demonstrated by waves of spam emails crafted to bypass spam filters.  I just hadn't been able to get myself to actually implement that.

...which reminds me of shooting off two complaints about those recent spammers.

'''Birelli:''' I think the last two are actually the same spammer. Two spams to a *.*.su both for gambling (presumably) spamming in an unusual way, it's probably the same one. And given that one IP is on the East Coast US, the other in Australia, it's a fair bet that it's a redirect. 

----

'''Joe@Chongqed:'''  Hi.  I saw your Temporary_Read-Only page.  I like the idea.  I added it to our page discussing [http://wiki.chongqed.org//WikiSpam spam protection methods].  I am calling it AutoBan for now, do you have any better name?  You mentioned above the idea comes from ShotGunSpam.  Is this method unique enough to deserve a section of its own or should I just add to our description of ShotGunSpam?

----

'''MythOpus:''' Awhile ago I caught a spammer who edited the actual hyper link of links that were already on a few pages.  I don't think the auto ban incorporates that so is there any way we can shut those spamming possibilities down?  Also, it may be a little over the top but, a captcha system might be a good idea.  Or, we can fake one :)  Make a fake little picture, put it on the editing pages and spam bots would have to type in the special number.  If someone get's a spam bot in we can simply change the pic to something else and change the pass?

'''zugy:''' Hmmm-I wonder...It can't be too hard to generate a security code thing, would it? You see them everywhere, these days.... 

'''Draconx:''' Guah!  That temp ban thing raped me :(  I revert the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page which has &lt;b&gt;twenty-six&lt;/b&gt; external links on it and get owned for 4h 20m :(

'''Mychaeel:''' I had undone your temporary ban within minutes of getting the notification email.  Thanks for the trouble.  :-)

'''zugy:''' Bummer-I was gonna revert that myself except- 1) didn't know how and 2) thought it might be an admin-only kind of thing...

----

'''Guest:''' Mych, have you considered making this page auto-update when a ban or other relevant event took place? I know a feature like this wouldn't code itself, but it seems like you spend a lot of time updating the table.

'''MythOpus:''' Mych, are you have the time of your life or what?

'''Mychaeel:''' Actually, manually keeping track of the auto-bans gets tiring after the first hundred or so.  I'd rather see spammers discouraged or (gasp!) on their way of understanding that what they're doing is wrong on so many levels.

'''MythOpus:''' I'll be waiting for the day when that happens.  Sadly, most spammers these days are getting paid big bucks to do what they do.  It's a shame.  You should consider the auto-update idea though.  I don't think it would be too hard to manage?

'''Mychaeel:''' Mostly I want to confirm that it's really a spamming attempt and not a false positive before I log anything anywhere.

'''T1:''' I have an idea that may work to help slow down people from writing bots that change large amounts of pages with only single links, therefore avoiding the autoban. You could prevent non-registered users from doing many edits at once, by only allowing 1 edit every 10 seconds. Basically you would store a global &quot;last edit time&quot; and every time non-registered-user makes an edit, check if there has been an edit in the last 10 seconds by a non-registered-user (it doesn't matter if it's the same or a different one). If so, then you'd get a new page that said, please wait X seconds, but it still has the textbox with what you wrote so you don't lose your submission. This would prevent that situation some referred to farther up the page where there was bot that was spamming faster than wikizens could revert. The non-registered bot would be slower, but it wouldn't affect non-registered users who aren't spamming very much. You might say that the bot would then simply register before spamming, but you could put a ten second limit on registering also, therefore each time it made an edit, it would still be slower because the autoban or a good wikizen would probably catch it. The only problem I forsee is people that don't register and want to help against a bot, they may not be able to do much except slow it down if they get a lucky shot into the minimal gap between the end of the ten seconds and the next bot attack.

Also, if the ENTIRE text of the page is deleted and replaced with more than two or three links and no non-links, isn't that an obvious spam attempt that should be auto-detected, even if it's less links than the standard autoban link limit?

'''craze:''' i think the Wiki just got a large dose of chongqing, tryed to see if i got my help desk question answered, and woulkda ya look at tehh, massive page edits, all with ad links in em'....

'''T1:''' Another bot prevention method: If some one adds the same text to more than two pages, autotempban. Happens a 3rd time? it's an autopermaban. Now, if only someone would implement these things, it'd slow dow/inconvience/prevent some spammers. Also, the statistics shouldn't be on this page because then probably no one notices actual discussion on this page because they think it's the stats being updated..

'''El Muerte:''' I think the spam check needs a fix to also scan for bad defined links. In this case the bot should have gotten an tempban because he submitted 6 links, but the links were not correct unrealwiki markup.

'''Tarquin:''' I'm locking the wiki for a bit.

'''Wormbo:''' Hmm, all those changes came from different IPs. A coordinated distributed spam attack? I think I smell a botnet.

'''Tarquin:''' I'm looking at our spam detection code, and Mych's use of regexps is beyond me :(

'''Mychaeel:''' The spam trap ''did'' spring &amp;ndash; once for each of the 41 different IP addresses the spammer used.

Currently, the spam trap is very simple.  Yes, we can make it more sophisticated, but in the end it'll always be just a small Perl script, while spammers will always possess some level of human intelligence (even though the fact that this small Perl script of ours manages to outsmart about 99% of them speaks volumes about it).  So, while we can put huge amounts of brains into creating a script which catches an even higher percentage of spammers, we'll still never reach the point where we can be sure it'll catch ''all'' spammers.  I don't think we can currently get any better effort/success ratio than we have already.

Several trusted wikizens here have been given a secret URL to lock the wiki in case of emergency.  Why did nobody use it?

'''T1:''' I know perl myself, and I'd love to lend a hand in improving the script. In my opinion there is nothing that cannot be improved upon, and I find programming much more fun than wikignoming. 99% is still not 100%. Besides, my hard drive on my main pc is messed up, and I have absolutely NOTHING to do right now, so I'd absolutely love to do some semi-constructive programming.

Also, I'm checking for other wikis that got hit by the same spammer, and I've found these so far:

http://www.intertwingly.net/wiki/pie/FrontPage

http://wiki.python.org/moin/AtAudioSprint?action=diff

http://wiki.43folders.com/index.php/Special:Recentchanges

http://wiki.kde.org/tiki-index.php?PHPSESSID=4942f9c1fedf2525cddb6c6e878ea769

'''Tarquin:''' Mych, my thought was actually to make the trap ''simpler'' &amp;ndash; to check purely for URLs, rather than URL links. But if it caught the spammer... cool :) BTW, what does '&amp;#' do in the regexp? (line 4388)

'''T1:''' '&amp;#'????? That's not even in the man page.

:'''Mychaeel:''' It looks for the string &quot;&amp;#&quot; ;-) &amp;ndash; those pattern matches are part of the &quot;old&quot; spam detection code which was added when wikis were flooded by &quot;chinese spam.&quot;  The auto-banning URL filter is somewhere else and indeed simply looks for occurrences of &lt;code&gt;/UTF8_REPLACEMENThttp:/i&lt;/code&gt;.

'''craze:''' although i know very little on the subject, how about having the spam detection script(when tripped) begin to traceroute all edits within the next x secconds/x minuites and check for matching IPs near the end of the list, just to make sure its not just one person with a network of IPs  attacking teh Wiki...(this probably makes no sence...)

'''El Muerte:''' how about using DNSBL to check the host? The wiki doesn't have that many edits so the overhead might be low. Although in the last case it wouldn't have stopped the sammer since he was using a zombie network.

'''Switch`:''' How about adding user registration and blocking anonymous posting? Maybe not exactly in spirit of wiki but this is &quot;The Unreal Engine Documentation Site&quot; for developers by developers first, wiki second.

'''craze:''' ahh thats thwe word i was thinking of, zombie, just check for a common IP twards the end after it starts going through ISPs, just check if someone after the ISPs IP has something after it, if i got this right, IPs twards the end of the list would start to match(xept the last one) in the trace route, then if it starts matching abd the anti spam scripts has been tripped just discard the edit

----

'''MythOpus:''' Another spam attempt just occured.  The spammer mass joined and logged in with several usernames and link spammed some pages.  Apparently, he thought he could trick us by deleting some of the links on the pages as to make us think he deleted all of the links.  When will the maturity level of these 'geniuses' level off with normal standards?

'''Wormbo:''' Did we already discuss these number/letter combinations presented through an image and the user has to type it in? We could add something like this to the edit page for each IP that didn't properly respond to an image yet. After this verification the user or IP won't have to do it again. If verification fails the user will only see the preview page. (so the edits aren't lost)

'''T1:''' Same spammer as last time.

http://wiki.kde.org/

They had such an image verification system, spammers hit them just as hard as us last time, if not harder.

----

'''Wormbo:''' We need a way to revert pages with many links. [[Legacy:Wiki Integration/Browser Sidebar|Wiki Integration/Browser Sidebar]] got overridden with spam and attempts to revert it result in permanent read-only, without any changes to the page.

'''Mychaeel:''' Short-term solutions: Admins are now exempt from the link threshold (should have been that way from the start).  Long-term solution: Reverting a page to a previous version should be allowed by anyone no matter what it does to the number of links.

----

'''Mychaeel:''' That &lt;code&gt;display:&lt;/code&gt;&lt;code&gt; none&lt;/code&gt;-type spam is blocked now as well.

----

'''Tarquin:''' A lot of the links here go to 404s on the Chongqing site.

'''Kartoshka:''' 404s because whoever added the links to the Chongqing page didn't submit them to chongqed.org?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chongqing Page/Permanent Read-Only</title>
    <id>889</id>
    <revision>
      <id>2459</id>
      <timestamp>2005-01-14T18:55:58Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==You have been permanently put in read-only mode.==

The wiki has detected that you have added a large number of links to the page you previously edited.

'''Your changes have been discarded,''' and you have been automatically put in read-only mode indefinitely.

An email has been dispatched to the [[Legacy:Wiki Admin|wiki admin]]s.

==Don't panic! (...unless you're a spammer.)==

We'd prefer not to, but recent and continued spam attacks forced us to implement some sort of automated filter to prevent us from continually having to revert the mess they leave.

'''If you're not a spammer, you've got nothing to worry about''' &amp;ndash; you're just the unfortunate victim of the times we're living in.  Contact a [[Legacy:Wiki Admin|wiki admin]] to lift your read-only state; chances are that a wiki admin will do that themselves as soon as they get the automatic notification and realize you're not a spammer.

'''If you're a spammer,''' we'll file an official complaint with your ISP about this matter.  In case their response doesn't satisfy us, chances are that we'll ban their entire IP range.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chongqing Page/Statistics</title>
    <id>890</id>
    <revision>
      <id>2460</id>
      <timestamp>2005-11-02T06:58:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>bah :P</comment>
      <text xml:space="preserve">[[Legacy:Chongqing Page|Chongqing Page]] statistics:

{|

|-
|'''Month'''
|'''Automatic &lt;br /&gt;Temporary Bans'''
|False &lt;br /&gt;Positives
|'''Automatic &lt;br /&gt;Permanent Bans'''
|False &lt;br /&gt;Positives
|'''False &lt;br /&gt;Negatives''' 
|-
|10/2005
| style=&quot;text-align: right&quot; |'''44'''
| style=&quot;text-align: right&quot; |3
| style=&quot;text-align: right&quot; |'''11'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''0'''
|-
|09/2005
| style=&quot;text-align: right&quot; |'''0'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''13'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''1'''
|-
|08/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''43'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''4'''
|-
|07/2005
| style=&quot;text-align: right&quot; |'''14'''
| style=&quot;text-align: right&quot; |3
| style=&quot;text-align: right&quot; |'''115'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''4'''
|-
|06/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''14'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''1'''
|-
|05/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''4'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''0'''
|-
|04/2005
| style=&quot;text-align: right&quot; |'''0'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''5'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''4'''
|-
|03/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''10'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''3'''
|-
|02/2005
| style=&quot;text-align: right&quot; |'''2'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''5'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''2'''
|-
|01/2005
| style=&quot;text-align: right&quot; |'''2'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''8'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''1'''
|}

See also [[Legacy:Chongqing Page/Discuss|Chongqing Page/Discuss]]</text>
    </revision>
    <revision>
      <id>2461</id>
      <timestamp>2005-11-01T14:37:19Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>re*plonk*</comment>
      <text xml:space="preserve">[[Legacy:Chongqing Page|Chongqing Page]] statistics:

{|

|-
|'''Month'''
|'''Automatic &lt;br /&gt;Temporary Bans'''
|False &lt;br /&gt;Positives
|'''Automatic &lt;br /&gt;Permanent Bans'''
|False &lt;br /&gt;Positives
|'''False &lt;br /&gt;Negatives''' 
|-
|10/2005
| style=&quot;text-align: right&quot; |'''44'''
| style=&quot;text-align: right&quot; |2
| style=&quot;text-align: right&quot; |'''11'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''0'''
|-
|09/2005
| style=&quot;text-align: right&quot; |'''0'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''13'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''1'''
|-
|08/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''43'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''4'''
|-
|07/2005
| style=&quot;text-align: right&quot; |'''14'''
| style=&quot;text-align: right&quot; |3
| style=&quot;text-align: right&quot; |'''115'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''4'''
|-
|06/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''14'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''1'''
|-
|05/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''4'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''0'''
|-
|04/2005
| style=&quot;text-align: right&quot; |'''0'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''5'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''4'''
|-
|03/2005
| style=&quot;text-align: right&quot; |'''1'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''10'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''3'''
|-
|02/2005
| style=&quot;text-align: right&quot; |'''2'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''5'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''2'''
|-
|01/2005
| style=&quot;text-align: right&quot; |'''2'''
| style=&quot;text-align: right&quot; |1
| style=&quot;text-align: right&quot; |'''8'''
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |'''1'''
|}

See also [[Legacy:Chongqing Page/Discuss|Chongqing Page/Discuss]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chongqing Page/Temporary Read-Only</title>
    <id>888</id>
    <revision>
      <id>2457</id>
      <timestamp>2005-01-17T21:13:54Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==You have been temporarily put in read-only mode.==

The wiki has detected that you have added a considerable number of links to the page you previously edited.

'''Your changes have been saved,''' but you have been automatically put in read-only mode for a while &amp;ndash; actually, for &lt;number of links you added&gt; times ten minutes.  After that time, your read-only restriction will be automatically lifted.

An email has been dispatched to the [[Legacy:Wiki Admin|wiki admin]]s.

==Don't panic! (...unless you're a spammer.)==

We'd prefer not to, but recent and continued spam attacks forced us to implement some sort of automated filter to prevent us from continually having to revert the mess they leave.

'''If you're not a spammer, you've got nothing to worry about''' &amp;ndash; you're just the unfortunate victim of the times we're living in.  Either wait until your read-only status expires, or contact a [[Legacy:Wiki Admin|wiki admin]] to lift it.  Chances are that a wiki admin will do that themselves as soon as they get the automatic notification and realize you're not a spammer.

'''If you're a spammer,''' your read-only state will be changed into a permanent ban.  (And of course we'll revert your changes.)  We'll file an official complaint with your ISP about this matter.  In case their response doesn't satisfy us, chances are that we'll ban their entire IP range.</text>
    </revision>
    <revision>
      <id>2458</id>
      <timestamp>2005-01-14T18:56:27Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==You have been temporarily put in read-only mode.==

The wiki has detected that you have added a considerable number of links to the page you previously edited.

'''Your changes have been saved,''' but you have been automatically put in read-only mode for a while &amp;ndash; actually, for &lt;number of links you added&gt; times ten minutes.  After that time, your read-only restriction will be automatically lifted.

An email has been dispatched to the [[Legacy:Wiki Admin|wiki admin]]s.

==Don't panic! (...unless you're a spammer.)==

We'd prefer not to, but recent and continued spam attacks forced us to implement some sort of automated filter to prevent us from continually having to revert the mess they leave.

'''If you're not a spammer, you've got nothing to worry about''' &amp;ndash; you're just the unfortunate victim of the times we're living in.  Either wait until your read-only status expires, or contact a [[Legacy:Wiki Admin|wiki admin]] to lift it.  Chances are that a wiki admin will do that themselves as soon as they get the automatic notification and realize you're not a spammer.

'''If you're a spammer,''' your read-only state will be changed into a permanent ban.  We'll file an official complaint with your ISP about this matter.  In case their response doesn't satisfy us, chances are that we'll ban their entire IP range.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chris</title>
    <id>682</id>
    <revision>
      <id>1991</id>
      <timestamp>2002-07-06T13:50:24Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Hi!

: Hi - [[Legacy:EntropicLqd|EntropicLqd]]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1992</id>
      <timestamp>2002-04-19T09:38:38Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hi!

: Hi - [[Legacy:EntropicLqd|EntropicLqd]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Chumpnet</title>
    <id>748</id>
    <revision>
      <id>2143</id>
      <timestamp>2002-11-28T06:54:04Z</timestamp>
      <contributor>
        <ip>Chumpnet</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki and thanks for updating the [[Legacy:Quaternion|Quaternion]] page. :)

'''Chumpnet:''' Thanks. This Wiki is great. Just want to do my bit.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2144</id>
      <timestamp>2002-11-27T09:00:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki and thanks for updating the [[Legacy:Quaternion|Quaternion]] page. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CinematicGame</title>
    <id>28465</id>
    <revision>
      <id>40164</id>
      <timestamp>2009-11-17T10:48:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CinematicHud</title>
    <id>28656</id>
    <revision>
      <id>40512</id>
      <timestamp>2010-01-14T09:02:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CinematicPlayer</title>
    <id>28380</id>
    <revision>
      <id>40051</id>
      <timestamp>2009-11-15T08:14:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Clam</title>
    <id>821</id>
    <revision>
      <id>2309</id>
      <timestamp>2005-01-21T22:55:06Z</timestamp>
      <contributor>
        <ip>Dial-7350.wroclaw.dialog.net.pl</ip>
      </contributor>
      <comment>What's that dinterface_supp.h for?</comment>
      <text xml:space="preserve">===Intro===

===IIQD===

Interaction Interface Quick Decision v1.1

Use live gameplay control options to set gameplay elements

This is part of the base code for IIQD. The mouse code was taken from Tanus' SyndicateMod. Also the way&lt;br /&gt;the image coding is done may seem familiar with the Sega500 website tutorials.&lt;br /&gt;&lt;br /&gt;Also I highly doubt this is the most efficient way to do this. I think I took the long way around in doing&lt;br /&gt;some of these things. I'll change the textures to ones found within UT2k3 as soon as I get around to it.&lt;br /&gt;Also I'll put the playercontroller which is needed for this to make much sense and the gametype for conclusion. The playercontroller is a&lt;br /&gt;stripped down version of Tanus'. Finally the UnitPress() function in the playercontroller still needs tweaked.&lt;br /&gt;

&lt;uscript&gt;
class selectorinteraction extends interaction dependson(Actor);

#exec texture IMPORT name=CURSOR FILE=Textures\cursor12.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2
#exec texture IMPORT name=CURSORCLICK FILE=Textures\cursor12click.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2
#exec texture IMPORT name=MENU FILE=Textures\menu2.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2
#exec texture IMPORT name=BUTTON FILE=Textures\button.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2

var   int     SelectedBox;

var   PlayerController    PlayerOwner;

var   texture             CursorMat,  CursorMat2,    MenuTemp,   Button;

var        bool       CursorClick;


event Initialized()
{
if (PlayerOwner == None)
PlayerOwner = ViewportOwner.Actor;
}

function PostRender(Canvas C)
{
   local float CursorX, CursorY;
   local byte tempstyle;
   local color tempColor;

   tempstyle=C.Style;
   tempcolor=C.DrawColor;

   CursorX = SelectorPlayer(PlayerOwner).Player.WindowsMouseX;
   CursorY = SelectorPlayer(PlayerOwner).Player.WindowsMouseY;
   
   
   
   //
   //MENU
   //
   c.setPos(0,0);
   c.Style=5;
   c.SetDrawColor(255, 255, 255);
   c.DrawIcon(MenuTemp, 2);


   //Buttons
   //Draw Button One
   c.setPos(MenuTemp.USize/2,5);
   C.Style=3;
   if(selectedbox==1)
   {
   C.SetDrawColor(0,255,255);
   }
   if(selectedbox!=1)
   {
   C.SetDrawColor(255,255,255);
   }
   C.DrawIcon(Button, 1);

   //Draw Button Two
   c.setPos(MenuTemp.USize/2,Button.VSize+45);
   C.Style=3;
   if(selectedbox==2)
   {
   C.SetDrawColor(0,255,255);
   }
   if(selectedbox!=2)
   {
   C.SetDrawColor(255,255,255);
   }
   C.DrawIcon(Button, 1);

   //Draw Button Three
   c.setPos(MenuTemp.USize/2,(Button.VSize*2)+90);
   C.Style=3;
   if(selectedbox==3)
   {
   C.SetDrawColor(0,255,255);
   }
   if(selectedbox!=3)
   {
   C.SetDrawColor(255,255,255);
   }
   C.DrawIcon(Button, 1);

   //
   //MOUSE
   //
   c.SetDrawColor(255, 255, 255);
   c.Style =6;
   C.SetPos( CursorX, CursorY );

   if(cursorclick==true)
   {
   c.DrawIcon(Cursormat2, 1/2);
   }
   if(cursorclick!=true)
   {
   C.DrawIcon(cursormat, 1/2);
   }
   
   C.SetPos( 10, (C.ClipY-20) ); //DISPLAY MOUSE COORDINATES
   C.DrawText( &quot;CursorX:&quot;@CursorX@&quot;,CursorY:&quot;@CursorY );

   //FINISH UP
    C.Style=tempstyle;
    C.DrawColor=tempColor;

}






//KeyEvent
function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{

if ((Action == IST_Press) &amp;&amp; (Key == IK_RightMouse))
{
cursorclick=true;
ButtonPress();   //Perform button function
SelectorPlayer(PlayerOwner).UnitPress();
}

if ((Action == IST_Release) &amp;&amp; (Key == IK_RightMouse))
{
cursorclick=false;
}
return false;
}



//ButtonPress
function ButtonPress()
{
local float CursorX, CursorY;

      CursorX = SelectorPlayer(PlayerOwner).Player.WindowsMouseX;
   CursorY = SelectorPlayer(PlayerOwner).Player.WindowsMouseY;


   //button 1
   if(CursorX &gt; ((MenuTemp.USize - Button.USize) / 2) + 35&amp;&amp; CursorX &lt; (MenuTemp.Usize/2)+ (Button.Usize/2) + 35 &amp;&amp; CursorY &gt; 5 &amp;&amp; CursorY &lt; Button.VSize+5)
   {
   if(selectedbox==1)
   {
   selectedbox=4;
   return;
   }
   if(selectedbox!=1)
   {
   selectedbox=1;
   return;
   }
   }

   //button 2
   if (CursorX &gt; ((MenuTemp.USize - Button.USize) / 2) + 35&amp;&amp; CursorX &lt; (MenuTemp.Usize/2)+ (Button.Usize/2) + 35 &amp;&amp; CursorY &gt; Button.VSize+5 &amp;&amp; CursorY &lt; (Button.VSize*2)+5)
   {
   if(selectedbox==2)
   {
   selectedbox=4;
   return;
   }
   if(selectedbox!=2)
   {
   selectedbox=2;
   return;
   }
   }

   //button 3
   if (CursorX &gt; ((MenuTemp.USize - Button.USize) / 2) + 35&amp;&amp; CursorX &lt; (MenuTemp.Usize/2)+ (Button.Usize/2) + 35 &amp;&amp; CursorY &gt; (Button.VSize*2)+75  &amp;&amp; CursorY &lt; (Button.VSize*3)+75)
   {
   if(selectedbox==3)
   {
   selectedbox=4;
   return;
   }
   if(selectedbox!=3)
   {
   selectedbox=3;
   }
   }
}   //End of Button Press







defaultproperties
{
    cursormat=texture'CURSOR'
    cursormat2=texture'CURSORCLICK'
    MenuTemp=texture'MENU'
    button=texture'BUTTON'
    bVisible=true
    bActive=true

}

&lt;/uscript&gt;

Player Controller

&lt;uscript&gt;
class selectorplayer extends xPlayer;

var float CamHeight, CamDistance;

var bool bHasInteraction;

var bool bHold;

var ScriptedController cdawg;

var rotator CameraRot; 
var vector CameraLoc;
var float MaxClipX, MaxClipY;



event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation )
{
    local vector temp;
    bBehindView=true;
    SetViewTarget(self);
    ViewActor = ViewTarget;


    CameraLocation = ViewActor.Location;
    temp = CamDistance * vector(CameraRotation);
    CameraLocation = CameraLocation - temp;
    CameraLocation.z+=CamHeight;
    CameraRotation = rotator(ViewActor.Location - CameraLocation);
    //offsetcameraLocation=CameraLocation;
}

state PlayerWaiting
{
Begin:
    If ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
        {
        Player.InteractionMaster.AddInteraction(&quot;selector.selectorinteraction&quot;, Player);
        bHasInteraction = True;
        }


}


function UnitPress()
{

         local vector TraceEnd, HitLocation, HitNormal, Dir, CameraLoc;
	local rotator CameraRot;
	local actor ViewActor;
	local float Fov, FovDist;
	local float MouseX, MouseY;
	local actor Other;

        MouseX = Player.WindowsMouseX / MaxClipX;
        MouseY = Player.WindowsMouseY / MaxClipY;

        CameraRot = GetViewRotation();
	CameraLoc = vect(0,0,0);

	PlayerCalcView(ViewActor, CameraLoc, CameraRot);

	Fov = (FovAngle/2) * Pi / 180.00;
	FovDist = (MaxClipX/2) / Tan(Fov);

	Dir.X = FovDist;
	Dir.Y = MouseX - MaxClipX / 2;
	Dir.Z = -(MouseY - MaxClipY / 2);

	Dir = Dir &gt;&gt; CameraRot;

	TraceEnd = (CameraLoc) + 50000 * Normal(Dir);

	Other = Trace(HitLocation, HitNormal, TraceEnd, CameraLoc, true);
        if( Other.IsA('xpawn'))
        {
        log(&quot;halloween&quot;);
        return;
        }

        return;
}

defaultproperties
{

    CamHeight=350
    CamDistance=300
    InputClass=class'viewtest.SyndicatePlayerInput'
    PawnClass=Class'selector.selectorpawn'
}
&lt;/uscript&gt;

SelectorGame

&lt;uscript&gt;

class selectorgame extends xDeathMatch;

function startmatch()
{
Super.startmatch();
DropPawns();
}

function DropPawns()
{
local playercontroller theplayer;
local pawn temppawn;




      foreach AllActors(class'playercontroller', theplayer)
      {
       temppawn=theplayer.pawn;
       theplayer.GotoState('Spectating');
       temppawn.destroy();
       }

}

defaultproperties
{

   PlayerControllerClassName=&quot;selector.selectorplayer&quot;
   HudType=&quot;selector.selectorHUD&quot;

}
&lt;/uscript&gt;

===Dll To Lib, Header File===

&lt;uscript&gt;
//	dinterface_supp.h : supplement header file for dinterface.dll
//	Author: DLL to Lib version 1.42
//	Date: Friday, December 12, 2003
//	Description: The declaration of the dinterface.dll's entry-point function.
//	Prototype: BOOL WINAPI xxx_DllMain(HINSTANCE hinstance, DWORD fdwReason, LPVOID lpvReserved);
//	Parameters: 
//		hinstance
//		  Handle to current instance of the application. Use AfxGetInstanceHandle()
//		  to get the instance handle if your project has MFC support.
//		fdwReason
//		  Specifies a flag indicating why the entry-point function is being called.
//		lpvReserved 
//		  Specifies further aspects of DLL initialization and cleanup. Should always
//		  be set to NULL;
//	Comment: Please see the help document for detail information about the entry-point 
//		 function

/////////////////////////////////////////////////////////////////////

#if !defined(D2L_DINTERFACE_SUPP_H__1E4C3315_1197_226C_06A6_6C4616652C9D__INCLUDED_)
#define D2L_DINTERFACE_SUPP_H__1E4C3315_1197_226C_06A6_6C4616652C9D__INCLUDED_

#if _MSC_VER &gt; 1000
#pragma once
#endif // _MSC_VER &gt; 1000

#ifdef __cplusplus
extern &quot;C&quot; {
#endif


#include &lt;windows.h&gt;

/* This is dinterface.dll's entry-point function. You should call it to do necessary
 initialization and finalization. */

BOOL WINAPI DINTERFACE_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);


#ifdef __cplusplus
}
#endif

#endif // !defined(D2L_DINTERFACE_SUPP_H__1E4C3315_1197_226C_06A6_6C4616652C9D__INCLUDED_)
&lt;/uscript&gt;

====Goal====

My Goal right now is to fool around with creating an RTS style gametype. &lt;br /&gt;1.Spawn a playercontroller at the playerstart&lt;br /&gt;2.Spawn 6 possessable pawns in a circular position around the playercontrollers start.&lt;br /&gt;3.Create a HUD with a mouse pointer where I can click on the pawns to possess them.&lt;br /&gt;4.When I left click on a pawn it posseses it, when I right click on a place, the pawn will move there.\\ 

====CODE====

Startmatch()&lt;br /&gt;6 ai controlled pawns&lt;br /&gt;1 playercontroller in spec mode to take care of extra bot&lt;br /&gt;&lt;br /&gt;*Pawns stand still, don't shoot each other&lt;br /&gt;*Click on Pawn, selects it&lt;br /&gt;&lt;br /&gt;Decide which pawn is selected&lt;br /&gt;InterFace&lt;br /&gt;Make Pawn Look selected&lt;br /&gt;Mouse cursor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On click, trace from viewactor down, if pawn, select pawn&lt;br /&gt;&lt;br /&gt;On right click, if pawn is selected, trace down and move pawn to location&lt;br /&gt;&lt;br /&gt;Pawn AI - stand still, dont shoot, move when playercontroller tells it to&lt;br /&gt;playercontroller - calls to pawns, must decide which pawn, decide which pawn.function, detect pawn

----

'''Wormbo:''' Maybe you could make a new Pipebomb tutorial page at the [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].

'''Switch`:''' What's that dinterface_supp.h for?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2310</id>
      <timestamp>2004-02-23T06:17:10Z</timestamp>
      <contributor>
        <ip>Pool-68-162-169-202.pitt.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Intro===

===IIQD===

Interaction Interface Quick Decision v1.1

Use live gameplay control options to set gameplay elements

This is part of the base code for IIQD. The mouse code was taken from Tanus' SyndicateMod. Also the way&lt;br /&gt;the image coding is done may seem familiar with the Sega500 website tutorials.&lt;br /&gt;&lt;br /&gt;Also I highly doubt this is the most efficient way to do this. I think I took the long way around in doing&lt;br /&gt;some of these things. I'll change the textures to ones found within UT2k3 as soon as I get around to it.&lt;br /&gt;Also I'll put the playercontroller which is needed for this to make much sense and the gametype for conclusion. The playercontroller is a&lt;br /&gt;stripped down version of Tanus'. Finally the UnitPress() function in the playercontroller still needs tweaked.&lt;br /&gt;

&lt;uscript&gt;
class selectorinteraction extends interaction dependson(Actor);

#exec texture IMPORT name=CURSOR FILE=Textures\cursor12.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2
#exec texture IMPORT name=CURSORCLICK FILE=Textures\cursor12click.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2
#exec texture IMPORT name=MENU FILE=Textures\menu2.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2
#exec texture IMPORT name=BUTTON FILE=Textures\button.tga GROUP=&quot;HUD&quot; MIPS=OFF FLAGS=2

var   int     SelectedBox;

var   PlayerController    PlayerOwner;

var   texture             CursorMat,  CursorMat2,    MenuTemp,   Button;

var        bool       CursorClick;


event Initialized()
{
if (PlayerOwner == None)
PlayerOwner = ViewportOwner.Actor;
}

function PostRender(Canvas C)
{
   local float CursorX, CursorY;
   local byte tempstyle;
   local color tempColor;

   tempstyle=C.Style;
   tempcolor=C.DrawColor;

   CursorX = SelectorPlayer(PlayerOwner).Player.WindowsMouseX;
   CursorY = SelectorPlayer(PlayerOwner).Player.WindowsMouseY;
   
   
   
   //
   //MENU
   //
   c.setPos(0,0);
   c.Style=5;
   c.SetDrawColor(255, 255, 255);
   c.DrawIcon(MenuTemp, 2);


   //Buttons
   //Draw Button One
   c.setPos(MenuTemp.USize/2,5);
   C.Style=3;
   if(selectedbox==1)
   {
   C.SetDrawColor(0,255,255);
   }
   if(selectedbox!=1)
   {
   C.SetDrawColor(255,255,255);
   }
   C.DrawIcon(Button, 1);

   //Draw Button Two
   c.setPos(MenuTemp.USize/2,Button.VSize+45);
   C.Style=3;
   if(selectedbox==2)
   {
   C.SetDrawColor(0,255,255);
   }
   if(selectedbox!=2)
   {
   C.SetDrawColor(255,255,255);
   }
   C.DrawIcon(Button, 1);

   //Draw Button Three
   c.setPos(MenuTemp.USize/2,(Button.VSize*2)+90);
   C.Style=3;
   if(selectedbox==3)
   {
   C.SetDrawColor(0,255,255);
   }
   if(selectedbox!=3)
   {
   C.SetDrawColor(255,255,255);
   }
   C.DrawIcon(Button, 1);

   //
   //MOUSE
   //
   c.SetDrawColor(255, 255, 255);
   c.Style =6;
   C.SetPos( CursorX, CursorY );

   if(cursorclick==true)
   {
   c.DrawIcon(Cursormat2, 1/2);
   }
   if(cursorclick!=true)
   {
   C.DrawIcon(cursormat, 1/2);
   }
   
   C.SetPos( 10, (C.ClipY-20) ); //DISPLAY MOUSE COORDINATES
   C.DrawText( &quot;CursorX:&quot;@CursorX@&quot;,CursorY:&quot;@CursorY );

   //FINISH UP
    C.Style=tempstyle;
    C.DrawColor=tempColor;

}






//KeyEvent
function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{

if ((Action == IST_Press) &amp;&amp; (Key == IK_RightMouse))
{
cursorclick=true;
ButtonPress();   //Perform button function
SelectorPlayer(PlayerOwner).UnitPress();
}

if ((Action == IST_Release) &amp;&amp; (Key == IK_RightMouse))
{
cursorclick=false;
}
return false;
}



//ButtonPress
function ButtonPress()
{
local float CursorX, CursorY;

      CursorX = SelectorPlayer(PlayerOwner).Player.WindowsMouseX;
   CursorY = SelectorPlayer(PlayerOwner).Player.WindowsMouseY;


   //button 1
   if(CursorX &gt; ((MenuTemp.USize - Button.USize) / 2) + 35&amp;&amp; CursorX &lt; (MenuTemp.Usize/2)+ (Button.Usize/2) + 35 &amp;&amp; CursorY &gt; 5 &amp;&amp; CursorY &lt; Button.VSize+5)
   {
   if(selectedbox==1)
   {
   selectedbox=4;
   return;
   }
   if(selectedbox!=1)
   {
   selectedbox=1;
   return;
   }
   }

   //button 2
   if (CursorX &gt; ((MenuTemp.USize - Button.USize) / 2) + 35&amp;&amp; CursorX &lt; (MenuTemp.Usize/2)+ (Button.Usize/2) + 35 &amp;&amp; CursorY &gt; Button.VSize+5 &amp;&amp; CursorY &lt; (Button.VSize*2)+5)
   {
   if(selectedbox==2)
   {
   selectedbox=4;
   return;
   }
   if(selectedbox!=2)
   {
   selectedbox=2;
   return;
   }
   }

   //button 3
   if (CursorX &gt; ((MenuTemp.USize - Button.USize) / 2) + 35&amp;&amp; CursorX &lt; (MenuTemp.Usize/2)+ (Button.Usize/2) + 35 &amp;&amp; CursorY &gt; (Button.VSize*2)+75  &amp;&amp; CursorY &lt; (Button.VSize*3)+75)
   {
   if(selectedbox==3)
   {
   selectedbox=4;
   return;
   }
   if(selectedbox!=3)
   {
   selectedbox=3;
   }
   }
}   //End of Button Press







defaultproperties
{
    cursormat=texture'CURSOR'
    cursormat2=texture'CURSORCLICK'
    MenuTemp=texture'MENU'
    button=texture'BUTTON'
    bVisible=true
    bActive=true

}

&lt;/uscript&gt;

Player Controller

&lt;uscript&gt;
class selectorplayer extends xPlayer;

var float CamHeight, CamDistance;

var bool bHasInteraction;

var bool bHold;

var ScriptedController cdawg;

var rotator CameraRot; 
var vector CameraLoc;
var float MaxClipX, MaxClipY;



event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation )
{
    local vector temp;
    bBehindView=true;
    SetViewTarget(self);
    ViewActor = ViewTarget;


    CameraLocation = ViewActor.Location;
    temp = CamDistance * vector(CameraRotation);
    CameraLocation = CameraLocation - temp;
    CameraLocation.z+=CamHeight;
    CameraRotation = rotator(ViewActor.Location - CameraLocation);
    //offsetcameraLocation=CameraLocation;
}

state PlayerWaiting
{
Begin:
    If ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
        {
        Player.InteractionMaster.AddInteraction(&quot;selector.selectorinteraction&quot;, Player);
        bHasInteraction = True;
        }


}


function UnitPress()
{

         local vector TraceEnd, HitLocation, HitNormal, Dir, CameraLoc;
	local rotator CameraRot;
	local actor ViewActor;
	local float Fov, FovDist;
	local float MouseX, MouseY;
	local actor Other;

        MouseX = Player.WindowsMouseX / MaxClipX;
        MouseY = Player.WindowsMouseY / MaxClipY;

        CameraRot = GetViewRotation();
	CameraLoc = vect(0,0,0);

	PlayerCalcView(ViewActor, CameraLoc, CameraRot);

	Fov = (FovAngle/2) * Pi / 180.00;
	FovDist = (MaxClipX/2) / Tan(Fov);

	Dir.X = FovDist;
	Dir.Y = MouseX - MaxClipX / 2;
	Dir.Z = -(MouseY - MaxClipY / 2);

	Dir = Dir &gt;&gt; CameraRot;

	TraceEnd = (CameraLoc) + 50000 * Normal(Dir);

	Other = Trace(HitLocation, HitNormal, TraceEnd, CameraLoc, true);
        if( Other.IsA('xpawn'))
        {
        log(&quot;halloween&quot;);
        return;
        }

        return;
}

defaultproperties
{

    CamHeight=350
    CamDistance=300
    InputClass=class'viewtest.SyndicatePlayerInput'
    PawnClass=Class'selector.selectorpawn'
}
&lt;/uscript&gt;

SelectorGame

&lt;uscript&gt;

class selectorgame extends xDeathMatch;

function startmatch()
{
Super.startmatch();
DropPawns();
}

function DropPawns()
{
local playercontroller theplayer;
local pawn temppawn;




      foreach AllActors(class'playercontroller', theplayer)
      {
       temppawn=theplayer.pawn;
       theplayer.GotoState('Spectating');
       temppawn.destroy();
       }

}

defaultproperties
{

   PlayerControllerClassName=&quot;selector.selectorplayer&quot;
   HudType=&quot;selector.selectorHUD&quot;

}
&lt;/uscript&gt;

===Dll To Lib, Header File===

&lt;uscript&gt;
//	dinterface_supp.h : supplement header file for dinterface.dll
//	Author: DLL to Lib version 1.42
//	Date: Friday, December 12, 2003
//	Description: The declaration of the dinterface.dll's entry-point function.
//	Prototype: BOOL WINAPI xxx_DllMain(HINSTANCE hinstance, DWORD fdwReason, LPVOID lpvReserved);
//	Parameters: 
//		hinstance
//		  Handle to current instance of the application. Use AfxGetInstanceHandle()
//		  to get the instance handle if your project has MFC support.
//		fdwReason
//		  Specifies a flag indicating why the entry-point function is being called.
//		lpvReserved 
//		  Specifies further aspects of DLL initialization and cleanup. Should always
//		  be set to NULL;
//	Comment: Please see the help document for detail information about the entry-point 
//		 function

/////////////////////////////////////////////////////////////////////

#if !defined(D2L_DINTERFACE_SUPP_H__1E4C3315_1197_226C_06A6_6C4616652C9D__INCLUDED_)
#define D2L_DINTERFACE_SUPP_H__1E4C3315_1197_226C_06A6_6C4616652C9D__INCLUDED_

#if _MSC_VER &gt; 1000
#pragma once
#endif // _MSC_VER &gt; 1000

#ifdef __cplusplus
extern &quot;C&quot; {
#endif


#include &lt;windows.h&gt;

/* This is dinterface.dll's entry-point function. You should call it to do necessary
 initialization and finalization. */

BOOL WINAPI DINTERFACE_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);


#ifdef __cplusplus
}
#endif

#endif // !defined(D2L_DINTERFACE_SUPP_H__1E4C3315_1197_226C_06A6_6C4616652C9D__INCLUDED_)
&lt;/uscript&gt;

====Goal====

My Goal right now is to fool around with creating an RTS style gametype. &lt;br /&gt;1.Spawn a playercontroller at the playerstart&lt;br /&gt;2.Spawn 6 possessable pawns in a circular position around the playercontrollers start.&lt;br /&gt;3.Create a HUD with a mouse pointer where I can click on the pawns to possess them.&lt;br /&gt;4.When I left click on a pawn it posseses it, when I right click on a place, the pawn will move there.\\ 

====CODE====

Startmatch()&lt;br /&gt;6 ai controlled pawns&lt;br /&gt;1 playercontroller in spec mode to take care of extra bot&lt;br /&gt;&lt;br /&gt;*Pawns stand still, don't shoot each other&lt;br /&gt;*Click on Pawn, selects it&lt;br /&gt;&lt;br /&gt;Decide which pawn is selected&lt;br /&gt;InterFace&lt;br /&gt;Make Pawn Look selected&lt;br /&gt;Mouse cursor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On click, trace from viewactor down, if pawn, select pawn&lt;br /&gt;&lt;br /&gt;On right click, if pawn is selected, trace down and move pawn to location&lt;br /&gt;&lt;br /&gt;Pawn AI - stand still, dont shoot, move when playercontroller tells it to&lt;br /&gt;playercontroller - calls to pawns, must decide which pawn, decide which pawn.function, detect pawn

----

'''Wormbo:''' Maybe you could make a new Pipebomb tutorial page at the [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class</title>
    <id>711</id>
    <revision>
      <id>2061</id>
      <timestamp>2002-04-21T00:44:01Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Class Syntax|Class Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class Hierarchy (U2)</title>
    <id>869</id>
    <revision>
      <id>2415</id>
      <timestamp>2005-01-10T22:01:07Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">This is a complete quick reference class listing from Object downwards for Unreal 2.

== ==
 Object
   Actor
      ActorRotator
      AntiPortalActor
      Brush
         Volume
            BlockingVolume
               BlockingVolumeNPC
            CoverVolume
            PhysicsVolume
               DefaultPhysicsVolume
               LadderVolume
               WaterVolume
            TriggerVolume
      Controller
         LicenseeController
            AIController
               U2NPCController
                  ControllerProxy
                  StationaryPawnController
                     StationaryPawnControllerDefensive
                     StationaryPawnControllerOffensive
                        ProximitySensorController
                           AutoTurretController
                  U2NPCControllerScriptable
                     LevelMasterController
                     U2NPCControllerShared
                        U2NPCControllerBase
                           AtlantisController
                           U2DrakkBossUpperController
                           U2DrakkDroidController
                           U2KillerSproutController
                           U2NPCControllerBasic
                              SkaarjController
                                 SkaarjHeavyController
                              U2AraknidController
                                 U2AraknidControllerHatched
                                 U2AraknidControllerHeavy
                              U2DrakkBossController
                              U2NPCControllerAdvanced
                                 U2NPCControllerBot
                              U2RammerController
                              U2ToscController
                           U2SporeController
                        U2NPCControllerBaseOld
                           AtlantisControllerOld
                           U2NPCControllerAdvancedOld
                              U2NPCControllerBotOld
                                 U2NPCControllerBotSP
            PlayerController
               Admin
               Camera
               MessagingSpectator
                  DemoRecSpectator
               U2PlayerController
                  U2PlayerTestController
                     U2PlayerNetTestController
      CoverProxy
      DamageType
         Crushed
         DamageTypeImpact
         DamageTypeImpl
            DamageTypeBiological
               DamageTypeAraknidProjectile
               DamageTypeBiologicalGas
               DamageTypeLeechGun
            DamageTypeDrowned
            DamageTypeEMP
            DamageTypeElectrical
               DamageTypeEnergyRifle
               DamageTypeLaserRifle
               DamageTypeTakkra
               DamageTypeTutorialDispersionAlt
               DamageTypeTutorialDispersionPrimary
            DamageTypePhysical
               DamageTypeDispersion
               DamageTypePhysicalInstant
               DamageTypePistol
               DamageTypeSingularityCannon
               DamageTypeSkaarjProjectile
               DamageTypeSniperRifle
               DamageTypeTutorialAssaultAlt
               DamageTypeTutorialAssaultPrimary
            DamageTypePsionic
            DamageTypeStomped
            DamageTypeThermal
               DamageTypeThermalExplosiveRound
               DamageTypeThermalFlaming
         DamageTypeParticle
         Fell
         Gibbed
         Suicided
      Decal
         GlassDecal
         GlassFog
         SpotMarker
      Decoration
         AnimTest
         ScaledSprite
         U2CTFFlag
            BlueFlag
            RedFlag
         U2Decoration
            Acheron
            ArtifactSpeed
            AtlantisDropship
            AtlantisDropshipBig
            AtlantisHI
            Barrel1
            Barrel2
            Barrel3
            Boulder
            Boulder1
            Boulder2
            BreakableItem
               BreakableLight
                  Flourescent_Light
                  LampA
               ExplosiveBarrel
               ExplosiveCannister
               SpiderBaby
               ToxicBarrel
            DrakkSFG
            DrakkSensorArray
            Fan2
            Gib
            HiTecCamera
            HiTecCameraBase
            HumanAutoCannon
            HumanDecoration
               Keyboard_Mouse
               LabStool
               TrashcanA
               trashcanB
            HumanPDS
            HumanSensorArray
            LightBox
            LightBox2
            PipeA
            PipeB
            PipeBend
            PipeC
            PipeD
            PipeE
            PipeF
            PipeG
            SeaWeed
            ShianFighter01
            SpaceChair
            StriderMedicalStation
            StriderSFG
            StriderSensorArray
            TubeLight
            TubeLight2
            TwoTriangles
            U2Cube
            U2Cylinder
            U2Diamond
            U2M7
               ShBarrel01
               ShFighter01
               shlight01
            U2Pyramid
            U2Sphere
            U2Spring
            WireBaseA
            WireBaseB
            WireBaseC
            WireBaseD
            WireLong
            WireShort
            WireSkewed
            shbarrel1
         u2m1
            PDA
               PDA_Scripted
            Flourescent_Light_Broken
            MedicalJar
               jara
               jarb
               jarc
               jard
               jare
               jarf
               jarg
               jarh
            coffeeincup
            coffeemtcup
            medarma
            medarmb
            medarmc
            urinal
         watertube
      Dialog
         DialogController
            DialogControllerDefault
            DialogControllerPlayer
         DialogEngine
         DialogNode
            DialogTree
         DialogSession
      DialogProxy
      Effects
         BubbleSpawner
         Fragment
            U2Fragment
               GlassFragmentA
               GlassFragmentB
               GlassFragmentC
               RubbleChunk
               VaseFragment
               WoodChunk
         Lightning
         Line3D
         LineDot
            LineDot2
            LineDot3
         MoverController
         RL_Explosion
            RL_ExplosionAlt
         RainCyd
         RandomLightning
         Tracer
            AR_Tracer
            DP_Tracer
            DP_TracerAlt
            P_Tracer
            P_TracerAlt
            SR_Tracer
         TracerSeg
            LineStreakSegment
            LineStreakSegmentVert
            PathStreakSegment
               LineStreakSegment004
               LineStreakSegment008
               LineStreakSegment016
               LineStreakSegment032
               LineStreakSegment064
               LineStreakSegment128
               LineStreakSegment255
               LineStreakSegment510
               LineStreakSegmentVert004
               LineStreakSegmentVert008
               LineStreakSegmentVert016
               LineStreakSegmentVert032
               LineStreakSegmentVert064
               LineStreakSegmentVert128
               LineStreakSegmentVert255
               LineStreakSegmentVert510
         TracerStreak
            LineStreak
            LineStreakVert
         TriggeredViewFog
         U2AnimSpriteEffect
            U2SpriteSmokePuff
         U2Bubble
         U2BubbleA
         U2BubbleTrail
         U2DrakkBossExplosion
         U2Respawn
         U2RingExplosion

            U2WaterRing
         U2Splash
         U2TeleportEffect
         VariableRotatorEffect
         explosionSkaarjHeavy
         explosionSkaarjLight
         explosionSkaarjMedium
      ElectricGenerator
         GL_EMPEffectB
      Emitter
      EnergySource
      FlameDamager
      FluidSurfaceOscillator
      ForceWallCollider
      HUD
         NullHUD
      HallCannon
      IKTrailer
      Info
         AccessControl
         BroadcastHandler
         CameraPoint
         DamageFilter
            DamageFilterAll
            DamageFilterAraknid
            DamageFilterBiological
               DamageFilterShian
            DamageFilterDecoration
            DamageFilterDefault
            DamageFilterDeployed
            DamageFilterDrakk
            DamageFilterEMP
            DamageFilterElectrical
            DamageFilterFlesh
            DamageFilterFleshTakkra
            DamageFilterIzarian
            DamageFilterKai
            DamageFilterLights
            DamageFilterPhysical
            DamageFilterPlayer
            DamageFilterPowerSuit
            DamageFilterPsionic
            DamageFilterSkaarj
            DamageFilterSpore
            DamageFilterTakkra
            DamageFilterThermal
            DamageFilterTosc
         FluidSurfaceInfo
         GameInfo
            DialogGameInfo
               DialogGameInfoLocal
               U2GameInfo
                  AtlantisGameInfo
                  CutsceneGameInfo
                  IntroGameInfo
                  MissionGameInfo
                  U2DeathMatch
                     U2TeamGame
                        U2CTFGame
                        U2XMPGame
                  U2TutorialGameInfo
                  VaultGameInfo
         GameRules
            HitSound
            ShowDamageInfo
         InternetInfo
            InternetLink
               TcpLink
                  WebConnection
                  WebServer
               UdpLink
                  UdpBeacon
                     ClientBeaconReceiver
         LocalMessage
            GameMessage
         MapList
         Mutator
            U2Mutator
               Arena
                  AssaultRifleArena
                  DispersionArena
                  EnergyRifleArena
                  FlamethrowerArena
                  GrenadeLauncherArena
                  LaserRifleArena
                  LeechGunArena
                  PistolArena
                  RocketArena
                  ShotgunArena
                  SingularityCannonArena
                  SniperRifleArena
                  TakkraArena
               AtlantisMutator
               NIU2
         PotentialClimbWatcher
         ReplicationInfo
            GameReplicationInfo
               U2GameReplicationInfo
                  U2CTFReplicationInfo
            LevelListReplicationInfo
               EngineLevelListInfo
               XMPLevelListInfo
            PlayerReplicationInfo
               U2BotReplicationInfo
               U2PlayerReplicationInfo
            TeamInfo
               U2TeamInfo
         SavedMove
         SceneManager
         ScoreBoard
         StatLog
            StatLogFile
         TerrainInfo
         TestInfo
         U2BotInfo
         VoicePack
         ZoneInfo
            GravityZoneInfo
            LevelInfo
            SkyZoneInfo
               U2SkyZoneInfo
                  ParallaxSkyZoneInfo
            U2ZoneInfo
            WarpZoneInfo
         VolumeTimer
      Inventory
         Ammunition
            U2Ammo
               U2XMPAmmo
                  ammoInvAutoTurret
                  ammoInvFieldGenerator
                  ammoInvProximitySensor
                  ammoInvRocketTurret
               ammoInvAssaultRifle
               ammoInvAutoCannon
               ammoInvDispersion
               ammoInvEnergyRifle
               ammoInvFlamethrower
               ammoInvGrenade
                  ammoInvGrenadeConcussion
                  ammoInvGrenadeEMP
                  ammoInvGrenadeFragment
                  ammoInvGrenadeIncendiary
                  ammoInvGrenadeSmoke
                  ammoInvGrenadeToxic
               ammoInvLaserRifle
               ammoInvLeechGun
               ammoInvPistol
               ammoInvRocket
               ammoInvRocketLauncher
               ammoInvShotgun
               ammoInvSingularityCannon
               ammoInvSniperRifle
               ammoInvTakkra
         FollowCam
         Powerups
            Armor
               PowerSuit
                  PowerSuitFemHeavy
                  PowerSuitFemLight
                  PowerSuitFemMedium
                  PowerSuitHeavy
                     PowerSuitCustom
                  PowerSuitJapHeavy
                  PowerSuitJapLight
                  PowerSuitJapMedium
                  PowerSuitLight
                  PowerSuitMarineHeavy
                  PowerSuitMarineLight
                  PowerSuitMarineMedium
                  PowerSuitMedium
                     PowerSuitPhoenix
                  PowerSuitSkaarjHeavy
                  PowerSuitSkaarjLight
                  PowerSuitSkaarjMedium
                  U2JumpPack
         SpectatorCamera
         TriggeredCamera
         U2Grapple
         U2Inventory
            Artifact
               ArtifactInvArmor
               ArtifactInvHealth
               ArtifactInvInvisibility
               ArtifactInvLocator
               ArtifactInvSpeed
               ArtifactInvWeaponDamage
            PowerUp
               EnergyPowerUp
               HealthPowerUp
               PowerStation
                  EnergyStation
                  HealthStation
         Weapon
            U2Weapon
               U2XMPItem
                  DeployableInventory
                     AutoTurretDeployable
                     EnergyRelayDeployable
                     FieldGeneratorDeployable
                     ProximitySensorDeployable
                     RocketTurretDeployable
               WeaponInvAssaultRifle
                  WeaponInvAssaultRifleSmall
                  WeaponTutorialInvAssaultRifle
               WeaponInvDispersion
                  WeaponInvDispersionSmall
                  WeaponTutorialInvDispersion
               WeaponInvEnergyRifle
                  WeaponInvEnergyRifleEx
                  WeaponInvEnergyRifleInvisible
               WeaponInvFlameThrower
                  PPainter
               WeaponInvGrenadeLauncher
                  WeaponInvGrenadeLauncherSmall
                  WeaponTutorialInvGrenadeLauncher
               WeaponInvLaserRifle
                  WeaponInvLaserRifleGimp
               WeaponInvLeechGun
               WeaponInvPistol
                  WeaponInvMagicPistol
                  WeaponInvPistolSmall
               WeaponInvRocketLauncher
                  WeaponInvRocketLauncherEx
                  WeaponInvRocketLauncherGimp
                  WeaponInvRocketLauncherSmall
               WeaponInvShotgun
                  WeaponInvShotgunSmall
               WeaponInvSingularityCannon
               WeaponInvSniperRifle
                  WeaponInvSniperRifleSmall
               WeaponInvTakkra
               weaponTurretMounted
                  weaponInvAutoCannon
                  weaponInvRocketCannon
      InventoryAttachment
         WeaponAttachment
      KActor
         KArt
            KVehicle
         KConstraint
            KBSJoint
            KCarWheelJoint
            KConeLimit
            KHinge
         KTire
      Keypoint
         ActorScaler
         AtlantisIconImporter
         DropSpot
         LookTarget
         PatrolPoint
            PatrolPointBlue
            PatrolPointGreen
            PatrolPointRed
         PropertyFlipper
         AIScript
         ActorFactory
            PawnFactory
         AmbientSound
            SoundHolder
         AtlantisPostM00Scratchpad
         AtlantisPostM01Scratchpad
         AtlantisPostM99Scratchpad
         BlockAll
         BlockMonsters
         BlockPlayer
         ClipMarker
         CoverPoint
         CoverSpot
         HoldSpot
         InterpolationPoint
         PolyMarker
         WayBeacon
      LegendActorComponent
         CollectionProxy
         CollisionNotifier
         CollisionProxy
            CollisionProxyIncoming
            PowerStationCollisionProxy
         DelayedTrigger
         Fader
         ProximityLightTrigger
         TeleportProxy
      Light
         FT_Light
         ProximityLight
         ScriptedLight
            AR_LightEffect
            DP_LightEffect
            ER_EMPExplosion
            GL_EMPEffect
            LR_LightEffect
            P_LightEffect
            SR_LightEffect
            S_LightEffect
         Spotlight
         TriggerLight
         U2FlashLightBeam1
            U2FlashLightBeam2
         U2WeaponLight
      Line
      Mover
         DoorMover
         ElevatorMover
         GlassMover
      NavigationPoint
         AlternatePath
         AmbushPoint
            DefensePoint
         ArtifactSpawnPoint
         BlockedPath
         CableNode
         Door
         FlyNode
         InventorySpot
         Ladder
            AutoLadder
         LevelLoadingView
         LiftCenter
            JumpSpot
         LiftExit
         PathNode
         PlayerStart
         ReplicatorSpawnPoint
         ShadowNode
         SpawnPoint
         Teleporter
            TeleporterWithEffects
            TriggeredAreaTeleporter
         U2FlagBase
         WarpZoneMarker
      NewWind
      Note
      P_LaserSpot
      ParticleColliderDisc
      ParticleColliderSphere
      ParticleGenerator
         BarbbieHareDesigner
         BreakableGlass
         LineManager
         ParticleAffector
         ParticleBlower
            GenericExplosionBlower
            GenericExplosionBlowerSmall
            RL_Blower
            RL_Sucker
            SC_Sucker
         ParticleRadiator
         ParticleSalamander
         ParticleSkeleton
         PulseLineGenerator
            BendiBeamGenerator
            ForceWallBeam
            projectileLaserPulse
         TarpBuilder
      ParticleLoader
      ParticleRef
      ParticleSprayer
      Pawn
         LicenseePawn
            U2Pawn
               StationaryPawn
                  DeployedUnit
                     EnergyRelay
                     FieldGenerator
                        FieldGeneratorAlt
                     ProximitySensor
                        AutoTurret
                           RocketTurret
                  ForceWall
               U2PawnBase
                  LevelMaster
                  ProtoBlob
                  U2Bellowfish
                  U2Cockroach
                  U2Cyprid
                  U2Diver
                  U2Hummer
                  U2KillerSprout
                  U2PawnAtlantis
                     Aida
                        AidaAtlantis
                     CutscenePlayer
                        CutscenePlayerAtlantis
                     Isaak
                        IsaakAtlantis
                     Neban
                        NebanAtlantis
                     Raff
                     SectorCommander
                  U2PawnBasic
                     U2AraknidBase
                        U2AraknidHeavy
                        U2AraknidLight
                           U2AraknidLightHatched
                        U2AraknidMedium
                     U2DrakkBoss
                     U2DrakkBossUpper
                     U2DrakkDroid
                     U2DrakkLight
                     U2DrakkMedium
                     U2FlyingSnake
                        U2FlyingSnakeCorpse
                     U2KaiBase
                        U2KaiClothed
                        U2KaiUnclothed
                     U2KillerTadpole
                     U2Mukhogg
                        U2MiniMukhogg
                     U2Parata
                        U2MegaParata
                     U2PawnAdvanced
                        TestDB
                        TestNPC
                           TestNPCBehavior
                           TestNPCCover
                           TestNPCFlee
                           TestNPCShadows
                           TestNPCStance
                        U2Civilian
                           U2CivilianScientist
                           U2ColonistHumanFemaleA
                           U2ColonistHumanMaleA
                        U2Izarian
                        U2MarineLight
                        U2MarineMedium
                        U2MercFemLight
                        U2MercFemMedium
                        U2MercJapLight
                        U2MercJapMedium
                        U2PawnHeavyHuman
                           U2MarineHeavy
                           U2MercFemHeavy
                           U2MercJapHeavy
                        U2Player
                           RaffTrainingBot
                              RaffTrainingNPC
                           U2PlayerMP
                              U2PlayerXMP
                                 U2PlayerXMPHeavy
                                 U2PlayerXMPLight
                                 U2PlayerXMPMedium
                           U2PlayerNull
                           U2PlayerSP
                              U2PlayerAtlantis
                              U2PlayerSinker
                              U2PlayerTutorial
                        U2SpecialCivilian
                     U2Rammer
                        U2MiniRammer
                     U2Seagoat
                        AtlantisSeagoat
                     U2SeagoatStowaway
                     U2ShianWarrior
                     U2ShianWorker
                     U2SkaarjBase
                        U2SkaarjHeavy
                        U2SkaarjLight
                           U2SkaarjMedium

                     U2Snipe
                        U2MegaSnipe
                        U2SnipeBloody
                     U2Tosc
                     U2Uglyfish
                  U2PinwheelFish
                  U2Schoolfish
                  U2Spore
                  U2TargetDrone
                  U2WaterDipper
         PawnProxy
            PawnProxyPathing
            PawnProxyTarget
               PawnProxyZeroSize
         Scout
         Vehicle
      Pickup
         Ammo
            U2AmmoPickup
               U2FullAmmoPickup
               ammoAssaultRifle
               ammoEnergyRifle
               ammoFlamethrower
               ammoGrenade
                  ammoGrenadeConcussion
                  ammoGrenadeEMP
                  ammoGrenadeFragment
                  ammoGrenadeIncendiary
                  ammoGrenadeSmoke
                  ammoGrenadeToxic
               ammoLaserRifle
               ammoLeechGun
               ammoPistol
               ammoRocketLauncher
               ammoShotgun
               ammoSingularityCannon
               ammoSniperRifle
         AmmoPack
            AmmoPackHeavyPickup
            AmmoPackLightPickup
            AmmoPackMediumPickup
         ArmorPickup
         ArtifactPickup
            ArtifactArmor
            ArtifactHealth
            ArtifactInvisibility
            ArtifactLocator
            ArtifactSpeed
            ArtifactWeaponDamage
         PowerSuitPickup
            PowerSuitHeavyPickup
            PowerSuitLightPickup
            PowerSuitMediumPickup
         PowerUpPickup
            DroppedEnergyPickup
            EnergyPickup
            HealthPickup
            U2JumpPackPickup
         U2FlashLight
         WeaponPickup
            U2WeaponPickup
               weaponAssaultRifle
                  weaponTutorialAssaultRifle
               weaponDispersion
                  weaponTutorialDispersion
               weaponEnergyRifle
               weaponFlameThrower
               weaponGrenadeLauncher
                  weaponTutorialGrenadeLauncher
               weaponLaserRifle
               weaponLeechGun
               weaponPistol
               weaponRocketLauncher
                  weaponRocketLauncherGimp
               weaponShotgun
               weaponSingularityCannon
               weaponSniperRifle
               weaponTakkra
            XMPPickup
               AutoTurretPickup
               EnergyRelayPickup
               FieldGeneratorPickup
               ProximitySensorPickup
               RocketTurretPickup
      Projectile
         U2Projectile
            ProjectileAraknidBase
               ProjectileAraknidAlt
               projectileAraknid
            ProjectileSkaarjBase
               ProjectileSkaarjHeavy
               ProjectileSkaarjHeavySeeking
               ProjectileSkaarjLight
               ProjectileSkaarjMedium
            projectileAltRocket
            projectileAssaultExplosion
               projectileTutorialAssaultExplosion
            projectileAssaultRound
               projectileTutorialAssaultRound
            projectileAssaultRoundAlt
               projectileTutorialAssaultRoundAlt
            projectileAutoTurret
            projectileBlackHole
            projectileDispersion
               projectileTutorialDispersion
            projectileDispersionAlt
               projectileTutorialDispersionAlt
            projectileDispersionAlt2
               projectileTutorialDispersionAlt2
            projectileEMP
            projectileEMPimp
            projectileEnergyBeam
            projectileEnergyRelay
            projectileFieldGenerator
            projectileFieldGeneratorAlt
            projectileFlameThrowerGel
            projectileGrenade
               projectileGrenadeConcussion
               projectileGrenadeEMP
               projectileGrenadeFragment
               projectileGrenadeIncendiary
               projectileGrenadeSmoke
               projectileGrenadeToxic
            projectileHeavyRocket
               projectileRocket
            projectileLaserBeam
            projectileLeech
               projectileLeechAlt
               projectileLeechEx
            projectileMiniRocket
            projectilePistolBullet
            projectileProximitySensor
            projectileQuantumWave
            projectileRocketTurret
            projectileShotgun
               projectileShotgunAlt
            projectileTakkra
               projectileTakkraDefensive
         U2ShellCase
            AR_Shell
            P_Shell
            SR_Shell
            S_Shell
         projectileRocketGuide
      ProjectileSoundProxy
      Projector
         MovableProjector
         ParticleDecalProjector
         ShadowProjector
         U2Decal
            PPainterDecal
            U2BlastMark
      PrototypeAssets
      Replicator
      ScratchPad
      SoundSlotTimerListInterf
         SoundSlotTimerListImpl
            SoundSlotTimerListU2
      StaticMeshActor
         ResizableStaticMesh
      SunLight
      TestCrash
      Triggers
         AttachTrigger
         Counter
         Dispatcher
            U2Dispatcher
               U2DispatcherEX
         FadeViewTrigger
         LevelChange
            AtlantisLevelChange
         LineOfSightTrigger
         MaterialTrigger
         MountTrigger
         MusicScriptEvent
         MusicTrigger
         ObjectiveEvent
         ObjectivesTrigger
         RoundRobin
         SpecialEvent
         Trigger
            AlarmTrigger
            CommandTrigger
            CountdownTrigger
            DestroyTrigger
            DialogTrigger
            DoorTrigger
            EarthquakeTrigger
            ElevatorTrigger
            EndLevelTrigger
            GameOverTrigger
            LightTrigger
            ProjectileTrigger
            ScriptTrigger
            ShakeTrigger
            SoundDispatcher
            SpeakerTrigger
            StageTrigger
            SwapTrigger
            TimedTrigger
            ZoneTrigger
         TriggeredTexture
         U2Kicker
            U2KickReflector
         UseTrigger
      U2Troopship
      U2UseManager
         U2UseManagerPlayer
      Util
      UtilGame
      VehiclePart
      VoiceList
         VoiceListAmbient
         VoiceListMarine
         VoiceListMercFemale
         VoiceListMercMale
         VoiceListOtherNPC
      WaveGenerator
      Waypoint
      shianship01
   AdminManager
   AnimEditProps
   BehaviorControllerInterf
      BehaviorControllerBasic
   Bitmap
   BrushBuilder
      ConeBuilder
      CubeBuilder
      CurvedStairBuilder
      CylinderBuilder
      LinearStairBuilder
      SheetBuilder
      SpiralStairBuilder
      TerrainBuilder
      TetrahedronBuilder
      VolumetricBuilder
   Canvas
   CheatManager
   Client
   Commandlet
      ArrayTest
      HelloWorldCommandlet
      SimpleCommandlet
   Console
      DefaultConsole
      UIConsole
   ConsolePlugIn
      TimeDemoPlugin
   DebugInfoManager
      HitActorDebugInfoManager
      ScoreboardInfoManager
   DebugStuff
   Force
      ActorCollisionNotifier
         FlameDamageNotifier
         ParticleDamage
            FT_ParticleDamage
            LG_ParticleDamage
               LG_ParticleDamageEx
      AnchorForce
      AttractionForce
      BlowerForce
      BoneLocatorForce
      CollisionDiscForce
      CollisionSphereForce
      ColorForce
      DecayForce
      DestroyOnDamage
      FadeForce
      FadeInForce
      FadeOutForce
      FrictionForce
      GeometryCollider
         CollisionAnchor
         CollisionGlider
         GeoCollideAndMerge
         GeometryColliderEx
         GlassCollider
         ImpactHandlerForce
         LGalt_GeometryCollider
            LGalt_GeometryColliderFertile
               LGalt_GeometryColliderFertileScripted
      GlobalAccelerator
      InertiaForce
      LimitedResizeForce
      LocationGrouped
      LocatorForce
         SpringLocator
      MaxVelocityForce
      MeshAnchor
      MinDecayForce
      MoveZig
      MultiTemplateForce
      NeuralNetForce
      OnDestroyForce
      OscillatingPerParticleForce
      PerParticleFriction
      PerParticleGravity
      RepulsionForce
      ResizeForce
      RigidBody
      RotationForce
      RotationGrouped
      SlipForce
      SpringForce
      TarpCollider
      TriForce
      TriangleForce
      VariablePerParticleGravity
      VoidDestroyer
      WindForce
   GameAIControllerInterf
      GameAIControllerImpl
         GameAIControllerCTF
         GameAIControllerXMP
   GibSet
      GibSetAraknidHeavy
      GibSetAraknidLight
      GibSetAraknidMedium
      GibSetCockRoach
      GibSetGeneric
      GibSetHumanFlesh
      GibSetIzarian
      GibSetMetal
         GibSetDrakkDroid
         GibSetDrakkLight
         GibSetDrakkMedium
         GibSetHumanMetal
      GibSetNone
      GibSetSkaarj
   I3DL2Listener
      EFFECT_Alley
      EFFECT_Arena
      EFFECT_Auditorium
      EFFECT_Bathroom
      EFFECT_CASTLE_ALCOVE
      EFFECT_CASTLE_COURTYARD
      EFFECT_CASTLE_CUPBOARD
      EFFECT_CASTLE_HALL
      EFFECT_CASTLE_LARGEROOM
      EFFECT_CASTLE_LONGPASSAGE
      EFFECT_CASTLE_MEDIUMROOM
      EFFECT_CASTLE_SHORTPASSAGE
      EFFECT_CASTLE_SMALLROOM
      EFFECT_CHAPEL
      EFFECT_CITY_ABANDONED
      EFFECT_CITY_LIBRARY
      EFFECT_CITY_MUSEUM
      EFFECT_CITY_STREETS
      EFFECT_CITY_SUBWAY
      EFFECT_CITY_UNDERPASS
      EFFECT_CarpetedHallway
      EFFECT_Cave
      EFFECT_City
      EFFECT_ConcertHall
      EFFECT_DOME_SAINTPAULS
      EFFECT_DOME_TOMB
      EFFECT_DRIVING_COMMENTATOR
      EFFECT_DRIVING_EMPTYGRANDSTAND
      EFFECT_DRIVING_FULLGRANDSTAND
      EFFECT_DRIVING_INCAR_LUXURY
      EFFECT_DRIVING_INCAR_RACER
      EFFECT_DRIVING_INCAR_SPORTS
      EFFECT_DRIVING_PITGARAGE
      EFFECT_DRIVING_TUNNEL
      EFFECT_DUSTYROOM
      EFFECT_Dizzy
      EFFECT_Drugged
      EFFECT_FACTORY_ALCOVE
      EFFECT_FACTORY_COURTYARD
      EFFECT_FACTORY_CUPBOARD
      EFFECT_FACTORY_HALL
      EFFECT_FACTORY_LARGEROOM
      EFFECT_FACTORY_LONGPASSAGE
      EFFECT_FACTORY_MEDIUMROOM
      EFFECT_FACTORY_SHORTPASSAGE
      EFFECT_FACTORY_SMALLROOM
      EFFECT_Forest
      EFFECT_Hallway
      EFFECT_Hangar
      EFFECT_ICEPALACE_ALCOVE
      EFFECT_ICEPALACE_COURTYARD
      EFFECT_ICEPALACE_CUPBOARD
      EFFECT_ICEPALACE_HALL
      EFFECT_ICEPALACE_LARGEROOM
      EFFECT_ICEPALACE_LONGPASSAGE
      EFFECT_ICEPALACE_MEDIUMROOM
      EFFECT_ICEPALACE_SHORTPASSAGE
      EFFECT_ICEPALACE_SMALLROOM
      EFFECT_Livingroom
      EFFECT_MOOD_HEAVEN
      EFFECT_MOOD_HELL
      EFFECT_MOOD_MEMORY
      EFFECT_Mountains
      EFFECT_None
      EFFECT_OUTDOORS_BACKYARD
      EFFECT_OUTDOORS_CREEK
      EFFECT_OUTDOORS_DEEPCANYON
      EFFECT_OUTDOORS_ROLLINGPLAINS
      EFFECT_OUTDOORS_VALLEY
      EFFECT_PIPE_LARGE
      EFFECT_PIPE_LONGTHIN
      EFFECT_PIPE_RESONANT
      EFFECT_PIPE_SMALL
      EFFECT_PREFAB_CARAVAN
      EFFECT_PREFAB_OUTHOUSE
      EFFECT_PREFAB_PRACTISEROOM
      EFFECT_PREFAB_SCHOOLROOM
      EFFECT_PREFAB_WORKSHOP
      EFFECT_PaddedCell
      EFFECT_Parkinglot
      EFFECT_Psychotic
      EFFECT_Quarry
      EFFECT_Room
      EFFECT_SMALLWATERROOM
      EFFECT_SPACESTATION_ALCOVE
      EFFECT_SPACESTATION_CUPBOARD
      EFFECT_SPACESTATION_HALL
      EFFECT_SPACESTATION_LARGEROOM
      EFFECT_SPACESTATION_LONGPASSAGE
      EFFECT_SPACESTATION_MEDIUMROOM
      EFFECT_SPACESTATION_SHORTPASSAGE
      EFFECT_SPACESTATION_SMALLROOM
      EFFECT_SPORT_EMPTYSTADIUM
      EFFECT_SPORT_FULLSTADIUM
      EFFECT_SPORT_GYMNASIUM
      EFFECT_SPORT_SMALLSWIMMINGPOOL
      EFFECT_SPORT_SQUASHCOURT
      EFFECT_SPORT_STADIUMTANNOY
      EFFECT_Sewerpipe
      EFFECT_StoneCorridor
      EFFECT_Stoneroom
      EFFECT_Underwater
      EFFECT_WOODEN_ALCOVE
      EFFECT_WOODEN_COURTYARD
      EFFECT_WOODEN_CUPBOARD
      EFFECT_WOODEN_HALL
      EFFECT_WOODEN_LARGEROOM
      EFFECT_WOODEN_LONGPASSAGE
      EFFECT_WOODEN_MEDIUMROOM
      EFFECT_WOODEN_SHORTPASSAGE
      EFFECT_WOODEN_SMALLROOM
   ImpactHandler
      impactAssaultRifle
      impactAssaultRifleAlt
      impactDispersion
      impactEnergyRifle
      impactGrenade
      impactHeavyRocket
      impactLaserRifle
      impactMiniRocket
      impactPistol
      impactShotgun
      impactSniperRifle
      impactTakkra
   KarmaParams
      KarmaParamsRBFull
      KarmaParamsSkel
   LegendObjectComponent
      AnimationControllerInterf
         AnimationControllerBase
      AssetsHelperGeneric
      Collection
         Path
      LegendAssetComponent
      LegendUtil
      TextureHelperGeneric
         BodyLandTextureHelperGeneric
         LandTextureHelperGeneric
         MoveTextureHelperGeneric
         ProneTextureHelperGeneric
   LevelDesc
   LevelSummary
   Locale
   MatObject
      MatAction
         ActionMoveCamera
         ActionPause
      MatSubAction
         SubActionConsoleCommand
         SubActionFOV
         SubActionFade
         SubActionGameSpeed
         SubActionOrientation
         SubActionParticleTrigger
         SubActionSceneSpeed
         SubActionTrigger
   Material
      Combiner
      Modifier
         ColorModifier
         CustomImpactSurface
         FinalBlend
         MaterialSwitch
         TexModifier
            TexEnvMap
            TexMatrix
            TexOscillator
            TexPanner
            TexRotator
            TexScaler
            TexUIhook
      RenderedMaterial
         BitmapMaterial
            ShadowBitmapMaterial
               ShadowBitmapMaterialFallback
            Texture
               Cubemap
               FractalTexture
                  FireTexture
                  IceTexture
                  WaterTexture
                     FluidTexture
                     WaveTexture
                     WetTexture
               ScriptedTexture
               TextureArray
         ConstantMaterial
            ConstantColor
            FadeColor
         ParticleMaterial
         ProjectorMaterial
         Shader
         TerrainMaterial
   MaterialFactory
      FractalTextureFactory
      RawMaterialFactory
   MeshEditProps
   ObjectPool
   Palette
   ParticleEmitter
      BeamEmitter
      MeshEmitter
      SparkEmitter
      SpriteEmitter
   ParticleSystemAssets
   ParticleTemplate
      ActorParticleTemplate
      LineManagerTemplate
      PointParticleTemplate
      PulseLineTemplate
         BendiBeamTemplate
      RecursiveParticleTemplate
      SpriteParticleTemplate
         ParticleDecalTemplate
         Sprite3DParticleTemplate
            RotatingParticleTemplate
         ViewVelocityScaledParticleTemplate
         WetWindshildParticleTemplate
      StrandParticleTemplate
      StreakParticleTemplate
      TarpBuilderTemplate
      TexturedStreakParticleTemplate
      TriParticleTemplate
      TriangleParticleTemplate
   Player
   PlayerInput
   ReachSpec
   RenderIterator
      ActorRotatorRI
      AlwaysFace2RI
      AlwaysFaceRI
      CoronaRI
      DistanceFadeRI
      LineRI
      MaxDecalsRI
      MotionBlurRI
         MedMotionBlurRI
      ParticleSprayerRI
      StreakRI
      WetWindshieldRI
   ScriptControllerInterf
      ScriptControllerBase
   SequEditProps
   SoundSlotInterf
   SoundTable
   Subsystem
      Engine
         EditorEngine
         GameEngine
   TestObj
   TextureTypes
   Time
   TriggerHelper
   UIHelper
      CodeMonkey
      DialogMonkey
      UseReticleMonkey
      WeaponPanel
   UtilSquad
   WebApplication
      HelloWeb
      ImageServer
   WebRequest
   WebResponse

== ==

===Construction Discussion ===

For comments during construction.  This is intended as temporary.

'''RHurter:''' I wanted a complete quick reference list of the classes but was unable to find one. After writing a small program to do the generation thereof, I got the list on top. It is handy, although difficult to see the parent child relationship when it spans a few pages. I'll modify my program to create a wiki-friendly lined output that will be easier to follow.

I'll also split it into a linkable / printable section.

'''Tarquin:''' I can convert this to wiki markup, but it's too much for our parser I think. Please look into moving branches of this tree to other pages first.</text>
    </revision>
    <revision>
      <id>2416</id>
      <timestamp>2005-01-10T20:56:41Z</timestamp>
      <contributor>
        <ip>66.192.30.22</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class Syntax</title>
    <id>683</id>
    <revision>
      <id>1993</id>
      <timestamp>2007-10-25T07:32:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''class''' is a piece of [[Legacy:UnrealScript|UnrealScript]] that can be thought of as a small program. See [[Wikipedia:class (computer science)]] and [[Legacy:Object Oriented Programming Overview|Object Oriented Programming Overview]] for the basics of this concept. The rest of this page covers the UnrealScript syntax for declaring classes.

==Declaration==

Class definition syntax:

&lt;uscript&gt;
class MyClass extends ParentClass &lt;modifiers&gt;;
&lt;/uscript&gt;

===&lt;tt&gt;expands&lt;/tt&gt; vs. &lt;tt&gt;extends&lt;/tt&gt; ===

UnrealScript originally used the keyword &lt;tt&gt;expands&lt;/tt&gt; in the class declaration, but long ago switched to &lt;tt&gt;extends&lt;/tt&gt;, the keyword used in Java. The UT-generation compiler supports both and treats them the same (although &lt;tt&gt;expands&lt;/tt&gt; was considered deprecated for a while already), but in newer engine generations &lt;tt&gt;expands&lt;/tt&gt; won't work. So, always use extends when you have a choice. 

==Optional modifiers ==

===...that affect only this class ===
; abstract : This class cannot be spawned, it's a base class only. Usually the useful functionality is implemented in subclasses. Examples: [[Legacy:Keypoint|Keypoint]], [[Legacy:Triggers|Triggers]], [[Legacy:Pawn|Pawn]].
; config ''or'' config(''name'') : This class supports saving its config properties to a configuration file. By default this is the [[Legacy:Game Ini File|Game Ini File]] (the configuration file that has the same name as the executable file of the game, e.g. UnrealTournament.ini or UT2003.ini). Using &lt;tt&gt;config(''name'')&lt;/tt&gt; overrides the default config file name for this class. There are two special names that can be used here: '''System''' uses the game ini file, '''User''' uses the User.ini. Both names can be mapped to other files via the game's &lt;tt&gt;-ini=...-&lt;/tt&gt; and &lt;tt&gt;-userini=...-&lt;/tt&gt; [[Legacy:Command Line Parameter|command line parameter]]s.
; NoUserCreate : Only in [[Legacy:UT|UT]] or earlier engine versions. This class cannot be placed in a map using UnrealEd. In newer versions, use &lt;tt&gt;notplaceable&lt;/tt&gt;.
; Native : Some behaviour of this class is handled by native code. See [[Legacy:Native Coding|Native Coding]].
; (No)NativeReplication : [[Legacy:Replication|Replication]] of variables and functions declared in this class is completely handled by native code.
; SafeReplace : From a now disappeared page about undocumented UnrealScript features: Specifies that a reference to this class may safely be set to Null or default if the class object can't be found in any packages.  For example, you create a map that uses textures from the package &quot;Rugs.utx&quot;. You have two floors in your map, one surface using the &quot;Persian&quot; texture and the other using the &quot;Throw&quot; texture. If you close your map, delete &quot;Persian&quot; from the texture package and reload your map, the surface that was referencing Persian will be changed to reference the default texture.  This is because the texture class was declared SafeReplace. Note that [[Legacy:Package|package]]s are not SafeReplace. That means if you had deleted the Rugs.utx package completely (deleting the file), your map would not load because the ''package'' must be found.

; Within &lt;i&gt;ClassName&lt;/i&gt; : 
Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later engine version, and with classes not derived from Actor. It allows access to the holding class's members it is declared in. The holding class is optionally pointed to by the identifier 'Outer'. For this to work, the class can only extend Object.

Examples include [[Legacy:PlayerInput|PlayerInput]], [[Legacy:AdminBase|AdminBase]], and [[Legacy:CheatManager|CheatManager]].  All three of these are declared to be &quot;&lt;tt&gt;within [[Legacy:PlayerController|PlayerController]]&lt;/tt&gt;&quot; and extend object.  Since they aren't actors, their functions and variables cannot be replicated.  Also, if you look carefully, you will notice that these classes can call Outer functions (and possibly reference Outer variables) without making an explicit reference to &quot;Outer&quot;.  This has an effect that is somewhat like multiple inheritance, because it can call Outer and Super functions.


; [[Legacy:PerObjectConfig|PerObjectConfig]] : Stores configuration information on a per-object basis rather than a per-class basis. This means that each object should have a separate configuration section in the configuration file based on its name.
; Transient : This class is not included when saving a game state.
; NoExport : Don't export to C++ header.   &quot;&lt;tt&gt;ucc make -h&lt;/tt&gt;&quot; won't automatically generate a C++ header for native functions/events.  Please see the following pages for more information:
; * [http://web.archive.org/web/20010412044804/http://www.sleepwalkertc.com/members/blitz/native/native.html Native Functions]
; * [http://web.archive.org/web/20010124112800/http://www.chessmess.com/musqa-0500.htm#11 UnrealScript Q&amp;A (May 2000)]
; dependsOn(&lt;i&gt;ClassName&lt;/i&gt;) : 
Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later and takes a class name as parameter. Tells the compiler to process another class of the same package first because this class depends on an enum or struct declared in that other class. If your class depends on more classes you have to use the modifier several times, like in [[Legacy:XPawn|xPawn]]:

&lt;uscript&gt;
class xPawn extends UnrealPawn
    config(User)
    dependsOn(xUtil)
    dependsOn(xPawnSoundGroup)
    dependsOn(xPawnGibGroup);
&lt;/uscript&gt;

'''Note:''' The compiler does not check dependson for accuracy and will cause a GPF if you misspell a class name or if you include spaces inside the brackets, like this:

&lt;uscript&gt;
class AClass extends Object
    dependsOn( SomeOtherClass );
&lt;/uscript&gt;

To access the structs in a class that is depended on in this way, you must prefix it with the class name, like so:

&lt;uscript&gt;
class A extends B dependson(ThirdClass);

var ThirdClass.SomeStruct Somevariablename.
&lt;/uscript&gt;

In certain cases the DependsOn() modifier might not be neccessary. Note that you cannot use it to resolve circular dependencies between classes in the same package.


; exportstructs : Export all structs declared in this class to C++ header. This is equivalent to declaring all structs in the class as &quot;&lt;tt&gt;native export&lt;/tt&gt;&quot;

; CacheExempt : UT2004 only.  Only used in cache metaclasses, such as GameInfo, Mutator, Weapon, Vehicle;  ignored for any non-cached class.  This class modifier is used to indicate that the values of this class's cacheable properties should not be exported to the .ucl file.  In general, mod authors will probably never need to use this specifier, as it used for gametypes, weapons, mutators, etc., which should ''not'' appear in GUI/webadmin lists.

; HideDropDown: UT2004 only. This class will not appear in drop down listboxes in UnrealEd.

; ParseConfig: UT2004 only.  The .ini file for this class may be specified on the command-line, using the syntax ' -classname=filename.ini'.  If no parameter is specified on the commandline, the class uses its default configuration file (the system ini, unless a different ini is specified in the class declaration using Config(xx)).  For example, in order to specify a unique .ini file for the usernames &amp; passwords used by the advanced administration system (xAdmin.xAdminConfigIni), add the parameter ' -xAdminConfigIni=filename.ini' to the startup commandline.  If the commandline doesn't contain this parameter, username/password information will be stored in the xAdmin.ini file, because this is what the xAdminConfigIni class declares as its config file.

===...that also affect subclasses ===
; (dont)collapsecategories : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Collapses all property groups into one main property group.
; hidecategories(&lt;i&gt;group list&lt;/i&gt;) : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Takes a comma-seperated list of variable groups. These groups will not be shown in UnrealEd's property windows, e.g. the [[Legacy:Actor Properties|Actor Properties]] or [[Legacy:Texture Properties|Texture Properties]]. (also see [[Legacy:Displaying Variables In UnrealEd|Displaying Variables In UnrealEd]])
; showcategories(&lt;i&gt;group list&lt;/i&gt;) : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Opposite of &lt;tt&gt;hidecategories&lt;/tt&gt;. Variable groups that have been hidden in a superclass can be made visible again with this modifier.
; (not)placeable : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. The class must also be derived from actor or a subclass of actor. This means you can(not) place Actors of this class in a level. 
; (not)editinlinenew : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Classes also cannot be a subclass of actor. See [[Legacy:Editinline|Editinline]].
; instanced : See [[Legacy:Automated Component|Automated Component]].&lt;br /&gt;From what I can gather this signifies that the member variable is owned by the class rather than just being a reference.  It will replace what would normally be a 4-byte reference with an n-byte instance where n = sizeof(YourClass).  The benefit is that it allows Object members to be visable and editable in the Unreal editor without having to derive from Component.&lt;br /&gt;'''WARNING:''' when refactoring and changing to instanced old maps will crash when trying to load.  To fix, delete appropriate world objects from map before refactoring and re-place them after building scripts.

==Working with classes ==

To cover:
* the class&lt;foo&gt; syntax &amp;ndash; see [[Legacy:Peppers And Pepper Grinders|peppers and pepper grinders]]
* the use of myObject.IsA(class)

===Casting ===

rough snip from one of tarquin's unl33t forum postings:

{{innerbox|Example of casting: the syntax

 MyGame(Level.Game).Leader

Level.Game is a variable that's been declared to point to an object of class GameInfo. 

You can make it point to a subclass, that's the whole point of OO (polymorphism, isn't it?)

GameInfo class doesn't have a Leader property, so to access that property, you've got to temporarily specialize that variable. 

}}

See [[Legacy:Typecasting|Typecasting]].

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Typecasting|Typecasting]]
* Other important parts of a class script:
** [[Legacy:Default Properties|Default Properties]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Replication Block|Replication Block]]
** [[Legacy:Variable Syntax|Variable Syntax]]

==Discussion ==

'''DaWrecka:''' Something I've been trying to find out lately is; Is it possible to find out whether an object or actor is abstract, based on the class reference? I'm trying to code a new monster manager for Fraghouse Extension, and I'd like to weed out the abstract classes from the monster list if possible. So far the only plan I've got is trying to spawn the monster, and testing whether it succeeded - a definite Plan Z due to the fact this would be from a GUI. Spawning would work, but the lack of a GameInfo would likely lead to multiple Accessed Nones.

'''Wormbo:''' There's no way to tell directly. Try spawning it in the entry level, that should have a GameInfo.</text>
    </revision>
    <revision>
      <id>1994</id>
      <timestamp>2007-10-25T01:13:28Z</timestamp>
      <contributor>
        <ip>DaWrecka</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A '''class''' is a piece of [[Legacy:UnrealScript|UnrealScript]] that can be thought of as a small program. See [[Wikipedia:class (computer science)]] and [[Legacy:Object Oriented Programming Overview|Object Oriented Programming Overview]] for the basics of this concept. The rest of this page covers the UnrealScript syntax for declaring classes.

==Declaration==

Class definition syntax:

&lt;uscript&gt;
class MyClass extends ParentClass &lt;modifiers&gt;;
&lt;/uscript&gt;

===&lt;tt&gt;expands&lt;/tt&gt; vs. &lt;tt&gt;extends&lt;/tt&gt; ===

UnrealScript originally used the keyword &lt;tt&gt;expands&lt;/tt&gt; in the class declaration, but long ago switched to &lt;tt&gt;extends&lt;/tt&gt;, the keyword used in Java. The UT-generation compiler supports both and treats them the same (although &lt;tt&gt;expands&lt;/tt&gt; was considered deprecated for a while already), but in newer engine generations &lt;tt&gt;expands&lt;/tt&gt; won't work. So, always use extends when you have a choice. 

==Optional modifiers ==

===...that affect only this class ===
; abstract : This class cannot be spawned, it's a base class only. Usually the useful functionality is implemented in subclasses. Examples: [[Legacy:Keypoint|Keypoint]], [[Legacy:Triggers|Triggers]], [[Legacy:Pawn|Pawn]].
; config ''or'' config(''name'') : This class supports saving its config properties to a configuration file. By default this is the [[Legacy:Game Ini File|Game Ini File]] (the configuration file that has the same name as the executable file of the game, e.g. UnrealTournament.ini or UT2003.ini). Using &lt;tt&gt;config(''name'')&lt;/tt&gt; overrides the default config file name for this class. There are two special names that can be used here: '''System''' uses the game ini file, '''User''' uses the User.ini. Both names can be mapped to other files via the game's &lt;tt&gt;-ini=...-&lt;/tt&gt; and &lt;tt&gt;-userini=...-&lt;/tt&gt; [[Legacy:Command Line Parameter|command line parameter]]s.
; NoUserCreate : Only in [[Legacy:UT|UT]] or earlier engine versions. This class cannot be placed in a map using UnrealEd. In newer versions, use &lt;tt&gt;notplaceable&lt;/tt&gt;.
; Native : Some behaviour of this class is handled by native code. See [[Legacy:Native Coding|Native Coding]].
; (No)NativeReplication : [[Legacy:Replication|Replication]] of variables and functions declared in this class is completely handled by native code.
; SafeReplace : From a now disappeared page about undocumented UnrealScript features: Specifies that a reference to this class may safely be set to Null or default if the class object can't be found in any packages.  For example, you create a map that uses textures from the package &quot;Rugs.utx&quot;. You have two floors in your map, one surface using the &quot;Persian&quot; texture and the other using the &quot;Throw&quot; texture. If you close your map, delete &quot;Persian&quot; from the texture package and reload your map, the surface that was referencing Persian will be changed to reference the default texture.  This is because the texture class was declared SafeReplace. Note that [[Legacy:Package|package]]s are not SafeReplace. That means if you had deleted the Rugs.utx package completely (deleting the file), your map would not load because the ''package'' must be found.

; Within &lt;i&gt;ClassName&lt;/i&gt; : 
Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later engine version, and with classes not derived from Actor. It allows access to the holding class's members it is declared in. The holding class is optionally pointed to by the identifier 'Outer'. For this to work, the class can only extend Object.

Examples include [[Legacy:PlayerInput|PlayerInput]], [[Legacy:AdminBase|AdminBase]], and [[Legacy:CheatManager|CheatManager]].  All three of these are declared to be &quot;&lt;tt&gt;within [[Legacy:PlayerController|PlayerController]]&lt;/tt&gt;&quot; and extend object.  Since they aren't actors, their functions and variables cannot be replicated.  Also, if you look carefully, you will notice that these classes can call Outer functions (and possibly reference Outer variables) without making an explicit reference to &quot;Outer&quot;.  This has an effect that is somewhat like multiple inheritance, because it can call Outer and Super functions.


; [[Legacy:PerObjectConfig|PerObjectConfig]] : Stores configuration information on a per-object basis rather than a per-class basis. This means that each object should have a separate configuration section in the configuration file based on its name.
; Transient : This class is not included when saving a game state.
; NoExport : Don't export to C++ header.   &quot;&lt;tt&gt;ucc make -h&lt;/tt&gt;&quot; won't automatically generate a C++ header for native functions/events.  Please see the following pages for more information:
; * [http://web.archive.org/web/20010412044804/http://www.sleepwalkertc.com/members/blitz/native/native.html Native Functions]
; * [http://web.archive.org/web/20010124112800/http://www.chessmess.com/musqa-0500.htm#11 UnrealScript Q&amp;A (May 2000)]
; dependsOn(&lt;i&gt;ClassName&lt;/i&gt;) : 
Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later and takes a class name as parameter. Tells the compiler to process another class of the same package first because this class depends on an enum or struct declared in that other class. If your class depends on more classes you have to use the modifier several times, like in [[Legacy:XPawn|xPawn]]:

&lt;uscript&gt;
class xPawn extends UnrealPawn
    config(User)
    dependsOn(xUtil)
    dependsOn(xPawnSoundGroup)
    dependsOn(xPawnGibGroup);
&lt;/uscript&gt;

'''Note:''' The compiler does not check dependson for accuracy and will cause a GPF if you misspell a class name or if you include spaces inside the brackets, like this:

&lt;uscript&gt;
class AClass extends Object
    dependsOn( SomeOtherClass );
&lt;/uscript&gt;

To access the structs in a class that is depended on in this way, you must prefix it with the class name, like so:

&lt;uscript&gt;
class A extends B dependson(ThirdClass);

var ThirdClass.SomeStruct Somevariablename.
&lt;/uscript&gt;

In certain cases the DependsOn() modifier might not be neccessary. Note that you cannot use it to resolve circular dependencies between classes in the same package.


; exportstructs : Export all structs declared in this class to C++ header. This is equivalent to declaring all structs in the class as &quot;&lt;tt&gt;native export&lt;/tt&gt;&quot;

; CacheExempt : UT2004 only.  Only used in cache metaclasses, such as GameInfo, Mutator, Weapon, Vehicle;  ignored for any non-cached class.  This class modifier is used to indicate that the values of this class's cacheable properties should not be exported to the .ucl file.  In general, mod authors will probably never need to use this specifier, as it used for gametypes, weapons, mutators, etc., which should ''not'' appear in GUI/webadmin lists.

; HideDropDown: UT2004 only. This class will not appear in drop down listboxes in UnrealEd.

; ParseConfig: UT2004 only.  The .ini file for this class may be specified on the command-line, using the syntax ' -classname=filename.ini'.  If no parameter is specified on the commandline, the class uses its default configuration file (the system ini, unless a different ini is specified in the class declaration using Config(xx)).  For example, in order to specify a unique .ini file for the usernames &amp; passwords used by the advanced administration system (xAdmin.xAdminConfigIni), add the parameter ' -xAdminConfigIni=filename.ini' to the startup commandline.  If the commandline doesn't contain this parameter, username/password information will be stored in the xAdmin.ini file, because this is what the xAdminConfigIni class declares as its config file.

===...that also affect subclasses ===
; (dont)collapsecategories : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Collapses all property groups into one main property group.
; hidecategories(&lt;i&gt;group list&lt;/i&gt;) : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Takes a comma-seperated list of variable groups. These groups will not be shown in UnrealEd's property windows, e.g. the [[Legacy:Actor Properties|Actor Properties]] or [[Legacy:Texture Properties|Texture Properties]]. (also see [[Legacy:Displaying Variables In UnrealEd|Displaying Variables In UnrealEd]])
; showcategories(&lt;i&gt;group list&lt;/i&gt;) : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Opposite of &lt;tt&gt;hidecategories&lt;/tt&gt;. Variable groups that have been hidden in a superclass can be made visible again with this modifier.
; (not)placeable : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. The class must also be derived from actor or a subclass of actor. This means you can(not) place Actors of this class in a level. 
; (not)editinlinenew : Only works in [[Legacy:Unreal Engine 2.0|Unreal Engine 2.0]] and later. Classes also cannot be a subclass of actor. See [[Legacy:Editinline|Editinline]].
; instanced : See [[Legacy:Automated Component|Automated Component]].&lt;br /&gt;From what I can gather this signifies that the member variable is owned by the class rather than just being a reference.  It will replace what would normally be a 4-byte reference with an n-byte instance where n = sizeof(YourClass).  The benefit is that it allows Object members to be visable and editable in the Unreal editor without having to derive from Component.&lt;br /&gt;'''WARNING:''' when refactoring and changing to instanced old maps will crash when trying to load.  To fix, delete appropriate world objects from map before refactoring and re-place them after building scripts.

==Working with classes ==

To cover:
* the class&lt;foo&gt; syntax &amp;ndash; see [[Legacy:Peppers And Pepper Grinders|peppers and pepper grinders]]
* the use of myObject.IsA(class)

===Casting ===

rough snip from one of tarquin's unl33t forum postings:

{{innerbox|Example of casting: the syntax

 MyGame(Level.Game).Leader

Level.Game is a variable that's been declared to point to an object of class GameInfo. 

You can make it point to a subclass, that's the whole point of OO (polymorphism, isn't it?)

GameInfo class doesn't have a Leader property, so to access that property, you've got to temporarily specialize that variable. 

}}

See [[Legacy:Typecasting|Typecasting]].

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Typecasting|Typecasting]]
* Other important parts of a class script:
** [[Legacy:Default Properties|Default Properties]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Replication Block|Replication Block]]
** [[Legacy:Variable Syntax|Variable Syntax]]

==Discussion ==

'''DaWrecka:''' Something I've been trying to find out lately is; Is it possible to find out whether an object or actor is abstract, based on the class reference? I'm trying to code a new monster manager for Fraghouse Extension, and I'd like to weed out the abstract classes from the monster list if possible. So far the only plan I've got is trying to spawn the monster, and testing whether it succeeded - a definite Plan Z due to the fact this would be from a GUI. Spawning would work, but the lack of a GameInfo would likely lead to multiple Accessed Nones.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class Tree</title>
    <id>744</id>
    <revision>
      <id>2133</id>
      <timestamp>2007-01-23T09:02:10Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>rv</comment>
      <text xml:space="preserve">A '''class tree''' is the arrangement of classes in a tree-like hierarchy. In OOP, each has a parent and possibly children classes. Unreal uses the class [[Legacy:Object|Object]] as the root of the hierarchy. See [[Wikipedia:Hierarchy (object-oriented programming)]] for more.

==Unreal Tournament 2003/2004==

This version of Unreal Tournament adds significantly to the class tree due to new game types and hordes of default mutators.
* [[Legacy:Object Class Hierarchy|Object Class Hierarchy]]
* [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]]
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]

Some pages have branches of the tree where it's useful to have an overview of all the subclasses. E.g. [[Legacy:Material|Material]] or [[Legacy:NavigationPoint|NavigationPoint]].

You can also enter the tree and browse page by page from [[Legacy:Object|Object]] or [[Legacy:Actor|Actor]]. Or use the search field on every page to directly enter a class name.

==Unreal 2==

Class trees on a single page for [[Legacy:Unreal_2|Unreal_2]]:
* [[Legacy:Class Hierarchy (U2)|Class Hierarchy (U2)]]

==Unreal Tournament==

Class trees on a single page for [[Legacy:Unreal Tournament|Unreal Tournament]]:
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]

You can also enter the tree and browse page by page from [[Legacy:Object (UT)|Object (UT)]] or [[Legacy:Actor (UT)|Actor (UT)]]. Or use the search field on every page to directly enter a class name.

==Categories==

Class pages are tagged with category labels. These include:

* [[:Category:Legacy Class Tree]] &amp;ndash; pages which contain a class tree or a subbranch
* [[:Category:Legacy Class (UT2003)]] &amp;ndash; [[Legacy:UT2003|UT2003]] class spec pages
* [[:Category:Legacy Class (UT2004)]] &amp;ndash; [[Legacy:UT2004|UT2004]] class spec pages
* [[:Category:Legacy Class (UT)]] &amp;ndash; [[Legacy:Unreal 1|Unreal 1]] and [[Legacy:Unreal Tournament|Unreal Tournament]] class spec pages
* [[:Category:Legacy Class (DX)]] &amp;ndash; [[Legacy:Deus Ex|Deus Ex]] classes
* [[:Category:Legacy Class (U2)]] &amp;ndash; [[Legacy:Unreal 2|Unreal 2]] class spec pages
* [[:Category:Legacy Class (RTNP)]] &amp;ndash; [[Legacy:Return To Na Pali|Return to Na Pali]] class spec pages
* [[:Category:Legacy Class (Devastation)]] &amp;ndash; [[Legacy:Devastation|Devastation]] class spec pages
* [[:Category:Legacy Custom Class]] &amp;ndash; custom class spec pages; usually they also belong to one of the above categories

==Related Topics==
* [[Legacy:Actor Classes Browser|Actor Classes Browser]]
* [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Object Oriented Programming Overview|Object Oriented Programming Overview]]
* [[Legacy:UnrealScript Source|UnrealScript Source]]</text>
    </revision>
    <revision>
      <id>2134</id>
      <timestamp>2007-01-22T23:28:37Z</timestamp>
      <contributor>
        <ip>85-20-144-26-static.albacom.net</ip>
      </contributor>
      <comment>http://www.icont.dykwm.com</comment>
      <text xml:space="preserve">rxvhi rphque iohd pjbsxuwrh ehlzumw lfhenbta oqkde</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class Tree (P2)</title>
    <id>866</id>
    <revision>
      <id>2409</id>
      <timestamp>2004-05-27T16:35:17Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve" />
    </revision>
    <revision>
      <id>2410</id>
      <timestamp>2004-05-27T16:34:22Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&quot;&gt;&gt;&quot; indicates the tree is expanded in the following link.

This page is still in progress.

 [[Legacy:Object|Object]]
 +- [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Actor Class Tree (P2)|Actor Class Tree (P2)]]
 +- [[Legacy:AdminBase|AdminBase]]
    +- [[Legacy:Admin|Admin]]
 +- [[Legacy:AnimEditProps|AnimEditProps]]
 +- [[Legacy:AnimNotify|AnimNotify]]
    +- [[Legacy:AnimNotify_DestroyEffect|AnimNotify_DestroyEffect]]
    +- [[Legacy:AnimNotify_Effect|AnimNotify_Effect]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class Tree Listing (DX)</title>
    <id>870</id>
    <revision>
      <id>2417</id>
      <timestamp>2007-05-25T01:05:39Z</timestamp>
      <contributor>
        <ip>CPE-124-178-60-99.wa.bigpond.net.au</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve"> [[Legacy:Object (DX)|Object (DX)]]
 +&amp;ndash; [[Legacy:Actor (DX)|Actor (DX)]] (expanded in [[Legacy:Actor Class Hierarchy (DX)|Actor Class Hierarchy (DX)]]
 +&amp;ndash; All*... (see below)
 +&amp;ndash; [[Legacy:Bitmap (DX)|Bitmap (DX)]]
 |   +&amp;ndash; [[Legacy:Texture (DX)|Texture (DX)]]
 |       +&amp;ndash; [[Legacy:FractalTexture (DX)|FractalTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:FireTexture (DX)|FireTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:IceTexture (DX)|IceTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:WaterTexture (DX)|WaterTexture (DX)]]
 |       |       +&amp;ndash; [[Legacy:WaveTexture (DX)|WaveTexture (DX)]]
 |       |       +&amp;ndash; [[Legacy:WetTexture (DX)|WetTexture (DX)]]
 |       +&amp;ndash; [[Legacy:ScriptedTexture (DX)|ScriptedTexture (DX)]]
 +&amp;ndash; [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:ConeBuilder (DX)|ConeBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:CubeBuilder (DX)|CubeBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:CylinderBuilder (DX)|CylinderBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:SheetBuilder (DX)|SheetBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:TetrahedronBuilder (DX)|TetrahedronBuilder (DX)]]
 +&amp;ndash; [[Legacy:Canvas (DX)|Canvas (DX)]]
 +&amp;ndash; [[Legacy:Commandlet (DX)|Commandlet (DX)]]
 |   +&amp;ndash; [[Legacy:HelloWorldCommandlet (DX)|HelloWorldCommandlet (DX)]]
 +&amp;ndash; [[Legacy:ConObject (DX)|ConObject (DX)]]
 |   +&amp;ndash; [[Legacy:ConAudioList (DX)|ConAudioList (DX)]]
 |   +&amp;ndash; [[Legacy:ConCamera (DX)|ConCamera (DX)]]
 |   +&amp;ndash; [[Legacy:ConChoice (DX)|ConChoice (DX)]]
 |   +&amp;ndash; [[Legacy:ConEvent (DX)|ConEvent (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddCredits (DX)|ConEventAddCredits (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddGoal (DX)|ConEventAddGoal (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddNote (DX)|ConEventAddNote (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddSkillPoints (DX)|ConEventAddSkillPoints (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAnimation (DX)|ConEventAnimation (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckFlag (DX)|ConEventCheckFlag (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckObject (DX)|ConEventCheckObject (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckPersona (DX)|ConEventCheckPersona (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventChoice (DX)|ConEventChoice (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventComment (DX)|ConEventComment (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventEnd (DX)|ConEventEnd (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventJump (DX)|ConEventJump (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventMoveCamera (DX)|ConEventMoveCamera (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventRandomLabel (DX)|ConEventRandomLabel (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventSetFlag (DX)|ConEventSetFlag (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventSpeech (DX)|ConEventSpeech (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTrade (DX)|ConEventTrade (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTransferObject (DX)|ConEventTransferObject (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTrigger (DX)|ConEventTrigger (DX)]]
 |   +&amp;ndash; [[Legacy:ConFlagRef (DX)|ConFlagRef (DX)]]
 |   +&amp;ndash; [[Legacy:ConHistory (DX)|ConHistory (DX)]]
 |   +&amp;ndash; [[Legacy:ConHistoryEvent (DX)|ConHistoryEvent (DX)]]
 |   +&amp;ndash; [[Legacy:ConItem (DX)|ConItem (DX)]]
 |   +&amp;ndash; [[Legacy:ConListItem (DX)|ConListItem (DX)]]
 |   +&amp;ndash; [[Legacy:ConSpeech (DX)|ConSpeech (DX)]]
 |   +&amp;ndash; [[Legacy:Conversation (DX)|Conversation (DX)]]
 |   +&amp;ndash; [[Legacy:ConversationList (DX)|ConversationList (DX)]]
 |   +&amp;ndash; [[Legacy:ConversationMissionList (DX)|ConversationMissionList (DX)]]
 +&amp;ndash; [[Legacy:Console (DX)|Console (DX)]]
 |   +&amp;ndash; [[Legacy:WindowConsole (DX)|WindowConsole (DX)]]
 |       +&amp;ndash; [[Legacy:UBrowserConsole (DX)|UBrowserConsole (DX)]]
 +&amp;ndash; [[Legacy:DataVaultImageNote (DX)|DataVaultImageNote (DX)]]
 +&amp;ndash; [[Legacy:DebugInfo (DX)|DebugInfo (DX)]]
 +&amp;ndash; [[Legacy:DeusExConversations (DX)|DeusExConversations (DX)]]
 +&amp;ndash; [[Legacy:DeusExGoal (DX)|DeusExGoal (DX)]]
 +&amp;ndash; [[Legacy:DeusExLog (DX)|DeusExLog (DX)]]
 +&amp;ndash; [[Legacy:DeusExNote (DX)|DeusExNote (DX)]]
 +&amp;ndash; [[Legacy:DeusExSaveInfo (DX)|DeusExSaveInfo (DX)]]
 +&amp;ndash; [[Legacy:DeusExText (DX)|DeusExText (DX)]]
 +&amp;ndash; [[Legacy:DeusExTextParser (DX)|DeusExTextParser (DX)]]
 +&amp;ndash; [[Legacy:DumpLocation (DX)|DumpLocation (DX)]]
 +&amp;ndash; [[Legacy:ExtensionObject (DX)|ExtensionObject (DX)]]
 |   +&amp;ndash; [[Legacy:Flag (DX)|Flag (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagBool (DX)|FlagBool (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagByte (DX)|FlagByte (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagFloat (DX)|FlagFloat (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagInt (DX)|FlagInt (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagName (DX)|FlagName (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagRotator (DX)|FlagRotator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagVector (DX)|FlagVector (DX)]]
 |   +&amp;ndash; [[Legacy:FlagBase (DX)|FlagBase (DX)]]
 |   +&amp;ndash; [[Legacy:GC (DX)|GC (DX)]]
 |   +&amp;ndash; [[Legacy:Window (DX)|Window (DX)]]
 |       +&amp;ndash; [[Legacy:ActorDisplayWindow (DX)|ActorDisplayWindow (DX)]]
 |       +&amp;ndash; [[Legacy:AlignWindow (DX)|AlignWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ConWindowSpeech (DX)|ConWindowSpeech (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDBarkDisplayItem (DX)|HUDBarkDisplayItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaGoalItemWindow (DX)|PersonaGoalItemWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoItemWindow (DX)|PersonaInfoItemWindow (DX)]]
 |       +&amp;ndash; [[Legacy:BorderWindow (DX)|BorderWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolBorderWindow (DX)|ToolBorderWindow (DX)]]
 |       +&amp;ndash; [[Legacy:CinematicWindow (DX)|CinematicWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerSecurityCameraWindow (DX)|ComputerSecurityCameraWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerUIWindow (DX)|ComputerUIWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATM (DX)|ComputerScreenATM (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATMDisabled (DX)|ComputerScreenATMDisabled (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATMWithdraw (DX)|ComputerScreenATMWithdraw (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenBulletins (DX)|ComputerScreenBulletins (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenEmail (DX)|ComputerScreenEmail (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenLogin (DX)|ComputerScreenLogin (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenSecurity (DX)|ComputerScreenSecurity (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenSpecialOptions (DX)|ComputerScreenSpecialOptions (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerWindow (DX)|ComputerWindow (DX)]]
 |       +&amp;ndash; [[Legacy:Crosshair (DX)|Crosshair (DX)]]
 |       +&amp;ndash; [[Legacy:DamageHUDDisplay (DX)|DamageHUDDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExHUD (DX)|DeusExHUD (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExScopeView (DX)|DeusExScopeView (DX)]]
 |       +&amp;ndash; [[Legacy:FrobDisplayWindow (DX)|FrobDisplayWindow (DX)]]
 |       +&amp;ndash; [[Legacy:HUDBaseWindow (DX)|HUDBaseWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:AugmentationDisplayWindow (DX)|AugmentationDisplayWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenHack (DX)|ComputerScreenHack (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenHackAccounts (DX)|ComputerScreenHackAccounts (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemBase (DX)|HUDActiveItemBase (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveAug (DX)|HUDActiveAug (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveItem (DX)|HUDActiveItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemsBorderBase (DX)|HUDActiveItemsBorderBase (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveAugsBorder (DX)|HUDActiveAugsBorder (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveItemsBorder (DX)|HUDActiveItemsBorder (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemsDisplay (DX)|HUDActiveItemsDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDAmmoDisplay (DX)|HUDAmmoDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDCompassDisplay (DX)|HUDCompassDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDHitDisplay (DX)|HUDHitDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDInfoLinKDisplay (DX)|HUDInfoLinKDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDMultiSkills (DX)|HUDMultiSkills (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDObjectBelt (DX)|HUDObjectBelt (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDSharedBorderWindow (DX)|HUDSharedBorderWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDBarkDisplay (DX)|HUDBarkDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDConWindowFirst (DX)|HUDConWindowFirst (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDInformationDisplay (DX)|HUDInformationDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDLogDisplay (DX)|HUDLogDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDReceivedDisplay (DX)|HUDReceivedDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:HUDMissionStartTextDisplay (DX)|HUDMissionStartTextDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:ListWindow (DX)|ListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIListWindow (DX)|MenuUIListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaListWindow (DX)|PersonaListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolListWindow (DX)|ToolListWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenAdjustColorsExample (DX)|MenuScreenAdjustColorsExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenRGB_HUDExample (DX)|MenuScreenRGB_HUDExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenRGB_MenuExample (DX)|MenuScreenRGB_MenuExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIActionButtonBarWindow (DX)|MenuUIActionButtonBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIChoice (DX)|MenuUIChoice (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceAction (DX)|MenuUIChoiceAction (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_AdjustColors (DX)|MenuChoice_AdjustColors (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Brightness (DX)|MenuChoice_Brightness (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_FullScreen (DX)|MenuChoice_FullScreen (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_RenderDevice (DX)|MenuChoice_RenderDevice (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceEnum (DX)|MenuUIChoiceEnum (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ComputerCameraUIChoice (DX)|ComputerCameraUIChoice (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_Camera (DX)|ComputerSecurityChoice_Camera (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_DoorAccess (DX)|ComputerSecurityChoice_DoorAccess (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_DoorOpen (DX)|ComputerSecurityChoice_DoorOpen (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_MPCamera (DX)|ComputerSecurityChoice_MPCamera (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_Turret (DX)|ComputerSecurityChoice_Turret (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Class (DX)|MenuChoice_Class (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Connection (DX)|MenuChoice_Connection (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Cycle (DX)|MenuChoice_Cycle (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_EnabledDisabled (DX)|MenuChoice_EnabledDisabled (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_AlwaysRun (DX)|MenuChoice_AlwaysRun (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HeadBob (DX)|MenuChoice_HeadBob (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_InvertMouse (DX)|MenuChoice_InvertMouse (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ObjectNames (DX)|MenuChoice_ObjectNames (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ToggleCrouch (DX)|MenuChoice_ToggleCrouch (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_WeaponAutoReload (DX)|MenuChoice_WeaponAutoReload (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_GameType (DX)|MenuChoice_GameType (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_GoreLevel (DX)|MenuChoice_GoreLevel (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDAugDisplay (DX)|MenuChoice_HUDAugDisplay (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_LowMedHigh (DX)|MenuChoice_LowMedHigh (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_WorldTextureDetail (DX)|MenuChoice_WorldTextureDetail (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Map (DX)|MenuChoice_Map (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ObjectTextureDetail (DX)|MenuChoice_ObjectTextureDetail (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_OnOff (DX)|MenuChoice_OnOff (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_AugsAllowed (DX)|MenuChoice_AugsAllowed (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Decals (DX)|MenuChoice_Decals (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_DetailTextures (DX)|MenuChoice_DetailTextures (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDBordersVisible (DX)|MenuChoice_HUDBordersVisible (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDBorderTranslucency (DX)|MenuChoice_HUDBorderTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDTranslucency (DX)|MenuChoice_HUDTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MenuTranslucency (DX)|MenuChoice_MenuTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MultiHelp (DX)|MenuChoice_MultiHelp (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ReverseStereo (DX)|MenuChoice_ReverseStereo (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Subtitles (DX)|MenuChoice_Subtitles (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_SurroundSound (DX)|MenuChoice_SurroundSound (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Use3dHardware (DX)|MenuChoice_Use3dHardware (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Resolution (DX)|MenuChoice_Resolution (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SampleRate (DX)|MenuChoice_SampleRate (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ServerMode (DX)|MenuChoice_ServerMode (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SkillLevel (DX)|MenuChoice_SkillLevel (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SoundQuality (DX)|MenuChoice_SoundQuality (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Team (DX)|MenuChoice_Team (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_TextureColorBits (DX)|MenuChoice_TextureColorBits (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ThemeColor (DX)|MenuChoice_ThemeColor (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDColor (DX)|MenuChoice_HUDColor (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MenuColor (DX)|MenuChoice_MenuColor (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_UIBackground (DX)|MenuChoice_UIBackground (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_VictoryType (DX)|MenuChoice_VictoryType (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_VisibleHidden (DX)|MenuChoice_VisibleHidden (DX)]]
 |       |   |       +&amp;ndash; [[Legacy:MenuChoice_Crosshairs (DX)|MenuChoice_Crosshairs (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceSlider (DX)|MenuUIChoiceSlider (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_AdjustBrightness (DX)|MenuChoice_AdjustBrightness (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_AugBonus (DX)|MenuChoice_AugBonus (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_EffectsChannels (DX)|MenuChoice_EffectsChannels (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_FriendlyFire (DX)|MenuChoice_FriendlyFire (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_LogTimeoutValue (DX)|MenuChoice_LogTimeoutValue (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MaxLogLines (DX)|MenuChoice_MaxLogLines (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MaxPlayers (DX)|MenuChoice_MaxPlayers (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MouseSensitivity (DX)|MenuChoice_MouseSensitivity (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_SkillBonus (DX)|MenuChoice_SkillBonus (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_StartingAugs (DX)|MenuChoice_StartingAugs (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_StartingSkills (DX)|MenuChoice_StartingSkills (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_VictoryValue (DX)|MenuChoice_VictoryValue (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_Volume (DX)|MenuChoice_Volume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_MusicVolume (DX)|MenuChoice_MusicVolume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_SoundVolume (DX)|MenuChoice_SoundVolume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_SpeechVolume (DX)|MenuChoice_SpeechVolume (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIChoiceWindow (DX)|MenuUIChoiceWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIClientWindow (DX)|MenuUIClientWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerUIScaleClientWindow (DX)|ComputerUIScaleClientWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUILeftEdgeWindow (DX)|MenuUILeftEdgeWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUINavBarWindow (DX)|MenuUINavBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUINavButtonWindow (DX)|MenuUINavButtonWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIRGBSliderButtonWindow (DX)|MenuUIRGBSliderButtonWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIRightEdgeWindow (DX)|MenuUIRightEdgeWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIShadowWindow (DX)|MenuUIShadowWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIMessageBoxShadowWindow (DX)|MenuUIMessageBoxShadowWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUISkillInfoWindow (DX)|MenuUISkillInfoWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUISliderButtonWindow (DX)|MenuUISliderButtonWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerSecuritySliderWindow (DX)|ComputerSecuritySliderWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUITitleWindow (DX)|MenuUITitleWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MovingWindow (DX)|MovingWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaAugmentationBodyWindow (DX)|PersonaAugmentationBodyWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaBaseWindow (DX)|PersonaBaseWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDMedBotAugCanWindow (DX)|HUDMedBotAugCanWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaButtonBarWindow (DX)|PersonaButtonBarWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaClientBaseWindow (DX)|PersonaClientBaseWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaClientBorderWindow (DX)|PersonaClientBorderWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaClientWindow (DX)|PersonaClientWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHealthRegionWindow (DX)|PersonaHealthRegionWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaImageWindow (DX)|PersonaImageWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoLineWindow (DX)|PersonaInfoLineWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoWindow (DX)|PersonaInfoWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaInventoryInfoWindow (DX)|PersonaInventoryInfoWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaItemDetailIconWindow (DX)|PersonaItemDetailIconWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaItemDetailWindow (DX)|PersonaItemDetailWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaLevelIconWindow (DX)|PersonaLevelIconWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaNavBarBaseWindow (DX)|PersonaNavBarBaseWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDMedBotNavBarWindow (DX)|HUDMedBotNavBarWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaNavBarWindow (DX)|PersonaNavBarWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaOverlaysWindow (DX)|PersonaOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDMedBotHealthOverlaysWindow (DX)|HUDMedBotHealthOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:PersonaAugmentationOverlaysWindow (DX)|PersonaAugmentationOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:PersonaHealthOverlaysWindow (DX)|PersonaHealthOverlaysWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaHealthBodyWindow (DX)|PersonaHealthBodyWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaInventoryObjectBelt (DX)|PersonaInventoryObjectBelt (DX)]]
 |       +&amp;ndash; [[Legacy:PictureWindow (DX)|PictureWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ProgressBarWindow (DX)|ProgressBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScaleManagerWindow (DX)|ScaleManagerWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScaleWindow (DX)|ScaleWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScrollAreaWindow (DX)|ScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:DeusExScrollAreaWindow (DX)|DeusExScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIScrollAreaWindow (DX)|MenuUIScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaScrollAreaWindow (DX)|PersonaScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolScrollAreaWindow (DX)|ToolScrollAreaWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ShadowWindow (DX)|ShadowWindow (DX)]]
 |       +&amp;ndash; [[Legacy:SpinningLogoWindow (DX)|SpinningLogoWindow (DX)]]
 |       +&amp;ndash; [[Legacy:StaticWindow (DX)|StaticWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TabGroupWindow (DX)|TabGroupWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ClipWindow (DX)|ClipWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ModalWindow (DX)|ModalWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:DeusExBaseWindow (DX)|DeusExBaseWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ConWindow (DX)|ConWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:ConWindowActive (DX)|ConWindowActive (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:CreditsScrollWindow (DX)|CreditsScrollWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:CreditsWindow (DX)|CreditsWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:QuotesWindow (DX)|QuotesWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:DemoSplashWindow (DX)|DemoSplashWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDKeypadWindow (DX)|HUDKeypadWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDMultiplayer (DX)|HUDMultiplayer (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDRechargeWindow (DX)|HUDRechargeWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIWindow (DX)|MenuUIWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIMenuWindow (DX)|MenuUIMenuWindow (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuMain (DX)|MenuMain (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuMPMain (DX)|MenuMPMain (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuSelectDifficulty (DX)|MenuSelectDifficulty (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuSettings (DX)|MenuSettings (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIMessageBoxWindow (DX)|MenuUIMessageBoxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIScreenWindow (DX)|MenuUIScreenWindow (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenAdjustColors (DX)|MenuScreenAdjustColors (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenAugSetup (DX)|MenuScreenAugSetup (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenBrightness (DX)|MenuScreenBrightness (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenControls (DX)|MenuScreenControls (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenCustomizeKeys (DX)|MenuScreenCustomizeKeys (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenDisplay (DX)|MenuScreenDisplay (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenHostGame (DX)|MenuScreenHostGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenHostLan (DX)|MenuScreenHostLan (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenHostNet (DX)|MenuScreenHostNet (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenJoinGame (DX)|MenuScreenJoinGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenJoinInternet (DX)|MenuScreenJoinInternet (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenJoinLan (DX)|MenuScreenJoinLan (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenLoadGame (DX)|MenuScreenLoadGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenSaveGame (DX)|MenuScreenSaveGame (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenNewGame (DX)|MenuScreenNewGame (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenOptions (DX)|MenuScreenOptions (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenPlayerSetup (DX)|MenuScreenPlayerSetup (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenRGB (DX)|MenuScreenRGB (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenSound (DX)|MenuScreenSound (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenThemesLoad (DX)|MenuScreenThemesLoad (DX)]]
 |       |   |   |   |           +&amp;ndash; [[Legacy:MenuScreenThemesSave (DX)|MenuScreenThemesSave (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MultiplayerMessageWin (DX)|MultiplayerMessageWin (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:NetworkTerminal (DX)|NetworkTerminal (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalATM (DX)|NetworkTerminalATM (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:ATMWindow (DX)|ATMWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalPersonal (DX)|NetworkTerminalPersonal (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalPublic (DX)|NetworkTerminalPublic (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalSecurity (DX)|NetworkTerminalSecurity (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaScreenBaseWindow (DX)|PersonaScreenBaseWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenAugmentations (DX)|PersonaScreenAugmentations (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:HUDMedBotAddAugsScreen (DX)|HUDMedBotAddAugsScreen (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenConversations (DX)|PersonaScreenConversations (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenGoals (DX)|PersonaScreenGoals (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenHealth (DX)|PersonaScreenHealth (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:HUDMedBotHealthScreen (DX)|HUDMedBotHealthScreen (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenImages (DX)|PersonaScreenImages (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenInventory (DX)|PersonaScreenInventory (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenLogs (DX)|PersonaScreenLogs (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenSkills (DX)|PersonaScreenSkills (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ToolWindow (DX)|ToolWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:BehindTheCurtain (DX)|BehindTheCurtain (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:BehindTheCurtain_NV (DX)|BehindTheCurtain_NV (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:DumpLocationBaseWindow (DX)|DumpLocationBaseWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationEditWindow (DX)|DumpLocationEditWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationListLocationsWindow (DX)|DumpLocationListLocationsWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationListWindow (DX)|DumpLocationListWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:FlagAddWindow (DX)|FlagAddWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:FlagEditWindow (DX)|FlagEditWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:InvokeConWindow (DX)|InvokeConWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:InvokeConWindowPlus (DX)|InvokeConWindowPlus (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:LoadMapWindow (DX)|LoadMapWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:PlayMusicWindow (DX)|PlayMusicWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:ShowClassWindow (DX)|ShowClassWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:ToolMessageBoxWindow (DX)|ToolMessageBoxWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:RootWindow (DX)|RootWindow (DX)]]
 |       |   |       +&amp;ndash; [[Legacy:DeusExRootWindow (DX)|DeusExRootWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:RadioBoxWindow (DX)|RadioBoxWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:SkillRadioBox (DX)|SkillRadioBox (DX)]]
 |       +&amp;ndash; [[Legacy:TextWindow (DX)|TextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ButtonWindow (DX)|ButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:CharacterModelButton (DX)|CharacterModelButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ComputerSecurityCameraViewButton (DX)|ComputerSecurityCameraViewButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ConChoiceWindow (DX)|ConChoiceWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDKeypadButton (DX)|HUDKeypadButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUIBorderButtonWindow (DX)|MenuUIBorderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIActionButtonWindow (DX)|MenuUIActionButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIChoiceButton (DX)|MenuUIChoiceButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIInfoButtonWindow (DX)|MenuUIInfoButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIStaticInfoWindow (DX)|MenuUIStaticInfoWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIListHeaderButtonWindow (DX)|MenuUIListHeaderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIMenuButtonWindow (DX)|MenuUIMenuButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUISpecialButtonWindow (DX)|MenuUISpecialButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUITabButtonWindow (DX)|MenuUITabButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaBorderButtonWindow (DX)|PersonaBorderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaActionButtonWindow (DX)|PersonaActionButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaNavButtonWindow (DX)|PersonaNavButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaHealthActionButtonWindow (DX)|PersonaHealthActionButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaSkillButtonWindow (DX)|PersonaSkillButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaItemButton (DX)|PersonaItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDMedBotAugItemButton (DX)|HUDMedBotAugItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaAmmoDetailButton (DX)|PersonaAmmoDetailButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaAugmentationItemButton (DX)|PersonaAugmentationItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaHealthItemButton (DX)|PersonaHealthItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaInventoryItemButton (DX)|PersonaInventoryItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaItemDetailButton (DX)|PersonaItemDetailButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ToggleWindow (DX)|ToggleWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:CheckboxWindow (DX)|CheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUICheckboxWindow (DX)|MenuUICheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaCheckboxWindow (DX)|PersonaCheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:ToolCheckboxWindow (DX)|ToolCheckboxWindow (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:ToolRadioButtonWindow (DX)|ToolRadioButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDObjectSlot (DX)|HUDObjectSlot (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ToolButtonWindow (DX)|ToolButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:TutorialButtonWindow (DX)|TutorialButtonWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ConCameraWindow (DX)|ConCameraWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:FadeTextWindow (DX)|FadeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:LargeTextWindow (DX)|LargeTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:EditWindow (DX)|EditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:DeusExEditWindow (DX)|DeusExEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIEditWindow (DX)|MenuUIEditWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUILoadSaveEditWindow (DX)|MenuUILoadSaveEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaEditWindow (DX)|PersonaEditWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaImageNoteWindow (DX)|PersonaImageNoteWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaNotesEditWindow (DX)|PersonaNotesEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ToolEditWindow (DX)|ToolEditWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUINormalLargeTextWindow (DX)|MenuUINormalLargeTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaNormalLargeTextWindow (DX)|PersonaNormalLargeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIHelpWindow (DX)|MenuUIHelpWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUILabelWindow (DX)|MenuUILabelWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUIHeaderWindow (DX)|MenuUIHeaderWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUISmallLabelWindow (DX)|MenuUISmallLabelWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaGoalTextWindow (DX)|PersonaGoalTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHeaderLargeTextWindow (DX)|PersonaHeaderLargeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHeaderTextWindow (DX)|PersonaHeaderTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaNormalTextWindow (DX)|PersonaNormalTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaSkillTextWindow (DX)|PersonaSkillTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaStatusLineWindow (DX)|PersonaStatusLineWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaTitleTextWindow (DX)|PersonaTitleTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:TextLogWindow (DX)|TextLogWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TileWindow (DX)|TileWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDReceivedDisplayItem (DX)|HUDReceivedDisplayItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaImageNewLegendLabel (DX)|PersonaImageNewLegendLabel (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInventoryCreditsWindow (DX)|PersonaInventoryCreditsWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TimerDisplay (DX)|TimerDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:ToolTitleBarWindow (DX)|ToolTitleBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ViewportWindow (DX)|ViewportWindow (DX)]]
 +&amp;ndash; [[Legacy:ExtraMP (DX)|ExtraMP (DX)]]
 +&amp;ndash; [[Legacy:ExtString (DX)|ExtString (DX)]]
 +&amp;ndash; [[Legacy:GameDirectory (DX)|GameDirectory (DX)]]
 +&amp;ndash; [[Legacy:LevelSummary (DX)|LevelSummary (DX)]]
 +&amp;ndash; [[Legacy:Locale (DX)|Locale (DX)]]
 +&amp;ndash; [[Legacy:MenuUIDefaults (DX)|MenuUIDefaults (DX)]]
 +&amp;ndash; [[Legacy:MPItems (DX)|MPItems (DX)]]
 +&amp;ndash; [[Legacy:NanoKeyInfo (DX)|NanoKeyInfo (DX)]]
 +&amp;ndash; [[Legacy:Palette (DX)|Palette (DX)]]
 +&amp;ndash; [[Legacy:Player (DX)|Player (DX)]]
 +&amp;ndash; [[Legacy:RenderIterator (DX)|RenderIterator (DX)]]
 |   +&amp;ndash; [[Legacy:LaserIterator (DX)|LaserIterator (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleIterator (DX)|ParticleIterator (DX)]]
 +&amp;ndash; [[Legacy:Subsystem (DX)|Subsystem (DX)]]
 |   +&amp;ndash; [[Legacy:Engine (DX)|Engine (DX)]]
 |       +&amp;ndash; [[Legacy:EditorEngine (DX)|EditorEngine (DX)]]
 +&amp;ndash; [[Legacy:TestObj (DX)|TestObj (DX)]]
 +&amp;ndash; [[Legacy:Time (DX)|Time (DX)]]
 +&amp;ndash; [[Legacy:UWindowBase (DX)|UWindowBase (DX)]]
     +&amp;ndash; [[Legacy:UWindowList (DX)|UWindowList (DX)]]
     |   +&amp;ndash; [[Legacy:DeusExServerList (DX)|DeusExServerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserPlayerList (DX)|UBrowserPlayerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserRulesList (DX)|UBrowserRulesList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserServerList (DX)|UBrowserServerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserServerListFactory (DX)|UBrowserServerListFactory (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserFavoritesFact (DX)|UBrowserFavoritesFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserGSpyFact (DX)|UBrowserGSpyFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserHTTPFact (DX)|UBrowserHTTPFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserLocalFact (DX)|UBrowserLocalFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserSubsetFact (DX)|UBrowserSubsetFact (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserSubsetList (DX)|UBrowserSubsetList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserSupersetList (DX)|UBrowserSupersetList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowComboListItem (DX)|UWindowComboListItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowDynamicTextRow (DX)|UWindowDynamicTextRow (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowHTMLTextRow (DX)|UWindowHTMLTextRow (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowEditBoxHistory (DX)|UWindowEditBoxHistory (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowHotkeyWindowList (DX)|UWindowHotkeyWindowList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowLayoutBase (DX)|UWindowLayoutBase (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutCell (DX)|UWindowLayoutCell (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutControl (DX)|UWindowLayoutControl (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutRow (DX)|UWindowLayoutRow (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowListBoxItem (DX)|UWindowListBoxItem (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserIRCUserList (DX)|UBrowserIRCUserList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowMenuBarItem (DX)|UWindowMenuBarItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowPulldownMenuItem (DX)|UWindowPulldownMenuItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowTabControlItem (DX)|UWindowTabControlItem (DX)]]
     |       +&amp;ndash; [[Legacy:UWindowPageControlPage (DX)|UWindowPageControlPage (DX)]]
     +&amp;ndash; [[Legacy:UWindowLookAndFeel (DX)|UWindowLookAndFeel (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowWin95LookAndFeel (DX)|UWindowWin95LookAndFeel (DX)]]
     +&amp;ndash; [[Legacy:UWindowWindow (DX)|UWindowWindow (DX)]]
         +&amp;ndash; [[Legacy:UBrowserBannerAd (DX)|UBrowserBannerAd (DX)]]
         +&amp;ndash; [[Legacy:UBrowserBannerBar (DX)|UBrowserBannerBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowBitmap (DX)|UWindowBitmap (DX)]]
         +&amp;ndash; [[Legacy:UWindowClientWindow (DX)|UWindowClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserInfoClientWindow (DX)|UBrowserInfoClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserMainClientWindow (DX)|UBrowserMainClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserScreenshotCW (DX)|UBrowserScreenshotCW (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowDialogClientWindow (DX)|UWindowDialogClientWindow (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserEditFavoriteCW (DX)|UBrowserEditFavoriteCW (DX)]]
         |       |   +&amp;ndash; [[Legacy:UBrowserNewFavoriteCW (DX)|UBrowserNewFavoriteCW (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserIRCSetupClient (DX)|UBrowserIRCSetupClient (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserOpenCW (DX)|UBrowserOpenCW (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowConsoleClientWindow (DX)|UWindowConsoleClientWindow (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowMessageBoxCW (DX)|UWindowMessageBoxCW (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowPageWindow (DX)|UWindowPageWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserIRCPageBase (DX)|UBrowserIRCPageBase (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCChannelPage (DX)|UBrowserIRCChannelPage (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCPrivPage (DX)|UBrowserIRCPrivPage (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCSystemPage (DX)|UBrowserIRCSystemPage (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserIRCWindow (DX)|UBrowserIRCWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserServerListWindow (DX)|UBrowserServerListWindow (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserFavoriteServers (DX)|UBrowserFavoriteServers (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserUpdateServerWindow (DX)|UBrowserUpdateServerWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UWindowScrollingDialogClient (DX)|UWindowScrollingDialogClient (DX)]]
         +&amp;ndash; [[Legacy:UWindowControlFrame (DX)|UWindowControlFrame (DX)]]
         +&amp;ndash; [[Legacy:UWindowDialogControl (DX)|UWindowDialogControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowButton (DX)|UWindowButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UBrowserBrowserButton (DX)|UBrowserBrowserButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowCheckbox (DX)|UWindowCheckbox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboButton (DX)|UWindowComboButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboLeftButton (DX)|UWindowComboLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboRightButton (DX)|UWindowComboRightButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowFrameCloseBox (DX)|UWindowFrameCloseBox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBDownButton (DX)|UWindowSBDownButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBLeftButton (DX)|UWindowSBLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBRightButton (DX)|UWindowSBRightButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBUpButton (DX)|UWindowSBUpButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSmallButton (DX)|UWindowSmallButton (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UWindowSmallCloseButton (DX)|UWindowSmallCloseButton (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UWindowSmallOKButton (DX)|UWindowSmallOKButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSmallCancelButton (DX)|UWindowSmallCancelButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControlLeftButton (DX)|UWindowTabControlLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControlRightButton (DX)|UWindowTabControlRightButton (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowComboControl (DX)|UWindowComboControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowDynamicTextArea (DX)|UWindowDynamicTextArea (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowConsoleTextAreaControl (DX)|UWindowConsoleTextAreaControl (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowHTMLTextArea (DX)|UWindowHTMLTextArea (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserColorIRCTextArea (DX)|UBrowserColorIRCTextArea (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserUpdateServerTextArea (DX)|UBrowserUpdateServerTextArea (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowURLTextArea (DX)|UWindowURLTextArea (DX)]]
         |   |       +&amp;ndash; [[Legacy:UBrowserIRCTextArea (DX)|UBrowserIRCTextArea (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowEditBox (DX)|UWindowEditBox (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowEditControl (DX)|UWindowEditControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowHSliderControl (DX)|UWindowHSliderControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowLabelControl (DX)|UWindowLabelControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowListControl (DX)|UWindowListControl (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboList (DX)|UWindowComboList (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowListBox (DX)|UWindowListBox (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserIRCUserListBox (DX)|UBrowserIRCUserListBox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowMenuBar (DX)|UWindowMenuBar (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowPulldownMenu (DX)|UWindowPulldownMenu (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UWindowRightClickMenu (DX)|UWindowRightClickMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserInfoMenu (DX)|UBrowserInfoMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCChannelMenu (DX)|UBrowserIRCChannelMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCJoinMenu (DX)|UBrowserIRCJoinMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCPrivateMenu (DX)|UBrowserIRCPrivateMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCSystemMenu (DX)|UBrowserIRCSystemMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserRightClickMenu (DX)|UBrowserRightClickMenu (DX)]]
         |   |   |           +&amp;ndash; [[Legacy:UBrowserFavoritesMenu (DX)|UBrowserFavoritesMenu (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControl (DX)|UWindowTabControl (DX)]]
         |   |       +&amp;ndash; [[Legacy:UWindowPageControl (DX)|UWindowPageControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowTextAreaControl (DX)|UWindowTextAreaControl (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowWrappedTextArea (DX)|UWindowWrappedTextArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowFramedWindow (DX)|UWindowFramedWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserEditFavoriteWindow (DX)|UBrowserEditFavoriteWindow (DX)]]
         |   |   +&amp;ndash; [[Legacy:UBrowserNewFavoriteWindow (DX)|UBrowserNewFavoriteWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserInfoWindow (DX)|UBrowserInfoWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserMainWindow (DX)|UBrowserMainWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserOpenWindow (DX)|UBrowserOpenWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowConsoleWindow (DX)|UWindowConsoleWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowMessageBox (DX)|UWindowMessageBox (DX)]]
         +&amp;ndash; [[Legacy:UWindowGrid (DX)|UWindowGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserPlayerGrid (DX)|UBrowserPlayerGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserRulesGrid (DX)|UBrowserRulesGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserServerGrid (DX)|UBrowserServerGrid (DX)]]
         +&amp;ndash; [[Legacy:UWindowGridClient (DX)|UWindowGridClient (DX)]]
         +&amp;ndash; [[Legacy:UWindowGridColumn (DX)|UWindowGridColumn (DX)]]
         +&amp;ndash; [[Legacy:UWindowHScrollBar (DX)|UWindowHScrollBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowHSplitter (DX)|UWindowHSplitter (DX)]]
         +&amp;ndash; [[Legacy:UWindowMessageBoxArea (DX)|UWindowMessageBoxArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowProgressBar (DX)|UWindowProgressBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowRootWindow (DX)|UWindowRootWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserRootWindow (DX)|UBrowserRootWindow (DX)]]
         +&amp;ndash; [[Legacy:UWindowTabControlTabArea (DX)|UWindowTabControlTabArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowVScrollBar (DX)|UWindowVScrollBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowVSplitter (DX)|UWindowVSplitter (DX)]]

===&quot;All&quot; Classes===

Thse classes define stuff to be imported with #EXEC commands.  They have no properties or behavior on their own, and contain meshes and textures unless otherwise specified.
; AllAmmo : Ammunition
; AllAnimals : Animals
; AllDeco : Generic Decorations
; Effects : Effects
; Fragments : Fragments
; AllHongKongDeco : Hong Kong Decorations
; AllMajor : Meshes and textures for major (lead) Actors
; AllMinor : ... for the minor (supporting) Actors
; AllNewYorkDeco : NYC Decorations
; AllParisDeco : Paris Decorations
; AllPickups : Pickups
; AllProjectiles : Projectiles
; AllRobots : Robots
; AllSounds : Imported .WAV audio
; AllUI : Textures used in the UI
; AllWashingtonDeco : Washington DC Decorations
; AllWeapons : Weapons

==Discussion==

'''OlympusMons:''' Gonna give this one a [[:Category:Legacy To Do]] because some of this can go on other pages and using the newer layout the &gt;&gt; indicator will show pages with expanded class trees.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2418</id>
      <timestamp>2004-02-11T03:27:45Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve"> [[Legacy:Object (DX)|Object (DX)]]
 +&amp;ndash; [[Legacy:Actor (DX)|Actor (DX)]] (expanded in [[Legacy:Actor Class Hierarchy (DX)|Actor Class Hierarchy (DX)]]
 +&amp;ndash; All*... (see below)
 +&amp;ndash; [[Legacy:Bitmap (DX)|Bitmap (DX)]]
 |   +&amp;ndash; [[Legacy:Texture (DX)|Texture (DX)]]
 |       +&amp;ndash; [[Legacy:FractalTexture (DX)|FractalTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:FireTexture (DX)|FireTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:IceTexture (DX)|IceTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:WaterTexture (DX)|WaterTexture (DX)]]
 |       |       +&amp;ndash; [[Legacy:WaveTexture (DX)|WaveTexture (DX)]]
 |       |       +&amp;ndash; [[Legacy:WetTexture (DX)|WetTexture (DX)]]
 |       +&amp;ndash; [[Legacy:ScriptedTexture (DX)|ScriptedTexture (DX)]]
 +&amp;ndash; [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:ConeBuilder (DX)|ConeBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:CubeBuilder (DX)|CubeBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:CylinderBuilder (DX)|CylinderBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:SheetBuilder (DX)|SheetBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:TetrahedronBuilder (DX)|TetrahedronBuilder (DX)]]
 +&amp;ndash; [[Legacy:Canvas (DX)|Canvas (DX)]]
 +&amp;ndash; [[Legacy:Commandlet (DX)|Commandlet (DX)]]
 |   +&amp;ndash; [[Legacy:DXTextExporter (DX)|DXTextExporter (DX)]]
 |   +&amp;ndash; [[Legacy:HelloWorldCommandlet (DX)|HelloWorldCommandlet (DX)]]
 +&amp;ndash; [[Legacy:ConObject (DX)|ConObject (DX)]]
 |   +&amp;ndash; [[Legacy:ConAudioList (DX)|ConAudioList (DX)]]
 |   +&amp;ndash; [[Legacy:ConCamera (DX)|ConCamera (DX)]]
 |   +&amp;ndash; [[Legacy:ConChoice (DX)|ConChoice (DX)]]
 |   +&amp;ndash; [[Legacy:ConEvent (DX)|ConEvent (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddCredits (DX)|ConEventAddCredits (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddGoal (DX)|ConEventAddGoal (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddNote (DX)|ConEventAddNote (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddSkillPoints (DX)|ConEventAddSkillPoints (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAnimation (DX)|ConEventAnimation (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckFlag (DX)|ConEventCheckFlag (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckObject (DX)|ConEventCheckObject (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckPersona (DX)|ConEventCheckPersona (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventChoice (DX)|ConEventChoice (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventComment (DX)|ConEventComment (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventEnd (DX)|ConEventEnd (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventJump (DX)|ConEventJump (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventMoveCamera (DX)|ConEventMoveCamera (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventRandomLabel (DX)|ConEventRandomLabel (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventSetFlag (DX)|ConEventSetFlag (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventSpeech (DX)|ConEventSpeech (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTrade (DX)|ConEventTrade (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTransferObject (DX)|ConEventTransferObject (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTrigger (DX)|ConEventTrigger (DX)]]
 |   +&amp;ndash; [[Legacy:ConFlagRef (DX)|ConFlagRef (DX)]]
 |   +&amp;ndash; [[Legacy:ConHistory (DX)|ConHistory (DX)]]
 |   +&amp;ndash; [[Legacy:ConHistoryEvent (DX)|ConHistoryEvent (DX)]]
 |   +&amp;ndash; [[Legacy:ConItem (DX)|ConItem (DX)]]
 |   +&amp;ndash; [[Legacy:ConListItem (DX)|ConListItem (DX)]]
 |   +&amp;ndash; [[Legacy:ConSpeech (DX)|ConSpeech (DX)]]
 |   +&amp;ndash; [[Legacy:Conversation (DX)|Conversation (DX)]]
 |   +&amp;ndash; [[Legacy:ConversationList (DX)|ConversationList (DX)]]
 |   +&amp;ndash; [[Legacy:ConversationMissionList (DX)|ConversationMissionList (DX)]]
 +&amp;ndash; [[Legacy:Console (DX)|Console (DX)]]
 |   +&amp;ndash; [[Legacy:WindowConsole (DX)|WindowConsole (DX)]]
 |       +&amp;ndash; [[Legacy:UBrowserConsole (DX)|UBrowserConsole (DX)]]
 +&amp;ndash; [[Legacy:DataVaultImageNote (DX)|DataVaultImageNote (DX)]]
 +&amp;ndash; [[Legacy:DebugInfo (DX)|DebugInfo (DX)]]
 +&amp;ndash; [[Legacy:DeusExConversations (DX)|DeusExConversations (DX)]]
 +&amp;ndash; [[Legacy:DeusExGoal (DX)|DeusExGoal (DX)]]
 +&amp;ndash; [[Legacy:DeusExLog (DX)|DeusExLog (DX)]]
 +&amp;ndash; [[Legacy:DeusExNote (DX)|DeusExNote (DX)]]
 +&amp;ndash; [[Legacy:DeusExSaveInfo (DX)|DeusExSaveInfo (DX)]]
 +&amp;ndash; [[Legacy:DeusExText (DX)|DeusExText (DX)]]
 +&amp;ndash; [[Legacy:DeusExTextParser (DX)|DeusExTextParser (DX)]]
 +&amp;ndash; [[Legacy:DumpLocation (DX)|DumpLocation (DX)]]
 +&amp;ndash; [[Legacy:ExtensionObject (DX)|ExtensionObject (DX)]]
 |   +&amp;ndash; [[Legacy:Flag (DX)|Flag (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagBool (DX)|FlagBool (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagByte (DX)|FlagByte (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagFloat (DX)|FlagFloat (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagInt (DX)|FlagInt (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagName (DX)|FlagName (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagRotator (DX)|FlagRotator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagVector (DX)|FlagVector (DX)]]
 |   +&amp;ndash; [[Legacy:FlagBase (DX)|FlagBase (DX)]]
 |   +&amp;ndash; [[Legacy:GC (DX)|GC (DX)]]
 |   +&amp;ndash; [[Legacy:Window (DX)|Window (DX)]]
 |       +&amp;ndash; [[Legacy:ActorDisplayWindow (DX)|ActorDisplayWindow (DX)]]
 |       +&amp;ndash; [[Legacy:AlignWindow (DX)|AlignWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ConWindowSpeech (DX)|ConWindowSpeech (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDBarkDisplayItem (DX)|HUDBarkDisplayItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaGoalItemWindow (DX)|PersonaGoalItemWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoItemWindow (DX)|PersonaInfoItemWindow (DX)]]
 |       +&amp;ndash; [[Legacy:BorderWindow (DX)|BorderWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolBorderWindow (DX)|ToolBorderWindow (DX)]]
 |       +&amp;ndash; [[Legacy:CinematicWindow (DX)|CinematicWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerSecurityCameraWindow (DX)|ComputerSecurityCameraWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerUIWindow (DX)|ComputerUIWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATM (DX)|ComputerScreenATM (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATMDisabled (DX)|ComputerScreenATMDisabled (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATMWithdraw (DX)|ComputerScreenATMWithdraw (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenBulletins (DX)|ComputerScreenBulletins (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenEmail (DX)|ComputerScreenEmail (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenLogin (DX)|ComputerScreenLogin (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenSecurity (DX)|ComputerScreenSecurity (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenSpecialOptions (DX)|ComputerScreenSpecialOptions (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerWindow (DX)|ComputerWindow (DX)]]
 |       +&amp;ndash; [[Legacy:Crosshair (DX)|Crosshair (DX)]]
 |       +&amp;ndash; [[Legacy:DamageHUDDisplay (DX)|DamageHUDDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExHUD (DX)|DeusExHUD (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExScopeView (DX)|DeusExScopeView (DX)]]
 |       +&amp;ndash; [[Legacy:FrobDisplayWindow (DX)|FrobDisplayWindow (DX)]]
 |       +&amp;ndash; [[Legacy:HUDBaseWindow (DX)|HUDBaseWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:AugmentationDisplayWindow (DX)|AugmentationDisplayWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenHack (DX)|ComputerScreenHack (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenHackAccounts (DX)|ComputerScreenHackAccounts (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemBase (DX)|HUDActiveItemBase (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveAug (DX)|HUDActiveAug (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveItem (DX)|HUDActiveItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemsBorderBase (DX)|HUDActiveItemsBorderBase (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveAugsBorder (DX)|HUDActiveAugsBorder (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveItemsBorder (DX)|HUDActiveItemsBorder (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemsDisplay (DX)|HUDActiveItemsDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDAmmoDisplay (DX)|HUDAmmoDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDCompassDisplay (DX)|HUDCompassDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDHitDisplay (DX)|HUDHitDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDInfoLinKDisplay (DX)|HUDInfoLinKDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDMultiSkills (DX)|HUDMultiSkills (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDObjectBelt (DX)|HUDObjectBelt (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDSharedBorderWindow (DX)|HUDSharedBorderWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDBarkDisplay (DX)|HUDBarkDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDConWindowFirst (DX)|HUDConWindowFirst (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDInformationDisplay (DX)|HUDInformationDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDLogDisplay (DX)|HUDLogDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDReceivedDisplay (DX)|HUDReceivedDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:HUDMissionStartTextDisplay (DX)|HUDMissionStartTextDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:ListWindow (DX)|ListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIListWindow (DX)|MenuUIListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaListWindow (DX)|PersonaListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolListWindow (DX)|ToolListWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenAdjustColorsExample (DX)|MenuScreenAdjustColorsExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenRGB_HUDExample (DX)|MenuScreenRGB_HUDExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenRGB_MenuExample (DX)|MenuScreenRGB_MenuExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIActionButtonBarWindow (DX)|MenuUIActionButtonBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIChoice (DX)|MenuUIChoice (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceAction (DX)|MenuUIChoiceAction (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_AdjustColors (DX)|MenuChoice_AdjustColors (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Brightness (DX)|MenuChoice_Brightness (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_FullScreen (DX)|MenuChoice_FullScreen (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_RenderDevice (DX)|MenuChoice_RenderDevice (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceEnum (DX)|MenuUIChoiceEnum (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ComputerCameraUIChoice (DX)|ComputerCameraUIChoice (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_Camera (DX)|ComputerSecurityChoice_Camera (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_DoorAccess (DX)|ComputerSecurityChoice_DoorAccess (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_DoorOpen (DX)|ComputerSecurityChoice_DoorOpen (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_MPCamera (DX)|ComputerSecurityChoice_MPCamera (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_Turret (DX)|ComputerSecurityChoice_Turret (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Class (DX)|MenuChoice_Class (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Connection (DX)|MenuChoice_Connection (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Cycle (DX)|MenuChoice_Cycle (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_EnabledDisabled (DX)|MenuChoice_EnabledDisabled (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_AlwaysRun (DX)|MenuChoice_AlwaysRun (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HeadBob (DX)|MenuChoice_HeadBob (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_InvertMouse (DX)|MenuChoice_InvertMouse (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ObjectNames (DX)|MenuChoice_ObjectNames (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ToggleCrouch (DX)|MenuChoice_ToggleCrouch (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_WeaponAutoReload (DX)|MenuChoice_WeaponAutoReload (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_GameType (DX)|MenuChoice_GameType (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_GoreLevel (DX)|MenuChoice_GoreLevel (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDAugDisplay (DX)|MenuChoice_HUDAugDisplay (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_LowMedHigh (DX)|MenuChoice_LowMedHigh (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_WorldTextureDetail (DX)|MenuChoice_WorldTextureDetail (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Map (DX)|MenuChoice_Map (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ObjectTextureDetail (DX)|MenuChoice_ObjectTextureDetail (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_OnOff (DX)|MenuChoice_OnOff (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_AugsAllowed (DX)|MenuChoice_AugsAllowed (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Decals (DX)|MenuChoice_Decals (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_DetailTextures (DX)|MenuChoice_DetailTextures (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDBordersVisible (DX)|MenuChoice_HUDBordersVisible (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDBorderTranslucency (DX)|MenuChoice_HUDBorderTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDTranslucency (DX)|MenuChoice_HUDTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MenuTranslucency (DX)|MenuChoice_MenuTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MultiHelp (DX)|MenuChoice_MultiHelp (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ReverseStereo (DX)|MenuChoice_ReverseStereo (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Subtitles (DX)|MenuChoice_Subtitles (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_SurroundSound (DX)|MenuChoice_SurroundSound (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Use3dHardware (DX)|MenuChoice_Use3dHardware (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Resolution (DX)|MenuChoice_Resolution (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SampleRate (DX)|MenuChoice_SampleRate (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ServerMode (DX)|MenuChoice_ServerMode (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SkillLevel (DX)|MenuChoice_SkillLevel (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SoundQuality (DX)|MenuChoice_SoundQuality (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Team (DX)|MenuChoice_Team (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_TextureColorBits (DX)|MenuChoice_TextureColorBits (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ThemeColor (DX)|MenuChoice_ThemeColor (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDColor (DX)|MenuChoice_HUDColor (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MenuColor (DX)|MenuChoice_MenuColor (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_UIBackground (DX)|MenuChoice_UIBackground (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_VictoryType (DX)|MenuChoice_VictoryType (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_VisibleHidden (DX)|MenuChoice_VisibleHidden (DX)]]
 |       |   |       +&amp;ndash; [[Legacy:MenuChoice_Crosshairs (DX)|MenuChoice_Crosshairs (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceSlider (DX)|MenuUIChoiceSlider (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_AdjustBrightness (DX)|MenuChoice_AdjustBrightness (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_AugBonus (DX)|MenuChoice_AugBonus (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_EffectsChannels (DX)|MenuChoice_EffectsChannels (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_FriendlyFire (DX)|MenuChoice_FriendlyFire (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_LogTimeoutValue (DX)|MenuChoice_LogTimeoutValue (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MaxLogLines (DX)|MenuChoice_MaxLogLines (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MaxPlayers (DX)|MenuChoice_MaxPlayers (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MouseSensitivity (DX)|MenuChoice_MouseSensitivity (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_SkillBonus (DX)|MenuChoice_SkillBonus (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_StartingAugs (DX)|MenuChoice_StartingAugs (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_StartingSkills (DX)|MenuChoice_StartingSkills (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_VictoryValue (DX)|MenuChoice_VictoryValue (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_Volume (DX)|MenuChoice_Volume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_MusicVolume (DX)|MenuChoice_MusicVolume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_SoundVolume (DX)|MenuChoice_SoundVolume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_SpeechVolume (DX)|MenuChoice_SpeechVolume (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIChoiceWindow (DX)|MenuUIChoiceWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIClientWindow (DX)|MenuUIClientWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerUIScaleClientWindow (DX)|ComputerUIScaleClientWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUILeftEdgeWindow (DX)|MenuUILeftEdgeWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUINavBarWindow (DX)|MenuUINavBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUINavButtonWindow (DX)|MenuUINavButtonWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIRGBSliderButtonWindow (DX)|MenuUIRGBSliderButtonWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIRightEdgeWindow (DX)|MenuUIRightEdgeWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIShadowWindow (DX)|MenuUIShadowWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIMessageBoxShadowWindow (DX)|MenuUIMessageBoxShadowWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUISkillInfoWindow (DX)|MenuUISkillInfoWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUISliderButtonWindow (DX)|MenuUISliderButtonWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerSecuritySliderWindow (DX)|ComputerSecuritySliderWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUITitleWindow (DX)|MenuUITitleWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MovingWindow (DX)|MovingWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaAugmentationBodyWindow (DX)|PersonaAugmentationBodyWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaBaseWindow (DX)|PersonaBaseWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDMedBotAugCanWindow (DX)|HUDMedBotAugCanWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaButtonBarWindow (DX)|PersonaButtonBarWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaClientBaseWindow (DX)|PersonaClientBaseWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaClientBorderWindow (DX)|PersonaClientBorderWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaClientWindow (DX)|PersonaClientWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHealthRegionWindow (DX)|PersonaHealthRegionWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaImageWindow (DX)|PersonaImageWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoLineWindow (DX)|PersonaInfoLineWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoWindow (DX)|PersonaInfoWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaInventoryInfoWindow (DX)|PersonaInventoryInfoWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaItemDetailIconWindow (DX)|PersonaItemDetailIconWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaItemDetailWindow (DX)|PersonaItemDetailWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaLevelIconWindow (DX)|PersonaLevelIconWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaNavBarBaseWindow (DX)|PersonaNavBarBaseWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDMedBotNavBarWindow (DX)|HUDMedBotNavBarWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaNavBarWindow (DX)|PersonaNavBarWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaOverlaysWindow (DX)|PersonaOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDMedBotHealthOverlaysWindow (DX)|HUDMedBotHealthOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:PersonaAugmentationOverlaysWindow (DX)|PersonaAugmentationOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:PersonaHealthOverlaysWindow (DX)|PersonaHealthOverlaysWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaHealthBodyWindow (DX)|PersonaHealthBodyWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaInventoryObjectBelt (DX)|PersonaInventoryObjectBelt (DX)]]
 |       +&amp;ndash; [[Legacy:PictureWindow (DX)|PictureWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ProgressBarWindow (DX)|ProgressBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScaleManagerWindow (DX)|ScaleManagerWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScaleWindow (DX)|ScaleWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScrollAreaWindow (DX)|ScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:DeusExScrollAreaWindow (DX)|DeusExScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIScrollAreaWindow (DX)|MenuUIScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaScrollAreaWindow (DX)|PersonaScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolScrollAreaWindow (DX)|ToolScrollAreaWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ShadowWindow (DX)|ShadowWindow (DX)]]
 |       +&amp;ndash; [[Legacy:SpinningLogoWindow (DX)|SpinningLogoWindow (DX)]]
 |       +&amp;ndash; [[Legacy:StaticWindow (DX)|StaticWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TabGroupWindow (DX)|TabGroupWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ClipWindow (DX)|ClipWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ModalWindow (DX)|ModalWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:DeusExBaseWindow (DX)|DeusExBaseWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ConWindow (DX)|ConWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:ConWindowActive (DX)|ConWindowActive (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:CreditsScrollWindow (DX)|CreditsScrollWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:CreditsWindow (DX)|CreditsWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:QuotesWindow (DX)|QuotesWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:DemoSplashWindow (DX)|DemoSplashWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDKeypadWindow (DX)|HUDKeypadWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDMultiplayer (DX)|HUDMultiplayer (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDRechargeWindow (DX)|HUDRechargeWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIWindow (DX)|MenuUIWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIMenuWindow (DX)|MenuUIMenuWindow (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuMain (DX)|MenuMain (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuMPMain (DX)|MenuMPMain (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuSelectDifficulty (DX)|MenuSelectDifficulty (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuSettings (DX)|MenuSettings (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIMessageBoxWindow (DX)|MenuUIMessageBoxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIScreenWindow (DX)|MenuUIScreenWindow (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenAdjustColors (DX)|MenuScreenAdjustColors (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenAugSetup (DX)|MenuScreenAugSetup (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenBrightness (DX)|MenuScreenBrightness (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenControls (DX)|MenuScreenControls (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenCustomizeKeys (DX)|MenuScreenCustomizeKeys (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenDisplay (DX)|MenuScreenDisplay (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenHostGame (DX)|MenuScreenHostGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenHostLan (DX)|MenuScreenHostLan (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenHostNet (DX)|MenuScreenHostNet (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenJoinGame (DX)|MenuScreenJoinGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenJoinInternet (DX)|MenuScreenJoinInternet (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenJoinLan (DX)|MenuScreenJoinLan (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenLoadGame (DX)|MenuScreenLoadGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenSaveGame (DX)|MenuScreenSaveGame (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenNewGame (DX)|MenuScreenNewGame (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenOptions (DX)|MenuScreenOptions (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenPlayerSetup (DX)|MenuScreenPlayerSetup (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenRGB (DX)|MenuScreenRGB (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenSound (DX)|MenuScreenSound (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenThemesLoad (DX)|MenuScreenThemesLoad (DX)]]
 |       |   |   |   |           +&amp;ndash; [[Legacy:MenuScreenThemesSave (DX)|MenuScreenThemesSave (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MultiplayerMessageWin (DX)|MultiplayerMessageWin (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:NetworkTerminal (DX)|NetworkTerminal (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalATM (DX)|NetworkTerminalATM (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:ATMWindow (DX)|ATMWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalPersonal (DX)|NetworkTerminalPersonal (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalPublic (DX)|NetworkTerminalPublic (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalSecurity (DX)|NetworkTerminalSecurity (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaScreenBaseWindow (DX)|PersonaScreenBaseWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenAugmentations (DX)|PersonaScreenAugmentations (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:HUDMedBotAddAugsScreen (DX)|HUDMedBotAddAugsScreen (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenConversations (DX)|PersonaScreenConversations (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenGoals (DX)|PersonaScreenGoals (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenHealth (DX)|PersonaScreenHealth (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:HUDMedBotHealthScreen (DX)|HUDMedBotHealthScreen (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenImages (DX)|PersonaScreenImages (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenInventory (DX)|PersonaScreenInventory (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenLogs (DX)|PersonaScreenLogs (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenSkills (DX)|PersonaScreenSkills (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ToolWindow (DX)|ToolWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:BehindTheCurtain (DX)|BehindTheCurtain (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:BehindTheCurtain_NV (DX)|BehindTheCurtain_NV (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:DumpLocationBaseWindow (DX)|DumpLocationBaseWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationEditWindow (DX)|DumpLocationEditWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationListLocationsWindow (DX)|DumpLocationListLocationsWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationListWindow (DX)|DumpLocationListWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:FlagAddWindow (DX)|FlagAddWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:FlagEditWindow (DX)|FlagEditWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:InvokeConWindow (DX)|InvokeConWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:InvokeConWindowPlus (DX)|InvokeConWindowPlus (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:LoadMapWindow (DX)|LoadMapWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:PlayMusicWindow (DX)|PlayMusicWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:ShowClassWindow (DX)|ShowClassWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:ToolMessageBoxWindow (DX)|ToolMessageBoxWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:RootWindow (DX)|RootWindow (DX)]]
 |       |   |       +&amp;ndash; [[Legacy:DeusExRootWindow (DX)|DeusExRootWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:RadioBoxWindow (DX)|RadioBoxWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:SkillRadioBox (DX)|SkillRadioBox (DX)]]
 |       +&amp;ndash; [[Legacy:TextWindow (DX)|TextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ButtonWindow (DX)|ButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:CharacterModelButton (DX)|CharacterModelButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ComputerSecurityCameraViewButton (DX)|ComputerSecurityCameraViewButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ConChoiceWindow (DX)|ConChoiceWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDKeypadButton (DX)|HUDKeypadButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUIBorderButtonWindow (DX)|MenuUIBorderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIActionButtonWindow (DX)|MenuUIActionButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIChoiceButton (DX)|MenuUIChoiceButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIInfoButtonWindow (DX)|MenuUIInfoButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIStaticInfoWindow (DX)|MenuUIStaticInfoWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIListHeaderButtonWindow (DX)|MenuUIListHeaderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIMenuButtonWindow (DX)|MenuUIMenuButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUISpecialButtonWindow (DX)|MenuUISpecialButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUITabButtonWindow (DX)|MenuUITabButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaBorderButtonWindow (DX)|PersonaBorderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaActionButtonWindow (DX)|PersonaActionButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaNavButtonWindow (DX)|PersonaNavButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaHealthActionButtonWindow (DX)|PersonaHealthActionButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaSkillButtonWindow (DX)|PersonaSkillButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaItemButton (DX)|PersonaItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDMedBotAugItemButton (DX)|HUDMedBotAugItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaAmmoDetailButton (DX)|PersonaAmmoDetailButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaAugmentationItemButton (DX)|PersonaAugmentationItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaHealthItemButton (DX)|PersonaHealthItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaInventoryItemButton (DX)|PersonaInventoryItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaItemDetailButton (DX)|PersonaItemDetailButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ToggleWindow (DX)|ToggleWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:CheckboxWindow (DX)|CheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUICheckboxWindow (DX)|MenuUICheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaCheckboxWindow (DX)|PersonaCheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:ToolCheckboxWindow (DX)|ToolCheckboxWindow (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:ToolRadioButtonWindow (DX)|ToolRadioButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDObjectSlot (DX)|HUDObjectSlot (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ToolButtonWindow (DX)|ToolButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:TutorialButtonWindow (DX)|TutorialButtonWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ConCameraWindow (DX)|ConCameraWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:FadeTextWindow (DX)|FadeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:LargeTextWindow (DX)|LargeTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:EditWindow (DX)|EditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:DeusExEditWindow (DX)|DeusExEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIEditWindow (DX)|MenuUIEditWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUILoadSaveEditWindow (DX)|MenuUILoadSaveEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaEditWindow (DX)|PersonaEditWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaImageNoteWindow (DX)|PersonaImageNoteWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaNotesEditWindow (DX)|PersonaNotesEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ToolEditWindow (DX)|ToolEditWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUINormalLargeTextWindow (DX)|MenuUINormalLargeTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaNormalLargeTextWindow (DX)|PersonaNormalLargeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIHelpWindow (DX)|MenuUIHelpWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUILabelWindow (DX)|MenuUILabelWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUIHeaderWindow (DX)|MenuUIHeaderWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUISmallLabelWindow (DX)|MenuUISmallLabelWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaGoalTextWindow (DX)|PersonaGoalTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHeaderLargeTextWindow (DX)|PersonaHeaderLargeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHeaderTextWindow (DX)|PersonaHeaderTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaNormalTextWindow (DX)|PersonaNormalTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaSkillTextWindow (DX)|PersonaSkillTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaStatusLineWindow (DX)|PersonaStatusLineWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaTitleTextWindow (DX)|PersonaTitleTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:TextLogWindow (DX)|TextLogWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TileWindow (DX)|TileWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDReceivedDisplayItem (DX)|HUDReceivedDisplayItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaImageNewLegendLabel (DX)|PersonaImageNewLegendLabel (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInventoryCreditsWindow (DX)|PersonaInventoryCreditsWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TimerDisplay (DX)|TimerDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:ToolTitleBarWindow (DX)|ToolTitleBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ViewportWindow (DX)|ViewportWindow (DX)]]
 +&amp;ndash; [[Legacy:ExtraMP (DX)|ExtraMP (DX)]]
 +&amp;ndash; [[Legacy:ExtString (DX)|ExtString (DX)]]
 +&amp;ndash; [[Legacy:GameDirectory (DX)|GameDirectory (DX)]]
 +&amp;ndash; [[Legacy:LevelSummary (DX)|LevelSummary (DX)]]
 +&amp;ndash; [[Legacy:Locale (DX)|Locale (DX)]]
 +&amp;ndash; [[Legacy:MenuUIDefaults (DX)|MenuUIDefaults (DX)]]
 +&amp;ndash; [[Legacy:MPItems (DX)|MPItems (DX)]]
 +&amp;ndash; [[Legacy:NanoKeyInfo (DX)|NanoKeyInfo (DX)]]
 +&amp;ndash; [[Legacy:Palette (DX)|Palette (DX)]]
 +&amp;ndash; [[Legacy:Player (DX)|Player (DX)]]
 +&amp;ndash; [[Legacy:RenderIterator (DX)|RenderIterator (DX)]]
 |   +&amp;ndash; [[Legacy:LaserIterator (DX)|LaserIterator (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleIterator (DX)|ParticleIterator (DX)]]
 +&amp;ndash; [[Legacy:Subsystem (DX)|Subsystem (DX)]]
 |   +&amp;ndash; [[Legacy:Engine (DX)|Engine (DX)]]
 |       +&amp;ndash; [[Legacy:EditorEngine (DX)|EditorEngine (DX)]]
 +&amp;ndash; [[Legacy:TestObj (DX)|TestObj (DX)]]
 +&amp;ndash; [[Legacy:Time (DX)|Time (DX)]]
 +&amp;ndash; [[Legacy:UWindowBase (DX)|UWindowBase (DX)]]
     +&amp;ndash; [[Legacy:UWindowList (DX)|UWindowList (DX)]]
     |   +&amp;ndash; [[Legacy:DeusExServerList (DX)|DeusExServerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserPlayerList (DX)|UBrowserPlayerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserRulesList (DX)|UBrowserRulesList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserServerList (DX)|UBrowserServerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserServerListFactory (DX)|UBrowserServerListFactory (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserFavoritesFact (DX)|UBrowserFavoritesFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserGSpyFact (DX)|UBrowserGSpyFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserHTTPFact (DX)|UBrowserHTTPFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserLocalFact (DX)|UBrowserLocalFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserSubsetFact (DX)|UBrowserSubsetFact (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserSubsetList (DX)|UBrowserSubsetList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserSupersetList (DX)|UBrowserSupersetList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowComboListItem (DX)|UWindowComboListItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowDynamicTextRow (DX)|UWindowDynamicTextRow (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowHTMLTextRow (DX)|UWindowHTMLTextRow (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowEditBoxHistory (DX)|UWindowEditBoxHistory (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowHotkeyWindowList (DX)|UWindowHotkeyWindowList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowLayoutBase (DX)|UWindowLayoutBase (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutCell (DX)|UWindowLayoutCell (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutControl (DX)|UWindowLayoutControl (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutRow (DX)|UWindowLayoutRow (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowListBoxItem (DX)|UWindowListBoxItem (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserIRCUserList (DX)|UBrowserIRCUserList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowMenuBarItem (DX)|UWindowMenuBarItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowPulldownMenuItem (DX)|UWindowPulldownMenuItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowTabControlItem (DX)|UWindowTabControlItem (DX)]]
     |       +&amp;ndash; [[Legacy:UWindowPageControlPage (DX)|UWindowPageControlPage (DX)]]
     +&amp;ndash; [[Legacy:UWindowLookAndFeel (DX)|UWindowLookAndFeel (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowWin95LookAndFeel (DX)|UWindowWin95LookAndFeel (DX)]]
     +&amp;ndash; [[Legacy:UWindowWindow (DX)|UWindowWindow (DX)]]
         +&amp;ndash; [[Legacy:UBrowserBannerAd (DX)|UBrowserBannerAd (DX)]]
         +&amp;ndash; [[Legacy:UBrowserBannerBar (DX)|UBrowserBannerBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowBitmap (DX)|UWindowBitmap (DX)]]
         +&amp;ndash; [[Legacy:UWindowClientWindow (DX)|UWindowClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserInfoClientWindow (DX)|UBrowserInfoClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserMainClientWindow (DX)|UBrowserMainClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserScreenshotCW (DX)|UBrowserScreenshotCW (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowDialogClientWindow (DX)|UWindowDialogClientWindow (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserEditFavoriteCW (DX)|UBrowserEditFavoriteCW (DX)]]
         |       |   +&amp;ndash; [[Legacy:UBrowserNewFavoriteCW (DX)|UBrowserNewFavoriteCW (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserIRCSetupClient (DX)|UBrowserIRCSetupClient (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserOpenCW (DX)|UBrowserOpenCW (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowConsoleClientWindow (DX)|UWindowConsoleClientWindow (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowMessageBoxCW (DX)|UWindowMessageBoxCW (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowPageWindow (DX)|UWindowPageWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserIRCPageBase (DX)|UBrowserIRCPageBase (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCChannelPage (DX)|UBrowserIRCChannelPage (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCPrivPage (DX)|UBrowserIRCPrivPage (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCSystemPage (DX)|UBrowserIRCSystemPage (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserIRCWindow (DX)|UBrowserIRCWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserServerListWindow (DX)|UBrowserServerListWindow (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserFavoriteServers (DX)|UBrowserFavoriteServers (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserUpdateServerWindow (DX)|UBrowserUpdateServerWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UWindowScrollingDialogClient (DX)|UWindowScrollingDialogClient (DX)]]
         +&amp;ndash; [[Legacy:UWindowControlFrame (DX)|UWindowControlFrame (DX)]]
         +&amp;ndash; [[Legacy:UWindowDialogControl (DX)|UWindowDialogControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowButton (DX)|UWindowButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UBrowserBrowserButton (DX)|UBrowserBrowserButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowCheckbox (DX)|UWindowCheckbox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboButton (DX)|UWindowComboButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboLeftButton (DX)|UWindowComboLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboRightButton (DX)|UWindowComboRightButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowFrameCloseBox (DX)|UWindowFrameCloseBox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBDownButton (DX)|UWindowSBDownButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBLeftButton (DX)|UWindowSBLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBRightButton (DX)|UWindowSBRightButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBUpButton (DX)|UWindowSBUpButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSmallButton (DX)|UWindowSmallButton (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UWindowSmallCloseButton (DX)|UWindowSmallCloseButton (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UWindowSmallOKButton (DX)|UWindowSmallOKButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSmallCancelButton (DX)|UWindowSmallCancelButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControlLeftButton (DX)|UWindowTabControlLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControlRightButton (DX)|UWindowTabControlRightButton (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowComboControl (DX)|UWindowComboControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowDynamicTextArea (DX)|UWindowDynamicTextArea (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowConsoleTextAreaControl (DX)|UWindowConsoleTextAreaControl (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowHTMLTextArea (DX)|UWindowHTMLTextArea (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserColorIRCTextArea (DX)|UBrowserColorIRCTextArea (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserUpdateServerTextArea (DX)|UBrowserUpdateServerTextArea (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowURLTextArea (DX)|UWindowURLTextArea (DX)]]
         |   |       +&amp;ndash; [[Legacy:UBrowserIRCTextArea (DX)|UBrowserIRCTextArea (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowEditBox (DX)|UWindowEditBox (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowEditControl (DX)|UWindowEditControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowHSliderControl (DX)|UWindowHSliderControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowLabelControl (DX)|UWindowLabelControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowListControl (DX)|UWindowListControl (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboList (DX)|UWindowComboList (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowListBox (DX)|UWindowListBox (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserIRCUserListBox (DX)|UBrowserIRCUserListBox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowMenuBar (DX)|UWindowMenuBar (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowPulldownMenu (DX)|UWindowPulldownMenu (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UWindowRightClickMenu (DX)|UWindowRightClickMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserInfoMenu (DX)|UBrowserInfoMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCChannelMenu (DX)|UBrowserIRCChannelMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCJoinMenu (DX)|UBrowserIRCJoinMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCPrivateMenu (DX)|UBrowserIRCPrivateMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCSystemMenu (DX)|UBrowserIRCSystemMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserRightClickMenu (DX)|UBrowserRightClickMenu (DX)]]
         |   |   |           +&amp;ndash; [[Legacy:UBrowserFavoritesMenu (DX)|UBrowserFavoritesMenu (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControl (DX)|UWindowTabControl (DX)]]
         |   |       +&amp;ndash; [[Legacy:UWindowPageControl (DX)|UWindowPageControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowTextAreaControl (DX)|UWindowTextAreaControl (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowWrappedTextArea (DX)|UWindowWrappedTextArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowFramedWindow (DX)|UWindowFramedWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserEditFavoriteWindow (DX)|UBrowserEditFavoriteWindow (DX)]]
         |   |   +&amp;ndash; [[Legacy:UBrowserNewFavoriteWindow (DX)|UBrowserNewFavoriteWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserInfoWindow (DX)|UBrowserInfoWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserMainWindow (DX)|UBrowserMainWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserOpenWindow (DX)|UBrowserOpenWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowConsoleWindow (DX)|UWindowConsoleWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowMessageBox (DX)|UWindowMessageBox (DX)]]
         +&amp;ndash; [[Legacy:UWindowGrid (DX)|UWindowGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserPlayerGrid (DX)|UBrowserPlayerGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserRulesGrid (DX)|UBrowserRulesGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserServerGrid (DX)|UBrowserServerGrid (DX)]]
         +&amp;ndash; [[Legacy:UWindowGridClient (DX)|UWindowGridClient (DX)]]
         +&amp;ndash; [[Legacy:UWindowGridColumn (DX)|UWindowGridColumn (DX)]]
         +&amp;ndash; [[Legacy:UWindowHScrollBar (DX)|UWindowHScrollBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowHSplitter (DX)|UWindowHSplitter (DX)]]
         +&amp;ndash; [[Legacy:UWindowMessageBoxArea (DX)|UWindowMessageBoxArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowProgressBar (DX)|UWindowProgressBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowRootWindow (DX)|UWindowRootWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserRootWindow (DX)|UBrowserRootWindow (DX)]]
         +&amp;ndash; [[Legacy:UWindowTabControlTabArea (DX)|UWindowTabControlTabArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowVScrollBar (DX)|UWindowVScrollBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowVSplitter (DX)|UWindowVSplitter (DX)]]

===&quot;All&quot; Classes===

Thse classes define stuff to be imported with #EXEC commands.  They have no properties or behavior on their own, and contain meshes and textures unless otherwise specified.
; AllAmmo : Ammunition
; AllAnimals : Animals
; AllDeco : Generic Decorations
; Effects : Effects
; Fragments : Fragments
; AllHongKongDeco : Hong Kong Decorations
; AllMajor : Meshes and textures for major (lead) Actors
; AllMinor : ... for the minor (supporting) Actors
; AllNewYorkDeco : NYC Decorations
; AllParisDeco : Paris Decorations
; AllPickups : Pickups
; AllProjectiles : Projectiles
; AllRobots : Robots
; AllSounds : Imported .WAV audio
; AllUI : Textures used in the UI
; AllWashingtonDeco : Washington DC Decorations
; AllWeapons : Weapons

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2419</id>
      <timestamp>2004-02-15T09:47:23Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>Silly Xhiris, DXTextExporter isn't built in. :)</comment>
      <text xml:space="preserve"> [[Legacy:Object (DX)|Object (DX)]]
 +&amp;ndash; [[Legacy:Actor (DX)|Actor (DX)]] (expanded in [[Legacy:Actor Class Hierarchy (DX)|Actor Class Hierarchy (DX)]]
 +&amp;ndash; All*... (see below)
 +&amp;ndash; [[Legacy:Bitmap (DX)|Bitmap (DX)]]
 |   +&amp;ndash; [[Legacy:Texture (DX)|Texture (DX)]]
 |       +&amp;ndash; [[Legacy:FractalTexture (DX)|FractalTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:FireTexture (DX)|FireTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:IceTexture (DX)|IceTexture (DX)]]
 |       |   +&amp;ndash; [[Legacy:WaterTexture (DX)|WaterTexture (DX)]]
 |       |       +&amp;ndash; [[Legacy:WaveTexture (DX)|WaveTexture (DX)]]
 |       |       +&amp;ndash; [[Legacy:WetTexture (DX)|WetTexture (DX)]]
 |       +&amp;ndash; [[Legacy:ScriptedTexture (DX)|ScriptedTexture (DX)]]
 +&amp;ndash; [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:ConeBuilder (DX)|ConeBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:CubeBuilder (DX)|CubeBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:CylinderBuilder (DX)|CylinderBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:SheetBuilder (DX)|SheetBuilder (DX)]]
 |   +&amp;ndash; [[Legacy:TetrahedronBuilder (DX)|TetrahedronBuilder (DX)]]
 +&amp;ndash; [[Legacy:Canvas (DX)|Canvas (DX)]]
 +&amp;ndash; [[Legacy:Commandlet (DX)|Commandlet (DX)]]
 |   +&amp;ndash; [[Legacy:HelloWorldCommandlet (DX)|HelloWorldCommandlet (DX)]]
 +&amp;ndash; [[Legacy:ConObject (DX)|ConObject (DX)]]
 |   +&amp;ndash; [[Legacy:ConAudioList (DX)|ConAudioList (DX)]]
 |   +&amp;ndash; [[Legacy:ConCamera (DX)|ConCamera (DX)]]
 |   +&amp;ndash; [[Legacy:ConChoice (DX)|ConChoice (DX)]]
 |   +&amp;ndash; [[Legacy:ConEvent (DX)|ConEvent (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddCredits (DX)|ConEventAddCredits (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddGoal (DX)|ConEventAddGoal (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddNote (DX)|ConEventAddNote (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAddSkillPoints (DX)|ConEventAddSkillPoints (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventAnimation (DX)|ConEventAnimation (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckFlag (DX)|ConEventCheckFlag (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckObject (DX)|ConEventCheckObject (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventCheckPersona (DX)|ConEventCheckPersona (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventChoice (DX)|ConEventChoice (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventComment (DX)|ConEventComment (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventEnd (DX)|ConEventEnd (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventJump (DX)|ConEventJump (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventMoveCamera (DX)|ConEventMoveCamera (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventRandomLabel (DX)|ConEventRandomLabel (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventSetFlag (DX)|ConEventSetFlag (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventSpeech (DX)|ConEventSpeech (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTrade (DX)|ConEventTrade (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTransferObject (DX)|ConEventTransferObject (DX)]]
 |   |   +&amp;ndash; [[Legacy:ConEventTrigger (DX)|ConEventTrigger (DX)]]
 |   +&amp;ndash; [[Legacy:ConFlagRef (DX)|ConFlagRef (DX)]]
 |   +&amp;ndash; [[Legacy:ConHistory (DX)|ConHistory (DX)]]
 |   +&amp;ndash; [[Legacy:ConHistoryEvent (DX)|ConHistoryEvent (DX)]]
 |   +&amp;ndash; [[Legacy:ConItem (DX)|ConItem (DX)]]
 |   +&amp;ndash; [[Legacy:ConListItem (DX)|ConListItem (DX)]]
 |   +&amp;ndash; [[Legacy:ConSpeech (DX)|ConSpeech (DX)]]
 |   +&amp;ndash; [[Legacy:Conversation (DX)|Conversation (DX)]]
 |   +&amp;ndash; [[Legacy:ConversationList (DX)|ConversationList (DX)]]
 |   +&amp;ndash; [[Legacy:ConversationMissionList (DX)|ConversationMissionList (DX)]]
 +&amp;ndash; [[Legacy:Console (DX)|Console (DX)]]
 |   +&amp;ndash; [[Legacy:WindowConsole (DX)|WindowConsole (DX)]]
 |       +&amp;ndash; [[Legacy:UBrowserConsole (DX)|UBrowserConsole (DX)]]
 +&amp;ndash; [[Legacy:DataVaultImageNote (DX)|DataVaultImageNote (DX)]]
 +&amp;ndash; [[Legacy:DebugInfo (DX)|DebugInfo (DX)]]
 +&amp;ndash; [[Legacy:DeusExConversations (DX)|DeusExConversations (DX)]]
 +&amp;ndash; [[Legacy:DeusExGoal (DX)|DeusExGoal (DX)]]
 +&amp;ndash; [[Legacy:DeusExLog (DX)|DeusExLog (DX)]]
 +&amp;ndash; [[Legacy:DeusExNote (DX)|DeusExNote (DX)]]
 +&amp;ndash; [[Legacy:DeusExSaveInfo (DX)|DeusExSaveInfo (DX)]]
 +&amp;ndash; [[Legacy:DeusExText (DX)|DeusExText (DX)]]
 +&amp;ndash; [[Legacy:DeusExTextParser (DX)|DeusExTextParser (DX)]]
 +&amp;ndash; [[Legacy:DumpLocation (DX)|DumpLocation (DX)]]
 +&amp;ndash; [[Legacy:ExtensionObject (DX)|ExtensionObject (DX)]]
 |   +&amp;ndash; [[Legacy:Flag (DX)|Flag (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagBool (DX)|FlagBool (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagByte (DX)|FlagByte (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagFloat (DX)|FlagFloat (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagInt (DX)|FlagInt (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagName (DX)|FlagName (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagRotator (DX)|FlagRotator (DX)]]
 |   |   +&amp;ndash; [[Legacy:FlagVector (DX)|FlagVector (DX)]]
 |   +&amp;ndash; [[Legacy:FlagBase (DX)|FlagBase (DX)]]
 |   +&amp;ndash; [[Legacy:GC (DX)|GC (DX)]]
 |   +&amp;ndash; [[Legacy:Window (DX)|Window (DX)]]
 |       +&amp;ndash; [[Legacy:ActorDisplayWindow (DX)|ActorDisplayWindow (DX)]]
 |       +&amp;ndash; [[Legacy:AlignWindow (DX)|AlignWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ConWindowSpeech (DX)|ConWindowSpeech (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDBarkDisplayItem (DX)|HUDBarkDisplayItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaGoalItemWindow (DX)|PersonaGoalItemWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoItemWindow (DX)|PersonaInfoItemWindow (DX)]]
 |       +&amp;ndash; [[Legacy:BorderWindow (DX)|BorderWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolBorderWindow (DX)|ToolBorderWindow (DX)]]
 |       +&amp;ndash; [[Legacy:CinematicWindow (DX)|CinematicWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerSecurityCameraWindow (DX)|ComputerSecurityCameraWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerUIWindow (DX)|ComputerUIWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATM (DX)|ComputerScreenATM (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATMDisabled (DX)|ComputerScreenATMDisabled (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenATMWithdraw (DX)|ComputerScreenATMWithdraw (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenBulletins (DX)|ComputerScreenBulletins (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenEmail (DX)|ComputerScreenEmail (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenLogin (DX)|ComputerScreenLogin (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenSecurity (DX)|ComputerScreenSecurity (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenSpecialOptions (DX)|ComputerScreenSpecialOptions (DX)]]
 |       +&amp;ndash; [[Legacy:ComputerWindow (DX)|ComputerWindow (DX)]]
 |       +&amp;ndash; [[Legacy:Crosshair (DX)|Crosshair (DX)]]
 |       +&amp;ndash; [[Legacy:DamageHUDDisplay (DX)|DamageHUDDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExHUD (DX)|DeusExHUD (DX)]]
 |       +&amp;ndash; [[Legacy:DeusExScopeView (DX)|DeusExScopeView (DX)]]
 |       +&amp;ndash; [[Legacy:FrobDisplayWindow (DX)|FrobDisplayWindow (DX)]]
 |       +&amp;ndash; [[Legacy:HUDBaseWindow (DX)|HUDBaseWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:AugmentationDisplayWindow (DX)|AugmentationDisplayWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenHack (DX)|ComputerScreenHack (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerScreenHackAccounts (DX)|ComputerScreenHackAccounts (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemBase (DX)|HUDActiveItemBase (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveAug (DX)|HUDActiveAug (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveItem (DX)|HUDActiveItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemsBorderBase (DX)|HUDActiveItemsBorderBase (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveAugsBorder (DX)|HUDActiveAugsBorder (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDActiveItemsBorder (DX)|HUDActiveItemsBorder (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDActiveItemsDisplay (DX)|HUDActiveItemsDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDAmmoDisplay (DX)|HUDAmmoDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDCompassDisplay (DX)|HUDCompassDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDHitDisplay (DX)|HUDHitDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDInfoLinKDisplay (DX)|HUDInfoLinKDisplay (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDMultiSkills (DX)|HUDMultiSkills (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDObjectBelt (DX)|HUDObjectBelt (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDSharedBorderWindow (DX)|HUDSharedBorderWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDBarkDisplay (DX)|HUDBarkDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDConWindowFirst (DX)|HUDConWindowFirst (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDInformationDisplay (DX)|HUDInformationDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDLogDisplay (DX)|HUDLogDisplay (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDReceivedDisplay (DX)|HUDReceivedDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:HUDMissionStartTextDisplay (DX)|HUDMissionStartTextDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:ListWindow (DX)|ListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIListWindow (DX)|MenuUIListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaListWindow (DX)|PersonaListWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolListWindow (DX)|ToolListWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenAdjustColorsExample (DX)|MenuScreenAdjustColorsExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenRGB_HUDExample (DX)|MenuScreenRGB_HUDExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuScreenRGB_MenuExample (DX)|MenuScreenRGB_MenuExample (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIActionButtonBarWindow (DX)|MenuUIActionButtonBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIChoice (DX)|MenuUIChoice (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceAction (DX)|MenuUIChoiceAction (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_AdjustColors (DX)|MenuChoice_AdjustColors (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Brightness (DX)|MenuChoice_Brightness (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_FullScreen (DX)|MenuChoice_FullScreen (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_RenderDevice (DX)|MenuChoice_RenderDevice (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceEnum (DX)|MenuUIChoiceEnum (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ComputerCameraUIChoice (DX)|ComputerCameraUIChoice (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_Camera (DX)|ComputerSecurityChoice_Camera (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_DoorAccess (DX)|ComputerSecurityChoice_DoorAccess (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_DoorOpen (DX)|ComputerSecurityChoice_DoorOpen (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_MPCamera (DX)|ComputerSecurityChoice_MPCamera (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ComputerSecurityChoice_Turret (DX)|ComputerSecurityChoice_Turret (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Class (DX)|MenuChoice_Class (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Connection (DX)|MenuChoice_Connection (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Cycle (DX)|MenuChoice_Cycle (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_EnabledDisabled (DX)|MenuChoice_EnabledDisabled (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_AlwaysRun (DX)|MenuChoice_AlwaysRun (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HeadBob (DX)|MenuChoice_HeadBob (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_InvertMouse (DX)|MenuChoice_InvertMouse (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ObjectNames (DX)|MenuChoice_ObjectNames (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ToggleCrouch (DX)|MenuChoice_ToggleCrouch (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_WeaponAutoReload (DX)|MenuChoice_WeaponAutoReload (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_GameType (DX)|MenuChoice_GameType (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_GoreLevel (DX)|MenuChoice_GoreLevel (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDAugDisplay (DX)|MenuChoice_HUDAugDisplay (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_LowMedHigh (DX)|MenuChoice_LowMedHigh (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_WorldTextureDetail (DX)|MenuChoice_WorldTextureDetail (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Map (DX)|MenuChoice_Map (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ObjectTextureDetail (DX)|MenuChoice_ObjectTextureDetail (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_OnOff (DX)|MenuChoice_OnOff (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_AugsAllowed (DX)|MenuChoice_AugsAllowed (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Decals (DX)|MenuChoice_Decals (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_DetailTextures (DX)|MenuChoice_DetailTextures (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDBordersVisible (DX)|MenuChoice_HUDBordersVisible (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDBorderTranslucency (DX)|MenuChoice_HUDBorderTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDTranslucency (DX)|MenuChoice_HUDTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MenuTranslucency (DX)|MenuChoice_MenuTranslucency (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MultiHelp (DX)|MenuChoice_MultiHelp (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_ReverseStereo (DX)|MenuChoice_ReverseStereo (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Subtitles (DX)|MenuChoice_Subtitles (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_SurroundSound (DX)|MenuChoice_SurroundSound (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_Use3dHardware (DX)|MenuChoice_Use3dHardware (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Resolution (DX)|MenuChoice_Resolution (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SampleRate (DX)|MenuChoice_SampleRate (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ServerMode (DX)|MenuChoice_ServerMode (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SkillLevel (DX)|MenuChoice_SkillLevel (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_SoundQuality (DX)|MenuChoice_SoundQuality (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_Team (DX)|MenuChoice_Team (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_TextureColorBits (DX)|MenuChoice_TextureColorBits (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_ThemeColor (DX)|MenuChoice_ThemeColor (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_HUDColor (DX)|MenuChoice_HUDColor (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuChoice_MenuColor (DX)|MenuChoice_MenuColor (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_UIBackground (DX)|MenuChoice_UIBackground (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_VictoryType (DX)|MenuChoice_VictoryType (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuChoice_VisibleHidden (DX)|MenuChoice_VisibleHidden (DX)]]
 |       |   |       +&amp;ndash; [[Legacy:MenuChoice_Crosshairs (DX)|MenuChoice_Crosshairs (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIChoiceSlider (DX)|MenuUIChoiceSlider (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_AdjustBrightness (DX)|MenuChoice_AdjustBrightness (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_AugBonus (DX)|MenuChoice_AugBonus (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_EffectsChannels (DX)|MenuChoice_EffectsChannels (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_FriendlyFire (DX)|MenuChoice_FriendlyFire (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_LogTimeoutValue (DX)|MenuChoice_LogTimeoutValue (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MaxLogLines (DX)|MenuChoice_MaxLogLines (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MaxPlayers (DX)|MenuChoice_MaxPlayers (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_MouseSensitivity (DX)|MenuChoice_MouseSensitivity (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_SkillBonus (DX)|MenuChoice_SkillBonus (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_StartingAugs (DX)|MenuChoice_StartingAugs (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_StartingSkills (DX)|MenuChoice_StartingSkills (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_VictoryValue (DX)|MenuChoice_VictoryValue (DX)]]
 |       |       +&amp;ndash; [[Legacy:MenuChoice_Volume (DX)|MenuChoice_Volume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_MusicVolume (DX)|MenuChoice_MusicVolume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_SoundVolume (DX)|MenuChoice_SoundVolume (DX)]]
 |       |           +&amp;ndash; [[Legacy:MenuChoice_SpeechVolume (DX)|MenuChoice_SpeechVolume (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIChoiceWindow (DX)|MenuUIChoiceWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIClientWindow (DX)|MenuUIClientWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerUIScaleClientWindow (DX)|ComputerUIScaleClientWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUILeftEdgeWindow (DX)|MenuUILeftEdgeWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUINavBarWindow (DX)|MenuUINavBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUINavButtonWindow (DX)|MenuUINavButtonWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIRGBSliderButtonWindow (DX)|MenuUIRGBSliderButtonWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIRightEdgeWindow (DX)|MenuUIRightEdgeWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUIShadowWindow (DX)|MenuUIShadowWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIMessageBoxShadowWindow (DX)|MenuUIMessageBoxShadowWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUISkillInfoWindow (DX)|MenuUISkillInfoWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUISliderButtonWindow (DX)|MenuUISliderButtonWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ComputerSecuritySliderWindow (DX)|ComputerSecuritySliderWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MenuUITitleWindow (DX)|MenuUITitleWindow (DX)]]
 |       +&amp;ndash; [[Legacy:MovingWindow (DX)|MovingWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaAugmentationBodyWindow (DX)|PersonaAugmentationBodyWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaBaseWindow (DX)|PersonaBaseWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDMedBotAugCanWindow (DX)|HUDMedBotAugCanWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaButtonBarWindow (DX)|PersonaButtonBarWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaClientBaseWindow (DX)|PersonaClientBaseWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaClientBorderWindow (DX)|PersonaClientBorderWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaClientWindow (DX)|PersonaClientWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHealthRegionWindow (DX)|PersonaHealthRegionWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaImageWindow (DX)|PersonaImageWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoLineWindow (DX)|PersonaInfoLineWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInfoWindow (DX)|PersonaInfoWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaInventoryInfoWindow (DX)|PersonaInventoryInfoWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaItemDetailIconWindow (DX)|PersonaItemDetailIconWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaItemDetailWindow (DX)|PersonaItemDetailWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaLevelIconWindow (DX)|PersonaLevelIconWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaNavBarBaseWindow (DX)|PersonaNavBarBaseWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDMedBotNavBarWindow (DX)|HUDMedBotNavBarWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaNavBarWindow (DX)|PersonaNavBarWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaOverlaysWindow (DX)|PersonaOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:HUDMedBotHealthOverlaysWindow (DX)|HUDMedBotHealthOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:PersonaAugmentationOverlaysWindow (DX)|PersonaAugmentationOverlaysWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:PersonaHealthOverlaysWindow (DX)|PersonaHealthOverlaysWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaHealthBodyWindow (DX)|PersonaHealthBodyWindow (DX)]]
 |       +&amp;ndash; [[Legacy:PersonaInventoryObjectBelt (DX)|PersonaInventoryObjectBelt (DX)]]
 |       +&amp;ndash; [[Legacy:PictureWindow (DX)|PictureWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ProgressBarWindow (DX)|ProgressBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScaleManagerWindow (DX)|ScaleManagerWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScaleWindow (DX)|ScaleWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ScrollAreaWindow (DX)|ScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:DeusExScrollAreaWindow (DX)|DeusExScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIScrollAreaWindow (DX)|MenuUIScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaScrollAreaWindow (DX)|PersonaScrollAreaWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ToolScrollAreaWindow (DX)|ToolScrollAreaWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ShadowWindow (DX)|ShadowWindow (DX)]]
 |       +&amp;ndash; [[Legacy:SpinningLogoWindow (DX)|SpinningLogoWindow (DX)]]
 |       +&amp;ndash; [[Legacy:StaticWindow (DX)|StaticWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TabGroupWindow (DX)|TabGroupWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ClipWindow (DX)|ClipWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ModalWindow (DX)|ModalWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:DeusExBaseWindow (DX)|DeusExBaseWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ConWindow (DX)|ConWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:ConWindowActive (DX)|ConWindowActive (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:CreditsScrollWindow (DX)|CreditsScrollWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:CreditsWindow (DX)|CreditsWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:QuotesWindow (DX)|QuotesWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:DemoSplashWindow (DX)|DemoSplashWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDKeypadWindow (DX)|HUDKeypadWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDMultiplayer (DX)|HUDMultiplayer (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDRechargeWindow (DX)|HUDRechargeWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIWindow (DX)|MenuUIWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIMenuWindow (DX)|MenuUIMenuWindow (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuMain (DX)|MenuMain (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuMPMain (DX)|MenuMPMain (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuSelectDifficulty (DX)|MenuSelectDifficulty (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:MenuSettings (DX)|MenuSettings (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIMessageBoxWindow (DX)|MenuUIMessageBoxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIScreenWindow (DX)|MenuUIScreenWindow (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenAdjustColors (DX)|MenuScreenAdjustColors (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenAugSetup (DX)|MenuScreenAugSetup (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenBrightness (DX)|MenuScreenBrightness (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenControls (DX)|MenuScreenControls (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenCustomizeKeys (DX)|MenuScreenCustomizeKeys (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenDisplay (DX)|MenuScreenDisplay (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenHostGame (DX)|MenuScreenHostGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenHostLan (DX)|MenuScreenHostLan (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenHostNet (DX)|MenuScreenHostNet (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenJoinGame (DX)|MenuScreenJoinGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenJoinInternet (DX)|MenuScreenJoinInternet (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenJoinLan (DX)|MenuScreenJoinLan (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenLoadGame (DX)|MenuScreenLoadGame (DX)]]
 |       |   |   |   |       |   +&amp;ndash; [[Legacy:MenuScreenSaveGame (DX)|MenuScreenSaveGame (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenNewGame (DX)|MenuScreenNewGame (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenOptions (DX)|MenuScreenOptions (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenPlayerSetup (DX)|MenuScreenPlayerSetup (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenRGB (DX)|MenuScreenRGB (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenSound (DX)|MenuScreenSound (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:MenuScreenThemesLoad (DX)|MenuScreenThemesLoad (DX)]]
 |       |   |   |   |           +&amp;ndash; [[Legacy:MenuScreenThemesSave (DX)|MenuScreenThemesSave (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MultiplayerMessageWin (DX)|MultiplayerMessageWin (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:NetworkTerminal (DX)|NetworkTerminal (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalATM (DX)|NetworkTerminalATM (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:ATMWindow (DX)|ATMWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalPersonal (DX)|NetworkTerminalPersonal (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalPublic (DX)|NetworkTerminalPublic (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:NetworkTerminalSecurity (DX)|NetworkTerminalSecurity (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaScreenBaseWindow (DX)|PersonaScreenBaseWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenAugmentations (DX)|PersonaScreenAugmentations (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:HUDMedBotAddAugsScreen (DX)|HUDMedBotAddAugsScreen (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenConversations (DX)|PersonaScreenConversations (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenGoals (DX)|PersonaScreenGoals (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenHealth (DX)|PersonaScreenHealth (DX)]]
 |       |   |   |   |   |   +&amp;ndash; [[Legacy:HUDMedBotHealthScreen (DX)|HUDMedBotHealthScreen (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenImages (DX)|PersonaScreenImages (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenInventory (DX)|PersonaScreenInventory (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenLogs (DX)|PersonaScreenLogs (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaScreenSkills (DX)|PersonaScreenSkills (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ToolWindow (DX)|ToolWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:BehindTheCurtain (DX)|BehindTheCurtain (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:BehindTheCurtain_NV (DX)|BehindTheCurtain_NV (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:DumpLocationBaseWindow (DX)|DumpLocationBaseWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationEditWindow (DX)|DumpLocationEditWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationListLocationsWindow (DX)|DumpLocationListLocationsWindow (DX)]]
 |       |   |   |       |   +&amp;ndash; [[Legacy:DumpLocationListWindow (DX)|DumpLocationListWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:FlagAddWindow (DX)|FlagAddWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:FlagEditWindow (DX)|FlagEditWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:InvokeConWindow (DX)|InvokeConWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:InvokeConWindowPlus (DX)|InvokeConWindowPlus (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:LoadMapWindow (DX)|LoadMapWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:PlayMusicWindow (DX)|PlayMusicWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:ShowClassWindow (DX)|ShowClassWindow (DX)]]
 |       |   |   |       +&amp;ndash; [[Legacy:ToolMessageBoxWindow (DX)|ToolMessageBoxWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:RootWindow (DX)|RootWindow (DX)]]
 |       |   |       +&amp;ndash; [[Legacy:DeusExRootWindow (DX)|DeusExRootWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:RadioBoxWindow (DX)|RadioBoxWindow (DX)]]
 |       |       +&amp;ndash; [[Legacy:SkillRadioBox (DX)|SkillRadioBox (DX)]]
 |       +&amp;ndash; [[Legacy:TextWindow (DX)|TextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ButtonWindow (DX)|ButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:CharacterModelButton (DX)|CharacterModelButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ComputerSecurityCameraViewButton (DX)|ComputerSecurityCameraViewButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ConChoiceWindow (DX)|ConChoiceWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:HUDKeypadButton (DX)|HUDKeypadButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUIBorderButtonWindow (DX)|MenuUIBorderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIActionButtonWindow (DX)|MenuUIActionButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIChoiceButton (DX)|MenuUIChoiceButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIInfoButtonWindow (DX)|MenuUIInfoButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUIStaticInfoWindow (DX)|MenuUIStaticInfoWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIListHeaderButtonWindow (DX)|MenuUIListHeaderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIMenuButtonWindow (DX)|MenuUIMenuButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUISpecialButtonWindow (DX)|MenuUISpecialButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUITabButtonWindow (DX)|MenuUITabButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaBorderButtonWindow (DX)|PersonaBorderButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaActionButtonWindow (DX)|PersonaActionButtonWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaNavButtonWindow (DX)|PersonaNavButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaHealthActionButtonWindow (DX)|PersonaHealthActionButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaSkillButtonWindow (DX)|PersonaSkillButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaItemButton (DX)|PersonaItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDMedBotAugItemButton (DX)|HUDMedBotAugItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaAmmoDetailButton (DX)|PersonaAmmoDetailButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaAugmentationItemButton (DX)|PersonaAugmentationItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaHealthItemButton (DX)|PersonaHealthItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaInventoryItemButton (DX)|PersonaInventoryItemButton (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaItemDetailButton (DX)|PersonaItemDetailButton (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ToggleWindow (DX)|ToggleWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:CheckboxWindow (DX)|CheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUICheckboxWindow (DX)|MenuUICheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaCheckboxWindow (DX)|PersonaCheckboxWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:ToolCheckboxWindow (DX)|ToolCheckboxWindow (DX)]]
 |       |   |   |   |       +&amp;ndash; [[Legacy:ToolRadioButtonWindow (DX)|ToolRadioButtonWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:HUDObjectSlot (DX)|HUDObjectSlot (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:ToolButtonWindow (DX)|ToolButtonWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:TutorialButtonWindow (DX)|TutorialButtonWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:ConCameraWindow (DX)|ConCameraWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:FadeTextWindow (DX)|FadeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:LargeTextWindow (DX)|LargeTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:EditWindow (DX)|EditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:DeusExEditWindow (DX)|DeusExEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:MenuUIEditWindow (DX)|MenuUIEditWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:MenuUILoadSaveEditWindow (DX)|MenuUILoadSaveEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:PersonaEditWindow (DX)|PersonaEditWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaImageNoteWindow (DX)|PersonaImageNoteWindow (DX)]]
 |       |   |   |   |   +&amp;ndash; [[Legacy:PersonaNotesEditWindow (DX)|PersonaNotesEditWindow (DX)]]
 |       |   |   |   +&amp;ndash; [[Legacy:ToolEditWindow (DX)|ToolEditWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUINormalLargeTextWindow (DX)|MenuUINormalLargeTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaNormalLargeTextWindow (DX)|PersonaNormalLargeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUIHelpWindow (DX)|MenuUIHelpWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:MenuUILabelWindow (DX)|MenuUILabelWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUIHeaderWindow (DX)|MenuUIHeaderWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:MenuUISmallLabelWindow (DX)|MenuUISmallLabelWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaGoalTextWindow (DX)|PersonaGoalTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHeaderLargeTextWindow (DX)|PersonaHeaderLargeTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaHeaderTextWindow (DX)|PersonaHeaderTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaNormalTextWindow (DX)|PersonaNormalTextWindow (DX)]]
 |       |   |   +&amp;ndash; [[Legacy:PersonaSkillTextWindow (DX)|PersonaSkillTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaStatusLineWindow (DX)|PersonaStatusLineWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaTitleTextWindow (DX)|PersonaTitleTextWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:TextLogWindow (DX)|TextLogWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TileWindow (DX)|TileWindow (DX)]]
 |       |   +&amp;ndash; [[Legacy:HUDReceivedDisplayItem (DX)|HUDReceivedDisplayItem (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaImageNewLegendLabel (DX)|PersonaImageNewLegendLabel (DX)]]
 |       |   +&amp;ndash; [[Legacy:PersonaInventoryCreditsWindow (DX)|PersonaInventoryCreditsWindow (DX)]]
 |       +&amp;ndash; [[Legacy:TimerDisplay (DX)|TimerDisplay (DX)]]
 |       +&amp;ndash; [[Legacy:ToolTitleBarWindow (DX)|ToolTitleBarWindow (DX)]]
 |       +&amp;ndash; [[Legacy:ViewportWindow (DX)|ViewportWindow (DX)]]
 +&amp;ndash; [[Legacy:ExtraMP (DX)|ExtraMP (DX)]]
 +&amp;ndash; [[Legacy:ExtString (DX)|ExtString (DX)]]
 +&amp;ndash; [[Legacy:GameDirectory (DX)|GameDirectory (DX)]]
 +&amp;ndash; [[Legacy:LevelSummary (DX)|LevelSummary (DX)]]
 +&amp;ndash; [[Legacy:Locale (DX)|Locale (DX)]]
 +&amp;ndash; [[Legacy:MenuUIDefaults (DX)|MenuUIDefaults (DX)]]
 +&amp;ndash; [[Legacy:MPItems (DX)|MPItems (DX)]]
 +&amp;ndash; [[Legacy:NanoKeyInfo (DX)|NanoKeyInfo (DX)]]
 +&amp;ndash; [[Legacy:Palette (DX)|Palette (DX)]]
 +&amp;ndash; [[Legacy:Player (DX)|Player (DX)]]
 +&amp;ndash; [[Legacy:RenderIterator (DX)|RenderIterator (DX)]]
 |   +&amp;ndash; [[Legacy:LaserIterator (DX)|LaserIterator (DX)]]
 |   +&amp;ndash; [[Legacy:ParticleIterator (DX)|ParticleIterator (DX)]]
 +&amp;ndash; [[Legacy:Subsystem (DX)|Subsystem (DX)]]
 |   +&amp;ndash; [[Legacy:Engine (DX)|Engine (DX)]]
 |       +&amp;ndash; [[Legacy:EditorEngine (DX)|EditorEngine (DX)]]
 +&amp;ndash; [[Legacy:TestObj (DX)|TestObj (DX)]]
 +&amp;ndash; [[Legacy:Time (DX)|Time (DX)]]
 +&amp;ndash; [[Legacy:UWindowBase (DX)|UWindowBase (DX)]]
     +&amp;ndash; [[Legacy:UWindowList (DX)|UWindowList (DX)]]
     |   +&amp;ndash; [[Legacy:DeusExServerList (DX)|DeusExServerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserPlayerList (DX)|UBrowserPlayerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserRulesList (DX)|UBrowserRulesList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserServerList (DX)|UBrowserServerList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserServerListFactory (DX)|UBrowserServerListFactory (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserFavoritesFact (DX)|UBrowserFavoritesFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserGSpyFact (DX)|UBrowserGSpyFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserHTTPFact (DX)|UBrowserHTTPFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserLocalFact (DX)|UBrowserLocalFact (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserSubsetFact (DX)|UBrowserSubsetFact (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserSubsetList (DX)|UBrowserSubsetList (DX)]]
     |   +&amp;ndash; [[Legacy:UBrowserSupersetList (DX)|UBrowserSupersetList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowComboListItem (DX)|UWindowComboListItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowDynamicTextRow (DX)|UWindowDynamicTextRow (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowHTMLTextRow (DX)|UWindowHTMLTextRow (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowEditBoxHistory (DX)|UWindowEditBoxHistory (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowHotkeyWindowList (DX)|UWindowHotkeyWindowList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowLayoutBase (DX)|UWindowLayoutBase (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutCell (DX)|UWindowLayoutCell (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutControl (DX)|UWindowLayoutControl (DX)]]
     |   |   +&amp;ndash; [[Legacy:UWindowLayoutRow (DX)|UWindowLayoutRow (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowListBoxItem (DX)|UWindowListBoxItem (DX)]]
     |   |   +&amp;ndash; [[Legacy:UBrowserIRCUserList (DX)|UBrowserIRCUserList (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowMenuBarItem (DX)|UWindowMenuBarItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowPulldownMenuItem (DX)|UWindowPulldownMenuItem (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowTabControlItem (DX)|UWindowTabControlItem (DX)]]
     |       +&amp;ndash; [[Legacy:UWindowPageControlPage (DX)|UWindowPageControlPage (DX)]]
     +&amp;ndash; [[Legacy:UWindowLookAndFeel (DX)|UWindowLookAndFeel (DX)]]
     |   +&amp;ndash; [[Legacy:UWindowWin95LookAndFeel (DX)|UWindowWin95LookAndFeel (DX)]]
     +&amp;ndash; [[Legacy:UWindowWindow (DX)|UWindowWindow (DX)]]
         +&amp;ndash; [[Legacy:UBrowserBannerAd (DX)|UBrowserBannerAd (DX)]]
         +&amp;ndash; [[Legacy:UBrowserBannerBar (DX)|UBrowserBannerBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowBitmap (DX)|UWindowBitmap (DX)]]
         +&amp;ndash; [[Legacy:UWindowClientWindow (DX)|UWindowClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserInfoClientWindow (DX)|UBrowserInfoClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserMainClientWindow (DX)|UBrowserMainClientWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserScreenshotCW (DX)|UBrowserScreenshotCW (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowDialogClientWindow (DX)|UWindowDialogClientWindow (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserEditFavoriteCW (DX)|UBrowserEditFavoriteCW (DX)]]
         |       |   +&amp;ndash; [[Legacy:UBrowserNewFavoriteCW (DX)|UBrowserNewFavoriteCW (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserIRCSetupClient (DX)|UBrowserIRCSetupClient (DX)]]
         |       +&amp;ndash; [[Legacy:UBrowserOpenCW (DX)|UBrowserOpenCW (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowConsoleClientWindow (DX)|UWindowConsoleClientWindow (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowMessageBoxCW (DX)|UWindowMessageBoxCW (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowPageWindow (DX)|UWindowPageWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserIRCPageBase (DX)|UBrowserIRCPageBase (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCChannelPage (DX)|UBrowserIRCChannelPage (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCPrivPage (DX)|UBrowserIRCPrivPage (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserIRCSystemPage (DX)|UBrowserIRCSystemPage (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserIRCWindow (DX)|UBrowserIRCWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserServerListWindow (DX)|UBrowserServerListWindow (DX)]]
         |           |   +&amp;ndash; [[Legacy:UBrowserFavoriteServers (DX)|UBrowserFavoriteServers (DX)]]
         |           +&amp;ndash; [[Legacy:UBrowserUpdateServerWindow (DX)|UBrowserUpdateServerWindow (DX)]]
         |           +&amp;ndash; [[Legacy:UWindowScrollingDialogClient (DX)|UWindowScrollingDialogClient (DX)]]
         +&amp;ndash; [[Legacy:UWindowControlFrame (DX)|UWindowControlFrame (DX)]]
         +&amp;ndash; [[Legacy:UWindowDialogControl (DX)|UWindowDialogControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowButton (DX)|UWindowButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UBrowserBrowserButton (DX)|UBrowserBrowserButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowCheckbox (DX)|UWindowCheckbox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboButton (DX)|UWindowComboButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboLeftButton (DX)|UWindowComboLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboRightButton (DX)|UWindowComboRightButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowFrameCloseBox (DX)|UWindowFrameCloseBox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBDownButton (DX)|UWindowSBDownButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBLeftButton (DX)|UWindowSBLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBRightButton (DX)|UWindowSBRightButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSBUpButton (DX)|UWindowSBUpButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSmallButton (DX)|UWindowSmallButton (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UWindowSmallCloseButton (DX)|UWindowSmallCloseButton (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UWindowSmallOKButton (DX)|UWindowSmallOKButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowSmallCancelButton (DX)|UWindowSmallCancelButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControlLeftButton (DX)|UWindowTabControlLeftButton (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControlRightButton (DX)|UWindowTabControlRightButton (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowComboControl (DX)|UWindowComboControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowDynamicTextArea (DX)|UWindowDynamicTextArea (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowConsoleTextAreaControl (DX)|UWindowConsoleTextAreaControl (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowHTMLTextArea (DX)|UWindowHTMLTextArea (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserColorIRCTextArea (DX)|UBrowserColorIRCTextArea (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserUpdateServerTextArea (DX)|UBrowserUpdateServerTextArea (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowURLTextArea (DX)|UWindowURLTextArea (DX)]]
         |   |       +&amp;ndash; [[Legacy:UBrowserIRCTextArea (DX)|UBrowserIRCTextArea (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowEditBox (DX)|UWindowEditBox (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowEditControl (DX)|UWindowEditControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowHSliderControl (DX)|UWindowHSliderControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowLabelControl (DX)|UWindowLabelControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowListControl (DX)|UWindowListControl (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowComboList (DX)|UWindowComboList (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowListBox (DX)|UWindowListBox (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UBrowserIRCUserListBox (DX)|UBrowserIRCUserListBox (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowMenuBar (DX)|UWindowMenuBar (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowPulldownMenu (DX)|UWindowPulldownMenu (DX)]]
         |   |   |   +&amp;ndash; [[Legacy:UWindowRightClickMenu (DX)|UWindowRightClickMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserInfoMenu (DX)|UBrowserInfoMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCChannelMenu (DX)|UBrowserIRCChannelMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCJoinMenu (DX)|UBrowserIRCJoinMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCPrivateMenu (DX)|UBrowserIRCPrivateMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserIRCSystemMenu (DX)|UBrowserIRCSystemMenu (DX)]]
         |   |   |       +&amp;ndash; [[Legacy:UBrowserRightClickMenu (DX)|UBrowserRightClickMenu (DX)]]
         |   |   |           +&amp;ndash; [[Legacy:UBrowserFavoritesMenu (DX)|UBrowserFavoritesMenu (DX)]]
         |   |   +&amp;ndash; [[Legacy:UWindowTabControl (DX)|UWindowTabControl (DX)]]
         |   |       +&amp;ndash; [[Legacy:UWindowPageControl (DX)|UWindowPageControl (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowTextAreaControl (DX)|UWindowTextAreaControl (DX)]]
         |       +&amp;ndash; [[Legacy:UWindowWrappedTextArea (DX)|UWindowWrappedTextArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowFramedWindow (DX)|UWindowFramedWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserEditFavoriteWindow (DX)|UBrowserEditFavoriteWindow (DX)]]
         |   |   +&amp;ndash; [[Legacy:UBrowserNewFavoriteWindow (DX)|UBrowserNewFavoriteWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserInfoWindow (DX)|UBrowserInfoWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserMainWindow (DX)|UBrowserMainWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserOpenWindow (DX)|UBrowserOpenWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowConsoleWindow (DX)|UWindowConsoleWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UWindowMessageBox (DX)|UWindowMessageBox (DX)]]
         +&amp;ndash; [[Legacy:UWindowGrid (DX)|UWindowGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserPlayerGrid (DX)|UBrowserPlayerGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserRulesGrid (DX)|UBrowserRulesGrid (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserServerGrid (DX)|UBrowserServerGrid (DX)]]
         +&amp;ndash; [[Legacy:UWindowGridClient (DX)|UWindowGridClient (DX)]]
         +&amp;ndash; [[Legacy:UWindowGridColumn (DX)|UWindowGridColumn (DX)]]
         +&amp;ndash; [[Legacy:UWindowHScrollBar (DX)|UWindowHScrollBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowHSplitter (DX)|UWindowHSplitter (DX)]]
         +&amp;ndash; [[Legacy:UWindowMessageBoxArea (DX)|UWindowMessageBoxArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowProgressBar (DX)|UWindowProgressBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowRootWindow (DX)|UWindowRootWindow (DX)]]
         |   +&amp;ndash; [[Legacy:UBrowserRootWindow (DX)|UBrowserRootWindow (DX)]]
         +&amp;ndash; [[Legacy:UWindowTabControlTabArea (DX)|UWindowTabControlTabArea (DX)]]
         +&amp;ndash; [[Legacy:UWindowVScrollBar (DX)|UWindowVScrollBar (DX)]]
         +&amp;ndash; [[Legacy:UWindowVSplitter (DX)|UWindowVSplitter (DX)]]

===&quot;All&quot; Classes===

Thse classes define stuff to be imported with #EXEC commands.  They have no properties or behavior on their own, and contain meshes and textures unless otherwise specified.
; AllAmmo : Ammunition
; AllAnimals : Animals
; AllDeco : Generic Decorations
; Effects : Effects
; Fragments : Fragments
; AllHongKongDeco : Hong Kong Decorations
; AllMajor : Meshes and textures for major (lead) Actors
; AllMinor : ... for the minor (supporting) Actors
; AllNewYorkDeco : NYC Decorations
; AllParisDeco : Paris Decorations
; AllPickups : Pickups
; AllProjectiles : Projectiles
; AllRobots : Robots
; AllSounds : Imported .WAV audio
; AllUI : Textures used in the UI
; AllWashingtonDeco : Washington DC Decorations
; AllWeapons : Weapons

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>39972</id>
      <timestamp>2009-11-14T18:57:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>delinked non-existing pages to cut down the number of wanted pages</comment>
      <text xml:space="preserve"> [[Legacy:Object (DX)|Object]]
 +- [[Legacy:Actor (DX)|Actor]] (expanded in [[Legacy:Actor Class Hierarchy (DX)|Actor Class Hierarchy]]
 +- All*... (see below)
 +- [[Legacy:Bitmap (DX)|Bitmap]]
 |   +- Texture
 |       +- FractalTexture
 |       |   +- FireTexture
 |       |   +- IceTexture
 |       |   +- WaterTexture
 |       |       +- WaveTexture
 |       |       +- WetTexture
 |       +- ScriptedTexture
 +- [[Legacy:BrushBuilder (DX)|BrushBuilder]]
 |   +- ConeBuilder
 |   +- [[Legacy:CubeBuilder (DX)|CubeBuilder]]
 |   +- CylinderBuilder
 |   +- SheetBuilder
 |   +- TetrahedronBuilder
 +- Canvas
 +- Commandlet
 |   +- HelloWorldCommandlet
 +- ConObject
 |   +- ConAudioList
 |   +- ConCamera
 |   +- ConChoice
 |   +- ConEvent
 |   |   +- ConEventAddCredits
 |   |   +- ConEventAddGoal
 |   |   +- ConEventAddNote
 |   |   +- ConEventAddSkillPoints
 |   |   +- ConEventAnimation
 |   |   +- ConEventCheckFlag
 |   |   +- ConEventCheckObject
 |   |   +- ConEventCheckPersona
 |   |   +- ConEventChoice
 |   |   +- ConEventComment
 |   |   +- ConEventEnd
 |   |   +- ConEventJump
 |   |   +- ConEventMoveCamera
 |   |   +- ConEventRandomLabel
 |   |   +- ConEventSetFlag
 |   |   +- ConEventSpeech
 |   |   +- ConEventTrade
 |   |   +- ConEventTransferObject
 |   |   +- ConEventTrigger
 |   +- ConFlagRef
 |   +- ConHistory
 |   +- ConHistoryEvent
 |   +- ConItem
 |   +- ConListItem
 |   +- ConSpeech
 |   +- [[Legacy:Conversation (DX)|Conversation]]
 |   +- ConversationList
 |   +- ConversationMissionList
 +- [[Legacy:Console (DX)|Console]]
 |   +- WindowConsole
 |       +- UBrowserConsole
 +- DataVaultImageNote
 +- DebugInfo
 +- DeusExConversations
 +- DeusExGoal
 +- DeusExLog
 +- DeusExNote
 +- DeusExSaveInfo
 +- DeusExText
 +- DeusExTextParser
 +- DumpLocation
 +- ExtensionObject
 |   +- Flag
 |   |   +- FlagBool
 |   |   +- FlagByte
 |   |   +- FlagFloat
 |   |   +- FlagInt
 |   |   +- FlagName
 |   |   +- FlagRotator
 |   |   +- FlagVector
 |   +- FlagBase
 |   +- GC
 |   +- Window
 |       +- ActorDisplayWindow
 |       +- AlignWindow
 |       |   +- ConWindowSpeech
 |       |   +- HUDBarkDisplayItem
 |       |   +- PersonaGoalItemWindow
 |       |   +- PersonaInfoItemWindow
 |       +- BorderWindow
 |       |   +- ToolBorderWindow
 |       +- CinematicWindow
 |       +- ComputerSecurityCameraWindow
 |       +- ComputerUIWindow
 |       |   +- ComputerScreenATM
 |       |   +- ComputerScreenATMDisabled
 |       |   +- ComputerScreenATMWithdraw
 |       |   +- ComputerScreenBulletins
 |       |   +- ComputerScreenEmail
 |       |   +- ComputerScreenLogin
 |       |   +- ComputerScreenSecurity
 |       |   +- ComputerScreenSpecialOptions
 |       +- ComputerWindow
 |       +- Crosshair
 |       +- DamageHUDDisplay
 |       +- DeusExHUD
 |       +- DeusExScopeView
 |       +- FrobDisplayWindow
 |       +- HUDBaseWindow
 |       |   +- AugmentationDisplayWindow
 |       |   +- ComputerScreenHack
 |       |   +- ComputerScreenHackAccounts
 |       |   +- HUDActiveItemBase
 |       |   |   +- HUDActiveAug
 |       |   |   +- HUDActiveItem
 |       |   +- HUDActiveItemsBorderBase
 |       |   |   +- HUDActiveAugsBorder
 |       |   |   +- HUDActiveItemsBorder
 |       |   +- HUDActiveItemsDisplay
 |       |   +- HUDAmmoDisplay
 |       |   +- HUDCompassDisplay
 |       |   +- HUDHitDisplay
 |       |   +- HUDInfoLinKDisplay
 |       |   +- HUDMultiSkills
 |       |   +- HUDObjectBelt
 |       |   +- HUDSharedBorderWindow
 |       |       +- HUDBarkDisplay
 |       |       +- HUDConWindowFirst
 |       |       +- HUDInformationDisplay
 |       |       +- HUDLogDisplay
 |       |       +- HUDReceivedDisplay
 |       +- HUDMissionStartTextDisplay
 |       +- ListWindow
 |       |   +- MenuUIListWindow
 |       |   +- PersonaListWindow
 |       |   +- ToolListWindow
 |       +- MenuScreenAdjustColorsExample
 |       +- MenuScreenRGB_HUDExample
 |       +- MenuScreenRGB_MenuExample
 |       +- MenuUIActionButtonBarWindow
 |       +- MenuUIChoice
 |       |   +- MenuUIChoiceAction
 |       |   |   +- MenuChoice_AdjustColors
 |       |   |   +- MenuChoice_Brightness
 |       |   |   +- MenuChoice_FullScreen
 |       |   |   +- MenuChoice_RenderDevice
 |       |   +- MenuUIChoiceEnum
 |       |   |   +- ComputerCameraUIChoice
 |       |   |   |   +- ComputerSecurityChoice_Camera
 |       |   |   |   +- ComputerSecurityChoice_DoorAccess
 |       |   |   |   +- ComputerSecurityChoice_DoorOpen
 |       |   |   |   +- ComputerSecurityChoice_MPCamera
 |       |   |   |   +- ComputerSecurityChoice_Turret
 |       |   |   +- MenuChoice_Class
 |       |   |   +- MenuChoice_Connection
 |       |   |   +- MenuChoice_Cycle
 |       |   |   +- MenuChoice_EnabledDisabled
 |       |   |   |   +- MenuChoice_AlwaysRun
 |       |   |   |   +- MenuChoice_HeadBob
 |       |   |   |   +- MenuChoice_InvertMouse
 |       |   |   |   +- MenuChoice_ObjectNames
 |       |   |   |   +- MenuChoice_ToggleCrouch
 |       |   |   |   +- MenuChoice_WeaponAutoReload
 |       |   |   +- MenuChoice_GameType
 |       |   |   +- MenuChoice_GoreLevel
 |       |   |   +- MenuChoice_HUDAugDisplay
 |       |   |   +- MenuChoice_LowMedHigh
 |       |   |   |   +- MenuChoice_WorldTextureDetail
 |       |   |   +- MenuChoice_Map
 |       |   |   +- MenuChoice_ObjectTextureDetail
 |       |   |   +- MenuChoice_OnOff
 |       |   |   |   +- MenuChoice_AugsAllowed
 |       |   |   |   +- MenuChoice_Decals
 |       |   |   |   +- MenuChoice_DetailTextures
 |       |   |   |   +- MenuChoice_HUDBordersVisible
 |       |   |   |   +- MenuChoice_HUDBorderTranslucency
 |       |   |   |   +- MenuChoice_HUDTranslucency
 |       |   |   |   +- MenuChoice_MenuTranslucency
 |       |   |   |   +- MenuChoice_MultiHelp
 |       |   |   |   +- MenuChoice_ReverseStereo
 |       |   |   |   +- MenuChoice_Subtitles
 |       |   |   |   +- MenuChoice_SurroundSound
 |       |   |   |   +- MenuChoice_Use3dHardware
 |       |   |   +- MenuChoice_Resolution
 |       |   |   +- MenuChoice_SampleRate
 |       |   |   +- MenuChoice_ServerMode
 |       |   |   +- MenuChoice_SkillLevel
 |       |   |   +- MenuChoice_SoundQuality
 |       |   |   +- MenuChoice_Team
 |       |   |   +- MenuChoice_TextureColorBits
 |       |   |   +- MenuChoice_ThemeColor
 |       |   |   |   +- MenuChoice_HUDColor
 |       |   |   |   +- MenuChoice_MenuColor
 |       |   |   +- MenuChoice_UIBackground
 |       |   |   +- MenuChoice_VictoryType
 |       |   |   +- MenuChoice_VisibleHidden
 |       |   |       +- MenuChoice_Crosshairs
 |       |   +- MenuUIChoiceSlider
 |       |       +- MenuChoice_AdjustBrightness
 |       |       +- MenuChoice_AugBonus
 |       |       +- MenuChoice_EffectsChannels
 |       |       +- MenuChoice_FriendlyFire
 |       |       +- MenuChoice_LogTimeoutValue
 |       |       +- MenuChoice_MaxLogLines
 |       |       +- MenuChoice_MaxPlayers
 |       |       +- MenuChoice_MouseSensitivity
 |       |       +- MenuChoice_SkillBonus
 |       |       +- MenuChoice_StartingAugs
 |       |       +- MenuChoice_StartingSkills
 |       |       +- MenuChoice_VictoryValue
 |       |       +- MenuChoice_Volume
 |       |           +- MenuChoice_MusicVolume
 |       |           +- MenuChoice_SoundVolume
 |       |           +- MenuChoice_SpeechVolume
 |       +- MenuUIChoiceWindow
 |       +- MenuUIClientWindow
 |       |   +- ComputerUIScaleClientWindow
 |       +- MenuUILeftEdgeWindow
 |       +- MenuUINavBarWindow
 |       +- MenuUINavButtonWindow
 |       +- MenuUIRGBSliderButtonWindow
 |       +- MenuUIRightEdgeWindow
 |       +- MenuUIShadowWindow
 |       |   +- MenuUIMessageBoxShadowWindow
 |       +- MenuUISkillInfoWindow
 |       +- MenuUISliderButtonWindow
 |       |   +- ComputerSecuritySliderWindow
 |       +- MenuUITitleWindow
 |       +- MovingWindow
 |       +- PersonaAugmentationBodyWindow
 |       +- PersonaBaseWindow
 |       |   +- HUDMedBotAugCanWindow
 |       |   +- PersonaButtonBarWindow
 |       |   +- PersonaClientBaseWindow
 |       |   |   +- PersonaClientBorderWindow
 |       |   |   +- PersonaClientWindow
 |       |   +- PersonaHealthRegionWindow
 |       |   +- PersonaImageWindow
 |       |   +- PersonaInfoLineWindow
 |       |   +- PersonaInfoWindow
 |       |   |   +- PersonaInventoryInfoWindow
 |       |   +- PersonaItemDetailIconWindow
 |       |   +- PersonaItemDetailWindow
 |       |   +- PersonaLevelIconWindow
 |       |   +- PersonaNavBarBaseWindow
 |       |   |   +- HUDMedBotNavBarWindow
 |       |   |   +- PersonaNavBarWindow
 |       |   +- PersonaOverlaysWindow
 |       |       +- HUDMedBotHealthOverlaysWindow
 |       |       +- PersonaAugmentationOverlaysWindow
 |       |       +- PersonaHealthOverlaysWindow
 |       +- PersonaHealthBodyWindow
 |       +- PersonaInventoryObjectBelt
 |       +- PictureWindow
 |       +- ProgressBarWindow
 |       +- ScaleManagerWindow
 |       +- ScaleWindow
 |       +- ScrollAreaWindow
 |       |   +- DeusExScrollAreaWindow
 |       |   +- MenuUIScrollAreaWindow
 |       |   +- PersonaScrollAreaWindow
 |       |   +- ToolScrollAreaWindow
 |       +- ShadowWindow
 |       +- SpinningLogoWindow
 |       +- StaticWindow
 |       +- TabGroupWindow
 |       |   +- ClipWindow
 |       |   +- ModalWindow
 |       |   |   +- DeusExBaseWindow
 |       |   |   |   +- ConWindow
 |       |   |   |   |   +- ConWindowActive
 |       |   |   |   +- CreditsScrollWindow
 |       |   |   |   |   +- CreditsWindow
 |       |   |   |   |   +- QuotesWindow
 |       |   |   |   +- DemoSplashWindow
 |       |   |   |   +- HUDKeypadWindow
 |       |   |   |   +- HUDMultiplayer
 |       |   |   |   +- HUDRechargeWindow
 |       |   |   |   +- MenuUIWindow
 |       |   |   |   |   +- MenuUIMenuWindow
 |       |   |   |   |   |   +- MenuMain
 |       |   |   |   |   |   +- MenuMPMain
 |       |   |   |   |   |   +- MenuSelectDifficulty
 |       |   |   |   |   |   +- MenuSettings
 |       |   |   |   |   +- MenuUIMessageBoxWindow
 |       |   |   |   |   +- MenuUIScreenWindow
 |       |   |   |   |       +- MenuScreenAdjustColors
 |       |   |   |   |       +- MenuScreenAugSetup
 |       |   |   |   |       +- MenuScreenBrightness
 |       |   |   |   |       +- MenuScreenControls
 |       |   |   |   |       +- MenuScreenCustomizeKeys
 |       |   |   |   |       +- MenuScreenDisplay
 |       |   |   |   |       +- MenuScreenHostGame
 |       |   |   |   |       |   +- MenuScreenHostLan
 |       |   |   |   |       |   +- MenuScreenHostNet
 |       |   |   |   |       +- MenuScreenJoinGame
 |       |   |   |   |       |   +- MenuScreenJoinInternet
 |       |   |   |   |       |   +- MenuScreenJoinLan
 |       |   |   |   |       +- MenuScreenLoadGame
 |       |   |   |   |       |   +- MenuScreenSaveGame
 |       |   |   |   |       +- MenuScreenNewGame
 |       |   |   |   |       +- MenuScreenOptions
 |       |   |   |   |       +- MenuScreenPlayerSetup
 |       |   |   |   |       +- MenuScreenRGB
 |       |   |   |   |       +- MenuScreenSound
 |       |   |   |   |       +- MenuScreenThemesLoad
 |       |   |   |   |           +- MenuScreenThemesSave
 |       |   |   |   +- MultiplayerMessageWin
 |       |   |   |   +- NetworkTerminal
 |       |   |   |   |   +- NetworkTerminalATM
 |       |   |   |   |   |   +- ATMWindow
 |       |   |   |   |   +- NetworkTerminalPersonal
 |       |   |   |   |   +- NetworkTerminalPublic
 |       |   |   |   |   +- NetworkTerminalSecurity
 |       |   |   |   +- PersonaScreenBaseWindow
 |       |   |   |   |   +- PersonaScreenAugmentations
 |       |   |   |   |   |   +- HUDMedBotAddAugsScreen
 |       |   |   |   |   +- PersonaScreenConversations
 |       |   |   |   |   +- PersonaScreenGoals
 |       |   |   |   |   +- PersonaScreenHealth
 |       |   |   |   |   |   +- HUDMedBotHealthScreen
 |       |   |   |   |   +- PersonaScreenImages
 |       |   |   |   |   +- PersonaScreenInventory
 |       |   |   |   |   +- PersonaScreenLogs
 |       |   |   |   |   +- PersonaScreenSkills
 |       |   |   |   +- ToolWindow
 |       |   |   |       +- BehindTheCurtain
 |       |   |   |       |   +- BehindTheCurtain_NV
 |       |   |   |       +- DumpLocationBaseWindow
 |       |   |   |       |   +- DumpLocationEditWindow
 |       |   |   |       |   +- DumpLocationListLocationsWindow
 |       |   |   |       |   +- DumpLocationListWindow
 |       |   |   |       +- FlagAddWindow
 |       |   |   |       +- FlagEditWindow
 |       |   |   |       +- InvokeConWindow
 |       |   |   |       +- InvokeConWindowPlus
 |       |   |   |       +- LoadMapWindow
 |       |   |   |       +- PlayMusicWindow
 |       |   |   |       +- ShowClassWindow
 |       |   |   |       +- ToolMessageBoxWindow
 |       |   |   +- RootWindow
 |       |   |       +- DeusExRootWindow
 |       |   +- RadioBoxWindow
 |       |       +- SkillRadioBox
 |       +- TextWindow
 |       |   +- ButtonWindow
 |       |   |   +- CharacterModelButton
 |       |   |   +- ComputerSecurityCameraViewButton
 |       |   |   +- ConChoiceWindow
 |       |   |   +- HUDKeypadButton
 |       |   |   +- MenuUIBorderButtonWindow
 |       |   |   |   +- MenuUIActionButtonWindow
 |       |   |   |   |   +- MenuUIChoiceButton
 |       |   |   |   +- MenuUIInfoButtonWindow
 |       |   |   |   |   +- MenuUIStaticInfoWindow
 |       |   |   |   +- MenuUIListHeaderButtonWindow
 |       |   |   |   +- MenuUIMenuButtonWindow
 |       |   |   +- MenuUISpecialButtonWindow
 |       |   |   +- MenuUITabButtonWindow
 |       |   |   +- PersonaBorderButtonWindow
 |       |   |   |   +- PersonaActionButtonWindow
 |       |   |   |   |   +- PersonaNavButtonWindow
 |       |   |   |   +- PersonaHealthActionButtonWindow
 |       |   |   |   +- PersonaSkillButtonWindow
 |       |   |   +- PersonaItemButton
 |       |   |   |   +- HUDMedBotAugItemButton
 |       |   |   |   +- PersonaAmmoDetailButton
 |       |   |   |   +- PersonaAugmentationItemButton
 |       |   |   |   +- PersonaHealthItemButton
 |       |   |   |   +- PersonaInventoryItemButton
 |       |   |   |   +- PersonaItemDetailButton
 |       |   |   +- ToggleWindow
 |       |   |   |   +- CheckboxWindow
 |       |   |   |   |   +- MenuUICheckboxWindow
 |       |   |   |   |   +- PersonaCheckboxWindow
 |       |   |   |   |   +- ToolCheckboxWindow
 |       |   |   |   |       +- ToolRadioButtonWindow
 |       |   |   |   +- HUDObjectSlot
 |       |   |   +- ToolButtonWindow
 |       |   |   +- TutorialButtonWindow
 |       |   +- ConCameraWindow
 |       |   +- FadeTextWindow
 |       |   +- LargeTextWindow
 |       |   |   +- EditWindow
 |       |   |   |   +- DeusExEditWindow
 |       |   |   |   +- MenuUIEditWindow
 |       |   |   |   |   +- MenuUILoadSaveEditWindow
 |       |   |   |   +- PersonaEditWindow
 |       |   |   |   |   +- PersonaImageNoteWindow
 |       |   |   |   |   +- PersonaNotesEditWindow
 |       |   |   |   +- ToolEditWindow
 |       |   |   +- MenuUINormalLargeTextWindow
 |       |   |   +- PersonaNormalLargeTextWindow
 |       |   +- MenuUIHelpWindow
 |       |   +- MenuUILabelWindow
 |       |   |   +- MenuUIHeaderWindow
 |       |   |   +- MenuUISmallLabelWindow
 |       |   +- PersonaGoalTextWindow
 |       |   +- PersonaHeaderLargeTextWindow
 |       |   +- PersonaHeaderTextWindow
 |       |   +- PersonaNormalTextWindow
 |       |   |   +- PersonaSkillTextWindow
 |       |   +- PersonaStatusLineWindow
 |       |   +- PersonaTitleTextWindow
 |       |   +- TextLogWindow
 |       +- TileWindow
 |       |   +- HUDReceivedDisplayItem
 |       |   +- PersonaImageNewLegendLabel
 |       |   +- PersonaInventoryCreditsWindow
 |       +- TimerDisplay
 |       +- ToolTitleBarWindow
 |       +- ViewportWindow
 +- ExtraMP
 +- ExtString
 +- GameDirectory
 +- LevelSummary
 +- Locale
 +- MenuUIDefaults
 +- MPItems
 +- NanoKeyInfo
 +- Palette
 +- Player
 +- RenderIterator
 |   +- LaserIterator
 |   +- ParticleIterator
 +- Subsystem
 |   +- Engine
 |       +- [[Legacy:EditorEngine (DX)|EditorEngine]]
 +- TestObj
 +- Time
 +- UWindowBase
     +- UWindowList
     |   +- DeusExServerList
     |   +- UBrowserPlayerList
     |   +- UBrowserRulesList
     |   +- UBrowserServerList
     |   +- UBrowserServerListFactory
     |   |   +- UBrowserFavoritesFact
     |   |   +- UBrowserGSpyFact
     |   |   +- UBrowserHTTPFact
     |   |   +- UBrowserLocalFact
     |   |   +- UBrowserSubsetFact
     |   +- UBrowserSubsetList
     |   +- UBrowserSupersetList
     |   +- UWindowComboListItem
     |   +- UWindowDynamicTextRow
     |   |   +- UWindowHTMLTextRow
     |   +- UWindowEditBoxHistory
     |   +- UWindowHotkeyWindowList
     |   +- UWindowLayoutBase
     |   |   +- UWindowLayoutCell
     |   |   +- UWindowLayoutControl
     |   |   +- UWindowLayoutRow
     |   +- UWindowListBoxItem
     |   |   +- UBrowserIRCUserList
     |   +- UWindowMenuBarItem
     |   +- UWindowPulldownMenuItem
     |   +- UWindowTabControlItem
     |       +- UWindowPageControlPage
     +- UWindowLookAndFeel
     |   +- UWindowWin95LookAndFeel
     +- UWindowWindow
         +- UBrowserBannerAd
         +- UBrowserBannerBar
         +- UWindowBitmap
         +- UWindowClientWindow
         |   +- UBrowserInfoClientWindow
         |   +- UBrowserMainClientWindow
         |   +- UBrowserScreenshotCW
         |   +- UWindowDialogClientWindow
         |       +- UBrowserEditFavoriteCW
         |       |   +- UBrowserNewFavoriteCW
         |       +- UBrowserIRCSetupClient
         |       +- UBrowserOpenCW
         |       +- UWindowConsoleClientWindow
         |       +- UWindowMessageBoxCW
         |       +- UWindowPageWindow
         |           +- UBrowserIRCPageBase
         |           |   +- UBrowserIRCChannelPage
         |           |   +- UBrowserIRCPrivPage
         |           |   +- UBrowserIRCSystemPage
         |           +- UBrowserIRCWindow
         |           +- UBrowserServerListWindow
         |           |   +- UBrowserFavoriteServers
         |           +- UBrowserUpdateServerWindow
         |           +- UWindowScrollingDialogClient
         +- UWindowControlFrame
         +- UWindowDialogControl
         |   +- UWindowButton
         |   |   +- UBrowserBrowserButton
         |   |   +- UWindowCheckbox
         |   |   +- UWindowComboButton
         |   |   +- UWindowComboLeftButton
         |   |   +- UWindowComboRightButton
         |   |   +- UWindowFrameCloseBox
         |   |   +- UWindowSBDownButton
         |   |   +- UWindowSBLeftButton
         |   |   +- UWindowSBRightButton
         |   |   +- UWindowSBUpButton
         |   |   +- UWindowSmallButton
         |   |   |   +- UWindowSmallCloseButton
         |   |   |       +- UWindowSmallOKButton
         |   |   +- UWindowSmallCancelButton
         |   |   +- UWindowTabControlLeftButton
         |   |   +- UWindowTabControlRightButton
         |   +- UWindowComboControl
         |   +- UWindowDynamicTextArea
         |   |   +- UWindowConsoleTextAreaControl
         |   |   +- UWindowHTMLTextArea
         |   |   |   +- UBrowserColorIRCTextArea
         |   |   |   +- UBrowserUpdateServerTextArea
         |   |   +- UWindowURLTextArea
         |   |       +- UBrowserIRCTextArea
         |   +- UWindowEditBox
         |   +- UWindowEditControl
         |   +- UWindowHSliderControl
         |   +- UWindowLabelControl
         |   +- UWindowListControl
         |   |   +- UWindowComboList
         |   |   +- UWindowListBox
         |   |   |   +- UBrowserIRCUserListBox
         |   |   +- UWindowMenuBar
         |   |   +- UWindowPulldownMenu
         |   |   |   +- UWindowRightClickMenu
         |   |   |       +- UBrowserInfoMenu
         |   |   |       +- UBrowserIRCChannelMenu
         |   |   |       +- UBrowserIRCJoinMenu
         |   |   |       +- UBrowserIRCPrivateMenu
         |   |   |       +- UBrowserIRCSystemMenu
         |   |   |       +- UBrowserRightClickMenu
         |   |   |           +- UBrowserFavoritesMenu
         |   |   +- UWindowTabControl
         |   |       +- UWindowPageControl
         |   +- UWindowTextAreaControl
         |       +- UWindowWrappedTextArea
         +- UWindowFramedWindow
         |   +- UBrowserEditFavoriteWindow
         |   |   +- UBrowserNewFavoriteWindow
         |   +- UBrowserInfoWindow
         |   +- UBrowserMainWindow
         |   +- UBrowserOpenWindow
         |   +- UWindowConsoleWindow
         |   +- UWindowMessageBox
         +- UWindowGrid
         |   +- UBrowserPlayerGrid
         |   +- UBrowserRulesGrid
         |   +- UBrowserServerGrid
         +- UWindowGridClient
         +- UWindowGridColumn
         +- UWindowHScrollBar
         +- UWindowHSplitter
         +- UWindowMessageBoxArea
         +- UWindowProgressBar
         +- UWindowRootWindow
         |   +- UBrowserRootWindow
         +- UWindowTabControlTabArea
         +- UWindowVScrollBar
         +- UWindowVSplitter

===&quot;All&quot; Classes===

Thse classes define stuff to be imported with #EXEC commands.  They have no properties or behavior on their own, and contain meshes and textures unless otherwise specified.
; AllAmmo : Ammunition
; AllAnimals : Animals
; AllDeco : Generic Decorations
; Effects : Effects
; Fragments : Fragments
; AllHongKongDeco : Hong Kong Decorations
; AllMajor : Meshes and textures for major (lead) Actors
; AllMinor : ... for the minor (supporting) Actors
; AllNewYorkDeco : NYC Decorations
; AllParisDeco : Paris Decorations
; AllPickups : Pickups
; AllProjectiles : Projectiles
; AllRobots : Robots
; AllSounds : Imported .WAV audio
; AllUI : Textures used in the UI
; AllWashingtonDeco : Washington DC Decorations
; AllWeapons : Weapons

==Discussion==

'''OlympusMons:''' Gonna give this one a [[:Category:Legacy To Do]] because some of this can go on other pages and using the newer layout the &gt;&gt; indicator will show pages with expanded class trees.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Class Wikifier</title>
    <id>760</id>
    <revision>
      <id>2173</id>
      <timestamp>2006-01-05T05:59:48Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Nick89, here's the Wikifier I mentioned.</comment>
      <text xml:space="preserve">The Class Wikifier takes an [[Legacy:UnrealScript|UnrealScript]] class script and produces the bare bones of a wiki page.

: http://wiki.beyondunreal.com/cgi-bin/class.cgi

To use it:
# The top box contains an example class: highlight it all replace with the script you want to process
# hit the button
# select all the text in the bottom box, copy &amp; paste to a Wiki page

It currently produces:
* the header block (but you'll need to fill in the hierarchy, as the wikifier can only determine the parent)
* 2 lists: public &amp; private variables. UnrealScript comments are kept as descriptions. 
* it handles array declarations (eg float[4]) but could the output be made neater?

Planned improvements:
* group the variables, ie given var(foo), group by foo
* create a list of functions with name, return type, and parameters.

----

''The Class Wikifier is by tarquin, built on Mychaeel's Wookee Playground perl script. Any mistakes are tarquin's fault :D.''

==Bugs ==

===Split line var declaration ===

&lt;uscript&gt;
// Type A
var() bool one, // the first one
  two; // the seocnd one
&lt;/uscript&gt;

Is the following also possible?

&lt;uscript&gt;
// Type B
var() bool one // the first one, but no comma .... yet
 , two; // the seocnd one
&lt;/uscript&gt;

'''Mychaeel:'''  Absolutely.  Line breaks are just another form of whitespace, and the parser doesn't care about whitespace between tokens.  (Maybe that'd be the best approach for the Wikifier too.)

'''Tarquin:''' My problem is how to decide which variable name the comment belongs to.

'''Tarquin:''' Done. 

===Superclass detection===

Fixed, I think:

&lt;uscript&gt;
#exec Texture Import File=Textures\S_FluidSurf.pcx Name=S_FluidSurf Mips=Off MASKED=1

class FluidSurfaceInfo extends Info
	showcategories(Movement,Collision,Lighting,LightColor,Karma,Force)
	native
	noexport
	placeable;
&lt;/uscript&gt;

===Fixed ===

* expands / extends 
* multi-line class and var declaration

==Dev ==

===New atomiser ===

Obviously, my split on /\n/ was too simple. Here's work in progress on an atomiser:

&lt;uscript&gt;
  # split to atoms
  # remove comments
  $textProcessed =~ s[/\*.*?\*\/][]gs; # blocks
  $textProcessed =~ s[^//.*\n][]gm; # solo lines
  # exec lines
  $textProcessed =~ s[^\s*\#exec.*\n][]gm; 

  # mark end of comments
  $textProcessed =~ s[(//.*)$][$1\*/]mg;
  
  # find &amp; mark the end of atoms
  $endTag = '/*END*/'; # safe, since /**/ pairs already gone
  $textProcessed =~ s[;\s*$][;$endTag]gm; # a ; ending
  $textProcessed =~ s[;.*//(.*)$][; //$1 $endTag]gm; # a ; // comment ending
  
  # remove mid-atom newlines 
  $textProcessed =~ s[\n][]g;
  $textProcessed =~ s[\Q$endTag\E][\n]g; #wahey! I've learned how to use \Q\E!
  
  # now each code atom is a single line
  @classLines = split( /\n/, $textProcessed );
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]
* [[Legacy:UnrealScript Grammar|UnrealScript Grammar]]
* [[Legacy:Project Discussion|Project Discussion]]

==Discussion==

'''Wormbo:''' Mistakes such as the naming conventions... :rolleyes: the &lt;tt&gt;Hidden&lt;/tt&gt; variable is not &quot;private&quot; (as in &quot;accessible from this class only&quot;), it's just not visible in UnrealEd. Also the class line is not parsed into the wiki class definition if it contains class modifiers on the same line. Other than that it's really helpful. :)

'''Tarquin:''' Oops. Yeah, I knew about &quot;private&quot; being wrong, but by the time I notices I was all perled out. Should it be &quot;Non-editable&quot; instead of private? And drat, I forgot class modifiers. :( Expect version 2 soon ...

'''Tarquin:''' Fixed &quot;hidden&quot;, class declaration bugs (single-line and modifiers)

'''Wormbo:''' Looks like the [[Legacy:EnhancedItems|EnhancedItems]].PickupPlus class is a really heavy task for your script. It seems that your for the script lines end after a newline in a comment, but in UnrealScript a newline only ends the comment, not the line of code. Notice how e.g. bRenderOverlays or bIsJumpBoots don't appear in the wikified output. Also, how about displaying the variable type &lt;code&gt;class&lt;ClassName&gt;&lt;/code&gt; as &lt;code&gt;class&lt;[[Legacy:ClassName|ClassName]]&gt;&lt;/code&gt;?

'''Tarquin:''' I didn't know that was possible! &lt;code&gt;class&lt;[[Legacy:ClassName|ClassName]]&gt;&lt;/code&gt; is a neat idea. I'll get onto both. The parent didn't appear for your class because I can never remember which of extends / expands is used now.

&lt;uscript&gt;
var() bool one, // the first one
  two; // the seocnd one
&lt;/uscript&gt;

'''ZxAnPhOrIaN:''' Fish??

'''Tarquin:''' Yeah, fish. It's hard work making up variable names. 

'''ZxAnPhOrIaN:''' Its reallllly easy... *two hours pass* how 'bout Zxan!

'''DJPaul:''' Extends is now used in UT2003 (i.e. warfare) builds of the engine.. older versions use either.

Also, after this works like a charm, you should make a script that you can feed a list of ALL the UT2003 .uc's in at once, and make it batch you a lot of pages - save a lot of people doing each individuall =)

'''Tarquin:''' A sort of Wiki-[[Legacy:UnDox|UnDox]] you mean? &quot;Extends&quot; is fixed in my current version. I just always forget which one is deprecated.

'''DJPaul:''' Yes -basically you make another script that feeds in text from all UT2003 classes, then this script creates many pages for us.  Result - instant, total, complete class listing, reading for comments! (you could include those sections too)

'''Tarquin:''' The file-reading &amp; page-writing is beyond my abilities. I'm not sure that creating hundreds of pages is a good idea. I'd rather we only create class pages when there's new information to be added to them.

'''Aphelion:''' I don't know if you built the wikifier to cope with enumerators, but it certainly doesn't cope with them when they have comments inside the decleration.

'''Wormbo:''' Please don't use the wikifier yet, at least not without checking the results first. I've seen several [[Legacy:UT2003|UT2003]] [[Legacy:GameInfo|GameInfo]] (sub)class pages which don't look very complete to me.&lt;br /&gt;BTW: I prefer the '''float PropertyName''' format (which is already used throughout the Wiki) instead of '''PropertyName (float)''' which is too function-like for my taste.

'''Tarquin:''' Nope, it doesn't do enums. (arg! comments in declarations everywhere!). The problem with putting the type first is that the list can't be alphabetized. 

'''Aphelion:'''  Wormbo, I only picked up this error on the last class I did which was [[Legacy:WeaponFire|WeaponFire]].  I'll go back through the stuff I did and check and pretty it up and correct it all.  As for it not being too complete, well you're damn right.  However, I don't see anyone else rushing to fill out those classes, and I have little time to devote to coding as it is...

'''Wormbo:''' Tarquin, you could try sorting it first and then add the types. (or move them to the front)

'''Tarquin:''' Now handles var groups. :D As for how to display the type of vars in property lists, that's on [[Legacy:Guidelines On General Style|Guidelines On General Style]]

'''Tarquin:''' It now handles wormbo-style comments &amp; var-defined enums. This, however, has broken the alphabetical sorting. Will fix later.

'''Wormbo:''' Partly. After such a &quot;wormbo-style&quot; variable declaration I have this:

&lt;uscript&gt;
// message displayed when killing with a head shot
// The message should respond to the Switch parameter in the following way:
// 1 = Player is killer
// 2 = Player is victim
// 3 = Player killed self
// (Botpack.DecapitationMessage will always be displayed for killer and victim.)
var() class&lt;LocalMessage&gt; HeadShotMessage;

var() bool bCanHeadShoot,		// has special head shooting abilities (more damage, different death message)
	bConstantSplashDamage;	// causes the damage in the outer splash area
&lt;/uscript&gt;

----
;  HeadShotMessage :  
; bool  :  
; bool different death message)*/ :  
; bool bConstantSplashDamage  :  causes the damage in the outer splash area 

----

It seems like it doesn't handle &lt;code&gt;class&lt;foo&gt;&lt;/code&gt; and has problems with &quot;,&quot; in comments?

'''Tarquin:''' Problem with class&lt;foo&gt; is that it's looking for word characters: I'll fix that. Commas in comments? Arg! But I'm splitting the string on &quot;,&quot;! (I think I've thought of a way to fix it though)

'''Wormbo:''' Some properties are missing when I use EnhancedItems.EnhancedWeapon as input.

'''Tarquin:''' Got it :)

'''Wormbo:''' Hmm, UT2003's Mover class breaks the enum parser. Also you shouldn't mess with the group names' capitalization. (i.e. keep &quot;MoverSounds&quot; instead of changing it to &quot;Moversounds&quot;)

'''Mysterial:''' It seems to be losing the data type for array declarations, e.g.

&lt;uscript&gt;
var name CrouchAnims[4];
&lt;/uscript&gt;

becomes
;CrouchAnims[4] : 

Which for larger classes (like Pawn) can be a pain to go through and fix.

'''Tarquin:''' yeah... I've not dealt with this in ages &amp; it's buggy. If anyone wants to take over the maintenance from me.... :)

'''Pingz:''' Is it a perl cgi script?  I haven't done any perl stuff in a while, but i would kill for the ability for function processing in the wikifier.  I guess i'll give it a try.

'''Tarquin:''' yes, it's perl. I'll email you the script. :) be warned, it's not very elegant. and as pointed out above, it has problems dealing with certain cases. [[Legacy:UnrealScript Grammar|UnrealScript Grammar]] might help.

'''Pingz:''' I've made a few simple improvements today.  Should i add a link to the ''in development'' version for some testing ( more than what i already did ) or should we just update the existing one when there are a few improvements?  How can i update it or should i just send it to you Tarquin?

'''Tarquin:''' Just mail me it and I'll replace the current version.

'''Pingz:''' What i'll do is get functions in there then i'll send it to you.  It will probably be a couple of days before i get that in there anyway.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2174</id>
      <timestamp>2003-08-29T22:04:49Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The Class Wikifier takes an [[Legacy:UnrealScript|UnrealScript]] class script and produces the bare bones of a wiki page.

: http://wiki.beyondunreal.com/cgi-bin/class.cgi

To use it:
# The top box contains an example class: highlight it all replace with the script you want to process
# hit the button
# select all the text in the bottom box, copy &amp; paste to a Wiki page

It currently produces:
* the header block (but you'll need to fill in the hierarchy, as the wikifier can only determine the parent)
* 2 lists: public &amp; private variables. UnrealScript comments are kept as descriptions. 
* it handles array declarations (eg float[4]) but could the output be made neater?

Planned improvements:
* group the variables, ie given var(foo), group by foo
* create a list of functions with name, return type, and parameters.

----

''The Class Wikifier is by tarquin, built on Mychaeel's Wookee Playground perl script. Any mistakes are tarquin's fault :D.''

==Bugs ==

===Split line var declaration ===

&lt;uscript&gt;
// Type A
var() bool one, // the first one
  two; // the seocnd one
&lt;/uscript&gt;

Is the following also possible?

&lt;uscript&gt;
// Type B
var() bool one // the first one, but no comma .... yet
 , two; // the seocnd one
&lt;/uscript&gt;

'''Mychaeel:'''  Absolutely.  Line breaks are just another form of whitespace, and the parser doesn't care about whitespace between tokens.  (Maybe that'd be the best approach for the Wikifier too.)

'''Tarquin:''' My problem is how to decide which variable name the comment belongs to.

'''Tarquin:''' Done. 

===Superclass detection===

Fixed, I think:

&lt;uscript&gt;
#exec Texture Import File=Textures\S_FluidSurf.pcx Name=S_FluidSurf Mips=Off MASKED=1

class FluidSurfaceInfo extends Info
	showcategories(Movement,Collision,Lighting,LightColor,Karma,Force)
	native
	noexport
	placeable;
&lt;/uscript&gt;

===Fixed ===

* expands / extends 
* multi-line class and var declaration

==Dev ==

===New atomiser ===

Obviously, my split on /\n/ was too simple. Here's work in progress on an atomiser:

&lt;uscript&gt;
  # split to atoms
  # remove comments
  $textProcessed =~ s[/\*.*?\*\/][]gs; # blocks
  $textProcessed =~ s[^//.*\n][]gm; # solo lines
  # exec lines
  $textProcessed =~ s[^\s*\#exec.*\n][]gm; 

  # mark end of comments
  $textProcessed =~ s[(//.*)$][$1\*/]mg;
  
  # find &amp; mark the end of atoms
  $endTag = '/*END*/'; # safe, since /**/ pairs already gone
  $textProcessed =~ s[;\s*$][;$endTag]gm; # a ; ending
  $textProcessed =~ s[;.*//(.*)$][; //$1 $endTag]gm; # a ; // comment ending
  
  # remove mid-atom newlines 
  $textProcessed =~ s[\n][]g;
  $textProcessed =~ s[\Q$endTag\E][\n]g; #wahey! I've learned how to use \Q\E!
  
  # now each code atom is a single line
  @classLines = split( /\n/, $textProcessed );
&lt;/uscript&gt;

==Comments ==

'''Wormbo:''' Mistakes such as the naming conventions... :rolleyes: the &lt;tt&gt;Hidden&lt;/tt&gt; variable is not &quot;private&quot; (as in &quot;accessible from this class only&quot;), it's just not visible in UnrealEd. Also the class line is not parsed into the wiki class definition if it contains class modifiers on the same line. Other than that it's really helpful. :)

'''Tarquin:''' Oops. Yeah, I knew about &quot;private&quot; being wrong, but by the time I notices I was all perled out. Should it be &quot;Non-editable&quot; instead of private? And drat, I forgot class modifiers. :( Expect version 2 soon ...

'''Tarquin:''' Fixed &quot;hidden&quot;, class declaration bugs (single-line and modifiers)

'''Wormbo:''' Looks like the [[Legacy:EnhancedItems|EnhancedItems]].PickupPlus class is a really heavy task for your script. It seems that your for the script lines end after a newline in a comment, but in UnrealScript a newline only ends the comment, not the line of code. Notice how e.g. bRenderOverlays or bIsJumpBoots don't appear in the wikified output. Also, how about displaying the variable type &lt;code&gt;class&lt;ClassName&gt;&lt;/code&gt; as &lt;code&gt;class&lt;[[Legacy:ClassName|ClassName]]&gt;&lt;/code&gt;?

'''Tarquin:''' I didn't know that was possible! &lt;code&gt;class&lt;[[Legacy:ClassName|ClassName]]&gt;&lt;/code&gt; is a neat idea. I'll get onto both. The parent didn't appear for your class because I can never remember which of extends / expands is used now.

&lt;uscript&gt;
var() bool one, // the first one
  two; // the seocnd one
&lt;/uscript&gt;

'''ZxAnPhOrIaN:''' Fish??

'''Tarquin:''' Yeah, fish. It's hard work making up variable names. 

'''ZxAnPhOrIaN:''' Its reallllly easy... *two hours pass* how 'bout Zxan!

'''DJPaul:''' Extends is now used in UT2003 (i.e. warfare) builds of the engine.. older versions use either.

Also, after this works like a charm, you should make a script that you can feed a list of ALL the UT2003 .uc's in at once, and make it batch you a lot of pages - save a lot of people doing each individuall =)

'''Tarquin:''' A sort of Wiki-[[Legacy:UnDox|UnDox]] you mean? &quot;Extends&quot; is fixed in my current version. I just always forget which one is deprecated.

'''DJPaul:''' Yes -basically you make another script that feeds in text from all UT2003 classes, then this script creates many pages for us.  Result - instant, total, complete class listing, reading for comments! (you could include those sections too)

'''Tarquin:''' The file-reading &amp; page-writing is beyond my abilities. I'm not sure that creating hundreds of pages is a good idea. I'd rather we only create class pages when there's new information to be added to them.

'''Aphelion:''' I don't know if you built the wikifier to cope with enumerators, but it certainly doesn't cope with them when they have comments inside the decleration.

'''Wormbo:''' Please don't use the wikifier yet, at least not without checking the results first. I've seen several [[Legacy:UT2003|UT2003]] [[Legacy:GameInfo|GameInfo]] (sub)class pages which don't look very complete to me.&lt;br /&gt;BTW: I prefer the '''float PropertyName''' format (which is already used throughout the Wiki) instead of '''PropertyName (float)''' which is too function-like for my taste.

'''Tarquin:''' Nope, it doesn't do enums. (arg! comments in declarations everywhere!). The problem with putting the type first is that the list can't be alphabetized. 

'''Aphelion:'''  Wormbo, I only picked up this error on the last class I did which was [[Legacy:WeaponFire|WeaponFire]].  I'll go back through the stuff I did and check and pretty it up and correct it all.  As for it not being too complete, well you're damn right.  However, I don't see anyone else rushing to fill out those classes, and I have little time to devote to coding as it is...

'''Wormbo:''' Tarquin, you could try sorting it first and then add the types. (or move them to the front)

'''Tarquin:''' Now handles var groups. :D As for how to display the type of vars in property lists, that's on [[Legacy:Guidelines On General Style|Guidelines On General Style]]

'''Tarquin:''' It now handles wormbo-style comments &amp; var-defined enums. This, however, has broken the alphabetical sorting. Will fix later.

'''Wormbo:''' Partly. After such a &quot;wormbo-style&quot; variable declaration I have this:

&lt;uscript&gt;
// message displayed when killing with a head shot
// The message should respond to the Switch parameter in the following way:
// 1 = Player is killer
// 2 = Player is victim
// 3 = Player killed self
// (Botpack.DecapitationMessage will always be displayed for killer and victim.)
var() class&lt;LocalMessage&gt; HeadShotMessage;

var() bool bCanHeadShoot,		// has special head shooting abilities (more damage, different death message)
	bConstantSplashDamage;	// causes the damage in the outer splash area
&lt;/uscript&gt;

----
;  HeadShotMessage :  
; bool  :  
; bool different death message)*/ :  
; bool bConstantSplashDamage  :  causes the damage in the outer splash area 

----

It seems like it doesn't handle &lt;code&gt;class&lt;foo&gt;&lt;/code&gt; and has problems with &quot;,&quot; in comments?

'''Tarquin:''' Problem with class&lt;foo&gt; is that it's looking for word characters: I'll fix that. Commas in comments? Arg! But I'm splitting the string on &quot;,&quot;! (I think I've thought of a way to fix it though)

'''Wormbo:''' Some properties are missing when I use EnhancedItems.EnhancedWeapon as input.

'''Tarquin:''' Got it :)

'''Wormbo:''' Hmm, UT2003's Mover class breaks the enum parser. Also you shouldn't mess with the group names' capitalization. (i.e. keep &quot;MoverSounds&quot; instead of changing it to &quot;Moversounds&quot;)

'''Mysterial:''' It seems to be losing the data type for array declarations, e.g.

&lt;uscript&gt;
var name CrouchAnims[4];
&lt;/uscript&gt;

becomes
;CrouchAnims[4] : 

Which for larger classes (like Pawn) can be a pain to go through and fix.

'''Tarquin:''' yeah... I've not dealt with this in ages &amp; it's buggy. If anyone wants to take over the maintenance from me.... :)

'''Pingz:''' Is it a perl cgi script?  I haven't done any perl stuff in a while, but i would kill for the ability for function processing in the wikifier.  I guess i'll give it a try.

'''Tarquin:''' yes, it's perl. I'll email you the script. :) be warned, it's not very elegant. and as pointed out above, it has problems dealing with certain cases. [[Legacy:UnrealScript Grammar|UnrealScript Grammar]] might help.

'''Pingz:''' I've made a few simple improvements today.  Should i add a link to the ''in development'' version for some testing ( more than what i already did ) or should we just update the existing one when there are a few improvements?  How can i update it or should i just send it to you Tarquin?

'''Tarquin:''' Just mail me it and I'll replace the current version.

'''Pingz:''' What i'll do is get functions in there then i'll send it to you.  It will probably be a couple of days before i get that in there anyway.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Claw</title>
    <id>747</id>
    <revision>
      <id>2140</id>
      <timestamp>2003-08-08T20:21:24Z</timestamp>
      <contributor>
        <ip>216.166.12.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome on Claw's personal pimpage.

===Contact ===
* email: kreydon@gmx.net
* icq: '''127677338'''
* irc: ETG '''#darkmagic #aeon'''(in theory) '''#xenocide'''(myth really)

===Projects ===

====[[Legacy:Mod_Ideas/Xenocide|Xenocide]] ====

I guess this is the right place to advertise the mod I'm working on. 

We need a hand or two... modelers welcome. Coders, texturers... the more the merrier.

====[http://www.planetunreal.com/ucz/ Dark Magic] ====

Isn't dead. Not quite. There'll be at least one proper version for UT. We plan to resurrect it on Unreal2.

==Comments ==

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Wormbo:''' Hi and welcome, Claw. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:''' Hallo claw.

'''Claw:''' Heya. Now, now. Lucky me. UT2k3 is at the door, arm in arm with the new term at university. I hope I'll have enough time to study while modding ;)

'''Aphelion:'''  Hello...  Nice to see I'm not the only one with the problem of Uni and UT2003 coming out... :)  It's great on productivity, no? :D

'''Claw:''' Heya. Time's not (yet) so bad actually, the lack of support ails me more. :/

'''Bot 40:''' drops in on claw

'''Bot 40:''' waits for the inevitable comment about not dropping in at #darkmagic ever

'''Claw:''' LOL, I didn't visit the wiki in months. I am just too lazy for anything, in case you didn't notice.

'''Erdrik:''' Heya, to copy Claw. It says your going to resurrect Dark Magic on Unreal2? 

Just to put my 2 cents in, I think UT2003 would be better. But since I've been inactive for 

so long... Anywho I'm interested in Xenocide email me about it. ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2141</id>
      <timestamp>2003-05-24T11:54:15Z</timestamp>
      <contributor>
        <ip>PD950FB7F.dip.t-dialin.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome on Claw's personal pimpage.

===Contact ===
* email: kreydon@gmx.net
* icq: '''127677338'''
* irc: ETG '''#darkmagic #aeon'''(in theory) '''#xenocide'''(myth really)

===Projects ===

====[[Legacy:Mod_Ideas/Xenocide|Xenocide]] ====

I guess this is the right place to advertise the mod I'm working on. 

We need a hand or two... modelers welcome. Coders, texturers... the more the merrier.

====[http://www.planetunreal.com/ucz/ Dark Magic] ====

Isn't dead. Not quite. There'll be at least one proper version for UT. We plan to resurrect it on Unreal2.

==Comments ==

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Wormbo:''' Hi and welcome, Claw. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:''' Hallo claw.

'''Claw:''' Heya. Now, now. Lucky me. UT2k3 is at the door, arm in arm with the new term at university. I hope I'll have enough time to study while modding ;)

'''Aphelion:'''  Hello...  Nice to see I'm not the only one with the problem of Uni and UT2003 coming out... :)  It's great on productivity, no? :D

'''Claw:''' Heya. Time's not (yet) so bad actually, the lack of support ails me more. :/

'''Bot 40:''' drops in on claw

'''Bot 40:''' waits for the inevitable comment about not dropping in at #darkmagic ever

'''Claw:''' LOL, I didn't visit the wiki in months. I am just too lazy for anything, in case you didn't notice.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2142</id>
      <timestamp>2003-08-08T20:20:39Z</timestamp>
      <contributor>
        <ip>216.166.12.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome on Claw's personal pimpage.

===Contact ===
* email: kreydon@gmx.net
* icq: '''127677338'''
* irc: ETG '''#darkmagic #aeon'''(in theory) '''#xenocide'''(myth really)

===Projects ===

====[[Legacy:Mod_Ideas/Xenocide|Xenocide]] ====

I guess this is the right place to advertise the mod I'm working on. 

We need a hand or two... modelers welcome. Coders, texturers... the more the merrier.

====[http://www.planetunreal.com/ucz/ Dark Magic] ====

Isn't dead. Not quite. There'll be at least one proper version for UT. We plan to resurrect it on Unreal2.

==Comments ==

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Wormbo:''' Hi and welcome, Claw. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:''' Hallo claw.

'''Claw:''' Heya. Now, now. Lucky me. UT2k3 is at the door, arm in arm with the new term at university. I hope I'll have enough time to study while modding ;)

'''Aphelion:'''  Hello...  Nice to see I'm not the only one with the problem of Uni and UT2003 coming out... :)  It's great on productivity, no? :D

'''Claw:''' Heya. Time's not (yet) so bad actually, the lack of support ails me more. :/

'''Bot 40:''' drops in on claw

'''Bot 40:''' waits for the inevitable comment about not dropping in at #darkmagic ever

'''Claw:''' LOL, I didn't visit the wiki in months. I am just too lazy for anything, in case you didn't notice.

'''Erdrik:''' Heya, to copy Claw. It says your going to resurrect Dark Magic on Unreal2? 

Just to put my 2 cents in, I think UT2003 would be better. But since I've been inactive for 

so long... Anywho I'm interested in Xenocideemail me about it. ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CleanMe</title>
    <id>825</id>
    <revision>
      <id>2317</id>
      <timestamp>2003-07-23T02:02:33Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The Unreal Wiki can be a little intimidating if you're unfamiliar with all of the technical details presented on these pages.

If you're new to the wiki or Unreal Development, you might wonder how you can contribute.

Whenever you see a page with CleanMe at the bottom, it means that someone thought the entry could use a decent spell or grammar checking. Run on sentences, typos, capitalization, etc.

It's a great way to show your support and make the wiki a little bit better.

----

'''Wormbo:''' Is this supposed to be a [[Legacy:WikiTag|WikiTag]]? If yes, why isn't it called &quot;Clean Me&quot; (like &quot;Refactor Me&quot;, notice the space) and why doesn't the one who adds this tag cleans up the page him- or herself? &quot;Category To Do &amp;ndash; clean up spelling&quot; would work as well IMHO.

'''Foxpaw:''' Or just refactor me itself.. the two tags basically mean the same thing, although this one is a little less intensive.

'''Kerlin:''' Sorry Wormbo. My bad. The reason I didn't clean up the page myself was because I was at work. I sometimes browse the wiki at work and often come across pages that need some grammatical &quot;cleansing&quot;. I thought that even if I'm the only one to use the Clean Me tag, it's a sort of note to self that allows me to contribute to the wiki without worrying about handing out wrong info or refactoring out something relevant. It's the least I can do sort of thing what with all of the help that folks have given me I wanted to contribute in whatever way I could. Kill this page if you think the refactor me page is sufficient.</text>
    </revision>
    <revision>
      <id>2318</id>
      <timestamp>2003-07-22T21:36:57Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The Unreal Wiki can be a little intimidating if you're unfamiliar with all of the technical details presented on these pages.

If you're new to the wiki or Unreal Development, you might wonder how you can contribute.

Whenever you see a page with CleanMe at the bottom, it means that someone thought the entry could use a decent spell or grammar checking. Run on sentences, typos, capitalization, etc.

It's a great way to show your support and make the wiki a little bit better.

----

'''Wormbo:''' Is this supposed to be a [[Legacy:WikiTag|WikiTag]]? If yes, why isn't it called &quot;Clean Me&quot; (like &quot;Refactor Me&quot;, notice the space) and why doesn't the one who adds this tag cleans up the page him- or herself? &quot;Category To Do &amp;ndash; clean up spelling&quot; would work as well IMHO.

'''Foxpaw:''' Or just refactor me itself.. the two tags basically mean the same thing, although this one is a little less intensive.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ClientMaterialTrigger</title>
    <id>741</id>
    <revision>
      <id>2126</id>
      <timestamp>2007-11-18T17:06:26Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:MaterialTrigger|MaterialTrigger]] &gt;&gt; ClientMaterialTrigger (custom)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; MaterialTriggerReplicationInfo (custom)}}

These classes were written by [[Legacy:Wormbo|Wormbo]].

The ClientMaterialTrigger class triggers [[Legacy:Material|Material]]s just like a [[Legacy:MaterialTrigger|MaterialTrigger]]. The important difference is: The ClientMaterialTrigger also works on network clients. (See [[Legacy:Replication|Replication]].)

The MaterialTriggerReplicationInfo is a helper class to replicate trigger events to network clients.

==Properties==
; array&lt;[[Legacy:Material|Material]]&gt; MaterialsToTrigger : Inherited from [[Legacy:MaterialTrigger|MaterialTrigger]]. A list of materials that should be triggered or reset.
; ETriggerAction TriggerAction : What to do with the materials when the ClientMaterialTrigger is triggered.
; EUntriggerAction UntriggerAction : What to do with the materials when the ClientMaterialTrigger is untriggered.

==Enums==

===ETriggerAction===
; TriggerTriggers : Triggering triggers the materials. (default)
; TriggerResets : Triggering resets the materials.
; TriggerDoesNothing : Triggering has no effect.

===EUntriggerAction===
; UntriggerDoesNothing : Untriggering does nothing. (default)
; UntriggerTriggers : Untriggering triggers the materials.
; UntriggerResets : Untriggering resets the materials.

==Code==

This custom class actually consists of two classes. Both are required for compiling.

===ClientMaterialTrigger===

[[Legacy:Create A Subclass|Create A Subclass]] of [[Legacy:MaterialTrigger|MaterialTrigger]] in the package [[Legacy:MyLevel|MyLevel]] and name it &lt;tt&gt;ClientMaterialTrigger&lt;/tt&gt;. Paste the following code replacing the lines UnrealEd automatically added to the class:

&lt;uscript&gt;
//=============================================================================
// ClientMaterialTrigger
// Copyright 2003 by Wormbo
//
// A MaterialTrigger that works in network games.
//=============================================================================


class ClientMaterialTrigger extends MaterialTrigger;


//=============================================================================
// Variables
//=============================================================================

// whether triggering resets or triggers the materials
var(MaterialTrigger) enum ETriggerAction {
  TriggerTriggers,
  TriggerResets,
  TriggerDoesNothing
} TriggerAction;

// whether untriggering resets or triggers the materials
var(MaterialTrigger) enum EUnriggerAction {
  UntriggerDoesNothing,
  UntriggerTriggers,
  UntriggerResets
} UntriggerAction;

// array holding the ReplicationInfos for clientside triggering
var array&lt;MaterialTriggerReplicationInfo&gt; ReplicatedMaterialTriggers;


//=============================================================================
// PostBeginPlay
//
// Spawns a MaterialTriggerReplicationInfo for each triggered material.
//=============================================================================

function PostBeginPlay()
{
  local int i;
  
  ReplicatedMaterialTriggers.Length = MaterialsToTrigger.Length;
  
  for (i = 0; i &lt; MaterialsToTrigger.Length; i++) {
    ReplicatedMaterialTriggers[i] = Spawn(class'MaterialTriggerReplicationInfo', Self);
    ReplicatedMaterialTriggers[i].SetMaterialToTrigger(string(MaterialsToTrigger[i]));
  }
}


//=============================================================================
// Trigger
//
// Tells the MTRIs about the Instigators and triggering actors and tells them
// to trigger the material.
//=============================================================================

function Trigger(Actor Other, Pawn EventInstigator)
{
  local int i;
  
  if ( Other == None )
    Other = Self;
  
  if ( TriggerAction == TriggerTriggers ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].TriggerMaterial(Other, EventInstigator);
  }
  else if ( TriggerAction == TriggerResets ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].ResetMaterial();
  }
}


//=============================================================================
// Untrigger
//
// Triggers or resets the materials depending on the UntriggerAction property.
//=============================================================================

function Untrigger(Actor Other, Pawn EventInstigator)
{
  local int i;
  
  if ( Other == None )
    Other = Self;
  
  if ( UntriggerAction == UntriggerTriggers ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].TriggerMaterial(Other, EventInstigator);
  }
  else if ( UntriggerAction == UntriggerResets ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].ResetMaterial();
  }
}
&lt;/uscript&gt;

===MaterialTriggerReplicationInfo===

[[Legacy:Create A Subclass|Create A Subclass]] of [[Legacy:ReplicationInfo|ReplicationInfo]] in [[Legacy:MyLevel|MyLevel]] and name it &lt;tt&gt;MaterialTriggerReplicationInfo&lt;/tt&gt;. (You need to uncheck the &quot;Placeable classes Only&quot; checkbox to see [[Legacy:ReplicationInfo|ReplicationInfo]] in the [[Legacy:Actor Classes Browser|Actor Classes Browser]].) Paste the following code replacing the lines UnrealEd automatically added to the class:

&lt;uscript&gt;
//=============================================================================
// MaterialTriggerReplicationInfo
// Copyright 2003 by Wormbo
//
// Used by ClientMaterialTrigger to replicate material trigger events to
// network clients.
//=============================================================================


class MaterialTriggerReplicationInfo extends ReplicationInfo;


//=============================================================================
// Variables
//=============================================================================

var Material MaterialToTrigger;
var string MaterialName;
var int ClientTriggerCount;
var int ClientUnTriggerCount;
var int TriggerCount;
var struct TTriggerData {
  var Actor Triggerer;
  var Pawn EventInstigator;
  var byte TriggerAction; // 0 = nothing/idle, 1 = trigger, 2 = reset
} LastTriggerings[10];


//=============================================================================
// Replication
//=============================================================================

replication
{
  reliable if ( Role == ROLE_Authority )
    TriggerCount, LastTriggerings, MaterialName;
}


simulated function PostBeginPlay()
{
  SetTimer(0.1, True);
}


function SetMaterialToTrigger(string newMaterial)
{
  MaterialName = newMaterial;
}


function TriggerMaterial(Actor Other, Pawn EventInstigator)
{
  TriggerCount++;
  LastTriggerings[TriggerCount % 10].Triggerer = Other;
  LastTriggerings[TriggerCount % 10].EventInstigator = EventInstigator;
  LastTriggerings[TriggerCount % 10].TriggerAction = 1;
}


function ResetMaterial()
{
  TriggerCount++;
  LastTriggerings[TriggerCount % 10].TriggerAction = 2;
}


simulated function Timer()
{
  if ( MaterialName != &quot;&quot; &amp;&amp; MaterialToTrigger == None ) {
    MaterialToTrigger = Material(DynamicLoadObject(MaterialName, class'Material'));
    if ( MaterialToTrigger != None )
      MaterialToTrigger.Reset();
  }
  
  if ( MaterialToTrigger != None &amp;&amp; TriggerCount &gt; ClientTriggerCount
      &amp;&amp; LastTriggerings[(ClientTriggerCount + 1) % 10].TriggerAction != 0 ) {
    ClientTriggerCount++;
    if ( LastTriggerings[ClientTriggerCount % 10].TriggerAction == 2 )
      MaterialToTrigger.Reset();
    else
      MaterialToTrigger.Trigger(LastTriggerings[ClientTriggerCount % 10].Triggerer,
          LastTriggerings[ClientTriggerCount % 10].EventInstigator);
  }
}
&lt;/uscript&gt;

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2127</id>
      <timestamp>2005-11-22T19:47:32Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:MaterialTrigger|MaterialTrigger]] &gt;&gt; ClientMaterialTrigger (custom)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; MaterialTriggerReplicationInfo (custom)}}

These classes were written by [[Legacy:Wormbo|Wormbo]].

The ClientMaterialTrigger class triggers [[Legacy:Material|Material]]s just like a [[Legacy:MaterialTrigger|MaterialTrigger]]. The important difference is: The ClientMaterialTrigger also works on network clients. (See [[Legacy:Replication|Replication]].)

The MaterialTriggerReplicationInfo is a helper class to replicate trigger events to network clients.

==Properties==
; array&lt;[[Legacy:Material|Material]]&gt; MaterialsToTrigger : Inherited from [[Legacy:MaterialTrigger|MaterialTrigger]]. A list of materials that should be triggered or reset.
; ETriggerAction TriggerAction : What to do with the materials when the ClientMaterialTrigger is triggered.
; EUntriggerAction UntriggerAction : What to do with the materials when the ClientMaterialTrigger is untriggered.

==Enums==

===ETriggerAction===
; TriggerTriggers : Triggering triggers the materials. (default)
; TriggerResets : Triggering resets the materials.
; TriggerDoesNothing : Triggering has no effect.

===EUntriggerAction===
; UntriggerDoesNothing : Untriggering does nothing. (default)
; UntriggerTriggers : Untriggering triggers the materials.
; UntriggerResets : Untriggering resets the materials.

==Code==

This custom class actually consists of two classes. Both are required for compiling.

===ClientMaterialTrigger===

[[Legacy:Create A Subclass|Create A Subclass]] of [[Legacy:MaterialTrigger|MaterialTrigger]] in the package [[Legacy:MyLevel|MyLevel]] and name it &lt;tt&gt;ClientMaterialTrigger&lt;/tt&gt;. Paste the following code replacing the lines UnrealEd automatically added to the class:

&lt;uscript&gt;
//=============================================================================
// ClientMaterialTrigger
// Copyright 2003 by Wormbo
//
// A MaterialTrigger that works in network games.
//=============================================================================


class ClientMaterialTrigger extends MaterialTrigger;


//=============================================================================
// Variables
//=============================================================================

// whether triggering resets or triggers the materials
var(MaterialTrigger) enum ETriggerAction {
  TriggerTriggers,
  TriggerResets,
  TriggerDoesNothing
} TriggerAction;

// whether untriggering resets or triggers the materials
var(MaterialTrigger) enum EUnriggerAction {
  UntriggerDoesNothing,
  UntriggerTriggers,
  UntriggerResets
} UntriggerAction;

// array holding the ReplicationInfos for clientside triggering
var array&lt;MaterialTriggerReplicationInfo&gt; ReplicatedMaterialTriggers;


//=============================================================================
// PostBeginPlay
//
// Spawns a MaterialTriggerReplicationInfo for each triggered material.
//=============================================================================

function PostBeginPlay()
{
  local int i;
  
  ReplicatedMaterialTriggers.Length = MaterialsToTrigger.Length;
  
  for (i = 0; i &lt; MaterialsToTrigger.Length; i++) {
    ReplicatedMaterialTriggers[i] = Spawn(class'MaterialTriggerReplicationInfo', Self);
    ReplicatedMaterialTriggers[i].SetMaterialToTrigger(string(MaterialsToTrigger[i]));
  }
}


//=============================================================================
// Trigger
//
// Tells the MTRIs about the Instigators and triggering actors and tells them
// to trigger the material.
//=============================================================================

function Trigger(Actor Other, Pawn EventInstigator)
{
  local int i;
  
  if ( Other == None )
    Other = Self;
  
  if ( TriggerAction == TriggerTriggers ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].TriggerMaterial(Other, EventInstigator);
  }
  else if ( TriggerAction == TriggerResets ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].ResetMaterial();
  }
}


//=============================================================================
// Untrigger
//
// Triggers or resets the materials depending on the UntriggerAction property.
//=============================================================================

function Untrigger(Actor Other, Pawn EventInstigator)
{
  local int i;
  
  if ( Other == None )
    Other = Self;
  
  if ( UntriggerAction == UntriggerTriggers ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].TriggerMaterial(Other, EventInstigator);
  }
  else if ( UntriggerAction == UntriggerResets ) {
    for (i = 0; i &lt; ReplicatedMaterialTriggers.Length; i++)
      if ( ReplicatedMaterialTriggers[i] != None )
        ReplicatedMaterialTriggers[i].ResetMaterial();
  }
}
&lt;/uscript&gt;

===MaterialTriggerReplicationInfo===

[[Legacy:Create A Subclass|Create A Subclass]] of [[Legacy:ReplicationInfo|ReplicationInfo]] in [[Legacy:MyLevel|MyLevel]] and name it &lt;tt&gt;MaterialTriggerReplicationInfo&lt;/tt&gt;. (You need to uncheck the &quot;Placeable classes Only&quot; checkbox to see [[Legacy:ReplicationInfo|ReplicationInfo]] in the [[Legacy:Actor Classes Browser|Actor Classes Browser]].) Paste the following code replacing the lines UnrealEd automatically added to the class:

&lt;uscript&gt;
//=============================================================================
// MaterialTriggerReplicationInfo
// Copyright 2003 by Wormbo
//
// Used by ClientMaterialTrigger to replicate material trigger events to
// network clients.
//=============================================================================


class MaterialTriggerReplicationInfo extends ReplicationInfo;


//=============================================================================
// Variables
//=============================================================================

var Material MaterialToTrigger;
var string MaterialName;
var int ClientTriggerCount;
var int ClientUnTriggerCount;
var int TriggerCount;
var struct TTriggerData {
  var Actor Triggerer;
  var Pawn EventInstigator;
  var byte TriggerAction; // 0 = nothing/idle, 1 = trigger, 2 = reset
} LastTriggerings[10];


//=============================================================================
// Replication
//=============================================================================

replication
{
  reliable if ( Role == ROLE_Authority )
    TriggerCount, LastTriggerings, MaterialName;
}


simulated function PostBeginPlay()
{
  SetTimer(0.1, True);
}


function SetMaterialToTrigger(string newMaterial)
{
  MaterialName = newMaterial;
}


function TriggerMaterial(Actor Other, Pawn EventInstigator)
{
  TriggerCount++;
  LastTriggerings[TriggerCount % 10].Triggerer = Other;
  LastTriggerings[TriggerCount % 10].EventInstigator = EventInstigator;
  LastTriggerings[TriggerCount % 10].TriggerAction = 1;
}


function ResetMaterial()
{
  TriggerCount++;
  LastTriggerings[TriggerCount % 10].TriggerAction = 2;
}


simulated function Timer()
{
  if ( MaterialName != &quot;&quot; &amp;&amp; MaterialToTrigger == None ) {
    MaterialToTrigger = Material(DynamicLoadObject(MaterialName, class'Material'));
    if ( MaterialToTrigger != None )
      MaterialToTrigger.Reset();
  }
  
  if ( MaterialToTrigger != None &amp;&amp; TriggerCount &gt; ClientTriggerCount
      &amp;&amp; LastTriggerings[(ClientTriggerCount + 1) % 10].TriggerAction != 0 ) {
    ClientTriggerCount++;
    if ( LastTriggerings[ClientTriggerCount % 10].TriggerAction == 2 )
      MaterialToTrigger.Reset();
    else
      MaterialToTrigger.Trigger(LastTriggerings[ClientTriggerCount % 10].Triggerer,
          LastTriggerings[ClientTriggerCount % 10].EventInstigator);
  }
}
&lt;/uscript&gt;

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ClientMover</title>
    <id>892</id>
    <revision>
      <id>2465</id>
      <timestamp>2005-12-15T00:18:16Z</timestamp>
      <contributor>
        <ip>192.251.69.127</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Mover|Mover]] &gt;&gt; ClientMover (Package: Engine)}}

This is a Mover that is used only for non-interactive purposes; like decoration.  The purpose is to save some CPU cycles on the Server as well as net speeds.

'''''Important:''''' It will be disabled on Servers, so absolutely do not use this for player lifts, doors, etc.

==Function==
; PostBeginPlay() : After calling &lt;tt&gt;Super.PostBeginPlay()&lt;/tt&gt;, checks if &lt;tt&gt;Level.NetMode&lt;/tt&gt; is a DedicatedServer.  If so, switches to state ServerIdle and calls &lt;tt&gt;SetTimer(0,false)&lt;/tt&gt; and &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt;.

==States==
; ServerIdle : EMPTY

==Related Topics==
* [[Legacy:VariableTimedMover|VariableTimedMover]] (custom)

==Discussion==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2466</id>
      <timestamp>2005-12-04T19:58:11Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Mover|Mover]] &gt;&gt; ClientMover (Package: Engine)}}

This is a Mover that is used only for non-interactive purposes; like decoration.  The purpose is to save some CPU cycles on the Server as well as net speeds.

'''''Important:''''' It will be disabled on Servers, so absolutely do not use this for player lifts, doors, etc.

==Function==
; PostBeginPlay() : After calling &lt;tt&gt;Super.PostBeginPlay()&lt;/tt&gt;, checks if &lt;tt&gt;Level.NetMode&lt;/tt&gt; is a DedicatedServer.  If so, switches to state ServerIdle and calls &lt;tt&gt;SetTimer(0,false)&lt;/tt&gt; and &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt;.

==States==
; ServerIdle : EMPTY

==Related Topics==
* [[Legacy:VariableTimedMover|VariableTimedMover]] (custom)

==Discussion==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ClientScriptedTexture</title>
    <id>684</id>
    <revision>
      <id>1995</id>
      <timestamp>2008-02-16T18:01:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed links</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; ClientScriptedTexture (Package: BotPack)}}

''ClientScriptedTexture'' is a convenient (though technically unnecessary) base class for all actors that solely implement functionality to draw dynamic content on [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]]s.

Other actors (some [[Legacy:Weapon (UT)|Weapon (UT)]]s and the [[Legacy:HeroStatue|HeroStatue]], for instance) implement the same functionality without being derived from ClientScriptedTexture.

==Properties==

===ScriptedTexture===
: Specifies the [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] that is drawn on.  Note that despite this property accepting regular [[Legacy:Texture (UT)|Texture (UT)]]s, the ClientScriptedTexture won't work (at all) unless you actually provide a [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] here (as opposed to a regular [[Legacy:Texture (UT)|Texture (UT)]]).

==Known Subclasses==
* [[Legacy:Screen|Screen]] ([[Legacy:Mychaeel|Mychaeel]]'s Screen Component)
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]

==External Links==
* [http://web.archive.org/web/20060509124619/http://www.planetunreal.com/screen/tutorials-misc-scriptedtextures.html Creating custom scripted textures]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>1996</id>
      <timestamp>2002-07-28T16:53:47Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; ClientScriptedTexture}}

''ClientScriptedTexture'' is a convenient (though technically unnecessary) base class for all actors that solely implement functionality to draw dynamic content on [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]]s.

Other actors (some [[Legacy:Weapon (UT)|Weapon (UT)]]s and the [[Legacy:HeroStatue|HeroStatue]], for instance) implement the same functionality without being derived from ClientScriptedTexture.

==Properties ==

====ScriptedTexture ====
: Specifies the [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] that is drawn on.  Note that despite this property accepting regular [[Legacy:Texture (UT)|Texture (UT)]]s, the ClientScriptedTexture won't work (at all) unless you actually provide a [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] here (as opposed to a regular [[Legacy:Texture (UT)|Texture (UT)]]).

==Known subclasses ==
* [[Legacy:Screen|Screen]] ([[Legacy:Screen|Screen]])
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]

==Web links ==

[http://www.planetunreal.com/screen/tutorials-misc-scriptedtextures.html Creating custom scripted textures]</text>
    </revision>
    <revision>
      <id>1997</id>
      <timestamp>2006-01-02T18:20:41Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; ClientScriptedTexture (Package: )}}

''ClientScriptedTexture'' is a convenient (though technically unnecessary) base class for all actors that solely implement functionality to draw dynamic content on [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]]s.

Other actors (some [[Legacy:Weapon (UT)|Weapon (UT)]]s and the [[Legacy:HeroStatue|HeroStatue]], for instance) implement the same functionality without being derived from ClientScriptedTexture.

==Properties==

===ScriptedTexture===
: Specifies the [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] that is drawn on.  Note that despite this property accepting regular [[Legacy:Texture (UT)|Texture (UT)]]s, the ClientScriptedTexture won't work (at all) unless you actually provide a [[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]] here (as opposed to a regular [[Legacy:Texture (UT)|Texture (UT)]]).

==Known Subclasses==
* [[Legacy:Screen|Screen]] ([[Legacy:Screen|Screen]])
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]

==External Links==
* [http://www.planetunreal.com/screen/tutorials-misc-scriptedtextures.html Creating custom scripted textures]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Clip</title>
    <id>712</id>
    <revision>
      <id>2062</id>
      <timestamp>2002-07-06T14:05:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:ShellBox|ShellBox]] &gt;&gt; Clip}}

: ''Looking for [[Legacy:Brush Clipping|Brush Clipping]]?''

An ammunition clip for the Enforcer in Unreal.  Contains 20 bullets.</text>
    </revision>
    <revision>
      <id>2063</id>
      <timestamp>2002-05-28T19:07:34Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>Created</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:ShellBox|ShellBox]] &gt;&gt; Clip}}

An ammunition clip for the Enforcer in Unreal.  Contains 20 bullets.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ClipMarker</title>
    <id>724</id>
    <revision>
      <id>2090</id>
      <timestamp>2002-06-24T19:04:17Z</timestamp>
      <contributor>
        <ip>Du-004-0015.claranet.co.uk</ip>
      </contributor>
      <comment>Clip Marker Explanation</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; ClipMarker}}

A clip marker is a class used by the editor to define the line or plane along which a brush is clipped.

See [[Legacy:Brush_Clipping|Brush_Clipping]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CloudZone</title>
    <id>685</id>
    <revision>
      <id>1998</id>
      <timestamp>2007-08-16T17:54:21Z</timestamp>
      <contributor>
        <ip>C951b8f0.virtua.com.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; CloudZone}}

A cloud [[Legacy:Zone|zone]] kills [[Legacy:Pawn (UT)|Pawn (UT)]]s and destroys other [[Legacy:Actor|Actor]]s which enter the [[Legacy:Zone|zone]]. In most cases the cloud [[Legacy:Zone|zone]] is used to destroy [[Legacy:Projectile (UT)|Projectile (UT)]]s before they hit a fake backdrop.

'''Extreme''' care must be taken to make sure in CTF or other games in which there is a moving actor that is needed in the game to make sure that it never comes in contact with a CloudZone. In the case of a flag, it is removed from the game and one team can't pick up, the other can't finish the cap, and, well, the game essentially dies. Test and retest this.

Also, keep in mind that a CloudZone kills spectators/players ghosting too! This can be both extremely annoying and ruinous to a map's desirability. In general, some kind of zone (a [[Legacy:VacuumZone|VacuumZone]] for instance), should be placed to block off the CloudZone.

&lt;uscript&gt;
class CloudZone extends ZoneInfo;

event ActorEntered( actor Other )
{
  if ( Other.IsA('Pawn') )
    Pawn(Other).Died(Pawn(Other).Enemy, 'Fell', Location);
  else		
    Other.Destroy();
}

defaultproperties
{
}
&lt;/uscript&gt;

==Comments==

'''Raven:''' You can also look at [[Legacy:MCloudZone|MCloudZone]] class to override disappearing flag in CTF.

'''Tester:''' As a workaround for cloudzones killing spectators and redeemer's hitting the sky and exploding try this: Replace the cloudzone with a warpzone, if needed make the &quot;other side&quot; of the warpzone a pain zone. Make the warpzone portal visible and fakebackdrop, projectiles should now explode away from the player's play zone and spectators can safely go in and out without dieing.</text>
    </revision>
    <revision>
      <id>1999</id>
      <timestamp>2005-04-05T09:47:52Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; CloudZone}}

A cloud [[Legacy:Zone|zone]] kills [[Legacy:Pawn (UT)|Pawn (UT)]]s and destroys other [[Legacy:Actor|Actor]]s which enter the [[Legacy:Zone|zone]]. In most cases the cloud [[Legacy:Zone|zone]] is used to destroy [[Legacy:Projectile (UT)|Projectile (UT)]]s before they hit a fake backdrop.

'''Extreme''' care must be taken to make sure in CTF or other games in which there is a moving actor that is needed in the game to make sure that it never comes in contact with a CloudZone. In the case of a flag, it is removed from the game and one team can't pick up, the other can't finish the cap, and, well, the game essentially dies. Test and retest this.

Also, keep in mind that a CloudZone kills spectators/players ghosting too! This can be both extremely annoying and ruinous to a map's desirability. In general, some kind of zone (a [[Legacy:VacuumZone|VacuumZone]] for instance), should be placed to block off the CloudZone.

&lt;uscript&gt;
class CloudZone extends ZoneInfo;

event ActorEntered( actor Other )
{
  if ( Other.IsA('Pawn') )
    Pawn(Other).Died(Pawn(Other).Enemy, 'Fell', Location);
  else		
    Other.Destroy();
}

defaultproperties
{
}
&lt;/uscript&gt;

==Comments==

'''Raven:''' You can also look at [[Legacy:MCloudZone|MCloudZone]] class to override disappearing flag in CTF.</text>
    </revision>
    <revision>
      <id>2000</id>
      <timestamp>2007-08-16T17:52:20Z</timestamp>
      <contributor>
        <ip>C951b8f0.virtua.com.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; CloudZone}}

A cloud [[Legacy:Zone|zone]] kills [[Legacy:Pawn (UT)|Pawn (UT)]]s and destroys other [[Legacy:Actor|Actor]]s which enter the [[Legacy:Zone|zone]]. In most cases the cloud [[Legacy:Zone|zone]] is used to destroy [[Legacy:Projectile (UT)|Projectile (UT)]]s before they hit a fake backdrop.

'''Extreme''' care must be taken to make sure in CTF or other games in which there is a moving actor that is needed in the game to make sure that it never comes in contact with a CloudZone. In the case of a flag, it is removed from the game and one team can't pick up, the other can't finish the cap, and, well, the game essentially dies. Test and retest this.

Also, keep in mind that a CloudZone kills spectators/players ghosting too! This can be both extremely annoying and ruinous to a map's desirability. In general, some kind of zone (a [[Legacy:VacuumZone|VacuumZone]] for instance), should be placed to block off the CloudZone.

&lt;uscript&gt;
class CloudZone extends ZoneInfo;

event ActorEntered( actor Other )
{
  if ( Other.IsA('Pawn') )
    Pawn(Other).Died(Pawn(Other).Enemy, 'Fell', Location);
  else		
    Other.Destroy();
}

defaultproperties
{
}
&lt;/uscript&gt;

==Comments==

'''Raven:''' You can also look at [[Legacy:MCloudZone|MCloudZone]] class to override disappearing flag in CTF.

'''Tester:''' As a workaround for cloudzones killing spectators and redeemer's explosion try this: Replace the cloudzone with a warpzone, if needed make the &quot;other side&quot; of the warpzone a pain zone.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Code Optimization</title>
    <id>883</id>
    <revision>
      <id>2447</id>
      <timestamp>2008-01-19T08:40:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>nope, won't help much</comment>
      <text xml:space="preserve">If your code runs slow or causes hitches on some computers, here are several '''optimization techniques''' you can apply to your code to make it run better.

==You might be looking for...==
* [[Legacy:Map Optimization|Map Optimization]]

==Keep the log clean==

Every line that is written to the log file takes time.  Writing lots of them to the log may slow down your mod to a crawl and can inflate the game's log to several megabytes after a short time already.

; Fix &lt;i&gt;Accessed None&lt;/i&gt; and other log warnings : Fix all ''Accessed None'' and other [[Legacy:Log Warnings|log warnings]] you find in the log after executing your mod.  (You can safely assume that your code is responsible for any script warning you find in the log after executing it, even those that point to somewhere in Epic's code.  Compare with the log when not playing your mod if in doubt.)

; Remove debug logging : Make sure to remove any debugging log statements in release versions of your mods.  If you think you may need the log statements in future again, just comment them out.

==Avoid iterators==

Avoid using any [[Legacy:Iterator|iterator]]s in frequently executed functions like &lt;code&gt;Tick&lt;/code&gt; or &lt;code&gt;PostRender&lt;/code&gt; because they are, for the most part, extremely slow.

Instead try using [[Legacy:Linked List|linked list]]s or [[Legacy:Dynamic Array|dynamic array]]s for the actors you work with. You could either fill these at the start of the match, e.g. with a single iterator loop, or maintain the list when spawning and destroying actors like the [[Legacy:SpawnNotify|SpawnNotify]] in UT or the [[Legacy:Interaction|Interaction]] lists maintained by the [[Legacy:InteractionMaster|InteractionMaster]] in UT2003.

==Optimize iterator use==

If you can't avoid using them, at least try to optimize them.

VisibleActors and VisibleCollidingActors are good examples of this. Every actor that is within the radius has a FastTrace called on it. Traces use a lot of CPU resources and if the radius is large you will be calling a lot of traces. You can spare yourself some traces by checking anything else than needs to be checked on top of the trace first.

For example, if you are looking for all visible pawns within 2000 units that have over 50 health, we can check the health before we check the trace &amp;ndash; that way we don't bother doing the expensive visibility check if it was going to fail the health check anyway. For example:

&lt;uscript&gt;
// this way is slow

foreach VisibleActors(class'Pawn', P, Radius, Location, True)
  if (P.Health &gt; 50)
    // do something

// this way is faster
foreach RadiusActors(class'Pawn', P, Radius, Location, True)
  if (P.Health &gt; 50 &amp;&amp; FastTrace(P.Location, Location))
    // do something
&lt;/uscript&gt;

Another example of an even slower implementation that needs to check all actors, not just Pawns:

&lt;uscript&gt;
foreach VisibleCollidingActors(class'Actor', thisActor, Radius, Location)
{
    if (thisActor.bStatic || thisActor.Physics == PHYS_None)
        continue;  // skip this actor
    // do the actual stuff
}
&lt;/uscript&gt;

Within a radius of e.g. 1500 you could easily find over 300 actors. The loop will execute a FastTrace (see [[Legacy:Actor/Methods|Actor/Methods]]) for every single actor in the collision hash within the specified area. However, a lot of those actors are most probably static and/or have &lt;code&gt;Physics == None&lt;/code&gt;. FastTrace requires much more time than the checks used within the loop, but those checks would catch almost as many actors. A simple optimization would be executing the FastTrace ''after'' the other two checks. This can be done by using the CollidingActors (still faster than RadiusActors with up to 2000 UU radius) iterator instead:

&lt;uscript&gt;
ForEach CollidingActors(class'Actor', thisActor, Radius, Location) {
    if ( thisActor.bStatic || thisActor.Physics == PHYS_None || !FastTrace(Other.Location, Location) )
        continue; // skip this actor

    // do the actual stuff
}
&lt;/uscript&gt;

This will execute much faster, but why?

Imagine those 300 actors, let's say 200-250 of them are StaticMeshes placed in the map. Those are all static actors which will be caught by the first part of the &lt;tt&gt;if&lt;/tt&gt; statement. Some other actors might be e.g. gibs lying on the floor. Those actors have &lt;code&gt;Physics == PHYS_None&lt;/code&gt; and will be caught by the second part of the &lt;tt&gt;if&lt;/tt&gt; statement. Typically over 90% of the actors will ''fail'' to pass those first two tests, leaving only about 30 actors for the FastTrace check in this example. This means we only have to do 30 FastTraces instead of 300. Now imagine you want to run this loop every Tick. A high number of FastTraces can slow down the game by 50% or even more, while about 10-30 of those Traces can only be noticed by checking the frame rate.

==Disable engine events when you don't need them==

Use the Disable function to deactivate certain engine events when you don't need them.  (That only applies for events you provide an UnrealScript implementation for; if you haven't overwritten an engine event in your class, disabling it makes no difference.)

&lt;uscript&gt;
event PostBeginPlay
{
    // all events are enabled by default, so disable Tick event to start with
    Disable('Tick');
}

event Trigger(Actor Sender, Pawn Instigator)
{
    // tell engine to call Tick event from now on
    Enable('Tick');
}

event Tick(float DeltaTime)
{
    // do something -- executed only after the actor has been triggered
}
&lt;/uscript&gt;

Using Disable and Enable is more efficient than using a bool variable and doing an UnrealScript-level check in the Tick function.  (And it's more elegant as well.)

==Re-use objects==

[[Legacy:Creating Actors And Objects|Creating actors and objects]] is a relatively expensive operation.  If you can, design your code so that you spawn an actor or object you need only once, save a reference to it and use it later again.

The [[Legacy:Object Pool|object pool]] makes re-using non-Actor objects convenient and straightforward:  ''Allocating'' an object of a given class either takes an existing one from the pool or automatically creates a new one if none exists yet; ''freeing'' an object doesn't destroy it but puts it into the pool.

==Precache materials and static meshes==

Precache any new materials or static meshes you use to avoid hitches when they're displayed the first time.  Overwrite the UpdatePrecacheMaterials and UpdatePrecacheStaticMeshes functions (defined in [[Legacy:Actor|Actor]]) to do that:

&lt;uscript&gt;
simulated function UpdatePrecacheMaterials()
{
    Super.UpdatePrecacheMaterials();
    Level.AddPrecacheMaterial(Texture'MyUserInterfaceTexture');  // hard-coded texture reference
    Level.AddPrecacheMaterial(MapperSpecifiedMaterial);          // specified by mapper in UnrealEd
}

simulated function UpdatePrecacheStaticMeshes()
{
    Super.UpdatePrecacheStaticMeshes();
    Level.AddPrecacheStaticMesh(StaticMesh'MyStaticMesh');
}
&lt;/uscript&gt;

==Optimize expressions==

Place operators in an optimized order &amp;ndash; this seems trivial but can be important for things that get called a lot, especially for replication statements.

Expressions in UnrealScript will terminate prematurely if applicable, so you can take advantage of this. Similar to the optimizations for iterators, if using &quot;or&quot; expressions, evaluate the most likely or least expensive things first. That way, if it is true, it doesn't have to waste time on things that usually will be false anyway. If it is an &quot;and&quot; expression, evaluate the least likely thing first &amp;ndash; that way you won't pass one check only to get stopped by the second as often.

The only real exception to this is if it is necessary to avoid ''Accessed None''s &amp;ndash; obviously it's more likely that a [[Legacy:Controller|Controller]]'s [[Legacy:Pawn|Pawn]] will have over 10 health than that a controller will not have a pawn at all, but for obvious reasons you need to confirm that the controller has a pawn before attempting to read a variable from it.

==Avoid Nesting functions==

Although it seems like it would use less memory to nest function calls, I've timed different variations on nested and non-nested calls, and a non-nested call consistently ran at '''''twice''''' the speed as a nested one:

&lt;uscript&gt;
// Runs relatively slow.
function int NestedFunction()
{
  return DoSomething( DoSomethingElse( DoEvenMore( 5 ) ) );
};

// Runs WAY faster.
function AFunction()
{
  local int Value;

  Value = DoEvenMore( 5 );
  Value = DoSomethingElse( Value );
  return DoSomething( Value );
};
&lt;/uscript&gt;

I suspect this is an indication that the interpreter's &quot;stack&quot; is not used very efficiently.

'''Switch:''' With relatively simple functions I noticed something opposite - NestedFunction() was faster by about 10%. With relatively large functions I couldn't measure the difference. I was testing with stopwatch() in build 3355 commandlet.&lt;br /&gt;Can someone post an example where the nested function calls are noticeably slower? 

==Use native functionality instead of UnrealScript code==

Use native functions instead of scripted ones whenever possible.

UnrealScript runs a lot slower than the native functions do &amp;ndash; it's usually better to use a native function instead of writing your own, even if the native function does a bunch of stuff you don't need. The wasted functionality is nothing compared to the added speed of native functions.

==Execute code only as often as needed==

Timeslicing less important calls in Tick or Timer can increase speed.

You could, for instance, use a boolean variable and store the previous deltatime so that a less critical function can be called only half the time, with the cumulative deltatime. You can also use an incrementing integer and a cumulative Deltatime float to call functions even less often. This makes the program look more complicated, unfortunately, but can decrease the strain on the CPU.

'''EntropicLqd:''' Under those circumstances couldn't you use the SetTimer(..) function to reduce the number of times the Timer() function is called?

'''Foxpaw:''' Yes, but you only have one Timer. If a superclass uses it you won't be able to use it unless your timing needs are the exact same as those of the superclass. Furthermore, you can only use it for one thing then. Say, for instance, you wanted to make your own physics system. You wanted to update location every tick, velocity every 3 ticks, and rotation every 5 ticks. Furthermore, you want to check collision only every 13 ticks. This would be a bit difficult to do in Timer.

==Find bottlenecks by measuring execution time==

You can use the Clock and UnClock functions (defined in [[Legacy:Actor|Actor]], moved to [[Legacy:Object|Object]] for DeusEx) to measure the time a part of your code spends executing, in milliseconds.  Use this to find the sections of your code that require performance optimzation most urgently, and to compare different ways of doing something performance-wise.

&lt;uscript&gt;
function MyFunction()
{
    local float ExecutionTime;

    Clock(ExecutionTime);
    // do something
    UnClock(ExecutionTime);


    Log(&quot;Time spent executing something:&quot; @ ExecutionTime @ &quot;ms&quot;);
}
&lt;/uscript&gt;

Clock is a very useful function when you know exactly what you want to measure. It is also handy because it returns the elapsed time to you, so you can use it to take averages, etc. You could also even use it for some kind of gameplay timer, though it sometimes &quot;rolls over&quot; which might not make it the best for that.

Clock uses CPU cycles rather than actual time. In most engines the script equivalent of clock\unclock automatically converts the value to seconds rather than CPU cycles. However you should never use clock\unclock for actual timing perposes, only use it for local performance testing (e.g. in case you change an algorithm and want to test if it's better or worse). CPU cycles roll over very often, thus it's useless for longer periods (a second is too much). Because of the over rolling the result after &lt;code&gt;UnClock&lt;/code&gt; might be incorrect, so when you use it perform the test multiple times to get a proper value.

If you want to test a lot of code, adding a lot of clock, unclock, and log statements can be tedious. Enter Stopwatch. Stopwatch is a much more powerful function than Clock, but works very differently. The stopwatch is global, and it's either &quot;on&quot; or &quot;off.&quot;

StopWatch( false ); starts the stopwatch. StopWatch( true ); disables and resets the timer. When you stop the timer, a line will be printed in the log stating something like: Time=41.768ms. This is the time that the stopwatch was at when it was stopped. This makes it appear to be very much like clock.. but the log statement that shows the stop time is not what you can really do with StopWatch.

The magic of stopwatch is that when it is running it timestamps log entries. Each is stamped with the time elapsed since the timer was started. It is great for finding out the time taken throughout a function, without writing a veritable pile of clock and unclock statements, as well as adding temporary variables for them, and the works! But I digress. Here's an example:

&lt;uscript&gt;

function SuperFantasticFunction()
{
  local int i;

  StopWatch( false );

  log( &quot;Beginning Execution&quot; );
  // ... some code goes here ...
  log( &quot;Initialization Complete&quot; );
  // ... more code ...
  log( &quot;Precomputation Complete&quot; );
  // ... yet more code ...
  log( &quot;Entering Loop&quot; );
  for (i=0;i&lt;5;i++)
  {
    // .. something done in a loop
    log( &quot;Iteration &quot;$(i+1) );
  }

  log( &quot;Loop Completed&quot; );
  // ... some finishing code ...
  log( &quot;Function Completed&quot; );

  StopWatch( true );
}
&lt;/uscript&gt;

Produces something like the following in the log: (except stopwatch actually has a few more digits of precision.)

&lt;uscript&gt;
  ScriptLog: 0.00 ms: Beginning Execution 
  ScriptLog: 0.12 ms: Initialization Complete
  ScriptLog: 0.45 ms: Precomputation Complete
  ScriptLog: 0.76 ms: Entering Loop
  ScriptLog: 1.02 ms: Iteration 1 
  ScriptLog: 1.35 ms: Iteration 2
  ScriptLog: 1.68 ms: Iteration 3
  ScriptLog: 1.92 ms: Iteration 4
  ScriptLog: 2.24 ms: Iteration 5
  ScriptLog: 2.24 ms: Loop Completed
  ScriptLog: 3.16 ms: Function Completed
  Time=3.16 ms
&lt;/uscript&gt;

==Unroll your loops==

Setting up a loop can take extra time (especially if Mychaeel is correct and loop iterations are counted).  In some cases, the number of iterations are known, and a loop doesn't need to be used at all:

&lt;uscript&gt;
for (int i = 0; i &lt; 5; i++)
{
    //Some Code.
}
&lt;/uscript&gt;

can be changed to

&lt;uscript&gt;
//Some Code.
//Some Code.
//Some Code.
//Some Code.
//Some Code.
&lt;/uscript&gt;

'''Dante:''' What if the engine doesn't count loop iterations but counts every instruction ? Then you might save 3 called instructions with the unrolled loop. Sometimes it looks very ugly, leaving the for(i=0...5) solution the better one.

'''Sordith:''' We could second guess how the scripting engine works until we fill up the server's hard drive and not really get anywhere.  I ''think'' I tested this one (along with all of the techniques I posted), but I can't remember the results.  I'll test again later and post some sample numbers.  You are correct that sometimes (read most of the time) it looks very ugly, and the time saved during execution may not be worth the time lost when working with the ugly code.  I didn't mention that because the questions of what and when to optimize could easily take it's own page.

==Speed comparison of loops==

Different loops have different overhead times. Lets say we have following situation:

&lt;uscript&gt;
	// data, length = 100
	var array&lt;vector&gt; stuff;								
	
	// code to loop					
	stuff[i] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();	
&lt;/uscript&gt;

An obvious choice is for loop. Lets say that it takes 1 time unit to execute such function. For comparison function with unrolled loop takes 0.66 time units.

&lt;uscript&gt;
	function Test( int n )
	{
		local int i;
		for(i=0; i!=n; ++i)
		{
			stuff[i] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
		}
	}
&lt;/uscript&gt;

While loop takes 0.93 time units. That's probably because the i variable is accessed not three but two times in each loop iteration.

&lt;uscript&gt;
	while( i!=n )
	{
		stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
	}
&lt;/uscript&gt;

Until loop takes 0.90 time units. Equality operator or internal implementation may be faster.

&lt;uscript&gt;
	if( n!=0 )
	{
		do
		{
			stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
		}until( i==n )
	}
&lt;/uscript&gt;

What about a goto loop? 0.93 time units, same as while loop.

&lt;uscript&gt;
	loop:
		if( i!=n )
		{
			stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			goto 'loop';
		}
&lt;/uscript&gt;

The fastest loop I tested was partially unrolled one - 0.76 time units. Choose how many times you want to duplicate the code (4-8 will do), loop couple times so the number of iterations is a multiply of chosen number and run the duplicated code in another loop. 

&lt;uscript&gt;
	local int iterations, modulus;
	
	if( n != 0 )
	{
		modulus = n % 8;
		if( modulus != 0 ) 
		{
			do
			{
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			}
			until( --modulus == 0 )
		}
		
		iterations = n / 8;
		if( iterations != 0 )
		{
			do
			{
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			}
			until( --iterations == 0 )
		}
	}
&lt;/uscript&gt;

==Refine your algorithms==

Different operations take different amounts of time.  Generally speaking, addition, subtraction, assignment, and shifting take small amounts time.  Multiplication takes a slightly longer time, while division takes the most time.  Using floating point numbers also increases execution time.  Integer multiplication and division by powers of 2 can be converted into shifts.  Division by a floating point number can be converted into multiplication by a floating point number (x/0.5 == x * (1/0.5)).

'''Sordith:''' Don't like the way this one reads, but can't seem to spit it out more clearly.

'''Mychaeel:''' I don't believe UnrealScript's compiler optimizes constant subexpressions, so &quot;1/0.5&quot; does probably involve a division at run time.  Also, while you're technically right of course, I don't believe that this technique has ''noticable'' impact on the execution speed of UnrealScript code &amp;ndash; you have to assume that UnrealScript byte code is executed at least one order of magnitude slower than native code, and on top of that every operation in an expression translates to a function call with all of its overhead anyway (instead of being resolved to an inline operation).

'''Sordith:''' This is true.  Optimising outside of a loop will rarely have noticable results.  These techniques should be used where working with a large number of objects, or when doing calculations every frame, and probably not even then unless you need the extra time.

I was thinking more along the lines of:

&lt;uscript&gt;
local float mult = 1/0.5;
for (int i = 0; i &lt; 1000; i++)
{
    a *= mult;
    b *= mult;
    c *= mult;
}
&lt;/uscript&gt;

also, if you want to divide by a constant number, you can change it to multiplication by a constant number without the overhead of the first division or the temp variable.

==The member selection operator has its price==

By member selection operator I mean the dot used to access objects in other objects. Don't forget it's also a function and one that may slow down your calculations quite a lot. If the objects are constant from the loop point of view, you may cache them as mentioned above. You may also try to optimize by using additional calculations instead of the member selection operator.

In following example the member selection operator is used 900 times. Let's say that execution of this function took 1 time unit.

&lt;uscript&gt;
	var vector stuff[100];
	
	function Test( vector v )
	{
		local int i;
		for(i=0; i&lt;100; ++i)
		{	
			stuff[i].x = v.x + v.x*(FRand()-0.5);
			stuff[i].y = v.y + v.y*(FRand()-0.6);
			stuff[i].z = v.x + v.z*(FRand()-0.7);
		}	
	}
&lt;/uscript&gt;

Let's eliminate 600 uses of member selection operator (v members) by adding 3 local variables, 3 assignments, and 3 uses of member selection operator. At this point it takes 0.6 time units to execute the function.&lt;br /&gt;The remaining 300 uses of member selection operator (stuff[i] members) can be eliminated by adding 300 multiplications by vector and 200 vector additions. After this optimization the execution time is 0.39 time units. That's over 2.5 times faster than the original example.

&lt;uscript&gt;
	function Test( vector v )
	{
		local int i;
		local float vx,vy,vz;
			
		vx=v.x;
		vy=v.y;
		vz=v.z;
		
		for(i=0; i&lt;100; ++i)
		{	
			stuff[i] = vect(1,0,0) * (vx + vx*(FRand()-0.5))
					 + vect(0,1,0) * (vy + vy*(FRand()-0.6))
					 + vect(0,0,1) * (vz + vz*(FRand()-0.7));
		}
	}
&lt;/uscript&gt;

==Be careful with temporary variables==

First of all, you should remove all unused variables from your functions. (The UT200x compiler will warn you about unused local variables.) They slightly increase package size and whether they also affect execution speed is yet to be proven. They definately make your code harder to read if you have lots of them.

Assignment is a pretty expensive operation in UnrealScript compared to reading variable values, especially with structs. If you are working with dynamic arrays and want to move an element to a new position with a higher array index you might come up with a solution similar to this if you are used to languages without dynamic arrays:

&lt;uscript&gt;
function MoveElementUp(int Source, int Destination)
{
  local int i;
  local float tmp;
  
  tmp = MyArray[Source];
  for (i = Source; i &lt; Destination; i++)
    MyArray[i] = MyArray[i + 1];
  MyArray[Destination] = tmp;
}
&lt;/uscript&gt;

Of source, this is a really bad implementation since it completely neglects the features of dynamic arrays. (You might have to use it for static arrays, though.)

A way better solution would be the following:

&lt;uscript&gt;
function MoveElement(int Source, int Destination)
{
  local float tmp;
  
  tmp = MyArray[Source];
  MyArray.Remove(Source, 1);
  MyArray.Insert(Destination, 1)
  MyArray[Destination] = tmp;
}
&lt;/uscript&gt;

This implementation not only works for moving in both directions (up or down), but also completely drops the loop.

There's still a temporary variable though, which requires an additional assignment operation. Let's get rid of that as well:

&lt;uscript&gt;
function MoveElement(int Source, int Destination)
{
  if ( Source &lt; Destination ) {  // move up
    MyArray.Insert(Destination + 1, 1);
    MyArray[Destination + 1] = MyArray[Source];
    MyArray.Remove(Source, 1);
  }
  else if ( Source &gt; Destination ) { // move down
    MyArray.Insert(Destination, 1);
    MyArray[Destination] = MyArray[Source + 1];
    MyArray.Remove(Source + 1, 1);
  }
}
&lt;/uscript&gt;

If the destination has a higher index than the source, the new element needs to be inserted at an index 1 higher than the desired index, because when removing the source element afterwards, all following elements' indices are decreased by 1. In the case of moving the element down, inserting the destination element increases the source element's index by 1.

'''Xian:''' I'll also assume that resetting temporary Object pointers to &quot;None&quot; will also help. Though I am not too sure about how UE handles memory management at such points.

'''Wormbo:''' Like the second paragraph in this section mentions: Assignment is a relatively expensive operation. Local variables (and thus any object references) cease to exist upon returning from the function they are declared in. The UnrealEngine 1 and 2 don't collect garbage at all during gameplay, only when the &quot;Obj Garbage&quot; console command is executed, which in regular gameplay only happens at mapchange and in UT2004 between Onslaught/Assault rounds. I don't think much was changed in UnrealEngine 3, but maybe the garbage collector can run asynchronously now. Anyway, it's probably still not worth the additional execution time to explicitly clear local object references. If you really have to create a lot of objects dynamically, consider using an object pool instead of creating temporary objects every time.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]</text>
    </revision>
    <revision>
      <id>2448</id>
      <timestamp>2008-01-19T07:42:06Z</timestamp>
      <contributor>
        <ip>89.122.244.15</ip>
      </contributor>
      <comment>reset temp vars ?</comment>
      <text xml:space="preserve">If your code runs slow or causes hitches on some computers, here are several '''optimization techniques''' you can apply to your code to make it run better.

==You might be looking for...==
* [[Legacy:Map Optimization|Map Optimization]]

==Keep the log clean==

Every line that is written to the log file takes time.  Writing lots of them to the log may slow down your mod to a crawl and can inflate the game's log to several megabytes after a short time already.

; Fix &lt;i&gt;Accessed None&lt;/i&gt; and other log warnings : Fix all ''Accessed None'' and other [[Legacy:Log Warnings|log warnings]] you find in the log after executing your mod.  (You can safely assume that your code is responsible for any script warning you find in the log after executing it, even those that point to somewhere in Epic's code.  Compare with the log when not playing your mod if in doubt.)

; Remove debug logging : Make sure to remove any debugging log statements in release versions of your mods.  If you think you may need the log statements in future again, just comment them out.

==Avoid iterators==

Avoid using any [[Legacy:Iterator|iterator]]s in frequently executed functions like &lt;code&gt;Tick&lt;/code&gt; or &lt;code&gt;PostRender&lt;/code&gt; because they are, for the most part, extremely slow.

Instead try using [[Legacy:Linked List|linked list]]s or [[Legacy:Dynamic Array|dynamic array]]s for the actors you work with. You could either fill these at the start of the match, e.g. with a single iterator loop, or maintain the list when spawning and destroying actors like the [[Legacy:SpawnNotify|SpawnNotify]] in UT or the [[Legacy:Interaction|Interaction]] lists maintained by the [[Legacy:InteractionMaster|InteractionMaster]] in UT2003.

==Optimize iterator use==

If you can't avoid using them, at least try to optimize them.

VisibleActors and VisibleCollidingActors are good examples of this. Every actor that is within the radius has a FastTrace called on it. Traces use a lot of CPU resources and if the radius is large you will be calling a lot of traces. You can spare yourself some traces by checking anything else than needs to be checked on top of the trace first.

For example, if you are looking for all visible pawns within 2000 units that have over 50 health, we can check the health before we check the trace &amp;ndash; that way we don't bother doing the expensive visibility check if it was going to fail the health check anyway. For example:

&lt;uscript&gt;
// this way is slow

foreach VisibleActors(class'Pawn', P, Radius, Location, True)
  if (P.Health &gt; 50)
    // do something

// this way is faster
foreach RadiusActors(class'Pawn', P, Radius, Location, True)
  if (P.Health &gt; 50 &amp;&amp; FastTrace(P.Location, Location))
    // do something
&lt;/uscript&gt;

Another example of an even slower implementation that needs to check all actors, not just Pawns:

&lt;uscript&gt;
foreach VisibleCollidingActors(class'Actor', thisActor, Radius, Location)
{
    if (thisActor.bStatic || thisActor.Physics == PHYS_None)
        continue;  // skip this actor
    // do the actual stuff
}
&lt;/uscript&gt;

Within a radius of e.g. 1500 you could easily find over 300 actors. The loop will execute a FastTrace (see [[Legacy:Actor/Methods|Actor/Methods]]) for every single actor in the collision hash within the specified area. However, a lot of those actors are most probably static and/or have &lt;code&gt;Physics == None&lt;/code&gt;. FastTrace requires much more time than the checks used within the loop, but those checks would catch almost as many actors. A simple optimization would be executing the FastTrace ''after'' the other two checks. This can be done by using the CollidingActors (still faster than RadiusActors with up to 2000 UU radius) iterator instead:

&lt;uscript&gt;
ForEach CollidingActors(class'Actor', thisActor, Radius, Location) {
    if ( thisActor.bStatic || thisActor.Physics == PHYS_None || !FastTrace(Other.Location, Location) )
        continue; // skip this actor

    // do the actual stuff
}
&lt;/uscript&gt;

This will execute much faster, but why?

Imagine those 300 actors, let's say 200-250 of them are StaticMeshes placed in the map. Those are all static actors which will be caught by the first part of the &lt;tt&gt;if&lt;/tt&gt; statement. Some other actors might be e.g. gibs lying on the floor. Those actors have &lt;code&gt;Physics == PHYS_None&lt;/code&gt; and will be caught by the second part of the &lt;tt&gt;if&lt;/tt&gt; statement. Typically over 90% of the actors will ''fail'' to pass those first two tests, leaving only about 30 actors for the FastTrace check in this example. This means we only have to do 30 FastTraces instead of 300. Now imagine you want to run this loop every Tick. A high number of FastTraces can slow down the game by 50% or even more, while about 10-30 of those Traces can only be noticed by checking the frame rate.

==Disable engine events when you don't need them==

Use the Disable function to deactivate certain engine events when you don't need them.  (That only applies for events you provide an UnrealScript implementation for; if you haven't overwritten an engine event in your class, disabling it makes no difference.)

&lt;uscript&gt;
event PostBeginPlay
{
    // all events are enabled by default, so disable Tick event to start with
    Disable('Tick');
}

event Trigger(Actor Sender, Pawn Instigator)
{
    // tell engine to call Tick event from now on
    Enable('Tick');
}

event Tick(float DeltaTime)
{
    // do something -- executed only after the actor has been triggered
}
&lt;/uscript&gt;

Using Disable and Enable is more efficient than using a bool variable and doing an UnrealScript-level check in the Tick function.  (And it's more elegant as well.)

==Re-use objects==

[[Legacy:Creating Actors And Objects|Creating actors and objects]] is a relatively expensive operation.  If you can, design your code so that you spawn an actor or object you need only once, save a reference to it and use it later again.

The [[Legacy:Object Pool|object pool]] makes re-using non-Actor objects convenient and straightforward:  ''Allocating'' an object of a given class either takes an existing one from the pool or automatically creates a new one if none exists yet; ''freeing'' an object doesn't destroy it but puts it into the pool.

==Precache materials and static meshes==

Precache any new materials or static meshes you use to avoid hitches when they're displayed the first time.  Overwrite the UpdatePrecacheMaterials and UpdatePrecacheStaticMeshes functions (defined in [[Legacy:Actor|Actor]]) to do that:

&lt;uscript&gt;
simulated function UpdatePrecacheMaterials()
{
    Super.UpdatePrecacheMaterials();
    Level.AddPrecacheMaterial(Texture'MyUserInterfaceTexture');  // hard-coded texture reference
    Level.AddPrecacheMaterial(MapperSpecifiedMaterial);          // specified by mapper in UnrealEd
}

simulated function UpdatePrecacheStaticMeshes()
{
    Super.UpdatePrecacheStaticMeshes();
    Level.AddPrecacheStaticMesh(StaticMesh'MyStaticMesh');
}
&lt;/uscript&gt;

==Optimize expressions==

Place operators in an optimized order &amp;ndash; this seems trivial but can be important for things that get called a lot, especially for replication statements.

Expressions in UnrealScript will terminate prematurely if applicable, so you can take advantage of this. Similar to the optimizations for iterators, if using &quot;or&quot; expressions, evaluate the most likely or least expensive things first. That way, if it is true, it doesn't have to waste time on things that usually will be false anyway. If it is an &quot;and&quot; expression, evaluate the least likely thing first &amp;ndash; that way you won't pass one check only to get stopped by the second as often.

The only real exception to this is if it is necessary to avoid ''Accessed None''s &amp;ndash; obviously it's more likely that a [[Legacy:Controller|Controller]]'s [[Legacy:Pawn|Pawn]] will have over 10 health than that a controller will not have a pawn at all, but for obvious reasons you need to confirm that the controller has a pawn before attempting to read a variable from it.

==Avoid Nesting functions==

Although it seems like it would use less memory to nest function calls, I've timed different variations on nested and non-nested calls, and a non-nested call consistently ran at '''''twice''''' the speed as a nested one:

&lt;uscript&gt;
// Runs relatively slow.
function int NestedFunction()
{
  return DoSomething( DoSomethingElse( DoEvenMore( 5 ) ) );
};

// Runs WAY faster.
function AFunction()
{
  local int Value;

  Value = DoEvenMore( 5 );
  Value = DoSomethingElse( Value );
  return DoSomething( Value );
};
&lt;/uscript&gt;

I suspect this is an indication that the interpreter's &quot;stack&quot; is not used very efficiently.

'''Switch:''' With relatively simple functions I noticed something opposite - NestedFunction() was faster by about 10%. With relatively large functions I couldn't measure the difference. I was testing with stopwatch() in build 3355 commandlet.&lt;br /&gt;Can someone post an example where the nested function calls are noticeably slower? 

==Use native functionality instead of UnrealScript code==

Use native functions instead of scripted ones whenever possible.

UnrealScript runs a lot slower than the native functions do &amp;ndash; it's usually better to use a native function instead of writing your own, even if the native function does a bunch of stuff you don't need. The wasted functionality is nothing compared to the added speed of native functions.

==Execute code only as often as needed==

Timeslicing less important calls in Tick or Timer can increase speed.

You could, for instance, use a boolean variable and store the previous deltatime so that a less critical function can be called only half the time, with the cumulative deltatime. You can also use an incrementing integer and a cumulative Deltatime float to call functions even less often. This makes the program look more complicated, unfortunately, but can decrease the strain on the CPU.

'''EntropicLqd:''' Under those circumstances couldn't you use the SetTimer(..) function to reduce the number of times the Timer() function is called?

'''Foxpaw:''' Yes, but you only have one Timer. If a superclass uses it you won't be able to use it unless your timing needs are the exact same as those of the superclass. Furthermore, you can only use it for one thing then. Say, for instance, you wanted to make your own physics system. You wanted to update location every tick, velocity every 3 ticks, and rotation every 5 ticks. Furthermore, you want to check collision only every 13 ticks. This would be a bit difficult to do in Timer.

==Find bottlenecks by measuring execution time==

You can use the Clock and UnClock functions (defined in [[Legacy:Actor|Actor]], moved to [[Legacy:Object|Object]] for DeusEx) to measure the time a part of your code spends executing, in milliseconds.  Use this to find the sections of your code that require performance optimzation most urgently, and to compare different ways of doing something performance-wise.

&lt;uscript&gt;
function MyFunction()
{
    local float ExecutionTime;

    Clock(ExecutionTime);
    // do something
    UnClock(ExecutionTime);


    Log(&quot;Time spent executing something:&quot; @ ExecutionTime @ &quot;ms&quot;);
}
&lt;/uscript&gt;

Clock is a very useful function when you know exactly what you want to measure. It is also handy because it returns the elapsed time to you, so you can use it to take averages, etc. You could also even use it for some kind of gameplay timer, though it sometimes &quot;rolls over&quot; which might not make it the best for that.

Clock uses CPU cycles rather than actual time. In most engines the script equivalent of clock\unclock automatically converts the value to seconds rather than CPU cycles. However you should never use clock\unclock for actual timing perposes, only use it for local performance testing (e.g. in case you change an algorithm and want to test if it's better or worse). CPU cycles roll over very often, thus it's useless for longer periods (a second is too much). Because of the over rolling the result after &lt;code&gt;UnClock&lt;/code&gt; might be incorrect, so when you use it perform the test multiple times to get a proper value.

If you want to test a lot of code, adding a lot of clock, unclock, and log statements can be tedious. Enter Stopwatch. Stopwatch is a much more powerful function than Clock, but works very differently. The stopwatch is global, and it's either &quot;on&quot; or &quot;off.&quot;

StopWatch( false ); starts the stopwatch. StopWatch( true ); disables and resets the timer. When you stop the timer, a line will be printed in the log stating something like: Time=41.768ms. This is the time that the stopwatch was at when it was stopped. This makes it appear to be very much like clock.. but the log statement that shows the stop time is not what you can really do with StopWatch.

The magic of stopwatch is that when it is running it timestamps log entries. Each is stamped with the time elapsed since the timer was started. It is great for finding out the time taken throughout a function, without writing a veritable pile of clock and unclock statements, as well as adding temporary variables for them, and the works! But I digress. Here's an example:

&lt;uscript&gt;

function SuperFantasticFunction()
{
  local int i;

  StopWatch( false );

  log( &quot;Beginning Execution&quot; );
  // ... some code goes here ...
  log( &quot;Initialization Complete&quot; );
  // ... more code ...
  log( &quot;Precomputation Complete&quot; );
  // ... yet more code ...
  log( &quot;Entering Loop&quot; );
  for (i=0;i&lt;5;i++)
  {
    // .. something done in a loop
    log( &quot;Iteration &quot;$(i+1) );
  }

  log( &quot;Loop Completed&quot; );
  // ... some finishing code ...
  log( &quot;Function Completed&quot; );

  StopWatch( true );
}
&lt;/uscript&gt;

Produces something like the following in the log: (except stopwatch actually has a few more digits of precision.)

&lt;uscript&gt;
  ScriptLog: 0.00 ms: Beginning Execution 
  ScriptLog: 0.12 ms: Initialization Complete
  ScriptLog: 0.45 ms: Precomputation Complete
  ScriptLog: 0.76 ms: Entering Loop
  ScriptLog: 1.02 ms: Iteration 1 
  ScriptLog: 1.35 ms: Iteration 2
  ScriptLog: 1.68 ms: Iteration 3
  ScriptLog: 1.92 ms: Iteration 4
  ScriptLog: 2.24 ms: Iteration 5
  ScriptLog: 2.24 ms: Loop Completed
  ScriptLog: 3.16 ms: Function Completed
  Time=3.16 ms
&lt;/uscript&gt;

==Unroll your loops==

Setting up a loop can take extra time (especially if Mychaeel is correct and loop iterations are counted).  In some cases, the number of iterations are known, and a loop doesn't need to be used at all:

&lt;uscript&gt;
for (int i = 0; i &lt; 5; i++)
{
    //Some Code.
}
&lt;/uscript&gt;

can be changed to

&lt;uscript&gt;
//Some Code.
//Some Code.
//Some Code.
//Some Code.
//Some Code.
&lt;/uscript&gt;

'''Dante:''' What if the engine doesn't count loop iterations but counts every instruction ? Then you might save 3 called instructions with the unrolled loop. Sometimes it looks very ugly, leaving the for(i=0...5) solution the better one.

'''Sordith:''' We could second guess how the scripting engine works until we fill up the server's hard drive and not really get anywhere.  I ''think'' I tested this one (along with all of the techniques I posted), but I can't remember the results.  I'll test again later and post some sample numbers.  You are correct that sometimes (read most of the time) it looks very ugly, and the time saved during execution may not be worth the time lost when working with the ugly code.  I didn't mention that because the questions of what and when to optimize could easily take it's own page.

==Speed comparison of loops==

Different loops have different overhead times. Lets say we have following situation:

&lt;uscript&gt;
	// data, length = 100
	var array&lt;vector&gt; stuff;								
	
	// code to loop					
	stuff[i] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();	
&lt;/uscript&gt;

An obvious choice is for loop. Lets say that it takes 1 time unit to execute such function. For comparison function with unrolled loop takes 0.66 time units.

&lt;uscript&gt;
	function Test( int n )
	{
		local int i;
		for(i=0; i!=n; ++i)
		{
			stuff[i] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
		}
	}
&lt;/uscript&gt;

While loop takes 0.93 time units. That's probably because the i variable is accessed not three but two times in each loop iteration.

&lt;uscript&gt;
	while( i!=n )
	{
		stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
	}
&lt;/uscript&gt;

Until loop takes 0.90 time units. Equality operator or internal implementation may be faster.

&lt;uscript&gt;
	if( n!=0 )
	{
		do
		{
			stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
		}until( i==n )
	}
&lt;/uscript&gt;

What about a goto loop? 0.93 time units, same as while loop.

&lt;uscript&gt;
	loop:
		if( i!=n )
		{
			stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			goto 'loop';
		}
&lt;/uscript&gt;

The fastest loop I tested was partially unrolled one - 0.76 time units. Choose how many times you want to duplicate the code (4-8 will do), loop couple times so the number of iterations is a multiply of chosen number and run the duplicated code in another loop. 

&lt;uscript&gt;
	local int iterations, modulus;
	
	if( n != 0 )
	{
		modulus = n % 8;
		if( modulus != 0 ) 
		{
			do
			{
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			}
			until( --modulus == 0 )
		}
		
		iterations = n / 8;
		if( iterations != 0 )
		{
			do
			{
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			}
			until( --iterations == 0 )
		}
	}
&lt;/uscript&gt;

==Refine your algorithms==

Different operations take different amounts of time.  Generally speaking, addition, subtraction, assignment, and shifting take small amounts time.  Multiplication takes a slightly longer time, while division takes the most time.  Using floating point numbers also increases execution time.  Integer multiplication and division by powers of 2 can be converted into shifts.  Division by a floating point number can be converted into multiplication by a floating point number (x/0.5 == x * (1/0.5)).

'''Sordith:''' Don't like the way this one reads, but can't seem to spit it out more clearly.

'''Mychaeel:''' I don't believe UnrealScript's compiler optimizes constant subexpressions, so &quot;1/0.5&quot; does probably involve a division at run time.  Also, while you're technically right of course, I don't believe that this technique has ''noticable'' impact on the execution speed of UnrealScript code &amp;ndash; you have to assume that UnrealScript byte code is executed at least one order of magnitude slower than native code, and on top of that every operation in an expression translates to a function call with all of its overhead anyway (instead of being resolved to an inline operation).

'''Sordith:''' This is true.  Optimising outside of a loop will rarely have noticable results.  These techniques should be used where working with a large number of objects, or when doing calculations every frame, and probably not even then unless you need the extra time.

I was thinking more along the lines of:

&lt;uscript&gt;
local float mult = 1/0.5;
for (int i = 0; i &lt; 1000; i++)
{
    a *= mult;
    b *= mult;
    c *= mult;
}
&lt;/uscript&gt;

also, if you want to divide by a constant number, you can change it to multiplication by a constant number without the overhead of the first division or the temp variable.

==The member selection operator has its price==

By member selection operator I mean the dot used to access objects in other objects. Don't forget it's also a function and one that may slow down your calculations quite a lot. If the objects are constant from the loop point of view, you may cache them as mentioned above. You may also try to optimize by using additional calculations instead of the member selection operator.

In following example the member selection operator is used 900 times. Let's say that execution of this function took 1 time unit.

&lt;uscript&gt;
	var vector stuff[100];
	
	function Test( vector v )
	{
		local int i;
		for(i=0; i&lt;100; ++i)
		{	
			stuff[i].x = v.x + v.x*(FRand()-0.5);
			stuff[i].y = v.y + v.y*(FRand()-0.6);
			stuff[i].z = v.x + v.z*(FRand()-0.7);
		}	
	}
&lt;/uscript&gt;

Let's eliminate 600 uses of member selection operator (v members) by adding 3 local variables, 3 assignments, and 3 uses of member selection operator. At this point it takes 0.6 time units to execute the function.&lt;br /&gt;The remaining 300 uses of member selection operator (stuff[i] members) can be eliminated by adding 300 multiplications by vector and 200 vector additions. After this optimization the execution time is 0.39 time units. That's over 2.5 times faster than the original example.

&lt;uscript&gt;
	function Test( vector v )
	{
		local int i;
		local float vx,vy,vz;
			
		vx=v.x;
		vy=v.y;
		vz=v.z;
		
		for(i=0; i&lt;100; ++i)
		{	
			stuff[i] = vect(1,0,0) * (vx + vx*(FRand()-0.5))
					 + vect(0,1,0) * (vy + vy*(FRand()-0.6))
					 + vect(0,0,1) * (vz + vz*(FRand()-0.7));
		}
	}
&lt;/uscript&gt;

==Be careful with temporary variables==

First of all, you should remove all unused variables from your functions. (The UT200x compiler will warn you about unused local variables.) They slightly increase package size and whether they also affect execution speed is yet to be proven. They definately make your code harder to read if you have lots of them.

Assignment is a pretty expensive operation in UnrealScript compared to reading variable values, especially with structs. If you are working with dynamic arrays and want to move an element to a new position with a higher array index you might come up with a solution similar to this if you are used to languages without dynamic arrays:

&lt;uscript&gt;
function MoveElementUp(int Source, int Destination)
{
  local int i;
  local float tmp;
  
  tmp = MyArray[Source];
  for (i = Source; i &lt; Destination; i++)
    MyArray[i] = MyArray[i + 1];
  MyArray[Destination] = tmp;
}
&lt;/uscript&gt;

Of source, this is a really bad implementation since it completely neglects the features of dynamic arrays. (You might have to use it for static arrays, though.)

A way better solution would be the following:

&lt;uscript&gt;
function MoveElement(int Source, int Destination)
{
  local float tmp;
  
  tmp = MyArray[Source];
  MyArray.Remove(Source, 1);
  MyArray.Insert(Destination, 1)
  MyArray[Destination] = tmp;
}
&lt;/uscript&gt;

This implementation not only works for moving in both directions (up or down), but also completely drops the loop.

There's still a temporary variable though, which requires an additional assignment operation. Let's get rid of that as well:

&lt;uscript&gt;
function MoveElement(int Source, int Destination)
{
  if ( Source &lt; Destination ) {  // move up
    MyArray.Insert(Destination + 1, 1);
    MyArray[Destination + 1] = MyArray[Source];
    MyArray.Remove(Source, 1);
  }
  else if ( Source &gt; Destination ) { // move down
    MyArray.Insert(Destination, 1);
    MyArray[Destination] = MyArray[Source + 1];
    MyArray.Remove(Source + 1, 1);
  }
}
&lt;/uscript&gt;

If the destination has a higher index than the source, the new element needs to be inserted at an index 1 higher than the desired index, because when removing the source element afterwards, all following elements' indices are decreased by 1. In the case of moving the element down, inserting the destination element increases the source element's index by 1.

'''Xian:''' I'll also assume that resetting temporary Object pointers to &quot;None&quot; will also help. Though I am not too sure about how UE handles memory management at such points.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]</text>
    </revision>
    <revision>
      <id>34128</id>
      <timestamp>2009-03-19T05:41:57Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <comment>/* Optimize iterator use */</comment>
      <text xml:space="preserve">If your code runs slow or causes hitches on some computers, here are several '''optimization techniques''' you can apply to your code to make it run better.

==You might be looking for...==
* [[Legacy:Map Optimization|Map Optimization]]

==Keep the log clean==

Every line that is written to the log file takes time.  Writing lots of them to the log may slow down your mod to a crawl and can inflate the game's log to several megabytes after a short time already.

; Fix &lt;i&gt;Accessed None&lt;/i&gt; and other log warnings : Fix all ''Accessed None'' and other [[Legacy:Log Warnings|log warnings]] you find in the log after executing your mod.  (You can safely assume that your code is responsible for any script warning you find in the log after executing it, even those that point to somewhere in Epic's code.  Compare with the log when not playing your mod if in doubt.)

; Remove debug logging : Make sure to remove any debugging log statements in release versions of your mods.  If you think you may need the log statements in future again, just comment them out.

==Avoid iterators==

Avoid using any [[Legacy:Iterator|iterator]]s in frequently executed functions like &lt;code&gt;Tick&lt;/code&gt; or &lt;code&gt;PostRender&lt;/code&gt; because they are, for the most part, extremely slow.

Instead try using [[Legacy:Linked List|linked list]]s or [[Legacy:Dynamic Array|dynamic array]]s for the actors you work with. You could either fill these at the start of the match, e.g. with a single iterator loop, or maintain the list when spawning and destroying actors like the [[Legacy:SpawnNotify|SpawnNotify]] in UT or the [[Legacy:Interaction|Interaction]] lists maintained by the [[Legacy:InteractionMaster|InteractionMaster]] in UT2003.

==Optimize iterator use==

If you can't avoid using them, at least try to optimize them.

VisibleActors and VisibleCollidingActors are good examples of this. Every actor that is within the radius has a FastTrace called on it. Traces use a lot of CPU resources and if the radius is large you will be calling a lot of traces. You can spare yourself some traces by checking anything else than needs to be checked on top of the trace first.

For example, if you are looking for all visible pawns within 2000 units that have over 50 health, we can check the health before we check the trace &amp;ndash; that way we don't bother doing the expensive visibility check if it was going to fail the health check anyway. For example:

&lt;uscript&gt;
// this way is slow
foreach VisibleActors(class'Pawn', P, Radius, Location, True)
  if (P.Health &gt; 50)
    // do something

// this way is faster
foreach RadiusActors(class'Pawn', P, Radius, Location, True)
  if (P.Health &gt; 50 &amp;&amp; FastTrace(P.Location, Location))
    // do something
&lt;/uscript&gt;

Another example of an even slower implementation that needs to check all actors, not just Pawns:

&lt;uscript&gt;
foreach VisibleCollidingActors(class'Actor', thisActor, Radius, Location)
{
    if (thisActor.bStatic || thisActor.Physics == PHYS_None)
        continue;  // skip this actor
    // do the actual stuff
}
&lt;/uscript&gt;

Within a radius of e.g. 1500 you could easily find over 300 actors. The loop will execute a FastTrace (see [[Legacy:Actor/Methods|Actor/Methods]]) for every single actor in the collision hash within the specified area. However, a lot of those actors are most probably static and/or have &lt;code&gt;Physics == None&lt;/code&gt;. FastTrace requires much more time than the checks used within the loop, but those checks would catch almost as many actors. A simple optimization would be executing the FastTrace ''after'' the other two checks. This can be done by using the CollidingActors (still faster than RadiusActors with up to 2000 UU radius) iterator instead:

&lt;uscript&gt;
ForEach CollidingActors(class'Actor', thisActor, Radius, Location) {
    if ( thisActor.bStatic || thisActor.Physics == PHYS_None || !FastTrace(Other.Location, Location) )
        continue; // skip this actor

    // do the actual stuff
}
&lt;/uscript&gt;

This will execute much faster, but why?

Imagine those 300 actors, let's say 200-250 of them are StaticMeshes placed in the map. Those are all static actors which will be caught by the first part of the &lt;tt&gt;if&lt;/tt&gt; statement. Some other actors might be e.g. gibs lying on the floor. Those actors have &lt;code&gt;Physics == PHYS_None&lt;/code&gt; and will be caught by the second part of the &lt;tt&gt;if&lt;/tt&gt; statement. Typically over 90% of the actors will ''fail'' to pass those first two tests, leaving only about 30 actors for the FastTrace check in this example. This means we only have to do 30 FastTraces instead of 300. Now imagine you want to run this loop every Tick. A high number of FastTraces can slow down the game by 50% or even more, while about 10-30 of those Traces can only be noticed by checking the frame rate.

==Disable engine events when you don't need them==

Use the Disable function to deactivate certain engine events when you don't need them.  (That only applies for events you provide an UnrealScript implementation for; if you haven't overwritten an engine event in your class, disabling it makes no difference.)

&lt;uscript&gt;
event PostBeginPlay
{
    // all events are enabled by default, so disable Tick event to start with
    Disable('Tick');
}

event Trigger(Actor Sender, Pawn Instigator)
{
    // tell engine to call Tick event from now on
    Enable('Tick');
}

event Tick(float DeltaTime)
{
    // do something -- executed only after the actor has been triggered
}
&lt;/uscript&gt;

Using Disable and Enable is more efficient than using a bool variable and doing an UnrealScript-level check in the Tick function.  (And it's more elegant as well.)

==Re-use objects==

[[Legacy:Creating Actors And Objects|Creating actors and objects]] is a relatively expensive operation.  If you can, design your code so that you spawn an actor or object you need only once, save a reference to it and use it later again.

The [[Legacy:Object Pool|object pool]] makes re-using non-Actor objects convenient and straightforward:  ''Allocating'' an object of a given class either takes an existing one from the pool or automatically creates a new one if none exists yet; ''freeing'' an object doesn't destroy it but puts it into the pool.

==Precache materials and static meshes==

Precache any new materials or static meshes you use to avoid hitches when they're displayed the first time.  Overwrite the UpdatePrecacheMaterials and UpdatePrecacheStaticMeshes functions (defined in [[Legacy:Actor|Actor]]) to do that:

&lt;uscript&gt;
simulated function UpdatePrecacheMaterials()
{
    Super.UpdatePrecacheMaterials();
    Level.AddPrecacheMaterial(Texture'MyUserInterfaceTexture');  // hard-coded texture reference
    Level.AddPrecacheMaterial(MapperSpecifiedMaterial);          // specified by mapper in UnrealEd
}

simulated function UpdatePrecacheStaticMeshes()
{
    Super.UpdatePrecacheStaticMeshes();
    Level.AddPrecacheStaticMesh(StaticMesh'MyStaticMesh');
}
&lt;/uscript&gt;

==Optimize expressions==

Place operators in an optimized order &amp;ndash; this seems trivial but can be important for things that get called a lot, especially for replication statements.

Expressions in UnrealScript will terminate prematurely if applicable, so you can take advantage of this. Similar to the optimizations for iterators, if using &quot;or&quot; expressions, evaluate the most likely or least expensive things first. That way, if it is true, it doesn't have to waste time on things that usually will be false anyway. If it is an &quot;and&quot; expression, evaluate the least likely thing first &amp;ndash; that way you won't pass one check only to get stopped by the second as often.

The only real exception to this is if it is necessary to avoid ''Accessed None''s &amp;ndash; obviously it's more likely that a [[Legacy:Controller|Controller]]'s [[Legacy:Pawn|Pawn]] will have over 10 health than that a controller will not have a pawn at all, but for obvious reasons you need to confirm that the controller has a pawn before attempting to read a variable from it.

==Avoid Nesting functions==

Although it seems like it would use less memory to nest function calls, I've timed different variations on nested and non-nested calls, and a non-nested call consistently ran at '''''twice''''' the speed as a nested one:

&lt;uscript&gt;
// Runs relatively slow.
function int NestedFunction()
{
  return DoSomething( DoSomethingElse( DoEvenMore( 5 ) ) );
};

// Runs WAY faster.
function AFunction()
{
  local int Value;

  Value = DoEvenMore( 5 );
  Value = DoSomethingElse( Value );
  return DoSomething( Value );
};
&lt;/uscript&gt;

I suspect this is an indication that the interpreter's &quot;stack&quot; is not used very efficiently.

'''Switch:''' With relatively simple functions I noticed something opposite - NestedFunction() was faster by about 10%. With relatively large functions I couldn't measure the difference. I was testing with stopwatch() in build 3355 commandlet.&lt;br /&gt;Can someone post an example where the nested function calls are noticeably slower? 

==Use native functionality instead of UnrealScript code==

Use native functions instead of scripted ones whenever possible.

UnrealScript runs a lot slower than the native functions do &amp;ndash; it's usually better to use a native function instead of writing your own, even if the native function does a bunch of stuff you don't need. The wasted functionality is nothing compared to the added speed of native functions.

==Execute code only as often as needed==

Timeslicing less important calls in Tick or Timer can increase speed.

You could, for instance, use a boolean variable and store the previous deltatime so that a less critical function can be called only half the time, with the cumulative deltatime. You can also use an incrementing integer and a cumulative Deltatime float to call functions even less often. This makes the program look more complicated, unfortunately, but can decrease the strain on the CPU.

'''EntropicLqd:''' Under those circumstances couldn't you use the SetTimer(..) function to reduce the number of times the Timer() function is called?

'''Foxpaw:''' Yes, but you only have one Timer. If a superclass uses it you won't be able to use it unless your timing needs are the exact same as those of the superclass. Furthermore, you can only use it for one thing then. Say, for instance, you wanted to make your own physics system. You wanted to update location every tick, velocity every 3 ticks, and rotation every 5 ticks. Furthermore, you want to check collision only every 13 ticks. This would be a bit difficult to do in Timer.

==Find bottlenecks by measuring execution time==

You can use the Clock and UnClock functions (defined in [[Legacy:Actor|Actor]], moved to [[Legacy:Object|Object]] for DeusEx) to measure the time a part of your code spends executing, in milliseconds.  Use this to find the sections of your code that require performance optimzation most urgently, and to compare different ways of doing something performance-wise.

&lt;uscript&gt;
function MyFunction()
{
    local float ExecutionTime;

    Clock(ExecutionTime);
    // do something
    UnClock(ExecutionTime);


    Log(&quot;Time spent executing something:&quot; @ ExecutionTime @ &quot;ms&quot;);
}
&lt;/uscript&gt;

Clock is a very useful function when you know exactly what you want to measure. It is also handy because it returns the elapsed time to you, so you can use it to take averages, etc. You could also even use it for some kind of gameplay timer, though it sometimes &quot;rolls over&quot; which might not make it the best for that.

Clock uses CPU cycles rather than actual time. In most engines the script equivalent of clock\unclock automatically converts the value to seconds rather than CPU cycles. However you should never use clock\unclock for actual timing perposes, only use it for local performance testing (e.g. in case you change an algorithm and want to test if it's better or worse). CPU cycles roll over very often, thus it's useless for longer periods (a second is too much). Because of the over rolling the result after &lt;code&gt;UnClock&lt;/code&gt; might be incorrect, so when you use it perform the test multiple times to get a proper value.

If you want to test a lot of code, adding a lot of clock, unclock, and log statements can be tedious. Enter Stopwatch. Stopwatch is a much more powerful function than Clock, but works very differently. The stopwatch is global, and it's either &quot;on&quot; or &quot;off.&quot;

StopWatch( false ); starts the stopwatch. StopWatch( true ); disables and resets the timer. When you stop the timer, a line will be printed in the log stating something like: Time=41.768ms. This is the time that the stopwatch was at when it was stopped. This makes it appear to be very much like clock.. but the log statement that shows the stop time is not what you can really do with StopWatch.

The magic of stopwatch is that when it is running it timestamps log entries. Each is stamped with the time elapsed since the timer was started. It is great for finding out the time taken throughout a function, without writing a veritable pile of clock and unclock statements, as well as adding temporary variables for them, and the works! But I digress. Here's an example:

&lt;uscript&gt;

function SuperFantasticFunction()
{
  local int i;

  StopWatch( false );

  log( &quot;Beginning Execution&quot; );
  // ... some code goes here ...
  log( &quot;Initialization Complete&quot; );
  // ... more code ...
  log( &quot;Precomputation Complete&quot; );
  // ... yet more code ...
  log( &quot;Entering Loop&quot; );
  for (i=0;i&lt;5;i++)
  {
    // .. something done in a loop
    log( &quot;Iteration &quot;$(i+1) );
  }

  log( &quot;Loop Completed&quot; );
  // ... some finishing code ...
  log( &quot;Function Completed&quot; );

  StopWatch( true );
}
&lt;/uscript&gt;

Produces something like the following in the log: (except stopwatch actually has a few more digits of precision.)

&lt;uscript&gt;
  ScriptLog: 0.00 ms: Beginning Execution 
  ScriptLog: 0.12 ms: Initialization Complete
  ScriptLog: 0.45 ms: Precomputation Complete
  ScriptLog: 0.76 ms: Entering Loop
  ScriptLog: 1.02 ms: Iteration 1 
  ScriptLog: 1.35 ms: Iteration 2
  ScriptLog: 1.68 ms: Iteration 3
  ScriptLog: 1.92 ms: Iteration 4
  ScriptLog: 2.24 ms: Iteration 5
  ScriptLog: 2.24 ms: Loop Completed
  ScriptLog: 3.16 ms: Function Completed
  Time=3.16 ms
&lt;/uscript&gt;

==Unroll your loops==

Setting up a loop can take extra time (especially if Mychaeel is correct and loop iterations are counted).  In some cases, the number of iterations are known, and a loop doesn't need to be used at all:

&lt;uscript&gt;
for (int i = 0; i &lt; 5; i++)
{
    //Some Code.
}
&lt;/uscript&gt;

can be changed to

&lt;uscript&gt;
//Some Code.
//Some Code.
//Some Code.
//Some Code.
//Some Code.
&lt;/uscript&gt;

'''Dante:''' What if the engine doesn't count loop iterations but counts every instruction ? Then you might save 3 called instructions with the unrolled loop. Sometimes it looks very ugly, leaving the for(i=0...5) solution the better one.

'''Sordith:''' We could second guess how the scripting engine works until we fill up the server's hard drive and not really get anywhere.  I ''think'' I tested this one (along with all of the techniques I posted), but I can't remember the results.  I'll test again later and post some sample numbers.  You are correct that sometimes (read most of the time) it looks very ugly, and the time saved during execution may not be worth the time lost when working with the ugly code.  I didn't mention that because the questions of what and when to optimize could easily take it's own page.

==Speed comparison of loops==

Different loops have different overhead times. Lets say we have following situation:

&lt;uscript&gt;
	// data, length = 100
	var array&lt;vector&gt; stuff;								
	
	// code to loop					
	stuff[i] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();	
&lt;/uscript&gt;

An obvious choice is for loop. Lets say that it takes 1 time unit to execute such function. For comparison function with unrolled loop takes 0.66 time units.

&lt;uscript&gt;
	function Test( int n )
	{
		local int i;
		for(i=0; i!=n; ++i)
		{
			stuff[i] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
		}
	}
&lt;/uscript&gt;

While loop takes 0.93 time units. That's probably because the i variable is accessed not three but two times in each loop iteration.

&lt;uscript&gt;
	while( i!=n )
	{
		stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
	}
&lt;/uscript&gt;

Until loop takes 0.90 time units. Equality operator or internal implementation may be faster.

&lt;uscript&gt;
	if( n!=0 )
	{
		do
		{
			stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
		}until( i==n )
	}
&lt;/uscript&gt;

What about a goto loop? 0.93 time units, same as while loop.

&lt;uscript&gt;
	loop:
		if( i!=n )
		{
			stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			goto 'loop';
		}
&lt;/uscript&gt;

The fastest loop I tested was partially unrolled one - 0.76 time units. Choose how many times you want to duplicate the code (4-8 will do), loop couple times so the number of iterations is a multiply of chosen number and run the duplicated code in another loop. 

&lt;uscript&gt;
	local int iterations, modulus;
	
	if( n != 0 )
	{
		modulus = n % 8;
		if( modulus != 0 ) 
		{
			do
			{
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			}
			until( --modulus == 0 )
		}
		
		iterations = n / 8;
		if( iterations != 0 )
		{
			do
			{
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
				stuff[i++] = vect(1,0,0)*FRand() + vect(0,1,0)*FRand() + vect(0,0,1)*FRand();
			}
			until( --iterations == 0 )
		}
	}
&lt;/uscript&gt;

==Refine your algorithms==

Different operations take different amounts of time.  Generally speaking, addition, subtraction, assignment, and shifting take small amounts time.  Multiplication takes a slightly longer time, while division takes the most time.  Using floating point numbers also increases execution time.  Integer multiplication and division by powers of 2 can be converted into shifts.  Division by a floating point number can be converted into multiplication by a floating point number (x/0.5 == x * (1/0.5)).

'''Sordith:''' Don't like the way this one reads, but can't seem to spit it out more clearly.

'''Mychaeel:''' I don't believe UnrealScript's compiler optimizes constant subexpressions, so &quot;1/0.5&quot; does probably involve a division at run time.  Also, while you're technically right of course, I don't believe that this technique has ''noticable'' impact on the execution speed of UnrealScript code &amp;ndash; you have to assume that UnrealScript byte code is executed at least one order of magnitude slower than native code, and on top of that every operation in an expression translates to a function call with all of its overhead anyway (instead of being resolved to an inline operation).

'''Sordith:''' This is true.  Optimising outside of a loop will rarely have noticable results.  These techniques should be used where working with a large number of objects, or when doing calculations every frame, and probably not even then unless you need the extra time.

I was thinking more along the lines of:

&lt;uscript&gt;
local float mult = 1/0.5;
for (int i = 0; i &lt; 1000; i++)
{
    a *= mult;
    b *= mult;
    c *= mult;
}
&lt;/uscript&gt;

also, if you want to divide by a constant number, you can change it to multiplication by a constant number without the overhead of the first division or the temp variable.

==The member selection operator has its price==

By member selection operator I mean the dot used to access objects in other objects. Don't forget it's also a function and one that may slow down your calculations quite a lot. If the objects are constant from the loop point of view, you may cache them as mentioned above. You may also try to optimize by using additional calculations instead of the member selection operator.

In following example the member selection operator is used 900 times. Let's say that execution of this function took 1 time unit.

&lt;uscript&gt;
	var vector stuff[100];
	
	function Test( vector v )
	{
		local int i;
		for(i=0; i&lt;100; ++i)
		{	
			stuff[i].x = v.x + v.x*(FRand()-0.5);
			stuff[i].y = v.y + v.y*(FRand()-0.6);
			stuff[i].z = v.x + v.z*(FRand()-0.7);
		}	
	}
&lt;/uscript&gt;

Let's eliminate 600 uses of member selection operator (v members) by adding 3 local variables, 3 assignments, and 3 uses of member selection operator. At this point it takes 0.6 time units to execute the function.&lt;br /&gt;The remaining 300 uses of member selection operator (stuff[i] members) can be eliminated by adding 300 multiplications by vector and 200 vector additions. After this optimization the execution time is 0.39 time units. That's over 2.5 times faster than the original example.

&lt;uscript&gt;
	function Test( vector v )
	{
		local int i;
		local float vx,vy,vz;
			
		vx=v.x;
		vy=v.y;
		vz=v.z;
		
		for(i=0; i&lt;100; ++i)
		{	
			stuff[i] = vect(1,0,0) * (vx + vx*(FRand()-0.5))
					 + vect(0,1,0) * (vy + vy*(FRand()-0.6))
					 + vect(0,0,1) * (vz + vz*(FRand()-0.7));
		}
	}
&lt;/uscript&gt;

==Be careful with temporary variables==

First of all, you should remove all unused variables from your functions. (The UT200x compiler will warn you about unused local variables.) They slightly increase package size and whether they also affect execution speed is yet to be proven. They definately make your code harder to read if you have lots of them.

Assignment is a pretty expensive operation in UnrealScript compared to reading variable values, especially with structs. If you are working with dynamic arrays and want to move an element to a new position with a higher array index you might come up with a solution similar to this if you are used to languages without dynamic arrays:

&lt;uscript&gt;
function MoveElementUp(int Source, int Destination)
{
  local int i;
  local float tmp;
  
  tmp = MyArray[Source];
  for (i = Source; i &lt; Destination; i++)
    MyArray[i] = MyArray[i + 1];
  MyArray[Destination] = tmp;
}
&lt;/uscript&gt;

Of source, this is a really bad implementation since it completely neglects the features of dynamic arrays. (You might have to use it for static arrays, though.)

A way better solution would be the following:

&lt;uscript&gt;
function MoveElement(int Source, int Destination)
{
  local float tmp;
  
  tmp = MyArray[Source];
  MyArray.Remove(Source, 1);
  MyArray.Insert(Destination, 1)
  MyArray[Destination] = tmp;
}
&lt;/uscript&gt;

This implementation not only works for moving in both directions (up or down), but also completely drops the loop.

There's still a temporary variable though, which requires an additional assignment operation. Let's get rid of that as well:

&lt;uscript&gt;
function MoveElement(int Source, int Destination)
{
  if ( Source &lt; Destination ) {  // move up
    MyArray.Insert(Destination + 1, 1);
    MyArray[Destination + 1] = MyArray[Source];
    MyArray.Remove(Source, 1);
  }
  else if ( Source &gt; Destination ) { // move down
    MyArray.Insert(Destination, 1);
    MyArray[Destination] = MyArray[Source + 1];
    MyArray.Remove(Source + 1, 1);
  }
}
&lt;/uscript&gt;

If the destination has a higher index than the source, the new element needs to be inserted at an index 1 higher than the desired index, because when removing the source element afterwards, all following elements' indices are decreased by 1. In the case of moving the element down, inserting the destination element increases the source element's index by 1.

'''Xian:''' I'll also assume that resetting temporary Object pointers to &quot;None&quot; will also help. Though I am not too sure about how UE handles memory management at such points.

'''Wormbo:''' Like the second paragraph in this section mentions: Assignment is a relatively expensive operation. Local variables (and thus any object references) cease to exist upon returning from the function they are declared in. The UnrealEngine 1 and 2 don't collect garbage at all during gameplay, only when the &quot;Obj Garbage&quot; console command is executed, which in regular gameplay only happens at mapchange and in UT2004 between Onslaught/Assault rounds. I don't think much was changed in UnrealEngine 3, but maybe the garbage collector can run asynchronously now. Anyway, it's probably still not worth the additional execution time to explicitly clear local object references. If you really have to create a lot of objects dynamically, consider using an object pool instead of creating temporary objects every time.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Code References</title>
    <id>835</id>
    <revision>
      <id>2339</id>
      <timestamp>2005-12-08T15:10:38Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>I concur</comment>
      <text xml:space="preserve">This is a page for various code references off the UT2003 code.  Any corrections would be helpful. Arrows indicate an Extends relationship with the leftmost class being the parent and subsequent classes being its children.

===XAdmin===

===XEffects===

===XGame===

===XGame_rc===

===XInterface===

===XPickups===

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:TournamentHealth|TournamentHealth]] -&gt; [[Legacy:HealthPack|HealthPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:TournamentHealth|TournamentHealth]] -&gt; [[Legacy:MiniHealthPack|MiniHealthPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:TournamentHealth|TournamentHealth]] -&gt; [[Legacy:SuperHealthPack|SuperHealthPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:AdrenalinePickup|AdrenalinePickup]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:UDamagePack|UDamagePack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:ShieldPickup|ShieldPickup]] -&gt; [[Legacy:ShieldPack|ShieldPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:ShieldPickup|ShieldPickup]] -&gt; [[Legacy:SuperShieldPack|SuperShieldPack]]

===XPickups_rc===

===XWeapons===

====Flak Cannon (UT2003)====

[[Legacy:ProjectileFire|ProjectileFire]] -&gt; [[Legacy:FlakAltFire|FlakAltFire]]

====Minigun (UT2003)====

[[Legacy:Weapon|Weapon]] -&gt; [[Legacy:Minigun|Minigun]]

[[Legacy:UTWeaponPickup|UTWeaponPickup]] -&gt; [[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:InstantFire|InstantFire]] -&gt; [[Legacy:MinigunFire|MinigunFire]] -&gt; [[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:Ammunition|Ammunition]] -&gt; [[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:UTAmmoPickup|UTAmmoPickup]] -&gt; [[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]

[[Legacy:XWeaponAttachment|xWeaponAttachment]] -&gt; [[Legacy:MinigunAttachment|MinigunAttachment]]

===XWeapons_rc===

===XWebAdmin===

===Core===

===Engine===

===Gameplay===

===Vehicles===

===UnrealGame===

==Comments==

'''Dragonmaw:''' I'm gonna try and update this page at least once a week (usually Saturday) with a few more code references.  Any corrections will be helpful.

'''Wormbo:''' I doubt this will help &quot;n00bs who don't want to decompile and figure it out themselves&quot;. UnrealWiki class pages like [[Legacy:Actor|Actor]], [[Legacy:Interaction|Interaction]], [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] or also [[Legacy:Minigun|Minigun]] should contain a list of properties, structs, enums and methods declared and used in that class. Just copying the code is pointless and ineffective, concidering there are over 1300 classes only in UT2003 and the Wiki also describes UT classes. See those other pages for how class pages should look like.

'''Sobiwan:''' Is this supposed to be what  http://unreal.student.utwente.nl/uncodex/ is all about?

'''Wormbo:''' That's just the [[Legacy:UnCodeX|UnCodeX]] output of the UT2003 classes plus El Muerte's own stuff. A wiki class page should look like e.g. [[Legacy:ZoneInfo|ZoneInfo]]. Quoting the code of entire classes isn't useful, even if there are a lot of comments in it.

'''Tarquin:''' All the commented default properties should be listed as properties on the relevant class page. (&quot;AttachLoc&quot; for example. Which class defines this?) It might be useful to have a few commented class scripts as tutorials, but not the whole lot!

'''Dragonmaw:''' Maybe I'm just a bit ambitious.  Besides, I'm bored, and figuring out the code will help me learn UScript.  If you want I won't do all of them, but I plan on doing a few Engine classes.  Sorry if I did something wrong :(

'''RDGDanClark:''' I don't think you did anything wrong... but this &lt;i&gt;is&lt;/i&gt; a bit too much. I think it's a great idea to have heavily commented examples of a few classes from each category, especially weapons and pickups. I respectfully disagree with Wormbo &amp;ndash; when I was first learning to code C++, it helped me immeasurably to have a block of working, heavily commented code to help me trace through the functionality. The only thing that would concern me on a page like this is the likelihood that classes will change with each patch and especially with UT2004. That being the case, each class laid out should have a build number at the top of the page.

'''Dragonmaw:''' I went ahead and cut down the classes to be commented to the main areas people will have difficulty in.  And I have to agree with Clark, commented code really helps along the learning process.

'''Tarquin:''' Could you follow the standard layout for pages named after classes? If it makes the whole page too long, I suggest you put the code analysis at {{classname/script}}

'''RDGDanClark:''' No problem.

'''Tarquin:''' It would be nice to tie this in with the &quot;how stuff works&quot; section on the [[Legacy:UnrealScript|UnrealScript]] page: [[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]. Also, you could make longer comments to the code and take them out of the code, like on [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]].

'''RDGDanClark:''' I think the idea, especially in the case of the weapon examples, is that someone could simply copy/paste the entire block of code, put it into a compliler, and have a working weapon &amp;ndash; one problem I always had with script tutorials is that very often there are bits left out between code blocks that cause the code to fail when compiled. No offense to the author, but the [[Legacy:Creating A New Weapontype|Creating A New Weapontype]] tutorial is rather vague and near impossible to follow for someone new to scripting. By seeing all the original code in one place with heavy comments and notes on how to change it (which is my project for tonight), this could be the perfect newbie weapon tutorial.

'''Tarquin:''' We seem to have  lots of pages which are just script with extra comments. What I think would be more useful would be see single pages that explain things with ''text'' and maybe the odd snip fform the code to illustrate.

'''SuperApe:''' I completely agree.  If you're interested in the '''actual''' code, you'll look at the code in the editor, but for reference, it's much more useful to novices and experts alike to see accurate ''text'' definitions of functions, event and states.  I say keep one or two for explanation purposes (perhaps in the /script subpages?) and convert the rest to English.  BTW, this should've been for UT2004 as well.

'''Sweavo:''' I also agree completely.  Once you know &quot;Don't modify built in packages&quot; and &quot;how to extract the source code&quot; all you need is the how and why, not the what.  A how-oriented page might employ a &quot;Flattened&quot; view of the properties in a class, so an ONSPRV page might include the relevant properties of the superclasses so that players' interactions with the hellbender can be clearly explained.  What would be great would be more examples of flow of control, e.g. an example of what happens when a player hits fire when in a hellbender's rear turret, or what gets called when a vehicle is destroyed or a player walks off the edge of a cliff. I've been meaning to write up vehicle weapon firing for a while now.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2340</id>
      <timestamp>2005-12-05T18:53:17Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a page for various code references off the UT2003 code.  Any corrections would be helpful. Arrows indicate an Extends relationship with the leftmost class being the parent and subsequent classes being its children.

===XAdmin===

===XEffects===

===XGame===

===XGame_rc===

===XInterface===

===XPickups===

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:TournamentHealth|TournamentHealth]] -&gt; [[Legacy:HealthPack|HealthPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:TournamentHealth|TournamentHealth]] -&gt; [[Legacy:MiniHealthPack|MiniHealthPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:TournamentHealth|TournamentHealth]] -&gt; [[Legacy:SuperHealthPack|SuperHealthPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:AdrenalinePickup|AdrenalinePickup]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:UDamagePack|UDamagePack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:ShieldPickup|ShieldPickup]] -&gt; [[Legacy:ShieldPack|ShieldPack]]

[[Legacy:TournamentPickup|TournamentPickup]] -&gt; [[Legacy:ShieldPickup|ShieldPickup]] -&gt; [[Legacy:SuperShieldPack|SuperShieldPack]]

===XPickups_rc===

===XWeapons===

====Flak Cannon (UT2003)====

[[Legacy:ProjectileFire|ProjectileFire]] -&gt; [[Legacy:FlakAltFire|FlakAltFire]]

====Minigun (UT2003)====

[[Legacy:Weapon|Weapon]] -&gt; [[Legacy:Minigun|Minigun]]

[[Legacy:UTWeaponPickup|UTWeaponPickup]] -&gt; [[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:InstantFire|InstantFire]] -&gt; [[Legacy:MinigunFire|MinigunFire]] -&gt; [[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:Ammunition|Ammunition]] -&gt; [[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:UTAmmoPickup|UTAmmoPickup]] -&gt; [[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]

[[Legacy:XWeaponAttachment|xWeaponAttachment]] -&gt; [[Legacy:MinigunAttachment|MinigunAttachment]]

===XWeapons_rc===

===XWebAdmin===

===Core===

===Engine===

===Gameplay===

===Vehicles===

===UnrealGame===

==Comments==

'''Dragonmaw:''' I'm gonna try and update this page at least once a week (usually Saturday) with a few more code references.  Any corrections will be helpful.

'''Wormbo:''' I doubt this will help &quot;n00bs who don't want to decompile and figure it out themselves&quot;. UnrealWiki class pages like [[Legacy:Actor|Actor]], [[Legacy:Interaction|Interaction]], [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] or also [[Legacy:Minigun|Minigun]] should contain a list of properties, structs, enums and methods declared and used in that class. Just copying the code is pointless and ineffective, concidering there are over 1300 classes only in UT2003 and the Wiki also describes UT classes. See those other pages for how class pages should look like.

'''Sobiwan:''' Is this supposed to be what  http://unreal.student.utwente.nl/uncodex/ is all about?

'''Wormbo:''' That's just the [[Legacy:UnCodeX|UnCodeX]] output of the UT2003 classes plus El Muerte's own stuff. A wiki class page should look like e.g. [[Legacy:ZoneInfo|ZoneInfo]]. Quoting the code of entire classes isn't useful, even if there are a lot of comments in it.

'''Tarquin:''' All the commented default properties should be listed as properties on the relevant class page. (&quot;AttachLoc&quot; for example. Which class defines this?) It might be useful to have a few commented class scripts as tutorials, but not the whole lot!

'''Dragonmaw:''' Maybe I'm just a bit ambitious.  Besides, I'm bored, and figuring out the code will help me learn UScript.  If you want I won't do all of them, but I plan on doing a few Engine classes.  Sorry if I did something wrong :(

'''RDGDanClark:''' I don't think you did anything wrong... but this &lt;i&gt;is&lt;/i&gt; a bit too much. I think it's a great idea to have heavily commented examples of a few classes from each category, especially weapons and pickups. I respectfully disagree with Wormbo &amp;ndash; when I was first learning to code C++, it helped me immeasurably to have a block of working, heavily commented code to help me trace through the functionality. The only thing that would concern me on a page like this is the likelihood that classes will change with each patch and especially with UT2004. That being the case, each class laid out should have a build number at the top of the page.

'''Dragonmaw:''' I went ahead and cut down the classes to be commented to the main areas people will have difficulty in.  And I have to agree with Clark, commented code really helps along the learning process.

'''Tarquin:''' Could you follow the standard layout for pages named after classes? If it makes the whole page too long, I suggest you put the code analysis at {{classname/script}}

'''RDGDanClark:''' No problem.

'''Tarquin:''' It would be nice to tie this in with the &quot;how stuff works&quot; section on the [[Legacy:UnrealScript|UnrealScript]] page: [[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]. Also, you could make longer comments to the code and take them out of the code, like on [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]].

'''RDGDanClark:''' I think the idea, especially in the case of the weapon examples, is that someone could simply copy/paste the entire block of code, put it into a compliler, and have a working weapon &amp;ndash; one problem I always had with script tutorials is that very often there are bits left out between code blocks that cause the code to fail when compiled. No offense to the author, but the [[Legacy:Creating A New Weapontype|Creating A New Weapontype]] tutorial is rather vague and near impossible to follow for someone new to scripting. By seeing all the original code in one place with heavy comments and notes on how to change it (which is my project for tonight), this could be the perfect newbie weapon tutorial.

'''Tarquin:''' We seem to have  lots of pages which are just script with extra comments. What I think would be more useful would be see single pages that explain things with ''text'' and maybe the odd snip fform the code to illustrate.

'''SuperApe:''' I completely agree.  If you're interested in the '''actual''' code, you'll look at the code in the editor, but for reference, it's much more useful to novices and experts alike to see accurate ''text'' definitions of functions, event and states.  I say keep one or two for explanation purposes (perhaps in the /script subpages?) and convert the rest to English.  BTW, this should've been for UT2004 as well.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CodeMaster</title>
    <id>686</id>
    <revision>
      <id>2001</id>
      <timestamp>2003-04-06T09:05:45Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==CodeMaster and CodeTrigger ==

This page covers the CodeMaster and CodeTrigger pair, since they can never be used seperately. (The link [[Legacy:CodeTrigger|CodeTrigger]] redirects here automatically, so it can be used elsewhere in the Wiki.)

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; CodeMaster (Package: UnrealI)&lt;br /&gt;[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; CodeTrigger (Package: UnrealI)}}

This is an element of the original Unreal 1 Engine, used extremely rarely in Unreal games. Nevertheless, it can be used to good effect.

A set of CodeTrigger actors work together with a CodeMaster actor. The system will trigger an event when all the CodeTriggers in the set are triggered by the player in the correct order.

==CodeTrigger ==

Used along with an [[Legacy:ElevatorMover|ElevatorMover]], its visual cue. It sends a code to the CodeMaster object which tries to match up a pattern of a set of CodeTrigger activations. If the match is successful, the CodeMaster fires an [[Legacy:Event|event]]. If the order of triggerings is invalid, the set of ElevatorMovers are reset to the initial state. 

===Properties ===

====CodeTrigger Group ====
; int Code : What is the label code of this trigger/mover with respect to the sequence.
; name CodeMasterTag : The Tag of the CodeMaster actor to use.

====UnrealScript-Only Properties ====
; CodeMaster cdMaster : A reference to the used CodeMaster.
; [[Legacy:ElevatorMover|ElevatorMover]] elMover : A reference to the used ElevatorMover.

==CodeMaster ==

When a set of CodeTriggers are set up along with their corresponding ElevatorMovers, the CodeMaster is notified by the CodeTriggers whenever something encroaches upon them, and tries to match the order of trigger activations to a preset pattern, and if the pattern is matched, the main event is called, solving the &quot;puzzle&quot;.

===Properties ===

====CodeMaster Group ====
; int OrderCode[6] : The &lt;code&gt;Code&lt;/code&gt; properties of the corresponding CodeTriggers in the order that solves the &quot;puzzle&quot;.
; name MoverTags[6] : Tags of the ElevatorMovers belonging to this CodeMaster/CodeTrigger system.
; int NumElements : Number of CodeTriggers belonging to this &quot;puzzle&quot;.
; name MainEvent : The event to fire when the &quot;puzzle&quot; was solved.

====UnrealScript-Only Properties ====
; int ActualOrder[6] : Contains the order of events triggered by the player.
; int TriggerFlags[6] : Containes which CodeTrigger has already been activated.
; int NumTriggered : The current position in the activation sequence.
; bool bTriggeredAlready: Set to true to deactivate the CodeMaster after the &quot;puzzle&quot; has been solved.

==Related Topics ==
* [[Legacy:Trigger Systems|Trigger Systems]]

==Comments==

'''Foxpaw:''' The UnDox link generated a 404 error for me.

'''Wormbo:''' I removed the link now. Feel free to google for another link and put it here.

'''MythOpus:''' If I remember correctly, this thing was used in DM-Codex in UT.  Was it not ?

'''Tarquin:''' That was a plain [[Legacy:Counter|counter]]. You could get the secret room to open just by shooting the same light 4 times.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2002</id>
      <timestamp>2003-04-06T02:33:29Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==CodeMaster and CodeTrigger ==

This page covers the CodeMaster and CodeTrigger pair, since they can never be used seperately. (The link [[Legacy:CodeTrigger|CodeTrigger]] redirects here automatically, so it can be used elsewhere in the Wiki.)

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; CodeMaster (Package: UnrealI)&lt;br /&gt;[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; CodeTrigger (Package: UnrealI)}}

This is an element of the original Unreal 1 Engine, used extremely rarely in Unreal games. Nevertheless, it can be used to good effect.

A set of CodeTrigger actors work together with a CodeMaster actor. The system will trigger an event when all the CodeTriggers in the set are triggered by the player in the correct order.

==CodeTrigger ==

Used along with an [[Legacy:ElevatorMover|ElevatorMover]], its visual cue. It sends a code to the CodeMaster object which tries to match up a pattern of a set of CodeTrigger activations. If the match is successful, the CodeMaster fires an [[Legacy:Event|event]]. If the order of triggerings is invalid, the set of ElevatorMovers are reset to the initial state. 

===Properties ===

====CodeTrigger Group ====
; int Code : What is the label code of this trigger/mover with respect to the sequence.
; name CodeMasterTag : The Tag of the CodeMaster actor to use.

====UnrealScript-Only Properties ====
; CodeMaster cdMaster : A reference to the used CodeMaster.
; [[Legacy:ElevatorMover|ElevatorMover]] elMover : A reference to the used ElevatorMover.

==CodeMaster ==

When a set of CodeTriggers are set up along with their corresponding ElevatorMovers, the CodeMaster is notified by the CodeTriggers whenever something encroaches upon them, and tries to match the order of trigger activations to a preset pattern, and if the pattern is matched, the main event is called, solving the &quot;puzzle&quot;.

===Properties ===

====CodeMaster Group ====
; int OrderCode[6] : The &lt;code&gt;Code&lt;/code&gt; properties of the corresponding CodeTriggers in the order that solves the &quot;puzzle&quot;.
; name MoverTags[6] : Tags of the ElevatorMovers belonging to this CodeMaster/CodeTrigger system.
; int NumElements : Number of CodeTriggers belonging to this &quot;puzzle&quot;.
; name MainEvent : The event to fire when the &quot;puzzle&quot; was solved.

====UnrealScript-Only Properties ====
; int ActualOrder[6] : Contains the order of events triggered by the player.
; int TriggerFlags[6] : Containes which CodeTrigger has already been activated.
; int NumTriggered : The current position in the activation sequence.
; bool bTriggeredAlready: Set to true to deactivate the CodeMaster after the &quot;puzzle&quot; has been solved.

==Related Topics ==
* [[Legacy:Trigger Systems|Trigger Systems]]

'''Foxpaw:''' The UnDox link generated a 404 error for me.

'''Wormbo:''' I removed the link now. Feel free to google for another link and put it here.

'''MythOpus:''' If I remember correctly, this thing was used in DM-Codex in UT.  Was it not ?

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CodeTrigger</title>
    <id>687</id>
    <revision>
      <id>2003</id>
      <timestamp>2002-03-12T19:44:55Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT CodeMaster</text>
    </revision>
    <revision>
      <id>2004</id>
      <timestamp>2002-03-02T16:49:04Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This type of trigger works with the [[Legacy:CodeMaster|CodeMaster]] actor.

A set of CodeTrigger actors work together with a CodeMaster actor. The system will trigger an event when all the CodeTriggers in the set are triggered by the player in the correct order.

==Properties ==
; Code: 
; CodeMasterTag: The Tag of the codemaster object to use

Tarquin writes: I'm reading up on this code, I'll write more when I understnad it proerly. Feel free to beat me to it :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Coding Guidelines</title>
    <id>723</id>
    <revision>
      <id>2088</id>
      <timestamp>2006-04-07T15:32:04Z</timestamp>
      <contributor>
        <ip>213.68.15.100</ip>
      </contributor>
      <comment>added a linky about comments</comment>
      <text xml:space="preserve">==Introduction ==

{{innerbox| Code should be written to be read by humans first, and machines second.

 : ''Don Laabs''

}}

It can be very useful and safe a lot of time when all coders who are working on the same project use the same style of coding. This document is meant to be a good guideline.

'''Get yourself a decent text editor.'''  Notepad rarely crashes, but that's about the only thing to be said in its favor.  A decent [[Legacy:Text Editor|text editor]] (in coding terms) supports:

; Auto-indention : After pressing &lt;code&gt;Enter&lt;/code&gt;, the inserted paragraph has the same indentation as the paragraph you're coming from. Some editors will also change the indent when you type opening or closing braces.
; Hard tabs : Pressing the &lt;code&gt;Tab&lt;/code&gt; key (optionally) doesn't insert an actual tab character but simply enough spaces to jump to the next tab position. Conversely, if there is nothing but tab-equivalent spaces before the cursor position on the line, &lt;code&gt;Backspace&lt;/code&gt; will remove the equivalent of one tab. See below.
; Powerful search : Some means to search the open document for strings; that's one of your primary means for navigation in your source code. Some text editors even provide &quot;inline search&quot;, which searches the document as you type in your search string &amp;ndash; that's probably the most efficient way to implement a document search from a user's point of view.

Syntax highlighting is frequently mentioned as a crucial feature too, but it's more a nice-to-have (or even a ''very'' nice-to-have) than a feature that actually enhances your productivity.

==General Advice ==

===Indentation ===

Indent code that's in a block.  Whether you indent it using tabs or spaces is a matter of personal preference to a degree, but here are some pointers:

* Tabs are a ''logical'' way of indenting code.  In theory, everybody who's reading your code could just set their favorite tab width in their text editor and view your code as they like to.  In practice, tabs are used as a ''physical'' means of indentation and happily mixed and merged with regular spaces though, which completely messes up the source code layout if the reader doesn't happen to use exactly the same tab width as the writer.  (Epic uses four characters, for instance, while most text editors default to eight characters.)

* A decent text editor allows you to enter tabs either as an actual tab character or as a row of spaces automatically after a single stroke on the &lt;code&gt;Tab&lt;/code&gt; key.

===Expression Syntax ===

Make expressions readable:

* Put spaces around operators.

* Don't use more parentheses than necessary to understand the expression.  Operator precedences aren't always obvious to everyone (if they aren't obvious to you, look them up on the [[Legacy:Operators|Operators]] page), but it's at least commonly known that comparison operators have a higher precedence than binary boolean operators, for instance.

* If your parentheses are complex, consider marking the nesting with line breaks and indentation.

&lt;uscript&gt;
// Example:
if (
    Foo == Bar 
  &amp;&amp;
    Biz == Bax
  ) 
{
  // do stuff
}
&lt;/uscript&gt;

===Comments ===

{{innerbox| If the code and the comments disagree, then both are probably wrong.

 : ''Norm Schryer''

}}

Everybody has a different notion on how much commenting is &quot;just enough,&quot; but ''no comments at all'' are universally considered too sparse.  At the very least, give your classes and its methods comment headers that explain what the class and its methods are meant to do.  It's also good practice to put a comment at the end of a public object property declaration that's exposed in [[Legacy:UnrealEd|UnrealEd]]'s [[Legacy:Actor Properties Window|Actor Properties Window]] &amp;ndash; that might even be directly supported by future versions of UnrealEd that might display those comments as tooltips for mappers' guidance.

When creating comment headers for classes and methods it's generally easier to use comment blocks than single line comments &amp;ndash; as there is less editing to do should you need to update the comment block at a later date.

&lt;uscript&gt;
/*
    This function is called whenever a player collides with the flag.
    The function performs the following operations: ...
*/

function FlagCollision ()
&lt;/uscript&gt;

: '''EntropicLqd:'''  Sometimes the ''what'' in a comment is self evident from the code.  The ''why'' however may be far less obvious.  It's also easier to comment small blocks of code so it's worth creating reasonably atomic functions.  I'll dig out Code Complete tonight &amp;ndash; that had some good thoughts on commenting code.

:'''Mychaeel:'''  Concise code and variable names that are well thought out will help a great deal already (both readers ''and the writer'' of the code), but there's a natural limit to that.  That's why I'm emphasizing class and function comment headers &amp;ndash; they allow the writer to summarize what hundreds of lines of code do in a few comprehensible natural-language sentences, and they serve to define a class's or a function's interface (which would be the &quot;why&quot; you mentioned, I suppose).

:'''EntropicLqd:''' I would agree with that.  I rarely add comment blocks within a given function or method (unless I'm up to something particularly tortuous) but my function and class headers are generally detailed works of art (well, detailed anyway).

:'''Sweavo:''' http://www.ooblick.com/text/comments.html comments are about the PURPOSE of a piece of code.  That's something that you can't capture in the code.  The code only captures what the code DOES.

==Class Declaration ==

If you use modifiers in your class declaration (see [[Legacy:Class Syntax|Class Syntax]]) place each modifier on an indented new line.

&lt;uscript&gt;
class Child extends Parent
	abstract
	config
	native;
&lt;/uscript&gt;

'''[BWF]GrimReaper:'''  Beware of using the word 'class' in preceding comments. The compiler will error.

'''El Muerte TDS:''' that is not completely true, multi-line comments are not ignored in the initial class parsing, so:

&lt;uscript&gt;
/* this class won't compile */
class Child extends Parent abstract config;
&lt;/uscript&gt;

The initial parses recognizes this as a class called &quot;won&quot;, there's an easy work around for this at the moment:

&lt;uscript&gt;
/* 
  class Child extends Parent
  this does compile, all it needs are the class and extends, the class modifiers are not needed
*/
class Child extends Parent abstract config;
&lt;/uscript&gt;

'''Foxpaw:''' I believe you can also use single-line comments, like so:

&lt;uscript&gt;
// This Class does some junk.
// I guess.
// I never use comments anyway.
class AClass extends ASuperClass;
&lt;/uscript&gt;

'''El Muerte TDS:''' that's what I implicated, only multi-line comments have problems (also in defaultproperties)

'''El Muerte:''' maybe interesting to note, all UE2.5 based games (like UT2004) have no issues with block comments, you may use them anywhere you like. In fact, you can even nest them if you want (although most editors do not get that).

==Names ==

See [http://www.objectmentor.com/resources/articles/naming.htm Ottinger's Rules for Variable and Class Naming] for a few very valuable guidelines on naming.

===Name Capitalization ===

Stick to the conventions used in UnrealScript for naming your class, function, state and variable names.

* Write all UnrealScript keywords in lowercase.
* Write all symbol names (variable, state, class names) using the capitalization used in their declaration, even though UnrealScript is case-insensitive.
* Name your functions, variables with the Pascal notation (HelpMe, MyInteger, DoSomething()).

===Names are Documentation ===

{{innerbox| Always, always, always use good, unabbreviated, correctly-spelled meaningful names.

}}

{{innerbox| ; &quot;I don't like typing that much!&quot;''' : You're really just admitting that you don't know how to type, which is really not acceptable these days. Good editors help. Copy and paste if you have to. It's not really that much to do. Typically, in a narrow system, a given symbol won't be referenced more than 20 times anyway. 

}}

{{innerbox| ; &quot;It's difficult to come up with meaningful names!&quot; : Agreed. Lambda functions are nice but aren't always available. Perhaps you can more something more generic, or maybe you can scope a name. Usually, though, if you can't come up with a good name for a thing, you probably don't have a good idea what the thing is supposed to do. 

}}

{{innerbox| Taken from [[Wiki:MeaningfulName]].

}}

Make sure you give your functions and variables names that match their purpose (even if it's more typing).  Avoid the use of abbreviations unless they're immediately clear to ''everyone'' who's likely to read your code (including yourself).

===Negatives ===

Avoid double negatives. Make boolean variable names positive statements. Here's an example of what '''not''' to do from [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]:

  bDontRepeat

Care to work out what that is interpreted as when &quot;False&quot;? Now try it at 02:00 with no coffee. &quot;bRepeat&quot; would be far easier to understand, even if it means having to set a default value differently.

===Hungarian Notation ===

Hungarian notation uses a prefix to indicate the data type of a variable. Epic use Hungarian notation for boolean variables (bStatic, for example), but extending the usage to other simple variables can greatly improve the readability and maintainability of your code. In the example below the lower variable declaration uses hungarian notation to indicate that the variable is an int.

&lt;uscript&gt;
int Count; // No hungarian notation here
int iCount; // Note the &quot;i&quot; prefix - that's hungarian notation
&lt;/uscript&gt;

The prefixes you use within your code are purely a matter of choice.

* Some coders use the first character of the built-in data types as variable name prefixes; but you can also use multi-letter prefixes and mark variables for their intended use (for instance, &lt;code&gt;IndexFoo&lt;/code&gt; or &lt;code&gt;idxFoo&lt;/code&gt; for integer variables used as array indices, &lt;code&gt;CountBar&lt;/code&gt; or &lt;code&gt;cntBar&lt;/code&gt; or &lt;code&gt;nBar&lt;/code&gt; for integers that hold a counter of something, and so on).

* For object references, you could use the referenced object's class name (or a reasonable abbreviation of it) as the variable name prefix, for example &lt;code&gt;PawnPlayer&lt;/code&gt; or &lt;code&gt;EffectExplosion&lt;/code&gt;.

The aim of hungarian notation is to improve code comprehension.  You're not only doing that for other people reading your code but mainly for yourself.  It's much easier to write bugfree code if you don't constantly have to remember what your variables are supposed to contain.

'''Daid303:''' I shouldn't use this if I where you, it can make you lazy and make bad variable names. The name itself sould make clear what the type is. &quot;BlaBlaCount&quot; (int maybe?) the only thing that you could use it for is bools, there i find it usefull. And a nice thing of this: see this common C code: &lt;CODE&gt;int main(int argc, char** argv)&lt;/CODE&gt;and now with hungarian notation: &lt;CODE&gt;int main(int iArgc, char** papacArgv)&lt;/CODE&gt; So when someone says &quot;hungarian notation&quot; to me I say &quot;papac&quot; :)

'''EntropicLqd:''' You know that is the worst argument I've ever seen against Hungarian notation - lazy variable names indeed - your having a laugh.  If someone is prepared to add the prefixes the notation requires they are almost certainly going to name their variables appropriately.  Given a sensible variable name like &lt;CODE&gt;ItemCount&lt;/CODE&gt; can you tell me whether that's a byte, short, int, long, or any other type without looking at the declaration?  No.  In C I've commonly seen null termianted strings referred to as &lt;CODE&gt;sz&lt;/CODE&gt;, and arrays as simply &lt;CODE&gt;a&lt;/CODE&gt; as they are inherently pointers.  So your &lt;CODE&gt;papac&lt;/CODE&gt; example simply becomes &lt;CODE&gt;asz&lt;/CODE&gt;.  Still, I pretty much only use Hungarian notation when I'm coding in C and I've not done that for a few years now.

'''Foxpaw:''' Just my two cents, but I also think that the name of a variable should make it clear what the variable is. I usually use the hungarian notation for boolean variables but that is all. Most other variables it seems clear. I have a few conventions, any single lowercase letter is an interator counter, and any single uppercase letter is either an iterator reference variable or stores something to make the code more  optimal.

Other that that, everything seems clear. &quot;Relatives&quot; doesn't seem like it could possibly be anything other than a list of relatives. &quot;MaxThrust&quot; is the maximum amount of thrust - as a scalar quantity, it can't be anything BUT a numerical variable. Sure, it doesn't specify int, float, byte, short, or what-have-you, but so what? It should be pretty obvious. Thrust is a continuously variable quantity, so obviously it's floating point. If it was a counter, obviously it would be an integral variable. (The types of which, as far as I'm concerned, are interchangeable.)

However, I have to disagree with the iargc and papacargv above. Those are sort of already in Hungarian notation, but the notation is at the end. (Argc -&gt; cArg -&gt; A count of arguments, and Argv -&gt; vArg -&gt; a list (vector) of arguments.)
 

==Braces ==

Where to put the braces that surround blocks of statements is largely a matter of personal preference.  There are a couple of different variants around.

The only thing that's universally agreed on is that you should by all means indent all statements of a block.  (Whether to indent them with blanks or tabs and how many of them is a matter for an entirely different discussion.)

* Note that block statements (like &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt; and so on) don't require braces if the code block they apply to consists of a single statement.  Without braces, it's customary to put that single statement in a line of its own anyway and indent it as if it were a block &amp;ndash; just the opening and closing brace are missing.

&lt;uscript&gt;
if(foo)
  bar;
&lt;/uscript&gt;

Epic's programmers put opening and closing braces in separate lines, indented as much as the surrounding code, with the block within the braces indented one more level.

&lt;uscript&gt;
if(foo)
{
  bar
}
&lt;/uscript&gt;

You can also put the opening brace in the same line as the statement starting the block; that makes the code more compact (which may or may not be a good thing) and emphasizes the relation of the block itself and the block statement it belongs to.

&lt;uscript&gt;
if(foo) {
  bar
}
&lt;/uscript&gt;

And you can indent the closing brace with the interior block, so the whole thing looks like a single paragraph with a hanging indent:

&lt;uscript&gt;
if(foo) {
  bar; 
  }
&lt;/uscript&gt;

==Code Duplication ==

It's very easy to copy blocks of code when you need the same instructions more than once. It's usually better to create a function because if you want to change the code you don't have to do it more than once. A good example is found in [[Legacy:PlayerController|PlayerController]]'s '''''Dead''''' state:

&lt;USCRIPT&gt;
    exec function Fire( optional float F )
    {
        if ( bFrozen )
        {
            if ( (TimerRate &lt;= 0.0) || (TimerRate &gt; 1.0) )
                bFrozen = false;
            return;
        }
        LoadPlayers();
        ServerReStartPlayer();
    }

    exec function AltFire( optional float F )
    {
         Fire(F);
    }

&lt;/USCRIPT&gt;

Fire() and AltFire() may often need to be the same, but it's silly to have the same code copied into both. You can also be sure that the same thing happens in both cases, without having to check.

The problems of code duplication also arise when overriding functions or states. It's easy just to copy the parent's function and change it, but this is often a bad idea, especially if the parent gets updated at some point in the future. Often you still want all of the parent code, so it's far tidier to call the parent's function first:

&lt;USCRIPT&gt;

function OverridedFunction()

{
    Super.OverridedFunction();

    // additional instructions in child

}
&lt;/USCRIPT&gt;

It also makes it easier for you to keep track of what you've changed.

In the case of states, you have to remember that you inherit all of that state's functions, so you don't need to copy all the parent code. Only copy the functions you actually want to change, so you know later on for sure which code is yours.

==Discussion ==

'''Wormbo:''' A little discussion from my page:
: ''EntropicLqd'' - I saw you sneak in and change the formatting of the Relics page to not use the subheadings :P.  I bet you put your curly braces on the same line as your if statement too! :P :) ;) - I'll make my stuff consistent at some point if you don't beat me to it.
:What's wrong with the brace on the same line? ''&lt;i&gt;Everything! ;P&lt;/i&gt;'' I always put them there except for function, state, replication and defaultproperties. ;-) &amp;ndash; ''Wormbo''&lt;br /&gt;(Hey, this reminds me! We could make a page about good coding style...)
:&lt;i&gt;Uh yeah.  Please, let's have a good, fun, utterly pointless discussion about coding style &amp;ndash; where to put braces and how to indent.  I have some pretty unorthodox notions of my own there.  ;-)  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

: That would rock - I've not had a decent flame war (aka religious discussion) about coding style for ages.  The problem with coding-style discussions is that there is ''no right answer''.  In reality, consistency is more important than form - but I'll save the rest for the discussion &amp;ndash; ''EntropicLqd''

:&lt;i&gt;That, indeed, is something I heartily agree on.  &lt;b&gt;Consistency&lt;/b&gt; is important, not where braces are located and how indention is done (obviously everybody has grown attached to what he/she's doing him/herself, because I doubt doing it otherwise simply didn't occur to anyone).  :-)  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

: If only that were true.  I've probably tried hundreds of different combinations of styles in an attempt to find the &quot;perfect&quot; style.  In practice I've simply found a set of conventions for code that I find easiest to read.  The really ironic thing is that these conventions have changed over time (i.e the last million years) and so the style I use now is very slightly different to the style I was using a year ago.  What I also find even worse is that some elements of my coding style are influenced by whatever language I am developing most in at the time.

:&lt;i&gt;Actually, I don't find that to be a problem... you can hardly keep a consistent style across different languages simply due to the very different syntax of theirs.  My source code style in Delphi is very different from my source code style in UnrealScript, but then again it's hard to compare because the languages simply &lt;b&gt;have&lt;/b&gt; different syntax.  Then again, the way I indent braces and stuff like that is consistent among languages that &lt;b&gt;use&lt;/b&gt; braces.  As for symbol naming and capitalization conventions I've always found it most convenient to stick with the conventions given by the language used, more or less at least.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

: I agree about the indentation thing - that's something that is completely consistent aross all languages - as is my bracing (for those that use braces).  Spacing after/before brackets is something I'm &lt;i&gt;almost&lt;/i&gt; (sigh) always consistent in, and my function declarations (when needed) and commenting style is pretty much identical across all languages.  Symbol naming and capitalisation is something I prefer to be consistent with but in most cases someone else has generally written the coding style guide before me.  It irritates me that I find symbol naming and capitalisation pretty much transparent to code comprehension - I feel it should be more important than it actually is in practice.

----

'''Mychaeel:'''  The problem with such a page on a Wiki is that you will hardly be able to find something less than ultra-generic that all people agree on.  I, for instance, completely disagree with the notion of using tabs instead of blanks for indentation, ironically for precisely the reasons you're mentioning (non-standardized tab widths, above all &amp;ndash; and a decent text editor will let you use the &lt;code&gt;Tab&lt;/code&gt; key for inserting spaces to jump to the next tab position, so convenience of use is not an issue).

So brace yourself for a heated discussion on what &quot;good coding style&quot; is, as everybody has a different notion of it.  (And at the end of it, there's nothing wrong with that &amp;ndash; as long as, like you say, a whole team agrees on a given set of conventions, it's pretty irrelevant ''what'' conventions those are.)

'''Tarquin:'''  we could outline the different styles. You're right about tabs... they can look great in UnrealEd's script window and then like dross in a different editor. :( Going beyond typographical layout, we could mention conventions such as bSomething for booleans, EOPtions for enumerations.

'''2COOL4-U:''' Well I really am pro-tabs. No one has ever set a standard about how many spaces to use. And all the editors I use(except 1st page 2000 for HTML editing) have a nice good way of handling tabs. Also a good editor has an option to change the number of spaces used for a tab.

I am also trying to write coding guidelines about how the classes coded by Epic Games are written. They use tabs for example.

'''Mychaeel:'''  Well... the lack of a common standard for the number of characters per tabstop is, as I wrote, something that's in my opinion the best argument '''against''' the usage of tabs for indentation &amp;ndash; Epic is apparently using four character widths per tabstop, while normal text terminals and text editors default to eight.  Looking at Epic's code with a text editor that isn't set to those exact four characters makes it look pretty messed up and incomprehensible.

That's especially true since coders are tempted to use tabs not only for indentation but also for horizontal alignment of subsequent lines; and mixing lines with tabs and blanks is pure horror.  I can't see any of these disadvantages in using blanks and a decent text editor that enters them when you press &lt;code&gt;Tab&lt;/code&gt;.

Incidentally, every full-fledged programming environment like Microsoft Visual C++ or Delphi makes either behavior optional and configurable.  At the end of the day that just proves once more that this is an item of personal preference (even though everybody might have strong reasons for doing it this or another way), and nobody is in the position to publicly claim that using tabs or not using tabs is the one way to go.  If anything we could, Wiki-like, list pros and cons for both notions and be done with that.

'''EntropicLqd''' Ironically the very reason cited by Mychaeel for using spaces instead of tabs is the reason I prefer to use tabs.  I tend to use tab stops of either 2 or 4 depending on what language I am programming in.  The text editor I use has a configurable setting for the tab stops.  This means that if I pick up some code from someone who thinks a tab stop of 8 is great, if they have used tabs, it will get displayed to my preference.  If spaces are used I either have to remember to also use spaces (so as not to break the indentation scheme when viewed by the original author), or reformat all the code to use tabs (which would also irritate the original author).

'''TaoPaiPai:''' The last thing I want is someone to tell me how to indent my code :/ :p

'''Birelli:''' My attempt at a generic statement: &quot;Projects in which there are going to be multiple editors used essentially require the use of spaces only and not tabs. However, if there is no doubt at all that every member of the team working on the project and every member that 'will '''ever''' work on it' is going to use the same text editor then, if everyone agrees, tabs can be permissible to use as a time-saver and an efficient way of lining up consecutive lines, something that anyone who has made a block of slightly varying function calls can attest to as critical.&quot; Ok, so it's a bit lengthy, but I think it satisfies all the arguments presented. Personally, I always use tabs in my programming, but if I was ever going to work with someone using a different editor, I think it would be worth it to use spaces. &lt;/riding the fence&gt; ;-)

'''Mychaeel:'''  The &quot;time saver&quot; argument really doesn't apply, unless you're using a very simple text editor that doesn't allow you to use the &lt;code&gt;Tab&lt;/code&gt; key to jump to the next tab position with ''spaces''.  I wouldn't like to have to hit the &lt;code&gt;Space&lt;/code&gt; key either twice (or more) each time I add an indentation level.  (By the way:  I'm ''implying'' the presence of auto-indent in a decent text editor:  When pressing &lt;code&gt;Enter&lt;/code&gt;, the new line is indented just as much as the one you were previously in.)

'''Tarquin:'''  absolutely. I used to think &quot;spaces... urg!&quot; until I switched to TextPad. Spaces make sense for the saved document; using the tab key makes sense for the actual coder. Auto-indent brings the two together :)

'''Birelli:''' Aaaah, /me understands Mych now. I guess that does satisfy everything involved.

'''Mychaeel:''' To my utter delight I just found the following quote on [http://mindprod.com/unmainobfuscation.html How To Write Unmaintainable Code: Coding Obfuscation] (also linked from [[Legacy:UnrealScript|UnrealScript]], though not by me, I might add): &quot;'''Tabs From Hell''' &amp;ndash; Never underestimate how much havoc you can create by indenting with tabs instead of spaces, especially when there is no corporate standard on how much indenting a tab represents.&quot;

'''Trystan:''' Nothing to do with tabs; everything to do with Hungarian notation.  I've always disagreed with it - in my mind your variable name and an idea of what the code is doing, along with context, should be enough of a clue to a programmer as to what your variable contains.  I use bVariableName myself because I like to know that a variable should only be compared to true/false, but I never saw the point of lpszPointerToAString.  I'm also a fan of CamelCase notation, but not camelCase.  Why not capitalize the first letter?  It keeps things more &quot;standard&quot;; you could either &quot;capitalize the first letter of every word except the first&quot; or &quot;capitalize the first letter of every word.&quot;  Anything with an exception in it makes me think &quot;not standard.&quot;  As further proof of Hungarian notation's uselessness the .NET Framework - the framework of the future (?) - discourages it's use and Microsoft has officially stopped usage of the notation in it's corporate programming.

As for tabs - I'm a tab fanatic.  I hate spaces.  I hate spaces because we live in a mostly WYSIWYG world and when you open up code inside an editor that defaults to a proportional font spacing just gives up the ghost.  I'm willing to wager that's why most people use tabs:  a tab will always take you a half inch in, or whatever you have yours set to.  (Should you use an editor that doesn't default to a proportional font?  Probably not.  How many times have you been on a machine who's only text editor is Wordpad when you want to take a gander at someone else's code?  My personal machine is tweaked out to my specifications, but the other 325 machines at my company aren't. :P)

'''Mychaeel:''' &quot;Hungarian notation&quot; isn't what I'm personally using for my variable names, but I do use a prefix-based naming convention (that is thus &quot;reversed&quot; compared to normal talking).  Boolean values are prefixed with &quot;b&quot;, counters with &quot;n&quot;, indices with &quot;i&quot;.  After that, a top-down list of terms describing what the variable holds &amp;ndash; for instance &quot;nPlayersJailed&quot;, which would be a variable that holds the number of jailed players.  And &quot;nPlayersFree&quot; would be the number of free players.  When those two variable names are neatly horizontally aligned (something you '''cannot''' do with proportional fonts), it's easy to see at the first glance what's the same about them (count players) and what's different (jailed/free).  What's more important for anybody having to maintain your code, you can pull all this information from the very variable name itself at any time.

Tabs in source code are something I, for very practical reasons, loathe.  They're neat in concept as you describe, but I have yet to see anybody who actually uses them along their conceptual beauty.  Most people use them in a very thoughtless &quot;layout&quot; sense which breaks beyond recognition as soon as somebody else looks at their code with another tab setting, or another font, or just another editor.  ''Especially'' if you're dealing with 325 computers with 325 different editor preferences, that should be important to you.  If people '''only''' used tabs for block indention, everything would be fine and even I would use them; but people also use tabs to horizontally align corresponding items on subsequent lines, or comments at the end of lines, and so on.  What's even worse is if people use spaces ''and'' tabs in the same source code, maybe even in the same block (just look at Epic's code).

Using spaces for indention and horizontal alignment avoids '''all''' of those problems at the small expense of indentions not being as wide as with tabs when used with proportional fonts; but at least they're still recognizable.  (And you can scratch the entire notion of horizontal alignment anyway beyond mere block indention if you're using a proportional font to start with, which is one more reason not to do that.)

'''Trystan:''' True.  I use tabs to line my code up underneath brackets and had never considered it before.  Eep.  I may have to use that tabs to spaces option after all.. tab once, logic block.  Tab twice, code under logic block.  Someone opens it up.. sigh.. time to go update our project's coding notes.  (Ironically it's never been a problem because I'm the only coder at my company.. heh.)

'''Tarquin:''' best of both worlds is TextPad, which has Hard Tabs &amp;ndash; ''you'' hit TAB, but ''it'' inserts spaces :D

'''Mychaeel:''' I believe that's a feature every decent text editor has (or ought to have, anyway) &amp;ndash; mine can even convert tabs to spaces on the fly when loading files or pasting text.

'''Trystan:''' WOTGreal has it.  Notepad doesn't.. :)  Wait, wait, that doesn't qualify as a decent editor.  I found another reason I enjoy tabs though - if you've tabbed most editors will only require one cursor key movement to go over the entire length of the tab.  If you've used spaces you've got to hit it that many times.  Nothing serious, just trying to find stable ground to stand on in tabs vs spaces. :P

'''Mychaeel:''' Of course you would rather press Ctrl+LeftArrow or Ctrl+RightArrow to move from word to word instead of pressing the same arrow key repeatedly.  (Even Notepad supports that.)

'''Trystan:''' BAH!  I give up!  /me putters off to code rather than argue. :D

'''EntropicLqd:''' Since this discussion took place I've moved to 2 ''space'' indents in all the code I write.  I have no idea why I've started doing things this way.  It just happened about 3 months ago.  It doesn't even closely resemble the format I'm forced to use at work (tabs set to 4 spaces).  Maybe I'm rebelling :)

'''Ryan:''' Given that I've not done any UnrealScript yet I suppose I should just shut up, but never mind.  I program in Java. I use tabs or spaces, depending on how I'm feeling, I don't line code up always if I'm just bashing it into a function.  I certainly don't use proportional fonts - aargh.    What I do is use a code formatting tool - Jalopy, does a lovely job, straight into the format I want.  I tend to reformat after every 10 or 20 lines, or a function.  This keeps the whole thing neat and readable, inserts comment skeletons and copyright notices etc.  I wouldn't go back to having to rely on manual layout.  If I'm going to read a piece of &quot;foreign&quot; java code I tend to run it through the formatter.  I find it easier to read in the format I'm used to.  My guess is that I'll use the same layout for UnrealScript.  Capitals at the start of a name always make me think that it's a class name, oh well never mind.

Does anyone know of any code formatters that understand UnrealScript?

'''Graphik:''' [[Legacy:ConTEXT|ConTEXT]]

'''El Muerte:''' A lot of text editors have a unrealscript syntax highlighter, check the [[Legacy:Text Editor/Feature Matrix|Text Editor/Feature Matrix]]

'''Mychaeel:''' I think Ryan's asking about a code ''formatter'', not a ''highlighter''.  I've not seen an UnrealScript source code formatter yet, but then again, I've never looked for one; the only case in which I needed one, I hacked it in Perl myself when I changed my code indention conventions a while ago and had to reformat a bunch of sources (Jailbreak, in fact).

Speaking of comment templates:  Comment templates in code which have never been filled in are loathsome &amp;ndash; worse than no comments at all, actually, because they pretend the presence of actual documentation when they're in fact just noise (such things like &quot;Enter description of class here&quot; in the comment header at the top of a class).  I'm sure comment templates can be handy and useful in the right hands, but just like soft tabs and other things they tend to encourage thoughtless source code design even when used by seasoned programmers.

'''Ryan:''' Mychaeel - you're right, I meant a formatter not a highlighter.  To be useful a formatter needs to understand the language and preferred layout of sections of the code and the structures it uses.  I'm not going to get into a rant about the Unreal codebase - I haven't set up a rant page yet :), and I don't have the experience with it to make the comments constructive.  I've found that although people are prepared to argue until the cows come home about layout, if they are given a tool that lays the code out they will in general use it.

I will make a tentative suggestion (based on no authority whatsoever) that it might be useful to find, build a tool for formatting UnrealScript.  I for one would happily use it with an agreed format. It would make make code I write easier for others to read, if they have an inclination to do so.  Pretty well all of the points you make, with the exceptions of naming conventions, negatives and code duplication could be handled.

On the comments front, you're right again, it takes a certain level of commitment to replace the templates.  I'm afraid I'm a bit anal and am not prepared to leave the stubs until they've got useful comments in them.

'''El Muerte:''' oh, you mean something like [http://www.gnu.org/software/indent/indent.html GNU indent]? 

'''Ryan:''' Yep, that's more like it.  I know of any number for Java or C, but none that I've found for UnrealScript.  I'd guess that Java formatters are the closest, but UnrealScript seems to have some extra bits - &quot;defaultproperties&quot; for example.

----

[[:Category:Legacy Refactor Me]]

[[:Category:Legacy To Do]] &amp;ndash; Needs appropriate linkage to other modding and guidline pages; a Related Topics section plus linkage to this page.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2089</id>
      <timestamp>2006-04-07T07:34:02Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

{{innerbox| Code should be written to be read by humans first, and machines second.

 : ''Don Laabs''

}}

It can be very useful and safe a lot of time when all coders who are working on the same project use the same style of coding. This document is meant to be a good guideline.

'''Get yourself a decent text editor.'''  Notepad rarely crashes, but that's about the only thing to be said in its favor.  A decent [[Legacy:Text Editor|text editor]] (in coding terms) supports:

; Auto-indention : After pressing &lt;code&gt;Enter&lt;/code&gt;, the inserted paragraph has the same indentation as the paragraph you're coming from. Some editors will also change the indent when you type opening or closing braces.
; Hard tabs : Pressing the &lt;code&gt;Tab&lt;/code&gt; key (optionally) doesn't insert an actual tab character but simply enough spaces to jump to the next tab position. Conversely, if there is nothing but tab-equivalent spaces before the cursor position on the line, &lt;code&gt;Backspace&lt;/code&gt; will remove the equivalent of one tab. See below.
; Powerful search : Some means to search the open document for strings; that's one of your primary means for navigation in your source code. Some text editors even provide &quot;inline search&quot;, which searches the document as you type in your search string &amp;ndash; that's probably the most efficient way to implement a document search from a user's point of view.

Syntax highlighting is frequently mentioned as a crucial feature too, but it's more a nice-to-have (or even a ''very'' nice-to-have) than a feature that actually enhances your productivity.

==General Advice ==

===Indentation ===

Indent code that's in a block.  Whether you indent it using tabs or spaces is a matter of personal preference to a degree, but here are some pointers:

* Tabs are a ''logical'' way of indenting code.  In theory, everybody who's reading your code could just set their favorite tab width in their text editor and view your code as they like to.  In practice, tabs are used as a ''physical'' means of indentation and happily mixed and merged with regular spaces though, which completely messes up the source code layout if the reader doesn't happen to use exactly the same tab width as the writer.  (Epic uses four characters, for instance, while most text editors default to eight characters.)

* A decent text editor allows you to enter tabs either as an actual tab character or as a row of spaces automatically after a single stroke on the &lt;code&gt;Tab&lt;/code&gt; key.

===Expression Syntax ===

Make expressions readable:

* Put spaces around operators.

* Don't use more parentheses than necessary to understand the expression.  Operator precedences aren't always obvious to everyone (if they aren't obvious to you, look them up on the [[Legacy:Operators|Operators]] page), but it's at least commonly known that comparison operators have a higher precedence than binary boolean operators, for instance.

* If your parentheses are complex, consider marking the nesting with line breaks and indentation.

&lt;uscript&gt;
// Example:
if (
    Foo == Bar 
  &amp;&amp;
    Biz == Bax
  ) 
{
  // do stuff
}
&lt;/uscript&gt;

===Comments ===

{{innerbox| If the code and the comments disagree, then both are probably wrong.

 : ''Norm Schryer''

}}

Everybody has a different notion on how much commenting is &quot;just enough,&quot; but ''no comments at all'' are universally considered too sparse.  At the very least, give your classes and its methods comment headers that explain what the class and its methods are meant to do.  It's also good practice to put a comment at the end of a public object property declaration that's exposed in [[Legacy:UnrealEd|UnrealEd]]'s [[Legacy:Actor Properties Window|Actor Properties Window]] &amp;ndash; that might even be directly supported by future versions of UnrealEd that might display those comments as tooltips for mappers' guidance.

When creating comment headers for classes and methods it's generally easier to use comment blocks than single line comments &amp;ndash; as there is less editing to do should you need to update the comment block at a later date.

&lt;uscript&gt;
/*
    This function is called whenever a player collides with the flag.
    The function performs the following operations: ...
*/

function FlagCollision ()
&lt;/uscript&gt;

: '''EntropicLqd:'''  Sometimes the ''what'' in a comment is self evident from the code.  The ''why'' however may be far less obvious.  It's also easier to comment small blocks of code so it's worth creating reasonably atomic functions.  I'll dig out Code Complete tonight &amp;ndash; that had some good thoughts on commenting code.

:'''Mychaeel:'''  Concise code and variable names that are well thought out will help a great deal already (both readers ''and the writer'' of the code), but there's a natural limit to that.  That's why I'm emphasizing class and function comment headers &amp;ndash; they allow the writer to summarize what hundreds of lines of code do in a few comprehensible natural-language sentences, and they serve to define a class's or a function's interface (which would be the &quot;why&quot; you mentioned, I suppose).

:'''EntropicLqd:''' I would agree with that.  I rarely add comment blocks within a given function or method (unless I'm up to something particularly tortuous) but my function and class headers are generally detailed works of art (well, detailed anyway).

==Class Declaration ==

If you use modifiers in your class declaration (see [[Legacy:Class Syntax|Class Syntax]]) place each modifier on an indented new line.

&lt;uscript&gt;
class Child extends Parent
	abstract
	config
	native;
&lt;/uscript&gt;

'''[BWF]GrimReaper:'''  Beware of using the word 'class' in preceding comments. The compiler will error.

'''El Muerte TDS:''' that is not completely true, multi-line comments are not ignored in the initial class parsing, so:

&lt;uscript&gt;
/* this class won't compile */
class Child extends Parent abstract config;
&lt;/uscript&gt;

The initial parses recognizes this as a class called &quot;won&quot;, there's an easy work around for this at the moment:

&lt;uscript&gt;
/* 
  class Child extends Parent
  this does compile, all it needs are the class and extends, the class modifiers are not needed
*/
class Child extends Parent abstract config;
&lt;/uscript&gt;

'''Foxpaw:''' I believe you can also use single-line comments, like so:

&lt;uscript&gt;
// This Class does some junk.
// I guess.
// I never use comments anyway.
class AClass extends ASuperClass;
&lt;/uscript&gt;

'''El Muerte TDS:''' that's what I implicated, only multi-line comments have problems (also in defaultproperties)

'''El Muerte:''' maybe interesting to note, all UE2.5 based games (like UT2004) have no issues with block comments, you may use them anywhere you like. In fact, you can even nest them if you want (although most editors do not get that).

==Names ==

See [http://www.objectmentor.com/resources/articles/naming.htm Ottinger's Rules for Variable and Class Naming] for a few very valuable guidelines on naming.

===Name Capitalization ===

Stick to the conventions used in UnrealScript for naming your class, function, state and variable names.

* Write all UnrealScript keywords in lowercase.
* Write all symbol names (variable, state, class names) using the capitalization used in their declaration, even though UnrealScript is case-insensitive.
* Name your functions, variables with the Pascal notation (HelpMe, MyInteger, DoSomething()).

===Names are Documentation ===

{{innerbox| Always, always, always use good, unabbreviated, correctly-spelled meaningful names.

}}

{{innerbox| ; &quot;I don't like typing that much!&quot;''' : You're really just admitting that you don't know how to type, which is really not acceptable these days. Good editors help. Copy and paste if you have to. It's not really that much to do. Typically, in a narrow system, a given symbol won't be referenced more than 20 times anyway. 

}}

{{innerbox| ; &quot;It's difficult to come up with meaningful names!&quot; : Agreed. Lambda functions are nice but aren't always available. Perhaps you can more something more generic, or maybe you can scope a name. Usually, though, if you can't come up with a good name for a thing, you probably don't have a good idea what the thing is supposed to do. 

}}

{{innerbox| Taken from [[Wiki:MeaningfulName]].

}}

Make sure you give your functions and variables names that match their purpose (even if it's more typing).  Avoid the use of abbreviations unless they're immediately clear to ''everyone'' who's likely to read your code (including yourself).

===Negatives ===

Avoid double negatives. Make boolean variable names positive statements. Here's an example of what '''not''' to do from [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]:

  bDontRepeat

Care to work out what that is interpreted as when &quot;False&quot;? Now try it at 02:00 with no coffee. &quot;bRepeat&quot; would be far easier to understand, even if it means having to set a default value differently.

===Hungarian Notation ===

Hungarian notation uses a prefix to indicate the data type of a variable. Epic use Hungarian notation for boolean variables (bStatic, for example), but extending the usage to other simple variables can greatly improve the readability and maintainability of your code. In the example below the lower variable declaration uses hungarian notation to indicate that the variable is an int.

&lt;uscript&gt;
int Count; // No hungarian notation here
int iCount; // Note the &quot;i&quot; prefix - that's hungarian notation
&lt;/uscript&gt;

The prefixes you use within your code are purely a matter of choice.

* Some coders use the first character of the built-in data types as variable name prefixes; but you can also use multi-letter prefixes and mark variables for their intended use (for instance, &lt;code&gt;IndexFoo&lt;/code&gt; or &lt;code&gt;idxFoo&lt;/code&gt; for integer variables used as array indices, &lt;code&gt;CountBar&lt;/code&gt; or &lt;code&gt;cntBar&lt;/code&gt; or &lt;code&gt;nBar&lt;/code&gt; for integers that hold a counter of something, and so on).

* For object references, you could use the referenced object's class name (or a reasonable abbreviation of it) as the variable name prefix, for example &lt;code&gt;PawnPlayer&lt;/code&gt; or &lt;code&gt;EffectExplosion&lt;/code&gt;.

The aim of hungarian notation is to improve code comprehension.  You're not only doing that for other people reading your code but mainly for yourself.  It's much easier to write bugfree code if you don't constantly have to remember what your variables are supposed to contain.

'''Daid303:''' I shouldn't use this if I where you, it can make you lazy and make bad variable names. The name itself sould make clear what the type is. &quot;BlaBlaCount&quot; (int maybe?) the only thing that you could use it for is bools, there i find it usefull. And a nice thing of this: see this common C code: &lt;CODE&gt;int main(int argc, char** argv)&lt;/CODE&gt;and now with hungarian notation: &lt;CODE&gt;int main(int iArgc, char** papacArgv)&lt;/CODE&gt; So when someone says &quot;hungarian notation&quot; to me I say &quot;papac&quot; :)

'''EntropicLqd:''' You know that is the worst argument I've ever seen against Hungarian notation - lazy variable names indeed - your having a laugh.  If someone is prepared to add the prefixes the notation requires they are almost certainly going to name their variables appropriately.  Given a sensible variable name like &lt;CODE&gt;ItemCount&lt;/CODE&gt; can you tell me whether that's a byte, short, int, long, or any other type without looking at the declaration?  No.  In C I've commonly seen null termianted strings referred to as &lt;CODE&gt;sz&lt;/CODE&gt;, and arrays as simply &lt;CODE&gt;a&lt;/CODE&gt; as they are inherently pointers.  So your &lt;CODE&gt;papac&lt;/CODE&gt; example simply becomes &lt;CODE&gt;asz&lt;/CODE&gt;.  Still, I pretty much only use Hungarian notation when I'm coding in C and I've not done that for a few years now.

'''Foxpaw:''' Just my two cents, but I also think that the name of a variable should make it clear what the variable is. I usually use the hungarian notation for boolean variables but that is all. Most other variables it seems clear. I have a few conventions, any single lowercase letter is an interator counter, and any single uppercase letter is either an iterator reference variable or stores something to make the code more  optimal.

Other that that, everything seems clear. &quot;Relatives&quot; doesn't seem like it could possibly be anything other than a list of relatives. &quot;MaxThrust&quot; is the maximum amount of thrust - as a scalar quantity, it can't be anything BUT a numerical variable. Sure, it doesn't specify int, float, byte, short, or what-have-you, but so what? It should be pretty obvious. Thrust is a continuously variable quantity, so obviously it's floating point. If it was a counter, obviously it would be an integral variable. (The types of which, as far as I'm concerned, are interchangeable.)

However, I have to disagree with the iargc and papacargv above. Those are sort of already in Hungarian notation, but the notation is at the end. (Argc -&gt; cArg -&gt; A count of arguments, and Argv -&gt; vArg -&gt; a list (vector) of arguments.)
 

==Braces ==

Where to put the braces that surround blocks of statements is largely a matter of personal preference.  There are a couple of different variants around.

The only thing that's universally agreed on is that you should by all means indent all statements of a block.  (Whether to indent them with blanks or tabs and how many of them is a matter for an entirely different discussion.)

* Note that block statements (like &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt; and so on) don't require braces if the code block they apply to consists of a single statement.  Without braces, it's customary to put that single statement in a line of its own anyway and indent it as if it were a block &amp;ndash; just the opening and closing brace are missing.

&lt;uscript&gt;
if(foo)
  bar;
&lt;/uscript&gt;

Epic's programmers put opening and closing braces in separate lines, indented as much as the surrounding code, with the block within the braces indented one more level.

&lt;uscript&gt;
if(foo)
{
  bar
}
&lt;/uscript&gt;

You can also put the opening brace in the same line as the statement starting the block; that makes the code more compact (which may or may not be a good thing) and emphasizes the relation of the block itself and the block statement it belongs to.

&lt;uscript&gt;
if(foo) {
  bar
}
&lt;/uscript&gt;

And you can indent the closing brace with the interior block, so the whole thing looks like a single paragraph with a hanging indent:

&lt;uscript&gt;
if(foo) {
  bar; 
  }
&lt;/uscript&gt;

==Code Duplication ==

It's very easy to copy blocks of code when you need the same instructions more than once. It's usually better to create a function because if you want to change the code you don't have to do it more than once. A good example is found in [[Legacy:PlayerController|PlayerController]]'s '''''Dead''''' state:

&lt;USCRIPT&gt;
    exec function Fire( optional float F )
    {
        if ( bFrozen )
        {
            if ( (TimerRate &lt;= 0.0) || (TimerRate &gt; 1.0) )
                bFrozen = false;
            return;
        }
        LoadPlayers();
        ServerReStartPlayer();
    }

    exec function AltFire( optional float F )
    {
         Fire(F);
    }

&lt;/USCRIPT&gt;

Fire() and AltFire() may often need to be the same, but it's silly to have the same code copied into both. You can also be sure that the same thing happens in both cases, without having to check.

The problems of code duplication also arise when overriding functions or states. It's easy just to copy the parent's function and change it, but this is often a bad idea, especially if the parent gets updated at some point in the future. Often you still want all of the parent code, so it's far tidier to call the parent's function first:

&lt;USCRIPT&gt;

function OverridedFunction()

{
    Super.OverridedFunction();

    // additional instructions in child

}
&lt;/USCRIPT&gt;

It also makes it easier for you to keep track of what you've changed.

In the case of states, you have to remember that you inherit all of that state's functions, so you don't need to copy all the parent code. Only copy the functions you actually want to change, so you know later on for sure which code is yours.

==Discussion ==

'''Wormbo:''' A little discussion from my page:
: ''EntropicLqd'' - I saw you sneak in and change the formatting of the Relics page to not use the subheadings :P.  I bet you put your curly braces on the same line as your if statement too! :P :) ;) - I'll make my stuff consistent at some point if you don't beat me to it.
:What's wrong with the brace on the same line? ''&lt;i&gt;Everything! ;P&lt;/i&gt;'' I always put them there except for function, state, replication and defaultproperties. ;-) &amp;ndash; ''Wormbo''&lt;br /&gt;(Hey, this reminds me! We could make a page about good coding style...)
:&lt;i&gt;Uh yeah.  Please, let's have a good, fun, utterly pointless discussion about coding style &amp;ndash; where to put braces and how to indent.  I have some pretty unorthodox notions of my own there.  ;-)  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

: That would rock - I've not had a decent flame war (aka religious discussion) about coding style for ages.  The problem with coding-style discussions is that there is ''no right answer''.  In reality, consistency is more important than form - but I'll save the rest for the discussion &amp;ndash; ''EntropicLqd''

:&lt;i&gt;That, indeed, is something I heartily agree on.  &lt;b&gt;Consistency&lt;/b&gt; is important, not where braces are located and how indention is done (obviously everybody has grown attached to what he/she's doing him/herself, because I doubt doing it otherwise simply didn't occur to anyone).  :-)  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

: If only that were true.  I've probably tried hundreds of different combinations of styles in an attempt to find the &quot;perfect&quot; style.  In practice I've simply found a set of conventions for code that I find easiest to read.  The really ironic thing is that these conventions have changed over time (i.e the last million years) and so the style I use now is very slightly different to the style I was using a year ago.  What I also find even worse is that some elements of my coding style are influenced by whatever language I am developing most in at the time.

:&lt;i&gt;Actually, I don't find that to be a problem... you can hardly keep a consistent style across different languages simply due to the very different syntax of theirs.  My source code style in Delphi is very different from my source code style in UnrealScript, but then again it's hard to compare because the languages simply &lt;b&gt;have&lt;/b&gt; different syntax.  Then again, the way I indent braces and stuff like that is consistent among languages that &lt;b&gt;use&lt;/b&gt; braces.  As for symbol naming and capitalization conventions I've always found it most convenient to stick with the conventions given by the language used, more or less at least.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

: I agree about the indentation thing - that's something that is completely consistent aross all languages - as is my bracing (for those that use braces).  Spacing after/before brackets is something I'm &lt;i&gt;almost&lt;/i&gt; (sigh) always consistent in, and my function declarations (when needed) and commenting style is pretty much identical across all languages.  Symbol naming and capitalisation is something I prefer to be consistent with but in most cases someone else has generally written the coding style guide before me.  It irritates me that I find symbol naming and capitalisation pretty much transparent to code comprehension - I feel it should be more important than it actually is in practice.

----

'''Mychaeel:'''  The problem with such a page on a Wiki is that you will hardly be able to find something less than ultra-generic that all people agree on.  I, for instance, completely disagree with the notion of using tabs instead of blanks for indentation, ironically for precisely the reasons you're mentioning (non-standardized tab widths, above all &amp;ndash; and a decent text editor will let you use the &lt;code&gt;Tab&lt;/code&gt; key for inserting spaces to jump to the next tab position, so convenience of use is not an issue).

So brace yourself for a heated discussion on what &quot;good coding style&quot; is, as everybody has a different notion of it.  (And at the end of it, there's nothing wrong with that &amp;ndash; as long as, like you say, a whole team agrees on a given set of conventions, it's pretty irrelevant ''what'' conventions those are.)

'''Tarquin:'''  we could outline the different styles. You're right about tabs... they can look great in UnrealEd's script window and then like dross in a different editor. :( Going beyond typographical layout, we could mention conventions such as bSomething for booleans, EOPtions for enumerations.

'''2COOL4-U:''' Well I really am pro-tabs. No one has ever set a standard about how many spaces to use. And all the editors I use(except 1st page 2000 for HTML editing) have a nice good way of handling tabs. Also a good editor has an option to change the number of spaces used for a tab.

I am also trying to write coding guidelines about how the classes coded by Epic Games are written. They use tabs for example.

'''Mychaeel:'''  Well... the lack of a common standard for the number of characters per tabstop is, as I wrote, something that's in my opinion the best argument '''against''' the usage of tabs for indentation &amp;ndash; Epic is apparently using four character widths per tabstop, while normal text terminals and text editors default to eight.  Looking at Epic's code with a text editor that isn't set to those exact four characters makes it look pretty messed up and incomprehensible.

That's especially true since coders are tempted to use tabs not only for indentation but also for horizontal alignment of subsequent lines; and mixing lines with tabs and blanks is pure horror.  I can't see any of these disadvantages in using blanks and a decent text editor that enters them when you press &lt;code&gt;Tab&lt;/code&gt;.

Incidentally, every full-fledged programming environment like Microsoft Visual C++ or Delphi makes either behavior optional and configurable.  At the end of the day that just proves once more that this is an item of personal preference (even though everybody might have strong reasons for doing it this or another way), and nobody is in the position to publicly claim that using tabs or not using tabs is the one way to go.  If anything we could, Wiki-like, list pros and cons for both notions and be done with that.

'''EntropicLqd''' Ironically the very reason cited by Mychaeel for using spaces instead of tabs is the reason I prefer to use tabs.  I tend to use tab stops of either 2 or 4 depending on what language I am programming in.  The text editor I use has a configurable setting for the tab stops.  This means that if I pick up some code from someone who thinks a tab stop of 8 is great, if they have used tabs, it will get displayed to my preference.  If spaces are used I either have to remember to also use spaces (so as not to break the indentation scheme when viewed by the original author), or reformat all the code to use tabs (which would also irritate the original author).

'''TaoPaiPai:''' The last thing I want is someone to tell me how to indent my code :/ :p

'''Birelli:''' My attempt at a generic statement: &quot;Projects in which there are going to be multiple editors used essentially require the use of spaces only and not tabs. However, if there is no doubt at all that every member of the team working on the project and every member that 'will '''ever''' work on it' is going to use the same text editor then, if everyone agrees, tabs can be permissible to use as a time-saver and an efficient way of lining up consecutive lines, something that anyone who has made a block of slightly varying function calls can attest to as critical.&quot; Ok, so it's a bit lengthy, but I think it satisfies all the arguments presented. Personally, I always use tabs in my programming, but if I was ever going to work with someone using a different editor, I think it would be worth it to use spaces. &lt;/riding the fence&gt; ;-)

'''Mychaeel:'''  The &quot;time saver&quot; argument really doesn't apply, unless you're using a very simple text editor that doesn't allow you to use the &lt;code&gt;Tab&lt;/code&gt; key to jump to the next tab position with ''spaces''.  I wouldn't like to have to hit the &lt;code&gt;Space&lt;/code&gt; key either twice (or more) each time I add an indentation level.  (By the way:  I'm ''implying'' the presence of auto-indent in a decent text editor:  When pressing &lt;code&gt;Enter&lt;/code&gt;, the new line is indented just as much as the one you were previously in.)

'''Tarquin:'''  absolutely. I used to think &quot;spaces... urg!&quot; until I switched to TextPad. Spaces make sense for the saved document; using the tab key makes sense for the actual coder. Auto-indent brings the two together :)

'''Birelli:''' Aaaah, /me understands Mych now. I guess that does satisfy everything involved.

'''Mychaeel:''' To my utter delight I just found the following quote on [http://mindprod.com/unmainobfuscation.html How To Write Unmaintainable Code: Coding Obfuscation] (also linked from [[Legacy:UnrealScript|UnrealScript]], though not by me, I might add): &quot;'''Tabs From Hell''' &amp;ndash; Never underestimate how much havoc you can create by indenting with tabs instead of spaces, especially when there is no corporate standard on how much indenting a tab represents.&quot;

'''Trystan:''' Nothing to do with tabs; everything to do with Hungarian notation.  I've always disagreed with it - in my mind your variable name and an idea of what the code is doing, along with context, should be enough of a clue to a programmer as to what your variable contains.  I use bVariableName myself because I like to know that a variable should only be compared to true/false, but I never saw the point of lpszPointerToAString.  I'm also a fan of CamelCase notation, but not camelCase.  Why not capitalize the first letter?  It keeps things more &quot;standard&quot;; you could either &quot;capitalize the first letter of every word except the first&quot; or &quot;capitalize the first letter of every word.&quot;  Anything with an exception in it makes me think &quot;not standard.&quot;  As further proof of Hungarian notation's uselessness the .NET Framework - the framework of the future (?) - discourages it's use and Microsoft has officially stopped usage of the notation in it's corporate programming.

As for tabs - I'm a tab fanatic.  I hate spaces.  I hate spaces because we live in a mostly WYSIWYG world and when you open up code inside an editor that defaults to a proportional font spacing just gives up the ghost.  I'm willing to wager that's why most people use tabs:  a tab will always take you a half inch in, or whatever you have yours set to.  (Should you use an editor that doesn't default to a proportional font?  Probably not.  How many times have you been on a machine who's only text editor is Wordpad when you want to take a gander at someone else's code?  My personal machine is tweaked out to my specifications, but the other 325 machines at my company aren't. :P)

'''Mychaeel:''' &quot;Hungarian notation&quot; isn't what I'm personally using for my variable names, but I do use a prefix-based naming convention (that is thus &quot;reversed&quot; compared to normal talking).  Boolean values are prefixed with &quot;b&quot;, counters with &quot;n&quot;, indices with &quot;i&quot;.  After that, a top-down list of terms describing what the variable holds &amp;ndash; for instance &quot;nPlayersJailed&quot;, which would be a variable that holds the number of jailed players.  And &quot;nPlayersFree&quot; would be the number of free players.  When those two variable names are neatly horizontally aligned (something you '''cannot''' do with proportional fonts), it's easy to see at the first glance what's the same about them (count players) and what's different (jailed/free).  What's more important for anybody having to maintain your code, you can pull all this information from the very variable name itself at any time.

Tabs in source code are something I, for very practical reasons, loathe.  They're neat in concept as you describe, but I have yet to see anybody who actually uses them along their conceptual beauty.  Most people use them in a very thoughtless &quot;layout&quot; sense which breaks beyond recognition as soon as somebody else looks at their code with another tab setting, or another font, or just another editor.  ''Especially'' if you're dealing with 325 computers with 325 different editor preferences, that should be important to you.  If people '''only''' used tabs for block indention, everything would be fine and even I would use them; but people also use tabs to horizontally align corresponding items on subsequent lines, or comments at the end of lines, and so on.  What's even worse is if people use spaces ''and'' tabs in the same source code, maybe even in the same block (just look at Epic's code).

Using spaces for indention and horizontal alignment avoids '''all''' of those problems at the small expense of indentions not being as wide as with tabs when used with proportional fonts; but at least they're still recognizable.  (And you can scratch the entire notion of horizontal alignment anyway beyond mere block indention if you're using a proportional font to start with, which is one more reason not to do that.)

'''Trystan:''' True.  I use tabs to line my code up underneath brackets and had never considered it before.  Eep.  I may have to use that tabs to spaces option after all.. tab once, logic block.  Tab twice, code under logic block.  Someone opens it up.. sigh.. time to go update our project's coding notes.  (Ironically it's never been a problem because I'm the only coder at my company.. heh.)

'''Tarquin:''' best of both worlds is TextPad, which has Hard Tabs &amp;ndash; ''you'' hit TAB, but ''it'' inserts spaces :D

'''Mychaeel:''' I believe that's a feature every decent text editor has (or ought to have, anyway) &amp;ndash; mine can even convert tabs to spaces on the fly when loading files or pasting text.

'''Trystan:''' WOTGreal has it.  Notepad doesn't.. :)  Wait, wait, that doesn't qualify as a decent editor.  I found another reason I enjoy tabs though - if you've tabbed most editors will only require one cursor key movement to go over the entire length of the tab.  If you've used spaces you've got to hit it that many times.  Nothing serious, just trying to find stable ground to stand on in tabs vs spaces. :P

'''Mychaeel:''' Of course you would rather press Ctrl+LeftArrow or Ctrl+RightArrow to move from word to word instead of pressing the same arrow key repeatedly.  (Even Notepad supports that.)

'''Trystan:''' BAH!  I give up!  /me putters off to code rather than argue. :D

'''EntropicLqd:''' Since this discussion took place I've moved to 2 ''space'' indents in all the code I write.  I have no idea why I've started doing things this way.  It just happened about 3 months ago.  It doesn't even closely resemble the format I'm forced to use at work (tabs set to 4 spaces).  Maybe I'm rebelling :)

'''Ryan:''' Given that I've not done any UnrealScript yet I suppose I should just shut up, but never mind.  I program in Java. I use tabs or spaces, depending on how I'm feeling, I don't line code up always if I'm just bashing it into a function.  I certainly don't use proportional fonts - aargh.    What I do is use a code formatting tool - Jalopy, does a lovely job, straight into the format I want.  I tend to reformat after every 10 or 20 lines, or a function.  This keeps the whole thing neat and readable, inserts comment skeletons and copyright notices etc.  I wouldn't go back to having to rely on manual layout.  If I'm going to read a piece of &quot;foreign&quot; java code I tend to run it through the formatter.  I find it easier to read in the format I'm used to.  My guess is that I'll use the same layout for UnrealScript.  Capitals at the start of a name always make me think that it's a class name, oh well never mind.

Does anyone know of any code formatters that understand UnrealScript?

'''Graphik:''' [[Legacy:ConTEXT|ConTEXT]]

'''El Muerte:''' A lot of text editors have a unrealscript syntax highlighter, check the [[Legacy:Text Editor/Feature Matrix|Text Editor/Feature Matrix]]

'''Mychaeel:''' I think Ryan's asking about a code ''formatter'', not a ''highlighter''.  I've not seen an UnrealScript source code formatter yet, but then again, I've never looked for one; the only case in which I needed one, I hacked it in Perl myself when I changed my code indention conventions a while ago and had to reformat a bunch of sources (Jailbreak, in fact).

Speaking of comment templates:  Comment templates in code which have never been filled in are loathsome &amp;ndash; worse than no comments at all, actually, because they pretend the presence of actual documentation when they're in fact just noise (such things like &quot;Enter description of class here&quot; in the comment header at the top of a class).  I'm sure comment templates can be handy and useful in the right hands, but just like soft tabs and other things they tend to encourage thoughtless source code design even when used by seasoned programmers.

'''Ryan:''' Mychaeel - you're right, I meant a formatter not a highlighter.  To be useful a formatter needs to understand the language and preferred layout of sections of the code and the structures it uses.  I'm not going to get into a rant about the Unreal codebase - I haven't set up a rant page yet :), and I don't have the experience with it to make the comments constructive.  I've found that although people are prepared to argue until the cows come home about layout, if they are given a tool that lays the code out they will in general use it.

I will make a tentative suggestion (based on no authority whatsoever) that it might be useful to find, build a tool for formatting UnrealScript.  I for one would happily use it with an agreed format. It would make make code I write easier for others to read, if they have an inclination to do so.  Pretty well all of the points you make, with the exceptions of naming conventions, negatives and code duplication could be handled.

On the comments front, you're right again, it takes a certain level of commitment to replace the templates.  I'm afraid I'm a bit anal and am not prepared to leave the stubs until they've got useful comments in them.

'''El Muerte:''' oh, you mean something like [http://www.gnu.org/software/indent/indent.html GNU indent]? 

'''Ryan:''' Yep, that's more like it.  I know of any number for Java or C, but none that I've found for UnrealScript.  I'd guess that Java formatters are the closest, but UnrealScript seems to have some extra bits - &quot;defaultproperties&quot; for example.

----

[[:Category:Legacy Refactor Me]]

[[:Category:Legacy To Do]] &amp;ndash; Needs appropriate linkage to other modding and guidline pages; a Related Topics section plus linkage to this page.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Col Kassad</title>
    <id>702</id>
    <revision>
      <id>2040</id>
      <timestamp>2005-12-14T17:57:57Z</timestamp>
      <contributor>
        <ip>Pool-71-112-18-216.sttlwa.dsl-w.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I don't really play UT/UT2k3 much anymore but I still like making stuff for it. I've screwed around with UnrealEd for that past 3 years or so and was a level designer and the weapons modeler for the UT port of [http://www.planetunreal.com/weaponsfactory Weapons Factory].

Hi &amp; welcome to the Wiki :-)  &amp;ndash; ''Tarquin''

'''Aphex:''' Hi CK!  Well Done on WFUT.  U may not remember meh (did WF-Warrior ;))

----

'''Col:''' Wow! Hey Aphex! Long time no &quot;see&quot;! How could I forget our best level designer? :P Thanks Tarquin!

'''spoon:''' You've got the credits for porting over the UT sniper rifle to UT2K3. Several mutators and mods now use it. :)

'''DjRheingold:''' Hey Col!  It was a ton of fun to work on WFUT with you, spoon, Ob1 and Moose.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2041</id>
      <timestamp>2003-07-16T20:43:29Z</timestamp>
      <contributor>
        <ip>Spoon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I don't really play UT/UT2k3 much anymore but I still like making stuff for it. I've screwed around with UnrealEd for that past 3 years or so and was a level designer and the weapons modeler for the UT port of [http://www.planetunreal.com/weaponsfactory Weapons Factory].

Hi &amp; welcome to the Wiki :-)  &amp;ndash; ''Tarquin''

'''Aphex:''' Hi CK!  Well Done on WFUT.  U may not remember meh (did WF-Warrior ;))

----

'''Col:''' Wow! Hey Aphex! Long time no &quot;see&quot;! How could I forget our best level designer? :P Thanks Tarquin!

'''spoon:''' You've got the credits for porting over the UT sniper rifle to UT2K3. Several mutators and mods now use it. :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Collision</title>
    <id>789</id>
    <revision>
      <id>2235</id>
      <timestamp>2005-12-17T22:04:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Collision''' is all about the [[Legacy:Unreal Engine|Unreal engine]] deciding when one actor is touching another, and what to do about it if it is. [[Legacy:OCD|OCD]] gives technical lowdown of object collision detection.

Collision properties are under [[Legacy:Actor/Collision|Actor/Collision]]: all [[Legacy:Actor|Actor]]s inherit them, even those that don't need it.

==Types of Collision==

Collision properties are mostly booleans, and fall roughly into two groups: Blocking properties (bBlockSomething) and Colliding properties (bCollideSomething). The difference between Blocking and Colliding is that Colliding actors only get a Touch() [[Legacy:Event|event]] when another actor collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

If an actor with bCollideActors = true is spawned on top of another actor with bCollideActors = true, Touch() will be called ''before'' PostBeginPlay(), and possibly before the other initialization functions as well. This can cause a lot of problems, especially if initialization code important to the actor's function is initialized in PostBeginPlay() to be used later in Touch().

==Collision Shape==

An actor has to define some sort of shape which it uses to decide whether another actor has collided with it. In [[Legacy:UT|UT]] and prior versions of the engine, this was always a [[Legacy:Collision Cylinder|collision cylinder]], an upright cylinder centered on the actor's location (the position vector in Movement-&gt;Location).

==Related Topics==
* [[Legacy:Collision Cylinder|Collision cylinder]]
* Collision actor properties:
** [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]] &amp;ndash; for Unreal and UT
** [[Legacy:Actor/Collision|Actor/Collision]] &amp;ndash; for UT2003 and newer

==External Links==
* [http://udn.epicgames.com/Two/StaticMeshCollisionReference#Static_Mesh_Collision_Reference Static Mesh Collision Reference] &amp;ndash; An excellent document covering the details of collision.

==Discussion==

'''Rbabiak:''' is there a way to make dynamic collision for a actor. Ie if I had a actor that was a animated door that I wanted block the players passage until at some time I play the animation on it of opening and then allow the player throught.

'''Tarquin:''' AFAIK you can change actor collision props on the fly &amp;ndash; in fact I'm fairly sure I've seen it done on actors that turn themselves off by simply turning off their collision

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2236</id>
      <timestamp>2004-09-26T14:05:15Z</timestamp>
      <contributor>
        <ip>Astound-66-216-230-233.mn.astound.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Collision''' is all about the [[Legacy:Unreal Engine|Unreal engine]] deciding when one actor is touching another, and what to do about it if it is. [[Legacy:OCD|OCD]] gives technical lowdown of object collision detection.

Collision properties are under [[Legacy:Actor/Collision|Actor/Collision]]: all [[Legacy:Actor|Actor]]s inherit them, even those that don't need it.

==Types of collision==

Collision properties are mostly booleans, and fall roughly into two groups: Blocking properties (bBlockSomething) and Colliding properties (bCollideSomething). The difference between Blocking and Colliding is that Colliding actors only get a Touch() [[Legacy:Event|event]] when another actor collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

If an actor with bCollideActors = true is spawned on top of another actor with bCollideActors = true, Touch() will be called ''before'' PostBeginPlay(), and possibly before the other initialization functions as well. This can cause a lot of problems, especially if initialization code important to the actor's function is initialized in PostBeginPlay() to be used later in Touch().

==Collision shape==

An actor has to define some sort of shape which it uses to decide whether another actor has collided with it. In [[Legacy:UT|UT]] and prior versions of the engine, this was always a [[Legacy:Collision Cylinder|collision cylinder]], an upright cylinder centered on the actor's location (the position vector in Movement-&gt;Location).

==Related topics==
* [[Legacy:Collision Cylinder|Collision cylinder]]
* Collision actor properties:
** [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]] &amp;ndash; for Unreal and UT
** [[Legacy:Actor/Collision|Actor/Collision]] &amp;ndash; for UT2003 and newer

==Comments ==

'''Rbabiak:''' is there a way to make dynamic collision for a actor. Ie if I had a actor that was a animated door that I wanted block the players passage until at some time I play the animation on it of opening and then allow the player throught.

'''Tarquin:''' AFAIK you can change actor collision props on the fly &amp;ndash; in fact I'm fairly sure I've seen it done on actors that turn themselves off by simply turning off their collision</text>
    </revision>
    <revision>
      <id>2237</id>
      <timestamp>2004-09-26T14:51:46Z</timestamp>
      <contributor>
        <ip>Astound-66-216-230-233.mn.astound.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Collision''' is all about the [[Legacy:Unreal Engine|Unreal engine]] deciding when one actor is touching another, and what to do about it if it is. [[Legacy:OCD|OCD]] gives technical lowdown of object collision detection.

Collision properties are under [[Legacy:Actor/Collision|Actor/Collision]]: all [[Legacy:Actor|Actor]]s inherit them, even those that don't need it.

==Types of collision==

Collision properties are mostly booleans, and fall roughly into two groups: Blocking properties (bBlockSomething) and Colliding properties (bCollideSomething). The difference between Blocking and Colliding is that Colliding actors only get a Touch() [[Legacy:Event|event]] when another actor collides with it; Blocking actors also prevent the other object from moving to that location. Actors can be made to do none, either, or both.

If an actor with bCollideActors = true is spawned on top of another actor with bCollideActors = true, Touch() will be called ''before'' PostBeginPlay(), and possibly before the other initialization functions as well. This can cause a lot of problems, especially if initialization code important to the actor's function is initialized in PostBeginPlay() to be used later in Touch().

==Collision shape==

An actor has to define some sort of shape which it uses to decide whether another actor has collided with it. In [[Legacy:UT|UT]] and prior versions of the engine, this was always a [[Legacy:Collision Cylinder|collision cylinder]], an upright cylinder centered on the actor's location (the position vector in Movement-&gt;Location).

==Related topics==
* [[Legacy:Collision Cylinder|Collision cylinder]]
* Collision actor properties:
** [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]] &amp;ndash; for Unreal and UT
** [[Legacy:Actor/Collision|Actor/Collision]] &amp;ndash; for UT2003 and newer

==External Links==
* [http://udn.epicgames.com/Two/StaticMeshCollisionReference#Static_Mesh_Collision_Reference Static Mesh Collision Reference] &amp;ndash; An excellent document covering the details of collision.

==Comments ==

'''Rbabiak:''' is there a way to make dynamic collision for a actor. Ie if I had a actor that was a animated door that I wanted block the players passage until at some time I play the animation on it of opening and then allow the player throught.

'''Tarquin:''' AFAIK you can change actor collision props on the fly &amp;ndash; in fact I'm fairly sure I've seen it done on actors that turn themselves off by simply turning off their collision</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Collision Cylinder</title>
    <id>688</id>
    <revision>
      <id>2005</id>
      <timestamp>2006-08-16T15:30:12Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">The collision cylinder was the basis of the [[Legacy:Collision|collision]] system in [[Legacy:Unreal Engine Versions|Unreal Engine versions]] up to and including [[Legacy:UT|UT]]. In [[Legacy:UT2003|UT2003]], collision is far more complex, but an actor can still be made to use a collision cylinder by [[Legacy:Set The Following Properties|setting the property]] Collision -&gt; bUseCylinderCollision (see [[Legacy:Actor/Collision|Actor/Collision]] for more). 

==Definition ==

A '''collision cylinder''' is simply an invisible cylinder, centred on the actor's mesh or icon. In pre-2003 versions, every actor has one. This is how the Unreal engine determines whether actors (players, projectiles, pickup, triggers, decoration, etc) touch each other during play, and when to cause one actor to block another.

==Visibility==

To see collision cylinders in UnrealEd, check the [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; ViewRadius item. This setting is independent for each viewport. All selected actors will now display:
* a cylinder made of dotted red lines in 3D viewports
* a circle in top 2D view
* and a rectangle in side and front views (this is the cylinder seen from the side).

==Setting Collision Size==

The collision cylinder is defined by a height and a radius, set in an actor's [[Legacy:Actor (UT)/Collision|collision]] properties. It is always upright, no matter what the actor's orientation. This is somewhat of a drawback, as it means that some actors do not block properly: for example the pipe decoration when used horizontally can't block realistically. It's up to the mapper to work around this limitation.

==Behaviour==

===Basics===

An actor's collision can be set to ''block'' others or ''collide'' with them.

; Block : An actor which blocks prevents other actors from entering its cylinder. Monsters, bots, players and some kinds of decoration can't be walked into and feel solid to the player. 

; Collide : An actor which collides allows other actors to pass through its cylinder, but will be affected by this. For example: a player can walk through a weapon pickup actor. The pickup will make itself disappear and act upon the player to make him receive a weapon. Another example: triggers send out an [[Legacy:Event|event]] to other actors. What happens for both the trigger and the pickup is that the engine calls the Touch() function of the actor.

; Neither : An actor which does neither simply has no effect on other actors which pass through its cylinder. Actors such as Light and ZoneInfo do nothing when another actor passes through them. Some decoration is set to this behaviour, for example the pipe decorations. 

===Mixed Behaviour===
; At least one of the actors does not collide or block. : Nothing is called.
; One of the actors collides, the other blocks or collides. : Both actors have Touch() called.
; Both actors block. : Both actors have Bump() called. Moving actors also have HitWall() called.

Note that behaviour is also dependent on the presence in the actor's class script of Bump() or Touch() functions. Actors such as [[Legacy:Light (UT)|Light (UT)]] do not override the base Actor.Touch() function, and therefore nothing happens when a player walks through a light actor, even if flags have been set in the collision properties.

==Preset blocking actors==

The actors [[Legacy:BlockPlayer|BlockPlayer]], [[Legacy:BlockActor|BlockActor]], [[Legacy:BlockAll|BlockAll]] and new in UT200X, [[Legacy:BlockingVolume|BlockingVolume]] are simply invisible actors with some of the collision properties set, located under Keypoint in the class tree. They're purely a convenience to the mapper; any other actor can be set to perform the same function.

Ways to work around collision orientation:
* Use several BlockAll to make a row of cylinders. This may not feel entirely realistic to the player though.
* prevent the player from touching non-blocking decoration with architecture: eg the solid trim above and below the curved pipes outside the chamber in DM-Pressure.
* Create level geometry with surfaces set to invisible, and make sure it's hollow.

==Related Topics ==
* [[Legacy:Actor/Collision|Actor/Collision]], [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]]: collision properties explained
* [[Legacy:Collision Detection|Collision Detection]]
* [[Legacy:OCD|OCD]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]</text>
    </revision>
    <revision>
      <id>2006</id>
      <timestamp>2006-06-01T10:56:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The collision cylinder was the basis of the [[Legacy:Collision|collision]] system in [[Legacy:Unreal Engine Versions|Unreal Engine versions]] up to and including [[Legacy:UT|UT]]. In [[Legacy:UT2003|UT2003]], collision is far more complex, but an actor can be made to use a collision cylinder by [[Legacy:Set The Following Properties|setting the property]] Collision -&gt; bUseCylinderCollision (see [[Legacy:Actor/Collision|Actor/Collision]] for more). 

==Definition ==

A '''collision cylinder''' is simply an invisible cylinder, centred on the actor's mesh or icon. In pre-2003 versions, every actor has one. This is how the Unreal engine determines whether actors (players, projectiles, pickup, triggers, decoration, etc) touch each other during play, and when to cause one actor to block another.

==Visibility ==

To see collision cylinders in UnrealEd, check the [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; ViewRadius item. This setting is independent for each viewport. All selected actors will now display:
* a cylinder made of dotted red lines in 3D viewports
* a circle in top 2D view
* and a rectangle in side and front views (this is the cylinder seen from the side).

==Setting the cylinder size ==

The collision cylinder is defined by a height and a radius, set in an actor's [[Legacy:Actor (UT)/Collision|collision]] properties. It is always upright, no matter what the actor's orientation. This is somewhat of a drawback, as it means that some actors do not block properly: for example the pipe decoration when used horizontally can't block realistically. It's up to the mapper to work around this limitation.

==Behaviour ==

An actor's collision can be set to ''block'' others or ''collide'' with them.

; Block : An actor which blocks prevents other actors from entering its cylinder. Monsters, bots, players and some kinds of decoration can't be walked into and feel solid to the player. 

; Collide : An actor which collides allows other actors to pass through its cylinder, but will be affected by this. For example: a player can walk through a weapon pickup actor. The pickup will make itself disappear and act upon the player to make him receive a weapon. Another example: triggers send out an [[Legacy:Event|event]] to other actors. What happens for both the trigger and the pickup is that the engine calls the Touch() function of the actor.

; Neither : An actor which does neither simply has no effect on other actors which pass through its cylinder. Actors such as Light and ZoneInfo do nothing when another actor passes through them. Some decoration is set to this behaviour, for example the pipe decorations. 

===Mixed behaviour ===
; at least one of the actors does not collide or block : Nothing is called.
; one of the actors collides, the other blocks or collides : Both actors have Touch() called.
; both actors block : Both actors have Bump() called.

Note that behaviour is also dependent on the presence in the actor's class script of Bump() or Touch() functions. Actors such as [[Legacy:Light (UT)|Light (UT)]] do not override the base Actor.Touch() function, and therefore nothing happens when a player walks through a light actor, even if flags have been set in the collision properties.

==Preset blocking actors (UT) ==

The actors [[Legacy:BlockPlayer|BlockPlayer]], [[Legacy:BlockActor|BlockActor]] and [[Legacy:BlockAll|BlockAll]] are simply invisible actors with some of the collision properties set, located under Keypoint in the class tree. They're purely a convenience to the mapper; any other actor can be set to perform the same function.

Ways to work around collision orientation:
* Use several BlockAll to make a row of cylinders. This may not feel entirely realistic to the player though.
* prevent the player from touching non-blocking decoration with architecture: eg the solid trim above and below the curved pipes outside the chamber in DM-Pressure.
* Create level geometry with surfaces set to invisible, and make sure it's hollow.

==Related Topics ==
* [[Legacy:Actor/Collision|Actor/Collision]], [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]]: collision properties explained
* [[Legacy:Collision Detection|Collision Detection]]
* [[Legacy:OCD|OCD]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]</text>
    </revision>
    <revision>
      <id>2007</id>
      <timestamp>2006-06-03T18:25:44Z</timestamp>
      <contributor>
        <ip>Smattbac</ip>
      </contributor>
      <comment>If both actors block, moving actors also get Hitwall() event.</comment>
      <text xml:space="preserve">The collision cylinder was the basis of the [[Legacy:Collision|collision]] system in [[Legacy:Unreal Engine Versions|Unreal Engine versions]] up to and including [[Legacy:UT|UT]]. In [[Legacy:UT2003|UT2003]], collision is far more complex, but an actor can be made to use a collision cylinder by [[Legacy:Set The Following Properties|setting the property]] Collision -&gt; bUseCylinderCollision (see [[Legacy:Actor/Collision|Actor/Collision]] for more). 

==Definition ==

A '''collision cylinder''' is simply an invisible cylinder, centred on the actor's mesh or icon. In pre-2003 versions, every actor has one. This is how the Unreal engine determines whether actors (players, projectiles, pickup, triggers, decoration, etc) touch each other during play, and when to cause one actor to block another.

==Visibility ==

To see collision cylinders in UnrealEd, check the [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; Actors -&gt; ViewRadius item. This setting is independent for each viewport. All selected actors will now display:
* a cylinder made of dotted red lines in 3D viewports
* a circle in top 2D view
* and a rectangle in side and front views (this is the cylinder seen from the side).

==Setting the cylinder size ==

The collision cylinder is defined by a height and a radius, set in an actor's [[Legacy:Actor (UT)/Collision|collision]] properties. It is always upright, no matter what the actor's orientation. This is somewhat of a drawback, as it means that some actors do not block properly: for example the pipe decoration when used horizontally can't block realistically. It's up to the mapper to work around this limitation.

==Behaviour ==

An actor's collision can be set to ''block'' others or ''collide'' with them.

; Block : An actor which blocks prevents other actors from entering its cylinder. Monsters, bots, players and some kinds of decoration can't be walked into and feel solid to the player. 

; Collide : An actor which collides allows other actors to pass through its cylinder, but will be affected by this. For example: a player can walk through a weapon pickup actor. The pickup will make itself disappear and act upon the player to make him receive a weapon. Another example: triggers send out an [[Legacy:Event|event]] to other actors. What happens for both the trigger and the pickup is that the engine calls the Touch() function of the actor.

; Neither : An actor which does neither simply has no effect on other actors which pass through its cylinder. Actors such as Light and ZoneInfo do nothing when another actor passes through them. Some decoration is set to this behaviour, for example the pipe decorations. 

===Mixed behaviour ===
; at least one of the actors does not collide or block : Nothing is called.
; one of the actors collides, the other blocks or collides : Both actors have Touch() called.
; both actors block : Both actors have Bump() called. Moving actors also have HitWall() called.

Note that behaviour is also dependent on the presence in the actor's class script of Bump() or Touch() functions. Actors such as [[Legacy:Light (UT)|Light (UT)]] do not override the base Actor.Touch() function, and therefore nothing happens when a player walks through a light actor, even if flags have been set in the collision properties.

==Preset blocking actors (UT) ==

The actors [[Legacy:BlockPlayer|BlockPlayer]], [[Legacy:BlockActor|BlockActor]] and [[Legacy:BlockAll|BlockAll]] are simply invisible actors with some of the collision properties set, located under Keypoint in the class tree. They're purely a convenience to the mapper; any other actor can be set to perform the same function.

Ways to work around collision orientation:
* Use several BlockAll to make a row of cylinders. This may not feel entirely realistic to the player though.
* prevent the player from touching non-blocking decoration with architecture: eg the solid trim above and below the curved pipes outside the chamber in DM-Pressure.
* Create level geometry with surfaces set to invisible, and make sure it's hollow.

==Related Topics ==
* [[Legacy:Actor/Collision|Actor/Collision]], [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]]: collision properties explained
* [[Legacy:Collision Detection|Collision Detection]]
* [[Legacy:OCD|OCD]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Color Blending</title>
    <id>709</id>
    <revision>
      <id>2057</id>
      <timestamp>2007-10-03T00:13:02Z</timestamp>
      <contributor>
        <ip>Adsl-76-228-80-94.dsl.pltn13.sbcglobal.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Color blending''' modes (or rendering modes) specify how the color of an individual [[Legacy:Texture|texture]] pixel is merged with the color of the corresponding background pixel it is going to be drawn on.

==Color Blending Modes==

;None: Graphics are not drawn.

;Normal: Every pixel is 100% opaque. If you #EXEC IMPORT it with FLAGS=2, then every pixel that uses the first entry in the pallette will be 100% transparent and the rest will be 100% opaque.

; Masked: The first pixel in the [[Legacy:Palette|palette]] is 100% transparent; all others are 100% opaque.


There is a utility called &quot;[[Legacy:Bright|Bright]]&quot; distributed by Epic, that helps with this. It has a command line option &quot;-pinkmask&quot; that makes all pink pixels (R=255, G=0, B=255) transparent, and all others opaque.

In UT2003 this will only work with 8bit textures.


;Translucent: The brightness of the color determines it's opacity. i.e. 
;* white is 100% opaque
;* a middle bright colour such as grey or medium yellow is partially transparent
;* black is 100% translucent
;:This doesn't work well in some configurations (possibly MacOS + Glide) unless the &lt;tt&gt;#EXEC IMPORT&lt;/tt&gt; also has &lt;tt&gt;FLAGS=2&lt;/tt&gt;. If you plan to draw &lt;tt&gt;STY_Translucent&lt;/tt&gt;, always use &lt;tt&gt;FLAGS=2&lt;/tt&gt;.

;Modulated: Multiplies the destination pixels by the source if the source is darker than 127,127,127. Screens the destination pixels if the source is brighter than 127,127,127. (like the Photoshop &quot;Overlay&quot; mode).  This results in:
;* color 0,0,0 = darken whatever is behind it
;* color 127,127,127 = no change
;* color 255, 255, 255 = brighten whatever is behind it

Additional modes in new engine versions (e.g. UT2003):

;Alpha: Uses an [[Legacy:Alpha Channel|alpha channel]] to determine the translucency of the texture's pixels.

;Additive: Adds the color in the source pixels to the background. A red pixel painted onto a blue background will result in a purple pixel being shown. Additive differs from translucent in that translucent actors will can stack up on the screen and become more opaque, where additive actors will not. For example, if you had 100 red translucent clouds in a row, they would stack up and you would see just red if you looked through all of them at once. If it were additive clouds, they would add their red to the background but stop adding when the red was maxed out (R=255) so you could still see what was behind.

;Subtractive: This is essentially the same as additive, but the source pixels color is subtracted from the background. This is not that useful of a drawtype, but it does have a strong application in making smoke (bluish-white particles set to subtractive make a nice brownish-black color.)

; Particle: only used for [[Legacy:Emitter|Emitter]]s. This causes the Emitter to draw its particles.

; AlphaZ: ''what does this do?''

Opaque is the opposite of translucent; you can't see through something opaque.  If it's 75% opaque (or 25% translucent), it's slightly transparent; you can see through it a slightly. 0% opaque is 100% translucent; it's invisible and not drawn.

&lt;tt&gt;#EXEC IMPORT with FLAGS=2&lt;/tt&gt; is the same as having the texture property flag bTranslucent set within Ued/2. This makes first colour in the palette 100% transparent.

==Usage==

These rendering modes can apply to:

===Canvas===

In [[Legacy:UnrealScript|UnrealScript]], set &lt;tt&gt;[[Legacy:Canvas|Canvas]].Style&lt;/tt&gt;.

===Actor===

For [[Legacy:Actor|Actor]]s, use Display -&gt; Style 

==Styles ==

Declared as an enum in the Actor class.

===UT===

&lt;uscript&gt;
// Style for rendering sprites, meshes.

var(Display) enum ERenderStyle
{
     STY_None,
     STY_Normal,
     STY_Masked,
     STY_Translucent,
     STY_Modulated,
} Style;
&lt;/uscript&gt;

===UT2003===

&lt;uscript&gt;
// Style for rendering sprites, meshes.
var(Display) enum ERenderStyle
{
	STY_None,
	STY_Normal,
	STY_Masked,
	STY_Translucent,
	STY_Modulated,
	STY_Alpha,
	STY_Additive,
	STY_Subtractive,
	STY_Particle,
	STY_AlphaZ,
} Style;
&lt;/uscript&gt;

==Related Topics==
* See [[Legacy:Unreal Coding FAQ|Unreal Coding FAQ]] for more information
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2058</id>
      <timestamp>2006-04-07T08:01:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">'''Color blending''' modes (or rendering modes) specify how the color of an individual [[Legacy:Texture|texture]] pixel is merged with the color of the corresponding background pixel it is going to be drawn on.

==Color Blending Modes==

;None: Graphics are not drawn.

;Normal: Every pixel is 100% opaque. If you #EXEC IMPORT it with FLAGS=2, then every pixel that uses the first entry in the pallette will be 100% transparent and the rest will be 100% opaque.

; Masked: The first pixel in the [[Legacy:Palette|palette]] is 100% transparent; all others are 100% opaque.


There is a utility called &quot;[[Legacy:Bright|Bright]]&quot; distributed by Epic, that helps with this. It has a command line option &quot;-pinkmask&quot; that makes all pink pixels (R=255, G=0, B=255) transparent, and all others opaque.

In UT2003 this will only work with 8bit textures.


;Translucent: The brightness of the color determines it's opacity. i.e. 
;* white is 100% opaque
;* a middle bright colour such as grey or medium yellow is partially transparent
;* black is 100% translucent
;:This doesn't work well in some configurations (possibly MacOS + Glide) unless the &lt;tt&gt;#EXEC IMPORT&lt;/tt&gt; also has &lt;tt&gt;FLAGS=2&lt;/tt&gt;. If you plan to draw &lt;tt&gt;STY_Translucent&lt;/tt&gt;, always use &lt;tt&gt;FLAGS=2&lt;/tt&gt;.

;Modulated: Multiplies the source and destination pixels by 2 (like the Photoshop &quot;Multiply&quot; mode).  This results in:
;* color 0,0,0 = darken whatever is behind it
;* color 127,127,127 = no change
;* color 255, 255, 255 = brighten whatever is behind it

Additional modes in new engine versions (e.g. UT2003):

;Alpha: Uses an [[Legacy:Alpha Channel|alpha channel]] to determine the translucency of the texture's pixels.

;Additive: Adds the color in the source pixels to the background. A red pixel painted onto a blue background will result in a purple pixel being shown. Additive differs from translucent in that translucent actors will can stack up on the screen and become more opaque, where additive actors will not. For example, if you had 100 red translucent clouds in a row, they would stack up and you would see just red if you looked through all of them at once. If it were additive clouds, they would add their red to the background but stop adding when the red was maxed out (R=255) so you could still see what was behind.

;Subtractive: This is essentially the same as additive, but the source pixels color is subtracted from the background. This is not that useful of a drawtype, but it does have a strong application in making smoke (bluish-white particles set to subtractive make a nice brownish-black color.)

; Particle: only used for [[Legacy:Emitter|Emitter]]s. This causes the Emitter to draw its particles.

; AlphaZ: ''what does this do?''

Opaque is the opposite of translucent; you can't see through something opaque.  If it's 75% opaque (or 25% translucent), it's slightly transparent; you can see through it a slightly. 0% opaque is 100% translucent; it's invisible and not drawn.

&lt;tt&gt;#EXEC IMPORT with FLAGS=2&lt;/tt&gt; is the same as having the texture property flag bTranslucent set within Ued/2. This makes first colour in the palette 100% transparent.

==Usage==

These rendering modes can apply to:

===Canvas===

In [[Legacy:UnrealScript|UnrealScript]], set &lt;tt&gt;[[Legacy:Canvas|Canvas]].Style&lt;/tt&gt;.

===Actor===

For [[Legacy:Actor|Actor]]s, use Display -&gt; Style 

==Styles ==

Declared as an enum in the Actor class.

===UT===

&lt;uscript&gt;
// Style for rendering sprites, meshes.

var(Display) enum ERenderStyle
{
     STY_None,
     STY_Normal,
     STY_Masked,
     STY_Translucent,
     STY_Modulated,
} Style;
&lt;/uscript&gt;

===UT2003===

&lt;uscript&gt;
// Style for rendering sprites, meshes.
var(Display) enum ERenderStyle
{
	STY_None,
	STY_Normal,
	STY_Masked,
	STY_Translucent,
	STY_Modulated,
	STY_Alpha,
	STY_Additive,
	STY_Subtractive,
	STY_Particle,
	STY_AlphaZ,
} Style;
&lt;/uscript&gt;

==Related Topics==
* See [[Legacy:Unreal Coding FAQ|Unreal Coding FAQ]] for more information
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Color Operators</title>
    <id>699</id>
    <revision>
      <id>2032</id>
      <timestamp>2004-03-15T18:37:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Useful [[Legacy:Operators|operators]] for the '''color''' [[Legacy:Variable Type|Variable Type]]. This is an example of [[Legacy:Scripting Operators|Scripting Operators]].

See also [[Legacy:RGB To HLS Conversion|RGB to HLS conversion]] and [[Legacy:HLS To RGB Conversion|HLS to RGB conversion]].

Due to the lack of any color operators, let's make a few:

&lt;uscript&gt;
// Lighten color by 1
static final preoperator color ++ ( out color A )
{
  A.R++;
  A.G++;
  A.B++;
  return A;
}
// Darken color by 1
static final preoperator color -- ( out color A )
{
  A.R--;
  A.G--;
  A.B--;
  return A;
}

// Postoperator version
static final postoperator color ++ ( out color A )
{
  local color Copy;
  Copy = A;
  A.R++;
  A.G++;
  A.B++;
  return Copy;
}

// Postoperator version
static final postoperator color -- ( out color A )
{
  local color Copy;
  Copy = A;
  A.R--;
  A.G--;
  A.B--;
  return Copy;
}

// Remember that averaging operator we just used? Now it's suddenly useful, so I've copied it into here
final operator(18) int : ( int A, int B )
{
  return (A + B) / 2;
}

// Interpolate 2 colors
static final operator(22) color Mix ( color A, color B )
{
  local Color Result;
  Result.R = A.R : B.R;
  Result.G = A.G : B.G;
  Result.B = A.B : B.B;
  return Result;
}

// UT Provides a * operator for colors, but no /. Ramp a color by a float
static final operator(16) color / ( color A, float B )
{
  local Color Result;
  Result.R = A.R / B;
  Result.G = A.G / B;
  Result.B = A.B / B;
  return Result;
}

// Same thing, but this one affects the color
static final operator(34) color /= ( out color A, float B )
{
  A = A / B;
  return A;
}

// UT Provides *, not *=, so let's implement it
static final operator(34) color *= ( out color A, float B )
{
  A = A * B;
  return A;
}

// Add a byte value to each component
static final operator(20) color + ( color A, byte B )
{
  local Color Result;
  Result.R = A.R + B;
  Result.G = A.G + B;
  Result.B = A.B + B;
  return Result;
}

// Subtract a byte value to each component
static final operator(20) color - ( color A, byte B )
{
  local Color Result;
  Result.R = A.R - B;
  Result.G = A.G - B;
  Result.B = A.B - B;
  return Result;
}

// Out versions of the operators
static final operator(34) color += ( out color A, byte B )
{
  A = A + B;
  return A;
}

static final operator(34) color -= ( out color A, byte B )
{
  A = A - B;
  return A;
}

// Out version of the operator UT provides
static final operator(34) color += ( out color A, color B )
{
  A = A + B;
  return A;
}

static final operator(34) color -= ( out color A, color B )
{
  A = A - B;
  return A;
}
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Operators|Operators]]</text>
    </revision>
    <revision>
      <id>2033</id>
      <timestamp>2003-08-05T09:14:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an example of [[Legacy:Scripting Operators|Scripting Operators]].

See also [[Legacy:RGB To HLS Conversion|RGB to HLS conversion]] and [[Legacy:HLS To RGB Conversion|HLS to RGB conversion]].

Due to the lack of any color operators, let's make a few:

&lt;uscript&gt;
// Lighten color by 1
static final preoperator color ++ ( out color A )
{
  A.R++;
  A.G++;
  A.B++;
  return A;
}
// Darken color by 1
static final preoperator color -- ( out color A )
{
  A.R--;
  A.G--;
  A.B--;
  return A;
}

// Postoperator version
static final postoperator color ++ ( out color A )
{
  local color Copy;
  Copy = A;
  A.R++;
  A.G++;
  A.B++;
  return Copy;
}

// Postoperator version
static final postoperator color -- ( out color A )
{
  local color Copy;
  Copy = A;
  A.R--;
  A.G--;
  A.B--;
  return Copy;
}

// Remember that averaging operator we just used? Now it's suddenly useful, so I've copied it into here
final operator(18) int : ( int A, int B )
{
  return (A + B) / 2;
}

// Interpolate 2 colors
static final operator(22) color Mix ( color A, color B )
{
  local Color Result;
  Result.R = A.R : B.R;
  Result.G = A.G : B.G;
  Result.B = A.B : B.B;
  return Result;
}

// UT Provides a * operator for colors, but no /. Ramp a color by a float
static final operator(16) color / ( color A, float B )
{
  local Color Result;
  Result.R = A.R / B;
  Result.G = A.G / B;
  Result.B = A.B / B;
  return Result;
}

// Same thing, but this one affects the color
static final operator(34) color /= ( out color A, float B )
{
  A = A / B;
  return A;
}

// UT Provides *, not *=, so let's implement it
static final operator(34) color *= ( out color A, float B )
{
  A = A * B;
  return A;
}

// Add a byte value to each component
static final operator(20) color + ( color A, byte B )
{
  local Color Result;
  Result.R = A.R + B;
  Result.G = A.G + B;
  Result.B = A.B + B;
  return Result;
}

// Subtract a byte value to each component
static final operator(20) color - ( color A, byte B )
{
  local Color Result;
  Result.R = A.R - B;
  Result.G = A.G - B;
  Result.B = A.B - B;
  return Result;
}

// Out versions of the operators
static final operator(34) color += ( out color A, byte B )
{
  A = A + B;
  return A;
}

static final operator(34) color -= ( out color A, byte B )
{
  A = A - B;
  return A;
}

// Out version of the operator UT provides
static final operator(34) color += ( out color A, color B )
{
  A = A + B;
  return A;
}

static final operator(34) color -= ( out color A, color B )
{
  A = A - B;
  return A;
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>2034</id>
      <timestamp>2004-03-15T11:57:42Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Useful operators for the '''color''' [[Legacy:Variable Type|Variable Type]]. This is an example of [[Legacy:Scripting Operators|Scripting Operators]].

See also [[Legacy:RGB To HLS Conversion|RGB to HLS conversion]] and [[Legacy:HLS To RGB Conversion|HLS to RGB conversion]].

Due to the lack of any color operators, let's make a few:

&lt;uscript&gt;
// Lighten color by 1
static final preoperator color ++ ( out color A )
{
  A.R++;
  A.G++;
  A.B++;
  return A;
}
// Darken color by 1
static final preoperator color -- ( out color A )
{
  A.R--;
  A.G--;
  A.B--;
  return A;
}

// Postoperator version
static final postoperator color ++ ( out color A )
{
  local color Copy;
  Copy = A;
  A.R++;
  A.G++;
  A.B++;
  return Copy;
}

// Postoperator version
static final postoperator color -- ( out color A )
{
  local color Copy;
  Copy = A;
  A.R--;
  A.G--;
  A.B--;
  return Copy;
}

// Remember that averaging operator we just used? Now it's suddenly useful, so I've copied it into here
final operator(18) int : ( int A, int B )
{
  return (A + B) / 2;
}

// Interpolate 2 colors
static final operator(22) color Mix ( color A, color B )
{
  local Color Result;
  Result.R = A.R : B.R;
  Result.G = A.G : B.G;
  Result.B = A.B : B.B;
  return Result;
}

// UT Provides a * operator for colors, but no /. Ramp a color by a float
static final operator(16) color / ( color A, float B )
{
  local Color Result;
  Result.R = A.R / B;
  Result.G = A.G / B;
  Result.B = A.B / B;
  return Result;
}

// Same thing, but this one affects the color
static final operator(34) color /= ( out color A, float B )
{
  A = A / B;
  return A;
}

// UT Provides *, not *=, so let's implement it
static final operator(34) color *= ( out color A, float B )
{
  A = A * B;
  return A;
}

// Add a byte value to each component
static final operator(20) color + ( color A, byte B )
{
  local Color Result;
  Result.R = A.R + B;
  Result.G = A.G + B;
  Result.B = A.B + B;
  return Result;
}

// Subtract a byte value to each component
static final operator(20) color - ( color A, byte B )
{
  local Color Result;
  Result.R = A.R - B;
  Result.G = A.G - B;
  Result.B = A.B - B;
  return Result;
}

// Out versions of the operators
static final operator(34) color += ( out color A, byte B )
{
  A = A + B;
  return A;
}

static final operator(34) color -= ( out color A, byte B )
{
  A = A - B;
  return A;
}

// Out version of the operator UT provides
static final operator(34) color += ( out color A, color B )
{
  A = A + B;
  return A;
}

static final operator(34) color -= ( out color A, color B )
{
  A = A - B;
  return A;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Color Selection Dialog</title>
    <id>783</id>
    <revision>
      <id>2224</id>
      <timestamp>2003-02-06T13:19:03Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Basic Color Selection Dialog ===

This class lets you provide color configuration.  I haven't seen too many things that could use it, but who knows...  Anyways, to use it, make a GUIPage, or whatever.  The important point is having a GUILabel on it, and having a LastClicked property.  Before you use OpenMenu to open the Color Chooser, set the LastClicked property of your class to the index in Controls of a GUILabel.  The Color Chooser will initialize itself with the BackColor of this GUILabel, allow the user to edit that color, and then save the selected color back to the GUILabel.  Add some code to load the label BackColor from defaults, and save it to an ini, and you have configurable colors.

&lt;uscript&gt;
class GUIColorEdit extends GUIPage;

var GUILabel SetTo;

function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
	Super.InitComponent(MyController, MyOwner);
	SetTo=GUILabel(ParentPage.Controls[int(ParentPage.GetPropertyText(&quot;LastClicked&quot;))]);
	InitColors();
	return;
}

function bool SetAndClose(GUIComponent Sender)
{
	Controller.CloseMenu(False);
	SetTo.BackColor = GUILabel(Controls[10]).BackColor;
	Return True;
}

function InitColors()
{
	GUILabel(Controls[10]).BackColor=SetTo.BackColor;
	GUISlider(Controls[4]).SetValue(SetTo.BackColor.R);
	GUISlider(Controls[5]).SetValue(SetTo.BackColor.G);
	GUISlider(Controls[6]).SetValue(SetTo.BackColor.B);
	GUINumericEdit(Controls[7]).SetValue(SetTo.BackColor.R);
	GUINumericEdit(Controls[8]).SetValue(SetTo.BackColor.G);
	GUINumericEdit(Controls[9]).SetValue(SetTo.BackColor.B);
}

function OnSliderChange(GUIComponent Sender)
{
	local int i;

	for (i=0; i&lt;Controls.Length; i++)
		if (Controls[i] == Sender)
			break;
	if (i&gt;3 &amp;&amp; i&lt;7)
	{
		GUINumericEdit(Controls[i+3]).SetValue(int(GUISlider(Controls[i]).Value));
		ColorUpdate();
	}
	return;
}

function OnREditChange(GUIComponent Sender)
{
	GUISlider(Controls[4]).SetValue(float(GUINumericEdit(Controls[7]).Value));
	ColorUpdate();
}

function OnGEditChange(GUIComponent Sender)
{
	GUISlider(Controls[5]).SetValue(float(GUINumericEdit(Controls[8]).Value));
	ColorUpdate();
}

function OnBEditChange(GUIComponent Sender)
{
	GUISlider(Controls[6]).SetValue(float(GUINumericEdit(Controls[9]).Value));
	ColorUpdate();
}

function ColorUpdate()
{
	GUILabel(Controls[10]).BackColor.R = int(GUISlider(Controls[4]).Value);
	GUILabel(Controls[10]).BackColor.G = int(GUISlider(Controls[5]).Value);
	GUILabel(Controls[10]).BackColor.B = int(GUISlider(Controls[6]).Value);
	return;
}

defaultproperties
{
	Begin Object Class=GUIButton name=DialogBackground
		WinWidth=1.0
		WinHeight=1.0
		WinTop=0
		WinLeft=0
		bAcceptsInput=false
		bNeverFocus=true
		StyleName=&quot;ComboListBox&quot;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(0)=GUIButton'DialogBackground'
	Begin Object Class=GUILabel name=RLabel
		Caption=&quot;R&quot;
		WinWidth=0.142857
		WinHeight=0.111111
		WinLeft=0.071429
		WinTop=0.055556
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(1)=GUILabel'RLabel'
	Begin Object Class=GUILabel name=GLabel
		Caption=&quot;G&quot;
		WinWidth=0.142857
		WinHeight=0.111111
		WinLeft=0.071429
		WinTop=0.222222
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(2)=GUILabel'GLabel'
	Begin Object Class=GUILabel name=BLabel
		Caption=&quot;B&quot;
		WinWidth=0.142857
		WinHeight=0.111111
		WinLeft=0.071429
		WinTop=0.388889
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(3)=GUILabel'BLabel'
	Begin Object Class=GUISlider name=RSlider
		bIntSlider=True
		MinValue=0
		MaxValue=255
		WinWidth=0.357143
		WinHeight=0.111111
		WinLeft=0.285714
		WinTop=0.055556
		OnChange=OnSliderChange;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(4)=GUISlider'RSlider'
	Begin Object Class=GUISlider name=GSlider
		bIntSlider=True
		MinValue=0
		MaxValue=255
		WinWidth=0.357143
		WinHeight=0.111111
		WinLeft=0.285714
		WinTop=0.222222
		OnChange=OnSliderChange;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(5)=GUISlider'GSlider'
	Begin Object Class=GUISlider name=BSlider
		bIntSlider=True
		MinValue=0
		MaxValue=255
		WinWidth=0.357143
		WinHeight=0.111111
		WinLeft=0.285714
		WinTop=0.388889
		OnChange=OnSliderChange;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(6)=GUISlider'BSlider'
	Begin Object Class=GUINumericEdit name=REdit
		MinValue=0
		MaxValue=255
		Step=1
		WinWidth=0.214286
		WinHeight=0.111111
		WinLeft=0.714286
		WinTop=0.055556
		OnChange=OnREditChange;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(7)=GUINumericEdit'REdit'
	Begin Object Class=GUINumericEdit name=GEdit
		MinValue=0
		MaxValue=255
		Step=1
		WinWidth=0.214286
		WinHeight=0.111111
		WinLeft=0.714286
		WinTop=0.222222
		OnChange=OnGEditChange;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(8)=GUINumericEdit'GEdit'
	Begin Object Class=GUINumericEdit name=BEdit
		MinValue=0
		MaxValue=255
		Step=1
		WinWidth=0.214286
		WinHeight=0.111111
		WinLeft=0.714286
		WinTop=0.388889
		OnChange=OnBEditChange;
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(9)=GUINumericEdit'BEdit'
	Begin Object Class=GUILabel name=ColorBox
		WinWidth=0.857143
		WinHeight=0.222222
		WinLeft=0.071429
		WinTop=0.555556
		bTransparent=False
		bAcceptsInput=False
		bNeverFocus=True
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(10)=GUILabel'ColorBox'
	Begin Object Class=GUIButton name=OkButton
		Caption=&quot;OK&quot;
		WinWidth=0.214286
		WinHeight=0.111111
		WinLeft=0.392857
		WinTop=0.833333
		OnClick=SetAndClose
		bBoundToParent=True
		bScaleToParent=True
	End Object
	Controls(11)=GUIButton'OkButton'
	WinWidth=0.5
	WinHeight=0.5
	WinLeft=0.25
	WinTop=0.25
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ColorModifier</title>
    <id>857</id>
    <revision>
      <id>2389</id>
      <timestamp>2004-03-16T10:56:31Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:Modifier|Modifier]] &gt;&gt; ColorModifier (Package: Engine)}}

A ColorModifier applies a color change to the material specified in the Material property, and displays the result.

; color Color: [[Legacy:Color|Color]] to affect the material.
; bool RenderTwoSided: causes the resulting ColorModifier material to be two-sided if true.
; bool AlphaBlend: if true, the A value of the color affects transparency of the result. For only transparency and no change in the material's color, set R, G and B to 128. Note: transparency does not work on all types of materials, eg [[Legacy:Shader|Shader]]s are not affected by it.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2390</id>
      <timestamp>2004-03-16T10:34:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:Modifier|Modifier]] &gt;&gt; ColorModifier (Package: Engine)}}

; color Color: [[Legacy:Color|Color]] to affect the material.
; bool RenderTwoSided: causes the resulting ColorModifier material to be two-sided if true.
; bool AlphaBlend: if true, the A value of the color affects transparency of the result. For only transparency and no change in the material's color, set R, G and B to 128. Note: transparency does not work on all types of materials, eg [[Legacy:Shader|Shader]]s are not affected by it.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Colors</title>
    <id>721</id>
    <revision>
      <id>2083</id>
      <timestamp>2003-06-17T06:39:04Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Different colors for lights in Unreal and Unreal Tournament. Please add to this list. See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for information on the properties and [[Legacy:Lighting|Lighting]] for other related topics. While you build your level, you may modify the brightness so it will be compatible to your map!

You may add stuff to this database if you want!

See [[Legacy:Texture Package|Texture Package]] for textures grouped by colour.

==Basic lights and Sunlight ==

{|

|-
| colspan=&quot;6&quot; |
===Natural Light ===

|
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Daylight
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |128
|
|
|-
|Dawn
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |30
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk 2
| style=&quot;text-align: right&quot; |192
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |64
|
|
|-
|Natural fog
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |35
| style=&quot;text-align: right&quot; |166
|Fog
|
|-
|Blue Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |170
| style=&quot;text-align: right&quot; |175
|Moonlight
|
|-
|Red Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |175
|Harvest Moon Moonlight
|
|-
|White Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |255
|Snowy Moonlight
|
|-
|Fire
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |21
| style=&quot;text-align: right&quot; |125
|Flame;Using the flicker Light-type works well with this color
|
|-
| colspan=&quot;6&quot; |
===Reds ===
                                  
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Tang Orange
| style=&quot;text-align: right&quot; |200
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |23
|Fog
|
|-
|Blood/Yellow Red
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |14
| style=&quot;text-align: right&quot; |12
|
|
|-
|Lava Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Pink
| style=&quot;text-align: right&quot; |18
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |130
|
|
|-
|Orange Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |0
|
|
|-
|Yellow Orange
| style=&quot;text-align: right&quot; |46
| style=&quot;text-align: right&quot; |33
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Yellow
| style=&quot;text-align: right&quot; |40
| style=&quot;text-align: right&quot; |41
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Red
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Yellow
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |42
| style=&quot;text-align: right&quot; |195
|Fluorescent\Incandescent Lights
|
|-
| colspan=&quot;6&quot; |
===Greens ===
              
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Green (Perfect Green)
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |74
| style=&quot;text-align: right&quot; |31
|
|
|-
|Evergreen
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |0
|
|
|-
|Light Green
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green
| style=&quot;text-align: right&quot; |64
| style=&quot;text-align: right&quot; |134
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green (Alternate)
| style=&quot;text-align: right&quot; |255
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Green Yellow
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |63
| style=&quot;text-align: right&quot; |0
|
|
|-
|Mucky Green
| style=&quot;text-align: right&quot; |50
| style=&quot;text-align: right&quot; |65
| style=&quot;text-align: right&quot; |75
|Water Fog
|
|-
| colspan=&quot;6&quot; |
===Blues ===
                   
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Sea Blue
| style=&quot;text-align: right&quot; |120
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Florescent Purple
| style=&quot;text-align: right&quot; |204
| style=&quot;text-align: right&quot; |186
| style=&quot;text-align: right&quot; |0
|
|
|-
|Deep Purple
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Purple Haze
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |228
| style=&quot;text-align: right&quot; |24
|Fog
|
|-
|Blue/Purple (Indigo)
| style=&quot;text-align: right&quot; |151
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue with some Green
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue (Perfect Blue)
| style=&quot;text-align: right&quot; |44
| style=&quot;text-align: right&quot; |165
| style=&quot;text-align: right&quot; |0
|
|
|-
|Dark Blue/ Purple
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |175
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Blue
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |195
| style=&quot;text-align: right&quot; |195
|Fluorescent Lights
|
|}

Colors partly courtesy of [http://www.unrealized.com Unrealized].

==Distance Fog ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Alpha, Blue, Green, Red
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |'''Distance Fog Values''' &lt;br /&gt;DistanceFogEnd, DistanceFogStart
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Cavern Night Fog
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |6912
| style=&quot;text-align: right&quot; |1024
|In a canyon with water and subtle blue moonlight
|
|-
|Non-Skyboxed sky fog
| colspan=&quot;4&quot; style=&quot;text-align: right&quot; |What ever the color of the distance fog is
| style=&quot;text-align: right&quot; |2
| style=&quot;text-align: right&quot; |1
|Skyboxes
|
|-
|Cavern Smoke
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |71
| style=&quot;text-align: right&quot; |72
| style=&quot;text-align: right&quot; |107
| style=&quot;text-align: right&quot; |5120
| style=&quot;text-align: right&quot; |0
|In caverns with magma
|
|-
|Erie Blackness
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |1024
| style=&quot;text-align: right&quot; |0
|Spooky Situations
|
|-
|Thin Cloud Mist during dawn
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |103
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |135
| style=&quot;text-align: right&quot; |16384
| style=&quot;text-align: right&quot; |0
|Up in the air in the clouds during dawn
|
|}

==Comments ==</text>
    </revision>
    <revision>
      <id>2084</id>
      <timestamp>2003-02-21T23:19:25Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Different colors for lights in Unreal and Unreal Tournament. Please add to this list. See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for information on the properties and [[Legacy:Lighting|Lighting]] for other related topics. While you build your level, you may modify the brightness so it will be compatible to your map!

You may add stuff to this database if you want!

See [[Legacy:Texture Package|Texture Package]] for textures grouped by colour.

==Basic lights and Sunlight ==

{|

|-
| colspan=&quot;6&quot; |
===Natural Light ===

|
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Daylight
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |128
|
|
|-
|Dawn
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |30
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk 2
| style=&quot;text-align: right&quot; |192
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |64
|
|
|-
|Natural fog
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |35
| style=&quot;text-align: right&quot; |166
|Fog
|
|-
|Blue Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |170
| style=&quot;text-align: right&quot; |175
|Moonlight
|
|-
|Red Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |175
|Harvest Moon Moonlight
|
|-
|White Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |255
|Snowy Moonlight
|
|-
|Fire
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |21
| style=&quot;text-align: right&quot; |125
|Flame
|
|-
| colspan=&quot;6&quot; |
===Reds ===
                                  
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Tang Orange
| style=&quot;text-align: right&quot; |200
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |23
|Fog
|
|-
|Blood/Yellow Red
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |14
| style=&quot;text-align: right&quot; |12
|
|
|-
|Lava Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Pink
| style=&quot;text-align: right&quot; |18
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |130
|
|
|-
|Orange Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |0
|
|
|-
|Yellow Orange
| style=&quot;text-align: right&quot; |46
| style=&quot;text-align: right&quot; |33
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Yellow
| style=&quot;text-align: right&quot; |40
| style=&quot;text-align: right&quot; |41
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Red
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Yellow
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |42
| style=&quot;text-align: right&quot; |195
|Fluorescent\Incandescent Lights
|
|-
| colspan=&quot;6&quot; |
===Greens ===
              
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Green (Perfect Green)
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |74
| style=&quot;text-align: right&quot; |31
|
|
|-
|Evergreen
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |0
|
|
|-
|Light Green
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green
| style=&quot;text-align: right&quot; |64
| style=&quot;text-align: right&quot; |134
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green (Alternate)
| style=&quot;text-align: right&quot; |255
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Green Yellow
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |63
| style=&quot;text-align: right&quot; |0
|
|
|-
|Mucky Green
| style=&quot;text-align: right&quot; |50
| style=&quot;text-align: right&quot; |65
| style=&quot;text-align: right&quot; |75
|Water Fog
|
|-
| colspan=&quot;6&quot; |
===Blues ===
                   
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Sea Blue
| style=&quot;text-align: right&quot; |120
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Florescent Purple
| style=&quot;text-align: right&quot; |204
| style=&quot;text-align: right&quot; |186
| style=&quot;text-align: right&quot; |0
|
|
|-
|Deep Purple
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Purple Haze
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |228
| style=&quot;text-align: right&quot; |24
|Fog
|
|-
|Blue/Purple (Indigo)
| style=&quot;text-align: right&quot; |151
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue with some Green
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue (Perfect Blue)
| style=&quot;text-align: right&quot; |44
| style=&quot;text-align: right&quot; |165
| style=&quot;text-align: right&quot; |0
|
|
|-
|Dark Blue/ Purple
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |175
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Blue
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |195
| style=&quot;text-align: right&quot; |195
|Fluorescent Lights
|
|}

Colors partly courtesy of [http://www.unrealized.com Unrealized].

==Distance Fog ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Alpha, Blue, Green, Red
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |'''Distance Fog Values''' &lt;br /&gt;DistanceFogEnd, DistanceFogStart
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|*Cavern Night Fog
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |6912
| style=&quot;text-align: right&quot; |1024
|In a canyon with water and subtle blue moonlight
|
|-
|*Non-Skyboxed sky fog
| colspan=&quot;4&quot; style=&quot;text-align: right&quot; |What ever the color of the distance fog is
| style=&quot;text-align: right&quot; |2
| style=&quot;text-align: right&quot; |1
|Skyboxes
|
|-
|*Cavern Smoke
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |71
| style=&quot;text-align: right&quot; |72
| style=&quot;text-align: right&quot; |107
| style=&quot;text-align: right&quot; |5120
| style=&quot;text-align: right&quot; |0
|In caverns with magma
|
|-
|*Erie Blackness
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |1024
| style=&quot;text-align: right&quot; |0
|Spooky Situations
|
|-
|*Thin Cloud Mist during dawn
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |103
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |135
| style=&quot;text-align: right&quot; |16384
| style=&quot;text-align: right&quot; |0
|Up in the air in the clouds during dawn
|
|}

&lt;nowiki&gt;*&lt;/nowiki&gt; Courtesy of ZxAnPhOrIaN.

==Comments ==</text>
    </revision>
    <revision>
      <id>2085</id>
      <timestamp>2003-06-15T23:12:19Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <comment>Fire :: Using the flicker Light-type works well with this color</comment>
      <text xml:space="preserve">Different colors for lights in Unreal and Unreal Tournament. Please add to this list. See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for information on the properties and [[Legacy:Lighting|Lighting]] for other related topics. While you build your level, you may modify the brightness so it will be compatible to your map!

You may add stuff to this database if you want!

See [[Legacy:Texture Package|Texture Package]] for textures grouped by colour.

==Basic lights and Sunlight ==

{|

|-
| colspan=&quot;6&quot; |
===Natural Light ===

|
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Daylight
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |128
|
|
|-
|Dawn
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |30
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk 2
| style=&quot;text-align: right&quot; |192
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |64
|
|
|-
|Natural fog
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |35
| style=&quot;text-align: right&quot; |166
|Fog
|
|-
|Blue Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |170
| style=&quot;text-align: right&quot; |175
|Moonlight
|
|-
|Red Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |175
|Harvest Moon Moonlight
|
|-
|White Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |255
|Snowy Moonlight
|
|-
|Fire
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |21
| style=&quot;text-align: right&quot; |125
|Flame;Using the flicker Light-type works well with this color
|
|-
| colspan=&quot;6&quot; |
===Reds ===
                                  
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Tang Orange
| style=&quot;text-align: right&quot; |200
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |23
|Fog
|
|-
|Blood/Yellow Red
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |14
| style=&quot;text-align: right&quot; |12
|
|
|-
|Lava Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Pink
| style=&quot;text-align: right&quot; |18
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |130
|
|
|-
|Orange Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |0
|
|
|-
|Yellow Orange
| style=&quot;text-align: right&quot; |46
| style=&quot;text-align: right&quot; |33
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Yellow
| style=&quot;text-align: right&quot; |40
| style=&quot;text-align: right&quot; |41
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Red
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Yellow
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |42
| style=&quot;text-align: right&quot; |195
|Fluorescent\Incandescent Lights
|
|-
| colspan=&quot;6&quot; |
===Greens ===
              
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Green (Perfect Green)
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |74
| style=&quot;text-align: right&quot; |31
|
|
|-
|Evergreen
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |0
|
|
|-
|Light Green
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green
| style=&quot;text-align: right&quot; |64
| style=&quot;text-align: right&quot; |134
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green (Alternate)
| style=&quot;text-align: right&quot; |255
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Green Yellow
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |63
| style=&quot;text-align: right&quot; |0
|
|
|-
|Mucky Green
| style=&quot;text-align: right&quot; |50
| style=&quot;text-align: right&quot; |65
| style=&quot;text-align: right&quot; |75
|Water Fog
|
|-
| colspan=&quot;6&quot; |
===Blues ===
                   
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Sea Blue
| style=&quot;text-align: right&quot; |120
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Florescent Purple
| style=&quot;text-align: right&quot; |204
| style=&quot;text-align: right&quot; |186
| style=&quot;text-align: right&quot; |0
|
|
|-
|Deep Purple
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Purple Haze
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |228
| style=&quot;text-align: right&quot; |24
|Fog
|
|-
|Blue/Purple (Indigo)
| style=&quot;text-align: right&quot; |151
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue with some Green
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue (Perfect Blue)
| style=&quot;text-align: right&quot; |44
| style=&quot;text-align: right&quot; |165
| style=&quot;text-align: right&quot; |0
|
|
|-
|Dark Blue/ Purple
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |175
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Blue
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |195
| style=&quot;text-align: right&quot; |195
|Fluorescent Lights
|
|}

Colors partly courtesy of [http://www.unrealized.com Unrealized].

==Distance Fog ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Alpha, Blue, Green, Red
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |'''Distance Fog Values''' &lt;br /&gt;DistanceFogEnd, DistanceFogStart
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|*Cavern Night Fog
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |6912
| style=&quot;text-align: right&quot; |1024
|In a canyon with water and subtle blue moonlight
|
|-
|*Non-Skyboxed sky fog
| colspan=&quot;4&quot; style=&quot;text-align: right&quot; |What ever the color of the distance fog is
| style=&quot;text-align: right&quot; |2
| style=&quot;text-align: right&quot; |1
|Skyboxes
|
|-
|*Cavern Smoke
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |71
| style=&quot;text-align: right&quot; |72
| style=&quot;text-align: right&quot; |107
| style=&quot;text-align: right&quot; |5120
| style=&quot;text-align: right&quot; |0
|In caverns with magma
|
|-
|*Erie Blackness
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |1024
| style=&quot;text-align: right&quot; |0
|Spooky Situations
|
|-
|*Thin Cloud Mist during dawn
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |103
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |135
| style=&quot;text-align: right&quot; |16384
| style=&quot;text-align: right&quot; |0
|Up in the air in the clouds during dawn
|
|}

&lt;nowiki&gt;*&lt;/nowiki&gt; Courtesy of ZxAnPhOrIaN.

==Comments ==</text>
    </revision>
    <revision>
      <id>34331</id>
      <timestamp>2009-04-08T10:35:28Z</timestamp>
      <contributor>
        <ip>93.97.4.70</ip>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">Different colors for lights in Unreal and Unreal Tournament. Please add to this list. See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for information on the properties and [[Legacy:Lighting|Lighting]] for other related topics. While you build your level, you may modify the brightness so it will be compatible to your map!

You may add stuff to this database if you want!

See [[Legacy:Texture Package|Texture Package]] for textures grouped by colour.

==Basic lights and Sunlight ==

{|

|-
| colspan=&quot;6&quot; |
===Natural Light ===

|
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Daylight
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |128
|
|
|-
|Dawn
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |30
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk 2
| style=&quot;text-align: right&quot; |192
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |64
|
|
|-
|Natural fog
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |35
| style=&quot;text-align: right&quot; |166
|Fog
|
|-
|Blue Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |170
| style=&quot;text-align: right&quot; |175
|Moonlight
|
|-
|Red Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |175
|Harvest Moon Moonlight
|
|-
|White Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |255
|Snowy Moonlight
|
|-
|Fire
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |21
| style=&quot;text-align: right&quot; |125
|Flame;Using the flicker Light-type works well with this color
|
|-
| colspan=&quot;6&quot; |
===Reds ===
                                  
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Tang Orange
| style=&quot;text-align: right&quot; |200
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |23
|Fog
|
|-
|Blood/Yellow Red
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |14
| style=&quot;text-align: right&quot; |12
|
|
|-
|Lava Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Pink
| style=&quot;text-align: right&quot; |18
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |130
|
|
|-
|Orange Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |0
|
|
|-
|Yellow Orange
| style=&quot;text-align: right&quot; |46
| style=&quot;text-align: right&quot; |33
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Yellow
| style=&quot;text-align: right&quot; |40
| style=&quot;text-align: right&quot; |41
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Red
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Yellow
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |42
| style=&quot;text-align: right&quot; |195
|Fluorescent\Incandescent Lights
|
|-
| colspan=&quot;6&quot; |
===Greens ===
              
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Green (Perfect Green)
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |74
| style=&quot;text-align: right&quot; |31
|
|
|-
|Evergreen
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |0
|
|
|-
|Light Green
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green
| style=&quot;text-align: right&quot; |64
| style=&quot;text-align: right&quot; |134
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green (Alternate)
| style=&quot;text-align: right&quot; |255
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Green Yellow
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |63
| style=&quot;text-align: right&quot; |0
|
|
|-
|Mucky Green
| style=&quot;text-align: right&quot; |50
| style=&quot;text-align: right&quot; |65
| style=&quot;text-align: right&quot; |75
|Water Fog
|
|-
| colspan=&quot;6&quot; |
===Blues ===
                   
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Sea Blue
| style=&quot;text-align: right&quot; |120
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Florescent Purple
| style=&quot;text-align: right&quot; |204
| style=&quot;text-align: right&quot; |186
| style=&quot;text-align: right&quot; |0
|
|
|-
|Deep Purple
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Purple Haze
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |228
| style=&quot;text-align: right&quot; |24
|Fog
|
|-
|Blue/Purple (Indigo)
| style=&quot;text-align: right&quot; |151
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue with some Green
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue (Perfect Blue)
| style=&quot;text-align: right&quot; |44
| style=&quot;text-align: right&quot; |165
| style=&quot;text-align: right&quot; |0
|
|
|-
|Dark Blue/ Purple
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |175
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Blue
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |195
| style=&quot;text-align: right&quot; |195
|Fluorescent Lights
|
|}

Colors partly courtesy of [http://www.unrealized.com Unrealized].

==Distance Fog ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Alpha, Blue, Green, Red
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |'''Distance Fog Values''' &lt;br /&gt;DistanceFogEnd, DistanceFogStart
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Cavern Night Fog
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |6912
| style=&quot;text-align: right&quot; |1024
|In a canyon with water and subtle blue moonlight
|
|-
|Non-Skyboxed sky fog
| colspan=&quot;4&quot; style=&quot;text-align: right&quot; |What ever the color of the distance fog is
| style=&quot;text-align: right&quot; |2
| style=&quot;text-align: right&quot; |1
|Skyboxes
|
|-
|Cavern Smoke
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |71
| style=&quot;text-align: right&quot; |72
| style=&quot;text-align: right&quot; |107
| style=&quot;text-align: right&quot; |5120
| style=&quot;text-align: right&quot; |0
|In caverns with magma
|
|-
|Erie Blackness
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |1024
| style=&quot;text-align: right&quot; |0
|Spooky Situations
|
|-
|Thin Cloud Mist during dawn
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |103
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |135
| style=&quot;text-align: right&quot; |16384
| style=&quot;text-align: right&quot; |0
|Up in the air in the clouds during dawn
|
|}

==Comments ==
Pretty useful, Thumbs up to whoever wrote this - Sharkbot</text>
    </revision>
    <revision>
      <id>35489</id>
      <timestamp>2009-10-17T21:21:49Z</timestamp>
      <contributor>
        <username>Rejecht</username>
        <id>1657</id>
      </contributor>
      <comment>/* Added new top section: Colors.  Added same table created for the Actor page as well. */</comment>
      <text xml:space="preserve">Different colors for lights in Unreal and Unreal Tournament. Please add to this list. See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for information on the properties and [[Legacy:Lighting|Lighting]] for other related topics. While you build your level, you may modify the brightness so it will be compatible to your map!

You may add stuff to this database if you want!

See [[Legacy:Texture Package|Texture Package]] for textures grouped by colour.

==Colors==

Colors are most often specified in hue, saturation, and brightness (HSB), but in some contexts in red, green, and blue (RGB).

{| align=&quot;center&quot; style=&quot;font-family: courier, courier new, monospace;&quot;
|+LightBrightness = 255, LightSaturation = 0
!LightHue:!!&amp;nbsp;&amp;nbsp;0!!&amp;nbsp;16!!&amp;nbsp;32!!&amp;nbsp;48!!&amp;nbsp;64!!&amp;nbsp;80!!&amp;nbsp;96!!112!!128!!144!!160!!176!!192!!208!!224!!240!!255
|-
| align=&quot;right&quot; | '''Colour:'''
| style=&quot;background-color:#FF0000;&quot; | &amp;nbsp;
| style=&quot;background-color:#CF2E00;&quot; | &amp;nbsp;
| style=&quot;background-color:#B16700;&quot; | &amp;nbsp;
| style=&quot;background-color:#84A500;&quot; | &amp;nbsp;
| style=&quot;background-color:#42CA00;&quot; | &amp;nbsp;
| style=&quot;background-color:#10F600;&quot; | &amp;nbsp;
| style=&quot;background-color:#00E820;&quot; | &amp;nbsp;
| style=&quot;background-color:#00B255;&quot; | &amp;nbsp;
| style=&quot;background-color:#008388;&quot; | &amp;nbsp;
| style=&quot;background-color:#0052BA;&quot; | &amp;nbsp;
| style=&quot;background-color:#001EEA;&quot; | &amp;nbsp;
| style=&quot;background-color:#1000FE;&quot; | &amp;nbsp;
| style=&quot;background-color:#4200D5;&quot; | &amp;nbsp;
| style=&quot;background-color:#8300A3;&quot; | &amp;nbsp;
| style=&quot;background-color:#B20061;&quot; | &amp;nbsp;
| style=&quot;background-color:#E50030;&quot; | &amp;nbsp;
| style=&quot;background-color:#FF0000;&quot; | &amp;nbsp;
|}

The brightness (LightBrightness) controls the overall intensity or range of the color. The hue (LightHue) specifies the base color. The saturation (LightSaturation) specifies how much white is added to the base color.

==Basic lights and Sunlight ==

{|
|-
| colspan=&quot;6&quot; |
===Natural Light ===

|
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Daylight
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |128
|
|
|-
|Dawn
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |30
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |64
|
|
|-
|Dusk 2
| style=&quot;text-align: right&quot; |192
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |64
|
|
|-
|Natural fog
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |35
| style=&quot;text-align: right&quot; |166
|Fog
|
|-
|Blue Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |170
| style=&quot;text-align: right&quot; |175
|Moonlight
|
|-
|Red Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |175
|Harvest Moon Moonlight
|
|-
|White Moonlight
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |255
|Snowy Moonlight
|
|-
|Fire
| style=&quot;text-align: right&quot; |75
| style=&quot;text-align: right&quot; |21
| style=&quot;text-align: right&quot; |125
|Flame;Using the flicker Light-type works well with this color
|
|-
| colspan=&quot;6&quot; |
===Reds ===
                                  
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Tang Orange
| style=&quot;text-align: right&quot; |200
| style=&quot;text-align: right&quot; |24
| style=&quot;text-align: right&quot; |23
|Fog
|
|-
|Blood/Yellow Red
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |14
| style=&quot;text-align: right&quot; |12
|
|
|-
|Lava Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Pink
| style=&quot;text-align: right&quot; |18
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |130
|
|
|-
|Orange Red
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |20
| style=&quot;text-align: right&quot; |0
|
|
|-
|Yellow Orange
| style=&quot;text-align: right&quot; |46
| style=&quot;text-align: right&quot; |33
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Yellow
| style=&quot;text-align: right&quot; |40
| style=&quot;text-align: right&quot; |41
| style=&quot;text-align: right&quot; |0
|
|
|-
|Perfect Red
| style=&quot;text-align: right&quot; |150
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Yellow
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |42
| style=&quot;text-align: right&quot; |195
|Fluorescent\Incandescent Lights
|
|-
| colspan=&quot;6&quot; |
===Greens ===
              
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Green (Perfect Green)
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |74
| style=&quot;text-align: right&quot; |31
|
|
|-
|Evergreen
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |0
|
|
|-
|Light Green
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green
| style=&quot;text-align: right&quot; |64
| style=&quot;text-align: right&quot; |134
| style=&quot;text-align: right&quot; |0
|
|
|-
|Sea Green (Alternate)
| style=&quot;text-align: right&quot; |255
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Green Yellow
| style=&quot;text-align: right&quot; |51
| style=&quot;text-align: right&quot; |63
| style=&quot;text-align: right&quot; |0
|
|
|-
|Mucky Green
| style=&quot;text-align: right&quot; |50
| style=&quot;text-align: right&quot; |65
| style=&quot;text-align: right&quot; |75
|Water Fog
|
|-
| colspan=&quot;6&quot; |
===Blues ===
                   
|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;3&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Brightness, Hue, Saturation
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Sea Blue
| style=&quot;text-align: right&quot; |120
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Florescent Purple
| style=&quot;text-align: right&quot; |204
| style=&quot;text-align: right&quot; |186
| style=&quot;text-align: right&quot; |0
|
|
|-
|Deep Purple
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Purple Haze
| style=&quot;text-align: right&quot; |102
| style=&quot;text-align: right&quot; |228
| style=&quot;text-align: right&quot; |24
|Fog
|
|-
|Blue/Purple (Indigo)
| style=&quot;text-align: right&quot; |151
| style=&quot;text-align: right&quot; |179
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue with some Green
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |153
| style=&quot;text-align: right&quot; |0
|
|
|-
|Blue (Perfect Blue)
| style=&quot;text-align: right&quot; |44
| style=&quot;text-align: right&quot; |165
| style=&quot;text-align: right&quot; |0
|
|
|-
|Dark Blue/ Purple
| style=&quot;text-align: right&quot; |43
| style=&quot;text-align: right&quot; |175
| style=&quot;text-align: right&quot; |0
|
|
|-
|Subtle Blue
| style=&quot;text-align: right&quot; |125
| style=&quot;text-align: right&quot; |195
| style=&quot;text-align: right&quot; |195
|Fluorescent Lights
|
|}

Colors partly courtesy of [http://www.unrealized.com Unrealized].

==Distance Fog ==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Description'''
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |'''Color Values''' &lt;br /&gt;Alpha, Blue, Green, Red
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |'''Distance Fog Values''' &lt;br /&gt;DistanceFogEnd, DistanceFogStart
| style=&quot;text-align: center&quot; |'''Suggested Applications'''
| style=&quot;text-align: center&quot; |''' Preview''' 
|-
|Cavern Night Fog
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |104
| style=&quot;text-align: right&quot; |6912
| style=&quot;text-align: right&quot; |1024
|In a canyon with water and subtle blue moonlight
|
|-
|Non-Skyboxed sky fog
| colspan=&quot;4&quot; style=&quot;text-align: right&quot; |What ever the color of the distance fog is
| style=&quot;text-align: right&quot; |2
| style=&quot;text-align: right&quot; |1
|Skyboxes
|
|-
|Cavern Smoke
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |71
| style=&quot;text-align: right&quot; |72
| style=&quot;text-align: right&quot; |107
| style=&quot;text-align: right&quot; |5120
| style=&quot;text-align: right&quot; |0
|In caverns with magma
|
|-
|Erie Blackness
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |1024
| style=&quot;text-align: right&quot; |0
|Spooky Situations
|
|-
|Thin Cloud Mist during dawn
| style=&quot;text-align: right&quot; |0
| style=&quot;text-align: right&quot; |103
| style=&quot;text-align: right&quot; |128
| style=&quot;text-align: right&quot; |135
| style=&quot;text-align: right&quot; |16384
| style=&quot;text-align: right&quot; |0
|Up in the air in the clouds during dawn
|
|}

==Comments ==
Pretty useful, Thumbs up to whoever wrote this - Sharkbot</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Combiner</title>
    <id>768</id>
    <revision>
      <id>2192</id>
      <timestamp>2004-10-28T15:30:17Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Filled in Modulate2X and Modulate4X</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; Combiner (Package: Engine)}}

Combines two materials possibly using a third material as mask.

==Properties==
; EAlphaOperation AlphaOperation : Operation used to combine the alpha channels of the materials. See EAlphaOperation enum below.
; EColorOperation CombineOperation : Operation used to combine the RGB channels of the materials. See EColorOperation enum below.
; bool InvertMask : ''Inverts the mask's alpha channel?''
; [[Legacy:Material|Material]] Mask ([[Legacy:Editinline|editinline]]use) : Material used as the mask.
; [[Legacy:Material|Material]] Material1 ([[Legacy:Editinline|editinline]]use) : First material.
; [[Legacy:Material|Material]] Material2 ([[Legacy:Editinline|editinline]]use) : Second material.
; bool Modulate2X / bool Modulate4X : These parameters only have an effect with the CombineOperation is CO_Multiply. These allow you to get a result brighter than either original. Modulate2X doubles the resultant RGB values from the multiplication, and Modulate4X quadruples the resultant RGB values from the multiplication. Modulate4X overrides Modulate2X if both are set to true. 

==Enums==

===EAlphaOperation===
;AO_Use_Mask : Use the mask material's alpha channel as the new alpha channel.
;AO_Multiply : Multiply the alpha channel values of the two materials.
;AO_Add : Add the alpha channel values of the two materials.
;AO_Use_Alpha_From_Material1 : Use the first material's alpha channel as the new alpha channel.
;AO_Use_Alpha_From_Material2 : Use the second material's alpha channel as the new alpha channel.

===EColorOperation===
;CO_Use_Color_From_Material1 : Use only the first material's RGB channels for the resulting material.
;CO_Use_Color_From_Material2 : Use only the second material's RGB channels for the resulting material.
;CO_Multiply : Multiply the RGB values or the two materials. Note that they are multiplied as fractions, with 255 being 1.0 and 0 being 0.0. Thus, the result of any multiplication will be DARKER than either of the originals. (Unless one of the originals is 255, in which case no change will occur.) See also Modulate2X and Modulate4X above.
;CO_Add : Add the RGB values of the two materials.
;CO_Subtract : Subtract the second material's RGB values from the first material's RGB values.
;CO_AlphaBlend_With_Mask : The mask's alpha channel determines, how much of each material is visible. Transparent parts of the mask mean use more of the first material and opaque parts of the mask mean use more of the second material. ''(I think)''
;CO_Add_With_Mask_Modulation : 
;CO_Use_Color_From_Mask : Use the mask material's RGB channels for the resulting material.

==External links==
* [[udn2:MaterialsCombiners]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2193</id>
      <timestamp>2004-03-17T11:24:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; Combiner (Package: Engine)}}

Combines two materials possibly using a third material as mask.

==Properties==
; EAlphaOperation AlphaOperation : Operation used to combine the alpha channels of the materials. See EAlphaOperation enum below.
; EColorOperation CombineOperation : Operation used to combine the RGB channels of the materials. See EColorOperation enum below.
; bool InvertMask : ''Inverts the mask's alpha channel?''
; [[Legacy:Material|Material]] Mask ([[Legacy:Editinline|editinline]]use) : Material used as the mask.
; [[Legacy:Material|Material]] Material1 ([[Legacy:Editinline|editinline]]use) : First material.
; [[Legacy:Material|Material]] Material2 ([[Legacy:Editinline|editinline]]use) : Second material.
; bool Modulate2X : 
; bool Modulate4X : 

==Enums==

===EAlphaOperation===
;AO_Use_Mask : Use the mask material's alpha channel as the new alpha channel.
;AO_Multiply : Multiply the alpha channel values of the two materials.
;AO_Add : Add the alpha channel values of the two materials.
;AO_Use_Alpha_From_Material1 : Use the first material's alpha channel as the new alpha channel.
;AO_Use_Alpha_From_Material2 : Use the second material's alpha channel as the new alpha channel.

===EColorOperation===
;CO_Use_Color_From_Material1 : Use only the first material's RGB channels for the resulting material.
;CO_Use_Color_From_Material2 : Use only the second material's RGB channels for the resulting material.
;CO_Multiply : Multiply the RGB values or the two materials.
;CO_Add : Add the RGB values of the two materials.
;CO_Subtract : Subtract the second material's RGB values from the first material's RGB values.
;CO_AlphaBlend_With_Mask : The mask's alpha channel determines, how much of each material is visible. Transparent parts of the mask mean use more of the first material and opaque parts of the mask mean use more of the second material. ''(I think)''
;CO_Add_With_Mask_Modulation : 
;CO_Use_Color_From_Mask : Use the mask material's RGB channels for the resulting material.

==External links==
* [[udn2:MaterialsCombiners]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Combo</title>
    <id>859</id>
    <revision>
      <id>2393</id>
      <timestamp>2005-12-16T20:11:57Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Combo (Package: XGame)}}

:''You might be looking for [[Legacy:GUIComboBox|GUIComboBox]] or [[Legacy:ShockCombo|ShockCombo]]...''

The parent class of Adrenaline combos. This holds the basic functions for creating and destroying a combo, and also the method for defining the key combination that the player uses to activate a combo.

This works by being spawned by players (in [[Legacy:XPawn|XPawn]]'s DoCombo() function):

&lt;uscript&gt;
CurrentCombo = Spawn( ComboClass, self ); // line 1542
&lt;/uscript&gt;

The combo is spawned, and runs its PostBeginPlay(). This:
# checks its owner is an xPawn. If not, destroys itself
# plays a sound
# displays a combo start effect (class [[Legacy:ComboActivation|ComboActivation]])
# calls StartEffect(), which is specialised for each combo class

The combo's Tick() function handles the remaining adrenaline: when the player's [[Legacy:Controller|controller]]'s adrenaline is down to 0, the combo is destroyed. The Destroyed() function then stops the effect.

The ''Duration'' property in DefaultProperties will destroy this class after 30 seconds, regardless of adrenaline.

'''Tarquin:''' That can't be it, the line is this:

&lt;uscript&gt;
    P.Controller.Adrenaline -= AdrenalineCost*DeltaTime/Duration;
&lt;/uscript&gt;

and I've set AdrenalineCost to zero so that whole line has no effect.

'''Postal:''' Edit the tick, that will do the trick.

'''Tarquin:''' Unfortunately, I don't want to subclass, I want to use the existing combos but without reference to adrenaline. Duration only appears in that line as far as I can tell. Confusing.

==Known Subclasses==
 Combo
   +- [[Legacy:ComboBerserk|ComboBerserk]] (fire rate upgrade)
   +- [[Legacy:ComboDefensive|ComboDefensive]] (health/shield upgrade aka, &quot;Booster&quot;)
   +- [[Legacy:ComboInvis|ComboInvis]] (invisible, or nearly so)
   +- [[Legacy:ComboSpeed|ComboSpeed]] (movement upgrade)

==Related Topics==
* [[Legacy:Adrenaline|Adrenaline]]
* [[Legacy:ComboMessage|ComboMessage]]
* [[Legacy:ComboTrigger|ComboTrigger]] &amp;ndash; an example of messing around with combos.

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Needs typical class page stuff: Property, Function, Event and State definitions, plus proper linkage.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2394</id>
      <timestamp>2004-03-29T10:44:29Z</timestamp>
      <contributor>
        <ip>Dialup-171.75.43.56.Dial1.Washington1.Level3.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Combo (Package: XGame)}}

:''You might be looking for [[Legacy:GUIComboBox|GUIComboBox]] or [[Legacy:ShockCombo|ShockCombo]]...''

The parent class of Adrenaline combos. This holds the basic functions for creating and destroying a combo, and also the method for defining the key combination that the player uses to activate a combo:

This works by being spawned by players (in [[Legacy:XPawn|XPawn]]'s DoCombo() function):

&lt;uscript&gt;
CurrentCombo = Spawn( ComboClass, self ); // line 1542
&lt;/uscript&gt;

The combo is spawned, and runs its PostBeginPlay(). This:
# checks its owner is an xPawn. If not, destroys itself
# plays a sound
# displays a combo start effect (class [[Legacy:ComboActivation|ComboActivation]])
# calls StartEffect(), which is specialised for each combo class

The combo's Tick() function handles the remaining adrenaline: when the player's [[Legacy:Controller|controller]]'s afrenaline is down to 0, the combo is destroyed. The Destroyed() function then stops the effect.

The ''Duration'' property in DefaultProperties will destroy this class after 30 seconds, regardless of adrenaline.

'''Tarquin:''' That can't be it, the line is this:

&lt;uscript&gt;
    P.Controller.Adrenaline -= AdrenalineCost*DeltaTime/Duration;
&lt;/uscript&gt;

and I've set AdrenalineCost to zero so that whole line has no effect.

'''Postal:''' Edit the tick, that will do the trick.

See [[Legacy:ComboTrigger|ComboTrigger]] for an example of messing around with combos.

==Known subclasses==
* [[Legacy:ComboBerserk|ComboBerserk]]
* [[Legacy:ComboDefensive|ComboDefensive]] (Booster: health upgrades_
* [[Legacy:ComboInvis|ComboInvis]]
* [[Legacy:ComboSpeed|ComboSpeed]]

See also [[Legacy:ComboMessage|ComboMessage]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2395</id>
      <timestamp>2004-03-29T12:02:48Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Combo (Package: XGame)}}

:''You might be looking for [[Legacy:GUIComboBox|GUIComboBox]] or [[Legacy:ShockCombo|ShockCombo]]...''

The parent class of Adrenaline combos. This holds the basic functions for creating and destroying a combo, and also the method for defining the key combination that the player uses to activate a combo.

This works by being spawned by players (in [[Legacy:XPawn|XPawn]]'s DoCombo() function):

&lt;uscript&gt;
CurrentCombo = Spawn( ComboClass, self ); // line 1542
&lt;/uscript&gt;

The combo is spawned, and runs its PostBeginPlay(). This:
# checks its owner is an xPawn. If not, destroys itself
# plays a sound
# displays a combo start effect (class [[Legacy:ComboActivation|ComboActivation]])
# calls StartEffect(), which is specialised for each combo class

The combo's Tick() function handles the remaining adrenaline: when the player's [[Legacy:Controller|controller]]'s adrenaline is down to 0, the combo is destroyed. The Destroyed() function then stops the effect.

The ''Duration'' property in DefaultProperties will destroy this class after 30 seconds, regardless of adrenaline.

'''Tarquin:''' That can't be it, the line is this:

&lt;uscript&gt;
    P.Controller.Adrenaline -= AdrenalineCost*DeltaTime/Duration;
&lt;/uscript&gt;

and I've set AdrenalineCost to zero so that whole line has no effect.

'''Postal:''' Edit the tick, that will do the trick.

'''Tarquin:''' Unfortunately, I don't want to subclass, I want to use the existing combos but without reference to adrenaline. Duration only appears in that line as far as I can tell. Confusing.

==Known subclasses==
* [[Legacy:ComboBerserk|ComboBerserk]]
* [[Legacy:ComboDefensive|ComboDefensive]] (Booster: health upgrades)
* [[Legacy:ComboInvis|ComboInvis]]
* [[Legacy:ComboSpeed|ComboSpeed]]

See also [[Legacy:ComboMessage|ComboMessage]]

==Related Topics==

See [[Legacy:ComboTrigger|ComboTrigger]] for an example of messing around with combos.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ComboMessage</title>
    <id>28856</id>
    <revision>
      <id>42783</id>
      <timestamp>2010-03-30T16:19:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ComboTrigger</title>
    <id>860</id>
    <revision>
      <id>2396</id>
      <timestamp>2007-11-18T21:59:31Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; ComboTrigger (custom)}}

A custom trigger class that begins an adrenaline [[Legacy:Combo|Combo]] on the player who touches it.

This class simply demonstrates:
* Working with [[Legacy:Trigger|Trigger]]s
* How combos work (you'll get only the initial effect at your feet if you don't have enough adrenaline)

==Source Code==

&lt;uscript&gt;
//=============================================================================
// ComboTrigger.
//=============================================================================
class ComboTrigger extends Trigger
	placeable;

var Combo myCombo;

function Touch( actor Other )
{
	super.Touch(Other);

	if( IsRelevant( Other ) )
	{
		if( xPawn(Other) != None ) {
			xPawn(Other).Controller.Adrenaline = 1;

			xPawn(Other).DoCombo(class'ComboBerserk');
			myCombo = xPawn(Other).CurrentCombo;
			myCombo.AdrenalineCost = 0;
		}
	}
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Controller|Controller]]
* [[Legacy:Adrenaline|Adrenaline]]

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2397</id>
      <timestamp>2005-12-17T23:15:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; ComboTrigger (custom)}}

A custom trigger class that begins an adrenaline [[Legacy:Combo|Combo]] on the player who touches it.

This class simply demonstrates:
* Working with [[Legacy:Trigger|Trigger]]s
* How combos work (you'll get only the initial effect at your feet if you don't have enough adrenaline)

==Source Code==

&lt;uscript&gt;
//=============================================================================
// ComboTrigger.
//=============================================================================
class ComboTrigger extends Trigger
	placeable;

var Combo myCombo;

function Touch( actor Other )
{
	super.Touch(Other);

	if( IsRelevant( Other ) )
	{
		if( xPawn(Other) != None ) {
			xPawn(Other).Controller.Adrenaline = 1;

			xPawn(Other).DoCombo(class'ComboBerserk');
			myCombo = xPawn(Other).CurrentCombo;
			myCombo.AdrenalineCost = 0;
		}
	}
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Controller|Controller]]
* [[Legacy:Adrenaline|Adrenaline]]

==Discussion==

'''SuperApe:''' I'm sure this page could use some more overview, linkage, etc.  Is it part of the [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]?

'''MythOpus:''' It's just a custom class...

'''SuperApe:''' I guess I'm wondering if it's worth including in [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].  IOW, where are other good places to link from?  I will link from [[Legacy:Adrenaline|Adrenaline]], [[Legacy:Trigger|Trigger]] and [[Legacy:Combo|Combo]].

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CommandLineParams</title>
    <id>793</id>
    <revision>
      <id>2246</id>
      <timestamp>2004-08-25T14:59:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>What is this page about?</comment>
      <text xml:space="preserve">

&lt;uscript line&gt;
//-----------------------------------------------------------
//	Ladder.CommandLineParams
//
//	This class is used to simplify adding command line parameters to Ladder Profiles
//-----------------------------------------------------------
class CommandLineParams extends Info
	config
	abstract
	notplaceable;

var bool				bRejectPlayInfo;
var string 				TeamSymbolData;
var array&lt;string&gt; 		TeamSymbols;
var array&lt;string&gt;		TeamAIClasses;

var private config string 	AdminUserName, AdminPassword, AccessControl, GameRules;
var private config string 	RedTeamAI, BlueTeamAI, RedTeamSymbol, BlueTeamSymbol;
var private config bool 	GameStats, DemoRec, bAutoNumBots, QuickStart;

var localized string 	DisplayText[8];
var localized string 	Extra;

static event bool AcceptPlayInfoProperty(string PropertyName)
{
	return !default.bRejectPlayInfo;
}

static function FillPlayInfo(PlayInfo PI)
{
	local int i;

	Super.FillPlayInfo(PI);
	GenerateTeamSymbolExtras();

	PI.AddSetting(&quot;Command Line&quot;, &quot;GameRules&quot;, 		default.DisplayText[i],   1, i++, &quot;Text&quot;, &quot;16&quot;,&quot;Mu|L|Lm&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;DemoRec&quot;, 		default.DisplayText[i], 100, i++, &quot;Check&quot;,,&quot;L|Lm&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;bAutoNumBots&quot;, 	default.DisplayText[i],   2, i++, &quot;Check&quot;,,&quot;L|Lm|Ms&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;QuickStart&quot;, 	default.DisplayText[i],   2, i++, &quot;Check&quot;,,&quot;L|Lm|Mb&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;RedTeamSymbol&quot;, 	default.DisplayText[i],   1, i++, &quot;Select&quot;, default.TeamSymbolData, &quot;L|Lm&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;BlueTeamSymbol&quot;, default.DisplayText[i],   1,   i, &quot;Select&quot;, default.TeamSymbolData, &quot;L|Lm&quot;);
}

static function GenerateTeamSymbolExtras()
{
	local int i;
	local array&lt;string&gt; Ar;
	local string S;

	Ar = default.TeamSymbols;
	for (i = 0; i &lt; Ar.Length; i++)
	{
		Ar[i] = Ar[i] $ &quot;;&quot; $ ItemName(Ar[i]);
		if (S != &quot;&quot;) S = S $ &quot;;&quot;;
		S = S $ Ar[i];
	}

	default.TeamSymbolData = S;
}

// Same as Actor.GetItemName()  (why didn't they make that function static?)
static function string ItemName(string FullName)
{
	local int pos;

	pos = InStr(FullName, &quot;.&quot;);
	While ( pos != -1 )
	{
		FullName = Right(FullName, Len(FullName) - pos - 1);
		pos = InStr(FullName, &quot;.&quot;);
	}

	return FullName;
}

DefaultProperties
{
	Extra=&quot;UnrealGame.TeamAI;Default AI;UnrealGame.CTFTeamAI;CTF Team AI;UnrealGame.BombingRunTeamAI;BR Team AI;UnrealGame.DOMTeamAI;DOM Team AI;SkaarjPack.InvasionTeamAI;Invasion Team AI&quot;
	TeamSymbols[0]=&quot;TeamSymbols_UT2003.sym02&quot;
	TeamSymbols[1]=&quot;TeamSymbols_UT2003.sym01&quot;
	TeamSymbols[2]=&quot;TeamSymbols_UT2003.Apocalypse&quot;
	TeamSymbols[3]=&quot;TeamSymbols_UT2003.BlackLegion&quot;
	TeamSymbols[4]=&quot;TeamSymbols_UT2003.BoneCrushers&quot;
	TeamSymbols[5]=&quot;TeamSymbols_UT2003.CampingWhores&quot;
	TeamSymbols[6]=&quot;TeamSymbols_UT2003.ChildrenoftheSun&quot;
	TeamSymbols[7]=&quot;TeamSymbols_UT2003.Crusaders&quot;
	TeamSymbols[8]=&quot;TeamSymbols_UT2003.DarkProvince&quot;
	TeamSymbols[9]=&quot;TeamSymbols_UT2003.Demolition&quot;
	TeamSymbols[10]=&quot;TeamSymbols_UT2003.DrunkenMasters&quot;
	TeamSymbols[11]=&quot;TeamSymbols_UT2003.DuneRiders&quot;
	TeamSymbols[12]=&quot;TeamSymbols_UT2003.GearHeads&quot;
	TeamSymbols[13]=&quot;TeamSymbols_UT2003.HappyDead&quot;
	TeamSymbols[14]=&quot;TeamSymbols_UT2003.HappySmooth&quot;
	TeamSymbols[15]=&quot;TeamSymbols_UT2003.HotDog&quot;
	TeamSymbols[16]=&quot;TeamSymbols_UT2003.IronGuard&quot;
	TeamSymbols[17]=&quot;TeamSymbols_UT2003.IronSkull&quot;
	TeamSymbols[18]=&quot;TeamSymbols_UT2003.LordsOfPain&quot;
	TeamSymbols[19]=&quot;TeamSymbols_UT2003.NightStalkers&quot;
	TeamSymbols[20]=&quot;TeamSymbols_UT2003.PainMachine&quot;
	TeamSymbols[21]=&quot;TeamSymbols_UT2003.Roswell&quot;
	TeamSymbols[22]=&quot;TeamSymbols_UT2003.StrangeLove&quot;
	TeamSymbols[23]=&quot;TeamSymbols_UT2003.SunBlades&quot;
	TeamSymbols[24]=&quot;TeamSymbols_UT2003.SuperNova&quot;
	TeamSymbols[25]=&quot;TeamSymbols_UT2003.Turtle&quot;
	TeamSymbols[26]=&quot;TeamSymbols_UT2003.Venom&quot;
	TeamSymbols[27]=&quot;TeamSymbols_UT2003.WrathofGod&quot;
	TeamSymbols[28]=&quot;TeamSymbols_UT2003.Poo&quot;
	TeamSymbols[29]=&quot;TeamSymbols_UT2003.ProfessorDeath&quot;
	TeamSymbols[30]=&quot;TeamSymbols_UT2003.PeePee&quot;
	TeamSymbols[31]=&quot;TeamSymbols_UT2003.PillPoppers&quot;
	TeamSymbols[32]=&quot;TeamSymbols_UT2003.LANplay&quot;
	TeamSymbols[33]=&quot;TeamSymbols_UT2003.sym05&quot;
	TeamSymbols[34]=&quot;TeamSymbols_UT2003.sym06&quot;
	TeamSymbols[35]=&quot;TeamSymbols_UT2003.sym08&quot;
	TeamSymbols[36]=&quot;TeamSymbols_UT2003.sym07&quot;
	TeamSymbols[37]=&quot;TeamSymbols_UT2003.sym03&quot;
	TeamSymbols[38]=&quot;TeamSymbols_UT2003.sym09&quot;
	TeamSymbols[39]=&quot;TeamSymbols_UT2003.sym04&quot;
	TeamSymbols[40]=&quot;TeamSymbols_UT2003.sym10&quot;
	TeamSymbols[41]=&quot;TeamSymbols_UT2003.sym11&quot;
	TeamSymbols[42]=&quot;TeamSymbols_UT2003.sym12&quot;
	TeamSymbols[43]=&quot;TeamSymbols_UT2003.sym13&quot;
	TeamSymbols[44]=&quot;TeamSymbols_UT2003.sym14&quot;
	TeamSymbols[45]=&quot;TeamSymbols_UT2003.sym16&quot;
	TeamSymbols[46]=&quot;TeamSymbols_UT2003.sym15&quot;
	TeamSymbols[47]=&quot;TeamSymbols_UT2003.Warcry&quot;
	TeamSymbols[48]=&quot;TeamSymbols_UT2003.BloodFists&quot;
	TeamSymbols[49]=&quot;TeamSymbols_UT2003.DragonBreath&quot;
	TeamSymbols[50]=&quot;TeamSymbols_UT2003.ColdSteel&quot;
	TeamSymbols[51]=&quot;TeamSymbols_UT2003.sym18&quot;
	TeamSymbols[52]=&quot;TeamSymbols_UT2003.sym17&quot;
	TeamSymbols[53]=&quot;TeamSymbols_UT2003.sym19&quot;
	TeamSymbols[54]=&quot;TeamSymbols_UT2003.ZPenguin&quot;
	TeamSymbols[55]=&quot;TeamSymbols.LinkBeaconT&quot;
	TeamSymbols[56]=&quot;TeamSymbols.TeamBeaconT&quot;
	DisplayText(0)=&quot;Game Rule Mutators&quot;
	DisplayText(1)=&quot;Enable Server Demos&quot;
	DisplayText(2)=&quot;Per-map minimum players&quot;
	DisplayText(3)=&quot;Allow bots to begin match&quot;
	DisplayText(4)=&quot;AI for Red team&quot;
	DisplayText(5)=&quot;AI for Blue team&quot;
	DisplayText(6)=&quot;Red Team Symbol&quot;
	DisplayText(7)=&quot;Blue Team Symbol&quot;
}&lt;/uscript&gt;

'''Tarquin:''' What is this page about?</text>
    </revision>
    <revision>
      <id>2247</id>
      <timestamp>2003-03-19T23:28:30Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>Archiving my current project</comment>
      <text xml:space="preserve">&lt;uscript line&gt;
//-----------------------------------------------------------
//	Ladder.CommandLineParams
//
//	This class is used to simplify adding command line parameters to Ladder Profiles
//-----------------------------------------------------------
class CommandLineParams extends Info
	config
	abstract
	notplaceable;

var bool				bRejectPlayInfo;
var string 				TeamSymbolData;
var array&lt;string&gt; 		TeamSymbols;
var array&lt;string&gt;		TeamAIClasses;

var private config string 	AdminUserName, AdminPassword, AccessControl, GameRules;
var private config string 	RedTeamAI, BlueTeamAI, RedTeamSymbol, BlueTeamSymbol;
var private config bool 	GameStats, DemoRec, bAutoNumBots, QuickStart;

var localized string 	DisplayText[8];
var localized string 	Extra;

static event bool AcceptPlayInfoProperty(string PropertyName)
{
	return !default.bRejectPlayInfo;
}

static function FillPlayInfo(PlayInfo PI)
{
	local int i;

	Super.FillPlayInfo(PI);
	GenerateTeamSymbolExtras();

	PI.AddSetting(&quot;Command Line&quot;, &quot;GameRules&quot;, 		default.DisplayText[i],   1, i++, &quot;Text&quot;, &quot;16&quot;,&quot;Mu|L|Lm&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;DemoRec&quot;, 		default.DisplayText[i], 100, i++, &quot;Check&quot;,,&quot;L|Lm&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;bAutoNumBots&quot;, 	default.DisplayText[i],   2, i++, &quot;Check&quot;,,&quot;L|Lm|Ms&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;QuickStart&quot;, 	default.DisplayText[i],   2, i++, &quot;Check&quot;,,&quot;L|Lm|Mb&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;RedTeamSymbol&quot;, 	default.DisplayText[i],   1, i++, &quot;Select&quot;, default.TeamSymbolData, &quot;L|Lm&quot;);
	PI.AddSetting(&quot;Command Line&quot;, &quot;BlueTeamSymbol&quot;, default.DisplayText[i],   1,   i, &quot;Select&quot;, default.TeamSymbolData, &quot;L|Lm&quot;);
}

static function GenerateTeamSymbolExtras()
{
	local int i;
	local array&lt;string&gt; Ar;
	local string S;

	Ar = default.TeamSymbols;
	for (i = 0; i &lt; Ar.Length; i++)
	{
		Ar[i] = Ar[i] $ &quot;;&quot; $ ItemName(Ar[i]);
		if (S != &quot;&quot;) S = S $ &quot;;&quot;;
		S = S $ Ar[i];
	}

	default.TeamSymbolData = S;
}

// Same as Actor.GetItemName()  (why didn't they make that function static?)
static function string ItemName(string FullName)
{
	local int pos;

	pos = InStr(FullName, &quot;.&quot;);
	While ( pos != -1 )
	{
		FullName = Right(FullName, Len(FullName) - pos - 1);
		pos = InStr(FullName, &quot;.&quot;);
	}

	return FullName;
}

DefaultProperties
{
	Extra=&quot;UnrealGame.TeamAI;Default AI;UnrealGame.CTFTeamAI;CTF Team AI;UnrealGame.BombingRunTeamAI;BR Team AI;UnrealGame.DOMTeamAI;DOM Team AI;SkaarjPack.InvasionTeamAI;Invasion Team AI&quot;
	TeamSymbols[0]=&quot;TeamSymbols_UT2003.sym02&quot;
	TeamSymbols[1]=&quot;TeamSymbols_UT2003.sym01&quot;
	TeamSymbols[2]=&quot;TeamSymbols_UT2003.Apocalypse&quot;
	TeamSymbols[3]=&quot;TeamSymbols_UT2003.BlackLegion&quot;
	TeamSymbols[4]=&quot;TeamSymbols_UT2003.BoneCrushers&quot;
	TeamSymbols[5]=&quot;TeamSymbols_UT2003.CampingWhores&quot;
	TeamSymbols[6]=&quot;TeamSymbols_UT2003.ChildrenoftheSun&quot;
	TeamSymbols[7]=&quot;TeamSymbols_UT2003.Crusaders&quot;
	TeamSymbols[8]=&quot;TeamSymbols_UT2003.DarkProvince&quot;
	TeamSymbols[9]=&quot;TeamSymbols_UT2003.Demolition&quot;
	TeamSymbols[10]=&quot;TeamSymbols_UT2003.DrunkenMasters&quot;
	TeamSymbols[11]=&quot;TeamSymbols_UT2003.DuneRiders&quot;
	TeamSymbols[12]=&quot;TeamSymbols_UT2003.GearHeads&quot;
	TeamSymbols[13]=&quot;TeamSymbols_UT2003.HappyDead&quot;
	TeamSymbols[14]=&quot;TeamSymbols_UT2003.HappySmooth&quot;
	TeamSymbols[15]=&quot;TeamSymbols_UT2003.HotDog&quot;
	TeamSymbols[16]=&quot;TeamSymbols_UT2003.IronGuard&quot;
	TeamSymbols[17]=&quot;TeamSymbols_UT2003.IronSkull&quot;
	TeamSymbols[18]=&quot;TeamSymbols_UT2003.LordsOfPain&quot;
	TeamSymbols[19]=&quot;TeamSymbols_UT2003.NightStalkers&quot;
	TeamSymbols[20]=&quot;TeamSymbols_UT2003.PainMachine&quot;
	TeamSymbols[21]=&quot;TeamSymbols_UT2003.Roswell&quot;
	TeamSymbols[22]=&quot;TeamSymbols_UT2003.StrangeLove&quot;
	TeamSymbols[23]=&quot;TeamSymbols_UT2003.SunBlades&quot;
	TeamSymbols[24]=&quot;TeamSymbols_UT2003.SuperNova&quot;
	TeamSymbols[25]=&quot;TeamSymbols_UT2003.Turtle&quot;
	TeamSymbols[26]=&quot;TeamSymbols_UT2003.Venom&quot;
	TeamSymbols[27]=&quot;TeamSymbols_UT2003.WrathofGod&quot;
	TeamSymbols[28]=&quot;TeamSymbols_UT2003.Poo&quot;
	TeamSymbols[29]=&quot;TeamSymbols_UT2003.ProfessorDeath&quot;
	TeamSymbols[30]=&quot;TeamSymbols_UT2003.PeePee&quot;
	TeamSymbols[31]=&quot;TeamSymbols_UT2003.PillPoppers&quot;
	TeamSymbols[32]=&quot;TeamSymbols_UT2003.LANplay&quot;
	TeamSymbols[33]=&quot;TeamSymbols_UT2003.sym05&quot;
	TeamSymbols[34]=&quot;TeamSymbols_UT2003.sym06&quot;
	TeamSymbols[35]=&quot;TeamSymbols_UT2003.sym08&quot;
	TeamSymbols[36]=&quot;TeamSymbols_UT2003.sym07&quot;
	TeamSymbols[37]=&quot;TeamSymbols_UT2003.sym03&quot;
	TeamSymbols[38]=&quot;TeamSymbols_UT2003.sym09&quot;
	TeamSymbols[39]=&quot;TeamSymbols_UT2003.sym04&quot;
	TeamSymbols[40]=&quot;TeamSymbols_UT2003.sym10&quot;
	TeamSymbols[41]=&quot;TeamSymbols_UT2003.sym11&quot;
	TeamSymbols[42]=&quot;TeamSymbols_UT2003.sym12&quot;
	TeamSymbols[43]=&quot;TeamSymbols_UT2003.sym13&quot;
	TeamSymbols[44]=&quot;TeamSymbols_UT2003.sym14&quot;
	TeamSymbols[45]=&quot;TeamSymbols_UT2003.sym16&quot;
	TeamSymbols[46]=&quot;TeamSymbols_UT2003.sym15&quot;
	TeamSymbols[47]=&quot;TeamSymbols_UT2003.Warcry&quot;
	TeamSymbols[48]=&quot;TeamSymbols_UT2003.BloodFists&quot;
	TeamSymbols[49]=&quot;TeamSymbols_UT2003.DragonBreath&quot;
	TeamSymbols[50]=&quot;TeamSymbols_UT2003.ColdSteel&quot;
	TeamSymbols[51]=&quot;TeamSymbols_UT2003.sym18&quot;
	TeamSymbols[52]=&quot;TeamSymbols_UT2003.sym17&quot;
	TeamSymbols[53]=&quot;TeamSymbols_UT2003.sym19&quot;
	TeamSymbols[54]=&quot;TeamSymbols_UT2003.ZPenguin&quot;
	TeamSymbols[55]=&quot;TeamSymbols.LinkBeaconT&quot;
	TeamSymbols[56]=&quot;TeamSymbols.TeamBeaconT&quot;
	DisplayText(0)=&quot;Game Rule Mutators&quot;
	DisplayText(1)=&quot;Enable Server Demos&quot;
	DisplayText(2)=&quot;Per-map minimum players&quot;
	DisplayText(3)=&quot;Allow bots to begin match&quot;
	DisplayText(4)=&quot;AI for Red team&quot;
	DisplayText(5)=&quot;AI for Blue team&quot;
	DisplayText(6)=&quot;Red Team Symbol&quot;
	DisplayText(7)=&quot;Blue Team Symbol&quot;
}&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Commandlet</title>
    <id>690</id>
    <revision>
      <id>2011</id>
      <timestamp>2007-12-08T19:19:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>info about running commandlets in UT3</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] / [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Commandlet (Package: Core)}}

UnrealScript Commandlet (command-line applet) class.

In UnrealEngine generations 1 and 2, commandlets are executed from the ucc.exe command line utility, using the following syntax:
 UCC.exe package_name.commandlet_class_name [parm=value]...

for example:
 UCC.exe Core.HelloWorldCommandlet
 UCC.exe Editor.MakeCommandlet

In addition, if you list your commandlet in the public section of your package's [[Legacy:INT File|INT file]] (see Engine.int for example), then your commandlet can be executed without requiring a fully qualified name, for example:
 UCC.exe MakeCommandlet

As a convenience, if a user tries to run a commandlet and the exact name he types isn't found, then ucc.exe appends the text &quot;commandlet&quot; onto the name and tries again.  Therefore, the following shortcuts perform identically to the above:
 UCC.exe Core.HelloWorld
 UCC.exe Editor.Make
 UCC.exe Make

In [[Legacy:UT3|UT3]] you need to use UT3.exe with the parameter &quot;run&quot;, since UCC.exe no longer exists. Note that the game only appears to load commandlets from packages that reside in the game's installation directory, not the &quot;My Games\Unreal Tournament 3&quot; directory.

It is perfectly valid to call the Main method of a commandlet class directly, for example from within the body of another commandlet.

Commandlets are executed in a &quot;raw&quot; UnrealScript environment, in which the game isn't loaded, the client code isn't loaded, no levels are loaded, and no actors exist.

You can load objects from [[Legacy:Package|package]]s. (e.g. levels, sound packages or code packages, this includes actors used in maps) However, you can only create non-[[Legacy:Actor|Actor]] objects because otherwise UCC exits with a general protection fault since there's no level to put the actor in.

This example loads a map and prints out the map's name and author:

&lt;uscript&gt;
class SandboxCommandlet extends Commandlet;

function int Main(string TextParameters) {
  
  local LevelInfo LevelInfo;
  LevelInfo = LevelInfo(DynamicLoadObject(TextParameters $ &quot;.LevelInfo0&quot;, class 'LevelInfo'));

  Log(&quot;Information about&quot; @ TextParameters $ &quot;:&quot;);
  Log(&quot;  Title: &quot; @ LevelInfo.Title);
  Log(&quot;  Author:&quot; @ LevelInfo.Author);
  }
&lt;/uscript&gt;

Output:

{|

|-
|
&lt;pre&gt;
{{innerbox| ucc Sandbox.SandboxCommandlet CTF-Face
}}

----
ucc.exe: UnrealOS execution environment
Copyright 1999 Epic Games Inc
----

Executing Class Sandbox.SandboxCommandlet
Information about CTF-Face:
  Title:  Facing Worlds
  Author: Cedric 'Inoxx' Fiorentino
&lt;/pre&gt;

|}

==Properties ==
; string HelpCmd (localized) : Command name to show for &quot;ucc help&quot;.
; string HelpOneLiner (localized) : Command description to show for &quot;ucc help&quot;.
; string HelpUsage (localized) : Usage template to show for &quot;ucc help&quot;.
; string HelpWebLink (localized) : Hyperlink for more info.
; string HelpParm[16], HelpDesc[16] (localized) : Parameters and descriptions for &quot;ucc help &lt;this command&gt;&quot;.
; bool LogToStdout : Whether to redirect log output to console stdout. (default is true)
; bool IsServer, IsClient, IsEditor : Whether to load objects required in server, client, and editor context. (default is true for all)
; bool LazyLoad : Whether to load objects immediately, or only on demand. (default is true)
; bool ShowErrorCount : Whether to show standard error and warning count on exit. All calls to Warn() and certain calls to Log() are counted as warnings, e.g.: &lt;uscript&gt;
log(&quot;a warning&quot;, 'Error');
log(&quot;another warning&quot;, 'Warning');
warn(&quot;and another one&quot;);
&lt;/uscript&gt; (default is false)
; bool ShowBanner : Whether to show Unreal banner on startup. (default is true)

==Methods ==
; int Main(string Parms) (native) : The main function. Put your code here. (This function is only declared as native event, not as final.)

==Sample Commandlet ==

This is an example included in the ''Core'' package of [[Legacy:UT|UT]].

&lt;uscript&gt;
//=============================================================================
/// UnrealScript &quot;hello world&quot; sample Commandlet.
///
/// Usage:
///     ucc.exe HelloWorld
//=============================================================================
class HelloWorldCommandlet
    extends Commandlet;

var int intparm;
var string strparm;

function int Main( string Parms )
{
    log( &quot;Hello, world!&quot; );
    if( Parms!=&quot;&quot; )
        log( &quot;Command line parameters=&quot; $ Parms );
    if( intparm!=0 )
        log( &quot;You specified intparm=&quot; $ intparm );
    if( strparm!=&quot;&quot; )
        log( &quot;You specified strparm=&quot; $ strparm );
}

defaultproperties
{
     HelpCmd=&quot;HelloWorld&quot;
     HelpOneLiner=&quot;Sample&quot;
     HelpUsage=&quot;HelloWorld&quot;
     HelpParm(0)=&quot;IntParm&quot;
     HelpParm(1)=&quot;StrParm&quot;
     HelpDesc(0)=&quot;An integer parameter&quot;
     HelpDesc(1)=&quot;A string parameter&quot;
}
&lt;/uscript&gt;

You can run this commandlet with:
 UCC Core.HelloWorld intparm=123 strparm=bla bla
 UCC Core.HelloWorld intparm=123 strparm=&quot;bla bla&quot;

Note: The first one returns only &quot;bla&quot; as ''strparm'', the second one prints out the full string.

==Returning values from ucc executable==

The return value from event Main() is not used. If ShowErrorCount = True it will return 1 if ErrorCount != 0. To create an error you can simply do:

&lt;uscript&gt;Log(&quot;Bla&quot;, 'Error');&lt;/uscript&gt;

==Known Subclasses ==

===UnrealScript Commandlets ===

(not available in [[Legacy:UT2003|UT2003]])
* HelloWorldCommandlet &amp;ndash; example commandlet (see above)
* SimpleCommandlet &amp;ndash; a test commandlet

===Native Commandlets ===
* [[Legacy:BatchExportCommandlet|BatchExportCommandlet]] &amp;ndash; exports objects from packages
* CheckSumCommandlet
* ChecksumPackageCommandlet
* CheckUnicodeCommandlet
* CompressCommandlet
* ConformCommandlet &amp;ndash; used to make packages network-compatible
* DataRipCommandlet
* MakeCommandlet &amp;ndash; [[Legacy:Compiling With UCC|Compiles]] UnrealScript sources to .u files
* MasterCommandlet &amp;ndash; can be used to build [[Legacy:UMOD|UMOD]] installer files
* MasterServerCommandlet
* MergeDXTCommandlet
* PackageFlagCommandlet
* PS2ConvertCommandlet
* ServerCommandlet &amp;ndash; Runs a [[Legacy:Running A Dedicated Server With UCC|dedicated server]]
* UpdateServerCommandlet
* UpdateUModCommandlet &amp;ndash; can list or modify the content of a [[Legacy:UMOD|UMOD]] file

===[[Legacy:UT2003|UT2003]] And Above===
* AnalyzeBuildCommandlet &amp;ndash; prints out the content of all packages (only execute if you have lots of time ;))
* AnalyzePackageCommandlet &amp;ndash; prints out information about memory usage of a package (e.g. maps)
* ConvertMaterialCommandlet
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]] &amp;ndash; dumps all localized variables to an .int file (back up the existing .int first!)
* [[Legacy:MasterMD5Commandlet|MasterMD5Commandlet]] &amp;ndash; handles the md5 table for package security
* UTVCommandlet &amp;ndash; used for [[Legacy:Running A UTV Proxy Server|running a UTV proxy server]] (requires UTV to be installed, see the [http://unreal.epicgames.com/ Unreal Tech Page])

(the following are not specified in the .int files, so you need to explicitely specify the package)
* Editor.[[Legacy:BatchImportCommandlet|BatchImportCommandlet]] &amp;ndash; opposite of [[Legacy:BatchExportCommandlet|BatchExportCommandlet]]
* Editor.CheckUnicodeCommandlet
* Editor.CompareIntCommandlet
* Editor.[[Legacy:CutDownContentCommandlet|CutDownContentCommandlet]]
* Editor.StripSourceCommandlet &amp;ndash; please be nice and ''don't'' use it

===[[Legacy:UT2004|UT2004]] Only===
* DumpConfigCommandlet &amp;ndash; Dumps the default configuration of all classes in all loadable U files to Dump*.ini
* [[Legacy:ExportCacheCommandlet|ExportCacheCommandlet]] &amp;ndash; Exports the cacheable class properties from the specified package files.
* GroupRepairCommandlet
* MapConvertCommandlet
* MergeIntCommandlet
* RearrangeIntCommandlet
* RebuildCommandlet
* TextureInfoCommandlet
* TextureLODCommandlet
* TextureStripCommandlet
* UModUnpackCommandlet

(incomplete list, some may need a package name specified)

(the following are not specified in the .int files, so you need to explicitely specify the package)
* Editor.CheckTexturesCommandlet &amp;ndash; Checks for corrupted textures in texture packages

===[[Legacy:UT3|UT3]] Only===

Run UT3.exe with commandline parameter &quot;help list&quot; if you need a list with commandlets in UE3.

==Discussion==

'''MythOpus:''' So you can create Commandlet's with Uscript?  I was wondering if that means you can create a custom commandlet that would delete a specified file and then rebuild it...

'''Wormbo:''' Commandlets can use the same features like any other UnrealScript class, except that there's no game environment to spawn actors in. In other words: Except for writing to the main log file there's nothing a commandlet can do to the file system.

'''DaWrecka:''' So you couldn't write a commandlet that would, for example, alter the LightBrightness of every light in a passed .UT2 (for use in a Darkmatch gametype) and save it with a new filename?

'''T-1:''' Hey, Wrecka. You might be able to save the information in a log file and then have a stand-alone program that strips the log information. There was a mod utility that did this, IIRC.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2012</id>
      <timestamp>2007-11-22T17:58:43Z</timestamp>
      <contributor>
        <ip>Jan</ip>
      </contributor>
      <comment>info about ut3 commandlets added</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] / [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Commandlet (Package: Core)}}

UnrealScript Commandlet (command-line applet) class.

Commandlets are executed from the ucc.exe command line utility, using the following syntax:
 UCC.exe package_name.commandlet_class_name [parm=value]...

for example:
 UCC.exe Core.HelloWorldCommandlet
 UCC.exe Editor.MakeCommandlet

In addition, if you list your commandlet in the public section of your package's [[Legacy:INT File|INT file]] (see Engine.int for example), then your commandlet can be executed without requiring a fully qualified name, for example:
 UCC.exe MakeCommandlet

As a convenience, if a user tries to run a commandlet and the exact name he types isn't found, then ucc.exe appends the text &quot;commandlet&quot; onto the name and tries again.  Therefore, the following shortcuts perform identically to the above:
 UCC.exe Core.HelloWorld
 UCC.exe Editor.Make
 UCC.exe Make

It is also perfectly valid to call the Main method of a commandlet class directly, for example from within the body of another commandlet.

Commandlets are executed in a &quot;raw&quot; UnrealScript environment, in which the game isn't loaded, the client code isn't loaded, no levels are loaded, and no actors exist.

You can load objects from [[Legacy:Package|package]]s. (e.g. levels, sound packages or code packages, this includes actors used in maps) However, you can only create non-[[Legacy:Actor|Actor]] objects because otherwise UCC exits with a general protection fault since there's no level to put the actor in.

This example loads a map and prints out the map's name and author:

&lt;uscript&gt;
class SandboxCommandlet extends Commandlet;

function int Main(string TextParameters) {
  
  local LevelInfo LevelInfo;
  LevelInfo = LevelInfo(DynamicLoadObject(TextParameters $ &quot;.LevelInfo0&quot;, class 'LevelInfo'));

  Log(&quot;Information about&quot; @ TextParameters $ &quot;:&quot;);
  Log(&quot;  Title: &quot; @ LevelInfo.Title);
  Log(&quot;  Author:&quot; @ LevelInfo.Author);
  }
&lt;/uscript&gt;

Output:

{|

|-
|
&lt;pre&gt;
{{innerbox| ucc Sandbox.SandboxCommandlet CTF-Face
}}

----
ucc.exe: UnrealOS execution environment
Copyright 1999 Epic Games Inc
----

Executing Class Sandbox.SandboxCommandlet
Information about CTF-Face:
  Title:  Facing Worlds
  Author: Cedric 'Inoxx' Fiorentino
&lt;/pre&gt;

|}

==Properties ==
; string HelpCmd (localized) : Command name to show for &quot;ucc help&quot;.
; string HelpOneLiner (localized) : Command description to show for &quot;ucc help&quot;.
; string HelpUsage (localized) : Usage template to show for &quot;ucc help&quot;.
; string HelpWebLink (localized) : Hyperlink for more info.
; string HelpParm[16], HelpDesc[16] (localized) : Parameters and descriptions for &quot;ucc help &lt;this command&gt;&quot;.
; bool LogToStdout : Whether to redirect log output to console stdout. (default is true)
; bool IsServer, IsClient, IsEditor : Whether to load objects required in server, client, and editor context. (default is true for all)
; bool LazyLoad : Whether to load objects immediately, or only on demand. (default is true)
; bool ShowErrorCount : Whether to show standard error and warning count on exit. All calls to Warn() and certain calls to Log() are counted as warnings, e.g.: &lt;uscript&gt;
log(&quot;a warning&quot;, 'Error');
log(&quot;another warning&quot;, 'Warning');
warn(&quot;and another one&quot;);
&lt;/uscript&gt; (default is false)
; bool ShowBanner : Whether to show Unreal banner on startup. (default is true)

==Methods ==
; int Main(string Parms) (native) : The main function. Put your code here. (This function is only declared as native event, not as final.)

==Sample Commandlet ==

This is an example included in the ''Core'' package of [[Legacy:UT|UT]].

&lt;uscript&gt;
//=============================================================================
/// UnrealScript &quot;hello world&quot; sample Commandlet.
///
/// Usage:
///     ucc.exe HelloWorld
//=============================================================================
class HelloWorldCommandlet
    extends Commandlet;

var int intparm;
var string strparm;

function int Main( string Parms )
{
    log( &quot;Hello, world!&quot; );
    if( Parms!=&quot;&quot; )
        log( &quot;Command line parameters=&quot; $ Parms );
    if( intparm!=0 )
        log( &quot;You specified intparm=&quot; $ intparm );
    if( strparm!=&quot;&quot; )
        log( &quot;You specified strparm=&quot; $ strparm );
}

defaultproperties
{
     HelpCmd=&quot;HelloWorld&quot;
     HelpOneLiner=&quot;Sample&quot;
     HelpUsage=&quot;HelloWorld&quot;
     HelpParm(0)=&quot;IntParm&quot;
     HelpParm(1)=&quot;StrParm&quot;
     HelpDesc(0)=&quot;An integer parameter&quot;
     HelpDesc(1)=&quot;A string parameter&quot;
}
&lt;/uscript&gt;

You can run this commandlet with:
 UCC Core.HelloWorld intparm=123 strparm=bla bla
 UCC Core.HelloWorld intparm=123 strparm=&quot;bla bla&quot;

Note: The first one returns only &quot;bla&quot; as ''strparm'', the second one prints out the full string.

==Returning values from ucc executable==

The return value from event Main() is not used. If ShowErrorCount = True it will return 1 if ErrorCount != 0. To create an error you can simply do:

&lt;uscript&gt;Log(&quot;Bla&quot;, 'Error');&lt;/uscript&gt;

==Known Subclasses ==

===UnrealScript Commandlets ===

(not available in [[Legacy:UT2003|UT2003]])
* HelloWorldCommandlet &amp;ndash; example commandlet (see above)
* SimpleCommandlet &amp;ndash; a test commandlet

===Native Commandlets ===
* [[Legacy:BatchExportCommandlet|BatchExportCommandlet]] &amp;ndash; exports objects from packages
* CheckSumCommandlet
* ChecksumPackageCommandlet
* CheckUnicodeCommandlet
* CompressCommandlet
* ConformCommandlet &amp;ndash; used to make packages network-compatible
* DataRipCommandlet
* MakeCommandlet &amp;ndash; [[Legacy:Compiling With UCC|Compiles]] UnrealScript sources to .u files
* MasterCommandlet &amp;ndash; can be used to build [[Legacy:UMOD|UMOD]] installer files
* MasterServerCommandlet
* MergeDXTCommandlet
* PackageFlagCommandlet
* PS2ConvertCommandlet
* ServerCommandlet &amp;ndash; Runs a [[Legacy:Running A Dedicated Server With UCC|dedicated server]]
* UpdateServerCommandlet
* UpdateUModCommandlet &amp;ndash; can list or modify the content of a [[Legacy:UMOD|UMOD]] file

===[[Legacy:UT2003|UT2003]] And Above===
* AnalyzeBuildCommandlet &amp;ndash; prints out the content of all packages (only execute if you have lots of time ;))
* AnalyzePackageCommandlet &amp;ndash; prints out information about memory usage of a package (e.g. maps)
* ConvertMaterialCommandlet
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]] &amp;ndash; dumps all localized variables to an .int file (back up the existing .int first!)
* [[Legacy:MasterMD5Commandlet|MasterMD5Commandlet]] &amp;ndash; handles the md5 table for package security
* UTVCommandlet &amp;ndash; used for [[Legacy:Running A UTV Proxy Server|running a UTV proxy server]] (requires UTV to be installed, see the [http://unreal.epicgames.com/ Unreal Tech Page])

(the following are not specified in the .int files, so you need to explicitely specify the package)
* Editor.[[Legacy:BatchImportCommandlet|BatchImportCommandlet]] &amp;ndash; opposite of [[Legacy:BatchExportCommandlet|BatchExportCommandlet]]
* Editor.CheckUnicodeCommandlet
* Editor.CompareIntCommandlet
* Editor.[[Legacy:CutDownContentCommandlet|CutDownContentCommandlet]]
* Editor.StripSourceCommandlet &amp;ndash; please be nice and ''don't'' use it

===[[Legacy:UT2004|UT2004]] Only===
* DumpConfigCommandlet &amp;ndash; Dumps the default configuration of all classes in all loadable U files to Dump*.ini
* [[Legacy:ExportCacheCommandlet|ExportCacheCommandlet]] &amp;ndash; Exports the cacheable class properties from the specified package files.
* GroupRepairCommandlet
* MapConvertCommandlet
* MergeIntCommandlet
* RearrangeIntCommandlet
* RebuildCommandlet
* TextureInfoCommandlet
* TextureLODCommandlet
* TextureStripCommandlet
* UModUnpackCommandlet

(incomplete list, some may need a package name specified)

(the following are not specified in the .int files, so you need to explicitely specify the package)
* Editor.CheckTexturesCommandlet &amp;ndash; Checks for corrupted textures in texture packages

===[[Legacy:UT3|UT3]] Only===

Run UT3.exe with commandline parameter &quot;help list&quot; if you need a list with commandlets in UE3.

==Discussion==

'''MythOpus:''' So you can create Commandlet's with Uscript?  I was wondering if that means you can create a custom commandlet that would delete a specified file and then rebuild it...

'''Wormbo:''' Commandlets can use the same features like any other UnrealScript class, except that there's no game environment to spawn actors in. In other words: Except for writing to the main log file there's nothing a commandlet can do to the file system.

'''DaWrecka:''' So you couldn't write a commandlet that would, for example, alter the LightBrightness of every light in a passed .UT2 (for use in a Darkmatch gametype) and save it with a new filename?

'''T-1:''' Hey, Wrecka. You might be able to save the information in a log file and then have a stand-alone program that strips the log information. There was a mod utility that did this, IIRC.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43146</id>
      <timestamp>2010-04-29T22:49:51Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{legacy page|new=[[Commandlet]]}}
{{classbox| [[Legacy:UT|UT]] / [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Commandlet (Package: Core)}}

UnrealScript Commandlet (command-line applet) class.

In UnrealEngine generations 1 and 2, commandlets are executed from the ucc.exe command line utility, using the following syntax:
 UCC.exe package_name.commandlet_class_name [parm=value]...

for example:
 UCC.exe Core.HelloWorldCommandlet
 UCC.exe Editor.MakeCommandlet

In addition, if you list your commandlet in the public section of your package's [[Legacy:INT File|INT file]] (see Engine.int for example), then your commandlet can be executed without requiring a fully qualified name, for example:
 UCC.exe MakeCommandlet

As a convenience, if a user tries to run a commandlet and the exact name he types isn't found, then ucc.exe appends the text &quot;commandlet&quot; onto the name and tries again.  Therefore, the following shortcuts perform identically to the above:
 UCC.exe Core.HelloWorld
 UCC.exe Editor.Make
 UCC.exe Make

In [[Legacy:UT3|UT3]] you need to use UT3.exe with the parameter &quot;run&quot;, since UCC.exe no longer exists. Note that the game only appears to load commandlets from packages that reside in the game's installation directory, not the &quot;My Games\Unreal Tournament 3&quot; directory.

It is perfectly valid to call the Main method of a commandlet class directly, for example from within the body of another commandlet.

Commandlets are executed in a &quot;raw&quot; UnrealScript environment, in which the game isn't loaded, the client code isn't loaded, no levels are loaded, and no actors exist.

You can load objects from [[Legacy:Package|package]]s. (e.g. levels, sound packages or code packages, this includes actors used in maps) However, you can only create non-[[Legacy:Actor|Actor]] objects because otherwise UCC exits with a general protection fault since there's no level to put the actor in.

This example loads a map and prints out the map's name and author:

&lt;uscript&gt;
class SandboxCommandlet extends Commandlet;

function int Main(string TextParameters) {
  
  local LevelInfo LevelInfo;
  LevelInfo = LevelInfo(DynamicLoadObject(TextParameters $ &quot;.LevelInfo0&quot;, class 'LevelInfo'));

  Log(&quot;Information about&quot; @ TextParameters $ &quot;:&quot;);
  Log(&quot;  Title: &quot; @ LevelInfo.Title);
  Log(&quot;  Author:&quot; @ LevelInfo.Author);
  }
&lt;/uscript&gt;

Output:

{|

|-
|
&lt;pre&gt;
{{innerbox| ucc Sandbox.SandboxCommandlet CTF-Face
}}

----
ucc.exe: UnrealOS execution environment
Copyright 1999 Epic Games Inc
----

Executing Class Sandbox.SandboxCommandlet
Information about CTF-Face:
  Title:  Facing Worlds
  Author: Cedric 'Inoxx' Fiorentino
&lt;/pre&gt;

|}

==Properties ==
; string HelpCmd (localized) : Command name to show for &quot;ucc help&quot;.
; string HelpOneLiner (localized) : Command description to show for &quot;ucc help&quot;.
; string HelpUsage (localized) : Usage template to show for &quot;ucc help&quot;.
; string HelpWebLink (localized) : Hyperlink for more info.
; string HelpParm[16], HelpDesc[16] (localized) : Parameters and descriptions for &quot;ucc help &lt;this command&gt;&quot;.
; bool LogToStdout : Whether to redirect log output to console stdout. (default is true)
; bool IsServer, IsClient, IsEditor : Whether to load objects required in server, client, and editor context. (default is true for all)
; bool LazyLoad : Whether to load objects immediately, or only on demand. (default is true)
; bool ShowErrorCount : Whether to show standard error and warning count on exit. All calls to Warn() and certain calls to Log() are counted as warnings, e.g.: &lt;uscript&gt;
log(&quot;a warning&quot;, 'Error');
log(&quot;another warning&quot;, 'Warning');
warn(&quot;and another one&quot;);
&lt;/uscript&gt; (default is false)
; bool ShowBanner : Whether to show Unreal banner on startup. (default is true)

==Methods ==
; int Main(string Parms) (native) : The main function. Put your code here. (This function is only declared as native event, not as final.)

==Sample Commandlet ==

This is an example included in the ''Core'' package of [[Legacy:UT|UT]].

&lt;uscript&gt;
//=============================================================================
/// UnrealScript &quot;hello world&quot; sample Commandlet.
///
/// Usage:
///     ucc.exe HelloWorld
//=============================================================================
class HelloWorldCommandlet
    extends Commandlet;

var int intparm;
var string strparm;

function int Main( string Parms )
{
    log( &quot;Hello, world!&quot; );
    if( Parms!=&quot;&quot; )
        log( &quot;Command line parameters=&quot; $ Parms );
    if( intparm!=0 )
        log( &quot;You specified intparm=&quot; $ intparm );
    if( strparm!=&quot;&quot; )
        log( &quot;You specified strparm=&quot; $ strparm );
}

defaultproperties
{
     HelpCmd=&quot;HelloWorld&quot;
     HelpOneLiner=&quot;Sample&quot;
     HelpUsage=&quot;HelloWorld&quot;
     HelpParm(0)=&quot;IntParm&quot;
     HelpParm(1)=&quot;StrParm&quot;
     HelpDesc(0)=&quot;An integer parameter&quot;
     HelpDesc(1)=&quot;A string parameter&quot;
}
&lt;/uscript&gt;

You can run this commandlet with:
 UCC Core.HelloWorld intparm=123 strparm=bla bla
 UCC Core.HelloWorld intparm=123 strparm=&quot;bla bla&quot;

Note: The first one returns only &quot;bla&quot; as ''strparm'', the second one prints out the full string.

==Returning values from ucc executable==

The return value from event Main() is not used. If ShowErrorCount = True it will return 1 if ErrorCount != 0. To create an error you can simply do:

&lt;uscript&gt;Log(&quot;Bla&quot;, 'Error');&lt;/uscript&gt;

==Known Subclasses ==

===UnrealScript Commandlets ===

(not available in [[Legacy:UT2003|UT2003]])
* HelloWorldCommandlet &amp;ndash; example commandlet (see above)
* SimpleCommandlet &amp;ndash; a test commandlet

===Native Commandlets ===
* [[Legacy:BatchExportCommandlet|BatchExportCommandlet]] &amp;ndash; exports objects from packages
* CheckSumCommandlet
* ChecksumPackageCommandlet
* CheckUnicodeCommandlet
* CompressCommandlet
* ConformCommandlet &amp;ndash; used to make packages network-compatible
* DataRipCommandlet
* MakeCommandlet &amp;ndash; [[Legacy:Compiling With UCC|Compiles]] UnrealScript sources to .u files
* MasterCommandlet &amp;ndash; can be used to build [[Legacy:UMOD|UMOD]] installer files
* MasterServerCommandlet
* MergeDXTCommandlet
* PackageFlagCommandlet
* PS2ConvertCommandlet
* ServerCommandlet &amp;ndash; Runs a [[Legacy:Running A Dedicated Server With UCC|dedicated server]]
* UpdateServerCommandlet
* UpdateUModCommandlet &amp;ndash; can list or modify the content of a [[Legacy:UMOD|UMOD]] file

===[[Legacy:UT2003|UT2003]] And Above===
* AnalyzeBuildCommandlet &amp;ndash; prints out the content of all packages (only execute if you have lots of time ;))
* AnalyzePackageCommandlet &amp;ndash; prints out information about memory usage of a package (e.g. maps)
* ConvertMaterialCommandlet
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]] &amp;ndash; dumps all localized variables to an .int file (back up the existing .int first!)
* [[Legacy:MasterMD5Commandlet|MasterMD5Commandlet]] &amp;ndash; handles the md5 table for package security
* UTVCommandlet &amp;ndash; used for [[Legacy:Running A UTV Proxy Server|running a UTV proxy server]] (requires UTV to be installed, see the [http://unreal.epicgames.com/ Unreal Tech Page])

(the following are not specified in the .int files, so you need to explicitely specify the package)
* Editor.[[Legacy:BatchImportCommandlet|BatchImportCommandlet]] &amp;ndash; opposite of [[Legacy:BatchExportCommandlet|BatchExportCommandlet]]
* Editor.CheckUnicodeCommandlet
* Editor.CompareIntCommandlet
* Editor.[[Legacy:CutDownContentCommandlet|CutDownContentCommandlet]]
* Editor.StripSourceCommandlet &amp;ndash; please be nice and ''don't'' use it

===[[Legacy:UT2004|UT2004]] Only===
* DumpConfigCommandlet &amp;ndash; Dumps the default configuration of all classes in all loadable U files to Dump*.ini
* [[Legacy:ExportCacheCommandlet|ExportCacheCommandlet]] &amp;ndash; Exports the cacheable class properties from the specified package files.
* GroupRepairCommandlet
* MapConvertCommandlet
* MergeIntCommandlet
* RearrangeIntCommandlet
* RebuildCommandlet
* TextureInfoCommandlet
* TextureLODCommandlet
* TextureStripCommandlet
* UModUnpackCommandlet

(incomplete list, some may need a package name specified)

(the following are not specified in the .int files, so you need to explicitely specify the package)
* Editor.CheckTexturesCommandlet &amp;ndash; Checks for corrupted textures in texture packages

===[[Legacy:UT3|UT3]] Only===

Run UT3.exe with commandline parameter &quot;help list&quot; if you need a list with commandlets in UE3.

==Discussion==

'''MythOpus:''' So you can create Commandlet's with Uscript?  I was wondering if that means you can create a custom commandlet that would delete a specified file and then rebuild it...

'''Wormbo:''' Commandlets can use the same features like any other UnrealScript class, except that there's no game environment to spawn actors in. In other words: Except for writing to the main log file there's nothing a commandlet can do to the file system.

'''DaWrecka:''' So you couldn't write a commandlet that would, for example, alter the LightBrightness of every light in a passed .UT2 (for use in a Darkmatch gametype) and save it with a new filename?

'''T-1:''' Hey, Wrecka. You might be able to save the information in a log file and then have a stand-alone program that strips the log information. There was a mod utility that did this, IIRC.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
'''Bold text'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Communication Between Objects</title>
    <id>691</id>
    <revision>
      <id>2013</id>
      <timestamp>2007-04-21T23:45:10Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Objects in [[Legacy:UnrealScript|UnrealScript]] often need to be able to discover information about each other in order to actually interact with eachother in some way.  For example.
* A weapon needs to know how many charges are left in a powerup.
* In a CTF the flag needs to know the team of the player that just touched it.
* A player needs to know who fired the projectile that just killed them.
* The guided redeemer shell needs to know the orientation of the player guiding it.

This is achieved by object ''references'' and will be better understood if we look at a few examples from the game itself.

==The CTF Flag==

Let's first take a look at how the CTF Flag in UT2004 uses references to figure out just who exactly is holding it and how it interacts with that person.

===The Reference Itself===

The code that tells the Flag who is holding it is not actually in the [[Legacy:CTFFlag|CTFFlag]] class at all.  It is actually in a SuperClass called GameObject.  In this class there are several important things that are essential for the CTF Flag to operate.

&lt;uscript&gt;
//The reference itself
var UnrealPawn      Holder;  //Holder has to be an UnrealPawn or any of it's subclasses

//Another reference, although not required, it will help out
var TeamPlayerReplicationInfo HolderPRI; //HolderPRI is simply the TeamPlayerReplicationInfo for the flags holder
&lt;/uscript&gt;

These are the only variable-level references that are useful to this example so I won't bother going into detail with too many other aspects of the code.

'''Side Note'''

These references are also pretty useless unless we 'reference' an actual object that exists.  What I mean by that is best explained by this:

&lt;uscript&gt;
var UnrealPawn MyPawn;

function PostBeginPlay()
{
    MyPawn.Health = 100;
}
&lt;/uscript&gt;

Doing '''just''' this will actually create an Accessed None error in the log if it is executed by the engine.  The reason for this is because declaring a variable as a reference is only good if you point that reference to something.  Putting the following before trying to change the health of my Pawn in the previous pseudo-code does two things.

'''One:''' It will spawn an actor (in this case an UnrealPawn) and

'''Two:''' It will point MyPawn to the newly created actor.

This means that everytime you use MyPawn in the script, you're actually talking about the UnrealPawn that you spawned.

&lt;uscript&gt;
MyPawn = Spawn(class'UnrealGame.UnrealPawn');
&lt;/uscript&gt;

===Setting The Reference===

Setting or Pointing the reference is what we need to do next, and the GameObject uses a SetHolder() function to do that.

When the SetHolder() function is called it will execute the following code:

&lt;uscript&gt;
function SetHolder(Controller C)
{
	local int i;

    //log(self$&quot; setholder c=&quot;$c, 'GameObject');
    LogTaken(c);
    Holder = UnrealPawn(C.Pawn);
    Holder.DeactivateSpawnProtection();
    HolderPRI = TeamPlayerReplicationInfo(Holder.PlayerReplicationInfo);
    C.PlayerReplicationInfo.HasFlag = self;
	C.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1;

    GotoState('Held');

	// AI Related
	C.MoveTimer = -1;
	Holder.MakeNoise(2.0);

	// Track First Touch

	if (FirstTouch == None)
		FirstTouch = C;

	// Track Assists

	for (i=0;i&lt;Assists.Length;i++)
		if (Assists[i] == C)
		  return;

	Assists.Length = Assists.Length+1;
  	Assists[Assists.Length-1] = C;

}
&lt;/uscript&gt;

We will only concern ourselves with the first few lines of the code however.  Firstly, the controller (the player) who took the flag will be logged.  Then the Holder reference will be set with the following code.

&lt;uscript&gt;
Holder = UnrealPawn(C.Pawn);
&lt;/uscript&gt;

Note that the Holder reference is being pointed to a Pawn that already exists, thus there is no need to spawn the pawn.  If for some reason the pawn died when this function was called however, it would produce an error as the pawn in question would no longer exist.

If the Holder had spawn protection active, it would disable it when the flag is picked up allowing defenders to have a chance to kill the Holder of the flag.  This is done by called the DeactivateSpawnProtection() method through the Holder reference.

Because Holder is pointed to UnrealPawn(C.Pawn), It actually calls that method within UnrealPawn(C.Pawn) so:

&lt;uscript&gt;
Holder.DeactivateSpawnProtection();
&lt;/uscript&gt;

could very well be written as:

&lt;uscript&gt;
UnrealPawn(C.Pawn).DeactivateSpawnProtection();
&lt;/uscript&gt;

They will do the same thing, but using references is more efficient, less messy and can also help with describing how your code works.

Next it will also assign HolderPRI to the PRI of the Holder in question.  This is purely for efficiency and anti-mess purposes I would imagine.

If for whatever reason we wanted to add 100 health to the Holder of the flag when it is picked up, we could add something like the following before the end of the function.

&lt;uscript&gt;
Holder.Health = Holder.Health + 50; //Add 50 health to the Holders current health
&lt;/uscript&gt;

==A silly example==

Using the BugEyedMonster class from [[Legacy:Extending States|Extending States]] again, let's suppose that we have a BugEyedQueen, and that when BugEyedMonster is very scared it runs towards her. We might have some sort of function RunToQueen() in BugEyedMonster's script.

The simplest thing might be to look for the Queen when we need to find her, with  a foreach [[Legacy:Iterator|iterator]]: obtain a reference to the Queen, get her location and move towards it.
: (example code here...)

This might be fine if the BUM only needs to do this once. However, if the Queen is also moving we have ourselves a case of the &quot;pursuit problem&quot; in maths (the one I could never solve &amp;ndash; Tarquin), and BUM needs to know about her location more than once, maybe even every tick. Running a foreach iterator this frequently is too heavy for the engine, and there's a more efficient way of doing it:

Give the BUM a ''variable'' of type BugEyedQueen. This in fact means a variable that holds a reference to an object, and the class of the object must be BugEyedQueen, or a subclass. (Remember the [[Legacy:Peppers And Pepper Grinders|Peppers And Pepper Grinders]] analogy: this variable does not indicate a class, it indicates an object of a certain class.) We could make it so the mapper has to set its value to point to the Queen object in the map: 
: var() BugEyedQueen MyQueen;

This requires the mapper to think, is bound to lead to confusion, recriminations and spilled milk. Docers often need to think for pammers ;-)

* set the variable uneditable by declaring it with just var, no ()
* in one of the begin play functions (PreBeginPlay, PostBeginPlay, I don't know which is appropriate (PostBeginPlay() gets my vote &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]])), run the foreach code as above to find the Queen, and set MyQueen to point to it
* whenever we need to find something out about the Queen, simply access local variable MyQueen, for example Destination = MyQueen.Location

: I've just realised on reading the bit below that I essentially (and stupidly) rewrote it with BugEyedMonster above. I'll try and merge them later. I'll stick to the reactor example, it's by far the more sensible of the two  &amp;ndash; ''Tarquin'' 
: maybe a page on PreBeginPlay, PostBeginPlay would be useful, but I don't know what to call it.  ­- ''Tarquin''

º: have a look at the [[Legacy:Creating Actors And Objects|Creating Actors and Objects]] page. (&quot;What exactly happens when I spawn an actor?&quot;) Is this what you were looking for or should there be more details? &amp;ndash; [[Legacy:Wormbo|Wormbo]]

----

Tarquin: snip from one of my forum posts:

The standard way round this is to only call ForEach once, like this: 

Each actor that will need to call Bomb.AddTime gets a: 

var bomb myBomb ; 

(check my syntax, it might be var class&lt;bomb&gt; etc...) 

Then one of the BeginPlay functions calls ForEach.AllActors and sets the local myBomb variable to point to the map's Bomb actor. 

Then when you need to access the Bomb actor's function, grab it from myBomb.AddTime. 

====Comments ====

''Tarquin'' Excellent idea, including this kind of information. Although, NOOBs will not have clue as to what you're referring to, and, how it would be implemented. I'll tell ya,...being a NOOB sucks. [[Legacy:Nuclear Fuzz Grunge|NFG]]
:It's very vague for now, needs major work. :-)  &amp;ndash; ''Tarquin'' 

====Zedsquared chips in with a more general view: ====

If you want to have a master actor on your map that exchanges information with other slave actors which can be dynamically created during gameplay then the only way for those slaves to get a reference the master actor is for the slaves to scan through all the actors on the level when created ( i.e. run a foreach.allactors iteration in prebeginplay ) and identify the master actor (hopefully it will be the only one of it's type on the level or we're in trouble).  

So, to put things in more concrete terms, imagine you have a mod where a reactor goes critical and will blow once the opposing team has pulled enough control rods out (meanwhile the defending team can push them back in).

Each player on has a small device (we'll call it an RCM or Reactor Core Monitor) which can display a reactor temperature which is going to be varying according to how many rods are in or out, this means that there's

no simple timer here, the state of the reactor depends on the actions of the players and this info has to come from the reactor

itself. 

One way of doing this would be for the reactor object to scan all actors on the level each tick and each time it finds an RCM it would call an UpdateStatus function, like this:

&lt;uscript&gt;
var float temperature;
event tick( float deltatime)
 {
    local RCM monitor;

    modelheat(deltatime); // do calcs to see how hot we are
    if(temperature &gt; critical_temperature) boom()
    else
      foreach allactors( class'RCM', monitor)
        monitor.UpdateStatus(temperature);
 }   
&lt;/uscript&gt;

Which is all well and good but somewhat inefficient as the foreach allactors iterator gets called every tick, this is slow and generally a Bad Thing. 

Another way to approach this is to have the RCM's find out where the reactor is when they're created and then use that information to query the reactor themselves, like this:

&lt;uscript&gt;
  var myreactor reactor;

  function prebeginplay ()
  {
   // find the reactor and assign a pointer to it
   foreach allactors(class'myreactor', reactor);
  }

  event tick (float deltatime)
  {
   if(reactor !=none) UpdateStatus(reactor.temperature);
  } 
&lt;/uscript&gt;

The nasty slow iterator gets called only once per RCM actor (it'd probably be spawned as part of the players inventory on game login and that's when it scans to get a reference to the reactor) and all the reactor has to do is check how hot it's getting at regular intervals and set that value in it's temperature variable for the others to read... easy! 

(and that mod ideas sounds like it might be fun... feel free to pinch it :-)  )

====Alternate + More Efficient Way====

An alternative way that I have found that works is to have a reference in your 'slave' actors to the 'master' actor and when you spawn the slaves (the easiest way would be to spawn from the slave), set the 'master' reference in their properties to that of the 'master' actor on the map.

An Example:

&lt;uscript&gt;
//In the slave class
Class SlaveClass Extends SomeOtherActor;
var MasterActor MyMaster; //An empty reference when the slave is first created
&lt;/uscript&gt;

&lt;uscript&gt;
//In the Master Class
Class MasterClass Extends SomeOtherActor;

function SpawnSlave()
{
   local SlaveClass MySlave;   
   MySlave = Spawn(class'YourPackage.SlaveClass) //plus whatever else you need to spawn &gt;_&lt;
   MySlave.MyMaster = Self //Set the empty reference MyMaster to reference the MasterClass    
}
&lt;/uscript&gt;

I believe this to be far more efficient than going through the list of actors etc.
 

====&quot;Global&quot; object references====

&lt;uscript&gt;
class Foo extends Object;

var Object Bar;

event Whatever()
{
    if( default.Bar == None )
    {
        default.Bar = SpawnFindAssignWhatever();
        Bar = default.Bar;
    }

    if( default.Bar != None )
        default.Bar.Hello(self);
}
&lt;/uscript&gt;
* SpawnFindAssignWhatever(); will be called only once per game in the best case
* All Foo's automatically gain access to Bar actor through default.Bar;
* Newly created objects have their Bar variable initialized to what's in default.Bar;
* Other objects can access Foo's bar through class'Foo'.default.Bar;

another example:

&lt;uscript&gt;
class Foo extends Object;

var Object Bar;

event Whatever()
{
    if( default.Bar != None )
        default.Bar.Hello(self);
}
&lt;/uscript&gt;

&lt;uscript&gt;
class Bar extends Object;

event Whatever()
{
    if( class'Foo'.default.Bar == None )
        class'Foo'.default.Bar = self;
}

function Hello( Object o )
{
    //...
}
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Iterator|Iterator]]s

==Comments==

'''dataangel''': I don't think this is correct:

&quot;If you want to have a master actor on your map that exchanges information with other slave actors which can be dynamically created during gameplay then the only way for those slaves to get a reference the master actor is for the slaves to scan through all the actors on the level when created ( i.e. run a foreach.allactors iteration in prebeginplay ) and identify the master actor (hopefully it will be the only one of it's type on the level or we're in trouble).&quot;

Couldn't you simply assign the slave's master when you create it? The same way game rules objects usually have a reference to the mutator that spawns them.

'''Fataloverdose''' yes, if it was the master that spawned the slave.But all the slaves would have to be spawned after the gameplay has started to be able get a valid refference to the master.

'''Ben'''

Well, what is the problem in the fact that the master didn't spawn the slaves ? Why don't we do like that:

The master has a list of all the slaves (empty at the begining) and a method &quot;add_slave(slave newSlave)&quot;.

When a slave appears, in its prebeginplay() method, it find the reactor and do &quot;pointorToTheReactorFound.add_slave(this)&quot;

Like that the master update the slaves only when it changes.

'''mE''': this is really confusing, and for some reason i think it's really important. Still it seems pretty simple, when i have my code working i may edit this down i think i know what i'm doing now.

'''Kartoshka:''' This page could use a good cleaning [[:Category:Legacy Refactor Me]]. Also, one earlier question wasn't ever really answered. Which is a better place for the foreach iterator code &amp;ndash; PreBeginPlay or PostBeginPlay?

'''MythOpus:''' I didn't really know there was a question like that... but here's my answer... I believe it's better it do any iterators in the PostBeginPlay as all the actors would have been created at that point so I believe it would be a better way of doing things.  I will also look at refactoring this up later in the week as I have final's but am off thursday and friday.  EDIT- I guess I'll also write up examples for the CTF Flag that the original author hasn't gotten around to yet heh.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2014</id>
      <timestamp>2006-11-24T17:31:00Z</timestamp>
      <contributor>
        <ip>61-90-228-106.static.asianet.co.th</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">q9clwzn-ujlafl4-tw6qf6dc &lt;a href=&quot;http://www.ultimatetopsites.com/general/tramd1/#2&quot;&gt;tramadol&lt;/a&gt; 

http://idisk.mac.com/adi51-Public/index.html#1 

[url=http://ulltra.xooit.com#3]ultram[/url] 

[url]http://idisk.mac.com/mela8-Public/index.html#4[/url]</text>
    </revision>
    <revision>
      <id>2015</id>
      <timestamp>2006-11-24T21:40:55Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Page restored</comment>
      <text xml:space="preserve">Objects in [[Legacy:UnrealScript|UnrealScript]] often need to be able to discover information about each other in order to actually interact with eachother in some way.  For example.
* A weapon needs to know how many charges are left in a powerup.
* In a CTF the flag needs to know the team of the player that just touched it.
* A player needs to know who fired the projectile that just killed them.
* The guided redeemer shell needs to know the orientation of the player guiding it.

This is achieved by object ''references'' and will be better understood if we look at a few examples from the game itself.

==The CTF Flag==

Let's first take a look at how the CTF Flag in UT2004 uses references to figure out just who exactly is holding it and how it interacts with that person.

===The Reference Itself===

The code that tells the Flag who is holding it is not actually in the [[Legacy:CTFFlag|CTFFlag]] class at all.  It is actually in a SuperClass called GameObject.  In this class there are several important things that are essential for the CTF Flag to operate.

&lt;uscript&gt;
//The reference itself
var UnrealPawn      Holder;  //Holder has to be an UnrealPawn or any of it's subclasses

//Another reference, although not required, it will help out
var TeamPlayerReplicationInfo HolderPRI; //HolderPRI is simply the TeamPlayerReplicationInfo for the flags holder
&lt;/uscript&gt;

These are the only variable-level references that are useful to this example so I won't bother going into detail with too many other aspects of the code.

'''Side Note'''

These references are also pretty useless unless we 'reference' an actual object that exists.  What I mean by that is best explained by this:

&lt;uscript&gt;
var UnrealPawn MyPawn;

function PostBeginPlay()
{
    MyPawn.Health = 100;
}
&lt;/uscript&gt;

Doing '''just''' this will actually create an Accessed None error in the log if it is executed by the engine.  The reason for this is because declaring a variable as a reference

is only good if you point that reference to something.  Putting the following before trying to change the health of my Pawn in the previous pseudo-code does two things.

'''One:''' It will spawn an actor (in this case an UnrealPawn) and

'''Two:''' It will point MyPawn to the newly created actor.

This means that everytime you use MyPawn in the script, you're actually talking about the UnrealPawn that you spawned.

&lt;uscript&gt;
MyPawn = Spawn(class'UnrealGame.UnrealPawn');
&lt;/uscript&gt;

===Setting The Reference===

Setting or Pointing the reference is what we need to do next, and the GameObject uses a SetHolder() function to do that.

When the SetHolder() function is called it will execute the following code:

&lt;uscript&gt;
function SetHolder(Controller C)
{
	local int i;

    //log(self$&quot; setholder c=&quot;$c, 'GameObject');
    LogTaken(c);
    Holder = UnrealPawn(C.Pawn);
    Holder.DeactivateSpawnProtection();
    HolderPRI = TeamPlayerReplicationInfo(Holder.PlayerReplicationInfo);
    C.PlayerReplicationInfo.HasFlag = self;
	C.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1;

    GotoState('Held');

	// AI Related
	C.MoveTimer = -1;
	Holder.MakeNoise(2.0);

	// Track First Touch

	if (FirstTouch == None)
		FirstTouch = C;

	// Track Assists

	for (i=0;i&lt;Assists.Length;i++)
		if (Assists[i] == C)
		  return;

	Assists.Length = Assists.Length+1;
  	Assists[Assists.Length-1] = C;

}
&lt;/uscript&gt;

We will only concern ourselves with the first few lines of the code however.  Firstly, the controller (the player) who took the flag will be logged.  Then the Holder reference will be set with the following code.

&lt;uscript&gt;
Holder = UnrealPawn(C.Pawn);
&lt;/uscript&gt;

Note that the Holder reference is being pointed to a Pawn that already exists, thus there is no need to spawn the pawn.  If for some reason the pawn died when this function was called however, it would produce an error as the pawn in question would no longer exist.

If the Holder had spawn protection active, it would disable it when the flag is picked up allowing defenders to have a chance to kill the Holder of the flag.  This is done by called the DeactivateSpawnProtection() method through the Holder reference.

Because Holder is pointed to UnrealPawn(C.Pawn), It actually calls that method within UnrealPawn(C.Pawn) so:

&lt;uscript&gt;
Holder.DeactivateSpawnProtection();
&lt;/uscript&gt;

could very well be written as:

&lt;uscript&gt;
UnrealPawn(C.Pawn).DeactivateSpawnProtection();
&lt;/uscript&gt;

They will do the same thing, but using references is more efficient, less messy and can also help with describing how your code works.

Next it will also assign HolderPRI to the PRI of the Holder in question.  This is purely for efficiency and anti-mess purposes I would imagine.

If for whatever reason we wanted to add 100 health to the Holder of the flag when it is picked up, we could add something like the following before the end of the function.

&lt;uscript&gt;
Holder.Health = Holder.Health + 50; //Add 50 health to the Holders current health
&lt;/uscript&gt;

==A silly example==

Using the BugEyedMonster class from [[Legacy:Extending States|Extending States]] again, let's suppose that we have a BugEyedQueen, and that when BugEyedMonster is very scared it runs towards her. We might have some sort of function RunToQueen() in BugEyedMonster's script.

The simplest thing might be to look for the Queen when we need to find her, with  a foreach [[Legacy:Iterator|iterator]]: obtain a reference to the Queen, get her location and move towards it.
: (example code here...)

This might be fine if the BUM only needs to do this once. However, if the Queen is also moving we have ourselves a case of the &quot;pursuit problem&quot; in maths (the one I could never solve &amp;ndash; Tarquin), and BUM needs to know about her location more than once, maybe even every tick. Running a foreach iterator this frequently is too heavy for the engine, and there's a more efficient way of doing it:

Give the BUM a ''variable'' of type BugEyedQueen. This in fact means a variable that holds a reference to an object, and the class of the object must be BugEyedQueen, or a subclass. (Remember the [[Legacy:Peppers And Pepper Grinders|Peppers And Pepper Grinders]] analogy: this variable does not indicate a class, it indicates an object of a certain class.) We could make it so the mapper has to set its value to point to the Queen object in the map: 
: var() BugEyedQueen MyQueen;

This requires the mapper to think, is bound to lead to confusion, recriminations and spilled milk. Docers often need to think for pammers ;-)

* set the variable uneditable by declaring it with just var, no ()
* in one of the begin play functions (PreBeginPlay, PostBeginPlay, I don't know which is appropriate (PostBeginPlay() gets my vote &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]])), run the foreach code as above to find the Queen, and set MyQueen to point to it
* whenever we need to find something out about the Queen, simply access local variable MyQueen, for example Destination = MyQueen.Location

: I've just realised on reading the bit below that I essentially (and stupidly) rewrote it with BugEyedMonster above. I'll try and merge them later. I'll stick to the reactor example, it's by far the more sensible of the two  &amp;ndash; ''Tarquin'' 
: maybe a page on PreBeginPlay, PostBeginPlay would be useful, but I don't know what to call it.  ­- ''Tarquin''

º: have a look at the [[Legacy:Creating Actors And Objects|Creating Actors and Objects]] page. (&quot;What exactly happens when I spawn an actor?&quot;) Is this what you were looking for or should there be more details? &amp;ndash; [[Legacy:Wormbo|Wormbo]]

----

Tarquin: snip from one of my forum posts:

The standard way round this is to only call ForEach once, like this: 

Each actor that will need to call Bomb.AddTime gets a: 

var bomb myBomb ; 

(check my syntax, it might be var class&lt;bomb&gt; etc...) 

Then one of the BeginPlay functions calls ForEach.AllActors and sets the local myBomb variable to point to the map's Bomb actor. 

Then when you need to access the Bomb actor's function, grab it from myBomb.AddTime. 

====Comments ====

''Tarquin'' Excellent idea, including this kind of information. Although, NOOBs will not have clue as to what you're referring to, and, how it would be implemented. I'll tell ya,...being a NOOB sucks. [[Legacy:Nuclear Fuzz Grunge|NFG]]
:It's very vague for now, needs major work. :-)  &amp;ndash; ''Tarquin'' 

====Zedsquared chips in with a more general view: ====

If you want to have a master actor on your map that exchanges information with other slave actors which can be dynamically created during gameplay then the only way for those slaves to get a reference the master actor is for the slaves to scan through all the actors on the level when created ( i.e. run a foreach.allactors iteration in prebeginplay ) and identify the master actor (hopefully it will be the only one of it's type on the level or we're in trouble).  

So, to put things in more concrete terms, imagine you have a mod where a reactor goes critical and will blow once the opposing team has pulled enough control rods out (meanwhile the defending team can push them back in).

Each player on has a small device (we'll call it an RCM or Reactor Core Monitor) which can display a reactor temperature which is going to be varying according to how many rods are in or out, this means that there's

no simple timer here, the state of the reactor depends on the actions of the players and this info has to come from the reactor

itself. 

One way of doing this would be for the reactor object to scan all actors on the level each tick and each time it finds an RCM it would call an UpdateStatus function, like this:

&lt;uscript&gt;
var float temperature;
event tick( float deltatime)
 {
    local RCM monitor;

    modelheat(deltatime); // do calcs to see how hot we are
    if(temperature &gt; critical_temperature) boom()
    else
      foreach allactors( class'RCM', monitor)
        monitor.UpdateStatus(temperature);
 }   
&lt;/uscript&gt;

Which is all well and good but somewhat inefficient as the foreach allactors iterator gets called every tick, this is slow and generally a Bad Thing. 

Another way to approach this is to have the RCM's find out where the reactor is when they're created and then use that information to query the reactor themselves, like this:

&lt;uscript&gt;
  var myreactor reactor;

  function prebeginplay ()
  {
   // find the reactor and assign a pointer to it
   foreach allactors(class'myreactor', reactor);
  }

  event tick (float deltatime)
  {
   if(reactor !=none) UpdateStatus(reactor.temperature);
  } 
&lt;/uscript&gt;

The nasty slow iterator gets called only once per RCM actor (it'd probably be spawned as part of the players inventory on game login and that's when it scans to get a reference to the reactor) and all the reactor has to do is check how hot it's getting at regular intervals and set that value in it's temperature variable for the others to read... easy! 

(and that mod ideas sounds like it might be fun... feel free to pinch it :-)  )

====Alternate + More Efficient Way====

An alternative way that I have found that works is to have a reference in your 'slave' actors to the 'master' actor and when you spawn the slaves (the easiest way would be to spawn from the slave), set the 'master' reference in their properties to that of the 'master' actor on the map.

An Example:

&lt;uscript&gt;
//In the slave class
Class SlaveClass Extends SomeOtherActor;
var MasterActor MyMaster; //An empty reference when the slave is first created
&lt;/uscript&gt;

&lt;uscript&gt;
//In the Master Class
Class MasterClass Extends SomeOtherActor;

function SpawnSlave()
{
   local SlaveClass MySlave;   
   MySlave = Spawn(class'YourPackage.SlaveClass) //plus whatever else you need to spawn &gt;_&lt;
   MySlave.MyMaster = Self //Set the empty reference MyMaster to reference the MasterClass    
}
&lt;/uscript&gt;

I believe this to be far more efficient than going through the list of actors etc.
 

====&quot;Global&quot; object references====

&lt;uscript&gt;
class Foo extends Object;

var Object Bar;

event Whatever()
{
    if( default.Bar == None )
    {
        default.Bar = SpawnFindAssignWhatever();
        Bar = default.Bar;
    }

    if( default.Bar != None )
        default.Bar.Hello(self);
}
&lt;/uscript&gt;
* SpawnFindAssignWhatever(); will be called only once per game in the best case
* All Foo's automatically gain access to Bar actor through default.Bar;
* Newly created objects have their Bar variable initialized to what's in default.Bar;
* Other objects can access Foo's bar through class'Foo'.default.Bar;

another example:

&lt;uscript&gt;
class Foo extends Object;

var Object Bar;

event Whatever()
{
    if( default.Bar != None )
        default.Bar.Hello(self);
}
&lt;/uscript&gt;

&lt;uscript&gt;
class Bar extends Object;

event Whatever()
{
    if( class'Foo'.default.Bar == None )
        class'Foo'.default.Bar = self;
}

function Hello( Object o )
{
    //...
}
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Iterator|Iterator]]s

==Comments==

'''dataangel''': I don't think this is correct:

&quot;If you want to have a master actor on your map that exchanges information with other slave actors which can be dynamically created during gameplay then the only way for those slaves to get a reference the master actor is for the slaves to scan through all the actors on the level when created ( i.e. run a foreach.allactors iteration in prebeginplay ) and identify the master actor (hopefully it will be the only one of it's type on the level or we're in trouble).&quot;

Couldn't you simply assign the slave's master when you create it? The same way game rules objects usually have a reference to the mutator that spawns them.

'''Fataloverdose''' yes, if it was the master that spawned the slave.But all the slaves would have to be spawned after the gameplay has started to be able get a valid refference to the master.

'''Ben'''

Well, what is the problem in the fact that the master didn't spawn the slaves ? Why don't we do like that:

The master has a list of all the slaves (empty at the begining) and a method &quot;add_slave(slave newSlave)&quot;.

When a slave appears, in its prebeginplay() method, it find the reactor and do &quot;pointorToTheReactorFound.add_slave(this)&quot;

Like that the master update the slaves only when it changes.

'''mE''': this is really confusing, and for some reason i think it's really important. Still it seems pretty simple, when i have my code working i may edit this down i think i know what i'm doing now.

'''Kartoshka:''' This page could use a good cleaning [[:Category:Legacy Refactor Me]]. Also, one earlier question wasn't ever really answered. Which is a better place for the foreach iterator code &amp;ndash; PreBeginPlay or PostBeginPlay?

'''MythOpus:''' I didn't really know there was a question like that... but here's my answer... I believe it's better it do any iterators in the PostBeginPlay as all the actors would have been created at that point so I believe it would be a better way of doing things.  I will also look at refactoring this up later in the week as I have final's but am off thursday and friday.  EDIT- I guess I'll also write up examples for the CTF Flag that the original author hasn't gotten around to yet heh.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CompactIndex</title>
    <id>905</id>
    <revision>
      <id>2494</id>
      <timestamp>2005-09-02T00:42:49Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>IntToIndex example</comment>
      <text xml:space="preserve">CompactIndex is a special integer data type used very often in the Unreal Engine. It is used to reduce the size of a integer. However in the worst case scenario it takes up one extra byte (5bytes instead of 4), but this isn't often the case. CompactIndex is for example used to store the length of a string.

A CompactIndex tries to use as less bytes as possible to store the integer's (32bit) value. 

==The bytes==

===1st Byte===

The &lt;tt&gt;MSB&lt;/tt&gt; (Most Significant Bit) flags if the string is in UTF-16 encoding instead of normal ASCII. Thus the MSB only has a meaning when used for string length.

&lt;tt&gt;MSB-1&lt;/tt&gt; defines if there's another byte following this byte that should be included with the CompactIndex.

The other 6 bits are used for the value. Therefor the maximum value in the first byte is &lt;tt&gt;(2^6)-1 = 63&lt;/tt&gt;

===2nd to 4th Byte===

The &lt;tt&gt;MSB&lt;/tt&gt; defines if there's another byte following this byte that should be included with the CompactIndex.

The rest is used for the value. &lt;tt&gt;(2^7)-1 = 127&lt;/tt&gt;

===5th Byte===

The whole byte is used for the value. However, because the first 4 bytes already consume 27 of the 32 bits only 5 bits are used in this byte.

==Integer to CompactIndex==

B1 = 1st byte of the CompactIndex; B2 = 2nd byte of the CompactIndex; etc.

&lt;uscript&gt;
//TODO
&lt;/uscript&gt;

&lt;uscript&gt;
final function IntToIndex( int Integer, out byte data[255], out byte ptr )
{
	local int val;
	
	val = abs(Integer);
	if( val != Integer )
		data[ptr] = 0x80; // B1 sign bit
	
	data[ptr] += val &amp; 0x3f; // B1 data, 6 bits
	val = val &gt;&gt; 6;
	if( val != 0 )
	{
		data[ptr] += 0x40; // B1 continue bit
		data[++ptr] = val &amp; 0x7f; // B2 data, 7 bits
		val = val &gt;&gt; 7;
		if( val != 0 )
		{
			data[ptr] += 0x80; // B2 continue bit
			data[++ptr] = val &amp; 0x7f; // B3 data, 7 bits
			val = val &gt;&gt; 7;
			if( val != 0 )
			{
				data[ptr] += 0x80; // B3 continue bit
				data[++ptr] = val &amp; 0x7f; // B4 data, 7 bits
				val = val &gt;&gt; 7;
				if( val != 0 )
				{
					data[ptr] += 0x80; // B4 continue bit
					data[++ptr] = val &amp; 0x1f; // B5 data, 5 bits
				}
			}
		}
	}
}
&lt;/uscript&gt;

==CompactIndex to Integer==

B1 = 1st byte of the CompactIndex; B2 = 2nd byte of the CompactIndex; etc.

&lt;uscript&gt;
Integer = B1 &amp; 0x3F;
if (B1 &amp; 0x40) // got a 2nd byte
{
  Integer += (B2 &amp; 0x3F) &lt;&lt; 6;
  if (B2 &amp; 0x80) // got a 3rd byte
  {
    Integer += (B3 &amp; 0x3F) &lt;&lt; 13;
    if (B3 &amp; 0x80) // got a 4th byte
    {
      Integer += (B4 &amp; 0x3F) &lt;&lt; 20;
      if (B4 &amp; 0x80) // got a 5th byte
      {
        Integer += (B5 &amp; 0x3F) &lt;&lt; 27;
      }
    }
  }
}
&lt;/uscript&gt;

Example:

&lt;uscript&gt;
final function int IndexToInt( byte data[255], optional byte ptr )
{
	local byte B1,B2,B3,B4,B5;
	local int Integer;
		
	B1 = data[ptr++];
	Integer = B1 &amp; 0x3f;
	if((B1 &amp; 0x40)!=0)
	{
		B2 = data[ptr++];
		Integer += (B2 &amp; 0x7f) &lt;&lt; 6;
		if((B2 &amp; 0x80)!=0)
		{
			B3 = data[ptr++];
			Integer += (B3 &amp; 0x7f) &lt;&lt; 13;
			if((B3 &amp; 0x80)!=0)
			{
				B4 = data[ptr++];
				Integer += (B4 &amp; 0x7f) &lt;&lt; 20;
				if((B4 &amp; 0x80)!=0)
				{
					B5 = data[ptr++];
					Integer += B5 &lt;&lt; 27;
				}
			}
		}
	}
	
	if((B1 &amp; 0x80)!=0) 
		Integer = -Integer;
				
	return Integer;
}
&lt;/uscript&gt;

----

'''El Muerte:''' need this description when I'm going to port by UE2 query specification to the wiki</text>
    </revision>
    <revision>
      <id>2495</id>
      <timestamp>2005-09-01T19:01:05Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">CompactIndex is a special integer data type used very often in the Unreal Engine. It is used to reduce the size of a integer. However in the worst case scenario it takes up one extra byte (5bytes instead of 4), but this isn't often the case. CompactIndex is for example used to store the length of a string.

A CompactIndex tries to use as less bytes as possible to store the integer's (32bit) value. 

==The bytes==

===1st Byte===

The &lt;tt&gt;MSB&lt;/tt&gt; (Most Significant Bit) flags if the string is in UTF-16 encoding instead of normal ASCII. Thus the MSB only has a meaning when used for string length.

&lt;tt&gt;MSB-1&lt;/tt&gt; defines if there's another byte following this byte that should be included with the CompactIndex.

The other 6 bits are used for the value. Therefor the maximum value in the first byte is &lt;tt&gt;(2^6)-1 = 63&lt;/tt&gt;

===2nd to 4th Byte===

The &lt;tt&gt;MSB&lt;/tt&gt; defines if there's another byte following this byte that should be included with the CompactIndex.

The rest is used for the value. &lt;tt&gt;(2^7)-1 = 127&lt;/tt&gt;

===5th Byte===

The whole byte is used for the value. However, because the first 4 bytes already consume 27 of the 32 bits only 5 bits are used in this byte.

==Integer to CompactIndex==

B1 = 1st byte of the CompactIndex; B2 = 2nd byte of the CompactIndex; etc.

&lt;uscript&gt;
//TODO
&lt;/uscript&gt;

==CompactIndex to Integer==

B1 = 1st byte of the CompactIndex; B2 = 2nd byte of the CompactIndex; etc.

&lt;uscript&gt;
Integer = B1 &amp; 0x3F;
if (B1 &amp; 0x40) // got a 2nd byte
{
  Integer += (B2 &amp; 0x3F) &lt;&lt; 6;
  if (B2 &amp; 0x80) // got a 3rd byte
  {
    Integer += (B3 &amp; 0x3F) &lt;&lt; 13;
    if (B3 &amp; 0x80) // got a 4th byte
    {
      Integer += (B4 &amp; 0x3F) &lt;&lt; 20;
      if (B4 &amp; 0x80) // got a 5th byte
      {
        Integer += (B5 &amp; 0x3F) &lt;&lt; 27;
      }
    }
  }
}
&lt;/uscript&gt;

----

'''El Muerte:''' need this description when I'm going to port by UE2 query specification to the wiki</text>
    </revision>
    <revision>
      <id>2496</id>
      <timestamp>2005-09-01T22:22:23Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>IndexToInt example</comment>
      <text xml:space="preserve">CompactIndex is a special integer data type used very often in the Unreal Engine. It is used to reduce the size of a integer. However in the worst case scenario it takes up one extra byte (5bytes instead of 4), but this isn't often the case. CompactIndex is for example used to store the length of a string.

A CompactIndex tries to use as less bytes as possible to store the integer's (32bit) value. 

==The bytes==

===1st Byte===

The &lt;tt&gt;MSB&lt;/tt&gt; (Most Significant Bit) flags if the string is in UTF-16 encoding instead of normal ASCII. Thus the MSB only has a meaning when used for string length.

&lt;tt&gt;MSB-1&lt;/tt&gt; defines if there's another byte following this byte that should be included with the CompactIndex.

The other 6 bits are used for the value. Therefor the maximum value in the first byte is &lt;tt&gt;(2^6)-1 = 63&lt;/tt&gt;

===2nd to 4th Byte===

The &lt;tt&gt;MSB&lt;/tt&gt; defines if there's another byte following this byte that should be included with the CompactIndex.

The rest is used for the value. &lt;tt&gt;(2^7)-1 = 127&lt;/tt&gt;

===5th Byte===

The whole byte is used for the value. However, because the first 4 bytes already consume 27 of the 32 bits only 5 bits are used in this byte.

==Integer to CompactIndex==

B1 = 1st byte of the CompactIndex; B2 = 2nd byte of the CompactIndex; etc.

&lt;uscript&gt;
//TODO
&lt;/uscript&gt;

==CompactIndex to Integer==

B1 = 1st byte of the CompactIndex; B2 = 2nd byte of the CompactIndex; etc.

&lt;uscript&gt;
Integer = B1 &amp; 0x3F;
if (B1 &amp; 0x40) // got a 2nd byte
{
  Integer += (B2 &amp; 0x3F) &lt;&lt; 6;
  if (B2 &amp; 0x80) // got a 3rd byte
  {
    Integer += (B3 &amp; 0x3F) &lt;&lt; 13;
    if (B3 &amp; 0x80) // got a 4th byte
    {
      Integer += (B4 &amp; 0x3F) &lt;&lt; 20;
      if (B4 &amp; 0x80) // got a 5th byte
      {
        Integer += (B5 &amp; 0x3F) &lt;&lt; 27;
      }
    }
  }
}
&lt;/uscript&gt;

Example:

&lt;uscript&gt;
final function int IndexToInt( byte data[255], optional byte ptr )
{
	local byte B1,B2,B3,B4,B5;
	local int Integer;
		
	B1 = data[ptr++];
	Integer = B1 &amp; 0x3f;
	if((B1 &amp; 0x40)!=0)
	{
		B2 = data[ptr++];
		Integer += (B2 &amp; 0x7f) &lt;&lt; 6;
		if((B2 &amp; 0x80)!=0)
		{
			B3 = data[ptr++];
			Integer += (B3 &amp; 0x7f) &lt;&lt; 13;
			if((B3 &amp; 0x80)!=0)
			{
				B4 = data[ptr++];
				Integer += (B4 &amp; 0x7f) &lt;&lt; 20;
				if((B4 &amp; 0x80)!=0)
				{
					B5 = data[ptr++];
					Integer += B5 &lt;&lt; 27;
				}
			}
		}
	}
	
	if((B1 &amp; 0x80)!=0) 
		Integer = -Integer;
				
	return Integer;
}
&lt;/uscript&gt;

----

'''El Muerte:''' need this description when I'm going to port by UE2 query specification to the wiki</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Compiler Error</title>
    <id>842</id>
    <revision>
      <id>2354</id>
      <timestamp>2004-09-06T10:20:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Compiler Errors]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Compiler Errors|Compiler Errors]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Compiler Errors</title>
    <id>736</id>
    <revision>
      <id>2116</id>
      <timestamp>2007-10-20T11:36:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The warnings and errors described on this page are generated only by the compiler. If you need information about logged in-game warnings see [[Legacy:Log Warnings|Log Warnings]].

The [[Legacy:Ucc|Ucc]] Make [[Legacy:Commandlet|commandlet]] outputs warning and critical error messages in the form
 ''&lt;path and filename&gt;''(''line number'') : ''error message''

Usually the problem can be found by opening the specified file and looking at the specified line number. Exceptions are missing declarations or braces further up in the file or missing declarations in a superclass (if it's part of your code). The Wiki recommends the [[Legacy:UMake|UMake]] compiling tool :D.

==Warnings ==

; Warning, '&lt;i&gt;name&lt;/i&gt;' obscures '&lt;i&gt;name&lt;/i&gt;' defined in base class : You declared a class variable, struct or enum with the same name as a class variable, struct or enum of a superclass. This will obscure the object in the superclass so you can't access it in the code of your class anymore.&lt;br /&gt;In UT2004 this warning also applies to local function variables which obscure class variables in the same class or one of its superclasses.

'''Foxpaw:''' Could you get around this by simply using Self.? IE, if variable A was obscured by local variable A, you should be able to access local A with A, and global A with Self.A. Seems like it would work.

'''Wormbo:''' Of course you could, but the warning is there because the usual way to access the class varaible is blocked. It's easier to find the problem with this warning when you access the obscuring variable instead of the obscured one in you code.

; Warning, '&lt;i&gt;variable name&lt;/i&gt;' - unreferenced local variable : A function declares a local variable but doesn't use it beyond that &amp;ndash; you may as well remove it if [[Wiki:YouArentGonnaNeedIt]]

; Warning, &lt;i&gt;function name&lt;/i&gt; - Missing return value : The function is declared as returning a value, but there's no '''return''' statement in the function. The default value of that variable type will be returned (e.g. false, 0, &quot;&quot;, None; also see [[Legacy:Variable Syntax|Variable Syntax]])

; ExecWarning, Reference to deprecated property '&lt;i&gt;variable name&lt;/i&gt;' : You are using a variable marked as deprecated in your code.

; Warning, Class names shouldn't end in a digit: This warning appears harmless enough. Classes with names ending in a digit (IE BloodFX2) seem to work fine.

; Warning, Missing Function : You are calling a function that has not been defined.

==Syntax Errors ==

===General Structure ===
; Bad class definition '&lt;i&gt;class name&lt;/i&gt;' : In [[Legacy:UT2003|UT2003]], the most common cause for this error is that you accidentally used &quot;expands&quot; instead of &quot;extends.&quot;  The old keyword &quot;expands&quot; is not supported anymore.  (It has been considered deprecated for a long while already.)

; Superclass &lt;i&gt;class name&lt;/i&gt; of class &lt;i&gt;other class name&lt;/i&gt; not found : The superclass of one of your classes couldn't be found. Check the class header of the second class for typos. If the superclass is in the same package also check its class header, if not check the [[Legacy:Game Ini File|Game Ini File]]'s EditPackages lines for missing packages. 

; Unexpected end of file at end of class : This is usually caused by one or more missing &quot;&lt;code&gt;}&lt;/code&gt;&quot;. This error can be quite annoying in large classes. Most of it is prevented by proper code indentation and (what experienced coders frequently do) writing ''both'' the opening and the closing brace at the same time and then filling in code between them.

; Unexpected 'defaultproperties' : The [[Legacy:Default Properties|default properties]] block can only be used outside of [[Legacy:UnrealEd|UnrealEd]]. Within UnrealEd, they have to be set from the [[Legacy:Actor Classes Browser|Actor Classes Browser]] interface; hidden variables (not declared to show up in any of the property groups) can have their defaults set via the [[Legacy:UnrealEd Console|UnrealEd console]]. Use [[Legacy:Compiling With UCC|UCC Make]] instead of UnrealEd to compile your classes if you want to use this feature. This error can also happen when you use a weird commenting style like:&lt;uscript&gt;
/* some comment
*///===========
&lt;/uscript&gt;Basically using a multi-line comment immediately followed by a single-line comment anywhere in your class breaks the parser and makes it complain about the &lt;/code&gt;defaultproperties&lt;/code&gt; keyword. Add a whitespace or linebreak or think about your commenting style in general. ;)

; Unexpected '&lt;i&gt;} or identifier&lt;/i&gt;' : This is caused by one or more missing &quot;&lt;code&gt;{&lt;/code&gt;&quot; or too many &quot;&lt;code&gt;}&lt;/code&gt;&quot;. See suggestions above.

; Call to '&lt;i&gt;function&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Type mismatch in parameter &lt;i&gt;number&lt;/i&gt; : One of the parameters in your function call doesn't have the right type and can't be automatically [[Legacy:Typecasting|casted]] to it.  Look up the original declaration of the function (in the original UnrealScript source code or here on the Wiki) and double-check against the types of the values you're actually using.

;Error, Call to '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; bad or missing parameter 1:Due to Non-Existing Variable or Spelling mistake Example:&lt;uscript&gt;TriggerEvent('SomethingWrongHere', Self, Instigator)&lt;/uscript&gt;

;Error, Call to '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Bad ',' or missing ')' : This error is reported if you attempt to call a function with more parameters than it was declared with. In other words, there should be no comma where the compiler found it, maybe the call is simply missing a right parenthesis there. For example the [[Legacy:Global Function|global function]] '''Atan''' was defined with only one parameter in UT1, but with two parameters in later engine generations.

; Internal fixup error 0 : This error occurs when using &lt;code&gt;break&lt;/code&gt; in an &lt;code&gt;if&lt;/code&gt; statement inside a &lt;code&gt;case&lt;/code&gt; block.

; 'Else'&lt;nowiki&gt;:&lt;/nowiki&gt; Bad command or expression : Make sure there is an &lt;code&gt;If&lt;/code&gt; right before the mentioned &lt;code&gt;else&lt;/code&gt;. If that &lt;code&gt;If&lt;/code&gt; block executes more that one line of code, make sure the block is enclosed in braces. See [[Legacy:Flow Syntax|Flow Syntax]].

; Error, Bad or missing expression in '(some expression)': Check whatever comes after the expression mentioned in the message. For example, a &quot;Bad or missing expression in 'If'&quot; could mean the condition does not evaluate to a boolean value (True or False), and generally you might have mistyped the function or variable name.

; Error, Right type is incompatable with &quot;$&quot;: Usually when you have only specified the name of an array and not the variable contained inside.

; Error, Missing '(' in 'if' : Usually due to wrong operator eg. using If(a=b) instead of if(a==B).

;Error,Missing '(' in 'struct' : Can be caused by leaving Blank spaces in a variable name inside a struct.

; 'Else If' is not allowed here &lt;br /&gt;'Else' is not allowed here : Most likely you have the wrong number of braces after an &lt;code&gt;If&lt;/code&gt; statement.

; 'class' is not allowed here : Generally caused by having your class statement in the wrong place. However, I got this error as well in a switch statement by putting something after default, like so:

&lt;uscript&gt;
switch( CameraMode )
{
  case CAM_FocusFollowLOS:
//  ... lots of stuff skipped here
  default:
  case CAM_Still:
    break;
}
&lt;/uscript&gt;

; Enum is not allowed here. : You have an enum declaration appearing after functions. Enums must be defined at the top of the class along with variables.

; Bad variable or function '&lt;i&gt;name&lt;/i&gt;' in replication definition : The variable or function isn't declared in this class. Check for spelling errors and make sure the specified variable or function isn't already declared in a superclass.

; Error, 'class'&lt;nowiki&gt;:&lt;/nowiki&gt; Limitor '&lt;i&gt;name&lt;/i&gt;' is not a class name : The ''class name'' in &lt;tt&gt;class&lt;''class name''&gt;&lt;/tt&gt; does not point to an existing class. Make sure that the specified class is     ed at the time the script is compiled.

; Can't find Class '&lt;i&gt;class name&lt;/i&gt;' : This error can also occur for [[Legacy:Texture|Texture]]s, [[Legacy:Sound|Sound]]s, [[Legacy:Mesh|Mesh]]es, etc. Make sure the specified class is     ed at compile time by either adding its package to the EditPackages ''above'' your package's entry or using an &lt;code&gt;#exec OBJ LOAD&lt;/code&gt; line.

; &lt;i&gt;Package1.ClassName&lt;/i&gt;'s superclass must be &lt;i&gt;Package1.SuperClassName&lt;/i&gt;, not &lt;i&gt;Package2.SuperClassName&lt;/i&gt; : I got this weird error message when compiling two packages with similar class structures. ''Package1'' contained a class ''ClassName'' with the superclass ''SuperClassName'' (both in ''Package1'') and ''Package2'' contained the same classes. ''Package2'' was compiled before ''Package1'' and the error occured during parsing of ''ClassName'' in ''Package1''.&lt;br /&gt;Always change the class names when copying them from one project to another. It's fine as long as you compile them seperately, but as soon as you need both of them problems like this start occuring.&lt;br /&gt;&lt;br /&gt;'''j3rky:''' This error message also appears if you changed the ancestor class of native actors and objects (e.g. ''class A extends B'' changed to ''class A extends C''), without having rebuilt the native DLL. In that case, the native DLL still references the old class ''B'' while the script compiler is trying to bind to the new class ''C''. Fix this by deleting the old DLL, or by running ''ucc make'' with the ''-nobind'' option. Rebuild the DLL with the new generated header file.

; Unterminated string constant : This error occurs, when the closing double quotation marks for a string are missing. Note that while strings may contain line breaks, they may not span several lines in your code. Use the &lt;code&gt;Chr&lt;/code&gt; function to generate the line break characters if you need them.

'''fataoverdose'''You can also get this error if you put one to many double quotation marks in the string. 

; BEGIN OBJECT&lt;nowiki&gt;:&lt;/nowiki&gt; name &lt;i&gt;objectname&lt;/i&gt; redefined. : This error occures if two or more objects declared in the [[Legacy:Default Properties|default properties]] of the same class have the same name. The objects must have unique names.

; redundant data&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;defaultproperty declaration&lt;/i&gt; : You get this error when you redefine the default value of a property in the same class, like:&lt;uscript&gt;
defaultproperties
{
  somearray(0)=&quot;this will be reported by the compiler&quot;
  somearray(0)=&quot;this won't be reported&quot;
}
&lt;/uscript&gt;

'''Foxpaw:''' I accidentally did something similar, but the second variable was reported, not the first. However, since the variable in your example is an array, it may be treated differently. My code was (trimmed down a bit):

&lt;uscript&gt;
defaultproperties
{
  Skins(0)=Texture'PlayerSkins.JuggMaleABodyA'
  Skins(1)=Texture'PlayerSkins.JuggMaleAHeadA'
  CollisionRadius=+00050.000000
  CollisionHeight=+00050.000000

  CollisionRadius=+00034.000000
  CollisionHeight=+00078.000000
}
&lt;/uscript&gt;

In this code it reported that the 34 and 78 were the redundant data.

; Missing '(' in 'Remove(...)' : A dynamic array's Remove method expects the index of the first element and the number of elements to be removed in parentheses, like &quot;Remove(2,4)&quot;.

}
; Missing &quot;(&quot; in editable member variable: Don't put anything in the parentheses next to a variable name when defining a struct ie.

&lt;uscript&gt;
struct mystruct
{
Var(myvalues) float ValueA;
Var(myvalues) float ValueB;
}
&lt;/uscript&gt;

This will work;

&lt;uscript&gt;
struct mystruct
{
Var() float ValueA;
Var() float ValueB;
}
&lt;/uscript&gt;

; Error, ArrayCount argument is not an array : The syntax &lt;tt&gt;ArrayCount(''arrayname'')&lt;/tt&gt; only applies to static arrays. Use &lt;tt&gt;''arrayname''.Length&lt;/tt&gt; for dynamic arrays instead.

; Map are not supported in UnrealScript yet : You felt like experimenting, huh? :) The &lt;code&gt;map&lt;/code&gt; variable type isn't supported in UnrealScript.

; General protection fault!, ScriptCompiler&lt;nowiki&gt;::&lt;/nowiki&gt;CompileSecondPass : There's actually quite a string that acoompanies this, but this part should signal you that this is what you've got. You did something that the compiler can't handle but Epic never imagined you'd try. I got this error from trying to use an unconditional replication. I wanted this function to be replicated to the other party regardless of which machine it originated on, so I tried: reliable AddAction,RemoveAction; This will generate the above error. You MUST use the if part of the replication statement even if it will always be true.  There isn't any way to know exactly what is causing this error in your code, but by looking at the ucc.log, you can at least determine which class the unexpected error was encountered (it will be the last class listed prior to the stack trace).
::Another way to get the GFP failt is using [dependsOn] with a class that doesn't exists.

===Functions ===
; Redefinition of '&lt;i&gt;function name&lt;/i&gt;' differs from original : When overriding functions you are not allowed to change the return type, the number or type of parameters or some of the function modifiers, e.g. static functions must stay static, public functions can't become protected. (E.g. simulated or native functions can become non-simulated or non-native in subclasses though, because those keywords only apply to the actual implementation in that single class.)&lt;br /&gt;Functions can't be over    ed in UnrealScript.

; '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; too many parameters : In UnrealScript functions can have a maximum of 16 parameters. If you need more parameters you will have to put them in a struct or array and pass that to the function.

; Function '&lt;i&gt;function name&lt;/i&gt;' specifiers differ from original : This error occurs when you try to override a final function or try to override a public function with a protected or private one or a protected function with a private or public one. (see [[Legacy:Function Syntax|Function Syntax]])

; '&lt;i&gt;identifier&lt;/i&gt;' conflicts with '&lt;i&gt;other identifier&lt;/i&gt;' : You can have only one function of the same name within the same state of a class, and you can't have variables and functions with the same name in the same class at all.  Rename or remove one of the conflicting identifiers.

; Can't call instance functions from within static functions : [[Legacy:Static Function|Static function]]s can only call other static functions. Check if your function really needs to be static or whether you forgot to declare the other function as static.&lt;br /&gt;You can also get this error when trying to call a non-static function via the &lt;tt&gt;class'SomeClass'.static.FunctionName()&lt;/tt&gt; syntax.

; Bad preoperator definition: Your declaration of a preoperator is invalid. This is most often caused by attempting to set a priority for a preoperator, as preoperators and postoperators do not take a priority value. See [[Legacy:Scripting Operators|Scripting Operators]] for the proper declaration.

; Bad postoperator definition: This is the same as &quot;Bad preoperator definition,&quot; but for postoperators.

; Unknown Function '&lt;i&gt;function name&lt;/i&gt;' in 'Class &lt;i&gt;Package1.ClassName&lt;/i&gt;': This error comes up when your code attempts to call a function that does not exist. You may have forgot the parenthesis when using the &lt;code&gt;super&lt;/code&gt; keyword to call a function that have no parameters. This can also be caused by forgetting the cast on an object reference. Sometimes it is also caused by a misspelled function name.

; &lt;i&gt;Function name&lt;/i&gt; mismatches delegate &lt;i&gt;delegate name&lt;/i&gt; : You tried to assign a function to a delegate property, but the function's parameters and/or return value don't match the delegate's parameters and/or return value.

; Delegate assignment failed: You tried to assign a function to a delegate property, but the function's parameters and/or return value don't match the delegate's parameters and/or return value.

; Error, operator must have 2 parameters : Binary operators must be declared with two parameters and a return value. See [[Legacy:Scripting Operators|Scripting Operators]].

===Variables ===
; Can't assign Const variables : You are not allowed to assign class variables declared with the const modifier. (See [[Legacy:Variable Syntax|Variable Syntax]].) Instead find a native function which can set this variable. (e.g. SetDrawScale() for the DrawScale property)
; Error, Missing &lt;nowiki&gt;'&gt;'&lt;/nowiki&gt; in &lt;nowiki&gt;'&lt;/nowiki&gt;class limitor&lt;nowiki&gt;'&lt;/nowiki&gt; : 
I got this problem with the following code:

&lt;uscript&gt;
var array&lt;class&lt;WeaponFire&gt;&gt; WFCs;
&lt;/uscript&gt;

which was easily fixed by changing it to the following:

&lt;uscript&gt;
var array&lt;class&lt;WeaponFire&gt; &gt; WFCs;
&lt;/uscript&gt;

Presumably, it parses &quot;&gt;&gt;&quot; as an [[Legacy:Operator|operator]] and then can't find the closing &quot;&gt;&quot;.


; Can't save &lt;i&gt;class&lt;/i&gt;&lt;nowiki&gt;:&lt;/nowiki&gt; Graph is linked to external private object &lt;i&gt;object&lt;/i&gt; : One of your classes is making a reference to an object in another package without the RF_Public flag set.  This is not permitted in Unreal Packages.  Check your class for references to private or protected variables in other classes or to other object constants.   This error can also occur if you reference a protected variable in a superclass *if* your derived class resides in a different package from the class where the protected member is declared (even though this is technically supposed to work).

; Enums can only be declared in class or struct scope : Like the message says. Enums can't be declared in functions or operators.

; Variable declaration&lt;nowiki&gt;:&lt;/nowiki&gt; '&lt;i&gt;variable name&lt;/i&gt;' already defined : You tried to declare two variables with the same name in the same function.

; Expression has no effect : Expressions like &lt;code&gt;Int1 + Int2;&lt;/code&gt; have no effect, i.e. they don't change anything when not assigned to a variable. This error can also be caused by using an incorrect syntax for assigning values to array elements like &lt;code&gt;anArray(0) = anything;&lt;/code&gt; (the correct syntax is &lt;code&gt;anArray[0] = anything;&lt;/code&gt;)

; ')' Expression has no effect : You could be missing the first '(' in a log command.  You could also be typecasting wrong.  Also, make sure a function parameter does not have the same name as a function you're calling in that function.  Example:

&lt;uscript&gt;
function ThisIsWrong(int Spawn)
{
   If(Spawn == 1)
   Spawn(class'AClass');
}
&lt;/uscript&gt;

; Unrecognized member '&lt;i&gt;variable name&lt;/i&gt;' in class '&lt;i&gt;class name&lt;/i&gt;': You're attempting to use a &lt;i&gt;variable name&lt;/i&gt; that is not defined as a global variable in class &lt;i&gt;class name&lt;/i&gt;.  This usually occurs when you've typecasted a class variable, such as PlayerPawn(P) where P was defined as a Pawn.  In this situation, at the line this error mentions, you've probably forgotten to typecast your P variable.

; Unrecognized type '&lt;i&gt;variable type&lt;/i&gt;' : The class, enum or struct you wanted to use is not declared or not visible from this point. Also check for typos.

; Type mismatch in '&lt;i&gt;operator&lt;/i&gt;' : The variable type you specified doesn't match the type the operatore requires and can't be automatically casted to the required type.

; Type mismatch in 'If' : Similar to the type mismatch in operator. The condition must be a boolean value, it will not be [[Legacy:Typecasting|typecasted]] automatically. Often the use of &lt;code&gt;=&lt;/code&gt; instead of &lt;code&gt;----&lt;/code&gt; causes this error.

; Array mismatch in '=' : This error is thrown when some code attempts to copy a static array. Static arrays can be passed as function parameters but can't be copied. This implies that static arrays also can't be used as return types because they cannot be assigned to a more permanent var. Consider using a [[Legacy:Dynamic_Array|Dynamic_Array]] instead.

; Unrecognized variable '&lt;i&gt;variable name&lt;/i&gt;' name in replication definition : You tried to replicate a variable or function which was not declared in this class. Check for typos.

; Bool arrays are not allowed : Well, they are not allowed. :) Use ''byte'' arrays instead.

; Can only assign individual booleans, not boolean arrays : You tried to assign a static array to another static array. This message always says &quot;boolean&quot; although you can't even declare boolean arrays. ArrayOne = ArrayTwo is only allowed for dynamic arrays. Instead use a loop and assign element by element.

; Variable is too large (&lt;i&gt;x&lt;/i&gt; bytes, 255 max) : Static arrays and large structs can only be accessed from outside the object containing them when they use less than 255 bytesx of memory. This restriction may seem weird, but you'll have to live with it. Try using a dynamic array instead of a static one, break doen the struct into several class properties or use accessor functions to work around this restriction.

; Arrays within arrays not supported. : You can't use declarations like &quot;array&lt; array&lt;string&gt; &gt;&quot;, otherwise the compiler throws this error. You could however create a struct with an array as the only element and create an array of this struct.

; ObjectProperty '&lt;i&gt;Property Name&lt;/i&gt;' &lt;nowiki&gt;:&lt;/nowiki&gt; unresolved reference to '&lt;i&gt;Some Texture or Something&lt;/i&gt;' : This is usually caused by having a reference to a texture or other resource that is spelled incorrectly, you forgot to create, or something similar. However, this can also have an interesting cause: If the texture/whatever package contains a resource of a type that is not in a package above this one. (IE you made a custom Material class and the package has a material of that class in it, and the code for that Material class hasn't been compiled yet) then the entire package will fail to.&lt;br /&gt;This can also happen if you have multiple paths, both containing the offending package. For example: let's say you have a texture package called mytex.utx, and for some reason you put it in your mod\textures\ directory, as well as your ut200x\system directory. You then add a texture to the copy in your mod\textures\ directory, and forget to add it to the other one(sloppy, but I've done this on accident before.) And let's say that in your .ini file you have your mod\textures\ directory listed AFTER the ut200x\textures directory. Then ucc will      the first version of the package, thinking that's what you meant, but won't find the new texture, and spit this error at you. The solution: always only use one version of every package. Learn how to use ini files to tell UCC where to look for packages, rather than putting a copy in your mod directory to run, and your system directory to compile.'''FatalOverdose'''-note. one spelling mistake in a parent class can cause this error for all its children. This can be very frustrating when ucc tells you there are errors in scripts that seem to be totally correct. This can also occure if you try to put &quot;new class'name'&quot; in the defaultproperties.

; Variable declaration &lt;i&gt;variable name&lt;/i&gt;&lt;nowiki&gt;:&lt;/nowiki&gt; Bad or missing array size : You have to specify a numeric value as the size of a static array. It seems in UT the compiler doesn't recognize constants as the array size, but this works in UT2003. Also remember that you have to specify an integer value as the array size and the largest positive integer number UnrealScript knows is 2147483647. (Use the constant MaxInt if you can't remember this value, but why the heck would you create a static array this large?)

'''Foxpaw:''' It wouldn't let me use even 65536 elements in a static array. I needed the former number because I wanted to make something like a trig table, only for coordinate rotation instead of regular trig.

'''Wormbo:''' Try 65535 (maximum unsigned short) or 32767 (maximum signed short). What about using a dynamic array instead?

'''Foxpaw:''' I considered that, but then I figured that a dynamic array that large probrably would not be allocated a contiguous block of memory (unless it was a static array) and so there would be a lot of skipping around.

'''Wormbo:''' Dynamic arrays allocate a single block of memory. They just might decide to allocate a larger block if more space is required and release the previously used block.

; Variable '&lt;i&gt;variable name&lt;/i&gt;' already has a replication definition : The variable appears more than once in the replication block. You can specify only one replication statement per variable.

; 'struct'&lt;nowiki&gt;:&lt;/nowiki&gt; Expecting 'Var', got '&lt;i&gt;identifier&lt;/i&gt;' : Structs have to be declared in a certain way and all delcarations within the struct have to begin with &lt;code&gt;var&lt;/code&gt;. See also [[Legacy:Variable Syntax|Variable Syntax]].

; Invalid property or function call on a dynamic array : Dynamic arrays only have three properties and methods: Length, Insert() and Remove(). See [[Legacy:Variable Syntax|Variable Syntax]] for details.  The most common cause of this error is attempting to do something to an element in an array and forgetting the array index delimiter.  For example, doing something like &lt;tt&gt;MyArray.bDeleteMe&lt;/tt&gt; instead of &lt;tt&gt;MyArray[i].bDeleteMe&lt;/tt&gt;.

; You can only access default values of variables here : In [[Legacy:Static Function|static function]]s you do not have direct access to class-level variables. You can only access function parameters, local variables and, through the &lt;tt&gt;default.''VariableName''&lt;/tt&gt; syntax, the default values of class variables.

===Typecasting ===
; Cast from '&lt;i&gt;class name&lt;/i&gt;' to '&lt;i&gt;other class name&lt;/i&gt;' will always fail : You're attempting to perform a [[Legacy:Typecasting|typecast]] which will always fail because the class you're casting to is not a subclass of the variable's class.  (That's the case, for instance, if you try to cast a variable of type &lt;code&gt;class&lt;Something&gt;&lt;/code&gt; to an ''object'' of a different class.)

; Cast from '&lt;i&gt;class name&lt;/i&gt;' to '&lt;i&gt;other class name&lt;/i&gt;' is unneccessary : ''other class name'' is either the same class as ''class name'' or a superclass of it. This kind of [[Legacy:Typecasting|typecasting]] is not neccessary.

; No need to cast '&lt;i&gt;property type&lt;/i&gt;' to itself : When a property already is of e.g. type ''int'' there is no need to cast it to ''int'' again when using it. This error also occurs when you work with a &quot;subclass&quot; of a struct (e.g. ''plane'' extends ''vector'') and try to cast it to its &quot;superclass&quot; (e.g. &lt;tt&gt;vector(aPlaneStuct)&lt;/tt&gt;).

; Can't convert '&lt;i&gt;property type&lt;/i&gt;' to '&lt;i&gt;other property type&lt;/i&gt;' : This error occurs when you try to typecast between incompatible variable types like e.g. ''Object'' -&gt; ''Int'' (&quot;ObjectProperty to IntProperty&quot;) or ''vector'' -&gt; ''float'' (&quot;StructProperty to FloatProperty&quot;).

==Exec Warnings ==
; ExecWarning, Import Texture &lt;i&gt;name&lt;/i&gt; from &lt;i&gt;filename&lt;/i&gt; failed&lt;br /&gt;ExecWarning, Failed factoring&lt;nowiki&gt;:&lt;/nowiki&gt; NEW SOUND FILE=&lt;i&gt;filename&lt;/i&gt; PACKAGE=&lt;i&gt;packagename&lt;/i&gt; NAME=&lt;i&gt;name&lt;/i&gt; : Usually these errors are caused by missing files or typos. Check the spelling of the file name and make sure the file really is where ''filename'' points to. Remember that the UT\MyMod directory is the base for specifying file names in #exec lines.

; Failed     ing package&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file '&lt;i&gt;filename&lt;/i&gt;' : The package you specified in an &lt;code&gt;#exec obj     &lt;/code&gt; line could not be found. Check the spelling of the file name.

; ExecWarning, Bad MESH LODPARAMS&lt;br /&gt;ExecWarning, Bad MESH ORIGIN&lt;br /&gt;ExecWarning, Bad MESH SEQUENCE&lt;br /&gt;ExecWarning, Missing meshmap&lt;br /&gt;ExecWarning, Missing meshmap, texture, or num (MESHMAP=&lt;i&gt;meshmap name&lt;/i&gt; NUM=&lt;i&gt;number&lt;/i&gt; TEXTURE=&lt;i&gt;texture name&lt;/i&gt;) : All these errors can be caused by a missing file for the mesh. Check for typos and check the log for details about which file is missing.&lt;br /&gt;The last error can also be caused by a missing texture. Make sure the texture is either imported or the texture's package is     ed before assigning it to a mesh.

; Texture dimensions are not powers of two&lt;br /&gt;Can't find file '&lt;i&gt;texture file&lt;/i&gt;' for import&lt;br /&gt;&lt;i&gt;path and filename of class file&lt;/i&gt;(&lt;i&gt;line number&lt;/i&gt;) &lt;nowiki&gt;:&lt;/nowiki&gt; ExecWarning, Import texture &lt;i&gt;texture name&lt;/i&gt; from &lt;i&gt;texture file&lt;/i&gt; failed : These errors always show up together. They are caused, like the message says, when your textures are not sized in a power of two (i.e 32x32, 64x128, etc.).

; Unknown property in defaults&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;the line in defaultproperties&lt;/i&gt; : Mostly the variable is not declared or there are spaces around the &quot;&lt;code&gt;=&lt;/code&gt;&quot;. Also see [[Legacy:Default Properties|Default Properties]].

; Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed to      '&lt;i&gt;package&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;'&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed to      '&lt;i&gt;texture package&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;'&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed     ing package&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;' : '''Pingz:'''  I'm getting these warnings from a single #exec statement in my project which intends to      a texture package.  The package does exist and the url is correct.  As a test i deleted the texture package file and the warning changed to the correct &lt;i&gt;Can't find file 'texture package'&lt;/i&gt; message.  Anyone got a clue as to what this means?  Please replace my comment here with some sort of explanation.[[:Category:Legacy Answer Needed]]

==Bizarre Compiler Errors ==
; Compiler Hangs/Freezes : This is obviously a difficult type of error to troubleshoot. Simply put, the compiler simply ceases compiling, generally as soon as opening your package or while it is &quot;Analysing...&quot; I'm not certain what causes this, generally I remove classes from the package until eventually it stops doing it, then see which classes it hangs with and which it does not to help isolate the problem. I've found that sometimes I'll accidentally make my classes extend themselves or extend their own subclasses (a result of not paying attention) and this will cause this type of problem. Any further information on what specific conditions can cause this would certainately be appreciated.

'''Faithful:''' Having \&quot; anywhere (&lt;i&gt;including&lt;/i&gt; inside either style comment) except inside a set of &quot;&quot; will cause the compiler to hang at &quot;Analyzing...&quot; . I have noticed that using \\&quot; in place of \&quot; will prevent this problem.

; Compiler suddenly drops back to DOS prompt/whatever : This is a weird one. It compiles as normal, and while in the &quot;Parsing&quot; section, simply stops. No error message, nothing. Just drops back to the DOS prompt. UCC.log ends mid-comment. The problem turned out to be a struct that I was using &amp;ndash; which contained an array of that same struct. The compiler is capable of warping its head around that notion but if you try to actually declare a variable of that struct it doesn't know what to do &amp;ndash; kind of like infinite recursion.

Error: VelocityScale::ImportText failed in:               -

Error: Unknown member  X  in StartSizeRangeStartSizeRange &amp;rarr;Can be all due to incorrect spacing in the defaultproperties

Error: Unknown member  RelativeSize in SizeScale          &amp;ndash; may be due to using global search and replace in ude

Error: Unknown member  b in Color                         -

-Fataloverdose.-

===Unknown===

==Related Topics ==
* [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:Unreal Coding FAQ|Unreal Coding FAQ]]
* [[Legacy:Compiling With UCC|Compiling With UCC]]
* [[Legacy:UnrealScript Language Test|UnrealScript Language Test]]

==Discussion==

Tenative answer here... gurus feel free to confirm or deny this:

;  Variable is too large (xxx bytes, 255 max): &lt;br /&gt;These occur when you try to access a data structure that is greater then 255 bytes from another object.You might only be trying to access a little bool but if that bool is part of an array of structs whose total size is bigger than 255 bytes then you're not going to be able to code stuff like:

bMyvar = otheractor.bigarray[i].bTheirVar ;

Without the compiler choking and giving that &quot;context: variable is too large&quot; error.

To work round this you can code a method into the object that contains the large structure that returns the element you're after (or, if the object is part of a package you can't recompile, then make a subclass and impliment the method there) like this:

&lt;uscript&gt;

// this is in the actor that contains the large array you need to access

function bool checktheirvar(int index)
{
  return(bigarray[index].bTheirVar);
}

// and this goes in the other object that's trying to access that data

bMyvar=otheractor.Checktheirvar(i);

&lt;/uscript&gt;

'''El Muerte TDS:''' afaik the ''variable too large'' only happens with static arrays and structs, so when you use dynamic arrays it won't happen. With dynamic arrays only a pointer it passed, while with static arrays and structs the whole array/struct will be passed. Yes dynamic arrays are slower, but with a big array it doesn't matter much.

:'''Mychaeel:''' &quot;Dynamic arrays are slower&quot;?  Only if you count adding and removing elements, but that's plain impossible with static arrays.  Accessing existing array elements is just as fast as with static arrays.

:'''JoeDark:''' Accessing existing array elements in a dynamic array is only as fast as a static array if they are handled like Vectors in Java where it is actually a static array disguised as a dynamic array. If it's done as a linked list then access is O(n) compared to the static array's O(1) access time so static access is obviously faster, though unless your dealing with a large n not that much faster.

:'''Foxpaw:''' Well, there's more than just two possible implementations of the dynamic arrays. The Unreal engine is chock full of caching schemes, tables, and other methods of storing and retrieving data that are far more complex than what one would generally assume of the implementation, and render speculation about the number of operations required for a given operation shaky at best. I wouldn't be surprised if static arrays and dynamic arrays are both stored in a relational database and looked up that way. The only way to really tell which is faster is to time them, but even that wouldn't really be accurate, because there's other stuff to consider.

:For instance, if the implementation is as you suggested, (block of memory for array, linked list for dynamic arrays) then you would be doing a great number of operations on the stack. Anyways, I don't know how dynamic arrays or even static arrays are implemented in the Unreal Engine, but I'd question the notion that dynamic arrays are a linked list - because when you pass one to a function you get a duplicate array, not a pointer into an array.

:'''JoeDark:''' Fair enough, esp. because uscript is an interpreted language arrays might be implemented any number of ways, including relational databases ;)

:'''Red:''' I presume the issue is because of how the array is stored in memory. and because dynamic ones only pass a pointer rather than the whole array.still getting the infor be accessing with a method is one workable soultion, but i'm not sure if it would be faster than passing a pointer to a dynamic array.... both methods essentially allow you access the pieces of info you want, in sligthly different ways.

----

So why don't try

&lt;uscript&gt;
var array&lt;mystruct&gt; bigarray;
&lt;/uscript&gt;

'''Zedsquared:''' ok, thanks, cool for UT2003, but UT dosen't properly support dynamic arrays does it?  Anyone know any other way around this in UT classic?

'''Mychaeel:''' Other than an accessor method, no.

'''Foxpaw:''' There is a way around this and it is very graceful, iffin you ask me. It uses a little thing called a [[Legacy:Linked List|linked list]] which is detailed elsewhere on the Wiki.

===Script serialization mismatch===

This is an Error I'm getting while trying to compile with UMake, using the standard directories stated in the compiling with UCC page. I'm basically using the Bulldog scripts as REF.. changing the Tex, Models, and classes names..

&lt;uscript&gt;

Parsing WarthogHeadlight

Script serialization mismatch: Got 0, expected -2147483612

History: UStruct::Serialize &lt;- (Class WHSkins.TexAlignerPlanar0) &lt;- UState::Serialize &lt;- UClass::Serialize
 &lt;- (Class WHSkins.TexAlignerPlanar0) &lt;- LoadObject
 &lt;- (Class WHSkins.TexAlignerPlanar0 5595020==5595020/5939846 5594999 16) 
&lt;- ULinkerLoad::Pre     &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::SafeExec 
&lt;- (LOAD FILE=WHSkins.utx) &lt;- UEditorEngine::SafeExec &lt;- (OBJ LOAD FILE=WHSkins.utx) 
&lt;- FScriptCompiler::ProcessCompilerDirective &lt;- Directive &lt;- FScriptCompiler::CompileDeclaration 
&lt;- FScriptCompiler::CompileStatement &lt;- FirstPass &lt;- TryCompile &lt;- FScriptCompiler::CompileScript 
&lt;- (Class Halo.WarthogHeadlight, Pass 0, Line 1) &lt;- MakeScript &lt;- MakeScript &lt;- MakeScript &lt;- MakeScript 
&lt;- MakeScript &lt;- DoScripts &lt;- UEditorEngine::MakeScripts &lt;- UMakeCommandlet::Main

Exiting due to error

&lt;/uscript&gt;

'''Wormbo:''' The error message itself doesn't help solving the problem. At least the WarthogHeadlight class' code should be posted, too.

'''Adam1972:''' Actually, I've been hammering away at finding the answer... When I posted the problem I couldn't make

sense of what was happening... This is what I have so far.. I have a texture file called WHSkins.utx, and a mesh file

called WHMeshes.usx That I've created to replace the Bulldog textures and also A Warthog mesh from Halo to replace the

Warthog... So I assume I should be able to basically plug in the diffrences, at least to get it to go. When You look at

the Bulldog.uc ....

&lt;uscript&gt;
#exec OBJ LOAD FILE=..\staticmeshes\BulldogMeshes.usx
#exec OBJ LOAD FILE=..\sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=..\textures\VehicleFX.utx

&lt;/uscript&gt;

'''Adam1972:''' Then comparing it to my Warthog.uc:

&lt;uscript&gt;
#exec OBJ LOAD FILE=..\staticmeshes\WHMeshes.usx
#exec OBJ LOAD FILE=..\sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=..\textures\WHSkins.utx
&lt;/uscript&gt;

'''Adam1972:''' You'll see I only changed the filename.. I followed the Instructions on compiling with UCC and figure that the directories inside the project should match what is listed in the UCC compiling page.. so I made a Halo directory and placed a Class, Textures, and Models folder inside. Umake begins to parse the files and when it hits the WarthogHeadlight.uc file which looks like this:

&lt;uscript&gt;
#exec OBJ LOAD FILE=WHSkins.utx

class WarthogHeadlight extends DynamicProjector;

// Empty tick here - do detach/attach in Warthog tick
function Tick(float Delta)
{

}
&lt;/uscript&gt;

It returns a WHSkins.utx not found. This script is exactly like the original BulldogHeadlight.uc script. I get the same

with the scripts calling on the WHMeshes.usx. 

If I change it to #exec OBJ LOAD FILE=..\textures\WHSkins.utx it still does not find the files. If I place those same 2

files into the UT2003 folder in their respective folders.. Well that's when I get the &quot;Script serialization mismatch&quot; 

error. I get no errors associated with the script itself, the only problem I found with that was the &quot;defaultproperties&quot;

that all the decompiled originals have.. my warthog ones seemed to cause errors until I deleted those &quot;defaultproperties&quot;.

I'm stumped.... Please help :S

'''Foxpaw:''' I don't have UT2003 but I have found something that I think may be the problem. It doesn't surprise me that neither FILE=WHSkins.utx nor FILE=..\textures\WHSkins.utx finds the headlight. The former will look in the base directory of your class, the &quot;Halo&quot; directory, and the second goes up a step then looks in the base directory of your UT2003 install to find a package called &quot;textures.&quot; Remember it starts from &quot;Halo,&quot; not &quot;Halo\classes.&quot; &quot;..&quot; means up one directory. What you need to put to reference &quot;Halo\textures&quot; is &quot;FILE=.\textures\WHSkins.utx.&quot; Scratch the last dot, that's just for correct punctuation. &quot;..&quot; means go up one directory, &quot;.&quot; means look in this directory. It's basically the same as writing &quot;FILE=\textures\WHSkins.utx&quot; except that the compiler won't accept that, so the single dot is used to denote a subdirectory of the one it starts in.

'''Languard:''' Minor correction: UT2003 does accept &quot;FILE=\textures\ect&quot; I don't think having the current directory dot will hurt, but it isn't needed.  Not on XP at least, it might be different for the other OS's.  As a side note, I'm not sure why they      the object files with exec statments, since it is not needed.  I know this because for my sword attachment class, I use an animated mesh that I've placed in the Animations directory, but I do not have any exec statments to      it, and it works fine.  The only thing I can think of is maybe it is for performance reasons.

'''Languard:''' Correction to previous satement, you do need the      statments.  My misconception was due to some really bad coding on my part, and I forgot about this one      statement I had in a wierd spot.  Yet another reason why you should always code neatly, even if it is throwaway code.

'''Foxpaw:''' Yes, I don't think you need the dots, the problem with the code that was listed was that it had a double dot and was going up one directory isntead of going fromt he current directory. You actually don't need the      statements if you have the thing you were going to      already in another package, so long as you refer to that package at compile-time. I never use      statements and it works fine for me.

'''Lilguy:''' just added some stuff to the &quot;unresolved reference&quot; error.

'''FatalOverdose''' Added &quot;just added 'Error, Bad or missing expression in 'If'&quot;. This a very usfull page but its getting to big.

'''Tarquin:''' All the comments and chat need to be refactored into document mode. That would slim it down a bit! :)

[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2117</id>
      <timestamp>2007-10-20T05:29:43Z</timestamp>
      <contributor>
        <ip>XxDangerxX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The warnings and errors described on this page are generated only by the compiler. If you need information about logged in-game warnings see [[Legacy:Log Warnings|Log Warnings]].

The [[Legacy:Ucc|Ucc]] Make [[Legacy:Commandlet|commandlet]] outputs warning and critical error messages in the form
 ''&lt;path and filename&gt;''(''line number'') : ''error message''

Usually the problem can be found by opening the specified file and looking at the specified line number. Exceptions are missing declarations or braces further up in the file or missing declarations in a superclass (if it's part of your code). The Wiki recommends the [[Legacy:UMake|UMake]] compiling tool :D.

==Warnings ==

; Warning, '&lt;i&gt;name&lt;/i&gt;' obscures '&lt;i&gt;name&lt;/i&gt;' defined in base class : You declared a class variable, struct or enum with the same name as a class variable, struct or enum of a superclass. This will obscure the object in the superclass so you can't access it in the code of your class anymore.&lt;br /&gt;In UT2004 this warning also applies to local function variables which obscure class variables in the same class or one of its superclasses.

'''Foxpaw:''' Could you get around this by simply using Self.? IE, if variable A was obscured by local variable A, you should be able to access local A with A, and global A with Self.A. Seems like it would work.

'''Wormbo:''' Of course you could, but the warning is there because the usual way to access the class varaible is blocked. It's easier to find the problem with this warning when you access the obscuring variable instead of the obscured one in you code.

; Warning, '&lt;i&gt;variable name&lt;/i&gt;' - unreferenced local variable : A function declares a local variable but doesn't use it beyond that &amp;ndash; you may as well remove it if [[Wiki:YouArentGonnaNeedIt]]

; Warning, &lt;i&gt;function name&lt;/i&gt; - Missing return value : The function is declared as returning a value, but there's no '''return''' statement in the function. The default value of that variable type will be returned (e.g. false, 0, &quot;&quot;, None; also see [[Legacy:Variable Syntax|Variable Syntax]])

; ExecWarning, Reference to deprecated property '&lt;i&gt;variable name&lt;/i&gt;' : You are using a variable marked as deprecated in your code.

; Warning, Class names shouldn't end in a digit: This warning appears harmless enough. Classes with names ending in a digit (IE BloodFX2) seem to work fine.

; Warning, Missing Function : You are calling a function that has not been defined.

==Syntax Errors ==

===General Structure ===
; Bad class definition '&lt;i&gt;class name&lt;/i&gt;' : In [[Legacy:UT2003|UT2003]], the most common cause for this error is that you accidentally used &quot;expands&quot; instead of &quot;extends.&quot;  The old keyword &quot;expands&quot; is not supported anymore.  (It has been considered deprecated for a long while already.)

; Superclass &lt;i&gt;class name&lt;/i&gt; of class &lt;i&gt;other class name&lt;/i&gt; not found : The superclass of one of your classes couldn't be found. Check the class header of the second class for typos. If the superclass is in the same package also check its class header, if not check the [[Legacy:Game Ini File|Game Ini File]]'s EditPackages lines for missing packages. 

; Unexpected end of file at end of class : This is usually caused by one or more missing &quot;&lt;code&gt;}&lt;/code&gt;&quot;. This error can be quite annoying in large classes. Most of it is prevented by proper code indentation and (what experienced coders frequently do) writing ''both'' the opening and the closing brace at the same time and then filling in code between them.

; Unexpected 'defaultproperties' : The [[Legacy:Default Properties|default properties]] block can only be used outside of [[Legacy:UnrealEd|UnrealEd]]. Within UnrealEd, they have to be set from the [[Legacy:Actor Classes Browser|Actor Classes Browser]] interface; hidden variables (not declared to show up in any of the property groups) can have their defaults set via the [[Legacy:UnrealEd Console|UnrealEd console]]. Use [[Legacy:Compiling With UCC|UCC Make]] instead of UnrealEd to compile your classes if you want to use this feature. This error can also happen when you use a weird commenting style like:&lt;uscript&gt;
/* some comment
*///===========
&lt;/uscript&gt;Basically using a multi-line comment immediately followed by a single-line comment anywhere in your class breaks the parser and makes it complain about the &lt;/code&gt;defaultproperties&lt;/code&gt; keyword. Add a whitespace or linebreak or think about your commenting style in general. ;)

; Unexpected '&lt;i&gt;} or identifier&lt;/i&gt;' : This is caused by one or more missing &quot;&lt;code&gt;{&lt;/code&gt;&quot; or too many &quot;&lt;code&gt;}&lt;/code&gt;&quot;. See suggestions above.

; Call to '&lt;i&gt;function&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Type mismatch in parameter &lt;i&gt;number&lt;/i&gt; : One of the parameters in your function call doesn't have the right type and can't be automatically [[Legacy:Typecasting|casted]] to it.  Look up the original declaration of the function (in the original UnrealScript source code or here on the Wiki) and double-check against the types of the values you're actually using.

;Error, Call to 'Function/Something': bad or missing parameter 1:Due to Non-Existing Variable or Spelling mistake Example:&lt;uscript&gt;TriggerEvent('SomethingWrongHere', Self, Instigator)&lt;/uscript&gt;

; Internal fixup error 0 : This error occurs when using &lt;code&gt;break&lt;/code&gt; in an &lt;code&gt;if&lt;/code&gt; statement inside a &lt;code&gt;case&lt;/code&gt; block.

; 'Else'&lt;nowiki&gt;:&lt;/nowiki&gt; Bad command or expression : Make sure there is an &lt;code&gt;If&lt;/code&gt; right before the mentioned &lt;code&gt;else&lt;/code&gt;. If that &lt;code&gt;If&lt;/code&gt; block executes more that one line of code, make sure the block is enclosed in braces. See [[Legacy:Flow Syntax|Flow Syntax]].

; Error, Bad or missing expression in '(some expression)': Check whatever comes after the expression mentioned in the message. For example, a &quot;Bad or missing expression in 'If'&quot; could mean the condition does not evaluate to a boolean value (True or False), and generally you might have mistyped the function or variable name.

; Error,Right type is incompatable with &quot;$&quot;: Usually when you have only specified the name of an array and not the variable contained inside.

; Error,Missing '(' in 'if' : Usually due to wrong operator eg. using If(a=b) instead of if(a==B).

;Error,Missing '(' in 'struct' : Can be caused by leaving Blank spaces in a variable name inside a struct.

; 'Else If' is not allowed here &lt;br /&gt;'Else' is not allowed here : Most likely you have the wrong number of braces after an &lt;code&gt;If&lt;/code&gt; statement.

; 'class' is not allowed here : Generally caused by having your class statement in the wrong place. However, I got this error as well in a switch statement by putting something after default, like so:

&lt;uscript&gt;
switch( CameraMode )
{
  case CAM_FocusFollowLOS:
//  ... lots of stuff skipped here
  default:
  case CAM_Still:
    break;
}
&lt;/uscript&gt;

; Enum is not allowed here. : You have an enum declaration appearing after functions. Enums must be defined at the top of the class along with variables.

; Bad variable or function '&lt;i&gt;name&lt;/i&gt;' in replication definition : The variable or function isn't declared in this class. Check for spelling errors and make sure the specified variable or function isn't already declared in a superclass.

; Error, 'class'&lt;nowiki&gt;:&lt;/nowiki&gt; Limitor '&lt;i&gt;name&lt;/i&gt;' is not a class name : The ''class name'' in &lt;tt&gt;class&lt;''class name''&gt;&lt;/tt&gt; does not point to an existing class. Make sure that the specified class is     ed at the time the script is compiled.

; Can't find Class '&lt;i&gt;class name&lt;/i&gt;' : This error can also occur for [[Legacy:Texture|Texture]]s, [[Legacy:Sound|Sound]]s, [[Legacy:Mesh|Mesh]]es, etc. Make sure the specified class is     ed at compile time by either adding its package to the EditPackages ''above'' your package's entry or using an &lt;code&gt;#exec OBJ LOAD&lt;/code&gt; line.

; &lt;i&gt;Package1.ClassName&lt;/i&gt;'s superclass must be &lt;i&gt;Package1.SuperClassName&lt;/i&gt;, not &lt;i&gt;Package2.SuperClassName&lt;/i&gt; : I got this weird error message when compiling two packages with similar class structures. ''Package1'' contained a class ''ClassName'' with the superclass ''SuperClassName'' (both in ''Package1'') and ''Package2'' contained the same classes. ''Package2'' was compiled before ''Package1'' and the error occured during parsing of ''ClassName'' in ''Package1''.&lt;br /&gt;Always change the class names when copying them from one project to another. It's fine as long as you compile them seperately, but as soon as you need both of them problems like this start occuring.&lt;br /&gt;&lt;br /&gt;'''j3rky:''' This error message also appears if you changed the ancestor class of native actors and objects (e.g. ''class A extends B'' changed to ''class A extends C''), without having rebuilt the native DLL. In that case, the native DLL still references the old class ''B'' while the script compiler is trying to bind to the new class ''C''. Fix this by deleting the old DLL, or by running ''ucc make'' with the ''-nobind'' option. Rebuild the DLL with the new generated header file.

; Unterminated string constant : This error occurs, when the closing double quotation marks for a string are missing. Note that while strings may contain line breaks, they may not span several lines in your code. Use the &lt;code&gt;Chr&lt;/code&gt; function to generate the line break characters if you need them.

'''fataoverdose'''You can also get this error if you put one to many double quotation marks in the string. 

; BEGIN OBJECT&lt;nowiki&gt;:&lt;/nowiki&gt; name &lt;i&gt;objectname&lt;/i&gt; redefined. : This error occures if two or more objects declared in the [[Legacy:Default Properties|default properties]] of the same class have the same name. The objects must have unique names.

; redundant data&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;defaultproperty declaration&lt;/i&gt; : You get this error when you redefine the default value of a property in the same class, like:&lt;uscript&gt;
defaultproperties
{
  somearray(0)=&quot;this will be reported by the compiler&quot;
  somearray(0)=&quot;this won't be reported&quot;
}
&lt;/uscript&gt;

'''Foxpaw:''' I accidentally did something similar, but the second variable was reported, not the first. However, since the variable in your example is an array, it may be treated differently. My code was (trimmed down a bit):

&lt;uscript&gt;
defaultproperties
{
  Skins(0)=Texture'PlayerSkins.JuggMaleABodyA'
  Skins(1)=Texture'PlayerSkins.JuggMaleAHeadA'
  CollisionRadius=+00050.000000
  CollisionHeight=+00050.000000

  CollisionRadius=+00034.000000
  CollisionHeight=+00078.000000
}
&lt;/uscript&gt;

In this code it reported that the 34 and 78 were the redundant data.

; Missing '(' in 'Remove(...)' : A dynamic array's Remove method expects the index of the first element and the number of elements to be removed in parentheses, like &quot;Remove(2,4)&quot;.

}
; Missing &quot;(&quot; in editable member variable: Don't put anything in the parentheses next to a variable name when defining a struct ie.

&lt;uscript&gt;
struct mystruct
{
Var(myvalues) float ValueA;
Var(myvalues) float ValueB;
}
&lt;/uscript&gt;

This will work;

&lt;uscript&gt;
struct mystruct
{
Var() float ValueA;
Var() float ValueB;
}
&lt;/uscript&gt;

; Error, ArrayCount argument is not an array : The syntax &lt;tt&gt;ArrayCount(''arrayname'')&lt;/tt&gt; only applies to static arrays. Use &lt;tt&gt;''arrayname''.Length&lt;/tt&gt; for dynamic arrays instead.

; Map are not supported in UnrealScript yet : You felt like experimenting, huh? :) The &lt;code&gt;map&lt;/code&gt; variable type isn't supported in UnrealScript.

; General protection fault!, ScriptCompiler&lt;nowiki&gt;::&lt;/nowiki&gt;CompileSecondPass : There's actually quite a string that acoompanies this, but this part should signal you that this is what you've got. You did something that the compiler can't handle but Epic never imagined you'd try. I got this error from trying to use an unconditional replication. I wanted this function to be replicated to the other party regardless of which machine it originated on, so I tried: reliable AddAction,RemoveAction; This will generate the above error. You MUST use the if part of the replication statement even if it will always be true.  There isn't any way to know exactly what is causing this error in your code, but by looking at the ucc.log, you can at least determine which class the unexpected error was encountered (it will be the last class listed prior to the stack trace).
::Another way to get the GFP failt is using [dependsOn] with a class that doesn't exists.

===Functions ===
; Redefinition of '&lt;i&gt;function name&lt;/i&gt;' differs from original : When overriding functions you are not allowed to change the return type, the number or type of parameters or some of the function modifiers, e.g. static functions must stay static, public functions can't become protected. (E.g. simulated or native functions can become non-simulated or non-native in subclasses though, because those keywords only apply to the actual implementation in that single class.)&lt;br /&gt;Functions can't be over    ed in UnrealScript.

; '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; too many parameters : In UnrealScript functions can have a maximum of 16 parameters. If you need more parameters you will have to put them in a struct or array and pass that to the function.

; Function '&lt;i&gt;function name&lt;/i&gt;' specifiers differ from original : This error occurs when you try to override a final function or try to override a public function with a protected or private one or a protected function with a private or public one. (see [[Legacy:Function Syntax|Function Syntax]])

; '&lt;i&gt;identifier&lt;/i&gt;' conflicts with '&lt;i&gt;other identifier&lt;/i&gt;' : You can have only one function of the same name within the same state of a class, and you can't have variables and functions with the same name in the same class at all.  Rename or remove one of the conflicting identifiers.

; Can't call instance functions from within static functions : [[Legacy:Static Function|Static function]]s can only call other static functions. Check if your function really needs to be static or whether you forgot to declare the other function as static.&lt;br /&gt;You can also get this error when trying to call a non-static function via the &lt;tt&gt;class'SomeClass'.static.FunctionName()&lt;/tt&gt; syntax.

; Bad preoperator definition: Your declaration of a preoperator is invalid. This is most often caused by attempting to set a priority for a preoperator, as preoperators and postoperators do not take a priority value. See [[Legacy:Scripting Operators|Scripting Operators]] for the proper declaration.

; Bad postoperator definition: This is the same as &quot;Bad preoperator definition,&quot; but for postoperators.

; Unknown Function '&lt;i&gt;function name&lt;/i&gt;' in 'Class &lt;i&gt;Package1.ClassName&lt;/i&gt;': This error comes up when your code attempts to call a function that does not exist. You may have forgot the parenthesis when using the &lt;code&gt;super&lt;/code&gt; keyword to call a function that have no parameters. This can also be caused by forgetting the cast on an object reference. Sometimes it is also caused by a misspelled function name.

; &lt;i&gt;Function name&lt;/i&gt; mismatches delegate &lt;i&gt;delegate name&lt;/i&gt; : You tried to assign a function to a delegate property, but the function's parameters and/or return value don't match the delegate's parameters and/or return value.

; Delegate assignment failed: You tried to assign a function to a delegate property, but the function's parameters and/or return value don't match the delegate's parameters and/or return value.

; Error, operator must have 2 parameters : Binary operators must be declared with two parameters and a return value. See [[Legacy:Scripting Operators|Scripting Operators]].

===Variables ===
; Can't assign Const variables : You are not allowed to assign class variables declared with the const modifier. (See [[Legacy:Variable Syntax|Variable Syntax]].) Instead find a native function which can set this variable. (e.g. SetDrawScale() for the DrawScale property)
; Error, Missing &lt;nowiki&gt;'&gt;'&lt;/nowiki&gt; in &lt;nowiki&gt;'&lt;/nowiki&gt;class limitor&lt;nowiki&gt;'&lt;/nowiki&gt; : 
I got this problem with the following code:

&lt;uscript&gt;
var array&lt;class&lt;WeaponFire&gt;&gt; WFCs;
&lt;/uscript&gt;

which was easily fixed by changing it to the following:

&lt;uscript&gt;
var array&lt;class&lt;WeaponFire&gt; &gt; WFCs;
&lt;/uscript&gt;

Presumably, it parses &quot;&gt;&gt;&quot; as an [[Legacy:Operator|operator]] and then can't find the closing &quot;&gt;&quot;.


; Can't save &lt;i&gt;class&lt;/i&gt;&lt;nowiki&gt;:&lt;/nowiki&gt; Graph is linked to external private object &lt;i&gt;object&lt;/i&gt; : One of your classes is making a reference to an object in another package without the RF_Public flag set.  This is not permitted in Unreal Packages.  Check your class for references to private or protected variables in other classes or to other object constants.   This error can also occur if you reference a protected variable in a superclass *if* your derived class resides in a different package from the class where the protected member is declared (even though this is technically supposed to work).

; Enums can only be declared in class or struct scope : Like the message says. Enums can't be declared in functions or operators.

; Variable declaration&lt;nowiki&gt;:&lt;/nowiki&gt; '&lt;i&gt;variable name&lt;/i&gt;' already defined : You tried to declare two variables with the same name in the same function.

; Expression has no effect : Expressions like &lt;code&gt;Int1 + Int2;&lt;/code&gt; have no effect, i.e. they don't change anything when not assigned to a variable. This error can also be caused by using an incorrect syntax for assigning values to array elements like &lt;code&gt;anArray(0) = anything;&lt;/code&gt; (the correct syntax is &lt;code&gt;anArray[0] = anything;&lt;/code&gt;)

; ')' Expression has no effect : You could be missing the first '(' in a log command.  You could also be typecasting wrong.  Also, make sure a function parameter does not have the same name as a function you're calling in that function.  Example:

&lt;uscript&gt;
function ThisIsWrong(int Spawn)
{
   If(Spawn == 1)
   Spawn(class'AClass');
}
&lt;/uscript&gt;

; Unrecognized member '&lt;i&gt;variable name&lt;/i&gt;' in class '&lt;i&gt;class name&lt;/i&gt;': You're attempting to use a &lt;i&gt;variable name&lt;/i&gt; that is not defined as a global variable in class &lt;i&gt;class name&lt;/i&gt;.  This usually occurs when you've typecasted a class variable, such as PlayerPawn(P) where P was defined as a Pawn.  In this situation, at the line this error mentions, you've probably forgotten to typecast your P variable.

; Unrecognized type '&lt;i&gt;variable type&lt;/i&gt;' : The class, enum or struct you wanted to use is not declared or not visible from this point. Also check for typos.

; Type mismatch in '&lt;i&gt;operator&lt;/i&gt;' : The variable type you specified doesn't match the type the operatore requires and can't be automatically casted to the required type.

; Type mismatch in 'If' : Similar to the type mismatch in operator. The condition must be a boolean value, it will not be [[Legacy:Typecasting|typecasted]] automatically. Often the use of &lt;code&gt;=&lt;/code&gt; instead of &lt;code&gt;----&lt;/code&gt; causes this error.

; Array mismatch in '=' : This error is thrown when some code attempts to copy a static array. Static arrays can be passed as function parameters but can't be copied. This implies that static arrays also can't be used as return types because they cannot be assigned to a more permanent var. Consider using a [[Legacy:Dynamic_Array|Dynamic_Array]] instead.

; Unrecognized variable '&lt;i&gt;variable name&lt;/i&gt;' name in replication definition : You tried to replicate a variable or function which was not declared in this class. Check for typos.

; Bool arrays are not allowed : Well, they are not allowed. :) Use ''byte'' arrays instead.

; Can only assign individual booleans, not boolean arrays : You tried to assign a static array to another static array. This message always says &quot;boolean&quot; although you can't even declare boolean arrays. ArrayOne = ArrayTwo is only allowed for dynamic arrays. Instead use a loop and assign element by element.

; Variable is too large (&lt;i&gt;x&lt;/i&gt; bytes, 255 max) : Static arrays and large structs can only be accessed from outside the object containing them when they use less than 255 bytesx of memory. This restriction may seem weird, but you'll have to live with it. Try using a dynamic array instead of a static one, break doen the struct into several class properties or use accessor functions to work around this restriction.

; Arrays within arrays not supported. : You can't use declarations like &quot;array&lt; array&lt;string&gt; &gt;&quot;, otherwise the compiler throws this error. You could however create a struct with an array as the only element and create an array of this struct.

; ObjectProperty '&lt;i&gt;Property Name&lt;/i&gt;' &lt;nowiki&gt;:&lt;/nowiki&gt; unresolved reference to '&lt;i&gt;Some Texture or Something&lt;/i&gt;' : This is usually caused by having a reference to a texture or other resource that is spelled incorrectly, you forgot to create, or something similar. However, this can also have an interesting cause: If the texture/whatever package contains a resource of a type that is not in a package above this one. (IE you made a custom Material class and the package has a material of that class in it, and the code for that Material class hasn't been compiled yet) then the entire package will fail to.&lt;br /&gt;This can also happen if you have multiple paths, both containing the offending package. For example: let's say you have a texture package called mytex.utx, and for some reason you put it in your mod\textures\ directory, as well as your ut200x\system directory. You then add a texture to the copy in your mod\textures\ directory, and forget to add it to the other one(sloppy, but I've done this on accident before.) And let's say that in your .ini file you have your mod\textures\ directory listed AFTER the ut200x\textures directory. Then ucc will      the first version of the package, thinking that's what you meant, but won't find the new texture, and spit this error at you. The solution: always only use one version of every package. Learn how to use ini files to tell UCC where to look for packages, rather than putting a copy in your mod directory to run, and your system directory to compile.'''FatalOverdose'''-note. one spelling mistake in a parent class can cause this error for all its children. This can be very frustrating when ucc tells you there are errors in scripts that seem to be totally correct. This can also occure if you try to put &quot;new class'name'&quot; in the defaultproperties.

; Variable declaration &lt;i&gt;variable name&lt;/i&gt;&lt;nowiki&gt;:&lt;/nowiki&gt; Bad or missing array size : You have to specify a numeric value as the size of a static array. It seems in UT the compiler doesn't recognize constants as the array size, but this works in UT2003. Also remember that you have to specify an integer value as the array size and the largest positive integer number UnrealScript knows is 2147483647. (Use the constant MaxInt if you can't remember this value, but why the heck would you create a static array this large?)

'''Foxpaw:''' It wouldn't let me use even 65536 elements in a static array. I needed the former number because I wanted to make something like a trig table, only for coordinate rotation instead of regular trig.

'''Wormbo:''' Try 65535 (maximum unsigned short) or 32767 (maximum signed short). What about using a dynamic array instead?

'''Foxpaw:''' I considered that, but then I figured that a dynamic array that large probrably would not be allocated a contiguous block of memory (unless it was a static array) and so there would be a lot of skipping around.

'''Wormbo:''' Dynamic arrays allocate a single block of memory. They just might decide to allocate a larger block if more space is required and release the previously used block.

; Variable '&lt;i&gt;variable name&lt;/i&gt;' already has a replication definition : The variable appears more than once in the replication block. You can specify only one replication statement per variable.

; 'struct'&lt;nowiki&gt;:&lt;/nowiki&gt; Expecting 'Var', got '&lt;i&gt;identifier&lt;/i&gt;' : Structs have to be declared in a certain way and all delcarations within the struct have to begin with &lt;code&gt;var&lt;/code&gt;. See also [[Legacy:Variable Syntax|Variable Syntax]].

; Invalid property or function call on a dynamic array : Dynamic arrays only have three properties and methods: Length, Insert() and Remove(). See [[Legacy:Variable Syntax|Variable Syntax]] for details.  The most common cause of this error is attempting to do something to an element in an array and forgetting the array index delimiter.  For example, doing something like &lt;tt&gt;MyArray.bDeleteMe&lt;/tt&gt; instead of &lt;tt&gt;MyArray[i].bDeleteMe&lt;/tt&gt;.

; You can only access default values of variables here : In [[Legacy:Static Function|static function]]s you do not have direct access to class-level variables. You can only access function parameters, local variables and, through the &lt;tt&gt;default.''VariableName''&lt;/tt&gt; syntax, the default values of class variables.

===Typecasting ===
; Cast from '&lt;i&gt;class name&lt;/i&gt;' to '&lt;i&gt;other class name&lt;/i&gt;' will always fail : You're attempting to perform a [[Legacy:Typecasting|typecast]] which will always fail because the class you're casting to is not a subclass of the variable's class.  (That's the case, for instance, if you try to cast a variable of type &lt;code&gt;class&lt;Something&gt;&lt;/code&gt; to an ''object'' of a different class.)

; Cast from '&lt;i&gt;class name&lt;/i&gt;' to '&lt;i&gt;other class name&lt;/i&gt;' is unneccessary : ''other class name'' is either the same class as ''class name'' or a superclass of it. This kind of [[Legacy:Typecasting|typecasting]] is not neccessary.

; No need to cast '&lt;i&gt;property type&lt;/i&gt;' to itself : When a property already is of e.g. type ''int'' there is no need to cast it to ''int'' again when using it. This error also occurs when you work with a &quot;subclass&quot; of a struct (e.g. ''plane'' extends ''vector'') and try to cast it to its &quot;superclass&quot; (e.g. &lt;tt&gt;vector(aPlaneStuct)&lt;/tt&gt;).

; Can't convert '&lt;i&gt;property type&lt;/i&gt;' to '&lt;i&gt;other property type&lt;/i&gt;' : This error occurs when you try to typecast between incompatible variable types like e.g. ''Object'' -&gt; ''Int'' (&quot;ObjectProperty to IntProperty&quot;) or ''vector'' -&gt; ''float'' (&quot;StructProperty to FloatProperty&quot;).

==Exec Warnings ==
; ExecWarning, Import Texture &lt;i&gt;name&lt;/i&gt; from &lt;i&gt;filename&lt;/i&gt; failed&lt;br /&gt;ExecWarning, Failed factoring&lt;nowiki&gt;:&lt;/nowiki&gt; NEW SOUND FILE=&lt;i&gt;filename&lt;/i&gt; PACKAGE=&lt;i&gt;packagename&lt;/i&gt; NAME=&lt;i&gt;name&lt;/i&gt; : Usually these errors are caused by missing files or typos. Check the spelling of the file name and make sure the file really is where ''filename'' points to. Remember that the UT\MyMod directory is the base for specifying file names in #exec lines.

; Failed     ing package&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file '&lt;i&gt;filename&lt;/i&gt;' : The package you specified in an &lt;code&gt;#exec obj     &lt;/code&gt; line could not be found. Check the spelling of the file name.

; ExecWarning, Bad MESH LODPARAMS&lt;br /&gt;ExecWarning, Bad MESH ORIGIN&lt;br /&gt;ExecWarning, Bad MESH SEQUENCE&lt;br /&gt;ExecWarning, Missing meshmap&lt;br /&gt;ExecWarning, Missing meshmap, texture, or num (MESHMAP=&lt;i&gt;meshmap name&lt;/i&gt; NUM=&lt;i&gt;number&lt;/i&gt; TEXTURE=&lt;i&gt;texture name&lt;/i&gt;) : All these errors can be caused by a missing file for the mesh. Check for typos and check the log for details about which file is missing.&lt;br /&gt;The last error can also be caused by a missing texture. Make sure the texture is either imported or the texture's package is     ed before assigning it to a mesh.

; Texture dimensions are not powers of two&lt;br /&gt;Can't find file '&lt;i&gt;texture file&lt;/i&gt;' for import&lt;br /&gt;&lt;i&gt;path and filename of class file&lt;/i&gt;(&lt;i&gt;line number&lt;/i&gt;) &lt;nowiki&gt;:&lt;/nowiki&gt; ExecWarning, Import texture &lt;i&gt;texture name&lt;/i&gt; from &lt;i&gt;texture file&lt;/i&gt; failed : These errors always show up together. They are caused, like the message says, when your textures are not sized in a power of two (i.e 32x32, 64x128, etc.).

; Unknown property in defaults&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;the line in defaultproperties&lt;/i&gt; : Mostly the variable is not declared or there are spaces around the &quot;&lt;code&gt;=&lt;/code&gt;&quot;. Also see [[Legacy:Default Properties|Default Properties]].

; Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed to      '&lt;i&gt;package&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;'&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed to      '&lt;i&gt;texture package&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;'&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed     ing package&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;' : '''Pingz:'''  I'm getting these warnings from a single #exec statement in my project which intends to      a texture package.  The package does exist and the url is correct.  As a test i deleted the texture package file and the warning changed to the correct &lt;i&gt;Can't find file 'texture package'&lt;/i&gt; message.  Anyone got a clue as to what this means?  Please replace my comment here with some sort of explanation.[[:Category:Legacy Answer Needed]]

==Bizarre Compiler Errors ==
; Compiler Hangs/Freezes : This is obviously a difficult type of error to troubleshoot. Simply put, the compiler simply ceases compiling, generally as soon as opening your package or while it is &quot;Analysing...&quot; I'm not certain what causes this, generally I remove classes from the package until eventually it stops doing it, then see which classes it hangs with and which it does not to help isolate the problem. I've found that sometimes I'll accidentally make my classes extend themselves or extend their own subclasses (a result of not paying attention) and this will cause this type of problem. Any further information on what specific conditions can cause this would certainately be appreciated.

'''Faithful:''' Having \&quot; anywhere (&lt;i&gt;including&lt;/i&gt; inside either style comment) except inside a set of &quot;&quot; will cause the compiler to hang at &quot;Analyzing...&quot; . I have noticed that using \\&quot; in place of \&quot; will prevent this problem.

; Compiler suddenly drops back to DOS prompt/whatever : This is a weird one. It compiles as normal, and while in the &quot;Parsing&quot; section, simply stops. No error message, nothing. Just drops back to the DOS prompt. UCC.log ends mid-comment. The problem turned out to be a struct that I was using &amp;ndash; which contained an array of that same struct. The compiler is capable of warping its head around that notion but if you try to actually declare a variable of that struct it doesn't know what to do &amp;ndash; kind of like infinite recursion.

Error: VelocityScale::ImportText failed in:               -

Error: Unknown member  X  in StartSizeRangeStartSizeRange &amp;rarr;Can be all due to incorrect spacing in the defaultproperties

Error: Unknown member  RelativeSize in SizeScale          &amp;ndash; may be due to using global search and replace in ude

Error: Unknown member  b in Color                         -

-Fataloverdose.-

===Unknown===

==Related Topics ==
* [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:Unreal Coding FAQ|Unreal Coding FAQ]]
* [[Legacy:Compiling With UCC|Compiling With UCC]]
* [[Legacy:UnrealScript Language Test|UnrealScript Language Test]]

==Discussion==

Tenative answer here... gurus feel free to confirm or deny this:

;  Variable is too large (xxx bytes, 255 max): &lt;br /&gt;These occur when you try to access a data structure that is greater then 255 bytes from another object.You might only be trying to access a little bool but if that bool is part of an array of structs whose total size is bigger than 255 bytes then you're not going to be able to code stuff like:

bMyvar = otheractor.bigarray[i].bTheirVar ;

Without the compiler choking and giving that &quot;context: variable is too large&quot; error.

To work round this you can code a method into the object that contains the large structure that returns the element you're after (or, if the object is part of a package you can't recompile, then make a subclass and impliment the method there) like this:

&lt;uscript&gt;

// this is in the actor that contains the large array you need to access

function bool checktheirvar(int index)
{
  return(bigarray[index].bTheirVar);
}

// and this goes in the other object that's trying to access that data

bMyvar=otheractor.Checktheirvar(i);

&lt;/uscript&gt;

'''El Muerte TDS:''' afaik the ''variable too large'' only happens with static arrays and structs, so when you use dynamic arrays it won't happen. With dynamic arrays only a pointer it passed, while with static arrays and structs the whole array/struct will be passed. Yes dynamic arrays are slower, but with a big array it doesn't matter much.

:'''Mychaeel:''' &quot;Dynamic arrays are slower&quot;?  Only if you count adding and removing elements, but that's plain impossible with static arrays.  Accessing existing array elements is just as fast as with static arrays.

:'''JoeDark:''' Accessing existing array elements in a dynamic array is only as fast as a static array if they are handled like Vectors in Java where it is actually a static array disguised as a dynamic array. If it's done as a linked list then access is O(n) compared to the static array's O(1) access time so static access is obviously faster, though unless your dealing with a large n not that much faster.

:'''Foxpaw:''' Well, there's more than just two possible implementations of the dynamic arrays. The Unreal engine is chock full of caching schemes, tables, and other methods of storing and retrieving data that are far more complex than what one would generally assume of the implementation, and render speculation about the number of operations required for a given operation shaky at best. I wouldn't be surprised if static arrays and dynamic arrays are both stored in a relational database and looked up that way. The only way to really tell which is faster is to time them, but even that wouldn't really be accurate, because there's other stuff to consider.

:For instance, if the implementation is as you suggested, (block of memory for array, linked list for dynamic arrays) then you would be doing a great number of operations on the stack. Anyways, I don't know how dynamic arrays or even static arrays are implemented in the Unreal Engine, but I'd question the notion that dynamic arrays are a linked list - because when you pass one to a function you get a duplicate array, not a pointer into an array.

:'''JoeDark:''' Fair enough, esp. because uscript is an interpreted language arrays might be implemented any number of ways, including relational databases ;)

:'''Red:''' I presume the issue is because of how the array is stored in memory. and because dynamic ones only pass a pointer rather than the whole array.still getting the infor be accessing with a method is one workable soultion, but i'm not sure if it would be faster than passing a pointer to a dynamic array.... both methods essentially allow you access the pieces of info you want, in sligthly different ways.

----

So why don't try

&lt;uscript&gt;
var array&lt;mystruct&gt; bigarray;
&lt;/uscript&gt;

'''Zedsquared:''' ok, thanks, cool for UT2003, but UT dosen't properly support dynamic arrays does it?  Anyone know any other way around this in UT classic?

'''Mychaeel:''' Other than an accessor method, no.

'''Foxpaw:''' There is a way around this and it is very graceful, iffin you ask me. It uses a little thing called a [[Legacy:Linked List|linked list]] which is detailed elsewhere on the Wiki.

===Script serialization mismatch===

This is an Error I'm getting while trying to compile with UMake, using the standard directories stated in the compiling with UCC page. I'm basically using the Bulldog scripts as REF.. changing the Tex, Models, and classes names..

&lt;uscript&gt;

Parsing WarthogHeadlight

Script serialization mismatch: Got 0, expected -2147483612

History: UStruct::Serialize &lt;- (Class WHSkins.TexAlignerPlanar0) &lt;- UState::Serialize &lt;- UClass::Serialize
 &lt;- (Class WHSkins.TexAlignerPlanar0) &lt;- LoadObject
 &lt;- (Class WHSkins.TexAlignerPlanar0 5595020==5595020/5939846 5594999 16) 
&lt;- ULinkerLoad::Pre     &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::SafeExec 
&lt;- (LOAD FILE=WHSkins.utx) &lt;- UEditorEngine::SafeExec &lt;- (OBJ LOAD FILE=WHSkins.utx) 
&lt;- FScriptCompiler::ProcessCompilerDirective &lt;- Directive &lt;- FScriptCompiler::CompileDeclaration 
&lt;- FScriptCompiler::CompileStatement &lt;- FirstPass &lt;- TryCompile &lt;- FScriptCompiler::CompileScript 
&lt;- (Class Halo.WarthogHeadlight, Pass 0, Line 1) &lt;- MakeScript &lt;- MakeScript &lt;- MakeScript &lt;- MakeScript 
&lt;- MakeScript &lt;- DoScripts &lt;- UEditorEngine::MakeScripts &lt;- UMakeCommandlet::Main

Exiting due to error

&lt;/uscript&gt;

'''Wormbo:''' The error message itself doesn't help solving the problem. At least the WarthogHeadlight class' code should be posted, too.

'''Adam1972:''' Actually, I've been hammering away at finding the answer... When I posted the problem I couldn't make

sense of what was happening... This is what I have so far.. I have a texture file called WHSkins.utx, and a mesh file

called WHMeshes.usx That I've created to replace the Bulldog textures and also A Warthog mesh from Halo to replace the

Warthog... So I assume I should be able to basically plug in the diffrences, at least to get it to go. When You look at

the Bulldog.uc ....

&lt;uscript&gt;
#exec OBJ LOAD FILE=..\staticmeshes\BulldogMeshes.usx
#exec OBJ LOAD FILE=..\sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=..\textures\VehicleFX.utx

&lt;/uscript&gt;

'''Adam1972:''' Then comparing it to my Warthog.uc:

&lt;uscript&gt;
#exec OBJ LOAD FILE=..\staticmeshes\WHMeshes.usx
#exec OBJ LOAD FILE=..\sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=..\textures\WHSkins.utx
&lt;/uscript&gt;

'''Adam1972:''' You'll see I only changed the filename.. I followed the Instructions on compiling with UCC and figure that the directories inside the project should match what is listed in the UCC compiling page.. so I made a Halo directory and placed a Class, Textures, and Models folder inside. Umake begins to parse the files and when it hits the WarthogHeadlight.uc file which looks like this:

&lt;uscript&gt;
#exec OBJ LOAD FILE=WHSkins.utx

class WarthogHeadlight extends DynamicProjector;

// Empty tick here - do detach/attach in Warthog tick
function Tick(float Delta)
{

}
&lt;/uscript&gt;

It returns a WHSkins.utx not found. This script is exactly like the original BulldogHeadlight.uc script. I get the same

with the scripts calling on the WHMeshes.usx. 

If I change it to #exec OBJ LOAD FILE=..\textures\WHSkins.utx it still does not find the files. If I place those same 2

files into the UT2003 folder in their respective folders.. Well that's when I get the &quot;Script serialization mismatch&quot; 

error. I get no errors associated with the script itself, the only problem I found with that was the &quot;defaultproperties&quot;

that all the decompiled originals have.. my warthog ones seemed to cause errors until I deleted those &quot;defaultproperties&quot;.

I'm stumped.... Please help :S

'''Foxpaw:''' I don't have UT2003 but I have found something that I think may be the problem. It doesn't surprise me that neither FILE=WHSkins.utx nor FILE=..\textures\WHSkins.utx finds the headlight. The former will look in the base directory of your class, the &quot;Halo&quot; directory, and the second goes up a step then looks in the base directory of your UT2003 install to find a package called &quot;textures.&quot; Remember it starts from &quot;Halo,&quot; not &quot;Halo\classes.&quot; &quot;..&quot; means up one directory. What you need to put to reference &quot;Halo\textures&quot; is &quot;FILE=.\textures\WHSkins.utx.&quot; Scratch the last dot, that's just for correct punctuation. &quot;..&quot; means go up one directory, &quot;.&quot; means look in this directory. It's basically the same as writing &quot;FILE=\textures\WHSkins.utx&quot; except that the compiler won't accept that, so the single dot is used to denote a subdirectory of the one it starts in.

'''Languard:''' Minor correction: UT2003 does accept &quot;FILE=\textures\ect&quot; I don't think having the current directory dot will hurt, but it isn't needed.  Not on XP at least, it might be different for the other OS's.  As a side note, I'm not sure why they      the object files with exec statments, since it is not needed.  I know this because for my sword attachment class, I use an animated mesh that I've placed in the Animations directory, but I do not have any exec statments to      it, and it works fine.  The only thing I can think of is maybe it is for performance reasons.

'''Languard:''' Correction to previous satement, you do need the      statments.  My misconception was due to some really bad coding on my part, and I forgot about this one      statement I had in a wierd spot.  Yet another reason why you should always code neatly, even if it is throwaway code.

'''Foxpaw:''' Yes, I don't think you need the dots, the problem with the code that was listed was that it had a double dot and was going up one directory isntead of going fromt he current directory. You actually don't need the      statements if you have the thing you were going to      already in another package, so long as you refer to that package at compile-time. I never use      statements and it works fine for me.

'''Lilguy:''' just added some stuff to the &quot;unresolved reference&quot; error.

'''FatalOverdose''' Added &quot;just added 'Error, Bad or missing expression in 'If'&quot;. This a very usfull page but its getting to big.

'''Tarquin:''' All the comments and chat need to be refactored into document mode. That would slim it down a bit! :)

Just got a 
 Bad or missing expression in =.

any ideas?

'''Wormbo:''' &quot;Bad or missing expression in ''(some symbol or keyword)''&quot; actually means ''after'' the specified symbol.

'''Bob_The_Beheader:''' What about &quot;Unexpected 'placeable'&quot;?

'''SuperApe:''' It sounds like you have the class syntax word &quot;placeable&quot; after you've declared the class, i.e., after the &quot;;&quot;.

----

'''Juxtapose:''' I've got a new one that I can't find reference too on this page. &quot;Error, Array mismatch in '='&quot; comes up when I try to copy a combination of dynamic and static arrays between classes, each nested in a struct.

&lt;uscript&gt;
class DataClass extends Object;

struct Bottom {
    float q;
}

struct Middle {
    var Bottom b[10];
}

struct Top {
    var array&lt;Middle&gt; m;
}

var array&lt;Top&gt; t;

...

class ActingClass extends Actor;
var DataObject d;

function SomeFunction()
{
    local array&lt;DataObject.Top&gt; myTops;
    local array&lt;DataObject.Middle&gt; myMiddles;
    local DataObject.Bottom myBottoms[10];

    //Throws the compile error
    myMiddles = d.t[0].m;

    //Also throws the compile error
    myBottoms = d.t[0].m[0].b;

    //Seemingly the most simple throws the compile error
    myTops = d.t;
}
&lt;/uscript&gt;

I know arrays can be copied/referenced to with equals operators. Is it the cross class that's messing it up or is it the nested structs? I already sorted out the dependencies so DataObject compiles before ActingClass. I also tried scrapping the static array in the data object (using dynamic arrays only) but that didn't fix it. Anyone encountered this before? Does anyone care to duplicate the results?

'''Wormbo:''' Your mistake is that you try to copy a static array. While they can be passed as function parameters, they cannot be assigned to a different array variable directly. (Add this to the main body of the page, please.)

'''Juxtapose:''' That seems to have nuked it. I erased my last comment because I was doing something else wrong. I refactored my classes and forgot to update my .bat file to delete the old .u file. Thanks.

'''XxDangerxX:''' I've come up with an interesting, but familiar error. Just a bit of background: As you may know, the game has a problem replicating rotators, so I'm going to get the mod to adjust rotation with trogonometry and pythagoras. I'm using this line...

&lt;uscript&gt;newrot.yaw = Atan(p.location.x - s.location.x, p.location.y - s.location.y)*182.044444; //and *0.708333 for the online version&lt;/uscript&gt;

...and I'm getting this error:

&lt;tt&gt;Call to 'Atan': Bad ',' or missing ')'&lt;/tt&gt;

Now, I've definitely seen my share of &quot;Bad or missing ''y''&quot;, but i've never seen a &quot;Bad ''x'' or missing ''y''&quot;.

A penny for your thoughts? ;)

[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43150</id>
      <timestamp>2010-04-29T22:58:13Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{legacy page|new=[[Compiler Error]]}}
The warnings and errors described on this page are generated only by the compiler. If you need information about logged in-game warnings see [[Legacy:Log Warnings|Log Warnings]].

The [[Legacy:Ucc|Ucc]] Make [[Legacy:Commandlet|commandlet]] outputs warning and critical error messages in the form
 ''&lt;path and filename&gt;''(''line number'') : ''error message''

Usually the problem can be found by opening the specified file and looking at the specified line number. Exceptions are missing declarations or braces further up in the file or missing declarations in a superclass (if it's part of your code). The Wiki recommends the [[Legacy:UMake|UMake]] compiling tool :D.

==Warnings ==

; Warning, '&lt;i&gt;name&lt;/i&gt;' obscures '&lt;i&gt;name&lt;/i&gt;' defined in base class : You declared a class variable, struct or enum with the same name as a class variable, struct or enum of a superclass. This will obscure the object in the superclass so you can't access it in the code of your class anymore.&lt;br /&gt;In UT2004 this warning also applies to local function variables which obscure class variables in the same class or one of its superclasses.

'''Foxpaw:''' Could you get around this by simply using Self.? IE, if variable A was obscured by local variable A, you should be able to access local A with A, and global A with Self.A. Seems like it would work.

'''Wormbo:''' Of course you could, but the warning is there because the usual way to access the class varaible is blocked. It's easier to find the problem with this warning when you access the obscuring variable instead of the obscured one in you code.

; Warning, '&lt;i&gt;variable name&lt;/i&gt;' - unreferenced local variable : A function declares a local variable but doesn't use it beyond that &amp;ndash; you may as well remove it if [[Wiki:YouArentGonnaNeedIt]]

; Warning, &lt;i&gt;function name&lt;/i&gt; - Missing return value : The function is declared as returning a value, but there's no '''return''' statement in the function. The default value of that variable type will be returned (e.g. false, 0, &quot;&quot;, None; also see [[Legacy:Variable Syntax|Variable Syntax]])

; ExecWarning, Reference to deprecated property '&lt;i&gt;variable name&lt;/i&gt;' : You are using a variable marked as deprecated in your code.

; Warning, Class names shouldn't end in a digit: This warning appears harmless enough. Classes with names ending in a digit (IE BloodFX2) seem to work fine.

; Warning, Missing Function : You are calling a function that has not been defined.

==Syntax Errors ==

===General Structure ===
; Bad class definition '&lt;i&gt;class name&lt;/i&gt;' : In [[Legacy:UT2003|UT2003]], the most common cause for this error is that you accidentally used &quot;expands&quot; instead of &quot;extends.&quot;  The old keyword &quot;expands&quot; is not supported anymore.  (It has been considered deprecated for a long while already.)

; Superclass &lt;i&gt;class name&lt;/i&gt; of class &lt;i&gt;other class name&lt;/i&gt; not found : The superclass of one of your classes couldn't be found. Check the class header of the second class for typos. If the superclass is in the same package also check its class header, if not check the [[Legacy:Game Ini File|Game Ini File]]'s EditPackages lines for missing packages. 

; Unexpected end of file at end of class : This is usually caused by one or more missing &quot;&lt;code&gt;}&lt;/code&gt;&quot;. This error can be quite annoying in large classes. Most of it is prevented by proper code indentation and (what experienced coders frequently do) writing ''both'' the opening and the closing brace at the same time and then filling in code between them.

; Unexpected 'defaultproperties' : The [[Legacy:Default Properties|default properties]] block can only be used outside of [[Legacy:UnrealEd|UnrealEd]]. Within UnrealEd, they have to be set from the [[Legacy:Actor Classes Browser|Actor Classes Browser]] interface; hidden variables (not declared to show up in any of the property groups) can have their defaults set via the [[Legacy:UnrealEd Console|UnrealEd console]]. Use [[Legacy:Compiling With UCC|UCC Make]] instead of UnrealEd to compile your classes if you want to use this feature. This error can also happen when you use a weird commenting style like:&lt;uscript&gt;
/* some comment
*///===========
&lt;/uscript&gt;Basically using a multi-line comment immediately followed by a single-line comment anywhere in your class breaks the parser and makes it complain about the &lt;/code&gt;defaultproperties&lt;/code&gt; keyword. Add a whitespace or linebreak or think about your commenting style in general. ;)

; Unexpected '&lt;i&gt;} or identifier&lt;/i&gt;' : This is caused by one or more missing &quot;&lt;code&gt;{&lt;/code&gt;&quot; or too many &quot;&lt;code&gt;}&lt;/code&gt;&quot;. See suggestions above.

; Call to '&lt;i&gt;function&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Type mismatch in parameter &lt;i&gt;number&lt;/i&gt; : One of the parameters in your function call doesn't have the right type and can't be automatically [[Legacy:Typecasting|casted]] to it.  Look up the original declaration of the function (in the original UnrealScript source code or here on the Wiki) and double-check against the types of the values you're actually using.

;Error, Call to '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; bad or missing parameter 1:Due to Non-Existing Variable or Spelling mistake Example:&lt;uscript&gt;TriggerEvent('SomethingWrongHere', Self, Instigator)&lt;/uscript&gt;

;Error, Call to '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Bad ',' or missing ')' : This error is reported if you attempt to call a function with more parameters than it was declared with. In other words, there should be no comma where the compiler found it, maybe the call is simply missing a right parenthesis there. For example the [[Legacy:Global Function|global function]] '''Atan''' was defined with only one parameter in UT1, but with two parameters in later engine generations.

; Internal fixup error 0 : This error occurs when using &lt;code&gt;break&lt;/code&gt; in an &lt;code&gt;if&lt;/code&gt; statement inside a &lt;code&gt;case&lt;/code&gt; block.

; 'Else'&lt;nowiki&gt;:&lt;/nowiki&gt; Bad command or expression : Make sure there is an &lt;code&gt;If&lt;/code&gt; right before the mentioned &lt;code&gt;else&lt;/code&gt;. If that &lt;code&gt;If&lt;/code&gt; block executes more that one line of code, make sure the block is enclosed in braces. See [[Legacy:Flow Syntax|Flow Syntax]].

; Error, Bad or missing expression in '(some expression)': Check whatever comes after the expression mentioned in the message. For example, a &quot;Bad or missing expression in 'If'&quot; could mean the condition does not evaluate to a boolean value (True or False), and generally you might have mistyped the function or variable name.

; Error, Right type is incompatable with &quot;$&quot;: Usually when you have only specified the name of an array and not the variable contained inside.

; Error, Missing '(' in 'if' : Usually due to wrong operator eg. using If(a=b) instead of if(a==B).

;Error,Missing '(' in 'struct' : Can be caused by leaving Blank spaces in a variable name inside a struct.

; 'Else If' is not allowed here &lt;br /&gt;'Else' is not allowed here : Most likely you have the wrong number of braces after an &lt;code&gt;If&lt;/code&gt; statement.

; 'class' is not allowed here : Generally caused by having your class statement in the wrong place. However, I got this error as well in a switch statement by putting something after default, like so:

&lt;uscript&gt;
switch( CameraMode )
{
  case CAM_FocusFollowLOS:
//  ... lots of stuff skipped here
  default:
  case CAM_Still:
    break;
}
&lt;/uscript&gt;

; Enum is not allowed here. : You have an enum declaration appearing after functions. Enums must be defined at the top of the class along with variables.

; Bad variable or function '&lt;i&gt;name&lt;/i&gt;' in replication definition : The variable or function isn't declared in this class. Check for spelling errors and make sure the specified variable or function isn't already declared in a superclass.

; Error, 'class'&lt;nowiki&gt;:&lt;/nowiki&gt; Limitor '&lt;i&gt;name&lt;/i&gt;' is not a class name : The ''class name'' in &lt;tt&gt;class&lt;''class name''&gt;&lt;/tt&gt; does not point to an existing class. Make sure that the specified class is     ed at the time the script is compiled.

; Can't find Class '&lt;i&gt;class name&lt;/i&gt;' : This error can also occur for [[Legacy:Texture|Texture]]s, [[Legacy:Sound|Sound]]s, [[Legacy:Mesh|Mesh]]es, etc. Make sure the specified class is     ed at compile time by either adding its package to the EditPackages ''above'' your package's entry or using an &lt;code&gt;#exec OBJ LOAD&lt;/code&gt; line.

; &lt;i&gt;Package1.ClassName&lt;/i&gt;'s superclass must be &lt;i&gt;Package1.SuperClassName&lt;/i&gt;, not &lt;i&gt;Package2.SuperClassName&lt;/i&gt; : I got this weird error message when compiling two packages with similar class structures. ''Package1'' contained a class ''ClassName'' with the superclass ''SuperClassName'' (both in ''Package1'') and ''Package2'' contained the same classes. ''Package2'' was compiled before ''Package1'' and the error occured during parsing of ''ClassName'' in ''Package1''.&lt;br /&gt;Always change the class names when copying them from one project to another. It's fine as long as you compile them seperately, but as soon as you need both of them problems like this start occuring.&lt;br /&gt;&lt;br /&gt;'''j3rky:''' This error message also appears if you changed the ancestor class of native actors and objects (e.g. ''class A extends B'' changed to ''class A extends C''), without having rebuilt the native DLL. In that case, the native DLL still references the old class ''B'' while the script compiler is trying to bind to the new class ''C''. Fix this by deleting the old DLL, or by running ''ucc make'' with the ''-nobind'' option. Rebuild the DLL with the new generated header file.

; Unterminated string constant : This error occurs, when the closing double quotation marks for a string are missing. Note that while strings may contain line breaks, they may not span several lines in your code. Use the &lt;code&gt;Chr&lt;/code&gt; function to generate the line break characters if you need them.

'''fataoverdose'''You can also get this error if you put one to many double quotation marks in the string. 

; BEGIN OBJECT&lt;nowiki&gt;:&lt;/nowiki&gt; name &lt;i&gt;objectname&lt;/i&gt; redefined. : This error occures if two or more objects declared in the [[Legacy:Default Properties|default properties]] of the same class have the same name. The objects must have unique names.

; redundant data&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;defaultproperty declaration&lt;/i&gt; : You get this error when you redefine the default value of a property in the same class, like:&lt;uscript&gt;
defaultproperties
{
  somearray(0)=&quot;this will be reported by the compiler&quot;
  somearray(0)=&quot;this won't be reported&quot;
}
&lt;/uscript&gt;

'''Foxpaw:''' I accidentally did something similar, but the second variable was reported, not the first. However, since the variable in your example is an array, it may be treated differently. My code was (trimmed down a bit):

&lt;uscript&gt;
defaultproperties
{
  Skins(0)=Texture'PlayerSkins.JuggMaleABodyA'
  Skins(1)=Texture'PlayerSkins.JuggMaleAHeadA'
  CollisionRadius=+00050.000000
  CollisionHeight=+00050.000000

  CollisionRadius=+00034.000000
  CollisionHeight=+00078.000000
}
&lt;/uscript&gt;

In this code it reported that the 34 and 78 were the redundant data.

; Missing '(' in 'Remove(...)' : A dynamic array's Remove method expects the index of the first element and the number of elements to be removed in parentheses, like &quot;Remove(2,4)&quot;.

}
; Missing &quot;(&quot; in editable member variable: Don't put anything in the parentheses next to a variable name when defining a struct ie.

&lt;uscript&gt;
struct mystruct
{
Var(myvalues) float ValueA;
Var(myvalues) float ValueB;
}
&lt;/uscript&gt;

This will work;

&lt;uscript&gt;
struct mystruct
{
Var() float ValueA;
Var() float ValueB;
}
&lt;/uscript&gt;

; Error, ArrayCount argument is not an array : The syntax &lt;tt&gt;ArrayCount(''arrayname'')&lt;/tt&gt; only applies to static arrays. Use &lt;tt&gt;''arrayname''.Length&lt;/tt&gt; for dynamic arrays instead.

; Map are not supported in UnrealScript yet : You felt like experimenting, huh? :) The &lt;code&gt;map&lt;/code&gt; variable type isn't supported in UnrealScript.

; General protection fault!, ScriptCompiler&lt;nowiki&gt;::&lt;/nowiki&gt;CompileSecondPass : There's actually quite a string that acoompanies this, but this part should signal you that this is what you've got. You did something that the compiler can't handle but Epic never imagined you'd try. I got this error from trying to use an unconditional replication. I wanted this function to be replicated to the other party regardless of which machine it originated on, so I tried: reliable AddAction,RemoveAction; This will generate the above error. You MUST use the if part of the replication statement even if it will always be true.  There isn't any way to know exactly what is causing this error in your code, but by looking at the ucc.log, you can at least determine which class the unexpected error was encountered (it will be the last class listed prior to the stack trace).
::Another way to get the GFP failt is using [dependsOn] with a class that doesn't exists.

===Functions ===
; Redefinition of '&lt;i&gt;function name&lt;/i&gt;' differs from original : When overriding functions you are not allowed to change the return type, the number or type of parameters or some of the function modifiers, e.g. static functions must stay static, public functions can't become protected. (E.g. simulated or native functions can become non-simulated or non-native in subclasses though, because those keywords only apply to the actual implementation in that single class.)&lt;br /&gt;Functions can't be over    ed in UnrealScript.

; '&lt;i&gt;function name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; too many parameters : In UnrealScript functions can have a maximum of 16 parameters. If you need more parameters you will have to put them in a struct or array and pass that to the function.

; Function '&lt;i&gt;function name&lt;/i&gt;' specifiers differ from original : This error occurs when you try to override a final function or try to override a public function with a protected or private one or a protected function with a private or public one. (see [[Legacy:Function Syntax|Function Syntax]])

; '&lt;i&gt;identifier&lt;/i&gt;' conflicts with '&lt;i&gt;other identifier&lt;/i&gt;' : You can have only one function of the same name within the same state of a class, and you can't have variables and functions with the same name in the same class at all.  Rename or remove one of the conflicting identifiers.

; Can't call instance functions from within static functions : [[Legacy:Static Function|Static function]]s can only call other static functions. Check if your function really needs to be static or whether you forgot to declare the other function as static.&lt;br /&gt;You can also get this error when trying to call a non-static function via the &lt;tt&gt;class'SomeClass'.static.FunctionName()&lt;/tt&gt; syntax.

; Bad preoperator definition: Your declaration of a preoperator is invalid. This is most often caused by attempting to set a priority for a preoperator, as preoperators and postoperators do not take a priority value. See [[Legacy:Scripting Operators|Scripting Operators]] for the proper declaration.

; Bad postoperator definition: This is the same as &quot;Bad preoperator definition,&quot; but for postoperators.

; Unknown Function '&lt;i&gt;function name&lt;/i&gt;' in 'Class &lt;i&gt;Package1.ClassName&lt;/i&gt;': This error comes up when your code attempts to call a function that does not exist. You may have forgot the parenthesis when using the &lt;code&gt;super&lt;/code&gt; keyword to call a function that have no parameters. This can also be caused by forgetting the cast on an object reference. Sometimes it is also caused by a misspelled function name.

; &lt;i&gt;Function name&lt;/i&gt; mismatches delegate &lt;i&gt;delegate name&lt;/i&gt; : You tried to assign a function to a delegate property, but the function's parameters and/or return value don't match the delegate's parameters and/or return value.

; Delegate assignment failed: You tried to assign a function to a delegate property, but the function's parameters and/or return value don't match the delegate's parameters and/or return value.

; Error, operator must have 2 parameters : Binary operators must be declared with two parameters and a return value. See [[Legacy:Scripting Operators|Scripting Operators]].

===Variables ===
; Can't assign Const variables : You are not allowed to assign class variables declared with the const modifier. (See [[Legacy:Variable Syntax|Variable Syntax]].) Instead find a native function which can set this variable. (e.g. SetDrawScale() for the DrawScale property)
; Error, Missing &lt;nowiki&gt;'&gt;'&lt;/nowiki&gt; in &lt;nowiki&gt;'&lt;/nowiki&gt;class limitor&lt;nowiki&gt;'&lt;/nowiki&gt; : 
I got this problem with the following code:

&lt;uscript&gt;
var array&lt;class&lt;WeaponFire&gt;&gt; WFCs;
&lt;/uscript&gt;

which was easily fixed by changing it to the following:

&lt;uscript&gt;
var array&lt;class&lt;WeaponFire&gt; &gt; WFCs;
&lt;/uscript&gt;

Presumably, it parses &quot;&gt;&gt;&quot; as an [[Legacy:Operator|operator]] and then can't find the closing &quot;&gt;&quot;.


; Can't save &lt;i&gt;class&lt;/i&gt;&lt;nowiki&gt;:&lt;/nowiki&gt; Graph is linked to external private object &lt;i&gt;object&lt;/i&gt; : One of your classes is making a reference to an object in another package without the RF_Public flag set.  This is not permitted in Unreal Packages.  Check your class for references to private or protected variables in other classes or to other object constants.   This error can also occur if you reference a protected variable in a superclass *if* your derived class resides in a different package from the class where the protected member is declared (even though this is technically supposed to work).

; Enums can only be declared in class or struct scope : Like the message says. Enums can't be declared in functions or operators.

; Variable declaration&lt;nowiki&gt;:&lt;/nowiki&gt; '&lt;i&gt;variable name&lt;/i&gt;' already defined : You tried to declare two variables with the same name in the same function.

; Expression has no effect : Expressions like &lt;code&gt;Int1 + Int2;&lt;/code&gt; have no effect, i.e. they don't change anything when not assigned to a variable. This error can also be caused by using an incorrect syntax for assigning values to array elements like &lt;code&gt;anArray(0) = anything;&lt;/code&gt; (the correct syntax is &lt;code&gt;anArray[0] = anything;&lt;/code&gt;)

; ')' Expression has no effect : You could be missing the first '(' in a log command.  You could also be typecasting wrong.  Also, make sure a function parameter does not have the same name as a function you're calling in that function.  Example:

&lt;uscript&gt;
function ThisIsWrong(int Spawn)
{
   If(Spawn == 1)
   Spawn(class'AClass');
}
&lt;/uscript&gt;

; Unrecognized member '&lt;i&gt;variable name&lt;/i&gt;' in class '&lt;i&gt;class name&lt;/i&gt;': You're attempting to use a &lt;i&gt;variable name&lt;/i&gt; that is not defined as a global variable in class &lt;i&gt;class name&lt;/i&gt;.  This usually occurs when you've typecasted a class variable, such as PlayerPawn(P) where P was defined as a Pawn.  In this situation, at the line this error mentions, you've probably forgotten to typecast your P variable.

; Unrecognized type '&lt;i&gt;variable type&lt;/i&gt;' : The class, enum or struct you wanted to use is not declared or not visible from this point. Also check for typos.

; Type mismatch in '&lt;i&gt;operator&lt;/i&gt;' : The variable type you specified doesn't match the type the operatore requires and can't be automatically casted to the required type.

; Type mismatch in 'If' : Similar to the type mismatch in operator. The condition must be a boolean value, it will not be [[Legacy:Typecasting|typecasted]] automatically. Often the use of &lt;code&gt;=&lt;/code&gt; instead of &lt;code&gt;----&lt;/code&gt; causes this error.

; Array mismatch in '=' : This error is thrown when some code attempts to copy a static array. Static arrays can be passed as function parameters but can't be copied. This implies that static arrays also can't be used as return types because they cannot be assigned to a more permanent var. Consider using a [[Legacy:Dynamic_Array|Dynamic_Array]] instead.

; Unrecognized variable '&lt;i&gt;variable name&lt;/i&gt;' name in replication definition : You tried to replicate a variable or function which was not declared in this class. Check for typos.

; Bool arrays are not allowed : Well, they are not allowed. :) Use ''byte'' arrays instead.

; Can only assign individual booleans, not boolean arrays : You tried to assign a static array to another static array. This message always says &quot;boolean&quot; although you can't even declare boolean arrays. ArrayOne = ArrayTwo is only allowed for dynamic arrays. Instead use a loop and assign element by element.

; Variable is too large (&lt;i&gt;x&lt;/i&gt; bytes, 255 max) : Static arrays and large structs can only be accessed from outside the object containing them when they use less than 255 bytesx of memory. This restriction may seem weird, but you'll have to live with it. Try using a dynamic array instead of a static one, break doen the struct into several class properties or use accessor functions to work around this restriction.

; Arrays within arrays not supported. : You can't use declarations like &quot;array&lt; array&lt;string&gt; &gt;&quot;, otherwise the compiler throws this error. You could however create a struct with an array as the only element and create an array of this struct.

; ObjectProperty '&lt;i&gt;Property Name&lt;/i&gt;' &lt;nowiki&gt;:&lt;/nowiki&gt; unresolved reference to '&lt;i&gt;Some Texture or Something&lt;/i&gt;' : This is usually caused by having a reference to a texture or other resource that is spelled incorrectly, you forgot to create, or something similar. However, this can also have an interesting cause: If the texture/whatever package contains a resource of a type that is not in a package above this one. (IE you made a custom Material class and the package has a material of that class in it, and the code for that Material class hasn't been compiled yet) then the entire package will fail to.&lt;br /&gt;This can also happen if you have multiple paths, both containing the offending package. For example: let's say you have a texture package called mytex.utx, and for some reason you put it in your mod\textures\ directory, as well as your ut200x\system directory. You then add a texture to the copy in your mod\textures\ directory, and forget to add it to the other one(sloppy, but I've done this on accident before.) And let's say that in your .ini file you have your mod\textures\ directory listed AFTER the ut200x\textures directory. Then ucc will      the first version of the package, thinking that's what you meant, but won't find the new texture, and spit this error at you. The solution: always only use one version of every package. Learn how to use ini files to tell UCC where to look for packages, rather than putting a copy in your mod directory to run, and your system directory to compile.'''FatalOverdose'''-note. one spelling mistake in a parent class can cause this error for all its children. This can be very frustrating when ucc tells you there are errors in scripts that seem to be totally correct. This can also occure if you try to put &quot;new class'name'&quot; in the defaultproperties.

; Variable declaration &lt;i&gt;variable name&lt;/i&gt;&lt;nowiki&gt;:&lt;/nowiki&gt; Bad or missing array size : You have to specify a numeric value as the size of a static array. It seems in UT the compiler doesn't recognize constants as the array size, but this works in UT2003. Also remember that you have to specify an integer value as the array size and the largest positive integer number UnrealScript knows is 2147483647. (Use the constant MaxInt if you can't remember this value, but why the heck would you create a static array this large?)

'''Foxpaw:''' It wouldn't let me use even 65536 elements in a static array. I needed the former number because I wanted to make something like a trig table, only for coordinate rotation instead of regular trig.

'''Wormbo:''' Try 65535 (maximum unsigned short) or 32767 (maximum signed short). What about using a dynamic array instead?

'''Foxpaw:''' I considered that, but then I figured that a dynamic array that large probrably would not be allocated a contiguous block of memory (unless it was a static array) and so there would be a lot of skipping around.

'''Wormbo:''' Dynamic arrays allocate a single block of memory. They just might decide to allocate a larger block if more space is required and release the previously used block.

; Variable '&lt;i&gt;variable name&lt;/i&gt;' already has a replication definition : The variable appears more than once in the replication block. You can specify only one replication statement per variable.

; 'struct'&lt;nowiki&gt;:&lt;/nowiki&gt; Expecting 'Var', got '&lt;i&gt;identifier&lt;/i&gt;' : Structs have to be declared in a certain way and all delcarations within the struct have to begin with &lt;code&gt;var&lt;/code&gt;. See also [[Legacy:Variable Syntax|Variable Syntax]].

; Invalid property or function call on a dynamic array : Dynamic arrays only have three properties and methods: Length, Insert() and Remove(). See [[Legacy:Variable Syntax|Variable Syntax]] for details.  The most common cause of this error is attempting to do something to an element in an array and forgetting the array index delimiter.  For example, doing something like &lt;tt&gt;MyArray.bDeleteMe&lt;/tt&gt; instead of &lt;tt&gt;MyArray[i].bDeleteMe&lt;/tt&gt;.

; You can only access default values of variables here : In [[Legacy:Static Function|static function]]s you do not have direct access to class-level variables. You can only access function parameters, local variables and, through the &lt;tt&gt;default.''VariableName''&lt;/tt&gt; syntax, the default values of class variables.

===Typecasting ===
; Cast from '&lt;i&gt;class name&lt;/i&gt;' to '&lt;i&gt;other class name&lt;/i&gt;' will always fail : You're attempting to perform a [[Legacy:Typecasting|typecast]] which will always fail because the class you're casting to is not a subclass of the variable's class.  (That's the case, for instance, if you try to cast a variable of type &lt;code&gt;class&lt;Something&gt;&lt;/code&gt; to an ''object'' of a different class.)

; Cast from '&lt;i&gt;class name&lt;/i&gt;' to '&lt;i&gt;other class name&lt;/i&gt;' is unneccessary : ''other class name'' is either the same class as ''class name'' or a superclass of it. This kind of [[Legacy:Typecasting|typecasting]] is not neccessary.

; No need to cast '&lt;i&gt;property type&lt;/i&gt;' to itself : When a property already is of e.g. type ''int'' there is no need to cast it to ''int'' again when using it. This error also occurs when you work with a &quot;subclass&quot; of a struct (e.g. ''plane'' extends ''vector'') and try to cast it to its &quot;superclass&quot; (e.g. &lt;tt&gt;vector(aPlaneStuct)&lt;/tt&gt;).

; Can't convert '&lt;i&gt;property type&lt;/i&gt;' to '&lt;i&gt;other property type&lt;/i&gt;' : This error occurs when you try to typecast between incompatible variable types like e.g. ''Object'' -&gt; ''Int'' (&quot;ObjectProperty to IntProperty&quot;) or ''vector'' -&gt; ''float'' (&quot;StructProperty to FloatProperty&quot;).

==Exec Warnings ==
; ExecWarning, Import Texture &lt;i&gt;name&lt;/i&gt; from &lt;i&gt;filename&lt;/i&gt; failed&lt;br /&gt;ExecWarning, Failed factoring&lt;nowiki&gt;:&lt;/nowiki&gt; NEW SOUND FILE=&lt;i&gt;filename&lt;/i&gt; PACKAGE=&lt;i&gt;packagename&lt;/i&gt; NAME=&lt;i&gt;name&lt;/i&gt; : Usually these errors are caused by missing files or typos. Check the spelling of the file name and make sure the file really is where ''filename'' points to. Remember that the UT\MyMod directory is the base for specifying file names in #exec lines.

; Failed     ing package&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file '&lt;i&gt;filename&lt;/i&gt;' : The package you specified in an &lt;code&gt;#exec obj     &lt;/code&gt; line could not be found. Check the spelling of the file name.

; ExecWarning, Bad MESH LODPARAMS&lt;br /&gt;ExecWarning, Bad MESH ORIGIN&lt;br /&gt;ExecWarning, Bad MESH SEQUENCE&lt;br /&gt;ExecWarning, Missing meshmap&lt;br /&gt;ExecWarning, Missing meshmap, texture, or num (MESHMAP=&lt;i&gt;meshmap name&lt;/i&gt; NUM=&lt;i&gt;number&lt;/i&gt; TEXTURE=&lt;i&gt;texture name&lt;/i&gt;) : All these errors can be caused by a missing file for the mesh. Check for typos and check the log for details about which file is missing.&lt;br /&gt;The last error can also be caused by a missing texture. Make sure the texture is either imported or the texture's package is     ed before assigning it to a mesh.

; Texture dimensions are not powers of two&lt;br /&gt;Can't find file '&lt;i&gt;texture file&lt;/i&gt;' for import&lt;br /&gt;&lt;i&gt;path and filename of class file&lt;/i&gt;(&lt;i&gt;line number&lt;/i&gt;) &lt;nowiki&gt;:&lt;/nowiki&gt; ExecWarning, Import texture &lt;i&gt;texture name&lt;/i&gt; from &lt;i&gt;texture file&lt;/i&gt; failed : These errors always show up together. They are caused, like the message says, when your textures are not sized in a power of two (i.e 32x32, 64x128, etc.).

; Unknown property in defaults&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;the line in defaultproperties&lt;/i&gt; : Mostly the variable is not declared or there are spaces around the &quot;&lt;code&gt;=&lt;/code&gt;&quot;. Also see [[Legacy:Default Properties|Default Properties]].

; Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed to      '&lt;i&gt;package&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;'&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed to      '&lt;i&gt;texture package&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;'&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Failed     ing package&lt;nowiki&gt;:&lt;/nowiki&gt; Can't find file for package '&lt;i&gt;package&lt;/i&gt;' : '''Pingz:'''  I'm getting these warnings from a single #exec statement in my project which intends to      a texture package.  The package does exist and the url is correct.  As a test i deleted the texture package file and the warning changed to the correct &lt;i&gt;Can't find file 'texture package'&lt;/i&gt; message.  Anyone got a clue as to what this means?  Please replace my comment here with some sort of explanation.[[:Category:Legacy Answer Needed]]

==Bizarre Compiler Errors ==
; Compiler Hangs/Freezes : This is obviously a difficult type of error to troubleshoot. Simply put, the compiler simply ceases compiling, generally as soon as opening your package or while it is &quot;Analysing...&quot; I'm not certain what causes this, generally I remove classes from the package until eventually it stops doing it, then see which classes it hangs with and which it does not to help isolate the problem. I've found that sometimes I'll accidentally make my classes extend themselves or extend their own subclasses (a result of not paying attention) and this will cause this type of problem. Any further information on what specific conditions can cause this would certainately be appreciated.

'''Faithful:''' Having \&quot; anywhere (&lt;i&gt;including&lt;/i&gt; inside either style comment) except inside a set of &quot;&quot; will cause the compiler to hang at &quot;Analyzing...&quot; . I have noticed that using \\&quot; in place of \&quot; will prevent this problem.

; Compiler suddenly drops back to DOS prompt/whatever : This is a weird one. It compiles as normal, and while in the &quot;Parsing&quot; section, simply stops. No error message, nothing. Just drops back to the DOS prompt. UCC.log ends mid-comment. The problem turned out to be a struct that I was using &amp;ndash; which contained an array of that same struct. The compiler is capable of warping its head around that notion but if you try to actually declare a variable of that struct it doesn't know what to do &amp;ndash; kind of like infinite recursion.

Error: VelocityScale::ImportText failed in:               -

Error: Unknown member  X  in StartSizeRangeStartSizeRange &amp;rarr;Can be all due to incorrect spacing in the defaultproperties

Error: Unknown member  RelativeSize in SizeScale          &amp;ndash; may be due to using global search and replace in ude

Error: Unknown member  b in Color                         -

-Fataloverdose.-

===Unknown===

==Related Topics ==
* [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:Unreal Coding FAQ|Unreal Coding FAQ]]
* [[Legacy:Compiling With UCC|Compiling With UCC]]
* [[Legacy:UnrealScript Language Test|UnrealScript Language Test]]

==Discussion==

Tenative answer here... gurus feel free to confirm or deny this:

;  Variable is too large (xxx bytes, 255 max): &lt;br /&gt;These occur when you try to access a data structure that is greater then 255 bytes from another object.You might only be trying to access a little bool but if that bool is part of an array of structs whose total size is bigger than 255 bytes then you're not going to be able to code stuff like:

bMyvar = otheractor.bigarray[i].bTheirVar ;

Without the compiler choking and giving that &quot;context: variable is too large&quot; error.

To work round this you can code a method into the object that contains the large structure that returns the element you're after (or, if the object is part of a package you can't recompile, then make a subclass and impliment the method there) like this:

&lt;uscript&gt;

// this is in the actor that contains the large array you need to access

function bool checktheirvar(int index)
{
  return(bigarray[index].bTheirVar);
}

// and this goes in the other object that's trying to access that data

bMyvar=otheractor.Checktheirvar(i);

&lt;/uscript&gt;

'''El Muerte TDS:''' afaik the ''variable too large'' only happens with static arrays and structs, so when you use dynamic arrays it won't happen. With dynamic arrays only a pointer it passed, while with static arrays and structs the whole array/struct will be passed. Yes dynamic arrays are slower, but with a big array it doesn't matter much.

:'''Mychaeel:''' &quot;Dynamic arrays are slower&quot;?  Only if you count adding and removing elements, but that's plain impossible with static arrays.  Accessing existing array elements is just as fast as with static arrays.

:'''JoeDark:''' Accessing existing array elements in a dynamic array is only as fast as a static array if they are handled like Vectors in Java where it is actually a static array disguised as a dynamic array. If it's done as a linked list then access is O(n) compared to the static array's O(1) access time so static access is obviously faster, though unless your dealing with a large n not that much faster.

:'''Foxpaw:''' Well, there's more than just two possible implementations of the dynamic arrays. The Unreal engine is chock full of caching schemes, tables, and other methods of storing and retrieving data that are far more complex than what one would generally assume of the implementation, and render speculation about the number of operations required for a given operation shaky at best. I wouldn't be surprised if static arrays and dynamic arrays are both stored in a relational database and looked up that way. The only way to really tell which is faster is to time them, but even that wouldn't really be accurate, because there's other stuff to consider.

:For instance, if the implementation is as you suggested, (block of memory for array, linked list for dynamic arrays) then you would be doing a great number of operations on the stack. Anyways, I don't know how dynamic arrays or even static arrays are implemented in the Unreal Engine, but I'd question the notion that dynamic arrays are a linked list - because when you pass one to a function you get a duplicate array, not a pointer into an array.

:'''JoeDark:''' Fair enough, esp. because uscript is an interpreted language arrays might be implemented any number of ways, including relational databases ;)

:'''Red:''' I presume the issue is because of how the array is stored in memory. and because dynamic ones only pass a pointer rather than the whole array.still getting the infor be accessing with a method is one workable soultion, but i'm not sure if it would be faster than passing a pointer to a dynamic array.... both methods essentially allow you access the pieces of info you want, in sligthly different ways.

----

So why don't try

&lt;uscript&gt;
var array&lt;mystruct&gt; bigarray;
&lt;/uscript&gt;

'''Zedsquared:''' ok, thanks, cool for UT2003, but UT dosen't properly support dynamic arrays does it?  Anyone know any other way around this in UT classic?

'''Mychaeel:''' Other than an accessor method, no.

'''Foxpaw:''' There is a way around this and it is very graceful, iffin you ask me. It uses a little thing called a [[Legacy:Linked List|linked list]] which is detailed elsewhere on the Wiki.

===Script serialization mismatch===

This is an Error I'm getting while trying to compile with UMake, using the standard directories stated in the compiling with UCC page. I'm basically using the Bulldog scripts as REF.. changing the Tex, Models, and classes names..

&lt;uscript&gt;

Parsing WarthogHeadlight

Script serialization mismatch: Got 0, expected -2147483612

History: UStruct::Serialize &lt;- (Class WHSkins.TexAlignerPlanar0) &lt;- UState::Serialize &lt;- UClass::Serialize
 &lt;- (Class WHSkins.TexAlignerPlanar0) &lt;- LoadObject
 &lt;- (Class WHSkins.TexAlignerPlanar0 5595020==5595020/5939846 5594999 16) 
&lt;- ULinkerLoad::Pre     &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::SafeExec 
&lt;- (LOAD FILE=WHSkins.utx) &lt;- UEditorEngine::SafeExec &lt;- (OBJ LOAD FILE=WHSkins.utx) 
&lt;- FScriptCompiler::ProcessCompilerDirective &lt;- Directive &lt;- FScriptCompiler::CompileDeclaration 
&lt;- FScriptCompiler::CompileStatement &lt;- FirstPass &lt;- TryCompile &lt;- FScriptCompiler::CompileScript 
&lt;- (Class Halo.WarthogHeadlight, Pass 0, Line 1) &lt;- MakeScript &lt;- MakeScript &lt;- MakeScript &lt;- MakeScript 
&lt;- MakeScript &lt;- DoScripts &lt;- UEditorEngine::MakeScripts &lt;- UMakeCommandlet::Main

Exiting due to error

&lt;/uscript&gt;

'''Wormbo:''' The error message itself doesn't help solving the problem. At least the WarthogHeadlight class' code should be posted, too.

'''Adam1972:''' Actually, I've been hammering away at finding the answer... When I posted the problem I couldn't make

sense of what was happening... This is what I have so far.. I have a texture file called WHSkins.utx, and a mesh file

called WHMeshes.usx That I've created to replace the Bulldog textures and also A Warthog mesh from Halo to replace the

Warthog... So I assume I should be able to basically plug in the diffrences, at least to get it to go. When You look at

the Bulldog.uc ....

&lt;uscript&gt;
#exec OBJ LOAD FILE=..\staticmeshes\BulldogMeshes.usx
#exec OBJ LOAD FILE=..\sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=..\textures\VehicleFX.utx

&lt;/uscript&gt;

'''Adam1972:''' Then comparing it to my Warthog.uc:

&lt;uscript&gt;
#exec OBJ LOAD FILE=..\staticmeshes\WHMeshes.usx
#exec OBJ LOAD FILE=..\sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=..\textures\WHSkins.utx
&lt;/uscript&gt;

'''Adam1972:''' You'll see I only changed the filename.. I followed the Instructions on compiling with UCC and figure that the directories inside the project should match what is listed in the UCC compiling page.. so I made a Halo directory and placed a Class, Textures, and Models folder inside. Umake begins to parse the files and when it hits the WarthogHeadlight.uc file which looks like this:

&lt;uscript&gt;
#exec OBJ LOAD FILE=WHSkins.utx

class WarthogHeadlight extends DynamicProjector;

// Empty tick here - do detach/attach in Warthog tick
function Tick(float Delta)
{

}
&lt;/uscript&gt;

It returns a WHSkins.utx not found. This script is exactly like the original BulldogHeadlight.uc script. I get the same

with the scripts calling on the WHMeshes.usx. 

If I change it to #exec OBJ LOAD FILE=..\textures\WHSkins.utx it still does not find the files. If I place those same 2

files into the UT2003 folder in their respective folders.. Well that's when I get the &quot;Script serialization mismatch&quot; 

error. I get no errors associated with the script itself, the only problem I found with that was the &quot;defaultproperties&quot;

that all the decompiled originals have.. my warthog ones seemed to cause errors until I deleted those &quot;defaultproperties&quot;.

I'm stumped.... Please help :S

'''Foxpaw:''' I don't have UT2003 but I have found something that I think may be the problem. It doesn't surprise me that neither FILE=WHSkins.utx nor FILE=..\textures\WHSkins.utx finds the headlight. The former will look in the base directory of your class, the &quot;Halo&quot; directory, and the second goes up a step then looks in the base directory of your UT2003 install to find a package called &quot;textures.&quot; Remember it starts from &quot;Halo,&quot; not &quot;Halo\classes.&quot; &quot;..&quot; means up one directory. What you need to put to reference &quot;Halo\textures&quot; is &quot;FILE=.\textures\WHSkins.utx.&quot; Scratch the last dot, that's just for correct punctuation. &quot;..&quot; means go up one directory, &quot;.&quot; means look in this directory. It's basically the same as writing &quot;FILE=\textures\WHSkins.utx&quot; except that the compiler won't accept that, so the single dot is used to denote a subdirectory of the one it starts in.

'''Languard:''' Minor correction: UT2003 does accept &quot;FILE=\textures\ect&quot; I don't think having the current directory dot will hurt, but it isn't needed.  Not on XP at least, it might be different for the other OS's.  As a side note, I'm not sure why they      the object files with exec statments, since it is not needed.  I know this because for my sword attachment class, I use an animated mesh that I've placed in the Animations directory, but I do not have any exec statments to      it, and it works fine.  The only thing I can think of is maybe it is for performance reasons.

'''Languard:''' Correction to previous satement, you do need the      statments.  My misconception was due to some really bad coding on my part, and I forgot about this one      statement I had in a wierd spot.  Yet another reason why you should always code neatly, even if it is throwaway code.

'''Foxpaw:''' Yes, I don't think you need the dots, the problem with the code that was listed was that it had a double dot and was going up one directory isntead of going fromt he current directory. You actually don't need the      statements if you have the thing you were going to      already in another package, so long as you refer to that package at compile-time. I never use      statements and it works fine for me.

'''Lilguy:''' just added some stuff to the &quot;unresolved reference&quot; error.

'''FatalOverdose''' Added &quot;just added 'Error, Bad or missing expression in 'If'&quot;. This a very usfull page but its getting to big.

'''Tarquin:''' All the comments and chat need to be refactored into document mode. That would slim it down a bit! :)

[[Category:Legacy Answer Needed|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Compiling With UCC</title>
    <id>692</id>
    <revision>
      <id>2016</id>
      <timestamp>2007-11-19T12:22:39Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''UCC''' is the [[Legacy:UnrealScript|UnrealScript]] compiler. This page explains how to compile with the '''ucc make''' command. As an alternative, you may want to consider using [[Legacy:UMake|UMake]], which makes the whole thing much simpler.  If you are a cygwin geek, you might like use [[Legacy:GnuMake|GnuMake]]

==Compiling==

So, you've spent some time lovingly crafting your mod using well laid out, commented, and maintainable Unreal Script.  You have done the decent thing and placed your .uc class files in /UnrealTournament/YourModPackage/Classes.  The big moment approaches - will it compile first time?

Well, there's only one way to find out, and that's to do it.  At the very least you need to edit your [[Legacy:Game Ini File|Game Ini File]] and add your package name to the list of editable packages.  Search the ini file for a list of lines starting with EditPackages.  Add your package to the bottom of the list like so:

  EditPackages=YourModPackage

Save the changes. You will now be able to compile your mod using the following command:

  ucc make

By default this command examines all of the EditPackages lines searching for packages which have no corresponding .u (a compiled package file) files and attempts to compile them.  If you have previously built YourModPackage and you have updated the code the build command will not recompile your package unless your first delete it.  It's well worth creating a small batch file to do this for you, e.g.

  cd C:\UnrealTournament\System
  del YourModPackage.u
  ucc make

One of the things that's really easy to forget is the [[Legacy:INT File|INT file]] associated with your new package.  This file defines the public classes in the package.  Look in any of the [[Legacy:INT File|INT file]]s for examples of this.  Remember to include the ''[Public]'' directive at the top of the file though or your mod won't be visible in the UT front end.  It's worth keeping a copy of your [[Legacy:INT File|INT file]] in the /UnrealTournament/YourModPackage directory so you don't lose it and always have an up to date version.

==Tips==

To reduce compile time, create the following:
* An ini file, named for example MyProject.ini. Copy UnrealTournament.ini or UT2003.ini and only include those EditPackages entries that your classes depend on.

* Make a batch file that reads: &lt;br /&gt;&lt;tt&gt;ucc make ini=MyProject.ini&lt;/tt&gt;

Note that to see output you'll still have to run it from the command prompt.  ([[Legacy:UMake|UMake]] does all that automatically for you and stores an .ini file called make.ini in your project directory.)

===Batch File===

When I still used UCC Make I made a batch file that looked like this:
  COPY MyMod.U *.U_Backup
  DEL MyMod.U
  UCC MAKE
  PAUSE

This backs up your U file, deletes it, recompiles it, and then PAUSE, &quot;press any key to continue&quot;. This combined with the INI said above here could make a very nice way to compile.

===Mod System Batch File for ut2k4===

Last Updated: 15 January 2006

Easy to adjust to any mod just input the unreal tournament 2004 directory, the mod name and the package and your off.

If you want to add extra packages just copy the lines containing %package1% or package1 and replace them with %package2% or package2.

&lt;uscript&gt;
:init
@echo Off
set utk4dir=&quot;Your Unreal 2k4 Dir&quot;
set utk4sysdir=%utk4dir%system\

set modname=&quot;Your Mod Name&quot;
set moddir=%utk4dir%%modname%
set modbakdir=%moddir%SysBak\
set modlogdir=%moddir%System\logs\

set package1=&quot;Your Package Here&quot;
goto bak

:bak
md %modbakdir%
md %modlogdir%
copy %moddir%*.ucl %modbakdir%*.ucl
copy %moddir%*.int %modbakdir%*.int
copy %moddir%*.u %modbakdir%*.u
echo //-----------------------Old Files Backed Up!------------------------
goto del

:del
del /q %utk4sysdir%%Package1%.* &gt; nul
del /q %moddir%%Package1%.* &gt; nul
echo //-----------------------Echo Old Files Deleted!----------------------
goto make

:make
%utk4dir%UCC.exe make -mod=%modname%
copy %utk4dir%ucc.log %modlogdir%%modname%_ucc.log
echo //---------------------------*.u Complete!----------------------------
goto make&amp;int

:make&amp;int 
%utk4Dir%UCC.exe dumpint -mod=%modname% %moddir%%package1%.u
copy %utk4sysdir%ucc.log %modlogdir%%modname%_int.log
copy %utk4sysdir%%package1%.int %moddir%%package1%.int
del %utk4sysdir%%package1%.int
del %utk4sysdir%ucc.log
echo //--------------------------*.int Complete!---------------------------
goto make&amp;ucl

:make&amp;ucl
%utk4Dir%UCC.exe exportcache -v -mod=%modname% %moddir%%Package1%.u 
copy %utk4sysdir%ucc.log %modlogdir%%modname%_ucl.log
del %utk4sysdir%ucc.log
echo //--------------------------*.ucl Complete!---------------------------
goto end

:end
echo //--------------------------Make Complete!---------------------------
&lt;/uscript&gt;

===Another ucc batch file===

Displays time and result of last compilation, updates window title, restarts with single key press.

&lt;uscript&gt;
@echo off
:start
title COMPILING :: MyProject
CLS

Copy UCC_MyProject.log UCC_MyProject_OLD.log

del MyProject.u

ucc make -INI=MyProject.ini -LOG=UCC_MyProject.log
if errorlevel 1 goto end

title OK :: MyProject
findstr /c:&quot;Log file closed&quot; UCC_MyProject.log

echo.
pause
goto start

:end
title ERROR :: MyProject 
findstr /c:&quot;Log file closed&quot; UCC_MyProject.log

echo.
pause
goto start
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]
* [[Legacy:Compiler Errors|Compiler Errors]]
* [[Legacy:UMake|UMake]] &amp;ndash; convenient &quot;ucc make&quot; wrapper tool.
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Using Default.ini to Compile with mod Support.
* [[Legacy:Commandlet|Commandlet]]

==Discussion==

'''Xaklse:''' Very useful, thanks! But I had many problems with your first batch example. In case anyone has problems with it, here goes my batch file. Mine includes a custom key binding and exports cache to a single file.

&lt;uscript&gt;
:init
@echo Off
set utk4dir=C:\UT2004\
set utk4sysdir=%utk4dir%System\

set modname=AshuraDarkReign
set moddir=%utk4dir%%modname%\
set modsysdir=%moddir%System\
set modbakdir=%moddir%SYSBAK\

set package1=AshuraDarkReign
set package2=ADRGame
set package3=ADRMonsters
goto bak

:bak
md %modbakdir%
copy %modsysdir%*.ucl %modbakdir%*.ucl
copy %modsysdir%*.int %modbakdir%*.int
copy %modsysdir%*.u %modbakdir%*.u
echo //------------------------Old Files Backed Up!------------------------
goto del

:del
del /q %modsysdir%%package1%.* &gt; nul
del /q %modsysdir%%package2%.* &gt; nul
del /q %modsysdir%%package3%.* &gt; nul
echo //-------------------------Old Files Deleted!-------------------------
goto make

:make
%utk4sysdir%UCC.exe make -mod=%modname%
copy %utk4sysdir%ucc.log %modbakdir%%modname%_ucc.log
echo //---------------------------*.u Complete!----------------------------
goto make&amp;int

:make&amp;int
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package1%.u
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package2%.u
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package3%.u
copy %utk4sysdir%ucc.log %modbakdir%%modname%_int.log
copy %utk4sysdir%%package1%.int %modsysdir%%package1%.int
copy %utk4sysdir%%package2%.int %modsysdir%%package2%.int
copy %utk4sysdir%%package3%.int %modsysdir%%package3%.int
del %utk4sysdir%%package1%.int
del %utk4sysdir%%package2%.int
del %utk4sysdir%%package3%.int
del %utk4sysdir%ucc.log
echo [Public]&gt;&gt;%modsysdir%%package1%.int
echo Object=(Class=Class,MetaClass=XInterface.GUIUserKeyBinding,Name=AshuraDarkReign.ADRKeyBindings)&gt;&gt;%modsysdir%%package1%.int
echo //--------------------------*.int Complete!---------------------------
goto make&amp;ucl

:make&amp;ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package1%.u %package1%.ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package2%.u %package1%.ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package3%.u %package1%.ucl
echo //--------------------------*.ucl Complete!---------------------------
goto end

:end
copy %utk4sysdir%ucc.log %modbakdir%%modname%_ucl.log
del %utk4sysdir%ucc.log
echo //-----------------------COMPILATION COMPLETED!-----------------------
pause
&lt;/uscript&gt;

[[:Category:Legacy Tutorial]]

[[Legacy:Caetgory Toolchain|Caetgory Toolchain]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2017</id>
      <timestamp>2007-04-09T13:15:52Z</timestamp>
      <contributor>
        <ip>81.23.220.87.dynamic.jazztel.es</ip>
      </contributor>
      <comment>Added a batch file example.</comment>
      <text xml:space="preserve">'''UCC''' is the [[Legacy:UnrealScript|UnrealScript]] compiler. This page explains how to compile with the '''ucc make''' command. As an alternative, you may want to consider using [[Legacy:UMake|UMake]], which makes the whole thing much simpler.  If you are a cygwin geek, you might like use [[Legacy:GnuMake|GnuMake]]

==Compiling==

So, you've spent some time lovingly crafting your mod using well laid out, commented, and maintainable Unreal Script.  You have done the decent thing and placed your .uc class files in /UnrealTournament/YourModPackage/Classes.  The big moment approaches - will it compile first time?

Well, there's only one way to find out, and that's to do it.  At the very least you need to edit your [[Legacy:Game Ini File|Game Ini File]] and add your package name to the list of editable packages.  Search the ini file for a list of lines starting with EditPackages.  Add your package to the bottom of the list like so:

  EditPackages=YourModPackage

Save the changes. You will now be able to compile your mod using the following command:

  ucc make

By default this command examines all of the EditPackages lines searching for packages which have no corresponding .u (a compiled package file) files and attempts to compile them.  If you have previously built YourModPackage and you have updated the code the build command will not recompile your package unless your first delete it.  It's well worth creating a small batch file to do this for you, e.g.

  cd C:\UnrealTournament\System
  del YourModPackage.u
  ucc make

One of the things that's really easy to forget is the [[Legacy:INT File|INT file]] associated with your new package.  This file defines the public classes in the package.  Look in any of the [[Legacy:INT File|INT file]]s for examples of this.  Remember to include the ''[Public]'' directive at the top of the file though or your mod won't be visible in the UT front end.  It's worth keeping a copy of your [[Legacy:INT File|INT file]] in the /UnrealTournament/YourModPackage directory so you don't lose it and always have an up to date version.

==Tips==

To reduce compile time, create the following:
* An ini file, named for example MyProject.ini. Copy UnrealTournament.ini or UT2003.ini and only include those EditPackages entries that your classes depend on.

* Make a batch file that reads: &lt;br /&gt;&lt;tt&gt;ucc make ini=MyProject.ini&lt;/tt&gt;

Note that to see output you'll still have to run it from the command prompt.  ([[Legacy:UMake|UMake]] does all that automatically for you and stores an .ini file called make.ini in your project directory.)

===Batch File===

When I still used UCC Make I made a batch file that looked like this:
  COPY MyMod.U *.U_Backup
  DEL MyMod.U
  UCC MAKE
  PAUSE

This backs up your U file, deletes it, recompiles it, and then PAUSE, &quot;press any key to continue&quot;. This combined with the INI said above here could make a very nice way to compile.

===Mod System Batch File for ut2k4===

Last Updated: 15 January 2006

Easy to adjust to any mod just input the unreal tournament 2004 directory, the mod name and the package and your off.

If you want to add extra packages just copy the lines containing %package1% or package1 and replace them with %package2% or package2.

&lt;uscript&gt;
:init
@echo Off
set utk4dir=&quot;Your Unreal 2k4 Dir&quot;
set utk4sysdir=%utk4dir%system\

set modname=&quot;Your Mod Name&quot;
set moddir=%utk4dir%%modname%
set modbakdir=%moddir%SysBak\
set modlogdir=%moddir%System\logs\

set package1=&quot;Your Package Here&quot;
goto bak

:bak
md %modbakdir%
md %modlogdir%
copy %moddir%*.ucl %modbakdir%*.ucl
copy %moddir%*.int %modbakdir%*.int
copy %moddir%*.u %modbakdir%*.u
echo //-----------------------Old Files Backed Up!------------------------
goto del

:del
del /q %utk4sysdir%%Package1%.* &gt; nul
del /q %moddir%%Package1%.* &gt; nul
echo //-----------------------Echo Old Files Deleted!----------------------
goto make

:make
%utk4dir%UCC.exe make -mod=%modname%
copy %utk4dir%ucc.log %modlogdir%%modname%_ucc.log
echo //---------------------------*.u Complete!----------------------------
goto make&amp;int

:make&amp;int 
%utk4Dir%UCC.exe dumpint -mod=%modname% %moddir%%package1%.u
copy %utk4sysdir%ucc.log %modlogdir%%modname%_int.log
copy %utk4sysdir%%package1%.int %moddir%%package1%.int
del %utk4sysdir%%package1%.int
del %utk4sysdir%ucc.log
echo //--------------------------*.int Complete!---------------------------
goto make&amp;ucl

:make&amp;ucl
%utk4Dir%UCC.exe exportcache -v -mod=%modname% %moddir%%Package1%.u 
copy %utk4sysdir%ucc.log %modlogdir%%modname%_ucl.log
del %utk4sysdir%ucc.log
echo //--------------------------*.ucl Complete!---------------------------
goto end

:end
echo //--------------------------Make Complete!---------------------------
&lt;/uscript&gt;

===Another ucc batch file===

Displays time and result of last compilation, updates window title, restarts with single key press.

&lt;uscript&gt;
@echo off
:start
title COMPILING :: MyProject
CLS

Copy UCC_MyProject.log UCC_MyProject_OLD.log

del MyProject.u

ucc make -INI=MyProject.ini -LOG=UCC_MyProject.log
if errorlevel 1 goto end

title OK :: MyProject
findstr /c:&quot;Log file closed&quot; UCC_MyProject.log

echo.
pause
goto start

:end
title ERROR :: MyProject 
findstr /c:&quot;Log file closed&quot; UCC_MyProject.log

echo.
pause
goto start
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]
* [[Legacy:Compiler Errors|Compiler Errors]]
* [[Legacy:UMake|UMake]] &amp;ndash; convenient &quot;ucc make&quot; wrapper tool.
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Using Default.ini to Compile with mod Support.
* [[Legacy:Commandlet|Commandlet]]

==Discussion==

'''Xaklse:''' Very useful, thanks! But I had many problems with your first batch example. In case anyone has problems with it, here goes my batch file. Mine includes a custom key binding and exports cache to a single file.

&lt;uscript&gt;
:init
@echo Off
set utk4dir=C:\UT2004\
set utk4sysdir=%utk4dir%System\

set modname=AshuraDarkReign
set moddir=%utk4dir%%modname%\
set modsysdir=%moddir%System\
set modbakdir=%moddir%SYSBAK\

set package1=AshuraDarkReign
set package2=ADRGame
set package3=ADRMonsters
goto bak

:bak
md %modbakdir%
copy %modsysdir%*.ucl %modbakdir%*.ucl
copy %modsysdir%*.int %modbakdir%*.int
copy %modsysdir%*.u %modbakdir%*.u
echo //------------------------Old Files Backed Up!------------------------
goto del

:del
del /q %modsysdir%%package1%.* &gt; nul
del /q %modsysdir%%package2%.* &gt; nul
del /q %modsysdir%%package3%.* &gt; nul
echo //-------------------------Old Files Deleted!-------------------------
goto make

:make
%utk4sysdir%UCC.exe make -mod=%modname%
copy %utk4sysdir%ucc.log %modbakdir%%modname%_ucc.log
echo //---------------------------*.u Complete!----------------------------
goto make&amp;int

:make&amp;int
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package1%.u
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package2%.u
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package3%.u
copy %utk4sysdir%ucc.log %modbakdir%%modname%_int.log
copy %utk4sysdir%%package1%.int %modsysdir%%package1%.int
copy %utk4sysdir%%package2%.int %modsysdir%%package2%.int
copy %utk4sysdir%%package3%.int %modsysdir%%package3%.int
del %utk4sysdir%%package1%.int
del %utk4sysdir%%package2%.int
del %utk4sysdir%%package3%.int
del %utk4sysdir%ucc.log
echo [Public]&gt;&gt;%modsysdir%%package1%.int
echo Object=(Class=Class,MetaClass=XInterface.GUIUserKeyBinding,Name=AshuraDarkReign.ADRKeyBindings)&gt;&gt;%modsysdir%%package1%.int
echo //--------------------------*.int Complete!---------------------------
goto make&amp;ucl

:make&amp;ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package1%.u %package1%.ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package2%.u %package1%.ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package3%.u %package1%.ucl
echo //--------------------------*.ucl Complete!---------------------------
goto end

:end
copy %utk4sysdir%ucc.log %modbakdir%%modname%_ucl.log
del %utk4sysdir%ucc.log
echo //-----------------------COMPILATION COMPLETED!-----------------------
pause
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>33137</id>
      <timestamp>2008-10-17T18:59:18Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <minor/>
      <comment>Mentioned MonkeyBuild</comment>
      <text xml:space="preserve">'''UCC''' is the [[Legacy:UnrealScript|UnrealScript]] compiler. This page explains how to compile with the '''ucc make''' command. As an alternative, you may want to consider using tools like [[Legacy:UMake|UMake]] or [[MonkeyBuild]], which makes the whole thing much simpler.  If you are a cygwin geek, you might like use [[Legacy:GnuMake|GnuMake]].

==Compiling==

So, you've spent some time lovingly crafting your mod using well laid out, commented, and maintainable Unreal Script.  You have done the decent thing and placed your .uc class files in /UnrealTournament/YourModPackage/Classes.  The big moment approaches - will it compile first time?

Well, there's only one way to find out, and that's to do it.  At the very least you need to edit your [[Legacy:Game Ini File|Game Ini File]] and add your package name to the list of editable packages.  Search the ini file for a list of lines starting with EditPackages.  Add your package to the bottom of the list like so:

  EditPackages=YourModPackage

Save the changes. You will now be able to compile your mod using the following command:

  ucc make

By default this command examines all of the EditPackages lines searching for packages which have no corresponding .u (a compiled package file) files and attempts to compile them.  If you have previously built YourModPackage and you have updated the code the build command will not recompile your package unless your first delete it.  It's well worth creating a small batch file to do this for you, e.g.

  cd C:\UnrealTournament\System
  del YourModPackage.u
  ucc make

One of the things that's really easy to forget is the [[Legacy:INT File|INT file]] associated with your new package.  This file defines the public classes in the package.  Look in any of the [[Legacy:INT File|INT file]]s for examples of this.  Remember to include the ''[Public]'' directive at the top of the file though or your mod won't be visible in the UT front end.  It's worth keeping a copy of your [[Legacy:INT File|INT file]] in the /UnrealTournament/YourModPackage directory so you don't lose it and always have an up to date version.

==Tips==

To reduce compile time, create the following:
* An ini file, named for example MyProject.ini. Copy UnrealTournament.ini or UT2003.ini and only include those EditPackages entries that your classes depend on.

* Make a batch file that reads: &lt;br /&gt;&lt;tt&gt;ucc make ini=MyProject.ini&lt;/tt&gt;

Note that to see output you'll still have to run it from the command prompt.  ([[Legacy:UMake|UMake]] does all that automatically for you and stores an .ini file called make.ini in your project directory.)

===Batch File===

When I still used UCC Make I made a batch file that looked like this:
  COPY MyMod.U *.U_Backup
  DEL MyMod.U
  UCC MAKE
  PAUSE

This backs up your U file, deletes it, recompiles it, and then PAUSE, &quot;press any key to continue&quot;. This combined with the INI said above here could make a very nice way to compile.

===Mod System Batch File for ut2k4===

Last Updated: 15 January 2006

Easy to adjust to any mod just input the unreal tournament 2004 directory, the mod name and the package and your off.

If you want to add extra packages just copy the lines containing %package1% or package1 and replace them with %package2% or package2.

&lt;uscript&gt;
:init
@echo Off
set utk4dir=&quot;Your Unreal 2k4 Dir&quot;
set utk4sysdir=%utk4dir%system\

set modname=&quot;Your Mod Name&quot;
set moddir=%utk4dir%%modname%
set modbakdir=%moddir%SysBak\
set modlogdir=%moddir%System\logs\

set package1=&quot;Your Package Here&quot;
goto bak

:bak
md %modbakdir%
md %modlogdir%
copy %moddir%*.ucl %modbakdir%*.ucl
copy %moddir%*.int %modbakdir%*.int
copy %moddir%*.u %modbakdir%*.u
echo //-----------------------Old Files Backed Up!------------------------
goto del

:del
del /q %utk4sysdir%%Package1%.* &gt; nul
del /q %moddir%%Package1%.* &gt; nul
echo //-----------------------Echo Old Files Deleted!----------------------
goto make

:make
%utk4dir%UCC.exe make -mod=%modname%
copy %utk4dir%ucc.log %modlogdir%%modname%_ucc.log
echo //---------------------------*.u Complete!----------------------------
goto make&amp;int

:make&amp;int 
%utk4Dir%UCC.exe dumpint -mod=%modname% %moddir%%package1%.u
copy %utk4sysdir%ucc.log %modlogdir%%modname%_int.log
copy %utk4sysdir%%package1%.int %moddir%%package1%.int
del %utk4sysdir%%package1%.int
del %utk4sysdir%ucc.log
echo //--------------------------*.int Complete!---------------------------
goto make&amp;ucl

:make&amp;ucl
%utk4Dir%UCC.exe exportcache -v -mod=%modname% %moddir%%Package1%.u 
copy %utk4sysdir%ucc.log %modlogdir%%modname%_ucl.log
del %utk4sysdir%ucc.log
echo //--------------------------*.ucl Complete!---------------------------
goto end

:end
echo //--------------------------Make Complete!---------------------------
&lt;/uscript&gt;

===Another ucc batch file===

Displays time and result of last compilation, updates window title, restarts with single key press.

&lt;uscript&gt;
@echo off
:start
title COMPILING :: MyProject
CLS

Copy UCC_MyProject.log UCC_MyProject_OLD.log

del MyProject.u

ucc make -INI=MyProject.ini -LOG=UCC_MyProject.log
if errorlevel 1 goto end

title OK :: MyProject
findstr /c:&quot;Log file closed&quot; UCC_MyProject.log

echo.
pause
goto start

:end
title ERROR :: MyProject 
findstr /c:&quot;Log file closed&quot; UCC_MyProject.log

echo.
pause
goto start
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]
* [[Legacy:Compiler Errors|Compiler Errors]]
* [[Legacy:UMake|UMake]] &amp;ndash; convenient &quot;ucc make&quot; wrapper tool.
* [[MonkeyBuild]] &amp;ndash; another tool for easier script compiling
* [[Legacy:Set Up Package Folders|Set Up Package Folders]]
* [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Using Default.ini to Compile with mod Support.
* [[Legacy:Commandlet|Commandlet]]

==Discussion==

'''Xaklse:''' Very useful, thanks! But I had many problems with your first batch example. In case anyone has problems with it, here goes my batch file. Mine includes a custom key binding and exports cache to a single file.

&lt;uscript&gt;
:init
@echo Off
set utk4dir=C:\UT2004\
set utk4sysdir=%utk4dir%System\

set modname=AshuraDarkReign
set moddir=%utk4dir%%modname%\
set modsysdir=%moddir%System\
set modbakdir=%moddir%SYSBAK\

set package1=AshuraDarkReign
set package2=ADRGame
set package3=ADRMonsters
goto bak

:bak
md %modbakdir%
copy %modsysdir%*.ucl %modbakdir%*.ucl
copy %modsysdir%*.int %modbakdir%*.int
copy %modsysdir%*.u %modbakdir%*.u
echo //------------------------Old Files Backed Up!------------------------
goto del

:del
del /q %modsysdir%%package1%.* &gt; nul
del /q %modsysdir%%package2%.* &gt; nul
del /q %modsysdir%%package3%.* &gt; nul
echo //-------------------------Old Files Deleted!-------------------------
goto make

:make
%utk4sysdir%UCC.exe make -mod=%modname%
copy %utk4sysdir%ucc.log %modbakdir%%modname%_ucc.log
echo //---------------------------*.u Complete!----------------------------
goto make&amp;int

:make&amp;int
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package1%.u
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package2%.u
%utk4sysdir%UCC.exe dumpint -mod=%modname% %modsysdir%%package3%.u
copy %utk4sysdir%ucc.log %modbakdir%%modname%_int.log
copy %utk4sysdir%%package1%.int %modsysdir%%package1%.int
copy %utk4sysdir%%package2%.int %modsysdir%%package2%.int
copy %utk4sysdir%%package3%.int %modsysdir%%package3%.int
del %utk4sysdir%%package1%.int
del %utk4sysdir%%package2%.int
del %utk4sysdir%%package3%.int
del %utk4sysdir%ucc.log
echo [Public]&gt;&gt;%modsysdir%%package1%.int
echo Object=(Class=Class,MetaClass=XInterface.GUIUserKeyBinding,Name=AshuraDarkReign.ADRKeyBindings)&gt;&gt;%modsysdir%%package1%.int
echo //--------------------------*.int Complete!---------------------------
goto make&amp;ucl

:make&amp;ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package1%.u %package1%.ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package2%.u %package1%.ucl
%utk4sysdir%UCC.exe exportcache -a -mod=%modname% %package3%.u %package1%.ucl
echo //--------------------------*.ucl Complete!---------------------------
goto end

:end
copy %utk4sysdir%ucc.log %modbakdir%%modname%_ucl.log
del %utk4sysdir%ucc.log
echo //-----------------------COMPILATION COMPLETED!-----------------------
pause
&lt;/uscript&gt;

[[:Category:Legacy Tutorial]]

[[Legacy:Caetgory Toolchain|Caetgory Toolchain]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Component</title>
    <id>928</id>
    <revision>
      <id>2533</id>
      <timestamp>2008-02-12T12:53:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created class page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT3|UT3]] :: [[Legacy:Object (UT3)|Object (UT3)]] &gt;&gt; Component (Package: Engine)}}

This class is the base class for any kind of object that wants the following features:
* be a subobject inside a class definition (called the owner class)
* values of the component can be overridden in a subclass of the owner class, by defining a component in the subclass with the same name as the component in the base class definition. Note, you CANNOT GIVE IT A CLASS= DEFINITION! (See UDN page for more info)
* Changes to the default values to the component will be propagated to components that are created inside a map, unless the value was changed away from the default value in the editor.

==Properties==
; class TemplateOwnerClass : 
; name TemplateName : 

==Known Subclasses==
* [[Legacy:ActorComponent|ActorComponent]]
* [[Legacy:DistributionFloat|DistributionFloat]]
* [[Legacy:DistributionVector|DistributionVector]]
* [[Legacy:SVehicleWheel|SVehicleWheel]]
* [[Legacy:UIComponent|UIComponent]]

----

[[:Category:Legacy Class (UT3)]]

[[:Category:Legacy To Do]] &amp;ndash; this page is currently a stub
[[Category:Legacy Class (UT3)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Compound Movers</title>
    <id>703</id>
    <revision>
      <id>2042</id>
      <timestamp>2008-02-09T17:04:26Z</timestamp>
      <contributor>
        <ip>129.19.1.147</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Match These Tags|Match these tags]]:

* Master Brush :: Events -&gt; Tag
* Slave Brush :: Events -&gt; Tag

&lt;uscript&gt;
		if( !bSlave )
		{
			foreach AllActors( class 'Mover', M, Tag )
			{
				if( M.bSlave )
				{
					M.GotoState('');
					M.SetBase( Self );
				}
			}
		}
&lt;/uscript&gt;

Set:
* Slave Brush :: Mover -&gt; bSlave = True

Note bad mojo on some mover types (eg GradualMover as master brush, care needed)

'''computergod666:''' Wow that's amazing. NOT! I have a Turret for UT, that follows the user's view rotation. I tried attaching another mover to it (why I did is not important), and it rotated with the turret, but only in a horizontal plane. If I looked up or down, the turret would rotate but the attached mover wouldn't. Does anyone know why?

==Related Topics==

[[Legacy:Mover Topics|Mover Topics]] is the hub for all things mover

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; merge this information into another page
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2043</id>
      <timestamp>2003-10-25T09:13:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Match These Tags|Match these tags]]:

* Master Brush :: Events -&gt; Tag
* Slave Brush :: Events -&gt; Tag

&lt;uscript&gt;
		if( !bSlave )
		{
			foreach AllActors( class 'Mover', M, Tag )
			{
				if( M.bSlave )
				{
					M.GotoState('');
					M.SetBase( Self );
				}
			}
		}
&lt;/uscript&gt;

Set:
* Slave Brush :: Mover -&gt; bSlave = True

Note bad mojo on some mover types (eg GradualMover as master brush, care needed)

==Related Topics==

[[Legacy:Mover Topics|Mover Topics]] is the hub for all things mover

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; merge this information into another page
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ComputerPersonal (DX)</title>
    <id>853</id>
    <revision>
      <id>2378</id>
      <timestamp>2005-10-10T16:57:14Z</timestamp>
      <contributor>
        <ip>Amazonas-1990.adsl.datanet.hu</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Overview of ComputerPersonal===

ComputerPersonal is, of course, the personal computer in DX. All instructions for using them are available in the DX 

This is what the editor doc says:

{{innerbox|This is the desktop system of the DE world. Usually used only as a means of e-mail reception it has similar properties

of all of the computers and can activate special options triggering outside events (i.e. Shutting off the coolant to the

generator in the NYC warehouse and blowing it up, Signaling the NSF from the old NSF headquarters building, etc.)

}}

===Important functions (NB: these are all methods of the superclass, Computers)===
; string GetNodeName() : Returns the title of the node (e.g. &quot;UNATCO&quot;)
; string GetNameDesc() : Returns the node's long name (e.g. &quot;United Nations Anti-Terrorist Coalition&quot;)
; string GetNodeAddress() : Returns the node's address
; texture GetNodeTexture() : Returns the texture that is the node's icon
; string GetUserName(int userIndex) : Returns the username from entry #userIndex in the userList array
; string GetUserPassword(int userIndex) : As GetUserName, but returns password
; int GetAccessLevel(int userIndex) : As GetUserName, but returns access level (question: was access level ever implemented?)
; AdditionalActivation(DeusExPlayer ActivatingPlayer), AdditionalDeactivation(DeusExPlayer DeactivatingPlayer) : Called for subclasses to do any additional activation steps. Empty in both Computers and ComputerPersonal.
; BeginAlarm(), EndAlarm() : Turns the alarm on and off, after a hacker runs out of time

===Custom computer nodes===

OK, this is my happy little contribution to this site. How to make custom nodes.

Now some people will have you make new subclasses of Computer, ComputerPersonal, and all the UI interface classes as well. This is not necessary! In fact, it is complete overkill.

I will not explore custom textures here, for info on that stuff you can visit tutorial sites like www.planetdeusex.com/tack.

As you may know, the computers have variables like TitleString and TitleTexture that were never implemented. We are now going to implement them.

There is no need to edit the UI. The UI classes get information like title string, description, etc. from functions in the computer class, specifically GetNodeName(), GetNameDesc(), GetNodeAddress(), and GetNodeTexture() (the values are returned by the functions). All we have to do is a little tweaking to get everything running smoothly.

The following code is what I used in my mod. There's a new enumeration. It has the following settings:
; STANDARD_NODE_LIST : Uses the regular list of nodes (e.g. UNATCO, NSF, MJ12), like a regular computer
; CUSTOM_NODE : Uses the nodeName, titleString, titleTexture, and (newly added) nodeAddress, that were present but not implemented in the standard computer
; NN_MYNODETYPE : This is an example of a preset node type. Many of these could be added to the list for convenience. I added several in my mod.

&lt;uscript&gt;
//--------------------------------------------------------
// MyComputerPersonal
// By TheSheep
// thesheepbaa@hotmail.com
//--------------------------------------------------------
class MyComputerPersonal extends ComputerPersonal;

//New options for node type
enum EAltNodeName
	{
	STANDARD_NODE_LIST, //taken from the normal list of nodes e.g. UNATCO, NSF, MJ12, etc.
	CUSTOM_NODE,        //custom node based on name, desc, addr, and texture settings
	NN_MYNODETYPE       //a preset custom configuration
	};
	
var() EAltNodeName AltNodeName;

//nodeAddress for CUSTOM_NODEs
var(Computers) localized string nodeAddress;

//These are the variables that settings are stored in
var localized string MyNodeName,MyNodeDesc,MyNodeAddress;
var texture MyNodeTexture;

function PostBeginPlay() //executed near start of game
{
switch(AltNodeName)
	{
	case STANDARD_NODE_LIST:
		MyNodeName=nodeInfo[Int(ComputerNode)].nodeName;
		MyNodeDesc=nodeInfo[Int(ComputerNode)].nodeDesc;
		MyNodeAddress=nodeInfo[Int(ComputerNode)].nodeAddress;
		MyNodeTexture=nodeInfo[Int(ComputerNode)].nodeTexture;
		break;
	case CUSTOM_NODE:
		MyNodeName=nodeName;
		MyNodeDesc=titleString;
		MyNodeAddress=nodeAddress;
		MyNodeTexture=titleTexture;
		break;
	case NN_MYNODETYPE:
		MyNodeName=&quot;Preset node&quot;;
		MyNodeDesc=&quot;My preset node type for my mod&quot;;
		MyNodeAddress=&quot;MY//NODE//TYPE//ADDRESS.0530.53&quot;;
		MyNodeTexture=Texture'MyPackage.MyTexture';
		break;
	}	
Super.PostBeginPlay();
}

// Functions to get info
// They are called to obtain information about the node, and pass the desired info as a return value.
function String GetNodeName()
{ return MyNodeName; }

function String GetNodeDesc()
{ return MyNodeDesc; }

function String GetNodeAddress()
{ return MyNodeAddress; }

function Texture GetNodeTexture()
{ return MyNodeTexture; }

//default properties - none of note
defaultproperties
{
}
&lt;/uscript&gt;

No matter what type of node is set up, the name, description, address, and texture are stored in my variables MyNodeName, MyNodeDesc, MyNodeAddress, MyNodeTexture. Quick, clean, simple.

Although the class is
 MyComputerPersonal extends ComputerPersonal

it could also work as
 MyComputerSecurity extends ComputerSecurity

NB: I don't think you can easily subclass Computer itself as this will need a new UI class.

IAMME: I don't think so - if you want to make one with a new skin you can use it's super's UI.</text>
    </revision>
    <revision>
      <id>2379</id>
      <timestamp>2004-05-23T11:42:25Z</timestamp>
      <contributor>
        <ip>TheSheep</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Overview of ComputerPersonal===

ComputerPersonal is, of course, the personal computer in DX. All instructions for using them are available in the DX 

editor documentation

===Custom computer nodes===

OK, this is my happy little contribution to this site. How to make custom nodes.

Now some people will have you make new subclasses of Computer, ComputerPersonal, and all the UI interface classes as well. This is not necessary! In fact, it is complete overkill.

I will not explore custom textures here, for info on that stuff you can visit tutorial sites like www.planetdeusex.com/tack.

As you may know, the computers have variables like TitleString and TitleTexture that were never implemented. We are now going to implement them.

There is no need to edit the UI. The UI classes get information like title string, description, etc. from functions in the computer class, specifically GetNodeName(), GetNameDesc(), GetNodeAddress(), and GetNodeTexture() (the values are returned by the functions). All we have to do is a little tweaking to get everything running smoothly.

The following code is what I used in my mod. There's a new enumeration. It has the following settings:
; STANDARD_NODE_LIST : Uses the regular list of nodes (e.g. UNATCO, NSF, MJ12), like a regular computer
; CUSTOM_NODE : Uses the nodeName, titleString, titleTexture, and (newly added) nodeAddress, that were present but not implemented in the standard computer
; NN_MYNODETYPE : This is an example of a preset node type. Many of these could be added to the list for convenience. I added several in my mod.

&lt;uscript&gt;
//--------------------------------------------------------
// MyComputerPersonal
// By TheSheep
// thesheepbaa@hotmail.com
//--------------------------------------------------------
class MyComputerPersonal extends ComputerPersonal;

//New options for node type
enum EAltNodeName
	{
	STANDARD_NODE_LIST, //taken from the normal list of nodes e.g. UNATCO, NSF, MJ12, etc.
	CUSTOM_NODE,        //custom node based on name, desc, addr, and texture settings
	NN_MYNODETYPE       //a preset custom configuration
	};
	
var() EAltNodeName AltNodeName;

//nodeAddress for CUSTOM_NODEs
var(Computers) localized string nodeAddress;

//These are the variables that settings are stored in
var localized string MyNodeName,MyNodeDesc,MyNodeAddress;
var texture MyNodeTexture;

function PostBeginPlay() //executed near start of game
{
switch(AltNodeName)
	{
	case STANDARD_NODE_LIST:
		MyNodeName=nodeInfo[Int(ComputerNode)].nodeName;
		MyNodeDesc=nodeInfo[Int(ComputerNode)].nodeDesc;
		MyNodeAddress=nodeInfo[Int(ComputerNode)].nodeAddress;
		MyNodeTexture=nodeInfo[Int(ComputerNode)].nodeTexture;
		break;
	case CUSTOM_NODE:
		MyNodeName=nodeName;
		MyNodeDesc=titleString;
		MyNodeAddress=nodeAddress;
		MyNodeTexture=titleTexture;
		break;
	case NN_MYNODETYPE:
		MyNodeName=&quot;Preset node&quot;;
		MyNodeDesc=&quot;My preset node type for my mod&quot;;
		MyNodeAddress=&quot;MY//NODE//TYPE//ADDRESS.0530.53&quot;;
		MyNodeTexture=Texture'MyPackage.MyTexture';
		break;
	}	
Super.PostBeginPlay();
}

// Functions to get info
// They are called to obtain information about the node, and pass the desired info as a return value.
function String GetNodeName()
{ return MyNodeName; }

function String GetNodeDesc()
{ return MyNodeDesc; }

function String GetNodeAddress()
{ return MyNodeAddress; }

function Texture GetNodeTexture()
{ return MyNodeTexture; }

//default properties - none of note
defaultproperties
{
}
&lt;/uscript&gt;

No matter what type of node is set up, the name, description, address, and texture are stored in my variables MyNodeName, MyNodeDesc, MyNodeAddress, MyNodeTexture. Quick, clean, simple.

Although the class is
 MyComputerPersonal extends ComputerPersonal

it could also work as
 MyComputerSecurity extends ComputerSecurity

NB: I don't think you can easily subclass Computer itself as this will need a new UI class.</text>
    </revision>
    <revision>
      <id>2380</id>
      <timestamp>2004-06-11T17:41:49Z</timestamp>
      <contributor>
        <ip>TheSheep</ip>
      </contributor>
      <comment>Added key functions and editor documentation</comment>
      <text xml:space="preserve">===Overview of ComputerPersonal===

ComputerPersonal is, of course, the personal computer in DX. All instructions for using them are available in the DX 

This is what the editor doc says:

{{innerbox|This is the desktop system of the DE world. Usually used only as a means of e-mail reception it has similar properties

of all of the computers and can activate special options triggering outside events (i.e. Shutting off the coolant to the

generator in the NYC warehouse and blowing it up, Signaling the NSF from the old NSF headquarters building, etc.)

}}

===Important functions (NB: these are all methods of the superclass, Computers)===
; string GetNodeName() : Returns the title of the node (e.g. &quot;UNATCO&quot;)
; string GetNameDesc() : Returns the node's long name (e.g. &quot;United Nations Anti-Terrorist Coalition&quot;)
; string GetNodeAddress() : Returns the node's address
; texture GetNodeTexture() : Returns the texture that is the node's icon
; string GetUserName(int userIndex) : Returns the username from entry #userIndex in the userList array
; string GetUserPassword(int userIndex) : As GetUserName, but returns password
; int GetAccessLevel(int userIndex) : As GetUserName, but returns access level (question: was access level ever implemented?)
; AdditionalActivation(DeusExPlayer ActivatingPlayer), AdditionalDeactivation(DeusExPlayer DeactivatingPlayer) : Called for subclasses to do any additional activation steps. Empty in both Computers and ComputerPersonal.
; BeginAlarm(), EndAlarm() : Turns the alarm on and off, after a hacker runs out of time

===Custom computer nodes===

OK, this is my happy little contribution to this site. How to make custom nodes.

Now some people will have you make new subclasses of Computer, ComputerPersonal, and all the UI interface classes as well. This is not necessary! In fact, it is complete overkill.

I will not explore custom textures here, for info on that stuff you can visit tutorial sites like www.planetdeusex.com/tack.

As you may know, the computers have variables like TitleString and TitleTexture that were never implemented. We are now going to implement them.

There is no need to edit the UI. The UI classes get information like title string, description, etc. from functions in the computer class, specifically GetNodeName(), GetNameDesc(), GetNodeAddress(), and GetNodeTexture() (the values are returned by the functions). All we have to do is a little tweaking to get everything running smoothly.

The following code is what I used in my mod. There's a new enumeration. It has the following settings:
; STANDARD_NODE_LIST : Uses the regular list of nodes (e.g. UNATCO, NSF, MJ12), like a regular computer
; CUSTOM_NODE : Uses the nodeName, titleString, titleTexture, and (newly added) nodeAddress, that were present but not implemented in the standard computer
; NN_MYNODETYPE : This is an example of a preset node type. Many of these could be added to the list for convenience. I added several in my mod.

&lt;uscript&gt;
//--------------------------------------------------------
// MyComputerPersonal
// By TheSheep
// thesheepbaa@hotmail.com
//--------------------------------------------------------
class MyComputerPersonal extends ComputerPersonal;

//New options for node type
enum EAltNodeName
	{
	STANDARD_NODE_LIST, //taken from the normal list of nodes e.g. UNATCO, NSF, MJ12, etc.
	CUSTOM_NODE,        //custom node based on name, desc, addr, and texture settings
	NN_MYNODETYPE       //a preset custom configuration
	};
	
var() EAltNodeName AltNodeName;

//nodeAddress for CUSTOM_NODEs
var(Computers) localized string nodeAddress;

//These are the variables that settings are stored in
var localized string MyNodeName,MyNodeDesc,MyNodeAddress;
var texture MyNodeTexture;

function PostBeginPlay() //executed near start of game
{
switch(AltNodeName)
	{
	case STANDARD_NODE_LIST:
		MyNodeName=nodeInfo[Int(ComputerNode)].nodeName;
		MyNodeDesc=nodeInfo[Int(ComputerNode)].nodeDesc;
		MyNodeAddress=nodeInfo[Int(ComputerNode)].nodeAddress;
		MyNodeTexture=nodeInfo[Int(ComputerNode)].nodeTexture;
		break;
	case CUSTOM_NODE:
		MyNodeName=nodeName;
		MyNodeDesc=titleString;
		MyNodeAddress=nodeAddress;
		MyNodeTexture=titleTexture;
		break;
	case NN_MYNODETYPE:
		MyNodeName=&quot;Preset node&quot;;
		MyNodeDesc=&quot;My preset node type for my mod&quot;;
		MyNodeAddress=&quot;MY//NODE//TYPE//ADDRESS.0530.53&quot;;
		MyNodeTexture=Texture'MyPackage.MyTexture';
		break;
	}	
Super.PostBeginPlay();
}

// Functions to get info
// They are called to obtain information about the node, and pass the desired info as a return value.
function String GetNodeName()
{ return MyNodeName; }

function String GetNodeDesc()
{ return MyNodeDesc; }

function String GetNodeAddress()
{ return MyNodeAddress; }

function Texture GetNodeTexture()
{ return MyNodeTexture; }

//default properties - none of note
defaultproperties
{
}
&lt;/uscript&gt;

No matter what type of node is set up, the name, description, address, and texture are stored in my variables MyNodeName, MyNodeDesc, MyNodeAddress, MyNodeTexture. Quick, clean, simple.

Although the class is
 MyComputerPersonal extends ComputerPersonal

it could also work as
 MyComputerSecurity extends ComputerSecurity

NB: I don't think you can easily subclass Computer itself as this will need a new UI class.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Computergod666</title>
    <id>923</id>
    <revision>
      <id>2525</id>
      <timestamp>2008-02-06T18:23:49Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Random comments===

Any map named &quot;Battle Arena&quot; is doomed to fail. Historically, mappers have decided to call their maps &quot;Battle Arena&quot; if there is no cover and no good weapon or health placement, because then a deathmatch turns into a confused mess on the ground floor. Single player battle arenas are just as confusing and pointless: usually a large, open map full of monsters. Anyone who makes a map called &quot;Battle Arena&quot; deserves to be smashed against the skybox with my new Enhanced Gravity Gun.

===Developer Journal===

2 Feb 2007

Vehicles for Unreal Tournament. Wouldn't that be a nice thing? How about vehicles that you can mount user-controllable turrets (or any other actor) on? All who agree, please let me know and I will send you my latest script package... Not really. I just finished a user-controllable turret for UT. So I could attach things to it realistically, I had to create my own mover subclass because the Attach Mover is a failure, at least on my computer. So I created a turret. I'm working on a vehicle class for which you can specify whether it's a land vehicle (goes on land, falls if it's in the air, sinks in water), water vehicle (doesn't go on land, falls out of the air, and sinks in water), a hovercraft (goes on land, falls if it's in the air, floats on water), an airplane-type flight vehicle (strafing and rise/sink disabled, falls if its velocity is too low), or a helicopter-type flight vehicle (can strafe and rise or sink, and hovers). You will be able to attach any kind of actor to it! I can't wait...

29 Jan 2007

In 30 minutes last night, I made a pickup with similar functionality to the CRYSIS nanotech suit. Like the original nanosuit, it regenerates health. It has four modes: Strength (doubles your damage), Speed (Multiplies your speeds by 1.5 and doubles your JumpZ), Health (regenerates 2 points health per second instead of 1), and Cloak (invisibility). I was going to do an Armor mode, which would give the player 1 point armor per second AND 2 points health per second, but I could only figure out how to do that if the player already had armor, so I made it a simple health mode instead. I'm going to re-do this in the near future. I made the nanosuit re-skin the player with the UT shield-belt textures, so it looked like the player was wearing fancy force-fields or armor. The problem with that is, you can't tell what team someone's on if they are wearing the nanosuit! I'm going to fix this tonight.

28 Jan 2007

Over the weekend...

STICKY GRENADE LAUNCHER!!!

Fire: launches a grenade with a 10-second time limit. If it hits a player, it will attach to the player and beep once every second. This gives people a fair warning if they are going to be suicide-bombed.

Alt Fire: launches a grenade that sticks to anything that isn't alive, and blows up when it touches something alive&amp;ndash;like a trip mine. To be fair, you can shoot these trip mines apart (though they have 50 health), and you can pick them up with the gravity gun. You can then either throw them at your enemies or touch another mine with it to sweep up both of them.

Berserker pack

Doom fans will recognize this. It is basically a subclass of UDamage that increases your damage, doubles your ground, water, and air speeds, and triples your jump height for 30 seconds. (Please let me know if that sounds too long.)

Classic Portal Gun

This portal gun works more like the original weapon from Portal. The Portals are instant-hit, and you can manage each one separately: fire is a blue portal, alt fire is an orange one. They look surprisingly like the original portals except that you can't see through them (but I'm working on that.)

24 Jan 2007

I finally got my gravity guns to work properly. They include angular velocity calculations, as I said, so you can pick up people with the Enhanced Gravity Gun and smash them on the ground. :-)

I also finished a rather unusual weapon. I call it the &quot;Energy Disc&quot;. the launcher is basically the UT razorjack, but the disc is special. Here's how it works:
 -You only get one disc. If it has been fired, you can't fire again until you get it back.
 -Primary fire causes the disc to collect energy from anything it can. It will drain 20 points of health 
  from anything that has health. If it hits a wall, it returns to you.
 -You can power up the disc this way to 400 points energy. If you fire the disc into a hazard,
  it will instantly gain full power.
 -Alt fire causes the disc to give all its energy to anything it hits that can take damage.
  At power levels above 200, the disc will cause a shockwave each time it hits a wall.
  The disc will return to you after you hit someone or if it bounces off more than two walls.
 -The disc is about five times as fast as the razor blade, to make up for the fact that you get only one.

The Splinter Machine was overpowered and the bots couldn't use it, so I scrapped it in favor of this one.

19 Jan 2007

I decided to recode all my weapons, using my own code in routines copied out of TournamentWeapon. Now, they work and can be picked up properly.

I also decided to work on a gravity gun because I haven't made a melee weapon to go with all my other weapons. At first, I wanted it to pick up and throw objects around, but there isn't that much to throw in any of the original UT maps, so I thought about allowing it to pick up and throw players. Well, that isn't so good in a map like Facing Worlds. Therefore, I decided that it will be able to pick up and throw only Decorations, Movers, and Projectiles. (I want it to be able to throw the flags in CTF around too.) Primary fire picks up an object, and alt fire throws it. I decided to make alt fire deal some damage if the object is close enough. That way, it can be used as a melee weapon that bots can use too.

There will also be an &quot;Enhanced Gravity Gun&quot; which has all the capabilities of the basic version, but it can also pick up and throw people! So you can throw them off the asteroid in Facing Worlds, or just smack them into a wall somewhere. If you aim it at level geometry, you can pick YOURSELF up and swing around that  point. There are some rudimentary angular velocity calculations so you can do some Spider-Man-like tricks with it. This version will be like the InstaGib rifle: it will have its own special mutator, and will not appear in any maps as a pickup, because it's just too powerful of a weapon.

I also got my mutator to work properly. Now, if you use it, you start out with a Dispersion Pistol, a Portal Gun, and a Gravity Gun.

18 Jan 2007

Funny thing I just noticed about my weapons. The ones that are 'from scratch' (Subclasses of TournamentWeapon') never become pickup items! You can't kill someone and take their SRME, Nemesis, Quad Shot, Portal Gun, etc. Is there special code for making an item become a pickup? And where is it implemented?

Sticky grenade launcher anyone? That's my WIP right now.

17 Jan 2007

I DID IT! UT now has a fully functional Portal Gun! It works basically the same as the original gun from VALVe's game &quot;Portal&quot;, but there are a few differences which I implemented because what I did was really the easiest way I knew. Here are some specs:

Fire: Launch up to two Portals. These portals are automatically connected to each other. If you try firing more than two portals, the gun won't do anything.

Alt Fire: Clean up all your existing portals.
   Portals will stick to any solid surface (not movers or barrels), and they will also stick to players. For example, you can fire one portal, stick it to an enemy, then fire the other into a hazard. He will be teleported into the hazard. Perhaps a better way to handle that would be to fire one portal into the hazard FIRST, then shoot your enemy, then clean up, because you can teleport to a portal while it is flying. If portals contact a teleporter or WarpZone, they will become locked in a dimensional paradox loop: The teleporter or WarpZone will try to teleport the Portal at the same time as the Portal is trying to teleport the Teleporter. This is resolved by an immense release of energy and the destruction of the portal.
   Portals can teleport players, barrels, and projectiles. Of course, if you fire the Shock Rifle at a portal, it won't teleport the beam because that's a hitscan attack.
   This gun does not take ammunition. It cannot rapid fire. Projectile speed is supposed to be 10000 units per second. It is impossible to fire a portal into a space that is too small to fit in, because the portal has the same collision box as a player.
   Now, I'm trying to make a mutator where the player starts off with a portal gun instead of a translocator, AND a sidearm which is not the enforcer. Anyone can help?

16 Jan 2007

Gave the Unreal Quadshot some code. It now works like a real shotgun. Its stopping power, sound, and firing modes led me to name it the &quot;Anti-Son-Of-A-Bitch machine.&quot;
 Fire: A single 12-gauge shotgun shell. 20 pellets, good accuracy, 5 points damage per pellet. If you blow this in someone's face, it will turn them into bloody hunks of meat.
 Alt Fire: Four shells, one after the other, auto-shotgun style. I need some help on this part because overuse of the alt fire causes the gun to, ahem, jam. After that, you can't even switch weapons, but you have to wait around and die before you can use your trigger finger again. WHY IS THIS HAPPENING!

Everything before this point does not have a precise date. Some of my other weapons to this point:

Air Cannon: this weapon is only meant to knock people around and stop them from firing at you.
 Fire: harmless shockwave with a huge momentum transfer. You can rocket jump about 100 feet with it.
 Alt fire: shockwave that causes a concussion, but has no momentum transfer.

Splinter Machine: a U238 powered weapon, replaces the Flak Cannon. Bots don't know how to use it because both firing modes can spin up. This weapon has no killing power of its own: you can't hurt someone by shooting them with it. It relies on a small fission explosion to create shrapnel out of anything it hits, which then does some serious damage. It doesn't work with humans because human splinters just can't do enough damage.
 Fire: Launches a fast-moving activated U238 pellet, of variable size. It explodes on contact. One unit of ammo yields a moderately annoying blast. Ten units yields one twice the size of a hand grenade.
 Alt Fire: Launches a similar pellet, but it bounces around corners until it hits a player. Same blast statistics as for the other pellet.

Flechette Cannon: If you like watching people stuck full of darts, twitching, screaming, and bleeding all over the place, this is your favorite weapon.
 Fire: Launches toxic darts minigun-style. Each dart does a total of 10 points damage, 2 points at a time. I was so proud of myself when I got the darts to stick in players realistically.
 Alt Fire: Launches 10 darts, shotgun style.

NEMESIS: my replacement for the Redeemer. I can't make my own models for UT because gmax development has been discontinued, but I wanted a model that made it obvious this gun was fusion powered.
 Fire: Sprays out explosive energy packets. One is enough to kill a person, but this sprays 10 at a time. Makes for a really nice explosion noise.
 Alt Fire: Launches a slow-moving energy grenade whose explosion is comparable to the Redeemer shell (actually, it's twice as big, but the shell is twice as easy to hit), and sprays out 20 energy packets.

Shrink Ray/Microwave Expander: Hail to the chief, baby. A friend of mine suggested that I code a weapon similar to the one(s) from Duke Nukem, so I did.
 Fire: projectile shrinks your enemy for 30 seconds and ensures that his health stays far enough down that you can jump on him and smash him...if you can jump high enough. Unfortunately, I wasn't able to change the player's collision cylinder.
 Alt Fire: projectile attaches to player, inflating him over the course of 10 seconds, at the end of which, he explodes.

Dispersion Pistol: I needed my own sidearm to go with all the weapons I'm making, so this was it. When I ported it from Unreal, I thought it didn't seem like such a good idea to put weapon power-ups in a map. Therefore, I made all five power levels accessible by holding down the trigger. Unfortunately, this means that Bots don't like it.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2526</id>
      <timestamp>2008-01-29T21:53:08Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Words of wisdom===

Any map named &quot;Battle Arena&quot; is doomed to fail. Historically, mappers have decided to call their maps &quot;Battle Arena&quot; if there is no cover and no good weapon or health placement, because then a deathmatch turns into a confused mess on the ground floor. Single player battle arenas are just as confusing and pointless: usually a large, open map full of monsters. Anyone who makes a map called &quot;Battle Arena&quot; deserves to be smashed against the skybox with my new Enhanced Gravity Gun.

===Developer Journal===

29 Jan 2007

In 30 minutes last night, I made a pickup with similar functionality to the CRYSIS nanotech suit. Like the original nanosuit, it regenerates health. It has four modes: Strength (doubles your damage), Speed (Multiplies your speeds by 1.5 and doubles your JumpZ), Health (regenerates 2 points health per second instead of 1), and Cloak (invisibility). I was going to do an Armor mode, which would give the player 1 point armor per second AND 2 points health per second, but I could only figure out how to do that if the player already had armor, so I made it a simple health mode instead. I'm going to re-do this in the near future. I made the nanosuit re-skin the player with the UT shield-belt textures, so it looked like the player was wearing fancy force-fields or armor. The problem with that is, you can't tell what team someone's on if they are wearing the nanosuit! I'm going to fix this tonight.

28 Jan 2007

Over the weekend...

STICKY GRENADE LAUNCHER!!!

Fire: launches a grenade with a 10-second time limit. If it hits a player, it will attach to the player and beep once every second. This gives people a fair warning if they are going to be suicide-bombed.

Alt Fire: launches a grenade that sticks to anything that isn't alive, and blows up when it touches something alive&amp;ndash;like a trip mine. To be fair, you can shoot these trip mines apart (though they have 50 health), and you can pick them up with the gravity gun. You can then either throw them at your enemies or touch another mine with it to sweep up both of them.

Berserker pack

Doom fans will recognize this. It is basically a subclass of UDamage that increases your damage, doubles your ground, water, and air speeds, and triples your jump height for 30 seconds. (Please let me know if that sounds too long.)

Classic Portal Gun

This portal gun works more like the original weapon from Portal. The Portals are instant-hit, and you can manage each one separately: fire is a blue portal, alt fire is an orange one. They look surprisingly like the original portals except that you can't see through them (but I'm working on that.)

24 Jan 2007

I finally got my gravity guns to work properly. They include angular velocity calculations, as I said, so you can pick up people with the Enhanced Gravity Gun and smash them on the ground. :-)

I also finished a rather unusual weapon. I call it the &quot;Energy Disc&quot;. the launcher is basically the UT razorjack, but the disc is special. Here's how it works:
 -You only get one disc. If it has been fired, you can't fire again until you get it back.
 -Primary fire causes the disc to collect energy from anything it can. It will drain 20 points of health 
  from anything that has health. If it hits a wall, it returns to you.
 -You can power up the disc this way to 400 points energy. If you fire the disc into a hazard,
  it will instantly gain full power.
 -Alt fire causes the disc to give all its energy to anything it hits that can take damage.
  At power levels above 200, the disc will cause a shockwave each time it hits a wall.
  The disc will return to you after you hit someone or if it bounces off more than two walls.
 -The disc is about five times as fast as the razor blade, to make up for the fact that you get only one.

The Splinter Machine was overpowered and the bots couldn't use it, so I scrapped it in favor of this one.

19 Jan 2007

I decided to recode all my weapons, using my own code in routines copied out of TournamentWeapon. Now, they work and can be picked up properly.

I also decided to work on a gravity gun because I haven't made a melee weapon to go with all my other weapons. At first, I wanted it to pick up and throw objects around, but there isn't that much to throw in any of the original UT maps, so I thought about allowing it to pick up and throw players. Well, that isn't so good in a map like Facing Worlds. Therefore, I decided that it will be able to pick up and throw only Decorations, Movers, and Projectiles. (I want it to be able to throw the flags in CTF around too.) Primary fire picks up an object, and alt fire throws it. I decided to make alt fire deal some damage if the object is close enough. That way, it can be used as a melee weapon that bots can use too.

There will also be an &quot;Enhanced Gravity Gun&quot; which has all the capabilities of the basic version, but it can also pick up and throw people! So you can throw them off the asteroid in Facing Worlds, or just smack them into a wall somewhere. If you aim it at level geometry, you can pick YOURSELF up and swing around that  point. There are some rudimentary angular velocity calculations so you can do some Spider-Man-like tricks with it. This version will be like the InstaGib rifle: it will have its own special mutator, and will not appear in any maps as a pickup, because it's just too powerful of a weapon.

I also got my mutator to work properly. Now, if you use it, you start out with a Dispersion Pistol, a Portal Gun, and a Gravity Gun.

18 Jan 2007

Funny thing I just noticed about my weapons. The ones that are 'from scratch' (Subclasses of TournamentWeapon') never become pickup items! You can't kill someone and take their SRME, Nemesis, Quad Shot, Portal Gun, etc. Is there special code for making an item become a pickup? And where is it implemented?

Sticky grenade launcher anyone? That's my WIP right now.

17 Jan 2007

I DID IT! UT now has a fully functional Portal Gun! It works basically the same as the original gun from VALVe's game &quot;Portal&quot;, but there are a few differences which I implemented because what I did was really the easiest way I knew. Here are some specs:

Fire: Launch up to two Portals. These portals are automatically connected to each other. If you try firing more than two portals, the gun won't do anything.

Alt Fire: Clean up all your existing portals.
   Portals will stick to any solid surface (not movers or barrels), and they will also stick to players. For example, you can fire one portal, stick it to an enemy, then fire the other into a hazard. He will be teleported into the hazard. Perhaps a better way to handle that would be to fire one portal into the hazard FIRST, then shoot your enemy, then clean up, because you can teleport to a portal while it is flying. If portals contact a teleporter or WarpZone, they will become locked in a dimensional paradox loop: The teleporter or WarpZone will try to teleport the Portal at the same time as the Portal is trying to teleport the Teleporter. This is resolved by an immense release of energy and the destruction of the portal.
   Portals can teleport players, barrels, and projectiles. Of course, if you fire the Shock Rifle at a portal, it won't teleport the beam because that's a hitscan attack.
   This gun does not take ammunition. It cannot rapid fire. Projectile speed is supposed to be 10000 units per second. It is impossible to fire a portal into a space that is too small to fit in, because the portal has the same collision box as a player.
   Now, I'm trying to make a mutator where the player starts off with a portal gun instead of a translocator, AND a sidearm which is not the enforcer. Anyone can help?

16 Jan 2007

Gave the Unreal Quadshot some code. It now works like a real shotgun. Its stopping power, sound, and firing modes led me to name it the &quot;Anti-Son-Of-A-Bitch machine.&quot;
 Fire: A single 12-gauge shotgun shell. 20 pellets, good accuracy, 5 points damage per pellet. If you blow this in someone's face, it will turn them into bloody hunks of meat.
 Alt Fire: Four shells, one after the other, auto-shotgun style. I need some help on this part because overuse of the alt fire causes the gun to, ahem, jam. After that, you can't even switch weapons, but you have to wait around and die before you can use your trigger finger again. WHY IS THIS HAPPENING!

Everything before this point does not have a precise date. Some of my other weapons to this point:

Air Cannon: this weapon is only meant to knock people around and stop them from firing at you.
 Fire: harmless shockwave with a huge momentum transfer. You can rocket jump about 100 feet with it.
 Alt fire: shockwave that causes a concussion, but has no momentum transfer.

Splinter Machine: a U238 powered weapon, replaces the Flak Cannon. Bots don't know how to use it because both firing modes can spin up. This weapon has no killing power of its own: you can't hurt someone by shooting them with it. It relies on a small fission explosion to create shrapnel out of anything it hits, which then does some serious damage. It doesn't work with humans because human splinters just can't do enough damage.
 Fire: Launches a fast-moving activated U238 pellet, of variable size. It explodes on contact. One unit of ammo yields a moderately annoying blast. Ten units yields one twice the size of a hand grenade.
 Alt Fire: Launches a similar pellet, but it bounces around corners until it hits a player. Same blast statistics as for the other pellet.

Flechette Cannon: If you like watching people stuck full of darts, twitching, screaming, and bleeding all over the place, this is your favorite weapon.
 Fire: Launches toxic darts minigun-style. Each dart does a total of 10 points damage, 2 points at a time. I was so proud of myself when I got the darts to stick in players realistically.
 Alt Fire: Launches 10 darts, shotgun style.

NEMESIS: my replacement for the Redeemer. I can't make my own models for UT because gmax development has been discontinued, but I wanted a model that made it obvious this gun was fusion powered.
 Fire: Sprays out explosive energy packets. One is enough to kill a person, but this sprays 10 at a time. Makes for a really nice explosion noise.
 Alt Fire: Launches a slow-moving energy grenade whose explosion is comparable to the Redeemer shell (actually, it's twice as big, but the shell is twice as easy to hit), and sprays out 20 energy packets.

Shrink Ray/Microwave Expander: Hail to the chief, baby. A friend of mine suggested that I code a weapon similar to the one(s) from Duke Nukem, so I did.
 Fire: projectile shrinks your enemy for 30 seconds and ensures that his health stays far enough down that you can jump on him and smash him...if you can jump high enough. Unfortunately, I wasn't able to change the player's collision cylinder.
 Alt Fire: projectile attaches to player, inflating him over the course of 10 seconds, at the end of which, he explodes.

Dispersion Pistol: I needed my own sidearm to go with all the weapons I'm making, so this was it. When I ported it from Unreal, I thought it didn't seem like such a good idea to put weapon power-ups in a map. Therefore, I made all five power levels accessible by holding down the trigger. Unfortunately, this means that Bots don't like it.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Computing Visibility</title>
    <id>818</id>
    <revision>
      <id>2302</id>
      <timestamp>2005-12-29T03:11:40Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When a Level is being Built, it has to know how Lights will bounce off objects, what makes a shadow, etc. Computing Visibility is the step where the Engine looks at all of the Lights, makes note of the shapes around them, and creates shadows, bright spots, etc. as necessary. This is the third major step for Levels, as without it, your levels would be awfully dark. :)

==Discussion==

'''inio:''' I thought Computing Visibility was when the engine built the node visibility lists for each BSP partition.  It then uses this information to do optimize the number of lights it has to consider for each surface.

'''Foxpaw:''' I think that UnrealEd 3 also does some of the lightmap calculations during this phase.

'''Dark Pulse:''' Well as I had stated when I typed the first revision, I wasn't totally sure if I was correct or not. I know it's something along those lines though.

----</text>
    </revision>
    <revision>
      <id>2303</id>
      <timestamp>2003-07-03T00:05:48Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Computing visibility===

When a Level is being Built, it has to know how Lights will bounce off objects, what makes a shadow, etc. Computing Visibility is the step where the Engine looks at all of the Lights, makes note of the shapes around them, and creates shadows, bright spots, etc. as necessary. This is the third major step for Levels, as without it, your levels would be awfully dark. :)

----

'''inio:''' I thought Computing Visibility was when the engine built the node visibility lists for each BSP partition.  It then uses this information to do optimize the number of lights it has to consider for each surface.

'''Foxpaw:''' I think that UnrealEd 3 also does some of the lightmap calculations during this phase.

'''Dark Pulse:''' Well as I had stated when I typed the first revision, I wasn't totally sure if I was correct or not. I know it's something along those lines though.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConEdit</title>
    <id>841</id>
    <revision>
      <id>2350</id>
      <timestamp>2008-03-07T20:12:20Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Deus Ex|Deus Ex]] Conversation Editor.

This comes with the SDK, and allows you to define new [[Legacy:Conversation|Conversation]]s for your levels.

It generates files in a proprietary .CON format by [[Legacy:Ion Storm|Ion Storm]], much of which gets compiled into the DeusExConText [[Legacy:Package|package]].

The resulting package looks like a whole mess of raw Conversation and child objects, how these are arranged, and how the game decides to associate Conversations with Actors, I don't know.

==Reverse Engineering ==

Since the compiler &quot;mangles&quot; the format somewhat to get it into a [[Legacy:Package|package]], you can't just extract the raw .CON file back out again.

I've been playing with extracting the raw object contents into an XML file, and this has proven promising.

It ''may'' be possible to write something that converts this exported text file (or maybe a raw Unreal object) into a .CON file, but we'd have to figure out the file format (Any takers?).

==Discussion==

'''Xhiris:''' Does this belong in Category Application?  It only does the one thing, and only for this game.  I think of it more as a part of the SDK than it's own thing, thoughts?

'''Tarquin:''' it still counts as a program that does stuff :) Won't hurt to list it in that category. There are other apps that are highly specialised too.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2351</id>
      <timestamp>2004-01-28T02:09:09Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Deus Ex|Deus Ex]] Conversation Editor.

This comes with the SDK, and allows you to define new [[Legacy:Conversation|Conversation]]s for your levels.

It generates files in a proprietary .CON format by [[Legacy:Ion Storm|Ion Storm]], much of which gets compiled into the DeusExConText package.

The resulting package looks like a whole mess of raw Conversation and child objects, how these are arranged, and how the game decides to associate Conversations with Actors, I don't know.

==Reverse Engineering ==

Since the compiler &quot;mangles&quot; the format somewhat to get it into a [[Legacy:Package|package]], you can't just extract the raw .CON file back out again.

I've been playing with extracting the raw object contents into an XML file, and this has proven promising.

It ''may'' be possible to write something that converts this exported text file (or maybe a raw Unreal object) into a .CON file, but we'd have to figure out the file format (Any takers?).

----

'''Xhiris:''' Does this belong in Category Application?  It only does the one thing, and only for this game.  I think of it more as a part of the SDK than it's own thing, thoughts?</text>
    </revision>
    <revision>
      <id>2352</id>
      <timestamp>2004-01-28T11:49:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Deus Ex|Deus Ex]] Conversation Editor.

This comes with the SDK, and allows you to define new [[Legacy:Conversation|Conversation]]s for your levels.

It generates files in a proprietary .CON format by [[Legacy:Ion Storm|Ion Storm]], much of which gets compiled into the DeusExConText [[Legacy:Package|package]].

The resulting package looks like a whole mess of raw Conversation and child objects, how these are arranged, and how the game decides to associate Conversations with Actors, I don't know.

==Reverse Engineering ==

Since the compiler &quot;mangles&quot; the format somewhat to get it into a [[Legacy:Package|package]], you can't just extract the raw .CON file back out again.

I've been playing with extracting the raw object contents into an XML file, and this has proven promising.

It ''may'' be possible to write something that converts this exported text file (or maybe a raw Unreal object) into a .CON file, but we'd have to figure out the file format (Any takers?).

----

'''Xhiris:''' Does this belong in Category Application?  It only does the one thing, and only for this game.  I think of it more as a part of the SDK than it's own thing, thoughts?

'''Tarquin:''' it still counts as a program that does stuff :) Won't hurt to list it in that category. There are other apps that are highly specialised too.</text>
    </revision>
    <revision>
      <id>2353</id>
      <timestamp>2008-03-07T20:11:47Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Deus Ex|Deus Ex]] Conversation Editor.

This comes with the SDK, and allows you to define new [[Legacy:Conversation|Conversation]]s for your levels.

It generates files in a proprietary .CON format by [[Legacy:Ion Storm|Ion Storm]], much of which gets compiled into the DeusExConText [[Legacy:Package|package]].

The resulting package looks like a whole mess of raw Conversation and child objects, how these are arranged, and how the game decides to associate Conversations with Actors, I don't know.

==Reverse Engineering ==

Since the compiler &quot;mangles&quot; the format somewhat to get it into a [[Legacy:Package|package]], you can't just extract the raw .CON file back out again.

I've been playing with extracting the raw object contents into an XML file, and this has proven promising.

It ''may'' be possible to write something that converts this exported text file (or maybe a raw Unreal object) into a .CON file, but we'd have to figure out the file format (Any takers?).

==Discussion==

'''Xhiris:''' Does this belong in Category Application?  It only does the one thing, and only for this game.  I think of it more as a part of the SDK than it's own thing, thoughts?

'''Tarquin:''' it still counts as a program that does stuff :) Won't hurt to list it in that category. There are other apps that are highly specialised too.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConTEXT</title>
    <id>790</id>
    <revision>
      <id>2238</id>
      <timestamp>2007-07-01T16:15:57Z</timestamp>
      <contributor>
        <ip>Wetering.xs4all.nl</ip>
      </contributor>
      <comment>Fixed link to Context website</comment>
      <text xml:space="preserve">[[Image:Legacy_ConTEXT.gif|right|]]

ConTEXT is a small, fast and powerful [[Legacy:Text Editor|text editor]], developed mainly to serve as secondary tool for software developers.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealScript|Syntax highlight file for UnrealScript]] 

; Homepage : http://www.context.cx/

==Features ==
* unlimited open files
* unlimited editing file size, 4kB line length
* powerful syntax highlighting for:
** C/C++
** Delphi/Pascal
** Java
** Java Script
** Visual Basic
** Perl/CGI
** HTML
** SQL
** FoxPro
** 80x86 assembler
** Python
** PHP
** Tcl/Tk
** powerful custom defined syntax highlighter
* multilanguage support (supported languages: English, German, French, Croatian, Chinese, Czech, Danish, Dutch, Estonian, Esperanto, Spanish, Galego, Italian, Hungarian, Portuguese (Brazil), Russian, Slovakian, Polish, Lithuanian, Latvian, Slovenian, Turkish)
* project workspaces support
* unicode UTF8 support
* code templates
* customizable help files for each file type
* file explorer with favorites list
* export to HTML/RTF
* conversion DOS-&gt;UNIX-&gt;Macintosh file formats
* editing position remembering across files
* macro recorder
* commenting/uncommenting code
* text sort
* normal and columnar text selection
* bookmarks
* find and replace text in all open files
* C/Java-style block auto indent/outdent
* customizable color printing with print preview
* exporting configuration stored in registry
* customizable syntax highlighting colors, cursor shapes, right margin, gutter, line spacing...
* user definable execution keys, depending on file type
* capturing console applications standard output
* compiler output parser for positioning on error line
* powerful command line handler
* install and uninstall
* minimize to system tray

----

'''El Muerte TDS:''' I'm considering to replace my [[Legacy:EditPlus|EditPlus]] with this editor, it looks promising.

'''SabbathCat:''' The fact that it's free is a bonus for people who can't afford to shell out for the other programs once th'ey hit their 30 days. Also, the neat &quot;Save to HTML&quot; feature is cool if you want to put up your code on a website without having to format the code with colour by hand. Very cool. :)

'''Bob_The_Beheader:''' Ok one major problem (for me at least) is that it doesn't line wrap when cutting and pasting. When you are typing, it line wraps by inserting \n\r (returns) Also, the tab button does not cause indenting a consistant length.

'''MythOpus:''' Keep in mind that the tabbing and other settings are all at their defaults when you first install the program.  To make the program have consistant tab lengths go to environment variables, then deselect 'smart tabs', change the tabbing from 'tab to spaces' to 'hard tabs' and then set the tab length accordingly.  I've used ConTEXT for a very very long time and the only problems I've had with it are the occasional graphics glitch but it may not even be the program itself causing it.  This program also supports batch file execution which means it can automate the process of deleting .u files and recompiling them again.  All in all, I think this is the greatest text editor out there.  But that might just be me.

'''Ambershee:''' I don't know. I personally find that Notepad++ is just a hell of a lot more organised and easy to use. ConTEXT doesn't seem to have any features over it that would warrant its use.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2239</id>
      <timestamp>2007-06-26T15:39:39Z</timestamp>
      <contributor>
        <ip>Ambershee</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_ConTEXT.gif|right|]]

ConTEXT is a small, fast and powerful [[Legacy:Text Editor|text editor]], developed mainly to serve as secondary tool for software developers.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealScript|Syntax highlight file for UnrealScript]] 

; Homepage : http://www.fixedsys.com/context/

==Features ==
* unlimited open files
* unlimited editing file size, 4kB line length
* powerful syntax highlighting for:
** C/C++
** Delphi/Pascal
** Java
** Java Script
** Visual Basic
** Perl/CGI
** HTML
** SQL
** FoxPro
** 80x86 assembler
** Python
** PHP
** Tcl/Tk
** powerful custom defined syntax highlighter
* multilanguage support (supported languages: English, German, French, Croatian, Chinese, Czech, Danish, Dutch, Estonian, Esperanto, Spanish, Galego, Italian, Hungarian, Portuguese (Brazil), Russian, Slovakian, Polish, Lithuanian, Latvian, Slovenian, Turkish)
* project workspaces support
* unicode UTF8 support
* code templates
* customizable help files for each file type
* file explorer with favorites list
* export to HTML/RTF
* conversion DOS-&gt;UNIX-&gt;Macintosh file formats
* editing position remembering across files
* macro recorder
* commenting/uncommenting code
* text sort
* normal and columnar text selection
* bookmarks
* find and replace text in all open files
* C/Java-style block auto indent/outdent
* customizable color printing with print preview
* exporting configuration stored in registry
* customizable syntax highlighting colors, cursor shapes, right margin, gutter, line spacing...
* user definable execution keys, depending on file type
* capturing console applications standard output
* compiler output parser for positioning on error line
* powerful command line handler
* install and uninstall
* minimize to system tray

----

'''El Muerte TDS:''' I'm considering to replace my [[Legacy:EditPlus|EditPlus]] with this editor, it looks promising.

'''SabbathCat:''' The fact that it's free is a bonus for people who can't afford to shell out for the other programs once th'ey hit their 30 days. Also, the neat &quot;Save to HTML&quot; feature is cool if you want to put up your code on a website without having to format the code with colour by hand. Very cool. :)

'''Bob_The_Beheader:''' Ok one major problem (for me at least) is that it doesn't line wrap when cutting and pasting. When you are typing, it line wraps by inserting \n\r (returns) Also, the tab button does not cause indenting a consistant length.

'''MythOpus:''' Keep in mind that the tabbing and other settings are all at their defaults when you first install the program.  To make the program have consistant tab lengths go to environment variables, then deselect 'smart tabs', change the tabbing from 'tab to spaces' to 'hard tabs' and then set the tab length accordingly.  I've used ConTEXT for a very very long time and the only problems I've had with it are the occasional graphics glitch but it may not even be the program itself causing it.  This program also supports batch file execution which means it can automate the process of deleting .u files and recompiling them again.  All in all, I think this is the greatest text editor out there.  But that might just be me.

'''Ambershee:''' I don't know. I personally find that Notepad++ is just a hell of a lot more organised and easy to use. ConTEXT doesn't seem to have any features over it that would warrant its use.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConTEXT/UnrealScript</title>
    <id>791</id>
    <revision>
      <id>2240</id>
      <timestamp>2007-06-18T13:22:55Z</timestamp>
      <contributor>
        <ip>Cpe.atm2-0-1041193.0x50a63582.bynxx14.customer.tele.dk</ip>
      </contributor>
      <minor/>
      <comment>* Added delegate keyword</comment>
      <text xml:space="preserve">Copy paste the contents to a file, name it UScript.chl (or something) and put it in the ''Highlighters'' directory of ConTEXT.

See [[Legacy:UnrealScript Keywords|UnrealScript Keywords]] for a full list of UnrealScript keywords.

&lt;uscript&gt;
// Language name (user language name)
Language:            UnrealScript

// default file filter
// note: if more than one extension is associated, eg:
// C/C++ files (*.c,*.cpp,*.h,*.hpp)|*.c;*.cpp;*.h;*.hpp
Filter:                 UnrealScript (*.uc)|*.uc

// help file which will be invokend when F1 is pressed
HelpFile:

// language case sensitivity
//                   0  - no
//                   1  - yes
CaseSensitive:       0

// comment type:
// LineComment - comment to the end of line
// BlockCommentBeg - block comment begin, it could be multiline
// BlockCommentEnd - block comment end
LineComment:         //
BlockCommentBeg:     /*
BlockCommentEnd:     */

// identifier characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// IdentifierBegChar - Identifier begin characters
IdentifierBegChars:  a..z A..Z _
IdentifierChars:     a..z A..Z _ 0..9

// numeric constants begin characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// number always starts with 0..9 except when NumConstBeg
// defines other
NumConstBegChars:    0..9

// numeric constants characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// number always starts with 0..9 except when NumConstBeg
// defines other
NumConstChars:       0..9 .abcdefhABCDEFH

// escape character
EscapeChar:          \

// keyword table
// note: delimited with spaces, lines could be wrapped
// you may divide keywords into tree groups which can be
// highlighted differently
KeyWords1:

abstract
array
arraycount
assert
auto
bool
break
byte
case
class
coerce
collapsecategories
config
const
continue
default
defaultproperties
delegate
dependson
deprecated
do
dontcollapsecategories
edfindable
editconst
editinline
editinlinenew
editinlinenotify
editinlineuse
else
enum
enumcount
event
exec
expands
export
exportstructs
extends
false
final
float
for
foreach
function
global
globalconfig
goto
guid
hidecategories
if
ignores
import
input
insert
int
intrinsic
iterator
latent
length
local
localized
name
native
nativereplication
new
noexport
none
noteditinlinenew
notplaceable
nousercreate
operator
optional
out
perobjectconfig
placeable
pointer
postoperator
preoperator
private
protected
reliable
remove
replication
return
safereplace
self
showcategories
simulated
singular
skip
state
static
stop
string
struct
super
switch
transient
travel
true
unreliable
until
var
while
within


//KeyWords2:
//KeyWords3:

// string delimiter:
// StringBegChar - string begin char
// StringEndChar - string end char
// MultilineStrings - enables multiline strings,
// as perl has it
StringBegChar:       &quot;
StringEndChar:       &quot;
MultilineStrings:    0

// use preprocessor:
// 0 - no
// 1 - yes
// note: if yes, '#' and statements after it will be
// highlighted with Preprocessor defined colors
UsePreprocessor:     1

// highlight line:
// 0 - no
// 1 - yes
// note: if yes, current line will be highlighted
CurrLineHighlighted:    0

// colors
// note:             first value is foreground, second is
//                   background color
//                     and third (optional) is font attribute:
//                     B - bold
//                     I - italic
//                     U - underline
//                     S - strike out
//                     attributes can be combined: eg. B or BI
//                   as value, it could be used any standard
//                   windows color:
//                     clBlack, clMaroon, clGreen, clOlive,
//                     clNavy, clPurple, clTeal, clGray,
//                     clSilver, clRed, clLime, clYellow,
//                     clBlue, clFuchsia, clAqua, clLtGray,
//                     clDkGray, clWhite, clScrollBar,
//                     clBackground, clActiveCaption,
//                     clInactiveCaption, clMenu, clWindow,
//                     clWindowFrame, clMenuText, clWindowText,
//                     clCaptionText, clActiveBorder,
//                     clInactiveBorder, clAppWorkSpace,
//                     clHighlight, clHighlightText, clBtnFace,
//                     clBtnShadow, clGrayText, lBtnText,
//                     clInactiveCaptionText, clBtnHighlight,
//                     cl3DDkShadow, cl3DLight, clInfoText,
//                     clInfoBk
//                   as value, it could be used hex numeric
//                   constant too:
//                     $BBGGRR - BB: blue, GG: green, RR: red,
//                               eg: $FF6A00
SpaceCol:               clWindowText clWindow
Keyword1Col:            clBlue clWindow B
Keyword2Col:            clPurple clWindow
Keyword3Col:            $004080FF clWindow
IdentifierCol:          clWindowText clWindow
CommentCol:             clGreen clWindow
NumberCol:              clFuchsia clWindow
StringCol:              clFuchsia clWindow
SymbolCol:              clBlack clWindow
PreprocessorCol:        $0000C000 clWindow I
SelectionCol:           clWhite clNavy

// If CurrLineHighlighted: 1
CurrentLineCol:         clBlack clYellow

OverrideTxtFgColor:     0
BlockAutoindent:        1
BlockBegStr:            {
BlockEndStr:            }
MatchedBracesCol:       clWindowText clWindow
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>2241</id>
      <timestamp>2003-07-21T10:06:17Z</timestamp>
      <contributor>
        <ip>Inktomi1-lee.server.ntl.com</ip>
      </contributor>
      <text xml:space="preserve">Copy paste the contents to a file, name it UScript.chl (or something) and put it in the ''Highlighters'' of ConTEXT

This highlighter definition is not really complete, I think.

----

Why don't we put in a page all the official keywords of unrealscript ??? A sort of official list.

&lt;uscript&gt;
// Language name (user language name)
Language:            UnrealScript

// default file filter
// note: if more than one extension is associated, eg:
// C/C++ files (*.c,*.cpp,*.h,*.hpp)|*.c;*.cpp;*.h;*.hpp
Filter:                 UnrealScript (*.uc)|*.uc

// help file which will be invokend when F1 is pressed
HelpFile:

// language case sensitivity
//                   0  - no
//                   1  - yes
CaseSensitive:       0

// comment type:
// LineComment - comment to the end of line
// BlockCommentBeg - block comment begin, it could be multiline
// BlockCommentEnd - block comment end
LineComment:         //
BlockCommentBeg:     /*
BlockCommentEnd:     */

// identifier characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// IdentifierBegChar - Identifier begin characters
IdentifierBegChars:  a..z A..Z _
IdentifierChars:     a..z A..Z _ 0..9

// numeric constants begin characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// number always starts with 0..9 except when NumConstBeg
// defines other
NumConstBegChars:    0..9

// numeric constants characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// number always starts with 0..9 except when NumConstBeg
// defines other
NumConstChars:       0..9 .abcdefhABCDEFH

// escape character
EscapeChar:          \

// keyword table
// note: delimited with spaces, lines could be wrapped
// you may divide keywords into tree groups which can be
// highlighted differently
KeyWords1:

abstract
array
arraycount
assert
auto
bool
break
byte
case
class
coerce
collapsecategories
config
const
continue
default
defaultproperties
dependson
deprecated
do
dontcollapsecategories
edfindable
editconst
editinline
editinlinenew
editinlinenotify
editinlineuse
else
enum
enumcount
event
exec
//expands     -- ut2k3 doesn't allow it, and reports errors, USE extends
export
exportstructs
extends
false
final
float
for
foreach
function
global
globalconfig
goto
guid
hidecategories
if
ignores
import
input
insert
int
intrinsic
iterator
latent
length
local
localized
name
native
nativereplication
new
noexport
none
noteditinlinenew
notplaceable
nousercreate
operator
optional
out
perobjectconfig
placeable
pointer
postoperator
preoperator
private
protected
reliable
remove
replication
return
safereplace
self
showcategories
simulated
singular
skip
state
static
stop
string
struct
super
switch
transient
travel
true
unreliable
until
var
while
within


//KeyWords2:
//KeyWords3:

// string delimiter:
// StringBegChar - string begin char
// StringEndChar - string end char
// MultilineStrings - enables multiline strings,
// as perl has it
StringBegChar:       &quot;
StringEndChar:       &quot;
MultilineStrings:    0

// use preprocessor:
// 0 - no
// 1 - yes
// note: if yes, '#' and statements after it will be
// highlighted with Preprocessor defined colors
UsePreprocessor:     1

// highlight line:
// 0 - no
// 1 - yes
// note: if yes, current line will be highlighted
CurrLineHighlighted:    0

// colors
// note:             first value is foreground, second is
//                   background color
//                     and third (optional) is font attribute:
//                     B - bold
//                     I - italic
//                     U - underline
//                     S - strike out
//                     attributes can be combined: eg. B or BI
//                   as value, it could be used any standard
//                   windows color:
//                     clBlack, clMaroon, clGreen, clOlive,
//                     clNavy, clPurple, clTeal, clGray,
//                     clSilver, clRed, clLime, clYellow,
//                     clBlue, clFuchsia, clAqua, clLtGray,
//                     clDkGray, clWhite, clScrollBar,
//                     clBackground, clActiveCaption,
//                     clInactiveCaption, clMenu, clWindow,
//                     clWindowFrame, clMenuText, clWindowText,
//                     clCaptionText, clActiveBorder,
//                     clInactiveBorder, clAppWorkSpace,
//                     clHighlight, clHighlightText, clBtnFace,
//                     clBtnShadow, clGrayText, lBtnText,
//                     clInactiveCaptionText, clBtnHighlight,
//                     cl3DDkShadow, cl3DLight, clInfoText,
//                     clInfoBk
//                   as value, it could be used hex numeric
//                   constant too:
//                     $BBGGRR - BB: blue, GG: green, RR: red,
//                               eg: $FF6A00
SpaceCol:               clWindowText clWindow
Keyword1Col:            clBlue clWindow B
Keyword2Col:            clPurple clWindow
Keyword3Col:            $004080FF clWindow
IdentifierCol:          clWindowText clWindow
CommentCol:             clGreen clWindow
NumberCol:              clFuchsia clWindow
StringCol:              clFuchsia clWindow
SymbolCol:              clBlack clWindow
PreprocessorCol:        $0000C000 clWindow I
SelectionCol:           clWhite clNavy

// If CurrLineHighlighted: 1
CurrentLineCol:         clBlack clYellow

OverrideTxtFgColor:     0
BlockAutoindent:        1
BlockBegStr:            {
BlockEndStr:            }
MatchedBracesCol:       clWindowText clWindow
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>2242</id>
      <timestamp>2003-08-10T23:03:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Copy paste the contents to a file, name it UScript.chl (or something) and put it in the ''Highlighters'' directory of ConTEXT.

See [[Legacy:UnrealScript Keywords|UnrealScript Keywords]] for a full list of UnrealScript keywords.

&lt;uscript&gt;
// Language name (user language name)
Language:            UnrealScript

// default file filter
// note: if more than one extension is associated, eg:
// C/C++ files (*.c,*.cpp,*.h,*.hpp)|*.c;*.cpp;*.h;*.hpp
Filter:                 UnrealScript (*.uc)|*.uc

// help file which will be invokend when F1 is pressed
HelpFile:

// language case sensitivity
//                   0  - no
//                   1  - yes
CaseSensitive:       0

// comment type:
// LineComment - comment to the end of line
// BlockCommentBeg - block comment begin, it could be multiline
// BlockCommentEnd - block comment end
LineComment:         //
BlockCommentBeg:     /*
BlockCommentEnd:     */

// identifier characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// IdentifierBegChar - Identifier begin characters
IdentifierBegChars:  a..z A..Z _
IdentifierChars:     a..z A..Z _ 0..9

// numeric constants begin characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// number always starts with 0..9 except when NumConstBeg
// defines other
NumConstBegChars:    0..9

// numeric constants characters
// note: characters shouldn't be delimited, except arrays
// array of chars could be defined as from_char..to_char
// number always starts with 0..9 except when NumConstBeg
// defines other
NumConstChars:       0..9 .abcdefhABCDEFH

// escape character
EscapeChar:          \

// keyword table
// note: delimited with spaces, lines could be wrapped
// you may divide keywords into tree groups which can be
// highlighted differently
KeyWords1:

abstract
array
arraycount
assert
auto
bool
break
byte
case
class
coerce
collapsecategories
config
const
continue
default
defaultproperties
dependson
deprecated
do
dontcollapsecategories
edfindable
editconst
editinline
editinlinenew
editinlinenotify
editinlineuse
else
enum
enumcount
event
exec
expands
export
exportstructs
extends
false
final
float
for
foreach
function
global
globalconfig
goto
guid
hidecategories
if
ignores
import
input
insert
int
intrinsic
iterator
latent
length
local
localized
name
native
nativereplication
new
noexport
none
noteditinlinenew
notplaceable
nousercreate
operator
optional
out
perobjectconfig
placeable
pointer
postoperator
preoperator
private
protected
reliable
remove
replication
return
safereplace
self
showcategories
simulated
singular
skip
state
static
stop
string
struct
super
switch
transient
travel
true
unreliable
until
var
while
within


//KeyWords2:
//KeyWords3:

// string delimiter:
// StringBegChar - string begin char
// StringEndChar - string end char
// MultilineStrings - enables multiline strings,
// as perl has it
StringBegChar:       &quot;
StringEndChar:       &quot;
MultilineStrings:    0

// use preprocessor:
// 0 - no
// 1 - yes
// note: if yes, '#' and statements after it will be
// highlighted with Preprocessor defined colors
UsePreprocessor:     1

// highlight line:
// 0 - no
// 1 - yes
// note: if yes, current line will be highlighted
CurrLineHighlighted:    0

// colors
// note:             first value is foreground, second is
//                   background color
//                     and third (optional) is font attribute:
//                     B - bold
//                     I - italic
//                     U - underline
//                     S - strike out
//                     attributes can be combined: eg. B or BI
//                   as value, it could be used any standard
//                   windows color:
//                     clBlack, clMaroon, clGreen, clOlive,
//                     clNavy, clPurple, clTeal, clGray,
//                     clSilver, clRed, clLime, clYellow,
//                     clBlue, clFuchsia, clAqua, clLtGray,
//                     clDkGray, clWhite, clScrollBar,
//                     clBackground, clActiveCaption,
//                     clInactiveCaption, clMenu, clWindow,
//                     clWindowFrame, clMenuText, clWindowText,
//                     clCaptionText, clActiveBorder,
//                     clInactiveBorder, clAppWorkSpace,
//                     clHighlight, clHighlightText, clBtnFace,
//                     clBtnShadow, clGrayText, lBtnText,
//                     clInactiveCaptionText, clBtnHighlight,
//                     cl3DDkShadow, cl3DLight, clInfoText,
//                     clInfoBk
//                   as value, it could be used hex numeric
//                   constant too:
//                     $BBGGRR - BB: blue, GG: green, RR: red,
//                               eg: $FF6A00
SpaceCol:               clWindowText clWindow
Keyword1Col:            clBlue clWindow B
Keyword2Col:            clPurple clWindow
Keyword3Col:            $004080FF clWindow
IdentifierCol:          clWindowText clWindow
CommentCol:             clGreen clWindow
NumberCol:              clFuchsia clWindow
StringCol:              clFuchsia clWindow
SymbolCol:              clBlack clWindow
PreprocessorCol:        $0000C000 clWindow I
SelectionCol:           clWhite clNavy

// If CurrLineHighlighted: 1
CurrentLineCol:         clBlack clYellow

OverrideTxtFgColor:     0
BlockAutoindent:        1
BlockBegStr:            {
BlockEndStr:            }
MatchedBracesCol:       clWindowText clWindow
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConeBuilder</title>
    <id>880</id>
    <revision>
      <id>2440</id>
      <timestamp>2004-07-22T04:46:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; ConeBuilder (Package: Editor)}}

This creates a Cone for the editor's [[Legacy:Red Builder Brush|red builder brush]]. 

==Properties==
; Height : the height of the cone
; CapHeight : only matters when hollow, it is the height of the hollow part (from the bottom of the cone going up)
; OuterRadius : the radius of the cone. Note that if you want a 256 [[Legacy:UU|UU]] wide cone you must fill in 128
; InnerRadius : only matters when hollow, it's the radius of the hollow part
; Sides : the number of points you want at the round part. The more you add the rounder it looks, but the game goes slower if you add too many.
; GroupName : the name of the group you want it in, but seems to do nothing, because the group name doesn't change.
; AlignToSide : changes the texture alignments.
; Hollow : makes it hollow or not. When it's hollow, it's open at the bottom of the cone

==Alignment tips==

To make the cone nicely aligned, choose the align to floor. With some textures it isn't nice around the cone if you have the same texture there. To make it better you can add trims around it to camoflage the difference. I think the align to floor is the best way.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Conebuilder</title>
    <id>876</id>
    <revision>
      <id>2431</id>
      <timestamp>2004-07-22T04:45:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:ConeBuilder|ConeBuilder]]</text>
    </revision>
    <revision>
      <id>2432</id>
      <timestamp>2004-07-21T17:15:22Z</timestamp>
      <contributor>
        <ip>Buu</ip>
      </contributor>
      <text xml:space="preserve">This creates a Cone for the editor's [[Legacy:Brushbuilders|brushbuilders]]. 

==Properties==
*Height - the height of the cone
*CapHeight - only matters when hollow, it is the height of the hollow part (from the bottom of the cone going up)
*Outer Radius - the radius of the cone. Note that if you want a 256 [[Legacy:UU|UU]] wide cone you must fill in 128
*Inner Radiuw - only matters when hollow, it's the radius of the hollow part
*Sides - the number of points you want at the round part. The more you add the rounder it looks, but the game goes slower if you add too many.
*Group name - the name of the group you want it in, but seems to do nothing, because the group name doesn't change.
*Align to Side - changes the texture alignments.
*Hollow - makes it hollow or not. When it's hollow, it's open at the bottom of the cone

==Alignment tips==

To make the cone nicely aligned, choose the align to floor. With some textures it isn't nice around the cone if you have the same texture there. To make it better you can add trims around it to camoflage the difference. I think the align to floor is the best way.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Config Vars And .Ini Files</title>
    <id>726</id>
    <revision>
      <id>2093</id>
      <timestamp>2006-11-26T13:36:23Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Suggestion for cleaning up this page.</comment>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

See [[Legacy:DataObject|DataObject]].

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox| ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same was as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)

'''Fyfe:''' [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]] already have their own pages. I suggest stripping out the sections of [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]], then move [[Legacy:Save Games|Save Games]] to it's own page. Each page can then link back to each other in the related topics section.

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Contains more info than the page title describes.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2094</id>
      <timestamp>2006-04-07T07:53:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

SavePackage is the most complex, most difficult to set up, but most powerful of the saving and loading methods. You can do some limited loading using this suite of functions, and you can even do so when it's needed, which may make it a better choice than .Ini Files if you are storing a very large amount of data that is scarcely needed every time the engine starts. (Like the player profiles in the single player game, for instance.) Once the data is loaded, however, it cannot be reloaded even if the package on disk changes.

Using the SavePackage suite is also the most secure of the methods. A package created with SavePackage is compressed, so it cannot be easily read by humans, though with enough effort and knowlege about the system it uses a person could likely still access the data.

'''''I'll finish this up later, there's lots to write about savepackage.'''''

'''Daid303:''' SavePackage is also usefull to store data without having the avage user access to the real data. I use it in my mod for example to keep track of earnd points.

I have a very simple class like this:

&lt;USCRIPT&gt;

class UMS_PointHolder extends Object;

var() int Points;

defaultproperties

{

	Points=0

}&lt;/USCRIPT&gt;

And this code in my playercontroller, the function SavePoints is called whenever the user changes from map OR opens the menu and presses disconnect, I haven't found a way yet to intersept the 'disconnect' console command.

&lt;USCRIPT&gt;

var UMS_PointHolder PointHolder;

simulated function SavePoints()

{

	if (ExtraPoints == 0)

		return;

	if (PointHolder == None)

		GetPointHolder();

	PointHolder.Points += ExtraPoints;

	ExtraPoints = 0;

	GetEntryLevel().Game.SavePackage(&quot;UMS_Saved_Data&quot;);

}

function GetPointHolder()

{

	PointHolder = GetEntryLevel().Game.LoadDataObject(class'UMS_PointHolder', &quot;pointholder&quot;, &quot;UMS_Saved_Data&quot;);

	if (PointHolder == None)

	{

		PointHolder = GetEntryLevel().Game.CreateDataObject(class'UMS_PointHolder', &quot;pointholder&quot;, &quot;UMS_Saved_Data&quot;);

		PointHolder.Points = 0; //make sure nobody has messed with the default props.

	}

}&lt;/USCRIPT&gt;I don't do it every time the points get updated because it generates a entry in the log every time you save, and whrites to the HD, very speed inefficent.

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox| ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same was as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)</text>
    </revision>
    <revision>
      <id>2095</id>
      <timestamp>2006-11-26T13:27:18Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Pointed SavePackage to DataObject</comment>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

See [[Legacy:DataObject|DataObject]].

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox| ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same was as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Contains more info than the page title describes.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32934</id>
      <timestamp>2008-08-30T18:33:39Z</timestamp>
      <contributor>
        <username>Ajrad</username>
        <id>1254</id>
      </contributor>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

See [[Legacy:DataObject|DataObject]].

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox| ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same was as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)

'''Fyfe:''' [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]] already have their own pages. I suggest stripping out the sections of [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]], then move [[Legacy:Save Games|Save Games]] to it's own page. Each page can then link back to each other in the related topics section.

'''AJRAD:''' This may sound a bit stupid to you, but how do you decide where configs are stored (client or server)? Because I've seen clientside inis obviously (e.g. user.ini), but whenever I make config variable they always save on the server only.

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Contains more info than the page title describes.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33936</id>
      <timestamp>2009-01-15T22:55:20Z</timestamp>
      <contributor>
        <ip>72.0.44.44</ip>
      </contributor>
      <comment>/* Localized Strings */ fixed typo (was -&gt; way)</comment>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

See [[Legacy:DataObject|DataObject]].

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox| ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same way as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)

'''Fyfe:''' [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]] already have their own pages. I suggest stripping out the sections of [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]], then move [[Legacy:Save Games|Save Games]] to it's own page. Each page can then link back to each other in the related topics section.

'''AJRAD:''' This may sound a bit stupid to you, but how do you decide where configs are stored (client or server)? Because I've seen clientside inis obviously (e.g. user.ini), but whenever I make config variable they always save on the server only.

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Contains more info than the page title describes.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35365</id>
      <timestamp>2009-08-26T07:00:45Z</timestamp>
      <contributor>
        <ip>99.132.168.5</ip>
      </contributor>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

See [[Legacy:DataObject|DataObject]].

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox| ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same way as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)

'''Fyfe:''' [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]] already have their own pages. I suggest stripping out the sections of [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]], then move [[Legacy:Save Games|Save Games]] to it's own page. Each page can then link back to each other in the related topics section.

'''AJRAD:''' This may sound a bit stupid to you, but how do you decide where configs are stored (client or server)? Because I've seen clientside inis obviously (e.g. user.ini), but whenever I make config variable they always save on the server only.

'''Seditious:''' Test for whether you're on the server or client and only run code that calls SaveConfig() on the client, unless you need the class to govern things that the admin will want to configure on the server. Just put things that absolutely must be clientside in blocks that start with if (Level.NetMode != NM_DedicatedServer). See [[Legacy:NetMode|Legacy:NetMode]].

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Contains more info than the page title describes.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35366</id>
      <timestamp>2009-08-26T08:11:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Saved Games */ formatting syntax fix</comment>
      <text xml:space="preserve">Often it is desireable to preserve the output of a program after it has terminated. Other times, it may be desirable to be able to read external files for user settings, etcetera. Games, of course, are no different. Unfortunately, [[Legacy:UnrealScript|UnrealScript]]s file system functions are somewhat limited. There are no file streams or other sorts of low-level file interaction, but you can usually still do what you want within the constraints of the file system functions that are availible.

==Write-Only and Read-Write Operations==

There are several reasons why one might want to write to the hard drive from within [[Legacy:UnrealScript|UnrealScript]]. The most common, of course, is for logging and debugging, but data is also often written to the hard drive for later recovery by some reading function. There are three known ways to write data to the hard drive: the [[Legacy:Log File|log file]], config variables/ini files, and the savepackage suite of functions.

===Config Variables and .Ini Files===

.Ini files are the closest to a two way (read/write) operation that Unrealscript can perform. .Ini files are read when the class they are associated with is first loaded. After that, they can only be written to, but the values from their reading remains in memory. .Ini files are very closely tied to config variables, and they work by changing the default properties of those variables. For instance, if you have a string that is a config variable, and you change it's value in the .Ini file, it's default value for that string will have updated when that class' package is next loaded. This is a very good method of having settings persist on something that has only one instance.

Writing to an .ini file is a two-step process, but it is simple to do. First, you must set the value of the variables you wish to write to disk. Usually if you are using .ini files to create persistant settings this will likely already be done. Once that is done, simply have your class call either the [[Legacy:Function Syntax|native final]] '''SaveConfig()''' or [[Legacy:Function Syntax|native static final]] '''StaticSaveConfig()''', defined in [[Legacy:Object|Object]].  SaveConfig() will write the contents of all the config variables in the instance of the class you call it from to the .Ini file assigned to that class. This defaults to User.Ini, but can be changed in the class declaration. (See [[Legacy:Class Syntax|Class Syntax]]) StaticSaveConfig() is similar to SaveConfig(), but instead saves the default values of the config variables to disk.

Note that every subclass will have it's own version of the config variables stored in the .Ini file. If you want all subclasses to share the same persistent value, you should declare your variable as '''globalconfig''' instead of '''config'''. See [[Legacy:Variable Syntax|Variable Syntax]].

Also bear in mind that due to the nature of config variables, they will rarely be the same on both server and client. The server also will not automatically replicate it's config variables, unless they are replicated variables, in which case they will be replicated when they change or when a relevant actor replication takes place. See [[Legacy:Replication|Replication]].

There appears to be a limit on the amount of data that can be written to the .Ini file, though it appears to be fairly great. Anything over about a kilobyte of data (such as a large struct) stored in a single variable may not be written properly.

Note also that there is an interesting quirk when saving structs in this way. Members of the struct, will be stored, but members of the struct declared as transient will not be stored. However, not only will they not be stored, but they will be reset to their initialization values when you call SaveConfig() or StaticSaveConfig(). You should back this information up before saving if you do not want it to be lost during the save.

===SavePackage===

See [[Legacy:DataObject|DataObject]].

===Saved Games===

You can save the entire world context via the '''savegame''' console command. The syntax is simple:

{{classbox| savegame ''&lt;number&gt;''}}

Where the number is the number of the saved world state. The &quot;number&quot; of the saved world state determines it's filename on disk, and is required to later restore the world state.

The restore the world state, you &quot;load&quot; it just as you would load a level. Instead of indicating a level name, however, simply load the level:

{{classbox|1= ?load=''&lt;number&gt;''}}

Saving and loading does not work in UT2003, but is an engine feature and should work in other Unreal Engine titles, including UT2004.

==Read-Only Operations==

Read-only operations may not sound as useful, but can in some ways be even more useful for certain applications. These are often referred to as INT files, though there is more to them than they are usually given credit for. There are two main ways to use [[Legacy:INT File|INT file]]s:

===Localized Strings===

Behaving very much like an .Ini file, any string variable may be declared as '''localized''' in the same way as a variable could be declared as a config variable. A localized variable will be loaded from the INT file when the package is first loaded into memory. However, localized strings are tied into the lanugage preference setting in the Unreal Engine, so the INT file is not always used. INT is the ''international'' version of the localized information files. There are numerous other files with different extensions, and the extension indicates which language the file is intended for. If your Unreal Engine is set up for french, the FRT file will be used instead, etc. The INT file is always used as a fallback if there is no file for your language or if the file for your language of choice does not contain a value for a localized string. See [[Legacy:Localization|Localization]].

===Meta Information===

You can read lots of stuff from these and parse it out to get whatever information you need. See [[Legacy:INT File|INT File]].

==Related Topics ==
* [[Legacy:DataObject|DataObject]]
* [[Legacy:PerObjectConfig|PerObjectConfig]]
* [[Legacy:File Format|File Format]]

----

'''Foxpaw:''' This page should probrably be renamed to something more generic about saving and loading data, since it's the page with all the info about various forms of persistent data.

'''Sweavo:''' I agree, and the ini file and savepackage stuff should have a page each (especially while we can't make links to internal anchors)

'''Fyfe:''' [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]] already have their own pages. I suggest stripping out the sections of [[Legacy:DataObject|DataObject]] and [[Legacy:INT File|INT File]], then move [[Legacy:Save Games|Save Games]] to it's own page. Each page can then link back to each other in the related topics section.

'''AJRAD:''' This may sound a bit stupid to you, but how do you decide where configs are stored (client or server)? Because I've seen clientside inis obviously (e.g. user.ini), but whenever I make config variable they always save on the server only.

'''Seditious:''' Test for whether you're on the server or client and only run code that calls SaveConfig() on the client, unless you need the class to govern things that the admin will want to configure on the server. Just put things that absolutely must be clientside in blocks that start with if (Level.NetMode != NM_DedicatedServer). See [[Legacy:NetMode|Legacy:NetMode]].

----

[[:Category:Legacy Refactor Me]] &amp;ndash; Contains more info than the page title describes.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConfigMaster</title>
    <id>784</id>
    <revision>
      <id>2225</id>
      <timestamp>2007-11-18T22:02:19Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; ConfigMaster (ConfigManager)}}

This is a custom class, which is part of the [http://www.organized-evolution.com/ConfigManager/ ConfigManager] for UT2003.

&lt;uscript line&gt;
//-----------------------------------------------------------
// ConfigManager.ConfigMaster version 1.8
// Allows for ServerActors &amp; Mutators to add to PlayInfo
//
// The latest version of ConfigManager is always available at
// http://www.organized-evolution.com/ConfigManager/
//-----------------------------------------------------------

class ConfigMaster extends Mutator DependsOn(AutoLoader) config(ConfigMaster);

// If 2184 or earlier, crash the server
var int						GameVersion;

// Contains previous values of modified IniEntries, unless there is already
// a previous value for an IniEntry.  When a managed loader is de-activated,
// the original value of the IniEntry is restored.
var config array&lt;AutoLoader.IniEntry&gt;	OriginalValues;

// Holder for properties which aren't needed - used by loaders that get activated at the end of the match
var array&lt;Property&gt;			IrrelevantProperties;

struct SA
{
	var class&lt;Info&gt;			SAClass;
	var string				SAName;
	var string				SADescription;
};

struct AL
{
	var class&lt;AutoLoader&gt;	AutoLoaderClass;
	var string				AutoLoaderDesc;
};

var array&lt;SA&gt;				ManagedActors;		// Info about Loaders' ActorClasses
var array&lt;AL&gt;				LoaderClasses;		// All Loader Classes found
var array&lt;AutoLoader&gt;		Loaders;			// Active Loaders
var array&lt;string&gt;			ActiveMutators;		// Currently active mutator classes
var bool					bInitialized;		// Initialization
var bool					bHangRestart;		// Don't let server travel yet

var GameEngine				GE;

const VERSION = 1.71;
const LOGNAME = 'Config Manager';
var const bool	DEBUG;
var const bool 	DEBUGPROPS;

// Localization
var localized string LoadSuccess;
var localized string RequiredVersion;
var localized string UpgradeOrDie;
var localized string RemovalCancelled;

// Errors
var localized string InvalidLoaderClass;
var localized string InvalidPI;

event PreBeginPlay()
{
	GameVersion = int(Level.EngineVersion);

	log(&quot; -&quot;@LOGNAME@VERSION@LoadSuccess,LOGNAME);
	if (GameVersion &lt; 2199)
	{
		log(RequiredVersion@LOGNAME$&quot;.&quot;,LOGNAME);
		log(UpgradeOrDie,LOGNAME);
		log(&quot;&quot;,'ConfigManager');
		Assert(False);
	}

	GetGameEngine();
}

event PostBeginPlay()
{
	local int i;

	if (DEBUG)
	{
		log(class@&quot;Beginning initialization&quot;,'PostBeginPlay');
		log(&quot;START OF GAME SERVERACTORS&quot;,'PostBeginPlay');
		for (i = 0; i &lt; GE.ServerActors.Length; i++)
			log(&quot;ServerActor[&quot;$i$&quot;]:&quot;$GE.ServerActors[i],'PostBeginPlay');

		log(&quot;START OF GAME SERVERPACKAGES&quot;,'PostBeginPlay');
		for (i = 0; i &lt; GE.ServerPackages.Length; i++)
			log(&quot;ServerPackages[&quot;$i$&quot;]:&quot;$GE.ServerPackages[i],'PostBeginPlay');

		log(&quot;&quot;,'PostBeginPlay');
	}
//	Level.Game.AddMutator(&quot;ConfigManagerGUI.ConfigManagerGUIMaster&quot;);

	InitLoaders();
	if (DEBUG)
		log(class@&quot;finished loading all actors and loaders&quot;,'PostBeginPlay');

	Super.PostBeginPlay();
}

// Sends a list of currently active mutators to all loader classes
// Loader classes may want to check if its mutator was loaded without using the loader
// (added at command line, etc.)
function GetGameEngine()
{
	foreach AllObjects(class'Engine.GameEngine', GE)
		break;
}

function AddMutator(Mutator M)
{
	local int i;

	for (i = 0; i &lt; ActiveMutators.Length; i++)
		if (ActiveMutators[i] ~= string(M.Class))
			break;

	if (i == ActiveMutators.Length)
		ActiveMutators[ActiveMutators.Length] = string(M.Class);

	if (DEBUG)
		for (i = 0; i &lt; ActiveMutators.Length; i++)
			log(&quot;ActiveMutators[&quot;$i$&quot;]:&quot;@ActiveMutators[i],'AddMutator');

	Super.AddMutator(M);
}

// Do not show ConfigMaster in server browser as active mutator
function GetServerDetails( out GameInfo.ServerResponseLine ServerState )
{
}

function InitLoaders()
{
	FindAllLoaders();
	CreateLoaders();
}

function FindAllLoaders()
{
	local int i, j;
	local AL TempAL;
	local SA TempSA;

	local class&lt;AutoLoader&gt;	LoaderClass;
	local class&lt;Info&gt;		ServerActorClass;
	local string			LoaderClassName, LoaderClassDescription,
				 			ActorClass, ServerActorName, ServerActorDesc;

	GetNextIntDesc(&quot;ConfigManager.AutoLoader&quot;,0,LoaderClassName,LoaderClassDescription);
	while (LoaderClassName != &quot;&quot;)
	{
		// Hack to prevent Config Loader from being loaded
		if (LoaderClassName ~= &quot;ConfigManagerLoader.SampleLoader&quot;)
		{
			GetNextIntDesc(&quot;ConfigManager.AutoLoader&quot;,++i,LoaderClassName,LoaderClassDescription);
			continue;
		}
		if (DEBUG)
			log(&quot;Found a new AutoLoader:&quot;@LoaderClassName@LoaderClassDescription,'FindAllLoaders');

		LoaderClass = class&lt;AutoLoader&gt;(DynamicLoadObject(LoaderClassName,Class'Class'));
		if (LoaderClass != None)
		{
			if (ShouldAddLoaderClass(LoaderClass))
			{
				TempAL.AutoLoaderClass = LoaderClass;
				TempAL.AutoLoaderDesc = LoaderClassDescription;
				LoaderClasses[LoaderClasses.Length] = TempAL;
				j = -1;
				while (LoaderClass.static.AddManagedActor(j++, ActorClass, ServerActorName, ServerActorDesc))
				{
					if (ActorClass != &quot;&quot; &amp;&amp; ServerActorName != &quot;&quot; &amp;&amp; ServerActorDesc != &quot;&quot;)
					{
						ServerActorClass = class&lt;Info&gt;(DynamicLoadObject(ActorClass,class'Class'));
						if (ServerActorClass != None)
						{
							TempSA.SAClass = ServerActorClass;
							TempSA.SAName = ServerActorName;
							TempSA.SADescription = ServerActorDesc;

							ManagedActors[ManagedActors.Length] = TempSA;
						}
					}
				}
			}
		}
		else Warn(InvalidLoaderClass@LoaderClassName);

		GetNextIntDesc(&quot;ConfigManager.AutoLoader&quot;,++i, LoaderClassName, LoaderClassDescription);
	}

	return;
}

function bool ShouldAddLoaderClass(class&lt;AutoLoader&gt; NewClass)
{
	local int i;

	if (DEBUG)
		log(&quot;Loader Class&quot;@NewClass,'ShouldAddLoaderClass');

	// Don't add if it's already in the list
	for (i = 0;i &lt; LoaderClasses.Length; i++)
		if (LoaderClasses[i].AutoLoaderClass == NewClass)
			return false;

	return true;
}

function CreateLoaders()
{
	local int i;
	local AutoLoader Loader;

	if (DEBUG)
		log(&quot;LoaderClasses&quot;@LoaderClasses.Length,'CreateLoaders');

	for (i = 0;i&lt;LoaderClasses.Length;i++)
	{
		if (ShouldAddLoader(LoaderClasses[i].AutoLoaderClass))
		{
			Loader = AddLoader(LoaderClasses[i].AutoLoaderClass);
			if (Loader != None)
				Loaders[Loaders.Length] = Loader;
		}
	}
}

function bool LoaderNotActive(class&lt;AutoLoader&gt; NewClass)
{
	local int i;

	for (i = 0; i &lt; Loaders.Length; i++)
		if (Loaders[i].Class == NewClass)
			return false;

	return true;
}

function bool ShouldAddLoader(class&lt;AutoLoader&gt; NewClass)
{
	local bool bShouldAdd;

	bShouldAdd = LoaderNotActive(NewClass) &amp;&amp; GE != None;

	if (bShouldAdd)
		bShouldAdd = NewClass.static.CheckStrayActors(GE.GetPropertyText(&quot;ServerActors&quot;)) || NewClass.static.IsActive();

	bShouldAdd = bShouldAdd &amp;&amp; NewClass.static.ValidateLoader();

	if (DEBUG)
		log(NewClass@&quot;will be added:&quot;$bShouldAdd,'ShouldAddLoader');

	return bShouldAdd;
}

function AutoLoader AddLoader(class&lt;AutoLoader&gt; NewClass)
{
	local AutoLoader Loader;
	if (NewClass == None) return None;

	Loader = Spawn(NewClass,Self);
	if (Loader != None &amp;&amp; GE != None)
		Loader.GE = GE;

	if (DEBUG)
		log(&quot;Returning&quot;@Loader,'AddLoader');

	return Loader;
}

// Make sure to remain as Game.BaseMutator.NextMutator so we will know about every mutator that is added.
event Tick(float DeltaTime)
{
	local int i;

	if (bInitialized &amp;&amp; Level != None &amp;&amp; Level.NextURL != &quot;&quot;)
	{
		if (bHangRestart)
			Level.NextSwitchCountdown = 4.0;

		else if (Loaders.Length &gt; 0)
		{
			bHangRestart = True;
			SetTimer(0.2,False);
		}
	}

	// Do not replace BaseMutator, or DMMutator will show up in server browser as an active mutator
	if (Level != None &amp;&amp; Level.Game != None &amp;&amp; Level.Game.BaseMutator != None)
	{
		if (Level.Game.BaseMutator.NextMutator != None)
		{
			if (Level.Game.BaseMutator.NextMutator != Self)
			{
			// Some other ConfigManager as BaseMutator.NextMutator, but it isn't me????
			// Maybe added ConfigManager as a serveractor?
			// Disable or server will crash
				if (!bInitialized &amp;&amp; Level.Game.BaseMutator.NextMutator.Class == Class)
				{
					Destroy();
					return;
				}

				// We have been replaced by another mutator wanting
				// to be the first mutator.
				if (Level.Game.BaseMutator.NextMutator.NextMutator == Self)
				{
					if (NextMutator != None)
						Level.Game.BaseMutator.NextMutator.NextMutator = NextMutator;
					else Level.Game.BaseMutator.NextMutator.NextMutator = None;
				}

				NextMutator = Level.Game.BaseMutator.NextMutator;
				Level.Game.BaseMutator.NextMutator = Self;
			}
		}

		else Level.Game.BaseMutator.NextMutator = Self;
	}

	if (!bInitialized)
	{
		for (i = 0; i &lt; LoaderClasses.Length; i++)
		{
			if (LoaderNotActive(LoaderClasses[i].AutoLoaderClass) &amp;&amp; LoaderClasses[i].AutoLoaderClass.static.CheckCurrentMutators(GetURLOption(&quot;Mutator&quot;)))
			{
				if (DEBUG)
					log(&quot;Adding previously non-active loader&quot;@LoaderClasses[i].AutoLoaderClass,'Tick');
				Loaders[Loaders.Length] = AddLoader(LoaderClasses[i].AutoLoaderClass);
			}
		}

		bInitialized = True;
	}
}

event Timer()
{
	Super.Timer();
	ApplyLoaderSettings();
}

function array&lt;Property&gt; LoadProperties()
{
	local array&lt;Property&gt;	AllProperties;
	local array&lt;class&gt;		RelevantActors;
	local array&lt;string&gt;		RelevantPropNames;
	local class				RelevantClass;
	local Property P;
	local int i, j, k;

	// Build a array of properties which are relevant to the currently loaded loaders
	// so that the amount of time it will take each loader to update their settings will
	// be dramatically reduced -
	// Typical number of Property objects in the game: 200,000
	// Typical number of properties relevant to current loaders: 50


	// Start by first getting a list of actors/objects which will be relevant

	// All ManagedActors are relevant (Loader's ActorClass)
	for (i = 0; i &lt; ManagedActors.Length; i++)
	{
		for (j = 0; j &lt; RelevantActors.Length; j++)
			if (RelevantActors[j] == ManagedActors[i].SAClass)
				break;

		if (j &lt; RelevantActors.Length)
			continue;

		RelevantActors[RelevantActors.Length] = ManagedActors[i].SAClass;
	}

	if (DEBUG)
		log(&quot;Loaders&quot;@LoaderClasses.Length,'LoadProperties');

	for (i = 0; i &lt; LoaderClasses.Length; i++)
	{
		// If ActorClass was already added to list, skip it
		for (j = 0; j &lt; RelevantActors.Length; j++)
			if (string(RelevantActors[j]) ~= LoaderClasses[i].AutoLoaderClass.default.ActorClass)
				break;

		if (j == RelevantActors.Length)
		{
			if (LoaderClasses[i].AutoLoaderClass.default.ActorClass != &quot;&quot;)
				RelevantClass = class(DynamicLoadObject(LoaderClasses[i].AutoLoaderClass.default.ActorClass,class'Class'));

			if (RelevantClass != None)
				RelevantActors[RelevantActors.Length] = RelevantClass;
		}

		// Begin building a list of property names to mark as relevant
		// We'll match these names to the Property.Name variable later when we iterate AllObjects for class'Property'
		for (j = 0; j &lt; LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries.Length; j++)
		{

			for (k = 0; k &lt; RelevantPropNames.Length; k++)
			{
				if (RelevantPropNames[k] == LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].PropName)
					break;
			}

			if ( k == RelevantPropNames.Length )
			{
				RelevantPropNames[RelevantPropNames.Length] = LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].PropName;
				if (DEBUGPROPS)
					log(&quot;Added new Relevant Property Name:&quot;$RelevantPropNames[k],'LoadProperties');
			}

			RelevantClass = class(DynamicLoadObject(LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].ClassFrom,Class'class',True));
			if (RelevantClass == None) continue;

			// Find out if this entry's associated class is already in the relevant actors list
			// If not, add it
			for (k = 0; k &lt; RelevantActors.Length; k++)
			{
				if (DEBUGPROPS)
					log(&quot;Compare&quot;@LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].ClassFrom@&quot;to Relevant Actor&quot;@k$&quot;:&quot;@RelevantActors[k],'LoadProperties');

				if (RelevantActors[k] == RelevantClass)
					break;
			}
			if (DEBUGPROPS)
				log(&quot;Breaking on&quot;@k$&quot;, Total Relevant Actors:&quot;@RelevantActors.Length,'LoadProperties');

			if (k &lt; RelevantActors.Length)
				continue;

			RelevantActors[RelevantActors.Length] = RelevantClass;
			if (DEBUGPROPS)
				log(&quot;Added new relevant actor:&quot;$LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].ClassFrom,'LoadProperties');
		}
	}

	// Finished building relevant actors and relevant names
	// Iterate AllObjects, looking for Property objects
	foreach AllObjects(class'Property', P)
	{
		RelevantClass = None;
		// Some property types should be skipped
		if ( ValidProp(P) )
		{
			if (Class(P.Outer) != None) RelevantClass = Class(P.Outer);
			if (RelevantClass != None)
			{
				for (i = 0; i &lt; RelevantActors.Length; i++)
			 	{
			 		// The Outer variable for properties is the class that the property is contained in
			 		// If this property's Outer is an object that is relevant, add it to the list
			 		if (RelevantClass == RelevantActors[i])
			 		{
			 			for (j = 0; j &lt; RelevantPropNames.Length; j++)
			 				if (RelevantPropNames[j] == string(P.Name))
			 				{
			 					if (DEBUGPROPS)
			 						log(&quot;Adding Initial Relevant Property:&quot;$P.Outer$&quot;.&quot;$P.Name,'LoadProperties');
			 					AllProperties[AllProperties.Length] = P;
			 					break;
			 				}

			 			if (j &lt; RelevantPropNames.Length)
			 				break;
			 		}
			 	}
			}

			// OK, this property's Outer wasn't relevant
			// Check the property against the relevant name list
		 	if (i == RelevantActors.Length)
		 	{
		 		for (i = 0; i &lt; RelevantPropNames.Length; i++)
		 		{
				// If we find a match, then we should check the relevant objects list again,
				// in case the relevant object is a superclass of the property's Outer
		 			if (RelevantPropNames[i] == string(P.Name))
		 			{
						if (DEBUGPROPS)
							log(&quot;Compare Property:&quot;@i@RelevantPropNames[i]@&quot;to&quot;@string(P.Name),'LoadProperties');

		 				for (j = 0; j &lt; RelevantActors.Length; j ++)
		 				{
		 					if (RelevantClass == None) continue;

							if (DEBUGPROPS)
								log(&quot;Relevant Actor Check:&quot;@j@RelevantActors[j]@&quot;is child of&quot;@class(P.Outer)@&quot;:&quot;$ClassIsChildOf(RelevantActors[j],Class(P.Outer)),'LoadProperties');

		 					if (ClassIsChildOf(RelevantActors[j], RelevantClass))
		 					{
		 						if (DEBUGPROPS)
		 							log(&quot;Adding Additional Relevant Property:&quot;$P.Outer$&quot;.&quot;$P.Name,'LoadProperties');

		 						AllProperties[AllProperties.Length] = P;
		 						break;
		 					}
		 				}

		 				if (j &lt; RelevantActors.Length)
		 					break;
		 			}
		 		}
		 	}
		}
	}

	return AllProperties;
}

// Update Properties array with newly loaded loaders
// No longer used
function CheckRelevantProperties(AutoLoader L, out array&lt;Property&gt; Props)
{
	local int i, j;
	local array&lt;class&gt; Classes, Outers;

	local class TempClass;
	local Property P;

	if (DEBUGPROPS) log(&quot;Checking relevant properties for new loader&quot;@L,'CheckRelevantProperties');

	for (i = 0; i &lt; Props.Length; i++)
	{
		TempClass = Class(Props[i].Outer);
		if (TempClass == None) continue;

		for (j = 0; j &lt; Outers.Length; j++)
			if (TempClass == Outers[j])
				break;

		if (j &lt; Outers.Length) continue;

		Outers[Outers.Length] = TempClass;
	}

	if (L.bIncludeServerActor &amp;&amp; L.ActorClass != &quot;&quot;)
	{
		if (DEBUGPROPS) log(&quot;Checking for existence of&quot;@L.ActorClass@&quot;properties&quot;,'CheckRelevantProperties');

		TempClass = class(DynamicLoadObject(L.ActorClass,class'Class',True));
		if (TempClass != None)
		{
			for (i = 0; i &lt; Outers.Length; i++)
				if (TempClass == Outers[i])
					break;

			if (i == Outers.Length)
				Classes[Classes.Length] = TempClass;

			else if (DEBUGPROPS)
				log(TempClass@&quot;has already been added to the properties array.&quot;,'CheckRelevantProperties');
		}
	}

	for (i = 0; i &lt; L.RequiredIniEntries.Length; i++)
	{
		if (DEBUGPROPS) log(&quot;Checking for existence of relevant class&quot;@L.RequiredIniEntries[i].ClassFrom,'CheckRelevantProperties');

		TempClass = class(DynamicLoadObject(L.RequiredIniEntries[i].ClassFrom,class'Class',True));
		if (TempClass != None)
		{
			for (j = 0; j &lt; Classes.Length; j++)
				if (Classes[j] == TempClass) break;

			if (j &lt; Classes.Length) continue;

			for (j = 0; j &lt; Outers.Length; j++)
				if (Outers[j] == TempClass) break;

			if (j &lt; Outers.Length) continue;

			Classes[Classes.Length] = TempClass;
		}
		else if (DEBUGPROPS)
			log(&quot;Could not load RequiredIniEntry[&quot;$i$&quot;].ClassFrom:&quot;@L.RequiredIniEntries[i].ClassFrom,'CheckRelevantProperties');
	}

	if (DEBUGPROPS &amp;&amp; Classes.Length == 0)
		log(&quot;All relevant classes from this loader already existed in properties array&quot;,'CheckRelevantProperties');

	for (i = 0; i &lt; Classes.Length; i++)
	{
		if (DEBUGPROPS)
		{
			log(&quot;&quot;);
			log(&quot;Adding properties from class&quot;@Classes[i]@&quot;to properties array.&quot;,'CheckRelevantProperties');
		}

		for (j = 0; j &lt; IrrelevantProperties.Length; j++)
		{
			P = IrrelevantProperties[j];
			TempClass = Class(P.Outer);

			if (TempClass == None || TempClass != Classes[i]) continue;

			if (DEBUGPROPS) log(&quot;    Adding property&quot;@P.Name,'CheckRelevantProperties');

			Props[Props.Length] = P;
			IrrelevantProperties.Remove(j--, 1);
		}
	}
}

// TODO: Add support for structs
final function bool ValidProp(Property P)
{
	return P.Class != class'ObjectProperty' &amp;&amp;
		   P.Class != class'DelegateProperty' &amp;&amp;
		   P.Class != class'PointerProperty' &amp;&amp;
		   P.Class != class'MapProperty' &amp;&amp;
		   P.Class != class'StructProperty';
}

// Fills PlayInfo for ServerActors
final function CallManagedActorPlayInfo(PlayInfo PI)
{
	local int i, j;

	for (i = 0; i &lt; LoaderClasses.Length; i++)
	{
		if (DEBUG)
			log(&quot;Checking for LoaderClass&quot;@i@&quot;in playinfo:&quot;$loaderclasses[i].autoloaderclass,'ManagedActorFillPlayInfo');

		if (NotInPlayInfo(PI,LoaderClasses[i].AutoLoaderClass))
		{
			if (DEBUG)
				log(&quot;Calling FillPlayInfo() for LoaderClass&quot;@i$&quot;:&quot;$loaderclasses[i].autoloaderclass,'ManagedActorFillPlayInfo');

			LoaderClasses[i].AutoLoaderClass.static.FillPlayInfo(PI);
			PI.PopClass();
		}

		for (j = 0; j &lt; ManagedActors.Length; j++)
		{
			if (LoaderClasses[i].AutoLoaderClass.default.ActorClass != string(ManagedActors[j].SAClass))
				continue;

			if (DEBUG)
				log(&quot;Checking for ManagedActor&quot;@j@&quot;in playinfo:&quot;$ManagedActors[j].SAClass,'ManagedActorFillPlayInfo');

			if (LoaderClasses[i].AutoLoaderClass.static.IsActive())
			{
				ManagedActors[j].SAClass.static.FillPlayInfo(PI);
				PI.PopClass();
			}
		}
	}
}

// Only webadmin calls Mutator.MutatorFillPlayInfo()?
function MutatorFillPlayInfo(PlayInfo PI)
{
	if (DEBUG)
		log(&quot;&quot;);

	if (DEBUG)
		log(&quot;Checking URL Option:&quot;$GetURLOption(&quot;Mutator&quot;),'MutatorFillPlayInfo');

	if (NextMutator != None)
		NextMutator.MutatorFillPlayInfo(PI);

	CallManagedActorPlayInfo(PI);
}

// Allows Loaders to adjust game configuration parameters
// Loaders provide info about which ini changes need to be made for the mod to work
// This allows other programs (such as Ladder) to only include the ini modifications
// which are applicable for the loaded packages
//
// (Ex: ServerActors, ServerPackages, QueryHandlerClasses, Applications)
final function ApplyLoaderSettings()
{
	local int 				i, Index;
	local array&lt;Property&gt;	CurrentProperties;
	local class Temp;

	// Checking for any loaders that have been enabled since last check
	// Otherwise, must wait 2 server restarts to apply new loader settings
	// (One to load loader and apply changes, another for changes to take effect)
	FindAllLoaders();
	CurrentProperties = LoadProperties();
	for ( i = 0; i &lt; LoaderClasses.Length; i++)
	{
		if (DEBUG)
			log(&quot;LoaderClass&quot;@i$&quot;:&quot;@LoaderClasses[i].AutoLoaderClass,'ApplyLoaderSettings');

		if (ShouldAddLoader(LoaderClasses[i].AutoLoaderClass) || (LoaderClasses[i].AutoLoaderClass.static.CheckCurrentMutators(Level.NextURL) &amp;&amp; LoaderClasses[i].AutoLoaderClass.static.ValidateLoader()))
			Loaders[Loaders.Length] = AddLoader(LoaderClasses[i].AutoLoaderClass);

		else if (LoaderNotActive(LoaderClasses[i].AutoLoaderClass))
			AddLoader(LoaderClasses[i].AutoLoaderClass).AcceptRemoval(CurrentProperties);
	}

	if (DEBUGPROPS)
	{
		log(&quot;*** Relevant Property Listing ***&quot;,'ApplyLoaderSettings');
		for (i = 0; i &lt; CurrentProperties.Length;i++)
		{
			if (Class(CurrentProperties[i].Outer) != None &amp;&amp; Temp != Class(CurrentProperties[i].Outer))
			{
				Temp = Class(CurrentProperties[i].Outer);
				log(&quot;&quot;,'ApplyLoaderSettings');
				log(&quot;Relevant properties from class&quot;@Temp@&quot;-&quot;,'ApplyLoaderSettings');
			}
			log(&quot;    &quot;$currentproperties[i].name,'ApplyLoaderSettings');
		}
	}

	while (Index &lt; Loaders.Length)
	{
		if (DEBUG)
			log(&quot;Loader&quot;@Index$&quot;:&quot;@Loaders[Index],'ApplyLoaderSettings');

		if (Loaders[Index].ApplyUpdate())
			Loaders[Index].UpdateConfiguration(CurrentProperties);

		else if (!Loaders[Index].AcceptRemoval(CurrentProperties))
			log(RemovalCancelled@Loaders[Index],'ConfigManager');

		Index++;
	}

	Disable('Tick');
	if (DEBUG)
	{
		log(&quot;&quot;,'ApplyLoaderSettings');
		log(&quot;END OF GAME SERVERACTORS&quot;,'ApplyLoaderSettings');
		for (i = 0; i &lt; GE.ServerActors.Length; i++)
			log(&quot;ServerActor[&quot;$i$&quot;]:&quot;$GE.ServerActors[i],'ApplyLoaderSettings');

		log(&quot;END OF GAME SERVERPACKAGES&quot;,'ApplyLoaderSettings');
		for (i = 0; i &lt; GE.ServerPackages.Length; i++)
			log(&quot;ServerPackages[&quot;$i$&quot;]:&quot;$GE.ServerPackages[i],'ApplyLoaderSettings');

		log(&quot;&quot;,'ApplyLoaderSettings');
	}
}

function bool NotInPlayInfo(PlayInfo PI, class&lt;Info&gt; NewInfo)
{
	local int i;
	if (PI == None)
	{
		Warn(InvalidPI);
		return false;
	}

	for (i=0;i&lt;PI.InfoClasses.Length;i++)
	{
		if (PI.InfoClasses[i] == NewInfo)
			return false;
	}

	return true;
}

function array&lt;string&gt; GetAllManagedActors()
{
	local int i;
	local array&lt;string&gt; Arr;

	for (i = 0; i &lt; LoaderClasses.Length; i++)
		Arr = AddS(Arr,LoaderClasses[i].AutoLoaderClass.static.GetManagedActors());

	return Arr;
}

static final function float GetConfigMasterVersion()
{
	return VERSION;
}

// following function copied from wUtils (El_Muerte[TDS])
static final function array&lt;string&gt; AddS(array&lt;string&gt; A, array&lt;string&gt; B)
{
  local int i;
  for (i = 0; i &lt; B.length; i++)
  {
    A.length = A.length+1;
    A[A.length-1] = B[i];
  }
  return A;
}
&lt;/uscript&gt;
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2226</id>
      <timestamp>2004-05-11T16:55:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>yes</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; ConfigMaster (ConfigManager)}}

This is a custom class, which is part of the [http://www.organized-evolution.com/ConfigManager/ ConfigManager] for UT2003.

&lt;uscript line&gt;
//-----------------------------------------------------------
// ConfigManager.ConfigMaster version 1.8
// Allows for ServerActors &amp; Mutators to add to PlayInfo
//
// The latest version of ConfigManager is always available at
// http://www.organized-evolution.com/ConfigManager/
//-----------------------------------------------------------

class ConfigMaster extends Mutator DependsOn(AutoLoader) config(ConfigMaster);

// If 2184 or earlier, crash the server
var int						GameVersion;

// Contains previous values of modified IniEntries, unless there is already
// a previous value for an IniEntry.  When a managed loader is de-activated,
// the original value of the IniEntry is restored.
var config array&lt;AutoLoader.IniEntry&gt;	OriginalValues;

// Holder for properties which aren't needed - used by loaders that get activated at the end of the match
var array&lt;Property&gt;			IrrelevantProperties;

struct SA
{
	var class&lt;Info&gt;			SAClass;
	var string				SAName;
	var string				SADescription;
};

struct AL
{
	var class&lt;AutoLoader&gt;	AutoLoaderClass;
	var string				AutoLoaderDesc;
};

var array&lt;SA&gt;				ManagedActors;		// Info about Loaders' ActorClasses
var array&lt;AL&gt;				LoaderClasses;		// All Loader Classes found
var array&lt;AutoLoader&gt;		Loaders;			// Active Loaders
var array&lt;string&gt;			ActiveMutators;		// Currently active mutator classes
var bool					bInitialized;		// Initialization
var bool					bHangRestart;		// Don't let server travel yet

var GameEngine				GE;

const VERSION = 1.71;
const LOGNAME = 'Config Manager';
var const bool	DEBUG;
var const bool 	DEBUGPROPS;

// Localization
var localized string LoadSuccess;
var localized string RequiredVersion;
var localized string UpgradeOrDie;
var localized string RemovalCancelled;

// Errors
var localized string InvalidLoaderClass;
var localized string InvalidPI;

event PreBeginPlay()
{
	GameVersion = int(Level.EngineVersion);

	log(&quot; -&quot;@LOGNAME@VERSION@LoadSuccess,LOGNAME);
	if (GameVersion &lt; 2199)
	{
		log(RequiredVersion@LOGNAME$&quot;.&quot;,LOGNAME);
		log(UpgradeOrDie,LOGNAME);
		log(&quot;&quot;,'ConfigManager');
		Assert(False);
	}

	GetGameEngine();
}

event PostBeginPlay()
{
	local int i;

	if (DEBUG)
	{
		log(class@&quot;Beginning initialization&quot;,'PostBeginPlay');
		log(&quot;START OF GAME SERVERACTORS&quot;,'PostBeginPlay');
		for (i = 0; i &lt; GE.ServerActors.Length; i++)
			log(&quot;ServerActor[&quot;$i$&quot;]:&quot;$GE.ServerActors[i],'PostBeginPlay');

		log(&quot;START OF GAME SERVERPACKAGES&quot;,'PostBeginPlay');
		for (i = 0; i &lt; GE.ServerPackages.Length; i++)
			log(&quot;ServerPackages[&quot;$i$&quot;]:&quot;$GE.ServerPackages[i],'PostBeginPlay');

		log(&quot;&quot;,'PostBeginPlay');
	}
//	Level.Game.AddMutator(&quot;ConfigManagerGUI.ConfigManagerGUIMaster&quot;);

	InitLoaders();
	if (DEBUG)
		log(class@&quot;finished loading all actors and loaders&quot;,'PostBeginPlay');

	Super.PostBeginPlay();
}

// Sends a list of currently active mutators to all loader classes
// Loader classes may want to check if its mutator was loaded without using the loader
// (added at command line, etc.)
function GetGameEngine()
{
	foreach AllObjects(class'Engine.GameEngine', GE)
		break;
}

function AddMutator(Mutator M)
{
	local int i;

	for (i = 0; i &lt; ActiveMutators.Length; i++)
		if (ActiveMutators[i] ~= string(M.Class))
			break;

	if (i == ActiveMutators.Length)
		ActiveMutators[ActiveMutators.Length] = string(M.Class);

	if (DEBUG)
		for (i = 0; i &lt; ActiveMutators.Length; i++)
			log(&quot;ActiveMutators[&quot;$i$&quot;]:&quot;@ActiveMutators[i],'AddMutator');

	Super.AddMutator(M);
}

// Do not show ConfigMaster in server browser as active mutator
function GetServerDetails( out GameInfo.ServerResponseLine ServerState )
{
}

function InitLoaders()
{
	FindAllLoaders();
	CreateLoaders();
}

function FindAllLoaders()
{
	local int i, j;
	local AL TempAL;
	local SA TempSA;

	local class&lt;AutoLoader&gt;	LoaderClass;
	local class&lt;Info&gt;		ServerActorClass;
	local string			LoaderClassName, LoaderClassDescription,
				 			ActorClass, ServerActorName, ServerActorDesc;

	GetNextIntDesc(&quot;ConfigManager.AutoLoader&quot;,0,LoaderClassName,LoaderClassDescription);
	while (LoaderClassName != &quot;&quot;)
	{
		// Hack to prevent Config Loader from being loaded
		if (LoaderClassName ~= &quot;ConfigManagerLoader.SampleLoader&quot;)
		{
			GetNextIntDesc(&quot;ConfigManager.AutoLoader&quot;,++i,LoaderClassName,LoaderClassDescription);
			continue;
		}
		if (DEBUG)
			log(&quot;Found a new AutoLoader:&quot;@LoaderClassName@LoaderClassDescription,'FindAllLoaders');

		LoaderClass = class&lt;AutoLoader&gt;(DynamicLoadObject(LoaderClassName,Class'Class'));
		if (LoaderClass != None)
		{
			if (ShouldAddLoaderClass(LoaderClass))
			{
				TempAL.AutoLoaderClass = LoaderClass;
				TempAL.AutoLoaderDesc = LoaderClassDescription;
				LoaderClasses[LoaderClasses.Length] = TempAL;
				j = -1;
				while (LoaderClass.static.AddManagedActor(j++, ActorClass, ServerActorName, ServerActorDesc))
				{
					if (ActorClass != &quot;&quot; &amp;&amp; ServerActorName != &quot;&quot; &amp;&amp; ServerActorDesc != &quot;&quot;)
					{
						ServerActorClass = class&lt;Info&gt;(DynamicLoadObject(ActorClass,class'Class'));
						if (ServerActorClass != None)
						{
							TempSA.SAClass = ServerActorClass;
							TempSA.SAName = ServerActorName;
							TempSA.SADescription = ServerActorDesc;

							ManagedActors[ManagedActors.Length] = TempSA;
						}
					}
				}
			}
		}
		else Warn(InvalidLoaderClass@LoaderClassName);

		GetNextIntDesc(&quot;ConfigManager.AutoLoader&quot;,++i, LoaderClassName, LoaderClassDescription);
	}

	return;
}

function bool ShouldAddLoaderClass(class&lt;AutoLoader&gt; NewClass)
{
	local int i;

	if (DEBUG)
		log(&quot;Loader Class&quot;@NewClass,'ShouldAddLoaderClass');

	// Don't add if it's already in the list
	for (i = 0;i &lt; LoaderClasses.Length; i++)
		if (LoaderClasses[i].AutoLoaderClass == NewClass)
			return false;

	return true;
}

function CreateLoaders()
{
	local int i;
	local AutoLoader Loader;

	if (DEBUG)
		log(&quot;LoaderClasses&quot;@LoaderClasses.Length,'CreateLoaders');

	for (i = 0;i&lt;LoaderClasses.Length;i++)
	{
		if (ShouldAddLoader(LoaderClasses[i].AutoLoaderClass))
		{
			Loader = AddLoader(LoaderClasses[i].AutoLoaderClass);
			if (Loader != None)
				Loaders[Loaders.Length] = Loader;
		}
	}
}

function bool LoaderNotActive(class&lt;AutoLoader&gt; NewClass)
{
	local int i;

	for (i = 0; i &lt; Loaders.Length; i++)
		if (Loaders[i].Class == NewClass)
			return false;

	return true;
}

function bool ShouldAddLoader(class&lt;AutoLoader&gt; NewClass)
{
	local bool bShouldAdd;

	bShouldAdd = LoaderNotActive(NewClass) &amp;&amp; GE != None;

	if (bShouldAdd)
		bShouldAdd = NewClass.static.CheckStrayActors(GE.GetPropertyText(&quot;ServerActors&quot;)) || NewClass.static.IsActive();

	bShouldAdd = bShouldAdd &amp;&amp; NewClass.static.ValidateLoader();

	if (DEBUG)
		log(NewClass@&quot;will be added:&quot;$bShouldAdd,'ShouldAddLoader');

	return bShouldAdd;
}

function AutoLoader AddLoader(class&lt;AutoLoader&gt; NewClass)
{
	local AutoLoader Loader;
	if (NewClass == None) return None;

	Loader = Spawn(NewClass,Self);
	if (Loader != None &amp;&amp; GE != None)
		Loader.GE = GE;

	if (DEBUG)
		log(&quot;Returning&quot;@Loader,'AddLoader');

	return Loader;
}

// Make sure to remain as Game.BaseMutator.NextMutator so we will know about every mutator that is added.
event Tick(float DeltaTime)
{
	local int i;

	if (bInitialized &amp;&amp; Level != None &amp;&amp; Level.NextURL != &quot;&quot;)
	{
		if (bHangRestart)
			Level.NextSwitchCountdown = 4.0;

		else if (Loaders.Length &gt; 0)
		{
			bHangRestart = True;
			SetTimer(0.2,False);
		}
	}

	// Do not replace BaseMutator, or DMMutator will show up in server browser as an active mutator
	if (Level != None &amp;&amp; Level.Game != None &amp;&amp; Level.Game.BaseMutator != None)
	{
		if (Level.Game.BaseMutator.NextMutator != None)
		{
			if (Level.Game.BaseMutator.NextMutator != Self)
			{
			// Some other ConfigManager as BaseMutator.NextMutator, but it isn't me????
			// Maybe added ConfigManager as a serveractor?
			// Disable or server will crash
				if (!bInitialized &amp;&amp; Level.Game.BaseMutator.NextMutator.Class == Class)
				{
					Destroy();
					return;
				}

				// We have been replaced by another mutator wanting
				// to be the first mutator.
				if (Level.Game.BaseMutator.NextMutator.NextMutator == Self)
				{
					if (NextMutator != None)
						Level.Game.BaseMutator.NextMutator.NextMutator = NextMutator;
					else Level.Game.BaseMutator.NextMutator.NextMutator = None;
				}

				NextMutator = Level.Game.BaseMutator.NextMutator;
				Level.Game.BaseMutator.NextMutator = Self;
			}
		}

		else Level.Game.BaseMutator.NextMutator = Self;
	}

	if (!bInitialized)
	{
		for (i = 0; i &lt; LoaderClasses.Length; i++)
		{
			if (LoaderNotActive(LoaderClasses[i].AutoLoaderClass) &amp;&amp; LoaderClasses[i].AutoLoaderClass.static.CheckCurrentMutators(GetURLOption(&quot;Mutator&quot;)))
			{
				if (DEBUG)
					log(&quot;Adding previously non-active loader&quot;@LoaderClasses[i].AutoLoaderClass,'Tick');
				Loaders[Loaders.Length] = AddLoader(LoaderClasses[i].AutoLoaderClass);
			}
		}

		bInitialized = True;
	}
}

event Timer()
{
	Super.Timer();
	ApplyLoaderSettings();
}

function array&lt;Property&gt; LoadProperties()
{
	local array&lt;Property&gt;	AllProperties;
	local array&lt;class&gt;		RelevantActors;
	local array&lt;string&gt;		RelevantPropNames;
	local class				RelevantClass;
	local Property P;
	local int i, j, k;

	// Build a array of properties which are relevant to the currently loaded loaders
	// so that the amount of time it will take each loader to update their settings will
	// be dramatically reduced -
	// Typical number of Property objects in the game: 200,000
	// Typical number of properties relevant to current loaders: 50


	// Start by first getting a list of actors/objects which will be relevant

	// All ManagedActors are relevant (Loader's ActorClass)
	for (i = 0; i &lt; ManagedActors.Length; i++)
	{
		for (j = 0; j &lt; RelevantActors.Length; j++)
			if (RelevantActors[j] == ManagedActors[i].SAClass)
				break;

		if (j &lt; RelevantActors.Length)
			continue;

		RelevantActors[RelevantActors.Length] = ManagedActors[i].SAClass;
	}

	if (DEBUG)
		log(&quot;Loaders&quot;@LoaderClasses.Length,'LoadProperties');

	for (i = 0; i &lt; LoaderClasses.Length; i++)
	{
		// If ActorClass was already added to list, skip it
		for (j = 0; j &lt; RelevantActors.Length; j++)
			if (string(RelevantActors[j]) ~= LoaderClasses[i].AutoLoaderClass.default.ActorClass)
				break;

		if (j == RelevantActors.Length)
		{
			if (LoaderClasses[i].AutoLoaderClass.default.ActorClass != &quot;&quot;)
				RelevantClass = class(DynamicLoadObject(LoaderClasses[i].AutoLoaderClass.default.ActorClass,class'Class'));

			if (RelevantClass != None)
				RelevantActors[RelevantActors.Length] = RelevantClass;
		}

		// Begin building a list of property names to mark as relevant
		// We'll match these names to the Property.Name variable later when we iterate AllObjects for class'Property'
		for (j = 0; j &lt; LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries.Length; j++)
		{

			for (k = 0; k &lt; RelevantPropNames.Length; k++)
			{
				if (RelevantPropNames[k] == LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].PropName)
					break;
			}

			if ( k == RelevantPropNames.Length )
			{
				RelevantPropNames[RelevantPropNames.Length] = LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].PropName;
				if (DEBUGPROPS)
					log(&quot;Added new Relevant Property Name:&quot;$RelevantPropNames[k],'LoadProperties');
			}

			RelevantClass = class(DynamicLoadObject(LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].ClassFrom,Class'class',True));
			if (RelevantClass == None) continue;

			// Find out if this entry's associated class is already in the relevant actors list
			// If not, add it
			for (k = 0; k &lt; RelevantActors.Length; k++)
			{
				if (DEBUGPROPS)
					log(&quot;Compare&quot;@LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].ClassFrom@&quot;to Relevant Actor&quot;@k$&quot;:&quot;@RelevantActors[k],'LoadProperties');

				if (RelevantActors[k] == RelevantClass)
					break;
			}
			if (DEBUGPROPS)
				log(&quot;Breaking on&quot;@k$&quot;, Total Relevant Actors:&quot;@RelevantActors.Length,'LoadProperties');

			if (k &lt; RelevantActors.Length)
				continue;

			RelevantActors[RelevantActors.Length] = RelevantClass;
			if (DEBUGPROPS)
				log(&quot;Added new relevant actor:&quot;$LoaderClasses[i].AutoLoaderClass.default.RequiredIniEntries[j].ClassFrom,'LoadProperties');
		}
	}

	// Finished building relevant actors and relevant names
	// Iterate AllObjects, looking for Property objects
	foreach AllObjects(class'Property', P)
	{
		RelevantClass = None;
		// Some property types should be skipped
		if ( ValidProp(P) )
		{
			if (Class(P.Outer) != None) RelevantClass = Class(P.Outer);
			if (RelevantClass != None)
			{
				for (i = 0; i &lt; RelevantActors.Length; i++)
			 	{
			 		// The Outer variable for properties is the class that the property is contained in
			 		// If this property's Outer is an object that is relevant, add it to the list
			 		if (RelevantClass == RelevantActors[i])
			 		{
			 			for (j = 0; j &lt; RelevantPropNames.Length; j++)
			 				if (RelevantPropNames[j] == string(P.Name))
			 				{
			 					if (DEBUGPROPS)
			 						log(&quot;Adding Initial Relevant Property:&quot;$P.Outer$&quot;.&quot;$P.Name,'LoadProperties');
			 					AllProperties[AllProperties.Length] = P;
			 					break;
			 				}

			 			if (j &lt; RelevantPropNames.Length)
			 				break;
			 		}
			 	}
			}

			// OK, this property's Outer wasn't relevant
			// Check the property against the relevant name list
		 	if (i == RelevantActors.Length)
		 	{
		 		for (i = 0; i &lt; RelevantPropNames.Length; i++)
		 		{
				// If we find a match, then we should check the relevant objects list again,
				// in case the relevant object is a superclass of the property's Outer
		 			if (RelevantPropNames[i] == string(P.Name))
		 			{
						if (DEBUGPROPS)
							log(&quot;Compare Property:&quot;@i@RelevantPropNames[i]@&quot;to&quot;@string(P.Name),'LoadProperties');

		 				for (j = 0; j &lt; RelevantActors.Length; j ++)
		 				{
		 					if (RelevantClass == None) continue;

							if (DEBUGPROPS)
								log(&quot;Relevant Actor Check:&quot;@j@RelevantActors[j]@&quot;is child of&quot;@class(P.Outer)@&quot;:&quot;$ClassIsChildOf(RelevantActors[j],Class(P.Outer)),'LoadProperties');

		 					if (ClassIsChildOf(RelevantActors[j], RelevantClass))
		 					{
		 						if (DEBUGPROPS)
		 							log(&quot;Adding Additional Relevant Property:&quot;$P.Outer$&quot;.&quot;$P.Name,'LoadProperties');

		 						AllProperties[AllProperties.Length] = P;
		 						break;
		 					}
		 				}

		 				if (j &lt; RelevantActors.Length)
		 					break;
		 			}
		 		}
		 	}
		}
	}

	return AllProperties;
}

// Update Properties array with newly loaded loaders
// No longer used
function CheckRelevantProperties(AutoLoader L, out array&lt;Property&gt; Props)
{
	local int i, j;
	local array&lt;class&gt; Classes, Outers;

	local class TempClass;
	local Property P;

	if (DEBUGPROPS) log(&quot;Checking relevant properties for new loader&quot;@L,'CheckRelevantProperties');

	for (i = 0; i &lt; Props.Length; i++)
	{
		TempClass = Class(Props[i].Outer);
		if (TempClass == None) continue;

		for (j = 0; j &lt; Outers.Length; j++)
			if (TempClass == Outers[j])
				break;

		if (j &lt; Outers.Length) continue;

		Outers[Outers.Length] = TempClass;
	}

	if (L.bIncludeServerActor &amp;&amp; L.ActorClass != &quot;&quot;)
	{
		if (DEBUGPROPS) log(&quot;Checking for existence of&quot;@L.ActorClass@&quot;properties&quot;,'CheckRelevantProperties');

		TempClass = class(DynamicLoadObject(L.ActorClass,class'Class',True));
		if (TempClass != None)
		{
			for (i = 0; i &lt; Outers.Length; i++)
				if (TempClass == Outers[i])
					break;

			if (i == Outers.Length)
				Classes[Classes.Length] = TempClass;

			else if (DEBUGPROPS)
				log(TempClass@&quot;has already been added to the properties array.&quot;,'CheckRelevantProperties');
		}
	}

	for (i = 0; i &lt; L.RequiredIniEntries.Length; i++)
	{
		if (DEBUGPROPS) log(&quot;Checking for existence of relevant class&quot;@L.RequiredIniEntries[i].ClassFrom,'CheckRelevantProperties');

		TempClass = class(DynamicLoadObject(L.RequiredIniEntries[i].ClassFrom,class'Class',True));
		if (TempClass != None)
		{
			for (j = 0; j &lt; Classes.Length; j++)
				if (Classes[j] == TempClass) break;

			if (j &lt; Classes.Length) continue;

			for (j = 0; j &lt; Outers.Length; j++)
				if (Outers[j] == TempClass) break;

			if (j &lt; Outers.Length) continue;

			Classes[Classes.Length] = TempClass;
		}
		else if (DEBUGPROPS)
			log(&quot;Could not load RequiredIniEntry[&quot;$i$&quot;].ClassFrom:&quot;@L.RequiredIniEntries[i].ClassFrom,'CheckRelevantProperties');
	}

	if (DEBUGPROPS &amp;&amp; Classes.Length == 0)
		log(&quot;All relevant classes from this loader already existed in properties array&quot;,'CheckRelevantProperties');

	for (i = 0; i &lt; Classes.Length; i++)
	{
		if (DEBUGPROPS)
		{
			log(&quot;&quot;);
			log(&quot;Adding properties from class&quot;@Classes[i]@&quot;to properties array.&quot;,'CheckRelevantProperties');
		}

		for (j = 0; j &lt; IrrelevantProperties.Length; j++)
		{
			P = IrrelevantProperties[j];
			TempClass = Class(P.Outer);

			if (TempClass == None || TempClass != Classes[i]) continue;

			if (DEBUGPROPS) log(&quot;    Adding property&quot;@P.Name,'CheckRelevantProperties');

			Props[Props.Length] = P;
			IrrelevantProperties.Remove(j--, 1);
		}
	}
}

// TODO: Add support for structs
final function bool ValidProp(Property P)
{
	return P.Class != class'ObjectProperty' &amp;&amp;
		   P.Class != class'DelegateProperty' &amp;&amp;
		   P.Class != class'PointerProperty' &amp;&amp;
		   P.Class != class'MapProperty' &amp;&amp;
		   P.Class != class'StructProperty';
}

// Fills PlayInfo for ServerActors
final function CallManagedActorPlayInfo(PlayInfo PI)
{
	local int i, j;

	for (i = 0; i &lt; LoaderClasses.Length; i++)
	{
		if (DEBUG)
			log(&quot;Checking for LoaderClass&quot;@i@&quot;in playinfo:&quot;$loaderclasses[i].autoloaderclass,'ManagedActorFillPlayInfo');

		if (NotInPlayInfo(PI,LoaderClasses[i].AutoLoaderClass))
		{
			if (DEBUG)
				log(&quot;Calling FillPlayInfo() for LoaderClass&quot;@i$&quot;:&quot;$loaderclasses[i].autoloaderclass,'ManagedActorFillPlayInfo');

			LoaderClasses[i].AutoLoaderClass.static.FillPlayInfo(PI);
			PI.PopClass();
		}

		for (j = 0; j &lt; ManagedActors.Length; j++)
		{
			if (LoaderClasses[i].AutoLoaderClass.default.ActorClass != string(ManagedActors[j].SAClass))
				continue;

			if (DEBUG)
				log(&quot;Checking for ManagedActor&quot;@j@&quot;in playinfo:&quot;$ManagedActors[j].SAClass,'ManagedActorFillPlayInfo');

			if (LoaderClasses[i].AutoLoaderClass.static.IsActive())
			{
				ManagedActors[j].SAClass.static.FillPlayInfo(PI);
				PI.PopClass();
			}
		}
	}
}

// Only webadmin calls Mutator.MutatorFillPlayInfo()?
function MutatorFillPlayInfo(PlayInfo PI)
{
	if (DEBUG)
		log(&quot;&quot;);

	if (DEBUG)
		log(&quot;Checking URL Option:&quot;$GetURLOption(&quot;Mutator&quot;),'MutatorFillPlayInfo');

	if (NextMutator != None)
		NextMutator.MutatorFillPlayInfo(PI);

	CallManagedActorPlayInfo(PI);
}

// Allows Loaders to adjust game configuration parameters
// Loaders provide info about which ini changes need to be made for the mod to work
// This allows other programs (such as Ladder) to only include the ini modifications
// which are applicable for the loaded packages
//
// (Ex: ServerActors, ServerPackages, QueryHandlerClasses, Applications)
final function ApplyLoaderSettings()
{
	local int 				i, Index;
	local array&lt;Property&gt;	CurrentProperties;
	local class Temp;

	// Checking for any loaders that have been enabled since last check
	// Otherwise, must wait 2 server restarts to apply new loader settings
	// (One to load loader and apply changes, another for changes to take effect)
	FindAllLoaders();
	CurrentProperties = LoadProperties();
	for ( i = 0; i &lt; LoaderClasses.Length; i++)
	{
		if (DEBUG)
			log(&quot;LoaderClass&quot;@i$&quot;:&quot;@LoaderClasses[i].AutoLoaderClass,'ApplyLoaderSettings');

		if (ShouldAddLoader(LoaderClasses[i].AutoLoaderClass) || (LoaderClasses[i].AutoLoaderClass.static.CheckCurrentMutators(Level.NextURL) &amp;&amp; LoaderClasses[i].AutoLoaderClass.static.ValidateLoader()))
			Loaders[Loaders.Length] = AddLoader(LoaderClasses[i].AutoLoaderClass);

		else if (LoaderNotActive(LoaderClasses[i].AutoLoaderClass))
			AddLoader(LoaderClasses[i].AutoLoaderClass).AcceptRemoval(CurrentProperties);
	}

	if (DEBUGPROPS)
	{
		log(&quot;*** Relevant Property Listing ***&quot;,'ApplyLoaderSettings');
		for (i = 0; i &lt; CurrentProperties.Length;i++)
		{
			if (Class(CurrentProperties[i].Outer) != None &amp;&amp; Temp != Class(CurrentProperties[i].Outer))
			{
				Temp = Class(CurrentProperties[i].Outer);
				log(&quot;&quot;,'ApplyLoaderSettings');
				log(&quot;Relevant properties from class&quot;@Temp@&quot;-&quot;,'ApplyLoaderSettings');
			}
			log(&quot;    &quot;$currentproperties[i].name,'ApplyLoaderSettings');
		}
	}

	while (Index &lt; Loaders.Length)
	{
		if (DEBUG)
			log(&quot;Loader&quot;@Index$&quot;:&quot;@Loaders[Index],'ApplyLoaderSettings');

		if (Loaders[Index].ApplyUpdate())
			Loaders[Index].UpdateConfiguration(CurrentProperties);

		else if (!Loaders[Index].AcceptRemoval(CurrentProperties))
			log(RemovalCancelled@Loaders[Index],'ConfigManager');

		Index++;
	}

	Disable('Tick');
	if (DEBUG)
	{
		log(&quot;&quot;,'ApplyLoaderSettings');
		log(&quot;END OF GAME SERVERACTORS&quot;,'ApplyLoaderSettings');
		for (i = 0; i &lt; GE.ServerActors.Length; i++)
			log(&quot;ServerActor[&quot;$i$&quot;]:&quot;$GE.ServerActors[i],'ApplyLoaderSettings');

		log(&quot;END OF GAME SERVERPACKAGES&quot;,'ApplyLoaderSettings');
		for (i = 0; i &lt; GE.ServerPackages.Length; i++)
			log(&quot;ServerPackages[&quot;$i$&quot;]:&quot;$GE.ServerPackages[i],'ApplyLoaderSettings');

		log(&quot;&quot;,'ApplyLoaderSettings');
	}
}

function bool NotInPlayInfo(PlayInfo PI, class&lt;Info&gt; NewInfo)
{
	local int i;
	if (PI == None)
	{
		Warn(InvalidPI);
		return false;
	}

	for (i=0;i&lt;PI.InfoClasses.Length;i++)
	{
		if (PI.InfoClasses[i] == NewInfo)
			return false;
	}

	return true;
}

function array&lt;string&gt; GetAllManagedActors()
{
	local int i;
	local array&lt;string&gt; Arr;

	for (i = 0; i &lt; LoaderClasses.Length; i++)
		Arr = AddS(Arr,LoaderClasses[i].AutoLoaderClass.static.GetManagedActors());

	return Arr;
}

static final function float GetConfigMasterVersion()
{
	return VERSION;
}

// following function copied from wUtils (El_Muerte[TDS])
static final function array&lt;string&gt; AddS(array&lt;string&gt; A, array&lt;string&gt; B)
{
  local int i;
  for (i = 0; i &lt; B.length; i++)
  {
    A.length = A.length+1;
    A[A.length-1] = B[i];
  }
  return A;
}
&lt;/uscript&gt;
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Configurable Weapon Lockers</title>
    <id>924</id>
    <revision>
      <id>2527</id>
      <timestamp>2008-02-09T03:35:28Z</timestamp>
      <contributor>
        <ip>Pool-72-91-195-28.tampfl.fios.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Configurable Weapon Lockers are placeable actors designed for UT3.

Configurable Weapon Lockers are meant to address two main issues:

1. Because Epic decided that Weapons Throw was an &quot;exploit&quot; in UT3, Configurable Weapon Lockers are meant to replace any weapon factories in a map. Configurable Weapon Lockers can allow a player to restock ammunition as weapon pickups (with weaponstay on) did in previous UT games.

2. UT3's stock weapon lockers automatically fill any weapons they give to the player up to a defined &quot;Locker&quot; ammo amount, which cannot be adjusted. Configurable Weapon Lockers instead fill a weapon up only to the normal pickup amount, and a mapper can specify if they would like the locker to also grant additional ammunition over that amount.

I would like to add some more features to Configurable Weapon Lockers to make them even better. In particular, I would like to add team-specific cWeapon Lockers, and (regarding function #1) a check to see if the player has the designated weapon currently drawn before adding additional ammunition. Possibly more features as requested.

&lt;uscript&gt;
/***************************************************************
 * UTWeaponLockerConfigurable
 * By Wail of Suicide
 * Contact: WailofSuicide@gmail.com
***************************************************************/

class UTWeaponLockerConfigurable extends UTWeaponLocker_Content;

/** NEW */
/** Configurable setting to allow locker-specific ammo amounts to be specified */
var() array&lt;int&gt; LockerConfiguredAmmoValue;
var() int  DelayPickupTime;                 /** After a player touches the Locker, he must wait this length of time before being able to touch it again */
var() bool bAlwaysOn;                       /** There is no delay between the player touching the Locker and being able to restore ammo at this locker*/
var() bool bRequireAmmoToRefill;            /** In order to gain more ammunition for a weapon, that weapon must have greater than zero ammunition */
var() bool bRequireDrawnWeapon;              /** In order to gain more ammunition for a weapon, the player must have that weapon currently equipped/drawn */


function bool AddCustomer(Pawn P)
{
	local int			i;
	local PawnToucher	PT;

	if ( UTInventoryManager(P.InvManager) == None )
		return false;

	if ( Customers.Length &gt; 0 )
		for ( i=0; i&lt;Customers.Length; i++ )
		{
			if ( Customers[i].NextTouchTime &lt; WorldInfo.TimeSeconds )
			{
				if ( Customers[i].P == P )
				{
					/** If AlwaysOn then NextTouchTime has no delay */
          if (bAlwaysOn)
					   Customers[i].NextTouchTime = WorldInfo.TimeSeconds;
          else
             Customers[i].NextTouchTime = WorldInfo.TimeSeconds + DelayPickupTime;
					return true;
				}
				Customers.Remove(i,1);
				i--;
			}
			else if ( Customers[i].P == P )
				return false;
		}

	PT.P = P;
	/** If AlwaysOn then NextTouchTime has no delay */
	if (bAlwaysOn)
	   PT.NextTouchTime = WorldInfo.TimeSeconds;
  else
     PT.NextTouchTime = WorldInfo.TimeSeconds + DelayPickupTime;
	Customers[Customers.Length] = PT;
	return true;
}

auto state LockerPickup
{
	simulated function ShowActive()
	{
		bIsActive = true;
		AmbientEffect.SetTemplate(ActiveEffectTemplate);
		NextProximityCheckTime = 0;
	}

	simulated function NotifyLocalPlayerDead(PlayerController PC)
	{
		ShowActive();
	}

	// When touched by an actor.
	simulated event Touch( actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal )
	{
		local int		i;
		local UTWeapon Copy;
		local Pawn Recipient;

		// If touched by a player pawn, let him pick this up.
		if( ValidTouch(Other) )
		{
			Recipient = Pawn(Other);
			if ( (Recipient.Controller != None &amp;&amp; Recipient.Controller.IsLocalPlayerController()) ||
				(Recipient.DrivenVehicle != None &amp;&amp; Recipient.DrivenVehicle.Controller != None &amp;&amp; Recipient.DrivenVehicle.Controller.IsLocalPlayerController()) )
			{
				if ( bIsActive )
				{
					if ( !bAlwaysOn )
					{
					   /** If not AlwaysOn then the locker is disabled for the configured delay time */
             ShowHidden();
					   SetTimer(DelayPickupTime,false,'ShowActive');
					}
				}
			}
			if ( Role &lt; ROLE_Authority )
				return;
			if ( !AddCustomer(Recipient) )
				return;


      // We need to adjust this part of the function to look for the Configurable Locker Ammo rather than in the Weapon's LockerAmmoCount
      // If no corresponding ammo value is defined in the locker for the weapon, default to the minimum pickup ammo (rather than minimum locker pickup ammo)
			for ( i=0; i&lt;Weapons.Length; i++ )
			{
				InventoryType = Weapons[i].WeaponClass;
				Copy = UTWeapon(UTInventoryManager(Recipient.InvManager).HasInventoryOfClass(InventoryType));

				if ( Copy != None )
				{
				  //If we've configured an ammo value in the locker, check if it is greater than the player's current ammo for that weapon, if so, fill the difference to the weapon's ammo
					if ( LockerConfiguredAmmoValue[i] != 0 &amp;&amp; LockerConfiguredAmmoValue[i] - Copy.AmmoCount &gt; 0 )
          {
             if ( bRequireAmmoToRefill &amp;&amp; Copy.AmmoCount &lt;= 0 )
                return;

             Copy.AddAmmo(LockerConfiguredAmmoValue[i] - Copy.AmmoCount);
          }
					//If the player's current ammo is less than the default minimum for that weapon, then fill the difference
          else if (Copy.default.AmmoCount - Copy.AmmoCount &gt; 0)
          	 Copy.AddAmmo(Copy.default.AmmoCount - Copy.AmmoCount);
					Copy.AnnouncePickup(Recipient);
				}
				else if (WorldInfo.Game.PickupQuery(Recipient, InventoryType, self))
				{
					Copy = UTWeapon(spawn(InventoryType));
					if ( Copy != None )
					{
						Copy.GiveTo(Recipient);
						Copy.AnnouncePickup(Recipient);
						//When giving the weapon to the player, check if the locker ammo value has been configured, if so, fill the difference between the locker value and the weapon's initial ammo
						if ( LockerConfiguredAmmoValue[i] != 0 &amp;&amp; LockerConfiguredAmmoValue[i]- Copy.Default.AmmoCount &gt; 0 )
							 Copy.AddAmmo(LockerConfiguredAmmoValue[i] - Copy.Default.AmmoCount);
					}
					else
						LogInternal(self$&quot; failed to spawn &quot;$inventorytype);
				}
			}
		}
	}

	simulated event BeginState(name PreviousStateName)
	{
		Super.BeginState(PreviousStateName);

		ShowActive();
	}
}

State Disabled
{
	simulated function BeginState(name PreviousStateName)
	{
		Super.BeginState(PreviousStateName);
		ShowHidden();
	}
}

defaultproperties
{
   DelayPickupTime=30
   bRequireAmmoToRefill=True
   bAlwaysOn=True
   Begin Object Class=UTParticleSystemComponent Name=ParticleSystem0 ObjName=ParticleSystem0 Archetype=UTParticleSystemComponent'UTGameContent.Default__UTWeaponLocker_Content:ParticleSystem0'
      ObjectArchetype=UTParticleSystemComponent'UTGameContent.Default__UTWeaponLocker_Content:ParticleSystem0'
   End Object
   AmbientEffect=ParticleSystem0
   Begin Object Class=UTParticleSystemComponent Name=ParticleSystem1 ObjName=ParticleSystem1 Archetype=UTParticleSystemComponent'UTGameContent.Default__UTWeaponLocker_Content:ParticleSystem1'
      ObjectArchetype=UTParticleSystemComponent'UTGameContent.Default__UTWeaponLocker_Content:ParticleSystem1'
   End Object
   ProximityEffect=ParticleSystem1
   Begin Object Class=DynamicLightEnvironmentComponent Name=PickupLightEnvironment ObjName=PickupLightEnvironment Archetype=DynamicLightEnvironmentComponent'UTGameContent.Default__UTWeaponLocker_Content:PickupLightEnvironment'
      ObjectArchetype=DynamicLightEnvironmentComponent'UTGameContent.Default__UTWeaponLocker_Content:PickupLightEnvironment'
   End Object
   LightEnvironment=PickupLightEnvironment
   Begin Object Class=CylinderComponent Name=CollisionCylinder ObjName=CollisionCylinder Archetype=CylinderComponent'UTGameContent.Default__UTWeaponLocker_Content:CollisionCylinder'
      ObjectArchetype=CylinderComponent'UTGameContent.Default__UTWeaponLocker_Content:CollisionCylinder'
   End Object
   CylinderComponent=CollisionCylinder
   Components(0)=CollisionCylinder
   Begin Object Class=PathRenderingComponent Name=PathRenderer ObjName=PathRenderer Archetype=PathRenderingComponent'UTGameContent.Default__UTWeaponLocker_Content:PathRenderer'
      ObjectArchetype=PathRenderingComponent'UTGameContent.Default__UTWeaponLocker_Content:PathRenderer'
   End Object
   Components(1)=PathRenderer
   Components(2)=PickupLightEnvironment
   Begin Object Class=StaticMeshComponent Name=BaseMeshComp ObjName=BaseMeshComp Archetype=StaticMeshComponent'UTGameContent.Default__UTWeaponLocker_Content:BaseMeshComp'
      ObjectArchetype=StaticMeshComponent'UTGameContent.Default__UTWeaponLocker_Content:BaseMeshComp'
   End Object
   Components(3)=BaseMeshComp
   Components(4)=ParticleSystem0
   Components(5)=ParticleSystem1
   CollisionComponent=CollisionCylinder
   Name=&quot;Default__UTWeaponLockerConfigurable&quot;
   ObjectArchetype=UTWeaponLocker_Content'UTGameContent.Default__UTWeaponLocker_Content'
}

&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console</title>
    <id>693</id>
    <revision>
      <id>2018</id>
      <timestamp>2007-11-01T00:47:56Z</timestamp>
      <contributor>
        <ip>Cpe-76-185-117-223.tx.res.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Console (Package: Engine)}}

or

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; Console (Package: Engine)}}

''Console'' is the user interface for the Unreal engine that accompanies a [[Legacy:Viewport|Viewport]].  The UT generation of the Unreal engine introduced an enhanced, Windows-style console, [[Legacy:WindowConsole|WindowConsole]]. In later engine builds any [[Legacy:Interaction|Interaction]] subclass can serve as console, but the default console in UT2003 is [[Legacy:ExtendedConsole|ExtendedConsole]].

==Technical Notes==

The Key that brings up the console is defined in the game .ini file. For example, in UE2Runtime.ini:

 [Engine.Console]
 ConsoleKey=192

In [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] this is (obviously) linked to the following config variable:

&lt;USCRIPT&gt;

var globalconfig byte ConsoleKey;			// Key used to bring up the console
&lt;/USCRIPT&gt;

In [[Legacy:UT2003|UT2003]] it's called '''ConsoleHotKey''' instead, but essentially the same configuration.

Sticking with [[Legacy:UnrealEngine2 Runtime|Runtime]] for the moment, we continue:

When you press the '''ConsoleKey''' to bring up the console during a game, the [[Legacy:Console|Console]] class goes into the '''Typing''' state. The defualt '''KeyEvent()''' function waits for the key to be pressed, and if it has, executes the state change. Once in '''Typing''', the relevant '''KeyEvent()''' function responds to:
*Escape key (IK_Escape) to cancel the console input
*Backspace (IK_Backspace) for obvious reasons
*Up and Down keys (IK_Up, IK_Down) to navigate the command history (in an array of strings called '''History''').
*Enter (IK_Enter) adds the command just typed to '''History''' and then tries to execute the command (via native function '''ConsoleCommand()''')

The '''KeyType''' function appends characters to TypedStr, eventually holding the new command. It filters out any characters that are not valid.

In [[Legacy:UT2003|UT2003]], [[Legacy:ExtendedConsole|ExtendedConsole]] does not make use of the '''Typing''' state at all - the '''ConsoleVisible''' state takes over its functions, and offers a few extra ones. [[Legacy:ExtendedConsole|ExtendedConsole]] also handles the Speech menu.

==Other topics ==

You might be looking for...
* [[Legacy:UnrealEd Console|UnrealEd Console]] commands
* The [[Legacy:Console Bar|Console bar]] in the UnrealEd interface
* [[Legacy:UT2003 Console|UT2003 Console]] commands
* [[Legacy:UT Console|UT Console]] commands

==Requests ==

'''Bob242:''' Does anybody have any information on the new things that [[Legacy:ExtendedConsole|ExtendedConsole]] handles?  Incidentally, if someone wanted the Server to take a look at a client console's history everytime there is a change, would that be easy to acomplish?  I assume that you would need something on the client end to send it to the server upon a change.

'''Jediborg:''' Does anybody know how to write text to the console via a script? I know you can write to the utlog file, but that sucks. Surely there is a way to get real-time debugging info?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2019</id>
      <timestamp>2004-02-19T11:48:37Z</timestamp>
      <contributor>
        <ip>Scumble</ip>
      </contributor>
      <comment>Some notes on how the console code appears to work</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Console (Package: Engine)}}

or

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; Console (Package: Engine)}}

''Console'' is the user interface for the Unreal engine that accompanies a [[Legacy:Viewport|Viewport]].  The UT generation of the Unreal engine introduced an enhanced, Windows-style console, [[Legacy:WindowConsole|WindowConsole]]. In later engine builds any [[Legacy:Interaction|Interaction]] subclass can serve as console, but the default console in UT2003 is [[Legacy:ExtendedConsole|ExtendedConsole]].

==Technical Notes==

The Key that brings up the console is defined in the game .ini file. For example, in UE2Runtime.ini:

 [Engine.Console]
 ConsoleKey=192

In [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] this is (obviously) linked to the following config variable:

&lt;USCRIPT&gt;

var globalconfig byte ConsoleKey;			// Key used to bring up the console
&lt;/USCRIPT&gt;

In [[Legacy:UT2003|UT2003]] it's called '''ConsoleHotKey''' instead, but essentially the same configuration.

Sticking with [[Legacy:UnrealEngine2 Runtime|Runtime]] for the moment, we continue:

When you press the '''ConsoleKey''' to bring up the console during a game, the [[Legacy:Console|Console]] class goes into the '''Typing''' state. The defualt '''KeyEvent()''' function waits for the key to be pressed, and if it has, executes the state change. Once in '''Typing''', the relevant '''KeyEvent()''' function responds to:
*Escape key (IK_Escape) to cancel the console input
*Backspace (IK_Backspace) for obvious reasons
*Up and Down keys (IK_Up, IK_Down) to navigate the command history (in an array of strings called '''History''').
*Enter (IK_Enter) adds the command just typed to '''History''' and then tries to execute the command (via native function '''ConsoleCommand()''')

The '''KeyType''' function appends characters to TypedStr, eventually holding the new command. It filters out any characters that are not valid.

In [[Legacy:UT2003|UT2003]], [[Legacy:ExtendedConsole|ExtendedConsole]] does not make use of the '''Typing''' state at all - the '''ConsoleVisible''' state takes over its functions, and offers a few extra ones. [[Legacy:ExtendedConsole|ExtendedConsole]] also handles the Speech menu.

==Other topics ==

You might be looking for...
* [[Legacy:UnrealEd Console|UnrealEd Console]] commands
* The [[Legacy:Console Bar|Console bar]] in the UnrealEd interface
* [[Legacy:UT2003 Console|UT2003 Console]] commands
* [[Legacy:UT Console|UT Console]] commands

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2020</id>
      <timestamp>2004-08-05T18:13:34Z</timestamp>
      <contributor>
        <ip>Toronto-HSE-ppp3726125.sympatico.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; Console (Package: Engine)}}

or

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; Console (Package: Engine)}}

''Console'' is the user interface for the Unreal engine that accompanies a [[Legacy:Viewport|Viewport]].  The UT generation of the Unreal engine introduced an enhanced, Windows-style console, [[Legacy:WindowConsole|WindowConsole]]. In later engine builds any [[Legacy:Interaction|Interaction]] subclass can serve as console, but the default console in UT2003 is [[Legacy:ExtendedConsole|ExtendedConsole]].

==Technical Notes==

The Key that brings up the console is defined in the game .ini file. For example, in UE2Runtime.ini:

 [Engine.Console]
 ConsoleKey=192

In [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] this is (obviously) linked to the following config variable:

&lt;USCRIPT&gt;

var globalconfig byte ConsoleKey;			// Key used to bring up the console
&lt;/USCRIPT&gt;

In [[Legacy:UT2003|UT2003]] it's called '''ConsoleHotKey''' instead, but essentially the same configuration.

Sticking with [[Legacy:UnrealEngine2 Runtime|Runtime]] for the moment, we continue:

When you press the '''ConsoleKey''' to bring up the console during a game, the [[Legacy:Console|Console]] class goes into the '''Typing''' state. The defualt '''KeyEvent()''' function waits for the key to be pressed, and if it has, executes the state change. Once in '''Typing''', the relevant '''KeyEvent()''' function responds to:
*Escape key (IK_Escape) to cancel the console input
*Backspace (IK_Backspace) for obvious reasons
*Up and Down keys (IK_Up, IK_Down) to navigate the command history (in an array of strings called '''History''').
*Enter (IK_Enter) adds the command just typed to '''History''' and then tries to execute the command (via native function '''ConsoleCommand()''')

The '''KeyType''' function appends characters to TypedStr, eventually holding the new command. It filters out any characters that are not valid.

In [[Legacy:UT2003|UT2003]], [[Legacy:ExtendedConsole|ExtendedConsole]] does not make use of the '''Typing''' state at all - the '''ConsoleVisible''' state takes over its functions, and offers a few extra ones. [[Legacy:ExtendedConsole|ExtendedConsole]] also handles the Speech menu.

==Other topics ==

You might be looking for...
* [[Legacy:UnrealEd Console|UnrealEd Console]] commands
* The [[Legacy:Console Bar|Console bar]] in the UnrealEd interface
* [[Legacy:UT2003 Console|UT2003 Console]] commands
* [[Legacy:UT Console|UT Console]] commands

==Requests ==

'''Bob242:''' Does anybody have any information on the new things that [[Legacy:ExtendedConsole|ExtendedConsole]] handles?  Incidentally, if someone wanted the Server to take a look at a client console's history everytime there is a change, would that be easy to acomplish?  I assume that you would need something on the client end to send it to the server upon a change.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console (DX)</title>
    <id>847</id>
    <revision>
      <id>2364</id>
      <timestamp>2005-01-14T03:30:42Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; Console (Engine) }}

A player console, associated with a viewport.

This is a built-in Unreal class and it shouldn't be modified.

'''Xhiris:''' Yet again, Ion Storm didn't listen to this advice...

==Differences from UT ==
* defaultproperties in UT has package for fontname, DX doesn't

==Functions ==
;  DrawLevelAction( canvas C ): Changed
;  DrawSingleView( Canvas C ): Changed
; bool KeyEvent( EInputKey Key , EInputAction Action , FLOAT Delta ): 
* UT has a new &quot;hook for mod authors&quot;
* DX uses Shift-Tilde for console? (UT handling in DX is commented out)
;  Type( ): Moved to [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]]
;  ViewDown( ): Implementation is commented out
;  ViewUp( ): Implementation is commented out

==Events ==
;  PostRender( canvas C ): Changed
;  Tick( float Delta ): New stuff added
 

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2365</id>
      <timestamp>2005-01-14T00:20:05Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Bar</title>
    <id>694</id>
    <revision>
      <id>2021</id>
      <timestamp>2003-05-25T09:04:18Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">The console bar is the area at the bottom of the [[Legacy:UnrealEd Interface|UnrealEd Interface]].

==UnrealEd 3==

[[Image:Legacy_interface.Ed3.console.png|center|UnreaEd 3 console bar (squished to fit)]]

# UnrealEd's console. Text commands can be typed in here. Most of them are equivalent to actions in the rest of the interface, but some of UnrealEd's features can only be accessed here. See [[Legacy:UnrealEd Console|UnrealEd Console]] for the list.
# Opens the log window. Some console commands produce output here.
# funny lock icon
# Snap to vertex toggle. Green when active.
# Snap to grid toggle. Green when active.
# Grid size. See [[Legacy:Snap To Grid|Snap to Grid]] or [[Legacy:Grid|Grid]] for more on using the grid.
# Snap to Rotation Grid toggle.
# Maximize active viewport toggle.
# DrawScale3D &amp;ndash; these 3 boxes show the value of the  [[Legacy:Actor/Display|Display]] -&gt; DrawScale3D property for the currently selected [[Legacy:Actor|Actor]](s). Useful for quickly changing the size of [[Legacy:Static Mesh|Static Mesh]]es.

==UnrealEd 2==

[[Image:Legacy_interface.consolebar.gif|center|UnreaEd 2 console bar]]

# UnrealEd's console. Text commands can be typed in here. Most of them are equivalent to actions in the rest of the interface, but some of UnrealEd's features can only be accessed here. See [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]] for the list.
# Opens the log window. Some console commands produce output here.
# Snap to vertex toggle. Green when active.
# Snap to grid toggle. Green when active.
# Grid size. See [[Legacy:Snap To Grid|Snap to Grid]] or [[Legacy:Grid|Grid]] for more on using the grid.
# Snap to Rotation Grid toggle.
# Maximize active viewport toggle.

==Related Topics ==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2022</id>
      <timestamp>2003-01-26T15:12:14Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The console bar is the area at the bottom of the [[Legacy:UnrealEd Interface|UnrealEd Interface]].

==UnrealEd 3==

[[Image:Legacy_interface.Ed3.console.png|center|UnreaEd 3 console bar]]

# UnrealEd's console. Text commands can be typed in here. Most of them are equivalent to actions in the rest of the interface, but some of UnrealEd's features can only be accessed here. See [[Legacy:UnrealEd Console|UnrealEd Console]] for the list.
# Opens the log window. Some console commands produce output here.
# funny lock icon
# Snap to vertex toggle. Green when active.
# Snap to grid toggle. Green when active.
# Grid size. See [[Legacy:Snap To Grid|Snap to Grid]] or [[Legacy:Grid|Grid]] for more on using the grid.
# Snap to Rotation Grid toggle.
# Maximize active viewport toggle.
# DrawScale3D &amp;ndash; these 3 boxes show the value of the  [[Legacy:Actor/Display|Display]] -&gt; DrawScale3D property for the currently selected [[Legacy:Actor|Actor]](s). Useful for quickly changing the size opf [[Legacy:Satic Mesh|Satic Mesh]]es.

==UnrealEd 2==

[[Image:Legacy_interface.consolebar.gif|center|UnreaEd 2 console bar]]

# UnrealEd's console. Text commands can be typed in here. Most of them are equivalent to actions in the rest of the interface, but some of UnrealEd's features can only be accessed here. See [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]] for the list.
# Opens the log window. Some console commands produce output here.
# Snap to vertex toggle. Green when active.
# Snap to grid toggle. Green when active.
# Grid size. See [[Legacy:Snap To Grid|Snap to Grid]] or [[Legacy:Grid|Grid]] for more on using the grid.
# Snap to Rotation Grid toggle.
# Maximize active viewport toggle.

==Related Topics ==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]</text>
    </revision>
    <revision>
      <id>2023</id>
      <timestamp>2003-04-07T16:14:51Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The console bar is the area at the bottom of the [[Legacy:UnrealEd Interface|UnrealEd Interface]].

==UnrealEd 3==

[[Image:Legacy_interface.Ed3.console.png|center|UnreaEd 3 console bar (squished to fit)]]

# UnrealEd's console. Text commands can be typed in here. Most of them are equivalent to actions in the rest of the interface, but some of UnrealEd's features can only be accessed here. See [[Legacy:UnrealEd Console|UnrealEd Console]] for the list.
# Opens the log window. Some console commands produce output here.
# funny lock icon
# Snap to vertex toggle. Green when active.
# Snap to grid toggle. Green when active.
# Grid size. See [[Legacy:Snap To Grid|Snap to Grid]] or [[Legacy:Grid|Grid]] for more on using the grid.
# Snap to Rotation Grid toggle.
# Maximize active viewport toggle.
# DrawScale3D &amp;ndash; these 3 boxes show the value of the  [[Legacy:Actor/Display|Display]] -&gt; DrawScale3D property for the currently selected [[Legacy:Actor|Actor]](s). Useful for quickly changing the size of [[Legacy:Static Mesh|Static Mesh]]es.

==UnrealEd 2==

[[Image:Legacy_interface.consolebar.gif|center|UnreaEd 2 console bar]]

# UnrealEd's console. Text commands can be typed in here. Most of them are equivalent to actions in the rest of the interface, but some of UnrealEd's features can only be accessed here. See [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]] for the list.
# Opens the log window. Some console commands produce output here.
# Snap to vertex toggle. Green when active.
# Snap to grid toggle. Green when active.
# Grid size. See [[Legacy:Snap To Grid|Snap to Grid]] or [[Legacy:Grid|Grid]] for more on using the grid.
# Snap to Rotation Grid toggle.
# Maximize active viewport toggle.

==Related Topics ==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands</title>
    <id>800</id>
    <revision>
      <id>2261</id>
      <timestamp>2007-01-23T09:01:10Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>rv</comment>
      <text xml:space="preserve">The following pages describe the commands available from the game console.  Some console commands are supported by the [[Legacy:Unreal Engine|Unreal Engine]] itself and should therefore work in all [[Legacy:Unreal Engine Versions|Unreal Engine versions]], ie all games based on the engine.  Other console commands are applicable only to a specifc game.

This set of pages aims to replace [[Legacy:UT2003 Console|UT2003 Console]], [[Legacy:UnrealEd Console|UnrealEd Console]], and [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]] (I may leave the UnrealEd console pages alone).  In additition to the previous pages there is also a [[Legacy:Console|Console]] class which may be of use.

==Getting to the Console==
* To pop up the console, press '''~''' (tilde) or use the quick console (which displays a single line) that is available through the '''Tab''' key.
* Console commands are not case sensitive.  &lt;code&gt;ADDBOTS&lt;/code&gt;, &lt;code&gt;addbots&lt;/code&gt; and &lt;code&gt;AddBots&lt;/code&gt; work alike.
* The distinction between UnrealScript, C++ and other console commands is a purely technical matter and doesn't affect how the commands work.
* UnrealScript console commands are handled by either the playerpawn's ''exec'' functions or by the ''exec'' functions of items in the playerpawn's inventory.
* Please see [[Legacy:UnrealEd Console|UnrealEd Console]] and [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]] for editor-related console commands.
* Console commands can be bound to keys by editing the user.ini file.

==Common Console Commands==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/General Console Commands]] &amp;ndash; These console commands are typically used as additional key binds when playing games.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Admin Console Commands]] &amp;ndash; These console commands cover admin style commands e.g. changing maps, kicking players, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Client Only Console Commands]] &amp;ndash; These console commands only work on the machine the command was entered on.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Debugging Console Commands]] &amp;ndash; Commands useful for debugging.  See also the admin and cheat sections.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cheat Console Commands]] &amp;ndash; This page covers all of the &quot;cheat&quot; console commands supported by the core Unreal Engine (for development purposes only &amp;ndash; I mean, you wouldn't want to cheat really would you?).  Console commands useful for testing maps are included in this section.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cheat Commands (UT2004)]] &amp;ndash; Ditto above, except updated for the cheats in UT2k4.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Summon Codes (UT2004)]] &amp;ndash; Lists usable summon codes for UT2k4.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands]] &amp;ndash; This page covers all of the commands used for displaying statistics about the current game (e.g. FPS) in UT2004.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands (UT)]] &amp;ndash; The same for UT.

==Game Specific Console Commands==
* [[Legacy:UT Console|UT Console]] &amp;ndash; This page covers all console commands specific to Unreal Tournament.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Summon Codes (UT)]] &amp;ndash; Historical summon codes, possibly still relevant
* [[Legacy:UT2003 Console|UT2003 Console]] &amp;ndash; This page covers all console commands specific to Unreal Tournament 2003.
* [[Legacy:Devastation Console Commands|Devastation Console Commands]] &amp;ndash; This page covers all console commands specific to Devastation.
* [http://forum.americasarmy.com/viewtopic.php?t=127 America's Army] &amp;ndash; This page covers all console commands specific to America's Army.
* [[Legacy:Postal 2 Console Commands|Postal 2 Console Commands]] &amp;ndash; This page covers all console commands specific to [[Legacy:Postal 2|Postal 2]].
* [[Legacy:Pariah Console Commands|Pariah Console Commands]] &amp;ndash; This page covers all console commands specific to Pariah.

==Unreal Editor Console Commands==
* [[Legacy:UnrealEd Console|UnrealEd Console]] &amp;ndash; For console commands relating to the most recent version of the Unreal Editor, for [[Legacy:UT2003|UT2003]].
* [[Legacy:UnrealEd 2 Console|UnrealEd 2 Console]] &amp;ndash; For console commands relating to the version of the Unreal Editor that ships with [[Legacy:Unreal Tournament|Unreal Tournament]].

==Adding New Console Commands==

You can use [[Legacy:Exec Function|Exec Function]]s to add new console commands. See [[Legacy:Exec Function|Exec Function]].

==Related Articles==
* [[udn2:ConsoleCommands]] &amp;ndash; Native console commands in UnrealEngine 2.5
* [[udn2:ExecFunctions]] &amp;ndash; Script console commands in UnrealEngine 2.5

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2262</id>
      <timestamp>2007-01-22T23:29:31Z</timestamp>
      <contributor>
        <ip>63.64.185.249</ip>
      </contributor>
      <comment>http://www.lyiwjs.rspxkdtiv.com</comment>
      <text xml:space="preserve">xavwj sqmhb ebzgn xjagtmp lumgv bsqx klczbxupt</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Admin Console Commands</title>
    <id>803</id>
    <revision>
      <id>2267</id>
      <timestamp>2007-12-12T03:33:21Z</timestamp>
      <contributor>
        <ip>124-171-60-204.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?</text>
    </revision>
    <revision>
      <id>2268</id>
      <timestamp>2006-10-20T16:53:28Z</timestamp>
      <contributor>
        <ip>Lr-bork.student.iastate.edu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.</text>
    </revision>
    <revision>
      <id>11762</id>
      <timestamp>2008-05-06T22:00:43Z</timestamp>
      <contributor>
        <username>UBCS Spawn</username>
        <id>466</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?

'''UBCS Spawn:''' I want to learn how to use the Adminlogin for the game but it does not let me do it i wanted to do the password but i dont know how i need some help please contact me at brandongarcia18@comcast.net</text>
    </revision>
    <revision>
      <id>11763</id>
      <timestamp>2008-05-06T22:06:39Z</timestamp>
      <contributor>
        <username>UBCS Spawn</username>
        <id>466</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?

'''UBCS Spawn:''' I want to learn how to use the Adminlogin for the game but it does not let me do it i wanted to do the password but i dont know how i need some help please I also want to know what is the codes Myclass MyArray (1,2,3,4,5,).thank you</text>
    </revision>
    <revision>
      <id>11764</id>
      <timestamp>2008-05-06T22:07:21Z</timestamp>
      <contributor>
        <username>UBCS Spawn</username>
        <id>466</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?

'''UBCS Spawn:''' I want to learn how to use the Adminlogin for the game but it does not let me do it i wanted to do the password but i dont know how i need some help please I also want to know what is the codes Myclass MyArray (1,2,3,4,5,).</text>
    </revision>
    <revision>
      <id>11765</id>
      <timestamp>2008-05-06T22:10:55Z</timestamp>
      <contributor>
        <username>UBCS Spawn</username>
        <id>466</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?

'''UBCS Spawn:''' I want to learn how to use the Adminlogin for the game but it does not let me do it i wanted to do the password but i dont know how i need some help please I also want to know what is the codes Myclass MyArray (1,2,3,4,5,).

'''XxJasonXx:'''' i dont know how to use the adminlogin for Land of the Dead i need some help for this game.</text>
    </revision>
    <revision>
      <id>33129</id>
      <timestamp>2008-10-15T11:51:56Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.

----

'''Mortal Monkey:''' Does anyone know how to SET (and GET) array elements? Apparantly the good old brackets don't work.

'''Foxpaw:''' I don't think that you can. Though if it is indeed possible I would be highly interested in how to do it.

'''Mychaeel:''' You can set an entire array as &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;.

'''Mortal Monkey:''' Thanks :). I put it up there for ya.

'''Mortal Monkey:''' Well, I can't get it to work. I even made a mutator with a few arrays and a 'mutate ardump' command, but the best I could get was to set the first array element through skiping the parenthesis. I also tried some brackets and clamps, but to no avail.

'''XxDangerxX:''' I've found the same thing. You simply cannot do it with the way Mychaeel explained.
HOWEVER!!! In the 451 update (which is apparently dodgy unless you're running a server), you can set an array like so:

&lt;code&gt;set Package.Class Array &lt;#&gt; Value&lt;/code&gt;

See the release notes: [http://www.utpg.org/patches/ReleaseNotes451.htm]

'''Bartje321:''' Quit does the same as exit, only it waits till the server is empty.

'''Kamek:''' MM/Mych: I think that only works with dynamic arrays.

'''Lucifer''' Is there any way to specify a certain actor out of the group in the map, in-game, with the set command? Such as to set the Teleporter tag's and url's on each individual teleporter with just a command?

'''Mortal Monkey:''' You can set the properties of individual actors throug the EditActors command (see [[Legacy:Console Commands/Debugging Console Commands|debugging]]).

'''EricBlade:''' I would like to note that these commands do not appear to be related directly to the engine, as they are actually somehow added from the Admin class.  In Land of the Dead, not a one of these commands work (i had to write a mutator to give us basic admin capabilities.  If anyone has any insight on how this actually works, and why these commands would not work in a game, please let me know ;)

'''Virmitio:''' Has anyone tried something like &lt;code&gt;(MyArray+2)&lt;/code&gt; to get other elements (in this case the third one, in theory)?  As for why this doesn't work in-game, it looks to me like the engine is written to allow direct code execution, just not always from the standard input (in this case, the console).  I'm going to toy with this some more and see what I can find.

'''XxDangerxX:''' Can anyone suggest a way to have 2 passwords: a master one for server administration and a sub-password so select people who know it can use cheats like god and fly?

'''UBCS Spawn:''' I want to learn how to use the Adminlogin for the game but it does not let me do it i wanted to do the password but i dont know how i need some help please I also want to know what is the codes Myclass MyArray (1,2,3,4,5,).

'''XxJasonXx:'''' i dont know how to use the adminlogin for Land of the Dead i need some help for this game.</text>
    </revision>
    <revision>
      <id>33130</id>
      <timestamp>2008-10-17T06:39:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moving discussion to talk page</comment>
      <text xml:space="preserve">What follows is a definition of all of the server administration [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; ADMINLOGIN &lt;password&gt; : Login as an administrator.
; ADMINLOGOUT : Drop administrator access (warning: lethal for your player in game!).
; ADMIN &lt;command&gt; : Perform a console command on the server's console.  This effectively sends the text after the ADMIN to be interpreted as a normal console command.  The vast majority of commands can be run in a practice session without the ADMIN prefix.

The following console commands will only work in a networked game when you have logged in as an administrator, '''and''' you have prefixed the command with ADMIN.  e.g. ADMIN PAUSE.

; SERVERTRAVEL &lt;new level URL&gt;?game=&lt;new gametype&gt;?mutator=&lt;new mutator&gt; : This function can be used to simply change the level, or, can also changes the level, game type, and mutator settings.  '''TO DO: Either a link to a running the server section when it happens or cover all of the game settings in a section below.  Former is probably better.'''.
; SWITCHLEVEL &lt;new level URL&gt; : Causes the server to switch to a new level keeping the current game settings and mutator configurations/.
; SET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; &lt;value&gt; : This command sets the attribute ''property'' on the class ''package''.''class'' to ''value''.  Examples of this command can be seen below (enabling and disabling the web interface, Changing Bot Skill, Minimum Players).  Refer to the INI reference for packages, classnames and properties. (Example: http://www.unrealadmin.org/modules.php?name=INI_Reference&amp;func=ut2004 ) Note the inheritance, for example Onslaught.ONSOnslaughtGame MinPlayers overrides UnrealGame.UnrealMPGameInfo MinPlayers. 
; SET UWeb.Webserver bEnabled &lt;value&gt; : Use a value of ''True'' to enable the remote admin webserver, and a value of ''False'' to disable it.  This setting change requires a level change to take effect.
; SET Engine.GameInfo GameDifficulty &lt;value&gt; : Sets Bot Skill level on next map change.
; SET Engine.GameInfo MaxPlayers &lt;value&gt; : Limit maximum number of players
; SET UnrealGame.UnrealMPGameInfo MinPlayers &lt;value&gt; : Bots are added up to value of MinPlayers.
; KICK &lt;playername&gt; : Kick a player.
; KICKBAN &lt;playername&gt; : Kick a player and ban his/her IP.  You'll need to edit your .ini file or use the remote web admin to unban their IP.
; ADDBOTS &lt;number&gt; : This command adds a number of &quot;bots&quot; to the level.  It may not work in Devastation (I've not tried).
; ADDNAMEDBOT &lt;botname&gt; : This command adds a single bot of the name you specify. For example - addnamedbot malcolm would add Malcolm to the current game.
; KILLBOTS : This command removes all the &quot;bots&quot; from the level.
; ADMINSAY &lt;text&gt; : In UT and UT2003 this function displays a message in the center of the screen rather than in a normal message location.  This command appears not to function in Devastation.  The same effect can be accomplished by simply by entering &quot;Say # &lt;text&gt;&quot; - so you can just use your Say key.
; EXIT : This function will exit the game.  If this command is prefixed with ADMIN then it will shut down the server.
; QUIT : Does the same as exit.
; EXEC &lt;filename&gt; : This function can be used to run a local script containing console commands located within the Game/System directory by default.  If this command is prefixed with ADMIN then the script must be located on the server.  This function is useful if you wish to configure a server quickly.  You can prepare a script with all of the admin commands needed to set up the server as required and then simply EXEC it from the command line when you join the server.
; PAUSE : This function pauses the current game. Unpausing is done by pressing PAUSE a second time.

{|

|-
|Property
|Value
|
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|-
| colspan=&quot;2&quot; |
|}

Dynamic arrays can be set through &lt;code&gt;set MyClass MyArray (1,2,3,4,5)&lt;/code&gt;. Static arrays cannot be set in this manner.
; GET &lt;package&gt;.&lt;classname&gt; &lt;property&gt; : This command displays the current value of the attribute ''property'' on the class ''package''.''class''.

Static arrays will only return the first element of the array in this manner.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Cheat Commands (UT2004)</title>
    <id>808</id>
    <revision>
      <id>2278</id>
      <timestamp>2007-09-27T18:52:56Z</timestamp>
      <contributor>
        <ip>Static-72-95-217-34.pitbpa.fios.verizon.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page lists known cheats usable in UT2004. Hit the Tab or ~ key to open a console.

All commands are non-case-sensitive.

==General==
* '''god''' : God mode. Your character cannot be killed by enemy fire, crushing by vehicles, drowning, &quot;pain&quot;-causing volumes, etc; some things, such as ion satellites, KillZ (e.g. the bottom of the pit in Gael), etc. can and will still kill you.
* '''loaded''' : Gives you all standard weapons, including superweapons, and 999 ammo for all except the Redeemer.
* '''allweapons''' : Gives you all standard weapons.
* '''allammo''' : Gives you 999 ammo for all weapons you currently carry (again, excluding Redeemer).
* '''fly''' : Your character flies. Note that in both &quot;fly&quot; and &quot;ghost&quot; modes, firing a guided Redeemer (and sometimes viewing from the Translocator camera) will return you to &quot;walk&quot; mode.
* '''ghost''' : Your character flies and can pass through everything in the map. Note that you cannot pick anything up in this mode, though you can still fire.
* '''amphibious''' : Sets the time your character can stay underwater before taking damage to about 20 minutes.
* '''invisible''' : Makes your character completely invisible. Enter again to resume visibility.
* '''walk''' : Deactivates fly/ghost.
* '''teleport''' : Teleports you to approximately whatever your crosshair is currently pointing at.
* '''setspeed''' ''n'' : Sets your character's walking/swimming speed to ''n''. 1.0 is default; larger values faster, smaller values slower.
* '''changesize''' ''n'' : Scales your character by ''n''. 1.0 is default; lower values are smaller, higher values are bigger.
* '''setjumpz''' ''n'' : Sets your character's jump height in Unreal Units (UU) to ''n''. Default is approximately 900. 16 UU = 1 foot.
* '''setgravity''' ''n'' : Sets gravity to ''n''. Should be a negative number (default -950) unless you want everything to float up into the air. In positive gravity, bots will not move unless they somehow come into contact with the ground or another walkable surface.
* '''slomo''' ''n'' : Sets gamespeed to ''n''. 1.0 is default; lower values are slower, higher values are faster.
* '''playersonly''' : Effectively stops time for everything except your character and hovering vehicles (e.g. Goliath, Manta) which will generally continue moving in whatever direction they were moving when the command was entered. You can only move in this mode; weapon fire does not work. You can, however, pick up / capture the flag in CTF and the ball in BR.
* '''freezeall''' : Same as '''playersonly''', but also stops hovering vehicles.
* '''summon''' ''class'' : Summons an item ''class''. More information in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Summon Codes (UT2004)]].
* '''set ''class'' ''property'' ''value'' ''' : Sets ''property'' of all actors of class ''class'' to ''value''. For example, to set health of all pawns (players, bots, vehicles, turrets, etc.) to 50, enter ''set pawn health 50''.
* '''show fog''' : disables the fog, put it in again to bring the fog back
* '''show all''' : shows everything as in volumes,paths,spawns points,triggers,everything.

(dont know of a way to turn it off exept to exit game)
* '''exit''' : leave the game
* '''showdebug''' : shows alot of stuff along with where bots want to go
* '''cheatview''' ''class'' : cycles through all of the actors of specified class and sets the players camera to that of the given actor.
* '''viewclass''' ''class'' : see cheatview.  (In UT99 there seemed to be a distinction between this and '''cheatview'''.  See [[Legacy:Console_Commands/Cheat_Console_Commands|Console_Commands/Cheat_Console_Commands]] For more info.

==Single-Player (Ladder) [untested]==
* '''skipmatch''' : Wins and skips the current match.
* '''jumpmatch''' ''n'' : Jumps to a specific match. ''n'' is a combined number: to jump to ladder 5, rung 4, enter ''jumpmatch 54''.
* '''winmatch''' : Wins the current match.

==Assault Mode [untested]==
* '''weakobjectives''' : Unknown. Presumably makes next objective somehow easier.
* '''disablenextobjective''' : Unknown. Removes next objective from required list?

There is also an interesting extra command in the UnrealScript cheat-code handler, '''avatar''' ''class'', which appears to allow you to possess another type of pawn (e.g. a Skaarj monster, a vehicle, a turret). This does not seem to work in-game, but more testing might reveal whether/how it can be used.

'''Duralex:''' Im sure most of you already know what the command Avatar does but jest in case u dont it lets you take control of, lets say a generic monster u just spawned by typing in avatar skaarjpack.monster in the console.  It actually does work in game and will respond accordingly to all ur input such as jump crouch, etc.  On a side note if you take control of a monster you may have to edit its properties before it will allow certain actions such as the ability to crouch.

'''Weylin:''' When the avatar command is used on monsters it will only allow you to move around and not fire weapons. If you view your character from 3rd person, it will look the same as whatever your regular character is, but certain movement animations will be missing or changed. I was hoping to be able to fully control them and look like them, or can you?</text>
    </revision>
    <revision>
      <id>2279</id>
      <timestamp>2007-09-06T04:06:57Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>updated.</comment>
      <text xml:space="preserve">This page lists known cheats usable in UT2004. Hit the Tab or ~ key to open a console.

All commands are non-case-sensitive.

==General==
* '''god''' : God mode. Your character cannot be killed by enemy fire, crushing by vehicles, drowning, &quot;pain&quot;-causing volumes, etc; some things, such as ion satellites, KillZ (e.g. the bottom of the pit in Gael), etc. can and will still kill you.
* '''loaded''' : Gives you all standard weapons, including superweapons, and 999 ammo for all except the Redeemer.
* '''allweapons''' : Gives you all standard weapons.
* '''allammo''' : Gives you 999 ammo for all weapons you currently carry (again, excluding Redeemer).
* '''fly''' : Your character flies. Note that in both &quot;fly&quot; and &quot;ghost&quot; modes, firing a guided Redeemer (and sometimes viewing from the Translocator camera) will return you to &quot;walk&quot; mode.
* '''ghost''' : Your character flies and can pass through everything in the map. Note that you cannot pick anything up in this mode, though you can still fire.
* '''amphibious''' : Sets the time your character can stay underwater before taking damage to about 20 minutes.
* '''invisible''' : Makes your character completely invisible. Enter again to resume visibility.
* '''walk''' : Deactivates fly/ghost.
* '''teleport''' : Teleports you to approximately whatever your crosshair is currently pointing at.
* '''setspeed''' ''n'' : Sets your character's walking/swimming speed to ''n''. 1.0 is default; larger values faster, smaller values slower.
* '''changesize''' ''n'' : Scales your character by ''n''. 1.0 is default; lower values are smaller, higher values are bigger.
* '''setjumpz''' ''n'' : Sets your character's jump height in Unreal Units (UU) to ''n''. Default is approximately 900. 16 UU = 1 foot.
* '''setgravity''' ''n'' : Sets gravity to ''n''. Should be a negative number (default about -500?) unless you want everything to float up into the air. In positive gravity, bots will not move unless they somehow come into contact with the ground or another walkable surface.
* '''slomo''' ''n'' : Sets gamespeed to ''n''. 1.0 is default; lower values are slower, higher values are faster.
* '''playersonly''' : Effectively stops time for everything except your character and hovering vehicles (e.g. Goliath, Manta) which will generally continue moving in whatever direction they were moving when the command was entered. You can only move in this mode; weapon fire does not work. You can, however, pick up / capture the flag in CTF and the ball in BR.
* '''freezeall''' : Same as '''playersonly''', but also stops hovering vehicles.
* '''summon''' ''class'' : Summons an item ''class''. More information in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Summon Codes (UT2004)]].
* '''set ''class'' ''property'' ''value'' ''' : Sets ''property'' of all actors of class ''class'' to ''value''. For example, to set health of all pawns (players, bots, vehicles, turrets, etc.) to 50, enter ''set pawn health 50''.
* '''show fog''' : disables the fog, put it in again to bring the fog back
* '''show all''' : shows everything as in volumes,paths,spawns points,triggers,everything.

(dont know of a way to turn it off exept to exit game)
* '''exit''' : leave the game
* '''showdebug''' : shows alot of stuff along with where bots want to go
* '''cheatview''' ''class'' : cycles through all of the actors of specified class and sets the players camera to that of the given actor.
* '''viewclass''' ''class'' : see cheatview.  (In UT99 there seemed to be a distinction between this and '''cheatview'''.  See [[Legacy:Console_Commands/Cheat_Console_Commands|Console_Commands/Cheat_Console_Commands]] For more info.

==Single-Player (Ladder) [untested]==
* '''skipmatch''' : Wins and skips the current match.
* '''jumpmatch''' ''n'' : Jumps to a specific match. ''n'' is a combined number: to jump to ladder 5, rung 4, enter ''jumpmatch 54''.
* '''winmatch''' : Wins the current match.

==Assault Mode [untested]==
* '''weakobjectives''' : Unknown. Presumably makes next objective somehow easier.
* '''disablenextobjective''' : Unknown. Removes next objective from required list?

There is also an interesting extra command in the UnrealScript cheat-code handler, '''avatar''' ''class'', which appears to allow you to possess another type of pawn (e.g. a Skaarj monster, a vehicle, a turret). This does not seem to work in-game, but more testing might reveal whether/how it can be used.

'''Duralex:''' Im sure most of you already know what the command Avatar does but jest in case u dont it lets you take control of, lets say a generic monster u just spawned by typing in avatar skaarjpack.monster in the console.  It actually does work in game and will respond accordingly to all ur input such as jump crouch, etc.  On a side note if you take control of a monster you may have to edit its properties before it will allow certain actions such as the ability to crouch.

'''Weylin:''' When the avatar command is used on monsters it will only allow you to move around and not fire weapons. If you view your character from 3rd person, it will look the same as whatever your regular character is, but certain movement animations will be missing or changed. I was hoping to be able to fully control them and look like them, or can you?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Cheat Console Commands</title>
    <id>802</id>
    <revision>
      <id>2265</id>
      <timestamp>2007-12-19T20:02:32Z</timestamp>
      <contributor>
        <ip>Ip5993638b.rubicom.hu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here is a list of ''cheat'' [[Legacy:Console Commands|console commands]] available within all [[Legacy:Unreal Engine|Unreal Engine]] based games.  Not all of them have been tested across all games as yet.  Some of these commands are useful for testing maps.  See also [[Legacy:Debugging Techniques|Debugging Techniques]].

These cheats are always activated in practise matches. For network games you need to be logged in as admin, but in UT2003 network games they aren't available at all. In the UT singleplayer ladder you will have to enable them first with the '''IAmTheOne''' command.

'''Dark Pulse:''' Only in UT versions 420 and under. 425 and up no longer need '''IAmTheOne''' to enable cheats.

; AMPHIBIOUS : (Not  in Unreal 1) Enables you to breathe underwater for a very very very long time. (About 17 minutes.)
; ALLAMMO : Gives you all the ammo (999) for your current weapons.
; CAUSEEVENT &lt;event name&gt; : This console command sends the event specified to all [[Legacy:Actor|Actor]]s on a level via the Trigger() function.
; FLY : Fly around (instead of walking). Also note that you are also invulnerable to attacks in UT (not UT2003). Great for [[Legacy:Level Screenshot|Level Screenshot]]s. See WALK. As of UT2003 the space bar can no longer be used to increase your height.
; GHOST : Fly around and go through walls (see WALK).  In ghost mode you will not be able to touch (pickup) any objects.
; GOD : Makes you invincible. The conditions that you can get killed when in god mode are: telefrag, mover kills, typing in walk while in ghost mode in solid space, etc. The Killz in UT2003 onwards also causes death while in God mode. Useful for killing cheating players if they fall a long way.
; INVISIBLE : Makes you completely invisible.  This will not work in a networked game.
; LOADED : (Not Unreal 1) Gives you all the weapons and full ammo (default Max Ammo amounts) for them. As of UT2004, superweapons are only given a single shot, not 999 ammo as with the other weapons.
; SETJUMPZ &lt;height&gt; : This allows you to set the height to which you will jump.
; SETSPEED &lt;speed&gt; : This allows you to set the speed at which you move.
; SLOMO &lt;Decimal percent (1.00 is 100%)&gt; : This allows you to set the speed at which the level plays. Fun to play at 0.01
; SUMMON &lt;package&gt;.&lt;class&gt; : This command allows you to summon objects into the level.  The package and class names specified with the command are not case sensitive as of UT2004.  Not all objects are &quot;summonable&quot;.  If an object fails to appear, check your game log file for error messages. Try summoning a 'warheadlauncher' or a 'pammo'

; KILLALL &lt;package name&gt;.&lt;class name&gt; : Kills all actors of a certain class, for example &lt;code&gt;killall Botpack.WarheadLauncher&lt;/code&gt;.
; KILLPAWNS : Kills all pawns. This includes bots, monsters, assault objectives, etc.
; WALK : Returns you to normal walking mode after flying or ghosting around a level.  It's a good idea to make sure you are slightly above the ground with plenty of space around you before re-entering walk mode.
; PLAYERSONLY : Pauses all non-player actors in the game. Cool for debugging scripts, taking screenshots.
; VIEWCLASS &lt;class name&gt; : Cycle through actors of this class, on your team in teamgames, viewing from their locaton (for example, &lt;code&gt;viewclass bot&lt;/code&gt;).  Note that this command will only allow a view from an Actor that is a player or a spectator. It may also work on network games as not a cheat.
; CHEATVIEW &lt;class name&gt; : Cycle through actors of this class, on the enemy team in teamgames, viewing from their locaton (for example, &lt;code&gt;viewclass bot&lt;/code&gt;).  Note that this command will only allow a view from an Actor that is a player or a spectator.
; EDITACTOR CLASS=&lt;class&gt; : Switch UT into windowed mode first, then replace &lt;class&gt; with 'zone' to edit the zone your player is in, 'weapon' to edit the weapon you are holding, and 'pawn' to edit your current player. Be careful as you can really screw up things if you're not.
; EDITDEFAULT CLASS=&lt;class&gt; : Same as EDITACTOR, but edits the default properties for all actors of the class type. (Works in UT2003/2004; confirm for UT?)

'''Foxpaw:''' Editactor and Editdefault are listed under Debugging Console Commands. Should they be here also?

'''DemonThing:''' They could be used for cheating too. Consider &quot;EDITACTOR CLASS=xPawn&quot;. You could change your health to 10000 :p Then again, SET could also be used.

'''amitakartok:''' GOD doesn't grant complete invincibility. For example, the Vortex Generator superweapon from the ChaosUT mod works by sucking in players at a radius of 10 meters and killing them. I tested, and the vortex pulled me with FLY on, and after several quick swings around it, I touched the center and was gibbed. When I wasn't in range, something slowly dragged me down to the ground after one activation, so I think the weapon works by forcibly creating a GravityZone with a KillZone in the middle. This would imply that KillZones can override GOD, however many maps incorporate the danger of falling off but not dying with GOD, like Morpheus.</text>
    </revision>
    <revision>
      <id>2266</id>
      <timestamp>2007-09-06T04:03:19Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Cleared discussion - Updating conclusions with actual UT2004 cheat page...</comment>
      <text xml:space="preserve">Here is a list of ''cheat'' [[Legacy:Console Commands|console commands]] available within all [[Legacy:Unreal Engine|Unreal Engine]] based games.  Not all of them have been tested across all games as yet.  Some of these commands are useful for testing maps.  See also [[Legacy:Debugging Techniques|Debugging Techniques]].

These cheats are always activated in practise matches. For network games you need to be logged in as admin, but in UT2003 network games they aren't available at all. In the UT singleplayer ladder you will have to enable them first with the '''IAmTheOne''' command.

'''Dark Pulse:''' Only in UT versions 420 and under. 425 and up no longer need '''IAmTheOne''' to enable cheats.

; AMPHIBIOUS : (Not  in Unreal 1) Enables you to breathe underwater for a very very very long time. (About 17 minutes.)
; ALLAMMO : Gives you all the ammo (999) for your current weapons.
; CAUSEEVENT &lt;event name&gt; : This console command sends the event specified to all [[Legacy:Actor|Actor]]s on a level via the Trigger() function.
; FLY : Fly around (instead of walking). Also note that you are also invulnerable to attacks in UT (not UT2003). Great for [[Legacy:Level Screenshot|Level Screenshot]]s. See WALK. As of UT2003 the space bar can no longer be used to increase your height.
; GHOST : Fly around and go through walls (see WALK).  In ghost mode you will not be able to touch (pickup) any objects.
; GOD : Makes you invincible. The conditions that you can get killed when in god mode are: telefrag, mover kills, typing in walk while in ghost mode in solid space, etc. The Killz in UT2003 onwards also causes death while in God mode. Useful for killing cheating players if they fall a long way.
; INVISIBLE : Makes you completely invisible.  This will not work in a networked game.
; LOADED : (Not Unreal 1) Gives you all the weapons and full ammo (default Max Ammo amounts) for them. As of UT2004, superweapons are only given a single shot, not 999 ammo as with the other weapons.
; SETJUMPZ &lt;height&gt; : This allows you to set the height to which you will jump.
; SETSPEED &lt;speed&gt; : This allows you to set the speed at which you move.
; SLOMO &lt;Decimal percent (1.00 is 100%)&gt; : This allows you to set the speed at which the level plays. Fun to play at 0.01
; SUMMON &lt;package&gt;.&lt;class&gt; : This command allows you to summon objects into the level.  The package and class names specified with the command are not case sensitive as of UT2004.  Not all objects are &quot;summonable&quot;.  If an object fails to appear, check your game log file for error messages. Try summoning a 'warheadlauncher' or a 'pammo'

; KILLALL &lt;package name&gt;.&lt;class name&gt; : Kills all actors of a certain class, for example &lt;code&gt;killall Botpack.WarheadLauncher&lt;/code&gt;.
; KILLPAWNS : Kills all pawns. This includes bots, monsters, assault objectives, etc.
; WALK : Returns you to normal walking mode after flying or ghosting around a level.  It's a good idea to make sure you are slightly above the ground with plenty of space around you before re-entering walk mode.
; PLAYERSONLY : Pauses all non-player actors in the game. Cool for debugging scripts, taking screenshots.
; VIEWCLASS &lt;class name&gt; : Cycle through actors of this class, on your team in teamgames, viewing from their locaton (for example, &lt;code&gt;viewclass bot&lt;/code&gt;).  Note that this command will only allow a view from an Actor that is a player or a spectator. It may also work on network games as not a cheat.
; CHEATVIEW &lt;class name&gt; : Cycle through actors of this class, on the enemy team in teamgames, viewing from their locaton (for example, &lt;code&gt;viewclass bot&lt;/code&gt;).  Note that this command will only allow a view from an Actor that is a player or a spectator.
; EDITACTOR CLASS=&lt;class&gt; : Switch UT into windowed mode first, then replace &lt;class&gt; with 'zone' to edit the zone your player is in, 'weapon' to edit the weapon you are holding, and 'pawn' to edit your current player. Be careful as you can really screw up things if you're not.
; EDITDEFAULT CLASS=&lt;class&gt; : Same as EDITACTOR, but edits the default properties for all actors of the class type. (Works in UT2003/2004; confirm for UT?)

'''Foxpaw:''' Editactor and Editdefault are listed under Debugging Console Commands. Should they be here also?

'''DemonThing:''' They could be used for cheating too. Consider &quot;EDITACTOR CLASS=xPawn&quot;. You could change your health to 10000 :p Then again, SET could also be used.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Client Only Console Commands</title>
    <id>804</id>
    <revision>
      <id>2269</id>
      <timestamp>2006-01-23T18:05:45Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>info from ut2003console page</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; BEHINDVIEW &lt;0 | 1&gt; : This command provides a rather dodgy 3rd person perspective view most useful for checking out relative sizes in maps.
; BRIGHTNESS &lt;value&gt; : In UT this command can be used without the ''value'' parameter to cycle through the 10 brightness values.  In Devastation the command can take a value between 0 and 1.  If a value is not specified then a brightness of 0.5 is used.
; CONTRAST &lt;value&gt; : Sets the constrast level of the game.  It appears that values can range between 0.0 and 2.0
; DISCONNECT : Disconnect from the current server.
; ENDFULLSCREEN : Go back to playing in a window.
; FLUSH : Flush all caches. Regenerates all lighting, 3D hardware textures, etc. Can be useful to clear texture corruption due to 3D hardware driver bugs.
; FOV &lt;angle&gt; : Set the field of view, for example &lt;code&gt;fov 90&lt;/code&gt; for 90 degrees.  The server (or machine) the game is running on must have the INI option ''bAllowFOV=True'' set.
; FREECAMERA &lt;0 | 1&gt; : 'Locks' the player rotation to the current direction they are heading. Used with the BEHINDVIEW command. Generally useful for getting nice screenshots of your character at less than usual angles.
; GETCOLORDEPTHS : Get a list of color depths supported by your 3D hardware
; GETCURRENTCOLORDEPTH : Get the current color depth (16 or 32).
; GETCURRENTRES : Get the current resolution.
; HIDEACTORS : Hides '''all''' actors during game play.
; NETSPEED &lt;number&gt; : Change your desired network data rate.  Use 2600 for modem, 5000 for ISDN, 10000 for ADSL/Cable, and 20000 for LAN.
; OPEN &lt;url&gt; : Opens a local map (for example, &lt;code&gt;open dm-turbine.unr&lt;/code&gt;) or an Internet server (for example, &lt;code&gt;open 123.43.55.12&lt;/code&gt;).  Also supports querystring items like &lt;code&gt;mutator=&lt;/code&gt; and &lt;code&gt;numbots=&lt;/code&gt;
; PREFERENCES : Displays the ''Advanced Options'' window.
; RECONNECT : Reconnect to the current/previous server
; RMODE &lt;n&gt; : Change the rendering mode.  Different versions of the Urneal Engine have more or less support for this feature.  The more recent the engine the better the support will be.  The value for ''n'' can be any of the following.
;# Wireframe view. Handy for seeing what [[Legacy:Antiportal|Antiportal]]s are doing
;# Zone/Portal: [[Legacy:BSP|BSP]] is coloured by [[Legacy:Zone|Zone]]s &amp; [[Legacy:Static Mesh|Static Mesh]]es textured &amp;ndash; handy for understanding how static meshes are used in maps
;# Texture Usage: BSP is coloured by texture usage
;# BSP cuts: as 2, but BSP is all white. Weird.
;# Dynamic Light &amp;ndash; normal game mode
;# Textured mode &amp;ndash; no lighting, everything full brightness
;# [[Legacy:Lighting|lighting]] only
;# Depth Complexity &amp;ndash; shows how complex a scene is with the colour scale. Green is low complexity areas the game will have no problems rendering, red is high complexity and will most likely need some optimization.
; SHOWACTORS : Turns the display of actors back on.
; TOGGLEFULLSCREEN : Toggles fullscreen mode on and off.
; TYPE : Calls up the so called &quot;quick console&quot;.  This is a single line console that vanishes after a command has been entered.  It is normally reached by pressing TAB.</text>
    </revision>
    <revision>
      <id>2270</id>
      <timestamp>2004-10-01T22:30:49Z</timestamp>
      <contributor>
        <ip>Radiosity</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; BEHINDVIEW &lt;0 | 1&gt; : This command provides a rather dodgy 3rd person perspective view most useful for checking out relative sizes in maps.
; BRIGHTNESS &lt;value&gt; : In UT this command can be used without the ''value'' parameter to cycle through the 10 brightness values.  In Devastation the command can take a value between 0 and 1.  If a value is not specified then a brightness of 0.5 is used.
; CONTRAST &lt;value&gt; : Sets the constrast level of the game.  It appears that values can range between 0.0 and 2.0
; DISCONNECT : Disconnect from the current server.
; ENDFULLSCREEN : Go back to playing in a window.
; FLUSH : Flush all caches. Regenerates all lighting, 3D hardware textures, etc. Can be useful to clear texture corruption due to 3D hardware driver bugs.
; FOV &lt;angle&gt; : Set the field of view, for example &lt;code&gt;fov 90&lt;/code&gt; for 90 degrees.  The server (or machine) the game is running on must have the INI option ''bAllowFOV=True'' set.
; FREECAMERA &lt;0 | 1&gt; : 'Locks' the player rotation to the current direction they are heading. Used with the BEHINDVIEW command. Generally useful for getting nice screenshots of your character at less than usual angles.
; GETCOLORDEPTHS : Get a list of color depths supported by your 3D hardware
; GETCURRENTCOLORDEPTH : Get the current color depth (16 or 32).
; GETCURRENTRES : Get the current resolution.
; HIDEACTORS : Hides '''all''' actors during game play.
; NETSPEED &lt;number&gt; : Change your desired network data rate.  Use 2600 for modem, 5000 for ISDN, 10000 for ADSL/Cable, and 20000 for LAN.
; OPEN &lt;url&gt; : Opens a local map (for example, &lt;code&gt;open dm-turbine.unr&lt;/code&gt;) or an Internet server (for example, &lt;code&gt;open 123.43.55.12&lt;/code&gt;).
; PREFERENCES : Displays the ''Advanced Options'' window.
; RECONNECT : Reconnect to the current/previous server
; RMODE &lt;n&gt; : Change the rendering mode.  Different versions of the Urneal Engine have more or less support for this feature.  The more recent the engine the better the support will be.  The value for ''n'' can be any of the following.
;# Wireframe view. Handy for seeing what [[Legacy:Antiportal|Antiportal]]s are doing
;# Zone/Portal: [[Legacy:BSP|BSP]] is coloured by [[Legacy:Zone|Zone]]s &amp; [[Legacy:Static Mesh|Static Mesh]]es textured &amp;ndash; handy for understanding how static meshes are used in maps
;# Texture Usage: BSP is coloured by texture usage
;# BSP cuts: as 2, but BSP is all white. Weird.
;# Dynamic Light &amp;ndash; normal game mode
;# Textured mode &amp;ndash; no lighting, everything full brightness
;# [[Legacy:Lighting|lighting]] only
;# Depth Complexity &amp;ndash; shows how complex a scene is with the colour scale. Green is low complexity areas the game will have no problems rendering, red is high complexity and will most likely need some optimization.
; SHOWACTORS : Turns the display of actors back on.
; TOGGLEFULLSCREEN : Toggles fullscreen mode on and off.
; TYPE : Calls up the so called &quot;quick console&quot;.  This is a single line console that vanishes after a command has been entered.  It is normally reached by pressing TAB.</text>
    </revision>
    <revision>
      <id>32922</id>
      <timestamp>2008-08-28T09:26:13Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

; BEHINDVIEW &lt;0 | 1&gt; : This command provides a rather dodgy 3rd person perspective view most useful for checking out relative sizes in maps.
; BRIGHTNESS &lt;value&gt; : In UT this command can be used without the ''value'' parameter to cycle through the 10 brightness values.  In Devastation the command can take a value between 0 and 1.  If a value is not specified then a brightness of 0.5 is used.
; CONTRAST &lt;value&gt; : Sets the constrast level of the game.  It appears that values can range between 0.0 and 2.0
; DISCONNECT : Disconnect from the current server.
; ENDFULLSCREEN : Go back to playing in a window.
; FLUSH : Flush all caches. Regenerates all lighting, 3D hardware textures, etc. Can be useful to clear texture corruption due to 3D hardware driver bugs.
; FOV &lt;angle&gt; : Set the field of view, for example &lt;code&gt;fov 90&lt;/code&gt; for 90 degrees.  The server (or machine) the game is running on must have the INI option ''bAllowFOV=True'' set.
; FREECAMERA &lt;0 | 1&gt; : 'Locks' the player rotation to the current direction they are heading. Used with the BEHINDVIEW command. Generally useful for getting nice screenshots of your character at less than usual angles.
; GETCOLORDEPTHS : Get a list of color depths supported by your 3D hardware
; GETCURRENTCOLORDEPTH : Get the current color depth (16 or 32).
; GETCURRENTRES : Get the current resolution.
; SETRES &lt;value&gt; : Set the game resolution. Must be in the format '''X'''x'''Y'''. e.g. &quot;SETRES 1280x800&quot;
; HIDEACTORS : Hides '''all''' actors during game play.
; NETSPEED &lt;number&gt; : Change your desired network data rate.  Use 2600 for modem, 5000 for ISDN, 10000 for ADSL/Cable, and 20000 for LAN.
; OPEN &lt;url&gt; : Opens a local map (for example, &lt;code&gt;open dm-turbine.unr&lt;/code&gt;) or an Internet server (for example, &lt;code&gt;open 123.43.55.12&lt;/code&gt;).  Also supports querystring items like &lt;code&gt;mutator=&lt;/code&gt; and &lt;code&gt;numbots=&lt;/code&gt;
; PREFERENCES : Displays the ''Advanced Options'' window.
; RECONNECT : Reconnect to the current/previous server
; RMODE &lt;n&gt; : Change the rendering mode.  Different versions of the Urneal Engine have more or less support for this feature.  The more recent the engine the better the support will be.  The value for ''n'' can be any of the following.
;# Wireframe view. Handy for seeing what [[Legacy:Antiportal|Antiportal]]s are doing
;# Zone/Portal: [[Legacy:BSP|BSP]] is coloured by [[Legacy:Zone|Zone]]s &amp; [[Legacy:Static Mesh|Static Mesh]]es textured &amp;ndash; handy for understanding how static meshes are used in maps
;# Texture Usage: BSP is coloured by texture usage
;# BSP cuts: as 2, but BSP is all white. Weird.
;# Dynamic Light &amp;ndash; normal game mode
;# Textured mode &amp;ndash; no lighting, everything full brightness
;# [[Legacy:Lighting|lighting]] only
;# Depth Complexity &amp;ndash; shows how complex a scene is with the colour scale. Green is low complexity areas the game will have no problems rendering, red is high complexity and will most likely need some optimization.
; SHOWACTORS : Turns the display of actors back on.
; TOGGLEFULLSCREEN : Toggles fullscreen mode on and off.
; TYPE : Calls up the so called &quot;quick console&quot;.  This is a single line console that vanishes after a command has been entered.  It is normally reached by pressing TAB.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Debugging Console Commands</title>
    <id>806</id>
    <revision>
      <id>2274</id>
      <timestamp>2007-01-24T16:17:26Z</timestamp>
      <contributor>
        <ip>Totoro.mxnet.mel.nist.gov</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the debugging [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].  The ''Cheat Manager'' column only applies to UT2003/4.  In other incarnations of the Unreal Engine it is enough to be logged in as admin and have cheats enabled on the &quot;server&quot;.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Command'''
| style=&quot;text-align: center&quot; |'''Description'''
| style=&quot;text-align: center&quot; |'''Example'''
| style=&quot;text-align: center&quot; |'''CheatManager?''' 
|-
|JUMPTO &lt;x&gt; &lt;y&gt; &lt;z&gt;
|In UnrealEd, move the viewport to a certain location, useful in conjunction with tester reports generated with the REPORT command.
|&lt;tt&gt;JUMPTO 0 0 0&lt;/tt&gt;
| style=&quot;text-align: center&quot; |n/a 
|-
|ShowDebug
|Lists lots of info about the actor. See [[Legacy:ShowDebug|ShowDebug]] for more. See &quot;Using DisplayDebug&quot; on [[Legacy:Debugging Techniques|Debugging Techniques]] for an explanation on how to add your own information to ShowDebug
|&lt;tt&gt;ShowDebug&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|ShowLog
|Shows the last lines of the ongoing game log in a separate window.
|&lt;tt&gt;ShowLog&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|LogScriptedSequences
|Toggles on/off the logging of AI scripts.
|&lt;tt&gt;LogScriptedSequences&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|-
|Graph Show
|Displays a graph with different values plotted as lines
|&lt;tt&gt;Graph Show&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|PlayersOnly
|Toggles the update (tick) of non Player actors (like bots and projectiles).
|&lt;tt&gt;PlayersOnly&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|-
|SloMo &lt;value&gt;
|Set the engine speed relative to normal speed.
|&lt;tt&gt;SloMo 0.5&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|-
|Set
|Set the value of all objects of a given class (and all of its subclasses, 1st param) and the class default values themselves to the value passed (2nd param).
|&lt;tt&gt;Set MyObject bVar False&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditActor Class=&lt;classname&gt;
|Displays an editable property sheet for the property values of the nearest actor of the given class.
|&lt;tt&gt;EditActors Class=RocketLauncher&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditActor Name=&lt;classname&gt;
|Displays an editable property sheet for the property values of the given actor. (You may have to run UT2003 with the &lt;code&gt;-makenames-&lt;/code&gt; command line parameter to have it assign unique names to every dynamically spawned actor.)
|&lt;tt&gt;EditActors Name=xPlayerReplicationInfo0&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditDefault Class=&lt;classname&gt;
|Displays an editable property sheet for the default values of the given class.
|&lt;tt&gt;EditDefault Class=LinkProjectile&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditObj &lt;objectname&gt;
|Displays an editable property sheet for the given object.  Like EditActor, but works for non-Actor objects too.  (See EditActor.)
|&lt;tt&gt;EditObj xDeathMatch0&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|render blend
|This toggles the rendering of normals on meshes, for skeletal meshes, they are colored with the number of influences (green =1, red=2, pink=3, light blue=4, white for 5+ )
|&lt;tt&gt;rend blend&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|render bone
|Toggles the rendering of bones (suppresses rendering the regular mesh), where each bone's origin shows the local coordinate system with a small axis system, X,Y,Z = red,green,blue. Also, a purple 'root' line is drawn from the mesh's local space origin to the the 0th/root bone
|&lt;tt&gt;rend bone&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|ReviewJumpSpots [Transloc/Jump/Combo/LowGrav]
|(only UT2004? [[Legacy:Answer Needed|Answer needed]]) Spawns a bot that will try moving towards all [[Legacy:JumpSpot|JumpSpot]]s. The parameter specifies, whether the bot should use the translocator, impact jumping + double jumping, the speed adrenaline combo or low-grav while testing the JumpSpots. If no parameter is specified, the bot will perform perform test runs for all four conditions.
|&lt;tt&gt;ReviewJumpSpots Jump&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|}

'''Warning:''' To use the property sheets you must be running the game in windowed mode. If you are in fullscreen mode, hit &lt;tt&gt;Alt+Enter&lt;/tt&gt;.

'''Warning:''' The game may crash when you try to look at the property of some classes, for instance [[Legacy:Controller|Controller]] subclasses.

Remember that the toggle commands can be bound to a key (see [[Legacy:Binding Keys|Binding Keys]]). Example: 

  set input G PlayersOnly

See also [[Legacy:Debugging Techniques|Debugging Techniques]]

'''Note:''' if your EditActor windows were to not appear even if you don't get any error mesage, they are probably displayed somewhere, far away... ; in user.ini, in [WindowPositions], change the values of EditActor by EditActor=(X=748,Y=108,XL=352,YL=512)

''' Some Idiot named h/Z:''' What about rmodes? like the wireframe or the portal views?

''' EricBlade:''' What's the &quot;REPORT&quot; command mentioned on top?

'''Wormbo:''' Seems to copy a short report to the clipboard.</text>
    </revision>
    <revision>
      <id>2275</id>
      <timestamp>2006-11-15T22:43:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the debugging [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].  The ''Cheat Manager'' column only applies to UT2003/4.  In other incarnations of the Unreal Engine it is enough to be logged in as admin and have cheats enabled on the &quot;server&quot;.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Command'''
| style=&quot;text-align: center&quot; |'''Description'''
| style=&quot;text-align: center&quot; |'''Example'''
| style=&quot;text-align: center&quot; |'''CheatManager?''' 
|-
|JUMPTO &lt;x&gt; &lt;y&gt; &lt;z&gt;
|In UnrealEd, move the viewport to a certain location, useful in conjunction with tester reports generated with the REPORT command.
|&lt;tt&gt;JUMPTO 0 0 0&lt;/tt&gt;
| style=&quot;text-align: center&quot; |n/a 
|-
|ShowDebug
|Lists lots of info about the actor. See [[Legacy:ShowDebug|ShowDebug]] for more. See &quot;Using DisplayDebug&quot; on [[Legacy:Debugging Techniques|Debugging Techniques]] for an explanation on how to add your own information to ShowDebug
|&lt;tt&gt;ShowDebug&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|ShowLog
|Shows the last lines of the ongoing game log in a separate window.
|&lt;tt&gt;ShowLog&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|LogScriptedSequences
|Toggles on/off the logging of AI scripts.
|&lt;tt&gt;LogScriptedSequences&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|-
|Graph Show
|Displays a graph with different values plotted as lines
|&lt;tt&gt;Graph Show&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|PlayersOnly
|Toggles the update (tick) of non Player actors (like bots and projectiles).
|&lt;tt&gt;PlayersOnly&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|-
|SloMo &lt;value&gt;
|Set the engine speed relative to normal speed.
|&lt;tt&gt;SloMo 0.5&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|-
|Set
|Set the value of all objects of a given class (and all of its subclasses, 1st param) and the class default values themselves to the value passed (2nd param).
|&lt;tt&gt;Set MyObject bVar False&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditActor Class=&lt;classname&gt;
|Displays an editable property sheet for the property values of the nearest actor of the given class.
|&lt;tt&gt;EditActors Class=RocketLauncher&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditActor Name=&lt;classname&gt;
|Displays an editable property sheet for the property values of the given actor. (You may have to run UT2003 with the &lt;code&gt;-makenames-&lt;/code&gt; command line parameter to have it assign unique names to every dynamically spawned actor.)
|&lt;tt&gt;EditActors Name=xPlayerReplicationInfo0&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditDefault Class=&lt;classname&gt;
|Displays an editable property sheet for the default values of the given class.
|&lt;tt&gt;EditDefault Class=LinkProjectile&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|EditObj &lt;objectname&gt;
|Displays an editable property sheet for the given object.  Like EditActor, but works for non-Actor objects too.  (See EditActor.)
|&lt;tt&gt;EditObj xDeathMatch0&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|render blend
|This toggles the rendering of normals on meshes, for skeletal meshes, they are colored with the number of influences (green =1, red=2, pink=3, light blue=4, white for 5+ )
|&lt;tt&gt;rend blend&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|render bone
|Toggles the rendering of bones (suppresses rendering the regular mesh), where each bone's origin shows the local coordinate system with a small axis system, X,Y,Z = red,green,blue. Also, a purple 'root' line is drawn from the mesh's local space origin to the the 0th/root bone
|&lt;tt&gt;rend bone&lt;/tt&gt;
| style=&quot;text-align: center&quot; |No 
|-
|ReviewJumpSpots [Transloc/Jump/Combo/LowGrav]
|(only UT2004? [[Legacy:Answer Needed|Answer needed]]) Spawns a bot that will try moving towards all [[Legacy:JumpSpot|JumpSpot]]s. The parameter specifies, whether the bot should use the translocator, impact jumping + double jumping, the speed adrenaline combo or low-grav while testing the JumpSpots. If no parameter is specified, the bot will perform perform test runs for all four conditions.
|&lt;tt&gt;ReviewJumpSpots Jump&lt;/tt&gt;
| style=&quot;text-align: center&quot; |Yes 
|}

'''Warning:''' To use the property sheets you must be running the game in windowed mode. If you are in fullscreen mode, hit &lt;tt&gt;Alt+Enter&lt;/tt&gt;.

'''Warning:''' The game may crash when you try to look at the property of some classes, for instance [[Legacy:Controller|Controller]] subclasses.

Remember that the toggle commands can be bound to a key (see [[Legacy:Binding Keys|Binding Keys]]). Example: 

  set input G PlayersOnly

See also [[Legacy:Debugging Techniques|Debugging Techniques]]

''' Some Idiot named h/Z:''' What about rmodes? like the wireframe or the portal views?

''' EricBlade:''' What's the &quot;REPORT&quot; command mentioned on top?

'''Wormbo:''' Seems to copy a short report to the clipboard.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/General Console Commands</title>
    <id>801</id>
    <revision>
      <id>2263</id>
      <timestamp>2006-08-26T02:23:44Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

===General ===

; SAY &lt;message string&gt; : Broadcast a message to other players in the game.
; SETNAME &lt;newname&gt; || NAME &lt;newname&gt;: Change your name (works in network play too).
; SUICIDE : Commit suicide.
; TEAMSAY &lt;message string&gt; : Broadcast a message to your teammates.
; PAUSE : This pauses the current game.  In networked games you will have to be logged in as an administrator to use this command.  See [[Legacy:Console Commands/Admin Console Commands|Console Commands/Admin Console Commands]].
; THROWWEAPON : This command throws your current weapon to the ground.
; SHOT : This command saves a screenshot into the Unreal Engine game's System directory.
; FOV : This command changes your field of view.  NOTE: In Devastation this command is largely disabled.
; RELOAD : This command can be used to reload the current weapon.  Not implemented in all Unreal Engine games although available for mods.
; ACTIVATEITEM : This command can be used to activate the currently selected inventory item.  Not implemented in all Unreal Engine games although available for mods.
; USE : Causes any ScriptedSequence in contact with the player's pawn to call it's '''UsedBy''' function. This is intended for triggers that need to be explicityly activated by a button press.

===Input ===

; KEYNUMBER &lt;keyname&gt; : Returns Interactions.EInputKey index.
; KEYNAME &lt;keyindex&gt; : Returns specifed Interactions.EInputKey in meatbag-friendly form.
; LOCALIZEDKEYNAME &lt;keyindex&gt; : Returns specifed Interactions.EInputKey in localized, meatbag-friendly form (unconfirmed).
; KEYBINDING &lt;keyname&gt; : Returns action bound to specified key.
; BINDINGTOKEY &lt;action&gt; : Returns comma-separated list of keys with specified action bound to them.
; COUNTBINDINGTOKEY &lt;action&gt; : Returns numbers of keys with specified action bound to them.
; FINDKEYBINDS &lt;text&gt; : Returns comma-separated list of actions with names starting with &quot;text&quot;.</text>
    </revision>
    <revision>
      <id>2264</id>
      <timestamp>2005-11-12T05:12:20Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>Imput stuff</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] that are in general use across all versions of the [[Legacy:Unreal Engine|Unreal Engine]].

===General ===

; SAY &lt;message string&gt; : Broadcast a message to other players in the game.
; SETNAME &lt;newname&gt; || NAME &lt;newname&gt;: Change your name (works in network play too).
; SUICIDE : Commit suicide.
; TEAMSAY &lt;message string&gt; : Broadcast a message to your teammates.
; PAUSE : This pauses the current game.  In networked games you will have to be logged in as an administrator to use this command.  See [[Legacy:Console Commands/Admin Console Commands|Console Commands/Admin Console Commands]].
; THROWWEAPON : This command throws your current weapon to the ground.
; SHOT : This command saves a screenshot into the Unreal Engine game's System directory.
; FOV : This command changes your field of view.  NOTE: In Devastation this command is largely disabled.
; RELOAD : This command can be used to reload the current weapon.  Not implemented in all Unreal Engine games although available for mods. '''Should this be included here then?'''
; ACTIVATEITEM : This command can be used to activate the currently selected inventory item.  Not implemented in all Unreal Engine games although available for mods. '''Should this be included here then?'''
; USE : Causes any ScriptedSequence in contact with the player's pawn to call it's '''UsedBy''' function. This is intended for triggers that need to be explicityly activated by a button press.

===Input ===

; KEYNUMBER &lt;keyname&gt; : Returns Interactions.EInputKey index.
; KEYNAME &lt;keyindex&gt; : Returns specifed Interactions.EInputKey in meatbag-friendly form.
; LOCALIZEDKEYNAME &lt;keyindex&gt; : Returns specifed Interactions.EInputKey in localized, meatbag-friendly form (unconfirmed).
; KEYBINDING &lt;keyname&gt; : Returns action bound to specified key.
; BINDINGTOKEY &lt;action&gt; : Returns comma-separated list of keys with specified action bound to them.
; COUNTBINDINGTOKEY &lt;action&gt; : Returns numbers of keys with specified action bound to them.
; FINDKEYBINDS &lt;text&gt; : Returns comma-separated list of actions with names starting with &quot;text&quot;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Stats Console Commands</title>
    <id>805</id>
    <revision>
      <id>2271</id>
      <timestamp>2005-11-23T05:38:41Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] for [[Legacy:UT2004|UT2004]] that can be used to show statistics about the game currently playing.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands (UT)]] for the corresponding UT console command listing.

==Misc Commands==
; MEMSTAT : Show Windows overall memory statistics.

; OBJ CLASSES : Prints a list of all loaded classes.
; OBJ DEPENDENCIES PACKAGE=&lt;pkgname&gt; EXCLUDE1=&lt;otherpackage&gt; EXCLUDE2=&lt;otherpackage&gt;... : Show package dependencies
; OBJ GARBAGE : Initiates [[Legacy:Garbage Collection|garbage collection]].
; OBJ HASH : Show object hashing statistics.
; OBJ LINKERS : Show a list of active linkers (each linker is responsible for loading objects from a package file).
; OBJ LIST CLASS=&lt;objectclass&gt; INSIDE=&lt;insideclass&gt; : List all objects belonging to the class and residing inside the specified object.  If the class isn't specified, lists ''all'' objects.  If the inside object isn't specified, shows all objects.  Gives a summary of memory usage.  This is very useful during game play for figuring out how much memory is being used.  In UnrealEd, this statistic isn't useful because a huge amount of extra stuff is loaded which might not be used by your map.
; OBJ REFS CLASS=&lt;objectclass&gt; NAME=&lt;objectname&gt; : Show a list of objects which reference the object you specify.  When trimming memory usage, this is useful for figuring out why some object is being loaded.

; REPORT : Copies a report of the current gameplay situation to the clipboard. You can then paste the resulting text into an email program, Notepad, etc. Extremely useful for beta testers, because it dumps the player's location, the difficulty level, etc.

==STAT Commands==

; STAT ALL : Enables all STATS displays except ANIM.
; STAT NONE : Disables all STATS displays.
; STAT DEFAULT
; STAT RESET : Disables all STAT displays except FPS.

; STAT ANIM : Toggles animation statistics display for all actors with DrawType DT_Mesh.

; STAT AUDIO : Toggles audio statistics display.
;; Audio : 
;;; Update ms : 
;;; Occlusion ms : 
;;; Sources Active : 
;;; Sources Stopped : 
;;; Sources Started : 

; STAT FPS : Toggles display of current and average number of frames per second.

; STAT GAME : Toggles game engine statistics display.
;; Collision : 
;;; StaticMesh ms : 
;;; StaticMesh Cache Hits : 
;;; StaticMesh Cache Misses : 
;;; StaticMesh Cache Flushes : 
;;; BSP ms : 
;;; Terrain ms : 
;;; Corona ms : 
;; Karma : 
;;; KTriListQuery ms : 
;;; KUpdateContracts ms : 
;;;   KIntersect ms : 
;;; KWorldStepSafeTime ms : 
;;;   PreKarmaStep ms : 
;;;   ConstraintSolver ms : 
;;;   FindModelSafetime ms : 
;;;   PostKarmaStep ms : 
;;; physKarma ms : 
;;; Temp ms : 
;; LIPSinc : 
;;; Active : 
;;; CurveEval ms : 
;;; BlendIn ms : 
;;; NormalBlend ms : 
;;; BlendOut ms : 
;;; TotalBlend ms : 
;;; Update ms : 
;;; BlendFinal ms : 
;;; Total ms : 
;; Fluid : 
;;; Simulate ms : 
;;; VertexGen ms : 
;;; Render ms : 
;; Game : 
;;; Script ms : 
;;; ScriptTick ms : 
;;; Actor ms : 
;;; Path ms : 
;;; See ms : 
;;; Spawning ms : 
;;; Audio ms : 
;;; CleanupDestroyed ms : 
;;; Unused ms : 
;;; Net ms : 
;;; Particle ms : 
;;; Canvas ms : 
;;; Physics ms : 
;;; Move ms : 
;;; Move : 
;;; MLChecks ms : 
;;; MPChecks ms : 
;;; RenderData ms : 
;;; HUD PostRender ms : 
;;; Interaction Pre ms : 
;;; Interaction Post ms : 
;;; ScriptDebug ms : 

; STAT HARDWARE : Toggles hardware accelerator statistics display.
;; Hardware : 
;;; NumPrimitives : 
;;; NumSVPVertices : 
;;; NumTextures : 
;;; KByte TexturesBytes : 
;;; KByte Total Resources : 
;;; PushState ms [''num''] : 
;;; PopState ms [''num''] : 
;;; SetRenderTarget ms [''num''] : 
;;; SetMaterial ms [''num''] : 
;;; SetMaterialBlending ms [''num''] : 
;;; SetVertexStream ms [''num''] : 
;;; SetDynStream ms [''num''] : 
;;; SetIB ms [''num''] : 
;;; SetDynIB ms [''num''] : 
;;; DrawPrimitive ms [''num''] : 
;;; Lock ms [''num''] : 
;;; Unlock ms [''num''] : 
;;; Present ms [''num''] : 
;;; StateChanges ms [''num''] : 
;;; TextureChanges ms [''num''] : 
;;; TransformChanges ms [''num''] : 
;;; LightChanges ms [''num''] : 
;;; LightSet ms [''num''] : 
;;; Clear ms [''num''] : 
;;; DynVBLock ms [''num''] : 
;;; DynVBDiscards : 
;;; KByte DynVBBytes : 
;;; KByte DynIBBytes : 
;;; NumVertexStreams : 
;;; NumIndexBuffers : 
;;; KByte VertexStreamBytes : 
;;; KByte IndexBufferBytes : 
;;; StreamSourceChanges : 

; STAT LIGHT : Toggles the list of lights that are affecting the player.
             ''The command crashes with a GPF when a model (player, bot,...) is displayed.''
             ''It only works with the Flak Cannon.''
;; mesh:
;; actor:
;; sphereradious:
;;; [light actor]:
;;; Rad:
;;; Col:
;;; Alph:
;;; Dst:
;;; ky:
;;; br:

; STAT NET : Toggles network performance statistics display.
;; Net : 
;;; Ping : 
;;; Channels : 
;;; Unordered : 
;;; PacketLoss : 
;;; Packets : 
;;; Bunches : 
;;; Bytes : 
;;; Speed : 
;;; Reps : 
;;; RPC : 
;;; PV : 
;;; VoiceBunches : 
;;; VoiceTime ms : 
;;; ControlTime ms : 

; STAT RENDER : Toggles rendering statistics display.
;; Frame : 
;;; Frame ms : 
;;; Render ms : 
;;; Stats Render ms : 
;; BSP : 
;;; Render ms : 
;;; Sections : 
;;; Nodes : 
;;; Triangles : 
;;; DynamicLighting ms : 
;;; DynamicLightings : 
;; LightMap : 
;;; Time ms : 
;;; Updates : 
;; Projector : 
;;; Render ms : 
;;; Attach ms : 
;;; Projectors : 
;;; Triangles : 
;; Stencil : 
;;; Render ms : 
;;; Nodes : 
;;; Triangles : 
;; Visibility : 
;;; Setup ms : 
;;; MaskTests : 
;;; MaskRejects : 
;;; BoxTests : 
;;; BoxRejects : 
;;; Traverse ms : 
;;; ScratchBytes : 
;;; MeshLight ms : 
;; Terrain : 
;;; Render ms : 
;;; Sectors : 
;;; Triangles : 
;;; DrawPrimitives : 
;; DecoLayer : 
;;; Render ms : 
;;; Triangles : 
;;; Decorations : 
;; Mesh : 
;;; Skin ms : 
;;; Result ms : 
;;; LOD ms : 
;;; Pose ms : 
;;; Skel ms : 
;;; Rigid ms : 
;;; Draw ms : 
;; Particle : 
;;; SpriteSetup ms : 
;;; Particles : 
;;; ParticlesTicked : 
;;; Render ms : 
;; StaticMesh : 
;;; Triangles : 
;;; Triangles ms : 
;;; Batches : 
;;; BatchedSortedTriangles : 
;;; BatchedSortedSections : 
;;; BatchedSort ms : 
;;; BatchUnsortedSections : 
;;; BatchedUnortedTriangles : 
;;; BatchRender ms : 

;;; UnbatchedSortedTriangles : 
;;; UnbatchedSortedSections : 
;;; UnbatchedSort ms : 
;;; UnbatchedUnsortedSections : 
;;; UnbatchedUnsortedTriangles : 
;;; UnbatchedRender ms : 
;; Batch : 
;;; Batches : 
;;; Primitives : 
;;; Render ms : 

; STAT XBOXMEM : 

==Discussion==

'''SuperApe:''' Really could use definitions on these for debugging purposes.

----

[[:Category:Legacy To Do]] &amp;ndash; Fill in definitions
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2272</id>
      <timestamp>2005-02-06T10:07:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>added displayed stats fields</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] for [[Legacy:UT2004|UT2004]] that can be used to show statistics about the game currently playing.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands (UT)]] for the corresponding UT console command listing.

==Misc Commands==
; MEMSTAT : Show Windows overall memory statistics.

; OBJ CLASSES : Prints a list of all loaded classes.
; OBJ DEPENDENCIES PACKAGE=&lt;pkgname&gt; EXCLUDE1=&lt;otherpackage&gt; EXCLUDE2=&lt;otherpackage&gt;... : Show package dependencies
; OBJ GARBAGE : Initiates [[Legacy:Garbage Collection|garbage collection]].
; OBJ HASH : Show object hashing statistics.
; OBJ LINKERS : Show a list of active linkers (each linker is responsible for loading objects from a package file).
; OBJ LIST CLASS=&lt;objectclass&gt; INSIDE=&lt;insideclass&gt; : List all objects belonging to the class and residing inside the specified object.  If the class isn't specified, lists ''all'' objects.  If the inside object isn't specified, shows all objects.  Gives a summary of memory usage.  This is very useful during game play for figuring out how much memory is being used.  In UnrealEd, this statistic isn't useful because a huge amount of extra stuff is loaded which might not be used by your map.
; OBJ REFS CLASS=&lt;objectclass&gt; NAME=&lt;objectname&gt; : Show a list of objects which reference the object you specify.  When trimming memory usage, this is useful for figuring out why some object is being loaded.

; REPORT : Copies a report of the current gameplay situation to the clipboard. You can then paste the resulting text into an email program, Notepad, etc. Extremely useful for beta testers, because it dumps the player's location, the difficulty level, etc.

==STAT Commands==

; STAT ALL : Enables all STATS displays except ANIM.
; STAT NONE : Disables all STATS displays.
; STAT DEFAULT
; STAT RESET : Disables all STAT displays except FPS.

; STAT ANIM : Toggles animation statistics display for all actors with DrawType DT_Mesh.

; STAT AUDIO : Toggles audio statistics display.
;; Audio : 
;;; Update ms : 
;;; Occlusion ms : 
;;; Sources Active : 
;;; Sources Stopped : 
;;; Sources Started : 

; STAT FPS : Toggles display of current and average number of frames per second.

; STAT GAME : Toggles game engine statistics display.
;; Collision : 
;;; StaticMesh ms : 
;;; StaticMesh Cache Hits : 
;;; StaticMesh Cache Misses : 
;;; StaticMesh Cache Flushes : 
;;; BSP ms : 
;;; Terrain ms : 
;;; Corona ms : 
;; Karma : 
;;; KTriListQuery ms : 
;;; KUpdateContracts ms : 
;;;   KIntersect ms : 
;;; KWorldStepSafeTime ms : 
;;;   PreKarmaStep ms : 
;;;   ConstraintSolver ms : 
;;;   FindModelSafetime ms : 
;;;   PostKarmaStep ms : 
;;; physKarma ms : 
;;; Temp ms : 
;; LIPSinc : 
;;; Active : 
;;; CurveEval ms : 
;;; BlendIn ms : 
;;; NormalBlend ms : 
;;; BlendOut ms : 
;;; TotalBlend ms : 
;;; Update ms : 
;;; BlendFinal ms : 
;;; Total ms : 
;; Fluid : 
;;; Simulate ms : 
;;; VertexGen ms : 
;;; Render ms : 
;; Game : 
;;; Script ms : 
;;; ScriptTick ms : 
;;; Actor ms : 
;;; Path ms : 
;;; See ms : 
;;; Spawning ms : 
;;; Audio ms : 
;;; CleanupDestroyed ms : 
;;; Unused ms : 
;;; Net ms : 
;;; Particle ms : 
;;; Canvas ms : 
;;; Physics ms : 
;;; Move ms : 
;;; Move : 
;;; MLChecks ms : 
;;; MPChecks ms : 
;;; RenderData ms : 
;;; HUD PostRender ms : 
;;; Interaction Pre ms : 
;;; Interaction Post ms : 
;;; ScriptDebug ms : 

; STAT HARDWARE : Toggles hardware accelerator statistics display.
;; Hardware : 
;;; NumPrimitives : 
;;; NumSVPVertices : 
;;; NumTextures : 
;;; KByte TexturesBytes : 
;;; KByte Total Resources : 
;;; PushState ms [''num''] : 
;;; PopState ms [''num''] : 
;;; SetRenderTarget ms [''num''] : 
;;; SetMaterial ms [''num''] : 
;;; SetMaterialBlending ms [''num''] : 
;;; SetVertexStream ms [''num''] : 
;;; SetDynStream ms [''num''] : 
;;; SetIB ms [''num''] : 
;;; SetDynIB ms [''num''] : 
;;; DrawPrimitive ms [''num''] : 
;;; Lock ms [''num''] : 
;;; Unlock ms [''num''] : 
;;; Present ms [''num''] : 
;;; StateChanges ms [''num''] : 
;;; TextureChanges ms [''num''] : 
;;; TransformChanges ms [''num''] : 
;;; LightChanges ms [''num''] : 
;;; LightSet ms [''num''] : 
;;; Clear ms [''num''] : 
;;; DynVBLock ms [''num''] : 
;;; DynVBDiscards : 
;;; KByte DynVBBytes : 
;;; KByte DynIBBytes : 
;;; NumVertexStreams : 
;;; NumIndexBuffers : 
;;; KByte VertexStreamBytes : 
;;; KByte IndexBufferBytes : 
;;; StreamSourceChanges : 

; STAT LIGHT : ''This only seems to crash the game with a GPF.''

; STAT NET : Toggles network performance statistics display.
;; Net : 
;;; Ping : 
;;; Channels : 
;;; Unordered : 
;;; PacketLoss : 
;;; Packets : 
;;; Bunches : 
;;; Bytes : 
;;; Speed : 
;;; Reps : 
;;; RPC : 
;;; PV : 
;;; VoiceBunches : 
;;; VoiceTime ms : 
;;; ControlTime ms : 

; STAT RENDER : Toggles rendering statistics display.
;; Frame : 
;;; Frame ms : 
;;; Render ms : 
;;; Stats Render ms : 
;; BSP : 
;;; Render ms : 
;;; Sections : 
;;; Nodes : 
;;; Triangles : 
;;; DynamicLighting ms : 
;;; DynamicLightings : 
;; LightMap : 
;;; Time ms : 
;;; Updates : 
;; Projector : 
;;; Render ms : 
;;; Attach ms : 
;;; Projectors : 
;;; Triangles : 
;; Stencil : 
;;; Render ms : 
;;; Nodes : 
;;; Triangles : 
;; Visibility : 
;;; Setup ms : 
;;; MaskTests : 
;;; MaskRejects : 
;;; BoxTests : 
;;; BoxRejects : 
;;; Traverse ms : 
;;; SctarchBytes : 
;;; MeshLight ms : 
;; Terrain : 
;;; Render ms : 
;;; Sectors : 
;;; Triangles : 
;;; DrawPrimitives : 
;; DecoLayer : 
;;; Render ms : 
;;; Triangles : 
;;; Decorations : 
;; Mesh : 
;;; Skin ms : 
;;; Result ms : 
;;; LOD ms : 
;;; Pose ms : 
;;; Skel ms : 
;;; Rigid ms : 
;;; Draw ms : 
;; Particle : 
;;; SpriteSetup ms : 
;;; Particles : 
;;; ParticlesTicked : 
;;; Render ms : 
;; StaticMesh : 
;;; Triangles : 
;;; Triangles ms : 
;;; Batches : 
;;; BatchedSortedTriangles : 
;;; BatchedSortedSections : 
;;; BatchedSort ms : 
;;; BatchUnsortedSections : 
;;; BatchedUnortedTriangles : 
;;; BatchRender ms : 

;;; UnbatchedSortedTriangles : 
;;; UnbatchedSortedSections : 
;;; UnbatchedSort ms : 
;;; UnbatchedUnsortedSections : 
;;; UnbatchedUnsortedTriangles : 
;;; UnbatchedRender ms : 
;; Batch : 
;;; Batches : 
;;; Primitives : 
;;; Render ms : 

; STAT XBOXMEM :</text>
    </revision>
    <revision>
      <id>2273</id>
      <timestamp>2005-08-27T07:12:50Z</timestamp>
      <contributor>
        <ip>80-103-225-30.mad2.dialup.uni2.es</ip>
      </contributor>
      <comment>We know what Stat Light says....</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] for [[Legacy:UT2004|UT2004]] that can be used to show statistics about the game currently playing.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands (UT)]] for the corresponding UT console command listing.

==Misc Commands==
; MEMSTAT : Show Windows overall memory statistics.

; OBJ CLASSES : Prints a list of all loaded classes.
; OBJ DEPENDENCIES PACKAGE=&lt;pkgname&gt; EXCLUDE1=&lt;otherpackage&gt; EXCLUDE2=&lt;otherpackage&gt;... : Show package dependencies
; OBJ GARBAGE : Initiates [[Legacy:Garbage Collection|garbage collection]].
; OBJ HASH : Show object hashing statistics.
; OBJ LINKERS : Show a list of active linkers (each linker is responsible for loading objects from a package file).
; OBJ LIST CLASS=&lt;objectclass&gt; INSIDE=&lt;insideclass&gt; : List all objects belonging to the class and residing inside the specified object.  If the class isn't specified, lists ''all'' objects.  If the inside object isn't specified, shows all objects.  Gives a summary of memory usage.  This is very useful during game play for figuring out how much memory is being used.  In UnrealEd, this statistic isn't useful because a huge amount of extra stuff is loaded which might not be used by your map.
; OBJ REFS CLASS=&lt;objectclass&gt; NAME=&lt;objectname&gt; : Show a list of objects which reference the object you specify.  When trimming memory usage, this is useful for figuring out why some object is being loaded.

; REPORT : Copies a report of the current gameplay situation to the clipboard. You can then paste the resulting text into an email program, Notepad, etc. Extremely useful for beta testers, because it dumps the player's location, the difficulty level, etc.

==STAT Commands==

; STAT ALL : Enables all STATS displays except ANIM.
; STAT NONE : Disables all STATS displays.
; STAT DEFAULT
; STAT RESET : Disables all STAT displays except FPS.

; STAT ANIM : Toggles animation statistics display for all actors with DrawType DT_Mesh.

; STAT AUDIO : Toggles audio statistics display.
;; Audio : 
;;; Update ms : 
;;; Occlusion ms : 
;;; Sources Active : 
;;; Sources Stopped : 
;;; Sources Started : 

; STAT FPS : Toggles display of current and average number of frames per second.

; STAT GAME : Toggles game engine statistics display.
;; Collision : 
;;; StaticMesh ms : 
;;; StaticMesh Cache Hits : 
;;; StaticMesh Cache Misses : 
;;; StaticMesh Cache Flushes : 
;;; BSP ms : 
;;; Terrain ms : 
;;; Corona ms : 
;; Karma : 
;;; KTriListQuery ms : 
;;; KUpdateContracts ms : 
;;;   KIntersect ms : 
;;; KWorldStepSafeTime ms : 
;;;   PreKarmaStep ms : 
;;;   ConstraintSolver ms : 
;;;   FindModelSafetime ms : 
;;;   PostKarmaStep ms : 
;;; physKarma ms : 
;;; Temp ms : 
;; LIPSinc : 
;;; Active : 
;;; CurveEval ms : 
;;; BlendIn ms : 
;;; NormalBlend ms : 
;;; BlendOut ms : 
;;; TotalBlend ms : 
;;; Update ms : 
;;; BlendFinal ms : 
;;; Total ms : 
;; Fluid : 
;;; Simulate ms : 
;;; VertexGen ms : 
;;; Render ms : 
;; Game : 
;;; Script ms : 
;;; ScriptTick ms : 
;;; Actor ms : 
;;; Path ms : 
;;; See ms : 
;;; Spawning ms : 
;;; Audio ms : 
;;; CleanupDestroyed ms : 
;;; Unused ms : 
;;; Net ms : 
;;; Particle ms : 
;;; Canvas ms : 
;;; Physics ms : 
;;; Move ms : 
;;; Move : 
;;; MLChecks ms : 
;;; MPChecks ms : 
;;; RenderData ms : 
;;; HUD PostRender ms : 
;;; Interaction Pre ms : 
;;; Interaction Post ms : 
;;; ScriptDebug ms : 

; STAT HARDWARE : Toggles hardware accelerator statistics display.
;; Hardware : 
;;; NumPrimitives : 
;;; NumSVPVertices : 
;;; NumTextures : 
;;; KByte TexturesBytes : 
;;; KByte Total Resources : 
;;; PushState ms [''num''] : 
;;; PopState ms [''num''] : 
;;; SetRenderTarget ms [''num''] : 
;;; SetMaterial ms [''num''] : 
;;; SetMaterialBlending ms [''num''] : 
;;; SetVertexStream ms [''num''] : 
;;; SetDynStream ms [''num''] : 
;;; SetIB ms [''num''] : 
;;; SetDynIB ms [''num''] : 
;;; DrawPrimitive ms [''num''] : 
;;; Lock ms [''num''] : 
;;; Unlock ms [''num''] : 
;;; Present ms [''num''] : 
;;; StateChanges ms [''num''] : 
;;; TextureChanges ms [''num''] : 
;;; TransformChanges ms [''num''] : 
;;; LightChanges ms [''num''] : 
;;; LightSet ms [''num''] : 
;;; Clear ms [''num''] : 
;;; DynVBLock ms [''num''] : 
;;; DynVBDiscards : 
;;; KByte DynVBBytes : 
;;; KByte DynIBBytes : 
;;; NumVertexStreams : 
;;; NumIndexBuffers : 
;;; KByte VertexStreamBytes : 
;;; KByte IndexBufferBytes : 
;;; StreamSourceChanges : 

; STAT LIGHT : Toggles the list of lights that are affecting the player.
             ''The command crashes with a GPF when a model (player, bot,...) is displayed.''
             ''It only works with the Flak Cannon.''
;; mesh:
;; actor:
;; sphereradious:
;;; [light actor]:
;;; Rad:
;;; Col:
;;; Alph:
;;; Dst:
;;; ky:
;;; br:

; STAT NET : Toggles network performance statistics display.
;; Net : 
;;; Ping : 
;;; Channels : 
;;; Unordered : 
;;; PacketLoss : 
;;; Packets : 
;;; Bunches : 
;;; Bytes : 
;;; Speed : 
;;; Reps : 
;;; RPC : 
;;; PV : 
;;; VoiceBunches : 
;;; VoiceTime ms : 
;;; ControlTime ms : 

; STAT RENDER : Toggles rendering statistics display.
;; Frame : 
;;; Frame ms : 
;;; Render ms : 
;;; Stats Render ms : 
;; BSP : 
;;; Render ms : 
;;; Sections : 
;;; Nodes : 
;;; Triangles : 
;;; DynamicLighting ms : 
;;; DynamicLightings : 
;; LightMap : 
;;; Time ms : 
;;; Updates : 
;; Projector : 
;;; Render ms : 
;;; Attach ms : 
;;; Projectors : 
;;; Triangles : 
;; Stencil : 
;;; Render ms : 
;;; Nodes : 
;;; Triangles : 
;; Visibility : 
;;; Setup ms : 
;;; MaskTests : 
;;; MaskRejects : 
;;; BoxTests : 
;;; BoxRejects : 
;;; Traverse ms : 
;;; SctarchBytes : 
;;; MeshLight ms : 
;; Terrain : 
;;; Render ms : 
;;; Sectors : 
;;; Triangles : 
;;; DrawPrimitives : 
;; DecoLayer : 
;;; Render ms : 
;;; Triangles : 
;;; Decorations : 
;; Mesh : 
;;; Skin ms : 
;;; Result ms : 
;;; LOD ms : 
;;; Pose ms : 
;;; Skel ms : 
;;; Rigid ms : 
;;; Draw ms : 
;; Particle : 
;;; SpriteSetup ms : 
;;; Particles : 
;;; ParticlesTicked : 
;;; Render ms : 
;; StaticMesh : 
;;; Triangles : 
;;; Triangles ms : 
;;; Batches : 
;;; BatchedSortedTriangles : 
;;; BatchedSortedSections : 
;;; BatchedSort ms : 
;;; BatchUnsortedSections : 
;;; BatchedUnortedTriangles : 
;;; BatchRender ms : 

;;; UnbatchedSortedTriangles : 
;;; UnbatchedSortedSections : 
;;; UnbatchedSort ms : 
;;; UnbatchedUnsortedSections : 
;;; UnbatchedUnsortedTriangles : 
;;; UnbatchedRender ms : 
;; Batch : 
;;; Batches : 
;;; Primitives : 
;;; Render ms : 

; STAT XBOXMEM :</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Stats Console Commands (UT)</title>
    <id>807</id>
    <revision>
      <id>2276</id>
      <timestamp>2005-08-14T00:56:21Z</timestamp>
      <contributor>
        <ip>J165038.upc-j.chello.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] for [[Legacy:UT|UT]] that can be used to show statistics about the game currently playing.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands]] for the corresponding UT2003/UT2004 console command listing.

; MEMSTAT : Show Windows overall memory statistics.

; OBJ CLASSES : Prints a list of all loaded classes.
; OBJ DEPENDENCIES PACKAGE=&lt;pkgname&gt; EXCLUDE1=&lt;otherpackage&gt; EXCLUDE2=&lt;otherpackage&gt;... : Show package dependencies
; OBJ GARBAGE : Initiates [[Legacy:Garbage Collection|garbage collection]].
; OBJ HASH : Show object hashing statistics.
; OBJ LINKERS : Show a list of active linkers (each linker is responsible for loading objects from a package file).
; OBJ LIST CLASS=&lt;objectclass&gt; INSIDE=&lt;insideclass&gt; : List all objects belonging to the class and residing inside the specified object.  If the class isn't specified, lists ''all'' objects.  If the inside object isn't specified, shows all objects.  Gives a summary of memory usage.  This is very useful during game play for figuring out how much memory is being used.  In UnrealEd, this statistic isn't useful because a huge amount of extra stuff is loaded which might not be used by your map.
; OBJ REFS CLASS=&lt;objectclass&gt; NAME=&lt;objectname&gt; : Show a list of objects which reference the object you specify.  When trimming memory usage, this is useful for figuring out why some object is being loaded.

; REPORT : Copies a report of the current gameplay situation to the clipboard. You can then paste the resulting text into an email program, Notepad, etc. Extremely useful for beta testers, because it dumps the player's location, the difficulty level, etc.

; STAT ALL : This displays all avaialable statistics in one go.  Great for information overload.  Not so great for actually finding anything out.
; STAT ANIM
; STAT CACHE : Shows cache statistics: 

 CACHE:
    GETS=0000 (00.0) CRTS=000 (00.0) FRESH=000K STALE=000K ITEMS=000 TICK=00.0 

; STAT CLIP
; STAT FILTER
; STAT FPS : Shows [[Legacy:Polycount|polycount]] and frame time in milliseconds.
; STAT GAME : Shows game statistics: 

 GAME:
    SCRIPT=003.4 ACTOR=00.4 PATH=00.0 SEE=00.0 SPAWN=00.0 AUDIO=00.0 UN=00.0 MOVE=00.0 (0) NET=00.0 

; STAT GLOBAL : Shows useful performance timings in milliseconds: 

 GLOBAL:
   FRAME=14.5: GAME=00.5 CLI=05.5 BLIT=08.2 PLAT=00.3
   SCRIPT=003.2 ACTOR=00.4 PATH=00.0 SEE=00.0 SPAWN=00.0 AUDIO=00.0 UN=00.0 MOVE=00.0 (0) NET=00.0
   RENDER=00.0 MESH=00.5 POLYV=00.8 ILLUM=00.0 OCC=00.8 EX=00.0
   DYNAMICS: SETUP=00.0 FILTER=00.0 #SPRITES=5
   DECALS:   TOTAL=00.0 CLIP=00.0 #DECALS=0

; STAT HARDWARE : Shows hardware accelerator statistics: 

 HARDWARE:
   OPENGL STATS: BIND=00.4 IMAGE=00.0 COMPLEX=00.7 GOURAUD=00.2 TILE=00.6

; STAT ILLUM
; STAT LIGHT
; STAT MESH : Shows [[Legacy:Mesh|mesh]] statistics HAS NO EFFECT IN UT2003! : 

 MESH: 00.6
   GETFRAME=00.1 PROCESS=00.0 LIGHTSET=00.0 LIGHT=00.1
   SUB=00.0 CLIP=00.0 TMAP=00.2
   MESHCOUNT=1 MESHPOLYCOUNT=167 MESHSUBCOUNT=167 MESHLIGHTS=1 MESHVTRICS=0 VERTLIGHTS=149

; STAT NET : Show network performance statistics including ping, packet loss, bytes/second
; STAT POLYC
; STAT POLYV
; STAT REJECT
; STAT REJECT : show polycount (UT2003)
; STAT OCCLUSION : Shows visual occlusion statistics: 

 OCCLUSION=0.09: 
    CLIP=00.3 RASTER=00.1 SPAN=00.2 VISIT=289/1766 POINTS=636
    TRANSFORM=289 CLIP=96 RASTER=96 RASTERACCEPT=79 DRAWNODES=71
    BOXTIME=0.01 BOXCHECKS=37 BOXBACKS=0 BOXIN=2 BOXOUTPVR=24 BOXSPANOCC=1

; STAT SOFT
; STAT SPAN
; STAT ZONE : Shows [[Legacy:Zone|zone]] statistics: 

 ZONES: VISIBLE=1/2 REJECT=1 


'''Tarquin:''' The stat commands have changed a lot between UT and 2003. Maybe split this section?

'''Wormbo:''' Yes, definately.

'''Wormbo:''' I've started by duplicating this page. Someone please help removing the content from the other game's page respectively.

'''Richard:''' Hello, I was digging trough the public source 432, and I've found two console commands that aren't listed on this site: astat audio and astat detail. astat audio gives a list of the 16 audio channels with the currently playing sound, astat detail adds some more information like volume etc. to astat audio. The only thing is that I don't know where I've to place this on this wiki.</text>
    </revision>
    <revision>
      <id>2277</id>
      <timestamp>2005-02-06T08:19:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>someone please remove the UT2003 content here</comment>
      <text xml:space="preserve">What follows is a definition of all of the [[Legacy:Console Commands|console commands]] for [[Legacy:UT|UT]] that can be used to show statistics about the game currently playing.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stats Console Commands]] for the corresponding UT2003/UT2004 console command listing.

; MEMSTAT : Show Windows overall memory statistics.

; OBJ CLASSES : Prints a list of all loaded classes.
; OBJ DEPENDENCIES PACKAGE=&lt;pkgname&gt; EXCLUDE1=&lt;otherpackage&gt; EXCLUDE2=&lt;otherpackage&gt;... : Show package dependencies
; OBJ GARBAGE : Initiates [[Legacy:Garbage Collection|garbage collection]].
; OBJ HASH : Show object hashing statistics.
; OBJ LINKERS : Show a list of active linkers (each linker is responsible for loading objects from a package file).
; OBJ LIST CLASS=&lt;objectclass&gt; INSIDE=&lt;insideclass&gt; : List all objects belonging to the class and residing inside the specified object.  If the class isn't specified, lists ''all'' objects.  If the inside object isn't specified, shows all objects.  Gives a summary of memory usage.  This is very useful during game play for figuring out how much memory is being used.  In UnrealEd, this statistic isn't useful because a huge amount of extra stuff is loaded which might not be used by your map.
; OBJ REFS CLASS=&lt;objectclass&gt; NAME=&lt;objectname&gt; : Show a list of objects which reference the object you specify.  When trimming memory usage, this is useful for figuring out why some object is being loaded.

; REPORT : Copies a report of the current gameplay situation to the clipboard. You can then paste the resulting text into an email program, Notepad, etc. Extremely useful for beta testers, because it dumps the player's location, the difficulty level, etc.

; STAT ALL : This displays all avaialable statistics in one go.  Great for information overload.  Not so great for actually finding anything out.
; STAT ANIM
; STAT CACHE : Shows cache statistics: 

 CACHE:
    GETS=0000 (00.0) CRTS=000 (00.0) FRESH=000K STALE=000K ITEMS=000 TICK=00.0 

; STAT CLIP
; STAT FILTER
; STAT FPS : Shows [[Legacy:Polycount|polycount]] and frame time in milliseconds.
; STAT GAME : Shows game statistics: 

 GAME:
    SCRIPT=003.4 ACTOR=00.4 PATH=00.0 SEE=00.0 SPAWN=00.0 AUDIO=00.0 UN=00.0 MOVE=00.0 (0) NET=00.0 

; STAT GLOBAL : Shows useful performance timings in milliseconds: 

 GLOBAL:
   FRAME=14.5: GAME=00.5 CLI=05.5 BLIT=08.2 PLAT=00.3
   SCRIPT=003.2 ACTOR=00.4 PATH=00.0 SEE=00.0 SPAWN=00.0 AUDIO=00.0 UN=00.0 MOVE=00.0 (0) NET=00.0
   RENDER=00.0 MESH=00.5 POLYV=00.8 ILLUM=00.0 OCC=00.8 EX=00.0
   DYNAMICS: SETUP=00.0 FILTER=00.0 #SPRITES=5
   DECALS:   TOTAL=00.0 CLIP=00.0 #DECALS=0

; STAT HARDWARE : Shows hardware accelerator statistics: 

 HARDWARE:
   OPENGL STATS: BIND=00.4 IMAGE=00.0 COMPLEX=00.7 GOURAUD=00.2 TILE=00.6

; STAT ILLUM
; STAT LIGHT
; STAT MESH : Shows [[Legacy:Mesh|mesh]] statistics HAS NO EFFECT IN UT2003! : 

 MESH: 00.6
   GETFRAME=00.1 PROCESS=00.0 LIGHTSET=00.0 LIGHT=00.1
   SUB=00.0 CLIP=00.0 TMAP=00.2
   MESHCOUNT=1 MESHPOLYCOUNT=167 MESHSUBCOUNT=167 MESHLIGHTS=1 MESHVTRICS=0 VERTLIGHTS=149

; STAT NET : Show network performance statistics including ping, packet loss, bytes/second
; STAT POLYC
; STAT POLYV
; STAT REJECT
; STAT REJECT : show polycount (UT2003)
; STAT OCCLUSION : Shows visual occlusion statistics: 

 OCCLUSION=0.09: 
    CLIP=00.3 RASTER=00.1 SPAN=00.2 VISIT=289/1766 POINTS=636
    TRANSFORM=289 CLIP=96 RASTER=96 RASTERACCEPT=79 DRAWNODES=71
    BOXTIME=0.01 BOXCHECKS=37 BOXBACKS=0 BOXIN=2 BOXOUTPVR=24 BOXSPANOCC=1

; STAT SOFT
; STAT SPAN
; STAT ZONE : Shows [[Legacy:Zone|zone]] statistics: 

 ZONES: VISIBLE=1/2 REJECT=1 


'''Tarquin:''' The stat commands have changed a lot between UT and 2003. Maybe split this section?

'''Wormbo:''' Yes, definately.

'''Wormbo:''' I've started by duplicating this page. Someone please help removing the content from the other game's page respectively.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Summon Codes (UT)</title>
    <id>810</id>
    <revision>
      <id>2282</id>
      <timestamp>2006-11-24T12:16:22Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You need to be logged in as Admin or playing offline to use the Summon Command. 

The package and class names specified with the command are case sensitive.  

Not all objects are &quot;summonable&quot;.  If an object fails to appear check your game log file for error messages. 

==Weapons==

* '''Botpack.enforcer'''
* '''Botpack.ImpactHammer''' 
* '''Botpack.minigun2'''
* '''Botpack.PulseGun'''
* '''Botpack.ripper'''
* '''Botpack.ShockRifle'''
* '''Botpack.SniperRifle'''
* '''Botpack.Translocator'''
* '''Botpack.ut_biorifle'''
* '''Botpack.UT_Eightball''' : rocket launcher
* '''Botpack.UT_FlakCannon'''
* '''Botpack.WarheadLauncher''' : redeemer
* '''Botpack.SuperShockRifle''' : Insta Gib Rifle

==Ammo==

* '''Botpack.BioAmmo'''
* '''Botpack.BladeHopper''' : Ripper Ammo
* '''Botpack.BulletBox''' : Sniper Ammo
* '''Botpack.FlakAmmo'''
* '''Botpack.Miniammo''' : Minigun/enforcer ammo
* '''Botpack.PAmmo''' : Pulse Cell/Ammo
* '''Botpack.RocketPack'''
* '''Botpack.ShockCore'''

==Health==

* '''Botpack.HealthPack''' : Super Health (heals 100)
* '''Botpack.Medbox''' : Med box (heals 20)
* '''Botpack.HealthVial''' : HealthVial (heals 5)

==Armor==

* '''Botpack.Armor2''' : Body Armor (100 Armor)
* '''Botpack.ThighPads''' : Thigh Pads (50 Armor)
* '''Botpack.UT_ShieldBelt''' : ShieldBelt (150 Armor)

==Other Pickups==

* '''Botpack.UT_Jumpboots'''
* '''Botpack.UT_invisibility'''
* '''Botpack.UDamage''' : Damage Amplifier
* '''UnrealShare.Flashlight''' : Small Flashlight
* '''UnrealI.Searchlight''' : Big Searchlight
* '''UnrealShare.Flare'''
* '''UnrealI.Dampener''' : Makes weapons quieter
* '''UnrealShare.SCUBAGear''' : Breathe underwater
* '''UnrealShare.VoiceBox''' : Provides a distraction

==Suits==

* '''UnrealI.ToxinSuit''' : No damage from slime
* '''UnrealI.AsbestosSuit''' : No damage from Lava

==Monsters==

* '''UnrealShare.LesserBrute'''
* '''UnrealI.Behemoth'''
* '''UnrealShare.Cow''' : That's a Nali cow, not the moo-ing sort!
* '''UnrealShare.BabyCow'''
* '''UnrealShare.Devilfish''' : Devilfish (best in water)
* '''UnrealShare.Fly''' : Fly
* '''UnrealI.Gasbag''' : Gasbag (can fly)
* '''UnrealI.GiantGasbag''' : Bigger version of gasbag
* '''UnrealI.Krall'''
* '''UnrealI.KrallElite'''
* '''UnrealI.LeglessKrall'''
* '''UnrealShare.CaveManta''' : Manta (flies)
* '''UnrealI.GiantManta''' : Bigger version of Manta
* '''UnrealI.Mercenary'''
* '''UnrealI.MercenaryElite'''
* '''UnrealShare.Nali''' : Nali (does not attack)
* '''UnrealShare.NaliPriest'''
* '''UnrealI.Pupae''' : Pupa (green spider thing, V. Hard to kill)
* '''UnrealI.Queen''' : Queen, has a shield, energy attack and can teleport
* '''UnrealShare.Slith''' : Slith (can swim and is not hurt by slime)
* '''UnrealI.Squid''' : Squid (can swim)
* '''UnrealShare.Tentacle''' : Tentacle (hangs from roof)
* '''UnrealI.StoneTitan''' : Stone Titan (throws boulders)
* '''UnrealI.Warlord''' : The Warlord (has a powerful missile attack and flies)
* '''UnrealShare.SkaarjScout''' : One of the many varieties of Skaarj
* '''UnrealI.SkaarjLord''' : Best Skaarj
* '''UnrealI.SkaarjBerserker'''
* '''UnrealI.SkaarjAssassin'''
* '''UnrealI.IceSkaarj'''
* '''UnrealI.SkaarjSniper''' : Skaarj with a sniper rifle
* '''UnrealI.SkaarjOfficer'''
* '''UnrealI.SkaarjInfantry'''
* '''UnrealI.SkaarjGunner'''

----

==Discussion==

This is THE complete list? It won't work with just any class that has a mesh? What makes a class &quot;summonable&quot;? Do you have set bCheatsEnabled True?

'''Boff: ''' I think you can summon pretty much anything so long as you know the class and package names.</text>
    </revision>
    <revision>
      <id>2283</id>
      <timestamp>2006-01-23T17:12:47Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">You need to be logged in as Admin or playing offline to use the Summon Command. 

The package and class names specified with the command are case sensitive.  

Not all objects are &quot;summonable&quot;.  If an object fails to appear check your game log file for error messages. 

==Weapons==

* '''Botpack.enforcer'''
* '''Botpack.ImpactHammer''' 
* '''Botpack.minigun2'''
* '''Botpack.PulseGun'''
* '''Botpack.ripper'''
* '''Botpack.ShockRifle'''
* '''Botpack.SniperRifle'''
* '''Botpack.Translocator'''
* '''Botpack.ut_biorifle'''
* '''Botpack.UT_Eightball''' : rocket launcher
* '''Botpack.UT_FlakCannon'''
* '''Botpack.WarheadLauncher''' : redeemer
* '''Botpack.SuperShockRifle''' : Insta Gib Rifle

==Ammo==

* '''Botpack.BioAmmo'''
* '''Botpack.BladeHopper''' : Ripper Ammo
* '''Botpack.BulletBox''' : Sniper Ammo
* '''Botpack.FlakAmmo'''
* '''Botpack.Miniammo''' : Minigun/enforcer ammo
* '''Botpack.PAmmo''' : Pulse Cell/Ammo
* '''Botpack.RocketPack'''
* '''Botpack.ShockCore'''

==Health==

* '''Botpack.HealthPack''' : Super Health (heals 100)
* '''Botpack.Medbox''' : Med box (heals 20)
* '''Botpack.HealthVial''' : HealthVial (heals 5)

==Armor==

* '''Botpack.Armor2''' : Body Armor (100 Armor)
* '''Botpack.ThighPads''' : Thigh Pads (50 Armor)
* '''Botpack.UT_ShieldBelt''' : ShieldBelt (150 Armor)

==Other Pickups==

* '''Botpack.UT_Jumpboots'''
* '''Botpack.UT_invisibility'''
* '''Botpack.UDamage''' : Damage Amplifier
* '''UnrealShare.Flashlight''' : Small Flashlight
* '''UnrealI.Searchlight''' : Big Searchlight
* '''UnrealShare.Flare'''
* '''UnrealI.Dampener''' : Makes weapons quieter
* '''UnrealShare.SCUBAGear''' : Breathe underwater
* '''UnrealShare.VoiceBox''' : Provides a distraction

==Suits==

* '''UnrealI.ToxinSuit''' : No damage from slime
* '''UnrealI.AsbestosSuit''' : No damage from Lava

==Monsters==

* '''UnrealShare.LesserBrute'''
* '''UnrealI.Behemoth'''
* '''UnrealShare.Cow''' : That's a Nali cow, not the moo-ing sort!
* '''UnrealShare.BabyCow'''
* '''UnrealShare.Devilfish''' : Devilfish (best in water)
* '''UnrealShare.Fly''' : Fly
* '''UnrealI.Gasbag''' : Gasbag (can fly)
* '''UnrealI.GiantGasbag''' : Bigger version of gasbag
* '''UnrealI.Krall'''
* '''UnrealI.KrallElite'''
* '''UnrealI.LeglessKrall'''
* '''UnrealShare.CaveManta''' : Manta (flies)
* '''UnrealI.GiantManta''' : Bigger version of Manta
* '''UnrealI.Mercenary'''
* '''UnrealI.MercenaryElite'''
* '''UnrealShare.Nali''' : Nali (does not attack)
* '''UnrealShare.NaliPriest'''
* '''UnrealI.Pupae''' : Pupa (green spider thing, V. Hard to kill)
* '''UnrealI.Queen''' : Queen, has a shield, energy attack and can teleport
* '''UnrealShare.Slith''' : Slith (can swim and is not hurt by slime)
* '''UnrealI.Squid''' : Squid (can swim)
* '''UnrealShare.Tentacle''' : Tentacle (hangs from roof)
* '''UnrealI.StoneTitan''' : Stone Titan (throws boulders)
* '''UnrealI.Warlord''' : The Warlord (has a powerful missile attack and flies)
* '''UnrealShare.SkaarjScout''' : One of the many varieties of Skaarj
* '''UnrealI.SkaarjLord''' : Best Skaarj
* '''UnrealI.SkaarjBerserker'''
* '''UnrealI.SkaarjAssassin'''
* '''UnrealI.IceSkaarj'''
* '''UnrealI.SkaarjSniper''' : Skaarj with a sniper rifle
* '''UnrealI.SkaarjOfficer'''
* '''UnrealI.SkaarjInfantry'''
* '''UnrealI.SkaarjGunner'''

----

==Discussion==

This is THE complete list? It won't work with just any class that has a mesh? What makes a class &quot;summonable&quot;? Do you have set bCheatsEnabled True?</text>
    </revision>
    <revision>
      <id>34622</id>
      <timestamp>2009-08-04T18:29:47Z</timestamp>
      <contributor>
        <username>Ibnonbin</username>
        <id>1998</id>
      </contributor>
      <comment>/* Monsters */</comment>
      <text xml:space="preserve">You need to be logged in as Admin or playing offline to use the Summon Command. 

The package and class names specified with the command are case sensitive.  

Not all objects are &quot;summonable&quot;.  If an object fails to appear check your game log file for error messages. 

==Weapons==

* '''Botpack.enforcer'''
* '''Botpack.ImpactHammer''' 
* '''Botpack.minigun2'''
* '''Botpack.PulseGun'''
* '''Botpack.ripper'''
* '''Botpack.ShockRifle'''
* '''Botpack.SniperRifle'''
* '''Botpack.Translocator'''
* '''Botpack.ut_biorifle'''
* '''Botpack.UT_Eightball''' : rocket launcher
* '''Botpack.UT_FlakCannon'''
* '''Botpack.WarheadLauncher''' : redeemer
* '''Botpack.SuperShockRifle''' : Insta Gib Rifle

==Ammo==

* '''Botpack.BioAmmo'''
* '''Botpack.BladeHopper''' : Ripper Ammo
* '''Botpack.BulletBox''' : Sniper Ammo
* '''Botpack.FlakAmmo'''
* '''Botpack.Miniammo''' : Minigun/enforcer ammo
* '''Botpack.PAmmo''' : Pulse Cell/Ammo
* '''Botpack.RocketPack'''
* '''Botpack.ShockCore'''

==Health==

* '''Botpack.HealthPack''' : Super Health (heals 100)
* '''Botpack.Medbox''' : Med box (heals 20)
* '''Botpack.HealthVial''' : HealthVial (heals 5)

==Armor==

* '''Botpack.Armor2''' : Body Armor (100 Armor)
* '''Botpack.ThighPads''' : Thigh Pads (50 Armor)
* '''Botpack.UT_ShieldBelt''' : ShieldBelt (150 Armor)

==Other Pickups==

* '''Botpack.UT_Jumpboots'''
* '''Botpack.UT_invisibility'''
* '''Botpack.UDamage''' : Damage Amplifier
* '''UnrealShare.Flashlight''' : Small Flashlight
* '''UnrealI.Searchlight''' : Big Searchlight
* '''UnrealShare.Flare'''
* '''UnrealI.Dampener''' : Makes weapons quieter
* '''UnrealShare.SCUBAGear''' : Breathe underwater
* '''UnrealShare.VoiceBox''' : Provides a distraction

==Suits==

* '''UnrealI.ToxinSuit''' : No damage from slime
* '''UnrealI.AsbestosSuit''' : No damage from Lava

==Monsters==

* '''UnrealShare.Brute'''
* '''UnrealShare.LesserBrute'''
* '''UnrealI.Behemoth'''
* '''UnrealShare.Cow''' : That's a Nali cow, not the moo-ing sort!
* '''UnrealShare.BabyCow'''
* '''UnrealShare.Devilfish''' : Devilfish (best in water)
* '''UnrealShare.Fly''' : Fly
* '''UnrealI.Gasbag''' : Gasbag (can fly)
* '''UnrealI.GiantGasbag''' : Bigger version of gasbag
* '''UnrealI.Krall'''
* '''UnrealI.KrallElite'''
* '''UnrealI.LeglessKrall'''
* '''UnrealShare.CaveManta''' : Manta (flies)
* '''UnrealI.GiantManta''' : Bigger version of Manta
* '''UnrealI.Mercenary'''
* '''UnrealI.MercenaryElite'''
* '''UnrealShare.Nali''' : Nali (does not attack)
* '''UnrealShare.NaliPriest'''
* '''UnrealI.Pupae''' : Pupa (green spider thing, V. Hard to kill)
* '''UnrealI.Queen''' : Queen, has a shield, energy attack and can teleport
* '''UnrealShare.Slith''' : Slith (can swim and is not hurt by slime)
* '''UnrealI.Squid''' : Squid (can swim)
* '''UnrealShare.Tentacle''' : Tentacle (hangs from roof)
* '''UnrealI.StoneTitan''' : Stone Titan (throws boulders)
* '''UnrealI.Warlord''' : The Warlord (has a powerful missile attack and flies)
* '''UnrealShare.SkaarjScout''' : One of the many varieties of Skaarj
* '''UnrealI.SkaarjLord''' : Best Skaarj
* '''UnrealI.SkaarjBerserker'''
* '''UnrealI.SkaarjAssassin'''
* '''UnrealI.IceSkaarj'''
* '''UnrealI.SkaarjSniper''' : Skaarj with a sniper rifle
* '''UnrealI.SkaarjOfficer'''
* '''UnrealI.SkaarjInfantry'''
* '''UnrealI.SkaarjGunner'''

----

==Discussion==

This is THE complete list? It won't work with just any class that has a mesh? What makes a class &quot;summonable&quot;? Do you have set bCheatsEnabled True?

'''Boff: ''' I think you can summon pretty much anything so long as you know the class and package names.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Console Commands/Summon Codes (UT2004)</title>
    <id>809</id>
    <revision>
      <id>2280</id>
      <timestamp>2008-02-11T17:05:27Z</timestamp>
      <contributor>
        <ip>Cpe-69-204-19-147.buffalo.res.rr.com</ip>
      </contributor>
      <comment>*xweapons.onsavrilpickup -&gt; onslaught.onsavrilpickup</comment>
      <text xml:space="preserve">This page lists codes (class names) usable with the '''summon''' ''class'' console cheat. In other words, type &quot;summon &quot; and then one of the class names listed below to summon it.

==Weapon pickups==
* '''xweapons.assaultriflepickup''' : Assault Rifle
* '''xweapons.shieldgunpickup''' : Shield Gun
* '''xweapons.bioriflepickup''' : Bio-Rifle
* '''onslaught.onsminelayerpickup''' : Mine Layer
* '''xweapons.shockriflepickup''' : Shock Rifle
* '''xweapons.supershockriflepickup''' : Instagib Shock Rifle
* '''xweapons.zoomsupershockriflepickup''' : Zoom Instagib Shock Rifle
* '''xweapons.linkgunpickup''' : Link Gun
* '''xweapons.minigunpickup''' : Minigun
* '''xweapons.flakcannonpickup''' : Flak Cannon
* '''onslaught.onsgrenadepickup''' : Grenade Launcher
* '''xweapons.rocketlauncherpickup''' : Rocket Launcher
* '''onslaught.onsavrilpickup''' : AVRiL
* '''xweapons.sniperriflepickup''' : Lightning Gun
* '''UTClassic.classicsniperriflepickup''' : Sniper Rifle
* '''xweapons.redeemerpickup''' : Redeemer
* '''xweapons.painterpickup''' : Ion Painter
* '''onslaughtfull.onspainterpickup''' : Target Painter
* '''xweapons.transpickup''' : Translocator

==Ammo pickups==
* '''xweapons.assaultammopickup''' - Assault Rifle ammo
* '''xweapons.bioammopickup''' - Bio-Rifle ammo
* '''onslaught.onsmineammopickup''' - Mine Layer ammo
* '''xweapons.shockammopickup''' - Shock Rifle ammo
* '''xweapons.linkammopickup''' - Link Gun ammo
* '''xweapons.minigunammopickup''' - Minigun ammo
* '''xweapons.flakammopickup''' - Flak Cannon ammo
* '''onslaught.onsgrenadeammopickup''' - Grenade Launcher ammo
* '''xweapons.rocketammopickup''' - Rocket Launcher ammo
* '''onslaught.onsavrilammopickup''' - AVRiL ammo
* '''xweapons.sniperammopickup''' - Lightning Gun ammo
* '''UTClassic.classicsniperammopickup''' - Sniper Rifle ammo

==Onslaught Vehicles==
* '''onslaught.onshoverbike''' - Manta
* '''onslaught.onsrv''' - Scorpion
* '''onslaught.onsattackcraft''' - Raptor
* '''onslaught.onsprv''' - Hellbender
* '''onslaught.onshovertank''' - Goliath
* '''onslaughtfull.onshovertank_ionplasma''' - Ion Plasma Tank
* '''onslaughtfull.onsmobileassaultstation''' - Leviathan
* '''onslaughtfull.onsgenericsd''' - TC-1200 (Toilet Car)
* '''onslaughtfull.onsbomber''' - Intermittently-functional (and very hard to control) Phoenix (Dragonfly?) bomber plane.

==ECE Bonus Pack Vehicles==
* '''onslaughtbp.onsdualattackcraft''' - Cicada
* '''onslaughtbp.onsshocktank''' - Paladin
* '''onslaughtbp.onsartillery''' - SPMA

Note: all vehicles summoned will spawn on top of you, locked. If you are not in '''god''' or '''ghost''' mode, you will be crushed. The &quot;locked&quot; issue is a bit complicated; there are several ways to deal with it.
* '''set vehicle bteamlocked false''' will unlock every currently-existing vehicle on the map.
* '''set ''name'' bteamlocked false''' will unlock every vehicle of class ''name''. For example, to unlock a Cicada you've just summoned (as well as every other Cicada on the map), enter ''set onsdualattackcraft bteamlocked false''.

==Other==
* '''xweapons.''name''projectile''' - where ''name'' is usually the class name as listed above, summons the projectile that particular weapon shoots. To summon a Redeemer projectile, for example, enter ''summon xweapons.redeemerprojectile''. Note that this counts as a suicide (-1) for whoever it kills, not a kill (+1) for you, and summoned projectiles cannot damage PowerCores or PowerNodes.

==Effects==

xeffects.''name'' - will spawn some effects in game. Note that these are purely visual; explosions will not do damage.
*'''ioncannondeatheffect'''
*'''landmineexplosion'''
*'''newexplosiona'''
*'''newexplosionb'''
*'''newexplosionc'''
*'''newioneffect'''
*'''newlinktrail'''
*'''newminigunmflash'''
*'''newredeemertrail'''
*'''newtransderesblue'''
*'''newtransderesred'''
*'''newtranseffect'''
*'''newtranseffectblue'''
*'''playerspawneffect'''
*'''redeemerexplosion'''
*'''redeemertrail'''
*'''shockball
*'''shockcombo
*'''spiral'''
*'''weaponfadeeffect'''
*'''shockcombospheredark'''
*'''shockcombovortex'''

They're mostly self explanatory. There are perhaps a few I missed. (I didn't have time to go through and test all the ONS ones) But if you look through the Unreal Ed actor listings, you can find a bunch more to try. 

=Monsters=

skaarjpack.''name'' - Will summon a monster of your choosing in front of you. Be careful, they'll attack you or anyone around you. 
*'''monster''' - A generic Jakob character. Doesn't have a weapon, and follows you around wherever you go.
*'''behemoth''' - Large, tough but slow monster armed with dual rapid-fire rocket launchers. (Giant)
*'''gasbag''' - A small flying monster that launches fireballs from above.
*'''krall''' - Monster armed with a staff, which fires lasers. Will melee at close range. (a.k.a. Izangi)
*'''elitekrall''' - A slightly better krall. (a.k.a. Izangi)
*'''manta''' - Small flying bird-like creature that attempts to melee atack your head. (Ray)
*'''razorfly''' - Attacks in the same way as a manta, but this fly-like creature is pretty slow. (Dragonfly)
*'''skaarjpupae''' - Small bug that attempts to jump up and melee attack. (Spider)
*'''skaarj''' - Fast-moving, agile and tough monster capable of both energy emissions and melee claw attacks.
*'''fireskaarj''' - like skaarj but different weapon and appearance
*'''iceskaarj''' - like skaarj, but different appearance and weapon
*'''warlord''' - Extremely tough and agile monster with dual homing missile launchers. Can also fly.

(Note not all of these came up when I tested them just now, but I've spawned them all before) 

(Note 2: Creature descriptions edited by Lofty. I play a lot of invasion and thought the descriptions could be improved.)

(Note 3: Snave Nareik puts names of what the monsters look like in for you)

----</text>
    </revision>
    <revision>
      <id>2281</id>
      <timestamp>2008-02-10T21:38:39Z</timestamp>
      <contributor>
        <ip>Dem1382-138-90.ppp.netnitco.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page lists codes (class names) usable with the '''summon''' ''class'' console cheat. In other words, type &quot;summon &quot; and then one of the class names listed below to summon it.

==Weapon pickups==
* '''xweapons.assaultriflepickup''' : Assault Rifle
* '''xweapons.shieldgunpickup''' : Shield Gun
* '''xweapons.bioriflepickup''' : Bio-Rifle
* '''onslaught.onsminelayerpickup''' : Mine Layer
* '''xweapons.shockriflepickup''' : Shock Rifle
* '''xweapons.supershockriflepickup''' : Instagib Shock Rifle
* '''xweapons.zoomsupershockriflepickup''' : Zoom Instagib Shock Rifle
* '''xweapons.linkgunpickup''' : Link Gun
* '''xweapons.minigunpickup''' : Minigun
* '''xweapons.flakcannonpickup''' : Flak Cannon
* '''onslaught.onsgrenadepickup''' : Grenade Launcher
* '''xweapons.rocketlauncherpickup''' : Rocket Launcher
* '''xweapons.onsavrilpickup''' : AVRiL
* '''xweapons.sniperriflepickup''' : Lightning Gun
* '''UTClassic.classicsniperriflepickup''' : Sniper Rifle
* '''xweapons.redeemerpickup''' : Redeemer
* '''xweapons.painterpickup''' : Ion Painter
* '''onslaughtfull.onspainterpickup''' : Target Painter
* '''xweapons.transpickup''' : Translocator

==Ammo pickups==
* '''xweapons.assaultammopickup''' - Assault Rifle ammo
* '''xweapons.bioammopickup''' - Bio-Rifle ammo
* '''onslaught.onsmineammopickup''' - Mine Layer ammo
* '''xweapons.shockammopickup''' - Shock Rifle ammo
* '''xweapons.linkammopickup''' - Link Gun ammo
* '''xweapons.minigunammopickup''' - Minigun ammo
* '''xweapons.flakammopickup''' - Flak Cannon ammo
* '''onslaught.onsgrenadeammopickup''' - Grenade Launcher ammo
* '''xweapons.rocketammopickup''' - Rocket Launcher ammo
* '''onslaught.onsavrilammopickup''' - AVRiL ammo
* '''xweapons.sniperammopickup''' - Lightning Gun ammo
* '''UTClassic.classicsniperammopickup''' - Sniper Rifle ammo

==Onslaught Vehicles==
* '''onslaught.onshoverbike''' - Manta
* '''onslaught.onsrv''' - Scorpion
* '''onslaught.onsattackcraft''' - Raptor
* '''onslaught.onsprv''' - Hellbender
* '''onslaught.onshovertank''' - Goliath
* '''onslaughtfull.onshovertank_ionplasma''' - Ion Plasma Tank
* '''onslaughtfull.onsmobileassaultstation''' - Leviathan
* '''onslaughtfull.onsgenericsd''' - TC-1200 (Toilet Car)
* '''onslaughtfull.onsbomber''' - Intermittently-functional (and very hard to control) Phoenix (Dragonfly?) bomber plane.

==ECE Bonus Pack Vehicles==
* '''onslaughtbp.onsdualattackcraft''' - Cicada
* '''onslaughtbp.onsshocktank''' - Paladin
* '''onslaughtbp.onsartillery''' - SPMA

Note: all vehicles summoned will spawn on top of you, locked. If you are not in '''god''' or '''ghost''' mode, you will be crushed. The &quot;locked&quot; issue is a bit complicated; there are several ways to deal with it.
* '''set vehicle bteamlocked false''' will unlock every currently-existing vehicle on the map.
* '''set ''name'' bteamlocked false''' will unlock every vehicle of class ''name''. For example, to unlock a Cicada you've just summoned (as well as every other Cicada on the map), enter ''set onsdualattackcraft bteamlocked false''.

==Other==
* '''xweapons.''name''projectile''' - where ''name'' is usually the class name as listed above, summons the projectile that particular weapon shoots. To summon a Redeemer projectile, for example, enter ''summon xweapons.redeemerprojectile''. Note that this counts as a suicide (-1) for whoever it kills, not a kill (+1) for you, and summoned projectiles cannot damage PowerCores or PowerNodes.

==Effects==

xeffects.''name'' - will spawn some effects in game. Note that these are purely visual; explosions will not do damage.
*'''ioncannondeatheffect'''
*'''landmineexplosion'''
*'''newexplosiona'''
*'''newexplosionb'''
*'''newexplosionc'''
*'''newioneffect'''
*'''newlinktrail'''
*'''newminigunmflash'''
*'''newredeemertrail'''
*'''newtransderesblue'''
*'''newtransderesred'''
*'''newtranseffect'''
*'''newtranseffectblue'''
*'''playerspawneffect'''
*'''redeemerexplosion'''
*'''redeemertrail'''
*'''shockball
*'''shockcombo
*'''spiral'''
*'''weaponfadeeffect'''
*'''shockcombospheredark'''
*'''shockcombovortex'''

They're mostly self explanatory. There are perhaps a few I missed. (I didn't have time to go through and test all the ONS ones) But if you look through the Unreal Ed actor listings, you can find a bunch more to try. 

=Monsters=

skaarjpack.''name'' - Will summon a monster of your choosing in front of you. Be careful, they'll attack you or anyone around you. 
*'''monster''' - A generic Jakob character. Doesn't have a weapon, and follows you around wherever you go.
*'''behemoth''' - Large, tough but slow monster armed with dual rapid-fire rocket launchers. (Giant)
*'''gasbag''' - A small flying monster that launches fireballs from above.
*'''krall''' - Monster armed with a staff, which fires lasers. Will melee at close range. (a.k.a. Izangi)
*'''elitekrall''' - A slightly better krall. (a.k.a. Izangi)
*'''manta''' - Small flying bird-like creature that attempts to melee atack your head. (Ray)
*'''razorfly''' - Attacks in the same way as a manta, but this fly-like creature is pretty slow. (Dragonfly)
*'''skaarjpupae''' - Small bug that attempts to jump up and melee attack. (Spider)
*'''skaarj''' - Fast-moving, agile and tough monster capable of both energy emissions and melee claw attacks.
*'''fireskaarj''' - like skaarj but different weapon and appearance
*'''iceskaarj''' - like skaarj, but different appearance and weapon
*'''warlord''' - Extremely tough and agile monster with dual homing missile launchers. Can also fly.

(Note not all of these came up when I tested them just now, but I've spawned them all before) 

(Note 2: Creature descriptions edited by Lofty. I play a lot of invasion and thought the descriptions could be improved.)

(Note 3: Snave Nareik puts names of what the monsters look like in for you)

----</text>
    </revision>
    <revision>
      <id>35494</id>
      <timestamp>2009-10-22T20:14:58Z</timestamp>
      <contributor>
        <ip>82.74.18.133</ip>
      </contributor>
      <comment>/* Monsters */</comment>
      <text xml:space="preserve">This page lists codes (class names) usable with the '''summon''' ''class'' console cheat. In other words, type &quot;summon &quot; and then one of the class names listed below to summon it.

==Weapon pickups==
* '''xweapons.assaultriflepickup''' : Assault Rifle
* '''xweapons.shieldgunpickup''' : Shield Gun
* '''xweapons.bioriflepickup''' : Bio-Rifle
* '''onslaught.onsminelayerpickup''' : Mine Layer
* '''xweapons.shockriflepickup''' : Shock Rifle
* '''xweapons.supershockriflepickup''' : Instagib Shock Rifle
* '''xweapons.zoomsupershockriflepickup''' : Zoom Instagib Shock Rifle
* '''xweapons.linkgunpickup''' : Link Gun
* '''xweapons.minigunpickup''' : Minigun
* '''xweapons.flakcannonpickup''' : Flak Cannon
* '''onslaught.onsgrenadepickup''' : Grenade Launcher
* '''xweapons.rocketlauncherpickup''' : Rocket Launcher
* '''onslaught.onsavrilpickup''' : AVRiL
* '''xweapons.sniperriflepickup''' : Lightning Gun
* '''UTClassic.classicsniperriflepickup''' : Sniper Rifle
* '''xweapons.redeemerpickup''' : Redeemer
* '''xweapons.painterpickup''' : Ion Painter
* '''onslaughtfull.onspainterpickup''' : Target Painter
* '''xweapons.transpickup''' : Translocator

==Ammo pickups==
* '''xweapons.assaultammopickup''' - Assault Rifle ammo
* '''xweapons.bioammopickup''' - Bio-Rifle ammo
* '''onslaught.onsmineammopickup''' - Mine Layer ammo
* '''xweapons.shockammopickup''' - Shock Rifle ammo
* '''xweapons.linkammopickup''' - Link Gun ammo
* '''xweapons.minigunammopickup''' - Minigun ammo
* '''xweapons.flakammopickup''' - Flak Cannon ammo
* '''onslaught.onsgrenadeammopickup''' - Grenade Launcher ammo
* '''xweapons.rocketammopickup''' - Rocket Launcher ammo
* '''onslaught.onsavrilammopickup''' - AVRiL ammo
* '''xweapons.sniperammopickup''' - Lightning Gun ammo
* '''UTClassic.classicsniperammopickup''' - Sniper Rifle ammo

==Onslaught Vehicles==
* '''onslaught.onshoverbike''' - Manta
* '''onslaught.onsrv''' - Scorpion
* '''onslaught.onsattackcraft''' - Raptor
* '''onslaught.onsprv''' - Hellbender
* '''onslaught.onshovertank''' - Goliath
* '''onslaughtfull.onshovertank_ionplasma''' - Ion Plasma Tank
* '''onslaughtfull.onsmobileassaultstation''' - Leviathan
* '''onslaughtfull.onsgenericsd''' - TC-1200 (Toilet Car)
* '''onslaughtfull.onsbomber''' - Intermittently-functional (and very hard to control) Phoenix (Dragonfly?) bomber plane.

==ECE Bonus Pack Vehicles==
* '''onslaughtbp.onsdualattackcraft''' - Cicada
* '''onslaughtbp.onsshocktank''' - Paladin
* '''onslaughtbp.onsartillery''' - SPMA

Note: all vehicles summoned will spawn on top of you, locked. If you are not in '''god''' or '''ghost''' mode, you will be crushed. The &quot;locked&quot; issue is a bit complicated; there are several ways to deal with it.
* '''set vehicle bteamlocked false''' will unlock every currently-existing vehicle on the map.
* '''set ''name'' bteamlocked false''' will unlock every vehicle of class ''name''. For example, to unlock a Cicada you've just summoned (as well as every other Cicada on the map), enter ''set onsdualattackcraft bteamlocked false''.

==Other==
* '''xweapons.''name''projectile''' - where ''name'' is usually the class name as listed above, summons the projectile that particular weapon shoots. To summon a Redeemer projectile, for example, enter ''summon xweapons.redeemerprojectile''. Note that this counts as a suicide (-1) for whoever it kills, not a kill (+1) for you, and summoned projectiles cannot damage PowerCores or PowerNodes.

==Effects==

xeffects.''name'' - will spawn some effects in game. Note that these are purely visual; explosions will not do damage.
*'''ioncannondeatheffect'''
*'''landmineexplosion'''
*'''newexplosiona'''
*'''newexplosionb'''
*'''newexplosionc'''
*'''newioneffect'''
*'''newlinktrail'''
*'''newminigunmflash'''
*'''newredeemertrail'''
*'''newtransderesblue'''
*'''newtransderesred'''
*'''newtranseffect'''
*'''newtranseffectblue'''
*'''playerspawneffect'''
*'''redeemerexplosion'''
*'''redeemertrail'''
*'''shockball
*'''shockcombo
*'''spiral'''
*'''weaponfadeeffect'''
*'''shockcombospheredark'''
*'''shockcombovortex'''

They're mostly self explanatory. There are perhaps a few I missed. (I didn't have time to go through and test all the ONS ones) But if you look through the Unreal Ed actor listings, you can find a bunch more to try. 

=Monsters=

skaarjpack.''name'' - Will summon a monster of your choosing in front of you. Be careful, they'll attack you or anyone around you. 
*'''monster''' - A generic Jakob character. Doesn't have a weapon, and follows you around wherever you go.
*'''behemoth''' - Large, tough but slow monster armed with dual rapid-fire rocket launchers. (Giant)
*'''brute''' - Large, tough slow monster armed with dual rapid-fire rocket launchers, but other colors than the 'behemoth'. (Giant)
*'''gasbag''' - A small flying monster that launches fireballs from above.
*'''krall''' - Monster armed with a staff, which fires lasers. Will melee at close range. (a.k.a. Izangi)
*'''elitekrall''' - A slightly better krall. (a.k.a. Izangi)
*'''manta''' - Small flying bird-like creature that attempts to melee atack your head. (Ray)
*'''razorfly''' - Attacks in the same way as a manta, but this fly-like creature is pretty slow. (Dragonfly)
*'''skaarjpupae''' - Small bug that attempts to jump up and melee attack. (Spider)
*'''skaarj''' - Fast-moving, agile and tough monster capable of both energy emissions and melee claw attacks.
*'''fireskaarj''' - like skaarj but different weapon and appearance
*'''iceskaarj''' - like skaarj, but different appearance and weapon
*'''warlord''' - Extremely tough and agile monster with dual homing missile launchers. Can also fly.

(Note not all of these came up when I tested them just now, but I've spawned them all before) 

(Note 2: Creature descriptions edited by Lofty. I play a lot of invasion and thought the descriptions could be improved.)

(Note 3: Snave Nareik puts names of what the monsters look like in for you)

(Note 4: Troy added brute, which was forgotten.)

----</text>
    </revision>
    <revision>
      <id>35495</id>
      <timestamp>2009-10-22T20:15:38Z</timestamp>
      <contributor>
        <ip>82.74.18.133</ip>
      </contributor>
      <comment>/* Monsters */</comment>
      <text xml:space="preserve">This page lists codes (class names) usable with the '''summon''' ''class'' console cheat. In other words, type &quot;summon &quot; and then one of the class names listed below to summon it.

==Weapon pickups==
* '''xweapons.assaultriflepickup''' : Assault Rifle
* '''xweapons.shieldgunpickup''' : Shield Gun
* '''xweapons.bioriflepickup''' : Bio-Rifle
* '''onslaught.onsminelayerpickup''' : Mine Layer
* '''xweapons.shockriflepickup''' : Shock Rifle
* '''xweapons.supershockriflepickup''' : Instagib Shock Rifle
* '''xweapons.zoomsupershockriflepickup''' : Zoom Instagib Shock Rifle
* '''xweapons.linkgunpickup''' : Link Gun
* '''xweapons.minigunpickup''' : Minigun
* '''xweapons.flakcannonpickup''' : Flak Cannon
* '''onslaught.onsgrenadepickup''' : Grenade Launcher
* '''xweapons.rocketlauncherpickup''' : Rocket Launcher
* '''onslaught.onsavrilpickup''' : AVRiL
* '''xweapons.sniperriflepickup''' : Lightning Gun
* '''UTClassic.classicsniperriflepickup''' : Sniper Rifle
* '''xweapons.redeemerpickup''' : Redeemer
* '''xweapons.painterpickup''' : Ion Painter
* '''onslaughtfull.onspainterpickup''' : Target Painter
* '''xweapons.transpickup''' : Translocator

==Ammo pickups==
* '''xweapons.assaultammopickup''' - Assault Rifle ammo
* '''xweapons.bioammopickup''' - Bio-Rifle ammo
* '''onslaught.onsmineammopickup''' - Mine Layer ammo
* '''xweapons.shockammopickup''' - Shock Rifle ammo
* '''xweapons.linkammopickup''' - Link Gun ammo
* '''xweapons.minigunammopickup''' - Minigun ammo
* '''xweapons.flakammopickup''' - Flak Cannon ammo
* '''onslaught.onsgrenadeammopickup''' - Grenade Launcher ammo
* '''xweapons.rocketammopickup''' - Rocket Launcher ammo
* '''onslaught.onsavrilammopickup''' - AVRiL ammo
* '''xweapons.sniperammopickup''' - Lightning Gun ammo
* '''UTClassic.classicsniperammopickup''' - Sniper Rifle ammo

==Onslaught Vehicles==
* '''onslaught.onshoverbike''' - Manta
* '''onslaught.onsrv''' - Scorpion
* '''onslaught.onsattackcraft''' - Raptor
* '''onslaught.onsprv''' - Hellbender
* '''onslaught.onshovertank''' - Goliath
* '''onslaughtfull.onshovertank_ionplasma''' - Ion Plasma Tank
* '''onslaughtfull.onsmobileassaultstation''' - Leviathan
* '''onslaughtfull.onsgenericsd''' - TC-1200 (Toilet Car)
* '''onslaughtfull.onsbomber''' - Intermittently-functional (and very hard to control) Phoenix (Dragonfly?) bomber plane.

==ECE Bonus Pack Vehicles==
* '''onslaughtbp.onsdualattackcraft''' - Cicada
* '''onslaughtbp.onsshocktank''' - Paladin
* '''onslaughtbp.onsartillery''' - SPMA

Note: all vehicles summoned will spawn on top of you, locked. If you are not in '''god''' or '''ghost''' mode, you will be crushed. The &quot;locked&quot; issue is a bit complicated; there are several ways to deal with it.
* '''set vehicle bteamlocked false''' will unlock every currently-existing vehicle on the map.
* '''set ''name'' bteamlocked false''' will unlock every vehicle of class ''name''. For example, to unlock a Cicada you've just summoned (as well as every other Cicada on the map), enter ''set onsdualattackcraft bteamlocked false''.

==Other==
* '''xweapons.''name''projectile''' - where ''name'' is usually the class name as listed above, summons the projectile that particular weapon shoots. To summon a Redeemer projectile, for example, enter ''summon xweapons.redeemerprojectile''. Note that this counts as a suicide (-1) for whoever it kills, not a kill (+1) for you, and summoned projectiles cannot damage PowerCores or PowerNodes.

==Effects==

xeffects.''name'' - will spawn some effects in game. Note that these are purely visual; explosions will not do damage.
*'''ioncannondeatheffect'''
*'''landmineexplosion'''
*'''newexplosiona'''
*'''newexplosionb'''
*'''newexplosionc'''
*'''newioneffect'''
*'''newlinktrail'''
*'''newminigunmflash'''
*'''newredeemertrail'''
*'''newtransderesblue'''
*'''newtransderesred'''
*'''newtranseffect'''
*'''newtranseffectblue'''
*'''playerspawneffect'''
*'''redeemerexplosion'''
*'''redeemertrail'''
*'''shockball
*'''shockcombo
*'''spiral'''
*'''weaponfadeeffect'''
*'''shockcombospheredark'''
*'''shockcombovortex'''

They're mostly self explanatory. There are perhaps a few I missed. (I didn't have time to go through and test all the ONS ones) But if you look through the Unreal Ed actor listings, you can find a bunch more to try. 

=Monsters=

skaarjpack.''name'' - Will summon a monster of your choosing in front of you. Be careful, they'll attack you or anyone around you. 
*'''monster''' - A generic Jakob character. Doesn't have a weapon, and follows you around wherever you go.
*'''behemoth''' - Large, tough but slow monster armed with dual rapid-fire rocket launchers. (Giant)
*'''brute''' - Large, tough but slow monster armed with dual rapid-fire rocket launchers, but other colors than the 'behemoth'. (Giant)
*'''gasbag''' - A small flying monster that launches fireballs from above.
*'''krall''' - Monster armed with a staff, which fires lasers. Will melee at close range. (a.k.a. Izangi)
*'''elitekrall''' - A slightly better krall. (a.k.a. Izangi)
*'''manta''' - Small flying bird-like creature that attempts to melee atack your head. (Ray)
*'''razorfly''' - Attacks in the same way as a manta, but this fly-like creature is pretty slow. (Dragonfly)
*'''skaarjpupae''' - Small bug that attempts to jump up and melee attack. (Spider)
*'''skaarj''' - Fast-moving, agile and tough monster capable of both energy emissions and melee claw attacks.
*'''fireskaarj''' - like skaarj but different weapon and appearance
*'''iceskaarj''' - like skaarj, but different appearance and weapon
*'''warlord''' - Extremely tough and agile monster with dual homing missile launchers. Can also fly.

(Note not all of these came up when I tested them just now, but I've spawned them all before) 

(Note 2: Creature descriptions edited by Lofty. I play a lot of invasion and thought the descriptions could be improved.)

(Note 3: Snave Nareik puts names of what the monsters look like in for you)

(Note 4: Troy added brute, which was forgotten.)

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Constant</title>
    <id>930</id>
    <revision>
      <id>2535</id>
      <timestamp>2008-02-17T13:59:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A constant in [[Legacy:UnrealScript|UnrealScript]] is basically an alias name for a certain value. Whenever a constant is used in code, it is replaced with the actual value it stands for.

==Syntax==

Constants can be declared both at [[Legacy:Class|class]] and [[Legacy:Function|function]] [[Wikipedia:scope]], but are always globally available in the entire class and all of its subclasses. A constant is declared with the following syntax:

 '''const''' ''name'' '''=''' ''value'' ''';'''

The name must be a valid identifier, i.e. may only contain the letters 'A' to 'Z' in upper and lower case, the digits '0' to '9' and the underscore character '_' and it must not start with a digit. The value can be any constant expression (see below).

==Constant Expressions==

A constant expression can be a literal (such as numbers and strings), the name of a constant, or one of the special expressions '''ArrayCount'''(''arrayname'') and (starting with UnrealEngine 3) ''enumname''.'''EnumCount'''. Note that '''EnumCount''' is not recognized as constant expression in earlier engine generations.

Constants used in constant expressions must be declared declared before they are used. Here &quot;before&quot; may be earlier in the same class or in any class parsed before the current class. This explicitly includes all parent classes of this class, all classes specified in the current class's '''DependsOn''' modifier(s) and all their parent classes and all loaded classes in packages compiled before the package of the current class.

Constant expressions can not only be used as the value in constant declarations, but also as the array index in [[Legacy:Variable|variable]] and parameter declarations.

==See Also==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class|Class]] / [[Legacy:Interface|Interface]]
** [[Legacy:Variable Syntax|Variable Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConstantColor</title>
    <id>858</id>
    <revision>
      <id>2391</id>
      <timestamp>2005-12-03T00:12:59Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:ConstantMaterial|ConstantMaterial]] &gt;&gt; ConstantColor (Package: Engine)}}

A material that generates a constant color.  Useful for creating tints and other effects.

==Properties==
; Color Color : The desired RGB color.  The A (alpha) value of the color won't have any effect if you just apply this directly to a surface: run it through a [[Legacy:FinalBlend|FinalBlend]] with FrameBufferBlending set to FB_AlphaBlend.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2392</id>
      <timestamp>2004-03-17T11:35:04Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:ConstantMaterial|ConstantMaterial]] (Package: Engine)}}

A material that generates a constant color. Useful for creating tints and other effects.

==Properties==
; Color Color : set this to the color you want. The A value of the color won't have any effect if you just apply this directly to a surface: run it through a [[Legacy:FinalBlend|FinalBlend]] with FrameBufferBlending set to FB_AlphaBlend.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConstantMaterial</title>
    <id>28418</id>
    <revision>
      <id>40090</id>
      <timestamp>2009-11-15T08:28:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Contests</title>
    <id>864</id>
    <revision>
      <id>2405</id>
      <timestamp>2005-12-02T23:12:14Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is temporary, I'm not sure of how useful it'll be. In here all creation-contests (mapping, skinning, whatever - '''NOT''' playing) should be listed. Any contest goes, three colums:

# Name of contest, name of arranger with a link to the information page.
# Expiration date
# Notes such as [[Legacy:Gametype|gametype]], theme, possible prize, region-specifics, forced actors, catches etc... If no prize is specified there's no prize.

Once expiration date is over-due, the expiration date should be changed to &quot;Closed&quot; and keep that status for one week. After one week the competition will be removed.

If the category of the contest is not represented, simply add it.

==Mapping ==

{|

|-
|[http://www.levelsource.com/phpBB2/viewtopic.php?t=563 LevelSource UT2k4 DM Contest]
|''21:00 EST'' '''''01/10 -04'''''
|DM, 4-12 players, theme: &quot;Subterranean Base&quot; or &quot;Underwater Station&quot; 
|-
|[http://www.ut2004maps.com UT2004 CTF Map Contest by UT2004 Maps]
|'''Closed'''
|Only standard CTF, special flags, must be registered to forums. Prizes include a Radeon 9800 Pro, FX-53 AMD 64 Bit Chip and a Chenbro case.
|-
|[http://forums.unrealplayground.com/showthread.php?t=23782&amp;page=1&amp;pp=15 UnrealPlayground VCTF MApping Comp]
|'''Closed'''
|Must be VCTF and probably will need to have a certain image somewhere in the map. Prize: $20 Ebay gift certificate
|}

==Comments ==

'''Legal:''' Thought this might be an interesting page. If it clogs up too much on the mapping part we could orginize it by gametype or something. The contest I entered is one I think might interest a few people, at least I will throw something together ;) Remember to add any competition, even small threeday quickmap ones. It's not just for contests with expensive rewards, anything goes. (Make that an !)

'''Tarquin:''' nice idea! :)</text>
    </revision>
    <revision>
      <id>2406</id>
      <timestamp>2004-07-21T07:05:26Z</timestamp>
      <contributor>
        <ip>Mulch D</ip>
      </contributor>
      <comment>Added Prize</comment>
      <text xml:space="preserve">This page is temporary, I'm not sure of how useful it'll be. In here all creation-contests (mapping, skinning, whatever - '''NOT''' playing) should be listed. Any contest goes, three colums:

1. Name of contest, name of arranger with a link to the information page.

2. Expiration date

3. Notes such as gametype, theme, possible prize, region-specifics, forced actors, catches etc... If no prize is specified there's no prize (duh)

Once expirationdate is over-due, the expiration date should be changed to Closed and keep that status for one week. After one week the competition will be removed.

If the category of the contest is not represented, simply add it (duh)

==Mapping ==

{|

|-
|[http://www.levelsource.com/phpBB2/viewtopic.php?t=563 LevelSource UT2k4 DM Contest]
|''21:00 EST'' '''''01/10 -04'''''
|DM, 4-12 players, theme: &quot;Subterranian Base&quot; or &quot;Underwater Station&quot;
|-
|[http://www.ut2004maps.com UT2004 CTF Map Contest by UT2004 Maps]
|'''Closed'''
|Only standard CTF, special flags, must be registered to forums. Prizes include a Radeon 9800 Pro, FX-53 AMD 64 Bit Chip and a Chenbro case.
|-
|[http://forums.unrealplayground.com/showthread.php?t=23782&amp;page=1&amp;pp=15 UnrealPlayground VCTF MApping Comp]
|''12:00am(PST)'' '''''September 5th -04'''''
|Must be VCTF and probably will need to have a certain image somewhere in the map. Prize: $20 Ebay gift certificate
|}

==Comments ==

'''Legal:''' Thought this might be an interesting page. If it clogs up too much on the mapping part we could orginize it by gametype or something. The contest I entered is one I think might interest a few people, at least I will throw something together ;) Remember to add any competition, even small threeday quickmap ones. It's not just for contests with expensive rewards, anything goes. (Make that an !)</text>
    </revision>
    <revision>
      <id>2407</id>
      <timestamp>2004-07-21T07:40:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is temporary, I'm not sure of how useful it'll be. In here all creation-contests (mapping, skinning, whatever - '''NOT''' playing) should be listed. Any contest goes, three colums:

# Name of contest, name of arranger with a link to the information page.
# Expiration date
# Notes such as [[Legacy:Gametype|gametype]], theme, possible prize, region-specifics, forced actors, catches etc... If no prize is specified there's no prize.

Once expiration date is over-due, the expiration date should be changed to &quot;Closed&quot; and keep that status for one week. After one week the competition will be removed.

If the category of the contest is not represented, simply add it.

==Mapping ==

{|

|-
|[http://www.levelsource.com/phpBB2/viewtopic.php?t=563 LevelSource UT2k4 DM Contest]
|''21:00 EST'' '''''01/10 -04'''''
|DM, 4-12 players, theme: &quot;Subterranean Base&quot; or &quot;Underwater Station&quot; 
|-
|[http://www.ut2004maps.com UT2004 CTF Map Contest by UT2004 Maps]
|'''Closed'''
|Only standard CTF, special flags, must be registered to forums. Prizes include a Radeon 9800 Pro, FX-53 AMD 64 Bit Chip and a Chenbro case.
|-
|[http://forums.unrealplayground.com/showthread.php?t=23782&amp;page=1&amp;pp=15 UnrealPlayground VCTF MApping Comp]
|''12:00am(PST)'' '''''September 5th -04'''''
|Must be VCTF and probably will need to have a certain image somewhere in the map. Prize: $20 Ebay gift certificate
|}

==Comments ==

'''Legal:''' Thought this might be an interesting page. If it clogs up too much on the mapping part we could orginize it by gametype or something. The contest I entered is one I think might interest a few people, at least I will throw something together ;) Remember to add any competition, even small threeday quickmap ones. It's not just for contests with expensive rewards, anything goes. (Make that an !)

'''Tarquin:''' nice idea! :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ControlPoint</title>
    <id>695</id>
    <revision>
      <id>2024</id>
      <timestamp>2006-01-20T20:50:41Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; ControlPoint}}

This type of actor is used as the most GameRelevant actor in the [[Legacy:Domination|Domination]] gametype.  There are various properties of ControlPoints that mappers can take advantage of.

==Properties==
; PointName : This variable is used to define the name of the ControlPoint.  For example, the ControlPoint names in DOM-Sesmar are &quot;Blue Ankh&quot;, &quot;Red Ankh&quot;, and &quot;Hall of Pillars&quot;.
; bSelfDisplayed : If a ControlPoint is used in a gametype other than Domination, then this is used to keep the point from being hidden.  Even when the ControlPoint is not hidden, it will still have no functionality outside of a Domination gametype, but it will still change color and shape according to the team of the last player to touch it.
; bScoreReady : If a ControlPoint is held by one team long enough, this flag is set and the player and team owning this ControlPoint get points added to their score.
; ControlSound : When the ControlPoint is taken by another team, it makes this sound.
; RedEvent, BlueEvent, GreenEvent, GoldEvent : When this ControlPoint is taken by a member of another team, it will trigger one of these events, according to which team just took the ControlPoint.  (Doesn't work; explained below.)

==Discussion==

'''Ticalion''' I cant seem to get anything to happen with the RedEvent, BlueEvent, GreenEvent, GoldEvent properties, has anyone else had any luck in using this as a trigger??

'''Techno_JF:''' Why didn't I see this before?  Look at the code for this actor, just at the end of the UpdateStatus function:

&lt;uscript&gt;
	if ( E != '' )
		foreach AllActors(class'Actor', A, E )
		 Trigger(self, Controller);
}
&lt;/uscript&gt;

Earlier in this function, E was set to be whichever of RedEvent, etc. applied, and then the mesh and lighting changed to reflect the team of the point's new controller.  However, it's this last set of statements that doesn't work, because the ControlPoint is trying to trigger itself instead of another actor.  For it to work properly, it should have been written like this:

&lt;uscript&gt;
	if ( E != '' )
		foreach AllActors(class'Actor', A, E )
		 A.Trigger(self, Controller);
}
&lt;/uscript&gt;

So somebody at Epic missed a letter and a period, and an entire mapping feature is never realized.  Let this be a lesson to others who write code for the Unreal engine!

==Related Topics==
* [[Legacy:Mapping For DOM|Mapping for DOM]] (UT)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2025</id>
      <timestamp>2004-06-22T07:37:01Z</timestamp>
      <contributor>
        <ip>195.243.94.xxx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; ControlPoint}}

This type of actor is used as the most GameRelevant actor in the [[Legacy:Domination|Domination]] gametype.  There are various properties of ControlPoints that mappers can take advantage of.

; PointName : This variable is used to define the name of the ControlPoint.  For example, the ControlPoint names in DOM-Sesmar are &quot;Blue Ankh&quot;, &quot;Red Ankh&quot;, and &quot;Hall of Pillars&quot;.

; bSelfDisplayed : If a ControlPoint is used in a gametype other than Domination, then this is used to keep the point from being hidden.  Even when the ControlPoint is not hidden, it will still have no functionality outside of a Domination gametype, but it will still change color and shape according to the team of the last player to touch it.

; bScoreReady : If a ControlPoint is held by one team long enough, this flag is set and the player and team owning this ControlPoint get points added to their score.

; ControlSound : When the ControlPoint is taken by another team, it makes this sound.

; RedEvent, BlueEvent, GreenEvent, GoldEvent : When this ControlPoint is taken by a member of another team, it will trigger one of these events, according to which team just took the ControlPoint.  (Doesn't work; explained below.)

==Discussion ==

'''Ticalion''' I cant seem to get anything to happen with the RedEvent, BlueEvent, GreenEvent, GoldEvent properties, has anyone else had any luck in using this as a trigger??

'''Techno_JF:''' Why didn't I see this before?  Look at the code for this actor, just at the end of the UpdateStatus function:

&lt;uscript&gt;
	if ( E != '' )
		foreach AllActors(class'Actor', A, E )
		 Trigger(self, Controller);
}
&lt;/uscript&gt;

Earlier in this function, E was set to be whichever of RedEvent, etc. applied, and then the mesh and lighting changed to reflect the team of the point's new controller.  However, it's this last set of statements that doesn't work, because the ControlPoint is trying to trigger itself instead of another actor.  For it to work properly, it should have been written like this:

&lt;uscript&gt;
	if ( E != '' )
		foreach AllActors(class'Actor', A, E )
		 A.Trigger(self, Controller);
}
&lt;/uscript&gt;

So somebody at Epic missed a letter and a period, and an entire mapping feature is never realized.  Let this be a lesson to others who write code for the Unreal engine!

==Related Topics ==
* Mapping for Domination: [[Legacy:Mapping For DOM|Mapping For DOM]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Controller</title>
    <id>774</id>
    <revision>
      <id>2205</id>
      <timestamp>2007-03-28T15:30:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; Controller (Package: Engine)}}

This class is a handle to a [[Legacy:Pawn|pawn]].  Pawns are the physical player characters, the controller is the, well, controlling entity moving it around.  There are two subclasses from this class, both are important: [[Legacy:AIController|AIController]] and [[Legacy:PlayerController|PlayerController]]. [[Legacy:Controller Overview|Controller Overview]] covers this in more depth.

From this class, you can control everything from godmode to the pawn that you are focusing on to the adrenaline it has. 

==Notes==
* [[Legacy:Adrenaline|Adrenaline]] is here, not in the pawn class. 
* There is a [[Legacy:Linked List|linked list]] set up of the controllers, allowing you to move to the next controller in the list. The beginning of the list is in &lt;tt&gt;Level.ControllerList&lt;/tt&gt;, and the link is the &lt;tt&gt;nextController&lt;/tt&gt; field.

==Properties==

===Main ===
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PlayerReplicationInfo : The [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] for this controller.
; [[Legacy:Pawn|Pawn]] Pawn : The Pawn that this entity is controlling.
; int PlayerNum (const) : The player number - per-match player number.
; float SightCounter : Used to keep track of when to check player visibility.
; float FovAngle : X field of view angle in degrees, usually 90.
; float Handedness (globalconfig) : -1 for left, 0 for center, 1 for right, 2 for hidden
; bool bIsPlayer : Pawn is a player or a player-bot.
; bool bGodMode : cheat - when true, can't be killed or hurt

===AI ===
; bool bLOSflag (const) : used for alternating LineOfSight traces
; bool bAdvancedTactics : serpentine movement between pathnodes
; bool bCanOpenDoors : (maybe used for matinees?)
; bool bCanDoSpecial : True if this controller can handle doors and triggers that must be shot &amp;ndash; checked by [[Legacy:Pawn|Pawn]].ShootSpecial().
; bool bAdjusting : adjusting around obstacle 
; bool bPreparingMove : set true while pawn sets up for a latent move
; bool bControlAnimations : take control of animations from pawn (don't let pawn play animations based on notifications)
; bool bEnemyInfoValid : false when change enemy, true when LastSeenPos etc updated
; bool bNotifyApex : event NotifyJumpApex() when at apex of jump
; bool bUsePlayerHearing : No clue
; bool bJumpOverWall : true when jumping to clear obstacle
; bool bEnemyAcquired : Used to get notification when a bot sees someone
; bool bSoaking : Pause and focus the camera on this bot if it encounters a problem
; bool bHuntPlayer : hunting player
; bool bAllowedToTranslocate : 
; bool bAllowedToImpactJump : 
; bool bAdrenalineEnabled : Interesting property - may be useful for a couple of mods?

===Input ===
; byte bRun, bDuck, bFire, bAltFire (input) : These are input flags which are set in your User.ini. It seems that the engine is also checking bFire to automagically trigger the fire event, see [[Legacy:Firing Projectile Weapons|Firing Projectile Weapons]].
; vector AdjustLoc : location to move to while adjusting around obstacle
; Controller nextController (const) : chained Controller list
; float Stimulus : Strength of stimulus - Set when stimulus happens

===Navigation ===
; float MoveTimer : Used in matinee and in AI pathing
; Actor MoveTarget : Actor being moved toward
; vector Destination : Location being moved toward
; vector FocalPoint : Location being looked at
; Actor Focus : Actor being looked at
; [[Legacy:Mover|Mover]] PendingMover : A Mover the Pawn is waiting for to complete its move
; Actor GoalList[4] : Used by navigation AI - list of intermediate goals
; [[Legacy:NavigationPoint|NavigationPoint]] home : Set when begin play, used for retreating and attitude checks
; float MinHitWall : Minimum HitNormal dot Velocity.Normal to get a HitWall event from the physics.  Note that this should be greater than -1.f ( ex. -0.5f &gt; -1.f ) to enable HitWall notifications.
:'''Pingz:''' Someone double check my facts on MinHitWall and remove this comment.
; float RespawnPredictionTime : How far ahead to predict respawns when looking for inventory
; int AcquisitionYawRate : How fast to move on the z axis to aquire a new target (??)

===Enemy Info ===
; [[Legacy:Pawn|Pawn]] Enemy : Pawn of my enemy
; Actor Target : Actor being shot at; usually the enemy
; vector LastSeenPos : enemy position when I last saw enemy (auto updated if EnemyNotVisible() enabled)
; vector LastSeeingPos : position where I last saw enemy (auto updated if EnemyNotVisible enabled)
; float LastSeenTime : Time I saw the last enemy (auto updated if EnemyNotVisible enabled)
; string VoiceType : for speech
; float OldMessageTime : to limit frequency of voice messages

==Functions ==

(incomplete)
; FinishRotation() (native, final, latent) : Waits until the controller has finished rotating(?)
; GetHumanReadableName() : Returns the name of the player associated with this controller.

&lt;USCRIPT&gt;

native(529) final function AddController();
&lt;/USCRIPT&gt;

It looks like this native function helps management of a [[Legacy:LevelInfo|Level]]'s '''''ControllerList''''' - a linked list of all the [[Legacy:Controller|Controller]]s present. The only time it is ever called is in [[Legacy:Controller|Controller]]'s '''''PreBeginPlay()''''' event. To offer further evidence, '''''RemoveController()''''' is only ever called in the '''''Destroy()''''' event.

&lt;USCRIPT&gt;

//Navigation functions - return the next path toward the goal

native(518) final function Actor FindPathTo(vector aPoint);

native(517) final function Actor FindPathToward(actor anActor, optional bool bWeightDetours);

native final function Actor FindPathToIntercept(Pawn P, Actor RouteGoal, optional bool bWeightDetours);

native final function Actor FindPathTowardNearest(class&lt;NavigationPoint&gt; GoalClass, optional bool bWeightDetours);

native(525) final function NavigationPoint FindRandomDest();

&lt;/USCRIPT&gt;

These functions would mainly be useful for AI programming, but pathfinding functions can always be useful in other areas.

&lt;USCRIPT&gt;

/* PawnDied()
 unpossess a pawn (because pawn was killed)
 */

function PawnDied(Pawn P)
&lt;/USCRIPT&gt;

Usually invoked by [[Legacy:Pawn|Pawn]]s in the '''''Dying''''' state.

'''OlympusMons:''' Added these here, some of it is duplicated should this be inline with the normal standard or are native functions done differently?? If they are documented the same as the standard functions I'll fix this up. Maybe these should be listed somewhere else, although they arnt globals they do cover all controller subclasses, except maybe [[Legacy:GUIController|GUIController]]'s

&lt;USCRIPT&gt;

// Latent Movement.

//Note that MoveTo sets the actor's Destination, and MoveToward sets the actor's MoveTarget. 

//Actor will rotate towards destination unless the optional ViewFocus is specified.

native(500) final latent function MoveTo( vector NewDestination, optional Actor ViewFocus, optional bool bShouldWalk);

native(502) final latent function MoveToward(actor NewTarget, optional Actor ViewFocus, optional float DestinationOffset, optional bool bUseStrafing, optional bool bShouldWalk);

native(508) final latent function FinishRotation();
&lt;/USCRIPT&gt;

&lt;USCRIPT&gt;

// native AI functions

// LineOfSightTo() returns true if any of several points of Other is visible (origin, top, bottom)

native(514) final function bool LineOfSightTo(actor Other);

// CanSee() similar to line of sight, but also takes into account Pawn's peripheral vision

native(533) final function bool CanSee(Pawn Other);

//Navigation functions - return the next path toward the goal

native(518) final function Actor FindPathTo(vector aPoint);

native(517) final function Actor FindPathToward(actor anActor, optional bool bWeightDetours);

native final function Actor FindPathToIntercept(Pawn P, Actor RouteGoal, optional bool bWeightDetours);

native final function Actor FindPathTowardNearest(class&lt;NavigationPoint&gt; GoalClass, optional bool bWeightDetours);

native(525) final function NavigationPoint FindRandomDest();

native(523) final function vector EAdjustJump(float BaseZ, float XYSpeed);

//Reachable returns whether direct path from Actor to aPoint is traversable using the current locomotion method

native(521) final function bool pointReachable(vector aPoint);

native(520) final function bool actorReachable(actor anActor);

/* PickWallAdjust()

Check if could jump up over obstruction (only if there is a knee height obstruction)

If so, start jump, and return current destination

Else, try to step around - return a destination 90 degrees right or left depending on traces out and floor checks*/

native(526) final function bool PickWallAdjust(vector HitNormal);

/* WaitForLanding()

latent function returns when pawn is on ground (no longer falling)*/

native(527) final latent function WaitForLanding();

native(540) final function actor FindBestInventoryPath(out float MinWeight);

native final function actor FindBestSuperPickup(float MaxDist); // find nearest super pickup (base has bDelayedSpawn=true)

native(529) final function AddController();

native(530) final function RemoveController();

// Pick best pawn target

native(531) final function pawn PickTarget(out float bestAim, out float bestDist, vector FireDir, vector projStart, float MaxRange);

native(534) final function actor PickAnyTarget(out float bestAim, out float bestDist, vector FireDir, vector projStart);

native final function bool InLatentExecution(int LatentActionNumber); //returns true if controller currently performing latent action specified by LatentActionNumber

// Force end to sleep

native function StopWaiting();

native function EndClimbLadder();

native final function bool CanMakePathTo(Actor A); // assumes valid CurrentPath, tries to see if CurrentPath can be combine with path to N

&lt;/USCRIPT&gt;

==Events==

(incomplete)

&lt;USCRIPT&gt;

Event MayFall() //return true if allowed to fall - called by engine when pawn is about to fall
&lt;/USCRIPT&gt;

But this comment seems to be incorrect, after searching more classes I found:

&lt;USCRIPT&gt;

/* MayFall() called by engine physics if walking and bCanJump, and

	is about to go off a ledge.  Pawn has opportunity (by setting 

	bCanJump to false) to avoid fall*/
&lt;/USCRIPT&gt;

I'm still unable to findout how to use this for players.

==Controller Class Hierarchy==
 Engine.Controller 
    +- Engine.[[Legacy:AIController|AIController]]
    |   +- Gameplay.[[Legacy:ScriptedController|ScriptedController]]
    |   |   +- Unrealgame.[[Legacy:Bot|Bot]]
    |   |   |   +- XGame.[[Legacy:XBot|xBot]]
    |   |   |       +- SkarrjPack.[[Legacy:InvasionBot|InvasionBot]] (Epic Bonuspack &amp; UT2004)
    |   |   +- SkarrjPack.[[Legacy:MonsterController|MonsterController]] (Epic Bonuspack &amp; UT2004)
    |   |   +- Gameplay.[[Legacy:ScriptedTriggerController|ScriptedTriggerController]]
    |   +- UnrealGame.[[Legacy:TurretController|TurretController]] (UT2004)
    |       +- UT2k4AssaultFull.[[Legacy:LinkTurretController|LinkTurretController]]
    |       +- Onslaught.[[Legacy:ONSTurretController|ONSTurretController]]
    |       +- UnrealGame.[[Legacy:SentinelController|SentinelController]]
    |           +- UT2k4Assault.[[Legacy:ASSentinelController|ASSentinelController]]
    +- Engine.[[Legacy:PlayerController|PlayerController]]
        +- Engine.[[Legacy:Camera|Camera]]
        +- Engine.[[Legacy:MessengingSpectator|MessengingSpectator]]
        |   +- xWebAdmin.[[Legacy:UTServerAdminSpectator|UTServerAdminSpectator]]
        +- UnrealGame.[[Legacy:UnrealPlayer|UnrealPlayer]]
            +- UnrealGame.[[Legacy:CinematicPlayer|CinematicPlayer]]
            +- UnrealGame.[[Legacy:DemoRecSpectator|DemoRecSpectator]]
            +- xGame.[[Legacy:XPlayer|xPlayer]]
                +- UT2004s.[[Legacy:UtvSpectator|utvSpectator]] (UT2004)

==Related Pages ==
* [[Legacy:Controller Overview|Controller Overview]]

==Discussion==

'''Chemos:''' This page really needed to be written, and I am compiling information at the moment.  I will finish all this up in a bit.  (First page BTW)  *phew*  Typing that many &quot;controller&quot;s is getting quite annoying.

'''SuperApe:''' Updated Controller Class heirarchy.  Added To Do Category link.

'''OlympusMons:''' Just wondering if all the classtree's should contain the package names as well, maybe they all shouldnt, either is fine I think.

'''SuperApe:''' I'm sure it's useful in some instances, but ideally the class pages have the package name.  It could be fine without them, IMHO.

'''EricBlade:''' PickWallAdjust() claims to return a destination, but it returns bool, and it's one parameter is not declared as &quot;out&quot; .. where does it put the destination?

'''Wormbo:''' How about Controller.AdjustLoc?

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Tidy up.  Move some concept info from [[Legacy:PlayerController|PlayerController]].  Move overview info to [[Legacy:Controller Overview|Controller Overview]].
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2206</id>
      <timestamp>2007-03-28T08:55:07Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>* Question, where does PickWallAdjust &quot;return&quot; it's output to?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; Controller (Package: Engine)}}

This class is a handle to a [[Legacy:Pawn|pawn]].  Pawns are the physical player characters, the controller is the, well, controlling entity moving it around.  There are two subclasses from this class, both are important: [[Legacy:AIController|AIController]] and [[Legacy:PlayerController|PlayerController]]. [[Legacy:Controller Overview|Controller Overview]] covers this in more depth.

From this class, you can control everything from godmode to the pawn that you are focusing on to the adrenaline it has. 

==Notes==
* [[Legacy:Adrenaline|Adrenaline]] is here, not in the pawn class. 
* There is a [[Legacy:Linked List|linked list]] set up of the controllers, allowing you to move to the next controller in the list. The beginning of the list is in &lt;tt&gt;Level.ControllerList&lt;/tt&gt;, and the link is the &lt;tt&gt;nextController&lt;/tt&gt; field.

==Properties==

===Main ===
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PlayerReplicationInfo : The [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] for this controller.
; [[Legacy:Pawn|Pawn]] Pawn : The Pawn that this entity is controlling.
; int PlayerNum (const) : The player number - per-match player number.
; float SightCounter : Used to keep track of when to check player visibility.
; float FovAngle : X field of view angle in degrees, usually 90.
; float Handedness (globalconfig) : -1 for left, 0 for center, 1 for right, 2 for hidden
; bool bIsPlayer : Pawn is a player or a player-bot.
; bool bGodMode : cheat - when true, can't be killed or hurt

===AI ===
; bool bLOSflag (const) : used for alternating LineOfSight traces
; bool bAdvancedTactics : serpentine movement between pathnodes
; bool bCanOpenDoors : (maybe used for matinees?)
; bool bCanDoSpecial : True if this controller can handle doors and triggers that must be shot &amp;ndash; checked by [[Legacy:Pawn|Pawn]].ShootSpecial().
; bool bAdjusting : adjusting around obstacle 
; bool bPreparingMove : set true while pawn sets up for a latent move
; bool bControlAnimations : take control of animations from pawn (don't let pawn play animations based on notifications)
; bool bEnemyInfoValid : false when change enemy, true when LastSeenPos etc updated
; bool bNotifyApex : event NotifyJumpApex() when at apex of jump
; bool bUsePlayerHearing : No clue
; bool bJumpOverWall : true when jumping to clear obstacle
; bool bEnemyAcquired : Used to get notification when a bot sees someone
; bool bSoaking : Pause and focus the camera on this bot if it encounters a problem
; bool bHuntPlayer : hunting player
; bool bAllowedToTranslocate : 
; bool bAllowedToImpactJump : 
; bool bAdrenalineEnabled : Interesting property - may be useful for a couple of mods?

===Input ===
; byte bRun, bDuck, bFire, bAltFire (input) : These are input flags which are set in your User.ini. It seems that the engine is also checking bFire to automagically trigger the fire event, see [[Legacy:Firing Projectile Weapons|Firing Projectile Weapons]].
; vector AdjustLoc : location to move to while adjusting around obstacle
; Controller nextController (const) : chained Controller list
; float Stimulus : Strength of stimulus - Set when stimulus happens

===Navigation ===
; float MoveTimer : Used in matinee and in AI pathing
; Actor MoveTarget : Actor being moved toward
; vector Destination : Location being moved toward
; vector FocalPoint : Location being looked at
; Actor Focus : Actor being looked at
; [[Legacy:Mover|Mover]] PendingMover : A Mover the Pawn is waiting for to complete its move
; Actor GoalList[4] : Used by navigation AI - list of intermediate goals
; [[Legacy:NavigationPoint|NavigationPoint]] home : Set when begin play, used for retreating and attitude checks
; float MinHitWall : Minimum HitNormal dot Velocity.Normal to get a HitWall event from the physics.  Note that this should be greater than -1.f ( ex. -0.5f &gt; -1.f ) to enable HitWall notifications.
:'''Pingz:''' Someone double check my facts on MinHitWall and remove this comment.
; float RespawnPredictionTime : How far ahead to predict respawns when looking for inventory
; int AcquisitionYawRate : How fast to move on the z axis to aquire a new target (??)

===Enemy Info ===
; [[Legacy:Pawn|Pawn]] Enemy : Pawn of my enemy
; Actor Target : Actor being shot at; usually the enemy
; vector LastSeenPos : enemy position when I last saw enemy (auto updated if EnemyNotVisible() enabled)
; vector LastSeeingPos : position where I last saw enemy (auto updated if EnemyNotVisible enabled)
; float LastSeenTime : Time I saw the last enemy (auto updated if EnemyNotVisible enabled)
; string VoiceType : for speech
; float OldMessageTime : to limit frequency of voice messages

==Functions ==

(incomplete)
; FinishRotation() (native, final, latent) : Waits until the controller has finished rotating(?)
; GetHumanReadableName() : Returns the name of the player associated with this controller.

&lt;USCRIPT&gt;

native(529) final function AddController();
&lt;/USCRIPT&gt;

It looks like this native function helps management of a [[Legacy:LevelInfo|Level]]'s '''''ControllerList''''' - a linked list of all the [[Legacy:Controller|Controller]]s present. The only time it is ever called is in [[Legacy:Controller|Controller]]'s '''''PreBeginPlay()''''' event. To offer further evidence, '''''RemoveController()''''' is only ever called in the '''''Destroy()''''' event.

&lt;USCRIPT&gt;

//Navigation functions - return the next path toward the goal

native(518) final function Actor FindPathTo(vector aPoint);

native(517) final function Actor FindPathToward(actor anActor, optional bool bWeightDetours);

native final function Actor FindPathToIntercept(Pawn P, Actor RouteGoal, optional bool bWeightDetours);

native final function Actor FindPathTowardNearest(class&lt;NavigationPoint&gt; GoalClass, optional bool bWeightDetours);

native(525) final function NavigationPoint FindRandomDest();

&lt;/USCRIPT&gt;

These functions would mainly be useful for AI programming, but pathfinding functions can always be useful in other areas.

&lt;USCRIPT&gt;

/* PawnDied()
 unpossess a pawn (because pawn was killed)
 */

function PawnDied(Pawn P)
&lt;/USCRIPT&gt;

Usually invoked by [[Legacy:Pawn|Pawn]]s in the '''''Dying''''' state.

'''OlympusMons:''' Added these here, some of it is duplicated should this be inline with the normal standard or are native functions done differently?? If they are documented the same as the standard functions I'll fix this up. Maybe these should be listed somewhere else, although they arnt globals they do cover all controller subclasses, except maybe [[Legacy:GUIController|GUIController]]'s

&lt;USCRIPT&gt;

// Latent Movement.

//Note that MoveTo sets the actor's Destination, and MoveToward sets the actor's MoveTarget. 

//Actor will rotate towards destination unless the optional ViewFocus is specified.

native(500) final latent function MoveTo( vector NewDestination, optional Actor ViewFocus, optional bool bShouldWalk);

native(502) final latent function MoveToward(actor NewTarget, optional Actor ViewFocus, optional float DestinationOffset, optional bool bUseStrafing, optional bool bShouldWalk);

native(508) final latent function FinishRotation();
&lt;/USCRIPT&gt;

&lt;USCRIPT&gt;

// native AI functions

// LineOfSightTo() returns true if any of several points of Other is visible (origin, top, bottom)

native(514) final function bool LineOfSightTo(actor Other);

// CanSee() similar to line of sight, but also takes into account Pawn's peripheral vision

native(533) final function bool CanSee(Pawn Other);

//Navigation functions - return the next path toward the goal

native(518) final function Actor FindPathTo(vector aPoint);

native(517) final function Actor FindPathToward(actor anActor, optional bool bWeightDetours);

native final function Actor FindPathToIntercept(Pawn P, Actor RouteGoal, optional bool bWeightDetours);

native final function Actor FindPathTowardNearest(class&lt;NavigationPoint&gt; GoalClass, optional bool bWeightDetours);

native(525) final function NavigationPoint FindRandomDest();

native(523) final function vector EAdjustJump(float BaseZ, float XYSpeed);

//Reachable returns whether direct path from Actor to aPoint is traversable using the current locomotion method

native(521) final function bool pointReachable(vector aPoint);

native(520) final function bool actorReachable(actor anActor);

/* PickWallAdjust()

Check if could jump up over obstruction (only if there is a knee height obstruction)

If so, start jump, and return current destination

Else, try to step around - return a destination 90 degrees right or left depending on traces out and floor checks*/

native(526) final function bool PickWallAdjust(vector HitNormal);

/* WaitForLanding()

latent function returns when pawn is on ground (no longer falling)*/

native(527) final latent function WaitForLanding();

native(540) final function actor FindBestInventoryPath(out float MinWeight);

native final function actor FindBestSuperPickup(float MaxDist); // find nearest super pickup (base has bDelayedSpawn=true)

native(529) final function AddController();

native(530) final function RemoveController();

// Pick best pawn target

native(531) final function pawn PickTarget(out float bestAim, out float bestDist, vector FireDir, vector projStart, float MaxRange);

native(534) final function actor PickAnyTarget(out float bestAim, out float bestDist, vector FireDir, vector projStart);

native final function bool InLatentExecution(int LatentActionNumber); //returns true if controller currently performing latent action specified by LatentActionNumber

// Force end to sleep

native function StopWaiting();

native function EndClimbLadder();

native final function bool CanMakePathTo(Actor A); // assumes valid CurrentPath, tries to see if CurrentPath can be combine with path to N

&lt;/USCRIPT&gt;

==Events==

(incomplete)

&lt;USCRIPT&gt;

Event MayFall() //return true if allowed to fall - called by engine when pawn is about to fall
&lt;/USCRIPT&gt;

But this comment seems to be incorrect, after searching more classes I found:

&lt;USCRIPT&gt;

/* MayFall() called by engine physics if walking and bCanJump, and

	is about to go off a ledge.  Pawn has opportunity (by setting 

	bCanJump to false) to avoid fall*/
&lt;/USCRIPT&gt;

I'm still unable to findout how to use this for players.

==Controller Class Hierarchy==
 Engine.Controller 
    +- Engine.[[Legacy:AIController|AIController]]
    |   +- Gameplay.[[Legacy:ScriptedController|ScriptedController]]
    |   |   +- Unrealgame.[[Legacy:Bot|Bot]]
    |   |   |   +- XGame.[[Legacy:XBot|xBot]]
    |   |   |       +- SkarrjPack.[[Legacy:InvasionBot|InvasionBot]] (Epic Bonuspack &amp; UT2004)
    |   |   +- SkarrjPack.[[Legacy:MonsterController|MonsterController]] (Epic Bonuspack &amp; UT2004)
    |   |   +- Gameplay.[[Legacy:ScriptedTriggerController|ScriptedTriggerController]]
    |   +- UnrealGame.[[Legacy:TurretController|TurretController]] (UT2004)
    |       +- UT2k4AssaultFull.[[Legacy:LinkTurretController|LinkTurretController]]
    |       +- Onslaught.[[Legacy:ONSTurretController|ONSTurretController]]
    |       +- UnrealGame.[[Legacy:SentinelController|SentinelController]]
    |           +- UT2k4Assault.[[Legacy:ASSentinelController|ASSentinelController]]
    +- Engine.[[Legacy:PlayerController|PlayerController]]
        +- Engine.[[Legacy:Camera|Camera]]
        +- Engine.[[Legacy:MessengingSpectator|MessengingSpectator]]
        |   +- xWebAdmin.[[Legacy:UTServerAdminSpectator|UTServerAdminSpectator]]
        +- UnrealGame.[[Legacy:UnrealPlayer|UnrealPlayer]]
            +- UnrealGame.[[Legacy:CinematicPlayer|CinematicPlayer]]
            +- UnrealGame.[[Legacy:DemoRecSpectator|DemoRecSpectator]]
            +- xGame.[[Legacy:XPlayer|xPlayer]]
                +- UT2004s.[[Legacy:UtvSpectator|utvSpectator]] (UT2004)

==Related Pages ==
* [[Legacy:Controller Overview|Controller Overview]]

==Discussion==

'''Chemos:''' This page really needed to be written, and I am compiling information at the moment.  I will finish all this up in a bit.  (First page BTW)  *phew*  Typing that many &quot;controller&quot;s is getting quite annoying.

'''SuperApe:''' Updated Controller Class heirarchy.  Added To Do Category link.

'''OlympusMons:''' Just wondering if all the classtree's should contain the package names as well, maybe they all shouldnt, either is fine I think.

'''SuperApe:''' I'm sure it's useful in some instances, but ideally the class pages have the package name.  It could be fine without them, IMHO.

'''EricBlade:''' PickWallAdjust() claims to return a destination, but it returns bool, and it's one parameter is not declared as &quot;out&quot; .. where does it put the destination?

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Tidy up.  Move some concept info from [[Legacy:PlayerController|PlayerController]].  Move overview info to [[Legacy:Controller Overview|Controller Overview]].
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Controller Overview</title>
    <id>794</id>
    <revision>
      <id>2248</id>
      <timestamp>2005-12-07T20:29:44Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A UT200x player is composed of a number of classes that all work together to accept and process input from the player and handle collision with the world.  Bots use much the same system, so processing of AI also takes place (for Bot-specific subclasses; more on that in a minute) within the same code.  What follows is an attempt to explain the different classes involved and how they interact.

; Controller: The base interface to a pawn.
;*Receives events from the engine that are destined for the [[Legacy:Pawn|Pawn]],
;*Handles AI,
;*Acts as an animation interface,
;*Controllers are partially implemented using native code and have native replication,
;*Most of the time, each [[Legacy:Controller|Controller]] has a [[Legacy:Pawn|Pawn]] attached to it,
;*A good way to visualise the [[Legacy:Controller|Controller]]/[[Legacy:Pawn|Pawn]] interface is to consider the [[Legacy:Controller|Controller]] the &quot;brain&quot; of a [[Legacy:Pawn|Pawn]] (which is the &quot;body&quot;).

The class definition of [[Legacy:Controller|Controller]] shows that it is an ''abstract'' class - this means that this isn't the class actually used in [[Legacy:UT2003|UT2003]]; human players use [[Legacy:XPlayer|xPlayer]] while bots use [[Legacy:XBot|xBot]].

The gametype of the current [[Legacy:LevelInfo|Level]] specifies the type of [[Legacy:Controller|Controller]] for bots and players to use.  As bots don't cheat in [[Legacy:UT2003|UT2003]], the [[Legacy:XBot|xBot]] class doesn't have a number of security-related classes that the [[Legacy:XPlayer|xPlayer]] has.

One of these differences is that a [[Legacy:PlayerInput|PlayerInput]] class is attached to each (human) player, and this processes keyboard/mouse/joystick input and (then) passes it to the [[Legacy:Controller|Controller]].

The other is the [[Legacy:CheatManager|CheatManager]] class; this is involved with handling console commands (such as cheats such as &quot;god&quot;) and other debug functions that can only be called in '''Instant Action''' (or other custom non-network gametypes).

Unlike The Matrix, [[Legacy:Pawn|Pawn]]s can exist without [[Legacy:Controller|Controller]]s and vice-versa.  Indeed, the alternate firemode of the Redeemer creates a new [[Legacy:Pawn|Pawn]] that the Player's [[Legacy:Controller|Controller]] possesses - this is how the Player's mouse/keyboard input is &quot;mapped&quot; onto the Redeemer.

==Some Useful Properties==
; Engine.[[Legacy:GameInfo|GameInfo]].PlayerControllerClass : This property defines the class to use to control the player.  Changing this class will allow you to alter the view the player sees in first person, behind view, and spectator mode.  It also handles lots of stuff that only execute on the client.  The default value for this is not set although Engine.[[Legacy:PlayerController|PlayerController]] (UnrealGame.[[Legacy:DeathMatch|DeathMatch]] specifies xGame.[[Legacy:XPlayer|xPlayer]]) will be instantiated if a subclass of GameInfo fails to provide a default value by using the PlayerControllerClassName property.

; Engine.[[Legacy:GameInfo|GameInfo]].DefaultPlayerClassName : This property allows the default player class as displayed within the 3D world to be specified.  The class specified by this property handles all the classic player pawn stuff (animation, physics, blah blah blah).  The default value for this specified in UnrealGame.[[Legacy:DeathMatch|DeathMatch]] is xGame.[[Legacy:XPawn|xPawn]].

; Engine.[[Legacy:PlayerController|PlayerController]].CheatManager : This property specifies the class to use to handle the cheat manager.  If you want to add new console commands then this is the class you need to replace.  The default value set within the PlayerController class is Engine.[[Legacy:CheatManager|CheatManager]].

; Engine.[[Legacy:PlayerController|PlayerController]].PlayerInput : This property specifies the class use to capture and process player input.  So if you want to change the way double-click moving works or mouse smoothing then this is the place to start.

==Related Pages ==
* [[Legacy:Controller|Controller]] &amp;ndash; Base class
** [[Legacy:AIController|AIController]] &amp;ndash; Artificially intelligent agents
** [[Legacy:PlayerController|PlayerController]] &amp;ndash; A slightly more in depth look at the relationship between player controllers and pawns.
* [[Legacy:Engine_Concept|Engine_Concept]] &amp;ndash; A list of definitions of terms used on this page.

==Discussion==

'''Tarquin:''' Merge needed of the two intros above. Since I don't know much about it, someone else should do it. The stuff on [[Legacy:PlayerController|PlayerController]] has been moved to, well, [[Legacy:PlayerController|PlayerController]]. 

'''DJPaul:''' Started doing Mr. T's merge; hopefully it's not too bad.

'''scumble:''' It's an oversimplification to say that the [[Legacy:LevelInfo|Level]] determines the [[Legacy:Controller|Controller]] used by Pawns. From what I found out recently, it's one of the defaultproperties in [[Legacy:XPawn|xPawn]] that specifies XGame.[[Legacy:XBot|xBot]] as the controller. The [[Legacy:GameInfo|GameInfo]] only specifies the [[Legacy:Roster|Roster]] class. You have to get down to [[Legacy:XRosterEntry|xRosterEntry]] before you find the code that returns [[Legacy:XPawns|xPawns]] for the Enemy team.

'''Daid303:''' It's says that the &quot;gametype of the current [[Legacy:LevelInfo|Level]]&quot; not the &quot;[[Legacy:LevelInfo|Level]]&quot; determines the controller class. And that's 100% true :) But yes, for bots it gets it from the Roster. But that's not true for normal players.

'''scumble:''' Yes, I meant gametype! I'm really advocating a little elaboration on the difference between how Bots and Players are spawned. They seem to work in opposite directions.

----

[[:Category:Legacy To Do]] &amp;ndash; Make this a more complete overview of all Controllers with relevant links to [[Legacy:Controller|Controller]] and its subclasses.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2249</id>
      <timestamp>2005-01-14T02:24:19Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">A UT2003 player is composed of a number of classes that all work together to accept and process input from the player and handle collision with the world.  Bots use much the same system, so processing of AI also takes place (for Bot-specific subclasses; more on that in a minute) within the same code.  What follows is an attempt to explain the different classes involved and how they interact.

; Controller: The base interface to a pawn.
;*Receives events from the engine that are destined for the [[Legacy:Pawn|Pawn]],
;*Handles AI,
;*Acts as an animation interface,
;*Controllers are partially implemented using native code and have native replication,
;*Most of the time, each [[Legacy:Controller|Controller]] has a [[Legacy:Pawn|Pawn]] attached to it,
;*A good way to visualise the [[Legacy:Controller|Controller]]/[[Legacy:Pawn|Pawn]] interface is to consider the [[Legacy:Controller|Controller]] the &quot;brain&quot; of a [[Legacy:Pawn|Pawn]] (which is the &quot;body&quot;).

The class definition of [[Legacy:Controller|Controller]] shows that it is an ''abstract'' class - this means that this isn't the class actually used in [[Legacy:UT2003|UT2003]]; human players use [[Legacy:XPlayer|xPlayer]] while bots use [[Legacy:XBot|xBot]].

The gametype of the current [[Legacy:LevelInfo|Level]] specifies the type of [[Legacy:Controller|Controller]] for bots and players to use.  As bots don't cheat in [[Legacy:UT2003|UT2003]], the [[Legacy:XBot|xBot]] class doesn't have a number of security-related classes that the [[Legacy:XPlayer|xPlayer]] has.

One of these differences is that a [[Legacy:PlayerInput|PlayerInput]] class is attached to each (human) player, and this processes keyboard/mouse/joystick input and (then) passes it to the [[Legacy:Controller|Controller]].

The other is the [[Legacy:CheatManager|CheatManager]] class; this is involved with handling console commands (such as cheats such as &quot;god&quot;) and other debug functions that can only be called in '''Instant Action''' (or other custom non-network gametypes).

Unlike The Matrix, [[Legacy:Pawn|Pawn]]s can exist without [[Legacy:Controller|Controller]]s and vice-versa.  Indeed, the alternate firemode of the Redeemer creates a new [[Legacy:Pawn|Pawn]] that the Player's [[Legacy:Controller|Controller]] possesses - this is how the Player's mouse/keyboard input is &quot;mapped&quot; onto the Redeemer.

==Some Useful Properties ==
; Engine.[[Legacy:GameInfo|GameInfo]].PlayerControllerClass : This property defines the class to use to control the player.  Changing this class will allow you to alter the view the player sees in first person, behind view, and spectator mode.  It also handles lots of stuff that only execute on the client.  The default value for this is not set although Engine.[[Legacy:PlayerController|PlayerController]] (UnrealGame.[[Legacy:DeathMatch|DeathMatch]] specifies xGame.[[Legacy:XPlayer|xPlayer]]) will be instantiated if a subclass of GameInfo fails to provide a default value by using the PlayerControllerClassName property.

; Engine.[[Legacy:GameInfo|GameInfo]].DefaultPlayerClassName : This property allows the default player class as displayed within the 3D world to be specified.  The class specified by this property handles all the classic player pawn stuff (animation, physics, blah blah blah).  The default value for this specified in UnrealGame.[[Legacy:DeathMatch|DeathMatch]] is xGame.[[Legacy:XPawn|xPawn]].

; Engine.[[Legacy:PlayerController|PlayerController]].CheatManager : This property specifies the class to use to handle the cheat manager.  If you want to add new console commands then this is the class you need to replace.  The default value set within the PlayerController class is Engine.[[Legacy:CheatManager|CheatManager]].

; Engine.[[Legacy:PlayerController|PlayerController]].PlayerInput : This property specifies the class use to capture and process player input.  So if you want to change the way double-click moving works or mouse smoothing then this is the place to start.

==Related Pages ==
* [[Legacy:PlayerController|PlayerController]] &amp;ndash; A slightly more in depth look at the relationship between player controllers and pawns.
* [[Legacy:Engine_Concept|Engine_Concept]] &amp;ndash; A list of definitions of terms used on this page.

----

==Comments ==

'''Tarquin:''' Merge needed of the two intros above. Since I don't know much about it, someone else should do it. The stuff on [[Legacy:PlayerController|PlayerController]] has been moved to, well, [[Legacy:PlayerController|PlayerController]]. 

'''DJPaul:''' Started doing Mr. T's merge; hopefully it's not too bad.

'''scumble:''' It's an oversimplification to say that the [[Legacy:LevelInfo|Level]] determines the [[Legacy:Controller|Controller]] used by Pawns. From what I found out recently, it's one of the defaultproperties in [[Legacy:XPawn|xPawn]] that specifies XGame.[[Legacy:XBot|xBot]] as the controller. The [[Legacy:GameInfo|GameInfo]] only specifies the [[Legacy:Roster|Roster]] class. You have to get down to [[Legacy:XRosterEntry|xRosterEntry]] before you find the code that returns [[Legacy:XPawns|xPawns]] for the Enemy team.

'''Daid303:''' It's says that the &quot;gametype of the current [[Legacy:LevelInfo|Level]]&quot; not the &quot;[[Legacy:LevelInfo|Level]]&quot; determines the controller class. And that's 100% true :) But yes, for bots it gets it from the Roster. But that's not true for normal players.

'''scumble:''' Yes, I meant gametype! I'm really advocating a little elaboration on the difference between how Bots and Players are spawned. They seem to work in opposite directions.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2250</id>
      <timestamp>2005-11-14T21:54:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A UT2003 player is composed of a number of classes that all work together to accept and process input from the player and handle collision with the world.  Bots use much the same system, so processing of AI also takes place (for Bot-specific subclasses; more on that in a minute) within the same code.  What follows is an attempt to explain the different classes involved and how they interact.

; Controller: The base interface to a pawn.
;*Receives events from the engine that are destined for the [[Legacy:Pawn|Pawn]],
;*Handles AI,
;*Acts as an animation interface,
;*Controllers are partially implemented using native code and have native replication,
;*Most of the time, each [[Legacy:Controller|Controller]] has a [[Legacy:Pawn|Pawn]] attached to it,
;*A good way to visualise the [[Legacy:Controller|Controller]]/[[Legacy:Pawn|Pawn]] interface is to consider the [[Legacy:Controller|Controller]] the &quot;brain&quot; of a [[Legacy:Pawn|Pawn]] (which is the &quot;body&quot;).

The class definition of [[Legacy:Controller|Controller]] shows that it is an ''abstract'' class - this means that this isn't the class actually used in [[Legacy:UT2003|UT2003]]; human players use [[Legacy:XPlayer|xPlayer]] while bots use [[Legacy:XBot|xBot]].

The gametype of the current [[Legacy:LevelInfo|Level]] specifies the type of [[Legacy:Controller|Controller]] for bots and players to use.  As bots don't cheat in [[Legacy:UT2003|UT2003]], the [[Legacy:XBot|xBot]] class doesn't have a number of security-related classes that the [[Legacy:XPlayer|xPlayer]] has.

One of these differences is that a [[Legacy:PlayerInput|PlayerInput]] class is attached to each (human) player, and this processes keyboard/mouse/joystick input and (then) passes it to the [[Legacy:Controller|Controller]].

The other is the [[Legacy:CheatManager|CheatManager]] class; this is involved with handling console commands (such as cheats such as &quot;god&quot;) and other debug functions that can only be called in '''Instant Action''' (or other custom non-network gametypes).

Unlike The Matrix, [[Legacy:Pawn|Pawn]]s can exist without [[Legacy:Controller|Controller]]s and vice-versa.  Indeed, the alternate firemode of the Redeemer creates a new [[Legacy:Pawn|Pawn]] that the Player's [[Legacy:Controller|Controller]] possesses - this is how the Player's mouse/keyboard input is &quot;mapped&quot; onto the Redeemer.

==Some Useful Properties==
; Engine.[[Legacy:GameInfo|GameInfo]].PlayerControllerClass : This property defines the class to use to control the player.  Changing this class will allow you to alter the view the player sees in first person, behind view, and spectator mode.  It also handles lots of stuff that only execute on the client.  The default value for this is not set although Engine.[[Legacy:PlayerController|PlayerController]] (UnrealGame.[[Legacy:DeathMatch|DeathMatch]] specifies xGame.[[Legacy:XPlayer|xPlayer]]) will be instantiated if a subclass of GameInfo fails to provide a default value by using the PlayerControllerClassName property.

; Engine.[[Legacy:GameInfo|GameInfo]].DefaultPlayerClassName : This property allows the default player class as displayed within the 3D world to be specified.  The class specified by this property handles all the classic player pawn stuff (animation, physics, blah blah blah).  The default value for this specified in UnrealGame.[[Legacy:DeathMatch|DeathMatch]] is xGame.[[Legacy:XPawn|xPawn]].

; Engine.[[Legacy:PlayerController|PlayerController]].CheatManager : This property specifies the class to use to handle the cheat manager.  If you want to add new console commands then this is the class you need to replace.  The default value set within the PlayerController class is Engine.[[Legacy:CheatManager|CheatManager]].

; Engine.[[Legacy:PlayerController|PlayerController]].PlayerInput : This property specifies the class use to capture and process player input.  So if you want to change the way double-click moving works or mouse smoothing then this is the place to start.

==Related Pages ==
* [[Legacy:Controller|Controller]] &amp;ndash; Base class
** [[Legacy:AIController|AIController]] &amp;ndash; Artificially intelligent agents
** [[Legacy:PlayerController|PlayerController]] &amp;ndash; A slightly more in depth look at the relationship between player controllers and pawns.
* [[Legacy:Engine_Concept|Engine_Concept]] &amp;ndash; A list of definitions of terms used on this page.

==Discussion==

'''Tarquin:''' Merge needed of the two intros above. Since I don't know much about it, someone else should do it. The stuff on [[Legacy:PlayerController|PlayerController]] has been moved to, well, [[Legacy:PlayerController|PlayerController]]. 

'''DJPaul:''' Started doing Mr. T's merge; hopefully it's not too bad.

'''scumble:''' It's an oversimplification to say that the [[Legacy:LevelInfo|Level]] determines the [[Legacy:Controller|Controller]] used by Pawns. From what I found out recently, it's one of the defaultproperties in [[Legacy:XPawn|xPawn]] that specifies XGame.[[Legacy:XBot|xBot]] as the controller. The [[Legacy:GameInfo|GameInfo]] only specifies the [[Legacy:Roster|Roster]] class. You have to get down to [[Legacy:XRosterEntry|xRosterEntry]] before you find the code that returns [[Legacy:XPawns|xPawns]] for the Enemy team.

'''Daid303:''' It's says that the &quot;gametype of the current [[Legacy:LevelInfo|Level]]&quot; not the &quot;[[Legacy:LevelInfo|Level]]&quot; determines the controller class. And that's 100% true :) But yes, for bots it gets it from the Roster. But that's not true for normal players.

'''scumble:''' Yes, I meant gametype! I'm really advocating a little elaboration on the difference between how Bots and Players are spawned. They seem to work in opposite directions.

----

[[:Category:Legacy To Do]] &amp;ndash; Make this a more complete overview of all Controllers with relevant links to [[Legacy:Controller|Controller]] and its subclasses.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Conversation (DX)</title>
    <id>856</id>
    <revision>
      <id>2387</id>
      <timestamp>2004-02-12T00:41:29Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:ConObject (DX)|ConObject (DX)]] &gt;&gt; Conversation (ConSys)}}

==Properties==
; String audioPackageName : Unique identifier of audio package.  this is used to generate audio names so we can demand load audio from a package
; Bool bCanBeInterrupted : True if this conversation can be interrupted by another
; Bool bCannotBeInterrupted : True if this conversation CANNOT be interrupted by another
; bool bDataLinkCon : True if this is a DataLink conversation
; Bool bDisplayOnce : Flag to display conversation only once
; Bool bFirstPerson : Remain in First-Person mode
; bool bGenerateAudioNames : True if we're to auto-generate filenames for the audio
; Bool bInvokeBump : Invoke by Bumping
; Bool bInvokeFrob : Invoke by Frobbing
; Bool bInvokeRadius : Invoke by Radius
; Bool bInvokeSight : Invoke by Sight
; Bool bNonInteractive : True if non-interactive conversation
; Bool bRandomCamera : True if random camera placement
; name conName : Conversation name
; String conOwnerName : Name of Actor owner
; int conversationID : Internal Conversation ID
; string CreatedBy : Who created event
; String Description : Description
; ConEvent eventList : First Event
; ConFlagRef flagRefList : Flag List
; Float lastPlayedTime : Time when conversation last played (ended).
; int ownerRefCount : Number of owners this conversation has
; int radiusDistance : Distance from PC needed to invoke conversation, 0 = Frob

==Functions==
;  AddFlagRef( Name flagName , Bool value ): Adds a flag reference, using the given flag name and value passed in
;  BindActorEvents( Actor actorToBind ): 
;  BindEvents( Actor conBoundActors [ 10 ] , Actor invokeActor ): 
; bool CheckActorDistances( Actor player ): Checks to see how far all the actors are away from each other to make sure it's reasonable to start a conversation. Ignore the player in these checks.
; bool CheckActors( optional bool bLogActors ): Checks to see if all the actors doing speaking in the conversation actually exist.
;  ClearBindEvents( ): 
; ConCamera CreateConCamera( ): 
; ConFlagRef CreateFlagRef( Name flagName , bool flagValue ): 
; ConEvent GetEventFromLabel( String searchLabel ): Searches this conversation for a label and returns it.  If it can't ind a matching label then it returns None.
; String GetFirstSpeakerDisplayName( optional String startLabel ): GetFirstSpeakerDisplayName()
;  GetFirstSpeechActors( out Actor firstSpeaker , out Actor firstSpeakingTo ): Looks for the first Speech event in this conversation and returns the speaker and speakingTo actors.  This is used to setup the first camera event
; Sound GetSpeechAudio( int soundID ): 
; Float GetSpeechLength( int soundID ): 
; Bool IsSpeakingActor( Actor speakingActor ): Looks to see if the actor passed in is even involved in this conversation.  Returns True if the actor has a speaking part.

[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2388</id>
      <timestamp>2004-02-12T00:31:49Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:ConObject (DX)|ConObject (DX)]] &gt;&gt; Conversation (ConSys)}}

==Properties==
; String audioPackageName : Unique identifier of audio package.  this is used to generate audio names so we can demand load audio from a package
; Bool bCanBeInterrupted : True if this conversation can be interrupted by another
; Bool bCannotBeInterrupted : True if this conversation CANNOT be interrupted by another
; bool bDataLinkCon : True if this is a DataLink conversation
; Bool bDisplayOnce : Flag to display conversation only once
; Bool bFirstPerson : Remain in First-Person mode
; bool bGenerateAudioNames : True if we're to auto-generate filenames for the audio
; Bool bInvokeBump : Invoke by Bumping
; Bool bInvokeFrob : Invoke by Frobbing
; Bool bInvokeRadius : Invoke by Radius
; Bool bInvokeSight : Invoke by Sight
; Bool bNonInteractive : True if non-interactive conversation
; Bool bRandomCamera : True if random camera placement
; name conName : Conversation name
; String conOwnerName : Name of Actor owner
; int conversationID : Internal Conversation ID
; string CreatedBy : Who created event
; String Description : Description
; ConEvent eventList : First Event
; ConFlagRef flagRefList : Flag List
; Float lastPlayedTime : Time when conversation last played (ended).
; int ownerRefCount : Number of owners this conversation has
; int radiusDistance : Distance from PC needed to invoke conversation, 0 = Frob

==Functions==
;  AddFlagRef( Name flagName , Bool value ): Adds a flag reference, using the given flag name and value passed in
;  BindActorEvents( Actor actorToBind ): 
;  BindEvents( Actor conBoundActors [ 10 ] , Actor invokeActor ): 
; bool CheckActorDistances( Actor player ): Checks to see how far all the actors are away from each other to make sure it's reasonable to start a conversation. Ignore the player in these checks.
; bool CheckActors( optional bool bLogActors ): Checks to see if all the actors doing speaking in the conversation actually exist.
;  ClearBindEvents( ): 
; ConCamera CreateConCamera( ): 
; ConFlagRef CreateFlagRef( Name flagName , bool flagValue ): 
; ConEvent GetEventFromLabel( String searchLabel ): Searches this conversation for a label and returns it.  If it can't ind a matching label then it returns None.
; String GetFirstSpeakerDisplayName( optional String startLabel ): GetFirstSpeakerDisplayName()
;  GetFirstSpeechActors( out Actor firstSpeaker , out Actor firstSpeakingTo ): Looks for the first Speech event in this conversation and returns the speaker and speakingTo actors.  This is used to setup the first camera event
; Sound GetSpeechAudio( int soundID ): 
; Float GetSpeechLength( int soundID ): 
; Bool IsSpeakingActor( Actor speakingActor ): Looks to see if the actor passed in is even involved in this conversation.  Returns True if the actor has a speaking part.

==Events==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Converting U2XMP Map To UTXMP</title>
    <id>891</id>
    <revision>
      <id>2462</id>
      <timestamp>2005-07-17T16:28:02Z</timestamp>
      <contributor>
        <ip>Nat4-31.iti.lt</ip>
      </contributor>
      <minor/>
      <comment>Deleted nonsense which i wrote myself half year ago.</comment>
      <text xml:space="preserve">==Using U2XMP assets==

===Textures===

What to do if you have problems using U2XMP texture packs you created by simply copying them?

For example, you need MyTexture texture from MyPackage.utx package. The workaround would be:
# Open MyPackage.utx with UT2004 editor
# Right click MyTexture texture and choose rename
# Change package name to MyPackage_temp (any different name is ok)
# Do the same with all textures you want to use
# Save MyPackage_temp package to disk
# Close unreal editor
# Delete MyPackage.utx and rename MyPackage_temp.utx to MyPackage.utx

Now you have working texture package, which is compatible with original one.

It seems that there are still some problems with DXT3 textures, causing them to appear corrupted on older video cards.

===Static meshes===

Every static mesh uses some texture packages. All textures should be in your UT textures folder before using static meshes.

The simple way would be: import static mesh to UT UED with the same name and pivot point as it had in U2XMP UED, and you can select_all/copy/paste all meshes in level. The hard part is importing them. If they are original U2XMP meshes, you have just open package which contains them. If they are custom ones, you better have original 3dsmax or Maya models :). Of course, you probably don't have them. So there is one way left, if you don't want to remake them:
# Convert static mesh to brush
# Export brush to file
# In UT UED prepare and open textures the brush uses
# In UT UED import brush from file
# Convert brush to static mesh

have in mind that you may loose static mesh optimisations and/or smoothing groups, so your meshes will look crappy.

===Brushes===

The first thing that you have to do is to copy brushes, or at least main cube brush.

Before copying any brush, you must have all textures with the same name the brush is using opened in UT UED (package does not matter) in order them to be automatically assigned.

If you feel lucky, you can try to copy/paste (right click in top viewport and choose &quot;paste to original location&quot;) all brushes at once. However, there may be problems with subtracted brushes and zone portals. You may have to delete them and try to add again, or create new.

===Terrain===

Don't copy terrain info actor, but add new. Then move Heightmap, Alpha layers and terrain textures from U2XMP map to new package (it may be MyLevel), and manually edit TerrainInfo actor properties: Heightmap texture, scaling, movement/location, etc. Rebuild your level and you should see your terrain. You may probably need to paint terrain visibility manually.

===Lights===

Lights in UT are ~50% darker than in U2XMP. So in some cases its easier to create new lights than copy old ones, because lighting effect is also a little different.

==See also==

[[Legacy:Mapping_For_UTXMP/Adding Radar|Mapping_For_UTXMP/Adding radar]]

Back to [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]</text>
    </revision>
    <revision>
      <id>2463</id>
      <timestamp>2004-12-19T19:24:54Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <comment>This could be separate page</comment>
      <text xml:space="preserve">==Using U2XMP assets==

===Textures===

What to do if you have problems using U2XMP texture packs you created by simply copying them?

For example, you need MyTexture texture from MyPackage.utx package. The workaround would be:
# Open MyPackage.utx with UT2004 editor
# Right click MyTexture texture and choose rename
# Change package name to MyPackage_temp (any different name is ok)
# Do the same with all textures you want to use
# Save MyPackage_temp package to disk
# Close unreal editor
# Delete MyPackage.utx and rename MyPackage_temp.utx to MyPackage.utx

Now you have working texture package, which is compatible with original one.

It seems that there are still some problems with DXT3 textures, causing them to appear corrupted on older video cards.

===Static meshes===

Every static mesh uses some texture packages. All textures should be in your UT textures folder before using static meshes.

The simple way would be: import static mesh to UT UED with the same name and pivot point as it had in U2XMP UED, and you can select_all/copy/paste all meshes in level. The hard part is importing them. If they are original U2XMP meshes, you have just open package which contains them. If they are custom ones, you better have original 3dsmax or Maya models :). Of course, you probably don't have them. So there is one way left, if you don't want to remake them:
# Convert static mesh to brush
# Export brush to file
# In UT UED prepare and open textures the brush uses
# In UT UED import brush from file
# Convert brush to static mesh

have in mind that you may loose static mesh optimisations and/or smoothing groups, so your meshes will look crappy. In some cases that may be ok, because UT2004 recommended polycount is much higher.

===Brushes===

The first thing that you have to do is to copy brushes, or at least main cube brush.

Before copying any brush, you must have all textures with the same name the brush is using opened in UT UED (package does not matter) in order them to be automatically assigned.

If you feel lucky, you can try to copy/paste (right click in top viewport and choose &quot;paste to original location&quot;) all brushes at once. However, there may be problems with subtracted brushes and zone portals. You may have to delete them and try to add again, or create new.

===Terrain===

Don't copy terrain info actor, but add new. Then move Heightmap, Alpha layers and terrain textures from U2XMP map to new package (it may be MyLevel), and manually edit TerrainInfo actor properties: Heightmap texture, scaling, movement/location, etc. Rebuild your level and you should see your terrain. You may probably need to paint terrain visibility manually.

===Lights===

Lights in UT are ~50% darker than in U2XMP. So in some cases its easier to create new lights than copy old ones, because lighting effect is also a little different.

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Radar]]

Back to [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]</text>
    </revision>
    <revision>
      <id>2464</id>
      <timestamp>2005-04-24T22:08:53Z</timestamp>
      <contributor>
        <ip>Nat4-28.iti.lt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Using U2XMP assets==

===Textures===

What to do if you have problems using U2XMP texture packs you created by simply copying them?

For example, you need MyTexture texture from MyPackage.utx package. The workaround would be:
# Open MyPackage.utx with UT2004 editor
# Right click MyTexture texture and choose rename
# Change package name to MyPackage_temp (any different name is ok)
# Do the same with all textures you want to use
# Save MyPackage_temp package to disk
# Close unreal editor
# Delete MyPackage.utx and rename MyPackage_temp.utx to MyPackage.utx

Now you have working texture package, which is compatible with original one.

It seems that there are still some problems with DXT3 textures, causing them to appear corrupted on older video cards.

===Static meshes===

Every static mesh uses some texture packages. All textures should be in your UT textures folder before using static meshes.

The simple way would be: import static mesh to UT UED with the same name and pivot point as it had in U2XMP UED, and you can select_all/copy/paste all meshes in level. The hard part is importing them. If they are original U2XMP meshes, you have just open package which contains them. If they are custom ones, you better have original 3dsmax or Maya models :). Of course, you probably don't have them. So there is one way left, if you don't want to remake them:
# Convert static mesh to brush
# Export brush to file
# In UT UED prepare and open textures the brush uses
# In UT UED import brush from file
# Convert brush to static mesh

have in mind that you may loose static mesh optimisations and/or smoothing groups, so your meshes will look crappy. In some cases that may be ok, because UT2004 recommended polycount is much higher.

===Brushes===

The first thing that you have to do is to copy brushes, or at least main cube brush.

Before copying any brush, you must have all textures with the same name the brush is using opened in UT UED (package does not matter) in order them to be automatically assigned.

If you feel lucky, you can try to copy/paste (right click in top viewport and choose &quot;paste to original location&quot;) all brushes at once. However, there may be problems with subtracted brushes and zone portals. You may have to delete them and try to add again, or create new.

===Terrain===

Don't copy terrain info actor, but add new. Then move Heightmap, Alpha layers and terrain textures from U2XMP map to new package (it may be MyLevel), and manually edit TerrainInfo actor properties: Heightmap texture, scaling, movement/location, etc. Rebuild your level and you should see your terrain. You may probably need to paint terrain visibility manually.

===Lights===

Lights in UT are ~50% darker than in U2XMP. So in some cases its easier to create new lights than copy old ones, because lighting effect is also a little different.

==See also==

[[Legacy:Mapping_For_UTXMP/Adding Radar|Mapping_For_UTXMP/Adding radar]]

Back to [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ConvexVolume</title>
    <id>903</id>
    <revision>
      <id>2491</id>
      <timestamp>2005-07-30T09:26:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Primitive|Primitive]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Copperman</title>
    <id>854</id>
    <revision>
      <id>2381</id>
      <timestamp>2006-11-28T07:31:39Z</timestamp>
      <contributor>
        <ip>Copperman</ip>
      </contributor>
      <comment>Minor &quot;News&quot;</comment>
      <text xml:space="preserve">Greets unreal wikians I'm '''Copperman''' I'm a UT99 wannabe mapper. Currently converting Q3DM6 to UT99 after seeing the efforts to move this map to UT2k3/4 (hmm...) More later.

----

'''Email''':KarmaCopper@gmail.com

'''Weblog''': http://copperman.efx2.com

==Discussion and such.==

'''Tarquin:''' Hi, welcome to the unreal wiki! :D

'''Copperman''': Thanks Tarq. ;D

'''strider:''' Hiya Copperman!  I didn't know people were still making UT99 maps - that's pretty cool!

'''Copperman''': Hi Strider, yep I am still trying to finish my first map, always was a late starter.

'''strider:''' Good luck in finishing your first map!  He he I still haven't finished mine, so in that field you'll be about 200 steps past me.

'''Copperman''': Anyone willing to look at this map if and when it's ready. Beta/advise ?

'''Copperman:''' Ah, damn kickers, has anyone any ideas, I followed the guides here BUT the bots still jump back down and crater or sometimes just get stuck in a jump loop :(

'''EntropicLqd:''' Normally when bots get stuck in a kicker-jump loop it's because they are struggling to reach/touch the pathnode at the end of the kick.  Have you tried putting a kicker at the highest point of the jump that affects only bots that simlpy neutralises any additional height and effectively forces them on to the lift-exit at the top of your kicker.  I'd take a look but UT99 no longer runs on my PC and I can't face the re-install.

'''Copperman''': Yeah that's the way the kicker in CTF-Coret works I'll look at it. Also I haven't fully investigated the ''one-way path'' option. Will keep you updated, thanks for the input.

'''Copperman''': W00t have got my kickers running well. I'm using the extra kick at the top for the bots method, which seems to work OK. I have even managed consistency with entering in one direction and exiting at 90 degrees. :D I find having both the lift centre and lift exit in the same spot simplifies things. It stops the bots moving to the ''LC'' then to the ''LE'' THEN onto the path network.

Anyone have any insights on making the bots jump across gaps consistantly ?

DAMMIT. I crashed my data/games HDD. Lost my shit. Starting again...

'''Copperman''': Been away for a long time. Still running UT(99) (Can't afford to upgrade) *Waves* :)

'''MythOpus:''' Disable your IE redirect :|

'''Copperman''': Done, just for you :D

'''Copperman''': Only 5 years too late but I finally got &quot;my&quot; map (Q3DM6 The Campgrounds&quot; made. Well almost, it plays ok, the pathing was... tedious to say the least. I think I need so help with the lighting, I just don't quite seem to get it. :D

After some initial trouble getting the kickers working, I finally got the bots to navigate the whole map, including jumping across the &quot;pillar room&quot; Oh joy. It would appear that a horizontal &quot;lift&quot; is the way to go with this, although it seems you need a whole mechanism for each direction.(LE -&gt; LC+LE) I have found that it's good to keep the LE+LC at the same coordinates to reduce &quot;node dancing&quot; (where the bot MUST run through a node&quot;

After some frustrations with layout and pathing I made some radical changes to the geometry. I kept the over all feel of the run, no extra corridors or rooms, but I removed most of the curved wall after needing a small alteration at the sniper  rifle kicker for consistency. This led to some quite nice game play side effects, most notably for players favouring the ripper and 8 ball. With many 45 degree wall sections the ripper blades really fly round the map. The other more obvious effect of this change was a huge reduction in polygons. Yeay \0/ Polygons I used later to brush sink trim the whole lot. I also replaced all stairs with ramps, again for poly speed but I think the map &quot;runs&quot; better to, less view-bob strain. 

All in all this has been a great learning process, all about BSP anomalies and path-node hell, but all in all it's been a positive thing. I'm not finished with this map yet, lots of texture alignment and decoration to do yet. But that said, it plays well with 6-9 players. Anyone wanting to look at it can email me or message me here and I'll dispatch a copy for test purposes.

This map is now publicly available from Nali City here -&gt; http://nalicity.beyondunreal.com/map_hub.php?mid=9413

'''Copperman''': Currently working on a brand new map, CTF this time. W00t in fact, for 2-4 teams. I like the w00t idea, it takes CTF in an interesting direction. More later.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2382</id>
      <timestamp>2006-08-13T21:47:49Z</timestamp>
      <contributor>
        <ip>64-110-208-134.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greets unreal wikians I'm '''Copperman''' I'm a UT99 wannabe mapper. Currently converting Q3DM6 to UT99 after seeing the efforts to move this map to UT2k3/4 (hmm...) More later.

----

'''Email''':KarmaCopper@gmail.com

'''Weblog''': http://copperman.efx2.com

==Discussion and such.==

'''Tarquin:''' Hi, welcome to the unreal wiki! :D

'''Copperman''': Thanks Tarq. ;D

'''strider:''' Hiya Copperman!  I didn't know people were still making UT99 maps - that's pretty cool!

'''Copperman''': Hi Strider, yep I am still trying to finish my first map, always was a late starter.

'''strider:''' Good luck in finishing your first map!  He he I still haven't finished mine, so in that field you'll be about 200 steps past me.

'''Copperman''': Anyone willing to look at this map if and when it's ready. Beta/advise ?

'''Copperman:''' Ah, damn kickers, has anyone any ideas, I followed the guides here BUT the bots still jump back down and crater or sometimes just get stuck in a jump loop :(

'''EntropicLqd:''' Normally when bots get stuck in a kicker-jump loop it's because they are struggling to reach/touch the pathnode at the end of the kick.  Have you tried putting a kicker at the highest point of the jump that affects only bots that simlpy neutralises any addtional height and effectively forces them on to the lift-exit at the top of your kicker.  I'd take a look but UT99 no longer runs on my PC and I can't face the re-install.

'''Copperman''': Yeah that's the way the kicker in CTF-Coret works I'll look at it. Also I haven't fully investigated the ''one-way path'' option. Will keep you updated, thanks for the input.

'''Copperman''': W00t have got my kickers running well. I'm using the extra kick at the top for the bots method, which seems to work ok. I have even managed consistancy with entering in one direction and exiting at 90 degrees. :D I find having both the lift center and lift exit in the same spot simplifies things. It stops the bots moving to the ''LC'' then to the ''LE'' THEN onto the path network.

Anyone have any insights on making the bots jump across gaps consistantly ?

DAMMIT. I crashed my data/games HDD. Lost my shit. Starting again...

'''Copperman''': Been away for a long time. Still running UT(99) (Can't afford to upgrade) *Waves* :)

'''MythOpus:''' Disable your IE redirect :|
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2383</id>
      <timestamp>2006-10-30T18:35:11Z</timestamp>
      <contributor>
        <ip>Copperman</ip>
      </contributor>
      <comment>*Link to my map added</comment>
      <text xml:space="preserve">Greets unreal wikians I'm '''Copperman''' I'm a UT99 wannabe mapper. Currently converting Q3DM6 to UT99 after seeing the efforts to move this map to UT2k3/4 (hmm...) More later.

----

'''Email''':KarmaCopper@gmail.com

'''Weblog''': http://copperman.efx2.com

==Discussion and such.==

'''Tarquin:''' Hi, welcome to the unreal wiki! :D

'''Copperman''': Thanks Tarq. ;D

'''strider:''' Hiya Copperman!  I didn't know people were still making UT99 maps - that's pretty cool!

'''Copperman''': Hi Strider, yep I am still trying to finish my first map, always was a late starter.

'''strider:''' Good luck in finishing your first map!  He he I still haven't finished mine, so in that field you'll be about 200 steps past me.

'''Copperman''': Anyone willing to look at this map if and when it's ready. Beta/advise ?

'''Copperman:''' Ah, damn kickers, has anyone any ideas, I followed the guides here BUT the bots still jump back down and crater or sometimes just get stuck in a jump loop :(

'''EntropicLqd:''' Normally when bots get stuck in a kicker-jump loop it's because they are struggling to reach/touch the pathnode at the end of the kick.  Have you tried putting a kicker at the highest point of the jump that affects only bots that simlpy neutralises any additional height and effectively forces them on to the lift-exit at the top of your kicker.  I'd take a look but UT99 no longer runs on my PC and I can't face the re-install.

'''Copperman''': Yeah that's the way the kicker in CTF-Coret works I'll look at it. Also I haven't fully investigated the ''one-way path'' option. Will keep you updated, thanks for the input.

'''Copperman''': W00t have got my kickers running well. I'm using the extra kick at the top for the bots method, which seems to work OK. I have even managed consistency with entering in one direction and exiting at 90 degrees. :D I find having both the lift centre and lift exit in the same spot simplifies things. It stops the bots moving to the ''LC'' then to the ''LE'' THEN onto the path network.

Anyone have any insights on making the bots jump across gaps consistantly ?

DAMMIT. I crashed my data/games HDD. Lost my shit. Starting again...

'''Copperman''': Been away for a long time. Still running UT(99) (Can't afford to upgrade) *Waves* :)

'''MythOpus:''' Disable your IE redirect :|

'''Copperman''': Done, just for you :D

'''Copperman''': Only 5 years too late but I finally got &quot;my&quot; map (Q3DM6 The Campgrounds&quot; made. Well almost, it plays ok, the pathing was... tedious to say the least. I think I need so help with the lighting, I just don't quite seem to get it. :D

After some initial trouble getting the kickers working, I finally got the bots to navigate the whole map, including jumping across the &quot;pillar room&quot; Oh joy. It would appear that a horizontal &quot;lift&quot; is the way to go with this, although it seems you need a whole mechanism for each direction.(LE -&gt; LC+LE) I have found that it's good to keep the LE+LC at the same coordinates to reduce &quot;node dancing&quot; (where the bot MUST run through a node&quot;

After some frustrations with layout and pathing I made some radical changes to the geometry. I kept the over all feel of the run, no extra corridors or rooms, but I removed most of the curved wall after needing a small alteration at the sniper  rifle kicker for consistency. This led to some quite nice game play side effects, most notably for players favouring the ripper and 8 ball. With many 45 degree wall sections the ripper blades really fly round the map. The other more obvious effect of this change was a huge reduction in polygons. Yeay \0/ Polygons I used later to brush sink trim the whole lot. I also replaced all stairs with ramps, again for poly speed but I think the map &quot;runs&quot; better to, less view-bob strain. 

All in all this has been a great learning process, all about BSP anomalies and path-node hell, but all in all it's been a positive thing. I'm not finished with this map yet, lots of texture alignment and decoration to do yet. But that said, it plays well with 6-9 players. Anyone wanting to look at it can email me or message me here and I'll dispatch a copy for test purposes.

This map is now publicly available from Nali City here -&gt; http://nalicity.beyondunreal.com/map_hub.php?mid=9413
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CorDharel</title>
    <id>792</id>
    <revision>
      <id>2243</id>
      <timestamp>2003-08-08T07:24:43Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Salutation ==

Hi all!

I'm new to UnrealScript and uWiki, but I am learning UC as fast as I can ;)

What I did:

*gUc - German UScript Center - http://www.guc.ch.vu - A place for german UnrealScript Learners like me :)

*CorDharel's Page - http://www.cordharel.ch.vu - Not much, at the moment just a (very nice! IMO) wallpaper done by myself.

*My [[Legacy:CorDharel/BioRocket|BioRocket]]

*[[Legacy:CorDharel/Developer Journal|Developer Journal]] of my SunshineRPG

Hope it will once be more.

----

===my useful wiki sites===

[[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]]

----

==Comments: ==

'''Wormbo:''' Welcome to the site. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2244</id>
      <timestamp>2003-04-07T08:20:42Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Salutation ==

Hi all!

I'm new to UnrealScript and uWiki, but I am learning UC as fast as I can ;)

What I did:

*gUc - German UScript Center - http://www.guc.ch.vu - A place for UnrealScript Learners like me :)

*CorDharel's Page - http://www.cordharel.ch.vu - Not much, at the moment just a (very nice!) wallpaper done by myself.

*HolyShitBastards - http://www.hsb.ch.vu - The clan page of my clan, once I had a tutorial there, then I created gUc...

*My BioRocket

*[[Legacy:Mut_Ideas/SunshineRpg|Mut_Ideas/SunshineRpg]]

Hope it will once be more.

----

===Comments===

'''Wormbo:''' Welcome to the site. :)

===my useful wiki sites===

[[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]]

----

==BioRocket ==

So, as you know, I want to learn UnrealScript. My first idea is to create a biorifle with rockets as ammo. I have not done it yet, but I am still on it. I will post the current code and the status and it would be nice if some of you can help me a little bit ;)

===Current status:===

04.04.03 I got it! Wasn't that hard as I thought. Perhaps I will post a tutorial about it.

'''- Old'''

02.04.03 When I pickup a BioRiflePickup, I get the rocket launcher :)

31.03.03 I got a Biorifle with the sound of the rocket launcher, but I can't see some projectiles.

===My Classes I thought I have to use:===

- BioRocketMut    - '''For the mutator'''

- BioRocket       - '''For the new weapon'''

- BioRocketPickup - '''For the pickup'''

- BioRocketFire   - '''For the projectile fire'''

----

===Here is my current code: ===

'''Class BioRocketMut:'''

&lt;uscript&gt;
class BioRocketMut extends Mutator
config(user);

function bool bCheckReplacement (Actor Other, out byte bSuperRelevant)
{

bSuperRelevant = 0;

if ( xWeaponBase(Other) != None )
        {
        if ( xWeaponBase(Other).WeaponType == Class'BioRifle')
            xWeaponBase(Other).WeaponType = Class'BioRocket';
            return true;
        }

else if ( WeaponPickup(Other) != None )
{
 if ( string(Other.Class) ~= &quot;XWeapons.BioRiflePickup&quot; )
  ReplaceWith( Other, &quot;CorPackage.BioRocketPickup&quot;);
  return true;
}
else
    return true;

return false;
}

defaultproperties
{
    GroupName=&quot;BioRocket&quot;
    FriendlyName=&quot;BioRocket&quot;
    Description=&quot;Replaces all BioRifles with rocket Shooting BioRifle&quot;
}
&lt;/uscript&gt;

'''Class BioRocket'''

&lt;uscript&gt;
class BioRocket extends RocketLauncher config(user);

defaultproperties
{
     PickupClass=Class'CorPackage.BioRocketPickup'
     ItemName=&quot;BioRocket&quot;
}
&lt;/uscript&gt;

'''Class BioRocketPickup'''

&lt;uscript&gt;
class BioRocketPickup extends UTWeaponPickup;

static function StaticPrecache(LevelInfo L)
{
    L.AddPrecacheMaterial(Texture'XEffects.xbiosplat2');
    L.AddPrecacheMaterial(Texture'XEffects.xbiosplat');
    L.AddPrecacheMaterial(Texture'XGameShaders.bio_flash');
	L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.BioRiflePickup');
}

simulated function UpdatePrecacheMaterials()
{
    Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat2');
    Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat');
    Level.AddPrecacheMaterial(Texture'XGameShaders.bio_flash');
}

defaultproperties
{
     MaxDesireability=0.750000
     InventoryType=class'CorPackage.BioRocket'
     PickupMessage=&quot;You got the BioRocket&quot;
     PickupSound=Sound'PickupSounds.FlakCannonPickup'
     PickupForce=&quot;FlakCannonPickup&quot;
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'WeaponStaticMesh.BioRiflePickup'
     DrawScale=0.700000
}
&lt;/uscript&gt;

'''Class BioRocketFire'''

&lt;uscript&gt;
class BioRocketFire extends ProjectileFire;

function PlayFireEnd()
{
}

function InitEffects()
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'tip');
}

function Projectile SpawnProjectile(Vector Start, Rotator Dir)
{
    local Projectile p;

    p = RocketLauncher(Weapon).SpawnProjectile(Start, Dir);
    if ( p != None )
		p.Damage *= DamageAtten;
    return p;
}

defaultproperties
{
     ProjSpawnOffset=(X=25.000000,Y=6.000000,Z=-6.000000)
     TweenTime=0.000000
     FireSound=SoundGroup'WeaponSounds.RocketLauncher.RocketLauncherFire'
     FireForce=&quot;BioRocketFire&quot;
     FireRate=0.900000
     AmmoClass=Class'XWeapons.RocketAmmo'
     AmmoPerFire=1
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-20.000000)
     ShakeOffsetRate=(X=-1000.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'XWeapons.RocketProj'
     BotRefireRate=0.500000
     WarnTargetPct=0.900000
     bSplashDamage=True
     bSplashJump=True
     bRecommendSplashDamage=True
     FlashEmitterClass=Class'XEffects.RocketMuzFlash1st'
}
&lt;/uscript&gt;

----

==My questions: ==

'''- What do the two functions in BioRocketPickup do? 

Answer: They load the model of the weapon and give it some textures.

Thx to everyone who helped me!

----

==Suggestions: ==

'''I will update this section all the time.'''

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2245</id>
      <timestamp>2003-08-08T07:23:38Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Salutation ==

Hi all!

I'm new to UnrealScript and uWiki, but I am learning UC as fast as I can ;)

What I did:

*gUc - German UScript Center - http://www.guc.ch.vu - A place for UnrealScript Learners like me :)

*CorDharel's Page - http://www.cordharel.ch.vu - Not much, at the moment just a (very nice!) wallpaper done by myself.

*My [[Legacy:CorDharel/BioRocket|BioRocket]]

*[[Legacy:CorDharel/Developer Journal|Developer Journal]] of my SunshineRPG

Hope it will once be more.

----

===my useful wiki sites===

[[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]]

----

==Comments: ==

'''Wormbo:''' Welcome to the site. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CorDharel/BioRocket</title>
    <id>832</id>
    <revision>
      <id>2333</id>
      <timestamp>2003-08-08T07:23:09Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==BioRocket ==

This is my first little project, a BioRifle with Rockets as primary ammo. I did it, not perfect, but I want to add some more functions to make the mutator playable and unique.

===Current status:===

08.08.2003 I want to code some more functions for my BioRocket to get more into unrealscript.

'''- Old'''

04.04.03 I got it! Wasn't that hard as I thought. Perhaps I will post a tutorial about it.

02.04.03 When I pickup a BioRiflePickup, I get the rocket launcher :)

31.03.03 I got a Biorifle with the sound of the rocket launcher, but I can't see some projectiles.

===My Classes I thought I have to use:===

- BioRocketMut    - '''For the mutator'''

- BioRocket       - '''For the new weapon'''

- BioRocketPickup - '''For the pickup'''

- BioRocketFire   - '''For the projectile fire'''

----

===Here is my current code: ===

'''Class BioRocketMut:'''

&lt;uscript&gt;
class BioRocketMut extends Mutator
config(user);

function bool bCheckReplacement (Actor Other, out byte bSuperRelevant)
{

bSuperRelevant = 0;

if ( xWeaponBase(Other) != None )
        {
        if ( xWeaponBase(Other).WeaponType == Class'BioRifle')
            xWeaponBase(Other).WeaponType = Class'BioRocket';
            return true;
        }

else if ( WeaponPickup(Other) != None )
{
 if ( string(Other.Class) ~= &quot;XWeapons.BioRiflePickup&quot; )
  ReplaceWith( Other, &quot;CorPackage.BioRocketPickup&quot;);
  return true;
}
else
    return true;

return false;
}

defaultproperties
{
    GroupName=&quot;BioRocket&quot;
    FriendlyName=&quot;BioRocket&quot;
    Description=&quot;Replaces all BioRifles with rocket Shooting BioRifle&quot;
}
&lt;/uscript&gt;

'''Class BioRocket'''

&lt;uscript&gt;
class BioRocket extends RocketLauncher config(user);

defaultproperties
{
     PickupClass=Class'CorPackage.BioRocketPickup'
     ItemName=&quot;BioRocket&quot;
}
&lt;/uscript&gt;

'''Class BioRocketPickup'''

&lt;uscript&gt;
class BioRocketPickup extends UTWeaponPickup;

static function StaticPrecache(LevelInfo L)
{
    L.AddPrecacheMaterial(Texture'XEffects.xbiosplat2');
    L.AddPrecacheMaterial(Texture'XEffects.xbiosplat');
    L.AddPrecacheMaterial(Texture'XGameShaders.bio_flash');
	L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.BioRiflePickup');
}

simulated function UpdatePrecacheMaterials()
{
    Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat2');
    Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat');
    Level.AddPrecacheMaterial(Texture'XGameShaders.bio_flash');
}

defaultproperties
{
     MaxDesireability=0.750000
     InventoryType=class'CorPackage.BioRocket'
     PickupMessage=&quot;You got the BioRocket&quot;
     PickupSound=Sound'PickupSounds.FlakCannonPickup'
     PickupForce=&quot;FlakCannonPickup&quot;
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'WeaponStaticMesh.BioRiflePickup'
     DrawScale=0.700000
}
&lt;/uscript&gt;

'''Class BioRocketFire'''

&lt;uscript&gt;
class BioRocketFire extends ProjectileFire;

function PlayFireEnd()
{
}

function InitEffects()
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'tip');
}

function Projectile SpawnProjectile(Vector Start, Rotator Dir)
{
    local Projectile p;

    p = RocketLauncher(Weapon).SpawnProjectile(Start, Dir);
    if ( p != None )
		p.Damage *= DamageAtten;
    return p;
}

defaultproperties
{
     ProjSpawnOffset=(X=25.000000,Y=6.000000,Z=-6.000000)
     TweenTime=0.000000
     FireSound=SoundGroup'WeaponSounds.RocketLauncher.RocketLauncherFire'
     FireForce=&quot;BioRocketFire&quot;
     FireRate=0.900000
     AmmoClass=Class'XWeapons.RocketAmmo'
     AmmoPerFire=1
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-20.000000)
     ShakeOffsetRate=(X=-1000.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'XWeapons.RocketProj'
     BotRefireRate=0.500000
     WarnTargetPct=0.900000
     bSplashDamage=True
     bSplashJump=True
     bRecommendSplashDamage=True
     FlashEmitterClass=Class'XEffects.RocketMuzFlash1st'
}
&lt;/uscript&gt;

----</text>
    </revision>
    <revision>
      <id>2334</id>
      <timestamp>2003-08-08T07:21:51Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==BioRocket ==

So, as you know, I want to learn UnrealScript. My first idea is to create a biorifle with rockets as ammo. I have not done it yet, but I am still on it. I will post the current code and the status and it would be nice if some of you can help me a little bit ;)

===Current status:===

08.08.2003 I want to code some more functions for my BioRocket to get more into unrealscript.

'''- Old'''

04.04.03 I got it! Wasn't that hard as I thought. Perhaps I will post a tutorial about it.

02.04.03 When I pickup a BioRiflePickup, I get the rocket launcher :)

31.03.03 I got a Biorifle with the sound of the rocket launcher, but I can't see some projectiles.

===My Classes I thought I have to use:===

- BioRocketMut    - '''For the mutator'''

- BioRocket       - '''For the new weapon'''

- BioRocketPickup - '''For the pickup'''

- BioRocketFire   - '''For the projectile fire'''

----

===Here is my current code: ===

'''Class BioRocketMut:'''

&lt;uscript&gt;
class BioRocketMut extends Mutator
config(user);

function bool bCheckReplacement (Actor Other, out byte bSuperRelevant)
{

bSuperRelevant = 0;

if ( xWeaponBase(Other) != None )
        {
        if ( xWeaponBase(Other).WeaponType == Class'BioRifle')
            xWeaponBase(Other).WeaponType = Class'BioRocket';
            return true;
        }

else if ( WeaponPickup(Other) != None )
{
 if ( string(Other.Class) ~= &quot;XWeapons.BioRiflePickup&quot; )
  ReplaceWith( Other, &quot;CorPackage.BioRocketPickup&quot;);
  return true;
}
else
    return true;

return false;
}

defaultproperties
{
    GroupName=&quot;BioRocket&quot;
    FriendlyName=&quot;BioRocket&quot;
    Description=&quot;Replaces all BioRifles with rocket Shooting BioRifle&quot;
}
&lt;/uscript&gt;

'''Class BioRocket'''

&lt;uscript&gt;
class BioRocket extends RocketLauncher config(user);

defaultproperties
{
     PickupClass=Class'CorPackage.BioRocketPickup'
     ItemName=&quot;BioRocket&quot;
}
&lt;/uscript&gt;

'''Class BioRocketPickup'''

&lt;uscript&gt;
class BioRocketPickup extends UTWeaponPickup;

static function StaticPrecache(LevelInfo L)
{
    L.AddPrecacheMaterial(Texture'XEffects.xbiosplat2');
    L.AddPrecacheMaterial(Texture'XEffects.xbiosplat');
    L.AddPrecacheMaterial(Texture'XGameShaders.bio_flash');
	L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.BioRiflePickup');
}

simulated function UpdatePrecacheMaterials()
{
    Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat2');
    Level.AddPrecacheMaterial(Texture'XEffects.xbiosplat');
    Level.AddPrecacheMaterial(Texture'XGameShaders.bio_flash');
}

defaultproperties
{
     MaxDesireability=0.750000
     InventoryType=class'CorPackage.BioRocket'
     PickupMessage=&quot;You got the BioRocket&quot;
     PickupSound=Sound'PickupSounds.FlakCannonPickup'
     PickupForce=&quot;FlakCannonPickup&quot;
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'WeaponStaticMesh.BioRiflePickup'
     DrawScale=0.700000
}
&lt;/uscript&gt;

'''Class BioRocketFire'''

&lt;uscript&gt;
class BioRocketFire extends ProjectileFire;

function PlayFireEnd()
{
}

function InitEffects()
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'tip');
}

function Projectile SpawnProjectile(Vector Start, Rotator Dir)
{
    local Projectile p;

    p = RocketLauncher(Weapon).SpawnProjectile(Start, Dir);
    if ( p != None )
		p.Damage *= DamageAtten;
    return p;
}

defaultproperties
{
     ProjSpawnOffset=(X=25.000000,Y=6.000000,Z=-6.000000)
     TweenTime=0.000000
     FireSound=SoundGroup'WeaponSounds.RocketLauncher.RocketLauncherFire'
     FireForce=&quot;BioRocketFire&quot;
     FireRate=0.900000
     AmmoClass=Class'XWeapons.RocketAmmo'
     AmmoPerFire=1
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-20.000000)
     ShakeOffsetRate=(X=-1000.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'XWeapons.RocketProj'
     BotRefireRate=0.500000
     WarnTargetPct=0.900000
     bSplashDamage=True
     bSplashJump=True
     bRecommendSplashDamage=True
     FlashEmitterClass=Class'XEffects.RocketMuzFlash1st'
}
&lt;/uscript&gt;

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CorDharel/Developer Journal</title>
    <id>831</id>
    <revision>
      <id>2330</id>
      <timestamp>2003-09-30T09:13:48Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|Learning UnrealScript

}}

==Idea ==

After I saw that there is already an RPG mutator available, I changed my wishes: I simply want to get better skills in unrealscript ;)

==Steps ==

What I want to do:

'''1.''' Find out how to draw something on the hud

'''2.''' Do all UnrealScript tutorials from Sega500

==Step 1 ==

Ok. First, I have to find out how I can draw a text like &quot;Strength: 5&quot; permanently on the HUD/screen. I already asked in severel forums, but I didnt find the solution yet. I list what I have already found:

{{classbox|06.08.2003}}

'''- Perhaps this is done with [[Legacy:HUD Interactions|HUD Interactions]]''' 

I am talking on a wiki page about that problem. I hope I will find out if I can do it so.

'''- Evil-Devil: Look in HUDbDeathMatch.uc, there you can see how you can do this.'''

I'll have a look when I got time. Thanks for the advice.

{{classbox|08.08.2003}}

Okay, with the help of [[Legacy:HUD_Interactions|HUD_Interactions]] I created a mutator and an interaction class. The mutator includes the interaction, and in the interaction I have to draw the text in the function &quot;PostRender()&quot;. To draw the text, I have to use a function of the [[Legacy:Canvas|Canvas]] class. Now the next little step is to find out the correct function to draw a text and the last step is how to use this function right. 

This evening I will have a look @ Wormbo's MercuryMissileMod, perhaps I'll find out something more. 

{{classbox|10.08.2003}}

I now should have the code, but something is still wrong: The mod doesn't change anything of the game on the HUD. Here is the code from the interaction:

&lt;uscript&gt;
Canvas.SetPos(50,100);
Canvas.SetDrawColor(0,0,0);
Canvas.DrawText(&quot;Wazzatest&quot;);
&lt;/uscript&gt;

I'm wondering what is the fault.

{{classbox|01.09.2003}}

I still could't get the code to work, because I thought I'll do something else first. I worked throught the videos of www.3dbuzz.com, and got my first self-created model in ut2k3 (*w00t* ;)) what really wasn't as hard as I always thought. I'll now do the VTM's to the end and then I'll perhaps learn more 3dsmax vids, cause I always wanted to create stuff with it.

{{classbox|10.09.2003}}

I got it! I dunno what I did wrong all the time, but I asked in the 3dbuzz.com boards and they helped me with my problem. I already updated the interaction pages.

==Step 2 ==

{{classbox|30.09.2003}}

Well, I think I will be much better in scripting unrealscript if I have done the tutorials from Sega500. You can find his site here: http://gamestudies.cdis.org/~jgiles/ 

What I already did: 

-Got a HUDmutator that works!! :D I could draw an image on the hud. That really makes me happy! :)-

-I could make the image transparent-

-I draw a radar image. I now want to make it working.-

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2331</id>
      <timestamp>2003-09-25T20:21:21Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Invisible Ink.</comment>
      <text xml:space="preserve">{{innerbox|SunshineRPG

}}

'''An RPG Mutator'''

==Idea ==

I want to create an RPG mutator that allows you to get stronger while you are playing and killing. I'm an complete newbie so I would be glad to get some answers from you to my questions.

An example: When you start the game, you are very slow, don't make much damage, die very fast and so on. But when you kill some people, you will get stronger and better. This would be cool with a level system, e.g. at start you have level 1, after killing 3 people you have level 2 etc.

This Mutator surely would be cool with invasion! :D

==Steps ==

My thoughts I did on that project:

'''1.''' Find out how to draw something on the hud

'''2.''' Find out how to handle variables/ give some attributes to a player

'''3.''' ...

==Step 1 ==

Ok. First, I have to find out how I can draw a text like &quot;Strength: 5&quot; permanently on the HUD/screen. I already asked in severel forums, but I didnt find the solution yet. I list what I have already found:

{{classbox|06.08.2003}}

'''- Perhaps this is done with [[Legacy:HUD Interactions|HUD Interactions]]'''

I am talking on a wiki page about that problem. I hope I will find out if I can do it so.

'''- Evil-Devil: Look in HUDbDeathMatch.uc, there you can see how you can do this.'''

I'll have a look when I got time. Thanks for the advice.

{{classbox|08.08.2003}}

Okay, with the help of [[Legacy:HUD_Interactions|HUD_Interactions]] I created a mutator and an interaction class. The mutator includes the interaction, and in the interaction I have to draw the text in the function &quot;PostRender()&quot;. To draw the text, I have to use a function of the [[Legacy:Canvas|Canvas]] class. Now the next little step is to find out the correct function to draw a text and the last step is how to use this function right. 

This evening I will have a look @ Wormbo's MercuryMissileMod, perhaps I'll find out something more. 

{{classbox|10.08.2003}}

I now should have the code, but something is still wrong: The mod doesn't change anything of the game on the HUD. Here is the code from the interaction:

&lt;uscript&gt;
Canvas.SetPos(50,100);
Canvas.SetDrawColor(0,0,0);
Canvas.DrawText(&quot;Wazzatest&quot;);
&lt;/uscript&gt;

I'm wondering what is the fault.

{{classbox|01.09.2003}}

I still could't get the code to work, because I thought I'll do something else first. I worked throught the videos of www.3dbuzz.com, and got my first self-created model in ut2k3 (*w00t* ;)) what really wasn't as hard as I always thought. I'll now do the VTM's to the end and then I'll perhaps learn more 3dsmax vids, cause I always wanted to create stuff with it.

----

==My Question ==

{{innerbox|What is wrong with the code from day 10.08.2003?

}}

- - would be cool if some people can give an answer here - -

{{innerbox|Post the rest of your code for the interaction, what you showed isn't enough - clam.

}}

'''Foxpaw:''' This is just a hunch, but... you set the text color to jet black. If the canvas is in drawstyle translucent, (which is usually is when drawing HUDs) it will be drawn, albeit invisibly. Try adding Canvas.Style = STY_Normal; to the top of that block of code and see if that helps.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2332</id>
      <timestamp>2003-09-30T09:05:56Z</timestamp>
      <contributor>
        <ip>CorDharel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|SunshineRPG

}}

''' Learning UnrealScript '''

==Idea ==

After I saw that there is already an RPG mutator available, I changed my wishes: I simply want to get better skills in unrealscript ;)

==Steps ==

What I want to do:

'''1.''' Find out how to draw something on the hud

'''2.''' Do all UnrealScript tutorials from Sega500

==Step 1 ==

Ok. First, I have to find out how I can draw a text like &quot;Strength: 5&quot; permanently on the HUD/screen. I already asked in severel forums, but I didnt find the solution yet. I list what I have already found:

{{classbox|06.08.2003}}

'''- Perhaps this is done with [[Legacy:HUD Interactions|HUD Interactions]]''' 

I am talking on a wiki page about that problem. I hope I will find out if I can do it so.

'''- Evil-Devil: Look in HUDbDeathMatch.uc, there you can see how you can do this.'''

I'll have a look when I got time. Thanks for the advice.

{{classbox|08.08.2003}}

Okay, with the help of [[Legacy:HUD_Interactions|HUD_Interactions]] I created a mutator and an interaction class. The mutator includes the interaction, and in the interaction I have to draw the text in the function &quot;PostRender()&quot;. To draw the text, I have to use a function of the [[Legacy:Canvas|Canvas]] class. Now the next little step is to find out the correct function to draw a text and the last step is how to use this function right. 

This evening I will have a look @ Wormbo's MercuryMissileMod, perhaps I'll find out something more. 

{{classbox|10.08.2003}}

I now should have the code, but something is still wrong: The mod doesn't change anything of the game on the HUD. Here is the code from the interaction:

&lt;uscript&gt;
Canvas.SetPos(50,100);
Canvas.SetDrawColor(0,0,0);
Canvas.DrawText(&quot;Wazzatest&quot;);
&lt;/uscript&gt;

I'm wondering what is the fault.

{{classbox|01.09.2003}}

I still could't get the code to work, because I thought I'll do something else first. I worked throught the videos of www.3dbuzz.com, and got my first self-created model in ut2k3 (*w00t* ;)) what really wasn't as hard as I always thought. I'll now do the VTM's to the end and then I'll perhaps learn more 3dsmax vids, cause I always wanted to create stuff with it.

{{classbox|10.09.2003}}

I got it! I dunno what I did wrong all the time, but I asked in the 3dbuzz.com boards and they helped me with my problem. I already updated the interaction pages.

==Step 2 ==

{{classbox|30.09.2003}}

Well, I think I will be much better in scripting unrealscript if I have done the tutorials from Sega500. You can find his site here: http://gamestudies.cdis.org/~jgiles/ 

What I already did: 

-Got a HUDmutator that works!! :D I could draw an image on the hud. That really makes me happy! :)-

-I could make the image transparent-

-I draw a radar image. I now want to make it working.-

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CoreWarrior</title>
    <id>771</id>
    <revision>
      <id>2198</id>
      <timestamp>2007-09-08T11:51:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>one category link is enough ;-)</comment>
      <text xml:space="preserve">CoreWarrior

November 9,2004

Is my GameName which is a take on the old programmer's game by the name of [http://corewar.co.uk/ COREWARS].

UT2004 onslaught game type hit me big and my old Name furry just didn't cut it with me anymore.The Core in ons was central to the game and it just seems so right that I should become corewarrior.I have never actualy played a single game of Core wars,although I have dabbled a little in assembly language programmig.

Ny name is Jaime and it is pronouced hime, the &quot;me&quot; as in mention or meadow.It's spanish,just call me jamie. 

I'm new to mapping and Level design.There is much to learn.There have been a few false starts where I started playing with the UT editor.

This time it's different.I find myself devoting more time and effort to learning the ropes.

It started a few months ago,in May of this year when I 

decided to make a serious commitment to develop a UT2004 Map.

I have made the most progress in only the last five weeks.Although,the more I learn the more I realize that there is still much I don't know.

At the moment I am having diffuculty with,&quot;Terrain&quot; catagory&quot;.I have been investigaing other

Terrain editors.Some i have tried are ;World machine,Terragen,terrainEd,terraedit.Other's I 

have Downloaded but not tried yet,G16ed,Nem's Mega 3D Terrain Generator.

----

CoreWarrior/Developer Journal

November 9,2004

Terrain 

----

September 8,2007

I've been away a long time ,I picked UED back up again and having started working on making some new maps.

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2199</id>
      <timestamp>2006-04-07T07:57:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">CoreWarrior

November 9,2004

Is my GameName which is a take on the old programmer's game by the name of [http://corewar.co.uk/ COREWARS].

UT2004 onslaught game type hit me big and my old Name furry just didn't cut it with me anymore.The Core in ons was central to the game and it just seems so right that I should become corewarrior.I have never actualy played a single game of Core wars,although I have dabbled a little in assembly language programmig.

Ny name is Jaime and it is pronouced hime, the &quot;me&quot; as in mention or meadow.It's spanish,just call me jamie. 

I'm new to mapping and Level design.There is much to learn.There have been a few false starts where I started playing with the UT editor.

This time it's different.I find myself devoting more time and effort to learning the ropes.

It started a few months ago,in May of this year when I 

decided to make a serious commitment to develop a UT2004 Map.

I have made the most progress in only the last five weeks.Although,the more I learn the more I realize that there is still much I don't know.

At the moment I am having diffuculty with,&quot;Terrain&quot; catagory&quot;.I have been investigaing other

Terrain editors.Some i have tried are ;World machine,Terragen,terrainEd,terraedit.Other's I 

have Downloaded but not tried yet,G16ed,Nem's Mega 3D Terrain Generator.

----

CoreWarrior/Developer Journal

November 9,2004

Terrain 

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2200</id>
      <timestamp>2007-09-08T08:10:20Z</timestamp>
      <contributor>
        <ip>CoreWarrior</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">CoreWarrior

November 9,2004

Is my GameName which is a take on the old programmer's game by the name of [http://corewar.co.uk/ COREWARS].

UT2004 onslaught game type hit me big and my old Name furry just didn't cut it with me anymore.The Core in ons was central to the game and it just seems so right that I should become corewarrior.I have never actualy played a single game of Core wars,although I have dabbled a little in assembly language programmig.

Ny name is Jaime and it is pronouced hime, the &quot;me&quot; as in mention or meadow.It's spanish,just call me jamie. 

I'm new to mapping and Level design.There is much to learn.There have been a few false starts where I started playing with the UT editor.

This time it's different.I find myself devoting more time and effort to learning the ropes.

It started a few months ago,in May of this year when I 

decided to make a serious commitment to develop a UT2004 Map.

I have made the most progress in only the last five weeks.Although,the more I learn the more I realize that there is still much I don't know.

At the moment I am having diffuculty with,&quot;Terrain&quot; catagory&quot;.I have been investigaing other

Terrain editors.Some i have tried are ;World machine,Terragen,terrainEd,terraedit.Other's I 

have Downloaded but not tried yet,G16ed,Nem's Mega 3D Terrain Generator.

----

CoreWarrior/Developer Journal

November 9,2004

Terrain 

----

[[:Category:Legacy Personal Page]]

September 8,2007

I've been away a long time ,I picked UED back up again and having started working on making some new maps.
[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Corona</title>
    <id>705</id>
    <revision>
      <id>2046</id>
      <timestamp>2005-12-31T20:19:49Z</timestamp>
      <contributor>
        <ip>82-35-214-245.cable.ubr08.edin.blueyonder.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A '''corona''' is created by making a light that has a skin associated with it.  It is often erroneously called [[Legacy:Lens Flare|lens flare]]. To see a corona through a [[Legacy:Static Mesh|Static Mesh]] change Collision&gt;bBlockZeroExtentTraces to false.

==UT==

Here are the steps for making a corona in [[Legacy:UT|UT]]:

# Place a [[Legacy:Light (UT)|Light (UT)]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some nice ones in GenFX and City.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. Set the following properties:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|Anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==UT 2004==

Here are the steps for making a corona in [[Legacy:UT2004|UT2004]]:

This is probably the same in UT2003

# Place a [[Legacy:Light|Light]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some in &quot;EmitterTextures.Flares&quot; and &quot;EpicParticles.Flares&quot;.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. [[Legacy:Set The Following Properties|Set the following properties]]:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==Other Properties==

'''Other Corona properties you might be interested in.'''

{|

|-
|'''Group'''
|'''Property'''
|'''Value Type'''
|'''Explanation'''
|-
|Lighting
|bDirectionalCorona (UT2k4)
|Bool
|Activates/Deactivates Directional Coronas 
|-
|Corona
|CoronaRotation (UT2k4)
|Float
|If bDirectionalCorona True, will set the corona's rotation 
|-
|Corona
|CoronaRotationOffset (UT2k4)
|Float
|...???... 
|-
|Corona
|MaxCoronaSize
|Float
|The maximum size the corona can achieve 
|-
|Corona
|MinCoronaSize
|Float
|The minimum size the corona must achieve 
|-
|Corona
|UseOwnFinalBlend
|Bool
|...???... 
|-
|Display
|ScaleGlow
|Float
|Rate of fadein/out 
|}

===Caveats===
* Coronas can only be seen through masked [[Legacy:Semisolid|semisolid]] or [[Legacy:Nonsolid|nonsolid]] brush.
* A corona textured light can also be used as a light emitting source, but  the corona will only be seen in game as far as the radius is set.
* To make a small radius light seen from afar, use 2 lights.  Set the corona textured light actor brightness -&gt; 0.

==Viewing Coronas in UnrealEd==

''(Could someone confirm which rendering modes display them in UnrealEd?)''
# Type &lt;tt&gt;camera open&lt;/tt&gt; into the [[Legacy:UnrealEd Console|UnrealEd Console]]
# Maximize the floating viewport 
# The viewort should use accelerated rendering and show lens flares. 
# Press &lt;tt&gt;Alt+Tab&lt;/tt&gt; to return to UnrealEd.

===Caveats===

'''Birelli:''' Software rendering in UED does ''not'' display coronas as D3D does. As for looking at it in the editor I always just right-click the top bar of my 3-D viewport and go down to D3D, I'm not sure what this camera open thing does though, maybe it's better

'''Tarquin:'''  &quot;Camera Open&quot; opens a floating viewport you can maximize to the entire screen. It's good for people with a dinosauresque 2-card setup who can only run OpenGL fullscreen (like me)

'''Generic Badass:''' Go into advanced properties, rendering, software rendering, coronas = true. then you can see coronas in software mode in UT and UnrealEd.

==Comments==

'''Tarquin:''' Do we need to update this for UT2003?

'''MythOpus:''' I think So.  Unfornately, I haven't mapping lately to see whats changed...

'''SirKline:''' That worked for me in UT2004. Hope, its clear now.

'''SuperApe:''' Does anyone know about a limit on the number of visible coronas in UT2003? (A friend is saying he can't see more than 64)

'''MythOpus:''' The properties of a light now have added options.  One of them is ' Coronas '.  In this list you can choose the min. distance and max distance of the corona as well as the Size of it.

==Related Topics ==
* [[Legacy:Lighting|Lighting]] topic page
* [[Legacy:Light (UT)|Light (UT)]] class reference
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; Reference page for Lighting and LightColor properties

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2047</id>
      <timestamp>2005-02-11T08:17:29Z</timestamp>
      <contributor>
        <ip>PD9F78A29.dip.t-dialin.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A '''corona''' is created by making a light that has a skin associated with it.  It is often erroneously called [[Legacy:Lens Flare|lens flare]]. 

==UT==

Here are the steps for making a corona in [[Legacy:UT|UT]]:

# Place a [[Legacy:Light (UT)|Light (UT)]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some nice ones in GenFX and City.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. Set the following properties:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|Anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==UT 2004==

Here are the steps for making a corona in [[Legacy:UT2004|UT2004]]:

This is probably the same in UT2003

# Place a [[Legacy:Light|Light]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  They are in &quot;EmitterTextures.Flares&quot;.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. [[Legacy:Set The Following Properties|Set the following properties]]:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==Other Properties==

'''Other Corona properties you might be interested in.'''

{|

|-
|'''Group'''
|'''Property'''
|'''Value Type'''
|'''Explanation'''
|-
|Lighting
|bDirectionalCorona (UT2k4)
|Bool
|Activates/Deactivates Directional Coronas 
|-
|Corona
|CoronaRotation (UT2k4)
|Float
|If bDirectionalCorona True, will set the corona's rotation 
|-
|Corona
|CoronaRotationOffset (UT2k4)
|Float
|...???... 
|-
|Corona
|MaxCoronaSize
|Float
|The maximum size the corona can achieve 
|-
|Corona
|MinCoronaSize
|Float
|The minimum size the corona must achieve 
|-
|Corona
|UseOwnFinalBlend
|Bool
|...???... 
|-
|Display
|ScaleGlow
|Float
|Rate of fadein/out 
|}

===Caveats===
* Coronas can only be seen through masked [[Legacy:Semisolid|semisolid]] or [[Legacy:Nonsolid|nonsolid]] brush.
* A corona textured light can also be used as a light emitting source, but  the corona will only be seen in game as far as the radius is set.
* To make a small radius light seen from afar, use 2 lights.  Set the corona textured light actor brightness -&gt; 0.

==Viewing Coronas in UnrealEd==

''(Could someone confirm which rendering modes display them in UnrealEd?)''
# Type &lt;tt&gt;camera open&lt;/tt&gt; into the [[Legacy:UnrealEd Console|UnrealEd Console]]
# Maximize the floating viewport 
# The viewort should use accelerated rendering and show lens flares. 
# Press &lt;tt&gt;Alt+Tab&lt;/tt&gt; to return to UnrealEd.

===Caveats===

'''Birelli:''' Software rendering in UED does ''not'' display coronas as D3D does. As for looking at it in the editor I always just right-click the top bar of my 3-D viewport and go down to D3D, I'm not sure what this camera open thing does though, maybe it's better

'''Tarquin:'''  &quot;Camera Open&quot; opens a floating viewport you can maximize to the entire screen. It's good for people with a dinosauresque 2-card setup who can only run OpenGL fullscreen (like me)

'''Generic Badass:''' Go into advanced properties, rendering, software rendering, coronas = true. then you can see coronas in software mode in UT and UnrealEd.

==Comments==

'''Tarquin:''' Do we need to update this for UT2003?

'''MythOpus:''' I think So.  Unfornately, I haven't mapping lately to see whats changed...

'''SirKline:''' That worked for me in UT2004. Hope, its clear now.

'''SuperApe:''' Does anyone know about a limit on the number of visible coronas in UT2003? (A friend is saying he can't see more than 64)

'''MythOpus:''' The properties of a light now have added options.  One of them is ' Coronas '.  In this list you can choose the min. distance and max distance of the corona as well as the Size of it.

==Related Topics ==
* [[Legacy:Lighting|Lighting]] topic page
* [[Legacy:Light (UT)|Light (UT)]] class reference
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; Reference page for Lighting and LightColor properties

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2048</id>
      <timestamp>2005-11-20T12:38:48Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <comment>More standard flare textures.</comment>
      <text xml:space="preserve">A '''corona''' is created by making a light that has a skin associated with it.  It is often erroneously called [[Legacy:Lens Flare|lens flare]]. 

==UT==

Here are the steps for making a corona in [[Legacy:UT|UT]]:

# Place a [[Legacy:Light (UT)|Light (UT)]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some nice ones in GenFX and City.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. Set the following properties:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|Anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==UT 2004==

Here are the steps for making a corona in [[Legacy:UT2004|UT2004]]:

This is probably the same in UT2003

# Place a [[Legacy:Light|Light]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some in &quot;EmitterTextures.Flares&quot; and &quot;EpicParticles.Flares&quot;.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. [[Legacy:Set The Following Properties|Set the following properties]]:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==Other Properties==

'''Other Corona properties you might be interested in.'''

{|

|-
|'''Group'''
|'''Property'''
|'''Value Type'''
|'''Explanation'''
|-
|Lighting
|bDirectionalCorona (UT2k4)
|Bool
|Activates/Deactivates Directional Coronas 
|-
|Corona
|CoronaRotation (UT2k4)
|Float
|If bDirectionalCorona True, will set the corona's rotation 
|-
|Corona
|CoronaRotationOffset (UT2k4)
|Float
|...???... 
|-
|Corona
|MaxCoronaSize
|Float
|The maximum size the corona can achieve 
|-
|Corona
|MinCoronaSize
|Float
|The minimum size the corona must achieve 
|-
|Corona
|UseOwnFinalBlend
|Bool
|...???... 
|-
|Display
|ScaleGlow
|Float
|Rate of fadein/out 
|}

===Caveats===
* Coronas can only be seen through masked [[Legacy:Semisolid|semisolid]] or [[Legacy:Nonsolid|nonsolid]] brush.
* A corona textured light can also be used as a light emitting source, but  the corona will only be seen in game as far as the radius is set.
* To make a small radius light seen from afar, use 2 lights.  Set the corona textured light actor brightness -&gt; 0.

==Viewing Coronas in UnrealEd==

''(Could someone confirm which rendering modes display them in UnrealEd?)''
# Type &lt;tt&gt;camera open&lt;/tt&gt; into the [[Legacy:UnrealEd Console|UnrealEd Console]]
# Maximize the floating viewport 
# The viewort should use accelerated rendering and show lens flares. 
# Press &lt;tt&gt;Alt+Tab&lt;/tt&gt; to return to UnrealEd.

===Caveats===

'''Birelli:''' Software rendering in UED does ''not'' display coronas as D3D does. As for looking at it in the editor I always just right-click the top bar of my 3-D viewport and go down to D3D, I'm not sure what this camera open thing does though, maybe it's better

'''Tarquin:'''  &quot;Camera Open&quot; opens a floating viewport you can maximize to the entire screen. It's good for people with a dinosauresque 2-card setup who can only run OpenGL fullscreen (like me)

'''Generic Badass:''' Go into advanced properties, rendering, software rendering, coronas = true. then you can see coronas in software mode in UT and UnrealEd.

==Comments==

'''Tarquin:''' Do we need to update this for UT2003?

'''MythOpus:''' I think So.  Unfornately, I haven't mapping lately to see whats changed...

'''SirKline:''' That worked for me in UT2004. Hope, its clear now.

'''SuperApe:''' Does anyone know about a limit on the number of visible coronas in UT2003? (A friend is saying he can't see more than 64)

'''MythOpus:''' The properties of a light now have added options.  One of them is ' Coronas '.  In this list you can choose the min. distance and max distance of the corona as well as the Size of it.

==Related Topics ==
* [[Legacy:Lighting|Lighting]] topic page
* [[Legacy:Light (UT)|Light (UT)]] class reference
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; Reference page for Lighting and LightColor properties

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44126</id>
      <timestamp>2010-11-26T09:52:13Z</timestamp>
      <contributor>
        <username>Murphy</username>
        <id>2204</id>
      </contributor>
      <comment>/* Other Properties */   -edited the entries for ConronaRotation and CoronaRotationOffset. The old explanations were wrong.</comment>
      <text xml:space="preserve">A '''corona''' is created by making a light that has a skin associated with it.  It is often erroneously called [[Legacy:Lens Flare|lens flare]]. To see a corona through a [[Legacy:Static Mesh|Static Mesh]] change Collision&gt;bBlockZeroExtentTraces to false.

==UT==

Here are the steps for making a corona in [[Legacy:UT|UT]]:

# Place a [[Legacy:Light (UT)|Light (UT)]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some nice ones in GenFX and City.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. Set the following properties:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|Anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==UT 2004==

Here are the steps for making a corona in [[Legacy:UT2004|UT2004]]:

This is probably the same in UT2003

# Place a [[Legacy:Light|Light]] wherever you want the corona to appear.

# Open the [[Legacy:Texture Browser|Texture Browser]] and select a corona texture.  There are some in &quot;EmitterTextures.Flares&quot; and &quot;EpicParticles.Flares&quot;.

# Open the [[Legacy:Actor Properties|Actor Properties]] for the light. [[Legacy:Set The Following Properties|Set the following properties]]:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''
|'''Explanation''' 
|-
|Display
|Skin
|
|Click ''Use'' to give your light the texture you just picked out.
|-
|Display
|DrawScale
| style=&quot;text-align: center&quot; |0.1...0.3
|Scales the corona image; with 1.0 it's rather large. One unfortunate consequence of this is that this property also scales the actor icon in UnrealEd, making corona actors hard to find.
|-
|LightColor
|Brightness
| style=&quot;text-align: center&quot; |0.0
|Set so that your corona won't also cast light. You'll need to use a second light for that. 
|-
|LightColor
|LightHue
|
|Set a colour for your corona (if you are using a white skin that is, if you have a colored one then just leave it).
|-
|Lighting
|bCorona
| style=&quot;text-align: center&quot; |True
|bLensFlare was used with Unreal1 and is obsolete in UnrealTournament.
|-
|Lighting
|LightRadius
|anything
|sets how far the corona will be visible in game
|}

The map must be [[Legacy:Build|rebuilt]] (including geometry) to see the effect.

==Other Properties==

'''Other Corona properties you might be interested in.'''

{|

|-
|'''Group'''
|'''Property'''
|'''Value Type'''
|'''Explanation'''
|-
|Lighting
|bDirectionalCorona (UT2k4)
|Bool
|Activates/Deactivates Directional Coronas 
|-
|Corona
|CoronaRotation (UT2k4)
|Float
|The corona seems to be rotated by the amount of unreal units the camera is away from it in unreal degrees multiplied by the value of CoronaRotation. So if you enter 1 and you move 16384 units away from it or towards it it rotates 16384 (=90°)

|-
|Corona
|CoronaRotationOffset (UT2k4)
|Float
|The corona is rotated by the value in unreal degrees (16384 = 90°)

|-
|Corona
|MaxCoronaSize
|Float
|The maximum size the corona can achieve 
|-
|Corona
|MinCoronaSize
|Float
|The minimum size the corona must achieve 
|-
|Corona
|UseOwnFinalBlend
|Bool
|...???... 
|-
|Display
|ScaleGlow
|Float
|Rate of fadein/out 
|}

===Caveats===
* Coronas can only be seen through masked [[Legacy:Semisolid|semisolid]] or [[Legacy:Nonsolid|nonsolid]] brush.
* A corona textured light can also be used as a light emitting source, but  the corona will only be seen in game as far as the radius is set.
* To make a small radius light seen from afar, use 2 lights.  Set the corona textured light actor brightness -&gt; 0.

==Viewing Coronas in UnrealEd==

''(Could someone confirm which rendering modes display them in UnrealEd?)''
# Type &lt;tt&gt;camera open&lt;/tt&gt; into the [[Legacy:UnrealEd Console|UnrealEd Console]]
# Maximize the floating viewport 
# The viewort should use accelerated rendering and show lens flares. 
# Press &lt;tt&gt;Alt+Tab&lt;/tt&gt; to return to UnrealEd.

===Caveats===

'''Birelli:''' Software rendering in UED does ''not'' display coronas as D3D does. As for looking at it in the editor I always just right-click the top bar of my 3-D viewport and go down to D3D, I'm not sure what this camera open thing does though, maybe it's better

'''Tarquin:'''  &quot;Camera Open&quot; opens a floating viewport you can maximize to the entire screen. It's good for people with a dinosauresque 2-card setup who can only run OpenGL fullscreen (like me)

'''Generic Badass:''' Go into advanced properties, rendering, software rendering, coronas = true. then you can see coronas in software mode in UT and UnrealEd.

==Comments==

'''Tarquin:''' Do we need to update this for UT2003?

'''MythOpus:''' I think So.  Unfornately, I haven't mapping lately to see whats changed...

'''SirKline:''' That worked for me in UT2004. Hope, its clear now.

'''SuperApe:''' Does anyone know about a limit on the number of visible coronas in UT2003? (A friend is saying he can't see more than 64)

'''MythOpus:''' The properties of a light now have added options.  One of them is ' Coronas '.  In this list you can choose the min. distance and max distance of the corona as well as the Size of it.

==Related Topics ==
* [[Legacy:Lighting|Lighting]] topic page
* [[Legacy:Light (UT)|Light (UT)]] class reference
* [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; Reference page for Lighting and LightColor properties

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Corran</title>
    <id>796</id>
    <revision>
      <id>2253</id>
      <timestamp>2004-06-19T14:33:09Z</timestamp>
      <contributor>
        <ip>Mr.Bob</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

My nickname is Corran. I have been coding ever since I was a wee lad. I started with BASIC, writing little programs, which do not much at all. Then, when I was about 14 I started taking evening courses at my local college. I first did a C course lasted about 9 months, then I went onto a C++ course which lasted about 9 months again. Once I had finished them, I mostly forgot about C and C++ and started doing PHP for various websites.

Then, when I started up a UT2003 mod called Unreal Racing after having seen the possibilities of the Karma engine, I took my first dive into Unreal Script. I've only actually been doing UScript coding for it for a short while now, but my C++ experience comes in handy and I'm picking it up quite quickly.
; Home pages : Don't really have a home page but down below there are some links to websites I'm involved in.
; Email Address : Email addresses: matt_williams@planetunreal.com
; IRC Channels : You can normally find me at irc://irc.quakenet.org/unrealracing

==My Stuff==

For the last few years my brother has been writing an open-source 3D engine. While I'm not quite up to his level I've been helping him by making a website for it: http://thermite.sf.net, helping him with little problems and giving him advice on things like the user interface for the level editor.

As I said above, I'm working on a UT2003 mod called Unreal Racing. The website can be found at http://planetunreal.com/unrealracing/. We were the first racing mods to start for UT2003 and we're still going. I mainly do coding but I also do the website and other little things that need doing :).

==Links==

===Wiki and contributions===
* [[Legacy:Corran/Developer Journal|Corran/Developer Journal]] &amp;ndash; My devolper Journal
* [[Legacy:TexRotator|TexRotator]] &amp;ndash; Rotating Textures (UT2003). Will write up a little usage thing some time.

===Projects===
* [http://planetunreal.com/unrealracing Unreal Racing] &amp;ndash; My UT2003 racing mod

----

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Dragonmaw:''' Welcome!  Don't mind me, I'm just insane O_o

'''M.r.bob:''' Hello :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2254</id>
      <timestamp>2003-10-11T22:38:09Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

My nickname is Corran. I have been coding ever since I was a wee lad. I started with BASIC, writing little programs, which do not much at all. Then, when I was about 14 I started taking evening courses at my local college. I first did a C course lasted about 9 months, then I went onto a C++ course which lasted about 9 months again. Once I had finished them, I mostly forgot about C and C++ and started doing PHP for various websites.

Then, when I started up a UT2003 mod called Unreal Racing after having seen the possibilities of the Karma engine, I took my first dive into Unreal Script. I've only actually been doing UScript coding for it for a short while now, but my C++ experience comes in handy and I'm picking it up quite quickly.
; Home pages : Don't really have a home page but down below there are some links to websites I'm involved in.
; Email Address : Email addresses: matt_williams@planetunreal.com
; IRC Channels : You can normally find me at irc://irc.quakenet.org/unrealracing

==My Stuff==

For the last few years my brother has been writing an open-source 3D engine. While I'm not quite up to his level I've been helping him by making a website for it: http://thermite.sf.net, helping him with little problems and giving him advice on things like the user interface for the level editor.

As I said above, I'm working on a UT2003 mod called Unreal Racing. The website can be found at http://planetunreal.com/unrealracing/. We were the first racing mods to start for UT2003 and we're still going. I mainly do coding but I also do the website and other little things that need doing :).

==Links==

===Wiki and contributions===
* [[Legacy:Corran/Developer Journal|Corran/Developer Journal]] &amp;ndash; My devolper Journal
* [[Legacy:TexRotator|TexRotator]] &amp;ndash; Rotating Textures (UT2003). Will write up a little usage thing some time.

===Projects===
* [http://planetunreal.com/unrealracing Unreal Racing] &amp;ndash; My UT2003 racing mod

----

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Dragonmaw:''' Welcome!  Don't mind me, I'm just insane O_o

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Corran/Developer Journal</title>
    <id>830</id>
    <revision>
      <id>2328</id>
      <timestamp>2003-10-31T22:01:12Z</timestamp>
      <contributor>
        <ip>Corran</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==July 29, 2003==

I've been meaning to getting round to doing this for a while now. There are often things which I am working on which would be easier to work out if I down the problem, you never know, people may even help me with it. Feel free to comment on any of my postings.

I've spent most of today (I'm still not particulary advanced) working on GUI stuff and trying to work out saving information to an .ini file from within the menu. It was loading variables correctly but when I clicked the Back or Play buttons (I'm writing a new tab for the instant action page) it wasn't saving. I couldn't work out why it wasn't calling the InternalApply() function. It appeared that as I had edited my InstantActionPage incompletely, there were still some references back to the old tab.

Still, I sorted that out and my code is back from being 'trying to get it work format' aka messy with commented out code all over the place, to 'phew, got that working now format' with it all nice and neat.

Still, I'm only learning.

===Comments===

'''Corran:''' If you want to comment on any of my postings, do it with these kinds of headers to keep it consistent, thanks :D.

==July 29, 2003==

Wow, it's 12:30 in the morning and I've only just started coding. I've spent most of the day trying to get my Linux installation working. 

Now I have INI saving/loading working, I'm going to try to get a list of classes from an INT and display some information in a GUIListBox and have the selection saved. I'm pretty sure I know exactly what I have to do, I've been looking at the weapon loading class for some bits. 

Hopefully it will go off without a hitch. I'll see what I can get done tonight and continue tomorrow.

==August 2, 2003==

I took my first forray into the UT2003 mapping world today. I figure that there's no point at only being able to do one aspect of editing/modding and be totally incompetent at the rest. I also started modeling as I found that there were things I needed in my level that weren't supplied in the default meshes.

I thought I'd do a JailBreak styled map ready for when JB2003 is released. Obviously in the meantine I can't test it fully as I dont have the necessary actors and zones and stuff (unless Mychaeel wants to give me any sample code :D). As I'm still learning I'm trying to test as many things in the editor as possible so I can learn my way around, but I'll take out anything which is not necessary before/if I release this map.

Back to my coding, I completed my GUI page I was working on a few days ago, It's got a preview of the mesh using a similar method to that used in the character selection page (the SpinnyDude). It also now correctly extracts the list of classes from the INT files and displays them in a list box. When any item is selected, the description is shown in a text box. It's all good!

==October 18, 2003==

Wow, it's been a while since I've posted anything in here. Now the UnrealEngine2Runtime has been released, I thought I'd have a go at a stand alone project. I noticed that the runtime comes with Karma 1.2 so I think I'll have a go with writing a pool/billiards type game. I don't want to do anything too similar to a FPS because that's what UT modding is for :). Having to write from quite a low level should do me some good for my general coding.

They say the .uc's will be released tonight, but that will probably be tonight in America, which will mean I'll likely miss it. I guess I'll have to wait aroung 'till tommorrow and in the meantime play around with what I have.

===Comments===

'''GRAF1K:''' Are you going to be using UnrealEngine2 Runtime only for coding experience, or are there other advantages you're considering. I really don't understand the big hype about Runtime anyhow. It seems to me that nearly all mods would do well to begin with 2K3/4 instead, especially because UnrealEngine2 Runtime doesn't include multiplayer support.

'''Corran:''' Yeah, I'm mostly doing it for experience. It would probably be easier to make with UT2003 but this gives me a bit more of a a chalenge. Plus this way, I can make it downloadable to people who don't have UT2003. The Runtime does come with basic multiplayer support, you can join one of the epic servers and talk to other people on the server (everyone is represented as boxes though).

'''Foxpaw:''' Graf1k, I pointed this out on the UnrealEngine2 Runtime page but I thought I'd mention in case you missed it, the UnrealEngine2 is exactly what you get when you buy an Epic license, except for the actual license and source. It does include the full network support, Karma, and all the &quot;goodies&quot; except for DE's specific stuff like xemitters.

==October 31, 2003==

The recent developments with the Runtime EULA have prevented me from doing what I had planned with the runtime. I'll probably continue making the game as a mod for UT03. It should prove easier this way but no doubt I'll experiance a few hicups along the way.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2329</id>
      <timestamp>2003-10-21T02:41:19Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==July 29, 2003==

I've been meaning to getting round to doing this for a while now. There are often things which I am working on which would be easier to work out if I down the problem, you never know, people may even help me with it. Feel free to comment on any of my postings.

I've spent most of today (I'm still not particulary advanced) working on GUI stuff and trying to work out saving information to an .ini file from within the menu. It was loading variables correctly but when I clicked the Back or Play buttons (I'm writing a new tab for the instant action page) it wasn't saving. I couldn't work out why it wasn't calling the InternalApply() function. It appeared that as I had edited my InstantActionPage incompletely, there were still some references back to the old tab.

Still, I sorted that out and my code is back from being 'trying to get it work format' aka messy with commented out code all over the place, to 'phew, got that working now format' with it all nice and neat.

Still, I'm only learning.

===Comments===

'''Corran:''' If you want to comment on any of my postings, do it with these kinds of headers to keep it consistent, thanks :D.

==July 29, 2003==

Wow, it's 12:30 in the morning and I've only just started coding. I've spent most of the day trying to get my Linux installation working. 

Now I have INI saving/loading working, I'm going to try to get a list of classes from an INT and display some information in a GUIListBox and have the selection saved. I'm pretty sure I know exactly what I have to do, I've been looking at the weapon loading class for some bits. 

Hopefully it will go off without a hitch. I'll see what I can get done tonight and continue tomorrow.

==August 2, 2003==

I took my first forray into the UT2003 mapping world today. I figure that there's no point at only being able to do one aspect of editing/modding and be totally incompetent at the rest. I also started modeling as I found that there were things I needed in my level that weren't supplied in the default meshes.

I thought I'd do a JailBreak styled map ready for when JB2003 is released. Obviously in the meantine I can't test it fully as I dont have the necessary actors and zones and stuff (unless Mychaeel wants to give me any sample code :D). As I'm still learning I'm trying to test as many things in the editor as possible so I can learn my way around, but I'll take out anything which is not necessary before/if I release this map.

Back to my coding, I completed my GUI page I was working on a few days ago, It's got a preview of the mesh using a similar method to that used in the character selection page (the SpinnyDude). It also now correctly extracts the list of classes from the INT files and displays them in a list box. When any item is selected, the description is shown in a text box. It's all good!

==October 18, 2003==

Wow, it's been a while since I've posted anything in here. Now the UnrealEngine2Runtime has been released, I thought I'd have a go at a stand alone project. I noticed that the runtime comes with Karma 1.2 so I think I'll have a go with writing a pool/billiards type game. I don't want to do anything too similar to a FPS because that's what UT modding is for :). Having to write from quite a low level should do me some good for my general coding.

They say the .uc's will be released tonight, but that will probably be tonight in America, which will mean I'll likely miss it. I guess I'll have to wait aroung 'till tommorrow and in the meantime play around with what I have.

===Comments===

'''GRAF1K:''' Are you going to be using UnrealEngine2 Runtime only for coding experience, or are there other advantages you're considering. I really don't understand the big hype about Runtime anyhow. It seems to me that nearly all mods would do well to begin with 2K3/4 instead, especially because UnrealEngine2 Runtime doesn't include multiplayer support.

'''Corran:''' Yeah, I'm mostly doing it for experience. It would probably be easier to make with UT2003 but this gives me a bit more of a a chalenge. Plus this way, I can make it downloadable to people who don't have UT2003. The Runtime does come with basic multiplayer support, you can join one of the epic servers and talk to other people on the server (everyone is represented as boxes though).

'''Foxpaw:''' Graf1k, I pointed this out on the UnrealEngine2 Runtime page but I thought I'd mention in case you missed it, the UnrealEngine2 is exactly what you get when you buy an Epic license, except for the actual license and source. It does include the full network support, Karma, and all the &quot;goodies&quot; except for DE's specific stuff like xemitters.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Counter</title>
    <id>696</id>
    <revision>
      <id>2026</id>
      <timestamp>2005-12-28T23:41:01Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Yes, there are Counters in UT2004</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Counter (Package: Engine)}}

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &gt;&gt; Counter (Package: Gameplay)}}

'''Note:''' In UT200x, you should use a [[Legacy:ScriptedTrigger|ScriptedTrigger]] with [[Legacy:ScriptedAction|ScriptedAction]]s instead.

A counter will need to be triggered ''n'' times before it will trigger an event. 

Examples of using a counter:
* several buttons must be pressed before a door opens
* a monster appears once a player has picked up a particular number of items in a room
* the secret door in UT's DM-Codex

Because the Counter simply counts how many times it's been triggered, the order in which things trigger it has no relevance &amp;ndash; there's no way for the Counter to know. In particular, if the Triggers are set as repeatable, the ''same'' [[Legacy:Trigger|Trigger]] ''n'' times will also do it (the door in DM-Codex can be opened by shooting just one light four times). 

To avoid this, set Triggers to non-repeatable or with a long delay For something where the order matters, use a [[Legacy:CodeMaster|CodeMaster]] system.

==Properties ==

===Main===
; byte NumToCount : Number to count down from.
; bool bShowMessage : Will show CountMessage.
; string CountMessage (localized) : What message needs to be showed each time its triggered. For example: &quot;Only %i more to go...&quot;
; string CompleteMessage (localized) : What message needs to be showed when the count is completed. For example: &quot;Completed!&quot;

===Hidden===
; byte OriginalNum : Number to count at startup time.

==Functions==
; BeginPlay() : Init for play.  Sets &lt;tt&gt;OriginalNum = NumToCount&lt;/tt&gt;.
; Reset() : Reset actor to initial state - used when restarting level without reloading.  Sets &lt;tt&gt;NumToCount = OriginalNum&lt;/tt&gt;.
; Trigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Counter was triggered.  If NumToCount is more than zero, decrements NumToCount.  If NumToCount is zero, Triggers all matching actors.  Else, if bShowMessage, displays ClientMessage of CountMessage and replaces %i with &quot;one&quot;, &quot;two&quot;, etc. up to &quot;six&quot;. (More than that, it will display the string equivalent of NumToCount.  i.e., &quot;7&quot;.)

==Related Topics==
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Types Of Trigger|Types of Trigger]]
* [[Legacy:Trigger Systems|Trigger Systems]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2027</id>
      <timestamp>2005-12-28T21:38:16Z</timestamp>
      <contributor>
        <ip>64-110-208-235.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>There is no Counter class in UT2003/4.  It's been replaced by Scripted Triggers</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Counter (Package: Engine)}}

'''Note:''' In UT200x, you should use a [[Legacy:ScriptedTrigger|ScriptedTrigger]] with [[Legacy:ScriptedAction|ScriptedAction]]s instead.

A counter will need to be triggered ''n'' times before it will trigger an event. 

Examples of using a counter:
* several buttons must be pressed before a door opens
* a monster appears once a player has picked up a particular number of items in a room
* the secret door in UT's DM-Codex

Because the Counter simply counts how many times it's been triggered, the order in which things trigger it has no relevance &amp;ndash; there's no way for the Counter to know. In particular, if the Triggers are set as repeatable, the ''same'' [[Legacy:Trigger|Trigger]] ''n'' times will also do it (the door in DM-Codex can be opened by shooting just one light four times). 

To avoid this, set Triggers to non-repeatable or with a long delay For something where the order matters, use a [[Legacy:CodeMaster|CodeMaster]] system.

==Properties ==

===Main===
; byte NumToCount : Number to count down from.
; bool bShowMessage : Will show CountMessage.
; string CountMessage (localized) : What message needs to be showed each time its triggered. For example: &quot;Only %i more to go...&quot;
; string CompleteMessage (localized) : What message needs to be showed when the count is completed. For example: &quot;Completed!&quot;

===Hidden===
; byte OriginalNum : Number to count at startup time.

==Functions==
; BeginPlay() : Init for play.  Sets &lt;tt&gt;OriginalNum = NumToCount&lt;/tt&gt;.
; Reset() : Reset actor to initial state - used when restarting level without reloading.  Sets &lt;tt&gt;NumToCount = OriginalNum&lt;/tt&gt;.
; Trigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Counter was triggered.  If NumToCount is more than zero, decrements NumToCount.  If NumToCount is zero, Triggers all matching actors.  Else, if bShowMessage, displays ClientMessage of CountMessage and replaces %i with &quot;one&quot;, &quot;two&quot;, etc. up to &quot;six&quot;. (More than that, it will display the string equivalent of NumToCount.  i.e., &quot;7&quot;.)

==Related Topics==
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Types Of Trigger|Types of Trigger]]
* [[Legacy:Trigger Systems|Trigger Systems]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cow</title>
    <id>707</id>
    <revision>
      <id>2052</id>
      <timestamp>2006-02-10T19:21:52Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Cow}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; BabyCow}}

[[Image:Legacy_scriptedpawn.nalicows.jpeg|center|&lt;i&gt;NaliCow on the left, with a baby on the right.&lt;/i&gt;&lt;br /&gt;]]

Also known as the NaliCow.  This is your basic harmless animal.  Pretty much all it does in a map is walk around, graze, and look cute.  However, that's usually enough for SinglePlayer mappers to use them in their maps.  They're particularly effective for atmosphere when you put them somewhere inside a Nali village.

==Properties==
; bHasBaby : If bHasBaby is True, then this Cow will enter the game accompanied by a baby cow.  For this reason, mappers are encouraged not to put BabyCows directly into their maps.
; bStayClose, WanderRadius : If bStayClose is True, then the Cow will not wander too far away from where it originally started.  Specifically, it won't wander farther from its starting point than the number of Unreal Units specified in the WanderRadius variable.

==Related Topics==
* [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; Recreating the NaliCow NPC in UT2004 as a custom AI tutorial.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2053</id>
      <timestamp>2002-04-16T15:06:58Z</timestamp>
      <contributor>
        <ip>X8b4e549f.dhcp.okstate.edu</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Cow&lt;BR&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Cow &gt;&gt; BabyCow}}

&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;

[[Image:Legacy_scriptedpawn.nalicows.jpeg|]]

&lt;i&gt;Caption:  a Nali Cow on the left, with a baby on the right.&lt;/i&gt;

&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;

This is your basic harmless animal.  Pretty much all it does in a map is walk around, graze, and look cute.  However, that's usually enough for SinglePlayer mappers to use them in their maps.  They're particularly effective for atmosphere when you put them somewhere inside a Nali village.

&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;P&gt;

==Variables ==

&lt;BR&gt;'''bHasBaby'''

&lt;BR&gt;&lt;BR&gt;If bHasBaby is True, then this Cow will enter the game accompanied by a baby cow.  For this reason, mappers are encouraged not to put BabyCows directly into their maps.

&lt;BR&gt;&lt;BR&gt;'''bStayClose''' and '''WanderRadius'''

&lt;BR&gt;&lt;BR&gt;If bStayClose is True, then the Cow will not wander too far away from where it originally started.  Specifically, it won't wander farther from its starting point than the number of Unreal Units specified in the WanderRadius variable.</text>
    </revision>
    <revision>
      <id>2054</id>
      <timestamp>2004-05-20T01:24:35Z</timestamp>
      <contributor>
        <ip>64-216-188-176.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Category Class (UT)&quot; reference</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Cow}}

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Cow &gt;&gt; BabyCow}}

&lt;br /&gt;

[[Image:Legacy_scriptedpawn.nalicows.jpeg|center|&lt;i&gt;Nali Cow on the left, with a baby on the right.&lt;/i&gt;&lt;br&gt;]]

This is your basic harmless animal.  Pretty much all it does in a map is walk around, graze, and look cute.  However, that's usually enough for SinglePlayer mappers to use them in their maps.  They're particularly effective for atmosphere when you put them somewhere inside a Nali village.&lt;br&gt;&lt;br&gt;

===Properties ===
; bHasBaby : If bHasBaby is True, then this Cow will enter the game accompanied by a baby cow.  For this reason, mappers are encouraged not to put BabyCows directly into their maps.
; bStayClose, WanderRadius : If bStayClose is True, then the Cow will not wander too far away from where it originally started.  Specifically, it won't wander farther from its starting point than the number of Unreal Units specified in the WanderRadius variable.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Crashing UnrealEd</title>
    <id>697</id>
    <revision>
      <id>2028</id>
      <timestamp>2008-03-15T12:14:42Z</timestamp>
      <contributor>
        <ip>JeffMOD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Common UnrealEd Crashes: Easily Avoidable Tragedies

==General ==

* Don't put lights into the solid space because it will cause crashes.
* At least on Win2K Pro, right-clicking on the desktop and changing Appearance -&gt; Schemes will crash the editor.
* Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. ;))
* When setting the Light Color (Button in UEd 2) don't click on any of the viewports. If you do, the Editor will crash.
* Don't try to do &quot;Convert -&gt; Static Mesh&quot; on a static mesh. ;)
* Doing Edit -&gt; undo too many times in a row  usually results in a crash
* Don't right click on a viewport and select View-&gt; show fluid surfaces if there is no fluid surfaces in your level.
* When in [[Legacy:Terrain Mode|Terrain Mode]] don't select a HUGE area with the vertex editing tool and try to move it. Because you are trying to move so many vertices at the same time UnrealEd will most likely crash or freeze up.
* Creating a Warp Zone to itself will cause a big crash!

==Brushes and vertices ==
* When you are vertex editing be careful and don't cross the edges of polygons and don't overlap two or more vertices. If you overlap the vertices you won't be able to separate them afterwards and if the overlapping reduces the facecount of the object then UEd will instantly crash after you release the mouse button moving the vertex.
** Save a lot when you are using the BSP based terrain brush.
** Keep a close eye on what you move and where
** If you are using the Vertex mode the sensitivity of the movement depends on the grid setting you use. Certain grid settings will need a steady hand and lots of concentration.

* Don't try to select a surface's underlying brush with SHIFT+Left-Click if the brush has been deleted (see [[Legacy:Mouse Control|Mouse Control]] for more on this function).

* Don't duplicate a brush that's smaller than the current grid size, or equal and off-grid.

* If you must put a tetrahedron (sphere) brush into your map, don't set the extrapolation value above 3 or 4. This results in a hugely complex brush shape that not only tears the [[Legacy:BSP|BSP]] to shreds but also is likely to cause a crash when you try to add or subtract it.

==2D Shape Editor ==
* Don't cross edges in the [[Legacy:2D Shape Editor|2D Shape Editor]]. When you try to extrude the shape UEd will crash.
* UnrealEd 2 can be crashed by importing a texture file into the 2D Shape Editor incorrectly (and, this happens unexpectedly). When you open the 2D Shape Editor and attempt to import a door texture with the intent of transferring the exact dimension to a 3D Brush, you can crash UnrealEd by doing [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Current Texture. The behavior of the 2D Shape Editor is inconsistent, sometimes the above mentioned technique works, sometimes it doesn't. (This suggestion from Machismo) The solution is that the 2D Shape Editor can only open ''.bmp'' textures. So, when you have the desired texture selected in the Texture Browser, right click the texture and select, ''Export to .pcx''. In the Save Dialog window, select, ''Save as Type &gt; All File Types'', and save the file as a (unique name) ''.bmp'' file. Then, from within the 2D Shape Editor, select, [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Disk and, import.

:'''Tarquin:'''  I've never had this problem, some people say it's frequent. Could it be OS-related? I've just seen a post on TO about this occuring after a switch to win2k.
:'''Daemonica:''' I don't think it's Win2K, a few of us use it here with no problems, it's a useful and often used tool.
:'''Legal:''' I don't get it with UED2 but with 3. It must be teh G0bl1n :p

==Textures ==
* If you delete a texture that is in use UEd will crash. Fix: use the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]] before deleting a texture. (Even if you don't see the texture, it might be used on an invisible surface of a brush.)

* There are several ways to crash UED if you are not careful when deleting or renaming textures, they are:
*# Deleting a texture that is in use - if you delete a texture that is in use, UED will crash if you try to save or look at the texture in the 3D view (this is really tough, you're moving around and all of a sudden it hangs). The correct way to do this is to first make sure that the texture is not in use ''Anywhere'' in the map (including surfaces you can't see!), and then delete the texture. If you have used the texture a lot and are not sure where all it is, then you can use the texture replacing tool, or test if you have gotten rid of the texture entirely by performing a [[Legacy:Texture Cull|texture cull]], which will also remove the texture for you.
*# Delete a texture and then rename another texture to be the deleted texture's name - I'm not quite sure of the specifics, but if you want to do this delete the old texture, save, and re-open the map, then rename the other file. Better yet if you are simply replacing a texture import the new one right over the old one.

*Importing a file of .bmp or .pcx type that is NOT in indexed 8-bit color format will crash the editor with a General Protection Fault. (I'm not sure you can actually save a .bmp in RGB color mode or anything else besides indexed but I know for a fact that Photoshop is quite willing to save a .pcx in RGB color mode).

*In UnrealED 3, many time importing a texture with the same name, overwriting a previous texture, and then using the same type of DXTC compression to compress the texture gives a crash. Possible workarounds would be compressing the texture before importing.

*This won't crash UED, but it'll make your map completely unplayable, saving the MyLevel package as a texture package, or SM package, etc. So far i have found no remedy for this.

*Creating a new Raw material derived from itself. (eg. Creating a TexPanner which Pans itself). &lt;br /&gt;When creating a new raw material the Texture browser will automatically select this new material. This is a common trap for people who: &lt;br /&gt;select the derivative material from the Texture Browser -&gt; Create the new material -&gt; Click the ''Use'' button to use the selected derivative material. The correct procedure is as follows: &lt;br /&gt;Create the new material -&gt; select the derivative material from the Texture Browser -&gt; Click the ''Use'' button to use the selected derivative material. 

==Sounds ==
* Adding a modified ''AmbientSound'' to your level, when the file size becomes too big for the Unreal Engine (Can this be accurately quantified?) will cause both Unreal Tournament and the Unreal Editor to crash. Typically, this is a file mixed with [[Legacy:ModPlug Tracker|ModPlug Tracker]] and converted to ''.wav'' format. (I will add a better explanation later)

* Adding a custom sound to your level without importing it properly ( and, I don't know the correct technique for this) will cause a ''General Protection Fault''. The level design will then be unplayable, even if you delete the Ambient Sound. The recommended techniques in various tutorials, does not work as advertised. (I will research this and find the TRUTH.)

==Terrain==
* [[Legacy:Terrain Texture Layer|Terrain texture layer]]s do not like being rectangular.
* Do not use the terrain smoothing tool near the edges of terrain. 

==BSP Rebuild Options ==
* Which settings in the [[Legacy:Build|Build]] window can safely be changed? 
** Anything in the Optimization section. Avoid at all cost the BSP Rebuild Options section. People have completely killed UnrealEd by changing these. (This seems to be what everyone quotes, but you can quite safely change the sliders without destroying the editor. They are also set back to the default settings when you next load UED, so you can just reload the editor if anything goes wrong)
** Changing the first slider alters the amount of BSP cuts that are made. I don't know the exact effects of this, only that setting it to the highest level gives a ridiculous amount of BSP cuts and setting it to &quot;Minimise Cuts&quot; does exactly that. Mess with it a bit if there's a BSP error that you absoloutly can't get rid of, or lower this slider if your node count is far too high.
** The second slider adjusts how zone portals are handled when rebuilding bsp. Very rarely, a zone portal won't zone off an area, even if it completly seals it. Setting this slider closer to the &quot;Portals cut all&quot; option should fix this problem. Setting the slider to &quot;Ignore Portals&quot; will increase the chance that the ed won't zone an area off (don't know what the point of that is)

==Related Topics ==
* [[Legacy:UnrealEd Bug List|UnrealEd Bug List]]
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[Legacy:Unreal Mapping FAQ (UT)|Unreal Mapping FAQ (UT)]]

==Comments ==

Whenever I set all the rendering options in advanced properties to true and then select show all actors, the editor runs fine until i move the camera through a wall and outside of the level, it then jams and when i close it (with Ctrl, Alt + delete) i get an error in different parts of the level. &amp;ndash;''ProjectX''

'''Daid303:''' Creating an [[Legacy:Inline Object|inline object]] in the [[Legacy:Default Properties|Default properties]] of any actor in the [[Legacy:Actor Browser|Actor browser]] also gives a GPF.

'''Wormbo:''' Don't try to create an [[Legacy:Emitter|Emitter]] that emits particles with high acceleration values and lifespan. UnrealEd will decide to eat up more and more memory (more than usual) and doesn't respond anymore.

'''Winxprules:''' I hope you can help me here... When I go to build my map, UnrealEd crashes when it comes to Illumination Occluding. I'm guessing that illumination has something to do with the lighting, but I just wanted to check. If you could help, I'd appreciate it very much. Thanks.

'''Winxprules:''' Never mind... I managed to fix my problem by deleting every last light from the level. It took a while but it was well worth it ;)

'''Tarquin:''' Save yourself time if you ever have to do this again: see [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select all &lt;class&gt;.

'''Winxprules:''' Thanks for the tip, Tarquin :)

'''DataCable:''' This may be game-specific, but the UEd 1 bundled with DS9:TF will crash if you have no object(s) selected and simply move the cursor over the title bar of an already-opened properties window.  Took a while to realize that this was causing otherwise seemingly random crashes.

'''Leggy:''' Is it me, or does putting many lights on the grid cause the editor to crash to the desktop during Illumination occuluding sometimes? I had a map that just would't build, and I selected all the lights and moved them by less than a grid unit in each direction, and now it works perfectly.

'''Bob_The_Beheader:''' Hmm...It's kind of hard to tell why UEd crashes when it happens while it's starting up. It's just given me this error while the splash screen is showing:

{{innerbox|Build UT2004_Build_[2005-02-15_17.02]

}}

{{innerbox|OS: Windows XP 5.1 (Build: 2600)

CPU: GenuineIntel Unknown processor @ 3196 MHz with 510MB RAM

Video: NVIDIA GeForce FX Go5200 (4690)

}}

{{innerbox|Assertion failed: WhiteCircle [File:.\UnTerrainTools.cpp] [Line: 788]

}}

{{innerbox|History: FTerrainTools::Init

}}

I've recently started learning to code UnrealScript, and so I've rebuilt packages and stuff, maybe that has someting to do with why it crashes? 

'''MythOpus:''' Well Bob, in UnrealScript recompiling the original packages that come with your game is a general no no, unless you A.  have a license and B. are making a totally new game.  What most people do is build upon the default packages by extending actors within the default packages.  An example would be having a Sphere as an actor in a default package and you want to create a basketball.  You would 'extend' the Sphere actor from the default package and make the new Basketball class in your own custom package (I.E. MyBasketball.u).

I hope this helps...  Also...  about the error itself, I think it has to do with the importing of the source code that you had recompiled... or the absense of that native source code all together (The C Headers)

'''Bob_The_Beheader:''' Thanks. I do know about object oriented programmming, but the default packages are rebuilt when you run UCC, right? That's all I meant. People must think I am going around promoting screwing with the defualt packages, what with this and the page I made, [[Legacy:Actors_Snap_By_Default|Actors_Snap_By_Default]]. I really am not. I do know that it's bad.

'''MythOpus:''' Heh... actually UCC doesn't actually rebuild any package unless the .u for that package has been deleted.  Therefore, normally UCC only checks to see if the packages are still there.  If they are, it goes to the next package in the list until it finds an EditPackage string that has no .u package.  Then it looks for the source (the folder that holds the .uc files) of that package and uses that to compile a new package.

'''StarWeaver:''' Got a new one (I think, anyway): Changing a [[Legacy:Projector|Projector]] (In my case it's always been position or rotation, both by dragging and by changing the numeric properties) and then using Undo causes a GPF. (My vague guess from the call chain would be the propertly list getting corrupted on read or write to the undo history . . . which is odd, because I'd think it would use the same operations as a cut or copy or duplicate . . . )

'''SuperApe:''' Or how about adding a property definition ''above'' the list of other definitions, while an object of that class already exists, with those properties configured, in the current map space.  Hit compile and GPF.  Solution: remove the object or simply clear out the property settings.

'''Hellkeeper:''' &quot;Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. )&quot;. Hum, I frequently run Ued 1.0, 2.0 and 3.0 at the same time, copy/pasting brush from one to another without problem (except tremendous amount of HOM everywhere). They do not crash until I do stupid things (converting a pawn to static mesh, this mesh to brush, and copying it to Unrealed 1.0).

'''Kirk:''' I encountered the illumination occluding related crash as well, after making a set of very large and narrow brushes. Perhaps the lightmap for the BSP generated for the brush (in this particular case) was too large/disproportionate or something. In any case, splitting the brushes in two got rid of the crash. Perhaps useful to some.

'''JeffMOD:'''I keep getting the following messsgaes before Ued even loads fully: General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc, and, General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- FALVoiceModule::NoteDestroy &lt;- UALAudioSubsystem::NoteDetroy &lt;- ULevel::DestroyActor &lt;- (Camera myLevel.Camera0) &lt;- UPlayer::Destroy &lt;- UViewport::Destroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsViewport::Destroy &lt;- UObject::ConditionalDestroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsClient::Tick &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop. can anyone provide a fix, or will I hhave to stay online until i can get Source SDK?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2029</id>
      <timestamp>2007-12-14T09:17:38Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>Possible Illumination Occlusion crash cause added</comment>
      <text xml:space="preserve">Common UnrealEd Crashes: Easily Avoidable Tragedies

==General ==

* Don't put lights into the solid space because it will cause crashes.
* At least on Win2K Pro, right-clicking on the desktop and changing Appearance -&gt; Schemes will crash the editor.
* Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. ;))
* When setting the Light Color (Button in UEd 2) don't click on any of the viewports. If you do, the Editor will crash.
* Don't try to do &quot;Convert -&gt; Static Mesh&quot; on a static mesh. ;)
* Doing Edit -&gt; undo too many times in a row  usually results in a crash
* Don't right click on a viewport and select View-&gt; show fluid surfaces if there is no fluid surfaces in your level.
* When in [[Legacy:Terrain Mode|Terrain Mode]] don't select a HUGE area with the vertex editing tool and try to move it. Because you are trying to move so many vertices at the same time UnrealEd will most likely crash or freeze up.
* Creating a Warp Zone to itself will cause a big crash!

==Brushes and vertices ==
* When you are vertex editing be careful and don't cross the edges of polygons and don't overlap two or more vertices. If you overlap the vertices you won't be able to separate them afterwards and if the overlapping reduces the facecount of the object then UEd will instantly crash after you release the mouse button moving the vertex.
** Save a lot when you are using the BSP based terrain brush.
** Keep a close eye on what you move and where
** If you are using the Vertex mode the sensitivity of the movement depends on the grid setting you use. Certain grid settings will need a steady hand and lots of concentration.

* Don't try to select a surface's underlying brush with SHIFT+Left-Click if the brush has been deleted (see [[Legacy:Mouse Control|Mouse Control]] for more on this function).

* Don't duplicate a brush that's smaller than the current grid size, or equal and off-grid.

* If you must put a tetrahedron (sphere) brush into your map, don't set the extrapolation value above 3 or 4. This results in a hugely complex brush shape that not only tears the [[Legacy:BSP|BSP]] to shreds but also is likely to cause a crash when you try to add or subtract it.

==2D Shape Editor ==
* Don't cross edges in the [[Legacy:2D Shape Editor|2D Shape Editor]]. When you try to extrude the shape UEd will crash.
* UnrealEd 2 can be crashed by importing a texture file into the 2D Shape Editor incorrectly (and, this happens unexpectedly). When you open the 2D Shape Editor and attempt to import a door texture with the intent of transferring the exact dimension to a 3D Brush, you can crash UnrealEd by doing [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Current Texture. The behavior of the 2D Shape Editor is inconsistent, sometimes the above mentioned technique works, sometimes it doesn't. (This suggestion from Machismo) The solution is that the 2D Shape Editor can only open ''.bmp'' textures. So, when you have the desired texture selected in the Texture Browser, right click the texture and select, ''Export to .pcx''. In the Save Dialog window, select, ''Save as Type &gt; All File Types'', and save the file as a (unique name) ''.bmp'' file. Then, from within the 2D Shape Editor, select, [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Disk and, import.

:'''Tarquin:'''  I've never had this problem, some people say it's frequent. Could it be OS-related? I've just seen a post on TO about this occuring after a switch to win2k.
:'''Daemonica:''' I don't think it's Win2K, a few of us use it here with no problems, it's a useful and often used tool.
:'''Legal:''' I don't get it with UED2 but with 3. It must be teh G0bl1n :p

==Textures ==
* If you delete a texture that is in use UEd will crash. Fix: use the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]] before deleting a texture. (Even if you don't see the texture, it might be used on an invisible surface of a brush.)

* There are several ways to crash UED if you are not careful when deleting or renaming textures, they are:
*# Deleting a texture that is in use - if you delete a texture that is in use, UED will crash if you try to save or look at the texture in the 3D view (this is really tough, you're moving around and all of a sudden it hangs). The correct way to do this is to first make sure that the texture is not in use ''Anywhere'' in the map (including surfaces you can't see!), and then delete the texture. If you have used the texture a lot and are not sure where all it is, then you can use the texture replacing tool, or test if you have gotten rid of the texture entirely by performing a [[Legacy:Texture Cull|texture cull]], which will also remove the texture for you.
*# Delete a texture and then rename another texture to be the deleted texture's name - I'm not quite sure of the specifics, but if you want to do this delete the old texture, save, and re-open the map, then rename the other file. Better yet if you are simply replacing a texture import the new one right over the old one.

*Importing a file of .bmp or .pcx type that is NOT in indexed 8-bit color format will crash the editor with a General Protection Fault. (I'm not sure you can actually save a .bmp in RGB color mode or anything else besides indexed but I know for a fact that Photoshop is quite willing to save a .pcx in RGB color mode).

*In UnrealED 3, many time importing a texture with the same name, overwriting a previous texture, and then using the same type of DXTC compression to compress the texture gives a crash. Possible workarounds would be compressing the texture before importing.

*This won't crash UED, but it'll make your map completely unplayable, saving the MyLevel package as a texture package, or SM package, etc. So far i have found no remedy for this.

*Creating a new Raw material derived from itself. (eg. Creating a TexPanner which Pans itself). &lt;br /&gt;When creating a new raw material the Texture browser will automatically select this new material. This is a common trap for people who: &lt;br /&gt;select the derivative material from the Texture Browser -&gt; Create the new material -&gt; Click the ''Use'' button to use the selected derivative material. The correct procedure is as follows: &lt;br /&gt;Create the new material -&gt; select the derivative material from the Texture Browser -&gt; Click the ''Use'' button to use the selected derivative material. 

==Sounds ==
* Adding a modified ''AmbientSound'' to your level, when the file size becomes too big for the Unreal Engine (Can this be accurately quantified?) will cause both Unreal Tournament and the Unreal Editor to crash. Typically, this is a file mixed with [[Legacy:ModPlug Tracker|ModPlug Tracker]] and converted to ''.wav'' format. (I will add a better explanation later)

* Adding a custom sound to your level without importing it properly ( and, I don't know the correct technique for this) will cause a ''General Protection Fault''. The level design will then be unplayable, even if you delete the Ambient Sound. The recommended techniques in various tutorials, does not work as advertised. (I will research this and find the TRUTH.)

==Terrain==
* [[Legacy:Terrain Texture Layer|Terrain texture layer]]s do not like being rectangular.
* Do not use the terrain smoothing tool near the edges of terrain. 

==BSP Rebuild Options ==
* Which settings in the [[Legacy:Build|Build]] window can safely be changed? 
** Anything in the Optimization section. Avoid at all cost the BSP Rebuild Options section. People have completely killed UnrealEd by changing these. (This seems to be what everyone quotes, but you can quite safely change the sliders without destroying the editor. They are also set back to the default settings when you next load UED, so you can just reload the editor if anything goes wrong)
** Changing the first slider alters the amount of BSP cuts that are made. I don't know the exact effects of this, only that setting it to the highest level gives a ridiculous amount of BSP cuts and setting it to &quot;Minimise Cuts&quot; does exactly that. Mess with it a bit if there's a BSP error that you absoloutly can't get rid of, or lower this slider if your node count is far too high.
** The second slider adjusts how zone portals are handled when rebuilding bsp. Very rarely, a zone portal won't zone off an area, even if it completly seals it. Setting this slider closer to the &quot;Portals cut all&quot; option should fix this problem. Setting the slider to &quot;Ignore Portals&quot; will increase the chance that the ed won't zone an area off (don't know what the point of that is)

==Related Topics ==
* [[Legacy:UnrealEd Bug List|UnrealEd Bug List]]
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[Legacy:Unreal Mapping FAQ (UT)|Unreal Mapping FAQ (UT)]]

==Comments ==

Whenever I set all the rendering options in advanced properties to true and then select show all actors, the editor runs fine until i move the camera through a wall and outside of the level, it then jams and when i close it (with Ctrl, Alt + delete) i get an error in different parts of the level. &amp;ndash;''ProjectX''

'''Daid303:''' Creating an [[Legacy:Inline Object|inline object]] in the [[Legacy:Default Properties|Default properties]] of any actor in the [[Legacy:Actor Browser|Actor browser]] also gives a GPF.

'''Wormbo:''' Don't try to create an [[Legacy:Emitter|Emitter]] that emits particles with high acceleration values and lifespan. UnrealEd will decide to eat up more and more memory (more than usual) and doesn't respond anymore.

'''Winxprules:''' I hope you can help me here... When I go to build my map, UnrealEd crashes when it comes to Illumination Occluding. I'm guessing that illumination has something to do with the lighting, but I just wanted to check. If you could help, I'd appreciate it very much. Thanks.

'''Winxprules:''' Never mind... I managed to fix my problem by deleting every last light from the level. It took a while but it was well worth it ;)

'''Tarquin:''' Save yourself time if you ever have to do this again: see [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select all &lt;class&gt;.

'''Winxprules:''' Thanks for the tip, Tarquin :)

'''DataCable:''' This may be game-specific, but the UEd 1 bundled with DS9:TF will crash if you have no object(s) selected and simply move the cursor over the title bar of an already-opened properties window.  Took a while to realize that this was causing otherwise seemingly random crashes.

'''Leggy:''' Is it me, or does putting many lights on the grid cause the editor to crash to the desktop during Illumination occuluding sometimes? I had a map that just would't build, and I selected all the lights and moved them by less than a grid unit in each direction, and now it works perfectly.

'''Bob_The_Beheader:''' Hmm...It's kind of hard to tell why UEd crashes when it happens while it's starting up. It's just given me this error while the splash screen is showing:

{{innerbox|Build UT2004_Build_[2005-02-15_17.02]

}}

{{innerbox|OS: Windows XP 5.1 (Build: 2600)

CPU: GenuineIntel Unknown processor @ 3196 MHz with 510MB RAM

Video: NVIDIA GeForce FX Go5200 (4690)

}}

{{innerbox|Assertion failed: WhiteCircle [File:.\UnTerrainTools.cpp] [Line: 788]

}}

{{innerbox|History: FTerrainTools::Init

}}

I've recently started learning to code UnrealScript, and so I've rebuilt packages and stuff, maybe that has someting to do with why it crashes? 

'''MythOpus:''' Well Bob, in UnrealScript recompiling the original packages that come with your game is a general no no, unless you A.  have a license and B. are making a totally new game.  What most people do is build upon the default packages by extending actors within the default packages.  An example would be having a Sphere as an actor in a default package and you want to create a basketball.  You would 'extend' the Sphere actor from the default package and make the new Basketball class in your own custom package (I.E. MyBasketball.u).

I hope this helps...  Also...  about the error itself, I think it has to do with the importing of the source code that you had recompiled... or the absense of that native source code all together (The C Headers)

'''Bob_The_Beheader:''' Thanks. I do know about object oriented programmming, but the default packages are rebuilt when you run UCC, right? That's all I meant. People must think I am going around promoting screwing with the defualt packages, what with this and the page I made, [[Legacy:Actors_Snap_By_Default|Actors_Snap_By_Default]]. I really am not. I do know that it's bad.

'''MythOpus:''' Heh... actually UCC doesn't actually rebuild any package unless the .u for that package has been deleted.  Therefore, normally UCC only checks to see if the packages are still there.  If they are, it goes to the next package in the list until it finds an EditPackage string that has no .u package.  Then it looks for the source (the folder that holds the .uc files) of that package and uses that to compile a new package.

'''StarWeaver:''' Got a new one (I think, anyway): Changing a [[Legacy:Projector|Projector]] (In my case it's always been position or rotation, both by dragging and by changing the numeric properties) and then using Undo causes a GPF. (My vague guess from the call chain would be the propertly list getting corrupted on read or write to the undo history . . . which is odd, because I'd think it would use the same operations as a cut or copy or duplicate . . . )

'''SuperApe:''' Or how about adding a property definition ''above'' the list of other definitions, while an object of that class already exists, with those properties configured, in the current map space.  Hit compile and GPF.  Solution: remove the object or simply clear out the property settings.

'''Hellkeeper:''' &quot;Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. )&quot;. Hum, I frequently run Ued 1.0, 2.0 and 3.0 at the same time, copy/pasting brush from one to another without problem (except tremendous amount of HOM everywhere). They do not crash until I do stupid things (converting a pawn to static mesh, this mesh to brush, and copying it to Unrealed 1.0).

'''Kirk:''' I encountered the illumination occluding related crash as well, after making a set of very large and narrow brushes. Perhaps the lightmap for the BSP generated for the brush (in this particular case) was too large/disproportionate or something. In any case, splitting the brushes in two got rid of the crash. Perhaps useful to some.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34366</id>
      <timestamp>2009-04-25T16:47:46Z</timestamp>
      <contributor>
        <ip>78.27.11.245</ip>
      </contributor>
      <comment>/* General */ Never had any problems at all with that</comment>
      <text xml:space="preserve">Common UnrealEd Crashes: Easily Avoidable Tragedies

==General ==

* Don't put lights into the solid space because it will cause crashes.
* At least on Win2K Pro, right-clicking on the desktop and changing Appearance -&gt; Schemes will crash the editor.
* When setting the Light Color (Button in UEd 2) don't click on any of the viewports. If you do, the Editor will crash.
* Don't try to do &quot;Convert -&gt; Static Mesh&quot; on a static mesh. ;)
* Doing Edit -&gt; undo too many times in a row usually results in a crash
* Don't right click on a viewport and select View-&gt; show fluid surfaces if there is no fluid surfaces in your level.
* When in [[Legacy:Terrain Mode|Terrain Mode]] don't select a HUGE area with the vertex editing tool and try to move it. Because you are trying to move so many vertices at the same time UnrealEd will most likely crash or freeze up.
* Creating a Warp Zone to itself will cause a big crash!

==Brushes and vertices ==
* When you are vertex editing be careful and don't cross the edges of polygons and don't overlap two or more vertices. If you overlap the vertices you won't be able to separate them afterwards and if the overlapping reduces the facecount of the object then UEd will instantly crash after you release the mouse button moving the vertex.
** Save a lot when you are using the BSP based terrain brush.
** Keep a close eye on what you move and where
** If you are using the Vertex mode the sensitivity of the movement depends on the grid setting you use. Certain grid settings will need a steady hand and lots of concentration.

* Don't try to select a surface's underlying brush with SHIFT+Left-Click if the brush has been deleted (see [[Legacy:Mouse Control|Mouse Control]] for more on this function).

* Don't duplicate a brush that's smaller than the current grid size, or equal and off-grid.

* If you must put a tetrahedron (sphere) brush into your map, don't set the extrapolation value above 3 or 4. This results in a hugely complex brush shape that not only tears the [[Legacy:BSP|BSP]] to shreds but also is likely to cause a crash when you try to add or subtract it.

==2D Shape Editor ==
* Don't cross edges in the [[Legacy:2D Shape Editor|2D Shape Editor]]. When you try to extrude the shape UEd will crash.
* UnrealEd 2 can be crashed by importing a texture file into the 2D Shape Editor incorrectly (and, this happens unexpectedly). When you open the 2D Shape Editor and attempt to import a door texture with the intent of transferring the exact dimension to a 3D Brush, you can crash UnrealEd by doing [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Current Texture. The behavior of the 2D Shape Editor is inconsistent, sometimes the above mentioned technique works, sometimes it doesn't. (This suggestion from Machismo) The solution is that the 2D Shape Editor can only open ''.bmp'' textures. So, when you have the desired texture selected in the Texture Browser, right click the texture and select, ''Export to .pcx''. In the Save Dialog window, select, ''Save as Type &gt; All File Types'', and save the file as a (unique name) ''.bmp'' file. Then, from within the 2D Shape Editor, select, [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Disk and, import.

:'''Tarquin:'''  I've never had this problem, some people say it's frequent. Could it be OS-related? I've just seen a post on TO about this occuring after a switch to win2k.
:'''Daemonica:''' I don't think it's Win2K, a few of us use it here with no problems, it's a useful and often used tool.
:'''Legal:''' I don't get it with UED2 but with 3. It must be teh G0bl1n :p

==Textures ==
* If you delete a texture that is in use UEd will crash. Fix: use the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]] before deleting a texture. (Even if you don't see the texture, it might be used on an invisible surface of a brush.)

* There are several ways to crash UED if you are not careful when deleting or renaming textures, they are:
*# Deleting a texture that is in use - if you delete a texture that is in use, UED will crash if you try to save or look at the texture in the 3D view (this is really tough, you're moving around and all of a sudden it hangs). The correct way to do this is to first make sure that the texture is not in use ''Anywhere'' in the map (including surfaces you can't see!), and then delete the texture. If you have used the texture a lot and are not sure where all it is, then you can use the texture replacing tool, or test if you have gotten rid of the texture entirely by performing a [[Legacy:Texture Cull|texture cull]], which will also remove the texture for you.
*# Delete a texture and then rename another texture to be the deleted texture's name - I'm not quite sure of the specifics, but if you want to do this delete the old texture, save, and re-open the map, then rename the other file. Better yet if you are simply replacing a texture import the new one right over the old one.

*Importing a file of .bmp or .pcx type that is NOT in indexed 8-bit color format will crash the editor with a General Protection Fault. (I'm not sure you can actually save a .bmp in RGB color mode or anything else besides indexed but I know for a fact that Photoshop is quite willing to save a .pcx in RGB color mode).

*In UnrealED 3, many time importing a texture with the same name, overwriting a previous texture, and then using the same type of DXTC compression to compress the texture gives a crash. Possible workarounds would be compressing the texture before importing.

*This won't crash UED, but it'll make your map completely unplayable, saving the MyLevel package as a texture package, or SM package, etc. So far i have found no remedy for this.

*Creating a new Raw material derived from itself. (eg. Creating a TexPanner which Pans itself). &lt;br /&gt;When creating a new raw material the Texture browser will automatically select this new material. This is a common trap for people who: &lt;br /&gt;select the derivative material from the Texture Browser -&gt; Create the new material -&gt; Click the ''Use'' button to use the selected derivative material. The correct procedure is as follows: &lt;br /&gt;Create the new material -&gt; select the derivative material from the Texture Browser -&gt; Click the ''Use'' button to use the selected derivative material. 

==Sounds ==
* Adding a modified ''AmbientSound'' to your level, when the file size becomes too big for the Unreal Engine (Can this be accurately quantified?) will cause both Unreal Tournament and the Unreal Editor to crash. Typically, this is a file mixed with [[Legacy:ModPlug Tracker|ModPlug Tracker]] and converted to ''.wav'' format. (I will add a better explanation later)

* Adding a custom sound to your level without importing it properly ( and, I don't know the correct technique for this) will cause a ''General Protection Fault''. The level design will then be unplayable, even if you delete the Ambient Sound. The recommended techniques in various tutorials, does not work as advertised. (I will research this and find the TRUTH.)

==Terrain==
* [[Legacy:Terrain Texture Layer|Terrain texture layer]]s do not like being rectangular.
* Do not use the terrain smoothing tool near the edges of terrain. 

==BSP Rebuild Options ==
* Which settings in the [[Legacy:Build|Build]] window can safely be changed? 
** Anything in the Optimization section. Avoid at all cost the BSP Rebuild Options section. People have completely killed UnrealEd by changing these. (This seems to be what everyone quotes, but you can quite safely change the sliders without destroying the editor. They are also set back to the default settings when you next load UED, so you can just reload the editor if anything goes wrong)
** Changing the first slider alters the amount of BSP cuts that are made. I don't know the exact effects of this, only that setting it to the highest level gives a ridiculous amount of BSP cuts and setting it to &quot;Minimise Cuts&quot; does exactly that. Mess with it a bit if there's a BSP error that you absoloutly can't get rid of, or lower this slider if your node count is far too high.
** The second slider adjusts how zone portals are handled when rebuilding bsp. Very rarely, a zone portal won't zone off an area, even if it completly seals it. Setting this slider closer to the &quot;Portals cut all&quot; option should fix this problem. Setting the slider to &quot;Ignore Portals&quot; will increase the chance that the ed won't zone an area off (don't know what the point of that is)

==Related Topics ==
* [[Legacy:UnrealEd Bug List|UnrealEd Bug List]]
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[Legacy:Unreal Mapping FAQ (UT)|Unreal Mapping FAQ (UT)]]

==Comments ==

Whenever I set all the rendering options in advanced properties to true and then select show all actors, the editor runs fine until i move the camera through a wall and outside of the level, it then jams and when i close it (with Ctrl, Alt + delete) i get an error in different parts of the level. &amp;ndash;''ProjectX''

'''Daid303:''' Creating an [[Legacy:Inline Object|inline object]] in the [[Legacy:Default Properties|Default properties]] of any actor in the [[Legacy:Actor Browser|Actor browser]] also gives a GPF.

'''Wormbo:''' Don't try to create an [[Legacy:Emitter|Emitter]] that emits particles with high acceleration values and lifespan. UnrealEd will decide to eat up more and more memory (more than usual) and doesn't respond anymore.

'''Winxprules:''' I hope you can help me here... When I go to build my map, UnrealEd crashes when it comes to Illumination Occluding. I'm guessing that illumination has something to do with the lighting, but I just wanted to check. If you could help, I'd appreciate it very much. Thanks.

'''Winxprules:''' Never mind... I managed to fix my problem by deleting every last light from the level. It took a while but it was well worth it ;)

'''Tarquin:''' Save yourself time if you ever have to do this again: see [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select all &lt;class&gt;.

'''Winxprules:''' Thanks for the tip, Tarquin :)

'''DataCable:''' This may be game-specific, but the UEd 1 bundled with DS9:TF will crash if you have no object(s) selected and simply move the cursor over the title bar of an already-opened properties window.  Took a while to realize that this was causing otherwise seemingly random crashes.

'''Leggy:''' Is it me, or does putting many lights on the grid cause the editor to crash to the desktop during Illumination occuluding sometimes? I had a map that just would't build, and I selected all the lights and moved them by less than a grid unit in each direction, and now it works perfectly.

'''Bob_The_Beheader:''' Hmm...It's kind of hard to tell why UEd crashes when it happens while it's starting up. It's just given me this error while the splash screen is showing:

{{innerbox|Build UT2004_Build_[2005-02-15_17.02]

}}

{{innerbox|OS: Windows XP 5.1 (Build: 2600)

CPU: GenuineIntel Unknown processor @ 3196 MHz with 510MB RAM

Video: NVIDIA GeForce FX Go5200 (4690)

}}

{{innerbox|Assertion failed: WhiteCircle [File:.\UnTerrainTools.cpp] [Line: 788]

}}

{{innerbox|History: FTerrainTools::Init

}}

I've recently started learning to code UnrealScript, and so I've rebuilt packages and stuff, maybe that has someting to do with why it crashes? 

'''MythOpus:''' Well Bob, in UnrealScript recompiling the original packages that come with your game is a general no no, unless you A.  have a license and B. are making a totally new game.  What most people do is build upon the default packages by extending actors within the default packages.  An example would be having a Sphere as an actor in a default package and you want to create a basketball.  You would 'extend' the Sphere actor from the default package and make the new Basketball class in your own custom package (I.E. MyBasketball.u).

I hope this helps...  Also...  about the error itself, I think it has to do with the importing of the source code that you had recompiled... or the absense of that native source code all together (The C Headers)

'''Bob_The_Beheader:''' Thanks. I do know about object oriented programmming, but the default packages are rebuilt when you run UCC, right? That's all I meant. People must think I am going around promoting screwing with the defualt packages, what with this and the page I made, [[Legacy:Actors_Snap_By_Default|Actors_Snap_By_Default]]. I really am not. I do know that it's bad.

'''MythOpus:''' Heh... actually UCC doesn't actually rebuild any package unless the .u for that package has been deleted.  Therefore, normally UCC only checks to see if the packages are still there.  If they are, it goes to the next package in the list until it finds an EditPackage string that has no .u package.  Then it looks for the source (the folder that holds the .uc files) of that package and uses that to compile a new package.

'''StarWeaver:''' Got a new one (I think, anyway): Changing a [[Legacy:Projector|Projector]] (In my case it's always been position or rotation, both by dragging and by changing the numeric properties) and then using Undo causes a GPF. (My vague guess from the call chain would be the propertly list getting corrupted on read or write to the undo history . . . which is odd, because I'd think it would use the same operations as a cut or copy or duplicate . . . )

'''SuperApe:''' Or how about adding a property definition ''above'' the list of other definitions, while an object of that class already exists, with those properties configured, in the current map space.  Hit compile and GPF.  Solution: remove the object or simply clear out the property settings.

'''Hellkeeper:''' &quot;Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. )&quot;. Hum, I frequently run Ued 1.0, 2.0 and 3.0 at the same time, copy/pasting brush from one to another without problem (except tremendous amount of HOM everywhere). They do not crash until I do stupid things (converting a pawn to static mesh, this mesh to brush, and copying it to Unrealed 1.0).

'''Kirk:''' I encountered the illumination occluding related crash as well, after making a set of very large and narrow brushes. Perhaps the lightmap for the BSP generated for the brush (in this particular case) was too large/disproportionate or something. In any case, splitting the brushes in two got rid of the crash. Perhaps useful to some.

'''JeffMOD:'''I keep getting the following messsgaes before Ued even loads fully: General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc, and, General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- FALVoiceModule::NoteDestroy &lt;- UALAudioSubsystem::NoteDetroy &lt;- ULevel::DestroyActor &lt;- (Camera myLevel.Camera0) &lt;- UPlayer::Destroy &lt;- UViewport::Destroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsViewport::Destroy &lt;- UObject::ConditionalDestroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsClient::Tick &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop. can anyone provide a fix, or will I hhave to stay online until i can get Source SDK?

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34507</id>
      <timestamp>2009-06-20T21:01:46Z</timestamp>
      <contributor>
        <username>Darth san</username>
        <id>1972</id>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">Common UnrealEd Crashes: Easily Avoidable Tragedies

==General ==

* Don't put lights into the solid space because it will cause crashes.
* At least on Win2K Pro, right-clicking on the desktop and changing Appearance -&gt; Schemes will crash the editor.
* When setting the Light Color (Button in UEd 2) don't click on any of the viewports. If you do, the Editor will crash.
* Don't try to do &quot;Convert -&gt; Static Mesh&quot; on a static mesh. ;)
* Doing Edit -&gt; undo too many times in a row usually results in a crash
* Don't right click on a viewport and select View-&gt; show fluid surfaces if there is no fluid surfaces in your level.
* When in [[Legacy:Terrain Mode|Terrain Mode]] don't select a HUGE area with the vertex editing tool and try to move it. Because you are trying to move so many vertices at the same time UnrealEd will most likely crash or freeze up.
* Creating a Warp Zone to itself will cause a big crash!

==Brushes and vertices ==
* When you are vertex editing be careful and don't cross the edges of polygons and don't overlap two or more vertices. If you overlap the vertices you won't be able to separate them afterwards and if the overlapping reduces the facecount of the object then UEd will instantly crash after you release the mouse button moving the vertex.
** Save a lot when you are using the BSP based terrain brush.
** Keep a close eye on what you move and where
** If you are using the Vertex mode the sensitivity of the movement depends on the grid setting you use. Certain grid settings will need a steady hand and lots of concentration.

* Don't try to select a surface's underlying brush with SHIFT+Left-Click if the brush has been deleted (see [[Legacy:Mouse Control|Mouse Control]] for more on this function).

* Don't duplicate a brush that's smaller than the current grid size, or equal and off-grid.

* If you must put a tetrahedron (sphere) brush into your map, don't set the extrapolation value above 3 or 4. This results in a hugely complex brush shape that not only tears the [[Legacy:BSP|BSP]] to shreds but also is likely to cause a crash when you try to add or subtract it.

==2D Shape Editor ==
* Don't cross edges in the [[Legacy:2D Shape Editor|2D Shape Editor]]. When you try to extrude the shape UEd will crash.
* UnrealEd 2 can be crashed by importing a texture file into the 2D Shape Editor incorrectly (and, this happens unexpectedly). When you open the 2D Shape Editor and attempt to import a door texture with the intent of transferring the exact dimension to a 3D Brush, you can crash UnrealEd by doing [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Current Texture. The behavior of the 2D Shape Editor is inconsistent, sometimes the above mentioned technique works, sometimes it doesn't. (This suggestion from Machismo) The solution is that the 2D Shape Editor can only open ''.bmp'' textures. So, when you have the desired texture selected in the Texture Browser, right click the texture and select, ''Export to .pcx''. In the Save Dialog window, select, ''Save as Type &gt; All File Types'', and save the file as a (unique name) ''.bmp'' file. Then, from within the 2D Shape Editor, select, [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Disk and, import.

:'''Tarquin:'''  I've never had this problem, some people say it's frequent. Could it be OS-related? I've just seen a post on TO about this occuring after a switch to win2k.
:'''Daemonica:''' I don't think it's Win2K, a few of us use it here with no problems, it's a useful and often used tool.
:'''Legal:''' I don't get it with UED2 but with 3. It must be teh G0bl1n :p

==Textures ==
* If you delete a texture that is in use UEd will crash. Fix: use the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]] before deleting a texture. (Even if you don't see the texture, it might be used on an invisible surface of a brush.)

* There are several ways to crash UED if you are not careful when deleting or renaming textures, they are:
*# Deleting a texture that is in use - if you delete a texture that is in use, UED will crash if you try to save or look at the texture in the 3D view (this is really tough, you're moving around and all of a sudden it hangs). The correct way to do this is to first make sure that the texture is not in use ''Anywhere'' in the map (including surfaces you can't see!), and then delete the texture. If you have used the texture a lot and are not sure where all it is, then you can use the texture replacing tool, or test if you have gotten rid of the texture entirely by performing a [[Legacy:Texture Cull|texture cull]], which will also remove the texture for you.
*# Delete a texture and then rename another texture to be the deleted texture's name - I'm not quite sure of the specifics, but if you want to do this delete the old texture, save, and re-open the map, then rename the other file. Better yet if you are simply replacing a texture import the new one right over the old one.

*Importing a file of .bmp or .pcx type that is NOT in indexed 8-bit color format will crash the editor with a General Protection Fault. (I'm not sure you can actually save a .bmp in RGB color mode or anything else besides indexed but I know for a fact that Photoshop is quite willing to save a .pcx in RGB color mode).

*In UnrealED 3, many time importing a texture with the same name, overwriting a previous texture, and then using the same type of DXTC compression to compress the texture gives a crash. Possible workarounds would be compressing the texture before importing.

*This won't crash UED, but it'll make your map completely unplayable, saving the MyLevel package as a texture package, or SM package, etc. So far i have found no remedy for this.

*Creating a new Raw material derived from itself. (eg. Creating a TexPanner which Pans itself). &lt;br /&gt;When creating a new raw material the Texture browser will automatically select this new material. This is a common trap for people who: &lt;br /&gt;select the derivative material from the Texture Browser -&gt; Create the new material -&gt; Click the ''Use'' button to use the selected derivative material. The correct procedure is as follows: &lt;br /&gt;Create the new material -&gt; select the derivative material from the Texture Browser -&gt; Click the ''Use'' button to use the selected derivative material. 

==Sounds ==
* Adding a modified ''AmbientSound'' to your level, when the file size becomes too big for the Unreal Engine (Can this be accurately quantified?) will cause both Unreal Tournament and the Unreal Editor to crash. Typically, this is a file mixed with [[Legacy:ModPlug Tracker|ModPlug Tracker]] and converted to ''.wav'' format. (I will add a better explanation later)

* Adding a custom sound to your level without importing it properly ( and, I don't know the correct technique for this) will cause a ''General Protection Fault''. The level design will then be unplayable, even if you delete the Ambient Sound. The recommended techniques in various tutorials, does not work as advertised. (I will research this and find the TRUTH.)

==Terrain==
* [[Legacy:Terrain Texture Layer|Terrain texture layer]]s do not like being rectangular.
* Do not use the terrain smoothing tool near the edges of terrain. 

==BSP Rebuild Options ==
* Which settings in the [[Legacy:Build|Build]] window can safely be changed? 
** Anything in the Optimization section. Avoid at all cost the BSP Rebuild Options section. People have completely killed UnrealEd by changing these. (This seems to be what everyone quotes, but you can quite safely change the sliders without destroying the editor. They are also set back to the default settings when you next load UED, so you can just reload the editor if anything goes wrong)
** Changing the first slider alters the amount of BSP cuts that are made. I don't know the exact effects of this, only that setting it to the highest level gives a ridiculous amount of BSP cuts and setting it to &quot;Minimise Cuts&quot; does exactly that. Mess with it a bit if there's a BSP error that you absoloutly can't get rid of, or lower this slider if your node count is far too high.
** The second slider adjusts how zone portals are handled when rebuilding bsp. Very rarely, a zone portal won't zone off an area, even if it completly seals it. Setting this slider closer to the &quot;Portals cut all&quot; option should fix this problem. Setting the slider to &quot;Ignore Portals&quot; will increase the chance that the ed won't zone an area off (don't know what the point of that is)

==Related Topics ==
* [[Legacy:UnrealEd Bug List|UnrealEd Bug List]]
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[Legacy:Unreal Mapping FAQ (UT)|Unreal Mapping FAQ (UT)]]

==Comments ==

Whenever I set all the rendering options in advanced properties to true and then select show all actors, the editor runs fine until i move the camera through a wall and outside of the level, it then jams and when i close it (with Ctrl, Alt + delete) i get an error in different parts of the level. &amp;ndash;''ProjectX''

'''Daid303:''' Creating an [[Legacy:Inline Object|inline object]] in the [[Legacy:Default Properties|Default properties]] of any actor in the [[Legacy:Actor Browser|Actor browser]] also gives a GPF.

'''Wormbo:''' Don't try to create an [[Legacy:Emitter|Emitter]] that emits particles with high acceleration values and lifespan. UnrealEd will decide to eat up more and more memory (more than usual) and doesn't respond anymore.

'''Winxprules:''' I hope you can help me here... When I go to build my map, UnrealEd crashes when it comes to Illumination Occluding. I'm guessing that illumination has something to do with the lighting, but I just wanted to check. If you could help, I'd appreciate it very much. Thanks.

'''Winxprules:''' Never mind... I managed to fix my problem by deleting every last light from the level. It took a while but it was well worth it ;)

'''Tarquin:''' Save yourself time if you ever have to do this again: see [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select all &lt;class&gt;.

'''Winxprules:''' Thanks for the tip, Tarquin :)

'''DataCable:''' This may be game-specific, but the UEd 1 bundled with DS9:TF will crash if you have no object(s) selected and simply move the cursor over the title bar of an already-opened properties window.  Took a while to realize that this was causing otherwise seemingly random crashes.

'''Leggy:''' Is it me, or does putting many lights on the grid cause the editor to crash to the desktop during Illumination occuluding sometimes? I had a map that just would't build, and I selected all the lights and moved them by less than a grid unit in each direction, and now it works perfectly.

'''Bob_The_Beheader:''' Hmm...It's kind of hard to tell why UEd crashes when it happens while it's starting up. It's just given me this error while the splash screen is showing:

{{innerbox|Build UT2004_Build_[2005-02-15_17.02]

}}

{{innerbox|OS: Windows XP 5.1 (Build: 2600)

CPU: GenuineIntel Unknown processor @ 3196 MHz with 510MB RAM

Video: NVIDIA GeForce FX Go5200 (4690)

}}

{{innerbox|Assertion failed: WhiteCircle [File:.\UnTerrainTools.cpp] [Line: 788]

}}

{{innerbox|History: FTerrainTools::Init

}}

I've recently started learning to code UnrealScript, and so I've rebuilt packages and stuff, maybe that has someting to do with why it crashes? 

'''MythOpus:''' Well Bob, in UnrealScript recompiling the original packages that come with your game is a general no no, unless you A.  have a license and B. are making a totally new game.  What most people do is build upon the default packages by extending actors within the default packages.  An example would be having a Sphere as an actor in a default package and you want to create a basketball.  You would 'extend' the Sphere actor from the default package and make the new Basketball class in your own custom package (I.E. MyBasketball.u).

I hope this helps...  Also...  about the error itself, I think it has to do with the importing of the source code that you had recompiled... or the absense of that native source code all together (The C Headers)

'''Bob_The_Beheader:''' Thanks. I do know about object oriented programmming, but the default packages are rebuilt when you run UCC, right? That's all I meant. People must think I am going around promoting screwing with the defualt packages, what with this and the page I made, [[Legacy:Actors_Snap_By_Default|Actors_Snap_By_Default]]. I really am not. I do know that it's bad.

'''MythOpus:''' Heh... actually UCC doesn't actually rebuild any package unless the .u for that package has been deleted.  Therefore, normally UCC only checks to see if the packages are still there.  If they are, it goes to the next package in the list until it finds an EditPackage string that has no .u package.  Then it looks for the source (the folder that holds the .uc files) of that package and uses that to compile a new package.

'''StarWeaver:''' Got a new one (I think, anyway): Changing a [[Legacy:Projector|Projector]] (In my case it's always been position or rotation, both by dragging and by changing the numeric properties) and then using Undo causes a GPF. (My vague guess from the call chain would be the propertly list getting corrupted on read or write to the undo history . . . which is odd, because I'd think it would use the same operations as a cut or copy or duplicate . . . )

'''SuperApe:''' Or how about adding a property definition ''above'' the list of other definitions, while an object of that class already exists, with those properties configured, in the current map space.  Hit compile and GPF.  Solution: remove the object or simply clear out the property settings.

'''Hellkeeper:''' &quot;Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. )&quot;. Hum, I frequently run Ued 1.0, 2.0 and 3.0 at the same time, copy/pasting brush from one to another without problem (except tremendous amount of HOM everywhere). They do not crash until I do stupid things (converting a pawn to static mesh, this mesh to brush, and copying it to Unrealed 1.0).

'''Kirk:''' I encountered the illumination occluding related crash as well, after making a set of very large and narrow brushes. Perhaps the lightmap for the BSP generated for the brush (in this particular case) was too large/disproportionate or something. In any case, splitting the brushes in two got rid of the crash. Perhaps useful to some.

'''JeffMOD:'''I keep getting the following messsgaes before Ued even loads fully: General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc, and, General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- FALVoiceModule::NoteDestroy &lt;- UALAudioSubsystem::NoteDetroy &lt;- ULevel::DestroyActor &lt;- (Camera myLevel.Camera0) &lt;- UPlayer::Destroy &lt;- UViewport::Destroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsViewport::Destroy &lt;- UObject::ConditionalDestroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsClient::Tick &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop. can anyone provide a fix, or will I hhave to stay online until i can get Source SDK?

'''darth_san:'''I get some problem with UnrealEd of Repubic Commando: when I try to edit some default properties (generally this is text parameters) in Actor Classes, UnrealEd crashes. It is very strange. Please tell me, what is the cause of this crashing? Forgive me for my bad English (I'm from Ukraine).

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40388</id>
      <timestamp>2010-01-05T21:18:48Z</timestamp>
      <contributor>
        <username>EQ²</username>
        <id>2077</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Common UnrealEd Crashes: Easily Avoidable Tragedies

==General ==

* Don't put lights into the solid space because it will cause crashes.
* At least on Win2K Pro, right-clicking on the desktop and changing Appearance -&gt; Schemes will crash the editor.
* When setting the Light Color (Button in UEd 2) don't click on any of the viewports. If you do, the Editor will crash.
* Don't try to do &quot;Convert -&gt; Static Mesh&quot; on a static mesh. ;)
* Doing Edit -&gt; undo too many times in a row usually results in a crash
* Don't right click on a viewport and select View-&gt; show fluid surfaces if there is no fluid surfaces in your level.
* When in [[Legacy:Terrain Mode|Terrain Mode]] don't select a HUGE area with the vertex editing tool and try to move it. Because you are trying to move so many vertices at the same time UnrealEd will most likely crash or freeze up.
* Creating a Warp Zone to itself will cause a big crash!

==Brushes and vertices ==
* When you are vertex editing be careful and don't cross the edges of polygons and don't overlap two or more vertices. If you overlap the vertices you won't be able to separate them afterwards and if the overlapping reduces the facecount of the object then UEd will instantly crash after you release the mouse button moving the vertex.
** Save a lot when you are using the BSP based terrain brush.
** Keep a close eye on what you move and where
** If you are using the Vertex mode the sensitivity of the movement depends on the grid setting you use. Certain grid settings will need a steady hand and lots of concentration.

* Don't try to select a surface's underlying brush with SHIFT+Left-Click if the brush has been deleted (see [[Legacy:Mouse Control|Mouse Control]] for more on this function).

* Don't duplicate a brush that's smaller than the current grid size, or equal and off-grid.

* If you must put a tetrahedron (sphere) brush into your map, don't set the extrapolation value above 3 or 4. This results in a hugely complex brush shape that not only tears the [[Legacy:BSP|BSP]] to shreds but also is likely to cause a crash when you try to add or subtract it.

==2D Shape Editor ==
* Don't cross edges in the [[Legacy:2D Shape Editor|2D Shape Editor]]. When you try to extrude the shape UEd will crash.
* UnrealEd 2 can be crashed by importing a texture file into the 2D Shape Editor incorrectly (and, this happens unexpectedly). When you open the 2D Shape Editor and attempt to import a door texture with the intent of transferring the exact dimension to a 3D Brush, you can crash UnrealEd by doing [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Current Texture. The behavior of the 2D Shape Editor is inconsistent, sometimes the above mentioned technique works, sometimes it doesn't. (This suggestion from Machismo) The solution is that the 2D Shape Editor can only open ''.bmp'' textures. So, when you have the desired texture selected in the Texture Browser, right click the texture and select, ''Export to .pcx''. In the Save Dialog window, select, ''Save as Type &gt; All File Types'', and save the file as a (unique name) ''.bmp'' file. Then, from within the 2D Shape Editor, select, [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Disk and, import.

:'''Tarquin:'''  I've never had this problem, some people say it's frequent. Could it be OS-related? I've just seen a post on TO about this occuring after a switch to win2k.
:'''Daemonica:''' I don't think it's Win2K, a few of us use it here with no problems, it's a useful and often used tool.
:'''Legal:''' I don't get it with UED2 but with 3. It must be teh G0bl1n :p

==Textures ==
* If you delete a texture that is in use UEd will crash. Fix: use the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]] before deleting a texture. (Even if you don't see the texture, it might be used on an invisible surface of a brush.)

* There are several ways to crash UED if you are not careful when deleting or renaming textures, they are:
*# Deleting a texture that is in use - if you delete a texture that is in use, UED will crash if you try to save or look at the texture in the 3D view (this is really tough, you're moving around and all of a sudden it hangs). The correct way to do this is to first make sure that the texture is not in use ''Anywhere'' in the map (including surfaces you can't see!), and then delete the texture. If you have used the texture a lot and are not sure where all it is, then you can use the texture replacing tool, or test if you have gotten rid of the texture entirely by performing a [[Legacy:Texture Cull|texture cull]], which will also remove the texture for you.
*# Delete a texture and then rename another texture to be the deleted texture's name - I'm not quite sure of the specifics, but if you want to do this delete the old texture, save, and re-open the map, then rename the other file. Better yet if you are simply replacing a texture import the new one right over the old one.

*Importing a file of .bmp or .pcx type that is NOT in indexed 8-bit color format will crash the editor with a General Protection Fault. (I'm not sure you can actually save a .bmp in RGB color mode or anything else besides indexed but I know for a fact that Photoshop is quite willing to save a .pcx in RGB color mode).

*In UnrealED 3, many time importing a texture with the same name, overwriting a previous texture, and then using the same type of DXTC compression to compress the texture gives a crash. Possible workarounds would be compressing the texture before importing.

*This won't crash UED, but it'll make your map completely unplayable, saving the MyLevel package as a texture package, or SM package, etc. So far i have found no remedy for this.

*Creating a new Raw material derived from itself. (eg. Creating a TexPanner which Pans itself). &lt;br /&gt;When creating a new raw material the Texture browser will automatically select this new material. This is a common trap for people who: &lt;br /&gt;select the derivative material from the Texture Browser -&gt; Create the new material -&gt; Click the ''Use'' button to use the selected derivative material. The correct procedure is as follows: &lt;br /&gt;Create the new material -&gt; select the derivative material from the Texture Browser -&gt; Click the ''Use'' button to use the selected derivative material. 

==Sounds ==
* Adding a modified ''AmbientSound'' to your level, when the file size becomes too big for the Unreal Engine (Can this be accurately quantified?) will cause both Unreal Tournament and the Unreal Editor to crash. Typically, this is a file mixed with [[Legacy:ModPlug Tracker|ModPlug Tracker]] and converted to ''.wav'' format. (I will add a better explanation later)

* Adding a custom sound to your level without importing it properly ( and, I don't know the correct technique for this) will cause a ''General Protection Fault''. The level design will then be unplayable, even if you delete the Ambient Sound. The recommended techniques in various tutorials, does not work as advertised. (I will research this and find the TRUTH.)

==Terrain==
* [[Legacy:Terrain Texture Layer|Terrain texture layer]]s do not like being rectangular.
* Do not use the terrain smoothing tool near the edges of terrain. 

==BSP Rebuild Options ==
* Which settings in the [[Legacy:Build|Build]] window can safely be changed? 
** Anything in the Optimization section. Avoid at all cost the BSP Rebuild Options section. People have completely killed UnrealEd by changing these. (This seems to be what everyone quotes, but you can quite safely change the sliders without destroying the editor. They are also set back to the default settings when you next load UED, so you can just reload the editor if anything goes wrong)
** Changing the first slider alters the amount of BSP cuts that are made. I don't know the exact effects of this, only that setting it to the highest level gives a ridiculous amount of BSP cuts and setting it to &quot;Minimise Cuts&quot; does exactly that. Mess with it a bit if there's a BSP error that you absoloutly can't get rid of, or lower this slider if your node count is far too high.
** The second slider adjusts how zone portals are handled when rebuilding bsp. Very rarely, a zone portal won't zone off an area, even if it completly seals it. Setting this slider closer to the &quot;Portals cut all&quot; option should fix this problem. Setting the slider to &quot;Ignore Portals&quot; will increase the chance that the ed won't zone an area off (don't know what the point of that is)

==Related Topics ==
* [[Legacy:UnrealEd Bug List|UnrealEd Bug List]]
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[Legacy:Unreal Mapping FAQ (UT)|Unreal Mapping FAQ (UT)]]

==Comments ==

Whenever I set all the rendering options in advanced properties to true and then select show all actors, the editor runs fine until i move the camera through a wall and outside of the level, it then jams and when i close it (with Ctrl, Alt + delete) i get an error in different parts of the level. &amp;ndash;''ProjectX''

'''Daid303:''' Creating an [[Legacy:Inline Object|inline object]] in the [[Legacy:Default Properties|Default properties]] of any actor in the [[Legacy:Actor Browser|Actor browser]] also gives a GPF.

'''Wormbo:''' Don't try to create an [[Legacy:Emitter|Emitter]] that emits particles with high acceleration values and lifespan. UnrealEd will decide to eat up more and more memory (more than usual) and doesn't respond anymore.

'''Winxprules:''' I hope you can help me here... When I go to build my map, UnrealEd crashes when it comes to Illumination Occluding. I'm guessing that illumination has something to do with the lighting, but I just wanted to check. If you could help, I'd appreciate it very much. Thanks.

'''Winxprules:''' Never mind... I managed to fix my problem by deleting every last light from the level. It took a while but it was well worth it ;)

'''Tarquin:''' Save yourself time if you ever have to do this again: see [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select all &lt;class&gt;.

'''Winxprules:''' Thanks for the tip, Tarquin :)

'''DataCable:''' This may be game-specific, but the UEd 1 bundled with DS9:TF will crash if you have no object(s) selected and simply move the cursor over the title bar of an already-opened properties window.  Took a while to realize that this was causing otherwise seemingly random crashes.

'''Leggy:''' Is it me, or does putting many lights on the grid cause the editor to crash to the desktop during Illumination occuluding sometimes? I had a map that just would't build, and I selected all the lights and moved them by less than a grid unit in each direction, and now it works perfectly.

'''Bob_The_Beheader:''' Hmm...It's kind of hard to tell why UEd crashes when it happens while it's starting up. It's just given me this error while the splash screen is showing:

{{innerbox|Build UT2004_Build_[2005-02-15_17.02]

}}

{{innerbox|OS: Windows XP 5.1 (Build: 2600)

CPU: GenuineIntel Unknown processor @ 3196 MHz with 510MB RAM

Video: NVIDIA GeForce FX Go5200 (4690)

}}

{{innerbox|Assertion failed: WhiteCircle [File:.\UnTerrainTools.cpp] [Line: 788]

}}

{{innerbox|History: FTerrainTools::Init

}}

I've recently started learning to code UnrealScript, and so I've rebuilt packages and stuff, maybe that has someting to do with why it crashes? 

'''MythOpus:''' Well Bob, in UnrealScript recompiling the original packages that come with your game is a general no no, unless you A.  have a license and B. are making a totally new game.  What most people do is build upon the default packages by extending actors within the default packages.  An example would be having a Sphere as an actor in a default package and you want to create a basketball.  You would 'extend' the Sphere actor from the default package and make the new Basketball class in your own custom package (I.E. MyBasketball.u).

I hope this helps...  Also...  about the error itself, I think it has to do with the importing of the source code that you had recompiled... or the absense of that native source code all together (The C Headers)

'''Bob_The_Beheader:''' Thanks. I do know about object oriented programmming, but the default packages are rebuilt when you run UCC, right? That's all I meant. People must think I am going around promoting screwing with the defualt packages, what with this and the page I made, [[Legacy:Actors_Snap_By_Default|Actors_Snap_By_Default]]. I really am not. I do know that it's bad.

'''MythOpus:''' Heh... actually UCC doesn't actually rebuild any package unless the .u for that package has been deleted.  Therefore, normally UCC only checks to see if the packages are still there.  If they are, it goes to the next package in the list until it finds an EditPackage string that has no .u package.  Then it looks for the source (the folder that holds the .uc files) of that package and uses that to compile a new package.

'''StarWeaver:''' Got a new one (I think, anyway): Changing a [[Legacy:Projector|Projector]] (In my case it's always been position or rotation, both by dragging and by changing the numeric properties) and then using Undo causes a GPF. (My vague guess from the call chain would be the propertly list getting corrupted on read or write to the undo history . . . which is odd, because I'd think it would use the same operations as a cut or copy or duplicate . . . )

'''SuperApe:''' Or how about adding a property definition ''above'' the list of other definitions, while an object of that class already exists, with those properties configured, in the current map space.  Hit compile and GPF.  Solution: remove the object or simply clear out the property settings.

'''Hellkeeper:''' &quot;Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. )&quot;. Hum, I frequently run Ued 1.0, 2.0 and 3.0 at the same time, copy/pasting brush from one to another without problem (except tremendous amount of HOM everywhere). They do not crash until I do stupid things (converting a pawn to static mesh, this mesh to brush, and copying it to Unrealed 1.0).

'''Kirk:''' I encountered the illumination occluding related crash as well, after making a set of very large and narrow brushes. Perhaps the lightmap for the BSP generated for the brush (in this particular case) was too large/disproportionate or something. In any case, splitting the brushes in two got rid of the crash. Perhaps useful to some.

'''JeffMOD:'''I keep getting the following messsgaes before Ued even loads fully: General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc, and, General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- FALVoiceModule::NoteDestroy &lt;- UALAudioSubsystem::NoteDetroy &lt;- ULevel::DestroyActor &lt;- (Camera myLevel.Camera0) &lt;- UPlayer::Destroy &lt;- UViewport::Destroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsViewport::Destroy &lt;- UObject::ConditionalDestroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsClient::Tick &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop. can anyone provide a fix, or will I hhave to stay online until i can get Source SDK?

'''darth_san:'''I get some problem with UnrealEd of Repubic Commando: when I try to edit some default properties (generally this is text parameters) in Actor Classes, UnrealEd crashes. It is very strange. Please tell me, what is the cause of this crashing? Forgive me for my bad English (I'm from Ukraine).

'''EQ²:''' With respect to the error posted by JeffMOD above, I've found the cause of this error in UnrealEd 3.0 to be &quot;un-docking&quot; the Static Mesh browser from the tabbed container window. It seems that you can un-dock all windows '''except''' the Static Mesh browser! So if you, like me, like to undock all the windows so you can tile them on other monitor(s), un-dock all of them except for the Static Mesh browser. To fix this error, open up UnrealEd.ini (or MyUnrealEd.ini if using the U2 editor), find the [Static Mesh Browser] section, and delete the line which says Docked=0. Hope this helps someone.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44884</id>
      <timestamp>2012-02-02T23:56:40Z</timestamp>
      <contributor>
        <ip>201.62.224.7</ip>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">Common UnrealEd Crashes: Easily Avoidable Tragedies

==General ==

* Don't put lights into the solid space because it will cause crashes.
* At least on Win2K Pro, right-clicking on the desktop and changing Appearance -&gt; Schemes will crash the editor.
* When setting the Light Color (Button in UEd 2) don't click on any of the viewports. If you do, the Editor will crash.
* Don't try to do &quot;Convert -&gt; Static Mesh&quot; on a static mesh. ;)
* Doing Edit -&gt; undo too many times in a row usually results in a crash
* Don't right click on a viewport and select View-&gt; show fluid surfaces if there is no fluid surfaces in your level.
* When in [[Legacy:Terrain Mode|Terrain Mode]] don't select a HUGE area with the vertex editing tool and try to move it. Because you are trying to move so many vertices at the same time UnrealEd will most likely crash or freeze up.
* Creating a Warp Zone to itself will cause a big crash!

==Brushes and vertices ==
* When you are vertex editing be careful and don't cross the edges of polygons and don't overlap two or more vertices. If you overlap the vertices you won't be able to separate them afterwards and if the overlapping reduces the facecount of the object then UEd will instantly crash after you release the mouse button moving the vertex.
** Save a lot when you are using the BSP based terrain brush.
** Keep a close eye on what you move and where
** If you are using the Vertex mode the sensitivity of the movement depends on the grid setting you use. Certain grid settings will need a steady hand and lots of concentration.

* Don't try to select a surface's underlying brush with SHIFT+Left-Click if the brush has been deleted (see [[Legacy:Mouse Control|Mouse Control]] for more on this function).

* Don't duplicate a brush that's smaller than the current grid size, or equal and off-grid.

* If you must put a tetrahedron (sphere) brush into your map, don't set the extrapolation value above 3 or 4. This results in a hugely complex brush shape that not only tears the [[Legacy:BSP|BSP]] to shreds but also is likely to cause a crash when you try to add or subtract it.

==2D Shape Editor ==
* Don't cross edges in the [[Legacy:2D Shape Editor|2D Shape Editor]]. When you try to extrude the shape UEd will crash.
* UnrealEd 2 can be crashed by importing a texture file into the 2D Shape Editor incorrectly (and, this happens unexpectedly). When you open the 2D Shape Editor and attempt to import a door texture with the intent of transferring the exact dimension to a 3D Brush, you can crash UnrealEd by doing [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Current Texture. The behavior of the 2D Shape Editor is inconsistent, sometimes the above mentioned technique works, sometimes it doesn't. (This suggestion from Machismo) The solution is that the 2D Shape Editor can only open ''.bmp'' textures. So, when you have the desired texture selected in the Texture Browser, right click the texture and select, ''Export to .pcx''. In the Save Dialog window, select, ''Save as Type &gt; All File Types'', and save the file as a (unique name) ''.bmp'' file. Then, from within the 2D Shape Editor, select, [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get From Disk and, import.

:'''Tarquin:'''  I've never had this problem, some people say it's frequent. Could it be OS-related? I've just seen a post on TO about this occuring after a switch to win2k.
:'''Daemonica:''' I don't think it's Win2K, a few of us use it here with no problems, it's a useful and often used tool.
:'''Legal:''' I don't get it with UED2 but with 3. It must be teh G0bl1n :p

==Textures ==
* If you delete a texture that is in use UEd will crash. Fix: use the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]] before deleting a texture. (Even if you don't see the texture, it might be used on an invisible surface of a brush.)

* There are several ways to crash UED if you are not careful when deleting or renaming textures, they are:
*# Deleting a texture that is in use - if you delete a texture that is in use, UED will crash if you try to save or look at the texture in the 3D view (this is really tough, you're moving around and all of a sudden it hangs). The correct way to do this is to first make sure that the texture is not in use ''Anywhere'' in the map (including surfaces you can't see!), and then delete the texture. If you have used the texture a lot and are not sure where all it is, then you can use the texture replacing tool, or test if you have gotten rid of the texture entirely by performing a [[Legacy:Texture Cull|texture cull]], which will also remove the texture for you.
*# Delete a texture and then rename another texture to be the deleted texture's name - I'm not quite sure of the specifics, but if you want to do this delete the old texture, save, and re-open the map, then rename the other file. Better yet if you are simply replacing a texture import the new one right over the old one.

*Importing a file of .bmp or .pcx type that is NOT in indexed 8-bit color format will crash the editor with a General Protection Fault. (I'm not sure you can actually save a .bmp in RGB color mode or anything else besides indexed but I know for a fact that Photoshop is quite willing to save a .pcx in RGB color mode).

*In UnrealED 3, many time importing a texture with the same name, overwriting a previous texture, and then using the same type of DXTC compression to compress the texture gives a crash. Possible workarounds would be compressing the texture before importing.

*This won't crash UED, but it'll make your map completely unplayable, saving the MyLevel package as a texture package, or SM package, etc. So far i have found no remedy for this.

*Creating a new Raw material derived from itself. (eg. Creating a TexPanner which Pans itself). &lt;br /&gt;When creating a new raw material the Texture browser will automatically select this new material. This is a common trap for people who: &lt;br /&gt;select the derivative material from the Texture Browser -&gt; Create the new material -&gt; Click the ''Use'' button to use the selected derivative material. The correct procedure is as follows: &lt;br /&gt;Create the new material -&gt; select the derivative material from the Texture Browser -&gt; Click the ''Use'' button to use the selected derivative material. 

==Sounds ==
* Adding a modified ''AmbientSound'' to your level, when the file size becomes too big for the Unreal Engine (Can this be accurately quantified?) will cause both Unreal Tournament and the Unreal Editor to crash. Typically, this is a file mixed with [[Legacy:ModPlug Tracker|ModPlug Tracker]] and converted to ''.wav'' format. (I will add a better explanation later)

* Adding a custom sound to your level without importing it properly ( and, I don't know the correct technique for this) will cause a ''General Protection Fault''. The level design will then be unplayable, even if you delete the Ambient Sound. The recommended techniques in various tutorials, does not work as advertised. (I will research this and find the TRUTH.)

==Terrain==
* [[Legacy:Terrain Texture Layer|Terrain texture layer]]s do not like being rectangular.
* Do not use the terrain smoothing tool near the edges of terrain. 

==BSP Rebuild Options ==
* Which settings in the [[Legacy:Build|Build]] window can safely be changed? 
** Anything in the Optimization section. Avoid at all cost the BSP Rebuild Options section. People have completely killed UnrealEd by changing these. (This seems to be what everyone quotes, but you can quite safely change the sliders without destroying the editor. They are also set back to the default settings when you next load UED, so you can just reload the editor if anything goes wrong)
** Changing the first slider alters the amount of BSP cuts that are made. I don't know the exact effects of this, only that setting it to the highest level gives a ridiculous amount of BSP cuts and setting it to &quot;Minimise Cuts&quot; does exactly that. Mess with it a bit if there's a BSP error that you absoloutly can't get rid of, or lower this slider if your node count is far too high.
** The second slider adjusts how zone portals are handled when rebuilding bsp. Very rarely, a zone portal won't zone off an area, even if it completly seals it. Setting this slider closer to the &quot;Portals cut all&quot; option should fix this problem. Setting the slider to &quot;Ignore Portals&quot; will increase the chance that the ed won't zone an area off (don't know what the point of that is)

==Related Topics ==
* [[Legacy:UnrealEd Bug List|UnrealEd Bug List]]
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[Legacy:Unreal Mapping FAQ (UT)|Unreal Mapping FAQ (UT)]]

==Comments ==

Whenever I set all the rendering options in advanced properties to true and then select show all actors, the editor runs fine until i move the camera through a wall and outside of the level, it then jams and when i close it (with Ctrl, Alt + delete) i get an error in different parts of the level. &amp;ndash;''ProjectX''

'''Daid303:''' Creating an [[Legacy:Inline Object|inline object]] in the [[Legacy:Default Properties|Default properties]] of any actor in the [[Legacy:Actor Browser|Actor browser]] also gives a GPF.

'''Wormbo:''' Don't try to create an [[Legacy:Emitter|Emitter]] that emits particles with high acceleration values and lifespan. UnrealEd will decide to eat up more and more memory (more than usual) and doesn't respond anymore.

'''Winxprules:''' I hope you can help me here... When I go to build my map, UnrealEd crashes when it comes to Illumination Occluding. I'm guessing that illumination has something to do with the lighting, but I just wanted to check. If you could help, I'd appreciate it very much. Thanks.

'''Winxprules:''' Never mind... I managed to fix my problem by deleting every last light from the level. It took a while but it was well worth it ;)

'''Tarquin:''' Save yourself time if you ever have to do this again: see [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select all &lt;class&gt;.

'''Winxprules:''' Thanks for the tip, Tarquin :)

'''DataCable:''' This may be game-specific, but the UEd 1 bundled with DS9:TF will crash if you have no object(s) selected and simply move the cursor over the title bar of an already-opened properties window.  Took a while to realize that this was causing otherwise seemingly random crashes.

'''Leggy:''' Is it me, or does putting many lights on the grid cause the editor to crash to the desktop during Illumination occuluding sometimes? I had a map that just would't build, and I selected all the lights and moved them by less than a grid unit in each direction, and now it works perfectly.

'''Bob_The_Beheader:''' Hmm...It's kind of hard to tell why UEd crashes when it happens while it's starting up. It's just given me this error while the splash screen is showing:

{{innerbox|Build UT2004_Build_[2005-02-15_17.02]

}}

{{innerbox|OS: Windows XP 5.1 (Build: 2600)

CPU: GenuineIntel Unknown processor @ 3196 MHz with 510MB RAM

Video: NVIDIA GeForce FX Go5200 (4690)

}}

{{innerbox|Assertion failed: WhiteCircle [File:.\UnTerrainTools.cpp] [Line: 788]

}}

{{innerbox|History: FTerrainTools::Init

}}

I've recently started learning to code UnrealScript, and so I've rebuilt packages and stuff, maybe that has someting to do with why it crashes? 

'''MythOpus:''' Well Bob, in UnrealScript recompiling the original packages that come with your game is a general no no, unless you A.  have a license and B. are making a totally new game.  What most people do is build upon the default packages by extending actors within the default packages.  An example would be having a Sphere as an actor in a default package and you want to create a basketball.  You would 'extend' the Sphere actor from the default package and make the new Basketball class in your own custom package (I.E. MyBasketball.u).

I hope this helps...  Also...  about the error itself, I think it has to do with the importing of the source code that you had recompiled... or the absense of that native source code all together (The C Headers)

'''Bob_The_Beheader:''' Thanks. I do know about object oriented programmming, but the default packages are rebuilt when you run UCC, right? That's all I meant. People must think I am going around promoting screwing with the defualt packages, what with this and the page I made, [[Legacy:Actors_Snap_By_Default|Actors_Snap_By_Default]]. I really am not. I do know that it's bad.

'''MythOpus:''' Heh... actually UCC doesn't actually rebuild any package unless the .u for that package has been deleted.  Therefore, normally UCC only checks to see if the packages are still there.  If they are, it goes to the next package in the list until it finds an EditPackage string that has no .u package.  Then it looks for the source (the folder that holds the .uc files) of that package and uses that to compile a new package.

'''StarWeaver:''' Got a new one (I think, anyway): Changing a [[Legacy:Projector|Projector]] (In my case it's always been position or rotation, both by dragging and by changing the numeric properties) and then using Undo causes a GPF. (My vague guess from the call chain would be the propertly list getting corrupted on read or write to the undo history . . . which is odd, because I'd think it would use the same operations as a cut or copy or duplicate . . . )

'''SuperApe:''' Or how about adding a property definition ''above'' the list of other definitions, while an object of that class already exists, with those properties configured, in the current map space.  Hit compile and GPF.  Solution: remove the object or simply clear out the property settings.

'''Hellkeeper:''' &quot;Don't try to run UEd 2 and UEd 3 at the same time, most likely all hell breaks loose. (Or one of them just crashes. )&quot;. Hum, I frequently run Ued 1.0, 2.0 and 3.0 at the same time, copy/pasting brush from one to another without problem (except tremendous amount of HOM everywhere). They do not crash until I do stupid things (converting a pawn to static mesh, this mesh to brush, and copying it to Unrealed 1.0).

'''Kirk:''' I encountered the illumination occluding related crash as well, after making a set of very large and narrow brushes. Perhaps the lightmap for the BSP generated for the brush (in this particular case) was too large/disproportionate or something. In any case, splitting the brushes in two got rid of the crash. Perhaps useful to some.

'''JeffMOD:'''I keep getting the following messsgaes before Ued even loads fully: General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc, and, General protection fault!

History: WBrowserStaticMesh::UpdateMenu &lt;- WBrowserStaticMesh::OnSize &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- WBrowserStaticMesh::OnCreate &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- PerformCreateWindowEx &lt;- WBrowser::OpenWindow &lt;- WBrowserStaticMesh::OpenWindow &lt;- WM_BROWSER_UNDOCK &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- FALVoiceModule::NoteDestroy &lt;- UALAudioSubsystem::NoteDetroy &lt;- ULevel::DestroyActor &lt;- (Camera myLevel.Camera0) &lt;- UPlayer::Destroy &lt;- UViewport::Destroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsViewport::Destroy &lt;- UObject::ConditionalDestroy &lt;- (WindowsViewport Package.WindowsClient0.TerrainHeightmap) &lt;- UWindowsClient::Tick &lt;- UEditorEngine::Tick &lt;- UpdateWorld &lt;- MainLoop. can anyone provide a fix, or will I hhave to stay online until i can get Source SDK?

'''darth_san:'''I get some problem with UnrealEd of Repubic Commando: when I try to edit some default properties (generally this is text parameters) in Actor Classes, UnrealEd crashes. It is very strange. Please tell me, what is the cause of this crashing? Forgive me for my bad English (I'm from Ukraine).

'''EQ²:''' With respect to the error posted by JeffMOD above, I've found the cause of this error in UnrealEd 3.0 to be &quot;un-docking&quot; the Static Mesh browser from the tabbed container window. It seems that you can un-dock all windows '''except''' the Static Mesh browser! So if you, like me, like to undock all the windows so you can tile them on other monitor(s), un-dock all of them except for the Static Mesh browser. To fix this error, open up UnrealEd.ini (or MyUnrealEd.ini if using the U2 editor), find the [Static Mesh Browser] section, and delete the line which says Docked=0. Hope this helps someone.

'''Falcao:'''With respect to the error posted by JeffMOD above. To fix this error, open the file &quot;unrealed.ini&quot;, find the [Static Mesh Browser] section and change the value of &quot;docked&quot; to 1.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Craze</title>
    <id>855</id>
    <revision>
      <id>2384</id>
      <timestamp>2006-02-06T23:22:17Z</timestamp>
      <contributor>
        <ip>C-67-183-215-11.hsd1.wa.comcast.net</ip>
      </contributor>
      <comment>more stuff</comment>
      <text xml:space="preserve">I am craze. I AM STILL ALIVE exept...

i forgot my password, i changed IPS's so i now have a different email so now i cant ever login again because nobody will believe its me heh...

I am a map maker for UnWheel mod 2004(W0000t, im banned now :P )

I am trying to script some stuff and write a bug fix exept ued never saves myt code so 6 hours of work are now gone :/

still alive... 

working on a nice big UT project with some other people :)

search has died! and now its been fixed, yeay.

still alive, dont do much of anything but read stuff anymore, just sayin' im still alive and usin' teh wiki, teh wiki is teh PWN, thats all for now...

[[Image:Legacy_thislevelwithlotsofammo-2.jpeg|center|one of my grand but odd levels. very large.]]

As you can see it's sorta odd. :)

[[Image:Legacy_uglyskaarj.jpeg|]]

The pug fugly skaarj that I made.

----

Please fix this:

&lt;uscript&gt;
//will put code here when I need to.
&lt;/uscript&gt;

----
 =====]  H  [=====
 ======] E [======
 =======]L[=======
 ======] L [======
 =====]  O  [=====
 ====]       [====
 =====]  I  [=====
 ======]   [======
 =======]A[=======
 ======] M [======
 =====]     [=====
 ====]   C   [====
 =====]  R  [=====
 ======] A [======
 =======]Z[=======
 ======] E [======
 =====]  ,  [=====
 ====]       [====
 =====]  A  [=====
 ======] L [======
 =======]L[=======
 ======]   [======
 =====]  H  [=====
 ====]   A   [====
 =====]  I  [=====
 ======] L [======
 =======] [=======
 ======] C [======
 =====]  R  [=====
 ====]   A   [====
 =====]  Z  [=====
 ======] E [======
 =======]![=======

'''craze:''' OMG YEAH, its still here!!!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2385</id>
      <timestamp>2005-09-12T04:25:18Z</timestamp>
      <contributor>
        <ip>C-24-17-100-242.hsd1.wa.comcast.net</ip>
      </contributor>
      <comment>stuff</comment>
      <text xml:space="preserve">I am craze. I AM STILL ALIVE exept...

i forgot my password, i changed IPS's so i now have a different email so now i cant ever login again because nobody will believe its me heh...

I am a map maker for UnWheel mod 2004

I am trying to script some stuff and write a bug fix exept ued never saves myt code so 6 hours of work are now gone :/

[[Image:Legacy_thislevelwithlotsofammo-2.jpeg|center|one of my grand but odd levels. very large.]]

As you can see it's sorta odd. :)

[[Image:Legacy_uglyskaarj.jpeg|]]

The pug fugly skaarj that I made.

----

Please fix this:

&lt;uscript&gt;
//will put code here when I need to.
&lt;/uscript&gt;

----
 =====]  H  [=====
 ======] E [======
 =======]L[=======
 ======] L [======
 =====]  O  [=====
 ====]       [====
 =====]  I  [=====
 ======]   [======
 =======]A[=======
 ======] M [======
 =====]     [=====
 ====]   C   [====
 =====]  R  [=====
 ======] A [======
 =======]Z[=======
 ======] E [======
 =====]  ,  [=====
 ====]       [====
 =====]  A  [=====
 ======] L [======
 =======]L[=======
 ======]   [======
 =====]  H  [=====
 ====]   A   [====
 =====]  I  [=====
 ======] L [======
 =======] [=======
 ======] C [======
 =====]  R  [=====
 ====]   A   [====
 =====]  Z  [=====
 ======] E [======
 =======]![=======

CRAZE: OMG YEAH, its still here!!!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2386</id>
      <timestamp>2005-11-04T01:01:40Z</timestamp>
      <contributor>
        <ip>C-67-183-215-11.hsd1.wa.comcast.net</ip>
      </contributor>
      <comment>updated</comment>
      <text xml:space="preserve">I am craze. I AM STILL ALIVE exept...

i forgot my password, i changed IPS's so i now have a different email so now i cant ever login again because nobody will believe its me heh...

I am a map maker for UnWheel mod 2004(W0000t, im banned now :P )

I am trying to script some stuff and write a bug fix exept ued never saves myt code so 6 hours of work are now gone :/

still alive... 

working on a nice big UT project with some other people :)

search has died! and now its been fixed, yeay.

[[Image:Legacy_thislevelwithlotsofammo-2.jpeg|center|one of my grand but odd levels. very large.]]

As you can see it's sorta odd. :)

[[Image:Legacy_uglyskaarj.jpeg|]]

The pug fugly skaarj that I made.

----

Please fix this:

&lt;uscript&gt;
//will put code here when I need to.
&lt;/uscript&gt;

----
 =====]  H  [=====
 ======] E [======
 =======]L[=======
 ======] L [======
 =====]  O  [=====
 ====]       [====
 =====]  I  [=====
 ======]   [======
 =======]A[=======
 ======] M [======
 =====]     [=====
 ====]   C   [====
 =====]  R  [=====
 ======] A [======
 =======]Z[=======
 ======] E [======
 =====]  ,  [=====
 ====]       [====
 =====]  A  [=====
 ======] L [======
 =======]L[=======
 ======]   [======
 =====]  H  [=====
 ====]   A   [====
 =====]  I  [=====
 ======] L [======
 =======] [=======
 ======] C [======
 =====]  R  [=====
 ====]   A   [====
 =====]  Z  [=====
 ======] E [======
 =======]![=======

'''craze:''' OMG YEAH, its still here!!!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Jump Pad</title>
    <id>689</id>
    <revision>
      <id>2008</id>
      <timestamp>2006-06-06T07:40:00Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>fixed couple of typos</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumppad|UTJumppad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2009</id>
      <timestamp>2006-04-30T19:02:46Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumppad|UTJumppad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SprimteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SprimteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2010</id>
      <timestamp>2006-06-05T17:33:31Z</timestamp>
      <contributor>
        <ip>C-0a4ae455.012-279-73746f34.cust.bredbandsbolaget.se</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumppad|UTJumppad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SprimteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SprimteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34432</id>
      <timestamp>2009-05-23T01:38:13Z</timestamp>
      <contributor>
        <ip>194.160.76.5</ip>
      </contributor>
      <comment>/* Adding the Jump Pad Effect */</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

makes it optimal tobe the case in theoptimal sampling
&lt;a href=http://constrainedtrading.com/48-a-curious-consequence&gt;curious consequence&lt;/a&gt;sample as often ashad been correctlymajor argument in
[url=http://constrainedtrading.com/50-randomly-spaced-sampling-intervals]sampling intervals[/url]presence of themodels with highthe truethe answer to the

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34433</id>
      <timestamp>2009-05-23T04:55:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/194.160.76.5|194.160.76.5]] ([[User talk:194.160.76.5|Talk]]) to last version by [[User:EntropicLqd|EntropicLqd]]</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumppad|UTJumppad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34503</id>
      <timestamp>2009-06-18T10:04:26Z</timestamp>
      <contributor>
        <username>Seditious</username>
        <id>1838</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumppad|UTJumppad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

'''Seditious:''' If I understand correctly what you want, you need to adjust the Velocity -&gt; StartVelocityRange and Acceleration -&gt; Acceleration. Make the StartVelocityRange X and Y values point toward your JumpDest and the particles will fly off in that direction immediately; use X and Y in Acceleration instead to make them start slowly and speed up move away from the JumpPad until they die. Use more or less Z to suit your need and adjust the Fading and LifeTimeRange to make it go further. Use combinations of all the above to create parabolic curves, even ones that match and follow the whole jump arc if you're that much a perfectionist ;)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42500</id>
      <timestamp>2010-01-25T12:40:16Z</timestamp>
      <contributor>
        <username>Crusha</username>
        <id>1913</id>
      </contributor>
      <minor/>
      <comment>/* You will need */</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumpPad|UTJumpPad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all it's glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

'''Seditious:''' If I understand correctly what you want, you need to adjust the Velocity -&gt; StartVelocityRange and Acceleration -&gt; Acceleration. Make the StartVelocityRange X and Y values point toward your JumpDest and the particles will fly off in that direction immediately; use X and Y in Acceleration instead to make them start slowly and speed up move away from the JumpPad until they die. Use more or less Z to suit your need and adjust the Fading and LifeTimeRange to make it go further. Use combinations of all the above to create parabolic curves, even ones that match and follow the whole jump arc if you're that much a perfectionist ;)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44479</id>
      <timestamp>2011-06-08T03:55:36Z</timestamp>
      <contributor>
        <ip>67.161.120.9</ip>
      </contributor>
      <comment>/* Job Done */</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumpPad|UTJumpPad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up it's properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all its glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

'''Seditious:''' If I understand correctly what you want, you need to adjust the Velocity -&gt; StartVelocityRange and Acceleration -&gt; Acceleration. Make the StartVelocityRange X and Y values point toward your JumpDest and the particles will fly off in that direction immediately; use X and Y in Acceleration instead to make them start slowly and speed up move away from the JumpPad until they die. Use more or less Z to suit your need and adjust the Fading and LifeTimeRange to make it go further. Use combinations of all the above to create parabolic curves, even ones that match and follow the whole jump arc if you're that much a perfectionist ;)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44480</id>
      <timestamp>2011-06-08T03:55:57Z</timestamp>
      <contributor>
        <ip>67.161.120.9</ip>
      </contributor>
      <comment>/* Add the jump's destination */</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumpPad|UTJumpPad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up its properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up it's properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all its glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

'''Seditious:''' If I understand correctly what you want, you need to adjust the Velocity -&gt; StartVelocityRange and Acceleration -&gt; Acceleration. Make the StartVelocityRange X and Y values point toward your JumpDest and the particles will fly off in that direction immediately; use X and Y in Acceleration instead to make them start slowly and speed up move away from the JumpPad until they die. Use more or less Z to suit your need and adjust the Fading and LifeTimeRange to make it go further. Use combinations of all the above to create parabolic curves, even ones that match and follow the whole jump arc if you're that much a perfectionist ;)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44481</id>
      <timestamp>2011-06-08T03:56:14Z</timestamp>
      <contributor>
        <ip>67.161.120.9</ip>
      </contributor>
      <comment>/* Add the jump */</comment>
      <text xml:space="preserve">Adding a Jump Pad in UT2004 is a little different from adding one in UT.  It will be covered here in two parts.  The first part will cover adding the jump pad to the map so that it works.  The second part covers the ''visual'' side of a jump pad.

==Adding the Jump Pad Effect==

The Jump Pad effect is literally the effect of bouncing the player up in the air to a specific spot.  In UT2004 this is accomplished by adding two Actors to the level.  A jump pad object to cause the player to ''bounce'' and a path node to act as the target for the player's ''bounce''.

===You will need===
# UTJumppad object ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpPad|JumpPad]] -&gt; [[Legacy:UTJumpPad|UTJumpPad]])
# A PathNode ([[Legacy:Actor|Actor]] -&gt; [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:PathNode|PathNode]])

===Add the jump's destination===

Add the PathNode object at the point you wish to land and open up its properties and make a note of the Object-&gt;Name property.

===Add the jump===

Add a UTJumppad object at the point you wish to cause the player to bounce from and open up its properties and do the following:

* Set the NavigationPoint-&gt;bPropagatesSound to True
* Set the NavigationPoint-&gt;ForcedPaths-&gt;[0] to the target PathNode's Object-&gt;Name property (the one you took note of above).
* Set the JumpPad-&gt;JumpSound and JumpPad-&gt;JumpZModifier to values that fit your map (good defaults are wm_sounds.wm_BootJump for the sound and 1 for the Z modifier).

==Adding the Jump Pad Visuals==

The most complex part about creating a jump pad is sorting out the visual side of it.  All jumps pads in UT2004 (I can't think of any exceptions off the top of my head) have some form of visual &quot;effect&quot; that indicates the jump pad is there.  Sometimes the ''effect'' will also indicate the direction the jump pad will take you.  ONS-Junkyard and DM-Plunge are two maps that spring readily to mind when thinking about the visual effects for a jump pad.

===You will need===
# A static mesh for the Jump-Pad (XGame_rc.AmmoChargerMesh is a typical default).
# An Emitter (Actor -&gt; Emitter) for the Jump-Pad glowy effect.

===Add the Mesh and Emitter===

This is the easiest step in the process of making your jump pad look great.

* [[Legacy:Add A Static Mesh|Add a static mesh]] to your map just below the point your UTJumppad object has been placed to provide the base of the jump pad.
* Add the Emitter object (see [[Legacy:Add An Actor|Add an Actor]]) between the jump-pad's static mesh and the UTJumppad object.  Before the Emitter will look nice it needs to be configured.

===Configuring the Emitter===

An Emitter itself doesn't really do very much.  Instead it contains a list of specific types of emitter (srpite, beam, etc).  Confusingly this list has been given the name of ''Emitter''.  It is these &quot;specific types&quot; of emitter that actually provide the Emitter placed on the map with its visual component. 

* Open up the Emitter's properties.
* Open the Emitter node followed by the Emitters node and press the &quot;Add&quot; button.
* Click on the &quot;BeamEmitter&quot; line that will appear and use the drop-list to select &quot;SpriteEmitter&quot;
* Then click on the &quot;New&quot; button.  This will create a new SpriteEmitter called myLevel.SpriteEmitter0

Repeat the last three steps above so that you have 2 [[Legacy:SpriteEmitter|SpriteEmitter]]s in your list.

====Configure SpriteEmitter0====

Open up the properties of SpriteEmitter0 and set the following:

  Acceleration -&gt; Z=50
  Color -&gt; UserColorScale = True
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[0] -&gt; Color (G=162,R=185,A=255)
  Color -&gt; ColorScale -&gt; Add button
  Color -&gt; ColorScale[1] -&gt; Color (B=92,G=44,R=69,A=50)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.8
  Fading -&gt; FadeInEndTime=0.1
  General -&gt; MaxParticles=5
  Size -&gt; StartSizeRange=(X=(Min=35,Max=35),Y=(Min=30,Max=30),Z=(Min=40,Max=40))
  Sprite -&gt; UseDirectionAs=PTDU_Normal
  Texture -&gt; Texture=EpicParticles.JumpPad.GridPlate
  Time -&gt; LifetimeRange=(Min=1.4,Max=1.4)
  Warmup -&gt; WarmupTicksPerSecond=2
  Warmup -&gt; RelativeWarmupTime=2

====Configure SpriteEmitter1====

Open up the properties of SpriteEmitter1 and set the following:

  Aceleration -&gt; Z=80
  Color -&gt; UseColorScale=True
  Color -&gt; ColorScale[0] -&gt; Color (B=27,G=95,R=124)
  Color -&gt; ColorScale[1] -&gt; Color (B=82,G=123,R=169)
  Color -&gt; ColorScale[1] -&gt; RelativeTime=1
  Fading -&gt; FadeOut=True
  Fading -&gt; FadeIn=True
  Fading -&gt; FadeOutStartTime=0.75
  Fading -&gt; FadeInEndTime=0.2
  General -&gt; MaxParticles=100
  Location -&gt; StartLocationRange=(X=(Min=-30,Max=30),Y=(Min=-24,Max=24),Z=(Min=0,Max=0) )
  Rotation -&gt; StartSpinRange=( X=(Min=-0.25,Max=-0.25),Y=(Min=0,Max=0),Z=(Min=0,Max=0) )
  Size -&gt; StartSizeRange=( X=(Min=6,Max=6),Y=(Min=4,Max=4),Z=(Min=100,Max=100) )
  Sprite -&gt; UseDirectionAs=PTDU_Right
  Texture -&gt; Texture=EpicParticles.Beams.WhiteStreak01aw
  Time -&gt; LifetimeRange=(Min=1.25,Max=1.5)
  Veolocity -&gt; StartVelocityRange=(X=(Min=0,Max=0),Y=(Min=0,Max=0),Z=(Min=0,Max=20))
  Warmup -&gt; WarmupTicksPerSecond=2.000000
  Warmup -&gt; RelativeWarmupTime=2.000000

==Job Done==

You should now be in a position to rebuild your level and view your jump pad in all its glory.  If you are still working on pathing the level you will get some errors about the lack of paths from the jump pad's destination path node.  These can be safely ignored unless you are actually Bot-Pathing your level.

===Gotchas===

If you have mutliple Jump Pads within your level you might think that you can reference the same Sprite Emitter in the Emitter list of multiple jump-pads.  If you do this you will notice all sorts of visual anomolies with the jump-pad visuals.

When a jump pad is duplicated, copies of its SpriteEmitters are made and added automatically to the new jump pad rather than simply having it reference the existing ones - therefore this problem will not arise unless the values are deliberately changed back after copying.

==Discussion==

'''SuperApe:''' I have run into problems editing the JumpZModifier property lately.  It used to be a no brainer: edit the Z, RebuildChangedPaths, see the change.  Some Jumppads in new maps I've seen refuse to have any ZMod except (what looks like) 1.0.  Some older maps, like AS-Junkyard allow it to change properly.  It's bizzare.  In the code for the Jumppad, there is a curious PostBeginPlay check for ''if (JumpVelocity != JumpVelocity)'', but whether that condition is met or not, it essentially Resets that property by ''JumpVelocity = BACKUP_JumpVelocity''.  This Actor seems to be behaving strangely compared to when I worked on the [[Legacy:TriggerJumpPad|TriggerJumpPad]].  Anyone else see wierd things with the UTJumpPad and are there any ways to fix or force it?  I tried something like this to force the original vector:

&lt;uscript&gt;
//=============================================================================
// SuperUTJumpPad.
// An attempt to fix a bug that constantly resets the JumpVelocity vector.
// by SuperApe -- July 2005
//=============================================================================
class SuperUTJumpPad extends UTJumppad 
	placeable;

var	vector	VelocityVector;

simulated function PostBeginPlay()
{
	VelocityVector = JumpVelocity;

	Super.PostBeginPlay();

	if ( JumpVector.Z = BACKUP_JumpVelocity.Z )
		JumpVelocity = VelocityVector;
}
&lt;/uscript&gt;

Anyone else have thoughts on this?

'''Blip2:''' Quite possible they changed the code (in one of the patches) and obviously not found the problem as they dont rebuild maps like junky 

'''Lobo:''' Changed &quot;Revolution&quot; to &quot;Rotation&quot; for SpriteEmitter1 up there.

'''Janzak:''' I can't seem to figure out how to angle the emitter for a more horizontal jump? The jump works but the emitter is still pointing upward

'''Seditious:''' If I understand correctly what you want, you need to adjust the Velocity -&gt; StartVelocityRange and Acceleration -&gt; Acceleration. Make the StartVelocityRange X and Y values point toward your JumpDest and the particles will fly off in that direction immediately; use X and Y in Acceleration instead to make them start slowly and speed up move away from the JumpPad until they die. Use more or less Z to suit your need and adjust the Fading and LifeTimeRange to make it go further. Use combinations of all the above to create parabolic curves, even ones that match and follow the whole jump arc if you're that much a perfectionist ;)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Material</title>
    <id>865</id>
    <revision>
      <id>2408</id>
      <timestamp>2004-05-27T10:06:43Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

''under construction... plese help''

# open the [[Legacy:Texture Browser|Texture Browser]]
# Do File -&gt; New
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Mover</title>
    <id>725</id>
    <revision>
      <id>2091</id>
      <timestamp>2005-12-29T02:07:10Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Introduction ==

A mover in UT2003 and later is simply a [[Legacy:Static Mesh|static mesh]] that changes its position and orientation. 

See [[Legacy:Create A Mover (UT)|Create A Mover (UT)]] for how to create a mover in Unreal Tournament.

==Adding the Mover==
* [[Legacy:Create A Static Mesh|Create a static mesh]] that has your new mover's desired shape, or find an existing one that suits your needs
* Select it in the [[Legacy:Static Mesh Browser|static mesh browser]].
* Click the ''Add Mover Brush'' button in the UnrealEd [[Legacy:Toolbox|toolbox]].

==Tweak Properties==

You may want to [[Legacy:Set The Following Properties|set the following properties]] of the Mover:
* Set Display -&gt; ''bStaticLighting'' to ''True'' &amp;ndash;  otherwise your mover will not be lit.
* Set Collision -&gt; ''bBlockKarma'' to ''True'' if the mover is in a position that dead players could interact with it.

Your mover is now placed in your map. But it's not going to do anything yet. There are two more things to do: tell your mover how to move (in which direction and orientation), and set up some way of telling it when to move (trigger, touch, etc).

===Setting Up Keyframes===

So you have your mover looking the way you want it, and you have a [[Legacy:Static Mesh|static mesh]] of your mover's likeness.  Now what?  Well you need to animate it.  So go on to the [[Legacy:Keyframe|Keyframe]] page and find out how to put a little life into your mover.

===Activating the Mover===

A Mover doesn't do much good just sitting there. You need something to activate it in order for it to do its job at the appropriate time. See [[Legacy:Activating A Mover|Activating A Mover]] for details.

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mover|Mover]]
* [[Legacy:ClientMover|ClientMover]] &amp;ndash; For decoration (non-interactive) only

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2092</id>
      <timestamp>2004-11-06T09:52:46Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Introduction ==

A mover in UT2003 and later is simply a [[Legacy:Static Mesh|static mesh]] that changes its position and orientation. 

See [[Legacy:Create A Mover (UT)|Create A Mover (UT)]] for how to create a mover in Unreal Tournament.

==Adding the Mover==

* [[Legacy:Create A Static Mesh|Create a static mesh]] that has your new mover's desired shape, or find an existing one that suits your needs
* Select it in the [[Legacy:Static Mesh Browser|static mesh browser]].
* Click the ''Add Mover Brush'' button in the UnrealEd [[Legacy:Toolbox|toolbox]].

==Tweak a couple things==

You may want to [[Legacy:Set The Following Properties|set the following properties]] of the Mover:

* Set Display -&gt; ''bStaticLighting'' to ''True'' &amp;ndash;  otherwise your mover will not be lit.
* Set Collision -&gt; ''bBlockKarma'' to ''True'' if the mover is in a position that dead players could interact with it.

==What next==

Your mover is now placed in your map. But it's not going to do anything yet. There are two more things to do: tell your mover how to move (in which direction and orientation), and set up some way of telling it when to move (trigger, touch, etc).

===Setting Up Keyframes===

So you have your mover looking the way you want it, and you have a [[Legacy:Static Mesh|static mesh]] of your mover's likeness.  Now what?  Well you need to animate it.  So go on to the [[Legacy:Keyframe|Keyframe]] page and find out how to put a little life into your mover.

===Activating the Mover===

A Mover doesn't do much good just sitting there. You need something to activate it in order for it to do its job at the appropriate time. See [[Legacy:Activating A Mover|Activating A Mover]] for details.

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Mover (UT)</title>
    <id>823</id>
    <revision>
      <id>2313</id>
      <timestamp>2005-12-29T02:04:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''The following applies to UT''.  For a UT200x version, see [[Legacy:Create A Mover|Create A Mover]].

==Introduction==

A mover is a brush that can change position during play.  They are used to make doors, elevators or any other feature in your map that is not static.  Movers aren't very hard to make and once you get the basics you can try different things to come up with very cool stuff.

Movers are not strictly part of the BSP, although they block players and projectiles in the same way as the BSP world. Movers can't be subtractive, although it's possible to have glass or masked textures in a mover.

(need to explain in n00b-ish terms that a mover is more an item of brush geom than actors, I saw a N00b post the other day saying why didn't intersecting an actor work to create a moving actor)

==Overview==

A single mover must be a single brush, so the [[Legacy:Red Builder Brush|red builder brush]] must be shaped exactly how the mover will look before it's used to add it. The procedure is:
# make the required shape out of ordinary brushes, like an ordinary piece of static geometry
# texture the template as required
# use this template to forge the red builder brush
# make a mover with the red bruilder brush

'''Note:''' if the mover shape can be made from a single brushbuilder operation, the templating operation can be skipped: just make the RBB into the required shape and add it as a mover. Making a template does allow for easy texturing though.

: ''irrelevant aside'' I've just used &quot;forge&quot; to describe making the RBB into a shape. This could be useful terminology to distinguish between &quot;make a cylinder (add a brush)&quot; and &quot;make a cylinder (the rbb only, we want to alter it)&quot;. Just a thought...  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

==Making a Template==
# Subtract a cube large enough to hold all of the future mover shape.&lt;br /&gt;This should ideally be away from the rest of the map in all axes, ie it shouldn't touch any other brushes in any 2D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].&lt;br /&gt;Alternatively, after subtracting the cube, select it and click the &quot;show only selected actors&quot; button in the [[Legacy:Toolbox|toolbox]] and rebuild.&lt;br /&gt;Either of these two techniques will avoid BSP cuts running through the cube.
# Create the shape of the mover within this box. Any combination of additive and subtractive brushes is fine. It's advisable to match the orientation that the mover's resting position will have in the map.
# Apply textures to the shape, and make sure they are aligned exactly as desired. It's possible to change them later, but a little fiddly.

''Notes''
* Sheets, including masks and windows, can be added to doors and other movers.
* Sliding glass doors, such as in CTF-Tritium, are ''Extra 1337''.

==Forging ==

If the template is a single brush, use [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polygons -&gt; To Brush.

Intersecting makes the [[Legacy:Red Builder Brush|red builder brush]] wrap itself around all solid matter that is within its current shape. See the section on intersecting brushes [[Legacy:Intersect|Intersect]] if you don't already know how to do this.

# the RBB needs to be 'clean', ie no rotations or scalings. To ensure this, either do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]or [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Reset -&gt; Reset All
# shape the RBB so it encloses all of the template. Remember, you can't use [[Legacy:Brush Scaling|Brush Scaling]] to do this &amp;ndash; only the settings in the [[Legacy:Brushbuilders|brushbuilders]] window.
# Intersect the RBB with geometry (menu command of the [[Legacy:Toolbox|toolbox]] button)

At this point, if you want to save the brush for possible re-use at a later time, export it. Select '''[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Export''', give it a name and select a directory to save it in.

You can delete the template and the room now, although it's advisable to keep it until your map is finished, in case you want to remake your mover.

----

It's essential that the RBB is used to add the mover, it doesn't have any [[Legacy:Brush Transformation|brush transformation]]s currently applied. The RBB remembers transformations such as scaling and rotation until they are cleared with one of the &quot;Reset&quot; commands in the [[Legacy:Brush Context  Menu|Brush Context  Menu]]. You can either reset it before intersecting, or apply transformations permanently in the next section...

''(next paragraph could be shunted &amp; merged into the Intersection page maybe)''

It's basically simple. The shape that you have created, if it complex (more than one combined or adjacent primitive) must be just one brush for the mover to operate as a single entity in your level. Surround the complex brushes that are to be your mover with the red builder brush, so that the red builder brush completely encloses all of the the shape (typically with space around it), but, not any other CSG (Constructive Solid Geometry). Then, select from the Brush menu: ''Brush -&gt; Intersect''. The shape will be transformed into the red builder brush. At this point, if you want to save the brush for possible re-use at a later time, export it. Select from the Brush menu: ''Brush -&gt; Export''. You then must give it a name and select a directory to save it in.

'''''NOTE : you must not rescale the RBB! Else the mover would be completely non-solid :( So to have it encompass all the shapes of the future mover you have to make it bigger &lt;u&gt;USING THE MENU BOX TO CHANGE ITS DIMENSIONs&lt;/u&gt; (Right click in the cube Brushbuilder to do this) '''''

==Adding the Mover==

Position the RBB where the mover should be when at rest. 

If there are any brush transformations applied to it, apply them permanently by doing [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]. You can check for these under the brush properties: Brush -&gt; MainScale, Brush -&gt; PostScale and Movement -&gt; Rotation.

(note: I need to check up on the finer points of this, as I know it's fine for a lift to be Yawed into place, as long as you don't want movement rotations)

[[Image:Legacy_Mover_butt.gif|left|Mover Button]]

To add the mover click on the mover button in the UnrealEd [[Legacy:Toolbox|toolbox]].  It's in the same bar as the Add/Subtract and looks like the thingy in the picture.

The mover will appear as a purple brush wireframe in all viewports.  You won't be able to see the textures like you would in a regular brush.  This is a not a bad thing.  This allows you to move it around and play with it when you're setting [[Legacy:Keyframe|keyframe]]s without having to constantly rebuild geometery.  

==Changing Textures==

What if I want to ''change me textures on the mover'' you ask?  Well too bad!! J/k:)  Simply do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Show Polys and tada your mover is now visible as a brush and you can retexture and touch up on it. Once you rebuild the geometry it will return to the purple outline.

Note: If you are just changing something like making a surface of the mover unlit, you can rebuild &lt;i&gt;just&lt;/i&gt; lighting, which will not return the brush to its purple outline.

* Careful using the [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Show Polys command. Known to cause UEd crashes if used improperly.

==Setting Up Keyframes==

So you have your mover looking the way you want it, and you have a [[Legacy:Red Builder Brush|red builder brush]] of your mover's likeness.  Now what?  Well you need to animate it.  So go on to the [[Legacy:Keyframe|Keyframe]] page and find out how to put a little life into your mover.

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[:Category:Legacy Basic Procedure]] 

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2314</id>
      <timestamp>2005-01-14T03:18:12Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">''The following applies to UT''

==Introduction ==

A mover is a brush that can change position during play.  They are used to make doors, elevators or any other feature in your map that is not static.  Movers aren't very hard to make and once you get the basics you can try different things to come up with very cool stuff.

Movers are not strictly part of the BSP, although they block players and projectiles in the same way as the BSP world. Movers can't be subtractive, although it's possible to have glass or masked textures in a mover.

(need to explain in n00b-ish terms that a mover is more an item of brush geom than actors, I saw a N00b post the other day saying why didn't intersecting an actor work to create a moving actor)

==Overview ==

A single mover must be a single brush, so the [[Legacy:Red Builder Brush|red builder brush]] must be shaped exactly how the mover will look before it's used to add it. The procedure is:
# make the required shape out of ordinary brushes, like an ordinary piece of static geometry
# texture the template as required
# use this template to forge the red builder brush
# make a mover with the red bruilder brush

'''Note:''' if the mover shape can be made from a single brushbuilder operation, the templating operation can be skipped: just make the RBB into the required shape and add it as a mover. Making a template does allow for easy texturing though.

: ''irrelevant aside'' I've just used &quot;forge&quot; to describe making the RBB into a shape. This could be useful terminology to distinguish between &quot;make a cylinder (add a brush)&quot; and &quot;make a cylinder (the rbb only, we want to alter it)&quot;. Just a thought...  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

==Making a Template ==
# Subtract a cube large enough to hold all of the future mover shape.&lt;br /&gt;This should ideally be away from the rest of the map in all axes, ie it shouldn't touch any other brushes in any 2D [[Legacy:UnrealEd Viewport|UnrealEd Viewport]].&lt;br /&gt;Alternatively, after subtracting the cube, select it and click the &quot;show only selected actors&quot; button in the [[Legacy:Toolbox|toolbox]] and rebuild.&lt;br /&gt;Either of these two techniques will avoid BSP cuts running through the cube.
# Create the shape of the mover within this box. Any combination of additive and subtractive brushes is fine. It's advisable to match the orientation that the mover's resting position will have in the map.
# Apply textures to the shape, and make sure they are aligned exactly as desired. It's possible to change them later, but a little fiddly.

''Notes''
* Sheets, including masks and windows, can be added to doors and other movers.
* Sliding glass doors, such as in CTF-Tritium, are ''Extra 1337''.

==Forging ==

If the template is a single brush, use [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polygons -&gt; To Brush.

Intersecting makes the [[Legacy:Red Builder Brush|red builder brush]] wrap itself around all solid matter that is within its current shape. See the section on intersecting brushes [[Legacy:Intersect|Intersect]] if you don't already know how to do this.

# the RBB needs to be 'clean', ie no rotations or scalings. To ensure this, either do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]or [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Reset -&gt; Reset All
# shape the RBB so it encloses all of the template. Remember, you can't use [[Legacy:Brush Scaling|Brush Scaling]] to do this &amp;ndash; only the settings in the [[Legacy:Brushbuilders|brushbuilders]] window.
# Intersect the RBB with geometry (menu command of the [[Legacy:Toolbox|toolbox]] button)

At this point, if you want to save the brush for possible re-use at a later time, export it. Select '''[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush -&gt; Export''', give it a name and select a directory to save it in.

You can delete the template and the room now, although it's advisable to keep it until your map is finished, in case you want to remake your mover.

----

It's essential that the RBB is used to add the mover, it doesn't have any [[Legacy:Brush Transformation|brush transformation]]s currently applied. The RBB remembers transformations such as scaling and rotation until they are cleared with one of the &quot;Reset&quot; commands in the [[Legacy:Brush Context  Menu|Brush Context  Menu]]. You can either reset it before intersecting, or apply transformations permanently in the next section...

&lt;i&gt;(next paragraph could be shunted &amp; merged into the Intersection page maybe)&lt;/i&gt;

It's basically simple. The shape that you have created, if it complex (more than one combined or adjacent primitive) must be just one brush for the mover to operate as a single entity in your level. Surround the complex brushes that are to be your mover with the red builder brush, so that the red builder brush completely encloses all of the the shape (typically with space around it), but, not any other CSG (Constructive Solid Geometry). Then, select from the Brush menu: ''Brush -&gt; Intersect''. The shape will be transformed into the red builder brush. At this point, if you want to save the brush for possible re-use at a later time, export it. Select from the Brush menu: ''Brush -&gt; Export''. You then must give it a name and select a directory to save it in.

'''''NOTE : you must not rescale the RBB! Else the mover would be completely non-solid :( So to have it encompass all the shapes of the future mover you have to make it bigger &lt;u&gt;USING THE MENU BOX TO CHANGE ITS DIMENSIONs&lt;/u&gt; (Right click in the cube Brushbuilder to do this) '''''

==Adding the Mover ==

Position the RBB where the mover should be when at rest. 

If there are any brush transformations applied to it, apply them permanently by doing [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Transform -&gt; [[Legacy:Transform Permanently|Transform Permanently]]. You can check for these under the brush properties: Brush -&gt; MainScale, Brush -&gt; PostScale and Movement -&gt; Rotation.

(note: I need to check up on the finer points of this, as I know it's fine for a lift to be Yawed into place, as long as you don't want movement rotations)

[[Image:Legacy_Mover_butt.gif|left|Mover Button]]

To add the mover click on the mover button in the UnrealEd [[Legacy:Toolbox|toolbox]].  It's in the same bar as the Add/Subtract and looks like the thingy in the picture.

The mover will appear as a purple brush wireframe in all viewports.  You won't be able to see the textures like you would in a regular brush.  This is a not a bad thing.  This allows you to move it around and play with it when you're setting [[Legacy:Keyframe|keyframe]]s without having to constantly rebuild geometery.  

==Changing textures ==

What if I want to ''change me textures on the mover'' you ask?  Well too bad!! J/k:)  Simply do [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Show Polys and tada your mover is now visible as a brush and you can retexture and touch up on it. Once you rebuild the geometry it will return to the purple outline.

Note: If you are just changing something like making a surface of the mover unlit, you can rebuild &lt;i&gt;just&lt;/i&gt; lighting, which will not return the brush to its purple outline.

* Careful using the [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Show Polys command. Known to cause UEd crashes if used improperly.

==Setting Up Keyframes ==

So you have your mover looking the way you want it, and you have a [[Legacy:Red Builder Brush|red builder brush]] of your mover's likeness.  Now what?  Well you need to animate it.  So go on to the [[Legacy:Keyframe|Keyframe]] page and find out how to put a little life into your mover.

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Room</title>
    <id>730</id>
    <revision>
      <id>2103</id>
      <timestamp>2005-02-01T00:19:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''This page is to be folded into [[Legacy:Subtract A Space|Subtract A Space]].'''

[[:Category:Legacy To Do]]

This page is intended for beginners and is meant to be in &lt;u&gt;plain english&lt;/u&gt; and adopts a learn by doing strategy. No time will be wasted explaining why you're doing anything or try to get you to understand abstract concepts like the Unreal world being like a lump of clay or something. This document is intended to represent the current build, and should be updated accordingly.

'''Tarquin:''' This page will be replaced by the [[Legacy:Mapping Lessons|Mapping Lessons]] sequence. I don't see what it does differently. If you don't like the conceptual explanations you can skip those sections: the idea is that conceptual stuff goes in 'Overview' and 'In more depth' sections. 

'''Musicalglass:''' The only difference is I have tried to make a simple beginner's tutorial which any child can understand. Even if all the rest of the site is in Wiki shorthand, I think at the very least the beginner's tutorial should be in straightforward language. Once they have grasped the basics, all the rest of the Wiki terminology makes a lot more sense. People think differently, you've said so yourself. Some people think in graphic terms, while others are more technical. I'm a more graphic thinker. When I try to read some of the technical pages here, they turn into a bunch of swimming text like a Matrix screen. Just tell me the basic stuff in basic language, then I'll be fine. A few all-in-one tutorials don't negate the need for basic procedure pages. I'm just trying to streamline the parts of the Wiki I found confusing when I was first trying to learn Unreal.

'''Tarquin:''' I see where you're going with this. But I really would like the Mapping Lessons sequence to work for ''everybody''. Perhaps you could mark the places that go Matrixy on you so we could try to improve them :)

----

==Where to go next ==

check out [[Legacy:Topics On Mapping|Topics on Mapping]] for a more in depth listing of tutorials.

or [[:Category:Legacy Tutorial]]

----

==Create a Room ==

First we will build a room, then view that room in the actual game. Simple!

Launch Unreal Editor. Close the default Textures window to get it out of the way.   or

If you've been playing around and need to start a fresh map, do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]]  -&gt; File -&gt; New 

===Add a Builder Brush ===

Down the left side is a bunch of buttons known as the [[Legacy:Toolbox|Toolbox]]. 

Left click on the Cube Builder button. (The first button that looks like a cube)

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

A red wireframe cube appears in your scene, this is known as the [[Legacy:Red Builder Brush|Red Builder Brush]]

Now this time right click the Cube Builder button. The CubeBuilder properties window opens.

[[Image:Legacy_interface-Ed3-CubeBuilder.png|]]

Where it says Height, left click one time on the number 256. It becomes highlighted.

Enter a new value of 512, then hit the Tab key.

The Width field becomes highlighted. Type 512, Tab, 1024, Tab.

Now click on the Build button. The Red Builder Brush changes size.

Close the CubeBuilder window.

You can see your new rectangular cube in 3 of the UnrealEd Viewports. Note in the top left corner of each viewport that they represent the Top, Front and Right orthogonal views.

===Navigating in the Viewports ===

In the Perspective window which should be black and say Dynamic Light at the moment, right drag your mouse around in the window. The view rotates around the camera's center.

Right drag left and right to rotate the camera around in a circle.

Right drag forward and back to rotate the camera up and down.

Position the camera so it is facing your cube.

Now left drag the mouse forward and back. The camera dollies in and out. Note that left dragging the mouse from side to side still rotates the camera around in a circle just as before, only somewhat slower.

Now hold both the left and right mouse buttons at the same time and move the mouse forward and back. The camera dollies straight up and down

Try to position yourself in the center of the cube.

For practice, navigate somewhere way outside the box and try to see how fast you can get centered in the exact middle to where you can rotate the camera around and see equally in all directions.

Navigating in the Orthogonal viewports is similar only you can't rotate. To move around, left click and drag around. To zoom in and out, hold both the left and right mouse buttons and move the mouse up and down. If you have a mouse with a wheel you can also use that to zoom.

===Subtract a Space ===

Click on the Subtract button. (Button #2) to [[Legacy:Subtract A Space|Subtract A Space]].

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

Your Builder Brush creates a hollow room with a default bubbly texture.

[[Image:Legacy_interface-Ed3-Subtract.png|]]

Now left click on one of the walls inside your room. Note how it becomes blue indicating that it is highlighted. Select another wall. The previous wall becomes deselected.

===Add a Light ===

Now rotate the camera up to look at the ceiling (right drag forward). Click on the ceiling once to select it.

Now hold the L key and right click. A light is added to your scene.

===Add a Player Start ===

Now rotate the camera down and right click on the floor. From the submenu select Add Player Start. A joystick icon appears indicating the default location your character will spawn into the Map.

===Build All===

Click on the Build All button to render your scene. (Button #6 in the Build category)

[[Image:Legacy_interface.toolbar.png|]]

===Play Map! ===

Click on the Play Map button (#8, looks like a joystick) and UnrealEd automatically loads and plays the map in UT2003. After you're done oohing and ahhing over your creation, hit Esc to exit and Quit Unreal, you should now be returned to your operating system. Return to Unreal Editor. (On Windows just click on the Unreal button in your Windows menu bar at the bottom of the screen.)

That's It! Welcome to the Unreal world! :-D

----

==Save your Map ==

OK let's save our map. Note how you didn't have to save before testing your map. Unreal automatically saves it as a temp file. Although it's certainly a good idea to save frequently. If you're used to saving your files in My Documents or wherever, forget about that for now. You may have noticed how Unreal didn't install in the Program Files folder like most applications, but rather on your root drive. On a PC, most likely C:\UT2003.

That is because all the maps and textures, etc. are stored in folders in the same folder as the application itself, and we shall do the same with our file.

Go to File / Save As and you should be taken by default to the Maps folder in the UT2003 directory.

===Save a Template (optional)===

Let's save our map as &quot;A Room Template&quot;. From now on whenever you want to do another tutorial and you need a basic room to start you can just open up your template file. To prevent from accidentally saving over your template, let's make it read only. Minimize Unreal and go to your Maps folder, (On Windoze that would be Desktop/ My Computer / C: Drive/ UT2003/ Maps) right click on &quot;A Room Template&quot; and under Properties, select the Read Only dialog.

----

==Next Lesson ==

[[Legacy:Learn The Tools|Learn the Tools]] - A must-read for any beginner. Covers several common misunderstandings.

----

==Where to go next ==

check out [[Legacy:Topics On Mapping|Topics on Mapping]] for a more in depth listing of tutorials.

or [[:Category:Legacy Tutorial]]

----

==Related Topics ==

[[Legacy:Mapping Lessons|Mapping Lessons]]: A sequence of basic procedure tutorials, a few of which are covered here, plus a few more.

[[Legacy:UnrealEd Interface|UnrealEd Interface]]:  A complete reference for UnrealEd's menus, windows and buttons.

[[Legacy:General Scale And Dimensions|General Scale And Dimensions]]:  Compares Unreal Unit dimensions to real world scale.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2104</id>
      <timestamp>2003-11-24T21:13:43Z</timestamp>
      <contributor>
        <ip>Musicalglass</ip>
      </contributor>
      <comment>*added a line about navigating orthogonal viewports and replied to Tarquin</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts. 

This page is intended for beginners and is meant to be in &lt;u&gt;plain english&lt;/u&gt; and adopts a learn by doing strategy. No time will be wasted explaining why you're doing anything or try to get you to understand abstract concepts like the Unreal world being like a lump of clay or something. This document is intended to represent the current build, and should be updated accordingly.

'''Tarquin:''' This page will be replaced by the [[Legacy:Mapping Lessons|Mapping Lessons]] sequence. I don't see what it does differently. If you don't like the conceptual explanations you can skip those sections: the idea is that conceptual stuff goes in 'Overview' and 'In more depth' sections. 

'''Musicalglass:''' The only difference is I have tried to make a simple beginner's tutorial which any child can understand. Even if all the rest of the site is in Wiki shorthand, I think at the very least the beginner's tutorial should be in straightforward language. Once they have grasped the basics, all the rest of the Wiki terminology makes a lot more sense. People think differently, you've said so yourself. Some people think in graphic terms, while others are more technical. I'm a more graphic thinker. When I try to read some of the technical pages here, they turn into a bunch of swimming text like a Matrix screen. Just tell me the basic stuff in basic language, then I'll be fine. A few all-in-one tutorials don't negate the need for basic procedure pages. I'm just trying to streamline the parts of the Wiki I found confusing when I was first trying to learn Unreal.

----

==Where to go next ==

check out [[Legacy:Topics On Mapping|Topics on Mapping]] for a more in depth listing of tutorials.

or [[:Category:Legacy Tutorial]]

----

==Create a Room ==

First we will build a room, then view that room in the actual game. Simple!

Launch Unreal Editor. Close the default Textures window to get it out of the way.   or

If you've been playing around and need to start a fresh map, do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]]  -&gt; File -&gt; New 

===Add a Builder Brush ===

Down the left side is a bunch of buttons known as the [[Legacy:Toolbox|Toolbox]]. 

Left click on the Cube Builder button. (The first button that looks like a cube)

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

A red wireframe cube appears in your scene, this is known as the [[Legacy:Red Builder Brush|Red Builder Brush]]

Now this time right click the Cube Builder button. The CubeBuilder properties window opens.

[[Image:Legacy_interface-Ed3-CubeBuilder.png|]]

Where it says Height, left click one time on the number 256. It becomes highlighted.

Enter a new value of 512, then hit the Tab key.

The Width field becomes highlighted. Type 512, Tab, 1024, Tab.

Now click on the Build button. The Red Builder Brush changes size.

Close the CubeBuilder window.

You can see your new rectangular cube in 3 of the UnrealEd Viewports. Note in the top left corner of each viewport that they represent the Top, Front and Right orthogonal views.

===Navigating in the Viewports ===

In the Perspective window which should be black and say Dynamic Light at the moment, right drag your mouse around in the window. The view rotates around the camera's center.

Right drag left and right to rotate the camera around in a circle.

Right drag forward and back to rotate the camera up and down.

Position the camera so it is facing your cube.

Now left drag the mouse forward and back. The camera dollies in and out. Note that left dragging the mouse from side to side still rotates the camera around in a circle just as before, only somewhat slower.

Now hold both the left and right mouse buttons at the same time and move the mouse forward and back. The camera dollies straight up and down

Try to position yourself in the center of the cube.

For practice, navigate somewhere way outside the box and try to see how fast you can get centered in the exact middle to where you can rotate the camera around and see equally in all directions.

Navigating in the Orthogonal viewports is similar only you can't rotate. To move around, left click and drag around. To zoom in and out, hold both the left and right mouse buttons and move the mouse up and down. If you have a mouse with a wheel you can also use that to zoom.

===Subtract a Space ===

Click on the Subtract button. (Button #2) to [[Legacy:Subtract A Space|Subtract A Space]].

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

Your Builder Brush creates a hollow room with a default bubbly texture.

[[Image:Legacy_interface-Ed3-Subtract.png|]]

Now left click on one of the walls inside your room. Note how it becomes blue indicating that it is highlighted. Select another wall. The previous wall becomes deselected.

===Add a Light ===

Now rotate the camera up to look at the ceiling (right drag forward). Click on the ceiling once to select it.

Now hold the L key and right click. A light is added to your scene.

===Add a Player Start ===

Now rotate the camera down and right click on the floor. From the submenu select Add Player Start. A joystick icon appears indicating the default location your character will spawn into the Map.

===Build All===

Click on the Build All button to render your scene. (Button #6 in the Build category)

[[Image:Legacy_interface.toolbar.png|]]

===Play Map! ===

Click on the Play Map button (#8, looks like a joystick) and UnrealEd automatically loads and plays the map in UT2003. After you're done oohing and ahhing over your creation, hit Esc to exit and Quit Unreal, you should now be returned to your operating system. Return to Unreal Editor. (On Windows just click on the Unreal button in your Windows menu bar at the bottom of the screen.)

That's It! Welcome to the Unreal world! :-D

----

==Save your Map ==

OK let's save our map. Note how you didn't have to save before testing your map. Unreal automatically saves it as a temp file. Although it's certainly a good idea to save frequently. If you're used to saving your files in My Documents or wherever, forget about that for now. You may have noticed how Unreal didn't install in the Program Files folder like most applications, but rather on your root drive. On a PC, most likely C:\UT2003.

That is because all the maps and textures, etc. are stored in folders in the same folder as the application itself, and we shall do the same with our file.

Go to File / Save As and you should be taken by default to the Maps folder in the UT2003 directory.

===Save a Template (optional)===

Let's save our map as &quot;A Room Template&quot;. From now on whenever you want to do another tutorial and you need a basic room to start you can just open up your template file. To prevent from accidentally saving over your template, let's make it read only. Minimize Unreal and go to your Maps folder, (On Windoze that would be Desktop/ My Computer / C: Drive/ UT2003/ Maps) right click on &quot;A Room Template&quot; and under Properties, select the Read Only dialog.

----

==Next Lesson ==

[[Legacy:Learn The Tools|Learn the Tools]] - A must-read for any beginner. Covers several common misunderstandings.

----

==Where to go next ==

check out [[Legacy:Topics On Mapping|Topics on Mapping]] for a more in depth listing of tutorials.

or [[:Category:Legacy Tutorial]]

----

==Related Topics ==

[[Legacy:Mapping Lessons|Mapping Lessons]]: A sequence of basic procedure tutorials, a few of which are covered here, plus a few more.

[[Legacy:UnrealEd Interface|UnrealEd Interface]]:  A complete reference for UnrealEd's menus, windows and buttons.

[[Legacy:General Scale And Dimensions|General Scale And Dimensions]]:  Compares Unreal Unit dimensions to real world scale.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2105</id>
      <timestamp>2003-11-24T22:57:07Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Perhaps you could mark the places that go Matrixy on you so we could try to improve them</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts. 

This page is intended for beginners and is meant to be in &lt;u&gt;plain english&lt;/u&gt; and adopts a learn by doing strategy. No time will be wasted explaining why you're doing anything or try to get you to understand abstract concepts like the Unreal world being like a lump of clay or something. This document is intended to represent the current build, and should be updated accordingly.

'''Tarquin:''' This page will be replaced by the [[Legacy:Mapping Lessons|Mapping Lessons]] sequence. I don't see what it does differently. If you don't like the conceptual explanations you can skip those sections: the idea is that conceptual stuff goes in 'Overview' and 'In more depth' sections. 

'''Musicalglass:''' The only difference is I have tried to make a simple beginner's tutorial which any child can understand. Even if all the rest of the site is in Wiki shorthand, I think at the very least the beginner's tutorial should be in straightforward language. Once they have grasped the basics, all the rest of the Wiki terminology makes a lot more sense. People think differently, you've said so yourself. Some people think in graphic terms, while others are more technical. I'm a more graphic thinker. When I try to read some of the technical pages here, they turn into a bunch of swimming text like a Matrix screen. Just tell me the basic stuff in basic language, then I'll be fine. A few all-in-one tutorials don't negate the need for basic procedure pages. I'm just trying to streamline the parts of the Wiki I found confusing when I was first trying to learn Unreal.

'''Tarquin:''' I see where you're going with this. But I really would like the Mapping Lessons sequence to work for ''everybody''. Perhaps you could mark the places that go Matrixy on you so we could try to improve them :)

----

==Where to go next ==

check out [[Legacy:Topics On Mapping|Topics on Mapping]] for a more in depth listing of tutorials.

or [[:Category:Legacy Tutorial]]

----

==Create a Room ==

First we will build a room, then view that room in the actual game. Simple!

Launch Unreal Editor. Close the default Textures window to get it out of the way.   or

If you've been playing around and need to start a fresh map, do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]]  -&gt; File -&gt; New 

===Add a Builder Brush ===

Down the left side is a bunch of buttons known as the [[Legacy:Toolbox|Toolbox]]. 

Left click on the Cube Builder button. (The first button that looks like a cube)

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

A red wireframe cube appears in your scene, this is known as the [[Legacy:Red Builder Brush|Red Builder Brush]]

Now this time right click the Cube Builder button. The CubeBuilder properties window opens.

[[Image:Legacy_interface-Ed3-CubeBuilder.png|]]

Where it says Height, left click one time on the number 256. It becomes highlighted.

Enter a new value of 512, then hit the Tab key.

The Width field becomes highlighted. Type 512, Tab, 1024, Tab.

Now click on the Build button. The Red Builder Brush changes size.

Close the CubeBuilder window.

You can see your new rectangular cube in 3 of the UnrealEd Viewports. Note in the top left corner of each viewport that they represent the Top, Front and Right orthogonal views.

===Navigating in the Viewports ===

In the Perspective window which should be black and say Dynamic Light at the moment, right drag your mouse around in the window. The view rotates around the camera's center.

Right drag left and right to rotate the camera around in a circle.

Right drag forward and back to rotate the camera up and down.

Position the camera so it is facing your cube.

Now left drag the mouse forward and back. The camera dollies in and out. Note that left dragging the mouse from side to side still rotates the camera around in a circle just as before, only somewhat slower.

Now hold both the left and right mouse buttons at the same time and move the mouse forward and back. The camera dollies straight up and down

Try to position yourself in the center of the cube.

For practice, navigate somewhere way outside the box and try to see how fast you can get centered in the exact middle to where you can rotate the camera around and see equally in all directions.

Navigating in the Orthogonal viewports is similar only you can't rotate. To move around, left click and drag around. To zoom in and out, hold both the left and right mouse buttons and move the mouse up and down. If you have a mouse with a wheel you can also use that to zoom.

===Subtract a Space ===

Click on the Subtract button. (Button #2) to [[Legacy:Subtract A Space|Subtract A Space]].

[[Image:Legacy_interface.toolbox.BrushOperations.png|]]

Your Builder Brush creates a hollow room with a default bubbly texture.

[[Image:Legacy_interface-Ed3-Subtract.png|]]

Now left click on one of the walls inside your room. Note how it becomes blue indicating that it is highlighted. Select another wall. The previous wall becomes deselected.

===Add a Light ===

Now rotate the camera up to look at the ceiling (right drag forward). Click on the ceiling once to select it.

Now hold the L key and right click. A light is added to your scene.

===Add a Player Start ===

Now rotate the camera down and right click on the floor. From the submenu select Add Player Start. A joystick icon appears indicating the default location your character will spawn into the Map.

===Build All===

Click on the Build All button to render your scene. (Button #6 in the Build category)

[[Image:Legacy_interface.toolbar.png|]]

===Play Map! ===

Click on the Play Map button (#8, looks like a joystick) and UnrealEd automatically loads and plays the map in UT2003. After you're done oohing and ahhing over your creation, hit Esc to exit and Quit Unreal, you should now be returned to your operating system. Return to Unreal Editor. (On Windows just click on the Unreal button in your Windows menu bar at the bottom of the screen.)

That's It! Welcome to the Unreal world! :-D

----

==Save your Map ==

OK let's save our map. Note how you didn't have to save before testing your map. Unreal automatically saves it as a temp file. Although it's certainly a good idea to save frequently. If you're used to saving your files in My Documents or wherever, forget about that for now. You may have noticed how Unreal didn't install in the Program Files folder like most applications, but rather on your root drive. On a PC, most likely C:\UT2003.

That is because all the maps and textures, etc. are stored in folders in the same folder as the application itself, and we shall do the same with our file.

Go to File / Save As and you should be taken by default to the Maps folder in the UT2003 directory.

===Save a Template (optional)===

Let's save our map as &quot;A Room Template&quot;. From now on whenever you want to do another tutorial and you need a basic room to start you can just open up your template file. To prevent from accidentally saving over your template, let's make it read only. Minimize Unreal and go to your Maps folder, (On Windoze that would be Desktop/ My Computer / C: Drive/ UT2003/ Maps) right click on &quot;A Room Template&quot; and under Properties, select the Read Only dialog.

----

==Next Lesson ==

[[Legacy:Learn The Tools|Learn the Tools]] - A must-read for any beginner. Covers several common misunderstandings.

----

==Where to go next ==

check out [[Legacy:Topics On Mapping|Topics on Mapping]] for a more in depth listing of tutorials.

or [[:Category:Legacy Tutorial]]

----

==Related Topics ==

[[Legacy:Mapping Lessons|Mapping Lessons]]: A sequence of basic procedure tutorials, a few of which are covered here, plus a few more.

[[Legacy:UnrealEd Interface|UnrealEd Interface]]:  A complete reference for UnrealEd's menus, windows and buttons.

[[Legacy:General Scale And Dimensions|General Scale And Dimensions]]:  Compares Unreal Unit dimensions to real world scale.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Static Mesh</title>
    <id>822</id>
    <revision>
      <id>2311</id>
      <timestamp>2005-01-14T02:35:33Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

[[Legacy:Static Mesh|Static mesh]]es are 3D models that never change their shape (only their position, orientation and/or their size).

You need a static mesh to [[Legacy:Create A Mover|create a mover]] in UT2003.  Normally, static meshes would be created in a [[Legacy:Modeling Application|modeling application]] like [[Legacy:Maya|Maya]] or [[Legacy:3D Studio Max|3D Studio Max]], but for simple cases like a lift or door mover you can directly create them in UnrealEd.

==Creating a Static Mesh in UnrealEd==

# Create and texture the shape you want to convert to a [[Legacy:Static Mesh|static mesh]] somewhere in the world using ''addition'' [[Legacy:Brush|brush]]es (static meshes have nothing to do with CSG functions&amp;ndash;they are always &quot;additive&quot;.  Therefore, subtraction brushes do not convert properly).

# (optional &amp;ndash; but a good idea) Set the desired [[Legacy:Pivot|pivot]] point for the new [[Legacy:Static Mesh|static mesh]] by doing the following in an orthographic view:
#* Set the [[Legacy:Grid|grid]] to a size that will allow you accurately snap the pivot point to the desired location.  Generally, the larger the grid size, the better.
#* Select all brushes you want to convert.
#* Place the mouse-pointer as close to the desired pivot location as possible without touching the selected [[Legacy:Brush|brush]]es.
#* Right-click to get the [[Legacy:Actor Context Menu|Actor Context Menu]] and choose ''Pivot'' -&gt; ''Place Pivot Snapped Here'' (you may also use ''Place Pivot Here'', but as a rule of thumb, it's best to keep things snapped to the grid as much as possible)
#* Repeat in other views as necessary to define the desired location in 3D space.

# Select all brushes you want to convert (if they are not already selected).

# Then do '''one''' of the following:
#* Right-click on one of the selected [[Legacy:Brush|brush]]es to get the [[Legacy:Actor Context Menu|Actor Context Menu]] and choose ''Convert'' -&gt; ''To Static Mesh''
#* Click the ''Add Static Mesh'' button in the UnrealEd [[Legacy:Toolbox|toolbox]]
#* Select ''Edit'' -&gt; ''Create from Selection'' in the [[Legacy:Static Mesh Browser|static mesh browser]].

# Enter a package name (you can use [[Legacy:MyLevel|MyLevel]] to embed the static mesh in your map file), optionally a group name, and an arbitrary name for your static mesh.

After these steps your textured static mesh will show up in the [[Legacy:Static Mesh Browser|static mesh browser]] and you can, for instance, use it to [[Legacy:Create A Mover|create a mover]].

==Related Topics==

* [[Legacy:Static Mesh|Static Mesh]]
* [[Legacy:Mover|Mover]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2312</id>
      <timestamp>2005-01-13T23:24:05Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>34341</id>
      <timestamp>2009-04-14T13:37:25Z</timestamp>
      <contributor>
        <username>Lord Farin</username>
        <id>909</id>
      </contributor>
      <minor/>
      <comment>An addition which will take care of some problems I encountered during this tutorial</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Overview ==

[[Legacy:Static Mesh|Static mesh]]es are 3D models that never change their shape (only their position, orientation and/or their size).

You need a static mesh to [[Legacy:Create A Mover|create a mover]] in UT2003.  Normally, static meshes would be created in a [[Legacy:Modeling Application|modeling application]] like [[Legacy:Maya|Maya]] or [[Legacy:3D Studio Max|3D Studio Max]], but for simple cases like a lift or door mover you can directly create them in UnrealEd.

==Creating a Static Mesh in UnrealEd==

# Create and texture the shape you want to convert to a [[Legacy:Static Mesh|static mesh]] somewhere in the world using ''addition'' [[Legacy:Brush|brush]]es (static meshes have nothing to do with CSG functions&amp;ndash;they are always &quot;additive&quot;.  Therefore, subtraction brushes do not convert properly).

# (optional &amp;ndash; but a good idea) Set the desired [[Legacy:Pivot|pivot]] point for the new [[Legacy:Static Mesh|static mesh]] by doing the following in an orthographic view:
#* Set the [[Legacy:Grid|grid]] to a size that will allow you accurately snap the pivot point to the desired location.  Generally, the larger the grid size, the better.
#* Select all brushes you want to convert.
#* Place the mouse-pointer as close to the desired pivot location as possible without touching the selected [[Legacy:Brush|brush]]es.
#* Right-click to get the [[Legacy:Actor Context Menu|Actor Context Menu]] and choose ''Pivot'' -&gt; ''Place Pivot Snapped Here'' (you may also use ''Place Pivot Here'', but as a rule of thumb, it's best to keep things snapped to the grid as much as possible)
#* Repeat in other views as necessary to define the desired location in 3D space.

# Select all brushes you want to convert (if they are not already selected).

# Then do '''one''' of the following:
#* Right-click on one of the selected [[Legacy:Brush|brush]]es to get the [[Legacy:Actor Context Menu|Actor Context Menu]] and choose ''Convert'' -&gt; ''To Static Mesh''
#* Click the ''Add Static Mesh'' button in the UnrealEd [[Legacy:Toolbox|toolbox]]
#* Select ''Edit'' -&gt; ''Create from Selection'' in the [[Legacy:Static Mesh Browser|static mesh browser]].

# Enter a package name (you can use [[Legacy:MyLevel|MyLevel]] to embed the static mesh in your map file), optionally a group name, and an arbitrary name for your static mesh. '''!Caution! :''' If you use a different package name, you should proceed to the Static Mesh browser at once, and save the package you put your mesh in. Not following this step will cause your mesh to be unloadable, and therefore the level will not be playable!

After these steps your textured static mesh will show up in the [[Legacy:Static Mesh Browser|static mesh browser]] and you can, for instance, use it to [[Legacy:Create A Mover|create a mover]].

==Related Topics==

* [[Legacy:Static Mesh|Static Mesh]]
* [[Legacy:Mover|Mover]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create A Subclass</title>
    <id>758</id>
    <revision>
      <id>2168</id>
      <timestamp>2006-04-11T21:16:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] tutorial.

Link to this page from tutorials, mapping topics and code listings for custom classes, for example:

 &lt;nowiki&gt;[[Legacy:Create A Subclass|Create A Subclass]] of the ClassX, eg &quot;MyClass&quot; in [[Legacy:MyLevel|MyLevel]]&lt;/nowiki&gt;

==Overview==

Most programming in [[Legacy:UnrealScript|UnrealScript]] is done in a text editor or IDE, and a whole bunch of classes are then compiled with [[Legacy:Ucc|Ucc]]. 

However, it's possible to add a single new class to the hierarchy within [[Legacy:UnrealEd|UnrealEd]]. This method has limitations, but is suitable in certain circumstances. It's particularly useful for adding custom actors to a map, as the new class can be embedded in the [[Legacy:MyLevel|MyLevel]] package, just as any other resource.

For more on working with classes, see [[Legacy:OOP|OOP]] and [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].

==Instructions ==

===To create a new subclass in UnrealEd ===

[[Image:Legacy_unrealed-newclass.gif|center|]]

# Open the [[Legacy:Actor Classes|Actor Classes]] browser.
# Click on the class that will be the parent of your new class.
# Do [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]] -&gt; Class -&gt; New...
# In the dialog box that appears:
#* Enter a package name (use [[Legacy:MyLevel|MyLevel]] if you want to save the new class within the currently open map).
#* Enter a class name. If you're pasting in some ready-made code (from this site, for example), the name must be the same as the class name at the top of the script.
#* Press ''OK''.  The [[Legacy:Script Editor|Script Editor]] window opens, showing the class header of the new class.

Getting started with the new class:

# You can paste in text with &lt;code&gt;Ctrl+V&lt;/code&gt;. The pasted text is sometimes displayed as black on black, so if you can't see the result of pasting, double-click the class name in the left-hand pane of the editor &amp;ndash; that will update the text colours.
# The scripts on this site usually include a header, so you'll have the top four lines twice. Delete one set.
# If the code you are pasting has a [[Legacy:Default Properties|Default Properties]] block, you must remove the block completely. Keep the text you've removed for reference, you'll need it.
# Click ''Tools'' -&gt; ''Compile Changed'' to compile the class. If the compilation is successful (no errors detected in the code you entered), you'll get a &quot;Success&quot; message in the editor window's status line (you might have to move the window up a bit to see it). You can make changes and compile as often as you wish, even after an object of that class has been added to the map.
# If you removed a Default Properties block, you must set these in the editor:
## Select the new class in the Actor Browser, and do [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]] -&gt; Class -&gt; Default Properties.
## Make the changes in the properties window that correspond to the block of code you removed earlier.

To add an object of the new class to the map, select it in the class tree like you would any other class. For movers, right-click the ''Add Mover'' button in the [[Legacy:Toolbox|toolbox]].

Remember to either save your package, or add an object of the new class in your map if you are using the MyLevel pseudo-package.

===To create a new subclass in WOTgreal===

This howto assumes [[Legacy:WOTgreal|WOTgreal]] version 2.700, other versions might differ.

[[Image:Legacy_wotgreal-createsubclass.png|center|]]

# Select the class you want to subclass in the Class Browser (View menu -&gt; Classes).
# Go to Browser menu -&gt; Create Sub Class, or just click the Create Sub Class icon.
# In the dialog that appears, fill in the name of the package you want to add your class to and the name you want the subclass to have.
# When compiling for [[Legacy:UT2003|UT2003]], be sure to check 'Use &quot;Extends&quot; instead of &quot;Expands&quot; when creating subclass'. In UT2003, the &quot;expands&quot; keyword has been removed.
# Click Ok and WOTgreal will create a nice starting template for you. The .uc file will be created when you first safe this new class.

==Related Topics==
* [[Legacy:MyLevel|MyLevel]] &amp;ndash; More information on embedding resources in a map file
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Script Editor|Script Editor]]
* [[Legacy:Third-Party Components|Third-Party Components]] and [[Legacy:Open Source|Open Source]] &amp;ndash; Classes you can add to a map using this method
* [[Legacy:Mapping Hello World|Mapping Hello World]] &amp;ndash; A tutorial on using a custom script

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2169</id>
      <timestamp>2005-12-20T20:24:04Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] tutorial.

Link to this page from tutorials, mapping topics and code listings for custom classes, for example:

 &lt;nowiki&gt;[[Legacy:Create A Subclass|Create A Subclass]] of the ClassX, eg &quot;MyClass&quot; in [[Legacy:MyLevel|MyLevel]]&lt;/nowiki&gt;

==Overview==

Most programming in [[Legacy:UnrealScript|UnrealScript]] is done in a text editor or IDE, and a whole bunch of classes are then compiled with [[Legacy:Ucc|Ucc]]. 

However, it's possible to add a single new class to the hierarchy within [[Legacy:UnrealEd|UnrealEd]]. This method has limitations, but is suitable in certain circumstances. It's particularly useful for adding custom actors to a map, as the new class can be embedded in the [[Legacy:MyLevel|MyLevel]] package, just as any other resource.

For more on working with classes, see [[Legacy:OOP|OOP]] and [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].

==Instructions ==

===To create a new subclass in UnrealEd ===

[[Image:Legacy_unrealed-newclass.gif|center|]]

# Open the [[Legacy:Actor Classes|Actor Classes]] browser.
# Click on the class that will be the parent of your new class.
# Do [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]] -&gt; Class -&gt; New...
# In the dialog box that appears:
#* Enter a package name (use [[Legacy:MyLevel|MyLevel]] if you want to save the new class within the currently open map).
#* Enter a class name. If you're pasting in some ready-made code (from this site, for example), the name must be the same as the class name at the top of the script.
#* Press ''OK''.  The [[Legacy:Script Editor|Script Editor]] window opens, showing the class header of the new class.

Getting started with the new class:

# You can paste in text with &lt;code&gt;Ctrl+V&lt;/code&gt;. The pasted text is sometimes displayed as black on black, so if you can't see the result of pasting, double-click the class name in the left-hand pane of the editor &amp;ndash; that will update the text colours.
# The scripts on this site usually include a header, so you'll have the top four lines twice. Delete one set.
# Click ''Tools'' -&gt; ''Compile Changed'' to compile the class. If the compilation is successful (no errors detected in the code you entered), you'll get a &quot;Success&quot; message in the editor window's status line (you might have to move the window up a bit to see it). You can make changes and compile as often as you wish, even after an object of that class has been added to the map.

To add an object of the new class to the map, select it in the class tree like you would any other class. For movers, right-click the ''Add Mover'' button in the [[Legacy:Toolbox|toolbox]].

Remember to either save your package, or add an object of the new class in your map if you are using the MyLevel pseudo-package.

===To create a new subclass in WOTgreal===

This howto assumes [[Legacy:WOTgreal|WOTgreal]] version 2.700, other versions might differ.

[[Image:Legacy_wotgreal-createsubclass.png|center|]]

# Select the class you want to subclass in the Class Browser (View menu -&gt; Classes).
# Go to Browser menu -&gt; Create Sub Class, or just click the Create Sub Class icon.
# In the dialog that appears, fill in the name of the package you want to add your class to and the name you want the subclass to have.
# When compiling for [[Legacy:UT2003|UT2003]], be sure to check 'Use &quot;Extends&quot; instead of &quot;Expands&quot; when creating subclass'. In UT2003, the &quot;expands&quot; keyword has been removed.
# Click Ok and WOTgreal will create a nice starting template for you. The .uc file will be created when you first safe this new class.

==Related Topics==
* [[Legacy:MyLevel|MyLevel]] &amp;ndash; More information on embedding resources in a map file
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Script Editor|Script Editor]]
* [[Legacy:Third-Party Components|Third-Party Components]] and [[Legacy:Open Source|Open Source]] &amp;ndash; Classes you can add to a map using this method
* [[Legacy:Mapping Hello World|Mapping Hello World]] &amp;ndash; A tutorial on using a custom script

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2170</id>
      <timestamp>2006-04-11T21:07:48Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] tutorial.

Link to this page from tutorials, mapping topics and code listings for custom classes, for example:

 &lt;nowiki&gt;[[Legacy:Create A Subclass|Create A Subclass]] of the ClassX, eg &quot;MyClass&quot; in [[Legacy:MyLevel|MyLevel]]&lt;/nowiki&gt;

==Overview==

Most programming in [[Legacy:UnrealScript|UnrealScript]] is done in a text editor or IDE, and a whole bunch of classes are then compiled with [[Legacy:Ucc|Ucc]]. 

However, it's possible to add a single new class to the hierarchy within [[Legacy:UnrealEd|UnrealEd]]. This method has limitations, but is suitable in certain circumstances. It's particularly useful for adding custom actors to a map, as the new class can be embedded in the [[Legacy:MyLevel|MyLevel]] package, just as any other resource.

For more on working with classes, see [[Legacy:OOP|OOP]] and [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].

==Instructions ==

===To create a new subclass in UnrealEd ===

[[Image:Legacy_unrealed-newclass.gif|center|]]

# Open the [[Legacy:Actor Classes|Actor Classes]] browser.
# Click on the class that will be the parent of your new class.
# Do [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]] -&gt; Class -&gt; New...
# In the dialog box that appears:
#* Enter a package name (use [[Legacy:MyLevel|MyLevel]] if you want to save the new class within the currently open map).
#* Enter a class name. If you're pasting in some ready-made code (from this site, for example), the name must be the same as the class name at the top of the script.
#* Press ''OK''.  The [[Legacy:Script Editor|Script Editor]] window opens, showing the class header of the new class.

Getting started with the new class:

# You can paste in text with &lt;code&gt;Ctrl+V&lt;/code&gt;. The pasted text is sometimes displayed as black on black, so if you can't see the result of pasting, double-click the class name in the left-hand pane of the editor &amp;ndash; that will update the text colours.
# The scripts on this site usually include a header, so you'll have the top four lines twice. Delete one set.
# If the code you are pasting has a [[Legacy:Default Properties|Default Properties]] block, you must remove the block completely. Keep the text you've removed for reference, you'll need it.
# Click ''Tools'' -&gt; ''Compile Changed'' to compile the class. If the compilation is successful (no errors detected in the code you entered), you'll get a &quot;Success&quot; message in the editor window's status line (you might have to move the window up a bit to see it). You can make changes and compile as often as you wish, even after an object of that class has been added to the map.
# If you removed a Default Properties block, you must set these in the editor:
## Select the new class in the Actor Browser, and do [[Legacy:Actor Browser Menu|Actor Browser Menu]] -&gt; Class -&gt; Default Properties.
## Make the changes in the properties window that correspond to the block of code you removed earlier.

To add an object of the new class to the map, select it in the class tree like you would any other class. For movers, right-click the ''Add Mover'' button in the [[Legacy:Toolbox|toolbox]].

Remember to either save your package, or add an object of the new class in your map if you are using the MyLevel pseudo-package.

===To create a new subclass in WOTgreal===

This howto assumes [[Legacy:WOTgreal|WOTgreal]] version 2.700, other versions might differ.

[[Image:Legacy_wotgreal-createsubclass.png|center|]]

# Select the class you want to subclass in the Class Browser (View menu -&gt; Classes).
# Go to Browser menu -&gt; Create Sub Class, or just click the Create Sub Class icon.
# In the dialog that appears, fill in the name of the package you want to add your class to and the name you want the subclass to have.
# When compiling for [[Legacy:UT2003|UT2003]], be sure to check 'Use &quot;Extends&quot; instead of &quot;Expands&quot; when creating subclass'. In UT2003, the &quot;expands&quot; keyword has been removed.
# Click Ok and WOTgreal will create a nice starting template for you. The .uc file will be created when you first safe this new class.

==Related Topics==
* [[Legacy:MyLevel|MyLevel]] &amp;ndash; More information on embedding resources in a map file
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Script Editor|Script Editor]]
* [[Legacy:Third-Party Components|Third-Party Components]] and [[Legacy:Open Source|Open Source]] &amp;ndash; Classes you can add to a map using this method
* [[Legacy:Mapping Hello World|Mapping Hello World]] &amp;ndash; A tutorial on using a custom script

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Create An INT File</title>
    <id>873</id>
    <revision>
      <id>2423</id>
      <timestamp>2008-03-25T19:08:02Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

[[Legacy:Package|Package]]s you compile need an [[Legacy:INT File|INT file]]. This tells the game what classes are available for interrogation and/or public use within the corresponding package. So for MyPackage.U, you need a MyPackage.INT in the {[[Legacy:Base Directory|Base Directory]]}/System directory. 

All [[Legacy:INT File|INT file]]s are plain text so you can look at the others in the {[[Legacy:Base Directory|Base Directory]]}/System directory if you wish.  Just don't change any of them.

Use a [[Legacy:Text Editor|text editor]] to create the file (if you are using Notepad, make sure it does not save your file as &quot;MyPackage.INT.TXT&quot;). Make sure you don't indent any of the lines within the INT file.  The .int files are not parsed correctly by the Unreal Engine when lines are indented.

Another way to create an INT file in [[Legacy:UT2003|UT2003]] and newer is to use the [[Legacy:DumpIntCommandlet|DumpIntCommandlet]].

==For a mutator==

&lt;pre&gt;[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MyPackage.MyMutatorClass,Description=&quot;Hello World Example&quot;)&lt;/pre&gt;

The Description=... part won't be used in [[Legacy:UT2003|UT2003]], but it still helps identifying the mutator if you have more than only one of them in your package.

In Unreal Tournament the description is neccessary, though. It consists of the mutator'S displayed name and the description displayed in the status bar in the form &quot;Mutator Name,Status bar description.&quot;

==For a mutator with MOD Menu item ([[Legacy:UT|UT]])==

&lt;pre&gt;[Public]
Object=(Name=MyPackage.MyMutatorClass,Class=Class,MetaClass=Engine.Mutator,Description=&quot;My Mutator,My status message&quot;)
Object=(Name=MyPackage.MyMenuItemClass,Class=Class,MetaClass=UMenu.UMenuModMenuItem,Description=&quot;My MOD menu item,My status message&quot;)&lt;/pre&gt;

The Description=... part consists of two parts separated by a comma. The first part will be the name of the object (mutators, menu items show up with this name in the mutator or MOD menu respectively), while the second part is a hint text that will be shown in the status bar when the item is selected or the mouse hovers over it.

If you have several mutators or menu items in your package, you need to have a separate entry for each of those - otherwise those will not show up in the game.

Note that the MOD menu will not show up in the UT menu until there is at least one item in it.

==For default values ([[Legacy:UT|UT]])==

The default values MAY be overridden by defining new default values in the INT file for the relevant class and its variables (note that only class variables can be overridden with the INT file).

The syntax is similar as before.

&lt;pre&gt;[YourClass]
YourVariableInt=10                               // Integer value
YourVariableFloat=10.000000                      // Floating-point value
YourVariableBool=False                           // Boolean value
YourVariableString=This is the new default value // String value
&lt;/pre&gt;

You can use this feature for example to localize dialogs, messages, etc.

If the information above is not sufficient, check the localized variable syntax in [[Legacy:Variable_Syntax|Variable_Syntax]] and the example in [[Legacy:INT_File|INT_File]].

Also you need to remember that the extension of the INT file does matter. You can read about this in [[Legacy:Localization|Localization]].

==Related Topics==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:INT File|INT file]]

==Discussion==

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2424</id>
      <timestamp>2004-07-12T08:45:21Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Added simpler way to create an INT file. (dumpint)</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

[[Legacy:Package|Package]]s you compile need an [[Legacy:INT File|INT file]]. This tells the game what classes are available for interrogation and/or public use within the corresponding package. So for MyPackage.U, you need a MyPackage.INT in the {[[Legacy:Base Directory|Base Directory]]}/System directory. 

All [[Legacy:INT File|INT file]]s are plain text so you can look at the others in the {[[Legacy:Base Directory|Base Directory]]}/System directory if you wish.  Just don't change any of them.

Use a [[Legacy:Text Editor|text editor]] to create the file (if you are using Notepad, make sure it does not save your file as &quot;MyPackage.INT.TXT&quot;). Make sure you don't indent any of the lines within the INT file.  The .int files are not parsed correctly by the Unreal Engine when lines are indented.

Another way to create an INT file is to simply go to the command prompt, find the system dir of Unreal Tournament and type &quot; ucc dumpint (classnamehere).u (Without the brackets of course)  Be sure to add the .u extension as it is esential.  the Dumpint command will take all the (I believe) need stuff from your code and easily create an int of it.  You can then edit it as you wish.

==For a mutator==

&lt;pre&gt;[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MyPackage.MyMutatorClass,Description=&quot;Hello World Example&quot;)&lt;/pre&gt;

The Description=... part won't be used in [[Legacy:UT2003|UT2003]], but it still helps identifying the mutator if you have more than only one of them in your package.

In Unreal Tournament the description is neccessary, though. It consists of the mutator'S displayed name and the description displayed in the status bar in the form &quot;Mutator Name,Status bar description.&quot;

==For a mutator with MOD Menu item ([[Legacy:UT|UT]])==

&lt;pre&gt;[Public]
Object=(Name=MyPackage.MyMutatorClass,Class=Class,MetaClass=Engine.Mutator,Description=&quot;My Mutator,My status message&quot;)
Object=(Name=MyPackage.MyMenuItemClass,Class=Class,MetaClass=UMenu.UMenuModMenuItem,Description=&quot;My MOD menu item,My status message&quot;)&lt;/pre&gt;

The Description=... part consists of two parts separated by a comma. The first part will be the name of the object (mutators, menu items show up with this name in the mutator or MOD menu respectively), while the second part is a hint text that will be shown in the status bar when the item is selected or the mouse hovers over it.

If you have several mutators or menu items in your package, you need to have a separate entry for each of those - otherwise those will not show up in the game.

Note that the MOD menu will not show up in the UT menu until there is at least one item in it.

==For default values ([[Legacy:UT|UT]])==

The default values MAY be overridden by defining new default values in the INT file for the relevant class and its variables (note that only class variables can be overridden with the INT file).

The syntax is similar as before.

&lt;pre&gt;[YourClass]
YourVariableInt=10                               // Integer value
YourVariableFloat=10.000000                      // Floating-point value
YourVariableBool=False                           // Boolean value
YourVariableString=This is the new default value // String value
&lt;/pre&gt;

You can use this feature for example to localize dialogs, messages, etc.

If the information above is not sufficient, check the localized variable syntax in [[Legacy:Variable_Syntax|Variable_Syntax]] and the example in [[Legacy:INT_File|INT_File]].

Also you need to remember that the extension of the INT file does matter. You can read about this in [[Legacy:Localization|Localization]].

==Related Topics==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2425</id>
      <timestamp>2004-07-12T09:05:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

[[Legacy:Package|Package]]s you compile need an [[Legacy:INT File|INT file]]. This tells the game what classes are available for interrogation and/or public use within the corresponding package. So for MyPackage.U, you need a MyPackage.INT in the {[[Legacy:Base Directory|Base Directory]]}/System directory. 

All [[Legacy:INT File|INT file]]s are plain text so you can look at the others in the {[[Legacy:Base Directory|Base Directory]]}/System directory if you wish.  Just don't change any of them.

Use a [[Legacy:Text Editor|text editor]] to create the file (if you are using Notepad, make sure it does not save your file as &quot;MyPackage.INT.TXT&quot;). Make sure you don't indent any of the lines within the INT file.  The .int files are not parsed correctly by the Unreal Engine when lines are indented.

Another way to create an INT file in [[Legacy:UT2003|UT2003]] and newer is to use the [[Legacy:DumpIntCommandlet|DumpIntCommandlet]].

==For a mutator==

&lt;pre&gt;[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MyPackage.MyMutatorClass,Description=&quot;Hello World Example&quot;)&lt;/pre&gt;

The Description=... part won't be used in [[Legacy:UT2003|UT2003]], but it still helps identifying the mutator if you have more than only one of them in your package.

In Unreal Tournament the description is neccessary, though. It consists of the mutator'S displayed name and the description displayed in the status bar in the form &quot;Mutator Name,Status bar description.&quot;

==For a mutator with MOD Menu item ([[Legacy:UT|UT]])==

&lt;pre&gt;[Public]
Object=(Name=MyPackage.MyMutatorClass,Class=Class,MetaClass=Engine.Mutator,Description=&quot;My Mutator,My status message&quot;)
Object=(Name=MyPackage.MyMenuItemClass,Class=Class,MetaClass=UMenu.UMenuModMenuItem,Description=&quot;My MOD menu item,My status message&quot;)&lt;/pre&gt;

The Description=... part consists of two parts separated by a comma. The first part will be the name of the object (mutators, menu items show up with this name in the mutator or MOD menu respectively), while the second part is a hint text that will be shown in the status bar when the item is selected or the mouse hovers over it.

If you have several mutators or menu items in your package, you need to have a separate entry for each of those - otherwise those will not show up in the game.

Note that the MOD menu will not show up in the UT menu until there is at least one item in it.

==For default values ([[Legacy:UT|UT]])==

The default values MAY be overridden by defining new default values in the INT file for the relevant class and its variables (note that only class variables can be overridden with the INT file).

The syntax is similar as before.

&lt;pre&gt;[YourClass]
YourVariableInt=10                               // Integer value
YourVariableFloat=10.000000                      // Floating-point value
YourVariableBool=False                           // Boolean value
YourVariableString=This is the new default value // String value
&lt;/pre&gt;

You can use this feature for example to localize dialogs, messages, etc.

If the information above is not sufficient, check the localized variable syntax in [[Legacy:Variable_Syntax|Variable_Syntax]] and the example in [[Legacy:INT_File|INT_File]].

Also you need to remember that the extension of the INT file does matter. You can read about this in [[Legacy:Localization|Localization]].

==Related Topics==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A Defense Point In UT200x</title>
    <id>886</id>
    <revision>
      <id>2452</id>
      <timestamp>2006-07-30T05:20:26Z</timestamp>
      <contributor>
        <ip>CPE00142a3858fa-CM014270108706.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will outline how to set up a very basic Defense Point in a [[Legacy:UT2003|UT2003]] map.

==Overview==

Creating a defensive position for bots to defend in UT2003 is much more complicated than it was in UT. This is largely because of the fact that the system is much more powerful in UT2003 and allows for very complex defensive behavior like sniping a particular area, and I believe, although I haven't tested it out, setting up an area for a bot to patrol as opposed to a static position to hold. To create defensive points, you must first have a [[Legacy:GameObjective|GameObjective]] of some sort. For most gametypes, you will be using a subclass of GameObjective. Examples of standard GameObjectives are the [[Legacy:CTFBase|CTFBase]] for flags, and the [[Legacy:XBombDelivery|xBombDelivery]] and [[Legacy:XBombSpawn|xBombSpawn]] for the [[Legacy:XBombingRun|xBombingRun]] gametype.

==Basics==

Find the spot where you actually want the bot to defend, and  [[Legacy:Add An Actor|add an Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; [[Legacy:AIScript|AIScript]] &gt;&gt; [[Legacy:ScriptedSequence|ScriptedSequence]] &gt;&gt; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]. This actor, once set up, will act exactly like simply placing a [[Legacy:DefensePoint|DefensePoint]] actor did in [[Legacy:UT|UT]]. Leave the large &quot;AIScript&quot; icon at the same height off the ground that it is place, and position and orient it where you want the bot to stand and face, respectively.

Now locate your already placed GameObjective that the defense point will defend, and [[Legacy:Match These Tags|Match These Tags]]:
* The GameObjective's GameObjective -&gt; DefenseScriptTags
* The UnrealScriptedSequence's Events -&gt; Tag

It's a good idea to use a meaningful tag, for example RedFlagDefense or RedGoalDefense.

By default, an UnrealScriptedSequence makes a bot go to its location, and look in the direction specified by its rotation.  In most cases, this is all you need, and no changes to the default properties are needed (except for tagging the script properly to associate it with a GameObjective, such as a FlagBase).

At this point your defense points will work decently, but there are still several settings you should change to really get them working properly (and to really work at all if they're for CTF or BR, Domination points would probably work fine as-is).

==Team Games==

If you are making these defensive points for DOM game, or some other gametype where the GameObjective can change hands, go to your GameObjective actor, and [[Legacy:Set The Following Properties|Set The Following Properties]]: 

* GameObjective -&gt; bTeamControlled = True

For any team game at all where the GameObjective belongs to one team only, [[Legacy:Set The Following Properties|Set The Following Properties]]:

* GameObjective -&gt; DefenderTeamIndex = [[Legacy:Team Number|team number]] of the team that will defend the GameObjective (0 for red, 1 for blue)

==Optimizing Defense==

===Setting Priorities===

Setting different priorities in GameObjective -&gt; Priority will rank what percentage of bots assigned to defense will defend each GameObjective (the higher the number the more likely a bot will be assigned to it). Use this if you have some objectives that are more important than others.

If you want to have different priorties for different defensive positions, open up each individual UnrealScriptedSequence and expand the UnrealScriptedSequence tab in the [[Legacy:Actor Properties Window|actor properties window]].

You can now modify the Priority field in UnrealScriptedSequence -&gt; Priority (which works exactly like the priority field for the GameObjective, only now it will affect the bots who have already been chosen to defend the corresponding GameObjective). 

===Sniping Positions===

For a sniping post, set UnrealScriptedSequence -&gt; bSniping to &lt;tt&gt;True&lt;/tt&gt;. You should probably also specify the WeaponPreference to the [[Legacy:SniperRifle|SniperRifle]] (which is what the Lightning Gun is referred to as in [[Legacy:UnrealEd 3|UnrealEd 3]]) or in [[Legacy:UT2004|UT2004]] you can also use the [[Legacy:ClassicSniperRifle|ClassicSniperRifle]] (which is the real Sniper Rifle in UT2004).  Remember to use only weapons that are actually available in the map.

Finally, make a &quot;SnipingVolumeTag&quot; with a corresponding Sniping Volume having its tag set to the same name.  The volume is the area to snipe '''to''', not from.  The UnrealScriptedSequence's AIMarker (not placeable) is the sniping '''from''' point.

==Notes:==

There was a bug that prevented you from using more than three sequences per gameobjective in UT2003. This bug has been fixed in UT2004 so you can now use as many UnrealScriptedSequences as you desire. :)

Also it is good practice if you are using them on a large outdoor level to put a roadpathnode directly beside these actors because these actors will not reach far enough to connect to a distant node while a roadpathnode would.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Hub for bot support
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
* [[Legacy:AIScript|AIScript]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Discussion==

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2453</id>
      <timestamp>2005-11-16T21:08:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will outline how to set up a very basic Defense Point in a [[Legacy:UT2003|UT2003]] map.

==Overview==

Creating a defensive position for bots to defend in UT2003 is much more complicated than it was in UT. This is largely because of the fact that the system is much more powerful in UT2003 and allows for very complex defensive behavior like sniping a particular area, and I believe, although I haven't tested it out, setting up an area for a bot to patrol as opposed to a static position to hold. To create defensive points, you must first have a [[Legacy:GameObjective|GameObjective]] of some sort. For most gametypes, you will be using a subclass of GameObjective. Examples of standard GameObjectives are the [[Legacy:CTFBase|CTFBase]] for flags, and the [[Legacy:XBombDelivery|xBombDelivery]] and [[Legacy:XBombSpawn|xBombSpawn]] for the [[Legacy:XBombingRun|xBombingRun]] gametype.

==Basics==

Find the spot where you actually want the bot to defend, and  [[Legacy:Add An Actor|add an Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; [[Legacy:AIScript|AIScript]] &gt;&gt; [[Legacy:ScriptedSequence|ScriptedSequence]] &gt;&gt; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]. This actor, once set up, will act exactly like simply placing a [[Legacy:DefensePoint|DefensePoint]] actor did in [[Legacy:UT|UT]]. Leave the large &quot;AIScript&quot; icon at the same height off the ground that it is place, and position and orient it where you want the bot to stand and face, respectively.

Now locate your already placed GameObjective that the defense point will defend, and [[Legacy:Match These Tags|Match These Tags]]:
* The GameObjective's GameObjective -&gt; DefenseScriptTags
* The UnrealScriptedSequence's Events -&gt; Tag

It's a good idea to use a meaningful tag, for example RedFlagDefense or RedGoalDefense.

By default, an UnrealScriptedSequence makes a bot go to its location, and look in the direction specified by its rotation.  In most cases, this is all you need, and no changes to the default properties are needed (except for tagging the script properly to associate it with a GameObjective, such as a FlagBase).

At this point your defense points will work decently, but there are still several settings you should change to really get them working properly (and to really work at all if they're for CTF or BR, Domination points would probably work fine as-is).

==Team Games==

If you are making these defensive points for DOM game, or some other gametype where the GameObjective can change hands, go to your GameObjective actor, and [[Legacy:Set The Following Properties|Set The Following Properties]]: 

* GameObjective -&gt; bTeamControlled = True

For any team game at all where the GameObjective belongs to one team only, [[Legacy:Set The Following Properties|Set The Following Properties]]:

* GameObjective -&gt; DefenderTeamIndex = [[Legacy:Team Number|team number]] of the team that will defend the GameObjective (0 for red, 1 for blue)

==Optimizing Defense==

===Setting Priorities===

Setting different priorities in GameObjective -&gt; Priority will rank what percentage of bots assigned to defense will defend each GameObjective (the higher the number the more likely a bot will be assigned to it). Use this if you have some objectives that are more important than others.

If you want to have different priorties for different defensive positions, open up each individual UnrealScriptedSequence and expand the UnrealScriptedSequence tab in the [[Legacy:Actor Properties Window|actor properties window]].

You can now modify the Priority field in UnrealScriptedSequence -&gt; Priority (which works exactly like the priority field for the GameObjective, only now it will affect the bots who have already been chosen to defend the corresponding GameObjective). 

===Sniping Positions===

For a sniping post, set UnrealScriptedSequence -&gt; bSniping to &lt;tt&gt;True&lt;/tt&gt;. You should probably also specify the WeaponPreference to the [[Legacy:SniperRifle|SniperRifle]] (which is what the Lightning Gun is referred to as in [[Legacy:UnrealEd 3|UnrealEd 3]]) or in [[Legacy:UT2004|UT2004]] you can also use the [[Legacy:ClassicSniperRifle|ClassicSniperRifle]] (which is the real Sniper Rifle in UT2004).  Remember to use only weapons that are actually available in the map.

Finally, make a &quot;SnipingVolumeTag&quot; with a corresponding Sniping Volume having its tag set to the same name.  The volume is the area to snipe '''to''', not from.  The UnrealScriptedSequence's AIMarker (not placeable) is the sniping '''from''' point.

==Notes:==

There was a bug that prevented you from using more than three sequences per gameobjective in UT2003. This bug has been fixed in UT2004 so you can now use as many UnrealScriptedSequences as you desire. :)

==Related Topics==
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Hub for bot support
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
* [[Legacy:AIScript|AIScript]]
* [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Discussion==

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A Material</title>
    <id>909</id>
    <revision>
      <id>2500</id>
      <timestamp>2007-10-25T23:41:39Z</timestamp>
      <contributor>
        <ip>C-24-91-16-135.hsd1.ma.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Creating the material==

===Basic texture===

We have to create a new material to use as a surface. It will be a liquid, reflective, moving and translucent.

'''1.''' We'll steal and edit a moss texture.(don't worry. Although moss is not water, all will become clearin the end.) There is a good one in Antalus (''AWGlobal.utx''). 

You'll need to [[Legacy:Texture Import And Export|export]] this.

[[Image:Legacy_fluidsurfaces-4.jpeg|center|a moss texture]]

Because we don't want to cover the whole surface with it, we'll use an [[Legacy:Alpha Channel|alpha channel]]. In a [[Legacy:Graphics Application|Graphics Application]] like Paint Shop Pro or Photoshop, open your moss image and create a new mask (see screen shot in PSP).

[[Image:Legacy_fluidsurfaces-5.jpeg|center|the ''new mask'' button in PSP]]

An alpha channel is used to vary the transparency in an image. The image is opaque where the alpha channel is white. Draw some stuff on the alpha channel. You'll have to save your image in a format supporting alpha chanels (.TGA). It will be store inside the file. In PSP you have to use the ''Save in an alpha channel'' in the Mask menu.

[[Image:Legacy_fluidsurfaces-6.jpeg|center|the alpha channel sets the translucency of the image]]

If you want to use this moss texture for other purposes and don't need the alpha channel, hide it before saving.

'''2.''' [[Legacy:Import The Texture|Import the texture]]. Using [[Legacy:MyLevel|MyLevel]] in the package field will force the editor to save the textures inside the map file. Name the texture ''mossmask'' or something similar. You can put it in a group if you have a lot of  textures in the ''MyLevel'' package.

[[Image:Legacy_fluidsurfaces-7.jpeg|center|the texture]]

'''Note:''' when opening a level containing textures (or something else) in a ''MyLevel'' package, you may want to relaunch the editor before opening another map (yours ;)) otherwise it could mess up your ''MyLevel'' package.

'''3.''' If you're not sure of the scale of your texture, you can resize it by creating a new material: Chose ''File'' -&gt; ''New'' in the textures browser. Use ''MyLevel'' as package, choose an appropriate name like ''mossmaskscaller'' and '''[[Legacy:TexScaler|TexScaler]]''' in properies. Now hit '''New''' and the properties window should open. Here you can view, and edit the details of your material.

On the properties tree at the bottom, Click '''Material''' then choose your moss texture in the browser and click on the ''Use'' button in the material line. Adjust the scale of the texture with the '''UScale''' and '''VScale''' field and the position with '''UOffset''' and '''VOffset'''.

[[Image:Legacy_fluidsurfaces-8.jpeg|center|a texture scaler]]

===Animation===

Now we are able to animate the moss.

[[Legacy:Create A Material|Create a material]] of class '''TexOscillator'''. In the material field, put the previous texture (the scaler). Adjust the fields to your liking. UOscillationRate and OscillationRate determine how fast the texture moves. '''UOscillationAmplitude''' and '''UOscillationAmplitude''' determine how far it goes. Use small values for the amplitude and even smaller for the rate. Choose ''OT_Stretch'' for both '''UOscillationType''' and '''VOscillationType''' (the other ones are simple panning).

[[Image:Legacy_fluidsurfaces-9.jpeg|center|an oscillator]]

===Reflection===

The water surface will also reflect the world. But because it can't be done in real time, we'll use predefined [[Legacy:Environment Map|environment map]]s. With the texture browser open ''CubMaps.utx'', examine the several groups it contains. We'll create a material that blends the moss texture with a reflective texture.

Choose ''File'' -&gt; ''New'' one more time, set the package and name correctly and chose '''Combiner''' in the list. You will need to set 2 materials and 1 mask. In the first material field put the  moss oscillator. In the second, put one of the cube maps in ''CubeMaps.utx'' (only pick the textures bordered in blue). ''Cubemap'CubeMaps.Kretzig.Kretzigcube2' '' is a good one for what we need.

Choose ''CO_Alphablend_With_Mask'' in '''CombineOperation'''. The mask will determine how the 2 materials will mix. Because the moss texture has an alpha channel, we will use it. Depending on how You did the mask, you may have to use the '''InvertMask''' option.

[[Image:Legacy_fluidsurfaces-10.jpeg|center|a combiner]]

==Translucency==

We could use this material for the water surface but it would look strange. Mainly because it would be opaque ;) Therefor we are going to create another masked texture to make it translucent. And to make the things perfect, it will fit the shape of the water zone!

The zone I want want to fill with water is bordered by a terrain and I'll make the water more translucent toward its &quot;shores&quot;. I will use the height map of the terrain as to find the shores.

[[Image:Legacy_fluidsurfaces-12.jpeg|center|highlighting the shores with PSP]]

Create a new image, the same size as the terrain height map, use the shores map as an alpha channel and save it. Don't use white in your alpha channel as the water has to be a least a little translucent.

[[Image:Legacy_fluidsurfaces-11.jpeg|center|the terrain heightmap and the alpha channel]]

'''7.''' Back in UnrealEd, [[Legacy:Import The Texture|import the texture]] like you did with the moss texture. Now we have to make sure that the shores of this mask will fit with the shores of the terrain. In order to do that, create a ''TexScaler'' material for this texture (see above).

'''8.''' All we have to do now is to apply the mask to the other material. Choose ''File'' -&gt; ''New'' (for the last time ;)), set everything and choose '''Shader'''. A shader is a material containing useful informations. Use the combiner you created as the '''Diffuse''' layer and the ''TexScaler'' (created in the 7th step) as the '''Opacity''' layer. You can set '''TwoSided''' to ''True'' and the '''SurfaceType''' to ''EST_Water'' (although I'm not sure whether it's useful or not :p).

[[Image:Legacy_fluidsurfaces-13.jpeg|center|the final shader]]

[[Legacy:Category_Tutorial|Category_Tutorial]]

==Discussion==

'''Bob_The_Beheader:''' I think I've removed all the references to FluidSurfaces, but I could be wrong...

&quot;Guest&quot; This is very foggy information, i think u should upload previews screenshots.</text>
    </revision>
    <revision>
      <id>2501</id>
      <timestamp>2007-09-05T09:30:20Z</timestamp>
      <contributor>
        <ip>Scourgewarper</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Creating the material==

===Basic texture===

We have to create a new material to use as a surface. It will be a liquid, reflective, moving and translucent.

'''1.''' We'll steal and edit a moss texture.(don't worry. Although moss is not water, all will become clearin the end.) There is a good one in Antalus (''AWGlobal.utx''). 

You'll need to [[Legacy:Texture Import And Export|export]] this.

[[Image:Legacy_fluidsurfaces-4.jpeg|center|a moss texture]]

Because we don't want to cover the whole surface with it, we'll use an [[Legacy:Alpha Channel|alpha channel]]. In a [[Legacy:Graphics Application|Graphics Application]] like Paint Shop Pro or Photoshop, open your moss image and create a new mask (see screen shot in PSP).

[[Image:Legacy_fluidsurfaces-5.jpeg|center|the ''new mask'' button in PSP]]

An alpha channel is used to vary the transparency in an image. The image is opaque where the alpha channel is white. Draw some stuff on the alpha channel. You'll have to save your image in a format supporting alpha chanels (.TGA). It will be store inside the file. In PSP you have to use the ''Save in an alpha channel'' in the Mask menu.

[[Image:Legacy_fluidsurfaces-6.jpeg|center|the alpha channel sets the translucency of the image]]

If you want to use this moss texture for other purposes and don't need the alpha channel, hide it before saving.

'''2.''' [[Legacy:Import The Texture|Import the texture]]. Using [[Legacy:MyLevel|MyLevel]] in the package field will force the editor to save the textures inside the map file. Name the texture ''mossmask'' or something similar. You can put it in a group if you have a lot of  textures in the ''MyLevel'' package.

[[Image:Legacy_fluidsurfaces-7.jpeg|center|the texture]]

'''Note:''' when opening a level containing textures (or something else) in a ''MyLevel'' package, you may want to relaunch the editor before opening another map (yours ;)) otherwise it could mess up your ''MyLevel'' package.

'''3.''' If you're not sure of the scale of your texture, you can resize it by creating a new material: Chose ''File'' -&gt; ''New'' in the textures browser. Use ''MyLevel'' as package, choose an appropriate name like ''mossmaskscaller'' and '''[[Legacy:TexScaler|TexScaler]]''' in properies. Now hit '''New''' and the properties window should open. Here you can view, and edit the details of your material.

On the properties tree at the bottom, Click '''Material''' then choose your moss texture in the browser and click on the ''Use'' button in the material line. Adjust the scale of the texture with the '''UScale''' and '''VScale''' field and the position with '''UOffset''' and '''VOffset'''.

[[Image:Legacy_fluidsurfaces-8.jpeg|center|a texture scaler]]

===Animation===

Now we are able to animate the moss.

[[Legacy:Create A Material|Create a material]] of class '''TexOscillator'''. In the material field, put the previous texture (the scaler). Adjust the fields to your liking. UOscillationRate and OscillationRate determine how fast the texture moves. '''UOscillationAmplitude''' and '''UOscillationAmplitude''' determine how far it goes. Use small values for the amplitude and even smaller for the rate. Choose ''OT_Stretch'' for both '''UOscillationType''' and '''VOscillationType''' (the other ones are simple panning).

[[Image:Legacy_fluidsurfaces-9.jpeg|center|an oscillator]]

===Reflection===

The water surface will also reflect the world. But because it can't be done in real time, we'll use predefined [[Legacy:Environment Map|environment map]]s. With the texture browser open ''CubMaps.utx'', examine the several groups it contains. We'll create a material that blends the moss texture with a reflective texture.

Choose ''File'' -&gt; ''New'' one more time, set the package and name correctly and chose '''Combiner''' in the list. You will need to set 2 materials and 1 mask. In the first material field put the  moss oscillator. In the second, put one of the cube maps in ''CubeMaps.utx'' (only pick the textures bordered in blue). ''Cubemap'CubeMaps.Kretzig.Kretzigcube2' '' is a good one for what we need.

Choose ''CO_Alphablend_With_Mask'' in '''CombineOperation'''. The mask will determine how the 2 materials will mix. Because the moss texture has an alpha channel, we will use it. Depending on how You did the mask, you may have to use the '''InvertMask''' option.

[[Image:Legacy_fluidsurfaces-10.jpeg|center|a combiner]]

==Translucency==

We could use this material for the water surface but it would look strange. Mainly because it would be opaque ;) Therefor we are going to create another masked texture to make it translucent. And to make the things perfect, it will fit the shape of the water zone!

The zone I want want to fill with water is bordered by a terrain and I'll make the water more translucent toward its &quot;shores&quot;. I will use the height map of the terrain as to find the shores.

[[Image:Legacy_fluidsurfaces-12.jpeg|center|highlighting the shores with PSP]]

Create a new image, the same size as the terrain height map, use the shores map as an alpha channel and save it. Don't use white in your alpha channel as the water has to be a least a little translucent.

[[Image:Legacy_fluidsurfaces-11.jpeg|center|the terrain heightmap and the alpha channel]]

'''7.''' Back in UnrealEd, [[Legacy:Import The Texture|import the texture]] like you did with the moss texture. Now we have to make sure that the shores of this mask will fit with the shores of the terrain. In order to do that, create a ''TexScaler'' material for this texture (see above).

'''8.''' All we have to do now is to apply the mask to the other material. Choose ''File'' -&gt; ''New'' (for the last time ;)), set everything and choose '''Shader'''. A shader is a material containing useful informations. Use the combiner you created as the '''Diffuse''' layer and the ''TexScaler'' (created in the 7th step) as the '''Opacity''' layer. You can set '''TwoSided''' to ''True'' and the '''SurfaceType''' to ''EST_Water'' (although I'm not sure whether it's useful or not :p).

[[Image:Legacy_fluidsurfaces-13.jpeg|center|the final shader]]

[[Legacy:Category_Tutorial|Category_Tutorial]]

==Discussion==

'''Bob_The_Beheader:''' I think I've removed all the references to FluidSurfaces, but I could be wrong...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A New Weapontype</title>
    <id>820</id>
    <revision>
      <id>2306</id>
      <timestamp>2005-12-16T19:58:03Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">I just started with coding but I am missing some practical examples. So I put here what I found out so far together with the code.

I assume that you have installed the SDK files or exported the codefiles from UnrealEd. In that case you see various directories like &quot;XWeapons&quot; etc. in your unreal directory &amp;ndash; see [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] for instructions.

==Getting Started==

For learning Unreal, I started a new Package called &lt;code&gt;TestPak&lt;/code&gt;.

I created the &lt;code&gt;TestPak.int&lt;/code&gt; file in that folder which contains:
 [Public]
 Object=(Name=TestPak,Class=Class,MetaClass=Engine.Weapon)

Don't forget to add it to the &lt;code&gt;ut2003.ini&lt;/code&gt; file:

&lt;code&gt;EditPackages=TestPak&lt;/code&gt;

(below the other ''EditPackages'' lines)

Create a subfolder to the &lt;code&gt;TestPak&lt;/code&gt; directory called &lt;code&gt;classes&lt;/code&gt;

That's now your point to start from.

For the beginning I copied the [[Legacy:AssaultRifleWeapon|AssaultRifleWeapon]] and the codefiles belonging to that weapon for later modification. You can start that way too. If you want to rename the Weapon classes, you have to rename the files but also the file's content. Example:

 copy c:\ut2003\XWeapons\Classes\'''AssaultRifle.uc''' c:\ut2003\testpak\classes\'''TestWeapon.uc'''

open the file and change 
 class AssaultRifle extends Weapon
    config(user);

to:
 class TestWeapon extends Weapon
    config(user);

If you have renamed all the files you want to modify (I copied, renamed and ''modified'' the files: &lt;code&gt;Grenade.uc to TestGrenade.uc, GrenadeAmmo.uc to TestGrenadeAmmo.uc, AssaultRifle.uc to TestWeapon.uc, AssaultAmmoPickup.uc to TestWeaponAmmoPickup.uc, AssaultAttachment.uc to TestWeaponAttachment.uc, AssaultFire.uc to TestWeaponFire.uc, AssaultGrenade.uc to TestWeaponGrenade.uc, AssaultRiflePickup.uc to TestWeaponPickup.uc&lt;/code&gt;) You can start making minor corrections in the files. Before doing that you can run &lt;code&gt;ucc make all&lt;/code&gt;, testing if your copying process was successfull. If not, you have done something wrong or I described it badly - in that case you are welcome to modify this page ;). 

Well ok - if you start a testlevel (with cheatings enabled) you can put in the console: &lt;code&gt;summon testpak.testweaponpickup&lt;/code&gt; and the weapon will appear right in front of you. If not, check if the testpak.u file is present in the system directory. 

You will find out that it is still the normal AssaultRifle gun. And it is still shooting the same way etc. So stop playing around and modify the files further. Open &lt;code&gt;TestWeapon.uc&lt;/code&gt;. Jump to the last lines where the defaultproperties are written.  

Watch out for lines like that now:
 PickupClass=class'AssaultRiflePickup'

These lines are still pointing to the &quot;old&quot; classes that you want to overwrite!

So change the lines this way:
 PickupClass=Class'TestPak.TestWeaponPickup'

'''You will have to do this in all the files that you copied!'''

Change the 
 ItemName=&quot;Assault Rifle&quot;

to something else like &quot;supergun&quot; or so...

Watch out for errors and test it inbetween by compiling and testing! It is hard to find errors if you made lots of &quot;heavy&quot; changes. ''Don't forget to delete &lt;code&gt;testpak.u&lt;/code&gt; before compiling your code!

If you rerun a level and summon your weapon, it should tell you that you collected the &quot;supergun&quot; - or whatever you named it. But there are lot's of further changes to be made.

I won't describe every line that I have changed because if you are clever, you will see the property values yourself that are important while changing the class names. Lines like 
 InventoryGroup=2

should make you curious for changing (this value will move the weapon to another slot in your inventory and can be changed easily).

So, you can easily make now minor changes yourself: How much ammo it has, how fast it shoots and so on. As I started up by zero I spend a lot of time on figuring out how the new gun behaves on the changes. I guess you should do the same. 

Tests like: '''How fast can I shoot''' are always funny ;) - especially if you need only one second to fire 300 projectiles on your enemy :D

==A little more tuning==

Still not satisfied? Well I wasn't too, - I wanted to create a bow. I am unable to create my own animation stuff since I have no conversion tool for 3D meshes, but I created an Staticmesh arrow that will be shot when triggering the grenade. This is easily be done in the defaultproperties of the &lt;code&gt; TestGrenade.uc&lt;/code&gt; file:
 StaticMesh=StaticMesh'YourStaticMeshPackage.YourGrenade'

Now I was able to shoot arrows - that exploded and flew strange (rotating and so on). ...

So I made some changes on the functions that let the grenade explode - I deleted the functions that made the thing blowing up. Get rid of the randomspin-values, too. Also, I wanted to make the arrow stick:

&lt;uscript&gt;
var bool bLanded; // put this in the beginning of the file

simulated function Landed( vector HitNormal ) {
    HitWall(HitNormal,None);
}

simulated function HitWall(vector HitNormal, actor HitWall) {
    bLanded=true;
    Velocity=0*Velocity;
    SetPhysics(PHYS_None);
}
&lt;/uscript&gt;

Now, the arrow will stick wherever it lands (except for the players it is hitting).

But you will see that the arrow is not flying realy... A simple function will fix it:

&lt;uscript&gt;
simulated function Tick( float DeltaTime ) {
   if (!bLanded) SetRotation(rotator(velocity));
}
&lt;/uscript&gt;

Tick is called every moment in Unreal, so I guess this is the dirty way how to implement it, but I also think it does not matter so much when testing. Has anyone a better Idea?

At least the arrow is flying nice through the air and sticks where it lands in the right direction!

Now - I wanted to make it stick in the body of the enemy of course *hehehe*.

So I modified the ProcessTouch function:

&lt;uscript&gt;

simulated function ProcessTouch( actor Other, vector HitLocation )
{
    local float dist;
    local Name bone; //which bone it should be attached
    local Vector X;
    local class&lt;DamageType&gt; dmg;

    dmg=class'XWeapons.DamTypeShieldImpact';
    if ( Pawn(Other) != None &amp;&amp; (Other != Instigator || bCanHitOwner) &amp;&amp; (!bLanded))
    {
	bLanded=True;
	X=Normal(Velocity+vect(0,0,0.5));
	SetPhysics(PHYS_None);
	bone=Other.GetClosestBone(HitLocation,Velocity,dist);
	Other.TakeDamage(0, Instigator, HitLocation, 60000*(X), None); // just push the other player back
	Other.AttachToBone(Self,bone);

        Velocity=0*Velocity;
    }
}
&lt;/uscript&gt;

So this is not much - but I needed some time to find out how all that works with together with a friend. And it is still not sticking the way in the enemy that how I like it to do...

==Final words==

I am not a professional in describing things. And I am not sure if I mentioned all the important stuff. If you think there is a bug, feel free to correct it. Add some lines if you are encountering problems, too. 

This all took me about 8 hours to get run. Much work, I hope you won't need so long with this little help. By the way-  if Unrealed doesn't show your package - load it manually.

==Related Topics==
* [[Legacy:Weapon|Weapon]]
* [[Legacy:Weapon Modeling|Weapon Modeling]]
* [[Legacy:Inventory|Inventory]]
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''RegularX:''' Looks pretty good - added a link to this from the Weapon Mutator from the tute series.

'''Foxpaw:''' Some of the stuff at the beginning overlaps with the setting up your pacakge stuff. Or something. I don't know the actual link. Anyways, it could probrably get a [[:Category:Legacy Refactor Me]].

'''Kentyman:''' At the top of this page you create your own weapon folder structure and script files by copy/pasting existing script files. This sort of clashes with the idea of Object Orientated Programming where you simply extend existing classes and modify them as you see fit (instead of first replicating all the code and then changing it)

'''Neo Reloaded:''' Is it possible to create weapons in UnrealEd?

'''Wormbo:''' If you mean weapon models, that's a clear no. If you mean the code behind them &amp;ndash; well, let's put it this way: Don't try it. Any [[Legacy:Text Editor|text editor]] is better for that. ;)

'''Beansdeath:''' Wondering- once a new weapon is made, bow&amp;arrow, or what have you, how do you go about changing the weap. icon on the HUD to show a new weap. icon, say a little bow&amp;arrow, so you arent holding a bow and have a assault rife icon?  would be a good bit to add here.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2307</id>
      <timestamp>2005-06-22T02:12:28Z</timestamp>
      <contributor>
        <ip>Beansdeath</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Example: How to create a simple weapon===

I just started with coding but I am missing some practical examples. So I put here what I found out so far together with the code.

I assume that you have installed the SDK files or exported the codefiles from unrealed (in that case you see various directories like &quot;XWeapons&quot; etc. in your unreal directory)

For learning Unreal, I started a new Package called &lt;code&gt;TestPak&lt;/code&gt;.

I created the &lt;code&gt;TestPak.int&lt;/code&gt; file in that folder which contains:
 [Public]
 Object=(Name=TestPak,Class=Class,MetaClass=Engine.Weapon)

Don't forget to add it to the &lt;code&gt;ut2003.ini&lt;/code&gt; file:

&lt;code&gt;EditPackages=TestPak&lt;/code&gt;

(below the other ''EditPackages'' lines)

Create a subfolder to the &lt;code&gt;TestPak&lt;/code&gt; directory called &lt;code&gt;classes&lt;/code&gt;

That's now your point to start from.

For the beginning I copied the AssaultRifleWeapon and the codefiles belonging to that weapon for later modification. You can start that way too. If you want to rename the Weapon classes, you have to rename the files but also the file's content. Example:

 copy c:\ut2003\XWeapons\Classes\'''AssaultRifle.uc''' c:\ut2003\testpak\classes\'''TestWeapon.uc'''

open the file and change 
 class AssaultRifle extends Weapon
    config(user);

to:
 class TestWeapon extends Weapon
    config(user);

If you have renamed all the files you want to modify (I copied, renamed and ''modified'' the files: &lt;code&gt;Grenade.uc to TestGrenade.uc, GrenadeAmmo.uc to TestGrenadeAmmo.uc, AssaultRifle.uc to TestWeapon.uc, AssaultAmmoPickup.uc to TestWeaponAmmoPickup.uc, AssaultAttachment.uc to TestWeaponAttachment.uc, AssaultFire.uc to TestWeaponFire.uc, AssaultGrenade.uc to TestWeaponGrenade.uc, AssaultRiflePickup.uc to TestWeaponPickup.uc&lt;/code&gt;) You can start making minor corrections in the files. Before doing that you can run &lt;code&gt;ucc make all&lt;/code&gt;, testing if your copying process was successfull. If not, you have done something wrong or I described it badly - in that case you are welcome to modify this page ;). 

Well ok - if you start a testlevel (with cheatings enabled) you can put in the console: &lt;code&gt;summon testpak.testweaponpickup&lt;/code&gt; and the weapon will appear right in front of you. If not, check if the testpak.u file is present in the system directory. 

You will find out that it is still the normal AssaultRifle gun. And it is still shooting the same way etc. So stop playing around and modify the files further. Open &lt;code&gt;TestWeapon.uc&lt;/code&gt;. Jump to the last lines where the defaultproperties are written.  

Watch out for lines like that now:
 PickupClass=class'AssaultRiflePickup'

These lines are still pointing to the &quot;old&quot; classes that you want to overwrite!

So change the lines this way:
 PickupClass=Class'TestPak.TestWeaponPickup'

'''You will have to do this in all the files that you copied!'''

Change the 
 ItemName=&quot;Assault Rifle&quot;

to something else like &quot;supergun&quot; or so...

Watch out for errors and test it inbetween by compiling and testing! It is hard to find errors if you made lot's of &quot;heavy&quot; changes. ''Don't forget to delete &lt;code&gt;testpak.u&lt;/code&gt; before compiling your code!

If you rerun a level and summon your weapon, it should tell you that you collected the &quot;supergun&quot; - or whatever you named it. But there are lot's of further changes to be made.

I won't describe every line that I have changed because if you are clever, you will see the property values yourself that are important while changing the class names. Lines like 
 InventoryGroup=2

should make you curious for changing (this value will move the weapon to another slot in your inventory and can be changed easily).

So, you can easily make now minor changes yourself: How much ammo it has, how fast it shoots and so on. As I started up by zero I spend a lot of time on figuring out how the new gun behaves on the changes. I guess you should do the same. 

Tests like: '''How fast can I shoot''' are always funny ;) - especially if you need only one second to fire 300 projectiles on your enemy :D

==A little more tuning==

Still not satisfied? Well I wasn't too, - I wanted to create a bow. I am unable to create my own animation stuff since I have no conversion tool for 3D meshes, but I created an Staticmesh arrow that will be shot when triggering the grenade. This is easily be done in the defaultproperties of the &lt;code&gt; TestGrenade.uc&lt;/code&gt; file:
 StaticMesh=StaticMesh'YourStaticMeshPackage.YourGrenade'

Now I was able to shoot arrows - that exploded and flew strange (rotating and so on). ...

So I made some changes on the functions that let the grenade explode - I deleted the functions that made the thing blowing up. Get rid of the randomspin-values, too. Also, I wanted to make the arrow stick:

&lt;uscript&gt;
var bool bLanded; // put this in the beginning of the file

simulated function Landed( vector HitNormal ) {
    HitWall(HitNormal,None);
}

simulated function HitWall(vector HitNormal, actor HitWall) {
    bLanded=true;
    Velocity=0*Velocity;
    SetPhysics(PHYS_None);
}
&lt;/uscript&gt;

Now, the arrow will stick wherever it lands (except for the players it is hitting).

But you will see that the arrow is not flying realy... A simple function will fix it:

&lt;uscript&gt;
simulated function Tick( float DeltaTime ) {
   if (!bLanded) SetRotation(rotator(velocity));
}
&lt;/uscript&gt;

Tick is called every moment in Unreal, so I guess this is the dirty way how to implement it, but I also think it does not matter so much when testing. Has anyone a better Idea?

At least the arrow is flying nice through the air and sticks where it lands in the right direction!

Now - I wanted to make it stick in the body of the enemy of course *hehehe*.

So I modified the ProcessTouch function:

&lt;uscript&gt;

simulated function ProcessTouch( actor Other, vector HitLocation )
{
    local float dist;
    local Name bone; //which bone it should be attached
    local Vector X;
    local class&lt;DamageType&gt; dmg;

    dmg=class'XWeapons.DamTypeShieldImpact';
    if ( Pawn(Other) != None &amp;&amp; (Other != Instigator || bCanHitOwner) &amp;&amp; (!bLanded))
    {
	bLanded=True;
	X=Normal(Velocity+vect(0,0,0.5));
	SetPhysics(PHYS_None);
	bone=Other.GetClosestBone(HitLocation,Velocity,dist);
	Other.TakeDamage(0, Instigator, HitLocation, 60000*(X), None); // just push the other player back
	Other.AttachToBone(Self,bone);

        Velocity=0*Velocity;
    }
}
&lt;/uscript&gt;

So this is not much - but I needed some time to find out how all that works with together with a friend. And it is still not sticking the way in the enemy that how I like it to do...

==Final words==

I am not a professional in describing things. And I am not sure if I mentioned all the important stuff. If you think there is a bug, feel free to correct it. Add some lines if you are encountering problems, too. 

This all took me about 8 hours to get run. Much work, I hope you won't need so long with this little help. By the way-  if Unrealed doesn't show your package - load it manually.

==Comments==

'''RegularX:''' Looks pretty good - added a link to this from the Weapon Mutator from the tute series.

'''Foxpaw:''' Some of the stuff at the beginning overlaps with the setting up your pacakge stuff. Or something. I don't know the actual link. Anyways, it could probrably get a [[:Category:Legacy Refactor Me]].

'''Kentyman:''' At the top of this page you create your own weapon folder structure and script files by copy/pasting existing script files. This sort of clashes with the idea of Object Orientated Programming where you simply extend existing classes and modify them as you see fit (instead of first replicating all the code and then changing it)

'''Neo Reloaded:''' Is it possible to create weapons in UnrealEd?

'''Wormbo:''' If you mean weapon models, that's a clear no. If you mean the code behind them &amp;ndash; well, let's put it this way: Don't try it. Any [[Legacy:Text Editor|text editor]] is better for that. ;)

'''Beansdeath:''' Wondering- once a new weapon is made, bow&amp;arrow, or what have you, how do you go about changing the weap. icon on the HUD to show a new weap. icon, say a little bow&amp;arrow, so you arent holding a bow and have a assault rife icon?  would be a good bit to add here.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2308</id>
      <timestamp>2005-06-22T11:47:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I just started with coding but I am missing some practical examples. So I put here what I found out so far together with the code.

I assume that you have installed the SDK files or exported the codefiles from UnrealEd. In that case you see various directories like &quot;XWeapons&quot; etc. in your unreal directory &amp;ndash; see [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] for instructions.

==Getting Started==

For learning Unreal, I started a new Package called &lt;code&gt;TestPak&lt;/code&gt;.

I created the &lt;code&gt;TestPak.int&lt;/code&gt; file in that folder which contains:
 [Public]
 Object=(Name=TestPak,Class=Class,MetaClass=Engine.Weapon)

Don't forget to add it to the &lt;code&gt;ut2003.ini&lt;/code&gt; file:

&lt;code&gt;EditPackages=TestPak&lt;/code&gt;

(below the other ''EditPackages'' lines)

Create a subfolder to the &lt;code&gt;TestPak&lt;/code&gt; directory called &lt;code&gt;classes&lt;/code&gt;

That's now your point to start from.

For the beginning I copied the [[Legacy:AssaultRifleWeapon|AssaultRifleWeapon]] and the codefiles belonging to that weapon for later modification. You can start that way too. If you want to rename the Weapon classes, you have to rename the files but also the file's content. Example:

 copy c:\ut2003\XWeapons\Classes\'''AssaultRifle.uc''' c:\ut2003\testpak\classes\'''TestWeapon.uc'''

open the file and change 
 class AssaultRifle extends Weapon
    config(user);

to:
 class TestWeapon extends Weapon
    config(user);

If you have renamed all the files you want to modify (I copied, renamed and ''modified'' the files: &lt;code&gt;Grenade.uc to TestGrenade.uc, GrenadeAmmo.uc to TestGrenadeAmmo.uc, AssaultRifle.uc to TestWeapon.uc, AssaultAmmoPickup.uc to TestWeaponAmmoPickup.uc, AssaultAttachment.uc to TestWeaponAttachment.uc, AssaultFire.uc to TestWeaponFire.uc, AssaultGrenade.uc to TestWeaponGrenade.uc, AssaultRiflePickup.uc to TestWeaponPickup.uc&lt;/code&gt;) You can start making minor corrections in the files. Before doing that you can run &lt;code&gt;ucc make all&lt;/code&gt;, testing if your copying process was successfull. If not, you have done something wrong or I described it badly - in that case you are welcome to modify this page ;). 

Well ok - if you start a testlevel (with cheatings enabled) you can put in the console: &lt;code&gt;summon testpak.testweaponpickup&lt;/code&gt; and the weapon will appear right in front of you. If not, check if the testpak.u file is present in the system directory. 

You will find out that it is still the normal AssaultRifle gun. And it is still shooting the same way etc. So stop playing around and modify the files further. Open &lt;code&gt;TestWeapon.uc&lt;/code&gt;. Jump to the last lines where the defaultproperties are written.  

Watch out for lines like that now:
 PickupClass=class'AssaultRiflePickup'

These lines are still pointing to the &quot;old&quot; classes that you want to overwrite!

So change the lines this way:
 PickupClass=Class'TestPak.TestWeaponPickup'

'''You will have to do this in all the files that you copied!'''

Change the 
 ItemName=&quot;Assault Rifle&quot;

to something else like &quot;supergun&quot; or so...

Watch out for errors and test it inbetween by compiling and testing! It is hard to find errors if you made lots of &quot;heavy&quot; changes. ''Don't forget to delete &lt;code&gt;testpak.u&lt;/code&gt; before compiling your code!

If you rerun a level and summon your weapon, it should tell you that you collected the &quot;supergun&quot; - or whatever you named it. But there are lot's of further changes to be made.

I won't describe every line that I have changed because if you are clever, you will see the property values yourself that are important while changing the class names. Lines like 
 InventoryGroup=2

should make you curious for changing (this value will move the weapon to another slot in your inventory and can be changed easily).

So, you can easily make now minor changes yourself: How much ammo it has, how fast it shoots and so on. As I started up by zero I spend a lot of time on figuring out how the new gun behaves on the changes. I guess you should do the same. 

Tests like: '''How fast can I shoot''' are always funny ;) - especially if you need only one second to fire 300 projectiles on your enemy :D

==A little more tuning==

Still not satisfied? Well I wasn't too, - I wanted to create a bow. I am unable to create my own animation stuff since I have no conversion tool for 3D meshes, but I created an Staticmesh arrow that will be shot when triggering the grenade. This is easily be done in the defaultproperties of the &lt;code&gt; TestGrenade.uc&lt;/code&gt; file:
 StaticMesh=StaticMesh'YourStaticMeshPackage.YourGrenade'

Now I was able to shoot arrows - that exploded and flew strange (rotating and so on). ...

So I made some changes on the functions that let the grenade explode - I deleted the functions that made the thing blowing up. Get rid of the randomspin-values, too. Also, I wanted to make the arrow stick:

&lt;uscript&gt;
var bool bLanded; // put this in the beginning of the file

simulated function Landed( vector HitNormal ) {
    HitWall(HitNormal,None);
}

simulated function HitWall(vector HitNormal, actor HitWall) {
    bLanded=true;
    Velocity=0*Velocity;
    SetPhysics(PHYS_None);
}
&lt;/uscript&gt;

Now, the arrow will stick wherever it lands (except for the players it is hitting).

But you will see that the arrow is not flying realy... A simple function will fix it:

&lt;uscript&gt;
simulated function Tick( float DeltaTime ) {
   if (!bLanded) SetRotation(rotator(velocity));
}
&lt;/uscript&gt;

Tick is called every moment in Unreal, so I guess this is the dirty way how to implement it, but I also think it does not matter so much when testing. Has anyone a better Idea?

At least the arrow is flying nice through the air and sticks where it lands in the right direction!

Now - I wanted to make it stick in the body of the enemy of course *hehehe*.

So I modified the ProcessTouch function:

&lt;uscript&gt;

simulated function ProcessTouch( actor Other, vector HitLocation )
{
    local float dist;
    local Name bone; //which bone it should be attached
    local Vector X;
    local class&lt;DamageType&gt; dmg;

    dmg=class'XWeapons.DamTypeShieldImpact';
    if ( Pawn(Other) != None &amp;&amp; (Other != Instigator || bCanHitOwner) &amp;&amp; (!bLanded))
    {
	bLanded=True;
	X=Normal(Velocity+vect(0,0,0.5));
	SetPhysics(PHYS_None);
	bone=Other.GetClosestBone(HitLocation,Velocity,dist);
	Other.TakeDamage(0, Instigator, HitLocation, 60000*(X), None); // just push the other player back
	Other.AttachToBone(Self,bone);

        Velocity=0*Velocity;
    }
}
&lt;/uscript&gt;

So this is not much - but I needed some time to find out how all that works with together with a friend. And it is still not sticking the way in the enemy that how I like it to do...

==Final words==

I am not a professional in describing things. And I am not sure if I mentioned all the important stuff. If you think there is a bug, feel free to correct it. Add some lines if you are encountering problems, too. 

This all took me about 8 hours to get run. Much work, I hope you won't need so long with this little help. By the way-  if Unrealed doesn't show your package - load it manually.

==Comments==

'''RegularX:''' Looks pretty good - added a link to this from the Weapon Mutator from the tute series.

'''Foxpaw:''' Some of the stuff at the beginning overlaps with the setting up your pacakge stuff. Or something. I don't know the actual link. Anyways, it could probrably get a [[:Category:Legacy Refactor Me]].

'''Kentyman:''' At the top of this page you create your own weapon folder structure and script files by copy/pasting existing script files. This sort of clashes with the idea of Object Orientated Programming where you simply extend existing classes and modify them as you see fit (instead of first replicating all the code and then changing it)

'''Neo Reloaded:''' Is it possible to create weapons in UnrealEd?

'''Wormbo:''' If you mean weapon models, that's a clear no. If you mean the code behind them &amp;ndash; well, let's put it this way: Don't try it. Any [[Legacy:Text Editor|text editor]] is better for that. ;)

'''Beansdeath:''' Wondering- once a new weapon is made, bow&amp;arrow, or what have you, how do you go about changing the weap. icon on the HUD to show a new weap. icon, say a little bow&amp;arrow, so you arent holding a bow and have a assault rife icon?  would be a good bit to add here.
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A Rounded Mesh Using Splines</title>
    <id>757</id>
    <revision>
      <id>2165</id>
      <timestamp>2004-12-01T06:16:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will cover creating a 90 degree pipe that goes with the T-Section pipe we created in the [[Legacy:Creating_A_Simple_Mesh_Using_Splines|Creating_A_Simple_Mesh_Using_Splines]] tutorial.

==Preface ==

I will only be introducing one new element into spline modeling: '''Bezier lines'''. Bezier lines allow you to control the shape of a line, which is exactly what we want to do to create rounded objects.

Also, all of the cloning/edits I mention are done in the top view unless otherwise stated.

===What are these Bezier Lines you speak of? ===

See also [[Wikipedia:Bezier curve]]

You've been working with them all along, just not knowingly. Circles are a form of Bezier splines. If you ever clicked on the vertex of a circle you would of noticed that two little green squares with a yellow line connecting them would of appeared around the vertex. These are called '''handles'''. By moving these handles you can change the shape of the curve on the spline.

==Setting it Up ==

Use the same settings as stated in the Simple Mesh tutorial (''16 Grid, Grid snap on'').

Lets start off by creating a circle with a radius of 64 (Same radius as the pipe in the previous tutorial). Convert it to an editable spline and go into element. Select the circle and clone it over and up 256 Units (''256 units right, 256 units up''). Now rotate it 90 degrees. We have now created the beginning and end of the 90 degree pipe.

Now, lets create the splines to connect the two pieces. Since this is an even 90 degree piece, this will be very easy. Draw 3 circles from the midpoint of the existing circles(From the left circle go up until it is parallel with the other circle, draw the new cirles from there) Create the circles so that they line up with the existing circles. Take the circle in the middle and clone it down so it lines up with the bottom of the circle, and move the circle that you clone from up so it lines up with the top of the pipe beginning / end. You should now have something like this:

[[Image:Legacy_spine_rpipe_1.jpeg|center|Note the extra part of the circles, they need to be removed to leave just a 90 degree section]]

Now you'll need to shave off the extra parts of the circles. First you should select the pipe beginning/end object and attatch all the loose circles to it (''The surface tool only works on a single object''). Now go into segment select mode and select all those extra loose segmenets and delete them. Hmm it looks like a rounded pipe to me :). Lets make a '''Referenced''' clone and apply the surface modifier so we can see our curved pipe.

===Spicing up the pipe ===

Right now, the pipe is pretty boring, so lets add rounded flanges on the end. This is a lot easier than it sounds. Remember, you don't have to do anything to make the referenced surface update, it'll do it by itself as you edit. You need to be in element edit mode(with the spline object selected) while doing the following. 

Lets start by cloning the end circle over twice, 16 units each time. Now lets uniformly scale the circle upwards by 120 (''Look at the XYZ fields at the bottom of the screen for the scale factor''). You should now have this:

[[Image:Legacy_spine_rpipe_2.jpeg|center|]]

The next part is a little tricky. We need to look in the front view and draw a circle using the edge creation method, and drag from left to right to connect the two shorter circles. Now attatch the newly created circle. As you may of noticed, the top of the is slightly taller then the circle we scaled by 120 earlier. To remedy this, cut endpoint snapping on and drag the small circle's vert to the top of the largest circle's vert. If done correctly they will snap and line up exactly(''Cut endpoint snapping off when you aren't using it''). Now is a good time to delete the extra lower half of the circle.

You may of noticed that the circle may not be in a shape you exactly like. You can change the shape by moving the handles on the circle's verts. Play around with them and you will get the shape you want. Mine turned out looking like this:

[[Image:Legacy_spine_rpipe_3.jpeg|center|Keeping the small piece lined up is the hardest part, but EndPoint snapping makes it a lot easier]]

Now, clone the circle we just made to the other parts of the circle. (''3 times in all, the left, right, and bottom'') Remember to rotate it 90 degrees each time to line it up, and if you have problems lining it up, use endpoint snapping to snap the small piece like you did on the top. (''Select the top vert at the top of the half-circle, drag it to the vert of the big circle''). If everything went well, you should be able to look at your referenced mesh and see the flange at the end of it. As you may of noticed, the concentration of polygons on the flange is very high. Lets use a less polygon intensive method on the other side.

Lets begin making our lower-poly flange by copying the top circle end up 32 units. Next use create line tool to draw a line between the top two verts of the two circles. &quot;But that doesn't look very round to me, and when I click on the verts of the line I don't see any handles?&quot;. Right you are, we are about to do something about that. You need to select both verts of JUST the line we created. To make this easier, under '''Selection''' in the '''Editable Spline''' check '''Segment End'''. This allows you to click on the segment and it selects the nearest vert that belongs to it. Hold control and select both verts of the line. After doing so, hold control and right click '''ON''' one of the verts. This will pop of a new menu. Go to '''Edit/Edit Spline Menu-&gt;Bezier'''. This converts the verts from corner to Bezier. Now you will be able to give the spline a nice curve by dragging the handles. Mine ended up like this:

[[Image:Legacy_spine_rpipe_4.jpeg|center|Handles do not make the line go exactly to their position, they only make the line 'lean' that way]]

All thats left to do is clone / rotate it like you did for the other end. The entire scene ended up looking like this:

[[Image:Legacy_spine_rpipe_5.jpeg|center|The flange on the right side is much more reasonable to be used]]

Notice how the second spline method we used resulted in less polys, and fits better with the polygon concentration of the rest of the object. Some would even suggest adding in second circle in the middle of the bend so the bend would be smoother. I'll leave that to you as a bonus exercise :) (''Hint, you'll have to divide the long splines that make the bend'')

==Wrapping it Up ==

In this tutorial we created a curved pipe and added rounded flanges using the basics of Bezier splines. I hope you learned much from this tutorial. Remember, using Max is a learning experience. I learn something almost every time I use it. For example, I never knew that you could convert Spline types using a menu until today. (Holding Control, Shift, or Alt all pop up different right click menus)

Sorry if the tutorial was a little vauge in places. The subject is a little hard to explain. As usual, I'm open to suggestions / comments  &amp;rarr;[[Legacy:Dr.Nick|Dr.Nick]]

'''Legal:''' Suggestion moderators (GodKings): Move this page to the 3DSM part of the Wiki.

'''Wormbo:''' Just link it from there.

'''Tarquin:''' Not sure what '3dsm' is &amp;ndash; link it from [[Legacy:Modeling|Modeling]]

'''Legal:''' Neither am I, but I got confused (thought it was another fancy UED3 thing) so move to Modelling/Spline... please.

'''Tarquin:''' I prefer not to have subpages unless they're clearly related. There aren't any &quot;areas&quot; of the wiki &amp;ndash; you create strcture by making links.

'''Foogod:''' I assume that &quot;3DSM&quot; is [[Legacy:3D Studio Max|3D Studio Max]], which is pretty clearly the specific modelling program this tutorial is geared at.  Given the required context, I actually think this would make sense as a subpage for that modelling program, since it's probably not that useful (and potentially rather confusing) for anybody using other software.  At the very least, there should be some mention somewhere of what program this thing is assuming the reader is using..

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2166</id>
      <timestamp>2004-11-25T21:41:28Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will cover creating a 90 degree pipe that goes with the T-Section pipe we created in the [[Legacy:Creating_A_Simple_Mesh_Using_Splines|Creating_A_Simple_Mesh_Using_Splines]] tutorial.

==Preface ==

I will only be introducing one new element into spline modeling: '''Bezier lines'''. Bezier lines allow you to control the shape of a line, which is exactly what we want to do to create rounded objects.

Also, all of the cloning/edits I mention are done in the top view unless otherwise stated.

===What are these Bezier Lines you speak of? ===

See also [[Wikipedia:Bezier curve]]

You've been working with them all along, just not knowingly. Circles are a form of Bezier splines. If you ever clicked on the vertex of a circle you would of noticed that two little green squares with a yellow line connecting them would of appeared around the vertex. These are called '''handles'''. By moving these handles you can change the shape of the curve on the spline.

==Setting it Up ==

Use the same settings as stated in the Simple Mesh tutorial (''16 Grid, Grid snap on'').

Lets start off by creating a circle with a radius of 64 (Same radius as the pipe in the previous tutorial). Convert it to an editable spline and go into element. Select the circle and clone it over and up 256 Units (''256 units right, 256 units up''). Now rotate it 90 degrees. We have now created the beginning and end of the 90 degree pipe.

Now, lets create the splines to connect the two pieces. Since this is an even 90 degree piece, this will be very easy. Draw 3 circles from the midpoint of the existing circles(From the left circle go up until it is parallel with the other circle, draw the new cirles from there) Create the circles so that they line up with the existing circles. Take the circle in the middle and clone it down so it lines up with the bottom of the circle, and move the circle that you clone from up so it lines up with the top of the pipe beginning / end. You should now have something like this:

[[Image:Legacy_spine_rpipe_1.jpeg|center|Note the extra part of the circles, they need to be removed to leave just a 90 degree section]]

Now you'll need to shave off the extra parts of the circles. First you should select the pipe beginning/end object and attatch all the loose circles to it (''The surface tool only works on a single object''). Now go into segment select mode and select all those extra loose segmenets and delete them. Hmm it looks like a rounded pipe to me :). Lets make a '''Referenced''' clone and apply the surface modifier so we can see our curved pipe.

===Spicing up the pipe ===

Right now, the pipe is pretty boring, so lets add rounded flanges on the end. This is a lot easier than it sounds. Remember, you don't have to do anything to make the referenced surface update, it'll do it by itself as you edit. You need to be in element edit mode(with the spline object selected) while doing the following. 

Lets start by cloning the end circle over twice, 16 units each time. Now lets uniformly scale the circle upwards by 120 (''Look at the XYZ fields at the bottom of the screen for the scale factor''). You should now have this:

[[Image:Legacy_spine_rpipe_2.jpeg|center|]]

The next part is a little tricky. We need to look in the front view and draw a circle using the edge creation method, and drag from left to right to connect the two shorter circles. Now attatch the newly created circle. As you may of noticed, the top of the is slightly taller then the circle we scaled by 120 earlier. To remedy this, cut endpoint snapping on and drag the small circle's vert to the top of the largest circle's vert. If done correctly they will snap and line up exactly(''Cut endpoint snapping off when you aren't using it''). Now is a good time to delete the extra lower half of the circle.

You may of noticed that the circle may not be in a shape you exactly like. You can change the shape by moving the handles on the circle's verts. Play around with them and you will get the shape you want. Mine turned out looking like this:

[[Image:Legacy_spine_rpipe_3.jpeg|center|Keeping the small piece lined up is the hardest part, but EndPoint snapping makes it a lot easier]]

Now, clone the circle we just made to the other parts of the circle. (''3 times in all, the left, right, and bottom'') Remember to rotate it 90 degrees each time to line it up, and if you have problems lining it up, use endpoint snapping to snap the small piece like you did on the top. (''Select the top vert at the top of the half-circle, drag it to the vert of the big circle''). If everything went well, you should be able to look at your referenced mesh and see the flange at the end of it. As you may of noticed, the concentration of polygons on the flange is very high. Lets use a less polygon intensive method on the other side.

Lets begin making our lower-poly flange by copying the top circle end up 32 units. Next use create line tool to draw a line between the top two verts of the two circles. &quot;But that doesn't look very round to me, and when I click on the verts of the line I don't see any handles?&quot;. Right you are, we are about to do something about that. You need to select both verts of JUST the line we created. To make this easier, under '''Selection''' in the '''Editable Spline''' check '''Segment End'''. This allows you to click on the segment and it selects the nearest vert that belongs to it. Hold control and select both verts of the line. After doing so, hold control and right click '''ON''' one of the verts. This will pop of a new menu. Go to '''Edit/Edit Spline Menu-&gt;Bezier'''. This converts the verts from corner to Bezier. Now you will be able to give the spline a nice curve by dragging the handles. Mine ended up like this:

[[Image:Legacy_spine_rpipe_4.jpeg|center|Handles do not make the line go exactly to their position, they only make the line 'lean' that way]]

All thats left to do is clone / rotate it like you did for the other end. The entire scene ended up looking like this:

[[Image:Legacy_spine_rpipe_5.jpeg|center|The flange on the right side is much more reasonable to be used]]

Notice how the second spline method we used resulted in less polys, and fits better with the polygon concentration of the rest of the object. Some would even suggest adding in second circle in the middle of the bend so the bend would be smoother. I'll leave that to you as a bonus exercise :) (''Hint, you'll have to divide the long splines that make the bend'')

==Wrapping it Up ==

In this tutorial we created a curved pipe and added rounded flanges using the basics of Bezier splines. I hope you learned much from this tutorial. Remember, using Max is a learning experience. I learn something almost every time I use it. For example, I never knew that you could convert Spline types using a menu until today. (Holding Control, Shift, or Alt all pop up different right click menus)

Sorry if the tutorial was a little vauge in places. The subject is a little hard to explain. As usual, I'm open to suggestions / comments  &amp;rarr;[[Legacy:Dr.Nick|Dr.Nick]]

'''Legal:''' Suggestion moderators (GodKings): Move this page to the 3DSM part of the Wiki.

'''Wormbo:''' Just link it from there.

'''Tarquin:''' Not sure what '3dsm' is &amp;ndash; link it from [[Legacy:Modeling|Modeling]]

'''Legal:''' Neither am I, but I got confused (thought it was another fancy UED3 thing) so move to Modelling/Spline... please.

'''Tarquin:''' I prefer not to have subpages unless they're clearly related. There aren't any &quot;areas&quot; of the wiki &amp;ndash; you create strcture by making links.

'''Foogod:''' I assume that &quot;3DSM&quot; is [[Legacy:3D Studio Max|3D Studio Max]], which is pretty clearly the specific modelling program this tutorial is geared at.  Given the required context, I actually think this would make sense as a subpage for that modelling program, since it's probably not that useful (and potentially rather confusing) for anybody using other software.  At the very least, there should be some mention somewhere of what program this thing is assuming the reader is using..

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2167</id>
      <timestamp>2004-12-01T04:53:54Z</timestamp>
      <contributor>
        <ip>Dsl178-185.globaldial.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will cover creating a 90 degree pipe that goes with the T-Section pipe we created in the [[Legacy:Creating_A_Simple_Mesh_Using_Splines|Creating_A_Simple_Mesh_Using_Splines]] tutorial.

==Preface ==

I will only be introducing one new element into spline modeling: '''Bezier lines'''. Bezier lines allow you to control the shape of a line, which is exactly what we want to do to create rounded objects.

Also, all of the cloning/edits I mention are done in the top view unless otherwise stated.

===What are these Bezier Lines you speak of? ===

See also [[Wikipedia:Bezier curve]]

You've been working with them all along, just not knowingly. Circles are a form of Bezier splines. If you ever clicked on the vertex of a circle you would of noticed that two little green squares with a yellow line connecting them would of appeared around the vertex. These are called '''handles'''. By moving these handles you can change the shape of the curve on the spline.

==Setting it Up ==

Use the same settings as stated in the Simple Mesh tutorial (''16 Grid, Grid snap on'').

Lets start off by creating a circle with a radius of 64 (Same radius as the pipe in the previous tutorial). Convert it to an editable spline and go into element. Select the circle and clone it over and up 256 Units (''256 units right, 256 units up''). Now rotate it 90 degrees. We have now created the beginning and end of the 90 degree pipe.

Now, lets create the splines to connect the two pieces. Since this is an even 90 degree piece, this will be very easy. Draw 3 circles from the midpoint of the existing circles(From the left circle go up until it is parallel with the other circle, draw the new cirles from there) Create the circles so that they line up with the existing circles. Take the circle in the middle and clone it down so it lines up with the bottom of the circle, and move the circle that you clone from up so it lines up with the top of the pipe beginning / end. You should now have something like this:

[[Image:Legacy_spine_rpipe_1.jpeg|center|Note the extra part of the circles, they need to be removed to leave just a 90 degree section]]

Now you'll need to shave off the extra parts of the circles. First you should select the pipe beginning/end object and attatch all the loose circles to it (''The surface tool only works on a single object''). Now go into segment select mode and select all those extra loose segmenets and delete them. Hmm it looks like a rounded pipe to me :). Lets make a '''Referenced''' clone and apply the surface modifier so we can see our curved pipe.

===Spicing up the pipe ===

Right now, the pipe is pretty boring, so lets add rounded flanges on the end. This is a lot easier than it sounds. Remember, you don't have to do anything to make the referenced surface update, it'll do it by itself as you edit. You need to be in element edit mode(with the spline object selected) while doing the following. 

Lets start by cloning the end circle over twice, 16 units each time. Now lets uniformly scale the circle upwards by 120 (''Look at the XYZ fields at the bottom of the screen for the scale factor''). You should now have this:

[[Image:Legacy_spine_rpipe_2.jpeg|center|]]

The next part is a little tricky. We need to look in the front view and draw a circle using the edge creation method, and drag from left to right to connect the two shorter circles. Now attatch the newly created circle. As you may of noticed, the top of the is slightly taller then the circle we scaled by 120 earlier. To remedy this, cut endpoint snapping on and drag the small circle's vert to the top of the largest circle's vert. If done correctly they will snap and line up exactly(''Cut endpoint snapping off when you aren't using it''). Now is a good time to delete the extra lower half of the circle.

You may of noticed that the circle may not be in a shape you exactly like. You can change the shape by moving the handles on the circle's verts. Play around with them and you will get the shape you want. Mine turned out looking like this:

[[Image:Legacy_spine_rpipe_3.jpeg|center|Keeping the small piece lined up is the hardest part, but EndPoint snapping makes it a lot easier]]

Now, clone the circle we just made to the other parts of the circle. (''3 times in all, the left, right, and bottom'') Remember to rotate it 90 degrees each time to line it up, and if you have problems lining it up, use endpoint snapping to snap the small piece like you did on the top. (''Select the top vert at the top of the half-circle, drag it to the vert of the big circle''). If everything went well, you should be able to look at your referenced mesh and see the flange at the end of it. As you may of noticed, the concentration of polygons on the flange is very high. Lets use a less polygon intensive method on the other side.

Lets begin making our lower-poly flange by copying the top circle end up 32 units. Next use create line tool to draw a line between the top two verts of the two circles. &quot;But that doesn't look very round to me, and when I click on the verts of the line I don't see any handles?&quot;. Right you are, we are about to do something about that. You need to select both verts of JUST the line we created. To make this easier, under '''Selection''' in the '''Editable Spline''' check '''Segment End'''. This allows you to click on the segment and it selects the nearest vert that belongs to it. Hold control and select both verts of the line. After doing so, hold control and right click '''ON''' one of the verts. This will pop of a new menu. Go to '''Edit/Edit Spline Menu-&gt;Bezier'''. This converts the verts from corner to Bezier. Now you will be able to give the spline a nice curve by dragging the handles. Mine ended up like this:

[[Image:Legacy_spine_rpipe_4.jpeg|center|Handles do not make the line go exactly to their position, they only make the line 'lean' that way]]

All thats left to do is clone / rotate it like you did for the other end. The entire scene ended up looking like this:

[[Image:Legacy_spine_rpipe_5.jpeg|center|The flange on the right side is much more reasonable to be used]]

Notice how the second spline method we used resulted in less polys, and fits better with the polygon concentration of the rest of the object. Some would even suggest adding in second circle in the middle of the bend so the bend would be smoother. I'll leave that to you as a bonus exercise :) (''Hint, you'll have to divide the long splines that make the bend'')

==Wrapping it Up ==

In this tutorial we created a curved pipe and added rounded flanges using the basics of Bezier splines. I hope you learned much from this tutorial. Remember, using Max is a learning experience. I learn something almost every time I use it. For example, I never knew that you could convert Spline types using a menu until today. (Holding Control, Shift, or Alt all pop up different right click menus)

Sorry if the tutorial was a little vauge in places. The subject is a little hard to explain. As usual, I'm open to suggestions / comments  &amp;rarr;[[Legacy:Dr.Nick|Dr.Nick]]

'''Legal:''' Suggestion moderators (GodKings): Move this page to the 3DSM part of the Wiki.

'''Wormbo:''' Just link it from there.

'''Tarquin:''' Not sure what '3dsm' is &amp;ndash; link it from [[Legacy:Modeling|Modeling]]

'''Legal:''' Neither am I, but I got confused (thought it was another fancy UED3 thing) so move to Modelling/Spline... please.

'''Tarquin:''' I prefer not to have subpages unless they're clearly related. There aren't any &quot;areas&quot; of the wiki &amp;ndash; you create strcture by making links.

'''Foogod:''' I assume that &quot;3DSM&quot; is [[Legacy:3D Studio Max|3D Studio Max]], which is pretty clearly the specific modelling program this tutorial is geared at.  Given the required context, I actually think this would make sense as a subpage for that modelling program, since it's probably not that useful (and potentially rather confusing) for anybody using other software.  At the very least, there should be some mention somewhere of what program this thing is assuming the reader is using..

----

[[:Category:Legacy Tutorial]]http://buy-cialis.kucko.com

http://buy-levitra.kucko.com

http://buy-viagra-online.kucko.com

http://buy-viagra.kucko.com

http://cheap-cialis.kucko.com

http://cheap-levitra.kucko.com

http://cheap-viagra.kucko.com

http://cialis-online.kucko.com

http://cialis-viagra.kucko.com

http://cialis.kucko.com

http://generic-cialis.kucko.com

http://generic-viagra.kucko.com

http://levitra-online.kucko.com

http://levitra.kucko.com

http://order-viagra.kucko.com

http://viagra-levitra.kucko.com

http://viagra-online.kucko.com

http://viagra-prescription.kucko.com

http://viagra.kucko.com

http://adult-dating.adultfriendfindernow.com

http://adult-finder.adultfriendfindernow.com

http://adult-friend-find.adultfriendfindernow.com

http://adult-friend-finder-coupon.adultfriendfindernow.com

http://adult-friend-finder.adultfriendfindernow.com

http://adult-friend.adultfriendfindernow.com

http://adult-personals.adultfriendfindernow.com

http://adult-sex.adultfriendfindernow.com

http://adultfriendfinder-com.adultfriendfindernow.com

http://adultfriendfinder.adultfriendfindernow.com

http://free-adult-personals.adultfriendfindernow.com

http://friend-finder.adultfriendfindernow.com

http://photo-personals.adultfriendfindernow.com

http://sex-personals.adultfriendfindernow.com

http://adult-dating.adultfriendsite.com

http://adult-finder.adultfriendsite.com

http://adult-friend-find.adultfriendsite.com

http://adult-friend-finder-coupon.adultfriendsite.com

http://adult-friend-finder.adultfriendsite.com

http://adult-friend.adultfriendsite.com

http://adult-personals.adultfriendsite.com

http://adult-sex.adultfriendsite.com

http://adultfriendfinder-com.adultfriendsite.com

http://adultfriendfinder.adultfriendsite.com

http://free-adult-personals.adultfriendsite.com

http://friend-finder.adultfriendsite.com

http://photo-personals.adultfriendsite.com

http://sex-personals.adultfriendsite.com

http://adult-dating.dating999.com

http://adult-personals.dating999.com

http://christian-dating-service.dating999.com

http://christian-dating.dating999.com

http://dating-personals.dating999.com

http://dating-service.dating999.com

http://dating-site.dating999.com

http://dating-web-site.dating999.com

http://dating.dating999.com

http://free-dating.dating999.com

http://free-personals.dating999.com

http://internet-dating-service.dating999.com

http://internet-dating.dating999.com

http://on-line-dating.dating999.com

http://online-dating-service.dating999.com

http://online-dating.dating999.com

http://personals.dating999.com

http://photo-personals.dating999.com

http://singles-dating.dating999.com

http://buy-cialis.findbestpills.com

http://buy-levitra.findbestpills.com

http://buy-viagra-online.findbestpills.com

http://buy-viagra.findbestpills.com

http://cheap-cialis.findbestpills.com

http://cheap-levitra.findbestpills.com

http://cheap-viagra.findbestpills.com

http://cialis-online.findbestpills.com

http://cialis-viagra.findbestpills.com

http://cialis.findbestpills.com

http://generic-cialis.findbestpills.com

http://generic-viagra.findbestpills.com

http://levitra-online.findbestpills.com

http://levitra.findbestpills.com

http://order-viagra.findbestpills.com

http://viagra-levitra.findbestpills.com

http://viagra-online.findbestpills.com

http://viagra-prescription.findbestpills.com

http://viagra.findbestpills.com

http://adipex-online.diet-pills-now.net

http://adipex.diet-pills-now.net

http://buy-adipex.diet-pills-now.net

http://buy-didrex.diet-pills-now.net

http://buy-phentermine.diet-pills-now.net

http://buy-propecia.diet-pills-now.net

http://buy-soma.diet-pills-now.net

http://buy-tramadol.diet-pills-now.net

http://buy-ultram.diet-pills-now.net

http://carisoprodol.diet-pills-now.net

http://cheap-adipex.diet-pills-now.net

http://cheap-didrex.diet-pills-now.net

http://cheap-phentermine.diet-pills-now.net

http://cheap-propecia.diet-pills-now.net

http://cheap-soma.diet-pills-now.net

http://cheap-tramadol.diet-pills-now.net

http://didrex-online.diet-pills-now.net

http://didrex.diet-pills-now.net

http://order-phentermine.diet-pills-now.net

http://phentermine-online.diet-pills-now.net

http://phentermine-prescription.diet-pills-now.net

http://phentermine.diet-pills-now.net

http://propecia.diet-pills-now.net

http://purchase-phentermine.diet-pills-now.net

http://soma-online.diet-pills-now.net

http://soma.diet-pills-now.net

http://tramadol-online.diet-pills-now.net

http://tramadol.diet-pills-now.net

http://ultram-online.diet-pills-now.net

http://ultram.diet-pills-now.net

http://adult-sex-toys.fabuloussextoys.com

http://adult-toy-store.fabuloussextoys.com

http://adult-toys.fabuloussextoys.com

http://anal-toy.fabuloussextoys.com

http://big-dildo.fabuloussextoys.com

http://brutal-dildo.fabuloussextoys.com

http://dildo-vibrator.fabuloussextoys.com

http://dildo.fabuloussextoys.com

http://huge-dildo.fabuloussextoys.com

http://jack-rabbit-vibrator.fabuloussextoys.com

http://rabbit-vibrator.fabuloussextoys.com

http://sex-movie.fabuloussextoys.com

http://sex-shop.fabuloussextoys.com

http://sex-toy-shop.fabuloussextoys.com

http://sex-toy-store.fabuloussextoys.com

http://sex-toy.fabuloussextoys.com

http://sex-toys.fabuloussextoys.com

http://sex-videos.fabuloussextoys.com

http://vibrator.fabuloussextoys.com

http://vibrators.fabuloussextoys.com
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A Simple Mesh Using Splines</title>
    <id>756</id>
    <revision>
      <id>2163</id>
      <timestamp>2002-10-11T14:44:56Z</timestamp>
      <contributor>
        <ip>Dr.Nick</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is my first tutorial ever so bear with me :).

==Preface ==

This tutorial expects that you know your way around Max, so things like applying materials and UVW mapping will not be covered here &amp;rarr; there are other pages for that.

If you have never worked with splines before, hopefully after reading this article you will think totally differently about how you model. Splines have features such as easy level of detail adjustment without having to handle meshes on a per-face basis. Splines are basically a bunch of lines that can be shaped to create a 'skeleton' (Officially known as a Spline Network) of an object. You then apply the surface modifier to this skeleton to get an actual object. 

==Getting Started ==

In this tutorial we will be creating a T-Section pipe. The principles used to create this object can be generally be applied to almost everything you can think of.

To get started, first we need to set our grid to a power of two, 8 or 16 is a good number, I also suggest cutting gridsnap on. Next draw a circle with the radius of 64 in the left view. After doing so, convert it to an editable spline. Go to the modify tab and select element. Select the circle we just created and clone(shift+drag) it over 128 units  Do this 2 more times until you end up with the following:

[[Image:Legacy_spline_pipe_1.jpeg|center|Starting to make our 'skeleton']]

This has created the main body of our pipe. You're probably wondering how a bunch of circles is going to help us make a pipe but you will soon see :)

Select a circle (in the top view) and clone it. We now need to rotate it 90 degrees (have Angle snapping on) so we can create the connecting pipe. After doing so, position it between the middle two circles. Now clone it down 128 Units. We now need to go into Segment mode and select the top two segments of a circle (In the top view) and copy it to the middle of the long pipe(It will be 64 units from either existing circle). You should end up with something like this:

[[Image:Legacy_spline_pipe_2.jpeg|center|See all those X's? We're about to play connect the dots between them]]

The reason we did this is so that the other pipe will have something to connect to. The thing about splines is that all spline vertexes must be connect via another spline. Gaps will cause the surface not to be created.

Now that we have all of our curved splines made, we can make the splines (lines in this case) that connect them all. You MUST cut endpoint snapping on for this to work correctly. Go through connecting all of the verts that are parallel to each other (It'll make sense once you do it a while) using the new line option under the editable spline modifier.   ''NOTE&amp;rarr;The order in which you create the spline determines which way the normals will point by default. Try to make them all run in the same direction''

A neat thing about splines is that you can create a reference copy of the base spline skeleton and edit the surface it creates in real time. To do it, all you have to do is select the editable spline (The entire object, with no selection modes active) clone it to a new location, and when Max pops the '''Clone Options''' Dialog up, select '''Reference'''. Now apply the Surface Modifier and hopefully a meshed version of your pipe will show up. Also, make sure '''Remove Interior Patches''' is checked, and check '''Flip Normals''' if the object is inside-out. Right now is a good time to adjust the resolution by changing the 'Patch Topology Steps' (Higher is more polys).

[[Image:Legacy_spline_pipe_3.jpeg|center|Finished spline 'skeleton' and referenced surface]]

If you didn't end up with this, make sure that you didn't miss any verts while adding lines, and that they are all lined up (Having endpoint snap on should of prevented this though). This is the number one step that where you will run into problems. I have noticed that sometimes a mesh just refuses to be created. In that case, just re-make your lines (Not the circles). The nice thing about having the referenced copy is that you can watch the mesh being re-generated as you create (or move!) the lines. A matter of fact, you could of created this reference copy from the very beginning and watched the mesh be created as you placed all of the splines.

==Finishing Up ==

If you are happy with the results, you can now convert the surface to an editable mesh and apply the optimize modifier. The modifier generally does a good job at removing redundant polys, and you can always do any final editing in its mesh state. I do suggest keeping the spline 'skeleton' in case you ever need to change it. 

Remember, these are just the basics, but can be applied in different ways. Look for my advanced tutorial on creating 'curved' and 'rounded' objects.

----

Comments / suggestions welcome at hawkeye 'at' everyzero.com &amp;rarr;[[Legacy:Dr.Nick|Dr.Nick]]</text>
    </revision>
    <revision>
      <id>2164</id>
      <timestamp>2002-10-11T14:44:32Z</timestamp>
      <contributor>
        <ip>Dr.Nick</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is my first tutorial ever so bear with me :).

==Preface ==

This tutorial expects that you know your way around Max, so things like applying materials and UVW mapping will not be covered here &amp;rarr; there are other pages for that.

If you have never worked with splines before, hopefully after reading this article you will think totally differently about how you model. Splines have features such as easy level of detail adjustment without having to handle meshes on a per-face basis. Splines are basically a bunch of lines that can be shaped to create a 'skeleton' (Officially known as a Spline Network) of an object. You then apply the surface modifier to this skeleton to get an actual object. 

==Getting Started ==

In this tutorial we will be creating a T-Section pipe. The principles used to create this object can be generally be applied to almost everything you can think of.

To get started, first we need to set our grid to a power of two, 8 or 16 is a good number, I also suggest cutting gridsnap on. Next draw a circle with the radius of 64 in the left view. After doing so, convert it to an editable spline. Go to the modify tab and select element. Select the circle we just created and clone(shift+drag) it over 128 units  Do this 2 more times until you end up with the following:

[[Image:Legacy_spline_pipe_1.jpeg|center|Starting to make our 'skeleton']]

This has created the main body of our pipe. You're probably wondering how a bunch of circles is going to help us make a pipe but you will soon see :)

Select a circle (in the top view) and clone it. We now need to rotate it 90 degrees (have Angle snapping on) so we can create the connecting pipe. After doing so, position it between the middle two circles. Now clone it down 128 Units. We now need to go into Segment mode and select the top two segments of a circle (In the top view) and copy it to the middle of the long pipe(It will be 64 units from either existing circle). You should end up with something like this:

[[Image:Legacy_spline_pipe_2.jpeg|center|See all those X's? We're about to play connect the dots between them]]

The reason we did this is so that the other pipe will have something to connect to. The thing about splines is that all spline vertexes must be connect via another spline. Gaps will cause the surface not to be created.

Now that we have all of our curved splines made, we can make the splines (lines in this case) that connect them all. You MUST cut endpoint snapping on for this to work correctly. Go through connecting all of the verts that are parallel to each other (It'll make sense once you do it a while) using the new line option under the editable spline modifier.   ''NOTE&amp;rarr;The order in which you create the spline determines which way the normals will point by default. Try to make them all run in the same direction''

A neat thing about splines is that you can create a reference copy of the base spline skeleton and edit the surface it creates in real time. To do it, all you have to do is select the editable spline (The entire object, with no selection modes active) clone it to a new location, and when Max pops the '''Clone Options''' Dialog up, select '''Reference'''. Now apply the Surface Modifier and hopefully a meshed version of your pipe will show up. Also, make sure '''Remove Interior Patches''' is checked, and check '''Flip Normals''' if the object is inside-out. Right now is a good time to adjust the resolution by changing the 'Patch Topology Steps' (Higher is more polys).

[[Image:Legacy_spline_pipe_3.jpeg|center|Finished spline 'skeleton' and referenced surface]]

If you didn't end up with this, make sure that you didn't miss any verts while adding lines, and that they are all lined up (Having endpoint snap on should of prevented this though). This is the number one step that where you will run into problems. I have noticed that sometimes a mesh just refuses to be created. In that case, just re-make your lines (Not the circles). The nice thing about having the referenced copy is that you can watch the mesh being re-generated as you create (or move!) the lines. A matter of fact, you could of created this reference copy from the very beginning and watched the mesh be created as you placed all of the splines.

==Finishing Up ==

If you are happy with the results, you can now convert the surface to an editable mesh and apply the optimize modifier. The modifier generally does a good job at removing redundant polys, and you can always do any final editing in its mesh state. I do suggest keeping the spline 'skeleton' in case you ever need to change it. 

Remember, these are just the basics, but can be applied in different ways. Look for my advanced tutorial on creating 'curved' and 'rounded' objects.

----

Comments / suggestions welcome at hawkeye 'at' everyzero.com ~~~</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A Space</title>
    <id>926</id>
    <revision>
      <id>2529</id>
      <timestamp>2008-02-23T23:57:32Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Creating A Space

The most important things with a map is that there is actually a subtracted space where the players can move around.

By following this tutorial you will learn how to create such a space in two different ways.

Good to know tip:

A player is about 96 units tall, and 50 units wide.

First of all you probably already have your editor open and are ready to try the things you will be told to here.

If not try to look for your UT3Editor in: Start - All Programs - Unreal Tournament 3 - Unreal Tournament 3 Editor if you cant find it, try looking in the root folder of your installed game.

1. Click File - New (or click on the icon of a blank piece of paper) in the upper left corner of your screen.

2. Now you will have to choose the geometry style of your level. Additive means that there is already a huge space and you build your map in it, so if you want this style just &quot;Click additive and OK&quot; and you have a subtracted space. In other words, for additive levels you would now already have a subtracted space and you are done. (Still even in additive levels you most likely need to know how to subtract spaces, so I would recommend following the subtractive way of this tutorial.

If you want a subtractive level where everything is already a huge filled space and you create rooms inside. This may seem like a worse way but it can be quite useful most of the times, but is still depending on the map you want. Click Subtractive and OK.

3. Now that we have a new map open you right click the &quot;Cube&quot; icon, in the left menu showing many fancy green icons.

4. Then now we can set the size on our cube in the X, Y, and Z axis.As for now we can enter in &quot;X=512, Y=512, and Z=256&quot; then click &quot;Build&quot;

5. now click CSG:Subtract. Find it in the left menu.

6. Now your 3D view should have been surrounded by some chess looking thing. If not, you can attempt to move your 3D camera, using the mouse. Rick click=Forward and turn. Left Click=Turn all directions. Both=Move camera up/side. Move a little around in your hollow cube and try 2 get the hang of it.

Congratulations, if you did this correctly, you now have a hollow space where you can fool around.

----

==Discussion==

'''Raven:''' Testing that I have done seems to indicate that a subtractive world is not as efficient as a additive world. Does anyone else get this drop in frame rates using subtractive?

'''MythOpus:''' Well as far as I know games like FEAR and the Half Life series all use 'additive worlds' and while the majority of it is related to lots and lots of optimization systems, framerates are pretty wonderful considering how much stuff they put into a scene at a given time.  On the other hand UED has been using the 'subtractive' world afaik straight from the release of Unreal 1 so I don't think they would have avoided Additive game worlds if they thought 'subtractive' game worlds were worse.  Just speculation of course.

'''MrVortex:''' Well I suppose it is mostly depending on the map you want to make. For things like space and such I use additive, while I use subtractive for cave like maps. Both can be useful to know.</text>
    </revision>
    <revision>
      <id>2530</id>
      <timestamp>2008-02-13T16:46:19Z</timestamp>
      <contributor>
        <ip>69-11-86-35.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Creating A Space

First of all we need a place where the players should be.

We will begin quite simple by making a box where you want 2 play.

Good to know tip:

A player is about 96 units tall, and 50 units wide.

First of all, I will assume that you have already started the Unreal Tournament 3 Editor. ^^

1. Click File - New (or click on the icon of a blank pice of paper) in the upper left corner of your screen.

2. Now you will have to choose the geometry style of your level. Additive means that there is already a huge space and you build your map in it, and subtractive means that everything is filled and you must subtract your own space. Believe it or not, but subtracting is most often the easiest way, and the most used one. Click Subtractive and OK.

3. Now that we have a new map open you right click the &quot;Cube&quot; icon, in the left menu showing many fancy green icons.

4. Then now we can set the size on our cube in the X, Y, and Z axis.As for now we can enter in &quot;X=512, Y=512, and Z=256&quot; then click &quot;Build&quot;

5. now click CSG:Subtract. Find it in the left menu.

6. Now your 3D view should have been surrounded by some chess looking thing. If not, you can attempt to move your 3D camera, using the mouse. Rick click=Forward and turn. Left Click=Turn all directions. Both=Move camera up/side. Move a little around in your hollow cube and try 2 get the hang of it.

That is it, you have created a hollow space.

----

'''Raven:''' Testing that I have done seems to indicate that a subtractive world is not as efficient as a additive world. Does anyone else get this drop in frame rates using subtractive?

'''MythOpus:''' Well as far as I know games like FEAR and the Half Life series all use 'additive worlds' and while the majority of it is related to lots and lots of optimization systems, framerates are pretty wonderful considering how much stuff they put into a scene at a given time.  On the other hand UED has been using the 'subtractive' world afaik straight from the release of Unreal 1 so I don't think they would have avoided Additive game worlds if they thought 'subtractive' game worlds were worse.  Just speculation of course.</text>
    </revision>
    <revision>
      <id>2531</id>
      <timestamp>2008-02-23T23:57:02Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Creating A Space==

The most important things with a map is that there is actually a subtracted space where the players can move around.

By following this tutorial you will learn how to create such a space in two different ways.

Good to know tip:

A player is about 96 units tall, and 50 units wide.

First of all you probably already have your editor open and are ready to try the things you will be told to here.

If not try to look for your UT3Editor in: Start - All Programs - Unreal Tournament 3 - Unreal Tournament 3 Editor if you cant find it, try looking in the root folder of your installed game.

1. Click File - New (or click on the icon of a blank piece of paper) in the upper left corner of your screen.

2. Now you will have to choose the geometry style of your level. Additive means that there is already a huge space and you build your map in it, so if you want this style just &quot;Click additive and OK&quot; and you have a subtracted space. In other words, for additive levels you would now already have a subtracted space and you are done. (Still even in additive levels you most likely need to know how to subtract spaces, so I would recommend following the subtractive way of this tutorial.

If you want a subtractive level where everything is already a huge filled space and you create rooms inside. This may seem like a worse way but it can be quite useful most of the times, but is still depending on the map you want. Click Subtractive and OK.

3. Now that we have a new map open you right click the &quot;Cube&quot; icon, in the left menu showing many fancy green icons.

4. Then now we can set the size on our cube in the X, Y, and Z axis.As for now we can enter in &quot;X=512, Y=512, and Z=256&quot; then click &quot;Build&quot;

5. now click CSG:Subtract. Find it in the left menu.

6. Now your 3D view should have been surrounded by some chess looking thing. If not, you can attempt to move your 3D camera, using the mouse. Rick click=Forward and turn. Left Click=Turn all directions. Both=Move camera up/side. Move a little around in your hollow cube and try 2 get the hang of it.

Congratulations, if you did this correctly, you now have a hollow space where you can fool around.

----

==Discussion==

'''Raven:''' Testing that I have done seems to indicate that a subtractive world is not as efficient as a additive world. Does anyone else get this drop in frame rates using subtractive?

'''MythOpus:''' Well as far as I know games like FEAR and the Half Life series all use 'additive worlds' and while the majority of it is related to lots and lots of optimization systems, framerates are pretty wonderful considering how much stuff they put into a scene at a given time.  On the other hand UED has been using the 'subtractive' world afaik straight from the release of Unreal 1 so I don't think they would have avoided Additive game worlds if they thought 'subtractive' game worlds were worse.  Just speculation of course.

'''MrVortex:''' Well I suppose it is mostly depending on the map you want to make. For things like space and such I use additive, while I use subtractive for cave like maps. Both can be useful to know.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A TCP Client</title>
    <id>819</id>
    <revision>
      <id>2304</id>
      <timestamp>2007-11-18T22:03:15Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi, This sample is to showing you how to create quikely a [[Wikipedia:TCP]] client for UT2003. - Matthieu29 -

===The &quot;TCP&quot; class:===

It will send to an external progam, some text messages. I created this code to let's know in real time the status of the game by an external application.

'''''For infos:''''' For my personal usage, all messages get a &quot;line feed&quot; caracter at the end but, for general purpose, it's not needed. ;)

The client have to connect to a server, so we set the server's port thanks to the default property variable &quot;RemotePort&quot;. The server's address can be set too.

&lt;uscript&gt;

Class MyTcp extends TcpLink;

var int  RemotePort;    // Port of the server to connect
var char ServerAddress; // Address of the server to connect  // Seems to be string in UT2004
var string LF;          // Used for linefeed &quot;\n&quot; 

//------------------------------------------------------------------------------

// First function called (init of the TCP connection)
Function InitTcpLinkEventLogger()
 {
 LF = Chr(10); // Line feed char &quot;\n&quot;

 Log(&quot;InitTcpLinkEventLogger: Will start TCP connection!&quot;);

 Resolve(ServerAddress);   // Resolve the address of the server
}                     

//------------------------------------------------------------------------------

Function Cclose() // Closes the current connection.
{
 Close();
}

//------------------------------------------------------------------------------

Function int SendText (coerce string Str)  // Send the string &quot;Str&quot; + &quot;line feed&quot; car
{
 local int result;

 result = super.SendText(Str$LF);  // Call the super (send the text)
 Log (&quot;SentText: &quot; $Str$&quot; , (Number of bytes sent: &quot;$result$&quot;)&quot;);
 return result;
}

//--EVENTS--

// Called when the IP is resolved
Event Resolved( IpAddr Addr )
{
  Log(&quot;OK, Address resolved&quot;);
  Addr.Port = remotePort;
  BindPort();         // In UnrealTournament, the CLIENT have to make a bind to create a socket! (Not as a classic TCP connection!!!)

  ReceiveMode = RMODE_Event;  // Incomming messages are triggering events
  LinkMode = MODE_Text;       // We expect to receive texts (if we receive datas)
  Open(Addr);                 // Open the connection

  Log (&quot;Connected =&gt; Port :&quot;$Addr.port$&quot; Address :&quot;$Addr.Addr);
}

//------------------------------------------------------------------------------

// If the IP was not resolved...
Event ResolveFailed()
{
  log(&quot;### Error, resolve failed!!!&quot;);
}

//------------------------------------------------------------------------------

event Opened()
{
  log(&quot;Ok, connection opened&quot;);
}

//------------------------------------------------------------------------------

// If somebody has close the connection...
Event Closed()
{
  log(&quot;Connection closed&quot;);
}

//------------------------------------------------------------------------------

// Called when a string is received
Event ReceivedText (string Text)
{
  // We have just received a string !
  Log(&quot;Read string: &quot;$Text$&quot; Size : &quot;$Len(Text));
}

//------------------------------------------------------------------------------

defaultproperties
  {
  ServerAddress=&quot;127.0.0.1&quot;  // Remote server address
  remotePort=3850            // Remote port number
  }

&lt;/uscript&gt;

===Ok, now how to use it:===

* Create a '''MyTCPLink''' class
* Call '''InitTcpLinkEventLogger'''()
* Call '''SendText'''(&quot;A beautifull string&quot;)
* Call '''Cclose'''()

ReceivedText() is called when you receive some datas (I didn't tested this part of code, but there is no reasons it dosen't works) :)  

&lt;uscript&gt;

// Somewhere in a class.....

var MyTcp ATcp;  


simulated event PostBeginPlay()
  {
  Super.PostBeginPlay();          // call the super class
  ATcp=Spawn(class'MyTcp'); // Instanciate MyTCP class
  ATcp.InitTcpLinkEventLogger();  // Init the connection
  }

[...]

// Somewhere in a function in this class...
ATcp.SendText (&quot;Hello word&quot;);    // The classic !

&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2305</id>
      <timestamp>2007-01-22T17:02:56Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi, This sample is to showing you how to create quikely a [[Wikipedia:TCP]] client for UT2003. - Matthieu29 -

===The &quot;TCP&quot; class:===

It will send to an external progam, some text messages. I created this code to let's know in real time the status of the game by an external application.

'''''For infos:''''' For my personal usage, all messages get a &quot;line feed&quot; caracter at the end but, for general purpose, it's not needed. ;)

The client have to connect to a server, so we set the server's port thanks to the default property variable &quot;RemotePort&quot;. The server's address can be set too.

&lt;uscript&gt;

Class MyTcp extends TcpLink;

var int  RemotePort;    // Port of the server to connect
var char ServerAddress; // Address of the server to connect  // Seems to be string in UT2004
var string LF;          // Used for linefeed &quot;\n&quot; 

//------------------------------------------------------------------------------

// First function called (init of the TCP connection)
Function InitTcpLinkEventLogger()
 {
 LF = Chr(10); // Line feed char &quot;\n&quot;

 Log(&quot;InitTcpLinkEventLogger: Will start TCP connection!&quot;);

 Resolve(ServerAddress);   // Resolve the address of the server
}                     

//------------------------------------------------------------------------------

Function Cclose() // Closes the current connection.
{
 Close();
}

//------------------------------------------------------------------------------

Function int SendText (coerce string Str)  // Send the string &quot;Str&quot; + &quot;line feed&quot; car
{
 local int result;

 result = super.SendText(Str$LF);  // Call the super (send the text)
 Log (&quot;SentText: &quot; $Str$&quot; , (Number of bytes sent: &quot;$result$&quot;)&quot;);
 return result;
}

//--EVENTS--

// Called when the IP is resolved
Event Resolved( IpAddr Addr )
{
  Log(&quot;OK, Address resolved&quot;);
  Addr.Port = remotePort;
  BindPort();         // In UnrealTournament, the CLIENT have to make a bind to create a socket! (Not as a classic TCP connection!!!)

  ReceiveMode = RMODE_Event;  // Incomming messages are triggering events
  LinkMode = MODE_Text;       // We expect to receive texts (if we receive datas)
  Open(Addr);                 // Open the connection

  Log (&quot;Connected =&gt; Port :&quot;$Addr.port$&quot; Address :&quot;$Addr.Addr);
}

//------------------------------------------------------------------------------

// If the IP was not resolved...
Event ResolveFailed()
{
  log(&quot;### Error, resolve failed!!!&quot;);
}

//------------------------------------------------------------------------------

event Opened()
{
  log(&quot;Ok, connection opened&quot;);
}

//------------------------------------------------------------------------------

// If somebody has close the connection...
Event Closed()
{
  log(&quot;Connection closed&quot;);
}

//------------------------------------------------------------------------------

// Called when a string is received
Event ReceivedText (string Text)
{
  // We have just received a string !
  Log(&quot;Read string: &quot;$Text$&quot; Size : &quot;$Len(Text));
}

//------------------------------------------------------------------------------

defaultproperties
  {
  ServerAddress=&quot;127.0.0.1&quot;  // Remote server address
  remotePort=3850            // Remote port number
  }

&lt;/uscript&gt;

===Ok, now how to use it:===

* Create a '''MyTCPLink''' class
* Call '''InitTcpLinkEventLogger'''()
* Call '''SendText'''(&quot;A beautifull string&quot;)
* Call '''Cclose'''()

ReceivedText() is called when you receive some datas (I didn't tested this part of code, but there is no reasons it dosen't works) :)  

&lt;uscript&gt;

// Somewhere in a class.....

var MyTcp ATcp;  


simulated event PostBeginPlay()
  {
  Super.PostBeginPlay();          // call the super class
  ATcp=Spawn(class'MyTcp'); // Instanciate MyTCP class
  ATcp.InitTcpLinkEventLogger();  // Init the connection
  }

[...]

// Somewhere in a function in this class...
ATcp.SendText (&quot;Hello word&quot;);    // The classic !

&lt;/uscript&gt;

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34626</id>
      <timestamp>2009-08-06T20:02:01Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <text xml:space="preserve">Hi, This sample is to showing you how to create quikely a [[Wikipedia:TCP]] client for UT2003. - Matthieu29 -

===The &quot;TCP&quot; class:===

It will send to an external progam, some text messages. I created this code to let's know in real time the status of the game by an external application.

'''''For infos:''''' For my personal usage, all messages get a &quot;line feed&quot; caracter at the end but, for general purpose, it's not needed. ;)

The client have to connect to a server, so we set the server's port thanks to the default property variable &quot;RemotePort&quot;. The server's address can be set too.

&lt;uscript&gt;

Class MyTcp extends TcpLink;

var int  RemotePort;    // Port of the server to connect
var char ServerAddress; // Address of the server to connect  // Seems to be string in UT2004
var string LF;          // Used for linefeed &quot;\n&quot; 

//------------------------------------------------------------------------------

// First function called (init of the TCP connection)
Function InitTcpLinkEventLogger()
 {
 LF = Chr(10); // Line feed char &quot;\n&quot;

 Log(&quot;InitTcpLinkEventLogger: Will start TCP connection!&quot;);

 Resolve(ServerAddress);   // Resolve the address of the server
}                     

//------------------------------------------------------------------------------

Function Cclose() // Closes the current connection.
{
 Close();
}

//------------------------------------------------------------------------------

Function int SendText (coerce string Str)  // Send the string &quot;Str&quot; + &quot;line feed&quot; char
{
 local int result;

 result = super.SendText(Str$LF);  // Call the super (send the text)
 Log (&quot;SentText: &quot; $Str$&quot; , (Number of bytes sent: &quot;$result$&quot;)&quot;);
 return result;
}

//--EVENTS--

// Called when the IP is resolved
Event Resolved( IpAddr Addr )
{
  Log(&quot;OK, Address resolved&quot;);
  Addr.Port = remotePort;
  BindPort();         // In UnrealTournament, the CLIENT have to make a bind to create a socket! (Not as a classic TCP connection!!!)

  ReceiveMode = RMODE_Event;  // Incomming messages are triggering events
  LinkMode = MODE_Text;       // We expect to receive texts (if we receive datas)
  Open(Addr);                 // Open the connection

  Log (&quot;Connected =&gt; Port :&quot;$Addr.port$&quot; Address :&quot;$Addr.Addr);
}

//------------------------------------------------------------------------------

// If the IP was not resolved...
Event ResolveFailed()
{
  log(&quot;### Error, resolve failed!!!&quot;);
}

//------------------------------------------------------------------------------

event Opened()
{
  log(&quot;Ok, connection opened&quot;);
}

//------------------------------------------------------------------------------

// If somebody has close the connection...
Event Closed()
{
  log(&quot;Connection closed&quot;);
}

//------------------------------------------------------------------------------

// Called when a string is received
Event ReceivedText (string Text)
{
  // We have just received a string !
  Log(&quot;Read string: &quot;$Text$&quot; Size : &quot;$Len(Text));
}

//------------------------------------------------------------------------------

defaultproperties
  {
  ServerAddress=&quot;127.0.0.1&quot;  // Remote server address
  remotePort=3850            // Remote port number
  }

&lt;/uscript&gt;

===Ok, now how to use it:===

* Create a '''MyTCPLink''' class
* Call '''InitTcpLinkEventLogger'''()
* Call '''SendText'''(&quot;A beautifull string&quot;)
* Call '''Cclose'''()

ReceivedText() is called when you receive some datas (I didn't tested this part of code, but there is no reasons it dosen't works) :)  

&lt;uscript&gt;

// Somewhere in a class.....

var MyTcp ATcp;  


simulated event PostBeginPlay()
  {
  Super.PostBeginPlay();          // call the super class
  ATcp=Spawn(class'MyTcp'); // Instanciate MyTCP class
  ATcp.InitTcpLinkEventLogger();  // Init the connection
  }

[...]

// Somewhere in a function in this class...
ATcp.SendText (&quot;Hello word&quot;);    // The classic !

&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34627</id>
      <timestamp>2009-08-06T20:15:40Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <text xml:space="preserve">Hi, This sample is to showing you how to create quikely a [[Wikipedia:TCP]] client for UT2003. - Matthieu29 -

===The &quot;TCP&quot; class:===

It will send to an external progam, some text messages. I created this code to let's know in real time the status of the game by an external application.

'''''For infos:''''' For my personal usage, all messages get a &quot;line feed&quot; caracter at the end but, for general purpose, it's not needed. ;)

The client have to connect to a server, so we set the server's port thanks to the default property variable &quot;RemotePort&quot;. The server's address can be set too.

&lt;uscript&gt;

Class MyTcp extends TcpLink;

var int  RemotePort;    // Port of the server to connect
var char ServerAddress; // Address of the server to connect  // Seems to be string in UT2004
var string LF;          // Used for linefeed &quot;\n&quot; 

//------------------------------------------------------------------------------

// First function called (init of the TCP connection)
Function InitTcpLinkEventLogger()
 {
 LF = Chr(10); // Line feed char &quot;\n&quot;

 Log(&quot;InitTcpLinkEventLogger: Will start TCP connection!&quot;);

 Resolve(ServerAddress);   // Resolve the address of the server
}                     

//------------------------------------------------------------------------------

Function Cclose() // Closes the current connection.
{
 Close();
}

//------------------------------------------------------------------------------

Function int SendText (coerce string Str)  // Send the string &quot;Str&quot; + &quot;line feed&quot; char
{
 local int result;

 result = super.SendText(Str$LF);  // Call the super (send the text)
 Log (&quot;SentText: &quot; $Str$&quot; , (Number of bytes sent: &quot;$result$&quot;)&quot;);
 return result;
}

//--EVENTS--

// Called when the IP is resolved
Event Resolved( IpAddr Addr )
{
  Log(&quot;OK, Address resolved&quot;);
  Addr.Port = remotePort;
  BindPort();         // In UnrealTournament, the CLIENT has to make a bind to create a socket! (Not as a classic TCP connection!!!)

  ReceiveMode = RMODE_Event;  // Incomming messages are triggering events
  LinkMode = MODE_Text;       // We expect to receive text (if we receive data)
  Open(Addr);                 // Open the connection

  Log (&quot;Connected =&gt; Port: &quot;$Addr.port$&quot; Address: &quot;$Addr.Addr);
}

//------------------------------------------------------------------------------

// If the IP was not resolved...
Event ResolveFailed()
{
  Log(&quot;### Error, resolve failed!!!&quot;);
}

//------------------------------------------------------------------------------

event Opened()
{
  Log(&quot;Ok, connection opened&quot;);
}

//------------------------------------------------------------------------------

// If somebody has close the connection...
Event Closed()
{
  Log(&quot;Connection closed&quot;);
}

//------------------------------------------------------------------------------

// Called when a string is received
Event ReceivedText (string Text)
{
  // We have just received a string !
  Log(&quot;Read string: &quot;$Text$&quot; Size : &quot;$Len(Text));
}

//------------------------------------------------------------------------------

defaultproperties
  {
  ServerAddress=&quot;127.0.0.1&quot;  // Remote server address
  remotePort=3850            // Remote port number
  }

&lt;/uscript&gt;

===Ok, now how to use it:===

* Create a '''MyTCPLink''' class
* Call '''InitTcpLinkEventLogger'''()
* Call '''SendText'''(&quot;A beautifull string&quot;)
* Call '''Cclose'''()

ReceivedText() is called when you receive some datas (I didn't tested this part of code, but there is no reasons it dosen't works) :)  

&lt;uscript&gt;

// Somewhere in a class.....

var MyTcp ATcp;  


simulated event PostBeginPlay()
  {
  Super.PostBeginPlay();          // call the super class
  ATcp=Spawn(class'MyTcp'); // Instanciate MyTCP class
  ATcp.InitTcpLinkEventLogger();  // Init the connection
  }

[...]

// Somewhere in a function in this class...
ATcp.SendText (&quot;Hello world&quot;);    // The classic !

&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A Terrain</title>
    <id>795</id>
    <revision>
      <id>2251</id>
      <timestamp>2008-03-14T13:46:18Z</timestamp>
      <contributor>
        <ip>JeffMOD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This page is one of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].'' 

This tutorial shows you how to quickly make a [[Legacy:Terrain|terrain]] in [[Legacy:UnrealEd 3|UnrealEd 3]]. This applies to the retail version of [[Legacy:UT2003|UT2003]]; other games' editors may be different versions of UnrealEd in which the tools don't all work, eg [[Legacy:U2|U2]].

There is full reference for UnrealEd's terrain tools at [[Legacy:Terrain Mode|Terrain Mode]].

==Preliminaries==

We need a suitable [[Legacy:Zone|zone]] to hold the terrain.

===The World Space ===

If you don't already have some open space in your map for the terrain, [[Legacy:Create A Room|create a room]]. If this is your first terrain, we recommend a large space: a box 8192x8192x8192 [[Legacy:UU|UU]] in size should do. But bear in mind that terrains can be created as big or as small as you want (and you can also have as many as you want). A terrain could be a small area of a map within architecture, such as a sandy courtyard, or the basic world space, such as with a large outdoor level.

===Zone===

Next [[Legacy:Add An Actor|add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] if you don't already have one. This sets properties for this zone; and in particular we're going to use it to tell the engine that you want to render terrain in this zone. 

Now [[Legacy:Set The Following Properties|set the following properties]] of the ZoneInfo actor:

* ZoneInfo -&gt; bTerrainZone = '''True'''
* In a very large space, we recommend Display -&gt; DrawScale = 8 or 12 or something so you can see the actor easily

You'll need to [[Legacy:Rebuild|rebuild]] your map for the ZoneInfo to be tied to the zone it sits in.

===Terrain size===

Before you begin making the terrain, it's best to consider what size you want it to be. 

Each pixel of the terrain's heightmap texture will represent one grid intersection of terrain, or ''quad''. By default, a quad is 64x64 [[Legacy:UU|UU]]. So for example, a 256x256 pixel heightmap texture will produce a terrain that is 64 x 255 in each direction. Note the 255, not 256: each pixel represents the height of a grid ''intersection'', not a grid square. This means that terrain has what you might consider to be [[Wikipedia:Fencepost error]].

UnrealEd appears to allow you to create rectangular terrain, but the texture layers will cause it to crash later on if they are not square.

You can change the scale at any time to resize your terrain, but it will scale all your terrain's features too (which might not be what you want), and you'll also be off-grid (which might make things tricky).

Remember also that texture dimensions must be powers of 2: this limits your choice of possible terrain sizes. Roughly speaking, you'll probably want 256x256 for a large area, 512x512 for a HUGE area, and for things like sand in the corner of a room, as small as 16x16 perhaps. To measure out your terrain, try using the Cube Brushbuilder and enter dimensions in the format &quot;64*n&quot; for width and breadth. This will give you the heightmap texture dimensions for standard terrain scale.

For the purposes of this tutorial, 128x128 is adaquate for the 8192x8192x8192 box we have created.

==Making the Terrain==

There are two methods here. 
# you can create from scratch in UnrealEd and use the internal tools to raise hills and drop valleys. This is the simplest and quickest method.
# or you can make a heightmap texture in an external [[Legacy:Graphics Application|graphics application]], and import it. With this method, you'll be able to edit in UnrealEd later anyway.

===From Scratch===

This method adds a TerrainInfo actor for you automatically, and also creates a new heightmap texture for you.

# go into [[Legacy:Terrain Mode|Terrain mode]]
# Select the &quot;Tools&quot; tab at the top of the floating Terrain Editing Window, then the &quot;Terrains&quot; tab below that
# Click on the &quot;new terrain&quot; icon (it just looks like a blank page at the very foot of the tab area)
# This pops up a New Terrain window. Set:
#* Package: the [[Legacy:Package|package]] in which to store the new heightmap texture. Use [[Legacy:MyLevel|MyLevel]] to embed it within you map
#* Group: whatever you like
#* Name: this will be the name of the heightmap texture that will be created. It will also be used to identify your terrain in the Terrain Mode window, so in a map with many terrains it's a good idea to use a clear name, eg 'RedBaseSand' not 'Terrain1'.
#* XSize &amp; YSize : the size of the heightmap texture in pixels.
#* Height : the height of terrain that the midpoint grey in the heighmap texture will represent. This sets the vertical location of the initial plane of the terrain ''in relation to the game world.'' There is little to no reason for changing this. ''It can separate the terrain grid from the TerrainInfo actor marker and there does not seem to be a way to change it afterwards.''
# Click OK

Now go into wireframe view. The [[Legacy:TerrainInfo|TerrainInfo]] actor has been added for you and the terrain is ready for painting. Because the TerrainInfo has been added at the camera position, you'll need to move the camera about to see the terrain: it currently should look like a very big wireframe grid. You'll probably need to move up and look down to see it. If you don't see the grid, but only the TerrainInfo actor icon, try switching back to the Move tool and move the TerrainInfo slightly for UnrealEd to wake up.

You also may want to position the actor so the terrain's grid lines up with the world grid: do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Reset -&gt; Move to Origin. If you're working elsewhere in your map, set the TerrainInfo's Advanced -&gt; bEdShouldSnap and position it on-grid yourself.

Now skip ahead to the next section.

===From a Heightmap Texture===

This is a more complicated procedure. The terrain map you create externally should be a basic height map &amp;ndash; an 8 bit grayscale image where white is interpreted as the highest point, and black is the lowest point.

Build your terrain map in a [[Legacy:Graphics Application|graphics application]] such as Adobe Photoshop, or a terrain-generating program such as [[Legacy:Terragen|Terragen]]. You will be able to edit it further within UnrealEd, so you might want to just lay down the basic elements. No matter how you do it, the terrain map needs to be saved as an 8-bit grayscale BMP file. 

When you're ready, [[Legacy:Import The Texture|Import the texture]] and set:
* package: [[Legacy:MyLevel|MyLevel]] to embed the texture within the level
* Un-check the &quot;'''Generate MipMaps'''&quot; checkbox
* give the texture a logical name you will remember!

You now need to [[Legacy:Add An Actor|add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:TerrainInfo|TerrainInfo]] to your map. This will later hold all the settings for the terrain: textures, heightmaps, etc.

After adding it, it's a good idea to do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Reset -&gt; Move to Origin. This will ensure that when the terrain is scaled up it meets the walls of the subtracted cube exactly. 
 

Now you need to set the greyscale texture we imported to be used as the terrain's heightmap: [[Legacy:Set The Resource Property|Set the resource property]] TerrainInfo -&gt; TerrainMap to the terrain texture you just imported. (Select your texture in the texture browser, then click the Use button on the TerrainMap property.)

Once you've done this it's a good idea to [[Legacy:Rebuild|rebuild]] the level &amp; save it. Once you've rebuilt the level (both Geometry and BSP) you'll be able to see the terrain in the 3D [[Legacy:UnrealEd Viewport|UnrealEd viewport]] when it's in '''Wireframe''' mode.

To be able to edit the terrain height later within UnrealEd, you need to convert the heightmap texture to 16-bit greyscale. To do this, in the [[Legacy:Terrain Mode|Terrain Mode]] window, go to the &quot;Terrains&quot; tab and right-click the block for your terrain in the list, and select &quot;convert to G16&quot; from the pop-up menu.

==Setting some basic options==

You now have a wireframe terrain and a TerrainInfo actor. It will only be visible in a 3D viewport set to wireframe mode.

[[Image:Legacy_tutorial-terrain-10-Flat-Terrain-Wireframe.jpeg|center|]]

'''Phlip:''' Correct me if I'm wrong, but it seems that the wireframe will only appear in the lower left viewport (or whichever one is blue when you go ) - so if you're like me and have that as a different view, you should change it back to a 3d view for terrain manipulation. You can still edit the terrain in another view, but you will only be able to see it and the red marker in the lower left viewport. (With UT2004, can people confirm for other versions?)

'''Bob_The_Beheader:''' Um...I'm having the same problem. I can occasionally see the terrain itself, all textured and fancy looking in the other viewports, but only once I have added a texture layer and applied that to the terrain itself, and have turned terrain viewing on in the other viewports. 

'''Tarquin:''' Nope, I got it to show in the top left viewport. Not sure how, as at first I thought I was having the same problem as you guys. I think it's just that UEd needs some time to wake up and realize it has to render terrain....

This is as far as this tutorial goes. The next major thing to do will be to add a terrain texture layer. But before that, there's a few things we can quickly do.

===Quick Height Painting===

Just to make it a little bit more interesting, let's raise a few hills.

# Go into [[Legacy:Terrain Mode|terrain mode]]
# select the [[Legacy:Painting Terrain Tool|Painting Terrain Tool]] in the list on the left of the window
# in the 3D wireframe [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], your cursor will show a red dot in the middle of two yellow circles when it is on the terrain. Do:
#* CTRL-left mouse to raise the terrain in that area
#* CTRL-right mouse to lower it

'''Wingnut:''' Is there any reason why the painting tool would not work for me using UT2004 patched to 3323?

'''enDLine.SPA:''' Wingnut yes, once you import your height map and use it in the terrain info highlight the texture in the terrain editor and right click it, convert it to G16 =)

===Scaling the Terrain===

Like everything in UT, you can scale your terrain in 3 dimensions. The default TerrainScale is 64 in each axis. This converts to world units by multiplying the scale by the size, in pixels, of the TerrainMap texture.

Because the texture we used was 256x256 pixels, this means that the size of our terrain is currently 64 x 256 in each direction, or 16384. Since the world space we subtracted was only 8192 in each direction, the terrain is twice the size of the world space. 

In fact, there's nothing wrong with that &amp;ndash; it won't cause any problems. And at some point you might find out you want to expand the level, so you've got plenty of room for expansion. But if you want to make the terrain fit exactly the 8192 unit large box it's in, then change the scale to 32 in the X and Y axes. You can use the Z axis scale to control how high the terrain is. The Z axis scaling also limits how high the terrain can be. I.e. it sets a maximum height. If you reach that height and find you want something to go higher, you'll need to set the Z scale larger. Of course, that will rescale everything else, so you should think about that in advance. 

==Moving on==
* to actually see your terrain in other than wireframe, you need to add a layer: see [[Legacy:Terrain Texture Layer|Terrain Texture Layer]]
* you'll also want to light your terrain later. Terrains are affected by ambient lighting and normal lights, so you can use those as you would anywhere else in a map. However, if your map is going to be an outdoor level you'll want to use a Sunlight, which produces much more realistic outdoor lighting:

===Next Lessons:===

Note: in UT2003 you can't add Sunlight to your map unless it is in a SkyBox. Current build users should proceed directly to the second link first.

'''Lilguy:''' this is definitely not true. You only need the walls set to fake backdrop, and the sunlight should go in the level, not in the skybox. I'm not positive about ut2k3, but I'm pretty sure you don't even need a skybox in your map to make sunlight work. Can someone who still has ut2k3 verify this?

'''Tarquin:''' Works in 2003 as far as I can tell &amp;ndash; no skybox &amp; sunlight in the map, &amp; surfaces set to fake backdrop. I'm finding it a pain to work with, but I doubt that's due to the lack of skybox.

'''Starweaver:''' OTOH, you CAN put the sunlights in the skybox if you want them to be global for areas with fakebackdrops as an acceptable design choice, right? (Though I wonder if the lighting propegates from the proper skybox when you're using something like [[Legacy:MultiSkyBox|MultiSkyBox]]...)

* [[Legacy:Adding Sunlight|Adding Sunlight]]
* [[Legacy:Building A SkyBox|Building a SkyBox]]

==Comments==

'''StarWeaver''': I've noticed that the entire terrain grid likes disappearing when you move it too close to the outer solid world, so if you want terrain to work in the center of an area just the right size for it then entering the coordinates by hand on the terraininfo is probably a good idea. (Do we have a tutorial on that? [Manually position the object] or something? I might put one together later . . .)

Also, for making caves, I found adding two (sets of) temporary sunlights to the area helps a lot: the first pointing down will shine through the upper (bInverted) terrain onto the lower one, the second pointing up to do the reverse in a *different color*. You'll have to set *all* sides of the terrain area to fake backdrop though, and I would definatly use a skybox to prevent HOMage (and a giant, brightly lit generic rock texture shining through gaps in your terrain really helps find those gaps if you don't want them :))

Maybe I'll write up a tutorial on making a cave. Heck, both this page and [[Legacy:Terrain|Terrain]] especially could really use some work or addition . . . .

'''JeffMOD:''' I hate this system... first, I could'nt get any textures painted on my terrain, now I can't even see it in wireframe mode, no matter '''how much''' I move the Terrain info! If my internet did'nt '''SUCK''' so much, i'd have SDK by now. no offense, but I want something esayer to use. and better spelling. PLEASE HELP! :(

==Related Topics==
* [[Legacy:Terrain Texture Layer|Terrain Texture Layer]] &amp;ndash; your recommended next step
* [[Legacy:Terrain Mode|Terrain Mode]] 
* [[Legacy:Terrain|Terrain]]
* [[Legacy:Architecture|Architecture]]

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Tutorial]]

[[:Category:Legacy Refactor Me]] &amp;ndash; Find info in discussions that can be added to tutorial (notes, tips) and do so.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2252</id>
      <timestamp>2007-01-26T22:18:01Z</timestamp>
      <contributor>
        <ip>C-69-242-147-159.hsd1.mo.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This page is one of a sequence of [[Legacy:Mapping Lessons|Mapping Lessons]].'' 

This tutorial shows you how to quickly make a [[Legacy:Terrain|terrain]] in [[Legacy:UnrealEd 3|UnrealEd 3]]. This applies to the retail version of [[Legacy:UT2003|UT2003]]; other games' editors may be different versions of UnrealEd in which the tools don't all work, eg [[Legacy:U2|U2]].

There is full reference for UnrealEd's terrain tools at [[Legacy:Terrain Mode|Terrain Mode]].

==Preliminaries==

We need a suitable [[Legacy:Zone|zone]] to hold the terrain.

===The World Space ===

If you don't already have some open space in your map for the terrain, [[Legacy:Create A Room|create a room]]. If this is your first terrain, we recommend a large space: a box 8192x8192x8192 [[Legacy:UU|UU]] in size should do. But bear in mind that terrains can be created as big or as small as you want (and you can also have as many as you want). A terrain could be a small area of a map within architecture, such as a sandy courtyard, or the basic world space, such as with a large outdoor level.

===Zone===

Next [[Legacy:Add An Actor|add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] if you don't already have one. This sets properties for this zone; and in particular we're going to use it to tell the engine that you want to render terrain in this zone. 

Now [[Legacy:Set The Following Properties|set the following properties]] of the ZoneInfo actor:

* ZoneInfo -&gt; bTerrainZone = '''True'''
* In a very large space, we recommend Display -&gt; DrawScale = 8 or 12 or something so you can see the actor easily

You'll need to [[Legacy:Rebuild|rebuild]] your map for the ZoneInfo to be tied to the zone it sits in.

===Terrain size===

Before you begin making the terrain, it's best to consider what size you want it to be. 

Each pixel of the terrain's heightmap texture will represent one grid intersection of terrain, or ''quad''. By default, a quad is 64x64 [[Legacy:UU|UU]]. So for example, a 256x256 pixel heightmap texture will produce a terrain that is 64 x 255 in each direction. Note the 255, not 256: each pixel represents the height of a grid ''intersection'', not a grid square. This means that terrain has what you might consider to be [[Wikipedia:Fencepost error]].

UnrealEd appears to allow you to create rectangular terrain, but the texture layers will cause it to crash later on if they are not square.

You can change the scale at any time to resize your terrain, but it will scale all your terrain's features too (which might not be what you want), and you'll also be off-grid (which might make things tricky).

Remember also that texture dimensions must be powers of 2: this limits your choice of possible terrain sizes. Roughly speaking, you'll probably want 256x256 for a large area, 512x512 for a HUGE area, and for things like sand in the corner of a room, as small as 16x16 perhaps. To measure out your terrain, try using the Cube Brushbuilder and enter dimensions in the format &quot;64*n&quot; for width and breadth. This will give you the heightmap texture dimensions for standard terrain scale.

For the purposes of this tutorial, 128x128 is adaquate for the 8192x8192x8192 box we have created.

==Making the Terrain==

There are two methods here. 
# you can create from scratch in UnrealEd and use the internal tools to raise hills and drop valleys. This is the simplest and quickest method.
# or you can make a heightmap texture in an external [[Legacy:Graphics Application|graphics application]], and import it. With this method, you'll be able to edit in UnrealEd later anyway.

===From Scratch===

This method adds a TerrainInfo actor for you automatically, and also creates a new heightmap texture for you.

# go into [[Legacy:Terrain Mode|Terrain mode]]
# Select the &quot;Tools&quot; tab at the top of the floating Terrain Editing Window, then the &quot;Terrains&quot; tab below that
# Click on the &quot;new terrain&quot; icon (it just looks like a blank page at the very foot of the tab area)
# This pops up a New Terrain window. Set:
#* Package: the [[Legacy:Package|package]] in which to store the new heightmap texture. Use [[Legacy:MyLevel|MyLevel]] to embed it within you map
#* Group: whatever you like
#* Name: this will be the name of the heightmap texture that will be created. It will also be used to identify your terrain in the Terrain Mode window, so in a map with many terrains it's a good idea to use a clear name, eg 'RedBaseSand' not 'Terrain1'.
#* XSize &amp; YSize : the size of the heightmap texture in pixels.
#* Height : the height of terrain that the midpoint grey in the heighmap texture will represent. This sets the vertical location of the initial plane of the terrain ''in relation to the game world.'' There is little to no reason for changing this. ''It can separate the terrain grid from the TerrainInfo actor marker and there does not seem to be a way to change it afterwards.''
# Click OK

Now go into wireframe view. The [[Legacy:TerrainInfo|TerrainInfo]] actor has been added for you and the terrain is ready for painting. Because the TerrainInfo has been added at the camera position, you'll need to move the camera about to see the terrain: it currently should look like a very big wireframe grid. You'll probably need to move up and look down to see it. If you don't see the grid, but only the TerrainInfo actor icon, try switching back to the Move tool and move the TerrainInfo slightly for UnrealEd to wake up.

You also may want to position the actor so the terrain's grid lines up with the world grid: do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Reset -&gt; Move to Origin. If you're working elsewhere in your map, set the TerrainInfo's Advanced -&gt; bEdShouldSnap and position it on-grid yourself.

Now skip ahead to the next section.

===From a Heightmap Texture===

This is a more complicated procedure. The terrain map you create externally should be a basic height map &amp;ndash; an 8 bit grayscale image where white is interpreted as the highest point, and black is the lowest point.

Build your terrain map in a [[Legacy:Graphics Application|graphics application]] such as Adobe Photoshop, or a terrain-generating program such as [[Legacy:Terragen|Terragen]]. You will be able to edit it further within UnrealEd, so you might want to just lay down the basic elements. No matter how you do it, the terrain map needs to be saved as an 8-bit grayscale BMP file. 

When you're ready, [[Legacy:Import The Texture|Import the texture]] and set:
* package: [[Legacy:MyLevel|MyLevel]] to embed the texture within the level
* Un-check the &quot;'''Generate MipMaps'''&quot; checkbox
* give the texture a logical name you will remember!

You now need to [[Legacy:Add An Actor|add an Actor]] &gt;&gt; Info &gt;&gt; [[Legacy:TerrainInfo|TerrainInfo]] to your map. This will later hold all the settings for the terrain: textures, heightmaps, etc.

After adding it, it's a good idea to do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Reset -&gt; Move to Origin. This will ensure that when the terrain is scaled up it meets the walls of the subtracted cube exactly. 
 

Now you need to set the greyscale texture we imported to be used as the terrain's heightmap: [[Legacy:Set The Resource Property|Set the resource property]] TerrainInfo -&gt; TerrainMap to the terrain texture you just imported. (Select your texture in the texture browser, then click the Use button on the TerrainMap property.)

Once you've done this it's a good idea to [[Legacy:Rebuild|rebuild]] the level &amp; save it. Once you've rebuilt the level (both Geometry and BSP) you'll be able to see the terrain in the 3D [[Legacy:UnrealEd Viewport|UnrealEd viewport]] when it's in '''Wireframe''' mode.

To be able to edit the terrain height later within UnrealEd, you need to convert the heightmap texture to 16-bit greyscale. To do this, in the [[Legacy:Terrain Mode|Terrain Mode]] window, go to the &quot;Terrains&quot; tab and right-click the block for your terrain in the list, and select &quot;convert to G16&quot; from the pop-up menu.

==Setting some basic options==

You now have a wireframe terrain and a TerrainInfo actor. It will only be visible in a 3D viewport set to wireframe mode.

[[Image:Legacy_tutorial-terrain-10-Flat-Terrain-Wireframe.jpeg|center|]]

'''Phlip:''' Correct me if I'm wrong, but it seems that the wireframe will only appear in the lower left viewport (or whichever one is blue when you go ) - so if you're like me and have that as a different view, you should change it back to a 3d view for terrain manipulation. You can still edit the terrain in another view, but you will only be able to see it and the red marker in the lower left viewport. (With UT2004, can people confirm for other versions?)

'''Bob_The_Beheader:''' Um...I'm having the same problem. I can occasionally see the terrain itself, all textured and fancy looking in the other viewports, but only once I have added a texture layer and applied that to the terrain itself, and have turned terrain viewing on in the other viewports. 

'''Tarquin:''' Nope, I got it to show in the top left viewport. Not sure how, as at first I thought I was having the same problem as you guys. I think it's just that UEd needs some time to wake up and realize it has to render terrain....

This is as far as this tutorial goes. The next major thing to do will be to add a terrain texture layer. But before that, there's a few things we can quickly do.

===Quick Height Painting===

Just to make it a little bit more interesting, let's raise a few hills.

# Go into [[Legacy:Terrain Mode|terrain mode]]
# select the [[Legacy:Painting Terrain Tool|Painting Terrain Tool]] in the list on the left of the window
# in the 3D wireframe [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], your cursor will show a red dot in the middle of two yellow circles when it is on the terrain. Do:
#* CTRL-left mouse to raise the terrain in that area
#* CTRL-right mouse to lower it

'''Wingnut:''' Is there any reason why the painting tool would not work for me using UT2004 patched to 3323?

'''enDLine.SPA:''' Wingnut yes, once you import your height map and use it in the terrain info highlight the texture in the terrain editor and right click it, convert it to G16 =)

===Scaling the Terrain===

Like everything in UT, you can scale your terrain in 3 dimensions. The default TerrainScale is 64 in each axis. This converts to world units by multiplying the scale by the size, in pixels, of the TerrainMap texture.

Because the texture we used was 256x256 pixels, this means that the size of our terrain is currently 64 x 256 in each direction, or 16384. Since the world space we subtracted was only 8192 in each direction, the terrain is twice the size of the world space. 

In fact, there's nothing wrong with that &amp;ndash; it won't cause any problems. And at some point you might find out you want to expand the level, so you've got plenty of room for expansion. But if you want to make the terrain fit exactly the 8192 unit large box it's in, then change the scale to 32 in the X and Y axes. You can use the Z axis scale to control how high the terrain is. The Z axis scaling also limits how high the terrain can be. I.e. it sets a maximum height. If you reach that height and find you want something to go higher, you'll need to set the Z scale larger. Of course, that will rescale everything else, so you should think about that in advance. 

==Moving on==
* to actually see your terrain in other than wireframe, you need to add a layer: see [[Legacy:Terrain Texture Layer|Terrain Texture Layer]]
* you'll also want to light your terrain later. Terrains are affected by ambient lighting and normal lights, so you can use those as you would anywhere else in a map. However, if your map is going to be an outdoor level you'll want to use a Sunlight, which produces much more realistic outdoor lighting:

===Next Lessons:===

Note: in UT2003 you can't add Sunlight to your map unless it is in a SkyBox. Current build users should proceed directly to the second link first.

'''Lilguy:''' this is definitely not true. You only need the walls set to fake backdrop, and the sunlight should go in the level, not in the skybox. I'm not positive about ut2k3, but I'm pretty sure you don't even need a skybox in your map to make sunlight work. Can someone who still has ut2k3 verify this?

'''Tarquin:''' Works in 2003 as far as I can tell &amp;ndash; no skybox &amp; sunlight in the map, &amp; surfaces set to fake backdrop. I'm finding it a pain to work with, but I doubt that's due to the lack of skybox.

'''Starweaver:''' OTOH, you CAN put the sunlights in the skybox if you want them to be global for areas with fakebackdrops as an acceptable design choice, right? (Though I wonder if the lighting propegates from the proper skybox when you're using something like [[Legacy:MultiSkyBox|MultiSkyBox]]...)

* [[Legacy:Adding Sunlight|Adding Sunlight]]
* [[Legacy:Building A SkyBox|Building a SkyBox]]

==Comments==

'''StarWeaver''': I've noticed that the entire terrain grid likes disappearing when you move it too close to the outer solid world, so if you want terrain to work in the center of an area just the right size for it then entering the coordinates by hand on the terraininfo is probably a good idea. (Do we have a tutorial on that? [Manually position the object] or something? I might put one together later . . .)

Also, for making caves, I found adding two (sets of) temporary sunlights to the area helps a lot: the first pointing down will shine through the upper (bInverted) terrain onto the lower one, the second pointing up to do the reverse in a *different color*. You'll have to set *all* sides of the terrain area to fake backdrop though, and I would definatly use a skybox to prevent HOMage (and a giant, brightly lit generic rock texture shining through gaps in your terrain really helps find those gaps if you don't want them :))

Maybe I'll write up a tutorial on making a cave. Heck, both this page and [[Legacy:Terrain|Terrain]] especially could really use some work or addition . . . .

==Related Topics==
* [[Legacy:Terrain Texture Layer|Terrain Texture Layer]] &amp;ndash; your recommended next step
* [[Legacy:Terrain Mode|Terrain Mode]] 
* [[Legacy:Terrain|Terrain]]
* [[Legacy:Architecture|Architecture]]

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Tutorial]]

[[:Category:Legacy Refactor Me]] &amp;ndash; Find info in discussions that can be added to tutorial (notes, tips) and do so.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating A WebApplication</title>
    <id>797</id>
    <revision>
      <id>2255</id>
      <timestamp>2005-12-03T02:39:38Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:WebApplication|WebApplication]]s are very useful for adding online administration to your mod. You could also use a WebApplication to  display information about the server.

This document will describe how you can create your own WebApplication. This document is focused on [[Legacy:UT2003|UT2003]], so something will not work the same if you use it for a other version.

==Setup ==

===Configuration ===

&lt;uscript&gt;
[UWeb.WebServer]
Applications[0]=xWebAdmin.UTServerAdmin
ApplicationPaths[0]=/ServerAdmin
Applications[1]=xWebAdmin.UTImageServer
ApplicationPaths[1]=/images
Applications[2]=MyMod.MyWebAdmin
ApplicationPaths[2]=/MyWebAdmin
Applications[3]=MyMod.MyImageServer
ApplicationPaths[3]=/MyImages
DefaultApplication=0
bEnabled=True
ListenPort=80
MaxConnections=30
ServerName=myserver.com
ExpirationSeconds=86400
&lt;/uscript&gt;

In order to use your WebApplication you have to add it to the Applications list of the UWeb.WebServer. You can add up to 10 WebApplications. You also have to define the ApplicationPaths for your WebApplication. The ApplicationPath defines what WebApplication that should handle the request.

For example, when the request URL is:
  http://myserver.com/ServerAdmin/somepage

It will forward the request to the WebApplication with it's path set to: /ServerAdmin&lt;br /&gt;In this case that would be xWebAdmin.UTServerAdmin

If there's no Application assigned to the requested path it will load the default application.

===Files ===

There are two ways to provide the data for the resulting pages.

The first method is to provide the output HTML inline with the code. This is a bad choice because it's ugly and difficult to maintain. It will also use more memory because the source code is much larger.

The second method is to provide the HTML (and images) as loose files in a directory.

All Web files are provided from the &quot;Web&quot; dir in your Unreal directory, when you include a file in the respons the location specified will be relative from this directory. It's best that you create a new subdirectory for your own WebApplication.

So your directory listing will look like this:

  UT2003
  |
  +- Web
     |
     +- images 
     +- ServerAdmin 
     +- MyWebAdmin   (place your HTML and CSS files here)
     +- MyImages     (for your graphics, if you use your own ImageServer)

For the rest of this document we assume we have the following files in the MyWebAdmin directory:
* index.html (the main document)
* about.html (about document)

And in the MyImages directory:
* title.gif

==WebApplication class ==

TODO: note about [[Legacy:Modular_Mod|Modular_Mod]]

&lt;uscript&gt;
class MyWebAdmin extends WebApplication;

var localized string url_root;
var localized string file_default;
var localized string file_about;
&lt;/uscript&gt;

Create a class that extends a WebApplication.

I've specified all files that this WebApplication serves as a localisable variable. This is usefull because it will prevents stupid typos in the filename, but also provides you with an easy way to localise your WebApplication. For an other language you just specify an other filename to use.

&lt;uscript&gt;
event Init()
{
  // do some init stuff
  Super.Init();
  log(&quot;MyWebAdmin loaded&quot;);
}
&lt;/uscript&gt;

The Init method is called when the WebApplication will be loaded. If you need to load some things, or find some references (find a mutator or something), you should do it here.

&lt;uscript&gt;
event bool PreQuery(WebRequest Request, WebResponse Response)
{
  if (!Level.Game.AccessControl.ValidLogin(Request.Username, Request.Password))
  {
    Response.FailAuthentication(Level.Game.GameReplicationInfo.ServerName$&quot; MyWebAdmin&quot;);
    return false;
  }
  return true;
}
&lt;/uscript&gt;

PreQuery is called before the Query is handled. If your WebApplication needs some authentication you should do it here. 

In the above example I call the ValidLogin method of AccessControl, this will validate the username and password entered in the browser. If AccessControlIni is used it will check for a valid user/pass combination, otherwise it will just check if the adminpassword is correct.

When the username and password are correct it will return true and the WebApplication will continue with the Query event. Otherwise false is returned and query processes stops, a FailAuthentication is sent to the browser requiring the user to login again.

&lt;uscript&gt;
function Query(WebRequest Request, WebResponse Response)
{
  switch (Mid(Request.URI, 1))
  {
    case &quot;&quot;:
    case file_default:  RequestIndex(Request, Response); return;
    case file_about:    RequestAbout(Request, Response); return;
  }
  Response.HTTPError(404, &quot;&quot;);
}
&lt;/uscript&gt;

Query event is called when a user requests a file. The Request.URI value is relative to the Application path defined for this application.

For example, when a user requests the following page:
  http://myserver.com/ServerAdmin/index.html

Request.URI will contain the following value:
  /index.html

We strip off the leading slash to check what file is requested. If the string is empty or same as the variable file_default we will call the RequestIndex method to handle.

If none of the cases match we will return a 404 HTTP Error.

&lt;uscript&gt;
function bool RequestIndex(WebRequest Request, WebResponse Response)
{
  Response.Subst(&quot;replace&quot;, &quot;withthis&quot;);
  Response.IncludeUHTM(url_root$&quot;/&quot;$file_default);
  Response.ClearSubst();
  return true;
}
&lt;/uscript&gt;

The above method is called by Query when the client requests either &quot;/&quot; or &quot;/index.html&quot; (file_default = &quot;index.html&quot;).

Response.Subst will replace all occurances of &quot;&amp;lt;%replace%&amp;gt;&quot; in the file to &quot;withthis&quot;. Response.IncludeUHTM will include the HTML file to send. Response.ClearSubst will perform the substitutions in the included file.

Let's say that our index.html file looks like this:

  &amp;lt;html&gt;
  &amp;lt;head&gt;
    &amp;lt;title&gt;MyWebAdmin&amp;lt;/title&gt;
  &amp;lt;/head&gt;
  &amp;lt;body&gt;
  &amp;lt;img src=&quot;/MyImages/title.gif&quot; alt=&quot;title image&gt;
  The replace item is replaced with: &amp;lt;%replace%&amp;gt; &amp;lt;br&gt;
  &amp;lt;a href=&quot;about.html&quot;&gt;about this thing&amp;lt;/a&gt;
  &amp;lt;/body&gt;
  &amp;lt;/html&gt;

The file returned by the server will look like this:

  &amp;lt;html&gt;
  &amp;lt;head&gt;
    &amp;lt;title&gt;MyWebAdmin&amp;lt;/title&gt;
  &amp;lt;/head&gt;
  &amp;lt;body&gt;
  &amp;lt;img src=&quot;/MyImages/title.gif&quot; alt=&quot;title image&gt;
  The replace item is replaced with: withthis &amp;lt;br&gt;
  &amp;lt;a href=&quot;about.html&quot;&gt;about this thing&amp;lt;/a&gt;
  &amp;lt;/body&gt;
  &amp;lt;/html&gt;

'''''Note:''''' I've added an image to the index.html doc, it refers to /MyImages/title.gif , if you do not provide your own ImageServer (this is usually not very useful to do) you should place your pictures in the UWeb/images dir and use /images/title.gif as image source.

&lt;uscript&gt;
function PostQuery(WebRequest Request, WebResponse Response)
{
  // do some cleanup here
}
&lt;/uscript&gt;

PostQuery is called after the the query was executed, you may want to do some clean up here.

&lt;uscript&gt;
defaultproperties 
{
  url_root=&quot;MyWebAdmin&quot;
  file_default=&quot;index.html&quot;
  file_about=&quot;about.html&quot;
}
&lt;/uscript&gt;

Well these are the default values of the variable described above. If you have localized html files you could overwrite these within an .int file, so for file_default you could set it to: index-de.html (for german files) and index-fr.html (for french files)

==MyImageServer class (optional) ==

&lt;uscript&gt;
class MyImageServer extends ImageServer;

var string imagedir;

event Query(WebRequest Request, WebResponse Response)
{
  local string Image;
	
  Image = Mid(Request.URI, 1);
  if( Right(Caps(Image), 4) == &quot;.JPG&quot; || Right(Caps(Image), 5) == &quot;.JPEG&quot; )
  {
    Response.SendStandardHeaders(&quot;image/jpeg&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.GIF&quot; )
  {
    Response.SendStandardHeaders(&quot;image/gif&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.BMP&quot; )
  {
    Response.SendStandardHeaders(&quot;image/bmp&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.PNG&quot; )
  {
    Response.SendStandardHeaders(&quot;image/png&quot;, true);
  }
  else
  {
    Response.HTTPError(404);
    return;
  }
  Response.IncludeBinaryFile( imagedir$&quot;/&quot;$Image );
}

defaultproperties
{
  imagedir=&quot;MyImages&quot;
}
&lt;/uscript&gt;

Providing your own ImageServer is optional, and you should only do that if you provide a pretty large WebApplication with a lot of images.

The only thing diffirent from the default ImageServer and the above code is that this image server will serve the files from a diffirent directory (Web/MyImages) and I've added an extra mime type: &quot;image/png&quot;

==Differences between UT2003 and Devastation ==

There are a few differences between the code described above and that needed by [[Legacy:Devastation|Devastation]].  These are detailed below.  From the looks of the code the Devastation codebase is much closer to that of UT so these comments may apply to UT as well.

All files served by the Web Server application must be contained within the /Web directory.  Files in sub-directories (or any filename containing a forwardslash or backslash will not be served.  Instead you will see a '''Dangerous characters in requested filename''' error in your log.

The version of the engine used by Devastation does not support the ''event bool PreQuery(WebRequest Request, WebResponse Response)'' method within UScript (the function is defined as native).  This means that a different approach needs to be taken for user authnentication.  The code required is below.

&lt;uscript&gt;
// Add the following variables as class attributes.
var config String AdminRealm;
var config String AdminUsername;
var config String AdminPassword;

// Add the following code at the start of your Query(WebRequest Request, WebResponse Response) function.
// Check authentication:
if ((AdminUsername != &quot;&quot; &amp;&amp; Caps(Request.Username) != Caps(AdminUsername)) || (AdminPassword != &quot;&quot; &amp;&amp; Caps(Request.Password) != Caps(AdminPassword))) {
  Response.FailAuthentication(AdminRealm);
  return;
}
&lt;/uscript&gt;

==Another method of nationalization ==

If you do not wish to store all of your pages in localized variables then an alternative is to prefix all of your files with the language identifier and an underscore.

Declare attributes on your class as follows:

&lt;uscript&gt;
var localized String LangPrefix; // This should be set to the language prefix (I use eng for English)
var String pageDirectory;
&lt;/uscript&gt;

Then add the following line of code to your Web Application's Init() function:

&lt;uscript&gt;
self.pageDirectory = self.root_url$&quot;/&quot;$self.LangPrefix$&quot;_&quot;;
&lt;/uscript&gt;

The code to determine which page has been requested then becomes the following:

&lt;uscript&gt;
function Query(WebRequest Request, WebResponse Response)
{
  local int underscorePos;
  local String requestedPage;

  underscorePos = InStr( Request.URI, &quot;_&quot; );

  if (underscorePos == -1 &amp;&amp; Len(Request.URI) &gt; 1)
  {
    Log( &quot;WebAdmin:: Bad URL requested - it has no underscore.  URL=&quot;$Request.URI );
  }
  else
  {
    requestedPage = Mid(Request.URI, underscorePos+1);
    Response.Subst( &quot;AdminDir&quot;, self.pageDirectory ); // Replacement for page locations done here as it applies to all pages
    Log( &quot;DevWebAdmin:: Requested page is &quot;$requestedPage );

    switch ( requestedPage )
    {
      case &quot;/&quot;:
      case &quot;index.html&quot;:
        RequestIndex(Request, Response);
        return;
      // Rest of code follows as expected
&lt;/uscript&gt;

And finally, when declareing URLs within your html file you should use the following notation:

&lt;nowiki&gt;&lt;a href=&quot;&lt;%AdminDir%&gt;index.html&quot;&gt;Home&lt;/a&gt;&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Modular Mod|Modular Mod]]
* [[Legacy:Sessions|Sessions]]
* [[Legacy:WebServer|WebServer]]

==Discussion==

'''EntropicLqd:''' Tarquin - I'm thinking of writing a tutorial for a fully working example based on the Devastation engine.  Some of the content will obviously overlap the stuff on this page (I may be able to create the pages such that I avoid some duplication, but only by moving a fair amonut of content around) - any thoughts?  Also, I'll be wanting to include the contents of the HTML pages used in the app. so I'll want to display the raw html.  How do I do that using Wiki Markup.  I can't see anything obvious on the Wiki Markup page (although it's quite possible I'm being particularly dense).

'''Tarquin:''' Hmm... method 1: &lt;nowiki&gt;&lt;br /&gt;&lt;/nowiki&gt; method 2:

&lt;uscript&gt;
&lt;br&gt;
&lt;/uscript&gt;

I know naaaaaathing (in the style of Manuel) about this topic, so do whatever you think is best :)

'''EntropicLqd:''' Cool.  I'll get on it.  If I can send the kids outside to playin the street with cars over the weekend I might get it done this weekend - if not middle of next week.  Considering you know nothing about it, the page is amazingly comprehensive.  RE: The markup - I was being particuarly dense.

'''Tarquin:''' I didn't write any of it... :) Is the page you mean [[Legacy:Devastation Dedicated Server|Devastation Dedicated Server]]? There's [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]] too. If all these are related can we try &amp; structure it around a hub page of some sort, eg [[Legacy:Dedicated Server|Dedicated Server]]?

'''EntropicLqd:'''  I'm sure it's related.  And yes, a dedicated server page would probable make a lot of sense.  Has anyone found a way of getting more than 24 hours into the day yet?  I think I need to know how.  So that's two areas on my work stack - this one (Web admin) and a dedicated server page.  How nice.

'''Tarquin:''' .... erm... just leave it for someone else to do, Ent! Don't stress it! [[:Category:Legacy To Do]] :p

'''ScratchMonkey:''' Fixed the Subst examples. I spent a couple hours yesterday figuring out what I was doing wrong with a new UT2004 WebApplication subclass and called my brother in to compare my code to that of the XWebAdmin. He spotted the need for angle brackets in addition to the percent signs around the template variables in the HTML template file.

The Subst function actually registers a substitution, and the actual substitution happens when the file is rendered. I'm a little skeptical about the description of ClearSubst. I suspect it really removes the Subst entries from an internal table in the Response object.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2256</id>
      <timestamp>2003-04-10T13:40:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:WebApplication|WebApplication]]s are very usefull for adding online administration to your mod. You could also use a WebApplication to  display information about the server.

This document will describe how you can create your own WebApplication. This document is focused on [[Legacy:UT2003|UT2003]], so something will not work the same if you use it for a other version.

==Setup ==

===Configuration ===

&lt;uscript&gt;
[UWeb.WebServer]
Applications[0]=xWebAdmin.UTServerAdmin
ApplicationPaths[0]=/ServerAdmin
Applications[1]=xWebAdmin.UTImageServer
ApplicationPaths[1]=/images
Applications[2]=MyMod.MyWebAdmin
ApplicationPaths[2]=/MyWebAdmin
Applications[3]=MyMod.MyImageServer
ApplicationPaths[3]=/MyImages
DefaultApplication=0
bEnabled=True
ListenPort=80
MaxConnections=30
ServerName=myserver.com
ExpirationSeconds=86400
&lt;/uscript&gt;

In order to use your WebApplication you have to add it to the Applications list of the UWeb.WebServer. You can add up to 10 WebApplications. You also have to define the ApplicationPaths for your WebApplication. The ApplicationPath defines what WebApplication that should handle the request.

For example, when the request URL is:
  http://myserver.com/ServerAdmin/somepage

It will forward the request to the WebApplication with it's path set to: /ServerAdmin&lt;br /&gt;In this case that would be xWebAdmin.UTServerAdmin

If there's no Application assigned to the requested path it will load the default application.

===Files ===

There are two ways to provide the data for the resulting pages.

The first method is to provide the output HTML inline with the code. This is a bad choice because it's ugly and difficult to maintain. It will also use more memory because the source code is much larger.

The second method is to provide the HTML (and images) as loose files in a directory.

All Web files are provided from the &quot;Web&quot; dir in your Unreal directory, when you include a file in the respons the location specified will be relative from this directory. It's best that you create a new subdirectory for your own WebApplication.

So your directory listing will look like this:

  UT2003
  |
  +- Web
     |
     +- images 
     +- ServerAdmin 
     +- MyWebAdmin   (place your HTML and CSS files here)
     +- MyImages     (for your graphics, if you use your own ImageServer)

For the rest of this document we assume we have the following files in the MyWebAdmin directory:
* index.html (the main document)
* about.html (about document)

And in the MyImages directory:
* title.gif

==WebApplication class ==

TODO: note about [[Legacy:Modular_Mod|Modular_Mod]]

&lt;uscript&gt;
class MyWebAdmin extends WebApplication;

var localized string url_root;
var localized string file_default;
var localized string file_about;
&lt;/uscript&gt;

Create a class that extends a WebApplication.

I've specified all files that this WebApplication serves as a localisable variable. This is usefull because it will prevents stupid typos in the filename, but also provides you with an easy way to localise your WebApplication. For an other language you just specify an other filename to use.

&lt;uscript&gt;
event Init()
{
  // do some init stuff
  Super.Init();
  log(&quot;MyWebAdmin loaded&quot;);
}
&lt;/uscript&gt;

The Init method is called when the WebApplication will be loaded. If you need to load some things, or find some references (find a mutator or something), you should do it here.

&lt;uscript&gt;
event bool PreQuery(WebRequest Request, WebResponse Response)
{
  if (!Level.Game.AccessControl.ValidLogin(Request.Username, Request.Password))
  {
    Response.FailAuthentication(Level.Game.GameReplicationInfo.ServerName$&quot; MyWebAdmin&quot;);
    return false;
  }
  return true;
}
&lt;/uscript&gt;

PreQuery is called before the Query is handled. If your WebApplication needs some authentication you should do it here. 

In the above example I call the ValidLogin method of AccessControl, this will validate the username and password entered in the browser. If AccessControlIni is used it will check for a valid user/pass combination, otherwise it will just check if the adminpassword is correct.

When the username and password are correct it will return true and the WebApplication will continue with the Query event. Otherwise false is returned and query processes stops, a FailAuthentication is sent to the browser requiring the user to login again.

&lt;uscript&gt;
function Query(WebRequest Request, WebResponse Response)
{
  switch (Mid(Request.URI, 1))
  {
    case &quot;&quot;:
    case file_default:  RequestIndex(Request, Response); return;
    case file_about:    RequestAbout(Request, Response); return;
  }
  Response.HTTPError(404, &quot;&quot;);
}
&lt;/uscript&gt;

Query event is called when a user requests a file. The Request.URI value is relative to the Application path defined for this application.

For example, when a user requests the following page:
  http://myserver.com/ServerAdmin/index.html

Request.URI will contain the following value:
  /index.html

We strip off the leading slash to check what file is requested. If the string is empty or same as the variable file_default we will call the RequestIndex method to handle.

If none of the cases match we will return a 404 HTTP Error.

&lt;uscript&gt;
function bool RequestIndex(WebRequest Request, WebResponse Response)
{
  Response.Subst(&quot;replace&quot;, &quot;withthis&quot;);
  Response.IncludeUHTM(url_root$&quot;/&quot;$file_default);
  Response.ClearSubst();
  return true;
}
&lt;/uscript&gt;

The above method is called by Query when the client requests either &quot;/&quot; or &quot;/index.html&quot; (file_default = &quot;index.html&quot;).

Response.Subst will replace all occurances of &quot;%replace%&quot; in the file to &quot;withthis&quot;. Response.IncludeUHTM will include the HTML file to send. Response.ClearSubst will perform the substitutions in the included file.

Let's say that our index.html file looks like this:

  &amp;lt;html&gt;
  &amp;lt;head&gt;
    &amp;lt;title&gt;MyWebAdmin&amp;lt;/title&gt;
  &amp;lt;/head&gt;
  &amp;lt;body&gt;
  &amp;lt;img src=&quot;/MyImages/title.gif&quot; alt=&quot;title image&gt;
  The replace item is replaced with: %replace% &amp;lt;br&gt;
  &amp;lt;a href=&quot;about.html&quot;&gt;about this thing&amp;lt;/a&gt;
  &amp;lt;/body&gt;
  &amp;lt;/html&gt;

The file returned by the server will look like this:

  &amp;lt;html&gt;
  &amp;lt;head&gt;
    &amp;lt;title&gt;MyWebAdmin&amp;lt;/title&gt;
  &amp;lt;/head&gt;
  &amp;lt;body&gt;
  &amp;lt;img src=&quot;/MyImages/title.gif&quot; alt=&quot;title image&gt;
  The replace item is replaced with: withthis &amp;lt;br&gt;
  &amp;lt;a href=&quot;about.html&quot;&gt;about this thing&amp;lt;/a&gt;
  &amp;lt;/body&gt;
  &amp;lt;/html&gt;

'''''Note:''''' I've added a image to the index.html doc, it refers to /MyImages/title.gif , if you do not provide your own ImageServer (this is usualy not very usefull to do) you should place your pictures in the UWeb/images dir and use /images/title.gif as image source.

&lt;uscript&gt;
function PostQuery(WebRequest Request, WebResponse Response)
{
  // do some cleanup here
}
&lt;/uscript&gt;

PostQuery is called after the the query was executed, you may want to do some clean up here.

&lt;uscript&gt;
defaultproperties 
{
  url_root=&quot;MyWebAdmin&quot;
  file_default=&quot;index.html&quot;
  file_about=&quot;about.html&quot;
}
&lt;/uscript&gt;

Well these are the default values of the variable described above. If you have localized html files you could overwrite these within in .int file, so for file_default you could set it to: index-de.html (for german files) and index-fr.html (for french files)

==MyImageServer class (optional) ==

&lt;uscript&gt;
class MyImageServer extends ImageServer;

var string imagedir;

event Query(WebRequest Request, WebResponse Response)
{
  local string Image;
	
  Image = Mid(Request.URI, 1);
  if( Right(Caps(Image), 4) == &quot;.JPG&quot; || Right(Caps(Image), 5) == &quot;.JPEG&quot; )
  {
    Response.SendStandardHeaders(&quot;image/jpeg&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.GIF&quot; )
  {
    Response.SendStandardHeaders(&quot;image/gif&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.BMP&quot; )
  {
    Response.SendStandardHeaders(&quot;image/bmp&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.PNG&quot; )
  {
    Response.SendStandardHeaders(&quot;image/png&quot;, true);
  }
  else
  {
    Response.HTTPError(404);
    return;
  }
  Response.IncludeBinaryFile( imagedir$&quot;/&quot;$Image );
}

defaultproperties
{
  imagedir=&quot;MyImages&quot;
}
&lt;/uscript&gt;

Providing your own ImageServer is optional, and you should only do that if you provide a pretty large WebApplication with a lot of images.

The only thing diffirent from the default ImageServer and the above code is that this image server will server the files from a diffirent directory (Web/MyImages) and I've added an extra mime type: &quot;image/png&quot;

==Differences between UT2003 and Devastation ==

There are a few differences between the code described above and that needed by [[Legacy:Devastation|Devastation]].  These are detailed below.  From the looks of the code the Devastation codebase is much closer to that of UT so these comments may apply to UT as well.

All files served by the Web Server application must be contained within the /Web directory.  Files in sub-directories (or any filename containing a forwardslash or backslash will not be served.  Instead you will see a '''Dangerous characters in requested filename''' error in your log.

The version of the engine used by Devastation does not support the ''event bool PreQuery(WebRequest Request, WebResponse Response)'' method within UScript (the function is defined as native).  This means that a different approach needs to be taken for user authnentication.  The code required is below.

&lt;uscript&gt;
// Add the following variables as class attributes.
var config String AdminRealm;
var config String AdminUsername;
var config String AdminPassword;

// Add the following code at the start of your Query(WebRequest Request, WebResponse Response) function.
// Check authentication:
if ((AdminUsername != &quot;&quot; &amp;&amp; Caps(Request.Username) != Caps(AdminUsername)) || (AdminPassword != &quot;&quot; &amp;&amp; Caps(Request.Password) != Caps(AdminPassword))) {
  Response.FailAuthentication(AdminRealm);
  return;
}
&lt;/uscript&gt;

==Another method of nationalization ==

If you do not wish to store all of your pages in localized variables then an alternative is to prefix all of your files with the language identifier and an underscore.

Declare attributes on your class as follows:

&lt;uscript&gt;
var localized String LangPrefix; // This should be set to the language prefix (I use eng for English)
var String pageDirectory;
&lt;/uscript&gt;

Then add the following line of code to your Web Application's Init() function:

&lt;uscript&gt;
self.pageDirectory = self.root_url$&quot;/&quot;$self.LangPrefix$&quot;_&quot;;
&lt;/uscript&gt;

The code to determine which page has been requested then becomes the following:

&lt;uscript&gt;
function Query(WebRequest Request, WebResponse Response)
{
  local int underscorePos;
  local String requestedPage;

  underscorePos = InStr( Request.URI, &quot;_&quot; );

  if (underscorePos == -1 &amp;&amp; Len(Request.URI) &gt; 1)
  {
    Log( &quot;WebAdmin:: Bad URL requested - it has no underscore.  URL=&quot;$Request.URI );
  }
  else
  {
    requestedPage = Mid(Request.URI, underscorePos+1);
    Response.Subst( &quot;AdminDir&quot;, self.pageDirectory ); // Replacement for page locations done here as it applies to all pages
    Log( &quot;DevWebAdmin:: Requested page is &quot;$requestedPage );

    switch ( requestedPage )
    {
      case &quot;/&quot;:
      case &quot;index.html&quot;:
        RequestIndex(Request, Response);
        return;
      // Rest of code follows as expected
&lt;/uscript&gt;

And finally, when declareing URLs within your html file you should use the following notation:

&lt;nowiki&gt;&lt;a href=&quot;%AdminDir%index.html&quot;&gt;Home&lt;/a&gt;&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Modular Mod|Modular Mod]]
* [[Legacy:Sessions|Sessions]]
* [[Legacy:WebServer|WebServer]]

----

'''EntropicLqd:''' Tarquin - I'm thinking of writing a tutorial for a fully working example based on the Devastation engine.  Some of the content will obviously overlap the stuff on this page (I may be able to create the pages such that I avoid some duplication, but only by moving a fair amonut of content around) - any thoughts?  Also, I'll be wanting to include the contents of the HTML pages used in the app. so I'll want to display the raw html.  How do I do that using Wiki Markup.  I can't see anything obvious on the Wiki Markup page (although it's quite possible I'm being particularly dense).

'''Tarquin:''' Hmm... method 1: &lt;nowiki&gt;&lt;br /&gt;&lt;/nowiki&gt; method 2:

&lt;uscript&gt;
&lt;br&gt;
&lt;/uscript&gt;

I know naaaaaathing (in the style of Manuel) about this topic, so do whatever you think is best :)

'''EntropicLqd:''' Cool.  I'll get on it.  If I can send the kids outside to playin the street with cars over the weekend I might get it done this weekend - if not middle of next week.  Considering you know nothing about it, the page is amazingly comprehensive.  RE: The markup - I was being particuarly dense.

'''Tarquin:''' I didn't write any of it... :) Is the page you mean [[Legacy:Devastation Dedicated Server|Devastation Dedicated Server]]? There's [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]] too. If all these are related can we try &amp; structure it around a hub page of some sort, eg [[Legacy:Dedicated Server|Dedicated Server]]?

'''EntropicLqd:'''  I'm sure it's related.  And yes, a dedicated server page would probable make a lot of sense.  Has anyone found a way of getting more than 24 hours into the day yet?  I think I need to know how.  So that's two areas on my work stack - this one (Web admin) and a dedicated server page.  How nice.

'''Tarquin:''' .... erm... just leave it for someone else to do, Ent! Don't stress it! [[:Category:Legacy To Do]] :p
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2257</id>
      <timestamp>2004-05-30T14:45:09Z</timestamp>
      <contributor>
        <ip>ScratchMonkey</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:WebApplication|WebApplication]]s are very useful for adding online administration to your mod. You could also use a WebApplication to  display information about the server.

This document will describe how you can create your own WebApplication. This document is focused on [[Legacy:UT2003|UT2003]], so something will not work the same if you use it for a other version.

==Setup ==

===Configuration ===

&lt;uscript&gt;
[UWeb.WebServer]
Applications[0]=xWebAdmin.UTServerAdmin
ApplicationPaths[0]=/ServerAdmin
Applications[1]=xWebAdmin.UTImageServer
ApplicationPaths[1]=/images
Applications[2]=MyMod.MyWebAdmin
ApplicationPaths[2]=/MyWebAdmin
Applications[3]=MyMod.MyImageServer
ApplicationPaths[3]=/MyImages
DefaultApplication=0
bEnabled=True
ListenPort=80
MaxConnections=30
ServerName=myserver.com
ExpirationSeconds=86400
&lt;/uscript&gt;

In order to use your WebApplication you have to add it to the Applications list of the UWeb.WebServer. You can add up to 10 WebApplications. You also have to define the ApplicationPaths for your WebApplication. The ApplicationPath defines what WebApplication that should handle the request.

For example, when the request URL is:
  http://myserver.com/ServerAdmin/somepage

It will forward the request to the WebApplication with it's path set to: /ServerAdmin&lt;br /&gt;In this case that would be xWebAdmin.UTServerAdmin

If there's no Application assigned to the requested path it will load the default application.

===Files ===

There are two ways to provide the data for the resulting pages.

The first method is to provide the output HTML inline with the code. This is a bad choice because it's ugly and difficult to maintain. It will also use more memory because the source code is much larger.

The second method is to provide the HTML (and images) as loose files in a directory.

All Web files are provided from the &quot;Web&quot; dir in your Unreal directory, when you include a file in the respons the location specified will be relative from this directory. It's best that you create a new subdirectory for your own WebApplication.

So your directory listing will look like this:

  UT2003
  |
  +- Web
     |
     +- images 
     +- ServerAdmin 
     +- MyWebAdmin   (place your HTML and CSS files here)
     +- MyImages     (for your graphics, if you use your own ImageServer)

For the rest of this document we assume we have the following files in the MyWebAdmin directory:
* index.html (the main document)
* about.html (about document)

And in the MyImages directory:
* title.gif

==WebApplication class ==

TODO: note about [[Legacy:Modular_Mod|Modular_Mod]]

&lt;uscript&gt;
class MyWebAdmin extends WebApplication;

var localized string url_root;
var localized string file_default;
var localized string file_about;
&lt;/uscript&gt;

Create a class that extends a WebApplication.

I've specified all files that this WebApplication serves as a localisable variable. This is usefull because it will prevents stupid typos in the filename, but also provides you with an easy way to localise your WebApplication. For an other language you just specify an other filename to use.

&lt;uscript&gt;
event Init()
{
  // do some init stuff
  Super.Init();
  log(&quot;MyWebAdmin loaded&quot;);
}
&lt;/uscript&gt;

The Init method is called when the WebApplication will be loaded. If you need to load some things, or find some references (find a mutator or something), you should do it here.

&lt;uscript&gt;
event bool PreQuery(WebRequest Request, WebResponse Response)
{
  if (!Level.Game.AccessControl.ValidLogin(Request.Username, Request.Password))
  {
    Response.FailAuthentication(Level.Game.GameReplicationInfo.ServerName$&quot; MyWebAdmin&quot;);
    return false;
  }
  return true;
}
&lt;/uscript&gt;

PreQuery is called before the Query is handled. If your WebApplication needs some authentication you should do it here. 

In the above example I call the ValidLogin method of AccessControl, this will validate the username and password entered in the browser. If AccessControlIni is used it will check for a valid user/pass combination, otherwise it will just check if the adminpassword is correct.

When the username and password are correct it will return true and the WebApplication will continue with the Query event. Otherwise false is returned and query processes stops, a FailAuthentication is sent to the browser requiring the user to login again.

&lt;uscript&gt;
function Query(WebRequest Request, WebResponse Response)
{
  switch (Mid(Request.URI, 1))
  {
    case &quot;&quot;:
    case file_default:  RequestIndex(Request, Response); return;
    case file_about:    RequestAbout(Request, Response); return;
  }
  Response.HTTPError(404, &quot;&quot;);
}
&lt;/uscript&gt;

Query event is called when a user requests a file. The Request.URI value is relative to the Application path defined for this application.

For example, when a user requests the following page:
  http://myserver.com/ServerAdmin/index.html

Request.URI will contain the following value:
  /index.html

We strip off the leading slash to check what file is requested. If the string is empty or same as the variable file_default we will call the RequestIndex method to handle.

If none of the cases match we will return a 404 HTTP Error.

&lt;uscript&gt;
function bool RequestIndex(WebRequest Request, WebResponse Response)
{
  Response.Subst(&quot;replace&quot;, &quot;withthis&quot;);
  Response.IncludeUHTM(url_root$&quot;/&quot;$file_default);
  Response.ClearSubst();
  return true;
}
&lt;/uscript&gt;

The above method is called by Query when the client requests either &quot;/&quot; or &quot;/index.html&quot; (file_default = &quot;index.html&quot;).

Response.Subst will replace all occurances of &quot;&amp;lt;%replace%&amp;gt;&quot; in the file to &quot;withthis&quot;. Response.IncludeUHTM will include the HTML file to send. Response.ClearSubst will perform the substitutions in the included file.

Let's say that our index.html file looks like this:

  &amp;lt;html&gt;
  &amp;lt;head&gt;
    &amp;lt;title&gt;MyWebAdmin&amp;lt;/title&gt;
  &amp;lt;/head&gt;
  &amp;lt;body&gt;
  &amp;lt;img src=&quot;/MyImages/title.gif&quot; alt=&quot;title image&gt;
  The replace item is replaced with: &amp;lt;%replace%&amp;gt; &amp;lt;br&gt;
  &amp;lt;a href=&quot;about.html&quot;&gt;about this thing&amp;lt;/a&gt;
  &amp;lt;/body&gt;
  &amp;lt;/html&gt;

The file returned by the server will look like this:

  &amp;lt;html&gt;
  &amp;lt;head&gt;
    &amp;lt;title&gt;MyWebAdmin&amp;lt;/title&gt;
  &amp;lt;/head&gt;
  &amp;lt;body&gt;
  &amp;lt;img src=&quot;/MyImages/title.gif&quot; alt=&quot;title image&gt;
  The replace item is replaced with: withthis &amp;lt;br&gt;
  &amp;lt;a href=&quot;about.html&quot;&gt;about this thing&amp;lt;/a&gt;
  &amp;lt;/body&gt;
  &amp;lt;/html&gt;

'''''Note:''''' I've added an image to the index.html doc, it refers to /MyImages/title.gif , if you do not provide your own ImageServer (this is usually not very useful to do) you should place your pictures in the UWeb/images dir and use /images/title.gif as image source.

&lt;uscript&gt;
function PostQuery(WebRequest Request, WebResponse Response)
{
  // do some cleanup here
}
&lt;/uscript&gt;

PostQuery is called after the the query was executed, you may want to do some clean up here.

&lt;uscript&gt;
defaultproperties 
{
  url_root=&quot;MyWebAdmin&quot;
  file_default=&quot;index.html&quot;
  file_about=&quot;about.html&quot;
}
&lt;/uscript&gt;

Well these are the default values of the variable described above. If you have localized html files you could overwrite these within an .int file, so for file_default you could set it to: index-de.html (for german files) and index-fr.html (for french files)

==MyImageServer class (optional) ==

&lt;uscript&gt;
class MyImageServer extends ImageServer;

var string imagedir;

event Query(WebRequest Request, WebResponse Response)
{
  local string Image;
	
  Image = Mid(Request.URI, 1);
  if( Right(Caps(Image), 4) == &quot;.JPG&quot; || Right(Caps(Image), 5) == &quot;.JPEG&quot; )
  {
    Response.SendStandardHeaders(&quot;image/jpeg&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.GIF&quot; )
  {
    Response.SendStandardHeaders(&quot;image/gif&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.BMP&quot; )
  {
    Response.SendStandardHeaders(&quot;image/bmp&quot;, true);
  }
  else if( Right(Caps(Image), 4) == &quot;.PNG&quot; )
  {
    Response.SendStandardHeaders(&quot;image/png&quot;, true);
  }
  else
  {
    Response.HTTPError(404);
    return;
  }
  Response.IncludeBinaryFile( imagedir$&quot;/&quot;$Image );
}

defaultproperties
{
  imagedir=&quot;MyImages&quot;
}
&lt;/uscript&gt;

Providing your own ImageServer is optional, and you should only do that if you provide a pretty large WebApplication with a lot of images.

The only thing diffirent from the default ImageServer and the above code is that this image server will serve the files from a diffirent directory (Web/MyImages) and I've added an extra mime type: &quot;image/png&quot;

==Differences between UT2003 and Devastation ==

There are a few differences between the code described above and that needed by [[Legacy:Devastation|Devastation]].  These are detailed below.  From the looks of the code the Devastation codebase is much closer to that of UT so these comments may apply to UT as well.

All files served by the Web Server application must be contained within the /Web directory.  Files in sub-directories (or any filename containing a forwardslash or backslash will not be served.  Instead you will see a '''Dangerous characters in requested filename''' error in your log.

The version of the engine used by Devastation does not support the ''event bool PreQuery(WebRequest Request, WebResponse Response)'' method within UScript (the function is defined as native).  This means that a different approach needs to be taken for user authnentication.  The code required is below.

&lt;uscript&gt;
// Add the following variables as class attributes.
var config String AdminRealm;
var config String AdminUsername;
var config String AdminPassword;

// Add the following code at the start of your Query(WebRequest Request, WebResponse Response) function.
// Check authentication:
if ((AdminUsername != &quot;&quot; &amp;&amp; Caps(Request.Username) != Caps(AdminUsername)) || (AdminPassword != &quot;&quot; &amp;&amp; Caps(Request.Password) != Caps(AdminPassword))) {
  Response.FailAuthentication(AdminRealm);
  return;
}
&lt;/uscript&gt;

==Another method of nationalization ==

If you do not wish to store all of your pages in localized variables then an alternative is to prefix all of your files with the language identifier and an underscore.

Declare attributes on your class as follows:

&lt;uscript&gt;
var localized String LangPrefix; // This should be set to the language prefix (I use eng for English)
var String pageDirectory;
&lt;/uscript&gt;

Then add the following line of code to your Web Application's Init() function:

&lt;uscript&gt;
self.pageDirectory = self.root_url$&quot;/&quot;$self.LangPrefix$&quot;_&quot;;
&lt;/uscript&gt;

The code to determine which page has been requested then becomes the following:

&lt;uscript&gt;
function Query(WebRequest Request, WebResponse Response)
{
  local int underscorePos;
  local String requestedPage;

  underscorePos = InStr( Request.URI, &quot;_&quot; );

  if (underscorePos == -1 &amp;&amp; Len(Request.URI) &gt; 1)
  {
    Log( &quot;WebAdmin:: Bad URL requested - it has no underscore.  URL=&quot;$Request.URI );
  }
  else
  {
    requestedPage = Mid(Request.URI, underscorePos+1);
    Response.Subst( &quot;AdminDir&quot;, self.pageDirectory ); // Replacement for page locations done here as it applies to all pages
    Log( &quot;DevWebAdmin:: Requested page is &quot;$requestedPage );

    switch ( requestedPage )
    {
      case &quot;/&quot;:
      case &quot;index.html&quot;:
        RequestIndex(Request, Response);
        return;
      // Rest of code follows as expected
&lt;/uscript&gt;

And finally, when declareing URLs within your html file you should use the following notation:

&lt;nowiki&gt;&lt;a href=&quot;&lt;%AdminDir%&gt;index.html&quot;&gt;Home&lt;/a&gt;&lt;/nowiki&gt;

==Related Topics ==
* [[Legacy:Modular Mod|Modular Mod]]
* [[Legacy:Sessions|Sessions]]
* [[Legacy:WebServer|WebServer]]

----

'''EntropicLqd:''' Tarquin - I'm thinking of writing a tutorial for a fully working example based on the Devastation engine.  Some of the content will obviously overlap the stuff on this page (I may be able to create the pages such that I avoid some duplication, but only by moving a fair amonut of content around) - any thoughts?  Also, I'll be wanting to include the contents of the HTML pages used in the app. so I'll want to display the raw html.  How do I do that using Wiki Markup.  I can't see anything obvious on the Wiki Markup page (although it's quite possible I'm being particularly dense).

'''Tarquin:''' Hmm... method 1: &lt;nowiki&gt;&lt;br /&gt;&lt;/nowiki&gt; method 2:

&lt;uscript&gt;
&lt;br&gt;
&lt;/uscript&gt;

I know naaaaaathing (in the style of Manuel) about this topic, so do whatever you think is best :)

'''EntropicLqd:''' Cool.  I'll get on it.  If I can send the kids outside to playin the street with cars over the weekend I might get it done this weekend - if not middle of next week.  Considering you know nothing about it, the page is amazingly comprehensive.  RE: The markup - I was being particuarly dense.

'''Tarquin:''' I didn't write any of it... :) Is the page you mean [[Legacy:Devastation Dedicated Server|Devastation Dedicated Server]]? There's [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]] too. If all these are related can we try &amp; structure it around a hub page of some sort, eg [[Legacy:Dedicated Server|Dedicated Server]]?

'''EntropicLqd:'''  I'm sure it's related.  And yes, a dedicated server page would probable make a lot of sense.  Has anyone found a way of getting more than 24 hours into the day yet?  I think I need to know how.  So that's two areas on my work stack - this one (Web admin) and a dedicated server page.  How nice.

'''Tarquin:''' .... erm... just leave it for someone else to do, Ent! Don't stress it! [[:Category:Legacy To Do]] :p

'''ScratchMonkey:''' Fixed the Subst examples. I spent a couple hours yesterday figuring out what I was doing wrong with a new UT2004 WebApplication subclass and called my brother in to compare my code to that of the XWebAdmin. He spotted the need for angle brackets in addition to the percent signs around the template variables in the HTML template file.

The Subst function actually registers a substitution, and the actual substitution happens when the file is rendered. I'm a little skeptical about the description of ClearSubst. I suspect it really removes the Subst entries from an internal table in the Response object.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating Actors And Objects</title>
    <id>698</id>
    <revision>
      <id>2030</id>
      <timestamp>2006-12-07T06:29:14Z</timestamp>
      <contributor>
        <ip>D58-105-147-218.dsl.nsw.optusnet.com.au</ip>
      </contributor>
      <minor/>
      <comment>* though-&gt;if</comment>
      <text xml:space="preserve">==New Keyword ==

The ''New'' keyword is used to create new [[Legacy:Object|object]]s which are not a subclass of [[Legacy:Actor|Actor]].

The parameters are the owner object, the new object's name and the object's flags. Being one of the [[Legacy:UnrealScript Keywords|UnrealScript keywords]] rather than a function, there is no definition for New, but here's what it would look like if there were:

&lt;uscript&gt;
Object '''New'''(
  optional Object ''NewOuter'',
  optional string ''NewName'',
  optional int ''NewFlags''
  ) Class ''NewClass''
&lt;/uscript&gt;

; NewOuter : An object which will be assigned to the new object's Outer property. Self if omitted. If you are creating a new object that is declared Within another class, the new outer must be an object of that class or one of its subclasses.
; NewName : The new object's name. In [[Legacy:UT|UT]] this seems to be a parameter of type Name, while in [[Legacy:UT2003|UT2003]]/4 this parameter is of type String. This allows you to dynamically create it, eg &quot;MyObject&quot;$i &amp;ndash; you can do this sort of thing in UT, but it's more complicated.
; NewFlags : The new object's ObjectFlags. Only the &lt;tt&gt;RF_anything&lt;/tt&gt; constants from the [[Legacy:Object|Object]] class and combinations of them are valid values, but you shouldn't use them unless you know what you're doing.
; NewClass : The new object's class.
; return value : Like the Spawn() method described below New returns a reference to an object of the specified class.

Examples:

&lt;uscript&gt;
local Object NewObject;

NewObject = New class'MyObjectClass';
NewObject = New() class'MyObjectClass';
NewObject = New(None) class'MyObjectClass';
NewObject = New(SomeOtherObject, &quot;SomeWeirdObjectName&quot;) class'MyObjectClass';
NewObject = New(None, '', 0) class'MyObjectClass';
&lt;/uscript&gt;

When non-actor objects are created in [[Legacy:UT2003|UT2003]] then the object's Created function is called.&lt;br /&gt;Creating Actor objects with the ''New'' keyword causes the game or UCC [[Legacy:Commandlet|commandlet]]s to crash.

When dealing with non-Actor objects you must be absolutely sure to clean up Actor references in any objects, generally by explicitly setting those references to None where appropriate. Good places for this would be right after calling the Actor's Destroy() method or in the Actor's Destroyed() event. Failing to do so can effectively prevent the entire level from being garbage-collected at map change, resulting it two levels existing in memory at the same time, which generally crashes the game.

Object references in Actors are no problem, though.

'''Foxpaw:''' Though you are correct that this causes problems, actors don't get garbage collected, and there is usually at least two levels loaded at any given time. (The current level you're playing, and the &quot;entry level.&quot;) I believe that the problem arises because the object (which doesn't exist within the context of any level) doesn't get garbage collected because it's referencing a valid actor, then the reference becomes invalid due to the destruction of the actor, but the bit of code that checks for references to actors whenever an actor is destroyed doesn't get called on non-actors, thus you have an invalid reference that has not been changed to None. This points to a place in memory that is either something different or (usually) the middle of something, which, when the engine tries to do anything with it, causes a general protection fault because it's trying to read an object's data mid-object and getting information that appears to be in an invalid format.

'''Wormbo:''' Actors ''do'' get garbage-collected at level change. If the current level can't be garbage collected you will effectively have three levels in memory and if the problem persists eventually there will be too much stuff in memory to continue and the game will crash with an out-off-memory message. The changes I did to this page are all based on quite detailed information given by [[Legacy:Evolution|Evolution]] on IRC in ETG #unrealscript.

'''Foxpaw:''' I'm fairly certain that actors don't get garbage collected - I think that the game just walks it's actor list and Destroy()s each one. I'm pretty sure that they don't suffer normal garbage collection. Unfortunately, when I tried to set up some classes to test it conclusively, (create a reference from an object to an actor, change levels, see if actor still exists) turned out trickier than I had expected. UT destroyed the actor, then found that there was no valid references from the object, and garbage collected it. One might be able to get around that by having a reference to the object from something that won't get destroyed on level change, IE the GUI or the Player. 

'''Wormbo:''' Nothing gets Destroy()ed on level change, otherwise the Destroyed() event would trigger. (That's why it's so hard to clean up stuff on map change.) The whole level is just garbage-collected and the now unused packages are unloaded from memory.

'''Evolution:''' Actors do get garbage collected, but usually not immediately.  When unrealscript calls the Destroy() function on an actor, the actor's Destroyed() event is triggered, the engine sets the Actor's bDeleteMe property to True, adds the actor to a list of actors that are pending deletion, and removes the Actor from the level's &quot;live&quot; Actor list [which is represented by the AllActors iterator]).  Once the number of Actors pending deletion reaches a certain number, a &quot;mini&quot; garbage collection occurs, which actually deletes those actors.  When the level changes, any actors on the &quot;pending deletion&quot; list are deleted, even if there are less than the required number.  When this occurs, any &quot;live&quot; actors still in the level will not receive the Destroyed() event, with the exception of PlayerController and Pawn actors.

There are actually two different problems which can result from dangling actor references in non-Actor objects.  The first problem occurs when an actor which has been destroyed is still referenced by an object which is rooted (&quot;rooted&quot; just means that the object is linked to some other object which remains persistent throughout level changes, such as the GUIController or Player, through a chain of object references).  Since rooted objects (including actors) cannot be garbage collected, they will remain in memory, and as a result, so will the level object itself, along with any objects it's referencing, so on and so on.  This leads to more than one (excluding Entry) level existing in memory at the same time, which typically results what most C++ books would call &quot;indeterminate behavior&quot;, or in layman's terms - &quot;eventually (but usually immediately) crashes the program&quot;.  

The second problem occurs when you fail to explicitly set the Actor reference to None before unrooting the object (i.e. ObjectA is the only object referencing ObjectB, which is the only object (besides the level actor) referencing ActorA.  ObjectA then sets the var pointing at ObjectB to None, but ObjectB has not set its ActorA reference to None).  Assume that ActorA destroyed itself at some point after this.  When garbage collection occurs at level change, since both ObjectB and ActorA are considered unrooted, they are allowed to be deleted.  If ActorA is deleted prior to ObjectB, then ObjectB's reference to ActorA would then be pointing at deleted memory.  When the GC process reaches ObjectB, it recursively iterates through ObjectB's object references to determine whether ObjectB is unrooted, and throws an access violation when it attempts to read the memory still being pointed to by ObjectB's ActorA reference.  If you are familiar with C++ programming, it's probably very obvious what the problem is there.

An important caveat of Actor references in UT2003/UT2004 is that they will return None if they are marked bDeleteMe, even if they haven't actually been deleted yet.  This is the reason I set the MyGlobalActor reference to None even if the 'if ( MyGlobalActor != None )' check returns false, in the code I posted.

I hope this helps clear up exactly where the danger lies in not correctly cleaning up Actor references in your Objects.  It's very important to fully understand how to correctly clean up Actor references if your mod has any interaction between Actors and Objects.  

{{innerbox| A good rule of thumb is to NEVER have a global actor variable in a non-Actor subclass and when you must, make it a private variable, and provide accessor functions like Get() or something, so that you completely control the actual reference.

:[[Legacy:Evolution|Evolution]]

}}

Here is an example of how to safely use an actor in a non-Actor subclass:

&lt;uscript&gt;
class MyObjectThing extends Object;

// assume MyActor is a subclass of Actor that is in your mod
var private MyActor MyGlobalActor;

// this will indicate when MyObjectThing should not be allowed to create new actors
var private bool bLocked;

function MyActor GetMyActor( optional Actor A )
{
    if ( !bLocked &amp;&amp; MyGlobalActor == None &amp;&amp; A != None )
        MyGlobalActor = A.Spawn(class'MyActor');
		
    return MyGlobalActor;
}

// Call this function when you're no longer going to be using this object, 
// i.e. you are releasing your reference to this object
// e.g. if this was a GUIComponent, you would call this function when the page is closed
function Shutdown()
{
    if ( MyGlobalActor != None )
        MyGlobalActor.Destroy();
	
    MyGlobalActor = None;
    bLocked = True;
}

function DoSomeStuff()
{
    local bool bExample;
    local MyActor MyLocalActor;
	
    // It's good practice to avoid referencing MyGlobalActor directly, even from within the same class
    MyLocalActor = GetMyActor();
    bExample = MyLocalActor.IsAnExample();
}
&lt;/uscript&gt;

'''Foxpaw:''' Have you tested the above? I'm fairly certain that you can't call Spawn from something that isn't subclassed from actor. What with Spawn being defined in Actor and all. Plus the actor wouldn't have a reference to a level, because it goes into the level that the actor that spawned it was in.

'''Evolution:''' Hehe, ya got me.  Yes, you'd need to have a reference to an actor in order to call the Spawn() function.  I've changed the above code snippet to represent this.   Thanks for pointing that out.

'''porkmanii:''' What of WeaponFire objects in Unreal Engine 2.5?  I have had the game crash as a result of a Weapon referencing the WeaponFire objects/fire-modes of a Weapon which has been destroyed.  Does this mean Weapons delete their WeaponFire objects when Destroyed, even if other Actors are still referencing them?

==Spawn() Method ==

The ''Spawn'' function is used to create new actors. Unlike the ''New'' keyword, ''Spawn'' can only be called from a non-[[Legacy:Static Function|static function]] and can only create [[Legacy:Actor|actor]]s. If you need to call the ''Spawn'' function from a non-actor object make sure it has access to an [[Legacy:Actor|Actor]] whose ''Spawn'' function can be used then.

&lt;uscript&gt;
native(278) final function actor Spawn
(
   class&lt;actor&gt;     SpawnClass,
   optional actor   SpawnOwner,
   optional name    SpawnTag,
   optional vector  SpawnLocation,
   optional rotator SpawnRotation
);
&lt;/uscript&gt;

If ''SpawnLocation'' and/or ''SpawnRotation'' is not specified the spawner's ''Location'' and ''Rotation'' is used. (The spawner is the actor ''Spawn'' is called from.)

''Spawn'' returns an object of the class specified in ''SpawnClass'', not an object of class [[Legacy:Actor|Actor]], i.e. you don't have to cast it to the class you need. This is hardcoded in the compiler. For example:

&lt;uscript&gt;
local Projectile P;
P = Spawn(ProjectileClass, Instigator,,, Instigator.ViewRotation);
&lt;/uscript&gt;

You don't have to use &lt;tt&gt;P = Projectile(Spawn(ProjectileClass))&lt;/tt&gt;, in fact this will cause an error when compiling.

:'''Warning:'''  Spawning an actor for an owner whose deletion is pending reliably crashes the game with a &quot;Unknown code token&quot; error.  If in doubt, make sure you check the new owner's ''bDeleteMe'' property first.

Spawn also allows you to set the Tag on the new actor. If you need to set other properties on the new actor, you'll have to either call its accessors or set them directly once it's created. For example:

&lt;uscript&gt;
local MyClass P;
P = Spawn(MyClass);
P.SetMeaning(42);
P.bHasMeaning = True;
&lt;/uscript&gt;

On the other hand, if your goal is simply to have certain properties set before anything else happens to the object, you can use default properties in a sort of two part constructor:

&lt;uscript&gt;
// In the thing to be spawned..
static function PreInitialize( string SomeVar, int SomeNumber )
{
  // You can preserve the original default values in other default variables if you want, and restore them in prebeginplay. If you want.
  default.SomeOtherVar = SomeVar;
  default.SomeOtherNumber = SomeNumber;
}

// In the spawner..
class'Whatever'.static.PreInitialize( &quot;Cats are soft.&quot;, 5 );
Spawn( class'Whatever' );
&lt;/uscript&gt;

Another, probably less elegant-looking method would be exploiting the [[Legacy:Chain Of Events When Spawning Actors|Chain of Events when Spawning Actors]]:

&lt;uscript&gt;
class TheSpawningClass extends SomeClass;

event GainedChild(Actor Other)
{
  if ( Other.Class == class'WhatEver' ) {
    // this is executed before the newly spawned actor has a chance to execute its own PreBeginPlay() event
  }
}

function SpawnMyChild()
{
  Spawn(class'WhatEver', Self);
}
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]] main topic page
* [[Legacy:Class Syntax|Class Syntax]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain of Events when Spawning Actors]]
* [[Legacy:Chain Of Events At Level Startup|Chain of Events at Level Startup]]
* [[Legacy:Destroying Objects|Destroying Objects]]

----

'''hc:''' Is there a way to get spawn create actors that don't fit in the current location? I have to spawn some big objects and move them out of the way, but spawn fails when there's not enough room.. My current workaround is to set the default collision properties to zero and have the object change them to something appropriate after it has been spawned, but that's an ugly ugly hack..</text>
    </revision>
    <revision>
      <id>2031</id>
      <timestamp>2006-03-18T13:39:37Z</timestamp>
      <contributor>
        <ip>P54B6E415.dip.t-dialin.net</ip>
      </contributor>
      <comment>added question about collision problem</comment>
      <text xml:space="preserve">==New Keyword ==

The ''New'' keyword is used to create new [[Legacy:Object|object]]s which are not a subclass of [[Legacy:Actor|Actor]].

The parameters are the owner object, the new object's name and the object's flags. Being one of the [[Legacy:UnrealScript Keywords|UnrealScript keywords]] rather than a function, there is no definition for New, but here's what it would look like if there were:

&lt;uscript&gt;
Object '''New'''(
  optional Object ''NewOuter'',
  optional string ''NewName'',
  optional int ''NewFlags''
  ) Class ''NewClass''
&lt;/uscript&gt;

; NewOuter : An object which will be assigned to the new object's Outer property. Self if omitted. If you are creating a new object that is declared Within another class, the new outer must be an object of that class or one of its subclasses.
; NewName : The new object's name. In [[Legacy:UT|UT]] this seems to be a parameter of type Name, while in [[Legacy:UT2003|UT2003]]/4 this parameter is of type String. This allows you to dynamically create it, eg &quot;MyObject&quot;$i &amp;ndash; you can do this sort of thing in UT, but it's more complicated.
; NewFlags : The new object's ObjectFlags. Only the &lt;tt&gt;RF_anything&lt;/tt&gt; constants from the [[Legacy:Object|Object]] class and combinations of them are valid values, but you shouldn't use them unless you know what you're doing.
; NewClass : The new object's class.
; return value : Like the Spawn() method described below New returns a reference to an object of the specified class.

Examples:

&lt;uscript&gt;
local Object NewObject;

NewObject = New class'MyObjectClass';
NewObject = New() class'MyObjectClass';
NewObject = New(None) class'MyObjectClass';
NewObject = New(SomeOtherObject, &quot;SomeWeirdObjectName&quot;) class'MyObjectClass';
NewObject = New(None, '', 0) class'MyObjectClass';
&lt;/uscript&gt;

When non-actor objects are created in [[Legacy:UT2003|UT2003]] then the object's Created function is called.&lt;br /&gt;Creating Actor objects with the ''New'' keyword causes the game or UCC [[Legacy:Commandlet|commandlet]]s to crash.

When dealing with non-Actor objects you must be absolutely sure to clean up Actor references in any objects, generally by explicitly setting those references to None where appropriate. Good places for this would be right after calling the Actor's Destroy() method or in the Actor's Destroyed() event. Failing to do so can effectively prevent the entire level from being garbage-collected at map change, resulting it two levels existing in memory at the same time, which generally crashes the game.

Object references in Actors are no problem, though.

'''Foxpaw:''' Though you are correct that this causes problems, actors don't get garbage collected, and there is usually at least two levels loaded at any given time. (The current level you're playing, and the &quot;entry level.&quot;) I believe that the problem arises because the object (which doesn't exist within the context of any level) doesn't get garbage collected because it's referencing a valid actor, then the reference becomes invalid due to the destruction of the actor, but the bit of code that checks for references to actors whenever an actor is destroyed doesn't get called on non-actors, thus you have an invalid reference that has not been changed to None. This points to a place in memory that is either something different or (usually) the middle of something, which, when the engine tries to do anything with it, causes a general protection fault because it's trying to read an object's data mid-object and getting information that appears to be in an invalid format.

'''Wormbo:''' Actors ''do'' get garbage-collected at level change. If the current level can't be garbage collected you will effectively have three levels in memory and if the problem persists eventually there will be too much stuff in memory to continue and the game will crash with an out-off-memory message. The changes I did to this page are all based on quite detailed information given by [[Legacy:Evolution|Evolution]] on IRC in ETG #unrealscript.

'''Foxpaw:''' I'm fairly certain that actors don't get garbage collected - I think that the game just walks it's actor list and Destroy()s each one. I'm pretty sure that they don't suffer normal garbage collection. Unfortunately, when I tried to set up some classes to test it conclusively, (create a reference from an object to an actor, change levels, see if actor still exists) turned out trickier than I had expected. UT destroyed the actor, then found that there was no valid references from the object, and garbage collected it. One might be able to get around that by having a reference to the object from something that won't get destroyed on level change, IE the GUI or the Player. 

'''Wormbo:''' Nothing gets Destroy()ed on level change, otherwise the Destroyed() event would trigger. (That's why it's so hard to clean up stuff on map change.) The whole level is just garbage-collected and the now unused packages are unloaded from memory.

'''Evolution:''' Actors do get garbage collected, but usually not immediately.  When unrealscript calls the Destroy() function on an actor, the actor's Destroyed() event is triggered, the engine sets the Actor's bDeleteMe property to True, adds the actor to a list of actors that are pending deletion, and removes the Actor from the level's &quot;live&quot; Actor list [which is represented by the AllActors iterator]).  Once the number of Actors pending deletion reaches a certain number, a &quot;mini&quot; garbage collection occurs, which actually deletes those actors.  When the level changes, any actors on the &quot;pending deletion&quot; list are deleted, even if there are less than the required number.  When this occurs, any &quot;live&quot; actors still in the level will not receive the Destroyed() event, with the exception of PlayerController and Pawn actors.

There are actually two different problems which can result from dangling actor references in non-Actor objects.  The first problem occurs when an actor which has been destroyed is still referenced by an object which is rooted (&quot;rooted&quot; just means that the object is linked to some other object which remains persistent throughout level changes, such as the GUIController or Player, through a chain of object references).  Since rooted objects (including actors) cannot be garbage collected, they will remain in memory, and as a result, so will the level object itself, along with any objects it's referencing, so on and so on.  This leads to more than one (excluding Entry) level existing in memory at the same time, which typically results what most C++ books would call &quot;indeterminate behavior&quot;, or in layman's terms - &quot;eventually (but usually immediately) crashes the program&quot;.  

The second problem occurs when you fail to explicitly set the Actor reference to None before unrooting the object (i.e. ObjectA is the only object referencing ObjectB, which is the only object (besides the level actor) referencing ActorA.  ObjectA then sets the var pointing at ObjectB to None, but ObjectB has not set its ActorA reference to None).  Assume that ActorA destroyed itself at some point after this.  When garbage collection occurs at level change, since both ObjectB and ActorA are considered unrooted, they are allowed to be deleted.  If ActorA is deleted prior to ObjectB, then ObjectB's reference to ActorA would then be pointing at deleted memory.  When the GC process reaches ObjectB, it recursively iterates through ObjectB's object references to determine whether ObjectB is unrooted, and throws an access violation when it attempts to read the memory still being pointed to by ObjectB's ActorA reference.  If you are familiar with C++ programming, it's probably very obvious what the problem is there.

An important caveat of Actor references in UT2003/UT2004 is that they will return None if they are marked bDeleteMe, even if they haven't actually been deleted yet.  This is the reason I set the MyGlobalActor reference to None even if the 'if ( MyGlobalActor != None )' check returns false, in the code I posted.

I hope this helps clear up exactly where the danger lies in not correctly cleaning up Actor references in your Objects.  It's very important to fully understand how to correctly clean up Actor references if your mod has any interaction between Actors and Objects.  

{{innerbox| A good rule of thumb is to NEVER have a global actor variable in a non-Actor subclass and when you must, make it a private variable, and provide accessor functions like Get() or something, so that you completely control the actual reference.

:[[Legacy:Evolution|Evolution]]

}}

Here is an example of how to safely use an actor in a non-Actor subclass:

&lt;uscript&gt;
class MyObjectThing extends Object;

// assume MyActor is a subclass of Actor that is in your mod
var private MyActor MyGlobalActor;

// this will indicate when MyObjectThing should not be allowed to create new actors
var private bool bLocked;

function MyActor GetMyActor( optional Actor A )
{
    if ( !bLocked &amp;&amp; MyGlobalActor == None &amp;&amp; A != None )
        MyGlobalActor = A.Spawn(class'MyActor');
		
    return MyGlobalActor;
}

// Call this function when you're no longer going to be using this object, 
// i.e. you are releasing your reference to this object
// e.g. if this was a GUIComponent, you would call this function when the page is closed
function Shutdown()
{
    if ( MyGlobalActor != None )
        MyGlobalActor.Destroy();
	
    MyGlobalActor = None;
    bLocked = True;
}

function DoSomeStuff()
{
    local bool bExample;
    local MyActor MyLocalActor;
	
    // It's good practice to avoid referencing MyGlobalActor directly, even from within the same class
    MyLocalActor = GetMyActor();
    bExample = MyLocalActor.IsAnExample();
}
&lt;/uscript&gt;

'''Foxpaw:''' Have you tested the above? I'm fairly certain that you can't call Spawn from something that isn't subclassed from actor. What with Spawn being defined in Actor and all. Plus the actor wouldn't have a reference to a level, because it goes into the level that the actor that spawned it was in.

'''Evolution:''' Hehe, ya got me.  Yes, you'd need to have a reference to an actor in order to call the Spawn() function.  I've changed the above code snippet to represent this.   Thanks for pointing that out.

==Spawn() Method ==

The ''Spawn'' function is used to create new actors. Unlike the ''New'' keyword, ''Spawn'' can only be called from a non-[[Legacy:Static Function|static function]] and can only create [[Legacy:Actor|actor]]s. If you need to call the ''Spawn'' function from a non-actor object make sure it has access to an [[Legacy:Actor|Actor]] whose ''Spawn'' function can be used then.

&lt;uscript&gt;
native(278) final function actor Spawn
(
   class&lt;actor&gt;     SpawnClass,
   optional actor   SpawnOwner,
   optional name    SpawnTag,
   optional vector  SpawnLocation,
   optional rotator SpawnRotation
);
&lt;/uscript&gt;

If ''SpawnLocation'' and/or ''SpawnRotation'' is not specified the spawner's ''Location'' and ''Rotation'' is used. (The spawner is the actor ''Spawn'' is called from.)

''Spawn'' returns an object of the class specified in ''SpawnClass'', not an object of class [[Legacy:Actor|Actor]], i.e. you don't have to cast it to the class you need. This is hardcoded in the compiler. For example:

&lt;uscript&gt;
local Projectile P;
P = Spawn(ProjectileClass, Instigator,,, Instigator.ViewRotation);
&lt;/uscript&gt;

You don't have to use &lt;tt&gt;P = Projectile(Spawn(ProjectileClass))&lt;/tt&gt;, in fact this will cause an error when compiling.

:'''Warning:'''  Spawning an actor for an owner whose deletion is pending reliably crashes the game with a &quot;Unknown code token&quot; error.  If in doubt, make sure you check the new owner's ''bDeleteMe'' property first.

Spawn also allows you to set the Tag on the new actor. If you need to set other properties on the new actor, you'll have to either call its accessors or set them directly once it's created. For example:

&lt;uscript&gt;
local MyClass P;
P = Spawn(MyClass);
P.SetMeaning(42);
P.bHasMeaning = True;
&lt;/uscript&gt;

On the other hand, if your goal is simply to have certain properties set before anything else happens to the object, you can use default properties in a sort of two part constructor:

&lt;uscript&gt;
// In the thing to be spawned..
static function PreInitialize( string SomeVar, int SomeNumber )
{
  // You can preserve the original default values in other default variables if you want, and restore them in prebeginplay. If you want.
  default.SomeOtherVar = SomeVar;
  default.SomeOtherNumber = SomeNumber;
}

// In the spawner..
class'Whatever'.static.PreInitialize( &quot;Cats are soft.&quot;, 5 );
Spawn( class'Whatever' );
&lt;/uscript&gt;

Another, probably less elegant-looking method would be exploiting the [[Legacy:Chain Of Events When Spawning Actors|Chain of Events when Spawning Actors]]:

&lt;uscript&gt;
class TheSpawningClass extends SomeClass;

event GainedChild(Actor Other)
{
  if ( Other.Class == class'WhatEver' ) {
    // this is executed before the newly spawned actor has a chance to execute its own PreBeginPlay() event
  }
}

function SpawnMyChild()
{
  Spawn(class'WhatEver', Self);
}
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]] main topic page
* [[Legacy:Class Syntax|Class Syntax]]
* [[Legacy:Chain Of Events When Spawning Actors|Chain of Events when Spawning Actors]]
* [[Legacy:Chain Of Events At Level Startup|Chain of Events at Level Startup]]
* [[Legacy:Destroying Objects|Destroying Objects]]

----

'''hc:''' Is there a way to get spawn create actors that don't fit in the current location? I have to spawn some big objects and move them out of the way, but spawn fails when there's not enough room.. My current workaround is to set the default collision properties to zero and have the object change them to something appropriate after it has been spawned, but that's an ugly ugly hack..</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating An Interaction From A HUD</title>
    <id>763</id>
    <revision>
      <id>2180</id>
      <timestamp>2004-01-25T22:53:08Z</timestamp>
      <contributor>
        <ip>Cache3-winn.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Creating an Interaction from a HUD class is probably one of the easiest things you could do.

Just edit your PostBeginPlay() Function.

&lt;uscript&gt;
simulated function PostBeginPlay()
{
      Super.PostBeginPlay();
      PlayerOwner.Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, PlayerOwner.Player);
}
&lt;/uscript&gt;

... done. Simple eh?

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

[[Legacy:HUD Interactions|HUD Interactions]]

[[Legacy:Keypress Interactions|Keypress Interactions]]

[[Legacy:Message Interactions|Message Interactions]]

'''the_viking:''' I think this code is for UT. If you want to use it with UT2003, I think you have to do it so:

&lt;uscript&gt;
simulated function PostBeginPlay()
{
    local PlayerController PC;
    PC = PlayerController(Owner);
    PC.Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, PC.Player));
    Super.PostBeginPlay();
}
&lt;/uscript&gt;

'''Wormbo:''' There are no Interactions in UT, the above code should work perfectly.

'''Andrew:''' Neither of these seem to work for online play. It's because the Player hasn't been assigned to the 

playercontroller by the time this gets done. Instead the interaction should be added in somewhere like tick:

&lt;uscript&gt;
simulated function Tick(float delatTime)
{
if (PlayerOwner != None &amp;&amp; PlayerOwner.Player != None &amp;&amp; PlayerOwner.Player.InteractionMaster != None)
{
PlayerOwner.Player.InteractionMaster.AddInteraction(&quot;UBSSfowl.TargetReticleInteraction&quot;, PlayerOwner.Player);
disable('Tick');
}
}
&lt;/uscript&gt;

This might not actually work because it might interfere with things already being done in tick but you get the idea.</text>
    </revision>
    <revision>
      <id>2181</id>
      <timestamp>2003-05-18T18:50:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Creating an Interaction from a HUD class is probably one of the easiest things you could do.

Just edit your PostBeginPlay() Function.

&lt;uscript&gt;
simulated function PostBeginPlay()
{
      Super.PostBeginPlay();
      PlayerOwner.Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, PlayerOwner.Player);
}
&lt;/uscript&gt;

... done. Simple eh?

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

[[Legacy:HUD Interactions|HUD Interactions]]

[[Legacy:Keypress Interactions|Keypress Interactions]]

[[Legacy:Message Interactions|Message Interactions]]

'''the_viking:''' I think this code is for UT. If you want to use it with UT2003, I think you have to do it so:

&lt;uscript&gt;
simulated function PostBeginPlay()
{
    local PlayerController PC;
    PC = PlayerController(Owner);
    PC.Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, PC.Player));
    Super.PostBeginPlay();
}
&lt;/uscript&gt;

'''Wormbo:''' There are no Interactions in UT, the above code should work perfectly.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating An Interaction From A Mutator</title>
    <id>761</id>
    <revision>
      <id>2175</id>
      <timestamp>2007-11-06T17:24:00Z</timestamp>
      <contributor>
        <ip>Bloodlust</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">So you want to use an interaction - but dont know how to create one and have it work offline and online? Read on and see... :)

Interactions are created by calling

&lt;uscript&gt;PlayerController.Player.interactionMaster.AddInteraction(
  &quot;mypackage.interactionclass&quot;, 
  PlayerController.Player);
&lt;/uscript&gt;

where:
* ''mypackage'' is the name of the [[Legacy:Package|package]] the interaction class is contained in
* ''interactionclass'' is the name of the class that extends interaction. 

This ''mypackage.interactionclass'' format is maintained throughout all the code samples on this page.

The problem with this? An [[Legacy:InteractionMaster|InteractionMaster]] is client-side, so you need to do a couple of things to allow this to work online. First off, you need to make your mutator execute client-side. Mainly adding these two lines to your defaultproperties:

&lt;uscript&gt;
RemoteRole=ROLE_SimulatedProxy
bAlwaysRelevant=True
&lt;/uscript&gt;

You also need a [[Legacy:Simulated Function|simulated function]] that will run clientside and locate the 'local' playercontroller. Let's use &lt;code&gt;[[Legacy:Tick|Tick]]&lt;/code&gt;.

Getting the local [[Legacy:PlayerController|PlayerController]] requires a simple call to Level.GetLocalPlayerController().

Now we have a mutator that executes client-side, a function that can locate the local playercontroller, and we know how to create an interaction. Put it all together and you should have something that looks like:

&lt;uscript&gt;
class icu_mut extends Mutator;

var bool bAffectSpectators; // If this is set to true, an interaction will be created for spectators
var bool bAffectPlayers; // If this is set to true, an interaction will be created for players
var bool bHasInteraction;

function PreBeginPlay()
{
	//Log(&quot;ICU Mutator Started&quot;); // Always comment out your logs unless they're errors
}

simulated function Tick(float DeltaTime)
{
	local PlayerController PC;

	// If the player has an interaction already, exit function.
	if (bHasInteraction)
		Return;
	PC = Level.GetLocalPlayerController();

	// Run a check to see whether this mutator should create an interaction for the player
	if ( PC != None &amp;&amp; ((PC.PlayerReplicationInfo.bIsSpectator &amp;&amp; bAffectSpectators) || (bAffectPlayers &amp;&amp; !PC.PlayerReplicationInfo.bIsSpectator)) )
	{
		PC.Player.InteractionMaster.AddInteraction(&quot;ICU.icu_interaction&quot;, PC.Player); // Create the interaction
		bHasInteraction = True; // Set the variable so this lot isn't called again
	}
}

DefaultProperties
{
     bAffectSpectators=false
     bAffectPlayers=true
     RemoteRole=ROLE_SimulatedProxy
     bAlwaysRelevant=true
}
&lt;/uscript&gt;

Now you have the Mutator part done. 

==Adding an Interaction through a GameRule.==

Using that first block of code, you can add an Interaction through a [[Legacy:GameRules|GameRules]] actor as well. Adding an interaction is possible at any point that you have access to the PlayerController.

&lt;uscript&gt;
PlayerController.Player.interactionMaster.AddInteraction(&quot;mypackage.interactionclass&quot;, PlayerController.Player);
&lt;/uscript&gt;

This is essentially the same code just contained in a [[Legacy:GameRules|GameRules]] instead of a [[Legacy:Mutator|Mutator]].  It is simply to show an additional way of appending an [[Legacy:Interaction|Interaction]] to the [[Legacy:PlayerController|PlayerController]]'s InteractionMaster.

&lt;uscript&gt;
function bool OverridePickupQuery(Pawn Other, Pickup item, out byte bAllowPickup)  {

    local PlayerController PC;

    PC = PlayerController(Other.Controller);

	// Run a check to see whether this mutator should create an interaction for the player
	if ( PC != None &amp;&amp; ((PC.PlayerReplicationInfo.bIsSpectator &amp;&amp; bAffectSpectators) || (bAffectPlayers &amp;&amp; !PC.PlayerReplicationInfo.bIsSpectator)) )
	{
		PC.Player.InteractionMaster.AddInteraction(&quot;mypackage.interactionclass&quot;, PC.Player); // Create the interaction
		bHasInteraction = True; // Set the variable so this lot isn't called again
	}

//...Rest of the OverridePickupQuery code.
&lt;/uscript&gt;

==Adding an Interaction through a new third party class.==

Instead of making the mutator client side, you can have the mutator create a new class that is responsible for creating the interactions. Here's an example of using this method:

&lt;uscript&gt;
class SuperWeaponBarMutator extends Mutator;

function PostBeginPlay() {
	Spawn(class'SWBReplicator');
}

defaultproperties {
     	GroupName=&quot;SuperWeaponBar&quot;
     	FriendlyName=&quot;Super Weapon Bar&quot;
     	Description=&quot;Creates a new look and feel for the weapon bar.&quot;
}
&lt;/uscript&gt;

Here's the 3rd party class:

&lt;uscript&gt;
class SWBReplicator extends ReplicationInfo;

var bool bUpdated;

simulated function Tick(float dt) {
	if (Level.NetMode != NM_DedicatedServer &amp;&amp; Level.GetLocalPlayerController() != None &amp;&amp; !bUpdated) {
//Add extra conditions if needed.
		Level.GetLocalPlayerController().Player.interactionMaster.AddInteraction(&quot;SuperWeaponBar.SuperWeaponBarInteract&quot;, Level.GetLocalPlayerController().Player);
		bUpdated = true;
	}
}
&lt;/uscript&gt;

==Putting Interactions to use==

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

[[Legacy:HUD Interactions|HUD Interactions]]

[[Legacy:Keypress Interactions|Keypress Interactions]]

[[Legacy:Message Interactions|Message Interactions]]

----

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''Bjorn:''' I've removed the .Player.Actor.Pawn in PC.Player.Actor.Pawn.PlayerReplicationInfo because the PRI is already available from the PlayerController (Controller). Oh and, this document was just what I needed and does a good job at explaining stuff to the point, thanks a bunch!

'''Boksha:''' Some minor changes in the comments. Anyway, if the local player is not affected by this mutator, the foreach command will go on forever, slowing it down more than it should. Someone think of a workaround for this. Also, damnation. Apparently Mychaeel added something after I load the editing page, so I removed it. Here it is:

'''Mychaeel:''' A thought just occurred to me:  If the only purpose of creating an interaction from a mutator is being able to paint something on the HUD, there might be a less problem-prone way to achieve the same goal (from what I gather interactions don't play well when players try to connect to a different server using the &quot;open&quot; console command).  I didn't look into that yet so I might be way off, but could it be possible to exploit [[Legacy:LocalMessage|LocalMessage]]'s RenderComplexMessage function to paint arbitrary stuff on the client's HUD?

'''Rork:''' I downloaded the ICU mutator that is supposed to work online, but it doesn't: clients don't get the interaction, except if they are on the server (listen server). Do I live in twilight zone ? ;)

'''Wormbo:''' The usual preparations for client-side mods apply: Add the package to the ServerPackages list on the server and use UCC MasterMD5 to calculate the package's checksum before running the mod on the server.

'''Rork:''' Oh well I feel stupid now... Thanks Wormbo.

'''Mychaeel:''' At least the &quot;ucc mastermd5&quot; step should be obsolete as of UT2003 patch 1 &amp;ndash; isn't it, Wormbo?

'''Wormbo:''' Oh right, forgot that.

'''Burtlo:''' I was about to create a [[Legacy:Mutator|Mutator]] to include an interaction and I thought there must be a way to perform this in a [[Legacy:GameRules|GameRules]].  It worked.  So I thought it would be appropriate to mention it here, that it is obviously possible to implement.  And perhaps slightly more effecient because it's not on the ''Tick'' method.  But that is something I don't know enough about to make a comment.  Oh sh*t.  This is interaction from a mutator.  Is there even one for gamerule or other.  Perhaps this should be retitled or moved to [[Legacy:Implementing An Interaction|Implementing an Interaction]].  Boy I'm slow.

'''NickR:''' For adding an interaction via a GameInfo, I would use the PostLogin function.

'''Burtlo:''' So NickR would you write one for GameInfo, and then we could perhaps create a series of pages for registering/adding interactions and include all the ways of doing it.  From the [[Legacy:Keypress Interactions|Keypress Interactions]] I found this one, but it seems narrow to say that it can only be done in a [[Legacy:Mutator|Mutator]].

'''Melaneus:''' I have been creating extra classes that the mutator spawns and makes them responsible for giving out interactions. I make one that runs through the Level.Controller list, and when it finds a new controller it spawns another class that's a subclass of ReplicationInfo and is owned by the new controller. It then calls a function that replicates to the client, and in this function is the call to create the interaction. I don't know... is running through the Level.ControllerList every tick going to slow things down much? Was my explanation a bit too weird? You could also just have a separate class that ran a tick that added an interaction only when Role &lt; Role_Authority or it's a listen or standalone.

'''Newbie:''' How do I get keypress events in UT1?

'''porkmanii:''' In reply to Mychaeel's previous comment about &quot;less problem-prone ways to paint to the HUD&quot;: In UT2004 (the [http://udn.epicgames.com/Two/HeadsUpDisplayReference UDN] says v3323 and up), [[Legacy:HudOverlay|HudOverlay]]s (Engine.HudOverlay) can be used to render to the HUD.  My mutator (Alternate HUDs) finds the local PlayerController (similarly to the example on this page), and then spawns a HudOverlay and adds it to the player's HUD's array of HudOverlays ([[Legacy:HUD|HUD]].Overlays).  Once the HUD is done rendering (in [[Legacy:HUD|HUD]].PostRender()), it calls HudOverlay.Render() for each HudOverlay in the Overlays array.  This seems to work just as well in network games as Instant Action.

'''Tango Whiskey:''' I keep seeing the tick function and am fuzzy on exactly what it's doing in terms of being called.  At the top of the tree, it's an event in Actor.  1. Is the Engine calling actor.tick or is actor.tick simply available to be called.  2.  For the tick function in this mutator, what is passing it the DeltaTime parm and how?  Do I really need to use it here?

'''porkmanii:''' Actor.Tick() is called by the engine each and every tick/frame.  DeltaTime is the time that has passed since the last tick/frame.  According to [[Legacy:Actor/Methods|Actor/Methods]], Tick is not called for any actor which has bStatic=True.

'''bloodlust:''' So if you create an interaction using a 3rd party class, does that mean the interaction can be accessed from the server? Like if you need access to ScreentoWorld on the server?</text>
    </revision>
    <revision>
      <id>2176</id>
      <timestamp>2006-12-03T06:22:34Z</timestamp>
      <contributor>
        <ip>D58-105-135-1.dsl.nsw.optusnet.com.au</ip>
      </contributor>
      <comment>* comment - tick explained</comment>
      <text xml:space="preserve">So you want to use an interaction - but dont know how to create one and have it work offline and online? Read on and see... :)

Interactions are created by calling

&lt;uscript&gt;PlayerController.Player.interactionMaster.AddInteraction(
  &quot;mypackage.interactionclass&quot;, 
  PlayerController.Player);
&lt;/uscript&gt;

where:
* ''mypackage'' is the name of the [[Legacy:Package|package]] the interaction class is contained in
* ''interactionclass'' is the name of the class that extends interaction. 

This ''mypackage.interactionclass'' format is maintained throughout all the code samples on this page.

The problem with this? An [[Legacy:InteractionMaster|InteractionMaster]] is client-side, so you need to do a couple of things to allow this to work online. First off, you need to make your mutator execute client-side. Mainly adding these two lines to your defaultproperties:

&lt;uscript&gt;
RemoteRole=ROLE_SimulatedProxy
bAlwaysRelevant=True
&lt;/uscript&gt;

You also need a [[Legacy:Simulated Function|simulated function]] that will run clientside and locate the 'local' playercontroller. Let's use &lt;code&gt;[[Legacy:Tick|Tick]]&lt;/code&gt;.

Getting the local [[Legacy:PlayerController|PlayerController]] requires a simple call to Level.GetLocalPlayerController().

Now we have a mutator that executes client-side, a function that can locate the local playercontroller, and we know how to create an interaction. Put it all together and you should have something that looks like:

&lt;uscript&gt;
class icu_mut extends Mutator;

var bool bAffectSpectators; // If this is set to true, an interaction will be created for spectators
var bool bAffectPlayers; // If this is set to true, an interaction will be created for players
var bool bHasInteraction;

function PreBeginPlay()
{
	//Log(&quot;ICU Mutator Started&quot;); // Always comment out your logs unless they're errors
}

simulated function Tick(float DeltaTime)
{
	local PlayerController PC;

	// If the player has an interaction already, exit function.
	if (bHasInteraction)
		Return;
	PC = Level.GetLocalPlayerController();

	// Run a check to see whether this mutator should create an interaction for the player
	if ( PC != None &amp;&amp; ((PC.PlayerReplicationInfo.bIsSpectator &amp;&amp; bAffectSpectators) || (bAffectPlayers &amp;&amp; !PC.PlayerReplicationInfo.bIsSpectator)) )
	{
		PC.Player.InteractionMaster.AddInteraction(&quot;ICU.icu_interaction&quot;, PC.Player); // Create the interaction
		bHasInteraction = True; // Set the variable so this lot isn't called again
	}
}

DefaultProperties
{
     bAffectSpectators=false
     bAffectPlayers=true
     RemoteRole=ROLE_SimulatedProxy
     bAlwaysRelevant=true
}
&lt;/uscript&gt;

Now you have the Mutator part done. 

==Adding an Interaction through a GameRule.==

Using that first block of code, you can add an Interaction through a [[Legacy:GameRules|GameRules]] actor as well. Adding an interaction is possible at any point that you have access to the PlayerController.

&lt;uscript&gt;
PlayerController.Player.interactionMaster.AddInteraction(&quot;mypackage.interactionclass&quot;, PlayerController.Player);
&lt;/uscript&gt;

This is essentially the same code just contained in a [[Legacy:GameRules|GameRules]] instead of a [[Legacy:Mutator|Mutator]].  It is simply to show an additional way of appending an [[Legacy:Interaction|Interaction]] to the [[Legacy:PlayerController|PlayerController]]'s InteractionMaster.

&lt;uscript&gt;
function bool OverridePickupQuery(Pawn Other, Pickup item, out byte bAllowPickup)  {

    local PlayerController PC;

    PC = PlayerController(Other.Controller);

	// Run a check to see whether this mutator should create an interaction for the player
	if ( PC != None &amp;&amp; ((PC.PlayerReplicationInfo.bIsSpectator &amp;&amp; bAffectSpectators) || (bAffectPlayers &amp;&amp; !PC.PlayerReplicationInfo.bIsSpectator)) )
	{
		PC.Player.InteractionMaster.AddInteraction(&quot;mypackage.interactionclass&quot;, PC.Player); // Create the interaction
		bHasInteraction = True; // Set the variable so this lot isn't called again
	}

//...Rest of the OverridePickupQuery code.
&lt;/uscript&gt;

==Adding an Interaction through a new third party class.==

Instead of making the mutator client side, you can have the mutator create a new class that is responsible for creating the interactions. Here's an example of using this method:

&lt;uscript&gt;
class SuperWeaponBarMutator extends Mutator;

function PostBeginPlay() {
	Spawn(class'SWBReplicator');
}

defaultproperties {
     	GroupName=&quot;SuperWeaponBar&quot;
     	FriendlyName=&quot;Super Weapon Bar&quot;
     	Description=&quot;Creates a new look and feel for the weapon bar.&quot;
}
&lt;/uscript&gt;

Here's the 3rd party class:

&lt;uscript&gt;
class SWBReplicator extends ReplicationInfo;

var bool bUpdated;

simulated function Tick(float dt) {
	if (Level.NetMode != NM_DedicatedServer &amp;&amp; Level.GetLocalPlayerController() != None &amp;&amp; !bUpdated) {
//Add extra conditions if needed.
		Level.GetLocalPlayerController().Player.interactionMaster.AddInteraction(&quot;SuperWeaponBar.SuperWeaponBarInteract&quot;, Level.GetLocalPlayerController().Player);
		bUpdated = true;
	}
}
&lt;/uscript&gt;

==Putting Interactions to use==

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

[[Legacy:HUD Interactions|HUD Interactions]]

[[Legacy:Keypress Interactions|Keypress Interactions]]

[[Legacy:Message Interactions|Message Interactions]]

----

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''Bjorn:''' I've removed the .Player.Actor.Pawn in PC.Player.Actor.Pawn.PlayerReplicationInfo because the PRI is already available from the PlayerController (Controller). Oh and, this document was just what I needed and does a good job at explaining stuff to the point, thanks a bunch!

'''Boksha:''' Some minor changes in the comments. Anyway, if the local player is not affected by this mutator, the foreach command will go on forever, slowing it down more than it should. Someone think of a workaround for this. Also, damnation. Apparently Mychaeel added something after I load the editing page, so I removed it. Here it is:

'''Mychaeel:''' A thought just occurred to me:  If the only purpose of creating an interaction from a mutator is being able to paint something on the HUD, there might be a less problem-prone way to achieve the same goal (from what I gather interactions don't play well when players try to connect to a different server using the &quot;open&quot; console command).  I didn't look into that yet so I might be way off, but could it be possible to exploit [[Legacy:LocalMessage|LocalMessage]]'s RenderComplexMessage function to paint arbitrary stuff on the client's HUD?

'''Rork:''' I downloaded the ICU mutator that is supposed to work online, but it doesn't: clients don't get the interaction, except if they are on the server (listen server). Do I live in twilight zone ? ;)

'''Wormbo:''' The usual preparations for client-side mods apply: Add the package to the ServerPackages list on the server and use UCC MasterMD5 to calculate the package's checksum before running the mod on the server.

'''Rork:''' Oh well I feel stupid now... Thanks Wormbo.

'''Mychaeel:''' At least the &quot;ucc mastermd5&quot; step should be obsolete as of UT2003 patch 1 &amp;ndash; isn't it, Wormbo?

'''Wormbo:''' Oh right, forgot that.

'''Burtlo:''' I was about to create a [[Legacy:Mutator|Mutator]] to include an interaction and I thought there must be a way to perform this in a [[Legacy:GameRules|GameRules]].  It worked.  So I thought it would be appropriate to mention it here, that it is obviously possible to implement.  And perhaps slightly more effecient because it's not on the ''Tick'' method.  But that is something I don't know enough about to make a comment.  Oh sh*t.  This is interaction from a mutator.  Is there even one for gamerule or other.  Perhaps this should be retitled or moved to [[Legacy:Implementing An Interaction|Implementing an Interaction]].  Boy I'm slow.

'''NickR:''' For adding an interaction via a GameInfo, I would use the PostLogin function.

'''Burtlo:''' So NickR would you write one for GameInfo, and then we could perhaps create a series of pages for registering/adding interactions and include all the ways of doing it.  From the [[Legacy:Keypress Interactions|Keypress Interactions]] I found this one, but it seems narrow to say that it can only be done in a [[Legacy:Mutator|Mutator]].

'''Melaneus:''' I have been creating extra classes that the mutator spawns and makes them responsible for giving out interactions. I make one that runs through the Level.Controller list, and when it finds a new controller it spawns another class that's a subclass of ReplicationInfo and is owned by the new controller. It then calls a function that replicates to the client, and in this function is the call to create the interaction. I don't know... is running through the Level.ControllerList every tick going to slow things down much? Was my explanation a bit too weird? You could also just have a separate class that ran a tick that added an interaction only when Role &lt; Role_Authority or it's a listen or standalone.

'''Newbie:''' How do I get keypress events in UT1?

'''porkmanii:''' In reply to Mychaeel's previous comment about &quot;less problem-prone ways to paint to the HUD&quot;: In UT2004 (the [http://udn.epicgames.com/Two/HeadsUpDisplayReference UDN] says v3323 and up), [[Legacy:HudOverlay|HudOverlay]]s (Engine.HudOverlay) can be used to render to the HUD.  My mutator (Alternate HUDs) finds the local PlayerController (similarly to the example on this page), and then spawns a HudOverlay and adds it to the player's HUD's array of HudOverlays ([[Legacy:HUD|HUD]].Overlays).  Once the HUD is done rendering (in [[Legacy:HUD|HUD]].PostRender()), it calls HudOverlay.Render() for each HudOverlay in the Overlays array.  This seems to work just as well in network games as Instant Action.

'''Tango Whiskey:''' I keep seeing the tick function and am fuzzy on exactly what it's doing in terms of being called.  At the top of the tree, it's an event in Actor.  1. Is the Engine calling actor.tick or is actor.tick simply available to be called.  2.  For the tick function in this mutator, what is passing it the DeltaTime parm and how?  Do I really need to use it here?

'''porkmanii:''' Actor.Tick() is called by the engine each and every tick/frame.  DeltaTime is the time that has passed since the last tick/frame.  According to [[Legacy:Actor/Methods|Actor/Methods]], Tick is not called for any actor which has bStatic=True.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating An Interaction From A PlayerController</title>
    <id>762</id>
    <revision>
      <id>2177</id>
      <timestamp>2004-12-01T06:17:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Interaction|Interaction]]s created from a [[Legacy:PlayerController|PlayerController]] are much simpler than those created from [[Legacy:Mutator|mutator]]s. You only need to add a small amount of code, and a variable.

First off, add a variable - bHasInteraction (you dont want to give a player several interactions):

&lt;uscript&gt;
var bool bHasInteraction
&lt;/uscript&gt;

Next, you will need to edit the state &quot;PlayerWaiting&quot;. Add a &quot;Begin:&quot; label (if you dont already have one), and add this code under it.

&lt;uscript&gt;
Begin:
	If ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
		{
		Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, Player);
		bHasInteraction = True;
		}
&lt;/uscript&gt;

.. and that's it.

Make sure you don't try to add an interaction within PostBeginPlay().  It won't work because Player is None.

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

*[[Legacy:HUD Interactions|HUD Interactions]]
*[[Legacy:Keypress Interactions|Keypress Interactions]]
*[[Legacy:Message Interactions|Message Interactions]]

==Comments ==

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''VonStrohmen:''' I tried using this procedure, but for some reason an InteractionMaster isn't spawned for my player controller. My player controller is always a spectator, if that makes a difference, and I check for PlayerController.Player.InteractionMaster every 2 seconds using a timer. The player is created, but the InteractionMaster isn't for some reason. I thought this might have to do with the fact that the player controller is always a spectator: any suggestions?

'''MasterOfTheDark:''' I had the same problem as VonStrohmen, and I used this code instead to add the interaction: ¶

&lt;uscript&gt;
function EnterStartState()
{
	Super.EnterStartState();
	if ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
	{
		Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, Player);
		bHasInteraction = True;
	}
}
&lt;/uscript&gt;

The code written by Will might work in previous versions of Unreal, but this is what is necessary for UT2003.  (Oh, and I checked it for net play.  It works there, too.)

'''Wormbo:''' There are no Interactions in previous engine versions... ;)

'''RegularX:''' &quot;you dont want to give a player several interactions&quot; &lt;&amp;ndash; why is that?  It can't juggle them?

'''Mychaeel:''' There's no technical problem with having several [[Legacy:Interaction|Interaction]]s stacked.  I think what's meant there is &quot;You don't want to ''accidentally'' give a player several ''instances of the same Interaction''&quot; if that code happens to be executed several times.

'''RegularX:''' That's what I suspected.  Question though - interactions I assume are client side only.  Does this mean that any config vars they use are based on the local client and not the server (unless otherwise replicated)?  I did some tests last night and that seemed to be true, but I remember similar things being much, much harder in Freehold UT to get the same effect (variables from a client machine valid online)

'''Mysterial:''' Values of config properties are taken from the machine they are spawned on (in this case, the client). Additionally, for replicated actors, as far as the server is concerned the properties have their default values, so changes in configuration will NOT be automatically replicated - you will either have to set a seperate property in an initialization function (e.g. PostBeginPlay()) or use replicated functions (PlayerController in particular uses this to inform the server of various clientside settings)</text>
    </revision>
    <revision>
      <id>2178</id>
      <timestamp>2004-11-25T04:55:27Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Interaction|Interaction]]s created from a [[Legacy:PlayerController|PlayerController]] are much simpler than those created from [[Legacy:Mutator|mutator]]s. You only need to add a small amount of code, and a variable.

First off, add a variable - bHasInteraction (you dont want to give a player several interactions):

&lt;uscript&gt;
var bool bHasInteraction
&lt;/uscript&gt;

Next, you will need to edit the state &quot;PlayerWaiting&quot;. Add a &quot;Begin:&quot; label (if you dont already have one), and add this code under it.

&lt;uscript&gt;
Begin:
	If ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
		{
		Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, Player);
		bHasInteraction = True;
		}
&lt;/uscript&gt;

.. and that's it.

Make sure you don't try to add an interaction within PostBeginPlay().  It won't work because Player is None.

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

*[[Legacy:HUD Interactions|HUD Interactions]]
*[[Legacy:Keypress Interactions|Keypress Interactions]]
*[[Legacy:Message Interactions|Message Interactions]]

==Comments ==

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''VonStrohmen:''' I tried using this procedure, but for some reason an InteractionMaster isn't spawned for my player controller. My player controller is always a spectator, if that makes a difference, and I check for PlayerController.Player.InteractionMaster every 2 seconds using a timer. The player is created, but the InteractionMaster isn't for some reason. I thought this might have to do with the fact that the player controller is always a spectator: any suggestions?

'''MasterOfTheDark:''' I had the same problem as VonStrohmen, and I used this code instead to add the interaction: ¶

&lt;uscript&gt;
function EnterStartState()
{
	Super.EnterStartState();
	if ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
	{
		Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, Player);
		bHasInteraction = True;
	}
}
&lt;/uscript&gt;

The code written by Will might work in previous versions of Unreal, but this is what is necessary for UT2003.  (Oh, and I checked it for net play.  It works there, too.)

'''Wormbo:''' There are no Interactions in previous engine versions... ;)

'''RegularX:''' &quot;you dont want to give a player several interactions&quot; &lt;&amp;ndash; why is that?  It can't juggle them?

'''Mychaeel:''' There's no technical problem with having several [[Legacy:Interaction|Interaction]]s stacked.  I think what's meant there is &quot;You don't want to ''accidentally'' give a player several ''instances of the same Interaction''&quot; if that code happens to be executed several times.

'''RegularX:''' That's what I suspected.  Question though - interactions I assume are client side only.  Does this mean that any config vars they use are based on the local client and not the server (unless otherwise replicated)?  I did some tests last night and that seemed to be true, but I remember similar things being much, much harder in Freehold UT to get the same effect (variables from a client machine valid online)

'''Mysterial:''' Values of config properties are taken from the machine they are spawned on (in this case, the client). Additionally, for replicated actors, as far as the server is concerned the properties have their default values, so changes in configuration will NOT be automatically replicated - you will either have to set a seperate property in an initialization function (e.g. PostBeginPlay()) or use replicated functions (PlayerController in particular uses this to inform the server of various clientside settings)</text>
    </revision>
    <revision>
      <id>2179</id>
      <timestamp>2004-12-01T04:54:03Z</timestamp>
      <contributor>
        <ip>Dsl178-185.globaldial.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Interaction|Interaction]]s created from a [[Legacy:PlayerController|PlayerController]] are much simpler than those created from [[Legacy:Mutator|mutator]]s. You only need to add a small amount of code, and a variable.

First off, add a variable - bHasInteraction (you dont want to give a player several interactions):

&lt;uscript&gt;
var bool bHasInteraction
&lt;/uscript&gt;

Next, you will need to edit the state &quot;PlayerWaiting&quot;. Add a &quot;Begin:&quot; label (if you dont already have one), and add this code under it.

&lt;uscript&gt;
Begin:
	If ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
		{
		Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, Player);
		bHasInteraction = True;
		}
&lt;/uscript&gt;

.. and that's it.

Make sure you don't try to add an interaction within PostBeginPlay().  It won't work because Player is None.

Interactions can do a whole load of stuff though, so choose a section relating to what you want to do:

*[[Legacy:HUD Interactions|HUD Interactions]]
*[[Legacy:Keypress Interactions|Keypress Interactions]]
*[[Legacy:Message Interactions|Message Interactions]]

==Comments ==

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''VonStrohmen:''' I tried using this procedure, but for some reason an InteractionMaster isn't spawned for my player controller. My player controller is always a spectator, if that makes a difference, and I check for PlayerController.Player.InteractionMaster every 2 seconds using a timer. The player is created, but the InteractionMaster isn't for some reason. I thought this might have to do with the fact that the player controller is always a spectator: any suggestions?

'''MasterOfTheDark:''' I had the same problem as VonStrohmen, and I used this code instead to add the interaction: ¶

&lt;uscript&gt;
function EnterStartState()
{
	Super.EnterStartState();
	if ((Viewport(Player) != None) &amp;&amp; (!bHasInteraction))
	{
		Player.InteractionMaster.AddInteraction(&quot;MyMod.MyInteraction&quot;, Player);
		bHasInteraction = True;
	}
}
&lt;/uscript&gt;

The code written by Will might work in previous versions of Unreal, but this is what is necessary for UT2003.  (Oh, and I checked it for net play.  It works there, too.)

'''Wormbo:''' There are no Interactions in previous engine versions... ;)

'''RegularX:''' &quot;you dont want to give a player several interactions&quot; &lt;&amp;ndash; why is that?  It can't juggle them?

'''Mychaeel:''' There's no technical problem with having several [[Legacy:Interaction|Interaction]]s stacked.  I think what's meant there is &quot;You don't want to ''accidentally'' give a player several ''instances of the same Interaction''&quot; if that code happens to be executed several times.

'''RegularX:''' That's what I suspected.  Question though - interactions I assume are client side only.  Does this mean that any config vars they use are based on the local client and not the server (unless otherwise replicated)?  I did some tests last night and that seemed to be true, but I remember similar things being much, much harder in Freehold UT to get the same effect (variables from a client machine valid online)

'''Mysterial:''' Values of config properties are taken from the machine they are spawned on (in this case, the client). Additionally, for replicated actors, as far as the server is concerned the properties have their default values, so changes in configuration will NOT be automatically replicated - you will either have to set a seperate property in an initialization function (e.g. PostBeginPlay()) or use replicated functions (PlayerController in particular uses this to inform the server of various clientside settings)http://buy-cialis.kucko.com

http://buy-levitra.kucko.com

http://buy-viagra-online.kucko.com

http://buy-viagra.kucko.com

http://cheap-cialis.kucko.com

http://cheap-levitra.kucko.com

http://cheap-viagra.kucko.com

http://cialis-online.kucko.com

http://cialis-viagra.kucko.com

http://cialis.kucko.com

http://generic-cialis.kucko.com

http://generic-viagra.kucko.com

http://levitra-online.kucko.com

http://levitra.kucko.com

http://order-viagra.kucko.com

http://viagra-levitra.kucko.com

http://viagra-online.kucko.com

http://viagra-prescription.kucko.com

http://viagra.kucko.com

http://adult-dating.adultfriendfindernow.com

http://adult-finder.adultfriendfindernow.com

http://adult-friend-find.adultfriendfindernow.com

http://adult-friend-finder-coupon.adultfriendfindernow.com

http://adult-friend-finder.adultfriendfindernow.com

http://adult-friend.adultfriendfindernow.com

http://adult-personals.adultfriendfindernow.com

http://adult-sex.adultfriendfindernow.com

http://adultfriendfinder-com.adultfriendfindernow.com

http://adultfriendfinder.adultfriendfindernow.com

http://free-adult-personals.adultfriendfindernow.com

http://friend-finder.adultfriendfindernow.com

http://photo-personals.adultfriendfindernow.com

http://sex-personals.adultfriendfindernow.com

http://adult-dating.adultfriendsite.com

http://adult-finder.adultfriendsite.com

http://adult-friend-find.adultfriendsite.com

http://adult-friend-finder-coupon.adultfriendsite.com

http://adult-friend-finder.adultfriendsite.com

http://adult-friend.adultfriendsite.com

http://adult-personals.adultfriendsite.com

http://adult-sex.adultfriendsite.com

http://adultfriendfinder-com.adultfriendsite.com

http://adultfriendfinder.adultfriendsite.com

http://free-adult-personals.adultfriendsite.com

http://friend-finder.adultfriendsite.com

http://photo-personals.adultfriendsite.com

http://sex-personals.adultfriendsite.com

http://adult-dating.dating999.com

http://adult-personals.dating999.com

http://christian-dating-service.dating999.com

http://christian-dating.dating999.com

http://dating-personals.dating999.com

http://dating-service.dating999.com

http://dating-site.dating999.com

http://dating-web-site.dating999.com

http://dating.dating999.com

http://free-dating.dating999.com

http://free-personals.dating999.com

http://internet-dating-service.dating999.com

http://internet-dating.dating999.com

http://on-line-dating.dating999.com

http://online-dating-service.dating999.com

http://online-dating.dating999.com

http://personals.dating999.com

http://photo-personals.dating999.com

http://singles-dating.dating999.com

http://buy-cialis.findbestpills.com

http://buy-levitra.findbestpills.com

http://buy-viagra-online.findbestpills.com

http://buy-viagra.findbestpills.com

http://cheap-cialis.findbestpills.com

http://cheap-levitra.findbestpills.com

http://cheap-viagra.findbestpills.com

http://cialis-online.findbestpills.com

http://cialis-viagra.findbestpills.com

http://cialis.findbestpills.com

http://generic-cialis.findbestpills.com

http://generic-viagra.findbestpills.com

http://levitra-online.findbestpills.com

http://levitra.findbestpills.com

http://order-viagra.findbestpills.com

http://viagra-levitra.findbestpills.com

http://viagra-online.findbestpills.com

http://viagra-prescription.findbestpills.com

http://viagra.findbestpills.com

http://adipex-online.diet-pills-now.net

http://adipex.diet-pills-now.net

http://buy-adipex.diet-pills-now.net

http://buy-didrex.diet-pills-now.net

http://buy-phentermine.diet-pills-now.net

http://buy-propecia.diet-pills-now.net

http://buy-soma.diet-pills-now.net

http://buy-tramadol.diet-pills-now.net

http://buy-ultram.diet-pills-now.net

http://carisoprodol.diet-pills-now.net

http://cheap-adipex.diet-pills-now.net

http://cheap-didrex.diet-pills-now.net

http://cheap-phentermine.diet-pills-now.net

http://cheap-propecia.diet-pills-now.net

http://cheap-soma.diet-pills-now.net

http://cheap-tramadol.diet-pills-now.net

http://didrex-online.diet-pills-now.net

http://didrex.diet-pills-now.net

http://order-phentermine.diet-pills-now.net

http://phentermine-online.diet-pills-now.net

http://phentermine-prescription.diet-pills-now.net

http://phentermine.diet-pills-now.net

http://propecia.diet-pills-now.net

http://purchase-phentermine.diet-pills-now.net

http://soma-online.diet-pills-now.net

http://soma.diet-pills-now.net

http://tramadol-online.diet-pills-now.net

http://tramadol.diet-pills-now.net

http://ultram-online.diet-pills-now.net

http://ultram.diet-pills-now.net

http://adult-sex-toys.fabuloussextoys.com

http://adult-toy-store.fabuloussextoys.com

http://adult-toys.fabuloussextoys.com

http://anal-toy.fabuloussextoys.com

http://big-dildo.fabuloussextoys.com

http://brutal-dildo.fabuloussextoys.com

http://dildo-vibrator.fabuloussextoys.com

http://dildo.fabuloussextoys.com

http://huge-dildo.fabuloussextoys.com

http://jack-rabbit-vibrator.fabuloussextoys.com

http://rabbit-vibrator.fabuloussextoys.com

http://sex-movie.fabuloussextoys.com

http://sex-shop.fabuloussextoys.com

http://sex-toy-shop.fabuloussextoys.com

http://sex-toy-store.fabuloussextoys.com

http://sex-toy.fabuloussextoys.com

http://sex-toys.fabuloussextoys.com

http://sex-videos.fabuloussextoys.com

http://vibrator.fabuloussextoys.com

http://vibrators.fabuloussextoys.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating And Using ScriptedActions</title>
    <id>788</id>
    <revision>
      <id>2233</id>
      <timestamp>2006-09-24T03:58:49Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Technically, either.</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2234</id>
      <timestamp>2006-09-23T19:59:33Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>How to activate a sequence???</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33942</id>
      <timestamp>2009-01-19T06:45:57Z</timestamp>
      <contributor>
        <ip>59.93.25.60</ip>
      </contributor>
      <comment>/* Related Topics */</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
* [[Legacy:Praxis Study|Praxis Study ]]Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this Praxis study guide.http://teachingsolutions.org/praxisstudy.html

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33943</id>
      <timestamp>2009-01-19T07:00:00Z</timestamp>
      <contributor>
        <ip>59.93.25.60</ip>
      </contributor>
      <comment>/* Related Topics */</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
** [[Legacy:Praxis Study|Praxis Study ]]Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this Praxis study guide.http://teachingsolutions.org/praxisstudy.html

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33944</id>
      <timestamp>2009-01-19T08:31:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/59.93.25.60|59.93.25.60]] ([[User talk:59.93.25.60|Talk]]); changed back to last version by [[User:SuperApe|SuperApe]]</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33945</id>
      <timestamp>2009-01-19T08:55:41Z</timestamp>
      <contributor>
        <username>Codeinfosystems</username>
        <id>1875</id>
      </contributor>
      <comment>/* Related Topics */</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
** [[Legacy:Praxis Study|Praxis Study]]
Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this Praxis study guide.http://teachingsolutions.org/praxisstudy.html

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33946</id>
      <timestamp>2009-01-19T09:06:36Z</timestamp>
      <contributor>
        <username>Codeinfosystems</username>
        <id>1875</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]
** [[Legacy:Praxis Study|Praxis Study]]
Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this Praxis study guide.http://teachingsolutions.org/praxisstudy.html

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

'''Praxis Study:''' Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this Praxis study guide. http://teachingsolutions.org/praxisstudy.html

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33947</id>
      <timestamp>2009-01-19T09:09:04Z</timestamp>
      <contributor>
        <username>Codeinfosystems</username>
        <id>1875</id>
      </contributor>
      <comment>/* Related Topics */</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

'''Praxis Study:''' Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this Praxis study guide. http://teachingsolutions.org/praxisstudy.html

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33948</id>
      <timestamp>2009-01-19T09:11:21Z</timestamp>
      <contributor>
        <username>Codeinfosystems</username>
        <id>1875</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

'''Praxis Study:''' Rip-out your tiring Praxis test stress eating away at you. A well deserved Praxis sigh of relief by using this [http://teachingsolutions.org/praxisstudy.html Praxis study guide]. 

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33949</id>
      <timestamp>2009-01-19T09:28:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Codeinfosystems|Codeinfosystems]] ([[User talk:Codeinfosystems|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">[[Legacy:ScriptedAction|ScriptedAction]]s, and their related [[Legacy:ScriptedSequence|ScriptedSequence]]s, are the premier method for getting [[Legacy:UT2003|UT2003]] AI to &quot;do stuff&quot;. Back in [[Legacy:UT|UT]], when coders wanted to introduce new behavior into bots or [[Legacy:ScriptedPawn|ScriptedPawn]]s, they would subclass whatever AI they were deriving from, and add code there.

In [[Legacy:UT2003|UT2003]], a similar action would be to subclass [[Legacy:Controller|Controller]]. However, with the addition of [[Legacy:ScriptedSequence|ScriptedSequence]]s, there is no longer the need to do this. Developers can just make a new [[Legacy:ScriptedAction|ScriptedAction]], and tell pawns to perform this action.

There are two reasons for this article. First is a very simple discussion about how to create subclasses of [[Legacy:ScriptedAction|ScriptedAction]]. The second is on how to actually use [[Legacy:ScriptedAction|ScriptedAction]]s, from the perspective of the coder.

==How Actions Work==

Within classes derived from [[Legacy:ScriptedController|ScriptedController]] (This includes [[Legacy:Bot|Bot]]s) there is a mechanism to perform actions. Basically, it's a [[Legacy:State|state]]: &lt;code&gt;state Scripting&lt;/code&gt;

What happens is that it's given a [[Legacy:ScriptedSequence|ScriptedSequence]], in its variable '''SequenceScript'''. This ScriptedSequence contains an array of [[Legacy:ScriptedAction|ScriptedAction]]s. Then, the controller runs through the actions one by one down the line until the last action. After that, if this Controller was artificially created, it destroys itself!

What this means is that: you can give &quot;unpossessed&quot; Pawns (with no controller) orders. They will temporarily don the [[Legacy:ScriptedController|ScriptedController]] hat and do the actions. Afterwards, it reverts to the original controller or no controller. 

Since the &lt;code&gt;state Scripting&lt;/code&gt; code is pretty self-explanatory, I won't run through that. Suffice to know, it's there and does your dirty work.

==Creating ScriptedActions==

===Anatomy of a ScriptedAction===

&lt;uscript&gt;
class ACTION_ChangeName extends ScriptedAction;

var(Action) string NewName;
var int Count;
&lt;/uscript&gt;

All published variables (''var()'') will be editable by the level designer at design time - in that nifty object properties box. 

===Basic Functions===

&lt;uscript&gt;
function bool InitActionFor(ScriptedController C)
{
	C.PlayerReplicationInfo.PlayerName = NewName;

	return true;	
}
&lt;/uscript&gt;

InitActionFor is the '''meat''' of the Action. This is where the action will usually happen. The passed variable '''C''' is, of course, the Controller of the Pawn that you are about to manipulate. From this, you can access its C.Pawn variable if you're interested.

&lt;uscript&gt;
function string GetActionString()
{
	return ActionString;
}
&lt;/uscript&gt;

GetActionString is, I believe, for logging purposes. It tells the log or whoever wants to know, what this Pawn is doing.

===Flow Control===

&lt;uscript&gt;
function ProceedToNextAction(ScriptedController C)
{
	C.ActionNum = Max(0,ActionNumber);
}

function ProceedToSectionEnd(ScriptedController C);
&lt;/uscript&gt;

ProceedToNextAction is called after your action has been executed. Therefore, if you want to (evilly) disrupt the flow, you can change this one here. A Controller's '''ActionNum''' property tells you which # in the ActionSequence it is currently performing

ProceedToSectionEnd is pre-coded. Call it, and you will be moved to the end of the section. 

&lt;uscript&gt;
function bool StartsSection();

function bool EndsSection();
&lt;/uscript&gt;

StartsSection signifies if the following Action is actually a section start. &quot;Section&quot; Actions are such like [[Legacy:ACTION_IFCONDITION|ACTION_IFCONDITION]] - they mark off a block of other sections.

EndsSection signifies if the Action is a section end.

&lt;uscript&gt;
function ScriptedSequence GetScript(ScriptedSequence S)
{
}
&lt;/uscript&gt;

GetScript - This is used if a different [[Legacy:ScriptedSequence|ScriptedSequence]] is desired. The passed variable S is the current ScriptedSequence, and you return a new one if you want the Controller to perform a different ScriptedSequence. If you return NONE, then the Controller stops scripting. 

===Latent Functions===

A [[Legacy:Latent Function|latent function]] is one that doesn't happen right away. It has ''latency''. In other words, when you give the action, it doesn't (shazzam) happen right away. For example, if I tell my dog to be in the bathroom, it won't be there right away. If I tell it to jump, it will jump right away. That's the long and short of it.

Latent actions will subclass [[Legacy:LatentScriptedAction|LatentScriptedAction]]. If you are writing latent actions, you must subclass this too!

&lt;uscript&gt;
function bool MoveToGoal();

function Actor GetMoveTargetFor(ScriptedController C);

function bool TurnToGoal();

function float GetDistance();

function bool CompleteOnAnim(int Num);

function bool CompleteWhenTriggered();

function bool CompleteWhenTimer();

function bool WaitForPlayer();

function bool TickedAction();

function bool StillTicking(ScriptedController C, float DeltaTime);
&lt;/uscript&gt;

'''Latent Actions'''

GetMoveTargetFor is where you can pass the MoveTarget, or &quot;goal&quot; as it is referred to. The actor you return is the target.

MoveToGoal tells the pawn to move to the goal specified (above). Return of true means that it will move to the goal.

TurnToGoal tells the pawn to turn towards the goal if you return true. If the Pawn is moving toward the goal, it will automatically turn.

'''Latent Pauses

GetDistance tells the pawn to wait until a Player gets within this value (you return this value) of the Controller's Pawn

CompleteOnAnim - if you return TRUE, then the sequence will complete when the animation finishes (the Num is the animation channel). CompleteOnAnim is called in the Pawn's &quot;AnimEnd&quot; function within its State Scripting.

CompleteWhenTriggered - TRUE means that the sequence will complete when the '''controller''' is triggered

CompleteWhenTimer - TRUE means that the sequence will complete when a player's ''Timer()'' is called (that is, you use the '''SetTimer''' command

TickedAction tells the Controller whether to process the StillTicking function.

StillTicking acts like the Tick(float DeltaTime) for us. If you return TRUE, then this function (StillTicking) will continue to be called every Tick. A return of FALSE signifies this action is done. It stopps recieving ticks and the action sequence moves on to the next action.

===Misc Functions===

&lt;uscript&gt;
function SetCurrentAnimationFor(ScriptedController C);

function bool PawnPlayBaseAnim(ScriptedController C, bool bFirstPlay);
&lt;/uscript&gt;

These two are hard-coded into ScriptedController - they are special functions. They allow you to modify whatever animation the Pawn is playing

===Default Properties===

&lt;uscript&gt;
var localized string ActionString;
var bool bValidForTrigger;
&lt;/uscript&gt;

ActionString, as talked about above, is a very short description of what the action does

bValidForTrigger signals whether this action is appropriate for use with a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (discussed briefly below)

===Summary===

Hopefully, with these explanations you are well on your way to writing new Actions and extending the capabilities of the AI.

==Using ScriptedActions and ScriptedSequences==

===Writing Scripted Sequences===

Typically, ScriptedActions aren't used by themselves, but used in a chain of actions called a ScriptedSequence. Since it's just an array, I won't go into the details of this. It'll suffice to give you an example.

&lt;uscript&gt;
class OPNavPoint extends UnrealScriptedSequence
	placeable;

function FreeScript()
{
	Destroy();				// When this sequence is completed, destroy it.
}

defaultproperties
{
	EnemyAcquisitionScriptProbability=+1.0
	bRoamingScript = false
	Priority = 200
	bCollideWhenPlacing=false
	bStatic=false
	bNoDelete=false
	bFreeLance = false

	Begin Object Class=Action_MOVETOPOINT Name=OPACTIONMoveToLocation
    End Object
	Begin Object Class=Action_CROUCH Name=OPACTIONCrouch
    End Object
	Begin Object Class=Action_WAITFORTIMER Name=OPACTIONWaitShort
		PauseTime = 3.0
    End Object
	Begin Object Class=Action_MOVETOPLAYER Name=OPACTIONMoveToPlayer
    End Object
	Begin Object Class=Action_SETALERTNESS Name=OPACTIONMakeAlert
		Alertness = ALERTNESS_LeaveScriptForCombat
    End Object
	Begin Object Class=Action_RUN Name=OPACTIONRun
    End Object

	Actions(0)=ScriptedAction'OPACTIONRun'
	Actions(1)=ScriptedAction'OPACTIONMoveToLocation'
	Actions(2)=ScriptedAction'OPACTIONCrouch'
}
&lt;/uscript&gt;

First, you see, you have to create the Action objects. You can set their variables if you wish. Then, you simply add new ScriptedActions to the array. This is much like adding buttons to a menu, if you're familiar with that. I've defined more objects than actions, for future references in classes that are subclasses of OPNavPoint. This way, I don't have to re-define everything.
 

What this OPNavPoint does is this. It makes the pawn start running to where the OPNavPoint is located, and then makes it crouch. Simple, and fun!

===Using Scripted Sequences===

To use the above script, I would have to put it in the position I want my pawn to go. Here is an example function, called within a subclass of [[Legacy:PlayerController|PlayerController]], that creats this order, and tells the pawn to execute it.

&lt;uscript&gt;
function DoMoveOut(Bot b, Vector MyLocation)
{
	local OPNavPoint opnp;

	MyLocation = Somewhere; // something like this

	opnp = Spawn(class'OPNavPoint',self,,MyLocation); // self is the commanding officer, in this case
	OPBot(b).ReceiveDestination(self,opnp);
}
&lt;/uscript&gt;

What's ReceiveDestination? It's a small function within OPBot, my subclass of [[Legacy:Bot|Bot]] that tells pawns what to do.

&lt;uscript&gt;
function RecieveDestination(Controller c, UnrealScriptedSequence s)
{
	if(s == none)				// no script, no action
		return;
	s.CurrentUser = self;		// Me, I'm the current user of the script.
	StopCurrentScript();		// Stop doing whatever i'm doing.
	GoalScript = s;				// Assing the Script to the &quot;GoalScript&quot; property
	SetNewScript(s);			// Tell myself that I have new orders
	SendMessage(c.PlayerReplicationInfo, 'ACK', 0, 5, 'TEAM');	// Tell the person who sent me the order that I heard them
	Level.Game.Broadcast(self, &quot;Order Recieved.&quot;, 'TeamSay');	// Same
	if(c.IsA('PlayerController'))
		MyPlayerController = PlayerController(c);		// The person who sent me the order is MyPlayerController (for certain Action's, and debugging)
	GoToState('Scripting');		// Now, go script!
}
&lt;/uscript&gt;

There's a bit of extra code up there, but you can get the general picture. As you can see, it's not to hard to give the bot orders!

====Broken?====

Finally, there's one more thing I must mention. Occasionally, scripts &quot;break&quot;. There could be many reasons for this, but basically, it stops working. This is quite annoying for after a script is broken, Pawn behavior is very erratic and strange. The game might crash. I leave this fragment to you:

&lt;uscript&gt;
// Broken scripted sequence - for debugging
State Broken
{
Begin:
	MyPlayerController.Pawn.ClientMessage(Pawn$&quot; Scripted Sequence BROKEN &quot;$SequenceScript$&quot; ACTION &quot;$CurrentAction);
	WanderOrCamp(true);
}
&lt;/uscript&gt;

This will tell you if your pawn's script broke, and make sure that the pawn doesn't actually go haywire. It tells the pawn to wander around. Thus, you know which action is causing the break-age, and without a VERY annoying crash.

====One last thing to think about====

Finally, some things will compete with you when giving orders to pawns. That would be [[Legacy:TeamAI|TeamAI]] and [[Legacy:SquadAI|SquadAI]]. For example, if I told a pawn to move past a ball in a regular bombing run game, it would go for the ball, ignore all subsequent orders of mine, and score on the opposing team.

The easy way to solve this problem would be to subclass these two AI classes and modify their code. It's just a consideration for you.

===ScriptedTrigger===

[[Legacy:ScriptedTrigger|ScriptedTrigger]] and [[Legacy:ScriptedTriggerController|ScriptedTriggerController]] are two more classes that help you out. ScriptedTriggerController is able to perform scripted events without a Pawn. In other words, if you have certain actions like [[Legacy:ACTION_SpawnActor|ACTION_SpawnActor]] that do not need a pawn to perform, you would use a ScriptedTrigger (which incidentally subclasses ScriptedSequence) to perform these. You'll notice, if you examine UT's source code that '''actions that require a [[Legacy:Pawn|Pawn]] to perform''' are generally bValidForTrigger=false and cannot be used with ScriptedTriggers. 

And, if you look at ScriptedTrigger, it spawns a ScriptedTriggerController, which needs and has no Pawn attached. The funny thing is, I think Scripted'''Trigger''' is a misnomer, as this class has nothing to do with Triggers. You can of course add an action like the [[Legacy:Action_WaitForEvent|Action_WaitForEvent]] that causes your ScriptedTrigger to activate upon being triggered. However, it doesn't seem to be directly linked to triggers.

==Conclusion==

Okay! Hopefully, with this, we are on the way to cool new things. Some possibilities for using this code:
*New AI abilities (like finding cover)
*A method for ordering bots around (You! Go Here!)
*Movies - dynamic ingame movies dictated by code and not pre-made by level designers

==Related Topics==
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
** [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Monster Support|Monster Support]]
** [[Legacy:NPC Support|NPC Support]]

==Discussion==

'''Soldat:''' todo: talk about the default properties. I forgot to do that. also, I have example code if anyone's interested, I coded bot orders and such.

'''Soldat:''' okay, done all that. added scripted trigger stuff too, which i did not notice earlier.

'''Tarquin:''' Nice article! I actually feel I understand this whole scripted stuff!

'''Hawkeye:''' I strongly disagree. This is almost completely unreadable and unintelligible for people without some programming experience. 

A ScriptedSequence is a script that does stuff. The stuff it does are a bunch of ScriptedActions. So if you want a new type of action in your ScriptedSequence (say, for instance, move to a number of pathnodes in a certain order) that isn't already in the game, you can write a new class for it under Object-&gt;ScriptedAction (Untick both options in your classes browser to find it). The new ScriptedAction will become available to be placed in new ScriptedSequences.

That's what it ''should'' say, but it doesn't. It's WAY too technical. Also, many things are considered to be known to the reader by the writer, and he doesn't elaborate most of the examples he gives. This article was clearly written by a programmer.

'''Oboyrex:''' Hawkeyes point is well taken, my rule of thumb is to make it useful to my grandmother, but let me just say that the content on this page is some of the most useful to me on the whole site, so keep in someplace.

'''Solid Snake:''' Ahh, I think all programming articles are meant for programmers in general. We aren't writing to the general public, we are writing for other fellow coders who haven't learnt a part of UScript yet. It's like teaching anything to anyone, you assume basic knowledge and while every tutorial can go over everything with a fine tooth comb, it's completely unneccessary. Does Soldat really need to define what a variable, object, instance and so on mean?

'''SuperApe:''' This is a tutorial, isn't it?

'''Bob_The_Beheader:''' How exactly are the sequences activated? Do bots have to come within a certain radius of them, like triggers? or are they something that is activated when triggered?

'''SuperApe:''' Technically, either.  A ScriptedSequence set with the latent action ACTION_WaitForPlayer can &quot;grab&quot; a bot.  But, this is meant to be either set via AI -&gt; AIScriptTag to control a Pawn from match start or via Trigger actor (something that will pass the trigger Instigator to the ScriptedSequence).  The script has to be associated with a Pawn.  Also, some GameObjects or GameInfo actors assign bots to ScriptedSequences, as in CTF DefenseScripts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating DM-Quadroid</title>
    <id>750</id>
    <revision>
      <id>2147</id>
      <timestamp>2005-12-01T00:17:14Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: Creating DM-Quadroid for UT ==

===Quick Introduction ===

This is the start of a tutorial that will walk you through building a small deathmatch level for Unreal Tournament.  The level itself won't be particularly inspiring but will cover most of the things you'll need to know to start creating awesome levels yourself.

The [[Legacy:Creating DM-Quadroid2K3|Creating DM-Quadroid2K3]] is a tutorial covering the creation of an equivalent (not identical) level in Unreal Tournament 2003.  Some of the techniques used between the two versions of the engines are sufficiently different to warrant having both examples.

===Creating the Map Layout ===

Start the Editor if you haven't already.  If you don't know how to start the editor, or have problems then look at the [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]].  Remember, the Unreal editor is not the most stable of programs so save your work often.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CreateTheRooms]] &amp;ndash; Step 1: Create the rooms we need for our simple map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CreateTheCorridors]] &amp;ndash; Step 2: Join the rooms up together.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AddLights]] &amp;ndash; Now add some lights so we can see.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts]] &amp;ndash; We need some player starts.

At this point you can take you map for a quick test run.  You need to [[Legacy:Build|Build]] you level and then click on the &quot;Joystick&quot; icon in the toolbar.  If all goes well Unreal Tournament will start up and you'll be playing your map in a few seconds.

===Making the Map More Interesting ===

===Adding Items and Bot Paths ===

===The Finishing Touches ===

''To be continued....I'm actually out for the next couple of evenings so I'll probably not get much done.  It will be finished though.  Sub-pages rule OK.''

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Determine if this page duplicates efforts made on other pages, possibly rework into them and remove this page with a Delete Me tag.
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2148</id>
      <timestamp>2002-10-05T17:59:39Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: Creating DM-Quadroid for UT ==

===Quick Introduction ===

This is the start of a tutorial that will walk you through building a small deathmatch level for Unreal Tournament.  The level itself won't be particularly inspiring but will cover most of the things you'll need to know to start creating awesome levels yourself.

The [[Legacy:Creating DM-Quadroid2K3|Creating DM-Quadroid2K3]] is a tutorial covering the creation of an equivalent (not identical) level in Unreal Tournament 2003.  Some of the techniques used between the two versions of the engines are sufficiently different to warrant having both examples.

===Creating the Map Layout ===

Start the Editor if you haven't already.  If you don't know how to start the editor, or have problems then look at the [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]].  Remember, the Unreal editor is not the most stable of programs so save your work often.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CreateTheRooms]] &amp;ndash; Step 1: Create the rooms we need for our simple map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CreateTheCorridors]] &amp;ndash; Step 2: Join the rooms up together.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AddLights]] &amp;ndash; Now add some lights so we can see.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts]] &amp;ndash; We need some player starts.

At this point you can take you map for a quick test run.  You need to [[Legacy:Build|Build]] you level and then click on the &quot;Joystick&quot; icon in the toolbar.  If all goes well Unreal Tournament will start up and you'll be playing your map in a few seconds.

===Making the Map More Interesting ===

===Adding Items and Bot Paths ===

===The Finishing Touches ===

''To be continued....I'm actually out for the next couple of evenings so I'll probably not get mouch done.  It will be finished though.  Sub-pages rule OK.''

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2149</id>
      <timestamp>2003-06-20T18:55:41Z</timestamp>
      <contributor>
        <ip>198-144-172-7.oneida.tn.nxs.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: Creating DM-Quadroid for UT ==

===Quick Introduction ===

This is the start of a tutorial that will walk you through building a small deathmatch level for Unreal Tournament.  The level itself won't be particularly inspiring but will cover most of the things you'll need to know to start creating awesome levels yourself.

The [[Legacy:Creating DM-Quadroid2K3|Creating DM-Quadroid2K3]] is a tutorial covering the creation of an equivalent (not identical) level in Unreal Tournament 2003.  Some of the techniques used between the two versions of the engines are sufficiently different to warrant having both examples.

===Creating the Map Layout ===

Start the Editor if you haven't already.  If you don't know how to start the editor, or have problems then look at the [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]].  Remember, the Unreal editor is not the most stable of programs so save your work often.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CreateTheRooms]] &amp;ndash; Step 1: Create the rooms we need for our simple map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CreateTheCorridors]] &amp;ndash; Step 2: Join the rooms up together.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AddLights]] &amp;ndash; Now add some lights so we can see.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerStarts]] &amp;ndash; We need some player starts.

At this point you can take you map for a quick test run.  You need to [[Legacy:Build|Build]] you level and then click on the &quot;Joystick&quot; icon in the toolbar.  If all goes well Unreal Tournament will start up and you'll be playing your map in a few seconds.

===Making the Map More Interesting ===

===Adding Items and Bot Paths ===

===The Finishing Touches ===

''To be continued....I'm actually out for the next couple of evenings so I'll probably not get much done.  It will be finished though.  Sub-pages rule OK.''

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating DM-Quadroid/AddLights</title>
    <id>753</id>
    <revision>
      <id>2155</id>
      <timestamp>2008-03-25T15:22:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Adding the Lights ==

In this part of the tutorial we are going to add some lights to our map.  Without lights the only way you can see is if you add light at the map level.  You can do that in the [[Legacy:Level Properties|Level Properties]], but the result is generally very bland.  In this part of the tutorial you will cover the following
* Create a basic light shape and texture it.
* How to use the Duplicate tool (I'm a lazy mapper).
* Rebuild the geometry in the level.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Completed the second part of this tutorial [[Legacy:Creating DM-Quadroid/CreateTheCorridors|Creating DM-Quadroid/CreateTheCorridors]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size, textured them, and added corridors.  We haven't added any lights or player start positions yet so the level is not only very dark, its also not playable. 

===Adding the lights ===

====Step 1: Create and texture the light shape ====
* Make the [[Legacy:Red Builder Brush|red builder brush]] into a cube, 64 units in width and breadth, and 32 in height.  This will be our light shape.
* Once you have created the light shape, add it to our world as a [[Legacy:Semisolid|Semisolid]].  The easiest way to do this is to use the [[Legacy:Add Special|Add Special]] option in the brush menu and change the ''prefabs drop list'' to ''Semisolid Pillar''.  Once you've done that, you can press the ''OK'' button to add it to your level.
: When you press the add button you will see a pinkish brush get added to your level.

* Now that you've added the light object you need to move it into position (level with the ceiling) and texture it.  You may find the [[Legacy:Decorating Rooms With Textures|Decorating Rooms With Textures]] a handy reference at this point.  We are going to place four lights in each room so make sure you leave room to evenly space them around the room.
* Once you have textured the light to your satisfaction we'll move it into position.  I used ''RCLFTRM3'' in the Trim texture group of UTtech2 for the sides of the light, and ''RCLFLIT1XY'' in the Light group of UTtech2 for the light itself.  We also need to set the light texture to [[Legacy:Special Lit|Special Lit]].
: The reason we set the light texture to &quot;special lit&quot; is to give us greater control over how the light looks.  By setting the special lit property of the light we can control the light within the room, and the light that shines on the light texture itself independently.  This is a good thing.  You should have something like the picture below.

[[Image:Legacy_dmquadroid-addlights1.gif|center|]]

====Step 2: Add the lights ====

We are now ready to add some lights - at long last.  We have our light shape, we've got it nicely textured and it looks lovely sitting on our ceiling.  If you've moved the light geometry object then rebuild the geometry before continuing.
* In the 3D view right click on the light texture and select the ''Add Light Here'' option.
: You will see a little torch icon appear as if by magic.  This is our light object.

* In one of the side views move the light you just added down so that it's around 196 units (1.5 big squares) below the ceiling.  You can do this by clicking once on the torch (it should go green), holding down the Shift key and dragging (keep the left mouse button down) the torch shape downwards.

* Once you have move the light into position, add another light in the same way as the first, but don't move it.
: From a side view you should now see your light, below that the second light you added, and below that the first light you added.  There's a picture below.

[[Image:Legacy_dmquadroid-addlights2.gif|center|]]

* Select the highest light, and right click on it.  Select the ''Light Properties'' option (it's at the top).  A big scary window will pop up from nowhere.  Open up the ''Lighting'' group and set the ''bSpecialLit'' value to true, and the ''LightRadius'' to 32.
: This will cause this light to only affect surfaces within it's radius that have a surface flag of ''special lit''.

* Now open the ''LightColor'' group and set the ''LightBrightness'' to 196.  This is going to be the colour of the light texture.
: You can now use the ''rebuild lighting'' tool to build the lights within the level.  If you are lazy like I am, you can rebuild everything in the level all in one go using the ''build all'' tool.

====Step 3: One light is not enough ====

OK, so we've built a light shape and lit it with two lights.  That's not enough, we need lots of lights.  In fact, we are going to create four lights per room.
* In either the side or front view select both lights and your light geometry object (or brush).  You can do this by holding down the ''Control'' key and Left clicking each of the objects in turn.
: The light objects (torches) should be green.  The light brush should be pink (because it's a Semisolid).

* Now right click on any of the objects and select the ''Duplicate'' option.
: You should see a new brush and two new lights appear - selected.  Move the objects into an appropriate position within your room.  When they are in position duplicate them again.  Remember, we want 4 lights per room.

*Once you have your four lights positioned nicely rebuild everything using the ''build all'' toolbar icon.  You may have noticed that the ''Duplicate'' option didn't affect the displayed geometry in the 3D view.
: The first thing you will notice is that it's awfully bright in there.  The floor looks completely washed out.  In game, the level will look even brighter.  We need to do something about that.

* Select all four of the lower lights you have created and set their brightness to 24 (hint: we changed the light brightness above).
: That should look much better now.  It may look a little dark.  Don't worry, in game things appear slightly brighter than they do in the editor.  If you find that the brightness of the light texture changes when you do this it means you haven't set the ''SpecialLit'' property of the texture.  Do this now and then rebuild everything again.

* Now we have lit one room, duplicate your four lights (brush and two torches apiece) and add them to the other three rooms.
: You should now have four beautifully lit rooms.  Feel free to take a room and play around with the different lighting effects.  But to be honest, it's best left till we've added some player starts.  Which is the next tutorial.

====That's It ====

Well done.  You've managed to complete the third part of the tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms, complete with lights.  Even though we have done all this we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in the square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save'' to save the level over the top of your previous version.  You can save it under a different name if you like.  Remember the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.

You are now ready to move on to [[Legacy:Creating DM-Quadroid/PlayerStarts|Creating DM-Quadroid/PlayerStarts]], and add some player starts to the map.  And then .... you can play it!  See you there.

You can also see [[Legacy:Lighting Basics|Lighting Basics]] for more information.</text>
    </revision>
    <revision>
      <id>2156</id>
      <timestamp>2003-08-13T14:30:58Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>any chance of an image rename?</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Adding the Lights ==

In this part of the tutorial we are going to add some lights to our map.  Without lights the only way you can see is if you add light at the map level.  You can do that in the [[Legacy:Level Properties|Level Properties]], but the result is generally very bland.  In this part of the tutorial you will cover the following
* Create a basic light shape and texture it.
* How to use the Duplicate tool (I'm a lazy mapper).
* Rebuild the geometry in the level.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Completed the second part of this tutorial [[Legacy:Creating DM-Quadroid/CreateTheCorridors|Creating DM-Quadroid/CreateTheCorridors]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size, textured them, and added corridors.  We haven't added any lights or player start positions yet so the level is not only very dark, its also not playable. 

===Adding the lights ===

====Step 1: Create and texture the light shape ====
* Make the [[Legacy:Red Builder Brush|red builder brush]] into a cube, 64 units in width and breadth, and 32 in height.  This will be our light shape.
* Once you have created the light shape, add it to our world as a [[Legacy:Semisolid|Semisolid]].  The easiest way to do this is to use the [[Legacy:Add Special|Add Special]] option in the brush menu and change the ''prefabs drop list'' to ''Semisolid Pillar''.  Once you've done that, you can press the ''OK'' button to add it to your level.
: When you press the add button you will see a pinkish brush get added to your level.

* Now that you've added the light object you need to move it into position (level with the ceiling) and texture it.  You may find the [[Legacy:Decorating Rooms With Textures|Decorating Rooms With Textures]] a handy reference at this point.  We are going to place four lights in each room so make sure you leave room to evenly space them around the room.
* Once you have textured the light to your satisfaction we'll move it into position.  I used ''RCLFTRM3'' in the Trim texture group of UTtech2 for the sides of the light, and ''RCLFLIT1XY'' in the Light group of UTtech2 for the light itself.  We also need to set the light texture to [[Legacy:Special Lit|Special Lit]].
: The reason we set the light texture to &quot;special lit&quot; is to give us greater control over how the light looks.  By setting the special lit property of the light we can control the light within the room, and the light that shines on the light texture itself independently.  This is a good thing.  You should have something like the picture below.

@inline@dm-quadroid-addlights1

====Step 2: Add the lights ====

We are now ready to add some lights - at long last.  We have our light shape, we've got it nicely textured and it looks lovely sitting on our ceiling.  If you've moved the light geometry object then rebuild the geometry before continuing.
* In the 3D view right click on the light texture and select the ''Add Light Here'' option.
: You will see a little torch icon appear as if by magic.  This is our light object.

* In one of the side views move the light you just added down so that it's around 196 units (1.5 big squares) below the ceiling.  You can do this by clicking once on the torch (it should go green), holding down the Shift key and dragging (keep the left mouse button down) the torch shape downwards.

* Once you have move the light into position, add another light in the same way as the first, but don't move it.
: From a side view you should now see your light, below that the second light you added, and below that the first light you added.  There's a picture below.

@inline@dm-quadroid-addlights2

* Select the highest light, and right click on it.  Select the ''Light Properties'' option (it's at the top).  A big scary window will pop up from nowhere.  Open up the ''Lighting'' group and set the ''bSpecialLit'' value to true, and the ''LightRadius'' to 32.
: This will cause this light to only affect surfaces within it's radius that have a surface flag of ''special lit''.

* Now open the ''LightColor'' group and set the ''LightBrightness'' to 196.  This is going to be the colour of the light texture.
: You can now use the ''rebuild lighting'' tool to build the lights within the level.  If you are lazy like I am, you can rebuild everything in the level all in one go using the ''build all'' tool.

====Step 3: One light is not enough ====

OK, so we've built a light shape and lit it with two lights.  That's not enough, we need lots of lights.  In fact, we are going to create four lights per room.
* In either the side or front view select both lights and your light geometry object (or brush).  You can do this by holding down the ''Control'' key and Left clicking each of the objects in turn.
: The light objects (torches) should be green.  The light brush should be pink (because it's a Semisolid).

* Now right click on any of the objects and select the ''Duplicate'' option.
: You should see a new brush and two new lights appear - selected.  Move the objects into an appropriate position within your room.  When they are in position duplicate them again.  Remember, we want 4 lights per room.

*Once you have your four lights positioned nicely rebuild everything using the ''build all'' toolbar icon.  You may have noticed that the ''Duplicate'' option didn't affect the displayed geometry in the 3D view.
: The first thing you will notice is that it's awfully bright in there.  The floor looks completely washed out.  In game, the level will look even brighter.  We need to do something about that.

* Select all four of the lower lights you have created and set their brightness to 24 (hint: we changed the light brightness above).
: That should look much better now.  It may look a little dark.  Don't worry, in game things appear slightly brighter than they do in the editor.  If you find that the brightness of the light texture changes when you do this it means you haven't set the ''SpecialLit'' property of the texture.  Do this now and then rebuild everything again.

* Now we have lit one room, duplicate your four lights (brush and two torches apiece) and add them to the other three rooms.
: You should now have four beautifully lit rooms.  Feel free to take a room and play around with the different lighting effects.  But to be honest, it's best left till we've added some player starts.  Which is the next tutorial.

====That's It ====

Well done.  You've managed to complete the third part of the tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms, complete with lights.  Even though we have done all this we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in the square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save'' to save the level over the top of your previous version.  You can save it under a different name if you like.  Remember the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.

You are now ready to move on to [[Legacy:Creating DM-Quadroid/PlayerStarts|Creating DM-Quadroid/PlayerStarts]], and add some player starts to the map.  And then .... you can play it!  See you there.

You can also see [[Legacy:Lighting Basics|Lighting Basics]] for more information.

----

'''EntropicLqd:''' If anyone cares to rename the images from dm-quadroid... to dmquadroid... it would at least keep the image names consistent for this section.</text>
    </revision>
    <revision>
      <id>2157</id>
      <timestamp>2003-08-13T15:00:12Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>images renamed</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Adding the Lights ==

In this part of the tutorial we are going to add some lights to our map.  Without lights the only way you can see is if you add light at the map level.  You can do that in the [[Legacy:Level Properties|Level Properties]], but the result is generally very bland.  In this part of the tutorial you will cover the following
* Create a basic light shape and texture it.
* How to use the Duplicate tool (I'm a lazy mapper).
* Rebuild the geometry in the level.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Completed the second part of this tutorial [[Legacy:Creating DM-Quadroid/CreateTheCorridors|Creating DM-Quadroid/CreateTheCorridors]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size, textured them, and added corridors.  We haven't added any lights or player start positions yet so the level is not only very dark, its also not playable. 

===Adding the lights ===

====Step 1: Create and texture the light shape ====
* Make the [[Legacy:Red Builder Brush|red builder brush]] into a cube, 64 units in width and breadth, and 32 in height.  This will be our light shape.
* Once you have created the light shape, add it to our world as a [[Legacy:Semisolid|Semisolid]].  The easiest way to do this is to use the [[Legacy:Add Special|Add Special]] option in the brush menu and change the ''prefabs drop list'' to ''Semisolid Pillar''.  Once you've done that, you can press the ''OK'' button to add it to your level.
: When you press the add button you will see a pinkish brush get added to your level.

* Now that you've added the light object you need to move it into position (level with the ceiling) and texture it.  You may find the [[Legacy:Decorating Rooms With Textures|Decorating Rooms With Textures]] a handy reference at this point.  We are going to place four lights in each room so make sure you leave room to evenly space them around the room.
* Once you have textured the light to your satisfaction we'll move it into position.  I used ''RCLFTRM3'' in the Trim texture group of UTtech2 for the sides of the light, and ''RCLFLIT1XY'' in the Light group of UTtech2 for the light itself.  We also need to set the light texture to [[Legacy:Special Lit|Special Lit]].
: The reason we set the light texture to &quot;special lit&quot; is to give us greater control over how the light looks.  By setting the special lit property of the light we can control the light within the room, and the light that shines on the light texture itself independently.  This is a good thing.  You should have something like the picture below.

[[Image:Legacy_dmquadroid-addlights1.gif|]]

====Step 2: Add the lights ====

We are now ready to add some lights - at long last.  We have our light shape, we've got it nicely textured and it looks lovely sitting on our ceiling.  If you've moved the light geometry object then rebuild the geometry before continuing.
* In the 3D view right click on the light texture and select the ''Add Light Here'' option.
: You will see a little torch icon appear as if by magic.  This is our light object.

* In one of the side views move the light you just added down so that it's around 196 units (1.5 big squares) below the ceiling.  You can do this by clicking once on the torch (it should go green), holding down the Shift key and dragging (keep the left mouse button down) the torch shape downwards.

* Once you have move the light into position, add another light in the same way as the first, but don't move it.
: From a side view you should now see your light, below that the second light you added, and below that the first light you added.  There's a picture below.

[[Image:Legacy_dmquadroid-addlights2.gif|]]

* Select the highest light, and right click on it.  Select the ''Light Properties'' option (it's at the top).  A big scary window will pop up from nowhere.  Open up the ''Lighting'' group and set the ''bSpecialLit'' value to true, and the ''LightRadius'' to 32.
: This will cause this light to only affect surfaces within it's radius that have a surface flag of ''special lit''.

* Now open the ''LightColor'' group and set the ''LightBrightness'' to 196.  This is going to be the colour of the light texture.
: You can now use the ''rebuild lighting'' tool to build the lights within the level.  If you are lazy like I am, you can rebuild everything in the level all in one go using the ''build all'' tool.

====Step 3: One light is not enough ====

OK, so we've built a light shape and lit it with two lights.  That's not enough, we need lots of lights.  In fact, we are going to create four lights per room.
* In either the side or front view select both lights and your light geometry object (or brush).  You can do this by holding down the ''Control'' key and Left clicking each of the objects in turn.
: The light objects (torches) should be green.  The light brush should be pink (because it's a Semisolid).

* Now right click on any of the objects and select the ''Duplicate'' option.
: You should see a new brush and two new lights appear - selected.  Move the objects into an appropriate position within your room.  When they are in position duplicate them again.  Remember, we want 4 lights per room.

*Once you have your four lights positioned nicely rebuild everything using the ''build all'' toolbar icon.  You may have noticed that the ''Duplicate'' option didn't affect the displayed geometry in the 3D view.
: The first thing you will notice is that it's awfully bright in there.  The floor looks completely washed out.  In game, the level will look even brighter.  We need to do something about that.

* Select all four of the lower lights you have created and set their brightness to 24 (hint: we changed the light brightness above).
: That should look much better now.  It may look a little dark.  Don't worry, in game things appear slightly brighter than they do in the editor.  If you find that the brightness of the light texture changes when you do this it means you haven't set the ''SpecialLit'' property of the texture.  Do this now and then rebuild everything again.

* Now we have lit one room, duplicate your four lights (brush and two torches apiece) and add them to the other three rooms.
: You should now have four beautifully lit rooms.  Feel free to take a room and play around with the different lighting effects.  But to be honest, it's best left till we've added some player starts.  Which is the next tutorial.

====That's It ====

Well done.  You've managed to complete the third part of the tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms, complete with lights.  Even though we have done all this we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in the square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save'' to save the level over the top of your previous version.  You can save it under a different name if you like.  Remember the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.

You are now ready to move on to [[Legacy:Creating DM-Quadroid/PlayerStarts|Creating DM-Quadroid/PlayerStarts]], and add some player starts to the map.  And then .... you can play it!  See you there.

You can also see [[Legacy:Lighting Basics|Lighting Basics]] for more information.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating DM-Quadroid/CreateTheCorridors</title>
    <id>752</id>
    <revision>
      <id>2153</id>
      <timestamp>2003-08-12T09:46:55Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>tweakage</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Building the Corridors ==

In this part of the tutorial we are going to join our four rooms with four corridors.  In order to keep things simple we'll make the corridors all the same (although you can texture them differently if you like).  In this part of the tutorial you will cover the following
* How to change the [[Legacy:Red Builder Brush|red builder brush]] into a cube of a specified size.
* How to create a corridor using the &quot;subtract&quot; operation (see [[Legacy:CSG|CSG]] for more information).
* How to apply basic texturing.
* Rebuild the geometry in the level.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Completed the first part of this tutorial [[Legacy:Creating Dm-Quadroid/CreateTheRooms|Creating Dm-Quadroid/CreateTheRooms]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size and textured them.  We haven't added any lights or player start positions yet so the level is not playable.

===Building the Rooms ===

====Step 1: Create a corridor shape  ====
* The first thing to do is make the [[Legacy:Red Builder Brush|red builder brush]] the right size.  Right click on the &quot;Cube&quot; icon (''insert cube icon here'') in the tool box, and enter the values 256, 512, 256 for the height, width, and breadth respectively, and press the build button.  This will give us our top/bottom corridor shape.
: You will see the size and shape of the red builder brush change to the dimensions you have just specified.  Remember that the brush won't change shape until you actually press the build button.  Now press the '''Close''' button to get rid of the &quot;Cube&quot; properties window.

* Using Shift + the Left mouse button move your red builder brush such that it is positioned as shown below.

[[Image:Legacy_dmquadroid-createthecorridors1.gif|]]

====Step 2: Make the top/bottom corridors ====
* Subtract the corridor shape from the world.  Repeat the process on the other side of the level so the two unconnected halves of your map are symmetrical.
: You will have created two corridors.  You will notice that the textures lining the floor, walls, and ceiling of the corridor are textured using the last texture you selected, or, the default texture.  You will also find that your corridors do not lie flush with the floor if you never changed the height of the red builder brush when making them.  Players would never be able to jump high enough to get into them.  Don't worry - we'll fix that in a moment.

====Step 3: Create the left right corridors ====
* Now we need to create the left/right corridor shape.  You can either go back to the &quot;Cube&quot; properties window and enter the values 256, 512 for the width and breadth respectively, or, you can rotate the red builder brush by 90 degrees.  Personally I prefer to avoid rotations as much as possible so I'd simply re-size the cube.  However, you can rotate the &quot;Cube&quot; by ensuring that the &quot;Rotate&quot; icon ''insert pic here'' is selected, holding down the Ctrl + Left mouse button, and moving the mouse left or right until the brush is rotated by 90 degrees.
* Once you have created the left/right corridor shape move it into position such that it joins the two rooms.

* Once you have your left/right corridor shape in the right position subtract it.  Make the lower half of the level a mirror image of the top half.
* Now texture your newly created corridors as you see fit.  Remember, you can use ''Alt - Right click'' to make the texture of the surface clicked on the currently selected texture.  And ''Alt - left click'' to apply the currently selected texture to a surface.
: Your level should now look similar to the one shown below, albeit with texture differences.

[[Image:Legacy_dmquadroid-createthecorridors2.gif|]]

If you changed the height of your red builder brush when making the corridors then you can skip this step.  If you didn't then read on.

====Step 4: Fix the height of the corridors ====
* Right then, now to fix the height of those corridors.  Players within the map cannot hope to travel between the different rooms without using the hammer jump - the floors of the corridors are way to high.  In order to fix this we need to select all of our corridor brushes (or cubes if you prefer) and move them down slightly.
* Before we start, make sure the red builder brush is not covering any of your corridor brushes (or cubes).  Simply move it out of the way.
* Holding down the control key, left click on each of the corridor brushes (or cubes) displayed in the plan view of the map (top left if you are using the default views).  You should see them all highlight as you click on them.
* If you now click '''once''' in the front view window you will see the brushes highlight themselves.  Changes to objects within the different views only get updated when the view is selected.
* Holding down the Shift key and the Left mouse button, drag the mouse down.  You will see all of the brushes move down with the drag.  Once they are level with the floor let go of the Left mouse button and Left click on each of the views.
: Hang on a minute!  All of the views bar the 3D one are showing the corridors in the correct place, flush with the floor.  The 3D view still shows them raised from the floor.  This is because the 3D view shows the geometry as it was last built.  Direct adds and subtracts affect the build of the geometry, but moves don't.  Lets fix that now.
* Click on the &quot;Build Geometry&quot; icon (''insert pic here'') on the toolbar, or use &quot;Build -&gt; Rebuild Geometry Only&quot; from the menu.
: You'll now see the 3D view update itself and display the corridors flush with the floor.

====That's It ====

Well done.  You've managed to complete the second part of the tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms.  The corridors should be flush with the floor and the map should be textured nicely in the textures of your choice.  Even though we have done all this we still haven't got a level that we can play around in.

At this point it's worth saving the map again.  Use the ''File -&gt; Save'' to save the level over the top of your previous version.  You can save it under a different name if you like.  Remember the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.

You are now ready to move on to [[Legacy:Creating DM-Quadroid/AddLights|Creating DM-Quadroid/AddLights]], and add some lights to the map.  At least then we'll be able to see where we are going.  See you there.</text>
    </revision>
    <revision>
      <id>2154</id>
      <timestamp>2002-10-05T17:57:52Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Building the Corridors ==

In this part of the tutorial we are going to join our four rooms with four corridors.  In order to keep things simple we'll make the corridors all the same (although you can texture them differently if you like).  In this part of the tutorial you will cover the following
* How to change the [[Legacy:Red Builder Brush|red builder brush]] into a cube of a specified size.
* How to create a corridor using the &quot;subtract&quot; operation (see [[Legacy:CSG|CSG]] for more information).
* How to apply basic texturing.
* Rebuild the geometry in the level.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Completed the first part of this tutorial [[Legacy:Creating Dm-Quadroid/CreateTheRooms|Creating Dm-Quadroid/CreateTheRooms]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size and textured them.  We haven't added any lights or player start positions yet so the level is not playable.

===Building the Rooms ===

====Step 1: Create a corridor shape  ====
* The first thing to do is make the [[Legacy:Red Builder Brush|red builder brush]] the right size.  Right click on the &quot;Cube&quot; icon (''insert cube icon here'') in the tool box, and enter the values 256, 512, 256 for the height, width, and breadth respectively, and press the build button.  This will give us our top/bottom corridor shape.
: You will see the size and shape of the red builder brush change to the dimensions you have just specified.  Remember that the brush won't change shape until you actually press the build button.  Now press the '''Close''' button to get rid of the &quot;Cube&quot; properties window.

* Using Shift + the Left mouse button move your red builder brush such that it is positioned as shown below.
: ''Insert diagram of placement of first corridor.''

====Step 2: Make the top/bottom corridors ====
* Subtract the corridor shape from the world.  Repeat the process on the other side of the level so the two unconnected halves of your map are symmetrical.
: You will have created two corridors.  You will notice that the textures lining the floor, walls, and ceiling of the corridor are textured using the last texture you selected, or, the default texture.  You may also notice, if you are observant, that the corridors don't lie flush with the floor.  Players would never be able to jump high enough to get into them.  Don't worry - we'll fix that in a moment.

====Step 3: Create the left right corridors ====
* Now we need to create the left/right corridor shape.  You can either go back to the &quot;Cube&quot; properties window and enter the values 256, 512 for the width and breadth respectively, or, you can rotate the red builder brush by 90 degrees.  Personally I prefer to avoid rotations as much as possible so I'd simply re-size the cube.  However, you can rotate the &quot;Cube&quot; by ensuring that the &quot;Camera&quot; icon ''insert pic here'' is selected, holding down the Ctrl + Left mouse button, and moving the mouse left or right until the brush is rotated by 90 degrees.
* Once you have created the left/right corridor shape move it into the position shown below.
: ''Insert left/right corridor position pic here''

* Once you have your left/right corridor shape in the right position subtract it.  Make the lower half of the level a mirror image of the top half.
* Now texture your newly created corridors as you see fit.  Remember, you can use ''Alt - Right click'' to make the texture of the surface clicked on the currently selected texture.  And ''Alt - left click'' to apply the currently selected texture to a surface.
: Your level should now look similar to the one shown below, albeit with texture differences.
:''Insert pic of level with corridors but not moved into place yet''

====Step 4: Fix the height of the corridors ====
* Right then, now to fix the height of those corridors.  Players within the map cannot hope to travel between the different rooms without using the hammer jump - the floors of the corridors are way to high.  In order to fix this we need to select all of our corridor brushes (or cubes if you prefer) and move them down slightly.
* Before we start, make sure the red builder brush is not covering any of your corridor brushes (or cubes).  Simply move it out of the way.
* Holding down the control key, left click on each of the corridor brushes (or cubes) displayed in the plan view of the map (top left if you are using the default views).  You should see them all highlight as you click on them.
* If you now click '''once''' in the front view window you will see the brushes highlight themselves.  Changes to objects within the different views only get updated when the view is selected.
* Holding down the Shift key and the Left mouse button, drag the mouse down.  You will see all of the brushes move down with the drag.  Once they are level with the floor let go of the Left mouse button and Left click on each of the views.
: Hang on a minute!  All of the views bar the 3D one are showing the corridors in the correct place, flush with the floor.  The 3D view still shows them raised from the floor.  This is because the 3D view shows the geometry as it was last built.  Direct adds and subtracts affect the build of the geometry, but moves don't.  Lets fix that now.
* Click on the &quot;Build Geometry&quot; icon (''insert pic here'') on the toolbar, or use &quot;Build -&gt; Rebuild Geometry Only&quot; from the menu.
: You'll now see the 3D view update itself and display the corridors flush with the floor.

====That's It ====

Well done.  You've managed to complete the second part of the tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms.  The corridors should be flush with the floor and the map should be textured nicely in the textures of your choice.  Even though we have done all this we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in the square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save'' to save the level over the top of your previous version.  You can save it under a different name if you like.  Remember the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.

You are now ready to move on to [[Legacy:Creating DM-Quadroid/AddLights|Creating DM-Quadroid/AddLights]], and add some lights to the map.  At least then we'll be able to see where we are going.  See you there.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating DM-Quadroid/CreateTheRooms</title>
    <id>751</id>
    <revision>
      <id>2150</id>
      <timestamp>2008-03-25T15:21:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Building the Rooms ==

In this part of the tutorial we are going to create four rooms of an identical size.  These will form the main rooms of the level.  In this part of the tutorial you will learn the following
* How to change the [[Legacy:Red Builder Brush|red builder brush]] into a cube of a specified size.
* How to create a room using the &quot;subtract&quot; operation (see [[Legacy:CSG|CSG]] for more information).
* How to apply basic texturing.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Started the Unreal Editor.
# Selected File -&gt; New (Or used Ctrl-N) to create a brand new level.

===A Quick Recap ===

Remember, the world is solid.  In order to be able to run around in it we need some space.  In order to create space we need to remove chunks of the solid space (called subtracting).

===Building the Rooms ===

====Step 1: Create the rooms ====
* The first thing to do is make the [[Legacy:Red Builder Brush|red builder brush]] the right size.




[[Image:Legacy_interface.toolbox.defbuilders.gif|left|]]

Right click on the &quot;Cube&quot; icon, which is the top left icon in the toolbox (shown left).  This will display a small dialog box that allows you to enter the properties of the &quot;cube&quot; that will be created the next time you '''left click''' on the Cube icon.

Enter the values 512, 1024, and 1024 for the height, width, breadth respectively, and then click on the '''Build''' button.

You will see the size and shape of the red builder brush change to the dimensions you have just specified.  Notice that the brush didn't change shape until you actually pressed the build button.

You can now press the '''Close''' button to close the dialog box.



The shape that we have created doesn't look like much.  It's simply a red wireframe box.  In order to create a room in our solid universe we need to subtract some space out.  Which is what we'll do next.

* Create a room by &quot;subtracting&quot; the red builder brush shape from the world.  You can do this by ''left mouse-clicking'' on the 3D view in the lower left quater of the screen and performing any one of the following three actions:
*# Click on the &quot;Subtract&quot; icon in the operations toolbox group on the left
*# Use the ''Ctrl-S'' keyboard shortcut
*# Select ''Brush -&gt; Subtract'' from the menu bars at the top of the screen.

As if by magic you will see a rather unpleasant looking cube appear in space.  This is your first room.  Feel free to look around it in the 2D and 3D views (see [[Legacy:Mouse Control|Mouse Control]] if you've forgotten how).  Notice that the subtracted cube shows up as an icky brown/orange type colour.  This colour indicates that the cube (or brush in mapper speak)is a subtraction form the world.

You can see [[Legacy:Subtract A Space|Subtract A Space]] for more information on subtracting cubes from the world.

* Right then, now that you've finished playing around, it's time to create 3 more rooms.  Using Shift + the Left mouse button move your red builder brush (if the brush doesn't move then it isn't selected) left until you have a gap of 512 units (4 of the large grey squares if you've kept the default grid size) between the red builder brush and your subtracted cube.  Perform another subtract.
* Create two more rooms, one above each of the two rooms to form a square of squares.  Once you've done that it should look like the picture below (plan view and 3d view shown).

[[Image:Legacy_dmquadroid-createtherooms1.gif|center|]]

====Step 2: Add some texture ====

OK, we have four whole rooms, all to ourselves.  That's great, but you have to admit that they look pretty ugly.  Lets make them look nice.  Before we do that read the following pages:
# The [[Legacy:Decorating Rooms With Textures|Decorating Rooms with Textures]] page.
# The [[Legacy:Mouse_Control|Mouse_Control]] page, specficially the ''surface selection'' section.

Done that?  Excellent.  Lets get started.
* Open the [[Legacy:Texture Browser|Texture Browser]] and load (File -&gt; Open) the UTTech2.utx tecture package.
* Using the lower drop down list (next to the ''All'' button) select the ''Floor'' group.  From this group of textures click on the tan looking one called &quot;RCLFFLR6X&quot;.

At this point you can close (or minimise) the texture browser as we have selected a texture.  We'll need it again in a minute but if you don't have a lot of screen real estate it's worth getting red of it.
* In the 3D view port Alt + Left Click on the floors of each of your rooms.  Ta-da! We have a bit of colour.
* Now it's time to do the walls.  Go back into the Texture Browser and select the ''Wall'' group from the lower drop list.  Use the Alt-Left Click to texture the walls of the rooms.  It's worth selecting a different texture for each of the rooms, but do each room in the same texture.  I'll leave it up to you to decide which textures to use.
* And finally, it's time to texture the ceiling.  Select the ''Ceiling'' group in the texture browser and pick a texture you like.  Apply this in the same way as you did all the other textures.  You may find that you have to move down and look up before you are able to see the faces that represent the ceilings of the rooms.

====That's It ====

Well done.  You've managed to complete the first part of the tutorial.  Hopefully you now know how to create rooms and texture them.  However, we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in a square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save As ..'' menu option and use the title DM-Quadroid.  The [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.  It's not a bad idea to save the maps with version numbers (e.g. DM-Quadroid1 for the first save, DM-Quadroid2 for the second and so-on).

You are now ready to move on to [[Legacy:Creating DM-Quadroid/CreateTheCorridors|Creating DM-Quadroid/CreateTheCorridors]], and add some corridors between the rooms.  See you there.

'''Foxpaw:''' Why the lack of spaces in the page name?

'''Mosquito:''' Why not?

'''Mychaeel:''' ...because it's customary on the Unreal Wiki to use normal spacing in page names.  :-)  I can rename those pages unless somebody vividly objects.

'''Mosquito:''' [Vividly objects]

'''Mychaeel:''' Since I'm ''not'' inclined to imagine your ''argumentation'' on that part, I'd appreciate if you actually phrased it.  ;-)

'''Foxpaw:''' I think it looks ugly with the names smashed together. It looks like WikiWiki, MeatballWiki or Wikipedia. (all of which I consider to be ungodly, in appearance, organization, and content for that matter)

'''EntropicLqd:''' The lack of spaces in the names are merely an artifact of the time they were created.  It was an awful long time ago so if there was a method to it I forget what it was.  Feel free to add spaces or not as the mood takes you.</text>
    </revision>
    <revision>
      <id>2151</id>
      <timestamp>2003-08-13T13:52:18Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>It just occured to me that vividly object is a very strange phrase</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Building the Rooms ==

In this part of the tutorial we are going to create four rooms of an identical size.  These will form the main rooms of the level.  In this part of the tutorial you will learn the following
* How to change the [[Legacy:Red Builder Brush|red builder brush]] into a cube of a specified size.
* How to create a room using the &quot;subtract&quot; operation (see [[Legacy:CSG|CSG]] for more information).
* How to apply basic texturing.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Started the Unreal Editor.
# Selected File -&gt; New (Or used Ctrl-N) to create a brand new level.

===A Quick Recap ===

Remember, the world is solid.  In order to be able to run around in it we need some space.  In order to create space we need to remove chunks of the solid space (called subtracting).

===Building the Rooms ===

====Step 1: Create the rooms ====
* The first thing to do is make the [[Legacy:Red Builder Brush|red builder brush]] the right size.




[[Image:Legacy_interface.toolbox.defbuilders.gif|left|]]

Right click on the &quot;Cube&quot; icon, which is the top left icon in the toolbox (shown left).  This will display a small dialog box that allows you to enter the properties of the &quot;cube&quot; that will be created the next time you '''left click''' on the Cube icon.

Enter the values 512, 1024, and 1024 for the height, width, breadth respectively, and then click on the '''Build''' button.

You will see the size and shape of the red builder brush change to the dimensions you have just specified.  Notice that the brush didn't change shape until you actually pressed the build button.

You can now press the '''Close''' button to close the dialog box.



The shape that we have created doesn't look like much.  It's simply a red wireframe box.  In order to create a room in our solid universe we need to subtract some space out.  Which is what we'll do next.

* Create a room by &quot;subtracting&quot; the red builder brush shape from the world.  You can do this by ''left mouse-clicking'' on the 3D view in the lower left quater of the screen and performing any one of the following three actions:
*# Click on the &quot;Subtract&quot; icon in the operations toolbox group on the left
*# Use the ''Ctrl-S'' keyboard shortcut
*# Select ''Brush -&gt; Subtract'' from the menu bars at the top of the screen.

As if by magic you will see a rather unpleasant looking cube appear in space.  This is your first room.  Feel free to look around it in the 2D and 3D views (see [[Legacy:Mouse Control|Mouse Control]] if you've forgotten how).  Notice that the subtracted cube shows up as an icky brown/orange type colour.  This colour indicates that the cube (or brush in mapper speak)is a subtraction form the world.

You can see [[Legacy:Subtract A Space|Subtract A Space]] for more information on subtracting cubes from the world.

* Right then, now that you've finished playing around, it's time to create 3 more rooms.  Using Shift + the Left mouse button move your red builder brush (if the brush doesn't move then it isn't selected) left until you have a gap of 512 units (4 of the large grey squares if you've kept the default grid size) between the red builder brush and your subtracted cube.  Perform another subtract.
* Create two more rooms, one above each of the two rooms to form a square of squares.  Once you've done that it should look like the picture below (plan view and 3d view shown).

@inline@dmquadroid-createtherooms

====Step 2: Add some texture ====

OK, we have four whole rooms, all to ourselves.  That's great, but you have to admit that they look pretty ugly.  Lets make them look nice.  Before we do that read the following pages:
# The [[Legacy:Decorating Rooms With Textures|Decorating Rooms with Textures]] page.
# The [[Legacy:Mouse_Control|Mouse_Control]] page, specficially the ''surface selection'' section.

Done that?  Excellent.  Lets get started.
* Open the [[Legacy:Texture Browser|Texture Browser]] and load (File -&gt; Open) the UTTech2.utx tecture package.
* Using the lower drop down list (next to the ''All'' button) select the ''Floor'' group.  From this group of textures click on the tan looking one called &quot;RCLFFLR6X&quot;.

At this point you can close (or minimise) the texture browser as we have selected a texture.  We'll need it again in a minute but if you don't have a lot of screen real estate it's worth getting red of it.
* In the 3D view port Alt + Left Click on the floors of each of your rooms.  Ta-da! We have a bit of colour.
* Now it's time to do the walls.  Go back into the Texture Browser and select the ''Wall'' group from the lower drop list.  Use the Alt-Left Click to texture the walls of the rooms.  It's worth selecting a different texture for each of the rooms, but do each room in the same texture.  I'll leave it up to you to decide which textures to use.
* And finally, it's time to texture the ceiling.  Select the ''Ceiling'' group in the texture browser and pick a texture you like.  Apply this in the same way as you did all the other textures.  You may find that you have to move down and look up before you are able to see the faces that represent the ceilings of the rooms.

====That's It ====

Well done.  You've managed to complete the first part of the tutorial.  Hopefully you now know how to create rooms and texture them.  However, we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in a square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save As ..'' menu option and use the title DM-Quadroid.  The [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.  It's not a bad idea to save the maps with version numbers (e.g. DM-Quadroid1 for the first save, DM-Quadroid2 for the second and so-on).

You are now ready to move on to [[Legacy:Creating DM-Quadroid/CreateTheCorridors|Creating DM-Quadroid/CreateTheCorridors]], and add some corridors between the rooms.  See you there.

'''Foxpaw:''' Why the lack of spaces in the page name?

'''Mosquito:''' Why not?

'''Mychaeel:''' ...because it's customary on the Unreal Wiki to use normal spacing in page names.  :-)  I can rename those pages unless somebody vividly objects.

'''Mosquito:''' [Vividly objects]

'''Mychaeel:''' Since I'm ''not'' inclined to imagine your ''argumentation'' on that part, I'd appreciate if you actually phrased it.  ;-)

'''Foxpaw:''' I think it looks ugly with the names smashed together. It looks like WikiWiki, MeatballWiki or Wikipedia. (all of which I consider to be ungodly, in appearance, organization, and content for that matter)

'''EntropicLqd:''' The lack of spaces in the names are merely an artifact of the time they were created.  It was an awful long time ago so if there was a method to it I forget what it was.  Feel free to add spaces or not as the mood takes you.</text>
    </revision>
    <revision>
      <id>2152</id>
      <timestamp>2003-08-13T14:21:06Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Building the Rooms ==

In this part of the tutorial we are going to create four rooms of an identical size.  These will form the main rooms of the level.  In this part of the tutorial you will learn the following
* How to change the [[Legacy:Red Builder Brush|red builder brush]] into a cube of a specified size.
* How to create a room using the &quot;subtract&quot; operation (see [[Legacy:CSG|CSG]] for more information).
* How to apply basic texturing.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Started the Unreal Editor.
# Selected File -&gt; New (Or used Ctrl-N) to create a brand new level.

===A Quick Recap ===

Remember, the world is solid.  In order to be able to run around in it we need some space.  In order to create space we need to remove chunks of the solid space (called subtracting).

===Building the Rooms ===

====Step 1: Create the rooms ====
* The first thing to do is make the [[Legacy:Red Builder Brush|red builder brush]] the right size.




[[Image:Legacy_interface.toolbox.defbuilders.gif|left|]]

Right click on the &quot;Cube&quot; icon, which is the top left icon in the toolbox (shown left).  This will display a small dialog box that allows you to enter the properties of the &quot;cube&quot; that will be created the next time you '''left click''' on the Cube icon.

Enter the values 512, 1024, and 1024 for the height, width, breadth respectively, and then click on the '''Build''' button.

You will see the size and shape of the red builder brush change to the dimensions you have just specified.  Notice that the brush didn't change shape until you actually pressed the build button.

You can now press the '''Close''' button to close the dialog box.



The shape that we have created doesn't look like much.  It's simply a red wireframe box.  In order to create a room in our solid universe we need to subtract some space out.  Which is what we'll do next.

* Create a room by &quot;subtracting&quot; the red builder brush shape from the world.  You can do this by ''left mouse-clicking'' on the 3D view in the lower left quater of the screen and performing any one of the following three actions:
*# Click on the &quot;Subtract&quot; icon in the operations toolbox group on the left
*# Use the ''Ctrl-S'' keyboard shortcut
*# Select ''Brush -&gt; Subtract'' from the menu bars at the top of the screen.

As if by magic you will see a rather unpleasant looking cube appear in space.  This is your first room.  Feel free to look around it in the 2D and 3D views (see [[Legacy:Mouse Control|Mouse Control]] if you've forgotten how).  Notice that the subtracted cube shows up as an icky brown/orange type colour.  This colour indicates that the cube (or brush in mapper speak)is a subtraction form the world.

You can see [[Legacy:Subtract A Space|Subtract A Space]] for more information on subtracting cubes from the world.

* Right then, now that you've finished playing around, it's time to create 3 more rooms.  Using Shift + the Left mouse button move your red builder brush (if the brush doesn't move then it isn't selected) left until you have a gap of 512 units (4 of the large grey squares if you've kept the default grid size) between the red builder brush and your subtracted cube.  Perform another subtract.
* Create two more rooms, one above each of the two rooms to form a square of squares.  Once you've done that it should look like the picture below (plan view and 3d view shown).

[[Image:Legacy_dmquadroid-createtherooms1.gif|]]

====Step 2: Add some texture ====

OK, we have four whole rooms, all to ourselves.  That's great, but you have to admit that they look pretty ugly.  Lets make them look nice.  Before we do that read the following pages:
# The [[Legacy:Decorating Rooms With Textures|Decorating Rooms with Textures]] page.
# The [[Legacy:Mouse_Control|Mouse_Control]] page, specficially the ''surface selection'' section.

Done that?  Excellent.  Lets get started.
* Open the [[Legacy:Texture Browser|Texture Browser]] and load (File -&gt; Open) the UTTech2.utx tecture package.
* Using the lower drop down list (next to the ''All'' button) select the ''Floor'' group.  From this group of textures click on the tan looking one called &quot;RCLFFLR6X&quot;.

At this point you can close (or minimise) the texture browser as we have selected a texture.  We'll need it again in a minute but if you don't have a lot of screen real estate it's worth getting red of it.
* In the 3D view port Alt + Left Click on the floors of each of your rooms.  Ta-da! We have a bit of colour.
* Now it's time to do the walls.  Go back into the Texture Browser and select the ''Wall'' group from the lower drop list.  Use the Alt-Left Click to texture the walls of the rooms.  It's worth selecting a different texture for each of the rooms, but do each room in the same texture.  I'll leave it up to you to decide which textures to use.
* And finally, it's time to texture the ceiling.  Select the ''Ceiling'' group in the texture browser and pick a texture you like.  Apply this in the same way as you did all the other textures.  You may find that you have to move down and look up before you are able to see the faces that represent the ceilings of the rooms.

====That's It ====

Well done.  You've managed to complete the first part of the tutorial.  Hopefully you now know how to create rooms and texture them.  However, we still haven't got a level that we can play around in.  Don't worry though.  We will get there.  I'm not one for making things too easy, and running around in a square box is pretty dull anyway.

At this point it's worth saving the map.  Use the ''File -&gt; Save As ..'' menu option and use the title DM-Quadroid.  The [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] likes to crash the editor on the regular basis so save little and often if you are planning on doing a lot of work in the editor.  It's not a bad idea to save the maps with version numbers (e.g. DM-Quadroid1 for the first save, DM-Quadroid2 for the second and so-on).

You are now ready to move on to [[Legacy:Creating DM-Quadroid/CreateTheCorridors|Creating DM-Quadroid/CreateTheCorridors]], and add some corridors between the rooms.  See you there.

'''Foxpaw:''' Why the lack of spaces in the page name?

'''Mosquito:''' Why not?

'''Mychaeel:''' ...because it's customary on the Unreal Wiki to use normal spacing in page names.  :-)  I can rename those pages unless somebody vividly objects.

'''Mosquito:''' [Vividly objects]

'''Mychaeel:''' Since I'm ''not'' inclined to imagine your ''argumentation'' on that part, I'd appreciate if you actually phrased it.  ;-)

'''Foxpaw:''' I think it looks ugly with the names smashed together. It looks like WikiWiki, MeatballWiki or Wikipedia. (all of which I consider to be ungodly, in appearance, organization, and content for that matter)

'''EntropicLqd:''' The lack of spaces in the names are merely an artifact of the time they were created.  It was an awful long time ago so if there was a method to it I forget what it was.  Feel free to add spaces or not as the mood takes you.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating DM-Quadroid/PlayerStarts</title>
    <id>754</id>
    <revision>
      <id>2158</id>
      <timestamp>2008-03-25T15:23:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Adding Player Starts ==

In this part of the tutorial we are going to add some player start points to our map.  Once this has been done you will actually be able to play your level.  We will cover the following topics here.
* Add a few [[Legacy:PlayerStart|PlayerStart]] objects to a level.
* Add some weapons and items.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Looked at the [[Legacy:Toolbar|Toolbar]] page so you are familiar with the toolbar icons across the top of the page.
# Completed the third part of this tutorial [[Legacy:Creating DM-Quadroid/AddLights|Creating DM-Quadroid/AddLights]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size, textured them, added corridors to link them up and added some lights.  We haven't added any player start positions or weapons yet so the level is not quite playable.

===Adding the Player Starts ===

====Step 1: Select the PlayerStart actor ====
* Click on the ''Actor Class Browser'' icon in the toolbar.  It looks like a chess pawn.  A new window will open.
* Within the Actor Browser window open the Actor tree and then the [[Legacy:NavigationPoint|NavigationPoint]] tree.
* Within the [[Legacy:NavigationPoint|NavigationPoint]] tree click on the [[Legacy:PlayerStart|PlayerStart]] item so that it is highlighted.
* Minimise (or close) the actor browser window.

====Step 2: Add PlayerStart objects to the level ====
* Move your view around within the 3D view and right-click on the floor of the room.
* Select the ''Add PlayerStart Here'' option.  This will cause a joystick shape to appear.  The joystick will be floating above the ground - which is fine.
* Add three more player starts.
* In the plan view move the player start points you just added around the map so that there is one in each room.  You can move a player start by left-cliking on it so that it is highlighted and then dragging it around the map while holding down Shift and the left mouse button.
: You will notice a little red arrow sticking out of a player start when it is selected.  This is the direction that the players will face when they spawn.  It's well worth rotating the player start points so that they face away from walls as shown in the picture below.

====Step 3: Adding Health and Weapons ====

====That's It ====

Well done.  You've managed to complete the fourth and final part of the initial tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms, complete with lights and some player starts.</text>
    </revision>
    <revision>
      <id>2159</id>
      <timestamp>2002-10-07T19:35:15Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Adding Some Player Starts ==

''Check out tomorrows instalment for the low down.''</text>
    </revision>
    <revision>
      <id>2160</id>
      <timestamp>2003-08-13T14:38:58Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>tweaks in prep for the next kiddy free period</comment>
      <text xml:space="preserve">==Tutorial: DM-Quadroid for UT &amp;ndash; Adding Player Starts ==

In this part of the tutorial we are going to add some player start points to our map.  Once this has been done you will actually be able to play your level.  We will cover the following topics here.
* Add a few [[Legacy:PlayerStart|PlayerStart]] objects to a level.
* Add some weapons and items.

===Before you Start ===

Before you start please make sure you have completed the following steps:
# Looked at the [[Legacy:Toolbox|Toolbox]] page so you are familiar with the icons on the left hand side of the editor.
# Looked at the [[Legacy:Toolbar|Toolbar]] page so you are familiar with the toolbar icons across the top of the page.
# Completed the third part of this tutorial [[Legacy:Creating DM-Quadroid/AddLights|Creating DM-Quadroid/AddLights]].
# Opened the Unreal Editor and loaded the saved level.

===A Quick Recap ===

At this stage of the tutorial we have created four rooms of equal size, textured them, added corridors to link them up and added some lights.  We haven't added any player start positions or weapons yet so the level is not quite playable.

===Adding the Player Starts ===

====Step 1: Select the PlayerStart actor ====
* Click on the ''Actor Class Browser'' icon in the toolbar.  It looks like a chess pawn.  A new window will open.
* Within the Actor Browser window open the Actor tree and then the [[Legacy:NavigationPoint|NavigationPoint]] tree.
* Within the [[Legacy:NavigationPoint|NavigationPoint]] tree click on the [[Legacy:PlayerStart|PlayerStart]] item so that it is highlighted.
* Minimise (or close) the actor browser window.

====Step 2: Add PlayerStart objects to the level ====
* Move your view around within the 3D view and right-click on the floor of the room.
* Select the ''Add PlayerStart Here'' option.  This will cause a joystick shape to appear.  The joystick will be floating above the ground - which is fine.
* Add three more player starts.
* In the plan view move the player start points you just added around the map so that there is one in each room.  You can move a player start by left-cliking on it so that it is highlighted and then dragging it around the map while holding down Shift and the left mouse button.
: You will notice a little red arrow sticking out of a player start when it is selected.  This is the direction that the players will face when they spawn.  It's well worth rotating the player start points so that they face away from walls as shown in the picture below.

@inline@dmquadroid-playerstarts1

====Step 3: Adding Health and Weapons ====

====That's It ====

Well done.  You've managed to complete the fourth and final part of the initial tutorial.  Hopefully you'll be looking at a four room map with corridors joining the rooms, complete with lights and some player starts.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating Light</title>
    <id>931</id>
    <revision>
      <id>2537</id>
      <timestamp>2008-02-18T22:54:14Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In UT3 adding a basic light is quite simple(Because basically you just need step 1 and 2.).

To do this you will need to have a subtracted space ready.

1. Right click inside your map. (Where you want it, or move it around later)

2. At the menu that you get open click

Add Actor - Add Light (point)

3. If you cannot see the difference, maybe you always have unlit render view?

Above the 3D view window you will find some small icons. when u hold over them you will see what they do.

By choosing &quot;unlit&quot; you will always see full light in your map. (From the editor view only off course)

By choosing &quot;lit&quot; you will see how the map really looks when you have rendered lightning.

Select the lit view for now as you are adding light for now. When doing other stuff I recommend using lit view(Choose your self)

But if you are having a slow system look for unlit movement to prevent lagging.

Congratulations you no longer need to stumble in the darkness.

----

If you want to get more Advanced:

To change the light properties:

Right click on the light and select &quot;Point Light Properties&quot;

&amp;ndash; Light - light Component - Brightness (This will change the strength on your light)

&amp;ndash; Light - Light Component - Radius (This will change the distance before your light is faded away)

&amp;ndash; Light - Light Component - Color

Left click on the looking glass on your left.

or Right click on the light color bar(which is probably still white).

Good to know: Grayness will make the lights color weaker. Adding darkness will make the light more dim(I recommend changing brightness for this feature).

Congratulations you can now dance in your disco lights!</text>
    </revision>
    <revision>
      <id>2536</id>
      <timestamp>2008-02-18T22:54:25Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In UT3 adding a basic light is quite simple(Because basically you just need step 1 and 2.).

To do this you will need to have a subtracted space ready.

1. Right click inside your map. (Where you want it, or move it around later)

2. At the menu that you get open click

Add Actor - Add Light (point)

3. If you cannot see the difference, maybe you always have unlit render view?

Above the 3D view window you will find some small icons. when u hold over them you will see what they do.

By choosing &quot;unlit&quot; you will always see full light in your map. (From the editor view only off course)

By choosing &quot;lit&quot; you will see how the map really looks when you have rendered lightning.

Select the lit view for now as you are adding light for now. When doing other stuff I recommend using lit view(Choose your self)

But if you are having a slow system look for unlit movement to prevent lagging.

Congratulations you no longer need to stumble in the darkness.

----

If you want to get more Advanced:

To change the light properties:

Right click on the light and select &quot;Point Light Properties&quot;

- Light - light Component - Brightness (This will change the strength on your light)

- Light - Light Component - Radius (This will change the distance before your light is faded away)

- Light - Light Component - Color

Left click on the looking glass on your left.

or Right click on the light color bar(which is probably still white).

Good to know: Grayness will make the lights color weaker. Adding darkness will make the light more dim(I recommend changing brightness for this feature).

Congratulations you can now dance in your disco lights!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating Textures</title>
    <id>742</id>
    <revision>
      <id>2128</id>
      <timestamp>2006-07-18T06:55:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This info relates to UnrealEd 2.0 and earlier (with notes below about 3.0) Texture creation and was partially referenced from Unreal Technology article by Tim Sweeney.

==Size, Formats, etc. ==
; Format : UT uses only 256-color PCX or BMP. UT2k3+ can use any bit-depth PCX, BMP, TGA, DDS, UTP (Unreal Paint)

; Color depth : UT will only use 256 color (8-bit).  UT2k3+ will use any bit-depth up to 32bit (for RGBA8 or TGA with alpha channel)

; Resolution : UT can use any power of 2 from 1x1 to 512x512, with 256x256 being normal.  UT2k3+ will support any power of 2, from 1x1, 2x2, ..., 2048x2048.  They do not have to be square, e.g., you can use 512x256.

; Animated : Files which are parts of an animation should be saved as yourtexname_A01, yourtexname_A02, etc. This will let the editor know that they are part of an animation.

; Naming : When naming your texture be sure not to name them the same as any other texture in unreal, be as original as possible, if by chance there are two texture with the same name it will throw the engine off, this is bad. (I have read that this is not as much of a problem in 3.0 but better safe than sorry, ZxAnPhOrIaN recommends using a prefix of some sort to seperate your tex (i.e.  Zxan_GrandCanyon)

; Tiling : When creating a texture for a wall, floor, or any other large object, it is necessary to realize one thing, it needs to be tileable (all of it's edges need to be able to touch it's opposite edge and blend nicely). If a texture isn't tileable it will look awful in game leaving scar marks where the edges don't blend. There are a few ways of doing this. One way of doing this is to copy a selection of one edge and paste it onto the other and mirror it before releasing its selection. This way works but quite often results in odd effects so isn't the recommended way of going about things. My recommendation is that if you are using Photoshop or PSP to download the Simple Filters at http://www.btinternet.com/~cateran/simple/ and use either the quick tile or the halfwrap to do this. The half wrap works wonderfully since it takes all of the edges and folds them inward (showing you how they will connect) after using it patch up where they touch and save the texture (be sure that it has been reduced in color before saving). I also recommend saving a 16 mil color copy of your texture as well, in case any editing needs to be done or if it is a base texture that will be used for the creation of dozens of other textures.

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[:Category:Legacy Basic Procedure]] - [[Legacy:Category_Tutorial|Tutorials]]:
** [[Legacy:Create A Material|Create A Material]]
** [[Legacy:Import The Texture|Import The Texture]]
* What is and how to create an [[Legacy:Alpha Channel|Alpha Channel]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Animated Real-Time Textures]]

==Discussion==

'''Mychaeel:''' Here's a zipped tutorial in HTML format about making textures (by monsto).  Because he's short on time at the moment he asks that somebody put it on the Wiki:  http://mb.link-m.de/wiki/Building_Custom_Textures.rar You will need winrar or another decompression program that recognizes the rar format.

Creating Textures without base materials - http://www.lightwave3d.com/tutorials/surface/texture_building/texture_building.html

Texturing 101: Building Textures:- http://www.lightwave3d.com/tutorials/surface/texturing/texturing_buildingtextures.html

The ........ (texture can be) ... created using only one subdivided polygon, no drawings, nor photographs, nor images of any kind, and this comes straight from the renderer, no post processing applied.

'''Highlander:''' &quot;For the financially challenged&quot; :)

Free is good, [[Legacy:The GIMP|The GIMP]] is quite an excellet (Free) Image editor. Its pretty good for making textures etc.

A useful tool for avoiding problems alligning textures onto curved surfaces can be found at http://www.planetunreal.com/fordy/textalign2.htm.

'''Kerlin:''' Attempted to refactor.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2129</id>
      <timestamp>2006-07-10T22:27:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This info relates to UnrealEd 2.0 and earlier (with notes below about 3.0) Texture creation and was partially referenced from Unreal Technology article by Tim Sweeney.

==Size, Formats, etc. ==
; Format : UT uses only 256-color PCX or BMP. UT2k3+ can use any bit-depth PCX, BMP, TGA, DDS, UTP (Unreal Paint)

; Color depth : UT will only use 256 color (8-bit).  UT2k3+ will use any bit-depth up to 32bit (for RGBA8 or TGA with alpha channel)

; Resolution : UT can use any power of 2 from 1x1 to 512x512, with 256x256 being normal.  UT2k3+ will support any power of 2, from 1x1, 2x2, ..., 2048x2048.  They do not have to be square, e.g., you can use 512x256.

; Animated : Files which are parts of an animation should be saved as yourtexname_A01, yourtexname_A02, etc. This will let the editor know that they are part of an animation.

; Naming : When naming your texture be sure not to name them the same as any other texture in unreal, be as original as possible, if by chance there are two texture with the same name it will throw the engine off, this is bad. (I have read that this is not as much of a problem in 3.0 but better safe than sorry, ZxAnPhOrIaN recommends using a prefix of some sort to seperate your tex (i.e.  Zxan_GrandCanyon)

; Tiling : When creating a texture for a wall, floor, or any other large object, it is necessary to realize one thing, it needs to be tileable (all of it's edges need to be able to touch it's opposite edge and blend nicely). If a texture isn't tileable it will look awful in game leaving scar marks where the edges don't blend. There are a few ways of doing this. One way of doing this is to copy a selection of one edge and paste it onto the other and mirror it before releasing its selection. This way works but quite often results in odd effects so isn't the recommended way of going about things. My recommendation is that if you are using Photoshop or PSP to download the Simple Filters at http://www.btinternet.com/~cateran/simple/ and use either the quick tile or the halfwrap to do this. The half wrap works wonderfully since it takes all of the edges and folds them inward (showing you how they will connect) after using it patch up where they touch and save the texture (be sure that it has been reduced in color before saving). I also recommend saving a 16 mil color copy of your texture as well, in case any editing needs to be done or if it is a base texture that will be used for the creation of dozens of other textures.

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[:Category:Legacy Basic Procedure]] - [[Legacy:Category_Tutorial|Tutorials]]:
** [[Legacy:Create A Material|Create A Material]]
** [[Legacy:Import The Texture|Import The Texture]]
* What is and how to create an [[Legacy:Alpha Channel|Alpha Channel]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Animated Real-Time Textures]]

==Discussion==

'''Mychaeel:''' Here's a zipped tutorial in HTML format about making textures (by monsto).  Because he's short on time at the moment he asks that somebody put it on the Wiki:  http://mb.link-m.de/wiki/Building_Custom_Textures.rar You will need winrar or another decompression program that recognizes the rar format.

Creating Textures without base materials - http://www.lightwave3d.com/tutorials/surface/texture_building/texture_building.html

Texturing 101: Building Textures:- http://www.lightwave3d.com/tutorials/surface/texturing/texturing_buildingtextures.html

The ........ (texture can be) ... created using only one subdivided polygon, no drawings, nor photographs, nor images of any kind, and this comes straight from the renderer, no post processing applied.

'''Highlander:''' &quot;For the financially challenged&quot; :)

Free is good, [[Legacy:The GIMP|The GIMP]] is quite an excellet (Free) Image editor. Its pretty good for making textures etc.

A useful tool for avoiding problems alligning textures onto curved surfaces can be found at http://www.planetunreal.com/fordy/textalign2.htm.

'''Kerlin:''' Attempted to refactor.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2130</id>
      <timestamp>2006-07-18T04:49:57Z</timestamp>
      <contributor>
        <ip>59.16.104.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.dirare.com'&gt;yellow pages main&lt;/a&gt; : [http://www.dirare.com business yellowpages] - [HTTP://www.dirare.com business yellowpages] : [international directory|http://www.dirare.com] - [international directory|HTTP://www.dirare.com] : http://www.dirare.com/India/ : [[http://www.dirare.com companies of the world]] : [[http://www.dirare.com | YP national]] : &quot;global directory&quot; http://www.dirare.com : [http://www.dirare.com|online directory] &lt;/u&gt;This info relates to UnrealEd 2.0 and earlier (with notes below about 3.0) Texture creation and was partially referenced from Unreal Technology article by Tim Sweeney.

==Size, Formats, etc. ==
; Format : UT uses only 256-color PCX or BMP. UT2k3+ can use any bit-depth PCX, BMP, TGA, DDS, UTP (Unreal Paint)

; Color depth : UT will only use 256 color (8-bit).  UT2k3+ will use any bit-depth up to 32bit (for RGBA8 or TGA with alpha channel)

; Resolution : UT can use any power of 2 from 1x1 to 512x512, with 256x256 being normal.  UT2k3+ will support any power of 2, from 1x1, 2x2, ..., 2048x2048.  They do not have to be square, e.g., you can use 512x256.

; Animated : Files which are parts of an animation should be saved as yourtexname_A01, yourtexname_A02, etc. This will let the editor know that they are part of an animation.

; Naming : When naming your texture be sure not to name them the same as any other texture in unreal, be as original as possible, if by chance there are two texture with the same name it will throw the engine off, this is bad. (I have read that this is not as much of a problem in 3.0 but better safe than sorry, ZxAnPhOrIaN recommends using a prefix of some sort to seperate your tex (i.e.  Zxan_GrandCanyon)

; Tiling : When creating a texture for a wall, floor, or any other large object, it is necessary to realize one thing, it needs to be tileable (all of it's edges need to be able to touch it's opposite edge and blend nicely). If a texture isn't tileable it will look awful in game leaving scar marks where the edges don't blend. There are a few ways of doing this. One way of doing this is to copy a selection of one edge and paste it onto the other and mirror it before releasing its selection. This way works but quite often results in odd effects so isn't the recommended way of going about things. My recommendation is that if you are using Photoshop or PSP to download the Simple Filters at http://www.btinternet.com/~cateran/simple/ and use either the quick tile or the halfwrap to do this. The half wrap works wonderfully since it takes all of the edges and folds them inward (showing you how they will connect) after using it patch up where they touch and save the texture (be sure that it has been reduced in color before saving). I also recommend saving a 16 mil color copy of your texture as well, in case any editing needs to be done or if it is a base texture that will be used for the creation of dozens of other textures.

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[:Category:Legacy Basic Procedure]] - [[Legacy:Category_Tutorial|Tutorials]]:
** [[Legacy:Create A Material|Create A Material]]
** [[Legacy:Import The Texture|Import The Texture]]
* What is and how to create an [[Legacy:Alpha Channel|Alpha Channel]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Animated Real-Time Textures]]

==Discussion==

'''Mychaeel:''' Here's a zipped tutorial in HTML format about making textures (by monsto).  Because he's short on time at the moment he asks that somebody put it on the Wiki:  http://mb.link-m.de/wiki/Building_Custom_Textures.rar You will need winrar or another decompression program that recognizes the rar format.

Creating Textures without base materials - http://www.lightwave3d.com/tutorials/surface/texture_building/texture_building.html

Texturing 101: Building Textures:- http://www.lightwave3d.com/tutorials/surface/texturing/texturing_buildingtextures.html

The ........ (texture can be) ... created using only one subdivided polygon, no drawings, nor photographs, nor images of any kind, and this comes straight from the renderer, no post processing applied.

'''Highlander:''' &quot;For the financially challenged&quot; :)

Free is good, [[Legacy:The GIMP|The GIMP]] is quite an excellet (Free) Image editor. Its pretty good for making textures etc.

A useful tool for avoiding problems alligning textures onto curved surfaces can be found at http://www.planetunreal.com/fordy/textalign2.htm.

'''Kerlin:''' Attempted to refactor.

----

[[:Category:Legacy Mapping]]\
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Creating Textures/Animated Real-Time Textures</title>
    <id>799</id>
    <revision>
      <id>2260</id>
      <timestamp>2003-06-17T13:34:47Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">; [[Legacy:FireTexture|FireTexture]] : 
These are fairly easy to do. You go to file\new and choose Fire Texture for its class (should actually be default), set the size that you want and go. You enter the fire paint on the tree at the right and the fun begins. The texture will be made by you moving your mouse over the box on the left and by choosing options from the fire paint.There are tons of options to mess with in there. Some can be applied after the picture is made as well as before your mouse even hits the area. I recommend just playing with it. I have found little affect from most of them except for these:
*bRising gives the texture an upward lift rather than laying flat if set to true
*DrawMode affects how the effects are applied.
*FX_Heat determines how much the effect will flare outward.
*Render Heat amplifies the flaring more intensely
*SparkType determines what kind of emmision will be made in the area. This one is really the most fun to mess with in my opinion.

You can also mess with the pallette setting under texture to change the coloration of the effects by choosing other tex from your package to be the source ( these can turn out very funny looking so don't get discouraged).


; [[Legacy:WetTexture|WetTexture]] : This is alot like the fire one except that you need to set a source texture, just mess with it.
; [[Legacy:WaveTexture|WaveTexture]] : Same here but no source texture
; [[Legacy:IceTexture|IceTexture]] : This allows you to take one texture &quot;glass texture&quot; and use it to effect another texture &quot;source texture&quot;. Once again play with it it can be interesting.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CreatureFactory</title>
    <id>704</id>
    <revision>
      <id>2044</id>
      <timestamp>2006-12-26T03:34:13Z</timestamp>
      <contributor>
        <ip>Dialup-4.245.98.141.Dial1.SanJose1.Level3.net</ip>
      </contributor>
      <comment>Capacity is ultimate limit, while MaxItems is current limit.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; [[Legacy:ThingFactory|ThingFactory]] &gt;&gt; CreatureFactory}}

These are used to spawn creatures out of nowhere like in some [[Legacy:Unreal 1|Unreal 1]] levels. They have to be set off by a [[Legacy:Trigger|Trigger]].

==Properties==
; name Orders : Creatures from this factory will have these orders.
; name OrderTag : Creatures from this factory will have this order tag.
; name AlarmTag : Alarm tag given to creatures from this factory.
; int AddedCoopCapacity : Extra creatures for coop mode.

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:HomeBase|HomeBase]]

==Discussion==

'''Fat Marrow:''' If the global variable bNoMonsters is true, you can't spawn monsters within UT levels, either using a CreatureFactory or the parent ThingFactory (or by manually summoning the monsters from the console). bNoMonsters is a property in the [[Legacy:GameInfo_(UT)|GameInfo_(UT)]] actor and can also be set in the [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] file. It's not clear to me whether you can (or should) reliably override the bNoMonsters flag so as to allow monsters within UT levels. I haven't got this to work yet...

'''SuperApe:''' Doesn't it say in [[Legacy:ThingFactory|ThingFactory]] that these can also be triggered by a player touching them?

'''MisterWicked:''' I'm making a UTJB map with an area with about ten Skarrj, which opens up at overtime. I've set all the properties (capacity=-1, MaxItems=10, etc.), but the most I've been able to manage is ONE Skarrj, which doesn't respawn. How do I get one of these to stay active from the beginning of the match?

'''SuperApe:''' I believe that Capacity = 1 means only one Skaarj can be spawned from this factory ... ever.  MaxItems = 1, on the other hand, means only one Skaarj can be in game at one time.  Try flipping your settings around.  See also [[Legacy:ThingFactory|ThingFactory]].

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2045</id>
      <timestamp>2006-12-22T19:07:30Z</timestamp>
      <contributor>
        <ip>MisterWicked</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; [[Legacy:ThingFactory|ThingFactory]] &gt;&gt; CreatureFactory}}

These are used to spawn creatures out of nowhere like in some [[Legacy:Unreal 1|Unreal 1]] levels. They have to be set off by a [[Legacy:Trigger|Trigger]].

==Properties==
; name Orders : Creatures from this factory will have these orders.
; name OrderTag : Creatures from this factory will have this order tag.
; name AlarmTag : Alarm tag given to creatures from this factory.
; int AddedCoopCapacity : Extra creatures for coop mode.

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:HomeBase|HomeBase]]

==Discussion==

'''Fat Marrow:''' If the global variable bNoMonsters is true, you can't spawn monsters within UT levels, either using a CreatureFactory or the parent ThingFactory (or by manually summoning the monsters from the console). bNoMonsters is a property in the [[Legacy:GameInfo_(UT)|GameInfo_(UT)]] actor and can also be set in the [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] file. It's not clear to me whether you can (or should) reliably override the bNoMonsters flag so as to allow monsters within UT levels. I haven't got this to work yet...

'''SuperApe:''' Doesn't it say in [[Legacy:ThingFactory|ThingFactory]] that these can also be triggered by a player touching them?

'''MisterWicked:''' I'm making a UTJB map with an area with about ten Skarrj, which opens up at overtime. I've set all the properties (capacity=-1, MaxItems=10, etc.), but the most I've been able to manage is ONE Skarrj, which doesn't respawn. How do I get one of these to stay active from the beginning of the match?

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CriticalEventPlus</title>
    <id>28316</id>
    <revision>
      <id>39983</id>
      <timestamp>2009-11-14T20:12:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Critiques</title>
    <id>786</id>
    <revision>
      <id>2229</id>
      <timestamp>2003-02-18T20:59:17Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Critiques ===

Offered up as a place to put general reviews and critiques for larger projects.

[[Legacy:Critiques/Riftwar|Critiques/Riftwar]]

==Comments ==

'''RegularX:''' Just kinda tossing this out there as an idea.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Critiques/Riftwar</title>
    <id>785</id>
    <revision>
      <id>2227</id>
      <timestamp>2003-02-26T18:28:49Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>added postmortem notes</comment>
      <text xml:space="preserve">===Riftwar Critiques ===

[[Legacy:Mod_Ideas/Riftwar|Riftwar main page]]

I guess this migh work best with just sectioning out comments.

==RegularX (PostMortem) ==

Well, this was really supposed to be a proof of concept.  I had originally planned on spending no more than a week on it and ending up spending about two and a half.  It started out as just a three team piece, but the class-based gameplay allowed me a workaround for the problems with two team skins, interactions, etc.  The team code in UT2003 isn't so much hard coded as just very assuming.  Much of the gametype code simply assumes you'd never try to have more than two teams.  And the team beacon code is native, which really throws me off.

If this was a mod project I was really fervent about, I would have taken more time in preprod to plan things out and probably try and get a modeller for some of the more custom aspects (like the Deathbot).  In the end though, I have enough material to split out some tutorials for other modders and put new and better code into Freehold NG, which was the original intent.  If along the way the community finds Riftwar fun to play, to me that's just bonus material.

[[Legacy:Critiques|Critiques]]

[[Legacy:RegularX|RegularX]]</text>
    </revision>
    <revision>
      <id>2228</id>
      <timestamp>2003-02-18T23:02:30Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>we're not supposed to write a critique of RegularX, are we ;-)</comment>
      <text xml:space="preserve">===Riftwar Critiques ===

Thought it might be interesting to invite other coders to poke at projects from a developer's point of view, rather than the gaming angle most reviews take - so I offer up Riftwar as the sacrificial lamb for Wiki Critiques  :).  

Just add a link to this page and write away.

[[Legacy:Critiques|Critiques]]

[[Legacy:Mod_Ideas/Riftwar|Riftwar main page]]

[[Legacy:RegularX|RegularX]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Crokx</title>
    <id>811</id>
    <revision>
      <id>2284</id>
      <timestamp>2003-05-21T16:21:16Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>Comments</comment>
      <text xml:space="preserve">==About me ==

Me is &lt;font color=&quot;#AA0000&quot;&gt;Crokx&lt;/font&gt;, i am just a fanatic UnrealScripter, i play rarely...

==Contact ==
* &lt;u&gt;&lt;b&gt;IRC&lt;/b&gt;&lt;/u&gt; : &lt;i&gt;enterthegame&lt;/i&gt; channel &lt;i&gt;#utjb&lt;/i&gt;
* &lt;u&gt;&lt;b&gt;E-mail&lt;/b&gt;&lt;/u&gt; : crokx@beyondunreal.com
* &lt;u&gt;&lt;b&gt;Home page&lt;/b&gt;&lt;/u&gt; : http://crokx.free.fr/

==Guestbook ==

&lt;b&gt;Crokx:&lt;/b&gt; Good or bad, the messages are welcomes :D

'''Mychaeel:''' Welcome to the Wiki, Crokx.  :-)  Add yourself to the list of [[Legacy:Project Contributors|Project Contributors]].

'''Mosquito:''' I like the layout!  Thinkin of changing mine over to it. :)  As for myself, I'm just starting on the long road of scripting.</text>
    </revision>
    <revision>
      <id>2285</id>
      <timestamp>2003-05-21T08:12:51Z</timestamp>
      <contributor>
        <ip>Crokx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About me ==

Me is &lt;font color=&quot;#AA0000&quot;&gt;Crokx&lt;/font&gt;, i am just a fanatic UnrealScripter, i play rarely...

==Contact ==
* &lt;u&gt;&lt;b&gt;IRC&lt;/b&gt;&lt;/u&gt; : &lt;i&gt;enterthegame&lt;/i&gt; channel &lt;i&gt;#utjb&lt;/i&gt;
* &lt;u&gt;&lt;b&gt;E-mail&lt;/b&gt;&lt;/u&gt; : crokx@beyondunreal.com
* &lt;u&gt;&lt;b&gt;Home page&lt;/b&gt;&lt;/u&gt; : http://crokx.free.fr/

==Guestbook ==

&lt;b&gt;Crokx:&lt;/b&gt; Good or bad, the messages are welcomes :D

'''Mychaeel:''' Welcome to the Wiki, Crokx.  :-)  Add yourself to the list of [[Legacy:Project Contributors|Project Contributors]].</text>
    </revision>
    <revision>
      <id>2286</id>
      <timestamp>2003-05-21T16:11:24Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>Comments</comment>
      <text xml:space="preserve">==About me ==

Me is &lt;font color=&quot;#AA0000&quot;&gt;Crokx&lt;/font&gt;, i am just a fanatic UnrealScripter, i play rarely...

==Contact ==
* &lt;u&gt;&lt;b&gt;IRC&lt;/b&gt;&lt;/u&gt; : &lt;i&gt;enterthegame&lt;/i&gt; channel &lt;i&gt;#utjb&lt;/i&gt;
* &lt;u&gt;&lt;b&gt;E-mail&lt;/b&gt;&lt;/u&gt; : crokx@beyondunreal.com
* &lt;u&gt;&lt;b&gt;Home page&lt;/b&gt;&lt;/u&gt; : http://crokx.free.fr/

==Guestbook ==

&lt;b&gt;Crokx:&lt;/b&gt; Good or bad, the messages are welcomes :D

'''Mychaeel:''' Welcome to the Wiki, Crokx.  :-)  Add yourself to the list of [[Legacy:Project Contributors|Project Contributors]].

'''Mosquito:''' I like the layout!  Thinkin of changing mine over to it. :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CrosshairPack</title>
    <id>885</id>
    <revision>
      <id>2450</id>
      <timestamp>2007-03-27T08:51:46Z</timestamp>
      <contributor>
        <ip>NogginBasher</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; CrosshairPack (Package: Engine)}}

Abstract base class for client-side crosshair packs.

==Structs==

===CrosshairItem (native)===
; string FriendlyName (localized) : The name of a crosshair which will be displayed in the drop-down list of crosshairs.
; [[Legacy:Texture|Texture]] CrosshairTexture : The texture used for the crosshair. Note that you can only use [[Legacy:Texture|Texture]] materials, no material modifiers.

==Properties==

===CrosshairPack group===
; array&lt;CrosshairItem&gt; Crosshair (const, protected, cache) : The list of crosshairs in the crosshair pack. These will be exported to a cache file (.UCL) when compiling the package or running the [[Legacy:ExportCacheCommandlet|ExportCacheCommandlet]].

==How To Create A CrosshairPack==
# Create a texture package in UnrealEd or with UCC BatchImport, which contains all your new crosshairs. It's probably a good idea to stick to the same dimensions as UT2004's own crosshair textures. (see [[Legacy:Import The Texture|Import The Texture]])  (Note for UT:  Do not generate mipmaps when importing crosshair textures.  If you do, the crosshairs may not work on Linux clients.)
# Download this [http://www.koehler-homepage.de/Wormbo/unrealwiki.html#CP example project] and extract it to your UT2004 [[Legacy:Base Directory|Base Directory]]. (this ZIP archive contains a MyCrosshairPack directory)
# Rename the MyCrosshairPack class (i.e. the file itself and the &quot;MyCrosshairPack&quot; in the &quot;class MyCrosshairPack extends CrosshairPack;&quot; line) and its package so it reflects the name of your crosshair pack.&lt;br /&gt;Make sure the code package doesn't have the same name as the crosshair texture package, but try to keep them similar, for example ''MyCrosshairPack.u'' and ''MyCrosshairTextures.utx''.
# Change MyCrosshairTextures.utx below to the name of the texture package containing your crosshair textures.
# Add all crosshair textures to the crosshair list in the defaultproperties section and give them unique FriendlyNames. Make sure the names aren't used by other crosshair packs or the default crosshairs, because in that case the user will see multiple crosshairs with the same name in the crosshair list.
# Compile the project. I suggest using [[Legacy:UMake|UMake]] for this, the UMake project file is already included in the ZIP archive.&lt;br /&gt;Check the project setup before compiling and make sure the only packages listed are Core and Engine. (Uncheck all others)

==Known Subclasses==
* DefaultCrosshairs &amp;ndash; all default UT2004 crosshairs except for &quot;Circle (3-5)&quot;
* ONSCrosshairs &amp;ndash; &quot;Circle (3), &quot;Circle (4)&quot; and &quot;Circle (5)&quot; of the default crosshairs

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2451</id>
      <timestamp>2006-05-15T17:45:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; CrosshairPack (Package: Engine)}}

Abstract base class for client-side crosshair packs.

==Structs==

===CrosshairItem (native)===
; string FriendlyName (localized) : The name of a crosshair which will be displayed in the drop-down list of crosshairs.
; [[Legacy:Texture|Texture]] CrosshairTexture : The texture used for the crosshair. Note that you can only use [[Legacy:Texture|Texture]] materials, no material modifiers.

==Properties==

===CrosshairPack group===
; array&lt;CrosshairItem&gt; Crosshair (const, protected, cache) : The list of crosshairs in the crosshair pack. These will be exported to a cache file (.UCL) when compiling the package or running the [[Legacy:ExportCacheCommandlet|ExportCacheCommandlet]].

==How To Create A CrosshairPack==
# Create a texture package in UnrealEd or with UCC BatchImport, which contains all your new crosshairs. It's probably a good idea to stick to the same dimensions as UT2004's own crosshair textures. (see [[Legacy:Import The Texture|Import The Texture]])
# Download this [http://www.koehler-homepage.de/Wormbo/unrealwiki.html#CP example project] and extract it to your UT2004 [[Legacy:Base Directory|Base Directory]]. (this ZIP archive contains a MyCrosshairPack directory)
# Rename the MyCrosshairPack class (i.e. the file itself and the &quot;MyCrosshairPack&quot; in the &quot;class MyCrosshairPack extends CrosshairPack;&quot; line) and its package so it reflects the name of your crosshair pack.&lt;br /&gt;Make sure the code package doesn't have the same name as the crosshair texture package, but try to keep them similar, for example ''MyCrosshairPack.u'' and ''MyCrosshairTextures.utx''.
# Change MyCrosshairTextures.utx below to the name of the texture package containing your crosshair textures.
# Add all crosshair textures to the crosshair list in the defaultproperties section and give them unique FriendlyNames. Make sure the names aren't used by other crosshair packs or the default crosshairs, because in that case the user will see multiple crosshairs with the same name in the crosshair list.
# Compile the project. I suggest using [[Legacy:UMake|UMake]] for this, the UMake project file is already included in the ZIP archive.&lt;br /&gt;Check the project setup before compiling and make sure the only packages listed are Core and Engine. (Uncheck all others)

==Known Subclasses==
* DefaultCrosshairs &amp;ndash; all default UT2004 crosshairs except for &quot;Circle (3-5)&quot;
* ONSCrosshairs &amp;ndash; &quot;Circle (3), &quot;Circle (4)&quot; and &quot;Circle (5)&quot; of the default crosshairs

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Crosshairs</title>
    <id>913</id>
    <revision>
      <id>2508</id>
      <timestamp>2006-11-05T12:34:01Z</timestamp>
      <contributor>
        <ip>85.158.39.146</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Open uEd... in texture browser click NEW TEXTURE... save it.. for example, MyCroshairs.utx

Then open that texture package in texture window... 

Now open Photoshop... create new 64x64px with 64pxresolution per inch... black background, white lines...

Make sure this image is in 8bit pallete (check it out with ImageMenu)

Now draw your croshair in photoshop, then export it like pcx file..

back in uEd, import that exported pcx file into your texture pacakage, save texture package again. exit uEd. 

Open file C:/UnrealTournament/System/User.ini 

find line:

CrosshairCount=9

ad another number, in this case line must be:

CrosshairCount=10

and on last line ad path to your cursor somethin like this

CrossHairs[0]=Botpack.CHair1

CrossHairs[1]=Botpack.CHair2

CrossHairs[2]=Botpack.CHair3

CrossHairs[3]=Botpack.CHair4

CrossHairs[4]=Botpack.CHair5

CrossHairs[5]=Botpack.CHair6

CrossHairs[6]=Botpack.CHair7

CrossHairs[7]=Botpack.CHair8

CrossHairs[8]=Botpack.CHair9

CrossHairs[9]=eBosnicCross.ebo2

eBosnicCross was name of my texture package

ebo2 is name of my imported cross.

have fun.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cryptic AR</title>
    <id>932</id>
    <revision>
      <id>2538</id>
      <timestamp>2008-03-14T06:57:22Z</timestamp>
      <contributor>
        <ip>71-17-83-160.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>response</comment>
      <text xml:space="preserve">Greets to animators, im not sure how good this Rig works with Unreal Engine 3 yet but its a deeply customizable rig and its free. Please someone skilled and experience in animation please test this rig for UE3. This rig is mainly for people who are making TC mods and want a premade professional customizable and adaptable rig. The developers of this rig are the same people who worked on the commercial title City of Heroes.

'''Wormbo:''' What is this page about?

'''ImEatingHotCheetos''' Isnt it related and linked to animation? If it isnt important than just delete it.

'''MythOpus:''' Related+Linked with animation yes.  Fleshed out with its own page detailing exactly what Cryptic AR is (an animation skeleton rigging application??) is needed though.  It probably would have been better to just post the question on the animation page from whence this page is linked and someone could make a page for it later once enough information on it has been dug up.</text>
    </revision>
    <revision>
      <id>2539</id>
      <timestamp>2008-03-13T17:47:34Z</timestamp>
      <contributor>
        <ip>Adsl-68-127-116-19.dsl.frsn02.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greets to animators, im not sure how good this Rig works with Unreal Engine 3 yet but its a great rig. Its deeply customizable and its free. Please someone skilled and experience in animation please test this rig for UE3. This rig is mainly for people who are making TC mods and want a premade professional customizable and adaptable rig.</text>
    </revision>
    <revision>
      <id>2540</id>
      <timestamp>2008-03-13T17:50:51Z</timestamp>
      <contributor>
        <ip>Adsl-68-127-116-19.dsl.frsn02.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greets to animators, im not sure how good this Rig works with Unreal Engine 3 yet but its a deeply customizable rig and its free. Please someone skilled and experience in animation please test this rig for UE3. This rig is mainly for people who are making TC mods and want a premade professional customizable and adaptable rig.</text>
    </revision>
    <revision>
      <id>2541</id>
      <timestamp>2008-03-13T17:56:27Z</timestamp>
      <contributor>
        <ip>Adsl-68-127-116-19.dsl.frsn02.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greets to animators, im not sure how good this Rig works with Unreal Engine 3 yet but its a deeply customizable rig and its free. Please someone skilled and experience in animation please test this rig for UE3. This rig is mainly for people who are making TC mods and want a premade professional customizable and adaptable rig. The developers of this rig are the same people who worked on the commercial title City of Heroes.</text>
    </revision>
    <revision>
      <id>2542</id>
      <timestamp>2008-03-13T20:58:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>huh?</comment>
      <text xml:space="preserve">Greets to animators, im not sure how good this Rig works with Unreal Engine 3 yet but its a deeply customizable rig and its free. Please someone skilled and experience in animation please test this rig for UE3. This rig is mainly for people who are making TC mods and want a premade professional customizable and adaptable rig. The developers of this rig are the same people who worked on the commercial title City of Heroes.

'''Wormbo:''' What is this page about?</text>
    </revision>
    <revision>
      <id>2543</id>
      <timestamp>2008-03-14T06:31:57Z</timestamp>
      <contributor>
        <ip>Adsl-68-127-116-19.dsl.frsn02.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greets to animators, im not sure how good this Rig works with Unreal Engine 3 yet but its a deeply customizable rig and its free. Please someone skilled and experience in animation please test this rig for UE3. This rig is mainly for people who are making TC mods and want a premade professional customizable and adaptable rig. The developers of this rig are the same people who worked on the commercial title City of Heroes.

'''Wormbo:''' What is this page about?

'''ImEatingHotCheetos''' Isnt it related and linked to animation? If it isnt important than just delete it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Csimbi</title>
    <id>839</id>
    <revision>
      <id>2347</id>
      <timestamp>2003-12-08T10:27:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the wiki. :) It's good to see you are trying to fill in the UWindow classes, but could you please stick to the standard class page layout? If you need an example, have a look at e.g. [[Legacy:UWindowWindow|UWindowWindow]].

----

'''Csimbi:''' Sorry, new here. Learning it slowly...

'''Tarquin:''' That's ok. Welcome to the wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2348</id>
      <timestamp>2003-12-08T04:16:08Z</timestamp>
      <contributor>
        <ip>Csimbi</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the wiki. :) It's good to see you are trying to fill in the UWindow classes, but could you please stick to the standard class page layout? If you need an example, have a look at e.g. [[Legacy:UWindowWindow|UWindowWindow]].

----

'''Csimbi:''' Sorry, new here. Learning it slowly...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CubeBuilder</title>
    <id>877</id>
    <revision>
      <id>2433</id>
      <timestamp>2004-07-22T04:25:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; CubeBuilder (Package: Editor)}}

Shapes the  [[Legacy:Red Builder Brush|red builder brush]] into a box.

==Properties==
; Height, Width, Breadth : The dimensions of the brush.
; WallThickness : The thickness of the box's walls, if the brush is hollow. Note that this number is the total wall thickness along each axis, not the thickness of each individual wall. For example, if you want each wall of your box to be 16 [[Legacy:UU|UU]]s thick, you would set WallThickness = 32. Thus WallThickness must be less than the smallest of Height, Width, and Breadth. This setting has no effect if Hollow is false.
; GroupName : Not sure. Despite its name, this setting has no effect on the default group to which new brushes are assigned.
; Hollow : If true, creates a hollow box rather than a solid one. See WallThickness above.
; Tessellated : If true, tessellates each side of the box. In other words, each face of the box will be composed of two triangles rather than a single rectangular polygon. Use this only if you plan on vertex-editing the box in such a way that it will end up with more than six faces.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2434</id>
      <timestamp>2004-07-21T19:34:26Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>rewritten for clarity</comment>
      <text xml:space="preserve">Shapes the  [[Legacy:Red Builder Brush|red builder brush]] into a box.

==Properties==
; Height, Width, Breadth : The dimensions of the brush.
; WallThickness : The thickness of the box's walls, if the brush is hollow. Note that this number is the total wall thickness along each axis, not the thickness of each individual wall. For example, if you want each wall of your box to be 16 [[Legacy:UU|UU]]s thick, you would set WallThickness = 32. Thus WallThickness must be less than the smallest of Height, Width, and Breadth. This setting has no effect if Hollow is false.
; GroupName : Not sure. Despite its name, this setting has no effect on the default group to which new brushes are assigned.
; Hollow : If true, creates a hollow box rather than a solid one. See WallThickness above.
; Tessellated : If true, tessellates each side of the box. In other words, each face of the box will be composed of two triangles rather than a single rectangular polygon. Use this only if you plan on vertex-editing the box in such a way that it will end up with more than six faces.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CubeBuilder (DX)</title>
    <id>851</id>
    <revision>
      <id>2373</id>
      <timestamp>2006-11-26T04:01:46Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Removed Delegates heading, because there are no Delegates</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]] &gt;&gt; CubeBuilder (Editor)}}

Builds a 3D cube brush.

==Properties==
; float Breadth : 
; name GroupName : 
; float Height : 
; bool Hollow : 
; float WallThickness : 
; float Width : 

==Functions==
;  BuildCube( int Direction , float dx , float dy , float dz ): 

==Events==
; bool Build( ): 

==Notes==

[[Legacy:Unreal Tournament|Unreal Tournament]] version of this class has an option to build a &quot;tesselated&quot; cube.

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2374</id>
      <timestamp>2004-02-10T05:08:57Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]] &gt;&gt; CubeBuilder (Editor)}}

Builds a 3D cube brush.

==Properties==
; float Breadth : 
; name GroupName : 
; float Height : 
; bool Hollow : 
; float WallThickness : 
; float Width : 

==Delegates==

==Functions==
;  BuildCube( int Direction , float dx , float dy , float dz ): 

==Events==
; bool Build( ): 

==Notes==

[[Legacy:Unreal Tournament|Unreal Tournament]] version of this class has an option to build a &quot;tesselated&quot; cube.

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cubemap</title>
    <id>769</id>
    <revision>
      <id>2194</id>
      <timestamp>2006-03-26T09:54:04Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>What is this used for?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; Cubemap (Package: Engine)}}

A Cubemap consists of 6 textures that form like that of a cube when placed in respective places in an unassembled box. Cubemap textures are generally made two ways:

* A [[Legacy:Lens Flare|lens flare]] or some white or coloured blotch in the center of the texture which is then set as part of the cubemap texture six times.
* Using various map textures that creates an actual cube. Almost like how [[Legacy:SkyBox|SkyBox]] textures are made up of.

==Quick Tutorial==

# Open your favourite [[Legacy:Graphics Application|Graphics Application]].

#Create a blank square texture with a black background. Food for thought: these textures should be the size in powers of 2 eg. 128x128, 256x256 ...however, it shouldn't be larger than 256x256. Just think of the texture usage. 1024x1024x6 = Holy Crap!

#
Slap a lense flare on it with a random intensity. Here's mine:

[[Image:Legacy_cubemap-kyubu-texture.gif|center|CubeMap Texture! w00t!]]


#[[Legacy:Import The Texture|Import the texture]]: you need same texture 6 times in the [[Legacy:Texture Browser|texture browser]] but use an incremental count from 0 to 5.

#
Make a new texture and make sure the Name is uniquely named from other textures and the MaterialClass is set to CubeMap:

[[Image:Legacy_cubemap-kyubu-newtexture-2.png|center|Settings!]]


#
In the new properties window, you can reference the name of the cube textures like so:

[[Image:Legacy_cubemap-kyubu-txtproperties.png|center|This is a place-holder for the cube textures.]]

For reference, you can just type the name of the texture (in the example above, &quot;kyubu0&quot;) and Ued will expand the name to its technical name.


#
Since most CubeMap textures are used as an environment texture, let go turn it into an Environment map texture. Close that properties window and lets make a new texture with a different MaterialClass setting.

[[Image:Legacy_cubemap-kyubu-newenv.png|center|That new setting is [[Legacy:TexEnvMap|TexEnvMap]]]]


#
Make the material reference the CubeMap like so:

[[Image:Legacy_cubemap-kyubu-cuberef.png|center|]]

In that example, I just typed &quot;kyubuCube&quot; and it expanded the name for me.


#
If have you done everything right, you should now end up with 6 [[Legacy:Texture|texture]]s, 1 CubeMap, and 1 [[Legacy:TexEnvMap|TexEnvMap]]:

[[Image:Legacy_cubemap-kyubu-finaltxt.png|center|The two final textures.]]

Now when ever you want to reference the Cubemap into your map, the texture to reference would be the &quot;TexEnvMap&quot; instead of the &quot;CubeMap&quot;.


==Related Topics==
* [[Legacy:TexEnvMap|TexEnvMap]]
* [[udn2:MaterialsEnvironmentMaps]]

==Comments ==
* please reuse images from elsewhere in the site when possible
* link to BP pages when relevant

'''EricBlade:''' What is this used for?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2195</id>
      <timestamp>2006-03-26T01:19:27Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>what are these used for?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; Cubemap (Package: Engine)}}

A Cubemap consists of 6 textures that form like that of a cube when placed in respective places in an unassembled box. Cubemap textures are generally made two ways:

* A [[Legacy:Lens Flare|lens flare]] or some white or coloured blotch in the center of the texture which is then set as part of the cubemap texture six times.
* Using various map textures that creates an actual cube. Almost like how [[Legacy:SkyBox|SkyBox]] textures are made up of.

==Quick Tutorial==

# Open [[Legacy:Photoshop|Photoshop]] or similiar graphics program.

#Create a blank square texture with a black background. Food for thought: these textures should be the size in powers of 2 eg. 128x128, 256x256 ...however, it shouldn't be larger than 256x256. Just think of the texture usage. 1024x1024x6 = Holy Crap!

#
Slap a lense flare on it with a random intensity. Here's mine:

[[Image:Legacy_cubemap-kyubu-texture.gif|center|CubeMap Texture! w00t!]]


#[[Legacy:Import The Texture|Import the texture]]: you need same texture 6 times in the [[Legacy:Texture Browser|texture browser]] but use an incremental count from 0 to 5.

#
Make a new texture and make sure the Name is uniquely named from other textures and the MaterialClass is set to CubeMap:

[[Image:Legacy_cubemap-kyubu-newtexture-2.png|center|Settings!]]


#
In the new properties window, you can reference the name of the cube textures like so:

[[Image:Legacy_cubemap-kyubu-txtproperties.png|center|This is a place-holder for the cube textures.]]

For reference, you can just type the name of the texture (in the example above, &quot;kyubu0&quot;) and Ued will expand the name to its technical name.


#
Since most CubeMap textures are used as an environment texture, let go turn it into an Environment map texture. Close that properties window and lets make a new texture with a different MaterialClass setting.

[[Image:Legacy_cubemap-kyubu-newenv.png|center|That new setting is [[Legacy:TexEnvMap|TexEnvMap]]]]


#
Make the material reference the CubeMap like so:

[[Image:Legacy_cubemap-kyubu-cuberef.png|center|]]

In that example, I just typed &quot;kyubuCube&quot; and it expanded the name for me.


#
If have you done everything right, you should now end up with 6 [[Legacy:Texture|texture]]s, 1 CubeMap, and 1 [[Legacy:TexEnvMap|TexEnvMap]]:

[[Image:Legacy_cubemap-kyubu-finaltxt.png|center|The two final textures.]]

Now when ever you want to reference the Cubemap into your map, the texture to reference would be the &quot;TexEnvMap&quot; instead of the &quot;CubeMap&quot;.


==Related Topics==
* [[Legacy:TexEnvMap|TexEnvMap]]
* [[udn2:MaterialsEnvironmentMaps]]

==Comments ==
* please reuse images from elsewhere in the site when possible
* link to BP pages when relevant

'''EricBlade:''' What is this used for?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40339</id>
      <timestamp>2009-12-16T11:18:01Z</timestamp>
      <contributor>
        <ip>79.77.234.207</ip>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; Cubemap (Package: Engine)}}

A Cubemap consists of 6 textures that form like that of a cube when placed in respective places in an unassembled box. Cubemap textures are generally made two ways:

* A [[Legacy:Lens Flare|lens flare]] or some white or coloured blotch in the center of the texture which is then set as part of the cubemap texture six times.
* Using various map textures that creates an actual cube. Almost like how [[Legacy:SkyBox|SkyBox]] textures are made up of.

==Quick Tutorial==

# Open your favourite [[Legacy:Graphics Application|Graphics Application]].

#Create a blank square texture with a black background. Food for thought: these textures should be the size in powers of 2 eg. 128x128, 256x256 ...however, it shouldn't be larger than 256x256. Just think of the texture usage. 1024x1024x6 = Holy Crap!

#
Slap a lense flare on it with a random intensity. Here's mine:

[[Image:Legacy_cubemap-kyubu-texture.gif|center|CubeMap Texture! w00t!]]


#[[Legacy:Import The Texture|Import the texture]]: you need same texture 6 times in the [[Legacy:Texture Browser|texture browser]] but use an incremental count from 0 to 5.

#
Make a new texture and make sure the Name is uniquely named from other textures and the MaterialClass is set to CubeMap:

[[Image:Legacy_cubemap-kyubu-newtexture-2.png|center|Settings!]]


#
In the new properties window, you can reference the name of the cube textures like so:

[[Image:Legacy_cubemap-kyubu-txtproperties.png|center|This is a place-holder for the cube textures.]]

For reference, you can just type the name of the texture (in the example above, &quot;kyubu0&quot;) and Ued will expand the name to its technical name.


#
Since most CubeMap textures are used as an environment texture, let go turn it into an Environment map texture. Close that properties window and lets make a new texture with a different MaterialClass setting.

[[Image:Legacy_cubemap-kyubu-newenv.png|center|That new setting is [[Legacy:TexEnvMap|TexEnvMap]]]]


#
Make the material reference the CubeMap like so:

[[Image:Legacy_cubemap-kyubu-cuberef.png|center|]]

In that example, I just typed &quot;kyubuCube&quot; and it expanded the name for me.


#
If have you done everything right, you should now end up with 6 [[Legacy:Texture|texture]]s, 1 CubeMap, and 1 [[Legacy:TexEnvMap|TexEnvMap]]:

[[Image:Legacy_cubemap-kyubu-finaltxt.png|center|The two final textures.]]

Now when ever you want to reference the Cubemap into your map, the texture to reference would be the &quot;TexEnvMap&quot; instead of the &quot;CubeMap&quot;.


==Related Topics==
* [[Legacy:TexEnvMap|TexEnvMap]]
* [[udn2:MaterialsEnvironmentMaps]]

==Comments ==
* please reuse images from elsewhere in the site when possible
* link to BP pages when relevant

'''EricBlade:''' What is this used for?
'''Appox:''' Reflections for things such as Water and Glass. 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Cup Of Squirrels</title>
    <id>897</id>
    <revision>
      <id>2477</id>
      <timestamp>2005-07-04T16:12:04Z</timestamp>
      <contributor>
        <ip>Cup Of Squirrels</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">www.cupofsquirrels.co.uk go go go :O

===Comments/rants/&quot;I hate yuo&quot;===

'''Tarquin:''' Hi. Welcome to the wiki. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2478</id>
      <timestamp>2005-05-23T18:48:43Z</timestamp>
      <contributor>
        <ip>Cup Of Squirrels</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Ok, lets get the truth out:

I'm a fucking idiot.

Ignore me.

www.cupofsquirrels.co.uk is coming :o just waiting for the damned order to go through :|

===Projects + maps etc===

[http://www.mapraider.com/maps/?fileid=3003 CTF-GibPool]

[http://img.photobucket.com/albums/v486/m4gg0t/screenshots/Shot00006.jpg]

''This is my first map based loosely on my local swimming pool; I needed some refrence for my first map. It's a small iCTF map, because I cba to place other weapons there, and it would be pretty pointless in such a small map anyway.''

----

CTF-Kitchen

''Another map based on an original layout: my kitchen. Work is pretty slow at the moment, due to the fact I'm a lazy man, plus a much better kitchen map than I could ever do was released during the time I've been working on it. This project may be abandoned. I'll see :S''

===Comments/rants/&quot;I hate yuo&quot;===

'''Tarquin:''' Hi. Welcome to the wiki. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44426</id>
      <timestamp>2011-05-12T18:46:11Z</timestamp>
      <contributor>
        <username>Blib</username>
        <id>2230</id>
      </contributor>
      <comment>Replaced content with 'Gone.'</comment>
      <text xml:space="preserve">Gone.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CurvedStairBuilder</title>
    <id>878</id>
    <revision>
      <id>2435</id>
      <timestamp>2005-12-20T19:07:04Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; CurvedStairBuilder (Package: Editor)}}

This creates a curved stair for the [[Legacy:Red Builder Brush|red builder brush]]

==Properties==

* Inner radius - this is the radius from the centre of the brush (the lone red point) to the staircase itself.  This value must be larger than zero.
* Stepheight - The height of each step. don't know the maximum height with walking, but when it's 32 you must jump
* Stepwidth - The width of the steps
* Angle of curve - The rotation of the staircase. Must be between 1 and 360
* Num of Steps - The number of steps
* Add to first step - the extra height the staircase gets. handy if you want a staircase that starts a bit higher
* Group Name - Doesn't do anything with it
* CounterClockwise - switches the lower and higher part. With C it goes up to the right, and with CC to the left

==Aligning Tips==

Use different textures. Use a texture for the walk surface of the stairs, and another one for the rest.  Use align wall direction at the sides to make it look nicer and you don't see those ugly lines.

This is i think the best way for the curved staircases. The linear can have the same.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2436</id>
      <timestamp>2004-07-21T18:00:42Z</timestamp>
      <contributor>
        <ip>Buu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This creates a curved stair for the [[Legacy:Red Builder Brush|red builder brush]]

==Properties==

* Inner radius - this is the radius from the centre of the brush (the lone red point) to the staircase itself
* Stepheight - The height of each step. don't know the maximum height with walking, but when it's 32 you must jump
* Stepwidth - The width of the steps
* Angle of curve - The rotation of the staircase. Must be between 1 and 360
* Num of Steps - The number of steps
* Add to first step - the extra height the staircase gets. handy if you want a staircase that starts a bit higher
* Group Name - Doesn't do anything with it
* CounterClockwise - switches the lower and higher part. With C it goes up to the right, and with CC to the left

==Aligning Tips==

Use different textures. Use a texture for the walk surface of the stairs, and another one for the rest.  Use align wall direction at the sides to make it look nicer and you don't see those ugly lines.

This is i think the best way for the curved staircases. The linear can have the same.</text>
    </revision>
    <revision>
      <id>2437</id>
      <timestamp>2004-07-22T04:27:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; CurvedStairBuilder (Package: Editor)}}

This creates a curved stair for the [[Legacy:Red Builder Brush|red builder brush]]

==Properties==

* Inner radius - this is the radius from the centre of the brush (the lone red point) to the staircase itself
* Stepheight - The height of each step. don't know the maximum height with walking, but when it's 32 you must jump
* Stepwidth - The width of the steps
* Angle of curve - The rotation of the staircase. Must be between 1 and 360
* Num of Steps - The number of steps
* Add to first step - the extra height the staircase gets. handy if you want a staircase that starts a bit higher
* Group Name - Doesn't do anything with it
* CounterClockwise - switches the lower and higher part. With C it goes up to the right, and with CC to the left

==Aligning Tips==

Use different textures. Use a texture for the walk surface of the stairs, and another one for the rest.  Use align wall direction at the sides to make it look nicer and you don't see those ugly lines.

This is i think the best way for the curved staircases. The linear can have the same.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Custom Brushbuilder</title>
    <id>814</id>
    <revision>
      <id>2292</id>
      <timestamp>2004-09-23T19:47:14Z</timestamp>
      <contributor>
        <ip>D146-2-41.home1.cgocable.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Note that [[Legacy:UnrealEd 2|UnrealEd 2]] brushbuilder packages don't work with  [[Legacy:UnrealEd 3|UnrealEd 3]]: they need to be recompiled.

[[Image:Legacy_CustomBB.jpeg|left|The interface with all the custom builders 
UnrealEd accepts plug-in scripts for custom brushbuilders. 

(1-10 are the default brushbuilders.)

===Tarquin Brushbuilders (11-17) ===

Created by Tarquin. &lt;br /&gt;And also recompiled for UnrealEd 3 by SlickWilly.
* Tarquin's brushbuilders, available from:
** the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack: partial cylinder, spiral stairs, panorama, torus.
** the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]].

===Platonic Solids Brushbuilder (18) ===

Created by Dave Arendash, at the Unreal Realm of Concepts.
: Five Platonic solids: Tetrahedron, Cube, Octahedron, Dodecahedron, Icosahedron. Plus hundreds of other shapes as brushes.
: http://www.unrealroc.com/

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?

'''DaveA:''' Answer, have not tried it, but it should work ok. Want the source?

===FrameBuilder Brushbuilder (19) ===

Created by JohnMcL.
: Builds an open, four-sided frame with an optional sheet inside.
: http://www.unrealediting.de/index.php?f=files&amp;game=3&amp;typ=6

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3? And is the page down or am i just having bad luck with the link?

'''Torin:''' Try http://unrealed.myexp.de/index.php?P=info&amp;D=117

'''DawnTreader:''' Thanks Torin! But it does need to be recompiled doesn't it? Just tried it out and it don't work in UED3.

===Landscape Brushbuilder (20) ===

Created by Rahnem.
: Alternative to the Terrain Brush Builder that comes with UnrealEd 2.
: http://www.planetunreal.com/rahnem/

===UnrealEdExtra Brushbuilders (21-23) ===

Created by Daid.
: Download: http://jiggaman.250free.com/unrealex.zip
* Includes:
** Random Tunnel
** Random Terrain
** Cylinder Sheet

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?


]]

==Installing ==

===File placement===
* .U files go in {UT}/System
* .BMP files go in {UT}/System/Editores
* .txt (readme's) go in {UT}/Help

===Config===

Each .U file needs a reference in [[Legacy:Game Ini File|Game Ini File]], for example:
 EditPackages=TarquinBrushBuilders

In UT, this is under the '''Editor.EditorEngine''' section, in UT2003, in the '''UnrealEd.UnrealEdEngine''' section.

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]], the built-in set
* [[Legacy:BrushBuilder|BrushBuilder]], the parent class
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] for details on how to create them. 
* [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2293</id>
      <timestamp>2004-07-05T21:54:55Z</timestamp>
      <contributor>
        <ip>DawnTreader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Note that [[Legacy:UnrealEd 2|UnrealEd 2]] brushbuilder packages don't work with  [[Legacy:UnrealEd 3|UnrealEd 3]]: they need to be recompiled.

[[Image:Legacy_CustomBB.jpeg|left|The interface with all the custom builders 
UnrealEd accepts plug-in scripts for custom brushbuilders. 

(1-10 are the default brushbuilders.)

===Tarquin Brushbuilders (11-17) ===

Created by Tarquin. &lt;br /&gt;And also recompiled for UnrealEd 3 by SlickWilly.
* Tarquin's brushbuilders, available from:
** the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack: partial cylinder, spiral stairs, panorama, torus.
** the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]].

===Platonic Solids Brushbuilder (18) ===

Created by Dave Arendash, at the Unreal Realm of Concepts.
: Five Platonic solids: Tetrahedron, Cube, Octahedron, Dodecahedron, Icosahedron.
: http://www.unrealroc.com/

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?

===FrameBuilder Brushbuilder (19) ===

Created by JohnMcL.
: Builds an open, four-sided frame with an optional sheet inside.
: http://www.unrealediting.de/index.php?f=files&amp;game=3&amp;typ=6

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3? And is the page down or am i just having bad luck with the link?

'''Torin:''' Try http://unrealed.myexp.de/index.php?P=info&amp;D=117

'''DawnTreader:''' Thanks Torin! But it does need to be recompiled doesn't it? Just tried it out and it don't work in UED3.

===Landscape Brushbuilder (20) ===

Created by Rahnem.
: Alternative to the Terrain Brush Builder that comes with UnrealEd 2.
: http://www.planetunreal.com/rahnem/

===UnrealEdExtra Brushbuilders (21-23) ===

Created by Daid.
: Download: http://jiggaman.250free.com/unrealex.zip
* Includes:
** Random Tunnel
** Random Terrain
** Cylinder Sheet

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?

'''Torin:''' This link is broken. Can someone who has unrealex.zip upload it and post the link?

]]

==Installing ==

===File placement===
* .U files go in {UT}/System
* .BMP files go in {UT}/System/Editores
* .txt (readme's) go in {UT}/Help

===Config===

Each .U file needs a reference in [[Legacy:Game Ini File|Game Ini File]], for example:
 EditPackages=TarquinBrushBuilders

In UT, this is under the '''Editor.EditorEngine''' section, in UT2003, in the '''UnrealEd.UnrealEdEngine''' section.

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]], the built-in set
* [[Legacy:BrushBuilder|BrushBuilder]], the parent class
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] for details on how to create them. 
* [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2294</id>
      <timestamp>2004-08-05T08:33:21Z</timestamp>
      <contributor>
        <ip>C-67-170-242-238.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Note that [[Legacy:UnrealEd 2|UnrealEd 2]] brushbuilder packages don't work with  [[Legacy:UnrealEd 3|UnrealEd 3]]: they need to be recompiled.

[[Image:Legacy_CustomBB.jpeg|left|The interface with all the custom builders 
UnrealEd accepts plug-in scripts for custom brushbuilders. 

(1-10 are the default brushbuilders.)

===Tarquin Brushbuilders (11-17) ===

Created by Tarquin. &lt;br /&gt;And also recompiled for UnrealEd 3 by SlickWilly.
* Tarquin's brushbuilders, available from:
** the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack: partial cylinder, spiral stairs, panorama, torus.
** the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]].

===Platonic Solids Brushbuilder (18) ===

Created by Dave Arendash, at the Unreal Realm of Concepts.
: Five Platonic solids: Tetrahedron, Cube, Octahedron, Dodecahedron, Icosahedron. Plus hundreds of other shapes as brushes.
: http://www.unrealroc.com/

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?

'''DaveA:''' Answer, have not tried it, but it should work ok. Want the source?

===FrameBuilder Brushbuilder (19) ===

Created by JohnMcL.
: Builds an open, four-sided frame with an optional sheet inside.
: http://www.unrealediting.de/index.php?f=files&amp;game=3&amp;typ=6

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3? And is the page down or am i just having bad luck with the link?

'''Torin:''' Try http://unrealed.myexp.de/index.php?P=info&amp;D=117

'''DawnTreader:''' Thanks Torin! But it does need to be recompiled doesn't it? Just tried it out and it don't work in UED3.

===Landscape Brushbuilder (20) ===

Created by Rahnem.
: Alternative to the Terrain Brush Builder that comes with UnrealEd 2.
: http://www.planetunreal.com/rahnem/

===UnrealEdExtra Brushbuilders (21-23) ===

Created by Daid.
: Download: http://jiggaman.250free.com/unrealex.zip
* Includes:
** Random Tunnel
** Random Terrain
** Cylinder Sheet

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?

'''Torin:''' This link is broken. Can someone who has unrealex.zip upload it and post the link?

]]

==Installing ==

===File placement===
* .U files go in {UT}/System
* .BMP files go in {UT}/System/Editores
* .txt (readme's) go in {UT}/Help

===Config===

Each .U file needs a reference in [[Legacy:Game Ini File|Game Ini File]], for example:
 EditPackages=TarquinBrushBuilders

In UT, this is under the '''Editor.EditorEngine''' section, in UT2003, in the '''UnrealEd.UnrealEdEngine''' section.

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]], the built-in set
* [[Legacy:BrushBuilder|BrushBuilder]], the parent class
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] for details on how to create them. 
* [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34499</id>
      <timestamp>2009-06-17T07:30:06Z</timestamp>
      <contributor>
        <ip>99.132.168.1</ip>
      </contributor>
      <text xml:space="preserve">Note that [[Legacy:UnrealEd 2|UnrealEd 2]] brushbuilder packages don't work with  [[Legacy:UnrealEd 3|UnrealEd 3]]: they need to be recompiled.

[[Image:Legacy_CustomBB.jpeg|right]]
The interface with all the custom builders 
UnrealEd accepts plug-in scripts for custom brushbuilders. 

(1-10 are the default brushbuilders.)

===Tarquin Brushbuilders (11-17) ===

Created by Tarquin. &lt;br /&gt;And also recompiled for UnrealEd 3 by SlickWilly.
* Tarquin's brushbuilders, available from:
** the [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]] pack: partial cylinder, spiral stairs, panorama, torus.
** the [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]].

===Platonic Solids Brushbuilder (18) ===

Created by Dave Arendash, at the Unreal Realm of Concepts.
: Five Platonic solids: Tetrahedron, Cube, Octahedron, Dodecahedron, Icosahedron. Plus hundreds of other shapes as brushes.
: http://www.unrealroc.com/

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?

'''DaveA:''' Answer, have not tried it, but it should work ok. Want the source?

===FrameBuilder Brushbuilder (19) ===

Created by JohnMcL.
: Builds an open, four-sided frame with an optional sheet inside.
: http://www.unrealediting.de/index.php?f=files&amp;game=3&amp;typ=6

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3? And is the page down or am i just having bad luck with the link?

'''Torin:''' Try http://unrealed.myexp.de/index.php?P=info&amp;D=117

'''DawnTreader:''' Thanks Torin! But it does need to be recompiled doesn't it? Just tried it out and it don't work in UED3.

===Landscape Brushbuilder (20) ===

Created by Rahnem.
: Alternative to the Terrain Brush Builder that comes with UnrealEd 2.
: http://www.planetunreal.com/rahnem/

===UnrealEdExtra Brushbuilders (21-23) ===

Created by Daid.
: Download: http://jiggaman.250free.com/unrealex.zip
* Includes:
** Random Tunnel
** Random Terrain
** Cylinder Sheet

'''DawnTreader:''' Question, has this been recompiled, does it work with UED3?



==Installing ==

===File placement===
* .U files go in {UT}/System
* .BMP files go in {UT}/System/Editores
* .txt (readme's) go in {UT}/Help

===Config===

Each .U file needs a reference in [[Legacy:Game Ini File|Game Ini File]], for example:
 EditPackages=TarquinBrushBuilders

In UT, this is under the '''Editor.EditorEngine''' section, in UT2003, in the '''UnrealEd.UnrealEdEngine''' section.

==Related Topics ==
* [[Legacy:Brushbuilders|Brushbuilders]], the built-in set
* [[Legacy:BrushBuilder|BrushBuilder]], the parent class
* [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] for details on how to create them. 
* [[Legacy:Custom Brushbuilder Ideas|Custom Brushbuilder Ideas]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Custom Brushbuilder Ideas</title>
    <id>734</id>
    <revision>
      <id>2112</id>
      <timestamp>2007-08-18T22:24:16Z</timestamp>
      <contributor>
        <ip>C951b8f0.virtua.com.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Back to [[Legacy:Brushbuilders|Brushbuilders]] .

: Well, as you may know, this is an area to post some ideas about custom brushbuilders. You may post, enhance, or '''script''' these!

==Torus builder ==
:''Builds a Torus.''
* I miss one big feature in Tarquin's torus brushbuilder, the ability to build tesselated torus!

==Star Builder ==
: ''Builds 2d and 3d stars.''
* 2d
* 3d

===Default Properties ===

==Helix Builder ==
: ''Builds a helix, double helix, etc.''
* Spheres on sertain points on the helices
* Bars connecting the helices (like DNA)

===Default Properties ===

==Fence Builder ==
: ''Builds wire and wooden fences, guardrails, etc.''

===Default Properties ===

==Pod Builder ==
: ''Builds unipods, bipods, tripods, etc.''

===Default Properties ===

==Reinforcement Builder ==
: ''Builds reinforcements for buildings and other architecture''

===Default Properties ===

==Slice Builder ==
: ''Builds Slices of a sphere like tarquin's cylinder builder''

'''Tarquin:''' If I ever get the Sphere builder finished, it'll do that.

===Default Properties ===

====Comments ====

'''ZxAnPhOrIaN:'''  Wow! I created a lot of ideas!

'''ProjectX:''' Must be a first, he he, only joking Zxan

----

[[:Category:Legacy To Do]] – needs input

----

'''ZxAnPhOrIaN:''' Admin, could you please delete this page, seems like custom bb scripting is not a hot idea.

'''Tarquin:''' well, with Maya &amp; all that ... Yup, I'll delete it in a bit.

'''ZxAnPhOrIaN:''' What is Maya anyway??
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2113</id>
      <timestamp>2002-12-27T21:30:57Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Back to [[Legacy:Brushbuilders|Brushbuilders]] .

: Well, as you may know, this is an area to post some ideas about custom brushbuilders. You may post, enhance, or '''script''' these!

==Star Builder ==
: ''Builds 2d and 3d stars.''
* 2d
* 3d

===Default Properties ===

==Helix Builder ==
: ''Builds a helix, double helix, etc.''
* Spheres on sertain points on the helices
* Bars connecting the helices (like DNA)

===Default Properties ===

==Fence Builder ==
: ''Builds wire and wooden fences, guardrails, etc.''

===Default Properties ===

==Pod Builder ==
: ''Builds unipods, bipods, tripods, etc.''

===Default Properties ===

==Reinforcement Builder ==
: ''Builds reinforcements for buildings and other architecture''

===Default Properties ===

==Slice Builder ==
: ''Builds Slices of a sphere like tarquin's cylinder builder''

'''Tarquin:''' If I ever get the Sphere builder finished, it'll do that.

===Default Properties ===

====Comments ====

'''ZxAnPhOrIaN:'''  Wow! I created a lot of ideas!

'''ProjectX:''' Must be a first, he he, only joking Zxan

----

[[:Category:Legacy To Do]] – needs input

----

'''ZxAnPhOrIaN:''' Admin, could you please delete this page, seems like custom bb scripting is not a hot idea.

'''Tarquin:''' well, with Maya &amp; all that ... Yup, I'll delete it in a bit.

'''ZxAnPhOrIaN:''' What is Maya anyway??
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Custom Mover</title>
    <id>746</id>
    <revision>
      <id>2137</id>
      <timestamp>2005-12-18T01:05:28Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:UT|UT]] has several subclasses of [[Legacy:Mover|Mover]] that did various things. [[Legacy:UT2003|UT2003]] has just the Mover class.

It's possible to script custom movers in UnrealEd 3, just as it was in  [[Legacy:UnrealEd 2|UnrealEd 2]]. Whether they are actually required or not &amp;ndash; that's another question: watch this space! :D

==Creating==

You need to write a script yourself, compile it and put it in the ini file as an EditPackage (same as custom brushbuilders).

To add a mover of a custom class:
# select a [[Legacy:Static Mesh|static mesh]] resource in the browser
# right-click the mover [[Legacy:Toolbox|toolbox]] button
# select the class

==Scripts==

''this would be a good place to post scripts...''
* [[Legacy:VariableTimedMover|VariableTimedMover]]

==Related Topics==
* [[Legacy:Scripting Movers|Scripting Movers]]

==Discussion==

'''SuperApe:''' Perhaps this needs a to be merged with Scripting Movers?</text>
    </revision>
    <revision>
      <id>2138</id>
      <timestamp>2004-11-08T02:09:53Z</timestamp>
      <contributor>
        <ip>CPE-144-137-208-169.sa.bigpond.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:UT|UT]] has several subclasses of [[Legacy:Mover|Mover]] that did various things. [[Legacy:UT2003|UT2003]] has just the Mover class.

It's possible to script custom movers in UnrealEd 3, just as it was in  [[Legacy:UnrealEd 2|UnrealEd 2]]. Whether they are actually required or not &amp;ndash; that's another question: watch this space! :D

==Creating ==

You need to write a script yourself, compile it and put it in the ini file as an EditPackage (same as custom brushbuilders).

To add a mover of a custom class:
# select a [[Legacy:Static Mesh|static mesh]] resource in the browser
# right-click the mover [[Legacy:Toolbox|toolbox]] button
# select the class

==Scripts ==

''this would be a good place to post scripts...''

  .</text>
    </revision>
    <revision>
      <id>2139</id>
      <timestamp>2004-11-08T04:28:38Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>use the sandbox please</comment>
      <text xml:space="preserve">[[Legacy:UT|UT]] has several subclasses of [[Legacy:Mover|Mover]] that did various things. [[Legacy:UT2003|UT2003]] has just the Mover class.

It's possible to script custom movers in UnrealEd 3, just as it was in  [[Legacy:UnrealEd 2|UnrealEd 2]]. Whether they are actually required or not &amp;ndash; that's another question: watch this space! :D

==Creating ==

You need to write a script yourself, compile it and put it in the ini file as an EditPackage (same as custom brushbuilders).

To add a mover of a custom class:
# select a [[Legacy:Static Mesh|static mesh]] resource in the browser
# right-click the mover [[Legacy:Toolbox|toolbox]] button
# select the class

==Scripts ==

''this would be a good place to post scripts...''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Custom Textures</title>
    <id>910</id>
    <revision>
      <id>2502</id>
      <timestamp>2006-05-11T03:22:24Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For all of you out there who are too lazy to make/google textures:

List of links to websites containing textures for use in maps. Devided into catagories based upon possible usage.

Sites can always be googled, but of course alot of junk turns up, and this page is an attempt to sort through that, and list sites known from experiance.

----

==='''''WARNING:'''''===

'''REMEMBER: If you want to use any of these textures in your map, check the website's policy on using and distributing them. Using the textures in your map, and then putting your map up for download on [http://filefront.com FileFront] or another website COUNTS AS DISTRIBUTION.'''

*''' Some websites will let you use and distribute the textures however you wish.'''

*''' Some will let you use/distribute the textures so long as you do not do so for a commercial purpose, i.e. sell them.'''

*''' Some websites will let you do the above so long as you indicate the source/creator of your texture in the distribution medium, i.e. your map. This means you should cite your sources in your readme.'''

*'''If the provided info about the texture contains a name, most likely the name belongs to the texture's creator. You should give them credit in your readme.'''

'''Websites that sell textures are more leniant with thier distribution policies. '''

'''Always read the website's policy for distributing there textures, and '''''give credit where credit is due.''''' '''

----

====Columns====

* Name - Link to site.

* Description - What the textures could be useful for. I.E. base textures, skyboxes, inspirations for static meshes, they could be turned into static mesh skins, etc.

* 2&lt;sup&gt;x&lt;/sup&gt; - Textures are compatable with Unreal Engines limitation to texture dimensions being powers of 2.

* Tiled - Some or all of the textures are seamless tiling textures.

* Catagorized - The textures are devided up into catagories.

* Many - The site contains A large assortment of textures to choose from.

* Subscribe - Requires you to subscribe before you can access the textures. Of course, they give you thumbnail teasers ;)

* Free - Weather or not the textures cost money.

* Policy - link to info about usage policy (see warning above)

==The List==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |Name
| style=&quot;text-align: center&quot; |Description
| style=&quot;text-align: center&quot; |2&lt;sup&gt;x&lt;/sup&gt;
| style=&quot;text-align: center&quot; |Tiled
| style=&quot;text-align: center&quot; |Catagorized
| style=&quot;text-align: center&quot; |Many
| style=&quot;text-align: center&quot; |Subscribe
| style=&quot;text-align: center&quot; |Free
| style=&quot;text-align: center&quot; |Policy 
|-
|[http://http://www.3dcafe.com/ 3D Cafe
|Nearly all imaginable catagories. Some are very large. Site also has free models.
|Some
|Some
|Yes
|Yes
|No
|Some
|[http://www.3dcafe.com/wrapper/ Policy]
|-
|[http://www.freeseamlesstextures.com/texture_gallery/index.htm Free Seamless Textures
|Base textures, various sizes
|Yes
|No
|All
|No
|No
|Yes
|[http://www.freeseamlesstextures.com/texture_terms/index.htm Policy]
|-
|[http://www.environment-textures.com/ Environmental Textures
|Mostly photographs, some graphity, some skys and ground
|No
|No
|Yes
|Yes
|Yes
|Yes
|[http://www.environment-textures.com/ET.com_license.doc] Policy (as MS-Word .doc)
|-
|[http://www.turbosquid.com/Search/Index.cfm/FuseAction/ProcessSmartSearch/intMediaType/3/stgType/Free Turbo Squid
|Everything you could possibly imagine, from sky to plants to architecture. Some are very large. Free models
|Some
|Some
|Yes + Search
|&gt; 10,000!1
|No
|Some
|[http://www.turbosquid.com/OneOff/EULA.cfm Policy]
|-
|[http://www.m3corp.com/a/download/3d_textures/pages/index.htm 3D Millennium]
|Good textures. Wood, Leather, Shadow Projection Maps(?) All have thier own bump maps!!!
|Yes
|Yes
|Yes
|fair amount
|No
|Yes
|On the same page
|-
|[http://www.allin3d.com/ All In 3D]
|Good variety, clouds, metal, water, bump maps, the front of an air conditioner
|Some
|Some
|Yes
|Fair amount
|No
|Yes
|[http://www.allin3d.com/license.html Policy]
|-
|[http://www.allegorithmic.com/libraries/list.php?mask=textures Allegorithmic]
|'''Very cool materials!''' Contains everything necessary to make a complete shader. i.e. specular, reflectivity, opacity, bump, diffuse, displacement maps!!!! also effect filters
|2048&lt;sup&gt;2&lt;/sup&gt;
|All
|Yes
|Yes
|No
|Yes?
|?
|}

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture_Package|Texture_Package]] - Default textures included in [[Legacy:UT2004|UT2004]].
* [[Legacy:Texture_Package_(UT)|Texture_Package_(UT)]] - Default textures included in [[Legacy:Unreal_Tournament|UT99]].
* [[:Category:Legacy Basic Procedure]] - [[Legacy:Category_Tutorial|Tutorials]]:
** [[Legacy:Create A Material|Create A Material]]
** [[Legacy:Apply_Texture|Apply_Texture]]

[[:Category:Legacy Mapping]]

===Discussion:===

'''Bob_The_Beheader:''' O.K. Not to many links now but I'm gonna keep adding them.

'''EricBlade:''' Bob, you seem very excited about these shader thingees.  Care to write up a tutorial for those of us who know nothing about them?

'''Bob_The_Beheader:''' Sorry I meant materials. see [[Legacy:Creating_A_Material|Creating_A_Material]].

'''EricBlade:''' OK, how about something specific on what all these technical terms are? :D
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2503</id>
      <timestamp>2006-05-10T23:29:57Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">For all of you out there who are too lazy to make/google textures:

List of links to websites containing textures for use in maps. Devided into catagories based upon possible usage.

Sites can always be googled, but of course alot of junk turns up, and this page is an attempt to sort through that, and list sites known from experiance.

----

==='''''WARNING:'''''===

'''REMEMBER: If you want to use any of these textures in your map, check the website's policy on using and distributing them. Using the textures in your map, and then putting your map up for download on [http://filefront.com FileFront] or another website COUNTS AS DISTRIBUTION.'''

*''' Some websites will let you use and distribute the textures however you wish.'''

*''' Some will let you use/distribute the textures so long as you do not do so for a commercial purpose, i.e. sell them.'''

*''' Some websites will let you do the above so long as you indicate the source/creator of your texture in the distribution medium, i.e. your map. This means you should cite your sources in your readme.'''

*'''If the provided info about the texture contains a name, most likely the name belongs to the texture's creator. You should give them credit in your readme.'''

'''Websites that sell textures are more leniant with thier distribution policies. '''

'''Always read the website's policy for distributing there textures, and '''''give credit where credit is due.''''' '''

----

====Columns====

* Name - Link to site.

* Description - What the textures could be useful for. I.E. base textures, skyboxes, inspirations for static meshes, they could be turned into static mesh skins, etc.

* 2&lt;sup&gt;x&lt;/sup&gt; - Textures are compatable with Unreal Engines limitation to texture dimensions being powers of 2.

* Tiled - Some or all of the textures are seamless tiling textures.

* Catagorized - The textures are devided up into catagories.

* Many - The site contains A large assortment of textures to choose from.

* Subscribe - Requires you to subscribe before you can access the textures. Of course, they give you thumbnail teasers ;)

* Free - Weather or not the textures cost money.

* Policy - link to info about usage policy (see warning above)

==The List==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |Name
| style=&quot;text-align: center&quot; |Description
| style=&quot;text-align: center&quot; |2&lt;sup&gt;x&lt;/sup&gt;
| style=&quot;text-align: center&quot; |Tiled
| style=&quot;text-align: center&quot; |Catagorized
| style=&quot;text-align: center&quot; |Many
| style=&quot;text-align: center&quot; |Subscribe
| style=&quot;text-align: center&quot; |Free
| style=&quot;text-align: center&quot; |Policy 
|-
|[http://http://www.3dcafe.com/ 3D Cafe
|Nearly all imaginable catagories. Some are very large. Site also has free models.
|Some
|Some
|Yes
|Yes
|No
|Some
|[http://www.3dcafe.com/wrapper/ Policy]
|-
|[http://www.freeseamlesstextures.com/texture_gallery/index.htm Free Seamless Textures
|Base textures, various sizes
|Yes
|No
|All
|No
|No
|Yes
|[http://www.freeseamlesstextures.com/texture_terms/index.htm Policy]
|-
|[http://www.environment-textures.com/ Environmental Textures
|Mostly photographs, some graphity, some skys and ground
|No
|No
|Yes
|Yes
|Yes
|Yes
|[http://www.environment-textures.com/ET.com_license.doc] Policy (as MS-Word .doc)
|-
|[http://www.turbosquid.com/Search/Index.cfm/FuseAction/ProcessSmartSearch/intMediaType/3/stgType/Free Turbo Squid
|Everything you could possibly imagine, from sky to plants to architecture. Some are very large. Free models
|Some
|Some
|Yes + Search
|&gt; 10,000!1
|No
|Some
|[http://www.turbosquid.com/OneOff/EULA.cfm Policy]
|-
|[http://www.m3corp.com/a/download/3d_textures/pages/index.htm 3D Millennium]
|Good textures. Wood, Leather, Shadow Projection Maps(?) All have thier own bump maps!!!
|Yes
|Yes
|Yes
|fair amount
|No
|Yes
|On the same page
|-
|[http://www.allin3d.com/ All In 3D]
|Good variety, clouds, metal, water, bump maps, the front of an air conditioner
|Some
|Some
|Yes
|Fair amount
|No
|Yes
|[http://www.allin3d.com/license.html Policy]
|-
|[http://www.allegorithmic.com/libraries/list.php?mask=textures Allegorithmic]
|'''Very cool materials!''' Contains everything necessary to make a complete shader. i.e. specular, reflectivity, opacity, bump, diffuse, displacement maps!!!! also effect filters
|2048&lt;sup&gt;2&lt;/sup&gt;
|All
|Yes
|Yes
|No
|Yes?
|?
|}

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture_Package|Texture_Package]] - Default textures included in [[Legacy:UT2004|UT2004]].
* [[Legacy:Texture_Package_(UT)|Texture_Package_(UT)]] - Default textures included in [[Legacy:Unreal_Tournament|UT99]].
* [[:Category:Legacy Basic Procedure]] - [[Legacy:Category_Tutorial|Tutorials]]:
** [[Legacy:Create A Material|Create A Material]]
** [[Legacy:Apply_Texture|Apply_Texture]]

[[:Category:Legacy Mapping]]

===Discussion:===

'''Bob_The_Beheader:''' O.K. Not to many links now but I'm gonna keep adding them.

'''EricBlade:''' Bob, you seem very excited about these shader thingees.  Care to write up a tutorial for those of us who know nothing about them?

'''Bob_The_Beheader:''' Sorry I meant materials. see [[Legacy:Creating_A_Material|Creating_A_Material]].
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34528</id>
      <timestamp>2009-07-08T09:29:04Z</timestamp>
      <contributor>
        <ip>86.139.126.209</ip>
      </contributor>
      <comment>/* Columns */</comment>
      <text xml:space="preserve">For all of you out there who are too lazy to make/google textures:

List of links to websites containing textures for use in maps. Devided into catagories based upon possible usage.

Sites can always be googled, but of course alot of junk turns up, and this page is an attempt to sort through that, and list sites known from experiance.

----

==='''''WARNING:'''''===

'''REMEMBER: If you want to use any of these textures in your map, check the website's policy on using and distributing them. Using the textures in your map, and then putting your map up for download on [http://filefront.com FileFront] or another website COUNTS AS DISTRIBUTION.'''

*''' Some websites will let you use and distribute the textures however you wish.'''

*''' Some will let you use/distribute the textures so long as you do not do so for a commercial purpose, i.e. sell them.'''

*''' Some websites will let you do the above so long as you indicate the source/creator of your texture in the distribution medium, i.e. your map. This means you should cite your sources in your readme.'''

*'''If the provided info about the texture contains a name, most likely the name belongs to the texture's creator. You should give them credit in your readme.'''

'''Websites that sell textures are more leniant with thier distribution policies. '''

'''Always read the website's policy for distributing there textures, and '''''give credit where credit is due.''''' '''

----

====Columns====

* Name - Link to site.

* Description - What the textures could be useful for. I.E. base textures, skyboxes, inspirations for static meshes, they could be turned into static mesh skins, etc.

* 2&lt;sup&gt;x&lt;/sup&gt; - Textures are compatible with the Unreal Engine's limitation to texture dimensions being powers of 2.

* Tiled - Some or all of the textures are seamless tiling textures.

* Catagorized - The textures are divided up into catagories.

* Many - The site contains a large assortment of textures to choose from.

* Subscribe - Requires you to subscribe before you can access the textures. Of course, they give you thumbnail teasers.

* Free - Whether or not the textures cost money.

* Policy - Link to info about usage policy (see warning above).

==The List==

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |Name
| style=&quot;text-align: center&quot; |Description
| style=&quot;text-align: center&quot; |2&lt;sup&gt;x&lt;/sup&gt;
| style=&quot;text-align: center&quot; |Tiled
| style=&quot;text-align: center&quot; |Catagorized
| style=&quot;text-align: center&quot; |Many
| style=&quot;text-align: center&quot; |Subscribe
| style=&quot;text-align: center&quot; |Free
| style=&quot;text-align: center&quot; |Policy 
|-
|[http://http://www.3dcafe.com/ 3D Cafe
|Nearly all imaginable catagories. Some are very large. Site also has free models.
|Some
|Some
|Yes
|Yes
|No
|Some
|[http://www.3dcafe.com/wrapper/ Policy]
|-
|[http://www.freeseamlesstextures.com/texture_gallery/index.htm Free Seamless Textures
|Base textures, various sizes
|Yes
|No
|All
|No
|No
|Yes
|[http://www.freeseamlesstextures.com/texture_terms/index.htm Policy]
|-
|[http://www.environment-textures.com/ Environmental Textures
|Mostly photographs, some graphity, some skys and ground
|No
|No
|Yes
|Yes
|Yes
|Yes
|[http://www.environment-textures.com/ET.com_license.doc] Policy (as MS-Word .doc)
|-
|[http://www.turbosquid.com/Search/Index.cfm/FuseAction/ProcessSmartSearch/intMediaType/3/stgType/Free Turbo Squid
|Everything you could possibly imagine, from sky to plants to architecture. Some are very large. Free models
|Some
|Some
|Yes + Search
|&gt; 10,000!1
|No
|Some
|[http://www.turbosquid.com/OneOff/EULA.cfm Policy]
|-
|[http://www.m3corp.com/a/download/3d_textures/pages/index.htm 3D Millennium]
|Good textures. Wood, Leather, Shadow Projection Maps(?) All have thier own bump maps!!!
|Yes
|Yes
|Yes
|fair amount
|No
|Yes
|On the same page
|-
|[http://www.allin3d.com/ All In 3D]
|Good variety, clouds, metal, water, bump maps, the front of an air conditioner
|Some
|Some
|Yes
|Fair amount
|No
|Yes
|[http://www.allin3d.com/license.html Policy]
|-
|[http://www.allegorithmic.com/libraries/list.php?mask=textures Allegorithmic]
|'''Very cool materials!''' Contains everything necessary to make a complete shader. i.e. specular, reflectivity, opacity, bump, diffuse, displacement maps!!!! also effect filters
|2048&lt;sup&gt;2&lt;/sup&gt;
|All
|Yes
|Yes
|No
|Yes?
|?
|}

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture_Package|Texture_Package]] - Default textures included in [[Legacy:UT2004|UT2004]].
* [[Legacy:Texture_Package_(UT)|Texture_Package_(UT)]] - Default textures included in [[Legacy:Unreal_Tournament|UT99]].
* [[:Category:Legacy Basic Procedure]] - [[Legacy:Category_Tutorial|Tutorials]]:
** [[Legacy:Create A Material|Create A Material]]
** [[Legacy:Apply_Texture|Apply_Texture]]

[[:Category:Legacy Mapping]]

===Discussion:===

'''Bob_The_Beheader:''' O.K. Not to many links now but I'm gonna keep adding them.

'''EricBlade:''' Bob, you seem very excited about these shader thingees.  Care to write up a tutorial for those of us who know nothing about them?

'''Bob_The_Beheader:''' Sorry I meant materials. see [[Legacy:Creating_A_Material|Creating_A_Material]].

'''EricBlade:''' OK, how about something specific on what all these technical terms are? :D
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Custom Toolbox Buttons</title>
    <id>715</id>
    <revision>
      <id>2069</id>
      <timestamp>2005-12-29T02:24:27Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_Custom_Toolbox.gif|right|]]

The last group of buttons on the [[Legacy:Toolbox|toolbox]] of the [[Legacy:UnrealEd Interface|UnrealEd interface]] is for user-defined buttons. These are simply aliases to [[Legacy:UnrealEd Console|UnrealEd Console]] commands, so they're fairly limited in scope.

These are defined in [[Legacy:UnrealEd.Ini|UnrealEd.ini]].

==Custom Toolbox Syntax==
;[UserDefinedGroup] : The name of the section located in UnrealEd.ini
;NumButtons : the count of all the user-defined buttons
;ButtonX = Hint , Bitmap , Command
: '''''X''''' - begins with 0, then 1,2,3 and so on
: '''''Hint''''' - the text if mouse cursor over the button
: '''''Bitmap''''' - the bitmap filename without extension (must be stored in System\EditorRes)
: '''''Command''''' UnrealEd Engine Command (see [[Legacy:UnrealEd_2_Console|UnrealEd_2_Console]])

==Example==

This can be added if not exists or be changed in UnrealEd.ini. This example is only used in UnrealED by a default UT2003/UT2004 installation.

&lt;uscript&gt;
[UserDefinedGroup]
NumButtons=6
Button0=Mirror X,MirrorX,Actor Mirror X=-1
Button1=Mirror Y,MirrorY,Actor Mirror Y=-1
Button2=Mirror Z,MirrorZ,Actor Mirror Z=-1
Button3=Select All Inside,SelectInside,Actor Select Inside
Button4=Clip Z in WireFrame,ClipZ,Actor Clip Z
Button5=Align view on Actor,CameraAlign,Camera Align
&lt;/uscript&gt;

==Utilities ==

[[Legacy:Toolbar Creator|Toolbar Creator]] is a handy application that sets up custom buttons for you.

==Packs ==

A number of packs fo useful buttons are available on the web:

* Fordy's Pack: http://www.planetunreal.com/fordy/uedbuttons.htm

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]
* [[Legacy:Toolbox|Toolbox]]
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2070</id>
      <timestamp>2005-01-17T16:53:58Z</timestamp>
      <contributor>
        <ip>Jan</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The last group of buttons on the [[Legacy:Toolbox|toolbox]] of the [[Legacy:UnrealEd Interface|UnrealEd interface]] is for user-defined buttons. These are simply aliases to [[Legacy:UnrealEd Console|UnrealEd Console]] commands, so they're fairly limited in scope.

These are defined in [[Legacy:UnrealEd.Ini|UnrealEd.ini]].

==Custom Toolbox Syntax==
;[UserDefinedGroup] : The name of the section located in UnrealEd.ini
;NumButtons : the count of all the user-defined buttons
;ButtonX = Hint , Bitmap , Command
: '''''X''''' - begins with 0, then 1,2,3 and so on
: '''''Hint''''' - the text if mouse cursor over the button
: '''''Bitmap''''' - the bitmap filename without extension (stored in System\EditorRes)
: '''''Command''''' UnrealEd Engine Command (see [[Legacy:UnrealEd_2_Console|UnrealEd_2_Console]])

==Example==

This can be added if not exists or be changed in UnrealEd.ini. This example is only used in UnrealED by a default UT2003/UT2004 installation.

&lt;uscript&gt;
[UserDefinedGroup]
NumButtons=6
Button0=Mirror X,MirrorX,Actor Mirror X=-1
Button1=Mirror Y,MirrorY,Actor Mirror Y=-1
Button2=Mirror Z,MirrorZ,Actor Mirror Z=-1
Button3=Select All Inside,SelectInside,Actor Select Inside
Button4=Clip Z in WireFrame,ClipZ,Actor Clip Z
Button5=Align view on Actor,CameraAlign,Camera Align
&lt;/uscript&gt;

==Utilities ==

[[Legacy:Toolbar Creator|Toolbar Creator]] is a handy application that sets up custom buttons for you.

==Packs ==

A number of packs fo useful buttons are available on the web:

* Fordy's Pack: http://www.planetunreal.com/fordy/uedbuttons.htm

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2071</id>
      <timestamp>2005-01-17T17:00:47Z</timestamp>
      <contributor>
        <ip>Jan</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_Custom_Toolbox.gif|right|]]

The last group of buttons on the [[Legacy:Toolbox|toolbox]] of the [[Legacy:UnrealEd Interface|UnrealEd interface]] is for user-defined buttons. These are simply aliases to [[Legacy:UnrealEd Console|UnrealEd Console]] commands, so they're fairly limited in scope.

These are defined in [[Legacy:UnrealEd.Ini|UnrealEd.ini]].

==Custom Toolbox Syntax==
;[UserDefinedGroup] : The name of the section located in UnrealEd.ini
;NumButtons : the count of all the user-defined buttons
;ButtonX = Hint , Bitmap , Command
: '''''X''''' - begins with 0, then 1,2,3 and so on
: '''''Hint''''' - the text if mouse cursor over the button
: '''''Bitmap''''' - the bitmap filename without extension (must be stored in System\EditorRes)
: '''''Command''''' UnrealEd Engine Command (see [[Legacy:UnrealEd_2_Console|UnrealEd_2_Console]])

==Example==

This can be added if not exists or be changed in UnrealEd.ini. This example is only used in UnrealED by a default UT2003/UT2004 installation.

&lt;uscript&gt;
[UserDefinedGroup]
NumButtons=6
Button0=Mirror X,MirrorX,Actor Mirror X=-1
Button1=Mirror Y,MirrorY,Actor Mirror Y=-1
Button2=Mirror Z,MirrorZ,Actor Mirror Z=-1
Button3=Select All Inside,SelectInside,Actor Select Inside
Button4=Clip Z in WireFrame,ClipZ,Actor Clip Z
Button5=Align view on Actor,CameraAlign,Camera Align
&lt;/uscript&gt;

==Utilities ==

[[Legacy:Toolbar Creator|Toolbar Creator]] is a handy application that sets up custom buttons for you.

==Packs ==

A number of packs fo useful buttons are available on the web:

* Fordy's Pack: http://www.planetunreal.com/fordy/uedbuttons.htm

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CustomRoundRobin</title>
    <id>902</id>
    <revision>
      <id>2488</id>
      <timestamp>2007-11-18T22:04:45Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Custom Round Robin=

For Use In UT2004/03 Code and Maps.

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; MythCustomRoundRobin}}

==Description==

Just a simple script to help mappers and coders out.  A One time use 'RoundRobin' that goes down the list in it's Dynamic array and triggers off all the events during the specified timeinterval.

==The Script==

&lt;uscript&gt;
/* A Simple Custom Round Robin Created By Dalin 'MythOpus' Seivewright.
   This RoundRobin has a one time use only however but it can be set up
   to do a mass chain of triggering.  Use As Needed :D
   If you want, you could always state who wrote it... but if you'd rather not
   At least state that you got it from 
   THE UNREAL WIKI! = wiki.beyondunreal.com */



class MythCustomRoundRobin extends Actor
placeable;

var() array&lt;name&gt; Targets; //The things you wish to trigger (it's a dynamic array)
var() float TriggerSeconds; //The number of seconds between each triggering

var bool bTriggered; //Internally Set Bool (Ignore It)

function PostBeginPlay()
{
  SetTimer(TriggerSeconds, TRUE);
}

simulated function Timer()
{
        
        //If this RoundRobin has been triggered and the dynamic array's lenght is not 0
        if((bTriggered) &amp;&amp; (Targets.Length != 0) )
        {
          TriggerEvent(Targets[0], self, None); //Always trigger the first item in the array
          Targets.Remove(0,1); //remove the item that has just been triggered
        }
        else if(Targets.Length == 0)
        {
          SetTimer(0.0, FALSE); //If there is nothing left in the dynamic array.. just disable the timer.
        }
}

simulated function Trigger( Actor Other, Pawn EventInstigator )
{

     //When this actor is triggered, it will set bTriggered as true so the timer can
     //Trigger all it's targets and remove them from the array.
       bTriggered = TRUE;
}
&lt;/uscript&gt;

==Comments==

'''El Muerte:''' isn't something like the following more useful (you can use it more than once and stuff like it). It combines both the roundrobin trigger and your relationaltrigger

&lt;uscript&gt;
/* 
	RoundRobinTrigger, based on MythCustomRoundRobin by Dalin 'MythOpus' Seivewright.
	http://wiki.beyondunreal.com/wiki/CustomRoundRobin
*/

class RoundRobinTrigger extends Info placeable;

/** The things you wish to trigger (it's a dynamic array) */
var() array&lt;name&gt; Targets;
/** The number of seconds between each triggering */
var() float TriggerSeconds;

/** all targets will be triggered after eachother, with TriggerSeconds being the interval. Otherwise the targets will be subsequently triggered when triggered */
var() bool TimedTrigger;

/** current index in the targets to trigger */
var int TriggerIndex;

function Reset()
{
	if (TimedTrigger) SetTimer(0.0, false);
	TriggerIndex = 0;
}

event Timer()
{        
	if (TriggerIndex &lt; Targets.length) TriggerNext();
	else Reset();
}

function TriggerNext()
{
	TriggerEvent(Targets[TriggerIndex++], self, None);
}

function Trigger( Actor Other, Pawn EventInstigator )
{
	if (TimedTrigger) SetTimer(TriggerSeconds, true);
	else Timer(); // call timer just once
}
&lt;/uscript&gt;

'''Wormbo:''' Did you know you could build these from [[Legacy:ScriptedTrigger|ScriptedTrigger]]s as well?

'''MythOpus:'''  I realize that you can now :D  But I hate scripted triggers as they take so long for me to set up.  I'm lazy.

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2489</id>
      <timestamp>2005-07-28T01:09:28Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>response</comment>
      <text xml:space="preserve">=Custom Round Robin=

For Use In UT2004/03 Code and Maps.

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; MythCustomRoundRobin}}

==Description==

Just a simple script to help mappers and coders out.  A One time use 'RoundRobin' that goes down the list in it's Dynamic array and triggers off all the events during the specified timeinterval.

==The Script==

&lt;uscript&gt;
/* A Simple Custom Round Robin Created By Dalin 'MythOpus' Seivewright.
   This RoundRobin has a one time use only however but it can be set up
   to do a mass chain of triggering.  Use As Needed :D
   If you want, you could always state who wrote it... but if you'd rather not
   At least state that you got it from 
   THE UNREAL WIKI! = wiki.beyondunreal.com */



class MythCustomRoundRobin extends Actor
placeable;

var() array&lt;name&gt; Targets; //The things you wish to trigger (it's a dynamic array)
var() float TriggerSeconds; //The number of seconds between each triggering

var bool bTriggered; //Internally Set Bool (Ignore It)

function PostBeginPlay()
{
  SetTimer(TriggerSeconds, TRUE);
}

simulated function Timer()
{
        
        //If this RoundRobin has been triggered and the dynamic array's lenght is not 0
        if((bTriggered) &amp;&amp; (Targets.Length != 0) )
        {
          TriggerEvent(Targets[0], self, None); //Always trigger the first item in the array
          Targets.Remove(0,1); //remove the item that has just been triggered
        }
        else if(Targets.Length == 0)
        {
          SetTimer(0.0, FALSE); //If there is nothing left in the dynamic array.. just disable the timer.
        }
}

simulated function Trigger( Actor Other, Pawn EventInstigator )
{

     //When this actor is triggered, it will set bTriggered as true so the timer can
     //Trigger all it's targets and remove them from the array.
       bTriggered = TRUE;
}
&lt;/uscript&gt;

==Comments==

'''El Muerte:''' isn't something like the following more useful (you can use it more than once and stuff like it). It combines both the roundrobin trigger and your relationaltrigger

&lt;uscript&gt;
/* 
	RoundRobinTrigger, based on MythCustomRoundRobin by Dalin 'MythOpus' Seivewright.
	http://wiki.beyondunreal.com/wiki/CustomRoundRobin
*/

class RoundRobinTrigger extends Info placeable;

/** The things you wish to trigger (it's a dynamic array) */
var() array&lt;name&gt; Targets;
/** The number of seconds between each triggering */
var() float TriggerSeconds;

/** all targets will be triggered after eachother, with TriggerSeconds being the interval. Otherwise the targets will be subsequently triggered when triggered */
var() bool TimedTrigger;

/** current index in the targets to trigger */
var int TriggerIndex;

function Reset()
{
	if (TimedTrigger) SetTimer(0.0, false);
	TriggerIndex = 0;
}

event Timer()
{        
	if (TriggerIndex &lt; Targets.length) TriggerNext();
	else Reset();
}

function TriggerNext()
{
	TriggerEvent(Targets[TriggerIndex++], self, None);
}

function Trigger( Actor Other, Pawn EventInstigator )
{
	if (TimedTrigger) SetTimer(TriggerSeconds, true);
	else Timer(); // call timer just once
}
&lt;/uscript&gt;

'''MythOpus:''' Well, I learn something everyday :D Yes that would be more useful.  I did not know that you could increment like how you did though.  Targets[TriggerIndex++] :D  Perhaps we should make another page called &quot;Better Than Custom Round Robin Written By Dalin&quot; ?  :)

'''Wormbo:''' Did you know you could build these from [[Legacy:ScriptedTrigger|ScriptedTrigger]]s as well?

'''MythOpus:'''  I realize that you can now :D  But I hate scripted triggers as they take so long for me to set up.  I'm lazy.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2490</id>
      <timestamp>2007-11-18T22:04:31Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Custom Round Robin=

For Use In UT2004/03 Code and Maps.

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; MythCustomRoundRobin}}

==Description==

Just a simple script to help mappers and coders out.  A One time use 'RoundRobin' that goes down the list in it's Dynamic array and triggers off all the events during the specified timeinterval.

==The Script==

&lt;uscript&gt;
/* A Simple Custom Round Robin Created By Dalin 'MythOpus' Seivewright.
   This RoundRobin has a one time use only however but it can be set up
   to do a mass chain of triggering.  Use As Needed :D
   If you want, you could always state who wrote it... but if you'd rather not
   At least state that you got it from 
   THE UNREAL WIKI! = wiki.beyondunreal.com */



class MythCustomRoundRobin extends Actor
placeable;

var() array&lt;name&gt; Targets; //The things you wish to trigger (it's a dynamic array)
var() float TriggerSeconds; //The number of seconds between each triggering

var bool bTriggered; //Internally Set Bool (Ignore It)

function PostBeginPlay()
{
  SetTimer(TriggerSeconds, TRUE);
}

simulated function Timer()
{
        
        //If this RoundRobin has been triggered and the dynamic array's lenght is not 0
        if((bTriggered) &amp;&amp; (Targets.Length != 0) )
        {
          TriggerEvent(Targets[0], self, None); //Always trigger the first item in the array
          Targets.Remove(0,1); //remove the item that has just been triggered
        }
        else if(Targets.Length == 0)
        {
          SetTimer(0.0, FALSE); //If there is nothing left in the dynamic array.. just disable the timer.
        }
}

simulated function Trigger( Actor Other, Pawn EventInstigator )
{

     //When this actor is triggered, it will set bTriggered as true so the timer can
     //Trigger all it's targets and remove them from the array.
       bTriggered = TRUE;
}
&lt;/uscript&gt;

==Comments==

'''El Muerte:''' isn't something like the following more useful (you can use it more than once and stuff like it). It combines both the roundrobin trigger and your relationaltrigger

&lt;uscript&gt;
/* 
	RoundRobinTrigger, based on MythCustomRoundRobin by Dalin 'MythOpus' Seivewright.
	http://wiki.beyondunreal.com/wiki/CustomRoundRobin
*/

class RoundRobinTrigger extends Info placeable;

/** The things you wish to trigger (it's a dynamic array) */
var() array&lt;name&gt; Targets;
/** The number of seconds between each triggering */
var() float TriggerSeconds;

/** all targets will be triggered after eachother, with TriggerSeconds being the interval. Otherwise the targets will be subsequently triggered when triggered */
var() bool TimedTrigger;

/** current index in the targets to trigger */
var int TriggerIndex;

function Reset()
{
	if (TimedTrigger) SetTimer(0.0, false);
	TriggerIndex = 0;
}

event Timer()
{        
	if (TriggerIndex &lt; Targets.length) TriggerNext();
	else Reset();
}

function TriggerNext()
{
	TriggerEvent(Targets[TriggerIndex++], self, None);
}

function Trigger( Actor Other, Pawn EventInstigator )
{
	if (TimedTrigger) SetTimer(TriggerSeconds, true);
	else Timer(); // call timer just once
}
&lt;/uscript&gt;

'''Wormbo:''' Did you know you could build these from [[Legacy:ScriptedTrigger|ScriptedTrigger]]s as well?

'''MythOpus:'''  I realize that you can now :D  But I hate scripted triggers as they take so long for me to set up.  I'm lazy.

[[Category:Legacy Custom Class(UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Customising The Player View</title>
    <id>745</id>
    <revision>
      <id>2135</id>
      <timestamp>2006-09-18T06:02:41Z</timestamp>
      <contributor>
        <ip>Ppp22-161.lns2.syd7.internode.on.net</ip>
      </contributor>
      <comment>*fixed typo - 'section'</comment>
      <text xml:space="preserve">==Customising the Player View ==

Before we get into the real meat of how to fix the player views we need to understand the code that is already there.  Grasping the link between the posessed pawn (stored in the Pawn attribute) and the current view target (held in the ViewTarget attribute) is essential to obtaining the desired effects.  Before we go any further lets recap on a few of the attributes of the PlayerController.

; Pawn : This is the Pawn that the player has ''possessed''.  A possessed pawn is controlled by the player.  The pawn class occupied by the player makes callbacks to the PlayerController in use to determine what should happen when the player attempts to make the pawn perform an action (run forwards, change weapon etc).
; ViewTarget : The view target is used to determine what the player sees.  Nominally the view target is the actor displayed at the center of the current view.  The most important thing to remember about the view target is that it does not have to be the same object at the possessed pawn.
; Rotation : This is the rotation of the PlayerController class itself, as set by the SetRotation() function.  This is invariably set by the PlayerMove() functions of the PlayerController class.  This is used by the CalcBehindView() and CalcFirstPersonView() functions in the determination of the view rotation.

In order to set the player view to that of your chosing you will need to perform the following steps.
# Create a new game type class and reference your player controller within the ''PlayerControllerClassName'' property.
# Create a player controller class that will implement your shiny view.
# Override the ''PlayerCalcView()'' function in the player controller class to set the view you want.

===Create a Game Type Class ===

Assuming that your new game type is going to be based on a deathmatch game, you could use the following code.  The important thing to note is the mechanism by which the custom PlayerController class is referenced.

&lt;uscript&gt;
class ViewTestGame extends xDeathMatch;

DefaultProperties 
{
     PlayerControllerClassName=&quot;ViewTest.ViewTestPlayerController&quot; // This is the important line
}
&lt;/uscript&gt;

Simply save the code as /UT2003/ViewTest/Classes/ViewTestGame.uc and you should be well away.  You will also need to create a ViewTest.int file.

===Creating the Player Controller Class ===

This is where the real work is done.  Since we have already created our game class and named the player controller class we are going to create we had better keep the same name.  The following code will allow us to play around.

&lt;uscript&gt;
class ViewTestPlayerController extends xGame.xPlayer;
var Actor myTarget;
var bool  targetIsMyTarget;

// The player view is determined by this function.
function event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) {
  Super.PlayerCalcView( ViewActor, CameraLocation, CameraRotation );
}

// Locates the dummy view target object set up on the map - in my case I used a blue flag decoration.
function PostBeginPlay() {
	local actor newTarget;
	Super.PostBeginPlay();
	foreach AllActors(class'Actor', newTarget, 'newView') {
		myTarget = newTarget;
		SetViewTarget( newTarget );
		break;
	}
}

// The following function allows us to switch between a view target of the player pawn and the dummy view target.
exec function ViewTest() {
	if ( targetIsMyTarget ) {
		SetViewTarget( myTarget );
	} else {
		SetViewTarget( Pawn );
	}
	targetIsMyTarget = !targetIsMyTarget;
}
&lt;/uscript&gt;

===Overriding the PlayerCalcView() Function ===

I'm not going to provide any code in here (well, maybe a bit) as setting the rotation and location of the view is as easy as setting the output variables CameraRotation and CameraLocation.  I will say that the purpose of the ViewActor output variable is still a bit of a mystery - but it might be there to support setting the view the player sees when the player has died or other similar function.  The following guidelines seem to hold true.
* In order to fix the view rotation and still allow the possessed pawn to be controlled you can set the CameraRotation to a fixed value and set the ViewTarget to the possessed pawn.
* It's generally better to use the Rotation property of the controller than either the Pawn.Rotation or ViewTarget.Rotation properties as this takes network issues into account.
* The ViewTarget can be any object of type Actor.
* The player can only possess Pawns 
* Explicitly set bBehindView to true to remove the floating player weapon (if it appears in thrid person view).

==Related Pages ==
* [[Legacy:PlayerController|PlayerController]] &amp;ndash; A discussion on Player Controllers and how to make them do what you want.

==Questions and Discussion ==

'''EntropicLqd:''' I realise that there is some duplication between this page and the [[Legacy:PlayerController|PlayerController]] page but I'll worry about that when I'm happy with the entire piece.  The information overload section isn't quite complete as I've not finished commenting the code.

==Information Overload Section ==

Here's a quick run down of some of the things I did while working out how it all worked.  A lot of it is fairly redundant, but nonetheless was somewhat amusing.

===A Quick Experiment ===

In order to explore the default behaviour of the ViewTarget and Pawn we shall created a small map with a single player start and a static decoration.  I gave the static decoration a tag of ''newView'' and placed it near the player start, facing it.  I then went on to create my own game type (called ViewTestGame), and my own player controller class.  The code is fairly self explanatory and shown above.

OK, if you can be bothered to repeat the experiment (or even if you can) here's what you'll find.

Prior to the game starting you'll see that the view is centered on the decoration.  This is because the PostBeingPlay() function sets the view target of the controller to be that of the decoration.  However, once in the game you'll be playing as normal and you'll be able to run around the map in both first person and third person (using the ''behindview'' console command) views.

When viewing the player from the first person, position your player such that the decoration is &quot;looking&quot; at you.  Then enter the command ''ViewTest'' at the console.  You should see the view change and with luck you'll be able to see your player.  If you can't see your player use the view test to toggle the view back to the first person perspectivew of your player and reposition yourself so you can be seen.  You should notice three things.
* You still have complete control over your player pawn, you can make him look up and down, run, jump, fire weapons, everything that you would normally be able to do.
* Your view into the world is completely fixed in the direction the decoration happens to be facing.  You cannot change the view at all (although altering the FOV will work).
* Not only can you see your player pawn, but you can also see the weapon your player currently has selected floating next to the player.  As the pawn moves around the weapon also moves around with it &amp;ndash; sort of.

Now switch to the third person perspective by entering ''behindview 1'' at the console.  You should notice the following things.
* Your view has pulled back slightly.
* The floating weapon has vanished into thin air.
* Your view now rotates as you look around with the mouse.
* You still have full normal control over the player pawn.

It's all interesting stuff as it gives us a basis for working through the code and figuring out what's going on.  The view the player sees is ultimately controlled by the ''PlayerCalcView()'' function.  Control this and you can make them look anywhere you want to.</text>
    </revision>
    <revision>
      <id>2136</id>
      <timestamp>2005-12-18T12:45:04Z</timestamp>
      <contributor>
        <ip>Cor3-ppp5061.per.dsl.connect.net.au</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Customising the Player View ==

Before we get into the real meat of how to fix the player views we need to understand the code that is already there.  Grasping the link between the posessed pawn (stored in the Pawn attribute) and the current view target (held in the ViewTarget attribute) is essential to obtaining the desired effects.  Before we go any further lets recap on a few of the attributes of the PlayerController.

; Pawn : This is the Pawn that the player has ''possessed''.  A possessed pawn is controlled by the player.  The pawn class occupied by the player makes callbacks to the PlayerController in use to determine what should happen when the player attempts to make the pawn perform an action (run forwards, change weapon etc).
; ViewTarget : The view target is used to determine what the player sees.  Nominally the view target is the actor displayed at the center of the current view.  The most important thing to remember about the view target is that it does not have to be the same object at the possessed pawn.
; Rotation : This is the rotation of the PlayerController class itself, as set by the SetRotation() function.  This is invariably set by the PlayerMove() functions of the PlayerController class.  This is used by the CalcBehindView() and CalcFirstPersonView() functions in the determination of the view rotation.

In order to set the player view to that of your chosing you will need to perform the following steps.
# Create a new game type class and reference your player controller within the ''PlayerControllerClassName'' property.
# Create a player controller class that will implement your shiny view.
# Override the ''PlayerCalcView()'' function in the player controller class to set the view you want.

===Create a Game Type Class ===

Assuming that your new game type is going to be based on a deathmatch game, you could use the following code.  The important thing to note is the mechanism by which the custom PlayerController class is referenced.

&lt;uscript&gt;
class ViewTestGame extends xDeathMatch;

DefaultProperties 
{
     PlayerControllerClassName=&quot;ViewTest.ViewTestPlayerController&quot; // This is the important line
}
&lt;/uscript&gt;

Simply save the code as /UT2003/ViewTest/Classes/ViewTestGame.uc and you should be well away.  You will also need to create a ViewTest.int file.

===Creating the Player Controller Class ===

This is where the real work is done.  Since we have already created our game class and named the player controller class we are going to create we had better keep the same name.  The following code will allow us to play around.

&lt;uscript&gt;
class ViewTestPlayerController extends xGame.xPlayer;
var Actor myTarget;
var bool  targetIsMyTarget;

// The player view is determined by this function.
function event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) {
  Super.PlayerCalcView( ViewActor, CameraLocation, CameraRotation );
}

// Locates the dummy view target object set up on the map - in my case I used a blue flag decoration.
function PostBeginPlay() {
	local actor newTarget;
	Super.PostBeginPlay();
	foreach AllActors(class'Actor', newTarget, 'newView') {
		myTarget = newTarget;
		SetViewTarget( newTarget );
		break;
	}
}

// The following function allows us to switch between a view target of the player pawn and the dummy view target.
exec function ViewTest() {
	if ( targetIsMyTarget ) {
		SetViewTarget( myTarget );
	} else {
		SetViewTarget( Pawn );
	}
	targetIsMyTarget = !targetIsMyTarget;
}
&lt;/uscript&gt;

===Overriding the PlayerCalcView() Function ===

I'm not going to provide any code in here (well, maybe a bit) as setting the rotation and location of the view is as easy as setting the output variables CameraRotation and CameraLocation.  I will say that the purpose of the ViewActor output variable is still a bit of a mystery - but it might be there to support setting the view the player sees when the player has died or other similar function.  The following guidelines seem to hold true.
* In order to fix the view rotation and still allow the possessed pawn to be controlled you can set the CameraRotation to a fixed value and set the ViewTarget to the possessed pawn.
* It's generally better to use the Rotation property of the controller than either the Pawn.Rotation or ViewTarget.Rotation properties as this takes network issues into account.
* The ViewTarget can be any object of type Actor.
* The player can only possess Pawns 
* Explicitly set bBehindView to true to remove the floating player weapon (if it appears in thrid person view).

==Related Pages ==
* [[Legacy:PlayerController|PlayerController]] &amp;ndash; A discussion on Player Controllers and how to make them do what you want.

==Questions and Discussion ==

'''EntropicLqd:''' I realise that there is some duplication between this page and the [[Legacy:PlayerController|PlayerController]] page but I'll worry about that when I'm happy with the entire piece.  The information overload sectino isn't quite complete as I've not finished commenting the code.

==Information Overload Section ==

Here's a quick run down of some of the things I did while working out how it all worked.  A lot of it is fairly redundant, but nonetheless was somewhat amusing.

===A Quick Experiment ===

In order to explore the default behaviour of the ViewTarget and Pawn we shall created a small map with a single player start and a static decoration.  I gave the static decoration a tag of ''newView'' and placed it near the player start, facing it.  I then went on to create my own game type (called ViewTestGame), and my own player controller class.  The code is fairly self explanatory and shown above.

OK, if you can be bothered to repeat the experiment (or even if you can) here's what you'll find.

Prior to the game starting you'll see that the view is centered on the decoration.  This is because the PostBeingPlay() function sets the view target of the controller to be that of the decoration.  However, once in the game you'll be playing as normal and you'll be able to run around the map in both first person and third person (using the ''behindview'' console command) views.

When viewing the player from the first person, position your player such that the decoration is &quot;looking&quot; at you.  Then enter the command ''ViewTest'' at the console.  You should see the view change and with luck you'll be able to see your player.  If you can't see your player use the view test to toggle the view back to the first person perspectivew of your player and reposition yourself so you can be seen.  You should notice three things.
* You still have complete control over your player pawn, you can make him look up and down, run, jump, fire weapons, everything that you would normally be able to do.
* Your view into the world is completely fixed in the direction the decoration happens to be facing.  You cannot change the view at all (although altering the FOV will work).
* Not only can you see your player pawn, but you can also see the weapon your player currently has selected floating next to the player.  As the pawn moves around the weapon also moves around with it &amp;ndash; sort of.

Now switch to the third person perspective by entering ''behindview 1'' at the console.  You should notice the following things.
* Your view has pulled back slightly.
* The floating weapon has vanished into thin air.
* Your view now rotates as you look around with the mouse.
* You still have full normal control over the player pawn.

It's all interesting stuff as it gives us a basis for working through the code and figuring out what's going on.  The view the player sees is ultimately controlled by the ''PlayerCalcView()'' function.  Control this and you can make them look anywhere you want to.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CutDownContentCommandlet</title>
    <id>764</id>
    <revision>
      <id>2182</id>
      <timestamp>2004-08-11T01:16:16Z</timestamp>
      <contributor>
        <ip>Lynx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; CutDownContentCommandlet}}

Purpose of this commandlet remains mysterious.  To use, first make three new subfolders in your [[Legacy:UT2003|UT2003]] directory - /CutDownSounds, /CutDownStaticMeshes and /CutDownTextures.

Run &quot;ucc CutDownContent&quot; and it processes all files, dumping (approx.) of 112mb worth of files into these directories.

 

====Observations ====
; Filenames : The filenames it produces match existing ones (Epic's packages, or custom created).  Therefore we can assume it uses data from the existing files with the matching name.
; File size : These 'new' files are much, much smaller than the originals.
; Not a replacement : ...therefore they are not a replacement for the originals.  I've tried running UT2003 - it crashes with 'missing texture' - (this is for the Nvidia level).

'''DJPaul:''' I surmise therefore that unreferenced material (perhaps ignoring &quot;dynamicloadobject&quot; called-material) is analyised, extracted, then dumped to these new files.  I haven't tested this myself, by creating purposely redudnant content.

'''Mychaeel:''' I assume in addition to what DJPaul supposes, it reduces texture resolution and other stuff.  That might have been what Epic used to prepare the game for the demo release.

'''_Lynx:''' This one may be used for creating dedicated server packages.</text>
    </revision>
    <revision>
      <id>2183</id>
      <timestamp>2002-10-30T06:36:51Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; CutDownContentCommandlet}}

Purpose of this commandlet remains mysterious.  To use, first make three new subfolders in your [[Legacy:UT2003|UT2003]] directory - /CutDownSounds, /CutDownStaticMeshes and /CutDownTextures.

Run &quot;ucc CutDownContent&quot; and it processes all files, dumping (approx.) of 112mb worth of files into these directories.

 

====Observations ====
; Filenames : The filenames it produces match existing ones (Epic's packages, or custom created).  Therefore we can assume it uses data from the existing files with the matching name.
; File size : These 'new' files are much, much smaller than the originals.
; Not a replacement : ...therefore they are not a replacement for the originals.  I've tried running UT2003 - it crashes with 'missing texture' - (this is for the Nvidia level).

'''DJPaul:''' I surmise therefore that unreferenced material (perhaps ignoring &quot;dynamicloadobject&quot; called-material) is analyised, extracted, then dumped to these new files.  I haven't tested this myself, by creating purposely redudnant content.

'''Mychaeel:''' I assume in addition to what DJPaul supposes, it reduces texture resolution and other stuff.  That might have been what Epic used to prepare the game for the demo release.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CyberSirius</title>
    <id>862</id>
    <revision>
      <id>2400</id>
      <timestamp>2006-08-07T04:16:19Z</timestamp>
      <contributor>
        <ip>CyberSirius</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Surface Lighting|Surface Lighting]]

==Guestbook==

'''Tarquin:''' Welcome to the unreal wiki :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

'''CyberSirius:''' I'm an active guy in the Beyond Unreal Forums (mainly in OT :D )

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2401</id>
      <timestamp>2005-02-23T01:56:58Z</timestamp>
      <contributor>
        <ip>CyberSirius</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Maps in Progress: DM-[no name yet]

An alleria architechture based map designed for ambiance.

Still on paper.

DM,CTF,JB-Central 14

A very small 1 on 1 map of a similar theme as Central 13

UWRC-Desertic is finished :D

==Guestbook==

'''Tarquin:''' Welcome to the unreal wiki :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

'''CyberSirius:''' I'm an active guy in the Beyond Unreal Forums (mainly in OT :D )

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2402</id>
      <timestamp>2006-08-07T04:16:04Z</timestamp>
      <contributor>
        <ip>CyberSirius</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[Surface Lighting]

==Guestbook==

'''Tarquin:''' Welcome to the unreal wiki :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

'''CyberSirius:''' I'm an active guy in the Beyond Unreal Forums (mainly in OT :D )

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:CylinderBuilder</title>
    <id>879</id>
    <revision>
      <id>2438</id>
      <timestamp>2005-12-26T20:12:00Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>class page markup</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; CylinderBuilder (Package: Editor)}}

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; CylinderBuilder (Package: Editor)}}

This creates a cylinder for the [[Legacy:Red Builder Brush|red builder brush]].

==Properties==
; float Height : the height of the cylinder
; float OuterRadius : The radius of the cylinder.
; float InnerRadius : applies only when Hollow. The radius of the hollow part
; int Sides : The number of points at the sides. The more points, the rounder it looks, but when too many, the game gets slower.
; name GroupName : doesn't work with it
; bool Align to Side : Aligns the textures to the side
; bool Hollow : makes ik hollow

==Functions==
; BuildCylinder( int Direction, bool AlignToSide, int Sides, float Height, float Radius ) :
; bool Build() :

==Alignment tips==

I don't really know how to align cylinders properly. Just do align wall direction and panning, and then it looks ok enough.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2439</id>
      <timestamp>2004-07-22T04:27:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; CylinderBuilder (Package: Editor)}}

This creates a cylinder for the [[Legacy:Red Builder Brush|red builder brush]]

==Properties==

* Height - the height of the cylinder
* Outer Radius - The radius of the cylinder.
* Inner Radius - applies only when Hollow. The radius of the hollow part
* Sides - The number of points at the sides. The more points, the rounder it looks, but when too many, the game gets slower.
* Group name - doesn't work with it
* Align to Side - Aligns the textures to the side
* Hollow - makes ik hollow

==Alignment tips==

I don't really know how to align cylinders properly. Just do align wall direction and panning, and then it looks ok enough.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DJPaul</title>
    <id>956</id>
    <revision>
      <id>2595</id>
      <timestamp>2004-08-31T21:13:35Z</timestamp>
      <contributor>
        <ip>User-3527.l2.c5.dsl.pol.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Paul '''DJPaul''' Gibbs, pgibbs@dangerous-minds.net or djpaul@gmail.com.

I'm likely to be in '''#Public''' on '''irc.dangerous-minds.net'''.
 
 

==UnrealScript bio ==

Past:
* Modus Moriendi: Website dead, this was my first mod involvement ever.
* [http://coop.deus-ex.org |Deus Ex Coop]: for Deus Ex - brings Deus Ex SinglePlayer to MultiPlayer.
* [http://www.chaoticdreams.org |Chaos UT2 Evolution]: the follow-up to a fantastic mod for UT.  I coded King of the Hill for them.
* [[Legacy:Esc|Esc]]: the online nightclub for UT.

----

'''DJPaul:''' 20/04/03: I'm out of here; out of projects and out of ideas.  Been a blast (/me hits 'EJECT').

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2596</id>
      <timestamp>2003-04-20T19:33:54Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Paul '''DJPaul''' Gibbs, djpaul@djgenerationx.com or djpaul@planetdjpaul.com.

I'm likely to be in '''#Public''' on '''irc.dangerous-minds.net'''.
 
 

==UnrealScript bio ==

Past:
* Modus Moriendi: Website dead, this was my first mod involvement ever.
* [http://coop.deus-ex.org |Deus Ex Coop]: for Deus Ex - brings Deus Ex SinglePlayer to MultiPlayer.
* [http://www.chaoticdreams.org |Chaos UT2 Evolution]: the follow-up to a fantastic mod for UT.  I coded King of the Hill for them.
* [[Legacy:Esc|Esc]]: the online nightclub for UT.

----

'''DJPaul:''' 20/04/03: I'm out of here; out of projects and out of ideas.  Been a blast (/me hits 'EJECT').

'''ZxAnPhOrIaN:''' Gone forever? :( You could help me with the [[Legacy:Mapping Resources|Mapping Resources]] page! :)

'''DJPaul:''' I have troubles making untextured cubes in Unreal Ed.

'''ZxAnPhOrIaN:''' Untextured cubes, meaning?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2597</id>
      <timestamp>2003-05-30T13:38:54Z</timestamp>
      <contributor>
        <ip>User-866.bbd13tcl.dsl.pol.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Paul '''DJPaul''' Gibbs, djpaul@djgenerationx.com or djpaul@planetdjpaul.com.

I'm likely to be in '''#Public''' on '''irc.dangerous-minds.net'''.
 
 

==UnrealScript bio ==

Past:
* Modus Moriendi: Website dead, this was my first mod involvement ever.
* [http://coop.deus-ex.org |Deus Ex Coop]: for Deus Ex - brings Deus Ex SinglePlayer to MultiPlayer.
* [http://www.chaoticdreams.org |Chaos UT2 Evolution]: the follow-up to a fantastic mod for UT.  I coded King of the Hill for them.
* [[Legacy:Esc|Esc]]: the online nightclub for UT.

----

'''DJPaul:''' 20/04/03: I'm out of here; out of projects and out of ideas.  Been a blast (/me hits 'EJECT').

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DJPaul/TTS</title>
    <id>965</id>
    <revision>
      <id>2616</id>
      <timestamp>2002-07-27T18:34:10Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page will have details of a mini-mod of mine for UT - it is TextToSpeech.  For example, you say something, and you hear your character speak it.

I'll be releasing this in a couple of days after I write it up a smidge - be '''warned''', this will be an INCOMPLETE mod and it will '''stay''' that way, for I don't have the knowledge to fix a f****ing annoying replication bug, nor do I want to learn how.

Keep your eyes peeled.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM</title>
    <id>941</id>
    <revision>
      <id>2562</id>
      <timestamp>2002-09-11T11:48:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>redirect to DeathMatchPlus</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:DeathMatchPlus|DeathMatchPlus]]</text>
    </revision>
    <revision>
      <id>2563</id>
      <timestamp>2002-04-03T12:06:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Deathmatch (DM):'' Standard Unreal Tournament [[Legacy:Gametypes|game type]]. Players score points by fragging each other; the first player to hit the score limit wins (or the player with the highest score when the time runs out).

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mapping]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM-Encarceration</title>
    <id>973</id>
    <revision>
      <id>2632</id>
      <timestamp>2002-10-06T18:53:06Z</timestamp>
      <contributor>
        <ip>Host217-35-8-203.in-addr.btopenworld.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">DM Encarceration:

It has ben 350 years since the oil facility of the Encarceration megapolis complex shut down, but there's still life there, Liandri have reopened it as a tourament ground and now it is even deadlier than ever. Prepare to be Encarcerated.

Screenshots:

[[Image:Legacy_Encarcerationvat.jpeg|center|A big vat of oil, don't fall in!!]]

[[Image:Legacy_encarcerationpipework.jpeg|center|Ah, the arteries of the oil system]]

[[Image:Legacy_Encarcerationpool.jpeg|center|This'll hurt if you fall in too]]

[[Image:Legacy_Encarcerationlift.jpeg|center|Um... you stand on it and it takes you upwards?]]

Bugs:

Comments:

----

'''Mychaeel:''' I can hardly see anything on those screenshots &amp;ndash; they are way, way too dark.  See [[Legacy:Screenshot|Screenshot]] for a tutorial on how to post-process screenshots to make them look nice.

'''ProjectX:''' That's odd, i can see them fine, maybe you have a lower screen brightness?

'''Wormbo:''' Actually your screen brightness must be higher than the average user's setting. The images are really too dark.

'''ProjectX:''' Hmm... that's odd, i'll sort both out straight away

'''ZxAnPhOrIaN:''' Could you please do this for UT2003??

'''ProjectX:''' I would, but my UED keeps crashing on me, it's so damn annoying</text>
    </revision>
    <revision>
      <id>2633</id>
      <timestamp>2002-10-06T16:23:30Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">DM Encarceration:

It has ben 350 years since the oil facility of the Encarceration megapolis complex shut down, but there's still life there, Liandri have reopened it as a tourament ground and now it is even deadlier than ever. Prepare to be Encarcerated.

Screenshots:

[[Image:Legacy_Encarcerationvat.jpeg|center|A big vat of oil, don't fall in!!]]

[[Image:Legacy_encarcerationpipework.jpeg|center|Ah, the arteries of the oil system]]

[[Image:Legacy_Encarcerationpool.jpeg|center|This'll hurt if you fall in too]]

[[Image:Legacy_Encarcerationlift.jpeg|center|Um... you stand on it and it takes you upwards?]]

Bugs:

Comments:

----

'''Mychaeel:''' I can hardly see anything on those screenshots &amp;ndash; they are way, way too dark.  See [[Legacy:Screenshot|Screenshot]] for a tutorial on how to post-process screenshots to make them look nice.

'''ProjectX:''' That's odd, i can see them fine, maybe you have a lower screen brightness?

'''Wormbo:''' Actually your screen brightness must be higher than the average user's setting. The images are really too dark.

'''ProjectX:''' Hmm... that's odd, i'll sort both out straight away

'''ZxAnPhOrIaN:''' Could you please do this for UT2003??</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM-Seismic Canyon Foreword</title>
    <id>1091</id>
    <revision>
      <id>2885</id>
      <timestamp>2008-02-23T17:35:59Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Foreword===

'''DM Siesmic Canyon''' is a set of tutorial aimed at the ignorant, who wish to be less ignorant, it is easy to replicate, and teaches about a variety of aspects of making maps for UT3. While I personally have little experience with the toolset in UT3, I am learning quickly through trial and error, as well as through the kind and helping words of people like Hourences, with his book on level design being a major source of inspiration (also a highly recomended buy for people wanting to make levels for really any FPS game, with a lot of information that won't be covered here), the many tutorials I have found onm the net are also used, as well as my 5 years of modding expertise in various game toolsets.

It is my hope that these tutorials can be used by the compleate novice to replicate DM-Siesmic, and the more veteran to flick through and glean what they need to achieve a particular task.

Hope you find this set helpfull, and I am looking forward to compleating the tutorials.

Keep in mind this is a public wiki, anyone has the right to edit this info, and hoepfully improve upon it(even if it does have my name stamped on it:p). My hope is that when the guide is nearing compleation it will be moved from this semi-sand box to a more easy and accessable place on the wiki, but my first priority is to get it too a usefull state, feel free to help and make suggestions as to the way you see DM-Siesmic should be, since it hasn't been finished yet, also don't be shy in pointing what is unclear, or improving it yourself.</text>
    </revision>
    <revision>
      <id>2886</id>
      <timestamp>2008-02-22T11:00:04Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Foreword===

'''DM Siesmic Canyon''' is a set of tutorial aimed at the ignorant, who wish to be less ignorant, it is easy to replicate, and teaches about a variety of aspects of making maps for UT3. While I personally have little experience with the toolset in UT3, I am learning quickly through trial and error, as well as through the kind and helping words of people like Hourences, with his book on level design being a major source of inspiration (also a highly recomended buy for people wanting to make levels for really any FPS game, with a lot of information that won't be covered here), the many tutorials I have found onm the net are also used, as well as my 5 years of modding expertise in various game toolsets.

It is my hope that these tutorials can be used by the compleate novice to replicate DM-Siesmic, and the more veteran to flick through and glean what they need to achieve a particular task.

Hope you find this set helpfull, and I am looking forward to compleating the tutorials.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM-Siesmic Canyon Files</title>
    <id>1092</id>
    <revision>
      <id>2887</id>
      <timestamp>2008-02-23T15:51:43Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[http://files.filefront.com/DM+Siesmic+Canyon+Part017z/;9688170;/fileinfo.html DM-Siesmic_Canyon_Part01.7z] Part #01 of the tutorails asociated file, hosted on FileFront.

'''Size: 14.76 MB (15,480,938 Bytes)'''

Contains the following directory structure...
* Static Meshes
** SteamVent.ASE - one of the meshes described in the tutorail.
** SteamVent_Dual.ASE - A variant of SteamVent.ASE, not described in the tutorial, yet similar to the other.
* Textures
** AlphaMaps
*** SteamParticleBlend.bmp - A 3 Alpha Blend texture 512x512 used to shape and color the steam rising from the vents.
** Diffuse Textures
*** Mud_Diffuse.bmp - A tileable seemless texture that looks like mud.
*** Soil_Diffuse.bmp - A tileable seemless texture that looks like soil.
** Normal Maps
*** Mud_Normal.bmp - A tileable seemless normal map that is used to give texture to the mud.
*** Soil_Normal.bmp - A tileable seemless normal map that is used to give texture to the soil.
** Original Images
*** Mud.jpg - The original image used to make the mud textures.
*** Sand0062_L.jpg - The original image used to make the soil textures.
* UT3
** UTGame
*** Published
**** CookedPC
***** CustomMaps
****** DM-SiesmicCanyonPart-01.ut3 - A playable demo of the finished product of the first tutorial part.

You can use these files to work along with the tutorial, or even use the methods described to produce your own variants.</text>
    </revision>
    <revision>
      <id>2888</id>
      <timestamp>2008-02-23T15:48:50Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[http://files.filefront.com/DM+Siesmic+Canyon+Part017z/;9688170;/fileinfo.html DM-Siesmic_Canyon_Part01.7z] Part #01 of the tutorails asociated file, hosted on FileFront.

'''Size: 14.76 MB (15,480,938 Bytes)'''

Contains the following directory structure...
* Static Meshes
** SteamVent.ASE - one of the meshes described in the tutorail.
** SteamVent_Dual.ASE - A variant of SteamVent.ASE, not described in the tutorial, yet similar to the other.
* Textures
** AlphaMaps
*** SteamParticleBlend.bmp
** Diffuse Textures
*** Mud_Diffuse.bmp
*** Soil_Diffuse.bmp
** Normal Maps
*** Mud_Normal.bmp
*** Soil_Normal.bmp
** Original Images
*** Mud.jpg
*** Sand0062_L.jpg
* UT3
** UTGame
*** Published
**** CookedPC
***** CustomMaps
****** DM-SiesmicCanyonPart-01.ut3

You can use these files to work along with the tutorial, or even use the methods described to produce your own variants.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM-Siesmic Canyon Links</title>
    <id>1089</id>
    <revision>
      <id>2881</id>
      <timestamp>2008-02-22T12:47:07Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Links===

This page is dedicated to the various program I have/will be using in the '''DM-Siesmic Canyon''' tutorial series.

====Software====

[http://www.texturemaker.com/download.php Texture Maker]

This will turn a regular photo into a seemless texture with little effort, don't be fooled though, for truely stunning effects, you still got a lot of work to make a good UT3 Material, but this helps...

[http://usa.autodesk.com/adsk/servlet/index?id=5659302&amp;siteID=123112 3DS Max]  ''Note: I don't have any other 3D softwares, I have never really learnt anything else, and I am not really a person to talk to about other software in this catagory.''

The only 3D software I use, comes with a heavy price tag though imo, no trial versions of it unfortunately.

[http://www.adobe.com/products/photoshop/index.html Adobe Photoshop]

This is one of the best image editing programs I know of, though it is also commercial, and while I don't own the latest version, I think it is still great for what I do, you can use Gimp ''(which is unsupported by these tutorials)'', but one of the filters I use with photoshop is the Normal Map filter from NVidia, the plugin itself won't work with Gimp, but you can still get a command line util that will do the trick as well, I might add a section on it at a later date.

[http://developer.nvidia.com/object/photoshop_dds_plugins.html Nvidia Texture Tools Plugin for Photoshop]

This is a nifty little tool that makes it easy to convert grey scale, or even color images into an effective normal map, imo normal maps are a requirement of UT3, and if not used your level will suffer greatly from it, if you don't own photoshop, you will need some other way to make these Normal Maps.

[http://www.renoise.com/download/ Renoise]

This is a great little tool, I prefer it to Madtracker, which is also another great audio sequence tool, but find that for production quality Renoise is superior in render quality (most of the time this is...)

====Helpfull Sites====

[http://modarchive.org/ The Mod Archive]

If your not good with composing music, looking for inspiration in this field, or for any other reason after a tune, this is the place I start, while I have written some musics that were exceptionally good for Multi-Player Online RPGs, I have to restock and totally change my style for UT3, since I am yet to write a piece of music that fits the game, this is my source for my music!</text>
    </revision>
    <revision>
      <id>2882</id>
      <timestamp>2008-02-22T12:46:12Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Links===

This page is dedicated to the various program I have/will be using in the '''DM-Siesmic Canyon''' tutorial series.

====Software====

[http://www.texturemaker.com/download.php Texture Maker]

This will turn a regular photo into a seemless texture with little effort, don't be fooled though, for truely stunning effects, you still got a lot of work to make a good UT3 Material, but this helps...

[http://usa.autodesk.com/adsk/servlet/index?id=5659302&amp;siteID=123112 3DS Max]  ''Note: I don't have any other 3D softwares, I have never really learnt anything else, and I am not really a person to talk to about other software in this catagory.''

The only 3D software I use, comes with a heavy price tag though imo, no trial versions of it unfortunately.

[http://www.adobe.com/products/photoshop/index.html Adobe Photoshop]

This is one of the best image editing programs I know of, though it is also commercial, and while I don't own the latest version, I think it is still great for what I do, you can use Gimp ''(see below)'', but one of the filters I use with photoshop is the Normal Map filter from NVidia, the plugin itself won't work with Gimp, but you can still get a command line util that will do the trick as well, I might add a section on it at a later date.

[http://developer.nvidia.com/object/photoshop_dds_plugins.html Nvidia Texture Tools Plugin for Photoshop]

This is a nifty little tool that makes it easy to convert grey scale, or even color images into an effective normal map, imo normal maps are a requirement of UT3, and if not used your level will suffer greatly from it, if you don't own photoshop, you will need some other way to make these Normal Maps.

[http://www.renoise.com/download/ Renoise]

This is a great little tool, I prefer it to Madtracker, which is also another great audio sequence tool, but find that for production quality Renoise is superior in render quality (most of the time this is...)

====Helpfull Sites====

[http://modarchive.org/ The Mod Archive]

If your not good with composing music, looking for inspiration in this field, or for any other reason after a tune, this is the place I start, while I have written some musics that were exceptionally good for Multi-Player Online RPGs, I have to restock and totally change my style for UT3, since I am yet to write a piece of music that fits the game, this is my source for my music!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM-Siesmic Canyon Part 01</title>
    <id>1088</id>
    <revision>
      <id>2879</id>
      <timestamp>2008-02-22T10:40:03Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==DM Siesmic Canyon==

===Foreword===

Starting with my toolset I have the following programs I will be using to produce this level, the list may be added to as I go along, but in this first pass, I am just listing, and linking to the tools I have grown to love over the years...

===Planning===

Ironically, I had the tune picked before I had even really decided on a theme for my map, it was industrial erotic which I had found while brainstorming what I was going to make, it has been playing on my computer for about 4 days non-stop now, and is only slightly annoying me, a good sign, as imo it won't get over the top in a UT3 game. If you want to find good music on The Mod Archive, I suggest looking for music which has industrial themes, they tend to fit the game fairly well, and imo supplement the fast paced action, this is just an idea, depending on what you are making, and the themes you choose for the map, you might find a totally different style appeals.

One of the great things I find in life, is that if something really shine through as appealing to yourself, then you will atleast have an audience that will also stirke a chime with your taste (reaching out to inform the audience of your creations presence on the other hand can be troublesome, and hopefully will be covered later).

I had chosen a volcanic theme to my map, but I was tempted to steer away from lava, and dark grey melted rock, choosing more of a sulphur and brimstone look, which I thought was far more original than classic lava.

It was predetermined that the map would occupy a canyon, which was roughly Y shaped, and that it would have an underground measurement and sensor facility below the intersection which could be accessed through 3 small caves that were around the inward pointing side of the canyon (towards the center of the Y).

These caves I had decided would be fairly shallow, and have steel doors to mark the transition from the sulphurous surface, into the underground area, words I thought that would describe the scene where new, shiney, and high tech, I had also given some reflection as to the interior lighting of the level, and was thinking of cold sharp light blue lights, complimented with warmer orange lights, and the occasional small and dull flashing/rotating red alarm lights, which would need to be toned down till they didn't steel the limelight of the rest of the scene.

Above ground, I continued to think about things such as weather and environment, I was opting for a variety, but being carefull about the merging of them, for example, I wanted to include a section in one of the canyons leading out of the Y an area that had lots of steam vents and poor visibility, as well as some shallow briney yellow sulphor pools, as well as perhaps one or two deeper ones, that could be submerged into.

The other two canyon forks I wanted to have a similar feel but with better visibility, I wanted to make narrow walkways up the sides of the canyon walls, with some non-installation caves, though to make them small and simple, just to act as thourough-fares through otherwise imapssible terrain.

As for the time to compleate the project, I had given myself about 3 months to do it, which I thought a reasonable amount of time to achieve at least a Beta product, provided I had little interruptions during the period. I had thought through the possibility of needing more time, and decided that I was to inexperienced in the map creation process to really give an accurate time to compleate.

I wanted a fair amount of custom art in the level too, coming from a prefab hell in the last game I modded, I just couldn't bare the thought of being reduced to making other peoples art works fit my map, if they did, then this was ok, but I highly doubted that much of the existing artwork would match the outdoor region, and the indoor region was also fairly specific too, requiring siesmic sensing equipement.

And this is how I set out.

There were aditionally a few features I wanted in the map, things like earthquakes I thought would be really good, tremors mostly, just the quivering of the ground, the idea braught with the fun idea of placing physics objects in the game, another thing I wanted was to include a random event that would fire roughly once every 15-30 x20 minute deathmatch games ie. about every 5 to 10 hours, this would be a major earth quake, at this present time I am unsure of the exact implementation of this, but intend to learn it as I go.

I now had music, and theme, and a rough idea of how the map looked, it was time to move to specifics...

... I choose to start by making elements of the map rather than the map itself.

===Textures===

I went and did a google search to find images, I wanted some kind of soil, and some mud, considering my theme, I had to choose something that looked like it would fit.

[[Image:Legacy_DMSiesmic_SandImage.jpeg|center|Sand Image]]

[[Image:Legacy_DMSiesmic_MudImage.jpeg|center|Mud Image]]

I wasn't overly thrilled with the images, they were not quite what I had in mind, but I had spent enough time searching, and there was lots yet to be done.

''It should be noted thatI used a lot higher resolution image than shown here''

I used the ISampler function of Texture Maker (see above) to make the textures seemless, it can be found under the tools drop down menu, and is labeled Isampler Resynthesis.

I normally use the following settings, but feel free to tweak it to your hearts desire, ''Note: if you don't already have a seemless texture, make sure the ignore borders checkbox is ticked, otherwise you will get a very ugly texture.

[[Image:Legacy_DMSiesmic_ISampler.jpeg|center|ISampler Resynthesis - Acidsphinx's favourite settings]]

From the above images I made the following textures.

[[Image:Legacy_DMSiesmic_SoilTextureSeemless.jpeg|center|Tileable Seemless Soil Texture made with Texture Maker]]

[[Image:Legacy_DMSiesmic_MudTextureSeemless.jpeg|center|Tileable Seemless Mud Texture made with Texture Maker]]

I could have kept going with the textures, but I decided to change courses here and produce a static mesh to test them out in game, there were reasons for this, and they were that I was not overly happy with this result, I tend to muck around a lot when making things, and you should be aware that changing tasks (and in my case moving around the house between computers) slows things down, effeciency can be important to some people, but I tend to prefer to take my time.

===Static Meshes===

The mesh I wanted to make would use both of these textures, namely it was a steam vent which would eventually have steam pouring from the top of a mound.

I fired up 3DS Max, and roughly modeled what looked like a vent, I started with a plane, broken into a 6x6 grid that measured 256x256 generic units, converted to editable poly, and then started moving the vertices to where I wanted them. ''Tip: to view the divisions between the grid in 3DS Max press F4''

I came up with the following...

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_01.jpeg|center|Part #01 of the steam vent, nothing really to look at yet]]

After this, I added a HSDS modifier and selected the inner region, I'll note now, that I wanted the outside square to remain square, and with a 0 altitude on the z axis, this would make it easier to place when I got into the game, I also went to the lengths to ensure that the center vertex was exactly 256 units high, the ones on the north/east/south/west of it I made 128 units high (kind of like a + shape of vertices were selected and then I moved them to the apropriate height), and the ones on the NE/NW/SE/SW (the x shape of the center) I made 48 units, then I shifted them all in the x-y plane, while keeping the outside vertices in their original location!

After selecting the inner region like so

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_02.jpeg|center|These are the polygons I selected...]]

On the right hand side in the roll out, I then clicked the subdivide button, which smooths the image a lot, this is good, becuase it is supposed to be a steam vent, not a sharp spike in the ground, my next task was to drop the center vertice (the one that was at 256, which you may note is no longer this height) down to the ground, ie a zero on the z axis to produce the center of the steam vent.

I could have aditionally tweaked the vertices, but didn't because I was a little worried about loosing the smooth effect.

After this I selected a different set of polygons, and subdivided again.

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_03.jpeg|center|Basically all that has been done is that the outer 3 polys on each corner have been deslected]]

And on more time with yet another different set of polys.

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_04.jpeg|center|The outer circle of polys was removed this time before subdividing]]

Everything seemed to be going great, I wanted one more level of subdividing, but thought I would manipulate some vertices a bit more at this point, looking at the top of the steam vent I though it was looking pretty flat, and wanted to put some altitude variation into that, after this I selected the following polys and did a final subdivide

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_05.jpeg|center|Notice only a ring is selected, the the 4 center square are not, basically we are just trying to add a final smooth to the altered top of the cone]]

At this point I noticed that the corners of my square had moved in due to the HSDS smoothing modifier, I quickly moved them back to their corners at the proper 128,128 -128,128 128,-128 -128,128 positions, making sure the outside shape remained a perfect square.

I was happy with model, and later did others to produce varience in game.

The task of skinning came next, I chose to use the vertex paint method for a smooth transition from soil to mud, I thought a bit that the terrain itself would, atleast where these vents were, be a mix of mud and other textures anyhow, and that not a spec of solid soil should be seen, I added the vertexpaint modifier.

A new panel pops up, at its top are a few images of cubes, I picked the shaded representation of the vertex colors(the second cube on my version)

A little bit below this, there are 6 more buttons, 3 wide ones on the right, and 3 thin ones on the left, the tooltip reads paint on the top right one, and erase below that, and finally the color picker below that, I chose to use a black, not sure why, it just seemed like the logical choice, we are after all effectivly painting an alpha channel that determines the transparency between our two textures here.

I paint my pattern onto the mesh, merging the two appropriatly to make a smooth transition form the soil ground to the muddy slope and top, I end up with something looking like this

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_06.jpeg|center|The alpha map fades from balck through to white, and represents the opacity of one texture over the other]]

I'm not sure if the next step is actually required, since we are only going to be assigning one material to the mesh, but I'll quickly go through the process anyhow.

In the 3DS Max material editor, found in the top toolbar, designated by 4 spheres coloured red, green, blue and white, select the first material, then click the button that has the label Standard and change it to Multi/Sub Object, it will ask you if you want to discard or keep the material that used to be in slot you have changed, since you need to be taught this, I assume you are new to 3DS Max, and I will recomend you discard, but leave the choice for yourself.

The interface changes dramitcally, click the button labeled Set Number and set it too 1, because we will only be using one material, which will actually be a mix of two textures ;)

Down the bottom of the interface the long list of textures should shrink to contain only the one, click the button which should be labeled something like ''Material #xx ( Standard )'', then change the drop down from Blinn to Phong at the top, UT3 uses phong. and then in the tiny little square button next to the Diffuse color swatch in the Basic Parameters, and select Mix.

Where it say color #1, go to the button labeled none, click it, select bitmap, and then load the soil texture (note the color in the swatch is black, it will replace the black sections we just painted), and then do the same for color #2 except load the mud texture, which should replace the white section of the mesh.

The third one in the list is called Mix Amount, this is the map which determines the pattern of the two textures, you ''could'' use perlin noise for an unpredictable response, but what we want here is the vector color, if you click the square button, you should see Vertex Color about 3rd from the bottom, select it, and we are almost done, climb back out of the mix, to the top texture in the drop down list, and then apply it to the object (by selecting the object and clicking the third button directly below the texture sphere swatches), you won't see the texture in the viewport, but it should be there when we render.

There is one last thing to do, and that is add an edit poly modifier, select the border of the square from underneath, and cap it with the cap button in the roll out. If you see textures fighting after having done this, don't feel to worried, the fact that it will be placed slightly below ground level will totally cover this problem up when we place them in the editor.

When I rendered my one it look like this

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_07.jpeg|center|A simple steam vent]]

I was modestly happy with it, there was room for improvement, and I could take that up with my next few variants, but this was satisfactory for what I wanted.

Now I needed to import it into the game...

===UT3 Mesh Import===

First of all you need to export the mesh from 3DS Max, I'm not going to go into details on how to use the file system, but these are the settings I use for the actuall export... (You need to export as .ASE file (the ascii file format))

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_08.jpeg|center|My export settings, note I have increased the Decimal Precision, while not absolutely nescesary, I like it like that, becuase I tend to always opt for the uber kill quality settings]]

You will notice that I have also in the following example made normal maps, the soil normal map was made by running through some erosion filters in texture maker, then converting it to grey scale, maximizing contrast, and finally being converted to a noraml map by using [http://developer.nvidia.com/object/photoshop_dds_plugins.html Nvidia DDS Tools plugin for Photoshop], this normal map is what will give the texture its rough surfaced 3D look.

[[Image:Legacy_DMSiesmic_Soil_NormalSeemless.jpeg|center|Soil Normal texture]]

[[Image:Legacy_DMSiesmic_Mud_NormalSeemless.jpeg|center|Mud Normal texture]]

Ok, I start up the editor, and when it has loaded, I make a new ''Additive'' level, I save it as '''DM-Test''', I open the generic browser, and click import under the file menu, and select both textures (all 4 in my case because I have normal maps), I also take the time and care not to click OK to all, I have no idea why I do this, it just seems logical to me, but I ensure that the ''CompressionSettings'' drop down is set to TC_Default for regular textures, and ''TC_NormalMap'' for normal maps and I do the same for LODGroup. I also import the mesh. ''I use the package name of '''DM-Test''' note it is identical to the file name'', as for the group, it is like a sub-directory, or a folder to contain various things you import, much like your computers filesystem, it is mainly used for catagorizing the things you import to speed up searching for things, you could just have textures, or you could use DiffuseTextures, NormalMaps, and Meshes as your groups, it really doesn't matter, and is left to personal preference

I make a new material called SteamVent_Mat, and open the material editor and set the following up...

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_09.jpeg|center|A few big things happen here, take a look at the vertexcolor component, it is what determines which pattern will be applied from the vertex painting we done, nothing more really needs to be done except to LERP the two materials together using this pattern, LERP stands for Linear Interpolate, it is a straight ramp from 0.0 to 1.0, as opposed to cubic or sinisoid interpolate, which measure the distance between the two numbers in such a way that the distance between the fractions are not equal, this basically means that there should be no distortion ''(note cubic and sinsoid interpolate don't exist in the material editor, for the point that they are next to useless in the world of textures)''. You will notice I have 3 Lerps, they all use the same VertexColor map, but have different inputs and connect to different functions in the material, the textures are Lerp'd to Diffuse, the normal maps are Lerp'd to Normal, and then I have two constants that are Lerp'd to the Specular, Specular determines the amount of light that bounces back at you, a value of 0.05 is used for the soil, as it drinks the light in and gives little back, the effect gives it a very dull sheen, the mud gets a value of 0.15, giving it a much stronger effects, making it look more like it is wet, ''without some sort of specular lighting, the normal maps are not readily apparent''.]]

I then go to the mesh and open up its properties, the first thing I then do is go back to the generic browser, and select the material we previously made, and apply it to the mesh, this is done by unfolding the properties like so

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_10.jpeg|center|By selecting a material and clicking the green arrow pointing left next to Material, I apply or material to the mesh]]

With the material applied, a few things still need to be done, the next thing on the list is to make a quick collision map, you can find the Collision -&gt; Auto Convex Collision, and use the following settings, there are better ways to do this, which I will probably cover later when we actually import this into more than just a test file.

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_11.jpeg|center|Totally maxed out, and even then honestly not accurate enough for me :(]]

Last thing to do is get a good angle and take a shot for the Generic Browser, this can found under Tool -&gt; Save Thumbnail Angle.

===A quick test level to see our mesh in game===

Ok one more material to paint the ground with is needed, I used this setup...

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_12.jpeg|center|Nothing that exciting...]]

''If over the next bit you only see a black screen in your render viewport, try turning the lighting mode (in the bar across the top of the actual render view port) to unlit mode''

Minimize the Generic Browser, and make a Cube Brush that is X 2048, Y 2048, Z 2

Add the brush, right click it, and then Select All Surfaces, expand the Generic Browser, and apply the texture by selecting the Soil Texture we just made, then select the steam vent, and shut the Generic Browser, right-click on the ground in roughly the middle, Add Actor, and then choose to Add the Static Mesh (should be the one at the top of the list).

Move it to desired location, ensuring that the square base is burried one unit below the ground, you will likely have to drop the drag grid to do this, it is under View in the menu bar, I needed to drop it to one, unless you want real headaches in the process of level desgin, never turn the draw grid off, at least when trying to get things to aline, sometimes, especially with meshes you might have to take it off - just to get that extra look of perfection, but not this time ;)

Finally a light and a sky are needed. Select the Generic Browser again, and go to the tab at the top which is called Actors, slide down to the entry called Light, expand it, and select SkyLight, Right click anywhere on the ground and add the light to illuminate the scene. Go back to the Generic Browser ''(don't forget to move back to the Generic tab at the top)'', and under the file menu, open, and provided you installed to the default place, you will find UN-Sky under the following directory tree, C:/Program Files/Unreal Tournament 3/UT Game/CookedPC/Environments, open it, and then look for it in the list at the bottom left of the Generic Browser, click it, search for a good sky, like S_UN_Sky_SM_SkyDome03, drop it on your terrain with the right click, and add actor that we did with the steam vent (exactly the same), move it down, so that from roughly eye level you can't see the black, the black area causes a wierd feedback when it is visible, it looks horrible, but we are only testing this mesh, not building a level, and this should suffice to view it in the editor.

Up in the top tool bar, click the Build All button (a cube with a light bulb on it) You will prolly get a few warnings, they are unimportant for this task, right click on the ground some where, and go to the option in the drop down menu that reads ''Play From Here (Ctrl Spectates)''

You should have a pretty good idea of how it looks from with in the game now, don't fall off the edge :p

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_13.jpeg|center|Pew Pew Pew!!!]]

As a final thought I decided that 3 variants of the mesh would be required to stop the players eye from bleeding, below is an example of what I made....

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_14.jpeg|center|A room for testing the steam vents, untweaked lights have been placed to give it a bit of a better feel, the meshes have also been scaled and rotated to add to varience]]</text>
    </revision>
    <revision>
      <id>2880</id>
      <timestamp>2008-02-22T05:39:38Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==DM Siesmic Canyon==

===Foreword===

Starting with my toolset I have the following programs I will be using to produce this level, the list may be added to as I go along, but in this first pass, I am just listing, and linking to the tools I have grown to love over the years...

===Links===

====Software====

[http://www.texturemaker.com/download.php Texture Maker]

This will turn a regular photo into a seemless texture with little effort, don't be fooled though, for truely stunning effects, you still got a lot of work to make a good UT3 Material, but this helps...

[http://usa.autodesk.com/adsk/servlet/index?id=5659302&amp;siteID=123112 3DS Max]  ''Note: I don't have any other 3D softwares, I have never really learnt anything else, and I am not really a person to talk to about other software in this catagory.''

The only 3D software I use, comes with a heavy price tag though imo, no trial versions of it unfortunately.

[http://www.renoise.com/download/ Renoise]

This is a great little tool, I prefer it to Madtracker, which is also another great audio sequence tool, but find that for production quality Renoise is superior in render quality (most of the time this is...)

====Helpfull Sites====

[http://modarchive.org/ The Mod Archive]

If your not good with composing music, looking for inspiration in this field, or for any other reason after a tune, this is the place I start, while I have written some musics that were exceptionally good for Multi-Player Online RPGs, I have to restock and totally change my style for UT3, since I am yet to write a piece of music that fits the game, this is my source for my music!

===Planning===

Ironically, I had the tune picked before I had even really decided on a theme for my map, it was industrial erotic which I had found while brainstorming what I was going to make, it has been playing on my computer for about 4 days non-stop now, and is only slightly annoying me, a good sign, as imo it won't get over the top in a UT3 game. If you want to find good music on The Mod Archive, I suggest looking for music which has industrial themes, they tend to fit the game fairly well, and imo supplement the fast paced action, this is just an idea, depending on what you are making, and the themes you choose for the map, you might find a totally different style appeals.

One of the great things I find in life, is that if something really shine through as appealing to yourself, then you will atleast have an audience that will also stirke a chime with your taste (reaching out to inform the audience of your creations presence on the other hand can be troublesome, and hopefully will be covered later).

I had chosen a volcanic theme to my map, but I was tempted to steer away from lava, and dark grey melted rock, choosing more of a sulphur and brimstone look, which I thought was far more original than classic lava.

It was predetermined that the map would occupy a canyon, which was roughly Y shaped, and that it would have an underground measurement and sensor facility below the intersection which could be accessed through 3 small caves that were around the inward pointing side of the canyon (towards the center of the Y).

These caves I had decided would be fairly shallow, and have steel doors to mark the transition from the sulphurous surface, into the underground area, words I thought that would describe the scene where new, shiney, and high tech, I had also given some reflection as to the interior lighting of the level, and was thinking of cold sharp light blue lights, complimented with warmer orange lights, and the occasional small and dull flashing/rotating red alarm lights, which would need to be toned down till they didn't steel the limelight of the rest of the scene.

Above ground, I continued to think about things such as weather and environment, I was opting for a variety, but being carefull about the merging of them, for example, I wanted to include a section in one of the canyons leading out of the Y an area that had lots of steam vents and poor visibility, as well as some shallow briney yellow sulphor pools, as well as perhaps one or two deeper ones, that could be submerged into.

The other two canyon forks I wanted to have a similar feel but with better visibility, I wanted to make narrow walkways up the sides of the canyon walls, with some non-installation caves, though to make them small and simple, just to act as thourough-fares through otherwise imapssible terrain.

As for the time to compleate the project, I had given myself about 3 months to do it, which I thought a reasonable amount of time to achieve at least a Beta product, provided I had little interruptions during the period. I had thought through the possibility of needing more time, and decided that I was to inexperienced in the map creation process to really give an accurate time to compleate.

I wanted a fair amount of custom art in the level too, coming from a prefab hell in the last game I modded, I just couldn't bare the thought of being reduced to making other peoples art works fit my map, if they did, then this was ok, but I highly doubted that much of the existing artwork would match the outdoor region, and the indoor region was also fairly specific too, requiring siesmic sensing equipement.

And this is how I set out.

There were aditionally a few features I wanted in the map, things like earthquakes I thought would be really good, tremors mostly, just the quivering of the ground, the idea braught with the fun idea of placing physics objects in the game, another thing I wanted was to include a random event that would fire roughly once every 15-30 x20 minute deathmatch games ie. about every 5 to 10 hours, this would be a major earth quake, at this present time I am unsure of the exact implementation of this, but intend to learn it as I go.

I now had music, and theme, and a rough idea of how the map looked, it was time to move to specifics...

... I choose to start by making elements of the map rather than the map itself.

===Textures===

I went and did a google search to find images, I wanted some kind of soil, and some mud, considering my theme, I had to choose something that looked like it would fit.

[[Image:Legacy_DMSiesmic_SandImage.jpeg|center|Sand Image]]

[[Image:Legacy_DMSiesmic_MudImage.jpeg|center|Mud Image]]

I wasn't overly thrilled with the images, they were not quite what I had in mind, but I had spent enough time searching, and there was lots yet to be done.

''It should be noted thatI used a lot higher resolution image than shown here''

I used the ISampler function of Texture Maker (see above) to make the textures seemless, it can be found under the tools drop down menu, and is labeled Isampler Resynthesis.

I normally use the following settings, but feel free to tweak it to your hearts desire, ''Note: if you don't already have a seemless texture, make sure the ignore borders checkbox is ticked, otherwise you will get a very ugly texture.

[[Image:Legacy_DMSiesmic_ISampler.jpeg|center|ISampler Resynthesis - Acidsphinx's favourite settings]]

From the above images I made the following textures.

[[Image:Legacy_DMSiesmic_SoilTextureSeemless.jpeg|center|Tileable Seemless Soil Texture made with Texture Maker]]

[[Image:Legacy_DMSiesmic_MudTextureSeemless.jpeg|center|Tileable Seemless Mud Texture made with Texture Maker]]

I could have kept going with the textures, but I decided to change courses here and produce a static mesh to test them out in game, there were reasons for this, and they were that I was not overly happy with this result, I tend to muck around a lot when making things, and you should be aware that changing tasks (and in my case moving around the house between computers) slows things down, effeciency can be important to some people, but I tend to prefer to take my time.

===Static Meshes===

The mesh I wanted to make would use both of these textures, namely it was a steam vent which would eventually have steam pouring from the top of a mound.

I fired up 3DS Max, and roughly modeled what looked like a vent, I started with a plane, broken into a 6x6 grid that measured 256x256 generic units, converted to editable poly, and then started moving the vertices to where I wanted them. ''Tip: to view the divisions between the grid in 3DS Max press F4''

I came up with the following...

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_01.jpeg|center|Part #01 of the steam vent, nothing really to look at yet]]

After this, I added a HSDS modifier and selected the inner region, I'll note now, that I wanted the outside square to remain square, and with a 0 altitude on the z axis, this would make it easier to place when I got into the game, I also went to the lengths to ensure that the center vertex was exactly 256 units high, the ones on the north/east/south/west of it I made 128 units high (kind of like a + shape of vertices were selected and then I moved them to the apropriate height), and the ones on the NE/NW/SE/SW (the x shape of the center) I made 48 units, then I shifted them all in the x-y plane, while keeping the outside vertices in their original location!

After selecting the inner region like so

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_02.jpeg|center|These are the polygons I selected...]]

On the right hand side in the roll out, I then clicked the subdivide button, which smooths the image a lot, this is good, becuase it is supposed to be a steam vent, not a sharp spike in the ground, my next task was to drop the center vertice (the one that was at 256, which you may note is no longer this height) down to the ground, ie a zero on the z axis to produce the center of the steam vent.

I could have aditionally tweaked the vertices, but didn't because I was a little worried about loosing the smooth effect.

After this I selected a different set of polygons, and subdivided again.

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_03.jpeg|center|Basically all that has been done is that the outer 3 polys on each corner have been deslected]]

And on more time with yet another different set of polys.

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_04.jpeg|center|The outer circle of polys was removed this time before subdividing]]

Everything seemed to be going great, I wanted one more level of subdividing, but thought I would manipulate some vertices a bit more at this point, looking at the top of the steam vent I though it was looking pretty flat, and wanted to put some altitude variation into that, after this I selected the following polys and did a final subdivide

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_05.jpeg|center|Notice only a ring is selected, the the 4 center square are not, basically we are just trying to add a final smooth to the altered top of the cone]]

At this point I noticed that the corners of my square had moved in due to the HSDS smoothing modifier, I quickly moved them back to their corners at the proper 128,128 -128,128 128,-128 -128,128 positions, making sure the outside shape remained a perfect square.

I was happy with model, and later did others to produce varience in game.

The task of skinning came next, I chose to use the vertex paint method for a smooth transition from soil to mud, I thought a bit that the terrain itself would, atleast where these vents were, be a mix of mud and other textures anyhow, and that not a spec of solid soil should be seen, I added the vertexpaint modifier.

A new panel pops up, at its top are a few images of cubes, I picked the shaded representation of the vertex colors(the second cube on my version)

A little bit below this, there are 6 more buttons, 3 wide ones on the right, and 3 thin ones on the left, the tooltip reads paint on the top right one, and erase below that, and finally the color picker below that, I chose to use a black, not sure why, it just seemed like the logical choice, we are after all effectivly painting an alpha channel that determines the transparency between our two textures here.

I paint my pattern onto the mesh, merging the two appropriatly to make a smooth transition form the soil ground to the muddy slope and top, I end up with something looking like this

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_06.jpeg|center|The alpha map fades from balck through to white, and represents the opacity of one texture over the other]]

I'm not sure if the next step is actually required, since we are only going to be assigning one material to the mesh, but I'll quickly go through the process anyhow.

In the 3DS Max material editor, found in the top toolbar, designated by 4 spheres coloured red, green, blue and white, select the first material, then click the button that has the label Standard and change it to Multi/Sub Object, it will ask you if you want to discard or keep the material that used to be in slot you have changed, since you need to be taught this, I assume you are new to 3DS Max, and I will recomend you discard, but leave the choice for yourself.

The interface changes dramitcally, click the button labeled Set Number and set it too 1, because we will only be using one material, which will actually be a mix of two textures ;)

Down the bottom of the interface the long list of textures should shrink to contain only the one, click the button which should be labeled something like ''Material #xx ( Standard )'', then change the drop down from Blinn to Phong at the top, UT3 uses phong. and then in the tiny little square button next to the Diffuse color swatch in the Basic Parameters, and select Mix.

Where it say color #1, go to the button labeled none, click it, select bitmap, and then load the soil texture (note the color in the swatch is black, it will replace the black sections we just painted), and then do the same for color #2 except load the mud texture, which should replace the white section of the mesh.

The third one in the list is called Mix Amount, this is the map which determines the pattern of the two textures, you ''could'' use perlin noise for an unpredictable response, but what we want here is the vector color, if you click the square button, you should see Vertex Color about 3rd from the bottom, select it, and we are almost done, climb back out of the mix, to the top texture in the drop down list, and then apply it to the object (by selecting the object and clicking the third button directly below the texture sphere swatches), you won't see the texture in the viewport, but it should be there when we render.

There is one last thing to do, and that is add an edit poly modifier, select the border of the square from underneath, and cap it with the cap button in the roll out. If you see textures fighting after having done this, don't feel to worried, the fact that it will be placed slightly below ground level will totally cover this problem up when we place them in the editor.

When I rendered my one it look like this

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_07.jpeg|center|A simple steam vent]]

I was modestly happy with it, there was room for improvement, and I could take that up with my next few variants, but this was satisfactory for what I wanted.

Now I needed to import it into the game...

===UT3 Mesh Import===

First of all you need to export the mesh from 3DS Max, I'm not going to go into details on how to use the file system, but these are the settings I use for the actuall export... (You need to export as .ASE file (the ascii file format))

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_08.jpeg|center|My export settings, note I have increased the Decimal Precision, while not absolutely nescesary, I like it like that, becuase I tend to always opt for the uber kill quality settings]]

You will notice that I have also in the following example made normal maps, the soil normal map was made by running through some erosion filters in texture maker, then converting it to grey scale, maximizing contrast, and finally being converted to a noraml map by using [http://developer.nvidia.com/object/photoshop_dds_plugins.html Nvidia DDS Tools plugin for Photoshop], this normal map is what will give the texture its rough surfaced 3D look.

[[Image:Legacy_DMSiesmic_Soil_NormalSeemless.jpeg|center|Soil Normal texture]]

[[Image:Legacy_DMSiesmic_Mud_NormalSeemless.jpeg|center|Mud Normal texture]]

Ok, I start up the editor, and when it has loaded, I make a new ''Additive'' level, I save it as '''DM-Test''', I open the generic browser, and click import under the file menu, and select both textures (all 4 in my case because I have normal maps), I also take the time and care not to click OK to all, I have no idea why I do this, it just seems logical to me, but I ensure that the ''CompressionSettings'' drop down is set to TC_Default for regular textures, and ''TC_NormalMap'' for normal maps and I do the same for LODGroup. I also import the mesh. ''I use the package name of '''DM-Test''' note it is identical to the file name'', as for the group, it is like a sub-directory, or a folder to contain various things you import, much like your computers filesystem, it is mainly used for catagorizing the things you import to speed up searching for things, you could just have textures, or you could use DiffuseTextures, NormalMaps, and Meshes as your groups, it really doesn't matter, and is left to personal preference

I make a new material called SteamVent_Mat, and open the material editor and set the following up...

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_09.jpeg|center|A few big things happen here, take a look at the vertexcolor component, it is what determines which pattern will be applied from the vertex painting we done, nothing more really needs to be done except to LERP the two materials together using this pattern, LERP stands for Linear Interpolate, it is a straight ramp from 0.0 to 1.0, as opposed to cubic or sinisoid interpolate, which measure the distance between the two numbers in such a way that the distance between the fractions are not equal, this basically means that there should be no distortion ''(note cubic and sinsoid interpolate don't exist in the material editor, for the point that they are next to useless in the world of textures)''. You will notice I have 3 Lerps, they all use the same VertexColor map, but have different inputs and connect to different functions in the material, the textures are Lerp'd to Diffuse, the normal maps are Lerp'd to Normal, and then I have two constants that are Lerp'd to the Specular, Specular determines the amount of light that bounces back at you, a value of 0.05 is used for the soil, as it drinks the light in and gives little back, the effect gives it a very dull sheen, the mud gets a value of 0.15, giving it a much stronger effects, making it look more like it is wet, ''without some sort of specular lighting, the normal maps are not readily apparent''.]]

I then go to the mesh and open up its properties, the first thing I then do is go back to the generic browser, and select the material we previously made, and apply it to the mesh, this is done by unfolding the properties like so

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_10.jpeg|center|By selecting a material and clicking the green arrow pointing left next to Material, I apply or material to the mesh]]

With the material applied, a few things still need to be done, the next thing on the list is to make a quick collision map, you can find the Collision -&gt; Auto Convex Collision, and use the following settings, there are better ways to do this, which I will probably cover later when we actually import this into more than just a test file.

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_11.jpeg|center|Totally maxed out, and even then honestly not accurate enough for me :(]]

Last thing to do is get a good angle and take a shot for the Generic Browser, this can found under Tool -&gt; Save Thumbnail Angle.

===A quick test level to see our mesh in game===

Ok one more material to paint the ground with is needed, I used this setup...

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_12.jpeg|center|Nothing that exciting...]]

''If over the next bit you only see a black screen in your render viewport, try turning the lighting mode (in the bar across the top of the actual render view port) to unlit mode''

Minimize the Generic Browser, and make a Cube Brush that is X 2048, Y 2048, Z 2

Add the brush, right click it, and then Select All Surfaces, expand the Generic Browser, and apply the texture by selecting the Soil Texture we just made, then select the steam vent, and shut the Generic Browser, right-click on the ground in roughly the middle, Add Actor, and then choose to Add the Static Mesh (should be the one at the top of the list).

Move it to desired location, ensuring that the square base is burried one unit below the ground, you will likely have to drop the drag grid to do this, it is under View in the menu bar, I needed to drop it to one, unless you want real headaches in the process of level desgin, never turn the draw grid off, at least when trying to get things to aline, sometimes, especially with meshes you might have to take it off - just to get that extra look of perfection, but not this time ;)

Finally a light and a sky are needed. Select the Generic Browser again, and go to the tab at the top which is called Actors, slide down to the entry called Light, expand it, and select SkyLight, Right click anywhere on the ground and add the light to illuminate the scene. Go back to the Generic Browser ''(don't forget to move back to the Generic tab at the top)'', and under the file menu, open, and provided you installed to the default place, you will find UN-Sky under the following directory tree, C:/Program Files/Unreal Tournament 3/UT Game/CookedPC/Environments, open it, and then look for it in the list at the bottom left of the Generic Browser, click it, search for a good sky, like S_UN_Sky_SM_SkyDome03, drop it on your terrain with the right click, and add actor that we did with the steam vent (exactly the same), move it down, so that from roughly eye level you can't see the black, the black area causes a wierd feedback when it is visible, it looks horrible, but we are only testing this mesh, not building a level, and this should suffice to view it in the editor.

Up in the top tool bar, click the Build All button (a cube with a light bulb on it) You will prolly get a few warnings, they are unimportant for this task, right click on the ground some where, and go to the option in the drop down menu that reads ''Play From Here (Ctrl Spectates)''

You should have a pretty good idea of how it looks from with in the game now, don't fall off the edge :p

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_13.jpeg|center|Pew Pew Pew!!!]]

As a final thought I decided that 3 variants of the mesh would be required to stop the players eye from bleeding, below is an example of what I made....

[[Image:Legacy_DMSiesmic_3DSMax_SteamVent_14.jpeg|center|A room for testing the steam vents, untweaked lights have been placed to give it a bit of a better feel, the meshes have also been scaled and rotated to add to varience]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DM-Siesmic Canyon Planning</title>
    <id>1090</id>
    <revision>
      <id>2883</id>
      <timestamp>2008-02-22T11:00:39Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Planning===

Ironically, I had the tune picked before I had even really decided on a theme for my map, it was industrial erotic which I had found while brainstorming what I was going to make, it has been playing on my computer for about 4 days non-stop now, and is only slightly annoying me, a good sign, as imo it won't get over the top in a UT3 game. If you want to find good music on The Mod Archive, I suggest looking for music which has industrial themes, they tend to fit the game fairly well, and imo supplement the fast paced action, this is just an idea, depending on what you are making, and the themes you choose for the map, you might find a totally different style appeals.

One of the great things I find in life, is that if something really shine through as appealing to yourself, then you will atleast have an audience that will also stirke a chime with your taste (reaching out to inform the audience of your creations presence on the other hand can be troublesome, and hopefully will be covered later).

I had chosen a volcanic theme to my map, but I was tempted to steer away from lava, and dark grey melted rock, choosing more of a sulphur and brimstone look, which I thought was far more original than classic lava.

It was predetermined that the map would occupy a canyon, which was roughly Y shaped, and that it would have an underground measurement and sensor facility below the intersection which could be accessed through 3 small caves that were around the inward pointing side of the canyon (towards the center of the Y).

These caves I had decided would be fairly shallow, and have steel doors to mark the transition from the sulphurous surface, into the underground area, words I thought that would describe the scene where new, shiney, and high tech, I had also given some reflection as to the interior lighting of the level, and was thinking of cold sharp light blue lights, complimented with warmer orange lights, and the occasional small and dull flashing/rotating red alarm lights, which would need to be toned down till they didn't steel the limelight of the rest of the scene.

Above ground, I continued to think about things such as weather and environment, I was opting for a variety, but being carefull about the merging of them, for example, I wanted to include a section in one of the canyons leading out of the Y an area that had lots of steam vents and poor visibility, as well as some shallow briney yellow sulphor pools, as well as perhaps one or two deeper ones, that could be submerged into.

The other two canyon forks I wanted to have a similar feel but with better visibility, I wanted to make narrow walkways up the sides of the canyon walls, with some non-installation caves, though to make them small and simple, just to act as thourough-fares through otherwise imapssible terrain.

As for the time to compleate the project, I had given myself about 3 months to do it, which I thought a reasonable amount of time to achieve at least a Beta product, provided I had little interruptions during the period. I had thought through the possibility of needing more time, and decided that I was to inexperienced in the map creation process to really give an accurate time to compleate.

I wanted a fair amount of custom art in the level too, coming from a prefab hell in the last game I modded, I just couldn't bare the thought of being reduced to making other peoples art works fit my map, if they did, then this was ok, but I highly doubted that much of the existing artwork would match the outdoor region, and the indoor region was also fairly specific too, requiring siesmic sensing equipement.

And this is how I set out.

There were aditionally a few features I wanted in the map, things like earthquakes I thought would be really good, tremors mostly, just the quivering of the ground, the idea braught with the fun idea of placing physics objects in the game, another thing I wanted was to include a random event that would fire roughly once every 15-30 x20 minute deathmatch games ie. about every 5 to 10 hours, this would be a major earth quake, at this present time I am unsure of the exact implementation of this, but intend to learn it as I go.

I now had music, and theme, and a rough idea of how the map looked, it was time to move to specifics...

... I choose to start by making elements of the map rather than the map itself.</text>
    </revision>
    <revision>
      <id>2884</id>
      <timestamp>2008-02-22T10:44:15Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==DM Siesmic Canyon==

===Planning===

Ironically, I had the tune picked before I had even really decided on a theme for my map, it was industrial erotic which I had found while brainstorming what I was going to make, it has been playing on my computer for about 4 days non-stop now, and is only slightly annoying me, a good sign, as imo it won't get over the top in a UT3 game. If you want to find good music on The Mod Archive, I suggest looking for music which has industrial themes, they tend to fit the game fairly well, and imo supplement the fast paced action, this is just an idea, depending on what you are making, and the themes you choose for the map, you might find a totally different style appeals.

One of the great things I find in life, is that if something really shine through as appealing to yourself, then you will atleast have an audience that will also stirke a chime with your taste (reaching out to inform the audience of your creations presence on the other hand can be troublesome, and hopefully will be covered later).

I had chosen a volcanic theme to my map, but I was tempted to steer away from lava, and dark grey melted rock, choosing more of a sulphur and brimstone look, which I thought was far more original than classic lava.

It was predetermined that the map would occupy a canyon, which was roughly Y shaped, and that it would have an underground measurement and sensor facility below the intersection which could be accessed through 3 small caves that were around the inward pointing side of the canyon (towards the center of the Y).

These caves I had decided would be fairly shallow, and have steel doors to mark the transition from the sulphurous surface, into the underground area, words I thought that would describe the scene where new, shiney, and high tech, I had also given some reflection as to the interior lighting of the level, and was thinking of cold sharp light blue lights, complimented with warmer orange lights, and the occasional small and dull flashing/rotating red alarm lights, which would need to be toned down till they didn't steel the limelight of the rest of the scene.

Above ground, I continued to think about things such as weather and environment, I was opting for a variety, but being carefull about the merging of them, for example, I wanted to include a section in one of the canyons leading out of the Y an area that had lots of steam vents and poor visibility, as well as some shallow briney yellow sulphor pools, as well as perhaps one or two deeper ones, that could be submerged into.

The other two canyon forks I wanted to have a similar feel but with better visibility, I wanted to make narrow walkways up the sides of the canyon walls, with some non-installation caves, though to make them small and simple, just to act as thourough-fares through otherwise imapssible terrain.

As for the time to compleate the project, I had given myself about 3 months to do it, which I thought a reasonable amount of time to achieve at least a Beta product, provided I had little interruptions during the period. I had thought through the possibility of needing more time, and decided that I was to inexperienced in the map creation process to really give an accurate time to compleate.

I wanted a fair amount of custom art in the level too, coming from a prefab hell in the last game I modded, I just couldn't bare the thought of being reduced to making other peoples art works fit my map, if they did, then this was ok, but I highly doubted that much of the existing artwork would match the outdoor region, and the indoor region was also fairly specific too, requiring siesmic sensing equipement.

And this is how I set out.

There were aditionally a few features I wanted in the map, things like earthquakes I thought would be really good, tremors mostly, just the quivering of the ground, the idea braught with the fun idea of placing physics objects in the game, another thing I wanted was to include a random event that would fire roughly once every 15-30 x20 minute deathmatch games ie. about every 5 to 10 hours, this would be a major earth quake, at this present time I am unsure of the exact implementation of this, but intend to learn it as I go.

I now had music, and theme, and a rough idea of how the map looked, it was time to move to specifics...

... I choose to start by making elements of the map rather than the map itself.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DMMutator</title>
    <id>942</id>
    <revision>
      <id>2564</id>
      <timestamp>2006-01-05T01:30:19Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; DMMutator (Package: Botpack)}}

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; DMMutator (Package: UnrealGame)}}

This is used as the BaseMutator in most game types.

==Properties in UT==
; [[Legacy:DeathMatchPlus|DeathMatchPlus]] MyGame : A link to the [[Legacy:GameInfo (UT)|GameInfo (UT)]] (&lt;code&gt;Level.Game&lt;/code&gt;). This variable is set in PostBeginPlay and is used in CheckReplacement.

==Properties in UT200x==
; float AirControl (globalconfig) : Air control. Obsolete in UT2004.
; bool bBrightSkins (globalconfig) : Use Epic bright skins for UT2003 models. Not available in earlier patches of UT2003, enabled by default in UT2004 and doesn't affect the newer models.
; bool bMegaSpeed (globalconfig) : Higher game speed. Obsolete in UT2004.

==Functionality in UT==

DMMutator replaces Unreal items, weapons and ammo with UT versions. The bAutoActivate property of all [[Legacy:Inventory (UT)|Inventory (UT)]] items is set to True.

The mutator also prevents other mutators from changing [[Legacy:StationaryPawn|StationaryPawn]]s (through AlwaysKeep), sets the NetUpdateFrequency of [[Legacy:TorchFlame|TorchFlame]]s to 0.5 and raises the speed of players by 40% in Turbo game mode.

==Functionality in UT200x==

DMMutator handles the air control setting and Epic's bright skins as well as a turbo mode like in UT. This mega speed mode can't be activated through the in-game GUI, though.

==Known Subclasses (UT)==
* [[Legacy:EnhancedItems/EIDMMutator|EnhancedItems/EIDMMutator]]
* JBMutator ([[Legacy:Jailbreak|Jailbreak]])
* RABaseMutator (Rocket Arena)
* ScramBaseMutator (Slave Master)

==Known Subclasses (UT2003)==
* [[Legacy:InvasionMutator|InvasionMutator]] (Epic Bonuspack 1)
* [[Legacy:MutLastManStanding|MutLastManStanding]] (Epic Bonuspack 1)
* [[Legacy:DB_Mutator|DB_Mutator]] (Deathball)

==Known Subclasses (UT2004)==
* [[Legacy:ASMutator|ASMutator]]
* [[Legacy:InvasionMutator|InvasionMutator]]
* [[Legacy:MutLastManStanding|MutLastManStanding]]
* [[Legacy:ONSDefaultMut|ONSDefaultMut]]

==Discussion==

'''Ben2500:''' Is this how you make a mutator into a gametype?

'''Wormbo:''' Basically the GameInfo.Mutator setting tells the gametype, which BaseMutator it should use. There's always a BaseMutator in a game and it has slightly more functionality than regular mutators. The BaseMutator should be subclasses from DMMutator and takes care of all the tasks a GameInfo subclass can't handle. Sometimes you will also want to make a base [[Legacy:GameRules|GameRules]] class, but keep in mind that only actors with &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; can be spawned before the BaseMutator is successfully registered. Also it's a good idea to declare the base mutator class with the keywords CacheExempt and HideDropDown in UT2004 because they should never show up in the mutator list and should never be added manuall by a user.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2565</id>
      <timestamp>2004-04-01T10:41:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; DMMutator (Package: Botpack)}}

and

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; DMMutator (Package: UnrealGame)}}

This is used as the BaseMutator in most game types.

==Properties in UT ==
; [[Legacy:DeathMatchPlus|DeathMatchPlus]] MyGame : A link to the [[Legacy:GameInfo (UT)|GameInfo (UT)]] (&lt;code&gt;Level.Game&lt;/code&gt;). This variable is set in PostBeginPlay and is used in CheckReplacement.

==Properties in UT2003 ==
; float AirControl (globalconfig) : 
; bool bBrightSkins (globalconfig) : (not in earlier patches)
; bool bMegaSpeed (globalconfig) : 

==Functionality in UT ==

DMMutator replaces Unreal items, weapons and ammo with UT versions. The bAutoActivate property of all [[Legacy:Inventory (UT)|Inventory (UT)]] items is set to True.

The mutator also prevents other mutators from changing [[Legacy:StationaryPawn|StationaryPawn]]s (through AlwaysKeep), sets the NetUpdateFrequency of [[Legacy:TorchFlame|TorchFlame]]s to 0.5 and raises the speed of players by 40% in Turbo game mode.

==Functionality in UT2003 ==

DMMutator handles the air control setting and Epic's bright skins as well as a turbo mode like in UT. This mega speed mode can't be activated through the in-game GUI, though.

==Known Subclasses (UT) ==
* [[Legacy:EnhancedItems|EIDMMutator]] ([[Legacy:EnhancedItems|EnhancedItems]])
* JBMutator ([[Legacy:Jailbreak|Jailbreak]])
* RABaseMutator (Rocket Arena)
* ScramBaseMutator (Slave Master)

==Known Subclasses (UT2003) ==
* [[Legacy:InvasionMutator|InvasionMutator]] (Epic Bonuspack 1)
* [[Legacy:MutLastManStanding|MutLastManStanding]] (Epic Bonuspack 1)
* [[Legacy:DB_Mutator|DB_Mutator]] (Deathball)

==Known Subclasses (UT2004)==
* [[Legacy:ASMutator|ASMutator]]
* [[Legacy:InvasionMutator|InvasionMutator]]
* [[Legacy:MutLastManStanding|MutLastManStanding]]
* [[Legacy:ONSDefaultMut|ONSDefaultMut]]

==Discussion==

'''Ben2500:''' Is this how you make a mutator into a gametype?

'''Wormbo:''' Basically the GameInfo.Mutator setting tells the gametype, which BaseMutator it should use. There's always a BaseMutator in a game and it has slightly more functionality than regular mutators. The BaseMutator should be subclasses from DMMutator and takes care of all the tasks a GameInfo subclass can't handle. Sometimes you will also want to make a base [[Legacy:GameRules|GameRules]] class, but keep in mind that only actors with &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; can be spawned before the BaseMutator is successfully registered. Also it's a good idea to declare the base mutator class with the keywords CacheExempt and HideDropDown in UT2004 because they should never show up in the mutator list and should never be added manuall by a user.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2566</id>
      <timestamp>2004-12-23T08:30:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; DMMutator (Package: Botpack)}}

and

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; DMMutator (Package: UnrealGame)}}

This is used as the BaseMutator in most game types.

==Properties in UT ==
; [[Legacy:DeathMatchPlus|DeathMatchPlus]] MyGame : A link to the [[Legacy:GameInfo (UT)|GameInfo (UT)]] (&lt;code&gt;Level.Game&lt;/code&gt;). This variable is set in PostBeginPlay and is used in CheckReplacement.

==Properties in UT200x ==
; float AirControl (globalconfig) : Air control. Obsolete in UT2004.
; bool bBrightSkins (globalconfig) : Use Epic bright skins for UT2003 models. Not available in earlier patches of UT2003, enabled by default in UT2004 and doesn't affect the newer models.
; bool bMegaSpeed (globalconfig) : Higher game speed. Obsolete in UT2004.

==Functionality in UT ==

DMMutator replaces Unreal items, weapons and ammo with UT versions. The bAutoActivate property of all [[Legacy:Inventory (UT)|Inventory (UT)]] items is set to True.

The mutator also prevents other mutators from changing [[Legacy:StationaryPawn|StationaryPawn]]s (through AlwaysKeep), sets the NetUpdateFrequency of [[Legacy:TorchFlame|TorchFlame]]s to 0.5 and raises the speed of players by 40% in Turbo game mode.

==Functionality in UT2003 ==

DMMutator handles the air control setting and Epic's bright skins as well as a turbo mode like in UT. This mega speed mode can't be activated through the in-game GUI, though.

==Known Subclasses (UT) ==
* [[Legacy:EnhancedItems/EIDMMutator|EnhancedItems/EIDMMutator]]
* JBMutator ([[Legacy:Jailbreak|Jailbreak]])
* RABaseMutator (Rocket Arena)
* ScramBaseMutator (Slave Master)

==Known Subclasses (UT2003) ==
* [[Legacy:InvasionMutator|InvasionMutator]] (Epic Bonuspack 1)
* [[Legacy:MutLastManStanding|MutLastManStanding]] (Epic Bonuspack 1)
* [[Legacy:DB_Mutator|DB_Mutator]] (Deathball)

==Known Subclasses (UT2004)==
* [[Legacy:ASMutator|ASMutator]]
* [[Legacy:InvasionMutator|InvasionMutator]]
* [[Legacy:MutLastManStanding|MutLastManStanding]]
* [[Legacy:ONSDefaultMut|ONSDefaultMut]]

==Discussion==

'''Ben2500:''' Is this how you make a mutator into a gametype?

'''Wormbo:''' Basically the GameInfo.Mutator setting tells the gametype, which BaseMutator it should use. There's always a BaseMutator in a game and it has slightly more functionality than regular mutators. The BaseMutator should be subclasses from DMMutator and takes care of all the tasks a GameInfo subclass can't handle. Sometimes you will also want to make a base [[Legacy:GameRules|GameRules]] class, but keep in mind that only actors with &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; can be spawned before the BaseMutator is successfully registered. Also it's a good idea to declare the base mutator class with the keywords CacheExempt and HideDropDown in UT2004 because they should never show up in the mutator list and should never be added manuall by a user.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DMMutator (P2)</title>
    <id>1057</id>
    <revision>
      <id>2813</id>
      <timestamp>2004-10-10T09:36:10Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; DMMutator (P2) (Package: MultiBase)}}

[[Legacy:Postal 2|Postal 2]]'s version of the [[Legacy:DMMutator|DMMutator]].

==Properties ==

===GlobalConfig ===
;bool bMegaSpeed: Mega Speed setting, functions the same as in [[Legacy:UT2003|UT2003]]'s [[Legacy:DMMutator|DMMutator]].
;float AirControl: Air Control setting, functions the same as in [[Legacy:UT2003|UT2003]]'s [[Legacy:DMMutator|DMMutator]].

==Related Topics ==
* [[Legacy:DMMutator|DMMutator]]
* [[Legacy:XMutator (P2)|xMutator (P2)]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2814</id>
      <timestamp>2004-05-29T00:04:19Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:DMMutator (P2)|DMMutator (P2)]]}}

[[Legacy:Postal 2|Postal 2]]'s version of the [[Legacy:DMMutator|DMMutator]].

==Properties ==

===GlobalConfig ===
;bool bMegaSpeed: Mega Speed setting, functions the same as in [[Legacy:UT2003|UT2003]]'s [[Legacy:DMMutator|DMMutator]].
;float AirControl: Air Control setting, functions the same as in [[Legacy:UT2003|UT2003]]'s [[Legacy:DMMutator|DMMutator]].

==Related Topics ==
* [[Legacy:DMMutator|DMMutator]]
* [[Legacy:XMutator (P2)|xMutator (P2)]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DOM</title>
    <id>943</id>
    <revision>
      <id>2567</id>
      <timestamp>2002-09-11T11:46:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>redirect to [[Domination]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Domination|Domination]]</text>
    </revision>
    <revision>
      <id>2568</id>
      <timestamp>2002-04-03T12:08:48Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Domination (DOM):'' Standard Unreal Tournament [[Legacy:Gametypes|game type]]. Three or four control points are scattered in a map; a team gains control over a control point by one of its team members touching it. Each team scores continuously according to the number of control points held. The first team to hit the score limit wins.

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mapping]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DUc0N</title>
    <id>1022</id>
    <revision>
      <id>2741</id>
      <timestamp>2003-10-27T18:51:43Z</timestamp>
      <contributor>
        <ip>DUc0N</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">This is the page of the inevitable dUc0N (Ignore the man behind the curtain.)

Atari and Epic have a strange relationship with me. They're my favorite companies for supporting Linux, but my least favorite for not supporting Linux with dev tools.

Contact info:

Email - raptor105@cox.net or dUc0N@starsclan.com

Instant messengers: AIM rapt0r105 / MSN raptor105@cox.net / Y!M raptor105y / ICQ 158353120 / JABBER raptor105@eifelansinn.net

Conventions: When uploading images, I'll try to put my name, the tutorial name, or both in front of the image name. Any image with '''GL''' in front is what I call a &quot;global&quot; image, or one that I expect to be commonly used (things like toolbar buttons, etc).

Link to the mother of all mine mutators that I'm going to try and make: [[Legacy:DUc0N/MineMode|dUc0N/MineMode]]

'''''If you have anything to say to/about me, feel free to say it here:'''''

'''Mosquito:''' hello, and why am I so great?

'''Wormbo:''' Welcome to the wiki. :)

'''MythOpus:''' :cheesy: Welcome to the UNREAL Wiki ;)

'''Tarquin:''' Hi &amp; welcome :)

'''GRAF1K:''' Welcome to the wiki, DUcON. :tup: Note that everyone is always free to use whatever anyone else puts up here; it is a wiki after all. :-)

&lt;font size=&quot;1&quot;&gt;(I look forward to those basic Ued tutes. When I try to write them, I assume the reader has used Ued for years as I have.) :P&lt;/font&gt;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2742</id>
      <timestamp>2003-10-21T22:08:25Z</timestamp>
      <contributor>
        <ip>DUc0N</ip>
      </contributor>
      <comment>Added conventions</comment>
      <text xml:space="preserve">This is the page of the inevitable dUc0N (Ignore the man behind the curtain.)

Atari and Epic have a strange relationship with me. They're my favorite companies for supporting Linux, but my least favorite for not supporting Linux with dev tools.

Contact info:

Email - raptor105@cox.net or dUc0N@starsclan.com

Instant messengers: AIM rapt0r105 / MSN raptor105@cox.net / Y!M raptor105y / ICQ 158353120 / JABBER raptor105@eifelansinn.net

Conventions: When uploading images, I'll try to put my name, the tutorial name, or both in front of the image name. Any image with '''GL''' in front is what I call a &quot;global&quot; image, or one that I expect to be commonly used, and anyone is of course free to reuse any of my images as they see fit. The GL images are things like toolbar buttons, etc.

'''''If you have anything to say to/about me, feel free to say it here:'''''

'''Mosquito:''' hello, and why am I so great?

'''Wormbo:''' Welcome to the wiki. :)

'''MythOpus:''' :cheesy: Welcome to the UNREAL Wiki ;)

'''Tarquin:''' Hi &amp; welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2743</id>
      <timestamp>2003-10-21T23:30:29Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>Welcome</comment>
      <text xml:space="preserve">This is the page of the inevitable dUc0N (Ignore the man behind the curtain.)

Atari and Epic have a strange relationship with me. They're my favorite companies for supporting Linux, but my least favorite for not supporting Linux with dev tools.

Contact info:

Email - raptor105@cox.net or dUc0N@starsclan.com

Instant messengers: AIM rapt0r105 / MSN raptor105@cox.net / Y!M raptor105y / ICQ 158353120 / JABBER raptor105@eifelansinn.net

Conventions: When uploading images, I'll try to put my name, the tutorial name, or both in front of the image name. Any image with '''GL''' in front is what I call a &quot;global&quot; image, or one that I expect to be commonly used, and anyone is of course free to reuse any of my images as they see fit. The GL images are things like toolbar buttons, etc.

'''''If you have anything to say to/about me, feel free to say it here:'''''

'''Mosquito:''' hello, and why am I so great?

'''Wormbo:''' Welcome to the wiki. :)

'''MythOpus:''' :cheesy: Welcome to the UNREAL Wiki ;)

'''Tarquin:''' Hi &amp; welcome :)

'''GRAF1K:''' Welcome to the wiki, DUcON. :tup: Note that everyone is always free to use whatever anyone else puts up here; it is a wiki after all. :-)

&lt;font size=&quot;1&quot;&gt;(I look forward to those basic Ued tutes. When I try to write them, I assume the reader has used Ued for years as I have.) :P&lt;/font&gt;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DUc0N/MineMode</title>
    <id>1030</id>
    <revision>
      <id>2754</id>
      <timestamp>2003-11-09T20:09:44Z</timestamp>
      <contributor>
        <ip>Hsdbrg142-165-228-32.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the project page for the upcoming MineMode mutator by [[Legacy:DUc0N|dUc0N]].

===People I need for this project:===

At the moment, I'm only doing a simple, watered-down version for simplicity. Thus, I only need someone to make a neat-looking mine launcher skin to use (credit will of course be given, all views of the launcher are needed (first, second, and pickup views?)). I'll also need models for the mines themselves (see below). Just post here or email me at dUc0N@starsclan.com if you're interested :)

===The plan:===

====First version (the oversimplified one)====

For the first version of the mutator, these will be the features:
*Weapon replaces the shield gun (for simplicity, see below)
*Primary fire is a proximity mine, will be decently visible, trigger range around 250 UUs, similar splash damage to a flak shell, sticks to walls/ceilings.
*Secondary fire would be a laser trip mine, visible beam, also sticks to walls/ceilings, 1000-1500 UU trigger range in a straight line from the top of the mine (i.e. if the beam is broken), detonates into a flak-style blast in the same direction as the beam.
*Maximum 5 of each type of mine down for '''each''' player (to avoid mine spamming ;))
*Mines ignore attempts to destroy them (for simplicity)
*Will not replace pickups (player will spawn with the weapon and decent ammo, for simplicity)

====The final version (aka my evil plan to rule the world)====

This is what I hope to do eventually:
*FULLY Configurable (These will all be features, but will be disableable :)
**Change which weapon it replaces, or if it becomes a superweapon (place it after the Redeemer, for example)
**Set max mines per player
**Scale damage levels from 25-400% for each fire mode
**Scale reaction ranges from 0-1000% for each fire mode
**Choose which fire modes are available as primary and alternate fire (choosing from proximity mine, laser trip mine, remote mine, timed mine, small sentry cannon, perhaps others), can configure alt fire to nothing to restrict players to one mine type
**Option to disable all other weaponry (not individually, just as a single option)
**Placed mines are destroyable when dealt a configurable amount of damage
**Mines expire after a configurable time limit and either explode or disappear at that time
*Where the original mine won't be animated, the finished proximity mine will be
*Laser trip mine beams will match team color
*Will add projectile-in-flight effects if not already present
*Anything else that comes to mind

The idea is not so much to make the mutator too exhaustive to actually make, but to start with a simple version, then enhance it until it's a GREAT version.

==Project Roster:==

[[Legacy:DUc0N|dUc0N]] - Project lead

[[Legacy:MythOpus|MythOpus]] - Development version modelling

&lt;i&gt;To be added to the project, just email dUc0N@starsclan.com or post a comment and tell me what you'd like to do to help. Areas I '''need''' people will start coming up once I'm past version 0.1 (the super-simple one).

==Project Journal:==

'''dUc0N - 10/27:''' Well, time to start researching the wonderful world of UnrealScript :)... If anyone comes up with a niftier name don't hesitate to tell me PLEASE.

'''dUc0N - 10/31:''' Now, after a few days of intermittently working on weapon mods, I've managed to change the assault rifle into a strange creation that fires biosludge on primary, and fires primary-style link blasts on secondary (yet fires them rapidly enough that it looks like they could be touching in midair). Keep tinkering :)

'''dUc0N - 11/6:''' Sadly, I've come to the realization that I won't be able to finish this mod myself. I really wanted to ''finish'' this project, but there are a couple reasons that this isn't possible. 1) I used to use two installations of UT2003, one under winXP to code for, and tamper with, the other being under Linux as the playable, not-messed-with version. Can't do that anymore. 2) I am in fact leaving in early January to go into the Air Force, and work in IT Security. This will REALLY put a hole in my free time. I just can't see where I'll be able to learn while coding, and work for Uncle Sam at the same time. So, regrettable as it is, I'm forced to give this one up. If anyone wants to pick up this project (I do still think it's a really, really neat idea, so long as it's properly executed), you're more than welcome, and I may even be able to assume a small development role, but I can't run the show anymore. ''~d''

==Comments:==

'''MythOpus:'''  Myth Man can help with the Mine model :)  The weapon model however (the animation at least) isn't my cup of tea :cheesy:

'''dUc0N:''' Well, this is the oversimplified development phase, so the weapon certainly doesn't have to be animated. In fact, just a very simple model would be alright, I just can't do it myself because I stink at it :P

'''MythOpus:''' Mr. Myth has got the mine model ready... any idea on what you want your weapon to look like?

'''dUc0N:''' Not really... just something futuristic that looks like it was designed to launch mines. Um... when you say Mr. Myth, you ''are'' talking about yourself, right? Weirding me out :p

'''MythOpus:''' LoL, k, I got just the idea :)  Yes, I call myself Mr. Myth, Myth Man and countless other names, but they do all refer to me :)

'''MythOpus:''' Well, Hey, I guess I can take the code of your hands if you can't finish it :cheesy:

'''dUc0N:''' Well, all I was really able to accomplish is to be able to modify the built-in weapon properties. I don't really have any &quot;code&quot; per say, but if you want I can clarify some of the properties for weapons. (I may have been able to entirely replace one of the default weapons with a different one, but still don't know how to accomplish it with a mutator.)

'''MythOpus:''' Thanks, but I already got all that stuff.  I've madea lot of weapons and mutators and such :)</text>
    </revision>
    <revision>
      <id>2755</id>
      <timestamp>2003-11-09T16:24:20Z</timestamp>
      <contributor>
        <ip>DUc0N</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the project page for the upcoming MineMode mutator by [[Legacy:DUc0N|dUc0N]].

===People I need for this project:===

At the moment, I'm only doing a simple, watered-down version for simplicity. Thus, I only need someone to make a neat-looking mine launcher skin to use (credit will of course be given, all views of the launcher are needed (first, second, and pickup views?)). I'll also need models for the mines themselves (see below). Just post here or email me at dUc0N@starsclan.com if you're interested :)

===The plan:===

====First version (the oversimplified one)====

For the first version of the mutator, these will be the features:
*Weapon replaces the shield gun (for simplicity, see below)
*Primary fire is a proximity mine, will be decently visible, trigger range around 250 UUs, similar splash damage to a flak shell, sticks to walls/ceilings.
*Secondary fire would be a laser trip mine, visible beam, also sticks to walls/ceilings, 1000-1500 UU trigger range in a straight line from the top of the mine (i.e. if the beam is broken), detonates into a flak-style blast in the same direction as the beam.
*Maximum 5 of each type of mine down for '''each''' player (to avoid mine spamming ;))
*Mines ignore attempts to destroy them (for simplicity)
*Will not replace pickups (player will spawn with the weapon and decent ammo, for simplicity)

====The final version (aka my evil plan to rule the world)====

This is what I hope to do eventually:
*FULLY Configurable (These will all be features, but will be disableable :)
**Change which weapon it replaces, or if it becomes a superweapon (place it after the Redeemer, for example)
**Set max mines per player
**Scale damage levels from 25-400% for each fire mode
**Scale reaction ranges from 0-1000% for each fire mode
**Choose which fire modes are available as primary and alternate fire (choosing from proximity mine, laser trip mine, remote mine, timed mine, small sentry cannon, perhaps others), can configure alt fire to nothing to restrict players to one mine type
**Option to disable all other weaponry (not individually, just as a single option)
**Placed mines are destroyable when dealt a configurable amount of damage
**Mines expire after a configurable time limit and either explode or disappear at that time
*Where the original mine won't be animated, the finished proximity mine will be
*Laser trip mine beams will match team color
*Will add projectile-in-flight effects if not already present
*Anything else that comes to mind

The idea is not so much to make the mutator too exhaustive to actually make, but to start with a simple version, then enhance it until it's a GREAT version.

==Project Roster:==

[[Legacy:DUc0N|dUc0N]] - Project lead

[[Legacy:MythOpus|MythOpus]] - Development version modelling

&lt;i&gt;To be added to the project, just email dUc0N@starsclan.com or post a comment and tell me what you'd like to do to help. Areas I '''need''' people will start coming up once I'm past version 0.1 (the super-simple one).

==Project Journal:==

'''dUc0N - 10/27:''' Well, time to start researching the wonderful world of UnrealScript :)... If anyone comes up with a niftier name don't hesitate to tell me PLEASE.

'''dUc0N - 10/31:''' Now, after a few days of intermittently working on weapon mods, I've managed to change the assault rifle into a strange creation that fires biosludge on primary, and fires primary-style link blasts on secondary (yet fires them rapidly enough that it looks like they could be touching in midair). Keep tinkering :)

'''dUc0N - 11/6:''' Sadly, I've come to the realization that I won't be able to finish this mod myself. I really wanted to ''finish'' this project, but there are a couple reasons that this isn't possible. 1) I used to use two installations of UT2003, one under winXP to code for, and tamper with, the other being under Linux as the playable, not-messed-with version. Can't do that anymore. 2) I am in fact leaving in early January to go into the Air Force, and work in IT Security. This will REALLY put a hole in my free time. I just can't see where I'll be able to learn while coding, and work for Uncle Sam at the same time. So, regrettable as it is, I'm forced to give this one up. If anyone wants to pick up this project (I do still think it's a really, really neat idea, so long as it's properly executed), you're more than welcome, and I may even be able to assume a small development role, but I can't run the show anymore. ''~d''

==Comments:==

'''MythOpus:'''  Myth Man can help with the Mine model :)  The weapon model however (the animation at least) isn't my cup of tea :cheesy:

'''dUc0N:''' Well, this is the oversimplified development phase, so the weapon certainly doesn't have to be animated. In fact, just a very simple model would be alright, I just can't do it myself because I stink at it :P

'''MythOpus:''' Mr. Myth has got the mine model ready... any idea on what you want your weapon to look like?

'''dUc0N:''' Not really... just something futuristic that looks like it was designed to launch mines. Um... when you say Mr. Myth, you ''are'' talking about yourself, right? Weirding me out :p

'''MythOpus:''' LoL, k, I got just the idea :)  Yes, I call myself Mr. Myth, Myth Man and countless other names, but they do all refer to me :)

'''MythOpus:''' Well, Hey, I guess I can take the code of your hands if you can't finish it :cheesy:

'''dUc0N:''' Well, all I was really able to accomplish is to be able to modify the built-in weapon properties. I don't really have any &quot;code&quot; per say, but if you want I can clarify some of the properties for weapons. (I may have been able to entirely replace one of the default weapons with a different one, but still don't know how to accomplish it with a mutator.)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DX</title>
    <id>1043</id>
    <revision>
      <id>2783</id>
      <timestamp>2004-02-05T13:18:06Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>#REDIRECT [[Deus Ex]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Deus Ex|Deus Ex]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DXF File</title>
    <id>961</id>
    <revision>
      <id>2608</id>
      <timestamp>2005-12-01T02:27:27Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A '''DXF''' file is a 3D graphic image file originally created by AutoDesk which stores 3D scenes and models. Popular 3D programs (such as [[Legacy:3D Studio Max|3D Studio Max]]) can export geometry using the DXF file format for easy importation into UnrealED.

==Related Topics==
* [[Legacy:File Format|File Format]]
* [[Legacy:Brush Exporting And Importing|Brush Exporting and Importing]]</text>
    </revision>
    <revision>
      <id>2609</id>
      <timestamp>2002-07-21T15:51:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A '''DXF''' file is a 3D graphic image file originally created by AutoDesk which stores 3D scenes and models. Popular 3D programs (such as [[Legacy:3D Studio Max|3D Studio Max]]) can export geometry using the DXF file format for easy importation into UnrealED.

===Related Articles===
* [[Legacy:File Format|File Format]]
*[[Legacy:Brush Exporting And Importing|Brush Exporting and Importing]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DXT</title>
    <id>939</id>
    <revision>
      <id>2558</id>
      <timestamp>2007-08-30T17:11:13Z</timestamp>
      <contributor>
        <ip>Sopa De Letras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''DXT''', or '''DXTC''', is a type of [[Legacy:Texture Compression|texture compression]].

According to the UDN docs:

{{innerbox| DXTC is the native, compressed texture format used in [[Wikipedia:DirectX]] 8. In many cases, DXTC reduces texture memory usage by 50% or more over palettized, 8-bit textures, allowing for twice the textures at the same resolution, or the same number of textures at twice the resolution. Three DXTC formats are available. 

}}

There are several types of DXT compression offered by DirectX 8/9:
; DXT1: 0 or 1 bit alpha
; DXT2: Explicit 4-bit alpha, color data is premultiplied by alpha &amp;ndash; '''UnrealEd does not use this format'''
; DXT3: Explicit 4-bit alpha, not premultiplied
; DXT4: Interpolated alpha, color data is premultiplied by alpha &amp;ndash; '''UnrealEd does not use this format'''
; DXT5: Interpolated alpha, not premultiplied

In DXT compression, images are divided into 4x4 pixel blocks, or &quot;texels&quot;.  For each texel, two color values are chosen to represent the range of pixel colors within that block, and then each pixel is mapped to one of four possible colors (two bits) within that range.  The compressed texel is represented by the two 16-bit color values, and 16 2-bit pixel values, totalling 64 bits of data per texel, amounting to an overall image size of 4 bits per pixel.

Alpha (transparency) information in DXT is handled in one of several ways, depending on the DXT format.  In DXT1, each texel can either be defined as having four possible color values within the range (as described above), or alternately three color values and one value indicating &quot;this pixel is transparent&quot;.  Thus, in DXT1, one can have at most 1-bit (on or off) transparency in the image, but even this is done at the expense of some color information.  '''Note:''' DXT1 transparency is supported by the Engine and UnrealEd but you can't use UnrealEd GUI to create DXT1 textures with one-bit alpha.  Textures converted to DXT1 have all transparency information removed.

In DXT2/3/4/5, Alpha information is specified using a second 64-bit block for each texel (thus doubling the image size).  In DXT2/3, for each pixel, four bits are used to indicate its alpha, providing 16 different transparency levels.  DXT4/5 uses a method similar to the way color data is stored to provide &quot;interpolated&quot; alpha information: Two (8-bit) alpha values are chosen representing the range of transparency in that texel, and then for each pixel, three bits are used to represent its transparency within that defined range (This allows much better for subtle gradations, but can have less precision for large ranges within a texel).

In DXT2 and DXT4, the pixel color values are multiplied by the alpha values before compressing (so partially transparent pixels have a color value stored darker than it shows onscreen, and completely transparent pixels always have a color value of black in the compressed texture).  This can speed up some types of compositing operations, but it has the side-effect of losing color information, and can result in uglier DXT compression for some types of textures.  In any case, alpha premultiplication is not supported by current Unreal Engine versions, so DXT2 and DXT4 are not options for texture formats in UnrealEd (so you can forget they exist).

==Which DXT Compression to Use?==

Obviously, there are some trade-offs between the different formats which make them better or worse for different types of images.  Some general rules of thumb for good use of DXT textures are as follows:

# If your image has no alpha, use DXT1 compression.  Using DXT3/5 will double your image size over DXT1 and not gain anything.
# If your image has 1-bit (on or off) alpha information, use DXT1 with one-bit alpha. If the DXT1 image quality is too low and you don't mind doubling image size, use DXT3 or DXT5 (which one doesn't matter, they'll give the same results). 
# If your image has smooth gradations of alpha (fading in/out slowly), DXT5 is almost certainly your best bet, as it will give you the most accurate transparency representation.
# If your image has sharp transitions between multiple alpha levels (one pixel is 100%, the next one is 50%, and another neighbor is 12%), DXT3 is probably your best bet.  You may want to compare the alpha results in DXT1, DXT3 and DXT5 compression, however, to make sure.

==Notes==

In UnrealEd 3, RGBA8 and P8 textures can be compressed to DXT1, DXT3, or DXT5 by right-clicking on the texture in the [[Legacy:Texture Browser|Texture Browser]] and selecting from the &quot;Compress&quot; option of the pop-up menu.  Once compressed to DXT, the compression type cannot be changed in UnrealEd.

UnrealEd exports DXT textures as .DDS (Microsoft DirectDraw Surface) files.  Most software does not handle this file format, so you will need conversion tools such as the [[Legacy:Nvidia Texture Tools|Nvidia Texture Tools]] to convert these files into a form usable by other graphics applications.

==Resources==

* [[Legacy:Nvidia Texture Tools|Nvidia Texture Tools]] has links to texture conversion tools, PhotoShop plug-ins, etc. for dealing with DXT/DDS data.
* Epic's version of the [[Legacy:Nvidia Texture Tools|Nvidia Texture Tools]] package: http://udn.epicgames.com/pub/Content/TextureSpecifications/DXT_TOOLS.zip
* [[Legacy:The GIMP|The GIMP]] also has a plugin which can handle DXT-compressed DDS images.

==Related Topics ==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture Format|Texture Format]]
* [[Legacy:Texture Compression|Texture Compression]]
* [[Legacy:S3TC|S3TC]]

==External Links==

[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/ProgrammingGuide/GettingStarted/Direct3DTextures/compressed/alphatextures.asp Microsoft Documentation on DXT Compression]

==Comments==

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2559</id>
      <timestamp>2005-11-20T12:06:08Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <comment>Adding link to GIMP; plugin following...</comment>
      <text xml:space="preserve">'''DXT''', or '''DXTC''', is a type of [[Legacy:Texture Compression|texture compression]].

According to the UDN docs:

{{innerbox| DXTC is the native, compressed texture format used in [[Wikipedia:DirectX]] 8. In many cases, DXTC reduces texture memory usage by 50% or more over palettized, 8-bit textures, allowing for twice the textures at the same resolution, or the same number of textures at twice the resolution. Three DXTC formats are available. 

}}

There are several types of DXT compression offered by DirectX 8/9:
; DXT1: 0 or 1 bit alpha
; DXT2: Explicit 4-bit alpha, color data is premultiplied by alpha &amp;ndash; '''UnrealEd does not use this format'''
; DXT3: Explicit 4-bit alpha, not premultiplied
; DXT4: Interpolated alpha, color data is premultiplied by alpha &amp;ndash; '''UnrealEd does not use this format'''
; DXT5: Interpolated alpha, not premultiplied

In DXT compression, images are divided into 4x4 pixel blocks, or &quot;texels&quot;.  For each texel, two color values are chosen to represent the range of pixel colors within that block, and then each pixel is mapped to one of four possible colors (two bits) within that range.  The compressed texel is represented by the two 16-bit color values, and 16 2-bit pixel values, totalling 64 bits of data per texel, amounting to an overall image size of 4 bits per pixel.

Alpha (transparency) information in DXT is handled in one of several ways, depending on the DXT format.  In DXT1, each texel can either be defined as having four possible color values within the range (as described above), or alternately three color values and one value indicating &quot;this pixel is transparent&quot;.  Thus, in DXT1, one can have at most 1-bit (on or off) transparency in the image, but even this is done at the expense of some color information.  '''Note:''' DXT1 transparency is supported by the Engine and UnrealEd but you can't use UnrealEd GUI to create DXT1 textures with one-bit alpha.  Textures converted to DXT1 have all transparency information removed.

In DXT2/3/4/5, Alpha information is specified using a second 64-bit block for each texel (thus doubling the image size).  In DXT2/3, for each pixel, four bits are used to indicate its alpha, providing 16 different transparency levels.  DXT4/5 uses a method similar to the way color data is stored to provide &quot;interpolated&quot; alpha information: Two (8-bit) alpha values are chosen representing the range of transparency in that texel, and then for each pixel, three bits are used to represent its transparency within that defined range (This allows much better for subtle gradations, but can have less precision for large ranges within a texel).

In DXT2 and DXT4, the pixel color values are multiplied by the alpha values before compressing (so partially transparent pixels have a color value stored darker than it shows onscreen, and completely transparent pixels always have a color value of black in the compressed texture).  This can speed up some types of compositing operations, but it has the side-effect of losing color information, and can result in uglier DXT compression for some types of textures.  In any case, alpha premultiplication is not supported by current Unreal Engine versions, so DXT2 and DXT4 are not options for texture formats in UnrealEd (so you can forget they exist).

==Which DXT Compression to Use?==

Obviously, there are some trade-offs between the different formats which make them better or worse for different types of images.  Some general rules of thumb for good use of DXT textures are as follows:

# If your image has no alpha, use DXT1 compression.  Using DXT3/5 will double your image size over DXT1 and not gain anything.
# If your image has 1-bit (on or off) alpha information, use DXT1 with one-bit alpha. If the DXT1 image quality is too low and you don't mind doubling image size, use DXT3 or DXT5 (which one doesn't matter, they'll give the same results). 
# If your image has smooth gradations of alpha (fading in/out slowly), DXT5 is almost certainly your best bet, as it will give you the most accurate transparency representation.
# If your image has sharp transitions between multiple alpha levels (one pixel is 100%, the next one is 50%, and another neighbor is 12%), DXT3 is probably your best bet.  You may want to compare the alpha results in DXT1, DXT3 and DXT5 compression, however, to make sure.

==Notes==

In UnrealEd 3, RGBA8 and P8 textures can be compressed to DXT1, DXT3, or DXT5 by right-clicking on the texture in the [[Legacy:Texture Browser|Texture Browser]] and selecting from the &quot;Compress&quot; option of the pop-up menu.  Once compressed to DXT, the compression type cannot be changed in UnrealEd.

UnrealEd exports DXT textures as .DDS (Microsoft DirectDraw Surface) files.  Most software does not handle this file format, so you will need conversion tools such as the [[Legacy:Nvidia Texture Tools|Nvidia Texture Tools]] to convert these files into a form usable by other graphics applications.

==Resources==

* [[Legacy:Nvidia Texture Tools|Nvidia Texture Tools]] has links to texture conversion tools, PhotoShop plug-ins, etc. for dealing with DXT/DDS data.
* Epic's version of the [[Legacy:Nvidia Texture Tools|Nvidia Texture Tools]] package: http://udn.epicgames.com/pub/Content/TextureSpecifications/DXT_TOOLS.zip
* [[Legacy:The GIMP|The GIMP]] also has a plugin which can handle DXT-compressed DDS images.

==Related Topics ==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Texture Format|Texture Format]]
* [[Legacy:Texture Compression|Texture Compression]]

==External Links==

[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/ProgrammingGuide/GettingStarted/Direct3DTextures/compressed/alphatextures.asp Microsoft Documentation on DXT Compression]

==Comments==

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dace</title>
    <id>1081</id>
    <revision>
      <id>2867</id>
      <timestamp>2006-01-28T15:46:54Z</timestamp>
      <contributor>
        <ip>Dace</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

I do many things in the unreal engine (mostly UT2004), but what I specialise in is mapping.

I have created many maps for UT2004, some good, some average, and some really bad ones too :)

I come from the Republic of South Africa, and one of my driving interests in life is designing games and content for them. I have been making maps for the unreal engine for the past few years, and recently I have taught myself the basics of Unrealscript as well.

;HomePage:http://dace.unreal.co.za/

----

===My Maps===

====For UT2003:====
**DM-Shaft (Based on a map I made for UT99.)
**DM-Wisp 
**DM-DeltaStation 
**DM-GammaStation
**DM-1on1-Alpha

====For UT2004:====
**DM-1on1-Phoenix
**DM-1on1-PhoenixSE
**ONS-Twilight (MSUC Honourable mention. Pity it crashes servers :()
**ONS-TwilightSE (Which didn't fix the crash bug after all)
**DM-Bastion
**DM-1on1-Rift (Completed, but not released.)
**ONS-HUT-Nexus (Made for Project Torlan.)

----

===Current Projects===

====Oblivion====

I am currently working on a Single Player Mod entitled 'Oblivion'. I am working on it by myself, so it may take quite some time. However, I find it very interesting to work on, and I am confident that it will see completion.

It already features some basic custom AI, which can patrol, search and fight reasonably well. It already features a custom main menu and a small portion of the first level.

There are many other features already, but for now, they are a surprise :)

It is my desire to design a Single player game where you can choose to be stealthy or not, much like Deus Ex.

I hope that it lives up to my expectations (what I have working so far has already surpassed my expectations)

It should be noted that Oblivion is based on Parser's SP Framework (http://fraghouse.beyondunreal.com/)

While it is true that Oblivion barely resembles anything in the SP Framework any more, it is equally true that Oblivion would not exist where it not for the Framework which underlies everything. Not to mention the fact that it inspired me to actually start that 'mod I've always wanted to make' :). Thanks Parser!

The name, 'Oblivion' will be changed as soon as I can think of another name. I want to avoid any possible confusion between my mod and the new game, 'Elder Scrolls IV: Oblivion'.

I may also write a bit of a developers journal, if anyone would be interested in reading it. I have written a lot of code for the mod, some of which may be useful to other modders/mappers. Perhaps I will post some of it here.

====Gunship (CTF)====

Gunship is a CTF map set largely in the barrel of an enormous starship's main weapon. The idea is that the starship is a 'Gunship', a ship designed around a massive weapon with one purpose in mind. I have temporarily halted work on Gunship so that I can work on Oblivion (which is far more interesting at the moment.)

----

I'd like to add some more to this page at a later date, but that's it for now :)

----

==Guestbook==

'''Tarquin:''' Welcome to unreal wiki :)

'''Dace:''' Thanks :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2868</id>
      <timestamp>2005-10-25T21:34:14Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

I do many things in the unreal engine (mostly UT2004), but what I specialise in is mapping.

I have created many maps for UT2004, some good, some average, and some really bad ones too :)

I come from the Republic of South Africa, and one of my driving interests in life is designing games and content for them. I have been making maps for the unreal engine for the past few years, and recently I have taught myself the basics of Unrealscript as well.

;HomePage:http://dace.unreal.co.za/

----

===My Maps===

====For UT2003:====
**DM-Shaft (Based on a map I made for UT99.)
**DM-Wisp 
**DM-DeltaStation 
**DM-GammaStation
**DM-1on1-Alpha

====For UT2004:====
**DM-1on1-Phoenix
**DM-1on1-PhoenixSE
**ONS-Twilight (MSUC Honourable mention. Pity it crashes servers :()
**ONS-TwilightSE (Which didn't fix the crash bug after all)
**DM-Bastion
**DM-1on1-Rift (Completed, but not released.)
**ONS-HUT-Nexus (Made for Project Torlan.)

----

===Current Projects===

====Exams====

I am writing some pretty hectic exams at the moment, so my projects have slowed quite substantially.

====Oblivion====

I am currently working on a Single Player Mod entitled 'Oblivion'. I am working on it by myself, so it may take quite some time. However, I find it very interesting to work on, and I am confident that it will see completion.

It already features some basic custom AI, which can patrol, search and fight reasonably well. It already features a custom main menu and a small portion of the first level.

There are many other features already, but for now, they are a surprise :)

It is my desire to design a Single player game where you can choose to be stealthy or not, much like Deus Ex.

I hope that it lives up to my expectations (what I have working so far has already surpassed my expectations)

It should be noted that Oblivion is based on Parser's SP Framework (http://fraghouse.beyondunreal.com/)

While it is true that Oblivion barely resembles anything in the SP Framework any more, it is equally true that Oblivion would not exist where it not for the Framework which underlies everything. Not to mention the fact that it inspired me to actually start that 'mod I've always wanted to make' :). Thanks Parser!

====Gunship (CTF)====

Gunship is a CTF map set largely in the barrel of an enormous starship's main weapon. The idea is that the starship is a 'Gunship', a ship designed around a massive weapon with one purpose in mind. I have temporarily halted work on Gunshop so that I can work on Oblivion (which is far more interesting at the moment.)

----

I'd like to add some more to this page at a later date, but that's it for now :)

----

==Guestbook==

'''Tarquin:''' Welcome to unreal wiki :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2869</id>
      <timestamp>2005-11-05T12:52:44Z</timestamp>
      <contributor>
        <ip>Dace</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

I do many things in the unreal engine (mostly UT2004), but what I specialise in is mapping.

I have created many maps for UT2004, some good, some average, and some really bad ones too :)

I come from the Republic of South Africa, and one of my driving interests in life is designing games and content for them. I have been making maps for the unreal engine for the past few years, and recently I have taught myself the basics of Unrealscript as well.

;HomePage:http://dace.unreal.co.za/

----

===My Maps===

====For UT2003:====
**DM-Shaft (Based on a map I made for UT99.)
**DM-Wisp 
**DM-DeltaStation 
**DM-GammaStation
**DM-1on1-Alpha

====For UT2004:====
**DM-1on1-Phoenix
**DM-1on1-PhoenixSE
**ONS-Twilight (MSUC Honourable mention. Pity it crashes servers :()
**ONS-TwilightSE (Which didn't fix the crash bug after all)
**DM-Bastion
**DM-1on1-Rift (Completed, but not released.)
**ONS-HUT-Nexus (Made for Project Torlan.)

----

===Current Projects===

====Exams====

I am writing some pretty hectic exams at the moment, so my projects have slowed quite substantially.

====Oblivion====

I am currently working on a Single Player Mod entitled 'Oblivion'. I am working on it by myself, so it may take quite some time. However, I find it very interesting to work on, and I am confident that it will see completion.

It already features some basic custom AI, which can patrol, search and fight reasonably well. It already features a custom main menu and a small portion of the first level.

There are many other features already, but for now, they are a surprise :)

It is my desire to design a Single player game where you can choose to be stealthy or not, much like Deus Ex.

I hope that it lives up to my expectations (what I have working so far has already surpassed my expectations)

It should be noted that Oblivion is based on Parser's SP Framework (http://fraghouse.beyondunreal.com/)

While it is true that Oblivion barely resembles anything in the SP Framework any more, it is equally true that Oblivion would not exist where it not for the Framework which underlies everything. Not to mention the fact that it inspired me to actually start that 'mod I've always wanted to make' :). Thanks Parser!

====Gunship (CTF)====

Gunship is a CTF map set largely in the barrel of an enormous starship's main weapon. The idea is that the starship is a 'Gunship', a ship designed around a massive weapon with one purpose in mind. I have temporarily halted work on Gunship so that I can work on Oblivion (which is far more interesting at the moment.)

----

I'd like to add some more to this page at a later date, but that's it for now :)

----

==Guestbook==

'''Tarquin:''' Welcome to unreal wiki :)

'''Dace:''' Thanks :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33558</id>
      <timestamp>2008-12-05T22:40:17Z</timestamp>
      <contributor>
        <username>AceldEldom</username>
        <id>1710</id>
      </contributor>
      <minor/>
      <comment>eldronracde</comment>
      <text xml:space="preserve">ouboclidele
===About Me===

I do many things in the unreal engine (mostly UT2004), but what I specialise in is mapping.

I have created many maps for UT2004, some good, some average, and some really bad ones too :)

I come from the Republic of South Africa, and one of my driving interests in life is designing games and content for them. I have been making maps for the unreal engine for the past few years, and recently I have taught myself the basics of Unrealscript as well.

;HomePage:http://dace.unreal.co.za/

----

===My Maps===

====For UT2003:====
**DM-Shaft (Based on a map I made for UT99.)
**DM-Wisp 
**DM-DeltaStation 
**DM-GammaStation
**DM-1on1-Alpha

====For UT2004:====
**DM-1on1-Phoenix
**DM-1on1-PhoenixSE
**ONS-Twilight (MSUC Honourable mention. Pity it crashes servers :()
**ONS-TwilightSE (Which didn't fix the crash bug after all)
**DM-Bastion
**DM-1on1-Rift (Completed, but not released.)
**ONS-HUT-Nexus (Made for Project Torlan.)

----

===Current Projects===

====Oblivion====

I am currently working on a Single Player Mod entitled 'Oblivion'. I am working on it by myself, so it may take quite some time. However, I find it very interesting to work on, and I am confident that it will see completion.

It already features some basic custom AI, which can patrol, search and fight reasonably well. It already features a custom main menu and a small portion of the first level.

There are many other features already, but for now, they are a surprise :)

It is my desire to design a Single player game where you can choose to be stealthy or not, much like Deus Ex.

I hope that it lives up to my expectations (what I have working so far has already surpassed my expectations)

It should be noted that Oblivion is based on Parser's SP Framework (http://fraghouse.beyondunreal.com/)

While it is true that Oblivion barely resembles anything in the SP Framework any more, it is equally true that Oblivion would not exist where it not for the Framework which underlies everything. Not to mention the fact that it inspired me to actually start that 'mod I've always wanted to make' :). Thanks Parser!

The name, 'Oblivion' will be changed as soon as I can think of another name. I want to avoid any possible confusion between my mod and the new game, 'Elder Scrolls IV: Oblivion'.

I may also write a bit of a developers journal, if anyone would be interested in reading it. I have written a lot of code for the mod, some of which may be useful to other modders/mappers. Perhaps I will post some of it here.

====Gunship (CTF)====

Gunship is a CTF map set largely in the barrel of an enormous starship's main weapon. The idea is that the starship is a 'Gunship', a ship designed around a massive weapon with one purpose in mind. I have temporarily halted work on Gunship so that I can work on Oblivion (which is far more interesting at the moment.)

----

I'd like to add some more to this page at a later date, but that's it for now :)

----

==Guestbook==

'''Tarquin:''' Welcome to unreal wiki :)

'''Dace:''' Thanks :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33560</id>
      <timestamp>2008-12-05T23:39:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/AceldEldom|AceldEldom]] ([[User talk:AceldEldom|Talk]]); changed back to last version by [[User:Dace|Dace]]</comment>
      <text xml:space="preserve">===About Me===

I do many things in the unreal engine (mostly UT2004), but what I specialise in is mapping.

I have created many maps for UT2004, some good, some average, and some really bad ones too :)

I come from the Republic of South Africa, and one of my driving interests in life is designing games and content for them. I have been making maps for the unreal engine for the past few years, and recently I have taught myself the basics of Unrealscript as well.

;HomePage:http://dace.unreal.co.za/

----

===My Maps===

====For UT2003:====
**DM-Shaft (Based on a map I made for UT99.)
**DM-Wisp 
**DM-DeltaStation 
**DM-GammaStation
**DM-1on1-Alpha

====For UT2004:====
**DM-1on1-Phoenix
**DM-1on1-PhoenixSE
**ONS-Twilight (MSUC Honourable mention. Pity it crashes servers :()
**ONS-TwilightSE (Which didn't fix the crash bug after all)
**DM-Bastion
**DM-1on1-Rift (Completed, but not released.)
**ONS-HUT-Nexus (Made for Project Torlan.)

----

===Current Projects===

====Oblivion====

I am currently working on a Single Player Mod entitled 'Oblivion'. I am working on it by myself, so it may take quite some time. However, I find it very interesting to work on, and I am confident that it will see completion.

It already features some basic custom AI, which can patrol, search and fight reasonably well. It already features a custom main menu and a small portion of the first level.

There are many other features already, but for now, they are a surprise :)

It is my desire to design a Single player game where you can choose to be stealthy or not, much like Deus Ex.

I hope that it lives up to my expectations (what I have working so far has already surpassed my expectations)

It should be noted that Oblivion is based on Parser's SP Framework (http://fraghouse.beyondunreal.com/)

While it is true that Oblivion barely resembles anything in the SP Framework any more, it is equally true that Oblivion would not exist where it not for the Framework which underlies everything. Not to mention the fact that it inspired me to actually start that 'mod I've always wanted to make' :). Thanks Parser!

The name, 'Oblivion' will be changed as soon as I can think of another name. I want to avoid any possible confusion between my mod and the new game, 'Elder Scrolls IV: Oblivion'.

I may also write a bit of a developers journal, if anyone would be interested in reading it. I have written a lot of code for the mod, some of which may be useful to other modders/mappers. Perhaps I will post some of it here.

====Gunship (CTF)====

Gunship is a CTF map set largely in the barrel of an enormous starship's main weapon. The idea is that the starship is a 'Gunship', a ship designed around a massive weapon with one purpose in mind. I have temporarily halted work on Gunship so that I can work on Oblivion (which is far more interesting at the moment.)

----

I'd like to add some more to this page at a later date, but that's it for now :)

----

==Guestbook==

'''Tarquin:''' Welcome to unreal wiki :)

'''Dace:''' Thanks :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Daemonica</title>
    <id>981</id>
    <revision>
      <id>2650</id>
      <timestamp>2003-11-09T23:51:54Z</timestamp>
      <contributor>
        <ip>Daemonica</ip>
      </contributor>
      <minor/>
      <comment>* Added URL for ShadowHunter</comment>
      <text xml:space="preserve">Well looks like I'm here now. I've used Wiki for ages... I like it ;)

==Links==
;[http://www.sanffo.co.uk Clan SANFFO]:Unreal Tournament Clan
;[http://undying.sanffo.co.uk The Undying Curse]:Multiplayer Project, based on Clive Barkers Undying

==Projects==

I'm only working on two projects at the moment.
;[http://www.sanffo.co.uk/shadowhunter/ Shadow Hunter]:A simple UT Mod which turns out to be like Mutant from UT2003, but with some changes.
;[http://undying.sanffo.co.uk The Undying Curse]:A Total Conversion for UT2003 to create a haunting gameplay element in line with [http://undying.ea.com Clive Barker's Undying]

==Problems I'm working on==

I've moved these off to their own pages, it was getting a little crowded here!

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Current_Problems]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Previous_Problems]]

----

'''Tarquin:''' Hi &amp; welcome to the the site :D

'''Daemonica:''' Thanks Tarquin, i've been using the Wiki for ages... now I'm repeating myself ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2651</id>
      <timestamp>2003-11-09T22:53:22Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well looks like I'm here now. I've used Wiki for ages... I like it ;)

==Links==
;[http://www.sanffo.co.uk Clan SANFFO]:Unreal Tournament Clan
;[http://undying.sanffo.co.uk The Undying Curse]:Multiplayer Project, based on Clive Barkers Undying

==Projects==

I'm only working on two projects at the moment. A simple UT Mod called Shadow Hunter, which turns out to be like Mutant from UT2003, but with some changes, and the Undying Curse which is a much larger project, more of a Total conversion to create a haunting gameplay element in line with [http://undying.ea.com Clive Barker's Undying]

==Problems I'm working on==

===Menu Music===

How to change the music that plays when the [[Legacy:GUIPage|GUIPage]] Main Menu is shown.

====Why am I working on this problem====

Because of [http://undying.sanffo.co.ul The Undying Curse] which is now a UT2003 Mod, playing the default KR-UT2003-Menu music just doesn't have the right feel.

'''Foxpaw:''' This might be a bit tricky to explain, depending on how well you understand the Unreal Engine, but here's the skinny:

There is always at least one, and at most two levels loaded in any given instance of an Unreal Engine game. The first level is generally referred to as the &quot;Entry&quot; level. The second level is the one that you generally play in, and is the one that is changed by the '''servertravel''' and '''start''' console commands.

The Entry level is loaded when the Engine starts, and cannot change to a different level or be unloaded in any way. (That's not '''entirely''' true, but generally speaking..) You can still play in it, it is a level in every respect, but generally for performance reasons (since it's going to be running at the same time as the map you're playing on) it is generally just a subtracted cube without any bells and whistles in it.

Now, one level or the other is &quot;screened out&quot; depending on the context. If the &quot;active&quot; level is the entry level, your input will go to your controller in that level, etc. It's almost like having a completely separate instance of the game, but it isn't really.

Now, how this relates to your question: when you first start UT2003, the &quot;Entry&quot; level is loaded. The music you hear during the menu, is actually just the level's music. When the context switches to another level, you no longer hear sounds from the &quot;entry&quot; level and start hearing them from the other level.

So: to change the menu music you have to change the entry level. The entry level for UT2003 is in your maps directory, and is called Entry.UT2. Make a copy of it, and name it whatever you like, then open it and change the map's music. Then you'll have to make a copy of UT2003.ini, and in it change the reference to Entry.UT2 to your map. (it might just be entry, I don't remember if the UT2 gets appended automatically or not) You will then have to run UT2003 with a commandline parameter to read your modified ini instead of the default UT2003.ini. Most mods that do this also include a batch file so that you don't have to manually specify the command line argument.

'''Daid303:''' Well, I tried to change the entry level, but I didn't have any luck. It just kept using the default Entry.ut2. So I made this crappy hack:&lt;USCRIPT&gt;function InitComponent(GUIController MyController, GUIComponent MyOwner)

{

	Super.InitComponent(MyController, MyOwner);

	//Hack

	Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;

}&lt;/USCRIPT&gt;in my mainmenu class.

'''Foxpaw:''' Hmm, it works fine on my mod. I use the &quot;Entry&quot; level as the workshop where you design your vehicles. That way you can very quickly switch back and forth between the combat simulator and the design level. It seems to have worked fine for me.

===Useable Actors===

How do I check to see if an [[Legacy:Actor|Actor]] is useable (i.e. It has a function UsedBy(Pawn User))

====Why am I working on this problem====

I need a way of highlighting useable actors on the HUD, however there is now bUseable variable, defined in Actor (or something similar). The reason I need to check this is that these usable items include pickups, triggers &amp; decorations!

'''Foxpaw:''' I don't believe that there is any way to check if it &quot;has&quot; the UsedBy function, because every actor has it. (I think) What you CAN do, however, is have every &quot;useable&quot; think spawn an invisible &quot;tag&quot; that points to that object. Then, when you want to highlight the actors that are &quot;useable,&quot; you can iterate through all of your &quot;tags&quot; and you will essentially have a list of all the things that should be highlighted.

===Locally Viewed Actors===

How to work out if an [[Legacy:Actor (UT)|Actor (UT)]] is being viewed on the local players view. In other words making an object hidden to some people, but visible to others.

====Why am I working on this problem====

Because of [http://undying.sanffo.co.uk The Undying Curse] where players have access to a spell called Scrye, which allows them to see hidden objects. I only want people who are actually 'Scrying' to be able to see the objects without effecting anyone else's perception of the world around them. My head hurts after this ;)

'''Foxpaw:''' I think I may have a solution to this problem, if you are still seeking one.. One way of course would be to have it client-side - you could put it in the objects Tick function to be executed client side - if they are scrying, bHidden is set to false, otherwise it is set to true. Of course, since it's client side it could probrably be hacked.. but if the actor is considered relevant to the network and is being replicated it could likely be hacked in the same way. If you want it to be client-side and only replicate to people who can see it... well, that could be a doozie. But the client-side implementation probrably wouldn't be too difficult. I don't recall the code to determine whether a given pawn/controller is being controlled by a local player or over a network, but I've seen it around.

'''Daemonica:''' yeah, that's what I've been thinking, it works almost all the way upto Listen Servers, they end up doing weird things due to replication.

'''Daemonica:''' Well, I've moved over to UT2003 now :) Finally, this lil problem has been put on the backburner for now, hopefully I can figure this out so it works on Listen Servers too!

----

'''Tarquin:''' Hi &amp; welcome to the the site :D

'''Daemonica:''' Thanks Tarquin, i've been using the Wiki for ages... now I'm repeating myself ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Daemonica/Current Problems</title>
    <id>1031</id>
    <revision>
      <id>2756</id>
      <timestamp>2005-01-14T03:17:21Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">==Current Problems ==

===Capturing the 'Jump' Key===

How to work out if a player is still holding the 'Jump' key down while in the air

====Why am I working on this problem====

Because of [http://undying.sanffo.co.uk The Undying Curse] where players are able to fly in certain areas. Flight is acheived by holding the 'Jump' key down and moving around following a bFlying style physics.

''T1'': I think that this is in the Manta code. Theres some variable there called bHoldingJump or something. You should check there.</text>
    </revision>
    <revision>
      <id>2757</id>
      <timestamp>2005-01-14T02:50:03Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Daemonica/Previous Problems</title>
    <id>1032</id>
    <revision>
      <id>2758</id>
      <timestamp>2004-09-21T01:17:13Z</timestamp>
      <contributor>
        <ip>Daemonica</ip>
      </contributor>
      <comment>Resolving the 'Scrye' issue</comment>
      <text xml:space="preserve">==Previous Problems ==

I'm considering these problems resolved now :)

===Locally Viewed Actors===

How to work out if an [[Legacy:Actor (UT)|Actor (UT)]] is being viewed on the local players view. In other words making an object hidden to some people, but visible to others.

====Why am I working on this problem====

Because of [http://undying.sanffo.co.uk The Undying Curse] where players have access to a spell called Scrye, which allows them to see hidden objects. I only want people who are actually 'Scrying' to be able to see the objects without effecting anyone else's perception of the world around them. My head hurts after this ;)

'''Foxpaw:''' I think I may have a solution to this problem, if you are still seeking one.. One way of course would be to have it client-side - you could put it in the objects Tick function to be executed client side - if they are scrying, bHidden is set to false, otherwise it is set to true. Of course, since it's client side it could probrably be hacked.. but if the actor is considered relevant to the network and is being replicated it could likely be hacked in the same way. If you want it to be client-side and only replicate to people who can see it... well, that could be a doozie. But the client-side implementation probrably wouldn't be too difficult. I don't recall the code to determine whether a given pawn/controller is being controlled by a local player or over a network, but I've seen it around.

'''Daemonica:''' yeah, that's what I've been thinking, it works almost all the way upto Listen Servers, they end up doing weird things due to replication.

'''Daemonica:''' Well, I've moved over to UT2003 now :) Finally, this lil problem has been put on the backburner for now, hopefully I can figure this out so it works on Listen Servers too!

'''Daemonica:''' Back on this problem now and it's getting there. I'm using a simulated Tick function as explained above but it's only working on the Listen Server/Single player side, client's don't seem to get this right. I'm using the following code

&lt;uscript&gt;
//-----------------------------------------------------------
// UCScryeObject - Any object that is viewable only when
// a player is 'scrying'
// Copyright (C), Undying Curse
//-----------------------------------------------------------
class UCScryeObject extends UCInteractiveItem;

simulated function Tick(float DeltaTime)
{
    local UCPlayer UCLocalPlayer;

    if (Level.NetMode != NM_DedicatedServer)
    {
        UCLocalPlayer = UCPlayer(Level.GetLocalPlayerController());
        if ( UCLocalPlayer != none )
        {
            if ( UCLocalPlayer.bScrying )
                bHidden=false;
            else
                bHidden=true;
        }
    }

}


defaultproperties
{
    bHidden=True
    bNetTemporary=True
    bTearOff=True
}
&lt;/uscript&gt;

I'm assuming the actor is not being replicated to the clients. Should a bAlwaysRelevent be set to true?

''Edit: Full source code now'

'''EntropicLqd:''' As far as I can tell it depends on where the Actor is spawned from.  If the actor is spawned from a function that is called on both the client and server then bAlwaysRelevant doesn't seem to be required.  When an actor is spawned from pure server side code I've always had to set the bAlwaysRelevant flag to True in order to get the Actor to replicate.  This approach has always seemed like a ''hack'' to me and I've always had the feeling that I'm just missing something that everyone else in the world seems to know about.  You'll probably need to ensure that the actor has a SimulatedProxy role.

'''Wormbo:''' When the actor is spawned from a function that's executed on server and clients, you get seperate actors and additionally the server-spawned one could get replicated to the client.

'''Daemonica:''' What happens if the actor is built into the map, how is that spawned? I need an object that is handles 100% by the client (or listen server) to alter it's bHidden property based on the Local Players (Controller) 'bScrying' property

'''Daemonica:''' Been working with the team and the following code is 80% working. It appears that if the server has bHidden=false then the scrying works, otherwise it's the actor remains invisible to everyone. So I hit on the idea of leaving the objects bHidden=false on the server and let the client play around with that to their hears content. In the meantime, use the listen servers LocalPlayerController to become the owner of the object and use bOwnerNoSee on the Listen Server only. Slight problem is, my attempts to set the owner at PostBeginPlay have failed as Level.GetLocalPlayerController() returns none at this time. The latest code is below, the older code is removed :D

&lt;uscript&gt;
//-----------------------------------------------------------
// UCScryeObject - Any object that is viewable only when
// a player is 'scrying'
// Copyright (C), Undying Curse
//-----------------------------------------------------------
class UCScryeObject extends UCInteractiveItem;

function PostNetBeginPlay()
{
    log(&quot;UC-TESTING: Setting Owner for Scrye Object - &quot;$Level.NetMode);
    super.PostNetBeginPlay();
    if (Level.NetMode == NM_ListenServer)
    {
        log(&quot;UC-TESTING: Acknowledged Listen Server, Setting Owner - &quot;$Level.GetLocalPlayerController());
        SetOwner(Level.GetLocalPlayerController());
    }
    log(&quot;UC-TESTING: Scrye Object now owned - &quot;$Owner);

}

simulated function Tick(float DeltaTime)
{
    local UCPlayer UCLocalPlayer;

    if (Level.NetMode != NM_DedicatedServer)
    {
        UCLocalPlayer = UCPlayer(Level.GetLocalPlayerController());
        if ( UCLocalPlayer != none )
        {
            if ( (Level.NetMode == NM_Client) || (Level.NetMode == NM_StandAlone) )
            {
                if ( UCLocalPlayer.bScrying )
                    bHidden=false;
                else
                    bHidden=true;
            }
            else
            {
                bHidden=false;
                if ( UCLocalPlayer.bScrying )
                    bOwnerNoSee=false;
                else
                    bOwnerNoSee=true;
            }
        }
    }

}

defaultproperties
{
    RemoteRole=ROLE_SimulatedProxy
    bHidden=False
    bOwnerNoSee=True
}
&lt;/uscript&gt;

'''Lilguy:''' You could always put the code that sets the owner in the tick function, and set it once the player controller is not none...Not sureif that will help, but it's an idea...It seems like you'll run into trouble if you change the value of bHidden on the listen server, because the value of the variable will be replicated to all the clients (Unless you set bSkipActorPropertyReplicationto true, but you might not want to do that)

It seems like an easy solution to all this would be to ensure that the entities are owned by the person who's &quot;scrying&quot;, and then put something like this in the tick function:

&lt;uscript&gt;

simulated function tick(float dt){
   UCLocalPlayer = UCPlayer(Level.GetLocalPlayerController());
   if ( UCLocalPlayer != none ){
        bVisible = (Owner == UCLocalPlayer);
      }
}

&lt;/uscript&gt;

That way, even though bVisible would be replicated as true if the listen server player was &quot;Scrying&quot;, the clients would immediately set the value to false, and they wouldn't be drawn. Hope that helps you...

'''Daemonica:''' Problem with making the object owned by the 'scrying' player is any number of players can be 'scrying' at the same time. Setting the visibility using my code above now works fine on the client-side and single player, the Listen server is causing the problem. I tried to set the owner in PreBeginPlay, PostBeginPlay, PostNetBeginPlay and the simulated Tick, but to no avail, the SetOwner(UCLocalPlayer) doesn't seem to do anything :(

'''Foxpaw:''' I wouldn't worry about the owner stuff - the reason your previous code wasn't working is because if an actor has bHidden true and is not owned by the player in question, it is not considered relevant. The reason why it works on a dedicated server but not a listen server is clear. (to me :D )

If it's on a dedicated server that whole code bunch gets skipped. bHidden remains false, and the actor remains relevant. If it's a listen server, that bit doesn't get skipped, and if the local player can't see it, it's bHidden true, and thus not replicated.

Okay, now the fix. It's easy. There's two main ways to control whether something is drawn or not. bHidden is one way. It is tied into replication, which is usually what you want, but in this case it's not. The other way is to set it's drawtype DT_None. Also, Tick probrably isn't the best place for it, but I can't think of a better one off the top of my head so maybe there's no better choice. So basically:

&lt;uscript&gt;
//-----------------------------------------------------------
// UCScryeObject - Any object that is viewable only when
// a player is 'scrying'
// Copyright (C), Undying Curse
//-----------------------------------------------------------
class UCScryeObject extends UCInteractiveItem;

var EDrawType RealDrawType;

simulated function Tick(float DeltaTime)
{
  local UCPlayer UCLocalPlayer;

  Super.Tick( Delta );

// If it's a dedicated server, Level.GetLocalPlayerController()
// will return None, so the dedicated server check was
// redundant.
  UCLocalPlayer = UCPlayer(Level.GetLocalPlayerController());
  if ( UCLocalPlayer != none )
  {
    if ( UCLocalPlayer.bScrying )
    {
      // Spare yourself some clock cycles by not setting
      // drawtype every tick.
      if ( DrawType == DT_None )
        SetDrawType( RealDrawType );
    }
    else if ( DrawType != DT_None )
      SetDrawType( DT_None );
  }
}

defaultproperties
{
    bHidden=True
    bNetTemporary=True
    bTearOff=True
}
&lt;/uscript&gt;

'''Daemonica:''' Of course, makes perfect sense now, I'll give this a go, but looks good here. I totally forgot about drawtypes :D

'''Angel Mapper''' MadNad did something similar to this with Excessive Overkill's night vision.  It drew an exact replica of players and vehicles on the HUD with a custom texture to make them appear brighter.  You could ask him for the code, I'm sure he'll let you use it.

'''Daemonica:''' We've changed our minds on how this will work. It's going to be an 'Area of effect' now so if one person casts it, everyone will be effected. It's not ideal and could change if we can ever work it out, but for now my head hurts!

===Menu Music===

How to change the music that plays when the [[Legacy:GUIPage|GUIPage]] Main Menu is shown.

'''Tarquin:''' If you've resolved this, could you write up the results on [[Legacy:GUIPage|GUIPage]] please? The same goes for other things: please incorporate results into the main body of the wiki :)

'''Daemonica:''' Good point, these has been added to [[Legacy:GUIPage|GUIPage]] hopefully clear enough, any suggestions where the tracing information should go? Probably somewhere near the trace function I suspect?

====Why am I working on this problem====

Because of [http://undying.sanffo.co.ul The Undying Curse] which is now a UT2003 Mod, playing the default KR-UT2003-Menu music just doesn't have the right feel.

'''Foxpaw:''' This might be a bit tricky to explain, depending on how well you understand the Unreal Engine, but here's the skinny:

There is always at least one, and at most two levels loaded in any given instance of an Unreal Engine game. The first level is generally referred to as the &quot;Entry&quot; level. The second level is the one that you generally play in, and is the one that is changed by the '''servertravel''' and '''start''' console commands.

The Entry level is loaded when the Engine starts, and cannot change to a different level or be unloaded in any way. (That's not '''entirely''' true, but generally speaking..) You can still play in it, it is a level in every respect, but generally for performance reasons (since it's going to be running at the same time as the map you're playing on) it is generally just a subtracted cube without any bells and whistles in it.

Now, one level or the other is &quot;screened out&quot; depending on the context. If the &quot;active&quot; level is the entry level, your input will go to your controller in that level, etc. It's almost like having a completely separate instance of the game, but it isn't really.

Now, how this relates to your question: when you first start UT2003, the &quot;Entry&quot; level is loaded. The music you hear during the menu, is actually just the level's music. When the context switches to another level, you no longer hear sounds from the &quot;entry&quot; level and start hearing them from the other level.

So: to change the menu music you have to change the entry level. The entry level for UT2003 is in your maps directory, and is called Entry.UT2. Make a copy of it, and name it whatever you like, then open it and change the map's music. Then you'll have to make a copy of UT2003.ini, and in it change the reference to Entry.UT2 to your map. (it might just be entry, I don't remember if the UT2 gets appended automatically or not) You will then have to run UT2003 with a commandline parameter to read your modified ini instead of the default UT2003.ini. Most mods that do this also include a batch file so that you don't have to manually specify the command line argument.

'''Daid303:''' Well, I tried to change the entry level, but I didn't have any luck. It just kept using the default Entry.ut2. So I made this crappy hack:&lt;USCRIPT&gt;function InitComponent(GUIController MyController, GUIComponent MyOwner)

{

	Super.InitComponent(MyController, MyOwner);

	//Hack

	Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;

}&lt;/USCRIPT&gt;in my mainmenu class.

'''Foxpaw:''' Hmm, it works fine on my mod. I use the &quot;Entry&quot; level as the workshop where you design your vehicles. That way you can very quickly switch back and forth between the combat simulator and the design level. It seems to have worked fine for me.

'''Daemonica:''' I encountered the same problems as Daid303, My own copy of Entry.UT2 (Entry-TUC.UT2) was totally ignored, the hack however worked a treat. The only entry in UT2003.ini that refers to Entry.UT2 is NetBrowseMap=Entry.ut2, but didn't make squat 'o' difference :( Thanks to you both. I'm happy this solution works

'''Foxpaw:''' Whoops! You're right. :P UT2003 has a separate entry level for network and local games. (not sure why) LocalMap is the local one. Unfortunately, that contains a call to start up the menu so you can't really replace it as easily. I'd say, continue using the hack method above. Alternatively, write your own GUI from scratch using Interactions like I did.. then you can replace the entry level without worrying. :D

'''Daemonica:''' Can I not and just pretend I did ;), besides the Hack works well, and I _really_ don't have the time to write a GUI from scratch. I'm _reasonably_ happy with the current implementation of menus but looking forward to the improvements from UT2004

'''GRAF1K:''' Can you say &quot;UWindows returns&quot; &amp;ndash; or, more to the point &amp;ndash; &quot;YIPEE!&quot;? ;-):D

'''Daemonica:''' YIPEE! :)

'''Ian Pilipski:''' There is a solution, you have to create your own Entry.ut2 map and save it in your mod path maps directory (with the name Entry.ut2).  Then add your map path for your mod in your .ini file.  I would recommend creating your own copy of the UT2003.ini file to something like MyModUT2003.ini.  Then launch ut2003 with this command line switch UT2003.exe -ini=MyModUT2003.ini.  The ini entry should look something like this:

&lt;uscript&gt;
[Core.System]
...
...
Paths=../MyMod/Maps/*.ut2
Paths=../Maps/*.ut2
Paths= ...
...
...
&lt;/uscript&gt;

Now when you run your mod, it will use your Entry.ut2 file as the entry level because it finds it first when searching the paths.  Using this method can also allow you to do interesting things on the menu screens.  If you set the menu backgrounds to none, then you will actually see the Entry.ut2 level in play.  You can add some Matinee scene in there and you now have a very interesting menu system.  As Foxpaw points out, if this level is always loaded during game play, you should not overload it by making it too complex.  That would affect the performance of your mod.

===Useable Actors===

How do I check to see if an [[Legacy:Actor|Actor]] is useable (i.e. It has a function UsedBy(Pawn User))

====Why am I working on this problem====

I need a way of highlighting useable actors on the HUD, however there is now bUseable variable, defined in Actor (or something similar). The reason I need to check this is that these usable items include pickups, triggers &amp; decorations!

'''Foxpaw:''' I don't believe that there is any way to check if it &quot;has&quot; the UsedBy function, because every actor has it. (I think) What you CAN do, however, is have every &quot;useable&quot; think spawn an invisible &quot;tag&quot; that points to that object. Then, when you want to highlight the actors that are &quot;useable,&quot; you can iterate through all of your &quot;tags&quot; and you will essentially have a list of all the things that should be highlighted.

'''Daemonica:''' Foxpaw comes to the rescue again :) Thanks. I'm asuming then somewhere in the PostBeginPlay() function I would &lt;u&gt;Spawn&lt;/u&gt; this TagActor, then I can do an Other.IsA('TagActor') to varify useable items? Now I'm trying to get trace to actually return the object I'm looking at and not just the world!

&lt;USCRIPT&gt;// Called from a HUD to determine if the player is looking at a hostile, useable item

//etc, so the crosshair colour can be changed :)

function string PlayerLookingAt()

{
    local vector HitLocation,HitNormal,StartTrace,EndTrace;
    local actor Other;

    StartTrace = Pawn.Location;
    StartTrace.Z += Pawn.BaseEyeHeight;
    EndTrace = StartTrace + vector(Pawn.GetViewRotation()) * 1000.0;

    Other=Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, True);
    if ( Other != none )
    {
        // Assumes that all useable items have spawned a UseableItem actor :)
        if ( Other.IsA('UseableItem') )
            return(&quot;Useable&quot;);
        else
            return(&quot;Hostile&quot;);
    }
    else
        return &quot;None&quot;;

}
&lt;/USCRIPT&gt;

'''Foxpaw:''' Well, the implementation would depend on what exactly you had in mind. If you wanted the crosshair to respond to things underneath it, the code would be something like the following:

&lt;uscript&gt;
simulated function string PlayerLookingAt()
{
  local vector HitLocation,HitNormal,StartTrace,EndTrace;
  local actor Other;

  StartTrace = Pawn.Location;
  StartTrace.Z += Pawn.BaseEyeHeight;
  EndTrace = StartTrace + vector(Pawn.GetViewRotation()) * 1000.0;

  Other = Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, True);
  if ( Other != none )
  {
    if ( IsUseable( Other ) )
      return(&quot;Useable&quot;);
    else
      return(&quot;Hostile&quot;);
  }
  else
    return &quot;None&quot;;
}

simulated function bool IsUseable( actor A )
{
  local UseableTag Tag;

  foreach AllObjects(class'UseableTag', Tag)
    if ( Tag.Actor == A )
      return true;

  return false;
}
&lt;/uscript&gt;

That is of course a '''logical''' implementation, certainately not the fastest implementation. To speed it up you could make the UseableTags actors with bHidden true, then use DynamicActors instead of AllObjects. (would be much faster, not sure if you can do that in a HUD though anyway.) Even better, you could keep a list of all the UseableTags in the HUD, and just have every useabletag register itself with the HUD when it is created.

However, if you're going to do that (I'm kind of on a roll now :D) you might as well scrap the useabletags and just have the HUD keep a dynamic array pointing to all useable things, and then just iterate through that. Then when an actor wants to register itself as useable, it can find the HUD fairly easily by calling Level.GetLocalPlayerController().myHUD.. or something like that anyway. However, this method might not replicate very well because not only can you not replicate a dynamic array, but even if you worked around it you might constantly be adding and removing things as they become relevant or irrelevant.. so maybe just stick with the DynamicActors iterator for that reason.

'''Daemonica:'''You really went for it there :), I seem to have run into a bug at the moment, the trace is only colliding the world and not any actors, at all, ever. I think I've got my head round the implementation, if only there was a nifty bool bIsUsable back in actor this would be soooo much easier ;)

'''Foxpaw:''' Hmm, well, my first thought would be that the trace is not set to collide with actors. There's a bool in the trace function, bTraceActors, that sets it to do this. In both the code examples above it's set to true, but I would check to see if you accidentally omitted that in your code because that's what would normally cause that sort of behaviour.

'''Daemonica:''' Yup, that's what I thought, but the trace is acurate, it just don't like returning any actors :( The LookingAt() function now returns the actor the player is looking at (in theory) with the following definition

&lt;uscript&gt;
function actor PlayerLookingAt()
{
    local vector HitLocation,HitNormal,StartTrace,EndTrace;
    local actor Other;

    StartTrace = Pawn.Location + Pawn.EyePosition();
    EndTrace = StartTrace + vector(Pawn.GetViewRotation()) * 1000.0;

    Other=Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
    if ( Other != none &amp;&amp; !Other.bWorldGeometry )
       return Other;
    else
       return none;
}
&lt;/uscript&gt;

This is defined in TUCPlayer (extends PlayerController) so as far as I can see it should work. It hits Static meshes correctly so I know the vectors for the trace are correct, it just needs to hit actors now!

'''Daemonica:''' And a little more work reveals that if the object I'm LookingAt() has bBlockPlayers set to True then the trace works, otherwise it fails, this to me is not usefull as I want know what actor I am looking at, even if this doesn't block the player (as most pickups won't actually block a player)..... which can be done by setting bProjTarget = True for those actors ;) Finally it works, but only because I'm working on a TC, I would hate to try and do this for mutators/etc. You would have to use ForEach type things as mentioned above (Eeeky, that's just nasty!)</text>
    </revision>
    <revision>
      <id>2759</id>
      <timestamp>2003-12-15T01:21:01Z</timestamp>
      <contributor>
        <ip>Daemonica</ip>
      </contributor>
      <comment>* Acknowledges Tarquins request</comment>
      <text xml:space="preserve">==Previous Problems ==

I'm considering these problems resolved now :)

===Menu Music===

How to change the music that plays when the [[Legacy:GUIPage|GUIPage]] Main Menu is shown.

'''Tarquin:''' If you've resolved this, could you write up the results on [[Legacy:GUIPage|GUIPage]] please? The same goes for other things: please incorporate results into the main body of the wiki :)

'''Daemonica:''' Good point, these has been added to [[Legacy:GUIPage|GUIPage]] hopefully clear enough, any suggestions where the tracing information should go? Probably somewhere near the trace function I suspect?

====Why am I working on this problem====

Because of [http://undying.sanffo.co.ul The Undying Curse] which is now a UT2003 Mod, playing the default KR-UT2003-Menu music just doesn't have the right feel.

'''Foxpaw:''' This might be a bit tricky to explain, depending on how well you understand the Unreal Engine, but here's the skinny:

There is always at least one, and at most two levels loaded in any given instance of an Unreal Engine game. The first level is generally referred to as the &quot;Entry&quot; level. The second level is the one that you generally play in, and is the one that is changed by the '''servertravel''' and '''start''' console commands.

The Entry level is loaded when the Engine starts, and cannot change to a different level or be unloaded in any way. (That's not '''entirely''' true, but generally speaking..) You can still play in it, it is a level in every respect, but generally for performance reasons (since it's going to be running at the same time as the map you're playing on) it is generally just a subtracted cube without any bells and whistles in it.

Now, one level or the other is &quot;screened out&quot; depending on the context. If the &quot;active&quot; level is the entry level, your input will go to your controller in that level, etc. It's almost like having a completely separate instance of the game, but it isn't really.

Now, how this relates to your question: when you first start UT2003, the &quot;Entry&quot; level is loaded. The music you hear during the menu, is actually just the level's music. When the context switches to another level, you no longer hear sounds from the &quot;entry&quot; level and start hearing them from the other level.

So: to change the menu music you have to change the entry level. The entry level for UT2003 is in your maps directory, and is called Entry.UT2. Make a copy of it, and name it whatever you like, then open it and change the map's music. Then you'll have to make a copy of UT2003.ini, and in it change the reference to Entry.UT2 to your map. (it might just be entry, I don't remember if the UT2 gets appended automatically or not) You will then have to run UT2003 with a commandline parameter to read your modified ini instead of the default UT2003.ini. Most mods that do this also include a batch file so that you don't have to manually specify the command line argument.

'''Daid303:''' Well, I tried to change the entry level, but I didn't have any luck. It just kept using the default Entry.ut2. So I made this crappy hack:&lt;USCRIPT&gt;function InitComponent(GUIController MyController, GUIComponent MyOwner)

{

	Super.InitComponent(MyController, MyOwner);

	//Hack

	Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;

}&lt;/USCRIPT&gt;in my mainmenu class.

'''Foxpaw:''' Hmm, it works fine on my mod. I use the &quot;Entry&quot; level as the workshop where you design your vehicles. That way you can very quickly switch back and forth between the combat simulator and the design level. It seems to have worked fine for me.

'''Daemonica:''' I encountered the same problems as Daid303, My own copy of Entry.UT2 (Entry-TUC.UT2) was totally ignored, the hack however worked a treat. The only entry in UT2003.ini that refers to Entry.UT2 is NetBrowseMap=Entry.ut2, but didn't make squat 'o' difference :( Thanks to you both. I'm happy this solution works

'''Foxpaw:''' Whoops! You're right. :P UT2003 has a separate entry level for network and local games. (not sure why) LocalMap is the local one. Unfortunately, that contains a call to start up the menu so you can't really replace it as easily. I'd say, continue using the hack method above. Alternatively, write your own GUI from scratch using Interactions like I did.. then you can replace the entry level without worrying. :D

'''Daemonica:''' Can I not and just pretend I did ;), besides the Hack works well, and I _really_ don't have the time to write a GUI from scratch. I'm _reasonably_ happy with the current implementation of menus but looking forward to the improvements from UT2004

'''GRAF1K:''' Can you say &quot;UWindows returns&quot; &amp;ndash; or, more to the point &amp;ndash; &quot;YIPEE!&quot;? ;-):D

'''Daemonica:''' YIPEE! :)

'''Ian Pilipski:''' There is a solution, you have to create your own Entry.ut2 map and save it in your mod path maps directory (with the name Entry.ut2).  Then add your map path for your mod in your .ini file.  I would recommend creating your own copy of the UT2003.ini file to something like MyModUT2003.ini.  Then launch ut2003 with this command line switch UT2003.exe -ini=MyModUT2003.ini.  The ini entry should look something like this:

&lt;uscript&gt;
[Core.System]
...
...
Paths=../MyMod/Maps/*.ut2
Paths=../Maps/*.ut2
Paths= ...
...
...
&lt;/uscript&gt;

Now when you run your mod, it will use your Entry.ut2 file as the entry level because it finds it first when searching the paths.  Using this method can also allow you to do interesting things on the menu screens.  If you set the menu backgrounds to none, then you will actually see the Entry.ut2 level in play.  You can add some Matinee scene in there and you now have a very interesting menu system.  As Foxpaw points out, if this level is always loaded during game play, you should not overload it by making it too complex.  That would affect the performance of your mod.

===Useable Actors===

How do I check to see if an [[Legacy:Actor|Actor]] is useable (i.e. It has a function UsedBy(Pawn User))

====Why am I working on this problem====

I need a way of highlighting useable actors on the HUD, however there is now bUseable variable, defined in Actor (or something similar). The reason I need to check this is that these usable items include pickups, triggers &amp; decorations!

'''Foxpaw:''' I don't believe that there is any way to check if it &quot;has&quot; the UsedBy function, because every actor has it. (I think) What you CAN do, however, is have every &quot;useable&quot; think spawn an invisible &quot;tag&quot; that points to that object. Then, when you want to highlight the actors that are &quot;useable,&quot; you can iterate through all of your &quot;tags&quot; and you will essentially have a list of all the things that should be highlighted.

'''Daemonica:''' Foxpaw comes to the rescue again :) Thanks. I'm asuming then somewhere in the PostBeginPlay() function I would &lt;u&gt;Spawn&lt;/u&gt; this TagActor, then I can do an Other.IsA('TagActor') to varify useable items? Now I'm trying to get trace to actually return the object I'm looking at and not just the world!

&lt;USCRIPT&gt;// Called from a HUD to determine if the player is looking at a hostile, useable item

//etc, so the crosshair colour can be changed :)

function string PlayerLookingAt()

{
    local vector HitLocation,HitNormal,StartTrace,EndTrace;
    local actor Other;

    StartTrace = Pawn.Location;
    StartTrace.Z += Pawn.BaseEyeHeight;
    EndTrace = StartTrace + vector(Pawn.GetViewRotation()) * 1000.0;

    Other=Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, True);
    if ( Other != none )
    {
        // Assumes that all useable items have spawned a UseableItem actor :)
        if ( Other.IsA('UseableItem') )
            return(&quot;Useable&quot;);
        else
            return(&quot;Hostile&quot;);
    }
    else
        return &quot;None&quot;;

}
&lt;/USCRIPT&gt;

'''Foxpaw:''' Well, the implementation would depend on what exactly you had in mind. If you wanted the crosshair to respond to things underneath it, the code would be something like the following:

&lt;uscript&gt;
simulated function string PlayerLookingAt()
{
  local vector HitLocation,HitNormal,StartTrace,EndTrace;
  local actor Other;

  StartTrace = Pawn.Location;
  StartTrace.Z += Pawn.BaseEyeHeight;
  EndTrace = StartTrace + vector(Pawn.GetViewRotation()) * 1000.0;

  Other = Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, True);
  if ( Other != none )
  {
    if ( IsUseable( Other ) )
      return(&quot;Useable&quot;);
    else
      return(&quot;Hostile&quot;);
  }
  else
    return &quot;None&quot;;
}

simulated function bool IsUseable( actor A )
{
  local UseableTag Tag;

  foreach AllObjects(class'UseableTag', Tag)
    if ( Tag.Actor == A )
      return true;

  return false;
}
&lt;/uscript&gt;

That is of course a '''logical''' implementation, certainately not the fastest implementation. To speed it up you could make the UseableTags actors with bHidden true, then use DynamicActors instead of AllObjects. (would be much faster, not sure if you can do that in a HUD though anyway.) Even better, you could keep a list of all the UseableTags in the HUD, and just have every useabletag register itself with the HUD when it is created.

However, if you're going to do that (I'm kind of on a roll now :D) you might as well scrap the useabletags and just have the HUD keep a dynamic array pointing to all useable things, and then just iterate through that. Then when an actor wants to register itself as useable, it can find the HUD fairly easily by calling Level.GetLocalPlayerController().myHUD.. or something like that anyway. However, this method might not replicate very well because not only can you not replicate a dynamic array, but even if you worked around it you might constantly be adding and removing things as they become relevant or irrelevant.. so maybe just stick with the DynamicActors iterator for that reason.

'''Daemonica:'''You really went for it there :), I seem to have run into a bug at the moment, the trace is only colliding the world and not any actors, at all, ever. I think I've got my head round the implementation, if only there was a nifty bool bIsUsable back in actor this would be soooo much easier ;)

'''Foxpaw:''' Hmm, well, my first thought would be that the trace is not set to collide with actors. There's a bool in the trace function, bTraceActors, that sets it to do this. In both the code examples above it's set to true, but I would check to see if you accidentally omitted that in your code because that's what would normally cause that sort of behaviour.

'''Daemonica:''' Yup, that's what I thought, but the trace is acurate, it just don't like returning any actors :( The LookingAt() function now returns the actor the player is looking at (in theory) with the following definition

&lt;uscript&gt;
function actor PlayerLookingAt()
{
    local vector HitLocation,HitNormal,StartTrace,EndTrace;
    local actor Other;

    StartTrace = Pawn.Location + Pawn.EyePosition();
    EndTrace = StartTrace + vector(Pawn.GetViewRotation()) * 1000.0;

    Other=Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
    if ( Other != none &amp;&amp; !Other.bWorldGeometry )
       return Other;
    else
       return none;
}
&lt;/uscript&gt;

This is defined in TUCPlayer (extends PlayerController) so as far as I can see it should work. It hits Static meshes correctly so I know the vectors for the trace are correct, it just needs to hit actors now!

'''Daemonica:''' And a little more work reveals that if the object I'm LookingAt() has bBlockPlayers set to True then the trace works, otherwise it fails, this to me is not usefull as I want know what actor I am looking at, even if this doesn't block the player (as most pickups won't actually block a player)..... which can be done by setting bProjTarget = True for those actors ;) Finally it works, but only because I'm working on a TC, I would hate to try and do this for mutators/etc. You would have to use ForEach type things as mentioned above (Eeeky, that's just nasty!)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Daffodilistic</title>
    <id>1084</id>
    <revision>
      <id>2874</id>
      <timestamp>2006-11-29T03:29:54Z</timestamp>
      <contributor>
        <ip>Daffodilistic</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I'm busy here! Go away! o_O</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Daid303</title>
    <id>983</id>
    <revision>
      <id>2654</id>
      <timestamp>2004-08-27T19:42:50Z</timestamp>
      <contributor>
        <ip>C26145.upc-c.chello.nl</ip>
      </contributor>
      <comment>Removed dead link.</comment>
      <text xml:space="preserve">Welcome, I'm Daid, this is a page about me, from me

==Personal info==

I'm Daid303, Daid for short. My email address is sneakeye_@hotmail.com, don't feel afraid to contact me there, just mention where you found my email. No, I don't run the unreal wiki. (I got that question a few times now already, and I don't have a clue why. I just run into this place from time to time)

I code for UT, UT2003 and sometimes Tactical ops. I've also weak modeling and skinning skills, so I can do just about everything. Yeah, also mapping, but I never really made any good map.

==Coding stuff==

===Done===

A no blood mutator for UT2003, but I have no idea where it went :P

===In progress===

And I'm also working at the [http://www.planetunreal.com/ums Ultimate Survival] team, a paintball mod for UT2003.

Ultimate Droids (look furter down)... maybe make a subpage of it?

Finaly learned C++, doing alot of C++ these days. Found out why automatic typecasts are irritating. Clamp is for ints, not for floats. (FClamp is for floats)

----

==Ultimate Driods==

Version 1.3 released. (UT2003 only)

This... mod/program? still don't know what to call is. But anyway you can build droids with it. I've made this because I wanted to make something with the runtime engine. And while being busy I thoughed lets add another chalange. So I said to myself &quot;Don't subclass Gameinfo or PlayerController or Pawn&quot; and... I didn't :) It was quite a trick for me because I  was used to just subclass what you need. And that USUALY started with a gameinfo.

The version 1.3 has alot of changes including:
* 2 design envirments, 1 with and 1 without gravatie.
* Challange maps. Maps designed for more then 1 droid.
* A few new components and parts including:
** Rotation Sensor
** Absolute
** Add Around (0.8 + 0.3 = -0.9)
** A timer (copies it's input value onces every 0.1 of a sec)
* Import/export functions.
* Ajustable mousespeed.
* And more....

More info here:

Sorry no link at the moment.

Because it's still unclear if I can contiue with the Runtime engine, I had to set out some kind of plan.
* 1st I'll mail licensing@epicgames.com to ask if they can look at what I have created and if they can tell me if it's a game.
** If it isn't a game, then I can just continue as I do now, and release it with the runtime engine.
** But if I can't continue like this, OR it's not sertain. (I don't have money for a lawyer ;)) Then i'll continue with Plan B

====Plan B====

Plan B is basicly port it to as many unrealengines as I can think of. Every unreal engine that has karma stuff and exportable code can run the 'mod'. This sounds quite easy but could be a lot of work.

I have done some thinking already, and this is what I know:
* Textures can easly be created and ported.
* Maps can easly be ported, because you can simple export a map, and import it again in the UEd of the other game. (will need 100% custom made tex)
* Code is 100% runtime compattible and so will be 99% compatible for most engines.
* Not all engines have Karma stuff, so some will be out of luck.

What I still don't know (but some people here probly do):
* What games (running the UEngine) can be modded? And do they have karma stuff?
* Any idea how to make static meshes with karma properties portable?
* I might need some help to get it to some of the games (I don't own every game that's out there)

If this plan won't work then i'll simple make it a UT2003 mod. But it will stay 100% none UT2003 (as in I won't be using any UT2003 classes)

===Discussion===

'''Daid303:''' Removed alot of stuff, stored in my head, not needed anymore (unless someone else wants it?)

Anyhow, i'm trying something new. Destroyable terrain. No not destroyable objects, not terrain that you can lower by shooting at it, but terrain where you can really blast holes in it, and then tunnel to another side.

Not possible you say? Well, I think it is. Basicly I had this idea, if you place 4 terrain infos, and make the quads visible 1 after eachother then you could lower 1 quad without lowering the ones next to it. There you have a hole. With even more terrain infos, and inverted terrain infos you could make the tunnels.

One if the problems is setting the quad visibilities, but I found out that I can simply remove the &quot;const&quot; in the editor, compile (without saving) and then access it with brush builders to set it to the right numbers.

'''AlphaOne:''' Wow, thats a nice hack. How much of it do you have working?

'''Daid303:''' Not much actualy, I kinda have a problem with it. The poketerrain doesn't act the same on all the terraininfos... Feel free to try to make it yourself.

'''AlphaOne:''' Now that I think of it I don't really understand what you're talking about. Could you possibly make an example in ued with all thequads properly set, and show us a screenshot?

[[Image:Legacy_TunnelTerrainHack-Daid.jpeg|]]

'''Daid303:''' The upperleft picture shows just 1 terrain info, the right one are actualy 4 terraininfos, the lowerleft picture shows the same terrain infos with diffrent textures. The idea is that I can now lower 1 quad without moving the others around it.

'''Foxpaw:''' I don't see why you need 4 terrain infos. Can't you do it with just two? (one &quot;floor&quot; and one &quot;roof&quot; interlocking, and when tunnelled through they separate at the point you hit?

'''Daid303:''' Actualy, I need a total of 9. 4 for the top, 4 for the roof of the tunnel, and 1 for the floor of the tunnel. The idea is that you can have holes from the ground level to the tunnel level.

'''AlphaOne:''' I think it would be better if you illustrate with more screenshots. Try to show us what would happen AFTER some polygons were moved. Show us how you want holes from the ground level to the tunnel level.

'''Daid303:''' It's pretty hard to take screenshots from my head. It's still in the idea phase, it doesn't work yet. Anyhow I found out why the poketerrain acted diffrent on each terraininfo, it was basicly because I copy+paste them, and then they all used the same hightmap. And that gave wierd stuff.

I'll build a drawing from the side how my idea is, could take a while.

'''Daid303:''' Ok, updated the picture.

The green and darkred lines are the top terrain infos.

The pink and blue lines are the roof of the tunnel terrain infos.

The thin lines are invisible and so can be walked trough.

'''AlphaOne:''' O_o 2D pictures are rarely good for describing 3D concepts. I'm opening UED so I can try to figure out how it might work. I just dont' see why u can't just use two terrain infos, one for the top, and one for the bottom of the 'cave'.

'''AlphaOne:''' No, I dunno man. It took me for ever to setup the invisibility of for terrain infos. I moved one poly up, and gave up. In the game for some reason other terrain infos moved up as well.

'''Foxpaw:''' I was thinking that originally, (that he'd only need two) but I think that what he wants is to have the ability to tunnel from the surface, underground, without disturbing the ground above the tunnel.

'''AlphaOne:''' I noticed that. I sill, however, can't understand how he wants it to work.

'''Daid303:''' Well, I still haven't been able to get it to work myself (I forgot how many times I messed up the terrain infos already) but in my head it can work. It's just hard to explain...
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2655</id>
      <timestamp>2004-02-24T04:59:03Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome, I'm Daid, this is a page about me, from me

==Personal info==

I'm Daid303, Daid for short. My email address is sneakeye_@hotmail.com, don't feel afraid to contact me there, just mention where you found my email. No, I don't run the unreal wiki. (I got that question a few times now already, and I don't have a clue why. I just run into this place from time to time)

I code for UT, UT2003 and sometimes Tactical ops. I've also weak modeling and skinning skills, so I can do just about everything. Yeah, also mapping, but I never really made any good map.

==Coding stuff==

===Done===

A no blood mutator for UT2003, but I have no idea where it went :P

===In progress===

And I'm also working at the [http://www.planetunreal.com/ums Ultimate Survival] team, a paintball mod for UT2003.

Ultimate Droids (look furter down)... maybe make a subpage of it?

Finaly learned C++, doing alot of C++ these days. Found out why automatic typecasts are irritating. Clamp is for ints, not for floats. (FClamp is for floats)

----

==Ultimate Driods==

Version 1.3 released. (UT2003 only)

This... mod/program? still don't know what to call is. But anyway you can build droids with it. I've made this because I wanted to make something with the runtime engine. And while being busy I thoughed lets add another chalange. So I said to myself &quot;Don't subclass Gameinfo or PlayerController or Pawn&quot; and... I didn't :) It was quite a trick for me because I  was used to just subclass what you need. And that USUALY started with a gameinfo.

The version 1.3 has alot of changes including:
* 2 design envirments, 1 with and 1 without gravatie.
* Challange maps. Maps designed for more then 1 droid.
* A few new components and parts including:
** Rotation Sensor
** Absolute
** Add Around (0.8 + 0.3 = -0.9)
** A timer (copies it's input value onces every 0.1 of a sec)
* Import/export functions.
* Ajustable mousespeed.
* And more....

More info here:

http://www.rfhq.com/~daid/UD/

Because it's still unclear if I can contiue with the Runtime engine, I had to set out some kind of plan.
* 1st I'll mail licensing@epicgames.com to ask if they can look at what I have created and if they can tell me if it's a game.
** If it isn't a game, then I can just continue as I do now, and release it with the runtime engine.
** But if I can't continue like this, OR it's not sertain. (I don't have money for a lawyer ;)) Then i'll continue with Plan B

====Plan B====

Plan B is basicly port it to as many unrealengines as I can think of. Every unreal engine that has karma stuff and exportable code can run the 'mod'. This sounds quite easy but could be a lot of work.

I have done some thinking already, and this is what I know:
* Textures can easly be created and ported.
* Maps can easly be ported, because you can simple export a map, and import it again in the UEd of the other game. (will need 100% custom made tex)
* Code is 100% runtime compattible and so will be 99% compatible for most engines.
* Not all engines have Karma stuff, so some will be out of luck.

What I still don't know (but some people here probly do):
* What games (running the UEngine) can be modded? And do they have karma stuff?
* Any idea how to make static meshes with karma properties portable?
* I might need some help to get it to some of the games (I don't own every game that's out there)

If this plan won't work then i'll simple make it a UT2003 mod. But it will stay 100% none UT2003 (as in I won't be using any UT2003 classes)

===Discussion===

'''Daid303:''' Removed alot of stuff, stored in my head, not needed anymore (unless someone else wants it?)

Anyhow, i'm trying something new. Destroyable terrain. No not destroyable objects, not terrain that you can lower by shooting at it, but terrain where you can really blast holes in it, and then tunnel to another side.

Not possible you say? Well, I think it is. Basicly I had this idea, if you place 4 terrain infos, and make the quads visible 1 after eachother then you could lower 1 quad without lowering the ones next to it. There you have a hole. With even more terrain infos, and inverted terrain infos you could make the tunnels.

One if the problems is setting the quad visibilities, but I found out that I can simply remove the &quot;const&quot; in the editor, compile (without saving) and then access it with brush builders to set it to the right numbers.

'''AlphaOne:''' Wow, thats a nice hack. How much of it do you have working?

'''Daid303:''' Not much actualy, I kinda have a problem with it. The poketerrain doesn't act the same on all the terraininfos... Feel free to try to make it yourself.

'''AlphaOne:''' Now that I think of it I don't really understand what you're talking about. Could you possibly make an example in ued with all thequads properly set, and show us a screenshot?

[[Image:Legacy_TunnelTerrainHack-Daid.jpeg|]]

'''Daid303:''' The upperleft picture shows just 1 terrain info, the right one are actualy 4 terraininfos, the lowerleft picture shows the same terrain infos with diffrent textures. The idea is that I can now lower 1 quad without moving the others around it.

'''Foxpaw:''' I don't see why you need 4 terrain infos. Can't you do it with just two? (one &quot;floor&quot; and one &quot;roof&quot; interlocking, and when tunnelled through they separate at the point you hit?

'''Daid303:''' Actualy, I need a total of 9. 4 for the top, 4 for the roof of the tunnel, and 1 for the floor of the tunnel. The idea is that you can have holes from the ground level to the tunnel level.

'''AlphaOne:''' I think it would be better if you illustrate with more screenshots. Try to show us what would happen AFTER some polygons were moved. Show us how you want holes from the ground level to the tunnel level.

'''Daid303:''' It's pretty hard to take screenshots from my head. It's still in the idea phase, it doesn't work yet. Anyhow I found out why the poketerrain acted diffrent on each terraininfo, it was basicly because I copy+paste them, and then they all used the same hightmap. And that gave wierd stuff.

I'll build a drawing from the side how my idea is, could take a while.

'''Daid303:''' Ok, updated the picture.

The green and darkred lines are the top terrain infos.

The pink and blue lines are the roof of the tunnel terrain infos.

The thin lines are invisible and so can be walked trough.

'''AlphaOne:''' O_o 2D pictures are rarely good for describing 3D concepts. I'm opening UED so I can try to figure out how it might work. I just dont' see why u can't just use two terrain infos, one for the top, and one for the bottom of the 'cave'.

'''AlphaOne:''' No, I dunno man. It took me for ever to setup the invisibility of for terrain infos. I moved one poly up, and gave up. In the game for some reason other terrain infos moved up as well.

'''Foxpaw:''' I was thinking that originally, (that he'd only need two) but I think that what he wants is to have the ability to tunnel from the surface, underground, without disturbing the ground above the tunnel.

'''AlphaOne:''' I noticed that. I sill, however, can't understand how he wants it to work.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2656</id>
      <timestamp>2004-02-26T16:40:49Z</timestamp>
      <contributor>
        <ip>C26145.upc-c.chello.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome, I'm Daid, this is a page about me, from me

==Personal info==

I'm Daid303, Daid for short. My email address is sneakeye_@hotmail.com, don't feel afraid to contact me there, just mention where you found my email. No, I don't run the unreal wiki. (I got that question a few times now already, and I don't have a clue why. I just run into this place from time to time)

I code for UT, UT2003 and sometimes Tactical ops. I've also weak modeling and skinning skills, so I can do just about everything. Yeah, also mapping, but I never really made any good map.

==Coding stuff==

===Done===

A no blood mutator for UT2003, but I have no idea where it went :P

===In progress===

And I'm also working at the [http://www.planetunreal.com/ums Ultimate Survival] team, a paintball mod for UT2003.

Ultimate Droids (look furter down)... maybe make a subpage of it?

Finaly learned C++, doing alot of C++ these days. Found out why automatic typecasts are irritating. Clamp is for ints, not for floats. (FClamp is for floats)

----

==Ultimate Driods==

Version 1.3 released. (UT2003 only)

This... mod/program? still don't know what to call is. But anyway you can build droids with it. I've made this because I wanted to make something with the runtime engine. And while being busy I thoughed lets add another chalange. So I said to myself &quot;Don't subclass Gameinfo or PlayerController or Pawn&quot; and... I didn't :) It was quite a trick for me because I  was used to just subclass what you need. And that USUALY started with a gameinfo.

The version 1.3 has alot of changes including:
* 2 design envirments, 1 with and 1 without gravatie.
* Challange maps. Maps designed for more then 1 droid.
* A few new components and parts including:
** Rotation Sensor
** Absolute
** Add Around (0.8 + 0.3 = -0.9)
** A timer (copies it's input value onces every 0.1 of a sec)
* Import/export functions.
* Ajustable mousespeed.
* And more....

More info here:

http://www.rfhq.com/~daid/UD/

Because it's still unclear if I can contiue with the Runtime engine, I had to set out some kind of plan.
* 1st I'll mail licensing@epicgames.com to ask if they can look at what I have created and if they can tell me if it's a game.
** If it isn't a game, then I can just continue as I do now, and release it with the runtime engine.
** But if I can't continue like this, OR it's not sertain. (I don't have money for a lawyer ;)) Then i'll continue with Plan B

====Plan B====

Plan B is basicly port it to as many unrealengines as I can think of. Every unreal engine that has karma stuff and exportable code can run the 'mod'. This sounds quite easy but could be a lot of work.

I have done some thinking already, and this is what I know:
* Textures can easly be created and ported.
* Maps can easly be ported, because you can simple export a map, and import it again in the UEd of the other game. (will need 100% custom made tex)
* Code is 100% runtime compattible and so will be 99% compatible for most engines.
* Not all engines have Karma stuff, so some will be out of luck.

What I still don't know (but some people here probly do):
* What games (running the UEngine) can be modded? And do they have karma stuff?
* Any idea how to make static meshes with karma properties portable?
* I might need some help to get it to some of the games (I don't own every game that's out there)

If this plan won't work then i'll simple make it a UT2003 mod. But it will stay 100% none UT2003 (as in I won't be using any UT2003 classes)

===Discussion===

'''Daid303:''' Removed alot of stuff, stored in my head, not needed anymore (unless someone else wants it?)

Anyhow, i'm trying something new. Destroyable terrain. No not destroyable objects, not terrain that you can lower by shooting at it, but terrain where you can really blast holes in it, and then tunnel to another side.

Not possible you say? Well, I think it is. Basicly I had this idea, if you place 4 terrain infos, and make the quads visible 1 after eachother then you could lower 1 quad without lowering the ones next to it. There you have a hole. With even more terrain infos, and inverted terrain infos you could make the tunnels.

One if the problems is setting the quad visibilities, but I found out that I can simply remove the &quot;const&quot; in the editor, compile (without saving) and then access it with brush builders to set it to the right numbers.

'''AlphaOne:''' Wow, thats a nice hack. How much of it do you have working?

'''Daid303:''' Not much actualy, I kinda have a problem with it. The poketerrain doesn't act the same on all the terraininfos... Feel free to try to make it yourself.

'''AlphaOne:''' Now that I think of it I don't really understand what you're talking about. Could you possibly make an example in ued with all thequads properly set, and show us a screenshot?

[[Image:Legacy_TunnelTerrainHack-Daid.jpeg|]]

'''Daid303:''' The upperleft picture shows just 1 terrain info, the right one are actualy 4 terraininfos, the lowerleft picture shows the same terrain infos with diffrent textures. The idea is that I can now lower 1 quad without moving the others around it.

'''Foxpaw:''' I don't see why you need 4 terrain infos. Can't you do it with just two? (one &quot;floor&quot; and one &quot;roof&quot; interlocking, and when tunnelled through they separate at the point you hit?

'''Daid303:''' Actualy, I need a total of 9. 4 for the top, 4 for the roof of the tunnel, and 1 for the floor of the tunnel. The idea is that you can have holes from the ground level to the tunnel level.

'''AlphaOne:''' I think it would be better if you illustrate with more screenshots. Try to show us what would happen AFTER some polygons were moved. Show us how you want holes from the ground level to the tunnel level.

'''Daid303:''' It's pretty hard to take screenshots from my head. It's still in the idea phase, it doesn't work yet. Anyhow I found out why the poketerrain acted diffrent on each terraininfo, it was basicly because I copy+paste them, and then they all used the same hightmap. And that gave wierd stuff.

I'll build a drawing from the side how my idea is, could take a while.

'''Daid303:''' Ok, updated the picture.

The green and darkred lines are the top terrain infos.

The pink and blue lines are the roof of the tunnel terrain infos.

The thin lines are invisible and so can be walked trough.

'''AlphaOne:''' O_o 2D pictures are rarely good for describing 3D concepts. I'm opening UED so I can try to figure out how it might work. I just dont' see why u can't just use two terrain infos, one for the top, and one for the bottom of the 'cave'.

'''AlphaOne:''' No, I dunno man. It took me for ever to setup the invisibility of for terrain infos. I moved one poly up, and gave up. In the game for some reason other terrain infos moved up as well.

'''Foxpaw:''' I was thinking that originally, (that he'd only need two) but I think that what he wants is to have the ability to tunnel from the surface, underground, without disturbing the ground above the tunnel.

'''AlphaOne:''' I noticed that. I sill, however, can't understand how he wants it to work.

'''Daid303:''' Well, I still haven't been able to get it to work myself (I forgot how many times I messed up the terrain infos already) but in my head it can work. It's just hard to explain...
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dalai</title>
    <id>985</id>
    <revision>
      <id>2660</id>
      <timestamp>2003-10-09T06:01:41Z</timestamp>
      <contributor>
        <ip>Immortius</ip>
      </contributor>
      <comment>*Dalai's new project</comment>
      <text xml:space="preserve">Dalai

Project Lead, Thievery UT

http://www.thieveryut.com/

----

'''Immortius:''' Dalai is now project lead for a new project: [http://www.night-blade.com/ Nightblade].
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2661</id>
      <timestamp>2002-11-18T21:36:43Z</timestamp>
      <contributor>
        <ip>Dalai</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Dalai

Project Lead, Thievery UT

http://www.thieveryut.com/
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DamageTriggerMover</title>
    <id>1073</id>
    <revision>
      <id>2850</id>
      <timestamp>2007-11-18T22:06:03Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Mover|Mover]] &gt;&gt; DamageTriggerMover (custom)}}

This subclass of [[Legacy:Mover|Mover]] replaces the logic for damage-triggering the mover with the ability to trigger an [[Legacy:Event|event]] when the mover is damaged.

To use it, either load DamageTriggerMover.u in the [[Legacy:Actor Browser|Actor Browser]] or add &lt;code&gt;DamageTriggerMover&lt;/code&gt; to your &lt;code&gt;EditPackages&lt;/code&gt; list. You will be able to place this type of mover by right-clicking the mover icon in the UnrealEd [[Legacy:Toolbox|toolbox]].

==Download==

http://www.koehler-homepage.de/Wormbo/downloads/UT2004/DamageTriggerMover.zip

==Relevant Properties==

===Mover Group (Inherited from [[Legacy:Mover|Mover]])===
; bool bDamageTriggered : ''No longer used.''
; float DamageThreshold : Minimum amount of damage required to trigger the event.

===MoverEvents Group===
; name DamageEvent : This event will be triggered when the mover is damaged.

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered doors]] &amp;ndash; provides an example of usage for this mover class

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2851</id>
      <timestamp>2005-11-22T19:45:56Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Mover|Mover]] &gt;&gt; DamageTriggerMover (custom)}}

This subclass of [[Legacy:Mover|Mover]] replaces the logic for damage-triggering the mover with the ability to trigger an [[Legacy:Event|event]] when the mover is damaged.

To use it, either load DamageTriggerMover.u in the [[Legacy:Actor Browser|Actor Browser]] or add &lt;code&gt;DamageTriggerMover&lt;/code&gt; to your &lt;code&gt;EditPackages&lt;/code&gt; list. You will be able to place this type of mover by right-clicking the mover icon in the UnrealEd [[Legacy:Toolbox|toolbox]].

==Download==

http://www.koehler-homepage.de/Wormbo/downloads/UT2004/DamageTriggerMover.zip

==Relevant Properties==

===Mover Group (Inherited from [[Legacy:Mover|Mover]])===
; bool bDamageTriggered : ''No longer used.''
; float DamageThreshold : Minimum amount of damage required to trigger the event.

===MoverEvents Group===
; name DamageEvent : This event will be triggered when the mover is damaged.

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered doors]] &amp;ndash; provides an example of usage for this mover class

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DamageType</title>
    <id>933</id>
    <revision>
      <id>2544</id>
      <timestamp>2006-06-13T12:40:24Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; DamageType (Package: Engine)}}

In UT2003 DamageTypes are abstract classes which hold information like e.g. the corresponding death messages and hit effects.

See [[Legacy:DamageType (UT)|DamageType (UT)]] for the UT version of this class.

If you want to create your own DamageType then go to [[Legacy:DamageType/Creating Damage Types|Creating Damage Types]].

==Properties==
; string DeathString (localized) : string to describe death by this type of damage
; string FemaleSuicide, MaleSuicide (localized) : 
; float ViewFlash : View flash to play.
; vector ViewFog : View fog to play.
; class&lt;[[Legacy:Effects|Effects]]&gt; DamageEffect : Special effect.
; string DamageWeaponName : Weapon that caused this damage.
; bool bArmorStops : Does regular armor provide protection against this damage?
; bool bInstantHit : Done by trace hit weapon.
; bool bFastInstantHit : Done by fast repeating trace hit weapon. (e.g. Assault Rifle or Minigun)
; bool bAlwaysGibs : When set to true this means that when a player dies of this they will explode in a shower of gibs.
; bool bLocationalHit : 
; bool bAlwaysSevers : 
; bool bSpecial : 
; bool bDetonatesGoop : Causes biorifle shots to explode.
; bool bSkeletize : Swap model to skeleton.
; bool bCauseConvulsions : When ever the player gets damaged by this they will have a spasm.
; bool bSuperWeapon : If true, also damages teammates even if no friendlyfire.
; bool bCausesBlood : When ever the player gets damaged by this they will release blood.
; bool bKUseOwnDeathVel : For ragdoll death. Rather than using default - use death velocity specified in this damage type.

; float GibModifier : 

(These effects should be none if should use the pawn's blood effects.)
; class&lt;[[Legacy:Effects|Effects]]&gt; PawnDamageEffect : effect to spawn when pawns are damaged by this damagetype
; class&lt;[[Legacy:Emitter|Emitter]]&gt; PawnDamageEmitter : effect to spawn when pawns are damaged by this damagetype
; array&lt;Sound&gt; PawnDamageSounds : Sound Effect to Play when Damage occurs 

; class&lt;[[Legacy:Effects|Effects]]&gt; LowGoreDamageEffect : effect to spawn when low gore
; class&lt;[[Legacy:Emitter|Emitter]]&gt; LowGoreDamageEmitter : Emitter to use when it's low gore
; array&lt;Sound&gt; LowGoreDamageSounds : Sound Effects to play with Damage occurs with low gore 

; class&lt;[[Legacy:Effects|Effects]]&gt; LowDetailEffect : Low Detail effect
; class&lt;[[Legacy:Emitter|Emitter]]&gt; LowDetailEmitter : Low Detail emitter 

; float FlashScale :for flashing victim's screen
; vector FlashFog : 

; int DamageDesc : Describes the damage
; int DamageThreshold : How much damage much occur before playing effects
; vector DamageKick : 
; [[Legacy:Material|Material]] DamageOverlayMaterial : for changing player's shader when hit
; float DamageOverlayTime : timing for this

; float GibPerterbation : When gibbing, the chunks will fly off in random directions.

; float KDamageImpulse : magnitude of impulse applied to KActor due to this damage type.
; float KDeathVel : How fast ragdoll moves upon death
; float KDeathUpKick : Amount of upwards kick ragdolls get when they die

==Methods==

All methods of the DamageType class are static, because it is never spawned or otherwise created as object.

; IncrementKills ([[Legacy:Controller|Controller]] Killer) : 
; string DeathMessage ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim) : Returns the regular death message when Victim was killed by Killer.
; string SuicideMessage ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim) : Returns a suicide death message when Victim killed himself/herself or got pushed into lava, etc.
; class&lt;[[Legacy:Effects|Effects]]&gt; GetPawnDamageEffect (vector HitLocation, float Damage, vector Momentum, [[Legacy:Pawn|Pawn]] Victim, bool bLowDetail) : Returns the class of a hit effect, uusally a blood splat. :)
; class&lt;[[Legacy:Emitter|Emitter]]&gt; GetPawnDamageEmitter (vector HitLocation, float Damage, vector Momentum, [[Legacy:Pawn|Pawn]] Victim, bool bLowDetail) : Returns an [[Legacy:Emitter|Emitter]] class, to be used as hit effect.
; Sound GetPawnDamageSound ( ) : 
; bool IsOfType (int Description) : 
; GetHitEffects (out class&lt;[[Legacy:XEmitter|xEmitter]]&gt; HitEffects[4], int VictimHealth) : Returns up to four [[Legacy:XEmitter|xEmitter]] hit effects based on the victim's health. (e.g. Victim loosing blood)
; string GetWeaponClass ( ) : Returns the string representation of a weapon class this damage type is associated with. (Only used by [[Legacy:WeaponDamageType|WeaponDamageType]] classes.)

==Known Subclasses ==
 DamageType
  +- Burned
  +- Corroded
  +- Crushed
  +- DamTypeTelefragged &amp;rarr; ''for all kinds of telefrags''
  +- Depressurized
  +- Drowned
  +- Fell
  |   +- FellLava
  +- Gibbed
  +- Suicided
  +- [[Legacy:WeaponDamageType|WeaponDamageType]]
      +- DamTypeAssaultBullet
      +- DamTypeAssaultGrenade
      +- DamTypeBioGlob
      +- DamTypeFlakChunk
      |   +- DamTypeFlakShell
      +- DamTypeIonBlast
      +- DamTypeLinkPlasma
      +- DamTypeLinkShaft
      +- DamTypeMinigunBullet
      |   +- DamTypeMinigunAlt
      +- DamTypeRedeemer
      +- DamTypeRocket
      |   +- DamTypeRocketHoming
      +- DamTypeShieldImpact
      +- DamTypeShockBall
      +- DamTypeShockBeam
      |   +- DamTypeSuperShockBeam
      |       +- ZoomSuperShockBeamDamage
      +- DamTypeShockCombo
      +- DamTypeSniperHeadshot
      +- DamTypeSniperShot
      +- DamTypeTeleFrag &amp;rarr; ''damage type for the translocator, not really used''

==Related Topics==
* [[Legacy:Message Placeholder|Message Placeholder]]
* [[Legacy:DamageType/Creating Damage Types|Creating Damage Types]]

==Discussion==

'''SuperApe:''' I've noticed that the Burned DamageType is set to &lt;tt&gt;bFlaming=false&lt;/tt&gt;. O_o

'''SuperApe:''' The whole ViewFog, ViewFlash, FlashFog, FlashScale setup is as confusing as all getout.  The comments from the code is what you see here in the property descriptions.  No help to me.  Are some of these properties obsolete in UT200x?  How does this relate to the player controller flashing?

'''EricBlade:''' seconded.  FlashFog, FlashScale, don't seem to be used anywhere, but are defined .. :-S

'''EntropicLqd:''' I can't get them to do anything.  I just created a small weapon mutator and tweaked the values for the ViewFog and ViewFlash but I didn't notice any difference.  I was expecting the ViewFog to allow me to &quot;colour&quot; a players view after being hit by a particular weapon, and the ViewFlash to determine how long any &quot;weapon-hit effect&quot; was displayed.  However, I acheived neither.

'''SuperApe:''' That's what I assumed those properties would do too.  Perhaps UT200x just uses a texture overlay for that pain indicator and bypasses this stuff together?

'''MythOpus:''' Me And... Graph!k dicussed this a bit a long time ago when he was working on Laser Wars I believe.  We found that the DamageIndicators are widgets on the hud (if my memory serves me correctly) and they have nothing to do with ViewFlash or any Volume or ZoneInfo property.  Also, I believe the difference between ViewFlash/Fog and Distance fog is DistanceFog is 'environmental' and ViewFog works with the hud.  I don't know how else to describe it.

'''SuperApe:''' That makes sense to me, seeing how the properties in this class don't seem to do much.  We should indicate on this page whether these properties are still relevant.  Perhaps we could also locate the DamageIndicator widget in the texture packages.  Thanks, MO.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2545</id>
      <timestamp>2006-06-13T02:55:49Z</timestamp>
      <contributor>
        <ip>64-110-209-1.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; DamageType (Package: Engine)}}

In UT2003 DamageTypes are abstract classes which hold information like e.g. the corresponding death messages and hit effects.

See [[Legacy:DamageType (UT)|DamageType (UT)]] for the UT version of this class.

If you want to create your own DamageType then go to [[Legacy:DamageType/Creating Damage Types|Creating Damage Types]].

==Properties==
; string DeathString (localized) : string to describe death by this type of damage
; string FemaleSuicide, MaleSuicide (localized) : 
; float ViewFlash : View flash to play.
; vector ViewFog : View fog to play.
; class&lt;[[Legacy:Effects|Effects]]&gt; DamageEffect : Special effect.
; string DamageWeaponName : Weapon that caused this damage.
; bool bArmorStops : Does regular armor provide protection against this damage?
; bool bInstantHit : Done by trace hit weapon.
; bool bFastInstantHit : Done by fast repeating trace hit weapon. (e.g. Assault Rifle or Minigun)
; bool bAlwaysGibs : When set to true this means that when a player dies of this they will explode in a shower of gibs.
; bool bLocationalHit : 
; bool bAlwaysSevers : 
; bool bSpecial : 
; bool bDetonatesGoop : Causes biorifle shots to explode.
; bool bSkeletize : Swap model to skeleton.
; bool bCauseConvulsions : When ever the player gets damaged by this they will have a spasm.
; bool bSuperWeapon : If true, also damages teammates even if no friendlyfire.
; bool bCausesBlood : When ever the player gets damaged by this they will release blood.
; bool bKUseOwnDeathVel : For ragdoll death. Rather than using default - use death velocity specified in this damage type.

; float GibModifier : 

(These effects should be none if should use the pawn's blood effects.)
; class&lt;[[Legacy:Effects|Effects]]&gt; PawnDamageEffect : effect to spawn when pawns are damaged by this damagetype
; class&lt;[[Legacy:Emitter|Emitter]]&gt; PawnDamageEmitter : effect to spawn when pawns are damaged by this damagetype
; array&lt;Sound&gt; PawnDamageSounds : Sound Effect to Play when Damage occurs 

; class&lt;[[Legacy:Effects|Effects]]&gt; LowGoreDamageEffect : effect to spawn when low gore
; class&lt;[[Legacy:Emitter|Emitter]]&gt; LowGoreDamageEmitter : Emitter to use when it's low gore
; array&lt;Sound&gt; LowGoreDamageSounds : Sound Effects to play with Damage occurs with low gore 

; class&lt;[[Legacy:Effects|Effects]]&gt; LowDetailEffect : Low Detail effect
; class&lt;[[Legacy:Emitter|Emitter]]&gt; LowDetailEmitter : Low Detail emitter 

; float FlashScale :for flashing victim's screen
; vector FlashFog : 

; int DamageDesc : Describes the damage
; int DamageThreshold : How much damage much occur before playing effects
; vector DamageKick : 
; [[Legacy:Material|Material]] DamageOverlayMaterial : for changing player's shader when hit
; float DamageOverlayTime : timing for this

; float GibPerterbation : When gibbing, the chunks will fly off in random directions.

; float KDamageImpulse : magnitude of impulse applied to KActor due to this damage type.
; float KDeathVel : How fast ragdoll moves upon death
; float KDeathUpKick : Amount of upwards kick ragdolls get when they die

==Methods==

All methods of the DamageType class are static, because it is never spawned or otherwise created as object.

; IncrementKills ([[Legacy:Controller|Controller]] Killer) : 
; string DeathMessage ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim) : Returns the regular death message when Victim was killed by Killer.
; string SuicideMessage ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim) : Returns a suicide death message when Victim killed himself/herself or got pushed into lava, etc.
; class&lt;[[Legacy:Effects|Effects]]&gt; GetPawnDamageEffect (vector HitLocation, float Damage, vector Momentum, [[Legacy:Pawn|Pawn]] Victim, bool bLowDetail) : Returns the class of a hit effect, uusally a blood splat. :)
; class&lt;[[Legacy:Emitter|Emitter]]&gt; GetPawnDamageEmitter (vector HitLocation, float Damage, vector Momentum, [[Legacy:Pawn|Pawn]] Victim, bool bLowDetail) : Returns an [[Legacy:Emitter|Emitter]] class, to be used as hit effect.
; Sound GetPawnDamageSound ( ) : 
; bool IsOfType (int Description) : 
; GetHitEffects (out class&lt;[[Legacy:XEmitter|xEmitter]]&gt; HitEffects[4], int VictimHealth) : Returns up to four [[Legacy:XEmitter|xEmitter]] hit effects based on the victim's health. (e.g. Victim loosing blood)
; string GetWeaponClass ( ) : Returns the string representation of a weapon class this damage type is associated with. (Only used by [[Legacy:WeaponDamageType|WeaponDamageType]] classes.)

==Known Subclasses ==
 DamageType
  +- Burned
  +- Corroded
  +- Crushed
  +- DamTypeTelefragged &amp;rarr; ''for all kinds of telefrags''
  +- Depressurized
  +- Drowned
  +- Fell
  |   +- FellLava
  +- Gibbed
  +- Suicided
  +- [[Legacy:WeaponDamageType|WeaponDamageType]]
      +- DamTypeAssaultBullet
      +- DamTypeAssaultGrenade
      +- DamTypeBioGlob
      +- DamTypeFlakChunk
      |   +- DamTypeFlakShell
      +- DamTypeIonBlast
      +- DamTypeLinkPlasma
      +- DamTypeLinkShaft
      +- DamTypeMinigunBullet
      |   +- DamTypeMinigunAlt
      +- DamTypeRedeemer
      +- DamTypeRocket
      |   +- DamTypeRocketHoming
      +- DamTypeShieldImpact
      +- DamTypeShockBall
      +- DamTypeShockBeam
      |   +- DamTypeSuperShockBeam
      |       +- ZoomSuperShockBeamDamage
      +- DamTypeShockCombo
      +- DamTypeSniperHeadshot
      +- DamTypeSniperShot
      +- DamTypeTeleFrag &amp;rarr; ''damage type for the translocator, not really used''

==Related Topics==
* [[Legacy:Message Placeholder|Message Placeholder]]
* [[Legacy:DamageType/Creating Damage Types|Creating Damage Types]]

==Discussion==

'''SuperApe:''' I've noticed that the Burned DamageType is set to &lt;tt&gt;bFlaming=false&lt;/tt&gt;. O_o

'''SuperApe:''' The whole ViewFog, ViewFlash, FlashFog, FlashScale setup is as confusing as all getout.  The comments from the code is what you see here in the property descriptions.  No help to me.  Are some of these properties obsolete in UT200x?  How does this relate to the player controller flashing?

'''EricBlade:''' seconded.  FlashFog, FlashScale, don't seem to be used anywhere, but are defined .. :-S

'''EntropicLqd:''' I can't get them to do anything.  I just created a small weapon mutator and tweaked the values for the ViewFog and ViewFlash but I didn't notice any difference.  I was expecting the ViewFog to allow me to &quot;colour&quot; a players view after being hit by a particular weapon, and the ViewFlash to determine how long any &quot;weapon-hit effect&quot; was displayed.  However, I acheived neither.

'''SuperApe:''' That's what I assumed those properties would do too.  Perhaps UT200x just uses a texture overlay for that pain indicator and bypasses this stuff together?

'''MythOpus:''' Me And... Graph!k dicussed this a bit a long time ago when he was working on Laser Wars I believe.  We found that the DamageIndicators are widgets on the hud (if my memory serves me correctly) and they have nothing to do with ViewFlash or any Volume or ZoneInfo property.  Also, I believe the difference between ViewFlash/Fog and Distance fog is DistanceFog is 'environmental' and ViewFog works with the hud.  I don't know how else to describe it.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DamageType (UT)</title>
    <id>1005</id>
    <revision>
      <id>2705</id>
      <timestamp>2003-05-13T17:14:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; DamageType (Package: Engine)}}

In UT DamageType and its subclasses were intended to hold information about different types of damage like the death message, the type of screen flash when hit, etc.

However those classes are not used. Instead the death messages are created by the [[Legacy:GameInfo (UT)|GameInfo (UT)]] based upon the DamageType parameter of the [[Legacy:Pawn (UT)|Pawn (UT)]]'s Died function or the [[Legacy:Weapon (UT)|Weapon (UT)]] class the killer was holding while his victim died.

See [[Legacy:Taking Damage|Taking Damage]] for information about the real UT damage types.

See [[Legacy:DamageType|DamageType]] for the UT2003 version of this class.

==Properties==
; string Name (localized) : Description of damage.
; string AltName (localized) : Alternative description.
; float ViewFlash : View flash to play.
; vector ViewFog : View fog to play.
; class&lt;[[Legacy:Effects (UT)|Effects (UT)]]&gt; DamageEffect : Special effect.

==Methods==
; string DeathMessage ( ) [static] : Randomly return one of the descriptions.

==Known Subclasses==
* UnrealDamageType
** Burned
** Corroded
** Decapitated
** Drowned
** Fell

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DamageType/Creating Damage Types</title>
    <id>1063</id>
    <revision>
      <id>2828</id>
      <timestamp>2004-07-17T00:57:04Z</timestamp>
      <contributor>
        <ip>Mulch D</ip>
      </contributor>
      <comment>Too many links according to Guidelines On Page Links</comment>
      <text xml:space="preserve">==Making your Own DamageType (in UT2004) ==

This tutorial was made to show you how to make a ''basic'' Damage Type in [[Legacy:UT2004|Unreal Tournament 2004]].

===Why would you do it?===

Lets just say you wanted a kill zone in your map but none of the damage types gave quite the right effect or death message, this allows you to set it up the way you want.

===Prerequisites ===
*Basic knowledge of the Editor
*Understand editing properties
*Be able to read the Wiki

===Tutorial Scenario ===

You have made a map of a deep sea base and want some water that kills you of over pressureization, but their is no damage class that does this.

==The Tutorial ==
# Go to the [[Legacy:Actor Class Browser|Actor Class Browser]] and open &lt;tt&gt;GamePlay.u&lt;/tt&gt;
# Make sure ''&quot;Placeable classes Only&quot;'' is not ticked, so you can see the [[Legacy:DamageType|DamageType]] class.
# Expand the DamageType class so you can see all the different [http://wiki.beyondunreal.com/wiki/DamageType#0.3 Subclasses]
# Right click on the DamageType that is closest to your desired DamageType and [[Legacy:Create A Subclass|Create A Subclass]], so in our Scenario we would Create A Subclass under Depressurized. If their is no Subclass that is close to what you want then Create A Subclass under DamageType.
# Set the Package to [[Legacy:MyLevel|MyLevel]] and the Name to whatever you want, in this we will just call it Pressurized.
# A window should come up with the very basic code of your new DamageType change &lt;tt&gt;placeable;&lt;/tt&gt; to &lt;tt&gt;abstract;&lt;/tt&gt;.
# Close the window and find your new DamageType right click on it and select ''Default Properties''
# In the Properties window expand DamageType and set it to the way you would like it, so we want '''bCauseConvulsions''' to be &lt;tt&gt;True&lt;/tt&gt;, The '''DeathString''' to be: &lt;tt&gt;%k put to much pressure on %o.&lt;/tt&gt;, and '''FemaleSuicide''' and '''MaleSuicide''' to be: &lt;tt&gt;%o cracked under the pressure.&lt;/tt&gt;
# Close the window and go to your Volume's properties -&gt; PhysicsVolume -&gt; DamageType and in the drop down list yor new DamageType should be their select it, rebuild all and save.

That's it you're done, Congratulations. &amp;ndash;[[Legacy:Mulch_D|Mulch_D]]

==Related Topics ==
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Message Placeholder|Message Placeholder]]
* [[Legacy:Create A Subclass|Create A Subclass]]
* [[Legacy:MyLevel|MyLevel]]
* [[Legacy:Add A Volume|Add A Volume]]
* [[Legacy:PhysicsVolume|PhysicsVolume]]
 

----

[[:Category:Legacy Tutorial]]

----

==Discussion ==

'''Mulch_D:''' So what do you guys (and girls) all think, I'm pretty proud of my self, seeing as this was my first ''real'' page :).

'''Tarquin:''' Nice! :D
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2829</id>
      <timestamp>2004-07-16T15:20:04Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Making your Own DamageType (in UT2004) ==

This tutorial was made to show you how to make a ''basic'' Damage Type in [[Legacy:UT2004|Unreal Tournament 2004]].

===Why would you do it?===

Lets just say you wanted a kill zone in your map but none of the dameage types gave quite the right effect or death message, this alows you to set it up the way you want.

===Prerequisites ===
*Basic knowledge of the Editor
*Understand editing properties
*Be able to read the Wiki

===Tutorial Scenario ===

You have made a map of a deep sea base and want some water that kills you of over pressureization, but their is no damage class that does this.

==The Tutorial ==
# Go to the [[Legacy:Actor Class Browser|Actor Class Browser]] and open &lt;tt&gt;GamePlay.u&lt;/tt&gt;
# Make sure ''&quot;Placeable classes Only&quot;'' is not ticked, so you can see the [[Legacy:DamageType|DamageType]] class.
# Expand the [[Legacy:DamageType|DamageType]] class so you can see all the different [http://wiki.beyondunreal.com/wiki/DamageType#0.3 Subclasses]
# Right click on the [[Legacy:DamageType|DamageType]] that is closest to your desired [[Legacy:DamageType|DamageType]] and [[Legacy:Create A Subclass|Create A Subclass]], so in our Scenario we would [[Legacy:Create A Subclass|Create A Subclass]] under Depressurized. If their is no Subclass that is close to what you want then [[Legacy:Create A Subclass|Create A Subclass]] under [[Legacy:DamageType|DamageType]].
# Set the Package to [[Legacy:MyLevel|MyLevel]] and the Name to whatever you want, in this we will just call it Pressurized.
# A windiow should come up with the very baic code of your new [[Legacy:DamageType|DamageType]] change &lt;tt&gt;placeable;&lt;/tt&gt; to &lt;tt&gt;abstract;&lt;/tt&gt;.
# Close the window and find your new [[Legacy:DamageType|DamageType]] right click on it and select ''Default Properties''
# In the Properties window expand [[Legacy:DamageType|DamageType]] and set it to the way you would like it, so we want '''bCauseConvulsions''' to be &lt;tt&gt;True&lt;/tt&gt;, The DeathString to be: &lt;tt&gt;%k put to much pressure on %o.&lt;/tt&gt;, and '''FemaleSuicide''' and '''MaleSuicide''' to be: &lt;tt&gt;%o cracked under the pressure.&lt;/tt&gt;
# Close the window and go to your Volume's properties -&gt; PhysicsVolume -&gt; DamageType and in the drop down list yor new [[Legacy:DamageType|DamageType]] should be their select it, rebuild all and save.

That's it you're done, Congratulations. &amp;ndash;[[Legacy:Mulch_D|Mulch_D]]

==Related Topics ==
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Message Placeholder|Message Placeholder]]
* [[Legacy:Create A Subclass|Create A Subclass]]
* [[Legacy:MyLevel|MyLevel]]
* [[Legacy:Add A Volume|Add A Volume]]
* [[Legacy:PhysicsVolume|PhysicsVolume]]
 

----

[[:Category:Legacy Tutorial]]

----

==Discussion ==

'''Mulch_D:''' So what do you guys (and girls) all think, I'm pretty proud of my self, seeing as this was my first ''real'' page :).

'''Tarquin:''' Nice! :D
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2830</id>
      <timestamp>2004-07-17T00:29:11Z</timestamp>
      <contributor>
        <ip>Mulch D</ip>
      </contributor>
      <minor/>
      <comment>Forgot something</comment>
      <text xml:space="preserve">==Making your Own DamageType (in UT2004) ==

This tutorial was made to show you how to make a ''basic'' Damage Type in [[Legacy:UT2004|Unreal Tournament 2004]].

===Why would you do it?===

Lets just say you wanted a kill zone in your map but none of the damage types gave quite the right effect or death message, this allows you to set it up the way you want.

===Prerequisites ===
*Basic knowledge of the Editor
*Understand editing properties
*Be able to read the Wiki

===Tutorial Scenario ===

You have made a map of a deep sea base and want some water that kills you of over pressureization, but their is no damage class that does this.

==The Tutorial ==
# Go to the [[Legacy:Actor Class Browser|Actor Class Browser]] and open &lt;tt&gt;GamePlay.u&lt;/tt&gt;
# Make sure ''&quot;Placeable classes Only&quot;'' is not ticked, so you can see the [[Legacy:DamageType|DamageType]] class.
# Expand the [[Legacy:DamageType|DamageType]] class so you can see all the different [http://wiki.beyondunreal.com/wiki/DamageType#0.3 Subclasses]
# Right click on the [[Legacy:DamageType|DamageType]] that is closest to your desired [[Legacy:DamageType|DamageType]] and [[Legacy:Create A Subclass|Create A Subclass]], so in our Scenario we would [[Legacy:Create A Subclass|Create A Subclass]] under Depressurized. If their is no Subclass that is close to what you want then [[Legacy:Create A Subclass|Create A Subclass]] under [[Legacy:DamageType|DamageType]].
# Set the Package to [[Legacy:MyLevel|MyLevel]] and the Name to whatever you want, in this we will just call it Pressurized.
# A window should come up with the very basic code of your new [[Legacy:DamageType|DamageType]] change &lt;tt&gt;placeable;&lt;/tt&gt; to &lt;tt&gt;abstract;&lt;/tt&gt;.
# Close the window and find your new [[Legacy:DamageType|DamageType]] right click on it and select ''Default Properties''
# In the Properties window expand [[Legacy:DamageType|DamageType]] and set it to the way you would like it, so we want '''bCauseConvulsions''' to be &lt;tt&gt;True&lt;/tt&gt;, The '''DeathString''' to be: &lt;tt&gt;%k put to much pressure on %o.&lt;/tt&gt;, and '''FemaleSuicide''' and '''MaleSuicide''' to be: &lt;tt&gt;%o cracked under the pressure.&lt;/tt&gt;
# Close the window and go to your Volume's properties -&gt; PhysicsVolume -&gt; DamageType and in the drop down list yor new [[Legacy:DamageType|DamageType]] should be their select it, rebuild all and save.

That's it you're done, Congratulations. &amp;ndash;[[Legacy:Mulch_D|Mulch_D]]

==Related Topics ==
* [[Legacy:DamageType|DamageType]]
* [[Legacy:Message Placeholder|Message Placeholder]]
* [[Legacy:Create A Subclass|Create A Subclass]]
* [[Legacy:MyLevel|MyLevel]]
* [[Legacy:Add A Volume|Add A Volume]]
* [[Legacy:PhysicsVolume|PhysicsVolume]]
 

----

[[:Category:Legacy Tutorial]]

----

==Discussion ==

'''Mulch_D:''' So what do you guys (and girls) all think, I'm pretty proud of my self, seeing as this was my first ''real'' page :).

'''Tarquin:''' Nice! :D
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dante</title>
    <id>967</id>
    <revision>
      <id>2619</id>
      <timestamp>2003-08-26T15:58:58Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Content ==

Status:

Lead coder in Defence Alliance ( http://www.planetunreal.com/da )

And I've written a little tool for html documentation creation ( undox was a bit too buggy :/ )

( http://www.uni-ulm.de/~s_dwaldh )

I like the output a bit more than that from uncodex. But I guess uncodex's parser engine is superior to mine. Maybe I'll try to make a real parser once, not that I already have enough things to do.

Well that statement is a few months old, I actually wrote a parser. It parses almost everything besides defaultproperties and code.

==Rant about the Unreal engine ==

Although I haven't seen source of Unreal 2 or any other newer Unreal based game besides UT2003, I'm quiet sure that they all share a big portion of code. I'm seeing Unreal running in the wrong direction (codewise).
* The weapons... While the idea of havin firemodes doesn't look too bad after all, the implementation is awful. There's a lot of native code calling the different functions on the firemodes. Also, the number of firemodes are limited to 2. I guess only those 2 are handled native. Then again the attachment of the weapon which produces third person effects is also called natives (function broadcast which is a bit complicated in unrealscript). I assert that they were in a great hurry and therefore decided not to introduce new language features but hack it in native.
* The GUI... I liked the UT menus much more ;) But it's not only that, also the defaultproperties &quot;inner class&quot; hack. Real inner classes would've been a nice addition. At least they introduced delegates which, I think, is a inferior concept. Well I might be biased of being java coder and not C# one. In addition to the hacked &quot;inner class&quot; stuff they also made hacked &quot;object instantiation&quot; possible. As I already said my hopes are that they were in a big hurry. 

UT1 had a much clearer concept for its time. While it's clear to me why the used unrealscript in Unreal 1 a switch to java in UT might have been a good decision. The would've had the decision of using a real java vm or use a bytecode interpreter just like with unrealscript. Of course it'd have been a brutal switch, and a lot of work to generate a new codebase. But...

There are alot of java compilers already out there which do their job very well. Not only compilers, all sorts of tools which makes the programers life easier.

I think that's also reason why there are more quake engine based games and mods out there. Now don't get me wrong, I am still coding in unrealscript but it's just the nature of people like me to complain lol.

There was also some &quot;rectangle extends square&quot; OOP thingy here earlier which might be useful to know when reading the discussion below.

==Discussion ==

'''EntropicLqd:''' A lot of the ideas within the Unreal Engine are pretty good but they always seem to break them when they implement them.  My fave example is the Controller-Pawn mess.  It could have been a very nice, clean separation of master and puppet - but noooo they had to duck-tape the master's fingers to the puppet strings, and tie the puppets head to his hand.
: Delegates in UnrealScript are very cool.  I've not had the chance to play with pointers to functions (a blast from my C past) for a long time so it's nice to have that facility back  It's a shame they didn't make more use of them in the main stream of the code.  I've always been of the opinion that InnerClasses are just plain ugly although I understand the rationale behind them.
: There are more Quake engine based mods around for two reasons I think.  Firstly, overall the player base is larger - which means there are just more people around to make mods.  Secondly the mods are written in C/C++ and compiled down into DLLs (at least they were last time I made a mod for the quake engine - Quake 2).  Programming in C/C++ is perceived to be way more &quot;cool&quot; than programming in Unreal Script.  Especially as most games companies want people who know C++.

----

'''Mychaeel:''' Welcome to the Wiki, Danke.  :-)

'''Tarquin:''' hi there. :D welcome to the Wiki.

'''ZxAnPhOrIaN:''' Welcome aboard and welcome to the wiki! :) :tup:

'''Dante:''' Oh guys, you're too fast ;)

'''ZxAnPhOrIaN:''' I look at the [[Legacy:Recent Changes|Recent Changes]], at average, every 15 minutes! ;)

'''EntropicLqd:''' There is only one true style of coding your barbarian - it's mine - Mwhahahahah ;) Once you realise how pointless arguments about coding style really are they can be used to great effect on a Friday afternoon when basking in the afterglow of a lunchtime visit to the pub.  &quot;Why aren't you lot working?&quot; &amp;ndash; &quot;We are, we are discussing some problems with the coding standards&quot;. :)

'''Tarquin:''' Seeing as a square is a ''special case'' of a rectangle, I'd say that specialization would agree with you, and have rectangle as the parent class of square. (and Quadrilateral as the parent of rectangle ;) )

'''Dante:''' Yeap, but ''Specialisation'' says: A rectangle is a just a square with one side-length differing from the other. It may not make sense in this case, but specialisation rule tells to do so... 

'''EntropicLqd:''' What rule book on ''Specialisation'' are you reading Dante?  I'd be interested to see the justification that a rectangle is a special type of square rather than the reality, which is that a square is a special type of rectangle.

'''Dante:''' Those aren't my rules, and I wouldn't do it, but it's what I learned from &quot;practical computer science&quot;. Specialisation means, to add &quot;information&quot; to an sub-class. And storing a square needs less information ( 1 var ) than storing a rectangle. Thus a rectangle is a square with 1 additional side. It's not the way I would do it, but that is the way to go if you follow specialisation-specs. ( Which was what we had to do in exams ... ). I don't mean to say that specialisation is bad, but taking square and rectangle as example is dumb.

'''Bjorn:''' What about the &quot;is a&quot; relationship that should exist between an instance of an object and its class and all the superclasses of it? Like a PlayerPawn is a Pawn. Surely, you can say a Square is a Rectangle but not that a Rectangle is a Square.

'''Mychaeel:''' In OOP, that's a bit tricky.  In fact, in OOP you'd rather subclass &quot;Rectangle&quot; from &quot;Square&quot; since the concept &quot;rectangle&quot; extends the concept &quot;square&quot; by the ability to have different side lengths...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2620</id>
      <timestamp>2003-08-26T13:27:22Z</timestamp>
      <contributor>
        <ip>Dante</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Content ==

Status:

Lead coder in Defence Alliance ( http://www.planetunreal.com/da )

And I've written a little tool for html documentation creation ( undox was a bit too buggy :/ )

( http://www.uni-ulm.de/~s_dwaldh )

I like the output a bit more than that from uncodex. But I guess uncodex's parser engine is superior to mine. Maybe I'll try to make a real parser once, not that I already have enough things to do.

Well that statement is a few months old, I actually wrote a parser. It parses almost everything besides defaultproperties and code.

==Rant about the Unreal engine ==

Although I haven't seen source of Unreal 2 or any other newer Unreal based game besides UT2003, I'm quiet sure that they all share a big portion of code. I'm seeing Unreal running in the wrong direction (codewise).
* The weapons... While the idea of havin firemodes doesn't look too bad after all, the implementation is awful. There's a lot of native code calling the different functions on the firemodes. Also, the number of firemodes are limited to 2. I guess only those 2 are handled native. Then again the attachment of the weapon which produces third person effects is also called natives (function broadcast which is a bit complicated in unrealscript). I assert that they were in a great hurry and therefore decided not to introduce new language features but hack it in native.
* The GUI... I liked the UT menus much more ;) But it's not only that, also the defaultproperties &quot;inner class&quot; hack. Real inner classes would've been a nice addition. At least they introduced delegates which, I think, is a inferior concept. Well I might be biased of being java coder and not C# one. In addition to the hacked &quot;inner class&quot; stuff they also made hacked &quot;object instantiation&quot; possible. As I already said my hopes are that they were in a big hurry. 

UT1 had a much clearer concept for its time. While it's clear to me why the used unrealscript in Unreal 1 a switch to java in UT might have been a good decision. The would've had the decision of using a real java vm or use a bytecode interpreter just like with unrealscript. Of course it'd have been a brutal switch, and a lot of work to generate a new codebase. But...

There are alot of java compilers already out there which do their job very well. Not only compilers, all sorts of tools which makes the programers life easier.

I think that's also reason why there are more quake engine based games and mods out there. Now don't get me wrong, I am still coding in unrealscript but it's just the nature of people like me to complain lol.

There was also some &quot;rectangle extends square&quot; OOP thingy here earlier which might be useful to know when reading the discussion below.

==Discussion ==

'''Mychaeel:''' Welcome to the Wiki, Danke.  :-)

'''Tarquin:''' hi there. :D welcome to the Wiki.

'''ZxAnPhOrIaN:''' Welcome aboard and welcome to the wiki! :) :tup:

'''Dante:''' Oh guys, you're too fast ;)

'''ZxAnPhOrIaN:''' I look at the [[Legacy:Recent Changes|Recent Changes]], at average, every 15 minutes! ;)

'''EntropicLqd:''' There is only one true style of coding your barbarian - it's mine - Mwhahahahah ;) Once you realise how pointless arguments about coding style really are they can be used to great effect on a Friday afternoon when basking in the afterglow of a lunchtime visit to the pub.  &quot;Why aren't you lot working?&quot; &amp;ndash; &quot;We are, we are discussing some problems with the coding standards&quot;. :)

'''Tarquin:''' Seeing as a square is a ''special case'' of a rectangle, I'd say that specialization would agree with you, and have rectangle as the parent class of square. (and Quadrilateral as the parent of rectangle ;) )

'''Dante:''' Yeap, but ''Specialisation'' says: A rectangle is a just a square with one side-length differing from the other. It may not make sense in this case, but specialisation rule tells to do so... 

'''EntropicLqd:''' What rule book on ''Specialisation'' are you reading Dante?  I'd be interested to see the justification that a rectangle is a special type of square rather than the reality, which is that a square is a special type of rectangle.

'''Dante:''' Those aren't my rules, and I wouldn't do it, but it's what I learned from &quot;practical computer science&quot;. Specialisation means, to add &quot;information&quot; to an sub-class. And storing a square needs less information ( 1 var ) than storing a rectangle. Thus a rectangle is a square with 1 additional side. It's not the way I would do it, but that is the way to go if you follow specialisation-specs. ( Which was what we had to do in exams ... ). I don't mean to say that specialisation is bad, but taking square and rectangle as example is dumb.

'''Bjorn:''' What about the &quot;is a&quot; relationship that should exist between an instance of an object and its class and all the superclasses of it? Like a PlayerPawn is a Pawn. Surely, you can say a Square is a Rectangle but not that a Rectangle is a Square.

'''Mychaeel:''' In OOP, that's a bit tricky.  In fact, in OOP you'd rather subclass &quot;Rectangle&quot; from &quot;Square&quot; since the concept &quot;rectangle&quot; extends the concept &quot;square&quot; by the ability to have different side lengths...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dante/Developer Journal</title>
    <id>1011</id>
    <revision>
      <id>2718</id>
      <timestamp>2003-10-30T00:16:28Z</timestamp>
      <contributor>
        <ip>Dante</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Project UDG 2.0 ==

A few months ago I created UDG (Unreal docs generator). I didn't like it much, and the parsing was quite primitive. A few days ago, I found a nice tool which was former developed by sun: javacc (java compiler compiler )

So instead of handwriting the lexer/parser stuff, I'm rather writing the grammar for unrealscript.

Javacc uses a notation which seems to be translatable to EBNF. Unlike some other parser generators, the generated source code also doesn't depend on any libraries besides the standard one.

I hope I will continue this project ;)

''Update:'' Well well, javacc wasn't the right tool for the job. But handwriting was! The parser's up and running.

If you want to comment, place it below this page or below the day you want to comment.

==May, 26th 2003 ==

It'll still take a while to get javacc to make all things I want it to do. Absolut posted some ideas of changing DA on the internal forums. He tried to mix my and his interests with the DA concept. The team didn't react very positive about it (I expected that). So I will not lead code there. Some of the team members really had some crazy ideas. Everything they want can be done with, of course, enormous amount of work. They're mappers and obviously got the easiest part in all that work (mapping a space area isn't that complicated I guess). The modellers would have a hell lot of work. The poor coders (not me, I'm part-time ;) will cry rivers.

==May, 21th 2003 ==
* Updated UDGs new grammar too: States are not parsed too. 

Had a lot of problems with unrealscript allowing &quot;reserved&quot; words as names for variables/methods. Fixed that. The list of recognized tokens is HUGE - I feel sorry for the guy who coded ucc. I tested my grammar on core and engine - it did pass without errors. Next step: generating a parse tree with the help of jjtree (a tool that comes with javacc). Argh - I found DominationPoint_rc which doesn't &quot;\n&quot; at the last exec. Also found a class which didn't have a closing &quot;}&quot; for defaultproperties...

==May, 20th 2003 ==

I somehow dislike my math courses. Absolut from [http://www.planetunreal.com/da Defence Alliance] and I talked about changing DA a bit, so he wants me to be Lead coder again. I don't know if I want to do that again ;)

DA isn't as interesting to me as it was in UT. Maybe I start a new mod, or join a existing one.
 

==May, 20th 2003 ==

Tested only with &quot;Object&quot;, &quot;Actor&quot; and &quot;Playercontroller&quot;:

-Parses &quot;class&quot; statement and all those nativereplication, abstract, ... things-

-Handles &quot;var&quot; statements with various modifiers like input, transient, ...-

-Parses enums, also in combination with var-

-Parses structs-

- Parses events, functions and operators with parameters, ignores method bodies. I found a &quot;event function&quot; in PlayerController - wtf ? Still - I changed grammar to match them too.

Even thought I've never written such a big grammar (only small one's in one of my courses) I'm quite happy with the current thing. 

==May, 30th 2003 ==

To have a working ''Documentation compiler'' still will take some time. My damn monitor suicided. I used an old 14&quot; thing, which did strange things with light pictures. Today I bought a new one. Really OT: I finally watched Matrix reloaded on tuesday. Except the dancing scene and the &quot;end&quot;, the movie is great. I still think it's funny that mankind darkened the sky, althought every form of life is based on it. And it's funny that the machines are using us as energy source, even thought a few power plants will provide more energy in an easier way.

==Juni, 2nd 2003 ==

I finished my proseminar work on the subject &quot;HTN Planning&quot;. &quot;Bridge Baron&quot; is a Contract Bridge playing program which uses HTN. Hierarchical Task Network Planning is proven to be more expressive than state machines. Maybe an implementation for UT would be cool. It would allow mod developers to add new features to the bots. But since UT hasn't static variables one would need to place those things into levels, or subclass a bot. This would also mean that there could be different bots (codewise) which will still work with a mod without any special work. The basic bot would just have to provide some basic ''Tasks'' without ''Methods'' that decompose those.

==Juni, 29th 2003 ==

There's an error in the text above. I didn't finish my proseminar really yet. Actually I just have to return versions of it over and over again. I decided that the next version of UDG should be open source. Also, it should no longer produce html directly. Instead, it will create xml output which can be postprocessed by xslt code. I actually did some work with my planning bots ;)

I was too much thinking in the turn based way of making decision. That won't work with UT very well as it would have to calculate too many things for making decision. I also found another error above, of course the basic bots would need to have methods to decompose at least the given tasks to ''primitive operators''. 

Bah - the DA team finally made me rejoin the team as coder. I'm still not very motivated, and I told them. And I know that people like me, who aren't motivated, don't help a specific mod (like DA in this case) much. Maybe I should take a break from the UT scene like 2cool did.

Oh and my &quot;new&quot; monitor sucks big time. I bought an Hyundai Q910. Actually I called them for warranty 2 times. Both monitors I got had the same failure. At least their support is nice and I don't have to pay even 1 eurocent for anything.

==Juli, 26th 2003 ==

Ok finally the proseminar is over. Hell lot of work.

I did alot of coding for DA again. Mainly weapon stuff - the really bad thing in UT2003. UT2003's weapon code is a good example for how it shouldn't be done IMO. 

I found out that jeroen (2cool4-u) is now lead coder on Deathball. I think he's hard working and really deserved it. I also guess that he did take that break from modding to get some distance between DA and himself. He wasn't interested in DA anymore, but I guess people from DA (most of them are really nice) kept asking him to help. So he decided to &quot;leave&quot;. Clever boy ;)

UDG also received some time. I dropped the idea of writing a parser with javacc. It's a great tool, but it doesn't allow something like inheritable Token constructs. Therefore matching on &quot;event&quot; doesn't imply that it's a &lt;IDENTIFER&gt;. But unrealscript allows those names (example is the string event in class Actor). I therefore decided to write my own Scanner/Parser. The scanner is working and is one big funny list of regexps. The parser is a recursive one and does some weird things. 

==Juli, 29th 2003 ==

Although I'm going to rewrite the scanner anyway I already had to fix a not documented &quot;feature&quot; in java. Large matchings sometimes throw StackExceptions. Obviously comments are vulnerable for this.

Method parsing is now working well. I'm not using the parsed method modifiers yet. Also method parameters aren't parsed yet - I think I'll implement this today.

''Update:'' I really updated it. Also added delegate. Also states, and methods within them are parsed.

==Juli, 31th 2003 ==

I would still call this 30th but it's already 0:20 am. Crazy as I am I rewrote the parser and I'm now using much of the [UnrealScript Grammar] info. That grammar seems to have some minor flaws but my parser seems to work since I only use it as a reference. I already started writing the new parser yesterday. And I made fast progress: It parses consts/structs/enums/states/functions/events/delegates.

==August, 5th 2003 ==

Again a exam was on my schedule. Case closed. I had no time to work on UDG. Currently I'm also busy with DA.

==August, 19th 2003 ==

Well I worked alot on DA. Before I returned to DA, there were a lot of internal builds (using buildnumbers which weren't any). But all those releases had only small updates, well I don't need to hand out a file to each team member each time I rebuilt. So we were going to make a bigger IR release. DA seems to become some sort of hyper Assault mod. Our mappers want tons of features, but then they should naturally be able to handle them too. Why I'll like trial and error learning it's not recommend when they could ask me instead of producing some strange things in maps.

UDG - well it had a few minor bugs which were enough to stop me coding on it. After downloading and testng UClasses I'm a bit more motivated. Although UClasses seems to be nice program, it takes ages to load the class tree. I guess it should usually show variables etc. but maybe it doesn't work on UT2k3. 

After fixing it now seems to detect methods too. Actually a problem in my state parsing consumed necessary tokens.

Ok, I just parsed core, engine and unrealgame and the parser did reach 'defaultroperties' or EOF everytime. Since I don't parse defaultproperties this means it has parsed everything but CppTexts, method bodies or anything like that.

Update: I've rewritten the scanner which used some regexp combo. I knew that it would be slow and it was very slow. The new scanner is 3-5 times faster.

==August, 20th 2003 ==

Lol, exactly 1337 classes in my editpackages (wihout my mods). Parsing + name resolving takes about 8 seconds which is pretty fast compared to the old UDG which had a far simpler parser and scanner. Well before yesterday, UDG was just meant to be a documentation generating engine. But after looking at UClasses and [[Legacy:UnCodeX|UnCodeX]] and after the mucho of work I invested, I decided to make it a more advanced tool. Just if anybody reads this, I'm still doing it for my own eduction and due to the fact that I'm just a bit weird (Like most coders ''/me runs''). Oh - and because I'm changing the &quot;feature list&quot; of this project, I'm going to rename it too ;) I just need a good name...

==August, 25th 2003 ==

I was on a LAN this weekend, so no progress. I was told that UDG is a finalist in the &quot;tools&quot; category of the MSU contest. I'm happy about that. It also motivates me to make a powerful UDG 2. I planned to make a GUI for it since I can actually do things now that weren't possible on the old version. On the other hand, I did some recoding of the parser which I'm going to revert because it's buggy and sucks.

Close before 26th ;) The parser is running fine again, I also have some GUI elements already, mainly package and class tree stuff. I started a html exporter, but I'm unsure about the current implementation. I also want to prevent an information overflow. I also made a short hack and included a class viewer. It doesn't do any highlighting yet since I'm concentrating on the html exporter.

==August, 29th 2003 ==

It's all about design decisions. At first I decided to resolve all identifiers after the parsing stage. But I'm currently rearranging the code to dynamically resolve. The new UDG should be able to run while one edits, and only reparse changed files. That would've meant that I'd had to resolve the complete package structure again (the old way). Now I just parse the class and everything should be fine. I didn't yet test the system against &quot;wrong&quot; code, some of the dynamic resolving might crash on it, but I'll see.

==September, 5th 2003 ==

Ok the dynamic resolving seems to work ok. I'm using caches to speed resolving up. I also nearly finished my html export function. But it's sloooow. I thought the java DOM implementation was quiet fast. I was disabused, it's the part slowing everything down. Exporting takes 2 minutes. This is kind of funny compared to the fact that parsing takes 5-10 seconds.

Other news: We had a internal release of our mod. Only minor bugs were found, many of them because of not update-to-date UT2k3 installations. Many &quot;suggestions&quot; were posted as if they'd be bugs. It's a bit annoying to filter out the real bugs.

==September, 8th 2003 ==

Ok, DOM was slow and my resolving too because I tried to resolve each Token to classes, structs etc. The old resolve-mechanism tried to resolve it to a thing if it didn't know it yet which lead to huge performance loss. The html export is now nearly finished.

I also found a little problem with my resolving. Since 2 packages can have classes with same classnames it's difficult to &quot;remember&quot; them both. Currently resolving uses the most current one which is bad of course. To solve this I will introduce package based resolving which will resolve to the most &quot;current&quot; item at the point the package was parsed.

Following there's a little snapshot from the current version. It shows the package tree view, the class comment tooltip and the source viewer.

[[Image:Legacy_udg2_preview.png|center|UDG2]]

==September, 11th 2003 ==

Wow, DA is cancelled. Kind of bad since I did a lot of work for it. But I still wasn't very motivated. I'm going to start a new mod with some members of DA. Let's see how it works out.

'''MythOpus:''' Aww man.  That sucks...  good luck with the new mod though :)

'''Dante:''' Thanks, I hope we'll make it :)

==September, 19th 2003 ==

Wow 8 days passed again since the last update. We're finally come up with 2 mods. 1 Big one and one smaller one (which will be more fun playing imo). We'll start with the smaller one and maybe continue the bigger one. No news on UDG. Well that is because I'm already using the html output. 

==October, 21th 2003 ==

Well a few more days passed ;) I fixed many bugs from UDG. The codebase needs a complete rework... Other than that, I decided to release a preview version of UDG. It's not feature-complete and it's very unstable. It properly won't crash but also won't do what you want. Ok, I'm preparing for release now...

Check http://www.uni-ulm.de/~s_dwaldh/ if you're interested!

==October, 30th 2003 ==

We released Unreal Squad yesterday. Thought it's a small mod it makes much fun.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2719</id>
      <timestamp>2003-09-11T03:49:58Z</timestamp>
      <contributor>
        <ip>Hsdbrg142-165-228-94.sasknet.sk.ca</ip>
      </contributor>
      <comment>(not logged in ;) )</comment>
      <text xml:space="preserve">==Project UDG 2.0 ==

A few months ago I created UDG (Unreal docs generator). I didn't like it much, and the parsing was quite primitive. A few days ago, I found a nice tool which was former developed by sun: javacc (java compiler compiler )

So instead of handwriting the lexer/parser stuff, I'm rather writing the grammar for unrealscript.

Javacc uses a notation which seems to be translatable to EBNF. Unlike some other parser generators, the generated source code also doesn't depend on any libraries besides the standard one.

I hope I will continue this project ;)

''Update:'' Well well, javacc wasn't the right tool for the job. But handwriting was! The parser's up and running.

If you want to comment, place it below this page or below the day you want to comment.

==May, 26th 2003 ==

It'll still take a while to get javacc to make all things I want it to do. Absolut posted some ideas of changing DA on the internal forums. He tried to mix my and his interests with the DA concept. The team didn't react very positive about it (I expected that). So I will not lead code there. Some of the team members really had some crazy ideas. Everything they want can be done with, of course, enormous amount of work. They're mappers and obviously got the easiest part in all that work (mapping a space area isn't that complicated I guess). The modellers would have a hell lot of work. The poor coders (not me, I'm part-time ;) will cry rivers.

==May, 21th 2003 ==
* Updated UDGs new grammar too: States are not parsed too. 

Had a lot of problems with unrealscript allowing &quot;reserved&quot; words as names for variables/methods. Fixed that. The list of recognized tokens is HUGE - I feel sorry for the guy who coded ucc. I tested my grammar on core and engine - it did pass without errors. Next step: generating a parse tree with the help of jjtree (a tool that comes with javacc). Argh - I found DominationPoint_rc which doesn't &quot;\n&quot; at the last exec. Also found a class which didn't have a closing &quot;}&quot; for defaultproperties...

==May, 20th 2003 ==

I somehow dislike my math courses. Absolut from [http://www.planetunreal.com/da Defence Alliance] and I talked about changing DA a bit, so he wants me to be Lead coder again. I don't know if I want to do that again ;)

DA isn't as interesting to me as it was in UT. Maybe I start a new mod, or join a existing one.
 

==May, 20th 2003 ==

Tested only with &quot;Object&quot;, &quot;Actor&quot; and &quot;Playercontroller&quot;:

-Parses &quot;class&quot; statement and all those nativereplication, abstract, ... things-

-Handles &quot;var&quot; statements with various modifiers like input, transient, ...-

-Parses enums, also in combination with var-

-Parses structs-

- Parses events, functions and operators with parameters, ignores method bodies. I found a &quot;event function&quot; in PlayerController - wtf ? Still - I changed grammar to match them too.

Even thought I've never written such a big grammar (only small one's in one of my courses) I'm quite happy with the current thing. 

==May, 30th 2003 ==

To have a working ''Documentation compiler'' still will take some time. My damn monitor suicided. I used an old 14&quot; thing, which did strange things with light pictures. Today I bought a new one. Really OT: I finally watched Matrix reloaded on tuesday. Except the dancing scene and the &quot;end&quot;, the movie is great. I still think it's funny that mankind darkened the sky, althought every form of life is based on it. And it's funny that the machines are using us as energy source, even thought a few power plants will provide more energy in an easier way.

==Juni, 2nd 2003 ==

I finished my proseminar work on the subject &quot;HTN Planning&quot;. &quot;Bridge Baron&quot; is a Contract Bridge playing program which uses HTN. Hierarchical Task Network Planning is proven to be more expressive than state machines. Maybe an implementation for UT would be cool. It would allow mod developers to add new features to the bots. But since UT hasn't static variables one would need to place those things into levels, or subclass a bot. This would also mean that there could be different bots (codewise) which will still work with a mod without any special work. The basic bot would just have to provide some basic ''Tasks'' without ''Methods'' that decompose those.

==Juni, 29th 2003 ==

There's an error in the text above. I didn't finish my proseminar really yet. Actually I just have to return versions of it over and over again. I decided that the next version of UDG should be open source. Also, it should no longer produce html directly. Instead, it will create xml output which can be postprocessed by xslt code. I actually did some work with my planning bots ;)

I was too much thinking in the turn based way of making decision. That won't work with UT very well as it would have to calculate too many things for making decision. I also found another error above, of course the basic bots would need to have methods to decompose at least the given tasks to ''primitive operators''. 

Bah - the DA team finally made me rejoin the team as coder. I'm still not very motivated, and I told them. And I know that people like me, who aren't motivated, don't help a specific mod (like DA in this case) much. Maybe I should take a break from the UT scene like 2cool did.

Oh and my &quot;new&quot; monitor sucks big time. I bought an Hyundai Q910. Actually I called them for warranty 2 times. Both monitors I got had the same failure. At least their support is nice and I don't have to pay even 1 eurocent for anything.

==Juli, 26th 2003 ==

Ok finally the proseminar is over. Hell lot of work.

I did alot of coding for DA again. Mainly weapon stuff - the really bad thing in UT2003. UT2003's weapon code is a good example for how it shouldn't be done IMO. 

I found out that jeroen (2cool4-u) is now lead coder on Deathball. I think he's hard working and really deserved it. I also guess that he did take that break from modding to get some distance between DA and himself. He wasn't interested in DA anymore, but I guess people from DA (most of them are really nice) kept asking him to help. So he decided to &quot;leave&quot;. Clever boy ;)

UDG also received some time. I dropped the idea of writing a parser with javacc. It's a great tool, but it doesn't allow something like inheritable Token constructs. Therefore matching on &quot;event&quot; doesn't imply that it's a &lt;IDENTIFER&gt;. But unrealscript allows those names (example is the string event in class Actor). I therefore decided to write my own Scanner/Parser. The scanner is working and is one big funny list of regexps. The parser is a recursive one and does some weird things. 

==Juli, 29th 2003 ==

Although I'm going to rewrite the scanner anyway I already had to fix a not documented &quot;feature&quot; in java. Large matchings sometimes throw StackExceptions. Obviously comments are vulnerable for this.

Method parsing is now working well. I'm not using the parsed method modifiers yet. Also method parameters aren't parsed yet - I think I'll implement this today.

''Update:'' I really updated it. Also added delegate. Also states, and methods within them are parsed.

==Juli, 31th 2003 ==

I would still call this 30th but it's already 0:20 am. Crazy as I am I rewrote the parser and I'm now using much of the [UnrealScript Grammar] info. That grammar seems to have some minor flaws but my parser seems to work since I only use it as a reference. I already started writing the new parser yesterday. And I made fast progress: It parses consts/structs/enums/states/functions/events/delegates.

==August, 5th 2003 ==

Again a exam was on my schedule. Case closed. I had no time to work on UDG. Currently I'm also busy with DA.

==August, 19th 2003 ==

Well I worked alot on DA. Before I returned to DA, there were a lot of internal builds (using buildnumbers which weren't any). But all those releases had only small updates, well I don't need to hand out a file to each team member each time I rebuilt. So we were going to make a bigger IR release. DA seems to become some sort of hyper Assault mod. Our mappers want tons of features, but then they should naturally be able to handle them too. Why I'll like trial and error learning it's not recommend when they could ask me instead of producing some strange things in maps.

UDG - well it had a few minor bugs which were enough to stop me coding on it. After downloading and testng UClasses I'm a bit more motivated. Although UClasses seems to be nice program, it takes ages to load the class tree. I guess it should usually show variables etc. but maybe it doesn't work on UT2k3. 

After fixing it now seems to detect methods too. Actually a problem in my state parsing consumed necessary tokens.

Ok, I just parsed core, engine and unrealgame and the parser did reach 'defaultroperties' or EOF everytime. Since I don't parse defaultproperties this means it has parsed everything but CppTexts, method bodies or anything like that.

Update: I've rewritten the scanner which used some regexp combo. I knew that it would be slow and it was very slow. The new scanner is 3-5 times faster.

==August, 20th 2003 ==

Lol, exactly 1337 classes in my editpackages (wihout my mods). Parsing + name resolving takes about 8 seconds which is pretty fast compared to the old UDG which had a far simpler parser and scanner. Well before yesterday, UDG was just meant to be a documentation generating engine. But after looking at UClasses and [[Legacy:UnCodeX|UnCodeX]] and after the mucho of work I invested, I decided to make it a more advanced tool. Just if anybody reads this, I'm still doing it for my own eduction and due to the fact that I'm just a bit weird (Like most coders ''/me runs''). Oh - and because I'm changing the &quot;feature list&quot; of this project, I'm going to rename it too ;) I just need a good name...

==August, 25th 2003 ==

I was on a LAN this weekend, so no progress. I was told that UDG is a finalist in the &quot;tools&quot; category of the MSU contest. I'm happy about that. It also motivates me to make a powerful UDG 2. I planned to make a GUI for it since I can actually do things now that weren't possible on the old version. On the other hand, I did some recoding of the parser which I'm going to revert because it's buggy and sucks.

Close before 26th ;) The parser is running fine again, I also have some GUI elements already, mainly package and class tree stuff. I started a html exporter, but I'm unsure about the current implementation. I also want to prevent an information overflow. I also made a short hack and included a class viewer. It doesn't do any highlighting yet since I'm concentrating on the html exporter.

==August, 29th 2003 ==

It's all about design decisions. At first I decided to resolve all identifiers after the parsing stage. But I'm currently rearranging the code to dynamically resolve. The new UDG should be able to run while one edits, and only reparse changed files. That would've meant that I'd had to resolve the complete package structure again (the old way). Now I just parse the class and everything should be fine. I didn't yet test the system against &quot;wrong&quot; code, some of the dynamic resolving might crash on it, but I'll see.

==September, 5th 2003 ==

Ok the dynamic resolving seems to work ok. I'm using caches to speed resolving up. I also nearly finished my html export function. But it's sloooow. I thought the java DOM implementation was quiet fast. I was disabused, it's the part slowing everything down. Exporting takes 2 minutes. This is kind of funny compared to the fact that parsing takes 5-10 seconds.

Other news: We had a internal release of our mod. Only minor bugs were found, many of them because of not update-to-date UT2k3 installations. Many &quot;suggestions&quot; were posted as if they'd be bugs. It's a bit annoying to filter out the real bugs.

==September, 8th 2003 ==

Ok, DOM was slow and my resolving too because I tried to resolve each Token to classes, structs etc. The old resolve-mechanism tried to resolve it to a thing if it didn't know it yet which lead to huge performance loss. The html export is now nearly finished.

I also found a little problem with my resolving. Since 2 packages can have classes with same classnames it's difficult to &quot;remember&quot; them both. Currently resolving uses the most current one which is bad of course. To solve this I will introduce package based resolving which will resolve to the most &quot;current&quot; item at the point the package was parsed.

Following there's a little snapshot from the current version. It shows the package tree view, the class comment tooltip and the source viewer.

[[Image:Legacy_udg2_preview.png|center|UDG2]]

==September, 11th 2003 ==

Wow, DA is cancelled. Kind of bad since I did a lot of work for it. But I still wasn't very motivated. I'm going to start a new mod with some members of DA. Let's see how it works out.

'''MythOpus:''' Aww man.  That sucks...  good luck with the new mod though :)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2720</id>
      <timestamp>2003-10-21T21:29:03Z</timestamp>
      <contributor>
        <ip>Dante</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Project UDG 2.0 ==

A few months ago I created UDG (Unreal docs generator). I didn't like it much, and the parsing was quite primitive. A few days ago, I found a nice tool which was former developed by sun: javacc (java compiler compiler )

So instead of handwriting the lexer/parser stuff, I'm rather writing the grammar for unrealscript.

Javacc uses a notation which seems to be translatable to EBNF. Unlike some other parser generators, the generated source code also doesn't depend on any libraries besides the standard one.

I hope I will continue this project ;)

''Update:'' Well well, javacc wasn't the right tool for the job. But handwriting was! The parser's up and running.

If you want to comment, place it below this page or below the day you want to comment.

==May, 26th 2003 ==

It'll still take a while to get javacc to make all things I want it to do. Absolut posted some ideas of changing DA on the internal forums. He tried to mix my and his interests with the DA concept. The team didn't react very positive about it (I expected that). So I will not lead code there. Some of the team members really had some crazy ideas. Everything they want can be done with, of course, enormous amount of work. They're mappers and obviously got the easiest part in all that work (mapping a space area isn't that complicated I guess). The modellers would have a hell lot of work. The poor coders (not me, I'm part-time ;) will cry rivers.

==May, 21th 2003 ==
* Updated UDGs new grammar too: States are not parsed too. 

Had a lot of problems with unrealscript allowing &quot;reserved&quot; words as names for variables/methods. Fixed that. The list of recognized tokens is HUGE - I feel sorry for the guy who coded ucc. I tested my grammar on core and engine - it did pass without errors. Next step: generating a parse tree with the help of jjtree (a tool that comes with javacc). Argh - I found DominationPoint_rc which doesn't &quot;\n&quot; at the last exec. Also found a class which didn't have a closing &quot;}&quot; for defaultproperties...

==May, 20th 2003 ==

I somehow dislike my math courses. Absolut from [http://www.planetunreal.com/da Defence Alliance] and I talked about changing DA a bit, so he wants me to be Lead coder again. I don't know if I want to do that again ;)

DA isn't as interesting to me as it was in UT. Maybe I start a new mod, or join a existing one.
 

==May, 20th 2003 ==

Tested only with &quot;Object&quot;, &quot;Actor&quot; and &quot;Playercontroller&quot;:

-Parses &quot;class&quot; statement and all those nativereplication, abstract, ... things-

-Handles &quot;var&quot; statements with various modifiers like input, transient, ...-

-Parses enums, also in combination with var-

-Parses structs-

- Parses events, functions and operators with parameters, ignores method bodies. I found a &quot;event function&quot; in PlayerController - wtf ? Still - I changed grammar to match them too.

Even thought I've never written such a big grammar (only small one's in one of my courses) I'm quite happy with the current thing. 

==May, 30th 2003 ==

To have a working ''Documentation compiler'' still will take some time. My damn monitor suicided. I used an old 14&quot; thing, which did strange things with light pictures. Today I bought a new one. Really OT: I finally watched Matrix reloaded on tuesday. Except the dancing scene and the &quot;end&quot;, the movie is great. I still think it's funny that mankind darkened the sky, althought every form of life is based on it. And it's funny that the machines are using us as energy source, even thought a few power plants will provide more energy in an easier way.

==Juni, 2nd 2003 ==

I finished my proseminar work on the subject &quot;HTN Planning&quot;. &quot;Bridge Baron&quot; is a Contract Bridge playing program which uses HTN. Hierarchical Task Network Planning is proven to be more expressive than state machines. Maybe an implementation for UT would be cool. It would allow mod developers to add new features to the bots. But since UT hasn't static variables one would need to place those things into levels, or subclass a bot. This would also mean that there could be different bots (codewise) which will still work with a mod without any special work. The basic bot would just have to provide some basic ''Tasks'' without ''Methods'' that decompose those.

==Juni, 29th 2003 ==

There's an error in the text above. I didn't finish my proseminar really yet. Actually I just have to return versions of it over and over again. I decided that the next version of UDG should be open source. Also, it should no longer produce html directly. Instead, it will create xml output which can be postprocessed by xslt code. I actually did some work with my planning bots ;)

I was too much thinking in the turn based way of making decision. That won't work with UT very well as it would have to calculate too many things for making decision. I also found another error above, of course the basic bots would need to have methods to decompose at least the given tasks to ''primitive operators''. 

Bah - the DA team finally made me rejoin the team as coder. I'm still not very motivated, and I told them. And I know that people like me, who aren't motivated, don't help a specific mod (like DA in this case) much. Maybe I should take a break from the UT scene like 2cool did.

Oh and my &quot;new&quot; monitor sucks big time. I bought an Hyundai Q910. Actually I called them for warranty 2 times. Both monitors I got had the same failure. At least their support is nice and I don't have to pay even 1 eurocent for anything.

==Juli, 26th 2003 ==

Ok finally the proseminar is over. Hell lot of work.

I did alot of coding for DA again. Mainly weapon stuff - the really bad thing in UT2003. UT2003's weapon code is a good example for how it shouldn't be done IMO. 

I found out that jeroen (2cool4-u) is now lead coder on Deathball. I think he's hard working and really deserved it. I also guess that he did take that break from modding to get some distance between DA and himself. He wasn't interested in DA anymore, but I guess people from DA (most of them are really nice) kept asking him to help. So he decided to &quot;leave&quot;. Clever boy ;)

UDG also received some time. I dropped the idea of writing a parser with javacc. It's a great tool, but it doesn't allow something like inheritable Token constructs. Therefore matching on &quot;event&quot; doesn't imply that it's a &lt;IDENTIFER&gt;. But unrealscript allows those names (example is the string event in class Actor). I therefore decided to write my own Scanner/Parser. The scanner is working and is one big funny list of regexps. The parser is a recursive one and does some weird things. 

==Juli, 29th 2003 ==

Although I'm going to rewrite the scanner anyway I already had to fix a not documented &quot;feature&quot; in java. Large matchings sometimes throw StackExceptions. Obviously comments are vulnerable for this.

Method parsing is now working well. I'm not using the parsed method modifiers yet. Also method parameters aren't parsed yet - I think I'll implement this today.

''Update:'' I really updated it. Also added delegate. Also states, and methods within them are parsed.

==Juli, 31th 2003 ==

I would still call this 30th but it's already 0:20 am. Crazy as I am I rewrote the parser and I'm now using much of the [UnrealScript Grammar] info. That grammar seems to have some minor flaws but my parser seems to work since I only use it as a reference. I already started writing the new parser yesterday. And I made fast progress: It parses consts/structs/enums/states/functions/events/delegates.

==August, 5th 2003 ==

Again a exam was on my schedule. Case closed. I had no time to work on UDG. Currently I'm also busy with DA.

==August, 19th 2003 ==

Well I worked alot on DA. Before I returned to DA, there were a lot of internal builds (using buildnumbers which weren't any). But all those releases had only small updates, well I don't need to hand out a file to each team member each time I rebuilt. So we were going to make a bigger IR release. DA seems to become some sort of hyper Assault mod. Our mappers want tons of features, but then they should naturally be able to handle them too. Why I'll like trial and error learning it's not recommend when they could ask me instead of producing some strange things in maps.

UDG - well it had a few minor bugs which were enough to stop me coding on it. After downloading and testng UClasses I'm a bit more motivated. Although UClasses seems to be nice program, it takes ages to load the class tree. I guess it should usually show variables etc. but maybe it doesn't work on UT2k3. 

After fixing it now seems to detect methods too. Actually a problem in my state parsing consumed necessary tokens.

Ok, I just parsed core, engine and unrealgame and the parser did reach 'defaultroperties' or EOF everytime. Since I don't parse defaultproperties this means it has parsed everything but CppTexts, method bodies or anything like that.

Update: I've rewritten the scanner which used some regexp combo. I knew that it would be slow and it was very slow. The new scanner is 3-5 times faster.

==August, 20th 2003 ==

Lol, exactly 1337 classes in my editpackages (wihout my mods). Parsing + name resolving takes about 8 seconds which is pretty fast compared to the old UDG which had a far simpler parser and scanner. Well before yesterday, UDG was just meant to be a documentation generating engine. But after looking at UClasses and [[Legacy:UnCodeX|UnCodeX]] and after the mucho of work I invested, I decided to make it a more advanced tool. Just if anybody reads this, I'm still doing it for my own eduction and due to the fact that I'm just a bit weird (Like most coders ''/me runs''). Oh - and because I'm changing the &quot;feature list&quot; of this project, I'm going to rename it too ;) I just need a good name...

==August, 25th 2003 ==

I was on a LAN this weekend, so no progress. I was told that UDG is a finalist in the &quot;tools&quot; category of the MSU contest. I'm happy about that. It also motivates me to make a powerful UDG 2. I planned to make a GUI for it since I can actually do things now that weren't possible on the old version. On the other hand, I did some recoding of the parser which I'm going to revert because it's buggy and sucks.

Close before 26th ;) The parser is running fine again, I also have some GUI elements already, mainly package and class tree stuff. I started a html exporter, but I'm unsure about the current implementation. I also want to prevent an information overflow. I also made a short hack and included a class viewer. It doesn't do any highlighting yet since I'm concentrating on the html exporter.

==August, 29th 2003 ==

It's all about design decisions. At first I decided to resolve all identifiers after the parsing stage. But I'm currently rearranging the code to dynamically resolve. The new UDG should be able to run while one edits, and only reparse changed files. That would've meant that I'd had to resolve the complete package structure again (the old way). Now I just parse the class and everything should be fine. I didn't yet test the system against &quot;wrong&quot; code, some of the dynamic resolving might crash on it, but I'll see.

==September, 5th 2003 ==

Ok the dynamic resolving seems to work ok. I'm using caches to speed resolving up. I also nearly finished my html export function. But it's sloooow. I thought the java DOM implementation was quiet fast. I was disabused, it's the part slowing everything down. Exporting takes 2 minutes. This is kind of funny compared to the fact that parsing takes 5-10 seconds.

Other news: We had a internal release of our mod. Only minor bugs were found, many of them because of not update-to-date UT2k3 installations. Many &quot;suggestions&quot; were posted as if they'd be bugs. It's a bit annoying to filter out the real bugs.

==September, 8th 2003 ==

Ok, DOM was slow and my resolving too because I tried to resolve each Token to classes, structs etc. The old resolve-mechanism tried to resolve it to a thing if it didn't know it yet which lead to huge performance loss. The html export is now nearly finished.

I also found a little problem with my resolving. Since 2 packages can have classes with same classnames it's difficult to &quot;remember&quot; them both. Currently resolving uses the most current one which is bad of course. To solve this I will introduce package based resolving which will resolve to the most &quot;current&quot; item at the point the package was parsed.

Following there's a little snapshot from the current version. It shows the package tree view, the class comment tooltip and the source viewer.

[[Image:Legacy_udg2_preview.png|center|UDG2]]

==September, 11th 2003 ==

Wow, DA is cancelled. Kind of bad since I did a lot of work for it. But I still wasn't very motivated. I'm going to start a new mod with some members of DA. Let's see how it works out.

'''MythOpus:''' Aww man.  That sucks...  good luck with the new mod though :)

'''Dante:''' Thanks, I hope we'll make it :)

==September, 19th 2003 ==

Wow 8 days passed again since the last update. We're finally come up with 2 mods. 1 Big one and one smaller one (which will be more fun playing imo). We'll start with the smaller one and maybe continue the bigger one. No news on UDG. Well that is because I'm already using the html output. 

==October, 21th 2003 ==

Well a few more days passed ;) I fixed many bugs from UDG. The codebase needs a complete rework... Other than that, I decided to release a preview version of UDG. It's not feature-complete and it's very unstable. It properly won't crash but also won't do what you want. Ok, I'm preparing for release now...

Check http://www.uni-ulm.de/~s_dwaldh/ if you're interested!

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dante/RTSMod</title>
    <id>1010</id>
    <revision>
      <id>2715</id>
      <timestamp>2003-12-06T02:58:43Z</timestamp>
      <contributor>
        <ip>Dante</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Please don't change the content of the description''

==Description ==

A RTS mod for UT2003.

* Every Player leads his own team like in all those famous RTS games
* Resource gathering depends on minerals
** PROPOSAL: Either harvester based, or area based (like in the game Z)
* PROPOSAL: Players able to control (get inside) units?

==Comments ==

'''Foxpaw:''' I think you are going to need to be more specific.. depending on your aims. If you are doing it all by yourself then I suppose you can give as few details as you like, but if you would like to recruit others (depending on what modding skills you have) I think it would help to have more information. [[Legacy:How_To_Recruit_A_Programmer|How_To_Recruit_A_Programmer]] is about coders primarily, but has a lot of general stuff about design documents. Making an RTS is a large undertaking, though an RTS made using the Unreal Engine would be really cool. Unfortunately, due to the range of skills required it generally requires a team to do it. On the other hand, it's possible that you may have all of the skills required and just put this page up to post progress, etc.. if that's the case then I suppose what I said above doesn't really apply.

'''Dante:''' I don't require members at the moment. I'm 2+ years unrealscript coder and code should be enough for starters. This is not really belonging to [[Legacy:Mod_Ideas|Mod_Ideas]]. This page is meant to be a evolving design document. At some point, when it's detailed enough, I will start coding.

'''Mychaeel:''' I suggest you move this page to [[Legacy:Developer Journals/Dante|Developer Journals/Dante]] then.

'''Dante:''' I'm not the only one editing the design. And I think [[Legacy:Developer Journals|Developer Journals]] is a more private place.

'''Dante:''' Well... Units were usable, view was ok but we dropped the project. We first wanted to make a small squad based mod where you would buy weapons/armor and skill-points for your squad. While the idea was nice, I didn't expect it to be much fun in a realtime enviroment. Maybe round-based gameplay would work - but as I said, it's dropped.</text>
    </revision>
    <revision>
      <id>2716</id>
      <timestamp>2003-06-06T14:17:14Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Please don't change the content of the description''

==Description ==

A RTS mod for UT2003.

* Every Player leads his own team like in all those famous RTS games
* Resource gathering depends on minerals
** PROPOSAL: Either harvester based, or area based (like in the game Z)
* PROPOSAL: Players able to control (get inside) units?

==Comments ==

'''Foxpaw:''' I think you are going to need to be more specific.. depending on your aims. If you are doing it all by yourself then I suppose you can give as few details as you like, but if you would like to recruit others (depending on what modding skills you have) I think it would help to have more information. [[Legacy:How_To_Recruit_A_Programmer|How_To_Recruit_A_Programmer]] is about coders primarily, but has a lot of general stuff about design documents. Making an RTS is a large undertaking, though an RTS made using the Unreal Engine would be really cool. Unfortunately, due to the range of skills required it generally requires a team to do it. On the other hand, it's possible that you may have all of the skills required and just put this page up to post progress, etc.. if that's the case then I suppose what I said above doesn't really apply.

'''Dante:''' I don't require members at the moment. I'm 2+ years unrealscript coder and code should be enough for starters. This is not really belonging to [[Legacy:Mod_Ideas|Mod_Ideas]]. This page is meant to be a evolving design document. At some point, when it's detailed enough, I will start coding.

'''Mychaeel:''' I suggest you move this page to [[Legacy:Developer Journals/Dante|Developer Journals/Dante]] then.</text>
    </revision>
    <revision>
      <id>2717</id>
      <timestamp>2003-06-08T13:12:37Z</timestamp>
      <contributor>
        <ip>Dante</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Please don't change the content of the description''

==Description ==

A RTS mod for UT2003.

* Every Player leads his own team like in all those famous RTS games
* Resource gathering depends on minerals
** PROPOSAL: Either harvester based, or area based (like in the game Z)
* PROPOSAL: Players able to control (get inside) units?

==Comments ==

'''Foxpaw:''' I think you are going to need to be more specific.. depending on your aims. If you are doing it all by yourself then I suppose you can give as few details as you like, but if you would like to recruit others (depending on what modding skills you have) I think it would help to have more information. [[Legacy:How_To_Recruit_A_Programmer|How_To_Recruit_A_Programmer]] is about coders primarily, but has a lot of general stuff about design documents. Making an RTS is a large undertaking, though an RTS made using the Unreal Engine would be really cool. Unfortunately, due to the range of skills required it generally requires a team to do it. On the other hand, it's possible that you may have all of the skills required and just put this page up to post progress, etc.. if that's the case then I suppose what I said above doesn't really apply.

'''Dante:''' I don't require members at the moment. I'm 2+ years unrealscript coder and code should be enough for starters. This is not really belonging to [[Legacy:Mod_Ideas|Mod_Ideas]]. This page is meant to be a evolving design document. At some point, when it's detailed enough, I will start coding.

'''Mychaeel:''' I suggest you move this page to [[Legacy:Developer Journals/Dante|Developer Journals/Dante]] then.

'''Dante:''' I'm not the only one editing the design. And I think [[Legacy:Developer Journals|Developer Journals]] is a more private place.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dante/Rants</title>
    <id>1009</id>
    <revision>
      <id>2713</id>
      <timestamp>2003-05-29T17:11:03Z</timestamp>
      <contributor>
        <ip>Dante</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===The &quot;perfect&quot; team leader (for mods)===

I don't think, there's is a perfect one, just wanted to draw attention. A good question is, &quot;how to become a good team leader ?&quot;. AFAIR there's already a page about it (will search after I wrote that here), but I'll make up some thoughts of mine anyway...

A good team leader
* knows that his crew is doing this for free
* tries to keep specs for the mod as low as possible for starters
* doesn't need to know mapping, modelling or coding. But he/she can estimate the difficulty of those things.
* tries to make a good order - in which things should be done:
** Members of different &quot;categories&quot; should concentrate on similar things. Ie. a modeller modelling a gun + a coder writing code for that thing. Whoever finishes first most likly motivates the other one to finish their work too -&gt; working stuff
** don't concentrate on details at the start/middle phase of your development. Just imagine a mod with a new player model with x thousand animations for movement. High detail textures - and so much polygons that even high end machines draw a deep breath. Yeah - it took 2 years to get all those things in, but in the end your CTF mod will rule them all. There's already a player model, just game rules and everything else missing...
* don't put coders under pressure. This might be subjective, but a small sound problem, or a glitch in one of your maps won't hurt the overall impression of your mod too much. But even small bugs in code can work out as being monsters in-game (and bugs happen to get more frequent with more pressure)
* don't make another CS clone. Ok, I know - your clone is special ;)
* creates some sort of timeline, when specific things should be finished, and how it should work out. You need some details on specific things too. Ordering a modeller to make a &quot;cool gun&quot; will help him just as much as telling a coder to &quot;code a cool gun&quot; - they might leave because you have obviously no clue of what you want ;)
* knows organization. There are already some points above which fall under this category. But it's still the key point in your mod development. Don't make them all depend on you to talk to the other members. You will get bored - and your overall development will slow down because each and every person uses you as a router.

I'm not the leader of a team, and I never was the leader of a mod team. This is just my personal opinion. So I might be wrong with every point (althought I hope I'm not).

==Related Topics==

* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:How To Recruit A Programmer|How to Recruit a Programmer]] &amp;ndash; concept art, specifications and so on

==Discussion==

'''Mychaeel:''' Some of those points have little to do with being a team leader &amp;ndash; when to concentrate on details, for instance, or how to go about designing and implementing the mod.

It happens that some people (especially those who'd like to bear the title of a &quot;team leader&quot;) quickly assume the position of a &quot;lead designer,&quot; albeit without more than a nebulous idea of what that is about.  The result is somebody who's following no recognizable long-term concept and is content with bossing everybody else around, feeding the other team members with vague bits of information that turn out to be ''not exactly'' what the &quot;lead designer&quot; meant only after everything has been implemented (which of course means that everything has to be redone &quot;properly&quot;).

A good team does not need a team leader.  At the end of the day a proper team leader is merely responsible for coordinating communication in the team, and a ''really good'' team can do that all by itself.  If everybody is willing to listen to each other, accept each other's respective competences and, in turn, give thought-out and truthful assessments on the matters discussed, a team leader has no job left to do.

'''Dante:''' Yeah, I might need to make a ''lead designer'' section in here too. But having such a ''really good'' team is an illusion. Even if it got no official ''team leader'', there will always be one or two persons which are the communication center. And about that &quot;lead designer&quot;, I think it's the other way around. Somebody has a idea for a game, which is an entry point for being called designer, and then assume ''team leader'' position.

'''Mychaeel:''' Being the &quot;center of communication&quot; is a high responsibility.  If you're it, it's ''your'' choice how to deal with it:  Either by taking responsibility for all decisions and effectively using your position to lead the team wherever ''you'' like, or by channeling the communication to facilitate constructive teamwork and leaving the ''team'' in charge.

Nobody is ever ''forced'' into a leading position.  I, for one, prefer to be part of a team that's not considering itself subject to a certain team member's whims.

'''Dante:''' You're not forced into it that's right. Sometimes, if you want to make a mod, you'll ignore the structure of the team. I think it's also a bit of training for RL. When we, for example, had to form groups in order to write some software as a student project, I recognized something. There are a few kind of people in a team:
* Those who want to get things done and are able to do it
* Those who want to get things done and need help
* Those who need to be kicked in their ***** first
* Those who try the way of minor resistance
* Those who are just in to be ''in''

OMG, I'm getting OT in a rant...

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2714</id>
      <timestamp>2003-05-28T15:19:15Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===The &quot;perfect&quot; team leader (for mods)===

I don't think, there's is a perfect one, just wanted to draw attention. A good question is, &quot;how to become a good team leader ?&quot;. AFAIR there's already a page about it (will search after I wrote that here), but I'll make up some thoughts of mine anyway...

A good team leader
* knows that his crew is doing this for free
* tries to keep specs for the mod as low as possible for starters
* doesn't need to know mapping, modelling or coding. But he/she can estimate the difficulty of those things.
* tries to make a good order - in which things should be done:
** Members of different &quot;categories&quot; should concentrate on similar things. Ie. a modeller modelling a gun + a coder writing code for that thing. Whoever finishes first most likly motivates the other one to finish their work too -&gt; working stuff
** don't concentrate on details at the start/middle phase of your development. Just imagine a mod with a new player model with x thousand animations for movement. High detail textures - and so much polygons that even high end machines draw a deep breath. Yeah - it took 2 years to get all those things in, but in the end your CTF mod will rule them all. There's already a player model, just game rules and everything else missing...
* don't put coders under pressure. This might be subjective, but a small sound problem, or a glitch in one of your maps won't hurt the overall impression of your mod too much. But even small bugs in code can work out as being monsters in-game (and bugs happen to get more frequent with more pressure)
* don't make another CS clone. Ok, I know - your clone is special ;)
* creates some sort of timeline, when specific things should be finished, and how it should work out. You need some details on specific things too. Ordering a modeller to make a &quot;cool gun&quot; will help him just as much as telling a coder to &quot;code a cool gun&quot; - they might leave because you have obviously no clue of what you want ;)
* knows organization. There are already some points above which fall under this category. But it's still the key point in your mod development. Don't make them all depend on you to talk to the other members. You will get bored - and your overall development will slow down because each and every person uses you as a router.

I'm not the leader of a team, and I never was the leader of a mod team. This is just my personal opinion. So I might be wrong with every point (althought I hope I'm not).

==Related Topics==

* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:How To Recruit A Programmer|How to Recruit a Programmer]] &amp;ndash; concept art, specifications and so on

==Discussion==

'''Mychaeel:''' Some of those points have little to do with being a team leader &amp;ndash; when to concentrate on details, for instance, or how to go about designing and implementing the mod.

It happens that some people (especially those who'd like to bear the title of a &quot;team leader&quot;) quickly assume the position of a &quot;lead designer,&quot; albeit without more than a nebulous idea of what that is about.  The result is somebody who's following no recognizable long-term concept and is content with bossing everybody else around, feeding the other team members with vague bits of information that turn out to be ''not exactly'' what the &quot;lead designer&quot; meant only after everything has been implemented (which of course means that everything has to be redone &quot;properly&quot;).

A good team does not need a team leader.  At the end of the day a proper team leader is merely responsible for coordinating communication in the team, and a ''really good'' team can do that all by itself.  If everybody is willing to listen to each other, accept each other's respective competences and, in turn, give thought-out and truthful assessments on the matters discussed, a team leader has no job left to do.

'''Dante:''' Yeah, I might need to make a ''lead designer'' section in here too. But having such a ''really good'' team is an illusion. Even if it got no official ''team leader'', there will always be one or two persons which are the communication center. And about that &quot;lead designer&quot;, I think it's the other way around. Somebody has a idea for a game, which is an entry point for being called designer, and then assume ''team leader'' position.

'''Mychaeel:''' Being the &quot;center of communication&quot; is a high responsibility.  If you're it, it's ''your'' choice how to deal with it:  Either by taking responsibility for all decisions and effectively using your position to lead the team wherever ''you'' like, or by channeling the communication to facilitate constructive teamwork and leaving the ''team'' in charge.

Nobody is ever ''forced'' into a leading position.  I, for one, prefer to be part of a team that's not considering itself subject to a certain team member's whims.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark Pulse</title>
    <id>1014</id>
    <revision>
      <id>2725</id>
      <timestamp>2006-01-16T03:06:49Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>Edited my homepage link.</comment>
      <text xml:space="preserve">Howdy. This is my own little corner of this place...

My Real name is Thomas Warnica. I've been making UT Maps (Most of which suck :)) for about 1 1/2 years now. I'm also amazingly good at UT and UT2004.

I've got a site of my own, [http://darkpulse.project2612.org Darkseid], and It's where I hold all my maps. It's finally back up (Whoo!) and is undergoing redesign.

I've currently made 4 Maps: DM-Darkseid Castle (GOD this sucked. So bad I took it down and plan not to rerelease it until it has a heavy redesign), CTF-SGarden, CTF4-Oblivia, and [http://nalicity.beyondunreal.com/map_hub.php?mid=6423 CTF-Pressure{DSRemix}], and, for UT2004, [http://nalicity.beyondunreal.com/map_hub.php?mid=7530 DM-Agony(DSRemix)]. I've also done or helped with Four maps currently for the CTF4 Project: DuelingKeeps, Chrome, Romra, and TutorialClassic, with more (That I can't announce yet, sorry) on their way.

I play with a couple of my buds, and am a regular participant of Beyond Unreal's FragBU tournaments on Friday and Saturday nights. I still boot up UT on occasion, but I play UT2004 far more then UT99 now.

I've finally begun my first mod project, and it's a pretty high-profile one: CTF4 for UT2004. I loved the original UT99 and I was glad to offer my services, which, at the time was jsut Mapping and Bug testing. It's since then grown, and I've learned a lot so far from the project. I hope to continue working with the team on Future Four-team projects. :)

Anyway, that's about it. If anyone is willing to teach me anything about LevelBuilding, I'll be glad to learn. You can email me [mailto:darkpulse@bandwidthmonkey.net here], or contact me via any Major Instant Messanger service. [http://edit.yahoo.com/config/send_webmesg?.target=negapulseman&amp;.src=pg YIM], [http://wwp.icq.com/scripts/search.dll?to=192410522 ICQ], AIM (Dark Pulse1) and MSN. (pulsemanfan001@hotmail.com) Please don't email the MSN addy... I get enough crap from there, and wouldn't want to toss a perfectly good email out just because I have my Junk Mail filter as Stringent as it can get...

I'm new here, hopefully I'll help a few souls on the way, much as this site has helped me.

Thanks. Buh-Bye now.

7/26/2003: I've now fallen into another kind of Obsession: Quake III Arena. I'm already trying to learn how to map for it, though having been spoiled by UnrealEd (Goblin and all!) I find the Quake Editor I chose, GTKRadiant, a bit tough to use, but I shall manage. Any Help here from someone who knows GTKRadiant would be highly appreciated.

7/28/2004: Well, needless to say, that died out fast. :P I stick to UT2004 mostly now.

10/29/2004: Now working with [http://wiki.beyondunreal.com/wiki/OverloadUT OverloadUT] as Mapper, Texture Maker, Bug Tester, and general Slave Driver of Team CTF4.

9/9/2005: Staff of BeyondUnreal since Febuary, 2005. Working as part of Team [http://www.getutr.com UTR].

----

'''Tarquin:''' Hi there. Welcome to the wiki :D

'''Dark Pulse:''' Heh, thanks. Been here for awhile, almost a month or so, and I helped out in a batch of places where I had the right answers. So thanks for the (Belated, but still good!) Welcome. ^_^

'''Tarquin:''' I've been falling behind in my welcoming of newcomers. Sorry :( 

'''Dark Pulse:''' That's OK, Tar, you keep this place going. It's Forgiveable. ^_^

'''Dante:''' uh, welcome ;D ''/rant'' Yeah compared to Quake 3 gameplay I really don't like UT2003 (I prefer playing UT). ''rant/''

'''Dark Pulse:''' Personally, I have nothing wrong with UT2003's gameplay. The game was a bit rushed, but 2004 will hopefully make it up, even though it means we've got to shell out yet another $40 from our pockets...

Still, hopefully Assault, the new Stuff, and the Return of Xan Kreigor (Whoohoo!) will pull in The Old school and new School alike.

'''Dark Pulse:''' Oh yes, it did. ;p

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2726</id>
      <timestamp>2004-11-01T15:56:30Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>spam revert</comment>
      <text xml:space="preserve">Howdy. This is my own little corner of this place...

My Real name is Thomas Warnica II. I've been making UT Maps (Most of which suck :)) for about 1 1/2 years now. I'm also amazingly good at UT and UT2004.

I've got a site of my own, [http://darkpulse.bandwidthmonkey.net Darkseid], and It's where I hold all my maps. It's finally back up (Whoo!) and is undergoing redesign.

I've currently made 4 Maps: DM-Darkseid Castle (GOD this sucked. So bad I took it down and plan not to rerelease it until it has a heavy redesign), CTF-SGarden, CTF4-Oblivia, and [http://nalicity.beyondunreal.com/map_hub.php?mid=6423 CTF-Pressure{DSRemix}], and, for UT2004, [http://nalicity.beyondunreal.com/map_hub.php?mid=7530 DM-Agony(DSRemix)]. I've also done or helped with Four maps currently for the CTF4 Project: DuelingKeeps, Chrome, Romra, and TutorialClassic, with more (That I can't announce yet, sorry) on their way.

I play with a couple of my buds, and am a regular participant of Beyond Unreal's FragBU tournaments on Friday and Saturday nights. I still boot up UT on occasion, but I play UT2004 far more then UT99 now.

I've finally begun my first mod project, and it's a pretty high-profile one: CTF4 for UT2004. I loved the original UT99 and I was glad to offer my services, which, at the time was jsut Mapping and Bug testing. It's since then grown, and I've learned a lot so far from the project. I hope to continue working with the team on Future Four-team projects. :)

Anyway, that's about it. If anyone is willing to teach me anything about LevelBuilding, I'll be glad to learn. You can email me [mailto:darkpulse@bandwidthmonkey.net here], or contact me via any Major Instant Messanger service. [http://edit.yahoo.com/config/send_webmesg?.target=negapulseman&amp;.src=pg YIM], [http://wwp.icq.com/scripts/search.dll?to=192410522 ICQ], AIM (Dark Pulse1) and MSN. (pulsemanfan001@hotmail.com) Please don't email the MSN addy... I get enough crap from there, and wouldn't want to toss a perfectly good email out just because I have my Junk Mail filter as Stringent as it can get...

I'm new here, hopefully I'll help a few souls on the way, much as this site has helped me.

Thanks. Buh-Bye now.

7/26/2003: I've now fallen into another kind of Obsession: Quake III Arena. I'm already trying to learn how to map for it, though having been spoiled by UnrealEd (Goblin and all!) I find the Quake Editor I chose, GTKRadiant, a bit tough to use, but I shall manage. Any Help here from someone who knows GTKRadiant would be highly appreciated.

7/28/2004: Well, needless to say, that died out fast. :P I stick to UT2004 mostly now.

10/29/2004: Now working with [http://wiki.beyondunreal.com/wiki/OverloadUT OverloadUT] as Mapper, Texture Maker, Bug Tester, and general Slave Driver of Team CTF4.

----

'''Tarquin:''' Hi there. Welcome to the wiki :D

'''Dark Pulse:''' Heh, thanks. Been here for awhile, almost a month or so, and I helped out in a batch of places where I had the right answers. So thanks for the (Belated, but still good!) Welcome. ^_^

'''Tarquin:''' I've been falling behind in my welcoming of newcomers. Sorry :( 

'''Dark Pulse:''' That's OK, Tar, you keep this place going. It's Forgiveable. ^_^

'''Dante:''' uh, welcome ;D ''/rant'' Yeah compared to Quake 3 gameplay I really don't like UT2003 (I prefer playing UT). ''rant/''

'''Dark Pulse:''' Personally, I have nothing wrong with UT2003's gameplay. The game was a bit rushed, but 2004 will hopefully make it up, even though it means we've got to shell out yet another $40 from our pockets...

Still, hopefully Assault, the new Stuff, and the Return of Xan Kreigor (Whoohoo!) will pull in The Old school and new School alike.

'''Dark Pulse:''' Oh yes, it did. ;p

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2727</id>
      <timestamp>2005-09-10T00:20:24Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>Added latest info: BU, UTR.</comment>
      <text xml:space="preserve">Howdy. This is my own little corner of this place...

My Real name is Thomas Warnica II. I've been making UT Maps (Most of which suck :)) for about 1 1/2 years now. I'm also amazingly good at UT and UT2004.

I've got a site of my own, [http://darkpulse.bandwidthmonkey.net Darkseid], and It's where I hold all my maps. It's finally back up (Whoo!) and is undergoing redesign.

I've currently made 4 Maps: DM-Darkseid Castle (GOD this sucked. So bad I took it down and plan not to rerelease it until it has a heavy redesign), CTF-SGarden, CTF4-Oblivia, and [http://nalicity.beyondunreal.com/map_hub.php?mid=6423 CTF-Pressure{DSRemix}], and, for UT2004, [http://nalicity.beyondunreal.com/map_hub.php?mid=7530 DM-Agony(DSRemix)]. I've also done or helped with Four maps currently for the CTF4 Project: DuelingKeeps, Chrome, Romra, and TutorialClassic, with more (That I can't announce yet, sorry) on their way.

I play with a couple of my buds, and am a regular participant of Beyond Unreal's FragBU tournaments on Friday and Saturday nights. I still boot up UT on occasion, but I play UT2004 far more then UT99 now.

I've finally begun my first mod project, and it's a pretty high-profile one: CTF4 for UT2004. I loved the original UT99 and I was glad to offer my services, which, at the time was jsut Mapping and Bug testing. It's since then grown, and I've learned a lot so far from the project. I hope to continue working with the team on Future Four-team projects. :)

Anyway, that's about it. If anyone is willing to teach me anything about LevelBuilding, I'll be glad to learn. You can email me [mailto:darkpulse@bandwidthmonkey.net here], or contact me via any Major Instant Messanger service. [http://edit.yahoo.com/config/send_webmesg?.target=negapulseman&amp;.src=pg YIM], [http://wwp.icq.com/scripts/search.dll?to=192410522 ICQ], AIM (Dark Pulse1) and MSN. (pulsemanfan001@hotmail.com) Please don't email the MSN addy... I get enough crap from there, and wouldn't want to toss a perfectly good email out just because I have my Junk Mail filter as Stringent as it can get...

I'm new here, hopefully I'll help a few souls on the way, much as this site has helped me.

Thanks. Buh-Bye now.

7/26/2003: I've now fallen into another kind of Obsession: Quake III Arena. I'm already trying to learn how to map for it, though having been spoiled by UnrealEd (Goblin and all!) I find the Quake Editor I chose, GTKRadiant, a bit tough to use, but I shall manage. Any Help here from someone who knows GTKRadiant would be highly appreciated.

7/28/2004: Well, needless to say, that died out fast. :P I stick to UT2004 mostly now.

10/29/2004: Now working with [http://wiki.beyondunreal.com/wiki/OverloadUT OverloadUT] as Mapper, Texture Maker, Bug Tester, and general Slave Driver of Team CTF4.

9/9/2005: Staff of BeyondUnreal since Febuary, 2005. Working as part of Team [http://www.getutr.com UTR].

----

'''Tarquin:''' Hi there. Welcome to the wiki :D

'''Dark Pulse:''' Heh, thanks. Been here for awhile, almost a month or so, and I helped out in a batch of places where I had the right answers. So thanks for the (Belated, but still good!) Welcome. ^_^

'''Tarquin:''' I've been falling behind in my welcoming of newcomers. Sorry :( 

'''Dark Pulse:''' That's OK, Tar, you keep this place going. It's Forgiveable. ^_^

'''Dante:''' uh, welcome ;D ''/rant'' Yeah compared to Quake 3 gameplay I really don't like UT2003 (I prefer playing UT). ''rant/''

'''Dark Pulse:''' Personally, I have nothing wrong with UT2003's gameplay. The game was a bit rushed, but 2004 will hopefully make it up, even though it means we've got to shell out yet another $40 from our pockets...

Still, hopefully Assault, the new Stuff, and the Return of Xan Kreigor (Whoohoo!) will pull in The Old school and new School alike.

'''Dark Pulse:''' Oh yes, it did. ;p

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark Pulse/Online Play</title>
    <id>1016</id>
    <revision>
      <id>2730</id>
      <timestamp>2003-07-03T22:36:29Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>Dark Pulse Rants about Online Play, how he thinks he does, and some of the quality asskickers out on the 'net.</comment>
      <text xml:space="preserve">Last night, I did something I haven't done since I actually first started UT.

I hopped on random servers.

And you know what? I found out I'm pretty damn good.

More often then not, I found myself in the Upper-Middle end of the scorelist. Now, granted, I was playing with some severe Disadvantages - The Game speed was sped up on nearly all of the servers (to about 150% I'd say) and Most of the matches were Hardcore. Plus on the games of CTF I did, the Blue team damn well stomped the shit out of my team using some creative techniques to get in the base. I think I'll try them next time I play.

Now, I know what you're thinking. 

&quot;'''I_Am_UT_Goodness:''' Dark Pulse, This is the Rant section... this sounds positive! Are you nuts?!?&quot;

No, I'm not. A Rant can be both good or bad... it depends on how you see it. I saw this, in particular, as good.

Make no mistake, there was some brutally great players on there. Some of the names I remeber are Gumby, ski (Telefrag Queen), ICPJuggalete, BruceLeesLeftNutt, and Morpheus. And, while they blew me halfway to hell, I can also say there's times I won the duels as well. And if by some chance one of those people happens to read this, I'll get you yet ;)

Plain and simple, if you plan on being good, as good as a lot of players online, You've gotta practice brutally. This means staving the bots from levels like Average and putting them on something like Adept. That's what level I've been hitting lately, and I'm gonna step it up a bit more today, to the next level with a few bots only, slowly working my way up.

It's improvement time. How well I am in the UT world I will never know, thanks to ngWorldStats no longer existing for it, but I can say I'm high.

Top Ten? Hell no.

Top 100? Seriously doubt.

Top 1000? Meh... Maybe.

Top 5000? Almost certainly.

I'm not gonna brag about my skill. Sure, I'm great, and I can whip all of my friends to kingdom come, but there's thousands of people out there who I can learn from. And that's why I taught some of my friends. Like BASTARD. This was the first FPS he's ever played on PC. And I got him so addicted to it he's come a long way in the 5 or so months he's played with me. The reason is because he might get blown up, oe Decapitated, or Gibbed 10 ways to sunday, but he learned it's not necessarily how you play, It's your drive. and while he's emulated my style well, there's some things I do that he can't quite pick up on, or understand why I do them. It's that bit, unfortunately, that will seperate us.

Do I have the aspirations of being the Greatest UT player ever? No. I'm not that insane. However, I can still improve, and I'm going to keep slugging away at it. And then maybe, once in a great while, I can hop onto a server that looks good and utterly dominate. :)

Comments are welcomed, as are anything I can learn off you.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark Pulse/Online Play 2</title>
    <id>1018</id>
    <revision>
      <id>2733</id>
      <timestamp>2005-01-14T03:18:30Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">So now I've been playing UT2004 more then UT classic, and I've been doing better and better, especially in gametypes like Onslaught.

Unfortunately, with 2004 comes a whole new set of problems.

===Lame Players===

This seems to be a broad series of players. For some it's the &quot;Cheap&quot; Players; e.g Shieldgun Campers on the opposite sides of portals in CTF-FaceClassic.

I generally put two people into this category though: Sore Winners/Losers and general assholes. The First is easy to spot; simply look for &quot;Just shut up and lose you dumb bitch&quot; or &quot;OMFG U HAK!!!&quot;

The second, sometimes easily. If they spam the chat, it's plainly visible. But usually they'll do something else, like Spam the Voice Taunts. (Which WON'T Show who it is.) A Game of ONS-Severance I played a couple months ago had someone going &quot;OH YEAH!!!&quot; for about 15 minutes while he had the Leviathan. It's people like that that we should be able to tell who's Taunting. It did in UT Classic, why not UT200x?

===VoIP Spammers===

Another one. We don't want to hear you playing Britney Spears, we don't want to know your Recipe for Homemade Fudge, and we don't want to hear you talking on the phone.  Fortunately, This SOMETIMES shows who is talking - but not always.

===Vehicle Whores===

Fortunately, this is a bit less of a problem now that the game's been out for over four months. But you still run into the guys who will sit and Wait for a Raptor, or a Goliath, or a Leviathan if that's availible. This translates into not everyone helping out, which usually translates into a stunning loss. GG guys, eh?

I'm not gonna go into Tactics for the most part, since they're not really Lame - Just called so. Unless you get into stuff like spawnkilling with vehicles, then that's lame. IN any end, the solution is always simple: Find another server. Unless this person is stalking you server-to-server or something, that is. Which brings me to a fourth issue...

===The Buddy Menu===

There REALLY should be an option to block people from seeing you that you don't want to. I've, fortunately, never had a personal stalker, but I know people who have, and it totally ruined the game for them. And it can't just be by name - People can and will alias to get around that if they '''REALLY''' love you - it needs to be by GUID. This would help a lot of people out IMO, and frankly I'm surprised it hasn't been done.

Alright, about enough for now, th steam has blown off. Questions, comments, and queries are welcomed, as usual.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2734</id>
      <timestamp>2005-01-13T23:28:31Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark Pulse/Source Code</title>
    <id>1017</id>
    <revision>
      <id>2731</id>
      <timestamp>2003-08-25T20:30:34Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It's been awhile since I've done anything on the Wiki, so I thought I'd share something with you. A Nice, little Rant. And it actually concerns a feasable topic.

'''The Unreal Engine Sourcecode.'''

Come on, Epic. Why not release it? You've clearly moved on from the Original Unreal Engine. The Last Game to use it, in its true to roots form as a FPS, was Deus Ex, I believe. That was released in 2000. And it's been already 5 years (1998-2003) for the ''ORIGINAL'' Unreal Engines. So Why Not Release em?

Look at the kinds of mods people made, with such limited Choicing! Unreal Fortress! Unreal 4 Ever! Tac Ops! All of these are great addons, and are absolutely great in their own right. But think for a second... If they had Full Source Codings, wouldn't the general Cosensus be that they'd be even better? Free from certain restrictions and Such that are part of the source code?

And while we're at it, let's expand on the subject. Let's take the Engine, Rip it apart, then put it back together, all with wholly new material. Someone I know wishes Desperately to work on a RPG with the Unreal Engine - And some of the ideas he has are right off the roof. Blow-you-away type stuff. Things like Decide how your character is. Think... If you attacked Human Players without remorse or reason - just walk up and slaughter them in cold blood - a Bounty would be put on your head, civilians would run you out of towns and try to kill you, and other players can team up to try and take you down. Day/Night Routines. Weaponry Galore. And Yes, some small UT &quot;Bits&quot; (One Idea we had was a Skeleton dressed in UT Armor and a Flak Cannon Nearby.) And for you to even start Multiplayer, you would have to immerse yourself, and beat single player mode first. It's nothing absolutely Long, maybe 40 hours of gameplay to just go through and win, but about 100 if you like to search and level up. Therefore, anyone online is already going to be at a good Level 30+, and know their stuff.

Oh, yes, and Easter Eggs. Tons of them. From little bits only me and him will understand, to the Traditional RPG of hidden items and subquests, it's all there. Thanks to the Unreal Engine, Each Town is a fully living, breathing world. Fights Occur in Real Time. Could you imagine what you'd play is? Would you be a Swordsman, Hacking and Slashing your way through? Maybe a Archer, Attacking at a Distance? How about a Necromancer, Wielding Unholy and Arcane Spells? Or maybe even an Assassin, someone for hire. Get your job, get your target, eliminate, get your pay, wait for next offer. The Choice is totally yours. Strength might not necesarily win a battle, not always.

Cheat Protection would be built in. We're making it near impossible for anyone to be able to alter a Reg Value, or to unlock multiplayer early. We would want our game to be throughly enjoyable, locked out to hacking and cracking, and, possibly, the most important thing of all.

'''''FREE.'''''

Not one Penny will be required for you to buy a full version of the game. Not at all. Absolutely Free, for all to play, provided you can stomach the Full Download. :p Donations are nice, and we'll probably get some once people play our product, but I'm not expecting to make thousands of dollars or anything. All I want is the Sweetest Damn RPG Ever unleashed to man, and maybe I'll earn my 15 minutes of fame while I'm at it. :)

But for that to Happen, we need Epic. Only they can really make this go from being a bunch of ideas to a dead-serious project. When we're all sitting on Double Gigahertz Machines, and 1 Gig of Ram seems laughable, maybe, just maybe, our little project will come up.

We're waiting, Epic. We're Waiting...

----

'''Foxpaw:''' I hate to burst your bubble but... that RPG you described is wholly possible without altering the source... in fact altering the source wouldn't make it any easier. When you break it down, the executable form of the engine is little more than an interpretive programming language with a few (VERY few compared to the functionality that is made in UScript) native functions, and those are only native for the speed gains. Epic is not likely to release the source because then someone could make a game based on it and publish it without paying a dime. How can they prove you ripped off their engine, if you have all of the original sources? There is nothing you can do natively than you can't do in UScript, with very few exceptions, and the things that you could change in the engine would not really be an improvement in my opinion.

As an interesting note, once my mod is complete I've been considering expanding it into an MMORPG style. I'm convinced it's entirely possible within UScript.

'''EntropicLqd:'''  The biggest barrier to an RPG style game (ignoring the server's apparent player limit) is the way the Unreal Engine handles maps.  RPG landscapes need to be more dynamic than I feel the engine would like.  Preserving state between the different maps you would need is also an interesting challenge although not impossible.

'''Dark Pulse:''' Maybe it's not perfect, but Unreal I did it well, albiet mostly in one direction. If anything, make several maps fo the area, or create what most RPGs do and utilize Switches of some kind. e.g; If X thing is on/off, then the Switch is on, otherwise, it's not.

For Example, If the Player has Beaten X Boss, then Y Town is saved. If Player fails to beat X Boss, then Y town is ruined.

These can be easily accomplished using IFs, ORs, ANDs, etc.

'''Foxpaw:''' Actually the player limit is relatively easily solved.. I've already got a plan for that one for my mod. Depending on what you mean about dynamic landscapes, I think it could all be easily done. Dark Pulse has the right idea there, you could easily change the static meshes on a bunch of buildings, etcetera. (assuming your buildings were static meshes and not BSP) Big changes like that aren't reasonable for the online version anyway, because you can't have player A walking around in a perfectly good city while player B inches away sees a ruined city.. but changes like that would be simple enough for the single player.

As an interesting tidbit, the Unreal Engine has a limited ability to save packages, which may allow you to modify a map in-game and save the modified version on the server. That would make thing a bit more persistent too. The RPG idea I think is 100% doable without messing with the source code.

'''EntropicLqd:''' Deus Ex saves the state of maps so I'm confident that the problem can be solved.  I did do some experimentation with generating a level dynamically using just meshes.  It ran much slower than I wanted and worked sometimes but not always.  I never managed to replace a real static mesh with a different model either.  It is possible that I simply got the code wrong though as I didn't spend a lot of time on it.  I do agree with Foxpaw though - having the engine source code won't realy help you that much.

I don't see why the server cannot save the state of levels - hence allowing large changes to levels (like destroyed buildings etc).

'''Foxpaw:''' It can. You'd have to use static meshes to make buildings if they were going to change though, because there's no way to rebuild the lightmaps from within the game. Because the meshes don't occlude, pure mesh maps don't usually run as fast, though I heard that &quot;ElecFields&quot; that shipped with UT2003 was just one subtracted cube and all meshes. The meshes need to be modular if you do this, because of the way static meshes are drawn it's better to have, say, a bunch of different flourishes, etc. and reuse them to make different buildings than to have one giant building mesh... drawing ten identical columns requires only slightly more GPU than drawing a single column, but if they are all made into one building mesh it will have the expense of 10x the price of one column. To get the most performance you really need to reuse the same static meshes as much as possible in your levels.. though you can mix-and-match small pieces to make it look varied.

Oh, I forgot to mention too, you can't replace &quot;staticmeshactors,&quot; because they are set as static and nodelete (I think. I know they can't be modified really in game.) Any regular actor set to DT_StaticMesh can serve the same purpose though, setting them to static and nodelete just makes them lower (IE none at all) overhead network-wise.

'''EntropicLqd:''' Electric Fields is indeed one large pile of meshes (some of the meshes are pretty large too).  As is Magma thinking about it.  The big advantage of using static meshes instead of BSP is that your map size reduces dramatically - possibly because of the way lightmaps are handled within the engine.  You are dead right about the way meshes are handled by the engine though.

'''Dark Pulse:''' You're forgetting Static Meshes really weren't added to the engine until around Build 900 or so, IIRC... So it wouldn't be possible to add those in without a source code. Unless I'm totally wrong.

'''EntropicLqd:''' The point was that you wouldn't need the engine source code to build the mod you describe.  You coupld simply build it straight on top of the UT2003 engine.  In fact, having the source code to the engine would most likely complicate matters.

'''Dark Pulse:''' Except we intended to do this on the First Gen Builds, Unreal/UT.

'''Foxpaw:''' Well, the headers for the first generationa re availible if you wanted to make native code. But the point is, you could still do it. Substitute static meshes for regular meshes. BSP draws at the same rate as regular meshes, so there's no advantage to doing it with BSP instead, except for lighting and possibly collision. (though you could make your own collision) If you wanted to get fancy you could make things change with movers, and change textures using decals.

'''Dark Pulse:''' True. Now the tough part is convincing him that we can do without the source code. :p

'''dRawkbox:''' I agree, much of this can be done with UnrealScript but as with any developer why limit and not open the source if that *may* help you do something that you cannot do with UnrealScript like extending the server connection code.  How can you make an RPG seem really realistic with only 32 clients connecting to a small map.  I think that anything that can be done with UnrealScript should be done that way, but there are limitations that some good coders could realy modify and make into something amazing.  Until Unreal is open source it will always be behind Quake and Half life mods in the *potential* arena.

'''Foxpaw:''' Well, like I said, the &quot;source&quot; is basically just the UScript interpreter. Very little is done natively. If you need more players you CAN extend the networking in Unrealscript. Run multiple servers and use TCP Links to have them share player data. In the original UT you can use Warpzones to seamlessly join maps  (allegedly, I have not done this personally) so there's no real limit on map size, except what your hardware can handle.

'''dRawkbox:''' True warps and TCP links can be done with UnrealScript but it would be hard to make large gathering areas like a marketplace or a sanctuary in planetside.  I think that great games can be made with Unreal as I have chosen it for a mod (it was a hard decision to choose over q3 engine with open) because it has advantages over other engines (large terrain being a huge point).  It would be nice just to have the possiblility to be able to extend that if you went into production but could not cut the steep cost of licensing. A good game can be made on any engine though its all about gameplay not necessarily features.

'''Dark Pulse:''' Gameplay ALWAYS has come before features. That's why I find myself playing a game like Chrono Trigger more then I play Final Fantasy X.

It's good to have eye candy, but it shouldn't be the focus. If your mod looks pretty but plays like crap, what good does it do?

'''Foxpaw:''' Well, my idea with the TCP links was that you would have three types of controller/pawn instead of two: PlayerPawn, Bot, and PlayerStandin. The Standin would basically just recieve updates from whatever server the player was actually connected to, thus keeping it's incarnation on all the servers up-to-date. Basically a distributed server. In my opinion, those public gathering places are overrated anyway. It seems that everyone there is either trying to sell crap nobody wants, or trying to buy something nobody has.

Alternatively, you could make a proof-of-concept kind of deal for UT2003 and submit it to the MSU contest. First prize includes an engine license.

'''dRawkbox:''' Fox, excellent idea. Planetside MMOFPS style this could be used for a sanctuary (I agree about the marketplaces) in planetside this a place to traina dn get a squad going before battle (www.planetside.com to see what I mean).   This is doable in the engine if someone wants to start a page for it.   I would contribute as much as I can outside of my mod.   With this library UnrealEngine potential would spread wide.  There would be bandwidth but you could probably squeeze more than 32 players in one one room virtually.  

'''El Muerte TDS:''' simple reason why not to release the Unreal\UT code: the current engine is based on the same code, releasing the code can reveal information that can be used against current and future games based on the engine. The reason that iD released the source code of the Quake and Quake 2 engine doesn't mean Epic Games should do the same.

Also note, if you have a great concept, worked out all details ''and'' legal issue, just contact Mark Rein with the info. If you're lucky you might get access to the code drop. But do note that whatever you are going to create must be closed source and 100% ''free'' (free as in beer, not speech).

'''Dark Pulse:''' I already noted in my main Rant that we planeed on having the game Free. As for Closed Source, I doubt that will be a problem. These people gave me so many hours of gaming enjoyment that respecting their wishes would be a simple thing for me to do.

'''RegularX:''' the last ucc_make I wrote was asking the same questions about the 436 build: [http://www.planetunreal.com/modsquad/ucc_make_17.htm UT's Last Stand]

'''Dark Pulse:''' I remember reading that awhile back, and that, in turn, led up to me eventually writing this. We have some valid points, but so do the arguments above. In the nd, though, It's Epic who will decide when to Release the source.

We all know it will happen eventually - But exactly when, only Mark Rein probably knows.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2732</id>
      <timestamp>2003-08-25T18:07:38Z</timestamp>
      <contributor>
        <ip>198.173.11.xxx</ip>
      </contributor>
      <comment>ucc_make link</comment>
      <text xml:space="preserve">It's been awhile since I've done anything on the Wiki, so I thought I'd share something with you. A Nice, little Rant. And it actually concerns a feasable topic.

'''The Unreal Engine Sourcecode.'''

Come on, Epic. Why not release it? You've clearly moved on from the Original Unreal Engine. The Last Game to use it, in its true to roots form as a FPS, was Deus Ex, I believe. That was released in 2000. And it's been already 5 years (1998-2003) for the ''ORIGINAL'' Unreal Engines. So Why Not Release em?

Look at the kinds of mods people made, with such limited Choicing! Unreal Fortress! Unreal 4 Ever! Tac Ops! All of these are great addons, and are absolutely great in their own right. But think for a second... If they had Full Source Codings, wouldn't the general Cosensus be that they'd be even better? Free from certain restrictions and Such that are part of the source code?

And while we're at it, let's expand on the subject. Let's take the Engine, Rip it apart, then put it back together, all with wholly new material. Someone I know wishes Desperately to work on a RPG with the Unreal Engine - And some of the ideas he has are right off the roof. Blow-you-away type stuff. Things like Decide how your character is. Think... If you attacked Human Players without remorse or reason - just walk up and slaughter them in cold blood - a Bounty would be put on your head, civilians would run you out of towns and try to kill you, and other players can team up to try and take you down. Day/Night Routines. Weaponry Galore. And Yes, some small UT &quot;Bits&quot; (One Idea we had was a Skeleton dressed in UT Armor and a Flak Cannon Nearby.) And for you to even start Multiplayer, you would have to immerse yourself, and beat single player mode first. It's nothing absolutely Long, maybe 40 hours of gameplay to just go through and win, but about 100 if you like to search and level up. Therefore, anyone online is already going to be at a good Level 30+, and know their stuff.

Oh, yes, and Easter Eggs. Tons of them. From little bits only me and him will understand, to the Traditional RPG of hidden items and subquests, it's all there. Thanks to the Unreal Engine, Each Town is a fully living, breathing world. Fights Occur in Real Time. Could you imagine what you'd play is? Would you be a Swordsman, Hacking and Slashing your way through? Maybe a Archer, Attacking at a Distance? How about a Necromancer, Wielding Unholy and Arcane Spells? Or maybe even an Assassin, someone for hire. Get your job, get your target, eliminate, get your pay, wait for next offer. The Choice is totally yours. Strength might not necesarily win a battle, not always.

Cheat Protection would be built in. We're making it near impossible for anyone to be able to alter a Reg Value, or to unlock multiplayer early. We would want our game to be throughly enjoyable, locked out to hacking and cracking, and, possibly, the most important thing of all.

'''''FREE.'''''

Not one Penny will be required for you to buy a full version of the game. Not at all. Absolutely Free, for all to play, provided you can stomach the Full Download. :p Donations are nice, and we'll probably get some once people play our product, but I'm not expecting to make thousands of dollars or anything. All I want is the Sweetest Damn RPG Ever unleashed to man, and maybe I'll earn my 15 minutes of fame while I'm at it. :)

But for that to Happen, we need Epic. Only they can really make this go from being a bunch of ideas to a dead-serious project. When we're all sitting on Double Gigahertz Machines, and 1 Gig of Ram seems laughable, maybe, just maybe, our little project will come up.

We're waiting, Epic. We're Waiting...

----

'''Foxpaw:''' I hate to burst your bubble but... that RPG you described is wholly possible without altering the source... in fact altering the source wouldn't make it any easier. When you break it down, the executable form of the engine is little more than an interpretive programming language with a few (VERY few compared to the functionality that is made in UScript) native functions, and those are only native for the speed gains. Epic is not likely to release the source because then someone could make a game based on it and publish it without paying a dime. How can they prove you ripped off their engine, if you have all of the original sources? There is nothing you can do natively than you can't do in UScript, with very few exceptions, and the things that you could change in the engine would not really be an improvement in my opinion.

As an interesting note, once my mod is complete I've been considering expanding it into an MMORPG style. I'm convinced it's entirely possible within UScript.

'''EntropicLqd:'''  The biggest barrier to an RPG style game (ignoring the server's apparent player limit) is the way the Unreal Engine handles maps.  RPG landscapes need to be more dynamic than I feel the engine would like.  Preserving state between the different maps you would need is also an interesting challenge although not impossible.

'''Dark Pulse:''' Maybe it's not perfect, but Unreal I did it well, albiet mostly in one direction. If anything, make several maps fo the area, or create what most RPGs do and utilize Switches of some kind. e.g; If X thing is on/off, then the Switch is on, otherwise, it's not.

For Example, If the Player has Beaten X Boss, then Y Town is saved. If Player fails to beat X Boss, then Y town is ruined.

These can be easily accomplished using IFs, ORs, ANDs, etc.

'''Foxpaw:''' Actually the player limit is relatively easily solved.. I've already got a plan for that one for my mod. Depending on what you mean about dynamic landscapes, I think it could all be easily done. Dark Pulse has the right idea there, you could easily change the static meshes on a bunch of buildings, etcetera. (assuming your buildings were static meshes and not BSP) Big changes like that aren't reasonable for the online version anyway, because you can't have player A walking around in a perfectly good city while player B inches away sees a ruined city.. but changes like that would be simple enough for the single player.

As an interesting tidbit, the Unreal Engine has a limited ability to save packages, which may allow you to modify a map in-game and save the modified version on the server. That would make thing a bit more persistent too. The RPG idea I think is 100% doable without messing with the source code.

'''EntropicLqd:''' Deus Ex saves the state of maps so I'm confident that the problem can be solved.  I did do some experimentation with generating a level dynamically using just meshes.  It ran much slower than I wanted and worked sometimes but not always.  I never managed to replace a real static mesh with a different model either.  It is possible that I simply got the code wrong though as I didn't spend a lot of time on it.  I do agree with Foxpaw though - having the engine source code won't realy help you that much.

I don't see why the server cannot save the state of levels - hence allowing large changes to levels (like destroyed buildings etc).

'''Foxpaw:''' It can. You'd have to use static meshes to make buildings if they were going to change though, because there's no way to rebuild the lightmaps from within the game. Because the meshes don't occlude, pure mesh maps don't usually run as fast, though I heard that &quot;ElecFields&quot; that shipped with UT2003 was just one subtracted cube and all meshes. The meshes need to be modular if you do this, because of the way static meshes are drawn it's better to have, say, a bunch of different flourishes, etc. and reuse them to make different buildings than to have one giant building mesh... drawing ten identical columns requires only slightly more GPU than drawing a single column, but if they are all made into one building mesh it will have the expense of 10x the price of one column. To get the most performance you really need to reuse the same static meshes as much as possible in your levels.. though you can mix-and-match small pieces to make it look varied.

Oh, I forgot to mention too, you can't replace &quot;staticmeshactors,&quot; because they are set as static and nodelete (I think. I know they can't be modified really in game.) Any regular actor set to DT_StaticMesh can serve the same purpose though, setting them to static and nodelete just makes them lower (IE none at all) overhead network-wise.

'''EntropicLqd:''' Electric Fields is indeed one large pile of meshes (some of the meshes are pretty large too).  As is Magma thinking about it.  The big advantage of using static meshes instead of BSP is that your map size reduces dramatically - possibly because of the way lightmaps are handled within the engine.  You are dead right about the way meshes are handled by the engine though.

'''Dark Pulse:''' You're forgetting Static Meshes really weren't added to the engine until around Build 900 or so, IIRC... So it wouldn't be possible to add those in without a source code. Unless I'm totally wrong.

'''EntropicLqd:''' The point was that you wouldn't need the engine source code to build the mod you describe.  You coupld simply build it straight on top of the UT2003 engine.  In fact, having the source code to the engine would most likely complicate matters.

'''Dark Pulse:''' Except we intended to do this on the First Gen Builds, Unreal/UT.

'''Foxpaw:''' Well, the headers for the first generationa re availible if you wanted to make native code. But the point is, you could still do it. Substitute static meshes for regular meshes. BSP draws at the same rate as regular meshes, so there's no advantage to doing it with BSP instead, except for lighting and possibly collision. (though you could make your own collision) If you wanted to get fancy you could make things change with movers, and change textures using decals.

'''Dark Pulse:''' True. Now the tough part is convincing him that we can do without the source code. :p

'''dRawkbox:''' I agree, much of this can be done with UnrealScript but as with any developer why limit and not open the source if that *may* help you do something that you cannot do with UnrealScript like extending the server connection code.  How can you make an RPG seem really realistic with only 32 clients connecting to a small map.  I think that anything that can be done with UnrealScript should be done that way, but there are limitations that some good coders could realy modify and make into something amazing.  Until Unreal is open source it will always be behind Quake and Half life mods in the *potential* arena.

'''Foxpaw:''' Well, like I said, the &quot;source&quot; is basically just the UScript interpreter. Very little is done natively. If you need more players you CAN extend the networking in Unrealscript. Run multiple servers and use TCP Links to have them share player data. In the original UT you can use Warpzones to seamlessly join maps  (allegedly, I have not done this personally) so there's no real limit on map size, except what your hardware can handle.

'''dRawkbox:''' True warps and TCP links can be done with UnrealScript but it would be hard to make large gathering areas like a marketplace or a sanctuary in planetside.  I think that great games can be made with Unreal as I have chosen it for a mod (it was a hard decision to choose over q3 engine with open) because it has advantages over other engines (large terrain being a huge point).  It would be nice just to have the possiblility to be able to extend that if you went into production but could not cut the steep cost of licensing. A good game can be made on any engine though its all about gameplay not necessarily features.

'''Dark Pulse:''' Gameplay ALWAYS has come before features. That's why I find myself playing a game like Chrono Trigger more then I play Final Fantasy X.

It's good to have eye candy, but it shouldn't be the focus. If your mod looks pretty but plays like crap, what good does it do?

'''Foxpaw:''' Well, my idea with the TCP links was that you would have three types of controller/pawn instead of two: PlayerPawn, Bot, and PlayerStandin. The Standin would basically just recieve updates from whatever server the player was actually connected to, thus keeping it's incarnation on all the servers up-to-date. Basically a distributed server. In my opinion, those public gathering places are overrated anyway. It seems that everyone there is either trying to sell crap nobody wants, or trying to buy something nobody has.

Alternatively, you could make a proof-of-concept kind of deal for UT2003 and submit it to the MSU contest. First prize includes an engine license.

'''dRawkbox:''' Fox, excellent idea. Planetside MMOFPS style this could be used for a sanctuary (I agree about the marketplaces) in planetside this a place to traina dn get a squad going before battle (www.planetside.com to see what I mean).   This is doable in the engine if someone wants to start a page for it.   I would contribute as much as I can outside of my mod.   With this library UnrealEngine potential would spread wide.  There would be bandwidth but you could probably squeeze more than 32 players in one one room virtually.  

'''El Muerte TDS:''' simple reason why not to release the Unreal\UT code: the current engine is based on the same code, releasing the code can reveal information that can be used against current and future games based on the engine. The reason that iD released the source code of the Quake and Quake 2 engine doesn't mean Epic Games should do the same.

Also note, if you have a great concept, worked out all details ''and'' legal issue, just contact Mark Rein with the info. If you're lucky you might get access to the code drop. But do note that whatever you are going to create must be closed source and 100% ''free'' (free as in beer, not speech).

'''Dark Pulse:''' I already noted in my main Rant that we planeed on having the game Free. As for Closed Source, I doubt that will be a problem. These people gave me so many hours of gaming enjoyment that respecting their wishes would be a simple thing for me to do.

'''RegularX:''' the last ucc_make I wrote was asking the same questions about the 436 build: [http://www.planetunreal.com/modsquad/ucc_make_17.htm UT's Last Stand]

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark Pulse/Whining Lamers</title>
    <id>1015</id>
    <revision>
      <id>2728</id>
      <timestamp>2003-07-02T22:52:00Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You know what I see on a lot of servers nowadays? Something along the lines of this.

{{innerbox|
===A snippet from your average Game Chat===

----

UT_GOD: All your gibs are belong to me!

Barak was smacked down by Visse's Rocket Launcher.

UT_GOD put a bullet through Ichthys's Head.

UT_GOD: w00t

UT_GOD was smeared by {DA}_Professional's Piston.

UT_GOD: OH MY GOD YOU SUCK CHEATER F*CKING FAGGOT HOW THE HELL DID YOU DO THAT



}}

Don't you just love people like this? People who come onto your server, suck up YOUR bandwidth, talk shit, and then when they die, bitch up a storm? They come in thinking they're the stuff, when in reality, they got plenty of Bark - Just not much Bite.

If you claim to be the best UT player on this Beautiful little ball of Blue, Green, and Brown, why keep playing types you don't do so good at? Seriously, are these people gluttons for punishment or something? There's a difference between not LIKING and SUCKING at a gametype. I don't like Domination in particular, but I don't suck at it. These people will purposely play what they blow goats at, just to scream and shout about people who play it and kill them. I think they're just there to make your games miserable.

And then if you kick them, they keep coming back for more. So you start Kickbanning.  5 minutes later, thanks to the Magic of Proxies, they're back in the game. You can't just add Password Protection, because you would then have to start the game anew, which is silly unless it's early on. The only solution is to make all your games pass protected, and even then it's not a garuntee they'll somehow hack the game pass. The only true way is to change your Pass every session, or your IP.

Or just do what I do: Rarely advertise your server. In the 1 1/2 years I've netplayed UT, I think I've advertised my server Thrice. If someone wants to play me, then I'll tell them the IP. But I just ain't giving it out to the world.

A Bit overdefensive? Possibly. But I've yet to encounter one of the Whiners on my server.

'''Mosquito:'''

Here's a simular experience on my old server




'''OR'''

UT_GOD: LAGG!!!

UT_GOD was smacked down by Raptor's Rocket Launcher.

UT_GOD: WTF!!! I LAGDE ON THIS SHITTY SERVRE!

UT_GOD killed him own dumb self

UT_GOD: I G0T H4X!!

UT_GOD: THS SERVR SUX!!! FAGGETS!!

UT_GOD: FAGETTS!

P3nis: H4X???

UT_GOD: FAGETTS!

P3nis: H4X!!!111

UT_GOD: FAGETTS!

UT_GOD: FAGETTS!

UT_GOD: FAGETTS!

UT_GOD: FAGETTS!

P3nis: H4X!!!111

P3nis: H4X!!!111

P3nis: H4X!!!111

P3nis: H4X!!!111

P3nis: 0mfg!! Banned!!

Raptor: PWN3d



Its not the server's fault that someone is ass ramming themselves with your internet connection, NO ONE ELSE IS LAGGING!! NIETHER ARE YOU!! ''Maybe, just maybe'' '''YOU SUCK'''
:rolleyes:

'''Dark Pulse:''' Anything but their skills, you know. That's why I always get a good laugh out of conversations like the above, as they happen inevitably. And then I try to keep myself from laughing because someone is firing rockets in my direction, and I need to live...

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2729</id>
      <timestamp>2003-07-02T22:42:13Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You know what I see on a lot of servers nowadays? Something along the lines of this.

{{innerbox|
===A snippet from your average Game Chat===

----

UT_GOD: All your gibs are belong to me!

Barak was smacked down by Visse's Rocket Launcher.

UT_GOD put a bullet through Ichthys's Head.

UT_GOD: w00t

UT_GOD was smeared by {DA}_Professional's Piston.

UT_GOD: OH MY GOD YOU SUCK CHEATER F*CKING FAGGOT HOW THE HELL DID YOU DO THAT



}}

Don't you just love people like this? People who come onto your server, suck up YOUR bandwidth, talk shit, and then when they die, bitch up a storm? They come in thinking they're the stuff, when in reality, they got plenty of Bark - Just not much Bite.

If you claim to be the best UT player on this Beautiful little ball of Blue, Green, and Brown, why keep playing types you don't do so good at? Seriously, are these people gluttons for punishment or something? There's a difference between not LIKING and SUCKING at a gametype. I don't like Domination in particular, but I don't suck at it. These people will purposely play what they blow goats at, just to scream and shout about people who play it and kill them. I think they're just there to make your games miserable.

And then if you kick them, they keep coming back for more. So you start Kickbanning.  5 minutes later, thanks to the Magic of Proxies, they're back in the game. You can't just add Password Protection, because you would then have to start the game anew, which is silly unless it's early on. The only solution is to make all your games pass protected, and even then it's not a garuntee they'll somehow hack the game pass. The only true way is to change your Pass every session, or your IP.

Or just do what I do: Rarely advertise your server. In the 1 1/2 years I've netplayed UT, I think I've advertised my server Thrice. If someone wants to play me, then I'll tell them the IP. But I just ain't giving it out to the world.

A Bit overdefensive? Possibly. But I've yet to encounter one of the Whiners on my server.

'''Mosquito:'''

Here's a simular experience on my old server




'''OR'''

UT_GOD: LAGG!!!

UT_GOD was smacked down by Raptor's Rocket Launcher.

UT_GOD: WTF!!! I LAGDE ON THIS SHITTY SERVRE!

UT_GOD killed him own dumb self

UT_GOD: I G0T H4X!!

UT_GOD: THS SERVR SUX!!! FAGGETS!!

UT_GOD: FAGETTS!

P3nis: H4X???

UT_GOD: FAGETTS!

P3nis: H4X!!!111

UT_GOD: FAGETTS!

UT_GOD: FAGETTS!

UT_GOD: FAGETTS!

UT_GOD: FAGETTS!

P3nis: H4X!!!111

P3nis: H4X!!!111

P3nis: H4X!!!111

P3nis: H4X!!!111

P3nis: 0mfg!! Banned!!

Raptor: PWN3d



Its not the server's fault that someone is ass ramming themselves with your internet connection, NO ONE ELSE IS LAGGING!! NIETHER ARE YOU!! ''Maybe, just maybe'' '''YOU SUCK'''
:rolleyes:

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark Ryder</title>
    <id>1066</id>
    <revision>
      <id>2836</id>
      <timestamp>2004-08-31T19:15:01Z</timestamp>
      <contributor>
        <ip>Dark Ryder</ip>
      </contributor>
      <comment>Added contact info</comment>
      <text xml:space="preserve">==About Me==

I'm the resident &quot;code monkey&quot; for House of Fish Games, which hopes to release some interesting mods for [[Legacy:UT2004|UT2004]] in the next few months.  I'm new to &quot;wiki-ing&quot;, but have found a ''ton'' of info here and look forward to contributing back as I learn more about UT2004 and [[Legacy:UnrealScript|UnrealScript]] in particular.  You can contact me by posting in the Discussion area below or by emailing me at ''dark.ryder&amp;nbsp;at&amp;nbsp;gmail&amp;nbsp;dot&amp;nbsp;com''.

==Announcements and Testing Info==

''HoF Mod'' &amp;rarr; initial release coming &quot;soon&quot;
*Designed for use at House of Fish LAN parties, but soon to be available to all.
*Tested for compatibility with all built-in gametypes.  ''(Well, not at first; a server will be posted in the [[Legacy:Testing Lab|Testing Lab]] when we start this phase.)''
*'''Tweakable Weapons Mutator''' &amp;rarr; Exposes internal settings for all built-in weapons.  Alter weapon damage, ammo consumption, blast radii, projectile velocity...
*'''&quot;No Web&quot; Mutator''' &amp;rarr; I don't know about you, but I've never liked the &quot;Web Gun&quot; mounted on the Scorpion.  Now you can change it into a variety of other suitable weapons.  ''(Only one so far, hope to have a second ready in time for release.)''

''INI Manager'' &amp;rarr; To be written, probably in the next three or four weeks ''(keep-me-honest-note: this was posted 26 Aug 2004)''
*Instantly change many settings at once by choosing between multiple INI files.
*Share mod settings or any other INI-based info with friends.
*Windows only :-(

==Discussion/Feedback==

'''Tarquin:''' Hi, welcome :) BTW, you can make mdash with &quot; &amp;ndash; &quot;. Another neat parser trick :)

'''Dark Ryder:''' Thanks.  I've been making sure to use that (it's probably more &quot;correct&quot; to use wiki formatting instead of HTML when possible, I figure), but was curious about HTML entities not specifically mentioned on [[Legacy:Wiki Markup|Wiki Markup]] and mdash was othe only one I could think of off the top of my head that wasn't listed ;-)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2837</id>
      <timestamp>2004-08-26T08:03:53Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

I'm the resident &quot;code monkey&quot; for House of Fish Games, which hopes to release some interesting mods for [[Legacy:UT2004|UT2004]] in the next few months.  I'm new to &quot;wiki-ing&quot;, but have found a ''ton'' of info here and look forward to contributing back as I learn more about UT2004 and [[Legacy:UnrealScript|UnrealScript]] in particular.

==Announcements and Testing Info==

''HoF Mod'' &amp;rarr; initial release coming &quot;soon&quot;
*Designed for use at House of Fish LAN parties, but soon to be available to all.
*Tested for compatibility with all built-in gametypes.  ''(Well, not at first; a server will be posted in the [[Legacy:Testing Lab|Testing Lab]] when we start this phase.)''
*'''Tweakable Weapons Mutator''' &amp;rarr; Exposes internal settings for all built-in weapons.  Alter weapon damage, ammo consumption, blast radii, projectile velocity...
*'''&quot;No Web&quot; Mutator''' &amp;rarr; I don't know about you, but I've never liked the &quot;Web Gun&quot; mounted on the Scorpion.  Now you can change it into a variety of other suitable weapons.  ''(Only one so far, hope to have a second ready in time for release.)''

''INI Manager'' &amp;rarr; To be written, probably in the next three or four weeks
*Instantly change many settings at once by choosing between multiple INI files.
*Share mod settings or any other INI-based info with friends.
*Windows only :-(

==Discussion/Feedback==

'''Tarquin:''' Hi, welcome :) BTW, you can make mdash with &quot; &amp;ndash; &quot;. Another neat parser trick :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2838</id>
      <timestamp>2004-08-26T21:57:15Z</timestamp>
      <contributor>
        <ip>Dark Ryder</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

I'm the resident &quot;code monkey&quot; for House of Fish Games, which hopes to release some interesting mods for [[Legacy:UT2004|UT2004]] in the next few months.  I'm new to &quot;wiki-ing&quot;, but have found a ''ton'' of info here and look forward to contributing back as I learn more about UT2004 and [[Legacy:UnrealScript|UnrealScript]] in particular.

==Announcements and Testing Info==

''HoF Mod'' &amp;rarr; initial release coming &quot;soon&quot;
*Designed for use at House of Fish LAN parties, but soon to be available to all.
*Tested for compatibility with all built-in gametypes.  ''(Well, not at first; a server will be posted in the [[Legacy:Testing Lab|Testing Lab]] when we start this phase.)''
*'''Tweakable Weapons Mutator''' &amp;rarr; Exposes internal settings for all built-in weapons.  Alter weapon damage, ammo consumption, blast radii, projectile velocity...
*'''&quot;No Web&quot; Mutator''' &amp;rarr; I don't know about you, but I've never liked the &quot;Web Gun&quot; mounted on the Scorpion.  Now you can change it into a variety of other suitable weapons.  ''(Only one so far, hope to have a second ready in time for release.)''

''INI Manager'' &amp;rarr; To be written, probably in the next three or four weeks
*Instantly change many settings at once by choosing between multiple INI files.
*Share mod settings or any other INI-based info with friends.
*Windows only :-(

==Discussion/Feedback==

'''Tarquin:''' Hi, welcome :) BTW, you can make mdash with &quot; &amp;ndash; &quot;. Another neat parser trick :)

'''Dark Ryder:''' Thanks.  I've been making sure to use that (it's probably more &quot;correct&quot; to use wiki formatting instead of HTML when possible, I figure), but was curious about HTML entities not specifically mentioned on [[Legacy:Wiki Markup|Wiki Markup]] and mdash was othe only one I could think of off the top of my head that wasn't listed ;-)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dark T</title>
    <id>971</id>
    <revision>
      <id>2628</id>
      <timestamp>2002-09-03T19:16:17Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>darn, third place</comment>
      <text xml:space="preserve">'''Tarquin:''' Hullo, welcome to the unreal wiki. :) 

'''EntropicLqd:''' Hi.  Welcome.  Enjoy.

'''ZxAnPhOrIaN:''' Hello, welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2629</id>
      <timestamp>2002-09-03T11:53:34Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>hello</comment>
      <text xml:space="preserve">'''Tarquin:''' Hullo, welcome to the unreal wiki. :) 

'''EntropicLqd:''' Hi.  Welcome.  Enjoy.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DarkCornerVolume</title>
    <id>1019</id>
    <revision>
      <id>2735</id>
      <timestamp>2003-08-21T11:49:34Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I wrote this up for a question on the Atari Forums, but figured it would useful here too.  I'm not sure if this works in network play, but I think it probably will.  Stuff that has throbbing glow (like some UT pickups had) obviously won't work right with this (it won't have any effect on them).

The purpose of this class is to allow mappers to create dark areas (typically corners, alcoves, or hallways) that players can successfully hide in.  Unfortunately, it has to be compiled with ucc rather than in UnrealEd as there's no way to set bStatic to false in UnrealEd.

&lt;uscript&gt;
class DarkCornerVolume extends Volume;

var() float howBright; // 0 = complete black, 1 = regular glow

simulated event touch(Actor A) {
    if (!(A.DrawType == DT_Mesh || A.DrawType == DT_StaticMesh)) return;
    A.AmbientGlow = A.Default.AmbientGlow*howBright;
}

simulated event untouch(Actor A) {
    if (!(A.DrawType == DT_Mesh || A.DrawType == DT_StaticMesh)) return;
    A.AmbientGlow = A.Default.AmbientGlow;
}

defaultproperties
{
   howBright = 0.0;
   bStatic=False
}
&lt;/uscript&gt;

----

'''inio:''' Will this work in net play?  I think it will but I'm not sure.  Someone more experienced should write up a page on [[Legacy:Testing Netcode|Testing Netcode]].

'''Foxpaw:''' How is this diferent than just having an area with no lights? Players don't have an ambient glow, do they?

'''inio:''' Ah, but they do.  default ambient glow is 64 I think.  Try it - make a default cube, no light, one player start.  run the map and &quot;behindview 1&quot;.

'''Mychaeel:''' You should be able to modify ''any'' class default property in UnrealEd by entering &quot;editobj &lt;classname&gt;&quot; in UnrealEd's console.  (bStatic will show up in the &quot;None&quot; section.) &amp;ndash; Give that a try, and if it works out, add it to this page please.</text>
    </revision>
    <revision>
      <id>2736</id>
      <timestamp>2003-08-21T11:31:36Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I wrote this up for a question on the Atari Forums, but figured it would useful here too.  I'm not sure if this works in network play, but I think it probably will.  Stuff that has throbbing glow (like some UT pickups had) obviously won't work right with this (it won't have any effect on them).

The purpose of this class is to allow mappers to create dark areas (typically corners, alcoves, or hallways) that players can successfully hide in.  Unfortunately, it has to be compiled with ucc rather than in UnrealEd as there's no way to set bStatic to false in UnrealEd.

&lt;uscript&gt;
class DarkCornerVolume extends Volume;

var() float howBright; // 0 = complete black, 1 = regular glow

simulated event touch(Actor A) {
    if (!(A.DrawType == DT_Mesh || A.DrawType == DT_StaticMesh)) return;
    A.AmbientGlow = A.Default.AmbientGlow*howBright;
}

simulated event untouch(Actor A) {
    if (!(A.DrawType == DT_Mesh || A.DrawType == DT_StaticMesh)) return;
    A.AmbientGlow = A.Default.AmbientGlow;
}

defaultproperties
{
   howBright = 0.0;
   bStatic=False
}
&lt;/uscript&gt;

----

'''inio:''' Will this work in net play?  I think it will but I'm not sure.  Someone more experienced should write up a page on [[Legacy:Testing Netcode|Testing Netcode]].

'''Foxpaw:''' How is this diferent than just having an area with no lights? Players don't have an ambient glow, do they?

'''inio:''' Ah, but they do.  default ambient glow is 64 I think.  Try it - make a default cube, no light, one player start.  run the map and &quot;behindview 1&quot;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DarthDevilous</title>
    <id>1070</id>
    <revision>
      <id>2845</id>
      <timestamp>2005-01-16T16:40:26Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>hi</comment>
      <text xml:space="preserve">Hi, I'm fairly new to wikis generally and even more so to the unrealwiki. Since I have already made one or two page edits ([[Legacy:Visual Studio 6|Visual Studio 6]]) I decided to make a personal page. So, umm... well, what else is there to say? I havent got a homepage or anything unfortunatly. I just hope I can be of some sort of help.

'''Mychaeel:''' Welcome!

'''Tarquin:''' Hello there! :)

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2846</id>
      <timestamp>2005-01-16T16:06:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi, I'm fairly new to wikis generally and even more so to the unrealwiki. Since I have already made one or two page edits ([[Legacy:Visual Studio 6|Visual Studio 6]]) I decided to make a personal page. So, umm... well, what else is there to say? I havent got a homepage or anything unfortunatly. I just hope I can be of some sort of help.

'''Mychaeel:''' Welcome!

'''Tarquin:''' Hello there! :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Darthlore</title>
    <id>1012</id>
    <revision>
      <id>2721</id>
      <timestamp>2003-06-06T00:24:36Z</timestamp>
      <contributor>
        <ip>Darthlore</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">started unreal editing about two years ago and have yet to comeplete a single level and releace it many of them falling pray to unfixable bsp holes ''arghhh''. I've just compleated my first year of computer progamming if someone can tell me a good use for pascal in unreal script im willing to lisien 

====Level for UT ====

=====AS-SpaceBase =====

A very large map based on the moon(I think I worked out the surface area to be something like 1.6km sq thats around 1 mile sq!! took over a minute to run from one side of the map to the other) players landed at a space port and to gain access to the base (and blow up something or steal never got that far) which had a big wall that that could not be passed by foot so they had to fight thier way in to the space port's control tower and open the cargo hanger doors activate a transport train to smash through the bases bulkhead doors do what they were ment to do in the base then escape via stole figher craft

ran in to major BSP holes when filling in the base detail also the impassable wall i asked DavidM if I could use the telsa coil scrip from ONP(to really make shore it was impassable :) )he said yes, tryed to extract it from the old skoll package as it is kinda large to be sending around with only one map but failed though I was not really trying as my unrealscript knowlage is kinda limited it was deeply imbeded in it origonal package and i could not find the link as it was loading up my package as well as all the old skoll and its acoated textures packages.

Suppose i should try again as it seems a shame to let it go to waste

=====CTF-Healpod =====

A CTF level obviously enough, based around a modrenised Heal Pod with smasher and all. Lots of diffrent levels  so i'd say plenty of z-axis fighting i think CTF-Drery (spelling?) was the bases of it yet i was using CTF-Coret  textures for it was put on pause because i ran out of ideas it was also another large level was expementing with team canons that the defenders could use by stand in front of a console but while there they were in a cramped place very suceptable to rockets and geting sniped at as there was nowhere to dodge to.
 

=====CTF-Rift=====

Based on the same planet as lava gaint based inside the magma chamber of two seprate volcanos seperated by a big rift valley passable only a single bridge with a upper and lower level upper level was very open and esay to get killed yet offered neary direct access to the ememy flag the lower bridge level offered the long road via a winding network of natural tunnels (coincidentally being perfecly semerictal for both bases :) ). I really loved the flag room that i made for the bases a series of wind platforms that was easy to navagate yet one false step and u would end up in a lava pit a hundead feet bellow kinda like eternal caves's blue base. Ran in to sevier ICH trouble in one of the lower caverans that blocked the whole system up also some bsp holes that would not go away after any amount of reordering of brushes and changing of brushes also another massive level 

(Seams to be some kind of paterren of massive levels)  

a few others have to look them up and many many krud levels such as DM-FragFest cough... cough... lets just say afew random lagre rooms joined together by random cordors and in the rooms as many unreal scripted pawns that would fit and me with all the guns (and ammo) where u start need i say more, I was board at the time and felt like killing something that day ok a few things... alot of things :)

===Comments ===

'''Foxpaw:''' Pascal's use in modifying UT is limited.. if you are an Epic licensee, you could likely compile the pascal code into a DLL and import it that way, but since Epic claims to only license their engine to established software developers and would likely frown upon membership to a community such as this, (due to the Non-Disclosure Agreement) that may not be an option that is availible to you. The good news is, Unrealscript, the primary method of coding things for UT, uses a syntax very similar to C++, which is basically the same as Pascal but with different names and symbols. :P It also allegedly has some Java elements, but I feel an unexplained antipathy for java, so I don't use it. Since I love the OOP nature of Unrealscript, I'm probrably missing out, but meh.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2722</id>
      <timestamp>2003-06-05T10:10:56Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">started unreal editing about two years ago and have yet to comeplete a single level and releace it many of them falling pray to unfixable bsp holes *''arghhh'' i've just compleated my first year of computer progamming if someone can tell me a good use for pascal in unreal script im willing to lisien 

====Level for UT ====

discription soon

=====AS-SpaceBase =====

=====CTF-Healpod =====

=====CTF-Rift =====

a few other can think its two in the morning 

===Comments ===

'''Foxpaw:''' Pascal's use in modifying UT is limited.. if you are an Epic licensee, you could likely compile the pascal code into a DLL and import it that way, but since Epic claims to only license their engine to established software developers and would likely frown upon membership to a community such as this, (due to the Non-Disclosure Agreement) that may not be an option that is availible to you. The good news is, Unrealscript, the primary method of coding things for UT, uses a syntax very similar to C++, which is basically the same as Pascal but with different names and symbols. :P It also allegedly has some Java elements, but I feel an unexplained antipathy for java, so I don't use it. Since I love the OOP nature of Unrealscript, I'm probrably missing out, but meh.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dash</title>
    <id>1002</id>
    <revision>
      <id>2699</id>
      <timestamp>2004-09-28T05:32:47Z</timestamp>
      <contributor>
        <ip>Dash</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Basic Info==

'''Nick''': Dash

'''Real Name''': Ryan Brim

'''Email''': rmanboy@hotmail.com

'''Dev Journal''': [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]

'''Speciality''': Programming (Going to get more into content creation though)

==Projects==

====Past====
; Lazingoth : A proof of concept for a Game design class that was never released for UT2k3. It was console type RPG using a USB controller that featured a combo system that you could lock on to your enemies and cast different spell depending on the combonation of Fire, Wind, Water, and Earth elements the player used. 
; Infection: A mod I worked on for another class. It was an Action-Horror FPS for UT2k3 that took 4th overall in the MSU in the FPS category. While it had its share of problems it turned out quite well. I mainly worked on the HUD (with several redesigns from the designers) and did little features here and there. &lt;br /&gt;&lt;br /&gt;http://www.planetunreal.com/infection/

====Present====
; Call to Arms: A mod I have been working on since May of 2004 with my brother. Its an Action RPG that tries to bring more interactivity to the genre. Rather than having little input from the player other than what to attack we want to present the player with different options. Like with melee combat having the player decide when to block, chain attacks together when you catch them off guard or use a special attack that takes longer to use but does more damage and breaks blocks. We have alot of other features planned so check out the site and my Dev Journal for updates. &lt;br /&gt;&lt;br /&gt;http://www.planetunreal.com/calltoarms/

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dash/Developer Journal</title>
    <id>1023</id>
    <revision>
      <id>2744</id>
      <timestamp>2004-09-28T06:07:45Z</timestamp>
      <contributor>
        <ip>Dash</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==September 27, 2004==

This is my first journal entry and I am relatively new to contributing to the wiki so bare with me. I have used the wiki quite often in the past and it has been a huge help. I will contribute anything I come across while modding to wiki from now on. My current Project is Call to Arms an Action RPG for UT2k4. We released a &quot;demo&quot; (I don’t like releasing &quot;Betas”) recently for phase 4 of the MSU. While it didn’t have a lot of content to explore it shows a lot of promise and is a pretty big departure from UT2k4 in terms of type of game and mods usually created for it. I am currently fixing bugs and adding new systems I haven't implemented yet like a more dynamic NPC dialog system. 

My current design is to have a conversation object associated with every NPC that would have an array of Dialog objects (What the NPC says). The Dialog objects would have an array of Option Objects that would list the option and call a delegate function when selected that would either perform some action relating to the game or open a different dialog. I am not entirely happy with this design mostly because its not terribly dynamic in that it will be hard to change the flow of the conversation (conditional branches) or lock out branches of the conversation to be triggered later. I really haven't given a whole lot of thought on the design (bad coder) and have gotten it partially implemented (bad coder again). Anyway I should go over my design again, if anybody has any design ideas or knows of any systems used in other games let me know.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Data Import And Export</title>
    <id>955</id>
    <revision>
      <id>2593</id>
      <timestamp>2008-01-25T09:53:35Z</timestamp>
      <contributor>
        <ip>Gw001k.nikitova.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a reference page for all menu commands which export / import data. Simple instructions are elsewhere on:

* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]] 
* [[Legacy:Texture Import And Export|Texture Import And Export]]
* [[Legacy:Importing Sounds|Importing Sounds]]

==Importing commands ==

===File -&gt; Open ===

reads: 
* UNR map file format

===File -&gt; Import... ===

reads:
* T3D Unreal Text format

===Brush -&gt; Open Brush ===

reads:
* U3D Unreal brush binary format

This sometimes works, sometimes doesn't. I suspect it has something to do with the way [[Legacy:Brush|brush]] stores a reference to a model object which holds the shape information.

===Brush -&gt; Import... ===

reads:
* T3D Unreal Text format
* DXF
* ASC

==Exporting commands ==

===Brush -&gt; Export... ===

saves the [[Legacy:Red Builder Brush|red builder brush]], no matter what is currently selected

writes:
* T3D Unreal Text format

===File -&gt; Export... ===

Saves the whole map as a [[Legacy:T3D File|T3D File]]. Useful for using [[Legacy:MapScale|MapScale]], for example.

==Related Topics ==
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]]
* [[Legacy:File Format|File Format]]

==Comments ==
* would these be better grouped by method first, then by direction?
* good old fashioned copy / paste needs mentioning here too

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2594</id>
      <timestamp>2003-05-25T09:40:24Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">This is a reference page for all menu commands which export / imort data. Simple instructions are elsewhere on:

* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]] 
* [[Legacy:Texture Import And Export|Texture Import And Export]]
* [[Legacy:Importing Sounds|Importing Sounds]]

==Importing commands ==

===File -&gt; Open ===

reads: 
* UNR map file format

===File -&gt; Import... ===

reads:
* T3D Unreal Text format

===Brush -&gt; Open Brush ===

reads:
* U3D Unreal brush binary format

This sometimes works, sometimes doesn't. I suspect it has something to do with the way [[Legacy:Brush|brush]] stores a reference to a model object which holds the shape information.

===Brush -&gt; Import... ===

reads:
* T3D Unreal Text format
* DXF
* ASC

==Exporting commands ==

===Brush -&gt; Export... ===

saves the [[Legacy:Red Builder Brush|red builder brush]], no matter what is currently selected

writes:
* T3D Unreal Text format

===File -&gt; Export... ===

Saves the whole map as a [[Legacy:T3D File|T3D File]]. Useful for using [[Legacy:MapScale|MapScale]], for example.

==Related Topics ==
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]]
* [[Legacy:File Format|File Format]]

==Comments ==
* would these be better grouped by method first, then by direction?
* good old fashioned copy / paste needs mentioning here too

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DataObject</title>
    <id>1037</id>
    <revision>
      <id>2769</id>
      <timestamp>2006-11-28T18:44:11Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]]/[[Legacy:UT2004|UT2004]] :: '''''Note:''''' DataObject is not part of the stock [[Legacy:Unreal Engine Versions/2| Unreal Engine 2.0]], it is only implemented in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]].}}

DataObjects are an alternative method to [[Legacy:Config Vars And .Ini Files|Config Vars and .Ini Files]] for storing information that can be accessed later by the game. They are often a better solution when you need to store a lot of information or you don't want it easily edited from outside the game (ie if you use it to store player progress in a game).

An example of DataObjects in UT2003 would be [[Legacy:GameProfile|GameProfile]], which is used to store a Single Player profile.

In order to make use of DataObject you need an instance of [[Legacy:GameInfo|GameInfo]] or one of it's subclasses (usually via Level.Game), because the functions required to access DataObjects are all contained in [[Legacy:GameInfo|GameInfo]].

==Variables==

The following variables are passed to the DataObject functions. Here's a quick description of what they mean:
; packageName : This is the name of the package file the object(s) will be saved in. The package is stored in Saves\&lt;tt&gt;packageName&lt;/tt&gt;.uvx
; objClass : This is the class name of the objet to be created.
; objName : This is a unique identifier for the stored object, it has to be unique in that package or else it will overwrite existing objects with the same name.

==Functions==

The following DataObject related functions are defined in [[Legacy:GameInfo|GameInfo]].

; [[Legacy:Manifest|Manifest]] GetSavedGames() [native, final] : This will return an instance of [[Legacy:Manifest|Manifest]]. [[Legacy:Manifest|Manifest]].&lt;tt&gt;ManifestEntries&lt;/tt&gt; is a list of all the Packages in the Saves directory. '''Note:''' This is a list of the packages, not the DataObjects they contain.
; [[Legacy:Object|Object]] CreateDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) [native, final] : This will create a new DataObject. If successful it will return an instance of the new &lt;tt&gt;Object&lt;/tt&gt;, otherwise it returns &lt;tt&gt;None&lt;/tt&gt;. '''Note:''' this does not save the package file to disk.
; [[Legacy:Object|Object]] LoadDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) [native, final] : Load an existing DataObject, if the DataObject doesn't exist in the package (or the package doesn't exist) &lt;tt&gt;None&lt;/tt&gt; will be returned.
; bool DeleteDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) [native, final] : Delete an existing DataObject from the specified package. This does not remove the package file from the disk. If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.
; AllDataObjects( [[Legacy:Class|class]] objClass, out [[Legacy:Object|Object]] obj, string packageName ) [native, final, iterator] : List all DataObjects in the specified package.
; bool SavePackage( string packageName ) [native, final] : This will save the package to disk, it will be saved to: Saves\&lt;packagename&gt;.uvx If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.
; bool DeletePackage( string packageName ) [native, final] : This will delete the complete package from the disk. If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.

==Usage==

The data that can be stored in DataObjects follows the same rules as the [[Legacy:Default Properties|Default Properties]]. You can store the 6 basic data types (&lt;tt&gt;int&lt;/tt&gt;, &lt;tt&gt;float&lt;/tt&gt;, &lt;tt&gt;string&lt;/tt&gt;, &lt;tt&gt;name&lt;/tt&gt;, &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;enum&lt;/tt&gt;) and &lt;tt&gt;array&lt;/tt&gt;s and &lt;tt&gt;struct&lt;/tt&gt;s of the 6 basic data types. But you can't store references to other objects.

It is recommended that you prefix package names so it's easier to identify which packages your code has created (eg &quot;Foo_Package1&quot;, &quot;Foo_Package2&quot;, and so you don't overwrite packages created by someone elses code.

==Example==

A working example, from any class call &lt;tt&gt;CreateDataObjects()&lt;/tt&gt; and &lt;tt&gt;ListDataObjects()&lt;/tt&gt; and check the game [[Legacy:Log File|log file]] for the results.

'''Note:''' As noted above, the DataObject functions are in [[Legacy:GameInfo|GameInfo]], so you must pass an instance of [[Legacy:GameInfo|GameInfo]] to these functions for them to be able to access the DataObject functions. 

&lt;uscript&gt;
	class'DataObjectTest'.static.CreateDataObjects( Level.Game );
	class'DataObjectTest'.static.ListDataObjects( Level.Game );
&lt;/uscript&gt;

===TestDataObject.uc===

&lt;uscript&gt;
class TestDataObject extends Object;

var string PackageName;
var int ObjectNum;

DefaultProperties
{
	PackageName=&quot;TestPackage&quot;
	ObjectNum=-1
}
&lt;/uscript&gt;

===DataObjectTest.uc===

&lt;uscript&gt;
class DataObjectTest extends Actor;

var string pkgPrefix;

static function CreateDataObjects( GameInfo G )
{
	local TestDataObject CurrentObject;
	local int pNum, oNum;

	// Lets create 3 packages containing 3 DataObjects each.
	for ( pNum = 1; pNum &lt; 4; pNum++ )
	{
		for ( oNum = 1; oNum &lt; 4; oNum++ )
		{
			// Create a new DataObject.
			CurrentObject = G.CreateDataObject( class'TestDataObject', &quot;MyDataObject_&quot;$oNum, default.pkgPrefix$pNum );

			// If we successfully created a DataObject do something with it.
			if ( CurrentObject != none )
			{
				CurrentObject.PackageName = default.pkgPrefix$pNum;
				CurrentObject.ObjectNum = oNum;
			}
			else
				log( &quot;Error creating TestDataObject&quot;, 'DataObjectTest' );
		}

		// We've created our DataObjects, so lets save the package.
		if ( G.SavePackage( default.pkgPrefix$pNum ) )
			log( default.pkgPrefix$pNum$&quot; package saved!&quot;, 'DataObjectTest' );
		else
			log( &quot;Error saving &quot;$default.pkgPrefix$pNum$&quot; package!&quot;, 'DataObjectTest' );
	}
}

static function ListDataObjects( GameInfo G )
{
	local Manifest M;
	local int iPrefixLen;
	local int i;
	local TestDataObject CurrentObject;

	// Get a list of all the packages in the Saves directory.
	M = G.GetSavedGames();
	iPrefixLen = Len( default.pkgPrefix );

	// Run through the list of packages.
	for ( i = 0; i &lt; M.ManifestEntries.Length; i++ )
	{
		// If the package name begins with &quot;DataObjectTest_&quot;.
		if ( Left( M.ManifestEntries[i], iPrefixLen ) ~= default.pkgPrefix )
		{
			// Get all the DataObjects from the current package.
			foreach G.AllDataObjects( class'TestDataObject', CurrentObject, M.ManifestEntries[i] )
			{
				// Print out the contents of the DataObject.
				log( &quot;----------------------------------------------------------------------------&quot;, 'DataObjectTest' );
				log( &quot;	Package Name:&quot;@M.ManifestEntries[i], 'DataObjectTest' );
				log( &quot;	Object name :&quot;@CurrentObject.Name, 'DataObjectTest' );
				log( &quot;	Object Class:&quot;@CurrentObject.Class, 'DataObjectTest' );
				log( &quot;	ObjectNum   :&quot;@CurrentObject.ObjectNum, 'DataObjectTest' );
				log( &quot;----------------------------------------------------------------------------&quot;, 'DataObjectTest' );

				// Lets try and delete the DataObject.
				if ( G.DeleteDataObject ( class'TestDataObject', string(CurrentObject.Name), M.ManifestEntries[i] ) )
					log( &quot;DataObject deleted!&quot;, 'DataObjectTest' );
				else
					log( &quot;Error deleting DataObject!&quot;, 'DataObjectTest' );
			}
		}

		// The package is empty now so lets delete it.
		if ( G.DeletePackage( M.ManifestEntries[i] ) )
			log( M.ManifestEntries[i]$&quot; package deleted!&quot;, 'DataObjectTest' );
		else
			log( &quot;Error deleting &quot;$M.ManifestEntries[i]$&quot; package!&quot;, 'DataObjectTest' );
	}
}

DefaultProperties
{
	pkgPrefix=&quot;DataObjectTest_&quot;
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]]

==Discussion==

'''Fyfe:''' Almost finished refactoring, just need to finish the intro. &lt;s&gt;''Reminder:'' must link DateObject functions in [[Legacy:GameInfo|GameInfo]] to this page.&lt;/s&gt; Done

'''Fyfe:''' Refactoring done.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2770</id>
      <timestamp>2006-11-02T08:34:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A DataObject is an Object that holds information for storage, for example [[Legacy:GameProfile|GameProfile]] is a data object to store a Single Player profile for UT2003.

Using [[Legacy:Config Vars And .Ini Files|Config Vars and .Ini Files]] isn't always the best solution fo storing information, sometimes you have to store a lot of information in various formats. Using DataObjects might be the solution for you.

In order to use DataObjects you need to have an instance of a [[Legacy:GameInfo|GameInfo]] actor since that actor defines the DataObject functions.

DataObjects are saved into normal Unreal [[Legacy:Package|package]]s. You can store more than one object in a package if you want.

This functionality is not part of the stock [[Legacy:UnrealEngine2|UnrealEngine2]], it's only available in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]].

==Functions==

The following DataObject related functions have been defines in [[Legacy:GameInfo|GameInfo]]

===GetSavedGames===

&lt;uscript&gt;
native final function Manifest  GetSavedGames();
&lt;/uscript&gt;

This will return an instance of [[Legacy:Manifest|Manifest]] that contains a list of all saved DataObject packages. These are just the saved packages, it does not mean that a package listed in the manifest contains the DataObjects you use.

===CreateDataObject ===

&lt;uscript&gt;
native final function Object    CreateDataObject ( class objClass, string objName, string packageName );
&lt;/uscript&gt;

This will create a new DataObject.
;objClass: is the base class of the object: class'xGame.UT2003GameProfile'
;objName: is the name of the object: &quot;UT2003GameProfile&quot;. This is a unique identifier for the stored object, it has to be unique in that package or else it will overwrite existing objects with the same name.
;packageName: is the filename/packagename of the DataObject

The result is the new Object (if succesfull). Note that the package has not been saved to the disk yet.

===LoadDataObject ===

&lt;uscript&gt;
native final function Object    LoadDataObject   ( class objClass, string objName, string packageName );
&lt;/uscript&gt;

Load an existing DataObject, if the DataObject doesn't exist yet (either as saved file or previous created object) ''none'' will be returned;

===DeleteDataObject ===

&lt;uscript&gt;
native final function bool      DeleteDataObject ( class objClass, string objName, string packageName );
&lt;/uscript&gt;

Delete an existing data object from the specified package. This does not remove the package file from the disk.

===AllDataObjects   ===

&lt;uscript&gt;
native final iterator function  AllDataObjects   ( class objClass, out Object obj, string packageName );
&lt;/uscript&gt;

List all DataObjects in the specified package.

===SavePackage===

&lt;uscript&gt;
native final function bool      SavePackage      ( string packageName );
&lt;/uscript&gt;

This will save the package to disk, it will be saved to: Saves\&lt;packagename&gt;.uvx

===DeletePackage===

&lt;uscript&gt;
native final function bool      DeletePackage    ( string packageName );
&lt;/uscript&gt;

This will delete the complete package from the disk.

==Usage==

Since DataObjects are normal Unreal Objects you can add anything you want. All variables (when changed from their default value) will be saved to the disk. You can also add functions to your DataObject, ofcourse these won't be saved to disk.

It's adviced to prefix (e.g. &quot;SP_player1&quot;, &quot;SP_player2&quot;) the package names so you can easily distinguish packages that contain your DataObjects and other DataObjects. 

==Example==

An example object that hold some data

&lt;uscript&gt;
class MyDataObject extends Object;

var string PackageName;

var int savecount;

struct StructData
{
  var string Name;
  var string Value;
}
var array&lt;StructData&gt; MyData;

defaultproperties
{
  saveCount=0
  packageName=&quot;MDO_Test&quot;
}
&lt;/uscript&gt;

Example usage (warning: pseudo code)

&lt;uscript&gt;
class MyDataObject extends Whatever;

var array&lt;string&gt; objList;
var string objPreFix;
var MyDataObject ActiveObject;

function GetObjList()
{
  local manifest mf;
  local int i;
  objList.length = 0;
  mf = GameInfo.GetSavedGames();
  for (i = 0; i &lt; mf.ManifestEntries.length; i++)
  {
    if (Left(mf.ManifestEntries[i], Len(objPreFix)) ~= objPreFix)
    {
      objList.length = objList.length+1;
      objList[i] = mf.ManifestEntries[i];
    }
  }
}

function IncreaseAllSaveCounters()
{
  local int i;
  for (i = 0; i &lt; objList.length; i++)
  {
    ActiveObject = MyDataObject(GameInfo.LoadDataObject(class'MyDataObject', &quot;MyDataObject&quot;, objList[i]));
    ActiveObject.saveCount++;
    GameInfo.SavePackage(objList[i]);
  }
}

function DeletePackagesWhereSaveCountIs(int higherThan)
{
  local int i;
  for (i = objList.length-1; i &gt; 0; i--)
  {
    ActiveObject = MyDataObject(GameInfo.LoadDataObject(class'MyDataObject', &quot;MyDataObject&quot;, objList[i]));
    if (ActiveObject.saveCount &gt; higherThan)
    {
      GameInfo.DeletePackage(objList[i]);
      objList.remove(i, 1);
    }
  }
}

function CreateRandomSaveCountPackages(int num)
{
  local string tmp;
  while (num &gt; 0)
  {
    tmp = objPreFix$&quot;pkg&quot;$rand(MaxInt);
    ActiveObject = MyDataObject(GameInfo.CreateDataObject(class'MyDataObject', &quot;MyDataObject&quot;, tmp));
    ActiveObject.PackageName = tmp;
    ActiveObject.saveCount = rand(MaxInt);
    GameInfo.SavePackage(tmp);
    objList.length = objList.length+1;
    objList[objList.length-1] = tmp;
    num--;
  }
}

defaultproperties
{
  objPreFix=&quot;MDO_&quot;
}
&lt;/uscript&gt;

==Example #2==

'''Solid Snake:''' Here is an example on how to use all of the functions and what exactly is going on.

'''Note:''' As mentioned above, an instance of GameInfo is needed to utilize DataObjects. In the example below, GameInfo. needs to be replaced with an instantiated object of type GameInfo (or any of GameInfo's children; you can use the object of whichever gametype you happen to be coding under as long as it inherits from GameInfo).

&lt;uscript&gt;
function TestDataObject()
{
local ceMissionProfile myObject; // ceMissionProfile subclassed from Object
local array&lt;ceMissionProfile&gt; DataObjects;

myObject = GameInfo.CreateDataObject(class'ceMissionProfile', &quot;TestMission&quot;, &quot;MissionPackage&quot;); // This will make ceMissionProfile object called TestMission in a package called MissionPackage. 
// While the data has been created, it hasn't actually been saved yet (It currently exists as Save.tmn)

GameInfo.SavePackage(&quot;MissionPackage&quot;); // This will save the the object [ceMissionProfile] into the MissionPackage.uvx now.

// This gets all of the objects from within the package
foreach GameInfo.AllDataObjects(class'ceMissionProfile', L, &quot;MissionPackage&quot;) 
{
  DataObjects.Length = DataObjects.Length + 1;
  DataObjects[DataObjects.Length - 1] = L;
}

myObject = GameInfo.LoadDataObject(class'ceMissionProfile', &quot;TestMission&quot;, &quot;MissionPackage&quot;); 
// This will load the object, ceMissionProfile with the matching name, TestMission in MissionPackage.

myObject.SetMissionTitle(&quot;Cleanse Area&quot;); 
// Alter the object... we can now do it since the object is 'loaded'.

GameInfo.DeleteDataObject(class'ceMissionProfile', &quot;TestMission&quot;, &quot;MissionPackage&quot;); 
// This deletes the object specified by Name and from within the Package name.

GameInfo.DeletePackage(&quot;MissionPackage&quot;); 
// This deletes the package originally created by SavePackage().
}

// When packages are deleted and the objects added to it straight away, it doesn't actually delete.
// This is a way around the problem, and it works very well.
function DeleteMissionPackage(string Package)
{
  local object o;

  foreach PlayerOwner().Level.Game.AllDataObjects(class'Object', o, Package)
    PlayerOwner().Level.Game.DeleteDataObject(class'object', &quot;&quot;$o.Name, Package);
}

&lt;/uscript&gt;

==Discussion==

'''Foxpaw:''' Some mention should be made that these are only availible in UT2003 (and probrably UT2004), but are not an engine feature. Also, when this page is done, the info should be removed from [[Legacy:Config Vars And .Ini Files|Config Vars and .Ini Files]].

'''Juxtapose:''' I'm trying to test a data object in a commandlet (so I can run tests from the command line w/o loading UT and a full game). The problem is, I don't have any references to any actor objects; commandlet extends the object class so I don't have a GameInfo reference and I can't spawn one becuase I don't have an actor to call Spawn from. Is there a way to get around this? Should I give up and move this part of the test to the game code?

Also, I noticed that &lt;code&gt;

myObject = GameInfo.CreateDataObject(class'ceMissionProfile', &quot;TestMission&quot;, &quot;MissionPackage&quot;);&lt;/code&gt; doesn't use a cast, e.g. &lt;code&gt;myObject = myObject(GameInfor.CreateDataObject(class'...&lt;/code&gt; but still manages to get the right type of object out. Does CreateDataObject have a polymorphic retrun type? I saw that it's defined as returning &lt;code&gt;Object&lt;/code&gt;. Can I write a method that returns an arbitrary data type? (The method is declared as native, so I can't look and see how. I suppose that means I would need to be able to write native code to get that functionality. Any thoughts?)

'''Juxtapose:''' I can't get these to work for my data. I'm trying to get a game to store some float values to disk and recall them when the game starts up. I'm talking about a lot of float values; I'm testing with 64,000 but when the game starts working as intended, it could get up to over 1 million. The server.log reads out

&lt;uscript&gt;
Log: Referencers of Package Package:
Log:    System Package.System
Log:    WindowManager Package.WindowManager
Log:    LinkerLoad Package.LinkerLoad
Log:    LinkerLoad Package.LinkerLoad
Log:    GameEngine Package.GameEngine
Log:    Primitive Package.Primitive
Log:    GlobalTempObjects Package.GlobalTempObjects
Log:    LinkerLoad Package.LinkerLoad
...
Log:    DynamicFloatArray Package.DynamicFloatArray
Log:    LinkerSave Package.LinkerSave
Warning: Error deleting file '..\Saves\Save.tmp' (0x32)
Warning: Can't save ..\Saves\LONSDawn.QValues.uvx: Graph is linked to external private object Package Package
Log: Save=416.251901
ScriptLog: SavePackage( LONSDawn.QValues ) returned:  False
&lt;/uscript&gt;

In place of the ... there are many more &lt;code&gt;Log:  &lt;/code&gt; statements for LinkerLoad and DynamicFloatArray and a few for other things. The DynamicFloat arrays (There are 8k of them, each holding 8 float values in this test) are what I'm trying to save. My question is, what is the rest of that junk? Is it really relavent to my data? Why is it getting saved? Should it be getting saved at all (do those log statements imply I'm doing something wrong)?

The code I'm using looks like this:

&lt;uscript&gt;
Q = theGame.LoadDataObject(class'QValues', &quot;TestQs&quot;, class'QValues'.default.PackageName);
if (Q == none)
	{
		Log(&quot;Failed to load Q Values from&quot;@class'QValues'.default.PackageName@&quot;, Commencing init&quot;);
		Q = theGame.CreateDataObject(class'QValues', &quot;TestQs&quot;, class'QValues'.default.PackageName);
		if (Q != none)
		{
			Log(&quot;Commencing test&quot;);
			//Test Q for integrity
			Log(&quot;SavePackage(&quot;@class'QValues'.default.PackageName@&quot;) returned: &quot;@theGame.SavePackage(class'QValues'.default.PackageName));
		}
		else
			Warn(&quot;Init Q has failed!&quot;);
	}
	else
	{
		Log(&quot;Successfully loaded Q Values, commencing test&quot;);
		//Test Q for integrity
		Log(&quot;SavePackage(&quot;@class'QValues'.default.PackageName@&quot;) returned: &quot;@theGame.SavePackage(class'QValues'.default.PackageName));;
	}
&lt;/uscript&gt;

I've used different things for &lt;code&gt;class'QValues'.default.PackageName&lt;/code&gt;, including the package names of the gametype, the name of the package that contains the source code for QValues and totally unrelated/random names. None of them work. In one place on this page it says the package name should be unique to make it easy to distinguish what the package contains. In another place, the package name seems to be highly relavent to the DataObject class name or file name. Is there a connection between the class of the DataObject and its source package name? I've also tried different names for the variable (argument 2 in Load and Create). One more thing, calling CreateDataObject seems to skip the created event for the object. Any info on this? Working as intended?

'''Wormbo:''' In order to create and save data objects you need a valid GameInfo reference, which is not really possible in a Commandlet. You can, however, load existing data objects in Commandlets through DynamicLoadObject(). The log error &quot;Graph is linked to external private object ''Class'' ''Name''&quot; will happen every time you try to save a package (e.g. after compiling when saving a data object package) while an object in it references another package's private object, in your case the this seems to be the implicitly created package object called &quot;Package&quot; which contains all dynamically created objects at runtime.&lt;br /&gt;IMHO you should really ask this kind of question in a forum, though. Then when you found out the solution, factor it into this page and remove this discussion.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2771</id>
      <timestamp>2006-11-26T03:50:59Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Tweaks</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]]/[[Legacy:UT2004|UT2004]] :: '''''Note:''''' DataObject is not part of the stock [[Legacy:UnrealEngine2|UnrealEngine2]], it is only implemented in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]].}}

DataObjects are an alternative method to [[Legacy:Config Vars And .Ini Files|Config Vars and .Ini Files]] for storing information that can be accessed later by the game. They are often a better solution when you need to store a lot of information or you don't want it easily edited from outside the game (ie if you use it to store player progress in a game).

In order to make use of DataObject you need an instance of [[Legacy:GameInfo|GameInfo]] or one of it's subclasses (usually via Level.Game), because the functions required to access DataObjects are all contained in [[Legacy:GameInfo|GameInfo]].

'''Old Introduction:'''
 A DataObject is an Object that holds information for storage, for example [[Legacy:GameProfile|GameProfile]] is a data object to store a Single Player profile for UT2003.
 Using [[Legacy:Config Vars And .Ini Files|Config Vars and .Ini Files]] isn't always the best solution fo storing information, sometimes you have to store a lot of information in various formats. Using DataObjects might be the solution for you.
 In order to use DataObjects you need to have an instance of a [[Legacy:GameInfo|GameInfo]] actor since that actor defines the DataObject functions.
 DataObjects are saved into normal Unreal [[Legacy:Package|package]]s. You can store more than one object in a package if you want.

==Variables==

The following variables are passed to the DataObject functions. Here's a quick description of what they mean:
; packageName : This is the name of the package file the object(s) will be saved in. The package is stored in Saves\&lt;tt&gt;packageName&lt;/tt&gt;.uvx
; objClass : This is the class name of the objet to be created.
; objName : This is a unique identifier for the stored object, it has to be unique in that package or else it will overwrite existing objects with the same name.

==Functions==

The following DataObject related functions are defined in [[Legacy:GameInfo|GameInfo]].

; [[Legacy:Manifest|Manifest]] GetSavedGames() [native, final] : This will return an instance of [[Legacy:Manifest|Manifest]]. [[Legacy:Manifest|Manifest]].&lt;tt&gt;ManifestEntries&lt;/tt&gt; is a list of all the Packages in the Saves directory. '''Note:''' This is a list of the packages, not the DataObjects they contain.
; [[Legacy:Object|Object]] CreateDataObject( class objClass, string objName, string packageName ) [native, final] : This will create a new DataObject. If successful it will return an instance of the new &lt;tt&gt;Object&lt;/tt&gt;, otherwise it returns &lt;tt&gt;None&lt;/tt&gt;. '''Note:''' this does not save the package file to disk.
; [[Legacy:Object|Object]] LoadDataObject( class objClass, string objName, string packageName ) [native, final] : Load an existing DataObject, if the DataObject doesn't exist in the package (or the package doesn't exist) &lt;tt&gt;None&lt;/tt&gt; will be returned.
; bool DeleteDataObject( class objClass, string objName, string packageName ) [native, final] : Delete an existing DataObject from the specified package. This does not remove the package file from the disk. If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.
; AllDataObjects( class objClass, out [[Legacy:Object|Object]] obj, string packageName ) [native, final, iterator] : List all DataObjects in the specified package.
; bool SavePackage( string packageName ) [native, final] : This will save the package to disk, it will be saved to: Saves\&lt;packagename&gt;.uvx If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.
; bool DeletePackage( string packageName ) [native, final] : This will delete the complete package from the disk. If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.

==Usage==

The data that can be stored in DataObjects follows the same rules as the [[Legacy:Default Properties|Default Properties]]. You can store the 6 basic data types (&lt;tt&gt;int&lt;/tt&gt;, &lt;tt&gt;float&lt;/tt&gt;, &lt;tt&gt;string&lt;/tt&gt;, &lt;tt&gt;name&lt;/tt&gt;, &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;enum&lt;/tt&gt;) and &lt;tt&gt;array&lt;/tt&gt;s and &lt;tt&gt;struct&lt;/tt&gt;s of the 6 basic data types. But you can't store references to other objects.

It is recommended that you prefix package names so it's easier to identify which packages your code has created (eg &quot;Foo_Package1&quot;, &quot;Foo_Package2&quot;, and so you don't overwrite packages created by someone elses code.

==Example==

A working example, from any class call &lt;tt&gt;CreateDataObjects()&lt;/tt&gt; and &lt;tt&gt;ListDataObjects()&lt;/tt&gt; and check the game log file for the results.

'''Note:''' As noted above, the DataObject functions are in [[Legacy:GameInfo|GameInfo]], so you must pass an instance of [[Legacy:GameInfo|GameInfo]] to these functions for them to be able to access the DataObject functions. 

&lt;uscript&gt;
	class'DataObjectTest'.static.CreateDataObjects( Level.Game );
	class'DataObjectTest'.static.ListDataObjects( Level.Game );
&lt;/uscript&gt;

===TestDataObject.uc===

&lt;uscript&gt;
class TestDataObject extends Object;

var string PackageName;
var int ObjectNum;

DefaultProperties
{
	PackageName=&quot;TestPackage&quot;
	ObjectNum=-1
}
&lt;/uscript&gt;

===DataObjectTest.uc===

&lt;uscript&gt;
class DataObjectTest extends Actor;

var string pkgPrefix;

static function CreateDataObjects( GameInfo G )
{
	local TestDataObject CurrentObject;
	local int pNum, oNum;

	// Lets create 3 packages containing 3 DataObjects each.
	for ( pNum = 1; pNum &lt; 4; pNum++ )
	{
		for ( oNum = 1; oNum &lt; 4; oNum++ )
		{
			// Create a new DataObject.
			CurrentObject = G.CreateDataObject( class'TestDataObject', &quot;MyDataObject_&quot;$oNum, default.pkgPrefix$pNum );

			// If we successfully created a DataObject do something with it.
			if ( CurrentObject != none )
			{
				CurrentObject.PackageName = default.pkgPrefix$pNum;
				CurrentObject.ObjectNum = oNum;
			}
			else
				log( &quot;Error creating TestDataObject&quot;, 'DataObjectTest' );
		}

		// We've created our DataObjects, so lets save the package.
		if ( G.SavePackage( default.pkgPrefix$pNum ) )
			log( default.pkgPrefix$pNum$&quot; package saved!&quot;, 'DataObjectTest' );
		else
			log( &quot;Error saving &quot;$default.pkgPrefix$pNum$&quot; package!&quot;, 'DataObjectTest' );
	}
}

static function ListDataObjects( GameInfo G )
{
	local Manifest M;
	local int iPrefixLen;
	local int i;
	local TestDataObject CurrentObject;

	// Get a list of all the packages in the Saves directory.
	M = G.GetSavedGames();
	iPrefixLen = Len( default.pkgPrefix );

	// Run through the list of packages.
	for ( i = 0; i &lt; M.ManifestEntries.Length; i++ )
	{
		// If the package name begins with &quot;DataObjectTest_&quot;.
		if ( Left( M.ManifestEntries[i], iPrefixLen ) ~= default.pkgPrefix )
		{
			// Get all the DataObjects from the current package.
			foreach G.AllDataObjects( class'TestDataObject', CurrentObject, M.ManifestEntries[i] )
			{
				// Print out the contents of the DataObject.
				log( &quot;----------------------------------------------------------------------------&quot;, 'DataObjectTest' );
				log( &quot;	Package Name:&quot;@M.ManifestEntries[i], 'DataObjectTest' );
				log( &quot;	Object name :&quot;@CurrentObject.Name, 'DataObjectTest' );
				log( &quot;	Object Class:&quot;@CurrentObject.Class, 'DataObjectTest' );
				log( &quot;	ObjectNum   :&quot;@CurrentObject.ObjectNum, 'DataObjectTest' );
				log( &quot;----------------------------------------------------------------------------&quot;, 'DataObjectTest' );

				// Lets try and delete the DataObject.
				if ( G.DeleteDataObject ( class'TestDataObject', string(CurrentObject.Name), M.ManifestEntries[i] ) )
					log( &quot;DataObject deleted!&quot;, 'DataObjectTest' );
				else
					log( &quot;Error deleting DataObject!&quot;, 'DataObjectTest' );
			}
		}

		// The package is empty now so lets delete it.
		if ( G.DeletePackage( M.ManifestEntries[i] ) )
			log( M.ManifestEntries[i]$&quot; package deleted!&quot;, 'DataObjectTest' );
		else
			log( &quot;Error deleting &quot;$M.ManifestEntries[i]$&quot; package!&quot;, 'DataObjectTest' );
	}
}

DefaultProperties
{
	pkgPrefix=&quot;DataObjectTest_&quot;
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]]

==Discussion==

'''Fyfe:''' Almost finished refactoring, just need to finish the intro. ''Reminder:'' must link DateObject functions in [[Legacy:GameInfo|GameInfo]] to this page.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40299</id>
      <timestamp>2009-11-22T09:16:45Z</timestamp>
      <contributor>
        <username>Exal</username>
        <id>2061</id>
      </contributor>
      <minor/>
      <comment>Fixed typo</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]]/[[Legacy:UT2004|UT2004]] :: '''''Note:''''' DataObject is not part of the stock [[Legacy:Unreal Engine Versions/2| Unreal Engine 2.0]], it is only implemented in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]].}}

DataObjects are an alternative method to [[Legacy:Config Vars And .Ini Files|Config Vars and .Ini Files]] for storing information that can be accessed later by the game. They are often a better solution when you need to store a lot of information or you don't want it easily edited from outside the game (ie if you use it to store player progress in a game).

An example of DataObjects in UT2003 would be [[Legacy:GameProfile|GameProfile]], which is used to store a Single Player profile.

In order to make use of DataObject you need an instance of [[Legacy:GameInfo|GameInfo]] or one of it's subclasses (usually via Level.Game), because the functions required to access DataObjects are all contained in [[Legacy:GameInfo|GameInfo]].

==Variables==

The following variables are passed to the DataObject functions. Here's a quick description of what they mean:
; packageName : This is the name of the package file the object(s) will be saved in. The package is stored in Saves\&lt;tt&gt;packageName&lt;/tt&gt;.uvx
; objClass : This is the class name of the object to be created.
; objName : This is a unique identifier for the stored object, it has to be unique in that package or else it will overwrite existing objects with the same name.

==Functions==

The following DataObject related functions are defined in [[Legacy:GameInfo|GameInfo]].

; [[Legacy:Manifest|Manifest]] GetSavedGames() [native, final] : This will return an instance of [[Legacy:Manifest|Manifest]]. [[Legacy:Manifest|Manifest]].&lt;tt&gt;ManifestEntries&lt;/tt&gt; is a list of all the Packages in the Saves directory. '''Note:''' This is a list of the packages, not the DataObjects they contain.
; [[Legacy:Object|Object]] CreateDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) [native, final] : This will create a new DataObject. If successful it will return an instance of the new &lt;tt&gt;Object&lt;/tt&gt;, otherwise it returns &lt;tt&gt;None&lt;/tt&gt;. '''Note:''' this does not save the package file to disk.
; [[Legacy:Object|Object]] LoadDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) [native, final] : Load an existing DataObject, if the DataObject doesn't exist in the package (or the package doesn't exist) &lt;tt&gt;None&lt;/tt&gt; will be returned.
; bool DeleteDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) [native, final] : Delete an existing DataObject from the specified package. This does not remove the package file from the disk. If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.
; AllDataObjects( [[Legacy:Class|class]] objClass, out [[Legacy:Object|Object]] obj, string packageName ) [native, final, iterator] : List all DataObjects in the specified package.
; bool SavePackage( string packageName ) [native, final] : This will save the package to disk, it will be saved to: Saves\&lt;packagename&gt;.uvx If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.
; bool DeletePackage( string packageName ) [native, final] : This will delete the complete package from the disk. If successful it return &lt;tt&gt;True&lt;/tt&gt;, otherwise &lt;tt&gt;False&lt;/tt&gt;.

==Usage==

The data that can be stored in DataObjects follows the same rules as the [[Legacy:Default Properties|Default Properties]]. You can store the 6 basic data types (&lt;tt&gt;int&lt;/tt&gt;, &lt;tt&gt;float&lt;/tt&gt;, &lt;tt&gt;string&lt;/tt&gt;, &lt;tt&gt;name&lt;/tt&gt;, &lt;tt&gt;class&lt;/tt&gt;, &lt;tt&gt;enum&lt;/tt&gt;) and &lt;tt&gt;array&lt;/tt&gt;s and &lt;tt&gt;struct&lt;/tt&gt;s of the 6 basic data types. But you can't store references to other objects.

It is recommended that you prefix package names so it's easier to identify which packages your code has created (eg &quot;Foo_Package1&quot;, &quot;Foo_Package2&quot;, and so you don't overwrite packages created by someone elses code.

==Example==

A working example, from any class call &lt;tt&gt;CreateDataObjects()&lt;/tt&gt; and &lt;tt&gt;ListDataObjects()&lt;/tt&gt; and check the game [[Legacy:Log File|log file]] for the results.

'''Note:''' As noted above, the DataObject functions are in [[Legacy:GameInfo|GameInfo]], so you must pass an instance of [[Legacy:GameInfo|GameInfo]] to these functions for them to be able to access the DataObject functions. 

&lt;uscript&gt;
	class'DataObjectTest'.static.CreateDataObjects( Level.Game );
	class'DataObjectTest'.static.ListDataObjects( Level.Game );
&lt;/uscript&gt;

===TestDataObject.uc===

&lt;uscript&gt;
class TestDataObject extends Object;

var string PackageName;
var int ObjectNum;

DefaultProperties
{
	PackageName=&quot;TestPackage&quot;
	ObjectNum=-1
}
&lt;/uscript&gt;

===DataObjectTest.uc===

&lt;uscript&gt;
class DataObjectTest extends Actor;

var string pkgPrefix;

static function CreateDataObjects( GameInfo G )
{
	local TestDataObject CurrentObject;
	local int pNum, oNum;

	// Lets create 3 packages containing 3 DataObjects each.
	for ( pNum = 1; pNum &lt; 4; pNum++ )
	{
		for ( oNum = 1; oNum &lt; 4; oNum++ )
		{
			// Create a new DataObject.
			CurrentObject = G.CreateDataObject( class'TestDataObject', &quot;MyDataObject_&quot;$oNum, default.pkgPrefix$pNum );

			// If we successfully created a DataObject do something with it.
			if ( CurrentObject != none )
			{
				CurrentObject.PackageName = default.pkgPrefix$pNum;
				CurrentObject.ObjectNum = oNum;
			}
			else
				log( &quot;Error creating TestDataObject&quot;, 'DataObjectTest' );
		}

		// We've created our DataObjects, so lets save the package.
		if ( G.SavePackage( default.pkgPrefix$pNum ) )
			log( default.pkgPrefix$pNum$&quot; package saved!&quot;, 'DataObjectTest' );
		else
			log( &quot;Error saving &quot;$default.pkgPrefix$pNum$&quot; package!&quot;, 'DataObjectTest' );
	}
}

static function ListDataObjects( GameInfo G )
{
	local Manifest M;
	local int iPrefixLen;
	local int i;
	local TestDataObject CurrentObject;

	// Get a list of all the packages in the Saves directory.
	M = G.GetSavedGames();
	iPrefixLen = Len( default.pkgPrefix );

	// Run through the list of packages.
	for ( i = 0; i &lt; M.ManifestEntries.Length; i++ )
	{
		// If the package name begins with &quot;DataObjectTest_&quot;.
		if ( Left( M.ManifestEntries[i], iPrefixLen ) ~= default.pkgPrefix )
		{
			// Get all the DataObjects from the current package.
			foreach G.AllDataObjects( class'TestDataObject', CurrentObject, M.ManifestEntries[i] )
			{
				// Print out the contents of the DataObject.
				log( &quot;----------------------------------------------------------------------------&quot;, 'DataObjectTest' );
				log( &quot;	Package Name:&quot;@M.ManifestEntries[i], 'DataObjectTest' );
				log( &quot;	Object name :&quot;@CurrentObject.Name, 'DataObjectTest' );
				log( &quot;	Object Class:&quot;@CurrentObject.Class, 'DataObjectTest' );
				log( &quot;	ObjectNum   :&quot;@CurrentObject.ObjectNum, 'DataObjectTest' );
				log( &quot;----------------------------------------------------------------------------&quot;, 'DataObjectTest' );

				// Lets try and delete the DataObject.
				if ( G.DeleteDataObject ( class'TestDataObject', string(CurrentObject.Name), M.ManifestEntries[i] ) )
					log( &quot;DataObject deleted!&quot;, 'DataObjectTest' );
				else
					log( &quot;Error deleting DataObject!&quot;, 'DataObjectTest' );
			}
		}

		// The package is empty now so lets delete it.
		if ( G.DeletePackage( M.ManifestEntries[i] ) )
			log( M.ManifestEntries[i]$&quot; package deleted!&quot;, 'DataObjectTest' );
		else
			log( &quot;Error deleting &quot;$M.ManifestEntries[i]$&quot; package!&quot;, 'DataObjectTest' );
	}
}

DefaultProperties
{
	pkgPrefix=&quot;DataObjectTest_&quot;
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]]

==Discussion==

'''Fyfe:''' Almost finished refactoring, just need to finish the intro. &lt;s&gt;''Reminder:'' must link DateObject functions in [[Legacy:GameInfo|GameInfo]] to this page.&lt;/s&gt; Done

'''Fyfe:''' Refactoring done.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dataangel</title>
    <id>1061</id>
    <revision>
      <id>2824</id>
      <timestamp>2004-07-09T13:18:23Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me ==

(wndrealm2@msn.com)

I'm a former Warcraft3 scripter, and frustrated by the limitations of that engine I've moved on to UT2K4. I'll be attending Kalamazoo College in the fall to study Comp. Sci. and English (I write fiction too). I'm working on a mod that works within the existing unreal framework, more of a rules change than a full blown mod (no new weapons), but I'm holding off on releasing the details until I have a working beta =)

==Current projects==
* Crash Siblings - The aforementioned mod
* Neural Bot - My attempt at making a &quot;learning&quot; bot. Slow going because I'm having trouble figuring out how to organize the learned data.
* Split Screen - Inspired by [[Legacy:Alien Swarm|Alien Swarm]]'s little window that pops up when stim packs are used, I'm tinkering with different parts of the engine to try and create split screen multiplayer, like you see on consoles. It would be cool for mods that are playable with gamepads (platformers and the like).

==Things I'm still trying to grasp==
* Some of the karma code.
* Replication. Somebody please correct/complete [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]].
* The full relationship between controller and pawn
* ProcessMove/ServerMove

That's about it. I contribute to the Wiki in the rare cases when my knowledge is absent =)

==Guest Book==

'''EntropicLqd:''' Welcome to the Wiki. Enjoy your stay.

'''Tarquin:''' Hi, welcome! :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2825</id>
      <timestamp>2004-07-09T08:07:31Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Welcome</comment>
      <text xml:space="preserve">==About Me ==

(wndrealm2@msn.com)

I'm a former Warcraft3 scripter, and frustrated by the limitations of that engine I've moved on to UT2K4. I'll be attending Kalamazoo College in the fall to study Comp. Sci. and English (I write fiction too). I'm working on a mod that works within the existing unreal framework, more of a rules change than a full blown mod (no new weapons), but I'm holding off on releasing the details until I have a working beta =)

==Current projects==
* Crash Siblings - The aforementioned mod
* Neural Bot - My attempt at making a &quot;learning&quot; bot. Slow going because I'm having trouble figuring out how to organize the learned data.
* Split Screen - Inspired by [[Legacy:Alien Swarm|Alien Swarm]]'s little window that pops up when stim packs are used, I'm tinkering with different parts of the engine to try and create split screen multiplayer, like you see on consoles. It would be cool for mods that are playable with gamepads (platformers and the like).

==Things I'm still trying to grasp==
* Some of the karma code.
* Replication. Somebody please correct/complete [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]].
* The full relationship between controller and pawn
* ProcessMove/ServerMove

That's about it. I contribute to the Wiki in the rare cases when my knowledge is absent =)

==Guest Book==

'''EntropicLqd:''' Welcome to the Wiki. Enjoy your stay.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dataangel/Developer Journal</title>
    <id>1064</id>
    <revision>
      <id>2831</id>
      <timestamp>2004-08-04T12:37:10Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==08/04/04==

I spent most of my coding time today trying to code what I thought would be a simple feature. For my mod player pawns spin alot in the air, but I want them to always land on their feet. I've outlined the problem and posted the relevant code here:

http://forums.beyondunreal.com/showthread.php?t=141995

Write now every mod feature is feeling like a gigantic snag that takes a ton of work to overcome. It took me forever to get bouncing working properly, then to get rotating to work properly, now to get pawn's landing on their feet. The good news is I'm starting to get my feet wet with a wider range of functions and getting much more comfortable with Unrealscript.

After I finish coding my mod I think I'm going to write a tutorial on how I coded it from beginning to end &amp;ndash; I have yet to see a full fledged tutorial for creating whole new gametypes that really covers all the possible aspects involved, such as custom pawns, bots, physics, replication, optimization, etc. There's a ton I've had to learn just to get this far, and most of it was acquired by getting lucky reading random forum posts or hanging out in #unrealscript on EnterTheGame. Only a few of the [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] are complete.

But enough coding for now, it's 4:30AM :P</text>
    </revision>
    <revision>
      <id>2832</id>
      <timestamp>2004-08-04T11:30:11Z</timestamp>
      <contributor>
        <ip>C-67-181-53-12.client.comcast.net</ip>
      </contributor>
      <comment>My first entry</comment>
      <text xml:space="preserve">==08/04/04==

I spent most of my coding time today trying to code what I thought would be a simple feature. For my mod player pawns spin alot in the air, but I want them to always land on their feet. I've outlined the problem and posted the relevant code here:

[http://forums.beyondunreal.com/showthread.php?t=141995]

Write now every mod feature is feeling like a gigantic snag that takes a ton of work to overcome. It took me forever to get bouncing working properly, then to get rotating to work properly, now to get pawn's landing on their feet. The good news is I'm starting to get my feet wet with a wider range of functions and getting much more comfortable with Unrealscript.

After I finish coding my mod I think I'm going to write a tutorial on how I coded it from beginning to end &amp;ndash; I have yet to see a full fledged tutorial for creating whole new gametypes that really covers all the possible aspects involved, such as custom pawns, bots, physics, replication, optimization, etc. There's a ton I've had to learn just to get this far, and most of it was acquired by getting lucky reading random forum posts or hanging out in #unrealscript on EnterTheGame. Only a few of the [[Legacy:Unrealscript Lessons|Unrealscript Lessons]] are complete.

But enough coding for now, it's 4:30AM :P</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DatabaseConnection</title>
    <id>1055</id>
    <revision>
      <id>2808</id>
      <timestamp>2006-01-30T21:48:09Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Quite often someone gets the idea to store information from an UnrealEngine game in a remote database for permanent and remote storage. The UnrealEngine does not provide any functions to directly communicate with a database. You will have to write your own interface for the communication.

While it is possible to write a driver that directly connects to the database server it might not always be the best thing to do. For a couple of reasons:
* Security&lt;br /&gt;The database server should have an open connection to the world, this is not one of the smartest things to do.
* Hosting limitations&lt;br /&gt;Often database server provided by hosting providers are out of your control to modify and usually only allow connections from certain servers.
* Database portability&lt;br /&gt;You driver will only be able to communicate with one database server but not with an otherone, this can become a issue in the future.
* Difficulty&lt;br /&gt;Usually it's not easy to write a database driver in UnrealScript because of it's limitations. Often databases require some crypto which is quite difficult to program from scratch in UnrealScript.
* Performance&lt;br /&gt;UnrealScript isn't slow, but it surely isn't fast. For example crypto routines are usually not very fast in UnrealScript. And it's best to keep the performance of the game server as high as possible.

The better choise is to write a man-in-the-middle that will perform the actual communication with a database server. The unrealscript part will connect to the man-in-the-middle and will use an simple string based protocol that the man-in-the-middle will process (this protocol could simply be the direct SQL command). An example of a man-in-the-middle program is a webserver running a script (Perl\PHP\ASP\etc.). Or you could write a server application that does the same for you. Communication with the man-in-the-middle can be done by means of a [[Legacy:TcpLink|TcpLink]] or [[Legacy:UdpLink|UdpLink]]. 

Note: when you use a webserver based implementation you might want to take a look at [[Legacy:LibHTTP|LibHTTP]]. It is HTTP client completely written in UnrealScript supporting most if not all features of the HTTP protocol. This might save you some time.

==Related Forum Threads==
* [http://forums.beyondunreal.com/showthread.php?threadid=157823 157823]
* [http://forums.beyondunreal.com/showthread.php?threadid=124594 124594]
* [http://forums.beyondunreal.com/showthread.php?threadid=121065 121065]
* [http://forums.beyondunreal.com/showthread.php?threadid=120454 120454]
* [http://forums.beyondunreal.com/showthread.php?threadid=110332 110332]
* [http://forums.beyondunreal.com/showthread.php?threadid=109791 109791]
* [http://forums.beyondunreal.com/showthread.php?threadid=93658 93658]
* http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=417820
* http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=359054

==Related Topics==
* [[Legacy:DataObject|DataObject]]

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2809</id>
      <timestamp>2005-09-23T20:31:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>El Muerte, use interwiki like this to avoid banning</comment>
      <text xml:space="preserve">Quite often someone gets the idea to store information from an UnrealEngine game in a remote database for permanent and remote storage. The UnrealEngine does not provide any functions to directly communicate with a database. You will have to write your own interface for the communication.

While it is possible to write a driver that directly connects to the database server it might not always be the best thing to do. For a couple of reasons:
* Security&lt;br /&gt;The database server should have an open connection to the world, this is not one of the smartest things to do.
* Hosting limitations&lt;br /&gt;Often database server provided by hosting providers are out of your control to modify and usually only allow connections from certain servers.
* Database portability&lt;br /&gt;You driver will only be able to communicate with one database server but not with an otherone, this can become a issue in the future.
* Difficulty&lt;br /&gt;Usually it's not easy to write a database driver in UnrealScript because of it's limitations. Often databases require some crypto which is quite difficult to program from scratch in UnrealScript.
* Performance&lt;br /&gt;UnrealScript isn't slow, but it surely isn't fast. For example crypto routines are usually not very fast in UnrealScript. And it's best to keep the performance of the game server as high as possible.

The better choise is to write a man-in-the-middle that will perform the actual communication with a database server. The unrealscript part will connect to the man-in-the-middle and will use an simple string based protocol that the man-in-the-middle will process (this protocol could simply be the direct SQL command). An example of a man-in-the-middle program is a webserver running a script (Perl\PHP\ASP\etc.). Or you could write a server application that does the same for you. Communication with the man-in-the-middle can be done by means of a [[Legacy:TcpLink|TcpLink]] or [[Legacy:UdpLink|UdpLink]]. 

Note: when you use a webserver based implementation you might want to take a look at [[Legacy:LibHTTP|LibHTTP]]. It is HTTP client completely written in UnrealScript supporting most if not all features of the HTTP protocol. This might save you some time.

==Related forum threads==

* [http://forums.beyondunreal.com/showthread.php?threadid=157823 157823]
* http://forums.beyondunreal.com/showthread.php?t=124594
* http://forums.beyondunreal.com/showthread.php?t=121065
* http://forums.beyondunreal.com/showthread.php?t=120454
* http://forums.beyondunreal.com/showthread.php?t=110332
* http://forums.beyondunreal.com/showthread.php?t=109791
* http://forums.beyondunreal.com/showthread.php?t=93658
* http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=417820
* http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=359054

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2810</id>
      <timestamp>2005-09-23T22:25:44Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>m'kay</comment>
      <text xml:space="preserve">Quite often someone gets the idea to store information from an UnrealEngine game in a remote database for permanent and remote storage. The UnrealEngine does not provide any functions to directly communicate with a database. You will have to write your own interface for the communication.

While it is possible to write a driver that directly connects to the database server it might not always be the best thing to do. For a couple of reasons:
* Security&lt;br /&gt;The database server should have an open connection to the world, this is not one of the smartest things to do.
* Hosting limitations&lt;br /&gt;Often database server provided by hosting providers are out of your control to modify and usually only allow connections from certain servers.
* Database portability&lt;br /&gt;You driver will only be able to communicate with one database server but not with an otherone, this can become a issue in the future.
* Difficulty&lt;br /&gt;Usually it's not easy to write a database driver in UnrealScript because of it's limitations. Often databases require some crypto which is quite difficult to program from scratch in UnrealScript.
* Performance&lt;br /&gt;UnrealScript isn't slow, but it surely isn't fast. For example crypto routines are usually not very fast in UnrealScript. And it's best to keep the performance of the game server as high as possible.

The better choise is to write a man-in-the-middle that will perform the actual communication with a database server. The unrealscript part will connect to the man-in-the-middle and will use an simple string based protocol that the man-in-the-middle will process (this protocol could simply be the direct SQL command). An example of a man-in-the-middle program is a webserver running a script (Perl\PHP\ASP\etc.). Or you could write a server application that does the same for you. Communication with the man-in-the-middle can be done by means of a [[Legacy:TcpLink|TcpLink]] or [[Legacy:UdpLink|UdpLink]]. 

Note: when you use a webserver based implementation you might want to take a look at [[Legacy:LibHTTP|LibHTTP]]. It is HTTP client completely written in UnrealScript supporting most if not all features of the HTTP protocol. This might save you some time.

==Related forum threads==

* [http://forums.beyondunreal.com/showthread.php?threadid=157823 157823]
* [http://forums.beyondunreal.com/showthread.php?threadid=124594 124594]
* [http://forums.beyondunreal.com/showthread.php?threadid=121065 121065]
* [http://forums.beyondunreal.com/showthread.php?threadid=120454 120454]
* [http://forums.beyondunreal.com/showthread.php?threadid=110332 110332]
* [http://forums.beyondunreal.com/showthread.php?threadid=109791 109791]
* [http://forums.beyondunreal.com/showthread.php?threadid=93658 93658]
* http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=417820
* http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=359054

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DaveA</title>
    <id>1013</id>
    <revision>
      <id>2723</id>
      <timestamp>2004-01-17T21:32:31Z</timestamp>
      <contributor>
        <ip>C-67-170-242-238.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey all!

Please visit my site, Unreal Realm of Concepts, currently at

http://www.unrealroc.com

Lots of tools, ideas, mod stuff, more.

Also check out some Unreal stuff at http://daves3d.home.comcast.net

'''EntropicLqd:''' Hello, welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2724</id>
      <timestamp>2003-08-05T02:52:01Z</timestamp>
      <contributor>
        <ip>DaveA</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey all!

Please visit my site, Unreal Realm of Concepts, currently at

http://darendash.home.comcast.net

Lots of tools, ideas, mod stuff, more.

Also check out some Unreal stuff at http://daves3d.home.comcast.net

'''EntropicLqd:''' Hello, welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dawn</title>
    <id>962</id>
    <revision>
      <id>2610</id>
      <timestamp>2003-12-04T19:58:21Z</timestamp>
      <contributor>
        <ip>Dpc69194232.direcpc.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Welcome to the Wiki, Dawn.

'''TaoPaiPai:'''  Wow great tut (the embedded mutator tut) thanks man :tup:

'''ZxAnPhOrIaN:'''  Welcome to the wiki!

'''Tarquin:'''  Hi :D Great job on [[Legacy:Writing And Using An Embedded Mutator|Writing And Using An Embedded Mutator]].

'''Dawn:'''  Thanks all!

'''Buji:'''  Hey Dawn!

'''Dawn:'''  Buji!  Long time, no see!  How come I never see you at my Palace anymore?  66.150.112.167 BFGN Dawn's Deathmatch Palace - Custom Maps only  (UT, not UT2003) 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2611</id>
      <timestamp>2003-07-04T20:25:04Z</timestamp>
      <contributor>
        <ip>Buji</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Welcome to the Wiki, Dawn.

'''TaoPaiPai:'''  Wow great tut (the embedded mutator tut) thanks man :tup:

'''ZxAnPhOrIaN:'''  Welcome to the wiki!

'''Tarquin:'''  Hi :D Great job on [[Legacy:Writing And Using An Embedded Mutator|Writing And Using An Embedded Mutator]].

'''Dawn:'''  Thanks all!

'''Buji:'''  Hey Dawn!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DayBase</title>
    <id>1056</id>
    <revision>
      <id>2811</id>
      <timestamp>2004-10-10T09:35:03Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; DayBase (Package: Postal2Game)}}

==Structs ==

===DayInventoryStruct ===
; var() const Name InvClassName : Class of inventory to remove/give
; var() const int NeededAmount : Make sure the player has at least this much of the item
; var() const GuyTypeEnum GuyType : Which type of dude can get this thing
; var() const bool bEnhancedOnly : Only get it in enhanced mode

==Enums ==

===GuyTypeEnum ===
; GTE_BOTH : Okay for both good and evil dude
; GTE_EVIL : Okay for evil dude only
; GTE_GOOD: Okay for good dude only

==Properties ==

===Main ===
; var() const localized String Description :  Name of day (ex: &quot;Monday&quot;)
; var() const String UniqueName :  A unique day name so code can refer to specific days.
; var() const array&lt;string&gt; ExcludeDays : A list of other group names that need to be excluded from today.
; var() const name MapTex : Map texture for today
; var() const name NewsTex : Newspaper texture for today
; var() const name DudeNewsComment : Dude's comment on today's newspaper
; var() const name LoadTex : Loading texture for today
; var() const name DudeStartComment : Dude's comment on starting today's errands.
; var() const editinline array&lt;[[Legacy:ErrandBase|ErrandBase]]&gt; Errands : Errands that need to be performed today.
; var() const export editinline array&lt;DayInventoryStruct&gt; PlayerInvList : Things to give to the player when day starts
; var() const export editinline array&lt;DayInventoryStruct&gt; TakeFromPlayerList : Things to be taken away from the player when day starts

===Hidden ===
; int ActiveErrands :  Cached number of active errands (to make it faster)  

==Functions ==
; function AddInStartingInventory([[Legacy:P2Pawn|P2Pawn]] PlayerPawn) : Take the player pawn and add these things in
; function TakeInventoryFromPlayer([[Legacy:P2Pawn|P2Pawn]] PlayerPawn) : Take away things from the player and destroy them if necessary
; function [[Legacy:Texture|Texture]] GetMapTexture() : Returns today's map texture
; function [[Legacy:Texture|Texture]] GetNewsTexture() : Returns today's news texture
; function [[Legacy:Sound|Sound]] GetDudeNewsComment() : Returns today's news comment
; function [[Legacy:Texture|Texture]] GetLoadTexture() : Returns today's loading texture
; function [[Legacy:Sound|Sound]] GetDudeStartComment() : Returns dude starting comment for today's errands
; function CheckForValidErrandGoals() : Checks for valid goals in the day's errands. Logs a warning if errands or their goals missing.
; function bool CheckForErrandCompletion([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] Another, [[Legacy:Pawn|Pawn]] ActionPawn, bool bPremature, [[Legacy:GameState|GameState]] CurGameState, out int ErrandIndex, out name CompletionTrigger) : Attempts to complete an errand with the information passed in.
; function AddMyHaters([[Legacy:GameState|GameState]] CurGameState, [[Legacy:P2Player|P2Player]] CurPlayer) : Adds all of the player haters for today's errands.
; function bool IgnoreThisTag([[Legacy:Actor|Actor]] Other) : Checks to see if we want to ignore this actor based on its tag. This lets some objects show up on some days and not on others
; function bool CheckForErrandUse([[Legacy:Actor|Actor]] Other) : Returns true if Other is used for one of today's errands
; function int FindErrand(String UniqueName) :
; function int NumErrands() :
; function int NumActiveErrands() :
; function ActivateErrand(int Errand) :
; function bool IsErrandComplete(int ErrandIndex) :
; function bool IsErrandActive(int ErrandIndex) :
; function Sound GetErrandStartComment(int ErrandIndex) :
; function Sound GetErrandCompletedComment(int ErrandIndex) :
; function Sound GetErrandWhereComment(int ErrandIndex) :
; function Sound GetErrandFoundComment(int ErrandIndex) :
; function Texture GetErrandName(int ErrandIndex) :
; function Texture GetErrandLocation(int ErrandIndex, out float x, out float y) :
; function Texture GetErrandLocationCrossout(int ErrandIndex, out float x, out float y) :

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2812</id>
      <timestamp>2004-05-28T00:58:01Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:DayBase|DayBase]] }}

==Structs ==

===DayInventoryStruct ===
; var() const Name InvClassName : Class of inventory to remove/give
; var() const int NeededAmount : Make sure the player has at least this much of the item
; var() const GuyTypeEnum GuyType : Which type of dude can get this thing
; var() const bool bEnhancedOnly : Only get it in enhanced mode

==Enums ==

===GuyTypeEnum ===
; GTE_BOTH : Okay for both good and evil dude
; GTE_EVIL : Okay for evil dude only
; GTE_GOOD: Okay for good dude only

==Properties ==

===Main ===
; var() const localized String Description :  Name of day (ex: &quot;Monday&quot;)
; var() const String UniqueName :  A unique day name so code can refer to specific days.
; var() const array&lt;string&gt; ExcludeDays : A list of other group names that need to be excluded from today.
; var() const name MapTex : Map texture for today
; var() const name NewsTex : Newspaper texture for today
; var() const name DudeNewsComment : Dude's comment on today's newspaper
; var() const name LoadTex : Loading texture for today
; var() const name DudeStartComment : Dude's comment on starting today's errands.
; var() const editinline array&lt;[[Legacy:ErrandBase|ErrandBase]]&gt; Errands : Errands that need to be performed today.
; var() const export editinline array&lt;DayInventoryStruct&gt; PlayerInvList : Things to give to the player when day starts
; var() const export editinline array&lt;DayInventoryStruct&gt; TakeFromPlayerList : Things to be taken away from the player when day starts

===Hidden ===
; int ActiveErrands :  Cached number of active errands (to make it faster)  

==Functions ==
; function AddInStartingInventory([[Legacy:P2Pawn|P2Pawn]] PlayerPawn) : Take the player pawn and add these things in
; function TakeInventoryFromPlayer([[Legacy:P2Pawn|P2Pawn]] PlayerPawn) : Take away things from the player and destroy them if necessary
; function [[Legacy:Texture|Texture]] GetMapTexture() : Returns today's map texture
; function [[Legacy:Texture|Texture]] GetNewsTexture() : Returns today's news texture
; function [[Legacy:Sound|Sound]] GetDudeNewsComment() : Returns today's news comment
; function [[Legacy:Texture|Texture]] GetLoadTexture() : Returns today's loading texture
; function [[Legacy:Sound|Sound]] GetDudeStartComment() : Returns dude starting comment for today's errands
; function CheckForValidErrandGoals() : Checks for valid goals in the day's errands. Logs a warning if errands or their goals missing.
; function bool CheckForErrandCompletion([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] Another, [[Legacy:Pawn|Pawn]] ActionPawn, bool bPremature, [[Legacy:GameState|GameState]] CurGameState, out int ErrandIndex, out name CompletionTrigger) : Attempts to complete an errand with the information passed in.
; function AddMyHaters([[Legacy:GameState|GameState]] CurGameState, [[Legacy:P2Player|P2Player]] CurPlayer) : Adds all of the player haters for today's errands.
; function bool IgnoreThisTag([[Legacy:Actor|Actor]] Other) : Checks to see if we want to ignore this actor based on its tag. This lets some objects show up on some days and not on others
; function bool CheckForErrandUse([[Legacy:Actor|Actor]] Other) : Returns true if Other is used for one of today's errands
; function int FindErrand(String UniqueName) :
; function int NumErrands() :
; function int NumActiveErrands() :
; function ActivateErrand(int Errand) :
; function bool IsErrandComplete(int ErrandIndex) :
; function bool IsErrandActive(int ErrandIndex) :
; function Sound GetErrandStartComment(int ErrandIndex) :
; function Sound GetErrandCompletedComment(int ErrandIndex) :
; function Sound GetErrandWhereComment(int ErrandIndex) :
; function Sound GetErrandFoundComment(int ErrandIndex) :
; function Texture GetErrandName(int ErrandIndex) :
; function Texture GetErrandLocation(int ErrandIndex, out float x, out float y) :
; function Texture GetErrandLocationCrossout(int ErrandIndex, out float x, out float y) :

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Deadly Fan</title>
    <id>960</id>
    <revision>
      <id>2606</id>
      <timestamp>2008-02-08T08:25:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">==Introduction ==

This is a tutorial on how to create a rotating fan which actually sucks you in and kills you. It's actually very simple ;)

For the Deadly Fan you'll need to add several new actors to your level. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:Fan2|Fan2]]: This is the fan ;)
* [[Legacy:SpecialEvent|SpecialEvent]]: This will actually kill the player.
* [[Legacy:Trigger|Trigger]]: This will make sure the player will get killed.
* [[Legacy:ZoneInfo|ZoneInfo]]: This is going to make sure that the player gets sucked into the fan.

==Let's get to work ==

[[Image:Legacy_deadlyfan1.jpeg|center|This is what it will look like]]

===Fan2 ===

Just add this Fan2 decoration where you want the fan to be in your level. You can adjust its scale in its properties Display -&gt; Drawscale.

=== SpecialEvent ====

I added one SpecialEvent to my level. The position of this actor doesn't matter.

Make sure its properties are similar to these.

*SpecialEvent1
**Events:
***Tag: TheFanHitsYou
**Object:
***InitialState: DamageInstigator (or KillInstigator)
**SpecialEvent:
***Damage: 100000 (not necessary when you use InitialState KillInstigator)

If you're using KillInstigator, you can set the SpecialEvent to display a custom death message when it kills a player:
* SpecialEvent -&gt; DamageType = SpecialDamage
* SpecialEvent -&gt; DamageString = %o was hacked. %k (for example. &quot;%o&quot; will be replaced with the player's name, &quot;%k&quot; will be removed, but it won't work without it.)

===Trigger ===

You'll need to add several Triggers with a small radius but with a large height. Just make sure the Triggers cover the entire Fan and using several Triggers with smaller radii makes sure you don't get killed abnormally early (as in: before you hit the fan ;)). Look at the two pics on this page to see what I mean.

[[Image:Legacy_deadlyfan2.jpeg|center|The Triggers' Height should be rather large, compared to the Radius.]]

Also make sure all Triggers have this:

*Events:
**Event: TheFanHitsYou

===ZoneInfo ===

This is the tricky part. You need to zone off a certain area in your level in which the Fan will suck you in. Once you got your zone, add a ZoneInfo in it.

The last thing you need to do is change the ZoneVelocity. So, open the ZoneInfo's properties and go to ZoneInfo -&gt; ZoneVelocity.

In my testlevel I had these settings:

*X: 250.000000
*Y:   0.000000
*Z:   0.000000

But this will probably need to be changed to suit the situation in your own level.

==Conclusion ==

You're basically done :) Boot your level and let yourself slide ;).

==Notes ==

Instead of the Trigger-SpecialEvent combination, you can also use [[Legacy:TriggeredDeath|TriggeredDeath]]. Then you just need to add several TriggeredDeath-actors on the positions the Triggers are now in. You'll also need to remove those usual Triggers and the SpecialEvent.

==Comments ==

Place your comments on this tutorial here :).

The Twiggman: Lol back in the day I did the same idea but I used a rotating mover and A thin undetectable solid that you would get pushed into and expload on. Good old encroach damage. Might wanna do some zoning also to create some gravity suction. Sweet though.

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] topic page

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2607</id>
      <timestamp>2008-02-08T02:50:30Z</timestamp>
      <contributor>
        <ip>Cpe-75-80-151-39.san.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">lulz gone</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Death Angyl</title>
    <id>969</id>
    <revision>
      <id>2623</id>
      <timestamp>2002-08-14T18:02:47Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Projects==

[[Legacy:Mod_Ideas/StarCraft|Mod_Ideas/StarCraft]] mod for UT2k3, more or less cancelled currently, though I may use some concepts for a space-age shooter.

==Contact==

warcraft_3_addict@hotmail.com

----

==Guestbook==

'''Tarquin:''' Hello &amp; welcome to the Unreal Wiki.

'''ZxAnPhOrIaN:''' Hi! :) :tup:

'''Highlander:''' Hullo there

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2624</id>
      <timestamp>2002-08-14T17:48:55Z</timestamp>
      <contributor>
        <ip>Death Angyl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Projects==

[[Legacy:Mod Ideas/Starcraft|Mod Ideas/Starcraft]] mod for UT2k3, more or less cancelled currently, though I may use some concepts for a space-age shooter.

==Contact==

warcraft_3_addict@hotmail.com

----

==Guestbook==

'''Tarquin:''' Hello &amp; welcome to the Unreal Wiki.

'''ZxAnPhOrIaN:''' Hi! :) :tup:

'''Highlander:''' Hullo there

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2625</id>
      <timestamp>2002-08-14T17:49:53Z</timestamp>
      <contributor>
        <ip>Death Angyl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Projects==

[http://wiki.beyondunreal.com/wiki/Mod_Ideas/StarCraft StarCraft] mod for UT2k3, more or less cancelled currently, though I may use some concepts for a space-age shooter.

==Contact==

warcraft_3_addict@hotmail.com

----

==Guestbook==

'''Tarquin:''' Hello &amp; welcome to the Unreal Wiki.

'''ZxAnPhOrIaN:''' Hi! :) :tup:

'''Highlander:''' Hullo there

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeathMatch</title>
    <id>984</id>
    <revision>
      <id>2657</id>
      <timestamp>2005-12-02T19:57:25Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] }}

==Known subclasses ==
 DeathMatch
  +- [[Legacy:TeamGame|TeamGame]]
  |   +- [[Legacy:CTFGame|CTFGame]]
  |   |   +- [[Legacy:XCTFGame|xCTFGame]]
  |   |       +- [[Legacy:InstagibCTF|InstagibCTF]] (UT200x)
  |   |       +- [[Legacy:XVehicleCTFGame|xVehicleCTFGame]] (UT2004)
  |   +- [[Legacy:XBombingRun|xBombingRun]] (UT200x)
  |   +- [[Legacy:XDoubleDom|xDoubleDom]] (UT200x)
  |   +- [[Legacy:XTeamGame|xTeamGame]]
  |       +- [[Legacy:ASGameInfo|ASGameInfo]] (UT2004)
  |       +- [[Legacy:Invasion|Invasion]] (UT2004)
  |       +- [[Legacy:ONSOnslaughtGame|ONSOnslaughtGame]] (UT2004)
  +- [[Legacy:XDeathMatch|xDeathMatch]]
      +- [[Legacy:BossDM|BossDM]]
      +- [[Legacy:XLastManStandingGame|xLastManStandingGame]] (UT2004)
      +- [[Legacy:XMutantGame|xMutantGame]] (UT2004)

==Properties==
; ADR_Kill (float) :  
; ADR_MajorKill (float) :  
; ADR_MinorError (float) :  
; ADR_MinorBonus (float) :  
; ADR_KillTeamMate (float) :  

I'm guessing the above all set how much [[Legacy:Adrenaline|adrenaline]] is awarded (or removed) for different actions.

===Non-editable===
; NumRounds (int) :  
; NetWait (int) :  time to wait for players in netgames w/ bNetReady (typically team games)*/  
; MinNetPlayers (int) :  how many players must join before net game will start*/  
; RestartWait (int) :  
; bNoCoronas (bool) :  don't display team coronas on player shoulders*/  
; bForceDefaultCharacter (bool) :  all characters shown using default (jugg male) mesh*/  
; bTournament (bool) :  number of players must equal maxplayers for game to start*/  
; bPlayersMustBeReady (bool) :  players must confirm ready for game to start*/  
; bForceRespawn (bool) :  
; bAdjustSkill (bool) :  
; bAllowTaunts (bool) :  
; bool	bAllowTrans () :  
; bWaitForNetPlayers () :  wait until more than MinNetPlayers players have joined before starting match*/  
; bMustJoinBeforeStart () :  players can only spectate if they join after the game starts*/  
; bool	bFirstBlood () :  
; bool	bQuickStart () :  
; bool	bStartedCountDown () :  
; bool	bFinalStartup () :  
; bool	bOverTimeBroadcast () :  
; bool	bEpicNames () :  
; bool	bKillBots () :  
; StartupStage (byte) :  what startup message to display*/  
; RemainingTime (int) :  
; ElapsedTime (int) :  
; CountDown (int) :  
; AdjustedDifficulty (float) :  
; PlayerKills (int) :  
; PlayerDeaths (int) :  
; DMSquadClass (class&lt;SquadAI&gt;) :  squad class to use for bots in DM games (no team)*/  
; LevelRulesClass (class&lt;LevelGameRules&gt;) :  
; LevelRules (LevelGameRules) :  level designer overriding of game settings (hook for mod authors)*/  
; SpawnProtectionTime (float) :  
; EnemyRoster (UnrealTeamInfo) :  
; EnemyRosterName (string) :  
; DefaultEnemyRosterClass (string) :  
; RemainingBots () :  
; InitialBots () :  
; LastPlayerStartSpot (NavigationPoint) :  last place player looking for start spot started from*/  
; LastStartSpot (NavigationPoint) :  last place any player started from*/  
; NameNumber () :  append to ensure unique name if duplicate player name change requested*/  
; EndMessageWait () :  wait before playing which team won the match*/  
; EndMessageCounter () :  end message counter*/  
; EndGameSound[2] () :  end game sounds*/  
; AltEndGameSound[2] (Sound) :  
; SinglePlayerWait () :  single-player wait delay before auto-returning to menus*/  
; NamePrefixes[10] (string) :  for bots with same name*/  
; NameSuffixes[10] (string) :  for bots with same name*/  
; EndGameFocus (actor) :  
; StandalonePlayer (PlayerController) :  
; DMPropsDisplayText[9] (string) :  
; EpicNames[21] (string) :  
; EpicOffset (int) :  
; TotalEpic (int) :  

==Functions==

(Incomplete?)

===Level Gameplay Modifications===
; ReduceDamage: Used to allow the game rules to reduce damage.  This specific version first tests the spawnprotection time before calling its parent class's version of this function (basically to allow armour and the GameModifier to influence damage).  After this is done, the function checks difficulty and halves damage to human players in standalone easy games.  The function also modifies the damage done by bots based on their skill level and whether or not they're using a melle weapon.  Finally, the instigator's damagescaling is used to affect the final value.

===Inherited from [[Legacy:GameInfo|GameInfo]]===
; ReviewJumpSpots : Called by the [[Legacy:CheatManager|CheatManager]] function of the same name. Spawns a bot which tests all the level's [[Legacy:JumpSpot|JumpSpot]]s. The test is implemented in the [[Legacy:Bot|Bot]]'s &lt;code&gt;Testing&lt;/code&gt; state.

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy Class Tree]]

[[:Category:Legacy To Do]] &amp;ndash; Package name, function definitions.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2658</id>
      <timestamp>2003-01-06T10:07:05Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] }}

==Known subclasses ==
 DeathMatch
  +-[[Legacy:TeamGame|TeamGame]]
  |     +-[[Legacy:CTFGame|CTFGame]]
  |     |     +-[[Legacy:XCTFGame|xCTFGame]]
  |     +-[[Legacy:XBombingRun|xBombingRun]]
  |     +-[[Legacy:XDoubleDom|xDoubleDom]]
  |     +-[[Legacy:XTeamGame|xTeamGame]]
  +-[[Legacy:XDeathMatch|xDeathMatch]]
        +-[[Legacy:BossDM|BossDM]]

==Properties ==
; ADR_Kill (float) :  
; ADR_MajorKill (float) :  
; ADR_MinorError (float) :  
; ADR_MinorBonus (float) :  
; ADR_KillTeamMate (float) :  

I'm guessing the above all set how much [[Legacy:Adrenaline|adrenaline]] is awarded (or removed) for different actions.

===Non-editable ===
; NumRounds (int) :  
; NetWait (int) :  time to wait for players in netgames w/ bNetReady (typically team games)*/  
; MinNetPlayers (int) :  how many players must join before net game will start*/  
; RestartWait (int) :  
; bNoCoronas (bool) :  don't display team coronas on player shoulders*/  
; bForceDefaultCharacter (bool) :  all characters shown using default (jugg male) mesh*/  
; bTournament (bool) :  number of players must equal maxplayers for game to start*/  
; bPlayersMustBeReady (bool) :  players must confirm ready for game to start*/  
; bForceRespawn (bool) :  
; bAdjustSkill (bool) :  
; bAllowTaunts (bool) :  
; bool	bAllowTrans () :  
; bWaitForNetPlayers () :  wait until more than MinNetPlayers players have joined before starting match*/  
; bMustJoinBeforeStart () :  players can only spectate if they join after the game starts*/  
; bool	bFirstBlood () :  
; bool	bQuickStart () :  
; bool	bStartedCountDown () :  
; bool	bFinalStartup () :  
; bool	bOverTimeBroadcast () :  
; bool	bEpicNames () :  
; bool	bKillBots () :  
; StartupStage (byte) :  what startup message to display*/  
; RemainingTime (int) :  
; ElapsedTime (int) :  
; CountDown (int) :  
; AdjustedDifficulty (float) :  
; PlayerKills (int) :  
; PlayerDeaths (int) :  
; DMSquadClass (class&lt;SquadAI&gt;) :  squad class to use for bots in DM games (no team)*/  
; LevelRulesClass (class&lt;LevelGameRules&gt;) :  
; LevelRules (LevelGameRules) :  level designer overriding of game settings (hook for mod authors)*/  
; SpawnProtectionTime (float) :  
; EnemyRoster (UnrealTeamInfo) :  
; EnemyRosterName (string) :  
; DefaultEnemyRosterClass (string) :  
; RemainingBots () :  
; InitialBots () :  
; LastPlayerStartSpot (NavigationPoint) :  last place player looking for start spot started from*/  
; LastStartSpot (NavigationPoint) :  last place any player started from*/  
; NameNumber () :  append to ensure unique name if duplicate player name change requested*/  
; EndMessageWait () :  wait before playing which team won the match*/  
; EndMessageCounter () :  end message counter*/  
; EndGameSound[2] () :  end game sounds*/  
; AltEndGameSound[2] (Sound) :  
; SinglePlayerWait () :  single-player wait delay before auto-returning to menus*/  
; NamePrefixes[10] (string) :  for bots with same name*/  
; NameSuffixes[10] (string) :  for bots with same name*/  
; EndGameFocus (actor) :  
; StandalonePlayer (PlayerController) :  
; DMPropsDisplayText[9] (string) :  
; EpicNames[21] (string) :  
; EpicOffset (int) :  
; TotalEpic (int) :  

==Functions==

===Level Gameplay Modifications===

; Reduce Damage: Used to allow the game rules to reduce damage.  This specific version first tests the spawnprotection time before calling its parent class's version of this function (basically to allow armour and the GameModifier to influence damage).  After this is done, the function checks difficulty and halves damage to human players in standalone easy games.  The function also modifies the damage done by bots based on their skill level and whether or not they're using a melle weapon.  Finally, the instigator's damagescaling is used to affect the final value.</text>
    </revision>
    <revision>
      <id>2659</id>
      <timestamp>2004-01-29T17:41:26Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] }}

==Known subclasses ==
 DeathMatch
  +-[[Legacy:TeamGame|TeamGame]]
  |     +-[[Legacy:CTFGame|CTFGame]]
  |     |     +-[[Legacy:XCTFGame|xCTFGame]]
  |     +-[[Legacy:XBombingRun|xBombingRun]]
  |     +-[[Legacy:XDoubleDom|xDoubleDom]]
  |     +-[[Legacy:XTeamGame|xTeamGame]]
  +-[[Legacy:XDeathMatch|xDeathMatch]]
        +-[[Legacy:BossDM|BossDM]]

==Properties ==
; ADR_Kill (float) :  
; ADR_MajorKill (float) :  
; ADR_MinorError (float) :  
; ADR_MinorBonus (float) :  
; ADR_KillTeamMate (float) :  

I'm guessing the above all set how much [[Legacy:Adrenaline|adrenaline]] is awarded (or removed) for different actions.

===Non-editable ===
; NumRounds (int) :  
; NetWait (int) :  time to wait for players in netgames w/ bNetReady (typically team games)*/  
; MinNetPlayers (int) :  how many players must join before net game will start*/  
; RestartWait (int) :  
; bNoCoronas (bool) :  don't display team coronas on player shoulders*/  
; bForceDefaultCharacter (bool) :  all characters shown using default (jugg male) mesh*/  
; bTournament (bool) :  number of players must equal maxplayers for game to start*/  
; bPlayersMustBeReady (bool) :  players must confirm ready for game to start*/  
; bForceRespawn (bool) :  
; bAdjustSkill (bool) :  
; bAllowTaunts (bool) :  
; bool	bAllowTrans () :  
; bWaitForNetPlayers () :  wait until more than MinNetPlayers players have joined before starting match*/  
; bMustJoinBeforeStart () :  players can only spectate if they join after the game starts*/  
; bool	bFirstBlood () :  
; bool	bQuickStart () :  
; bool	bStartedCountDown () :  
; bool	bFinalStartup () :  
; bool	bOverTimeBroadcast () :  
; bool	bEpicNames () :  
; bool	bKillBots () :  
; StartupStage (byte) :  what startup message to display*/  
; RemainingTime (int) :  
; ElapsedTime (int) :  
; CountDown (int) :  
; AdjustedDifficulty (float) :  
; PlayerKills (int) :  
; PlayerDeaths (int) :  
; DMSquadClass (class&lt;SquadAI&gt;) :  squad class to use for bots in DM games (no team)*/  
; LevelRulesClass (class&lt;LevelGameRules&gt;) :  
; LevelRules (LevelGameRules) :  level designer overriding of game settings (hook for mod authors)*/  
; SpawnProtectionTime (float) :  
; EnemyRoster (UnrealTeamInfo) :  
; EnemyRosterName (string) :  
; DefaultEnemyRosterClass (string) :  
; RemainingBots () :  
; InitialBots () :  
; LastPlayerStartSpot (NavigationPoint) :  last place player looking for start spot started from*/  
; LastStartSpot (NavigationPoint) :  last place any player started from*/  
; NameNumber () :  append to ensure unique name if duplicate player name change requested*/  
; EndMessageWait () :  wait before playing which team won the match*/  
; EndMessageCounter () :  end message counter*/  
; EndGameSound[2] () :  end game sounds*/  
; AltEndGameSound[2] (Sound) :  
; SinglePlayerWait () :  single-player wait delay before auto-returning to menus*/  
; NamePrefixes[10] (string) :  for bots with same name*/  
; NameSuffixes[10] (string) :  for bots with same name*/  
; EndGameFocus (actor) :  
; StandalonePlayer (PlayerController) :  
; DMPropsDisplayText[9] (string) :  
; EpicNames[21] (string) :  
; EpicOffset (int) :  
; TotalEpic (int) :  

==Functions==

===Level Gameplay Modifications===

; ReduceDamage: Used to allow the game rules to reduce damage.  This specific version first tests the spawnprotection time before calling its parent class's version of this function (basically to allow armour and the GameModifier to influence damage).  After this is done, the function checks difficulty and halves damage to human players in standalone easy games.  The function also modifies the damage done by bots based on their skill level and whether or not they're using a melle weapon.  Finally, the instigator's damagescaling is used to affect the final value.

===Inherited from [[Legacy:GameInfo|GameInfo]]===
; ReviewJumpSpots : Called by the [[Legacy:CheatManager|CheatManager]] function of the same name. Spawns a bot which tests all the level's [[Legacy:JumpSpot|JumpSpot]]s. The test is implemented in the [[Legacy:Bot|Bot]]'s &lt;code&gt;Testing&lt;/code&gt; state.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeathMatch (P2)</title>
    <id>28389</id>
    <revision>
      <id>40061</id>
      <timestamp>2009-11-15T08:24:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeathMatchMessage</title>
    <id>28547</id>
    <revision>
      <id>40248</id>
      <timestamp>2009-11-17T11:06:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeathMatchPlus</title>
    <id>934</id>
    <revision>
      <id>2546</id>
      <timestamp>2006-01-13T07:51:35Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>Very easy to fix when writing an Arena mutator if you are aware of it.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; DeathMatchPlus (Package: BotPack)}}

This is the Tournament DeathMatch gametype and at the same time the superclass of all other &quot;playable&quot; UT game types.

==Properties ==

===Globalconfig Properties ===

These settings are shared among all UT game types.
; globalconfig int MinPlayers : Bots fill the server to guarantee this minimum number of players.
; globalconfig float AirControl : The default air control.
; globalconfig bool bChangeLevels :
; globalconfig bool bHardcoreMode : If this is True players receive 50% more damage and jump 10% higher. Game time goes by 10% faster.
; globalconfig bool bMegaspeed : Players move 40% faster and jump 20% higher than without bMegaSpeed and bHardcoreMode.
; globalconfig bool bAltScoring : If a player is killed by another player his score is reduced by 1 point.
; globalconfig bool bTournament : True if Tournament mode is enabled.  Tournament mode prevents the game from starting until every player has indicated that they are ready (even if the &quot;non ready&quot; players have nipped down the chippy for some food).
; globalconfig int NetWait : Time to wait for players in netgames w/ bNetReady (typically team games)
; globalconfig int RestartWait : 
; globalconfig int InitialBots :

===Config Properties ===

Per-gametype settings.
; config int FragLimit : Pretty obvious.
; config int TimeLimit : Time limit in minutes.
; config bool bMultiWeaponStay : Weapons stay when they are picked up. (No respawn time)
; config bool bForceRespawn : Players respawn instantly. (Configured in the Settings tab of the Start Game window.)
; config int MaxCommanders :
; config bool bUseTranslocator : Whether players should get a [[Legacy:Translocator|Translocator]].

===Localized Properties ===
; string StartUpMessage : 
; string TourneyMessage : 
; string WaitingMessage1 : 
; string WaitingMessage2 : 
; string ReadyMessage : 
; string NotReadyMessage : 
; string CountDownMessage : 
; string StartMessage : 
; string GameEndedMessage : 
; string SingleWaitingMessage : 
; string gamegoal : 
; string NoNameChange : 
; string OvertimeMessage : 

===Other Properties ===
; bool bChallengeMode : Game time goes by even faster. (25%)
; bool bAlwaysForceRespawn : Overrides bForceRespawn to be always True. This is a gametype specific setting and can not be configured.
; bool DontRestart : ???
; bool bAlreadyChanged : ???
; bool bFirstBlood : This indicated whether First Blood was already drawn.
; bool bRequireReady : 
; bool bNoviceMode : This will be set when Difficulty is below 4.
; bool bNetReady : 
; bool bJumpMatch : All Players can jump as high as if they had the jump boots.
; bool bThreePlus : This will be set when Difficulty is not &gt;= 4, but &gt; 3. (this doesn't seem to be possible though, since Difficulty is a byte variable)
; bool bFulfilledSpecial : ???
; bool bRatedTranslocator : Use the Translocator in in this rated game, i.e. ladder game.
; bool bStartMatch : True during match startup.
; int RemainingTime, ElapsedTime :
; int CountDown, StartCount :
; float LastTauntTime :
; [[Legacy:NavigationPoint|NavigationPoint]] LastStartSpot :
; int NumCommanders : Number of Commanders in the game. ''(Commanders are not implemented in UT)''
; bool bTutorialGame : This game is a tutorial game.
; int NumBots : Number of bots in the game.
; int RemainingBots : 
; int LastTaunt[4] : The indices of the last four auto-taunts used, LastTaunt[3] being the most recent. This is generally updated by the Killed() function.
; [[Legacy:ChallengeBotInfo|ChallengeBotInfo]] BotConfig :
; class&lt;[[Legacy:ChallengeBotInfo|ChallengeBotInfo]]&gt; BotConfigType :
; float PlayerRating :
; float AvgOpponentRating :
; int NumOpp :
; int WinCount :
; int LoseCount :
; [[Legacy:PlayerPawn|PlayerPawn]] RatedPlayer :
; int IDnum :
; [[Legacy:RatedMatchInfo|RatedMatchInfo]] RatedMatchConfig :
; float EndTime :
; int LadderTypeIndex :
; [[Legacy:LadderInventory|LadderInventory]] RatedGameLadderObj :

==Methods ==
; PreCacheReferences ( ) : This function is never called.  It exists purely to force the pre-caching of the standard weapon and player meshes. The Arena mutators thereby force the pre-caching of weapon meshes that are not even used.
; CheckReady ( ) : This function sets the &lt;tt&gt;TimeLimit&lt;/tt&gt; to 20, and the &lt;tt&gt;RemainingTime&lt;/tt&gt; to 1200.  The function is only called when tournament mode is turned on.
; SetGameSpeed (float T) : This function sets the gamespeed.  It completely replaces the superclass implementation.  The function also calls &lt;tt&gt;SaveConfig()&lt;/tt&gt; once the final game speed has been calculated.
; PlayTeleportEffect ([[Legacy:Actor (UT)|Actor (UT)]] Incoming, bool bOut, bool bSound) : Originally declared in [[Legacy:GameInfo (UT)|GameInfo (UT)]]. This function simply adds a check for tournament mode behaviour.  Apart from that the code is identical to the [[Legacy:TournamentGameInfo|TournamentGameInfo]] version of this function. ''Note to newbie coders: This is an example of poor practice.  After the initial tournament check the developer should simply have called &lt;code&gt;Super.PlayTeleportEffect()&lt;/code&gt; - it would have saved the code duplication.''
; InitRatedGame ([[Legacy:LadderInventory|LadderInventory]] LadderObj, [[Legacy:PlayerPawn|PlayerPawn]] LadderPlayer) : Set game settings based on ladder information.  Called when RatedPlayer logs in.
; AcceptInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Originally declared in [[Legacy:GameInfo (UT)|GameInfo (UT)]]. This function allows the player to keep all instances of type [[Legacy:LadderInventory|LadderInventory]], and destroys all other inventory objects.  The player's weapon and selected item are set to &lt;tt&gt;None&lt;/tt&gt; and the function &lt;tt&gt;AddDefaultInventory()&lt;/tt&gt; is called.
; bool SetEndCams (string Reason) : Plays the winning message and focuses the view on the winning player.
; PlayWinMessage ([[Legacy:PlayerPawn|PlayerPawn]] Player, bool bWinner) : Plays the winning message  if the object passed is of type [[Legacy:TournamentPlayer|TournamentPlayer]].
; NotifySpree ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, int num) : Notifies the local player if they are on a killing spree - and selects an appropriate message.  ''num'' is the number of kills the player has got without dying.
; EndSpree ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Unfortunately your killing spree has come to an end  - lets tell both you and the person who killed you about it.
; Killed ([[Legacy:Pawn (UT)|Pawn (UT)]] killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Declared in [[Legacy:GameInfo (UT)|GameInfo (UT)]]. This function checks for any end of game conditions as well as for &quot;first blood&quot; and other special events.  This function is also responsible for sending auto taunts.
; StartMatch ( ) : This is called to start the game.  If there is a timelimit on the start of the game then this function sets that.  There are also traps in here to end the game from spawn-telefrags (if there are not enough start points then it's possible to win a game just from telefragging).
; Timer ( ) : Checks for tournament mode, whether the game has ended because of it's time limit and other stuff.
; bool TooManyBots ( ) : This function returns &lt;tt&gt;true&lt;/tt&gt; if the number of bots plus the number of players is greater than the minimum number of players.
; bool RestartPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] aPlayer) : Called to re-start a player on the map.  Will also remove bot players from the game if there are too many of them.
; SendStartMessage( [[Legacy:PlayerPawn|PlayerPawn]] P ) : Shows the start message to the player.
; [[Legacy:Bot (UT)|Bot (UT)]] SpawnBot (out NavigationPoint StartSpot) : Spawns a bot. &lt;i&gt;Finish me&lt;/i&gt;
; [[Legacy:Bot (UT)|Bot (UT)]] SpawnRatedBot (out [[Legacy:NavigationPoint|NavigationPoint]] StartSpot) : &lt;i&gt;Finish me&lt;/i&gt;
; bool ForceAddBot ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; bool AddBot ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; PlayStartUpMessage ([[Legacy:PlayerPawn|PlayerPawn]] NewPlayer) : &lt;i&gt;Finish me&lt;/i&gt;
; GiveWeapon ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn, string aClassName) : Gives a weapon to a player and makes it the player's current weapon.
; RateVs ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] Killer) : &lt;i&gt;Finish me&lt;/i&gt;
; bool SuccessfulGame ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; Skip ( )
; SkipAll ( ) : Debug commands (?)
; bool NeedPlayers ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; bool OneOnOne ( ) : Returns whether there are only two players (human players or bots
; float SpawnWait ([[Legacy:Bot (UT)|Bot (UT)]] B) : &lt;i&gt;Finish me&lt;/i&gt;
; bool NeverStakeOut ([[Legacy:Bot (UT)|Bot (UT)]] Other) : &lt;i&gt;Finish me&lt;/i&gt;

==AI and Navigation Functions ==
; bool CheckThisTranslocator ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:TranslocatorTarget|TranslocatorTarget]] T) : This function returns ''false''.
; PickAmbushSpotFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : This function searches through all [[Legacy:NavigationPoint|NavigationPoint]] objects on the map looking for navigation points of type [[Legacy:AmbushPoint|AmbushPoint]].  If the [[Legacy:AmbushPoint|AmbushPoint]] is not taken ([[Legacy:NavigationPoint|NavigationPoint]].taken is ''false'') and the [[Legacy:Bot (UT)|Bot (UT)]] is not already at an ambush point then the ambush point found will be assigned to the [[Legacy:Bot (UT)|Bot (UT)]].''AmbushSpot''.  If the bot is already at an ambush point and a new ambush point has been found then the bot's ''AmbushSpot'' will be set to the new [[Legacy:AmbushPoint|AmbushPoint]].
; byte AssessBotAttitude ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : This function determines the attitude of ''aBot'' towards ''Other''.  The value returned by this function is used in [[Legacy:Bot (UT)|Bot (UT)]].AttitudeTo() function to map to the enumeration [[Legacy:EAttitude|eAttitude]].  The function returns either a 1 (hate) or a 0 (fear) depending on the result of it's calculations.  The calculations involve the bot's skill and level of agressiveness as defined by the value of ''aBot.Aggressiveness''.
; float GameThreatAdd ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : This function is called by Bot.AssessThreat() and returns a numerical value representing the importance of &lt;tt&gt;Other&lt;/tt&gt; as a target. In DeathMatchPlus it simply returns 0, but individual gametypes override this function to gain more control over the bots' selection of targets. For example, the [[Legacy:CTFGame|CTFGame]] implementation of this function returns 10 if &lt;tt&gt;Other&lt;/tt&gt; is a flag carrier, and [[Legacy:LastManStanding|LastManStanding]]'s version returns slightly higher threat values for players who have more lives left.
; bool AllowTranslocation ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, vector Dest) : This function returns ''true''.
; bool CanTranslocate ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : This function returns true if the bot is able to perform a translocation.  In order for the bot to be able to use the translocator it must first have one, and it's [[Legacy:Translocator|Translocator]] must have a target.  Translocation must also be allowed by the game.
; ModifyBehaviour ([[Legacy:Bot (UT)|Bot (UT)]] NewBot) : Only declaration here.

==Comments ==

From what I can tell there is an awful lot of handling around the &quot;Tournament Mode&quot; feature.

==Known Subclasses ==
* [[Legacy:ChallengeDMP|ChallengeDMP]] (used for the &quot;Challenge&quot; group of ladder game?)
* [[Legacy:ChallengeIntro|ChallengeIntro]] (used for CityIntro map)
* [[Legacy:LastManStanding|LastManStanding]]
* [[Legacy:TDarkMatch|TDarkMatch]] (Tournament DarkMatch, not used)
* [[Legacy:TeamGamePlus|TeamGamePlus]]
* [[Legacy:TrainingDM|TrainingDM]]

==Related Topics ==
* [[Legacy:Mapping For DM|Mapping for DM]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2547</id>
      <timestamp>2004-05-22T01:08:13Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; DeathMatchPlus (Package: BotPack)}}

This is the Tournament DeathMatch gametype and at the same time the superclass of all other &quot;playable&quot; UT game types.

==Properties ==

===Globalconfig Properties ===

These settings are shared among all UT game types.
; globalconfig int MinPlayers : Bots fill the server to guarantee this minimum number of players.
; globalconfig float AirControl : The default air control.
; globalconfig bool bChangeLevels :
; globalconfig bool bHardcoreMode : If this is True players receive 50% more damage and jump 10% higher. Game time goes by 10% faster.
; globalconfig bool bMegaspeed : Players move 40% faster and jump 20% higher than without bMegaSpeed and bHardcoreMode.
; globalconfig bool bAltScoring : If a player is killed by another player his score is reduced by 1 point.
; globalconfig bool bTournament : True if Tournament mode is enabled.  Tournament mode prevents the game from starting until every player has indicated that they are ready (even if the &quot;non ready&quot; players have nipped down the chippy for some food).
; globalconfig int NetWait : Time to wait for players in netgames w/ bNetReady (typically team games)
; globalconfig int RestartWait : 
; globalconfig int InitialBots :

===Config Properties ===

Per-gametype settings.
; config int FragLimit : Pretty obvious.
; config int TimeLimit : Time limit in minutes.
; config bool bMultiWeaponStay : Weapons stay when they are picked up. (No respawn time)
; config bool bForceRespawn : Players respawn instantly. (Configured in the Settings tab of the Start Game window.)
; config int MaxCommanders :
; config bool bUseTranslocator : Whether players should get a [[Legacy:Translocator|Translocator]].

===Localized Properties ===
; string StartUpMessage : 
; string TourneyMessage : 
; string WaitingMessage1 : 
; string WaitingMessage2 : 
; string ReadyMessage : 
; string NotReadyMessage : 
; string CountDownMessage : 
; string StartMessage : 
; string GameEndedMessage : 
; string SingleWaitingMessage : 
; string gamegoal : 
; string NoNameChange : 
; string OvertimeMessage : 

===Other Properties ===
; bool bChallengeMode : Game time goes by even faster. (25%)
; bool bAlwaysForceRespawn : Overrides bForceRespawn to be always True. This is a gametype specific setting and can not be configured.
; bool DontRestart : ???
; bool bAlreadyChanged : ???
; bool bFirstBlood : This indicated whether First Blood was already drawn.
; bool bRequireReady : 
; bool bNoviceMode : This will be set when Difficulty is below 4.
; bool bNetReady : 
; bool bJumpMatch : All Players can jump as high as if they had the jump boots.
; bool bThreePlus : This will be set when Difficulty is not &gt;= 4, but &gt; 3. (this doesn't seem to be possible though, since Difficulty is a byte variable)
; bool bFulfilledSpecial : ???
; bool bRatedTranslocator : Use the Translocator in in this rated game, i.e. ladder game.
; bool bStartMatch : True during match startup.
; int RemainingTime, ElapsedTime :
; int CountDown, StartCount :
; float LastTauntTime :
; [[Legacy:NavigationPoint|NavigationPoint]] LastStartSpot :
; int NumCommanders : Number of Commanders in the game. ''(Commanders are not implemented in UT)''
; bool bTutorialGame : This game is a tutorial game.
; int NumBots : Number of bots in the game.
; int RemainingBots : 
; int LastTaunt[4] : The indices of the last four auto-taunts used, LastTaunt[3] being the most recent. This is generally updated by the Killed() function.
; [[Legacy:ChallengeBotInfo|ChallengeBotInfo]] BotConfig :
; class&lt;[[Legacy:ChallengeBotInfo|ChallengeBotInfo]]&gt; BotConfigType :
; float PlayerRating :
; float AvgOpponentRating :
; int NumOpp :
; int WinCount :
; int LoseCount :
; [[Legacy:PlayerPawn|PlayerPawn]] RatedPlayer :
; int IDnum :
; [[Legacy:RatedMatchInfo|RatedMatchInfo]] RatedMatchConfig :
; float EndTime :
; int LadderTypeIndex :
; [[Legacy:LadderInventory|LadderInventory]] RatedGameLadderObj :

==Methods ==
; PreCacheReferences ( ) : This function is never called.  It exists purely to force the pre-caching of the standard weapon and player meshes.
; CheckReady ( ) : This function sets the &lt;tt&gt;TimeLimit&lt;/tt&gt; to 20, and the &lt;tt&gt;RemainingTime&lt;/tt&gt; to 1200.  The function is only called when tournament mode is turned on.
; SetGameSpeed (float T) : This function sets the gamespeed.  It completely replaces the superclass implementation.  The function also calls &lt;tt&gt;SaveConfig()&lt;/tt&gt; once the final game speed has been calculated.
; PlayTeleportEffect ([[Legacy:Actor (UT)|Actor (UT)]] Incoming, bool bOut, bool bSound) : Originally declared in [[Legacy:GameInfo (UT)|GameInfo (UT)]]. This function simply adds a check for tournament mode behaviour.  Apart from that the code is identical to the [[Legacy:TournamentGameInfo|TournamentGameInfo]] version of this function. ''Note to newbie coders: This is an example of poor practice.  After the initial tournament check the developer should simply have called &lt;code&gt;Super.PlayTeleportEffect()&lt;/code&gt; - it would have saved the code duplication.''
; InitRatedGame ([[Legacy:LadderInventory|LadderInventory]] LadderObj, [[Legacy:PlayerPawn|PlayerPawn]] LadderPlayer) : Set game settings based on ladder information.  Called when RatedPlayer logs in.
; AcceptInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Originally declared in [[Legacy:GameInfo (UT)|GameInfo (UT)]]. This function allows the player to keep all instances of type [[Legacy:LadderInventory|LadderInventory]], and destroys all other inventory objects.  The player's weapon and selected item are set to &lt;tt&gt;None&lt;/tt&gt; and the function &lt;tt&gt;AddDefaultInventory()&lt;/tt&gt; is called.
; bool SetEndCams (string Reason) : Plays the winning message and focuses the view on the winning player.
; PlayWinMessage ([[Legacy:PlayerPawn|PlayerPawn]] Player, bool bWinner) : Plays the winning message  if the object passed is of type [[Legacy:TournamentPlayer|TournamentPlayer]].
; NotifySpree ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, int num) : Notifies the local player if they are on a killing spree - and selects an appropriate message.  ''num'' is the number of kills the player has got without dying.
; EndSpree ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Unfortunately your killing spree has come to an end  - lets tell both you and the person who killed you about it.
; Killed ([[Legacy:Pawn (UT)|Pawn (UT)]] killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Declared in [[Legacy:GameInfo (UT)|GameInfo (UT)]]. This function checks for any end of game conditions as well as for &quot;first blood&quot; and other special events.  This function is also responsible for sending auto taunts.
; StartMatch ( ) : This is called to start the game.  If there is a timelimit on the start of the game then this function sets that.  There are also traps in here to end the game from spawn-telefrags (if there are not enough start points then it's possible to win a game just from telefragging).
; Timer ( ) : Checks for tournament mode, whether the game has ended because of it's time limit and other stuff.
; bool TooManyBots ( ) : This function returns &lt;tt&gt;true&lt;/tt&gt; if the number of bots plus the number of players is greater than the minimum number of players.
; bool RestartPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] aPlayer) : Called to re-start a player on the map.  Will also remove bot players from the game if there are too many of them.
; SendStartMessage( [[Legacy:PlayerPawn|PlayerPawn]] P ) : Shows the start message to the player.
; [[Legacy:Bot (UT)|Bot (UT)]] SpawnBot (out NavigationPoint StartSpot) : Spawns a bot. &lt;i&gt;Finish me&lt;/i&gt;
; [[Legacy:Bot (UT)|Bot (UT)]] SpawnRatedBot (out [[Legacy:NavigationPoint|NavigationPoint]] StartSpot) : &lt;i&gt;Finish me&lt;/i&gt;
; bool ForceAddBot ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; bool AddBot ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; PlayStartUpMessage ([[Legacy:PlayerPawn|PlayerPawn]] NewPlayer) : &lt;i&gt;Finish me&lt;/i&gt;
; GiveWeapon ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn, string aClassName) : Gives a weapon to a player and makes it the player's current weapon.
; RateVs ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Pawn (UT)|Pawn (UT)]] Killer) : &lt;i&gt;Finish me&lt;/i&gt;
; bool SuccessfulGame ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; Skip ( )
; SkipAll ( ) : Debug commands (?)
; bool NeedPlayers ( ) : &lt;i&gt;Finish me&lt;/i&gt;
; bool OneOnOne ( ) : Returns whether there are only two players (human players or bots
; float SpawnWait ([[Legacy:Bot (UT)|Bot (UT)]] B) : &lt;i&gt;Finish me&lt;/i&gt;
; bool NeverStakeOut ([[Legacy:Bot (UT)|Bot (UT)]] Other) : &lt;i&gt;Finish me&lt;/i&gt;

==AI and Navigation Functions ==
; bool CheckThisTranslocator ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:TranslocatorTarget|TranslocatorTarget]] T) : This function returns ''false''.
; PickAmbushSpotFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : This function searches through all [[Legacy:NavigationPoint|NavigationPoint]] objects on the map looking for navigation points of type [[Legacy:AmbushPoint|AmbushPoint]].  If the [[Legacy:AmbushPoint|AmbushPoint]] is not taken ([[Legacy:NavigationPoint|NavigationPoint]].taken is ''false'') and the [[Legacy:Bot (UT)|Bot (UT)]] is not already at an ambush point then the ambush point found will be assigned to the [[Legacy:Bot (UT)|Bot (UT)]].''AmbushSpot''.  If the bot is already at an ambush point and a new ambush point has been found then the bot's ''AmbushSpot'' will be set to the new [[Legacy:AmbushPoint|AmbushPoint]].
; byte AssessBotAttitude ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : This function determines the attitude of ''aBot'' towards ''Other''.  The value returned by this function is used in [[Legacy:Bot (UT)|Bot (UT)]].AttitudeTo() function to map to the enumeration [[Legacy:EAttitude|eAttitude]].  The function returns either a 1 (hate) or a 0 (fear) depending on the result of it's calculations.  The calculations involve the bot's skill and level of agressiveness as defined by the value of ''aBot.Aggressiveness''.
; float GameThreatAdd ([[Legacy:Bot (UT)|Bot (UT)]] aBot, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : This function is called by Bot.AssessThreat() and returns a numerical value representing the importance of &lt;tt&gt;Other&lt;/tt&gt; as a target. In DeathMatchPlus it simply returns 0, but individual gametypes override this function to gain more control over the bots' selection of targets. For example, the [[Legacy:CTFGame|CTFGame]] implementation of this function returns 10 if &lt;tt&gt;Other&lt;/tt&gt; is a flag carrier, and [[Legacy:LastManStanding|LastManStanding]]'s version returns slightly higher threat values for players who have more lives left.
; bool AllowTranslocation ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, vector Dest) : This function returns ''true''.
; bool CanTranslocate ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : This function returns true if the bot is able to perform a translocation.  In order for the bot to be able to use the translocator it must first have one, and it's [[Legacy:Translocator|Translocator]] must have a target.  Translocation must also be allowed by the game.
; ModifyBehaviour ([[Legacy:Bot (UT)|Bot (UT)]] NewBot) : Only declaration here.

==Comments ==

From what I can tell there is an awful lot of handling around the &quot;Tournament Mode&quot; feature.

==Known Subclasses ==
* [[Legacy:ChallengeDMP|ChallengeDMP]] (used for the &quot;Challenge&quot; group of ladder game?)
* [[Legacy:ChallengeIntro|ChallengeIntro]] (used for CityIntro map)
* [[Legacy:LastManStanding|LastManStanding]]
* [[Legacy:TDarkMatch|TDarkMatch]] (Tournament DarkMatch, not used)
* [[Legacy:TeamGamePlus|TeamGamePlus]]
* [[Legacy:TrainingDM|TrainingDM]]

==Related Topics ==
* [[Legacy:Mapping For DM|Mapping for DM]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeathMessagePlus</title>
    <id>28398</id>
    <revision>
      <id>40070</id>
      <timestamp>2009-11-15T08:25:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Deathbliss</title>
    <id>948</id>
    <revision>
      <id>2579</id>
      <timestamp>2002-07-06T13:51:22Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">

'''Mychaeel:'''  Welcome to the Wiki, Deathbliss.  Add yourself to the [[Legacy:Project Contributors|Project Contributors]] if you like.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Debugging Techniques</title>
    <id>995</id>
    <revision>
      <id>2682</id>
      <timestamp>2006-11-06T15:39:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>[[wiki link]]</comment>
      <text xml:space="preserve">Put all your '''Hints for Debugging''' here. 

As a programmer, I can only think on UnrealScript stuff, but you should add anything that would help someone to get extra info about the environment, actor behaviour and errors on the fly.

==UnrealScript Techniques==

===Use the Log!===

The log is generally the first thing to try when debugging. 

It lets you append text to the game's log file. The stuff it writes can be viewed while the game is running, type &quot;showlog&quot; in console to open the log window. To start the game with log window already displayed and in windowed mode start UT2004.exe with &quot; -WINDOWED -LOG&quot; parameters.

It is a native function declared in [[Legacy:Object|Object]], so it is, in effect, a global function. Its declaration is as follows:

&lt;uscript&gt;
native(231) final static function Log( coerce string S, optional name Tag );
//'S' is your message that you want to appear in the log.
&lt;/uscript&gt;

The 'Tag' parameter gives the beginning of your message a more meaningful name (useful for mod developers to differentiate their warning messages).

Log output gives you something like this:  &quot;Tag: S&quot;, where of course 'Tag' and 'S' are replaced.  If 'Tag' is not supplied, &quot;ScriptLog&quot; is used.

Log is saved by default to &quot;/GameName/System/GameName.log&quot; file, ie &quot;UT2004/System/UT2004.log&quot;. Attempting to view the log file with external application while the game is still running is not recommended, as sometimes information is not actually saved into the log at the moment that it happens &amp;ndash; the order and variables are still preserved, but I believe that the Unreal Engine maintains an internal log in memory and only writes it to disk periodically.

The warn function is essentially the same as log, but there is no &quot;tag&quot; argument. The &quot;tag&quot; of the warn function is always &quot;Warning.&quot;

&lt;uscript&gt;
native(232) final static function Warn( coerce string S );
//'S' is your message that you want to appear in the log.
&lt;/uscript&gt;

The warn function's output is similar to UT's and UT2003's [[Legacy:Log Warnings|log warnings]].

You can also use the &quot;say&quot; functionality to make your actor &quot;talk&quot; within the level and read the output. This allows for a realtime &quot;log&quot; that you can view in-game, though things written using this will not actually be written to the log file:

&lt;uscript&gt;
Level.Game.Broadcast(self, &quot;blah blah blah&quot;, 'Say');
&lt;/uscript&gt;

'''OverloadUT:''' Unfortunately, this method has limited reliability, because the messages broadcasted will be spam filtered just like normal chat.  Meaning that if you send too many messages too fast, some of them simply won't be displayed.  The limit is quite low too... So be sure you're only sending one message at a time, and only at key times. I like to instead use the '''''ClientMessage()''''' function inside '''''PlayerController''''' - but unfortunately it's a more annoying because you need a specific PlayerController to send it to.

'''Kirk:''' Also note that if you suddenly see messages coming up you didn't instigate... it's probably form the bots doing the same thing as you.

===Using DisplayDebug (UT2003)===

The DisplayDebug function in class [[Legacy:Actor|Actor]] shows a lot of info about the player/zone/weapon. It is shown when you use the &lt;tt&gt;ShowDebug&lt;/tt&gt; console command and it can be used to draw pertinent information on the HUD in realtime. If you want to make it compatible with other DisplayDebug functions from other actors, you must insert a carriage return at the end of whatever you are writing, to prevent other actors from appending text directly to whatever you have written.

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  local string T;

  super.DisplayDebug(Canvas, YL, YPos);

  T = &quot;DOT: &quot;$vect(0,0,1) Dot Normal(vector(rotation));
  Canvas.DrawText(T,false);
  YPos += YL;
  Canvas.SetPos(4,YPos);
}
&lt;/uscript&gt;

You can also use DisplayDebug to draw anything you normally could to the Canvas. Here is an example of drawing the position of a vector onto the screen visually. The example draws a cross at the on-screen location where the vector would be percieved to be - note that this assumes that the vector is a &quot;location&quot; vector, as it will be drawn relative to the world origin:

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  Super.DisplayDebug(Canvas, YL, YPos);

  Canvas.SetDrawColor(255,255,255);
  Canvas.SetPos(Canvas.WorldToScreen(YOURVECTORHERE).X,Canvas.WorldToScreen(YOURVECTORHERE).Y);
  DrawCross(Canvas);
  Canvas.DrawText(&quot;A SHORT DESCRIPTION WHICH WILL GET DRAWN NEXT TO THE CROSS GOES HERE&quot;,false);
  Canvas.SetPos(4,YPos);
}

function DrawCross(canvas c)
{
  c.DrawLine(0, 18);
  c.DrawLine(1, 18);
  c.DrawLine(2, 18);
  c.DrawLine(3, 18);
}
&lt;/uscript&gt;

===Using the Graph (UT2003)===

The graph is a debugging method only availible from KVehicle and its subclasses. It is defined in KVehicle. It can be displayed with the &lt;code&gt;Graph Show&lt;/code&gt; console command. To plot a value on the graph, call the GraphData function, as follows:

&lt;uscript&gt;
GraphData(&quot;description&quot;, var);
&lt;/uscript&gt;

Where ''var'' (float or int) is your variable and ''description'' is any string. The graph automatically adjusts the vertical scale to fit all of the values that have been fed into it. The graph will update whenever a new point is plotted, regardless of what actor plots it. The graph is color coded, and points are joined together based on their ''descriptions''. There is a legend with the graph that will indicate which color is associated with which ''description'' and the maximum value that has been plotted for that ''description.''

===The Debug Line (UT2003)===

&lt;uscript&gt;
  DrawDebugLine( Location1, Location2, R, G, B);
&lt;/uscript&gt;

This is a great way of showing vectors. It draws a line between the two vectors specified in Location1 and Location2. Technically one is the start and the other is the end, but it doesn't make any visual difference. R, G, and B, are the elements of the color of the line, red, green and blue, respectively. They must each be between 0 and 255. This is superior to just drawing something on the canvas, as it will go &quot;through&quot; objects instead of being drawn on top of them. This makes it much easier to see the actual vector that is being expressed. It is, however, relatively slow. It is not slow in the sense that it will drag down your framerate while you debug, but it is too slow to be reasonably used for in-game effects like a laser. This function can be called at any time and will be &quot;stored up&quot; by the engine until the next frame is drawn. You can draw as many debug lines as you like and they will all be &quot;saved up&quot; in this manner. This can be very useful for, for instance, making a line drawing of the path a bot intends to follow, etcetera.

====Staying Debug Line====

Another debug line command similar to the one above creates a permanent line, which can be used for easily creating non-dynamic lines in 3D space. This can be handy for displaying the path that a wandering or searching character has taken over time. -ymalaika

&lt;uscript&gt;
  DrawStayingDebugLine( Location1, Location2, R, G, B);
  ClearStayingDebugLines()
&lt;/uscript&gt;

===Using TextToSpeech (UT2004/UT2003?)===

&lt;uscript&gt;
native function TextToSpeech( string Text, float Volume );
//Text: Text you want to be turned into speech
&lt;/uscript&gt;

This function is declared in Actor so any actor can use it.  An example of how to use it would be to find out if a function was fired or not.  It's very useful for those who don't want to go into the log all the time and would like voice confirmation.

'''Seabreeze:''' what does the 'Volume' variable represent?

'''Wormbo:''' The same thing it represents in any audio function &amp;ndash; how loud you want the output to be.

'''Seabreeze:''' ahhh.. newbie here! for some reason I was only thinking of volume of objects and not volume of sound, thanks!

===Slowing things down===

If you need time to set a particular situation up, use one of these [[Legacy:Console Command|console command]]s:

* playersonly : freezes all movement except you
* slomo #, or set engine.gameinfo gamespeed &lt;value here&gt;

==Network Debugging==

===Testing in a Client/Server Environment===

It is crucial that you test your code under client/server conditions. Just running a &quot;listen server&quot; (a network server started from within the game) won't help there; for concerns like [[Legacy:Replication|replication]] the listen server behaves just like a standalone game as far as the local player is concerned. 

You don't need a LAN or an Internet connection to test your code under networking conditions though: you can [[Legacy:Launch A Local Netgame|Launch A Local Netgame]].

===ServerPackages===

None of your client-side actors will show up or execute client-side code '''unless your package is loaded client-side'''; unless that happens to happen anyway (because you're coding a game type, for example), you'll have to add your code package to the server .ini file's &lt;code&gt;ServerPackages&lt;/code&gt; list.

Open the server's .ini file (usually server.ini or, on a local dedicated server, frequently just the [[Legacy:Game Ini File|game ini file]]), look for the &lt;code&gt;[Engine.GameEngine]&lt;/code&gt; section and add a line for your package:

  ServerPackages=MyPackage

===Simulating Lag and Packet Loss===

You can tell the engine to simulate network lag, packet loss, packets out of order and packet duplicating when testing on a local server as described above.

Add one or several of the following parameters to the server's command line:

; pktlag=&lt;i&gt;&lt;milliseconds&gt;&lt;/i&gt; : Simulates lag.

; pktloss=&lt;i&gt;&lt;percentage&gt;&lt;/i&gt; : Simulates packet loss.  The given percentage specifies how many packets are lost; it can be between 0 (no packet loss) and 100 (all packets will be lost).

; pktdup=&lt;i&gt;&lt;percentage&gt;&lt;/i&gt; : Simulates packet duplication.  The given percentage specifies how many packets are duplicated; it can be between 0 (no packet duplication) and 100 (all packets duplicated).

; pktorder=&lt;i&gt;&lt;0 or 1&gt;&lt;/i&gt; : Simulates packets that are received out of order.

A server for a test game with 150 milliseconds lag, 10 percent packet loss and packets out of order would look like this:

  ucc server DM-Gael pktlag=150 pktloss=10 pktorder=1

==Console Commands==

See [[Legacy:Console Commands/Debugging Console Commands|Console Commands/Debugging Console Commands]]

==A Note about Debugging==

It's important to remember that not only can software develop bugs, but your debugging tools themselves can have bugs too. Log and other native debugging commands seem quite stable, but things in DisplayDebug and similar functions are prone to error like any other program.  If your debugging tools show that your code is acting in an absolutely bizarre fashion, check your debugging code to see if it is in fact the debugger that is faulty.

==Optimizing==

If your mod runs slowly or causes hitches on some computers, see [[Legacy:Code Optimization|Code Optimization]].

==Related Topics==
* [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:A Bug'S Life|A Bug's Life]]
* [[Legacy:Spectate Bots|Spectate Bots]]
* [[Legacy:Testing Botplay|Testing Botplay]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]
* [[Legacy:Testing Lab|Testing Lab]]

==Discussion==

'''Ch3z''' I actually run a copy of the 436 server only disto from a seperate folder and connect to it with my reg UT installation. That way I know I'm actually connecting via the internet, and with all the hops to get back to my own machine I get plenty of non-simulated lag. I just feel like its a better test. I also make sure none of the files i need to join the server are in my UT dir and it makes me download them all from the server before connecting. Seems more like a valid test to me. I'm wondering if this would be a good idea or not. Not sure if this is where the page should be created from or not but... check out the [[Legacy:Testing Lab|Testing Lab]].

Shouldn't this page, Debugging Techniques be Category Tutorial?

'''Tarquin:''' Not really.

'''Vitaloverdose''' is none of this relevant to 2004? 

'''Wormbo:''' There's a section about ''additional'' techniques in UT2004, and of course they apply to UT2004 as well.

'''OlympusMons:''' Found the clear debug staying lines thing on the udn just thought I would add it here, not sure if its in the right spot.

'''Shambler:''' A class I made to spew debug logs onto the HUD instead of into the log file: [[Legacy:Log Interaction|Log Interaction]]</text>
    </revision>
    <revision>
      <id>2683</id>
      <timestamp>2006-06-28T16:52:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Put all your '''Hints for Debugging''' here. 

As a programmer, I can only think on UnrealScript stuff, but you should add anything that would help someone to get extra info about the environment, actor behaviour and errors on the fly.

==UnrealScript Techniques==

===Use the Log!===

The log is generally the first thing to try when debugging. 

It lets you append text to the game's log file. The stuff it writes can be viewed while the game is running, type &quot;showlog&quot; in console to open the log window. To start the game with log window already displayed and in windowed mode start UT2004.exe with &quot; -WINDOWED -LOG&quot; parameters.

It is a native function declared in [[Legacy:Object|Object]], so it is, in effect, a global function. Its declaration is as follows:

&lt;uscript&gt;
native(231) final static function Log( coerce string S, optional name Tag );
//'S' is your message that you want to appear in the log.
&lt;/uscript&gt;

The 'Tag' parameter gives the beginning of your message a more meaningful name (useful for mod developers to differentiate their warning messages).

Log output gives you something like this:  &quot;Tag: S&quot;, where of course 'Tag' and 'S' are replaced.  If 'Tag' is not supplied, &quot;ScriptLog&quot; is used.

Log is saved by default to &quot;/GameName/System/GameName.log&quot; file, ie &quot;UT2004/System/UT2004.log&quot;. Attempting to view the log file with external application while the game is still running is not recommended, as sometimes information is not actually saved into the log at the moment that it happens &amp;ndash; the order and variables are still preserved, but I believe that the Unreal Engine maintains an internal log in memory and only writes it to disk periodically.

The warn function is essentially the same as log, but there is no &quot;tag&quot; argument. The &quot;tag&quot; of the warn function is always &quot;Warning.&quot;

&lt;uscript&gt;
native(232) final static function Warn( coerce string S );
//'S' is your message that you want to appear in the log.
&lt;/uscript&gt;

The warn function's output is similar to UT's and UT2003's [[Legacy:Log Warnings|log warnings]].

You can also use the &quot;say&quot; functionality to make your actor &quot;talk&quot; within the level and read the output. This allows for a realtime &quot;log&quot; that you can view in-game, though things written using this will not actually be written to the log file:

&lt;uscript&gt;
Level.Game.Broadcast(self, &quot;blah blah blah&quot;, 'Say');
&lt;/uscript&gt;

'''OverloadUT:''' Unfortunately, this method has limited reliability, because the messages broadcasted will be spam filtered just like normal chat.  Meaning that if you send too many messages too fast, some of them simply won't be displayed.  The limit is quite low too... So be sure you're only sending one message at a time, and only at key times. I like to instead use the '''''ClientMessage()''''' function inside '''''PlayerController''''' - but unfortunately it's a more annoying because you need a specific PlayerController to send it to.

'''Kirk:''' Also note that if you suddenly see messages coming up you didn't instigate... it's probably form the bots doing the same thing as you.

===Using DisplayDebug (UT2003)===

The DisplayDebug function in class [[Legacy:Actor|Actor]] shows a lot of info about the player/zone/weapon. It is shown when you use the &lt;tt&gt;ShowDebug&lt;/tt&gt; console command and it can be used to draw pertinent information on the HUD in realtime. If you want to make it compatible with other DisplayDebug functions from other actors, you must insert a carriage return at the end of whatever you are writing, to prevent other actors from appending text directly to whatever you have written.

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  local string T;

  super.DisplayDebug(Canvas, YL, YPos);

  T = &quot;DOT: &quot;$vect(0,0,1) Dot Normal(vector(rotation));
  Canvas.DrawText(T,false);
  YPos += YL;
  Canvas.SetPos(4,YPos);
}
&lt;/uscript&gt;

You can also use DisplayDebug to draw anything you normally could to the Canvas. Here is an example of drawing the position of a vector onto the screen visually. The example draws a cross at the on-screen location where the vector would be percieved to be - note that this assumes that the vector is a &quot;location&quot; vector, as it will be drawn relative to the world origin:

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  Super.DisplayDebug(Canvas, YL, YPos);

  Canvas.SetDrawColor(255,255,255);
  Canvas.SetPos(Canvas.WorldToScreen(YOURVECTORHERE).X,Canvas.WorldToScreen(YOURVECTORHERE).Y);
  DrawCross(Canvas);
  Canvas.DrawText(&quot;A SHORT DESCRIPTION WHICH WILL GET DRAWN NEXT TO THE CROSS GOES HERE&quot;,false);
  Canvas.SetPos(4,YPos);
}

function DrawCross(canvas c)
{
  c.DrawLine(0, 18);
  c.DrawLine(1, 18);
  c.DrawLine(2, 18);
  c.DrawLine(3, 18);
}
&lt;/uscript&gt;

===Using the Graph (UT2003)===

The graph is a debugging method only availible from KVehicle and its subclasses. It is defined in KVehicle. It can be displayed with the &lt;code&gt;Graph Show&lt;/code&gt; console command. To plot a value on the graph, call the GraphData function, as follows:

&lt;uscript&gt;
GraphData(&quot;description&quot;, var);
&lt;/uscript&gt;

Where ''var'' (float or int) is your variable and ''description'' is any string. The graph automatically adjusts the vertical scale to fit all of the values that have been fed into it. The graph will update whenever a new point is plotted, regardless of what actor plots it. The graph is color coded, and points are joined together based on their ''descriptions''. There is a legend with the graph that will indicate which color is associated with which ''description'' and the maximum value that has been plotted for that ''description.''

===The Debug Line (UT2003)===

&lt;uscript&gt;
  DrawDebugLine( Location1, Location2, R, G, B);
&lt;/uscript&gt;

This is a great way of showing vectors. It draws a line between the two vectors specified in Location1 and Location2. Technically one is the start and the other is the end, but it doesn't make any visual difference. R, G, and B, are the elements of the color of the line, red, green and blue, respectively. They must each be between 0 and 255. This is superior to just drawing something on the canvas, as it will go &quot;through&quot; objects instead of being drawn on top of them. This makes it much easier to see the actual vector that is being expressed. It is, however, relatively slow. It is not slow in the sense that it will drag down your framerate while you debug, but it is too slow to be reasonably used for in-game effects like a laser. This function can be called at any time and will be &quot;stored up&quot; by the engine until the next frame is drawn. You can draw as many debug lines as you like and they will all be &quot;saved up&quot; in this manner. This can be very useful for, for instance, making a line drawing of the path a bot intends to follow, etcetera.

====Staying Debug Line====

Another debug line command similar to the one above creates a permanent line, which can be used for easily creating non-dynamic lines in 3D space. This can be handy for displaying the path that a wandering or searching character has taken over time. -ymalaika

&lt;uscript&gt;
  DrawStayingDebugLine( Location1, Location2, R, G, B);
  ClearStayingDebugLines()
&lt;/uscript&gt;

===Using TextToSpeech (UT2004/UT2003?)===

&lt;uscript&gt;
native function TextToSpeech( string Text, float Volume );
//Text: Text you want to be turned into speech
&lt;/uscript&gt;

This function is declared in Actor so any actor can use it.  An example of how to use it would be to find out if a function was fired or not.  It's very useful for those who don't want to go into the log all the time and would like voice confirmation.

'''Seabreeze:''' what does the 'Volume' variable represent?

'''Wormbo:''' The same thing it represents in any audio function &amp;ndash; how loud you want the output to be.

===Slowing things down===

If you need time to set a particular situation up, use one of these [[Legacy:Console Command|console command]]s:

* playersonly : freezes all movement except you
* slomo #, or set engine.gameinfo gamespeed &lt;value here&gt;

==Network Debugging==

===Testing in a Client/Server Environment===

It is crucial that you test your code under client/server conditions. Just running a &quot;listen server&quot; (a network server started from within the game) won't help there; for concerns like [[Legacy:Replication|replication]] the listen server behaves just like a standalone game as far as the local player is concerned. 

You don't need a LAN or an Internet connection to test your code under networking conditions though: you can [[Legacy:Launch A Local Netgame|Launch A Local Netgame]].

===ServerPackages===

None of your client-side actors will show up or execute client-side code '''unless your package is loaded client-side'''; unless that happens to happen anyway (because you're coding a game type, for example), you'll have to add your code package to the server .ini file's &lt;code&gt;ServerPackages&lt;/code&gt; list.

Open the server's .ini file (usually server.ini or, on a local dedicated server, frequently just the [[Legacy:Game Ini File|game ini file]]), look for the &lt;code&gt;[Engine.GameEngine]&lt;/code&gt; section and add a line for your package:

  ServerPackages=MyPackage

===Simulating Lag and Packet Loss===

You can tell the engine to simulate network lag, packet loss, packets out of order and packet duplicating when testing on a local server as described above.

Add one or several of the following parameters to the server's command line:

; pktlag=&lt;i&gt;&lt;milliseconds&gt;&lt;/i&gt; : Simulates lag.

; pktloss=&lt;i&gt;&lt;percentage&gt;&lt;/i&gt; : Simulates packet loss.  The given percentage specifies how many packets are lost; it can be between 0 (no packet loss) and 100 (all packets will be lost).

; pktdup=&lt;i&gt;&lt;percentage&gt;&lt;/i&gt; : Simulates packet duplication.  The given percentage specifies how many packets are duplicated; it can be between 0 (no packet duplication) and 100 (all packets duplicated).

; pktorder=&lt;i&gt;&lt;0 or 1&gt;&lt;/i&gt; : Simulates packets that are received out of order.

A server for a test game with 150 milliseconds lag, 10 percent packet loss and packets out of order would look like this:

  ucc server DM-Gael pktlag=150 pktloss=10 pktorder=1

==Console Commands==

See [[Legacy:Console Commands/Debugging Console Commands|Console Commands/Debugging Console Commands]]

==A Note about Debugging==

It's important to remember that not only can software develop bugs, but your debugging tools themselves can have bugs too. Log and other native debugging commands seem quite stable, but things in DisplayDebug and similar functions are prone to error like any other program.  If your debugging tools show that your code is acting in an absolutely bizarre fashion, check your debugging code to see if it is in fact the debugger that is faulty.

==Optimizing==

If your mod runs slowly or causes hitches on some computers, see [[Legacy:Code Optimization|Code Optimization]].

==Related Topics==
* [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:A Bug'S Life|A Bug's Life]]
* [[Legacy:Spectate Bots|Spectate Bots]]
* [[Legacy:Testing Botplay|Testing Botplay]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]
* [[Legacy:Testing Lab|Testing Lab]]

==Discussion==

'''Ch3z''' I actually run a copy of the 436 server only disto from a seperate folder and connect to it with my reg UT installation. That way I know I'm actually connecting via the internet, and with all the hops to get back to my own machine I get plenty of non-simulated lag. I just feel like its a better test. I also make sure none of the files i need to join the server are in my UT dir and it makes me download them all from the server before connecting. Seems more like a valid test to me. I'm wondering if this would be a good idea or not. Not sure if this is where the page should be created from or not but... check out the [[Legacy:Testing Lab|Testing Lab]].

Shouldn't this page, Debugging Techniques be Category Tutorial?

'''Tarquin:''' Not really.

'''Vitaloverdose''' is none of this relevant to 2004? 

'''Wormbo:''' There's a section about ''additional'' techniques in UT2004, and of course they apply to UT2004 as well.

'''OlympusMons:''' Found the clear debug staying lines thing on the udn just thought I would add it here, not sure if its in the right spot.</text>
    </revision>
    <revision>
      <id>2684</id>
      <timestamp>2006-11-06T15:27:04Z</timestamp>
      <contributor>
        <ip>Shambler</ip>
      </contributor>
      <minor/>
      <comment>*Added link to my debug class page</comment>
      <text xml:space="preserve">Put all your '''Hints for Debugging''' here. 

As a programmer, I can only think on UnrealScript stuff, but you should add anything that would help someone to get extra info about the environment, actor behaviour and errors on the fly.

==UnrealScript Techniques==

===Use the Log!===

The log is generally the first thing to try when debugging. 

It lets you append text to the game's log file. The stuff it writes can be viewed while the game is running, type &quot;showlog&quot; in console to open the log window. To start the game with log window already displayed and in windowed mode start UT2004.exe with &quot; -WINDOWED -LOG&quot; parameters.

It is a native function declared in [[Legacy:Object|Object]], so it is, in effect, a global function. Its declaration is as follows:

&lt;uscript&gt;
native(231) final static function Log( coerce string S, optional name Tag );
//'S' is your message that you want to appear in the log.
&lt;/uscript&gt;

The 'Tag' parameter gives the beginning of your message a more meaningful name (useful for mod developers to differentiate their warning messages).

Log output gives you something like this:  &quot;Tag: S&quot;, where of course 'Tag' and 'S' are replaced.  If 'Tag' is not supplied, &quot;ScriptLog&quot; is used.

Log is saved by default to &quot;/GameName/System/GameName.log&quot; file, ie &quot;UT2004/System/UT2004.log&quot;. Attempting to view the log file with external application while the game is still running is not recommended, as sometimes information is not actually saved into the log at the moment that it happens &amp;ndash; the order and variables are still preserved, but I believe that the Unreal Engine maintains an internal log in memory and only writes it to disk periodically.

The warn function is essentially the same as log, but there is no &quot;tag&quot; argument. The &quot;tag&quot; of the warn function is always &quot;Warning.&quot;

&lt;uscript&gt;
native(232) final static function Warn( coerce string S );
//'S' is your message that you want to appear in the log.
&lt;/uscript&gt;

The warn function's output is similar to UT's and UT2003's [[Legacy:Log Warnings|log warnings]].

You can also use the &quot;say&quot; functionality to make your actor &quot;talk&quot; within the level and read the output. This allows for a realtime &quot;log&quot; that you can view in-game, though things written using this will not actually be written to the log file:

&lt;uscript&gt;
Level.Game.Broadcast(self, &quot;blah blah blah&quot;, 'Say');
&lt;/uscript&gt;

'''OverloadUT:''' Unfortunately, this method has limited reliability, because the messages broadcasted will be spam filtered just like normal chat.  Meaning that if you send too many messages too fast, some of them simply won't be displayed.  The limit is quite low too... So be sure you're only sending one message at a time, and only at key times. I like to instead use the '''''ClientMessage()''''' function inside '''''PlayerController''''' - but unfortunately it's a more annoying because you need a specific PlayerController to send it to.

'''Kirk:''' Also note that if you suddenly see messages coming up you didn't instigate... it's probably form the bots doing the same thing as you.

===Using DisplayDebug (UT2003)===

The DisplayDebug function in class [[Legacy:Actor|Actor]] shows a lot of info about the player/zone/weapon. It is shown when you use the &lt;tt&gt;ShowDebug&lt;/tt&gt; console command and it can be used to draw pertinent information on the HUD in realtime. If you want to make it compatible with other DisplayDebug functions from other actors, you must insert a carriage return at the end of whatever you are writing, to prevent other actors from appending text directly to whatever you have written.

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  local string T;

  super.DisplayDebug(Canvas, YL, YPos);

  T = &quot;DOT: &quot;$vect(0,0,1) Dot Normal(vector(rotation));
  Canvas.DrawText(T,false);
  YPos += YL;
  Canvas.SetPos(4,YPos);
}
&lt;/uscript&gt;

You can also use DisplayDebug to draw anything you normally could to the Canvas. Here is an example of drawing the position of a vector onto the screen visually. The example draws a cross at the on-screen location where the vector would be percieved to be - note that this assumes that the vector is a &quot;location&quot; vector, as it will be drawn relative to the world origin:

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  Super.DisplayDebug(Canvas, YL, YPos);

  Canvas.SetDrawColor(255,255,255);
  Canvas.SetPos(Canvas.WorldToScreen(YOURVECTORHERE).X,Canvas.WorldToScreen(YOURVECTORHERE).Y);
  DrawCross(Canvas);
  Canvas.DrawText(&quot;A SHORT DESCRIPTION WHICH WILL GET DRAWN NEXT TO THE CROSS GOES HERE&quot;,false);
  Canvas.SetPos(4,YPos);
}

function DrawCross(canvas c)
{
  c.DrawLine(0, 18);
  c.DrawLine(1, 18);
  c.DrawLine(2, 18);
  c.DrawLine(3, 18);
}
&lt;/uscript&gt;

===Using the Graph (UT2003)===

The graph is a debugging method only availible from KVehicle and its subclasses. It is defined in KVehicle. It can be displayed with the &lt;code&gt;Graph Show&lt;/code&gt; console command. To plot a value on the graph, call the GraphData function, as follows:

&lt;uscript&gt;
GraphData(&quot;description&quot;, var);
&lt;/uscript&gt;

Where ''var'' (float or int) is your variable and ''description'' is any string. The graph automatically adjusts the vertical scale to fit all of the values that have been fed into it. The graph will update whenever a new point is plotted, regardless of what actor plots it. The graph is color coded, and points are joined together based on their ''descriptions''. There is a legend with the graph that will indicate which color is associated with which ''description'' and the maximum value that has been plotted for that ''description.''

===The Debug Line (UT2003)===

&lt;uscript&gt;
  DrawDebugLine( Location1, Location2, R, G, B);
&lt;/uscript&gt;

This is a great way of showing vectors. It draws a line between the two vectors specified in Location1 and Location2. Technically one is the start and the other is the end, but it doesn't make any visual difference. R, G, and B, are the elements of the color of the line, red, green and blue, respectively. They must each be between 0 and 255. This is superior to just drawing something on the canvas, as it will go &quot;through&quot; objects instead of being drawn on top of them. This makes it much easier to see the actual vector that is being expressed. It is, however, relatively slow. It is not slow in the sense that it will drag down your framerate while you debug, but it is too slow to be reasonably used for in-game effects like a laser. This function can be called at any time and will be &quot;stored up&quot; by the engine until the next frame is drawn. You can draw as many debug lines as you like and they will all be &quot;saved up&quot; in this manner. This can be very useful for, for instance, making a line drawing of the path a bot intends to follow, etcetera.

====Staying Debug Line====

Another debug line command similar to the one above creates a permanent line, which can be used for easily creating non-dynamic lines in 3D space. This can be handy for displaying the path that a wandering or searching character has taken over time. -ymalaika

&lt;uscript&gt;
  DrawStayingDebugLine( Location1, Location2, R, G, B);
  ClearStayingDebugLines()
&lt;/uscript&gt;

===Using TextToSpeech (UT2004/UT2003?)===

&lt;uscript&gt;
native function TextToSpeech( string Text, float Volume );
//Text: Text you want to be turned into speech
&lt;/uscript&gt;

This function is declared in Actor so any actor can use it.  An example of how to use it would be to find out if a function was fired or not.  It's very useful for those who don't want to go into the log all the time and would like voice confirmation.

'''Seabreeze:''' what does the 'Volume' variable represent?

'''Wormbo:''' The same thing it represents in any audio function &amp;ndash; how loud you want the output to be.

'''Seabreeze:''' ahhh.. newbie here! for some reason I was only thinking of volume of objects and not volume of sound, thanks!

===Slowing things down===

If you need time to set a particular situation up, use one of these [[Legacy:Console Command|console command]]s:

* playersonly : freezes all movement except you
* slomo #, or set engine.gameinfo gamespeed &lt;value here&gt;

==Network Debugging==

===Testing in a Client/Server Environment===

It is crucial that you test your code under client/server conditions. Just running a &quot;listen server&quot; (a network server started from within the game) won't help there; for concerns like [[Legacy:Replication|replication]] the listen server behaves just like a standalone game as far as the local player is concerned. 

You don't need a LAN or an Internet connection to test your code under networking conditions though: you can [[Legacy:Launch A Local Netgame|Launch A Local Netgame]].

===ServerPackages===

None of your client-side actors will show up or execute client-side code '''unless your package is loaded client-side'''; unless that happens to happen anyway (because you're coding a game type, for example), you'll have to add your code package to the server .ini file's &lt;code&gt;ServerPackages&lt;/code&gt; list.

Open the server's .ini file (usually server.ini or, on a local dedicated server, frequently just the [[Legacy:Game Ini File|game ini file]]), look for the &lt;code&gt;[Engine.GameEngine]&lt;/code&gt; section and add a line for your package:

  ServerPackages=MyPackage

===Simulating Lag and Packet Loss===

You can tell the engine to simulate network lag, packet loss, packets out of order and packet duplicating when testing on a local server as described above.

Add one or several of the following parameters to the server's command line:

; pktlag=&lt;i&gt;&lt;milliseconds&gt;&lt;/i&gt; : Simulates lag.

; pktloss=&lt;i&gt;&lt;percentage&gt;&lt;/i&gt; : Simulates packet loss.  The given percentage specifies how many packets are lost; it can be between 0 (no packet loss) and 100 (all packets will be lost).

; pktdup=&lt;i&gt;&lt;percentage&gt;&lt;/i&gt; : Simulates packet duplication.  The given percentage specifies how many packets are duplicated; it can be between 0 (no packet duplication) and 100 (all packets duplicated).

; pktorder=&lt;i&gt;&lt;0 or 1&gt;&lt;/i&gt; : Simulates packets that are received out of order.

A server for a test game with 150 milliseconds lag, 10 percent packet loss and packets out of order would look like this:

  ucc server DM-Gael pktlag=150 pktloss=10 pktorder=1

==Console Commands==

See [[Legacy:Console Commands/Debugging Console Commands|Console Commands/Debugging Console Commands]]

==A Note about Debugging==

It's important to remember that not only can software develop bugs, but your debugging tools themselves can have bugs too. Log and other native debugging commands seem quite stable, but things in DisplayDebug and similar functions are prone to error like any other program.  If your debugging tools show that your code is acting in an absolutely bizarre fashion, check your debugging code to see if it is in fact the debugger that is faulty.

==Optimizing==

If your mod runs slowly or causes hitches on some computers, see [[Legacy:Code Optimization|Code Optimization]].

==Related Topics==
* [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:A Bug'S Life|A Bug's Life]]
* [[Legacy:Spectate Bots|Spectate Bots]]
* [[Legacy:Testing Botplay|Testing Botplay]]
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]
* [[Legacy:Testing Lab|Testing Lab]]

==Discussion==

'''Ch3z''' I actually run a copy of the 436 server only disto from a seperate folder and connect to it with my reg UT installation. That way I know I'm actually connecting via the internet, and with all the hops to get back to my own machine I get plenty of non-simulated lag. I just feel like its a better test. I also make sure none of the files i need to join the server are in my UT dir and it makes me download them all from the server before connecting. Seems more like a valid test to me. I'm wondering if this would be a good idea or not. Not sure if this is where the page should be created from or not but... check out the [[Legacy:Testing Lab|Testing Lab]].

Shouldn't this page, Debugging Techniques be Category Tutorial?

'''Tarquin:''' Not really.

'''Vitaloverdose''' is none of this relevant to 2004? 

'''Wormbo:''' There's a section about ''additional'' techniques in UT2004, and of course they apply to UT2004 as well.

'''OlympusMons:''' Found the clear debug staying lines thing on the udn just thought I would add it here, not sure if its in the right spot.

'''Shambler:''' A class I made to spew debug logs onto the HUD instead of into the log file: http://wiki.beyondunreal.com/wiki/Log_Interaction</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decal</title>
    <id>935</id>
    <revision>
      <id>2548</id>
      <timestamp>2005-01-11T15:31:02Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Decal (Package: Engine)}}

A '''Decal''' is a client-side actor that attaches flat against level geometry to create effects like bulletholes or blood stains.  Decals won't work in fog zones.

This class is deprecated in UT200x.

==Properties==
; int MultiDecalLevel : How many surfaces this decal is allowed to be attached to. Set this higher for larger decals.
; float LastRenderedTime : 
; array&lt;int&gt; SurfList (const) : List of surfaces this decal is attached to.  Native.

==Methods==
; [[Legacy:Texture (UT)|Texture (UT)]] AttachDecal(float TraceDistance, optional vector DecalDir) [simulated native] : Traces forward (or in direction of DecalDir) and attaches the decal to surfaces. Returns the texture of the surface it attached the decal to or None if no or only fake backdrop surfaces are in range.
; DetachDecal() [simulated native] : Detach this decal from all surfaces.
; AttachToSurface() [simulated] : Tries to attach the decal by calling AttachDecal with a TraceDistance of 100 units. If the decal could not be attached, then the decal is destroyed.
; Update([[Legacy:Actor (UT)|Actor (UT)]] L) [event] : 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2549</id>
      <timestamp>2005-01-11T15:09:50Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-scar.boom.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-rosacea.boom.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-product.boom.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-medicine.boom.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://acne-treatment.boom.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decal (DX)</title>
    <id>1040</id>
    <revision>
      <id>2778</id>
      <timestamp>2004-02-11T05:36:09Z</timestamp>
      <contributor>
        <ip>TheRenegadeMaster</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; Decal (Engine)}}

==Properties==
; float LastRenderedTime : 
; int MultiDecalLevel : 
; array&lt;int&gt; SurfList : 

==Functions==
; bool AttachDecal( float TraceDistance , optional vector DecalDir ): Trace forward and attach this decal to surfaces.
;  DetachDecal( ): Detach this decal from all surfaces.

==Events==
;  BeginPlay( ): 
;  Destroyed( ): 
;  Update( Actor L ): 

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2779</id>
      <timestamp>2004-02-10T05:06:57Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; Decal (Engine)}}

==Properties==
; float LastRenderedTime : 
; int MultiDecalLevel : 
; array&lt;int&gt; SurfList : 

==Delegates==

==Functions==
; bool AttachDecal( float TraceDistance , optional vector DecalDir ): This returns a Texture in [[Legacy:Unreal Tournament|Unreal Tournament]]
;  DetachDecal( ): 

==Events==
;  BeginPlay( ): 
;  Destroyed( ): 
;  Update( Actor L ): 

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DecapitationMessage</title>
    <id>28883</id>
    <revision>
      <id>42813</id>
      <timestamp>2010-03-31T11:02:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DecoVolumeObject</title>
    <id>28858</id>
    <revision>
      <id>42785</id>
      <timestamp>2010-03-30T16:19:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decorating Rooms With Textures</title>
    <id>958</id>
    <revision>
      <id>2601</id>
      <timestamp>2003-08-28T20:25:58Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>sigh</comment>
      <text xml:space="preserve">This page will give you a quick idea of how to get started on making your masterpiece look like a masterpiece.  You really do not need much technical knowledge for this tutorial but it's good you know how to add, subtract and do basic geomtery.  For example tell me the area of a circle right now!  For most parts i'm going to approach this as if you were an extreme noob.  If you still don't get it than you can direct all your curses, hexes and swears at that idiot called [[Legacy:OshadO|OshadO]] or better yet make changes yourself and still curse and swear at him.

==Baby Steps - The Browser ==

''If you'd like you can skip to applying textures section which follows this section.''

[[Image:Legacy_interface.toolbar.png|center|]]

Above is the [[Legacy:UnrealEd 3|UnrealEd 3]] toolbar. Click on the 5th browser button to open up the Texture Browser.  You should end up with the right half of the picture below.

[[Image:Legacy_interface-Ed3-texturebrowser.png|center|]]

This is the [[Legacy:Texture Browser|Texture Browser]].  As the name implies it lets you browse textures.  Lets have some fun.  What you're seeing right now is the standart UT engine textures.  If you look at the picture above you'll notice that there are two field with drop down menus.  One says engine(terrain in the pci above)  The other with the ''ALL'' button next to it might be blank.  If you click on the drop down arrow that says engine(terrain in pic above) you'll see a list of other names.  Click on any one and you'll see a new set of textures.  These are all different texture sets used by the engine so they open up by default.  Sadly none of these is really a set that you might want to use in your map unless you're going for a neo enginistic retro zam tastic look.  SO let's open a new set of textures.  

Do [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Open and the browser should automatically go to UT\Textures directory.  There should be a ton of files in here.  Say your maps is a castle themed map.  So navigate to NaliCast.utx and open.  You should see a whole bunch of new textures now.  Plus the texture pack name should reflect NaliCast now.  

If you haven't already noticed you'll also see a word in the field next to ''ALL'', most likely it will say arch.  Click the drop down arrow here and you'll see other entries like base, walls, floors, ceilings etc.  These are subdivisions within the pack to allow you to navigate the textures more easily.  You can view all of them if you like by clicking on the ''ALL'' button.  

Other things you can try are to change the viewing size of the textures displayed.  If you go to

View -&gt; SetSize or 

View -&gt; Variable

View -&gt; Docked will dock or undock it from the browser.

Do keep in mind that changing the display size does not affect your textures in the game world.  That is an issue I will deal with in the following section.

There is one last thing I would like to point out with the texture browser.  Click on a texture and it is selected.  You can apply it to the ame world now.  However if you look along the top of the browser window it will give you the texture name and size in actual UEd Units.  Eg 128x256 WxH.

===Applying Textures ===

This is really really easy.  It's so easy that if you cannot do it there is something very very wrong with you or the way I wrote this.  

Simply selcet the texture in the browser and add or subtract a brush.  Tada that texture should be on all visible faces of the brush.  

Now I realise that more often than not we might want each face to have differnt textures.  So select th surface in Perspective View, it should highlight, and click on the texture in the browser. It should change.  Alternatively you could select and right click on the surface and Apply Texture as well.

==Messing Around with Textures ==

You can do a lot with textures.  You can rotate, mirror, pan and give them properties.  I'm going to link to already written articles you can read for more info over at the [[Legacy:Texture Topics|Texture Topics]] page.  There are also more advanced topics covered on that page.  See [[Legacy:Selecting Surfaces|Selecting Surfaces]] for useful keyboard shortcuts when working with textures.

[[Image:Legacy_button.mode.texpan.gif|center|]]

[[Image:Legacy_button.mode.texrot.gif|center|]]

The above two buttons in your main toolbar allow you to pan and rotate respectively.  To find out more about alignment [[Legacy:Surface Alignment|Surface Alignment]] page is your best shot.

In order to give textures properties such as reflections, shadows, etc try the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] page.

Sometimes you're done texturing and you come across a texture that may be better suited to your theme than the one that you have already applied to your map.  In such a case try the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]]

==Comments==

'''Legal:''' Is there ''really'' a texture package named Terrain? I haven't found it, so either you've snitched that pic of udn, or I want a road map ;)

'''EntropicLqd:''' Needs massive refectoring now that [[Legacy:Apply The Texture|Apply The Texture]] has been written.</text>
    </revision>
    <revision>
      <id>2602</id>
      <timestamp>2003-08-28T13:19:55Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page will give you a quick idea of how to get started on making your masterpiece look like a masterpiece.  You really do not need much technical knowledge for this tutorial but it's good you know how to add, subtract and do basic geomtery.  For example tell me the area of a circle right now!  For most parts i'm going to approach this as if you were an extreme noob.  If you still don't get it than you can direct all your curses, hexes and swears at that idiot called [[Legacy:OshadO|OshadO]] or better yet make changes yourself and still curse and swear at him.

==Baby Steps - The Browser ==

''If you'd like you can skip to applying textures section which follows this section.''

[[Image:Legacy_interface.toolbar.png|center|]]

Above is the [[Legacy:UnrealEd 3|UnrealEd 3]] toolbar. Click on the 5th browser button to open up the Texture Browser.  You should end up with the right half of the picture below.

[[Image:Legacy_interface-Ed3-texturebrowser.png|center|]]

This is the [[Legacy:Texture Browser|Texture Browser]].  As the name implies it lets you browse textures.  Lets have some fun.  What you're seeing right now is the standart UT engine textures.  If you look at the picture above you'll notice that there are two field with drop down menus.  One says engine(terrain in the pci above)  The other with the ''ALL'' button next to it might be blank.  If you click on the drop down arrow that says engine(terrain in pic above) you'll see a list of other names.  Click on any one and you'll see a new set of textures.  These are all different texture sets used by the engine so they open up by default.  Sadly none of these is really a set that you might want to use in your map unless you're going for a neo enginistic retro zam tastic look.  SO let's open a new set of textures.  

Do [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Open and the browser should automatically go to UT\Textures directory.  There should be a ton of files in here.  Say your maps is a castle themed map.  So navigate to NaliCast.utx and open.  You should see a whole bunch of new textures now.  Plus the texture pack name should reflect NaliCast now.  

If you haven't already noticed you'll also see a word in the field next to ''ALL'', most likely it will say arch.  Click the drop down arrow here and you'll see other entries like base, walls, floors, ceilings etc.  These are subdivisions within the pack to allow you to navigate the textures more easily.  You can view all of them if you like by clicking on the ''ALL'' button.  

Other things you can try are to change the viewing size of the textures displayed.  If you go to

View -&gt; SetSize or 

View -&gt; Variable

View -&gt; Docked will dock or undock it from the browser.

Do keep in mind that changing the display size does not affect your textures in the game world.  That is an issue I will deal with in the following section.

There is one last thing I would like to point out with the texture browser.  Click on a texture and it is selected.  You can apply it to the ame world now.  However if you look along the top of the browser window it will give you the texture name and size in actual UEd Units.  Eg 128x256 WxH.

===Applying Textures ===

This is really really easy.  It's so easy that if you cannot do it there is something very very wrong with you or the way I wrote this.  

Simply selcet the texture in the browser and add or subtract a brush.  Tada that texture should be on all visible faces of the brush.  

Now I realise that more often than not we might want each face to have differnt textures.  So select th surface in Perspective View, it should highlight, and click on the texture in the browser. It should change.  Alternatively you could select and right click on the surface and Apply Texture as well.

==Messing Around with Textures ==

You can do a lot with textures.  You can rotate, mirror, pan and give them properties.  I'm going to link to already written articles you can read for more info over at the [[Legacy:Texture Topics|Texture Topics]] page.  There are also more advanced topics covered on that page.  See [[Legacy:Selecting Surfaces|Selecting Surfaces]] for useful keyboard shortcuts when working with textures.

[[Image:Legacy_button.mode.texpan.gif|center|]]

[[Image:Legacy_button.mode.texrot.gif|center|]]

The above two buttons in your main toolbar allow you to pan and rotate respectively.  To find out more about alignment [[Legacy:Surface Alignment|Surface Alignment]] page is your best shot.

In order to give textures properties such as reflections, shadows, etc try the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] page.

Sometimes you're done texturing and you come across a texture that may be better suited to your theme than the one that you have already applied to your map.  In such a case try the [[Legacy:Texture Replacement Tool|Texture Replacement Tool]]

==Comments==

'''Legal:''' Is there ''really'' a texture package named Terrain? I haven't found it, so either you've snitched that pic of udn, or I want a road map ;)

'''EntropicLqd:''' This page is hideous.  If I feel creative tonight when I get in I'm going to enhance the content somewhat.  I'm sure there will be overlap between this page and [[Legacy:Using Textures|Using Textures]] and some other pages I'm sure I've read about effective texturing (that I can't seem to find right now).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decoration</title>
    <id>936</id>
    <revision>
      <id>2550</id>
      <timestamp>2006-09-12T21:38:31Z</timestamp>
      <contributor>
        <ip>192.251.69.13</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Decoration (Package: Engine)}}

This is an abstract base class, and shouldn't be added to a map.

Children of this class are decoration actors &amp;ndash; meshes seen by the player in the game that have no AI and are not weapon or inventory pickups.  Many decorations are static, but a certain level of interaction can be set.

Usually [[Legacy:Static Mesh|Static Mesh]]es are used instead of Decoration actors unless the decorative object should be animated or have some special behavior.

See [[Legacy:Decoration (UT)|Decoration (UT)]] for the UT version of this class.

==Properties==

===Main===
; bool bDamageable :  Whether the Decoration can take damage.
; bool bPushable :  When activated, a player will be able to push the decoration on the floor, e.g. wooden boxes.
; class&lt;[[Legacy:Inventory|Inventory]]&gt; contents :  spawned when destroyed  
; class&lt;[[Legacy:Actor|Actor]]&gt; EffectWhenDestroyed :  If set, the pyrotechnic or explosion when item is damaged ?Destroyed.
; Sound EndPushSound :  This sound is played when the decoration stops moving.
; [[Legacy:Texture|Texture]] FragSkin :  skin to use for fragments  
; class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType :  type of fragment to use  
; int Health :  The amount of damage the Decoration can take before it's destroyed.
; int NumFrags :  Number of fragments to spawn when destroyed.
; Sound PushSound :  This sound is played then the decoration is pushed.
; float SplashTime :  

===Hidden===
; bool bPushSoundPlaying :  The decoration currently plays the ''PushSound''. This variable is reset to false by a Timer function every 0.3 seconds.
; bool bSplash :  
; vector FragMomentum :  Momentum to be imparted to frags when destroyed. Set when taking damage.
; [[Legacy:NavigationPoint|NavigationPoint]] LastAnchor (const) :  recent nearest path  
; float LastValidAnchorTime :  last time a valid anchor was found  
; int numLandings (const) :  Used by engine physics.  

==Known Subclasses==
* [[Legacy:DestroyableTrigger|DestroyableTrigger]]
* [[Legacy:GameObject|GameObject]] &amp;ndash; important game objects like the BR ball or the CTF flags (not placeable, also see [[Legacy:GameObjective|GameObjective]])
* [[Legacy:ScaledSprite|ScaledSprite]]
* [[Legacy:Shark|Shark]]
* [[Legacy:UTeamBanner|uTeamBanner]]
* [[Legacy:XBombBase|xBombBase]]
* [[Legacy:XBombDeliveryHole|xBombDeliveryHole]] (not placeable)
* [[Legacy:XCTFBase|xCTFBase]] (not placeable)
* [[Legacy:XDOMLetter|xDOMLetter]]
* [[Legacy:XMonitor|xMonitor]]
* [[Legacy:XTeamBanner|xTeamBanner]]

==Discussion==

'''EricBlade:''' A little tip: In my source tree, decoration defaults to bStatic = true and bStasis = true. This makes it pretty much useless if you don't forget to reset those.  I'm not sure if UT2k3/2k4 implements a better version or a replacement for this handy dandy object, but in my game, 99% of the items in game are simply immutable static meshes.  I've subbed this, made it default to bStatic and bStasis false, and added code so that it will be burned by [[Legacy:Fire|Fire]].  It could probably use some improved method of dealing with sound, as it is now, the sound only plays once per push, wether you push it across a room or across the Sahara desert.  

An additional tip: Stacking three of these on top of each other in a game, then pushing them, results in this appearing in the log:
 Log: UZGDeco test2.UZGDeco4 fell out of the world at -1.#IND00 -1.#IND00 -1.#IND00!
 Log: Octree Warning (RemoveActor): UZGDeco4 moved without proper hashing
 Log: UZGDeco test2.UZGDeco5 fell out of the world at -1.#IND00 -1.#IND00 -1.#IND00!
 Log: Octree Warning (RemoveActor): UZGDeco5 moved without proper hashing

and then the computer completely and totally locks up.

Also, this seems to quite well show off some pretty serious problems in collision detection inside the game.  Even though my meshes have fully functional collision information, pushing a couple of these at each other results in them not colliding until they are several units inside each other.  Also, a tester reported that he was able to get inside one of these objects.  That same tester also reported a computer crash (with no log) when pushing into one of them.  Meh.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2551</id>
      <timestamp>2006-03-17T00:27:24Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Decoration (Package: Engine)}}

This is an abstract base class, and shouldn't be added to a map.

Children of this class are decoration actors &amp;ndash; meshes seen by the player in the game that have no AI and are not weapon or inventory pickups.  Many decorations are static, but a certain level of interaction can be set.

Usually [[Legacy:Static Mesh|Static Mesh]]es are used instead of Decoration actors unless the decorative object should be animated or have some special behavior.

See [[Legacy:Decoration (UT)|Decoration (UT)]] for the UT version of this class.

==Properties ==

===Decoration Group ===
; bool bDamageable :  Whether the Decoration can take damage.
; bool bPushable :  When activated, a player will be able to push the decoration on the floor, e.g. wooden boxes.
; class&lt;[[Legacy:Inventory|Inventory]]&gt; contents :  spawned when destroyed  
; class&lt;[[Legacy:Actor|Actor]]&gt; EffectWhenDestroyed :  If set, the pyrotechnic or explosion when item is damaged ?Destroyed.
; Sound EndPushSound :  This sound is played when the decoration stops moving.
; [[Legacy:Texture|Texture]] FragSkin :  skin to use for fragments  
; class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType :  type of fragment to use  
; int Health :  The amount of damage the Decoration can take before it's destroyed.
; int NumFrags :  Number of fragments to spawn when destroyed.
; Sound PushSound :  This sound is played then the decoration is pushed.
; float SplashTime :  

===UnrealScript-Only Properties ===
; bool bPushSoundPlaying :  The decoration currently plays the ''PushSound''. This variable is reset to false by a Timer function every 0.3 seconds.
; bool bSplash :  
; vector FragMomentum :  Momentum to be imparted to frags when destroyed. Set when taking damage.
; [[Legacy:NavigationPoint|NavigationPoint]] LastAnchor (const) :  recent nearest path  
; float LastValidAnchorTime :  last time a valid anchor was found  
; int numLandings (const) :  Used by engine physics.  

==Known Subclasses ==
* [[Legacy:DestroyableTrigger|DestroyableTrigger]]
* [[Legacy:GameObject|GameObject]] &amp;ndash; important game objects like the BR ball or the CTF flags (not placeable, also see [[Legacy:GameObjective|GameObjective]])
* [[Legacy:ScaledSprite|ScaledSprite]]
* [[Legacy:Shark|Shark]]
* [[Legacy:UTeamBanner|uTeamBanner]]
* [[Legacy:XBombBase|xBombBase]]
* [[Legacy:XBombDeliveryHole|xBombDeliveryHole]] (not placeable)
* [[Legacy:XCTFBase|xCTFBase]] (not placeable)
* [[Legacy:XDOMLetter|xDOMLetter]]
* [[Legacy:XMonitor|xMonitor]]
* [[Legacy:XTeamBanner|xTeamBanner]]

==Discussion ==

'''EricBlade:''' A little tip: In my source tree, decoration defaults to bStatic = true and bStasis = true. This makes it pretty much useless if you don't forget to reset those.  I'm not sure if UT2k3/2k4 implements a better version or a replacement for this handy dandy object, but in my game, 99% of the items in game are simply immutable static meshes.  I've subbed this, made it default to bStatic and bStasis false, and added code so that it will be burned by [[Legacy:Fire|Fire]].  It could probably use some improved method of dealing with sound, as it is now, the sound only plays once per push, wether you push it across a room or across the Sahara desert.  

An additional tip: Stacking three of these on top of each other in a game, then pushing them, results in this appearing in the log:
 Log: UZGDeco test2.UZGDeco4 fell out of the world at -1.#IND00 -1.#IND00 -1.#IND00!
 Log: Octree Warning (RemoveActor): UZGDeco4 moved without proper hashing
 Log: UZGDeco test2.UZGDeco5 fell out of the world at -1.#IND00 -1.#IND00 -1.#IND00!
 Log: Octree Warning (RemoveActor): UZGDeco5 moved without proper hashing

and then the computer completely and totally locks up.</text>
    </revision>
    <revision>
      <id>2552</id>
      <timestamp>2006-03-21T20:10:06Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>* further potential problems with this class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Decoration (Package: Engine)}}

This is an abstract base class, and shouldn't be added to a map.

Children of this class are decoration actors &amp;ndash; meshes seen by the player in the game that have no AI and are not weapon or inventory pickups.  Many decorations are static, but a certain level of interaction can be set.

Usually [[Legacy:Static Mesh|Static Mesh]]es are used instead of Decoration actors unless the decorative object should be animated or have some special behavior.

See [[Legacy:Decoration (UT)|Decoration (UT)]] for the UT version of this class.

==Properties ==

===Decoration Group ===
; bool bDamageable :  Whether the Decoration can take damage.
; bool bPushable :  When activated, a player will be able to push the decoration on the floor, e.g. wooden boxes.
; class&lt;[[Legacy:Inventory|Inventory]]&gt; contents :  spawned when destroyed  
; class&lt;[[Legacy:Actor|Actor]]&gt; EffectWhenDestroyed :  If set, the pyrotechnic or explosion when item is damaged ?Destroyed.
; Sound EndPushSound :  This sound is played when the decoration stops moving.
; [[Legacy:Texture|Texture]] FragSkin :  skin to use for fragments  
; class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType :  type of fragment to use  
; int Health :  The amount of damage the Decoration can take before it's destroyed.
; int NumFrags :  Number of fragments to spawn when destroyed.
; Sound PushSound :  This sound is played then the decoration is pushed.
; float SplashTime :  

===UnrealScript-Only Properties ===
; bool bPushSoundPlaying :  The decoration currently plays the ''PushSound''. This variable is reset to false by a Timer function every 0.3 seconds.
; bool bSplash :  
; vector FragMomentum :  Momentum to be imparted to frags when destroyed. Set when taking damage.
; [[Legacy:NavigationPoint|NavigationPoint]] LastAnchor (const) :  recent nearest path  
; float LastValidAnchorTime :  last time a valid anchor was found  
; int numLandings (const) :  Used by engine physics.  

==Known Subclasses ==
* [[Legacy:DestroyableTrigger|DestroyableTrigger]]
* [[Legacy:GameObject|GameObject]] &amp;ndash; important game objects like the BR ball or the CTF flags (not placeable, also see [[Legacy:GameObjective|GameObjective]])
* [[Legacy:ScaledSprite|ScaledSprite]]
* [[Legacy:Shark|Shark]]
* [[Legacy:UTeamBanner|uTeamBanner]]
* [[Legacy:XBombBase|xBombBase]]
* [[Legacy:XBombDeliveryHole|xBombDeliveryHole]] (not placeable)
* [[Legacy:XCTFBase|xCTFBase]] (not placeable)
* [[Legacy:XDOMLetter|xDOMLetter]]
* [[Legacy:XMonitor|xMonitor]]
* [[Legacy:XTeamBanner|xTeamBanner]]

==Discussion ==

'''EricBlade:''' A little tip: In my source tree, decoration defaults to bStatic = true and bStasis = true. This makes it pretty much useless if you don't forget to reset those.  I'm not sure if UT2k3/2k4 implements a better version or a replacement for this handy dandy object, but in my game, 99% of the items in game are simply immutable static meshes.  I've subbed this, made it default to bStatic and bStasis false, and added code so that it will be burned by [[Legacy:Fire|Fire]].  It could probably use some improved method of dealing with sound, as it is now, the sound only plays once per push, wether you push it across a room or across the Sahara desert.  

An additional tip: Stacking three of these on top of each other in a game, then pushing them, results in this appearing in the log:
 Log: UZGDeco test2.UZGDeco4 fell out of the world at -1.#IND00 -1.#IND00 -1.#IND00!
 Log: Octree Warning (RemoveActor): UZGDeco4 moved without proper hashing
 Log: UZGDeco test2.UZGDeco5 fell out of the world at -1.#IND00 -1.#IND00 -1.#IND00!
 Log: Octree Warning (RemoveActor): UZGDeco5 moved without proper hashing

and then the computer completely and totally locks up.

Also, this seems to quite well show off some pretty serious problems in collision detection inside the game.  Even though my meshes have fully functional collision information, pushing a couple of these at each other results in them not colliding until they are several units inside each other.  Also, a tester reported that he was able to get inside one of these objects.  That same tester also reported a computer crash (with no log) when pushing into one of them.  Meh.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decoration (DX)</title>
    <id>1041</id>
    <revision>
      <id>2780</id>
      <timestamp>2006-11-26T04:02:04Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Removed Delegates heading, because there are no Delegates</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; Decoration (Engine)}}

==Properties==
; Float BaseEyeHeight : For conversations
; bool bBobbing : 
; bool bOnlyTriggerable : 
; bool bPushable : 
; bool bPushSoundPlaying : 
; bool bSplash : 
; bool bWasCarried : 
; class&lt;inventory&gt; content2 : 
; class&lt;inventory&gt; content3 : 
; class&lt;inventory&gt; contents : 
; class&lt;actor&gt; EffectWhenDestroyed : 
; sound EndPushSound : 
; int numLandings : 
; sound PushSound : 

==Functions==
;  BaseChange( ): 
;  Bump( actor Other ): 
;  Destroyed( ): 
;  Drop( vector newVel ): 
;  FollowHolder( Actor Other ): 
;  Frag( class&lt;fragment&gt; FragType , vector Momentum , float DSize , int NumFrags ): 
;  Landed( vector HitNormall ): 
;  skinnedFrag( class&lt;fragment&gt; FragType , texture FragSkin , vector Momentum , float DSize , int NumFrags ): 
;  Timer( ): 
;  Trigger( actor Other , pawn EventInstigator ): 
;  ZoneChange( ZoneInfo NewZone ): 

==Events==

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2781</id>
      <timestamp>2004-02-10T05:06:33Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; Decoration (Engine)}}

==Properties==
; Float BaseEyeHeight : For conversations
; bool bBobbing : 
; bool bOnlyTriggerable : 
; bool bPushable : 
; bool bPushSoundPlaying : 
; bool bSplash : 
; bool bWasCarried : 
; class&lt;inventory&gt; content2 : 
; class&lt;inventory&gt; content3 : 
; class&lt;inventory&gt; contents : 
; class&lt;actor&gt; EffectWhenDestroyed : 
; sound EndPushSound : 
; int numLandings : 
; sound PushSound : 

==Delegates==

==Functions==
;  BaseChange( ): 
;  Bump( actor Other ): 
;  Destroyed( ): 
;  Drop( vector newVel ): 
;  FollowHolder( Actor Other ): 
;  Frag( class&lt;fragment&gt; FragType , vector Momentum , float DSize , int NumFrags ): 
;  Landed( vector HitNormall ): 
;  skinnedFrag( class&lt;fragment&gt; FragType , texture FragSkin , vector Momentum , float DSize , int NumFrags ): 
;  Timer( ): 
;  Trigger( actor Other , pawn EventInstigator ): 
;  ZoneChange( ZoneInfo NewZone ): 

==Events==

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decoration (UT)</title>
    <id>992</id>
    <revision>
      <id>2677</id>
      <timestamp>2005-06-07T00:20:32Z</timestamp>
      <contributor>
        <ip>D146-2-15.home1.cgocable.net</ip>
      </contributor>
      <comment>correction of grab conditions - must all be true - therefore AND</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Decoration (Package: Engine)}}

This is an abstract base class, and shouldn't be added to a map.

Children of this class are decoration actors &amp;ndash; meshes seen by the player in the game that have no AI and are not weapon or inventory pickups.  Many decorations are static, but a certain level of interaction can be set.&lt;br /&gt;Some decorations have scripted movement, e.g. ''Fighter''.

If you want to create your own decorations, see [[Legacy:MeshMaker|MeshMaker]].

See [[Legacy:Decoration|Decoration]] for the UT2003 version of this class.

==Properties ==
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; EffectWhenDestroyed : If set, the pyrotechnic or explosion when item is damaged.
; bool bPushable : When activated, a player will be able to push the decoration on the floor, e.g. wooden boxes.
; bool bOnlyTriggerable : Deactivates the ''Frag'' and ''skinnedFrag'' methods.
; sound PushSound : This sound is played then the decoration is pushed.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; contents, content2, content3 : One of these [[Legacy:Inventory (UT)|Inventory (UT)]] classes is dropped when the decoration is destroyed.
; sound EndPushSound : This sound is played when the decoration stops moving.

(The following are not available in the editor.)
; bool bSplash : ''(This one is a bit strange. It's set to false and then to true again in the same function with only &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt; inbetween.)''
; bool bBobbing : Used when the decoration is floating in a water [[Legacy:ZoneInfo (UT)|zone]].
; bool bWasCarried : The decoration was dropped by a [[Legacy:Pawn (UT)|Pawn (UT)]].
; const int numLandings : Used by engine physics.
; bool bPushSoundPlaying : The decoration currently plays the ''PushSound''. This variable is reset to false by a ''Timer'' function every 0.3 seconds.

==Methods ==
; simulated function FollowHolder([[Legacy:Actor (UT)|Actor (UT)]] Other) : ''(Not used?)''
; function Drop(vector newVel) : 
; simulated function Frag(class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType, vector Momentum, float DSize, int NumFrags) : Triggers the decoration's [[Legacy:Event|Event]], spawns several framents and destroys the decoration.
; simulated function skinnedFrag(class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType, texture FragSkin, vector Momentum, float DSize, int NumFrags) : Same as ''Frag'', but also sets the fragments' ''Skin'' to the specified texture.

==Useless Trivia ==

[[Legacy:Pawn (UT)|Pawn]]s are able to &quot;carry&quot; a decoration if they have no weapon or their weapon's mass is less than 20, and if the decoration is both pushable and its mass is less than 40 (pylons, small crates) and it has nothing sitting on top of it.  This may or may not have the effect of slowing the [[Legacy:Pawn (UT)|Pawn]]'s movement or inhibiting its ability to jump.  Carried objects are assigned to &quot;carriedDecoration&quot; in the [[Legacy:Pawn (UT)|Pawn]] class via the ''GrabDecoration'' function. [[Legacy:PlayerPawn|PlayerPawn]]s can pick up objects ingame using the undocumented ''Grab'' exec function.

'''Ike Bart:''' From my experience when testing the ''Grab'' function in Unreal Tournament, the player moves slower, cannot jump and cannot fall off cliffs while carrying a decoration, even for books with a mass of 1.  When I tried to pick up heavy pushable decorations with the grab command, nothing happened.  The grab command can also be used to activate movers or trigger events when used on movers set up appropriately.

==Notable Subclasses ==

Not a complete list, but some decoration actors merit a page of their own:
* [[Legacy:Barrel|Barrel]]
* [[Legacy:Carcass|Carcass]]
* [[Legacy:CTFFlag_(UT)|CTFFlag_(UT)]]
* [[Legacy:Cannon|Cannon]]
* [[Legacy:Fan2|Fan2]]
* [[Legacy:Lightbox|Lightbox]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2678</id>
      <timestamp>2005-01-08T05:26:49Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*CTFFlag link went to a ut2003 page, changed to CTFFlag_(UT)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Decoration (Package: Engine)}}

This is an abstract base class, and shouldn't be added to a map.

Children of this class are decoration actors &amp;ndash; meshes seen by the player in the game that have no AI and are not weapon or inventory pickups.  Many decorations are static, but a certain level of interaction can be set.&lt;br /&gt;Some decorations have scripted movement, e.g. ''Fighter''.

If you want to create your own decorations, see [[Legacy:MeshMaker|MeshMaker]].

See [[Legacy:Decoration|Decoration]] for the UT2003 version of this class.

==Properties ==
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; EffectWhenDestroyed : If set, the pyrotechnic or explosion when item is damaged.
; bool bPushable : When activated, a player will be able to push the decoration on the floor, e.g. wooden boxes.
; bool bOnlyTriggerable : Deactivates the ''Frag'' and ''skinnedFrag'' methods.
; sound PushSound : This sound is played then the decoration is pushed.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; contents, content2, content3 : One of these [[Legacy:Inventory (UT)|Inventory (UT)]] classes is dropped when the decoration is destroyed.
; sound EndPushSound : This sound is played when the decoration stops moving.

(The following are not available in the editor.)
; bool bSplash : ''(This one is a bit strange. It's set to false and then to true again in the same function with only &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt; inbetween.)''
; bool bBobbing : Used when the decoration is floating in a water [[Legacy:ZoneInfo (UT)|zone]].
; bool bWasCarried : The decoration was dropped by a [[Legacy:Pawn (UT)|Pawn (UT)]].
; const int numLandings : Used by engine physics.
; bool bPushSoundPlaying : The decoration currently plays the ''PushSound''. This variable is reset to false by a ''Timer'' function every 0.3 seconds.

==Methods ==
; simulated function FollowHolder([[Legacy:Actor (UT)|Actor (UT)]] Other) : ''(Not used?)''
; function Drop(vector newVel) : 
; simulated function Frag(class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType, vector Momentum, float DSize, int NumFrags) : Triggers the decoration's [[Legacy:Event|Event]], spawns several framents and destroys the decoration.
; simulated function skinnedFrag(class&lt;[[Legacy:Fragment|Fragment]]&gt; FragType, texture FragSkin, vector Momentum, float DSize, int NumFrags) : Same as ''Frag'', but also sets the fragments' ''Skin'' to the specified texture.

==Useless Trivia ==

[[Legacy:Pawn (UT)|Pawn]]s are able to &quot;carry&quot; a decoration if they have no weapon or their weapon's mass is less than 20, and if the decoration is either pushable or its mass is less than 40 (pylons, small crates).  This may or may not have the effect of slowing the [[Legacy:Pawn (UT)|Pawn]]'s movement or inhibiting its ability to jump.  Carried objects are assigned to &quot;carriedDecoration&quot; in the [[Legacy:Pawn (UT)|Pawn]] class via the ''GrabDecoration'' function. [[Legacy:PlayerPawn|PlayerPawn]]s can pick up objects ingame using the undocumented ''Grab'' exec function.

'''Ike Bart:''' From my experience when testing the ''Grab'' function in Unreal Tournament, the player moves slower, cannot jump and cannot fall off cliffs while carrying a decoration, even for books with a mass of 1.  When I tried to pick up heavy pushable decorations with the grab command, nothing happened.  The grab command can also be used to activate movers or trigger events when used on movers set up appropriately.

==Notable Subclasses ==

Not a complete list, but some decoration actors merit a page of their own:
* [[Legacy:Barrel|Barrel]]
* [[Legacy:Carcass|Carcass]]
* [[Legacy:CTFFlag_(UT)|CTFFlag_(UT)]]
* [[Legacy:Cannon|Cannon]]
* [[Legacy:Fan2|Fan2]]
* [[Legacy:Lightbox|Lightbox]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Decoration Class Tree (DX)</title>
    <id>1045</id>
    <revision>
      <id>2786</id>
      <timestamp>2007-08-08T10:45:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve"> [[Legacy:Decoration (DX)|Decoration (DX)]]
 +&amp;ndash; [[Legacy:Carcass (DX)|Carcass (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExCarcass (DX)|DeusExCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:AlexJacobsonCarcass (DX)|AlexJacobsonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:AnnaNavarreCarcass (DX)|AnnaNavarreCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BartenderCarcass (DX)|BartenderCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BoatPersonCarcass (DX)|BoatPersonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BobPageCarcass (DX)|BobPageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumFemaleCarcass (DX)|BumFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMale2Carcass (DX)|BumMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMale3Carcass (DX)|BumMale3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMaleCarcass (DX)|BumMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman1Carcass (DX)|Businessman1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman2Carcass (DX)|Businessman2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman3Carcass (DX)|Businessman3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businesswoman1Carcass (DX)|Businesswoman1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ButlerCarcass (DX)|ButlerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:CatCarcass (DX)|CatCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChadCarcass (DX)|ChadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChefCarcass (DX)|ChefCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChildMale2Carcass (DX)|ChildMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChildMaleCarcass (DX)|ChildMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:CopCarcass (DX)|CopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:DobermanCarcass (DX)|DobermanCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:DoctorCarcass (DX)|DoctorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female1Carcass (DX)|Female1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female2Carcass (DX)|Female2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female3Carcass (DX)|Female3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female4Carcass (DX)|Female4Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:FordSchickCarcass (DX)|FordSchickCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GarySavageCarcass (DX)|GarySavageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GilbertRentonCarcass (DX)|GilbertRentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GordonQuickCarcass (DX)|GordonQuickCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GrayCarcass (DX)|GrayCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GreaselCarcass (DX)|GreaselCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GuntherHermannCarcass (DX)|GuntherHermannCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:HarleyFilbenCarcass (DX)|HarleyFilbenCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:HKMilitaryCarcass (DX)|HKMilitaryCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Hooker1Carcass (DX)|Hooker1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Hooker2Carcass (DX)|Hooker2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:HowardStrongCarcass (DX)|HowardStrongCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JaimeReyesCarcass (DX)|JaimeReyesCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JanitorCarcass (DX)|JanitorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JCDentonMaleCarcass (DX)|JCDentonMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JockCarcass (DX)|JockCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JoeGreeneCarcass (DX)|JoeGreeneCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JoJoFineCarcass (DX)|JoJoFineCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JordanSheaCarcass (DX)|JordanSheaCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JosephManderleyCarcass (DX)|JosephManderleyCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JuanLebedevCarcass (DX)|JuanLebedevCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JunkieFemaleCarcass (DX)|JunkieFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JunkieMaleCarcass (DX)|JunkieMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:KarkianBabyCarcass (DX)|KarkianBabyCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:KarkianCarcass (DX)|KarkianCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassFemaleCarcass (DX)|LowerClassFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassMale2Carcass (DX)|LowerClassMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassMaleCarcass (DX)|LowerClassMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaggieChowCarcass (DX)|MaggieChowCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaidCarcass (DX)|MaidCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male1Carcass (DX)|Male1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male2Carcass (DX)|Male2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male3Carcass (DX)|Male3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male4Carcass (DX)|Male4Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:MargaretWilliamsCarcass (DX)|MargaretWilliamsCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaxChenCarcass (DX)|MaxChenCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MechanicCarcass (DX)|MechanicCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MIBCarcass (DX)|MIBCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MichaelHamnerCarcass (DX)|MichaelHamnerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MJ12CommandoCarcass (DX)|MJ12CommandoCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MJ12TroopCarcass (DX)|MJ12TroopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MorganEverettCarcass (DX)|MorganEverettCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MuttCarcass (DX)|MuttCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NathanMadisonCarcass (DX)|NathanMadisonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NicoletteDuClareCarcass (DX)|NicoletteDuClareCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NurseCarcass (DX)|NurseCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PaulDentonCarcass (DX)|PaulDentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PhilipMeadCarcass (DX)|PhilipMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PigeonCarcass (DX)|PigeonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RachelMeadCarcass (DX)|RachelMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RatCarcass (DX)|RatCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RiotCopCarcass (DX)|RiotCopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SailorCarcass (DX)|SailorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SamCarterCarcass (DX)|SamCarterCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SandraRentonCarcass (DX)|SandraRentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SarahMeadCarcass (DX)|SarahMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScientistFemaleCarcass (DX)|ScientistFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScientistMaleCarcass (DX)|ScientistMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScubaDiverCarcass (DX)|ScubaDiverCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SeagullCarcass (DX)|SeagullCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SecretaryCarcass (DX)|SecretaryCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SecretServiceCarcass (DX)|SecretServiceCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SmugglerCarcass (DX)|SmugglerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SoldierCarcass (DX)|SoldierCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:StantonDowdCarcass (DX)|StantonDowdCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TerroristCarcass (DX)|TerroristCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TerroristCommanderCarcass (DX)|TerroristCommanderCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMale2Carcass (DX)|ThugMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMale3Carcass (DX)|ThugMale3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMaleCarcass (DX)|ThugMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TiffanySavageCarcass (DX)|TiffanySavageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TobyAtanweCarcass (DX)|TobyAtanweCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TracerTongCarcass (DX)|TracerTongCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadLumPath2Carcass (DX)|TriadLumPath2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadLumPathCarcass (DX)|TriadLumPathCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadRedArrowCarcass (DX)|TriadRedArrowCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:UNATCOTroopCarcass (DX)|UNATCOTroopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:WaltonSimonsCarcass (DX)|WaltonSimonsCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:WIBCarcass (DX)|WIBCarcass (DX)]]
 +&amp;ndash; [[Legacy:DeusExDecoration (DX)|DeusExDecoration (DX)]]
 |   +&amp;ndash; [[Legacy:AIPrototype (DX)|AIPrototype (DX)]]
 |   +&amp;ndash; [[Legacy:AlarmLight (DX)|AlarmLight (DX)]]
 |   +&amp;ndash; [[Legacy:AutoTurret (DX)|AutoTurret (DX)]]
 |   |   +&amp;ndash; [[Legacy:AutoTurretSmall (DX)|AutoTurretSmall (DX)]]
 |   +&amp;ndash; [[Legacy:Basketball (DX)|Basketball (DX)]]
 |   +&amp;ndash; [[Legacy:BobPageAugmented (DX)|BobPageAugmented (DX)]]
 |   +&amp;ndash; [[Legacy:BoneFemur (DX)|BoneFemur (DX)]]
 |   +&amp;ndash; [[Legacy:BoneSkull (DX)|BoneSkull (DX)]]
 |   +&amp;ndash; [[Legacy:Button1 (DX)|Button1 (DX)]]
 |   +&amp;ndash; [[Legacy:CageLight (DX)|CageLight (DX)]]
 |   +&amp;ndash; [[Legacy:Cart (DX)|Cart (DX)]]
 |   +&amp;ndash; [[Legacy:CeilingFan (DX)|CeilingFan (DX)]]
 |   +&amp;ndash; [[Legacy:CeilingFanMotor (DX)|CeilingFanMotor (DX)]]
 |   +&amp;ndash; [[Legacy:Containers (DX)|Containers (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmmoCrate (DX)|AmmoCrate (DX)]]
 |   |   +&amp;ndash; [[Legacy:Barrel1 (DX)|Barrel1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelAmbrosia (DX)|BarrelAmbrosia (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelFire (DX)|BarrelFire (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelVirus (DX)|BarrelVirus (DX)]]
 |   |   +&amp;ndash; [[Legacy:Basket (DX)|Basket (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxLarge (DX)|BoxLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxMedium (DX)|BoxMedium (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxSmall (DX)|BoxSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedCombat (DX)|CrateBreakableMedCombat (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedGeneral (DX)|CrateBreakableMedGeneral (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedMedical (DX)|CrateBreakableMedMedical (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateExplosiveSmall (DX)|CrateExplosiveSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableLarge (DX)|CrateUnbreakableLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableMed (DX)|CrateUnbreakableMed (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableSmall (DX)|CrateUnbreakableSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mailbox (DX)|Mailbox (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashbag (DX)|Trashbag (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashbag2 (DX)|Trashbag2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan1 (DX)|TrashCan1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashcan2 (DX)|Trashcan2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan3 (DX)|TrashCan3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan4 (DX)|TrashCan4 (DX)]]
 |   +&amp;ndash; [[Legacy:DentonClone (DX)|DentonClone (DX)]]
 |   +&amp;ndash; [[Legacy:ElectronicDevices (DX)|ElectronicDevices (DX)]]
 |   |   +&amp;ndash; [[Legacy:ATM (DX)|ATM (DX)]]
 |   |   +&amp;ndash; [[Legacy:CigaretteMachine (DX)|CigaretteMachine (DX)]]
 |   |   +&amp;ndash; [[Legacy:Computers (DX)|Computers (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerPersonal (DX)|ComputerPersonal (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerPublic (DX)|ComputerPublic (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerSecurity (DX)|ComputerSecurity (DX)]]
 |   |   +&amp;ndash; [[Legacy:HackableDevices (DX)|HackableDevices (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AcousticSensor (DX)|AcousticSensor (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AlarmUnit (DX)|AlarmUnit (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AutoTurretGun (DX)|AutoTurretGun (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:AutoTurretGunSmall (DX)|AutoTurretGunSmall (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ControlPanel (DX)|ControlPanel (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Keypad (DX)|Keypad (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad1 (DX)|Keypad1 (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad2 (DX)|Keypad2 (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad3 (DX)|Keypad3 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RetinalScanner (DX)|RetinalScanner (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:SecurityCamera (DX)|SecurityCamera (DX)]]
 |   |   +&amp;ndash; [[Legacy:Phone (DX)|Phone (DX)]]
 |   |   +&amp;ndash; [[Legacy:Pinball (DX)|Pinball (DX)]]
 |   |   +&amp;ndash; [[Legacy:TAD (DX)|TAD (DX)]]
 |   |   +&amp;ndash; [[Legacy:VendingMachine (DX)|VendingMachine (DX)]]
 |   +&amp;ndash; [[Legacy:Fan1 (DX)|Fan1 (DX)]]
 |   +&amp;ndash; [[Legacy:Fan1Vertical (DX)|Fan1Vertical (DX)]]
 |   +&amp;ndash; [[Legacy:Fan2 (DX)|Fan2 (DX)]]
 |   +&amp;ndash; [[Legacy:Faucet (DX)|Faucet (DX)]]
 |   +&amp;ndash; [[Legacy:FlagPole (DX)|FlagPole (DX)]]
 |   +&amp;ndash; [[Legacy:Flask (DX)|Flask (DX)]]
 |   +&amp;ndash; [[Legacy:Flowers (DX)|Flowers (DX)]]
 |   +&amp;ndash; [[Legacy:Furniture (DX)|Furniture (DX)]]
 |   |   +&amp;ndash; [[Legacy:CoffeeTable (DX)|CoffeeTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cushion (DX)|Cushion (DX)]]
 |   |   +&amp;ndash; [[Legacy:Lamp (DX)|Lamp (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp1 (DX)|Lamp1 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp2 (DX)|Lamp2 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp3 (DX)|Lamp3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Seat (DX)|Seat (DX)]]
 |   |       +&amp;ndash; [[Legacy:Chair1 (DX)|Chair1 (DX)]]
 |   |       +&amp;ndash; [[Legacy:ChairLeather (DX)|ChairLeather (DX)]]
 |   |       +&amp;ndash; [[Legacy:CouchLeather (DX)|CouchLeather (DX)]]
 |   |       +&amp;ndash; [[Legacy:HKChair (DX)|HKChair (DX)]]
 |   |       +&amp;ndash; [[Legacy:HKCouch (DX)|HKCouch (DX)]]
 |   |       +&amp;ndash; [[Legacy:OfficeChair (DX)|OfficeChair (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHBenchEast (DX)|WHBenchEast (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHBenchLibrary (DX)|WHBenchLibrary (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairDining (DX)|WHChairDining (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairOvalOffice (DX)|WHChairOvalOffice (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairPink (DX)|WHChairPink (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHRedCouch (DX)|WHRedCouch (DX)]]
 |   +&amp;ndash; [[Legacy:HangingDecoration (DX)|HangingDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:Chandelier (DX)|Chandelier (DX)]]
 |   |   +&amp;ndash; [[Legacy:ClothesRack (DX)|ClothesRack (DX)]]
 |   |   +&amp;ndash; [[Legacy:HangingChicken (DX)|HangingChicken (DX)]]
 |   |   +&amp;ndash; [[Legacy:HangingShopLight (DX)|HangingShopLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKBirdcage (DX)|HKBirdcage (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingLantern (DX)|HKHangingLantern (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingLantern2 (DX)|HKHangingLantern2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingPig (DX)|HKHangingPig (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketLight (DX)|HKMarketLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:PoolTableLight (DX)|PoolTableLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrafficLight (DX)|TrafficLight (DX)]]
 |   +&amp;ndash; [[Legacy:HongKongDecoration (DX)|HongKongDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKBuddha (DX)|HKBuddha (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKIncenseBurner (DX)|HKIncenseBurner (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketTable (DX)|HKMarketTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketTarp (DX)|HKMarketTarp (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKTable (DX)|HKTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKTukTuk (DX)|HKTukTuk (DX)]]
 |   +&amp;ndash; [[Legacy:InformationDevices (DX)|InformationDevices (DX)]]
 |   |   +&amp;ndash; [[Legacy:BookClosed (DX)|BookClosed (DX)]]
 |   |   +&amp;ndash; [[Legacy:BookOpen (DX)|BookOpen (DX)]]
 |   |   +&amp;ndash; [[Legacy:DataCube (DX)|DataCube (DX)]]
 |   |   +&amp;ndash; [[Legacy:Newspaper (DX)|Newspaper (DX)]]
 |   |   +&amp;ndash; [[Legacy:NewspaperOpen (DX)|NewspaperOpen (DX)]]
 |   +&amp;ndash; [[Legacy:LifeSupportBase (DX)|LifeSupportBase (DX)]]
 |   +&amp;ndash; [[Legacy:Lightbulb (DX)|Lightbulb (DX)]]
 |   +&amp;ndash; [[Legacy:LightSwitch (DX)|LightSwitch (DX)]]
 |   +&amp;ndash; [[Legacy:LuciusDeBeers (DX)|LuciusDeBeers (DX)]]
 |   +&amp;ndash; [[Legacy:Microscope (DX)|Microscope (DX)]]
 |   +&amp;ndash; [[Legacy:NewYorkDecoration (DX)|NewYorkDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYEagleStatue (DX)|NYEagleStatue (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLiberty (DX)|NYLiberty (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLibertyTop (DX)|NYLibertyTop (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLibertyTorch (DX)|NYLibertyTorch (DX)]]
 |   +&amp;ndash; [[Legacy:OutdoorThings (DX)|OutdoorThings (DX)]]
 |   |   +&amp;ndash; [[Legacy:Buoy (DX)|Buoy (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes1 (DX)|Bushes1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes2 (DX)|Bushes2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes3 (DX)|Bushes3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cactus1 (DX)|Cactus1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cactus2 (DX)|Cactus2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarBurned (DX)|CarBurned (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarStripped (DX)|CarStripped (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarWrecked (DX)|CarWrecked (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXLogo (DX)|DXLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXText (DX)|DXText (DX)]]
 |   |   +&amp;ndash; [[Legacy:Earth (DX)|Earth (DX)]]
 |   |   +&amp;ndash; [[Legacy:EidosLogo (DX)|EidosLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:FirePlug (DX)|FirePlug (DX)]]
 |   |   +&amp;ndash; [[Legacy:IonStormLogo (DX)|IonStormLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:Moon (DX)|Moon (DX)]]
 |   |   +&amp;ndash; [[Legacy:SatelliteDish (DX)|SatelliteDish (DX)]]
 |   |   +&amp;ndash; [[Legacy:StatueLion (DX)|StatueLion (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tree (DX)|Tree (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree1 (DX)|Tree1 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree2 (DX)|Tree2 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree3 (DX)|Tree3 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree4 (DX)|Tree4 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan1 (DX)|Pan1 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan2 (DX)|Pan2 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan3 (DX)|Pan3 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan4 (DX)|Pan4 (DX)]]
 |   +&amp;ndash; [[Legacy:Pillow (DX)|Pillow (DX)]]
 |   +&amp;ndash; [[Legacy:Plant1 (DX)|Plant1 (DX)]]
 |   +&amp;ndash; [[Legacy:Plant2 (DX)|Plant2 (DX)]]
 |   +&amp;ndash; [[Legacy:Plant3 (DX)|Plant3 (DX)]]
 |   +&amp;ndash; [[Legacy:Poolball (DX)|Poolball (DX)]]
 |   +&amp;ndash; [[Legacy:Pot1 (DX)|Pot1 (DX)]]
 |   +&amp;ndash; [[Legacy:Pot2 (DX)|Pot2 (DX)]]
 |   +&amp;ndash; [[Legacy:RoadBlock (DX)|RoadBlock (DX)]]
 |   +&amp;ndash; [[Legacy:ShipsWheel (DX)|ShipsWheel (DX)]]
 |   +&amp;ndash; [[Legacy:ShopLight (DX)|ShopLight (DX)]]
 |   +&amp;ndash; [[Legacy:ShowerFaucet (DX)|ShowerFaucet (DX)]]
 |   +&amp;ndash; [[Legacy:ShowerHead (DX)|ShowerHead (DX)]]
 |   +&amp;ndash; [[Legacy:SignFloor (DX)|SignFloor (DX)]]
 |   +&amp;ndash; [[Legacy:SubwayControlPanel (DX)|SubwayControlPanel (DX)]]
 |   +&amp;ndash; [[Legacy:Switch1 (DX)|Switch1 (DX)]]
 |   +&amp;ndash; [[Legacy:Switch2 (DX)|Switch2 (DX)]]
 |   +&amp;ndash; [[Legacy:Toilet (DX)|Toilet (DX)]]
 |   +&amp;ndash; [[Legacy:Toilet2 (DX)|Toilet2 (DX)]]
 |   +&amp;ndash; [[Legacy:Trash (DX)|Trash (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashPaper (DX)|TrashPaper (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tumbleweed (DX)|Tumbleweed (DX)]]
 |   +&amp;ndash; [[Legacy:Trophy (DX)|Trophy (DX)]]
 |   +&amp;ndash; [[Legacy:Valve (DX)|Valve (DX)]]
 |   +&amp;ndash; [[Legacy:Vase1 (DX)|Vase1 (DX)]]
 |   +&amp;ndash; [[Legacy:Vase2 (DX)|Vase2 (DX)]]
 |   +&amp;ndash; [[Legacy:Vehicles (DX)|Vehicles (DX)]]
 |   |   +&amp;ndash; [[Legacy:AttackHelicopter (DX)|AttackHelicopter (DX)]]
 |   |   +&amp;ndash; [[Legacy:BlackHelicopter (DX)|BlackHelicopter (DX)]]
 |   |   +&amp;ndash; [[Legacy:MiniSub (DX)|MiniSub (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYPoliceBoat (DX)|NYPoliceBoat (DX)]]
 |   |   +&amp;ndash; [[Legacy:Van (DX)|Van (DX)]]
 |   +&amp;ndash; [[Legacy:WashingtonDecoration (DX)|WashingtonDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHBookstandLibrary (DX)|WHBookstandLibrary (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHCabinet (DX)|WHCabinet (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHDeskLibrarySmall (DX)|WHDeskLibrarySmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHDeskOvalOffice (DX)|WHDeskOvalOffice (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHEndtableLibrary (DX)|WHEndtableLibrary (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHFireplaceGrill (DX)|WHFireplaceGrill (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHFireplaceLog (DX)|WHFireplaceLog (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHPhone (DX)|WHPhone (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHPiano (DX)|WHPiano (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedCandleabra (DX)|WHRedCandleabra (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedEagleTable (DX)|WHRedEagleTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedLampTable (DX)|WHRedLampTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedOvalTable (DX)|WHRedOvalTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedVase (DX)|WHRedVase (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHTableBlue (DX)|WHTableBlue (DX)]]
 |   +&amp;ndash; [[Legacy:WaterCooler (DX)|WaterCooler (DX)]]
 |   +&amp;ndash; [[Legacy:WaterFountain (DX)|WaterFountain (DX)]]
 +&amp;ndash; [[Legacy:ScaledSprite (DX)|ScaledSprite (DX)]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2787</id>
      <timestamp>2004-02-11T01:41:59Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve"> [[Legacy:Decoration (DX)|Decoration (DX)]]
 +&amp;ndash; [[Legacy:Carcass (DX)|Carcass (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExCarcass (DX)|DeusExCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:AlexJacobsonCarcass (DX)|AlexJacobsonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:AnnaNavarreCarcass (DX)|AnnaNavarreCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BartenderCarcass (DX)|BartenderCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BoatPersonCarcass (DX)|BoatPersonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BobPageCarcass (DX)|BobPageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumFemaleCarcass (DX)|BumFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMale2Carcass (DX)|BumMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMale3Carcass (DX)|BumMale3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMaleCarcass (DX)|BumMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman1Carcass (DX)|Businessman1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman2Carcass (DX)|Businessman2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman3Carcass (DX)|Businessman3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businesswoman1Carcass (DX)|Businesswoman1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ButlerCarcass (DX)|ButlerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:CatCarcass (DX)|CatCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChadCarcass (DX)|ChadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChefCarcass (DX)|ChefCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChildMale2Carcass (DX)|ChildMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChildMaleCarcass (DX)|ChildMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:CopCarcass (DX)|CopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:DobermanCarcass (DX)|DobermanCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:DoctorCarcass (DX)|DoctorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female1Carcass (DX)|Female1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female2Carcass (DX)|Female2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female3Carcass (DX)|Female3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female4Carcass (DX)|Female4Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:FordSchickCarcass (DX)|FordSchickCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GarySavageCarcass (DX)|GarySavageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GilbertRentonCarcass (DX)|GilbertRentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GordonQuickCarcass (DX)|GordonQuickCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GrayCarcass (DX)|GrayCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GreaselCarcass (DX)|GreaselCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GuntherHermannCarcass (DX)|GuntherHermannCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:HarleyFilbenCarcass (DX)|HarleyFilbenCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:HKMilitaryCarcass (DX)|HKMilitaryCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Hooker1Carcass (DX)|Hooker1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Hooker2Carcass (DX)|Hooker2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:HowardStrongCarcass (DX)|HowardStrongCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JaimeReyesCarcass (DX)|JaimeReyesCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JanitorCarcass (DX)|JanitorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JCDentonMaleCarcass (DX)|JCDentonMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JockCarcass (DX)|JockCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JoeGreeneCarcass (DX)|JoeGreeneCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JoJoFineCarcass (DX)|JoJoFineCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JordanSheaCarcass (DX)|JordanSheaCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JosephManderleyCarcass (DX)|JosephManderleyCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JuanLebedevCarcass (DX)|JuanLebedevCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JunkieFemaleCarcass (DX)|JunkieFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JunkieMaleCarcass (DX)|JunkieMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:KarkianBabyCarcass (DX)|KarkianBabyCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:KarkianCarcass (DX)|KarkianCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassFemaleCarcass (DX)|LowerClassFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassMale2Carcass (DX)|LowerClassMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassMaleCarcass (DX)|LowerClassMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaggieChowCarcass (DX)|MaggieChowCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaidCarcass (DX)|MaidCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male1Carcass (DX)|Male1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male2Carcass (DX)|Male2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male3Carcass (DX)|Male3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male4Carcass (DX)|Male4Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:MargaretWilliamsCarcass (DX)|MargaretWilliamsCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaxChenCarcass (DX)|MaxChenCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MechanicCarcass (DX)|MechanicCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MIBCarcass (DX)|MIBCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MichaelHamnerCarcass (DX)|MichaelHamnerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MJ12CommandoCarcass (DX)|MJ12CommandoCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MJ12TroopCarcass (DX)|MJ12TroopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MorganEverettCarcass (DX)|MorganEverettCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MuttCarcass (DX)|MuttCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NathanMadisonCarcass (DX)|NathanMadisonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NicoletteDuClareCarcass (DX)|NicoletteDuClareCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NurseCarcass (DX)|NurseCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PaulDentonCarcass (DX)|PaulDentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PhilipMeadCarcass (DX)|PhilipMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PigeonCarcass (DX)|PigeonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RachelMeadCarcass (DX)|RachelMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RatCarcass (DX)|RatCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RiotCopCarcass (DX)|RiotCopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SailorCarcass (DX)|SailorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SamCarterCarcass (DX)|SamCarterCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SandraRentonCarcass (DX)|SandraRentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SarahMeadCarcass (DX)|SarahMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScientistFemaleCarcass (DX)|ScientistFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScientistMaleCarcass (DX)|ScientistMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScubaDiverCarcass (DX)|ScubaDiverCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SeagullCarcass (DX)|SeagullCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SecretaryCarcass (DX)|SecretaryCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SecretServiceCarcass (DX)|SecretServiceCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SmugglerCarcass (DX)|SmugglerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SoldierCarcass (DX)|SoldierCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:StantonDowdCarcass (DX)|StantonDowdCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TerroristCarcass (DX)|TerroristCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TerroristCommanderCarcass (DX)|TerroristCommanderCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMale2Carcass (DX)|ThugMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMale3Carcass (DX)|ThugMale3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMaleCarcass (DX)|ThugMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TiffanySavageCarcass (DX)|TiffanySavageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TobyAtanweCarcass (DX)|TobyAtanweCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TracerTongCarcass (DX)|TracerTongCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadLumPath2Carcass (DX)|TriadLumPath2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadLumPathCarcass (DX)|TriadLumPathCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadRedArrowCarcass (DX)|TriadRedArrowCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:UNATCOTroopCarcass (DX)|UNATCOTroopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:WaltonSimonsCarcass (DX)|WaltonSimonsCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:WIBCarcass (DX)|WIBCarcass (DX)]]
 +&amp;ndash; [[Legacy:DeusExDecoration (DX)|DeusExDecoration (DX)]]
 |   +&amp;ndash; [[Legacy:AIPrototype (DX)|AIPrototype (DX)]]
 |   +&amp;ndash; [[Legacy:AlarmLight (DX)|AlarmLight (DX)]]
 |   +&amp;ndash; [[Legacy:AutoTurret (DX)|AutoTurret (DX)]]
 |   |   +&amp;ndash; [[Legacy:AutoTurretSmall (DX)|AutoTurretSmall (DX)]]
 |   +&amp;ndash; [[Legacy:Basketball (DX)|Basketball (DX)]]
 |   +&amp;ndash; [[Legacy:BobPageAugmented (DX)|BobPageAugmented (DX)]]
 |   +&amp;ndash; [[Legacy:BoneFemur (DX)|BoneFemur (DX)]]
 |   +&amp;ndash; [[Legacy:BoneSkull (DX)|BoneSkull (DX)]]
 |   +&amp;ndash; [[Legacy:Button1 (DX)|Button1 (DX)]]
 |   +&amp;ndash; [[Legacy:CageLight (DX)|CageLight (DX)]]
 |   +&amp;ndash; [[Legacy:Cart (DX)|Cart (DX)]]
 |   +&amp;ndash; [[Legacy:CeilingFan (DX)|CeilingFan (DX)]]
 |   +&amp;ndash; [[Legacy:CeilingFanMotor (DX)|CeilingFanMotor (DX)]]
 |   +&amp;ndash; [[Legacy:Containers (DX)|Containers (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmmoCrate (DX)|AmmoCrate (DX)]]
 |   |   +&amp;ndash; [[Legacy:Barrel1 (DX)|Barrel1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelAmbrosia (DX)|BarrelAmbrosia (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelFire (DX)|BarrelFire (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelVirus (DX)|BarrelVirus (DX)]]
 |   |   +&amp;ndash; [[Legacy:Basket (DX)|Basket (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxLarge (DX)|BoxLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxMedium (DX)|BoxMedium (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxSmall (DX)|BoxSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedCombat (DX)|CrateBreakableMedCombat (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedGeneral (DX)|CrateBreakableMedGeneral (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedMedical (DX)|CrateBreakableMedMedical (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateExplosiveSmall (DX)|CrateExplosiveSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableLarge (DX)|CrateUnbreakableLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableMed (DX)|CrateUnbreakableMed (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableSmall (DX)|CrateUnbreakableSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mailbox (DX)|Mailbox (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashbag (DX)|Trashbag (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashbag2 (DX)|Trashbag2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan1 (DX)|TrashCan1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashcan2 (DX)|Trashcan2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan3 (DX)|TrashCan3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan4 (DX)|TrashCan4 (DX)]]
 |   +&amp;ndash; [[Legacy:DentonClone (DX)|DentonClone (DX)]]
 |   +&amp;ndash; [[Legacy:ElectronicDevices (DX)|ElectronicDevices (DX)]]
 |   |   +&amp;ndash; [[Legacy:ATM (DX)|ATM (DX)]]
 |   |   +&amp;ndash; [[Legacy:CigaretteMachine (DX)|CigaretteMachine (DX)]]
 |   |   +&amp;ndash; [[Legacy:Computers (DX)|Computers (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerPersonal (DX)|ComputerPersonal (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerPublic (DX)|ComputerPublic (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerSecurity (DX)|ComputerSecurity (DX)]]
 |   |   +&amp;ndash; [[Legacy:HackableDevices (DX)|HackableDevices (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AcousticSensor (DX)|AcousticSensor (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AlarmUnit (DX)|AlarmUnit (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AutoTurretGun (DX)|AutoTurretGun (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:AutoTurretGunSmall (DX)|AutoTurretGunSmall (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ControlPanel (DX)|ControlPanel (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Keypad (DX)|Keypad (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad1 (DX)|Keypad1 (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad2 (DX)|Keypad2 (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad3 (DX)|Keypad3 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RetinalScanner (DX)|RetinalScanner (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:SecurityCamera (DX)|SecurityCamera (DX)]]
 |   |   +&amp;ndash; [[Legacy:Phone (DX)|Phone (DX)]]
 |   |   +&amp;ndash; [[Legacy:Pinball (DX)|Pinball (DX)]]
 |   |   +&amp;ndash; [[Legacy:TAD (DX)|TAD (DX)]]
 |   |   +&amp;ndash; [[Legacy:VendingMachine (DX)|VendingMachine (DX)]]
 |   +&amp;ndash; [[Legacy:Fan1 (DX)|Fan1 (DX)]]
 |   +&amp;ndash; [[Legacy:Fan1Vertical (DX)|Fan1Vertical (DX)]]
 |   +&amp;ndash; [[Legacy:Fan2 (DX)|Fan2 (DX)]]
 |   +&amp;ndash; [[Legacy:Faucet (DX)|Faucet (DX)]]
 |   +&amp;ndash; [[Legacy:FlagPole (DX)|FlagPole (DX)]]
 |   +&amp;ndash; [[Legacy:Flask (DX)|Flask (DX)]]
 |   +&amp;ndash; [[Legacy:Flowers (DX)|Flowers (DX)]]
 |   +&amp;ndash; [[Legacy:Furniture (DX)|Furniture (DX)]]
 |   |   +&amp;ndash; [[Legacy:CoffeeTable (DX)|CoffeeTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cushion (DX)|Cushion (DX)]]
 |   |   +&amp;ndash; [[Legacy:Lamp (DX)|Lamp (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp1 (DX)|Lamp1 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp2 (DX)|Lamp2 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp3 (DX)|Lamp3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Seat (DX)|Seat (DX)]]
 |   |       +&amp;ndash; [[Legacy:Chair1 (DX)|Chair1 (DX)]]
 |   |       +&amp;ndash; [[Legacy:ChairLeather (DX)|ChairLeather (DX)]]
 |   |       +&amp;ndash; [[Legacy:CouchLeather (DX)|CouchLeather (DX)]]
 |   |       +&amp;ndash; [[Legacy:HKChair (DX)|HKChair (DX)]]
 |   |       +&amp;ndash; [[Legacy:HKCouch (DX)|HKCouch (DX)]]
 |   |       +&amp;ndash; [[Legacy:OfficeChair (DX)|OfficeChair (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHBenchEast (DX)|WHBenchEast (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHBenchLibrary (DX)|WHBenchLibrary (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairDining (DX)|WHChairDining (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairOvalOffice (DX)|WHChairOvalOffice (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairPink (DX)|WHChairPink (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHRedCouch (DX)|WHRedCouch (DX)]]
 |   +&amp;ndash; [[Legacy:HangingDecoration (DX)|HangingDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:Chandelier (DX)|Chandelier (DX)]]
 |   |   +&amp;ndash; [[Legacy:ClothesRack (DX)|ClothesRack (DX)]]
 |   |   +&amp;ndash; [[Legacy:HangingChicken (DX)|HangingChicken (DX)]]
 |   |   +&amp;ndash; [[Legacy:HangingShopLight (DX)|HangingShopLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKBirdcage (DX)|HKBirdcage (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingLantern (DX)|HKHangingLantern (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingLantern2 (DX)|HKHangingLantern2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingPig (DX)|HKHangingPig (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketLight (DX)|HKMarketLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:PoolTableLight (DX)|PoolTableLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrafficLight (DX)|TrafficLight (DX)]]
 |   +&amp;ndash; [[Legacy:HongKongDecoration (DX)|HongKongDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKBuddha (DX)|HKBuddha (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKIncenseBurner (DX)|HKIncenseBurner (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketTable (DX)|HKMarketTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketTarp (DX)|HKMarketTarp (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKTable (DX)|HKTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKTukTuk (DX)|HKTukTuk (DX)]]
 |   +&amp;ndash; [[Legacy:InformationDevices (DX)|InformationDevices (DX)]]
 |   |   +&amp;ndash; [[Legacy:BookClosed (DX)|BookClosed (DX)]]
 |   |   +&amp;ndash; [[Legacy:BookOpen (DX)|BookOpen (DX)]]
 |   |   +&amp;ndash; [[Legacy:DataCube (DX)|DataCube (DX)]]
 |   |   +&amp;ndash; [[Legacy:Newspaper (DX)|Newspaper (DX)]]
 |   |   +&amp;ndash; [[Legacy:NewspaperOpen (DX)|NewspaperOpen (DX)]]
 |   +&amp;ndash; [[Legacy:LifeSupportBase (DX)|LifeSupportBase (DX)]]
 |   +&amp;ndash; [[Legacy:Lightbulb (DX)|Lightbulb (DX)]]
 |   +&amp;ndash; [[Legacy:LightSwitch (DX)|LightSwitch (DX)]]
 |   +&amp;ndash; [[Legacy:LuciusDeBeers (DX)|LuciusDeBeers (DX)]]
 |   +&amp;ndash; [[Legacy:Microscope (DX)|Microscope (DX)]]
 |   +&amp;ndash; [[Legacy:NewYorkDecoration (DX)|NewYorkDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYEagleStatue (DX)|NYEagleStatue (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLiberty (DX)|NYLiberty (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLibertyTop (DX)|NYLibertyTop (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLibertyTorch (DX)|NYLibertyTorch (DX)]]
 |   +&amp;ndash; [[Legacy:OutdoorThings (DX)|OutdoorThings (DX)]]
 |   |   +&amp;ndash; [[Legacy:Buoy (DX)|Buoy (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes1 (DX)|Bushes1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes2 (DX)|Bushes2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes3 (DX)|Bushes3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cactus1 (DX)|Cactus1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cactus2 (DX)|Cactus2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarBurned (DX)|CarBurned (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarStripped (DX)|CarStripped (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarWrecked (DX)|CarWrecked (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXLogo (DX)|DXLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXText (DX)|DXText (DX)]]
 |   |   +&amp;ndash; [[Legacy:Earth (DX)|Earth (DX)]]
 |   |   +&amp;ndash; [[Legacy:EidosLogo (DX)|EidosLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:FirePlug (DX)|FirePlug (DX)]]
 |   |   +&amp;ndash; [[Legacy:IonStormLogo (DX)|IonStormLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:Moon (DX)|Moon (DX)]]
 |   |   +&amp;ndash; [[Legacy:SatelliteDish (DX)|SatelliteDish (DX)]]
 |   |   +&amp;ndash; [[Legacy:StatueLion (DX)|StatueLion (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tree (DX)|Tree (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree1 (DX)|Tree1 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree2 (DX)|Tree2 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree3 (DX)|Tree3 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree4 (DX)|Tree4 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan1 (DX)|Pan1 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan2 (DX)|Pan2 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan3 (DX)|Pan3 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan4 (DX)|Pan4 (DX)]]
 |   +&amp;ndash; [[Legacy:Pillow (DX)|Pillow (DX)]]
 |   +&amp;ndash; [[Legacy:Plant1 (DX)|Plant1 (DX)]]
 |   +&amp;ndash; [[Legacy:Plant2 (DX)|Plant2 (DX)]]
 |   +&amp;ndash; [[Legacy:Plant3 (DX)|Plant3 (DX)]]
 |   +&amp;ndash; [[Legacy:Poolball (DX)|Poolball (DX)]]
 |   +&amp;ndash; [[Legacy:Pot1 (DX)|Pot1 (DX)]]
 |   +&amp;ndash; [[Legacy:Pot2 (DX)|Pot2 (DX)]]
 |   +&amp;ndash; [[Legacy:RoadBlock (DX)|RoadBlock (DX)]]
 |   +&amp;ndash; [[Legacy:ShipsWheel (DX)|ShipsWheel (DX)]]
 |   +&amp;ndash; [[Legacy:ShopLight (DX)|ShopLight (DX)]]
 |   +&amp;ndash; [[Legacy:ShowerFaucet (DX)|ShowerFaucet (DX)]]
 |   +&amp;ndash; [[Legacy:ShowerHead (DX)|ShowerHead (DX)]]
 |   +&amp;ndash; [[Legacy:SignFloor (DX)|SignFloor (DX)]]
 |   +&amp;ndash; [[Legacy:SubwayControlPanel (DX)|SubwayControlPanel (DX)]]
 |   +&amp;ndash; [[Legacy:Switch1 (DX)|Switch1 (DX)]]
 |   +&amp;ndash; [[Legacy:Switch2 (DX)|Switch2 (DX)]]
 |   +&amp;ndash; [[Legacy:Toilet (DX)|Toilet (DX)]]
 |   +&amp;ndash; [[Legacy:Toilet2 (DX)|Toilet2 (DX)]]
 |   +&amp;ndash; [[Legacy:Trash (DX)|Trash (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashPaper (DX)|TrashPaper (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tumbleweed (DX)|Tumbleweed (DX)]]
 |   +&amp;ndash; [[Legacy:Trophy (DX)|Trophy (DX)]]
 |   +&amp;ndash; [[Legacy:Valve (DX)|Valve (DX)]]
 |   +&amp;ndash; [[Legacy:Vase1 (DX)|Vase1 (DX)]]
 |   +&amp;ndash; [[Legacy:Vase2 (DX)|Vase2 (DX)]]
 |   +&amp;ndash; [[Legacy:Vehicles (DX)|Vehicles (DX)]]
 |   |   +&amp;ndash; [[Legacy:AttackHelicopter (DX)|AttackHelicopter (DX)]]
 |   |   +&amp;ndash; [[Legacy:BlackHelicopter (DX)|BlackHelicopter (DX)]]
 |   |   +&amp;ndash; [[Legacy:MiniSub (DX)|MiniSub (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYPoliceBoat (DX)|NYPoliceBoat (DX)]]
 |   |   +&amp;ndash; [[Legacy:Van (DX)|Van (DX)]]
 |   +&amp;ndash; [[Legacy:WashingtonDecoration (DX)|WashingtonDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHBookstandLibrary (DX)|WHBookstandLibrary (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHCabinet (DX)|WHCabinet (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHDeskLibrarySmall (DX)|WHDeskLibrarySmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHDeskOvalOffice (DX)|WHDeskOvalOffice (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHEndtableLibrary (DX)|WHEndtableLibrary (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHFireplaceGrill (DX)|WHFireplaceGrill (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHFireplaceLog (DX)|WHFireplaceLog (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHPhone (DX)|WHPhone (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHPiano (DX)|WHPiano (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedCandleabra (DX)|WHRedCandleabra (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedEagleTable (DX)|WHRedEagleTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedLampTable (DX)|WHRedLampTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedOvalTable (DX)|WHRedOvalTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedVase (DX)|WHRedVase (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHTableBlue (DX)|WHTableBlue (DX)]]
 |   +&amp;ndash; [[Legacy:WaterCooler (DX)|WaterCooler (DX)]]
 |   +&amp;ndash; [[Legacy:WaterFountain (DX)|WaterFountain (DX)]]
 +&amp;ndash; [[Legacy:ScaledSprite (DX)|ScaledSprite (DX)]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2788</id>
      <timestamp>2007-08-08T10:31:44Z</timestamp>
      <contributor>
        <ip>Dsl081-053-019.sfo1.dsl.speakeasy.net</ip>
      </contributor>
      <comment>*Decoration Class Tree (DX)</comment>
      <text xml:space="preserve"> [[Legacy:Decoration (DX)|Decoration (DX)]]
 +&amp;ndash; [[Legacy:Carcass (DX)|Carcass (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExCarcass (DX)|DeusExCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:AlexJacobsonCarcass (DX)|AlexJacobsonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:AnnaNavarreCarcass (DX)|AnnaNavarreCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BartenderCarcass (DX)|BartenderCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BoatPersonCarcass (DX)|BoatPersonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BobPageCarcass (DX)|BobPageCarcass (DX)]]
         [http://www.bestessaytips.com/ best essay tips]  
 |       +&amp;ndash; [[Legacy:BumFemaleCarcass (DX)|BumFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMale2Carcass (DX)|BumMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMale3Carcass (DX)|BumMale3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:BumMaleCarcass (DX)|BumMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman1Carcass (DX)|Businessman1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman2Carcass (DX)|Businessman2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businessman3Carcass (DX)|Businessman3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Businesswoman1Carcass (DX)|Businesswoman1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ButlerCarcass (DX)|ButlerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:CatCarcass (DX)|CatCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChadCarcass (DX)|ChadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChefCarcass (DX)|ChefCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChildMale2Carcass (DX)|ChildMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ChildMaleCarcass (DX)|ChildMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:CopCarcass (DX)|CopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:DobermanCarcass (DX)|DobermanCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:DoctorCarcass (DX)|DoctorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female1Carcass (DX)|Female1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female2Carcass (DX)|Female2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female3Carcass (DX)|Female3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Female4Carcass (DX)|Female4Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:FordSchickCarcass (DX)|FordSchickCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GarySavageCarcass (DX)|GarySavageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GilbertRentonCarcass (DX)|GilbertRentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GordonQuickCarcass (DX)|GordonQuickCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GrayCarcass (DX)|GrayCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GreaselCarcass (DX)|GreaselCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:GuntherHermannCarcass (DX)|GuntherHermannCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:HarleyFilbenCarcass (DX)|HarleyFilbenCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:HKMilitaryCarcass (DX)|HKMilitaryCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Hooker1Carcass (DX)|Hooker1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Hooker2Carcass (DX)|Hooker2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:HowardStrongCarcass (DX)|HowardStrongCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JaimeReyesCarcass (DX)|JaimeReyesCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JanitorCarcass (DX)|JanitorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JCDentonMaleCarcass (DX)|JCDentonMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JockCarcass (DX)|JockCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JoeGreeneCarcass (DX)|JoeGreeneCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JoJoFineCarcass (DX)|JoJoFineCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JordanSheaCarcass (DX)|JordanSheaCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JosephManderleyCarcass (DX)|JosephManderleyCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JuanLebedevCarcass (DX)|JuanLebedevCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JunkieFemaleCarcass (DX)|JunkieFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:JunkieMaleCarcass (DX)|JunkieMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:KarkianBabyCarcass (DX)|KarkianBabyCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:KarkianCarcass (DX)|KarkianCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassFemaleCarcass (DX)|LowerClassFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassMale2Carcass (DX)|LowerClassMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:LowerClassMaleCarcass (DX)|LowerClassMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaggieChowCarcass (DX)|MaggieChowCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaidCarcass (DX)|MaidCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male1Carcass (DX)|Male1Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male2Carcass (DX)|Male2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male3Carcass (DX)|Male3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:Male4Carcass (DX)|Male4Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:MargaretWilliamsCarcass (DX)|MargaretWilliamsCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MaxChenCarcass (DX)|MaxChenCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MechanicCarcass (DX)|MechanicCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MIBCarcass (DX)|MIBCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MichaelHamnerCarcass (DX)|MichaelHamnerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MJ12CommandoCarcass (DX)|MJ12CommandoCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MJ12TroopCarcass (DX)|MJ12TroopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MorganEverettCarcass (DX)|MorganEverettCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:MuttCarcass (DX)|MuttCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NathanMadisonCarcass (DX)|NathanMadisonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NicoletteDuClareCarcass (DX)|NicoletteDuClareCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:NurseCarcass (DX)|NurseCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PaulDentonCarcass (DX)|PaulDentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PhilipMeadCarcass (DX)|PhilipMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:PigeonCarcass (DX)|PigeonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RachelMeadCarcass (DX)|RachelMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RatCarcass (DX)|RatCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:RiotCopCarcass (DX)|RiotCopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SailorCarcass (DX)|SailorCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SamCarterCarcass (DX)|SamCarterCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SandraRentonCarcass (DX)|SandraRentonCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SarahMeadCarcass (DX)|SarahMeadCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScientistFemaleCarcass (DX)|ScientistFemaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScientistMaleCarcass (DX)|ScientistMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ScubaDiverCarcass (DX)|ScubaDiverCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SeagullCarcass (DX)|SeagullCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SecretaryCarcass (DX)|SecretaryCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SecretServiceCarcass (DX)|SecretServiceCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SmugglerCarcass (DX)|SmugglerCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:SoldierCarcass (DX)|SoldierCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:StantonDowdCarcass (DX)|StantonDowdCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TerroristCarcass (DX)|TerroristCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TerroristCommanderCarcass (DX)|TerroristCommanderCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMale2Carcass (DX)|ThugMale2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMale3Carcass (DX)|ThugMale3Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:ThugMaleCarcass (DX)|ThugMaleCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TiffanySavageCarcass (DX)|TiffanySavageCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TobyAtanweCarcass (DX)|TobyAtanweCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TracerTongCarcass (DX)|TracerTongCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadLumPath2Carcass (DX)|TriadLumPath2Carcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadLumPathCarcass (DX)|TriadLumPathCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:TriadRedArrowCarcass (DX)|TriadRedArrowCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:UNATCOTroopCarcass (DX)|UNATCOTroopCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:WaltonSimonsCarcass (DX)|WaltonSimonsCarcass (DX)]]
 |       +&amp;ndash; [[Legacy:WIBCarcass (DX)|WIBCarcass (DX)]]
 +&amp;ndash; [[Legacy:DeusExDecoration (DX)|DeusExDecoration (DX)]]
 |   +&amp;ndash; [[Legacy:AIPrototype (DX)|AIPrototype (DX)]]
 |   +&amp;ndash; [[Legacy:AlarmLight (DX)|AlarmLight (DX)]]
 |   +&amp;ndash; [[Legacy:AutoTurret (DX)|AutoTurret (DX)]]
 |   |   +&amp;ndash; [[Legacy:AutoTurretSmall (DX)|AutoTurretSmall (DX)]]
 |   +&amp;ndash; [[Legacy:Basketball (DX)|Basketball (DX)]]
 |   +&amp;ndash; [[Legacy:BobPageAugmented (DX)|BobPageAugmented (DX)]]
 |   +&amp;ndash; [[Legacy:BoneFemur (DX)|BoneFemur (DX)]]
 |   +&amp;ndash; [[Legacy:BoneSkull (DX)|BoneSkull (DX)]]
 |   +&amp;ndash; [[Legacy:Button1 (DX)|Button1 (DX)]]
 |   +&amp;ndash; [[Legacy:CageLight (DX)|CageLight (DX)]]
 |   +&amp;ndash; [[Legacy:Cart (DX)|Cart (DX)]]
 |   +&amp;ndash; [[Legacy:CeilingFan (DX)|CeilingFan (DX)]]
 |   +&amp;ndash; [[Legacy:CeilingFanMotor (DX)|CeilingFanMotor (DX)]]
 |   +&amp;ndash; [[Legacy:Containers (DX)|Containers (DX)]]
 |   |   +&amp;ndash; [[Legacy:AmmoCrate (DX)|AmmoCrate (DX)]]
 |   |   +&amp;ndash; [[Legacy:Barrel1 (DX)|Barrel1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelAmbrosia (DX)|BarrelAmbrosia (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelFire (DX)|BarrelFire (DX)]]
 |   |   +&amp;ndash; [[Legacy:BarrelVirus (DX)|BarrelVirus (DX)]]
 |   |   +&amp;ndash; [[Legacy:Basket (DX)|Basket (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxLarge (DX)|BoxLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxMedium (DX)|BoxMedium (DX)]]
 |   |   +&amp;ndash; [[Legacy:BoxSmall (DX)|BoxSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedCombat (DX)|CrateBreakableMedCombat (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedGeneral (DX)|CrateBreakableMedGeneral (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateBreakableMedMedical (DX)|CrateBreakableMedMedical (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateExplosiveSmall (DX)|CrateExplosiveSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableLarge (DX)|CrateUnbreakableLarge (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableMed (DX)|CrateUnbreakableMed (DX)]]
 |   |   +&amp;ndash; [[Legacy:CrateUnbreakableSmall (DX)|CrateUnbreakableSmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:Mailbox (DX)|Mailbox (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashbag (DX)|Trashbag (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashbag2 (DX)|Trashbag2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan1 (DX)|TrashCan1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Trashcan2 (DX)|Trashcan2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan3 (DX)|TrashCan3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashCan4 (DX)|TrashCan4 (DX)]]
 |   +&amp;ndash; [[Legacy:DentonClone (DX)|DentonClone (DX)]]
 |   +&amp;ndash; [[Legacy:ElectronicDevices (DX)|ElectronicDevices (DX)]]
 |   |   +&amp;ndash; [[Legacy:ATM (DX)|ATM (DX)]]
 |   |   +&amp;ndash; [[Legacy:CigaretteMachine (DX)|CigaretteMachine (DX)]]
 |   |   +&amp;ndash; [[Legacy:Computers (DX)|Computers (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerPersonal (DX)|ComputerPersonal (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerPublic (DX)|ComputerPublic (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ComputerSecurity (DX)|ComputerSecurity (DX)]]
 |   |   +&amp;ndash; [[Legacy:HackableDevices (DX)|HackableDevices (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AcousticSensor (DX)|AcousticSensor (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AlarmUnit (DX)|AlarmUnit (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:AutoTurretGun (DX)|AutoTurretGun (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:AutoTurretGunSmall (DX)|AutoTurretGunSmall (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:ControlPanel (DX)|ControlPanel (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Keypad (DX)|Keypad (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad1 (DX)|Keypad1 (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad2 (DX)|Keypad2 (DX)]]
 |   |   |   |   +&amp;ndash; [[Legacy:Keypad3 (DX)|Keypad3 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:RetinalScanner (DX)|RetinalScanner (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:SecurityCamera (DX)|SecurityCamera (DX)]]
 |   |   +&amp;ndash; [[Legacy:Phone (DX)|Phone (DX)]]
 |   |   +&amp;ndash; [[Legacy:Pinball (DX)|Pinball (DX)]]
 |   |   +&amp;ndash; [[Legacy:TAD (DX)|TAD (DX)]]
 |   |   +&amp;ndash; [[Legacy:VendingMachine (DX)|VendingMachine (DX)]]
 |   +&amp;ndash; [[Legacy:Fan1 (DX)|Fan1 (DX)]]
 |   +&amp;ndash; [[Legacy:Fan1Vertical (DX)|Fan1Vertical (DX)]]
 |   +&amp;ndash; [[Legacy:Fan2 (DX)|Fan2 (DX)]]
 |   +&amp;ndash; [[Legacy:Faucet (DX)|Faucet (DX)]]
 |   +&amp;ndash; [[Legacy:FlagPole (DX)|FlagPole (DX)]]
 |   +&amp;ndash; [[Legacy:Flask (DX)|Flask (DX)]]
 |   +&amp;ndash; [[Legacy:Flowers (DX)|Flowers (DX)]]
 |   +&amp;ndash; [[Legacy:Furniture (DX)|Furniture (DX)]]
 |   |   +&amp;ndash; [[Legacy:CoffeeTable (DX)|CoffeeTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cushion (DX)|Cushion (DX)]]
 |   |   +&amp;ndash; [[Legacy:Lamp (DX)|Lamp (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp1 (DX)|Lamp1 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp2 (DX)|Lamp2 (DX)]]
 |   |   |   +&amp;ndash; [[Legacy:Lamp3 (DX)|Lamp3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Seat (DX)|Seat (DX)]]
 |   |       +&amp;ndash; [[Legacy:Chair1 (DX)|Chair1 (DX)]]
 |   |       +&amp;ndash; [[Legacy:ChairLeather (DX)|ChairLeather (DX)]]
 |   |       +&amp;ndash; [[Legacy:CouchLeather (DX)|CouchLeather (DX)]]
 |   |       +&amp;ndash; [[Legacy:HKChair (DX)|HKChair (DX)]]
 |   |       +&amp;ndash; [[Legacy:HKCouch (DX)|HKCouch (DX)]]
 |   |       +&amp;ndash; [[Legacy:OfficeChair (DX)|OfficeChair (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHBenchEast (DX)|WHBenchEast (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHBenchLibrary (DX)|WHBenchLibrary (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairDining (DX)|WHChairDining (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairOvalOffice (DX)|WHChairOvalOffice (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHChairPink (DX)|WHChairPink (DX)]]
 |   |       +&amp;ndash; [[Legacy:WHRedCouch (DX)|WHRedCouch (DX)]]
 |   +&amp;ndash; [[Legacy:HangingDecoration (DX)|HangingDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:Chandelier (DX)|Chandelier (DX)]]
 |   |   +&amp;ndash; [[Legacy:ClothesRack (DX)|ClothesRack (DX)]]
 |   |   +&amp;ndash; [[Legacy:HangingChicken (DX)|HangingChicken (DX)]]
 |   |   +&amp;ndash; [[Legacy:HangingShopLight (DX)|HangingShopLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKBirdcage (DX)|HKBirdcage (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingLantern (DX)|HKHangingLantern (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingLantern2 (DX)|HKHangingLantern2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKHangingPig (DX)|HKHangingPig (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketLight (DX)|HKMarketLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:PoolTableLight (DX)|PoolTableLight (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrafficLight (DX)|TrafficLight (DX)]]
 |   +&amp;ndash; [[Legacy:HongKongDecoration (DX)|HongKongDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKBuddha (DX)|HKBuddha (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKIncenseBurner (DX)|HKIncenseBurner (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketTable (DX)|HKMarketTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKMarketTarp (DX)|HKMarketTarp (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKTable (DX)|HKTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:HKTukTuk (DX)|HKTukTuk (DX)]]
 |   +&amp;ndash; [[Legacy:InformationDevices (DX)|InformationDevices (DX)]]
 |   |   +&amp;ndash; [[Legacy:BookClosed (DX)|BookClosed (DX)]]
 |   |   +&amp;ndash; [[Legacy:BookOpen (DX)|BookOpen (DX)]]
 |   |   +&amp;ndash; [[Legacy:DataCube (DX)|DataCube (DX)]]
 |   |   +&amp;ndash; [[Legacy:Newspaper (DX)|Newspaper (DX)]]
 |   |   +&amp;ndash; [[Legacy:NewspaperOpen (DX)|NewspaperOpen (DX)]]
 |   +&amp;ndash; [[Legacy:LifeSupportBase (DX)|LifeSupportBase (DX)]]
 |   +&amp;ndash; [[Legacy:Lightbulb (DX)|Lightbulb (DX)]]
 |   +&amp;ndash; [[Legacy:LightSwitch (DX)|LightSwitch (DX)]]
 |   +&amp;ndash; [[Legacy:LuciusDeBeers (DX)|LuciusDeBeers (DX)]]
 |   +&amp;ndash; [[Legacy:Microscope (DX)|Microscope (DX)]]
 |   +&amp;ndash; [[Legacy:NewYorkDecoration (DX)|NewYorkDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYEagleStatue (DX)|NYEagleStatue (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLiberty (DX)|NYLiberty (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLibertyTop (DX)|NYLibertyTop (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYLibertyTorch (DX)|NYLibertyTorch (DX)]]
 |   +&amp;ndash; [[Legacy:OutdoorThings (DX)|OutdoorThings (DX)]]
 |   |   +&amp;ndash; [[Legacy:Buoy (DX)|Buoy (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes1 (DX)|Bushes1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes2 (DX)|Bushes2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Bushes3 (DX)|Bushes3 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cactus1 (DX)|Cactus1 (DX)]]
 |   |   +&amp;ndash; [[Legacy:Cactus2 (DX)|Cactus2 (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarBurned (DX)|CarBurned (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarStripped (DX)|CarStripped (DX)]]
 |   |   +&amp;ndash; [[Legacy:CarWrecked (DX)|CarWrecked (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXLogo (DX)|DXLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DXText (DX)|DXText (DX)]]
 |   |   +&amp;ndash; [[Legacy:Earth (DX)|Earth (DX)]]
 |   |   +&amp;ndash; [[Legacy:EidosLogo (DX)|EidosLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:FirePlug (DX)|FirePlug (DX)]]
 |   |   +&amp;ndash; [[Legacy:IonStormLogo (DX)|IonStormLogo (DX)]]
 |   |   +&amp;ndash; [[Legacy:Moon (DX)|Moon (DX)]]
 |   |   +&amp;ndash; [[Legacy:SatelliteDish (DX)|SatelliteDish (DX)]]
 |   |   +&amp;ndash; [[Legacy:StatueLion (DX)|StatueLion (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tree (DX)|Tree (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree1 (DX)|Tree1 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree2 (DX)|Tree2 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree3 (DX)|Tree3 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Tree4 (DX)|Tree4 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan1 (DX)|Pan1 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan2 (DX)|Pan2 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan3 (DX)|Pan3 (DX)]]
 |   +&amp;ndash; [[Legacy:Pan4 (DX)|Pan4 (DX)]]
 |   +&amp;ndash; [[Legacy:Pillow (DX)|Pillow (DX)]]
 |   +&amp;ndash; [[Legacy:Plant1 (DX)|Plant1 (DX)]]
 |   +&amp;ndash; [[Legacy:Plant2 (DX)|Plant2 (DX)]]
 |   +&amp;ndash; [[Legacy:Plant3 (DX)|Plant3 (DX)]]
 |   +&amp;ndash; [[Legacy:Poolball (DX)|Poolball (DX)]]
 |   +&amp;ndash; [[Legacy:Pot1 (DX)|Pot1 (DX)]]
 |   +&amp;ndash; [[Legacy:Pot2 (DX)|Pot2 (DX)]]
 |   +&amp;ndash; [[Legacy:RoadBlock (DX)|RoadBlock (DX)]]
 |   +&amp;ndash; [[Legacy:ShipsWheel (DX)|ShipsWheel (DX)]]
 |   +&amp;ndash; [[Legacy:ShopLight (DX)|ShopLight (DX)]]
 |   +&amp;ndash; [[Legacy:ShowerFaucet (DX)|ShowerFaucet (DX)]]
 |   +&amp;ndash; [[Legacy:ShowerHead (DX)|ShowerHead (DX)]]
 |   +&amp;ndash; [[Legacy:SignFloor (DX)|SignFloor (DX)]]
 |   +&amp;ndash; [[Legacy:SubwayControlPanel (DX)|SubwayControlPanel (DX)]]
 |   +&amp;ndash; [[Legacy:Switch1 (DX)|Switch1 (DX)]]
 |   +&amp;ndash; [[Legacy:Switch2 (DX)|Switch2 (DX)]]
 |   +&amp;ndash; [[Legacy:Toilet (DX)|Toilet (DX)]]
 |   +&amp;ndash; [[Legacy:Toilet2 (DX)|Toilet2 (DX)]]
 |   +&amp;ndash; [[Legacy:Trash (DX)|Trash (DX)]]
 |   |   +&amp;ndash; [[Legacy:TrashPaper (DX)|TrashPaper (DX)]]
 |   |   +&amp;ndash; [[Legacy:Tumbleweed (DX)|Tumbleweed (DX)]]
 |   +&amp;ndash; [[Legacy:Trophy (DX)|Trophy (DX)]]
 |   +&amp;ndash; [[Legacy:Valve (DX)|Valve (DX)]]
 |   +&amp;ndash; [[Legacy:Vase1 (DX)|Vase1 (DX)]]
 |   +&amp;ndash; [[Legacy:Vase2 (DX)|Vase2 (DX)]]
 |   +&amp;ndash; [[Legacy:Vehicles (DX)|Vehicles (DX)]]
 |   |   +&amp;ndash; [[Legacy:AttackHelicopter (DX)|AttackHelicopter (DX)]]
 |   |   +&amp;ndash; [[Legacy:BlackHelicopter (DX)|BlackHelicopter (DX)]]
 |   |   +&amp;ndash; [[Legacy:MiniSub (DX)|MiniSub (DX)]]
 |   |   +&amp;ndash; [[Legacy:NYPoliceBoat (DX)|NYPoliceBoat (DX)]]
 |   |   +&amp;ndash; [[Legacy:Van (DX)|Van (DX)]]
 |   +&amp;ndash; [[Legacy:WashingtonDecoration (DX)|WashingtonDecoration (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHBookstandLibrary (DX)|WHBookstandLibrary (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHCabinet (DX)|WHCabinet (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHDeskLibrarySmall (DX)|WHDeskLibrarySmall (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHDeskOvalOffice (DX)|WHDeskOvalOffice (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHEndtableLibrary (DX)|WHEndtableLibrary (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHFireplaceGrill (DX)|WHFireplaceGrill (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHFireplaceLog (DX)|WHFireplaceLog (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHPhone (DX)|WHPhone (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHPiano (DX)|WHPiano (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedCandleabra (DX)|WHRedCandleabra (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedEagleTable (DX)|WHRedEagleTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedLampTable (DX)|WHRedLampTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedOvalTable (DX)|WHRedOvalTable (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHRedVase (DX)|WHRedVase (DX)]]
 |   |   +&amp;ndash; [[Legacy:WHTableBlue (DX)|WHTableBlue (DX)]]
 |   +&amp;ndash; [[Legacy:WaterCooler (DX)|WaterCooler (DX)]]
 |   +&amp;ndash; [[Legacy:WaterFountain (DX)|WaterFountain (DX)]]
 +&amp;ndash; [[Legacy:ScaledSprite (DX)|ScaledSprite (DX)]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>39971</id>
      <timestamp>2009-11-14T18:53:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>delinked non-existing pages to cut down the number of wanted pages</comment>
      <text xml:space="preserve"> [[Legacy:Decoration (DX)|Decoration]]
 +- Carcass
 |   +- DeusExCarcass
 |       +- AlexJacobsonCarcass
 |       +- AnnaNavarreCarcass
 |       +- BartenderCarcass
 |       +- BoatPersonCarcass
 |       +- BobPageCarcass
 |       +- BumFemaleCarcass
 |       +- BumMale2Carcass
 |       +- BumMale3Carcass
 |       +- BumMaleCarcass
 |       +- Businessman1Carcass
 |       +- Businessman2Carcass
 |       +- Businessman3Carcass
 |       +- Businesswoman1Carcass
 |       +- ButlerCarcass
 |       +- CatCarcass
 |       +- ChadCarcass
 |       +- ChefCarcass
 |       +- ChildMale2Carcass
 |       +- ChildMaleCarcass
 |       +- CopCarcass
 |       +- DobermanCarcass
 |       +- DoctorCarcass
 |       +- Female1Carcass
 |       +- Female2Carcass
 |       +- Female3Carcass
 |       +- Female4Carcass
 |       +- FordSchickCarcass
 |       +- GarySavageCarcass
 |       +- GilbertRentonCarcass
 |       +- GordonQuickCarcass
 |       +- GrayCarcass
 |       +- GreaselCarcass
 |       +- GuntherHermannCarcass
 |       +- HarleyFilbenCarcass
 |       +- HKMilitaryCarcass
 |       +- Hooker1Carcass
 |       +- Hooker2Carcass
 |       +- HowardStrongCarcass
 |       +- JaimeReyesCarcass
 |       +- JanitorCarcass
 |       +- JCDentonMaleCarcass
 |       +- JockCarcass
 |       +- JoeGreeneCarcass
 |       +- JoJoFineCarcass
 |       +- JordanSheaCarcass
 |       +- JosephManderleyCarcass
 |       +- JuanLebedevCarcass
 |       +- JunkieFemaleCarcass
 |       +- JunkieMaleCarcass
 |       +- KarkianBabyCarcass
 |       +- KarkianCarcass
 |       +- LowerClassFemaleCarcass
 |       +- LowerClassMale2Carcass
 |       +- LowerClassMaleCarcass
 |       +- MaggieChowCarcass
 |       +- MaidCarcass
 |       +- Male1Carcass
 |       +- Male2Carcass
 |       +- Male3Carcass
 |       +- Male4Carcass
 |       +- MargaretWilliamsCarcass
 |       +- MaxChenCarcass
 |       +- MechanicCarcass
 |       +- MIBCarcass
 |       +- MichaelHamnerCarcass
 |       +- MJ12CommandoCarcass
 |       +- MJ12TroopCarcass
 |       +- MorganEverettCarcass
 |       +- MuttCarcass
 |       +- NathanMadisonCarcass
 |       +- NicoletteDuClareCarcass
 |       +- NurseCarcass
 |       +- PaulDentonCarcass
 |       +- PhilipMeadCarcass
 |       +- PigeonCarcass
 |       +- RachelMeadCarcass
 |       +- RatCarcass
 |       +- RiotCopCarcass
 |       +- SailorCarcass
 |       +- SamCarterCarcass
 |       +- SandraRentonCarcass
 |       +- SarahMeadCarcass
 |       +- ScientistFemaleCarcass
 |       +- ScientistMaleCarcass
 |       +- ScubaDiverCarcass
 |       +- SeagullCarcass
 |       +- SecretaryCarcass
 |       +- SecretServiceCarcass
 |       +- SmugglerCarcass
 |       +- SoldierCarcass
 |       +- StantonDowdCarcass
 |       +- TerroristCarcass
 |       +- TerroristCommanderCarcass
 |       +- ThugMale2Carcass
 |       +- ThugMale3Carcass
 |       +- ThugMaleCarcass
 |       +- TiffanySavageCarcass
 |       +- TobyAtanweCarcass
 |       +- TracerTongCarcass
 |       +- TriadLumPath2Carcass
 |       +- TriadLumPathCarcass
 |       +- TriadRedArrowCarcass
 |       +- UNATCOTroopCarcass
 |       +- WaltonSimonsCarcass
 |       +- WIBCarcass
 +- DeusExDecoration
 |   +- AIPrototype
 |   +- AlarmLight
 |   +- AutoTurret
 |   |   +- AutoTurretSmall
 |   +- Basketball
 |   +- BobPageAugmented
 |   +- BoneFemur
 |   +- BoneSkull
 |   +- Button1
 |   +- CageLight
 |   +- Cart
 |   +- CeilingFan
 |   +- CeilingFanMotor
 |   +- Containers
 |   |   +- AmmoCrate
 |   |   +- Barrel1
 |   |   +- BarrelAmbrosia
 |   |   +- BarrelFire
 |   |   +- BarrelVirus
 |   |   +- Basket
 |   |   +- BoxLarge
 |   |   +- BoxMedium
 |   |   +- BoxSmall
 |   |   +- CrateBreakableMedCombat
 |   |   +- CrateBreakableMedGeneral
 |   |   +- CrateBreakableMedMedical
 |   |   +- CrateExplosiveSmall
 |   |   +- CrateUnbreakableLarge
 |   |   +- CrateUnbreakableMed
 |   |   +- CrateUnbreakableSmall
 |   |   +- Mailbox
 |   |   +- Trashbag
 |   |   +- Trashbag2
 |   |   +- TrashCan1
 |   |   +- Trashcan2
 |   |   +- TrashCan3
 |   |   +- TrashCan4
 |   +- DentonClone
 |   +- ElectronicDevices
 |   |   +- ATM
 |   |   +- CigaretteMachine
 |   |   +- Computers
 |   |   |   +- [[Legacy:ComputerPersonal (DX)|ComputerPersonal]]
 |   |   |   +- ComputerPublic
 |   |   |   +- ComputerSecurity
 |   |   +- HackableDevices
 |   |   |   +- AcousticSensor
 |   |   |   +- AlarmUnit
 |   |   |   +- AutoTurretGun
 |   |   |   |   +- AutoTurretGunSmall
 |   |   |   +- ControlPanel
 |   |   |   +- Keypad
 |   |   |   |   +- Keypad1
 |   |   |   |   +- Keypad2
 |   |   |   |   +- Keypad3
 |   |   |   +- RetinalScanner
 |   |   |   +- SecurityCamera
 |   |   +- Phone
 |   |   +- Pinball
 |   |   +- TAD
 |   |   +- VendingMachine
 |   +- Fan1
 |   +- Fan1Vertical
 |   +- Fan2
 |   +- Faucet
 |   +- FlagPole
 |   +- Flask
 |   +- Flowers
 |   +- Furniture
 |   |   +- CoffeeTable
 |   |   +- Cushion
 |   |   +- Lamp
 |   |   |   +- Lamp1
 |   |   |   +- Lamp2
 |   |   |   +- Lamp3
 |   |   +- Seat
 |   |       +- Chair1
 |   |       +- ChairLeather
 |   |       +- CouchLeather
 |   |       +- HKChair
 |   |       +- HKCouch
 |   |       +- OfficeChair
 |   |       +- WHBenchEast
 |   |       +- WHBenchLibrary
 |   |       +- WHChairDining
 |   |       +- WHChairOvalOffice
 |   |       +- WHChairPink
 |   |       +- WHRedCouch
 |   +- HangingDecoration
 |   |   +- Chandelier
 |   |   +- ClothesRack
 |   |   +- HangingChicken
 |   |   +- HangingShopLight
 |   |   +- HKBirdcage
 |   |   +- HKHangingLantern
 |   |   +- HKHangingLantern2
 |   |   +- HKHangingPig
 |   |   +- HKMarketLight
 |   |   +- PoolTableLight
 |   |   +- TrafficLight
 |   +- HongKongDecoration
 |   |   +- HKBuddha
 |   |   +- HKIncenseBurner
 |   |   +- HKMarketTable
 |   |   +- HKMarketTarp
 |   |   +- HKTable
 |   |   +- HKTukTuk
 |   +- InformationDevices
 |   |   +- BookClosed
 |   |   +- BookOpen
 |   |   +- DataCube
 |   |   +- Newspaper
 |   |   +- NewspaperOpen
 |   +- LifeSupportBase
 |   +- Lightbulb
 |   +- LightSwitch
 |   +- LuciusDeBeers
 |   +- Microscope
 |   +- NewYorkDecoration
 |   |   +- NYEagleStatue
 |   |   +- NYLiberty
 |   |   +- NYLibertyTop
 |   |   +- NYLibertyTorch
 |   +- OutdoorThings
 |   |   +- Buoy
 |   |   +- Bushes1
 |   |   +- Bushes2
 |   |   +- Bushes3
 |   |   +- Cactus1
 |   |   +- Cactus2
 |   |   +- CarBurned
 |   |   +- CarStripped
 |   |   +- CarWrecked
 |   |   +- DXLogo
 |   |   +- DXText
 |   |   +- Earth
 |   |   +- EidosLogo
 |   |   +- FirePlug
 |   |   +- IonStormLogo
 |   |   +- Moon
 |   |   +- SatelliteDish
 |   |   +- StatueLion
 |   |   +- Tree
 |   |       +- Tree1
 |   |       +- Tree2
 |   |       +- Tree3
 |   |       +- Tree4
 |   +- Pan1
 |   +- Pan2
 |   +- Pan3
 |   +- Pan4
 |   +- Pillow
 |   +- Plant1
 |   +- Plant2
 |   +- Plant3
 |   +- Poolball
 |   +- Pot1
 |   +- Pot2
 |   +- RoadBlock
 |   +- ShipsWheel
 |   +- ShopLight
 |   +- ShowerFaucet
 |   +- ShowerHead
 |   +- SignFloor
 |   +- SubwayControlPanel
 |   +- Switch1
 |   +- Switch2
 |   +- Toilet
 |   +- Toilet2
 |   +- Trash
 |   |   +- TrashPaper
 |   |   +- Tumbleweed
 |   +- Trophy
 |   +- Valve
 |   +- Vase1
 |   +- Vase2
 |   +- Vehicles
 |   |   +- AttackHelicopter
 |   |   +- BlackHelicopter
 |   |   +- MiniSub
 |   |   +- NYPoliceBoat
 |   |   +- Van
 |   +- WashingtonDecoration
 |   |   +- WHBookstandLibrary
 |   |   +- WHCabinet
 |   |   +- WHDeskLibrarySmall
 |   |   +- WHDeskOvalOffice
 |   |   +- WHEndtableLibrary
 |   |   +- WHFireplaceGrill
 |   |   +- WHFireplaceLog
 |   |   +- WHPhone
 |   |   +- WHPiano
 |   |   +- WHRedCandleabra
 |   |   +- WHRedEagleTable
 |   |   +- WHRedLampTable
 |   |   +- WHRedOvalTable
 |   |   +- WHRedVase
 |   |   +- WHTableBlue
 |   +- WaterCooler
 |   +- WaterFountain
 +- ScaledSprite

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43323</id>
      <timestamp>2010-05-21T17:04:13Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve"> [[Legacy:Decoration (DX)|Decoration]]
 +- Carcass
 |   +- DeusExCarcass
 |       +- AlexJacobsonCarcass
 |       +- AnnaNavarreCarcass
 |       +- BartenderCarcass
 |       +- BoatPersonCarcass
 |       +- BobPageCarcass
 |       +- BumFemaleCarcass
 |       +- BumMale2Carcass
 |       +- BumMale3Carcass
 |       +- BumMaleCarcass
 |       +- Businessman1Carcass
 |       +- Businessman2Carcass
 |       +- Businessman3Carcass
 |       +- Businesswoman1Carcass
 |       +- ButlerCarcass
 |       +- CatCarcass
 |       +- ChadCarcass
 |       +- ChefCarcass
 |       +- ChildMale2Carcass
 |       +- ChildMaleCarcass
 |       +- CopCarcass
 |       +- DobermanCarcass
 |       +- DoctorCarcass
 |       +- Female1Carcass
 |       +- Female2Carcass
 |       +- Female3Carcass
 |       +- Female4Carcass
 |       +- FordSchickCarcass
 |       +- GarySavageCarcass
 |       +- GilbertRentonCarcass
 |       +- GordonQuickCarcass
 |       +- GrayCarcass
 |       +- GreaselCarcass
 |       +- GuntherHermannCarcass
 |       +- HarleyFilbenCarcass
 |       +- HKMilitaryCarcass
 |       +- Hooker1Carcass
 |       +- Hooker2Carcass
 |       +- HowardStrongCarcass
 |       +- JaimeReyesCarcass
 |       +- JanitorCarcass
 |       +- JCDentonMaleCarcass
 |       +- JockCarcass
 |       +- JoeGreeneCarcass
 |       +- JoJoFineCarcass
 |       +- JordanSheaCarcass
 |       +- JosephManderleyCarcass
 |       +- JuanLebedevCarcass
 |       +- JunkieFemaleCarcass
 |       +- JunkieMaleCarcass
 |       +- KarkianBabyCarcass
 |       +- KarkianCarcass
 |       +- LowerClassFemaleCarcass
 |       +- LowerClassMale2Carcass
 |       +- LowerClassMaleCarcass
 |       +- MaggieChowCarcass
 |       +- MaidCarcass
 |       +- Male1Carcass
 |       +- Male2Carcass
 |       +- Male3Carcass
 |       +- Male4Carcass
 |       +- MargaretWilliamsCarcass
 |       +- MaxChenCarcass
 |       +- MechanicCarcass
 |       +- MIBCarcass
 |       +- MichaelHamnerCarcass
 |       +- MJ12CommandoCarcass
 |       +- MJ12TroopCarcass
 |       +- MorganEverettCarcass
 |       +- MuttCarcass
 |       +- NathanMadisonCarcass
 |       +- NicoletteDuClareCarcass
 |       +- NurseCarcass
 |       +- PaulDentonCarcass
 |       +- PhilipMeadCarcass
 |       +- PigeonCarcass
 |       +- RachelMeadCarcass
 |       +- RatCarcass
 |       +- RiotCopCarcass
 |       +- SailorCarcass
 |       +- SamCarterCarcass
 |       +- SandraRentonCarcass
 |       +- SarahMeadCarcass
 |       +- ScientistFemaleCarcass
 |       +- ScientistMaleCarcass
 |       +- ScubaDiverCarcass
 |       +- SeagullCarcass
 |       +- SecretaryCarcass
 |       +- SecretServiceCarcass
 |       +- SmugglerCarcass
 |       +- SoldierCarcass
 |       +- StantonDowdCarcass
 |       +- TerroristCarcass
 |       +- TerroristCommanderCarcass
 |       +- ThugMale2Carcass
 |       +- ThugMale3Carcass
 |       +- ThugMaleCarcass
 |       +- TiffanySavageCarcass
 |       +- TobyAtanweCarcass
 |       +- TracerTongCarcass
 |       +- TriadLumPath2Carcass
 |       +- TriadLumPathCarcass
 |       +- TriadRedArrowCarcass
 |       +- UNATCOTroopCarcass
 |       +- WaltonSimonsCarcass
 |       +- WIBCarcass
 +- DeusExDecoration
 |   +- AIPrototype
 |   +- AlarmLight
 |   +- AutoTurret
 |   |   +- AutoTurretSmall
 |   +- Basketball
 |   +- BobPageAugmented
 |   +- BoneFemur
 |   +- BoneSkull
 |   +- Button1
 |   +- CageLight
 |   +- Cart
 |   +- CeilingFan
 |   +- CeilingFanMotor
 |   +- Containers
 |   |   +- AmmoCrate
 |   |   +- Barrel1
 |   |   +- BarrelAmbrosia
 |   |   +- BarrelFire
 |   |   +- BarrelVirus
 |   |   +- Basket
 |   |   +- BoxLarge
 |   |   +- BoxMedium
 |   |   +- BoxSmall
 |   |   +- CrateBreakableMedCombat
 |   |   +- CrateBreakableMedGeneral
 |   |   +- CrateBreakableMedMedical
 |   |   +- CrateExplosiveSmall
 |   |   +- CrateUnbreakableLarge
 |   |   +- CrateUnbreakableMed
 |   |   +- CrateUnbreakableSmall
 |   |   +- Mailbox
 |   |   +- Trashbag
 |   |   +- Trashbag2
 |   |   +- TrashCan1
 |   |   +- Trashcan2
 |   |   +- TrashCan3
 |   |   +- TrashCan4
 |   +- DentonClone
 |   +- ElectronicDevices
 |   |   +- ATM
 |   |   +- CigaretteMachine
 |   |   +- Computers
 |   |   |   +- [[Legacy:ComputerPersonal (DX)|ComputerPersonal]]
 |   |   |   +- ComputerPublic
 |   |   |   +- ComputerSecurity
 |   |   +- HackableDevices
 |   |   |   +- AcousticSensor
 |   |   |   +- AlarmUnit
 |   |   |   +- AutoTurretGun
 |   |   |   |   +- AutoTurretGunSmall
 |   |   |   +- ControlPanel
 |   |   |   +- Keypad
 |   |   |   |   +- Keypad1
 |   |   |   |   +- Keypad2
 |   |   |   |   +- Keypad3
 |   |   |   +- RetinalScanner
 |   |   |   +- SecurityCamera
 |   |   +- Phone
 |   |   +- Pinball
 |   |   +- TAD
 |   |   +- VendingMachine
 |   +- Fan1
 |   +- Fan1Vertical
 |   +- Fan2
 |   +- Faucet
 |   +- FlagPole
 |   +- Flask
 |   +- Flowers
 |   +- Furniture
 |   |   +- CoffeeTable
 |   |   +- Cushion
 |   |   +- Lamp
 |   |   |   +- Lamp1
 |   |   |   +- Lamp2
 |   |   |   +- Lamp3
 |   |   +- Seat
 |   |       +- Chair1
 |   |       +- ChairLeather
 |   |       +- CouchLeather
 |   |       +- HKChair
 |   |       +- HKCouch
 |   |       +- OfficeChair
 |   |       +- WHBenchEast
 |   |       +- WHBenchLibrary
 |   |       +- WHChairDining
 |   |       +- WHChairOvalOffice
 |   |       +- WHChairPink
 |   |       +- WHRedCouch
 |   +- HangingDecoration
 |   |   +- Chandelier
 |   |   +- ClothesRack
 |   |   +- HangingChicken
 |   |   +- HangingShopLight
 |   |   +- HKBirdcage
 |   |   +- HKHangingLantern
 |   |   +- HKHangingLantern2
 |   |   +- HKHangingPig
 |   |   +- HKMarketLight
 |   |   +- PoolTableLight
 |   |   +- TrafficLight
 |   +- HongKongDecoration
 |   |   +- HKBuddha
 |   |   +- HKIncenseBurner
 |   |   +- HKMarketTable
 |   |   +- HKMarketTarp
 |   |   +- HKTable
 |   |   +- HKTukTuk
 |   +- InformationDevices
 |   |   +- BookClosed
 |   |   +- BookOpen
 |   |   +- DataCube
 |   |   +- Newspaper
 |   |   +- NewspaperOpen
 |   +- LifeSupportBase
 |   +- Lightbulb
 |   +- LightSwitch
 |   +- LuciusDeBeers
 |   +- Microscope
 |   +- NewYorkDecoration
 |   |   +- NYEagleStatue
 |   |   +- NYLiberty
 |   |   +- NYLibertyTop
 |   |   +- NYLibertyTorch
 |   +- OutdoorThings
 |   |   +- Buoy
 |   |   +- Bushes1
 |   |   +- Bushes2
 |   |   +- Bushes3
 |   |   +- Cactus1
 |   |   +- Cactus2
 |   |   +- CarBurned
 |   |   +- CarStripped
 |   |   +- CarWrecked
 |   |   +- DXLogo
 |   |   +- DXText
 |   |   +- Earth
 |   |   +- EidosLogo
 |   |   +- FirePlug
 |   |   +- IonStormLogo
 |   |   +- Moon
 |   |   +- SatelliteDish
 |   |   +- StatueLion
 |   |   +- Tree
 |   |       +- Tree1
 |   |       +- Tree2
 |   |       +- Tree3
 |   |       +- Tree4
 |   +- Pan1
 |   +- Pan2
 |   +- Pan3
 |   +- Pan4
 |   +- Pillow
 |   +- Plant1
 |   +- Plant2
 |   +- Plant3
 |   +- Poolball
 |   +- Pot1
 |   +- Pot2
 |   +- RoadBlock
 |   +- ShipsWheel
 |   +- ShopLight
 |   +- ShowerFaucet
 |   +- ShowerHead
 |   +- SignFloor
 |   +- SubwayControlPanel
 |   +- Switch1
 |   +- Switch2
 |   +- Toilet
 |   +- Toilet2
 |   +- Trash
 |   |   +- TrashPaper
 |   |   +- Tumbleweed
 |   +- Trophy
 |   +- Valve
 |   +- Vase1
 |   +- Vase2
 |   +- Vehicles
 |   |   +- AttackHelicopter
 |   |   +- BlackHelicopter
 |   |   +- MiniSub
 |   |   +- NYPoliceBoat
 |   |   +- Van
 |   +- WashingtonDecoration
 |   |   +- WHBookstandLibrary
 |   |   +- WHCabinet
 |   |   +- WHDeskLibrarySmall
 |   |   +- WHDeskOvalOffice
 |   |   +- WHEndtableLibrary
 |   |   +- WHFireplaceGrill
 |   |   +- WHFireplaceLog
 |   |   +- WHPhone
 |   |   +- WHPiano
 |   |   +- WHRedCandleabra
 |   |   +- WHRedEagleTable
 |   |   +- WHRedLampTable
 |   |   +- WHRedOvalTable
 |   |   +- WHRedVase
 |   |   +- WHTableBlue
 |   +- WaterCooler [http://www.bestessaytips.com best essay tips]
 |   +- WaterFountain
 +- ScaledSprite

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43337</id>
      <timestamp>2010-05-22T04:23:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve"> [[Legacy:Decoration (DX)|Decoration]]
 +- Carcass
 |   +- DeusExCarcass
 |       +- AlexJacobsonCarcass
 |       +- AnnaNavarreCarcass
 |       +- BartenderCarcass
 |       +- BoatPersonCarcass
 |       +- BobPageCarcass
 |       +- BumFemaleCarcass
 |       +- BumMale2Carcass
 |       +- BumMale3Carcass
 |       +- BumMaleCarcass
 |       +- Businessman1Carcass
 |       +- Businessman2Carcass
 |       +- Businessman3Carcass
 |       +- Businesswoman1Carcass
 |       +- ButlerCarcass
 |       +- CatCarcass
 |       +- ChadCarcass
 |       +- ChefCarcass
 |       +- ChildMale2Carcass
 |       +- ChildMaleCarcass
 |       +- CopCarcass
 |       +- DobermanCarcass
 |       +- DoctorCarcass
 |       +- Female1Carcass
 |       +- Female2Carcass
 |       +- Female3Carcass
 |       +- Female4Carcass
 |       +- FordSchickCarcass
 |       +- GarySavageCarcass
 |       +- GilbertRentonCarcass
 |       +- GordonQuickCarcass
 |       +- GrayCarcass
 |       +- GreaselCarcass
 |       +- GuntherHermannCarcass
 |       +- HarleyFilbenCarcass
 |       +- HKMilitaryCarcass
 |       +- Hooker1Carcass
 |       +- Hooker2Carcass
 |       +- HowardStrongCarcass
 |       +- JaimeReyesCarcass
 |       +- JanitorCarcass
 |       +- JCDentonMaleCarcass
 |       +- JockCarcass
 |       +- JoeGreeneCarcass
 |       +- JoJoFineCarcass
 |       +- JordanSheaCarcass
 |       +- JosephManderleyCarcass
 |       +- JuanLebedevCarcass
 |       +- JunkieFemaleCarcass
 |       +- JunkieMaleCarcass
 |       +- KarkianBabyCarcass
 |       +- KarkianCarcass
 |       +- LowerClassFemaleCarcass
 |       +- LowerClassMale2Carcass
 |       +- LowerClassMaleCarcass
 |       +- MaggieChowCarcass
 |       +- MaidCarcass
 |       +- Male1Carcass
 |       +- Male2Carcass
 |       +- Male3Carcass
 |       +- Male4Carcass
 |       +- MargaretWilliamsCarcass
 |       +- MaxChenCarcass
 |       +- MechanicCarcass
 |       +- MIBCarcass
 |       +- MichaelHamnerCarcass
 |       +- MJ12CommandoCarcass
 |       +- MJ12TroopCarcass
 |       +- MorganEverettCarcass
 |       +- MuttCarcass
 |       +- NathanMadisonCarcass
 |       +- NicoletteDuClareCarcass
 |       +- NurseCarcass
 |       +- PaulDentonCarcass
 |       +- PhilipMeadCarcass
 |       +- PigeonCarcass
 |       +- RachelMeadCarcass
 |       +- RatCarcass
 |       +- RiotCopCarcass
 |       +- SailorCarcass
 |       +- SamCarterCarcass
 |       +- SandraRentonCarcass
 |       +- SarahMeadCarcass
 |       +- ScientistFemaleCarcass
 |       +- ScientistMaleCarcass
 |       +- ScubaDiverCarcass
 |       +- SeagullCarcass
 |       +- SecretaryCarcass
 |       +- SecretServiceCarcass
 |       +- SmugglerCarcass
 |       +- SoldierCarcass
 |       +- StantonDowdCarcass
 |       +- TerroristCarcass
 |       +- TerroristCommanderCarcass
 |       +- ThugMale2Carcass
 |       +- ThugMale3Carcass
 |       +- ThugMaleCarcass
 |       +- TiffanySavageCarcass
 |       +- TobyAtanweCarcass
 |       +- TracerTongCarcass
 |       +- TriadLumPath2Carcass
 |       +- TriadLumPathCarcass
 |       +- TriadRedArrowCarcass
 |       +- UNATCOTroopCarcass
 |       +- WaltonSimonsCarcass
 |       +- WIBCarcass
 +- DeusExDecoration
 |   +- AIPrototype
 |   +- AlarmLight
 |   +- AutoTurret
 |   |   +- AutoTurretSmall
 |   +- Basketball
 |   +- BobPageAugmented
 |   +- BoneFemur
 |   +- BoneSkull
 |   +- Button1
 |   +- CageLight
 |   +- Cart
 |   +- CeilingFan
 |   +- CeilingFanMotor
 |   +- Containers
 |   |   +- AmmoCrate
 |   |   +- Barrel1
 |   |   +- BarrelAmbrosia
 |   |   +- BarrelFire
 |   |   +- BarrelVirus
 |   |   +- Basket
 |   |   +- BoxLarge
 |   |   +- BoxMedium
 |   |   +- BoxSmall
 |   |   +- CrateBreakableMedCombat
 |   |   +- CrateBreakableMedGeneral
 |   |   +- CrateBreakableMedMedical
 |   |   +- CrateExplosiveSmall
 |   |   +- CrateUnbreakableLarge
 |   |   +- CrateUnbreakableMed
 |   |   +- CrateUnbreakableSmall
 |   |   +- Mailbox
 |   |   +- Trashbag
 |   |   +- Trashbag2
 |   |   +- TrashCan1
 |   |   +- Trashcan2
 |   |   +- TrashCan3
 |   |   +- TrashCan4
 |   +- DentonClone
 |   +- ElectronicDevices
 |   |   +- ATM
 |   |   +- CigaretteMachine
 |   |   +- Computers
 |   |   |   +- [[Legacy:ComputerPersonal (DX)|ComputerPersonal]]
 |   |   |   +- ComputerPublic
 |   |   |   +- ComputerSecurity
 |   |   +- HackableDevices
 |   |   |   +- AcousticSensor
 |   |   |   +- AlarmUnit
 |   |   |   +- AutoTurretGun
 |   |   |   |   +- AutoTurretGunSmall
 |   |   |   +- ControlPanel
 |   |   |   +- Keypad
 |   |   |   |   +- Keypad1
 |   |   |   |   +- Keypad2
 |   |   |   |   +- Keypad3
 |   |   |   +- RetinalScanner
 |   |   |   +- SecurityCamera
 |   |   +- Phone
 |   |   +- Pinball
 |   |   +- TAD
 |   |   +- VendingMachine
 |   +- Fan1
 |   +- Fan1Vertical
 |   +- Fan2
 |   +- Faucet
 |   +- FlagPole
 |   +- Flask
 |   +- Flowers
 |   +- Furniture
 |   |   +- CoffeeTable
 |   |   +- Cushion
 |   |   +- Lamp
 |   |   |   +- Lamp1
 |   |   |   +- Lamp2
 |   |   |   +- Lamp3
 |   |   +- Seat
 |   |       +- Chair1
 |   |       +- ChairLeather
 |   |       +- CouchLeather
 |   |       +- HKChair
 |   |       +- HKCouch
 |   |       +- OfficeChair
 |   |       +- WHBenchEast
 |   |       +- WHBenchLibrary
 |   |       +- WHChairDining
 |   |       +- WHChairOvalOffice
 |   |       +- WHChairPink
 |   |       +- WHRedCouch
 |   +- HangingDecoration
 |   |   +- Chandelier
 |   |   +- ClothesRack
 |   |   +- HangingChicken
 |   |   +- HangingShopLight
 |   |   +- HKBirdcage
 |   |   +- HKHangingLantern
 |   |   +- HKHangingLantern2
 |   |   +- HKHangingPig
 |   |   +- HKMarketLight
 |   |   +- PoolTableLight
 |   |   +- TrafficLight
 |   +- HongKongDecoration
 |   |   +- HKBuddha
 |   |   +- HKIncenseBurner
 |   |   +- HKMarketTable
 |   |   +- HKMarketTarp
 |   |   +- HKTable
 |   |   +- HKTukTuk
 |   +- InformationDevices
 |   |   +- BookClosed
 |   |   +- BookOpen
 |   |   +- DataCube
 |   |   +- Newspaper
 |   |   +- NewspaperOpen
 |   +- LifeSupportBase
 |   +- Lightbulb
 |   +- LightSwitch
 |   +- LuciusDeBeers
 |   +- Microscope
 |   +- NewYorkDecoration
 |   |   +- NYEagleStatue
 |   |   +- NYLiberty
 |   |   +- NYLibertyTop
 |   |   +- NYLibertyTorch
 |   +- OutdoorThings
 |   |   +- Buoy
 |   |   +- Bushes1
 |   |   +- Bushes2
 |   |   +- Bushes3
 |   |   +- Cactus1
 |   |   +- Cactus2
 |   |   +- CarBurned
 |   |   +- CarStripped
 |   |   +- CarWrecked
 |   |   +- DXLogo
 |   |   +- DXText
 |   |   +- Earth
 |   |   +- EidosLogo
 |   |   +- FirePlug
 |   |   +- IonStormLogo
 |   |   +- Moon
 |   |   +- SatelliteDish
 |   |   +- StatueLion
 |   |   +- Tree
 |   |       +- Tree1
 |   |       +- Tree2
 |   |       +- Tree3
 |   |       +- Tree4
 |   +- Pan1
 |   +- Pan2
 |   +- Pan3
 |   +- Pan4
 |   +- Pillow
 |   +- Plant1
 |   +- Plant2
 |   +- Plant3
 |   +- Poolball
 |   +- Pot1
 |   +- Pot2
 |   +- RoadBlock
 |   +- ShipsWheel
 |   +- ShopLight
 |   +- ShowerFaucet
 |   +- ShowerHead
 |   +- SignFloor
 |   +- SubwayControlPanel
 |   +- Switch1
 |   +- Switch2
 |   +- Toilet
 |   +- Toilet2
 |   +- Trash
 |   |   +- TrashPaper
 |   |   +- Tumbleweed
 |   +- Trophy
 |   +- Valve
 |   +- Vase1
 |   +- Vase2
 |   +- Vehicles
 |   |   +- AttackHelicopter
 |   |   +- BlackHelicopter
 |   |   +- MiniSub
 |   |   +- NYPoliceBoat
 |   |   +- Van
 |   +- WashingtonDecoration
 |   |   +- WHBookstandLibrary
 |   |   +- WHCabinet
 |   |   +- WHDeskLibrarySmall
 |   |   +- WHDeskOvalOffice
 |   |   +- WHEndtableLibrary
 |   |   +- WHFireplaceGrill
 |   |   +- WHFireplaceLog
 |   |   +- WHPhone
 |   |   +- WHPiano
 |   |   +- WHRedCandleabra
 |   |   +- WHRedEagleTable
 |   |   +- WHRedLampTable
 |   |   +- WHRedOvalTable
 |   |   +- WHRedVase
 |   |   +- WHTableBlue
 |   +- WaterCooler
 |   +- WaterFountain
 +- ScaledSprite

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DecorationList</title>
    <id>1076</id>
    <revision>
      <id>2856</id>
      <timestamp>2005-04-09T12:49:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; DecorationList (Package: Engine)}}

Defines a list of [[Legacy:Decoration|Decoration]]s which can be placed in a level and attached to volumes. To attach a list to a [[Legacy:Volume|Volume]], set its ''DecoList'' property to the desired ''DecorationList''.

''What does this mean? What will the volume do?''

==Properties==

===List Group===
; array&lt;DecorationType&gt; Decorations : The decorations in this list.

==Structs==

===DecorationType===
; int bAlign :
; int bRandomPitch :
; int bRandomRoll :
; int bRandomYaw :
; range Count :
; range DrawScale :
; [[Legacy:StaticMesh|StaticMesh]] StaticMesh :

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2857</id>
      <timestamp>2005-04-09T08:49:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; DecorationList (Package: Engine)}}

Defines a list of [[Legacy:Decoration|Decoration]]s which can be placed in a level and attached to volumes. To attach a list to a [[Legacy:Volume|Volume]], set its ''DecoList'' property to the desired ''DecorationList''.

''What does this mean?''

==Properties==

===List Group===
; array&lt;DecorationType&gt; Decorations : The decorations in this list.

==Structs==

===DecorationType===
; int bAlign :
; int bRandomPitch :
; int bRandomRoll :
; int bRandomYaw :
; range Count :
; range DrawScale :
; [[Legacy:StaticMesh|StaticMesh]] StaticMesh :

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeepQantas</title>
    <id>1036</id>
    <revision>
      <id>2767</id>
      <timestamp>2005-11-17T08:13:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>really reverted (always check previous revisions!)</comment>
      <text xml:space="preserve">This page exists already.

Read text and notice &quot;Save&quot; to spend time. Press &quot;Cancel&quot; just for the power it gives your ego.

Go ahead, you know you want to. What could one more page do? If it doesn't work, you can always ask someone to remove it. You know... you want to.

If you want to score some serious cash with this Wiki thing, go to the [[Legacy:Sandbox|Sandbox]] and show those n00bs some real moves!

===DeepQantas, who?===

You probably don't know me. I certainly don't know you. Who are you and what are you doing here?

I've been a gamer whole my comparatively short life, and I intend to be until my bones are ground to dust. Possibly even longer, should I find the Unholy Grail that skifford Fritz Leiber wrote about. Oh, and modding, let me tell you about modding! Making stuff to weird things is becoming my second nature... well third, but who's counting?

I've played plenty of those things out there, but here are the things I feel have contributed to my ego and mental health the most:

====Quake - Dreams of the soulless future====

Yes. Quake... And mods and derivatives thereof. This is the game that really made me realize that there's more to the world than Basic. Well, I can't say I really made more stuff for this than testing a bit of mapping, but subconciously I could feel the power of this arcane engine.

Raw power, I tell you! Mystical energies ne'erbefore seen! And that one bugger told me I shouldn't have deleted Duke 3D to make space for this treasure! Fool! Now he rests in eternal torment within the charred pit I created with the dark rituals I summoned by playing the Quake CD backwards on my grand-father's gramophone...

Oh, and then came Team Fortress. Ahh, the originality. Just guess if I played the Spy?

====Thief - The night falls====

[http://www.thief-thecircle.com Thief]

All right. The deathmatch soon lost its glamour. What then? What could possibly keep up my interest? Yes, it's my other pleasure: Stealing stuff. I revered the moral flexibility and dark cityscapes from the very first glimpse I saw of this reality. I still remember the piece of demo I saw on TV. Ahh... and later on actually playing that Demo!

Imagine my nervous mindset as I commited my first break-in. Imagine the joy as I stole my first bounty. Imagine the overbearing sense of accomplishment as I nipped Bafford's bejeweled scepter, his most priced possession!

Ahh, those were the times. And I even managed to create some custom content for this game. Well, my own map projects kinda dried up, but I was part in the making of [http://www.ttlg.com/downloads/thief/missions/calendra/ Calendra's Cistern] making sorts of scripting as I created conversations extraordinaire... And many hours were spent cursing at the invisible bottles when they wouldn't do my bidding! Damn bottles!

====Action Halflife - Twice the style====

[http://ahl.action-web.net Action Halflife]

The Ultimate Movie Experience! So different from the vanilla deathmatch. Get those Akimbo Berettas of yours, lock and load and hit the streets to kick some ass and chew bubblegum. And you're all outta gum! And what better way to spend those long hours of Lan parties with your friends? I have the feeling that only one of my friends surpassed me in skill as we played... Grr... If only I could get a rematch with skills I have now.

I actually got so far as to make two maps for this mod. The first one was dq_funeral... Or as the in-game name said: [http://ahlmd.telefragged.com/maps.php?map=101 Papa Malignon's Funeral]

The notorious mafia boss has died, and when the family is mourning, they're suddenly attacked by a group of hitmen, determined to wipe the rest of the family out... And all the while old Papa is resting peacefully in his casket. I tell you, this church was ugly, and the idea was unoriginal and horrendous and everything! It was a horrible map! I can't understand why people seemed to like it. Someone asked me just the other day if I made dq_funeral. Must've been the working church bell or something.

Now the other map is the thing I'm really proud of: [http://ahlmd.telefragged.com/maps.php?map=145 Noir]

Yes, the old black and white Film Noir is back. The whole map was made with textures I'd ripped off from various sources and made greyscale. And to further add to the effect, the street had huge sheets of rain... and even more: A mirror world of the street built below it. Indoors also managed to satisfy my sense of symmetry with their details. The billiard room, bar, smoky poker room (with smoke in the ceiling) and the Private Dick's office... All straigth from the 50's.

However, let's not forget that I couldn't have possibly done that map without Jinx. If you're reading this, old chap, thanks for finishing it up. I mean it! Man, that Jinxie's probably finished more other people's maps as he has his own.

====ThieveryUT - Spammers will be circlestrafe blackjacked====

[http://www.thieveryut.com ThieveryUT]

If you belong to the taffing community, you might remember how Thief 2 was supposed to have multiplayer. Well, that never came to be, so what did the fans do? Well, they started a multiplayer thieving mod of their own, and Thievery was born. As I saw the project starting to grow, I immediately signed up. Well, I was kinda fed up with mapping after Noir (which still wasn't even nearly finished at this point) I went for betatesting.

It was kinda early back then and after few pointless alpha bug reports I kinda slid off and went back to Action. Later on, when it was more in beta stages, I managed to get back in due to me having sort of been a beta-tester earlier. And yay! This game really rocked! There's nothing like outwitting a human opponent in a match of hide and seek... or search and knock his brains out with a blackjack. The human guards just have that something artificial intelligence cannot provide.

Well, allright. Thievery never became very popular and is dying as we speak, but it was fun with the right people.

Later on I actually managed to contribute, too. I drew up sketchmaps for the levels that'd show up in-game. Oh, and even more recently I've done some small scripting stuff and whatnot. You know, the general stuff any self-respecting betatester would do.

====NightBlade - Don't say the T-word, Dalai might be listening====

[http://www.night-blade.com NightBlade] 

This one's still in the works, and I'm lucky enough to be a betatester again. This started off as the logical next step after Thievery. Something thiefy for the new engine. However, people had gotten way too tired of just copying Thief and making it multiplayer, so this time it's a whole new ballgame! Well, not literally a ballgame, but my point is, this time around we've got the cool ninja moves like walldodges and high-jumps and third person combat and wussname guilds fighting each other for the control over the city.

And when I say I'm a betatester, I mean that in the same non-accurate way as before. I'm doing a lot more stuff for NightBlade, and I bet I'll even get that map of mine done... Officially I'm still a betatester. It's really is just an easy way to keep the pressure off.

====Action UT2k3 - So close and yet so far====

[http://www.aut2k3.com Action UT2k3]

Ok. I don't really have anything to do with this mod. Well, maybe just a tiny bit, but nothing essential. But I'm just really looking forwards to this... After all, I'm an Action fan, remember? I'll be snooping around to find out as much as I can and if the opportunity presents itself, steal the sourc... I mean help with scripting and stuff. Yes, that's it.

Only time will tell if I'll actually start making some sort of a map for ActionUT2k3. Maybe something for the old times' sake.

====Alien Swarm - Remember, short, controlled bursts...====

[http://www.blackcatgames.com/swarm Alien Swarm]

Another mod I have no connection to - or maybe just a tiny bit, maybe. It just happens to be that few people from Blackcat Games (as the Thievery and Nightblade team started to call themselves some time ago, [http://www.blackcatgames.com -meow-]) had semi-secretly made this cool top-down shooter and it's now announced when it's near finished. Well, I hear there's some redoing and stuff going on, but apart from that, it's looking cool.

Can't wait for it to be released.

Oh, and guess what! It's taking part in the [http://www.unrealtournament.com/ut2003/contest.php Make Something Unreal] contest, too.

====Rest of the story====

Whenever I get out of my crypt, I can probably be found at these IRC channels:
#thievery at Starchat
#aut2k3 at Gamesnet

Also, if you need to message me, just find DeepQantas at the [http://www.thieveryut.com/bb Black Cat Forums] and drop a Private Message. Or just write on this page... 

No e-mail, cos I don't really use it anymore except when I have to. E-mails are really getting so old.

----

Currently trying to figure this thing out: [[Legacy:LOD Cheat|LOD Cheat]]

I'll probably start some sort of proper map with that idea, too. UT2k3 is usually very choppy for me and I can't play any big maps. So I figure... If I can't, then no one else can either! Mwahhahhah!

No, erm. If I can't, maybe I'll make a big map that I can. Yes, that's it!

----

'''Tarquin:''' Hi DeepQantas. Welcome to Unreal Wiki :)

'''DeepQantas:''' Thanks, I think I already have a couple of ideas brewing in the cauldron I tend to call my &quot;head&quot;. Lessee if I can find a right place for those, too. Damn. This editing thing's getting too fun.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2768</id>
      <timestamp>2005-11-17T02:14:22Z</timestamp>
      <contributor>
        <ip>64-110-209-246.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>spam delete?</comment>
      <text xml:space="preserve">The changing faces of Technology:

A category of hardware and software that enables people to use the Internet as the transmission medium for telephone calls. For users who have free, or fixed-price Internet access, Internet telephony software essentially provides free telephone calls anywhere in the world. To date, however, Internet telephony does not offer the same quality of telephone service as direct telephone connections. 

There are many Internet telephony applications available.come bundled with popular Web browsers. Others are stand-alone products. Internet telephony products are sometimes called IP telephony, Voice over the Internet (VOI) or Voice over IP (VOIP) products.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Default Properties</title>
    <id>937</id>
    <revision>
      <id>2553</id>
      <timestamp>2007-02-25T19:36:08Z</timestamp>
      <contributor>
        <ip>Host86-150-92-226.range86-150.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a special part of the [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Class Syntax|Class syntax]]. It's a block of script at the end of a class that declares default values for class properties. This block cannot contain any executable code, and uses its own special syntax that is different from ordinary UnrealScript code. Generally, this is similar to  the syntax for [[Legacy:T3D File|T3D file]]s.

Default properties are inherited by subclasses, and may in fact be overridden several times as you go down the class tree. The most &quot;recent&quot; (lowest subclass that has a setting for it in its default properties) takes precedence in this case. This also goes for ''parts'' of a struct or array, e.g. you can change the red value of a color property and the green, blue and alpha values are inherited from the superclass.

==Syntax==

This shows how to set defaults for arrays (both static and dynamic ones), floats, ints, booleans, strings, structs (MyColor), enums, objects (MyProjectileClass; sounds, textures, fonts, meshes or [[Legacy:Subobject|subobject]]s are handled likewise) and names. Note that you can also specify objects only by giving the name, i.e. RocketMk2 instead of class'Botpack.RocketMk2'. 

&lt;uscript&gt;
defaultproperties
{
     MyFloat=8.000000
     MyInt=5
     MyBoolean=True
     MyString=&quot;Hello World!&quot;
     MyEnum=ENUM_Something
     MyName=CliffyB
     MyProjectileClass=class'Botpack.RocketMk2'
     MyColor=(R=128,G=20,B=255)
     MyStaticArray1(0)=5
     MyStaticArray1(2)=3
     MyDynArray1=(&quot;array&quot;,&quot;on&quot;,&quot;a&quot;,&quot;single&quot;,&quot;line&quot;)
     MyDynArray2(0)=&quot;multiple&quot;
     MyDynArray2(1)=&quot;lines&quot;
     MyDynArray2(2)=&quot;for&quot;
     MyDynArray2(3)=&quot;this&quot;
     MyDynArray2(4)=&quot;one&quot;
}
&lt;/uscript&gt;

===Notes ===
* The syntax of the default properties block is pretty strict for an arcane reason.  Particularly adding spaces before or after the &quot;=&quot; will lead to errors in pre-[[Legacy:UT2003|UT2003]] versions. Trailing semicolons are not needed (pre-UT2003 they will cause an error; post-UT2003 you can put them in if you like). Also adding spaces inside the parentheses for a struct or single-line dynamic array will not work. If a struct has a Name variable, double quotes should be used instead of singles.

* As stated above, the default properties block is only parsed, but in no way executed.  You can't put any executable code in there (or complex expressions or variable references at the right side of an assignment, for that matter).  You can not use constants to initialize a value in defaultproperties. The compiler will not always give you an error; sometimes it will simply replace the constant with the appropriate zero value.

* Don't expect block comments to work properly there either, you can comment out the whole block but trying to comment out a line can produce weirdness. Block comments do work in [[Legacy:UT2004|UT2004]]. The following example will '''not''' count as a comment, but will be parsed as if the ''/* */'' wasn't there:  &lt;uscript&gt;
/*
defaultproperties
{
     MyVar=3
}*/
&lt;/uscript&gt;

'''Guest:''' Well does it work or doesn't it? The above says one thing, then the opposite, then it's contradicted again below!

'''Guest2:''' I guess that block comments DON'T work but single-line comments DO.

* While block comments do not work (the default properties parser will miss the start and end due to the nature of the parser), it does in fact respect single-line comments.  

&lt;uscript&gt;
defaultproperties
{
    // This is a valid comment
    //MyVal=0.1234
}
&lt;/uscript&gt;

* When assigning values to static or dynamic array elements in the defaults block don't use square brackets, it won't work, use ordinary parentheses or you'll get an &quot;unknown property in default block&quot; error when compiling.

* The default properties block will not show up when you are using UnrealEd's build-in [[Legacy:Script Editor|Script Editor]].  You can however right-click the class in the [[Legacy:Actor Browser|actor browser]] and select &quot;Default Properties&quot; to check and modify them.

* Any variables that specified as config will have any default values replaced by those specified in the appropriate .ini file, just as placed Actors with modified values will replace those specified in the class.

* Note that newer builds of the engine (i.e. anything newer than UT) support more robust parsing of the defaultproperties, including extra whitespace and semicolons at the end of lines.

* The compiler that came with [[Legacy:UT2003|UT2003]] checks whether classes specified in the defaults block exist, but it doesn't check whether they are allowed there. In particular this means you can assign class'[[Legacy:Commandlet|Commandlet]]' to a variable of type class&lt;[[Legacy:Actor|Actor]]&gt;. The variable will contain the default value None then, but the compiler doesn't complain about it.

==Inheritance ==

Not readily apparent to some is that your defaultproperties block can become fairly large if you consider how much you've inherited.  Consider 

{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; CustomWeapon }}

I've seen a few people who assume that defaultproperties is something special, but it's just a basic constructor for your class so all the variables and settings from every class in your tree are available there as well.  In the case of Weapon bJustTeleported ([[Legacy:Actor|Actor]]) and bMovable ([[Legacy:Actor|Actor]]) are available for your use, even if they don't make much sense by the time you get to them.

==Accessing ==

&lt;uscript&gt;
SomeActor.default.&lt;property&gt;=&lt;DefaultValue&gt;; // if you have an actor of the class
class'SomeClass'.default.&lt;property&gt;=&lt;DefaultValue&gt;; // if you don't
&lt;/uscript&gt;

It's probably obvious, but if you set the default for a class in your script, it won't affect the property of objects of the class, even if those have not changed from default: those were set from the defaults when the object was created.

==Features in later engine versions ==

It is possible to create [[Legacy:Subobject|subobject]]s in the defaultproperties block of a class. This technique is widely used in the [[Legacy:UT2003|UT2003]] XInterface package to create GUI controls to be placed on a dialog box.

==Default properties in UnrealEd==

The Default properties block is omitted in UnrealEd's [[Legacy:Script Editor|script editor]]. Instead, properties are set in an extra instance of [[Legacy:Actor Properties Window|Actor properties window]], accessed from the [[Legacy:Actor Classes Browser|Actor classes browser]]. Do one of the following:
* Select the class, [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]] -&gt; Class -&gt; Default Properties...
* Select the class, and click the properties button on the Actor classes browser toolbar
* Right-click the class and select Default Properties... from the context menu.

The downsides of this behavior are:
* If you paste in a script, you'll have to remove the Default properties block: it won't compile.
* You can't access hidden variables in the default properties window.

To access hidden variables, call up the window with the console command:
 editdefault class=&lt;classname&gt;

==Comments ==

'''zStorm:''' (Fixed) It seems as though UCC under certain circumstances has issues with decompiling the default properties. If for instance you decompile a file that has a struct in the default properties, it may insert spaces into the struct declaration.

What should be ZoneGravity=(X=0.00,Y=0.00,Z=-950.00) becomes ZoneGravity=(X=0.00, Y=0.00, Z=-950.00) which is not allowed.

'''JamesKilton:''' Just something I noticed: Arrays in Default Properties are usually accessed through (). However, take this example:

&lt;uscript&gt;
struct myStruct {
  var int intArray[3];
};

var myStruct someVar;

defaultproperties
{
  // Compile fails:
  someVar=(intArray(0)=1,intArray(1)=1,intArray(2)=1)

  // Compile passes:
  someVar=(intArray[0]=1,intArray[1]=1,intArray[2]=1)
}
&lt;/uscript&gt;

Really weird double-standard here, just something to watch out for.

'''BigJohn:''' I've done some funky struct in an array stuff for one of my actors, and here's how it goes:

&lt;uscript&gt;
struct Attack
{
	var name AnimName;
	var string HowTo;
	var int length;
};

var attack spclAttacks[10];

defaultproperties
{
	spclAttacks(0)=(animName=&quot;AltAttack&quot;,HowTo=&quot;dr1&quot;,Length=3)
}
&lt;/uscript&gt;

biggest issue I had was to make sure that nowhere in the property is there a space. (thanks pospi)

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Class Syntax|Class Syntax]]
* [[Legacy:Variable Syntax|Variable Syntax]]
* [[Legacy:Static Function|Static Function]]
* [[Legacy:Subobject|Subobject]]</text>
    </revision>
    <revision>
      <id>2554</id>
      <timestamp>2006-05-02T07:27:07Z</timestamp>
      <contributor>
        <ip>68-66-203-166.ventca.adelphia.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a special part of the [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Class Syntax|Class syntax]]. It's a block of script at the end of a class that declares default values for class properties. This block cannot contain any executable code, and uses its own special syntax that is different from ordinary UnrealScript code. Generally, this is similar to  the syntax for [[Legacy:T3D File|T3D file]]s.

Default properties are inherited by subclasses, and may in fact be overridden several times as you go down the class tree. The most &quot;recent&quot; (lowest subclass that has a setting for it in its default properties) takes precedence in this case. This also goes for ''parts'' of a struct or array, e.g. you can change the red value of a color property and the green, blue and alpha values are inherited from the superclass.

==Syntax==

This shows how to set defaults for arrays (both static and dynamic ones), floats, ints, booleans, strings, structs (MyColor), enums, objects (MyProjectileClass; sounds, textures, fonts, meshes or [[Legacy:Subobject|subobject]]s are handled likewise) and names. Note that you can also specify objects only by giving the name, i.e. RocketMk2 instead of class'Botpack.RocketMk2'. 

&lt;uscript&gt;
defaultproperties
{
     MyFloat=8.000000
     MyInt=5
     MyBoolean=True
     MyString=&quot;Hello World!&quot;
     MyEnum=ENUM_Something
     MyName=CliffyB
     MyProjectileClass=class'Botpack.RocketMk2'
     MyColor=(R=128,G=20,B=255)
     MyStaticArray1(0)=5
     MyStaticArray1(2)=3
     MyDynArray1=(&quot;array&quot;,&quot;on&quot;,&quot;a&quot;,&quot;single&quot;,&quot;line&quot;)
     MyDynArray2(0)=&quot;multiple&quot;
     MyDynArray2(1)=&quot;lines&quot;
     MyDynArray2(2)=&quot;for&quot;
     MyDynArray2(3)=&quot;this&quot;
     MyDynArray2(4)=&quot;one&quot;
}
&lt;/uscript&gt;

===Notes ===
* The syntax of the default properties block is pretty strict for an arcane reason.  Particularly adding spaces before or after the &quot;=&quot; will lead to errors in pre-[[Legacy:UT2003|UT2003]] versions. Trailing semicolons are not needed (pre-UT2003 they will cause an error; post-UT2003 you can put them in if you like). Also adding spaces inside the parentheses for a struct or single-line dynamic array will not work. If a struct has a Name variable, double quotes should be used instead of singles.

* As stated above, the default properties block is only parsed, but in no way executed.  You can't put any executable code in there (or complex expressions or variable references at the right side of an assignment, for that matter).  You can not use constants to initialize a value in defaultproperties. The compiler will not always give you an error; sometimes it will simply replace the constant with the appropriate zero value.

* Don't expect block comments to work properly there either, you can comment out the whole block but trying to comment out a line can produce weirdness. Block comments do work in [[Legacy:UT2004|UT2004]]. The following example will '''not''' count as a comment, but will be parsed as if the ''/* */'' wasn't there:  &lt;uscript&gt;
/*
defaultproperties
{
     MyVar=3
}*/
&lt;/uscript&gt;

'''Guest:''' Well does it work or doesn't it? The above says one thing, then the opposite, then it's contradicted again below!

* While block comments do not work (the default properties parser will miss the start and end due to the nature of the parser), it does in fact respect single-line comments.  

&lt;uscript&gt;
defaultproperties
{
    // This is a valid comment
    //MyVal=0.1234
}
&lt;/uscript&gt;

* When assigning values to static or dynamic array elements in the defaults block don't use square brackets, it won't work, use ordinary parentheses or you'll get an &quot;unknown property in default block&quot; error when compiling.

* The default properties block will not show up when you are using UnrealEd's build-in [[Legacy:Script Editor|Script Editor]].  You can however right-click the class in the [[Legacy:Actor Browser|actor browser]] and select &quot;Default Properties&quot; to check and modify them.

* Any variables that specified as config will have any default values replaced by those specified in the appropriate .ini file, just as placed Actors with modified values will replace those specified in the class.

* Note that newer builds of the engine (i.e. anything newer than UT) support more robust parsing of the defaultproperties, including extra whitespace and semicolons at the end of lines.

* The compiler that came with [[Legacy:UT2003|UT2003]] checks whether classes specified in the defaults block exist, but it doesn't check whether they are allowed there. In particular this means you can assign class'[[Legacy:Commandlet|Commandlet]]' to a variable of type class&lt;[[Legacy:Actor|Actor]]&gt;. The variable will contain the default value None then, but the compiler doesn't complain about it.

==Inheritance ==

Not readily apparent to some is that your defaultproperties block can become fairly large if you consider how much you've inherited.  Consider 

{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; CustomWeapon }}

I've seen a few people who assume that defaultproperties is something special, but it's just a basic constructor for your class so all the variables and settings from every class in your tree are available there as well.  In the case of Weapon bJustTeleported ([[Legacy:Actor|Actor]]) and bMovable ([[Legacy:Actor|Actor]]) are available for your use, even if they don't make much sense by the time you get to them.

==Accessing ==

&lt;uscript&gt;
SomeActor.default.&lt;property&gt;=&lt;DefaultValue&gt;; // if you have an actor of the class
class'SomeClass'.default.&lt;property&gt;=&lt;DefaultValue&gt;; // if you don't
&lt;/uscript&gt;

It's probably obvious, but if you set the default for a class in your script, it won't affect the property of objects of the class, even if those have not changed from default: those were set from the defaults when the object was created.

==Features in later engine versions ==

It is possible to create [[Legacy:Subobject|subobject]]s in the defaultproperties block of a class. This technique is widely used in the [[Legacy:UT2003|UT2003]] XInterface package to create GUI controls to be placed on a dialog box.

==Default properties in UnrealEd==

The Default properties block is omitted in UnrealEd's [[Legacy:Script Editor|script editor]]. Instead, properties are set in an extra instance of [[Legacy:Actor Properties Window|Actor properties window]], accessed from the [[Legacy:Actor Classes Browser|Actor classes browser]]. Do one of the following:
* Select the class, [[Legacy:Actor Classes Browser Menu|Actor Classes Browser Menu]] -&gt; Class -&gt; Default Properties...
* Select the class, and click the properties button on the Actor classes browser toolbar
* Right-click the class and select Default Properties... from the context menu.

The downsides of this behavior are:
* If you paste in a script, you'll have to remove the Default properties block: it won't compile.
* You can't access hidden variables in the default properties window.

To access hidden variables, call up the window with the console command:
 editdefault class=&lt;classname&gt;

==Comments ==

'''zStorm:''' (Fixed) It seems as though UCC under certain circumstances has issues with decompiling the default properties. If for instance you decompile a file that has a struct in the default properties, it may insert spaces into the struct declaration.

What should be ZoneGravity=(X=0.00,Y=0.00,Z=-950.00) becomes ZoneGravity=(X=0.00, Y=0.00, Z=-950.00) which is not allowed.

'''JamesKilton:''' Just something I noticed: Arrays in Default Properties are usually accessed through (). However, take this example:

&lt;uscript&gt;
struct myStruct {
  var int intArray[3];
};

var myStruct someVar;

defaultproperties
{
  // Compile fails:
  someVar=(intArray(0)=1,intArray(1)=1,intArray(2)=1)

  // Compile passes:
  someVar=(intArray[0]=1,intArray[1]=1,intArray[2]=1)
}
&lt;/uscript&gt;

Really weird double-standard here, just something to watch out for.

'''BigJohn:''' I've done some funky struct in an array stuff for one of my actors, and here's how it goes:

&lt;uscript&gt;
struct Attack
{
	var name AnimName;
	var string HowTo;
	var int length;
};

var attack spclAttacks[10];

defaultproperties
{
	spclAttacks(0)=(animName=&quot;AltAttack&quot;,HowTo=&quot;dr1&quot;,Length=3)
}
&lt;/uscript&gt;

biggest issue I had was to make sure that nowhere in the property is there a space. (thanks pospi)

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Class Syntax|Class Syntax]]
* [[Legacy:Variable Syntax|Variable Syntax]]
* [[Legacy:Static Function|Static Function]]
* [[Legacy:Subobject|Subobject]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Default Properties For Weapons</title>
    <id>949</id>
    <revision>
      <id>2580</id>
      <timestamp>2004-03-25T02:38:07Z</timestamp>
      <contributor>
        <ip>Px3wh.vc.shawcable.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' These properties should be moved to their respecitve classes [[Legacy:Weapon (UT)|Weapon (UT)]], [[Legacy:TournamentWeapon|TournamentWeapon]], [[Legacy:Enforcer|Enforcer]], [[Legacy:SniperRifle|SniperRifle]], etc.

----

==Default properties ==

===Here are only some of the default properties and what they do. ===

*Pulled directly from .uc files in Botpack.

&lt;font color=blue&gt;&lt;/font&gt; &lt;br /&gt;

&lt;font color=blue&gt;bCanThrow=&lt;/font&gt; if true, player can toss this weapon out&lt;br&gt;

&lt;font color=blue&gt;RespawnTime=&lt;/font&gt; Respawn after this time, 0 for never respawns&lt;br&gt;

&lt;font color=blue&gt;hitdamage=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FireAnims(0)=&lt;/font&gt; name of firing mesh #1&lt;br&gt;

&lt;font color=blue&gt;FireAnims(1)=&lt;/font&gt; name of firing mesh #2&lt;br&gt;

&lt;font color=blue&gt;FireAnims(2)=&lt;/font&gt; name of firing mesh #3&lt;br&gt;

&lt;font color=blue&gt;FireAnims(3)=&lt;/font&gt; name of firing mesh #4&lt;br&gt;

&lt;font color=blue&gt;FireAnims(4)=&lt;/font&gt; name of firing mesh #5&lt;br&gt;

&lt;font color=blue&gt;bClientAnim=&lt;/font&gt; If false, this seems to replicate all playanim calls to the client, negating the need for specialized playanim functions being replicated &lt;br&gt;

&lt;font color=blue&gt;DoubleName=&lt;/font&gt; this allows for a name change upon picking up another (when akimbo is available)&lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(0)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(1)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(2)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(3)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(4)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;DoubleSwitchPriority=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;WeaponDescription=&lt;/font&gt; pretty self explanitory, its the string displayed as weapon info &lt;br&gt;

&lt;font color=blue&gt;aimerror=&lt;/font&gt; aim Error for bots (note this value doubled if instant hit weapon)&lt;br&gt;

&lt;font color=blue&gt;FireAdjust=&lt;/font&gt; magnitude of firing speed adjustment (%/100) based on skill for bots. (1.0 for non-bots)&lt;br&gt;

&lt;font color=blue&gt;InstFlash=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;InstFog=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;AmmoName=&lt;/font&gt; indicates the class that is picked up to add ammo &lt;br&gt;

&lt;font color=blue&gt;PickupAmmoCount=&lt;/font&gt; integer (or whole number) representing the amount of ammo weapon has upon pickup &lt;br&gt;

&lt;font color=blue&gt;bSplashDamage=&lt;/font&gt; tells bot AI whether it causes splash damage or not&lt;br&gt;

&lt;font color=blue&gt;bRecommendSplashDamage=&lt;/font&gt; if true, bot preferentially tries to use splash damage rather than direct hits&lt;br&gt;

&lt;font color=blue&gt;bRecommendAltSplashDamage=&lt;/font&gt; same as bRecommendSplashDamage, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;bWarnTarget=&lt;/font&gt; bot AI related - when firing projectile, warn the target&lt;br&gt;

&lt;font color=blue&gt;bAltWarnTarget=&lt;/font&gt; same as bWarnTarget, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;bInstantHit=&lt;/font&gt; [[Legacy:Boolean|Boolean]] or true/false setting for allowing instant hit damage, good for use when you need a fast hit from the weapon (like a rifle) with no projectile &lt;br&gt;

&lt;font color=blue&gt;bAltInstantHit=&lt;/font&gt; same as bInstantHit, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;ProjectileClass=&lt;/font&gt; class of the bullet to spawn when fired&lt;br&gt;

&lt;font color=blue&gt;AltProjectileClass=&lt;/font&gt; same as ProjectileClass, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;FiringSpeed=&lt;/font&gt; used by human animations in determining firing speed&lt;br&gt;

&lt;font color=blue&gt;FireOffset=&lt;/font&gt; X, Y, and Z co-ordinates to adjust where a projectile or effect emits from weapon in first-person view, calculated from the playermodel's Mesh Origin &lt;br&gt;

&lt;font color=blue&gt;bMeleeWeapon=&lt;/font&gt; used by bot AI to determine if it is a close range weapon&lt;br&gt;

&lt;font color=blue&gt;bRapidFire=&lt;/font&gt; used by human animations in determining firing animation (for still firing)&lt;br&gt;

&lt;font color=blue&gt;MyDamageType=&lt;/font&gt; type of damage weapon inflicts, standard is &quot;shot&quot; &lt;br&gt;

&lt;font color=blue&gt;AltDamageType=&lt;/font&gt; type of damage AltFire inflicts, same as MyDamageType&lt;br&gt;

&lt;font color=blue&gt;shakevert=&lt;/font&gt; Screen shake vector X component&lt;br&gt;

&lt;font color=blue&gt;shakemag=&lt;/font&gt; Screen shake vector Z component&lt;br&gt;

&lt;font color=blue&gt;shaketime=&lt;/font&gt; Screen shake vector Y component&lt;br&gt;

&lt;font color=blue&gt;AIRating=&lt;/font&gt; used by bot AI - how much the use of this weapon is desired&lt;br&gt;

&lt;font color=blue&gt;RefireRate=&lt;/font&gt; used by bot AI - how much is the chance (%) of bot holding down the fire button&lt;br&gt;

&lt;font color=blue&gt;AltRefireRate=&lt;/font&gt; &lt;br&gt; same as RefireRate, but for the AltFire function

&lt;font color=blue&gt;FireSound=&lt;/font&gt; sound class played when Fire function is executed&lt;br&gt;

&lt;font color=blue&gt;AltFireSound=&lt;/font&gt; same as FireSound, but for the AltFire function &lt;br&gt;

&lt;font color=blue&gt;CockingSound=&lt;/font&gt; sound class played when CockingSound function is executed &lt;br&gt;

&lt;font color=blue&gt;SelectSound=&lt;/font&gt; sound class played when SelectSound function is executed &lt;br&gt;

&lt;font color=blue&gt;Misc1Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc2Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc3Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc4Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MessageNoAmmo=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;DeathMessage=&lt;/font&gt; message string displayed when weapon sucessfully scores a frag &lt;br&gt;

&lt;font color=blue&gt;NameColor=&lt;/font&gt; R, G, B values of weapon's name color when displayed &lt;br&gt;

&lt;font color=blue&gt;bDrawMuzzleFlash=&lt;/font&gt; [[Legacy:Boolean|Boolean]] switch for showing the muzzleflash on, or off &lt;br&gt;

&lt;font color=blue&gt;MuzzleScale=&lt;/font&gt; scale of muzzleflash model when displayed (as seen from first-person view) &lt;br&gt;

&lt;font color=blue&gt;FlashY=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashO=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashC=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashLength=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashS=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MFTexture=&lt;/font&gt; texture class displayed as muzzleflash, can be animated (as seen from first-person view) &lt;br&gt;

&lt;font color=blue&gt;AutoSwitchPriority=&lt;/font&gt; integer ordering its priority of being auto-switched to when picked up, can be altered ingame from preferences &lt;br&gt;

&lt;font color=blue&gt;InventoryGroup=&lt;/font&gt; (not to clear on this...) integer assigning its space in the inventory. No two inventory items should have the same group, although it doesn't really seem to matter. I suggest doing it anyway, better safe than sorry.&lt;br&gt;

&lt;font color=blue&gt;PickupMessage=&lt;/font&gt; message string displayed upon weapon pickup&lt;br&gt;

&lt;font color=blue&gt;ItemName=&lt;/font&gt; name of the weapon when displayed &lt;br&gt;

&lt;font color=blue&gt;PlayerViewOffset=&lt;/font&gt; This is a drawing offset vector, noting that all values are multiplied by 100 (or -100)in the sethand function.&lt;br&gt;
** ''X'' Moves the gun Forwards or Backwards from the Player, ''Y'' Moves Left and Right, and Z moves Up and Down.

&lt;font color=blue&gt;PlayerViewMesh=&lt;/font&gt; lodmesh class used for first-person view of weapon (usually contains the most animations) &lt;br&gt;

&lt;font color=blue&gt;PickupViewMesh=&lt;/font&gt; lodmesh class used for the pickup version of weapon &lt;br&gt;

&lt;font color=blue&gt;ThirdPersonMesh=&lt;/font&gt; lodmesh class used for the third-person version of a weapon&lt;br&gt;

&lt;font color=blue&gt;StatusIcon=&lt;/font&gt; texture class determining what icon to use on the hud for weapon &lt;br&gt;

&lt;font color=blue&gt;bMuzzleFlashParticles=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashStyle=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashMesh=&lt;/font&gt; lodmesh class used for the third-person view of the muzzleflash &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashScale=&lt;/font&gt; scale of MuzzleFlashMesh &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashTexture=&lt;/font&gt; texture class used on MuzzleFlashMesh, can be animated &lt;br&gt;

&lt;font color=blue&gt;PickupSound=&lt;/font&gt; sound class played upon weapon pickup &lt;br&gt;

&lt;font color=blue&gt;Icon=&lt;/font&gt; texture class used on hud, similar to status icon&lt;br&gt;

&lt;font color=blue&gt;bHidden=&lt;/font&gt; [[Legacy:Boolean|Boolean]] setting used to make weapon invisible ingame &lt;br&gt;

&lt;font color=blue&gt;Mesh=&lt;/font&gt; lodmesh class displayed in weapon info screens, UnrealED'smesh editor for example&lt;br&gt;

&lt;font color=blue&gt;bNoSmooth=&lt;/font&gt; [[Legacy:Boolean|Boolean]] setting to turn off Unreal's automatic poly smoothing, makes meshes look more angular, good for flat edges or sharp corners (can be manipulated on a per-poly basis using [[Legacy:UnrealFX|UnrealFX]])&lt;br&gt;

&lt;font color=blue&gt;CollisionRadius=&lt;/font&gt; amount of unreal units horizontally from weapon origin collision occurs, see [[Legacy:Collision Detection|Collision Detection]]&lt;br&gt;

&lt;font color=blue&gt;CollisionHeight=&lt;/font&gt; amount of unreal units vertically collision occurs see[[Legacy:Collision Detection|Collision Detection]] &lt;br&gt;

&lt;font color=blue&gt;Rotation=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;BobDamping=&lt;/font&gt; how much to damp view bob&lt;br&gt;

&lt;font color=blue&gt;Mass=&lt;/font&gt; measure of mass of an object, only use i know of is so [[Legacy:Pawn (UT)|Pawn (UT)]] can determine which player animation to play with which items. e.g. mass &lt; 20 means small weapon hold and fire anims like pistol, mass &gt; 20 means large weapon hold and fire anims using 2 hands spread like rocket launcher. &lt;br&gt;

&lt;font color=blue&gt;SoundRadius=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;SoundVolume=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightEffect=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightBrightness=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightHue=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightSaturation=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightRadius=&lt;/font&gt; &lt;br&gt;</text>
    </revision>
    <revision>
      <id>2581</id>
      <timestamp>2004-01-28T04:10:25Z</timestamp>
      <contributor>
        <ip>SabbathCat</ip>
      </contributor>
      <comment>PlayerViewOffset info for co-ordinates.</comment>
      <text xml:space="preserve">'''Wormbo:''' These properties should be moved to their respecitve classes [[Legacy:Weapon (UT)|Weapon (UT)]], [[Legacy:TournamentWeapon|TournamentWeapon]], [[Legacy:Enforcer|Enforcer]], [[Legacy:SniperRifle|SniperRifle]], etc.

----

==Default properties ==

===Here are only some of the default properties and what they do. ===

*Pulled directly from .uc files in Botpack.

&lt;font color=blue&gt;&lt;/font&gt; &lt;br /&gt;

&lt;font color=blue&gt;bCanThrow=&lt;/font&gt; if true, player can toss this weapon out&lt;br&gt;

&lt;font color=blue&gt;RespawnTime=&lt;/font&gt; Respawn after this time, 0 for instant&lt;br&gt;

&lt;font color=blue&gt;hitdamage=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FireAnims(0)=&lt;/font&gt; name of firing mesh #1&lt;br&gt;

&lt;font color=blue&gt;FireAnims(1)=&lt;/font&gt; name of firing mesh #2&lt;br&gt;

&lt;font color=blue&gt;FireAnims(2)=&lt;/font&gt; name of firing mesh #3&lt;br&gt;

&lt;font color=blue&gt;FireAnims(3)=&lt;/font&gt; name of firing mesh #4&lt;br&gt;

&lt;font color=blue&gt;FireAnims(4)=&lt;/font&gt; name of firing mesh #5&lt;br&gt;

&lt;font color=blue&gt;bClientAnim=&lt;/font&gt; If false, this seems to replicate all playanim calls to the client, negating the need for specialized playanim functions being replicated &lt;br&gt;

&lt;font color=blue&gt;DoubleName=&lt;/font&gt; this allows for a name change upon picking up another (when akimbo is available)&lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(0)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(1)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(2)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(3)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(4)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;DoubleSwitchPriority=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;WeaponDescription=&lt;/font&gt; pretty self explanitory, its the string displayed as weapon info &lt;br&gt;

&lt;font color=blue&gt;aimerror=&lt;/font&gt; aim Error for bots (note this value doubled if instant hit weapon)&lt;br&gt;

&lt;font color=blue&gt;FireAdjust=&lt;/font&gt; magnitude of firing speed adjustment (%/100) based on skill for bots. (1.0 for non-bots)&lt;br&gt;

&lt;font color=blue&gt;InstFlash=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;InstFog=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;AmmoName=&lt;/font&gt; indicates the class that is picked up to add ammo &lt;br&gt;

&lt;font color=blue&gt;PickupAmmoCount=&lt;/font&gt; integer (or whole number) representing the amount of ammo weapon has upon pickup &lt;br&gt;

&lt;font color=blue&gt;bSplashDamage=&lt;/font&gt; tells bot AI whether it causes splash damage or not&lt;br&gt;

&lt;font color=blue&gt;bRecommendSplashDamage=&lt;/font&gt; if true, bot preferentially tries to use splash damage rather than direct hits&lt;br&gt;

&lt;font color=blue&gt;bRecommendAltSplashDamage=&lt;/font&gt; same as bRecommendSplashDamage, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;bWarnTarget=&lt;/font&gt; bot AI related - when firing projectile, warn the target&lt;br&gt;

&lt;font color=blue&gt;bAltWarnTarget=&lt;/font&gt; same as bWarnTarget, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;bInstantHit=&lt;/font&gt; [[Legacy:Boolean|Boolean]] or true/false setting for allowing instant hit damage, good for use when you need a fast hit from the weapon (like a rifle) with no projectile &lt;br&gt;

&lt;font color=blue&gt;bAltInstantHit=&lt;/font&gt; same as bInstantHit, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;ProjectileClass=&lt;/font&gt; class of the bullet to spawn when fired&lt;br&gt;

&lt;font color=blue&gt;AltProjectileClass=&lt;/font&gt; same as ProjectileClass, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;FiringSpeed=&lt;/font&gt; used by human animations in determining firing speed&lt;br&gt;

&lt;font color=blue&gt;FireOffset=&lt;/font&gt; X, Y, and Z co-ordinates to adjust where a projectile or effect emits from weapon in first-person view, calculated from the playermodel's Mesh Origin &lt;br&gt;

&lt;font color=blue&gt;bMeleeWeapon=&lt;/font&gt; used by bot AI to determine if it is a close range weapon&lt;br&gt;

&lt;font color=blue&gt;bRapidFire=&lt;/font&gt; used by human animations in determining firing animation (for still firing)&lt;br&gt;

&lt;font color=blue&gt;MyDamageType=&lt;/font&gt; type of damage weapon inflicts, standard is &quot;shot&quot; &lt;br&gt;

&lt;font color=blue&gt;AltDamageType=&lt;/font&gt; type of damage AltFire inflicts, same as MyDamageType&lt;br&gt;

&lt;font color=blue&gt;shakevert=&lt;/font&gt; Screen shake vector X component&lt;br&gt;

&lt;font color=blue&gt;shakemag=&lt;/font&gt; Screen shake vector Z component&lt;br&gt;

&lt;font color=blue&gt;shaketime=&lt;/font&gt; Screen shake vector Y component&lt;br&gt;

&lt;font color=blue&gt;AIRating=&lt;/font&gt; used by bot AI - how much the use of this weapon is desired&lt;br&gt;

&lt;font color=blue&gt;RefireRate=&lt;/font&gt; used by bot AI - how much is the chance (%) of bot holding down the fire button&lt;br&gt;

&lt;font color=blue&gt;AltRefireRate=&lt;/font&gt; &lt;br&gt; same as RefireRate, but for the AltFire function

&lt;font color=blue&gt;FireSound=&lt;/font&gt; sound class played when Fire function is executed&lt;br&gt;

&lt;font color=blue&gt;AltFireSound=&lt;/font&gt; same as FireSound, but for the AltFire function &lt;br&gt;

&lt;font color=blue&gt;CockingSound=&lt;/font&gt; sound class played when CockingSound function is executed &lt;br&gt;

&lt;font color=blue&gt;SelectSound=&lt;/font&gt; sound class played when SelectSound function is executed &lt;br&gt;

&lt;font color=blue&gt;Misc1Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc2Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc3Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc4Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MessageNoAmmo=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;DeathMessage=&lt;/font&gt; message string displayed when weapon sucessfully scores a frag &lt;br&gt;

&lt;font color=blue&gt;NameColor=&lt;/font&gt; R, G, B values of weapon's name color when displayed &lt;br&gt;

&lt;font color=blue&gt;bDrawMuzzleFlash=&lt;/font&gt; [[Legacy:Boolean|Boolean]] switch for showing the muzzleflash on, or off &lt;br&gt;

&lt;font color=blue&gt;MuzzleScale=&lt;/font&gt; scale of muzzleflash model when displayed (as seen from first-person view) &lt;br&gt;

&lt;font color=blue&gt;FlashY=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashO=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashC=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashLength=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashS=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MFTexture=&lt;/font&gt; texture class displayed as muzzleflash, can be animated (as seen from first-person view) &lt;br&gt;

&lt;font color=blue&gt;AutoSwitchPriority=&lt;/font&gt; integer ordering its priority of being auto-switched to when picked up, can be altered ingame from preferences &lt;br&gt;

&lt;font color=blue&gt;InventoryGroup=&lt;/font&gt; (not to clear on this...) integer assigning its space in the inventory. No two inventory items should have the same group, although it doesn't really seem to matter. I suggest doing it anyway, better safe than sorry.&lt;br&gt;

&lt;font color=blue&gt;PickupMessage=&lt;/font&gt; message string displayed upon weapon pickup&lt;br&gt;

&lt;font color=blue&gt;ItemName=&lt;/font&gt; name of the weapon when displayed &lt;br&gt;

&lt;font color=blue&gt;PlayerViewOffset=&lt;/font&gt; This is a drawing offset vector, noting that all values are multiplied by 100 (or -100)in the sethand function.&lt;br&gt;
** ''X'' Moves the gun Forwards or Backwards from the Player, ''Y'' Moves Left and Right, and Z moves Up and Down.

&lt;font color=blue&gt;PlayerViewMesh=&lt;/font&gt; lodmesh class used for first-person view of weapon (usually contains the most animations) &lt;br&gt;

&lt;font color=blue&gt;PickupViewMesh=&lt;/font&gt; lodmesh class used for the pickup version of weapon &lt;br&gt;

&lt;font color=blue&gt;ThirdPersonMesh=&lt;/font&gt; lodmesh class used for the third-person version of a weapon&lt;br&gt;

&lt;font color=blue&gt;StatusIcon=&lt;/font&gt; texture class determining what icon to use on the hud for weapon &lt;br&gt;

&lt;font color=blue&gt;bMuzzleFlashParticles=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashStyle=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashMesh=&lt;/font&gt; lodmesh class used for the third-person view of the muzzleflash &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashScale=&lt;/font&gt; scale of MuzzleFlashMesh &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashTexture=&lt;/font&gt; texture class used on MuzzleFlashMesh, can be animated &lt;br&gt;

&lt;font color=blue&gt;PickupSound=&lt;/font&gt; sound class played upon weapon pickup &lt;br&gt;

&lt;font color=blue&gt;Icon=&lt;/font&gt; texture class used on hud, similar to status icon&lt;br&gt;

&lt;font color=blue&gt;bHidden=&lt;/font&gt; [[Legacy:Boolean|Boolean]] setting used to make weapon invisible ingame &lt;br&gt;

&lt;font color=blue&gt;Mesh=&lt;/font&gt; lodmesh class displayed in weapon info screens, UnrealED'smesh editor for example&lt;br&gt;

&lt;font color=blue&gt;bNoSmooth=&lt;/font&gt; [[Legacy:Boolean|Boolean]] setting to turn off Unreal's automatic poly smoothing, makes meshes look more angular, good for flat edges or sharp corners (can be manipulated on a per-poly basis using [[Legacy:UnrealFX|UnrealFX]])&lt;br&gt;

&lt;font color=blue&gt;CollisionRadius=&lt;/font&gt; amount of unreal units horizontally from weapon origin collision occurs, see [[Legacy:Collision Detection|Collision Detection]]&lt;br&gt;

&lt;font color=blue&gt;CollisionHeight=&lt;/font&gt; amount of unreal units vertically collision occurs see[[Legacy:Collision Detection|Collision Detection]] &lt;br&gt;

&lt;font color=blue&gt;Rotation=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;BobDamping=&lt;/font&gt; how much to damp view bob&lt;br&gt;

&lt;font color=blue&gt;Mass=&lt;/font&gt; measure of mass of an object, only use i know of is so [[Legacy:Pawn (UT)|Pawn (UT)]] can determine which player animation to play with which items. e.g. mass &lt; 20 means small weapon hold and fire anims like pistol, mass &gt; 20 means large weapon hold and fire anims using 2 hands spread like rocket launcher. &lt;br&gt;

&lt;font color=blue&gt;SoundRadius=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;SoundVolume=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightEffect=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightBrightness=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightHue=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightSaturation=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightRadius=&lt;/font&gt; &lt;br&gt;</text>
    </revision>
    <revision>
      <id>43444</id>
      <timestamp>2010-06-12T11:14:32Z</timestamp>
      <contributor>
        <ip>213.65.6.34</ip>
      </contributor>
      <text xml:space="preserve">'''Wormbo:''' These properties should be moved to their respective classes [[Legacy:Weapon (UT)|Weapon (UT)]], [[Legacy:TournamentWeapon|TournamentWeapon]], [[Legacy:Enforcer|Enforcer]], [[Legacy:SniperRifle|SniperRifle]], etc.

----

==Default properties ==

===Here are only some of the default properties and what they do. ===

*Pulled directly from .uc files in Botpack.

&lt;font color=blue&gt;&lt;/font&gt; &lt;br /&gt;

&lt;font color=blue&gt;bCanThrow=&lt;/font&gt; if true, player can toss this weapon out&lt;br&gt;

&lt;font color=blue&gt;RespawnTime=&lt;/font&gt; Respawn after this time, 0 for never respawns&lt;br&gt;

&lt;font color=blue&gt;hitdamage=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FireAnims(0)=&lt;/font&gt; name of firing mesh #1&lt;br&gt;

&lt;font color=blue&gt;FireAnims(1)=&lt;/font&gt; name of firing mesh #2&lt;br&gt;

&lt;font color=blue&gt;FireAnims(2)=&lt;/font&gt; name of firing mesh #3&lt;br&gt;

&lt;font color=blue&gt;FireAnims(3)=&lt;/font&gt; name of firing mesh #4&lt;br&gt;

&lt;font color=blue&gt;FireAnims(4)=&lt;/font&gt; name of firing mesh #5&lt;br&gt;

&lt;font color=blue&gt;bClientAnim=&lt;/font&gt; If false, this seems to replicate all playanim calls to the client, negating the need for specialized playanim functions being replicated &lt;br&gt;

&lt;font color=blue&gt;DoubleName=&lt;/font&gt; this allows for a name change upon picking up another (when akimbo is available)&lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(0)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(1)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(2)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(3)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashVariations(4)=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;DoubleSwitchPriority=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;WeaponDescription=&lt;/font&gt; pretty self explanitory, its the string displayed as weapon info &lt;br&gt;

&lt;font color=blue&gt;aimerror=&lt;/font&gt; aim Error for bots (note this value doubled if instant hit weapon)&lt;br&gt;

&lt;font color=blue&gt;FireAdjust=&lt;/font&gt; magnitude of firing speed adjustment (%/100) based on skill for bots. (1.0 for non-bots)&lt;br&gt;

&lt;font color=blue&gt;InstFlash=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;InstFog=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;AmmoName=&lt;/font&gt; indicates the class that is picked up to add ammo &lt;br&gt;

&lt;font color=blue&gt;PickupAmmoCount=&lt;/font&gt; integer (or whole number) representing the amount of ammo weapon has upon pickup &lt;br&gt;

&lt;font color=blue&gt;bSplashDamage=&lt;/font&gt; tells bot AI whether it causes splash damage or not&lt;br&gt;

&lt;font color=blue&gt;bRecommendSplashDamage=&lt;/font&gt; if true, bot preferentially tries to use splash damage rather than direct hits&lt;br&gt;

&lt;font color=blue&gt;bRecommendAltSplashDamage=&lt;/font&gt; same as bRecommendSplashDamage, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;bWarnTarget=&lt;/font&gt; bot AI related - when firing projectile, warn the target&lt;br&gt;

&lt;font color=blue&gt;bAltWarnTarget=&lt;/font&gt; same as bWarnTarget, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;bInstantHit=&lt;/font&gt; [[Legacy:Boolean|Boolean]] or true/false setting for allowing instant hit damage, good for use when you need a fast hit from the weapon (like a rifle) with no projectile &lt;br&gt;

&lt;font color=blue&gt;bAltInstantHit=&lt;/font&gt; same as bInstantHit, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;ProjectileClass=&lt;/font&gt; class of the bullet to spawn when fired&lt;br&gt;

&lt;font color=blue&gt;AltProjectileClass=&lt;/font&gt; same as ProjectileClass, but for the AltFire function&lt;br&gt;

&lt;font color=blue&gt;FiringSpeed=&lt;/font&gt; used by human animations in determining firing speed&lt;br&gt;

&lt;font color=blue&gt;FireOffset=&lt;/font&gt; X, Y, and Z co-ordinates to adjust where a projectile or effect emits from weapon in first-person view, calculated from the playermodel's Mesh Origin &lt;br&gt;

&lt;font color=blue&gt;bMeleeWeapon=&lt;/font&gt; used by bot AI to determine if it is a close range weapon&lt;br&gt;

&lt;font color=blue&gt;bRapidFire=&lt;/font&gt; used by human animations in determining firing animation (for still firing)&lt;br&gt;

&lt;font color=blue&gt;MyDamageType=&lt;/font&gt; type of damage weapon inflicts, standard is &quot;shot&quot; &lt;br&gt;

&lt;font color=blue&gt;AltDamageType=&lt;/font&gt; type of damage AltFire inflicts, same as MyDamageType&lt;br&gt;

&lt;font color=blue&gt;shakevert=&lt;/font&gt; Screen shake vector X component&lt;br&gt;

&lt;font color=blue&gt;shakemag=&lt;/font&gt; Screen shake vector Z component&lt;br&gt;

&lt;font color=blue&gt;shaketime=&lt;/font&gt; Screen shake vector Y component&lt;br&gt;

&lt;font color=blue&gt;AIRating=&lt;/font&gt; used by bot AI - how much the use of this weapon is desired&lt;br&gt;

&lt;font color=blue&gt;RefireRate=&lt;/font&gt; used by bot AI - how much is the chance (%) of bot holding down the fire button&lt;br&gt;

&lt;font color=blue&gt;AltRefireRate=&lt;/font&gt; &lt;br&gt; same as RefireRate, but for the AltFire function

&lt;font color=blue&gt;FireSound=&lt;/font&gt; sound class played when Fire function is executed&lt;br&gt;

&lt;font color=blue&gt;AltFireSound=&lt;/font&gt; same as FireSound, but for the AltFire function &lt;br&gt;

&lt;font color=blue&gt;CockingSound=&lt;/font&gt; sound class played when CockingSound function is executed &lt;br&gt;

&lt;font color=blue&gt;SelectSound=&lt;/font&gt; sound class played when SelectSound function is executed &lt;br&gt;

&lt;font color=blue&gt;Misc1Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc2Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc3Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;Misc4Sound=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MessageNoAmmo=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;DeathMessage=&lt;/font&gt; message string displayed when weapon sucessfully scores a frag &lt;br&gt;

&lt;font color=blue&gt;NameColor=&lt;/font&gt; R, G, B values of weapon's name color when displayed &lt;br&gt;

&lt;font color=blue&gt;bDrawMuzzleFlash=&lt;/font&gt; [[Legacy:Boolean|Boolean]] switch for showing the muzzleflash on, or off &lt;br&gt;

&lt;font color=blue&gt;MuzzleScale=&lt;/font&gt; scale of muzzleflash model when displayed (as seen from first-person view) &lt;br&gt;

&lt;font color=blue&gt;FlashY=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashO=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashC=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashLength=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;FlashS=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MFTexture=&lt;/font&gt; texture class displayed as muzzleflash, can be animated (as seen from first-person view) &lt;br&gt;

&lt;font color=blue&gt;AutoSwitchPriority=&lt;/font&gt; integer ordering its priority of being auto-switched to when picked up, can be altered ingame from preferences &lt;br&gt;

&lt;font color=blue&gt;InventoryGroup=&lt;/font&gt; (not to clear on this...) integer assigning its space in the inventory. No two inventory items should have the same group, although it doesn't really seem to matter. I suggest doing it anyway, better safe than sorry.&lt;br&gt;

&lt;font color=blue&gt;PickupMessage=&lt;/font&gt; message string displayed upon weapon pickup&lt;br&gt;

&lt;font color=blue&gt;ItemName=&lt;/font&gt; name of the weapon when displayed &lt;br&gt;

&lt;font color=blue&gt;PlayerViewOffset=&lt;/font&gt; This is a drawing offset vector, noting that all values are multiplied by 100 (or -100)in the sethand function.&lt;br&gt;
** ''X'' Moves the gun Forwards or Backwards from the Player, ''Y'' Moves Left and Right, and Z moves Up and Down.

&lt;font color=blue&gt;PlayerViewMesh=&lt;/font&gt; lodmesh class used for first-person view of weapon (usually contains the most animations) &lt;br&gt;

&lt;font color=blue&gt;PickupViewMesh=&lt;/font&gt; lodmesh class used for the pickup version of weapon &lt;br&gt;

&lt;font color=blue&gt;ThirdPersonMesh=&lt;/font&gt; lodmesh class used for the third-person version of a weapon&lt;br&gt;

&lt;font color=blue&gt;StatusIcon=&lt;/font&gt; texture class determining what icon to use on the hud for weapon &lt;br&gt;

&lt;font color=blue&gt;bMuzzleFlashParticles=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashStyle=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashMesh=&lt;/font&gt; lodmesh class used for the third-person view of the muzzleflash &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashScale=&lt;/font&gt; scale of MuzzleFlashMesh &lt;br&gt;

&lt;font color=blue&gt;MuzzleFlashTexture=&lt;/font&gt; texture class used on MuzzleFlashMesh, can be animated &lt;br&gt;

&lt;font color=blue&gt;PickupSound=&lt;/font&gt; sound class played upon weapon pickup &lt;br&gt;

&lt;font color=blue&gt;Icon=&lt;/font&gt; texture class used on hud, similar to status icon&lt;br&gt;

&lt;font color=blue&gt;bHidden=&lt;/font&gt; [[Legacy:Boolean|Boolean]] setting used to make weapon invisible ingame &lt;br&gt;

&lt;font color=blue&gt;Mesh=&lt;/font&gt; lodmesh class displayed in weapon info screens, UnrealED'smesh editor for example&lt;br&gt;

&lt;font color=blue&gt;bNoSmooth=&lt;/font&gt; [[Legacy:Boolean|Boolean]] setting to turn off Unreal's automatic poly smoothing, makes meshes look more angular, good for flat edges or sharp corners (can be manipulated on a per-poly basis using [[Legacy:UnrealFX|UnrealFX]])&lt;br&gt;

&lt;font color=blue&gt;CollisionRadius=&lt;/font&gt; amount of unreal units horizontally from weapon origin collision occurs, see [[Legacy:Collision Detection|Collision Detection]]&lt;br&gt;

&lt;font color=blue&gt;CollisionHeight=&lt;/font&gt; amount of unreal units vertically collision occurs see[[Legacy:Collision Detection|Collision Detection]] &lt;br&gt;

&lt;font color=blue&gt;Rotation=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;BobDamping=&lt;/font&gt; how much to damp view bob&lt;br&gt;

&lt;font color=blue&gt;Mass=&lt;/font&gt; measure of mass of an object, only use i know of is so [[Legacy:Pawn (UT)|Pawn (UT)]] can determine which player animation to play with which items. e.g. mass &lt; 20 means small weapon hold and fire anims like pistol, mass &gt; 20 means large weapon hold and fire anims using 2 hands spread like rocket launcher. &lt;br&gt;

&lt;font color=blue&gt;SoundRadius=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;SoundVolume=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightEffect=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightBrightness=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightHue=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightSaturation=&lt;/font&gt; &lt;br&gt;

&lt;font color=blue&gt;LightRadius=&lt;/font&gt; &lt;br&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DefaultAmmo</title>
    <id>28426</id>
    <revision>
      <id>40098</id>
      <timestamp>2009-11-15T08:29:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DefaultPhysicsVolume</title>
    <id>1068</id>
    <revision>
      <id>2841</id>
      <timestamp>2005-12-31T19:37:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] -&gt; [[Legacy:Brush|Brush]] -&gt; [[Legacy:Volume|Volume]] -&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] -&gt; DefaultPhysicsVolume (Package: Engine)}}

The default physics volume for areas of the level with no physics volume specified.  It is a native, not-placable actor.

==Functions==
; Destroy() : Logs a message and raises an assertion; otherise EMPTY.  In other words, a DefaultPhysicsVolume object should never be deleted during the game. Probably the only reason &lt;tt&gt;bStatic&lt;/tt&gt; and &lt;tt&gt;bNoDelete&lt;/tt&gt; are false is so that any code that deletes one of these is immediately caught and fixed.

==Related Topics==
* [[Legacy:Working With Volumes|Working with Volumes]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2842</id>
      <timestamp>2005-01-13T23:17:10Z</timestamp>
      <contributor>
        <ip>Lepam03.pamlico.k12.nc.us</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>2843</id>
      <timestamp>2005-01-13T23:56:31Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| UT2003 :: [[Legacy:Actor|Actor]] -&gt; [[Legacy:Brush|Brush]] -&gt; [[Legacy:Volume|Volume]] -&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] -&gt; DefaultPhysicsVolume (Package: Engine)}}

The default physics volume for areas of the level with no physics volume specified.

This class has no variables, and the only function is Destroy, which logs a message and raises an assertion. In other words, a DefaultPhysicsVolume object should never be deleted during the game. Probably the only reason &lt;tt&gt;bStatic&lt;/tt&gt; and &lt;tt&gt;bNoDelete&lt;/tt&gt; are false is so that any code that deletes one of these is immediately caught and fixed.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DefaultPropertiesAligner</title>
    <id>1080</id>
    <revision>
      <id>2865</id>
      <timestamp>2005-10-05T10:58:04Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==About==

DefaultPropertiesAligner is a [[Legacy:WOTgreal|WOTgreal]] macro that will align selected DefaultProperties. 
* Selected DefaultProperties variables will be prefixed with the same number of spaces/tabs. 
* Selected DefaultProperties values will start at the same position.

Older engine builds may not like this.

==Before==

&lt;uscript&gt;
defaultproperties
{
    InventoryType=class'ShieldGun'

    PickupMessage=&quot;You got the Shield Gun.&quot;
    PickupSound=Sound'PickupSounds.ShieldGunPickup'
    PickupForce=&quot;ShieldGunPickup&quot;  // jdf

    MaxDesireability=+0.39

    StaticMesh=StaticMesh'WeaponStaticMesh.ShieldGunPickup'
    DrawType=DT_StaticMesh
    DrawScale=0.5
}
&lt;/uscript&gt;

==After==

&lt;uscript&gt;
defaultproperties
{
	InventoryType			= class'ShieldGun'

	PickupMessage			= &quot;You got the Shield Gun.&quot;
	PickupSound				= Sound'PickupSounds.ShieldGunPickup'
	PickupForce				= &quot;ShieldGunPickup&quot;  // jdf
							
	MaxDesireability		= +0.39

	StaticMesh				= StaticMesh'WeaponStaticMesh.ShieldGunPickup'
	DrawType				= DT_StaticMesh
	DrawScale				= 0.5
}
&lt;/uscript&gt;	

==Code==

&lt;uscript&gt;program DefaultPropertiesAligner
begin
    // ========================================================================
    //  UnrealScript DefaultProperties Aligner
    //
    //  Copyright 2005 Roman Switch` Dzieciol, neai o2.pl
    //  http://wiki.beyondunreal.com/wiki/Switch
    // ========================================================================

    UseTabs := 1;
    TabSize := 4;
    PrependTabs := 1;
    ExtraTabs := 1;
    
    // ========================================================================
    
    
    BlockBeginX, BlockBeginY := BlockBegin();
    BlockEndX, BlockEndY := BlockEnd();
    AlignPos := 0;
    
    // Find align line
    for line:=BlockBeginY to BlockEndY step 1 do
    begin
        SetCursorXY(0,line);
        sline := CurrentLine();
        
        spos := Pos('=',sline);
        if (spos &lt;&gt; 0) then
        begin
            sleft := Copy(sline,0,spos-1);
            sleft := Trim(sleft);
            slen := Length(sleft);
            if( slen &gt; AlignPos ) then
                AlignPos := slen;
        end;
    end;
    
    // Align selection
    if (AlignPos &lt;&gt; 0) then
    begin
        AlignPos := AlignPos + PrependTabs*TabSize;
        
        for line:=BlockBeginY to BlockEndY step 1 do
        begin
            SetCursorXY(0,line);
            sline := CurrentLine();
            spos := Pos('=',sline);
            if (spos &lt;&gt; 0) then
            begin
                sleft := Copy(sline,0,spos-1);
                sleft := Trim(sleft);
                sright := Copy(sline,spos+1,Length(sline)-spos);
                sright := Trim(sright);
                sres := sleft;
		                
                if (UseTabs = 1) then
                begin
                    for tabpre:=1 to PrependTabs step 1 do
                    begin
                        sres :=Chr(9) + sres;
                    end;     
                         
                    tend := Trunc(AlignPos / TabSize)+1+ExtraTabs;
                    tbeg := Trunc(Length(sleft) / TabSize)+PrependTabs;
                    tnum := tend-tbeg;
                    
                    for tabpost:=1 to tnum step 1 do
                    begin
                        sres := sres + Chr(9);
                    end;
                    
                    sres := sres + '=' + ' ' + sright;
                end;
                
                if (UseTabs = 0) then
                begin
                    
                    for numtabs:=1 to PrependTabs*TabSize step 1 do
                    begin
                        sres := ' ' + sres;
                    end;              
                    
                    tbeg := PrependTabs*TabSize + Length(sleft) + 1;
                    tend := (Trunc(AlignPos / TabSize)+1) * TabSize + ExtraTabs*TabSize;
                    
                    for numspaces:=tbeg to tend step 1 do
                    begin
                        sres := sres + ' ';
                    end;
                    
                    sres := sres + '=' + ' ' + sright;
                end;
                
                SetCurrentLine(sres);
            end;
        end;    
    end;  
end;
&lt;/uscript&gt;

[[Category:Legacy WOTgreal Macro|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2866</id>
      <timestamp>2005-10-05T05:04:51Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>DefaultPropertiesAligner</comment>
      <text xml:space="preserve">==About==

DefaultPropertiesAligner is a [[Legacy:WOTgreal|WOTgreal]] macro that will align selected DefaultProperties. 
* Selected DefaultProperties variables will be prefixed with the same number of spaces/tabs. 
* Selected DefaultProperties values will start at the same position.

Older engine builds may not like this.

==Before==

&lt;uscript&gt;
defaultproperties
{
    InventoryType=class'ShieldGun'

    PickupMessage=&quot;You got the Shield Gun.&quot;
    PickupSound=Sound'PickupSounds.ShieldGunPickup'
    PickupForce=&quot;ShieldGunPickup&quot;  // jdf

    MaxDesireability=+0.39

    StaticMesh=StaticMesh'WeaponStaticMesh.ShieldGunPickup'
    DrawType=DT_StaticMesh
    DrawScale=0.5
}
&lt;/uscript&gt;

==After==

&lt;uscript&gt;
defaultproperties
{
	InventoryType			= class'ShieldGun'

	PickupMessage			= &quot;You got the Shield Gun.&quot;
	PickupSound				= Sound'PickupSounds.ShieldGunPickup'
	PickupForce				= &quot;ShieldGunPickup&quot;  // jdf
							
	MaxDesireability		= +0.39

	StaticMesh				= StaticMesh'WeaponStaticMesh.ShieldGunPickup'
	DrawType				= DT_StaticMesh
	DrawScale				= 0.5
}
&lt;/uscript&gt;	

==Code==

&lt;uscript&gt;program DefaultPropertiesAligner
begin
    // ========================================================================
    //  UnrealScript DefaultProperties Aligner
    //
    //  Copyright 2005 Roman Switch` Dzieciol, neai o2.pl
    //  http://wiki.beyondunreal.com/wiki/Switch
    // ========================================================================

    UseTabs := 1;
    TabSize := 4;
    PrependTabs := 1;
    ExtraTabs := 1;
    
    // ========================================================================
    
    
    BlockBeginX, BlockBeginY := BlockBegin();
    BlockEndX, BlockEndY := BlockEnd();
    AlignPos := 0;
    
    // Find align line
    for line:=BlockBeginY to BlockEndY step 1 do
    begin
        SetCursorXY(0,line);
        sline := CurrentLine();
        
        spos := Pos('=',sline);
        if (spos &lt;&gt; 0) then
        begin
            sleft := Copy(sline,0,spos-1);
            sleft := Trim(sleft);
            slen := Length(sleft);
            if( slen &gt; AlignPos ) then
                AlignPos := slen;
        end;
    end;
    
    // Align selection
    if (AlignPos &lt;&gt; 0) then
    begin
        AlignPos := AlignPos + PrependTabs*TabSize;
        
        for line:=BlockBeginY to BlockEndY step 1 do
        begin
            SetCursorXY(0,line);
            sline := CurrentLine();
            spos := Pos('=',sline);
            if (spos &lt;&gt; 0) then
            begin
                sleft := Copy(sline,0,spos-1);
                sleft := Trim(sleft);
                sright := Copy(sline,spos+1,Length(sline)-spos);
                sright := Trim(sright);
                sres := sleft;
		                
                if (UseTabs = 1) then
                begin
                    for tabpre:=1 to PrependTabs step 1 do
                    begin
                        sres :=Chr(9) + sres;
                    end;     
                         
                    tend := Trunc(AlignPos / TabSize)+1+ExtraTabs;
                    tbeg := Trunc(Length(sleft) / TabSize)+PrependTabs;
                    tnum := tend-tbeg;
                    
                    for tabpost:=1 to tnum step 1 do
                    begin
                        sres := sres + Chr(9);
                    end;
                    
                    sres := sres + '=' + ' ' + sright;
                end;
                
                if (UseTabs = 0) then
                begin
                    
                    for numtabs:=1 to PrependTabs*TabSize step 1 do
                    begin
                        sres := ' ' + sres;
                    end;              
                    
                    tbeg := PrependTabs*TabSize + Length(sleft) + 1;
                    tend := (Trunc(AlignPos / TabSize)+1) * TabSize + ExtraTabs*TabSize;
                    
                    for numspaces:=tbeg to tend step 1 do
                    begin
                        sres := sres + ' ';
                    end;
                    
                    sres := sres + '=' + ' ' + sright;
                end;
                
                SetCurrentLine(sres);
            end;
        end;    
    end;  
end;
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DefensePoint</title>
    <id>957</id>
    <revision>
      <id>2598</id>
      <timestamp>2006-02-10T00:30:36Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:AmbushPoint|AmbushPoint]] &gt;&gt; DefensePoint (Package: Botpack)}}

''See also [[Legacy:Creating A Defense Point In UT200x|Creating A Defense Point In UT200x]].''

A DefensePoint tells a bot that this spot is a good place to defend the base. Defense points can also be used with [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]s to set up sniping posts; don't forget to set bSniping to true.

Read [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] for more info on placing DefensePoints.

==Properties==

===Inherited from AmbushPoint===
; bool bSniping : Defaults to &lt;tt&gt;false&lt;/tt&gt;. Set this to &lt;tt&gt;true&lt;/tt&gt; if you want bots to use this DefensePoint as a spot for sniping.
; float SightRadius : In world units, the radius the bot standing on the DefensePoint will look for enemies, either for sniping or normal defending. Defaults to 5,000 world units.

===DefensePoint Group===
; name FortTag :Used in [[Legacy:Assault|Assault]] maps (and possibly other gametypes) to associate the DefensePoint with a certain object/goal that is being defended.
; byte Priority : This is the weight the DefensePoint is given when a bot is selecting a spot upon which to defend. Give more critical points higher values and give auxiliary spots like sniping points lesser values.
; byte Team :This is the number of the team that will use the DefensePoint. See [[Legacy:PlayerStart|PlayerStart]] for what number represents each color team.

==Related Topics==
* [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]
* [[Legacy:Strategic Bots|Strategic Bots]]
** [[Legacy:Creating A Defense Point In UT200x|Creating a Defense Point in UT200x]]
** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]

==Comments==

'''Birelli:''' I'm not sure but I believe that if any DefensePoint on a given team/fort has a priority greater than 0, then any DefensePoint with a value of 0 is ignored

'''Legal:''' Where does the bot stand?  The center, anywhere within collision radius etc...?

'''Tarquin:''' Centre, I think. 

'''Legal:''' :pissed:

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2599</id>
      <timestamp>2003-01-31T23:55:48Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:AmbushPoint|AmbushPoint]] &gt;&gt; DefensePoint}}

''See also [[Legacy:Creating A Defense Point In UT2003|Creating A Defense Point In UT2003]].''

A DefensePoint tells a bot that this spot is a good place to defend the base. Defense points can also be used with [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]s to set up sniping posts; don't forget to set bSniping to true.

Read [[Legacy:Strategic Bots|Strategic Bots]] for more info on placing DefensePoints.

==Properties ==

===Inherited from AmbushPoint ===

These properties are listed under the AmbushPoint tab which is contained within the properties of the DefensePoint actor

;bSniping :Defaults to &lt;tt&gt;false&lt;/tt&gt;. Set this to &lt;tt&gt;true&lt;/tt&gt; if you want bots to use this DefensePoint as a spot for sniping.

;SightRadius :In world units, the radius the bot standing on the DefensePoint will look for enemies, either for sniping or normal defending. Defaults to 5,000 world units.

===DefensePoint Properties ===

These are listed under the DefensePoint tab in the properties sheet.

;FortTag :Used in [[Legacy:Assault|Assault]] maps (and possibly other gametypes) to associate the DefensePoint with a certain object/goal that is being defended.

;Priority : This is the weight the DefensePoint is given when a bot is selecting a spot upon which to defend. Give more critical points higher values and give auxiliary spots like sniping points lesser values.

:: &lt;i&gt;I'm not sure but I believe that if any DefensePoint on a given team/fort has a priority greater than 0, then any DefensePoint with a value of 0 is ignored &amp;ndash; Birelli&lt;/i&gt;

;Team :This is the number of the team that will use the DefensePoint. See [[Legacy:PlayerStart|PlayerStart]] for what number represents each color team.

==Related Topics ==
*[[Legacy:AmbushPoint|AmbushPoint]]
*[[Legacy:DistanceViewTrigger|DistanceViewTrigger]]
*[[Legacy:Strategic Bots|Strategic Bots]]

==Comments ==

'''Legal:''' Where does the bot stand? The center, anywhere within collision radius etc...?

'''Tarquin:''' Centre, I think. 

'''Legal:''' :pissed:

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2600</id>
      <timestamp>2003-05-23T16:09:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:AmbushPoint|AmbushPoint]] &gt;&gt; DefensePoint (Package: Botpack)}}

''See also [[Legacy:Creating A Defense Point In UT2003|Creating A Defense Point In UT2003]].''

A DefensePoint tells a bot that this spot is a good place to defend the base. Defense points can also be used with [[Legacy:DistanceViewTrigger|DistanceViewTrigger]]s to set up sniping posts; don't forget to set bSniping to true.

Read [[Legacy:Strategic Bots|Strategic Bots]] for more info on placing DefensePoints.

==Properties ==

===Inherited from AmbushPoint ===
;bool bSniping : Defaults to &lt;tt&gt;false&lt;/tt&gt;. Set this to &lt;tt&gt;true&lt;/tt&gt; if you want bots to use this DefensePoint as a spot for sniping.

;float SightRadius : In world units, the radius the bot standing on the DefensePoint will look for enemies, either for sniping or normal defending. Defaults to 5,000 world units.

===DefensePoint Group ===
;name FortTag :Used in [[Legacy:Assault|Assault]] maps (and possibly other gametypes) to associate the DefensePoint with a certain object/goal that is being defended.

;byte Priority : This is the weight the DefensePoint is given when a bot is selecting a spot upon which to defend. Give more critical points higher values and give auxiliary spots like sniping points lesser values.

'''Birelli:''' I'm not sure but I believe that if any DefensePoint on a given team/fort has a priority greater than 0, then any DefensePoint with a value of 0 is ignored

;byte Team :This is the number of the team that will use the DefensePoint. See [[Legacy:PlayerStart|PlayerStart]] for what number represents each color team.

==Related Topics ==
*[[Legacy:DistanceViewTrigger|DistanceViewTrigger]]
*[[Legacy:Strategic Bots|Strategic Bots]]

==Comments ==

'''Legal:''' Where does the bot stand? The center, anywhere within collision radius etc...?

'''Tarquin:''' Centre, I think. 

'''Legal:''' :pissed:

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Defining SpeciesTypes</title>
    <id>987</id>
    <revision>
      <id>2665</id>
      <timestamp>2004-03-09T23:25:47Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page describes how to use the [[Legacy:Object|Object]] &gt;&gt; [[Legacy:SpeciesType|SpeciesType]] class to implement different species with different characteristics in [[Legacy:UT2003|UT2003]].

These characteristics can be e.g.:
* the ground speed of a pawn
* the jump height of a pawn
* the acceleration when running
* change the damage done to a pawn (like a species having an armoured skin)
* change the damage that this pawn does to others (like a species having a nasty punch)

First, lets start with an overview of the classes that contribute to the species-system (they are explained in more detail later):
; SpeciesType : This class and its subclasses define the species and their individual characteristics. UT2003 e.g. comes with several build-in species like &lt;tt&gt;SPECIES_Alien&lt;/tt&gt;, &lt;tt&gt;SPECIES_Bot&lt;/tt&gt;, &lt;tt&gt;SPECIES_Human&lt;/tt&gt; (where the humans have some sub-species, namely &lt;tt&gt;SPECIES_Egypt&lt;/tt&gt;, &lt;tt&gt;SPECIES_Merc&lt;/tt&gt; and &lt;tt&gt;SPECIES_Night&lt;/tt&gt;), and &lt;tt&gt;SPECIES_Jugg&lt;/tt&gt;. You can easily expand these to form your own species with their own characteristics. See [[Legacy:SpeciesType|SpeciesType]]
; xPawn : xPawn has the member &lt;tt&gt;Species&lt;/tt&gt; of type [[Legacy:SpeciesType|SpeciesType]] to define the Species that this xPawn is of.
; MutSpeciesStats : Is a mutator that activates the species-system ingame.
; SpeciesGameRules : Are species-specific game rules activated by the MutSpeciesStats.
; [[Legacy:UPL File|UPL File]] files : define player-models, including their assigned species.

These classes (resp.files) are explained in more detail now.

==xPawn==
* has the member &lt;tt&gt;Species&lt;/tt&gt; of type &lt;tt&gt;SpeciesType&lt;/tt&gt; that defines its Species. This member's default property is set in the defaultproperties.

&lt;uscript&gt;
defaultproperties
{ 
  ...
  Species=class'SPECIES_Jugg'
  ...
}
&lt;/uscript&gt;

Its real value is determined at runtime in the function &lt;tt&gt;[[Legacy:XPawn|xPawn]].Setup&lt;/tt&gt; that uses the class &lt;tt&gt;xUtil&lt;/tt&gt; to find the player record that is defined for a character name:

&lt;uscript&gt;
rec = class'xUtil'.static.FindPlayerRecord(&quot;Gorge&quot;);
&lt;/uscript&gt;

This function is native, that is, it is implemented in the C/C++ core and its sourcecode is not accessible, but I assume it just searches all .upl files and returns the player record who's DefaultName matches the given character name. 

==.upl ==

The .upl files define the characters, i.e. how they look (Mesh, Skin), what portrait they have in the player selection menu, their favorite weapon (in case its a bot) and of course their species type. I guess since you can set the sex of an character in the .upl file that this also defines the voice of that character. .upl files are located in the UT2003/System directory and look like this:

&lt;uscript&gt;
[Public]
Player=(DefaultName=&quot;Diva&quot;,Mesh=HumanFemaleA.EgyptFemaleA,species=xGame.SPECIES_Egypt,BodySkin=PlayerSkins.EgyptFemaleABodyA,FaceSkin=PlayerSkins.EgyptFemaleAHeadA,Portrait=PlayerPictures.cEgyptFemaleAA,Text=XPlayers.EgyptFemaleAA,Sex=Female,Menu=&quot;SP&quot;,Aggressiveness=+0.4,CombatStyle=+0.4,FavoriteWeapon=xWeapons.RocketLauncher,bJumpy=1,StrafingAbility=+0.5)
Player=(DefaultName=&quot;Scarab&quot;,Mesh=HumanMaleA.EgyptMaleA,species=xGame.SPECIES_Egypt,BodySkin=PlayerSkins.EgyptMaleABodyA,FaceSkin=PlayerSkins.EgyptMaleAHeadA,Portrait=PlayerPictures.cEgyptMaleAA,Text=XPlayers.EgyptMaleAA,Sex=Male,Menu=&quot;SP&quot;,Tactics=1.0,FavoriteWeapon=xWeapons.LinkGun,CombatStyle=-0.1,StrafingAbility=+0.4,Accuracy=-0.4)
...
&lt;/uscript&gt;

==MutSpeciesStat==
* activates the &lt;tt&gt;SpeciesGameRules&lt;/tt&gt; to use the species-specific damage system.
* modifies xPawns to species-specific attributes like GroundSpeed, WaterSpeed, Jump-Height etc. in &lt;tt&gt;ModifyPawn&lt;/tt&gt;.

You should use this Mutator if you want the species-system to be activated.

==SpeciesGameRules==
* modifies damage done to an xPawn, depending on the species of that pawn (&lt;tt&gt;SpeciesGameRules.ModifyReceivedDamage&lt;/tt&gt;)
* modifies damage done to an xPawn, depending on the species of the instigator (&lt;tt&gt;SpeciesGameRules.ModifyImpartedDamage&lt;/tt&gt;)

You could create your own species game rules that extend these game rules and define more sophisticated species-related stuff.</text>
    </revision>
    <revision>
      <id>2666</id>
      <timestamp>2004-03-09T23:02:24Z</timestamp>
      <contributor>
        <ip>Winterwing</ip>
      </contributor>
      <minor/>
      <comment>some punctuation</comment>
      <text xml:space="preserve">This page describes how to use the [[Legacy:Object|Object]] &gt;&gt; [[Legacy:SpeciesType|SpeciesType]] class to implement different species with different characteristics in [[Legacy:UT2003|UT2003]].

These characteristics can be e.g.:
* the ground speed of a pawn
* the jump height of a pawn
* the acceleration when running
* change the damage done to a pawn (like a species having an armoured skin)
* change the damage that this pawn does to others (like a species having a nasty punch)

First, lets start with an overview of the classes that contribute to the species-system (they are explained in more detail later):
; SpeciesType : This class and its subclasses define the species and their individual characteristics. UT2003 e.g. comes with several build-in species like &lt;tt&gt;SPECIES_Alien&lt;/tt&gt;, &lt;tt&gt;SPECIES_Bot&lt;/tt&gt;, &lt;tt&gt;SPECIES_Human&lt;/tt&gt; (where the humans have some sub-species, namely &lt;tt&gt;SPECIES_Egypt&lt;/tt&gt;, &lt;tt&gt;SPECIES_Merc&lt;/tt&gt; and &lt;tt&gt;SPECIES_Night&lt;/tt&gt;), and &lt;tt&gt;SPECIES_Jugg&lt;/tt&gt;. You can easily expand these to form your own species with their own characteristics.
; xPawn : xPawn has the member &lt;tt&gt;Species&lt;/tt&gt; of type [[Legacy:SpeciesType|SpeciesType]] to define the Species that this xPawn is of.
; MutSpeciesStats : Is a mutator that activates the species-system ingame.
; SpeciesGameRules : Are species-specific game rules activated by the MutSpeciesStats.
; [[Legacy:UPL File|UPL File]] files : define player-models, including their assigned species.

These classes (resp.files) are explained in more detail now.

==xPawn==
* has the member &lt;tt&gt;Species&lt;/tt&gt; of type &lt;tt&gt;SpeciesType&lt;/tt&gt; that defines its Species. This member's default property is set in the defaultproperties.

&lt;uscript&gt;
defaultproperties
{ 
  ...
  Species=class'SPECIES_Jugg'
  ...
}
&lt;/uscript&gt;

Its real value is determined at runtime in the function &lt;tt&gt;[[Legacy:XPawn|xPawn]].Setup&lt;/tt&gt; that uses the class &lt;tt&gt;xUtil&lt;/tt&gt; to find the player record that is defined for a character name:

&lt;uscript&gt;
rec = class'xUtil'.static.FindPlayerRecord(&quot;Gorge&quot;);
&lt;/uscript&gt;

This function is native, that is, it is implemented in the C/C++ core and its sourcecode is not accessible, but I assume it just searches all .upl files and returns the player record who's DefaultName matches the given character name. 

====.upl ====

The .upl files define the characters, i.e. how they look (Mesh, Skin), what portrait they have in the player selection menu, their favorite weapon (in case its a bot) and of course their species type. I guess since you can set the sex of an character in the .upl file that this also defines the voice of that character. .upl files are located in the UT2003/System directory and look like this:

&lt;uscript&gt;
[Public]
Player=(DefaultName=&quot;Diva&quot;,Mesh=HumanFemaleA.EgyptFemaleA,species=xGame.SPECIES_Egypt,BodySkin=PlayerSkins.EgyptFemaleABodyA,FaceSkin=PlayerSkins.EgyptFemaleAHeadA,Portrait=PlayerPictures.cEgyptFemaleAA,Text=XPlayers.EgyptFemaleAA,Sex=Female,Menu=&quot;SP&quot;,Aggressiveness=+0.4,CombatStyle=+0.4,FavoriteWeapon=xWeapons.RocketLauncher,bJumpy=1,StrafingAbility=+0.5)
Player=(DefaultName=&quot;Scarab&quot;,Mesh=HumanMaleA.EgyptMaleA,species=xGame.SPECIES_Egypt,BodySkin=PlayerSkins.EgyptMaleABodyA,FaceSkin=PlayerSkins.EgyptMaleAHeadA,Portrait=PlayerPictures.cEgyptMaleAA,Text=XPlayers.EgyptMaleAA,Sex=Male,Menu=&quot;SP&quot;,Tactics=1.0,FavoriteWeapon=xWeapons.LinkGun,CombatStyle=-0.1,StrafingAbility=+0.4,Accuracy=-0.4)
...
&lt;/uscript&gt;

====MutSpeciesStat===
* activates the &lt;tt&gt;SpeciesGameRules&lt;/tt&gt; to use the species-specific damage system.
* modifies xPawns to species-specific attributes like GroundSpeed, WaterSpeed, Jump-Height etc. in &lt;tt&gt;ModifyPawn&lt;/tt&gt;.

You should use this Mutator if you want the species-system to be activated.

====SpeciesGameRules====
* modifies damage done to an xPawn, depending on the species of that pawn (&lt;tt&gt;SpeciesGameRules.ModifyReceivedDamage&lt;/tt&gt;)
* modifies damage done to an xPawn, depending on the species of the instigator (&lt;tt&gt;SpeciesGameRules.ModifyImpartedDamage&lt;/tt&gt;)

You could create your own species game rules that extend these game rules and define more sophisticated species-related stuff.

====SpeciesType====

see [[Legacy:SpeciesType|SpeciesType]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Defx</title>
    <id>1082</id>
    <revision>
      <id>2870</id>
      <timestamp>2006-04-15T22:34:16Z</timestamp>
      <contributor>
        <ip>Defx</ip>
      </contributor>
      <minor/>
      <comment>=</comment>
      <text xml:space="preserve">===Who am i===

    Noob coder with &lt;u&gt;minor&lt;/u&gt; experience in scripting and map making

===Projects===

    my goal is to make a gundam seed mod for ut2004 i know thats gonna take a while so im
    actually learning how first 

====Extended Shock Rifle (needs better name)====

   This is a mutator for the Shock Rifle (duh), it is supposed to change the shock ball properties
   according to the amount of time you hold the button, better features in the future

modified classes

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;xShockRifle&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class xShockrifle extends ShockRifle;

defaultproperties
{
FireModeClass(0)=ShockBeamFire
FireModeClass(1)=xShockProjFire
PickupClass=class'xShockRiflePickup'
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;xShockRiflePickup&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class xShockRiflePickup extends ShockRiflePickup;

defaultproperties
{
    PickupMessage=&quot;You got the EXT Shock Rifle.&quot;
    InventoryType=class'xShockRifle'
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;xShockProjectile&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class xShockProjectile extends ShockProjectile;

var int ProjSpeed;


defaultproperties
{
    Speed=900
    MaxSpeed=900
    Damage=75
    DamageRadius=150
    MomentumTransfer=70000
    ComboDamage=500
    ComboRadius=350
    ComboMomentumTransfer=200000
    LifeSpan=20.0'
    DrawScale=1.5
    CollisionRadius=15
    CollisionHeight=15
    AmbientSound=Sound'WeaponSounds.ShockRifle.ShockRifleProjectile'
    ComboAmmoCost=5
}
&lt;uscript&gt;
&lt;/+&gt;
&lt;+&gt;xShockProjFire
&lt;uscript&gt;
class xShockProjFire extends ShockProjFire;

var() float         mSpeedMin;
var() float         mSpeedMax;
var() float         mHoldSpeedMin;
var() float         mHoldSpeedMax;
var() float         mHoldSpeedGainPerSec;
var() float         mHoldClampMax;
var float ClickTime;

function projectile SpawnProjectile(Vector Start, Rotator Dir) //taken from AssaultGrenade
{
    local xShockProjectile g;
    local vector X, Y, Z;


    g = Weapon.Spawn(class'xShockProjectile', instigator,, Start, Dir);
    if (g != None)
    {
        Weapon.GetViewAxes(X,Y,Z);

		if ( Bot(Instigator.Controller) != None )
			g.Speed = mHoldSpeedMax;
		else
			g.Speed = mHoldSpeedMax - HoldTime*mHoldSpeedGainPerSec;
		g.Speed = FClamp(g.Speed, mHoldSpeedMin, mHoldSpeedMax);
        g.Velocity = g.Speed * Vector(Dir);

        g.Damage *= DamageAtten;
    }
    return g;
}


defaultproperties
{
    ProjectileClass=class'xShockRifle.xShockProjectile'
    bFireOnRelease=true
    mHoldSpeedMin=850
    mHoldSpeedMax=1600
    mHoldSpeedGainPerSec=750
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;MUTxShockRifle&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class MutxShockRifle extends Mutator //taken from [[Weapon Mutator Tuorial]]
    config(user);

//=============================================================================
function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
{
    local int i;
    local WeaponLocker L;

    bSuperRelevant = 0;

    if ( xWeaponBase(Other) != None )
    {
        if ( string( xWeaponBase(Other).WeaponType ) ~= &quot;XWeapons.ShockRifle&quot; )
        {
            xWeaponBase(Other).WeaponType = class'xShockRifle';
            return false;
        }
    }
    else if ( WeaponPickup(Other) != None )
    {
        if ( string(Other.Class) ~= &quot;XWeapons.ShockRiflePickup&quot; )
        {
            ReplaceWith( Other, &quot;xShockRiflePickup&quot; );
            return false;
        }
    }
    else if ( WeaponLocker(Other) != None )
    {
        L = WeaponLocker(Other);

        for (i = 0; i &lt; L.Weapons.Length; i++)
        {
            if ( string( L.Weapons[i].WeaponClass ) ~= &quot;XWeapons.ShockRifle&quot; )
                L.Weapons[i].WeaponClass = class'xShockRifle';
        }
    }

    return true;
}

//=============================================================================
defaultproperties
{
     GroupName=&quot;EXT ShockRifle&quot;
     FriendlyName=&quot;EXT ShockRifle&quot;
     Description=&quot;Gives the shockrifle extra combo power.&quot;
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

====Seed Mode====

    its supposed to give the pawn some special
    abilities once the controller reaches 100 adrenaline

this is the current code

help would be greatly appreciated, if you want you can check my thread at BUF[http://forums.beyondunreal.com/showthread.php?p=1969461#post1969461 Here]

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;0.2 - current (using state method, having problems with locals inside states)&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
//-----------------------------------------------------------
//       Seed mode mutator
//-----------------------------------------------------------
class MutSEEDmode extends Mutator;

var int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
        SetTimer(1.0,true);
}

auto state Idle
{
    function Timer()
    {
            local Controller C;

            for (C = Level.ControllerList; C != None; C = C.NextController)
            {
                    If(C.Adrenaline == C.AdrenalineMax)
                    {
                          Gotostate('Start');
                    }

                    //if (C.Pawn != None &amp;&amp; C.Adrenaline &lt;= C.AdrenalineMax )
                    //{
                    //         C.Adrenaline = Min( C.Adrenaline-AdrenalineDecrease, C.AdrenalineMax );
                    //}
            }
    }
}

state Start
{
        local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
              if (C.Pawn != None &amp;&amp; C.Adrenaline == 100)
              {
                      PlayerController(C).ClientMessage(&quot;Seed Mode activated&quot;);
                      C.Pawn.Health = 199;
                      C.Pawn.GroundSpeed = 700;
                      Gotostate('Running')
              }
        }
}

state Runnning
{
        local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
            if (C.Pawn != None &amp;&amp; C.Adrenaline &gt; 0)
            {
                    C.Adrenaline -= -1;
                    Sleep(1.0);
                    Gotostate('Running')
            }
            else
            {
                    Gotostate('End')
            }
        }
}


state End
{

local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
             PlayerController(C).ClientMessage(&quot;Seed Mode deactivated&quot;);
                      C.Pawn.Health = 100;
                      C.Pawn.GroundSpeed = 450;
                      Gotostate('Idle')
        }
}



defaultproperties
{
       AdrenalineDecrease=1
       IconMaterialName=&quot;MutatorArt.nosym&quot;
       ConfigMenuClassName=&quot;&quot;
       GroupName=&quot;SEED&quot;
       FriendlyName=&quot;SEED mode&quot;
       Description=&quot;Seed mode is activated upon reaching 100 adrenaline.&quot;
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;0.15 function Seedmode is being called by Timer as i have set timer to repeat every second&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
//-----------------------------------------------------------
//      SEED mode
//-----------------------------------------------------------
class SeedMode extends Mutator;

var int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}

function Timer()
{
        local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
                If(C.Adrenaline == C.AdrenalineMax)
                {
                         SeedMode();
                }

                if (C.Pawn != None &amp;&amp; C.Adrenaline &lt; C.AdrenalineMax )
                {
                         C.Adrenaline = Min( C.Adrenaline-AdrenalineDecrease, C.AdrenalineMax );
                }
        }
}

function SeedMode()
{
     local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
         if (C.Pawn != None &amp;&amp; C.Adrenaline == 100)
         {
            PlayerController(C).ClientMessage(&quot;Seed Mode (well mot yet =D)&quot;);
         }
    }
}


defaultproperties
{
    AdrenalineDecrease=1
    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;&quot;
    GroupName=&quot;SEED&quot;
    FriendlyName=&quot;SEED mode&quot;
    Description=&quot;Seed mode is activated upon reaching 100 adrenaline.&quot;
}

&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;0.1 - did not work at all&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
//-----------------------------------------------------------
//      SEED mode
//-----------------------------------------------------------
class SeedMode extends Mutator;

var int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}

function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
		if (C.Pawn != None &amp;&amp; C.Adrenaline &lt; C.AdrenalineMax )
        {
            C.Adrenaline = Min( C.Adrenaline-AdrenalineDecrease, C.AdrenalineMax );
        }
    }
}

function SeedMode()
{
     local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
         if (C.Pawn != None &amp;&amp; C.Adrenaline == 100)
         {
            PlayerController(C).ClientMessage(&quot;Seed Mode (well mot yet =D)&quot;);
         }
    }
}


defaultproperties
{
    AdrenalineDecrease=1
    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;&quot;
    GroupName=&quot;SEED&quot;
    FriendlyName=&quot;SEED mode&quot;
    Description=&quot;Seed mode is activated upon reaching 100 adrenaline.&quot;
}

&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

----

==Comments==

'''MythOpus:''' Tip from one unreal scripter to another... Take small steps first.  They really help in the long run.

'''Defx:''' Dont worry, i am ^^

'''Sweavo:''' Howdy.  A tip from someone who's just spent 8 hours learning the hard way: do just about everything on the server, and [[Legacy:Debugging Techniques|test with a network game!]]

'''Guest:''' do just about everything on the server? what do you mean? =]

'''Sweavo:''' Check out [[Legacy:Replication|Replication]] for a brain-bender.  In network play, you need to be aware of what is present on the server and what is present on the client, and of the stuff that's on the client, you need to be aware of what's getting run and what isn't.  In standalone mode none of that matters much.  So you can get something working great in standalone mode but have to throw heaps of it away to get to network play.  If your mod doesn't work in net play then it's not going to get on the public server, and won't get you chicks*.

* I can pretty much guarantee it won't get you chicks.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2871</id>
      <timestamp>2006-04-15T22:27:30Z</timestamp>
      <contributor>
        <ip>201-14-172-51.bnut3702.dsl.brasiltelecom.net.br</ip>
      </contributor>
      <comment>added my current project</comment>
      <text xml:space="preserve">===Who am i===

    Noob coder with &lt;u&gt;minor&lt;/u&gt; experience in scripting and map making

===Projects===

    my goal is to make a gundam seed mod for ut2004 i know thats gonna take a while so im
    actually learning how first 

===Extended Shock Rifle (needs better name)===

   This is a mutator for the Shock Rifle (duh), it is supposed to change the shock ball properties
   according to the amount of time you hold the button, better features in the future

modified classes

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;xShockRifle&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class xShockrifle extends ShockRifle;

defaultproperties
{
FireModeClass(0)=ShockBeamFire
FireModeClass(1)=xShockProjFire
PickupClass=class'xShockRiflePickup'
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;xShockRiflePickup&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class xShockRiflePickup extends ShockRiflePickup;

defaultproperties
{
    PickupMessage=&quot;You got the EXT Shock Rifle.&quot;
    InventoryType=class'xShockRifle'
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;  

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;xShockProjectile&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class xShockProjectile extends ShockProjectile;

var int ProjSpeed;


defaultproperties
{
    Speed=900
    MaxSpeed=900
    Damage=75
    DamageRadius=150
    MomentumTransfer=70000
    ComboDamage=500
    ComboRadius=350
    ComboMomentumTransfer=200000
    LifeSpan=20.0'
    DrawScale=1.5
    CollisionRadius=15
    CollisionHeight=15
    AmbientSound=Sound'WeaponSounds.ShockRifle.ShockRifleProjectile'
    ComboAmmoCost=5
}
&lt;uscript&gt;
&lt;/+&gt;  
&lt;+&gt;xShockProjFire
&lt;uscript&gt;
class xShockProjFire extends ShockProjFire;

var() float         mSpeedMin;
var() float         mSpeedMax;
var() float         mHoldSpeedMin;
var() float         mHoldSpeedMax;
var() float         mHoldSpeedGainPerSec;
var() float         mHoldClampMax;
var float ClickTime;

function projectile SpawnProjectile(Vector Start, Rotator Dir) //taken from AssaultGrenade
{
    local xShockProjectile g;
    local vector X, Y, Z;


    g = Weapon.Spawn(class'xShockProjectile', instigator,, Start, Dir);
    if (g != None)
    {
        Weapon.GetViewAxes(X,Y,Z);

		if ( Bot(Instigator.Controller) != None )
			g.Speed = mHoldSpeedMax;
		else
			g.Speed = mHoldSpeedMax - HoldTime*mHoldSpeedGainPerSec;
		g.Speed = FClamp(g.Speed, mHoldSpeedMin, mHoldSpeedMax);
        g.Velocity = g.Speed * Vector(Dir);

        g.Damage *= DamageAtten;
    }
    return g;
}


defaultproperties
{
    ProjectileClass=class'xShockRifle.xShockProjectile'
    bFireOnRelease=true
    mHoldSpeedMin=850
    mHoldSpeedMax=1600
    mHoldSpeedGainPerSec=750
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;  

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;MUTxShockRifle&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
class MutxShockRifle extends Mutator //taken from [[Weapon Mutator Tutorial]]
    config(user);

//=============================================================================
function bool CheckReplacement( Actor Other, out byte bSuperRelevant )
{
    local int i;
    local WeaponLocker L;

    bSuperRelevant = 0;

    if ( xWeaponBase(Other) != None )
    {
        if ( string( xWeaponBase(Other).WeaponType ) ~= &quot;XWeapons.ShockRifle&quot; )
        {
            xWeaponBase(Other).WeaponType = class'xShockRifle';
            return false;
        }
    }
    else if ( WeaponPickup(Other) != None )
    {
        if ( string(Other.Class) ~= &quot;XWeapons.ShockRiflePickup&quot; )
        {
            ReplaceWith( Other, &quot;xShockRiflePickup&quot; );
            return false;
        }
    }
    else if ( WeaponLocker(Other) != None )
    {
        L = WeaponLocker(Other);

        for (i = 0; i &lt; L.Weapons.Length; i++)
        {
            if ( string( L.Weapons[i].WeaponClass ) ~= &quot;XWeapons.ShockRifle&quot; )
                L.Weapons[i].WeaponClass = class'xShockRifle';
        }
    }

    return true;
}

//=============================================================================
defaultproperties
{
     GroupName=&quot;EXT ShockRifle&quot;
     FriendlyName=&quot;EXT ShockRifle&quot;
     Description=&quot;Gives the shockrifle extra combo power.&quot;
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;       
    

====Seed Mode====

    its supposed to give the pawn some special
    abilities once the controller reaches 100 adrenaline

this is the current code

help would be greatly appreciated, if you want you can check my thread at BUF[http://forums.beyondunreal.com/showthread.php?p=1969461#post1969461 Here]

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;0.2 - current (using state method, having problems with locals inside states)&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
//-----------------------------------------------------------
//       Seed mode mutator
//-----------------------------------------------------------
class MutSEEDmode extends Mutator;

var int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
        SetTimer(1.0,true);
}

auto state Idle
{
    function Timer()
    {
            local Controller C;

            for (C = Level.ControllerList; C != None; C = C.NextController)
            {
                    If(C.Adrenaline == C.AdrenalineMax)
                    {
                          Gotostate('Start');
                    }

                    //if (C.Pawn != None &amp;&amp; C.Adrenaline &lt;= C.AdrenalineMax )
                    //{
                    //         C.Adrenaline = Min( C.Adrenaline-AdrenalineDecrease, C.AdrenalineMax );
                    //}
            }
    }
}

state Start
{
        local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
              if (C.Pawn != None &amp;&amp; C.Adrenaline == 100)
              {
                      PlayerController(C).ClientMessage(&quot;Seed Mode activated&quot;);
                      C.Pawn.Health = 199;
                      C.Pawn.GroundSpeed = 700;
                      Gotostate('Running')
              }
        }
}

state Runnning
{
        local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
            if (C.Pawn != None &amp;&amp; C.Adrenaline &gt; 0)
            {
                    C.Adrenaline -= -1;
                    Sleep(1.0);
                    Gotostate('Running')
            }
            else
            {
                    Gotostate('End')
            }
        }
}


state End
{

local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
             PlayerController(C).ClientMessage(&quot;Seed Mode deactivated&quot;);
                      C.Pawn.Health = 100;
                      C.Pawn.GroundSpeed = 450;
                      Gotostate('Idle')
        }
}



defaultproperties
{
       AdrenalineDecrease=1
       IconMaterialName=&quot;MutatorArt.nosym&quot;
       ConfigMenuClassName=&quot;&quot;
       GroupName=&quot;SEED&quot;
       FriendlyName=&quot;SEED mode&quot;
       Description=&quot;Seed mode is activated upon reaching 100 adrenaline.&quot;
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;0.15 function Seedmode is being called by Timer as i have set timer to repeat every second&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
//-----------------------------------------------------------
//      SEED mode
//-----------------------------------------------------------
class SeedMode extends Mutator;

var int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}

function Timer()
{
        local Controller C;

        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
                If(C.Adrenaline == C.AdrenalineMax)
                {
                         SeedMode();
                }

                if (C.Pawn != None &amp;&amp; C.Adrenaline &lt; C.AdrenalineMax )
                {
                         C.Adrenaline = Min( C.Adrenaline-AdrenalineDecrease, C.AdrenalineMax );
                }
        }
}

function SeedMode()
{
     local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
         if (C.Pawn != None &amp;&amp; C.Adrenaline == 100)
         {
            PlayerController(C).ClientMessage(&quot;Seed Mode (well mot yet =D)&quot;);
         }
    }
}


defaultproperties
{
    AdrenalineDecrease=1
    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;&quot;
    GroupName=&quot;SEED&quot;
    FriendlyName=&quot;SEED mode&quot;
    Description=&quot;Seed mode is activated upon reaching 100 adrenaline.&quot;
}

&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;0.1 - did not work at all&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
//-----------------------------------------------------------
//      SEED mode
//-----------------------------------------------------------
class SeedMode extends Mutator;

var int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}

function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
		if (C.Pawn != None &amp;&amp; C.Adrenaline &lt; C.AdrenalineMax )
        {
            C.Adrenaline = Min( C.Adrenaline-AdrenalineDecrease, C.AdrenalineMax );
        }
    }
}

function SeedMode()
{
     local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
         if (C.Pawn != None &amp;&amp; C.Adrenaline == 100)
         {
            PlayerController(C).ClientMessage(&quot;Seed Mode (well mot yet =D)&quot;);
         }
    }
}


defaultproperties
{
    AdrenalineDecrease=1
    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;&quot;
    GroupName=&quot;SEED&quot;
    FriendlyName=&quot;SEED mode&quot;
    Description=&quot;Seed mode is activated upon reaching 100 adrenaline.&quot;
}

&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

----

==Comments==

'''MythOpus:''' Tip from one unreal scripter to another... Take small steps first.  They really help in the long run.

'''Defx:''' Dont worry, i am ^^

'''Sweavo:''' Howdy.  A tip from someone who's just spent 8 hours learning the hard way: do just about everything on the server, and [[Legacy:Debugging Techniques|test with a network game!]]

'''Guest:''' do just about everything on the server? what do you mean? =]

'''Sweavo:''' Check out [[Legacy:Replication|Replication]] for a brain-bender.  In network play, you need to be aware of what is present on the server and what is present on the client, and of the stuff that's on the client, you need to be aware of what's getting run and what isn't.  In standalone mode none of that matters much.  So you can get something working great in standalone mode but have to throw heaps of it away to get to network play.  If your mod doesn't work in net play then it's not going to get on the public server, and won't get you chicks*.

* I can pretty much guarantee it won't get you chicks.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DelayedTeleporter</title>
    <id>968</id>
    <revision>
      <id>2621</id>
      <timestamp>2007-11-18T22:07:00Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:Teleporter|Teleporter]] &gt;&gt; DelayedTeleporter}}

This special [[Legacy:Teleporter|Teleporter]] class deactivates for a short time after someone used it to prevent the bots from telefragging other players.

==Properties ==

These properties can be found in the Teleporter group of the DelayedTeleporter's properties.
; bool bFixedExitRotation : Every player that exits this teleporter faces the direction of the teleporter instead. The player's previous rotation has no effect anymore. (like the [[Legacy:YawTeleporter|YawTeleporter]] for UT)
; float TeleportEnterDelay : This specifies, how long the teleporter will be disabled after someone entered it.

==Code ==

To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT Code]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT2003 Code]]

==Comments ==

'''Wormbo:''' I made this class after Snowdog mentioned he needed to add a delay to teleporters for one of his maps to prevent the bots from telefraging each other. I also added the [[Legacy:YawTeleporter|YawTeleporter]]'s functionality, so both features can be used at once.

'''Mychaeel:''' That functionality can be recreated with a simple trigger system too:
* Have the [[Legacy:Teleporter|Teleporter]] trigger a [[Legacy:Dispatcher|Dispatcher]].
* The Dispatcher's first action (at 0 seconds) triggers the Teleporter (to disable it).
* The Dispatcher's second action (after the delay) triggers the Teleporter again (to re-enable it).

'''Wormbo:''' I didn't test your idea, Mychaeel, but I think it will have a little bug: You can use the first teleporter and quickly enter the second teleporter you just teleported to and keep standing in the first teleporter. Now when both teleporters have the same delay you constantly get teleported from one teleporter to the other and back again. (with the delay of course) I encountered this with my class too, that's why there's the LastIncoming variable.

'''ZxAnPhOrIaN:''' I don't know if this would work (because I know very little about unreal script), but the teleporters should deactivate when a player is in the teleporters collision cylinder, and then reactivate when no player is in the teleporters collision cylinder.

'''Wormbo:''' It's possible, but this would just attract lamers who would camp in the teleporter and block it. Just imagine you're on top of a Facing Worlds tower and there's a guided redeemer heading your way and you can't escape because someone blocks the exit of your teleporter...

'''ZxAnPhOrIaN:''' ...But here is the catch, there would be a variable that the mapper could designate so if there would be a person, like what you said with Facing Worlds, is in the collision cylinder for a sertain amount of time, it will activate. So it would be like this: 0 min. Person teleports. X min. Person still there. Y min. Teleporter activates. Z min. Someone telefrags the camper.

'''Wormbo:''' That sounds much better. I'll have a look at it. :)

'''ZxAnPhOrIaN:''' You should have an option for vertex fog too! Also you should have the teleporter renamed to EnhancedTeleporter. ;)

'''Wormbo:''' Vertex fog? EnhancedTeleporter? O_O

'''ZxAnPhOrIaN:''' Vertex fog is like the ZoneLight -&gt; ViewFog. It is like falling off of the ledges of DM-Peak. Also Enhanced Teleporter would be a better name for the teleporter, it gives enhancements to the original teleporter.

'''Mychaeel:''' But there are a great many thinkable &quot;enhancements&quot; for a teleporter.  &quot;EnhancedTeleporter&quot; strikes me as a too generic name.  DelayedTeleporter is much better.  (And I frankly don't understand yet where the vertex fog comes in.)

'''ZxAnPhOrIaN:''' When you teleport through the teleporter, your screen brightens and restores in 1 second. That is just eye candy!

'''Wormbo:''' Ah! You mean a ClientFlash, that's something different. A trigger would probably be a better class for this effect, because it could be used in other places as well.

'''ElBundee:''' I've got the strange feeling the Yaw settings of the UT2003 teleporter simply does nothing. Any news on the 2003 code?

'''Mychaeel:''' If you mean the bChangesYaw property:  It rotates the incoming player by the Yaw ''difference'' between the source and the target teleporter.  It does not ''set'' the player's Yaw to the target teleporter's.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2622</id>
      <timestamp>2003-05-23T06:32:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>maybe not...</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:Teleporter|Teleporter]] &gt;&gt; DelayedTeleporter}}

This special [[Legacy:Teleporter|Teleporter]] class deactivates for a short time after someone used it to prevent the bots from telefragging other players.

==Properties ==

These properties can be found in the Teleporter group of the DelayedTeleporter's properties.
; bool bFixedExitRotation : Every player that exits this teleporter faces the direction of the teleporter instead. The player's previous rotation has no effect anymore. (like the [[Legacy:YawTeleporter|YawTeleporter]] for UT)
; float TeleportEnterDelay : This specifies, how long the teleporter will be disabled after someone entered it.

==Code ==

To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT Code]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT2003 Code]]

==Comments ==

'''Wormbo:''' I made this class after Snowdog mentioned he needed to add a delay to teleporters for one of his maps to prevent the bots from telefraging each other. I also added the [[Legacy:YawTeleporter|YawTeleporter]]'s functionality, so both features can be used at once.

'''Mychaeel:''' That functionality can be recreated with a simple trigger system too:
* Have the [[Legacy:Teleporter|Teleporter]] trigger a [[Legacy:Dispatcher|Dispatcher]].
* The Dispatcher's first action (at 0 seconds) triggers the Teleporter (to disable it).
* The Dispatcher's second action (after the delay) triggers the Teleporter again (to re-enable it).

'''Wormbo:''' I didn't test your idea, Mychaeel, but I think it will have a little bug: You can use the first teleporter and quickly enter the second teleporter you just teleported to and keep standing in the first teleporter. Now when both teleporters have the same delay you constantly get teleported from one teleporter to the other and back again. (with the delay of course) I encountered this with my class too, that's why there's the LastIncoming variable.

'''ZxAnPhOrIaN:''' I don't know if this would work (because I know very little about unreal script), but the teleporters should deactivate when a player is in the teleporters collision cylinder, and then reactivate when no player is in the teleporters collision cylinder.

'''Wormbo:''' It's possible, but this would just attract lamers who would camp in the teleporter and block it. Just imagine you're on top of a Facing Worlds tower and there's a guided redeemer heading your way and you can't escape because someone blocks the exit of your teleporter...

'''ZxAnPhOrIaN:''' ...But here is the catch, there would be a variable that the mapper could designate so if there would be a person, like what you said with Facing Worlds, is in the collision cylinder for a sertain amount of time, it will activate. So it would be like this: 0 min. Person teleports. X min. Person still there. Y min. Teleporter activates. Z min. Someone telefrags the camper.

'''Wormbo:''' That sounds much better. I'll have a look at it. :)

'''ZxAnPhOrIaN:''' You should have an option for vertex fog too! Also you should have the teleporter renamed to EnhancedTeleporter. ;)

'''Wormbo:''' Vertex fog? EnhancedTeleporter? O_O

'''ZxAnPhOrIaN:''' Vertex fog is like the ZoneLight -&gt; ViewFog. It is like falling off of the ledges of DM-Peak. Also Enhanced Teleporter would be a better name for the teleporter, it gives enhancements to the original teleporter.

'''Mychaeel:''' But there are a great many thinkable &quot;enhancements&quot; for a teleporter.  &quot;EnhancedTeleporter&quot; strikes me as a too generic name.  DelayedTeleporter is much better.  (And I frankly don't understand yet where the vertex fog comes in.)

'''ZxAnPhOrIaN:''' When you teleport through the teleporter, your screen brightens and restores in 1 second. That is just eye candy!

'''Wormbo:''' Ah! You mean a ClientFlash, that's something different. A trigger would probably be a better class for this effect, because it could be used in other places as well.

'''ElBundee:''' I've got the strange feeling the Yaw settings of the UT2003 teleporter simply does nothing. Any news on the 2003 code?

'''Mychaeel:''' If you mean the bChangesYaw property:  It rotates the incoming player by the Yaw ''difference'' between the source and the target teleporter.  It does not ''set'' the player's Yaw to the target teleporter's.

[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DelayedTeleporter/UT Code</title>
    <id>989</id>
    <revision>
      <id>2669</id>
      <timestamp>2006-11-25T21:43:35Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Accept() can be reduced to....</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:Teleporter|Teleporter]] &gt;&gt; DelayedTeleporter (Code)}}

To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.

&lt;uscript&gt;class DelayedTeleporter extends Teleporter;
/******************************************************************************
* DelayedTeleporter by Wormbo                                                 *
*                                                                             *
* TeleporterEnterDelay specifies, how long the teleporter is disabled after   *
* someone entered it.                                                         *
* bFixedExitRotation specifies, that the player's rotation after exiting this *
* teleporter should be set to the teleporter's rotation.                      *
*                                                                             *
* To make the delay work, set bStatic=False and bNoDelete=True in defaults.   *
******************************************************************************/

var(Teleporter) float TeleportEnterDelay;
var(Teleporter) bool bFixedExitRotation;
var float Delay;
var Actor LastIncoming;

replication
{
	reliable if ( Role == ROLE_Authority )
		Delay;
}

simulated function Tick(float DeltaTime)
{
	local int i;
	
	if ( Delay &gt; 0 ) {
		Delay -= DeltaTime;
		if ( Delay &lt;= 0 ) //teleport any pawns already in my radius
			for (i = 0; i &lt; 4; i++)
				if ( Touching[i] != None )
					Touch(Touching[i]);
	}
}

simulated function bool Accept(actor Incoming, Actor Source)
{
	local rotator newRot, oldRot;
	local pawn P;

	// Move the actor here.
	Disable('Touch');
	//log(&quot;Move Actor here &quot;$tag);
	newRot = Incoming.Rotation;
	if ( bChangesYaw ) {
		oldRot = Incoming.Rotation;
		newRot.Yaw = Rotation.Yaw;
		if ( !bFixedExitRotation &amp;&amp; Source != None )
			newRot.Yaw += (32768 + Incoming.Rotation.Yaw - Source.Rotation.Yaw);
	}

	if ( Pawn(Incoming) != None ) {
		//tell enemies about teleport
		if ( Role == ROLE_Authority ) {
			P = Level.PawnList;
			While ( P != None ) {
				if ( P.Enemy == Incoming )
					P.LastSeenPos = Incoming.Location; 
				P = P.nextPawn;
			}
		}
		Pawn(Incoming).SetLocation(Location);
		if ( Role == ROLE_Authority || Level.TimeSeconds - LastFired &gt; 0.5 ) {
			Pawn(Incoming).SetRotation(newRot);
			Pawn(Incoming).ViewRotation = newRot;
			LastFired = Level.TimeSeconds;
		}
		Pawn(Incoming).MoveTimer = -1.0;
		Pawn(Incoming).MoveTarget = self;
		PlayTeleportEffect( Incoming, false);
	}
	else {
		if ( !Incoming.SetLocation(Location) ) {
			Enable('Touch');
			return false;
		}
		if ( bChangesYaw )
			Incoming.SetRotation(newRot);
	}

	Enable('Touch');
	
	if ( bChangesVelocity )
		Incoming.Velocity = TargetVelocity;
	else {
		if ( bChangesYaw ) {
			if ( Incoming.Physics == PHYS_Walking )
				OldRot.Pitch = 0;
			// adjust the actor's velocity
			Incoming.Velocity = Incoming.Velocity &lt;&lt; OldRot;
			Incoming.Velocity = Incoming.Velocity &gt;&gt; NewRot;
			Incoming.Acceleration = Incoming.Acceleration &lt;&lt; OldRot;
			Incoming.Acceleration = Incoming.Acceleration &gt;&gt; NewRot;
		} 
		if ( bReversesX )
			Incoming.Velocity.X *= -1.0;
		if ( bReversesY )
			Incoming.Velocity.Y *= -1.0;
		if ( bReversesZ )
			Incoming.Velocity.Z *= -1.0;
	}	

	LastIncoming = Incoming;
	
	return true;
}

// Teleporter was touched by an actor.
simulated function Touch(actor Other)
{
	local Teleporter Dest;
	local int i;
	local Actor A;
	
	if ( !bEnabled || Delay &gt; 0 || Other == LastIncoming )
		return;

	if ( Other.bCanTeleport &amp;&amp; Other.PreTeleport(Self) == false ) {
		if ( InStr(URL, &quot;/&quot;) &gt;= 0 || InStr(URL, &quot;#&quot;) &gt;= 0 ) {
			// Teleport to a level on the net.
			if ( Role == ROLE_Authority &amp;&amp; PlayerPawn(Other) != None )
				Level.Game.SendPlayer(PlayerPawn(Other), URL);
		}
		else {
			// Teleport to a random teleporter in this local level, if more than one pick random.
			foreach AllActors(class 'Teleporter', Dest)
				if ( string(Dest.Tag) ~= URL &amp;&amp; Dest != Self )
					i++;
			i = rand(i);
			foreach AllActors(class 'Teleporter', Dest)
				if ( string(Dest.Tag) ~= URL &amp;&amp; Dest != Self &amp;&amp; i-- == 0 )
					break;
			
			if ( Dest != None ) {
				// Teleport the actor into the other teleporter.
				if ( Other.IsA('Pawn') )
					PlayTeleportEffect(Pawn(Other), false);
				
				if ( Dest.Accept(Other, Self) )
					Delay = TeleportEnterDelay;
				
				if ( Event != '' &amp;&amp; Other.IsA('Pawn') )
					foreach AllActors(class 'Actor', A, Event)
						A.Trigger(Other, Other.Instigator);
			}
			else if ( Role == ROLE_Authority )
				Pawn(Other).ClientMessage(&quot;Teleport destination for &quot;$self$&quot; not found!&quot;);
		}
	}
}

simulated function UnTouch(actor Other)
{
	if ( Other == LastIncoming )
		LastIncoming = None;
	
	Super.UnTouch(Other);
}&lt;/uscript&gt;

----

'''Fyfe:''' &lt;tt&gt;Accept()&lt;/tt&gt; can be reduced to:

&lt;uscript&gt;
simulated function bool Accept( Actor Incoming, Actor Source )
{
	if ( bFixedExitRotation )
		Source = None;

	if ( Super.Accept( Incoming, Source ) )
	{
		LastIncoming = Incoming;
		return true;
	}
	else
		return false;
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>2670</id>
      <timestamp>2002-12-17T17:52:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:Teleporter|Teleporter]] &gt;&gt; DelayedTeleporter (Code)}}

To use this actor, subclass Teleporter with the following code. This class has been tested offline only. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script. Set bStatic to False and bNoDelete to True in the DelayedTeleporter's default properties.

&lt;uscript&gt;class DelayedTeleporter extends Teleporter;
/******************************************************************************
* DelayedTeleporter by Wormbo                                                 *
*                                                                             *
* TeleporterEnterDelay specifies, how long the teleporter is disabled after   *
* someone entered it.                                                         *
* bFixedExitRotation specifies, that the player's rotation after exiting this *
* teleporter should be set to the teleporter's rotation.                      *
*                                                                             *
* To make the delay work, set bStatic=False and bNoDelete=True in defaults.   *
******************************************************************************/

var(Teleporter) float TeleportEnterDelay;
var(Teleporter) bool bFixedExitRotation;
var float Delay;
var Actor LastIncoming;

replication
{
	reliable if ( Role == ROLE_Authority )
		Delay;
}

simulated function Tick(float DeltaTime)
{
	local int i;
	
	if ( Delay &gt; 0 ) {
		Delay -= DeltaTime;
		if ( Delay &lt;= 0 ) //teleport any pawns already in my radius
			for (i = 0; i &lt; 4; i++)
				if ( Touching[i] != None )
					Touch(Touching[i]);
	}
}

simulated function bool Accept(actor Incoming, Actor Source)
{
	local rotator newRot, oldRot;
	local pawn P;

	// Move the actor here.
	Disable('Touch');
	//log(&quot;Move Actor here &quot;$tag);
	newRot = Incoming.Rotation;
	if ( bChangesYaw ) {
		oldRot = Incoming.Rotation;
		newRot.Yaw = Rotation.Yaw;
		if ( !bFixedExitRotation &amp;&amp; Source != None )
			newRot.Yaw += (32768 + Incoming.Rotation.Yaw - Source.Rotation.Yaw);
	}

	if ( Pawn(Incoming) != None ) {
		//tell enemies about teleport
		if ( Role == ROLE_Authority ) {
			P = Level.PawnList;
			While ( P != None ) {
				if ( P.Enemy == Incoming )
					P.LastSeenPos = Incoming.Location; 
				P = P.nextPawn;
			}
		}
		Pawn(Incoming).SetLocation(Location);
		if ( Role == ROLE_Authority || Level.TimeSeconds - LastFired &gt; 0.5 ) {
			Pawn(Incoming).SetRotation(newRot);
			Pawn(Incoming).ViewRotation = newRot;
			LastFired = Level.TimeSeconds;
		}
		Pawn(Incoming).MoveTimer = -1.0;
		Pawn(Incoming).MoveTarget = self;
		PlayTeleportEffect( Incoming, false);
	}
	else {
		if ( !Incoming.SetLocation(Location) ) {
			Enable('Touch');
			return false;
		}
		if ( bChangesYaw )
			Incoming.SetRotation(newRot);
	}

	Enable('Touch');
	
	if ( bChangesVelocity )
		Incoming.Velocity = TargetVelocity;
	else {
		if ( bChangesYaw ) {
			if ( Incoming.Physics == PHYS_Walking )
				OldRot.Pitch = 0;
			// adjust the actor's velocity
			Incoming.Velocity = Incoming.Velocity &lt;&lt; OldRot;
			Incoming.Velocity = Incoming.Velocity &gt;&gt; NewRot;
			Incoming.Acceleration = Incoming.Acceleration &lt;&lt; OldRot;
			Incoming.Acceleration = Incoming.Acceleration &gt;&gt; NewRot;
		} 
		if ( bReversesX )
			Incoming.Velocity.X *= -1.0;
		if ( bReversesY )
			Incoming.Velocity.Y *= -1.0;
		if ( bReversesZ )
			Incoming.Velocity.Z *= -1.0;
	}	

	LastIncoming = Incoming;
	
	return true;
}

// Teleporter was touched by an actor.
simulated function Touch(actor Other)
{
	local Teleporter Dest;
	local int i;
	local Actor A;
	
	if ( !bEnabled || Delay &gt; 0 || Other == LastIncoming )
		return;

	if ( Other.bCanTeleport &amp;&amp; Other.PreTeleport(Self) == false ) {
		if ( InStr(URL, &quot;/&quot;) &gt;= 0 || InStr(URL, &quot;#&quot;) &gt;= 0 ) {
			// Teleport to a level on the net.
			if ( Role == ROLE_Authority &amp;&amp; PlayerPawn(Other) != None )
				Level.Game.SendPlayer(PlayerPawn(Other), URL);
		}
		else {
			// Teleport to a random teleporter in this local level, if more than one pick random.
			foreach AllActors(class 'Teleporter', Dest)
				if ( string(Dest.Tag) ~= URL &amp;&amp; Dest != Self )
					i++;
			i = rand(i);
			foreach AllActors(class 'Teleporter', Dest)
				if ( string(Dest.Tag) ~= URL &amp;&amp; Dest != Self &amp;&amp; i-- == 0 )
					break;
			
			if ( Dest != None ) {
				// Teleport the actor into the other teleporter.
				if ( Other.IsA('Pawn') )
					PlayTeleportEffect(Pawn(Other), false);
				
				if ( Dest.Accept(Other, Self) )
					Delay = TeleportEnterDelay;
				
				if ( Event != '' &amp;&amp; Other.IsA('Pawn') )
					foreach AllActors(class 'Actor', A, Event)
						A.Trigger(Other, Other.Instigator);
			}
			else if ( Role == ROLE_Authority )
				Pawn(Other).ClientMessage(&quot;Teleport destination for &quot;$self$&quot; not found!&quot;);
		}
	}
}

simulated function UnTouch(actor Other)
{
	if ( Other == LastIncoming )
		LastIncoming = None;
	
	Super.UnTouch(Other);
}&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Delegate</title>
    <id>1029</id>
    <revision>
      <id>2752</id>
      <timestamp>2007-03-25T18:11:28Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>added one more example :-)</comment>
      <text xml:space="preserve">'''Delegates''' are a new [[Legacy:UnrealScript|UnrealScript]] concept in [[Legacy:UT2003|UT2003]] and beyond. They are (more or less) placeholders for functions. They are particularly used in GUI components: for example, a delegate for the clicking action can be assigned to a specific function without having to re-script the class.

==Delegate Syntax==

Delegates are declared just like functions, with the small difference, that usually they don't have a function body.
 &lt;''delegate modifiers''&gt; '''delegate''' &lt;''return type''&gt; &lt;''delegate name''&gt; 
  '''('''&lt;''parameter modifier''&gt; &lt;''type''&gt; &lt;''parameter name''&gt;''',''' ...''');'''

; &lt;delegate modifiers&gt; : Keywords that specify aspects of the delegate's overall nature and behaviour. These modifiers only affect the delegate itself. When you assign another function to the delegate that functions modifiers will replace the delegate's original modifiers. See [[Legacy:Function Syntax|Function Syntax]] for a list of possible modifiers.
; &lt;return type&gt; : The [[Legacy:Variable Type|variable type]] the function returns. You can't return static arrays due to the way they have to be declared. However, you can use an ''out'' variable in this case.
; &lt;delegate name&gt; : The name of the delegate, chosen by the coder. For advice on naming conventions see [[Legacy:Coding Guidelines|Coding Guidelines]].
; &lt;parameter modifier&gt; : Changes the nature of individual parameters. See [[Legacy:Function Syntax|Function Syntax]] for a list of possible parameter modifiers.
; &lt;type&gt; : The [[Legacy:Variable Type|variable type]] of each parameter.

Examples:

&lt;uscript&gt;
delegate bool MyDelegate(bool FirstParam , out int SecondParam, optional string ThirdParam);

simulated delegate MyDelegateWithCode()
{
  log(&quot;My delegate with code was executed.&quot;);
}
&lt;/uscript&gt;

This second example might be useful if you want a delegate with default code which should be executed clientside. The simulated keyword ''only'' applies to the delegate itself. It will have no effect if the function you assign to the delegate is not simulated.

==Calling Delegates==

Delegates are called like regular functions:

&lt;uscript&gt;
local bool bReturn, bHaveIt;
local int Number;

MyDelegate(True, 34, &quot;Hello World!&quot;); // parameters passed as literals
MyDelegate(bHaveIt, Number);          // parameters passed as variables
bReturn = MyDelegate(False, Number, &quot;Hi there!&quot;); // save delegate's return value in another variable
&lt;/uscript&gt;

When a delegate is called without having a function assigned to it, the delegate's default function body will be used. If the delegate doesn't have a function body, nothing will happen.

'''Note:''' If a function of an object that no longer exists is assigned to a delegate, calling this delegate will result in a crash.

'''Daid303:''' Does that crash also happens when the function is in actor?

'''Wormbo:''' I don't know. That's info from the UDN page about delegates.

'''Evolution:''' Yes this would cause a crash regardless of where the delegate is declared.  The compiler is supposed to catch all types of delegate assignment which might result in a delegate's associated function not actually existing, but this doesn't work 100% in UT2003.  99% of these compiler bugs are found with delegate assignments from subobject blocks in defaultproperties, so if you're experiencing a crash indicating the 'function blah couldn't be found' try moving your delegate assignment out of defaultproperties into the first function that will be called on your class (InitComponent(), for instance in the GUI).  The other way this can happen is if the function you're assigning to the delegate exists in another package.  If the function is removed from the other package, and the package is recompiled, but the code containing the delegate assignment *isn't* recompiled, then you'll get also get this crash.

==Delegate Assignment==

To assign a function to a delegate property simply use the syntax:
 DelegateName = FunctionName;

(This also works in a class's [[Legacy:Default Properties|default properties]].)

You can only assign functions to a delegate that have the same return type and the same number and type of parameters. Optional delegate parameters have to be optional for the function as well. Other parameter modifiers such as '''out''' don't have to match. Those modifiers will be replaced by the corresponding modifiers of the function assigned to the delegate.

To restore the delegate's default behavior simply assign None to it. You will have to do that if the function assigned to the delegate belongs to an object you want to be garbage-collected, because for non-actor objects delegates count as references to the object just like a direct object reference.

If an actor has a function assigned to a delegate and the actor is destroyed, the delegate is automatically set to None, just like a direct Actor reference.

==Delegate testing==

Is is possible to examine what a delegate is set to and test it?

==Discussion==

'''Tarquin:''' If I understand the UDN example correctly, a delegate is a sort of placeholder in a class. When you have an object of that class, you can stick any function you like in the placeholder.

'''Wormbo:''' Think of it as a variable that holds a reference to an object of type &quot;function&quot;. You can assign objects to it and use them (i.e. execute the function). You can even give it a default value, i.e. a default function body, default function modifiers and default parameter modifiers. Like variables of type Class or arrays where you can further specify the type of class or array you can specify details about the functions that can be assigned to a delegate property.

'''Foxpaw:''' I don't suppose there's any way to use delegates in structs, or make arrays of delegates? If there was, you could make a nifty adaptive timeslicing scheme that would keep your framerate high no matter what. (well, okay, not no matter what, but no matter what was in your script)

'''dataangel:''' Unfortunately you can't just imagine delegates as being variables that hold references to function objects because as far as I know ucc will give you compile errors whenever you try to use a delegate as a function parameter. Perhaps this is a bug? It'd be really useful to be able to pass functions or delegates as parameters.

'''Xian:''' If you can't quit picture Wormbo's description, I think you could rather imagine it as virtually moving a function body in another class without actually modifying it or subclassing it... 

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Destroying Objects|Destroying Objects]]
* [[udn2:UnrealScriptDelegates]]</text>
    </revision>
    <revision>
      <id>2753</id>
      <timestamp>2005-01-14T03:43:51Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Emm, err. I think I reverted your reversion there. ;)</comment>
      <text xml:space="preserve">'''Delegates''' are a new [[Legacy:UnrealScript|UnrealScript]] concept in [[Legacy:UT2003|UT2003]] and beyond. They are (more or less) placeholders for functions. They are particularly used in GUI components: for example, a delegate for the clicking action can be assigned to a specific function without having to re-script the class.

==Delegate Syntax==

Delegates are declared just like functions, with the small difference, that usually they don't have a function body.
 &lt;''delegate modifiers''&gt; '''delegate''' &lt;''return type''&gt; &lt;''delegate name''&gt; 
  '''('''&lt;''parameter modifier''&gt; &lt;''type''&gt; &lt;''parameter name''&gt;''',''' ...''');'''

; &lt;delegate modifiers&gt; : Keywords that specify aspects of the delegate's overall nature and behaviour. These modifiers only affect the delegate itself. When you assign another function to the delegate that functions modifiers will replace the delegate's original modifiers. See [[Legacy:Function Syntax|Function Syntax]] for a list of possible modifiers.
; &lt;return type&gt; : The [[Legacy:Variable Type|variable type]] the function returns. You can't return static arrays due to the way they have to be declared. However, you can use an ''out'' variable in this case.
; &lt;delegate name&gt; : The name of the delegate, chosen by the coder. For advice on naming conventions see [[Legacy:Coding Guidelines|Coding Guidelines]].
; &lt;parameter modifier&gt; : Changes the nature of individual parameters. See [[Legacy:Function Syntax|Function Syntax]] for a list of possible parameter modifiers.
; &lt;type&gt; : The [[Legacy:Variable Type|variable type]] of each parameter.

Examples:

&lt;uscript&gt;
delegate bool MyDelegate(bool FirstParam , out int SecondParam, optional string ThirdParam);

simulated delegate MyDelegateWithCode()
{
  log(&quot;My delegate with code was executed.&quot;);
}
&lt;/uscript&gt;

This second example might be useful if you want a delegate with default code which should be executed clientside. The simulated keyword ''only'' applies to the delegate itself. It will have no effect if the function you assign to the delegate is not simulated.

==Calling Delegates==

Delegates are called like regular functions:

&lt;uscript&gt;
local bool bReturn, bHaveIt;
local int Number;

MyDelegate(True, 34, &quot;Hello World!&quot;); // parameters passed as literals
MyDelegate(bHaveIt, Number);          // parameters passed as variables
bReturn = MyDelegate(False, Number, &quot;Hi there!&quot;); // save delegate's return value in another variable
&lt;/uscript&gt;

When a delegate is called without having a function assigned to it, the delegate's default function body will be used. If the delegate doesn't have a function body, nothing will happen.

'''Note:''' If a function of an object that no longer exists is assigned to a delegate, calling this delegate will result in a crash.

'''Daid303:''' Does that crash also happens when the function is in actor?

'''Wormbo:''' I don't know. That's info from the UDN page about delegates.

'''Evolution:''' Yes this would cause a crash regardless of where the delegate is declared.  The compiler is supposed to catch all types of delegate assignment which might result in a delegate's associated function not actually existing, but this doesn't work 100% in UT2003.  99% of these compiler bugs are found with delegate assignments from subobject blocks in defaultproperties, so if you're experiencing a crash indicating the 'function blah couldn't be found' try moving your delegate assignment out of defaultproperties into the first function that will be called on your class (InitComponent(), for instance in the GUI).  The other way this can happen is if the function you're assigning to the delegate exists in another package.  If the function is removed from the other package, and the package is recompiled, but the code containing the delegate assignment *isn't* recompiled, then you'll get also get this crash.

==Delegate Assignment==

To assign a function to a delegate property simply use the syntax:
 DelegateName = FunctionName;

(This also works in a class's [[Legacy:Default Properties|default properties]].)

You can only assign functions to a delegate that have the same return type and the same number and type of parameters. Optional delegate parameters have to be optional for the function as well. Other parameter modifiers such as '''out''' don't have to match. Those modifiers will be replaced by the corresponding modifiers of the function assigned to the delegate.

To restore the delegate's default behavior simply assign None to it. You will have to do that if the function assigned to the delegate belongs to an object you want to be garbage-collected, because for non-actor objects delegates count as references to the object just like a direct object reference.

If an actor has a function assigned to a delegate and the actor is destroyed, the delegate is automatically set to None, just like a direct Actor reference.

==Delegate testing==

Is is possible to examine what a delegate is set to and test it?

==Discussion==

'''Tarquin:''' If I understand the UDN example correctly, a delegate is a sort of placeholder in a class. When you have an object of that class, you can stick any function you like in the placeholder.

'''Wormbo:''' Think of it as a variable that holds a reference to an object of type &quot;function&quot;. You can assign objects to it and use them (i.e. execute the function). You can even give it a default value, i.e. a default function body, default function modifiers and default parameter modifiers. Like variables of type Class or arrays where you can further specify the type of class or array you can specify details about the functions that can be assigned to a delegate property.

'''Foxpaw:''' I don't suppose there's any way to use delegates in structs, or make arrays of delegates? If there was, you could make a nifty adaptive timeslicing scheme that would keep your framerate high no matter what. (well, okay, not no matter what, but no matter what was in your script)

'''dataangel:''' Unfortunately you can't just imagine delegates as being variables that hold references to function objects because as far as I know ucc will give you compile errors whenever you try to use a delegate as a function parameter. Perhaps this is a bug? It'd be really useful to be able to pass functions or delegates as parameters.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Destroying Objects|Destroying Objects]]
* [[udn2:UnrealScriptDelegates]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DemoRecSpectator</title>
    <id>28279</id>
    <revision>
      <id>39936</id>
      <timestamp>2009-11-14T18:07:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DemonThing</title>
    <id>1035</id>
    <revision>
      <id>2764</id>
      <timestamp>2005-05-14T22:28:08Z</timestamp>
      <contributor>
        <ip>DemonThing</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi!

==News==

===May 14, 2005===

Lots of things happened. Still haven't finished the map I described below. Now a member of the UTR team (http://www.getutr.com/) with coding and mapping. Writing a map converter in Python for UTR.

===July 14, 2004===

Time for an update! :B Maps are good. So are weapons. New map should be out &lt;s&gt;soon&lt;/s&gt; eventually. &lt;s&gt;I don't know what it will be called but it's in a crater of an inactive volcano thingy. Rain. Lots of BSP. One lift, which I can't get bots to use. 1 on 1. Water that looks great in UnrealEd, but the shader effects are bad in-game. Screenshots soon?&lt;/s&gt;

==Current Projects==
* Weapons pack for UT2004
* Map (see above)

===Maps===
* DM-Overview (see http://forums.unrealplayground.com/showthread.php?t=14147 ; i have been working on it since February 2003&amp;rarr;i know, it's way too long :B)
* ONS-LavaPlanet (you can get the map at http://www.unrealplayground.com/maps.php?mapid=5359 :))
* DM-1on1-givemeatitle (coming soon!)

==Programming Languages==
* Delphi
* C/C++
* Perl
* Python
* C# (learning)
* Java (blah)
* Visual Basic (blah)
* UnrealScript (duh)
* JavaScript (to some extent)
* VBScript (again to some extent, see above for VB)
* PHP (yay!)
* ASP (bleh)
* ASP.NET (bleh)
* ColdFusion (blah)

==Other random stuff==
* [http://dt3.no-ip.com/dt/pi_1m.txt Pi!] &amp;larr; 1,048,576 digits
* [http://dt3.no-ip.com/dt/hi.jpg] &amp;larr; something really dumb that I made in paint a while ago :B

----

==Discussion==

'''Tarquin:''' er, yeah, please use your own webspace for that sort of picture.

'''DemonThing:''' Hehe, just noticed you did that (2004-7-14). Fixed.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2765</id>
      <timestamp>2004-03-11T19:02:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi!

==Current Projects==
* Weapons mod for Unreal Tournament
* UT 2003 weapon (oil gun)

===Maps===
* DM-Overview (see http://forums.unrealplayground.com/showthread.php?t=14147 ; i have been working on it since February 2003&amp;rarr;i know, it's way too long :B)

==Programming Languages==
* Visual Basic (i've been forgetting some recently)
* Delphi
* FORTRAN IV :O
* C/C++
* C# (learning)
* Java
* UnrealScript (duh)
* JavaScript (to some extent)
* VBScript (again to some extent, see above for VB)
* PHP
* ASP
* ASP.NET (still learning)
* ColdFusion (a bit)

==Other random stuff==
* [http://www.keetnet.ca/dt/pi_1m.txt Pi!] &amp;larr; 1,048,576 digits
* @inline@hi &amp;larr; something really dumb that I made in paint :B

----

==Discussion==

'''Tarquin:''' er, yeah, please use your own webspace for that sort of picture.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2766</id>
      <timestamp>2004-07-14T21:57:43Z</timestamp>
      <contributor>
        <ip>DemonThing</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi!

==News==

===July 14, 2004===

Time for an update! :B Maps are good. So are weapons. New map should be out soon. I don't know what it will be called but it's in a crater of an inactive volcano thingy. Rain. Lots of BSP. One lift, which I can't get bots to use. 1 on 1. Water that looks great in UnrealEd, but the shader effects are bad in-game. Screenshots soon?

==Current Projects==
* Weapons pack for UT2004
* Map (see above)

===Maps===
* DM-Overview (see http://forums.unrealplayground.com/showthread.php?t=14147 ; i have been working on it since February 2003&amp;rarr;i know, it's way too long :B)
* ONS-LavaPlanet (you can get the map at http://www.unrealplayground.com/maps.php?mapid=5359 :))
* DM-1on1-givemeatitle (coming soon!)

==Programming Languages==
* Delphi
* C/C++
* Perl
* C# (learning)
* Java (blah)
* Visual Basic (blah)
* UnrealScript (duh)
* JavaScript (to some extent)
* VBScript (again to some extent, see above for VB)
* PHP (yay!)
* ASP (bleh)
* ASP.NET (bleh)
* ColdFusion (blah)

==Other random stuff==
* [http://dt3.no-ip.com/dt/pi_1m.txt Pi!] &amp;larr; 1,048,576 digits
* [http://dt3.no-ip.com/dt/hi.jpg] &amp;larr; something really dumb that I made in paint a while ago :B

----

==Discussion==

'''Tarquin:''' er, yeah, please use your own webspace for that sort of picture.

'''DemonThing:''' Hehe, just noticed you did that (2004-7-14). Fixed.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Design Document</title>
    <id>1050</id>
    <revision>
      <id>2798</id>
      <timestamp>2004-03-11T00:56:08Z</timestamp>
      <contributor>
        <ip>Dsl092-129-141.chi1.dsl.speakeasy.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Last Updated March 9th, 2004''

A term that's often thrown about. But what should a design document actually look like?

This page will serve as a preliminary guide for those individuals who would like to know the basics of creating an effective design document.

==Header or Title (May already be provided if on Wiki) ==

All work Copyright © 200x by Team Name or Personal Name

(Current Version.  i.e. &quot;Version 1.9&quot;)

(Last Date Updated)

==Introduction ==

This section is a short, one to two paragraph abstract in which the basic principles, purpose, and tasks of the mod are to be laid out.  The purpose of this section is not to deliver detailed information, but instead to sell people on your mod and cover only its essence in the most distillled form.

*'''Example:''' The purpose of this mod is to create a Total Conversion for Unreal Tournament 2004 in the form of a Vietnam War mod with two team distinct teams, the Democratic and Communist factions, as there is a distinct lack of representation for this combat theater within the gaming world.  This mod will be focused on realism and will include a selection of ten historically accurate weapons, as well as eight different vehicles encompassing both land and air transportation.  Its design will be heavily objective based, with limited points being awarded for kills and signifigant gains being rewarded for completing tasks central to the map.  As an added feature, it will feature an original score composed by some of the leading members of the game music remixing community.

==General Structure ==

This is a section where you lay out the important features of the game in each of their respective subsections.  By features I mean such things as the general play mechanics or modifications for those mods which have a less widespread impact.  You can cover things such as how a general round of play is meant to progress, the particular features of the Unreal Engine which your mod will affect, or similar widespread topics.  For large things like Total Conversions you will probably want to break this into subsections to cover them completely, and you may want to include flowcharts for particularly complex concepts.

==Game Environment ==

A complete description of the world in which your mod operates if it is pertinent.  Cover the story setup, the major players, the reasons for whatever conflict is happening, and any interesting pieces of info which might make it into the mod.  Obviously not necessary for mods without a substantial story behind them.

*'''Example:''' The setting for this mod is the Korean War, and more specifically within the central region of Korea along the Naktong region during the late summer and winter of 1950 when the fighting was at some of its fiercest.  It will include four maps covering the important battle locations of the Naktong Bulge, the Retaking of Seoul Korea, the Pusan Perimeter, and the Chosin Reservoir.

==Special Features ==

For many mods this may be one of the only sections.  It will basically cover any features which will be unique to this mod or additions to game operation which this mod may make.  This can be things like cheat protection, self autonomous bots, troop formations, or pretty much anything else you can imagine.  If there are multiple new features, try to break them up into modular segments which can be developed independently.

===Snazzy New Feature Name 1 ===

(Add more as needed)

Description of your feature, what it does or its purpose, your basic plan for implementing it if you have one, and how it will be integrated into the play experience.  This is basically a more in depth description for anything in the above summary that doesn't fall into one of the more specific subtopics below.

===Characters/Classes ===

This section will cover the various roles which the user of your mod might take during its operation.  In the case of war and other such mods these may be things like positions within an army or command roles.  For single player or roleplaying type mods, these might instead be classes or sets of abilities which your character can adopt.  There are many more possiblities as well.

*'''Class 1''' - Description and details about the abilities of the first class and its overall purpose within the mod.

*'''Class 2''' - Description and details about the abilities of the second class and its overall purpose within the mod.

*'''Etc...'''

===Weapons ===

This section will cover all of the new weapons which you are planning to add in or change if they apply.

*'''Weapon 1''' - Description and details about the ranges, firing method, purpose, damage, and pictures if appropriate.

*'''Weapon 2''' - Description and details about the ranges, firing method, purpose, damage, and pictures if appropriate.

*'''Etc...'''

===Vehicles ===

This section will cover all of the new vehicles which you are planning to add in or change if they apply.

*'''Vehicle 1''' - Description and details about the ranges, firing method, armaments, purpose, and pictures if appropriate.

*'''Vehicle 2''' - Description and details about the ranges, firing method, armaments, purpose, and pictures if appropriate.

*'''Etc...'''

===Music and Sound ===

This section will cover any new sound or music that you are planning to include with this mod.  Try to be as specific as possible and include links to samples of representative works if appropriate or available.

*'''Music or Sound Set 1''' - General concept of the music or sounds that you are aiming to create.
**'''Example:'''  A series of burst patterns that realistically emulate the sound of an assault rifle being fired at close range.

*'''Music or Sound Set 2''' - General concept of the music or sounds that you are aiming to create.
**'''Example:'''  A set of four ambient music pieces which set the tense and fretful tone of jungle warfare.  Possible influences include things like the score of Hamburger Hill, Apocalypse Now, Full Metal Jacket, and Platoon.

*'''Etc...'''

===Mapping Tasks and Game World ===

This section will cover any new map assets that you are planning to include with this mod.

*'''Map 1''' - General description of the first map you wish to include.  Try to be as detailed as possible and include pictures of representative regions or sketches of the concepts if possible.

*'''Map 2''' - General description of the second map you wish to include.  Try to be as detailed as possible and include pictures of representative regions or sketches of the concepts if possible.

*'''Etc...'''

==Work Plan ==

A step by step guide for determining what objectives lie on the path to completion of the mod and the timelines for when they should be completed.  This section is useful as it will allow you or your team to gage the progress of the mod, target problem areas which are slowing it down, and provide a sense of completion as each task is marked off.

*'''Example:'''
**Finish this design document
**Subtask one - Mapping  (&quot;Total section 1 due date&quot;)
***Create Seoul Korea map. (&quot;Due date&quot;)
***Create Hamburger Hill map. (&quot;Due date&quot;)
***Ect... (&quot;More dates&quot;)
**Subtask two - Weapons  (&quot;Total section 2 due date&quot;)
***Create Flamethrower Model.  (&quot;Due date&quot;)
***Create AK47 Model.  (&quot;Due Date&quot;)
***Ect...
**Further Subtasks (Coding, Vehicles, Music, Features, ect...)

==Appendix ==

Include things like technical terms that may not be immediately apparent, references to known works, and &quot;thank you&quot;'s to signifigant contributors.

----

==Example Design Documents on the Wiki==

[[Legacy:Block Wars/DesignDocument|Block Wars/DesignDocument]]

[[Legacy:Red Planet/Design Document|Red Planet/Design Document]]

[[Legacy:AlphaOne/AlphaCoop|AlphaOne/AlphaCoop]]

----

==How Not to Write a Design Document==

[http://mep.beyondunreal.com/mymod.html 1337/\/\0|)]

----

'''Araes:''' Assume you mean [http://mep.beyondunreal.com/mymod.html this] one, as it's quite abysmal. (03/08/04)

'''Araes:''' Alright, second update is a big one, as I have basically included my first draft of what I think a design document should look like.  Further input is of course appreciated and clarifications of points. (03/09/04)

'''EntropicLqd:''' Apart from the ''due date'' on the task list its a pretty decent document.  One thing I would say is that all ''Snazzy Features'' should be listed - even if there's no obvious way of coding them up.

'''Araes:''' Done.  Implied that your imagination is the limit of what you can write instead.  However, haven't changed the due dates yet as I tend to find that they are a valuable tool in my own work.  Even something horribly rough, as they give people at least a target to shoot for.

'''EntropicLqd:''' Due-dates are a pretty personal thing tbh.  I don't like working with them because it's like being at work again.  And so much of my time gets used by things outside of my control I'm rarely even close to a due date.

'''RegularX:''' I'm not even sure I would ever combine a design doc and a schedule.  The design doc seems like it should be purely a description of what goes into the game design.  Apart from that, I've sometimes managed an asset list which describes the actual physical files which needs to be created to achieve what's in the design doc, and then a schedule for those assets.  Course, my last mod team scattered to the four winds, so now I largely write memos to myself :)</text>
    </revision>
    <revision>
      <id>2799</id>
      <timestamp>2004-03-10T23:13:25Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Last Updated March 9th, 2004''

A term that's often thrown about. But what should a design document actually look like?

This page will serve as a preliminary guide for those individuals who would like to know the basics of creating an effective design document.

==Header or Title (May already be provided if on Wiki) ==

All work Copyright © 200x by Team Name or Personal Name

(Current Version.  i.e. &quot;Version 1.9&quot;)

(Last Date Updated)

==Introduction ==

This section is a short, one to two paragraph abstract in which the basic principles, purpose, and tasks of the mod are to be laid out.  The purpose of this section is not to deliver detailed information, but instead to sell people on your mod and cover only its essence in the most distillled form.

*'''Example:''' The purpose of this mod is to create a Total Conversion for Unreal Tournament 2004 in the form of a Vietnam War mod with two team distinct teams, the Democratic and Communist factions, as there is a distinct lack of representation for this combat theater within the gaming world.  This mod will be focused on realism and will include a selection of ten historically accurate weapons, as well as eight different vehicles encompassing both land and air transportation.  Its design will be heavily objective based, with limited points being awarded for kills and signifigant gains being rewarded for completing tasks central to the map.  As an added feature, it will feature an original score composed by some of the leading members of the game music remixing community.

==General Structure ==

This is a section where you lay out the important features of the game in each of their respective subsections.  By features I mean such things as the general play mechanics or modifications for those mods which have a less widespread impact.  You can cover things such as how a general round of play is meant to progress, the particular features of the Unreal Engine which your mod will affect, or similar widespread topics.  For large things like Total Conversions you will probably want to break this into subsections to cover them completely, and you may want to include flowcharts for particularly complex concepts.

==Game Environment ==

A complete description of the world in which your mod operates if it is pertinent.  Cover the story setup, the major players, the reasons for whatever conflict is happening, and any interesting pieces of info which might make it into the mod.  Obviously not necessary for mods without a substantial story behind them.

*'''Example:''' The setting for this mod is the Korean War, and more specifically within the central region of Korea along the Naktong region during the late summer and winter of 1950 when the fighting was at some of its fiercest.  It will include four maps covering the important battle locations of the Naktong Bulge, the Retaking of Seoul Korea, the Pusan Perimeter, and the Chosin Reservoir.

==Special Features ==

For many mods this may be one of the only sections.  It will basically cover any features which will be unique to this mod or additions to game operation which this mod may make.  This can be things like cheat protection, self autonomous bots, troop formations, or pretty much anything else you can imagine.  If there are multiple new features, try to break them up into modular segments which can be developed independently.

===Snazzy New Feature Name 1 ===

(Add more as needed)

Description of your feature, what it does or its purpose, your basic plan for implementing it if you have one, and how it will be integrated into the play experience.  This is basically a more in depth description for anything in the above summary that doesn't fall into one of the more specific subtopics below.

===Characters/Classes ===

This section will cover the various roles which the user of your mod might take during its operation.  In the case of war and other such mods these may be things like positions within an army or command roles.  For single player or roleplaying type mods, these might instead be classes or sets of abilities which your character can adopt.  There are many more possiblities as well.

*'''Class 1''' - Description and details about the abilities of the first class and its overall purpose within the mod.

*'''Class 2''' - Description and details about the abilities of the second class and its overall purpose within the mod.

*'''Etc...'''

===Weapons ===

This section will cover all of the new weapons which you are planning to add in or change if they apply.

*'''Weapon 1''' - Description and details about the ranges, firing method, purpose, damage, and pictures if appropriate.

*'''Weapon 2''' - Description and details about the ranges, firing method, purpose, damage, and pictures if appropriate.

*'''Etc...'''

===Vehicles ===

This section will cover all of the new vehicles which you are planning to add in or change if they apply.

*'''Vehicle 1''' - Description and details about the ranges, firing method, armaments, purpose, and pictures if appropriate.

*'''Vehicle 2''' - Description and details about the ranges, firing method, armaments, purpose, and pictures if appropriate.

*'''Etc...'''

===Music and Sound ===

This section will cover any new sound or music that you are planning to include with this mod.  Try to be as specific as possible and include links to samples of representative works if appropriate or available.

*'''Music or Sound Set 1''' - General concept of the music or sounds that you are aiming to create.
**'''Example:'''  A series of burst patterns that realistically emulate the sound of an assault rifle being fired at close range.

*'''Music or Sound Set 2''' - General concept of the music or sounds that you are aiming to create.
**'''Example:'''  A set of four ambient music pieces which set the tense and fretful tone of jungle warfare.  Possible influences include things like the score of Hamburger Hill, Apocalypse Now, Full Metal Jacket, and Platoon.

*'''Etc...'''

===Mapping Tasks and Game World ===

This section will cover any new map assets that you are planning to include with this mod.

*'''Map 1''' - General description of the first map you wish to include.  Try to be as detailed as possible and include pictures of representative regions or sketches of the concepts if possible.

*'''Map 2''' - General description of the second map you wish to include.  Try to be as detailed as possible and include pictures of representative regions or sketches of the concepts if possible.

*'''Etc...'''

==Work Plan ==

A step by step guide for determining what objectives lie on the path to completion of the mod and the timelines for when they should be completed.  This section is useful as it will allow you or your team to gage the progress of the mod, target problem areas which are slowing it down, and provide a sense of completion as each task is marked off.

*'''Example:'''
**Finish this design document
**Subtask one - Mapping  (&quot;Total section 1 due date&quot;)
***Create Seoul Korea map. (&quot;Due date&quot;)
***Create Hamburger Hill map. (&quot;Due date&quot;)
***Ect... (&quot;More dates&quot;)
**Subtask two - Weapons  (&quot;Total section 2 due date&quot;)
***Create Flamethrower Model.  (&quot;Due date&quot;)
***Create AK47 Model.  (&quot;Due Date&quot;)
***Ect...
**Further Subtasks (Coding, Vehicles, Music, Features, ect...)

==Appendix ==

Include things like technical terms that may not be immediately apparent, references to known works, and &quot;thank you&quot;'s to signifigant contributors.

----

==Example Design Documents on the Wiki==

[[Legacy:Block Wars/DesignDocument|Block Wars/DesignDocument]]

[[Legacy:Red Planet/Design Document|Red Planet/Design Document]]

[[Legacy:AlphaOne/AlphaCoop|AlphaOne/AlphaCoop]]

----

==How Not to Write a Design Document==

[http://mep.beyondunreal.com/mymod.html 1337/\/\0|)]

----

'''Araes:''' Assume you mean [http://mep.beyondunreal.com/mymod.html this] one, as it's quite abysmal. (03/08/04)

'''Araes:''' Alright, second update is a big one, as I have basically included my first draft of what I think a design document should look like.  Further input is of course appreciated and clarifications of points. (03/09/04)

'''EntropicLqd:''' Apart from the ''due date'' on the task list its a pretty decent document.  One thing I would say is that all ''Snazzy Features'' should be listed - even if there's no obvious way of coding them up.

'''Araes:''' Done.  Implied that your imagination is the limit of what you can write instead.  However, haven't changed the due dates yet as I tend to find that they are a valuable tool in my own work.  Even something horribly rough, as they give people at least a target to shoot for.

'''EntropicLqd:''' Due-dates are a pretty personal thing tbh.  I don't like working with them because it's like being at work again.  And so much of my time gets used by things outside of my control I'm rarely even close to a due date.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DestroyableObjective</title>
    <id>988</id>
    <revision>
      <id>2667</id>
      <timestamp>2004-11-22T22:40:44Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>Added UT2004 info</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; DestroyableObjective}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; DestroyableObjective}}

A '''DestroyableObjective''' must be attacked and damaged to disable it.

Note about bots: Bots do a &quot;ranged attack&quot; on a DestroyableObjectve, meaning they'll sit the moment they see it and start firing no matter how far away they are. This may not be the kind of assault you want the bots to do, as they completely ignore any enemies they see or damage they get while firing.

==Editable Properties==

; int DamageCapacity : Total amount of damage that must be inflicted on this objective to disable it.

; name TakeDamageEvent : [[Legacy:Event|Event]] fired whenever this objective takes damage.

; int DamageEventThreshold : If set, the event specified in TakeDamageEvent is only fired when the given amount of damage is taken (as opposed to &quot;whenever any amount of damage is taken&quot;).

==Known Subclasses ==
* [[Legacy:DestroyableObjective_SM|DestroyableObjective_SM]] (UT2004)</text>
    </revision>
    <revision>
      <id>2668</id>
      <timestamp>2003-04-06T12:44:34Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <comment>Note about bots</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; DestroyableObjective}}

A '''DestroyableObjective''' must be attacked and damaged to disable it.

Note about bots: Bots do a &quot;ranged attack&quot; on a DestroyableObjectve, meaning they'll sit the moment they see it and start firing no matter how far away they are. This may not be the kind of assault you want the bots to do, as they completely ignore any enemies they see or damage they get while firing.

==Editable Properties==

; int DamageCapacity : Total amount of damage that must be inflicted on this objective to disable it.

; name TakeDamageEvent : [[Legacy:Event|Event]] fired whenever this objective takes damage.

; int DamageEventThreshold : If set, the event specified in TakeDamageEvent is only fired when the given amount of damage is taken (as opposed to &quot;whenever any amount of damage is taken&quot;).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DestroyableObjective SM</title>
    <id>1069</id>
    <revision>
      <id>2844</id>
      <timestamp>2004-11-22T22:36:21Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:DestroyableObjective|DestroyableObjective]] &gt;&gt; DestroyableObjective_SM (Package: UnrealGame)}}

(This actor is new in [[Legacy:UT2004|UT2004]])

A DestroyableObjective_SM actor works just like a general [[Legacy:DestroyableObjective|DestroyableObjective]] (it is a [[Legacy:GameObjective|GameObjective]] which is completed by doing a certain amount of damage to it), except for four things:
* It uses a static mesh as a representation of the objective in the game world.
* It uses static mesh collision instead of cylinder collision to determine when it has been &quot;hit&quot;.
* It automatically changes its default static mesh to a different one when the objective has been completed (i.e. show a blown-up mesh once the object has been destroyed).
* It can have one or more associated [[Legacy:Antiportal|antiportal]] actors, which it will automatically disable when the objective has been destroyed (for things like doors which block visibility until they have a hole blown through them).  ('''Note:''' You must set a DestroyedStaticMesh of some kind for the antiportal functionality to work properly.)

==Properties ==

===Important Properties Inherited from [[Legacy:Actor|Actor]] ===
; [[Legacy:StaticMesh|StaticMesh]] Display-&gt;StaticMesh: The static mesh displayed before the objective has been destroyed.

===DestroyableObjective_SM ===
; [[Legacy:StaticMesh|StaticMesh]] DestroyedStaticMesh: The static mesh to display after this objective has been destroyed.  (If this property is None, this actor will just set bHidden=True when it gets destroyed instead.)
; name AntiPortalTag: A tag used to associate one or more AntiPortalActors with this objective, which will be disabled when the objective is destroyed.  '''Note:''' If the DestroyedStaticMesh property is set to None, the DestroyableObjective_SM will disappear when destroyed, but antiportal changes will not be performed (so you need to have some sort of destroyed mesh in order for associated antiportals to be disabled along with the objective).  This appears to be a design flaw in the code.

===(Hidden Properties) ===
; [[Legacy:StaticMesh|StaticMesh]] OriginalMesh: Used internally to keep track of the original value of Display-&gt;StaticMesh
; [[Legacy:StaticMesh|StaticMesh]] OldStaticMesh: Used in replication to tell when Display-&gt;StaticMesh has changed.
; array&lt;AntiPortalActor&gt; AntiPortals: A generated list of all AntiPortalActors matching the AntiPortalTag.

==Methods ==

===Functions ===
; PostBeginPlay ( ) [simulated] : Initialize the hidden properties.
; AdjustAntiPortals ( ) [simulated] : If the original static mesh is being displayed, set all associated AntiPortalActors to be active (DrawType = DT_AntiPortal).  If the DestroyedStaticMesh is shown, set all associated AntiPortals to be inactive (DrawType = DT_None).
; PostNetReceive ( ) [simulated] : If the StaticMesh property has changed, update karma-collision information for the new mesh, and call AdjustAntiPortalActors.
; Reset ( ) : Set the displayed static mesh back to the normal one.
; DisableObjective (Pawn Instigator) : Change the mesh to the DestroyedStaticMesh, update karma collision info, and call AdjustAntiPortals.
; UpdatePrecacheStaticMeshes ( ) [simulated] : Precache the DestroyedStaticMesh.

==Known Subclasses ==

(None)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DestroyableTrigger</title>
    <id>28852</id>
    <revision>
      <id>42779</id>
      <timestamp>2010-03-30T16:18:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Destroying Objects</title>
    <id>938</id>
    <revision>
      <id>2555</id>
      <timestamp>2006-03-14T18:32:12Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Destroying Actors==

Actors are destroyed by calling their Destroy() function. Destruction is latent, i.e. the actor is destroyed at the end of the current tick, although the Destroyed() event is executed immediately. The actor is moved to the list of destroyed actors then. Note that calling Destroy() will not halt the execution of a function that is already started, or stop other functions from being called on that actor. If you wish to avoid this behavior, the actor variable &lt;tt&gt;bDeleteMe&lt;/tt&gt; is set to true when an actor has been &quot;destroyed&quot; but has not yet been deleted.

===Chain Of Events===

When the Destroy() function is called, several other UnrealScript events get called as well before code execution continues after the call to Destroy().
# the actor's EndState() event
# the actor's Destroyed() event
# the LostChild() event of the actor's Owner
# all references to this actor are set to None&lt;br /&gt;'''Warning:''' This also detaches the actor from its children (i.e. sets their Owner property to None) without calling LostChild(). If the actor gains a new child afterwards, the engine gets confused and crashes the game soon.

==Destroying Non-Actor Objects==

Objects will be cleaned up at garbage collection time, provided there are no Actors that retain references to them. You can explicitly force garbage collection using a console command, or wait for the normal collection during a level switch. See my notes on the new keyword about making sure your objects are safe for garbage collection.

==Discussion==

'''EricBlade:''' I'm having a little problem with this function in a particular object, derived from the [[Legacy:Fire|Fire]] class.  I have built a weapon, that when fired, spawns a fire attached to it.  When fired again, it calls thefire.DestroyFire() which eventually calls Destroy().  However, after that is all done, the reference to it still exists, and the next time i go to spawn a fire, it decides the original one still exists, so it uses that, instead.  Huh?  (the problem with this is that the original one is no longer based on the weapon, after the Destroy() call and any attempts to set it to do so fail) After some more testing, I've discovered that bDeleteMe is set to true, but the object is never actually destroyed.  

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Garbage Collection|Garbage Collection]]</text>
    </revision>
    <revision>
      <id>2556</id>
      <timestamp>2003-12-13T20:57:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Destroying Actors==

Actors are destroyed by calling their Destroy() function. Destruction is latent, i.e. the actor is destroyed at the end of the current tick, although the Destroyed() event is executed immediately. The actor is moved to the list of destroyed actors then. Note that calling Destroy() will not halt the execution of a function that is already started, or stop other functions from being called on that actor. If you wish to avoid this behavior, the actor variable &lt;tt&gt;bDeleteMe&lt;/tt&gt; is set to true when an actor has been &quot;destroyed&quot; but has not yet been deleted.

===Chain Of Events===

When the Destroy() function is called, several other UnrealScript events get called as well before code execution continues after the call to Destroy().
# the actor's EndState() event
# the actor's Destroyed() event
# the LostChild() event of the actor's Owner
# all references to this actor are set to None&lt;br /&gt;'''Warning:''' This also detaches the actor from its children (i.e. sets their Owner property to None) without calling LostChild(). If the actor gains a new child afterwards, the engine gets confused and crashes the game soon.

==Destroying Non-Actor Objects==

Objects will be cleaned up at garbage collection time, provided there are no Actors that retain references to them. You can explicitly force garbage collection using a console command, or wait for the normal collection during a level switch. See my notes on the new keyword about making sure your objects are safe for garbage collection.

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Garbage Collection|Garbage Collection]]</text>
    </revision>
    <revision>
      <id>2557</id>
      <timestamp>2006-03-14T18:06:10Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Destroying Actors==

Actors are destroyed by calling their Destroy() function. Destruction is latent, i.e. the actor is destroyed at the end of the current tick, although the Destroyed() event is executed immediately. The actor is moved to the list of destroyed actors then. Note that calling Destroy() will not halt the execution of a function that is already started, or stop other functions from being called on that actor. If you wish to avoid this behavior, the actor variable &lt;tt&gt;bDeleteMe&lt;/tt&gt; is set to true when an actor has been &quot;destroyed&quot; but has not yet been deleted.

===Chain Of Events===

When the Destroy() function is called, several other UnrealScript events get called as well before code execution continues after the call to Destroy().
# the actor's EndState() event
# the actor's Destroyed() event
# the LostChild() event of the actor's Owner
# all references to this actor are set to None&lt;br /&gt;'''Warning:''' This also detaches the actor from its children (i.e. sets their Owner property to None) without calling LostChild(). If the actor gains a new child afterwards, the engine gets confused and crashes the game soon.

==Destroying Non-Actor Objects==

Objects will be cleaned up at garbage collection time, provided there are no Actors that retain references to them. You can explicitly force garbage collection using a console command, or wait for the normal collection during a level switch. See my notes on the new keyword about making sure your objects are safe for garbage collection.

==Discussion==

'''EricBlade:''' I'm having a little problem with this function in a particular object, derived from the [[Legacy:Fire|Fire]] class.  I have built a weapon, that when fired, spawns a fire attached to it.  When fired again, it calls thefire.DestroyFire() which eventually calls Destroy().  However, after that is all done, the reference to it still exists, and the next time i go to spawn a fire, it decides the original one still exists, so it uses that, instead.  Huh?  (the problem with this is that the original one is no longer based on the weapon, after the Destroy() call and any attempts to set it to do so fail)

==Related Topics==
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:Creating Actors And Objects|Creating Actors And Objects]]
* [[Legacy:Garbage Collection|Garbage Collection]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Detail Texture</title>
    <id>996</id>
    <revision>
      <id>2685</id>
      <timestamp>2003-08-07T18:57:22Z</timestamp>
      <contributor>
        <ip>192.139.221.xxx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">From the Unreal Tech Page:

{{innerbox| A detail texture is a very small, fine pattern which is faded in as you approach a surface, for example wood grain, or imperfections in stone. When you import a detail texture, you need to set its Scale value to a small number (typically 0.25nm) to specify its scaling relative to whatever texture it applies to.

 Detail textures and macrotextures modulate (multiply) the surface they're applied to. By modulating, they have the ability to scale the surface's brightness up or down. Colors with RGB brightness values from 0-127 darken the surface; 128 has no effect; and 129-255 brighten the surface. Therefore, when drawing microtextures and macrotextures, it is important that you design them with their brightnesses in the proper range so they affect surfaces naturally. If a detail texture's average brightness deviates too far from 128, then surfaces will appear to brighten or darken as you approach them. 

}}

See [[Legacy:Color Blending|color blending]] for more on modulation.

===Setting detail textures ===

Setting detail textures for a new texture is really simple. After importing the texture into the texture browser right click on it and goto Properties -&gt; Texture -&gt; Detail texture (just use the appropriate tex from detail.utx) . See also [[Legacy:Texture Properties|Texture Properties]].

No other setting really except to turn on detail texture for d3d. At the console (~) type Preferences goto rendering -&gt; d3d -&gt; detail texture set this to true. 

Comment by Luggage: I noticed that the above doesn't always apply when I was messing around with detail textures for my own pack... very bright textures are darkened by a 128 brightness detail texture, while dark textures are brightened up a bit. I then converted the original texture to greyscale to determine the average brightness, and adapted my detail textures to that. Worked fine for me, although I don't know if it's really true.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2686</id>
      <timestamp>2002-05-12T10:19:09Z</timestamp>
      <contributor>
        <ip>Luggage</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Setting detail textures for a new texture is really simple. After importing the texture into the texture browser right click on it and goto properties &gt; texture &gt; detail texture (just use the appropriate tex from detail.utx) .

No other setting really except to turn on detail texture for d3d. At the console (~) type preferences goto rendering &gt; d3d &gt; detail texture set this to true. 

More information taken from the Unreal Tech Page:-

A detail texture is a very small, fine pattern which is faded in as you approach a surface, for example wood grain, or imperfections in stone.When you import a detail texture, you need to set its Scale value to a small number (typically 0.25) to specify its scaling relative to whatever texture it applies to.Detail textures and macrotextures modulate (multiply) the surface they're applied to. By modulating, they have the ability to scale the surface's brightness up or down. Colors with RGB brightness values from 0-127 darken the surface; 128 has no effect; and 129-255 brighten the surface. Therefore, when drawing microtextures and macrotextures, it is important that you design them with their brightnesses in the proper range so they affect surfaces naturally. If a detail texture's average brightness deviates too far from 128, then surfaces will appear to brighten or darken as you approach them. 

Comment by Luggage: I noticed that the above doesn't always apply when I was messing around with detail textures for my own pack... very bright textures are darkened by a 128 brightness detail texture, while dark textures are brightened up a bit. I then converted the original texture to greyscale to determine the average brightness, and adapted my detail textures to that. Worked fine for me, although I don't know if it's really true.</text>
    </revision>
    <revision>
      <id>2687</id>
      <timestamp>2003-07-08T20:18:08Z</timestamp>
      <contributor>
        <ip>Slakkie</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">From the Unreal Tech Page:

{{innerbox| A detail texture is a very small, fine pattern which is faded in as you approach a surface, for example wood grain, or imperfections in stone. When you import a detail texture, you need to set its Scale value to a small number (typically 0.25) to specify its scaling relative to whatever texture it applies to.

 Detail textures and macrotextures modulate (multiply) the surface they're applied to. By modulating, they have the ability to scale the surface's brightness up or down. Colors with RGB brightness values from 0-127 darken the surface; 128 has no effect; and 129-255 brighten the surface. Therefore, when drawing microtextures and macrotextures, it is important that you design them with their brightnesses in the proper range so they affect surfaces naturally. If a detail texture's average brightness deviates too far from 128, then surfaces will appear to brighten or darken as you approach them. 

}}

See [[Legacy:Color Blending|color blending]] for more on modulation.

===Setting detail textures ===

Setting detail textures for a new texture is really simple. After importing the texture into the texture browser right click on it and goto Properties -&gt; Texture -&gt; Detail texture (just use the appropriate tex from detail.utx) . See also [[Legacy:Texture Properties|Texture Properties]].

No other setting really except to turn on detail texture for d3d. At the console (~) type Preferences goto rendering -&gt; d3d -&gt; detail texture set this to true. 

Comment by Luggage: I noticed that the above doesn't always apply when I was messing around with detail textures for my own pack... very bright textures are darkened by a 128 brightness detail texture, while dark textures are brightened up a bit. I then converted the original texture to greyscale to determine the average brightness, and adapted my detail textures to that. Worked fine for me, although I don't know if it's really true.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Deus Ex</title>
    <id>950</id>
    <revision>
      <id>2582</id>
      <timestamp>2007-03-09T21:31:57Z</timestamp>
      <contributor>
        <ip>UnrealEngine</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|ION Storm Austin 
|-
|'''''Publisher'''''
|[http://www.eidosgames.com/games/info.html?gmid=109 Eidos Interactive] 
|-
|'''''Release Date(s)'''''
|NA June 22, 2000 (WIN)&lt;br /&gt;NA July 7, 2000 (MAC)&lt;br /&gt;EU September 27, 2000 (WIN)&lt;br /&gt;NA March 25, 2002 (PS2)&lt;br /&gt;EU May 24, 2002 (PS2) 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Playstation 2&lt;br /&gt;Mac OS 9 or Mac OS 10 &quot;Classic&quot; enviroment
|-
|'''''Official Web Site'''''
|http://www.DeusEx.com/ ''(Defunct)'' 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/filelist.aspx?s=31662&amp;v=0 FilePlanet] 
|-
|'''''Latest Patch'''''
|Version '''1112fm'''&lt;br /&gt;[http://www.fileplanet.com/59470/50000/fileinfo/Deus-Ex-Patch-v1112fm FilePlanet] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/1
|Unreal Engine 1 Builds 400-436]] 
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 1 (Official), UnrealEd 2 (Unofficial hack)]] 
|}

==Description==

'''Deus Ex''' is a game built with the [[Legacy:Unreal Engine|Unreal Engine]]. It uses a heavily-modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine, and is  unlike a typical first-person-shooter in many ways.  One of them is the sheer level of detail put into the game, from seagulls that squawk (or chirp, or whatever the heck seagulls do), to books filling you in on the  backstory of the game. It's even been described as a first person shooter / adventure game hybrid. Deus Ex is full of stuff that is completely useless in the context of beating the game, but that provides a level of atmosphere that is lacking in many other games.

==Things Of Note==

The game uses a heavily modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Apparently before the latest patch, as the available version of [[Legacy:UnrealEd|UnrealEd]] is [[Legacy:UnrealEd 1|UnrealEd 1]] (written in Visual Basic and crashy). You have to download it separately (It's referred to as the Deus Ex SDK).

''HCDenton:'' Most of the UnrealEd1 crashes occur when you have the ''properties window'' open, deselect all objects, and then click the properties window (to close it). The workaround to this is to simply select some actor before closing the actor properties window.

Many of the UT classes have been modified, from moving functions between classes to wholesale changes. (I'm working on a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Changes]] document.

It does not support:
* [[Legacy:Delegate|Delegate]]s (this is fairly normal since these were only introduced in ut2003!)

===Limitations===

'''Xhiris:''' Read somewhere that the game will take textures up to 1024x1024, but it won't render them properly.  Anyone have concrete info on this?

'''Foxpaw:''' I can't say for sure about Deus Ex, but UT2003 can have textures larger than that. Of course, that's a later version of the engine, but still, rendering is all done by DirectX/OpenGL/whatever, so unless it was a texture compression issue or something, I can't see that being an issue. I suppose if you had a copy of Deus Ex it would be fairly easy to test though.

'''Kawachan:''' I had a fairly big texture (over 256 in size) and it didn't work. Said it was too big. I'd say it ''doesn't'' take 'em that big.

'''Kawachan:''' Well now, I noticed some UT textures are 512. Nice top size. I'd stick with that.

'''IAMME:''' I still play and mod for DX and yes I can say it does take 1024 dimension textures, but as said above the rendering will be horrible. Also, DX takes in only much more improved models than Unreal 1 does, which leads to conversion which is painful :/ 

==Documentation (in progress)==
* [[:Category:Legacy Class (DX)]] ''Category Class list for DX''
* [[Legacy:Class Tree Listing (DX)|Class Tree Listing (DX)]] ''more classes than you can shake a stick at - uncomplete, outdated''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conversations]] ''overview on how conversations work''
* [[Legacy:DeusEx.INI|DeusEx.INI]] ''Game Ini file''
* [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] ''Scale &amp; Dimensions comparision between DX and UT - note that x Unreal Units  = feet * 16 according to [[Legacy:DeusExWeapon|DeusExWeapon]]''

==Downloads==

===Custom Renderers===
* [http://cwdohnal.home.mindspring.com/utglr/ Unofficial Direct3D 8 and enhanced OpenGL renderer for Deus Ex]

===Deus Ex SDK===
* [http://www.fileshack.com/file.x?fid=357 Fileshack]
* [http://www.fileplanet.com/50191/50000/fileinfo/Deus-Ex-SDK-v1112fm Fileplanet]

===UnrealEd 2===
* http://moop.cannonfooder.co.uk/mods/MISC_Unreal_Editor_2_UEd2.zip ''Defunct''
* [http://www.edgefiles.com/files/18837.html EdgeFiles]
* [http://files.filefront.com/UEd2/;930386;;/fileinfo.html FileFront]

==External Links ==
* [http://wiki.beyondunreal.com/wiki/External_Links#0.1.9 Deus Ex Sites]
* [http://www.deusex.com/ Official site]
* [http://home.kc.rr.com/bobfahey/deus_ex.htm Lots of info on the game]
* [[Wikipedia:Deus_Ex]]

==Related Links==
* [[Legacy:Unreal Engine Versions/1|Unreal Engine Versions/1]]

==Comments ==

'''T-1:''' It appears that there are no pages on Deus Ex's GUI classes (not only not here, but not anywhere).... Will be fixed once I do some experimentation.

----

[[:Category:Legacy Game]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash;  Convert to common page layout. See [[Legacy:UT2003|UT2003]] for the layout. \\'''Daffodilistic:''' Page is in the process of being converted to the common page layout, so bare with the changes :)
[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy Game|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2583</id>
      <timestamp>2006-11-30T03:18:48Z</timestamp>
      <contributor>
        <ip>Daffodilistic</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|ION Storm Austin 
|-
|'''''Publisher'''''
|[http://www.eidosgames.com/games/info.html?gmid=109 Eidos Interactive] 
|-
|'''''Release Date(s)'''''
|NA June 22, 2000 (WIN)&lt;br /&gt;NA July 7, 2000 (MAC)&lt;br /&gt;EU September 27, 2000 (WIN)&lt;br /&gt;NA March 25, 2002 (PS2)&lt;br /&gt;EU May 24, 2002 (PS2) 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Playstation 2&lt;br /&gt;Mac OS 9 or Mac OS 10 &quot;Classic&quot; enviroment
|-
|'''''Official Web Site'''''
|http://www.DeusEx.com/ ''(Defunct)'' 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/filelist.aspx?s=31662&amp;v=0 FilePlanet] 
|-
|'''''Latest Patch'''''
|Version '''1112fm'''&lt;br /&gt;[http://www.fileplanet.com/59470/50000/fileinfo/Deus-Ex-Patch-v1112fm FilePlanet] 
|-
|'''''Unreal Engine Version'''''
|[[Legacy:Unreal Engine Versions/1.5|Unreal Engine Versions/1.5]] 
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 1 (Official), UnrealEd 2 (Unofficial hack)]] 
|}

==Description==

'''Deus Ex''' is a game built with the [[Legacy:Unreal Engine|Unreal Engine]]. It uses a heavily-modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine, and is  unlike a typical first-person-shooter in many ways.  One of them is the sheer level of detail put into the game, from seagulls that squawk (or chirp, or whatever the heck seagulls do), to books filling you in on the  backstory of the game. It's even been described as a first person shooter / adventure game hybrid. Deus Ex is full of stuff that is completely useless in the context of beating the game, but that provides a level of atmosphere that is lacking in many other games.

==Things Of Note==

The game uses a heavily modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Apparently before the latest patch, as the available version of [[Legacy:UnrealEd|UnrealEd]] is [[Legacy:UnrealEd 1|UnrealEd 1]] (written in Visual Basic and crashy). You have to download it separately (It's referred to as the Deus Ex SDK).

''HCDenton:'' Most of the UnrealEd1 crashes occur when you have the ''properties window'' open, deselect all objects, and then click the properties window (to close it). The workaround to this is to simply select some actor before closing the actor properties window.

Many of the UT classes have been modified, from moving functions between classes to wholesale changes. (I'm working on a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Changes]] document.

It does not support:
* [[Legacy:Delegate|Delegate]]s (this is fairly normal since these were only introduced in ut2003!)

===Limitations===

'''Xhiris:''' Read somewhere that the game will take textures up to 1024x1024, but it won't render them properly.  Anyone have concrete info on this?

'''Foxpaw:''' I can't say for sure about Deus Ex, but UT2003 can have textures larger than that. Of course, that's a later version of the engine, but still, rendering is all done by DirectX/OpenGL/whatever, so unless it was a texture compression issue or something, I can't see that being an issue. I suppose if you had a copy of Deus Ex it would be fairly easy to test though.

'''Kawachan:''' I had a fairly big texture (over 256 in size) and it didn't work. Said it was too big. I'd say it ''doesn't'' take 'em that big.

'''Kawachan:''' Well now, I noticed some UT textures are 512. Nice top size. I'd stick with that.

'''IAMME:''' I still play and mod for DX and yes I can say it does take 1024 dimension textures, but as said above the rendering will be horrible. Also, DX takes in only much more improved models than Unreal 1 does, which leads to conversion which is painful :/ 

==Documentation (in progress)==
* [[:Category:Legacy Class (DX)]] ''Category Class list for DX''
* [[Legacy:Class Tree Listing (DX)|Class Tree Listing (DX)]] ''more classes than you can shake a stick at - uncomplete, outdated''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conversations]] ''overview on how conversations work''
* [[Legacy:DeusEx.INI|DeusEx.INI]] ''Game Ini file''
* [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] ''Scale &amp; Dimensions comparision between DX and UT - note that x Unreal Units  = feet * 16 according to [[Legacy:DeusExWeapon|DeusExWeapon]]''

==Downloads==

===Custom Renderers===
* [http://cwdohnal.home.mindspring.com/utglr/ Unofficial Direct3D 8 and enhanced OpenGL renderer for Deus Ex]

===Deus Ex SDK===
* [http://www.fileshack.com/file.x?fid=357 Fileshack]
* [http://www.fileplanet.com/50191/50000/fileinfo/Deus-Ex-SDK-v1112fm Fileplanet]

===UnrealEd 2===
* http://moop.cannonfooder.co.uk/mods/MISC_Unreal_Editor_2_UEd2.zip ''Defunct''
* [http://www.edgefiles.com/files/18837.html EdgeFiles]
* [http://files.filefront.com/UEd2/;930386;;/fileinfo.html FileFront]

==External Links ==
* [http://wiki.beyondunreal.com/wiki/External_Links#0.1.9 Deus Ex Sites]
* [http://www.deusex.com/ Official site]
* [http://home.kc.rr.com/bobfahey/deus_ex.htm Lots of info on the game]
* [[Wikipedia:Deus_Ex]]

==Related Links==
* [[Legacy:Unreal Engine Versions/1.5|Unreal Engine Versions/1.5]]

==Comments ==

'''T-1:''' It appears that there are no pages on Deus Ex's GUI classes (not only not here, but not anywhere).... Will be fixed once I do some experimentation.

----

[[:Category:Legacy Game]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash;  Convert to common page layout. See [[Legacy:UT2003|UT2003]] for the layout. \\'''Daffodilistic:''' Page is in the process of being converted to the common page layout, so bare with the changes :)
[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy Game|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2584</id>
      <timestamp>2007-03-09T21:10:12Z</timestamp>
      <contributor>
        <ip>UnrealEngine</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|ION Storm Austin 
|-
|'''''Publisher'''''
|[http://www.eidosgames.com/games/info.html?gmid=109 Eidos Interactive] 
|-
|'''''Release Date(s)'''''
|NA June 22, 2000 (WIN)&lt;br /&gt;NA July 7, 2000 (MAC)&lt;br /&gt;EU September 27, 2000 (WIN)&lt;br /&gt;NA March 25, 2002 (PS2)&lt;br /&gt;EU May 24, 2002 (PS2) 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Playstation 2&lt;br /&gt;Mac OS 9 or Mac OS 10 &quot;Classic&quot; enviroment
|-
|'''''Official Web Site'''''
|http://www.DeusEx.com/ ''(Defunct)'' 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/filelist.aspx?s=31662&amp;v=0 FilePlanet] 
|-
|'''''Latest Patch'''''
|Version '''1112fm'''&lt;br /&gt;[http://www.fileplanet.com/59470/50000/fileinfo/Deus-Ex-Patch-v1112fm FilePlanet] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/1
|Unreal Engine 1 Builds 432-436]] 
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 1 (Official), UnrealEd 2 (Unofficial hack)]] 
|}

==Description==

'''Deus Ex''' is a game built with the [[Legacy:Unreal Engine|Unreal Engine]]. It uses a heavily-modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine, and is  unlike a typical first-person-shooter in many ways.  One of them is the sheer level of detail put into the game, from seagulls that squawk (or chirp, or whatever the heck seagulls do), to books filling you in on the  backstory of the game. It's even been described as a first person shooter / adventure game hybrid. Deus Ex is full of stuff that is completely useless in the context of beating the game, but that provides a level of atmosphere that is lacking in many other games.

==Things Of Note==

The game uses a heavily modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Apparently before the latest patch, as the available version of [[Legacy:UnrealEd|UnrealEd]] is [[Legacy:UnrealEd 1|UnrealEd 1]] (written in Visual Basic and crashy). You have to download it separately (It's referred to as the Deus Ex SDK).

''HCDenton:'' Most of the UnrealEd1 crashes occur when you have the ''properties window'' open, deselect all objects, and then click the properties window (to close it). The workaround to this is to simply select some actor before closing the actor properties window.

Many of the UT classes have been modified, from moving functions between classes to wholesale changes. (I'm working on a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Changes]] document.

It does not support:
* [[Legacy:Delegate|Delegate]]s (this is fairly normal since these were only introduced in ut2003!)

===Limitations===

'''Xhiris:''' Read somewhere that the game will take textures up to 1024x1024, but it won't render them properly.  Anyone have concrete info on this?

'''Foxpaw:''' I can't say for sure about Deus Ex, but UT2003 can have textures larger than that. Of course, that's a later version of the engine, but still, rendering is all done by DirectX/OpenGL/whatever, so unless it was a texture compression issue or something, I can't see that being an issue. I suppose if you had a copy of Deus Ex it would be fairly easy to test though.

'''Kawachan:''' I had a fairly big texture (over 256 in size) and it didn't work. Said it was too big. I'd say it ''doesn't'' take 'em that big.

'''Kawachan:''' Well now, I noticed some UT textures are 512. Nice top size. I'd stick with that.

'''IAMME:''' I still play and mod for DX and yes I can say it does take 1024 dimension textures, but as said above the rendering will be horrible. Also, DX takes in only much more improved models than Unreal 1 does, which leads to conversion which is painful :/ 

==Documentation (in progress)==
* [[:Category:Legacy Class (DX)]] ''Category Class list for DX''
* [[Legacy:Class Tree Listing (DX)|Class Tree Listing (DX)]] ''more classes than you can shake a stick at - uncomplete, outdated''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conversations]] ''overview on how conversations work''
* [[Legacy:DeusEx.INI|DeusEx.INI]] ''Game Ini file''
* [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] ''Scale &amp; Dimensions comparision between DX and UT - note that x Unreal Units  = feet * 16 according to [[Legacy:DeusExWeapon|DeusExWeapon]]''

==Downloads==

===Custom Renderers===
* [http://cwdohnal.home.mindspring.com/utglr/ Unofficial Direct3D 8 and enhanced OpenGL renderer for Deus Ex]

===Deus Ex SDK===
* [http://www.fileshack.com/file.x?fid=357 Fileshack]
* [http://www.fileplanet.com/50191/50000/fileinfo/Deus-Ex-SDK-v1112fm Fileplanet]

===UnrealEd 2===
* http://moop.cannonfooder.co.uk/mods/MISC_Unreal_Editor_2_UEd2.zip ''Defunct''
* [http://www.edgefiles.com/files/18837.html EdgeFiles]
* [http://files.filefront.com/UEd2/;930386;;/fileinfo.html FileFront]

==External Links ==
* [http://wiki.beyondunreal.com/wiki/External_Links#0.1.9 Deus Ex Sites]
* [http://www.deusex.com/ Official site]
* [http://home.kc.rr.com/bobfahey/deus_ex.htm Lots of info on the game]
* [[Wikipedia:Deus_Ex]]

==Related Links==
* [[Legacy:Unreal Engine Versions/1|Unreal Engine Versions/1]]

==Comments ==

'''T-1:''' It appears that there are no pages on Deus Ex's GUI classes (not only not here, but not anywhere).... Will be fixed once I do some experimentation.

----

[[:Category:Legacy Game]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash;  Convert to common page layout. See [[Legacy:UT2003|UT2003]] for the layout. \\'''Daffodilistic:''' Page is in the process of being converted to the common page layout, so bare with the changes :)
[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy Game|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35484</id>
      <timestamp>2009-10-16T06:18:19Z</timestamp>
      <contributor>
        <ip>69.106.222.97</ip>
      </contributor>
      <comment>/* Things Of Note */ HCDenton &gt; JCDenton</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|ION Storm Austin 
|-
|'''''Publisher'''''
|[http://www.eidosgames.com/games/info.html?gmid=109 Eidos Interactive] 
|-
|'''''Release Date(s)'''''
|NA June 22, 2000 (WIN)&lt;br /&gt;NA July 7, 2000 (MAC)&lt;br /&gt;EU September 27, 2000 (WIN)&lt;br /&gt;NA March 25, 2002 (PS2)&lt;br /&gt;EU May 24, 2002 (PS2) 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Playstation 2&lt;br /&gt;Mac OS 9 or Mac OS 10 &quot;Classic&quot; enviroment
|-
|'''''Official Web Site'''''
|http://www.DeusEx.com/ ''(Defunct)'' 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/filelist.aspx?s=31662&amp;v=0 FilePlanet] 
|-
|'''''Latest Patch'''''
|Version '''1112fm'''&lt;br /&gt;[http://www.fileplanet.com/59470/50000/fileinfo/Deus-Ex-Patch-v1112fm FilePlanet] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/1
|Unreal Engine 1 Builds 400-436]] 
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 1 (Official), UnrealEd 2 (Unofficial hack)]] 
|}

==Description==

'''Deus Ex''' is a game built with the [[Legacy:Unreal Engine|Unreal Engine]]. It uses a heavily-modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine, and is  unlike a typical first-person-shooter in many ways.  One of them is the sheer level of detail put into the game, from seagulls that squawk (or chirp, or whatever the heck seagulls do), to books filling you in on the  backstory of the game. It's even been described as a first person shooter / adventure game hybrid. Deus Ex is full of stuff that is completely useless in the context of beating the game, but that provides a level of atmosphere that is lacking in many other games.

==Things Of Note==

The game uses a heavily modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Apparently before the latest patch, as the available version of [[Legacy:UnrealEd|UnrealEd]] is [[Legacy:UnrealEd 1|UnrealEd 1]] (written in Visual Basic and crashy). You have to download it separately (It's referred to as the Deus Ex SDK).

''JCDenton:'' Most of the UnrealEd1 crashes occur when you have the ''properties window'' open, deselect all objects, and then click the properties window (to close it). The workaround to this is to simply select some actor before closing the actor properties window.

Many of the UT classes have been modified, from moving functions between classes to wholesale changes. (I'm working on a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Changes]] document.

It does not support:
* [[Legacy:Delegate|Delegate]]s (this is fairly normal since these were only introduced in ut2003!)

===Limitations===

'''Xhiris:''' Read somewhere that the game will take textures up to 1024x1024, but it won't render them properly.  Anyone have concrete info on this?

'''Foxpaw:''' I can't say for sure about Deus Ex, but UT2003 can have textures larger than that. Of course, that's a later version of the engine, but still, rendering is all done by DirectX/OpenGL/whatever, so unless it was a texture compression issue or something, I can't see that being an issue. I suppose if you had a copy of Deus Ex it would be fairly easy to test though.

'''Kawachan:''' I had a fairly big texture (over 256 in size) and it didn't work. Said it was too big. I'd say it ''doesn't'' take 'em that big.

'''Kawachan:''' Well now, I noticed some UT textures are 512. Nice top size. I'd stick with that.

'''IAMME:''' I still play and mod for DX and yes I can say it does take 1024 dimension textures, but as said above the rendering will be horrible. Also, DX takes in only much more improved models than Unreal 1 does, which leads to conversion which is painful :/

==Documentation (in progress)==
* [[:Category:Legacy Class (DX)]] ''Category Class list for DX''
* [[Legacy:Class Tree Listing (DX)|Class Tree Listing (DX)]] ''more classes than you can shake a stick at - uncomplete, outdated''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conversations]] ''overview on how conversations work''
* [[Legacy:DeusEx.INI|DeusEx.INI]] ''Game Ini file''
* [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] ''Scale &amp; Dimensions comparision between DX and UT - note that x Unreal Units  = feet * 16 according to [[Legacy:DeusExWeapon|DeusExWeapon]]''

==Downloads==

===Custom Renderers===
* [http://cwdohnal.home.mindspring.com/utglr/ Unofficial Direct3D 8 and enhanced OpenGL renderer for Deus Ex]

===Deus Ex SDK===
* [http://www.fileshack.com/file.x?fid=357 Fileshack]
* [http://www.fileplanet.com/50191/50000/fileinfo/Deus-Ex-SDK-v1112fm Fileplanet]

===UnrealEd 2===
* http://moop.cannonfooder.co.uk/mods/MISC_Unreal_Editor_2_UEd2.zip ''Defunct''
* [http://www.edgefiles.com/files/18837.html EdgeFiles]
* [http://files.filefront.com/UEd2/;930386;;/fileinfo.html FileFront]

==External Links ==
* [http://wiki.beyondunreal.com/wiki/External_Links#0.1.9 Deus Ex Sites]
* [http://www.deusex.com/ Official site]
* [http://home.kc.rr.com/bobfahey/deus_ex.htm Lots of info on the game]
* [[Wikipedia:Deus_Ex]]

==Related Links==
* [[Legacy:Unreal Engine Versions/1|Unreal Engine Versions/1]]

==Comments ==

'''T-1:''' It appears that there are no pages on Deus Ex's GUI classes (not only not here, but not anywhere).... Will be fixed once I do some experimentation.

----

[[:Category:Legacy Game]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash;  Convert to common page layout. See [[Legacy:UT2003|UT2003]] for the layout. \\'''Daffodilistic:''' Page is in the process of being converted to the common page layout, so bare with the changes :)
[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy Game|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35485</id>
      <timestamp>2009-10-16T06:20:12Z</timestamp>
      <contributor>
        <ip>69.106.222.97</ip>
      </contributor>
      <comment>/* Things Of Note */</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|ION Storm Austin 
|-
|'''''Publisher'''''
|[http://www.eidosgames.com/games/info.html?gmid=109 Eidos Interactive] 
|-
|'''''Release Date(s)'''''
|NA June 22, 2000 (WIN)&lt;br /&gt;NA July 7, 2000 (MAC)&lt;br /&gt;EU September 27, 2000 (WIN)&lt;br /&gt;NA March 25, 2002 (PS2)&lt;br /&gt;EU May 24, 2002 (PS2) 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Playstation 2&lt;br /&gt;Mac OS 9 or Mac OS 10 &quot;Classic&quot; enviroment
|-
|'''''Official Web Site'''''
|http://www.DeusEx.com/ ''(Defunct)'' 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/filelist.aspx?s=31662&amp;v=0 FilePlanet] 
|-
|'''''Latest Patch'''''
|Version '''1112fm'''&lt;br /&gt;[http://www.fileplanet.com/59470/50000/fileinfo/Deus-Ex-Patch-v1112fm FilePlanet] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/1
|Unreal Engine 1 Builds 400-436]] 
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 1 (Official), UnrealEd 2 (Unofficial hack)]] 
|}

==Description==

'''Deus Ex''' is a game built with the [[Legacy:Unreal Engine|Unreal Engine]]. It uses a heavily-modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine, and is  unlike a typical first-person-shooter in many ways.  One of them is the sheer level of detail put into the game, from seagulls that squawk (or chirp, or whatever the heck seagulls do), to books filling you in on the  backstory of the game. It's even been described as a first person shooter / adventure game hybrid. Deus Ex is full of stuff that is completely useless in the context of beating the game, but that provides a level of atmosphere that is lacking in many other games.

==Things Of Note==

The game uses a heavily modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Apparently before the latest patch, as the available version of [[Legacy:UnrealEd|UnrealEd]] is [[Legacy:UnrealEd 1|UnrealEd 1]] (written in Visual Basic and crashy). You have to download it separately (It's referred to as the Deus Ex SDK).

''HCDenton:'' Most of the UnrealEd1 crashes occur when you have the ''properties window'' open, deselect all objects, and then click the properties window (to close it). The workaround to this is to simply select some actor before closing the actor properties window.

Many of the UT classes have been modified, from moving functions between classes to wholesale changes. (I'm working on a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Changes]] document.

It does not support:
* [[Legacy:Delegate|Delegate]]s (this is fairly normal since these were only introduced in ut2003!)

===Limitations===

'''Xhiris:''' Read somewhere that the game will take textures up to 1024x1024, but it won't render them properly.  Anyone have concrete info on this?

'''Foxpaw:''' I can't say for sure about Deus Ex, but UT2003 can have textures larger than that. Of course, that's a later version of the engine, but still, rendering is all done by DirectX/OpenGL/whatever, so unless it was a texture compression issue or something, I can't see that being an issue. I suppose if you had a copy of Deus Ex it would be fairly easy to test though.

'''Kawachan:''' I had a fairly big texture (over 256 in size) and it didn't work. Said it was too big. I'd say it ''doesn't'' take 'em that big.

'''Kawachan:''' Well now, I noticed some UT textures are 512. Nice top size. I'd stick with that.

'''IAMME:''' I still play and mod for DX and yes I can say it does take 1024 dimension textures, but as said above the rendering will be horrible. Also, DX takes in only much more improved models than Unreal 1 does, which leads to conversion which is painful :/

==Documentation (in progress)==
* [[:Category:Legacy Class (DX)]] ''Category Class list for DX''
* [[Legacy:Class Tree Listing (DX)|Class Tree Listing (DX)]] ''more classes than you can shake a stick at - uncomplete, outdated''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conversations]] ''overview on how conversations work''
* [[Legacy:DeusEx.INI|DeusEx.INI]] ''Game Ini file''
* [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] ''Scale &amp; Dimensions comparision between DX and UT - note that x Unreal Units  = feet * 16 according to [[Legacy:DeusExWeapon|DeusExWeapon]]''

==Downloads==

===Custom Renderers===
* [http://cwdohnal.home.mindspring.com/utglr/ Unofficial Direct3D 8 and enhanced OpenGL renderer for Deus Ex]

===Deus Ex SDK===
* [http://www.fileshack.com/file.x?fid=357 Fileshack]
* [http://www.fileplanet.com/50191/50000/fileinfo/Deus-Ex-SDK-v1112fm Fileplanet]

===UnrealEd 2===
* http://moop.cannonfooder.co.uk/mods/MISC_Unreal_Editor_2_UEd2.zip ''Defunct''
* [http://www.edgefiles.com/files/18837.html EdgeFiles]
* [http://files.filefront.com/UEd2/;930386;;/fileinfo.html FileFront]

==External Links ==
* [http://wiki.beyondunreal.com/wiki/External_Links#0.1.9 Deus Ex Sites]
* [http://www.deusex.com/ Official site]
* [http://home.kc.rr.com/bobfahey/deus_ex.htm Lots of info on the game]
* [[Wikipedia:Deus_Ex]]

==Related Links==
* [[Legacy:Unreal Engine Versions/1|Unreal Engine Versions/1]]

==Comments ==

'''T-1:''' It appears that there are no pages on Deus Ex's GUI classes (not only not here, but not anywhere).... Will be fixed once I do some experimentation.

----

[[:Category:Legacy Game]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash;  Convert to common page layout. See [[Legacy:UT2003|UT2003]] for the layout. \\'''Daffodilistic:''' Page is in the process of being converted to the common page layout, so bare with the changes :)
[[Category:Legacy Class (DX)|{{PAGENAME}}]]
[[Category:Legacy Game|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Deus Ex/Class Changes</title>
    <id>1038</id>
    <revision>
      <id>2772</id>
      <timestamp>2006-11-25T16:42:00Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Removed link to Class Difference Outline. It was merged witht this page.</comment>
      <text xml:space="preserve">==About this Page ==

[[Legacy:Deus Ex|Deus Ex]] was built with a modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Modifications included changes to the base classes as well as new classes to support the game.

This page will attempt to describe those differences.

==Analysis Process ==

Generally, go through and comment the class files so UncodeX can use the Class Wikifier add-in.

UncodeX comments have to be surrounded with /** */, and ''above'' the thing they're describing.

Many classes separate members into &quot;sections&quot; with horizontal bars in the comments.  UncodeX orders everything alphabetically by section, so this is lost.  For these, I change the declaration as if exposing the value to UnrealED, but with a prefix so I know that it's really not.

Like this:

&lt;uscript&gt;
/** hour */
var(_Current Time)transient int   Hour;
&lt;/uscript&gt;

I use [[Legacy:BeyondCompare|BeyondCompare]] to find &quot;interesting&quot; classes and members.  That is, things that don't behave the way [[Legacy:Unreal Tournament|Unreal Tournament]] does, or things new to [[Legacy:Deus Ex|Deus Ex]].

For now, I'm just commenting everything - I don't know enough about UT to do triage.  I'll weed out the obvious stuff later.

==Similar Classes ==

Some classes have differences that aren't important, like spacing, precision of default variables, etc.  The differences may be significant if you're using UnrealED 2.0 for Deus Ex, but I'm not sure.

Here they are:

AmbientSound, Ambushpoint, Camera, Carcass, Counter, Dispatcher, HomeBase, Keypoint, LiftCenter, Light, MusicEvent, PathNode

==Class Difference Outline ==

Here are all the classes that are somehow different from UT.  This could mean:

* Stuff added to Deus Ex,
* Stuff added to UT after Ion Storm started messing with the engine
* Stuff Ion Storm took out for Deus Ex.

It's hard to tell the difference, since we don't have the same version of the code Ion Storm started with.

All comparisons are to Unreal Tournament build 437

===Common to all Packages===

====Changes in Unreal Tournament====
* Many [[Legacy:Float|float]] defaultproperties are given to six digits of precision in [[Legacy:Unreal Tournament|Unreal Tournament]], two in Deus Ex.  
* Textures and other resources tend to be referenced by their package name. In Deus Ex, just the resource name is given most of the time.
* Several defaultproperties that are raw numbers in Deus Ex are Enums in Unreal Tournament.  
** [[Legacy:FixMe|FixMe]] Can you give default values for enums as the enum name instead of a number in Deus Ex?  Note: try this
** Some changes in the classes suggest that axis directions are different in [[Legacy:Unreal Tournament|Unreal Tournament]].  Can anyone confirm this?

'''T1:''' Note, I think these changes are just changes in the Deus Ex version of UCC, or laziness on the part of the programmer.

==UT Packages/Folders not in Deus Ex==
* Botpack
* Logs
* NetGamesUSA.com
* UMenu
* UnrealShare
* UTBrowser
* UTMenu
* UTServerAdmin
* UWeb
* Web

==DX Packages/Folders not in UT==
* ConSys - Conversation system
* ConvEdit - Conversation system
* DeusEx - actual gameplay code
* DeusExCharacters - no code, just import execs.
* DeusExConversations - no code, just import execs.
* DeusExConText - no code, just importated text from ConEdit
* DeusExDeco - no code, just import execs.
* DeusExItems - no code, just import execs.
* DeusExSounds - no code, just import execs.
* DeusExText - no code, just import execs.
* DeusExUI - no code, just import execs.
* Extension - contains code for UI, input system, several other things.
* MPCharacters - no code, just import execs.

==Specific changes to classes in existing packages==

===Core package===
* [[Legacy:Object (DX)|Object (DX)]] 

===Editor package===
* [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]
** [[Legacy:ConeBuilder (DX)|ConeBuilder (DX)]]
** [[Legacy:CubeBuilder (DX)|CubeBuilder (DX)]]
** [[Legacy:CylinderBuilder (DX)|CylinderBuilder (DX)]]
** [[Legacy:SheetBuilder (DX)|SheetBuilder (DX)]]
** Formulas are different, divides dimensions by 2 for some reason
** [[Legacy:TetrahedronBuilder (DX)|TetrahedronBuilder (DX)]]

* [[Legacy:EditorEngine (DX)|EditorEngine (DX)]]

===Engine package===

* [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Ammo (DX)|Ammo (DX)]]
* [[Legacy:Bitmap (DX)|Bitmap (DX)]]
* [[Legacy:Brush (DX)|Brush (DX)]]
* [[Legacy:Canvas (DX)|Canvas (DX)]]
** DX uses a &quot;FontFactory&quot; to import the large font, UT just uses a regular #exec function?
* [[Legacy:Console (DX)|Console (DX)]] 
* [[Legacy:Decal (DX)|Decal (DX)]]
* [[Legacy:Decoration (DX)|Decoration (DX)]]
* [[Legacy:Fragment (DX)|Fragment (DX)]]
* [[Legacy:GameInfo (DX)|GameInfo (DX)]]
* [[Legacy:GameReplicationInfo (DX)|GameReplicationInfo (DX)]]
** replication section changed

* [[Legacy:HUD (DX)|HUD (DX)]]
** no ProcessKeyEvent() function in DX

* [[Legacy:InterpolationPoint (DX)|InterpolationPoint (DX)]]
** function InterpolateEnd() changed

* [[Legacy:Inventory (DX)|Inventory (DX)]]
** Lots of new stuff

* [[Legacy:LevelInfo (DX)|LevelInfo (DX)]]
* [[Legacy:MapList (DX)|MapList (DX)]]
** Maps() and MapNum() properties are globalconfig in DX, config in UT
** 

* [[Legacy:Mover (DX)|Mover (DX)]]
** function FinishedClosing() uses different PlaySound() function in DX'
** so does FinishedOpening()
** and DoOpen()
** and DoClose()
** function EncroachingOn() changed
** state TriggerToggle() has new features in DX

* [[Legacy:Mutator (DX)|Mutator (DX)]]
** DX has much less in here than UT.  Nothing new.

* [[Legacy:NavigationPoint (DX)|NavigationPoint (DX)]]
** two new properties in UT
** default CollisionRadius smaller in DX, unles using different metrics

* [[Legacy:PatrolPoint (DX)|PatrolPoint (DX)]]
** DX has bugfix in PreBeginPlay()

* [[Legacy:Pawn (DX)|Pawn (DX)]]

* [[Legacy:Pickup (DX)|Pickup (DX)]]
* [[Legacy:Player (DX)|Player (DX)]]
* [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]]
* [[Legacy:PlayerReplicationInfo (DX)|PlayerReplicationInfo (DX)]]
* [[Legacy:PlayerStart (DX)|PlayerStart (DX)]]
* [[Legacy:Projectile (DX)|Projectile (DX)]]
* [[Legacy:RenderIterator (DX)|RenderIterator (DX)]]
* [[Legacy:ScaledSprite (DX)|ScaledSprite (DX)]]
* [[Legacy:Scout (DX)|Scout (DX)]]
* [[Legacy:SkyZoneInfo (DX)|SkyZoneInfo (DX)]]
* [[Legacy:SpawnNotify (DX)|SpawnNotify (DX)]]
* [[Legacy:SpecialEvent (DX)|SpecialEvent (DX)]]
* [[Legacy:Spectator (DX)|Spectator (DX)]]
* [[Legacy:Spotlight (DX)|Spotlight (DX)]]
* [[Legacy:StatLog (DX)|StatLog (DX)]]
* [[Legacy:Teleporter (DX)|Teleporter (DX)]]
* [[Legacy:TestInfo (DX)|TestInfo (DX)]]
* [[Legacy:Texture (DX)|Texture (DX)]]
* [[Legacy:Trigger (DX)|Trigger (DX)]]
* [[Legacy:TriggerLight (DX)|TriggerLight (DX)]]
* [[Legacy:Triggers (DX)|Triggers (DX)]]
* [[Legacy:VoicePack (DX)|VoicePack (DX)]]
* [[Legacy:WarpZoneMarker (DX)|WarpZoneMarker (DX)]]
* [[Legacy:WayBeacon (DX)|WayBeacon (DX)]]
* [[Legacy:Weapon (DX)|Weapon (DX)]]
* [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]]

===IpDrv package===
* IpDrv.UdpBeacon (DX)]]

===IpServer package===
* IpServer.UdpServerQuery (DX)]]
* IpServer.UdpServerUplink (DX)]]

==Discussion/Comments ==

'''Xhiris:''' I've changed my process for several reasons.  For now, I'm ignoring any differences between UT and Deus Ex, since modders are more likely to work within DX than try to port things over to-from UT.  For now, I'm going through and commenting up the class files to let UncodeX work with them.  When that's done, I'll go back through each one andpretty it up, adding info specific to DX where needed.</text>
    </revision>
    <revision>
      <id>2773</id>
      <timestamp>2006-01-16T18:56:33Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>removed non-existant packages somebody made up.</comment>
      <text xml:space="preserve">==About this Page ==

[[Legacy:Deus Ex|Deus Ex]] was built with a modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Modifications included changes to the base classes as well as new classes to support the game.

This page will attempt to describe those differences.

==Analysis Process ==

Generally, go through and comment the class files so UncodeX can use the Class Wikifier add-in.

UncodeX comments have to be surrounded with /** */, and ''above'' the thing they're describing.

Many classes separate members into &quot;sections&quot; with horizontal bars in the comments.  UncodeX orders everything alphabetically by section, so this is lost.  For these, I change the declaration as if exposing the value to UnrealED, but with a prefix so I know that it's really not.

Like this:

&lt;uscript&gt;
/** hour */
var(_Current Time)transient int   Hour;
&lt;/uscript&gt;

I use [[Legacy:BeyondCompare|BeyondCompare]] to find &quot;interesting&quot; classes and members.  That is, things that don't behave the way [[Legacy:Unreal Tournament|Unreal Tournament]] does, or things new to [[Legacy:Deus Ex|Deus Ex]].

For now, I'm just commenting everything - I don't know enough about UT to do triage.  I'll weed out the obvious stuff later.

==Similar Classes ==

Some classes have differences that aren't important, like spacing, precision of default variables, etc.  The differences may be significant if you're using UnrealED 2.0 for Deus Ex, but I'm not sure.

Here they are:

AmbientSound, Ambushpoint, Camera, Carcass, Counter, Dispatcher, HomeBase, Keypoint, LiftCenter, Light, MusicEvent, PathNode

==Class Difference Outline ==

Here are all the classes that are somehow different from UT.  This could mean:

* Stuff added to Deus Ex,
* Stuff added to UT after Ion Storm started messing with the engine
* Stuff Ion Storm took out for Deus Ex.

It's hard to tell the difference, since we don't have the same version of the code Ion Storm started with.

All comparisons are to Unreal Tournament build 437

===Common to all Packages===

====Changes in Unreal Tournament====
* Many [[Legacy:Float|float]] defaultproperties are given to six digits of precision in [[Legacy:Unreal Tournament|Unreal Tournament]], two in Deus Ex.  
* Textures and other resources tend to be referenced by their package name. In Deus Ex, just the resource name is given most of the time.
* Several defaultproperties that are raw numbers in Deus Ex are Enums in Unreal Tournament.  
** [[Legacy:FixMe|FixMe]] Can you give default values for enums as the enum name instead of a number in Deus Ex?  Note: try this
** Some changes in the classes suggest that axis directions are different in [[Legacy:Unreal Tournament|Unreal Tournament]].  Can anyone confirm this?

'''T1:''' Note, I think these changes are just changes in the Deus Ex version of UCC, or laziness on the part of the programmer.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Difference Outline]] for details.

==UT Packages/Folders not in Deus Ex==
* Botpack
* Logs
* NetGamesUSA.com
* UMenu
* UnrealShare
* UTBrowser
* UTMenu
* UTServerAdmin
* UWeb
* Web

==DX Packages/Folders not in UT==
* ConSys - Conversation system
* ConvEdit - Conversation system
* DeusEx - actual gameplay code
* DeusExCharacters - no code, just import execs.
* DeusExConversations - no code, just import execs.
* DeusExConText - no code, just importated text from ConEdit
* DeusExDeco - no code, just import execs.
* DeusExItems - no code, just import execs.
* DeusExSounds - no code, just import execs.
* DeusExText - no code, just import execs.
* DeusExUI - no code, just import execs.
* Extension - contains code for UI, input system, several other things.
* MPCharacters - no code, just import execs.

==Specific changes to classes in existing packages==

===Core package===
* [[Legacy:Object (DX)|Object (DX)]] 

===Editor package===
* [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]
** [[Legacy:ConeBuilder (DX)|ConeBuilder (DX)]]
** [[Legacy:CubeBuilder (DX)|CubeBuilder (DX)]]
** [[Legacy:CylinderBuilder (DX)|CylinderBuilder (DX)]]
** [[Legacy:SheetBuilder (DX)|SheetBuilder (DX)]]
** Formulas are different, divides dimensions by 2 for some reason
** [[Legacy:TetrahedronBuilder (DX)|TetrahedronBuilder (DX)]]

* [[Legacy:EditorEngine (DX)|EditorEngine (DX)]]

===Engine package===

* [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Ammo (DX)|Ammo (DX)]]
* [[Legacy:Bitmap (DX)|Bitmap (DX)]]
* [[Legacy:Brush (DX)|Brush (DX)]]
* [[Legacy:Canvas (DX)|Canvas (DX)]]
** DX uses a &quot;FontFactory&quot; to import the large font, UT just uses a regular #exec function?
* [[Legacy:Console (DX)|Console (DX)]] 
* [[Legacy:Decal (DX)|Decal (DX)]]
* [[Legacy:Decoration (DX)|Decoration (DX)]]
* [[Legacy:Fragment (DX)|Fragment (DX)]]
* [[Legacy:GameInfo (DX)|GameInfo (DX)]]
* [[Legacy:GameReplicationInfo (DX)|GameReplicationInfo (DX)]]
** replication section changed

* [[Legacy:HUD (DX)|HUD (DX)]]
** no ProcessKeyEvent() function in DX

* [[Legacy:InterpolationPoint (DX)|InterpolationPoint (DX)]]
** function InterpolateEnd() changed

* [[Legacy:Inventory (DX)|Inventory (DX)]]
** Lots of new stuff

* [[Legacy:LevelInfo (DX)|LevelInfo (DX)]]
* [[Legacy:MapList (DX)|MapList (DX)]]
** Maps() and MapNum() properties are globalconfig in DX, config in UT
** 

* [[Legacy:Mover (DX)|Mover (DX)]]
** function FinishedClosing() uses different PlaySound() function in DX'
** so does FinishedOpening()
** and DoOpen()
** and DoClose()
** function EncroachingOn() changed
** state TriggerToggle() has new features in DX

* [[Legacy:Mutator (DX)|Mutator (DX)]]
** DX has much less in here than UT.  Nothing new.

* [[Legacy:NavigationPoint (DX)|NavigationPoint (DX)]]
** two new properties in UT
** default CollisionRadius smaller in DX, unles using different metrics

* [[Legacy:PatrolPoint (DX)|PatrolPoint (DX)]]
** DX has bugfix in PreBeginPlay()

* [[Legacy:Pawn (DX)|Pawn (DX)]]

* [[Legacy:Pickup (DX)|Pickup (DX)]]
* [[Legacy:Player (DX)|Player (DX)]]
* [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]]
* [[Legacy:PlayerReplicationInfo (DX)|PlayerReplicationInfo (DX)]]
* [[Legacy:PlayerStart (DX)|PlayerStart (DX)]]
* [[Legacy:Projectile (DX)|Projectile (DX)]]
* [[Legacy:RenderIterator (DX)|RenderIterator (DX)]]
* [[Legacy:ScaledSprite (DX)|ScaledSprite (DX)]]
* [[Legacy:Scout (DX)|Scout (DX)]]
* [[Legacy:SkyZoneInfo (DX)|SkyZoneInfo (DX)]]
* [[Legacy:SpawnNotify (DX)|SpawnNotify (DX)]]
* [[Legacy:SpecialEvent (DX)|SpecialEvent (DX)]]
* [[Legacy:Spectator (DX)|Spectator (DX)]]
* [[Legacy:Spotlight (DX)|Spotlight (DX)]]
* [[Legacy:StatLog (DX)|StatLog (DX)]]
* [[Legacy:Teleporter (DX)|Teleporter (DX)]]
* [[Legacy:TestInfo (DX)|TestInfo (DX)]]
* [[Legacy:Texture (DX)|Texture (DX)]]
* [[Legacy:Trigger (DX)|Trigger (DX)]]
* [[Legacy:TriggerLight (DX)|TriggerLight (DX)]]
* [[Legacy:Triggers (DX)|Triggers (DX)]]
* [[Legacy:VoicePack (DX)|VoicePack (DX)]]
* [[Legacy:WarpZoneMarker (DX)|WarpZoneMarker (DX)]]
* [[Legacy:WayBeacon (DX)|WayBeacon (DX)]]
* [[Legacy:Weapon (DX)|Weapon (DX)]]
* [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]]

===IpDrv package===
* IpDrv.UdpBeacon (DX)]]

===IpServer package===
* IpServer.UdpServerQuery (DX)]]
* IpServer.UdpServerUplink (DX)]]

==Discussion/Comments ==

'''Xhiris:''' I've changed my process for several reasons.  For now, I'm ignoring any differences between UT and Deus Ex, since modders are more likely to work within DX than try to port things over to-from UT.  For now, I'm going through and commenting up the class files to let UncodeX work with them.  When that's done, I'll go back through each one andpretty it up, adding info specific to DX where needed.

==To Do ==

Apply the &quot;pretty&quot; class header to each page, ex:

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; LevelInfo (Package: Engine)}}

Tarquin's already done a few of these.

Define the package each class is in.

Link classes to other game versions where appropriate (UT, UT2003)</text>
    </revision>
    <revision>
      <id>2774</id>
      <timestamp>2006-11-25T16:40:18Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Class headers have been applied to all DX pages, ToDo removed.</comment>
      <text xml:space="preserve">==About this Page ==

[[Legacy:Deus Ex|Deus Ex]] was built with a modified version of the [[Legacy:Unreal Tournament|Unreal Tournament]] engine.  Modifications included changes to the base classes as well as new classes to support the game.

This page will attempt to describe those differences.

==Analysis Process ==

Generally, go through and comment the class files so UncodeX can use the Class Wikifier add-in.

UncodeX comments have to be surrounded with /** */, and ''above'' the thing they're describing.

Many classes separate members into &quot;sections&quot; with horizontal bars in the comments.  UncodeX orders everything alphabetically by section, so this is lost.  For these, I change the declaration as if exposing the value to UnrealED, but with a prefix so I know that it's really not.

Like this:

&lt;uscript&gt;
/** hour */
var(_Current Time)transient int   Hour;
&lt;/uscript&gt;

I use [[Legacy:BeyondCompare|BeyondCompare]] to find &quot;interesting&quot; classes and members.  That is, things that don't behave the way [[Legacy:Unreal Tournament|Unreal Tournament]] does, or things new to [[Legacy:Deus Ex|Deus Ex]].

For now, I'm just commenting everything - I don't know enough about UT to do triage.  I'll weed out the obvious stuff later.

==Similar Classes ==

Some classes have differences that aren't important, like spacing, precision of default variables, etc.  The differences may be significant if you're using UnrealED 2.0 for Deus Ex, but I'm not sure.

Here they are:

AmbientSound, Ambushpoint, Camera, Carcass, Counter, Dispatcher, HomeBase, Keypoint, LiftCenter, Light, MusicEvent, PathNode

==Class Difference Outline ==

Here are all the classes that are somehow different from UT.  This could mean:

* Stuff added to Deus Ex,
* Stuff added to UT after Ion Storm started messing with the engine
* Stuff Ion Storm took out for Deus Ex.

It's hard to tell the difference, since we don't have the same version of the code Ion Storm started with.

All comparisons are to Unreal Tournament build 437

===Common to all Packages===

====Changes in Unreal Tournament====
* Many [[Legacy:Float|float]] defaultproperties are given to six digits of precision in [[Legacy:Unreal Tournament|Unreal Tournament]], two in Deus Ex.  
* Textures and other resources tend to be referenced by their package name. In Deus Ex, just the resource name is given most of the time.
* Several defaultproperties that are raw numbers in Deus Ex are Enums in Unreal Tournament.  
** [[Legacy:FixMe|FixMe]] Can you give default values for enums as the enum name instead of a number in Deus Ex?  Note: try this
** Some changes in the classes suggest that axis directions are different in [[Legacy:Unreal Tournament|Unreal Tournament]].  Can anyone confirm this?

'''T1:''' Note, I think these changes are just changes in the Deus Ex version of UCC, or laziness on the part of the programmer.

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Difference Outline]] for details.

==UT Packages/Folders not in Deus Ex==
* Botpack
* Logs
* NetGamesUSA.com
* UMenu
* UnrealShare
* UTBrowser
* UTMenu
* UTServerAdmin
* UWeb
* Web

==DX Packages/Folders not in UT==
* ConSys - Conversation system
* ConvEdit - Conversation system
* DeusEx - actual gameplay code
* DeusExCharacters - no code, just import execs.
* DeusExConversations - no code, just import execs.
* DeusExConText - no code, just importated text from ConEdit
* DeusExDeco - no code, just import execs.
* DeusExItems - no code, just import execs.
* DeusExSounds - no code, just import execs.
* DeusExText - no code, just import execs.
* DeusExUI - no code, just import execs.
* Extension - contains code for UI, input system, several other things.
* MPCharacters - no code, just import execs.

==Specific changes to classes in existing packages==

===Core package===
* [[Legacy:Object (DX)|Object (DX)]] 

===Editor package===
* [[Legacy:BrushBuilder (DX)|BrushBuilder (DX)]]
** [[Legacy:ConeBuilder (DX)|ConeBuilder (DX)]]
** [[Legacy:CubeBuilder (DX)|CubeBuilder (DX)]]
** [[Legacy:CylinderBuilder (DX)|CylinderBuilder (DX)]]
** [[Legacy:SheetBuilder (DX)|SheetBuilder (DX)]]
** Formulas are different, divides dimensions by 2 for some reason
** [[Legacy:TetrahedronBuilder (DX)|TetrahedronBuilder (DX)]]

* [[Legacy:EditorEngine (DX)|EditorEngine (DX)]]

===Engine package===

* [[Legacy:Actor (DX)|Actor (DX)]]
* [[Legacy:Ammo (DX)|Ammo (DX)]]
* [[Legacy:Bitmap (DX)|Bitmap (DX)]]
* [[Legacy:Brush (DX)|Brush (DX)]]
* [[Legacy:Canvas (DX)|Canvas (DX)]]
** DX uses a &quot;FontFactory&quot; to import the large font, UT just uses a regular #exec function?
* [[Legacy:Console (DX)|Console (DX)]] 
* [[Legacy:Decal (DX)|Decal (DX)]]
* [[Legacy:Decoration (DX)|Decoration (DX)]]
* [[Legacy:Fragment (DX)|Fragment (DX)]]
* [[Legacy:GameInfo (DX)|GameInfo (DX)]]
* [[Legacy:GameReplicationInfo (DX)|GameReplicationInfo (DX)]]
** replication section changed

* [[Legacy:HUD (DX)|HUD (DX)]]
** no ProcessKeyEvent() function in DX

* [[Legacy:InterpolationPoint (DX)|InterpolationPoint (DX)]]
** function InterpolateEnd() changed

* [[Legacy:Inventory (DX)|Inventory (DX)]]
** Lots of new stuff

* [[Legacy:LevelInfo (DX)|LevelInfo (DX)]]
* [[Legacy:MapList (DX)|MapList (DX)]]
** Maps() and MapNum() properties are globalconfig in DX, config in UT
** 

* [[Legacy:Mover (DX)|Mover (DX)]]
** function FinishedClosing() uses different PlaySound() function in DX'
** so does FinishedOpening()
** and DoOpen()
** and DoClose()
** function EncroachingOn() changed
** state TriggerToggle() has new features in DX

* [[Legacy:Mutator (DX)|Mutator (DX)]]
** DX has much less in here than UT.  Nothing new.

* [[Legacy:NavigationPoint (DX)|NavigationPoint (DX)]]
** two new properties in UT
** default CollisionRadius smaller in DX, unles using different metrics

* [[Legacy:PatrolPoint (DX)|PatrolPoint (DX)]]
** DX has bugfix in PreBeginPlay()

* [[Legacy:Pawn (DX)|Pawn (DX)]]

* [[Legacy:Pickup (DX)|Pickup (DX)]]
* [[Legacy:Player (DX)|Player (DX)]]
* [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]]
* [[Legacy:PlayerReplicationInfo (DX)|PlayerReplicationInfo (DX)]]
* [[Legacy:PlayerStart (DX)|PlayerStart (DX)]]
* [[Legacy:Projectile (DX)|Projectile (DX)]]
* [[Legacy:RenderIterator (DX)|RenderIterator (DX)]]
* [[Legacy:ScaledSprite (DX)|ScaledSprite (DX)]]
* [[Legacy:Scout (DX)|Scout (DX)]]
* [[Legacy:SkyZoneInfo (DX)|SkyZoneInfo (DX)]]
* [[Legacy:SpawnNotify (DX)|SpawnNotify (DX)]]
* [[Legacy:SpecialEvent (DX)|SpecialEvent (DX)]]
* [[Legacy:Spectator (DX)|Spectator (DX)]]
* [[Legacy:Spotlight (DX)|Spotlight (DX)]]
* [[Legacy:StatLog (DX)|StatLog (DX)]]
* [[Legacy:Teleporter (DX)|Teleporter (DX)]]
* [[Legacy:TestInfo (DX)|TestInfo (DX)]]
* [[Legacy:Texture (DX)|Texture (DX)]]
* [[Legacy:Trigger (DX)|Trigger (DX)]]
* [[Legacy:TriggerLight (DX)|TriggerLight (DX)]]
* [[Legacy:Triggers (DX)|Triggers (DX)]]
* [[Legacy:VoicePack (DX)|VoicePack (DX)]]
* [[Legacy:WarpZoneMarker (DX)|WarpZoneMarker (DX)]]
* [[Legacy:WayBeacon (DX)|WayBeacon (DX)]]
* [[Legacy:Weapon (DX)|Weapon (DX)]]
* [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]]

===IpDrv package===
* IpDrv.UdpBeacon (DX)]]

===IpServer package===
* IpServer.UdpServerQuery (DX)]]
* IpServer.UdpServerUplink (DX)]]

==Discussion/Comments ==

'''Xhiris:''' I've changed my process for several reasons.  For now, I'm ignoring any differences between UT and Deus Ex, since modders are more likely to work within DX than try to port things over to-from UT.  For now, I'm going through and commenting up the class files to let UncodeX work with them.  When that's done, I'll go back through each one andpretty it up, adding info specific to DX where needed.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Deus Ex/Conversations</title>
    <id>1039</id>
    <revision>
      <id>2775</id>
      <timestamp>2004-02-14T11:09:56Z</timestamp>
      <contributor>
        <ip>TheRenegadeMaster</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What's a Conversation? ==

A &lt;b&gt;Conversation&lt;/b&gt; in [[Legacy:Deus Ex|Deus Ex]] describes an interaction between two Actors in the environment.

This is not necessarily limited to dialogue, with Conversations you can do things like:
* Give things (inventory) to the player
* Run a &quot;store&quot; where the player may purchase items
* Mess with the player's skill and credit levels
* Add goals and notes

The Conversation incidates:
* The Actors involved
* Under what conditions the Conversation begins (or doesn't)
* What happens during the conversation (Events).
* Choices (responses) the player can make to an NPC.

==Types of Events==

Each Conversation typically contains a linked list of events, which define:
* What things happen during the conversation,
* What order they occur in,
* What conditions are required.

There are several types of events, a few of which are not implemented:

; Add Credits; Change the number of credits the player has (you can use negative numbers to deduct)
; Add Goal : Adds an item to the player's goal list.
; Add Note : Adds a Note.
; Add Skill Points : Change the player's skill point total.
; Animation :
; Check Flag :
; Check Object :
; Check Persona :
; Choice
; Comment : Does nothing, just a way to add a comment to the .CON file.
; End : Ends the sequence of events.
; Jump : Moves to another point in the Event list.
; Move Camera : Moves the camera
; Random Label: 
; Set Flag :
; Speech : Say something (really, indicate who is speaking, what they say, who they're talking to&quot;
; Trade : ''Apparently not implemented.''
; Transfer Object : Moves objects (inventory) from one Actor to another.
; Trigger :

==How Conversations are Rendered==

Text in conversation shows up in two ways.

Many conversations (i.e. dialogue between actors) show up at the bottom of the screen in a black area (letterbox?)

Still others, &quot;barks&quot; appear as a sort of popup window in the UI.  They're mostly used when not engaging in dialogue with another actor. (For example, what the NPC's say as they go about their business, or things they say to the player if they don't have any &quot;dialogue&quot; conversation going on.

===Getting to the Conversation Object Hierarchy===

Conversation objects are spread throughout the actors that own them in each level.  To get to the conversations, you must first get to the actors.

You do this through a reference to the current player.

+ Window.GetRootWindow()

++ DeusExBaseWindow.root

+++ root.ParentPawn

To check if an actor has any conversations for it, check if its conListItems variable (Actor.conListItems) is none or not. If none, then there is a list of conversations that this actor is involved it.

'''Xhiris:''' I'm working on dumping the whole Conversation tree to XML, will fill this in more as details are discovered.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2776</id>
      <timestamp>2004-02-11T23:46:10Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Getting to the Conversations==

Conversation objects are spread throughout the actors that own them in each level.  To get to the conversations, you must first get to the actors.

You do this through a reference to the current player.

+ Window.GetRootWindow()

++ DeusExBaseWindow.root

+++ root.ParentPawn

'''Xhiris:''' I'm working on dumping the whole Conversation tree to XML, will fill this in more as details are discovered.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2777</id>
      <timestamp>2004-02-14T08:40:18Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What's a Conversation? ==

A &lt;b&gt;Conversation&lt;/b&gt; in [[Legacy:Deus Ex|Deus Ex]] describes an interaction between two Actors in the environment.

This is not necessarily limited to dialogue, with Conversations you can do things like:
* Give things (inventory) to the player
* Run a &quot;store&quot; where the player may purchase items
* Mess with the player's skill and credit levels
* Add goals and notes

The Conversation incidates:
* The Actors involved
* Under what conditions the Conversation begins (or doesn't)
* What happens during the conversation (Events).
* Choices (responses) the player can make to an NPC.

==Types of Events==

Each Conversation typically contains a linked list of events, which define:
* What things happen during the conversation,
* What order they occur in,
* What conditions are required.

There are several types of events, a few of which are not implemented:

; Add Credits; Change the number of credits the player has (you can use negative numbers to deduct)
; Add Goal : Adds an item to the player's goal list.
; Add Note : Adds a Note.
; Add Skill Points : Change the player's skill point total.
; Animation :
; Check Flag :
; Check Object :
; Check Persona :
; Choice
; Comment : Does nothing, just a way to add a comment to the .CON file.
; End : Ends the sequence of events.
; Jump : Moves to another point in the Event list.
; Move Camera : Moves the camera
; Random Label: 
; Set Flag :
; Speech : Say something (really, indicate who is speaking, what they say, who they're talking to&quot;
; Trade : ''Apparently not implemented.''
; Transfer Object : Moves objects (inventory) from one Actor to another.
; Trigger :

==How Conversations are Rendered==

Text in conversation shows up in two ways.

Many conversations (i.e. dialogue between actors) show up at the bottom of the screen in a black area (letterbox?)

Still others, &quot;barks&quot; appear as a sort of popup window in the UI.  They're mostly used when not engaging in dialogue with another actor. (For example, what the NPC's say as they go about their business, or things they say to the player if they don't have any &quot;dialogue&quot; conversation going on.

===Getting to the Conversation Object Hierarchy===

Conversation objects are spread throughout the actors that own them in each level.  To get to the conversations, you must first get to the actors.

You do this through a reference to the current player.

+ Window.GetRootWindow()

++ DeusExBaseWindow.root

+++ root.ParentPawn

'''Xhiris:''' I'm working on dumping the whole Conversation tree to XML, will fill this in more as details are discovered.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeusEx</title>
    <id>1083</id>
    <revision>
      <id>2872</id>
      <timestamp>2006-10-22T03:15:52Z</timestamp>
      <contributor>
        <ip>202-156-8-11.cache.maxonline.com.sg</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an disambiguation page:

Are you looking for [[:Category:Legacy Class (DX)|DeusEx Classes]], or [[Legacy:Deus_Ex|Deus Ex game information]]?</text>
    </revision>
    <revision>
      <id>2873</id>
      <timestamp>2006-10-22T03:10:16Z</timestamp>
      <contributor>
        <ip>202-156-8-11.cache.maxonline.com.sg</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an disambiguation page:

Are you looking for [[:Category:Legacy Class (DX)|DeusEx Classes]], or [[Legacy:DX|Deus Ex game information]]?</text>
    </revision>
    <revision>
      <id>28665</id>
      <timestamp>2008-05-20T11:08:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>turned pointless disambiguation page into redirect</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Deus Ex]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeusEx.INI</title>
    <id>1046</id>
    <revision>
      <id>2789</id>
      <timestamp>2005-02-17T16:25:08Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>an .ini file is not a class...</comment>
      <text xml:space="preserve">This is Deus Ex's [[Legacy:Game Ini File|Game Ini File]] file.

&lt;uscript&gt;
[URL]
Protocol=deusex
ProtocolDescription=Deus Ex Protocol
Name=Player
Map=Index.dx
LocalMap=DX.dx
Host=
Portal=
MapExt=dx                                     // file extension for map files
SaveExt=dxs                                   // file extension for save files
Port=7790
Class=DeusEx.JCDentonMale                     // class to use for the player

[FirstRun]
FirstRun=1100

[Engine.Engine]
GameRenderDevice=GlideDrv.GlideRenderDevice
AudioDevice=Galaxy.GalaxyAudioSubsystem
NetworkDevice=IpDrv.TcpNetDriver
DemoRecordingDevice=Engine.DemoRecDriver
Console=Engine.Console
Language=int
GameEngine=DeusEx.DeusExGameEngine
EditorEngine=Editor.EditorEngine
WindowedRenderDevice=SoftDrv.SoftwareRenderDevice
RenderDevice=GlideDrv.GlideRenderDevice
DefaultGame=DeusEx.DeusExGameInfo
DefaultServerGame=DeusEx.DeathMatchGame
ViewportManager=WinDrv.WindowsClient
Render=Render.Render
Input=Extension.InputExt
Canvas=Engine.Canvas
Root=DeusEx.DeusExRootWindow
CdPath=D:\DeusEx

[Core.System]
PurgeCacheDays=30
SavePath=..\Save
CachePath=..\Cache
CacheExt=.uxx
Paths=..\System\*.u
Paths=..\Maps\*.dx
Paths=..\Textures\*.utx
Paths=..\Sounds\*.uax
Paths=..\Music\*.umx
Suppress=DevLoad
Suppress=DevSave
Suppress=DevNetTraffic
Suppress=DevGarbage
Suppress=DevKill
Suppress=DevReplace
Suppress=DevSound
Suppress=DevCompile
Suppress=DevBind
Suppress=DevBsp

[DeusEx.DeusExGameEngine]
CacheSizeMegs=4
UseSound=True
ServerActors=IpDrv.UdpBeacon
ServerActors=IpServer.UdpServerQuery
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.fragaholic.com MasterServerPort=27900

// epicgames.com and fragaholic.com both are unused anymore, can be removed to reduce log warnings.

[WinDrv.WindowsClient]
WindowedViewportX=640
WindowedViewportY=480
WindowedColorBits=16
FullscreenViewportX=640
FullscreenViewportY=480
FullscreenColorBits=16
Brightness=0.600000
MipFactor=1.000000
UseDirectDraw=True
UseJoystick=False
CaptureMouse=True
StartupFullscreen=True
CurvedSurfaces=False
ScreenFlashes=True
NoLighting=False
SlowVideoBuffering=False
DeadZoneXYZ=True
DeadZoneRUV=False
InvertVertical=False
ScaleXYZ=1000.000000
ScaleRUV=2000.000000
SkinDetail=High
TextureDetail=High
Decals=True
MinDesiredFrameRate=1.0

[Engine.Player]
ConfiguredInternetSpeed=2600
ConfiguredLanSpeed=20000

[Galaxy.GalaxyAudioSubsystem]
UseDirectSound=True
UseFilter=True
UseSurround=False
UseStereo=True
UseCDMusic=False
UseDigitalMusic=True
UseSpatial=False
UseReverb=True
Use3dHardware=False
LowSoundQuality=False
ReverseStereo=False
Latency=40
OutputRate=44100Hz
EffectsChannels=16
DopplerSpeed=6500.000000
MusicVolume=153
SoundVolume=204
SpeechVolume=255
AmbientFactor=0.700000

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=500.0
AckTimeout=1.0
KeepAliveTime=1.0
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=20
LanServerMaxTickRate=35
StaticUpdateRate=12
DynamicUpdateRate=40

// Some suggest values: 

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.000000
InitialConnectTimeout=30.000000
AckTimeout=1.0
KeepAliveTime=0.500000
MaxClientRate=20000
SimLatency=0
RelevantTimeout=4.000000
SpawnPrioritySeconds=1.000000
ServerTravelPause=4.000000
NetServerMaxTickRate=20
LanServerMaxTickRate=20
StaticUpdateRate=12
DynamicUpdateRate=40

[IpDrv.TcpipConnection]
SimPacketLoss=0
SimLatency=0

[IpServer.UdpServerQuery]
GameName=deusex

[IpDrv.UdpBeacon]
DoBeacon=True
BeaconTime=0.50
BeaconTimeout=5.0
BeaconPort=7776
BeaconProduct=DeusEx

[SoftDrv.SoftwareRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=False
Coronas=False
HighDetailActors=True
HighResTextureSmooth=True
LowResTextureSmooth=False
FastTranslucency=True

[GlideDrv.GlideRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailBias=-1.500000
RefreshRate=100Hz
DetailTextures=True
FastUglyRefresh=False
ScreenSmoothing=True
Resolution=Default

[MetalDrv.MetalRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailTextures=True

[OpenGLDrv.OpenGLRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailTextures=True
UseTNT=1
MinDepthBits=16
MaxLogUOverV=8
MaxLogVOverU=8
UseMultiTexture=1
UsePalette=1
UseAlphaPalette=0
ShareLists=0
AlwaysMipmap=0
DoPrecache=0
UseTrilinear=False
MaxAnisotropy=0
SupportsLazyTextures=0

[D3DDrv.D3DRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
UseMipmapping=True
UseTrilinear=False
UseMultitexture=True
UsePageFlipping=True
UsePalettes=True
UseFullscreen=True
UseGammaCorrection=True
DetailTextures=True
Use3dfx=False
UseTripleBuffering=True
UsePrecache=False
Use32BitTextures=False

[SglDrv.SglRenderDevice]
Translucency=True
VolumetricLighting=False
ShinySurfaces=False
Coronas=True
HighDetailActors=False
ColorDepth=16
DetailTextures=False
FastUglyRefresh=False
TextureDetailBias=Near
VertexLighting=False

[Editor.EditorEngine]
UseSound=True
CacheSizeMegs=6
GridEnabled=True
SnapVertices=True
SnapDistance=10.000000
GridSize=(X=16.000000,Y=16.000000,Z=16.000000)
RotGridEnabled=True
RotGridSize=(Pitch=1024,Yaw=1024,Roll=1024)
GameCommandLine=-log
FovAngleDegrees=90.000000
GodMode=True
AutoSave=False
AutoSaveTimeMinutes=5
AutoSaveIndex=6
C_WorldBox=(R=0,G=0,B=107,A=0)
C_GroundPlane=(R=0,G=0,B=63,A=0)
C_GroundHighlight=(R=0,G=0,B=127,A=0)
C_BrushWire=(R=255,G=63,B=63,A=0)
C_Pivot=(R=0,G=255,B=0,A=0)
C_Select=(R=0,G=0,B=127,A=0)
C_AddWire=(R=127,G=127,B=255,A=0)
C_SubtractWire=(R=255,G=192,B=63,A=0)
C_GreyWire=(R=163,G=163,B=163,A=0)
C_Invalid=(R=163,G=163,B=163,A=0)
C_ActorWire=(R=127,G=63,B=0,A=0)
C_ActorHiWire=(R=255,G=127,B=0,A=0)
C_White=(R=255,G=255,B=255,A=0)
C_SemiSolidWire=(R=127,G=255,B=0,A=0)
C_NonSolidWire=(R=63,G=192,B=32,A=0)
C_WireGridAxis=(R=119,G=119,B=119,A=0)
C_ActorArrow=(R=163,G=0,B=0,A=0)
C_ScaleBox=(R=151,G=67,B=11,A=0)
C_ScaleBoxHi=(R=223,G=149,B=157,A=0)
C_Mover=(R=255,G=0,B=255,A=0)
C_OrthoBackground=(R=163,G=163,B=163,A=0)
C_Current=(R=0,G=0,B=0,A=0)
C_BrushVertex=(R=0,G=0,B=0,A=0)
C_BrushSnap=(R=0,G=0,B=0,A=0)
C_Black=(R=0,G=0,B=0,A=0)
C_Mask=(R=0,G=0,B=0,A=0)
C_WireBackground=(R=0,G=0,B=0,A=0)
C_ZoneWire=(R=0,G=0,B=0,A=0)
EditPackages=Core
EditPackages=Engine
EditPackages=Editor
EditPackages=Fire
EditPackages=IpDrv
EditPackages=Extension
EditPackages=DeusExUI
EditPackages=ConSys
EditPackages=DeusExConversations
EditPackages=DeusExSounds
EditPackages=DeusExItems
EditPackages=DeusExDeco
EditPackages=DeusExCharacters
EditPackages=DeusExText
EditPackages=DeusEx
EditPackages=IpServer

[DeusEx.DeusExGameInfo]
bNoMonsters=False
bHumansOnly=False
bCoopWeaponMode=False
bClassicDeathmessages=False

[Engine.GameInfo]
bLowGore=False

[Engine.DemoRecDriver]
DemoSpectatorClass=UnrealShare.UnrealSpectator
MaxClientRate=25000
ConnectionTimeout=15.0
InitialConnectTimeout=500.0
AckTimeout=1.0
KeepAliveTime=1.0
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=60
LanServerMaxTickRate=60

[DeusEx.MenuScreenJoinGame]
MasterServerAddress=master0.gamespy.com

[Engine.GameReplicationInfo]
ServerName=
ShortName=

[IpServer.UdpBeacon]
BeaconProduct=DeusEx
&lt;/uscript&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2790</id>
      <timestamp>2004-02-12T08:33:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>This is a [[Game Ini File]] file, right?</comment>
      <text xml:space="preserve">This is a [[Legacy:Game Ini File|Game Ini File]] file, right?

&lt;uscript&gt;
[URL]
Protocol=deusex
ProtocolDescription=Deus Ex Protocol
Name=Player
Map=Index.dx
LocalMap=DX.dx
Host=
Portal=
MapExt=dx                                     // file extension for map files
SaveExt=dxs                                   // file extension for save files
Port=7790
Class=DeusEx.JCDentonMale                     // class to use for the player

[FirstRun]
FirstRun=1100

[Engine.Engine]
GameRenderDevice=GlideDrv.GlideRenderDevice
AudioDevice=Galaxy.GalaxyAudioSubsystem
NetworkDevice=IpDrv.TcpNetDriver
DemoRecordingDevice=Engine.DemoRecDriver
Console=Engine.Console
Language=int
GameEngine=DeusEx.DeusExGameEngine
EditorEngine=Editor.EditorEngine
WindowedRenderDevice=SoftDrv.SoftwareRenderDevice
RenderDevice=GlideDrv.GlideRenderDevice
DefaultGame=DeusEx.DeusExGameInfo
DefaultServerGame=DeusEx.DeathMatchGame
ViewportManager=WinDrv.WindowsClient
Render=Render.Render
Input=Extension.InputExt
Canvas=Engine.Canvas
Root=DeusEx.DeusExRootWindow
CdPath=D:\DeusEx

[Core.System]
PurgeCacheDays=30
SavePath=..\Save
CachePath=..\Cache
CacheExt=.uxx
Paths=..\System\*.u
Paths=..\Maps\*.dx
Paths=..\Textures\*.utx
Paths=..\Sounds\*.uax
Paths=..\Music\*.umx
Suppress=DevLoad
Suppress=DevSave
Suppress=DevNetTraffic
Suppress=DevGarbage
Suppress=DevKill
Suppress=DevReplace
Suppress=DevSound
Suppress=DevCompile
Suppress=DevBind
Suppress=DevBsp

[DeusEx.DeusExGameEngine]
CacheSizeMegs=4
UseSound=True
ServerActors=IpDrv.UdpBeacon
ServerActors=IpServer.UdpServerQuery
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.fragaholic.com MasterServerPort=27900

[WinDrv.WindowsClient]
WindowedViewportX=640
WindowedViewportY=480
WindowedColorBits=16
FullscreenViewportX=640
FullscreenViewportY=480
FullscreenColorBits=16
Brightness=0.600000
MipFactor=1.000000
UseDirectDraw=True
UseJoystick=False
CaptureMouse=True
StartupFullscreen=True
CurvedSurfaces=False
ScreenFlashes=True
NoLighting=False
SlowVideoBuffering=False
DeadZoneXYZ=True
DeadZoneRUV=False
InvertVertical=False
ScaleXYZ=1000.000000
ScaleRUV=2000.000000
SkinDetail=High
TextureDetail=High
Decals=True
MinDesiredFrameRate=1.0

[Engine.Player]
ConfiguredInternetSpeed=2600
ConfiguredLanSpeed=20000

[Galaxy.GalaxyAudioSubsystem]
UseDirectSound=True
UseFilter=True
UseSurround=False
UseStereo=True
UseCDMusic=False
UseDigitalMusic=True
UseSpatial=False
UseReverb=True
Use3dHardware=False
LowSoundQuality=False
ReverseStereo=False
Latency=40
OutputRate=44100Hz
EffectsChannels=16
DopplerSpeed=6500.000000
MusicVolume=153
SoundVolume=204
SpeechVolume=255
AmbientFactor=0.700000

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=500.0
AckTimeout=1.0
KeepAliveTime=1.0
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=20
LanServerMaxTickRate=35
StaticUpdateRate=12
DynamicUpdateRate=40

[IpDrv.TcpipConnection]
SimPacketLoss=0
SimLatency=0

[IpServer.UdpServerQuery]
GameName=deusex

[IpDrv.UdpBeacon]
DoBeacon=True
BeaconTime=0.50
BeaconTimeout=5.0
BeaconPort=7776
BeaconProduct=DeusEx

[SoftDrv.SoftwareRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=False
Coronas=False
HighDetailActors=True
HighResTextureSmooth=True
LowResTextureSmooth=False
FastTranslucency=True

[GlideDrv.GlideRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailBias=-1.500000
RefreshRate=100Hz
DetailTextures=True
FastUglyRefresh=False
ScreenSmoothing=True
Resolution=Default

[MetalDrv.MetalRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailTextures=True

[OpenGLDrv.OpenGLRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailTextures=True
UseTNT=1
MinDepthBits=16
MaxLogUOverV=8
MaxLogVOverU=8
UseMultiTexture=1
UsePalette=1
UseAlphaPalette=0
ShareLists=0
AlwaysMipmap=0
DoPrecache=0
UseTrilinear=False
MaxAnisotropy=0
SupportsLazyTextures=0

[D3DDrv.D3DRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
UseMipmapping=True
UseTrilinear=False
UseMultitexture=True
UsePageFlipping=True
UsePalettes=True
UseFullscreen=True
UseGammaCorrection=True
DetailTextures=True
Use3dfx=False
UseTripleBuffering=True
UsePrecache=False
Use32BitTextures=False

[SglDrv.SglRenderDevice]
Translucency=True
VolumetricLighting=False
ShinySurfaces=False
Coronas=True
HighDetailActors=False
ColorDepth=16
DetailTextures=False
FastUglyRefresh=False
TextureDetailBias=Near
VertexLighting=False

[Editor.EditorEngine]
UseSound=True
CacheSizeMegs=6
GridEnabled=True
SnapVertices=True
SnapDistance=10.000000
GridSize=(X=16.000000,Y=16.000000,Z=16.000000)
RotGridEnabled=True
RotGridSize=(Pitch=1024,Yaw=1024,Roll=1024)
GameCommandLine=-log
FovAngleDegrees=90.000000
GodMode=True
AutoSave=False
AutoSaveTimeMinutes=5
AutoSaveIndex=6
C_WorldBox=(R=0,G=0,B=107,A=0)
C_GroundPlane=(R=0,G=0,B=63,A=0)
C_GroundHighlight=(R=0,G=0,B=127,A=0)
C_BrushWire=(R=255,G=63,B=63,A=0)
C_Pivot=(R=0,G=255,B=0,A=0)
C_Select=(R=0,G=0,B=127,A=0)
C_AddWire=(R=127,G=127,B=255,A=0)
C_SubtractWire=(R=255,G=192,B=63,A=0)
C_GreyWire=(R=163,G=163,B=163,A=0)
C_Invalid=(R=163,G=163,B=163,A=0)
C_ActorWire=(R=127,G=63,B=0,A=0)
C_ActorHiWire=(R=255,G=127,B=0,A=0)
C_White=(R=255,G=255,B=255,A=0)
C_SemiSolidWire=(R=127,G=255,B=0,A=0)
C_NonSolidWire=(R=63,G=192,B=32,A=0)
C_WireGridAxis=(R=119,G=119,B=119,A=0)
C_ActorArrow=(R=163,G=0,B=0,A=0)
C_ScaleBox=(R=151,G=67,B=11,A=0)
C_ScaleBoxHi=(R=223,G=149,B=157,A=0)
C_Mover=(R=255,G=0,B=255,A=0)
C_OrthoBackground=(R=163,G=163,B=163,A=0)
C_Current=(R=0,G=0,B=0,A=0)
C_BrushVertex=(R=0,G=0,B=0,A=0)
C_BrushSnap=(R=0,G=0,B=0,A=0)
C_Black=(R=0,G=0,B=0,A=0)
C_Mask=(R=0,G=0,B=0,A=0)
C_WireBackground=(R=0,G=0,B=0,A=0)
C_ZoneWire=(R=0,G=0,B=0,A=0)
EditPackages=Core
EditPackages=Engine
EditPackages=Editor
EditPackages=Fire
EditPackages=IpDrv
EditPackages=Extension
EditPackages=DeusExUI
EditPackages=ConSys
EditPackages=DeusExConversations
EditPackages=DeusExSounds
EditPackages=DeusExItems
EditPackages=DeusExDeco
EditPackages=DeusExCharacters
EditPackages=DeusExText
EditPackages=DeusEx
EditPackages=IpServer

[DeusEx.DeusExGameInfo]
bNoMonsters=False
bHumansOnly=False
bCoopWeaponMode=False
bClassicDeathmessages=False

[Engine.GameInfo]
bLowGore=False

[Engine.DemoRecDriver]
DemoSpectatorClass=UnrealShare.UnrealSpectator
MaxClientRate=25000
ConnectionTimeout=15.0
InitialConnectTimeout=500.0
AckTimeout=1.0
KeepAliveTime=1.0
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=60
LanServerMaxTickRate=60

[DeusEx.MenuScreenJoinGame]
MasterServerAddress=master0.gamespy.com

[Engine.GameReplicationInfo]
ServerName=
ShortName=

[IpServer.UdpBeacon]
BeaconProduct=DeusEx
&lt;/uscript&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2791</id>
      <timestamp>2005-02-17T14:10:10Z</timestamp>
      <contributor>
        <ip>OlympusMons</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is Deus Ex's [[Legacy:Game Ini File|Game Ini File]] file.

&lt;uscript&gt;
[URL]
Protocol=deusex
ProtocolDescription=Deus Ex Protocol
Name=Player
Map=Index.dx
LocalMap=DX.dx
Host=
Portal=
MapExt=dx                                     // file extension for map files
SaveExt=dxs                                   // file extension for save files
Port=7790
Class=DeusEx.JCDentonMale                     // class to use for the player

[FirstRun]
FirstRun=1100

[Engine.Engine]
GameRenderDevice=GlideDrv.GlideRenderDevice
AudioDevice=Galaxy.GalaxyAudioSubsystem
NetworkDevice=IpDrv.TcpNetDriver
DemoRecordingDevice=Engine.DemoRecDriver
Console=Engine.Console
Language=int
GameEngine=DeusEx.DeusExGameEngine
EditorEngine=Editor.EditorEngine
WindowedRenderDevice=SoftDrv.SoftwareRenderDevice
RenderDevice=GlideDrv.GlideRenderDevice
DefaultGame=DeusEx.DeusExGameInfo
DefaultServerGame=DeusEx.DeathMatchGame
ViewportManager=WinDrv.WindowsClient
Render=Render.Render
Input=Extension.InputExt
Canvas=Engine.Canvas
Root=DeusEx.DeusExRootWindow
CdPath=D:\DeusEx

[Core.System]
PurgeCacheDays=30
SavePath=..\Save
CachePath=..\Cache
CacheExt=.uxx
Paths=..\System\*.u
Paths=..\Maps\*.dx
Paths=..\Textures\*.utx
Paths=..\Sounds\*.uax
Paths=..\Music\*.umx
Suppress=DevLoad
Suppress=DevSave
Suppress=DevNetTraffic
Suppress=DevGarbage
Suppress=DevKill
Suppress=DevReplace
Suppress=DevSound
Suppress=DevCompile
Suppress=DevBind
Suppress=DevBsp

[DeusEx.DeusExGameEngine]
CacheSizeMegs=4
UseSound=True
ServerActors=IpDrv.UdpBeacon
ServerActors=IpServer.UdpServerQuery
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.fragaholic.com MasterServerPort=27900

// epicgames.com and fragaholic.com both are unused anymore, can be removed to reduce log warnings.

[WinDrv.WindowsClient]
WindowedViewportX=640
WindowedViewportY=480
WindowedColorBits=16
FullscreenViewportX=640
FullscreenViewportY=480
FullscreenColorBits=16
Brightness=0.600000
MipFactor=1.000000
UseDirectDraw=True
UseJoystick=False
CaptureMouse=True
StartupFullscreen=True
CurvedSurfaces=False
ScreenFlashes=True
NoLighting=False
SlowVideoBuffering=False
DeadZoneXYZ=True
DeadZoneRUV=False
InvertVertical=False
ScaleXYZ=1000.000000
ScaleRUV=2000.000000
SkinDetail=High
TextureDetail=High
Decals=True
MinDesiredFrameRate=1.0

[Engine.Player]
ConfiguredInternetSpeed=2600
ConfiguredLanSpeed=20000

[Galaxy.GalaxyAudioSubsystem]
UseDirectSound=True
UseFilter=True
UseSurround=False
UseStereo=True
UseCDMusic=False
UseDigitalMusic=True
UseSpatial=False
UseReverb=True
Use3dHardware=False
LowSoundQuality=False
ReverseStereo=False
Latency=40
OutputRate=44100Hz
EffectsChannels=16
DopplerSpeed=6500.000000
MusicVolume=153
SoundVolume=204
SpeechVolume=255
AmbientFactor=0.700000

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=500.0
AckTimeout=1.0
KeepAliveTime=1.0
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=20
LanServerMaxTickRate=35
StaticUpdateRate=12
DynamicUpdateRate=40

// Some suggest values: 

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.000000
InitialConnectTimeout=30.000000
AckTimeout=1.0
KeepAliveTime=0.500000
MaxClientRate=20000
SimLatency=0
RelevantTimeout=4.000000
SpawnPrioritySeconds=1.000000
ServerTravelPause=4.000000
NetServerMaxTickRate=20
LanServerMaxTickRate=20
StaticUpdateRate=12
DynamicUpdateRate=40

[IpDrv.TcpipConnection]
SimPacketLoss=0
SimLatency=0

[IpServer.UdpServerQuery]
GameName=deusex

[IpDrv.UdpBeacon]
DoBeacon=True
BeaconTime=0.50
BeaconTimeout=5.0
BeaconPort=7776
BeaconProduct=DeusEx

[SoftDrv.SoftwareRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=False
Coronas=False
HighDetailActors=True
HighResTextureSmooth=True
LowResTextureSmooth=False
FastTranslucency=True

[GlideDrv.GlideRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailBias=-1.500000
RefreshRate=100Hz
DetailTextures=True
FastUglyRefresh=False
ScreenSmoothing=True
Resolution=Default

[MetalDrv.MetalRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailTextures=True

[OpenGLDrv.OpenGLRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
DetailTextures=True
UseTNT=1
MinDepthBits=16
MaxLogUOverV=8
MaxLogVOverU=8
UseMultiTexture=1
UsePalette=1
UseAlphaPalette=0
ShareLists=0
AlwaysMipmap=0
DoPrecache=0
UseTrilinear=False
MaxAnisotropy=0
SupportsLazyTextures=0

[D3DDrv.D3DRenderDevice]
Translucency=True
VolumetricLighting=True
ShinySurfaces=True
Coronas=True
HighDetailActors=True
UseMipmapping=True
UseTrilinear=False
UseMultitexture=True
UsePageFlipping=True
UsePalettes=True
UseFullscreen=True
UseGammaCorrection=True
DetailTextures=True
Use3dfx=False
UseTripleBuffering=True
UsePrecache=False
Use32BitTextures=False

[SglDrv.SglRenderDevice]
Translucency=True
VolumetricLighting=False
ShinySurfaces=False
Coronas=True
HighDetailActors=False
ColorDepth=16
DetailTextures=False
FastUglyRefresh=False
TextureDetailBias=Near
VertexLighting=False

[Editor.EditorEngine]
UseSound=True
CacheSizeMegs=6
GridEnabled=True
SnapVertices=True
SnapDistance=10.000000
GridSize=(X=16.000000,Y=16.000000,Z=16.000000)
RotGridEnabled=True
RotGridSize=(Pitch=1024,Yaw=1024,Roll=1024)
GameCommandLine=-log
FovAngleDegrees=90.000000
GodMode=True
AutoSave=False
AutoSaveTimeMinutes=5
AutoSaveIndex=6
C_WorldBox=(R=0,G=0,B=107,A=0)
C_GroundPlane=(R=0,G=0,B=63,A=0)
C_GroundHighlight=(R=0,G=0,B=127,A=0)
C_BrushWire=(R=255,G=63,B=63,A=0)
C_Pivot=(R=0,G=255,B=0,A=0)
C_Select=(R=0,G=0,B=127,A=0)
C_AddWire=(R=127,G=127,B=255,A=0)
C_SubtractWire=(R=255,G=192,B=63,A=0)
C_GreyWire=(R=163,G=163,B=163,A=0)
C_Invalid=(R=163,G=163,B=163,A=0)
C_ActorWire=(R=127,G=63,B=0,A=0)
C_ActorHiWire=(R=255,G=127,B=0,A=0)
C_White=(R=255,G=255,B=255,A=0)
C_SemiSolidWire=(R=127,G=255,B=0,A=0)
C_NonSolidWire=(R=63,G=192,B=32,A=0)
C_WireGridAxis=(R=119,G=119,B=119,A=0)
C_ActorArrow=(R=163,G=0,B=0,A=0)
C_ScaleBox=(R=151,G=67,B=11,A=0)
C_ScaleBoxHi=(R=223,G=149,B=157,A=0)
C_Mover=(R=255,G=0,B=255,A=0)
C_OrthoBackground=(R=163,G=163,B=163,A=0)
C_Current=(R=0,G=0,B=0,A=0)
C_BrushVertex=(R=0,G=0,B=0,A=0)
C_BrushSnap=(R=0,G=0,B=0,A=0)
C_Black=(R=0,G=0,B=0,A=0)
C_Mask=(R=0,G=0,B=0,A=0)
C_WireBackground=(R=0,G=0,B=0,A=0)
C_ZoneWire=(R=0,G=0,B=0,A=0)
EditPackages=Core
EditPackages=Engine
EditPackages=Editor
EditPackages=Fire
EditPackages=IpDrv
EditPackages=Extension
EditPackages=DeusExUI
EditPackages=ConSys
EditPackages=DeusExConversations
EditPackages=DeusExSounds
EditPackages=DeusExItems
EditPackages=DeusExDeco
EditPackages=DeusExCharacters
EditPackages=DeusExText
EditPackages=DeusEx
EditPackages=IpServer

[DeusEx.DeusExGameInfo]
bNoMonsters=False
bHumansOnly=False
bCoopWeaponMode=False
bClassicDeathmessages=False

[Engine.GameInfo]
bLowGore=False

[Engine.DemoRecDriver]
DemoSpectatorClass=UnrealShare.UnrealSpectator
MaxClientRate=25000
ConnectionTimeout=15.0
InitialConnectTimeout=500.0
AckTimeout=1.0
KeepAliveTime=1.0
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=60
LanServerMaxTickRate=60

[DeusEx.MenuScreenJoinGame]
MasterServerAddress=master0.gamespy.com

[Engine.GameReplicationInfo]
ServerName=
ShortName=

[IpServer.UdpBeacon]
BeaconProduct=DeusEx
&lt;/uscript&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeusExPlayer (DX)</title>
    <id>1047</id>
    <revision>
      <id>2792</id>
      <timestamp>2006-11-29T02:35:53Z</timestamp>
      <contributor>
        <ip>Daffodilistic</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Pawn (DX)|Pawn (DX)]] &gt;&gt; [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]] &gt;&gt; [[Legacy:PlayerPawnExt (DX)|PlayerPawnExt (DX)]] &gt;&gt; [[Legacy:DeusExPlayer (DX)|DeusExPlayer (DX)]]}}

DeusExPlayer.

==Constants==
; MPFLAG_FirstSpot = 0x01 : 
; mpMsgDelay = 4.0 : 
; MPMSG_CameraInv = 7 : 
; MPMSG_CloseKills = 8 : 
; MPMSG_DropItem = 11 : 
; MPMSG_FirstBurn = 5 : 
; MPMSG_FirstPoison = 4 : 
; MPMSG_KilledTeammate = 12 : 
; MPMSG_LostLegs = 10 : 
; MPMSG_NoCloakWeapon = 15 : 
; MPMSG_TeamComputer = 14 : 
; MPMSG_TeamHackTurret = 16 : 
; MPMSG_TeamHit = 2 : 
; MPMSG_TeamLAM = 13 : 
; MPMSG_TeamNsf = 1 : 
; MPMSG_TeamSpot = 3 : 
; MPMSG_TeamUnatco = 0 : 
; MPMSG_TimeNearEnd = 9 : 
; MPMSG_TurretInv = 6 : 
; MPSERVERFLAG_CameraInv = 0x08 : 
; MPSERVERFLAG_DropItem = 0x20 : 
; MPSERVERFLAG_FirstBurn = 0x02 : 
; MPSERVERFLAG_FirstPoison = 0x01 : 
; MPSERVERFLAG_LostLegs = 0x10 : 
; MPSERVERFLAG_NoCloakWeapon = 0x40 : 
; MPSERVERFLAG_TurretInv = 0x04 : 
; NintendoDelay = 6.0 : 

==Properties==
; Computers ActiveComputer : 
; String AddedNanoKey : 
; SpyDrone aDrone : 
; AugmentationManager AugmentationSystem : Augmentation system vars
; Name AugPrefs[9] : 
; bool bAlwaysRun : 
; bool bAmmoDisplayVisible : 
; BarkManager barkManager : 
; bool bAskedToTrain : 
; bool bAugDisplayVisible : 
; bool bAutoReload : 
; bool bBuySkills : 
; bool bCompassVisible : 
; bool bConfirmNoteDeletes : 
; bool bConfirmSaveDeletes : 
; bool bCrosshairVisible : 
; bool bDisplayAllGoals : 
; bool bDisplayAmmoByClip : 
; bool bDisplayCompletedGoals : 
; bool bHelpMessages : 
; bool bHitDisplayVisible : 
; Bool bHUDBackgroundTranslucent : 
; Bool bHUDBordersTranslucent : 
; Bool bHUDBordersVisible : 
; bool bHUDShowAllAugs : 
; Bool bIgnoreNextShowMenu : 
; bool bKillerProfile : 
; float BleedRate : 
; Bool bMenusTranslucent : 
; bool bNintendoImmunity : 
; bool bNPCHighlighting : 
; bool bObjectBeltVisible : 
; bool bObjectNames : 
; bool bQuotesEnabled : 
; Bool bSavingSkillsAugs : 
; bool bShowAmmoDescriptions : 
; bool bSpyDroneActive : 
; Bool bStartingNewGame : 
; Bool bStartNewGameAfterIntro : 
; bool bSubtitles : 
; bool bToggleCrouch : 
; bool bToggleWalk : toggle walk
; String BurnString : 
; bool bWarrenEMPField : 
; String CanCarryOnlyOne : 
; String CannotDropHere : 
; String CannotLift : 
; float ClotPeriod : 
; Float CombatDifficulty : Combat Difficulty, set only at new game time
; Actor ConversationActor : 
; int Credits : Credits (money) the player has
; ShieldEffect DamageShield : 
; float DropCounter : 
; float drugEffectTimer : 
; GameInfo DXGame : 
; float Energy : Energy the player has
; String EnergyDepleted : 
; float EnergyDrain : amount of energy left to drain
; float EnergyDrainTotal : total amount of energy to drain
; float EnergyMax : Maximum energy [?]
; DataVaultImage FirstImage : Data Vault Image linked list start
; float FlashTimer : 
; name FloorMaterial : 
; DebugInfo GlobalDebugObj : 
; String GoalAdded : 
; String HandsFull : 
; String HeadString : 
; String HealedPointLabel : 
; String HealedPointsLabel : 
; String HUDThemeName : 
; String InventoryFull : 
; InvulnSphere invulnSph : 
; float JoltMagnitude : 
; KillerProfile killProfile : 
; Actor lastFirstPersonConvoActor : 
; float lastFirstPersonConvoTime : 
; float LastRefreshTime : HUD Refresh timer
; Actor lastThirdPersonConvoActor : 
; float lastThirdPersonConvoTime : 
; String LegsString : 
; float logTimeout : 
; byte maxLogLines : 
; float MaxRegenPoint : in multiplayer, the highest that auto regen will take you
; String MenuThemeName : 
; float MPDamageMult : 
; int mpMsgCode : 
; int mpMsgFlags : 
; int mpMsgOptionalParam : 
; String mpMsgOptionalString : 
; int mpMsgServerFlags : 
; float mpMsgTime : 
; float musicChangeTimer : 
; float musicCheckTimer : 
; EMusicMode musicMode : 
; Pawn myBurner : 
; Actor myKiller : 
; Pawn myPoisoner : 
; Actor myProjKiller : 
; Actor myTurretKiller : 
; String NextMap : 
; float NintendoImmunityTime : 
; float NintendoImmunityTimeLeft : 
; String NoneString : 
; String NoRoomToLift : 
; String NoteAdded : 
; int PlayerSkin : Skin assigned to PC by player on the Character Generation screen.
; int poisonCounter : 
; int poisonDamage : 
; String PoisonString : 
; float poisonTimer : 
; String PrimaryGoalCompleted : 
; String QuickSaveGameTitle : 
; float RegenRate : the number of points healed per second in mp
; float RunSilentValue : communicate run silent value in multiplayer
; int saveCount : 
; byte savedSection : 
; Float saveTime : 
; String SecondaryGoalCompleted : 
; float ServerTimeDiff : 
; float ServerTimeLastRefresh : 
; EShieldStatus ShieldStatus : 
; float ShieldTimer : 
; int SkillPointsAvail : Available skill points
; String SkillPointsAward : 
; int SkillPointsTotal : Total skill points
; SkillManager SkillSystem : Reference to a Skill Manager [?]
; int spyDroneLevel : 
; float spyDroneLevelValue : 
; String strStartMap : 
; float swimBubbleTimer : 
; float swimDuration : 
; float swimTimer : 
; String TakenOverString : 
; ColorThemeManager ThemeManager : 
; String TooHeavyToLift : 
; String TooMuchAmmo : 
; String TorsoString : 
; byte translucencyLevel : 
; String TruePlayerName : Name assigned to PC by player on the Character Generation screen.
; int UIBackground : 
; Actor ViewModelActor[8] : Used by viewmodel
; name WallMaterial : 
; Vector WallNormal : 
; int WarrenSlot : 
; float WarrenTimer : 
; String WeaponUnCloak : 
; String WithString : 
; String WithTheString : 

===_Conversation System===
; ConHistory conHistory : Conversation History
; ConPlay conPlay : Conversation
; DataLinkPlay dataLinkPlay : Used for DataLinks

===_Frob===
; Actor FrobTarget : Actor being, or to be frobbed
; float FrobTime : Elapsed duration of frob [?]
; float MaxFrobDistance : Maximum frob distance [?]

===_Goal Tracking===
; DeusExGoal FirstGoal : First goal [?] ''start of list?''
; DeusExGoal LastGoal : Last goal [?] ''end of list?''

===_Inventory System===
; bool bBeltIsMPInventory : DEUS_EX AMSD  Whether to ignore inv slots in multiplayer
; bool bInHandTransition : The inHand is being swapped out
; Inventory ClientinHandPending : Client temporary inhand pending, for mousewheel use.
; Inventory inHand : The current object in hand
; Inventory inHandPending : The pending item waiting to be put in hand
; byte invSlots[30] : 5x6 grid of inventory slots
; Inventory LastinHand : Last object inhand, so we can detect inhand changes on the client.
; int maxInvCols : Maximum number of inventory columns
; int maxInvRows : Maximum number of inventory rows

===_Keyring===
; NanoKeyInfo KeyList : List of Keys
; NanoKeyRing KeyRing : Inventory Item

===_Leaning===
; bool bCanLean : 
; float curLeanDist : 
; float prevLeanDist : 

===_Log Messages===
; DeusExLog FirstLog : First log message (linked list start)
; DeusExLog LastLog : Last log message (linked list end)

===_Multiplayer Option Propagation===
; bool bFirstOptionsSynced : DEUS_EX AMSD For multiplayer option propagation UGH! In most cases options will sync on their own.  But for initial loadout based on options, we need to send them to the server.  Easiest thing to do is have a function at startup that sends that info.
; bool bSecondOptionsSynced : 

===_Note Tracking===
; DeusExNote FirstNote : First note (start of linked list)
; DeusExNote LastNote : Last note (end of linked list)

===_While Crouching===
; bool bCrouchOn : used by toggle crouch
; bool bForceDuck : Force duck
; bool bWasCrouchOn : used by toggle crouch
; byte lastbDuck : used by toggle crouch

==Enums==

===EInvokeMethod===

; IM_Bump :
; IM_Frob :
; IM_Sight :
; IM_Radius :
; IM_Named :
; IM_Other :

===EMusicMode===

; MUS_Ambient :
; MUS_Combat :
; MUS_Conversation :
; MUS_Outro :
; MUS_Dying :

===EShieldStatus===

; SS_Off :
; SS_Fade :
; SS_Strong :

==Functions==
;  AbortConversation( optional bool bNoPlayedFlag ): 
;  ActivateAllAugs( ): 
;  ActivateAugmentation( int num ): 
;  ActivateBelt( int objectNum ): 
;  ActivateKeypadWindow( Keypad KPad , bool bHacked ): 
;  AddAugmentationDisplay( Augmentation aug ): 
;  AddChargedDisplay( ChargedPickup item ): 
;  AddDamageDisplay( name damageType , vector hitOffset ): 
; DeusExGoal AddGoal( Name goalName , bool bPrimaryGoal ): 
; bool AddImage( DataVaultImage newImage ): 
; bool AddInventory( inventory item ): 
; DeusExLog AddLog( String logText ): 
; DeusExNote AddNote( optional String strNote , optional Bool bUserNote , optional bool bShowInLog ): 
;  AddObjectToBelt( Inventory item , int pos , bool bOverride ): 
;  AllAugs( ): CHEAT - gives player all augs
;  AllCredits( ): CHEAT - gives player max credits
;  AllEnergy( ): CHEAT - gives player max energy
;  AllHealth( ): CHEAT - gives player max health
;  AllImages( ): CHEAT/DEBUG - gives player all images
;  AllSkillPoints( ): CHEAT - gives player max skill points
;  AllSkills( ): CHEAT - gives player max skills
;  AllWeapons( ): CHEAT - gives player (or spawns?) all weapons
;  AugAdd( class&lt;Augmentation&gt; aWantedAug ): 
;  BeginState( ): 
;  Bleed( float deltaTime ): 
;  BuySkills( ): 
;  BuySkillSound( int code ): 
; float CalculatePlayerVisibility( ScriptedPawn P ): 
; int CalculateSkillHealAmount( int baseHealPoints ): 
; bool CanActorSeePlayer( Actor invokeActor ): 
; bool CanBeLifted( Decoration deco ): 
; bool CanStartConversation( ): 
;  CatchFire( Pawn burner ): 
; int ChargePlayer( int baseChargePoints ): 
;  CheckActiveConversationRadius( ): 
; bool CheckActorDistances( ): 
; bool CheckConversationHeightDifference( Actor invokeActor , int heightOffset ): 
; bool CheckConversationInvokeRadius( Actor invokeActor , Conversation con ): 
; bool CheckFlagRefs( ConFlagRef flagRef ): 
;  ClearAugmentationDisplay( ): 
;  ClearBelt( ): 
;  ClearInventorySlots( ): 
;  ClearLog( ): 
;  ClearPosition( int pos ): 
;  ClientDeath( ): 
;  ClientFlash( float scale , vector fog ): 
;  ClientPlayAnimation( Actor src , Name anim , float rate , bool bLoop ): 
;  ClientPossessed( ): 
;  ClientSpawnHits( bool bPenetrating , bool bHandToHand , Vector HitLocation , Vector HitNormal , Actor Other , float Damage ): 
;  ClientSpawnProjectile( class&lt;projectile&gt; ProjClass , Actor owner , Vector Start , Rotator AdjustedAim ): 
;  ClientTurnOffScores( ): 
;  CloseComputerScreen( Computers computerToClose ): 
;  CloseThisComputer( Computers comp ): 
;  ConBindEvents( ): 
;  CreateColorThemeManager( ): 
; DataVaultImageNote CreateDataVaultImageNoteObject( ): 
;  CreateDrone( ): 
; DumpLocation CreateDumpLocationObject( ): 
; GameDirectory CreateGameDirectoryObject( ): 
; ConHistoryEvent CreateHistoryEvent( ): 
; ConHistory CreateHistoryObject( ): 
;  CreateKeyRing( ): 
;  CreateKillerProfile( Pawn killer , int damage , name damageType , String bodyPart ): 
; DeusExLog CreateLogObject( ): 
; NanoKeyInfo CreateNanoKeyInfo( ): 
;  CreatePlayerTracker( ): 
;  CreateShadow( ): 
;  DamageAll( optional int amount ): 
;  DamagePart( int partIndex , optional int amount ): 
;  DeactivateAllAugs( ): 
;  DebugCommand( string teststr ): 
;  DeleteAllGoals( ): 
;  DeleteAllNotes( ): 
; Bool DeleteGoal( DeusExGoal goalToDelete ): 
; bool DeleteInventory( inventory item ): 
; Bool DeleteNote( DeusExNote noteToDelete ): 
;  DeleteSaveGameFiles( optional String saveDirectory ): 
;  Died( pawn Killer , name damageType , vector HitLocation ): 
;  DisconnectPlayer( ): 
;  DoFrob( Actor Frobber , Inventory frobWith ): 
;  DoJump( optional float F ): 
;  DoneReloading( DeusExWeapon weapon ): 
;  DrawInvulnShield( ): 
;  DrawShield( ): 
;  DroneExplode( ): 
;  DropDecoration( ): 
; bool DropItem( optional Inventory inv , optional bool bDrop ): 
;  DrugEffects( float deltaTime ): 
;  DualmapF10( ): 
;  DualmapF11( ): 
;  DualmapF12( ): 
;  DualmapF3( ): 
;  DualmapF4( ): 
;  DualmapF5( ): 
;  DualmapF6( ): 
;  DualmapF7( ): 
;  DualmapF8( ): 
;  DualmapF9( ): 
;  DumpInventoryGrid( ): 
;  DXDumpInfo( ): 
; bool DXReduceDamage( int Damage , name damageType , vector hitLocation , out int adjustedDamage , bool bCheckOnly ): 
;  EditFlags( ): 
;  EndConversation( ): 
;  EndState( ): 
;  ExtinguishFire( ): 
;  FailConsoleCheck( ): 
;  FailRootWindowCheck( ): 
; DeusExGoal FindGoal( Name goalName ): 
; Bool FindInventorySlot( Inventory anItem , optional Bool bSearchOnly ): 
; Bool FindInventorySlotXY( int invSlotsX , int invSlotsY , out int newSlotX , out int newSlotY ): 
;  Fire( optional float F ): 
;  Fly( ): 
;  ForceDisconnect( string Message ): 
;  ForceDroneOff( ): 
;  GenerateTotalHealth( ): 
; Conversation GetActiveConversation( Actor invokeActor , EInvokeMethod invokeMethod ): 
; Conversation GetActiveDataLink( String datalinkName ): 
; int GetAugPriority( Augmentation AugToCheck ): 
; float GetCurrentGroundSpeed( ): 
;  GetDebug( name cmd ): 
; float GetDefaultCollisionHeight( ): 
; string GetDeusExVersion( ): 
; String GetDisplayName( Actor actor , optional Bool bUseFamiliar ): 
; name GetFloorMaterial( ): 
; bool GetHUDBackgroundTranslucency( ): 
; bool GetHUDBordersVisible( ): 
; bool GetHUDBorderTranslucency( ): 
; DeusExLevelInfo GetLevelInfo( ): 
; Float GetLogTimeout( ): 
; Byte GetMaxLogLines( ): 
; bool GetMenuTranslucency( ): 
; int GetMPHitLocation( Vector HitLocation ): 
; DeusExNote GetNote( Name textTag ): 
;  GetSkillInfoFromProj( DeusExPlayer killer , Actor proj ): 
; name GetWallMaterial( out vector wallNormal ): 
;  GetWeaponName( DeusExWeapon w , out String name ): 
; Inventory GetWeaponOrAmmo( Inventory queryItem ): 
;  Ghost( ): 
;  GiveInitialInventory( ): 
;  GiveNanoKey( Name newKeyID , String newDescription ): 
;  GoalAdd( Name goalName , String goalText , optional bool bPrimaryGoal ): 
;  GoalCompleted( Name goalName ): 
;  GoalSetPrimary( Name goalName , bool bPrimaryGoal ): 
;  GrabDecoration( ): 
;  GrantAugs( int NumAugs ): 
; bool HandleItemPickup( Actor FrobTarget , optional bool bSearchOnly ): 
;  HandleWalking( ): 
;  HealPart( out int points , out int amt ): 
; int HealPlayer( int baseHealPoints , optional Bool bUseMedicineSkill ): 
;  HighlightCenterObject( ): 
;  IAmWarren( ): 
; bool InConversation( ): 
;  IncreaseClientFlashLength( float NewFlashTime ): 
;  InitializeSubSystems( ): 
;  InvokeComputerScreen( Computers computerToActivate , float CompHackTime , float ServerLevelTime ): 
;  InvokeConWindow( ): 
;  InvokeUIScreen( Class&lt;DeusExBaseWindow&gt; windowClass ): 
; Bool IsEmptyItemSlot( Inventory anItem , int col , int row ): 
; Bool IsEmptyItemSlotXY( int invSlotsX , int invSlotsY , int col , int row ): 
; bool IsFrobbable( actor A ): 
; bool IsHighlighted( actor A ): 
; bool IsLeaning( ): 
;  KeypadRunEvents( Keypad KPad , bool bSuccess ): 
;  KeypadRunUntriggers( Keypad KPad ): 
;  KeypadToggleLocks( Keypad KPad ): 
;  KillerProfile( ): 
;  KillShadow( ): 
;  Landed( vector HitNormal ): 
;  Legend( ): 
;  LoadGame( int saveIndex ): 
;  LoadMap( ): 
;  LocalLog( String S ): 
;  LogMsg( string msg ): 
;  LoopHeadConvoAnim( ): 
;  MaintainEnergy( float deltaTime ): 
;  MakeCameraAlly( SecurityCamera camera ): 
;  MakePlayerIgnored( bool bNewIgnore ): 
;  Matrix( ): 
;  MoveActor( int xPos , int yPos , int zPos ): 
;  MoveDrone( float DeltaTime , Vector loc ): 
;  MultiplayerDeathMsg( Pawn killer , bool killedSelf , bool valid , String killerName , String killerMethod ): 
;  MultiplayerNotifyMsg( int code , optional int param , optional string str ): 
;  MultiplayerTick( float DeltaTime ): 
;  NewMultiplayerMatch( ): 
;  NextBeltItem( ): 
;  NextHUDColorTheme( ): 
;  NextMenuColorTheme( ): 
;  NintendoImmunityEffect( bool on ): 
;  NoteAdd( String noteText , optional bool bUserNote ): 
;  OpenSesame( ): 
;  ParseLeftClick( ): 
;  ParseRightClick( ): 
;  PickupNanoKey( NanoKey newKey ): 
;  PlaceItemInSlot( Inventory anItem , int col , int row ): 
;  PlayBodyThud( ): 
;  PlayDeathHit( float Damage , vector HitLocation , name damageType , vector Momentum ): 
;  PlayDXTakeDamageHit( float Damage , vector HitLocation , name damageType , vector Momentum , bool DamageReduced ): 
;  PlayerCalcView( out actor ViewActor , out vector CameraLocation , out rotator CameraRotation ): 
; bool PlayerIsClient( ): 
; bool PlayerIsListenClient( ): 
; bool PlayerIsRemoteClient( ): 
;  PlayFootStep( ): 
;  PlayHit( float Damage , vector HitLocation , name damageType , vector Momentum ): 
;  PlayMusic( String musicToPlay , optional int sectionToPlay ): 
;  PlayMusicWindow( ): 
;  PlayPickupAnim( Vector locPickup ): 
;  PopHealth( float health0 , float health1 , float health2 , float health3 , float health4 , float health5 ): 
;  PostBeginPlay( ): 
;  PostIntro( ): 
;  PostNetBeginPlay( ): 
;  PostPostBeginPlay( ): 
;  PreTravel( ): 
;  PrevBeltItem( ): 
;  ProcessMove( float DeltaTime , vector newAccel , eDodgeDir DodgeMove , rotator DeltaRot ): 
;  PunishDetection( int DamageAmount ): 
;  PutCarriedDecorationInHand( ): 
;  PutInHand( optional Inventory inv ): 
;  QuickLoad( ): 
;  QuickLoadConfirmed( ): 
;  QuickSave( ): 
;  ReceiveFirstOptionSync( Name PrefZero , Name PrefOne , Name PrefTwo , Name PrefThree , Name PrefFour ): 
;  ReceiveSecondOptionSync( Name PrefFive , Name PrefSix , Name PrefSeven , Name PrefEight ): 
;  RefreshChargedPickups( ): 
;  RefreshSystems( float DeltaTime ): 
;  Reloading( DeusExWeapon weapon , float reloadTime ): 
;  ReloadWeapon( ): 
;  RemoveAugmentationDisplay( Augmentation aug ): 
;  RemoveChargedDisplay( ChargedPickup item ): 
;  RemoveInventoryType( Class&lt;Inventory&gt; removeType ): 
;  RemoveItemDuringConversation( Inventory item ): 
;  RemoveItemFromSlot( Inventory anItem ): 
;  RemoveNanoKey( Name KeyToRemove ): 
;  RemoveObjectFromBelt( Inventory item ): 
;  RepairInventory( ): 
; bool ResetBasedPawnSize( ): 
;  ResetConversationHistory( ): 
;  ResetGoals( ): 
;  ResetPlayer( optional bool bTraining ): 
;  ResetPlayerToDefaults( ): 
;  RestartLevel( ): 
;  RestoreAllHealth( ): 
;  RestoreScopeView( ): 
;  RestoreSkillPoints( ): 
; bool RestrictInput( ): 
;  ResumeDataLinks( ): 
;  SaveGame( int saveIndex , optional String saveDesc ): 
;  SaveSkillPoints( ): 
;  ServerConditionalNotifyMsg( int code , optional int param , optional string str ): 
;  ServerSetAutoReload( bool bAuto ): 
;  ServerUpdateLean( Vector desiredLoc ): 
; bool SetBasedPawnSize( float newRadius , float newHeight ): 
; name SetBoolFlagFromString( String flagNameString , bool bValue ): 
;  SetComputerHackTime( Computers computerToSet , float HackTime , float ClientLevelTime ): 
;  SetDamagePercent( float percent ): 
;  SetDebug( name cmd , name val ): 
;  SetHUDBackgroundTranslucency( bool bNewTranslucency ): 
;  SetHUDBordersVisible( bool bVisible ): 
;  SetHUDBorderTranslucency( bool bNewTranslucency ): 
;  SetInHand( Inventory newInHand ): 
;  SetInHandPending( Inventory newInHandPending ): 
;  SetInvSlots( Inventory anItem , int newValue ): 
;  SetLogTimeout( Float newLogTimeout ): 
;  SetMaxLogLines( Byte newLogLines ): 
;  SetMenuTranslucency( bool bNewTranslucency ): 
;  SetServerTimeDiff( float sTime ): 
;  SetState( name state ): 
;  SetTurretState( AutoTurret turret , bool bActive , bool bDisabled ): 
;  SetTurretTrackMode( ComputerSecurity computer , AutoTurret turret , bool bTrackPlayers , bool bTrackPawns ): 
;  ShowAcceleration( bool bShow ): 
;  ShowArea( bool bShow ): 
;  ShowAugmentationAddWindow( ): 
;  ShowAugmentationsWindow( ): 
;  ShowBase( bool bShow ): 
;  ShowBindName( bool bShow ): 
;  ShowClass( Class&lt;Actor&gt; newClass ): 
;  ShowConversationsWindow( ): 
;  ShowCredits( optional bool bLoadIntro ): 
;  ShowCylinder( bool bShow ): 
;  ShowData( bool bShow ): 
;  ShowDemoSplash( ): 
;  ShowDist( bool bShow ): 
;  ShowEnemy( bool bShow ): 
;  ShowEnemyResponse( bool bShow ): 
;  ShowER( bool bShow ): 
;  ShowEyes( bool bShow ): 
;  ShowGoalsWindow( ): 
;  ShowHealth( bool bShow ): 
;  ShowHealthWindow( ): 
;  ShowHud( bool bShow ): 
;  ShowImagesWindow( ): 
;  ShowInstigator( bool bShow ): 
;  ShowIntro( optional bool bStartNewGame ): 
;  ShowInventoryWindow( ): 
;  ShowLight( bool bShow ): 
;  ShowLogsWindow( ): 
;  ShowLOS( bool bShow ): 
;  ShowMainMenu( ): 
;  ShowMass( bool bShow ): 
;  ShowMesh( bool bShow ): 
;  ShowMultiplayerWin( String winnerName , int winningTeam , String Killer , String Killee , String Method ): 
;  ShowPhysics( bool bShow ): 
;  ShowPlayerPawnList( ): 
;  ShowPos( bool bShow ): 
;  ShowProgress( ): 
;  ShowQuotesWindow( ): 
;  ShowRGBDialog( ): 
;  ShowScores( ): 
;  ShowSkillsWindow( ): 
;  ShowState( bool bShow ): 
;  ShowVelocity( bool bShow ): 
;  ShowVisibility( bool bShow ): 
;  ShowZone( bool bShow ): 
;  SkillPointsAdd( int numPoints ): 
;  SpawnBlood( Vector HitLocation , float Damage ): 
; Carcass SpawnCarcass( ): 
;  SpawnEMPSparks( Actor empActor , Rotator rot ): 
;  SpawnMass( Name ClassName , optional int TotalCount ): 
; bool StartAIBarkConversation( Actor conOwner , EBarkModes barkMode ): 
; bool StartConversation( Actor invokeActor , EInvokeMethod invokeMethod , optional Conversation con , optional bool bAvoidState , optional bool bForcePlay ): 
; bool StartConversationByName( Name conName , Actor conOwner , optional bool bAvoidState , optional bool bForcePlay ): 
; Bool StartDataLinkTransmission( String datalinkName , Optional DataLinkTrigger datalinkTrigger ): 
;  StartListenGame( string options ): 
;  StartMultiplayerGame( string command ): 
;  StartNewGame( String startMap ): 
;  StartPoison( Pawn poisoner , int Damage ): 
;  StartTrainingMission( ): 
;  StopPoison( ): 
;  Summon( string ClassName ): 
;  SupportActor( Actor standingActor ): 
;  SwitchAmmo( ): 
;  TakeDamage( int Damage , Pawn instigatedBy , Vector hitlocation , Vector momentum , name damageType ): 
;  Tantalus( ): 
;  TeamSay( string Msg ): 
;  Timer( ): 
;  ToggleAmmoDisplay( ): 
;  ToggleAugDisplay( ): 
;  ToggleCameraState( SecurityCamera cam , ElectronicDevices compOwner ): 
;  ToggleCompass( ): 
;  ToggleCrosshair( ): 
;  ToggleHitDisplay( ): 
;  ToggleLaser( ): 
;  ToggleObjectBelt( ): 
;  ToggleScope( ): 
;  ToggleWalk( ): 
;  ToggleWinFrames( ): 
;  ToggleWinStats( ): 
;  Trig( name ev ): 
;  UnloadTexture( Texture texture ): 
;  UnTrig( name ev ): 
;  UpdateAmmoBeltText( Ammo ammo ): 
;  UpdateAugmentationDisplayStatus( Augmentation aug ): 
;  UpdateBeltText( Inventory item ): 
;  UpdateCameraRotation( SecurityCamera camera , Rotator rot ): 
;  UpdateCarcassEvent( ): 
;  UpdateDynamicMusic( float deltaTime ): 
;  UpdateInHand( ): 
;  UpdatePlayerSkin( ): 
;  UpdatePoison( float deltaTime ): 
;  UpdateTimePlayed( float deltaTime ): 
;  UpdateTranslucency( float DeltaTime ): 
;  UpdateWarrenEMPField( float deltaTime ): 
; bool UsingChargedPickup( class&lt;ChargedPickup&gt; itemclass ): 
;  VerifyConsole( Class&lt;Console&gt; ConsoleClass ): Verifies that console is Engine.Console.  If you want something different, override this in a subclassed player class.
;  VerifyRootWindow( Class&lt;DeusExRootWindow&gt; WindowClass ): Verifies that the root window is the right kind of root window, since it can be changed in the ini
;  ViewFlash( float DeltaTime ): 
;  ViewModelAdd( int num , string ClassName ): 
;  ViewModelBlendPlay( int num , name anim , optional float fps , optional int slot ): 
;  ViewModelBlendStop( int num ): 
;  ViewModelDestroy( int num ): 
;  ViewModelGiveWeapon( int num , string weaponClass ): 
;  ViewModelLoop( int num , name anim , optional float fps ): 
;  ViewModelPlay( int num , name anim , optional float fps ): 
;  VMA( int num , string ClassName ): 
;  VMBP( int num , name anim , optional float fps , optional int slot ): 
;  VMBS( int num ): 
;  VMD( int num ): 
;  VMGW( int num , string weaponClass ): 
;  VML( int num , name anim , optional float fps ): 
;  VMP( int num , name anim , optional float fps ): 
;  Walk( ): 
;  WhereActor( optional int Me ): 
;  WinFrames( bool bFramesOn ): 
;  WinStats( bool bStatsOn ): 
;  ZoneChange( ZoneInfo NewZone ): 

==Events==
;  Destroyed( ): 
;  HeadZoneChange( ZoneInfo newHeadZone ): 
;  InterpolateEnd( Actor Other ): 
;  JoltView( float newJoltMagnitude ): 
;  PlayerCalcView( out actor ViewActor , out vector CameraLocation , out rotator CameraRotation ): 
;  PlayerInput( float DeltaTime ): 
;  PlayerTick( float deltaTime ): 
;  Possess( ): 
;  RenderOverlays( canvas Canvas ): 
;  TravelPostAccept( ): 
;  UpdateEyeHeight( float DeltaTime ): 

----

'''Xhiris:''' 12000 lines!  UGH!
[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2793</id>
      <timestamp>2006-11-26T04:03:26Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Removed Delegates heading, because there are no Delegates</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Pawn (DX)|Pawn (DX)]] &gt;&gt; [[Legacy:PlayerPawn (DX)|PlayerPawn (DX)]] &gt;&gt; [[Legacy:PlayerPawnExt (DX)|PlayerPawnExt (DX)]] &gt;&gt; [[Legacy:DeusExPlayer (DX)|DeusExPlayer (DX)]]}}

DeusExPlayer.

==Constants==
; MPFLAG_FirstSpot = 0x01 : 
; mpMsgDelay = 4.0 : 
; MPMSG_CameraInv = 7 : 
; MPMSG_CloseKills = 8 : 
; MPMSG_DropItem = 11 : 
; MPMSG_FirstBurn = 5 : 
; MPMSG_FirstPoison = 4 : 
; MPMSG_KilledTeammate = 12 : 
; MPMSG_LostLegs = 10 : 
; MPMSG_NoCloakWeapon = 15 : 
; MPMSG_TeamComputer = 14 : 
; MPMSG_TeamHackTurret = 16 : 
; MPMSG_TeamHit = 2 : 
; MPMSG_TeamLAM = 13 : 
; MPMSG_TeamNsf = 1 : 
; MPMSG_TeamSpot = 3 : 
; MPMSG_TeamUnatco = 0 : 
; MPMSG_TimeNearEnd = 9 : 
; MPMSG_TurretInv = 6 : 
; MPSERVERFLAG_CameraInv = 0x08 : 
; MPSERVERFLAG_DropItem = 0x20 : 
; MPSERVERFLAG_FirstBurn = 0x02 : 
; MPSERVERFLAG_FirstPoison = 0x01 : 
; MPSERVERFLAG_LostLegs = 0x10 : 
; MPSERVERFLAG_NoCloakWeapon = 0x40 : 
; MPSERVERFLAG_TurretInv = 0x04 : 
; NintendoDelay = 6.0 : 

==Properties==
; Computers ActiveComputer : 
; String AddedNanoKey : 
; SpyDrone aDrone : 
; AugmentationManager AugmentationSystem : Augmentation system vars
; Name AugPrefs[9] : 
; bool bAlwaysRun : 
; bool bAmmoDisplayVisible : 
; BarkManager barkManager : 
; bool bAskedToTrain : 
; bool bAugDisplayVisible : 
; bool bAutoReload : 
; bool bBuySkills : 
; bool bCompassVisible : 
; bool bConfirmNoteDeletes : 
; bool bConfirmSaveDeletes : 
; bool bCrosshairVisible : 
; bool bDisplayAllGoals : 
; bool bDisplayAmmoByClip : 
; bool bDisplayCompletedGoals : 
; bool bHelpMessages : 
; bool bHitDisplayVisible : 
; Bool bHUDBackgroundTranslucent : 
; Bool bHUDBordersTranslucent : 
; Bool bHUDBordersVisible : 
; bool bHUDShowAllAugs : 
; Bool bIgnoreNextShowMenu : 
; bool bKillerProfile : 
; float BleedRate : 
; Bool bMenusTranslucent : 
; bool bNintendoImmunity : 
; bool bNPCHighlighting : 
; bool bObjectBeltVisible : 
; bool bObjectNames : 
; bool bQuotesEnabled : 
; Bool bSavingSkillsAugs : 
; bool bShowAmmoDescriptions : 
; bool bSpyDroneActive : 
; Bool bStartingNewGame : 
; Bool bStartNewGameAfterIntro : 
; bool bSubtitles : 
; bool bToggleCrouch : 
; bool bToggleWalk : toggle walk
; String BurnString : 
; bool bWarrenEMPField : 
; String CanCarryOnlyOne : 
; String CannotDropHere : 
; String CannotLift : 
; float ClotPeriod : 
; Float CombatDifficulty : Combat Difficulty, set only at new game time
; Actor ConversationActor : 
; int Credits : Credits (money) the player has
; ShieldEffect DamageShield : 
; float DropCounter : 
; float drugEffectTimer : 
; GameInfo DXGame : 
; float Energy : Energy the player has
; String EnergyDepleted : 
; float EnergyDrain : amount of energy left to drain
; float EnergyDrainTotal : total amount of energy to drain
; float EnergyMax : Maximum energy [?]
; DataVaultImage FirstImage : Data Vault Image linked list start
; float FlashTimer : 
; name FloorMaterial : 
; DebugInfo GlobalDebugObj : 
; String GoalAdded : 
; String HandsFull : 
; String HeadString : 
; String HealedPointLabel : 
; String HealedPointsLabel : 
; String HUDThemeName : 
; String InventoryFull : 
; InvulnSphere invulnSph : 
; float JoltMagnitude : 
; KillerProfile killProfile : 
; Actor lastFirstPersonConvoActor : 
; float lastFirstPersonConvoTime : 
; float LastRefreshTime : HUD Refresh timer
; Actor lastThirdPersonConvoActor : 
; float lastThirdPersonConvoTime : 
; String LegsString : 
; float logTimeout : 
; byte maxLogLines : 
; float MaxRegenPoint : in multiplayer, the highest that auto regen will take you
; String MenuThemeName : 
; float MPDamageMult : 
; int mpMsgCode : 
; int mpMsgFlags : 
; int mpMsgOptionalParam : 
; String mpMsgOptionalString : 
; int mpMsgServerFlags : 
; float mpMsgTime : 
; float musicChangeTimer : 
; float musicCheckTimer : 
; EMusicMode musicMode : 
; Pawn myBurner : 
; Actor myKiller : 
; Pawn myPoisoner : 
; Actor myProjKiller : 
; Actor myTurretKiller : 
; String NextMap : 
; float NintendoImmunityTime : 
; float NintendoImmunityTimeLeft : 
; String NoneString : 
; String NoRoomToLift : 
; String NoteAdded : 
; int PlayerSkin : Skin assigned to PC by player on the Character Generation screen.
; int poisonCounter : 
; int poisonDamage : 
; String PoisonString : 
; float poisonTimer : 
; String PrimaryGoalCompleted : 
; String QuickSaveGameTitle : 
; float RegenRate : the number of points healed per second in mp
; float RunSilentValue : communicate run silent value in multiplayer
; int saveCount : 
; byte savedSection : 
; Float saveTime : 
; String SecondaryGoalCompleted : 
; float ServerTimeDiff : 
; float ServerTimeLastRefresh : 
; EShieldStatus ShieldStatus : 
; float ShieldTimer : 
; int SkillPointsAvail : Available skill points
; String SkillPointsAward : 
; int SkillPointsTotal : Total skill points
; SkillManager SkillSystem : Reference to a Skill Manager [?]
; int spyDroneLevel : 
; float spyDroneLevelValue : 
; String strStartMap : 
; float swimBubbleTimer : 
; float swimDuration : 
; float swimTimer : 
; String TakenOverString : 
; ColorThemeManager ThemeManager : 
; String TooHeavyToLift : 
; String TooMuchAmmo : 
; String TorsoString : 
; byte translucencyLevel : 
; String TruePlayerName : Name assigned to PC by player on the Character Generation screen.
; int UIBackground : 
; Actor ViewModelActor[8] : Used by viewmodel
; name WallMaterial : 
; Vector WallNormal : 
; int WarrenSlot : 
; float WarrenTimer : 
; String WeaponUnCloak : 
; String WithString : 
; String WithTheString : 

===_Conversation System===
; ConHistory conHistory : Conversation History
; ConPlay conPlay : Conversation
; DataLinkPlay dataLinkPlay : Used for DataLinks

===_Frob===
; Actor FrobTarget : Actor being, or to be frobbed
; float FrobTime : Elapsed duration of frob [?]
; float MaxFrobDistance : Maximum frob distance [?]

===_Goal Tracking===
; DeusExGoal FirstGoal : First goal [?] ''start of list?''
; DeusExGoal LastGoal : Last goal [?] ''end of list?''

===_Inventory System===
; bool bBeltIsMPInventory : DEUS_EX AMSD  Whether to ignore inv slots in multiplayer
; bool bInHandTransition : The inHand is being swapped out
; Inventory ClientinHandPending : Client temporary inhand pending, for mousewheel use.
; Inventory inHand : The current object in hand
; Inventory inHandPending : The pending item waiting to be put in hand
; byte invSlots[30] : 5x6 grid of inventory slots
; Inventory LastinHand : Last object inhand, so we can detect inhand changes on the client.
; int maxInvCols : Maximum number of inventory columns
; int maxInvRows : Maximum number of inventory rows

===_Keyring===
; NanoKeyInfo KeyList : List of Keys
; NanoKeyRing KeyRing : Inventory Item

===_Leaning===
; bool bCanLean : 
; float curLeanDist : 
; float prevLeanDist : 

===_Log Messages===
; DeusExLog FirstLog : First log message (linked list start)
; DeusExLog LastLog : Last log message (linked list end)

===_Multiplayer Option Propagation===
; bool bFirstOptionsSynced : DEUS_EX AMSD For multiplayer option propagation UGH! In most cases options will sync on their own.  But for initial loadout based on options, we need to send them to the server.  Easiest thing to do is have a function at startup that sends that info.
; bool bSecondOptionsSynced : 

===_Note Tracking===
; DeusExNote FirstNote : First note (start of linked list)
; DeusExNote LastNote : Last note (end of linked list)

===_While Crouching===
; bool bCrouchOn : used by toggle crouch
; bool bForceDuck : Force duck
; bool bWasCrouchOn : used by toggle crouch
; byte lastbDuck : used by toggle crouch

==Enums==

===EInvokeMethod===

; IM_Bump :
; IM_Frob :
; IM_Sight :
; IM_Radius :
; IM_Named :
; IM_Other :

===EMusicMode===

; MUS_Ambient :
; MUS_Combat :
; MUS_Conversation :
; MUS_Outro :
; MUS_Dying :

===EShieldStatus===

; SS_Off :
; SS_Fade :
; SS_Strong :

==Functions==
;  AbortConversation( optional bool bNoPlayedFlag ): 
;  ActivateAllAugs( ): 
;  ActivateAugmentation( int num ): 
;  ActivateBelt( int objectNum ): 
;  ActivateKeypadWindow( Keypad KPad , bool bHacked ): 
;  AddAugmentationDisplay( Augmentation aug ): 
;  AddChargedDisplay( ChargedPickup item ): 
;  AddDamageDisplay( name damageType , vector hitOffset ): 
; DeusExGoal AddGoal( Name goalName , bool bPrimaryGoal ): 
; bool AddImage( DataVaultImage newImage ): 
; bool AddInventory( inventory item ): 
; DeusExLog AddLog( String logText ): 
; DeusExNote AddNote( optional String strNote , optional Bool bUserNote , optional bool bShowInLog ): 
;  AddObjectToBelt( Inventory item , int pos , bool bOverride ): 
;  AllAugs( ): 
;  AllCredits( ): 
;  AllEnergy( ): 
;  AllHealth( ): 
;  AllImages( ): 
;  AllSkillPoints( ): 
;  AllSkills( ): 
;  AllWeapons( ): 
;  AugAdd( class&lt;Augmentation&gt; aWantedAug ): 
;  BeginState( ): 
;  Bleed( float deltaTime ): 
;  BuySkills( ): 
;  BuySkillSound( int code ): 
; float CalculatePlayerVisibility( ScriptedPawn P ): 
; int CalculateSkillHealAmount( int baseHealPoints ): 
; bool CanActorSeePlayer( Actor invokeActor ): 
; bool CanBeLifted( Decoration deco ): 
; bool CanStartConversation( ): 
;  CatchFire( Pawn burner ): 
; int ChargePlayer( int baseChargePoints ): 
;  CheckActiveConversationRadius( ): 
; bool CheckActorDistances( ): 
; bool CheckConversationHeightDifference( Actor invokeActor , int heightOffset ): 
; bool CheckConversationInvokeRadius( Actor invokeActor , Conversation con ): 
; bool CheckFlagRefs( ConFlagRef flagRef ): 
;  ClearAugmentationDisplay( ): 
;  ClearBelt( ): 
;  ClearInventorySlots( ): 
;  ClearLog( ): 
;  ClearPosition( int pos ): 
;  ClientDeath( ): 
;  ClientFlash( float scale , vector fog ): 
;  ClientPlayAnimation( Actor src , Name anim , float rate , bool bLoop ): 
;  ClientPossessed( ): 
;  ClientSpawnHits( bool bPenetrating , bool bHandToHand , Vector HitLocation , Vector HitNormal , Actor Other , float Damage ): 
;  ClientSpawnProjectile( class&lt;projectile&gt; ProjClass , Actor owner , Vector Start , Rotator AdjustedAim ): 
;  ClientTurnOffScores( ): 
;  CloseComputerScreen( Computers computerToClose ): 
;  CloseThisComputer( Computers comp ): 
;  ConBindEvents( ): 
;  CreateColorThemeManager( ): 
; DataVaultImageNote CreateDataVaultImageNoteObject( ): 
;  CreateDrone( ): 
; DumpLocation CreateDumpLocationObject( ): 
; GameDirectory CreateGameDirectoryObject( ): 
; ConHistoryEvent CreateHistoryEvent( ): 
; ConHistory CreateHistoryObject( ): 
;  CreateKeyRing( ): 
;  CreateKillerProfile( Pawn killer , int damage , name damageType , String bodyPart ): 
; DeusExLog CreateLogObject( ): 
; NanoKeyInfo CreateNanoKeyInfo( ): 
;  CreatePlayerTracker( ): 
;  CreateShadow( ): 
;  DamageAll( optional int amount ): 
;  DamagePart( int partIndex , optional int amount ): 
;  DeactivateAllAugs( ): 
;  DebugCommand( string teststr ): 
;  DeleteAllGoals( ): 
;  DeleteAllNotes( ): 
; Bool DeleteGoal( DeusExGoal goalToDelete ): 
; bool DeleteInventory( inventory item ): 
; Bool DeleteNote( DeusExNote noteToDelete ): 
;  DeleteSaveGameFiles( optional String saveDirectory ): 
;  Died( pawn Killer , name damageType , vector HitLocation ): 
;  DisconnectPlayer( ): 
;  DoFrob( Actor Frobber , Inventory frobWith ): 
;  DoJump( optional float F ): 
;  DoneReloading( DeusExWeapon weapon ): 
;  DrawInvulnShield( ): 
;  DrawShield( ): 
;  DroneExplode( ): 
;  DropDecoration( ): 
; bool DropItem( optional Inventory inv , optional bool bDrop ): 
;  DrugEffects( float deltaTime ): 
;  DualmapF10( ): 
;  DualmapF11( ): 
;  DualmapF12( ): 
;  DualmapF3( ): 
;  DualmapF4( ): 
;  DualmapF5( ): 
;  DualmapF6( ): 
;  DualmapF7( ): 
;  DualmapF8( ): 
;  DualmapF9( ): 
;  DumpInventoryGrid( ): 
;  DXDumpInfo( ): 
; bool DXReduceDamage( int Damage , name damageType , vector hitLocation , out int adjustedDamage , bool bCheckOnly ): 
;  EditFlags( ): 
;  EndConversation( ): 
;  EndState( ): 
;  ExtinguishFire( ): 
;  FailConsoleCheck( ): 
;  FailRootWindowCheck( ): 
; DeusExGoal FindGoal( Name goalName ): 
; Bool FindInventorySlot( Inventory anItem , optional Bool bSearchOnly ): 
; Bool FindInventorySlotXY( int invSlotsX , int invSlotsY , out int newSlotX , out int newSlotY ): 
;  Fire( optional float F ): 
;  Fly( ): 
;  ForceDisconnect( string Message ): 
;  ForceDroneOff( ): 
;  GenerateTotalHealth( ): 
; Conversation GetActiveConversation( Actor invokeActor , EInvokeMethod invokeMethod ): 
; Conversation GetActiveDataLink( String datalinkName ): 
; int GetAugPriority( Augmentation AugToCheck ): 
; float GetCurrentGroundSpeed( ): 
;  GetDebug( name cmd ): 
; float GetDefaultCollisionHeight( ): 
; string GetDeusExVersion( ): 
; String GetDisplayName( Actor actor , optional Bool bUseFamiliar ): 
; name GetFloorMaterial( ): 
; bool GetHUDBackgroundTranslucency( ): 
; bool GetHUDBordersVisible( ): 
; bool GetHUDBorderTranslucency( ): 
; DeusExLevelInfo GetLevelInfo( ): 
; Float GetLogTimeout( ): 
; Byte GetMaxLogLines( ): 
; bool GetMenuTranslucency( ): 
; int GetMPHitLocation( Vector HitLocation ): 
; DeusExNote GetNote( Name textTag ): 
;  GetSkillInfoFromProj( DeusExPlayer killer , Actor proj ): 
; name GetWallMaterial( out vector wallNormal ): 
;  GetWeaponName( DeusExWeapon w , out String name ): 
; Inventory GetWeaponOrAmmo( Inventory queryItem ): 
;  Ghost( ): 
;  GiveInitialInventory( ): 
;  GiveNanoKey( Name newKeyID , String newDescription ): 
;  GoalAdd( Name goalName , String goalText , optional bool bPrimaryGoal ): 
;  GoalCompleted( Name goalName ): 
;  GoalSetPrimary( Name goalName , bool bPrimaryGoal ): 
;  GrabDecoration( ): 
;  GrantAugs( int NumAugs ): 
; bool HandleItemPickup( Actor FrobTarget , optional bool bSearchOnly ): 
;  HandleWalking( ): 
;  HealPart( out int points , out int amt ): 
; int HealPlayer( int baseHealPoints , optional Bool bUseMedicineSkill ): 
;  HighlightCenterObject( ): 
;  IAmWarren( ): 
; bool InConversation( ): 
;  IncreaseClientFlashLength( float NewFlashTime ): 
;  InitializeSubSystems( ): 
;  InvokeComputerScreen( Computers computerToActivate , float CompHackTime , float ServerLevelTime ): 
;  InvokeConWindow( ): 
;  InvokeUIScreen( Class&lt;DeusExBaseWindow&gt; windowClass ): 
; Bool IsEmptyItemSlot( Inventory anItem , int col , int row ): 
; Bool IsEmptyItemSlotXY( int invSlotsX , int invSlotsY , int col , int row ): 
; bool IsFrobbable( actor A ): 
; bool IsHighlighted( actor A ): 
; bool IsLeaning( ): 
;  KeypadRunEvents( Keypad KPad , bool bSuccess ): 
;  KeypadRunUntriggers( Keypad KPad ): 
;  KeypadToggleLocks( Keypad KPad ): 
;  KillerProfile( ): 
;  KillShadow( ): 
;  Landed( vector HitNormal ): 
;  Legend( ): 
;  LoadGame( int saveIndex ): 
;  LoadMap( ): 
;  LocalLog( String S ): 
;  LogMsg( string msg ): 
;  LoopHeadConvoAnim( ): 
;  MaintainEnergy( float deltaTime ): 
;  MakeCameraAlly( SecurityCamera camera ): 
;  MakePlayerIgnored( bool bNewIgnore ): 
;  Matrix( ): 
;  MoveActor( int xPos , int yPos , int zPos ): 
;  MoveDrone( float DeltaTime , Vector loc ): 
;  MultiplayerDeathMsg( Pawn killer , bool killedSelf , bool valid , String killerName , String killerMethod ): 
;  MultiplayerNotifyMsg( int code , optional int param , optional string str ): 
;  MultiplayerTick( float DeltaTime ): 
;  NewMultiplayerMatch( ): 
;  NextBeltItem( ): 
;  NextHUDColorTheme( ): 
;  NextMenuColorTheme( ): 
;  NintendoImmunityEffect( bool on ): 
;  NoteAdd( String noteText , optional bool bUserNote ): 
;  OpenSesame( ): 
;  ParseLeftClick( ): 
;  ParseRightClick( ): 
;  PickupNanoKey( NanoKey newKey ): 
;  PlaceItemInSlot( Inventory anItem , int col , int row ): 
;  PlayBodyThud( ): 
;  PlayDeathHit( float Damage , vector HitLocation , name damageType , vector Momentum ): 
;  PlayDXTakeDamageHit( float Damage , vector HitLocation , name damageType , vector Momentum , bool DamageReduced ): 
;  PlayerCalcView( out actor ViewActor , out vector CameraLocation , out rotator CameraRotation ): 
; bool PlayerIsClient( ): 
; bool PlayerIsListenClient( ): 
; bool PlayerIsRemoteClient( ): 
;  PlayFootStep( ): 
;  PlayHit( float Damage , vector HitLocation , name damageType , vector Momentum ): 
;  PlayMusic( String musicToPlay , optional int sectionToPlay ): 
;  PlayMusicWindow( ): 
;  PlayPickupAnim( Vector locPickup ): 
;  PopHealth( float health0 , float health1 , float health2 , float health3 , float health4 , float health5 ): 
;  PostBeginPlay( ): 
;  PostIntro( ): 
;  PostNetBeginPlay( ): 
;  PostPostBeginPlay( ): 
;  PreTravel( ): 
;  PrevBeltItem( ): 
;  ProcessMove( float DeltaTime , vector newAccel , eDodgeDir DodgeMove , rotator DeltaRot ): 
;  PunishDetection( int DamageAmount ): 
;  PutCarriedDecorationInHand( ): 
;  PutInHand( optional Inventory inv ): 
;  QuickLoad( ): 
;  QuickLoadConfirmed( ): 
;  QuickSave( ): 
;  ReceiveFirstOptionSync( Name PrefZero , Name PrefOne , Name PrefTwo , Name PrefThree , Name PrefFour ): 
;  ReceiveSecondOptionSync( Name PrefFive , Name PrefSix , Name PrefSeven , Name PrefEight ): 
;  RefreshChargedPickups( ): 
;  RefreshSystems( float DeltaTime ): 
;  Reloading( DeusExWeapon weapon , float reloadTime ): 
;  ReloadWeapon( ): 
;  RemoveAugmentationDisplay( Augmentation aug ): 
;  RemoveChargedDisplay( ChargedPickup item ): 
;  RemoveInventoryType( Class&lt;Inventory&gt; removeType ): 
;  RemoveItemDuringConversation( Inventory item ): 
;  RemoveItemFromSlot( Inventory anItem ): 
;  RemoveNanoKey( Name KeyToRemove ): 
;  RemoveObjectFromBelt( Inventory item ): 
;  RepairInventory( ): 
; bool ResetBasedPawnSize( ): 
;  ResetConversationHistory( ): 
;  ResetGoals( ): 
;  ResetPlayer( optional bool bTraining ): 
;  ResetPlayerToDefaults( ): 
;  RestartLevel( ): 
;  RestoreAllHealth( ): 
;  RestoreScopeView( ): 
;  RestoreSkillPoints( ): 
; bool RestrictInput( ): 
;  ResumeDataLinks( ): 
;  SaveGame( int saveIndex , optional String saveDesc ): 
;  SaveSkillPoints( ): 
;  ServerConditionalNotifyMsg( int code , optional int param , optional string str ): 
;  ServerSetAutoReload( bool bAuto ): 
;  ServerUpdateLean( Vector desiredLoc ): 
; bool SetBasedPawnSize( float newRadius , float newHeight ): 
; name SetBoolFlagFromString( String flagNameString , bool bValue ): 
;  SetComputerHackTime( Computers computerToSet , float HackTime , float ClientLevelTime ): 
;  SetDamagePercent( float percent ): 
;  SetDebug( name cmd , name val ): 
;  SetHUDBackgroundTranslucency( bool bNewTranslucency ): 
;  SetHUDBordersVisible( bool bVisible ): 
;  SetHUDBorderTranslucency( bool bNewTranslucency ): 
;  SetInHand( Inventory newInHand ): 
;  SetInHandPending( Inventory newInHandPending ): 
;  SetInvSlots( Inventory anItem , int newValue ): 
;  SetLogTimeout( Float newLogTimeout ): 
;  SetMaxLogLines( Byte newLogLines ): 
;  SetMenuTranslucency( bool bNewTranslucency ): 
;  SetServerTimeDiff( float sTime ): 
;  SetState( name state ): 
;  SetTurretState( AutoTurret turret , bool bActive , bool bDisabled ): 
;  SetTurretTrackMode( ComputerSecurity computer , AutoTurret turret , bool bTrackPlayers , bool bTrackPawns ): 
;  ShowAcceleration( bool bShow ): 
;  ShowArea( bool bShow ): 
;  ShowAugmentationAddWindow( ): 
;  ShowAugmentationsWindow( ): 
;  ShowBase( bool bShow ): 
;  ShowBindName( bool bShow ): 
;  ShowClass( Class&lt;Actor&gt; newClass ): 
;  ShowConversationsWindow( ): 
;  ShowCredits( optional bool bLoadIntro ): 
;  ShowCylinder( bool bShow ): 
;  ShowData( bool bShow ): 
;  ShowDemoSplash( ): 
;  ShowDist( bool bShow ): 
;  ShowEnemy( bool bShow ): 
;  ShowEnemyResponse( bool bShow ): 
;  ShowER( bool bShow ): 
;  ShowEyes( bool bShow ): 
;  ShowGoalsWindow( ): 
;  ShowHealth( bool bShow ): 
;  ShowHealthWindow( ): 
;  ShowHud( bool bShow ): 
;  ShowImagesWindow( ): 
;  ShowInstigator( bool bShow ): 
;  ShowIntro( optional bool bStartNewGame ): 
;  ShowInventoryWindow( ): 
;  ShowLight( bool bShow ): 
;  ShowLogsWindow( ): 
;  ShowLOS( bool bShow ): 
;  ShowMainMenu( ): 
;  ShowMass( bool bShow ): 
;  ShowMesh( bool bShow ): 
;  ShowMultiplayerWin( String winnerName , int winningTeam , String Killer , String Killee , String Method ): 
;  ShowPhysics( bool bShow ): 
;  ShowPlayerPawnList( ): 
;  ShowPos( bool bShow ): 
;  ShowProgress( ): 
;  ShowQuotesWindow( ): 
;  ShowRGBDialog( ): 
;  ShowScores( ): 
;  ShowSkillsWindow( ): 
;  ShowState( bool bShow ): 
;  ShowVelocity( bool bShow ): 
;  ShowVisibility( bool bShow ): 
;  ShowZone( bool bShow ): 
;  SkillPointsAdd( int numPoints ): 
;  SpawnBlood( Vector HitLocation , float Damage ): 
; Carcass SpawnCarcass( ): 
;  SpawnEMPSparks( Actor empActor , Rotator rot ): 
;  SpawnMass( Name ClassName , optional int TotalCount ): 
; bool StartAIBarkConversation( Actor conOwner , EBarkModes barkMode ): 
; bool StartConversation( Actor invokeActor , EInvokeMethod invokeMethod , optional Conversation con , optional bool bAvoidState , optional bool bForcePlay ): 
; bool StartConversationByName( Name conName , Actor conOwner , optional bool bAvoidState , optional bool bForcePlay ): 
; Bool StartDataLinkTransmission( String datalinkName , Optional DataLinkTrigger datalinkTrigger ): 
;  StartListenGame( string options ): 
;  StartMultiplayerGame( string command ): 
;  StartNewGame( String startMap ): 
;  StartPoison( Pawn poisoner , int Damage ): 
;  StartTrainingMission( ): 
;  StopPoison( ): 
;  Summon( string ClassName ): 
;  SupportActor( Actor standingActor ): 
;  SwitchAmmo( ): 
;  TakeDamage( int Damage , Pawn instigatedBy , Vector hitlocation , Vector momentum , name damageType ): 
;  Tantalus( ): 
;  TeamSay( string Msg ): 
;  Timer( ): 
;  ToggleAmmoDisplay( ): 
;  ToggleAugDisplay( ): 
;  ToggleCameraState( SecurityCamera cam , ElectronicDevices compOwner ): 
;  ToggleCompass( ): 
;  ToggleCrosshair( ): 
;  ToggleHitDisplay( ): 
;  ToggleLaser( ): 
;  ToggleObjectBelt( ): 
;  ToggleScope( ): 
;  ToggleWalk( ): 
;  ToggleWinFrames( ): 
;  ToggleWinStats( ): 
;  Trig( name ev ): 
;  UnloadTexture( Texture texture ): 
;  UnTrig( name ev ): 
;  UpdateAmmoBeltText( Ammo ammo ): 
;  UpdateAugmentationDisplayStatus( Augmentation aug ): 
;  UpdateBeltText( Inventory item ): 
;  UpdateCameraRotation( SecurityCamera camera , Rotator rot ): 
;  UpdateCarcassEvent( ): 
;  UpdateDynamicMusic( float deltaTime ): 
;  UpdateInHand( ): 
;  UpdatePlayerSkin( ): 
;  UpdatePoison( float deltaTime ): 
;  UpdateTimePlayed( float deltaTime ): 
;  UpdateTranslucency( float DeltaTime ): 
;  UpdateWarrenEMPField( float deltaTime ): 
; bool UsingChargedPickup( class&lt;ChargedPickup&gt; itemclass ): 
;  VerifyConsole( Class&lt;Console&gt; ConsoleClass ): Verifies that console is Engine.Console.  If you want something different, override this in a subclassed player class.
;  VerifyRootWindow( Class&lt;DeusExRootWindow&gt; WindowClass ): Verifies that the root window is the right kind of root window, since it can be changed in the ini
;  ViewFlash( float DeltaTime ): 
;  ViewModelAdd( int num , string ClassName ): 
;  ViewModelBlendPlay( int num , name anim , optional float fps , optional int slot ): 
;  ViewModelBlendStop( int num ): 
;  ViewModelDestroy( int num ): 
;  ViewModelGiveWeapon( int num , string weaponClass ): 
;  ViewModelLoop( int num , name anim , optional float fps ): 
;  ViewModelPlay( int num , name anim , optional float fps ): 
;  VMA( int num , string ClassName ): 
;  VMBP( int num , name anim , optional float fps , optional int slot ): 
;  VMBS( int num ): 
;  VMD( int num ): 
;  VMGW( int num , string weaponClass ): 
;  VML( int num , name anim , optional float fps ): 
;  VMP( int num , name anim , optional float fps ): 
;  Walk( ): 
;  WhereActor( optional int Me ): 
;  WinFrames( bool bFramesOn ): 
;  WinStats( bool bStatsOn ): 
;  ZoneChange( ZoneInfo NewZone ): 

==Events==
;  Destroyed( ): 
;  HeadZoneChange( ZoneInfo newHeadZone ): 
;  InterpolateEnd( Actor Other ): 
;  JoltView( float newJoltMagnitude ): 
;  PlayerCalcView( out actor ViewActor , out vector CameraLocation , out rotator CameraRotation ): 
;  PlayerInput( float DeltaTime ): 
;  PlayerTick( float deltaTime ): 
;  Possess( ): 
;  RenderOverlays( canvas Canvas ): 
;  TravelPostAccept( ): 
;  UpdateEyeHeight( float DeltaTime ): 

----

'''Xhiris:''' 12000 lines!  UGH!
[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeusExWeapon (DX)</title>
    <id>1079</id>
    <revision>
      <id>2863</id>
      <timestamp>2005-11-09T13:42:09Z</timestamp>
      <contributor>
        <ip>Szerver1.ffg.sulinet.hu</ip>
      </contributor>
      <comment>Modified Actor to point to Actor(DX)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Inventory (DX)|Inventory (DX)]] &gt;&gt; [[Legacy:Weapon (DX)|Weapon (DX)]] &gt;&gt; DeusExWeapon}}

==DeusExWeapon (DX)==

===What does it do the original [[Legacy:Weapon|Weapon]] doesn't?===

* First of all, touching it won't get into your inventory, only Frobbing it.
* There will be a [ ] around it, with the weapon name shown.
* There can only be one thing in a belt slot at one time.
* Single Player - they take up spaces in the inventory.
* Multi Player - they are only allowed on the first three beltslots by default.

----

===Functions for weapons===

(note: some of these functions ARE available to the normal [[Legacy:Weapon|Weapon]] class.)

; TestMPBeltSlot(int beltslot) : simulated bool function allowing you to change which beltslot this weapon is on.
; WeaponDamageType() : name function, returns the damagetype name.
; ProcessTraceHit(blablabla) : a function that allows you to make effects for an instanthit weapon. Has 6 arguments, if someone has time, he can replace blablabla.
; ...Toggle : triggered on toggling ... . ... can be either scope or laser.
; ...On/...Off : triggered when turning on/off ... . ... can be either scope or laser.
; CycleAmmo : called when pressing the cycle ammotype button (which changes the ammotype to the next in ammonames[3] if you have some of it by default)

----

===Enums===

====EEnviroEffective====
; ENVEFF_All : This weapon can be used in all environments.
; ENVEFF_Air : This weapon can be used on open air only.
; ENVEFF_Vacuum : This weapon can only be used in vacuum.
; ENVEFF_Water : This weapon can only be used underwater.
; ENVEFF_AirWater : This weapon can be used underwater and in open air too.
; ENVEFF_AirVacuum : This weapon can be used in open air and in vacuum too.
; ENVEFF_WaterVacuum : This weapon cannot be used on open air.

====EEnemyEffective====
; ENMEFF_All : This weapon is effective to all enemies.
; ENMEFF_Organic : This weapon is only effective versus living things.
; ENMEFF_Robot : This weapon is only effective against robots.

====EConcealability====
; CONC_None : This weapon cannot be concealed from ScriptedPawns.
; CONC_Visual : I don't know this yet, please replace.
; CONC_Metal : This weapon can only be concealed while near metal things.
; CONC_All : This weapon will always remain concealed from enemy AIs.

====ELockMode====
; LOCK_None : This weapon either cannot lock on or doesn't have a target to lock on.
; LOCK_Invalid : This weapon cannot lock on the target, because it's friendly.
; LOCK_Range : Target valid person cannot be locked on because he's out of range.
; LOCK_Acquire : The weapon is acquiring the target.
; LOCK_Locked : The weapon has locked on the target.

====EAreaType====
; AOE_Point : All damage is concentrated in one point.
; AOE_Cone : All damage is concentrated in one cone (for example, an explosion ring)
; AOE_Sphere : All damage is concentrated in one sphere (for example, a rocket's explosion)

----

===Properties for DeusExWeapon===

(note: all of these properties are declared in DeusExWeapon. Deus Ex uses Unreal Engine 1, any similarity of properties in other engines are not to be discussed here.)

; LowAmmoWaterMark : the number of ammo in clip from the game starts marking it as &quot;low&quot;. (int)
; GoverningSkill : the skill that affects this weapon. (class&lt;skill&gt;)
; NoiseLevel : how much noise does this weapon make when fired? (travel, float)
; EnemyEffective : the enemies this weapon is effective against (EEnemyEffective)
; EnviroEffective : the environments this weapon is effective in. (EEnviroEffective)
; Concealability : the weapon's concealability (EConcealability)
; bAutomatic : is this an automatic weapon? (travel, bool)
; shotTime : how long after shooting you can shoot again? (travel, float)
; reloadTime : how long is it to reload this weapon? (travel, float)
; hitDamage : damage done by a single shot/slug (int)
; maxRange : the maximum range this weapon can shoot till (real world units, so you need to divide by 16) (int)
; accurateRange : the range at your weapon is still accurate (same calculation as above) (travel, int)
; baseAccuracy : the base accuracy of the weapon (0.0 is dead on, 1.0 is far off) (travel, float)
; bCanHave... : (singleplayer only) which weaponmods can this weapon have? (see modding a weapon section) (bool)
; bHasScope : does this weapon have a scope? (travel, bool)
; ScopeFOV : field of view while scoping? (int)
; bHasLaser : does this weapon have a laser? (travel, bool)
; bHasSilencer : does this weapon have a silencer? (travel, bool)
; bCanTrack : can one of this weapon's projectiles track an enemy? (bool)
; lockTime : how long does it take to lock on an enemy? (float)
; lockedSound : sound played while the weapon is locked on (Sound)
; trackingSound : sound player while tracking (Sound)
; ammoNames[3] : ammotypes of this weapon (class&lt;Ammo&gt;)
; projectileNames[3] : projectileclasses of this weapon (class&lt;Projectile&gt;)
; areaOfEffect : area of effect of the weapon (EAreaType)
; bPenetrating : shot will penetrate and cause blood (bool)
; StunDuration : how long does this weapon stun for? (float)
; bHasMuzzleFlash : does this weapon flash when fired? (bool)
; bHandToHand : is this a weapon without ammo? (bool)
; recoilStrength : how strong does this weapon recoil? (travel, float)

----

===Modding a weapon===

There are certain [[Legacy:WeaponMod|WeaponMod]] pickups extending [[Legacy:DeusExPickup|DeusExPickup]]. They aren't weapons after all, rather, they are used to power-up weapons in singleplayer (in multiplayer, it's useless as there is no inventory screen).

====Weapon mods====
; [[Legacy:WeaponModAccuracy|WeaponModAccuracy]] : Increases the BaseAccuracy of the weapon
; [[Legacy:WeaponModClip|WeaponModClip]] : Increases clip size of the weapon
; [[Legacy:WeaponModLaser|WeaponModLaser]] : Attaches Laser Sight to the weapon
; [[Legacy:WeaponModRange|WeaponModRange]] : Increases weapon's accurateRange
; [[Legacy:WeaponModRecoil|WeaponModRecoil]] : Reduces weapon recoil
; [[Legacy:WeaponModReload|WeaponModReload]] : Reduces reloadTime of your weapon
; [[Legacy:WeaponModScope|WeaponModScope]] : Attaches a Scope to the weapon
; [[Legacy:WeaponModSilencer|WeaponModSilencer]] : Attaches a Silencer to the weapon

====Weapons using mods====

Of course, some of the weapons cannot take some mods. Like, imagine a rocket launcher with a silencer... Impossible, ain't it?

These are set by the properties &quot;bCanHave...&quot;
* ... should be replaced by one of the following things. What it allows is obvious.
** ModBaseAccuracy
** ModAccurateRange
** ModRecoilStrength
** ModReloadTime (reload)
** ModReloadCount (clip)
** Scope
** Laser
** Silencer

===The End===

That would be our beloved DeusExWeapon. Hope this page will help the future modders of the game's small community.</text>
    </revision>
    <revision>
      <id>2864</id>
      <timestamp>2005-07-20T18:24:44Z</timestamp>
      <contributor>
        <ip>Amazonas-848.adsl.datanet.hu</ip>
      </contributor>
      <comment>Fixing those damn enums... And headers.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (DX)|Inventory (DX)]] &gt;&gt; [[Legacy:Weapon (DX)|Weapon (DX)]] &gt;&gt; DeusExWeapon}}

==DeusExWeapon (DX)==

===What does it do the original [[Legacy:Weapon|Weapon]] doesn't?===

* First of all, touching it won't get into your inventory, only Frobbing it.
* There will be a [ ] around it, with the weapon name shown.
* There can only be one thing in a belt slot at one time.
* Single Player - they take up spaces in the inventory.
* Multi Player - they are only allowed on the first three beltslots by default.

----

===Functions for weapons===

(note: some of these functions ARE available to the normal [[Legacy:Weapon|Weapon]] class.)

; TestMPBeltSlot(int beltslot) : simulated bool function allowing you to change which beltslot this weapon is on.
; WeaponDamageType() : name function, returns the damagetype name.
; ProcessTraceHit(blablabla) : a function that allows you to make effects for an instanthit weapon. Has 6 arguments, if someone has time, he can replace blablabla.
; ...Toggle : triggered on toggling ... . ... can be either scope or laser.
; ...On/...Off : triggered when turning on/off ... . ... can be either scope or laser.
; CycleAmmo : called when pressing the cycle ammotype button (which changes the ammotype to the next in ammonames[3] if you have some of it by default)

----

===Enums===

====EEnviroEffective====
; ENVEFF_All : This weapon can be used in all environments.
; ENVEFF_Air : This weapon can be used on open air only.
; ENVEFF_Vacuum : This weapon can only be used in vacuum.
; ENVEFF_Water : This weapon can only be used underwater.
; ENVEFF_AirWater : This weapon can be used underwater and in open air too.
; ENVEFF_AirVacuum : This weapon can be used in open air and in vacuum too.
; ENVEFF_WaterVacuum : This weapon cannot be used on open air.

====EEnemyEffective====
; ENMEFF_All : This weapon is effective to all enemies.
; ENMEFF_Organic : This weapon is only effective versus living things.
; ENMEFF_Robot : This weapon is only effective against robots.

====EConcealability====
; CONC_None : This weapon cannot be concealed from ScriptedPawns.
; CONC_Visual : I don't know this yet, please replace.
; CONC_Metal : This weapon can only be concealed while near metal things.
; CONC_All : This weapon will always remain concealed from enemy AIs.

====ELockMode====
; LOCK_None : This weapon either cannot lock on or doesn't have a target to lock on.
; LOCK_Invalid : This weapon cannot lock on the target, because it's friendly.
; LOCK_Range : Target valid person cannot be locked on because he's out of range.
; LOCK_Acquire : The weapon is acquiring the target.
; LOCK_Locked : The weapon has locked on the target.

====EAreaType====
; AOE_Point : All damage is concentrated in one point.
; AOE_Cone : All damage is concentrated in one cone (for example, an explosion ring)
; AOE_Sphere : All damage is concentrated in one sphere (for example, a rocket's explosion)

----

===Properties for DeusExWeapon===

(note: all of these properties are declared in DeusExWeapon. Deus Ex uses Unreal Engine 1, any similarity of properties in other engines are not to be discussed here.)

; LowAmmoWaterMark : the number of ammo in clip from the game starts marking it as &quot;low&quot;. (int)
; GoverningSkill : the skill that affects this weapon. (class&lt;skill&gt;)
; NoiseLevel : how much noise does this weapon make when fired? (travel, float)
; EnemyEffective : the enemies this weapon is effective against (EEnemyEffective)
; EnviroEffective : the environments this weapon is effective in. (EEnviroEffective)
; Concealability : the weapon's concealability (EConcealability)
; bAutomatic : is this an automatic weapon? (travel, bool)
; shotTime : how long after shooting you can shoot again? (travel, float)
; reloadTime : how long is it to reload this weapon? (travel, float)
; hitDamage : damage done by a single shot/slug (int)
; maxRange : the maximum range this weapon can shoot till (real world units, so you need to divide by 16) (int)
; accurateRange : the range at your weapon is still accurate (same calculation as above) (travel, int)
; baseAccuracy : the base accuracy of the weapon (0.0 is dead on, 1.0 is far off) (travel, float)
; bCanHave... : (singleplayer only) which weaponmods can this weapon have? (see modding a weapon section) (bool)
; bHasScope : does this weapon have a scope? (travel, bool)
; ScopeFOV : field of view while scoping? (int)
; bHasLaser : does this weapon have a laser? (travel, bool)
; bHasSilencer : does this weapon have a silencer? (travel, bool)
; bCanTrack : can one of this weapon's projectiles track an enemy? (bool)
; lockTime : how long does it take to lock on an enemy? (float)
; lockedSound : sound played while the weapon is locked on (Sound)
; trackingSound : sound player while tracking (Sound)
; ammoNames[3] : ammotypes of this weapon (class&lt;Ammo&gt;)
; projectileNames[3] : projectileclasses of this weapon (class&lt;Projectile&gt;)
; areaOfEffect : area of effect of the weapon (EAreaType)
; bPenetrating : shot will penetrate and cause blood (bool)
; StunDuration : how long does this weapon stun for? (float)
; bHasMuzzleFlash : does this weapon flash when fired? (bool)
; bHandToHand : is this a weapon without ammo? (bool)
; recoilStrength : how strong does this weapon recoil? (travel, float)

----

===Modding a weapon===

There are certain [[Legacy:WeaponMod|WeaponMod]] pickups extending [[Legacy:DeusExPickup|DeusExPickup]]. They aren't weapons after all, rather, they are used to power-up weapons in singleplayer (in multiplayer, it's useless as there is no inventory screen).

====Weapon mods====
; [[Legacy:WeaponModAccuracy|WeaponModAccuracy]] : Increases the BaseAccuracy of the weapon
; [[Legacy:WeaponModClip|WeaponModClip]] : Increases clip size of the weapon
; [[Legacy:WeaponModLaser|WeaponModLaser]] : Attaches Laser Sight to the weapon
; [[Legacy:WeaponModRange|WeaponModRange]] : Increases weapon's accurateRange
; [[Legacy:WeaponModRecoil|WeaponModRecoil]] : Reduces weapon recoil
; [[Legacy:WeaponModReload|WeaponModReload]] : Reduces reloadTime of your weapon
; [[Legacy:WeaponModScope|WeaponModScope]] : Attaches a Scope to the weapon
; [[Legacy:WeaponModSilencer|WeaponModSilencer]] : Attaches a Silencer to the weapon

====Weapons using mods====

Of course, some of the weapons cannot take some mods. Like, imagine a rocket launcher with a silencer... Impossible, ain't it?

These are set by the properties &quot;bCanHave...&quot;
* ... should be replaced by one of the following things. What it allows is obvious.
** ModBaseAccuracy
** ModAccurateRange
** ModRecoilStrength
** ModReloadTime (reload)
** ModReloadCount (clip)
** Scope
** Laser
** Silencer

===The End===

That would be our beloved DeusExWeapon. Hope this page will help the future modders of the game's small community.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DevastatED</title>
    <id>1078</id>
    <revision>
      <id>2860</id>
      <timestamp>2007-04-03T22:49:04Z</timestamp>
      <contributor>
        <ip>Cpc3-bagu1-0-0-cust518.bagu.cable.ntl.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page contains general hints, tips and information about the devastation editor. it operates the same as any other version of [[Legacy:UnrealEd|UnrealEd]] out there, but there are a few unique features/bugs that you should be aware of.

This page does not tell you how to build a map for devastation, so if you are completely new to map editing you should check out [[Legacy:Mapping Lessons|Mapping Lessons]].

==The basics==

The editor is accessed  from Start-&gt;Programs-&gt;Devastation-&gt;Devastation editor. (this seems painfully obvious but i know people who had this game from the day it was released and never worked that out :Rolleyes: )

The first thing is the most commonly asked question ever about unreal ed- OMG my map dissapears when i open the editor! the viewports are white ( In Devastation editor they show the editor icon that you see when it loads up) . RELAX and do view-&gt; viewports-&gt;configure and choose your desired layout.

And try to remember [[Legacy:Team Number|Team Number]]s:
* Team 0=Conformists=Blue
* Team 1=Resistance=Red

When playtesting a multiplayer map from the editor it wont work properly. For example, if you playtest a DDM map through the editor if you kill yourself you will respawn with no weapons at all-even you hands will dissappear- but you can still pick up weapons fine. Dont worry though. It will work fine when actually running on the internet.

As with most other unreal editors out there, be prepared for it to crash. Ive outlined some things you shouldnt do in this page but still, it can crash and freeze up for no reason at all. Save, and save often under different filenames.

==Information on static meshes, prefabs, textures and other resources==

There is a very broad variety of resources available for you to use.

'''Static Meshes .USX'''

The most useful packages in terms on numbers of meshes and variety are the DDecoSm packages. Static meshes from individual maps can be found in thier respective packages, eg static meshes from rivers of waste can be found in the riversofwaste and riversSM packages. or, you could [[Legacy:Create A Static Mesh|create a static mesh]] yourself. There seems to be collision bug with the DDecoSMestreetcleaner which allows you to walk through it like it wasnt there. Simply add a [[Legacy:BlockingVolume|BlockingVolume]] around it to fix the problem. If you are creating a [[Legacy:SkyBox|SkyBox]] you can look in most of the singleplayer packages, or in DSkySM.

As with textures (see below), you should press the &quot;all&quot; tab in the corner of the browser.

'''Textures .UTX'''

The skins for all static meshes can be found within the texture browser.   There is actually many very useful textures, too many to list here, so have a look around in every package and see what you can find. In the texture browser, the exclamation mark button in the top left hand corner is used to preview what textures will look like when put on a surface, IE some textures display moving objects (like a rotating fan).

Its a good idea to press the &quot;all&quot; button, that way all groups will be displayed at once. Eg, if you open UTAPROPS, all you seen are some fan textures, until you press the &quot;all&quot; tab.

Note: DO NOT try to open the UTAcode or Scripted tex. They will crash the editor.

Some useful textures

*Zone portal texture   BuildHelpTex.Zoneportaltex

(more to add when i have a proper look round later)

'''Prefabs .U'''

For some reason, you cannot access the prefab browser from directly under the view menu. So, go into the [[Legacy:Actor Class Browser|Actor class browser]] and select the prefabs tab. You can view most of the prefabs by pressing the AllPkgs button (i dont recommend pressing the AllGrps button though. It usually crashes the editor). Have a look through different decoration packages and see what you can find. You can add prefabs to you map using the middle mouse button, or by right clicking in a 3d viewport in wireframe mode.

'''Sounds .UAX'''

Most of the sound packages contain the character voices used in individual levels, eg SP1M1 cointains all the voice effects used in the first mission. . Use an [[Legacy:AmbientSound|AmbientSound]] to implement a sound in your level.

Most useful sounds (laser fence hacking alarm, flag capture etc) are found in UDAmbeint, although you will have to press the &quot;all&quot; tab.

'''Actor Classes .u'''

Most of the useful actors are found in the DTerritories package. If, when you go to select the [[Legacy:Gametype|Gametype]],all you see is Dgameinfo, then you need to open the DTerritories package to see the full range of game types available. The territories package also contains many of the emitters.

You will also need to open this package in the browser to load the DLaserfence and DLoadout volumes.

==A little note on occlusion==

Devastation adds a new type of zone portal called an Zone antiportal. For more information see the [[Legacy:Antiportal|Antiportal]] page.

==Bugs==

Brush add/subtract scaling.

From what i can tell, this is a very unusual problem which I encountered recently (not for the first time) that makes it impossible to build geometry. Its hard to explain, lets say that you make the [[Legacy:Red Builder Brush|red builder brush]] 512x512x512 and then add it to the world, the actual dimensions of the added brush will come out as maybe 512x512x480. That is, the added brush is smaller than the proper size it should be defined by the builder brush, in one or more directions.

I cant really be more specific, lets just say youll know if you encounter this.

You can fix it very easily by accessing the builder brushes properties -&gt;dispay and resetting the &quot;drawscale 3D&quot; settings all back to 1. The last time this happened to me, one of the drawscale settings was 1.2 instead of one, making the actual brush added (or subtracted) 1/5 too big.

==And the Finale....how to crash the editor==

1: Right clicking on a brush and doing order-&gt; sort order causes a crash

2: Opening certain packages causes crashes

3: Doing anything with fluid surfaces will cause a crash

4: Right clicking more than 5 times when you have more than 1 thing selected crashes you

5: And of course..doing absoloutely nothing at all can result in a crash :)

==Comments==

'''Ragdoll:''' If theres anyone on this wiki that owns Devastation apart from me, feel free to add more to this page and comment on it.

'''AJRAD:''' Yeah me, I'll take care of it^^</text>
    </revision>
    <revision>
      <id>2861</id>
      <timestamp>2005-11-24T20:31:37Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>some minor updating</comment>
      <text xml:space="preserve">This page contains general hints, tips and information about the devastation editor. it operates the same as any other version of [[Legacy:UnrealEd|UnrealEd]] out there, but there are a few unique features/bugs that you should be aware of.

This page does not tell you how to build a map for devastation, so if you are completely new to map editing you should check out [[Legacy:Mapping Lessons|Mapping Lessons]].

==The basics==

The editor is accessed  from Start-&gt;Programs-&gt;Devastation-&gt;Devastation editor. (this seems painfully obvious but i know people who had this game from the day it was released and never worked that out :Rolleyes: )

The first thing is the most commonly asked question ever about unreal ed- OMG my map dissapears when i open the editor! the viewports are white ( In Devastation editor they show the editor icon that you see when it loads up) . RELAX and do view-&gt; viewports-&gt;configure and choose your desired layout.

And try to remember [[Legacy:Team Number|Team Number]]s:
* Team 0=Conformists=Blue
* Team 1=Resistance=Red

When playtesting a multiplayer map from the editor it wont work properly. For example, if you playtest a DDM map through the editor if you kill yourself you will respawn with no weapons at all-even you hands will dissappear- but you can still pick up weapons fine. Dont worry though. It will work fine when actually running on the internet.

As with most other unreal editors out there, be prepared for it to crash. Ive outlined some things you shouldnt do in this page but still, it can crash and freeze up for no reason at all. Save, and save often under different filenames.

==Information on static meshes, prefabs, textures and other resources==

There is a very broad variety of resources available for you to use.

'''Static Meshes .USX'''

The most useful packages in terms on numbers of meshes and variety are the DDecoSm packages. Static meshes from individual maps can be found in thier respective packages, eg static meshes from rivers of waste can be found in the riversofwaste and riversSM packages. or, you could [[Legacy:Create A Static Mesh|create a static mesh]] yourself. There seems to be collision bug with the DDecoSMestreetcleaner which allows you to walk through it like it wasnt there. Simply add a [[Legacy:BlockingVolume|BlockingVolume]] around it to fix the problem. If you are creating a [[Legacy:SkyBox|SkyBox]] you can look in most of the singleplayer packages, or in DSkySM.

As with textures (see below), you should press the &quot;all&quot; tab in the corner of the browser.

'''Textures .UTX'''

The skins for all static meshes can be found within the texture browser.   There is actually many very useful textures, too many to list here, so have a look around in every package and see what you can find. In the texture browser, the exclamation mark button in the top left hand corner is used to preview what textures will look like when put on a surface, IE some textures display moving objects (like a rotating fan).

Its a good idea to press the &quot;all&quot; button, that way all groups will be displayed at once. Eg, if you open UTAPROPS, all you seen are some fan textures, until you press the &quot;all&quot; tab.

Note: DO NOT try to open the UTAcode or Scripted tex. They will crash the editor.

Some useful textures

*Zone portal texture   BuildHelpTex.Zoneportaltex

(more to add when i have a proper look round later)

'''Prefabs .U'''

For some reason, you cannot access the prefab browser from directly under the view menu. So, go into the [[Legacy:Actor Class Browser|Actor class browser]] and select the prefabs tab. You can view most of the prefabs by pressing the AllPkgs button (i dont recommend pressing the AllGrps button though. It usually crashes the editor). Have a look through different decoration packages and see what you can find. You can add prefabs to you map using the middle mouse button, or by right clicking in a 3d viewport in wireframe mode.

'''Sounds .UAX'''

Most of the sound packages contain the character voices used in individual levels, eg SP1M1 cointains all the voice effects used in the first mission. . Use an [[Legacy:AmbientSound|AmbientSound]] to implement a sound in your level.

Most useful sounds (laser fence hacking alarm, flag capture etc) are found in UDAmbeint, although you will have to press the &quot;all&quot; tab.

'''Actor Classes .u'''

Most of the useful actors are found in the DTerritories package. If, when you go to select the [[Legacy:Gametype|Gametype]],all you see is Dgameinfo, then you need to open the DTerritories package to see the full range of game types available. The territories package also contains many of the emitters.

You will also need to open this package in the browser to load the DLaserfence and DLoadout volumes.

==A little note on occlusion==

Devastation adds a new type of zone portal called an Zone antiportal. For more information see the [[Legacy:Antiportal|Antiportal]] page.

==Bugs==

Brush add/subtract scaling.

From what i can tell, this is a very unusual problem which I encountered recently (not for the first time) that makes it impossible to build geometry. Its hard to explain, lets say that you make the [[Legacy:Red Builder Brush|red builder brush]] 512x512x512 and then add it to the world, the actual dimensions of the added brush will come out as maybe 512x512x480. That is, the added brush is smaller than the proper size it should be defined by the builder brush, in one or more directions.

I cant really be more specific, lets just say youll know if you encounter this.

You can fix it very easily by accessing the builder brushes properties -&gt;dispay and resetting the &quot;drawscale 3D&quot; settings all back to 1. The last time this happened to me, one of the drawscale settings was 1.2 instead of one, making the actual brush added (or subtracted) 1/5 too big.

==And the Finale....how to crash the editor==

1: Right clicking on a brush and doing order-&gt; sort order causes a crash

2: Opening certain packages causes crashes

3: Doing anything with fluid surfaces will cause a crash

4: And of course..doing absoloutely nothing at all can result in a crash :)

==Comments==

'''Ragdoll:''' If theres anyone on this wiki that owns Devastation apart from me, feel free to add more to this page and comment on it.</text>
    </revision>
    <revision>
      <id>2862</id>
      <timestamp>2007-02-02T21:07:45Z</timestamp>
      <contributor>
        <ip>Cpc3-bagu1-0-0-cust518.bagu.cable.ntl.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page contains general hints, tips and information about the devastation editor. it operates the same as any other version of [[Legacy:UnrealEd|UnrealEd]] out there, but there are a few unique features/bugs that you should be aware of.

This page does not tell you how to build a map for devastation, so if you are completely new to map editing you should check out [[Legacy:Mapping Lessons|Mapping Lessons]].

==The basics==

The editor is accessed  from Start-&gt;Programs-&gt;Devastation-&gt;Devastation editor. (this seems painfully obvious but i know people who had this game from the day it was released and never worked that out :Rolleyes: )

The first thing is the most commonly asked question ever about unreal ed- OMG my map dissapears when i open the editor! the viewports are white ( In Devastation editor they show the editor icon that you see when it loads up) . RELAX and do view-&gt; viewports-&gt;configure and choose your desired layout.

And try to remember [[Legacy:Team Number|Team Number]]s:
* Team 0=Conformists=Blue
* Team 1=Resistance=Red

When playtesting a multiplayer map from the editor it wont work properly. For example, if you playtest a DDM map through the editor if you kill yourself you will respawn with no weapons at all-even you hands will dissappear- but you can still pick up weapons fine. Dont worry though. It will work fine when actually running on the internet.

As with most other unreal editors out there, be prepared for it to crash. Ive outlined some things you shouldnt do in this page but still, it can crash and freeze up for no reason at all. Save, and save often under different filenames.

==Information on static meshes, prefabs, textures and other resources==

There is a very broad variety of resources available for you to use.

'''Static Meshes .USX'''

The most useful packages in terms on numbers of meshes and variety are the DDecoSm packages. Static meshes from individual maps can be found in thier respective packages, eg static meshes from rivers of waste can be found in the riversofwaste and riversSM packages. or, you could [[Legacy:Create A Static Mesh|create a static mesh]] yourself. There seems to be collision bug with the DDecoSMestreetcleaner which allows you to walk through it like it wasnt there. Simply add a [[Legacy:BlockingVolume|BlockingVolume]] around it to fix the problem. If you are creating a [[Legacy:SkyBox|SkyBox]] you can look in most of the singleplayer packages, or in DSkySM.

As with textures (see below), you should press the &quot;all&quot; tab in the corner of the browser.

'''Textures .UTX'''

The skins for all static meshes can be found within the texture browser.   There is actually many very useful textures, too many to list here, so have a look around in every package and see what you can find. In the texture browser, the exclamation mark button in the top left hand corner is used to preview what textures will look like when put on a surface, IE some textures display moving objects (like a rotating fan).

Its a good idea to press the &quot;all&quot; button, that way all groups will be displayed at once. Eg, if you open UTAPROPS, all you seen are some fan textures, until you press the &quot;all&quot; tab.

Note: DO NOT try to open the UTAcode or Scripted tex. They will crash the editor.

Some useful textures

*Zone portal texture   BuildHelpTex.Zoneportaltex

(more to add when i have a proper look round later)

'''Prefabs .U'''

For some reason, you cannot access the prefab browser from directly under the view menu. So, go into the [[Legacy:Actor Class Browser|Actor class browser]] and select the prefabs tab. You can view most of the prefabs by pressing the AllPkgs button (i dont recommend pressing the AllGrps button though. It usually crashes the editor). Have a look through different decoration packages and see what you can find. You can add prefabs to you map using the middle mouse button, or by right clicking in a 3d viewport in wireframe mode.

'''Sounds .UAX'''

Most of the sound packages contain the character voices used in individual levels, eg SP1M1 cointains all the voice effects used in the first mission. . Use an [[Legacy:AmbientSound|AmbientSound]] to implement a sound in your level.

Most useful sounds (laser fence hacking alarm, flag capture etc) are found in UDAmbeint, although you will have to press the &quot;all&quot; tab.

'''Actor Classes .u'''

Most of the useful actors are found in the DTerritories package. If, when you go to select the [[Legacy:Gametype|Gametype]],all you see is Dgameinfo, then you need to open the DTerritories package to see the full range of game types available. The territories package also contains many of the emitters.

You will also need to open this package in the browser to load the DLaserfence and DLoadout volumes.

==A little note on occlusion==

Devastation adds a new type of zone portal called an Zone antiportal. For more information see the [[Legacy:Antiportal|Antiportal]] page.

==Bugs==

Brush add/subtract scaling.

From what i can tell, this is a very unusual problem which I encountered recently (not for the first time) that makes it impossible to build geometry. Its hard to explain, lets say that you make the [[Legacy:Red Builder Brush|red builder brush]] 512x512x512 and then add it to the world, the actual dimensions of the added brush will come out as maybe 512x512x480. That is, the added brush is smaller than the proper size it should be defined by the builder brush, in one or more directions.

I cant really be more specific, lets just say youll know if you encounter this.

You can fix it very easily by accessing the builder brushes properties -&gt;dispay and resetting the &quot;drawscale 3D&quot; settings all back to 1. The last time this happened to me, one of the drawscale settings was 1.2 instead of one, making the actual brush added (or subtracted) 1/5 too big.

==And the Finale....how to crash the editor==

1: Right clicking on a brush and doing order-&gt; sort order causes a crash

2: Opening certain packages causes crashes

3: Doing anything with fluid surfaces will cause a crash

4: And of course..doing absoloutely nothing at all can result in a crash :)

==Comments==

'''Ragdoll:''' If theres anyone on this wiki that owns Devastation apart from me, feel free to add more to this page and comment on it.

'''AJRAD:''' Yeah me, I'll take care of it^^</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devastation</title>
    <id>997</id>
    <revision>
      <id>2688</id>
      <timestamp>2006-11-28T18:48:43Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Linked to Unreal Engine Versions/2</comment>
      <text xml:space="preserve">'''Devastation''' - Resistance breeds revolution.

The '''''Official''''' web site: http://www.devastationgame.co.uk/

For information regarding the different Unreal engine builds visit [[Legacy:Unreal Engine Versions|Unreal Engine Versions]].

See also the [[Legacy:Devastation Troubleshooting FAQ|Devastation Troubleshooting FAQ]] (doesn't exist yet).

The current version of Devastation is 390.  Version 390 finally allows American and European (unless you are French or Russian) players to join the same server.  This version is not network compatable or mod compatable with previous versions of Devastation.

The devastation master server doesn't seem to be operation and so you cannot join games from within the multiplayer menu. You can play online with a program called the All Seeing Eye, available [http://devastation.filefront.com/file/The_AllSeeingEye;29507 Here]

==Devastation Storyline ==

If you are thinking of purchasing devastation, or you arrived at this page and need something good to read :-) this is the storyline behind devastation.

The year is 2075. Instead of a bright and peaceful utopia, a corrupt mega corporation named &quot;Grathius&quot; controls the world by force, using pacification squads to kill any who oppose them.

You are Flynn Haskell, the leader of a small band of resistance fighters determined to rid the world of grathius and thier evil schemes. You have to stop focusing on small scale objectives and take the fight for freedom all the way to the top. 

It just so happens the pac-squad oppressors have a nanotechnology cloning machine developed by grathius scientists to resurrect fallen troops. I won't spoil anything for you, lets just say these cloning machines will come in handy for your resistance team.....

==Wiki Information ==

New material should be linked from this page for the time being.  It maybe linked to from the [[Legacy:Home Page|Home Page]] in the future.

==Related Topics==

* [[Legacy:Devastation Wiki Content|Devastation Wiki Content]] &amp;ndash; Information on making mods for Devastation
* [[Legacy:Devastation Dedicated Server|Devastation Dedicated Server]] &amp;ndash; Running and configuring a Devastation server.
* [[Legacy:Devastation/Known Command Line Switches|Devastation/Known Command Line Switches]] &amp;ndash; Known command line switches for devastation.exe
* [[Legacy:Devastation Console Commands|Devastation Console Commands]] &amp;ndash; A definition of all of the known console commands specific to Devastation.  See [[Legacy:Console Commands|Console Commands]] for all of the possible console commands.
* [[Legacy:Mapping For Territories|Mapping For Territories]]
* [[Legacy:Devastation Bugs List|Devastation Bugs list]]
* [[Legacy:DevastatED|DevastatED]]
* [[Legacy:Alternative Devastation Gametypes|Alternative Devastation gametypes]]

==System Requirements ==

==Minimum==

'''Processor:''' AMD/pentuim 733mhz 

'''Operating system:'''Windows 95/98/ME/XP

'''RAM:'''128MB

'''Graphics:'''32MB with T&amp;L abilities

'''Sound:'''Any windows compatible sound card, no real recommendations.

'''Hard drive:''' 1GB free space

These are the absolute MINIMUM requirements. With those specs, don't expect the game to run well or look nice.

==Recommended==

'''Processor:''' AMD/pentium 1GHZ or higher

'''Operating system:''' Windows XP

'''RAM:'''At least 256MB. More is always better, I recommend 512MB.

'''Graphics:''' 64MB ATI Radeon/nVidea GeForce. For optimum performance, go with 128 or 256 MB video memory.

'''Sound:'''Any windows sound card.

A 2.0 GHZ processor, 512MB RAM and radeon 9550 should be suffice to run this game to its full potential.

==Related Topics==
* [[Legacy:Unreal Engine Versions/2|Unreal Engine Versions/2]]

----

[[:Category:Legacy Game]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash;  Convert to common page layout. See [[Legacy:UT2003|UT2003]] for the layout.
[[Category:Legacy Game|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2689</id>
      <timestamp>2005-11-30T12:55:22Z</timestamp>
      <contributor>
        <ip>128.146.88.94</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Devastation''' - Resistance breeds revolution.

The '''''Official''''' web site: http://www.devastationgame.co.uk/

For information regarding the different Unreal engine builds visit [[Legacy:Unreal Engine Versions|Unreal Engine Versions]].

See also the [[Legacy:Devastation Troubleshooting FAQ|Devastation Troubleshooting FAQ]] (doesn't exist yet).

The current version of Devastation is 390.  Version 390 finally allows American and European (unless you are French or Russian) players to join the same server.  This version is not network compatable or mod compatable with previous versions of Devastation.

The devastation master server doesn't seem to be operation and so you cannot join games from within the multiplayer menu. You can play online with a program called the All Seeing Eye, available [http://devastation.filefront.com/file/The_AllSeeingEye;29507 Here]

==Devastation Storyline ==

If you are thinking of purchasing devastation, or you arrived at this page and need something good to read :-) this is the storyline behind devastation.

The year is 2075. Instead of a bright and peaceful utopia, a corrupt mega corporation named &quot;Grathius&quot; controls the world by force, using pacification squads to kill any who oppose them.

You are Flynn Haskell, the leader of a small band of resistance fighters determined to rid the world of grathius and thier evil schemes. You have to stop focusing on small scale objectives and take the fight for freedom all the way to the top. 

It just so happens the pac-squad oppressors have a nanotechnology cloning machine developed by grathius scientists to resurrect fallen troops. I won't spoil anything for you, lets just say these cloning machines will come in handy for your resistance team.....

==Wiki Information ==

New material should be linked from this page for the time being.  It maybe linked to from the [[Legacy:Home Page|Home Page]] in the future.

==Related Topics==

* [[Legacy:Devastation Wiki Content|Devastation Wiki Content]] &amp;ndash; Information on making mods for Devastation
* [[Legacy:Devastation Dedicated Server|Devastation Dedicated Server]] &amp;ndash; Running and configuring a Devastation server.
* [[Legacy:Devastation/Known Command Line Switches|Devastation/Known Command Line Switches]] &amp;ndash; Known command line switches for devastation.exe
* [[Legacy:Devastation Console Commands|Devastation Console Commands]] &amp;ndash; A definition of all of the known console commands specific to Devastation.  See [[Legacy:Console Commands|Console Commands]] for all of the possible console commands.
* [[Legacy:Mapping For Territories|Mapping For Territories]]
* [[Legacy:Devastation Bugs List|Devastation Bugs list]]
* [[Legacy:DevastatED|DevastatED]]
* [[Legacy:Alternative Devastation Gametypes|Alternative Devastation gametypes]]

==System Requirements ==

==Minimum==

'''Processor:''' AMD/pentuim 733mhz 

'''Operating system:'''Windows 95/98/ME/XP

'''RAM:'''128MB

'''Graphics:'''32MB with T&amp;L abilities

'''Sound:'''Any windows compatible sound card, no real recommendations.

'''Hard drive:''' 1GB free space

These are the absolute MINIMUM requirements. With those specs, don't expect the game to run well or look nice.

==Recommended==

'''Processor:''' AMD/pentium 1GHZ or higher

'''Operating system:''' Windows XP

'''RAM:'''At least 256MB. More is always better, I recommend 512MB.

'''Graphics:''' 64MB ATI Radeon/nVidea GeForce. For optimum performance, go with 128 or 256 MB video memory.

'''Sound:'''Any windows sound card.

A 2.0 GHZ processor, 512MB RAM and radeon 9550 should be suffice to run this game to its full potential.

[[Category:Legacy Game|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devastation Bugs List</title>
    <id>1072</id>
    <revision>
      <id>2848</id>
      <timestamp>2006-04-19T16:22:42Z</timestamp>
      <contributor>
        <ip>87-196-46-147.net.novis.pt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==The comprehensive Devastation bug list ==

Now dont get me wrong here, [[Legacy:Devastation|Devastation]] is a great game and im totally addicted to it, but i feel the need to document all the bugs you are likely to encounter on both singleplayer and multiplayer and some possible workarounds or fixes.

==Multiplayer ==

==The miltary sniper/ Springbok rifle aiming bug.==

This can happen on any map, but it affects me the worst on DTT- SniperCanyon.

This is without a doubt the most frustrating bug you will find. Imagine you have some unlucky person lined up perfectly in your sniper crosshairs and you fire. One of four things will happen-

# you hit them, and thanks to our friend the unreal engine they fall to the ground and crumple in an incredibly realistic fashion.

# You have terrible aim and you miss the target by a fraction but you see the bullet hit whatevers behind the target.

# The gun fires, but nothing happens ie you dont hit the target and nothing happens to the spot where the crosshairs were lined up on. Basically, the gun fires but no bullet comes out.

# The gun fires, the bullet comes out but its WAY off target. It hits a good 300 or so unreal units away from where it should be.

Note- none of these problems seem to affect the P*Laser.

If you find you have problem #3 or #4, there really isnt much you can do unfortunately. If you have a springbok, empty a few magazines of bullets and keep trying to train the gun on target- although you can fire 36 bullets from a springbok and still not have it work. I suggest before going for a sniper that you fire a &quot;test&quot; shot to check your gun works. If you have the miltary sniper, keep firing and reloading. Talking of reloading......

==The reload bugs.==

first off the miltary sniper. Its a conventional bolt action one shot weapon that requires you to draw back the bolt after each shot. in Multiplayer though, you have to reload it twice after each shot IE you fire the gun, you draw back the bolt and reload and then return the gun to its firing position, but then it reloads again. not really a big problem and not too frustrating, but its nice to be aware of anyway.

occasionally, with all guns, even after a proper reload the bullet count doesnt change. just reload again to fix the problem.

You find a problem simular to the sniper reload bug with the cobra cannon. if you reload the gun with any amount of bullets in it, it works fine. but if you run out of bullets while firing, you have to go through the tedious reload procedure twice.

Sometimes, most likely in a streetwar, you pick up two 9mm SMGs that have 125/60 bullets in the counter. It doesnt take a mathmatician to work out that if one smg holds 36 bullets then 2 hold 72 and somethings a bit off if you have 125 bullets.Im not entirely sure what causes this problem, but its probably something to do with reloading or picking up extra ammo. Just reload to return the bullet count to normal. (or you could keep firing all the bullets; you dont have to reload as much = )This can happen in all of the SMGs and handguns.

A little thing i discovered by accident- the infinite ammo &quot;cheat&quot; for SMGs. Take two micro vipers and fire them till you have 2/0 bullets in the counter. Now, switch to 1 micro viper (by pressing alt-fire,usually right mouse button) . The counter should display 1/1 bullets. Reload the single micro viper and the counter should display 2/0 bullets. Now, switch back to 2 micro vipers and viola! 4/0 bullets in the counter. if you keep doing this you can end up very quickly with 100/0 bullets. You can do this is all of the SMGs and handguns.

==Singleplayer Bugs ==

==Completing objectives out of order==

So far, i have only run into this problem on Chozo, but im sure it will happen on other maps too. Basically, there is a set order of objectives and the level ends when they are all fulfilled. Now, technically the order in which they are completed shouldnt really matter, but seemingly it does. In Chozo, the objectives read-

1: defend the base/ eliminate remaining attackers

2: Download the security code

3: Hack the enemy laser fences

4: destroy the spawner

Now what i did after obective #1 was completed was to send two rat drones to destroy the spawner. When i did i got the &quot;objective completed&quot; message. this is the last objective, but becasue it was fulfilled before it was supposed to be, it messes up the rest of the game. Even if i got the codes and hacked the fences, nothing happened, The level just kept on running no matter what i did. The lesson- if it says &quot;hack the fences&quot; before &quot;destroy the spawner&quot;, DO IT!

You also find a simular problem on multiplayer if the spawner is destroyed before hacking a fence. Although this shouldnt be possible theres bugs on some maps (Union *cough* *cough*) which allow this to happen.

I ran into a similar problem in The rock, and im totally clueless as to what caused it. Bascically, the level got totally screwed up and stopped registering completed objectives and when i got to the end of the tunnel where the boat is, the level didnt end as it was supposed to but allowed me to drop off the end of the tunnel and into the skybox terrain parts outside the level. The drop should have killed me, but i ended up with -20 health. So, here i am, outside the level in a part i was never supposed to be with - 20 health and a screwed up objective manager. Time to restart the level i think.

Still more too add, so if you find any more bugs/fixes, feel free to add them here.

The horrid respawn bug

During most of the game I got a horrid bug everytime I respawned. For one, I had to press continuously on 

the &quot;B&quot; key before the weapons list would finally show up. Now, after that, I had to choose my weapons on

and on and on until they finally showed up in my hands. Add both things and you'll be able to guess how

very tedious all that was. 

The back to the desktop bug

Yes, indeed. I got thrown back to my desktop loads of times, always during action scenes (and the game is

precisely about action). Fortunately, the game would do some sort of emmergence save most of the times it

happened. But not everytime.

Thank you for letting me cooperate.

Bukko - don't use the rat drone!

This isn't really a bug, just something I believe wasn't clearly thought of and I think I should leave a

word of warning... In the Bukko level you can use a rat drone to destroy the spawn machine inside the Nako 

Naki building. I did. Don't make the same mistake! Afterwards, the machine can't be really fixed (or wasn't

in my game - it's so full of bugs I can't tell anymore), so that everytime you die you'll come back there

but it'll be impossible for you to choose guns. Meaning you'll have to walk miles back to another spawner

to get the weapons you need - everytime! Very annoying.

Killing Jonathan

Just one last thing. It's not a bug, more like a rat, but I think it can prove useful. The easiest way to

kill Jonathan in the last level, although I haven't seen it mentioned like that anywhere, is to use rat

drones and complement them with a heavy weapon. After disconneting (or connecting, whatever) the two tower

devices and taking care of all the other meanies around, approach the place where Jonathan without being

seen (on the left) and use rat drones to hit him about three or four times. Then, climb up the stairs and 

start shooting. He'll die and you'll be able to shoot the blueish light above his dead body, which is what

you have to do. Then you may die, respawn and startit over a few times until he finally disappears with a

bang.

[[Category:Legacy Feedback|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2849</id>
      <timestamp>2006-04-17T23:50:28Z</timestamp>
      <contributor>
        <ip>87-196-37-151.net.novis.pt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==The comprehensive Devastation bug list ==

Now dont get me wrong here, [[Legacy:Devastation|Devastation]] is a great game and im totally addicted to it, but i feel the need to document all the bugs you are likely to encounter on both singleplayer and multiplayer and some possible workarounds or fixes.

==Multiplayer ==

==The miltary sniper/ Springbok rifle aiming bug.==

This can happen on any map, but it affects me the worst on DTT- SniperCanyon.

This is without a doubt the most frustrating bug you will find. Imagine you have some unlucky person lined up perfectly in your sniper crosshairs and you fire. One of four things will happen-

# you hit them, and thanks to our friend the unreal engine they fall to the ground and crumple in an incredibly realistic fashion.

# You have terrible aim and you miss the target by a fraction but you see the bullet hit whatevers behind the target.

# The gun fires, but nothing happens ie you dont hit the target and nothing happens to the spot where the crosshairs were lined up on. Basically, the gun fires but no bullet comes out.

# The gun fires, the bullet comes out but its WAY off target. It hits a good 300 or so unreal units away from where it should be.

Note- none of these problems seem to affect the P*Laser.

If you find you have problem #3 or #4, there really isnt much you can do unfortunately. If you have a springbok, empty a few magazines of bullets and keep trying to train the gun on target- although you can fire 36 bullets from a springbok and still not have it work. I suggest before going for a sniper that you fire a &quot;test&quot; shot to check your gun works. If you have the miltary sniper, keep firing and reloading. Talking of reloading......

==The reload bugs.==

first off the miltary sniper. Its a conventional bolt action one shot weapon that requires you to draw back the bolt after each shot. in Multiplayer though, you have to reload it twice after each shot IE you fire the gun, you draw back the bolt and reload and then return the gun to its firing position, but then it reloads again. not really a big problem and not too frustrating, but its nice to be aware of anyway.

occasionally, with all guns, even after a proper reload the bullet count doesnt change. just reload again to fix the problem.

You find a problem simular to the sniper reload bug with the cobra cannon. if you reload the gun with any amount of bullets in it, it works fine. but if you run out of bullets while firing, you have to go through the tedious reload procedure twice.

Sometimes, most likely in a streetwar, you pick up two 9mm SMGs that have 125/60 bullets in the counter. It doesnt take a mathmatician to work out that if one smg holds 36 bullets then 2 hold 72 and somethings a bit off if you have 125 bullets.Im not entirely sure what causes this problem, but its probably something to do with reloading or picking up extra ammo. Just reload to return the bullet count to normal. (or you could keep firing all the bullets; you dont have to reload as much = )This can happen in all of the SMGs and handguns.

A little thing i discovered by accident- the infinite ammo &quot;cheat&quot; for SMGs. Take two micro vipers and fire them till you have 2/0 bullets in the counter. Now, switch to 1 micro viper (by pressing alt-fire,usually right mouse button) . The counter should display 1/1 bullets. Reload the single micro viper and the counter should display 2/0 bullets. Now, switch back to 2 micro vipers and viola! 4/0 bullets in the counter. if you keep doing this you can end up very quickly with 100/0 bullets. You can do this is all of the SMGs and handguns.

==Singleplayer Bugs ==

==Completing objectives out of order==

So far, i have only run into this problem on Chozo, but im sure it will happen on other maps too. Basically, there is a set order of objectives and the level ends when they are all fulfilled. Now, technically the order in which they are completed shouldnt really matter, but seemingly it does. In Chozo, the objectives read-

1: defend the base/ eliminate remaining attackers

2: Download the security code

3: Hack the enemy laser fences

4: destroy the spawner

Now what i did after obective #1 was completed was to send two rat drones to destroy the spawner. When i did i got the &quot;objective completed&quot; message. this is the last objective, but becasue it was fulfilled before it was supposed to be, it messes up the rest of the game. Even if i got the codes and hacked the fences, nothing happened, The level just kept on running no matter what i did. The lesson- if it says &quot;hack the fences&quot; before &quot;destroy the spawner&quot;, DO IT!

You also find a simular problem on multiplayer if the spawner is destroyed before hacking a fence. Although this shouldnt be possible theres bugs on some maps (Union *cough* *cough*) which allow this to happen.

I ran into a similar problem in The rock, and im totally clueless as to what caused it. Bascically, the level got totally screwed up and stopped registering completed objectives and when i got to the end of the tunnel where the boat is, the level didnt end as it was supposed to but allowed me to drop off the end of the tunnel and into the skybox terrain parts outside the level. The drop should have killed me, but i ended up with -20 health. So, here i am, outside the level in a part i was never supposed to be with - 20 health and a screwed up objective manager. Time to restart the level i think.

Still more too add, so if you find any more bugs/fixes, feel free to add them here.

The horrid respawn bug

During most of the game I got a horrid bug everytime I respawned. For one, I had to press continuously on 

the &quot;B&quot; key before the weapons list would finally show up. Now, after that, I had to choose my weapons on

and on and on until they finally showed up in my hands. Add both things and you'll be able to guess how

very tedious all that was. 

The back to the desktop bug

Yes, indeed. I got thrown back to my desktop loads of times, always during action scenes (and the game is

precisely about action). Fortunately, the game would do some sort of emmergence save most of the times it

happened. But not everytime.

Thank you for letting me cooperate.

Bukko - don't use the rat drone!

This isn't really a bug, just something I believe wasn't clearly thought of and I think I should leave a

word of warning... In the Bukko level you can use a rat drone to destroy the spawn machine inside the Nako 

Naki building. I did. Don't make the same mistake! Afterwards, the machine can't be really fixed (or wasn't

in my game - it's so full of bugs I can't tell anymore), so that everytime you die you'll come back there

but it'll be impossible for you to choose guns. Meaning you'll have to walk miles back to another spawner

to get the weapons you need - everytime! Very annoying.

[[Category:Legacy Feedback|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devastation Console Commands</title>
    <id>1003</id>
    <revision>
      <id>2700</id>
      <timestamp>2005-06-04T21:25:11Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page describes all of the console commands specific to the game [[Legacy:Devastation|Devastation]].

==Non Cheat Console Commands ==

These console commands can be activated at any time whether cheat mode is enabled or not.

; ToggleCrosshair : Turns the crosshair on and off.
; NextCrosshair : Selects the next available crosshair.
; SetCrosshair &lt;number&gt; : Sets the crosshair to the crosshair at position &lt;number&gt; in the list.
; RescueTeam : This command respawns all of your team mates at your current location.
; Oppression : This command resets your current progress through the game.
; ShowRadio : This command shows a small &quot;radio&quot; that lists the current tracks installed in the music directory.  A track can be selected and played.
; HideRadio : This command closes the radio window.  Any track currently playing will continue.
; ToggleVersion : This command toggles the display of the current version of the game.

==View mode controls ==

; rmode 1 : View the game as a wireframe like in the editor. Very useful for checking occlusion efficiency.
; rmode 2: Zone portal. Use this to check [[Legacy:Zoning|zoning]] or to find a pesky [[Legacy:BSP Hole|BSP Hole]]
; rmode 3 : Texture use
; rmode 4 : BSP cuts view.
; rmode 5 : Return to normal view (dynamic light, textured)
; rmode 6 : Textured (no lighting)
; rmode 7 : Lighting only (dynamic light, no textures).

==Cheat Console Commands ==

To access these commands the INI file setting ''bNoCheating=False'' must be set.  In a multiplayer game you must also be logged in as an admin.

; SetHeads &lt;name&gt; : This command can be used to change the head models of the players (including bots).  The value of ''name'' determines which head will be displayed.  There are shotcut console commands for some of these.  Possible values for ''name'' are:
; * Horse  ''Shorcutcut console command = horseheads''
; * Pig  ''Shorcutcut console command = pigheads''
; * Rat  ''Shorcutcut console command = ratheads''
; * Crab  
; * Lobster
; * Skeleton
; * Dragon
; * Dreenk

; OffWithTheirHeads : Removes all of the heads from all players (including bots) in the game.
; BigHeads : Makes all players (including bots) have heads about twice the size of normal.
; ClearCheatHeads : Returns everyone's heads back to normal.
; HurtMe &lt;amount&gt; : Inflicts ''amount'' points worth of damage on yourself.
; DopeFish : This command gives you all of the weapons, bucket loads of cash, and the ability to carry anything.  It also selects the P*Laser.
; Postal : This command gives you all of the weapons and selects the Cobra Cannon.
; HeMan : This command enables you to carry as much as you like without becoming encumbered.  It also displays a quaint message in network games.
; CheatGetWeapon &lt;package&gt;.&lt;class&gt; : This command will add the specified weapon to your inventory and select it.  A list of weapon class names for use with this command is given below.
; CheatGetInventory &lt;package&gt;.&lt;class&gt; : This command will give you the specified item of inventory.  A list of inventory item class names for use with this command is given below.
; Moolah : This command gives you 10,000 dollars to spend.
; OpenFullMode : This command unlocks all of the game maps and scenarios.

===Weapon List ===

'''NOTE:''' These classes cannot be created dynamically in a map using the ''summon'' console command.  Instead the class DWeaponPickup must be used &amp;ndash; this is still under investigation.

{|

|-
|AssaultRifle
|DInventory.DAssaultRifle
|-
|Tiko
|DInventory.AutoMag Tiko 
|-
|2 x 4
|DInventory.DBigStick 
|-
|Billy club
|DInventory.DBillyClub 
|-
|Bolta
|DInventory.DBolta 
|-
|Bottle
|DInventory.DBottle 
|-
|KLUM shotgun
|DInventory.DBullpup 
|-
|Cobra Cannon
|DInventory.DCobraCannon 
|-
|45 Auto
|DInventory.DColt 
|-
|45 match
|DInventory.DColtPlus 
|-
|D4 ParaSniper rifle
|DInventory.DD4Sniper 
|-
|Flash grenade
|DInventory.DFlashGrenade 
|-
|Nailgun
|DInventory.DFlechette 
|-
|Gas grenade
|DInventory.DGasGrenade 
|-
|Frag grenade
|DInventory.DGrenade 
|-
|Katana
|DInventory.DKatana 
|-
|Knife
|DInventory.DKnife 
|-
|P*Laser
|DInventory.DLaserRifle 
|-
|Micro viper
|DInventory.DMicroViper 
|-
|Military sniper rifle
|DInventory.DMilitarySniper 
|-
|Minigun
|DInventory.DMinigun 
|-
|9mm Auto
|DInventory.DNineMM 
|-
|9mm Match
|DInventory.DNineMMPlus 
|-
|9mm SMG
|DInventory.DNineSMG 
|-
|Hands
|DInventory.DPunchHands 
|-
|Rat drone
|DInventory.DRatDrone 
|-
|Riot pump action shotgun
|DInventory.DRiotPump 
|-
|Smoke grenade
|DInventory.DSmokeGrenade 
|-
|Springbok sniper rifle
|DInventory.DSniper 
|}

===Inventory List ===

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2701</id>
      <timestamp>2005-01-14T03:40:01Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">This page describes all of the console commands specific to the game [[Legacy:Devastation|Devastation]].

==Non Cheat Console Commands ==

These console commands can be activated at any time whether cheat mode is enabled or not.

; ToggleCrosshair : Turns the crosshair on and off.
; NextCrosshair : Selects the next available crosshair.
; SetCrosshair &lt;number&gt; : Sets the crosshair to the crosshair at position &lt;number&gt; in the list.
; RescueTeam : This command respawns all of your team mates at your current location.
; Oppression : This command resets your current progress through the game.
; ShowRadio : This command shows a small &quot;radio&quot; that lists the current tracks installed in the music directory.  A track can be selected and played.
; HideRadio : This command closes the radio window.  Any track currently playing will continue.
; ToggleVersion : This command toggles the display of the current version of the game.

==Cheat Console Commands ==

To access these commands the INI file setting ''bNoCheating=False'' must be set.  In a multiplayer game you must also be logged in as an admin.

; SetHeads &lt;name&gt; : This command can be used to change the head models of the players (including bots).  The value of ''name'' determines which head will be displayed.  There are shotcut console commands for some of these.  Possible values for ''name'' are:
; * Horse  ''Shorcutcut console command = horseheads''
; * Pig  ''Shorcutcut console command = pigheads''
; * Rat  ''Shorcutcut console command = ratheads''
; * Crab  
; * Lobster
; * Skeleton
; * Dragon
; * Dreenk

; OffWithTheirHeads : Removes all of the heads from all players (including bots) in the game.
; BigHeads : Makes all players (including bots) have heads about twice the size of normal.
; ClearCheatHeads : Returns everyone's heads back to normal.
; HurtMe &lt;amount&gt; : Inflicts ''amount'' points worth of damage on yourself.
; DopeFish : This command gives you all of the weapons, bucket loads of cash, and the ability to carry anything.  It also selects the P*Laser.
; Postal : This command gives you all of the weapons and selects the Cobra Cannon.
; HeMan : This command enables you to carry as much as you like without becoming encumbered.  It also displays a quaint message in network games.
; CheatGetWeapon &lt;package&gt;.&lt;class&gt; : This command will add the specified weapon to your inventory and select it.  A list of weapon class names for use with this command is given below.
; CheatGetInventory &lt;package&gt;.&lt;class&gt; : This command will give you the specified item of inventory.  A list of inventory item class names for use with this command is given below.
; Moolah : This command gives you 10,000 dollars to spend.
; OpenFullMode : This command unlocks all of the game maps and scenarios.

===Weapon List ===

'''NOTE:''' These classes cannot be created dynamically in a map using the ''summon'' console command.  Instead the class DWeaponPickup must be used &amp;ndash; this is still under investigation.

{|

|-
|AssaultRifle
|DInventory.DAssaultRifle
|-
|Tiko
|DInventory.AutoMag Tiko 
|-
|2 x 4
|DInventory.DBigStick 
|-
|Billy club
|DInventory.DBillyClub 
|-
|Bolta
|DInventory.DBolta 
|-
|Bottle
|DInventory.DBottle 
|-
|KLUM shotgun
|DInventory.DBullpup 
|-
|Cobra Cannon
|DInventory.DCobraCannon 
|-
|45 Auto
|DInventory.DColt 
|-
|45 match
|DInventory.DColtPlus 
|-
|D4 ParaSniper rifle
|DInventory.DD4Sniper 
|-
|Flash grenade
|DInventory.DFlashGrenade 
|-
|Nailgun
|DInventory.DFlechette 
|-
|Gas grenade
|DInventory.DGasGrenade 
|-
|Frag grenade
|DInventory.DGrenade 
|-
|Katana
|DInventory.DKatana 
|-
|Knife
|DInventory.DKnife 
|-
|P*Laser
|DInventory.DLaserRifle 
|-
|Micro viper
|DInventory.DMicroViper 
|-
|Military sniper rifle
|DInventory.DMilitarySniper 
|-
|Minigun
|DInventory.DMinigun 
|-
|9mm Auto
|DInventory.DNineMM 
|-
|9mm Match
|DInventory.DNineMMPlus 
|-
|9mm SMG
|DInventory.DNineSMG 
|-
|Hands
|DInventory.DPunchHands 
|-
|Rat drone
|DInventory.DRatDrone 
|-
|Riot pump action shotgun
|DInventory.DRiotPump 
|-
|Smoke grenade
|DInventory.DSmokeGrenade 
|-
|Springbok sniper rifle
|DInventory.DSniper 
|}

===Inventory List ===

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devastation Dedicated Server</title>
    <id>998</id>
    <revision>
      <id>2690</id>
      <timestamp>2005-05-22T18:48:52Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <comment>It is the actual command to start the server that i am confused over</comment>
      <text xml:space="preserve">==Some Suprises ==

For those of you who are used to running up servers based on the Unreal engine (see [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]) you'll find a couple of differences that may throw you slightly.
* The INI files are not held within the ''Devastation/System'' directory.  Instead they are held in a directory under your &quot;My Documents&quot; folder.  The advantage to this is that if you have multiple users on a single PC they can all have different key configurations.  The disadvantage is that if you forget you'll be left looking in the ''Devastation/System'' directory wondering where the hell your configuration information went.
* The ''ucc server'' notation is not the preferred way to start the dedicated server although it still works fine.  Instead ''devastation.exe -server'' is used.  The latter form runs the server as a windows tray icon.  Right clicking on this icon provides access to a server console and other information.

'''NOTE:'''  The unpatched retail release (pre version 380) and MP demo currently have some known scaling problems with the server code.  The server code will not scale to more than around 10-12 players.  Digitalo are working on a patch for this but until then try and keep the number of players to 10.
:'''Digitalo:''' Yes, we are working on this.

'''NOTE:''' Much of the information contained within this page applies also to the Devastation MP demo.  If something doesn't work on the MP Demo then the function is most likely only available in the retail version.

==Configuring the Server ==

There are two main ways of getting configuration information into the server.  One is via the command line used to start the server and the other is within the INI file the server will use.  This guide will use the INI method as it seems to be better supported within the game.  This set up guide will assume that the following command has been run to create a &quot;clean&quot; ini file from which to ammend the server settings.

  devastation.exe -server ini=devsvr.ini log=devsvr.log

After running the above command you will see the following things:
* A devastation server icon in your system tray.  This is the server process itself.
* A new file called devsvr.ini within ''My Documents/Devastation''.  This is the INI file that will be used by the server to obtain it's configuration information.
* A new file called devsvr.log within ''My Documents/Devastation''.  This is the log file the server records.  If you server crashes then this file may contain useful information that will help track down the cause of the problem.

Shut that server down by right-clicking on it and selecting the ''Exit server'' option.  By default it will be running the &quot;Entry&quot; map.  No-one can actually join that map so it's not that useful.  However, we now have an INI file that we can modify.

'''NOTE:''' Please see the Linux section below for differences on that operating system.

===Game Ports ===

A server running on the default port of 7777 will send and receive UDP messagess on the following ports: 7777, 7778, 8777, 10777.

The first two ports listed above (7777, 7778) change as the main server port is changed.   7777 becomes ''port'' and 7778 becomes ''port + 1''.  So, if a server was started on port 6000 then the following ports would be used: 6000, 6001, 8777, 10777.

You can determine the ports your server is using by performing the following steps.
* Open up a command line prompt
* Run the command ''netstat -a'' 
* Start the devastation server passing in the port you wish to run the server on and the ini file you wish to use.
* Run the command ''netstat -a'' again.

The ports listed after the second netstat command that are not listed after the first netstat command are those required by your server.

===Starting the Server ===

The following is the general format for starting a server:

  devastation.exe ''map name?parameters'' -server port=''listening port'' ini=''ini filename'' log=''log filename''

So to start a CTF map with a 10 cap limit and a 60 minute timeout listening on port 8777 using our own devsvr ini and log files the following command would be entered.

  devastation CTF-Union?caplimit=10?timeout=60 -server port=8777 ini=devsvr.ini log=devsvr.log

Note that the original ''ucc server'' command also works for starting a server.  Some people have reported a slight improvement in server performance when using this syntax over running the server via devastation.exe.  An example is shown below:

  ucc server CTF-Union?caplimit=10?timeout=60 port=8777 ini=devsvr.ini log=devsvr.log

Rather than run as a tray icon this will run the server up in a shell window.

===Game Parameters ===

The following parameters can be used either as part of the command line or as part of the ''MapParams[n]'' line in the INI file (described below).  All parameters are ? separated.

; game : The game type of the map.  Valid values for the demo are ''DTerritories.DCTFGameInfo'', and ''DGamePlay.DTeamStreetWarGI''.  The maps shipped with the demo seem to have the gametype set within the map so this parameter may not be required.
; timelimit : The number of minutes the map will run for.  Be aware that if you set both the time limit and the score limit (frag limit or cap limit) both to zero then the game will automatically set a 20 minute time out rather than start a server that will play a single map forever.  This behaviour is explicity coded into the game. ''Is there an &quot;extra time&quot; function for CTF games and the like?''
; fraglimit : The number of frags required to win the game.  In CTF games this parameter can also be used to set the cap limit.  Be aware that if you set both the time limit and the score limit (frag limit or cap limit) both to zero then the game will automatically set a 20 minute time out rather than start a server that will play a single map forever.  This behaviour is explicity coded into the game.
; caplimit : The number of flag captures required to win the game.  This parameter will take precedence over any value passed in using the fraglimit parameter.  Be aware that if you set both the time limit and the score limit (frag limit or cap limit) both to zero then the game will automatically set a 20 minute time out rather than start a server that will play a single map forever.  This behaviour is explicity coded into the game.
; roundlimit :  Allows the number of Territories rounds to be specified.  This value determines the number of times a map is played before the map changes.  This value is not supported in the MP Demo.
; roundtimelimit :  This specifies the amount of time in minutes that each Territories round may last.
; suddendeathseconds :  This specifes the amount of time in seconds that any &quot;sudden death&quot; period can last before a draw is declared.
; KarmaMP :  Can be set to True (or 1) to enable Karma Physics in multiplayer.  '''Do not''' do this unless your server is an absoloute beast of a machine and everyone has LAN connections.  The default value is False (0).  Players will not be able to move objects unless this is set.
; GameMode :  This parameter can be used to place the game in arcade mode or simulation mode.  A value of &quot;arcade&quot; ''or'' 0 will put the game into arcade mode.  A value of &quot;simulation&quot; ''or'' 1 will put the game into simulation mode.  Players are able to pick up and throw objects in either game mode as long as ''KarmaMP'' is enabled.
; PktLoss : Can be used to simulate an amount of packet loss. Values can range from 0 to ??. Mostly useful for development.
; PktLag : Can be used to simlutate an amount of lag.  Values can range from 0 to ??. Mostly useful for development.

The following values have been taken from an inspection of the code and have not been tested.  They may not be useable.
; GameSpeed : Overrides the default gamespeed set within the INI file.
; Mutator : Support for comma delimited lists of mutators seems to have been left in \o/
; GamePassword : Can be used to set the game password, and overrides the value within the INI file.
; LocalLog : True if stats should be logged locally, otherwise False.  Defaults to True.
; WorldLog : True if stats should be sent to the &quot;World Log&quot;, otherwise False.  Defaults to True.
; restart : Can be used to restart the current map using all previous specified values.  Changes to the previous configuration can then be made by re-specifying values for specific parameters (or adding new ones)
; DefaultDelay : The default respawn delay time for Territories
; AccessCenter : The default class to use for an &quot;access center&quot;.
; SpawnCenter : The default class to use for a &quot;spawn center&quot;.
; BotManager : The default class to use as a &quot;Bot manager&quot;.
; TeamManager : The default class to use as a &quot;Team manager&quot;.
; EffectsManager : The default class to use as an &quot;Effects manager&quot;.
; DamageControl : The default class to use for &quot;Damage&quot; modifications

The following settings exist, but are either unused for servers or for development purposes only.
; Difficulty : Unused
; unlocked : Internal use only
; frominterface : Internal use only
; NoBots : Unused
; Comments : Unused
; Bots : Unused
; HUD : Unused
; Test : Unused

==Maintaining the INI File ==

===Setting the Map Rotation ===

Unlike UT and UT2003 Devastation allows you to mix and match game types and game configurations in a single 32 map rotation.  This means that large CTF maps can be played with a low capture limit and small fast paced ones can be played with a higher cap limit.  The same applies to DM style gametypes.

The maps and map settings are specified in the ''[DGamePlay.DSWMapList]'' section of the devsvr.ini file.  Edit it so that it looks like the section below.

  [DGamePlay.DSWMapList] 
  GameMode=1
  bKarmaMP=False
  Language=itt
  MapParams[0]=?game=DTerritories.DCTFGameInfo?timelimit=30?caplimit=8
  MapParams[1]=?game=DGamePlay.DTeamStreetWarGI?timelimit=30?fraglimit=30
  Maps[0]=CTF-Union
  &lt;nowiki&gt;Maps[1]=DDM-EmbarcaderoDepot&lt;/nowiki&gt;
:'''EntropicLqd:''' I'm going to try putting the values &quot;out of order&quot; in my ini later today.  It should work OK and will keep the map name and the map settings together.  Makes things easier to tweak then.

This places two maps in the map rotation.  The first is the CTF-Union map and the second is the DM-EmbarcaderoDepot map.  The CTF map has a time limit of 30 and a cap limit of 8.  The DM map also has a time limit of 30 and a frag limit of 30.  The settings that can be passed along with the ? parameters are covered in the next section.

===Other INI File Settings ===

In this section I'll be covering the bare minimum of INI file settings to control the server in terms of listening port and behaviour.  There are many others but they are beyond the scope of this page (i.e. I'm too lazy to add them.  Maybe someone else will do it).

{|

|-
| colspan=&quot;2&quot; |'''[URL]''' 
|-
|Port=7777
|The default port for the server. 
|-
| colspan=&quot;2&quot; |'''[UWeb.WebServer]''' 
|-
|bEnabled=false
|Currently this should always be set to false as there is no web admin functionality within Devastation.  ''Link coming soon'' 
|-
| colspan=&quot;2&quot; |'''[IpDrv.TcpNetDriver]''' 
|-
|AllowDownloads=True
|Set to False to prevent people from downloading files (like maps) if they don't already have them. 
|-
|ConnectionTimeout=120.0
|The amount of time in seconds? to timeout a client.  Reduce this to lose lagged players faster. 
|-
|MaxClientRate=6000
|The maximum mount of bandwidth a client can use irrespective of their network settings.  This number multiplied by the number of players you allow on your server should be no more than the amount of KBps (that's thousand bytes not bits) your connection can support.  e.g. For a standard ADSL line, which has an upload speed of 256Kbps (which is around 25KBps, 4 players @ a MaxClientRate of 6000 = 24000.  This is about right.  A quick (and reasonable) way of calculating bytes per second from bits per second is to divide the bits per second value by 10 (8 isn't used here doe to protocol overheads and error correction).
|-
|NetServerMaxTickRate=20
|Controls the speed at which &quot;time&quot; passes on the server for an Internet game. 
|-
|LanServerMaxTickRate=35
|Controls the speed at which &quot;time&quot; passes on the server for a LAN game. 
|-
| colspan=&quot;2&quot; |'''[Engine.GameReplicationInfo]''' 
|-
|ServerName=Another Devastation Server
|The description of the server that will appear in the server browser. 
|-
|ShortName=Devastation Server
|The description of the server that appears as the player connected to the server. 
|-
|AdminName=
|The name of the admin for this server. 
|-
|AdminEmail=
|An e-mail address for the admin of the server. 
|-
|MOTDLine1=
|Message of the day line 1. Displayed as people join a map. 
|-
|MOTDLine2=
|Message of the day line 2. Displayed as people join a map. 
|-
|MOTDLine3=
|Message of the day line 3. Displayed as people join a map. 
|-
|MOTDLine4=
|Message of the day line 4. Displayed as people join a map. 
|-
| colspan=&quot;2&quot; |'''[DTerritories.DCTFGRI]''' 
|-
|MaxFlagCaptures=8
|Seems to set the number of flag captures required to win in a CTF game.  Don't understand why this works (assuming it does - I haven't tested it).
|-
| colspan=&quot;2&quot; |'''[IpDrv.MasterServerUplink]''' 
|-
|DoUplink=True
|Setting this to True will make your server appear in the master list.  A value of False will make it invisible. 
|-
|UplinkToGamespy=True
|Setting this to True will make you server connect to gamespy.  A value of False will prevent this. 
|-
|DoLANBroadcast=True
|Setting this to True will make the server appear in the LAN server list.  A value of False will mean the server is &quot;LAN invisible&quot;. 
|-
| colspan=&quot;2&quot; |'''[Engine.GameInfo]''' 
|-
|MaxPlayers=16
|This is the maximum number of players your server will allow to connect. Make sure this is set according to the server's available bandwidth. 
|-
| colspan=&quot;2&quot; |'''[DTerritories.DTerrGameInfo]''' 
|-
|bNoTeamChanges=False
|Set this to True to prevent people from changing teams mid-game. 
|-
|FriendlyFireScale=0.000000
|Sets the damage modifier to use when shooting at teammates.  A value of 1 means that full damage will be inflicted upon your unsuspecting teammate as you shoot them in the back of the head.  Not that you do things like that. 
|-
|MaxTeams=2
|The maximum number of teams. 
|-
|GoalTeamScore=30.000000
|The number of frags required to win a TDM match. 
|-
|MaxTeamSize=16
|Not used anywhere within the UnrealScript. 
|-
|FragLimit=6
|The target number of frags in a DM match. 
|-
|TimeLimit=30
|The default time limit for the game in minutes. 
|-
|SuddenDeathSeconds=120
|How long any &quot;sudden death&quot; overtime lasts in seconds (not supported in MP Demo) 
|-
|RoundTimeLimit=600
|The length in minutes of each ''Territories'' round (not supported in MP Demo) 
|-
|RoundLimit=6
|The number of ''Territories'' rounds to play before the map changes 
|}

'''NOTE:''' The above values can be overridden in the sections specific to the gametype should you wish to to that.

==Dedicated Linux Server ==

A (380 compatible) Linux dedicated server is available: http://icculus.org/news/news.php?id=1416

(More official mirrors from ARUSH/Digitalo will be posted when I'm aware of them).

This should be considered beta quality for a little while yet, but works pretty well. FreeBSD admins can use this if they've got Linux binary compatibility installed. Information on reporting bugs and how to get on the Linux admin mailing list for discussion are in the README that comes with the server. Linux UT/UT2003 admins will recognize the &quot;ucc-bin&quot; program in the System directory, which is used instead of the Windows &quot;devastation.exe -server&quot; or &quot;ucc.exe&quot;. The quickest startup is to run it from a Terminal window like this:

cd /where/i/unpacked/devastation_dedicated/System

./ucc-bin server CTF-Chozo

Where &quot;CTF-Chozo&quot; is a valid Devastation map name.

On Windows, files are written under &quot;My Documents&quot;. On Linux, they'll end up in &quot;.devastation&quot; in your home directory. You can opt to keep everything in the actual game directories by adding &quot;-nohomedir&quot; to the end of the command line:

./ucc-bin server CTF-Chozo -nohomedir

To shut down the server, hit CTRL-C.

There are a LOT of command lines and .ini file tweaks...just about everything not mentioned here that applies to the Windows server also applies to the Linux one.

==Other Sources of Information ==

Some other places to look for information on running an Unreal Engine based server are listed below.
* http://www.unrealadmin.org/  &amp;ndash;  The site for all your unreal admin needs.
* http://unreal.epicgames.com/utServers.htm  &amp;ndash;  The original Epic document on running Unreal Tournament servers.  Much of it still applies.
* http://developer.devastationgame.com/Technical/ConsoleCommandLineParameters.html  &amp;ndash;  A UDN document containing command line switches and exec commands for UT2003.

===Thanks and Acknowledgements ===

'''EntropicLqd:''' Many thanks to the chaps over on the official Devastation forum who worked out a lot of this stuff.  Particular thanks to ''MayDay'' and ''EaSyKiLL''.

'''Digitalo:''' Many thanks to EntropicLqd and the rest of the community for this kick ass doc!

'''EntropicLqd:''' Thanks for the updates.  Nice.

'''Ragdoll:''' I assume that the server command is entered into the command prompt? If this is true, then why do i always get a message saying &quot;devastation.exe is not a program/cannot be found etc...&quot;

If it isnt in the command prompt could you please tell me where?

'''MythOpus:''' I'm not familiar with the Devestation Dedicated server system, but in UT200X, when you start a dedicated server, there is usually a little console that looks similar to the log file (that shows up when you type 'showlog' in the ingame console.)  It should say Devestation Server on it or something.  There should also be a place at the bottom for you to type in server specific commands.

'''Ragdoll:''' The problem is, the master devastation server has gone so you cannot start a server from within the multiplayer as you would normally. There is a external program called the all seeing eye that is used to connect to servers that have already been set up(more info on the eye at [[Legacy:Devastation|Devastation]] Home page, look for the link). I should have mentioned that earlier, but does the eye mean i have to configure anything differently?

'''EntropicLqd:''' It shouldn't do.  Whenever I set up a Devastation server I always used the ucc server route rather than the game itself to do it.  I don't have Devastation installed anymore so I can't check.  You will need to be in the /devastation/system directory to run the server up if you want to do it from the command prompt.  Failing that, you can setup a windows short cut.  Make the starting directory the /devastation/system directory and add the command line switches to the shortcut.  The ASE server should already be configured within the INI file so the server should automatically register there.

'''Ragdoll:'''Perhaps i should try to explain my situation a bit clearer. I have not sucessfully started the server yet, i am trying to enter the &quot;devastation.exe -server&quot; command to actually start running the server. I am confused over where this commnad is entered.</text>
    </revision>
    <revision>
      <id>2691</id>
      <timestamp>2005-05-22T15:02:47Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Some Suprises ==

For those of you who are used to running up servers based on the Unreal engine (see [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]) you'll find a couple of differences that may throw you slightly.
* The INI files are not held within the ''Devastation/System'' directory.  Instead they are held in a directory under your &quot;My Documents&quot; folder.  The advantage to this is that if you have multiple users on a single PC they can all have different key configurations.  The disadvantage is that if you forget you'll be left looking in the ''Devastation/System'' directory wondering where the hell your configuration information went.
* The ''ucc server'' notation is not the preferred way to start the dedicated server although it still works fine.  Instead ''devastation.exe -server'' is used.  The latter form runs the server as a windows tray icon.  Right clicking on this icon provides access to a server console and other information.

'''NOTE:'''  The unpatched retail release (pre version 380) and MP demo currently have some known scaling problems with the server code.  The server code will not scale to more than around 10-12 players.  Digitalo are working on a patch for this but until then try and keep the number of players to 10.
:'''Digitalo:''' Yes, we are working on this.

'''NOTE:''' Much of the information contained within this page applies also to the Devastation MP demo.  If something doesn't work on the MP Demo then the function is most likely only available in the retail version.

==Configuring the Server ==

There are two main ways of getting configuration information into the server.  One is via the command line used to start the server and the other is within the INI file the server will use.  This guide will use the INI method as it seems to be better supported within the game.  This set up guide will assume that the following command has been run to create a &quot;clean&quot; ini file from which to ammend the server settings.

  devastation.exe -server ini=devsvr.ini log=devsvr.log

After running the above command you will see the following things:
* A devastation server icon in your system tray.  This is the server process itself.
* A new file called devsvr.ini within ''My Documents/Devastation''.  This is the INI file that will be used by the server to obtain it's configuration information.
* A new file called devsvr.log within ''My Documents/Devastation''.  This is the log file the server records.  If you server crashes then this file may contain useful information that will help track down the cause of the problem.

Shut that server down by right-clicking on it and selecting the ''Exit server'' option.  By default it will be running the &quot;Entry&quot; map.  No-one can actually join that map so it's not that useful.  However, we now have an INI file that we can modify.

'''NOTE:''' Please see the Linux section below for differences on that operating system.

===Game Ports ===

A server running on the default port of 7777 will send and receive UDP messagess on the following ports: 7777, 7778, 8777, 10777.

The first two ports listed above (7777, 7778) change as the main server port is changed.   7777 becomes ''port'' and 7778 becomes ''port + 1''.  So, if a server was started on port 6000 then the following ports would be used: 6000, 6001, 8777, 10777.

You can determine the ports your server is using by performing the following steps.
* Open up a command line prompt
* Run the command ''netstat -a'' 
* Start the devastation server passing in the port you wish to run the server on and the ini file you wish to use.
* Run the command ''netstat -a'' again.

The ports listed after the second netstat command that are not listed after the first netstat command are those required by your server.

===Starting the Server ===

The following is the general format for starting a server:

  devastation.exe ''map name?parameters'' -server port=''listening port'' ini=''ini filename'' log=''log filename''

So to start a CTF map with a 10 cap limit and a 60 minute timeout listening on port 8777 using our own devsvr ini and log files the following command would be entered.

  devastation CTF-Union?caplimit=10?timeout=60 -server port=8777 ini=devsvr.ini log=devsvr.log

Note that the original ''ucc server'' command also works for starting a server.  Some people have reported a slight improvement in server performance when using this syntax over running the server via devastation.exe.  An example is shown below:

  ucc server CTF-Union?caplimit=10?timeout=60 port=8777 ini=devsvr.ini log=devsvr.log

Rather than run as a tray icon this will run the server up in a shell window.

===Game Parameters ===

The following parameters can be used either as part of the command line or as part of the ''MapParams[n]'' line in the INI file (described below).  All parameters are ? separated.

; game : The game type of the map.  Valid values for the demo are ''DTerritories.DCTFGameInfo'', and ''DGamePlay.DTeamStreetWarGI''.  The maps shipped with the demo seem to have the gametype set within the map so this parameter may not be required.
; timelimit : The number of minutes the map will run for.  Be aware that if you set both the time limit and the score limit (frag limit or cap limit) both to zero then the game will automatically set a 20 minute time out rather than start a server that will play a single map forever.  This behaviour is explicity coded into the game. ''Is there an &quot;extra time&quot; function for CTF games and the like?''
; fraglimit : The number of frags required to win the game.  In CTF games this parameter can also be used to set the cap limit.  Be aware that if you set both the time limit and the score limit (frag limit or cap limit) both to zero then the game will automatically set a 20 minute time out rather than start a server that will play a single map forever.  This behaviour is explicity coded into the game.
; caplimit : The number of flag captures required to win the game.  This parameter will take precedence over any value passed in using the fraglimit parameter.  Be aware that if you set both the time limit and the score limit (frag limit or cap limit) both to zero then the game will automatically set a 20 minute time out rather than start a server that will play a single map forever.  This behaviour is explicity coded into the game.
; roundlimit :  Allows the number of Territories rounds to be specified.  This value determines the number of times a map is played before the map changes.  This value is not supported in the MP Demo.
; roundtimelimit :  This specifies the amount of time in minutes that each Territories round may last.
; suddendeathseconds :  This specifes the amount of time in seconds that any &quot;sudden death&quot; period can last before a draw is declared.
; KarmaMP :  Can be set to True (or 1) to enable Karma Physics in multiplayer.  '''Do not''' do this unless your server is an absoloute beast of a machine and everyone has LAN connections.  The default value is False (0).  Players will not be able to move objects unless this is set.
; GameMode :  This parameter can be used to place the game in arcade mode or simulation mode.  A value of &quot;arcade&quot; ''or'' 0 will put the game into arcade mode.  A value of &quot;simulation&quot; ''or'' 1 will put the game into simulation mode.  Players are able to pick up and throw objects in either game mode as long as ''KarmaMP'' is enabled.
; PktLoss : Can be used to simulate an amount of packet loss. Values can range from 0 to ??. Mostly useful for development.
; PktLag : Can be used to simlutate an amount of lag.  Values can range from 0 to ??. Mostly useful for development.

The following values have been taken from an inspection of the code and have not been tested.  They may not be useable.
; GameSpeed : Overrides the default gamespeed set within the INI file.
; Mutator : Support for comma delimited lists of mutators seems to have been left in \o/
; GamePassword : Can be used to set the game password, and overrides the value within the INI file.
; LocalLog : True if stats should be logged locally, otherwise False.  Defaults to True.
; WorldLog : True if stats should be sent to the &quot;World Log&quot;, otherwise False.  Defaults to True.
; restart : Can be used to restart the current map using all previous specified values.  Changes to the previous configuration can then be made by re-specifying values for specific parameters (or adding new ones)
; DefaultDelay : The default respawn delay time for Territories
; AccessCenter : The default class to use for an &quot;access center&quot;.
; SpawnCenter : The default class to use for a &quot;spawn center&quot;.
; BotManager : The default class to use as a &quot;Bot manager&quot;.
; TeamManager : The default class to use as a &quot;Team manager&quot;.
; EffectsManager : The default class to use as an &quot;Effects manager&quot;.
; DamageControl : The default class to use for &quot;Damage&quot; modifications

The following settings exist, but are either unused for servers or for development purposes only.
; Difficulty : Unused
; unlocked : Internal use only
; frominterface : Internal use only
; NoBots : Unused
; Comments : Unused
; Bots : Unused
; HUD : Unused
; Test : Unused

==Maintaining the INI File ==

===Setting the Map Rotation ===

Unlike UT and UT2003 Devastation allows you to mix and match game types and game configurations in a single 32 map rotation.  This means that large CTF maps can be played with a low capture limit and small fast paced ones can be played with a higher cap limit.  The same applies to DM style gametypes.

The maps and map settings are specified in the ''[DGamePlay.DSWMapList]'' section of the devsvr.ini file.  Edit it so that it looks like the section below.

  [DGamePlay.DSWMapList] 
  GameMode=1
  bKarmaMP=False
  Language=itt
  MapParams[0]=?game=DTerritories.DCTFGameInfo?timelimit=30?caplimit=8
  MapParams[1]=?game=DGamePlay.DTeamStreetWarGI?timelimit=30?fraglimit=30
  Maps[0]=CTF-Union
  &lt;nowiki&gt;Maps[1]=DDM-EmbarcaderoDepot&lt;/nowiki&gt;
:'''EntropicLqd:''' I'm going to try putting the values &quot;out of order&quot; in my ini later today.  It should work OK and will keep the map name and the map settings together.  Makes things easier to tweak then.

This places two maps in the map rotation.  The first is the CTF-Union map and the second is the DM-EmbarcaderoDepot map.  The CTF map has a time limit of 30 and a cap limit of 8.  The DM map also has a time limit of 30 and a frag limit of 30.  The settings that can be passed along with the ? parameters are covered in the next section.

===Other INI File Settings ===

In this section I'll be covering the bare minimum of INI file settings to control the server in terms of listening port and behaviour.  There are many others but they are beyond the scope of this page (i.e. I'm too lazy to add them.  Maybe someone else will do it).

{|

|-
| colspan=&quot;2&quot; |'''[URL]''' 
|-
|Port=7777
|The default port for the server. 
|-
| colspan=&quot;2&quot; |'''[UWeb.WebServer]''' 
|-
|bEnabled=false
|Currently this should always be set to false as there is no web admin functionality within Devastation.  ''Link coming soon'' 
|-
| colspan=&quot;2&quot; |'''[IpDrv.TcpNetDriver]''' 
|-
|AllowDownloads=True
|Set to False to prevent people from downloading files (like maps) if they don't already have them. 
|-
|ConnectionTimeout=120.0
|The amount of time in seconds? to timeout a client.  Reduce this to lose lagged players faster. 
|-
|MaxClientRate=6000
|The maximum mount of bandwidth a client can use irrespective of their network settings.  This number multiplied by the number of players you allow on your server should be no more than the amount of KBps (that's thousand bytes not bits) your connection can support.  e.g. For a standard ADSL line, which has an upload speed of 256Kbps (which is around 25KBps, 4 players @ a MaxClientRate of 6000 = 24000.  This is about right.  A quick (and reasonable) way of calculating bytes per second from bits per second is to divide the bits per second value by 10 (8 isn't used here doe to protocol overheads and error correction).
|-
|NetServerMaxTickRate=20
|Controls the speed at which &quot;time&quot; passes on the server for an Internet game. 
|-
|LanServerMaxTickRate=35
|Controls the speed at which &quot;time&quot; passes on the server for a LAN game. 
|-
| colspan=&quot;2&quot; |'''[Engine.GameReplicationInfo]''' 
|-
|ServerName=Another Devastation Server
|The description of the server that will appear in the server browser. 
|-
|ShortName=Devastation Server
|The description of the server that appears as the player connected to the server. 
|-
|AdminName=
|The name of the admin for this server. 
|-
|AdminEmail=
|An e-mail address for the admin of the server. 
|-
|MOTDLine1=
|Message of the day line 1. Displayed as people join a map. 
|-
|MOTDLine2=
|Message of the day line 2. Displayed as people join a map. 
|-
|MOTDLine3=
|Message of the day line 3. Displayed as people join a map. 
|-
|MOTDLine4=
|Message of the day line 4. Displayed as people join a map. 
|-
| colspan=&quot;2&quot; |'''[DTerritories.DCTFGRI]''' 
|-
|MaxFlagCaptures=8
|Seems to set the number of flag captures required to win in a CTF game.  Don't understand why this works (assuming it does - I haven't tested it).
|-
| colspan=&quot;2&quot; |'''[IpDrv.MasterServerUplink]''' 
|-
|DoUplink=True
|Setting this to True will make your server appear in the master list.  A value of False will make it invisible. 
|-
|UplinkToGamespy=True
|Setting this to True will make you server connect to gamespy.  A value of False will prevent this. 
|-
|DoLANBroadcast=True
|Setting this to True will make the server appear in the LAN server list.  A value of False will mean the server is &quot;LAN invisible&quot;. 
|-
| colspan=&quot;2&quot; |'''[Engine.GameInfo]''' 
|-
|MaxPlayers=16
|This is the maximum number of players your server will allow to connect. Make sure this is set according to the server's available bandwidth. 
|-
| colspan=&quot;2&quot; |'''[DTerritories.DTerrGameInfo]''' 
|-
|bNoTeamChanges=False
|Set this to True to prevent people from changing teams mid-game. 
|-
|FriendlyFireScale=0.000000
|Sets the damage modifier to use when shooting at teammates.  A value of 1 means that full damage will be inflicted upon your unsuspecting teammate as you shoot them in the back of the head.  Not that you do things like that. 
|-
|MaxTeams=2
|The maximum number of teams. 
|-
|GoalTeamScore=30.000000
|The number of frags required to win a TDM match. 
|-
|MaxTeamSize=16
|Not used anywhere within the UnrealScript. 
|-
|FragLimit=6
|The target number of frags in a DM match. 
|-
|TimeLimit=30
|The default time limit for the game in minutes. 
|-
|SuddenDeathSeconds=120
|How long any &quot;sudden death&quot; overtime lasts in seconds (not supported in MP Demo) 
|-
|RoundTimeLimit=600
|The length in minutes of each ''Territories'' round (not supported in MP Demo) 
|-
|RoundLimit=6
|The number of ''Territories'' rounds to play before the map changes 
|}

'''NOTE:''' The above values can be overridden in the sections specific to the gametype should you wish to to that.

==Dedicated Linux Server ==

A (380 compatible) Linux dedicated server is available: http://icculus.org/news/news.php?id=1416

(More official mirrors from ARUSH/Digitalo will be posted when I'm aware of them).

This should be considered beta quality for a little while yet, but works pretty well. FreeBSD admins can use this if they've got Linux binary compatibility installed. Information on reporting bugs and how to get on the Linux admin mailing list for discussion are in the README that comes with the server. Linux UT/UT2003 admins will recognize the &quot;ucc-bin&quot; program in the System directory, which is used instead of the Windows &quot;devastation.exe -server&quot; or &quot;ucc.exe&quot;. The quickest startup is to run it from a Terminal window like this:

cd /where/i/unpacked/devastation_dedicated/System

./ucc-bin server CTF-Chozo

Where &quot;CTF-Chozo&quot; is a valid Devastation map name.

On Windows, files are written under &quot;My Documents&quot;. On Linux, they'll end up in &quot;.devastation&quot; in your home directory. You can opt to keep everything in the actual game directories by adding &quot;-nohomedir&quot; to the end of the command line:

./ucc-bin server CTF-Chozo -nohomedir

To shut down the server, hit CTRL-C.

There are a LOT of command lines and .ini file tweaks...just about everything not mentioned here that applies to the Windows server also applies to the Linux one.

==Other Sources of Information ==

Some other places to look for information on running an Unreal Engine based server are listed below.
* http://www.unrealadmin.org/  &amp;ndash;  The site for all your unreal admin needs.
* http://unreal.epicgames.com/utServers.htm  &amp;ndash;  The original Epic document on running Unreal Tournament servers.  Much of it still applies.
* http://developer.devastationgame.com/Technical/ConsoleCommandLineParameters.html  &amp;ndash;  A UDN document containing command line switches and exec commands for UT2003.

===Thanks and Acknowledgements ===

'''EntropicLqd:''' Many thanks to the chaps over on the official Devastation forum who worked out a lot of this stuff.  Particular thanks to ''MayDay'' and ''EaSyKiLL''.

'''Digitalo:''' Many thanks to EntropicLqd and the rest of the community for this kick ass doc!

'''EntropicLqd:''' Thanks for the updates.  Nice.

'''Ragdoll:''' I assume that the server command is entered into the command prompt? If this is true, then why do i always get a message saying &quot;devastation.exe is not a program/cannot be found etc...&quot;

If it isnt in the command prompt could you please tell me where?

'''MythOpus:''' I'm not familiar with the Devestation Dedicated server system, but in UT200X, when you start a dedicated server, there is usually a little console that looks similar to the log file (that shows up when you type 'showlog' in the ingame console.)  It should say Devestation Server on it or something.  There should also be a place at the bottom for you to type in server specific commands.

'''Ragdoll:''' The problem is, the master devastation server has gone so you cannot start a server from within the multiplayer as you would normally. There is a external program called the all seeing eye that is used to connect to servers that have already been set up(more info on the eye at [[Legacy:Devastation|Devastation]] Home page, look for the link). I should have mentioned that earlier, but does the eye mean i have to configure anything differently?

'''EntropicLqd:''' It shouldn't do.  Whenever I set up a Devastation server I always used the ucc server route rather than the game itself to do it.  I don't have Devastation installed anymore so I can't check.  You will need to be in the /devastation/system directory to run the server up if you want to do it from the command prompt.  Failing that, you can setup a windows short cut.  Make the starting directory the /devastation/system directory and add the command line switches to the shortcut.  The ASE server should already be configured within the INI file so the server should automatically register there.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devastation Wiki Content</title>
    <id>999</id>
    <revision>
      <id>2692</id>
      <timestamp>2005-03-23T08:26:49Z</timestamp>
      <contributor>
        <ip>193.39.158.195</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page contains links to many of the pages (well, it would do if there were lots of Devastation related content on the Wiki) relating to the [[Legacy:Unreal Engine|Unreal Engine]] based game [[Legacy:Devastation|Devastation]].  If you are adding new Devastation content then feel free to link to it from here (creating a new section if you need to).

==Possible Mod Types ==

Out of the box Devastation doesn't support any mod types via the game interface.  It is possible to change the game type and add mutators via the &quot;command line&quot;.  The structure of the Devastation code is such that not all of the standard mutator functions work, or behave in the manner expected from experience with UT and UT2003.

So far I've tried the following via a mutator:
; Altering the player movement characteristics via the ModifyPlayer() function.: The function is called but the player movement is reset later in the code (as far as I can tell).
; Changing the amount of damage taken when falling via MutatorTakeDamage. : The MutateTakeDamage() function is never called.  It would appear that &quot;damage mutators&quot; need to extend the ''Damager control'' class.  This means that it would be nigh on impossible to run more than one &quot;damage mutator&quot; at a time.  I feel a set of custom classes coming on that call the original mutator chain after the default handling is done.  I'll be the first to admit that it's a bit pants but hey - what is this life if full of care, we have no time to fix broken code.
; CheckReplacement() : This mutator function works fine and behaves as expected.  Be aware that Dev. spawns many many effects during gameplay that are passed through this function (at least in a listen server).  A long mutator chain may impact performance.  I must get around to testing this in dedicated server mode.
; ScoreKill() : This function behaves as expected.  The ''standard'' Score is updated prior to the function being called.  The actual score used is held in separate variables and updated after this function is called.

==Mapping for Devastation ==
; Does Devastation support the terrain features of the Unreal Engine? : Yes.

===Some Useful Units===
; Normal jumping height : 64 units.
; Crouch-jumping height : ? units.
; Maximum distance that can be jumped : ? units.
; How big are door frames : Door frames seem to conform to the following dimensions - width=60, breadth=8, height=120.  Very weird dimensions.  I've also seen doors that were 56x8x128 which is slightly more sensible.  Personally I think I may work to 64x8x128 - but that my not fit with the static meshes available.
; Any thoughts on texture sizes? : Textures are generally no larger than 256x 256. Although some sky textures can be up to 1024x1024.
; How fast does the player move? : The player has a ground speed of 230 units.  I've not been able to acertain whether this is walking speed or running speed.

==Coding for Devastation ==

The model used within Devastation to support it's game types is different to that of UT and UT2003.  The code adopts a very service based approach to it's functionality (which to my mind is quite tidy).  Whether it's actually easy to use or not is another matter.  I won't know until I get the game.

Essentially, all game types are subclassed from DGameInfo.  The game info class has a set of references to ''Game Assistants''.  These assistants are responsible for implementing the rules of the game and take on many of the functions handled by the GameInfo class and Controller (as far as I can tell).

The game assistants are held in a linked list in a similar way to Mutators.  In both cases there is no link to the previous assistant in the chain.

Each DGameAssistant has a set of references to all of the other &quot;standard&quot; game assistants used by each of the game types.  These are listed below:
* Access center
* Spawn center - Controls players entering and leaving the game as well as respawning.
* Inventory manager - Controls the players default inventory and also handles collecting other items of inventory as well.
* Bot manager - Controls the spawning of the &quot;bots&quot; within the game.  How closely involved this class is in managing the &quot;players&quot; in the single player game is currently under investigation.  The ADDBOTS console command appears to be broken with Devastation - support for adding bots appears to be in this class but with no way of adding them via the console.
* Team manager
* Damage control - Controls the amount of damage taken.  Using a custom DDamageControl class you should be able to hook into accessing &quot;damage mutators&quot;.
* Broadcaster
* Game log

Quite how game assistants and mutators work together is something of a mystery at the moment.  I hope to explore this more fully in the future.

----

'''Tarquin:''' I downloaded the demo and it crashes on startup :(

 GameVersion: 368
 Can't find 'ini:Engine.Engine.GameEngine' in configuration file
 History: UObject::SafeLoadError &lt;- UObject::StaticLoadClass &lt;- InitEngine

'''EntropicLqd:''' Devastation places the MP Demo INI files in &quot;My Documents/DevastationMPDemo&quot;.  Try deleting them and letting the game re-create them.  And make sure that the directories exist.

'''Tarquin:''' Thanks for the tip .... still crashes the same though :( I'm off to rant about it in BuF OT ...

'''EntropicLqd''' What OS are you running?  What files (and files sizes) do you have in &quot;My Documents/DevastationMPDemo&quot;?  This is a curious one.  There's a few other people in the devastation forums with the same problem but no-one has figured it out yet.

'''Tarquin:''' Win98SE. I couldn't find any folder called &quot;DevastationMPDemo&quot;, so I made one. Could the problem be related to the fact that I used TweakUI to set &quot;My Documents&quot; in a different location?

'''EntropicLqd:''' Wouldn't suprise me.  Create a &quot;My Documents&quot; folder and see if that works.  Other people have reported problems when they've got their &quot;My Documents&quot; folder pointing to a network or compressed drive.  Might be worth just creating a &quot;My Documents&quot; directory in the original location (c:\ if I remember right) to see if that solves the problem.

'''Tarquin:''' Yup, someone on the devas forum has the exact same problem but with XP. C\my Doc is still physically there &amp;ndash; it's just a registry setting that's different</text>
    </revision>
    <revision>
      <id>2693</id>
      <timestamp>2003-08-01T09:12:30Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>minor updates</comment>
      <text xml:space="preserve">This page contains links to many of the pages (well, it would do if there were lots of Devastation related content on the Wiki) relating to the [[Legacy:Unreal Engine|Unreal Engine]] based game [[Legacy:Devastation|Devastation]].  If you are adding new Devastation content then feel free to link to it from here (creating a new section if you need to).

==Possible Mod Types ==

Out of the box Devastation doesn't support any mod types via the game interface.  It is possible to change the game type and add mutators via the &quot;command line&quot;.  The structure of the Devastation code is such that not all of the standard mutator functions work, or behave in the manner expected from experience with UT and UT2003.

So far I've tried the following via a mutator:
; Altering the player movement characteristics via the ModifyPlayer() function.: The function is called but the player movement is reset later in the code (as far as I can tell).
; Changing the amount of damage taken when falling via MutatorTakeDamage. : The MutateTakeDamage() function is never called.  It would appear that &quot;damage mutators&quot; need to extend the ''Damager control'' class.  This means that it would be nigh on impossible to run more than one &quot;damage mutator&quot; at a time.  I feel a set of custom classes coming on that call the original mutator chain after the default handling is done.  I'll be the first to admit that it's a bit pants but hey - what is this life if full of care, we have no time to fix broken code.
; CheckReplacement() : This mutator function works fine and behaves as expected.  Be aware that Dev. spawns many many effects during gameplay that are passed through this function (at least in a listen server).  A long mutator chain may impact performance.  I must get around to testing this in dedicated server mode.
; ScoreKill() : This function behaves as expected.  The ''standard'' Score is updated prior to the function being called.  The actual score used is held in separate variables and updated after this function is called.

==Mapping for Devastation ==
; Does Devastation support the terrain features of the Unreal Engine? : Yes.

===Some Useful Units===
; Normal jumping height : 64 units.
; Crouch-jumping height : ? units.
; Maximum distance that can be jumped : ? units.
; How big are door frames : Door frames seem to conform to the following dimensions - width=60, breadth=8, height=120.  Very weird dimensions.  I've also seen doors that were 56x8x128 which is slightly more sensible.  Personally I think I may work to 64x8x128 - but that my not fit with the static meshes available.
; Any thoughts on texture sizes? : Textures are generally no larger than 256x 256.  Some are smaller.
; How fast does the player move? : The player has a ground speed of 230 units.  I've not been able to acertain whether this is walking speed or running speed.

==Coding for Devastation ==

The model used within Devastation to support it's game types is different to that of UT and UT2003.  The code adopts a very service based approach to it's functionality (which to my mind is quite tidy).  Whether it's actually easy to use or not is another matter.  I won't know until I get the game.

Essentially, all game types are subclassed from DGameInfo.  The game info class has a set of references to ''Game Assistants''.  These assistants are responsible for implementing the rules of the game and take on many of the functions handled by the GameInfo class and Controller (as far as I can tell).

The game assistants are held in a linked list in a similar way to Mutators.  In both cases there is no link to the previous assistant in the chain.

Each DGameAssistant has a set of references to all of the other &quot;standard&quot; game assistants used by each of the game types.  These are listed below:
* Access center
* Spawn center - Controls players entering and leaving the game as well as respawning.
* Inventory manager - Controls the players default inventory and also handles collecting other items of inventory as well.
* Bot manager - Controls the spawning of the &quot;bots&quot; within the game.  How closely involved this class is in managing the &quot;players&quot; in the single player game is currently under investigation.  The ADDBOTS console command appears to be broken with Devastation - support for adding bots appears to be in this class but with no way of adding them via the console.
* Team manager
* Damage control - Controls the amount of damage taken.  Using a custom DDamageControl class you should be able to hook into accessing &quot;damage mutators&quot;.
* Broadcaster
* Game log

Quite how game assistants and mutators work together is something of a mystery at the moment.  I hope to explore this more fully in the future.

----

'''Tarquin:''' I downloaded the demo and it crashes on startup :(

 GameVersion: 368
 Can't find 'ini:Engine.Engine.GameEngine' in configuration file
 History: UObject::SafeLoadError &lt;- UObject::StaticLoadClass &lt;- InitEngine

'''EntropicLqd:''' Devastation places the MP Demo INI files in &quot;My Documents/DevastationMPDemo&quot;.  Try deleting them and letting the game re-create them.  And make sure that the directories exist.

'''Tarquin:''' Thanks for the tip .... still crashes the same though :( I'm off to rant about it in BuF OT ...

'''EntropicLqd''' What OS are you running?  What files (and files sizes) do you have in &quot;My Documents/DevastationMPDemo&quot;?  This is a curious one.  There's a few other people in the devastation forums with the same problem but no-one has figured it out yet.

'''Tarquin:''' Win98SE. I couldn't find any folder called &quot;DevastationMPDemo&quot;, so I made one. Could the problem be related to the fact that I used TweakUI to set &quot;My Documents&quot; in a different location?

'''EntropicLqd:''' Wouldn't suprise me.  Create a &quot;My Documents&quot; folder and see if that works.  Other people have reported problems when they've got their &quot;My Documents&quot; folder pointing to a network or compressed drive.  Might be worth just creating a &quot;My Documents&quot; directory in the original location (c:\ if I remember right) to see if that solves the problem.

'''Tarquin:''' Yup, someone on the devas forum has the exact same problem but with XP. C\my Doc is still physically there &amp;ndash; it's just a registry setting that's different</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devastation/Known Command Line Switches</title>
    <id>1020</id>
    <revision>
      <id>2737</id>
      <timestamp>2003-08-27T17:22:37Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>Moved here</comment>
      <text xml:space="preserve">This page covers the known command line switches for the devastation.exe file.

; -server : This will start the devastation game as a dedicated server.  See the [[Legacy:Devastation Dedicated Server|Devastation Dedicated Server]] paeg for more information.
; -nologos : This will prevent the intro videos from playing (means the game will start faster).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Developer Journal</title>
    <id>1054</id>
    <revision>
      <id>2807</id>
      <timestamp>2004-05-04T23:43:55Z</timestamp>
      <contributor>
        <ip>YoDon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==May the fourth be with you, 2004==

yup, it's Star Wars day and I'm starting to try porting a UT2003 project to UT2004.

I've found a couple useful posts...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Developer Journals</title>
    <id>28431</id>
    <revision>
      <id>40105</id>
      <timestamp>2009-11-15T09:50:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Redirected page to [[Category:Legacy Journal]]</comment>
      <text xml:space="preserve">#REDIRECT [[Category: Legacy Journal]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Developer Journals/Enigmatic</title>
    <id>953</id>
    <revision>
      <id>2588</id>
      <timestamp>2004-05-18T13:33:48Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Intro==

Basicly, I am the type of person who likes to see the latest info at the top, so I'm just going to insert the latest and greatest entry at the top of the page, so to start at the beginning, you'll have to go to the bottom and work your way up.  No, I don't top post in usenet, I'm just used to this format in blogs, news sites, and various other web pages and I don't think you should have to scroll to ge the latest info.  Does this make me evil?  maybe, but that's ok in my book.

[[Legacy:Enigmatic|Enigmatic]] 

==Current Projects:==
* Unnamed Assault mod
* [[Legacy:Mod_Ideas/Semigib_Onslaught|Mod_Ideas/Semigib_Onslaught]] - I'm going to call it &quot;Instagib Onslaught&quot; for simplicity's sake.

==Entries==

===5/18/2004 - It is finished!===

I waited for the patch to come out, and wouldn't you know it', E3 hits...hard.  So no place has it up yet.  Fortunatly, I have unlimited transfer webspace though Fileshack's Mercury program, so I'll just use it for now.

Link - http://enigmatic.shackspace.com/ut2k4/OnsInstagib.zip

Also, the 4/22 verson JUST got posted on Fileplanet today, so don't touch that...it's the old &amp; busted version, the above link is the new hotness

===4/28/2004 - AI?!?!  Artificial Stupidity more like it!===

Unfortunatly, I broke the AI in UT2k4 nice and hard in OnsInstagib. They didn't know that there was a secondary fire, or that they couldn't do jack to anything but each other. So I fixed that.

Now, I've stuck with a bot trying to shoot a node from 300 feet with a beam that only goes 50 feet. So the next goal is to try and get it into the artificial head of the bot that it needs to move a littlte bit closer to the node to do anything...of course, it's the same with weapons.  I also need to figure out how to explain to the bot that the AVRiL is the best weapon to shoot vehicles. Those bots have the 'Linkgun only&quot; mentality and don't like big missles it seems. I'm sure there's a way to take care of that as well.

My real wish was that there was an AI section on the Wiki that involved weapon creation, and how to &quot;tell&quot; the bots in UT2k3/4 how to use them.

'''Tarquin:''' Just start one :) Bots seem to know the biorifle has a shorter range than the shock rifle, for eg.

'''Enigmatic:''' I think I will once I figure it out.  Unfortunatly, I think I broke that distance thing, so I've got to fix that.  Otherwise, the BestMode is all I know right now :)

'''Enigmatic:''' OK, created [[Legacy:How UT2003 Weapons Work/Teaching Bots To Use Your Weapon|How UT2003 Weapons Work/Teaching Bots To Use Your Weapon]].  Hopefully I'll start filling it out as I figure stuff out

===4/21/2004 - 30 minutes til tomorrow===

It's done!  check it: http://www.fileshack.com/file.x?fid=4897

Opinions are welcome.  Bots aren't to sure about it but it works over a network as long as it's in the ServerPrograms= group

===4/21/2004 - Semigib Onslaught, Go!===

I choose this mutator because it'll be a nice change of pace from my current mod project, and I doubt it'll take any longer than a night or two of coding to get it working.  Nothing to fancy here, and I think there's some stuff I've used in the mod that I can pull over into this project.

Here's how I'm going to pull it off:

* Change primary fire on link gun to instagib shot
* Make InstaGibLink &amp; InstaGibAVRiL default weapons
* Remove all non-InstaGib weaponry
* Remove all ammo
* Remove or Alter all Weapon Lockers

Possible options for Ammo usage:
* Unlimited
* Limited
* Limited w/recharge (don't use it for X amount of time, ammo begins to recharge)

I think the ammo for both weapons needs to operate in the same way.  That means one less thing for players to worry about and less confusing ammo operations in general.  I'm partial to the recharge right now, because it puts a damper on the spammers who'll just hold down fire and hope to hit someone, but it shouldn't effect anyone using the gun in a smart manner.  It also means building bases will be a tactical decision as well, because it uses valuable ammunition.

The one problem is damage to bases.  If the primary fire does loads of damage, then destroying bases will be simple.  Perhaps creating an armor object that magnifies instagib damage while nullifying beam damage is the way to go.  Then, you'll have to use the beam to build/destroy bases, the AVRiL for vehicles, and instagib for players.  Vehicles will be the real tricky thing to contend with.  Basicly, does the instagib beam hurt them at all?  or is it AVRiL only?  if I remember correctly, the bean needs a minimum amount of damage to be registered as a &quot;hit&quot;, at least for the pawns.  The idea is to create as few classes as possible.

OK, classes to create:
* ONSIG_Link.uc     - The primary gun
* ONSIG_LinkFire.uc - Instagib beam
* ONSIG_AVRiL.uc    - The modified AVRiL (for ammo recharge)
* ONSIG_Armor.uc    - To modify &quot;hits&quot; to the player
* ONSIG_Mutator.uc  - The file that makes the magic happen</text>
    </revision>
    <revision>
      <id>2589</id>
      <timestamp>2004-04-28T18:19:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Intro==

Basicly, I am the type of person who likes to see the latest info at the top, so I'm just going to insert the latest and greatest entry at the top of the page, so to start at the beginning, you'll have to go to the bottom and work your way up.  No, I don't top post in usenet, I'm just used to this format in blogs, news sites, and various other web pages and I don't think you should have to scroll to ge the latest info.  Does this make me evil?  maybe, but that's ok in my book.

[[Legacy:Enigmatic|Enigmatic]] 

==Current Projects:==
* Unnamed Assault mod
* [[Legacy:Mod_Ideas/Semigib_Onslaught|Mod_Ideas/Semigib_Onslaught]] - I'm going to call it &quot;Instagib Onslaught&quot; for simplicity's sake.

==Entries==

===4/28/2004 - AI?!?!  Artificial Stupidity more like it!===

Unfortunatly, I broke the AI in UT2k4 nice and hard in OnsInstagib. They didn't know that there was a secondary fire, or that they couldn't do jack to anything but each other. So I fixed that.

Now, I've stuck with a bot trying to shoot a node from 300 feet with a beam that only goes 50 feet. So the next goal is to try and get it into the artificial head of the bot that it needs to move a littlte bit closer to the node to do anything...of course, it's the same with weapons.  I also need to figure out how to explain to the bot that the AVRiL is the best weapon to shoot vehicles. Those bots have the 'Linkgun only&quot; mentality and don't like big missles it seems. I'm sure there's a way to take care of that as well.

My real wish was that there was an AI section on the Wiki that involved weapon creation, and how to &quot;tell&quot; the bots in UT2k3/4 how to use them.

'''Tarquin:''' Just start one :) Bots seem to know the biorifle has a shorter range than the shock rifle, for eg.

===4/21/2004 - 30 minutes til tomorrow===

It's done!  check it: http://www.fileshack.com/file.x?fid=4897

Opinions are welcome.  Bots aren't to sure about it but it works over a network as long as it's in the ServerPrograms= group

===4/21/2004 - Semigib Onslaught, Go!===

I choose this mutator because it'll be a nice change of pace from my current mod project, and I doubt it'll take any longer than a night or two of coding to get it working.  Nothing to fancy here, and I think there's some stuff I've used in the mod that I can pull over into this project.

Here's how I'm going to pull it off:

* Change primary fire on link gun to instagib shot
* Make InstaGibLink &amp; InstaGibAVRiL default weapons
* Remove all non-InstaGib weaponry
* Remove all ammo
* Remove or Alter all Weapon Lockers

Possible options for Ammo usage:
* Unlimited
* Limited
* Limited w/recharge (don't use it for X amount of time, ammo begins to recharge)

I think the ammo for both weapons needs to operate in the same way.  That means one less thing for players to worry about and less confusing ammo operations in general.  I'm partial to the recharge right now, because it puts a damper on the spammers who'll just hold down fire and hope to hit someone, but it shouldn't effect anyone using the gun in a smart manner.  It also means building bases will be a tactical decision as well, because it uses valuable ammunition.

The one problem is damage to bases.  If the primary fire does loads of damage, then destroying bases will be simple.  Perhaps creating an armor object that magnifies instagib damage while nullifying beam damage is the way to go.  Then, you'll have to use the beam to build/destroy bases, the AVRiL for vehicles, and instagib for players.  Vehicles will be the real tricky thing to contend with.  Basicly, does the instagib beam hurt them at all?  or is it AVRiL only?  if I remember correctly, the bean needs a minimum amount of damage to be registered as a &quot;hit&quot;, at least for the pawns.  The idea is to create as few classes as possible.

OK, classes to create:
* ONSIG_Link.uc     - The primary gun
* ONSIG_LinkFire.uc - Instagib beam
* ONSIG_AVRiL.uc    - The modified AVRiL (for ammo recharge)
* ONSIG_Armor.uc    - To modify &quot;hits&quot; to the player
* ONSIG_Mutator.uc  - The file that makes the magic happen</text>
    </revision>
    <revision>
      <id>2590</id>
      <timestamp>2004-04-28T20:01:01Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>added link to Teaching Bots page</comment>
      <text xml:space="preserve">==Intro==

Basicly, I am the type of person who likes to see the latest info at the top, so I'm just going to insert the latest and greatest entry at the top of the page, so to start at the beginning, you'll have to go to the bottom and work your way up.  No, I don't top post in usenet, I'm just used to this format in blogs, news sites, and various other web pages and I don't think you should have to scroll to ge the latest info.  Does this make me evil?  maybe, but that's ok in my book.

[[Legacy:Enigmatic|Enigmatic]] 

==Current Projects:==
* Unnamed Assault mod
* [[Legacy:Mod_Ideas/Semigib_Onslaught|Mod_Ideas/Semigib_Onslaught]] - I'm going to call it &quot;Instagib Onslaught&quot; for simplicity's sake.

==Entries==

===4/28/2004 - AI?!?!  Artificial Stupidity more like it!===

Unfortunatly, I broke the AI in UT2k4 nice and hard in OnsInstagib. They didn't know that there was a secondary fire, or that they couldn't do jack to anything but each other. So I fixed that.

Now, I've stuck with a bot trying to shoot a node from 300 feet with a beam that only goes 50 feet. So the next goal is to try and get it into the artificial head of the bot that it needs to move a littlte bit closer to the node to do anything...of course, it's the same with weapons.  I also need to figure out how to explain to the bot that the AVRiL is the best weapon to shoot vehicles. Those bots have the 'Linkgun only&quot; mentality and don't like big missles it seems. I'm sure there's a way to take care of that as well.

My real wish was that there was an AI section on the Wiki that involved weapon creation, and how to &quot;tell&quot; the bots in UT2k3/4 how to use them.

'''Tarquin:''' Just start one :) Bots seem to know the biorifle has a shorter range than the shock rifle, for eg.

'''Enigmatic:''' I think I will once I figure it out.  Unfortunatly, I think I broke that distance thing, so I've got to fix that.  Otherwise, the BestMode is all I know right now :)

'''Enigmatic:''' OK, created [[Legacy:How UT2003 Weapons Work/Teaching Bots To Use Your Weapon|How UT2003 Weapons Work/Teaching Bots To Use Your Weapon]].  Hopefully I'll start filling it out as I figure stuff out

===4/21/2004 - 30 minutes til tomorrow===

It's done!  check it: http://www.fileshack.com/file.x?fid=4897

Opinions are welcome.  Bots aren't to sure about it but it works over a network as long as it's in the ServerPrograms= group

===4/21/2004 - Semigib Onslaught, Go!===

I choose this mutator because it'll be a nice change of pace from my current mod project, and I doubt it'll take any longer than a night or two of coding to get it working.  Nothing to fancy here, and I think there's some stuff I've used in the mod that I can pull over into this project.

Here's how I'm going to pull it off:

* Change primary fire on link gun to instagib shot
* Make InstaGibLink &amp; InstaGibAVRiL default weapons
* Remove all non-InstaGib weaponry
* Remove all ammo
* Remove or Alter all Weapon Lockers

Possible options for Ammo usage:
* Unlimited
* Limited
* Limited w/recharge (don't use it for X amount of time, ammo begins to recharge)

I think the ammo for both weapons needs to operate in the same way.  That means one less thing for players to worry about and less confusing ammo operations in general.  I'm partial to the recharge right now, because it puts a damper on the spammers who'll just hold down fire and hope to hit someone, but it shouldn't effect anyone using the gun in a smart manner.  It also means building bases will be a tactical decision as well, because it uses valuable ammunition.

The one problem is damage to bases.  If the primary fire does loads of damage, then destroying bases will be simple.  Perhaps creating an armor object that magnifies instagib damage while nullifying beam damage is the way to go.  Then, you'll have to use the beam to build/destroy bases, the AVRiL for vehicles, and instagib for players.  Vehicles will be the real tricky thing to contend with.  Basicly, does the instagib beam hurt them at all?  or is it AVRiL only?  if I remember correctly, the bean needs a minimum amount of damage to be registered as a &quot;hit&quot;, at least for the pawns.  The idea is to create as few classes as possible.

OK, classes to create:
* ONSIG_Link.uc     - The primary gun
* ONSIG_LinkFire.uc - Instagib beam
* ONSIG_AVRiL.uc    - The modified AVRiL (for ammo recharge)
* ONSIG_Armor.uc    - To modify &quot;hits&quot; to the player
* ONSIG_Mutator.uc  - The file that makes the magic happen</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Developer Journals/FF3</title>
    <id>952</id>
    <revision>
      <id>2586</id>
      <timestamp>2003-01-20T02:09:00Z</timestamp>
      <contributor>
        <ip>Chemos</ip>
      </contributor>
      <comment>* update fianlly</comment>
      <text xml:space="preserve">===Idea ===

Well, to start off with, its just gonna be the equiv to HLs VGUI.  I'm only making the message blurbs and the status screen.  Gametype and rules are next, followed by modelling (god help me) and mapping (same).  I don't know what story or what general style I want to follow, so that's gonna be configurable.  

====Into the lion's den ====

First up is the message boxes.  

Standard FF style is a straight box with text in it and a little down arrow when its done.  I'll do this one, then add a configurable var so that you can also see the persons face who's talking if you want to.  I.E.

&lt;uscript&gt;
 +-------------------------+               +----------------------+
 |  Leo:                   | &lt;-without face|(Pic)  I just wanted  |
 |        I just wanted to |               |(Pic)  say...         |
 |        say...           | with face   -&gt;|(Pic)                 |
 +-------------------------+               +----------------------+
&lt;/uscript&gt;

I don't think this will be too hard...

{{classbox|5:00PM 01/07/03}}

Okay, started on the GUIPage, (made it a GUIPanel at first... didn't work..  :() have defaults, and have functions for changing them. Looks like its going pretty well.  If only I knew more about interactions so that I could create a mutator allowing me to call up the page on a key stroke.  I have the interaction code, (easy) just need help putting it in a mutator...  any help is appreciated..  I'll solve this sooner or later..

P.S.  Once I figure it out, is it ok if I post a screenie here?  I want ppl to see what this looks like  :)

{{classbox|5:45PM 01/08/03}}

Heh...  Problem found.  I can't figure out how to add an interaction to the interaction master from within a mutator.  Quite difficult I think... Solved.  :)

{{classbox|6:30PM 01/09/03}}

Grr....  crappy trace error that I got and posted on scrath pad if anyone wants to take a look.  Also started a volume for maps to start battles in.  Its quite simple right now.  As soon as you enter a timer starts.  When the timer hits 0, a battle starts.  (they look really cool right now too)  I'm working on getting the volume to start/stop counting based on player movement (like in FF games) and change the battle area based on the volume/area your in.  

{{classbox|12:55AM 01/10/03}}

AAAAAAAHHHHHHHHHHHH!!!!!!  Death to ME!!!   little did I know that the GUI object, when forced to close, closes the current GAME as well.  Oh well.  Now I will try to make the same GUIPages out of HUD objects and just add(?) them to the HUD when called.   *SIGH* it looked really good too...

{{classbox|9:06PM 01/19/03}}

Well, all the GUI stuff is working, I have a brand-new ingame menu, along with an inventory and stat system, and I'm working on the battles and how they go ingame.  Its looking really good and I've personally never made it this far in the development of a mod before so I'm really happy with myself.  :)</text>
    </revision>
    <revision>
      <id>2587</id>
      <timestamp>2003-01-10T05:58:08Z</timestamp>
      <contributor>
        <ip>Chemos</ip>
      </contributor>
      <comment>*sigh*</comment>
      <text xml:space="preserve">===Idea ===

Well, to start off with, its just gonna be the equiv to HLs VGUI.  I'm only making the message blurbs and the status screen.  Gametype and rules are next, followed by modelling (god help me) and mapping (same).  I don't know what story or what general style I want to follow, so that's gonna be configurable.  

====Into the lion's den ====

First up is the message boxes.  

Standard FF style is a straight box with text in it and a little down arrow when its done.  I'll do this one, then add a configurable var so that you can also see the persons face who's talking if you want to.  I.E.

&lt;uscript&gt;
 +-------------------------+               +----------------------+
 |  Leo:                   | &lt;-without face|(Pic)  I just wanted  |
 |        I just wanted to |               |(Pic)  say...         |
 |        say...           | with face   -&gt;|(Pic)                 |
 +-------------------------+               +----------------------+
&lt;/uscript&gt;

I don't think this will be too hard...

{{classbox|5:00PM 01/07/03}}

Okay, started on the GUIPage, (made it a GUIPanel at first... didn't work..  :() have defaults, and have functions for changing them. Looks like its going pretty well.  If only I knew more about interactions so that I could create a mutator allowing me to call up the page on a key stroke.  I have the interaction code, (easy) just need help putting it in a mutator...  any help is appreciated..  I'll solve this sooner or later..

P.S.  Once I figure it out, is it ok if I post a screenie here?  I want ppl to see what this looks like  :)

{{classbox|5:45PM 01/08/03}}

Heh...  Problem found.  I can't figure out how to add an interaction to the interaction master from within a mutator.  Quite difficult I think... Solved.  :)

{{classbox|6:30PM 01/09/03}}

Grr....  crappy trace error that I got and posted on scrath pad if anyone wants to take a look.  Also started a volume for maps to start battles in.  Its quite simple right now.  As soon as you enter a timer starts.  When the timer hits 0, a battle starts.  (they look really cool right now too)  I'm working on getting the volume to start/stop counting based on player movement (like in FF games) and change the battle area based on the volume/area your in.  

{{classbox|12:55AM 01/10/03}}

AAAAAAAHHHHHHHHHHHH!!!!!!  Death to ME!!!   little did I know that the GUI object, when forced to close, closes the current GAME as well.  Oh well.  Now I will try to make the same GUIPages out of HUD objects and just add(?) them to the HUD when called.   *SIGH* it looked really good too...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Developer Journals/Mychaeel</title>
    <id>951</id>
    <revision>
      <id>2585</id>
      <timestamp>2003-08-04T15:33:13Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>redirect (linked externally at several places)</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Mychaeel/Developer Journal|Mychaeel/Developer Journal]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DeveloperMode</title>
    <id>1087</id>
    <revision>
      <id>2878</id>
      <timestamp>2006-05-05T19:33:34Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Pasted from discussion</comment>
      <text xml:space="preserve">This information came from [[Legacy:Wormbo|Wormbo]] following discussion on [[Legacy:Uniquely Identify A Player|Uniquely Identify A Player]]

While each UT installation has a unique GUID (= PlayerIDHash, = CD Key) certain actions by the user will cause the client to go into &quot;Developer Mode&quot; and change its GUID to 5857a730-b66505da-430f3bef-2b845c38.

Only SET commands affecting ''non-config'' properties of ''actor'' (sub)classes, which can only be executed offline, will change the GUID.

==Example==

Start UT2004, go to the Settings -&gt; Game menu and note the GUID &amp;ndash; It will always be the same.  If you check the source code you'll find out it's read from GetPlayerIDHash().  Now if you restart UT2004 and type e.g. &quot;set Pawn bHidden False&quot; at the console before going to Settings -&gt; Game you will notice it now displays 5857a730-b66505da-430f3bef-2b845c38 instead of the usual GUID. 

You can restart UT2004 and it will show you the usual GUID again. On the other hand, if you execute the console command &quot;set Input Space Jump&quot; you are changing a ''config'' property of a non-Actor class.  This will ''not'' change the GUID.

==Rationale==

Default properties will stick unless the class with the modified default properties is garbage-collected.  These changes can persist into online play, which was widely abused in UT2003 and led to Wormbo developing Anti TCC in an attempt to detect these changes. 

With UT2004 Epic added the GUID change for problematic SET commands, which puts the client in &quot;developer mode&quot; and blocks it at the masterserver level, at least in the server browser.  That specific GUID is also blocked by Anti TCC, SafeGame and UTAN Ban #1971.

==Discussion==

'''Sweavo:''' pasted directly from Wormbo's comments and dressed up / edited by me.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Devilfish</title>
    <id>990</id>
    <revision>
      <id>2671</id>
      <timestamp>2005-12-06T21:12:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Devilfish}}

A water creature with nine fins.  Uses two different melee attacks: the bite and the rip.  When out of the water, it flops around and eventually dies.

==Properties==

===Main===
; byte BiteDamage :  Default: 15
; byte RipDamage :  Default: 25

===Sounds===
; Sound bite : 
; Sound rip : 

===Hidden===
; bool bAttackBump : 
; float AirTime :

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2672</id>
      <timestamp>2002-12-22T10:28:07Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; DevilFish}}

A water creature with nine fins.  Uses two different melee attacks: the bite and the rip.  When out of the water, it flops around and eventually dies.

==Properties ==
; BiteDamage :  Default: 15
; RipDamage :  Default: 25
; Health :  Default: 70

(any of these inherited?)</text>
    </revision>
    <revision>
      <id>2673</id>
      <timestamp>2004-05-20T01:23:03Z</timestamp>
      <contributor>
        <ip>64-216-188-176.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Category Class (UT)&quot; reference</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Devilfish}}

A water creature with nine fins.  Uses two different melee attacks: the bite and the rip.  When out of the water, it flops around and eventually dies.

==Properties ==

===Inherited Properties ===
; int Health (inherited from [[Legacy:Pawn (UT)|Pawn (UT)]]) : Default: 70

'''Wormbo:''' This discussion again: Should we list inherited properties or not? Their default values can be found in UnrealEd's Default Actor Properties window, their descriptions are (hopefully) available on the pages of the superclasses.

===Devilfish Group ===
; byte BiteDamage :  Default: 15
; byte RipDamage :  Default: 25

===Sounds Group ===
; Sound bite : 
; Sound rip : 

===Script-Only Properties ===
; bool bAttackBump : 
; float AirTime :

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dexter</title>
    <id>1058</id>
    <revision>
      <id>2815</id>
      <timestamp>2005-02-28T08:57:08Z</timestamp>
      <contributor>
        <ip>Dexter</ip>
      </contributor>
      <minor/>
      <comment>Update</comment>
      <text xml:space="preserve">Dexter

After all that waiting, I'm sorely disappointed by HL2's software development kit. In such news, I'm going to mess with UT2004 a bit more, like old times. Maybe learn a thing or two, so I don't have to whip out some epic code just to figure out how to do something. Maybe one day I'll come up with my own mod and put it into action. 

==[[Legacy:Dexter/Developer Journal|Dexter/Developer Journal]]==

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello Dexter. I like the class script! Have fun on Unreal Wiki. :)

'''Dexter:''' Hi, I've actually been floating around here for a good year, but only recently decided to plague the Wiki with my personal information ! Oh, btw, thanks for throwing on this guest book part. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2816</id>
      <timestamp>2004-09-24T04:34:58Z</timestamp>
      <contributor>
        <ip>63-227-251-20.chyn.qwest.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Dexter Haslem

(aka sitzkrieg, freebase)

I am 17 years old, living in Evanston, WY. 

Contact me at : 

DexterHaslem@msn.com 

Dexter@vcn.com (MSN messenger)

My general purpose is to make some kickass mods and have fun and learn a lot in the process.

As you can probably tell, I'm not much for frills - function over fashion. Thanks to EntropicLqd, I never want to have children.

* Experience : 
**C# - a month or so, hehe.
**C++ - 4 years 
*** Dabbled with HL SDK for about a year (Bots, mostly. Used botmans framework and went from there)
***Raw OpenGL Programming
***A little work with DirectX8 and 9, nothing fancy.
***Some win32api knowledge
**Assembly
*** x86 - 2 years
*** SH4 ( Dreamcast woot) - 1 year
**UnrealScript - 2 years
***one unreal mod, Lots of UT99 and a few UT2003 Mutators
***CrimsonStrife (inactive?)
***NeoTokyo [http://www.neotokyohq.com NeoTokyoHQ]

* Some of my other interest include :
**Skateboarding
**Electronics 
***Circuit design and fabrication
***General repair on TVs, audio amplifiers
***High voltage stuff (Tesla coils, Jacobs ladders..)
**Model rocketry
**Gaming 
***Quake3 / cpma [http://www.promode.org CPMA]

'''Note:'''The Dexter class is only available on request ( Sorry, no shipments out of US). Most people perfer a different subclass of pawn, as this one perfers to eat large amounts of food without warning, and has a bit of stench. It also may appear to never work despite several recompiles. 

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; Dexter}}

&lt;uscript&gt;

class Dexter extends Pawn;

function PostBeginPlay()
{
    local PersonalProject P;
    P = GetCurrentProject(self);
    while(!Dexter.PlayerReplicationInfo.bSleeping)
    {
        Dexter.Code(P);
        if(Dexter.CodeTime() &gt; Hours(15))
            Dexter.Sleep(4);
        if(Rand(6) = 4)
            Dexter.AttendSchool(City.School.mSchool);
        else
            Dexter.Code(P);
    }
}
&lt;/uscript&gt;

If for some disturbing reason you're still reading this, take a look at my development journal : 

==[[Legacy:Dexter/Developer Journal|Dexter/Developer Journal]]==

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello Dexter. I like the class script! Have fun on Unreal Wiki. :)

'''Dexter:''' Hi, I've actually been floating around here for a good year, but only recently decided to plague the Wiki with my personal information ! Oh, btw, thanks for throwing on this guest book part. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2817</id>
      <timestamp>2005-02-15T07:44:06Z</timestamp>
      <contributor>
        <ip>71-32-136-173.chyn.qwest.net</ip>
      </contributor>
      <comment>Nuked, pretty much.</comment>
      <text xml:space="preserve">Dexter Haslem

I used to write mods for UT. 

==[[Legacy:Dexter/Developer Journal|Dexter/Developer Journal]]==

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello Dexter. I like the class script! Have fun on Unreal Wiki. :)

'''Dexter:''' Hi, I've actually been floating around here for a good year, but only recently decided to plague the Wiki with my personal information ! Oh, btw, thanks for throwing on this guest book part. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dexter/Developer Journal</title>
    <id>1059</id>
    <revision>
      <id>2818</id>
      <timestamp>2004-09-24T04:39:17Z</timestamp>
      <contributor>
        <ip>63-227-251-20.chyn.qwest.net</ip>
      </contributor>
      <minor/>
      <comment>Updated</comment>
      <text xml:space="preserve">==Thur Sept 23 04: ==

Where is HL2 ? I'm quivering to work on a mod! heh..

==Sun Sept 05 04:==

Fixed journal, albeit ages late :( All progress on NT bots was lost in hard drive failure. Don't think anyone really has inertia to make more dazzle for the UT2k4 version of NT, seeing how the winners are already picked. Can't wait for HL2 SDK! On that note, Do not expect updates here anymore, as I feel they would not be serving the community, they would no longer have to do with uscript, or unreal at all. If anyone is interested, my personal journal is accessable at http://www.livejournal.com/users/dexterh_/ . Farewell!  -Dexter

==Wed Jul 21 04:==

Update! It turns out I have broken the bots in NT, right when I was getting progress. Back to the drawing board.

edit : Bots fixed, YES! Back to progress and control point capturing..

==Thur Jul 15 04 : ==

Update! ..

==Sat Jun 26 04  : ==

Wiki and Journal created. For personal reflection and productivity insurance.

No content. Fear!

'''Notes:'''The most work I have with any game engines is mostly working with bots. I haven't worked from the ground up on a robust mod, so I'm a bit lacking in that sort of thing. Although, after a few sodas and some ramen, I can generally figure out most of anything giving me hell. While unreal script is rather odd to me still, Its quite useful, and quickly becoming my favorite. I had a blast writing horrible code (read : heavy use of foreach allactors) for a good year of my lifetime. 

Thanks to whoever keeps fixing my incorrect use of the wiki, too.

----

'''Tarquin:''' that'll just be the general collective.... :) If you want to be strict, I would say use headings (== markup) for your dates rather than nest lists. But your dev journal page is your own space. so it's really up to you! :)

'''Dexter:''' Yes, == looks much better. I'll be using that.

'''Mychaeel:''' Mind if I rename &quot;Devj&quot; to &quot;Developer Journal&quot; just to keep a bit of consistency across different people's journals?

'''Dexter:''' Sure! Sorry for the incredibly late reply.. haven't been around. Don't ask for cosmetic stuff like that, just go for it :P

'''GRAFIK:''' Thanks for creating this page with the standard Developer Journal name. :) I deleted the old /Devj for you. BTW tarquin, I like the phrase &quot;general collective&quot;. Sort of like &quot;We are Borg.&quot; :P

'''Dexter:''' No problem. We are Borg!

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2819</id>
      <timestamp>2004-09-06T03:29:44Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <comment>deleted Dexter/Devj</comment>
      <text xml:space="preserve">==Sun Sept 05 04:==

Fixed journal, albeit ages late :( All progress on NT bots was lost in hard drive failure. Don't think anyone really has inertia to make more dazzle for the UT2k4 version of NT, seeing how the winners are already picked. Can't wait for HL2 SDK! On that note, Do not expect updates here anymore, as I feel they would not be serving the community, they would no longer have to do with uscript, or unreal at all. If anyone is interested, my personal journal is accessable at http://www.livejournal.com/users/dexterh_/ . Farewell! Oh yeah, could someone nuke Dexter/devj ? I can't figure out how. -Dexter

==Wed Jul 21 04:==

Update! It turns out I have broken the bots in NT, right when I was getting progress. Back to the drawing board.

edit : Bots fixed, YES! Back to progress and control point capturing..

==Thur Jul 15 04 : ==

Update! ..

==Sat Jun 26 04  : ==

Wiki and Journal created. For personal reflection and productivity insurance.

No content. Fear!

'''Notes:'''The most work I have with any game engines is mostly working with bots. I haven't worked from the ground up on a robust mod, so I'm a bit lacking in that sort of thing. Although, after a few sodas and some ramen, I can generally figure out most of anything giving me hell. While unreal script is rather odd to me still, Its quite useful, and quickly becoming my favorite. I had a blast writing horrible code (read : heavy use of foreach allactors) for a good year of my lifetime. 

Thanks to whoever keeps fixing my incorrect use of the wiki, too.

----

'''Tarquin:''' that'll just be the general collective.... :) If you want to be strict, I would say use headings (== markup) for your dates rather than nest lists. But your dev journal page is your own space. so it's really up to you! :)

'''Dexter:''' Yes, == looks much better. I'll be using that.

'''Mychaeel:''' Mind if I rename &quot;Devj&quot; to &quot;Developer Journal&quot; just to keep a bit of consistency across different people's journals?

'''Dexter:''' Sure! Sorry for the incredibly late reply.. haven't been around. Don't ask for cosmetic stuff like that, just go for it :P

'''GRAFIK:''' Thanks for creating this page with the standard Developer Journal name. :) I deleted the old /Devj for you.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2820</id>
      <timestamp>2004-09-06T03:33:25Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Sun Sept 05 04:==

Fixed journal, albeit ages late :( All progress on NT bots was lost in hard drive failure. Don't think anyone really has inertia to make more dazzle for the UT2k4 version of NT, seeing how the winners are already picked. Can't wait for HL2 SDK! On that note, Do not expect updates here anymore, as I feel they would not be serving the community, they would no longer have to do with uscript, or unreal at all. If anyone is interested, my personal journal is accessable at http://www.livejournal.com/users/dexterh_/ . Farewell! Oh yeah, could someone nuke Dexter/devj ? I can't figure out how. -Dexter

==Wed Jul 21 04:==

Update! It turns out I have broken the bots in NT, right when I was getting progress. Back to the drawing board.

edit : Bots fixed, YES! Back to progress and control point capturing..

==Thur Jul 15 04 : ==

Update! ..

==Sat Jun 26 04  : ==

Wiki and Journal created. For personal reflection and productivity insurance.

No content. Fear!

'''Notes:'''The most work I have with any game engines is mostly working with bots. I haven't worked from the ground up on a robust mod, so I'm a bit lacking in that sort of thing. Although, after a few sodas and some ramen, I can generally figure out most of anything giving me hell. While unreal script is rather odd to me still, Its quite useful, and quickly becoming my favorite. I had a blast writing horrible code (read : heavy use of foreach allactors) for a good year of my lifetime. 

Thanks to whoever keeps fixing my incorrect use of the wiki, too.

----

'''Tarquin:''' that'll just be the general collective.... :) If you want to be strict, I would say use headings (== markup) for your dates rather than nest lists. But your dev journal page is your own space. so it's really up to you! :)

'''Dexter:''' Yes, == looks much better. I'll be using that.

'''Mychaeel:''' Mind if I rename &quot;Devj&quot; to &quot;Developer Journal&quot; just to keep a bit of consistency across different people's journals?

'''Dexter:''' Sure! Sorry for the incredibly late reply.. haven't been around. Don't ask for cosmetic stuff like that, just go for it :P

'''GRAFIK:''' Thanks for creating this page with the standard Developer Journal name. :) I deleted the old /Devj for you. BTW tarquin, I like the phrase &quot;general collective&quot;. Sort of like &quot;We are Borg.&quot; :P

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dezro</title>
    <id>986</id>
    <revision>
      <id>2662</id>
      <timestamp>2004-04-11T17:20:44Z</timestamp>
      <contributor>
        <ip>Dezro</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Dezro's Personal Page ==

So now I've got UT2004, so I'm back.

===Contact Info ===

If you need to, email dezro@mac.com. I don't check it often, but I will check it.

And if you want to jot down a quick note for me, there's a section at the bottom of the page.

===Projects ===

====CarLauncher ====

Did I say finished and final? I was very wrong. Anyway, CL5. Majorly different, works a lot better, has a lot of crazy stuff in it.

I've learned a couple of things: It seems that any KVehicles for UT2003 probably won't port well. But I haven't done much testing with that. WeaponFire is now a subclass of Object, not Actor, so there's some more porting problems. The new caching system looks really awesome.

Here's a hack from CL5 to get vehicles to work right outside of teamgames: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DMFix]]

[http://homepage.mac.com/dezro/CL5.zip CL5 for UT2004]

[http://homepage.mac.com/dezro/CarLaunch.zip CarLauncher 2 for UT2003]

====Toy Projects ====

I made a couple of quick mutators on request. Very basic stuff.
* [http://homepage.mac.com/dezro/Health.zip Health] - Two mutators to modify player and vehicle health. One is kind of crude, but VehicleStuff will probably do it more elegantly.
* [http://homepage.mac.com/dezro/ObjHealth.zip ObjectiveHealth] - Two more mutators. One that modifies power core and power node health, another that modifies all DestroyableObjectives' (including cores and nodes) health by ratio.
* Ever wanted to have the game spit 99 Bottles of Beer to your console while you play? No? Oh. Well, here it is anyway. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/99 Bottles]]

===Messages and Comments ===

'''Mychaeel:''' Welcome to the Wiki, Dezro.

'''Tarquin:''' Hello &amp; welcome :)

'''Dezro:''' Ah, thank you.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2663</id>
      <timestamp>2003-01-05T07:02:07Z</timestamp>
      <contributor>
        <ip>Dezro</ip>
      </contributor>
      <comment>Small update</comment>
      <text xml:space="preserve">==Dezro's Personal Page ==

===Contact Info ===

If you need to, email dezro@mac.com. I don't check it often, but I will check it.

I hang out at the [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=249 Infogrames UT2003 Forums], or at least the Programming and Announcement forums.

And if you want to jot down a quick note for me, there's a section at the bottom of the page.

===Projects ===

====CarLauncher ====

A simple mutator that lets you drop cars from the sky. I'm amazed at how many people downloaded this. It all started when I wanted to learn UnrealScript, and my brother wanted to drive the Bulldog on BR-Bifrost. The first version didn't work on a network, and the 1.5 has a horrible bug involving car health, but it's more popular than [http://www.flyingserpent.com/kakutou/ Kakutou Raging Carnival 120%], and that's a shame.

The current version is 2.0, but I haven't really released it. I'll get to that soon, though.

====SizeFunPack ====

A collection of mutators that screw around with DrawScale or DrawScale3D in some way. Includes the [[Legacy:Mod_Ideas/MarioUT|Mario]] mutator idea from the [[Legacy:Mod_Ideas|Mod_Ideas]] section of the wiki, a mutator that flattens things, a mutator that lets you scale the players to whatever size you want, and one that scales the players randomly. And probably more.

====Toy Projects ====

''Note:'' Chances are that very few, if any, of these will be released. They're just little programming exercises.
* An xPlayer subclass that makes the player move like in a 3D platformer in FreeCamera mode.
* A variant of the link gun that lets you possess someone if you kill them with it. This really turned out good. I might just release this when I get it finished. Although in a much different form (I'll probably use the lightning gun and have it only work with headshots). Too bad I couldn't get the bots to do what I wanted without custom TeamAIs...
* The Razorjack from Unreal. It just needs some better meshes, and some working ones for the first-person view and the xWeaponAttachment. It works great otherwise.
* A vacuum cleaner, sorta. Kinda like the U4ET Airblast, only not as good.
* A tractor beam. Also not too good, but it is kinda fun grabbing the red flag carrier and dropping him off the level.
* A mutator that was going to allow more than two firing modes for each weapon. Alas, it was not to be, but portions were gutted for the next version of CarLauncher.
* Somehow I've got the idea of making a mod based on Rogue. I know that it's a stupid idea, but I'm going to try it anyway. '''''Update:''''' Well, this didn't work out at all. I'd need to have some native code in there, which ain't going to happen.
* '''''New:''''' Ever wanted to have the game spit 99 Bottles of Beer to your console while you play? No? Oh. Well, here it is anyway. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/99 Bottles]]

===Messages and Comments ===

'''Mychaeel:''' Welcome to the Wiki, Dezro.

'''Tarquin:''' Hello &amp; welcome :)

'''Dezro:''' Ah, thank you.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2664</id>
      <timestamp>2004-03-20T12:02:35Z</timestamp>
      <contributor>
        <ip>Dezro</ip>
      </contributor>
      <comment>CL4 Update</comment>
      <text xml:space="preserve">==Dezro's Personal Page ==

So now I've got UT2004, so I'm back.

===Contact Info ===

If you need to, email dezro@mac.com. I don't check it often, but I will check it.

And if you want to jot down a quick note for me, there's a section at the bottom of the page.

===Projects ===

====CarLauncher ====

CL4 is finished and final. 

I've learned a couple of things: It seems that any KVehicles for UT2003 probably won't port well. But I haven't done much testing with that. WeaponFire is now a subclass of Object, not Actor, so there's some more porting problems. The new caching system looks really awesome.

[http://homepage.mac.com/dezro/CL4.zip CL4 for UT2004]

[http://homepage.mac.com/dezro/CarLaunch.zip CarLauncher 2 for UT2003]

====Toy Projects ====

No time for that right now. But here's my old singing thing.
* Ever wanted to have the game spit 99 Bottles of Beer to your console while you play? No? Oh. Well, here it is anyway. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/99 Bottles]]

===Messages and Comments ===

'''Mychaeel:''' Welcome to the Wiki, Dezro.

'''Tarquin:''' Hello &amp; welcome :)

'''Dezro:''' Ah, thank you.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dezro/99 Bottles</title>
    <id>993</id>
    <revision>
      <id>2679</id>
      <timestamp>2003-01-10T01:49:21Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Sing 99 Bottles of Beer ==

And this is the last place I'm putting this thing. I swear.

Inspired by http://99-bottles-of-beer.ls-la.net/

&lt;uscript&gt;
// 99 Bottles of Beer, in UnrealScript. Sings to every player
// simultaneously. Written for UT2003, but would work on other Unreal
// Engine games with little to no modification.
// Probably works on a network. I haven't checked.

// Written by &quot;Dezro&quot; Dave Smith: dezro@mac.com

class MutBottlesBeer extends Mutator;

var int StartingBottles;
var int CurrentBottle;
var int SongLine;
var bool Begun;
var bool StopSong;

function ModifyPlayer(Pawn Other)
{
	Super.ModifyPlayer(Other);
	if (!Begun)
	{
		CurrentBottle = StartingBottles;
		SetTimer(1.5, true);
		Begun = true;
	}
}

function Timer()
{
	local Controller C;
	local bool PassAround;

	if (StopSong)
	{
		SetTimer(0.001, false);
		return;
	}

	for (C = Level.ControllerList; C != None; C = C.NextController)
	{
		Switch (SongLine)
		{
		Case 0:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;One bottle of beer on the wall,&quot;);
			else
				C.Pawn.ClientMessage(CurrentBottle $ &quot; bottles of beer on the wall,&quot;);
			Break;
		Case 1:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;One bottle of beer.&quot;);
			else
				C.Pawn.ClientMessage(CurrentBottle $ &quot; bottles of beer.&quot;);
			Break;
		Case 2:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;Take it down, pass it around,&quot;);
			else
				C.Pawn.ClientMessage(&quot;Take one down, pass it around,&quot;);
			PassAround = true;
			Break;
		Default:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;One bottle of beer on the wall.&quot;);
			else if (CurrentBottle &lt; 1)
			{
				C.Pawn.ClientMessage(&quot;No more bottles of beer on the wall!&quot;);
				StopSong = true;
			}
			else
				C.Pawn.ClientMessage(CurrentBottle $ &quot; bottles of beer on the wall.&quot;);
			Break;
		}
	}
	if (PassAround)
	{
		CurrentBottle--;
		PassAround = false;
	}
	SongLine++;
	if (SongLine &gt; 3)
		SongLine = 0;
}

defaultproperties {
	FriendlyName=&quot;99 Bottles&quot;
	Description=&quot;Sings to you during the battle.&quot;
	StartingBottles = 99
}
&lt;/uscript&gt;

==Comments ==

'''Wormbo:''' Nice. Actually you could optimize and localize it with [[Legacy:LocalMessage|LocalMessage]]s, since the song also exists in other languages. :)

'''Tarquin:''' Submit it to http://99-bottles-of-beer.ls-la.net/ ! Can you have arrays of strings? Might be neater than using the &quot;switch&quot; statement.

'''Dezro:''' I've already submitted it. I didn't use [[Legacy:LocalMessage|LocalMessage]]s, since I wanted to keep it down to one file. I didn't use string arrays, because I didn't think of it. I should have... I could have added some customization if I went that route, too, which would make up for the lack of localization a bit. Ah, well.

'''Ike Bart:''' I tried to compile it in UnrealEd 2 and I got an error on line 29. It said: '''''Error in MutBottlesBeer, Line 29: Unrecognized type 'Controller.' ''''' Since I'm an absolute newbie at Unreal script for Unreal Tournament, I'd like to know what to do to make it compatible with Unreal Tournament.

'''Dezro:''' That's the &quot;little modification&quot; I was talking about. UT1 doesn't use the pawn/controller setup, so you'd have to change some things. Make the following changes to the code:

{|

|-
|''Wherever you find this''
|''Replace it with this''
|-
|local Controller C;
|local Pawn P;
|-
|for (C = Level.ControllerList; C != None; C = C.NextController)
|for (P = Level.PawnList; P != None; P = P.NextPawn)
|-
|C.Pawn.ClientMessage
|P.ClientMessage
|}

'''Ike Bart:''' After making those changes, I get an error message at line 84.  It said: '''''Error in MutBottlesBeer, Line 84: Unexpected 'defaultproperties' '''

'''Dezro:''' That's a different problem. You're not supposed to use UnrealEd when coding. If you stll want to, remove the &quot;var int StartingBottles;&quot; line, replace every other instance of &quot;StartingBottles&quot; with 99, and delete the &quot;defaultproperties&quot; block. It'll compile after that, probably.

'''Ike Bart:''' Thanks for the suggestion, Dezro.  I got UnrealEd to compile the script after following your suggestions.  Now I have to test it out in Unreal Tournament.  I hope I made the .ini file for it correctly.

'''Ike Bart:''' I tested it out in Unreal Tournament and it works.  It took around nine minutes to finish off all 99 bottles of beer.</text>
    </revision>
    <revision>
      <id>2680</id>
      <timestamp>2003-01-10T01:23:17Z</timestamp>
      <contributor>
        <ip>A2-2c122.neo.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Sing 99 Bottles of Beer ==

And this is the last place I'm putting this thing. I swear.

Inspired by http://99-bottles-of-beer.ls-la.net/

&lt;uscript&gt;
// 99 Bottles of Beer, in UnrealScript. Sings to every player
// simultaneously. Written for UT2003, but would work on other Unreal
// Engine games with little to no modification.
// Probably works on a network. I haven't checked.

// Written by &quot;Dezro&quot; Dave Smith: dezro@mac.com

class MutBottlesBeer extends Mutator;

var int StartingBottles;
var int CurrentBottle;
var int SongLine;
var bool Begun;
var bool StopSong;

function ModifyPlayer(Pawn Other)
{
	Super.ModifyPlayer(Other);
	if (!Begun)
	{
		CurrentBottle = StartingBottles;
		SetTimer(1.5, true);
		Begun = true;
	}
}

function Timer()
{
	local Controller C;
	local bool PassAround;

	if (StopSong)
	{
		SetTimer(0.001, false);
		return;
	}

	for (C = Level.ControllerList; C != None; C = C.NextController)
	{
		Switch (SongLine)
		{
		Case 0:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;One bottle of beer on the wall,&quot;);
			else
				C.Pawn.ClientMessage(CurrentBottle $ &quot; bottles of beer on the wall,&quot;);
			Break;
		Case 1:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;One bottle of beer.&quot;);
			else
				C.Pawn.ClientMessage(CurrentBottle $ &quot; bottles of beer.&quot;);
			Break;
		Case 2:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;Take it down, pass it around,&quot;);
			else
				C.Pawn.ClientMessage(&quot;Take one down, pass it around,&quot;);
			PassAround = true;
			Break;
		Default:
			if (CurrentBottle == 1)
				C.Pawn.ClientMessage(&quot;One bottle of beer on the wall.&quot;);
			else if (CurrentBottle &lt; 1)
			{
				C.Pawn.ClientMessage(&quot;No more bottles of beer on the wall!&quot;);
				StopSong = true;
			}
			else
				C.Pawn.ClientMessage(CurrentBottle $ &quot; bottles of beer on the wall.&quot;);
			Break;
		}
	}
	if (PassAround)
	{
		CurrentBottle--;
		PassAround = false;
	}
	SongLine++;
	if (SongLine &gt; 3)
		SongLine = 0;
}

defaultproperties {
	FriendlyName=&quot;99 Bottles&quot;
	Description=&quot;Sings to you during the battle.&quot;
	StartingBottles = 99
}
&lt;/uscript&gt;

==Comments ==

'''Wormbo:''' Nice. Actually you could optimize and localize it with [[Legacy:LocalMessage|LocalMessage]]s, since the song also exists in other languages. :)

'''Tarquin:''' Submit it to http://99-bottles-of-beer.ls-la.net/ ! Can you have arrays of strings? Might be neater than using the &quot;switch&quot; statement.

'''Dezro:''' I've already submitted it. I didn't use [[Legacy:LocalMessage|LocalMessage]]s, since I wanted to keep it down to one file. I didn't use string arrays, because I didn't think of it. I should have... I could have added some customization if I went that route, too, which would make up for the lack of localization a bit. Ah, well.

'''Ike Bart:''' I tried to compile it in UnrealEd 2 and I got an error on line 29. It said: '''''Error in MutBottlesBeer, Line 29: Unrecognized type 'Controller.' ''''' Since I'm an absolute newbie at Unreal script for Unreal Tournament, I'd like to know what to do to make it compatible with Unreal Tournament.

'''Dezro:''' That's the &quot;little modification&quot; I was talking about. UT1 doesn't use the pawn/controller setup, so you'd have to change some things. Make the following changes to the code:

{|

|-
|''Wherever you find this''
|''Replace it with this''
|-
|local Controller C;
|local Pawn P;
|-
|for (C = Level.ControllerList; C != None; C = C.NextController)
|for (P = Level.PawnList; P != None; P = P.NextPawn)
|-
|C.Pawn.ClientMessage
|P.ClientMessage
|}

'''Ike Bart:''' After making those changes, I get an error message at line 84.  It said: '''''Error in MutBottlesBeer, Line 84: Unexpected 'defaultproperties' '''

'''Dezro:''' That's a different problem. You're not supposed to use UnrealEd when coding. If you stll want to, remove the &quot;var int StartingBottles;&quot; line, replace every other instance of &quot;StartingBottles&quot; with 99, and delete the &quot;defaultproperties&quot; block. It'll compile after that, probably.

'''Guest:''' Thanks for the suggestion, Dezro.  I got UnrealEd to compile the script after following your suggestions.  Now I have to test it out in Unreal Tournament.  I hope I made the .ini file for it correctly.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dezro/DMFix</title>
    <id>994</id>
    <revision>
      <id>2681</id>
      <timestamp>2004-04-11T17:22:41Z</timestamp>
      <contributor>
        <ip>Dezro</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class DMFix extends GameRules;

function PostBeginPlay()
{
	Super.PostBeginPlay();
	
	if (!Level.Game.bAllowVehicles)
		Level.Game.bAllowVehicles = true;
}

function bool PreventDeath(Pawn Killed, Controller Killer, class&lt;DamageType&gt; damageType, vector HitLocation)
{
	local Pawn Driver;

	if ( (NextGameRules != None) &amp;&amp; NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation) )
		return true;

	if ( Vehicle(Killed)!=none &amp;&amp; Vehicle(Killed).Driver!=none )
	{
		Driver = Vehicle(Killed).Driver;
		Vehicle(Killed).KDriverLeave(true);
		Driver.TakeDamage( max(999, Driver.Health*2), Killer.Pawn, HitLocation, VRand(), damageType);
	}

	return false;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Digger</title>
    <id>1007</id>
    <revision>
      <id>2708</id>
      <timestamp>2003-06-10T08:06:42Z</timestamp>
      <contributor>
        <ip>Digger</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">26 year old single male from Utah.  Trying to figure UT2K3 out.  Slow goings.

'''Mosquito:''' Welcome, are you thinking about going into any development category?  Such as modelling, mapping, coding, etc?

'''Digger:''' Hello there!  Well, I am sticking with coding for right now, but I hope to become familiar with all of it before too long.</text>
    </revision>
    <revision>
      <id>2709</id>
      <timestamp>2003-05-18T21:58:35Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">26 year old single male from Utah.  Trying to figure UT2K3 out.  Slow goings.

'''Mosquito:''' Welcome, are you thinking about going into any development category?  Such as modelling, mapping, coding, etc?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dimension4</title>
    <id>1085</id>
    <revision>
      <id>2875</id>
      <timestamp>2008-02-19T16:13:38Z</timestamp>
      <contributor>
        <ip>Dimension4</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Unreal 1 and Unreal Tournament player.

==Clans==
*Unreal 1: 
**. [] (Leader=Pcube) (???)
**. [iC] (Leader=Cheese) (Industrial Carnage)

===Skills===

1. Coding = Perfect

2. Mapping = Average

3. Playing = Average

====General Discussion====</text>
    </revision>
    <revision>
      <id>2876</id>
      <timestamp>2007-09-16T09:41:58Z</timestamp>
      <contributor>
        <ip>42-125-207-82.ip.ukrtel.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Unreal 1 and Unreal Tournament player.

==Clans==
*Unreal 1: 
**. [] (Leader=Pcube) (???)
**. [iC] (Leader=Cheese) (Industrial Carnage)
*Unreal Tournament:
**. =UC= (Leader=Dimension4) (Unreal Coders)
**. -DBT- (Leader=Pioneer\Unleash) (Devil Bunny Tracks)

===Skills===

1. Coding = Perfect

2. Mapping = Average

3. Playing = Average

====General Discussion====</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dirk Fist</title>
    <id>1048</id>
    <revision>
      <id>2794</id>
      <timestamp>2004-03-04T11:59:30Z</timestamp>
      <contributor>
        <ip>Dirk Fist</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi Ive been playing with uscript for about 5 months

My First Wiki Project :) [[Legacy:DynaMusic|DynaMusic]]

'''Tarquin:''' Hi, welcome :)

'''Dirk Fist:''' Hi, Tarquin  (mind if I call you Tarq?)

'''Tarquin:''' Go ahead :) everyone else does! I've even put 'tarq' in my list of IRC alerts! ;)

'''Dirk:''' Oh, and Hi FoxPaw, thanks for responding to my question :D

'''Tarquin:''' You can go ahead and create a page [[Legacy:DynaMusic|DynaMusic]]. :)

'''Dirk Fist:''' Thanks Tarq. Is there some way to make the component available for download (.u or .unr) ?

'''Dirk Fist:''' Would anything be needed to make it compatible with (UT2k3) ?
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2795</id>
      <timestamp>2004-03-03T10:45:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>note about DynaMusic</comment>
      <text xml:space="preserve">Hi Ive been playing with uscript for about 5 months

'''Tarquin:''' Hi, welcome :)

'''Dirk Fist:''' Hi, Tarquin  (mind if I call you Tarq?)

'''Tarquin:''' Go ahead :) everyone else does! I've even put 'tarq' in my list of IRC alerts! ;)

'''Dirk:''' Oh, and Hi FoxPaw, thanks for responding to my question :D

----

My First Wiki Project :)

What page should it go on ?

Can I upload a .u or .unr file ?

'''Tarquin:''' You can go ahead and create a page [[Legacy:DynaMusic|DynaMusic]]. :)

DynaMusic optional music for mappers !

Usage: 
# Follow the directions for [[Legacy:Embedding Code|Embedding Code]] 
# Place dynamusic actor on your map 
# Right click on it to bring up properties
# Select the DynaMusic/LoadSong property and type in the song &quot;PackageName.SongName&quot; you want to be optional 
# Right click on empty part of map to bring up the level properties 
# Change audio/song to one of the standard UT music packages ( this package won't be optional )

----

The way it works: 
# When the player connects DynaMusic attempts to load music package 
# If it's successful it overides the maps default music (as defined in Level properties), with the optional music

----

&lt;uscript&gt;
//=============================================================================
// DynaMusic.       By Dirk Fist  with all do credit to the people of the Wiki 
//=============================================================================
class DynaMusic expands Actor;

var() string LoadSong;
var music song;
var PlayerPawn MusicPlayer;
var bool bMusicStarted;
var int started;

replication
{   // Variables which will cause replication to all (relevant) clients
    reliable if ( Role == ROLE_Authority )
        started,LoadSong;
}

function PreBeginPlay()           // executed on server
{
    started +=1;                  // force replication
    Super.PreBeginPlay();
}

auto simulated state startup
{
Begin:
    log(&quot;Started&quot;,'Dynamusic');
    song = music(DynamicLoadObject( LoadSong, class'Music',True));
    if (song!=None)
    {   // we got a song lets find player
        log(string(song.Class),'Dynamusic');

        foreach AllActors(class 'PlayerPawn', MusicPlayer)
            if (Viewport(MusicPlayer.Player) != None)  break; 
        if (MusicPlayer != None)
        {   // We got player lets play 
            MusicPlayer.ClientSetMusic( song, Level.SongSection, Level.CdTrack, MTRAN_Fade );    
            log(MusicPlayer.PlayerReplicationInfo.PlayerName,'Dynamusic');        
    }   }
}

defaultproperties
{
    bAlwaysRelevant=True
    RemoteRole=ROLE_SimulatedProxy
}
&lt;/uscript&gt;

----

'''Dirk Fist:''' Found some info on making the packages optional http://unreal.epicgames.com/UTMagic.html#PackageFlags

'''Dirk Fist:''' If any one knows another way I'd be glad to hear it? Since I don't want to cause version conflicts for maps that use non-optional umx(ogg?) version of the file, Since this is a mapping component and many mappers will probably borrow music from other maps.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dispatcher</title>
    <id>940</id>
    <revision>
      <id>2560</id>
      <timestamp>2007-11-18T22:12:17Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Dispatcher (Package: Engine)}}

''Replaced in [[Legacy:UT2003|UT2003]] by the [[Legacy:ScriptedTrigger|ScriptedTrigger]].''

A dispatcher is a [[Legacy:Trigger|Trigger]] meant for taking another Trigger's [[Legacy:Event|Event]] and sending out a bunch of new events. The dispatcher also has the capability to time when to send out these subsequent events. It is important to point out that the location of a dispatcher is totally irrelevant to its function: it is not affected by players touching it. However, it is generally advisable to put a dispatcher near to the trigger that it will be triggered by or the actors that it will in turn trigger just for organization's sake.

==Properties ==
; OutEvents : list of events the dispatcher will fire, in order. Note that UnrealEd will ''not'' draw a red line to tiw actors whose Tag matches these events. (If you're paranoid about this, type the event name in the wrong case; UnrealEd will fix the case if there's a match). If you wish to make more than 7 events, link in a second dispatcher.
; OutDelays : 
the time to wait before firing the corresponding event. These are sequential; ie the dispatcher works like this:
* wait time OutDelays[0]
** fire event OutEvents[0]
* wait time OutDelays[1]

** fire event OutEvents[1]
* and so on.

These can be equal to zero; thus firing several events simultaneously.


==Examples ==

===Simple example ===

An example would be if you want the dispatcher to trigger 3 events upon the event &quot;xxx&quot; being sent out. The 3 events you want to send out are &quot;yyy&quot; at the same time that &quot;xxx&quot; was sent out, &quot;yyy&quot; again 20 seconds later, and &quot;zzz&quot; at the same time as the second &quot;yyy&quot;. The properties you would fill in would be this:
*OutDelays
**'''0''' - 0.0
**'''1''' - 20.0
**'''2''' - 0.0
*OutEvents
**'''0''' - yyy
**'''1''' - yyy
**'''2''' - zzz

===Delaying ===

There is another good trick that can be done with Dispatchers.  Sometimes you need to trigger something, but then you need to make it wait before the actual Event happens.  This can be done by putting a Dispatcher between the two Events in the chain.

So, if you triggered the Dispatcher's tag xxx, but you needed it to wait 5 seconds before it triggered aaa, here's how it will look:
*OutDelays
**'''0''' - 5.0
*OutEvents
**'''0''' - aaa

Notice that you're not doing anything except triggering an actor that will wait 5 seconds.  This is a little trick that editors will sometimes use for such things as properly timing their special effects.

Note that a dispatcher's OutDelays are cumulative. In other words, if you have:
*OutDelay 1
*OutDelay 3
*OutDelay 4

Then the second event is called three seconds after the first, and four seconds after the dispatcher is triggered, and the third event four seconds after the second, and eight seconds in total from the time the dispatcher is called.

===Further examples ===
* [[Legacy:Trigger Systems|Trigger Systems]] &amp;ndash; systems using several trigger actors to obtain complex behaviour.
* A tutorial which uses this actor: [[Legacy:Lightning Storm|Lightning Storm]]

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; main page for everything about triggers
* [[Legacy:Event|Event]] &amp;ndash; overview of how triggering works
* [[Legacy:Types Of Trigger|Types of Trigger]] &amp;ndash; summary of the different kinds of trigger actor

==Custom Subclasses ==

===Haltable dispatcher ===

'''Tarquin:'''  A dispatcher which stops if triggered while dispatching. This is untested; I have no idea what happens to state label code when a function is called. see [[Legacy:Create A Subclass|Create A Subclass]] for instructions.

&lt;uscript&gt;
state Dispatch
{
	function Trigger( actor Other, pawn EventInstigator )
	{
		gotostate('');
	}

Begin:
	for( i=0; i&lt;ArrayCount(OutEvents); i++ )
	{
		if( OutEvents[i] != '' )
		{
			Sleep( OutDelays[i] );
			foreach AllActors( class 'Actor', Target, OutEvents[i] )
				Target.Trigger( Self, Instigator );
		}
	}
}
&lt;/uscript&gt;

===Elephant Dispatcher ===

Normal Disp breaks the chain of command. This remembers who Triggered it  and passes this information on to the actors it triggers. See [[Legacy:Event|Event]] for details.

&lt;uscript&gt;
//=============================================================================
// ChainDispatcher.
//=============================================================================
class ChainDispatcher extends Dispatcher;
// Remembers who Triggered it 
// and passes this information along the chain of command

var actor SavedTrigger ;

//
// When dispatcher is triggered...
//
function Trigger( actor Other, pawn EventInstigator )
{
	SavedTrigger  = Other ;
	super.Trigger( Other, EventInstigator );
}

//
// Dispatch events.
//
state Dispatch
{
Begin:
	disable('Trigger');
	for( i=0; i&lt;ArrayCount(OutEvents); i++ )
	{
		if( OutEvents[i] != '' )
		{
			Sleep( OutDelays[i] );
			foreach AllActors( class 'Actor', Target, OutEvents[i] )
				Target.Trigger( SavedTrigger, Instigator );
		}
	}
	enable('Trigger');
}
&lt;/uscript&gt;

----

[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy Custom Class (UT)]]&lt;br /&gt;[[:Category:Legacy To Do]] move the custom subclasses into sub pages?
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2561</id>
      <timestamp>2006-04-07T07:54:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Dispatcher (Package: Engine)}}

''Replaced in [[Legacy:UT2003|UT2003]] by the [[Legacy:ScriptedTrigger|ScriptedTrigger]].''

A dispatcher is a [[Legacy:Trigger|Trigger]] meant for taking another Trigger's [[Legacy:Event|Event]] and sending out a bunch of new events. The dispatcher also has the capability to time when to send out these subsequent events. It is important to point out that the location of a dispatcher is totally irrelevant to its function: it is not affected by players touching it. However, it is generally advisable to put a dispatcher near to the trigger that it will be triggered by or the actors that it will in turn trigger just for organization's sake.

==Properties ==
; OutEvents : list of events the dispatcher will fire, in order. Note that UnrealEd will ''not'' draw a red line to tiw actors whose Tag matches these events. (If you're paranoid about this, type the event name in the wrong case; UnrealEd will fix the case if there's a match). If you wish to make more than 7 events, link in a second dispatcher.
; OutDelays : 
the time to wait before firing the corresponding event. These are sequential; ie the dispatcher works like this:
* wait time OutDelays[0]
** fire event OutEvents[0]
* wait time OutDelays[1]

** fire event OutEvents[1]
* and so on.

These can be equal to zero; thus firing several events simultaneously.


==Examples ==

===Simple example ===

An example would be if you want the dispatcher to trigger 3 events upon the event &quot;xxx&quot; being sent out. The 3 events you want to send out are &quot;yyy&quot; at the same time that &quot;xxx&quot; was sent out, &quot;yyy&quot; again 20 seconds later, and &quot;zzz&quot; at the same time as the second &quot;yyy&quot;. The properties you would fill in would be this:
*OutDelays
**'''0''' - 0.0
**'''1''' - 20.0
**'''2''' - 0.0
*OutEvents
**'''0''' - yyy
**'''1''' - yyy
**'''2''' - zzz

===Delaying ===

There is another good trick that can be done with Dispatchers.  Sometimes you need to trigger something, but then you need to make it wait before the actual Event happens.  This can be done by putting a Dispatcher between the two Events in the chain.

So, if you triggered the Dispatcher's tag xxx, but you needed it to wait 5 seconds before it triggered aaa, here's how it will look:
*OutDelays
**'''0''' - 5.0
*OutEvents
**'''0''' - aaa

Notice that you're not doing anything except triggering an actor that will wait 5 seconds.  This is a little trick that editors will sometimes use for such things as properly timing their special effects.

Note that a dispatcher's OutDelays are cumulative. In other words, if you have:
*OutDelay 1
*OutDelay 3
*OutDelay 4

Then the second event is called three seconds after the first, and four seconds after the dispatcher is triggered, and the third event four seconds after the second, and eight seconds in total from the time the dispatcher is called.

===Further examples ===
* [[Legacy:Trigger Systems|Trigger Systems]] &amp;ndash; systems using several trigger actors to obtain complex behaviour.
* A tutorial which uses this actor: [[Legacy:Lightning Storm|Lightning Storm]]

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; main page for everything about triggers
* [[Legacy:Event|Event]] &amp;ndash; overview of how triggering works
* [[Legacy:Types Of Trigger|Types of Trigger]] &amp;ndash; summary of the different kinds of trigger actor

==Custom Subclasses ==

===Haltable dispatcher ===

'''Tarquin:'''  A dispatcher which stops if triggered while dispatching. This is untested; I have no idea what happens to state label code when a function is called. see [[Legacy:Create A Subclass|Create A Subclass]] for instructions.

&lt;uscript&gt;
state Dispatch
{
	function Trigger( actor Other, pawn EventInstigator )
	{
		gotostate('');
	}

Begin:
	for( i=0; i&lt;ArrayCount(OutEvents); i++ )
	{
		if( OutEvents[i] != '' )
		{
			Sleep( OutDelays[i] );
			foreach AllActors( class 'Actor', Target, OutEvents[i] )
				Target.Trigger( Self, Instigator );
		}
	}
}
&lt;/uscript&gt;

===Elephant Dispatcher ===

Normal Disp breaks the chain of command. This remembers who Triggered it  and passes this information on to the actors it triggers. See [[Legacy:Event|Event]] for details.

&lt;uscript&gt;
//=============================================================================
// ChainDispatcher.
//=============================================================================
class ChainDispatcher extends Dispatcher;
// Remembers who Triggered it 
// and passes this information along the chain of command

var actor SavedTrigger ;

//
// When dispatcher is triggered...
//
function Trigger( actor Other, pawn EventInstigator )
{
	SavedTrigger  = Other ;
	super.Trigger( Other, EventInstigator );
}

//
// Dispatch events.
//
state Dispatch
{
Begin:
	disable('Trigger');
	for( i=0; i&lt;ArrayCount(OutEvents); i++ )
	{
		if( OutEvents[i] != '' )
		{
			Sleep( OutDelays[i] );
			foreach AllActors( class 'Actor', Target, OutEvents[i] )
				Target.Trigger( SavedTrigger, Instigator );
		}
	}
	enable('Trigger');
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DispersionPistol</title>
    <id>28358</id>
    <revision>
      <id>40025</id>
      <timestamp>2009-11-15T07:50:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Displaying Variables In UnrealEd</title>
    <id>1033</id>
    <revision>
      <id>2760</id>
      <timestamp>2003-11-24T15:44:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Declaration==

To make a class variable show up in one of [[Legacy:UnrealEd|UnrealEd]]'s property windows ([[Legacy:Actor Properties Window|Actor Properties Window]], [[Legacy:Material|Material]] properties, etc.) you have to declare it with a pair of parentheses after the keyword ''var''. You can also specify a group name in the parentheses to make the variable show up in that property group. If you don't specify a group name, the class name is used as the group.

===Examples===

This declaration in the [[Legacy:Material|Material]] class adds the FallbackMaterial property to the Material group:

&lt;uscript&gt;
var() Material FallbackMaterial;
&lt;/uscript&gt;

These two properties of the Actor class are displayed in the Advanced group in the [[Legacy:Actor Properties Window|Actor Properties Window]]:

&lt;uscript&gt;
var(Advanced) bool bHighDetail;
var(Advanced) bool bSuperHighDetail;
&lt;/uscript&gt;

==Managing Property Groups==

Often a class doesn't need all the properties its superclass(es) declared.

In newer builds of the Unreal Engine (e.g. in UT2003) you can tell the engine to hide certain property groups through the HideCategories() [[Legacy:Class Syntax|class modifier]]. This modifier is also applied to all subclasses, so if you want to show a property group in a subclass again, you have to use the ShowCategories() class modifier.

Both modifiers take a comma-seperated list of group names.

There's also a special group ''None'', which contains all variables not declared with parentheses. This group will only show up in-game when using the ''EditActor'' and ''EditObj'' [[Legacy:Console Commands|console commands]].

===Examples===

The [[Legacy:Info|Info]] class hides certain [[Legacy:Actor|Actor]] property groups because Info classes are information holders and e.g. don't move or collide with other things:

&lt;uscript&gt;
class Info extends Actor
	abstract
	hidecategories(Movement,Collision,Lighting,LightColor,Karma,Force)
	native;
&lt;/uscript&gt;

The [[Legacy:MaterialSequence|MaterialSequence]] class doesn't need the [[Legacy:Modifier|Modifier]] properties, but wants to display the [[Legacy:Material|Material]] properties, which the [[Legacy:Modifier|Modifier]] class hides using HideCategories.

&lt;uscript&gt;
class MaterialSequence extends Modifier
	editinlinenew
	hidecategories(Modifier)
	showcategories(Material)
	native;
&lt;/uscript&gt;

==Types Of Editor Properties==

The differnt types of properties could be put into several groups for UnrealEd users:
; Basic [[Legacy:Variable Type|variable type]]s : Properties where you can only enter a value.
; Byte properties : Like basic types, but the value can also be selected through a slider.
; Struct properties : Contain several other properties from all groups mentined here.
; Color properties : The RGB values can also be selected through the Windows color dialog window.
; Bool, enum and class properties : Allow the user to select one value or class from a drop-down list.
; Object references : An object can only be applied to the property.
; Inline objects : Allow the user to edit the object's properties similar to structs.
; Array properties : Either with a fixed or variable number of properties, which all have the same variable type.

===Basic Variable Types===

The basic [[Legacy:Variable Type|variable type]]s int, float, string and name only display an editbox for the user for typing in a new value.

[[Image:Legacy_interface-Ed3-propertywidgets-simple.png|center|A float property.]]

===Byte Properties===

The basic [[Legacy:Variable Type|variable type]] byte displays a small editbox for directly typing in a value and a slider ranging from 0 to 255.

[[Image:Legacy_interface-Ed3-propertywidgets-byte.png|center|A byte property]]

===Structs===

Structs contain a number of other properties of any type. The properties are displayed indented and can be hidden or displayed with the little plus sign on the left side.

[[Image:Legacy_interface-Ed3-propertywidgets-struct.png|center|A [[Legacy:Rotator|rotator]] struct.]]

===Colors===

Color is one of the [[Legacy:Built-In Struct|Built-In Struct]] and is handled in a special way by UnrealEd. Instead of the struct's value the color is displayed and there are two buttons:
* '''Pick''' ''(How does this work?)''
* '''...''' opens the Windows color selection dialog window. The color you select in this dialog is applied to the R, G and B values of the color property, the A value is left unchanged.

[[Image:Legacy_interface-Ed3-propertywidgets-color.png|center|A color struct.]]

===Bool, Enum And Class Properties===

Bool and enum properties display the currently selected value and a button which opens a drop-down list with all possible values.

[[Image:Legacy_interface-Ed3-propertywidgets-bool.png|center|A bool property.@block@interface-Ed3-inlineobjects-class A class&lt;[[Legacy:ZoneInfo|ZoneInfo]]&gt; property.]]

===Object References===

Object variables without the [[Legacy:Editinline|editinline]] modifier are displayed as an editbox with three additional buttons: &quot;Clear&quot; sets the property to ''None'', &quot;Use&quot; sets the property to the resource selected in the corresponding browser or the currently selected actor and &quot;...&quot; opens the corresponding browser for [[Legacy:Material|Material]]s, [[Legacy:Sound|Sound]]s, [[Legacy:Static Mesh|Static Mesh]]es, etc.

[[Image:Legacy_interface-Ed3-inlineobjects-default.png|center|A simple [[Legacy:Material|Material]] reference.]]

===Inline Objects===

Variables declared with an [[Legacy:Editinline|editinline]]* modifier work almost like normal object references, but also display the referenced object's properties.

[[Image:Legacy_interface-Ed3-inlineobjects-editinline-3.png|center|An inline object of class [[Legacy:FinalBlend|FinalBlend]].]]

The '''editinline''' modifier removes the &quot;Use&quot; button, but adds a drop-down list with a &quot;New&quot; button for creating new objects.

[[Image:Legacy_interface-Ed3-inlineobjects-editinline-1.png|center|An empty ''editinline'' reference.]]

[[Image:Legacy_interface-Ed3-inlineobjects-editinline-2.png|center|Select the class of the new object before creating it.]]

The '''editinlineuse''' modifier works like '''editinline''', but also re-adds the &quot;Use&quot; button.

[[Image:Legacy_interface-Ed3-inlineobjects-editinlineuse-1.png|center|An empty ''editinlineuse'' reference.]]

===Arrays===

The two array types work quite similarly in the properties window. Both display a list of items named '''[0]''', '''[1]''', etc.

Static arrays have a fixed number of elements.

[[Image:Legacy_interface-Ed3-arrays-static.png|center|A static array.]]

Dynamic arrays also display the buttons &quot;Empty&quot; and &quot;Add&quot; for the whole array and &quot;Delete&quot; and &quot;Insert&quot; for an array element. &quot;Add&quot; inserts a new array element after the last existing element, while &quot;Insert&quot; inserts it before the currently selected element.

[[Image:Legacy_interface-Ed3-arrays-dynamic-1.png|center|An empty dynamic array.]]

[[Image:Legacy_interface-Ed3-arrays-dynamic-2.png|center|Two new elements have been added.]]

==Related Topics==
* [[Legacy:Actor Properties Window|Actor Properties Window]]
* [[Legacy:Editinline|Editinline]]
* [[Legacy:Variable Syntax|Variable Syntax]]
* [[Legacy:Variable Type|Variable Type]]</text>
    </revision>
    <revision>
      <id>2761</id>
      <timestamp>2003-11-24T15:27:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Declaration==

To make a class variable show up in one of [[Legacy:UnrealEd|UnrealEd]]'s property windows ([[Legacy:Actor Properties Window|Actor Properties Window]], [[Legacy:Material|Material]] properties, etc.) you have to declare it with a pair of parentheses after the keyword ''var''. You can also specify a group name in the parentheses to make the variable show up in that property group. If you don't specify a group name, the class name is used as the group.

===Examples===

This declaration in the [[Legacy:Material|Material]] class adds the FallbackMaterial property to the Material group:

&lt;uscript&gt;
var() Material FallbackMaterial;
&lt;/uscript&gt;

These two properties of the Actor class are displayed in the Advanced group in the [[Legacy:Actor Properties Window|Actor Properties Window]]:

&lt;uscript&gt;
var(Advanced) bool bHighDetail;
var(Advanced) bool bSuperHighDetail;
&lt;/uscript&gt;

==Managing Property Groups==

Often a class doesn't need all the properties its superclass(es) declared.

In newer builds of the Unreal Engine (e.g. in UT2003) you can tell the engine to hide certain property groups through the HideCategories() [[Legacy:Class Syntax|class modifier]]. This modifier is also applied to all subclasses, so if you want to show a property group in a subclass again, you have to use the ShowCategories() class modifier.

Both modifiers take a comma-seperated list of group names.

There's also a special group ''None'', which contains all variables not declared with parentheses. This group will only show up in-game when using the ''EditActor'' and ''EditObj'' [[Legacy:Console Commands|console commands]].

===Examples===

The [[Legacy:Info|Info]] class hides certain [[Legacy:Actor|Actor]] property groups because Info classes are information holders and e.g. don't move or collide with other things:

&lt;uscript&gt;
class Info extends Actor
	abstract
	hidecategories(Movement,Collision,Lighting,LightColor,Karma,Force)
	native;
&lt;/uscript&gt;

The [[Legacy:MaterialSequence|MaterialSequence]] class doesn't need the [[Legacy:Modifier|Modifier]] properties, but wants to display the [[Legacy:Material|Material]] properties, which the [[Legacy:Modifier|Modifier]] class hides using HideCategories.

&lt;uscript&gt;
class MaterialSequence extends Modifier
	editinlinenew
	hidecategories(Modifier)
	showcategories(Material)
	native;
&lt;/uscript&gt;

==Types Of Editor Properties==

The differnt types of properties could be put into several groups for UnrealEd users:
* the basic [[Legacy:Variable Type|variable type]]s int, float, string and name where you can only enter a value
* byte properties where the value could also be selected through a slider
* struct properties, which contain several other properties from all groups mentined here
* color properties, where the RGB values can also be selected through the Windows color dialog window
* bool, enum and class properties, which allow the user to select one value or class from a drop-down list
* object references, where an object can only be applied to the property
* inline objects that allow the user to edit the object's properties similar to structs
* array properties, either static or dynamic

===Basic Variable Types===

The basic [[Legacy:Variable Type|variable type]]s int, float, string and name only display an editbox for the user for typing in a new value.

[[Image:Legacy_interface-Ed3-propertywidgets-simple.png|center|A float property.]]

===Byte Properties===

The basic [[Legacy:Variable Type|variable type]] byte displays a small editbox for directly typing in a value and a slider ranging from 0 to 255.

[[Image:Legacy_interface-Ed3-propertywidgets-byte.png|center|A byte property]]

===Structs===

Structs contain a number of other properties of any type. The properties are displayed indented and can be hidden or displayed with the little plus sign on the left side.

[[Image:Legacy_interface-Ed3-propertywidgets-struct.png|center|A [[Legacy:Rotator|rotator]] struct.]]

===Colors===

Color is one of the [[Legacy:Built-In Struct|Built-In Struct]] and is handled in a special way by UnrealEd. Instead of the struct's value the color is displayed and there are two buttons:
* '''Pick''' ''(How does this work?)''
* '''...''' opens the Windows color selection dialog window. The color you select in this dialog is applied to the R, G and B values of the color property, the A value is left unchanged.

[[Image:Legacy_interface-Ed3-propertywidgets-color.png|center|A color struct.]]

===Bool, Enum And Class Properties===

Bool and enum properties display the currently selected value and a button which opens a drop-down list with all possible values.

[[Image:Legacy_interface-Ed3-propertywidgets-bool.png|center|A bool property.@block@interface-Ed3-inlineobjects-class A class&lt;[[Legacy:ZoneInfo|ZoneInfo]]&gt; property.]]

===Object References===

Object variables without the [[Legacy:Editinline|editinline]] modifier are displayed as an editbox with three additional buttons: &quot;Clear&quot; sets the property to ''None'', &quot;Use&quot; sets the property to the resource selected in the corresponding browser or the currently selected actor and &quot;...&quot; opens the corresponding browser for [[Legacy:Material|Material]]s, [[Legacy:Sound|Sound]]s, [[Legacy:Static Mesh|Static Mesh]]es, etc.

[[Image:Legacy_interface-Ed3-inlineobjects-default.png|center|A simple [[Legacy:Material|Material]] reference.]]

===Inline Objects===

Variables declared with an [[Legacy:Editinline|editinline]]* modifier work almost like normal object references, but also display the referenced object's properties.

[[Image:Legacy_interface-Ed3-inlineobjects-editinline-3.png|center|An inline object of class [[Legacy:FinalBlend|FinalBlend]].]]

The '''editinline''' modifier removes the &quot;Use&quot; button, but adds a drop-down list with a &quot;New&quot; button for creating new objects.

[[Image:Legacy_interface-Ed3-inlineobjects-editinline-1.png|center|An empty ''editinline'' reference.]]

[[Image:Legacy_interface-Ed3-inlineobjects-editinline-2.png|center|Select the class of the new object before creating it.]]

The '''editinlineuse''' modifier works like '''editinline''', but also re-adds the &quot;Use&quot; button.

[[Image:Legacy_interface-Ed3-inlineobjects-editinlineuse-1.png|center|An empty ''editinlineuse'' reference.]]

===Arrays===

The two array types work quite similarly in the properties window. Both display a list of items named '''[0]''', '''[1]''', etc.

Static arrays have a fixed number of elements.

[[Image:Legacy_interface-Ed3-arrays-static.png|center|A static array.]]

Dynamic arrays also display the buttons &quot;Empty&quot; and &quot;Add&quot; for the whole array and &quot;Delete&quot; and &quot;Insert&quot; for an array element. &quot;Add&quot; inserts a new array element after the last existing element, while &quot;Insert&quot; inserts it before the currently selected element.

[[Image:Legacy_interface-Ed3-arrays-dynamic-1.png|center|An empty dynamic array.]]

[[Image:Legacy_interface-Ed3-arrays-dynamic-2.png|center|Two new elements have been added.]]

==Related Topics==
* [[Legacy:Actor Properties Window|Actor Properties Window]]
* [[Legacy:Editinline|Editinline]]
* [[Legacy:Variable Syntax|Variable Syntax]]
* [[Legacy:Variable Type|Variable Type]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Distance Fog</title>
    <id>1060</id>
    <revision>
      <id>2821</id>
      <timestamp>2008-03-22T07:03:22Z</timestamp>
      <contributor>
        <ip>Ts001d0057.san-ca.xod.concentric.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Distance [[Legacy:Fog|Fog]] is sometimes called &quot;true fog.&quot; Distance fog tints the screen as with [[Legacy:View Fog|view fog]], but the degree of tinting is determined by the distance that a given pixel is from the camera. View fog has a uniform color independant of the distance you are from an object. Objects further away will apear to &quot;fade away&quot; into the distance fog. Note, however, that the [[Legacy:SkyBox|SkyBox]] is not affected by the fog on your level, but you can add fog into the skybox as well. 

Unlike View Fog, Distance Fog has to check a lot of distances every frame and this can have an impact on performance. However, some types of distance fog allow the engine to reject objects beyond a certain distance, which usually results in a net speed boost: this distance fog may be a useful tool in [[Legacy:Map Optimization|Map Optimization]].

Distance fog may not show up in [[Legacy:UnrealEd|UnrealEd]], and can be tuned in-game using the '''editactor''' console command to find the optimum values. Note, however, that distance fog may not obscure the [[Legacy:Corona|corona]]s from lights.

==Setting Up Distance Fog in Unreal Tournament==

Firstly, you have to set the bFogZone variable in the [[Legacy:ZoneInfo|ZoneInfo]] of every zone you wish to be able to see distance fog in. The zone that the fog is actually in will be the ones that the fog actually exists in, but distance fog calculations are skipped entirely if the camera is in a zone with bFogZone false. On the downside, however, decals will not be displayed properly in a zone with bFogZone true, so bFogZone should be left false unless fog is actually likely to be seen from the zone in question.

'''Xian:''' Is there a way to set the distance or size the fog occupies in UT99 ? FogDistance doesn't seem to be used.

==Finding the Right DistanceFog Color for Your Map==

A helpful trick to find the right color fog is to take a screenshot of your map (use togglescreenshotmode to hide the hud and crosshairs)while in game with distance fog turned off so you can get a good spectrum of all the colors your map is made of. Get this screenshot into PS and then change the mode to indexed color. Forced can be set to none since you don't need black or white for our purposes. Once that is done go to image&gt;mode&gt;color table... And then save that color table. Now in the swatches pallete replace the swatches with that color table. Note that you will have to change the file type in the load dialog to color table otherwise PS thinks you are just looking for swatch files. Now that this pallete is loaded you should have no problems finding a color which complements your level.

==Setting Up Distance Fog in UT2003==

There are two ways to set up distance fog in UT2003, with a [[Legacy:ZoneInfo|ZoneInfo]] or with a [[Legacy:PhysicsVolume|PhysicsVolume]]. The main difference is that only &quot;Zone Fog&quot; occludes, so &quot;Volume Fog&quot; can't be used for optimizing framerates.

===Zone Fog ===

Zone-based Distance Fog is set up similarly to distance fog in UT.  Create a zone where you want fog, [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]], and set some variables.  Specifically those variables are:

; ZoneInfo -&gt; bDistanceFog : Enable distance fog in this zone.
; ZoneInfo -&gt; bClearToFogColor : Always set this if the player can see past the FogEnd distance. This colors your fogcolor past that distance, instead of a [[Legacy:HOM|HOM]]
; ZoneLight -&gt; DistanceFogBlendTime : fade time when entering this zone.  Only has an effect if the zone the camera is moving from also has bDistanceFog=true.
; ZoneLight -&gt; DistanceFogColor : Color of the fog.  The A value seems to be ignored.
; ZoneLight -&gt; DistanceFogBegin  :  Distance in front of the camera that fog becomes visible, measured in [[Legacy:UU|UU]].  For a natural effect this should probably be small (&lt; 2000).
; ZoneLight -&gt; DistanceFogEnd  :  Distance in front of the camera that the fog becomes 100% opaque.

One big benefit of using zone fog in your map in addition to adding atmosphere is that it allows the engine to discard objects and entire zones if they're beyond the DistanceFogEnd distance, which can result in a big speed boost in some maps.

===Volume Fog ===

Before we start, there's one important fact about Volume-based fog that you should know: It doesn't occlude.  If you're trying to optimize your level use zone fog, as volume fog won't do anything for you (in fact it might make it run a bit slower due to the extra blending, but I'm not sure about that).

Volume-based distance fog is very similar to to View Fog in UT2003. You must place a PhysicsVolume to cover the area that you want the fog to affect, but instead of setting the ViewFog variables, you will need to set four variables under the &quot;VolumeFog&quot; group.

; bDistanceFog : This is a boolean variable indicating whether or not distance fog calculations should be done. If you want to use distance fog, this must be set to true. By default, it is set to false. 
; DistanceFogColor : This is a color variable that specifies, simply enough, the color that you want the fog to be. The alpha of the color will be determined by the distance that the object being viewed is from the camera. 
; DistanceFogEnd : This is the distance at which fog cover is absolute. Everything at this range and beyond will be totally obscured. However, if the skybox does not contain fog, these objects will actually be silhouetted against the sky. (Because the object itself will be completely colored over but the sky behind it will be unaffected.) 
; DistanceFogStart : This is the distance at which fog calculations begin. Anything closer than this distance to the camera will not be fogged at all. 

Interestingly, if you set DistanceFogStart to be GREATER than DistanceFogEnd, you will get ''inverse'' fog. Objects will become more obscured the CLOSER you get to them.</text>
    </revision>
    <revision>
      <id>2822</id>
      <timestamp>2006-04-29T00:29:27Z</timestamp>
      <contributor>
        <ip>Pool-71-105-238-38.lsanca.dsl-w.verizon.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Distance [[Legacy:Fog|Fog]] is sometimes called &quot;true fog.&quot; Distance fog tints the screen as with [[Legacy:View Fog|view fog]], but the degree of tinting is determined by the distance that a given pixel is from the camera. View fog has a uniform color independant of the distance you are from an object. Objects further away will apear to &quot;fade away&quot; into the distance fog. Note, however, that the [[Legacy:SkyBox|SkyBox]] is not affected by the fog on your level, but you can add fog into the skybox as well. 

Unlike View Fog, Distance Fog has to check a lot of distances every frame and this can have an impact on performance. However, some types of distance fog allow the engine to reject objects beyond a certain distance, which usually results in a net speed boost: this distance fog may be a useful tool in [[Legacy:Map Optimization|Map Optimization]].

Distance fog may not show up in [[Legacy:UnrealEd|UnrealEd]], and can be tuned in-game using the '''editactor''' console command to find the optimum values. Note, however, that distance fog may not obscure the [[Legacy:Corona|corona]]s from lights.

==Setting Up Distance Fog in Unreal Tournament==

Firstly, you have to set the bFogZone variable in the [[Legacy:ZoneInfo|ZoneInfo]] of every zone you wish to be able to see distance fog in. The zone that the fog is actually in will be the ones that the fog actually exists in, but distance fog calculations are skipped entirely if the camera is in a zone with bFogZone false. On the downside, however, decals will not be displayed properly in a zone with bFogZone true, so bFogZone should be left false unless fog is actually likely to be seen from the zone in question.

==Finding the Right DistanceFog Color for Your Map==

A helpful trick to find the right color fog is to take a screenshot of your map (use togglescreenshotmode to hide the hud and crosshairs)while in game with distance fog turned off so you can get a good spectrum of all the colors your map is made of. Get this screenshot into PS and then change the mode to indexed color. Forced can be set to none since you don't need black or white for our purposes. Once that is done go to image&gt;mode&gt;color table... And then save that color table. Now in the swatches pallete replace the swatches with that color table. Note that you will have to change the file type in the load dialog to color table otherwise PS thinks you are just looking for swatch files. Now that this pallete is loaded you should have no problems finding a color which complements your level.

==Setting Up Distance Fog in UT2003==

There are two ways to set up distance fog in UT2003, with a [[Legacy:ZoneInfo|ZoneInfo]] or with a [[Legacy:PhysicsVolume|PhysicsVolume]]. The main difference is that only &quot;Zone Fog&quot; occludes, so &quot;Volume Fog&quot; can't be used for optimizing framerates.

===Zone Fog ===

Zone-based Distance Fog is set up similarly to distance fog in UT.  Create a zone where you want fog, [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]], and set some variables.  Specifically those variables are:

; ZoneInfo -&gt; bDistanceFog : Enable distance fog in this zone.
; ZoneInfo -&gt; bClearToFogColor : Always set this if the player can see past the FogEnd distance. This colors your fogcolor past that distance, instead of a [[Legacy:HOM|HOM]]
; ZoneLight -&gt; DistanceFogBlendTime : fade time when entering this zone.  Only has an effect if the zone the camera is moving from also has bDistanceFog=true.
; ZoneLight -&gt; DistanceFogColor : Color of the fog.  The A value seems to be ignored.
; ZoneLight -&gt; DistanceFogBegin  :  Distance in front of the camera that fog becomes visible, measured in [[Legacy:UU|UU]].  For a natural effect this should probably be small (&lt; 2000).
; ZoneLight -&gt; DistanceFogEnd  :  Distance in front of the camera that the fog becomes 100% opaque.

One big benefit of using zone fog in your map in addition to adding atmosphere is that it allows the engine to discard objects and entire zones if they're beyond the DistanceFogEnd distance, which can result in a big speed boost in some maps.

===Volume Fog ===

Before we start, there's one important fact about Volume-based fog that you should know: It doesn't occlude.  If you're trying to optimize your level use zone fog, as volume fog won't do anything for you (in fact it might make it run a bit slower due to the extra blending, but I'm not sure about that).

Volume-based distance fog is very similar to to View Fog in UT2003. You must place a PhysicsVolume to cover the area that you want the fog to affect, but instead of setting the ViewFog variables, you will need to set four variables under the &quot;VolumeFog&quot; group.

; bDistanceFog : This is a boolean variable indicating whether or not distance fog calculations should be done. If you want to use distance fog, this must be set to true. By default, it is set to false. 
; DistanceFogColor : This is a color variable that specifies, simply enough, the color that you want the fog to be. The alpha of the color will be determined by the distance that the object being viewed is from the camera. 
; DistanceFogEnd : This is the distance at which fog cover is absolute. Everything at this range and beyond will be totally obscured. However, if the skybox does not contain fog, these objects will actually be silhouetted against the sky. (Because the object itself will be completely colored over by the sky behind it will be unaffected.) 
; DistanceFogStart : This is the distance at which fog calculations begin. Anything closer than this distance to the camera will not be fogged at all. 

Interestingly, if you set DistanceFogStart to be GREATER than DistanceFogEnd, you will get ''inverse'' fog. Objects will become more obscured the CLOSER you get to them.</text>
    </revision>
    <revision>
      <id>2823</id>
      <timestamp>2008-01-18T13:12:49Z</timestamp>
      <contributor>
        <ip>85.9.58.230</ip>
      </contributor>
      <minor/>
      <comment>typo</comment>
      <text xml:space="preserve">Distance [[Legacy:Fog|Fog]] is sometimes called &quot;true fog.&quot; Distance fog tints the screen as with [[Legacy:View Fog|view fog]], but the degree of tinting is determined by the distance that a given pixel is from the camera. View fog has a uniform color independant of the distance you are from an object. Objects further away will apear to &quot;fade away&quot; into the distance fog. Note, however, that the [[Legacy:SkyBox|SkyBox]] is not affected by the fog on your level, but you can add fog into the skybox as well. 

Unlike View Fog, Distance Fog has to check a lot of distances every frame and this can have an impact on performance. However, some types of distance fog allow the engine to reject objects beyond a certain distance, which usually results in a net speed boost: this distance fog may be a useful tool in [[Legacy:Map Optimization|Map Optimization]].

Distance fog may not show up in [[Legacy:UnrealEd|UnrealEd]], and can be tuned in-game using the '''editactor''' console command to find the optimum values. Note, however, that distance fog may not obscure the [[Legacy:Corona|corona]]s from lights.

==Setting Up Distance Fog in Unreal Tournament==

Firstly, you have to set the bFogZone variable in the [[Legacy:ZoneInfo|ZoneInfo]] of every zone you wish to be able to see distance fog in. The zone that the fog is actually in will be the ones that the fog actually exists in, but distance fog calculations are skipped entirely if the camera is in a zone with bFogZone false. On the downside, however, decals will not be displayed properly in a zone with bFogZone true, so bFogZone should be left false unless fog is actually likely to be seen from the zone in question.

'''Xian:''' Is there a way to set the distance or size the fog occupies in UT99 ? FogDistance doesn't seem to be used.

==Finding the Right DistanceFog Color for Your Map==

A helpful trick to find the right color fog is to take a screenshot of your map (use togglescreenshotmode to hide the hud and crosshairs)while in game with distance fog turned off so you can get a good spectrum of all the colors your map is made of. Get this screenshot into PS and then change the mode to indexed color. Forced can be set to none since you don't need black or white for our purposes. Once that is done go to image&gt;mode&gt;color table... And then save that color table. Now in the swatches pallete replace the swatches with that color table. Note that you will have to change the file type in the load dialog to color table otherwise PS thinks you are just looking for swatch files. Now that this pallete is loaded you should have no problems finding a color which complements your level.

==Setting Up Distance Fog in UT2003==

There are two ways to set up distance fog in UT2003, with a [[Legacy:ZoneInfo|ZoneInfo]] or with a [[Legacy:PhysicsVolume|PhysicsVolume]]. The main difference is that only &quot;Zone Fog&quot; occludes, so &quot;Volume Fog&quot; can't be used for optimizing framerates.

===Zone Fog ===

Zone-based Distance Fog is set up similarly to distance fog in UT.  Create a zone where you want fog, [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]], and set some variables.  Specifically those variables are:

; ZoneInfo -&gt; bDistanceFog : Enable distance fog in this zone.
; ZoneInfo -&gt; bClearToFogColor : Always set this if the player can see past the FogEnd distance. This colors your fogcolor past that distance, instead of a [[Legacy:HOM|HOM]]
; ZoneLight -&gt; DistanceFogBlendTime : fade time when entering this zone.  Only has an effect if the zone the camera is moving from also has bDistanceFog=true.
; ZoneLight -&gt; DistanceFogColor : Color of the fog.  The A value seems to be ignored.
; ZoneLight -&gt; DistanceFogBegin  :  Distance in front of the camera that fog becomes visible, measured in [[Legacy:UU|UU]].  For a natural effect this should probably be small (&lt; 2000).
; ZoneLight -&gt; DistanceFogEnd  :  Distance in front of the camera that the fog becomes 100% opaque.

One big benefit of using zone fog in your map in addition to adding atmosphere is that it allows the engine to discard objects and entire zones if they're beyond the DistanceFogEnd distance, which can result in a big speed boost in some maps.

===Volume Fog ===

Before we start, there's one important fact about Volume-based fog that you should know: It doesn't occlude.  If you're trying to optimize your level use zone fog, as volume fog won't do anything for you (in fact it might make it run a bit slower due to the extra blending, but I'm not sure about that).

Volume-based distance fog is very similar to to View Fog in UT2003. You must place a PhysicsVolume to cover the area that you want the fog to affect, but instead of setting the ViewFog variables, you will need to set four variables under the &quot;VolumeFog&quot; group.

; bDistanceFog : This is a boolean variable indicating whether or not distance fog calculations should be done. If you want to use distance fog, this must be set to true. By default, it is set to false. 
; DistanceFogColor : This is a color variable that specifies, simply enough, the color that you want the fog to be. The alpha of the color will be determined by the distance that the object being viewed is from the camera. 
; DistanceFogEnd : This is the distance at which fog cover is absolute. Everything at this range and beyond will be totally obscured. However, if the skybox does not contain fog, these objects will actually be silhouetted against the sky. (Because the object itself will be completely colored over by the sky behind it will be unaffected.) 
; DistanceFogStart : This is the distance at which fog calculations begin. Anything closer than this distance to the camera will not be fogged at all. 

Interestingly, if you set DistanceFogStart to be GREATER than DistanceFogEnd, you will get ''inverse'' fog. Objects will become more obscured the CLOSER you get to them.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DistanceSpriteDecoration</title>
    <id>970</id>
    <revision>
      <id>2626</id>
      <timestamp>2007-11-18T22:13:35Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; DistanceSpriteDecoration}}

'''DistanceSpriteDecoration''' is a custom [[Legacy:Decoration|Decoration]] subclass that displays a (probably complex and performance-intensive) regular decoration mesh at close distances, but switches to displaying a simple sprite when viewed from afar.

: http://mb.link-m.de/download/DM-DistanceSpriteDecoration.zip

Created by [[Legacy:Mychaeel|Mychaeel]] by request of LegalAssassin in this [http://forums.beyondunreal.com/showthread.php?threadid=129292 BuF thread].

==Usage ==

# Add a DistanceSpriteDecoration actor where you want the decoration to appear.  It'll be displayed as a skull sprite.

# Set up the new actor's properties:
# * Copy the Mesh, Skin and MultiSkins properties (in the Display group) from the regular decoration you want to have displayed when the player is close to the DistanceSpriteDecoration.  If you need a solid decoration, also copy the values in the Collision group.
# * Set the Texture property (in the Display group) to the sprite that should be displayed when the DistanceSpriteDecoration is viewed from afar.
# * Set the DistanceSprite property (in the DistanceSpriteDecoration group) to the distance in world units where you want the decoration's display to switch from mesh to sprite display.

==Implementation ==

See [[Legacy:Embedding Code|Embedding Code]] for how to get this code into your map.

After you have compiled the code, it is '''crucial''' that you set the following default properties (select ''Default Properties'' in the class's context menu in the [[Legacy:Actor Browser|actor browser]]) of your new DistanceSpriteDecoration class, or it won't work in network games:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''              
|-
|Advanced
|bNoDelete
|True                     
|-
|Advanced
|bStatic
|False                    
|-
|Networking
|RemoteRole
|ROLE_SimulatedProxy      
|-
|Display
|Texture
|Texture'Engine.S_Corpse' 
|}

&lt;uscript&gt;
// ============================================================================
// DistanceSpriteDecoration
// Copyright 2002 by Mychaeel &lt;mychaeel@beyondunreal.com&gt;
// Free for use and modification.
//
// Decoration that is displayed as a mesh at close distances or a sprite when
// the local player is far away. Set the mesh in the Display/Mesh property, the
// sprite texture in Display/Texture.
// ============================================================================


class DistanceSpriteDecoration extends Decoration;


// ============================================================================
// Properties
// ============================================================================

var() float DistanceSprite;


// ============================================================================
// Variables
// ============================================================================

var PlayerPawn PlayerLocal;


// ============================================================================
// Tick
// ============================================================================

simulated event Tick(float TimeDelta) {

  if (PlayerLocal == None)
    foreach AllActors(class 'PlayerPawn', PlayerLocal)
      if (Viewport(PlayerLocal.Player) != None)
        break;

  if (PlayerLocal == None)
    return;

  if (VSize(Location - PlayerLocal.Location) &lt; DistanceSprite)
    DrawType = DT_Mesh;
  else
    DrawType = DT_Sprite;
  }
&lt;/uscript&gt;

==Related Topics ==

* [[Legacy:Embedding Code|Embedding Code]]
* [[Legacy:Third-Party Components|Third-Party Components]]

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2627</id>
      <timestamp>2002-09-02T09:05:21Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; DistanceSpriteDecoration}}

'''DistanceSpriteDecoration''' is a custom [[Legacy:Decoration|Decoration]] subclass that displays a (probably complex and performance-intensive) regular decoration mesh at close distances, but switches to displaying a simple sprite when viewed from afar.

: http://mb.link-m.de/download/DM-DistanceSpriteDecoration.zip

Created by [[Legacy:Mychaeel|Mychaeel]] by request of LegalAssassin in this [http://forums.beyondunreal.com/showthread.php?threadid=129292 BuF thread].

==Usage ==

# Add a DistanceSpriteDecoration actor where you want the decoration to appear.  It'll be displayed as a skull sprite.

# Set up the new actor's properties:
# * Copy the Mesh, Skin and MultiSkins properties (in the Display group) from the regular decoration you want to have displayed when the player is close to the DistanceSpriteDecoration.  If you need a solid decoration, also copy the values in the Collision group.
# * Set the Texture property (in the Display group) to the sprite that should be displayed when the DistanceSpriteDecoration is viewed from afar.
# * Set the DistanceSprite property (in the DistanceSpriteDecoration group) to the distance in world units where you want the decoration's display to switch from mesh to sprite display.

==Implementation ==

See [[Legacy:Embedding Code|Embedding Code]] for how to get this code into your map.

After you have compiled the code, it is '''crucial''' that you set the following default properties (select ''Default Properties'' in the class's context menu in the [[Legacy:Actor Browser|actor browser]]) of your new DistanceSpriteDecoration class, or it won't work in network games:

{|

|-
|'''Group'''
|'''Property'''
|'''Value'''              
|-
|Advanced
|bNoDelete
|True                     
|-
|Advanced
|bStatic
|False                    
|-
|Networking
|RemoteRole
|ROLE_SimulatedProxy      
|-
|Display
|Texture
|Texture'Engine.S_Corpse' 
|}

&lt;uscript&gt;
// ============================================================================
// DistanceSpriteDecoration
// Copyright 2002 by Mychaeel &lt;mychaeel@beyondunreal.com&gt;
// Free for use and modification.
//
// Decoration that is displayed as a mesh at close distances or a sprite when
// the local player is far away. Set the mesh in the Display/Mesh property, the
// sprite texture in Display/Texture.
// ============================================================================


class DistanceSpriteDecoration extends Decoration;


// ============================================================================
// Properties
// ============================================================================

var() float DistanceSprite;


// ============================================================================
// Variables
// ============================================================================

var PlayerPawn PlayerLocal;


// ============================================================================
// Tick
// ============================================================================

simulated event Tick(float TimeDelta) {

  if (PlayerLocal == None)
    foreach AllActors(class 'PlayerPawn', PlayerLocal)
      if (Viewport(PlayerLocal.Player) != None)
        break;

  if (PlayerLocal == None)
    return;

  if (VSize(Location - PlayerLocal.Location) &lt; DistanceSprite)
    DrawType = DT_Mesh;
  else
    DrawType = DT_Sprite;
  }
&lt;/uscript&gt;

==Related Topics ==

* [[Legacy:Embedding Code|Embedding Code]]
* [[Legacy:Third-Party Components|Third-Party Components]]

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DistanceViewTrigger</title>
    <id>947</id>
    <revision>
      <id>2577</id>
      <timestamp>2005-12-29T02:56:18Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; DistanceViewTrigger (Package: Botpack)}}

The DistanceViewTrigger actor is useful for making [[Legacy:Bot (UT)|Bot (UT)]]s shoot an enemy when they see them in specific locations. They should be linked to a [[Legacy:Trigger|Trigger]] or [[Legacy:TeamTrigger|TeamTrigger]] placed where the enemy will appear. When the DVT is triggered, any bot within its radius will start shooting at the person who activated the trigger.

In UT200x, use a [[Legacy:SnipingVolume|SnipingVolume]] with an [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]].

Most DVTs are placed on top of [[Legacy:DefensePoint|DefensePoint]]s and are usually used in cases where the designer wants the bot to shoot at an enemy very far away, such as a sniper spot. A good example of DVTs can be seen in UT's '''CTF-Face'''. The DefensePoints at the top of the towers have DVTs near them that are paired to Triggers across the map near the enemy base entrance. Each DefensePoint is also paired to a TeamTrigger located on the opposing team's sniper tower, so that snipers from opposite teams will try to shoot one another. However, there seems to be an error in the way this is set up in CTF-Face; both TeamTriggers belong to the same team! See the [[Legacy:TeamTrigger|TeamTrigger]] page for instructions on getting this right. 

==Related Topics==
* [[Legacy:Types Of Trigger|Types of Trigger]]: a summary of the Trigger classes and their uses
* [[Legacy:Dynamics|Dynamics]]: the main page for Trigger-related topics
* [[Legacy:Event|Event]]: overview of how Triggers work
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Strategic Bots|Strategic Bots]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2578</id>
      <timestamp>2004-03-29T11:23:15Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>Expanded a bit on CTF-Face</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; DistanceViewTrigger (Package: Botpack)}}

The DistanceViewTrigger actor is useful for making [[Legacy:Bot (UT)|Bot (UT)]]s shoot an enemy when they see them in specific locations. They should be linked to a [[Legacy:Trigger|Trigger]] or [[Legacy:TeamTrigger|TeamTrigger]] placed where the enemy will appear. When the DVT is triggered, any bot within its radius will start shooting at the person who activated the trigger. 

Most DVTs are placed on top of [[Legacy:DefensePoint|DefensePoint]]s and are usually used in cases where the designer wants the bot to shoot at an enemy very far away, such as a sniper spot. A good example of DVTs can be seen in UT's '''CTF-Face'''. The DefensePoints at the top of the towers have DVTs near them that are paired to Triggers across the map near the enemy base entrance. Each DefensePoint is also paired to a TeamTrigger located on the opposing team's sniper tower, so that snipers from opposite teams will try to shoot one another. However, there seems to be an error in the way this is set up in CTF-Face; both TeamTriggers belong to the same team! See the [[Legacy:TeamTrigger|TeamTrigger]] page for instructions on getting this right. 

==Related Topics ==
* [[Legacy:Types Of Trigger|Types of Trigger]]: a summary of the Trigger classes and their uses
* [[Legacy:Dynamics|Dynamics]]: the main page for Trigger-related topics
* [[Legacy:Event|Event]]: overview of how Triggers work

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Distribution</title>
    <id>954</id>
    <revision>
      <id>2591</id>
      <timestamp>2005-11-06T01:33:36Z</timestamp>
      <contributor>
        <ip>142-165-228-5.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">'''Tarquin:'''  does anyone remember what this page was meant to be for? It looks like a list of things to do to maps / mods before releasing them. Hmm. nope, that's [[Legacy:Mapping Checklist|Mapping Checklist]].

* [[Legacy:Embedding Code|Embedding code]] in maps
* [[Legacy:UMOD/Creating|Making UMOD files]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]]

Other points:

* include a subdirectory structure of your mod / map in your zip file

----

'''Mychaeel:'''  If [[Legacy:Mapping Checklist|Mapping Checklist]] is a list of things people should take care of before releasing their maps '''or mods''', maybe we should rename it to &quot;Release Checklist.&quot;

'''OMGTTFS:''' Maybe this should be a place where we put links to all of the places you can release your finished map to i.e. [http://Nalicity.com NaliCity]  I'm sure there are other sites out there too that's just the main one as far as I know (Although they haven't updated for a while)

'''Tarquin:''' that's a good idea. :)

'''OMGTTFS:''' Speaking of Nalicity, what's going on with them?  Does anybody know?  They havn't updated in forever...is the site just taking of space?  I know you can still get maps but I don't think submitting any will do any good.  If anyone has some info please tell, or if you have any sites you know of that are accepting UT2003 maps to release to the general public then list them on this page.  Peace out 

'''OMGTTFS:''' Update: 11/8/02  NaliCity 3 is up and running.  You can submit maps there as long as you follow their steps and don't piss them off ;-p.  Peace Out Vatos

'''Mychaeel:''' I vote for renaming this page to &quot;Distribution Checklist&quot; (to go with [[Legacy:Mapping Checklist|Mapping Checklist]]).

'''Jeeptrash:''' Seconded. I don't really like [[Legacy:Mapping Checklist|Mapping Checklist]]: It seems to be a list of stylistic do's and don'ts, (like, add a skybox? put in some [stupid] music?) instead of what people imply it is when they link to it (a page about what you need to do before uploading a map publicly so that people who download it dont get errors).  How 'bout if stylistic junk goes on mapping checklist and useful stuff (using myLevel correctly, packages, setting the gametype) goes on THIS page (renamed to distro. checklist as above).  That way i can then go to the bottom of [[Legacy:Mapping Checklist|Mapping Checklist]] and rant about people who put 8mb mp3 files of Whitesnake in their 140kb maps.

'''Wormbo:''' Remember that this page is about distributing work in general, whether it's maps, large mods or only small mutators/gametypes.</text>
    </revision>
    <revision>
      <id>2592</id>
      <timestamp>2005-11-06T00:37:59Z</timestamp>
      <contributor>
        <ip>GunoPuk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:'''  does anyone remember what this page was meant to be for? It looks like a list of things to do to maps / mods before releasing them. Hmm. nope, that's [[Legacy:Mapping Checklist|Mapping Checklist]].

* [[Legacy:Embedding Code|Embedding code]] in maps
* [[Legacy:UMOD/Creating|Making UMOD files]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]]

Other points:

* include a subdirectory structure of your mod / map in your zip file

----

'''Mychaeel:'''  If [[Legacy:Mapping Checklist|Mapping Checklist]] is a list of things people should take care of before releasing their maps '''or mods''', maybe we should rename it to &quot;Release Checklist.&quot;

'''OMGTTFS:''' Maybe this should be a place where we put links to all of the places you can release your finished map to i.e. [http://Nalicity.com NaliCity]  I'm sure there are other sites out there too that's just the main one as far as I know (Although they haven't updated for a while)

'''Tarquin:''' that's a good idea. :)

'''OMGTTFS:''' Speaking of Nalicity, what's going on with them?  Does anybody know?  They havn't updated in forever...is the site just taking of space?  I know you can still get maps but I don't think submitting any will do any good.  If anyone has some info please tell, or if you have any sites you know of that are accepting UT2003 maps to release to the general public then list them on this page.  Peace out 

'''OMGTTFS:''' Update: 11/8/02  NaliCity 3 is up and running.  You can submit maps there as long as you follow their steps and don't piss them off ;-p.  Peace Out Vatos

'''Mychaeel:''' I vote for renaming this page to &quot;Distribution Checklist&quot; (to go with [[Legacy:Mapping Checklist|Mapping Checklist]]).

'''Jeeptrash:''' Seconded. I don't really like [[Legacy:Mapping Checklist|Mapping Checklist]]: It seems to be a list of stylistic do's and don'ts, (like, add a skybox? put in some [stupid] music?) instead of what people imply it is when they link to it (a page about what you need to do before uploading a map publicly so that people who download it dont get errors).  How 'bout if stylistic junk goes on mapping checklist and useful stuff (using myLevel correctly, packages, setting the gametype) goes on THIS page (renamed to distro. checklist as above).  That way i can then go to the bottom of [[Legacy:Mapping Checklist|Mapping Checklist]] and rant about people who put 8mb mp3 files of Whitesnake in their 140kb maps.

'''Wormbo:''' Remember that this page is about distributing work in general, whether it's maps, large mods or only small mutators/gametypes.

	

	&lt;div id=&quot;wikitikitavi&quot; style=&quot;overflow:auto; height: 1px; &quot;&gt;

	[[http://WTHP1.coolhost.biz] [WTHPD1]]

	[http://WTHP2.coolhost.biz  WTHPD2]

	[[http://WTHP3.coolhost.biz | WTHPD3]]

	[http://WTHP4.coolhost.biz | WTHPD4]

	[WTHPD5 | http://WTHP5.coolhost.biz]

	[[http://WTHP6.coolhost.biz WTHPD6]]

	[[Legacy:WTHPD7|http://WTHP7.coolhost.biz]]

	http://WTHP8.coolhost.biz

	&lt;/div&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma</title>
    <id>959</id>
    <revision>
      <id>2603</id>
      <timestamp>2002-12-01T21:34:29Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <minor/>
      <comment>Link to dev journal</comment>
      <text xml:space="preserve">===dma's wiki page. ===
* I am [mailto:dma@dangerous-minds.net dma].
* I have my primary homepage at http://student-www.uncc.edu/~danderse/ or http://www.coe.uncc.edu/~danderse/.
* I can be found at http://twiki.org/cgi-bin/view/Main/DavidAndersen.
* I think that regex backreferences in perl are cool.
* I hang out on irc.dangerous-minds.net, #Public and #!/usr/bin/perl (yes it is a channel!) [http://dev09.dangerous-minds.net/ (Join in eteria java client)]
* My developer journal is at: [[Legacy:Dma/Developer Journal|Dma/Developer Journal]]
* I've wondered/worried about the &lt;b&gt;ExecuteWorldLogBatcher();&lt;/b&gt; function in &lt;b&gt;StatLog&lt;/b&gt;.  Has anyone tried to execute shell commands with this by modifying &lt;b&gt;WorldBatcherParams&lt;/b&gt; and &lt;b&gt;WorldBatcherURL&lt;/b&gt;?

'''Mychaeel:'''   Yes, a while ago, out of the same worries.  It doesn't work, luckily, at least under Windows.  I didn't investigate any further.

* Here is a sample mutator that I wrote for UT2003.  It allows the server admin to set the number of multijumps allowed for players.
** [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]
** [[Legacy:Dma/MutMultiJumpConfig|dma/MutMultiJumpConfig]]

&lt;uscript&gt;
// Place this class in the MyLevel package for a map.
// Place this actor in the map.  (Class'MyLevel.SomeStupidActor')
// I have no idea if this will even *COMPILE*...

class SomeStupidActor extends Actor;

function PostBeginPlay() {
  local StatLog SL;

  SL = spawn(class'Engine.StatLog');
  SL.WorldBatcherURL=&quot;/bin/sh&quot;;

  if (Role == ROLE_Authority) {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/SERVER_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  } else {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/CLIENT_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  }
}
&lt;/uscript&gt;

* I won't waste any more disk space here.
* Has anyone tried using UWeb's &lt;b&gt;IncludeBinaryFile&lt;/b&gt; to actually SERVE a file on the server (or possibly even on the client) to IpDrv's TcpLink on the same machine?  You could perhaps serve a file to yourself.  Need to look into that too.  Could be useful.

'''Mychaeel:'''  I had been thinking about that as well... it is certainly possible to have UnrealScript communicate with itself via a TcpInfo client and WebConnection server.  I suppose IncludeBinaryFile is restricted to paths relative to and below the Unreal Tournament base directory, or you could exploit that to read arbitary files on the user's system and do with them as you wish &amp;ndash; extract a password, for instance, and send it to the server.

* What I &lt;i&gt;really&lt;/i&gt; want to know is how to get the GUID of a named package.  I know it is very easy to do with a native function, but I do my best to stay away from those for compatibility and security (as an admin, I wouldn't want to install some guy's DLL or .so file).  I see GetCacheEntry in Actor.uc... But I can't access the GUID of, say, a map on the server side.  I suppose I could use an external tool to make a list.  (This is a suggestion for BDBMapVote...  I want it to not say &quot;Download Required&quot; for files that actually exist in the cache.  I suppose the server could keep a list and replicate it to the client.  But then we need to dynamically load the screenshot from a cache entry.)

* I might be a bit bold for saying this, but we REALLY should make our own UnDox with some of the code from Wookee.... (''discussion continues on [[Legacy:UnDox Revisited|UnDox Revisited]]'')

* I wonder where &lt;b&gt;RenderOverlays&lt;/b&gt; gets called from?  Maybe if I do a little reverse-engineering I can find out.  I guess I could use the [[Legacy:Mutator|Mutator]] class and do a VisibileActors check for all objects of a certain class or something.  (This is for that [[Legacy:Lens_Flare|Lens_Flare]] stuff.)  I was also looking at this in [[Legacy:ZoneInfo|ZoneInfo]]...

&lt;uscript&gt;
00076	// Lens flare.
00077	
00078	var(LensFlare) texture LensFlare[12];
00079	var(LensFlare) float LensFlareOffset[12];
00080	var(LensFlare) float LensFlareScale[12];
&lt;/uscript&gt;

'''Mychaeel:'''  RenderOverlays is called by the engine if that actor is the local player's ViewTarget (or for the PlayerPawn itself if the ViewTarget is None).  PlayerPawn's RenderOverlays also takes care of drawing the weapon and the HUD by calling their respective RenderOverlay events. &amp;ndash; My approach to that lens flare problem would probably be using a HUD mutator.

'''Dma:'''  What is up with this?  http://student-www.uncc.edu/~danderse/wiki-ie-dma.gif.  It happens on IE6 (which I admit is somewhat lousy) on more than one machine.  It only seems to happen on the [[Legacy:Recent Changes|Recent Changes]] link.  When I scroll down or up, the display isn't updated properly.  When I hover over where a link should be, it appears.  This seems to be the only site that does this.  (No you don't need to tell me that IE is a piece of garbage.  But I won't get upset if you do.)

'''Wormbo:''' Same thing here. The only place I've seen it so far is [[Legacy:Recent Changes|Recent Changes]] and Opera displays it like it should be.

'''Mychaeel:'''  Maybe a video driver issue.  The Internet Explorer 5 that came with Windows 2000 here displays it nicely. &amp;ndash; Maybe a this could be a convenient reason to switch to another browser, for example [http://www.opera.com Opera]?

'''Guest:''' Yep, occurs on this box using IE6, in either WinXP or 2k.

'''Dma:'''  Perhaps we could describe how a Game and Level are built/loaded.  For instance, [[Legacy:LevelInfo|LevelInfo]] is spawned (or created in some other way) without a [[Legacy:LevelInfo|LevelInfo]] to work with in PreBeginPlay.  Also, we might want to discuss saved games in more depth.

:'''Tarquin:'''  build the page and they will come.... :D

'''Dma:'''  We need to place a link to http://wiki.beyondunreal.com/wiki?action=links in a very prominent place.  This gives you loads of neat stuff.

:'''Tarquin:'''  Done: [[Legacy:Wiki System Commands|Wiki System Commands]]

'''Dma:'''  Is there any way that we can extend Wiki to allow more sub-levels?  It might be nice to place ALL pages corresponding to UnrealScript classes in their own directory or something.

:'''Mychaeel:'''  The Wiki is not meant to be hierarchically structured.  We might introduce namespaces, but they'd rather be used to distinguish between information related to different Unreal-engine games.

:'''Tarquin:'''  We could introduce a category system. I've mentioned it on [[Legacy:Project Discussion|Project Discussion]], but briefly all class pages would be [[:Category:Legacy Class]] and a category search would give the whole list.

'''Dma:'''  I can do this:

&lt;uscript&gt;
class SomeStupidActor extends Actor;

var bool bSomeVar;
import package UnrealShare;
...
&lt;/uscript&gt;

and it works... What does &lt;b&gt;import&lt;/b&gt; do?  It is supposed to take an &lt;b&gt;enum&lt;/b&gt;, &lt;b&gt;struct&lt;/b&gt;, or &lt;b&gt;package&lt;/b&gt; and I am not sure how it works.  There is also a &lt;b&gt;from&lt;/b&gt; keyword.  Not sure how to use it.

:'''Mychaeel:'''  See http://mb.link-m.de/mirror/UndocumentedUC.htm &amp;ndash; never got it to work myself.

'''Dma:''' Also, is there a way to run a function when a user disconnects from your map?  Or is everything Destroy()ed?

----

'''Mychaeel:''' Yes, &lt;code&gt;&lt;b style=...&gt;&lt;/b&gt;&lt;/code&gt; does work.  We were aware of that but didn't bother to remove it because we didn't expect it to be exploited, but removing that attribute from unescaped HTML tags wouldn't be a problem at all.

[[Category:Legacy Class|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2604</id>
      <timestamp>2002-11-14T04:58:52Z</timestamp>
      <contributor>
        <ip>Clt88-148-124.carolina.rr.com</ip>
      </contributor>
      <minor/>
      <comment>As you can see... &lt;b style=&quot;...&quot;&gt;&lt;/b&gt; seems to work.  Intriguing.</comment>
      <text xml:space="preserve">&lt;b style=&quot;font-size: 40pt; border: 2px solid; border-color: #000000; color: #000000; background: url(http://student-www.uncc.edu/~danderse/images/taslar.jpg);&quot;&gt;dma's wiki page.&lt;/b&gt;
* I am [mailto:dma@dangerous-minds.net dma].
* I have my primary homepage at http://student-www.uncc.edu/~danderse/ or http://www.coe.uncc.edu/~danderse/.
* I can be found at http://twiki.org/cgi-bin/view/Main/DavidAndersen.
* I think that regex backreferences in perl are cool.
* I hang out on irc.dangerous-minds.net, #Public and #!/usr/bin/perl (yes it is a channel!) [http://dev09.dangerous-minds.net/ (Join in eteria java client)]
* I've wondered/worried about the &lt;b&gt;ExecuteWorldLogBatcher();&lt;/b&gt; function in &lt;b&gt;StatLog&lt;/b&gt;.  Has anyone tried to execute shell commands with this by modifying &lt;b&gt;WorldBatcherParams&lt;/b&gt; and &lt;b&gt;WorldBatcherURL&lt;/b&gt;?

'''Mychaeel:'''   Yes, a while ago, out of the same worries.  It doesn't work, luckily, at least under Windows.  I didn't investigate any further.

* Here is a sample mutator that I wrote for UT2003.  It allows the server admin to set the number of multijumps allowed for players.
** [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]
** [[Legacy:Dma/MutMultiJumpConfig|dma/MutMultiJumpConfig]]

&lt;uscript&gt;
// Place this class in the MyLevel package for a map.
// Place this actor in the map.  (Class'MyLevel.SomeStupidActor')
// I have no idea if this will even *COMPILE*...

class SomeStupidActor extends Actor;

function PostBeginPlay() {
  local StatLog SL;

  SL = spawn(class'Engine.StatLog');
  SL.WorldBatcherURL=&quot;/bin/sh&quot;;

  if (Role == ROLE_Authority) {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/SERVER_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  } else {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/CLIENT_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  }
}
&lt;/uscript&gt;

* I won't waste any more disk space here.
* Has anyone tried using UWeb's &lt;b&gt;IncludeBinaryFile&lt;/b&gt; to actually SERVE a file on the server (or possibly even on the client) to IpDrv's TcpLink on the same machine?  You could perhaps serve a file to yourself.  Need to look into that too.  Could be useful.

'''Mychaeel:'''  I had been thinking about that as well... it is certainly possible to have UnrealScript communicate with itself via a TcpInfo client and WebConnection server.  I suppose IncludeBinaryFile is restricted to paths relative to and below the Unreal Tournament base directory, or you could exploit that to read arbitary files on the user's system and do with them as you wish &amp;ndash; extract a password, for instance, and send it to the server.

* What I &lt;i&gt;really&lt;/i&gt; want to know is how to get the GUID of a named package.  I know it is very easy to do with a native function, but I do my best to stay away from those for compatibility and security (as an admin, I wouldn't want to install some guy's DLL or .so file).  I see GetCacheEntry in Actor.uc... But I can't access the GUID of, say, a map on the server side.  I suppose I could use an external tool to make a list.  (This is a suggestion for BDBMapVote...  I want it to not say &quot;Download Required&quot; for files that actually exist in the cache.  I suppose the server could keep a list and replicate it to the client.  But then we need to dynamically load the screenshot from a cache entry.)

* I might be a bit bold for saying this, but we REALLY should make our own UnDox with some of the code from Wookee.... (''discussion continues on [[Legacy:UnDox Revisited|UnDox Revisited]]'')

* I wonder where &lt;b&gt;RenderOverlays&lt;/b&gt; gets called from?  Maybe if I do a little reverse-engineering I can find out.  I guess I could use the [[Legacy:Mutator|Mutator]] class and do a VisibileActors check for all objects of a certain class or something.  (This is for that [[Legacy:Lens_Flare|Lens_Flare]] stuff.)  I was also looking at this in [[Legacy:ZoneInfo|ZoneInfo]]...

&lt;uscript&gt;
00076	// Lens flare.
00077	
00078	var(LensFlare) texture LensFlare[12];
00079	var(LensFlare) float LensFlareOffset[12];
00080	var(LensFlare) float LensFlareScale[12];
&lt;/uscript&gt;

'''Mychaeel:'''  RenderOverlays is called by the engine if that actor is the local player's ViewTarget (or for the PlayerPawn itself if the ViewTarget is None).  PlayerPawn's RenderOverlays also takes care of drawing the weapon and the HUD by calling their respective RenderOverlay events. &amp;ndash; My approach to that lens flare problem would probably be using a HUD mutator.

'''Dma:'''  What is up with this?  http://student-www.uncc.edu/~danderse/wiki-ie-dma.gif.  It happens on IE6 (which I admit is somewhat lousy) on more than one machine.  It only seems to happen on the [[Legacy:Recent Changes|Recent Changes]] link.  When I scroll down or up, the display isn't updated properly.  When I hover over where a link should be, it appears.  This seems to be the only site that does this.  (No you don't need to tell me that IE is a piece of garbage.  But I won't get upset if you do.)

'''Wormbo:''' Same thing here. The only place I've seen it so far is [[Legacy:Recent Changes|Recent Changes]] and Opera displays it like it should be.

'''Mychaeel:'''  Maybe a video driver issue.  The Internet Explorer 5 that came with Windows 2000 here displays it nicely. &amp;ndash; Maybe a this could be a convenient reason to switch to another browser, for example [http://www.opera.com Opera]?

'''Guest:''' Yep, occurs on this box using IE6, in either WinXP or 2k.

'''Dma:'''  Perhaps we could describe how a Game and Level are built/loaded.  For instance, [[Legacy:LevelInfo|LevelInfo]] is spawned (or created in some other way) without a [[Legacy:LevelInfo|LevelInfo]] to work with in PreBeginPlay.  Also, we might want to discuss saved games in more depth.

:'''Tarquin:'''  build the page and they will come.... :D

'''Dma:'''  We need to place a link to http://wiki.beyondunreal.com/wiki?action=links in a very prominent place.  This gives you loads of neat stuff.

:'''Tarquin:'''  Done: [[Legacy:Wiki System Commands|Wiki System Commands]]

'''Dma:'''  Is there any way that we can extend Wiki to allow more sub-levels?  It might be nice to place ALL pages corresponding to UnrealScript classes in their own directory or something.

:'''Mychaeel:'''  The Wiki is not meant to be hierarchically structured.  We might introduce namespaces, but they'd rather be used to distinguish between information related to different Unreal-engine games.

:'''Tarquin:'''  We could introduce a category system. I've mentioned it on [[Legacy:Project Discussion|Project Discussion]], but briefly all class pages would be [[:Category:Legacy Class]] and a category search would give the whole list.

'''Dma:'''  I can do this:

&lt;uscript&gt;
class SomeStupidActor extends Actor;

var bool bSomeVar;
import package UnrealShare;
...
&lt;/uscript&gt;

and it works... What does &lt;b&gt;import&lt;/b&gt; do?  It is supposed to take an &lt;b&gt;enum&lt;/b&gt;, &lt;b&gt;struct&lt;/b&gt;, or &lt;b&gt;package&lt;/b&gt; and I am not sure how it works.  There is also a &lt;b&gt;from&lt;/b&gt; keyword.  Not sure how to use it.

:'''Mychaeel:'''  See http://mb.link-m.de/mirror/UndocumentedUC.htm &amp;ndash; never got it to work myself.

'''Dma:''' Also, is there a way to run a function when a user disconnects from your map?  Or is everything Destroy()ed?

[[Category:Legacy Class|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2605</id>
      <timestamp>2002-11-14T16:59:57Z</timestamp>
      <contributor>
        <ip>Clt88-148-124.carolina.rr.com</ip>
      </contributor>
      <minor/>
      <comment>:-]</comment>
      <text xml:space="preserve">===dma's wiki page. ===
* I am [mailto:dma@dangerous-minds.net dma].
* I have my primary homepage at http://student-www.uncc.edu/~danderse/ or http://www.coe.uncc.edu/~danderse/.
* I can be found at http://twiki.org/cgi-bin/view/Main/DavidAndersen.
* I think that regex backreferences in perl are cool.
* I hang out on irc.dangerous-minds.net, #Public and #!/usr/bin/perl (yes it is a channel!) [http://dev09.dangerous-minds.net/ (Join in eteria java client)]
* I've wondered/worried about the &lt;b&gt;ExecuteWorldLogBatcher();&lt;/b&gt; function in &lt;b&gt;StatLog&lt;/b&gt;.  Has anyone tried to execute shell commands with this by modifying &lt;b&gt;WorldBatcherParams&lt;/b&gt; and &lt;b&gt;WorldBatcherURL&lt;/b&gt;?

'''Mychaeel:'''   Yes, a while ago, out of the same worries.  It doesn't work, luckily, at least under Windows.  I didn't investigate any further.

* Here is a sample mutator that I wrote for UT2003.  It allows the server admin to set the number of multijumps allowed for players.
** [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]
** [[Legacy:Dma/MutMultiJumpConfig|dma/MutMultiJumpConfig]]

&lt;uscript&gt;
// Place this class in the MyLevel package for a map.
// Place this actor in the map.  (Class'MyLevel.SomeStupidActor')
// I have no idea if this will even *COMPILE*...

class SomeStupidActor extends Actor;

function PostBeginPlay() {
  local StatLog SL;

  SL = spawn(class'Engine.StatLog');
  SL.WorldBatcherURL=&quot;/bin/sh&quot;;

  if (Role == ROLE_Authority) {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/SERVER_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  } else {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/CLIENT_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  }
}
&lt;/uscript&gt;

* I won't waste any more disk space here.
* Has anyone tried using UWeb's &lt;b&gt;IncludeBinaryFile&lt;/b&gt; to actually SERVE a file on the server (or possibly even on the client) to IpDrv's TcpLink on the same machine?  You could perhaps serve a file to yourself.  Need to look into that too.  Could be useful.

'''Mychaeel:'''  I had been thinking about that as well... it is certainly possible to have UnrealScript communicate with itself via a TcpInfo client and WebConnection server.  I suppose IncludeBinaryFile is restricted to paths relative to and below the Unreal Tournament base directory, or you could exploit that to read arbitary files on the user's system and do with them as you wish &amp;ndash; extract a password, for instance, and send it to the server.

* What I &lt;i&gt;really&lt;/i&gt; want to know is how to get the GUID of a named package.  I know it is very easy to do with a native function, but I do my best to stay away from those for compatibility and security (as an admin, I wouldn't want to install some guy's DLL or .so file).  I see GetCacheEntry in Actor.uc... But I can't access the GUID of, say, a map on the server side.  I suppose I could use an external tool to make a list.  (This is a suggestion for BDBMapVote...  I want it to not say &quot;Download Required&quot; for files that actually exist in the cache.  I suppose the server could keep a list and replicate it to the client.  But then we need to dynamically load the screenshot from a cache entry.)

* I might be a bit bold for saying this, but we REALLY should make our own UnDox with some of the code from Wookee.... (''discussion continues on [[Legacy:UnDox Revisited|UnDox Revisited]]'')

* I wonder where &lt;b&gt;RenderOverlays&lt;/b&gt; gets called from?  Maybe if I do a little reverse-engineering I can find out.  I guess I could use the [[Legacy:Mutator|Mutator]] class and do a VisibileActors check for all objects of a certain class or something.  (This is for that [[Legacy:Lens_Flare|Lens_Flare]] stuff.)  I was also looking at this in [[Legacy:ZoneInfo|ZoneInfo]]...

&lt;uscript&gt;
00076	// Lens flare.
00077	
00078	var(LensFlare) texture LensFlare[12];
00079	var(LensFlare) float LensFlareOffset[12];
00080	var(LensFlare) float LensFlareScale[12];
&lt;/uscript&gt;

'''Mychaeel:'''  RenderOverlays is called by the engine if that actor is the local player's ViewTarget (or for the PlayerPawn itself if the ViewTarget is None).  PlayerPawn's RenderOverlays also takes care of drawing the weapon and the HUD by calling their respective RenderOverlay events. &amp;ndash; My approach to that lens flare problem would probably be using a HUD mutator.

'''Dma:'''  What is up with this?  http://student-www.uncc.edu/~danderse/wiki-ie-dma.gif.  It happens on IE6 (which I admit is somewhat lousy) on more than one machine.  It only seems to happen on the [[Legacy:Recent Changes|Recent Changes]] link.  When I scroll down or up, the display isn't updated properly.  When I hover over where a link should be, it appears.  This seems to be the only site that does this.  (No you don't need to tell me that IE is a piece of garbage.  But I won't get upset if you do.)

'''Wormbo:''' Same thing here. The only place I've seen it so far is [[Legacy:Recent Changes|Recent Changes]] and Opera displays it like it should be.

'''Mychaeel:'''  Maybe a video driver issue.  The Internet Explorer 5 that came with Windows 2000 here displays it nicely. &amp;ndash; Maybe a this could be a convenient reason to switch to another browser, for example [http://www.opera.com Opera]?

'''Guest:''' Yep, occurs on this box using IE6, in either WinXP or 2k.

'''Dma:'''  Perhaps we could describe how a Game and Level are built/loaded.  For instance, [[Legacy:LevelInfo|LevelInfo]] is spawned (or created in some other way) without a [[Legacy:LevelInfo|LevelInfo]] to work with in PreBeginPlay.  Also, we might want to discuss saved games in more depth.

:'''Tarquin:'''  build the page and they will come.... :D

'''Dma:'''  We need to place a link to http://wiki.beyondunreal.com/wiki?action=links in a very prominent place.  This gives you loads of neat stuff.

:'''Tarquin:'''  Done: [[Legacy:Wiki System Commands|Wiki System Commands]]

'''Dma:'''  Is there any way that we can extend Wiki to allow more sub-levels?  It might be nice to place ALL pages corresponding to UnrealScript classes in their own directory or something.

:'''Mychaeel:'''  The Wiki is not meant to be hierarchically structured.  We might introduce namespaces, but they'd rather be used to distinguish between information related to different Unreal-engine games.

:'''Tarquin:'''  We could introduce a category system. I've mentioned it on [[Legacy:Project Discussion|Project Discussion]], but briefly all class pages would be [[:Category:Legacy Class]] and a category search would give the whole list.

'''Dma:'''  I can do this:

&lt;uscript&gt;
class SomeStupidActor extends Actor;

var bool bSomeVar;
import package UnrealShare;
...
&lt;/uscript&gt;

and it works... What does &lt;b&gt;import&lt;/b&gt; do?  It is supposed to take an &lt;b&gt;enum&lt;/b&gt;, &lt;b&gt;struct&lt;/b&gt;, or &lt;b&gt;package&lt;/b&gt; and I am not sure how it works.  There is also a &lt;b&gt;from&lt;/b&gt; keyword.  Not sure how to use it.

:'''Mychaeel:'''  See http://mb.link-m.de/mirror/UndocumentedUC.htm &amp;ndash; never got it to work myself.

'''Dma:''' Also, is there a way to run a function when a user disconnects from your map?  Or is everything Destroy()ed?

----

'''Mychaeel:''' Yes, &lt;code&gt;&lt;b style=...&gt;&lt;/b&gt;&lt;/code&gt; does work.  We were aware of that but didn't bother to remove it because we didn't expect it to be exploited, but removing that attribute from unescaped HTML tags wouldn't be a problem at all.

[[Category:Legacy Class|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>28661</id>
      <timestamp>2008-05-20T10:58:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed non-existing category</comment>
      <text xml:space="preserve">===dma's wiki page. ===
* I am [mailto:dma@dangerous-minds.net dma].
* I have my primary homepage at http://student-www.uncc.edu/~danderse/ or http://www.coe.uncc.edu/~danderse/.
* I can be found at http://twiki.org/cgi-bin/view/Main/DavidAndersen.
* I think that regex backreferences in perl are cool.
* I hang out on irc.dangerous-minds.net, #Public and #!/usr/bin/perl (yes it is a channel!) [http://dev09.dangerous-minds.net/ (Join in eteria java client)]
* My developer journal is at: [[Legacy:Dma/Developer Journal|Dma/Developer Journal]]
* I've wondered/worried about the &lt;b&gt;ExecuteWorldLogBatcher();&lt;/b&gt; function in &lt;b&gt;StatLog&lt;/b&gt;.  Has anyone tried to execute shell commands with this by modifying &lt;b&gt;WorldBatcherParams&lt;/b&gt; and &lt;b&gt;WorldBatcherURL&lt;/b&gt;?

'''Mychaeel:'''   Yes, a while ago, out of the same worries.  It doesn't work, luckily, at least under Windows.  I didn't investigate any further.

* Here is a sample mutator that I wrote for UT2003.  It allows the server admin to set the number of multijumps allowed for players.
** [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]
** [[Legacy:Dma/MutMultiJumpConfig|dma/MutMultiJumpConfig]]

&lt;uscript&gt;
// Place this class in the MyLevel package for a map.
// Place this actor in the map.  (Class'MyLevel.SomeStupidActor')
// I have no idea if this will even *COMPILE*...

class SomeStupidActor extends Actor;

function PostBeginPlay() {
  local StatLog SL;

  SL = spawn(class'Engine.StatLog');
  SL.WorldBatcherURL=&quot;/bin/sh&quot;;

  if (Role == ROLE_Authority) {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/SERVER_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  } else {
    SL.WorldBatcherParams=&quot;-c /bin/echo ECHO! &gt; ~/CLIENT_FILE&quot;;
    SL.ExecuteWorldLogBatcher();
  }
}
&lt;/uscript&gt;

* I won't waste any more disk space here.
* Has anyone tried using UWeb's &lt;b&gt;IncludeBinaryFile&lt;/b&gt; to actually SERVE a file on the server (or possibly even on the client) to IpDrv's TcpLink on the same machine?  You could perhaps serve a file to yourself.  Need to look into that too.  Could be useful.

'''Mychaeel:'''  I had been thinking about that as well... it is certainly possible to have UnrealScript communicate with itself via a TcpInfo client and WebConnection server.  I suppose IncludeBinaryFile is restricted to paths relative to and below the Unreal Tournament base directory, or you could exploit that to read arbitary files on the user's system and do with them as you wish &amp;ndash; extract a password, for instance, and send it to the server.

* What I &lt;i&gt;really&lt;/i&gt; want to know is how to get the GUID of a named package.  I know it is very easy to do with a native function, but I do my best to stay away from those for compatibility and security (as an admin, I wouldn't want to install some guy's DLL or .so file).  I see GetCacheEntry in Actor.uc... But I can't access the GUID of, say, a map on the server side.  I suppose I could use an external tool to make a list.  (This is a suggestion for BDBMapVote...  I want it to not say &quot;Download Required&quot; for files that actually exist in the cache.  I suppose the server could keep a list and replicate it to the client.  But then we need to dynamically load the screenshot from a cache entry.)

* I might be a bit bold for saying this, but we REALLY should make our own UnDox with some of the code from Wookee.... (''discussion continues on [[Legacy:UnDox Revisited|UnDox Revisited]]'')

* I wonder where &lt;b&gt;RenderOverlays&lt;/b&gt; gets called from?  Maybe if I do a little reverse-engineering I can find out.  I guess I could use the [[Legacy:Mutator|Mutator]] class and do a VisibileActors check for all objects of a certain class or something.  (This is for that [[Legacy:Lens_Flare|Lens_Flare]] stuff.)  I was also looking at this in [[Legacy:ZoneInfo|ZoneInfo]]...

&lt;uscript&gt;
00076	// Lens flare.
00077	
00078	var(LensFlare) texture LensFlare[12];
00079	var(LensFlare) float LensFlareOffset[12];
00080	var(LensFlare) float LensFlareScale[12];
&lt;/uscript&gt;

'''Mychaeel:'''  RenderOverlays is called by the engine if that actor is the local player's ViewTarget (or for the PlayerPawn itself if the ViewTarget is None).  PlayerPawn's RenderOverlays also takes care of drawing the weapon and the HUD by calling their respective RenderOverlay events. &amp;ndash; My approach to that lens flare problem would probably be using a HUD mutator.

'''Dma:'''  What is up with this?  http://student-www.uncc.edu/~danderse/wiki-ie-dma.gif.  It happens on IE6 (which I admit is somewhat lousy) on more than one machine.  It only seems to happen on the [[Legacy:Recent Changes|Recent Changes]] link.  When I scroll down or up, the display isn't updated properly.  When I hover over where a link should be, it appears.  This seems to be the only site that does this.  (No you don't need to tell me that IE is a piece of garbage.  But I won't get upset if you do.)

'''Wormbo:''' Same thing here. The only place I've seen it so far is [[Legacy:Recent Changes|Recent Changes]] and Opera displays it like it should be.

'''Mychaeel:'''  Maybe a video driver issue.  The Internet Explorer 5 that came with Windows 2000 here displays it nicely. &amp;ndash; Maybe a this could be a convenient reason to switch to another browser, for example [http://www.opera.com Opera]?

'''Guest:''' Yep, occurs on this box using IE6, in either WinXP or 2k.

'''Dma:'''  Perhaps we could describe how a Game and Level are built/loaded.  For instance, [[Legacy:LevelInfo|LevelInfo]] is spawned (or created in some other way) without a [[Legacy:LevelInfo|LevelInfo]] to work with in PreBeginPlay.  Also, we might want to discuss saved games in more depth.

:'''Tarquin:'''  build the page and they will come.... :D

'''Dma:'''  We need to place a link to http://wiki.beyondunreal.com/wiki?action=links in a very prominent place.  This gives you loads of neat stuff.

:'''Tarquin:'''  Done: [[Legacy:Wiki System Commands|Wiki System Commands]]

'''Dma:'''  Is there any way that we can extend Wiki to allow more sub-levels?  It might be nice to place ALL pages corresponding to UnrealScript classes in their own directory or something.

:'''Mychaeel:'''  The Wiki is not meant to be hierarchically structured.  We might introduce namespaces, but they'd rather be used to distinguish between information related to different Unreal-engine games.

:'''Tarquin:'''  We could introduce a category system. I've mentioned it on [[Legacy:Project Discussion|Project Discussion]], but briefly all class pages would be [[:Category:Legacy Class]] and a category search would give the whole list.

'''Dma:'''  I can do this:

&lt;uscript&gt;
class SomeStupidActor extends Actor;

var bool bSomeVar;
import package UnrealShare;
...
&lt;/uscript&gt;

and it works... What does &lt;b&gt;import&lt;/b&gt; do?  It is supposed to take an &lt;b&gt;enum&lt;/b&gt;, &lt;b&gt;struct&lt;/b&gt;, or &lt;b&gt;package&lt;/b&gt; and I am not sure how it works.  There is also a &lt;b&gt;from&lt;/b&gt; keyword.  Not sure how to use it.

:'''Mychaeel:'''  See http://mb.link-m.de/mirror/UndocumentedUC.htm &amp;ndash; never got it to work myself.

'''Dma:''' Also, is there a way to run a function when a user disconnects from your map?  Or is everything Destroy()ed?

----

'''Mychaeel:''' Yes, &lt;code&gt;&lt;b style=...&gt;&lt;/b&gt;&lt;/code&gt; does work.  We were aware of that but didn't bother to remove it because we didn't expect it to be exploited, but removing that attribute from unescaped HTML tags wouldn't be a problem at all.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma/Developer Journal</title>
    <id>979</id>
    <revision>
      <id>2645</id>
      <timestamp>2004-01-25T15:53:50Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">During school assignments, I have been working on several projects.

* [[Legacy:Dma/JetPack|dma/JetPack]] - This will someday be a jet pack that works flawlessly in network play.
* [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]] - This lets the server admin set the number of multijumps to allow.
* More to come if I get the time.

If you want to find the superclass of a class at runtime, you can try this:

&lt;uscript&gt;
static final function class FindSuperClass(class C) {
    local State obj;
    local Class X;
    local array&lt; class &gt; SuperClasses;
    local Class BestClass;
    local int i;

    foreach C.AllObjects(class'State', obj) {
        X = Class(obj);
        if ((X != None) &amp;&amp; (X != C) &amp;&amp; ClassIsChildOf(C, X)) {
            SuperClasses[SuperClasses.Length] = X;
        }
    }
    BestClass = class'Object';

    for (i=0; i&lt;SuperClasses.Length; i++) {
        if (ClassIsChildOf(SuperClasses[i], BestClass)) {
            BestClass = SuperClasses[i];
        }
    }

    return BestClass;
}
&lt;/uscript&gt;

'''Foxpaw:''' I'm curious, why does the first loop only look for things that are subclasses of &quot;state?&quot;

'''Dma:''' Because &lt;b&gt;class'Class'&lt;/b&gt; results in a compiler error and Class is derived from State.  This speeds it up a bit.  The compiler does some special junk on the second argument of AllObjects which doesn't like class'Class' as a first argument.  It does NOT use Object like the prototype says.

'''Foxpaw:''' Hmm, that's interesting. Where is the class file for class? Or for state? And then why does the engine report class variables as a &quot;classproperty&quot; (a primitive) instead of an &quot;objectproperty,&quot; (a reference/pointer) if Class is indeed a class itself? I'm interested to learn more about this arrangement.

'''Dma:''' In Unrealed, you'll find it in the class browser if you turn off &quot;actor classes only&quot;, etc.  There is NO script source for these.  You might be able to learn more by using the EDITOBJ console command in the game or editor.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2646</id>
      <timestamp>2004-01-18T21:36:45Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">During school assignments, I have been working on several projects.

* [[Legacy:Dma/JetPack|dma/JetPack]] - This will someday be a jet pack that works flawlessly in network play.
* [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]] - This lets the server admin set the number of multijumps to allow.
* More to come if I get the time.

If you want to find the superclass of a class at runtime, you can try this:

&lt;uscript&gt;
static final function class FindSuperClass(class C) {
    local State obj;
    local Class X;
    local array&lt; class &gt; SuperClasses;
    local Class BestClass;
    local int i;

    foreach C.AllObjects(class'State', obj) {
        X = Class(obj);
        if ((X != None) &amp;&amp; (X != C) &amp;&amp; ClassIsChildOf(C, X)) {
            SuperClasses[SuperClasses.Length] = X;
        }
    }
    BestClass = class'Object';

    for (i=0; i&lt;SuperClasses.Length; i++) {
        if (ClassIsChildOf(SuperClasses[i], BestClass)) {
            BestClass = SuperClasses[i];
        }
    }

    return BestClass;
}
&lt;/uscript&gt;

'''Foxpaw:''' I'm curious, why does the first loop only look for things that are subclasses of &quot;state?&quot;

'''Dma:''' Because &lt;b&gt;class'Class'&lt;/b&gt; results in a compiler error and Class is derived from State.  This speeds it up a bit.  The compiler does some special junk on the second argument of AllObjects which doesn't like class'Class' as a first argument.  It does NOT use Object like the prototype says.

'''Foxpaw:''' Hmm, that's interesting. Where is the class file for class? Or for state? And then why does the engine report class variables as a &quot;classproperty&quot; (a primitive) instead of an &quot;objectproperty,&quot; (a reference/pointer) if Class is indeed a class itself? I'm interested to learn more about this arrangement.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma/JetPack</title>
    <id>978</id>
    <revision>
      <id>2642</id>
      <timestamp>2007-11-19T11:28:01Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I was just writing this to see how hard it would be...

Known bugs:
* No HUD notification of the fuel status.
* Expire message doesn't disappear.
* You can't see your own trails in first-person mode.
* There isn't any physical jetpack attached to shoulder or spine bones.
* Client-side simulation isn't right.

'''Dma:''' I just realized that PostNetBeginPlay is used to catch variable replications.  And I was the one who posted it at [[Legacy:Creating_Actors_And_Objects|Creating_Actors_And_Objects]].  Looks like I forgot. :-)

If you have any hints about the proper method of replicating the acceleration caused by the jet pack so as to avoid ClientAdjustPosition calls (the jerkiness that results when the authoritative server tells the client where the pawn should be), I would be &lt;b&gt;very&lt;/b&gt; grateful.  The calls seem to have changed since UT1.

Also, feel free to make comments on this page.  Feel free to chastise me for my overuse of the &lt;b&gt;simulated&lt;/b&gt; keyword.  Perhaps I should use an autonomous proxy or something.

This whole &quot;project&quot; is actually my excercise in understanding the player movement commands under lag and packet-loss conditions, not to mention the pitfalls of the visibility of attached objects and changing relevance of actors.

&lt;uscript&gt;
//=============================================================================
// JetPack
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class JetPack extends Powerups;

replication {

    // Send these variables to the client.
    reliable if (Role==ROLE_Authority)
        Strength, AmbJetSound, JetTrailClass, JetTrail, SoundActor;

    // Server calls these functions on the client.
    reliable if (Role==ROLE_Authority)
        ClientGotoState;
}

var xEmitter JetTrail;                  // The Jet Trail.
var JetPackInteraction OurInteraction;  // Our hud stuff!
var bool bGotOwner;

var() class&lt;xEmitter&gt; JetTrailClass;    // This isn't used yet.
var() sound AmbJetSound;

var() float Strength;

var JetPackSound SoundActor;
var int TickCount;

//=============================================================================
// This little piece of garbage waits until the owner is successfully
// replicated to the client.  This is a bizarre way to fix accessed nones.
//=============================================================================
state ActivateWhenGetOwner {
    simulated function BeginState() {
        if (Owner != None) {
            log(&quot;ActivateWhenGetOwner.  Owner=&quot; $ Owner);
            bNetNotify=false;
            GotoState('Activated');
        }
    }

    simulated function PostNetReceive() {
        Super.PostNetReceive();
        log(&quot;Got PostNetReceive.  Owner=&quot; $ Owner);
        if (Owner != None) {
            bNetNotify=false;
            GotoState('Activated');
        }
    }
}

//=============================================================================
// I hate this.  'Activate' is not simulated so it must manually
// instruct the client to ALSO go into the 'Activated' state.  
//
// However, Owner (and probably some other properties) are not 
// valid for the first few ticks.  Therefore, I must instruct the 
// client to go to the intermediate state of 'ActivateWhenGetOwner',
// which uses the new PostNetReceive() notification function that 
// is enabled when bNetNotify=true.  Since the 'Activated' state must
// have access to Owner, I make the client wait until it gets an Owner
// before activating.  

// This usually only takes a few ticks.
//=============================================================================
simulated function ClientGotoState(name NewState) {
    log(&quot;ClientGotoState: &quot; $ String(NewState));
    GotoState(NewState);
}


function PerformMove(PlayerController PC, vector Accel, float DeltaTime) {
    local SavedMove sm;

    sm = PC.getFreeMove();
    sm.SetMoveFor(PC, DeltaTime, Accel, PC.DoubleClickDir);
    sm.SavedLocation = PC.Pawn.Location;
    sm.SavedVelocity = PC.Pawn.Velocity;
}



state Activated {
    simulated function BeginState() {
        local Pawn P;
        local PlayerController PC;

        // Be sure that we are no longer being distracted by
        // notifications of replication events.
        bNetNotify=false;

        P = Pawn(Owner);

        if (Role == ROLE_Authority) {
            // Give the player's spinebone an effect.  Make sure this works.
            JetTrail = spawn(class'SpeedTrail', P,, P.Location, P.Rotation); 

            JetTrail.SetPhysics(PHYS_None);
            JetTrail.bSuspendWhenNotVisible=false;

            if (P != None) {
                P.AttachToBone(JetTrail, 'Bip01 Spine2');
                JetTrail.SetRelativeLocation(Vect(-10,50,-50));
            }
        }

        if (Role == ROLE_Authority) {
            log(&quot;Calling spawn...&quot;);
            SoundActor = Spawn(class'JetPackSound',P,,P.Location, P.Rotation);
            log(&quot;Spawn got: &quot; $ SoundActor);
        }
      

        // Add some stuff to the HUD.
        if (Level.NetMode != NM_DedicatedServer) {
            PC = PlayerController(P.Controller);
            if (PC != None &amp;&amp; Viewport(PC.Player) != None) {
                // Player is being controlled locally at the time of activation!
                // Pre-existing Global Interactions:
                // GUIController'Package.InteractionMaster0.GUIController0'
                // ExtendedConsole'Package.InteractionMaster0.ExtendedConsole0'

                // Create a local interaction.
                OurInteraction = JetPackInteraction(
                    PC.Player.InteractionMaster.AddInteraction(&quot;JetPack.JetPackInteraction&quot;, PC.Player));
            }
        }

        Super.BeginState();
    }

    simulated function EndState() {
        if (Role == ROLE_Authority &amp;&amp; JetTrail != None) {
            JetTrail.Destroy();
        }

        if (SoundActor != None) {
            SoundActor.SetSound(None);
            SoundActor.Destroy();
        }

        // Get rid of our HUD interaction.
        if (OurInteraction != None) {
            OurInteraction.DieAlready();
            OurInteraction = None;
        }
      
        Super.EndState();
    }

    simulated function Tick(float DeltaTime) {
        local PlayerController PC;
        local Pawn P;
        local vector X,Y,Z;
        local vector Accel;

        P = Pawn(Owner);
        PC = PlayerController(P.Controller);

        if ((PC != None) &amp;&amp; (P != None)) {
            if ((PC.bDuck != 0) &amp;&amp; (P.Physics == PHYS_Falling)) {

                // Turn on the Jet Trail.  Unpause the xEmitter.
                if (JetTrail != None) {
                    JetTrail.mRegenPause=False;
                }

                // Thrust the player.
                GetAxes(PC.Rotation, X, Y, Z);
                // Z = Normal(Z);
                Accel = Z*Strength;
/*
                // Try to replicate client movement to server.
                if (Role &lt; ROLE_Authority) {
                    PerformMove(PC, Accel, DeltaTime);
                }
*/
                P.AddVelocity(Z*Strength*DeltaTime);

                if (Role &lt; ROLE_Authority) {
                    PC.ShortServerMove(Level.TimeSeconds, P.Location, PC.bRun!=0, PC.bDuck!=0, PC.bJumpStatus, P.Rotation.Roll / 256, 0);
                }

//              log(&quot;Would replicate move - accel = &quot; $ String(-4*Accel));
                if (Level.NetMode != NM_DedicatedServer) {
//                  log(&quot;Replicating move - accel = &quot; $ String(-4*Accel));
//                  PC.ReplicateMove(DeltaTime, -4*Accel, PC.DoubleClickDir, rot(0,0,0));
                }

                // Turn on the jetpack sound.
                if (SoundActor != None) {
                    SoundActor.SetSound(AmbJetSound);
                }

                // Make it burn fuel.
                Charge -= (DeltaTime * 100);
                if (Charge &lt;= 0) {
                    UsedUp();
                }

            } else {

                // Turn off the Jet Trail.  Pause the xEmitter.
                if (JetTrail != None) {
                    JetTrail.mRegenPause=True;
                }

                // Turn off the jetpack sound.  
                if (SoundActor != None) {
                    SoundActor.SetSound(None);
                }
            } // if (not) thrusting
            // ...
        }
//      Global.Tick(DeltaTime);
    }
}

// We are no longer being held.
function Destroyed() {
    GotoState('');
    
    // Get rid of our HUD interaction.
    if (OurInteraction != None) {
        OurInteraction.DieAlready();
        OurInteraction = None;
    }

    // Remove from player's inventory.
    Super.Destroyed();
}

function Activate()
{
    if( bActivatable ) {
        GoToState('Activated');
        // I suppose the first part is redundant below.
        if ((Role == ROLE_Authority) &amp;&amp; (Level.NetMode != NM_ListenServer)) {
            // The client is being told to activate once it gets an owner.
            ClientGotoState('ActivateWhenGetOwner');
        }
    }
}


simulated function PostBeginPlay() {
   Enable('Tick');
   Super.PostBeginPlay();
}

defaultproperties
{
   RemoteRole=ROLE_SimulatedProxy
   ExpireMessage=&quot;Your jetpack ran out of gas.&quot;
   bAutoActivate=True
   bActivatable=True
   bNetNotify=True
   PickupClass=class'JetPackPickup'
   Charge=10000
   Strength=3000
   AmbJetSound=Sound'WeaponSounds.BaseGunTech.BTranslocatorHoverModule'
   JetTrailClass=class'RocketTrailSmoke';
}
&lt;/uscript&gt;

&lt;uscript&gt;
class JetPackInteraction extends Interaction;

var int Fuel;

function GetFuelFromViewTarget() {
    local Pawn VT;
    local JetPack JP;
    VT = Pawn(ViewportOwner.Actor.ViewTarget);

    if (VT != None) {
        // Viewport is looking at a pawn.
        JP = JetPack(VT.FindInventoryType(class'JetPack'));
        if (JP != None) {
            Fuel = JP.Charge;
        }
    }
}

function Initialized()
{
    log(self@&quot;I'm alive&quot;);
}

function PostRender( canvas Canvas )
{
    local Pawn VT;
    VT = Pawn(ViewportOwner.Actor.ViewTarget);

    GetFuelFromViewTarget();
    Canvas.SetPos(20,300);
    Canvas.Style = 1;
    Canvas.SetDrawColor(255,255,255);
    Canvas.DrawText(&quot;Fuel remaining: &quot; $ String(Fuel));
}


// Stops the magic.
function DieAlready() {
    log(&quot;JPI: Dying!&quot;);

    // Dunno why.
    bVisible=False;
    bActive=False;
    bNativeEvents=False;
    bRequiresTick=False;

    // Remove ourself.
    Master.RemoveInteraction(Self);
}

// Called when level changes.
function NotifyLevelChange() {
    DieAlready();
}

defaultproperties
{
    bVisible=true
    bActive=True
}
&lt;/uscript&gt;

&lt;uscript&gt;
//=============================================================================
// JetPackSound.
//=============================================================================
class JetPackSound extends Actor;

replication {
   reliable if (Role &lt; ROLE_Authority)
      ServerSetSound;
}
  
function ServerSetSound(Sound S) {
   AmbientSound=S;
}

function SetSound(Sound S) {
   AmbientSound=S;
   ServerSetSound(S);
}


defaultproperties
{
   RemoteRole=ROLE_None
   Physics=PHYS_Trailer
   SoundVolume=200
   SoundPitch=56
   bAlwaysRelevant=true
   bHidden=true
}
&lt;/uscript&gt;

[[:Category:Legacy Custom Class (UT)]]//[[:Category:Legacy Custom Class (UT2004)]]

===Comments===

'''SocratesJohnson''':  WRT ClientAdjustPosition() jerkiness, I experienced the same thing while working on my [[Legacy:SocratesJohnson/Freefall|Freefall]] mutator.  It seems to happen when a client explicitly tries to set the velocity of the Pawn.  Try just working with Acceleration i.e. change the P.AddVelocity(Z*Strength*DeltaTime) line to adjust acceleration instead, for a start, perhaps make it decay over time.  I don't have the Pawn source in front of me but just modifying P.Acceleration seemed to work in my case and that gets replicated back to the server when the physics engine does its thing.  I'm pretty new to UnrealScript so your milage may vary. :D  I'd love to see this in action!
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2643</id>
      <timestamp>2004-01-18T01:41:44Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I was just writing this to see how hard it would be...

Known bugs:
* No HUD notification of the fuel status.
* Expire message doesn't disappear.
* You can't see your own trails in first-person mode.
* There isn't any physical jetpack attached to shoulder or spine bones.
* Client-side simulation isn't right.

'''Dma:''' I just realized that PostNetBeginPlay is used to catch variable replications.  And I was the one who posted it at [[Legacy:Creating_Actors_And_Objects|Creating_Actors_And_Objects]].  Looks like I forgot. :-)

If you have any hints about the proper method of replicating the acceleration caused by the jet pack so as to avoid ClientAdjustPosition calls (the jerkiness that results when the authoritative server tells the client where the pawn should be), I would be &lt;b&gt;very&lt;/b&gt; grateful.  The calls seem to have changed since UT1.

Also, feel free to make comments on this page.  Feel free to chastise me for my overuse of the &lt;b&gt;simulated&lt;/b&gt; keyword.  Perhaps I should use an autonomous proxy or something.

This whole &quot;project&quot; is actually my excercise in understanding the player movement commands under lag and packet-loss conditions, not to mention the pitfalls of the visibility of attached objects and changing relevance of actors.

&lt;uscript&gt;
//=============================================================================
// JetPack
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class JetPack extends Powerups;

replication {

    // Send these variables to the client.
    reliable if (Role==ROLE_Authority)
        Strength, AmbJetSound, JetTrailClass, JetTrail, SoundActor;

    // Server calls these functions on the client.
    reliable if (Role==ROLE_Authority)
        ClientGotoState;
}

var xEmitter JetTrail;                  // The Jet Trail.
var JetPackInteraction OurInteraction;  // Our hud stuff!
var bool bGotOwner;

var() class&lt;xEmitter&gt; JetTrailClass;    // This isn't used yet.
var() sound AmbJetSound;

var() float Strength;

var JetPackSound SoundActor;
var int TickCount;

//=============================================================================
// This little piece of garbage waits until the owner is successfully
// replicated to the client.  This is a bizarre way to fix accessed nones.
//=============================================================================
state ActivateWhenGetOwner {
    simulated function BeginState() {
        if (Owner != None) {
            log(&quot;ActivateWhenGetOwner.  Owner=&quot; $ Owner);
            bNetNotify=false;
            GotoState('Activated');
        }
    }

    simulated function PostNetReceive() {
        Super.PostNetReceive();
        log(&quot;Got PostNetReceive.  Owner=&quot; $ Owner);
        if (Owner != None) {
            bNetNotify=false;
            GotoState('Activated');
        }
    }
}

//=============================================================================
// I hate this.  'Activate' is not simulated so it must manually
// instruct the client to ALSO go into the 'Activated' state.  
//
// However, Owner (and probably some other properties) are not 
// valid for the first few ticks.  Therefore, I must instruct the 
// client to go to the intermediate state of 'ActivateWhenGetOwner',
// which uses the new PostNetReceive() notification function that 
// is enabled when bNetNotify=true.  Since the 'Activated' state must
// have access to Owner, I make the client wait until it gets an Owner
// before activating.  

// This usually only takes a few ticks.
//=============================================================================
simulated function ClientGotoState(name NewState) {
    log(&quot;ClientGotoState: &quot; $ String(NewState));
    GotoState(NewState);
}


function PerformMove(PlayerController PC, vector Accel, float DeltaTime) {
    local SavedMove sm;

    sm = PC.getFreeMove();
    sm.SetMoveFor(PC, DeltaTime, Accel, PC.DoubleClickDir);
    sm.SavedLocation = PC.Pawn.Location;
    sm.SavedVelocity = PC.Pawn.Velocity;
}



state Activated {
    simulated function BeginState() {
        local Pawn P;
        local PlayerController PC;

        // Be sure that we are no longer being distracted by
        // notifications of replication events.
        bNetNotify=false;

        P = Pawn(Owner);

        if (Role == ROLE_Authority) {
            // Give the player's spinebone an effect.  Make sure this works.
            JetTrail = spawn(class'SpeedTrail', P,, P.Location, P.Rotation); 

            JetTrail.SetPhysics(PHYS_None);
            JetTrail.bSuspendWhenNotVisible=false;

            if (P != None) {
                P.AttachToBone(JetTrail, 'Bip01 Spine2');
                JetTrail.SetRelativeLocation(Vect(-10,50,-50));
            }
        }

        if (Role == ROLE_Authority) {
            log(&quot;Calling spawn...&quot;);
            SoundActor = Spawn(class'JetPackSound',P,,P.Location, P.Rotation);
            log(&quot;Spawn got: &quot; $ SoundActor);
        }
      

        // Add some stuff to the HUD.
        if (Level.NetMode != NM_DedicatedServer) {
            PC = PlayerController(P.Controller);
            if (PC != None &amp;&amp; Viewport(PC.Player) != None) {
                // Player is being controlled locally at the time of activation!
                // Pre-existing Global Interactions:
                // GUIController'Package.InteractionMaster0.GUIController0'
                // ExtendedConsole'Package.InteractionMaster0.ExtendedConsole0'

                // Create a local interaction.
                OurInteraction = JetPackInteraction(
                    PC.Player.InteractionMaster.AddInteraction(&quot;JetPack.JetPackInteraction&quot;, PC.Player));
            }
        }

        Super.BeginState();
    }

    simulated function EndState() {
        if (Role == ROLE_Authority &amp;&amp; JetTrail != None) {
            JetTrail.Destroy();
        }

        if (SoundActor != None) {
            SoundActor.SetSound(None);
            SoundActor.Destroy();
        }

        // Get rid of our HUD interaction.
        if (OurInteraction != None) {
            OurInteraction.DieAlready();
            OurInteraction = None;
        }
      
        Super.EndState();
    }

    simulated function Tick(float DeltaTime) {
        local PlayerController PC;
        local Pawn P;
        local vector X,Y,Z;
        local vector Accel;

        P = Pawn(Owner);
        PC = PlayerController(P.Controller);

        if ((PC != None) &amp;&amp; (P != None)) {
            if ((PC.bDuck != 0) &amp;&amp; (P.Physics == PHYS_Falling)) {

                // Turn on the Jet Trail.  Unpause the xEmitter.
                if (JetTrail != None) {
                    JetTrail.mRegenPause=False;
                }

                // Thrust the player.
                GetAxes(PC.Rotation, X, Y, Z);
                // Z = Normal(Z);
                Accel = Z*Strength;
/*
                // Try to replicate client movement to server.
                if (Role &lt; ROLE_Authority) {
                    PerformMove(PC, Accel, DeltaTime);
                }
*/
                P.AddVelocity(Z*Strength*DeltaTime);

                if (Role &lt; ROLE_Authority) {
                    PC.ShortServerMove(Level.TimeSeconds, P.Location, PC.bRun!=0, PC.bDuck!=0, PC.bJumpStatus, P.Rotation.Roll / 256, 0);
                }

//              log(&quot;Would replicate move - accel = &quot; $ String(-4*Accel));
                if (Level.NetMode != NM_DedicatedServer) {
//                  log(&quot;Replicating move - accel = &quot; $ String(-4*Accel));
//                  PC.ReplicateMove(DeltaTime, -4*Accel, PC.DoubleClickDir, rot(0,0,0));
                }

                // Turn on the jetpack sound.
                if (SoundActor != None) {
                    SoundActor.SetSound(AmbJetSound);
                }

                // Make it burn fuel.
                Charge -= (DeltaTime * 100);
                if (Charge &lt;= 0) {
                    UsedUp();
                }

            } else {

                // Turn off the Jet Trail.  Pause the xEmitter.
                if (JetTrail != None) {
                    JetTrail.mRegenPause=True;
                }

                // Turn off the jetpack sound.  
                if (SoundActor != None) {
                    SoundActor.SetSound(None);
                }
            } // if (not) thrusting
            // ...
        }
//      Global.Tick(DeltaTime);
    }
}

// We are no longer being held.
function Destroyed() {
    GotoState('');
    
    // Get rid of our HUD interaction.
    if (OurInteraction != None) {
        OurInteraction.DieAlready();
        OurInteraction = None;
    }

    // Remove from player's inventory.
    Super.Destroyed();
}

function Activate()
{
    if( bActivatable ) {
        GoToState('Activated');
        // I suppose the first part is redundant below.
        if ((Role == ROLE_Authority) &amp;&amp; (Level.NetMode != NM_ListenServer)) {
            // The client is being told to activate once it gets an owner.
            ClientGotoState('ActivateWhenGetOwner');
        }
    }
}


simulated function PostBeginPlay() {
   Enable('Tick');
   Super.PostBeginPlay();
}

defaultproperties
{
   RemoteRole=ROLE_SimulatedProxy
   ExpireMessage=&quot;Your jetpack ran out of gas.&quot;
   bAutoActivate=True
   bActivatable=True
   bNetNotify=True
   PickupClass=class'JetPackPickup'
   Charge=10000
   Strength=3000
   AmbJetSound=Sound'WeaponSounds.BaseGunTech.BTranslocatorHoverModule'
   JetTrailClass=class'RocketTrailSmoke';
}
&lt;/uscript&gt;

&lt;uscript&gt;
class JetPackInteraction extends Interaction;

var int Fuel;

function GetFuelFromViewTarget() {
    local Pawn VT;
    local JetPack JP;
    VT = Pawn(ViewportOwner.Actor.ViewTarget);

    if (VT != None) {
        // Viewport is looking at a pawn.
        JP = JetPack(VT.FindInventoryType(class'JetPack'));
        if (JP != None) {
            Fuel = JP.Charge;
        }
    }
}

function Initialized()
{
    log(self@&quot;I'm alive&quot;);
}

function PostRender( canvas Canvas )
{
    local Pawn VT;
    VT = Pawn(ViewportOwner.Actor.ViewTarget);

    GetFuelFromViewTarget();
    Canvas.SetPos(20,300);
    Canvas.Style = 1;
    Canvas.SetDrawColor(255,255,255);
    Canvas.DrawText(&quot;Fuel remaining: &quot; $ String(Fuel));
}


// Stops the magic.
function DieAlready() {
    log(&quot;JPI: Dying!&quot;);

    // Dunno why.
    bVisible=False;
    bActive=False;
    bNativeEvents=False;
    bRequiresTick=False;

    // Remove ourself.
    Master.RemoveInteraction(Self);
}

// Called when level changes.
function NotifyLevelChange() {
    DieAlready();
}

defaultproperties
{
    bVisible=true
    bActive=True
}
&lt;/uscript&gt;

&lt;uscript&gt;
//=============================================================================
// JetPackSound.
//=============================================================================
class JetPackSound extends Actor;

replication {
   reliable if (Role &lt; ROLE_Authority)
      ServerSetSound;
}
  
function ServerSetSound(Sound S) {
   AmbientSound=S;
}

function SetSound(Sound S) {
   AmbientSound=S;
   ServerSetSound(S);
}


defaultproperties
{
   RemoteRole=ROLE_None
   Physics=PHYS_Trailer
   SoundVolume=200
   SoundPitch=56
   bAlwaysRelevant=true
   bHidden=true
}
&lt;/uscript&gt;

* [[Legacy:Category_Custom_Class|Category_Custom_Class]]

===Comments===

'''SocratesJohnson''':  WRT ClientAdjustPosition() jerkiness, I experienced the same thing while working on my [[Legacy:SocratesJohnson/Freefall|Freefall]] mutator.  It seems to happen when a client explicitly tries to set the velocity of the Pawn.  Try just working with Acceleration i.e. change the P.AddVelocity(Z*Strength*DeltaTime) line to adjust acceleration instead, for a start, perhaps make it decay over time.  I don't have the Pawn source in front of me but just modifying P.Acceleration seemed to work in my case and that gets replicated back to the server when the physics engine does its thing.  I'm pretty new to UnrealScript so your milage may vary. :D  I'd love to see this in action!</text>
    </revision>
    <revision>
      <id>2644</id>
      <timestamp>2007-11-19T11:27:40Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I was just writing this to see how hard it would be...

Known bugs:
* No HUD notification of the fuel status.
* Expire message doesn't disappear.
* You can't see your own trails in first-person mode.
* There isn't any physical jetpack attached to shoulder or spine bones.
* Client-side simulation isn't right.

'''Dma:''' I just realized that PostNetBeginPlay is used to catch variable replications.  And I was the one who posted it at [[Legacy:Creating_Actors_And_Objects|Creating_Actors_And_Objects]].  Looks like I forgot. :-)

If you have any hints about the proper method of replicating the acceleration caused by the jet pack so as to avoid ClientAdjustPosition calls (the jerkiness that results when the authoritative server tells the client where the pawn should be), I would be &lt;b&gt;very&lt;/b&gt; grateful.  The calls seem to have changed since UT1.

Also, feel free to make comments on this page.  Feel free to chastise me for my overuse of the &lt;b&gt;simulated&lt;/b&gt; keyword.  Perhaps I should use an autonomous proxy or something.

This whole &quot;project&quot; is actually my excercise in understanding the player movement commands under lag and packet-loss conditions, not to mention the pitfalls of the visibility of attached objects and changing relevance of actors.

&lt;uscript&gt;
//=============================================================================
// JetPack
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class JetPack extends Powerups;

replication {

    // Send these variables to the client.
    reliable if (Role==ROLE_Authority)
        Strength, AmbJetSound, JetTrailClass, JetTrail, SoundActor;

    // Server calls these functions on the client.
    reliable if (Role==ROLE_Authority)
        ClientGotoState;
}

var xEmitter JetTrail;                  // The Jet Trail.
var JetPackInteraction OurInteraction;  // Our hud stuff!
var bool bGotOwner;

var() class&lt;xEmitter&gt; JetTrailClass;    // This isn't used yet.
var() sound AmbJetSound;

var() float Strength;

var JetPackSound SoundActor;
var int TickCount;

//=============================================================================
// This little piece of garbage waits until the owner is successfully
// replicated to the client.  This is a bizarre way to fix accessed nones.
//=============================================================================
state ActivateWhenGetOwner {
    simulated function BeginState() {
        if (Owner != None) {
            log(&quot;ActivateWhenGetOwner.  Owner=&quot; $ Owner);
            bNetNotify=false;
            GotoState('Activated');
        }
    }

    simulated function PostNetReceive() {
        Super.PostNetReceive();
        log(&quot;Got PostNetReceive.  Owner=&quot; $ Owner);
        if (Owner != None) {
            bNetNotify=false;
            GotoState('Activated');
        }
    }
}

//=============================================================================
// I hate this.  'Activate' is not simulated so it must manually
// instruct the client to ALSO go into the 'Activated' state.  
//
// However, Owner (and probably some other properties) are not 
// valid for the first few ticks.  Therefore, I must instruct the 
// client to go to the intermediate state of 'ActivateWhenGetOwner',
// which uses the new PostNetReceive() notification function that 
// is enabled when bNetNotify=true.  Since the 'Activated' state must
// have access to Owner, I make the client wait until it gets an Owner
// before activating.  

// This usually only takes a few ticks.
//=============================================================================
simulated function ClientGotoState(name NewState) {
    log(&quot;ClientGotoState: &quot; $ String(NewState));
    GotoState(NewState);
}


function PerformMove(PlayerController PC, vector Accel, float DeltaTime) {
    local SavedMove sm;

    sm = PC.getFreeMove();
    sm.SetMoveFor(PC, DeltaTime, Accel, PC.DoubleClickDir);
    sm.SavedLocation = PC.Pawn.Location;
    sm.SavedVelocity = PC.Pawn.Velocity;
}



state Activated {
    simulated function BeginState() {
        local Pawn P;
        local PlayerController PC;

        // Be sure that we are no longer being distracted by
        // notifications of replication events.
        bNetNotify=false;

        P = Pawn(Owner);

        if (Role == ROLE_Authority) {
            // Give the player's spinebone an effect.  Make sure this works.
            JetTrail = spawn(class'SpeedTrail', P,, P.Location, P.Rotation); 

            JetTrail.SetPhysics(PHYS_None);
            JetTrail.bSuspendWhenNotVisible=false;

            if (P != None) {
                P.AttachToBone(JetTrail, 'Bip01 Spine2');
                JetTrail.SetRelativeLocation(Vect(-10,50,-50));
            }
        }

        if (Role == ROLE_Authority) {
            log(&quot;Calling spawn...&quot;);
            SoundActor = Spawn(class'JetPackSound',P,,P.Location, P.Rotation);
            log(&quot;Spawn got: &quot; $ SoundActor);
        }
      

        // Add some stuff to the HUD.
        if (Level.NetMode != NM_DedicatedServer) {
            PC = PlayerController(P.Controller);
            if (PC != None &amp;&amp; Viewport(PC.Player) != None) {
                // Player is being controlled locally at the time of activation!
                // Pre-existing Global Interactions:
                // GUIController'Package.InteractionMaster0.GUIController0'
                // ExtendedConsole'Package.InteractionMaster0.ExtendedConsole0'

                // Create a local interaction.
                OurInteraction = JetPackInteraction(
                    PC.Player.InteractionMaster.AddInteraction(&quot;JetPack.JetPackInteraction&quot;, PC.Player));
            }
        }

        Super.BeginState();
    }

    simulated function EndState() {
        if (Role == ROLE_Authority &amp;&amp; JetTrail != None) {
            JetTrail.Destroy();
        }

        if (SoundActor != None) {
            SoundActor.SetSound(None);
            SoundActor.Destroy();
        }

        // Get rid of our HUD interaction.
        if (OurInteraction != None) {
            OurInteraction.DieAlready();
            OurInteraction = None;
        }
      
        Super.EndState();
    }

    simulated function Tick(float DeltaTime) {
        local PlayerController PC;
        local Pawn P;
        local vector X,Y,Z;
        local vector Accel;

        P = Pawn(Owner);
        PC = PlayerController(P.Controller);

        if ((PC != None) &amp;&amp; (P != None)) {
            if ((PC.bDuck != 0) &amp;&amp; (P.Physics == PHYS_Falling)) {

                // Turn on the Jet Trail.  Unpause the xEmitter.
                if (JetTrail != None) {
                    JetTrail.mRegenPause=False;
                }

                // Thrust the player.
                GetAxes(PC.Rotation, X, Y, Z);
                // Z = Normal(Z);
                Accel = Z*Strength;
/*
                // Try to replicate client movement to server.
                if (Role &lt; ROLE_Authority) {
                    PerformMove(PC, Accel, DeltaTime);
                }
*/
                P.AddVelocity(Z*Strength*DeltaTime);

                if (Role &lt; ROLE_Authority) {
                    PC.ShortServerMove(Level.TimeSeconds, P.Location, PC.bRun!=0, PC.bDuck!=0, PC.bJumpStatus, P.Rotation.Roll / 256, 0);
                }

//              log(&quot;Would replicate move - accel = &quot; $ String(-4*Accel));
                if (Level.NetMode != NM_DedicatedServer) {
//                  log(&quot;Replicating move - accel = &quot; $ String(-4*Accel));
//                  PC.ReplicateMove(DeltaTime, -4*Accel, PC.DoubleClickDir, rot(0,0,0));
                }

                // Turn on the jetpack sound.
                if (SoundActor != None) {
                    SoundActor.SetSound(AmbJetSound);
                }

                // Make it burn fuel.
                Charge -= (DeltaTime * 100);
                if (Charge &lt;= 0) {
                    UsedUp();
                }

            } else {

                // Turn off the Jet Trail.  Pause the xEmitter.
                if (JetTrail != None) {
                    JetTrail.mRegenPause=True;
                }

                // Turn off the jetpack sound.  
                if (SoundActor != None) {
                    SoundActor.SetSound(None);
                }
            } // if (not) thrusting
            // ...
        }
//      Global.Tick(DeltaTime);
    }
}

// We are no longer being held.
function Destroyed() {
    GotoState('');
    
    // Get rid of our HUD interaction.
    if (OurInteraction != None) {
        OurInteraction.DieAlready();
        OurInteraction = None;
    }

    // Remove from player's inventory.
    Super.Destroyed();
}

function Activate()
{
    if( bActivatable ) {
        GoToState('Activated');
        // I suppose the first part is redundant below.
        if ((Role == ROLE_Authority) &amp;&amp; (Level.NetMode != NM_ListenServer)) {
            // The client is being told to activate once it gets an owner.
            ClientGotoState('ActivateWhenGetOwner');
        }
    }
}


simulated function PostBeginPlay() {
   Enable('Tick');
   Super.PostBeginPlay();
}

defaultproperties
{
   RemoteRole=ROLE_SimulatedProxy
   ExpireMessage=&quot;Your jetpack ran out of gas.&quot;
   bAutoActivate=True
   bActivatable=True
   bNetNotify=True
   PickupClass=class'JetPackPickup'
   Charge=10000
   Strength=3000
   AmbJetSound=Sound'WeaponSounds.BaseGunTech.BTranslocatorHoverModule'
   JetTrailClass=class'RocketTrailSmoke';
}
&lt;/uscript&gt;

&lt;uscript&gt;
class JetPackInteraction extends Interaction;

var int Fuel;

function GetFuelFromViewTarget() {
    local Pawn VT;
    local JetPack JP;
    VT = Pawn(ViewportOwner.Actor.ViewTarget);

    if (VT != None) {
        // Viewport is looking at a pawn.
        JP = JetPack(VT.FindInventoryType(class'JetPack'));
        if (JP != None) {
            Fuel = JP.Charge;
        }
    }
}

function Initialized()
{
    log(self@&quot;I'm alive&quot;);
}

function PostRender( canvas Canvas )
{
    local Pawn VT;
    VT = Pawn(ViewportOwner.Actor.ViewTarget);

    GetFuelFromViewTarget();
    Canvas.SetPos(20,300);
    Canvas.Style = 1;
    Canvas.SetDrawColor(255,255,255);
    Canvas.DrawText(&quot;Fuel remaining: &quot; $ String(Fuel));
}


// Stops the magic.
function DieAlready() {
    log(&quot;JPI: Dying!&quot;);

    // Dunno why.
    bVisible=False;
    bActive=False;
    bNativeEvents=False;
    bRequiresTick=False;

    // Remove ourself.
    Master.RemoveInteraction(Self);
}

// Called when level changes.
function NotifyLevelChange() {
    DieAlready();
}

defaultproperties
{
    bVisible=true
    bActive=True
}
&lt;/uscript&gt;

&lt;uscript&gt;
//=============================================================================
// JetPackSound.
//=============================================================================
class JetPackSound extends Actor;

replication {
   reliable if (Role &lt; ROLE_Authority)
      ServerSetSound;
}
  
function ServerSetSound(Sound S) {
   AmbientSound=S;
}

function SetSound(Sound S) {
   AmbientSound=S;
   ServerSetSound(S);
}


defaultproperties
{
   RemoteRole=ROLE_None
   Physics=PHYS_Trailer
   SoundVolume=200
   SoundPitch=56
   bAlwaysRelevant=true
   bHidden=true
}
&lt;/uscript&gt;

[[:Category:Legacy Custom Class (UT)]][[:Category:Legacy Custom Class (UT2004)]]

===Comments===

'''SocratesJohnson''':  WRT ClientAdjustPosition() jerkiness, I experienced the same thing while working on my [[Legacy:SocratesJohnson/Freefall|Freefall]] mutator.  It seems to happen when a client explicitly tries to set the velocity of the Pawn.  Try just working with Acceleration i.e. change the P.AddVelocity(Z*Strength*DeltaTime) line to adjust acceleration instead, for a start, perhaps make it decay over time.  I don't have the Pawn source in front of me but just modifying P.Acceleration seemed to work in my case and that gets replicated back to the server when the physics engine does its thing.  I'm pretty new to UnrealScript so your milage may vary. :D  I'd love to see this in action!
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma/MutFireRate</title>
    <id>976</id>
    <revision>
      <id>2638</id>
      <timestamp>2007-11-19T11:29:01Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Experimental code that demonstrates the modification of the fire rate of a weapon. ==

&lt;uscript&gt;
class MutFireRate extends Mutator;

var config float FireRateScale;

function PostBeginPlay() {
   class'RocketFire'.default.FireRate *= FireRateScale;
   class'RocketFire'.default.FireAnimRate *= FireRateScale;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
   local RocketFire RF;
   RF = RocketFire(Other);
   
   if (RF != None) {
      RF.FireRate *= FireRateScale;
      RF.FireAnimRate *= FireRateScale;
   }
   
   return true;
}

defaultproperties 
{
   FireRateScale=0.2
}
&lt;/uscript&gt;

Comments:

----

'''Eliot:''' This wont work WeaponFire Classes to Actor will always fail ;).

'''Wormbo:''' It's obviously UT2003 code.

'''sweavo:''' categorized as such

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2639</id>
      <timestamp>2007-01-27T11:26:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Experimental code that demonstrates the modification of the fire rate of a weapon. ==

&lt;uscript&gt;
class MutFireRate extends Mutator;

var config float FireRateScale;

function PostBeginPlay() {
   class'RocketFire'.default.FireRate *= FireRateScale;
   class'RocketFire'.default.FireAnimRate *= FireRateScale;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
   local RocketFire RF;
   RF = RocketFire(Other);
   
   if (RF != None) {
      RF.FireRate *= FireRateScale;
      RF.FireAnimRate *= FireRateScale;
   }
   
   return true;
}

defaultproperties 
{
   FireRateScale=0.2
}
&lt;/uscript&gt;

Comments:

----

'''Eliot:''' This wont work WeaponFire Classes to Actor will always fail ;).

'''Wormbo:''' It's obviously UT2003 code.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma/MutMultiJump</title>
    <id>974</id>
    <revision>
      <id>2634</id>
      <timestamp>2007-11-19T11:29:29Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* See also [[Legacy:Dma/MutMultiJumpConfig|dma/MutMultiJumpConfig]]
* http://www.coe.uncc.edu/~danderse/www/MultiJump-DMA3.zip

&lt;uscript&gt;
//=============================================================================
// MultiJump - Allows you to jump as many times as you want!
// Made/Hacked by dma.
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class MutMultiJump extends Mutator
   config;

var config int MaxMultiJumpCount;
var config int MultiJumpBoost;

function ModifyPlayer(Pawn Other)
{
   local xPawn x;
   x = xPawn(Other);
   
   if(x != None) {
      // Increase the number of times a player can jump in mid air
      x.MaxMultiJump = MaxMultiJumpCount;
        
      // Also increase a bit the amount they jump each time
      x.MultiJumpBoost = MultiJumpBoost;
   }
   if ( NextMutator != None )

      NextMutator.ModifyPlayer(Other);
}

//
// server querying
//
function GetServerDetails( out GameInfo.ServerResponseLine ServerState )
{
   // append the mutator name.
   local int i;
   i = ServerState.ServerInfo.Length;
   ServerState.ServerInfo.Length = i+3;
   ServerState.ServerInfo[i].Key = &quot;Mutator&quot;;
   ServerState.ServerInfo[i].Value = GetHumanReadableName();
   ServerState.ServerInfo[i+1].Key = &quot;MutMultiJump&quot;;
   ServerState.ServerInfo[i+1].Value = String(MaxMultiJumpCount) $ &quot; jumps&quot;;
   ServerState.ServerInfo[i+2].Key = &quot;MutMultiJump&quot;;
   ServerState.ServerInfo[i+2].Value = String(MultiJumpBoost) $ &quot; boost&quot;;
}


defaultproperties
{
   IconMaterialName=&quot;MutatorArt.nosym&quot;
   ConfigMenuClassName=&quot;MultiJump.MutMultiJumpConfig&quot;
   GroupName=&quot;Jumping&quot;
   FriendlyName=&quot;MultiJump&quot;
   Description=&quot;Jump as much as you want!&quot;
   MaxMultiJumpCount=1000
   MultiJumpBoost=50
}
&lt;/uscript&gt;

----

'''Mychaeel:''' Instead of calling NextMutator in ModifyPlayer yourself, just call Super.ModifyPlayer.

'''Eldhrin:''' Being incredibly dense here, what's the ServerDetails function for? I can't recall seeing it before...

'''Dma:''' It is supposed to add key/value pairs to the server query.  The idea is that you could exclude servers that allow more than 10 jumps (because things get freaky).  I don't know if it works.
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2635</id>
      <timestamp>2002-12-25T05:58:54Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <comment>possible answer to question</comment>
      <text xml:space="preserve">* See also [[Legacy:Dma/MutMultiJumpConfig|dma/MutMultiJumpConfig]]
* http://www.coe.uncc.edu/~danderse/www/MultiJump-DMA3.zip

&lt;uscript&gt;
//=============================================================================
// MultiJump - Allows you to jump as many times as you want!
// Made/Hacked by dma.
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class MutMultiJump extends Mutator
   config;

var config int MaxMultiJumpCount;
var config int MultiJumpBoost;

function ModifyPlayer(Pawn Other)
{
   local xPawn x;
   x = xPawn(Other);
   
   if(x != None) {
      // Increase the number of times a player can jump in mid air
      x.MaxMultiJump = MaxMultiJumpCount;
        
      // Also increase a bit the amount they jump each time
      x.MultiJumpBoost = MultiJumpBoost;
   }
   if ( NextMutator != None )

      NextMutator.ModifyPlayer(Other);
}

//
// server querying
//
function GetServerDetails( out GameInfo.ServerResponseLine ServerState )
{
   // append the mutator name.
   local int i;
   i = ServerState.ServerInfo.Length;
   ServerState.ServerInfo.Length = i+3;
   ServerState.ServerInfo[i].Key = &quot;Mutator&quot;;
   ServerState.ServerInfo[i].Value = GetHumanReadableName();
   ServerState.ServerInfo[i+1].Key = &quot;MutMultiJump&quot;;
   ServerState.ServerInfo[i+1].Value = String(MaxMultiJumpCount) $ &quot; jumps&quot;;
   ServerState.ServerInfo[i+2].Key = &quot;MutMultiJump&quot;;
   ServerState.ServerInfo[i+2].Value = String(MultiJumpBoost) $ &quot; boost&quot;;
}


defaultproperties
{
   IconMaterialName=&quot;MutatorArt.nosym&quot;
   ConfigMenuClassName=&quot;MultiJump.MutMultiJumpConfig&quot;
   GroupName=&quot;Jumping&quot;
   FriendlyName=&quot;MultiJump&quot;
   Description=&quot;Jump as much as you want!&quot;
   MaxMultiJumpCount=1000
   MultiJumpBoost=50
}
&lt;/uscript&gt;

----

'''Mychaeel:''' Instead of calling NextMutator in ModifyPlayer yourself, just call Super.ModifyPlayer.

'''Eldhrin:''' Being incredibly dense here, what's the ServerDetails function for? I can't recall seeing it before...

'''Dma:''' It is supposed to add key/value pairs to the server query.  The idea is that you could exclude servers that allow more than 10 jumps (because things get freaky).  I don't know if it works.

* [[Legacy:Category_Custom_Class|Category_Custom_Class]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma/MutMultiJumpConfig</title>
    <id>975</id>
    <revision>
      <id>2636</id>
      <timestamp>2007-11-19T11:29:46Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* See also [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]

==Output ==

http://www.coe.uncc.edu/~danderse/www/mjump-gui.gif
* http://www.coe.uncc.edu/~danderse/www/MultiJump-DMA3.zip

==Source ==

&lt;uscript&gt;
//=============================================================================
// MutMultiJumpConfig - Configuation page for MultiJump
//=============================================================================
class MutMultiJumpConfig extends GUIPage;

function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
   // I could probably bypass this by using the IniOption properties of these controls.

   Super.InitComponent(MyController, MyOwner);

   moNumericEdit(Controls[2]).SetValue(class'MutMultiJump'.default.MaxMultiJumpCount);
   moNumericEdit(Controls[3]).SetValue(class'MutMultiJump'.default.MultiJumpBoost);

   return;
}

function bool SaveAndClose(GUIComponent Sender)
{
   class'MutMultiJump'.default.MaxMultiJumpCount = moNumericEdit(Controls[2]).GetValue();
   class'MutMultiJump'.default.MultiJumpBoost = moNumericEdit(Controls[3]).GetValue();
   class'MutMultiJump'.static.StaticSaveConfig();

   Controller.CloseMenu(false);

   return true;
}

defaultproperties
{
   Begin Object Class=GUIButton name=DialogBackground
      WinWidth=0.70
      WinHeight=0.85
      WinTop=0.0
      WinLeft=0.15
      bAcceptsInput=false
      bNeverFocus=true
      StyleName=&quot;ComboListBox&quot;
      bBoundToParent=true
      bScaleToParent=true
   End Object
   Controls(0)=GUIButton'DialogBackground'

   Begin Object class=GUILabel Name=MutMultiJumpHeader
      Caption=&quot;Multiple Jumping!&quot;
      TextALign=TXTA_Center
      TextColor=(R=230,G=200,B=0,A=255)
      TextFont=&quot;UT2HeaderFont&quot;
      WinWidth=1
      WinLeft=0
      WinTop=0.35
      WinHeight=32
   End Object
   Controls(1)=GUILabel'MutMultiJumpHeader'


   Begin Object class=moNumericEdit Name=MutMultiJumpCount
      WinWidth=0.450000
      WinHeight=0.060000
      WinLeft=0.325
      WinTop=0.43
      Caption=&quot;Number of Jumps&quot;
      Hint=&quot;How many multijumps should players be allowed?&quot;
      CaptionWidth=0.5
      ComponentWidth=0.55
      MinValue=0
      MaxValue=1000000
      // IniOption=&quot;ini:MultiJump.MutMultiJump.MaxMultiJumpCount&quot;
   End Object
   Controls(2)=moNumericEdit'MutMultiJumpCount'

   Begin Object class=moNumericEdit Name=MutMultiJumpBoost
      WinWidth=0.450000
      WinHeight=0.060000
      WinLeft=0.325
      WinTop=0.50
      Caption=&quot;Boost Amount&quot;
      Hint=&quot;How high should each multijump boost the player?&quot;
      CaptionWidth=0.5
      ComponentWidth=0.55
      MinValue=0
      MaxValue=1000000
      // IniOption=&quot;ini:MultiJump.MutMultiJump.MultiJumpBoost&quot;
   End Object
   Controls(3)=moNumericEdit'MutMultiJumpBoost'

   Begin Object Class=GUIButton Name=MutMultiJumpOkButton
      WinLeft=0.40
      WinTop=0.60
      WinWidth=0.20
      WinHeight=0.06
      OnClick=SaveAndClose
      Caption=&quot;OK&quot;
   End Object
   Controls(4)=GUIButton'MutMultiJumpOkButton'

   WinTop=0.300000
   WinLeft=0.200000
   WinWidth=0.600000
   WinHeight=0.470000
}

&lt;/uscript&gt;
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2637</id>
      <timestamp>2002-12-22T17:53:57Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <minor/>
      <comment>added download link</comment>
      <text xml:space="preserve">* See also [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]

==Output ==

http://www.coe.uncc.edu/~danderse/www/mjump-gui.gif
* http://www.coe.uncc.edu/~danderse/www/MultiJump-DMA3.zip

==Source ==

&lt;uscript&gt;
//=============================================================================
// MutMultiJumpConfig - Configuation page for MultiJump
//=============================================================================
class MutMultiJumpConfig extends GUIPage;

function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
   // I could probably bypass this by using the IniOption properties of these controls.

   Super.InitComponent(MyController, MyOwner);

   moNumericEdit(Controls[2]).SetValue(class'MutMultiJump'.default.MaxMultiJumpCount);
   moNumericEdit(Controls[3]).SetValue(class'MutMultiJump'.default.MultiJumpBoost);

   return;
}

function bool SaveAndClose(GUIComponent Sender)
{
   class'MutMultiJump'.default.MaxMultiJumpCount = moNumericEdit(Controls[2]).GetValue();
   class'MutMultiJump'.default.MultiJumpBoost = moNumericEdit(Controls[3]).GetValue();
   class'MutMultiJump'.static.StaticSaveConfig();

   Controller.CloseMenu(false);

   return true;
}

defaultproperties
{
   Begin Object Class=GUIButton name=DialogBackground
      WinWidth=0.70
      WinHeight=0.85
      WinTop=0.0
      WinLeft=0.15
      bAcceptsInput=false
      bNeverFocus=true
      StyleName=&quot;ComboListBox&quot;
      bBoundToParent=true
      bScaleToParent=true
   End Object
   Controls(0)=GUIButton'DialogBackground'

   Begin Object class=GUILabel Name=MutMultiJumpHeader
      Caption=&quot;Multiple Jumping!&quot;
      TextALign=TXTA_Center
      TextColor=(R=230,G=200,B=0,A=255)
      TextFont=&quot;UT2HeaderFont&quot;
      WinWidth=1
      WinLeft=0
      WinTop=0.35
      WinHeight=32
   End Object
   Controls(1)=GUILabel'MutMultiJumpHeader'


   Begin Object class=moNumericEdit Name=MutMultiJumpCount
      WinWidth=0.450000
      WinHeight=0.060000
      WinLeft=0.325
      WinTop=0.43
      Caption=&quot;Number of Jumps&quot;
      Hint=&quot;How many multijumps should players be allowed?&quot;
      CaptionWidth=0.5
      ComponentWidth=0.55
      MinValue=0
      MaxValue=1000000
      // IniOption=&quot;ini:MultiJump.MutMultiJump.MaxMultiJumpCount&quot;
   End Object
   Controls(2)=moNumericEdit'MutMultiJumpCount'

   Begin Object class=moNumericEdit Name=MutMultiJumpBoost
      WinWidth=0.450000
      WinHeight=0.060000
      WinLeft=0.325
      WinTop=0.50
      Caption=&quot;Boost Amount&quot;
      Hint=&quot;How high should each multijump boost the player?&quot;
      CaptionWidth=0.5
      ComponentWidth=0.55
      MinValue=0
      MaxValue=1000000
      // IniOption=&quot;ini:MultiJump.MutMultiJump.MultiJumpBoost&quot;
   End Object
   Controls(3)=moNumericEdit'MutMultiJumpBoost'

   Begin Object Class=GUIButton Name=MutMultiJumpOkButton
      WinLeft=0.40
      WinTop=0.60
      WinWidth=0.20
      WinHeight=0.06
      OnClick=SaveAndClose
      Caption=&quot;OK&quot;
   End Object
   Controls(4)=GUIButton'MutMultiJumpOkButton'

   WinTop=0.300000
   WinLeft=0.200000
   WinWidth=0.600000
   WinHeight=0.470000
}

&lt;/uscript&gt;

* [[Legacy:Category_Custom_Class|Category_Custom_Class]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dma/SpiderMode</title>
    <id>977</id>
    <revision>
      <id>2640</id>
      <timestamp>2003-08-05T03:45:17Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==&lt;b&gt;WARNING: THIS CAN CAUSE MOTION SICKNESS AND VOMITING!&lt;/b&gt; ==

&lt;uscript&gt;
//=============================================================================
// SpiderMode
// Made/Hacked by dma.
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class SpiderMode extends Mutator
   config;

var int TickCount;

function ModifyPlayer(Pawn Other)
{
   local xPawn x;
   local PlayerController PC;

   x = xPawn(Other);
   
   if(x != None) {
      PC=PlayerController(x.Controller);

   if ( NextMutator != None )
		NextMutator.ModifyPlayer(Other);
}


function Tick(float DeltaTime) {
   local controller C;
   local PlayerController PC;

   TickCount++;

   if (TickCount&gt;=3) {
      TickCount=0;
      C=Level.ControllerList;

      while (C != None) {
         PC = PlayerController(C);
         if (PC != None) {
            if (PC.bDuck!=0 &amp;&amp; (PC.IsInState('PlayerWalking') || PC.IsInState('PlayerSwimming'))) {
               PC.GotoState('PlayerSpidering');
            }

            if (PC.bDuck==0 &amp;&amp; PC.IsInState('PlayerSpidering')) {
               PC.EnterStartState();
            }

         }
         C = C.nextController;
      }
   }
}

function PostBeginPlay() {
   TickCount=0;
   Enable('Tick');
   Super.PostBeginPlay();
}

defaultproperties
{
   IconMaterialName=&quot;MutatorArt.nosym&quot;
   ConfigMenuClassName=&quot;&quot;
   GroupName=&quot;Spider&quot;
   FriendlyName=&quot;SpiderMode&quot;
   Description=&quot;Spider State Test&quot;
}

&lt;/uscript&gt;

'''Evolution:''' DMA, here's an alternative way to do this...

&lt;uscript&gt;
class SpiderMut extends Mutator;

var name SpiderState;

function PreBeginPlay()
{
	local class&lt;Pawn&gt; GamePawnClass;

	if (Level.Game!=None)
		GamePawnClass = class&lt;Pawn&gt;( DynamicLoadObject( Level.Game.DefaultPlayerClassName, class'Class' ) );
	GamePawnClass.default.LandMovementState = SpiderState;
}

function ModifyPlayer(Pawn Other)
{
	if (Other.default.LandMovementState!=SpiderState||Other.LandMovementState!=SpiderState)
	{
		Other.LandMovementState=SpiderState;
		Other.default.LandMovementState=SpiderState;
	}
	if (NextMutator!=None)
		NextMutator.ModifyPlayer(Other);
}

DefaultProperties
{
     GroupName=&quot;Spider&quot;
     FriendlyName=&quot;SpiderMan&quot;
     Description=&quot;Spider State Test - Number 2&quot;
	SpiderState=PlayerSpidering
}
&lt;/uscript&gt;

'''El Muerte [TDS]:''' I see that with the first sniplet the GetServerDetails method is repeated, unless you  actualy change this method you do not need to add it into your subclass again. I see this happen a lot.

'''Dma:''' I copied it from a previous mutator ([[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]) I wrote and forgot to remove it. 

'''MinisterFish:''' I've been playing around with this and noticed some bugs such as jumping off something and the controls and views getting stuck and that there are no animations while in the PlayerSpidering state. I may play around with it some more (after school finals) and see what I can come up with.

'''Mosquito:''' I love this idea, I can't wait to compile it into a .u!

'''RegularX:''' There's a spider mute in the xxxpak which is similar to the first example as well, and trust me - there are many, many issues with using this state in normal play.  Camera problems are the start, but there are also mesh problems with moving around a level in a way never really intended.  Players can drop or even get completely stuck into areas.

'''Foxpaw:''' As far as I understand, the PHYS_Spider was not intended to be used for wall crawling like one would suppose. From what I've heard it's just a remnant from a couple of monsters from Unreal 1 that would run along planar walls. Since the plane that you walk on was never intended to change, many problems you may find never arose in the intended application.</text>
    </revision>
    <revision>
      <id>2641</id>
      <timestamp>2003-05-16T04:53:03Z</timestamp>
      <contributor>
        <ip>Dsl092-129-142.chi1.dsl.speakeasy.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==&lt;b&gt;WARNING: THIS CAN CAUSE MOTION SICKNESS AND VOMITING!&lt;/b&gt; ==

&lt;uscript&gt;
//=============================================================================
// SpiderMode
// Made/Hacked by dma.
// http://www.coe.uncc.edu/~danderse/
//=============================================================================
class SpiderMode extends Mutator
   config;

var int TickCount;

function ModifyPlayer(Pawn Other)
{
   local xPawn x;
   local PlayerController PC;

   x = xPawn(Other);
   
   if(x != None) {
      PC=PlayerController(x.Controller);

   if ( NextMutator != None )
		NextMutator.ModifyPlayer(Other);
}


function Tick(float DeltaTime) {
   local controller C;
   local PlayerController PC;

   TickCount++;

   if (TickCount&gt;=3) {
      TickCount=0;
      C=Level.ControllerList;

      while (C != None) {
         PC = PlayerController(C);
         if (PC != None) {
            if (PC.bDuck!=0 &amp;&amp; (PC.IsInState('PlayerWalking') || PC.IsInState('PlayerSwimming'))) {
               PC.GotoState('PlayerSpidering');
            }

            if (PC.bDuck==0 &amp;&amp; PC.IsInState('PlayerSpidering')) {
               PC.EnterStartState();
            }

         }
         C = C.nextController;
      }
   }
}

function PostBeginPlay() {
   TickCount=0;
   Enable('Tick');
   Super.PostBeginPlay();
}

defaultproperties
{
   IconMaterialName=&quot;MutatorArt.nosym&quot;
   ConfigMenuClassName=&quot;&quot;
   GroupName=&quot;Spider&quot;
   FriendlyName=&quot;SpiderMode&quot;
   Description=&quot;Spider State Test&quot;
}

&lt;/uscript&gt;

'''Evolution:''' DMA, here's an alternative way to do this...

&lt;uscript&gt;
class SpiderMut extends Mutator;

var name SpiderState;

function PreBeginPlay()
{
	local class&lt;Pawn&gt; GamePawnClass;

	if (Level.Game!=None)
		GamePawnClass = class&lt;Pawn&gt;( DynamicLoadObject( Level.Game.DefaultPlayerClassName, class'Class' ) );
	GamePawnClass.default.LandMovementState = SpiderState;
}

function ModifyPlayer(Pawn Other)
{
	if (Other.default.LandMovementState!=SpiderState||Other.LandMovementState!=SpiderState)
	{
		Other.LandMovementState=SpiderState;
		Other.default.LandMovementState=SpiderState;
	}
	if (NextMutator!=None)
		NextMutator.ModifyPlayer(Other);
}

DefaultProperties
{
     GroupName=&quot;Spider&quot;
     FriendlyName=&quot;SpiderMan&quot;
     Description=&quot;Spider State Test - Number 2&quot;
	SpiderState=PlayerSpidering
}
&lt;/uscript&gt;

'''El Muerte [TDS]:''' I see that with the first sniplet the GetServerDetails method is repeated, unless you  actualy change this method you do not need to add it into your subclass again. I see this happen a lot.

'''Dma:''' I copied it from a previous mutator ([[Legacy:Dma/MutMultiJump|dma/MutMultiJump]]) I wrote and forgot to remove it. 

'''MinisterFish:''' I've been playing around with this and noticed some bugs such as jumping off something and the controls and views getting stuck and that there are no animations while in the PlayerSpidering state. I may play around with it some more (after school finals) and see what I can come up with.

'''Mosquito:''' I love this idea, I can't wait to compile it into a .u!

'''RegularX:''' There's a spider mute in the xxxpak which is similar to the first example as well, and trust me - there are many, many issues with using this state in normal play.  Camera problems are the start, but there are also mesh problems with moving around a level in a way never really intended.  Players can drop or even get completely stuck into areas.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Do Not Alter Default Packages</title>
    <id>1006</id>
    <revision>
      <id>2706</id>
      <timestamp>2004-10-16T07:51:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Do '''not''' ever recompile or add resources to [[Legacy:Package|package]]s that come in a base install or a bonus pack of any [[Legacy:Unreal Engine|Unreal engine]] game such as [[Legacy:UT|UT]] or [[Legacy:UT2003|UT2003]].

This means:
* don't add textures to the default [[Legacy:Texture Package|texture package]]s
* don't add sounds to the default sound packages
* don't add [[Legacy:Static Mesh|static mesh]]es to the default [[Legacy:Static Mesh Package|static mesh package]]s
* don't modify the files included in the [[Legacy:UnrealScript Source|UnrealScript source]]s and recompile the packages.
* ... and similar things

If you've done any of these (or other similar), '''STOP READING THIS AND REINSTALL THE GAME'''.  Right now. We're serious.

==Why??? ==

Each time a package is compiled, a checksum is generated.  When playing over a network, the packages on the server are compared against the packages on the client &amp;ndash; the idea is to insure that everyone has the same packages and is therefore playing the same game.  Recompiling the stock game packages will create packages with different checksums than what most online servers and clients will expect... and while the game may still run fine, the modified packages will prevent the player from connecting to another server, and prevent clients from connecting to the player.

==But then how do I write new code? ==

Make a new package and [[Legacy:Create A Subclass|Create A Subclass]].

==Related Topics ==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Restoring Modified Files|Restoring Modified Files]]

----

Wiki writers: link to this page whenever you need to warn people of this!

'''El Muerte TDS:''' does it even need text ? it's just a DON'T.

'''Tarquin:''' yeah. but everytime it's explained, it takes up a paragraph or so to explain. Easier to link to this page and put the paragraph or so here.

'''Foxpaw:''' Yes, plus if you just tell people &quot;DON'T,&quot; they'll ask why. Alternatively they may just try it and find out. Eve and Pandora: Don't be like them! :P</text>
    </revision>
    <revision>
      <id>2707</id>
      <timestamp>2003-07-26T16:25:24Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Do '''not''' ever recompile or add resources to [[Legacy:Package|package]]s that come in a base install or a bonus pack of any [[Legacy:Unreal Engine|Unreal engine]] game such as [[Legacy:UT|UT]] or [[Legacy:UT2003|UT2003]].

This means:
* don't add textures to the default [[Legacy:Texture Package|texture package]]s
* don't add sounds to the default sound packages
* don't add [[Legacy:Static Mesh|static mesh]]es to the default [[Legacy:Static Mesh Package|static mesh package]]s
* don't modify the files included in the [[Legacy:UnrealScript Source|UnrealScript source]]s and recompile the packages.
* ... and similar things

If you've done any of these (or other similar), '''STOP READING THIS AND REINSTALL THE GAME'''.  Right now. We're serious.

==Why??? ==

Each time a package is compiled, a checksum is generated.  When playing over a network, the packages on the server are compared against the packages on the client &amp;ndash; the idea is to insure that everyone has the same packages and is therefore playing the same game.  Recompiling the stock game packages will create packages with different checksums than what most online servers and clients will expect... and while the game may still run fine, the modified packages will prevent the player from connecting to another server, and prevent clients from connecting to the player.

==But then how do I write new code? ==

Make a new package and [[Legacy:Create A Subclass|Create A Subclass]].

==Related Topics ==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

----

Wiki writers: link to this page whenever you need to warn people of this!

'''El Muerte TDS:''' does it even need text ? it's just a DON'T.

'''Tarquin:''' yeah. but everytime it's explained, it takes up a paragraph or so to explain. Easier to link to this page and put the paragraph or so here.

'''Foxpaw:''' Yes, plus if you just tell people &quot;DON'T,&quot; they'll ask why. Alternatively they may just try it and find out. Eve and Pandora: Don't be like them! :P</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DocAwk/Links</title>
    <id>1051</id>
    <revision>
      <id>2800</id>
      <timestamp>2005-08-19T19:23:11Z</timestamp>
      <contributor>
        <ip>64-110-209-175.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">====These are mostly links to forum discussions.  But hey, some neat things are goin' on out there...====

==Unreal Ed / Tools==

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=343918 Findable property for KActors in Ued]

[http://www.wotgreal.com/ WOTgreal]

[http://www.ataricommunity.com/forums/showthread.php?threadid=352020 Terragen and Skybox tuts]

[http://wiki.beyondunreal.com/wiki/WUtils additional Operators and Utilities]

==Weapons and Inventory==

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=342417 Thoughts on stationary turrets]

[http://www.ina-community.com/forums/showthread.php?s=17b4e0535f07cce8dc5ad354a514bf7c&amp;threadid=332819 Priming Grenades]

[http://wiki.beyondunreal.com/wiki/Reloading_Weapons Reloading Weapons]

[http://forums.beyondunreal.com/showthread.php?t=111517 More Reloading]

[http://wiki.beyondunreal.com/wiki/Multiammo_Weapons Multi-Ammo Weapons]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=64823 Getting explosives to stick to walls]

[http://www.ina-community.com/forums/showthread.php?s=513aa85442de33e028645a2ee0b89972&amp;threadid=326876 Thoughts on a weapon selector switch]

[http://www.ina-community.com/forums/showthread.php?s=9c5b427dfd0ff6482df33f0ea1cf06d7&amp;threadid=330687 Useable Items]

==Vehicles==

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=343979 Vehicle stuff (2003 vs 2004)]

[http://udn.epicgames.com/Content/SimpleSVehicleExamples SVehicle examples (UDN)]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=64916 Unlocking Vehicles in other game-types]

==Movers and Volumes==

[http://wiki.beyondunreal.com/wiki/Mover_Topics Mover Topics]

[http://sv2.3dbuzz.com/vbforum/onlc_showthread.php?s=&amp;threadid=42379 Multi-floor elevator]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;postid=540540 Multi-floor elev with buttons for each floor]

[http://udn.epicgames.com/Content/MoversTutorial Mover Tutorial (UDN)]

[http://home.comcast.net/~moonshaes/liftandtriggers.html More multi-floor elevator]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58560 Movers &amp;ndash; Discussion about diff move-times for diff keyframes]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=53820 Moving Volumes]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=32717 Lava that fills a pool and causes damage]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=54383 Killing volume without gibbing]

[http://wiki.beyondunreal.com/wiki/Anozireth/IonTrigger Volumes that trigger - IonTrigger]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=48299&amp;highlight=volume Ted's watervolume and spacevolume chat with EDrW]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=64224 More Talk about Issues of Volumes in Volumes]

==Lighting and Texturing:==

[http://wiki.beyondunreal.com/wiki/ScriptedTextures ScriptedTextures]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=55490 Some thoughts on Dynamic Lights and Projectors]

[http://perso.wanadoo.fr/loric23/Tutorial/Skinning/Skins.htm Skinning tut]

[http://perso.wanadoo.fr/loric23/Tutorial/screenshots.htm Thought on screenshots in Unreal]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58338 Brief idea for a triggerable light]

[http://udn.epicgames.com/Content/SpecialLightingFeatures#Coronas Tutorial on Coronas]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=59082 Thoughts on Shadows]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=60356 More thought on Shadows]

[http://wiki.beyondunreal.com/wiki/Sourced_Player_Shadows Sourced Player Shadows]

[http://www.leveldesigner.com/index.php?action=doc&amp;ID=167 Making a Camera to project textures]

[http://wiki.beyondunreal.com/wiki/Ultimate_FlashLight_2k3 Flashlight code 2003]

[http://fraghouse.beyondunreal.com/documents/ambientplayerlight.php Making an Ambient Player-Light]

==Camera and Player-View:==

[http://www.leveldesigner.com/index.php?action=doc&amp;ID=167 Making a Camera to project textures]

[http://wiki.beyondunreal.com/wiki/Wizzie/OnJoinSpectatorCamera Spectator Camera]

[http://udn.epicgames.com/Content/ExampleMapsTriggers ViewShaker settings and other Trigger things]

[http://wiki.beyondunreal.com/wiki/ViewShaker More ViewShaker]

==General Coding==

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=57208 Finding Hit Location]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58453 Thoughts on Forward PlayerStarts]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;postid=487867 Thoughts on locking things]

[http://wiki.beyondunreal.com/wiki/InputKeyMap Input Key Map]

[http://forums.beyondunreal.com/showthread.php?t=128309 UT2Kx and the MS IME]

==HUDs, GUI, and Messaging==

[http://wiki.beyondunreal.com/wiki/Mutator_Config_GUI Mutator Config GUI]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=49189 Thoughts on civilians and ambient creatures]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=59288 Mutator to replace HUD]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=57666 Thoughts on messaging]

[http://wiki.beyondunreal.com/wiki/Wizzie/HUDRadar A Radar system]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=57666 Messages in UT2003]

==GameTypes==

[http://wiki.beyondunreal.com/wiki/SocratesJohnson/Freefall Thoughts on Free-Fall Physics]

[http://wiki.beyondunreal.com/wiki/Stat_Points_System Some thoughts on a Stats system]

[http://wiki.beyondunreal.com/wiki/Wizzie/PawnLeggsRotation Adjusting Bones etc]

[http://wiki.beyondunreal.com/wiki/Wizzie/HUDRadar A Radar system]

[http://wiki.beyondunreal.com/wiki/Karma_Ragdoll Karma animations for damage]

[http://www.psyonix.com/OnslaughtMapTutorial.shtml Onslaught tut]

==Music and Sound==

[http://www.ina-community.com/forums/showthread.php?s=68dd86ce894ad92eabe1a5df3197b255&amp;threadid=354757 Music Triggers vs Action_PlaySound]

==Misc==

[http://sv2.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=55409 Naming your map]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58068 Links to Intro to Unreal tuts]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=54705 Mr.Slackpants' expedited grading for Ued 101]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=60907 xProcMesh and making SMeshes ripple]

[http://www.gamasutra.com/features/20040114/wang_01.shtml Discussion of MS FlightSim 2004's Cloud rendering technique]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=61827 Settings for a nice flame emitter in UT2004]

----

Back to my HomePage -&gt; [[Legacy:Dr.AwkwArD|Dr.AwkwArD]]

'''Tarquin:''' Could you consider moving some of these links to suitable topic or class pages, so other people can easily find them? We're all about sharing here on the UW :D Something like the 

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=343918 Findable property for KActors in Ued] forum post could just be summarized and addedd to the relevant page as information rather than a link.

'''Dr.AwkwArD:''' Sounds reasonable enough.  It'll just be a matter of getting a little time to do it.  There's a lot of info here.  Baby steps... ;)

'''Tarquin:''' of course :) You could add a [[:Category:Legacy To Do]] tag here and ask other wikizens to help :)

'''Dr.AwkwArD:''' Ooooo, delegation.  I like it! :D

'''SuperApe:''' Nice page, DocAwk. :D (xProcMesh tutorial link currently broken.)

'''MythOpus:''' I think it's just the actual forum page that's down.  Wait awhile for it.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2801</id>
      <timestamp>2005-08-19T14:56:13Z</timestamp>
      <contributor>
        <ip>Pool0429.cvx30-bradley.dialup.earthlink.net</ip>
      </contributor>
      <comment>Link broken</comment>
      <text xml:space="preserve">====These are mostly links to forum discussions.  But hey, some neat things are goin' on out there...====

==Unreal Ed / Tools==

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=343918 Findable property for KActors in Ued]

[http://www.wotgreal.com/ WOTgreal]

[http://www.ataricommunity.com/forums/showthread.php?threadid=352020 Terragen and Skybox tuts]

[http://wiki.beyondunreal.com/wiki/WUtils additional Operators and Utilities]

==Weapons and Inventory==

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=342417 Thoughts on stationary turrets]

[http://www.ina-community.com/forums/showthread.php?s=17b4e0535f07cce8dc5ad354a514bf7c&amp;threadid=332819 Priming Grenades]

[http://wiki.beyondunreal.com/wiki/Reloading_Weapons Reloading Weapons]

[http://forums.beyondunreal.com/showthread.php?t=111517 More Reloading]

[http://wiki.beyondunreal.com/wiki/Multiammo_Weapons Multi-Ammo Weapons]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=64823 Getting explosives to stick to walls]

[http://www.ina-community.com/forums/showthread.php?s=513aa85442de33e028645a2ee0b89972&amp;threadid=326876 Thoughts on a weapon selector switch]

[http://www.ina-community.com/forums/showthread.php?s=9c5b427dfd0ff6482df33f0ea1cf06d7&amp;threadid=330687 Useable Items]

==Vehicles==

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=343979 Vehicle stuff (2003 vs 2004)]

[http://udn.epicgames.com/Content/SimpleSVehicleExamples SVehicle examples (UDN)]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=64916 Unlocking Vehicles in other game-types]

==Movers and Volumes==

[http://wiki.beyondunreal.com/wiki/Mover_Topics Mover Topics]

[http://sv2.3dbuzz.com/vbforum/onlc_showthread.php?s=&amp;threadid=42379 Multi-floor elevator]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;postid=540540 Multi-floor elev with buttons for each floor]

[http://udn.epicgames.com/Content/MoversTutorial Mover Tutorial (UDN)]

[http://home.comcast.net/~moonshaes/liftandtriggers.html More multi-floor elevator]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58560 Movers &amp;ndash; Discussion about diff move-times for diff keyframes]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=53820 Moving Volumes]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=32717 Lava that fills a pool and causes damage]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=54383 Killing volume without gibbing]

[http://wiki.beyondunreal.com/wiki/Anozireth/IonTrigger Volumes that trigger - IonTrigger]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=48299&amp;highlight=volume Ted's watervolume and spacevolume chat with EDrW]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=64224 More Talk about Issues of Volumes in Volumes]

==Lighting and Texturing:==

[http://wiki.beyondunreal.com/wiki/ScriptedTextures ScriptedTextures]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=55490 Some thoughts on Dynamic Lights and Projectors]

[http://perso.wanadoo.fr/loric23/Tutorial/Skinning/Skins.htm Skinning tut]

[http://perso.wanadoo.fr/loric23/Tutorial/screenshots.htm Thought on screenshots in Unreal]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58338 Brief idea for a triggerable light]

[http://udn.epicgames.com/Content/SpecialLightingFeatures#Coronas Tutorial on Coronas]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=59082 Thoughts on Shadows]

[http://sv2.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=60356 More thought on Shadows]

[http://wiki.beyondunreal.com/wiki/Sourced_Player_Shadows Sourced Player Shadows]

[http://www.leveldesigner.com/index.php?action=doc&amp;ID=167 Making a Camera to project textures]

[http://wiki.beyondunreal.com/wiki/Ultimate_FlashLight_2k3 Flashlight code 2003]

[http://fraghouse.beyondunreal.com/documents/ambientplayerlight.php Making an Ambient Player-Light]

==Camera and Player-View:==

[http://www.leveldesigner.com/index.php?action=doc&amp;ID=167 Making a Camera to project textures]

[http://wiki.beyondunreal.com/wiki/Wizzie/OnJoinSpectatorCamera Spectator Camera]

[http://udn.epicgames.com/Content/ExampleMapsTriggers ViewShaker settings and other Trigger things]

[http://wiki.beyondunreal.com/wiki/ViewShaker More ViewShaker]

==General Coding==

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=57208 Finding Hit Location]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58453 Thoughts on Forward PlayerStarts]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;postid=487867 Thoughts on locking things]

[http://wiki.beyondunreal.com/wiki/InputKeyMap Input Key Map]

[http://forums.beyondunreal.com/showthread.php?t=128309 UT2Kx and the MS IME]

==HUDs, GUI, and Messaging==

[http://wiki.beyondunreal.com/wiki/Mutator_Config_GUI Mutator Config GUI]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=49189 Thoughts on civilians and ambient creatures]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=59288 Mutator to replace HUD]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=57666 Thoughts on messaging]

[http://wiki.beyondunreal.com/wiki/Wizzie/HUDRadar A Radar system]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=57666 Messages in UT2003]

==GameTypes==

[http://wiki.beyondunreal.com/wiki/SocratesJohnson/Freefall Thoughts on Free-Fall Physics]

[http://wiki.beyondunreal.com/wiki/Stat_Points_System Some thoughts on a Stats system]

[http://wiki.beyondunreal.com/wiki/Wizzie/PawnLeggsRotation Adjusting Bones etc]

[http://wiki.beyondunreal.com/wiki/Wizzie/HUDRadar A Radar system]

[http://wiki.beyondunreal.com/wiki/Karma_Ragdoll Karma animations for damage]

[http://www.psyonix.com/OnslaughtMapTutorial.shtml Onslaught tut]

==Music and Sound==

[http://www.ina-community.com/forums/showthread.php?s=68dd86ce894ad92eabe1a5df3197b255&amp;threadid=354757 Music Triggers vs Action_PlaySound]

==Misc==

[http://sv2.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=55409 Naming your map]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=58068 Links to Intro to Unreal tuts]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=54705 Mr.Slackpants' expedited grading for Ued 101]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=60907 xProcMesh and making SMeshes ripple]

[http://www.gamasutra.com/features/20040114/wang_01.shtml Discussion of MS FlightSim 2004's Cloud rendering technique]

[http://sv3.3dbuzz.com/vbforum/unr_showthread.php?s=&amp;threadid=61827 Settings for a nice flame emitter in UT2004]

----

Back to my HomePage -&gt; [[Legacy:Dr.AwkwArD|Dr.AwkwArD]]

'''Tarquin:''' Could you consider moving some of these links to suitable topic or class pages, so other people can easily find them? We're all about sharing here on the UW :D Something like the 

[http://www.ataricommunity.com/forums/showthread.php?s=53f2ec99160840f166fbcfaa7330b2dd&amp;threadid=343918 Findable property for KActors in Ued] forum post could just be summarized and addedd to the relevant page as information rather than a link.

'''Dr.AwkwArD:''' Sounds reasonable enough.  It'll just be a matter of getting a little time to do it.  There's a lot of info here.  Baby steps... ;)

'''Tarquin:''' of course :) You could add a [[:Category:Legacy To Do]] tag here and ask other wikizens to help :)

'''Dr.AwkwArD:''' Ooooo, delegation.  I like it! :D

'''SuperApe:''' Nice page, DocAwk. :D (xProcMesh tutorial link currently broken.)
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DocAwk/Projects</title>
    <id>1052</id>
    <revision>
      <id>2802</id>
      <timestamp>2004-12-25T10:48:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted; spammer is banned</comment>
      <text xml:space="preserve">==Resources / Scripts==
* '''AdvancedMover (UT2004)''' -&gt; [http://www.atomictrick.com/drawkward/games/resources/ut2004/resources/AdvancedMover2K4.htm AdvancedMover (UT2004)] &lt;br /&gt;Version: 0.96 &lt;br /&gt;Basic Description: A mover with enhanced functionality. (obvious, right?) &lt;br /&gt; &lt;br /&gt;Current Features:
*# Can have 256 keyframes with individual move-times.
*# Move time can be specified for each keyframe.
*# Can specify whether to use individual MoveTimes or a single &quot;global&quot; MoveTime
*# Can jump back to &lt;tt&gt;Key0&lt;/tt&gt; once it reaches the last keyframe and has delayed for its StayOpenTime.  (not just in ConstLoop mode)
*# Can be set to accumulate damage to reach the DamageThreshold
*# Can specify whether the mover begins locked or not
*# Can specify whether or not the mover needs to be unlocked only once (the key is no longer required)
*# Can specify the Key (soon, multiple keys)
*# Can specify the locked and unlocked sounds and their respective volume, pitch, and radius
*# Can choose whether or not a key is needed to &quot;open&quot; and/or &quot;close&quot; a mover when set to TriggerToggle
*# Can be a delay between unlocking and triggering.
*# Can be set to shake the screen at all &quot;states&quot; (except for &quot;moving&quot;)
*# Can shake the screen at each keyframe.
*# Events can be called at each keyframe.
*# Can play sounds at each keyframe, including the ability to change the AmbientSound.
*# In-Editor help. This is a bit hacky, but there are menus that begin with the word &quot;Help_&quot; that contain info about properties that are new to the AdvancedMover class.
: 
: ''Design journal is available on the website''

===Dev Discussion===

====AMACTION_DisableTrigger (partial)====

&lt;uscript&gt;
class AMACTION_DisableTrigger extends ScriptedAMoverAction;


var(Actions) bool            bByTag;    // if true, triggers will be disabled based on the value of their Tag, else Triggers will have to be named individually
var(Actions) array&lt;name&gt;     Tags;
var(Actions) array&lt;triggers&gt; Triggers;
// var(Actions) bool            bLog;

function bool InitActionFor(ScriptedAMoverController C)
{
   // function DisableTrigger(bool bByTag, array&lt;triggers&gt; Triggers, array&lt;name&gt; Tags)
   C.DisableTrigger(bByTag, Triggers, Tags);
   return false;
}

// ...


&lt;/uscript&gt;

====ScriptedAMoverController====

&lt;uscript&gt;
class ScriptedAMoverController extends controller;

// ...

function DisableTrigger(bool bByTag, array&lt;triggers&gt; Triggers, array&lt;name&gt; Tags)
{
   local int i;
   local triggers CheckedTrigger;

   if(bByTag)
   {
      if(bLog)
         log(&quot;Disabling triggers by tag...&quot;);
      if(Tags.Length &gt; 0)
      {
         for(i=0; i &lt; Tags.Length; i++)
         {
            CheckedTrigger = none;  //reset the CheckedTrigger var

            if(bLog)
               log(&quot;Checking for Triggers with tag&quot; @ Tags[i]);

            foreach AllActors(class'Triggers', CheckedTrigger, Tags[i])
            {
               CheckedTrigger.Disable('Trigger');
               CheckedTrigger.Disable('Touch');
               if(bLog)
                  log(&quot;Disabling&quot; @ CheckedTrigger);
            }
            if(bLog)
            {
               if( (i == Tags.Length-1) &amp;&amp; (CheckedTrigger == none) )  //if this is the last iteration and we haven't found a matching trigger+tag
                  warn(&quot;No triggers with that tag found!!&quot;);
            }
         }
      }
      else
      {
         if(bLog)
            warn(&quot;No tags defined!!&quot;);
      }
   }
   else
   {
      if(bLog)
         log(&quot;Disabling triggers by name...&quot;);
      if(Triggers.Length &gt; 0)
      {
         for(i=0; i &lt; Triggers.Length; i++)
         {
            if(bLog)
               log(&quot;Checking for&quot; @ Triggers[i]);
            if( ValidTrigger(Triggers[i]) )
            {
               Triggers[i].Disable('Trigger');
               Triggers[i].Disable('Touch');
               if(bLog)
                  log(&quot;Trigger&quot; @ Triggers[i] @ &quot;disabled&quot;);
            }
            else
            {
               if(bLog)
                  warn(Triggers[i] @ &quot;not found!!&quot;);
            }
         }
      }
      else
      {
         if(bLog)
            warn(&quot;No triggers named!!&quot;);
      }
   }
}

// ...

function bool ValidTrigger(triggers T)
{
   local triggers CheckedTrigger;

   if(bLog)
      log(&quot;Will check for trigger&quot; @ T);
   foreach AllActors( class'Triggers', CheckedTrigger )
   {
      if(bLog)
         log(&quot;CheckedTrigger =&quot; @ CheckedTrigger);
      if(T == CheckedTrigger)
      {
         if(bLog)
            log(T @ &quot;FOUND!!&quot;);
         return true;  // break out of the function and return True idicating that the actor exists
      }
   }
   if(bLog)
      log(&quot;Trigger&quot; @ T @ &quot;not found!!&quot;);
   return false;       // the actor does not exist
}

// ...

&lt;/uscript&gt;

 
* '''AdvancedMover (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/resources/ut2003/resources/AdvancedMover.htm AdvancedMover (UT2003)] &lt;br /&gt; &lt;br /&gt;Basic Description: A mover with enhanced functionality. (obvious, right?)&lt;br /&gt; &lt;br /&gt;Currently on hold while I develop the UT2004 version. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website''
 
* '''LockedTrigger (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/resources/ut2003/resources/LockedTrigger.htm LockedTrigger (UT2003)] &lt;br /&gt; &lt;br /&gt;Basic Description: A Trigger that can require a key to trigger an event. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website''
 
* '''CharacterClassSystem1 (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/projects/ut2003/mods/CharacterClass-Sys1.htm CharacterClassSystem1 (UT2003)] &lt;br /&gt; &lt;br /&gt;Still in the works. &lt;br /&gt; &lt;br /&gt;Basic Description: An inventory-driven Character Class mutator based extensively on code/tut written by EvilDrWong. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website'' 
 

==Maps==
* '''DM-KatahfuTemple (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/projects/ut2003/maps/DM-KatahfuTemple.htm DM-KatahfuTemple (UT2003)] &lt;br /&gt; &lt;br /&gt;Basic Description: Multi-leveled, Egyptian-Themed DeathMatch map. &lt;br /&gt; &lt;br /&gt;Preview Description: Tournament producers have unveiled their latest arena.  This time UT takes you deep into the deserts of Egypt to the ancient Temple of Katahfu. Revived from its millenia of dormancy, this playground of blood will be a grim delight for fans and competitors alike. &lt;br /&gt; &lt;br /&gt;A new version of this map is now being created for UT2004. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website''
 
* '''CTF-BattleCruiser (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/projects/ut2003/maps/CTF-Battlecruiser.htm CTF-BattleCruiser (UT2003)] &lt;br /&gt; &lt;br /&gt;This is barely under weigh.  And, in fact, will mostly be a UT2004 map instead.
 

----

Back to my Personal Page -&gt; [[Legacy:Dr.AwkwArD|Dr.AwkwArD]]</text>
    </revision>
    <revision>
      <id>2803</id>
      <timestamp>2004-12-04T06:48:27Z</timestamp>
      <contributor>
        <ip>67-22-158-106.lmdaca.adelphia.net</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Resources / Scripts==
* '''AdvancedMover (UT2004)''' -&gt; [http://www.atomictrick.com/drawkward/games/resources/ut2004/resources/AdvancedMover2K4.htm AdvancedMover (UT2004)] &lt;br /&gt;Version: 0.96 &lt;br /&gt;Basic Description: A mover with enhanced functionality. (obvious, right?) &lt;br /&gt; &lt;br /&gt;Current Features:
*# Can have 256 keyframes with individual move-times.
*# Move time can be specified for each keyframe.
*# Can specify whether to use individual MoveTimes or a single &quot;global&quot; MoveTime
*# Can jump back to &lt;tt&gt;Key0&lt;/tt&gt; once it reaches the last keyframe and has delayed for its StayOpenTime.  (not just in ConstLoop mode)
*# Can be set to accumulate damage to reach the DamageThreshold
*# Can specify whether the mover begins locked or not
*# Can specify whether or not the mover needs to be unlocked only once (the key is no longer required)
*# Can specify the Key (soon, multiple keys)
*# Can specify the locked and unlocked sounds and their respective volume, pitch, and radius
*# Can choose whether or not a key is needed to &quot;open&quot; and/or &quot;close&quot; a mover when set to TriggerToggle
*# Can be a delay between unlocking and triggering.
*# Can be set to shake the screen at all &quot;states&quot; (except for &quot;moving&quot;)
*# Can shake the screen at each keyframe.
*# Events can be called at each keyframe.
*# Can play sounds at each keyframe, including the ability to change the AmbientSound.
*# In-Editor help. This is a bit hacky, but there are menus that begin with the word &quot;Help_&quot; that contain info about properties that are new to the AdvancedMover class.
: 
: ''Design journal is available on the website''

===Dev Discussion===

====AMACTION_DisableTrigger (partial)====

&lt;uscript&gt;
class AMACTION_DisableTrigger extends ScriptedAMoverAction;


var(Actions) bool            bByTag;    // if true, triggers will be disabled based on the value of their Tag, else Triggers will have to be named individually
var(Actions) array&lt;name&gt;     Tags;
var(Actions) array&lt;triggers&gt; Triggers;
// var(Actions) bool            bLog;

function bool InitActionFor(ScriptedAMoverController C)
{
   // function DisableTrigger(bool bByTag, array&lt;triggers&gt; Triggers, array&lt;name&gt; Tags)
   C.DisableTrigger(bByTag, Triggers, Tags);
   return false;
}

// ...


&lt;/uscript&gt;

====ScriptedAMoverController====

&lt;uscript&gt;
class ScriptedAMoverController extends controller;

// ...

function DisableTrigger(bool bByTag, array&lt;triggers&gt; Triggers, array&lt;name&gt; Tags)
{
   local int i;
   local triggers CheckedTrigger;

   if(bByTag)
   {
      if(bLog)
         log(&quot;Disabling triggers by tag...&quot;);
      if(Tags.Length &gt; 0)
      {
         for(i=0; i &lt; Tags.Length; i++)
         {
            CheckedTrigger = none;  //reset the CheckedTrigger var

            if(bLog)
               log(&quot;Checking for Triggers with tag&quot; @ Tags[i]);

            foreach AllActors(class'Triggers', CheckedTrigger, Tags[i])
            {
               CheckedTrigger.Disable('Trigger');
               CheckedTrigger.Disable('Touch');
               if(bLog)
                  log(&quot;Disabling&quot; @ CheckedTrigger);
            }
            if(bLog)
            {
               if( (i == Tags.Length-1) &amp;&amp; (CheckedTrigger == none) )  //if this is the last iteration and we haven't found a matching trigger+tag
                  warn(&quot;No triggers with that tag found!!&quot;);
            }
         }
      }
      else
      {
         if(bLog)
            warn(&quot;No tags defined!!&quot;);
      }
   }
   else
   {
      if(bLog)
         log(&quot;Disabling triggers by name...&quot;);
      if(Triggers.Length &gt; 0)
      {
         for(i=0; i &lt; Triggers.Length; i++)
         {
            if(bLog)
               log(&quot;Checking for&quot; @ Triggers[i]);
            if( ValidTrigger(Triggers[i]) )
            {
               Triggers[i].Disable('Trigger');
               Triggers[i].Disable('Touch');
               if(bLog)
                  log(&quot;Trigger&quot; @ Triggers[i] @ &quot;disabled&quot;);
            }
            else
            {
               if(bLog)
                  warn(Triggers[i] @ &quot;not found!!&quot;);
            }
         }
      }
      else
      {
         if(bLog)
            warn(&quot;No triggers named!!&quot;);
      }
   }
}

// ...

function bool ValidTrigger(triggers T)
{
   local triggers CheckedTrigger;

   if(bLog)
      log(&quot;Will check for trigger&quot; @ T);
   foreach AllActors( class'Triggers', CheckedTrigger )
   {
      if(bLog)
         log(&quot;CheckedTrigger =&quot; @ CheckedTrigger);
      if(T == CheckedTrigger)
      {
         if(bLog)
            log(T @ &quot;FOUND!!&quot;);
         return true;  // break out of the function and return True idicating that the actor exists
      }
   }
   if(bLog)
      log(&quot;Trigger&quot; @ T @ &quot;not found!!&quot;);
   return false;       // the actor does not exist
}

// ...

&lt;/uscript&gt;

 
* '''AdvancedMover (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/resources/ut2003/resources/AdvancedMover.htm AdvancedMover (UT2003)] &lt;br /&gt; &lt;br /&gt;Basic Description: A mover with enhanced functionality. (obvious, right?)&lt;br /&gt; &lt;br /&gt;Currently on hold while I develop the UT2004 version. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website''
 
* '''LockedTrigger (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/resources/ut2003/resources/LockedTrigger.htm LockedTrigger (UT2003)] &lt;br /&gt; &lt;br /&gt;Basic Description: A Trigger that can require a key to trigger an event. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website''
 
* '''CharacterClassSystem1 (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/projects/ut2003/mods/CharacterClass-Sys1.htm CharacterClassSystem1 (UT2003)] &lt;br /&gt; &lt;br /&gt;Still in the works. &lt;br /&gt; &lt;br /&gt;Basic Description: An inventory-driven Character Class mutator based extensively on code/tut written by EvilDrWong. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website'' 
 

==Maps==
* '''DM-KatahfuTemple (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/projects/ut2003/maps/DM-KatahfuTemple.htm DM-KatahfuTemple (UT2003)] &lt;br /&gt; &lt;br /&gt;Basic Description: Multi-leveled, Egyptian-Themed DeathMatch map. &lt;br /&gt; &lt;br /&gt;Preview Description: Tournament producers have unveiled their latest arena.  This time UT takes you deep into the deserts of Egypt to the ancient Temple of Katahfu. Revived from its millenia of dormancy, this playground of blood will be a grim delight for fans and competitors alike. &lt;br /&gt; &lt;br /&gt;A new version of this map is now being created for UT2004. &lt;br /&gt; &lt;br /&gt;''Design journal is available on the website''
 
* '''CTF-BattleCruiser (UT2003)''' -&gt; [http://www.atomictrick.com/drawkward/games/projects/ut2003/maps/CTF-Battlecruiser.htm CTF-BattleCruiser (UT2003)] &lt;br /&gt; &lt;br /&gt;This is barely under weigh.  And, in fact, will mostly be a UT2004 map instead.
 

----

Back to my Personal Page -&gt; [[Legacy:Dr.AwkwArD|Dr.AwkwArD]]</text>
    </revision>
    <revision>
      <id>2804</id>
      <timestamp>2004-12-25T10:13:15Z</timestamp>
      <contributor>
        <ip>Webmail.union-city.k12.nj.us</ip>
      </contributor>
      <text xml:space="preserve">

   [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU!

'''   Let us introduce [http://first-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://first-page.nm.ru/viagra.htm order viagra online], [http://first-page.nm.ru/cialis.htm cialis]
 Also [http://first-page.nm.ru/phentermine.htm order phentermine online], [http://first-page.nm.ru/xanax.htm buy xanax], [http://first-page.nm.ru/diazepam.htm diazepam online],  [http://first-page.nm.ru/prosac.htm prozac online].

   Buy [http://first-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://first-page.nm.ru/newcar.htm new car] or  [http://first-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''
*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-gift1.boom.ru/ christmas gift basket] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-gift2.boom.ru/ christmas gift] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Domination</title>
    <id>972</id>
    <revision>
      <id>2630</id>
      <timestamp>2004-06-22T07:40:35Z</timestamp>
      <contributor>
        <ip>195.243.94.xxx</ip>
      </contributor>
      <comment>edited number of control points in a map</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; [[Legacy:TeamGamePlus|TeamGamePlus]] &gt;&gt; Domination (Package: BotPack)}}

Domination is a standard Unreal Tournament game type.

Three control points are scattered in a map (technically, any number of control points are allowed, however, it should be in the range of 1-16); a team gains control over a control point by one of its team members touching it. Each team scores continuously according to the number of control points held. The first team to hit the score limit wins.

==Properties ==
; bool bNeutralPoints : 
; bool bDumbDown (config) : Reduce efficiency of bot team AI.
; [[Legacy:ControlPoint|ControlPoint]] ControlPoints[16] : Control point list used for AI. Maps could have more than 16 control points, but bots will only know the first 16 of them.
; int DomScoreEvent : Used to track when to dump out periodic stat information.

==Methods ==
; ClearControl ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : 

==Related Topics ==
* [[Legacy:Mapping For DOM|Mapping for DOM]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2631</id>
      <timestamp>2003-03-20T07:42:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; [[Legacy:TeamGamePlus|TeamGamePlus]] &gt;&gt; Domination (Package: BotPack)}}

Domination is a standard Unreal Tournament game type.

Three or four control points are scattered in a map; a team gains control over a control point by one of its team members touching it. Each team scores continuously according to the number of control points held. The first team to hit the score limit wins.

==Properties ==
; bool bNeutralPoints : 
; bool bDumbDown (config) : Reduce efficiency of bot team AI.
; [[Legacy:ControlPoint|ControlPoint]] ControlPoints[16] : Control point list used for AI. Maps could have more than 16 control points, but bots will only know the first 16 of them.
; int DomScoreEvent : Used to track when to dump out periodic stat information.

==Methods ==
; ClearControl ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : 

==Related Topics ==
* [[Legacy:Mapping For DOM|Mapping for DOM]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DominationPoint</title>
    <id>1077</id>
    <revision>
      <id>2858</id>
      <timestamp>2005-04-09T08:51:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; DominationPoint (Package: UnrealGame)}}

Base class for domination points.

==Properties ==

; byte PrimaryTeam : Number of the primary team.
; bool bControllable : Determines if this domination point can be captured (used for bots).
; [[Legacy:TeamInfo|TeamInfo]] ControllingTeam : Information for the team currently controlling this domination point.
; [[Legacy:Pawn|Pawn]] ControllingPawn : The pawn who last touched the domination point.

==Known subclasses ==
* [[Legacy:XDomPoint|xDomPoint]]

==Related Topics ==
* [[Legacy:Mapping For DDOM|Mapping for DDOM]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2859</id>
      <timestamp>2005-04-09T07:33:09Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; DominationPoint}}

Base class for domination points.

==Properties ==

; byte PrimaryTeam : Number of the primary team.
; bool bControllable : Determines if this domination point can be captured (used for bots).
; TeamInfo ControllingTeam : Information for the team currently controlling this domination point.
; Pawn ControllingPawn : The pawn who last touched the domination point.

==Known subclasses ==

 UnrealGame.DominationPoint
   +-XGame.[[Legacy:XDomPoint|xDomPoint]]

==Related Topics ==
* [[Legacy:Mapping For DDOM|Mapping for DDOM]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Doogle</title>
    <id>964</id>
    <revision>
      <id>2614</id>
      <timestamp>2007-03-15T15:51:21Z</timestamp>
      <contributor>
        <ip>Doogle</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Welcome to the Wiki, Doogle.  :-)  Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:'''  Hi &amp; welcome. :D

Yay! I got a lil bitty here, dunno what to stick in so I'll copy the kind of stuff other people have done like puttin bits about me n stuff in :)

===Mapping stuff ===

Well I've been into mapping for Unreal and Unreal Tournament for about 6 years now, I did a little bit of map making for Thief the Dark Project before that but only got one finished and never released it to the net cos it was just something for myself to play with.  I tend to spend most of my time trying things out instead of making proper maps for the Unreal games, stuff like the random warpzones and random teleporters for UT.

Example maps...

===Unreal Tournament===

http://www.doogle.co.uk/private/rtelep.zip - Randomised teleporter.

http://www.doogle.co.uk/private/warpzonechanger.zip - Warpzones that can be triggered to go to different locations.

===Unreal Tournament 2003/4 ===

http://www.doogle.co.uk/private/teleportandwarpzones.zip - Randomised teleporter and triggered warpzones, the warpzones don't work as well in this version as they did in the orignal UT map above.

The only map I've finished and released is a conversion of CTF-Hydro16 from Unreal Tournament for UT2k3/4. It took me a while to do but I enjoyed the work and love the map.

http://www.doogle.co.uk/private/ctf-hydro16-2k3-dw.zip (UT2k3 version - no terrain)

http://www.doogle.co.uk/private/ctf-hydro16-2k4-dw.zip (UT2k4 version - terrain)

I'm currently working on some deathmatch and ctf maps for my friends and myself to play on our lan, I'm trying to make some really complex movers and cool effects in these maps, which is why I've been visiting the forums so much lately and asking all sorts of daft questions :o)

===Personal info type stuff ===

Well this is where I tell you about what I am. Basically I'm a 29 year old bloke from Sherwood Forest (Thats Robin Hood's home to those who don't know ;) )

I have a full time job fixing laptops, cameras and data projectors in a college, which is great fun.

My hobbies are playing pool, going mountain biking (trials, downhill, street, XC, etc.) Racing my mini moto bike round my mate's field and fiddlin on my computer, plus I also build and repair computers for friends and neighbours in the area :)

===A couple links ===

Here's a couple of links to places I like n go to :)

http://www.dooglesworld.co.uk &amp;ndash; My new personal website, Forum and stuff there along with my photo galleries and eventually my finished maps.

http://www.doogle.co.uk &amp;ndash; My old personal website, slowly being pointed to the new site. My JavaScript games are still found on this site though.

http://www.isketch.net &amp;ndash; A cool web based Pictionary game, draw the object n guess to win :)

===Finished maps ===

==CTF-Hydro16-2k4-dw ==

http://www.doogle.co.uk/private/ctf-hydro16-2k4-dw.zip

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2615</id>
      <timestamp>2006-01-25T23:52:16Z</timestamp>
      <contributor>
        <ip>187.244.adsl.brightview.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Welcome to the Wiki, Doogle.  :-)  Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:'''  Hi &amp; welcome. :D

Yay! I got a lil bitty here, dunno what to stick in so I'll copy the kind of stuff other people have done like puttin bits about me n stuff in :)

===Mapping stuff ===

Well I've been into mapping for Unreal and Unreal Tournament for about 4 years now, I did a little bit of map making for Thief the Dark Project before that but only got one finished and never released it to the net cos it was just something for myself to play with.  So far I've not actually made any finished maps for the Unreal games either, tending to spend most of my time trying things out instead of making a proper map. 

For the past year now I've been working on a conversion of the UT1 map CTF-Hydro16 for UT2k3/4, simply because that's my favourite CTF map for UT1, plus it was a good way to learn some new techniques with the new engine and editor. The basic map is finished now, I added a terrain into the skybox just now (24th Jan'06) and I think it's ready for some testing by other people :)

http://www.doogle.co.uk/private/ctf-hydro16-2k3-dw.zip (UT2k3 version - no terrain)

http://www.doogle.co.uk/private/ctf-hydro16-2k4-dw.zip (UT2k4 version - terrain)

===Personal info type stuff ===

Well this is where I tell you about what I am. Basically I'm a 27 year old bloke from Sherwood Forest (Thats Robin Hood's home to those who don't know ;) )

I have a full time job fixing laptops, cameras and data projectors in a college, which is great fun.

My hobbies are playing pool, going mountain biking (trials, downhill, street, XC, etc.) Racing my mini moto bike round my mate's field and fiddlin on my computer, plus I also build and repair computers for friends and neighbours in the area :)

===A couple links ===

Here's a couple of links to places I like n go to :)

http://www.doogle.co.uk &amp;ndash; My personal website, not that I like to plug it at every opportunity :p

http://www.isketch.net &amp;ndash; A cool web based Pictionary game, draw the object n guess to win :)

===Test version of CTF-Hydro16-2k4-dw ===

http://www.doogle.co.uk/private/ctf-hydro16-2k4-dw.zip

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Door</title>
    <id>991</id>
    <revision>
      <id>2674</id>
      <timestamp>2007-07-27T14:00:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>added door icon</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; Door}}

[[Image:Legacy_UT2004.S_Door.png|right|Door icon]]

A node in a bot path network that's blocked or unblocked depending on the state of a mover.  In other words, a door.

See also [[udn2:NavigationAI|UDN: NavigationAI]].

==Properties==
; name DoorTag : [[Legacy:Tag|Tag]] of the [[Legacy:Mover|Mover]] associated with this Door path node.  The mover's state (open or closed) determines whether the door can be passed by bots or not.&lt;br /&gt;You can't use multiple movers with the same tag and individual Door actors &amp;ndash; UnrealEd will complain that the the mover specification via DoorTag is ambiguous, and bots won't use all but the first door.&lt;br /&gt;If you want to use several movers with a single Door actor, for example a double door, UnrealEd also complains. However it appears to work in the case that the door is triggered externally, ie bots don't need to do anything to open the door. Other cases not tested.

; name DoorTrigger : Tag of an [[Legacy:Actor|Actor]] associated with this door.  When the door is closed and bots want to pass, they will approach this actor. Usually this will be a [[Legacy:Trigger|Trigger]] that opens the door. But one thing to watch out for is if the trigger is behind a wall or in some other place in the map. Since the trigger isn't a part of the path network system, the bot will go in a straight line towards the actor and fail to reach it. To solve this, place a pathnode where the trigger is, and set its tag (and not the trigger's) to the same as DoorTrigger. This will work if the bot only have to touch the trigger. Only problem is that if the bot finds something it wants when moving towards the trigger, it will &quot;forget&quot; about it and do something else.

; bool bInitiallyClosed : Specifies whether the door is closed in the mover's default state.

; bool bBlockedWhenClosed : Specifies whether the path through this door is completely blocked when the door is closed.  Bots won't even attempt to open the door if this property is set to True.

==Usage==

Add a Door actor in the area of the [[Legacy:Mover|Mover]] that acts as a door (usually in the middle of the [[Legacy:Static Mesh|static mesh]] used for it, but low enough to touch the floor).

Movers also have a property bAutoDoor which automatically places an AutoDoor actor, which may or may not work out.  You can give it a try and then manually move the AutoDoor actor to the correct position if UnrealEd didn't place it well.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Mover|Mover]]
* [[Legacy:Trigger|Trigger]]

==Discussion==

'''Mychaeel:''' About this &quot;bots will go a straight line to the trigger since it's not path of the navigation network&quot; &amp;ndash; my experience with bots navigating to non-NavigationPoint actors is that they navigate using the path network to the closest NavigationPoint, ''then'' go a straight line to the target actor; but they ''don't'' try to directly go a straight line from where they're standing (the other side of a map, for instance) to the target actor.  (Jailbreak 2003's bots go to triggers, for instance, but do use the path network for that.)

'''Smattbac:''' My bad, the do use the navigation network to get to the trigger, but when I tested it again now they turned around when they came to the closest pathnode to the trigger, and didn't touch the trigger.

I had the DoorTrigger set to a Pickup too once, and it was then when the bots tried to go in a straight line..</text>
    </revision>
    <revision>
      <id>2675</id>
      <timestamp>2005-12-01T05:18:06Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; Door}}

A node in a bot path network that's blocked or unblocked depending on the state of a mover.  In other words, a door.

See also [[udn2:NavigationAI|UDN: NavigationAI]].

==Properties==
; name DoorTag : 
[[Legacy:Tag|Tag]] of the [[Legacy:Mover|Mover]] associated with this Door path node.  The mover's state (open or closed) determines whether the door can be passed by bots or not.  

You can't use multiple movers with the same tag and individual Door actors &amp;ndash; UnrealEd will complain that the the mover specification via DoorTag is ambiguous, and bots won't use all but the first door. 

If you want to use several movers with a single Door actor, for example a double door, UnrealEd also complains. However it appears to work in the case that the door is triggered externally, ie bots don't need to do anything to open the door. Other cases not tested.


; name DoorTrigger : Tag of an [[Legacy:Actor|Actor]] associated with this door.  When the door is closed and bots want to pass, they will approach this actor. Usually this will be a [[Legacy:Trigger|Trigger]] that opens the door. But one thing to watch out for is if the trigger is behind a wall or in some other place in the map. Since the trigger isn't a part of the path network system, the bot will go in a straight line towards the actor and fail to reach it. To solve this, place a pathnode where the trigger is, and set its tag (and not the trigger's) to the same as DoorTrigger. This will work if the bot only have to touch the trigger. Only problem is that if the bot finds something it wants when moving towards the trigger, it will &quot;forget&quot; about it and do something else.

; bool bInitiallyClosed : Specifies whether the door is closed in the mover's default state.

; bool bBlockedWhenClosed : Specifies whether the path through this door is completely blocked when the door is closed.  Bots won't even attempt to open the door if this property is set to True.

==Usage==

Add a Door actor in the area of the [[Legacy:Mover|Mover]] that acts as a door (usually in the middle of the [[Legacy:Static Mesh|static mesh]] used for it, but low enough to touch the floor).

Movers also have a property bAutoDoor which automatically places an [[Legacy:AutoDoor|AutoDoor]] actor, which may or may not work out.  You can give it a try and then manually move the AutoDoor actor to the correct position if UnrealEd didn't place it well.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Mover|Mover]]
* [[Legacy:Trigger|Trigger]]

==Discussion==

'''Mychaeel:''' About this &quot;bots will go a straight line to the trigger since it's not path of the navigation network&quot; &amp;ndash; my experience with bots navigating to non-NavigationPoint actors is that they navigate using the path network to the closest NavigationPoint, ''then'' go a straight line to the target actor; but they ''don't'' try to directly go a straight line from where they're standing (the other side of a map, for instance) to the target actor.  (Jailbreak 2003's bots go to triggers, for instance, but do use the path network for that.)

'''Smattbac:''' My bad, the do use the navigation network to get to the trigger, but when I tested it again now they turned around when they came to the closest pathnode to the trigger, and didn't touch the trigger.

I had the DoorTrigger set to a Pickup too once, and it was then when the bots tried to go in a straight line..</text>
    </revision>
    <revision>
      <id>2676</id>
      <timestamp>2007-07-27T13:35:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; Door}}

A node in a bot path network that's blocked or unblocked depending on the state of a mover.  In other words, a door.

See also [[udn2:NavigationAI|UDN: NavigationAI]].

==Properties==
; name DoorTag : [[Legacy:Tag|Tag]] of the [[Legacy:Mover|Mover]] associated with this Door path node.  The mover's state (open or closed) determines whether the door can be passed by bots or not.&lt;br /&gt;You can't use multiple movers with the same tag and individual Door actors &amp;ndash; UnrealEd will complain that the the mover specification via DoorTag is ambiguous, and bots won't use all but the first door.&lt;br /&gt;If you want to use several movers with a single Door actor, for example a double door, UnrealEd also complains. However it appears to work in the case that the door is triggered externally, ie bots don't need to do anything to open the door. Other cases not tested.

; name DoorTrigger : Tag of an [[Legacy:Actor|Actor]] associated with this door.  When the door is closed and bots want to pass, they will approach this actor. Usually this will be a [[Legacy:Trigger|Trigger]] that opens the door. But one thing to watch out for is if the trigger is behind a wall or in some other place in the map. Since the trigger isn't a part of the path network system, the bot will go in a straight line towards the actor and fail to reach it. To solve this, place a pathnode where the trigger is, and set its tag (and not the trigger's) to the same as DoorTrigger. This will work if the bot only have to touch the trigger. Only problem is that if the bot finds something it wants when moving towards the trigger, it will &quot;forget&quot; about it and do something else.

; bool bInitiallyClosed : Specifies whether the door is closed in the mover's default state.

; bool bBlockedWhenClosed : Specifies whether the path through this door is completely blocked when the door is closed.  Bots won't even attempt to open the door if this property is set to True.

==Usage==

Add a Door actor in the area of the [[Legacy:Mover|Mover]] that acts as a door (usually in the middle of the [[Legacy:Static Mesh|static mesh]] used for it, but low enough to touch the floor).

Movers also have a property bAutoDoor which automatically places an AutoDoor actor, which may or may not work out.  You can give it a try and then manually move the AutoDoor actor to the correct position if UnrealEd didn't place it well.

==Related Topics==
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:Mover|Mover]]
* [[Legacy:Trigger|Trigger]]

==Discussion==

'''Mychaeel:''' About this &quot;bots will go a straight line to the trigger since it's not path of the navigation network&quot; &amp;ndash; my experience with bots navigating to non-NavigationPoint actors is that they navigate using the path network to the closest NavigationPoint, ''then'' go a straight line to the target actor; but they ''don't'' try to directly go a straight line from where they're standing (the other side of a map, for instance) to the target actor.  (Jailbreak 2003's bots go to triggers, for instance, but do use the path network for that.)

'''Smattbac:''' My bad, the do use the navigation network to get to the trigger, but when I tested it again now they turned around when they came to the closest pathnode to the trigger, and didn't touch the trigger.

I had the DoorTrigger set to a Pickup too once, and it was then when the bots tried to go in a straight line..</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Doors With Triggers</title>
    <id>1044</id>
    <revision>
      <id>2784</id>
      <timestamp>2007-01-31T04:08:54Z</timestamp>
      <contributor>
        <ip>Abdlwibas01-pool2-a168.abdlwi.tds.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Opening/Closing Doors===

====Make the mover====

Add a static mover and then set it's keyframes. Like it moving up/down or side/side).

====Set the Triggers====

Then add triggers on both sides. Have the mover trigger toggled and then set the tag of the trigger to a unique name.

Then set the trigger's event to the name of the door mover (it's event-tag property).

Then set the mover's event to the tag of the trigger.

====Polish/Finish====

Add sounds to the door and your ready to go! :eek:</text>
    </revision>
    <revision>
      <id>2785</id>
      <timestamp>2004-12-25T11:11:08Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*restored</comment>
      <text xml:space="preserve">For a door (triggeropentimed) with two triggers on each side, you just need two liftexits (no liftcenter) on each side and it must be the only connection between the two rooms (the blue line, reachspec?) . With the lifttags set to the mover's tag, and a triggertag for each liftexit (set to the nearest trigger's tag) .</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dopenose</title>
    <id>1075</id>
    <revision>
      <id>2854</id>
      <timestamp>2005-09-25T17:07:16Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">{|

|-
|Name:
|Ethan 
|-
|Alt Handle:
|Ether 
|-
|Location:
|Canada 
|-
|Links:
|[http://sourcestudio.no-ip.org Online portfolio] 
|-
|Current Projects
|

*UnrealScript 
**Project GEIST: 3rd Person Action; Wallrunning, Swords and backflips (ala Gunz: The Duel) 
**Drytown: Sidescrolling western; Involves Cowboys that are insects. (Sunset Riders on Crack)
*C#
**EtherEdit: Notepad replacement
**(Unnamed): Time management/offline blog software
 
|}

I'm a C++ programmer that just recently fell in love with the C# language. I'm trying to balance my time between C# and UnrealScript, but Unreal just keeps winning ;)

I first started coding UnrealScript a little while ago and I haven't stopped; I can't quite remember the exact timeframe but its possibly around late 2004/early 2005. 

I just picked up my own copy of Unreal Tournament 2004 last week.

====Mapping====

On the other hand, I've made possibly hundreds of maps for:
*Quake 1 &amp; 3 
**Deathmatch
**Single player
**TeamFortress
**RocketArena
*Half-Life 1 &amp; 2 
**Single Player
**Counter-Strike
**Day of Defeat
**Deathmatch Classic (but one can argue thats just Q1 maps :P)
*UnrealTournament 2004
**Mostly small 1-ON-1 Deathmatch
**Sometimes small 2-6 player Deathmatch
**Project GEIST (A game team I'm coding for)
**And DryTown (Another game team I'm coding for)

Even though I'm a closet artist and I've been making maps for nearly a decade, I never make my own textures or models because while I can design and 'texture' a fun and decent looking level, I can't actually make textures or model to save my life :S

====Tutorial====

I'm planning to write a tutorial on this wiki about creating a sidescrolling type game in UnrealScript, once I organize my code from Drytown.

====Comments====

'''MythOpus:''' Welcome To The Wiki :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2855</id>
      <timestamp>2005-09-25T10:54:41Z</timestamp>
      <contributor>
        <ip>Dopenose</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{|

|-
|Name:
|Ethan 
|-
|Alt Handle:
|Ether 
|-
|Location:
|Canada 
|-
|Links:
|[http://sourcestudio.no-ip.org Online portfolio] 
|-
|Current Projects
|

*UnrealScript 
**Project GEIST: 3rd Person Action; Wallrunning, Swords and backflips (ala Gunz: The Duel) 
**Drytown: Sidescrolling western; Involves Cowboys that are insects. (Sunset Riders on Crack)
*C#
**EtherEdit: Notepad replacement
**(Unnamed): Time management/offline blog software
 
|}

I'm a C++ programmer that just recently fell in love with the C# language. I'm trying to balance my time between C# and UnrealScript, but Unreal just keeps winning ;)

I first started coding UnrealScript a little while ago and I haven't stopped; I can't quite remember the exact timeframe but its possibly around late 2004/early 2005. 

I just picked up my own copy of Unreal Tournament 2004 last week.

====Mapping====

On the other hand, I've made possibly hundreds of maps for:
*Quake 1 &amp; 3 
**Deathmatch
**Single player
**TeamFortress
**RocketArena
*Half-Life 1 &amp; 2 
**Single Player
**Counter-Strike
**Day of Defeat
**Deathmatch Classic (but one can argue thats just Q1 maps :P)
*UnrealTournament 2004
**Mostly small 1-ON-1 Deathmatch
**Sometimes small 2-6 player Deathmatch
**Project GEIST (A game team I'm coding for)
**And DryTown (Another game team I'm coding for)

Even though I'm a closet artist and I've been making maps for nearly a decade, I never make my own textures or models because while I can design and 'texture' a fun and decent looking level, I can't actually make textures or model to save my life :S

====Tutorial====

I'm planning to write a tutorial on this wiki about creating a sidescrolling type game in UnrealScript, once I organize my code from Drytown.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DoubleMetaPhone</title>
    <id>1065</id>
    <revision>
      <id>2833</id>
      <timestamp>2004-08-19T13:15:28Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This document implements a &quot;sounds like&quot; algorithm developed by Lawrence Philips which he published in the June, 2000 issue of [http://www.cuj.com/documents/s=8038/cuj0006philips/ C/C++ Users Journal.]

Double Metaphone is an improved version of Philips' original Metaphone algorithm.

The UnrealScript implementation has been adapted from Stephen Woodbridge's [http://swoodbridge.com/DoubleMetaPhone/ PHP implementation] by [[Legacy:El Muerte|El Muerte]]. 

''Note:'' Because of the size of the algorithm there might be errors in it.

==The algorithm==

&lt;uscript&gt;
/**
	Returns the double metaphone value of in.
	The array always contains two values.
*/
static final function array&lt;string&gt; DoubleMetaPhone(coerce string in, optional int mlen)
{
	local array&lt;string&gt; res;
	local string prim, sec, tmp;
	local int cur, last, slen;

	if (mlen == 0) mlen = 4;
 	slen = Len(in);
 	last = slen-1;
 	in = caps(in$&quot;     &quot;);
	// skip this at beginning of word
	switch (Left(in, 2))
	{
		case &quot;GN&quot;:
		case &quot;KN&quot;:
		case &quot;PN&quot;:
		case &quot;WR&quot;:
		case &quot;PS&quot;:
			cur++;
	}
 	// Initial 'X' is pronounced 'Z' e.g. 'Xavier'
 	if (Left(in, 1) == &quot;X&quot;)
 	{
 		prim $= &quot;S&quot;; // 'Z' maps to 'S'
 		sec  $= &quot;S&quot;;
 		cur++;
 	}
 	// main loop
 	while (len(prim) &lt; mlen || len(sec) &lt; mlen)
	{
		if (cur &gt;= slen) break;
		switch (mid(in, cur, 1))
		{
			case &quot;A&quot;:
			case &quot;E&quot;:
			case &quot;I&quot;:
			case &quot;O&quot;:
			case &quot;U&quot;:
			case &quot;Y&quot;:
				if (cur == 0) // all init vowels now map to 'A'
				{
					prim $= &quot;A&quot;;
					sec	 $= &quot;A&quot;;
				}
				cur++;
				break;

			case &quot;B&quot;: // '-mb', e.g. &quot;dumb&quot;, already skipped over ...
				prim $= &quot;P&quot;;
				sec  $= &quot;P&quot;;
				if (mid(in, cur+1, 1) == &quot;B&quot;) cur += 2;
				else cur++;
				break;

			case &quot;Ç&quot;:
				prim $= &quot;S&quot;;
				sec  $= &quot;S&quot;;
				cur++;
				break;

			case &quot;C&quot;: // various gremanic
				if ((cur &gt; 1)
					&amp;&amp; (!is_vowel(in, cur-2))
					&amp;&amp; (mid(in, cur - 1, 3) == &quot;ACH&quot;)
					&amp;&amp; ((mid(in, cur + 2, 1) != &quot;I&quot;)
						&amp;&amp; ((mid(in, cur + 2, 1) != &quot;E&quot;)
							|| smid(in, cur - 2, 6, tmp) == &quot;BACHER&quot;)
							|| tmp == &quot;MACHER&quot;))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

				// special case 'caesar'
				if ((cur == 0) &amp;&amp; (mid(in, cur, 6) == &quot;CAESAR&quot;))
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
					cur += 2;
					break;
				}

				// italian 'chianti'
				if (mid(in, cur, 4) == &quot;CHIA&quot;)
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

		  		if (mid(in, cur, 2) == &quot;CH&quot;)
		  		{
					// find 'michael'
					if ((cur &gt; 0) &amp;&amp; (mid(in, cur, 4) == &quot;CHAE&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;X&quot;;
						cur += 2;
						break;
					}

					// greek roots e.g. 'chemistry', 'chorus'
					if ((cur == 0)
 						&amp;&amp; (smid(in, cur+1, 5, tmp) == &quot;HARAC&quot;
 							|| tmp == &quot;HARIS&quot;)
						|| (smid(in, cur+1, 3, tmp) == &quot;HOR&quot;
							|| tmp == &quot;HYM&quot;
							|| tmp == &quot;HIA&quot;
							|| tmp == &quot;HEM&quot;)
						&amp;&amp; (mid(in, 0, 5) != &quot;CHORE&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
						cur += 2;
						break;
					}

					// germanic, greek, or otherwise 'ch' for 'kh' sound
					if ((	(smid(in, 0, 4, tmp) == &quot;VAN &quot;)
							|| (tmp == &quot;VON &quot;)
							|| (tmp == &quot;SCH&quot;)
						)
						// 'architect' but not 'arch', orchestra', 'orchid'
						|| (	(smid(in, cur-2, 6, tmp) == &quot;ORCHES&quot;)
								|| (tmp == &quot;ARCHIT&quot;)
								|| (tmp == &quot;ORCHID&quot;)
							)
						|| (InStr(&quot;TS&quot;, Mid(in, cur+2, 1)) &gt; -1)
						|| (
							((InStr(&quot;AOUE&quot;, Mid(in, cur-1, 1)) &gt; -1)
					 			|| (cur == 0)
							)
							// e.g. 'wachtler', 'weschsler', but not 'tichner'
							&amp;&amp; (InStr(&quot;LRNMBHFVW&quot;, Mid(in, cur+2, 1)) &gt; -1))
						)
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
					}
					else {
						if (cur &gt; 0)
						{
							if (mid(in, 0, 2) == &quot;MC&quot;)
							{
								// e.g. 'McHugh'
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							else {
								prim $= &quot;X&quot;;
								sec  $= &quot;K&quot;;
							}
						}
						else {
							prim $= &quot;X&quot;;
							sec  $= &quot;X&quot;;
						}
					}
					cur += 2;
					break;
				}

				// e.g. 'czerny'
				if (mid(in, cur, 2) == &quot;CZ&quot;
					&amp;&amp; mid(in, cur-2, 4) != &quot;WICZ&quot;)
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;X&quot;;
					cur += 2;
					break;
				}

				// e.g. 'focaccia'
				if (mid(in, cur + 1, 3) == &quot;CIA&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				// double 'C', but not McClellan'
				if (mid(in, cur, 2) == &quot;CC&quot;
						&amp;&amp; !((cur == 1)
							&amp;&amp; (mid(in, 0, 1) == &quot;M&quot;)))
				{
					// 'bellocchio' but not 'bacchus'
					if ((InStr(&quot;IEH&quot;, mid(in, cur + 2, 1)) &gt; -1)
						&amp;&amp; (mid(in, cur + 2, 2) != &quot;HU&quot;))
					{
			  			// 'accident', 'accede', 'succeed'
						if (((cur == 1)
							&amp;&amp; (mid(in, cur - 1, 1) == &quot;A&quot;))
							|| (smid(in, cur-1, 5, tmp) == &quot;UCCEE&quot;)
							|| (tmp == &quot;UCCES&quot;))
						{
							prim $= &quot;KS&quot;;
							sec  $= &quot;KS&quot;;
							// 'bacci', 'bertucci', other italian
						}
						else {
							prim $= &quot;X&quot;;
							sec  $= &quot;X&quot;;
						}
						cur += 3;
						break;
					}
					else {
						// Pierce's rule
						prim $= &quot;K&quot;;
						sec $= &quot;K&quot;;
						cur += 2;
						break;
					}
				}

				if ((smid(in, cur, 2, tmp) == &quot;CK&quot;)
					|| (tmp == &quot;CG&quot;)
					|| (tmp == &quot;CQ&quot;))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

				if ((smid(in, cur, 2, tmp) == &quot;CI&quot;)
					|| (tmp == &quot;CE&quot;)
					|| (tmp == &quot;CY&quot;))
				{
					// italian vs. english
					if ((smid(in, cur, 3, tmp) == &quot;CIO&quot;)
						|| (tmp == &quot;CIE&quot;)
						|| (tmp == &quot;CIA&quot;))
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;X&quot;;
					}
					else {
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					cur += 2;
					break;
				}

				// else
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;

				// name sent in 'mac caffrey', 'mac gregor'
				if ((smid(in, cur+1, 2, tmp) == &quot; C&quot;)
					|| (tmp == &quot; Q&quot;)
					|| (tmp == &quot; G&quot;))
				{
					cur += 3;
				}
				else {
					if ((InStr(&quot;CKQ&quot;, mid(in, cur + 1, 1)) &gt; -1)
						&amp;&amp; !((smid(in, cur+1, 2, tmp) == &quot;CE&quot;)
							|| (tmp == &quot;CI&quot;))
						)
					{
						cur += 2;
					}
					else {
						cur++;
					}
				}
				break;

			case &quot;D&quot;:
				if (mid(in, cur, 2) == &quot;DG&quot;)
				{
					if (InStr(&quot;IEY&quot;, mid(in, cur + 2, 1)) &gt; -1)
					{
						// e.g. 'edge'
						prim $= &quot;J&quot;;
						sec  $= &quot;J&quot;;
						cur += 3;
						break;
					}
					else {
						// e.g. 'edgar'
						prim $= &quot;TK&quot;;
						sec  $= &quot;TK&quot;;
						cur += 2;
						break;
					}
				}

				if ((smid(in, cur, 2, tmp) == &quot;DT&quot;)
					|| (tmp == &quot;DD&quot;))
				{
					prim $= &quot;T&quot;;
					sec  $= &quot;T&quot;;
					cur += 2;
					break;
				}

				// else
				prim $= &quot;T&quot;;
				sec  $= &quot;T&quot;;
				cur++;
				break;

			case &quot;F&quot;:
				if (mid(in, cur + 1, 1) == &quot;F&quot;) cur += 2;
				else cur++;
				prim $= &quot;F&quot;;
				sec  $= &quot;F&quot;;
				break;

			// TODO: optimize
			case &quot;G&quot;:
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					if ((cur &gt; 0) &amp;&amp; !is_vowel(in, cur-1))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
						cur += 2;
						break;
					}

					if (cur &lt; 3)
					{
						// 'ghislane', 'ghiradelli'
						if (cur == 0)
						{
							if (mid(in, cur + 2, 1) == &quot;I&quot;)
							{
								prim $= &quot;J&quot;;
								sec  $= &quot;J&quot;;
							}
							else {
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							cur += 2;
							break;
						}
					}

					// Parker's rule (with some further refinements) - e.g. 'hugh'
					if (((cur &gt; 1) &amp;&amp; (InStr(&quot;BHD&quot;, mid(in, cur - 2, 1)) &gt; -1))
						// e.g. 'bough'
						|| ((cur &gt; 2) &amp;&amp; (InStr(&quot;BHD&quot;, mid(in, cur - 3, 1)) &gt; -1))
						// e.g. 'broughton'
						|| ((cur &gt; 3) &amp;&amp; (InStr(&quot;BH&quot;, mid(in, cur - 4, 1)) &gt; -1)))
					{
						cur += 2;
						break;
					}
					else {
						// e.g. 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough'
						if ((cur &gt; 2)
							&amp;&amp; (Mid(in, cur - 1, 1) == &quot;U&quot;)
							&amp;&amp; (InStr(&quot;CGLRT&quot;, mid(in, cur - 3, 1)) &gt; -1))
						{
							prim $= &quot;F&quot;;
							sec  $= &quot;F&quot;;
						}
						else {
							if ((cur &gt; 0) &amp;&amp; mid(in, cur - 1, 1) != &quot;I&quot;)
							{
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							cur += 2;
							break;
						}
					}
				}

				if (mid(in, cur + 1, 1) == &quot;N&quot;)
				{
					if ((cur == 1) &amp;&amp; is_vowel(in, 0) &amp;&amp; !Slavo_Germanic(in))
					{
						prim $= &quot;KN&quot;;
						sec  $= &quot;N&quot;;
					}
					else {
						// not e.g. 'cagney'
						if ((mid(in, cur + 2, 2) != &quot;EY&quot;)
							&amp;&amp; (mid(in, cur + 1) != &quot;Y&quot;)
							&amp;&amp; !Slavo_Germanic(in))
						{
							prim $= &quot;N&quot;;
							sec  $= &quot;KN&quot;;
						}
						else {
							prim $= &quot;KN&quot;;
							sec  $= &quot;KN&quot;;
						}
					}
					cur += 2;
					break;
				}

				// 'tagliaro'
				if ((mid(in, cur + 1, 2) == &quot;LI&quot;) &amp;&amp; !Slavo_Germanic(in))
				{
					prim $= &quot;KL&quot;;
					sec  $= &quot;L&quot;;
					cur += 2;
					break;
				}

				// -ges-, -gep-, -gel- at beginning
				if ((cur == 0)
					&amp;&amp; ((mid(in, cur + 1, 1) == &quot;Y&quot;)
						|| ((smid(in, cur + 1, 2, tmp) == &quot;ES&quot;)
							|| (tmp == &quot;EP&quot;)
							|| (tmp == &quot;EB&quot;)
							|| (tmp == &quot;EL&quot;)
							|| (tmp == &quot;EY&quot;)
							|| (tmp == &quot;IB&quot;)
							|| (tmp == &quot;IL&quot;)
							|| (tmp == &quot;IN&quot;)
							|| (tmp == &quot;IE&quot;)
							|| (tmp == &quot;EI&quot;)
							|| (tmp == &quot;ER&quot;))
						)
					)
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}

				// -ger-, -gy-
				if (((mid(in, cur + 1, 2) == &quot;ER&quot;)
					|| (mid(in, cur + 1, 1) == &quot;Y&quot;))
					&amp;&amp; !(smid(in, 0, 6, tmp) == &quot;DANGER&quot;
						|| tmp == &quot;RANGER&quot;
						|| tmp == &quot;MANGER&quot;
					)
					&amp;&amp; (InStr(&quot;EI&quot;, mid(in, cur-1, 1)) == -1)
					&amp;&amp; !(smid(in, cur-1, 3, tmp) == &quot;RGY&quot;
						|| tmp == &quot;OGY&quot;
					))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}

				// italian e.g. 'biaggi'
				if ((InStr(&quot;EIY&quot;, mid(in, cur + 1, 1)) &gt; -1)
					|| smid(in, cur-1, 4, tmp) == &quot;AGGI&quot;
					|| tmp == &quot;OGGI&quot;)
				{
					// obvious germanic
					if (((smid(in, 0, 4, tmp) == &quot;VAN &quot;
							|| tmp == &quot;VON &quot;)
						|| (mid(in, 0, 3) == &quot;SCH&quot;))
						|| (mid(in, cur + 1, 2) == &quot;ET&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
					}
					else {
						// always soft if french ending
						if (mid(in, cur + 1, 4) == &quot;IER &quot;)
						{
							prim $= &quot;J&quot;;
							sec  $= &quot;J&quot;;
						}
						else {
							prim $= &quot;J&quot;;
							sec  $= &quot;K&quot;;
						}
					}
					cur += 2;
					break;
				}

				if (mid(in, cur +1, 1) == &quot;G&quot;) cur += 2;
				else cur++;

				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;H&quot;:
				// only keep if first &amp; before vowel or btw. 2 vowels
				if (((cur == 0) || is_vowel(in, cur - 1)) &amp;&amp; is_vowel(in, cur + 1))
				{
					prim $= &quot;H&quot;;
					sec  $= &quot;H&quot;;
					cur += 2;
				}
				else cur++;
				break;

   			case &quot;J&quot;:
				// obvious spanish, 'jose', 'san jacinto'
				if ((mid(in, cur, 4) == &quot;JOSE&quot;)
					|| (mid(in, 0, 4) == &quot;SAN &quot;))
				{
					if (((cur == 0) &amp;&amp; (mid(in, cur + 4, 1) == &quot; &quot;))
						|| (mid(in, 0, 4) == &quot;SAN &quot;))
					{
						prim $= &quot;H&quot;;
						sec  $= &quot;H&quot;;
					}
					else {
						prim $= &quot;J&quot;;
						sec  $= &quot;H&quot;;
					}
					cur++;
					break;
				}

				if ((cur == 0) &amp;&amp; (mid(in, cur, 4) != &quot;JOSE&quot;))
				{
					prim $= &quot;J&quot;;  // Yankelovich/Jankelowicz
					sec  $= &quot;A&quot;;
				}
				else {
					// spanish pron. of .e.g. 'bajador'
					if (is_vowel(in, cur - 1)
						&amp;&amp; !Slavo_Germanic(in)
						&amp;&amp; ((mid(in, cur + 1, 1) == &quot;A&quot;)
						|| (mid(in, cur + 1, 1) == &quot;O&quot;)))
					{
						prim $= &quot;J&quot;;
						sec  $= &quot;H&quot;;
					}
					else {
						if (cur == last)
						{
							prim $= &quot;J&quot;;
							sec  $= &quot;&quot;;
						}
						else {
							if ((InStr(&quot;LTKSNMBZ&quot;, mid(in, cur + 1, 1)) == -1)
								&amp;&amp; (InStr(&quot;SKL&quot;, mid(in, cur - 1, 1)) == -1) )
							{
								prim $= &quot;J&quot;;
								sec  $= &quot;J&quot;;
							}
						}
					}
				}

				if (mid(in, cur + 1, 1) == &quot;J&quot;) // it could happen
					cur += 2;
				else
					cur++;
				break;

			case &quot;K&quot;:
				if (mid(in, cur + 1, 1) == &quot;K&quot;) cur += 2;
				else cur++;
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;L&quot;:
				if (mid(in, cur + 1, 1) == &quot;L&quot;)
				{
					// spanish e.g. 'cabrillo', 'gallegos'
					if (((cur == (slen - 3))
						&amp;&amp; (smid(in, cur-1, 4, tmp) == &quot;ILLO&quot;
							|| tmp == &quot;ILLA&quot;
							|| tmp == &quot;ALLE&quot;
						)
						|| (
							((smid(in, last-1, 2, tmp) == &quot;AS&quot;
								|| tmp == &quot;OS&quot;)
								|| (InStr(&quot;AO&quot;, mid(in, last, 1)) &gt; -1)
							)
							&amp;&amp; (mid(in, cur - 1, 4) == &quot;ALLE&quot;)
							)
						))
					{
						prim $= &quot;L&quot;;
						sec  $= &quot;&quot;;
						cur += 2;
						break;
					}
					cur += 2;
				} else cur++;
				prim $= &quot;L&quot;;
				sec  $= &quot;L&quot;;
				break;

			case &quot;M&quot;:
				if (((mid(in, cur-1, 3) == &quot;UMB&quot;)
					&amp;&amp; (((cur + 1) == last)
					|| (mid(in, cur+2, 2) == &quot;ER&quot;)))
					// 'dumb', 'thumb'
					|| (mid(in, cur + 1, 1) == &quot;M&quot;))
				{
					cur += 2;
				}
				else {
					cur++;
				}
				prim $= &quot;M&quot;;
				sec  $= &quot;M&quot;;
				break;

			case &quot;N&quot;:
				if (mid(in, cur + 1, 1) == &quot;N&quot;) cur += 2;
				else cur++;
				prim $= &quot;N&quot;;
				sec  $= &quot;N&quot;;
				break;

			case &quot;Ñ&quot;:
				cur++;
				prim $= &quot;N&quot;;
				sec  $= &quot;N&quot;;
				break;

			case &quot;P&quot;:
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					cur += 2;
					prim $= &quot;F&quot;;
					sec  $= &quot;F&quot;;
					break;
				}

				// also account for &quot;campbell&quot; and &quot;raspberry&quot;
				if (InStr(&quot;PB&quot;, Mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				prim $= &quot;P&quot;;
				sec  $= &quot;P&quot;;
				break;

   			case &quot;Q&quot;:
				if (mid(in, cur + 1, 1) == &quot;Q&quot;) cur += 2;
				else cur++;
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;R&quot;:
				// french e.g. 'rogier', but exclude 'hochmeier'
				if ((cur == last)
					&amp;&amp; !Slavo_Germanic(in)
					&amp;&amp; (mid(in, cur - 2, 2) == &quot;IE&quot;)
					&amp;&amp; !(smid(in, cur-4, 2, tmp) == &quot;ME&quot;
						|| tmp == &quot;MA&quot;
					))
				{
					prim $= &quot;&quot;;
					sec  $= &quot;R&quot;;
				}
				else {
					prim $= &quot;R&quot;;
					sec  $= &quot;R&quot;;
				}
				if (mid(in, cur + 1, 1) == &quot;R&quot;) cur += 2;
				else cur++;
				break;

			case &quot;S&quot;:
				// special cases 'island', 'isle', 'carlisle', 'carlysle'
				if ((smid(in, cur - 1, 3, tmp) == &quot;ISL&quot;)
					|| (tmp == &quot;YSL&quot;))
				{
					cur++;
					break;
				}

				// special case 'sugar-'
				if ((cur == 0) &amp;&amp; (mid(in, cur, 5) == &quot;SUGAR&quot;))
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;S&quot;;
					cur++;
					break;
				}

				if (mid(in, cur, 2) == &quot;SH&quot;)
				{
					// germanic
					if (smid(in, cur + 1, 4, tmp) == &quot;HEIM&quot;
						|| tmp == &quot;HOEK&quot;
						|| tmp == &quot;HOLM&quot;
						|| tmp == &quot;HOLZ&quot;)
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					else {
						prim $= &quot;X&quot;;
						sec  $= &quot;X&quot;;
					}
					cur += 2;
					break;
				}

				// italian &amp; armenian
				if (smid(in, cur, 3, tmp) == &quot;SIO&quot;
					|| tmp == &quot;SIA&quot;
					|| mid(in, cur, 4) == &quot;SIAN&quot;)
				{
					if (!Slavo_Germanic(in))
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;X&quot;;
					}
					else {
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					cur += 3;
					break;
				}

				// german &amp; anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider'
				// also, -sz- in slavic language altho in hungarian it is pronounced 's'
				if ((
						(cur == 0)
						&amp;&amp; (InStr(&quot;MNLW&quot;, mid(in, cur + 1, 1)) &gt; -1)
					)
					|| mid(in, cur + 1, 1) == &quot;Z&quot;)
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;X&quot;;
					if (mid(in, cur + 1, 1) == &quot;Z&quot;)	cur += 2;
					else cur++;
					break;
				}

				if (mid(in, cur, 2) == &quot;SC&quot;)
				{
					// Schlesinger's rule
					if (mid(in, cur + 2, 1) == &quot;H&quot;)
					{
						// dutch origin, e.g. 'school', 'schooner'
						if (smid(in, cur + 3, 2, tmp) == &quot;OO&quot;
							|| tmp == &quot;ER&quot;
							|| tmp == &quot;EN&quot;
							|| tmp == &quot;UY&quot;
							|| tmp == &quot;ED&quot;
							|| tmp == &quot;EM&quot;)
						{
							// 'schermerhorn', 'schenker'
							if (smid(in, cur + 3, 2, tmp) == &quot;ER&quot;
								|| tmp == &quot;EN&quot;)
							{
								prim $= &quot;X&quot;;
								sec  $= &quot;SK&quot;;
							} else {
								prim $= &quot;SK&quot;;
								sec  $= &quot;SK&quot;;
							}
							cur += 3;
							break;
						} else {
							if ((cur == 0)
								&amp;&amp; !is_vowel(in, 3)
								&amp;&amp; (mid(in, cur + 3, 1) != &quot;W&quot;))
							{
								prim $= &quot;X&quot;;
								sec  $= &quot;S&quot;;
							} else {
								prim $= &quot;X&quot;;
								sec  $= &quot;X&quot;;
							}
							cur += 3;
							break;
						}

						if (InStr(&quot;IEY&quot;, mid(in, cur + 2, 1)) &gt; -1)
						{
							prim $= &quot;S&quot;;
							sec  $= &quot;S&quot;;
							cur += 3;
							break;
						}
					}

					// else
					prim $= &quot;SK&quot;;
					sec  $= &quot;SK&quot;;
					cur += 3;
					break;
				}

				// french e.g. 'resnais', 'artois'
				if ((cur == last)
					&amp;&amp; (
						smid(in, cur-2, 2, tmp) == &quot;AI&quot;
						|| tmp == &quot;OI&quot;
					))
				{
					prim $= &quot;&quot;;
					sec  $= &quot;S&quot;;
				} else {
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
				}

				if (InStr(&quot;SZ&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				break;

			case &quot;T&quot;:
				if (mid(in, cur, 4) == &quot;TION&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				if (smid(in, cur, 3, tmp) == &quot;TIA&quot;
					|| tmp == &quot;TCH&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				if ((mid(in, cur, 2) == &quot;TH&quot;)
					|| (mid(in, cur, 3) == &quot;TTH&quot;))
				{
					// special case 'thomas', 'thames' or germanic
					if (smid(in, cur + 2, 2, tmp) == &quot;OM&quot;
						|| tmp == &quot;AM&quot;
						|| smid(in, 0, 4, tmp) == &quot;VAN&quot;
						|| tmp == &quot;VON&quot;
						|| mid(in, 0, 3) == &quot;SCH&quot;)
					{
						prim $= &quot;T&quot;;
						sec  $= &quot;T&quot;;
					} else {
						prim $= &quot;O&quot;;
						sec  $= &quot;T&quot;;
					}
					cur += 2;
					break;
				}

				if (InStr(&quot;TD&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				prim $= &quot;T&quot;;
				sec  $= &quot;T&quot;;
				break;

			case &quot;V&quot;:
				if (mid(in, cur + 1, 1) == &quot;V&quot;)
					cur += 2;
				else
					cur++;
				prim $= &quot;F&quot;;
				sec  $= &quot;F&quot;;
				break;

			case &quot;W&quot;:
				// can also be in middle of word
				if (mid(in, cur, 2) == &quot;WR&quot;) {
					prim $= &quot;R&quot;;
					sec  $= &quot;R&quot;;
					cur += 2;
					break;
				}

				if ((cur == 0)
					&amp;&amp; (is_vowel(in, cur + 1)
						|| mid(in, cur, 2) == &quot;WH&quot;))
				{
					// Wasserman should match Vasserman
					if (is_vowel(in, cur + 1))
					{
						prim $= &quot;A&quot;;
						sec  $= &quot;F&quot;;
					}
					else {
						// need Uomo to match Womo
						prim $= &quot;A&quot;;
						sec  $= &quot;A&quot;;
					}
				}

				// Arnow should match Arnoff
				if (((cur == last)
						&amp;&amp; is_vowel(in, cur - 1))
					|| smid(in, cur - 1, 5, tmp) ==&quot;EWSKI&quot;
					|| tmp == &quot;EWSKY&quot;
					|| tmp == &quot;OWSKI&quot;
					|| tmp == &quot;OWSKY&quot;
					|| mid(in, 0, 3) == &quot;SCH&quot;)
				{
					prim $= &quot;&quot;;
					sec  $= &quot;F&quot;;
					cur++;
					break;
				}

				// polish e.g. 'filipowicz'
				if (smid(in, cur, 4, tmp) == &quot;WICZ&quot;
					|| tmp == &quot;WITZ&quot;)
				{
					prim $= &quot;TS&quot;;
					sec  $= &quot;FX&quot;;
					cur += 4;
					break;
				}

				// else skip it
				cur++;
				break;

			case &quot;X&quot;:
				// french e.g. breaux
				if (!((cur == last)
					&amp;&amp; (smid(in, cur - 3, 3, tmp) == &quot;IAU&quot;
						|| tmp == &quot;EAU&quot;
						|| smid(in, cur - 2, 2, tmp) == &quot;AU&quot;
						|| tmp == &quot;OU&quot;)))
				{
					prim $= &quot;KS&quot;;
					sec  $= &quot;KS&quot;;
				}

				if (InStr(&quot;CX&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				break;


			case &quot;Z&quot;:
				// chinese pinyin e.g. 'zhao'
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					prim $= &quot;J&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}
				else
					if (smid(in, cur + 1, 2, tmp) == &quot;ZO&quot;
						|| tmp == &quot;ZI&quot;
						|| tmp == &quot;ZA&quot;
						|| (Slavo_Germanic(in)
						&amp;&amp; ((cur &gt; 0) &amp;&amp; mid(in, cur - 1, 1) != &quot;T&quot;)))
					{
					prim $= &quot;S&quot;;
					sec  $= &quot;TS&quot;;
				} else {
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
				}

				if (mid(in, cur + 1, 1) == &quot;Z&quot;)
					cur += 2;
				else
					cur++;
				break;

			default:
				cur++;
		}
 	}

 	res[0] = Left(prim, mlen);
 	res[1] = Left(sec, mlen);
 	return res;
}
&lt;/uscript&gt;

==Helper functions==

&lt;uscript&gt;
/**
	Same as mid, except that is has a 4th param that will also get the result. &lt;br /&gt;
	Use this for caching the result.
*/
static final function string smid(coerce string in, int off, int len, out string s)
{
	s = mid(in, off, len);
	return s;
}

/**
	returns true if the character at pos is a vowel.
*/
static final function bool is_vowel(coerce string in, int pos)
{
	return (InStr(&quot;AEIOUY&quot;, mid(in, pos, 1)) &gt; -1);
}

/**
	helper function for the metaphone algorithm to determain if this word is
	&quot;slave germanic&quot;
*/
static final function bool Slavo_Germanic(coerce string in)
{
	return (InStr(in, &quot;W&quot;) &gt; -1)
		|| (InStr(in, &quot;K&quot;) &gt; -1)
		|| (InStr(in, &quot;CZ&quot;) &gt; -1)
		|| (InStr(in, &quot;WITZ&quot;) &gt; -1);
}
&lt;/uscript&gt;

==Copyright==

    Copyright 2004, Michiel Hendriks &lt;elmuerte@drunksnipers.com&gt;
    All rights reserved.
 
    This UnrealScript translation is based heavily on the PHP 
    implementation by Stephen Woodbridge &lt;woodbri@swoodbridge.com&gt;, 
    which in turn is based on the C implementation
    by Maurice Aubrey &lt;maurice@hevanet.com&gt;, which in turn
    is based heavily on the C++ implementation by
    Lawrence Philips and incorporates several bug fixes courtesy
    of Kevin Atkinson &lt;kevina@users.sourceforge.net&gt;.
 
    This module is free software; you may redistribute it and/or
    modify it under the same terms as Perl itself.

The [http://www.perl.com/pub/a/language/misc/Artistic.html Perl Artistic License].

Note that that page currently appears to be blank, the Perl Artistic License is almost similar to the [http://www.opensource.org/licenses/artistic-license.php Artistic License]

'''Wormbo:''' Erm... Perl?

'''El Muerte:''' Yeah go figure, just pasting a long the license notice. The implementation of Maurice Aubrey has been released under that license, and so is the PHP implementation, thus this implementation should also be released under the same license. The license isn't very restrictive, it allows you to do even more than the [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]] would do.

==Related Topics==
* [[Legacy:SoundEx|SoundEx]]
* [http://aspell.sourceforge.net/metaphone/ More about metaphone] &amp;ndash; and implementations in other languages

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2834</id>
      <timestamp>2004-08-19T12:43:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Erm... Perl?</comment>
      <text xml:space="preserve">This document implements a &quot;sounds like&quot; algorithm developed by Lawrence Philips which he published in the June, 2000 issue of [http://www.cuj.com/documents/s=8038/cuj0006philips/ C/C++ Users Journal.]

Double Metaphone is an improved version of Philips' original Metaphone algorithm.

The UnrealScript implementation has been adapted from Stephen Woodbridge's [http://swoodbridge.com/DoubleMetaPhone/ PHP implementation] by [[Legacy:El Muerte|El Muerte]]. 

''Note:'' Because of the size of the algorithm there might be errors in it.

==The algorithm==

&lt;uscript&gt;
/**
	Returns the double metaphone value of in.
	The array always contains two values.
*/
static final function array&lt;string&gt; DoubleMetaPhone(coerce string in, optional int mlen)
{
	local array&lt;string&gt; res;
	local string prim, sec, tmp;
	local int cur, last, slen;

	if (mlen == 0) mlen = 4;
 	slen = Len(in);
 	last = slen-1;
 	in = caps(in$&quot;     &quot;);
	// skip this at beginning of word
	switch (Left(in, 2))
	{
		case &quot;GN&quot;:
		case &quot;KN&quot;:
		case &quot;PN&quot;:
		case &quot;WR&quot;:
		case &quot;PS&quot;:
			cur++;
	}
 	// Initial 'X' is pronounced 'Z' e.g. 'Xavier'
 	if (Left(in, 1) == &quot;X&quot;)
 	{
 		prim $= &quot;S&quot;; // 'Z' maps to 'S'
 		sec  $= &quot;S&quot;;
 		cur++;
 	}
 	// main loop
 	while (len(prim) &lt; mlen || len(sec) &lt; mlen)
	{
		if (cur &gt;= slen) break;
		switch (mid(in, cur, 1))
		{
			case &quot;A&quot;:
			case &quot;E&quot;:
			case &quot;I&quot;:
			case &quot;O&quot;:
			case &quot;U&quot;:
			case &quot;Y&quot;:
				if (cur == 0) // all init vowels now map to 'A'
				{
					prim $= &quot;A&quot;;
					sec	 $= &quot;A&quot;;
				}
				cur++;
				break;

			case &quot;B&quot;: // '-mb', e.g. &quot;dumb&quot;, already skipped over ...
				prim $= &quot;P&quot;;
				sec  $= &quot;P&quot;;
				if (mid(in, cur+1, 1) == &quot;B&quot;) cur += 2;
				else cur++;
				break;

			case &quot;Ç&quot;:
				prim $= &quot;S&quot;;
				sec  $= &quot;S&quot;;
				cur++;
				break;

			case &quot;C&quot;: // various gremanic
				if ((cur &gt; 1)
					&amp;&amp; (!is_vowel(in, cur-2))
					&amp;&amp; (mid(in, cur - 1, 3) == &quot;ACH&quot;)
					&amp;&amp; ((mid(in, cur + 2, 1) != &quot;I&quot;)
						&amp;&amp; ((mid(in, cur + 2, 1) != &quot;E&quot;)
							|| smid(in, cur - 2, 6, tmp) == &quot;BACHER&quot;)
							|| tmp == &quot;MACHER&quot;))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

				// special case 'caesar'
				if ((cur == 0) &amp;&amp; (mid(in, cur, 6) == &quot;CAESAR&quot;))
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
					cur += 2;
					break;
				}

				// italian 'chianti'
				if (mid(in, cur, 4) == &quot;CHIA&quot;)
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

		  		if (mid(in, cur, 2) == &quot;CH&quot;)
		  		{
					// find 'michael'
					if ((cur &gt; 0) &amp;&amp; (mid(in, cur, 4) == &quot;CHAE&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;X&quot;;
						cur += 2;
						break;
					}

					// greek roots e.g. 'chemistry', 'chorus'
					if ((cur == 0)
 						&amp;&amp; (smid(in, cur+1, 5, tmp) == &quot;HARAC&quot;
 							|| tmp == &quot;HARIS&quot;)
						|| (smid(in, cur+1, 3, tmp) == &quot;HOR&quot;
							|| tmp == &quot;HYM&quot;
							|| tmp == &quot;HIA&quot;
							|| tmp == &quot;HEM&quot;)
						&amp;&amp; (mid(in, 0, 5) != &quot;CHORE&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
						cur += 2;
						break;
					}

					// germanic, greek, or otherwise 'ch' for 'kh' sound
					if ((	(smid(in, 0, 4, tmp) == &quot;VAN &quot;)
							|| (tmp == &quot;VON &quot;)
							|| (tmp == &quot;SCH&quot;)
						)
						// 'architect' but not 'arch', orchestra', 'orchid'
						|| (	(smid(in, cur-2, 6, tmp) == &quot;ORCHES&quot;)
								|| (tmp == &quot;ARCHIT&quot;)
								|| (tmp == &quot;ORCHID&quot;)
							)
						|| (InStr(&quot;TS&quot;, Mid(in, cur+2, 1)) &gt; -1)
						|| (
							((InStr(&quot;AOUE&quot;, Mid(in, cur-1, 1)) &gt; -1)
					 			|| (cur == 0)
							)
							// e.g. 'wachtler', 'weschsler', but not 'tichner'
							&amp;&amp; (InStr(&quot;LRNMBHFVW&quot;, Mid(in, cur+2, 1)) &gt; -1))
						)
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
					}
					else {
						if (cur &gt; 0)
						{
							if (mid(in, 0, 2) == &quot;MC&quot;)
							{
								// e.g. 'McHugh'
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							else {
								prim $= &quot;X&quot;;
								sec  $= &quot;K&quot;;
							}
						}
						else {
							prim $= &quot;X&quot;;
							sec  $= &quot;X&quot;;
						}
					}
					cur += 2;
					break;
				}

				// e.g. 'czerny'
				if (mid(in, cur, 2) == &quot;CZ&quot;
					&amp;&amp; mid(in, cur-2, 4) != &quot;WICZ&quot;)
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;X&quot;;
					cur += 2;
					break;
				}

				// e.g. 'focaccia'
				if (mid(in, cur + 1, 3) == &quot;CIA&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				// double 'C', but not McClellan'
				if (mid(in, cur, 2) == &quot;CC&quot;
						&amp;&amp; !((cur == 1)
							&amp;&amp; (mid(in, 0, 1) == &quot;M&quot;)))
				{
					// 'bellocchio' but not 'bacchus'
					if ((InStr(&quot;IEH&quot;, mid(in, cur + 2, 1)) &gt; -1)
						&amp;&amp; (mid(in, cur + 2, 2) != &quot;HU&quot;))
					{
			  			// 'accident', 'accede', 'succeed'
						if (((cur == 1)
							&amp;&amp; (mid(in, cur - 1, 1) == &quot;A&quot;))
							|| (smid(in, cur-1, 5, tmp) == &quot;UCCEE&quot;)
							|| (tmp == &quot;UCCES&quot;))
						{
							prim $= &quot;KS&quot;;
							sec  $= &quot;KS&quot;;
							// 'bacci', 'bertucci', other italian
						}
						else {
							prim $= &quot;X&quot;;
							sec  $= &quot;X&quot;;
						}
						cur += 3;
						break;
					}
					else {
						// Pierce's rule
						prim $= &quot;K&quot;;
						sec $= &quot;K&quot;;
						cur += 2;
						break;
					}
				}

				if ((smid(in, cur, 2, tmp) == &quot;CK&quot;)
					|| (tmp == &quot;CG&quot;)
					|| (tmp == &quot;CQ&quot;))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

				if ((smid(in, cur, 2, tmp) == &quot;CI&quot;)
					|| (tmp == &quot;CE&quot;)
					|| (tmp == &quot;CY&quot;))
				{
					// italian vs. english
					if ((smid(in, cur, 3, tmp) == &quot;CIO&quot;)
						|| (tmp == &quot;CIE&quot;)
						|| (tmp == &quot;CIA&quot;))
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;X&quot;;
					}
					else {
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					cur += 2;
					break;
				}

				// else
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;

				// name sent in 'mac caffrey', 'mac gregor'
				if ((smid(in, cur+1, 2, tmp) == &quot; C&quot;)
					|| (tmp == &quot; Q&quot;)
					|| (tmp == &quot; G&quot;))
				{
					cur += 3;
				}
				else {
					if ((InStr(&quot;CKQ&quot;, mid(in, cur + 1, 1)) &gt; -1)
						&amp;&amp; !((smid(in, cur+1, 2, tmp) == &quot;CE&quot;)
							|| (tmp == &quot;CI&quot;))
						)
					{
						cur += 2;
					}
					else {
						cur++;
					}
				}
				break;

			case &quot;D&quot;:
				if (mid(in, cur, 2) == &quot;DG&quot;)
				{
					if (InStr(&quot;IEY&quot;, mid(in, cur + 2, 1)) &gt; -1)
					{
						// e.g. 'edge'
						prim $= &quot;J&quot;;
						sec  $= &quot;J&quot;;
						cur += 3;
						break;
					}
					else {
						// e.g. 'edgar'
						prim $= &quot;TK&quot;;
						sec  $= &quot;TK&quot;;
						cur += 2;
						break;
					}
				}

				if ((smid(in, cur, 2, tmp) == &quot;DT&quot;)
					|| (tmp == &quot;DD&quot;))
				{
					prim $= &quot;T&quot;;
					sec  $= &quot;T&quot;;
					cur += 2;
					break;
				}

				// else
				prim $= &quot;T&quot;;
				sec  $= &quot;T&quot;;
				cur++;
				break;

			case &quot;F&quot;:
				if (mid(in, cur + 1, 1) == &quot;F&quot;) cur += 2;
				else cur++;
				prim $= &quot;F&quot;;
				sec  $= &quot;F&quot;;
				break;

			// TODO: optimize
			case &quot;G&quot;:
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					if ((cur &gt; 0) &amp;&amp; !is_vowel(in, cur-1))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
						cur += 2;
						break;
					}

					if (cur &lt; 3)
					{
						// 'ghislane', 'ghiradelli'
						if (cur == 0)
						{
							if (mid(in, cur + 2, 1) == &quot;I&quot;)
							{
								prim $= &quot;J&quot;;
								sec  $= &quot;J&quot;;
							}
							else {
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							cur += 2;
							break;
						}
					}

					// Parker's rule (with some further refinements) - e.g. 'hugh'
					if (((cur &gt; 1) &amp;&amp; (InStr(&quot;BHD&quot;, mid(in, cur - 2, 1)) &gt; -1))
						// e.g. 'bough'
						|| ((cur &gt; 2) &amp;&amp; (InStr(&quot;BHD&quot;, mid(in, cur - 3, 1)) &gt; -1))
						// e.g. 'broughton'
						|| ((cur &gt; 3) &amp;&amp; (InStr(&quot;BH&quot;, mid(in, cur - 4, 1)) &gt; -1)))
					{
						cur += 2;
						break;
					}
					else {
						// e.g. 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough'
						if ((cur &gt; 2)
							&amp;&amp; (Mid(in, cur - 1, 1) == &quot;U&quot;)
							&amp;&amp; (InStr(&quot;CGLRT&quot;, mid(in, cur - 3, 1)) &gt; -1))
						{
							prim $= &quot;F&quot;;
							sec  $= &quot;F&quot;;
						}
						else {
							if ((cur &gt; 0) &amp;&amp; mid(in, cur - 1, 1) != &quot;I&quot;)
							{
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							cur += 2;
							break;
						}
					}
				}

				if (mid(in, cur + 1, 1) == &quot;N&quot;)
				{
					if ((cur == 1) &amp;&amp; is_vowel(in, 0) &amp;&amp; !Slavo_Germanic(in))
					{
						prim $= &quot;KN&quot;;
						sec  $= &quot;N&quot;;
					}
					else {
						// not e.g. 'cagney'
						if ((mid(in, cur + 2, 2) != &quot;EY&quot;)
							&amp;&amp; (mid(in, cur + 1) != &quot;Y&quot;)
							&amp;&amp; !Slavo_Germanic(in))
						{
							prim $= &quot;N&quot;;
							sec  $= &quot;KN&quot;;
						}
						else {
							prim $= &quot;KN&quot;;
							sec  $= &quot;KN&quot;;
						}
					}
					cur += 2;
					break;
				}

				// 'tagliaro'
				if ((mid(in, cur + 1, 2) == &quot;LI&quot;) &amp;&amp; !Slavo_Germanic(in))
				{
					prim $= &quot;KL&quot;;
					sec  $= &quot;L&quot;;
					cur += 2;
					break;
				}

				// -ges-, -gep-, -gel- at beginning
				if ((cur == 0)
					&amp;&amp; ((mid(in, cur + 1, 1) == &quot;Y&quot;)
						|| ((smid(in, cur + 1, 2, tmp) == &quot;ES&quot;)
							|| (tmp == &quot;EP&quot;)
							|| (tmp == &quot;EB&quot;)
							|| (tmp == &quot;EL&quot;)
							|| (tmp == &quot;EY&quot;)
							|| (tmp == &quot;IB&quot;)
							|| (tmp == &quot;IL&quot;)
							|| (tmp == &quot;IN&quot;)
							|| (tmp == &quot;IE&quot;)
							|| (tmp == &quot;EI&quot;)
							|| (tmp == &quot;ER&quot;))
						)
					)
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}

				// -ger-, -gy-
				if (((mid(in, cur + 1, 2) == &quot;ER&quot;)
					|| (mid(in, cur + 1, 1) == &quot;Y&quot;))
					&amp;&amp; !(smid(in, 0, 6, tmp) == &quot;DANGER&quot;
						|| tmp == &quot;RANGER&quot;
						|| tmp == &quot;MANGER&quot;
					)
					&amp;&amp; (InStr(&quot;EI&quot;, mid(in, cur-1, 1)) == -1)
					&amp;&amp; !(smid(in, cur-1, 3, tmp) == &quot;RGY&quot;
						|| tmp == &quot;OGY&quot;
					))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}

				// italian e.g. 'biaggi'
				if ((InStr(&quot;EIY&quot;, mid(in, cur + 1, 1)) &gt; -1)
					|| smid(in, cur-1, 4, tmp) == &quot;AGGI&quot;
					|| tmp == &quot;OGGI&quot;)
				{
					// obvious germanic
					if (((smid(in, 0, 4, tmp) == &quot;VAN &quot;
							|| tmp == &quot;VON &quot;)
						|| (mid(in, 0, 3) == &quot;SCH&quot;))
						|| (mid(in, cur + 1, 2) == &quot;ET&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
					}
					else {
						// always soft if french ending
						if (mid(in, cur + 1, 4) == &quot;IER &quot;)
						{
							prim $= &quot;J&quot;;
							sec  $= &quot;J&quot;;
						}
						else {
							prim $= &quot;J&quot;;
							sec  $= &quot;K&quot;;
						}
					}
					cur += 2;
					break;
				}

				if (mid(in, cur +1, 1) == &quot;G&quot;) cur += 2;
				else cur++;

				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;H&quot;:
				// only keep if first &amp; before vowel or btw. 2 vowels
				if (((cur == 0) || is_vowel(in, cur - 1)) &amp;&amp; is_vowel(in, cur + 1))
				{
					prim $= &quot;H&quot;;
					sec  $= &quot;H&quot;;
					cur += 2;
				}
				else cur++;
				break;

   			case &quot;J&quot;:
				// obvious spanish, 'jose', 'san jacinto'
				if ((mid(in, cur, 4) == &quot;JOSE&quot;)
					|| (mid(in, 0, 4) == &quot;SAN &quot;))
				{
					if (((cur == 0) &amp;&amp; (mid(in, cur + 4, 1) == &quot; &quot;))
						|| (mid(in, 0, 4) == &quot;SAN &quot;))
					{
						prim $= &quot;H&quot;;
						sec  $= &quot;H&quot;;
					}
					else {
						prim $= &quot;J&quot;;
						sec  $= &quot;H&quot;;
					}
					cur++;
					break;
				}

				if ((cur == 0) &amp;&amp; (mid(in, cur, 4) != &quot;JOSE&quot;))
				{
					prim $= &quot;J&quot;;  // Yankelovich/Jankelowicz
					sec  $= &quot;A&quot;;
				}
				else {
					// spanish pron. of .e.g. 'bajador'
					if (is_vowel(in, cur - 1)
						&amp;&amp; !Slavo_Germanic(in)
						&amp;&amp; ((mid(in, cur + 1, 1) == &quot;A&quot;)
						|| (mid(in, cur + 1, 1) == &quot;O&quot;)))
					{
						prim $= &quot;J&quot;;
						sec  $= &quot;H&quot;;
					}
					else {
						if (cur == last)
						{
							prim $= &quot;J&quot;;
							sec  $= &quot;&quot;;
						}
						else {
							if ((InStr(&quot;LTKSNMBZ&quot;, mid(in, cur + 1, 1)) == -1)
								&amp;&amp; (InStr(&quot;SKL&quot;, mid(in, cur - 1, 1)) == -1) )
							{
								prim $= &quot;J&quot;;
								sec  $= &quot;J&quot;;
							}
						}
					}
				}

				if (mid(in, cur + 1, 1) == &quot;J&quot;) // it could happen
					cur += 2;
				else
					cur++;
				break;

			case &quot;K&quot;:
				if (mid(in, cur + 1, 1) == &quot;K&quot;) cur += 2;
				else cur++;
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;L&quot;:
				if (mid(in, cur + 1, 1) == &quot;L&quot;)
				{
					// spanish e.g. 'cabrillo', 'gallegos'
					if (((cur == (slen - 3))
						&amp;&amp; (smid(in, cur-1, 4, tmp) == &quot;ILLO&quot;
							|| tmp == &quot;ILLA&quot;
							|| tmp == &quot;ALLE&quot;
						)
						|| (
							((smid(in, last-1, 2, tmp) == &quot;AS&quot;
								|| tmp == &quot;OS&quot;)
								|| (InStr(&quot;AO&quot;, mid(in, last, 1)) &gt; -1)
							)
							&amp;&amp; (mid(in, cur - 1, 4) == &quot;ALLE&quot;)
							)
						))
					{
						prim $= &quot;L&quot;;
						sec  $= &quot;&quot;;
						cur += 2;
						break;
					}
					cur += 2;
				} else cur++;
				prim $= &quot;L&quot;;
				sec  $= &quot;L&quot;;
				break;

			case &quot;M&quot;:
				if (((mid(in, cur-1, 3) == &quot;UMB&quot;)
					&amp;&amp; (((cur + 1) == last)
					|| (mid(in, cur+2, 2) == &quot;ER&quot;)))
					// 'dumb', 'thumb'
					|| (mid(in, cur + 1, 1) == &quot;M&quot;))
				{
					cur += 2;
				}
				else {
					cur++;
				}
				prim $= &quot;M&quot;;
				sec  $= &quot;M&quot;;
				break;

			case &quot;N&quot;:
				if (mid(in, cur + 1, 1) == &quot;N&quot;) cur += 2;
				else cur++;
				prim $= &quot;N&quot;;
				sec  $= &quot;N&quot;;
				break;

			case &quot;Ñ&quot;:
				cur++;
				prim $= &quot;N&quot;;
				sec  $= &quot;N&quot;;
				break;

			case &quot;P&quot;:
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					cur += 2;
					prim $= &quot;F&quot;;
					sec  $= &quot;F&quot;;
					break;
				}

				// also account for &quot;campbell&quot; and &quot;raspberry&quot;
				if (InStr(&quot;PB&quot;, Mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				prim $= &quot;P&quot;;
				sec  $= &quot;P&quot;;
				break;

   			case &quot;Q&quot;:
				if (mid(in, cur + 1, 1) == &quot;Q&quot;) cur += 2;
				else cur++;
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;R&quot;:
				// french e.g. 'rogier', but exclude 'hochmeier'
				if ((cur == last)
					&amp;&amp; !Slavo_Germanic(in)
					&amp;&amp; (mid(in, cur - 2, 2) == &quot;IE&quot;)
					&amp;&amp; !(smid(in, cur-4, 2, tmp) == &quot;ME&quot;
						|| tmp == &quot;MA&quot;
					))
				{
					prim $= &quot;&quot;;
					sec  $= &quot;R&quot;;
				}
				else {
					prim $= &quot;R&quot;;
					sec  $= &quot;R&quot;;
				}
				if (mid(in, cur + 1, 1) == &quot;R&quot;) cur += 2;
				else cur++;
				break;

			case &quot;S&quot;:
				// special cases 'island', 'isle', 'carlisle', 'carlysle'
				if ((smid(in, cur - 1, 3, tmp) == &quot;ISL&quot;)
					|| (tmp == &quot;YSL&quot;))
				{
					cur++;
					break;
				}

				// special case 'sugar-'
				if ((cur == 0) &amp;&amp; (mid(in, cur, 5) == &quot;SUGAR&quot;))
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;S&quot;;
					cur++;
					break;
				}

				if (mid(in, cur, 2) == &quot;SH&quot;)
				{
					// germanic
					if (smid(in, cur + 1, 4, tmp) == &quot;HEIM&quot;
						|| tmp == &quot;HOEK&quot;
						|| tmp == &quot;HOLM&quot;
						|| tmp == &quot;HOLZ&quot;)
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					else {
						prim $= &quot;X&quot;;
						sec  $= &quot;X&quot;;
					}
					cur += 2;
					break;
				}

				// italian &amp; armenian
				if (smid(in, cur, 3, tmp) == &quot;SIO&quot;
					|| tmp == &quot;SIA&quot;
					|| mid(in, cur, 4) == &quot;SIAN&quot;)
				{
					if (!Slavo_Germanic(in))
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;X&quot;;
					}
					else {
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					cur += 3;
					break;
				}

				// german &amp; anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider'
				// also, -sz- in slavic language altho in hungarian it is pronounced 's'
				if ((
						(cur == 0)
						&amp;&amp; (InStr(&quot;MNLW&quot;, mid(in, cur + 1, 1)) &gt; -1)
					)
					|| mid(in, cur + 1, 1) == &quot;Z&quot;)
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;X&quot;;
					if (mid(in, cur + 1, 1) == &quot;Z&quot;)	cur += 2;
					else cur++;
					break;
				}

				if (mid(in, cur, 2) == &quot;SC&quot;)
				{
					// Schlesinger's rule
					if (mid(in, cur + 2, 1) == &quot;H&quot;)
					{
						// dutch origin, e.g. 'school', 'schooner'
						if (smid(in, cur + 3, 2, tmp) == &quot;OO&quot;
							|| tmp == &quot;ER&quot;
							|| tmp == &quot;EN&quot;
							|| tmp == &quot;UY&quot;
							|| tmp == &quot;ED&quot;
							|| tmp == &quot;EM&quot;)
						{
							// 'schermerhorn', 'schenker'
							if (smid(in, cur + 3, 2, tmp) == &quot;ER&quot;
								|| tmp == &quot;EN&quot;)
							{
								prim $= &quot;X&quot;;
								sec  $= &quot;SK&quot;;
							} else {
								prim $= &quot;SK&quot;;
								sec  $= &quot;SK&quot;;
							}
							cur += 3;
							break;
						} else {
							if ((cur == 0)
								&amp;&amp; !is_vowel(in, 3)
								&amp;&amp; (mid(in, cur + 3, 1) != &quot;W&quot;))
							{
								prim $= &quot;X&quot;;
								sec  $= &quot;S&quot;;
							} else {
								prim $= &quot;X&quot;;
								sec  $= &quot;X&quot;;
							}
							cur += 3;
							break;
						}

						if (InStr(&quot;IEY&quot;, mid(in, cur + 2, 1)) &gt; -1)
						{
							prim $= &quot;S&quot;;
							sec  $= &quot;S&quot;;
							cur += 3;
							break;
						}
					}

					// else
					prim $= &quot;SK&quot;;
					sec  $= &quot;SK&quot;;
					cur += 3;
					break;
				}

				// french e.g. 'resnais', 'artois'
				if ((cur == last)
					&amp;&amp; (
						smid(in, cur-2, 2, tmp) == &quot;AI&quot;
						|| tmp == &quot;OI&quot;
					))
				{
					prim $= &quot;&quot;;
					sec  $= &quot;S&quot;;
				} else {
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
				}

				if (InStr(&quot;SZ&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				break;

			case &quot;T&quot;:
				if (mid(in, cur, 4) == &quot;TION&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				if (smid(in, cur, 3, tmp) == &quot;TIA&quot;
					|| tmp == &quot;TCH&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				if ((mid(in, cur, 2) == &quot;TH&quot;)
					|| (mid(in, cur, 3) == &quot;TTH&quot;))
				{
					// special case 'thomas', 'thames' or germanic
					if (smid(in, cur + 2, 2, tmp) == &quot;OM&quot;
						|| tmp == &quot;AM&quot;
						|| smid(in, 0, 4, tmp) == &quot;VAN&quot;
						|| tmp == &quot;VON&quot;
						|| mid(in, 0, 3) == &quot;SCH&quot;)
					{
						prim $= &quot;T&quot;;
						sec  $= &quot;T&quot;;
					} else {
						prim $= &quot;O&quot;;
						sec  $= &quot;T&quot;;
					}
					cur += 2;
					break;
				}

				if (InStr(&quot;TD&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				prim $= &quot;T&quot;;
				sec  $= &quot;T&quot;;
				break;

			case &quot;V&quot;:
				if (mid(in, cur + 1, 1) == &quot;V&quot;)
					cur += 2;
				else
					cur++;
				prim $= &quot;F&quot;;
				sec  $= &quot;F&quot;;
				break;

			case &quot;W&quot;:
				// can also be in middle of word
				if (mid(in, cur, 2) == &quot;WR&quot;) {
					prim $= &quot;R&quot;;
					sec  $= &quot;R&quot;;
					cur += 2;
					break;
				}

				if ((cur == 0)
					&amp;&amp; (is_vowel(in, cur + 1)
						|| mid(in, cur, 2) == &quot;WH&quot;))
				{
					// Wasserman should match Vasserman
					if (is_vowel(in, cur + 1))
					{
						prim $= &quot;A&quot;;
						sec  $= &quot;F&quot;;
					}
					else {
						// need Uomo to match Womo
						prim $= &quot;A&quot;;
						sec  $= &quot;A&quot;;
					}
				}

				// Arnow should match Arnoff
				if (((cur == last)
						&amp;&amp; is_vowel(in, cur - 1))
					|| smid(in, cur - 1, 5, tmp) ==&quot;EWSKI&quot;
					|| tmp == &quot;EWSKY&quot;
					|| tmp == &quot;OWSKI&quot;
					|| tmp == &quot;OWSKY&quot;
					|| mid(in, 0, 3) == &quot;SCH&quot;)
				{
					prim $= &quot;&quot;;
					sec  $= &quot;F&quot;;
					cur++;
					break;
				}

				// polish e.g. 'filipowicz'
				if (smid(in, cur, 4, tmp) == &quot;WICZ&quot;
					|| tmp == &quot;WITZ&quot;)
				{
					prim $= &quot;TS&quot;;
					sec  $= &quot;FX&quot;;
					cur += 4;
					break;
				}

				// else skip it
				cur++;
				break;

			case &quot;X&quot;:
				// french e.g. breaux
				if (!((cur == last)
					&amp;&amp; (smid(in, cur - 3, 3, tmp) == &quot;IAU&quot;
						|| tmp == &quot;EAU&quot;
						|| smid(in, cur - 2, 2, tmp) == &quot;AU&quot;
						|| tmp == &quot;OU&quot;)))
				{
					prim $= &quot;KS&quot;;
					sec  $= &quot;KS&quot;;
				}

				if (InStr(&quot;CX&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				break;


			case &quot;Z&quot;:
				// chinese pinyin e.g. 'zhao'
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					prim $= &quot;J&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}
				else
					if (smid(in, cur + 1, 2, tmp) == &quot;ZO&quot;
						|| tmp == &quot;ZI&quot;
						|| tmp == &quot;ZA&quot;
						|| (Slavo_Germanic(in)
						&amp;&amp; ((cur &gt; 0) &amp;&amp; mid(in, cur - 1, 1) != &quot;T&quot;)))
					{
					prim $= &quot;S&quot;;
					sec  $= &quot;TS&quot;;
				} else {
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
				}

				if (mid(in, cur + 1, 1) == &quot;Z&quot;)
					cur += 2;
				else
					cur++;
				break;

			default:
				cur++;
		}
 	}

 	res[0] = Left(prim, mlen);
 	res[1] = Left(sec, mlen);
 	return res;
}
&lt;/uscript&gt;

==Helper functions==

&lt;uscript&gt;
/**
	Same as mid, except that is has a 4th param that will also get the result. &lt;br /&gt;
	Use this for caching the result.
*/
static final function string smid(coerce string in, int off, int len, out string s)
{
	s = mid(in, off, len);
	return s;
}

/**
	returns true if the character at pos is a vowel.
*/
static final function bool is_vowel(coerce string in, int pos)
{
	return (InStr(&quot;AEIOUY&quot;, mid(in, pos, 1)) &gt; -1);
}

/**
	helper function for the metaphone algorithm to determain if this word is
	&quot;slave germanic&quot;
*/
static final function bool Slavo_Germanic(coerce string in)
{
	return (InStr(in, &quot;W&quot;) &gt; -1)
		|| (InStr(in, &quot;K&quot;) &gt; -1)
		|| (InStr(in, &quot;CZ&quot;) &gt; -1)
		|| (InStr(in, &quot;WITZ&quot;) &gt; -1);
}
&lt;/uscript&gt;

==Copyright==

    Copyright 2004, Michiel Hendriks &lt;elmuerte@drunksnipers.com&gt;
    All rights reserved.

    This UnrealScript translation is based heavily on the PHP 
    implementation by Stephen Woodbridge &lt;woodbri@swoodbridge.com&gt;, 
    which in turn is based on the C implementation
    by Maurice Aubrey &lt;maurice@hevanet.com&gt;, which in turn
    is based heavily on the C++ implementation by
    Lawrence Philips and incorporates several bug fixes courtesy
    of Kevin Atkinson &lt;kevina@users.sourceforge.net&gt;.
 
    This module is free software; you may redistribute it and/or
    modify it under the same terms as Perl itself.

'''Wormbo:''' Erm... Perl?

==Related Topics==
* [[Legacy:SoundEx|SoundEx]]
* [http://aspell.sourceforge.net/metaphone/ More about metaphone] &amp;ndash; and implementations in other languages

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2835</id>
      <timestamp>2004-08-19T13:12:22Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This document implements a &quot;sounds like&quot; algorithm developed by Lawrence Philips which he published in the June, 2000 issue of [http://www.cuj.com/documents/s=8038/cuj0006philips/ C/C++ Users Journal.]

Double Metaphone is an improved version of Philips' original Metaphone algorithm.

The UnrealScript implementation has been adapted from Stephen Woodbridge's [http://swoodbridge.com/DoubleMetaPhone/ PHP implementation] by [[Legacy:El Muerte|El Muerte]]. 

''Note:'' Because of the size of the algorithm there might be errors in it.

==The algorithm==

&lt;uscript&gt;
/**
	Returns the double metaphone value of in.
	The array always contains two values.
*/
static final function array&lt;string&gt; DoubleMetaPhone(coerce string in, optional int mlen)
{
	local array&lt;string&gt; res;
	local string prim, sec, tmp;
	local int cur, last, slen;

	if (mlen == 0) mlen = 4;
 	slen = Len(in);
 	last = slen-1;
 	in = caps(in$&quot;     &quot;);
	// skip this at beginning of word
	switch (Left(in, 2))
	{
		case &quot;GN&quot;:
		case &quot;KN&quot;:
		case &quot;PN&quot;:
		case &quot;WR&quot;:
		case &quot;PS&quot;:
			cur++;
	}
 	// Initial 'X' is pronounced 'Z' e.g. 'Xavier'
 	if (Left(in, 1) == &quot;X&quot;)
 	{
 		prim $= &quot;S&quot;; // 'Z' maps to 'S'
 		sec  $= &quot;S&quot;;
 		cur++;
 	}
 	// main loop
 	while (len(prim) &lt; mlen || len(sec) &lt; mlen)
	{
		if (cur &gt;= slen) break;
		switch (mid(in, cur, 1))
		{
			case &quot;A&quot;:
			case &quot;E&quot;:
			case &quot;I&quot;:
			case &quot;O&quot;:
			case &quot;U&quot;:
			case &quot;Y&quot;:
				if (cur == 0) // all init vowels now map to 'A'
				{
					prim $= &quot;A&quot;;
					sec	 $= &quot;A&quot;;
				}
				cur++;
				break;

			case &quot;B&quot;: // '-mb', e.g. &quot;dumb&quot;, already skipped over ...
				prim $= &quot;P&quot;;
				sec  $= &quot;P&quot;;
				if (mid(in, cur+1, 1) == &quot;B&quot;) cur += 2;
				else cur++;
				break;

			case &quot;Ç&quot;:
				prim $= &quot;S&quot;;
				sec  $= &quot;S&quot;;
				cur++;
				break;

			case &quot;C&quot;: // various gremanic
				if ((cur &gt; 1)
					&amp;&amp; (!is_vowel(in, cur-2))
					&amp;&amp; (mid(in, cur - 1, 3) == &quot;ACH&quot;)
					&amp;&amp; ((mid(in, cur + 2, 1) != &quot;I&quot;)
						&amp;&amp; ((mid(in, cur + 2, 1) != &quot;E&quot;)
							|| smid(in, cur - 2, 6, tmp) == &quot;BACHER&quot;)
							|| tmp == &quot;MACHER&quot;))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

				// special case 'caesar'
				if ((cur == 0) &amp;&amp; (mid(in, cur, 6) == &quot;CAESAR&quot;))
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
					cur += 2;
					break;
				}

				// italian 'chianti'
				if (mid(in, cur, 4) == &quot;CHIA&quot;)
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

		  		if (mid(in, cur, 2) == &quot;CH&quot;)
		  		{
					// find 'michael'
					if ((cur &gt; 0) &amp;&amp; (mid(in, cur, 4) == &quot;CHAE&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;X&quot;;
						cur += 2;
						break;
					}

					// greek roots e.g. 'chemistry', 'chorus'
					if ((cur == 0)
 						&amp;&amp; (smid(in, cur+1, 5, tmp) == &quot;HARAC&quot;
 							|| tmp == &quot;HARIS&quot;)
						|| (smid(in, cur+1, 3, tmp) == &quot;HOR&quot;
							|| tmp == &quot;HYM&quot;
							|| tmp == &quot;HIA&quot;
							|| tmp == &quot;HEM&quot;)
						&amp;&amp; (mid(in, 0, 5) != &quot;CHORE&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
						cur += 2;
						break;
					}

					// germanic, greek, or otherwise 'ch' for 'kh' sound
					if ((	(smid(in, 0, 4, tmp) == &quot;VAN &quot;)
							|| (tmp == &quot;VON &quot;)
							|| (tmp == &quot;SCH&quot;)
						)
						// 'architect' but not 'arch', orchestra', 'orchid'
						|| (	(smid(in, cur-2, 6, tmp) == &quot;ORCHES&quot;)
								|| (tmp == &quot;ARCHIT&quot;)
								|| (tmp == &quot;ORCHID&quot;)
							)
						|| (InStr(&quot;TS&quot;, Mid(in, cur+2, 1)) &gt; -1)
						|| (
							((InStr(&quot;AOUE&quot;, Mid(in, cur-1, 1)) &gt; -1)
					 			|| (cur == 0)
							)
							// e.g. 'wachtler', 'weschsler', but not 'tichner'
							&amp;&amp; (InStr(&quot;LRNMBHFVW&quot;, Mid(in, cur+2, 1)) &gt; -1))
						)
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
					}
					else {
						if (cur &gt; 0)
						{
							if (mid(in, 0, 2) == &quot;MC&quot;)
							{
								// e.g. 'McHugh'
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							else {
								prim $= &quot;X&quot;;
								sec  $= &quot;K&quot;;
							}
						}
						else {
							prim $= &quot;X&quot;;
							sec  $= &quot;X&quot;;
						}
					}
					cur += 2;
					break;
				}

				// e.g. 'czerny'
				if (mid(in, cur, 2) == &quot;CZ&quot;
					&amp;&amp; mid(in, cur-2, 4) != &quot;WICZ&quot;)
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;X&quot;;
					cur += 2;
					break;
				}

				// e.g. 'focaccia'
				if (mid(in, cur + 1, 3) == &quot;CIA&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				// double 'C', but not McClellan'
				if (mid(in, cur, 2) == &quot;CC&quot;
						&amp;&amp; !((cur == 1)
							&amp;&amp; (mid(in, 0, 1) == &quot;M&quot;)))
				{
					// 'bellocchio' but not 'bacchus'
					if ((InStr(&quot;IEH&quot;, mid(in, cur + 2, 1)) &gt; -1)
						&amp;&amp; (mid(in, cur + 2, 2) != &quot;HU&quot;))
					{
			  			// 'accident', 'accede', 'succeed'
						if (((cur == 1)
							&amp;&amp; (mid(in, cur - 1, 1) == &quot;A&quot;))
							|| (smid(in, cur-1, 5, tmp) == &quot;UCCEE&quot;)
							|| (tmp == &quot;UCCES&quot;))
						{
							prim $= &quot;KS&quot;;
							sec  $= &quot;KS&quot;;
							// 'bacci', 'bertucci', other italian
						}
						else {
							prim $= &quot;X&quot;;
							sec  $= &quot;X&quot;;
						}
						cur += 3;
						break;
					}
					else {
						// Pierce's rule
						prim $= &quot;K&quot;;
						sec $= &quot;K&quot;;
						cur += 2;
						break;
					}
				}

				if ((smid(in, cur, 2, tmp) == &quot;CK&quot;)
					|| (tmp == &quot;CG&quot;)
					|| (tmp == &quot;CQ&quot;))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;K&quot;;
					cur += 2;
					break;
				}

				if ((smid(in, cur, 2, tmp) == &quot;CI&quot;)
					|| (tmp == &quot;CE&quot;)
					|| (tmp == &quot;CY&quot;))
				{
					// italian vs. english
					if ((smid(in, cur, 3, tmp) == &quot;CIO&quot;)
						|| (tmp == &quot;CIE&quot;)
						|| (tmp == &quot;CIA&quot;))
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;X&quot;;
					}
					else {
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					cur += 2;
					break;
				}

				// else
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;

				// name sent in 'mac caffrey', 'mac gregor'
				if ((smid(in, cur+1, 2, tmp) == &quot; C&quot;)
					|| (tmp == &quot; Q&quot;)
					|| (tmp == &quot; G&quot;))
				{
					cur += 3;
				}
				else {
					if ((InStr(&quot;CKQ&quot;, mid(in, cur + 1, 1)) &gt; -1)
						&amp;&amp; !((smid(in, cur+1, 2, tmp) == &quot;CE&quot;)
							|| (tmp == &quot;CI&quot;))
						)
					{
						cur += 2;
					}
					else {
						cur++;
					}
				}
				break;

			case &quot;D&quot;:
				if (mid(in, cur, 2) == &quot;DG&quot;)
				{
					if (InStr(&quot;IEY&quot;, mid(in, cur + 2, 1)) &gt; -1)
					{
						// e.g. 'edge'
						prim $= &quot;J&quot;;
						sec  $= &quot;J&quot;;
						cur += 3;
						break;
					}
					else {
						// e.g. 'edgar'
						prim $= &quot;TK&quot;;
						sec  $= &quot;TK&quot;;
						cur += 2;
						break;
					}
				}

				if ((smid(in, cur, 2, tmp) == &quot;DT&quot;)
					|| (tmp == &quot;DD&quot;))
				{
					prim $= &quot;T&quot;;
					sec  $= &quot;T&quot;;
					cur += 2;
					break;
				}

				// else
				prim $= &quot;T&quot;;
				sec  $= &quot;T&quot;;
				cur++;
				break;

			case &quot;F&quot;:
				if (mid(in, cur + 1, 1) == &quot;F&quot;) cur += 2;
				else cur++;
				prim $= &quot;F&quot;;
				sec  $= &quot;F&quot;;
				break;

			// TODO: optimize
			case &quot;G&quot;:
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					if ((cur &gt; 0) &amp;&amp; !is_vowel(in, cur-1))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
						cur += 2;
						break;
					}

					if (cur &lt; 3)
					{
						// 'ghislane', 'ghiradelli'
						if (cur == 0)
						{
							if (mid(in, cur + 2, 1) == &quot;I&quot;)
							{
								prim $= &quot;J&quot;;
								sec  $= &quot;J&quot;;
							}
							else {
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							cur += 2;
							break;
						}
					}

					// Parker's rule (with some further refinements) - e.g. 'hugh'
					if (((cur &gt; 1) &amp;&amp; (InStr(&quot;BHD&quot;, mid(in, cur - 2, 1)) &gt; -1))
						// e.g. 'bough'
						|| ((cur &gt; 2) &amp;&amp; (InStr(&quot;BHD&quot;, mid(in, cur - 3, 1)) &gt; -1))
						// e.g. 'broughton'
						|| ((cur &gt; 3) &amp;&amp; (InStr(&quot;BH&quot;, mid(in, cur - 4, 1)) &gt; -1)))
					{
						cur += 2;
						break;
					}
					else {
						// e.g. 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough'
						if ((cur &gt; 2)
							&amp;&amp; (Mid(in, cur - 1, 1) == &quot;U&quot;)
							&amp;&amp; (InStr(&quot;CGLRT&quot;, mid(in, cur - 3, 1)) &gt; -1))
						{
							prim $= &quot;F&quot;;
							sec  $= &quot;F&quot;;
						}
						else {
							if ((cur &gt; 0) &amp;&amp; mid(in, cur - 1, 1) != &quot;I&quot;)
							{
								prim $= &quot;K&quot;;
								sec  $= &quot;K&quot;;
							}
							cur += 2;
							break;
						}
					}
				}

				if (mid(in, cur + 1, 1) == &quot;N&quot;)
				{
					if ((cur == 1) &amp;&amp; is_vowel(in, 0) &amp;&amp; !Slavo_Germanic(in))
					{
						prim $= &quot;KN&quot;;
						sec  $= &quot;N&quot;;
					}
					else {
						// not e.g. 'cagney'
						if ((mid(in, cur + 2, 2) != &quot;EY&quot;)
							&amp;&amp; (mid(in, cur + 1) != &quot;Y&quot;)
							&amp;&amp; !Slavo_Germanic(in))
						{
							prim $= &quot;N&quot;;
							sec  $= &quot;KN&quot;;
						}
						else {
							prim $= &quot;KN&quot;;
							sec  $= &quot;KN&quot;;
						}
					}
					cur += 2;
					break;
				}

				// 'tagliaro'
				if ((mid(in, cur + 1, 2) == &quot;LI&quot;) &amp;&amp; !Slavo_Germanic(in))
				{
					prim $= &quot;KL&quot;;
					sec  $= &quot;L&quot;;
					cur += 2;
					break;
				}

				// -ges-, -gep-, -gel- at beginning
				if ((cur == 0)
					&amp;&amp; ((mid(in, cur + 1, 1) == &quot;Y&quot;)
						|| ((smid(in, cur + 1, 2, tmp) == &quot;ES&quot;)
							|| (tmp == &quot;EP&quot;)
							|| (tmp == &quot;EB&quot;)
							|| (tmp == &quot;EL&quot;)
							|| (tmp == &quot;EY&quot;)
							|| (tmp == &quot;IB&quot;)
							|| (tmp == &quot;IL&quot;)
							|| (tmp == &quot;IN&quot;)
							|| (tmp == &quot;IE&quot;)
							|| (tmp == &quot;EI&quot;)
							|| (tmp == &quot;ER&quot;))
						)
					)
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}

				// -ger-, -gy-
				if (((mid(in, cur + 1, 2) == &quot;ER&quot;)
					|| (mid(in, cur + 1, 1) == &quot;Y&quot;))
					&amp;&amp; !(smid(in, 0, 6, tmp) == &quot;DANGER&quot;
						|| tmp == &quot;RANGER&quot;
						|| tmp == &quot;MANGER&quot;
					)
					&amp;&amp; (InStr(&quot;EI&quot;, mid(in, cur-1, 1)) == -1)
					&amp;&amp; !(smid(in, cur-1, 3, tmp) == &quot;RGY&quot;
						|| tmp == &quot;OGY&quot;
					))
				{
					prim $= &quot;K&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}

				// italian e.g. 'biaggi'
				if ((InStr(&quot;EIY&quot;, mid(in, cur + 1, 1)) &gt; -1)
					|| smid(in, cur-1, 4, tmp) == &quot;AGGI&quot;
					|| tmp == &quot;OGGI&quot;)
				{
					// obvious germanic
					if (((smid(in, 0, 4, tmp) == &quot;VAN &quot;
							|| tmp == &quot;VON &quot;)
						|| (mid(in, 0, 3) == &quot;SCH&quot;))
						|| (mid(in, cur + 1, 2) == &quot;ET&quot;))
					{
						prim $= &quot;K&quot;;
						sec  $= &quot;K&quot;;
					}
					else {
						// always soft if french ending
						if (mid(in, cur + 1, 4) == &quot;IER &quot;)
						{
							prim $= &quot;J&quot;;
							sec  $= &quot;J&quot;;
						}
						else {
							prim $= &quot;J&quot;;
							sec  $= &quot;K&quot;;
						}
					}
					cur += 2;
					break;
				}

				if (mid(in, cur +1, 1) == &quot;G&quot;) cur += 2;
				else cur++;

				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;H&quot;:
				// only keep if first &amp; before vowel or btw. 2 vowels
				if (((cur == 0) || is_vowel(in, cur - 1)) &amp;&amp; is_vowel(in, cur + 1))
				{
					prim $= &quot;H&quot;;
					sec  $= &quot;H&quot;;
					cur += 2;
				}
				else cur++;
				break;

   			case &quot;J&quot;:
				// obvious spanish, 'jose', 'san jacinto'
				if ((mid(in, cur, 4) == &quot;JOSE&quot;)
					|| (mid(in, 0, 4) == &quot;SAN &quot;))
				{
					if (((cur == 0) &amp;&amp; (mid(in, cur + 4, 1) == &quot; &quot;))
						|| (mid(in, 0, 4) == &quot;SAN &quot;))
					{
						prim $= &quot;H&quot;;
						sec  $= &quot;H&quot;;
					}
					else {
						prim $= &quot;J&quot;;
						sec  $= &quot;H&quot;;
					}
					cur++;
					break;
				}

				if ((cur == 0) &amp;&amp; (mid(in, cur, 4) != &quot;JOSE&quot;))
				{
					prim $= &quot;J&quot;;  // Yankelovich/Jankelowicz
					sec  $= &quot;A&quot;;
				}
				else {
					// spanish pron. of .e.g. 'bajador'
					if (is_vowel(in, cur - 1)
						&amp;&amp; !Slavo_Germanic(in)
						&amp;&amp; ((mid(in, cur + 1, 1) == &quot;A&quot;)
						|| (mid(in, cur + 1, 1) == &quot;O&quot;)))
					{
						prim $= &quot;J&quot;;
						sec  $= &quot;H&quot;;
					}
					else {
						if (cur == last)
						{
							prim $= &quot;J&quot;;
							sec  $= &quot;&quot;;
						}
						else {
							if ((InStr(&quot;LTKSNMBZ&quot;, mid(in, cur + 1, 1)) == -1)
								&amp;&amp; (InStr(&quot;SKL&quot;, mid(in, cur - 1, 1)) == -1) )
							{
								prim $= &quot;J&quot;;
								sec  $= &quot;J&quot;;
							}
						}
					}
				}

				if (mid(in, cur + 1, 1) == &quot;J&quot;) // it could happen
					cur += 2;
				else
					cur++;
				break;

			case &quot;K&quot;:
				if (mid(in, cur + 1, 1) == &quot;K&quot;) cur += 2;
				else cur++;
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;L&quot;:
				if (mid(in, cur + 1, 1) == &quot;L&quot;)
				{
					// spanish e.g. 'cabrillo', 'gallegos'
					if (((cur == (slen - 3))
						&amp;&amp; (smid(in, cur-1, 4, tmp) == &quot;ILLO&quot;
							|| tmp == &quot;ILLA&quot;
							|| tmp == &quot;ALLE&quot;
						)
						|| (
							((smid(in, last-1, 2, tmp) == &quot;AS&quot;
								|| tmp == &quot;OS&quot;)
								|| (InStr(&quot;AO&quot;, mid(in, last, 1)) &gt; -1)
							)
							&amp;&amp; (mid(in, cur - 1, 4) == &quot;ALLE&quot;)
							)
						))
					{
						prim $= &quot;L&quot;;
						sec  $= &quot;&quot;;
						cur += 2;
						break;
					}
					cur += 2;
				} else cur++;
				prim $= &quot;L&quot;;
				sec  $= &quot;L&quot;;
				break;

			case &quot;M&quot;:
				if (((mid(in, cur-1, 3) == &quot;UMB&quot;)
					&amp;&amp; (((cur + 1) == last)
					|| (mid(in, cur+2, 2) == &quot;ER&quot;)))
					// 'dumb', 'thumb'
					|| (mid(in, cur + 1, 1) == &quot;M&quot;))
				{
					cur += 2;
				}
				else {
					cur++;
				}
				prim $= &quot;M&quot;;
				sec  $= &quot;M&quot;;
				break;

			case &quot;N&quot;:
				if (mid(in, cur + 1, 1) == &quot;N&quot;) cur += 2;
				else cur++;
				prim $= &quot;N&quot;;
				sec  $= &quot;N&quot;;
				break;

			case &quot;Ñ&quot;:
				cur++;
				prim $= &quot;N&quot;;
				sec  $= &quot;N&quot;;
				break;

			case &quot;P&quot;:
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					cur += 2;
					prim $= &quot;F&quot;;
					sec  $= &quot;F&quot;;
					break;
				}

				// also account for &quot;campbell&quot; and &quot;raspberry&quot;
				if (InStr(&quot;PB&quot;, Mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				prim $= &quot;P&quot;;
				sec  $= &quot;P&quot;;
				break;

   			case &quot;Q&quot;:
				if (mid(in, cur + 1, 1) == &quot;Q&quot;) cur += 2;
				else cur++;
				prim $= &quot;K&quot;;
				sec  $= &quot;K&quot;;
				break;

			case &quot;R&quot;:
				// french e.g. 'rogier', but exclude 'hochmeier'
				if ((cur == last)
					&amp;&amp; !Slavo_Germanic(in)
					&amp;&amp; (mid(in, cur - 2, 2) == &quot;IE&quot;)
					&amp;&amp; !(smid(in, cur-4, 2, tmp) == &quot;ME&quot;
						|| tmp == &quot;MA&quot;
					))
				{
					prim $= &quot;&quot;;
					sec  $= &quot;R&quot;;
				}
				else {
					prim $= &quot;R&quot;;
					sec  $= &quot;R&quot;;
				}
				if (mid(in, cur + 1, 1) == &quot;R&quot;) cur += 2;
				else cur++;
				break;

			case &quot;S&quot;:
				// special cases 'island', 'isle', 'carlisle', 'carlysle'
				if ((smid(in, cur - 1, 3, tmp) == &quot;ISL&quot;)
					|| (tmp == &quot;YSL&quot;))
				{
					cur++;
					break;
				}

				// special case 'sugar-'
				if ((cur == 0) &amp;&amp; (mid(in, cur, 5) == &quot;SUGAR&quot;))
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;S&quot;;
					cur++;
					break;
				}

				if (mid(in, cur, 2) == &quot;SH&quot;)
				{
					// germanic
					if (smid(in, cur + 1, 4, tmp) == &quot;HEIM&quot;
						|| tmp == &quot;HOEK&quot;
						|| tmp == &quot;HOLM&quot;
						|| tmp == &quot;HOLZ&quot;)
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					else {
						prim $= &quot;X&quot;;
						sec  $= &quot;X&quot;;
					}
					cur += 2;
					break;
				}

				// italian &amp; armenian
				if (smid(in, cur, 3, tmp) == &quot;SIO&quot;
					|| tmp == &quot;SIA&quot;
					|| mid(in, cur, 4) == &quot;SIAN&quot;)
				{
					if (!Slavo_Germanic(in))
					{
						prim $= &quot;S&quot;;
						sec  $= &quot;X&quot;;
					}
					else {
						prim $= &quot;S&quot;;
						sec  $= &quot;S&quot;;
					}
					cur += 3;
					break;
				}

				// german &amp; anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider'
				// also, -sz- in slavic language altho in hungarian it is pronounced 's'
				if ((
						(cur == 0)
						&amp;&amp; (InStr(&quot;MNLW&quot;, mid(in, cur + 1, 1)) &gt; -1)
					)
					|| mid(in, cur + 1, 1) == &quot;Z&quot;)
				{
					prim $= &quot;S&quot;;
					sec  $= &quot;X&quot;;
					if (mid(in, cur + 1, 1) == &quot;Z&quot;)	cur += 2;
					else cur++;
					break;
				}

				if (mid(in, cur, 2) == &quot;SC&quot;)
				{
					// Schlesinger's rule
					if (mid(in, cur + 2, 1) == &quot;H&quot;)
					{
						// dutch origin, e.g. 'school', 'schooner'
						if (smid(in, cur + 3, 2, tmp) == &quot;OO&quot;
							|| tmp == &quot;ER&quot;
							|| tmp == &quot;EN&quot;
							|| tmp == &quot;UY&quot;
							|| tmp == &quot;ED&quot;
							|| tmp == &quot;EM&quot;)
						{
							// 'schermerhorn', 'schenker'
							if (smid(in, cur + 3, 2, tmp) == &quot;ER&quot;
								|| tmp == &quot;EN&quot;)
							{
								prim $= &quot;X&quot;;
								sec  $= &quot;SK&quot;;
							} else {
								prim $= &quot;SK&quot;;
								sec  $= &quot;SK&quot;;
							}
							cur += 3;
							break;
						} else {
							if ((cur == 0)
								&amp;&amp; !is_vowel(in, 3)
								&amp;&amp; (mid(in, cur + 3, 1) != &quot;W&quot;))
							{
								prim $= &quot;X&quot;;
								sec  $= &quot;S&quot;;
							} else {
								prim $= &quot;X&quot;;
								sec  $= &quot;X&quot;;
							}
							cur += 3;
							break;
						}

						if (InStr(&quot;IEY&quot;, mid(in, cur + 2, 1)) &gt; -1)
						{
							prim $= &quot;S&quot;;
							sec  $= &quot;S&quot;;
							cur += 3;
							break;
						}
					}

					// else
					prim $= &quot;SK&quot;;
					sec  $= &quot;SK&quot;;
					cur += 3;
					break;
				}

				// french e.g. 'resnais', 'artois'
				if ((cur == last)
					&amp;&amp; (
						smid(in, cur-2, 2, tmp) == &quot;AI&quot;
						|| tmp == &quot;OI&quot;
					))
				{
					prim $= &quot;&quot;;
					sec  $= &quot;S&quot;;
				} else {
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
				}

				if (InStr(&quot;SZ&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				break;

			case &quot;T&quot;:
				if (mid(in, cur, 4) == &quot;TION&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				if (smid(in, cur, 3, tmp) == &quot;TIA&quot;
					|| tmp == &quot;TCH&quot;)
				{
					prim $= &quot;X&quot;;
					sec  $= &quot;X&quot;;
					cur += 3;
					break;
				}

				if ((mid(in, cur, 2) == &quot;TH&quot;)
					|| (mid(in, cur, 3) == &quot;TTH&quot;))
				{
					// special case 'thomas', 'thames' or germanic
					if (smid(in, cur + 2, 2, tmp) == &quot;OM&quot;
						|| tmp == &quot;AM&quot;
						|| smid(in, 0, 4, tmp) == &quot;VAN&quot;
						|| tmp == &quot;VON&quot;
						|| mid(in, 0, 3) == &quot;SCH&quot;)
					{
						prim $= &quot;T&quot;;
						sec  $= &quot;T&quot;;
					} else {
						prim $= &quot;O&quot;;
						sec  $= &quot;T&quot;;
					}
					cur += 2;
					break;
				}

				if (InStr(&quot;TD&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				prim $= &quot;T&quot;;
				sec  $= &quot;T&quot;;
				break;

			case &quot;V&quot;:
				if (mid(in, cur + 1, 1) == &quot;V&quot;)
					cur += 2;
				else
					cur++;
				prim $= &quot;F&quot;;
				sec  $= &quot;F&quot;;
				break;

			case &quot;W&quot;:
				// can also be in middle of word
				if (mid(in, cur, 2) == &quot;WR&quot;) {
					prim $= &quot;R&quot;;
					sec  $= &quot;R&quot;;
					cur += 2;
					break;
				}

				if ((cur == 0)
					&amp;&amp; (is_vowel(in, cur + 1)
						|| mid(in, cur, 2) == &quot;WH&quot;))
				{
					// Wasserman should match Vasserman
					if (is_vowel(in, cur + 1))
					{
						prim $= &quot;A&quot;;
						sec  $= &quot;F&quot;;
					}
					else {
						// need Uomo to match Womo
						prim $= &quot;A&quot;;
						sec  $= &quot;A&quot;;
					}
				}

				// Arnow should match Arnoff
				if (((cur == last)
						&amp;&amp; is_vowel(in, cur - 1))
					|| smid(in, cur - 1, 5, tmp) ==&quot;EWSKI&quot;
					|| tmp == &quot;EWSKY&quot;
					|| tmp == &quot;OWSKI&quot;
					|| tmp == &quot;OWSKY&quot;
					|| mid(in, 0, 3) == &quot;SCH&quot;)
				{
					prim $= &quot;&quot;;
					sec  $= &quot;F&quot;;
					cur++;
					break;
				}

				// polish e.g. 'filipowicz'
				if (smid(in, cur, 4, tmp) == &quot;WICZ&quot;
					|| tmp == &quot;WITZ&quot;)
				{
					prim $= &quot;TS&quot;;
					sec  $= &quot;FX&quot;;
					cur += 4;
					break;
				}

				// else skip it
				cur++;
				break;

			case &quot;X&quot;:
				// french e.g. breaux
				if (!((cur == last)
					&amp;&amp; (smid(in, cur - 3, 3, tmp) == &quot;IAU&quot;
						|| tmp == &quot;EAU&quot;
						|| smid(in, cur - 2, 2, tmp) == &quot;AU&quot;
						|| tmp == &quot;OU&quot;)))
				{
					prim $= &quot;KS&quot;;
					sec  $= &quot;KS&quot;;
				}

				if (InStr(&quot;CX&quot;, mid(in, cur + 1, 1)) &gt; -1)
					cur += 2;
				else
					cur++;
				break;


			case &quot;Z&quot;:
				// chinese pinyin e.g. 'zhao'
				if (mid(in, cur + 1, 1) == &quot;H&quot;)
				{
					prim $= &quot;J&quot;;
					sec  $= &quot;J&quot;;
					cur += 2;
					break;
				}
				else
					if (smid(in, cur + 1, 2, tmp) == &quot;ZO&quot;
						|| tmp == &quot;ZI&quot;
						|| tmp == &quot;ZA&quot;
						|| (Slavo_Germanic(in)
						&amp;&amp; ((cur &gt; 0) &amp;&amp; mid(in, cur - 1, 1) != &quot;T&quot;)))
					{
					prim $= &quot;S&quot;;
					sec  $= &quot;TS&quot;;
				} else {
					prim $= &quot;S&quot;;
					sec  $= &quot;S&quot;;
				}

				if (mid(in, cur + 1, 1) == &quot;Z&quot;)
					cur += 2;
				else
					cur++;
				break;

			default:
				cur++;
		}
 	}

 	res[0] = Left(prim, mlen);
 	res[1] = Left(sec, mlen);
 	return res;
}
&lt;/uscript&gt;

==Helper functions==

&lt;uscript&gt;
/**
	Same as mid, except that is has a 4th param that will also get the result. &lt;br /&gt;
	Use this for caching the result.
*/
static final function string smid(coerce string in, int off, int len, out string s)
{
	s = mid(in, off, len);
	return s;
}

/**
	returns true if the character at pos is a vowel.
*/
static final function bool is_vowel(coerce string in, int pos)
{
	return (InStr(&quot;AEIOUY&quot;, mid(in, pos, 1)) &gt; -1);
}

/**
	helper function for the metaphone algorithm to determain if this word is
	&quot;slave germanic&quot;
*/
static final function bool Slavo_Germanic(coerce string in)
{
	return (InStr(in, &quot;W&quot;) &gt; -1)
		|| (InStr(in, &quot;K&quot;) &gt; -1)
		|| (InStr(in, &quot;CZ&quot;) &gt; -1)
		|| (InStr(in, &quot;WITZ&quot;) &gt; -1);
}
&lt;/uscript&gt;

==Copyright==

    Copyright 2004, Michiel Hendriks &lt;elmuerte@drunksnipers.com&gt;
    All rights reserved.
 
    This UnrealScript translation is based heavily on the PHP 
    implementation by Stephen Woodbridge &lt;woodbri@swoodbridge.com&gt;, 
    which in turn is based on the C implementation
    by Maurice Aubrey &lt;maurice@hevanet.com&gt;, which in turn
    is based heavily on the C++ implementation by
    Lawrence Philips and incorporates several bug fixes courtesy
    of Kevin Atkinson &lt;kevina@users.sourceforge.net&gt;.
 
    This module is free software; you may redistribute it and/or
    modify it under the same terms as Perl itself.

[http://www.perl.com/pub/a/language/misc/Artistic.html Perl Artistic License]

Note that that page currentl appears to be blank, the Perl Artistic License is almost similar to the [http://www.opensource.org/licenses/artistic-license.php Artistic License]

'''Wormbo:''' Erm... Perl?

'''El Muerte:''' Yeah go figure, just pasting a long the license notice. The implementation of Maurice Aubrey has been released under that license, and so is the PHP implementation, thus this implementation should also be released under the same license.

==Related Topics==
* [[Legacy:SoundEx|SoundEx]]
* [http://aspell.sourceforge.net/metaphone/ More about metaphone] &amp;ndash; and implementations in other languages

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dr.AwkwArD</title>
    <id>1053</id>
    <revision>
      <id>2805</id>
      <timestamp>2006-01-05T06:11:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

{|

|-
|Name:
|Richard &quot;Ted&quot; Craig
|-
|Nicks:
|Dr.AwkwArD, DocAwk, djthadius
|-
|Location:
|Orange County, CA, USA
|}

BFA in Writing/Directing from Chapman University, School of Film and Television; background in mobile robotics and digital system design 

(CalPoly Pomona); former trance and happyhardcore DJ in LA (djthadius); currently works in film production in Hollywood.

==Webpage==

{|

|-
|Home Page:
|[http://www.atomictrick.com/drawkward DrAwkwArD Presents]
|}

==Contact==

{|

|-
|AIM:
|djthad1us
|-
|MSN:
|tcraig@hotmail.com
|-
|Email:
|tcraig@hotmail.com
|-
|Email:
|drawkward@atomictrick.com
|}

==Projects==

[[Legacy:DocAwk/Projects|DocAwk/Projects]]

==Links==

[[Legacy:DocAwk/Links|DocAwk/Links]]

==Guest Book==

'''Dr.AwkwArD:''' Well, I guess it was time to start assembling my little neck of the woods on this here WIKI thingy.  So... :)

'''Tarquin:''' Hi there. Welcome to the wiki :D

'''Dr.AwkwArD:''' Thank you, sir, thank you.  I hope to contribute. :)

'''SuperApe:''' Welcome, Doc.  (&quot;Doc Awk&quot;, sounds like, &quot;Doc Oc&quot;; as in Doc Octopus from Fantasic Four, Spiderman comix. ;) )

'''Dr.AwkwArD:''' Indeed, a little play on words never hurt anyone. :D

'''SuperApe:''' Still in the film game?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2806</id>
      <timestamp>2004-03-30T05:06:24Z</timestamp>
      <contributor>
        <ip>Dr.AwkwArD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

{|

|-
|Name:
|Richard &quot;Ted&quot; Craig
|-
|Nicks:
|Dr.AwkwArD, DocAwk, djthadius
|-
|Location:
|Orange County, CA, USA
|}

BFA in Writing/Directing from Chapman University, School of Film and Television; background in mobile robotics and digital system design 

(CalPoly Pomona); former trance and happyhardcore DJ in LA (djthadius); currently works in film production in Hollywood.

==Webpage==

{|

|-
|Home Page:
|[http://www.atomictrick.com/drawkward DrAwkwArD Presents]
|}

==Contact==

{|

|-
|AIM:
|djthad1us
|-
|MSN:
|tcraig@hotmail.com
|-
|Email:
|tcraig@hotmail.com
|-
|Email:
|drawkward@atomictrick.com
|}

==Projects==

[[Legacy:DocAwk/Projects|DocAwk/Projects]]

==Links==

[[Legacy:DocAwk/Links|DocAwk/Links]]

==Guest Book==

'''Dr.AwkwArD:''' Well, I guess it was time to start assembling my little neck of the woods on this here WIKI thingy.  So... :)

'''Tarquin:''' Hi there. Welcome to the wiki :D

'''Dr.AwkwArD:''' Thank you, sir, thank you.  I hope to contribute. :)

'''SuperApe:''' Welcome, Doc.  (&quot;Doc Awk&quot;, sounds like, &quot;Doc Oc&quot;; as in Doc Octopus from Fantasic Four, Spiderman comix. ;) )

'''Dr.AwkwArD:''' Indeed, a little play on words never hurt anyone. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dr.Nick</title>
    <id>980</id>
    <revision>
      <id>2647</id>
      <timestamp>2002-10-13T02:26:53Z</timestamp>
      <contributor>
        <ip>Dr.Nick</ip>
      </contributor>
      <minor/>
      <comment>added contact information</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki!@ :) :tup: ( Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] Page!!)

'''Tarquin:''' Hi Dr Nick! Welcome to the wiki. :)

'''Wormbo:''' Welcome to the Wiki and have a nice stay.

'''Dr.Nick:''' Hi everybody! :) Thanks for the warm welcome.

'''captk''' Hi Dr. Nick!

----

If anyone feels like contacting me they can do so by dropping me a mail at hawkeye 'at' everyzero.com .

Also you can contact me through ICQ, AIM, or MSN:
* AIM: NickJBWC
* ICQ: 28399768
* MSN: nab_hawkeye3@hotmail.com &amp;rarr; ''Do not send mail to this address, I never check it. Its sole purpose is so I can logon MSN''
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2648</id>
      <timestamp>2002-10-11T14:28:04Z</timestamp>
      <contributor>
        <ip>Dr.Nick</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki!@ :) :tup: ( Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] Page!!)

'''Tarquin:''' Hi Dr Nick! Welcome to the wiki. :)

'''Wormbo:''' Welcome to the Wiki and have a nice stay.

'''Dr.Nick:''' Hi everybody! :) Thanks for the warm welcome.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2649</id>
      <timestamp>2002-10-11T15:42:31Z</timestamp>
      <contributor>
        <ip>Captain Kewl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki!@ :) :tup: ( Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] Page!!)

'''Tarquin:''' Hi Dr Nick! Welcome to the wiki. :)

'''Wormbo:''' Welcome to the Wiki and have a nice stay.

'''Dr.Nick:''' Hi everybody! :) Thanks for the warm welcome.

'''captk''' Hi Dr. Nick!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Draconx</title>
    <id>982</id>
    <revision>
      <id>2652</id>
      <timestamp>2006-02-04T17:57:51Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===My Tutorials===

*[[Legacy:Input Keys|Input Keys]]
*[[Legacy:Changing The Enforcer (UT)|Changing The Enforcer (UT)]]

===My Contributions===

*[[Legacy:Bilinear Filtering|Bilinear Filtering]]

===My Projects===

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RuneUT]]

===About Me===

I am a Computer Science student at the University of Waterloo.

I use my computer too much, be it watching anime, coding, or whatever.  I find it difficult to do assignments over pursuing my own interests.

Unless it's for my Japanese class, so far I've had no trouble finding the time to do work for that class.

===System Specs===

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Artemis===

|
|-
| style=&quot;text-align: right&quot; |Role
|Main Comp 
|-
| style=&quot;text-align: right&quot; |Processor
|AMD Athlon64 3200+ (2.0 GHz, 1024 kB L2) 
|-
| style=&quot;text-align: right&quot; |Motherboard
|Asus K8N-E Deluxe 
|-
| style=&quot;text-align: right&quot; |Memory
|2x Crucial 512 MB PC-3200 
|-
| style=&quot;text-align: right&quot; |Graphics Card
|Asus V9570 TD (GeForce FX5700 256MB) 
|-
| style=&quot;text-align: right&quot; |Drives
|
4x Maxtor 250GB SATA

1x Maxtor 300GB IDE (external)

1x Maxtor 80GB SATA
 
|-
| style=&quot;text-align: right&quot; |Sound Card
|Creative SB Audigy OEM 
|-
| style=&quot;text-align: right&quot; |Speakers
|Logitech Z-560 THX 4.1 
|-
| style=&quot;text-align: right&quot; |Operating System
|Gentoo Linux 
|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Ares===

|
|-
| style=&quot;text-align: right&quot; |Role
|Server 
|-
| style=&quot;text-align: right&quot; |Processor
|AMD Thunderbird 1.2GHz (256 kB L2) 
|-
| style=&quot;text-align: right&quot; |Motherboard
|Asus A7A-266 
|-
| style=&quot;text-align: right&quot; |Memory
|1x 256 MB PC-2100 OEM 
|-
| style=&quot;text-align: right&quot; |Graphics Card
|Asus GeForce4 MX440 
|-
| style=&quot;text-align: right&quot; |Operating System
|Gentoo Linux 
|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Apollo===

|
|-
| style=&quot;text-align: right&quot; |Role
|Router 
|-
| style=&quot;text-align: right&quot; |Processor
|Intel Pentium-S 120MHz 
|-
| style=&quot;text-align: right&quot; |Motherboard
|Not sure 
|-
| style=&quot;text-align: right&quot; |Memory
|1x 32 MB &amp; 1x 16 MB PC-66 OEM
|-
| style=&quot;text-align: right&quot; |Graphics Card
|3DFX Voodoo3 3000 
|-
| style=&quot;text-align: right&quot; |Operating System
|Gentoo Linux 
|}

===Commenty stuff===

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: beat wormbo!

'''Wormbo:''' Welcome to the Wiki! Have a nice stay and add yourself to the [[Legacy:Project Contributors|Project Contributors]] list, please. :)

'''EntropicLqd:''' Welcome to the Wiki.

'''ProjectX:''' Dunno how old this is or whether you're still using the wiki for an Unreal Resource, but hey, welcom :) and, ZxAnPhOrIaN, congratulations on beating Wormbo, that's an impressive feat of speed of hand and speed of network connection

'''Wormbo:''' o_O

'''ZxAnPhOrIaN:''' :) ;) :P :D :tup:

'''Draconx: LOL :cheesy:

'''Tarquin:''' Hello and a belated welcome to the wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2653</id>
      <timestamp>2005-09-05T03:25:20Z</timestamp>
      <contributor>
        <ip>Rn-v1n5b04.uwaterloo.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===My Tutorials===

*[[Legacy:Input Keys|Input Keys]]
*[[Legacy:Changing The Enforcer (UT)|Changing The Enforcer (UT)]]

===My Contributions===

*[[Legacy:Bilinear Filtering|Bilinear Filtering]]

===My Projects===

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RuneUT]]

===About Me===

I am a Computer Science student at the University of Waterloo.

I like coding stuff.  Doesnt matter what.

Mapping's fun too, but I lack artistic ability so they always look really bad.

Shock Rifle = Best weapon in UT.

I also suck at writing about myself.

===System Specs===

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Artemis===

|
|-
| style=&quot;text-align: right&quot; |'''Component'''
|'''Hardware''' 
|-
| style=&quot;text-align: right&quot; |Processor
|AMD Athlon64 3200+ (2.0 GHz, 1024 kB L2) 
|-
| style=&quot;text-align: right&quot; |Motherboard
|Asus K8N-E Deluxe 
|-
| style=&quot;text-align: right&quot; |Memory
|2x Crucial 512 MB PC-3200 
|-
| style=&quot;text-align: right&quot; |Graphics Card
|Asus V9570 TD (GeForce FX5700 Ultra 256MB) 
|-
| style=&quot;text-align: right&quot; |Sound Card
|Creative SB Audigy OEM 
|-
| style=&quot;text-align: right&quot; |Speakers
|Logitech Z-560 THX 4.1 
|-
| style=&quot;text-align: right&quot; |Operating System
|Windows XP 
|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Ares===

|
|-
| style=&quot;text-align: right&quot; |'''Component'''
|'''Hardware''' 
|-
| style=&quot;text-align: right&quot; |Processor
|AMD Thunderbird 1.2GHz (256 kB L2) 
|-
| style=&quot;text-align: right&quot; |Motherboard
|Asus A7A-266 
|-
| style=&quot;text-align: right&quot; |Memory
|1x 256 MB PC-2100 OEM 
|-
| style=&quot;text-align: right&quot; |Graphics Card
|Asus GeForce4 MX440 
|-
| style=&quot;text-align: right&quot; |Sound Card
|Creative SoundBlaster PCI128 OEM 
|-
| style=&quot;text-align: right&quot; |Speakers
|None 
|-
| style=&quot;text-align: right&quot; |Operating System
|Gentoo Linux 
|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Apollo===

|
|-
| style=&quot;text-align: right&quot; |'''Component'''
|'''Hardware''' 
|-
| style=&quot;text-align: right&quot; |Processor
|Intel Pentium-S 120MHz 
|-
| style=&quot;text-align: right&quot; |Motherboard
|Not sure 
|-
| style=&quot;text-align: right&quot; |Memory
|1x 32 MB &amp; 1x 16 MB PC-66 OEM
|-
| style=&quot;text-align: right&quot; |Graphics Card
|3DFX Voodoo3 3000 
|-
| style=&quot;text-align: right&quot; |Sound Card
|None 
|-
| style=&quot;text-align: right&quot; |Speakers
|None 
|-
| style=&quot;text-align: right&quot; |Operating System
|Debian Linux 
|}

===Commenty stuff===

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: beat wormbo!

'''Wormbo:''' Welcome to the Wiki! Have a nice stay and add yourself to the [[Legacy:Project Contributors|Project Contributors]] list, please. :)

'''EntropicLqd:''' Welcome to the Wiki.

'''ProjectX:''' Dunno how old this is or whether you're still using the wiki for an Unreal Resource, but hey, welcom :) and, ZxAnPhOrIaN, congratulations on beating Wormbo, that's an impressive feat of speed of hand and speed of network connection

'''Wormbo:''' o_O

'''ZxAnPhOrIaN:''' :) ;) :P :D :tup:

'''Draconx: LOL :cheesy:

'''Tarquin:''' Hello and a belated welcome to the wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Draconx/RuneUT</title>
    <id>1074</id>
    <revision>
      <id>2852</id>
      <timestamp>2005-07-11T03:39:02Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About===

RuneUT is my first real mod I've been working on for UT.  Inspired by Rune Quake, it is a mod which Runes spawn randomly around the level - carrying one grants you a special power.  The runes are basically normal inventory items that can be activated (by the command 'mutate UseRune') or dropped (by the command 'mutate DropRune').  You can only carry one rune at a time.

Should work with most gametypes/mutators - RuneUT is a mutator just like any other.

===Configuration===

My first UWindow thing.  Borrows heavily from the Mutator screen and the Weapons screen.  (Hey, they have already written code that does exactly what I want, why write it again?)

[[Image:Legacy_draconx-runeut-configuration.png|left|The RuneUT Configuration Screen]]

===Runes===

Below is a list of basically finished, (mostly) working runes in the mod's current state, with a brief description of each.  Some runes may seem familiar to those who have played the original Rune Quake or Rune Quake III.

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Rune List===
 
|-
| style=&quot;text-align: center&quot; |'''Rune Name'''
| style=&quot;text-align: center&quot; |'''Description''' 
|-
| style=&quot;text-align: center&quot; |Ice Traps
| style=&quot;text-align: center&quot; |Lay 5 frosty traps to freeze enemies in their tracks 
|-
| style=&quot;text-align: center&quot; |Berserk
| style=&quot;text-align: center&quot; |Deal 6x your normal damage, but take 3x normal as well 
|-
| style=&quot;text-align: center&quot; |Death Traps
| style=&quot;text-align: center&quot; |Lay 3 deadly traps to obliterate your enemies 
|-
| style=&quot;text-align: center&quot; |Rune Bomb
| style=&quot;text-align: center&quot; |Drop a false rune which explodes on contact 
|-
| style=&quot;text-align: center&quot; |Shielding
| style=&quot;text-align: center&quot; |Become invulnerable for a limited time 
|-
| style=&quot;text-align: center&quot; |Luck
| style=&quot;text-align: center&quot; |Teleport randomly 
|-
| style=&quot;text-align: center&quot; |Strength
| style=&quot;text-align: center&quot; |Deal 2x normal damage 
|-
| style=&quot;text-align: center&quot; |Regeneration
| style=&quot;text-align: center&quot; |Gradually regenerate health 
|-
| style=&quot;text-align: center&quot; |Phasing
| style=&quot;text-align: center&quot; |Pass through walls for a limited time 
|-
| style=&quot;text-align: center&quot; |Cloaking
| style=&quot;text-align: center&quot; |You are invisible when not firing 
|-
| style=&quot;text-align: center&quot; |Divine Wind
| style=&quot;text-align: center&quot; |Kamikaze attack decimates your enemies 
|-
| style=&quot;text-align: center&quot; |Protection
| style=&quot;text-align: center&quot; |Protects from traps and environmental damage 
|-
| style=&quot;text-align: center&quot; |Lightning
| style=&quot;text-align: center&quot; |Attacks nearby enemies with bolts of lightning 
|-
| style=&quot;text-align: center&quot; |Speed
| style=&quot;text-align: center&quot; |Run faster 
|-
| style=&quot;text-align: center&quot; |Targeting
| style=&quot;text-align: center&quot; |Easily spot enemies 
|-
| style=&quot;text-align: center&quot; |Negation
| style=&quot;text-align: center&quot; |Obliterate a target's inventory 
|-
| style=&quot;text-align: center&quot; |Vampire
| style=&quot;text-align: center&quot; |Leech life whenever you deal damage 
|-
| style=&quot;text-align: center&quot; |Vengeance
| style=&quot;text-align: center&quot; |Deal damage back whenever you take some 
|-
| style=&quot;text-align: center&quot; |Self Preservation
| style=&quot;text-align: center&quot; |Your own attacks cannot hurt you 
|-
| style=&quot;text-align: center&quot; |Translocation
| style=&quot;text-align: center&quot; |You can use a translocator 
|-
| style=&quot;text-align: center&quot; |Flight
| style=&quot;text-align: center&quot; |You have the ability to fly 
|-
| style=&quot;text-align: center&quot; |Resistance
| style=&quot;text-align: center&quot; |You take half damage 
|-
| style=&quot;text-align: center&quot; |Illusion
| style=&quot;text-align: center&quot; |Place illusionary images of yourself 
|-
| style=&quot;text-align: center&quot; |Poison
| style=&quot;text-align: center&quot; |Place venomous traps flooding toxin all over an area 
|-
| style=&quot;text-align: center&quot; |Ammo Regen
| style=&quot;text-align: center&quot; |Gradually regenerate ammunition 
|-
| style=&quot;text-align: center&quot; |Sight
| style=&quot;text-align: center&quot; |Observe the arena with a remote-controlled viewpoint 
|}</text>
    </revision>
    <revision>
      <id>2853</id>
      <timestamp>2005-07-03T02:22:45Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*Added further info on my mod</comment>
      <text xml:space="preserve">===About===

RuneUT is my first real mod I've been working on for UT.  Inspired by Rune Quake, it is a mod which Runes spawn randomly around the level - carrying one grants you a special power.  The runes are basically normal inventory items that can be activated (by the command 'mutate UseRune') or dropped (by the command 'mutate DropRune').  You can only carry one rune at a time.

Should work with most gametypes/mutators - RuneUT is a mutator just like any other.

===Configuration===

My first UWindow thing.  Borrows heavily from the Mutator screen and the Weapons screen.  (Hey, they have already written code that does exactly what I want, why write it again?)

[[Image:Legacy_draconx-runeut-configuration.png|left|The RuneUT Configuration Screen]]

===Runes===

Below is a list of basically finished, (mostly) working runes in the mod's current state, with a brief description of each.  Some runes may seem familiar to those who have played the original Rune Quake or Rune Quake III.

{| class=&quot;wikitable&quot;

|-
| colspan=&quot;2&quot; style=&quot;text-align: center&quot; |
===Rune List===
 
|-
| style=&quot;text-align: center&quot; |'''Rune Name'''
| style=&quot;text-align: center&quot; |'''Description''' 
|-
| style=&quot;text-align: center&quot; |Ice Traps
| style=&quot;text-align: center&quot; |Lay 5 frosty traps to freeze enemies in their tracks 
|-
| style=&quot;text-align: center&quot; |Berserk
| style=&quot;text-align: center&quot; |Deal 6x your normal damage, but take 3x normal as well 
|-
| style=&quot;text-align: center&quot; |Death Traps
| style=&quot;text-align: center&quot; |Lay 3 deadly traps to obliterate your enemies 
|-
| style=&quot;text-align: center&quot; |Rune Bomb
| style=&quot;text-align: center&quot; |Drop a false rune which explodes on contact 
|-
| style=&quot;text-align: center&quot; |Shielding
| style=&quot;text-align: center&quot; |Become invulnerable for a limited time 
|-
| style=&quot;text-align: center&quot; |Luck
| style=&quot;text-align: center&quot; |Teleport randomly 
|-
| style=&quot;text-align: center&quot; |Strength
| style=&quot;text-align: center&quot; |Deal 2x normal damage 
|-
| style=&quot;text-align: center&quot; |Regeneration
| style=&quot;text-align: center&quot; |Gradually regenerate health 
|-
| style=&quot;text-align: center&quot; |Phasing
| style=&quot;text-align: center&quot; |Pass through walls for a limited time 
|-
| style=&quot;text-align: center&quot; |Cloaking
| style=&quot;text-align: center&quot; |You are invisible when not firing 
|-
| style=&quot;text-align: center&quot; |Divine Wind
| style=&quot;text-align: center&quot; |Kamikaze attack decimates your enemies 
|-
| style=&quot;text-align: center&quot; |Protection
| style=&quot;text-align: center&quot; |Protects from traps and environmental damage 
|-
| style=&quot;text-align: center&quot; |Lightning
| style=&quot;text-align: center&quot; |Attacks nearby enemies with bolts of lightning 
|-
| style=&quot;text-align: center&quot; |Speed
| style=&quot;text-align: center&quot; |Run faster 
|-
| style=&quot;text-align: center&quot; |Targeting
| style=&quot;text-align: center&quot; |Easily spot enemies 
|-
| style=&quot;text-align: center&quot; |Negation
| style=&quot;text-align: center&quot; |Obliterate a target's inventory 
|-
| style=&quot;text-align: center&quot; |Vampire
| style=&quot;text-align: center&quot; |Leech life whenever you deal damage 
|-
| style=&quot;text-align: center&quot; |Vengeance
| style=&quot;text-align: center&quot; |Deal damage back whenever you take some 
|-
| style=&quot;text-align: center&quot; |Self Preservation
| style=&quot;text-align: center&quot; |Your own attacks cannot hurt you 
|-
| style=&quot;text-align: center&quot; |Translocation
| style=&quot;text-align: center&quot; |You can use a translocator 
|-
| style=&quot;text-align: center&quot; |Flight
| style=&quot;text-align: center&quot; |You have the ability to fly 
|-
| style=&quot;text-align: center&quot; |Resistance
| style=&quot;text-align: center&quot; |You take half damage 
|-
| style=&quot;text-align: center&quot; |Illusion
| style=&quot;text-align: center&quot; |Place illusionary images of yourself 
|-
| style=&quot;text-align: center&quot; |Poison
| style=&quot;text-align: center&quot; |Place venomous traps flooding toxin all over an area 
|-
| style=&quot;text-align: center&quot; |Ammo Regen
| style=&quot;text-align: center&quot; |Gradually regenerate ammunition 
|}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dragonmaw</title>
    <id>1021</id>
    <revision>
      <id>2738</id>
      <timestamp>2003-12-12T23:31:47Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Myself==

I'm a modeller and general ranter from Spokane Washington.  I enjoy helping people out and goofing off.  I generally help anybody I see in need, even if I get into trouble myself.

==Projects==
* [[Legacy:Mod Ideas/Block Wars|Mod Ideas/Block Wars]]
* [[Legacy:Red Planet|Red Planet]]
* [[Legacy:Mod Ideas/Real Terrain|Mod Ideas/Real Terrain]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shotgun Mod]]
* Various other stuff

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]

[http://s3.invisionfree.com/Program_Haven Programmer's Haven]

===Comments===

'''MythOpus:''' Hey, Welcome To The Wiki !

'''Dragonmaw:''' Thanks.  I'm more of a modeller than a coder, but I can be pretty brilliant with mathematics and might contribute to the coding section every once in a while

'''Wormbo:''' Hi. Those new contributers you welcomed, did they actually contribute or did you only find them in the list who's online?

'''Dragonmaw:''' I dunno :P  I'm just welcoming them

'''Wormbo:''' Please only welcome people you see on [[Legacy:Recent Changes|Recent Changes]]. Many people create an account but don't actually contribute.

'''Dragonmaw:''' Fine, I won't greet everyone.

'''GRAF1K:''' It isn't to discourage beeing friendly, but creating a page for everyone you see could make a lot of pages for admins to delete. It's not a big thing, just an idea.

'''Ch3z:''' Creating a page? You mean that each edit to any page creates a back up of the old page and therefore more work for admin? Or was there actually a page created to welcome someone? The reason I ask is because if each edit = more work I'll use preview more before I save.

'''Wormbo:''' Yes, each edit is backed up so it can easily be reverted.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2739</id>
      <timestamp>2003-11-26T22:03:24Z</timestamp>
      <contributor>
        <ip>168.212.165.xxx</ip>
      </contributor>
      <comment>Adding other projects I'm working on</comment>
      <text xml:space="preserve">==Myself==

I'm a modeller and general ranter from Spokane Washington.  I enjoy helping people out and goofing off.  I generally help anybody I see in need, even if I get into trouble myself.

==Projects==
* [[Legacy:Mod Ideas/Block Wars|Mod Ideas/Block Wars]]
* [[Legacy:Red Planet|Red Planet]]
* [[Legacy:Mod Ideas/Real Terrain|Mod Ideas/Real Terrain]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CC Units For UA]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shotgun Mod]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Warcraft 3 Maps]]
* Various other stuff

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]

===Comments===

'''MythOpus:''' Hey, Welcome To The Wiki !

'''Dragonmaw:''' Thanks.  I'm more of a modeller than a coder, but I can be pretty brilliant with mathematics and might contribute to the coding section every once in a while

'''Wormbo:''' Hi. Those new contributers you welcomed, did they actually contribute or did you only find them in the list who's online?

'''Dragonmaw:''' I dunno :P  I'm just welcoming them

'''Wormbo:''' Please only welcome people you see on [[Legacy:Recent Changes|Recent Changes]]. Many people create an account but don't actually contribute.

'''Dragonmaw:''' Fine, I won't greet everyone.

'''GRAF1K:''' It isn't to discourage beeing friendly, but creating a page for everyone you see could make a lot of pages for admins to delete. It's not a big thing, just an idea.

'''Ch3z:''' Creating a page? You mean that each edit to any page creates a back up of the old page and therefore more work for admin? Or was there actually a page created to welcome someone? The reason I ask is because if each edit = more work I'll use preview more before I save.

'''Wormbo:''' Yes, each edit is backed up so it can easily be reverted.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2740</id>
      <timestamp>2003-12-12T23:23:50Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Myself==

I'm a modeller and general ranter from Spokane Washington.  I enjoy helping people out and goofing off.  I generally help anybody I see in need, even if I get into trouble myself.

==Projects==
* [[Legacy:Mod Ideas/Block Wars|Mod Ideas/Block Wars]]
* [[Legacy:Red Planet|Red Planet]]
* [[Legacy:Mod Ideas/Real Terrain|Mod Ideas/Real Terrain]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CC Units For UA]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shotgun Mod]]
* Various other stuff

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]

[http://s3.invisionfree.com/Program_Haven Programmer's Haven]

===Comments===

'''MythOpus:''' Hey, Welcome To The Wiki !

'''Dragonmaw:''' Thanks.  I'm more of a modeller than a coder, but I can be pretty brilliant with mathematics and might contribute to the coding section every once in a while

'''Wormbo:''' Hi. Those new contributers you welcomed, did they actually contribute or did you only find them in the list who's online?

'''Dragonmaw:''' I dunno :P  I'm just welcoming them

'''Wormbo:''' Please only welcome people you see on [[Legacy:Recent Changes|Recent Changes]]. Many people create an account but don't actually contribute.

'''Dragonmaw:''' Fine, I won't greet everyone.

'''GRAF1K:''' It isn't to discourage beeing friendly, but creating a page for everyone you see could make a lot of pages for admins to delete. It's not a big thing, just an idea.

'''Ch3z:''' Creating a page? You mean that each edit to any page creates a back up of the old page and therefore more work for admin? Or was there actually a page created to welcome someone? The reason I ask is because if each edit = more work I'll use preview more before I save.

'''Wormbo:''' Yes, each edit is backed up so it can easily be reverted.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dragonmaw/Block Wars</title>
    <id>1024</id>
    <revision>
      <id>2745</id>
      <timestamp>2003-10-05T05:21:04Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

===October 4, 2003===

The mod is frozen, being that I am having to learn to code before I can continue.  I also have the design document up for Block wars at the following link:

[[Legacy:Block Wars/DesignDocument|Block Wars/DesignDocument]]

==Comments==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dragonmaw/CC Units For UA</title>
    <id>1027</id>
    <revision>
      <id>2750</id>
      <timestamp>2003-10-06T22:05:25Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

===October 5, 2003===

Here is a pic of the punisher for (I hope) UA! (In MS3D)

[[Image:Legacy_Punisher.gif|center|The punisher in all its unskinned glory!  This is a basic model, not the final version]]

==Comments==

'''Foxpaw:''' What's CC? And what's UA?

'''Dragonmaw:''' CC is one of the 2 official expansions for Total Annihilation.  UA is Unreal Annihilation, a mod focused on recreating TA in UT2003.

'''RDGDanClark:''' I think this is meant to be linked under Dragonmaw's personal page...

'''GRAF1K:''' Please do move this below your personal page, and when you do, please use a more descriptive name. BTW &amp;ndash; I can't see the pic.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dragonmaw/Clan</title>
    <id>1028</id>
    <revision>
      <id>2751</id>
      <timestamp>2003-10-10T02:52:53Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

==Members==

'''Dragonmaw'''

==Comments==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dragonmaw/DesignDocument</title>
    <id>1025</id>
    <revision>
      <id>2746</id>
      <timestamp>2004-06-13T23:35:01Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <minor/>
      <comment>Update again</comment>
      <text xml:space="preserve">'''Name:''' Block Wars

'''Type:''' Total Conversion

'''Outline:''' Block wars is based on a game by Games Workshop set in the Judge Dredd universe.  In Block Wars, the objective is to completely destroy the enemies building.  In order to do this you must deal enough damage to each floor so that the entire building collapses.  In order to deal enough damage to a floor to cause it to collapse, you must destroy all rooms on that floor.  When a room (or floor) collapses, no character may enter it.  The 2 buildings will be connected through any various number of ways.

==Features==

===Classes===
*'''Madman:''' An insanely fast hit and run man who is so insane that no one really knows which side he is on.
*'''CityCorp:''' Your average blocker (a resident of the buildings), they guard the building zealously.  The can put out fires and defuse bombs.
*'''Superhero:''' Limited to one per team, the character can fly and is incredibly tough.  Unfortunately, he can't set bombs, start fires, spray graffiti, or loot.  He is just &quot;too nice&quot;
*'''Punks:''' The kids know how to use weapons.  However, they are mostly used to deface the enemy block with gobs of graffiti.  They are also the only class that can use hoverboards.
*'''Fatties:''' This class is so fat they have to roll on wheels.  The have incredible health, but are exteremly slow.  However, they can deal damage by ramming enemies.
*'''Klegs:''' A lizard-like mercenary for hire, he goes where the money is.  2 per team.

===Weapons===
*'''Knife:''' Your average sharp instrument of death.
*'''Stump Gun:''' Pump-action lethality in your hands.
*'''Spitgun:''' Fires lead at an incredible rate.
*'''Demo Charge:''' Used for demolishing those impetus neighbors.
*'''Flamethrower:''' Setting things on fire is always fun.
*'''Spray Paint:''' Non-Lethal but very demeaning to the soul
*'''Missile Launcher:''' Launches little balls of furious death.
*'''Missile Defense Lazer:''' Shoot down those pesky missiles, or just cause vehicles to explode.  Either way, this is a fun gun.

===Utilities===
*'''Armor:''' Protects your fragile form.
*'''Hoverboard:''' Allows the user to fly.
*'''Jetpack:''' Same as hoverboard.
*'''Various others'''

===Maps===
*'''Line of Fire:''' The buildings are directly across from each other.  Let the slaughter begin!

===Features===
*You may set a room on fire to deal it damage and potentially burn down the whole building
*You can fly
*Vehicles to traverse the streets
*You may spray paint a room or window to increase your total points.
*You may loot specific rooms in the building to get weapons, utilities, etc.
*After a while another team is spawned called the &quot;Judges&quot;.  Their goal is to kill every last one of the blockers.  When they spawn spawning is turned off for the blockers.  As soon as all blockers are dead, the game ends.

==Team==

===Leaders===
*'''Dragonmaw:''' Lead Modelling, Founder
*'''MythOpus:''' Lead Coder

==Comments==

'''MythOpus:''' Nice idea, It'll take some time to code however...  what will the spray paint do in the game though?  I might start coding for this soon :D

'''MythOpus:''' Oopsies !  I don't think you should have it on this page.  It might confuse people ;)  IMO you should make it a subclass of your personal page or move this to the ModIdeas page :D

'''Dragonmaw:''' Yeah I need to set it as a subclass.  The Spray Paint ingame will, when used, cause a selectable image to appear on the surface you are spraying on.  And it would be great if you could help code, since I only know basic code.  I'm more of a modeller/mapper

'''Mythopus:''' So it just behaves like the sprayer in Counter-Strike ?  Ya, sure I'll help code :D  I wont' be on the computer for awhile though, but when I get back, I'll start I guess :D

'''Dragonmaw:''' Yay! I'm gonna go ahead and add you to the leaders section of the document.  At least we now have someone who can do heavy-duty coding, not this light shit I do :P

'''MythOpus:''' LoL.  Well I don't know about heavy-duty coding right away but I'm sure doing some of this stuff will be simple :D The Sprayer could be made from a Projector that can be spawned at the press of a key-binded button :)  The hover boards can be made by simply making a new ' Hover Board ' model and changing some properties of the bulldog and well ya... lol.  Can you get into a little bit more detail on how to destroy a ' level ' and what do you mean by ' blocks ' ? Thanks for adding me to the leaders BTW :D

'''Dragonmaw:''' In order to destroy a &quot;room&quot; or &quot;level&quot; you must deal enough damage to either the supports or the walls themselves.  A level is destroyed when all the rooms on that particular level are destroyed.  And a &quot;block&quot; is Judge Dredd slang for a multi-story building

'''Mosquito:''' Each floor could be a static mesh, and when damage is delt, it switches to a SM that is more damaged looking until it becomes a mangled mess that is inhosipital, when all the floors in a group have reached maxium damage, they whole building just collaspes.

'''MythOpus:'''  
*'''Levels/Floors:'''That just seems... wrong and it might be difficult for certain mappers to make a WHOLE level as a static mesh because the only way to effectively do that is to make a static mesh in an external 3D program becasue making them in UED screws everything up.  I was thinking more about making static meshes of things that are more likely to explode or get burned and then do what you suggested to change the static mesh.  Also, If you've played Zelda: Links Awakening for gameboy and if you remember Level 7 where you had to destry all the pillars on a certain floor and eventually destry all the floors to get to the Big Boss.  I suggest something like this where you have to do a set amount of damge to certain pillars or walls on a particular floor to destroy that floor.  Also, I was thinking of using a custom  'volume' zone to, when enough damage has been done to the building inside that zone, something would happen to that area that would suggest that it was destroyed.
* '''Hud:'''  For the hud, I was thiking of how to show the current damage to the floors of your building and the enemies building and I came up with this.  There could be Mini-Maps on the left and right side of the map showing the floor of the building that your on.  Left will be '''YOUR''' Building and the right will be the '''ENEMIES''' building.  I have some other ideas for this... 1.  Only show the floors of the building that your on/in.  Example... if your on the 2nd floor of your base, the enemies floor won't show.  and if your in Their base, only the enemies floor will show up.  Or... 2.  Split the height of the level up with volumes and when your in a volume that is in the same zone as in a floor of another building, the floor-map will show up for that floor. Example, if your on the 3rd floor of your building, the 3rd floor of the enemies building will also show up.  The floor-map of your base can also be like a constant showing thing....

'''Foxpaw:''' How about, for destroying the buildings and whatnot, you just make decals last forever (so the more times it was hit the more scorched/damaged looking it would be) plus whenever the building gets damaged it would spawn some debris and little rocks and junk to fall out of wherever it got hit, then once a part of building was damaged enough the whole thing could disappear (via mover) and a bunch of dust and junk would come out.

'''MythOpus:''' That would work too :).... waits patiently for the last 5 mins he has on the computers at school for Dragonmaw to reply...

'''Dragonmaw:''' I discussed both ways with my dad, who got the idea for this, a long time ago.  Either way works with him, so either way works for me.  I like the idea for the HUD, great concept.

'''Dragonmaw:''' Have you worked on any of the code for this MythOpus, or do I need to learn it myself.  I don't really wanna do it myself coding is not my forte.

'''MythOpus:''' Eek !  I forgot about this.  Actually, yes, I'll put my projects on hold and start working on this asap.  Where do you think I should start?

'''MythOpus:''' I've just started on the classes, however could you send me a little bit more info on what you want each class to be able to do/ not to do and stuff?

'''Dragonmaw:''' Sure.  If you have an IM I can get the info to you like that, if you want.

'''MythOpus:''' Well I have msn... and if you don't have that, just e-mail it to me or post it on the over-friendly wiki :)  My e-mail is mythopus@hotmail.com

'''Draognmaw:''' Ok.  My MSN login is dragonmaw007@hotmail.com.  By the way don't feel bad about not working on it I completely forgot about the project until my dad asked me how it was going.  And the models on the main page have been deleted because a virus infected them :(

'''Mythopus:''' You already had models ? Wo.. lol.  I am currently trying to get the Destroying the levels system to work...

'''Dragonmaw:''' Could you tell me your MSN messenger account so that I can give you more info faster?  Thanks.

'''MythOpus:''' Eh... it's the sane as my e-mail ( mythopus@hotmail.com )

'''MythOpus:''' I wonder if Dragonmaw is dea... anyhoo, I have been working again on this mod. Progress... well, I'm not sure I can actally call it progress. I'm still trying to work out the kicks in my first version of the &quot; Destroying Levels&quot; code but it is going as well as expected.

'''Dragonmaw:''' I'm back from an &quot;extended&quot; vaction, so work should be forging ahead pretty soon.

'''Mythopus:''' Well, since your back... :P I don't have anything else I'm working on anymore since Team Invasion is done :)  Let's get started again.

'''Dragonmaw:''' Crap.  I'm leaving on Tuesday for sunny San Francisco, so until I get back MythOpus is project lead, able to hire as he sees fit.</text>
    </revision>
    <revision>
      <id>2747</id>
      <timestamp>2004-06-13T06:38:02Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Ah :)</comment>
      <text xml:space="preserve">'''Name:''' Block Wars

'''Type:''' Total Conversion

'''Outline:''' Block wars is based on a game by Games Workshop set in the Judge Dredd universe.  In Block Wars, the objective is to completely destroy the enemies building.  In order to do this you must deal enough damage to each floor so that the entire building collapses.  In order to deal enough damage to a floor to cause it to collapse, you must destroy all rooms on that floor.  When a room (or floor) collapses, no character may enter it.  The 2 buildings will be connected through any various number of ways.

==Features==

===Classes===
*'''Madman:''' Speed: Very Fast  Health: Low  Special: If killed with friendly fire, does not count as a TK
*'''CityCorp:''' Your average blocker (a resident of the buildings), they guard the building zealously.  The can put out fires and defuse bombs.
*'''Superhero:''' Limited to one per team, the character can fly and is incredibly tough.  Unfortunately, he can't set bombs, start fires, spray graffiti, or loot.  He is just &quot;too nice&quot;
*'''Punks:''' The kids know how to use weapons.  However, they are mostly used to deface the enemy block with gobs of graffiti.  They are also the only class that can use hoverboards.
*'''Fatties:''' This class is so fat they have to roll on wheels.  The have incredible health, but are exteremly slow.  However, they can deal damage by ramming enemies.

===Weapons===
*'''Knife:''' Your average sharp instrument of death.
*'''Stump Gun:''' Pump-action lethality in your hands.
*'''Spitgun:''' Fires lead at an incredible rate.
*'''Demo Charge:''' Used for demolishing those impetus neighbors.
*'''Flamethrower:''' Setting things on fire is always fun.
*'''Spray Paint:''' Non-Lethal but very demeaning to the soul
*'''Missile Launcher:''' Launches little balls of furious death.
*'''Missile Defense Lazer:''' Shoot down those pesky missiles, or just cause vehicles to explode.  Either way, this is a fun gun.

===Utilities===
*'''Armor:''' Protects your fragile form.
*'''Hoverboard:''' Allows the user to fly.
*'''Jetpack:''' Same as hoverboard.
*'''Various others'''

===Maps===
*'''Line of Fire:''' The buildings are directly across from each other.  Let the slaughter begin!

===Features===
*You may set a room on fire to deal it damage and potentially burn down the whole building
*You can fly
*Vehicles to traverse the streets
*You may spray paint a room or window to increase your total points.
*You may loot specific rooms in the building to get weapons, utilities, etc.
*After a while another team is spawned called the &quot;Judges&quot;.  Their goal is to kill every last one of the blockers.  When they spawn spawning is turned off for the blockers.  As soon as all blockers are dead, the game ends.

==Team==

===Leaders===
*'''Dragonmaw:''' Lead Modelling, Founder
*'''MythOpus:''' Lead Coder

==Comments==

'''MythOpus:''' Nice idea, It'll take some time to code however...  what will the spray paint do in the game though?  I might start coding for this soon :D

'''MythOpus:''' Oopsies !  I don't think you should have it on this page.  It might confuse people ;)  IMO you should make it a subclass of your personal page or move this to the ModIdeas page :D

'''Dragonmaw:''' Yeah I need to set it as a subclass.  The Spray Paint ingame will, when used, cause a selectable image to appear on the surface you are spraying on.  And it would be great if you could help code, since I only know basic code.  I'm more of a modeller/mapper

'''Mythopus:''' So it just behaves like the sprayer in Counter-Strike ?  Ya, sure I'll help code :D  I wont' be on the computer for awhile though, but when I get back, I'll start I guess :D

'''Dragonmaw:''' Yay! I'm gonna go ahead and add you to the leaders section of the document.  At least we now have someone who can do heavy-duty coding, not this light shit I do :P

'''MythOpus:''' LoL.  Well I don't know about heavy-duty coding right away but I'm sure doing some of this stuff will be simple :D The Sprayer could be made from a Projector that can be spawned at the press of a key-binded button :)  The hover boards can be made by simply making a new ' Hover Board ' model and changing some properties of the bulldog and well ya... lol.  Can you get into a little bit more detail on how to destroy a ' level ' and what do you mean by ' blocks ' ? Thanks for adding me to the leaders BTW :D

'''Dragonmaw:''' In order to destroy a &quot;room&quot; or &quot;level&quot; you must deal enough damage to either the supports or the walls themselves.  A level is destroyed when all the rooms on that particular level are destroyed.  And a &quot;block&quot; is Judge Dredd slang for a multi-story building

'''Mosquito:''' Each floor could be a static mesh, and when damage is delt, it switches to a SM that is more damaged looking until it becomes a mangled mess that is inhosipital, when all the floors in a group have reached maxium damage, they whole building just collaspes.

'''MythOpus:'''  
*'''Levels/Floors:'''That just seems... wrong and it might be difficult for certain mappers to make a WHOLE level as a static mesh because the only way to effectively do that is to make a static mesh in an external 3D program becasue making them in UED screws everything up.  I was thinking more about making static meshes of things that are more likely to explode or get burned and then do what you suggested to change the static mesh.  Also, If you've played Zelda: Links Awakening for gameboy and if you remember Level 7 where you had to destry all the pillars on a certain floor and eventually destry all the floors to get to the Big Boss.  I suggest something like this where you have to do a set amount of damge to certain pillars or walls on a particular floor to destroy that floor.  Also, I was thinking of using a custom  'volume' zone to, when enough damage has been done to the building inside that zone, something would happen to that area that would suggest that it was destroyed.
* '''Hud:'''  For the hud, I was thiking of how to show the current damage to the floors of your building and the enemies building and I came up with this.  There could be Mini-Maps on the left and right side of the map showing the floor of the building that your on.  Left will be '''YOUR''' Building and the right will be the '''ENEMIES''' building.  I have some other ideas for this... 1.  Only show the floors of the building that your on/in.  Example... if your on the 2nd floor of your base, the enemies floor won't show.  and if your in Their base, only the enemies floor will show up.  Or... 2.  Split the height of the level up with volumes and when your in a volume that is in the same zone as in a floor of another building, the floor-map will show up for that floor. Example, if your on the 3rd floor of your building, the 3rd floor of the enemies building will also show up.  The floor-map of your base can also be like a constant showing thing....

'''Foxpaw:''' How about, for destroying the buildings and whatnot, you just make decals last forever (so the more times it was hit the more scorched/damaged looking it would be) plus whenever the building gets damaged it would spawn some debris and little rocks and junk to fall out of wherever it got hit, then once a part of building was damaged enough the whole thing could disappear (via mover) and a bunch of dust and junk would come out.

'''MythOpus:''' That would work too :).... waits patiently for the last 5 mins he has on the computers at school for Dragonmaw to reply...

'''Dragonmaw:''' I discussed both ways with my dad, who got the idea for this, a long time ago.  Either way works with him, so either way works for me.  I like the idea for the HUD, great concept.

'''Dragonmaw:''' Have you worked on any of the code for this MythOpus, or do I need to learn it myself.  I don't really wanna do it myself coding is not my forte.

'''MythOpus:''' Eek !  I forgot about this.  Actually, yes, I'll put my projects on hold and start working on this asap.  Where do you think I should start?

'''MythOpus:''' I've just started on the classes, however could you send me a little bit more info on what you want each class to be able to do/ not to do and stuff?

'''Dragonmaw:''' Sure.  If you have an IM I can get the info to you like that, if you want.

'''MythOpus:''' Well I have msn... and if you don't have that, just e-mail it to me or post it on the over-friendly wiki :)  My e-mail is mythopus@hotmail.com

'''Draognmaw:''' Ok.  My MSN login is dragonmaw007@hotmail.com.  By the way don't feel bad about not working on it I completely forgot about the project until my dad asked me how it was going.  And the models on the main page have been deleted because a virus infected them :(

'''Mythopus:''' You already had models ? Wo.. lol.  I am currently trying to get the Destroying the levels system to work...

'''Dragonmaw:''' Could you tell me your MSN messenger account so that I can give you more info faster?  Thanks.

'''MythOpus:''' Eh... it's the sane as my e-mail ( mythopus@hotmail.com )

'''MythOpus:''' I wonder if Dragonmaw is dea... anyhoo, I have been working again on this mod. Progress... well, I'm not sure I can actally call it progress. I'm still trying to work out the kicks in my first version of the &quot; Destroying Levels&quot; code but it is going as well as expected.

'''Dragonmaw:''' I'm back from an &quot;extended&quot; vaction, so work should be forging ahead pretty soon.

'''Mythopus:''' Well, since your back... :P I don't have anything else I'm working on anymore since Team Invasion is done :)  Let's get started again.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dragonmaw/Developer Journal</title>
    <id>1026</id>
    <revision>
      <id>2748</id>
      <timestamp>2003-10-12T04:46:00Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

===October 11, 2003===

I have run into some very interesting studies in my schoolwork.  For example, the Bean Trees is the crappiest book ever made :D  Anyway, being that I am busy with schoolwork I will probably answer stuff @ school

===October 4, 2003===

I'm currently working on models for UA and Block Wars while trying to learn some UScript.  Stupid boolean varibles!  Well, at least I know how to model and map. Yay!  Anyway, I'll be posting any good stuff I do here, so watch out!

==Comments==

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2749</id>
      <timestamp>2003-10-05T06:14:31Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==News==

====October 4, 2003====

I'm currently working on models for UA and Block Wars while trying to learn some UScript.  Stupid boolean varibles!  Well, at least I know how to model and map. Yay!  Anyway, I'll be posting any good stuff I do here, so watch out!

==Comments==

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Drawkbox</title>
    <id>1034</id>
    <revision>
      <id>2762</id>
      <timestamp>2004-01-29T18:12:57Z</timestamp>
      <contributor>
        <ip>Drawkbox</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is my wiki page.   I will be here everyday until my MOD launches in MARCH/APRIL (extention of contest to APRIL30 has led me to introduce some functionality that I wanted in game but now I have time).  Just in time to make the contest final window (hopefully &amp;ndash; although this is not my drive for making the game.   I want to make a mod/tc to show skills in teh unreal engine and to make a fun game.). 

Well correction it will be *hopefully* for the end of the contest but may not make it.   My mod is comong along well however I ended up writing alot more than I wanted on the flying vehicles and battle vehicles.   Its a shame as well that I will probably be throwing that away in a few months and using UT2004 code for these tasts.

Currently the game MWorlds (working title) is being build in both UT2003 as a mod and as a full game in the Torque engine.   The UT2003 version is a small piece of the overall story that will be focused on particular battles in the saga.   The battles will take place on Mars under stormy conditions in mine areas with many caverns and dusty places to hide.   The point of the levels (3 so far) is to gather a resource to have enough to obliterate the other team with a super weapon.  The team that collects it the fastest as well as kills the most players wins the level.  Players have to venture into the one mine area of the level and control it enough to send the resource back to their base.  You can kill other players and jack their payload as well as hit their depo (manned by turrets as well &amp;ndash; the vigilante route).

----

'''Wormbo:''' Welcome to the Wiki! :)

'''Phantasmagorium:''' Hi, and welcome to the Wiki! Im Phantasm, the least skilled programmer / mapper here, hehe. Im just really good at commenting and playing maps till Ive done everything possible, including mods I have, etc. Enjoy the Wiki :)

'''dRawkbox:''' Thanks!  Hey all.  I am switching my game into the Unreal Engine after the need for *large* terrain.  I dig the open source of Quake3 but UT2003 engine is as good if not better.  This site is killer for info on teh engine and I already have alot ported over including three levels, 2 weapons, vehicles and almost a flying vehicle (its seriously flawed still I lie).  I was worried about the research to get these items done but there is a wealth here of info.  I messed around with Unreal and UT2003 early on but the Quake3 engine got my attention first but I believe this engine is right for the mod.  If anyone has alot of help on flying vehicles I could use some input but I still have a few months to have that solid.  Enjoying the Wiki!

'''Foxpaw:''' It's relatively simple to create a flying vehicle, though it would be a long process for me to explain how I did it. :P For an alternative, you could look at [[Legacy:KShip|KShip]]. It's not as sophisticated, but probrably more what you were thinking anyway.

'''dRawkbox:''' Hey Foxpaw I am seeing your name alot and have looked at nearly all your work, good stuff.   I am newer to UnrealScript but have been coding C++ for years.   I am having a compile issue on the KShip snippet on the calculation under the UpdateForce method.   I added the inheritance to extend KVehicle but can't get past this as of yet.  I am doing this a bit differently andwill post here when cleaned up (or in a flying document thread).   Is there anything I can do to get past the compile issue I tried many different scenarios and wasn't sure if it was a UScript limitation or an error in the code.   I wish I could code in C++ although this is fun in UScript.  I am able to deal with replication fine for the weapons i have so far and small bits of ported code from quake3 mod (functionality) but just finding the boundaries of UnrealScript is slowy getting there after 3 weeks dealing with it.  I am not looking for exact aeronautical movement but realistic movement that works, in future releases I may put some actual algorithms to work but for my game I am looking at launching it and work on it as its launched.  If you ahve any input on this that would be great.  btw I liked the discussion on the universe on your page, I like your 3dimensional/2d paper stick figure example.  I too believe that it is beyond comprehension but being good humans that we are this will never stop us from pondering.

'''Foxpaw:''' I haven't actually tried the code on that KShip page, I instead wrote my own vehicle classes from actor up. That code looks like it should work pretty good though. I couldn't really say what the problem you might be having is without seeing it.

'''dRawkbox:''' Well I will update it with mine when I get the buggies out.   I think there needs to be a section dedicated to *flying vehicles* I will create hopefully next week when I am zooming around.   I am doing similar approach with KAppplyForce but was basing it off of KVehicle inheritance.   I will look at creating my own tree from Actor as well if I cannot get results soon.  If a vetran is basing it off Actor that tells me something about KVehicle that i may have suspected.  I prefer to write my own code but it is good to share examples of larege milestones.  Hoefully more Unreal coders will be able to use this flying code (I could use it now).  Its not vital to my MOD as the story, models, and maps are ready but would love to have flying vehicles like the Reaver/Mosquito in planetside.   The descent mod idea also looks enticing if anyone wants to pursue this.  I may after my MOD is good.   

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2763</id>
      <timestamp>2004-01-01T23:27:43Z</timestamp>
      <contributor>
        <ip>Drawkbox</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is my wiki page.   I will be here everyday until my MOD launches in JANUARY/FEBRUARY.  Just in time to make the contest final window (hopefully &amp;ndash; although this is not my drive for making the game.   I want to make a mod/tc to show skills in teh unreal engine and to make a fun game.). 

Well correction it will be *hopefully* for the end of the contest but may not make it.   My mod is comong along well however I ended up writing alot more than I wanted on the flying vehicles and battle vehicles.   Its a shame as well that I will probably be throwing that away in a few months and using UT2004 code for these tasts.

Currently the game MWorlds (working title) is being build in both UT2003 as a mod and as a full game in the Torque engine.   The UT2003 version is a small piece of the overall story that will be focused on particular battles in the saga.   The battles will take place on Mars under stormy conditions in mine areas with many caverns and dusty places to hide.   The point of the levels (3 so far) is to gather a resource to have enough to obliterate the other team with a super weapon.  The team that collects it the fastest as well as kills the most players wins the level.  Players have to venture into the one mine area of the level and control it enough to send the resource back to their base.  You can kill other players and jack their payload as well as hit their depo (manned by turrets as well &amp;ndash; the vigilante route).

----

'''Wormbo:''' Welcome to the Wiki! :)

'''Phantasmagorium:''' Hi, and welcome to the Wiki! Im Phantasm, the least skilled programmer / mapper here, hehe. Im just really good at commenting and playing maps till Ive done everything possible, including mods I have, etc. Enjoy the Wiki :)

'''dRawkbox:''' Thanks!  Hey all.  I am switching my game into the Unreal Engine after the need for *large* terrain.  I dig the open source of Quake3 but UT2003 engine is as good if not better.  This site is killer for info on teh engine and I already have alot ported over including three levels, 2 weapons, vehicles and almost a flying vehicle (its seriously flawed still I lie).  I was worried about the research to get these items done but there is a wealth here of info.  I messed around with Unreal and UT2003 early on but the Quake3 engine got my attention first but I believe this engine is right for the mod.  If anyone has alot of help on flying vehicles I could use some input but I still have a few months to have that solid.  Enjoying the Wiki!

'''Foxpaw:''' It's relatively simple to create a flying vehicle, though it would be a long process for me to explain how I did it. :P For an alternative, you could look at [[Legacy:KShip|KShip]]. It's not as sophisticated, but probrably more what you were thinking anyway.

'''dRawkbox:''' Hey Foxpaw I am seeing your name alot and have looked at nearly all your work, good stuff.   I am newer to UnrealScript but have been coding C++ for years.   I am having a compile issue on the KShip snippet on the calculation under the UpdateForce method.   I added the inheritance to extend KVehicle but can't get past this as of yet.  I am doing this a bit differently andwill post here when cleaned up (or in a flying document thread).   Is there anything I can do to get past the compile issue I tried many different scenarios and wasn't sure if it was a UScript limitation or an error in the code.   I wish I could code in C++ although this is fun in UScript.  I am able to deal with replication fine for the weapons i have so far and small bits of ported code from quake3 mod (functionality) but just finding the boundaries of UnrealScript is slowy getting there after 3 weeks dealing with it.  I am not looking for exact aeronautical movement but realistic movement that works, in future releases I may put some actual algorithms to work but for my game I am looking at launching it and work on it as its launched.  If you ahve any input on this that would be great.  btw I liked the discussion on the universe on your page, I like your 3dimensional/2d paper stick figure example.  I too believe that it is beyond comprehension but being good humans that we are this will never stop us from pondering.

'''Foxpaw:''' I haven't actually tried the code on that KShip page, I instead wrote my own vehicle classes from actor up. That code looks like it should work pretty good though. I couldn't really say what the problem you might be having is without seeing it.

'''dRawkbox:''' Well I will update it with mine when I get the buggies out.   I think there needs to be a section dedicated to *flying vehicles* I will create hopefully next week when I am zooming around.   I am doing similar approach with KAppplyForce but was basing it off of KVehicle inheritance.   I will look at creating my own tree from Actor as well if I cannot get results soon.  If a vetran is basing it off Actor that tells me something about KVehicle that i may have suspected.  I prefer to write my own code but it is good to share examples of larege milestones.  Hoefully more Unreal coders will be able to use this flying code (I could use it now).  Its not vital to my MOD as the story, models, and maps are ready but would love to have flying vehicles like the Reaver/Mosquito in planetside.   The descent mod idea also looks enticing if anyone wants to pursue this.  I may after my MOD is good.   

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Drevlin</title>
    <id>944</id>
    <revision>
      <id>2569</id>
      <timestamp>2002-07-06T13:52:25Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Level designer @ Nexs Interactive and former Unreal singleplayer mapper.

Been part of various SP&amp;MP mods for a bunch of Unreal-enginged games.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2570</id>
      <timestamp>2002-03-22T11:50:27Z</timestamp>
      <contributor>
        <ip>H44n1fls31o263.telia.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Level designer @ Nexs Interactive and former Unreal singleplayer mapper.

Been part of various SP&amp;MP mods for a bunch of Unreal-enginged games.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DuckingZone</title>
    <id>966</id>
    <revision>
      <id>2617</id>
      <timestamp>2007-11-19T11:30:07Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; DuckingZone (Custom)}}

[[Image:Legacy_duckingzone-screenshot.jpeg|center|]]

Players in a '''DuckingZone''' actually become smaller when they duck &amp;ndash; unlike normal Unreal Tournament where they just ''appear'' ducked (and are harder to hit with precision weapons).  In a DuckingZone, ducking players can crouch through tunnels that would otherwise be too low for them.

: http://mb.link-m.de/download/DM-DuckingZone.zip

The DuckingZone actor is distributed as a class embedded in DM-DuckingZone.  See [[Legacy:Embedding Code|Embedding Code]] for details on how to get the actor into your own maps.

Created by [[Legacy:Mychaeel|Mychaeel]] by request of LegalAssassin.

There is no need for a UT2003 version of this class because players automatically become smaller when they duck.

==Usage ==

The DuckingZone must start and end somewhere where the player can still safely stand.  If the player would bump his/her head when leaving the zone, he/she'll appear half-way sunk into the ground outside the zone.

[[Image:Legacy_duckingzone-layout.gif|center|The blue lines are zone portals.  The DuckingZone actor is located between the left zone portal and the tunnel.]]

The '''DuckingHeight''' property specifies the [[Legacy:Collision Cylinder|collision height]] of ducked players in this zone.  Note that the collision height is defined to extend from the ''middle'' of the player up and down; in other words, put ''half of the total height'' of a ducked player into this property.

Players ducking in a DuckingZone are subject to a row of undesirable side effects; most importantly, they're much harder to hit than regular players that duck, and their headshot area is smaller as well.  It's not advisable to put a DuckingZone somewhere where players might actually want to shoot at each other.

==Related Topics ==

* [[Legacy:Embedding Code|Embedding Code]]
* [[Legacy:Third-Party Components|Third-Party Components]]
* [[Legacy:Collision Cylinder|Collision Cylinder]]

==Comments ==

'''ZxAnPhOrIaN:''' Nice component Mych! I have a cool reality suggestion: If you can do this, you should have the player crawl through the area, not the ducking state. Otherwise, it is fine!

'''Mychaeel:''' Hmm... not sure whether I understand what you mean.  I'm bound to stick with the normal Unreal Tournament player animations (basically all the DuckingZone does is actually reducing the collision height).  If there's a mod that provides crawling animations and support, modifying the DuckingZone to support that too shouldn't be an issue.

'''ZxAnPhOrIaN:''' I see...

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2618</id>
      <timestamp>2003-10-24T22:42:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>removed off-topic discussion</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; DuckingZone (Custom)}}

[[Image:Legacy_duckingzone-screenshot.jpeg|center|]]

Players in a '''DuckingZone''' actually become smaller when they duck &amp;ndash; unlike normal Unreal Tournament where they just ''appear'' ducked (and are harder to hit with precision weapons).  In a DuckingZone, ducking players can crouch through tunnels that would otherwise be too low for them.

: http://mb.link-m.de/download/DM-DuckingZone.zip

The DuckingZone actor is distributed as a class embedded in DM-DuckingZone.  See [[Legacy:Embedding Code|Embedding Code]] for details on how to get the actor into your own maps.

Created by [[Legacy:Mychaeel|Mychaeel]] by request of LegalAssassin.

There is no need for a UT2003 version of this class because players automatically become smaller when they duck.

==Usage ==

The DuckingZone must start and end somewhere where the player can still safely stand.  If the player would bump his/her head when leaving the zone, he/she'll appear half-way sunk into the ground outside the zone.

[[Image:Legacy_duckingzone-layout.gif|center|The blue lines are zone portals.  The DuckingZone actor is located between the left zone portal and the tunnel.]]

The '''DuckingHeight''' property specifies the [[Legacy:Collision Cylinder|collision height]] of ducked players in this zone.  Note that the collision height is defined to extend from the ''middle'' of the player up and down; in other words, put ''half of the total height'' of a ducked player into this property.

Players ducking in a DuckingZone are subject to a row of undesirable side effects; most importantly, they're much harder to hit than regular players that duck, and their headshot area is smaller as well.  It's not advisable to put a DuckingZone somewhere where players might actually want to shoot at each other.

==Related Topics ==

* [[Legacy:Embedding Code|Embedding Code]]
* [[Legacy:Third-Party Components|Third-Party Components]]
* [[Legacy:Collision Cylinder|Collision Cylinder]]

==Comments ==

'''ZxAnPhOrIaN:''' Nice component Mych! I have a cool reality suggestion: If you can do this, you should have the player crawl through the area, not the ducking state. Otherwise, it is fine!

'''Mychaeel:''' Hmm... not sure whether I understand what you mean.  I'm bound to stick with the normal Unreal Tournament player animations (basically all the DuckingZone does is actually reducing the collision height).  If there's a mod that provides crawling animations and support, modifying the DuckingZone to support that too shouldn't be an issue.

'''ZxAnPhOrIaN:''' I see...

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DumpIntCommandlet</title>
    <id>1062</id>
    <revision>
      <id>2826</id>
      <timestamp>2006-11-12T04:06:40Z</timestamp>
      <contributor>
        <ip>Dial-3007.wroclaw.dialog.net.pl</ip>
      </contributor>
      <comment>mod support quirks</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; DumpIntCommandlet (Package: Editor, no script code)}}

A quick way to [[Legacy:Create An INT File|create an INT file]] in UT2003 and newer.

Simply go to the command prompt, go to {{[[Legacy:Base Directory|Base Directory]]}}\system and type:

 ucc dumpint ''packagename''.u 

Be sure to add the .u extension as it is esential. The DumpInt commandlet will take all the localized properties from your code and create an [[Legacy:INT File|INT file]] for them.  You can then edit it as you wish.

----

ucc.exe dumpint Pkg.u -mod=ModName exports to UT2004 System dir.

ucc.exe dumpint Pkg.u -MOD=ModName says &quot;No packages found matching -MOD=ModName!&quot; then exports to UT2004 System dir.

----

'''OlympusMons:''' Does this work with the mod system in 2k4?? I couldnt seem to get it to work, managed to get the export cache working now though. :P

'''MythOpus:''' I always thought it only worked with UT2004, but yes it does work :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2827</id>
      <timestamp>2004-12-24T01:52:40Z</timestamp>
      <contributor>
        <ip>Hsdbrg64-110-208-168.sasknet.sk.ca</ip>
      </contributor>
      <comment>Response to Olympus</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; DumpIntCommandlet (Package: Editor, no script code)}}

A quick way to [[Legacy:Create An INT File|create an INT file]] in UT2003 and newer.

Simply go to the command prompt, go to {{[[Legacy:Base Directory|Base Directory]]}}\system and type:

 ucc dumpint ''packagename''.u 

Be sure to add the .u extension as it is esential. The DumpInt commandlet will take all the localized properties from your code and create an [[Legacy:INT File|INT file]] for them.  You can then edit it as you wish.

----

'''OlympusMons:''' Does this work with the mod system in 2k4?? I couldnt seem to get it to work, managed to get the export cache working now though. :P

'''MythOpus:''' I always thought it only worked with UT2004, but yes it does work :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34133</id>
      <timestamp>2009-03-20T05:29:47Z</timestamp>
      <contributor>
        <ip>69.207.150.41</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; DumpIntCommandlet (Package: Editor, no script code)}}

A quick way to [[Legacy:Create An INT File|create an INT file]] in UT2003 and newer.

Simply go to the command prompt, go to {{[[Legacy:Base Directory|Base Directory]]}}\system and type:

 ucc dumpint ''packagename''.u 

Be sure to add the .u extension as it is essential. The DumpInt commandlet will take all the localized properties from your code and create an [[Legacy:INT File|INT file]] for them.  You can then edit it as you wish.

----

ucc.exe dumpint Pkg.u -mod=ModName exports to UT2004 System dir.

ucc.exe dumpint Pkg.u -MOD=ModName says &quot;No packages found matching -MOD=ModName!&quot; then exports to UT2004 System dir.

----

'''OlympusMons:''' Does this work with the mod system in 2k4?? I couldnt seem to get it to work, managed to get the export cache working now though. :P

'''MythOpus:''' I always thought it only worked with UT2004, but yes it does work :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dushnok</title>
    <id>1042</id>
    <revision>
      <id>2782</id>
      <timestamp>2004-02-03T00:27:18Z</timestamp>
      <contributor>
        <ip>Dushnok</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hello. Nothing here yet</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DynaMusic</title>
    <id>1049</id>
    <revision>
      <id>2796</id>
      <timestamp>2007-11-19T11:31:21Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==DynaMusic optional music for mappers !==

Usage: 
# Follow the directions for [[Legacy:Embedding Code|Embedding Code]] 
# Place dynamusic actor on your map 
# Right click on it to bring up properties
# Select the DynaMusic/LoadSong property and type in the song &quot;PackageName.SongName&quot; you want to be optional 
# Right click on empty part of map to bring up the level properties 
# Change audio/song to one of the standard UT music packages ( this package won't be optional )

----

The way it works: 
# When the player connects DynaMusic attempts to load music package 
# If it's successful it overides the maps default music (as defined in Level properties), with the optional music

----

&lt;uscript&gt;
//=============================================================================
// DynaMusic.       By Dirk Fist  with all do credit to the people of the Wiki 
//=============================================================================
class DynaMusic expands Actor;

var() string LoadSong;
var music song;
var PlayerPawn MusicPlayer;
var bool bMusicStarted;
var int started;

replication
{   // Variables which will cause replication to all (relevant) clients
    reliable if ( Role == ROLE_Authority )
        started,LoadSong;
}

function PreBeginPlay()           // executed on server
{
    started +=1;                  // force replication
    Super.PreBeginPlay();
}

auto simulated state startup
{
Begin:
    log(&quot;Started&quot;,'Dynamusic');
    song = music(DynamicLoadObject( LoadSong, class'Music',True));
    if (song!=None)
    {   // we got a song lets find player
        log(string(song.Class),'Dynamusic');

        foreach AllActors(class 'PlayerPawn', MusicPlayer)
            if (Viewport(MusicPlayer.Player) != None)  break; 
        if (MusicPlayer != None)
        {   // We got player lets play 
            MusicPlayer.ClientSetMusic( song, Level.SongSection, Level.CdTrack, MTRAN_Fade );    
            log(MusicPlayer.PlayerReplicationInfo.PlayerName,'Dynamusic');        
    }   }
}

defaultproperties
{
    bAlwaysRelevant=True
    RemoteRole=ROLE_SimulatedProxy
}
&lt;/uscript&gt;

----

'''Dirk Fist:''' My First Wiki Project :)

'''Dirk Fist:''' Can I upload a .u or .unr file ?

'''Dirk Fist:''' Found some info on making the packages optional http://unreal.epicgames.com/UTMagic.html#PackageFlags

'''Dirk Fist:''' If any one knows another way I'd be glad to hear it? Since I don't want to cause version conflicts for maps that use non-optional umx(ogg?) version of the file, Since this is a mapping component and many mappers will probably borrow music from other maps.

'''Wormbo:''' UT200x's OGG files aren't Unreal packages and won't be sent from the server. (They are already optional.) In UT non-optional music packages are sent by the server because the map's dependancy on the music package automatically makes it a ServerPackage. BTW: It's better to put the music loading code in PostBeginPlay() and skip the state code alltogether. Make the whole thing a non-replicated bStatic and/or bNoDelete actor and you won't need to replicate anything because the property LoadSong is already set by the mapper and the actor exists on all clients already.

'''Dirk Fist:''' Thanks for the suggestions. I tried alot of stuff before getting it to work.  I had alot of trouble with the actor not existing until the first replication event. Also for some reason if LoadSong is different from class default then it needs to be replicated to work with pure6E. And although the definition for DynamicLoadObject may not be latent it seems to behave that way for music file's that are very large (Check past revisions of [[Legacy:Dirk Fist|Dirk Fist]] ) 

'''Dirk Fist:''' Did'nt mean to sound so defensive. Could someone explain the proper use of bStatic, bNoDelete, and Non-replicated actors link it from [[Legacy:Chain Of Events When Spawning Actors|Chain of Events When Spawning Actors]], [[Legacy:Netcode Idioms|Netcode Idioms]], and [[Legacy:Replication|Replication]]. 

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2797</id>
      <timestamp>2004-03-10T09:15:50Z</timestamp>
      <contributor>
        <ip>Dirk Fist</ip>
      </contributor>
      <comment>Clarafication please</comment>
      <text xml:space="preserve">==DynaMusic optional music for mappers !==

Usage: 
# Follow the directions for [[Legacy:Embedding Code|Embedding Code]] 
# Place dynamusic actor on your map 
# Right click on it to bring up properties
# Select the DynaMusic/LoadSong property and type in the song &quot;PackageName.SongName&quot; you want to be optional 
# Right click on empty part of map to bring up the level properties 
# Change audio/song to one of the standard UT music packages ( this package won't be optional )

----

The way it works: 
# When the player connects DynaMusic attempts to load music package 
# If it's successful it overides the maps default music (as defined in Level properties), with the optional music

----

&lt;uscript&gt;
//=============================================================================
// DynaMusic.       By Dirk Fist  with all do credit to the people of the Wiki 
//=============================================================================
class DynaMusic expands Actor;

var() string LoadSong;
var music song;
var PlayerPawn MusicPlayer;
var bool bMusicStarted;
var int started;

replication
{   // Variables which will cause replication to all (relevant) clients
    reliable if ( Role == ROLE_Authority )
        started,LoadSong;
}

function PreBeginPlay()           // executed on server
{
    started +=1;                  // force replication
    Super.PreBeginPlay();
}

auto simulated state startup
{
Begin:
    log(&quot;Started&quot;,'Dynamusic');
    song = music(DynamicLoadObject( LoadSong, class'Music',True));
    if (song!=None)
    {   // we got a song lets find player
        log(string(song.Class),'Dynamusic');

        foreach AllActors(class 'PlayerPawn', MusicPlayer)
            if (Viewport(MusicPlayer.Player) != None)  break; 
        if (MusicPlayer != None)
        {   // We got player lets play 
            MusicPlayer.ClientSetMusic( song, Level.SongSection, Level.CdTrack, MTRAN_Fade );    
            log(MusicPlayer.PlayerReplicationInfo.PlayerName,'Dynamusic');        
    }   }
}

defaultproperties
{
    bAlwaysRelevant=True
    RemoteRole=ROLE_SimulatedProxy
}
&lt;/uscript&gt;

----

'''Dirk Fist:''' My First Wiki Project :)

'''Dirk Fist:''' Can I upload a .u or .unr file ?

'''Dirk Fist:''' Found some info on making the packages optional http://unreal.epicgames.com/UTMagic.html#PackageFlags

'''Dirk Fist:''' If any one knows another way I'd be glad to hear it? Since I don't want to cause version conflicts for maps that use non-optional umx(ogg?) version of the file, Since this is a mapping component and many mappers will probably borrow music from other maps.

'''Wormbo:''' UT200x's OGG files aren't Unreal packages and won't be sent from the server. (They are already optional.) In UT non-optional music packages are sent by the server because the map's dependancy on the music package automatically makes it a ServerPackage. BTW: It's better to put the music loading code in PostBeginPlay() and skip the state code alltogether. Make the whole thing a non-replicated bStatic and/or bNoDelete actor and you won't need to replicate anything because the property LoadSong is already set by the mapper and the actor exists on all clients already.

'''Dirk Fist:''' Thanks for the suggestions. I tried alot of stuff before getting it to work.  I had alot of trouble with the actor not existing until the first replication event. Also for some reason if LoadSong is different from class default then it needs to be replicated to work with pure6E. And although the definition for DynamicLoadObject may not be latent it seems to behave that way for music file's that are very large (Check past revisions of [[Legacy:Dirk Fist|Dirk Fist]] ) 

'''Dirk Fist:''' Did'nt mean to sound so defensive. Could someone explain the proper use of bStatic, bNoDelete, and Non-replicated actors link it from [[Legacy:Chain Of Events When Spawning Actors|Chain of Events When Spawning Actors]], [[Legacy:Netcode Idioms|Netcode Idioms]], and [[Legacy:Replication|Replication]]. 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dynamic Array</title>
    <id>963</id>
    <revision>
      <id>2612</id>
      <timestamp>2007-12-08T20:21:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>how to find number of items removed</comment>
      <text xml:space="preserve">==Definition==

An array is a series of variables stored together and references as one variable. You can also access individual elements of the array variable. It is often likened to a list &amp;ndash; it could be a list of integers, a list of names, a list of strings, etcetera. You can even have arrays of structs and arrays of references.

A dynamic array is an array that can be lengthened or shortened to accomodate the number of elements in the array. Dynamic arrays support is implemented in UnrealScript starting with UnrealEngine2.

Dynamic arrays have advantages and disadvantages when compared to arrays with a fixed number of elements (for these, see [[Legacy:Variable Syntax|Variable Syntax]]). Dynamic arrays cannot be replicated. However, they can be resized and they are faster than static arrays. Although this may seem strange, it's true - dynamic arrays can actually be accessed '''faster''' than static arrays. However, the difference is primarily academic, as both have an almost negligible access time.

==Syntax==
 var''/''local array&lt;''type''&gt; ''ArrayName'', ...;

The ''type'' can be any of the built-in or self-defined types (structs, enums, classes). After declaration the dynamic array is empty, i.e. the array's length is zero.

'''Note 1:''' UnrealEngine 2 does not bool support bool arrays. You can declare them, but they won't work. Use a byte array instead, it has the least memory usage per element. UnrealEngine 3 correctly supports bool arrays, though.

'''Note 2:''' Be careful when declaring a dynamic array of classes. The correct syntax for this is:
 array&lt;class&lt;''type''&gt; &gt;&lt;/code&gt;

Note the space between the two closing angle brackets. If you don't put the space there, the parser will recognize it as the operator &lt;code&gt;&gt;&gt;&lt;/code&gt; and report a syntax error.

To access a dynamic array use this syntax:

 ''ArrayName''[''element number'']

If you read an array element that doesn't exist because it's beyond the array's length, you'll get a null value (see below) and an &quot;Accessed array out of bounds&quot; [[Legacy:Log Warnings|warning]] is logged.

If you write to an array element that doesn't exist (yet) because the array is too short, the array will automatically increase its length.  All new elements inserted between the former end of the array and the element you are writing to are initialized with their respective null element (zero, empty string or None, depending on the array's type). '''Note:''' Arrays of structs can only be extended that way when assigning ''an entire struct'' not only one property of the struct because only the first really assigns something to the array, while the second actually tries to ''access'' an object (not) stored in the array to modify one of its properties.

'''Note:''' You can't use a combination of dynamic and static arrays.&lt;br /&gt;The declaration &lt;code&gt;var array&lt;string&gt; StringArray[10];&lt;/code&gt; will actually be compiled and used as a static array declared as &lt;code&gt;var string StringArray[10];&lt;/code&gt;

Also declaring dynamic arrays of dynamic arrays won't work. Here you can use the same workaround as mentioned for static arrays in [[Legacy:Variable Syntax|Variable Syntax]].

==Properties and Methods==

Dynamic arrays behave a bit like objects. They have properties and methods to access and modify them.

===UnrealEngine 2===

UnrealEngine 2 provides the following properties and methods:

; Length : Returns the number of elements in the array, similar to ArrayCount(''ArrayName'') for static arrays.  So, for example, if the array has no elements, ''ArrayName.Length'' will have a value of 0 (zero), if the array has 47 elements, ''ArrayName.Length'' will equal 47, and so on.  You can assign a new length using the &lt;code&gt;=&lt;/code&gt; operator. Increasing the length adds empty elements at the end of the array while preserving the existing elements. Decreasing the length removes only the last elements without changing the other ones.&lt;br /&gt;'''Note:''' Only use the &lt;code&gt;=&lt;/code&gt; operator to change the length! Don't pass the length property as an 'out' parameter to a function or operator. This specificly also includes operators like &lt;code&gt;++&lt;/code&gt; or &lt;code&gt;-=-&lt;/code&gt;.

; Remove(''position'', ''number'') : Removes ''number'' elements from the array, starting at ''position''. All elements before ''position'' and from ''position''+''number'' on are not changed, but the element indices change, i.e. the element formerly accessed through ''ArrayName''[''position''+''number''] is accessed through ''ArrayName''[''position''] after the removing.

; Insert(''position'', ''number'') : Inserts ''number'' empty elements into the array at ''position''. The indices of the following elements are increased by ''number'' in order to make room for the new elements. 

===UnrealEngine 3===

In UnrealEngine 3, the following additional dynamic array methods are available:

; Add(''number'') : Adds ''number'' empty elements at the end of the array.
; AddItem(''value'') : Adds ''value'' as new element to the end of the array.
; RemoveItem(''value'') : Removes all occurances of ''value'' from the array. For example &lt;code&gt;ar.RemoveItem(None);&lt;/code&gt; will remove all empty elements from the object array ''ar''. To find out, how many elements were removed you need to compare the length of the array before and after this operation.
; InsertItem(''position'', ''value'') : Inserts ''value'' as new element at index ''position''.
; Find(''value'') : Does a linear search for ''value'' in the array and returns the first matching array index. If the value isn't found, the value INDEX_NONE (i.e. -1) is returned.
; Find(''property'', ''value'') : This is a special version of the Find method for struct arrays. The ''property'' parameter is the name of the struct element ''value'' should be compared to. For example &lt;code&gt;vectorArray.Find('X', 0.0)&lt;/code&gt; will return the first index with the X coordinate being zero. Again, a return value of INDEX_NONE signals that no matching element was found.

UnrealEngine 3 also allows dynamic arrays to be used as iterators in ForEach loops:
; '''foreach''' ''arrayname''(''valuevariable'')
; '''foreach''' ''arrayname''(''valuevariable'', ''indexvariable'') : The ''valuevariable'' needs to be of the same type as the array, the ''indexvariable'' must be of type int. Modifications to the value or index variables will ''not'' write through to the array or otherwise affect the iteration.&lt;br /&gt;'''Note:''' The iteration will skip values if you use the '''Remove'''(i, n) or '''RemoveItem'''(v) methods on the array to remove any elements up to and including the current element. Even using the index version of the iterator and modifying the index variable according to the number of elements removed will ''not'' work. You will have to use an &quot;oldskool&quot; for loop to do this kind of work.

==Dynamic Arrays as Config Variables==

Dynamic arrays can be initialized from .ini files by adding the &lt;code&gt;config&lt;/code&gt; keyword to their [[Legacy:Variable Syntax|declaration]].  Given the following class...

&lt;uscript&gt;
class DynamicArrayTest extends Object
  config;

var config array&lt;string&gt; MyDynamicArray;
&lt;/uscript&gt;

...the corresponding .ini entries look as follows:

  [DynamicArrayTest.DynamicArrayTest]
  MyDynamicArray=first entry
  MyDynamicArray=second entry
  MyDynamicArray=third entry

Note the lack of array indices.

If you leave out the MyDynamicArray, like this:

  [DynamicArrayTest.DynamicArrayTest]

the result will be an empty MyDynamicArray, even if you have default values set in the class' defaultproperties block

==Related Topics==
* [[Legacy:Variable Syntax|Variable Syntax]]
* Dynamic arrays in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealEngine 1]]</text>
    </revision>
    <revision>
      <id>2613</id>
      <timestamp>2007-06-12T19:09:20Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>reply</comment>
      <text xml:space="preserve">==Definition==

An array is a series of variables stored together and references as one variable. You can also access individual elements of the array variable. It is often likened to a list &amp;ndash; it could be a list of integers, a list of names, a list of strings, etcetera. You can even have arrays of structs and arrays of references.

A dynamic array is an array that can be lengthened or shortened to accomodate the number of elements in the array. Dynamic arrays support is implemented in UnrealScript starting with UnrealEngine2.

Dynamic arrays have advantages and disadvantages when compared to arrays with a fixed number of elements (for these, see [[Legacy:Variable Syntax|Variable Syntax]]). Dynamic arrays cannot be replicated. However, they can be resized and they are faster than static arrays. Although this may seem strange, it's true - dynamic arrays can actually be accessed '''faster''' than static arrays. However, the difference is primarily academic, as both have an almost negligible access time.

==Syntax==
 var''/''local array&lt;''type''&gt; ''ArrayName'', ...;

The ''type'' can be any of the built-in or self-defined types (structs, enums, classes).  Note that you can ''declare'' a variable of type &lt;code&gt;array&lt;bool&gt;&lt;/code&gt; and your code will compile fine, but the engine simply ignores assignments to elements of that array, so it's basically worthless.  You'll have to resort to &lt;code&gt;array&lt;byte&gt;&lt;/code&gt; for that. After declaration the dynamic array is empty, i.e. the array's length is zero.

To access a dynamic array use this syntax:

 ''ArrayName''[''element number'']

Dynamic arrays have various properties and methods to modify them:

;''ArrayName''.Length : Returns the number of elements in the array. (Similar to ArrayCount(''ArrayName'') for static arrays.)  So, for example, if the array has no elements, ''ArrayName.Length'' will have a value of 0 (zero).  If the array has 47 elements, ''ArrayName.Length'' will equal 47.  And so on.  You can change this property to add or remove elements from the array. Only use the &lt;code&gt;=&lt;/code&gt; operator for doing this, any other (like e.g. &lt;code&gt;+=&lt;/code&gt;) will not work and might even crash the game.  Increasing the length adds empty elements at the end of the array while preserving the existing elements. Decreasing the length removes only the last elements without changing the other ones.

;''ArrayName''.Remove(''position'', ''number'') : Removes ''number'' elements from the array, starting at ''position''. All elements before ''position'' and from ''position''+''number'' on are not changed, but the element indices change, i.e. the element formerly accessed through ''ArrayName''[''position''+''number''] is accessed through ''ArrayName''[''position''] after the removing.

;''ArrayName''.Insert(''position'', ''number'') : Inserts ''number'' elements into the array at ''position''. The indices of the following elements are increased by ''number'' in order to make room for the new elements. 

If you read an array element that doesn't exist because it's beyond the array's length, you'll get a null value (see below) and an &quot;Accessed array out of bounds&quot; [[Legacy:Log Warnings|warning]] is logged.

If you write to an array element that doesn't exist (yet) because the array is too short, the array will automatically increase its length.  All new elements inserted between the former end of the array and the element you are writing to are initialized with their respective null element (zero, empty string or None, depending on the array's type). '''Note:''' Arrays of structs can only be extended that way when assigning ''an entire struct'' not only one property of the struct because only the first really assigns something to the array, while the second actually tries to ''access'' an object (not) stored in the array to modify one of its properties.

'''Note:''' You can't use a combination of dynamic and static arrays.&lt;br /&gt;The declaration &lt;code&gt;var array&lt;string&gt; StringArray[10];&lt;/code&gt; will actually be compiled and used as a static array declared as &lt;code&gt;var string StringArray[10];&lt;/code&gt;

Also declaring dynamic arrays of dynamic arrays won't work. Here you can use the same workaround as mentioned for static arrays in [[Legacy:Variable Syntax|Variable Syntax]].

==Dynamic Arrays as Config Variables==

Dynamic arrays can be initialized from .ini files by adding the &lt;code&gt;config&lt;/code&gt; keyword to their [[Legacy:Variable Syntax|declaration]].  Given the following class...

&lt;uscript&gt;
class DynamicArrayTest extends Object
  config;

var config array&lt;string&gt; MyDynamicArray;
&lt;/uscript&gt;

...the corresponding .ini entries look as follows:

  [DynamicArrayTest.DynamicArrayTest]
  MyDynamicArray=first entry
  MyDynamicArray=second entry
  MyDynamicArray=third entry

Note the lack of array indices.

If you leave out the MyDynamicArray, like this:

  [DynamicArrayTest.DynamicArrayTest]

the result will be an empty MyDynamicArray, even if you have default values set in the class' defaultproperties block

----

==Dynamic Arrays in UnrealEngine1==

This is an example of [[Legacy:Scripting Operators|Scripting Operators]].

Always wanted to use those elusive array&lt;&gt;'s, but found the GetPropertyText/SetPropertyText interface to be a problem? This is where operators come in. Here I provide a simple interface to a dynamic array of integers (although this is easily adaptable to support various types). You set elements of a dynamic array with 'Array &lt;&lt; (Index:Data)' (totally arbitrary syntax I made up), and access an element with 'Array&lt;Index&gt;'.

&lt;uscript&gt;
class TestDynArray extends CommandLet;
// Our struct to store the index/data pairs created using the : operator
struct SetGroup
{
  var int Index;
  var int NData;
};

// The left side of the Array construct... the one that actually does something.
final operator(50) int &lt; ( DynArray A, int B )
{
  return A.Get( B );
}

// The right side of the Array construct... does absolutely nothing, it's just there to make the syntax pretty (complete the brackets).
final postoperator int &gt; ( int A )
{
  return A;
}

// Sets an element in a dynamic array, taking a index/data pair as the right side.
final operator(50) DynArray &lt;&lt; ( out DynArray A, SetGroup B )
{
  A.Set( B.Index, B.NData );
  return A;
}

// Creates a index/data pair
final operator(23) SetGroup : ( int A, int B )
{
  local SetGroup C;
  C.Index = A;
  C.NData = B;
  return C;
}

// Just a test function to show that we can use all sorts of expressions within the index/data pairs
function int TestFunc()
{
  return 10;
}

function int main( string parm )
{
  local DynArray Arr;
  local int i;
  local setgroup g;

  // Instantiate a DynArray
  Arr = new class'DynArray';

  // Set some elements
  Arr &lt;&lt; (5:78);
  Arr &lt;&lt; (1:30);
  Arr &lt;&lt; (TestFunc():69);

  // And log them
  Log( Arr&lt;5&gt; @ Arr&lt;1&gt; @ Arr&lt;TestFunc()&gt; );
  return 1;
}
&lt;/uscript&gt;

&lt;uscript&gt;
// Interface to dynamic arrays. Evil.
class DynArray extends Object;

var array&lt;int&gt; Data;
var int CacheData[1024];
var int Num;
var bool bCached;

// Parse the elements out of a string like (2,3,5,2,4,6,2), and store them in our cache
function Recache()
{
  local int i;
  local string Nightmare;
  local int NextPos;
  local int z;
  Num = 0;
  Nightmare = GetPropertyText(&quot;Data&quot;);
  Nightmare = Right( NightMare, Len(NightMare)-1 );
  Nightmare = Left( NightMare, Len(NightMare)-1 );
  for(i = InStr( Nightmare, &quot;,&quot; );i &gt; 0;z++)
  {
    CacheData[Num++] = int( Left(Nightmare, i) );
    Nightmare = Mid( Nightmare, i + 1, Len( Nightmare ) );
    i = InStr( Nightmare, &quot;,&quot; );
    if ( i == -1 &amp;&amp; Len(NightMare) &gt; 0 )
      CacheData[Num++] = int( Nightmare );
  }
  bCached = true;
}

// Set an element by building a string like (3,3,5,9), and recache.
function Set( int Index, int Data )
{
  local string Build;
  local int i;
  Recache();
  CacheData[Index] = Data;
  if ( Index &gt; Num-1 )
    Num = Index+1;
  Build = Build $ &quot;(&quot;;
  for(i=0;i&lt;Num;i++)
  {
    Build = Build $ CacheData[i];
    if ( i != Num-1 )
      Build = Build $ &quot;,&quot;;
  }
  Build = Build $ &quot;)&quot;;
  SetPropertyText(&quot;Data&quot;, Build);
  bCached = true;
}

// Get a cached element
function int Get( int Index )
{
  if ( !bCached )
    Recache();

  return CacheData[Index];
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Variable Syntax|Variable Syntax]]

==Comments==

'''Vertigo:''' Is there a way to make an array of classes, such as array&lt;class&lt;Object&gt;&gt; MyArray?

'''MythOpus:''' Of course! :D

'''Wormbo:''' Just make sure you don't write &quot;&gt;&gt;&quot;, but actually put whitespace inbetween: &quot;&gt; &gt;&quot;

'''Juxtapose:''' Taking it one step further, is it possible to have a dynamic array of a mutable class type? What I'm specifically trying to do is something like:

&lt;uscript&gt;
class SmallArray extends Object;

var class myClass;

var array&lt;class &lt;myClass&gt; &gt; data;

//---or---

struct Pair
{
    var int Position;
    var myClass Value;
}
var array&lt;Pair&gt; Pairs;
&lt;/uscript&gt;

I'm trying to create something like a template class in C++ to use a data structure to hold an arbitrary object as the value. Any ideas?

'''Wormbo:''' The type &lt;code&gt;array&lt; class&lt;X&gt; &gt;&lt;/code&gt; will create a dynamic array of class values that are either &lt;code&gt;class'X'&lt;/code&gt; or any subclass of X. The type &lt;code&gt;array&lt;Pair&gt;&lt;/code&gt; will create a dynamic array of Pair structs. In both cases &lt;code&gt;myClass&lt;/code&gt; must be a type name (i.e. a class, struct or enum, but not variable!). 

'''MythOpus:''' Does anyone know how memory 'efficient' Dynamic Arrays are?  I haven't used them in quite awhile and need to load all PathNodes in a given level and add them to this array so I can randomly pick and choose a PathNode to do stuff with.

'''Wormbo:''' DynArrays take up ''capacity''*''elementsize'' bytes of memory, where ''capacity'' may be larger than the actual length of the array and ''elementsize'' in your case is the size of a pointer, i.e. 4 bytes in the 32 bit engine versions. Note that passing arrays as parameters or return values of functions or when assigning them to another variable makes a copy of the entire array.

'''EricBlade:''' MythOpus, try Controller.FindRandomDest() ?

'''MythOpus:''' Thanks for the suggestion but that function doesn't appear to exist?  You can habe a cookie anyways though :)

'''SuperApe:''' ''(under Navigation functions)'' &lt;tt&gt;native(525) final function NavigationPoint FindRandomDest();&lt;/tt&gt;

'''MythOpus:''' Ah... thanks.  My 'find' didn't find it :|</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dynamic Array/UnrealEngine 1</title>
    <id>1086</id>
    <revision>
      <id>2877</id>
      <timestamp>2007-12-08T20:10:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>moved code from DynArrays page</comment>
      <text xml:space="preserve">This is an example of [[Legacy:Scripting Operators|Scripting Operators]].

Always wanted to use those elusive array&lt;&gt;'s, but found the GetPropertyText/SetPropertyText interface to be a problem? This is where operators come in. Here I provide a simple interface to a dynamic array of integers (although this is easily adaptable to support various types). You set elements of a dynamic array with 'Array &lt;&lt; (Index:Data)' (totally arbitrary syntax I made up), and access an element with 'Array&lt;Index&gt;'.

&lt;uscript&gt;
class TestDynArray extends CommandLet;
// Our struct to store the index/data pairs created using the : operator
struct SetGroup
{
  var int Index;
  var int NData;
};

// The left side of the Array construct... the one that actually does something.
final operator(50) int &lt; ( DynArray A, int B )
{
  return A.Get( B );
}

// The right side of the Array construct... does absolutely nothing, it's just there to make the syntax pretty (complete the brackets).
final postoperator int &gt; ( int A )
{
  return A;
}

// Sets an element in a dynamic array, taking a index/data pair as the right side.
final operator(50) DynArray &lt;&lt; ( out DynArray A, SetGroup B )
{
  A.Set( B.Index, B.NData );
  return A;
}

// Creates a index/data pair
final operator(23) SetGroup : ( int A, int B )
{
  local SetGroup C;
  C.Index = A;
  C.NData = B;
  return C;
}

// Just a test function to show that we can use all sorts of expressions within the index/data pairs
function int TestFunc()
{
  return 10;
}

function int main( string parm )
{
  local DynArray Arr;
  local int i;
  local setgroup g;

  // Instantiate a DynArray
  Arr = new class'DynArray';

  // Set some elements
  Arr &lt;&lt; (5:78);
  Arr &lt;&lt; (1:30);
  Arr &lt;&lt; (TestFunc():69);

  // And log them
  Log( Arr&lt;5&gt; @ Arr&lt;1&gt; @ Arr&lt;TestFunc()&gt; );
  return 1;
}
&lt;/uscript&gt;

&lt;uscript&gt;
// Interface to dynamic arrays. Evil.
class DynArray extends Object;

var array&lt;int&gt; Data;
var int CacheData[1024];
var int Num;
var bool bCached;

// Parse the elements out of a string like (2,3,5,2,4,6,2), and store them in our cache
function Recache()
{
  local int i;
  local string Nightmare;
  local int NextPos;
  local int z;
  Num = 0;
  Nightmare = GetPropertyText(&quot;Data&quot;);
  Nightmare = Right( NightMare, Len(NightMare)-1 );
  Nightmare = Left( NightMare, Len(NightMare)-1 );
  for(i = InStr( Nightmare, &quot;,&quot; );i &gt; 0;z++)
  {
    CacheData[Num++] = int( Left(Nightmare, i) );
    Nightmare = Mid( Nightmare, i + 1, Len( Nightmare ) );
    i = InStr( Nightmare, &quot;,&quot; );
    if ( i == -1 &amp;&amp; Len(NightMare) &gt; 0 )
      CacheData[Num++] = int( Nightmare );
  }
  bCached = true;
}

// Set an element by building a string like (3,3,5,9), and recache.
function Set( int Index, int Data )
{
  local string Build;
  local int i;
  Recache();
  CacheData[Index] = Data;
  if ( Index &gt; Num-1 )
    Num = Index+1;
  Build = Build $ &quot;(&quot;;
  for(i=0;i&lt;Num;i++)
  {
    Build = Build $ CacheData[i];
    if ( i != Num-1 )
      Build = Build $ &quot;,&quot;;
  }
  Build = Build $ &quot;)&quot;;
  SetPropertyText(&quot;Data&quot;, Build);
  bCached = true;
}

// Get a cached element
function int Get( int Index )
{
  if ( !bCached )
    Recache();

  return CacheData[Index];
}
&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dynamic Texture</title>
    <id>946</id>
    <revision>
      <id>2574</id>
      <timestamp>2003-05-25T09:46:21Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">Besides normal static textures, the Unreal engine provides [[Legacy:Animated Texture|animated texture]]s and a variety of ''dynamic'' or ''procedural'' textures.  Procedural textures are calculated and re-rendered in real-time and provide realistic-looking, non-repeating smooth texture animations that scale well with the player's framerate.

==Known Classes ==

*[[Legacy:FractalTexture|FractalTexture]]
**[[Legacy:FireTexture|FireTexture]]
**[[Legacy:IceTexture|IceTexture]]
**[[Legacy:WaterTexture|WaterTexture]]
***[[Legacy:WaveTexture|WaveTexture]]
***[[Legacy:WetTexture|WetTexture]]
*[[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]]

==Things to cover ==
* How to create palettes for fire/wave textures

==Web Links ==

* [http://unreal.epicgames.com/Fire/AnimatingTextures.htm Animating Real-time Textures] by Erik de Neve (Epic)

==Related Topics ==

* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Animated Texture|Animated Texture]] &amp;ndash; textures animated as a repeating sequence of static frames

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2575</id>
      <timestamp>2002-09-15T11:04:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Besides normal static textures, the Unreal engine provides [[Legacy:Animated Texture|animated texture]]s and a variety of ''dynamic'' or ''procedural'' textures.  Procedural textures are calculated and re-rendered in real-time and provide realistic-looking, non-repeating smooth texture animations that scale well with the player's framerate.

==Known Classes ==

*[[Legacy:FractalTexture|FractalTexture]]
**[[Legacy:FireTexture|FireTexture]]
**[[Legacy:IceTexture|IceTexture]]
**[[Legacy:WaterTexture|WaterTexture]]
***[[Legacy:WaveTexture|WaveTexture]]
***[[Legacy:WetTexture|WetTexture]]
*[[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]]

==Web Links ==

* [http://unreal.epicgames.com/Fire/AnimatingTextures.htm Animating Real-time Textures] by Erik de Neve (Epic)

==Related Topics ==

* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Animated Texture|Animated Texture]] &amp;ndash; textures animated as a repeating sequence of static frames</text>
    </revision>
    <revision>
      <id>2576</id>
      <timestamp>2002-09-15T11:06:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Besides normal static textures, the Unreal engine provides [[Legacy:Animated Texture|animated texture]]s and a variety of ''dynamic'' or ''procedural'' textures.  Procedural textures are calculated and re-rendered in real-time and provide realistic-looking, non-repeating smooth texture animations that scale well with the player's framerate.

==Known Classes ==

*[[Legacy:FractalTexture|FractalTexture]]
**[[Legacy:FireTexture|FireTexture]]
**[[Legacy:IceTexture|IceTexture]]
**[[Legacy:WaterTexture|WaterTexture]]
***[[Legacy:WaveTexture|WaveTexture]]
***[[Legacy:WetTexture|WetTexture]]
*[[Legacy:ScriptedTexture (UT)|ScriptedTexture (UT)]]

==Things to cover ==
* How to create palettes for fire/wave textures

==Web Links ==

* [http://unreal.epicgames.com/Fire/AnimatingTextures.htm Animating Real-time Textures] by Erik de Neve (Epic)

==Related Topics ==

* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Animated Texture|Animated Texture]] &amp;ndash; textures animated as a repeating sequence of static frames</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DynamicAmbientSound</title>
    <id>1001</id>
    <revision>
      <id>2697</id>
      <timestamp>2006-01-02T18:17:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Basics==

This is a quick way to add position based ambience (amb. that can move) to your map.  Generally you have a radius in UU, a fall off radius, overal volume, and of course occlusion type. (See ESoundOcclusion on [[Legacy:Actor/Enums|Actor/Enums]] for a description of the occlusion types.)

This actor was coded for Ravenshield. It is not present in UT2003 or UT2004.

==Discussion==

'''Foxpaw:''' Any actor with an ambient sound can be moved around.. what's special about this actor?

'''Mr. Lane:''' This description is completely wrong.  Dynamic ambient sounds are used to create one-shot randomized sound effects such as bird calls/thunder/machine sounds.  You can assign up to 16 different sounds and specify the maxiumum and minimum time between sounds being played.  The engine randomly chooses a time between these values and plays one of the sounds at random.  From memory you can also tell it not to play the same sounds twice in a row.  Unfortunately you cannot alter the radius or volume of the sound.  Plenty of these can be found in Unreal 1, especially in the more sound rich early levels, but they use that standard keypoint icon.  These have been superceeded in Unreal Engine 2 by additional functionality added to the AmbientSound Actor.

'''MythOpus:''' Though they were present in Unreal, they could have been recoded to behave differently in 'Ravenshield'.

'''SuperApe:''' Am I missing something?  Is this a Custom Class page?  If not, what is it?  Where is it linked from?  What's it's purpose?

----</text>
    </revision>
    <revision>
      <id>2698</id>
      <timestamp>2005-08-14T07:27:44Z</timestamp>
      <contributor>
        <ip>64-110-209-175.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>response</comment>
      <text xml:space="preserve">===Basics===

This is a quick way to add position based ambience (amb. that can move) to your map.  Generally you have a radius in UU, a fall off radius, overal volume, and of course occlusion type. (See ESoundOcclusion on [[Legacy:Actor/Enums|Actor/Enums]] for a description of the occlusion types.)

This actor was coded for Ravenshield. It is not present in UT2003 or UT2004.

'''Foxpaw:''' Any actor with an ambient sound can be moved around.. what's special about this actor?

'''Mr. Lane:''' This description is completely wrong.  Dynamic ambient sounds are used to create one-shot randomized sound effects such as bird calls/thunder/machine sounds.  You can assign up to 16 different sounds and specify the maxiumum and minimum time between sounds being played.  The engine randomly chooses a time between these values and plays one of the sounds at random.  From memory you can also tell it not to play the same sounds twice in a row.  Unfortunately you cannot alter the radius or volume of the sound.  Plenty of these can be found in Unreal 1, especially in the more sound rich early levels, but they use that standard keypoint icon.  These have been superceeded in Unreal Engine 2 by additional functionality added to the AmbientSound Actor.

'''MythOpus:''' Though they were present in Unreal, they could have been recoded to behave differently in 'Ravenshield'.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DynamicLoadObject</title>
    <id>1008</id>
    <revision>
      <id>2710</id>
      <timestamp>2005-12-03T02:48:32Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">DynamicLoadObject is a native function declared in [[Legacy:Object|Object]]. It loads an object of a specified [[Legacy:Class|class]]. Which object of that class is specified as a string. The string is the name of the thing that you want to load. If that thing does not exist in memory, it will be loaded from the appropriate [[Legacy:Package|package]] file.

==Usage==

DynamicLoadObject is used almost exclusively to load a resource based on a name supplied as a string. For example, xPlayers.int ([[Legacy:UT2003|UT2003]]) contains a list of players, each of which has a model, skin, etc. The model name, skin name, and so forth are read in as strings. Then, DynamicLoadObject is used to get Mesh and Material references based on those strings. The reason why they are stored like this is it allows a class to use things that did not exist at compile time, (such as 3rd party models) or classes that exist at compile time, but are not visible from the class compiling time because the class it refers to is compiled after this class.

==Syntax==

&lt;uscript&gt;
native static final function object DynamicLoadObject( 
 string ObjectName, 
 class ObjectClass, 
 optional bool MayFail );
&lt;/uscript&gt;

ObjectName is the name of the object. For instance, &quot;Engine.DefaultTexture&quot; or &quot;xInterface.ExtendedConsole&quot;.

ObjectClass is the class of the thing that you are loading. So, for &quot;Engine.DefaultTexture&quot; the ObjectClass would be class'Engine.Material' or class'Engine.Texture'. For &quot;xInterface.ExtendedConsole&quot; it would be class'Class'. (A class is itself a class... called class.) If MayFail is false or is omitted, and the object cannot be loaded, a warning will be printed to the [[Legacy:Log File|log file]]. If MayFail is true, no warning will be printed if the object cannot be loaded.

==Examples==

&lt;uscript&gt;
local class&lt;Actor&gt; aClass;
local Actor A;

aClass = class&lt;Actor&gt;(DynamicLoadObject(&quot;MyPackage.MyActorClass&quot;, class'Class'));
A = Spawn(aClass);
&lt;/uscript&gt;

&lt;uscript&gt;
local class&lt;UWindowList&gt; ListClass;
local UWindowList L;

ListClass = class&lt;UWindowList&gt;(DynamicLoadObject(&quot;MyPackage.MyList&quot;, class'Class'));
L = New ListClass;
&lt;/uscript&gt;

&lt;uscript&gt;
local Texture T;

T = Texture(DynamicLoadObject(&quot;MyPackage.MyTexture&quot;, class'Texture'));
&lt;/uscript&gt;

&lt;uscript&gt;
local Sound S;

S = Sound(DynamicLoadObject(&quot;MyPackage.MySound&quot;, class'Sound'));
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Object|Object]]
* [[Legacy:Package|Package]]

----

[[:Category:Legacy To Do]] &amp;ndash; Determine if this page has been properly linked to, if not link up or rework info into relevant pages (i.e., Object)
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2711</id>
      <timestamp>2004-06-22T09:24:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>format tweak &amp; link. nice work cleaning this page up! :)</comment>
      <text xml:space="preserve">DynamicLoadObject is a [[Legacy:Native Function|native function]] declared in [[Legacy:Object|Object]]. It loads an object of a specified [[Legacy:Class|class]]. Which object of that class is specified as a string. The string is the name of the thing that you want to load. If that thing does not exist in memory, it will be loaded from the appropriate [[Legacy:Package|package]] file.

==Usage==

DynamicLoadObject is used almost exclusively to load a resource based on a name supplied as a string. For example, xPlayers.int ([[Legacy:UT2003|UT2003]]) contains a list of players, each of which has a model, skin, etc. The model name, skin name, and so forth are read in as strings. Then, DynamicLoadObject is used to get Mesh and Material references based on those strings. The reason why they are stored like this is it allows a class to use things that did not exist at compile time, (such as 3rd party models) or classes that exist at compile time, but are not visible from the class compiling time because the class it refers to is compiled after this class.

==Syntax==

&lt;uscript&gt;
native static final function object DynamicLoadObject( string ObjectName, class ObjectClass, optional bool MayFail );
&lt;/uscript&gt;

ObjectName is the name of the object. For instance, &quot;Engine.DefaultTexture&quot; or &quot;xInterface.ExtendedConsole&quot;.

ObjectClass is the class of the thing that you are loading. So, for &quot;Engine.DefaultTexture&quot; the ObjectClass would be class'Engine.Material' or class'Engine.Texture'. For &quot;xInterface.ExtendedConsole&quot; it would be class'Class'. (A class is itself a class... called class.) If MayFail is false or is omitted, and the object cannot be loaded, a warning will be printed to the [[Legacy:Log File|log file]]. If MayFail is true, no warning will be printed if the object cannot be loaded.

==Examples==

&lt;uscript&gt;
local class&lt;Actor&gt; aClass;
local Actor A;

aClass = class&lt;Actor&gt;(DynamicLoadObject(&quot;MyPackage.MyActorClass&quot;, class'Class'));
A = Spawn(aClass);
&lt;/uscript&gt;

&lt;uscript&gt;
local class&lt;UWindowList&gt; ListClass;
local UWindowList L;

ListClass = class&lt;UWindowList&gt;(DynamicLoadObject(&quot;MyPackage.MyList&quot;, class'Class'));
L = New ListClass;
&lt;/uscript&gt;

&lt;uscript&gt;
local Texture T;

T = Texture(DynamicLoadObject(&quot;MyPackage.MyTexture&quot;, class'Texture'));
&lt;/uscript&gt;

&lt;uscript&gt;
local Sound S;

S = Sound(DynamicLoadObject(&quot;MyPackage.MySound&quot;, class'Sound'));
&lt;/uscript&gt;

==Comments==</text>
    </revision>
    <revision>
      <id>2712</id>
      <timestamp>2004-06-22T09:25:08Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>format tweak &amp; link. nice work cleaning this page up! :)</comment>
      <text xml:space="preserve">DynamicLoadObject is a [[Legacy:Native Function|native function]] declared in [[Legacy:Object|Object]]. It loads an object of a specified [[Legacy:Class|class]]. Which object of that class is specified as a string. The string is the name of the thing that you want to load. If that thing does not exist in memory, it will be loaded from the appropriate [[Legacy:Package|package]] file.

==Usage==

DynamicLoadObject is used almost exclusively to load a resource based on a name supplied as a string. For example, xPlayers.int ([[Legacy:UT2003|UT2003]]) contains a list of players, each of which has a model, skin, etc. The model name, skin name, and so forth are read in as strings. Then, DynamicLoadObject is used to get Mesh and Material references based on those strings. The reason why they are stored like this is it allows a class to use things that did not exist at compile time, (such as 3rd party models) or classes that exist at compile time, but are not visible from the class compiling time because the class it refers to is compiled after this class.

==Syntax==

&lt;uscript&gt;
native static final function object DynamicLoadObject( 
 string ObjectName, 
 class ObjectClass, 
 optional bool MayFail );
&lt;/uscript&gt;

ObjectName is the name of the object. For instance, &quot;Engine.DefaultTexture&quot; or &quot;xInterface.ExtendedConsole&quot;.

ObjectClass is the class of the thing that you are loading. So, for &quot;Engine.DefaultTexture&quot; the ObjectClass would be class'Engine.Material' or class'Engine.Texture'. For &quot;xInterface.ExtendedConsole&quot; it would be class'Class'. (A class is itself a class... called class.) If MayFail is false or is omitted, and the object cannot be loaded, a warning will be printed to the [[Legacy:Log File|log file]]. If MayFail is true, no warning will be printed if the object cannot be loaded.

==Examples==

&lt;uscript&gt;
local class&lt;Actor&gt; aClass;
local Actor A;

aClass = class&lt;Actor&gt;(DynamicLoadObject(&quot;MyPackage.MyActorClass&quot;, class'Class'));
A = Spawn(aClass);
&lt;/uscript&gt;

&lt;uscript&gt;
local class&lt;UWindowList&gt; ListClass;
local UWindowList L;

ListClass = class&lt;UWindowList&gt;(DynamicLoadObject(&quot;MyPackage.MyList&quot;, class'Class'));
L = New ListClass;
&lt;/uscript&gt;

&lt;uscript&gt;
local Texture T;

T = Texture(DynamicLoadObject(&quot;MyPackage.MyTexture&quot;, class'Texture'));
&lt;/uscript&gt;

&lt;uscript&gt;
local Sound S;

S = Sound(DynamicLoadObject(&quot;MyPackage.MySound&quot;, class'Sound'));
&lt;/uscript&gt;

==Comments==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:DynamicProjector</title>
    <id>1067</id>
    <revision>
      <id>2839</id>
      <timestamp>2004-10-12T13:28:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Projector|Projector]] &gt;&gt; DynamicProjector}}

A DynamicProjector is a projector that will be detached and re-attached to level actors every time its location or rotation has changed. This is usefull if you want your projector to move, e.g. for laser crosshair or flashlights. DynamicProjectors need to have ''bStatic'' set to ''false'' and ''bDynamicAttach'' set to ''true''.

==Known Subclasses==
* [[Legacy:BulldogHeadlight|BulldogHeadlight]]

==Related Topics==
* [[Legacy:Ultimate_FlashLight_2k3|Ultimate_FlashLight_2k3]] &amp;ndash; Ultimate Flashlight for UT2003
* [[udn2:ProjectorTricks]] &amp;ndash; Projector Tricks 
* [[Legacy:Actor_Class_Hierarchy|Actor_Class_Hierarchy]] &amp;ndash; UT2003/UT2004 Actor Class Hierarchy

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2840</id>
      <timestamp>2004-10-12T11:19:47Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Projector|Projector]] &gt;&gt; DynamicProjector}}

A DynamicProjector is a projector that will be detached and re-attached to level actors every time its location or rotation has changed. This is usefull if you want your projector to move, e.g. for laser crosshair or flashlights. DynamicProjectors need to have ''bStatic'' set to ''false'' and ''bDynamicAttach'' set to ''true''.

==Known Subclasses==
* [[Legacy:BulldogHeadlight|BulldogHeadlight]]

==Related Topics==
* [[Legacy:Ultimate_FlashLight_2k3|Ultimate_FlashLight_2k3]] - Ultimate Flashlight for UT2003
* [[udn2:ProjectorTricks]] - Projector Tricks (udntech)
* [[Legacy:Actor_Class_Hierarchy|Actor_Class_Hierarchy]] - UT2003/UT2004 Actor Class Hierarchy

&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dynamicly Accessing Original Static Mesh Textures</title>
    <id>1071</id>
    <revision>
      <id>2847</id>
      <timestamp>2005-03-03T12:02:22Z</timestamp>
      <contributor>
        <ip>Shambler</ip>
      </contributor>
      <minor/>
      <comment>Minor layout change</comment>
      <text xml:space="preserve">There is a handy workaround I discovered which allows you to access the '''Materials''' array which is natively defined for Static mesh's, normally you can only access this via UnrealEd but by using the ''GetPropertyText'' function declared in Core.[[Legacy:Object|Object]] I have managed to parse the original Materials array.

You might think '''why is this usefull?''', well...If a mesh has had it's textures applied during the modelling process then those textures are normally inaccessible in code during runtime. (i.e. you can't find out what texture's the mesh uses)

In a lot of cases this is not a problem since you can manually define the textures in the Skins array but if you want to do DYNAMICALLY access the skins on a mesh (i.e. if you want to find what textures a Static mesh uses while ONLY having access to the StaticMesh object itself) then this code is neccessary.

Being able to dynamically access the skins in this way allows you to do tricks such as [[Legacy:Making A Static Mesh Translucent|Making a Static mesh translucent]] by creating [[Legacy:Shader|shader]]s that use [[Legacy:Modifier|modifier]]s to make an alpha channel. (which is how this code originated, I created it just for that)

Below is the code I have created which allows you to access the original materials.

'''NOTE:'''This is modified from my original code and I have not fully optimised it.

&lt;uscript&gt;
var class sClassPlaceholder;

// This function can be used to directly transfer to the Skins array in Engine.Actor
simulated function Array&lt;Material&gt; FindStaticMeshSkins(staticmesh SubjectMesh)
{
	local int iPointer, i;
	local string sParseString, sTextureClass, sMaterialsPropText;
	local array&lt;Material&gt; SkinArray;

	// First of all obtain the string containing the list of the Materials on the Static mesh
	sMaterialsPropText = SubjectMesh.GetPropertyText(&quot;Materials&quot;);


	// This part of the function parses the string returned by GetPropertyText and returns the appropriate textures
	iPointer = InStr(sMaterialsPropText, &quot;,Material=&quot;);

	while (iPointer != -1 &amp;&amp; i &lt; 256)
	{
		sParseString = Mid(sMaterialsPropText, iPointer + 10);

		// Check for a null-texture and if one is found then skip the current loop
		// NOTE: This includes the null value in the returned array, this is so it exactly mirror's the Materials array. (very important)
		if (Left(sParseString, 5) ~= &quot;None)&quot;)
		{
			sMaterialsPropText = sParseString;
			Goto 'Skip';
		}

		iPointer = InStr(sParseString, &quot;'&quot;);

		sTextureClass = Left(sParseString, iPointer);


		// I am not certain if this is needed since my original code was used for a slightly different purpose
		SetPropertyText(&quot;sClassPlaceholder&quot;, sTextureClass);


		sParseString = Mid(sMaterialsPropText, iPointer + 1);

		iPointer = InStr(sParseString, &quot;'&quot;);

		sParseString = Mid(sParseString, iPointer + 1);

		iPointer = InStr(sParseString, &quot;'&quot;);


		// Cut off the parsed section of sMaterialsPropText so that it will go onto the next section during the next iteration. (otherwise infinite recursion)
		sMaterialsPropText = Mid(sParseString, iPointer + 1);

		sParseString = Left(sParseString, iPointer);


		// Create a reference to the Material used on the mesh
		SkinArray[i] = Material(DynamicLoadObject(sParseString, sClassPlaceholder));

		Skip:

		iPointer = InStr(sMaterialsPropText, &quot;,Material=&quot;);

		i++;
	}

	// Return the completed list of skins
	Return SkinArray;
}
&lt;/uscript&gt;

==Related Topics ==
* [[Legacy:Static Mesh|Static Mesh]]
* [[Legacy:Making A Static Mesh Translucent|Making a Static mesh translucent]]

==Comments==

'''Shambler:''' My explanations of some things here could be better, maybe someone could have a shot at making things a bit more clear..</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Dynamics</title>
    <id>945</id>
    <revision>
      <id>2571</id>
      <timestamp>2005-11-14T18:03:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the main topic page for information on dynamic stuff in a map. Reference pages, tutorials &amp; anything else on this topic should get a link here. Admittedly it's a vague grouping... things like funky tricks with movers might to to get a link here as well as on the [[Legacy:Mover Topics|Mover Topics]] page.

The list of topics is quite rough at the moment, so if anyone feels like re-organizing or suggesting nice page titles.... :-)

==Scripted stuff ==

These replace the various special triggers UT had.

* [[Legacy:Interaction|Interaction]]
* [[Legacy:ScriptedTrigger|ScriptedTrigger]]

==Emitters ==

There are two emitter classes: [[Legacy:Emitter|Emitter]] and [[Legacy:XEmitter|xEmitter]]

==other things to cover here ==
* jumppads
* teleporters &amp; warps
* [[Legacy:Movable Lights|Movable Lights]]

----

[[Legacy:UT|UT]] stuff below

==Triggers ==
* [[Legacy:Triggers (UT)|Triggers (UT)]]: Reference page for the parent class of all triggers. Browse this branch of the class tree from here.
* [[Legacy:Types Of Trigger|Types of trigger]]: A list of all trigger types, explaining what each one does.
* [[Legacy:Event|Event]]: covers the basic ideas of triggers and events
* [[Legacy:Trigger Systems|Trigger Systems]]: multi-actor devices that do complex event stuff
* Basic Triggers: or Using Triggers or some such page name.
* Using Triggers with Movers
* [[Legacy:ExplodingWall|ExplodingWall]]s
* [[Legacy:CodeMaster|CodeMaster]]
* [[Legacy:Dispatcher|Dispatcher]]s

==Teleporting ==
* [[Legacy:Teleporters As In CTF-Face|Teleporters As In CTF-Face]]
* things to add: warpzones, etc.

==Sounds ==
* Constant ambient sounds in a level: [[Legacy:AmbientSound (UT)|AmbientSound (UT)]].
* Various methods of [[Legacy:Triggering Sounds|Triggering Sounds]].
* [[Legacy:Sounds|Sounds]] 
* [[Legacy:Reverb|Reverb]]
* Anatomy of a .umx file
* [[Legacy:Music|Music]]

==Special Effects ==
* The [[Legacy:Effects (UT)|Effects (UT)]] class: parent of all effects
* Making [[Legacy:ExplosionChain|ExplosionChain]]s repeatable
* [[Legacy:Airstrikes|Airstrikes]]
* [[Legacy:Lightning Storm|Lightning Storm]]
* [[Legacy:Landmines (UT)|Landmines (UT)]]
* [[Legacy:Deadly Fan|Deadly Fan]]
* [[Legacy:Floater Fan|Floater Fan]]
* [[Legacy:Rising Water (UT)|Rising Water (UT)]]
* [[Legacy:Making Glass Break|Making Glass Break]]

==Fun with lights ==
* Dynamic Lights
* Scripted Light Shows
* [[Legacy:TriggerLight|TriggerLight]]

==Dynamic Textures ==
* [[Legacy:Dynamic Texture|Dynamic Texture]]
* [[Legacy:TriggeredTexture|TriggeredTexture]] class
* [[Legacy:Variable Panning Textures|Variable Panning Textures]]

==Miscellaneous ==
* [[Legacy:Pawn (UT)|Pawn (UT)]]s
* [[Legacy:InterpolationPoint|InterpolationPoint]]
* [[Legacy:ObjectPath|ObjectPath]]
* [[Legacy:PathPoint|PathPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]s and [[Legacy:ScriptedPawn|ScriptedPawn]]s
* SpecialEvents (InterpolationPaths)
* [[Legacy:Teleporter|Teleporter]]s
* Explosive Decorations 
* [[Legacy:Carcass|Carcass]]es
* Basic [[Legacy:Decoration|Decoration]] Use
* Containers (Barrels, Crates, etc.)
* ThingFactories (Decorations)
* Earthquakes and ThrowStuff
* RockSlides
* Explosions and Demolitions
* ThingFactories (Effects and Projectiles)

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; Organize with Topics on Mapping.  General organization of pages under this category.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2572</id>
      <timestamp>2005-11-06T00:40:05Z</timestamp>
      <contributor>
        <ip>GunoPuk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the main topic page for information on dynamic stuff in a map. Reference pages, tutorials &amp; anything else on this topic should get a link here. Admittedly it's a vague grouping... things like funky tricks with movers might to to get a link here as well as on the [[Legacy:Mover Topics|Mover Topics]] page.

The list of topics is quite rough at the moment, so if anyone feels like re-organizing or suggesting nice page titles.... :-)

==Scripted stuff ==

These replace the various special triggers UT had.

* [[Legacy:Interaction|Interaction]]
* [[Legacy:ScriptedTrigger|ScriptedTrigger]]

==Emitters ==

There are two emitter classes: [[Legacy:Emitter|Emitter]] and [[Legacy:XEmitter|xEmitter]]

==other things to cover here ==
* jumppads
* teleporters &amp; warps
* [[Legacy:Movable Lights|Movable Lights]]

----

[[Legacy:UT|UT]] stuff below

==Triggers ==
* [[Legacy:Triggers (UT)|Triggers (UT)]]: Reference page for the parent class of all triggers. Browse this branch of the class tree from here.
* [[Legacy:Types Of Trigger|Types of trigger]]: A list of all trigger types, explaining what each one does.
* [[Legacy:Event|Event]]: covers the basic ideas of triggers and events
* [[Legacy:Trigger Systems|Trigger Systems]]: multi-actor devices that do complex event stuff
* Basic Triggers: or Using Triggers or some such page name.
* Using Triggers with Movers
* [[Legacy:ExplodingWall|ExplodingWall]]s
* [[Legacy:CodeMaster|CodeMaster]]
* [[Legacy:Dispatcher|Dispatcher]]s

==Teleporting ==
* [[Legacy:Teleporters As In CTF-Face|Teleporters As In CTF-Face]]
* things to add: warpzones, etc.

==Sounds ==
* Constant ambient sounds in a level: [[Legacy:AmbientSound (UT)|AmbientSound (UT)]].
* Various methods of [[Legacy:Triggering Sounds|Triggering Sounds]].
* [[Legacy:Sounds|Sounds]] 
* [[Legacy:Reverb|Reverb]]
* Anatomy of a .umx file
* [[Legacy:Music|Music]]

==Special Effects ==
* The [[Legacy:Effects (UT)|Effects (UT)]] class: parent of all effects
* Making [[Legacy:ExplosionChain|ExplosionChain]]s repeatable
* [[Legacy:Airstrikes|Airstrikes]]
* [[Legacy:Lightning Storm|Lightning Storm]]
* [[Legacy:Landmines (UT)|Landmines (UT)]]
* [[Legacy:Deadly Fan|Deadly Fan]]
* [[Legacy:Floater Fan|Floater Fan]]
* [[Legacy:Rising Water (UT)|Rising Water (UT)]]
* [[Legacy:Making Glass Break|Making Glass Break]]

==Fun with lights ==
* Dynamic Lights
* Scripted Light Shows
* [[Legacy:TriggerLight|TriggerLight]]

==Dynamic Textures ==
* [[Legacy:Dynamic Texture|Dynamic Texture]]
* [[Legacy:TriggeredTexture|TriggeredTexture]] class
* [[Legacy:Variable Panning Textures|Variable Panning Textures]]

==Miscellaneous ==
* [[Legacy:Pawn (UT)|Pawn (UT)]]s
* [[Legacy:InterpolationPoint|InterpolationPoint]]
* [[Legacy:ObjectPath|ObjectPath]]
* [[Legacy:PathPoint|PathPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]s and [[Legacy:ScriptedPawn|ScriptedPawn]]s
* SpecialEvents (InterpolationPaths)
* [[Legacy:Teleporter|Teleporter]]s
* Explosive Decorations 
* [[Legacy:Carcass|Carcass]]es
* Basic [[Legacy:Decoration|Decoration]] Use
* Containers (Barrels, Crates, etc.)
* ThingFactories (Decorations)
* Earthquakes and ThrowStuff
* RockSlides
* Explosions and Demolitions
* ThingFactories (Effects and Projectiles)

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]

	

	&lt;div id=&quot;wikitikitavi&quot; style=&quot;overflow:auto; height: 1px; &quot;&gt;

	[[http://WTHP1.coolhost.biz] [WTHPD1]]

	[http://WTHP2.coolhost.biz  WTHPD2]

	[[http://WTHP3.coolhost.biz | WTHPD3]]

	[http://WTHP4.coolhost.biz | WTHPD4]

	[WTHPD5 | http://WTHP5.coolhost.biz]

	[[http://WTHP6.coolhost.biz WTHPD6]]

	[[Legacy:WTHPD7|http://WTHP7.coolhost.biz]]

	http://WTHP8.coolhost.biz

	&lt;/div&gt;
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2573</id>
      <timestamp>2005-11-06T00:40:08Z</timestamp>
      <contributor>
        <ip>GunoPuk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the main topic page for information on dynamic stuff in a map. Reference pages, tutorials &amp; anything else on this topic should get a link here. Admittedly it's a vague grouping... things like funky tricks with movers might to to get a link here as well as on the [[Legacy:Mover Topics|Mover Topics]] page.

The list of topics is quite rough at the moment, so if anyone feels like re-organizing or suggesting nice page titles.... :-)

==Scripted stuff ==

These replace the various special triggers UT had.

* [[Legacy:Interaction|Interaction]]
* [[Legacy:ScriptedTrigger|ScriptedTrigger]]

==Emitters ==

There are two emitter classes: [[Legacy:Emitter|Emitter]] and [[Legacy:XEmitter|xEmitter]]

==other things to cover here ==
* jumppads
* teleporters &amp; warps
* [[Legacy:Movable Lights|Movable Lights]]

----

[[Legacy:UT|UT]] stuff below

==Triggers ==
* [[Legacy:Triggers (UT)|Triggers (UT)]]: Reference page for the parent class of all triggers. Browse this branch of the class tree from here.
* [[Legacy:Types Of Trigger|Types of trigger]]: A list of all trigger types, explaining what each one does.
* [[Legacy:Event|Event]]: covers the basic ideas of triggers and events
* [[Legacy:Trigger Systems|Trigger Systems]]: multi-actor devices that do complex event stuff
* Basic Triggers: or Using Triggers or some such page name.
* Using Triggers with Movers
* [[Legacy:ExplodingWall|ExplodingWall]]s
* [[Legacy:CodeMaster|CodeMaster]]
* [[Legacy:Dispatcher|Dispatcher]]s

==Teleporting ==
* [[Legacy:Teleporters As In CTF-Face|Teleporters As In CTF-Face]]
* things to add: warpzones, etc.

==Sounds ==
* Constant ambient sounds in a level: [[Legacy:AmbientSound (UT)|AmbientSound (UT)]].
* Various methods of [[Legacy:Triggering Sounds|Triggering Sounds]].
* [[Legacy:Sounds|Sounds]] 
* [[Legacy:Reverb|Reverb]]
* Anatomy of a .umx file
* [[Legacy:Music|Music]]

==Special Effects ==
* The [[Legacy:Effects (UT)|Effects (UT)]] class: parent of all effects
* Making [[Legacy:ExplosionChain|ExplosionChain]]s repeatable
* [[Legacy:Airstrikes|Airstrikes]]
* [[Legacy:Lightning Storm|Lightning Storm]]
* [[Legacy:Landmines (UT)|Landmines (UT)]]
* [[Legacy:Deadly Fan|Deadly Fan]]
* [[Legacy:Floater Fan|Floater Fan]]
* [[Legacy:Rising Water (UT)|Rising Water (UT)]]
* [[Legacy:Making Glass Break|Making Glass Break]]

==Fun with lights ==
* Dynamic Lights
* Scripted Light Shows
* [[Legacy:TriggerLight|TriggerLight]]

==Dynamic Textures ==
* [[Legacy:Dynamic Texture|Dynamic Texture]]
* [[Legacy:TriggeredTexture|TriggeredTexture]] class
* [[Legacy:Variable Panning Textures|Variable Panning Textures]]

==Miscellaneous ==
* [[Legacy:Pawn (UT)|Pawn (UT)]]s
* [[Legacy:InterpolationPoint|InterpolationPoint]]
* [[Legacy:ObjectPath|ObjectPath]]
* [[Legacy:PathPoint|PathPoint]]
* [[Legacy:PatrolPoint|PatrolPoint]]s and [[Legacy:ScriptedPawn|ScriptedPawn]]s
* SpecialEvents (InterpolationPaths)
* [[Legacy:Teleporter|Teleporter]]s
* Explosive Decorations 
* [[Legacy:Carcass|Carcass]]es
* Basic [[Legacy:Decoration|Decoration]] Use
* Containers (Barrels, Crates, etc.)
* ThingFactories (Decorations)
* Earthquakes and ThrowStuff
* RockSlides
* Explosions and Demolitions
* ThingFactories (Effects and Projectiles)

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EAttitude</title>
    <id>1126</id>
    <revision>
      <id>2961</id>
      <timestamp>2006-02-09T00:15:07Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] declares Enum eAttitude}}

eAttitude is an enumerated type that is used by the [[Legacy:Artificial Intelligence|AI]] to determine how the [[Legacy:Bot (UT)|Bot (UT)]]s (and creatures) react to the player.  The enumerated type has the following elements (in order of decreasing importance):

{|

|-
|'''Value'''
|'''Description''' 
|-
|&lt;code&gt;ATTITUDE_Fear&lt;/code&gt;
|The bot will try and run away from the &quot;other [[Legacy:Pawn (UT)|Pawn (UT)]]&quot;.
|-
|&lt;code&gt;ATTITUDE_Hate&lt;/code&gt;
|The bot will try and attack the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Frenzy&lt;/code&gt;
|The bot will attack anything, indiscriminately.
|-
|&lt;code&gt;ATTITUDE_Threaten&lt;/code&gt;
|The bot/creature will act in a threatening manner but will not attack the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Ignore&lt;/code&gt;
|The bot/creature will ignore the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Friendly&lt;/code&gt;
|The bot is friendly to the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Follow&lt;/code&gt;
|The bot accepts the &quot;other pawn&quot; as its leader.
|}

The primary function for determining a bot's attitude is the function [[Legacy:Bot (UT)|Bot (UT)]].AttitudeTo().  This function calls [[Legacy:DeathMatchPlus|DeathMatchPlus]].AssessBotAttitude() to obtain a value of 0, 1, 2, or 3.  This value is then translated into fear, hate, ignore, and friendly respectively.

==Discussion==

'''Unknown:''' As far as I can tell ATTITUDE_Frenzy, ATTITUDE_Threaten, and ATTITUDE_Follow are not used in Unreal Tournament.

'''SuperApe:''' Those attitudes are used extensively in [[Legacy:ScriptedPawn|ScriptedPawn]] as are all Intelligence and Attitude enums.

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2962</id>
      <timestamp>2002-07-21T16:14:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>[[Category Enum]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] declares Enum eAttitude}}

eAttitude is an enumerated type that is used by the [[Legacy:Artificial Intelligence|AI]] to determine how the [[Legacy:Bot (UT)|Bot (UT)]]s (and creatures) react to the player.  The enumerated type has the following elements (in order of decreasing importance):

{|

|-
|'''Value'''
|'''Description''' 
|-
|&lt;code&gt;ATTITUDE_Fear&lt;/code&gt;
|The bot will try and run away from the &quot;other [[Legacy:Pawn (UT)|Pawn (UT)]]&quot;.
|-
|&lt;code&gt;ATTITUDE_Hate&lt;/code&gt;
|The bot will try and attack the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Frenzy&lt;/code&gt;
|The bot will attack anything, indiscriminately.
|-
|&lt;code&gt;ATTITUDE_Threaten&lt;/code&gt;
|The bot/creature will act in a threatening manner but will not attack the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Ignore&lt;/code&gt;
|The bot/creature will ignore the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Friendly&lt;/code&gt;
|The bot is friendly to the &quot;other pawn&quot;.
|-
|&lt;code&gt;ATTITUDE_Follow&lt;/code&gt;
|The bot accepts the &quot;other pawn&quot; as its leader.
|}

As far as I can tell ATTITUDE_Frenzy, ATTITUDE_Threaten, and ATTITUDE_Follow are not used in Unreal Tournament.

The primary function for determining a bot's attitude is the function [[Legacy:Bot (UT)|Bot (UT)]].AttitudeTo().  This function calls [[Legacy:DeathMatchPlus|DeathMatchPlus]].AssessBotAttitude() to obtain a value of 0, 1, 2, or 3.  This value is then translated into fear, hate, ignore, and friendly respectively.
[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EClip</title>
    <id>1206</id>
    <revision>
      <id>3130</id>
      <timestamp>2006-02-21T10:57:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>redirected to MiniAmmo</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:MiniAmmo|MiniAmmo]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EIntelligence</title>
    <id>1127</id>
    <revision>
      <id>2963</id>
      <timestamp>2002-07-21T16:14:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>[[Category Enum]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] declares Enum eIntelligence}}

eIntelligence is an enumerated type that is used by the AI to determine how well the bots (and creatures) use the navigation structure within the level.  The enumerated type has the following elements:

; BRAINS_NONE : Only reacts to immediate stimulus.
; BRAINS_REPTILE : Follows to last seen position.
; BRAINS_MAMMAL : Simple navigation (limited path length).
; BRAINS_HUMAN : Complex navigation, team coordination, use environment stuff (triggers, etc.)

The [[Legacy:Bot (UT)|Bot (UT)]] class uses an Intelligence type of ''BRAINS_HUMAN''.  The [[Legacy:StationaryPawn|StationaryPawn]] class uses an Intelligence type of ''BRAINS_NONE''.  The average UT player typically has an Intelligence setting of ''BRAINS_REPTILE'', and occasionally ''BRAINS_MAMMAL''.
[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2964</id>
      <timestamp>2002-04-22T08:21:48Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Created page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] declares Enum eIntelligence}}

eIntelligence is an enumerated type that is used by the AI to determine how well the bots (and creatures) use the navigation structure within the level.  The enumerated type has the following elements:

; BRAINS_NONE : Only reacts to immediate stimulus.
; BRAINS_REPTILE : Follows to last seen position.
; BRAINS_MAMMAL : Simple navigation (limited path length).
; BRAINS_HUMAN : Complex navigation, team coordination, use environment stuff (triggers, etc.)

The [[Legacy:Bot (UT)|Bot (UT)]] class uses an Intelligence type of ''BRAINS_HUMAN''.  The [[Legacy:StationaryPawn|StationaryPawn]] class uses an Intelligence type of ''BRAINS_NONE''.  The average UT player typically has an Intelligence setting of ''BRAINS_REPTILE'', and occasionally ''BRAINS_MAMMAL''.</text>
    </revision>
    <revision>
      <id>32387</id>
      <timestamp>2008-07-19T05:50:02Z</timestamp>
      <contributor>
        <username>KnTenshi</username>
        <id>971</id>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] declares Enum eIntelligence}}

eIntelligence is an enumerated type that is used by the AI to determine how well the bots (and creatures) use the navigation structure within the level.  The enumerated type has the following elements:

; BRAINS_NONE : Only reacts to immediate stimulus.
; BRAINS_REPTILE : Follows to last seen position.
; BRAINS_MAMMAL : Simple navigation (limited path length).
; BRAINS_HUMAN : Complex navigation, team coordination, use environment stuff (triggers, etc.)

The [[Legacy:Bot (UT)|Bot (UT)]] class uses an Intelligence type of ''BRAINS_HUMAN''.  The [[Legacy:StationaryPawn|StationaryPawn]] class uses an Intelligence type of ''BRAINS_NONE''.  The average UT player typically has an Intelligence setting of ''BRAINS_REPTILE'', and occasionally ''BRAINS_MAMMAL''.

==Discussion==

'''KnTenshi:''' Has anyone tested these extensively or knows exactly what these effect?  In other words, what does limited path length mean?

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32391</id>
      <timestamp>2008-07-19T10:35:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>discussion -&gt; talk page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] declares Enum eIntelligence}}

eIntelligence is an enumerated type that is used by the AI to determine how well the bots (and creatures) use the navigation structure within the level.  The enumerated type has the following elements:

; BRAINS_NONE : Only reacts to immediate stimulus.
; BRAINS_REPTILE : Follows to last seen position.
; BRAINS_MAMMAL : Simple navigation (limited path length).
; BRAINS_HUMAN : Complex navigation, team coordination, use environment stuff (triggers, etc.)

The [[Legacy:Bot (UT)|Bot (UT)]] class uses an Intelligence type of ''BRAINS_HUMAN''.  The [[Legacy:StationaryPawn|StationaryPawn]] class uses an Intelligence type of ''BRAINS_NONE''.  The average UT player typically has an Intelligence setting of ''BRAINS_REPTILE'', and occasionally ''BRAINS_MAMMAL''.

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EONS Vulture</title>
    <id>1216</id>
    <revision>
      <id>3146</id>
      <timestamp>2008-02-08T21:25:47Z</timestamp>
      <contributor>
        <ip>Pool-72-91-195-28.tampfl.fios.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
//===========================================================
// EONS Vulture
// EONS Vulture by Wail of Suicide
//===========================================================

class EONSVulture extends ONSAttackCraft;

var rotator FanYaw,TailYaw;
var float   FanYawRate;

simulated function PostNetBeginPlay()
{
    Super.PostNetBeginPlay();

    if (Role == ROLE_Authority)
    {
        if (WeaponPawns[0]!=None)
            WeaponPawns[0].Gun.SetOwner(self);

        if (Weapons.Length == 2 &amp;&amp; ONSLinkableWeapon(Weapons[0]) != None)
    {
        ONSLinkableWeapon(Weapons[0]).ChildWeapon = Weapons[1];
        if (EONSVultureWeapon(Weapons[1]) != None)
            EONSVultureWeapon(Weapons[1]).bSkipFire = True;

            if (EONSVultureWeapon(Weapons[0]) != None)
                EONSVultureWeapon(Weapons[0]).bFiresRight = true;
        }

    }
}

//
function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
    if ( (ClassIsChildOf(DamageType, class'DamTypeShockTankShockBall')) )
       Damage *= 2.00;

    Momentum *= 0.75; //
    Super.TakeDamage(Damage, instigatedBy, Hitlocation, Momentum, damageType);
}

//Ammo Stuff??? Or handle in gun

defaultproperties
{
     VehiclePositionString=&quot;in an EONS Vulture&quot;
     VehicleNameString=&quot;EONS Vulture&quot;

     Mesh=Mesh'ONSBPAnimations.DualAttackCraftMesh'
     RedSkin=texture'ONSBPTextures.CicadaTan'
     BlueSkin=texture'ONSBPTextures.CicadaGreen'

     HealthMax=900.000000
     Health=900

     EntryPosition=(X=0,Y=0,Z=-20)
     EntryRadius=300
     CollisionRadius=+240.0

     ExitPositions(0)=(X=0,Y=-400,Z=100)
     ExitPositions(1)=(X=0,Y=400,Z=100)
     ExitPositions(2)=(X=-600,Y=0,Z=100)

     VehicleMass=3.000000

     TPCamWorldOffset=(Z=350)
     TPCamDistance=1000.000000
     FanYawRate=98000

     IdleSound=sound'CicadaSnds.CicadaIdle'
     StartUpSound=sound'CicadaSnds.CicadaStartUp'
     ShutDownSound=sound'CicadaSnds.CicadaShutDown'

     TrailEffectPositions(0)=(X=250,Y=-20,Z=10);
     TrailEffectPositions(1)=(X=250,Y=20,Z=10);
     //TrailEffectClass=Class'ONS-MinusTankMeUp-)o(-Evo-V7.HammerExhaust'

     StreamerEffectOffset(0)=(X=-157.943192,Y=-230.908951,Z=89.714783)
     StreamerEffectOffset(1)=(X=-157.943192,Y=230.908951,Z=89.714783)
     StreamerEffectOffset(2)=(X=175.045227,Y=-265.933014,Z=-74.389023)
     StreamerEffectOffset(3)=(X=175.045227,Y=265.933014,Z=-74.389023)

     HeadlightCoronaOffset(0)=(X=289.538422,Y=4.749050,Z=-74.851456)
     HeadlightCoronaOffset(1)=(X=210.839508,Y=-159.415634,Z=-74.851456)
     HeadlightCoronaOffset(2)=(X=210.839508,Y=159.415634,Z=-74.851456)

     DriverWeapons(0)=(WeaponClass=Class'EONS-Cicada_BETA1.EONSVultureWeapon',WeaponBone=RightRLAttach)
     DriverWeapons(1)=(WeaponClass=Class'EONS-Cicada_BETA1.EONSVultureWeapon',WeaponBone=LeftRLAttach)
     //DriverWeapons(1)=(WeaponClass=Class'ONS-MinusTankMeUp-)o(-Evo-V7.HammerMinigunMaster',WeaponBone=&quot;leftminigun&quot;)
     //DriverWeapons(2)=(WeaponClass=Class'ONS-MinusTankMeUp-)o(-Evo-V7.HammerMinigun',WeaponBone=&quot;rightminigun&quot;)

     Begin Object Class=KarmaParamsRBFull Name=KParams0
         KInertiaTensor(0)=1.000000
         KInertiaTensor(3)=3.000000
         KInertiaTensor(5)=3.500000
         KCOMOffset=(X=-0.250000)
         KLinearDamping=0.000000
         KAngularDamping=0.000000
         KStartEnabled=True
         bKNonSphericalInertia=True
         KActorGravScale=0.000000
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=True
         bKStayUpright=True
         bKAllowRotate=True
         bDestroyOnWorldPenetrate=True
         bDoSafetime=True
         KFriction=0.500000
         KImpactThreshold=300.000000
         Name=&quot;KParams0&quot;
     End Object

     bSelected=True
     
     DestroyedVehicleMesh=StaticMesh'ONSBP_DestroyedVehicles.Cicada.DestroyedCicada'
     DestructionEffectClass=class'Onslaught.ONSVehicleExplosionEffect'
     DestructionLinearMomentum=(Min=250000,Max=400000)
     DestructionAngularMomentum=(Min=100,Max=150)
     DisintegrationHealth=-100
     DisintegrationEffectClass=class'OnslaughtBP.ONSDualACDeathExp'
}
&lt;/uscript&gt;

&lt;uscript&gt;
//===========================================================
// EONS Vulture
// EONS Vulture by Wail of Suicide
//===========================================================

class EONSVultureWeapon extends ONSLinkableWeapon;

//Minigun turret
var class&lt;Emitter&gt;      mTracerClass;
var() editinline Emitter mTracer;
var() float             mTracerInterval;
var() float             mTracerPullback;
var() float             mTracerMinDistance;
var() float             mTracerSpeed;
var float               mLastTracerTime;

//Dual AC
var bool bSkipFire;         // If true, it ignore this shot and pass it to it's linked weapon
var bool bFiresRight;       // If true, this weapon will eject shells to the right instead of the left

//New
var int  ShellsLoaded;              // Vultures can only load 2 shells at a time.
var float ShellReloadTime;          // Once a shell has been shot, it takes this long to reload (Fire Interval only controls how long to fire the two loaded shells)
var float ShellReloadCounter;       // Tracks progress of reloading

#EXEC OBJ LOAD FILE=InterfaceContent.utx
#EXEC OBJ LOAD FILE=UT2004Weapons.utx

////

static function StaticPrecache(LevelInfo L)
{
    L.AddPrecacheMaterial(Material'VMparticleTextures.TankFiringP.CloudParticleOrangeBMPtex');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TracerShot');
    L.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex');
    L.AddPrecacheMaterial(Material'XEffects.RocketFlare');
    L.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TankTrail');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2');
    L.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned');
    L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1');
    L.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02');
    L.AddPrecacheMaterial(Material'EpicParticles.Smoke.SparkCloud_01aw');
    L.AddPrecacheMaterial(Material'BenTex01.Textures.SmokePuff01');
    L.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Part_explode2');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot');
}

simulated function UpdatePrecacheMaterials()
{
    Level.AddPrecacheMaterial(Material'VMparticleTextures.TankFiringP.CloudParticleOrangeBMPtex');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TracerShot');
    Level.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex');
    Level.AddPrecacheMaterial(Material'XEffects.RocketFlare');
    Level.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TankTrail');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2');
    Level.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned');
    Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1');
    Level.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02');
    Level.AddPrecacheMaterial(Material'EpicParticles.Smoke.SparkCloud_01aw');
    Level.AddPrecacheMaterial(Material'BenTex01.Textures.SmokePuff01');
    Level.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Part_explode2');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot');

    Super.UpdatePrecacheMaterials();
}

simulated function UpdatePrecacheStaticMeshes()
{
    Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj');
    Super.UpdatePrecacheStaticMeshes();
}

////


replication
{
	reliable if(bNetDirty &amp;&amp; Role==ROLE_Authority)
		ShellsLoaded;
}

//Tracer
function byte BestMode()
{
    return 0;
}

//Tracer
simulated function Destroyed()
{
    if (mTracer != None)
        mTracer.Destroy();

    Super.Destroyed();
}

//Tracer
simulated function UpdateTracer()
{
    local vector SpawnDir, SpawnVel;
    local float hitDist;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mTracer == None)
    {
        mTracer = Spawn(mTracerClass);
    }

    if (Level.bDropDetail || Level.DetailMode == DM_Low)
        mTracerInterval = 2 * Default.mTracerInterval;
    else
        mTracerInterval = Default.mTracerInterval;

    if (mTracer != None &amp;&amp; Level.TimeSeconds &gt; mLastTracerTime + mTracerInterval)
    {
            mTracer.SetLocation(WeaponFireLocation);

        hitDist = VSize(LastHitLocation - WeaponFireLocation) - mTracerPullback;

        if (Instigator != None &amp;&amp; Instigator.IsLocallyControlled())
            SpawnDir = vector(WeaponFireRotation);
        else
            SpawnDir = Normal(LastHitLocation - WeaponFireLocation);

        if(hitDist &gt; mTracerMinDistance)
        {
            SpawnVel = SpawnDir * mTracerSpeed;

            mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
            mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
            mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
            mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
            mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
            mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;

            mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed;
            mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;

            mTracer.SpawnParticle(1);
        }

        mLastTracerTime = Level.TimeSeconds;
    }
}

//Tracer
simulated function FlashMuzzleFlash()
{
    Super.FlashMuzzleFlash();

    if (Role &lt; ROLE_Authority)
        DualFireOffset *= -1;

    UpdateTracer();
}


// ONS Weapon - Machine Gun alternating Fire
event bool AttemptFire(Controller C, bool bAltFire)
{
    if(Role != ROLE_Authority || bForceCenterAim)
        return False;

    if (FireCountdown &lt;= 0)
    {
        CalcWeaponFire();
        if (bCorrectAim)
            WeaponFireRotation = AdjustAim(bAltFire);
        if (Spread &gt; 0)
            WeaponFireRotation = rotator(vector(WeaponFireRotation) + VRand()*FRand()*Spread);

            DualFireOffset *= -1;

        Instigator.MakeNoise(1.0);
        if (bAltFire &amp;&amp; ShellsLoaded &gt; 0)            //Cannot Altfire unless there are shells loaded
        {
            FireCountdown = AltFireInterval;
            ShellsLoaded--;
            AltFire(C);

            //
            Log(&quot;AttemptFire: bAltFire &amp;&amp; ShellsLoaded &gt; 0: &quot;$ShellsLoaded);
        }
        if (bAltFire &amp;&amp; ShellsLoaded &lt; 1)        //Play sound if no shells are loaded
        {
            PlaySound(sound'PickupSounds.FlakAmmoPickup', SLOT_Misc);
            
            //
            Log(&quot;AttemptFire: bAltFire &amp;&amp; ShellsLoaded &lt; 1: &quot;$ShellsLoaded);
        }
        else
        {
            FireCountdown = FireInterval;
            GatlingFire(C, false, true);
        }
        AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock;

        return True;
    }

    return False;
}


//DualACWeapon - Machine Gun Alternating Fire
function GatlingFire(Controller C, bool bAltFire, optional bool bDontSkip)
{
    if (!bSkipFire || bDontSkip)
    {
        CalcWeaponFire();
        if (bCorrectAim)
            WeaponFireRotation = AdjustAim(false);

        DualFireOffset *= -1;

        Instigator.MakeNoise(1.0);

        if (bAltFire)
        {
            FireCountdown = AltFireInterval;
            AltFire(C);
        }
        else
        {
            FireCountdown = FireInterval;
            Fire(C);
        }

        AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock;
    }
    else
    {
        FireCountdown = FireInterval;
    }

    bSkipFire = !bSkipFire;

    if (ChildWeapon != none &amp;&amp; EONSVultureWeapon(ChildWeapon) != None)
        EONSVultureWeapon(ChildWeapon).GatlingFire(C, bAltFire, bDontSkip);

}



//Shell Fire
state InstantFireMode
{
   function AltFire(Controller C)
   {
      if (ShellsLoaded &gt; 0)
      {
         SpawnProjectile(ProjectileClass, False);
         //SetTimer(ShellReloadTime, false);
         
         //
         Log(&quot;InstantFireMode AltFire: ShellsLoaded = &quot;$ShellsLoaded);
      }
      else
      {

      }
   }
}

/*
function Projectile SpawnProjectile(class&lt;Projectile&gt; ProjClass, bool bAltFire)
{
   if (ShellsLoaded &lt; 1)
   {
      PlaySound(sound'PickupSounds.FlakAmmoPickup', SLOT_Misc);
      return none;
   }
   else
      Super.SpawnProjectile(ProjClass, bAltFire);
}
*/

/*
simulated event Timer()
{
	//
}
*/

simulated function Tick(float DeltaTime)
{
   if (Role == ROLE_Authority)
	   {
	      // Shells reload after the change in time exceeds the specified charge duration
	      ShellReloadCounter+=DeltaTime;
	      if (ShellReloadCounter &gt; ShellReloadTime)
	      {
	         if (ShellsLoaded &lt; 2)
	         {
	            ShellsLoaded++;
	            
	            //
	            Log(&quot;Tick: Shells Loaded: &quot;$ShellsLoaded);
           }
           ShellReloadCounter = 0;

           //
           Log(&quot;Tick: Shell Reload Counter: &quot;$ShellReloadCounter);
	      }
	   }

	   Super.Tick(DeltaTime);
}

//Draw loading progress as chargebar
simulated function float ChargeBar()
{
    if (ShellsLoaded &lt; 2)
       return FClamp(ShellReloadCounter/ShellReloadTime, 0.0, 0.999);
    else
       return 0.999;
}


/*
//Handle display of loaded shells
simulated function DrawWeaponInfo(Canvas Canvas)
{
    NewDrawWeaponInfo(Canvas, 0.705*Canvas.ClipY);

    //
    Log(&quot;DrawWeaponInfo&quot;);
}
*/

//Handle display of loaded shells
//simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos)
simulated function DrawHud(Canvas Canvas)
{
    local int i,Count;
    local float ScaleFactor;

    ScaleFactor = 99 * Canvas.ClipX/3200;
    Canvas.Style = ERenderStyle.STY_Alpha;
    Canvas.DrawColor = class'HUD'.Default.WhiteColor;
    Count = Min(2, ShellsLoaded);
    for( i=0; i&lt;Count; i++ )
    {
        Canvas.SetPos(Canvas.ClipX - (0.5*i+1) * ScaleFactor, (0.705*Canvas.ClipY));  //YPos=0.705*Canvas.ClipY
        Canvas.DrawTile( Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 174, 259, 46, 45);
    }
    /*
    if ( ShellsLoaded &gt; 8 )
    {
        Count = Min(16,AmmoAmount(1));
        for( i=8; i&lt;Count; i++ )
        {
            Canvas.SetPos(Canvas.ClipX - (0.5*(i-8)+1) * ScaleFactor, YPos - ScaleFactor);
            Canvas.DrawTile( Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 174, 259, 46, 45);
        }
    }
    */

    //
    Log(&quot;NewDrawWeaponInfo&quot;);
}



defaultproperties
{
  Mesh=Mesh'ONSBPAnimations.DualAttackCraftSideGunMesh'
  YawBone=RL_Right
  PitchBone=RL_Right
  WeaponFireAttachmentBone=FirePoint

  bShowChargingBar=true
  bInstantFire=true
  bAimable=True
  bInstantRotation=true
  bIsRepeatingFF=True
  //bAmbientFireSound=True
  bDoOffsetTrace=true

  AmbientEffectEmitterClass=class'Onslaught.ONSRVChainGunFireEffect'
  FireInterval=0.10
  Spread=0.10
  DamageMin=7
  DamageMax=8
  RotationsPerSecond=0.09

  mTracerInterval=0.06
  mTracerClass=class'XEffects.NewTracer'
  mTracerPullback=100.0
  mTracerMinDistance=0.0
  mTracerSpeed=20000.0

  FireSoundClass=sound'ONSVehicleSounds-S.TankMachineGun01'
  SoundVolume=255
  AmbientSoundScaling=1.3
  FireSoundVolume=70.0
  AltFireSoundVolume=70.0

  ShakeOffsetMag=(X=1.0,Y=1.0,Z=1.0)
  ShakeOffsetRate=(X=1000.0,Y=1000.0,Z=1000.0)
  ShakeOffsetTime=2
  ShakeRotMag=(X=50.0,Y=50.0,Z=50.0)
  ShakeRotRate=(X=10000.0,Y=10000.0,Z=10000.0)
  ShakeRotTime=2

  YawStartConstraint=-5000
  YawEndConstraint=5000
  PitchUpLimit=18000
  PitchDownLimit=50000

  AIInfo(0)=(bInstantHit=true,AimError=750)
  AIInfo(1)=(bInstantHit=true,AimError=750)
  CullDistance=+8000.0
  
  //
  ProjectileClass=class'Onslaught.ONSRocketProjectile'
  //EffectEmitterClass=class'Onslaught.ONSTankFireEffect'
  AltFireInterval=2.5
  
  ShellsLoaded=2
  ShellReloadTime=6.000000
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>3147</id>
      <timestamp>2008-02-08T21:24:48Z</timestamp>
      <contributor>
        <ip>Pool-72-91-195-28.tampfl.fios.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">//===========================================================

// EONS Vulture

// EONS Vulture by Wail of Suicide

//===========================================================

class EONSVulture extends ONSAttackCraft;

var rotator FanYaw,TailYaw;

var float   FanYawRate;

simulated function PostNetBeginPlay()

{
    Super.PostNetBeginPlay();

    if (Role == ROLE_Authority)
    {
        if (WeaponPawns[0]!=None)
            WeaponPawns[0].Gun.SetOwner(self);

        if (Weapons.Length == 2 &amp;&amp; ONSLinkableWeapon(Weapons[0]) != None)
    {
        ONSLinkableWeapon(Weapons[0]).ChildWeapon = Weapons[1];
        if (EONSVultureWeapon(Weapons[1]) != None)
            EONSVultureWeapon(Weapons[1]).bSkipFire = True;

            if (EONSVultureWeapon(Weapons[0]) != None)
                EONSVultureWeapon(Weapons[0]).bFiresRight = true;
        }

    }

}

//

function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class&lt;DamageType&gt; DamageType)

{
    if ( (ClassIsChildOf(DamageType, class'DamTypeShockTankShockBall')) )
       Damage *= 2.00;

    Momentum *= 0.75; //
    Super.TakeDamage(Damage, instigatedBy, Hitlocation, Momentum, damageType);

}

//Ammo Stuff??? Or handle in gun

defaultproperties

{
     VehiclePositionString=&quot;in an EONS Vulture&quot;
     VehicleNameString=&quot;EONS Vulture&quot;

     Mesh=Mesh'ONSBPAnimations.DualAttackCraftMesh'
     RedSkin=texture'ONSBPTextures.CicadaTan'
     BlueSkin=texture'ONSBPTextures.CicadaGreen'

     HealthMax=900.000000
     Health=900

     EntryPosition=(X=0,Y=0,Z=-20)
     EntryRadius=300
     CollisionRadius=+240.0

     ExitPositions(0)=(X=0,Y=-400,Z=100)
     ExitPositions(1)=(X=0,Y=400,Z=100)
     ExitPositions(2)=(X=-600,Y=0,Z=100)

     VehicleMass=3.000000

     TPCamWorldOffset=(Z=350)
     TPCamDistance=1000.000000
     FanYawRate=98000

     IdleSound=sound'CicadaSnds.CicadaIdle'
     StartUpSound=sound'CicadaSnds.CicadaStartUp'
     ShutDownSound=sound'CicadaSnds.CicadaShutDown'

     TrailEffectPositions(0)=(X=250,Y=-20,Z=10);
     TrailEffectPositions(1)=(X=250,Y=20,Z=10);
     //TrailEffectClass=Class'ONS-MinusTankMeUp-)o(-Evo-V7.HammerExhaust'

     StreamerEffectOffset(0)=(X=-157.943192,Y=-230.908951,Z=89.714783)
     StreamerEffectOffset(1)=(X=-157.943192,Y=230.908951,Z=89.714783)
     StreamerEffectOffset(2)=(X=175.045227,Y=-265.933014,Z=-74.389023)
     StreamerEffectOffset(3)=(X=175.045227,Y=265.933014,Z=-74.389023)

     HeadlightCoronaOffset(0)=(X=289.538422,Y=4.749050,Z=-74.851456)
     HeadlightCoronaOffset(1)=(X=210.839508,Y=-159.415634,Z=-74.851456)
     HeadlightCoronaOffset(2)=(X=210.839508,Y=159.415634,Z=-74.851456)

     DriverWeapons(0)=(WeaponClass=Class'EONS-Cicada_BETA1.EONSVultureWeapon',WeaponBone=RightRLAttach)
     DriverWeapons(1)=(WeaponClass=Class'EONS-Cicada_BETA1.EONSVultureWeapon',WeaponBone=LeftRLAttach)
     //DriverWeapons(1)=(WeaponClass=Class'ONS-MinusTankMeUp-)o(-Evo-V7.HammerMinigunMaster',WeaponBone=&quot;leftminigun&quot;)
     //DriverWeapons(2)=(WeaponClass=Class'ONS-MinusTankMeUp-)o(-Evo-V7.HammerMinigun',WeaponBone=&quot;rightminigun&quot;)

     Begin Object Class=KarmaParamsRBFull Name=KParams0
         KInertiaTensor(0)=1.000000
         KInertiaTensor(3)=3.000000
         KInertiaTensor(5)=3.500000
         KCOMOffset=(X=-0.250000)
         KLinearDamping=0.000000
         KAngularDamping=0.000000
         KStartEnabled=True
         bKNonSphericalInertia=True
         KActorGravScale=0.000000
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=True
         bKStayUpright=True
         bKAllowRotate=True
         bDestroyOnWorldPenetrate=True
         bDoSafetime=True
         KFriction=0.500000
         KImpactThreshold=300.000000
         Name=&quot;KParams0&quot;
     End Object

     bSelected=True
     
     DestroyedVehicleMesh=StaticMesh'ONSBP_DestroyedVehicles.Cicada.DestroyedCicada'
     DestructionEffectClass=class'Onslaught.ONSVehicleExplosionEffect'
     DestructionLinearMomentum=(Min=250000,Max=400000)
     DestructionAngularMomentum=(Min=100,Max=150)
     DisintegrationHealth=-100
     DisintegrationEffectClass=class'OnslaughtBP.ONSDualACDeathExp'

}

//===========================================================

// EONS Vulture

// EONS Vulture by Wail of Suicide

//===========================================================

class EONSVultureWeapon extends ONSLinkableWeapon;

//Minigun turret

var class&lt;Emitter&gt;      mTracerClass;

var() editinline Emitter mTracer;

var() float             mTracerInterval;

var() float             mTracerPullback;

var() float             mTracerMinDistance;

var() float             mTracerSpeed;

var float               mLastTracerTime;

//Dual AC

var bool bSkipFire;         // If true, it ignore this shot and pass it to it's linked weapon

var bool bFiresRight;       // If true, this weapon will eject shells to the right instead of the left

//New

var int  ShellsLoaded;              // Vultures can only load 2 shells at a time.

var float ShellReloadTime;          // Once a shell has been shot, it takes this long to reload (Fire Interval only controls how long to fire the two loaded shells)

var float ShellReloadCounter;       // Tracks progress of reloading

#EXEC OBJ LOAD FILE=InterfaceContent.utx
#EXEC OBJ LOAD FILE=UT2004Weapons.utx

////

static function StaticPrecache(LevelInfo L)

{
    L.AddPrecacheMaterial(Material'VMparticleTextures.TankFiringP.CloudParticleOrangeBMPtex');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TracerShot');
    L.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex');
    L.AddPrecacheMaterial(Material'XEffects.RocketFlare');
    L.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TankTrail');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2');
    L.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned');
    L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1');
    L.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02');
    L.AddPrecacheMaterial(Material'EpicParticles.Smoke.SparkCloud_01aw');
    L.AddPrecacheMaterial(Material'BenTex01.Textures.SmokePuff01');
    L.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Part_explode2');
    L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot');

}

simulated function UpdatePrecacheMaterials()

{
    Level.AddPrecacheMaterial(Material'VMparticleTextures.TankFiringP.CloudParticleOrangeBMPtex');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TracerShot');
    Level.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex');
    Level.AddPrecacheMaterial(Material'XEffects.RocketFlare');
    Level.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TankTrail');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2');
    Level.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned');
    Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1');
    Level.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02');
    Level.AddPrecacheMaterial(Material'EpicParticles.Smoke.SparkCloud_01aw');
    Level.AddPrecacheMaterial(Material'BenTex01.Textures.SmokePuff01');
    Level.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Part_explode2');
    Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot');

    Super.UpdatePrecacheMaterials();

}

simulated function UpdatePrecacheStaticMeshes()

{
    Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj');
    Super.UpdatePrecacheStaticMeshes();

}

////

replication

{

	reliable if(bNetDirty &amp;&amp; Role==ROLE_Authority)

		ShellsLoaded;

}

//Tracer

function byte BestMode()

{
    return 0;

}

//Tracer

simulated function Destroyed()

{
    if (mTracer != None)
        mTracer.Destroy();

    Super.Destroyed();

}

//Tracer

simulated function UpdateTracer()

{
    local vector SpawnDir, SpawnVel;
    local float hitDist;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mTracer == None)
    {
        mTracer = Spawn(mTracerClass);
    }

    if (Level.bDropDetail || Level.DetailMode == DM_Low)
        mTracerInterval = 2 * Default.mTracerInterval;
    else
        mTracerInterval = Default.mTracerInterval;

    if (mTracer != None &amp;&amp; Level.TimeSeconds &gt; mLastTracerTime + mTracerInterval)
    {
            mTracer.SetLocation(WeaponFireLocation);

        hitDist = VSize(LastHitLocation - WeaponFireLocation) - mTracerPullback;

        if (Instigator != None &amp;&amp; Instigator.IsLocallyControlled())
            SpawnDir = vector(WeaponFireRotation);
        else
            SpawnDir = Normal(LastHitLocation - WeaponFireLocation);

        if(hitDist &gt; mTracerMinDistance)
        {
            SpawnVel = SpawnDir * mTracerSpeed;

            mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
            mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
            mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
            mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
            mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
            mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;

            mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed;
            mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;

            mTracer.SpawnParticle(1);
        }

        mLastTracerTime = Level.TimeSeconds;
    }

}

//Tracer

simulated function FlashMuzzleFlash()

{
    Super.FlashMuzzleFlash();

    if (Role &lt; ROLE_Authority)
        DualFireOffset *= -1;

    UpdateTracer();

}

// ONS Weapon - Machine Gun alternating Fire

event bool AttemptFire(Controller C, bool bAltFire)

{
    if(Role != ROLE_Authority || bForceCenterAim)
        return False;

    if (FireCountdown &lt;= 0)
    {
        CalcWeaponFire();
        if (bCorrectAim)
            WeaponFireRotation = AdjustAim(bAltFire);
        if (Spread &gt; 0)
            WeaponFireRotation = rotator(vector(WeaponFireRotation) + VRand()*FRand()*Spread);

            DualFireOffset *= -1;

        Instigator.MakeNoise(1.0);
        if (bAltFire &amp;&amp; ShellsLoaded &gt; 0)            //Cannot Altfire unless there are shells loaded
        {
            FireCountdown = AltFireInterval;
            ShellsLoaded&amp;ndash;;
            AltFire(C);

            //
            Log(&quot;AttemptFire: bAltFire &amp;&amp; ShellsLoaded &gt; 0: &quot;$ShellsLoaded);
        }
        if (bAltFire &amp;&amp; ShellsLoaded &lt; 1)        //Play sound if no shells are loaded
        {
            PlaySound(sound'PickupSounds.FlakAmmoPickup', SLOT_Misc);
            
            //
            Log(&quot;AttemptFire: bAltFire &amp;&amp; ShellsLoaded &lt; 1: &quot;$ShellsLoaded);
        }
        else
        {
            FireCountdown = FireInterval;
            GatlingFire(C, false, true);
        }
        AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock;

        return True;
    }

    return False;

}

//DualACWeapon - Machine Gun Alternating Fire

function GatlingFire(Controller C, bool bAltFire, optional bool bDontSkip)

{
    if (!bSkipFire || bDontSkip)
    {
        CalcWeaponFire();
        if (bCorrectAim)
            WeaponFireRotation = AdjustAim(false);

        DualFireOffset *= -1;

        Instigator.MakeNoise(1.0);

        if (bAltFire)
        {
            FireCountdown = AltFireInterval;
            AltFire(C);
        }
        else
        {
            FireCountdown = FireInterval;
            Fire(C);
        }

        AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock;
    }
    else
    {
        FireCountdown = FireInterval;
    }

    bSkipFire = !bSkipFire;

    if (ChildWeapon != none &amp;&amp; EONSVultureWeapon(ChildWeapon) != None)
        EONSVultureWeapon(ChildWeapon).GatlingFire(C, bAltFire, bDontSkip);

}

//Shell Fire

state InstantFireMode

{
   function AltFire(Controller C)
   {
      if (ShellsLoaded &gt; 0)
      {
         SpawnProjectile(ProjectileClass, False);
         //SetTimer(ShellReloadTime, false);
         
         //
         Log(&quot;InstantFireMode AltFire: ShellsLoaded = &quot;$ShellsLoaded);
      }
      else
      {

      }
   }

}

/*

function Projectile SpawnProjectile(class&lt;Projectile&gt; ProjClass, bool bAltFire)

{
   if (ShellsLoaded &lt; 1)
   {
      PlaySound(sound'PickupSounds.FlakAmmoPickup', SLOT_Misc);
      return none;
   }
   else
      Super.SpawnProjectile(ProjClass, bAltFire);

}
*/

/*

simulated event Timer()

{

	//

}
*/

simulated function Tick(float DeltaTime)

{
   if (Role == ROLE_Authority)

	   {

	      // Shells reload after the change in time exceeds the specified charge duration

	      ShellReloadCounter+=DeltaTime;

	      if (ShellReloadCounter &gt; ShellReloadTime)

	      {

	         if (ShellsLoaded &lt; 2)

	         {

	            ShellsLoaded++;

	            

	            //

	            Log(&quot;Tick: Shells Loaded: &quot;$ShellsLoaded);
           }
           ShellReloadCounter = 0;

           //
           Log(&quot;Tick: Shell Reload Counter: &quot;$ShellReloadCounter);

	      }

	   }

	   Super.Tick(DeltaTime);

}

//Draw loading progress as chargebar

simulated function float ChargeBar()

{
    if (ShellsLoaded &lt; 2)
       return FClamp(ShellReloadCounter/ShellReloadTime, 0.0, 0.999);
    else
       return 0.999;

}

/*

//Handle display of loaded shells

simulated function DrawWeaponInfo(Canvas Canvas)

{
    NewDrawWeaponInfo(Canvas, 0.705*Canvas.ClipY);

    //
    Log(&quot;DrawWeaponInfo&quot;);

}
*/

//Handle display of loaded shells

//simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos)

simulated function DrawHud(Canvas Canvas)

{
    local int i,Count;
    local float ScaleFactor;

    ScaleFactor = 99 * Canvas.ClipX/3200;
    Canvas.Style = ERenderStyle.STY_Alpha;
    Canvas.DrawColor = class'HUD'.Default.WhiteColor;
    Count = Min(2, ShellsLoaded);
    for( i=0; i&lt;Count; i++ )
    {
        Canvas.SetPos(Canvas.ClipX - (0.5*i+1) * ScaleFactor, (0.705*Canvas.ClipY));  //YPos=0.705*Canvas.ClipY
        Canvas.DrawTile( Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 174, 259, 46, 45);
    }
    /*
    if ( ShellsLoaded &gt; 8 )
    {
        Count = Min(16,AmmoAmount(1));
        for( i=8; i&lt;Count; i++ )
        {
            Canvas.SetPos(Canvas.ClipX - (0.5*(i-8)+1) * ScaleFactor, YPos - ScaleFactor);
            Canvas.DrawTile( Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 174, 259, 46, 45);
        }
    }
    */

    //
    Log(&quot;NewDrawWeaponInfo&quot;);

}

defaultproperties

{
  Mesh=Mesh'ONSBPAnimations.DualAttackCraftSideGunMesh'
  YawBone=RL_Right
  PitchBone=RL_Right
  WeaponFireAttachmentBone=FirePoint

  bShowChargingBar=true
  bInstantFire=true
  bAimable=True
  bInstantRotation=true
  bIsRepeatingFF=True
  //bAmbientFireSound=True
  bDoOffsetTrace=true

  AmbientEffectEmitterClass=class'Onslaught.ONSRVChainGunFireEffect'
  FireInterval=0.10
  Spread=0.10
  DamageMin=7
  DamageMax=8
  RotationsPerSecond=0.09

  mTracerInterval=0.06
  mTracerClass=class'XEffects.NewTracer'
  mTracerPullback=100.0
  mTracerMinDistance=0.0
  mTracerSpeed=20000.0

  FireSoundClass=sound'ONSVehicleSounds-S.TankMachineGun01'
  SoundVolume=255
  AmbientSoundScaling=1.3
  FireSoundVolume=70.0
  AltFireSoundVolume=70.0

  ShakeOffsetMag=(X=1.0,Y=1.0,Z=1.0)
  ShakeOffsetRate=(X=1000.0,Y=1000.0,Z=1000.0)
  ShakeOffsetTime=2
  ShakeRotMag=(X=50.0,Y=50.0,Z=50.0)
  ShakeRotRate=(X=10000.0,Y=10000.0,Z=10000.0)
  ShakeRotTime=2

  YawStartConstraint=-5000
  YawEndConstraint=5000
  PitchUpLimit=18000
  PitchDownLimit=50000

  AIInfo(0)=(bInstantHit=true,AimError=750)
  AIInfo(1)=(bInstantHit=true,AimError=750)
  CullDistance=+8000.0
  
  //
  ProjectileClass=class'Onslaught.ONSRocketProjectile'
  //EffectEmitterClass=class'Onslaught.ONSTankFireEffect'
  AltFireInterval=2.5
  
  ShellsLoaded=2
  ShellReloadTime=6.000000

}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EONSBioRifle</title>
    <id>1205</id>
    <revision>
      <id>3128</id>
      <timestamp>2007-10-26T05:47:57Z</timestamp>
      <contributor>
        <ip>Wail</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Status: Incomplete Functionality. Feel free to help me finish this weapon!

Description: The EONS Bio Rifle is intended as an improved version of the UT2004 Bio Rifle, primarily for use in the ONS gametype where long engagement ranges and the interaction of biogoo with vehicles makes the weapon subpar.

New Features:

1. Single Fire Primary is gone. Primary fire now charges up on hold. Single glob fire can be achieved via tapping the fire button.

2. (Does not work) Using the charged fire mode, the EONS Bio Rifle can be alternated between firing a single concentrated glob and a horizontal line of blobs (number of blobs determined by current charge level).

3. (Currently disabled, seeking a solution to 2.) When the aiming reticle is held on a target for a short period of time, the Bio Rifle automatically primes itself to launch glob projectiles at a higher velocity, giving the weapon additional effectiveness at longer ranges.

4. Secondary fire unleashes a stream of aerosolized bio goo, providing effective destruction in a short range at the expense of quickly expending the weapon's ammo.*

*This firing mode has a minor error that shows up in UT2004's log, 

Current code is provided below. 

&lt;uscript&gt;
//===================
// EONSBioRifle
// Alternate Fire uses code modified from Mr. Pants' Excessive Overkill FlamethrowerEX written by Dan 'MadNad' Woodall
//===================

class EONSBioRifle extends BioRifle;

var Pawn SeekTarget;
var float LockTime, UnLockTime, SeekCheckTime;
var bool bLockedOn, bBreakLock;
var bool bLineSpread;
var Sound LockOnSound, LockBrokenSound;
var() float SeekCheckFreq, SeekRange;
var() float LockRequiredTime, UnLockRequiredTime;
var() float LockAim;
var() Color CrosshairColor;
var() float CrosshairX, CrosshairY;


replication
{
    reliable if (Role == ROLE_Authority &amp;&amp; bNetOwner)
        bLockedOn;

    reliable if (Role &lt; ROLE_Authority)
        ServerSetLineSpread, ServerClearLineSpread;
}

function Tick(float dt)
{
    local Pawn Other;
    local Vector StartTrace;
    local Rotator Aim;
    local float BestDist, BestAim;

    if (Instigator == None || Instigator.Weapon != self)
        return;

    if ( Role &lt; ROLE_Authority )
        return;

    if ( !Instigator.IsHumanControlled() )
        return;

    if (Level.TimeSeconds &gt; SeekCheckTime)
    {
        if (bBreakLock)
        {
            bBreakLock = false;
            bLockedOn = false;
            SeekTarget = None;
        }

        StartTrace = Instigator.Location + Instigator.EyePosition();
        Aim = Instigator.GetViewRotation();

        BestAim = LockAim;
        Other = Instigator.Controller.PickTarget(BestAim, BestDist, Vector(Aim), StartTrace, SeekRange);

        if ( CanLockOnTo(Other) )
        {
            if (Other == SeekTarget)
            {
                LockTime += SeekCheckFreq;
                if (!bLockedOn &amp;&amp; LockTime &gt;= LockRequiredTime)
                {
                    bLockedOn = true;
                    PlayerController(Instigator.Controller).ClientPlaySound(LockOnSound);
                 }
            }
            else
            {
                SeekTarget = Other;
                LockTime = 0.0;
            }
            UnLockTime = 0.0;
        }
        else
        {
            if (SeekTarget != None)
            {
                UnLockTime += SeekCheckFreq;
                if (UnLockTime &gt;= UnLockRequiredTime)
                {
                    SeekTarget = None;
                    if (bLockedOn)
                    {
                        bLockedOn = false;
                        PlayerController(Instigator.Controller).ClientPlaySound(LockBrokenSound);
                    }
                }
            }
            else
                 bLockedOn = false;
         }

        SeekCheckTime = Level.TimeSeconds + SeekCheckFreq;
    }
}

function bool CanLockOnTo(Actor Other)
{
    local Pawn P;
    
    P = Pawn(Other);

    if (P == None || P == Instigator || !P.bProjTarget)
        return false;

    if (!Level.Game.bTeamGame)
        return true;

    if ( (Instigator.Controller != None) &amp;&amp; Instigator.Controller.SameTeamAs(P.Controller) )
        return false;
        
    return ( (P.PlayerReplicationInfo == None) || (P.PlayerReplicationInfo.Team != Instigator.PlayerReplicationInfo.Team) );
}

simulated event RenderOverlays( Canvas Canvas )
{
    if (bLockedOn)
    {
        Canvas.DrawColor = CrosshairColor;
        Canvas.DrawColor.A = 255;
        Canvas.Style = ERenderStyle.STY_Alpha;

        Canvas.SetPos(Canvas.SizeX*0.5-CrosshairX, Canvas.SizeY*0.5-CrosshairY);
        Canvas.DrawTile(Texture'SniperArrows', CrosshairX*2.0, CrosshairY*2.0, 0.0, 0.0, Texture'SniperArrows'.USize, Texture'SniperArrows'.VSize);
    }

    Super.RenderOverlays(Canvas);
}

simulated function SetLineSpread(bool bNew, optional bool bForce)
{
    if ( (bLineSpread != bNew) || bForce )
    {
        bLineSpread = bNew;
        if ( bLineSpread )
            ServerSetLineSpread();
        else
            ServerClearLineSpread();
    }
}

function ServerClearLineSpread()
{
    bLineSpread = false;
}

function ServerSetLineSpread()
{
    bLineSpread = true;
}

//

//This determines Volley/Spread
simulated event ClientStartFire(int Mode)
{
    local int OtherMode;

    if ( EONSBioMultiFire(FireMode[Mode]) != None )
    {
        SetLineSpread(false);
    }
    else
    {
        if ( Mode == 0 )
            OtherMode = 1;
        else
            OtherMode = 0;

        if ( FireMode[OtherMode].bIsFiring || (FireMode[OtherMode].NextFireTime &gt; Level.TimeSeconds) )
        {
            //if ( FireMode[OtherMode].Load &gt; 0 )
                SetLineSpread(true);
            if ( bDebugging )
                log(&quot;No RL reg fire because other firing &quot;$FireMode[OtherMode].bIsFiring$&quot; next fire &quot;$(FireMode[OtherMode].NextFireTime - Level.TimeSeconds));
            return;
        }
    }
    Super.ClientStartFire(Mode);
}

simulated function bool StartFire(int Mode)
{
    local int OtherMode;

    if ( Mode == 0 )
        OtherMode = 1;
    else
        OtherMode = 0;
    if ( FireMode[OtherMode].bIsFiring || (FireMode[OtherMode].NextFireTime &gt; Level.TimeSeconds) )
        return false;

    return Super.StartFire(Mode);
}

//


defaultproperties
{
    ItemName=&quot;EONS Bio-Rifle&quot;

    FireModeClass(0)=EONSBioMultiFire
    FireModeClass(1)=EONSBioAltFire
    InventoryGroup=3

    PickupClass=class'EONSBioRiflePickup'
    EffectOffset=(X=100.0,Y=32.0,Z=-20.0)
    AttachmentClass=class'BioAttachment'
    PutDownAnim=PutDown

    DisplayFOV=60
    DrawScale=1.0
    PlayerViewOffset=(X=7,Y=3,Z=0)
    SmallViewOffset=(X=19,Y=9,Z=-6)

    PlayerViewPivot=(Pitch=0,Roll=0,Yaw=0)
    SelectSound=Sound'WeaponSounds.FlakCannon.SwitchToFlakCannon'
    SelectForce=&quot;SwitchToFlakCannon&quot;

    AIRating=+0.55
    CurrentRating=+0.55

    SeekCheckFreq=0.2
    SeekRange=10240
    LockRequiredTime=0.4
    UnLockRequiredTime=0.6
    LockAim=0.996 // 5 deg

    CustomCrosshairColor=(r=0,g=255,b=0,a=255)

    //Lock On Attr
    CrosshairColor=(R=0,G=255,B=0,A=255)
    CrosshairX=32
    CrosshairY=32
    LockOnSound=Sound'WeaponSounds.TAGRifle.TagTargetAquired'
    LockBrokenSound=Sound'WeaponSounds.TAGRifle.TagTargetAquired'

    CenteredOffsetY=-8.0
}
&lt;/uscript&gt;

&lt;uscript&gt;
//===================
// EONSBioMultiFire
//===================

class EONSBioMultiFire extends BioChargedFire;

var() float TightSpread, LineSpread;


event ModeDoFire()
{
    if ( EONSBioRifle(Weapon).bLineSpread || ((Bot(Instigator.Controller) != None) &amp;&amp; (FRand() &lt; 0.65)) )
    {
        Spread = LineSpread;
        SpreadStyle = SS_Line;
    }
    else
    {
        SpreadStyle = SS_Ring;
        Spread = TightSpread;
    }
    EONSBioRifle(Weapon).bLineSpread = false;
    Super(ProjectileFire).ModeDoFire();
    NextFireTime = FMax(NextFireTime, Level.TimeSeconds + FireRate);
}

/*
function DoFireEffect()
{
 Load = GoopLoad;
 Super.DoFireEffect();
}
*/

function DoFireEffect()
{
    local EONSBioGlob FiredGlobs[10];
    local Vector StartProj, StartTrace, X,Y,Z;
    local Rotator Aim;
    local Vector HitLocation, HitNormal,FireLocation;
    local int p;
    local Actor Other;
    local float theta;

    if (SpreadStyle != SS_Line)
    {
        Log(&quot;DoFireEffect: SpreadStyle != Line&quot;);
        Super.DoFireEffect();
        return;
    }

    Instigator.MakeNoise(1.0);
    Weapon.GetViewAxes(X,Y,Z);

    StartTrace = Instigator.Location + Instigator.EyePosition();
    StartProj = StartTrace + X*ProjSpawnOffset.X + Z*ProjSpawnOffset.Z;
    if ( !Weapon.WeaponCentered() )
        StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y;

    // check if projectile would spawn through a wall and adjust start location accordingly
    Other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false);
    if (Other != None)
    {
        StartProj = HitLocation;
    }

    Aim = AdjustAim(StartProj, AimError);

    Log(&quot;DoFireEffect: SpreadStyle == Line&quot;);
    for (p = 0; p &lt; GoopLoad; p++)
        {
            theta = Spread*PI/32768*(p - float(GoopLoad-1)/2.0);
            X.X = Cos(theta);
            X.Y = Sin(theta);
            X.Z = 0.0;
            //SpawnProjectile(StartProj, Rotator(X &gt;&gt; Aim));
            FiredGlobs[p] = EONSBioGlob(SpawnProjectile(FireLocation, Rotator(X &gt;&gt; Aim)));
        }


}


function projectile SpawnProjectile(Vector Start, Rotator Dir)
{
    local EONSBioGlob Glob;

    GotoState('');

    if (GoopLoad == 0) return None;

    if (Spread != LineSpread) //(!EONSBioRifle(Weapon).bLineSpread)
    {
       Glob = Weapon.Spawn(class'EONSBioGlob',,, Start, Dir);
       Log(&quot;Check 1&quot;);
       if ( Glob != None )
       {
          Glob.Damage *= DamageAtten;
          Glob.SetGoopLevel(GoopLoad);
          Glob.AdjustSpeed();
       }
    }
    else
    {

       Log(&quot;Check 2&quot;);
       if ( Glob != None )
       {
          Glob.Damage *= DamageAtten;
          Glob.SetGoopLevel(1);
          Glob.AdjustSpeed();
       }
    }
    GoopLoad = 0;
    if ( Weapon.AmmoAmount(ThisModeNum) &lt;= 0 )
        Weapon.OutOfAmmo();
    return Glob;
}


defaultproperties
{
    AmmoClass=class'EONSBioAmmo'
    AmmoPerFire=1

    FireAnim=AltFire
    FireAnimRate=1.0

    ProjectileClass=class'EONSBioGlob'

    FlashEmitterClass=class'XEffects.BioMuzFlash1st'

    SpreadStyle=SS_Line
    TightSpread=300
    LineSpread=500

    ProjSpawnOffset=(X=25,Y=6,Z=-6)

    FireSound=Sound'WeaponSounds.BioRifle.BioRifleFire'

    FireForce=&quot;RocketLauncherFire&quot;  // jdf

    FireRate=0.33
    TweenTime=0.0

    bFireOnRelease=true
    //MaxHoldTime=10.5 // FireRate*2 + 0.5

    bSplashDamage=true
    bRecommendSplashDamage=true
    BotRefireRate=0.6
    WarnTargetPct=+0.9
    bSplashJump=true

    ShakeOffsetMag=(X=-20.0,Y=0.00,Z=0.00)
    ShakeOffsetRate=(X=-1000.0,Y=0.0,Z=0.0)
    ShakeOffsetTime=2
    ShakeRotMag=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotRate=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotTime=2
}
&lt;/uscript&gt;

&lt;uscript&gt;
//=========================================================================
// EONSBioAltFire
// Alternate Fire uses code modified from Mr. Pants' Excessive Overkill FlamethrowerEX written by Dan 'MadNad' Woodall
// ========================================================================

class EONSBioAltFire extends ProjectileFire;

var xEmitter BGas;

function Projectile SpawnProjectile(Vector Start, Rotator Dir)
{
    local Projectile P;

    if ( class'PlayerController'.Default.bSmallWeapons || Level.bClassicView )
       ProjSpawnOffset.Z = -20;

    else
       ProjSpawnOffset.Z = default.ProjSpawnOffset.Z;

    if( ProjectileClass != None )
        P = Spawn(ProjectileClass,,, Start, Dir);

    if( P == None )
        return None;

    P.Damage *= DamageAtten;

    return P;

}

event ModeDoFire()
{
	local Vector Dir;

	super.ModeDoFire();

	Dir = Vector(Weapon.Rotation);

	if ( Weapon.AmmoAmount(0) &gt; 1 &amp;&amp; !Instigator.isA('Bot') )
	    EONSBioRifle(Weapon).SoundVolume=255;

	BGas=spawn(class'EONSBioGasIgnite',Owner,,,);
	Weapon.AttachToBone(BGas, 'tip');
  BGas.mSpeedRange[0]+=Abs(VSize(Instigator.Velocity/VSize(Dir)));
  BGas.mSpeedRange[1]+=Abs(VSize(Instigator.Velocity/VSize(Dir)));
	if ( Weapon.ammoAmount(0) &lt; 2 )
	    EONSBioRifle(Weapon).SoundVolume=0;
}

simulated function StopFiring()
{
		EONSBioRifle(Weapon).SoundVolume=0;
}

defaultproperties
{
     ProjSpawnOffset=(Y=40.000000)
     bPawnRapidFireAnim=True
     FireForce=&quot;minifireb&quot;
     FireRate=0.06
     AmmoClass=Class'EONSBioAmmo'
     AmmoPerFire=1
     ShakeRotMag=(X=15.000000,Y=15.000000,Z=15.000000)
     ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-5.000000)
     ShakeOffsetRate=(X=-500.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'EONSBioGasProj'
     BotRefireRate=0.990000
     aimerror=120.000000
     Spread=2000.000000
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>3129</id>
      <timestamp>2007-10-26T05:43:13Z</timestamp>
      <contributor>
        <ip>Wail</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'EONS Bio Rifle'

Status: Incomplete Functionality.

Description: The EONS Bio Rifle is intended as an improved version of the UT2004 Bio Rifle, primarily for use in the ONS gametype where long engagement ranges and the interaction of biogoo with vehicles makes the weapon subpar.

New Features:

1. Single Fire Primary is gone. Primary fire now charges up on hold. Single glob fire can be achieved via tapping the fire button.

2. (Does not work) Using the charged fire mode, the EONS Bio Rifle can be alternated between firing a single concentrated glob and a horizontal line of blobs (number of blobs determined by current charge level).

3. (Currently disabled, seeking a solution to 2.) When the aiming reticle is held on a target for a short period of time, the Bio Rifle automatically primes itself to launch glob projectiles at a higher velocity, giving the weapon additional effectiveness at longer ranges.

4. Secondary fire unleashes a stream of aerosolized bio goo, providing effective destruction in a short range at the expense of quickly expending the weapon's ammo.*

Current code is provided below. 

&lt;uscript&gt;
//===================
// EONSBioRifle
// Alternate Fire uses code modified from Mr. Pants' Excessive Overkill FlamethrowerEX written by Dan 'MadNad' Woodall
//===================

class EONSBioRifle extends BioRifle;

var Pawn SeekTarget;
var float LockTime, UnLockTime, SeekCheckTime;
var bool bLockedOn, bBreakLock;
var bool bLineSpread;
var Sound LockOnSound, LockBrokenSound;
var() float SeekCheckFreq, SeekRange;
var() float LockRequiredTime, UnLockRequiredTime;
var() float LockAim;
var() Color CrosshairColor;
var() float CrosshairX, CrosshairY;


replication
{
    reliable if (Role == ROLE_Authority &amp;&amp; bNetOwner)
        bLockedOn;

    reliable if (Role &lt; ROLE_Authority)
        ServerSetLineSpread, ServerClearLineSpread;
}

function Tick(float dt)
{
    local Pawn Other;
    local Vector StartTrace;
    local Rotator Aim;
    local float BestDist, BestAim;

    if (Instigator == None || Instigator.Weapon != self)
        return;

    if ( Role &lt; ROLE_Authority )
        return;

    if ( !Instigator.IsHumanControlled() )
        return;

    if (Level.TimeSeconds &gt; SeekCheckTime)
    {
        if (bBreakLock)
        {
            bBreakLock = false;
            bLockedOn = false;
            SeekTarget = None;
        }

        StartTrace = Instigator.Location + Instigator.EyePosition();
        Aim = Instigator.GetViewRotation();

        BestAim = LockAim;
        Other = Instigator.Controller.PickTarget(BestAim, BestDist, Vector(Aim), StartTrace, SeekRange);

        if ( CanLockOnTo(Other) )
        {
            if (Other == SeekTarget)
            {
                LockTime += SeekCheckFreq;
                if (!bLockedOn &amp;&amp; LockTime &gt;= LockRequiredTime)
                {
                    bLockedOn = true;
                    PlayerController(Instigator.Controller).ClientPlaySound(LockOnSound);
                 }
            }
            else
            {
                SeekTarget = Other;
                LockTime = 0.0;
            }
            UnLockTime = 0.0;
        }
        else
        {
            if (SeekTarget != None)
            {
                UnLockTime += SeekCheckFreq;
                if (UnLockTime &gt;= UnLockRequiredTime)
                {
                    SeekTarget = None;
                    if (bLockedOn)
                    {
                        bLockedOn = false;
                        PlayerController(Instigator.Controller).ClientPlaySound(LockBrokenSound);
                    }
                }
            }
            else
                 bLockedOn = false;
         }

        SeekCheckTime = Level.TimeSeconds + SeekCheckFreq;
    }
}

function bool CanLockOnTo(Actor Other)
{
    local Pawn P;
    
    P = Pawn(Other);

    if (P == None || P == Instigator || !P.bProjTarget)
        return false;

    if (!Level.Game.bTeamGame)
        return true;

    if ( (Instigator.Controller != None) &amp;&amp; Instigator.Controller.SameTeamAs(P.Controller) )
        return false;
        
    return ( (P.PlayerReplicationInfo == None) || (P.PlayerReplicationInfo.Team != Instigator.PlayerReplicationInfo.Team) );
}

simulated event RenderOverlays( Canvas Canvas )
{
    if (bLockedOn)
    {
        Canvas.DrawColor = CrosshairColor;
        Canvas.DrawColor.A = 255;
        Canvas.Style = ERenderStyle.STY_Alpha;

        Canvas.SetPos(Canvas.SizeX*0.5-CrosshairX, Canvas.SizeY*0.5-CrosshairY);
        Canvas.DrawTile(Texture'SniperArrows', CrosshairX*2.0, CrosshairY*2.0, 0.0, 0.0, Texture'SniperArrows'.USize, Texture'SniperArrows'.VSize);
    }

    Super.RenderOverlays(Canvas);
}

simulated function SetLineSpread(bool bNew, optional bool bForce)
{
    if ( (bLineSpread != bNew) || bForce )
    {
        bLineSpread = bNew;
        if ( bLineSpread )
            ServerSetLineSpread();
        else
            ServerClearLineSpread();
    }
}

function ServerClearLineSpread()
{
    bLineSpread = false;
}

function ServerSetLineSpread()
{
    bLineSpread = true;
}

//

//This determines Volley/Spread
simulated event ClientStartFire(int Mode)
{
    local int OtherMode;

    if ( EONSBioMultiFire(FireMode[Mode]) != None )
    {
        SetLineSpread(false);
    }
    else
    {
        if ( Mode == 0 )
            OtherMode = 1;
        else
            OtherMode = 0;

        if ( FireMode[OtherMode].bIsFiring || (FireMode[OtherMode].NextFireTime &gt; Level.TimeSeconds) )
        {
            //if ( FireMode[OtherMode].Load &gt; 0 )
                SetLineSpread(true);
            if ( bDebugging )
                log(&quot;No RL reg fire because other firing &quot;$FireMode[OtherMode].bIsFiring$&quot; next fire &quot;$(FireMode[OtherMode].NextFireTime - Level.TimeSeconds));
            return;
        }
    }
    Super.ClientStartFire(Mode);
}

simulated function bool StartFire(int Mode)
{
    local int OtherMode;

    if ( Mode == 0 )
        OtherMode = 1;
    else
        OtherMode = 0;
    if ( FireMode[OtherMode].bIsFiring || (FireMode[OtherMode].NextFireTime &gt; Level.TimeSeconds) )
        return false;

    return Super.StartFire(Mode);
}

//


defaultproperties
{
    ItemName=&quot;EONS Bio-Rifle&quot;

    FireModeClass(0)=EONSBioMultiFire
    FireModeClass(1)=EONSBioAltFire
    InventoryGroup=3

    PickupClass=class'EONSBioRiflePickup'
    EffectOffset=(X=100.0,Y=32.0,Z=-20.0)
    AttachmentClass=class'BioAttachment'
    PutDownAnim=PutDown

    DisplayFOV=60
    DrawScale=1.0
    PlayerViewOffset=(X=7,Y=3,Z=0)
    SmallViewOffset=(X=19,Y=9,Z=-6)

    PlayerViewPivot=(Pitch=0,Roll=0,Yaw=0)
    SelectSound=Sound'WeaponSounds.FlakCannon.SwitchToFlakCannon'
    SelectForce=&quot;SwitchToFlakCannon&quot;

    AIRating=+0.55
    CurrentRating=+0.55

    SeekCheckFreq=0.2
    SeekRange=10240
    LockRequiredTime=0.4
    UnLockRequiredTime=0.6
    LockAim=0.996 // 5 deg

    CustomCrosshairColor=(r=0,g=255,b=0,a=255)

    //Lock On Attr
    CrosshairColor=(R=0,G=255,B=0,A=255)
    CrosshairX=32
    CrosshairY=32
    LockOnSound=Sound'WeaponSounds.TAGRifle.TagTargetAquired'
    LockBrokenSound=Sound'WeaponSounds.TAGRifle.TagTargetAquired'

    CenteredOffsetY=-8.0
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EONSGrenadeLauncher</title>
    <id>1215</id>
    <revision>
      <id>3145</id>
      <timestamp>2007-11-05T07:10:05Z</timestamp>
      <contributor>
        <ip>Wail</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Status: Finished. Feel free to use code derived from this weapon, but please provide credit to me in the comments and/or ReadMe file of your new creation.

Description: The EONS Grenade Launcher is a modification of the UT2004 ONS Grenade Launcher intended to improve the weapon's usefulness in a variety of situations.

New Features:

1. Grenades fire on primary fire at a much higher velocity. Additionally, grenades fire roughly 15% faster, but do 15% less damage and have only 90% of the original blast radius.

2. Grenades explosions create electromagnetic interference capable of temporarily disabling a vehicle and ejecting its driver (if any). Light vehicles have a 50% chance to be disabled, Medium vehicles have a 25% chance to be disabled, and Heavy vehicles have a 10% chance to be disabled.

3. The secondary fire triggering mechanism has an improved rate of fire.

&lt;uscript&gt;//========================================================================
// EONSGrenadeLauncher
// EONS Grenade Launcher written by Wail of Suicide
// Feel free to use this content in any maps you create, but please provide credit in the readme.
// Contact: wailofsuicide@gmail.com - Comments and suggestions welcome.
//========================================================================

class EONSGrenadeLauncher extends ONSGrenadeLauncher;

defaultproperties
{
 ItemName=&quot;EONS Grenade Launcher&quot;
 Description=&quot;The EONS Grenade Launcher fires electro-magnetic grenades at high velocity, which will attach to enemy players and vehicles. The magnetic interference caused by an exploding EONS grenade has a chance of disabling vehicles and ejecting their drivers.&quot;
 InventoryGroup=3
 GroupOffset=10
 FireModeClass(0)=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeLauncherFire'
 FireModeClass(1)=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeLauncherAltFire'
 PickupClass=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeLauncherPickup'
}
&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSGrenadeLauncherFire
// Enhanced Grenade Launcher written by Wail of Suicide 4/8/06
//========================================================================

class EONSGrenadeLauncherFire extends ONSGrenadeFire;

defaultproperties
{
 ProjectileClass=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeProjectile'
 FireRate=0.55
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSGrenadeProjectile
// Enhanced Grenade Launcher written by Wail of Suicide
//========================================================================

class EONSGrenadeProjectile extends ONSGrenadeProjectile;

#exec AUDIO IMPORT FILE=&quot;Sounds\GrenadeFloor.wav&quot; NAME=&quot;GrenadeFloor&quot; GROUP=&quot;GrenadeLauncher&quot;

//Altered Explosion VFX
simulated function Destroyed()
{
    if ( Trail != None )
        Trail.mRegen = false; // stop the emitter from regenerating
    //explosion
    if ( !bNoFX )
    {
        if ( EffectIsRelevant(Location,false) )
        {
            Spawn(class'EONSGrenadeExplosionEffect',,, Location, rotator(vect(0,0,1)));
            Spawn(ExplosionDecal,self,, Location, rotator(vect(0,0,-1)));
        }
        PlaySound(Sound'WeaponSounds.ShockRifle.ShockComboFire',,3.75*TransientSoundVolume);
    }
    if ( EONSGrenadeLauncher(Owner) != None)
        EONSGrenadeLauncher(Owner).CurrentGrenades--;

    if ( Beacon != None )
        Beacon.Destroy();

    Super(Projectile).Destroyed();
}

//Changed Grenade Trail
simulated function PostBeginPlay()
{
    local PlayerController PC;

    Super(Projectile).PostBeginPlay();

    if ( Level.NetMode != NM_DedicatedServer)
    {
        PC = Level.GetLocalPlayerController();
        if ( (PC.ViewTarget != None) &amp;&amp; VSize(PC.ViewTarget.Location - Location) &lt; 5500 )
            Trail = Spawn(class'EONS-GrenadeLauncher_BETA1.EONSGrenadeSmokeTrail', self,, Location, Rotation);
    }

    Velocity = Speed * Vector(Rotation);
    RandSpin(25000);
    if (PhysicsVolume.bWaterVolume)
        Velocity = 0.6*Velocity;

    if (Role == ROLE_Authority &amp;&amp; Instigator != None)
        Team = Instigator.GetTeamNum();
}

//Modified projectile bounce SFX volume
simulated function HitWall( vector HitNormal, actor Wall )
{
    local Vector VNorm;
    local PlayerController PC;

    if (Vehicle(Wall) != None)
    {
        Touch(Wall);
        return;
    }

    // Reflect off Wall w/damping
    VNorm = (Velocity dot HitNormal) * HitNormal;
    Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel;

    RandSpin(100000);
    Speed = VSize(Velocity);

    if ( Speed &lt; 40 )
    {
        bBounce = False;
        SetPhysics(PHYS_None);
        if ( Trail != None )
            Trail.mRegen = false; // stop the emitter from regenerating
    }
    else
    {
        if ( (Level.NetMode != NM_DedicatedServer) &amp;&amp; (Speed &gt; 250) )
            PlaySound(ImpactSound, SLOT_Misc,7.5*TransientSoundVolume);
        if ( !Level.bDropDetail &amp;&amp; (Level.DetailMode != DM_Low) &amp;&amp; (Level.TimeSeconds - LastSparkTime &gt; 0.5) &amp;&amp; EffectIsRelevant(Location,false) )
        {
            PC = Level.GetLocalPlayerController();
            if ( (PC.ViewTarget != None) &amp;&amp; VSize(PC.ViewTarget.Location - Location) &lt; 2000 )
                Spawn(HitEffectClass,,, Location, Rotator(HitNormal));
            LastSparkTime = Level.TimeSeconds;
        }
    }
}


simulated function HurtRadius( float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation )
{
    local actor Victims;
    local float damageScale, dist;
    local vector dir;
    local float r;

    if ( bHurtEntry )
        return;

    bHurtEntry = true;
    foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation )
    {
        r = FRand();

        // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
        if( (Victims != self) &amp;&amp; (Hurtwall != Victims) &amp;&amp; (Victims.Role == ROLE_Authority) &amp;&amp; !Victims.IsA('FluidSurfaceInfo') )
        {
            dir = Victims.Location - HitLocation;
            dist = FMax(1,VSize(dir));
            dir = dir/dist;
            damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
            if ( Instigator == None || Instigator.Controller == None )
                Victims.SetDelayedDamageInstigatorController( InstigatorController );
            if ( Victims == LastTouched )
                LastTouched = None;
            Victims.TakeDamage
            (
                damageScale * DamageAmount,
                Instigator,
                Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
                (damageScale * Momentum * dir),
                DamageType
            );

            if (Vehicle(Victims) != None &amp;&amp; Vehicle(Victims).Health &gt; 0)
                Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation);

            if ( r &gt; 0.50 &amp;&amp; (Vehicle(Victims) != None)
               &amp;&amp; (Pawn(Victims).GetTeamNum() != Instigator.Controller.GetTeamNum())
               &amp;&amp; ( Vehicle(Victims).IsA('ONSHoverBike')
               || Vehicle(Victims).IsA('ONSAttackCraft')
               || Vehicle(Victims).IsA('ONSDualAttackCraft') ) )
                  Vehicle(Victims).EjectDriver();
            if ( r &gt; 0.75 &amp;&amp; (Vehicle(Victims) != None)
               &amp;&amp; (Pawn(Victims).GetTeamNum() != Instigator.Controller.GetTeamNum())
               &amp;&amp; ( Vehicle(Victims).IsA('ONSRV')
               || Vehicle(Victims).IsA('ONSPRV')
               || Vehicle(Victims).IsA('ONSArtillery') ) )
                  Vehicle(Victims).EjectDriver();
            if ( r &gt; 0.90 &amp;&amp; (Vehicle(Victims) != None)
               &amp;&amp; (Pawn(Victims).GetTeamNum() != Instigator.Controller.GetTeamNum())
               &amp;&amp; ( Vehicle(Victims).IsA('ONSHoverTank')
               || Vehicle(Victims).IsA('ONSShockTank')
               || Vehicle(Victims).IsA('ONSStationaryWeaponPawn')
               || Vehicle(Victims).IsA('ONSVehicle') ) )
                  Vehicle(Victims).EjectDriver();

        }
    }
    if ( (LastTouched != None) &amp;&amp; (LastTouched != self) &amp;&amp; (LastTouched.Role == ROLE_Authority) &amp;&amp; !LastTouched.IsA('FluidSurfaceInfo') )
    {
        Victims = LastTouched;
        LastTouched = None;
        dir = Victims.Location - HitLocation;
        dist = FMax(1,VSize(dir));
        dir = dir/dist;
        damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius));
        if ( Instigator == None || Instigator.Controller == None )
            Victims.SetDelayedDamageInstigatorController(InstigatorController);
        Victims.TakeDamage
        (
            damageScale * DamageAmount,
            Instigator,
            Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
            (damageScale * Momentum * dir),
            DamageType
        );
        if (Vehicle(Victims) != None &amp;&amp; Vehicle(Victims).Health &gt; 0)
            Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
    }

    bHurtEntry = false;
}

simulated function BlowUp(vector HitLocation)
{
    HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
    if ( Role == ROLE_Authority )
        MakeNoise(1.0);
}


defaultproperties
{
 MyDamageType=class'EONS-GrenadeLauncher_BETA1.DamTypeEONSGrenadeProjectile'

 Damage=85.00
 DamageRadius=155.0
 Speed=1800
 MaxSpeed=4000
 
 ImpactSound=Sound'EONS-GrenadeLauncher_BETA1.GrenadeFloor'
}&lt;/uscript&gt;

&lt;uscript&gt;&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EONSMineLayer</title>
    <id>1214</id>
    <revision>
      <id>3143</id>
      <timestamp>2007-11-05T06:06:26Z</timestamp>
      <contributor>
        <ip>Wail</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Status: Finished. Feel free to use code derived from this weapon, but please provide credit to me in the comments and/or ReadMe file of your new creation.

Description: The EONS Mine Layer is a modification of the UT2004 ONS Mine Layer intended to alter the functionality of the Mine Layer to make it an effective anti-vehicle weapon and reduce its effectiveness as an anti-infantry weapon.

New Features:

1. Mines deploy on primary fire at a much higher velocity. Mines are significantly faster, respond to enemies in a larger area, but do not track enemies on foot. Mines will still detonate if they come in direct contact with enemy infantry.

2. Maximum number of deployable mines has been reduced from 8 to 4.

3. In team-based gametypes, the EONS Mine Layer's secondary fire targeting laser is team-colored.

Current code is provided below. 

&lt;uscript&gt;//========================================================================
// EONSMineLayer
// EONS Mine Layer by Wail of Suicide
// Feel free to use this content in any maps you create, but please provide credit in the readme.
// Contact: wailofsuicide@gmail.com - Comments and suggestions welcome.
//========================================================================

class EONSMineLayer extends ONSMineLayer;

simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos)
{
    local int i;
    local float ScaleFactor;

    ScaleFactor = 99 * Canvas.ClipX/3200;
    Canvas.Style = ERenderStyle.STY_Alpha;
    Canvas.DrawColor = class'HUD'.Default.WhiteColor;
    for (i = 0; i &lt; MaxMines; i++)
    {
        if (i &gt;= CurrentMines)
            Canvas.DrawColor = FadedColor;
        Canvas.SetPos(Canvas.ClipX - (i+1) * ScaleFactor * 1.25, YPos);
        Canvas.DrawTile(Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 391, 383, 44, 49);
    }
}

defaultproperties
{
 ItemName=&quot;EONS Mine Layer&quot;
 Description=&quot;The Anti-Vehicular Spider Mine Layer is used for deploying spider mines, autonomous mobile mines that are highly effective against vehicles. While the mines to not track infantry, they will explode upon contact with enemy soldiers.&quot;
 FireModeClass(0)=class'EONS-MineLayer_BETA1.EONSMineThrowFire'
 FireModeClass(1)=class'EONS-MineLayer_BETA1.EONSMineLayerAltFire'
 PickupClass=class'EONS-MineLayer_BETA1.EONSMineLayerPickup'
 GroupOffset=10
 MaxMines=4
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineThrowFire
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineThrowFire extends ONSMineThrowFire;

defaultproperties
{
    ProjectileClass=class'EONS-MineLayer_BETA1.EONSMineProjectile'
    RedMineClass=class'EONS-MineLayer_BETA1.EONSMineProjectileRED'
    BlueMineClass=class'EONS-MineLayer_BETA1.EONSMineProjectileBLUE'
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineProjectile
// EONS Mine Layer by Wail of Suicide
// Projectile launched by EONSMineLayer -- Mines chase only vehicles.
//========================================================================

class EONSMineProjectile extends ONSMineProjectile;

function AcquireTarget()
{
    local Vehicle A;
    local xPawn B;
    local float Dist, BestDist;

    TargetPawn = None;

    foreach VisibleCollidingActors(class'Vehicle', A, 4096.0)
    {
        if ( A != Instigator &amp;&amp; A.Health &gt; 0 &amp;&amp; A.GetTeamNum() != TeamNum
        &amp;&amp; A.Driver != None &amp;&amp; (ONSStationaryWeaponPawn(A) == None || ONSStationaryWeaponPawn(A).bPowered) )
        {
            Dist = VSize(A.Location - Location);
            if (TargetPawn == None || Dist &lt; BestDist)
            {
                TargetPawn = A;
                BestDist = Dist;
            }
        }
    }

    foreach VisibleCollidingActors(class'xPawn', B, 16.0)
    {
        if ( B != Instigator &amp;&amp; B.Health &gt; 0 &amp;&amp; B.GetTeamNum() != TeamNum )
        {
            Dist = VSize(B.Location - Location);
            if (TargetPawn == None || Dist &lt; BestDist)
            {
                TargetPawn = B;
                BestDist = Dist;
            }
        }
    }
}

simulated function PhysicsVolumeChange( PhysicsVolume Volume )
{
    if (Volume.bWaterVolume)
    {
        BlowUp(Location);
    }
}


defaultproperties
{
    MyDamageType=class'EONS-MineLayer_BETA1.DamTypeEONSMineProjectile'
    Damage=50.000
    Speed=1500.0
    MaxSpeed=4000.0
    ScurryAnimRate=6.2
    ScurrySpeed=925.0

    bUnlit=false
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineProjectileBLUE
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineProjectileBLUE extends EONSMineProjectile;

defaultproperties
{
    Skins(0)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineBLUETEX'
    Skins(1)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineBLUETEX'
    TeamNum=1
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineProjectileRED
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineProjectileRED extends EONSMineProjectile;

defaultproperties
{
    Skins(0)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineTEX'
    Skins(1)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineTEX'
    TeamNum=0
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineLayerAltFire
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineLayerAltFire extends ONSMineLayerAltFire;

var class&lt;ONSMineLayerTargetBeamEffect&gt; TeamBeamClasses[2];

simulated function ModeTick(float deltaTime)
{
    local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z;
    local rotator Aim;
    local Actor Other;
    local int i;

    if (!bIsFiring)
        return;

       Weapon.GetViewAxes(X,Y,Z);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Instigator.Location + Instigator.EyePosition() + X*Instigator.CollisionRadius;
    Aim = AdjustAim(StartTrace, AimError);
    X = Vector(Aim);
    EndTrace = StartTrace + TraceRange * X;

    Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, false);
    if (Other == None || Other == Instigator)
        HitLocation = EndTrace;

    if (Beam == None)
    {
        if (Weapon.Role == ROLE_Authority)
        {    
             if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
                 Beam = Weapon.spawn(TeamBeamClasses[1],,, Instigator.Location);
             else
                 Beam = Weapon.spawn(TeamBeamClasses[0],,, Instigator.Location);
        }
        else
            foreach Weapon.DynamicActors(class'ONSMineLayerTargetBeamEffect', Beam)
                break;
    }

    if (Beam != None)
        Beam.EndEffect = HitLocation;

    if (bDoHit)
        for (i = 0; i &lt; Gun.Mines.Length; i++)
        {
            if (Gun.Mines[i] == None)
            {
                Gun.Mines.Remove(i, 1);
                i--;
            }
            else if (ONSMineProjectile(Gun.Mines[i]) != None)
                ONSMineProjectile(Gun.Mines[i]).SetScurryTarget(HitLocation);
        }
}


defaultproperties
{
 TeamBeamClasses(0)=class'Onslaught.ONSMineLayerTargetBeamEffect'
 TeamBeamClasses(1)=class'EONS-MineLayer_BETA1.EONSMineLayerTargetBeamEffectBlue'
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineLayerTargetBeamEffectBlue
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineLayerTargetBeamEffectBlue extends ONSMineLayerTargetBeamEffect;

defaultproperties
{
 Begin Object Class=BeamEmitter Name=BeamEmitter0
        BeamDistanceRange=(Min=10000.000000,Max=10000.000000)
        DetermineEndPointBy=PTEP_Distance
        BeamTextureUScale=16.000000
        RotatingSheets=3
        LowFrequencyPoints=2
        HighFrequencyPoints=2
        AutomaticInitialSpawning=False
        ColorScale(0)=(Color=(B=192))
        ColorScale(1)=(RelativeTime=0.500000,Color=(B=255,G=64,R=64))
        ColorScale(2)=(RelativeTime=1.000000,Color=(B=255))
        ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.000000,Max=0.000000),Z=(Min=0.500000,Max=0.500000))
        MaxParticles=1
        UseRotationFrom=PTRS_Actor
        StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000))
        InitialParticlesPerSecond=5000.000000
        Texture=Texture'AW-2004Particles.Weapons.BeamFragment'
        LifetimeRange=(Min=0.020000,Max=0.020000)
        StartVelocityRange=(X=(Min=1.000000,Max=1.000000))
    End Object
    Emitters(0)=BeamEmitter'BeamEmitter0'

    bNetInitialRotation=true
    bNoDelete=false
    AutoDestroy=true
    RemoteRole=ROLE_SimulatedProxy
    bUpdateSimulatedPosition=true
    bReplicateInstigator=true

    EffectOffset=(X=-5,Y=15,Z=20)
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineLayerPickup
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineLayerPickup extends ONSMineLayerPickup;

defaultproperties
{
    InventoryType=class'EONS-MineLayer_BETA1.EONSMineLayer'
    PickupMessage=&quot;You got the EONS Mine Layer.&quot;
    
    MaxDesireability=+0.65
}&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>3144</id>
      <timestamp>2007-11-05T05:49:35Z</timestamp>
      <contributor>
        <ip>Wail</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Status: Finished. Feel free to use code derived from this weapon, but please provide credit to me in the comments and/or ReadMe file of your new creation.

Description: The EONS Mine Layer is a modification of the UT2004 ONS Mine Layer intended to alter the functionality of the Mine Layer to make it an effective anti-vehicle weapon and reduce its effectiveness as an anti-infantry weapon.

New Features:

1. Mines deploy on primary fire at a much higher velocity. Mines are significantly faster, respond to enemies in a larger area, but do not track enemies on foot. Mines will still detonate if they come in direct contact with enemy infantry.

2. Maximum number of deployable mines has been reduced from 8 to 4.

3. In team-based gametypes, the EONS Mine Layer's secondary fire targeting laser is team-colored.

Current code is provided below. 

&lt;uscript&gt;//========================================================================
// EONSMineLayer
// EONS Mine Layer by Wail of Suicide
// Feel free to use this content in any maps you create, but please provide credit in the readme.
// Contact: wailofsuicide@gmail.com - Comments and suggestions welcome.
//========================================================================

class EONSMineLayer extends ONSMineLayer;

simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos)
{
    local int i;
    local float ScaleFactor;

    ScaleFactor = 99 * Canvas.ClipX/3200;
    Canvas.Style = ERenderStyle.STY_Alpha;
    Canvas.DrawColor = class'HUD'.Default.WhiteColor;
    for (i = 0; i &lt; MaxMines; i++)
    {
        if (i &gt;= CurrentMines)
            Canvas.DrawColor = FadedColor;
        Canvas.SetPos(Canvas.ClipX - (i+1) * ScaleFactor * 1.25, YPos);
        Canvas.DrawTile(Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 391, 383, 44, 49);
    }
}

defaultproperties
{
 ItemName=&quot;EONS Mine Layer&quot;
 Description=&quot;The Anti-Vehicular Spider Mine Layer is used for deploying spider mines, autonomous mobile mines that are highly effective against vehicles. While the mines to not track infantry, they will explode upon contact with enemy soldiers.&quot;
 FireModeClass(0)=class'EONS-MineLayer_BETA1.EONSMineThrowFire'
 FireModeClass(1)=class'EONS-MineLayer_BETA1.EONSMineLayerAltFire'
 PickupClass=class'EONS-MineLayer_BETA1.EONSMineLayerPickup'
 GroupOffset=10
 MaxMines=4
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineThrowFire
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineThrowFire extends ONSMineThrowFire;

defaultproperties
{
    ProjectileClass=class'EONS-MineLayer_BETA1.EONSMineProjectile'
    RedMineClass=class'EONS-MineLayer_BETA1.EONSMineProjectileRED'
    BlueMineClass=class'EONS-MineLayer_BETA1.EONSMineProjectileBLUE'
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineProjectile
// EONS Mine Layer by Wail of Suicide
// Projectile launched by EONSMineLayer -- Mines chase only vehicles.
//========================================================================

class EONSMineProjectile extends ONSMineProjectile;

function AcquireTarget()
{
    local Vehicle A;
    local xPawn B;
    local float Dist, BestDist;

    TargetPawn = None;

    foreach VisibleCollidingActors(class'Vehicle', A, 4096.0)
    {
        if ( A != Instigator &amp;&amp; A.Health &gt; 0 &amp;&amp; A.GetTeamNum() != TeamNum
        &amp;&amp; A.Driver != None &amp;&amp; (ONSStationaryWeaponPawn(A) == None || ONSStationaryWeaponPawn(A).bPowered) )
        {
            Dist = VSize(A.Location - Location);
            if (TargetPawn == None || Dist &lt; BestDist)
            {
                TargetPawn = A;
                BestDist = Dist;
            }
        }
    }

    foreach VisibleCollidingActors(class'xPawn', B, 16.0)
    {
        if ( B != Instigator &amp;&amp; B.Health &gt; 0 &amp;&amp; B.GetTeamNum() != TeamNum )
        {
            Dist = VSize(B.Location - Location);
            if (TargetPawn == None || Dist &lt; BestDist)
            {
                TargetPawn = B;
                BestDist = Dist;
            }
        }
    }
}

simulated function PhysicsVolumeChange( PhysicsVolume Volume )
{
    if (Volume.bWaterVolume)
    {
        BlowUp(Location);
    }
}


defaultproperties
{
    MyDamageType=class'EONS-MineLayer_BETA1.DamTypeEONSMineProjectile'
    Damage=50.000
    Speed=1500.0
    MaxSpeed=4000.0
    ScurryAnimRate=6.2
    ScurrySpeed=925.0

    bUnlit=false
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineProjectileBLUE
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineProjectileBLUE extends EONSMineProjectile;

defaultproperties
{
    Skins(0)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineBLUETEX'
    Skins(1)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineBLUETEX'
    TeamNum=1
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineProjectileRED
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineProjectileRED extends EONSMineProjectile;

defaultproperties
{
    Skins(0)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineTEX'
    Skins(1)=Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineTEX'
    TeamNum=0
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineLayerAltFire
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineLayerAltFire extends ONSMineLayerAltFire;

var class&lt;ONSMineLayerTargetBeamEffect&gt; TeamBeamClasses[2];

simulated function ModeTick(float deltaTime)
{
    local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z;
    local rotator Aim;
    local Actor Other;
    local int i;

    if (!bIsFiring)
        return;

       Weapon.GetViewAxes(X,Y,Z);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Instigator.Location + Instigator.EyePosition() + X*Instigator.CollisionRadius;
    Aim = AdjustAim(StartTrace, AimError);
    X = Vector(Aim);
    EndTrace = StartTrace + TraceRange * X;

    Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, false);
    if (Other == None || Other == Instigator)
        HitLocation = EndTrace;

    if (Beam == None)
    {
        if (Weapon.Role == ROLE_Authority)
        {    
             if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
                 Beam = Weapon.spawn(TeamBeamClasses[1],,, Instigator.Location);
             else
                 Beam = Weapon.spawn(TeamBeamClasses[0],,, Instigator.Location);
        }
        else
            foreach Weapon.DynamicActors(class'ONSMineLayerTargetBeamEffect', Beam)
                break;
    }

    if (Beam != None)
        Beam.EndEffect = HitLocation;

    if (bDoHit)
        for (i = 0; i &lt; Gun.Mines.Length; i++)
        {
            if (Gun.Mines[i] == None)
            {
                Gun.Mines.Remove(i, 1);
                i--;
            }
            else if (ONSMineProjectile(Gun.Mines[i]) != None)
                ONSMineProjectile(Gun.Mines[i]).SetScurryTarget(HitLocation);
        }
}


defaultproperties
{
 TeamBeamClasses(0)=class'Onslaught.ONSMineLayerTargetBeamEffect'
 TeamBeamClasses(1)=class'EONS-MineLayer_BETA1.EONSMineLayerTargetBeamEffectBlue'
}&lt;/uscript&gt;

&lt;uscript&gt;//========================================================================
// EONSMineLayerTargetBeamEffectBlue
// EONS Mine Layer by Wail of Suicide
//========================================================================

class EONSMineLayerTargetBeamEffectBlue extends ONSMineLayerTargetBeamEffect;

defaultproperties
{
 Begin Object Class=BeamEmitter Name=BeamEmitter0
        BeamDistanceRange=(Min=10000.000000,Max=10000.000000)
        DetermineEndPointBy=PTEP_Distance
        BeamTextureUScale=16.000000
        RotatingSheets=3
        LowFrequencyPoints=2
        HighFrequencyPoints=2
        AutomaticInitialSpawning=False
        ColorScale(0)=(Color=(B=192))
        ColorScale(1)=(RelativeTime=0.500000,Color=(B=255,G=64,R=64))
        ColorScale(2)=(RelativeTime=1.000000,Color=(B=255))
        ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000),Y=(Min=0.000000,Max=0.000000),Z=(Min=0.500000,Max=0.500000))
        MaxParticles=1
        UseRotationFrom=PTRS_Actor
        StartSizeRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000))
        InitialParticlesPerSecond=5000.000000
        Texture=Texture'AW-2004Particles.Weapons.BeamFragment'
        LifetimeRange=(Min=0.020000,Max=0.020000)
        StartVelocityRange=(X=(Min=1.000000,Max=1.000000))
    End Object
    Emitters(0)=BeamEmitter'BeamEmitter0'

    bNetInitialRotation=true
    bNoDelete=false
    AutoDestroy=true
    RemoteRole=ROLE_SimulatedProxy
    bUpdateSimulatedPosition=true
    bReplicateInstigator=true

    EffectOffset=(X=-5,Y=15,Z=20)
}&lt;/uscript&gt;

&lt;uscript&gt;&lt;/uscript&gt;

&lt;uscript&gt;&lt;/uscript&gt;

&lt;uscript&gt;&lt;/uscript&gt;

&lt;uscript&gt;&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ESurfaceTypes</title>
    <id>1156</id>
    <revision>
      <id>3027</id>
      <timestamp>2005-12-20T18:55:28Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">ESurfaceTypes enum, defined in both [[Legacy:Material|Material]] and [[Legacy:Actor|Actor]].

The ESurfaceType defined appears to affect the sound footsteps make when Pawns walk on them.

==ESurfaceTypes==

Specifies a type of surface.
; EST_Default : This is the same as EST_Metal
; EST_Rock : 
; EST_Dirt : 
; EST_Metal : 
; EST_Wood : 
; EST_Plant : 
; EST_Flesh : 
; EST_Ice : 
; EST_Snow : 
; EST_Water : 
; EST_Glass : 

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3028</id>
      <timestamp>2004-12-25T10:31:36Z</timestamp>
      <contributor>
        <ip>Webmail.union-city.k12.nj.us</ip>
      </contributor>
      <text xml:space="preserve">

   [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU!

'''   Let us introduce [http://first-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://first-page.nm.ru/viagra.htm order viagra online], [http://first-page.nm.ru/cialis.htm cialis]
 Also [http://first-page.nm.ru/phentermine.htm order phentermine online], [http://first-page.nm.ru/xanax.htm buy xanax], [http://first-page.nm.ru/diazepam.htm diazepam online],  [http://first-page.nm.ru/prosac.htm prozac online].

   Buy [http://first-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://first-page.nm.ru/newcar.htm new car] or  [http://first-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''
*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-gift1.boom.ru/ christmas gift basket] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-gift2.boom.ru/ christmas gift] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes]</text>
    </revision>
    <revision>
      <id>3029</id>
      <timestamp>2004-12-25T11:09:50Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*restored</comment>
      <text xml:space="preserve">ESurfaceTypes enum, defined in both [[Legacy:Material|Material]] and [[Legacy:Actor|Actor]].

Specifies a type of surface.

; EST_Default : 
; EST_Rock : 
; EST_Dirt : 
; EST_Metal : 
; EST_Wood : 
; EST_Plant : 
; EST_Flesh : 
; EST_Ice : 
; EST_Snow : 
; EST_Water : 
; EST_Glass : 

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EVOLVE</title>
    <id>1100</id>
    <revision>
      <id>2905</id>
      <timestamp>2002-07-06T13:52:59Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">The 'father of Unreal Engine Movies'... Now working for NexS Interactive as a Voice Actor and Story Director. Previously worked as a Level Designer on an Unreal Engine commercial game. &gt;:) Co-head of UnFramed Productions, Directing the Arcadia project, and Project Lead of Resident Unreal.

: Welcome aboard :-)  &amp;ndash; ''Tarquin''

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2906</id>
      <timestamp>2002-03-26T00:49:27Z</timestamp>
      <contributor>
        <ip>EVOLVE</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The 'father of Unreal Engine Movies'... Now working for NexS Interactive as a Voice Actor and Story Director. Previously worked as a Level Designer on an Unreal Engine commercial game. &gt;:) Co-head of UnFramed Productions, Directing the Arcadia project, and Project Lead of Resident Unreal.</text>
    </revision>
    <revision>
      <id>2907</id>
      <timestamp>2002-03-26T00:52:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The 'father of Unreal Engine Movies'... Now working for NexS Interactive as a Voice Actor and Story Director. Previously worked as a Level Designer on an Unreal Engine commercial game. &gt;:) Co-head of UnFramed Productions, Directing the Arcadia project, and Project Lead of Resident Unreal.

: Welcome aboard :-)  &amp;ndash; ''Tarquin''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EWindow</title>
    <id>1170</id>
    <revision>
      <id>3059</id>
      <timestamp>2007-11-19T12:19:26Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

Created by: [[Legacy:Wormbo|Wormbo]]

The EWindow package is used by the Mod Menu Extension and the UnrealXP GUI skin. It adds some features to existing UWindow classes and also provides completely new classes.

Some of these classes have been made public already as [[Legacy:Useful UWindow Extensions|Useful UWindow Extensions]].

===Downloads===
* [http://www.koehler-homepage.de/Wormbo/download/UT/EWindowSource.zip EWindow source code]
* [http://www.koehler-homepage.de/Wormbo/download/UT/EIClassReference.rar EIClassReference.rar] &amp;ndash; includes UnCodeX output for the EWindow and [[Legacy:EnhancedItems|EnhancedItems]] classes

==Classes==

All classes are subclasses of [[Legacy:UWindowBase|UWindowBase]]. See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Hierarchy]] for the full class tree of all EWindow classes.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowButton|UWindowButton]] &gt;&gt; [[Legacy:UWindowCheckbox|UWindowCheckbox]] &gt;&gt; EnhancedCheckbox}}

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowButton|UWindowButton]] &gt;&gt; [[Legacy:UWindowCheckbox|UWindowCheckbox]] &gt;&gt; EWindowRadiobox}}

These classes add an auto-size feature to the regular checkboxes, which allowes them to align their text on the same side as the checkbox. EnhancedCheckbox can start grayed, i.e. in an unspecified state that is neither checked nor unchecked. EWindowRadiobox lets you create groups of checkboxes where only one checkbox from each group can be selected.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowComboControl|UWindowComboControl]] &gt;&gt; EnhancedComboControl}}

A drop-down combo or drop-down list which can automatically modify the size of the combobox based on the size of the caption.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowListBox|UWindowListBox]] &gt;&gt; EWindowListBox}}

{{classbox| [[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UWindowListBoxItem|UWindowListBoxItem]] &gt;&gt; EWindowListBoxItem}}

A listbox with a frame around it (similar to the mutator selection lists) and a UWindowList class for the listbox items.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EnhancedPulldownMenu}}

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EnhancedPulldownMenu &gt;&gt; EnhancedRightClickMenu}}

{{classbox| [[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]] &gt;&gt; EnhancedPulldownMenuItem}}

A pulldown menu class and a popup (right-click) menu class which both support submenus.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowClientWindow|UWindowClientWindow]] &gt;&gt; [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]] &gt;&gt; EnhancedDialogClientWindow}}

A dialog client window with a 'Close' button in the lower right corner and support for status bar help texts through its controls' HelpText property.

{{classbox| [[Legacy:UWindowLookAndFeel|UWindowLookAndFeel]] &gt;&gt; EWindowLookAndFeel}}

A LookAndFeel (i.e. GUI skin) class that declares all the useful properties so GUI skinners don't have to re-invent the wheel for each of their GUI skins. The properties are about identical to the built-in [[Legacy:UWindowLookAndFeel|UWindowLookAndFeel]] subclasses (i.e. the Ice, Gold and Metal skins). EWindowLookAndFeel can draw EWindowRadioBoxes using a different style than checkboxes, i.e. they are drawn round by default.

{{classbox| [[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UMenuModMenuItem|UMenuModMenuItem]] &gt;&gt; LookAndFeelModMenuItem}}

Used by the Mod Menu Extension to create a special submenu which can be used to configure a GUI skin. With the regular Mod menu LookAndFeelModMenuItems will look like any other mod menu items.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Useful UWindow Extensions|Useful UWindow Extensions]] &amp;ndash; some of these classes as stand-alone scripts
* [[Legacy:EnhancedItems|EnhancedItems]] &amp;ndash; contains other enhancements for UT classes

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3060</id>
      <timestamp>2005-12-10T13:34:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed download links</comment>
      <text xml:space="preserve">==Overview==

Created by: [[Legacy:Wormbo|Wormbo]]

The EWindow package is used by the Mod Menu Extension and the UnrealXP GUI skin. It adds some features to existing UWindow classes and also provides completely new classes.

Some of these classes have been made public already as [[Legacy:Useful UWindow Extensions|Useful UWindow Extensions]].

===Downloads===
* [http://www.koehler-homepage.de/Wormbo/download/UT/EWindowSource.zip EWindow source code]
* [http://www.koehler-homepage.de/Wormbo/download/UT/EIClassReference.rar EIClassReference.rar] &amp;ndash; includes UnCodeX output for the EWindow and [[Legacy:EnhancedItems|EnhancedItems]] classes

==Classes==

All classes are subclasses of [[Legacy:UWindowBase|UWindowBase]]. See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Hierarchy]] for the full class tree of all EWindow classes.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowButton|UWindowButton]] &gt;&gt; [[Legacy:UWindowCheckbox|UWindowCheckbox]] &gt;&gt; EnhancedCheckbox}}

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowButton|UWindowButton]] &gt;&gt; [[Legacy:UWindowCheckbox|UWindowCheckbox]] &gt;&gt; EWindowRadiobox}}

These classes add an auto-size feature to the regular checkboxes, which allowes them to align their text on the same side as the checkbox. EnhancedCheckbox can start grayed, i.e. in an unspecified state that is neither checked nor unchecked. EWindowRadiobox lets you create groups of checkboxes where only one checkbox from each group can be selected.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowComboControl|UWindowComboControl]] &gt;&gt; EnhancedComboControl}}

A drop-down combo or drop-down list which can automatically modify the size of the combobox based on the size of the caption.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowListBox|UWindowListBox]] &gt;&gt; EWindowListBox}}

{{classbox| [[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UWindowListBoxItem|UWindowListBoxItem]] &gt;&gt; EWindowListBoxItem}}

A listbox with a frame around it (similar to the mutator selection lists) and a UWindowList class for the listbox items.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EnhancedPulldownMenu}}

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EnhancedPulldownMenu &gt;&gt; EnhancedRightClickMenu}}

{{classbox| [[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]] &gt;&gt; EnhancedPulldownMenuItem}}

A pulldown menu class and a popup (right-click) menu class which both support submenus.

{{classbox| [[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowClientWindow|UWindowClientWindow]] &gt;&gt; [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]] &gt;&gt; EnhancedDialogClientWindow}}

A dialog client window with a 'Close' button in the lower right corner and support for status bar help texts through its controls' HelpText property.

{{classbox| [[Legacy:UWindowLookAndFeel|UWindowLookAndFeel]] &gt;&gt; EWindowLookAndFeel}}

A LookAndFeel (i.e. GUI skin) class that declares all the useful properties so GUI skinners don't have to re-invent the wheel for each of their GUI skins. The properties are about identical to the built-in [[Legacy:UWindowLookAndFeel|UWindowLookAndFeel]] subclasses (i.e. the Ice, Gold and Metal skins). EWindowLookAndFeel can draw EWindowRadioBoxes using a different style than checkboxes, i.e. they are drawn round by default.

{{classbox| [[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UMenuModMenuItem|UMenuModMenuItem]] &gt;&gt; LookAndFeelModMenuItem}}

Used by the Mod Menu Extension to create a special submenu which can be used to configure a GUI skin. With the regular Mod menu LookAndFeelModMenuItems will look like any other mod menu items.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Useful UWindow Extensions|Useful UWindow Extensions]] &amp;ndash; some of these classes as stand-alone scripts
* [[Legacy:EnhancedItems|EnhancedItems]] &amp;ndash; contains other enhancements for UT classes

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EWindow/Class Hierarchy</title>
    <id>1171</id>
    <revision>
      <id>3061</id>
      <timestamp>2003-10-19T13:43:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the full class tree of all classes in the [[Legacy:Ewindow|Ewindow]] package and their super classes. EWindow classes are in '''bold''' font.

 [[Legacy:Object (UT)|Object (UT)]]
  +- [[Legacy:UWindowBase|UWindowBase]]
      +- [[Legacy:UWindowList|UWindowList]]
      |   +- [[Legacy:UMenuModMenuItem|UMenuModMenuItem]]
      |   |   +- '''LookAndFeelModMenuItem'''
      |   +- [[Legacy:UWindowListBoxItem|UWindowListBoxItem]]
      |   |   +- '''EWindowListBoxItem'''
      |   +- [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]]
      |       +- '''EnhancedPulldownMenuItem'''
      +- [[Legacy:UWindowLookAndFeel|UWindowLookAndFeel]]
      |   +- '''EWindowLookAndFeel'''
      +- [[Legacy:UWindowWindow|UWindowWindow]]
          +- [[Legacy:UWindowClientWindow|UWindowClientWindow]]
          |   +- [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]]
          |       +- '''EnhancedDialogClientWindow'''
          +- [[Legacy:UWindowDialogControl|UWindowDialogControl]]
              +- [[Legacy:UWindowButton|UWindowButton]]
              |   +- [[Legacy:UWindowCheckbox|UWindowCheckbox]]
              |       +- '''EnhancedCheckbox'''
              |       +- '''EWindowRadiobox'''
              +- [[Legacy:UWindowComboControl|UWindowComboControl]]
              |   +- '''EnhancedComboControl'''
              +- [[Legacy:UWindowEditControl|UWindowEditControl]]
              |   +- '''EnhancedEditControl'''
              +- [[Legacy:UWindowListControl|UWindowListControl]]
                  +- [[Legacy:UWindowListBox|UWindowListBox]]
                  |   + '''EWindowListBox'''
                  +- [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]]
                      +- '''EnhancedPulldownMenu'''
                          +- '''EnhancedRightClickMenu'''

==Related Topics==
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]
* [[Legacy:EnhancedItems/Class Hierarchy|EnhancedItems/Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40160</id>
      <timestamp>2009-11-17T10:14:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed link</comment>
      <text xml:space="preserve">This is the full class tree of all classes in the [[Legacy:EWindow|EWindow]] package and their super classes. EWindow classes are in '''bold''' font.

 [[Legacy:Object (UT)|Object (UT)]]
  +- [[Legacy:UWindowBase|UWindowBase]]
      +- [[Legacy:UWindowList|UWindowList]]
      |   +- [[Legacy:UMenuModMenuItem|UMenuModMenuItem]]
      |   |   +- '''LookAndFeelModMenuItem'''
      |   +- [[Legacy:UWindowListBoxItem|UWindowListBoxItem]]
      |   |   +- '''EWindowListBoxItem'''
      |   +- [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]]
      |       +- '''EnhancedPulldownMenuItem'''
      +- [[Legacy:UWindowLookAndFeel|UWindowLookAndFeel]]
      |   +- '''EWindowLookAndFeel'''
      +- [[Legacy:UWindowWindow|UWindowWindow]]
          +- [[Legacy:UWindowClientWindow|UWindowClientWindow]]
          |   +- [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]]
          |       +- '''EnhancedDialogClientWindow'''
          +- [[Legacy:UWindowDialogControl|UWindowDialogControl]]
              +- [[Legacy:UWindowButton|UWindowButton]]
              |   +- [[Legacy:UWindowCheckbox|UWindowCheckbox]]
              |       +- '''EnhancedCheckbox'''
              |       +- '''EWindowRadiobox'''
              +- [[Legacy:UWindowComboControl|UWindowComboControl]]
              |   +- '''EnhancedComboControl'''
              +- [[Legacy:UWindowEditControl|UWindowEditControl]]
              |   +- '''EnhancedEditControl'''
              +- [[Legacy:UWindowListControl|UWindowListControl]]
                  +- [[Legacy:UWindowListBox|UWindowListBox]]
                  |   + '''EWindowListBox'''
                  +- [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]]
                      +- '''EnhancedPulldownMenu'''
                          +- '''EnhancedRightClickMenu'''

==Related Topics==
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]
* [[Legacy:EnhancedItems/Class Hierarchy|EnhancedItems/Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Earthquake</title>
    <id>1155</id>
    <revision>
      <id>3025</id>
      <timestamp>2006-03-22T10:34:33Z</timestamp>
      <contributor>
        <ip>Proxy-10.swgfl.ifl.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; Earthquake (Package: UnrealShare)}}

The EarthQuake keypoint can be triggered to shake the player’s view for a specified duration, as well as possibly tossing players around. It has no effect on other actors. To simultaneously toss around other actors, use the [[Legacy:ThrowStuff|ThrowStuff]] keypoint.  Trigger other effects directly or using [[Legacy:Dispatcher|Dispatcher]]s or more complex [[Legacy:Trigger Systems|trigger systems]].  

==Properties==

===Main===
; float magnitude : Specifies the amount to roll the player’s view, and the amount to throw him if bThrowPlayer is true. A magnitude of 2000 is a pretty strong quake.
; float duration :  Time in seconds quake lasts.
; float radius : Radius for which players are affected. A player who goes beyond the radius will continue to have his view shaken for the duration of the quake, but he will no longer get thrown around.
; bool bThrowPlayer : If true, players are thrown around during the quake.

===Hidden===
; float remainingTime : Remaining time of the effect. This is decreased in 0.5 second steps from the Timer function.

==Suggested Uses:==

Use a looping dispatcher to trigger this event over and over. This makes the area with in the radius shake over and over. Good uses for this are power plants that are falling apart.

==Related Topics==
* [[Legacy:ThrowStuff|ThrowStuff]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3026</id>
      <timestamp>2006-03-22T10:33:53Z</timestamp>
      <contributor>
        <ip>Proxy-24.swgfl.ifl.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; Earthquake (Package: UnrealShare)}}

The EarthQuake keypoint can be triggered to shake the player’s view for a specified duration, as well as possibly tossing players around. It has no effect on other actors. To simultaneously toss around other actors, use the [[Legacy:ThrowStuff|ThrowStuff]] keypoint.  Trigger other effects directly or using [[Legacy:Dispatcher|Dispatcher]]s or more complex [[Legacy:Trigger Systems|trigger systems]].  

==Properties==

===Main===
; float magnitude : Specifies the amount to roll the player’s view, and the amount to throw him if bThrowPlayer is true. A magnitude of 2000 is a pretty strong quake.
; float duration :  Time in seconds quake lasts.
; float radius : Radius for which players are affected. A player who goes beyond the radius will continue to have his view shaken for the duration of the quake, but he will no longer get thrown around.
; bool bThrowPlayer : If true, players are thrown around during the quake.

===Hidden===
; float remainingTime : Remaining time of the effect. This is decreased in 0.5 second steps from the Timer function.

==Suggested Uses:==

Use a looping dispatcher to trigger this event over and over. This makes the area with in the radius shake over and over.

==Related Topics==
* [[Legacy:ThrowStuff|ThrowStuff]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Eclipse</title>
    <id>1164</id>
    <revision>
      <id>3045</id>
      <timestamp>2006-10-06T08:56:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Eclipse is an open source, full featured [[Legacy:IDE|IDE]] for tool integration built by an open community of tool providers. Operating under a open source paradigm, with a common public license that provides royalty free source code and world wide redistribution rights, the eclipse platform provides tool developers with ultimate flexibility and control over their software technology.

* Main site: http://www.eclipse.org
* Plugins: http://www.eclipse-plugins.info
* Current version: 3.1.2

==Features==

By default, Eclipse is designed for coding in Java.

Eclipse contains nearly everything one would want in an advanced, professional IDE.

==List of Major Features:==

'''Note that many of these don't apply to the UnrealScript plugin.'''

* Syntax Coloring
* Error checking:
** Syntax error underlining.
* outstanding support for plugins ([http://www.eclipse-plugins.info/eclipse/index.jsp]).
* section folding (you can a button on the side that makes all but the first statement of a block of code fold up until you press it again)
* Project-based archetecture.
* Class, package, project browser.
* Tasks list window (with TODO in comments, etc...)
* Automatic, behind-the-scenes compilation.
* CVS (concurrent version system, for team project managment)
* JUnit support- A tool for automatically generating test methods.
* JavaDoc based tooltips

*Debugger features:
**Stack trace window
** Variables list (with thier current data)
** hover tooltips contain variable's current data
** Breakpoints can be configured. i.e. break only after instruction pointer has passed over it a given number of times.
** Step, step into, step out, step over

==Plugins==
; UC Editor : [[Legacy:UCEditor|UCEditor]]
;| Jerome-X has developed a wonderful plugin to an amazing IDE.  The plugin allows Unreal scripters to easily create and maintain Unreal scripting projects.  Note: The plugin has basic features but is a Work In Progress.  Many thanks to Jerome-X!

----

'''Jerome-X:''' Eclipse is mainly used for development of Java programs and J2EE applications, but there are increasingly new plugins being developed for eclipse, e.g. for C++ and lots of other languages. There hundreds of all kind of plugins available, see http://www.eclipse-plugins.info

----

[[:Category:Legacy To Do]]

'''The features that usable with the UScript plugin should be put in bold or something. Also maybe the features list should be divided into sections a little bit more'''
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3046</id>
      <timestamp>2006-10-06T02:23:24Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>attempting to (partially) complete the TODO (Adding info about additional features of the IDE)</comment>
      <text xml:space="preserve">Eclipse is an open source, full featured IDE for tool integration built by an open community of tool providers. Operating under a open source paradigm, with a common public license that provides royalty free source code and world wide redistribution rights, the eclipse platform provides tool developers with ultimate flexibility and control over their software technology.

* Main site: http://www.eclipse.org
* Plugins: http://www.eclipse-plugins.info
* Current version: 3.1.2

===Features===

Note that by default, Eclipse is designed for codeing in Java.

Eclipse contains nearly everything one would want in an advanced, professional IDE.

===List of Major Features:===

'''Note that many of these don't apply to the UnrealScript plugin'''

* Syntax Coloring
* Error checking:
** Syntax error underlining.
* Class, package, project browser.
* outstanding support for plugins ([http://www.eclipse-plugins.info/eclipse/index.jsp]).
* Full featured debugger.
* Tasks list window (with TODO in comments, etc...)
* Project-based archetecture.
* Automatic, behind-the-scenes compilation.
* CVS (concurrent version system, for team project managment)
* JUnit support- A tool for automatically generating test methods.
* JavaDoc based tooltips

===Plugins===
; UC Editor : [[Legacy:UCEditor|UCEditor]]
;| Jerome-X has developed a wonderful plugin to an amazing IDE.  The plugin allows Unreal scripters to easily create and maintain Unreal scripting projects.  Note: The plugin has basic features but is a Work In Progress.  Many thanks to Jerome-X!

----

'''Jerome-X:''' Eclipse is mainly used for development of Java programs and J2EE applications, but there are increasingly new plugins being developed for eclipse, e.g. for C++ and lots of other languages. There hundreds of all kind of plugins available, see http://www.eclipse-plugins.info

----

[[:Category:Legacy To Do]]

'''The features that usable with the UScript plugin should be put in bold or something'''
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3047</id>
      <timestamp>2006-10-06T02:32:27Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>oops... forgot a feature + some reorganization</comment>
      <text xml:space="preserve">Eclipse is an open source, full featured IDE for tool integration built by an open community of tool providers. Operating under a open source paradigm, with a common public license that provides royalty free source code and world wide redistribution rights, the eclipse platform provides tool developers with ultimate flexibility and control over their software technology.

* Main site: http://www.eclipse.org
* Plugins: http://www.eclipse-plugins.info
* Current version: 3.1.2

===Features===

Note that by default, Eclipse is designed for codeing in Java.

Eclipse contains nearly everything one would want in an advanced, professional IDE.

===List of Major Features:===

'''Note that many of these don't apply to the UnrealScript plugin.'''

* Syntax Coloring
* Error checking:
** Syntax error underlining.
* outstanding support for plugins ([http://www.eclipse-plugins.info/eclipse/index.jsp]).
* section folding (you can a button on the side that makes all but the first statement of a block of code fold up until you press it again)
* Project-based archetecture.
* Class, package, project browser.
* Tasks list window (with TODO in comments, etc...)
* Automatic, behind-the-scenes compilation.
* CVS (concurrent version system, for team project managment)
* JUnit support- A tool for automatically generating test methods.
* JavaDoc based tooltips

*Debugger features:
**Stack trace window
** Variables list (with thier current data)
** hover tooltips contain variable's current data
** Breakpoints can be configured. i.e. break only after instruction pointer has passed over it a given number of times.
** Step, step into, step out, step over

===Plugins===
; UC Editor : [[Legacy:UCEditor|UCEditor]]
;| Jerome-X has developed a wonderful plugin to an amazing IDE.  The plugin allows Unreal scripters to easily create and maintain Unreal scripting projects.  Note: The plugin has basic features but is a Work In Progress.  Many thanks to Jerome-X!

----

'''Jerome-X:''' Eclipse is mainly used for development of Java programs and J2EE applications, but there are increasingly new plugins being developed for eclipse, e.g. for C++ and lots of other languages. There hundreds of all kind of plugins available, see http://www.eclipse-plugins.info

----

[[:Category:Legacy To Do]]

'''The features that usable with the UScript plugin should be put in bold or something. Also maybe the features list should be divided into sections a little bit more'''
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Edfindable</title>
    <id>1173</id>
    <revision>
      <id>3064</id>
      <timestamp>2003-12-10T17:35:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>redirected to Variable Syntax</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Variable Syntax|Variable Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EditPackagesCommandlet</title>
    <id>1203</id>
    <revision>
      <id>3124</id>
      <timestamp>2007-11-19T12:16:54Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This commandlet lets you modify EditPackages from OS commandline. Handy for install scripts.

==Usage==

 ucc package.EditPackagesCommandlet +AddPackage +AddAnother -RemovePackage

===Paramaters===

{|

|-
|'''Parameter'''
|'''Description''' 
|-
|&lt;tt&gt;--dry-run&lt;/tt&gt;
|Simulate the process. Changes will not be saved. 
|-
|&lt;tt&gt;+Package&lt;/tt&gt;
|Add a package with the name Package. If it already exists it will be removed first. 
|-
|&lt;tt&gt;-Package-&lt;/tt&gt;
|Remove the package with the name Package.
|
|-
| colspan=&quot;2&quot; |''Advanced'' 
|-
|&lt;tt&gt;+?Package&lt;/tt&gt;
|Don't add the package when it already exists. '?' can also be used in the commands below. 
|-
|&lt;tt&gt;+Package@index&lt;/tt&gt;
|Add the package at the given index. 
|-
|&lt;tt&gt;+Package&lt;Pkg&lt;/tt&gt;
|Add the package before Pkg. If Pkg isn't present it will be appended to the list. 
|-
|&lt;tt&gt;+Package&gt;Pkg&lt;/tt&gt;
|Add the package after Pkg. If Pkg isn't present it will be appended to the list. 
|}

Note, you must use double quotes around the commands that use the before or after modifier when executing it from a commandline.

===Examples===

 ucc package.EditPackagesCommandlet &quot;+myPackage&gt;Engine&quot; &quot;+MyOtherPackage&lt;myPackage&quot; -MyOldPackage

==Source code==

&lt;uscript&gt;
/*******************************************************************************
    EditPackagesCommandlet
    This commandlet lets you modify EditPackages from OS commandline. Handy for
    install scripts.

    Usage:
        ucc package.EditPackagesCommandlet +AddPackage +AddAnother -RemovePackage

    +?Package
    +Package@index
    +Package&lt;BeforeThisPackage
    +Package&gt;AfterThisPackage

    Otherwise it will be added after the list. If the before or after packages
    don't exist they will be added to the end of the list. Adding a package that
    already exists will first remove it from the old location.

    Credits:
        Switch -- initial code
        El Muerte -- major improvements
*******************************************************************************/
class EditPackagesCommandlet extends Commandlet;

/**
    The contents of this will be appended to the Parms list, this can be used
    is a subclass of the commandlet.
*/
var config string CmdArgs;

/** the classname of the object to load, that contains the ArrayName */
var string ObjectClass;
/** the name of the array to read\write the data to */
var string ArrayName;

/** temporary storage of the array list */
var protected array&lt;string&gt; PackagesArray;

/** add the package to the list */
function int AddPackage(string pkg, optional int idx)
{
    if (idx == -1) idx = PackagesArray.length;
    else idx = Clamp(idx, 0, PackagesArray.length);
    PackagesArray.insert(idx, 1);
    PackagesArray[idx] = pkg;
    return idx;
}

/** remove the package from the list, returns the number of offurances deleted */
function int RemovePackage(string pkg)
{
    local int i, deleted;
    deleted = 0;
    for (i = PackagesArray.Length-1; i &gt;= 0; i--)
    {
        if (PackagesArray[i] ~= pkg)
        {
            PackagesArray.Remove(i, 1);
            deleted++;
        }
    }
    return deleted;
}

/** returns the index of a package */
function int IndexOf(string pkg)
{
    local int i;
    for (i = PackagesArray.Length-1; i &gt;= 0; i--)
    {
        if (PackagesArray[i] ~= pkg)
        {
            return i;
        }
    }
    return -1;
}

final function string StripQuotes(string in)
{
    if (Left(in, 1) == &quot;\&quot;&quot;)
    {
        return mid(in, 1, len(in)-2);
    }
    return in;
}

event int Main( string Parms )
{
    local class C;
    local object O;
    local int i,j,idx;
    local array&lt;string&gt; Commands;
    local string cmd, altpkg;
    local bool bSimulate;

    bSimulate = false;

    if (CmdArgs != &quot;&quot;) Parms = CmdArgs@Parms;

    if (Parms == &quot;&quot;)
    {
        Log( &quot;Nothing to do. See 'ucc help &quot;$HelpCmd$&quot;' for more information.&quot;, 'Error' );
        return 1;
    }
    split(Parms, &quot; &quot;, Commands);

    // Load class
    C = class(DynamicLoadObject( ObjectClass, class'Class', true ));
    if( C == None )
    {
        Log( &quot;Failed to load class: [&quot;$ ObjectClass $&quot;]&quot;, 'Error' );
        return 1;
    }
    // Create object
    O = new C;
    if( O == None )
    {
        Log( &quot;Failed to create object of class: [&quot;$ C $&quot;]&quot;, 'Error' );
        return 1;
    }

    SetPropertyText(&quot;PackagesArray&quot;,O.GetPropertyText(ArrayName));

    // process commands
    for (i = 0; i &lt; Commands.length; i++)
    {
        cmd = StripQuotes(Commands[i]);
        if (cmd ~= &quot;--dry-run&quot;) {
            bSimulate = true;
        }
        else if (left(cmd, 1) == &quot;+&quot;)
        {
            idx = -1;
            cmd = mid(cmd, 1);
            j = InStr(cmd, &quot;@&quot;); // find @index
            if (j &gt; 0)
            {
                idx = int(mid(cmd, j+1));
                if (idx == 0) // idx should never be 0, core or engine is always required
                {
                    log(&quot;Invalid index: &quot;$mid(cmd, j+1), 'Error');
                    continue;
                }
                cmd = left(cmd, j);
            }
            else {
                j = InStr(cmd, &quot;&lt;&quot;); // before
                if (j &gt; 0)
                {
                    altpkg = mid(cmd, j+1);
                    cmd = left(cmd, j);
                    idx = IndexOf(altpkg);
                    if (idx == -1)
                    {
                        log(&quot;Package '&quot;$altpkg$&quot;' doesn't exists; it will be appended to the list.&quot;, 'Warning');
                        idx = AddPackage(altpkg, -1);
                    }
                }
                else {
                    j = InStr(cmd, &quot;&gt;&quot;); // after
                    if (j &gt; 0)
                    {
                        altpkg = mid(cmd, j+1);
                        cmd = left(cmd, j);
                        idx = IndexOf(altpkg);
                        if (idx == -1)
                        {
                            log(&quot;Package '&quot;$altpkg$&quot;' doesn't exists; it will be appended to the list.&quot;, 'Warning');
                            idx = AddPackage(altpkg, -1);
                        }
                        idx++;
                    }
                }
            }
            if (left(cmd, 1) == &quot;?&quot;) // don't add if already present
            {
                cmd = mid(cmd, 1);
                if (IndexOf(cmd) &gt; -1)
                {
                    log(&quot;Package '&quot;$cmd$&quot;' is already present.&quot;, 'Add');
                    continue;
                }
            }
            RemovePackage(cmd); // first remove old
            idx = AddPackage(cmd, idx);
            if (idx &lt; 0)
            {
                log(&quot;Failed to add package '&quot;$cmd$&quot;'&quot;, 'Error');
            }
            else {
                Log(&quot;Package '&quot;$cmd$&quot;' added at index &quot;$idx, 'Add');
            }
        }
        else if (left(cmd, 1) == &quot;-&quot;)
        {
            cmd = mid(cmd, 1);
            j = RemovePackage(cmd);
            if (j &gt; 0) Log(&quot;Package '&quot;$cmd$&quot;' was removed &quot;$j$&quot; time(s).&quot;, 'Remove');
            else log(&quot;Package '&quot;$cmd$&quot;' was not found, therefor not removed.&quot;, 'Warning');
        }
        else if (cmd != &quot;&quot;) {
            Log( &quot;Unsupported argument: &quot;$cmd, 'Error' );
        }
    }
    if (!bSimulate)
    {
        O.SetPropertyText(ArrayName,GetPropertyText(&quot;PackagesArray&quot;));
        O.SaveConfig();
    }
    else {
        log(&quot;Simulation; changes not saved.&quot;);
        log(&quot;New array content:&quot;);
        log(chr(9)$GetPropertyText(&quot;PackagesArray&quot;));
    }
    return 0;
}

DefaultProperties
{
    HelpCmd=&quot;EditPackagesCommandlet&quot;
    HelpOneLiner=&quot;Modify the EditPackages list.&quot;
    HelpUsage=&quot;EditPackagesCommandlet [--dry-run] package-action ...&quot;
    HelpWebLink=&quot;http://wiki.beyondunreal.com/wiki/EditPackagesCommandlet&quot;
    HelpParm[0]=&quot;--dry-run&quot;
    HelpDesc[0]=&quot;Simulate the process. Changes will not be saved.&quot;
    HelpParm[1]=&quot;+Package&quot;
    HelpDesc[1]=&quot;Add a package with the name Package. If it already exists it will be removed first.&quot;
    HelpParm[2]=&quot;-Package&quot;
    HelpDesc[2]=&quot;Remove the package with the name Package.&quot;
    HelpParm[3]=&quot; &quot;
    HelpDesc[3]=&quot;Advanced commands:&quot;
    HelpParm[4]=&quot;+?Package&quot;
    HelpDesc[4]=&quot;Don't add the package when it already exists. '?' can also be used in the commands below.&quot;
    HelpParm[5]=&quot;+Package@index&quot;
    HelpDesc[5]=&quot;Add the package at the given index.&quot;
    HelpParm[6]=&quot;+Package&lt;Pkg&quot;
    HelpDesc[6]=&quot;Add the package before Pkg. If Pkg isn't present it will be appended to the list.&quot;
    HelpParm[7]=&quot;+Package&gt;Pkg&quot;
    HelpDesc[7]=&quot;Add the package after Pkg. If Pkg isn't present it will be appended to the list.&quot;
    ShowBanner=false
    ShowErrorCount=true

    ObjectClass=&quot;Editor.EditorEngine&quot;
    ArrayName=&quot;EditPackages&quot;
}
&lt;/uscript&gt;
[[Category:Legacy Toolchain|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3125</id>
      <timestamp>2005-09-15T14:21:56Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This commandlet lets you modify EditPackages from OS commandline. Handy for install scripts.

==Usage==

 ucc package.EditPackagesCommandlet +AddPackage +AddAnother -RemovePackage

===Paramaters===

{|

|-
|'''Parameter'''
|'''Description''' 
|-
|&lt;tt&gt;--dry-run&lt;/tt&gt;
|Simulate the process. Changes will not be saved. 
|-
|&lt;tt&gt;+Package&lt;/tt&gt;
|Add a package with the name Package. If it already exists it will be removed first. 
|-
|&lt;tt&gt;-Package-&lt;/tt&gt;
|Remove the package with the name Package.
|
|-
| colspan=&quot;2&quot; |''Advanced'' 
|-
|&lt;tt&gt;+?Package&lt;/tt&gt;
|Don't add the package when it already exists. '?' can also be used in the commands below. 
|-
|&lt;tt&gt;+Package@index&lt;/tt&gt;
|Add the package at the given index. 
|-
|&lt;tt&gt;+Package&lt;Pkg&lt;/tt&gt;
|Add the package before Pkg. If Pkg isn't present it will be appended to the list. 
|-
|&lt;tt&gt;+Package&gt;Pkg&lt;/tt&gt;
|Add the package after Pkg. If Pkg isn't present it will be appended to the list. 
|}

Note, you must use double quotes around the commands that use the before or after modifier when executing it from a commandline.

===Examples===

 ucc package.EditPackagesCommandlet &quot;+myPackage&gt;Engine&quot; &quot;+MyOtherPackage&lt;myPackage&quot; -MyOldPackage

==Source code==

&lt;uscript&gt;
/*******************************************************************************
    EditPackagesCommandlet
    This commandlet lets you modify EditPackages from OS commandline. Handy for
    install scripts.

    Usage:
        ucc package.EditPackagesCommandlet +AddPackage +AddAnother -RemovePackage

    +?Package
    +Package@index
    +Package&lt;BeforeThisPackage
    +Package&gt;AfterThisPackage

    Otherwise it will be added after the list. If the before or after packages
    don't exist they will be added to the end of the list. Adding a package that
    already exists will first remove it from the old location.

    Credits:
        Switch -- initial code
        El Muerte -- major improvements
*******************************************************************************/
class EditPackagesCommandlet extends Commandlet;

/**
    The contents of this will be appended to the Parms list, this can be used
    is a subclass of the commandlet.
*/
var config string CmdArgs;

/** the classname of the object to load, that contains the ArrayName */
var string ObjectClass;
/** the name of the array to read\write the data to */
var string ArrayName;

/** temporary storage of the array list */
var protected array&lt;string&gt; PackagesArray;

/** add the package to the list */
function int AddPackage(string pkg, optional int idx)
{
    if (idx == -1) idx = PackagesArray.length;
    else idx = Clamp(idx, 0, PackagesArray.length);
    PackagesArray.insert(idx, 1);
    PackagesArray[idx] = pkg;
    return idx;
}

/** remove the package from the list, returns the number of offurances deleted */
function int RemovePackage(string pkg)
{
    local int i, deleted;
    deleted = 0;
    for (i = PackagesArray.Length-1; i &gt;= 0; i--)
    {
        if (PackagesArray[i] ~= pkg)
        {
            PackagesArray.Remove(i, 1);
            deleted++;
        }
    }
    return deleted;
}

/** returns the index of a package */
function int IndexOf(string pkg)
{
    local int i;
    for (i = PackagesArray.Length-1; i &gt;= 0; i--)
    {
        if (PackagesArray[i] ~= pkg)
        {
            return i;
        }
    }
    return -1;
}

final function string StripQuotes(string in)
{
    if (Left(in, 1) == &quot;\&quot;&quot;)
    {
        return mid(in, 1, len(in)-2);
    }
    return in;
}

event int Main( string Parms )
{
    local class C;
    local object O;
    local int i,j,idx;
    local array&lt;string&gt; Commands;
    local string cmd, altpkg;
    local bool bSimulate;

    bSimulate = false;

    if (CmdArgs != &quot;&quot;) Parms = CmdArgs@Parms;

    if (Parms == &quot;&quot;)
    {
        Log( &quot;Nothing to do. See 'ucc help &quot;$HelpCmd$&quot;' for more information.&quot;, 'Error' );
        return 1;
    }
    split(Parms, &quot; &quot;, Commands);

    // Load class
    C = class(DynamicLoadObject( ObjectClass, class'Class', true ));
    if( C == None )
    {
        Log( &quot;Failed to load class: [&quot;$ ObjectClass $&quot;]&quot;, 'Error' );
        return 1;
    }
    // Create object
    O = new C;
    if( O == None )
    {
        Log( &quot;Failed to create object of class: [&quot;$ C $&quot;]&quot;, 'Error' );
        return 1;
    }

    SetPropertyText(&quot;PackagesArray&quot;,O.GetPropertyText(ArrayName));

    // process commands
    for (i = 0; i &lt; Commands.length; i++)
    {
        cmd = StripQuotes(Commands[i]);
        if (cmd ~= &quot;--dry-run&quot;) {
            bSimulate = true;
        }
        else if (left(cmd, 1) == &quot;+&quot;)
        {
            idx = -1;
            cmd = mid(cmd, 1);
            j = InStr(cmd, &quot;@&quot;); // find @index
            if (j &gt; 0)
            {
                idx = int(mid(cmd, j+1));
                if (idx == 0) // idx should never be 0, core or engine is always required
                {
                    log(&quot;Invalid index: &quot;$mid(cmd, j+1), 'Error');
                    continue;
                }
                cmd = left(cmd, j);
            }
            else {
                j = InStr(cmd, &quot;&lt;&quot;); // before
                if (j &gt; 0)
                {
                    altpkg = mid(cmd, j+1);
                    cmd = left(cmd, j);
                    idx = IndexOf(altpkg);
                    if (idx == -1)
                    {
                        log(&quot;Package '&quot;$altpkg$&quot;' doesn't exists; it will be appended to the list.&quot;, 'Warning');
                        idx = AddPackage(altpkg, -1);
                    }
                }
                else {
                    j = InStr(cmd, &quot;&gt;&quot;); // after
                    if (j &gt; 0)
                    {
                        altpkg = mid(cmd, j+1);
                        cmd = left(cmd, j);
                        idx = IndexOf(altpkg);
                        if (idx == -1)
                        {
                            log(&quot;Package '&quot;$altpkg$&quot;' doesn't exists; it will be appended to the list.&quot;, 'Warning');
                            idx = AddPackage(altpkg, -1);
                        }
                        idx++;
                    }
                }
            }
            if (left(cmd, 1) == &quot;?&quot;) // don't add if already present
            {
                cmd = mid(cmd, 1);
                if (IndexOf(cmd) &gt; -1)
                {
                    log(&quot;Package '&quot;$cmd$&quot;' is already present.&quot;, 'Add');
                    continue;
                }
            }
            RemovePackage(cmd); // first remove old
            idx = AddPackage(cmd, idx);
            if (idx &lt; 0)
            {
                log(&quot;Failed to add package '&quot;$cmd$&quot;'&quot;, 'Error');
            }
            else {
                Log(&quot;Package '&quot;$cmd$&quot;' added at index &quot;$idx, 'Add');
            }
        }
        else if (left(cmd, 1) == &quot;-&quot;)
        {
            cmd = mid(cmd, 1);
            j = RemovePackage(cmd);
            if (j &gt; 0) Log(&quot;Package '&quot;$cmd$&quot;' was removed &quot;$j$&quot; time(s).&quot;, 'Remove');
            else log(&quot;Package '&quot;$cmd$&quot;' was not found, therefor not removed.&quot;, 'Warning');
        }
        else if (cmd != &quot;&quot;) {
            Log( &quot;Unsupported argument: &quot;$cmd, 'Error' );
        }
    }
    if (!bSimulate)
    {
        O.SetPropertyText(ArrayName,GetPropertyText(&quot;PackagesArray&quot;));
        O.SaveConfig();
    }
    else {
        log(&quot;Simulation; changes not saved.&quot;);
        log(&quot;New array content:&quot;);
        log(chr(9)$GetPropertyText(&quot;PackagesArray&quot;));
    }
    return 0;
}

DefaultProperties
{
    HelpCmd=&quot;EditPackagesCommandlet&quot;
    HelpOneLiner=&quot;Modify the EditPackages list.&quot;
    HelpUsage=&quot;EditPackagesCommandlet [--dry-run] package-action ...&quot;
    HelpWebLink=&quot;http://wiki.beyondunreal.com/wiki/EditPackagesCommandlet&quot;
    HelpParm[0]=&quot;--dry-run&quot;
    HelpDesc[0]=&quot;Simulate the process. Changes will not be saved.&quot;
    HelpParm[1]=&quot;+Package&quot;
    HelpDesc[1]=&quot;Add a package with the name Package. If it already exists it will be removed first.&quot;
    HelpParm[2]=&quot;-Package&quot;
    HelpDesc[2]=&quot;Remove the package with the name Package.&quot;
    HelpParm[3]=&quot; &quot;
    HelpDesc[3]=&quot;Advanced commands:&quot;
    HelpParm[4]=&quot;+?Package&quot;
    HelpDesc[4]=&quot;Don't add the package when it already exists. '?' can also be used in the commands below.&quot;
    HelpParm[5]=&quot;+Package@index&quot;
    HelpDesc[5]=&quot;Add the package at the given index.&quot;
    HelpParm[6]=&quot;+Package&lt;Pkg&quot;
    HelpDesc[6]=&quot;Add the package before Pkg. If Pkg isn't present it will be appended to the list.&quot;
    HelpParm[7]=&quot;+Package&gt;Pkg&quot;
    HelpDesc[7]=&quot;Add the package after Pkg. If Pkg isn't present it will be appended to the list.&quot;
    ShowBanner=false
    ShowErrorCount=true

    ObjectClass=&quot;Editor.EditorEngine&quot;
    ArrayName=&quot;EditPackages&quot;
}
&lt;/uscript&gt;
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EditPlus</title>
    <id>1139</id>
    <revision>
      <id>2991</id>
      <timestamp>2005-02-09T01:38:17Z</timestamp>
      <contributor>
        <ip>Cpe-024-163-064-042.nc.rr.com</ip>
      </contributor>
      <comment>* added link to editplus wiki</comment>
      <text xml:space="preserve">[[Image:Legacy_EditPlus.jpeg|right|]]

Another great [[Legacy:Text Editor|text editor]] is [http://www.editplus.com EditPlus], it has a lot of features, for a listing just visit the website.

A single license costs $30.

EditPlus can easily be extended with extra support for file types, a lot of users have created extentions for EditPlus you can find them in the [http://www.editplus.com/files.html User Files] section.

MegaBrian has created an extention for syntax highlighting for UScript [ftp://ftp.editplus.com/files/uscript.zip download]

Brian Ober has also created an extentions for syntax highlighting and auto completion [ftp://ftp.editplus.com/files/unrealscript.zip download]

El Muerte [TDS] has created a syntax highlighting file for UT2003 (including all classes, constants, enumerations, structs) [ftp://ftp.editplus.com/files/ut2003script.zip download]

==Related Topics==

* See [[Legacy:UMake|UMake]] for a convenient way of calling the UnrealScript compiler while editing your sources with EditPlus. &lt;br /&gt;Use the following commandline for the source code editor setting in UMake: '''&quot;c:\path\to\editplus.exe&quot; -cursor %errline%:0 &quot;%errfile%&quot;''' &lt;br /&gt;This will open/focus the source file at the correct line in EditPlus

* For more EditPlus tips and tricks, check out the [http://www.editplus.info EditPlus Wiki]

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2992</id>
      <timestamp>2003-05-18T09:08:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_EditPlus.jpeg|right|]]

Another great [[Legacy:Text Editor|text editor]] is [http://www.editplus.com EditPlus], it has a lot of features, for a listing just visit the website.

A single license costs $30.

EditPlus can easily be extended with extra support for file types, a lot of users have created extentions for EditPlus you can find them in the [http://www.editplus.com/files.html User Files] section.

MegaBrian has created an extention for syntax highlighting for UScript [ftp://ftp.editplus.com/files/uscript.zip download]

Brian Ober has also created an extentions for syntax highlighting and auto completion [ftp://ftp.editplus.com/files/unrealscript.zip download]

El Muerte [TDS] has created a syntax highlighting file for UT2003 (including all classes, constants, enumerations, structs) [ftp://ftp.editplus.com/files/ut2003script.zip download]

==Related Topics==

* See [[Legacy:UMake|UMake]] for a convenient way of calling the UnrealScript compiler while editing your sources with EditPlus. &lt;br /&gt;Use the following commandline for the source code editor setting in UMake: '''&quot;c:\path\to\editplus.exe&quot; -cursor %errline%:0 &quot;%errfile%&quot;''' &lt;br /&gt;This will open/focus the source file at the correct line in EditPlus

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Editinline</title>
    <id>1152</id>
    <revision>
      <id>3018</id>
      <timestamp>2005-01-12T14:11:38Z</timestamp>
      <contributor>
        <ip>Cellgate.btcellnet.net</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">The editinline [[Legacy:UnrealScript|UnrealScript]] keywords are used by the editor to make editing much more convenient for the mapper. If a property with editinline is selected in the [[Legacy:Actor Properties Window|Actor Properties Window]] it can be expanded to edit that actors properties within the same actor property window. Without editinline only the reference to the actor will be visible. A good example of this is in the [[Legacy:Emitter|Emitter]] class, or in the KParams of any actor. (Note that both of those examples are actually '''editinlinenew''' examples. '''Editinline''' without the '''new''' will allow you to edit the class that the variable in question refers to, but will not allow you to create an instance of that class from within the [[Legacy:Actor Properties Window|Actor Properties Window]].)

==Variables==

&lt;uscript&gt;
var editinline SomeClass SomeInstanceofSaidClass;
var editinlineuse Material SomeMaterialIllUseatSomepoint; 
&lt;/uscript&gt;

; editinline : As described above, editinline allows you to edit an actor within the [[Legacy:Actor Properties Window|Actor Properties Window]] of another actor by expanding the refence of any variable pointing to the latter actor. If the class of variable has editinlinenew in it's class definition, a &quot;new&quot; button will appear in the [[Legacy:Actor Properties Window|Actor Properties Window]] if the variable's reference is &quot;None.&quot; Clicking said button will create an instance of the class and allow you to edit that. If subclasses of the class of the variable reference are loaded in the editor a drop-down box will be provided to let you choose which class you would like to instantiate. After the class has been instantiated you can edit it like any other editinlinenew actor. It is important to use this only for variable references, otherwise you risk crashing UnrealEd.

; editinlineuse : Similar to editinline, editinlineuse will also add a &quot;use&quot; button for the property. This will only work for [[Legacy:Material|Material]]s, [[Legacy:StaticMesh|StaticMesh]]es, [[Legacy:Sound|Sound]]s and anything else UnrealEd has a browser for, probably with the exception of the class browser. Everything else will crash UnrealEd.

; editinlinenotify : This will notify the outer object if the property is changed.: &lt;uscript&gt;
struct native NotifyInfo
{
	var() FLOAT NotifyFrame;
	var() editinlinenotify AnimNotify Notify;
	var INT OldRevisionNum;
};
&lt;/uscript&gt;

==Classes==

&lt;uscript&gt;
class FadeColor extends ConstantMaterial native	editinlinenew;
class Texture extends BitmapMaterial safereplace native noteditinlinenew dontcollapsecategories noexport;
&lt;/uscript&gt;

; editinlinenew : This tag signifies that a &quot;new&quot; button should be added when this class is used as a variable type with the modifier editinline. See above for details. Note that classes that are subclasses of this should not have editinlinenew set.

; noteditinlinenew : Editinlinenew is inherited by the subclasses of the class with editinlinenew defined. This can be overridden through the use of this modifier.

==Related Topics==
* [[Legacy:Class Syntax|Class Syntax]]
* [[Legacy:Variable Syntax|Variable Syntax]]
* [[Legacy:Displaying Variables In UnrealEd|Displaying Variables In UnrealEd]]
* [[Legacy:Add An Inline Object|Add An Inline Object]] in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==Discussion==

'''Mychaeel:''' Apparently &lt;code&gt;editinline&lt;/code&gt; doesn't work with Actor-derived classes; or at least, the &quot;New&quot; button in the [[Legacy:Add An Inline Object|UnrealEd property sheet]] doesn't.  (There are reasons why this seems plausible, but there's no reason to assume that it ''couldn't possibly'' be working.  Plus, Epic or Digital Extremes use an &lt;code&gt;editinline&lt;/code&gt; ZoneInfo array themselves in [[Legacy:ZoneInfo|ZoneInfo]].)
: The effect I'm seeing on an Actor-derived &lt;code&gt;editinline&lt;/code&gt; object is that I can use the &quot;New&quot; button without problems; the actor instance appears, and I can set its properties as I like.  However, the actor simply disappears in the game &amp;ndash; its reference in the parent actor is set to &lt;code&gt;None&lt;/code&gt;, and the actor itself is completely gone.
: Does anybody have an idea why this is happening, and whether it can be worked around?  (Background:  I'd like to have replication, states and the &quot;Tick&quot; event in my &lt;code&gt;editinline&lt;/code&gt; class.)

'''Mysterial:''' &lt;code&gt;editinline&lt;/code&gt; just specifies that you can expand a property of that actor's class to edit it from the property editor. For example, in the case you mentioned, if you are editing the properties of a [[Legacy:ZoneInfo|ZoneInfo]], you can expand an element of the ManualExcludes array and edit the ZoneInfo it points to, right from within the [[Legacy:ZoneInfo|ZoneInfo]]'s property window. The presence of a &quot;New&quot; option there is probably a bug, since that's what &lt;code&gt;editinlinenew&lt;/code&gt; is supposed to do. In any case, &lt;code&gt;editinlinenew&lt;/code&gt; is not supported for Actor-derived classes. I'm somewhat surprised it doesn't crash the editor.

'''Solid Snake:''' Yes, I've found this rather annoying. It appears that you must base the classes of 'Object'. I'll assume for proper replication, you'll need to use the parent actor, which can be annoying since it's not really OOP compliant.

----

'''Mychaeel:''' More &lt;code&gt;editinlinenew&lt;/code&gt; trouble:  I've defined a class &quot;within SomeOuterClass&quot; to be used with &lt;code&gt;editinlinenew&lt;/code&gt;.  UnrealEd crashes when I try to create a new instance of that class, giving me an error message &quot;Object MyInnerClass None created in Package instead of SomeOuterClass.&quot;
: Now, the error message is descriptive enough &amp;ndash; I suppose I just can't have UnrealEd instantiate an inner class &amp;ndash; but isn't there a way around this limitation (or have I been misunderstanding the concept of &quot;inner classes&quot; all the way)?</text>
    </revision>
    <revision>
      <id>3019</id>
      <timestamp>2005-01-12T14:08:51Z</timestamp>
      <contributor>
        <ip>62.37.193.96</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The editinline [[Legacy:UnrealScript|UnrealScript]] keywords are used by the editor to make editing much more convenient for the mapper. If a property with editinline is selected in the [[Legacy:Actor Properties Window|Actor Properties Window]] it can be expanded to edit that actors properties within the same actor property window. Without editinline only the reference to the actor will be visible. A good example of this is in the [[Legacy:Emitter|Emitter]] class, or in the KParams of any actor. (Note that both of those examples are actually '''editinlinenew''' examples. '''Editinline''' without the '''new''' will allow you to edit the class that the variable in question refers to, but will not allow you to create an instance of that class from within the [[Legacy:Actor Properties Window|Actor Properties Window]].)

==Variables==

&lt;uscript&gt;
var editinline SomeClass SomeInstanceofSaidClass;
var editinlineuse Material SomeMaterialIllUseatSomepoint; 
&lt;/uscript&gt;

; editinline : As described above, editinline allows you to edit an actor within the [[Legacy:Actor Properties Window|Actor Properties Window]] of another actor by expanding the refence of any variable pointing to the latter actor. If the class of variable has editinlinenew in it's class definition, a &quot;new&quot; button will appear in the [[Legacy:Actor Properties Window|Actor Properties Window]] if the variable's reference is &quot;None.&quot; Clicking said button will create an instance of the class and allow you to edit that. If subclasses of the class of the variable reference are loaded in the editor a drop-down box will be provided to let you choose which class you would like to instantiate. After the class has been instantiated you can edit it like any other editinlinenew actor. It is important to use this only for variable references, otherwise you risk crashing UnrealEd.

; editinlineuse : Similar to editinline, editinlineuse will also add a &quot;use&quot; button for the property. This will only work for [[Legacy:Material|Material]]s, [[Legacy:StaticMesh|StaticMesh]]es, [[Legacy:Sound|Sound]]s and anything else UnrealEd has a browser for, probably with the exception of the class browser. Everything else will crash UnrealEd.

; editinlinenotify : This will notify the outer object if the property is changed.: &lt;uscript&gt;
struct native NotifyInfo
{
	var() FLOAT NotifyFrame;
	var() editinlinenotify AnimNotify Notify;
	var INT OldRevisionNum;
};
&lt;/uscript&gt;

==Classes==

&lt;uscript&gt;
class FadeColor extends ConstantMaterial native	editinlinenew;
class Texture extends BitmapMaterial safereplace native noteditinlinenew dontcollapsecategories noexport;
&lt;/uscript&gt;

; editinlinenew : This tag signifies that a &quot;new&quot; button should be added when this class is used as a variable type with the modifier editinline. See above for details. Note that classes that are subclasses of this should not have editinlinenew set.

; noteditinlinenew : Editinlinenew is inherited by the subclasses of the class with editinlinenew defined. This can be overridden through the use of this modifier.

==Related Topics==
* [[Legacy:Class Syntax|Class Syntax]]
* [[Legacy:Variable Syntax|Variable Syntax]]
* [[Legacy:Displaying Variables In UnrealEd|Displaying Variables In UnrealEd]]
* [[Legacy:Add An Inline Object|Add An Inline Object]] in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]

==Discussion==

'''Mychaeel:''' Apparently &lt;code&gt;editinline&lt;/code&gt; doesn't work with Actor-derived classes; or at least, the &quot;New&quot; button in the [[Legacy:Add An Inline Object|UnrealEd property sheet]] doesn't.  (There are reasons why this seems plausible, but there's no reason to assume that it ''couldn't possibly'' be working.  Plus, Epic or Digital Extremes use an &lt;code&gt;editinline&lt;/code&gt; ZoneInfo array themselves in [[Legacy:ZoneInfo|ZoneInfo]].)
: The effect I'm seeing on an Actor-derived &lt;code&gt;editinline&lt;/code&gt; object is that I can use the &quot;New&quot; button without problems; the actor instance appears, and I can set its properties as I like.  However, the actor simply disappears in the game &amp;ndash; its reference in the parent actor is set to &lt;code&gt;None&lt;/code&gt;, and the actor itself is completely gone.
: Does anybody have an idea why this is happening, and whether it can be worked around?  (Background:  I'd like to have replication, states and the &quot;Tick&quot; event in my &lt;code&gt;editinline&lt;/code&gt; class.)

'''Mysterial:''' &lt;code&gt;editinline&lt;/code&gt; just specifies that you can expand a property of that actor's class to edit it from the property editor. For example, in the case you mentioned, if you are editing the properties of a [[Legacy:ZoneInfo|ZoneInfo]], you can expand an element of the ManualExcludes array and edit the ZoneInfo it points to, right from within the [[Legacy:ZoneInfo|ZoneInfo]]'s property window. The presence of a &quot;New&quot; option there is probably a bug, since that's what &lt;code&gt;editinlinenew&lt;/code&gt; is supposed to do. In any case, &lt;code&gt;editinlinenew&lt;/code&gt; is not supported for Actor-derived classes. I'm somewhat surprised it doesn't crash the editor.

'''Solid Snake:''' Yes, I've found this rather annoying. It appears that you must base the classes of 'Object'. I'll assume for proper replication, you'll need to use the parent actor, which can be annoying since it's not really OOP compliant.

----

'''Mychaeel:''' More &lt;code&gt;editinlinenew&lt;/code&gt; trouble:  I've defined a class &quot;within SomeOuterClass&quot; to be used with &lt;code&gt;editinlinenew&lt;/code&gt;.  UnrealEd crashes when I try to create a new instance of that class, giving me an error message &quot;Object MyInnerClass None created in Package instead of SomeOuterClass.&quot;
: Now, the error message is descriptive enough &amp;ndash; I suppose I just can't have UnrealEd instantiate an inner class &amp;ndash; but isn't there a way around this limitation (or have I been misunderstanding the concept of &quot;inner classes&quot; all the way)?

Sponsored Links:

[http://www.roda-golfbeachresort.com/ roda golf property for sale]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EditorEngine</title>
    <id>1124</id>
    <revision>
      <id>2956</id>
      <timestamp>2006-01-08T18:32:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; [[Legacy:Engine|Engine]] &gt;&gt; EditorEngine (Package: Editor)}}

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; [[Legacy:Engine|Engine]] &gt;&gt; EditorEngine (Package: Editor)}}

The UnrealEd subsystem. 

The config properties below can be set in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.

==Properties==
; int NotifyVtbl (const) :
; Level Level (const) :
; model TempModel (const) :
; texture CurrentTexture (const) :
; [[Legacy:Class|class]] CurrentClass (const) :
; transbuffer Trans (const) :
; textbuffer Results (const) :
; int Pad[8] (const) :
; texture MenuUp, MenuDn (const) :
; texture CollOn, CollOff (const) :
; texture PlyrOn, PlyrOff (const) :
; texture LiteOn, LiteOff (const) :
; texture Bad, Bkgnd, BkgndHi (const) :
; bool bFastRebuild, bBootstrapping (const) :
; int AutoSaveIndex (const, config) :
; int AutoSaveCount, Mode, ClickFlags (const) :
; float MovementSpeed (const) :
; [[Legacy:Package|package]] PackageContext (const) :
; vector AddLocation (const) :
; plane AddPlane (const) :
; array&lt;[[Legacy:Object|Object]]&gt; Tools (const) :
; [[Legacy:Class|class]] BrowseClass (const) :
; int ConstraintsVtbl (const) :
; bool GridEnabled (config) :
; bool SnapVertices (config) :
; bool AffectRegion (config) :
; bool TextureLock (config) :
; bool SelectionLock  (config) :
; float SnapDistance (config) :
; vector GridSize (config) :
; bool RotGridEnabled (config) :
; rotator RotGridSize (config) :
; float FovAngleDegrees (config) :
; bool GodMode (config) :
; bool AutoSave (config) :
; byte AutosaveTimeMinutes (config) :
; string GameCommandLine (config) :
; array&lt;string&gt; EditPackages (config) :
; color C_WorldBox (config) :
; color C_GroundPlane (config) :
; color C_GroundHighlight (config) :
; color C_BrushWire (config) :
; color C_Pivot (config) :
; color C_Select (config) :
; color C_Current (config) :
; color C_AddWire (config) :
; color C_SubtractWire (config) :
; color C_GreyWire (config) :
; color C_BrushVertex (config) :
; color C_BrushSnap (config) :
; color C_Invalid (config) :
; color C_ActorWire (config) :
; color C_ActorHiWire (config) :
; color C_Black (config) :
; color C_White (config) :
; color C_Mask (config) :
; color C_SemiSolidWire (config) :
; color C_NonSolidWire (config) :
; color C_WireBackground (config) :
; color C_WireGridAxis (config) :
; color C_ActorArrow (config) :
; color C_ScaleBox (config) :
; color C_ScaleBoxHi (config) :
; color C_ZoneWire (config) :
; color C_Mover (config) :
; color C_OrthoBackground (config) :

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

----

[[:Category:Legacy Class (UT)]]

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Could use function, event and state defs.  Property defs can be filled in.
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2957</id>
      <timestamp>2002-04-14T15:18:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>link to Advanced Properties</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; [[Legacy:Engine|Engine]] &gt;&gt; EditorEngine}}

The UnrealEd subsystem. 

The config properties below can be set in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.

==Properties ==
; const int NotifyVtbl :
; const Level Level :
; const model TempModel :
; const texture CurrentTexture :
; const class CurrentClass :
; const transbuffer Trans :
; const textbuffer Results :
; const int Pad[8] :
; const texture MenuUp, MenuDn :
; const texture CollOn, CollOff :
; const texture PlyrOn, PlyrOff :
; const texture LiteOn, LiteOff :
; const texture Bad, Bkgnd, BkgndHi :
; const bool bFastRebuild, bBootstrapping :
; const config int AutoSaveIndex :
; const int AutoSaveCount, Mode, ClickFlags :
; const float MovementSpeed :
; const package PackageContext :
; const vector AddLocation :
; const plane AddPlane :
; const array&lt;Object&gt; Tools :
; const class BrowseClass :
; const int ConstraintsVtbl :
; config bool GridEnabled :
; config bool SnapVertices :
; config bool AffectRegion :
; config bool TextureLock :
; config bool SelectionLock :
; config float SnapDistance :
; config vector GridSize :
; config bool RotGridEnabled :
; config rotator RotGridSize :
; config float FovAngleDegrees :
; config bool GodMode :
; config bool AutoSave :
; config byte AutosaveTimeMinutes :
; config string GameCommandLine :
; config array&lt;string&gt; EditPackages :
; config color C_WorldBox :
; config color C_GroundPlane :
; config color C_GroundHighlight :
; config color C_BrushWire :
; config color C_Pivot :
; config color C_Select :
; config color C_Current :
; config color C_AddWire :
; config color C_SubtractWire :
; config color C_GreyWire :
; config color C_BrushVertex :
; config color C_BrushSnap :
; config color C_Invalid :
; config color C_ActorWire :
; config color C_ActorHiWire :
; config color C_Black :
; config color C_White :
; config color C_Mask :
; config color C_SemiSolidWire :
; config color C_NonSolidWire :
; config color C_WireBackground :
; config color C_WireGridAxis :
; config color C_ActorArrow :
; config color C_ScaleBox :
; config color C_ScaleBoxHi :
; config color C_ZoneWire :
; config color C_Mover :
; config color C_OrthoBackground :</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EditorEngine (DX)</title>
    <id>1175</id>
    <revision>
      <id>3068</id>
      <timestamp>2004-02-10T05:08:46Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; [[Legacy:Engine|Engine]] &gt;&gt; EditorEngine (Editor)}}

The UnrealEd subsystem.

==Differences from UT ==
* lots of new default properties, maybe just defined differently/directly

==Properties Missing (in UT, not DX) ==

===Grid ===
; bool AffectRegion :
; bool TextureLock :
; bool SelectionLock :

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Effects</title>
    <id>1093</id>
    <revision>
      <id>2889</id>
      <timestamp>2005-12-02T23:51:37Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Effects (Package: Engine)}}

Effects are actors in UT2003 that produce various, well, effects.&lt;br /&gt;There aren't as much subclasses in UT2003 as there are in UT because most visual effects are created with [[Legacy:Emitter|Emitter]]s or [[Legacy:XEmitter|xEmitter]]s now.

See [[Legacy:Effects (UT)|Effects (UT)]] for the UT version of this page.

==Known Subclasses==
* [[Legacy:Bubble|Bubble]]
* [[Legacy:BulldogHeadlightCorona|BulldogHeadlightCorona]]
* [[Legacy:Fragment|Fragment]]
* [[Legacy:HitEffect|HitEffect]]
* [[Legacy:Lightning|lightning]]
* [[Legacy:PainterMark|PainterMark]]
* [[Legacy:RocketCorona|RocketCorona]]
* [[Legacy:XHeavyWallHitEffect|xHeavyWallHitEffect]]
** [[Legacy:ExploWallHit|ExploWallHit]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2890</id>
      <timestamp>2003-05-26T16:19:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Effects (Package: Engine)}}

Effects are actors in UT2003 that produce various, well, effects.&lt;br /&gt;There aren't as much subclasses in UT2003 as there are in UT because most visual effects are created with [[Legacy:Emitter|Emitter]]s or [[Legacy:XEmitter|xEmitter]]s now.

See [[Legacy:Effects (UT)|Effects (UT)]] for the UT version of this page.

==Known Subclasses==
* [[Legacy:Bubble|Bubble]]
* [[Legacy:BulldogHeadlightCorona|BulldogHeadlightCorona]]
* [[Legacy:Fragment|Fragment]]
* [[Legacy:HitEffect|HitEffect]]
* [[Legacy:Lightning|lightning]]
* [[Legacy:PainterMark|PainterMark]]
* [[Legacy:RocketCorona|RocketCorona]]
* [[Legacy:XHeavyWallHitEffect|xHeavyWallHitEffect]]
** [[Legacy:ExploWallHit|ExploWallHit]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Effects (UT)</title>
    <id>1104</id>
    <revision>
      <id>2915</id>
      <timestamp>2006-04-07T07:54:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Effects (Package: Engine)}}

Effects are actors in UT that produce various, well, effects. You can add them into your level just the way you would with a [[Legacy:Decoration (UT)|Decoration (UT)]], and then trigger them to make them produce their effect. Note that a lot of these effects are used by the game for things like weapons hits and players gibbing, so there may only be a few Effects that are useful in mapping.

See [[Legacy:Effects|Effects]] for the UT2003 version of this page.

==Known Subclasses==
 [[Legacy:Effects (UT)|Effects (UT)]]
   +- [[Legacy:AnimSpriteEffect|AnimSpriteEffect]]
   |    +- [[Legacy:DefaultBurst|DefaultBurst]]
   |    |    +- [[Legacy:DefaultBurstAlt|DefaultBurstAlt]]
   |    +- [[Legacy:EnergyBurst|EnergyBurst]]
   |    +- [[Legacy:FlameExplosion|FlameExplosion]]
   |    +- [[Legacy:RipperPulse|RipperPulse]]
   |    +- [[Legacy:ShockExplo|ShockExplo]]
   |    +- [[Legacy:SmokeColumn|SmokeColumn]]
   |    +- [[Legacy:SmokeExplo|SmokeExplo]]
   |    +- [[Legacy:SpriteBallExplosion|SpriteBallExplosion]]
   |    |    +- [[Legacy:SilentBallExplosion|SilentBallExplosion]]
   |    |    +- [[Legacy:SpriteBallChild|SpriteBallChild]]
   |    |    +- [[Legacy:SpriteBlueExplo|SpriteBlueExplo]]
   |    |         +- [[Legacy:SpriteGreenE|SpriteGreenE]]
   |    |         +- [[Legacy:SpriteOrangeE|SpriteOrangeE]]
   |    |         +- [[Legacy:SpriteRedE|SpriteRedE]]
   |    |         +- [[Legacy:SpriteYellowE|SpriteYellowE]]
   |    +- [[Legacy:SpriteLightning|SpriteLightning]]
   |    +- [[Legacy:SpriteSmokePuff|SpriteSmokePuff]]
   |    +- [[Legacy:UTFlameExplosion|UTFlameExplosion]]
   |    +- [[Legacy:UTSpriteBallExplosion|UTSpriteBallExplosion]]
   |    +- [[Legacy:UTSpriteSmokePuff|UTSpriteSmokePuff]]
   |    |    +- [[Legacy:BigBlackSmoke|BigBlackSmoke]]
   |    |    +- [[Legacy:BlackSmoke|BlackSmoke]]
   |    |    +- [[Legacy:BloodPuff|BloodPuff]]
   |    |    +- [[Legacy:GreenSmokePuff|GreenSmokePuff]]
   |    |    |    +- [[Legacy:GreenBloodPuff|GreenBloodPuff]]
   |    |    |    +- [[Legacy:GreenGelPuff|GreenGelPuff]]
   |    |    +- [[Legacy:RisingSpriteSmokePuff|RisingSpriteSmokePuff]]
   |    |    +- [[Legacy:WallHitEffect|WallHitEffect]]
   |    |    |    +- [[Legacy:HeavyWallHitEffect|HeavyWallHitEffect]]
   |    |    |    +- [[Legacy:LightWallHitEffect|LightWallHitEffect]]
   |    |    +- [[Legacy:UTFlameExplosion|UTFlameExplosion]]
   |    |    +- [[Legacy:UTSpriteBallExplosion|UTSpriteBallExplosion]]
   |    |    |    +- [[Legacy:SuperShockExplo|SuperShockExplo]]
   |    |    |    +- [[Legacy:UTSpriteBallChild|UTSpriteBallChild]]
   |    |    +- [[Legacy:UTSpriteSmokePuff|UTSpriteSmokePuff]]
   |    |         +- [[Legacy:UTBlackSmoke|UTBlackSmoke]]
   |    |         +- [[Legacy:UTBloodPuff|UTBloodPuff]]
   |    |         |    +- [[Legacy:UTBigBloodPuff|UTBigBloodPuff]]
   |    |         +- [[Legacy:UTGreenBloodPuff|UTGreenBloodPuff]]
   |    |         +- [[Legacy:UTGreenGelPuff|UTGreenGelPuff]]
   |    +- [[Legacy:WarExplosion|WarExplosion]]
   |         +- [[Legacy:WarExplosion2|WarExplosion2]]
   +- [[Legacy:ArrowSpawner|ArrowSpawner]]
   +- [[Legacy:BallExplosion|BallExplosion]]
   +- [[Legacy:Blood2|Blood2]]
   |    +- [[Legacy:BloodBurst|BloodBurst]]
   |    +- [[Legacy:BloodSpray|BloodSpray]]
   |    |    +- [[Legacy:GreenBloodSpray|GreenBloodSpray]]
   |    +- [[Legacy:BloodSpurt|BloodSpurt]]
   |    +- [[Legacy:BloodTrail|BloodTrail]]
   +- [[Legacy:BloodPool|BloodPool]]
   +- [[Legacy:BoulderSpawner|BoulderSpawner]]
   +- [[Legacy:Bubble|Bubble]]
   +- [[Legacy:Bubble1|Bubble1]]
   +- [[Legacy:BulletHit|BulletHit]]
   +- [[Legacy:BulletImpact|BulletImpact]]
   |    +- [[Legacy:UTWallhit|UTWallhit]]
   |         +- [[Legacy:ImpactMark|ImpactMark]]
   |         +- [[Legacy:SawHit|SawHit]]
   |         +- [[Legacy:UTHeavyWallHitEffect|UTHeavyWallHitEffect]]
   |         +- [[Legacy:UTLightWallHitEffect|UTLightWallHitEffect]]
   +- [[Legacy:CannonMuzzle|CannonMuzzle]]
   +- [[Legacy:Carflash|Carflash]]
   +- [[Legacy:Chip|Chip]]
   +- [[Legacy:ChunkTrail|ChunkTrail]]
   +- [[Legacy:DExplosion|DExplosion]]
   +- [[Legacy:EnhancedItems|EIEffects]] ([[Legacy:EnhancedItems|EnhancedItems]])
   |    +- PlayerShellEffect
   |         +- PlayerShell
   |         +- PlayerSphere
   +- [[Legacy:Electricity|Electricity]]
   +- [[Legacy:EnhancedRespawn|EnhancedRespawn]]
   +- [[Legacy:ExplodingWall|ExplodingWall]]
   |    +- BreakingGlass
   +- [[Legacy:ExplosionChain|ExplosionChain]]
   +- [[Legacy:FatRing|FatRing]]
   +- [[Legacy:Flame|Flame]]
   +- [[Legacy:FlameBall|FlameBall]]
   +- [[Legacy:GreenBlob|GreenBlob]]
   +- [[Legacy:MercFlare|MercFlare]]
   +- [[Legacy:MortarSpawner|MortarSpawner]]
   +- [[Legacy:ParticleBurst|ParticleBurst]]
   |    +- [[Legacy:ParticleBurst2|ParticleBurst2]]
   +- [[Legacy:PawnTeleportEffect|PawnTeleportEffect]]
   |    +- [[Legacy:QueenTeleportEffect|QueenTeleportEffect]]
   |    +- [[Legacy:UTTeleportEffect|UTTeleportEffect]]
   +- [[Legacy:PlasmaCap|PlasmaCap]]
   |    +- [[Legacy:PlasmaHit|PlasmaHit]]
   +- [[Legacy:PlasmaEffect|PlasmaEffect]]
   +- [[Legacy:QueenShield|QueenShield]]
   +- [[Legacy:RedeemerTrail|RedeemerTrail]]
   +- [[Legacy:ReSpawn|ReSpawn]]
   +- [[Legacy:RingExplosion|RingExplosion]]
   |    +- [[Legacy:RingExplosion2|RingExplosion2]]
   |    +- [[Legacy:RingExplosion3|RingExplosion3]]
   |    +- [[Legacy:RingExplosion4|RingExplosion4]]
   |    +- [[Legacy:WaterRing|WaterRing]]
   +- [[Legacy:RocketTrail|RocketTrail]]
   +- [[Legacy:Shield|Shield]]
   +- [[Legacy:ShieldBeltEffect|ShieldBeltEffect]]
   +- [[Legacy:ShockBeam|ShockBeam]]
   |    +- [[Legacy:ShockBeam2|ShockBeam2]]
   +- [[Legacy:ShockRifleWave|ShockRifleWave]]
   +- [[Legacy:ShockWave|ShockWave]]
   +- [[Legacy:SmallSpark|SmallSpark]]
   |    +- [[Legacy:SmallSpark2|SmallSpark2]]
   |    +- [[Legacy:Spark3|Spark3]]
   |         +- [[Legacy:Spark32|Spark32]]
   |         +- [[Legacy:Spark33|Spark33]]
   |         +- [[Legacy:Spark34|Spark34]]
   |         +- [[Legacy:Spark35|Spark35]]
   +- [[Legacy:SmokeGenerator|SmokeGenerator]]
   |    +- ShortSmokeGen
   +- [[Legacy:SmokeHose|SmokeHose]]
   +- [[Legacy:SmokeHoseDest|SmokeHoseDest]]
   +- [[Legacy:SmokePuff|SmokePuff]]
   +- [[Legacy:SmokeTrail|SmokeTrail]]
   +- [[Legacy:SparkBit|SparkBit]]
   +- [[Legacy:Sparks|Sparks]]
   +- [[Legacy:SpikeExplosion|SpikeExplosion]]
   +- [[Legacy:Splash|splash]]
   +- [[Legacy:SpriteExplosion|SpriteExplosion]]
   +- [[Legacy:Supershockbeam|supershockbeam]]
   +- [[Legacy:Tazerexplosion|Tazerexplosion]]
   +- [[Legacy:TinyBurst|TinyBurst]]
   +- [[Legacy:TranslocGlow|TranslocGlow]]
   |    +- [[Legacy:TranslocBLue|TranslocBLue]]
   |    +- [[Legacy:TranslocGold|TranslocGold]]
   |    +- [[Legacy:TranslocGreen|TranslocGreen]]
   +- [[Legacy:TranslocOutEffect|TranslocOutEffect]]
   +- [[Legacy:TSmoke|TSmoke]]
   +- [[Legacy:UTBlood2|UTBlood2]]
   |    +- [[Legacy:UTBloodBurst|UTBloodBurst]]
   |    |    +- [[Legacy:UTBloodHit|UTBloodHit]]
   |    |         +- [[Legacy:UTBigBloodHit|UTBigBloodHit]]
   |    +- [[Legacy:UTBloodTrail|UTBloodTrail]]
   +- [[Legacy:UTBloodDrop|UTBloodDrop]]
   +- [[Legacy:UTGreenBlob|UTGreenBlob]]
   +- [[Legacy:UTRingExplosion|UTRingExplosion]]
   |    +- [[Legacy:UTComboRing|UTComboRing]]
   |    |    +- [[Legacy:UTRingExplosion4|UTRingExplosion4]]
   |    +- [[Legacy:UTRingExplosion3|UTRingExplosion3]]
   |    +- [[Legacy:UTRingExplosion5|UTRingExplosion5]]
   |    +- [[Legacy:Utsuperring|utsuperring]]
   |         +- [[Legacy:UTSuperring2|UTSuperring2]]
   +- [[Legacy:UTShieldBeltEffect|UTShieldBeltEffect]]
   +- [[Legacy:UTShortSmokeGen|UTShortSmokeGen]]
   +- [[Legacy:UTSpark|UTSpark]]
   +- [[Legacy:UTSparks|UTSparks]]
   +- [[Legacy:UTSmokeTrail|UTSmokeTrail]]
   |    +- [[Legacy:UTLightSmokeTrail|UTLightSmokeTrail]]
   +- [[Legacy:UTTeleEffect|UTTeleEffect]]
   +- [[Legacy:WaterImpact|WaterImpact]]

----

'''ProjectX:''' we could do with some screenshots for each page showing what each effect does, we could also do with adding the properties that need to be set and how to work them

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2916</id>
      <timestamp>2005-10-24T17:37:23Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Effects (Package: Engine)}}

Effects are actors in UT that produce various, well, effects. You can add them into your level just the way you would with a [[Legacy:Decoration (UT)|Decoration (UT)]], and then trigger them to make them produce their effect. Note that a lot of these effects are used by the game for things like weapons hits and players gibbing, so there may only be a few Effects that are useful in mapping.

See [[Legacy:Effects|Effects]] for the UT2003 version of this page.

==Known Subclasses==
 [[Legacy:Effects (UT)|Effects (UT)]]
   +- [[Legacy:AnimSpriteEffect|AnimSpriteEffect]]
   |    +- [[Legacy:DefaultBurst|DefaultBurst]]
   |    |    +- [[Legacy:DefaultBurstAlt|DefaultBurstAlt]]
   |    +- [[Legacy:EnergyBurst|EnergyBurst]]
   |    +- [[Legacy:FlameExplosion|FlameExplosion]]
   |    +- [[Legacy:RipperPulse|RipperPulse]]
   |    +- [[Legacy:ShockExplo|ShockExplo]]
   |    +- [[Legacy:SmokeColumn|SmokeColumn]]
   |    +- [[Legacy:SmokeExplo|SmokeExplo]]
   |    +- [[Legacy:SpriteBallExplosion|SpriteBallExplosion]]
   |    |    +- [[Legacy:SilentBallExplosion|SilentBallExplosion]]
   |    |    +- [[Legacy:SpriteBallChild|SpriteBallChild]]
   |    |    +- [[Legacy:SpriteBlueExplo|SpriteBlueExplo]]
   |    |         +- [[Legacy:SpriteGreenE|SpriteGreenE]]
   |    |         +- [[Legacy:SpriteOrangeE|SpriteOrangeE]]
   |    |         +- [[Legacy:SpriteRedE|SpriteRedE]]
   |    |         +- [[Legacy:SpriteYellowE|SpriteYellowE]]
   |    +- [[Legacy:SpriteLightning|SpriteLightning]]
   |    +- [[Legacy:SpriteSmokePuff|SpriteSmokePuff]]
   |    +- [[Legacy:UTFlameExplosion|UTFlameExplosion]]
   |    +- [[Legacy:UTSpriteBallExplosion|UTSpriteBallExplosion]]
   |    +- [[Legacy:UTSpriteSmokePuff|UTSpriteSmokePuff]]
   |    |    +- [[Legacy:BigBlackSmoke|BigBlackSmoke]]
   |    |    +- [[Legacy:BlackSmoke|BlackSmoke]]
   |    |    +- [[Legacy:BloodPuff|BloodPuff]]
   |    |    +- [[Legacy:GreenSmokePuff|GreenSmokePuff]]
   |    |    |    +- [[Legacy:GreenBloodPuff|GreenBloodPuff]]
   |    |    |    +- [[Legacy:GreenGelPuff|GreenGelPuff]]
   |    |    +- [[Legacy:RisingSpriteSmokePuff|RisingSpriteSmokePuff]]
   |    |    +- [[Legacy:WallHitEffect|WallHitEffect]]
   |    |    |    +- [[Legacy:HeavyWallHitEffect|HeavyWallHitEffect]]
   |    |    |    +- [[Legacy:LightWallHitEffect|LightWallHitEffect]]
   |    |    +- [[Legacy:UTFlameExplosion|UTFlameExplosion]]
   |    |    +- [[Legacy:UTSpriteBallExplosion|UTSpriteBallExplosion]]
   |    |    |    +- [[Legacy:SuperShockExplo|SuperShockExplo]]
   |    |    |    +- [[Legacy:UTSpriteBallChild|UTSpriteBallChild]]
   |    |    +- [[Legacy:UTSpriteSmokePuff|UTSpriteSmokePuff]]
   |    |         +- [[Legacy:UTBlackSmoke|UTBlackSmoke]]
   |    |         +- [[Legacy:UTBloodPuff|UTBloodPuff]]
   |    |         |    +- [[Legacy:UTBigBloodPuff|UTBigBloodPuff]]
   |    |         +- [[Legacy:UTGreenBloodPuff|UTGreenBloodPuff]]
   |    |         +- [[Legacy:UTGreenGelPuff|UTGreenGelPuff]]
   |    +- [[Legacy:WarExplosion|WarExplosion]]
   |         +- [[Legacy:WarExplosion2|WarExplosion2]]
   +- [[Legacy:ArrowSpawner|ArrowSpawner]]
   +- [[Legacy:BallExplosion|BallExplosion]]
   +- [[Legacy:Blood2|Blood2]]
   |    +- [[Legacy:BloodBurst|BloodBurst]]
   |    +- [[Legacy:BloodSpray|BloodSpray]]
   |    |    +- [[Legacy:GreenBloodSpray|GreenBloodSpray]]
   |    +- [[Legacy:BloodSpurt|BloodSpurt]]
   |    +- [[Legacy:BloodTrail|BloodTrail]]
   +- [[Legacy:BloodPool|BloodPool]]
   +- [[Legacy:BoulderSpawner|BoulderSpawner]]
   +- [[Legacy:Bubble|Bubble]]
   +- [[Legacy:Bubble1|Bubble1]]
   +- [[Legacy:BulletHit|BulletHit]]
   +- [[Legacy:BulletImpact|BulletImpact]]
   |    +- [[Legacy:UTWallhit|UTWallhit]]
   |         +- [[Legacy:ImpactMark|ImpactMark]]
   |         +- [[Legacy:SawHit|SawHit]]
   |         +- [[Legacy:UTHeavyWallHitEffect|UTHeavyWallHitEffect]]
   |         +- [[Legacy:UTLightWallHitEffect|UTLightWallHitEffect]]
   +- [[Legacy:CannonMuzzle|CannonMuzzle]]
   +- [[Legacy:Carflash|Carflash]]
   +- [[Legacy:Chip|Chip]]
   +- [[Legacy:ChunkTrail|ChunkTrail]]
   +- [[Legacy:DExplosion|DExplosion]]
   +- [[Legacy:EnhancedItems|EIEffects]] ([[Legacy:EnhancedItems|EnhancedItems]])
   |    +- PlayerShellEffect
   |         +- PlayerShell
   |         +- PlayerSphere
   +- [[Legacy:Electricity|Electricity]]
   +- [[Legacy:EnhancedRespawn|EnhancedRespawn]]
   +- [[Legacy:ExplodingWall|ExplodingWall]]
   |    +- BreakingGlass
   +- [[Legacy:ExplosionChain|ExplosionChain]]
   +- [[Legacy:FatRing|FatRing]]
   +- [[Legacy:Flame|Flame]]
   +- [[Legacy:FlameBall|FlameBall]]
   +- [[Legacy:GreenBlob|GreenBlob]]
   +- [[Legacy:MercFlare|MercFlare]]
   +- [[Legacy:MortarSpawner|MortarSpawner]]
   +- [[Legacy:ParticleBurst|ParticleBurst]]
   |    +- [[Legacy:ParticleBurst2|ParticleBurst2]]
   +- [[Legacy:PawnTeleportEffect|PawnTeleportEffect]]
   |    +- [[Legacy:QueenTeleportEffect|QueenTeleportEffect]]
   |    +- [[Legacy:UTTeleportEffect|UTTeleportEffect]]
   +- [[Legacy:PlasmaCap|PlasmaCap]]
   |    +- [[Legacy:PlasmaHit|PlasmaHit]]
   +- [[Legacy:PlasmaEffect|PlasmaEffect]]
   +- [[Legacy:QueenShield|QueenShield]]
   +- [[Legacy:RedeemerTrail|RedeemerTrail]]
   +- [[Legacy:ReSpawn|ReSpawn]]
   +- [[Legacy:RingExplosion|RingExplosion]]
   |    +- [[Legacy:RingExplosion2|RingExplosion2]]
   |    +- [[Legacy:RingExplosion3|RingExplosion3]]
   |    +- [[Legacy:RingExplosion4|RingExplosion4]]
   |    +- [[Legacy:WaterRing|WaterRing]]
   +- [[Legacy:RocketTrail|RocketTrail]]
   +- [[Legacy:Shield|Shield]]
   +- [[Legacy:ShieldBeltEffect|ShieldBeltEffect]]
   +- [[Legacy:ShockBeam|ShockBeam]]
   |    +- [[Legacy:ShockBeam2|ShockBeam2]]
   +- [[Legacy:ShockRifleWave|ShockRifleWave]]
   +- [[Legacy:ShockWave|ShockWave]]
   +- [[Legacy:SmallSpark|SmallSpark]]
   |    +- [[Legacy:SmallSpark2|SmallSpark2]]
   |    +- [[Legacy:Spark3|Spark3]]
   |         +- [[Legacy:Spark32|Spark32]]
   |         +- [[Legacy:Spark33|Spark33]]
   |         +- [[Legacy:Spark34|Spark34]]
   |         +- [[Legacy:Spark35|Spark35]]
   +- [[Legacy:SmokeGenerator|SmokeGenerator]]
   |    +- ShortSmokeGen
   +- [[Legacy:SmokeHose|SmokeHose]]
   +- [[Legacy:SmokeHoseDest|SmokeHoseDest]]
   +- [[Legacy:SmokePuff|SmokePuff]]
   +- [[Legacy:SmokeTrail|SmokeTrail]]
   +- [[Legacy:SparkBit|SparkBit]]
   +- [[Legacy:Sparks|Sparks]]
   +- [[Legacy:SpikeExplosion|SpikeExplosion]]
   +- [[Legacy:Splash|splash]]
   +- [[Legacy:SpriteExplosion|SpriteExplosion]]
   +- [[Legacy:Supershockbeam|supershockbeam]]
   +- [[Legacy:Tazerexplosion|Tazerexplosion]]
   +- [[Legacy:TinyBurst|TinyBurst]]
   +- [[Legacy:TranslocGlow|TranslocGlow]]
   |    +- [[Legacy:TranslocBLue|TranslocBLue]]
   |    +- [[Legacy:TranslocGold|TranslocGold]]
   |    +- [[Legacy:TranslocGreen|TranslocGreen]]
   +- [[Legacy:TranslocOutEffect|TranslocOutEffect]]
   +- [[Legacy:TSmoke|TSmoke]]
   +- [[Legacy:UTBlood2|UTBlood2]]
   |    +- [[Legacy:UTBloodBurst|UTBloodBurst]]
   |    |    +- [[Legacy:UTBloodHit|UTBloodHit]]
   |    |         +- [[Legacy:UTBigBloodHit|UTBigBloodHit]]
   |    +- [[Legacy:UTBloodTrail|UTBloodTrail]]
   +- [[Legacy:UTBloodDrop|UTBloodDrop]]
   +- [[Legacy:UTGreenBlob|UTGreenBlob]]
   +- [[Legacy:UTRingExplosion|UTRingExplosion]]
   |    +- [[Legacy:UTComboRing|UTComboRing]]
   |    |    +- [[Legacy:UTRingExplosion4|UTRingExplosion4]]
   |    +- [[Legacy:UTRingExplosion3|UTRingExplosion3]]
   |    +- [[Legacy:UTRingExplosion5|UTRingExplosion5]]
   |    +- [[Legacy:Utsuperring|utsuperring]]
   |         +- [[Legacy:UTSuperring2|UTSuperring2]]
   +- [[Legacy:UTShieldBeltEffect|UTShieldBeltEffect]]
   +- [[Legacy:UTShortSmokeGen|UTShortSmokeGen]]
   +- [[Legacy:UTSpark|UTSpark]]
   +- [[Legacy:UTSparks|UTSparks]]
   +- [[Legacy:UTSmokeTrail|UTSmokeTrail]]
   |    +- [[Legacy:UTLightSmokeTrail|UTLightSmokeTrail]]
   +- [[Legacy:UTTeleEffect|UTTeleEffect]]
   +- [[Legacy:WaterImpact|WaterImpact]]

----

'''ProjectX:''' we could do with some screenshots for each page showing what each effect does, we could also do with adding the properties that need to be set and how to work them

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2917</id>
      <timestamp>2006-04-06T21:05:56Z</timestamp>
      <contributor>
        <ip>Customer183-237.iplannetworks.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Effects (Package: Engine)}}

Effects are actors in UT that produce various, well, effects. You can add them into your level just the way you would with a [[Legacy:Decoration (UT)|Decoration (UT)]], and then trigger them to make them produce their effect. Note that a lot of these effects are used by the game for things like weapons hits and players gibbing, so there may only be a few Effects that are useful in mapping.

See [[Legacy:Effects|Effects]] for the UT2003 version of this page.

==Known Subclasses==
 [[Legacy:Effects (UT)|Effects (UT)]]
   +- [[Legacy:AnimSpriteEffect|AnimSpriteEffect]]
   |    +- [[Legacy:DefaultBurst|DefaultBurst]]
   |    |    +- [[Legacy:DefaultBurstAlt|DefaultBurstAlt]]
   |    +- [[Legacy:EnergyBurst|EnergyBurst]]
   |    +- [[Legacy:FlameExplosion|FlameExplosion]]
   |    +- [[Legacy:RipperPulse|RipperPulse]]
   |    +- [[Legacy:ShockExplo|ShockExplo]]
   |    +- [[Legacy:SmokeColumn|SmokeColumn]]
   |    +- [[Legacy:SmokeExplo|SmokeExplo]]
   |    +- [[Legacy:SpriteBallExplosion|SpriteBallExplosion]]
   |    |    +- [[Legacy:SilentBallExplosion|SilentBallExplosion]]
   |    |    +- [[Legacy:SpriteBallChild|SpriteBallChild]]
   |    |    +- [[Legacy:SpriteBlueExplo|SpriteBlueExplo]]
   |    |         +- [[Legacy:SpriteGreenE|SpriteGreenE]]
   |    |         +- [[Legacy:SpriteOrangeE|SpriteOrangeE]]
   |    |         +- [[Legacy:SpriteRedE|SpriteRedE]]
   |    |         +- [[Legacy:SpriteYellowE|SpriteYellowE]]
   |    +- [[Legacy:SpriteLightning|SpriteLightning]]
   |    +- [[Legacy:SpriteSmokePuff|SpriteSmokePuff]]
   |    +- [[Legacy:UTFlameExplosion|UTFlameExplosion]]
   |    +- [[Legacy:UTSpriteBallExplosion|UTSpriteBallExplosion]]
   |    +- [[Legacy:UTSpriteSmokePuff|UTSpriteSmokePuff]]
   |    |    +- [[Legacy:BigBlackSmoke|BigBlackSmoke]]
   |    |    +- [[Legacy:BlackSmoke|BlackSmoke]]
   |    |    +- [[Legacy:BloodPuff|BloodPuff]]
   |    |    +- [[Legacy:GreenSmokePuff|GreenSmokePuff]]
   |    |    |    +- [[Legacy:GreenBloodPuff|GreenBloodPuff]]
   |    |    |    +- [[Legacy:GreenGelPuff|GreenGelPuff]]
   |    |    +- [[Legacy:RisingSpriteSmokePuff|RisingSpriteSmokePuff]]
   |    |    +- [[Legacy:WallHitEffect|WallHitEffect]]
   |    |    |    +- [[Legacy:HeavyWallHitEffect|HeavyWallHitEffect]]
   |    |    |    +- [[Legacy:LightWallHitEffect|LightWallHitEffect]]
   |    |    +- [[Legacy:UTFlameExplosion|UTFlameExplosion]]
   |    |    +- [[Legacy:UTSpriteBallExplosion|UTSpriteBallExplosion]]
   |    |    |    +- [[Legacy:SuperShockExplo|SuperShockExplo]]
   |    |    |    +- [[Legacy:UTSpriteBallChild|UTSpriteBallChild]]
   |    |    +- [[Legacy:UTSpriteSmokePuff|UTSpriteSmokePuff]]
   |    |         +- [[Legacy:UTBlackSmoke|UTBlackSmoke]]
   |    |         +- [[Legacy:UTBloodPuff|UTBloodPuff]]
   |    |         |    +- [[Legacy:UTBigBloodPuff|UTBigBloodPuff]]
   |    |         +- [[Legacy:UTGreenBloodPuff|UTGreenBloodPuff]]
   |    |         +- [[Legacy:UTGreenGelPuff|UTGreenGelPuff]]
   |    +- [[Legacy:WarExplosion|WarExplosion]]
   |         +- [[Legacy:WarExplosion2|WarExplosion2]]
   +- [[Legacy:ArrowSpawner|ArrowSpawner]]
   +- [[Legacy:BallExplosion|BallExplosion]]
   +- [[Legacy:Blood2|Blood2]]
   |    +- [[Legacy:BloodBurst|BloodBurst]]
   |    +- [[Legacy:BloodSpray|BloodSpray]]
   |    |    +- [[Legacy:GreenBloodSpray|GreenBloodSpray]]
   |    +- [[Legacy:BloodSpurt|BloodSpurt]]
   |    +- [[Legacy:BloodTrail|BloodTrail]]
   +- [[Legacy:BloodPool|BloodPool]]
   +- [[Legacy:BoulderSpawner|BoulderSpawner]]
   +- [[Legacy:Bubble|Bubble]]
   +- [[Legacy:Bubble1|Bubble1]]
   +- [[Legacy:BulletHit|BulletHit]]
   +- [[Legacy:BulletImpact|BulletImpact]]
   |    +- [[Legacy:UTWallhit|UTWallhit]]
   |         +- [[Legacy:ImpactMark|ImpactMark]]
   |         +- [[Legacy:SawHit|SawHit]]
   |         +- [[Legacy:UTHeavyWallHitEffect|UTHeavyWallHitEffect]]
   |         +- [[Legacy:UTLightWallHitEffect|UTLightWallHitEffect]]
   +- [[Legacy:CannonMuzzle|CannonMuzzle]]
   +- [[Legacy:Carflash|Carflash]]
   +- [[Legacy:Chip|Chip]]
   +- [[Legacy:ChunkTrail|ChunkTrail]]
   +- [[Legacy:DExplosion|DExplosion]]
   +- [[Legacy:EnhancedItems|EIEffects]] ([[Legacy:EnhancedItems|EnhancedItems]])
   |    +- PlayerShellEffect
   |         +- PlayerShell
   |         +- PlayerSphere
   +- [[Legacy:Electricity|Electricity]]
   +- [[Legacy:EnhancedRespawn|EnhancedRespawn]]
   +- [[Legacy:ExplodingWall|ExplodingWall]]
   |    +- BreakingGlass
   +- [[Legacy:ExplosionChain|ExplosionChain]]
   +- [[Legacy:FatRing|FatRing]]
   +- [[Legacy:Flame|Flame]]
   +- [[Legacy:FlameBall|FlameBall]]
   +- [[Legacy:GreenBlob|GreenBlob]]
   +- [[Legacy:MercFlare|MercFlare]]
   +- [[Legacy:MortarSpawner|MortarSpawner]]
   +- [[Legacy:ParticleBurst|ParticleBurst]]
   |    +- [[Legacy:ParticleBurst2|ParticleBurst2]]
   +- [[Legacy:PawnTeleportEffect|PawnTeleportEffect]]
   |    +- [[Legacy:QueenTeleportEffect|QueenTeleportEffect]]
   |    +- [[Legacy:UTTeleportEffect|UTTeleportEffect]]
   +- [[Legacy:PlasmaCap|PlasmaCap]]
   |    +- [[Legacy:PlasmaHit|PlasmaHit]]
   +- [[Legacy:PlasmaEffect|PlasmaEffect]]
   +- [[Legacy:QueenShield|QueenShield]]
   +- [[Legacy:RedeemerTrail|RedeemerTrail]]
   +- [[Legacy:ReSpawn|ReSpawn]]
   +- [[Legacy:RingExplosion|RingExplosion]]
   |    +- [[Legacy:RingExplosion2|RingExplosion2]]
   |    +- [[Legacy:RingExplosion3|RingExplosion3]]
   |    +- [[Legacy:RingExplosion4|RingExplosion4]]
   |    +- [[Legacy:WaterRing|WaterRing]]
   +- [[Legacy:RocketTrail|RocketTrail]]
   +- [[Legacy:Shield|Shield]]
   +- [[Legacy:ShieldBeltEffect|ShieldBeltEffect]]
   +- [[Legacy:ShockBeam|ShockBeam]]
   |    +- [[Legacy:ShockBeam2|ShockBeam2]]
   +- [[Legacy:ShockRifleWave|ShockRifleWave]]
   +- [[Legacy:ShockWave|ShockWave]]
   +- [[Legacy:SmallSpark|SmallSpark]]
   |    +- [[Legacy:SmallSpark2|SmallSpark2]]
   |    +- [[Legacy:Spark3|Spark3]]
   |         +- [[Legacy:Spark32|Spark32]]
   |         +- [[Legacy:Spark33|Spark33]]
   |         +- [[Legacy:Spark34|Spark34]]
   |         +- [[Legacy:Spark35|Spark35]]
   +- [[Legacy:SmokeGenerator|SmokeGenerator]]
   |    +- ShortSmokeGen
   +- [[Legacy:SmokeHose|SmokeHose]]
   +- [[Legacy:SmokeHoseDest|SmokeHoseDest]]
   +- [[Legacy:SmokePuff|SmokePuff]]
   +- [[Legacy:SmokeTrail|SmokeTrail]]
   +- [[Legacy:SparkBit|SparkBit]]
   +- [[Legacy:Sparks|Sparks]]
   +- [[Legacy:SpikeExplosion|SpikeExplosion]]
   +- [[Legacy:Splash|splash]]
   +- [[Legacy:SpriteExplosion|SpriteExplosion]]
   +- [[Legacy:Supershockbeam|supershockbeam]]
   +- [[Legacy:Tazerexplosion|Tazerexplosion]]
   +- [[Legacy:TinyBurst|TinyBurst]]
   +- [[Legacy:TranslocGlow|TranslocGlow]]
   |    +- [[Legacy:TranslocBLue|TranslocBLue]]
   |    +- [[Legacy:TranslocGold|TranslocGold]]
   |    +- [[Legacy:TranslocGreen|TranslocGreen]]
   +- [[Legacy:TranslocOutEffect|TranslocOutEffect]]
   +- [[Legacy:TSmoke|TSmoke]]
   +- [[Legacy:UTBlood2|UTBlood2]]
   |    +- [[Legacy:UTBloodBurst|UTBloodBurst]]
   |    |    +- [[Legacy:UTBloodHit|UTBloodHit]]
   |    |         +- [[Legacy:UTBigBloodHit|UTBigBloodHit]]
   |    +- [[Legacy:UTBloodTrail|UTBloodTrail]]
   +- [[Legacy:UTBloodDrop|UTBloodDrop]]
   +- [[Legacy:UTGreenBlob|UTGreenBlob]]
   +- [[Legacy:UTRingExplosion|UTRingExplosion]]
   |    +- [[Legacy:UTComboRing|UTComboRing]]
   |    |    +- [[Legacy:UTRingExplosion4|UTRingExplosion4]]
   |    +- [[Legacy:UTRingExplosion3|UTRingExplosion3]]
   |    +- [[Legacy:UTRingExplosion5|UTRingExplosion5]]
   |    +- [[Legacy:Utsuperring|utsuperring]]
   |         +- [[Legacy:UTSuperring2|UTSuperring2]]
   +- [[Legacy:UTShieldBeltEffect|UTShieldBeltEffect]]
   +- [[Legacy:UTShortSmokeGen|UTShortSmokeGen]]
   +- [[Legacy:UTSpark|UTSpark]]
   +- [[Legacy:UTSparks|UTSparks]]
   +- [[Legacy:UTSmokeTrail|UTSmokeTrail]]
   |    +- [[Legacy:UTLightSmokeTrail|UTLightSmokeTrail]]
   +- [[Legacy:UTTeleEffect|UTTeleEffect]]
   +- [[Legacy:WaterImpact|WaterImpact]]

----

'''ProjectX:''' we could do with some screenshots for each page showing what each effect does, we could also do with adding the properties that need to be set and how to work them

----

[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy Class Tree]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ehendrikd</title>
    <id>1201</id>
    <revision>
      <id>3120</id>
      <timestamp>2005-05-26T04:27:12Z</timestamp>
      <contributor>
        <ip>Mth-fgw.ballarat.edu.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">page about me :)

working on a long-term, when-i-have-the-time 1st person total conversion, have set up a [http://www.planetjeff.net/ut/CaveUT.html CaveUT] and am also looking into post grad research in implementing intelligent agents in ut using the BotAPI.

created [[Legacy:CaveUT|CaveUT]] page

;interests :
* programming
* motorsport
* juggling

;web links : 
* home page [http://www.geocities.com/ehendrikd http://www.geocities.com/ehendrikd]
* there [http://www.there.com http://www.there.com]
* toymods [http://www.toymods.org.au http://www.toymods.org.au]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3121</id>
      <timestamp>2005-05-26T03:42:31Z</timestamp>
      <contributor>
        <ip>Mth-fgw.ballarat.edu.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">page about me :)

working on a long-term, when-i-have-the-time 1st person total conversion, have set up a [http://www.planetjeff.net/ut/CaveUT.html CaveUT] and am also looking into post grad research in implementing intelligent agents in ut using the BotAPI.

;interests :
* programming
* motorsport
* juggling

;web links : 
* home page [http://www.geocities.com/ehendrikd http://www.geocities.com/ehendrikd]
* there [http://www.there.com http://www.there.com]
* toymods [http://www.toymods.org.au http://www.toymods.org.au]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Eightball</title>
    <id>28849</id>
    <revision>
      <id>42776</id>
      <timestamp>2010-03-30T16:18:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte</title>
    <id>4767</id>
    <revision>
      <id>10745</id>
      <timestamp>2008-04-02T05:45:03Z</timestamp>
      <contributor>
        <username>Elmuerte</username>
        <id>4</id>
      </contributor>
      <comment>[[Legacy:El Muerte]] moved to [[User:Elmuerte]]</comment>
      <text xml:space="preserve">#REDIRECT [[User:Elmuerte]]</text>
    </revision>
    <revision>
      <id>11641</id>
      <timestamp>2008-04-29T09:05:30Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>removing double redirect</comment>
      <text xml:space="preserve">#REDIRECT [[User:ElMuerte]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS</title>
    <id>1138</id>
    <revision>
      <id>2989</id>
      <timestamp>2004-03-03T08:23:42Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:El Muerte|El Muerte]]</text>
    </revision>
    <revision>
      <id>2990</id>
      <timestamp>2004-03-02T13:44:23Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>no worries.</comment>
      <text xml:space="preserve">http://el-muerte.student.utwente.nl/signature.gif

==Basic Info==
; Nick : El Muerte
; Real name : Michiel Hendriks
; E-Mail : elmuerte @ drunksnipers.com
; Homepage : [http://www.drunksnipers.com The Drunk Snipers]
; Other pages : [http://www.magicball.net Magicball Network] &lt;br /&gt;[http://www.unrealadmin.org UnrealAdmin]
; IRC : on '''EFNet''' as '''ElMuerte''' in channels: '''#tds''' , '''#lba''' &lt;br /&gt;on '''ETG''' as '''ElMuerte''' in channels: '''#unrealscript''' , '''#beyondunreal''', '''#unrealwiki''' &lt;br /&gt;on '''IRCNet''' as '''ElMuerte''' in channels: ''private'' &lt;br /&gt;on '''QuakeNet''' as '''El_Muerte_[TDS]''' in channels: '''#unrealadmin'''
; Developer Journal : [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]
; CVS Web Repository : http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/
; CVS Root for anonymous access : &lt;nowiki&gt;:pserver:anonymous@el-muerte.student.utwente.nl:/usr/local/cvsroot/UT2003&lt;/nowiki&gt;

==History/Bio==

I'm a Computer Science student at the [http://www.utwente.nl University of Twente], I love creating stuff like programs and webpages. Lego&amp;trade; rocks.

I enjoy playing games. I prefer Action\Adventure games, the [http://www.magicball.net Little Big Adventure series] are my favorite games. [[Legacy:Unreal|Unreal]] was the first [[Legacy:Unreal Engine|Unreal Engine]] game I played, I realy enjoyed that game.

I started Unreal Scripting when [[Legacy:Unreal Tournament|Unreal Tournament]] came out. Me and [http://www.drunksnipers.com my friends] started running some dedicated servers and we needed some adjustments to the server, that's why I started. About all things I wrote are server only stuff, never written something to extend the game play.

Besides UnrealScript I also program in other languages like: Delphi (Object Pascal), C\C++, [[Legacy:Perl|Perl]], [[Legacy:PHP|PHP]]

==Creations==

===UT Creations===

These float around somewhere, for example on http://www.drunksnipers.com/services/ut/ (bottom of the page)

===UT2003 Creations===

====Mozilla Sidebar====

If you have Mozilla or Netscape 6/7 you can install a sidebar that will give you the ability to display server information in your browser. Go [http://www.drunksnipers.com/services/ut/sidebar?install here to install] this sidebar.

====PlayerJoinDumpSE====

Just like the PlayerJoinDump for UT(1) will this server add-on dump player IP addresses in the log when they join the server. This is usefull when you get abuse emails about certain users and want to ban them from the server.

http://www.drunksnipers.com/services/ut/ut2003/playerjoindump

====ServerAdsSE====

Another remake of a great UT server add-on. ServerAdsSE gives you the ability to display messages/advertisements on the server (in the chat console, or on the middle of the screen). One of the biggest new features of this version is the ability to specify an URL where ServerAdsSE should download the latest messages.

http://www.drunksnipers.com/services/ut/ut2003/ServerAdsSE

====UT2003 Compress====

The UT2003 version of UTCompreZ, this tool will make UZ compression easier to handle. Just create a list of files to compress, hit the &quot;compress&quot; button and go to bed, the next morning everything will be done.

http://www.drunksnipers.com/services/ut/ut2003/ut2003compress

====ServQuery====

ServQuery is a fix for UT2003 servers. It fixes and extends the GameSpy Protocol. ServQuery will fix the backslash bug in the player names and ServQuery will add a new command to retreive Team information.

http://www.drunksnipers.com/services/ut/ut2003/servquery

====LocalStats====

LocalStats will create log files which can be converted to statistics just like Epic's ut2003stats.epicgames.com LocalStats is a server actor so it will not show up in the mutator list or requires client downloads. Also with LocalStats you can still use the global stats.

http://www.drunksnipers.com/services/ut/ut2003/localstats

====UTelAdSE &amp; TitanIRCd====

UTelAdSE is a telnet administration server that will allow you do administer your UT2003 server using a telnet client.

http://www.drunksnipers.com/services/ut/ut2003/UTelAdSE

====wUtils====

UT2003 has a nice set of methods and structures defined in XGame.xUtils, but there are more common used methods and don't need to be rewritten every time somebody needs them. That's why I've started wUtils to create a package containing another set of usefull methods.

[[Legacy:WUtils|WUtils]]

====BullShit====

BullShit is a server actor that will make the bot in a bot game more life like. Bot will speak when they kill or get killed, they will also respond on things other players say.

http://www.drunksnipers.com/services/ut/ut2003/bullshit

====ConfigArena====

Just a little fix for the Arena mutator. This mutator can be configured via the webadmin

http://www.drunksnipers.com/services/ut/ut2003/configarena

====ChatFilter====

ChatFilter is a server add-on to clean up the chatting on a server. ChatFilter has the power to reduce spamming on a server, it can also filter bad words from the line. On bad behavior the player will get a score assigned on a defined level actions can taken against the player

http://www.drunksnipers.com/services/ut/ut2003/chatfilter

====LibHTTP====

[[Legacy:LibHTTP|LibHTTP]] is a general puprose library for accessing data on webservers. It has support for Cookies, basic authentication, proxies and transparent redirecting (e.g. will automatically follow a redirect)

====Marky Mutator====

Epic's Mark Rein on you screen whenevery you kill three enemies in a row. Isn't that what you've always wanted.

Version 2 includes new characters like the 2nd dumbest creature in the universe (Dopefish) and a weird white bunny named Cliff

http://www.drunksnipers.com/services/ut/ut2003/marky

====Bad Adrenaline====

This mutator will corrupt certain adrenaline pills, if you pick up one of these corrupted adrenaline pills you will suffer from strange side effects.

http://www.drunksnipers.com/services/ut/ut2003/badadrenaline

====Capture the Beer====

An excelent beer game. It's based on CTF, but instead of flags you have to capture a beer crate. But time is important, while you are carrying the crate you will consume the beer until you're out. Ofcourse the beer will have it's effect on you.

http://www.drunksnipers.com/services/ut/ut2003/ctb

==Docs and stuff==

====UnrealWiki contributions====

Here are the wiki pages I wrote/started:
* [[Legacy:AutoLoader/Example|AutoLoader/Example]]
* [[Legacy:BruteForce|BruteForce]] &amp;ndash; and the subdocuments
* [[Legacy:Creating A WebApplication|Creating A WebApplication]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/GQP]]
* [[Legacy:LibHTTP|LibHTTP]]
* [[Legacy:HttpCookies|HttpCookies]]
* [[Legacy:HttpSock|HttpSock]]
* [[Legacy:HttpUtil|HttpUtil]]
* [[Legacy:MaskedCompare|MaskedCompare]]
* [[Legacy:Mod_Ideas/KillingSpree|Mod_Ideas/KillingSpree]]
* [[Legacy:Modular Mod|Modular Mod]]
* [[Legacy:RSA|RSA]]
* [[Legacy:Sessions|Sessions]]
* [[Legacy:Tokenizer|Tokenizer]]
* [[Legacy:QueryHandler|QueryHandler]]
* [[Legacy:UnCodeX|UnCodeX]]
* [[Legacy:UnrealScript Grammar|UnrealScript Grammar]]
* [[Legacy:UT Server Query|UT Server Query]]
* [[Legacy:WebDownload|WebDownload]]
* [[Legacy:WUtils|WUtils]]

* Created the UnrealWiki mozilla sidebar ([[Legacy:Wiki_Integration/Browser_Sidebar|Wiki_Integration/Browser_Sidebar]])

====UnrealWiki pages to be written====
* [[Legacy:UT2003 Server Query|UT2003 Server Query]]

====UT2003 Query protocol====

UT2003 uses a new protocol to query the servers for information, I've worked out this protocol and wrote a document about it, you can view it [http://unreal.student.utwente.nl/UT2003-queryspec.html here]

====UT2003 Mirror Download Service====

This page provides transparent mirror redirections to mirrors that offer the file you requested. The main advantage for users is that they only have to check one location to find a correct download. The main advantage for file mirrors is that the downloads load will be equally balanced over all mirrors (mirrors are selected using the round robin principle). Every hour all mirrors will be checked if anything has changed.

http://unreal.student.utwente.nl/mirror/

====UT2003 Class Reference====

I've created a HTML Help file containing a full class reference for UT2003. It looks similar to what UnDox produces, but contains more information about classes. It does not however contain the sources of each class, I didn't realy find this usefull.

=====Latest builds=====

Covering UT2003 builds: 2107, 2136, 2166

[http://www.drunksnipers.com/files/ut2003/UT2003ScriptRef-125.zip HTML Help class reference] 846KB (only the reference)

[http://www.drunksnipers.com/files/ut2003/UT2003ScriptRef-125full.zip HTML Help class reference full version] 2.33MB (this  includes syntax highlighted source files)

=====Old versions=====

[http://www.drunksnipers.com/files/ut2003/UT2003ScriptRef-124.zip 2107, 2136, 2166] 846KB (only the reference)

[http://www.drunksnipers.com/files/ut2003/UT2003ScriptRef-124full.zip 2107, 2136, 2166 full version] 2.33MB (this  includes syntax highlighted source files)

[http://www.drunksnipers.com/files/ut2003/UT2003ScriptRef-112.zip 2107, 2136] with version info

[http://www.drunksnipers.com/files/ut2003/UT2003ScriptRef.zip 2136] 

====UnCodeX====

[[Legacy:UnCodeX|UnCodeX]] is a combination between UClasses and UnDox. UnCodeX can create a class tree from the UScript source and generate HTML documentation from it. But it can do much more than that.

It's somewhat a replacement for this ''UT2003 Class Reference'' above.

----

'''EntropicLqd:''' I'm fiddling with your code at the moment to make it work as I want for the UT2004 interrogation.  Are you interested in seeing the final results once I've finished with it?

'''El Muerte TDS:''' I'm always interested in seeing stuff, specially when it's based on my old work

'''EntropicLq:''' OK.  I'll make sure you are aware of where to get the source code once I've finished fiddling with it.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11642</id>
      <timestamp>2008-04-29T09:05:56Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>removing double redirect</comment>
      <text xml:space="preserve">#REDIRECT [[User:ElMuerte]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS/Developer Journal</title>
    <id>1146</id>
    <revision>
      <id>3006</id>
      <timestamp>2004-03-03T08:26:56Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:El Muerte/Developer Journal|El Muerte/Developer Journal]]</text>
    </revision>
    <revision>
      <id>3007</id>
      <timestamp>2004-01-15T11:07:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Journal History==
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History]]
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 2]]

==14-7-2003==

Long time no entry. I'm going to switch the layout of my dev journal to a per day basis without sorting on project, may be much more readable and it'll allow me to rant on about other things during my developing.

So, the MSU Phase 1 is closing soon. I'm really intresting to see what people have turned in, at least I hope they are going to publish a list of all accepted entries. I wonder if UnCodeX has a chance in the Tool's section, I don't think my other mods have much chance in winning something.

But it's not like I did those projects for the money, I think people creating mods/etc. for the money will only produce crappy mods/etc. because they haven't poured their heart into the project. You can't see very well will dollar (or euro, or whatever) signs in your eyes.

Grrr... I really hoped by this time I was able to log into the VPN again, that's why I started this log entries because the f#cking VPN keeps refusing connections. I really hate it because now I can't continue with my work.

==16-7-2003==

Damn it's hot. Both the outside temperature and my coding speed have resulted in the melting of my workstation's keyboard. It looks like a Dali painting ;)

Anyway, it is damn hot. But that doesn't matter much, the problem is that it's still hot at night. And since it will remain hot for a long time I've shiften my day schedule. Usualy I'm awake from 9:00 till 2:00/3:00. But since it's much cooler in the morning I've decided to get up at 7:30. 

I really wish I had a laptop so I could sit outside and keep working, but sure you can't have everything.

So MSU phase 1 has finally been closed, I wonder how long it'll take before we'll get to see a listing of all  accepted mods.

==17-6-2003==

GUI designing is damn awefull, specially when you want too much stuff into a single screen. What's the best way to do it, how can you split it up into seperate windows, etc...

And ofcourse, you always have to keep in mind to create dynamic layouts, you don't want to hard code every GUI object when it's not needed. The real pain in dynamic layouts is that you can't simply switch to GUI editor mode to change the layout, copy and paste the new dimensions. You have to tweak your formula until it's correct. And evertytime you have to recompile and test it again.

With designing GUIs you will always run into the problem what the best layout it. Because it has to fit on the screen, but also remain functional and look good. The looking good part is something for the art department. As for designing the layout, you could just create the components and tweak them inside the engine but this is slow. A good alternative is to use a presentation program (like MS PowerPoint) to design the layout. Simply create all the components inside PowerPoint (just use rectangles of diffirent colors for the various components that don't have an existing power point representation) and drag them around until you find a good layout. Save it, print it, ... Now you have a good template on how to position the items. All you have to do now is create the components in UnrealScript, launch the game and tweak the positions using the in-game GUI editor.

==30-6-2003==

Finishing up the first release of [[Legacy:LibHTTP|LibHTTP]]. LibHTTP is a well written general purpose library for accessing data on webservers. Since this is something a lot of people want in their mod I decided it was a good idea to write one well written open-source free to use library that will do it for you.

This way mod developers can use their time on their mod instead of writing yet another class for downloading webpages.

I hope other mod developers take up this idea to create open source libraries for common operations. This way there will be more well developed building blocks to use. Which will have a result in more high quality mods available.

==4-8-2003==

It must be summer. And you know why, my damn mouse is sticky, nothing on TV, no great games released.

So I decided to play Unreal again. It's still a great game to play, the large outdoor maps and the mysterious areas makes it a great game. It's pretty damn difficult in the highest difficult setting, specially when you are in tight rooms with a lot of Skaarj (Damn ISV Kran decks).

Still haven't played Unreal 2 a lot, don't know why. Maybe because it's a bit too heavy for my machine.

==29-8-2003==

A bit silent on my public side. Just too busy with things I can't talk about yet.

On the other side. Tron 2.0 is a pretty cool game. They really respected the Tron world as defined in the first movie, basic coloring with nice glow effects. Ofcourse it looks a bit more advanced because the current computer are way more advanced. If you liked the Tron movie you might want to check this one out. 

==4-9-2003==

Well I started on a complete rewrite of my UTelAdSE system. The new design uses a central daemon that can have multiple interfaces to connect to, so it's even more modular that the previous design. Also the authentication has been split off into a seperate object. This way it's possible to change the authentication to use a diffirent system.

The telnet interface is almost done, the most important part the terminal handling is done and it's much better than the previous one. You have the same commandline powers as you have with bash, the previous implementation was very limited (like the DOS prompt).

Also started on the IRCd implementation. I'm complety changing this implementation, I'm going to design it so that you could link various servers into a network. This network would consist out of at least one real IRCd when that the UT servers will link to. This real IRCd has access to all channels servered by the various UT servers linked to it. The IRCd that runs within the engine only has access to the local channels, this is to reduce the load. The unreal IRC server will netsplit on every map (ofcourse).

As for the applications/commands, not much has changed from the previous system. I still use a dynamic array for calling the commands with arguments. However I did change it a bit, commands have to be registered in the daemon, this way I can look up what application object has the requested command. This reduces the function calls needed to call the right command.

==8-9-2003==

Man what does the IRC protocol suck. Just the basic implementation of various commands sucks.

Anyway, ordered me a nice Toshiba SatelitePro m10 laptop today so I can keep on coding where ever I am.

====Comments====

'''Dante:''' Yeah IRC protocol just sucks. I tried to write like 3 IRC clients before, I always stopped at a point when I just got annoyed ;)

'''El Muerte TDS:''' the server part is much worse than the clients part

'''Dante:''' Depends how customizable you want the client to be. I don't think the server part is much more difficult.

'''El Muerte TDS:''' IRC clients are dumb, the server has to figure out everything, and that adds a lot of administation. And it's not that it's more difficult, it's just that it's more of a pain to implement.

'''Dante:''' Yeah clients are kind of dumb, the server still isn't much more clever. Basically it does nothing more than dispatching. It doesn't care for ctcp stuff and such things. Administration is handled thru bots (which are clients) like chanserv. The main pain in writing a server might be security.

'''El Muerte TDS:''' well the server has to keep track of what channels there are, who is in that channel. But you've also got to keep track of the server relays if you have more than one server. This server relaying is hacked into the protocol, wel at least it looks like that.

==10-9-2003==

Almost completely redone the Marky Mutator, the initial release didn't even work online, that's what you get when you ship when it compiles late at night ;). Anyway, the current version is pretty much done, it supports additional pop-up faces, by default it has Mark Rein, CliffyBunny and the Dopefish. I'm waiting for a response from Mark Rein before I will ship this version. I asked Mark Rein if he could record him saying &quot;Two Weeks&quot; so I could use that when his head pops up ;)

Also yesterday my laptop arrived (damn quick), it's a really nice toy :D

==24-9-2003==

Yahoo the evil european software patent directive has been accepted. Start saving money for your first patent infringement.

'''Foxpaw:''' What's that about? I've never heard of this software patent directive?

'''El Muerte TDS:''' Read [http://yro.slashdot.org/article.pl?sid=03/09/24/1253227&amp;mode=thread&amp;tid=155&amp;tid=185&amp;tid=99 this /. article]. Be sure to check out the linked articles for more details.

'''Foxpaw:''' I still don't get it.. how does this &quot;software patent&quot; differ from the IP protection that you already have? Or does it allow people to patent a software notion like anti-aliasing?

'''El Muerte TDS:''' with patents you can prevent people from inventing the same you did, if you own a patent somebody else may not build the same unless it licenses your patent (this protects your invention, but also kills free enterprise). For example, there was a patent on the LZW compression algorithm, LZW is required for GIF files, so you had to license the LZW algorithm before you could write a program that creates GIF files (USA only). This patent is correctly assigned, it does protect the invention and research. But the new software patent possible in Europe (you could always patent these but they were not backed up by law) allows you to patent non-sence (already possible in the USA).

A few examples of non-sence patents: Amazon's &quot;One Click Buy System&quot;, or the recently assigned patent for Microsoft that describes the usage of cookies to keep track of a user id and using that info to look up the user preferences for a web services (a lot of meta sites, online stores and forums use this &quot;technology&quot;). [http://swpat.ffii.org/patents/samples/index.en.html an larger list of interesting patents].

You can't request a patent on inventions already used a lot (&quot;prior art&quot;). Patents are just evil, they used to protect inventors from large companies, but it's now used buy large companies to prevent some compitition and earn money.

And now for the answer to your question, IP is for the your creation AS-IS, not the technique. Here's an bad example (below is ofcourse not possible):

&lt;uscript&gt;
// to increase the value of a number by one:
i = i + 1;   // your creation, people may not use this AS IS

i = 1 + i;   // not the same as yours, but a patent prevents you from using it
i++;         // if you had a patent this was not allowed either
&lt;/uscript&gt;

==20-10-2003==

Screw modelers, all I wanted was a pretty simple static mesh of a beer bottle crate. No free public assets for that and nobody remotely interested in helping me out. So I decided to mess around with Maya myself. Worked out pretty well, I managed to create a 7x5x4 cube (it's harder than it sounds ;) ), and mapped by texture on it. And it looks quite well. Except that all faces of the cube are in-side-out ;)

Ahh well, easy fix (I now know how to do that). Capture The Beer is almost complete, only need to replace a few more pieces of text, so something with the announcer. And double check if it works online.

==10-11-2003==

As you may have noticed I pick-ed up development of [[Legacy:UnCodeX|UnCodeX]] again. I've already made some cosmetic changes. Currently I'm working on an major improvement of the HTML output. I'm focusing even more on the JavaDoc style. Most things don't change much except for the class details, they will now be split up into a summary and a detail view. I tried to put in to much data in the previous output. Also I've fixed the templating engine to create seperate directories for packages. Having a lot of files in a single directory is a bad idea in general, and with UT2003 2225 it generated over 5000 files. Now each package will get 2 directires: ./packagename and ./Source_packagename.

For a preview of the new html output, check here: http://unreal.elmuerte.com/uncodex

==11-11-2003==

I've come to an interesting point in the html output changes. I have to change some majors things, I could just add the new code and leave the old intact, or I could strip away the old template code. The old and new code will be not be compatible when used both in a template file. Since the new template code is much better I think I will just remove the old one. This ofcourse will break the old &quot;UnrealWiki&quot; html output templates.

==13-11-2003==

Wtf, this isn't fair: http://unreal.elmuerte.com/uncodex/Source_xinterface/guicomponent.html#163

'''Foxpaw:''' Can you elaborate on what the problem is exactly? That link just took me to a source listing.

'''El Muerte TDS:''' this:

&lt;uscript&gt;
function native final SetTimer(float Interval, optional bool bRepeat);
function native final KillTimer();
&lt;/uscript&gt;

it should be

&lt;uscript&gt;
native final function SetTimer(float Interval, optional bool bRepeat);
native final function KillTimer();
&lt;/uscript&gt;

'''Wormbo:''' Oh nice. Let's add ''function'', ''event'' and ''delegate'' to the function modifiers and tell the people that at least one of these three modifiers must be used, all other modifiers are optional and there is no fixed keyword to declare a function... o_O

'''El Muerte TDS:''' the following may appear in any order and it will be a function type:
:function, operator, postoperator, preoperator, event, delegate, native, final, private, protected, public, latent, iterator, signular, static, exec, simulated

==23-11-2003==

Hooked up the commandline version of UnCodeX (ucxcu), all the basic code for generation of the HTML files, generation of the MS HTML Help file, analysing of the packages, etc. takes up 147kb. All I need to do is combine these modules so that the commandline version does what is should do. I don't think this would take up much diskspace.

I think I'm also going to port the commandline version to linux, shouldn't require much work since most of it is pretty much system independed. Well except for the MS HTML Help generation ofcourse, that requires the MS HTML Help compiler.

==2-12-2003==

Just finished the linux install on my workstation, including Kylix 2 (wtf is my Kylix 3 cd). It sucks to install all KDE packages manualy (the debian KDE meta package was broken in testing).

Anyway, ucxcu pretty much compiled out of the box. A few things don't work yet (because there's no Linux counter part yet). These include: file copy (yes, there's no API function for that), and the comment pre-processor (this is because the IO pipe interface doesn't work for linux yet).

These are not major issues, so a linux version of the commandline utility will be released in the future. The binary is about 14kb larger than the windows version (248kb).

Still need to remove the redudant unreal script parser, currently I have two parsers that pretty much do the same. The first is used for analysing the source code, the second is used by the syntax highlighters. The source analysing should also be able to use the second parser. This would reduce the binary a bit.

==22-12-2003==

Forgot to say, I've got a fully working version of ucxcu for linux. And it's much faster than the windows version, must be because of the filesystem. I only have to add support for the comment preprocessor before the linux ucxcu is complete.

==29-12-2003==

Moved all uncodex cvs modules to a single repository, should have done that right away. The old module locations still exists (symlink to the new location).

Also updated the installer configuration so GUI and CLI versions can be installed seperately.

Done some minor work on UnGateway and checked to see if the telnet interface works for most telnet clients. It has been confirmed to work with: PuTTY 0.52, PuTTY MEGABIT-2003-07-25 IPv6, SecureCRT 4.1.0, Linux NetKit 0.17 Telnet, MS Telnet 1.0

==15-01-2003==

How damn usefull can people be. Apperently ChatFilter increases CPU usage a lot on servers (and I really mean a lot), this was something just posted on the UT2003 Server mailing list. Very usefull to hear that so I could look into it. But apperently there was this other guy that figured that out months ago...  but he never told me...

'''Wormbo:''' Heh, it's always the same. People find a bug or inconvenience, but don't report it. Nevertheless they expect it to be fixed in a later version. :rolleyes:

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3008</id>
      <timestamp>2004-01-26T21:08:28Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Journal History==
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History]]
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 2]]

==14-7-2003==

Long time no entry. I'm going to switch the layout of my dev journal to a per day basis without sorting on project, may be much more readable and it'll allow me to rant on about other things during my developing.

So, the MSU Phase 1 is closing soon. I'm really intresting to see what people have turned in, at least I hope they are going to publish a list of all accepted entries. I wonder if UnCodeX has a chance in the Tool's section, I don't think my other mods have much chance in winning something.

But it's not like I did those projects for the money, I think people creating mods/etc. for the money will only produce crappy mods/etc. because they haven't poured their heart into the project. You can't see very well will dollar (or euro, or whatever) signs in your eyes.

Grrr... I really hoped by this time I was able to log into the VPN again, that's why I started this log entries because the f#cking VPN keeps refusing connections. I really hate it because now I can't continue with my work.

==16-7-2003==

Damn it's hot. Both the outside temperature and my coding speed have resulted in the melting of my workstation's keyboard. It looks like a Dali painting ;)

Anyway, it is damn hot. But that doesn't matter much, the problem is that it's still hot at night. And since it will remain hot for a long time I've shiften my day schedule. Usualy I'm awake from 9:00 till 2:00/3:00. But since it's much cooler in the morning I've decided to get up at 7:30. 

I really wish I had a laptop so I could sit outside and keep working, but sure you can't have everything.

So MSU phase 1 has finally been closed, I wonder how long it'll take before we'll get to see a listing of all  accepted mods.

==17-6-2003==

GUI designing is damn awefull, specially when you want too much stuff into a single screen. What's the best way to do it, how can you split it up into seperate windows, etc...

And ofcourse, you always have to keep in mind to create dynamic layouts, you don't want to hard code every GUI object when it's not needed. The real pain in dynamic layouts is that you can't simply switch to GUI editor mode to change the layout, copy and paste the new dimensions. You have to tweak your formula until it's correct. And evertytime you have to recompile and test it again.

With designing GUIs you will always run into the problem what the best layout it. Because it has to fit on the screen, but also remain functional and look good. The looking good part is something for the art department. As for designing the layout, you could just create the components and tweak them inside the engine but this is slow. A good alternative is to use a presentation program (like MS PowerPoint) to design the layout. Simply create all the components inside PowerPoint (just use rectangles of diffirent colors for the various components that don't have an existing power point representation) and drag them around until you find a good layout. Save it, print it, ... Now you have a good template on how to position the items. All you have to do now is create the components in UnrealScript, launch the game and tweak the positions using the in-game GUI editor.

==30-6-2003==

Finishing up the first release of [[Legacy:LibHTTP|LibHTTP]]. LibHTTP is a well written general purpose library for accessing data on webservers. Since this is something a lot of people want in their mod I decided it was a good idea to write one well written open-source free to use library that will do it for you.

This way mod developers can use their time on their mod instead of writing yet another class for downloading webpages.

I hope other mod developers take up this idea to create open source libraries for common operations. This way there will be more well developed building blocks to use. Which will have a result in more high quality mods available.

==4-8-2003==

It must be summer. And you know why, my damn mouse is sticky, nothing on TV, no great games released.

So I decided to play Unreal again. It's still a great game to play, the large outdoor maps and the mysterious areas makes it a great game. It's pretty damn difficult in the highest difficult setting, specially when you are in tight rooms with a lot of Skaarj (Damn ISV Kran decks).

Still haven't played Unreal 2 a lot, don't know why. Maybe because it's a bit too heavy for my machine.

==29-8-2003==

A bit silent on my public side. Just too busy with things I can't talk about yet.

On the other side. Tron 2.0 is a pretty cool game. They really respected the Tron world as defined in the first movie, basic coloring with nice glow effects. Ofcourse it looks a bit more advanced because the current computer are way more advanced. If you liked the Tron movie you might want to check this one out. 

==4-9-2003==

Well I started on a complete rewrite of my UTelAdSE system. The new design uses a central daemon that can have multiple interfaces to connect to, so it's even more modular that the previous design. Also the authentication has been split off into a seperate object. This way it's possible to change the authentication to use a diffirent system.

The telnet interface is almost done, the most important part the terminal handling is done and it's much better than the previous one. You have the same commandline powers as you have with bash, the previous implementation was very limited (like the DOS prompt).

Also started on the IRCd implementation. I'm complety changing this implementation, I'm going to design it so that you could link various servers into a network. This network would consist out of at least one real IRCd when that the UT servers will link to. This real IRCd has access to all channels servered by the various UT servers linked to it. The IRCd that runs within the engine only has access to the local channels, this is to reduce the load. The unreal IRC server will netsplit on every map (ofcourse).

As for the applications/commands, not much has changed from the previous system. I still use a dynamic array for calling the commands with arguments. However I did change it a bit, commands have to be registered in the daemon, this way I can look up what application object has the requested command. This reduces the function calls needed to call the right command.

==8-9-2003==

Man what does the IRC protocol suck. Just the basic implementation of various commands sucks.

Anyway, ordered me a nice Toshiba SatelitePro m10 laptop today so I can keep on coding where ever I am.

====Comments====

'''Dante:''' Yeah IRC protocol just sucks. I tried to write like 3 IRC clients before, I always stopped at a point when I just got annoyed ;)

'''El Muerte TDS:''' the server part is much worse than the clients part

'''Dante:''' Depends how customizable you want the client to be. I don't think the server part is much more difficult.

'''El Muerte TDS:''' IRC clients are dumb, the server has to figure out everything, and that adds a lot of administation. And it's not that it's more difficult, it's just that it's more of a pain to implement.

'''Dante:''' Yeah clients are kind of dumb, the server still isn't much more clever. Basically it does nothing more than dispatching. It doesn't care for ctcp stuff and such things. Administration is handled thru bots (which are clients) like chanserv. The main pain in writing a server might be security.

'''El Muerte TDS:''' well the server has to keep track of what channels there are, who is in that channel. But you've also got to keep track of the server relays if you have more than one server. This server relaying is hacked into the protocol, wel at least it looks like that.

==10-9-2003==

Almost completely redone the Marky Mutator, the initial release didn't even work online, that's what you get when you ship when it compiles late at night ;). Anyway, the current version is pretty much done, it supports additional pop-up faces, by default it has Mark Rein, CliffyBunny and the Dopefish. I'm waiting for a response from Mark Rein before I will ship this version. I asked Mark Rein if he could record him saying &quot;Two Weeks&quot; so I could use that when his head pops up ;)

Also yesterday my laptop arrived (damn quick), it's a really nice toy :D

==24-9-2003==

Yahoo the evil european software patent directive has been accepted. Start saving money for your first patent infringement.

'''Foxpaw:''' What's that about? I've never heard of this software patent directive?

'''El Muerte TDS:''' Read [http://yro.slashdot.org/article.pl?sid=03/09/24/1253227&amp;mode=thread&amp;tid=155&amp;tid=185&amp;tid=99 this /. article]. Be sure to check out the linked articles for more details.

'''Foxpaw:''' I still don't get it.. how does this &quot;software patent&quot; differ from the IP protection that you already have? Or does it allow people to patent a software notion like anti-aliasing?

'''El Muerte TDS:''' with patents you can prevent people from inventing the same you did, if you own a patent somebody else may not build the same unless it licenses your patent (this protects your invention, but also kills free enterprise). For example, there was a patent on the LZW compression algorithm, LZW is required for GIF files, so you had to license the LZW algorithm before you could write a program that creates GIF files (USA only). This patent is correctly assigned, it does protect the invention and research. But the new software patent possible in Europe (you could always patent these but they were not backed up by law) allows you to patent non-sence (already possible in the USA).

A few examples of non-sence patents: Amazon's &quot;One Click Buy System&quot;, or the recently assigned patent for Microsoft that describes the usage of cookies to keep track of a user id and using that info to look up the user preferences for a web services (a lot of meta sites, online stores and forums use this &quot;technology&quot;). [http://swpat.ffii.org/patents/samples/index.en.html an larger list of interesting patents].

You can't request a patent on inventions already used a lot (&quot;prior art&quot;). Patents are just evil, they used to protect inventors from large companies, but it's now used buy large companies to prevent some compitition and earn money.

And now for the answer to your question, IP is for the your creation AS-IS, not the technique. Here's an bad example (below is ofcourse not possible):

&lt;uscript&gt;
// to increase the value of a number by one:
i = i + 1;   // your creation, people may not use this AS IS

i = 1 + i;   // not the same as yours, but a patent prevents you from using it
i++;         // if you had a patent this was not allowed either
&lt;/uscript&gt;

==20-10-2003==

Screw modelers, all I wanted was a pretty simple static mesh of a beer bottle crate. No free public assets for that and nobody remotely interested in helping me out. So I decided to mess around with Maya myself. Worked out pretty well, I managed to create a 7x5x4 cube (it's harder than it sounds ;) ), and mapped by texture on it. And it looks quite well. Except that all faces of the cube are in-side-out ;)

Ahh well, easy fix (I now know how to do that). Capture The Beer is almost complete, only need to replace a few more pieces of text, so something with the announcer. And double check if it works online.

==10-11-2003==

As you may have noticed I pick-ed up development of [[Legacy:UnCodeX|UnCodeX]] again. I've already made some cosmetic changes. Currently I'm working on an major improvement of the HTML output. I'm focusing even more on the JavaDoc style. Most things don't change much except for the class details, they will now be split up into a summary and a detail view. I tried to put in to much data in the previous output. Also I've fixed the templating engine to create seperate directories for packages. Having a lot of files in a single directory is a bad idea in general, and with UT2003 2225 it generated over 5000 files. Now each package will get 2 directires: ./packagename and ./Source_packagename.

For a preview of the new html output, check here: http://unreal.elmuerte.com/uncodex

==11-11-2003==

I've come to an interesting point in the html output changes. I have to change some majors things, I could just add the new code and leave the old intact, or I could strip away the old template code. The old and new code will be not be compatible when used both in a template file. Since the new template code is much better I think I will just remove the old one. This ofcourse will break the old &quot;UnrealWiki&quot; html output templates.

==13-11-2003==

Wtf, this isn't fair: http://unreal.elmuerte.com/uncodex/Source_xinterface/guicomponent.html#163

'''Foxpaw:''' Can you elaborate on what the problem is exactly? That link just took me to a source listing.

'''El Muerte TDS:''' this:

&lt;uscript&gt;
function native final SetTimer(float Interval, optional bool bRepeat);
function native final KillTimer();
&lt;/uscript&gt;

it should be

&lt;uscript&gt;
native final function SetTimer(float Interval, optional bool bRepeat);
native final function KillTimer();
&lt;/uscript&gt;

'''Wormbo:''' Oh nice. Let's add ''function'', ''event'' and ''delegate'' to the function modifiers and tell the people that at least one of these three modifiers must be used, all other modifiers are optional and there is no fixed keyword to declare a function... o_O

'''El Muerte TDS:''' the following may appear in any order and it will be a function type:
:function, operator, postoperator, preoperator, event, delegate, native, final, private, protected, public, latent, iterator, signular, static, exec, simulated

==23-11-2003==

Hooked up the commandline version of UnCodeX (ucxcu), all the basic code for generation of the HTML files, generation of the MS HTML Help file, analysing of the packages, etc. takes up 147kb. All I need to do is combine these modules so that the commandline version does what is should do. I don't think this would take up much diskspace.

I think I'm also going to port the commandline version to linux, shouldn't require much work since most of it is pretty much system independed. Well except for the MS HTML Help generation ofcourse, that requires the MS HTML Help compiler.

==2-12-2003==

Just finished the linux install on my workstation, including Kylix 2 (wtf is my Kylix 3 cd). It sucks to install all KDE packages manualy (the debian KDE meta package was broken in testing).

Anyway, ucxcu pretty much compiled out of the box. A few things don't work yet (because there's no Linux counter part yet). These include: file copy (yes, there's no API function for that), and the comment pre-processor (this is because the IO pipe interface doesn't work for linux yet).

These are not major issues, so a linux version of the commandline utility will be released in the future. The binary is about 14kb larger than the windows version (248kb).

Still need to remove the redudant unreal script parser, currently I have two parsers that pretty much do the same. The first is used for analysing the source code, the second is used by the syntax highlighters. The source analysing should also be able to use the second parser. This would reduce the binary a bit.

==22-12-2003==

Forgot to say, I've got a fully working version of ucxcu for linux. And it's much faster than the windows version, must be because of the filesystem. I only have to add support for the comment preprocessor before the linux ucxcu is complete.

==29-12-2003==

Moved all uncodex cvs modules to a single repository, should have done that right away. The old module locations still exists (symlink to the new location).

Also updated the installer configuration so GUI and CLI versions can be installed seperately.

Done some minor work on UnGateway and checked to see if the telnet interface works for most telnet clients. It has been confirmed to work with: PuTTY 0.52, PuTTY MEGABIT-2003-07-25 IPv6, SecureCRT 4.1.0, Linux NetKit 0.17 Telnet, MS Telnet 1.0

==15-01-2004==

How damn usefull can people be. Apperently ChatFilter increases CPU usage a lot on servers (and I really mean a lot), this was something just posted on the UT2003 Server mailing list. Very usefull to hear that so I could look into it. But apperently there was this other guy that figured that out months ago...  but he never told me...

'''Wormbo:''' Heh, it's always the same. People find a bug or inconvenience, but don't report it. Nevertheless they expect it to be fixed in a later version. :rolleyes:

'''El Muerte TDS:''' now it appears it may not even be my mod at all, the guy installed deathball, irc reporter and chatfilter at the same time, and one of those caused the lag (or not). really usefull...

==26-1-2004==

Rewriting part of the GUI of UnCodeX, I'm planning to use dockable panels so you can define how and where you want the diffirent parts.

I have the docking part down, but I have to figure out how to save and load the parts. The default functions don't work very well.

I'm also adding a property inspector the the main window that will follow the currently selected class.

But this all is burning on a low fire, there are some more important projects going on that have a closer deadline.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS/GQP</title>
    <id>1145</id>
    <revision>
      <id>3004</id>
      <timestamp>2004-03-03T08:32:40Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:El Muerte/GQP|El Muerte/GQP]]</text>
    </revision>
    <revision>
      <id>3005</id>
      <timestamp>2003-06-15T15:29:51Z</timestamp>
      <contributor>
        <ip>Skamp</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">GQP stands for Gameserver Query Protocol (working title)

==Purpose ==

This document serves as a working draft for a RFC to be written later.

At the moment, there's only one protocol that can be considered a standard: the GameSpy protocol. But this protocol is not well defined and has some design flaws.

Hopefully, game developers and server query programs (like [http://www.qstat.org/ qstat] or [http://www.udpsoft.com/eye2/ ASE]) will adopt this specification once it's complete.

==Authors ==

''If you are going to work on the design of this protocol, please add your name here for later reference.''

* Michiel Hendriks &lt;elmuerte@drunksnipers.com&gt;
* Guillaume Cocatre-Zilgien, a.k.a. &quot;skamp&quot; - http://www.skamp.net/

==Design features ==

* the protocol should be as basic and serve as many purposes as possible, so it can be implemented in every game;
* authentication, possibility to protect data (through encryption/encoding?);
* easily extensible with new query commands;

...

==Grammar ==

''Client request''
    QUERY           ::= ( ENCODED )? COMMAND ( GS COMMAND )* EOT
    ENCODED         ::= SOH STRING ACK
    COMMAND         ::= STRING ( RS ARGUMENT-LIST )? 
    ARGUMENT-LIST   ::= STRING ( US STRING )* 

''Server response''
    RESPONSE        ::= ( ENCODED )? COMMAND-REPLY ( GS COMMAND-REPLY )* EOT
    COMMAND-REPLY   ::= STATUS-CODE COMMAND-NAME RS DATA
    COMMAND-NAME    ::= STRING
    STATUS-CODE     ::= DIGIT DIGIT
    DATA            ::= ACK
                      | RECORD ( RS RECORD )*
    RECORD          ::= DC1 STRING                // a simple string
                      | DC2 STRING US STRING      // name = value
                      | DC3 STRING ( US STRING )* // array
                      | DC4 STRING ( US STRING )* // labeled array (first element is the label)
                                            
    SOH             ::= &lt;SOH&gt;
    EOT             ::= &lt;EOT&gt;
    GS              ::= &lt;GS&gt;
    RS              ::= &lt;RS&gt;
    US              ::= &lt;US&gt;
    STRING          ::= ( &lt;printable&gt; )*
    DIGIT           ::= '0' ... '9'
    ACK             ::= &lt;ACK&gt;
    DC1             ::= &lt;DC1&gt;
    DC2             ::= &lt;DC2&gt;
    DC3             ::= &lt;DC3&gt;
    DC4             ::= &lt;DC4&gt;

===Server reponse data ===

The server respons data (the rules DATA and RECORD) can be one of the following format:
; empty reply : only an &lt;ACK&gt;

; text : just a single string as reply
  &quot;single item&quot;

; name/value : both a name and value
  &quot;label&quot; =&gt; &quot;single item&quot;

; array : an array of value
  Array (&quot;item one&quot;, &quot;item two&quot;, &quot;item three&quot;)

; labeled array : an array with a label
  &quot;label&quot; =&gt; Array (&quot;item one&quot;, &quot;item two&quot;, &quot;item three&quot;)
    

&lt;DLE&gt;, &lt;EOT&gt;, &lt;ETB&gt;, &lt;GS&gt;, &lt;RS&gt;, &lt;US&gt;, &lt;ACK&gt;, &lt;SOH&gt;, &lt;STX&gt; and &lt;ETX&gt; are ASCII control codes (the first 32 symbols in the ASCII table).

&lt;printable&gt; is every non-control code in the ASCII table.

'''Skamp:''' When needed, transmissions shall be split into blocks ending with &lt;ETB&gt;, &lt;EOT&gt; indicating overall completion.

'''El Muerte TDS:''' you don't need to split transmission into blocks, UDP is pretty much a constant stream of data so just start with reading until you get an &lt;EOT&gt;

'''Skamp:''' Mmm-kay.

==Encoding ==

When a Query or Command starts with &lt;SOH&gt;, the data is encoded up to &lt;EOT&gt;.

The &lt;SOH&gt; control character is followed by a string containing encoding information terminated by &lt;ACK&gt;. The choice of encoding is up to the implementor.

'''Skamp:''' I believe that &lt;DLE&gt; is more suitable for type definition; besides, one might want to specify more than one kind of encoding: for instance, &quot;bzip2&quot; + &quot;UTF-8&quot;...

'''El Muerte TDS:''' the string is just a identification string, so if you want &quot;bzip2&quot; + &quot;utf-8&quot; you can just use &quot;bzip2+utf-8&quot; as string, or even &quot;MySpecialEncoding&quot;. It really doesn't matter.

'''Skamp:''' I'm just affraid of implementations to use different syntaxes. One would use standard notations, and another one would use &quot;zip/english&quot; because ''it's just more convenient''. You're right, it doesn't really matter, as long as we specify a standard - or use an existing - ASCII notation.

==Status Codes ==

Returned codes per command:

{|

|-
|''Code ''
|''Meaning''
|
|-
|10
|OK
|The command returned succesfully 
|-
|20
|Unknown command
|
|-
|21
|Unsupported feature
|The requested feature is not supported, can be returned in case of encoding or authentication 
|-
|22
|Incorrect number of arguments
|Command requires more or fewer arguments; in the latter case, this status code may be ignored 
|-
|23
|Invalid argument
|One ore more arguments aren't correctly formated 
|-
|30
|Disabled
|This command has been disabled by the admin 
|-
|31
|Temporarily unavailable
|This service or command is temporarily unavailable 
|-
|32
|Unauthorised
|Not authorised to use this command or invalid credentials 
|-
|40
|Unsupported encoding
|The used encoding isn't supported 
|-
|41
|Decode error
|An error occured while decoding 
|}

==Required commands ==

The following commands should be supported by every implementation:

; identify : return game identification info
: '''''input:''''' ''none''
: '''''output:''''' gamename = tag; gamever = version; netver = minimal net version

; echo : return the argument
: '''''input:''''' any number of arguments
: '''''output:''''' return each input argument

; auth : return challenge info to be used with the ''challenge'' command in order to access protected commands, or to be supplied with encoded data.
: '''''input:''''' login; password;
: '''''output:''''' challenge string

; challenge : validate the client after an authentication
: '''''input:''''' challenge string
: '''''output:''''' ''none''

; extensions : return the list of accepted extensions to the protocol
: '''''input:''''' ''none''
: '''''output:''''' list

...

==Example queries ==

'''Note:''' in the following examples, data sent to or received from the server is not real, but has been adapted to a more readable format.

; Query :
  &quot;identify&quot; &lt;EOT&gt;
; Response :
  10 &quot;identify&quot; &lt;RS&gt; &quot;gamename&quot; &lt;US&gt; &quot;ut&quot; &lt;RS&gt; &quot;gamever&quot; &lt;US&gt; &quot;432&quot; &lt;RS&gt; &quot;netver&quot; &lt;US&gt; &quot;432&quot; &lt;EOT&gt;

; Query :
  &quot;unknown command&quot; &lt;EOT&gt;
; Response : 
  20 &quot;unknown command&quot; &lt;RS&gt; &lt;STX&gt; &quot;error: unknown command&quot; &lt;EOT&gt; 

or 
  20 &lt;RS&gt; &lt;ACK&gt; &lt;EOT&gt;

; Query :
  &quot;echo&quot; &lt;RS&gt; &quot;this text&quot; &lt;GS&gt; &quot;echo&quot; &lt;RS&gt; &quot;more text&quot; &lt;EOT&gt;

; Response :
  10 &quot;echo&quot; &lt;RS&gt; &lt;STX&gt; &quot;this text&quot; &lt;GS&gt; 
  10 &quot;echo&quot; &lt;RS&gt; &lt;STX&gt; &quot;more text&quot; &lt;EOT&gt;

A test page: http://unreal.elmuerte.com/GQP/

==Reference ==

===ASCII Table ===

{|

|-
|'''Notation'''
|'''Meaning'''
|'''Hex. code'''
|'''Dec. code'''
|-
|&lt;SOH&gt;
|Start Of Header
|01
|1 
|-
|&lt;STX&gt;
|Start of TeXt
|02
|2 
|-
|&lt;ETX&gt;
|End of TeXt
|03
|3 
|-
|&lt;EOT&gt;
|End Of Transmission
|04
|4 
|-
|&lt;ACK&gt;
|Acknowledge
|06
|6 
|-
|&lt;DLE&gt;
|Data Link Escape
|10
|16 
|-
|&lt;DC1&gt;
|Device Control 1
|11
|17 
|-
|&lt;DC2&gt;
|Device Control 2
|12
|18 
|-
|&lt;DC3&gt;
|Device Control 3
|13
|19 
|-
|&lt;DC4&gt;
|Device Control 4
|14
|20 
|-
|&lt;ETB&gt;
|End of Transmission Block
|23
|17 
|-
|&lt;GS&gt;
|Group Separator
|1d
|29 
|-
|&lt;RS&gt;
|Record Separator
|1e
|30 
|-
|&lt;US&gt;
|Unit Separator
|1f
|31 
|}

Sources:
* http://www.cs.tut.fi/~jkorpela/chars/c0.html
* http://www.evergreen.edu/biophysics/technotes/program/ascii_ctrl.htm
* http://www.beaunet.force9.co.uk/IT4IT/glossary/CtrlCods.htm

==Discussion ==

'''El Muerte TDS:''' Everything on this page is subject for changing, this my initial concept.

'''Skamp:''' Good start! I think that in the future, technical specifications won't be enough: we will also need implementation guidelines.

'''Skamp:''' I've made some spelling and phrasing corrections, I hope you don't mind.

'''Skamp:''' Added some suggestions; I'm going to bed now :-)

----

'''Skamp:'''

''About TYPE:''

The added TYPE would allow the specification of the item's type (hexadecimal, decimal, 16 bits or 32 bits integer, signed / unsigned, etc...). I think it is important to include such information; besides, as a single char it wouldn't take much space.

The ''default type'' would apply by default to every item in the list, if not specified otherwise on a case by case basis (''specific type'').

'''El Muerte TDS:''' I think it's best to simple use plain 8bit ASCII for everything. And if the data is transmitted in UNICODE you would just add &lt;SOH&gt; &quot;UNICODE&quot; &lt;ACK&gt; in front of your transmission. I want to prevent binary data as much as possible. (unless you use an encoding)

'''Skamp:''' I didn't realize that. You should specify it somewhere, although I'm not sure to agree with that. Binary mixes quite well with ASCII, while being very suitable for numbers, and lightweight. Type enforcement is a big concern to me, since existing implementations of the GameSpy protocol have shown to be '''very''' inconsistent. I believe we need a stricter protocol.

On another subject: your redefined RECORD is much simpler and clearer than mine, sometimes I probably should go to bed earlier :-) By the way, EBNF standard notation for comments encloses them in ''(* *)''; although it doesn't matter now that you used C-like notation, it will matter when writing the RFC.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS/Journal History</title>
    <id>1144</id>
    <revision>
      <id>3002</id>
      <timestamp>2004-03-03T08:28:38Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:El Muerte/Journal History 1|El Muerte/Journal History 1]]</text>
    </revision>
    <revision>
      <id>3003</id>
      <timestamp>2003-06-06T19:37:19Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==UTelAdSE ==

===ConsoleCommand issues ===

Console commands are great, but why does it work how it works. I want to get server access to a console as powerfull as the players console (ExtendedConsole), but requires to use Interactions.

The only accessable consolecommands (Level.ConsoleCommand and PlayerController.ConsoleCommand) only have some basic working commands, and no feedback if a consolecommand exists.

How can I use interactions on a server, I don't have a viewport (Player instance) and spawning a PlayerController doesn't give me a viewport. 

Trying to create ExtendedConsole and InteractionMaster instances on a custom PlayerController resulted in a server crash when I called ConsoleCommand. I nullified all code in my new interaction classes, and still I get an error.

Is there an other way to call console commands ?

'''Dma:''' All [[Legacy:Actor|Actor]] and [[Legacy:Interaction|Interaction]] subclasses have consolecommand.  However, the [[Legacy:Interaction|Interaction]] one returns a bool instead of a string.  There are other differences as well.  The console command is executed in the context of the actor, but this rarely makes a difference.

'''El Muerte TDS:''' Well the ConsoleCommand method in [[Legacy:Interaction|Interaction]] has more power then the one in [[Legacy:Actor|Actor]] (as I said above). I want a white-box ConsoleCommand.

===Edit gametype settings ===

How can I implement this best ? The WebAdmin and xAdmin use Game PlayInfo classes. Using PlayInfo is the best solution because this would allow you to set mutator settings as well (when they are loaded) (available in the nest UT2003 version (2136+)). I think it's best to implement it sort of the same way as the MapList editor, to use an option flag `-gametype` to set a value for the specific game type. Changes should be saved when submitted in order to support more admins at the same time.

{{innerbox| /gametype &lt;list&gt; | &lt;set&gt; [-gametype] setting value | &lt;get&gt; [-gametype] [mask]

 &lt;list&gt; display list of available gametypes

 &lt;set&gt; set a setting to value

 &lt;get&gt; get available settings, matching mask

}}

===Default properties and config ===

I came to an intresting discoverry when I released the first version of UTelAdSE. 

You can use the [[Legacy:Default Properties|default properties]] to define the default value of a configurable variable. When this option is not configured it will use the default variable. This doesn't work the same way with dynamic arrays, instead dynamic arrays will sometimes be initialised als null.

Let say you have the following:

&lt;uscript&gt;
var config string astring;
var config array&lt;string&gt; stringlist;

defaulproperties
{
  astring=&quot;not empty&quot;
  stringlist(0)=&quot;zero&quot;
  stringlist(1)=&quot;one&quot;
  stringlist(2)=&quot;two&quot;
}
&lt;/uscript&gt;

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''ini configuration'''''
| style=&quot;text-align: center&quot; |'''''initial values'''''
| style=&quot;text-align: center&quot; |'''''notes''''' 
|-
|empty
|astring=&quot;not empty&quot; &lt;br /&gt;                        stringlist(0)=&quot;zero&quot; &lt;br /&gt;                        stringlist(1)=&quot;one&quot; &lt;br /&gt;                        stringlist(2)=&quot;two&quot;
|
|-
|astring=&quot;new value&quot; &lt;br /&gt;  stringlist=&quot;0&quot; &lt;br /&gt;  stringlist=&quot;1&quot; &lt;br /&gt;  stringlist=&quot;2&quot;
|&lt;br /&gt;  astring=&quot;new value&quot; &lt;br /&gt;  stringlist(0)=&quot;0&quot; &lt;br /&gt;  stringlist(1)=&quot;1&quot; &lt;br /&gt;  stringlist(2)=&quot;2&quot;
|
|-
|astring=&quot;something&quot;
|astring=&quot;something&quot; &lt;br /&gt;                        '''stringlist(0)=null''' &lt;br /&gt;                        '''stringlist(1)=null''' &lt;br /&gt;                        '''stringlist(2)=null'''
|&lt;br /&gt;As you can see when you don't define the value of a dynamic array, but do configure an other variable the dynamic array will be initialised as null
|-
|&amp;nbsp; &lt;br /&gt;  stringlist=&quot;new&quot; &lt;br /&gt;  stringlist=&quot;newer&quot;
|&lt;br /&gt;  astring=&quot;not empty&quot; &lt;br /&gt;  stringlist(0)=&quot;new&quot; &lt;br /&gt;  stringlist(1)=&quot;newer&quot; &lt;br /&gt;  '''stringlist(2)=null'''
|
|}

===Telnet Protocol ===

Telnet is very simple, it's just 7bit ASCII and nothing more. But there's a litte bit more, Telnet Commands, these can be used for special actions like turning on/off local echo, or retreive the terminal size. The only thing is, for some commands you need binary read/write methods because the NULL char is used in some occasions.

Well no real problem, just switch to Binary mode for the negotiation. But binary support is limited to manual reading because the events are broken. Manual reading doesn't work very well since you never know if there's something to read, you can't just poll if there's data because the Data pending methods/vars are broken too.

I've now made a terrible method for doing this using some loops and stuff.

'''''19-01-2003''''' well binary events are fixed in UT2003 version 2175 and up, so now I'm able to improve the code. Ofcourse I need to keep backward compatibility with older versions so the old code is still there and used when the version is below 2175.

===Bugs ===

Bugs are a pain in the ass. But things that works ok on one system, but totaly works wrong on a other system are just ridiculous. UTelAdSE works perfectly on my test system, but a friend reported that local echo was not disabled on his client when he uses UTelAdSE on his server. The weird thing is, the client works correctly. After the login prompt is received by the client nothing should happen. But on his system telnet control negotiation happens after the prompt enabling local echo. This is just plain stupid because UTelAdSE doesn't send any control sequences to the client at that point.

Bug was solved with v101, but I didn't do anything diffirent afaik. 

===Documentation ===

Good documentation is required, even if people don't read it. Writing documentation is just plain boring. Also formatting the documentation correctly so it will be usefull and clear. Usualy this isn't realy a problem since most text is straight forward. But what to do when you have to document a lot of pretty advanced builtin commands.

For example you have a command that can do the following:
  /maplist list
  /maplist add CTF-Map.ut2 ...
  /maplist del CTF-Othermap.ut2
  /maplist move 1 2
  /maplist view
  /maplist -gametype BR list
  ...

First I have to give the full commandline possible, so something like:
  /maplist [-gametype type] &amp;lt;list|view|move x y|add maps ...|del maps ...&gt;

Then I have to explain the stuff. And that for a lot of commands. It's better that somebody else writes documentation :)

===ladder/profile editing ===

Objective: keep a list of predefined game settings

Need to ask Evolution about this.

Evo's Ladder is a shit load of non linear code (just like UT2003), damn it takes a lot of time to go through it, I bet people get the same idea when they check out the UTelAdSE code.

Thanks to the additional WebQueryHandler Evo provided with Ladder coding the UTelAdSE plugin for this is pretty easy, this way I don't have to find out everything myself. But still it's a lot of work. I'm no stuck at the Profile editing and Profile management, it's a lot of pretty &quot;dumb&quot; work, most of the time it's just copy paste and adjust. I prefer inventing stuff.

===Coding block ===

'''''19-01-2003''''' it sucks, plain as that. There are quite some TODO points left (Evo's Ladder), but I just don't feel like implementing it. Simply because it's not a real challange. I don't realy have to come up with new things, all I have to do is somewhat copy part of the gametype editing code and use it with the ladders. You can't realy force yourself to start working, so in result you just don't do shit. Besides I also have to do other stuff (yeah right).

===TitanIRCd ===

'''''26-01-2003''''' UnrealIRCD is a subclass of the UTelAdSE system, instead of followng the telnet standard it will talk IRC. This will add some limitations since the client side does all the output rendering, for example the hangman game would not be possible. But this would also introduce some usefull features for the clients connecting to it, like a channal for the chatting and real time player management (kicking/banning/chatting), auto reconnect (by the irc client), etc...

It should be quite easy to extend the current system to talk a diffirent TCP protocol, some changes have to be made in the connection accepting class tho, but that would be it.

UnrealIRCD would be a straight forward IRC server with ofcourse not all IRC feature implemented, just the one's realy needed by the server. But a possibility for the future would be an actual relay chat server (with netsplits on every map change ;))

'''''27-01-2003''''' pff, implementing an IRCd is a real pain, the IRC RFC is written from the client perspective. But with the RFC and packet sniffing I've come a long way. Ok the current set up is: two windows, one for chatting and one for the actual administrating. The admin commands have to be send via messages because it's easier to use, otherwise people need to /quote all the commands. The chat window would be pretty nice because using /whois you could retreive the user info like: host (duh), player ID, CD Key Hash, etc.. Also the /kick command should.

Admins will get a @ prefix (duh), real player will get a voice, and bots won't get anything (because they don't realy have a voice). The WebAdmin sepectator (and UTelAdSE, BullShit, etc...) will also show up in the list.

There are however a couple of normal IRC commands/features that should not work: JOIN, PART, BAN (could be possible tho), private messaging, channel mode changes, user mode changes, notices, ...

'''''28-01-2003''''' changed the name to TitanIRCd which is short for Trivial Interactive Text Administration Network . Heh.. ok it's just a name. Also found the IRCd RFC (IRC server RFC) http://rfc.sunsite.dk/rfc/rfc2813.html that would help me on my journey.

'''''28-01-2003''''' development is going pretty well, but now I walked into a wall, sort of. I need to keep track of all users in a general place, I only get join messages of real players not all sorts of other players. So I need to keep track when a unknown person speaks it should join the server. But I also also add his info record in a general place, this means I also need to keep track of the IRC clients to forward the join messages. But anyway, I have had an actualy IRC conversation on the server today :)

'''''31-01-2003''''' well development is coming a long very well, I've almost implemented all functionality. The admin channel works like it should (I think). Player joins/parts are reported. Only name changes of players are not reported, looks like I don't receive that gamemessage. There are just a few things I have to implement for the first beta release. Maybe tomorrow.

'''''10-3-2003''''' No this one isn't dead yet, just not so active. Added a couple of function to replace the usage of tabs, tabs a evil since they tend to screw up a lot. Also tabs don't work with most IRC clients. Thus I implemented AlignLeft\Right\Center, soon to be added to [[Legacy:WUtils|WUtils]]

----

'''DJPaul:''' Hope you don't mind greatly me writing here, but: UnrealIRCd is, indeed, an actual IRCd.  The same name would confuse people.  See http://www.unrealircd.com/.  If i'm reading this right, WHY does UT need a IRCd?  If you just want IRC&lt;-&gt;UT talk, you can use http://serverdev.beyondunreal.com/.  Yes, you could handle players/chat via IRC...

'''Mychaeel:''' I suppose to allow server administration via IRC.  I could imagine that'd appeal to many people more than telnet administration (though that's pretty neat too)...

'''El Muerte TDS:''' oh damn, ok.. guess I need a new name for it

===TODO ===
* ofcourse check for any security issues
* add ladder/profile editing
* documentation

==BruteForce ==

BruteForce is a small programming language written in UnrealScript. Don't ask why, just because.

The source code and specifications are available from my [[Legacy:CVS|CVS]], and accessable via

http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/BruteForce/

The language is case insensitive and type complete.

The ENBF specification is not complete.

I may need to switch to actually seperate compiling and executing. Otherwise it's notpossible to do a while loop without very ugly statements, even worse that my if-then-else solution.

Note: BruteForce has a very usefull [[Legacy:Tokenizer|Tokenizer]], you may want to take a look at it when you need to do parsing of text.

'''''16-4-2003''''' rewrote my previous grammar, and started on a new compiler to create an AST so I can actually execute the code after compiling it. On the fly execution just doesn't work.

'''''17-4-2003''''' add support for function declarations, I think I now have all the functionality I want in the grammar (except for some builtin functions, but those don't matter much). I really should start to figure out how I can implement the AST.

This could be a solution:

&lt;uscript&gt;
struct Node
{
  var tokenType  token;
  var string     value;
  var array&lt;int&gt; children;
}
array&lt;Node&gt; Tree;
&lt;/uscript&gt;

Ofcourse I need to filter out the useless tokens and convert identifiers to keywords.

oi nutter, changing infix to prefix notation is difficult when you are using a recursive decended parser. I need to switch tree nodes around or something, but I also have to track the depth... Argh, need to get my mind of this for a while.

'''''18-4-2003''''' finished the AST and implemented an interpreter. The AST is not complete since the function declarations are not passed on, I need to think of a good way to do this since I want to be able to store the functions, I don't want them executed everything the main code is executed. Also the interpreter is not complete, the operators only work for INT types at the moment and the type conversion isn't implemented yet. But for the rest it works like a charm. I've also added a print(), argc() and argv() function. To implement the function calls I had to make my grammar LL(2) :( There's no other way to do that except for a special token for a function call, and that simply sucks.

&lt;uscript&gt;
a = doSomething(a);      // nice
a = call doSomething(a); // ugly
&lt;/uscript&gt;

'''''21-4-2003''''' fixed the type completeness, there are only some wierd things, like wtf does &quot;string&quot;-&quot;string&quot; do !? So I left that ''blank''. Also fixed the execution order, 1-2+3 would be executed as 1-(2+3). To test everything I converted the timestamp function from [[Legacy:Wutils|wutils]] to BruteForce and it works , woohoo... Now to add support of functions and then my current specification is complete.

Yes... working function calls, the solution was quite easy all I had to do is add a new declaration type Function and jump to the tree node where the function code is. The input variables can just be read from the refering node. Also added AND, OR and MOD operators.

'''''22-4-2003''''' Help, it's slow ;) Takes about 2 seconds to calculate 100 easter dates. And I think most of the time is used by the Scope class to lookup declarations, not sure tho, there's no good way to calculate the time used by the Scope, or is there ?

Anyway, current state is pretty usefull. Maybe I need to add output variables to the main program block.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS/Journal History 2</title>
    <id>1147</id>
    <revision>
      <id>3009</id>
      <timestamp>2004-03-03T08:29:35Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:El Muerte/Journal History 2|El Muerte/Journal History 2]]</text>
    </revision>
    <revision>
      <id>3010</id>
      <timestamp>2003-08-04T15:31:37Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==UnCodeX ==

[[Legacy:UnCodeX|UnCodeX homepage]]

===Status reports ===

'''''1-2-2003''''' Ok the first step works. I created a class tree from scratch in 35 seconds (source dir was on a SMB drive so might be faster when I read those file from a local machine). Also created a token parser to easily read the contents of the source.

'''''1-2-2003''''' Eek. Evolution just noted me on a nice issue: multiple classes with the same name in diffirent packages. So let's see you have the following:
 + Object
   |
   +- SomeClass (in Package1)
      |
      + SomeClass (in Package2)

How to detect that ?! The only way I can think of is is using a package priority list.

'''''2-2-2003''''' Argh, the whole tree creation time takes about 5 second now, but when there are classes with the same name in diffirent packages it breaks tree. And I can't think of a good method to create the tree and keep the algorithm fast enough.

'''''2-2-2003''''' Woohoo, found a way to use the package priority in the routine. Now the tree will only break when the package priority has not been set, and that doesn't matter much, I'll add a warning on startup when a package has not been prioritised

'''''2-2-2003''''' Ok if people want to test the current version you can download it , you have to edit the UnrealTree.ini file to point to the correct location. 

'''''3-2-2003''''' Started on the class parsing, consts and vars work. But I need to check on types of dynamic array, class and inline enums. It's still very fast :)

'''''3-2-2003''''' enums and vars of type array/class and inline enums are now parsed correctly. (new alpha available, right click the class tree for more options)

'''''4-2-2003''''' functions are also detected and almost parsed completely, same for structs. so at this time I'm able to convert a unreal class to an object with all the class it's features. Parsing the Actor class costs about 0.01 second. I think I can start the part of the HTML output. I'm going to implement the HTML output using templates for each part of the class, this way you can completely customise the way the HTML files are constructed.

'''''6-2-2003''''' Now working on the ouput module, I need a very fast replacement engine to use with templates. Before I start to write my own does anyone know of a good (basis) replacement engine for Delphi\ObjectPascal. I tried TemplatePower and it's too slow.

'''''6-2-2003''''' Started to work on my own parser, it's fast enough. The current alpha produces all the files except the class files, and does this in a little over 2 second (43 files). I've supplied a basic template with the alpa, replacements are between '%' tokens. Note, you have to start UnrealTree with the correct working directory set to the location of UnrealTree or else it can't find the template files.

To create the HTML files you first have to create the class tree.

'''''6-2-2003''''' Fixed a couple of parsing error related to the cpptext {} blocks and appear in the normal source. Also added a global ignore on state and code, need to work on state processing. All these cool features in UScript make it pretty hard to parse. At the moment analysing all 1380 classes takes 5.5 seconds, and creating all HTML files takes 18 seconds (class files are not complete). Anyway, so far so good, performance is realy better than I ever expected.

'''''7-2-2003''''' Again some more fixes in the analysing code. Also added a new option to scan for orphan classes. Use this to tweak the Package Priority settings, when the priority is correct you should have no orphan classes. The class overview HTML file how has some more info, the rest is coming. Also need to focus on type links

'''''10-2-2003''''' I need to scan functions inside the states because these functions are often used, that means I have to process state definitions because functions overwrite themselfs in states. Searching for an already defined method takes a lot of time since it has to go through the whole list everytime. So this could better be done on the output processing. But now the difficult part, state processing. The syntax of a state:

&lt;uscript&gt;
[modifiers] state &lt;name&gt; [extends &lt;name&gt;] 
{
  [ignores &lt;method&gt;, &lt;methods&gt;, ...;]

  [methods ...

  [label:
    code;
  label:
    code;
  ...]
  ...]
}
&lt;/uscript&gt;

The problem with this is that you don't know a function declaration until you find the correct keyword, checking on a semi colon is not enough since the following code is still parsed as a possible function. If UScript enoforced labels to be at the end of the statement this wouldn't be a problem, but is it enforced?

I also need some nice images for buttons and stuff.

'''''10-2-2003''''' State processing is done now, also fixed a couple of other bugs in the analyser. Most of the analyser code is done. My main focus is output processing. At this time it takes about 1 minute to generate all HTML files from scratch (including analysing of the code).

'''''10-2-2003''''' My current implementation of the type link caching is pretty slow, it doubles the time needed for HTML generation, and I only resolve the return values of functions not even the params. I think it's because of the site of the string list since it didn't matter if I used an straight list or an inheritance list for the class generation. So I guess I need create a diffirent type for the cache.

'''''11-2-2003''''' Found a pretty excelent StringHash class for delphi that brings back the HTML generation back to 45 seconds. There's just one issue and that's with classes with the same name, this might screw up the link to the type, but there's not much I can do about it.

'''''12-2-2003''''' Fixing things up on the alpha, beta should be there soon. Made a nice UnrealWiki style as default template.

'''''15-2-2003''''' The tree state can now be saved and loaded, it's a bit faster than rebuilding the tree when the files are already cached on the file system. Also changed the templates a bit to include titles, this way when an class doesn't have functions it won't display the function heading. Still thinking weather or not I should include inherited vars/enums/structs/... It's quite usefull.

'''''17-2-2003''''' Fixed a stupid bug in state loading, and implemented the inherited properties list. Need to cache this tho, takes a pretty long time an Object is scanned 1400 times :) Also need to add an option for max inherited classes, I don't people want to inherit upto object everytime.

'''''17-2-2003''''' Fix another bug in the state loading. Also inherited properties are now cached, makes it a lot faster, 90 seconds for all HTML files. Also put in a configurable limit (in template). Also sorted all the properties. Forgot the other things I fixed/changed.

'''''19-2-2003''''' renamed it to UnCodeX, it's a much better name. Finishing up some code, and implementing two new things, a glossary and classtree (in HTML). Need to address a few things before I make it beta, types: class&lt;..&gt; and array&lt;..&gt; also make sure all &lt; and &gt; are translated to the correct HTML special chars

'''''24-2-2003''''' fixed the array&lt;..&gt; return types of functions. Also implemented the glossary, and I need to redesign this because it's too slow and too big. Also resolved the types array&lt;&gt; and class&lt;&gt; and fixed the &lt;, &gt; and &quot; characters in the HTML output.

'''''27-2-2003''''' Improved the glossary code to create more pages (for every letter one), HTML generation now takes about 90 seconds. Also added replacements for package path and class filename so you can link to the source code from the browser, if you set things right the browser should open your favorite editor. Too bad that Mozilla really downloads the file from disk to disk and then launches the application. MSIE does open the direct file.

'''''2-3-2003''''' Finishing up the alpha version, added the Class Tree page and changed the page footer replacements. UnCodeX is almost full featured. If anyone has some ideas for extra feature please contact me.

'''''2-3-2003''''' Add support of MS HTML Help generation, all you have to do is install MS HTML Help Workshop, config UnCodeX to point to the HTML Help Workshop path and press the button (after you created the HTML files). A .chm file will be created (should spare you about 1000% diskapce.

'''''4-3-2003''''' Fixed a parser bug introduced in a few version back. Also optimized the HTML Help creation a bit. Added buttons to add/remove packages from the priority listing. Well this is the final alpha version. Should be finishing the code now and make it beta.

'''''6-3-2003''''' Started a bit on the polishing of the interface. Most things can now be turned of and stuff, except for the menu bar, when I hide it the System Menu addition get's screwed. Also worked a bit to get UnCodeX working as a Application Toolbar (like the taskbar and ICQ), but dang you have to do a lot of stuff yourself, I expected that I just had to announce that my app was a toolbar and that the ''window manager'' would do the rest. Oh, and I moved the log file to a horizontal position. Also from now on the source is available from my CVS server, watch out for messy code.

'''''6-3-2003''''' Added the run and join server commands, also implemented the compile class method. For the rest nothign serious.

'''''7-3-2003''''' Improved the App Bar feature, it should work now much better, also fixed the menu hiding. The only problem is that you can not unhide the menu bar when you are in App Bar mode. So I need to add a caption button to display the &quot;View&quot; menu since the System menu is disabled in that window type. Also need to implement to binding to other sides of the screen.

'''''10-3-2003''''' Well finally finished the AppBar feature, it can now be bound to the left and right side of the screen. Also you can start it as a app bar. Some funky shit happened here when you switched back to a normal windows. But by called two functions the other way around it was fixed. Any graphic artist in the room ? I need some original art for the buttons.

'''''10-3-2003''''' Again some points off my todo list. Still not sure about implemented the &quot;grep&quot; feature. Ofcourse it's cool to add as much functionality as possible to the app, but it should remain a 'tool' not a unusable swiss army knife. Also thought about adding a ''tool'' menu, but I don't think it's a good idea. UnCodeX is a tool, a tool that you would start from your favorite editor.

'''''11-3-2003''''' Implemented a full text search with regex support so search the body of all scanned classes, it's quite fast. Also added a search history to both the FTS and class search feature. And ofcourse added the option to ignore packages, I wonder why I forgot that one.

'''''13-3-2003''''' Here's an idea, caching the class details, it is usefull but requires a lot of memory thus create longer loading time. Another idea is to analyse on the fly when a class is selected, this however won't give you the ability to scan up the tree for inherited properties. But I don't think it would be wise to include inherited properties since usually there's already more than enough to display. 

Note, also add the default properties to the class.

'''''20-3-2003''''' Need to find a fast way to store/load class details and use it together with the last change date of a file. This way I could dynamically reload the class when it has changed (as long as it's parent hasn't changed). Also with the saving of class details I could add a much better tags support than ctags can provide. There should be a way to add those tags to the editor no matter what (using keypress simulations), but this can be tricky. But first, create a fast class detail loader/saver.

The way it should be saved for best load performance:
 UClass
 +&amp;ndash; state
 |   +&amp;ndash; function
 +&amp;ndash; enum
 +&amp;ndash; struct
 +&amp;ndash; var
 +&amp;ndash; const

Also considder adding a form of source code commenting, /** your text **/ would be a good format. These type of comment must precede an code block (var declaration, method, etc..) and then it will be used

'''''20-3-2003''''' Well added the option to add comments to the exported HTML files, it's JavaDoc style but without the additional formatting, so comments between /** and */ are used. To comment something you have to place it above the thing you want to comment. Also fixed the parser big time, strings now have their leading and trailing &quot; also names are supported.

Still can't figure out how to prevent the collapse\expand of the tree on a double click without breaking something else.

'''''25-3-2003''''' wrote a new state saver/loader this one can handle class details so from now on class will contain details when UnCodeX is started. Everything is saved ''except'' for the comments. The state file is around 800kb for my UT2003 installation. Also added a -tags command to display the properties on startup/reuse but the window displaying needs to be improved. When you double click a property item it will open the source (at that position). Note: also look into a way to click and add the property to the editor.

'''''26-3-2003''''' Improved the window placement of the Tags window, it will now also disappear when unfocused, unless you change it to a real window.

'''''28-3-2003''''' Writing help files is boring.

'''''8-4-2003''''' Been a while since I added something here. Currently working on a new hint window to give better feedback on the class properties. I also plan to improve the text copied to the clipboard when you select a class property. I want to add the function template when you select the function. So ''function Test(Pawn A)'' would be copied to the clipboard as: ''Test(Pawn)'' this way you would know what arguments to use. I'm also going to look into a way to add the selected property to the to the edit window you called it from (if possible).

'''''13-4-2003''''' Well UnCodeX is wrapping up, not much things to fix/add. So I think I can move it up to stable soon. The only things left are support for custom output modules, also maybe syntax highlighted source code to the HTML output. Ok so I guess theres still much to add. I'll shutup for now.

'''''29-4-2003''''' I've added an experimental source code preview in 065, it requires some fixing. Never worked with RichEdit before. For some reason I can't fill the content via a memory stream, only via a file on disk. Also need to figure out some other things like: ctrl+click to search selected word (requires an alternative word selector routine), hilight/focus a search result line

'''''2-5-2003''''' Argh I'm going nuts, in order to get a usefull source preview I need to make sure the words are broken correctly, by default the RichEdit control breaks on a '_' and that's bad. So I had to replace the word break method. No problem there, but I can't get my work break method working. The right side is always correct, by the left side always screws up. I can't see wtf I'm doing wrong.
:'''Mychaeel:''' Source code should't be word-wrapped at all to start with, in my opinion...
:'''El Muerte TDS:''' it isn't, but the word break method is used for selection, e.g. if you double click a word the function is called to retreive the selection area of the word.

'''''9-5-2003''''' Starting the final cleaning up and making sure the units are as solid as possible. Also started a little side project for a commandline version of the HTML Doc generation.  This might be included in the final release.

'''''10-5-2003''''' Well I'm going to scrap the idea of a commandline version, it's requires more effort to work around some issues than it would add more use to it. It's not even userfriendly (on a windows system).

'''''17-5-2003''''' I've been messing around with some extra plugins. On of them: a plugin to create DOT files to be used with [http://www.graphviz.org GraphViz] is giving me headachs. When I calculate the class/package dependencies I create a new list to hold these dependencies. But for some reason I keep getting errors from the memory manager.

Another thing I working on, haven't started on the coding tho, is a plug in to create XMI files. An XMI file is a standard format to store entity relationship models in. The Ecplise envoirement has a plugin for this and also other programs support it. But I fear I will get into the same problems with this plugin as I have with the GraphViz plug in.

'''''19-5-2003''''' '''aaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrggggggggggggggggggghhhhhhhhhhhhhhhhhh''' My god what a BPB, I .Free()'ed where I should have .Clear()'ed

'''''22-5-2003''''' The GraphViz plugin is coming a long nicely. Still on the lookout for creating a UML ouput plugin. The problem is that XMI doesn't seem that portable. Haven't found a free UML tool that can export to XMI, AragoUML and Eclipse use XMI internally but they are not exchangeable. At this rate the GraphViz plug-in will be included with the final UnCodeX version but the XMI/UML plug-in won't.

'''''25-5-2003''''' I've had it with this crap, XMI and about all UML tools are the largest piece of crap ever made. Even the IRC protocol specification is better than how all those UML tools implemented their support for the XMI standard. I've tried a couple of (semi-)free UML tools and whatever they generated/exported was not usable in any of the other tools. Copy pasting an example from the XMI specification couldn't even be read my any of the tools. Afaik Rational Rose is the only tool that might produce something usefull. Most UML tools had support for importing the native Rational Rose format, and I've been told that Rational Rose also has XMI support. Ok maybe the commercial versions of the tools I tried work ok but I can't try those because of the very high price on them. How do they expect that customers buy their software when their free/demo versions are a piece of crap.

'''''6-6-2003''''' Ok, one month to prepare another release of UnCodex, yes I'm going to enter it into the contest. A few things I want to implement before that time: inline search, external/internal comment processor support (HTML output), fix those &quot;weird&quot; bugs

'''''22-6-2003''''' Well added DDE support to UnCodeX to pass the commandline arguments to it. There's just one little problem. The Borland implication of DDE has a little bug (open connections are not closed on shutdown). I fixed that problem, was just one line. But I can't add that file to the UnCodeX source (it's not part on the no-nonsense license). So either I have to reimplement the whole DDE part myself, find a open source DDE implementation, find a workaround for the current problem or remove the DDE support.</text>
    </revision>
    <revision>
      <id>3011</id>
      <timestamp>2003-08-04T15:39:27Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==UnCodeX ==

[[Legacy:UnCodeX|UnCodeX homepage]]

===Status reports ===

'''''1-2-2003''''' Ok the first step works. I created a class tree from scratch in 35 seconds (source dir was on a SMB drive so might be faster when I read those file from a local machine). Also created a token parser to easily read the contents of the source.

'''''1-2-2003''''' Eek. Evolution just noted me on a nice issue: multiple classes with the same name in diffirent packages. So let's see you have the following:
 + Object
   |
   +- SomeClass (in Package1)
      |
      + SomeClass (in Package2)

How to detect that ?! The only way I can think of is is using a package priority list.

'''''2-2-2003''''' Argh, the whole tree creation time takes about 5 second now, but when there are classes with the same name in diffirent packages it breaks tree. And I can't think of a good method to create the tree and keep the algorithm fast enough.

'''''2-2-2003''''' Woohoo, found a way to use the package priority in the routine. Now the tree will only break when the package priority has not been set, and that doesn't matter much, I'll add a warning on startup when a package has not been prioritised

'''''2-2-2003''''' Ok if people want to test the current version you can download it , you have to edit the UnrealTree.ini file to point to the correct location. 

'''''3-2-2003''''' Started on the class parsing, consts and vars work. But I need to check on types of dynamic array, class and inline enums. It's still very fast :)

'''''3-2-2003''''' enums and vars of type array/class and inline enums are now parsed correctly. (new alpha available, right click the class tree for more options)

'''''4-2-2003''''' functions are also detected and almost parsed completely, same for structs. so at this time I'm able to convert a unreal class to an object with all the class it's features. Parsing the Actor class costs about 0.01 second. I think I can start the part of the HTML output. I'm going to implement the HTML output using templates for each part of the class, this way you can completely customise the way the HTML files are constructed.

'''''6-2-2003''''' Now working on the ouput module, I need a very fast replacement engine to use with templates. Before I start to write my own does anyone know of a good (basis) replacement engine for Delphi\ObjectPascal. I tried TemplatePower and it's too slow.

'''''6-2-2003''''' Started to work on my own parser, it's fast enough. The current alpha produces all the files except the class files, and does this in a little over 2 second (43 files). I've supplied a basic template with the alpa, replacements are between '%' tokens. Note, you have to start UnrealTree with the correct working directory set to the location of UnrealTree or else it can't find the template files.

To create the HTML files you first have to create the class tree.

'''''6-2-2003''''' Fixed a couple of parsing error related to the cpptext {} blocks and appear in the normal source. Also added a global ignore on state and code, need to work on state processing. All these cool features in UScript make it pretty hard to parse. At the moment analysing all 1380 classes takes 5.5 seconds, and creating all HTML files takes 18 seconds (class files are not complete). Anyway, so far so good, performance is realy better than I ever expected.

'''''7-2-2003''''' Again some more fixes in the analysing code. Also added a new option to scan for orphan classes. Use this to tweak the Package Priority settings, when the priority is correct you should have no orphan classes. The class overview HTML file how has some more info, the rest is coming. Also need to focus on type links

'''''10-2-2003''''' I need to scan functions inside the states because these functions are often used, that means I have to process state definitions because functions overwrite themselfs in states. Searching for an already defined method takes a lot of time since it has to go through the whole list everytime. So this could better be done on the output processing. But now the difficult part, state processing. The syntax of a state:

&lt;uscript&gt;
[modifiers] state &lt;name&gt; [extends &lt;name&gt;] 
{
  [ignores &lt;method&gt;, &lt;methods&gt;, ...;]

  [methods ...

  [label:
    code;
  label:
    code;
  ...]
  ...]
}
&lt;/uscript&gt;

The problem with this is that you don't know a function declaration until you find the correct keyword, checking on a semi colon is not enough since the following code is still parsed as a possible function. If UScript enoforced labels to be at the end of the statement this wouldn't be a problem, but is it enforced?

I also need some nice images for buttons and stuff.

'''''10-2-2003''''' State processing is done now, also fixed a couple of other bugs in the analyser. Most of the analyser code is done. My main focus is output processing. At this time it takes about 1 minute to generate all HTML files from scratch (including analysing of the code).

'''''10-2-2003''''' My current implementation of the type link caching is pretty slow, it doubles the time needed for HTML generation, and I only resolve the return values of functions not even the params. I think it's because of the site of the string list since it didn't matter if I used an straight list or an inheritance list for the class generation. So I guess I need create a diffirent type for the cache.

'''''11-2-2003''''' Found a pretty excelent StringHash class for delphi that brings back the HTML generation back to 45 seconds. There's just one issue and that's with classes with the same name, this might screw up the link to the type, but there's not much I can do about it.

'''''12-2-2003''''' Fixing things up on the alpha, beta should be there soon. Made a nice UnrealWiki style as default template.

'''''15-2-2003''''' The tree state can now be saved and loaded, it's a bit faster than rebuilding the tree when the files are already cached on the file system. Also changed the templates a bit to include titles, this way when an class doesn't have functions it won't display the function heading. Still thinking weather or not I should include inherited vars/enums/structs/... It's quite usefull.

'''''17-2-2003''''' Fixed a stupid bug in state loading, and implemented the inherited properties list. Need to cache this tho, takes a pretty long time an Object is scanned 1400 times :) Also need to add an option for max inherited classes, I don't people want to inherit upto object everytime.

'''''17-2-2003''''' Fix another bug in the state loading. Also inherited properties are now cached, makes it a lot faster, 90 seconds for all HTML files. Also put in a configurable limit (in template). Also sorted all the properties. Forgot the other things I fixed/changed.

'''''19-2-2003''''' renamed it to UnCodeX, it's a much better name. Finishing up some code, and implementing two new things, a glossary and classtree (in HTML). Need to address a few things before I make it beta, types: class&lt;..&gt; and array&lt;..&gt; also make sure all &lt; and &gt; are translated to the correct HTML special chars

'''''24-2-2003''''' fixed the array&lt;..&gt; return types of functions. Also implemented the glossary, and I need to redesign this because it's too slow and too big. Also resolved the types array&lt;&gt; and class&lt;&gt; and fixed the &lt;, &gt; and &quot; characters in the HTML output.

'''''27-2-2003''''' Improved the glossary code to create more pages (for every letter one), HTML generation now takes about 90 seconds. Also added replacements for package path and class filename so you can link to the source code from the browser, if you set things right the browser should open your favorite editor. Too bad that Mozilla really downloads the file from disk to disk and then launches the application. MSIE does open the direct file.

'''''2-3-2003''''' Finishing up the alpha version, added the Class Tree page and changed the page footer replacements. UnCodeX is almost full featured. If anyone has some ideas for extra feature please contact me.

'''''2-3-2003''''' Add support of MS HTML Help generation, all you have to do is install MS HTML Help Workshop, config UnCodeX to point to the HTML Help Workshop path and press the button (after you created the HTML files). A .chm file will be created (should spare you about 1000% diskapce.

'''''4-3-2003''''' Fixed a parser bug introduced in a few version back. Also optimized the HTML Help creation a bit. Added buttons to add/remove packages from the priority listing. Well this is the final alpha version. Should be finishing the code now and make it beta.

'''''6-3-2003''''' Started a bit on the polishing of the interface. Most things can now be turned of and stuff, except for the menu bar, when I hide it the System Menu addition get's screwed. Also worked a bit to get UnCodeX working as a Application Toolbar (like the taskbar and ICQ), but dang you have to do a lot of stuff yourself, I expected that I just had to announce that my app was a toolbar and that the ''window manager'' would do the rest. Oh, and I moved the log file to a horizontal position. Also from now on the source is available from my CVS server, watch out for messy code.

'''''6-3-2003''''' Added the run and join server commands, also implemented the compile class method. For the rest nothign serious.

'''''7-3-2003''''' Improved the App Bar feature, it should work now much better, also fixed the menu hiding. The only problem is that you can not unhide the menu bar when you are in App Bar mode. So I need to add a caption button to display the &quot;View&quot; menu since the System menu is disabled in that window type. Also need to implement to binding to other sides of the screen.

'''''10-3-2003''''' Well finally finished the AppBar feature, it can now be bound to the left and right side of the screen. Also you can start it as a app bar. Some funky shit happened here when you switched back to a normal windows. But by called two functions the other way around it was fixed. Any graphic artist in the room ? I need some original art for the buttons.

'''''10-3-2003''''' Again some points off my todo list. Still not sure about implemented the &quot;grep&quot; feature. Ofcourse it's cool to add as much functionality as possible to the app, but it should remain a 'tool' not a unusable swiss army knife. Also thought about adding a ''tool'' menu, but I don't think it's a good idea. UnCodeX is a tool, a tool that you would start from your favorite editor.

'''''11-3-2003''''' Implemented a full text search with regex support so search the body of all scanned classes, it's quite fast. Also added a search history to both the FTS and class search feature. And ofcourse added the option to ignore packages, I wonder why I forgot that one.

'''''13-3-2003''''' Here's an idea, caching the class details, it is usefull but requires a lot of memory thus create longer loading time. Another idea is to analyse on the fly when a class is selected, this however won't give you the ability to scan up the tree for inherited properties. But I don't think it would be wise to include inherited properties since usually there's already more than enough to display. 

Note, also add the default properties to the class.

'''''20-3-2003''''' Need to find a fast way to store/load class details and use it together with the last change date of a file. This way I could dynamically reload the class when it has changed (as long as it's parent hasn't changed). Also with the saving of class details I could add a much better tags support than ctags can provide. There should be a way to add those tags to the editor no matter what (using keypress simulations), but this can be tricky. But first, create a fast class detail loader/saver.

The way it should be saved for best load performance:
 UClass
 +&amp;ndash; state
 |   +&amp;ndash; function
 +&amp;ndash; enum
 +&amp;ndash; struct
 +&amp;ndash; var
 +&amp;ndash; const

Also considder adding a form of source code commenting, /** your text **/ would be a good format. These type of comment must precede an code block (var declaration, method, etc..) and then it will be used

'''''20-3-2003''''' Well added the option to add comments to the exported HTML files, it's JavaDoc style but without the additional formatting, so comments between /** and */ are used. To comment something you have to place it above the thing you want to comment. Also fixed the parser big time, strings now have their leading and trailing &quot; also names are supported.

Still can't figure out how to prevent the collapse\expand of the tree on a double click without breaking something else.

'''''25-3-2003''''' wrote a new state saver/loader this one can handle class details so from now on class will contain details when UnCodeX is started. Everything is saved ''except'' for the comments. The state file is around 800kb for my UT2003 installation. Also added a -tags command to display the properties on startup/reuse but the window displaying needs to be improved. When you double click a property item it will open the source (at that position). Note: also look into a way to click and add the property to the editor.

'''''26-3-2003''''' Improved the window placement of the Tags window, it will now also disappear when unfocused, unless you change it to a real window.

'''''28-3-2003''''' Writing help files is boring.

'''''8-4-2003''''' Been a while since I added something here. Currently working on a new hint window to give better feedback on the class properties. I also plan to improve the text copied to the clipboard when you select a class property. I want to add the function template when you select the function. So ''function Test(Pawn A)'' would be copied to the clipboard as: ''Test(Pawn)'' this way you would know what arguments to use. I'm also going to look into a way to add the selected property to the to the edit window you called it from (if possible).

'''''13-4-2003''''' Well UnCodeX is wrapping up, not much things to fix/add. So I think I can move it up to stable soon. The only things left are support for custom output modules, also maybe syntax highlighted source code to the HTML output. Ok so I guess theres still much to add. I'll shutup for now.

'''''29-4-2003''''' I've added an experimental source code preview in 065, it requires some fixing. Never worked with RichEdit before. For some reason I can't fill the content via a memory stream, only via a file on disk. Also need to figure out some other things like: ctrl+click to search selected word (requires an alternative word selector routine), hilight/focus a search result line

'''''2-5-2003''''' Argh I'm going nuts, in order to get a usefull source preview I need to make sure the words are broken correctly, by default the RichEdit control breaks on a '_' and that's bad. So I had to replace the word break method. No problem there, but I can't get my work break method working. The right side is always correct, by the left side always screws up. I can't see wtf I'm doing wrong.
:'''Mychaeel:''' Source code should't be word-wrapped at all to start with, in my opinion...
:'''El Muerte TDS:''' it isn't, but the word break method is used for selection, e.g. if you double click a word the function is called to retreive the selection area of the word.

'''''9-5-2003''''' Starting the final cleaning up and making sure the units are as solid as possible. Also started a little side project for a commandline version of the HTML Doc generation.  This might be included in the final release.

'''''10-5-2003''''' Well I'm going to scrap the idea of a commandline version, it's requires more effort to work around some issues than it would add more use to it. It's not even userfriendly (on a windows system).

'''''17-5-2003''''' I've been messing around with some extra plugins. On of them: a plugin to create DOT files to be used with [http://www.graphviz.org GraphViz] is giving me headachs. When I calculate the class/package dependencies I create a new list to hold these dependencies. But for some reason I keep getting errors from the memory manager.

Another thing I working on, haven't started on the coding tho, is a plug in to create XMI files. An XMI file is a standard format to store entity relationship models in. The Ecplise envoirement has a plugin for this and also other programs support it. But I fear I will get into the same problems with this plugin as I have with the GraphViz plug in.

'''''19-5-2003''''' '''aaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrggggggggggggggggggghhhhhhhhhhhhhhhhhh''' My god what a BPB, I .Free()'ed where I should have .Clear()'ed

'''''22-5-2003''''' The GraphViz plugin is coming a long nicely. Still on the lookout for creating a UML ouput plugin. The problem is that XMI doesn't seem that portable. Haven't found a free UML tool that can export to XMI, AragoUML and Eclipse use XMI internally but they are not exchangeable. At this rate the GraphViz plug-in will be included with the final UnCodeX version but the XMI/UML plug-in won't.

'''''25-5-2003''''' I've had it with this crap, XMI and about all UML tools are the largest piece of crap ever made. Even the IRC protocol specification is better than how all those UML tools implemented their support for the XMI standard. I've tried a couple of (semi-)free UML tools and whatever they generated/exported was not usable in any of the other tools. Copy pasting an example from the XMI specification couldn't even be read my any of the tools. Afaik Rational Rose is the only tool that might produce something usefull. Most UML tools had support for importing the native Rational Rose format, and I've been told that Rational Rose also has XMI support. Ok maybe the commercial versions of the tools I tried work ok but I can't try those because of the very high price on them. How do they expect that customers buy their software when their free/demo versions are a piece of crap.

'''''6-6-2003''''' Ok, one month to prepare another release of UnCodex, yes I'm going to enter it into the contest. A few things I want to implement before that time: inline search, external/internal comment processor support (HTML output), fix those &quot;weird&quot; bugs

'''''22-6-2003''''' Well added DDE support to UnCodeX to pass the commandline arguments to it. There's just one little problem. The Borland implication of DDE has a little bug (open connections are not closed on shutdown). I fixed that problem, was just one line. But I can't add that file to the UnCodeX source (it's not part on the no-nonsense license). So either I have to reimplement the whole DDE part myself, find a open source DDE implementation, find a workaround for the current problem or remove the DDE support.

----

'''Mychaeel:''' Mind if I, for the pure sake of aesthetics, rename this subpage to &quot;Developer Journal History&quot;?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS/MaskedCompare</title>
    <id>1142</id>
    <revision>
      <id>2997</id>
      <timestamp>2003-02-04T09:29:50Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:MaskedCompare|MaskedCompare]]</text>
    </revision>
    <revision>
      <id>2998</id>
      <timestamp>2003-02-04T09:28:11Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>finally fixed this function</comment>
      <text xml:space="preserve">With the algoritm below you can compare a string with a wild card string.

There are two types of wild cards: * to match zero or more characters and ? to match a single character

&lt;uscript&gt;
// Internal function used for MaskedCompare
static private final function bool _match(out string mask, out string target)
{
  local string m, mp, cp;
  m = Left(mask, 1);
  while ((target != &quot;&quot;) &amp;&amp; (m != &quot;*&quot;))
  {
    if ((m != Left(target, 1)) &amp;&amp; (m != &quot;?&quot;)) return false;
    mask = Mid(Mask, 1);
    target = Mid(target, 1);
		m = Left(mask, 1);
  }

  while (target != &quot;&quot;) 
  {
		if (m == &quot;*&quot;) 
    {
      mask = Mid(Mask, 1);
			if (mask == &quot;&quot;) return true; // only &quot;*&quot; mask -&gt; always true
			mp = mask;
			cp = Mid(target, 1);
      m = Left(mask, 1);
		} 
    else if ((m == Left(target, 1)) || (m == &quot;?&quot;)) 
    {
			mask = Mid(Mask, 1);
      target = Mid(target, 1);
  		m = Left(mask, 1);
		} 
    else 
    {
			mask = mp;
      m = Left(mask, 1);
			target = cp;
      cp = Mid(cp, 1);
		}
	}

  while (Left(mask, 1) == &quot;*&quot;) 
  {
		mask = Mid(Mask, 1);
	}
	return (mask == &quot;&quot;);
}

// Compare a string with a mask
// Wildcards: * = X chars; ? = 1 char
// Wildcards can appear anywhere in the mask
static final function bool MaskedCompare(coerce string target, string mask, optional bool casesensitive)
{
  if (!casesensitive)
  {
    mask = Caps(mask);
    target = Caps(target);
  }
  if (mask == &quot;*&quot;) return true;

  return _match(mask, target);
}
&lt;/uscript&gt;

'''El Muerte TDS:''' move this out of my wallet garden</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte TDS/WUtils</title>
    <id>1143</id>
    <revision>
      <id>2999</id>
      <timestamp>2003-02-04T09:31:54Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:WUtils|WUtils]]</text>
    </revision>
    <revision>
      <id>3000</id>
      <timestamp>2003-01-09T17:32:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| '''Latest version: 103'''

 [http://www.drunksnipers.com/files/ut2003/wUtils-103.zip download the latest version]

}}

UT2003 has a nice set of methods and structures defined in XGame.xUtils, but there are more common used methods and don't need to be rewritten every time somebody needs them. That's why I've started wUtils to create a package containing another set of usefull methods.

Feel free to contribute more usefull methods to this package.

You are completely free to use wUtils and distribute it with your mod. You may also use only part of the code of wUtils. You are not allowed to distribute a changed version of wUtils under the same name, this is to prevent confusion.

'''''Note:''''' if you use wUtils in your mod, please check to this page to check if there's a newer version available before you release the mod.

'''''Note 2:''''' feel free to contribute methods/classes/... you think should belong into this package.

==Usage ==

To use the methods from wUtils place wUtils in your EditPackages list.

Then call the methods via:

&lt;uscript&gt;
class'wUtilsClass'.static.method()
&lt;/uscript&gt;

for example:

&lt;uscript&gt;
mystring = class'wString'.static.Trim(mystring);
&lt;/uscript&gt;

==Classes of wUtils ==

===wString ===
;function string StrShift(out string line, string delim, optional string quotechar): this will shift the first element of the line (delimited by delim). ''fixed'': delim can be longer that 1 char (v101) ''added'': optional quote char so you can use: &quot;one item&quot; &quot;second item&quot; (v103)
;function string StrReplace(coerce string target, array&lt;string&gt; replace, array&lt;string&gt; with, optional bool bOnlyFirst): string replace that accepts arrays, usefull if you want to implement a bad word filter, optional bOnlyFirst added in v101
;function string Lower(coerce string Text): like Caps but lowers strings
;function bool IsUpper(coerce string S): check if a string is all uppercase
;function bool IsLower(coerce string S): check if a string is all lowercase
;function string LTrim(coerce string S): trims leading spaces/tabs
;function string RTrim(coerce string S): trims trailing spaces/tabs
;function string Trim(coerce string S): trims leading and trailing spaces/tabs
;function bool MaskedCompare(coerce string target, string mask, optional bool casesensitive): check target using mask, mask can contain the following wildcards: * for X chars, or ? for 1 char, check [[Legacy:El_Muerte_TDS/MaskedCompare|my source]] if it can be optimized.
;function int InStrFrom(coerce string StrText, coerce string StrPart, optional int OffsetStart): like InStr except you can specify where to start the search.
;function bool ReplaceOption(out string Options, string Key, string NewValue, optional bool bAddIfMissing, optional out string OldValue, optional string delim) : Allows you to quickly change a value in the Options string used in Login and PostLogin. ([[Legacy:Nomad/WUtils|Source]]) 
;function string Capitalize(coerce string S) ''(v101)'': will change &quot;this is a string&quot; to &quot;This Is A String&quot; 
;function int Split2(coerce string src, string delim, out array&lt;string&gt; parts, optional bool ignoreBlanks, optional string quotechar) ''(v101)'': fixed version of split. Fixed: first char can be a delim, last char can be a space. Added: delim as a string. ''Added'': ignoreblanks: &quot;||&quot; results in an empty array, and quotechar. (v103)
;function string StrSubst(coerce string target, optional string r0, optional string r1, ... , optional string r9) ''(v102)'': StrSubst will replace the occurances of %s in target with the value of r#, where # is the n'th occurance of %s
;function string ReplaceInString(coerce string src, int from, int length, coerce string with) ''(v102)'' : replaces part of a string: &lt;code&gt;ReplaceInString(&quot;A stupid string.&quot;, 2, 6, &quot;good&quot;) == &quot;A good string.&quot;&lt;/code&gt;

----

'''nomad:''' I was thinking of doing something similar to wUtils, good job I came across this page. I've added InStrPlus() and ReplaceOption() with links to the source code.

'''El Muerte TDS:''' took Mychaeel's InStrFrom which is better, also changed a bit of code of ReplaceOption

'''Wormbo:''' How about a function that replaces a part of a string based on a given start and length of the section to replace?&lt;br /&gt;e.g.: &lt;code&gt;ReplaceInString(&quot;A stupid string.&quot;, 2, 6, &quot;good&quot;) == &quot;A good string.&quot;&lt;/code&gt;

'''El Muerte TDS:''' that's indeed a usefull function, I'll add it to the next release. Update: ReplaceInString requires more lines to call then to realy implement :)

===wMath ===
;function bool IsInt(coerce string Param, optional bool bPositiveOnly) : checks if param is an integer
;function bool IsFloat(coerce string Param, optional bool bPositiveOnly) : checks if param is a float (or int)
;function CRC32Init(out int CrcTable[256]) ''(v101)'' : init function to call (once) before you use CRC32
;function int CRC32(coerce string Text, int CrcTable[256]) ''(v101)'' : calculate the CRC32 hash of a string, more info: [[Legacy:CRC32|CRC32]]
;function int PowerMod(int C, int D, int N) ''(v102)'' : this will calculate &lt;code&gt;x^e mod y&lt;/code&gt;
;function int RSAPublicKeygen(int p, int q) ''(v102)'' : calculate encode key using primes P and Q, [[Legacy:RSA|RSA]]
;function int RSAPrivateKeygen(int E, int p, int q) ''(v102)'' : calculate decode key, [[Legacy:RSA|RSA]]
;function RSAEncode(coerce string data, int E, int N, out array&lt;int&gt; data2) ''(v102)'' : encode data using the keys E and N, [[Legacy:RSA|RSA]]
;function string RSADecode(array&lt;int&gt; data, int D, int N) ''(v102)'' : encode data using the keys D and N, [[Legacy:RSA|RSA]]

===wArray ===
;function string Join(array&lt; string &gt; ar, optional string delim, optional bool bIgnoreEmpty) : join the array elements to a string using delimiter 'delim', added the optional bIgnoreEmpty (v101)
;function string ShiftS(out array&lt; string &gt; ar) : shift the first element of an string array
;function object ShiftO(out array&lt; object &gt; ar) : shift the first element of an object array
;function int ShiftI(out array&lt; int &gt; ar) : shift the first element of an int array
;function array&lt;string&gt; AddS(array&lt;string&gt; A, array&lt;string&gt; B): join the two arrays
;function array&lt;int&gt; AddI(array&lt;int&gt; A, array&lt;int&gt; B): join the two arrays
;function array&lt;object&gt; AddO(array&lt;object&gt; A, array&lt;object&gt; B): join the two arrays
;function array&lt;string&gt; RemoveS(array&lt;string&gt; A, array&lt;string&gt; B): remove elements in B from A
;function array&lt;int&gt; RemoveI(array&lt;int&gt; A, array&lt;int&gt; B): remove elements in B from A
;function array&lt;object&gt; RemoveO(array&lt;object&gt; A, array&lt;object&gt; B): remove elements in B from A
;function SortS(out array&lt;string&gt; ar, optional bool bCaseInsenstive) : sort a string array
;function SortI(out array&lt;int&gt; ar) :  sort an int array
;function int MaxI(array&lt;int&gt;) ''(v101)'': get the highest value of an array
;function int MinI(array&lt;int&gt;) ''(v101)'': get the lowest value of an array
;function string MaxS(array&lt;string&gt;) ''(v101)'': get the highest value of an array
;function string MinS(array&lt;string&gt;) ''(v101)'': get the lowest value of an array
;function int BinarySearch(array&lt;string&gt; Myarray, string SearchString, optional int Low, optional int High, optional bool bIgnoreCase) ''(v103)'': searches a sorted array for a matching element, returns the index if found or -1
;function string GetCommonBegin(array&lt;string&gt; slist) ''(v103)'': returns the common beginning of elements in the array

==Thoughts ==

Operators require you to define a precedence: operator(24) for example. This is only to define what operator comes first, for example: 1+2*3+4 will get a bullshit result if the operator precedence isn't set correctly. Deciding the operator precedence for numeric types is easy, but what to do for objects and strings, how do I decide what is more important. If you can't decide which of the two is more important then their precendence is equal.

Bah, operators suck.

'''nomad''': Can you define new operators in UScript?? A string version of += would be nice.

'''El Muerte [TDS]''': Yes you can define new operators, but you can use them from a general class like wUtils, that's why operators suck. Maybe this could have been possible if &quot;import package&quot; did something usefull.

'''Wormbo:''' Two small requests/suggestions: You could name the packages xUtils&lt;version&gt;.u to prevent version conflicts. And you could zip them without the wUtils directory in the ZIP file. 

'''El Muerte TDS:''' Got a good point there. And WinZip sucks, where can I display the feature to include the dir name when compressing a directory ?

'''Wormbo:''' Currently the zip file content is \wUtils\wUtils.u, \wUtils\Readme.txt, \wUtils\source.zip and \wUtils\Licence.txt. Archiving them without that wUtils directory in them strikes me as more efficient. With Winzip (or any other archiver) you only select all the files and put them in the archive. In Winzip's Add dialog there should be an option called &quot;Preserve Pathnames&quot; or &quot;Save Pathnames&quot; or something like that.

For zipping a complex directory structure you have to prepare the directories before running Winzip.
 wUtils      ''this one will be added to the zip file''
  +- Help
  +- wUtils  ''the source files, maybe just put the source.zip here''
  |   +- Classes
  + System

With Winzip 7.0 (the version I'm using) you have to select the wUtils directory and choose &quot;add to zip&quot; from the context menu. Other programs (e.g. Winrar) allow (or even require) you to select the subdirectories and add them to the archive, but Winzip 7 only puts the files in those subdirectories directly into the zip file.

'''El Muerte TDS:''' WinZip 7 works fine, but in WinZip 8 something changed that it will add the directory name when you compress it, I think I'm going to switch back to 7

----

'''Wormbo:''' How about a wGraphics or wDraw class? (or think up a better name if you want) It could offer draw fucntions like the ones from UT's [[Legacy:UWindowWindow|UWindowWindow]] or UT2k3's [[Legacy:HudBase|HudBase]], only better of course. :)

'''El Muerte TDS:''' sure, as long as it can be static

:'''Wormbo:''' The static shouldn't be the problem here.

'''Mychaeel:''' If you make the functions both final and static and then try to call such a function on an uninitialized variable of that class... do you get an &quot;Accessed None&quot; error message or does the engine realize that the variable's type (not its value) is all it needs to identify the called function...?

'''Wormbo:''' I guess that's worth a try, but I'm almost sure this will create an Accessed None, even though the final keyword would make it pretty clear which function would be executed.

==Downloads ==

[http://www.drunksnipers.com/files/ut2003/wUtils-100.zip Release 100] (includes source)

[http://www.drunksnipers.com/files/ut2003/wUtils-101.zip Release 101] (includes source)

[http://www.drunksnipers.com/files/ut2003/wUtils-102.zip Release 102] (includes source)

[http://www.drunksnipers.com/files/ut2003/wUtils-103.zip Release 103] (includes source)

===CVS access ===

If you want bleeding edge you can pull the latest version from my CVS
; CVS Web Repository : http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/wUtils
; CVS Root for anonymous access : &lt;nowiki&gt;:pserver:anonymous@el-muerte.student.utwente.nl:/usr/local/cvsroot/UT2003&lt;/nowiki&gt;</text>
    </revision>
    <revision>
      <id>3001</id>
      <timestamp>2003-02-02T20:49:08Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| '''Latest version: 103'''

 [http://www.drunksnipers.com/files/ut2003/wUtils-103.zip download the latest version]

}}

UT2003 has a nice set of methods and structures defined in XGame.xUtils, but there are more common used methods and don't need to be rewritten every time somebody needs them. That's why I've started wUtils to create a package containing another set of usefull methods.

Feel free to contribute more usefull methods to this package.

You are completely free to use wUtils and distribute it with your mod. You may also use only part of the code of wUtils. You are not allowed to distribute a changed version of wUtils under the same name, this is to prevent confusion.

'''''Note:''''' if you use wUtils in your mod, please check to this page to check if there's a newer version available before you release the mod.

'''''Note 2:''''' feel free to contribute methods/classes/... you think should belong into this package.

==Usage ==

To use the methods from wUtils place wUtils in your EditPackages list.

Then call the methods via:

&lt;uscript&gt;
class'wUtilsClass'.static.method()
&lt;/uscript&gt;

for example:

&lt;uscript&gt;
mystring = class'wString'.static.Trim(mystring);
&lt;/uscript&gt;

==Classes of wUtils ==

===wString ===
;function string StrShift(out string line, string delim, optional string quotechar): this will shift the first element of the line (delimited by delim). ''fixed'': delim can be longer that 1 char (v101) ''added'': optional quote char so you can use: &quot;one item&quot; &quot;second item&quot; (v103)
;function string StrReplace(coerce string target, array&lt;string&gt; replace, array&lt;string&gt; with, optional bool bOnlyFirst): string replace that accepts arrays, usefull if you want to implement a bad word filter, optional bOnlyFirst added in v101
;function string Lower(coerce string Text): like Caps but lowers strings
;function bool IsUpper(coerce string S): check if a string is all uppercase
;function bool IsLower(coerce string S): check if a string is all lowercase
;function string LTrim(coerce string S): trims leading spaces/tabs
;function string RTrim(coerce string S): trims trailing spaces/tabs
;function string Trim(coerce string S): trims leading and trailing spaces/tabs
;function bool MaskedCompare(coerce string target, string mask, optional bool casesensitive): check target using mask, mask can contain the following wildcards: * for X chars, or ? for 1 char, check [MaskedCompare|my source]] if it can be optimized. There's a a bug in this function. It's fixed with v104.
;function int InStrFrom(coerce string StrText, coerce string StrPart, optional int OffsetStart): like InStr except you can specify where to start the search.
;function bool ReplaceOption(out string Options, string Key, string NewValue, optional bool bAddIfMissing, optional out string OldValue, optional string delim) : Allows you to quickly change a value in the Options string used in Login and PostLogin. ([[Legacy:Nomad/WUtils|Source]]) 
;function string Capitalize(coerce string S) ''(v101)'': will change &quot;this is a string&quot; to &quot;This Is A String&quot; 
;function int Split2(coerce string src, string delim, out array&lt;string&gt; parts, optional bool ignoreBlanks, optional string quotechar) ''(v101)'': fixed version of split. Fixed: first char can be a delim, last char can be a space. Added: delim as a string. ''Added'': ignoreblanks: &quot;||&quot; results in an empty array, and quotechar. (v103)
;function string StrSubst(coerce string target, optional string r0, optional string r1, ... , optional string r9) ''(v102)'': StrSubst will replace the occurances of %s in target with the value of r#, where # is the n'th occurance of %s
;function string ReplaceInString(coerce string src, int from, int length, coerce string with) ''(v102)'' : replaces part of a string: &lt;code&gt;ReplaceInString(&quot;A stupid string.&quot;, 2, 6, &quot;good&quot;) == &quot;A good string.&quot;&lt;/code&gt;

----

'''nomad:''' I was thinking of doing something similar to wUtils, good job I came across this page. I've added InStrPlus() and ReplaceOption() with links to the source code.

'''El Muerte TDS:''' took Mychaeel's InStrFrom which is better, also changed a bit of code of ReplaceOption

'''Wormbo:''' How about a function that replaces a part of a string based on a given start and length of the section to replace?&lt;br /&gt;e.g.: &lt;code&gt;ReplaceInString(&quot;A stupid string.&quot;, 2, 6, &quot;good&quot;) == &quot;A good string.&quot;&lt;/code&gt;

'''El Muerte TDS:''' that's indeed a usefull function, I'll add it to the next release. Update: ReplaceInString requires more lines to call then to realy implement :)

===wMath ===
;function bool IsInt(coerce string Param, optional bool bPositiveOnly) : checks if param is an integer
;function bool IsFloat(coerce string Param, optional bool bPositiveOnly) : checks if param is a float (or int)
;function CRC32Init(out int CrcTable[256]) ''(v101)'' : init function to call (once) before you use CRC32
;function int CRC32(coerce string Text, int CrcTable[256]) ''(v101)'' : calculate the CRC32 hash of a string, more info: [[Legacy:CRC32|CRC32]]
;function int PowerMod(int C, int D, int N) ''(v102)'' : this will calculate &lt;code&gt;x^e mod y&lt;/code&gt;
;function int RSAPublicKeygen(int p, int q) ''(v102)'' : calculate encode key using primes P and Q, [[Legacy:RSA|RSA]]
;function int RSAPrivateKeygen(int E, int p, int q) ''(v102)'' : calculate decode key, [[Legacy:RSA|RSA]]
;function RSAEncode(coerce string data, int E, int N, out array&lt;int&gt; data2) ''(v102)'' : encode data using the keys E and N, [[Legacy:RSA|RSA]]
;function string RSADecode(array&lt;int&gt; data, int D, int N) ''(v102)'' : encode data using the keys D and N, [[Legacy:RSA|RSA]]

===wArray ===
;function string Join(array&lt; string &gt; ar, optional string delim, optional bool bIgnoreEmpty) : join the array elements to a string using delimiter 'delim', added the optional bIgnoreEmpty (v101)
;function string ShiftS(out array&lt; string &gt; ar) : shift the first element of an string array
;function object ShiftO(out array&lt; object &gt; ar) : shift the first element of an object array
;function int ShiftI(out array&lt; int &gt; ar) : shift the first element of an int array
;function array&lt;string&gt; AddS(array&lt;string&gt; A, array&lt;string&gt; B): join the two arrays
;function array&lt;int&gt; AddI(array&lt;int&gt; A, array&lt;int&gt; B): join the two arrays
;function array&lt;object&gt; AddO(array&lt;object&gt; A, array&lt;object&gt; B): join the two arrays
;function array&lt;string&gt; RemoveS(array&lt;string&gt; A, array&lt;string&gt; B): remove elements in B from A
;function array&lt;int&gt; RemoveI(array&lt;int&gt; A, array&lt;int&gt; B): remove elements in B from A
;function array&lt;object&gt; RemoveO(array&lt;object&gt; A, array&lt;object&gt; B): remove elements in B from A
;function SortS(out array&lt;string&gt; ar, optional bool bCaseInsenstive) : sort a string array
;function SortI(out array&lt;int&gt; ar) :  sort an int array
;function int MaxI(array&lt;int&gt;) ''(v101)'': get the highest value of an array
;function int MinI(array&lt;int&gt;) ''(v101)'': get the lowest value of an array
;function string MaxS(array&lt;string&gt;) ''(v101)'': get the highest value of an array
;function string MinS(array&lt;string&gt;) ''(v101)'': get the lowest value of an array
;function int BinarySearch(array&lt;string&gt; Myarray, string SearchString, optional int Low, optional int High, optional bool bIgnoreCase) ''(v103)'': searches a sorted array for a matching element, returns the index if found or -1
;function string GetCommonBegin(array&lt;string&gt; slist) ''(v103)'': returns the common beginning of elements in the array

===wTime ''(v104)'' ===
;function mktime(int year, int mon, int day, int hour, int min, int sec): create a unix timestamp [http://forums.beyondunreal.com/showthread.php?threadid=148603 148603]
;function string date(string format, optional int year, optional int mon, optional int day, optional int hour, optional int min, optional int sec): format a time to a string
;struct DateTime: holds int year,month,day,hour,minute,second
;function int SpanSeconds(DateTime Later, DateTime Earlier): number of seconds between both times
;function string date2(string format, DateTime dt): same as date but uses a DateTime as input

==Thoughts ==

Operators require you to define a precedence: operator(24) for example. This is only to define what operator comes first, for example: 1+2*3+4 will get a bullshit result if the operator precedence isn't set correctly. Deciding the operator precedence for numeric types is easy, but what to do for objects and strings, how do I decide what is more important. If you can't decide which of the two is more important then their precendence is equal.

Bah, operators suck.

'''nomad''': Can you define new operators in UScript?? A string version of += would be nice.

'''El Muerte [TDS]''': Yes you can define new operators, but you can use them from a general class like wUtils, that's why operators suck. Maybe this could have been possible if &quot;import package&quot; did something usefull.

'''Wormbo:''' Two small requests/suggestions: You could name the packages xUtils&lt;version&gt;.u to prevent version conflicts. And you could zip them without the wUtils directory in the ZIP file. 

'''El Muerte TDS:''' Got a good point there. And WinZip sucks, where can I display the feature to include the dir name when compressing a directory ?

'''Wormbo:''' Currently the zip file content is \wUtils\wUtils.u, \wUtils\Readme.txt, \wUtils\source.zip and \wUtils\Licence.txt. Archiving them without that wUtils directory in them strikes me as more efficient. With Winzip (or any other archiver) you only select all the files and put them in the archive. In Winzip's Add dialog there should be an option called &quot;Preserve Pathnames&quot; or &quot;Save Pathnames&quot; or something like that.

For zipping a complex directory structure you have to prepare the directories before running Winzip.
 wUtils      ''this one will be added to the zip file''
  +- Help
  +- wUtils  ''the source files, maybe just put the source.zip here''
  |   +- Classes
  + System

With Winzip 7.0 (the version I'm using) you have to select the wUtils directory and choose &quot;add to zip&quot; from the context menu. Other programs (e.g. Winrar) allow (or even require) you to select the subdirectories and add them to the archive, but Winzip 7 only puts the files in those subdirectories directly into the zip file.

'''El Muerte TDS:''' WinZip 7 works fine, but in WinZip 8 something changed that it will add the directory name when you compress it, I think I'm going to switch back to 7

----

'''Wormbo:''' How about a wGraphics or wDraw class? (or think up a better name if you want) It could offer draw fucntions like the ones from UT's [[Legacy:UWindowWindow|UWindowWindow]] or UT2k3's [[Legacy:HudBase|HudBase]], only better of course. :)

'''El Muerte TDS:''' sure, as long as it can be static

:'''Wormbo:''' The static shouldn't be the problem here.

'''Mychaeel:''' If you make the functions both final and static and then try to call such a function on an uninitialized variable of that class... do you get an &quot;Accessed None&quot; error message or does the engine realize that the variable's type (not its value) is all it needs to identify the called function...?

'''Wormbo:''' I guess that's worth a try, but I'm almost sure this will create an Accessed None, even though the final keyword would make it pretty clear which function would be executed.

==Downloads ==

[http://www.drunksnipers.com/files/ut2003/wUtils-100.zip Release 100] (includes source)

[http://www.drunksnipers.com/files/ut2003/wUtils-101.zip Release 101] (includes source)

[http://www.drunksnipers.com/files/ut2003/wUtils-102.zip Release 102] (includes source)

[http://www.drunksnipers.com/files/ut2003/wUtils-103.zip Release 103] (includes source)

===CVS access ===

If you want bleeding edge you can pull the latest version from my CVS
; CVS Web Repository : http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/wUtils
; CVS Root for anonymous access : &lt;nowiki&gt;:pserver:anonymous@el-muerte.student.utwente.nl:/usr/local/cvsroot/UT2003&lt;/nowiki&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte/Developer Journal</title>
    <id>1178</id>
    <revision>
      <id>3074</id>
      <timestamp>2006-04-07T07:32:40Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Journal History==
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 1]]
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 2]]
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 3]]

==14-06-2004==

New phase, clean dev log.

Started working on Unreal Kart (like I said). Now the difficult part will start, the actual development. Could use another mapper to help with creating some initial maps to improve the development of the tracks. I hope [[Legacy:AlphaOne|AlphaOne]] will be able to use the experience he get got while making StrangeLove on the karts. They don't move like I want. I also need to write a little tutorial on how to map for UKart, this should be pretty simple (use our Track volumes to define the track, and how to use the player positions).

==14-07-2004==

MSUC Phase 3 Tools finalists have been announced :(

'''Mychaeel:''' Yeah :-/ &amp;ndash; I can only guess that they focused on tools for end users or those which directly benefit end users... the only reason why I can imagine that umod Wizard is a finalist and UnCodeX is not...

==18-07-2004==

Well, I was planning to keep regular updates on the progress of my new mod: UnrealKart, both the actual development and project organisation. But so far nothing. So here's a short recap of the past.

This is my first mod where I take the lead for organisation, so I have no idea if it's going well or not compared on how other mod teams are doing. We started slow, in fact the mod idea exists for at least 2 months now, I think, but the real implementation work was only started recently. We had a little &quot;break&quot; until phase 3 was closed, so that people could finish thier other creations to enter. UnrealKart is not going to be a mod to be entered in the MSUC, it's going to be a mod made for fun and because we like it. That doesn't mean I won't submit it for Phase 4 (it's a good PR opertunity if you get in the honorable mentions), but only if we have a release candidate. Back to the project organisation. Recruiting people is quite difficult, sure a mod team doesn't need to have a lot of people on it. But even getting a few members that can dedicate them to the project is quite difficult. There are a lot of people interested in doing something for the mod, but not on a semi-dedicated level. By the time we have a release candidate I expect quite some people to contribute to the project (e.g. Create a track or maybe even a kart), but currently we are not on that stage yet, so it's useless for the moment. Right now 6 people dedicated for the project (2 programmers, 1 vehicle modeler, 1 2D artist and 2 mappers). 

As I said, getting people to work on a mod is a though job. You want people that have some experience, so it's easy for them to quickly addept to the dynamic of mod development. The guy (SithLegend) that did the current [http://mods.beyondunreal.com/images/31/big/ukart.jpg?wikifix kart model] wanted us to help him with a couple of creations of him, I didn't have any problems with that. Specially not based on his [http://sithlegend.com/annihilationarsenal/ previous work]. Our 2D (Zeh) artist can handle himself, he made some very nice [http://mods.beyondunreal.com/images/31/big/hud4.jpg?wikifix concepts for the HUD]. Our mappers however need some guidance in their process, this isn't bad. Our mod is a team effort, the team makes the mod, not a group of individuals.

That's all for now, have to feed the kat+kittens of a friend of mine, when I'm back I'll tell something about some programming issues.

===part 2===

So far there have been a couple of programming issues I had to solve. The first one was to keep track if the races where either on-track or off-track. An easy solution for this would be to use volumes to tell what the track is. When player enters the volume to set the current volume to that volume. When a user leaves a volume you will check if the volume that was left is the same as the current volume, when they are the same then the user left the track. So when volumes overlap you will first enter a new track volume, this will set the current volume. When you then leave the previous volume the above check fails, so the user must still be on track.

Well that was easy, but now, how do you check a player was following the track. An obvious solution would be to use checkpoints or to check if a user entered each volume. The check so see if every volume was passed won't work because I want the racer to be able to race off-track for shortcuts, or just be a terrible driver. So check points it is. For our mod the checkpoints would be invisible. There are different ways to implement checkpoints, since we already have volumes to define the tracks we can use the volumes as checkpoints. These checkpoints should then be place on places where a racer has to go through. The racer must not be able to pass this checkpoint off-track, this just sucks becuase the racer would then have to go back to pass the checkpoint. Now there are two ways to check if a user passed the right checkpoints. You could keep a list of checkpoints available and check if a user passed them. But this has a couple of issues: alternative routes or shortcuts, where to go. So I added a variable to our volume class that contains the next possible track volumes, usualy this would be only one volume but in case of short cuts or alternative routes this can be more than one. Now every time a user enters a volume it will check if this volume is in the list of &quot;next volumes&quot;. The list of &quot;next volumes&quot; is stored for each player seperately, when a user entered the &quot;next volume&quot; the current list will be reset with the list of the next volume. This way you will always know where to go to. Ofcourse the mapper will have to set up the volumes correcty. Every track requires to have a finish volume, this finish volume must be the checpoint first volume. When a user enters this volume it will be checked if the volume was &quot;queued&quot;, if the volume was queued the player completed a lap. The finish volume is the only checkpoint that players could miss by racing off track, simply because this checkpoint is always visible. Because we know what volumes should be next we can also direct the racers where to go.

Now that we know how to follow the track we can also keep track of player positions. For this a list has to be contructed that contains the volumes to follow in order (e.g. the next volumes). Now all we have to do is sort the players based on their lap count, next volume, distance to the closest next volume (in that order).

'''T1:''' In the mod I'm working on (Momentum Control, a wipeout-ish racing game.), I was planning to use the same method that the bombing run goal uses (An invisible smesh in the center that does the scoring when it gets Touch()'ed.). But volumes are an excellent idea, because you could detect if the player just goes around a checkpoint.  Do you mind if I use that idea in Momentum Control?

'''El Muerte:''' published ideas are there to be applied/used/etc. (I think). Anyway, I don't mind, that's why post stuff on the wiki, so that others can find a use for it.

'''T1:''' Thanks. I just was asking because some people are strange and would get mad or something like that over it.

==21-07-2004==

''Report from yesterday.''

Worked out the racer position calculation. At the beginning of the race, when the racers are placed on the grid, I will do a complete calculation of all positions, during that I set for each player the next and previous player in their PRI. After that each PRI will check if the racer passed the ''next'' player, if so it will update the linked list and broadcast a message to all players about this position change. I plan to use this LocalMessage to update the HUD of each player to notify the player position change. 

I had a couple of issues testing this, with 3 clients the positions where incorrect. It appeared that I made a stupid mistake for the start position calculation.

When players join they will get a start position assigned, first to join will start on the last position (depening on the number of players/bots and stuff). Note: we will also ship a gamerule that will save the last finish positions for each player and use those to remember the start position (e.g. finish last will grant you to start first in the next MP game). Anyway, I made the following stupid mistake:

&lt;uscript&gt;
n = StartPositions-1;
while (n &lt; 255)
{
	for (i = 0; i &lt; idxs.length; i++)
	{
		if (idxs[i] == n)
		{
			n--;
			continue;
		}
	}
	break; // found position
}
&lt;/uscript&gt;

&lt;code&gt;idxs&lt;/code&gt; is a list with already in use start positions, the continue was ment to have effect on the while and not the for statement. So the 3rd client would get the same start position as the 2nd :)

Another issue I'm working on is the power-up selector power-up. It's a special power-up that contains a list of real power-ups that will cycle. After it has bee activated (or timeout) it will slow down the cycling until it stops and give you the selected power-up. I want this thing to run mostly client side to reduce the server load, there's no need for it to run server side. So it will become kind of a replication nightmare, I have to replicate the dynamic array with available power-ups, then start the cycling client side, have a timeout on the client, go to the ''activated'' state and set another timeout and notify the selected power-up to the server and give it to the player. Right now the server crashes when it get's notified about the selected power-up, pretty odd. But not very important right now.

==25-07-2004==

Ok, so I had an intresting issue. The PowerUpSelector is a inventory item that cycles through a list of powerups until one is selected. Then this powerup is given to the client. The way I programmed it it worked perfectly. But on a client-server setup it would crach the server as soon as the actor was destroyed. What I did was, I called Destroy() is a function that was called from the client on the server (client &amp;ndash;&gt; server). Apperently this is not allowed, I solved the issue by using a dirty hack: I set the LifeSpan value to a very low number. This would cause the actor to be destroyed pretty much the next Tick.

==27-07-2004==

Because the tracks in our mod can break a lot of gameply stuff I decided to add a map check routine to the gameinfo class that will check quite some thinks of the current level. These checks are then saved to an external log file so that the mapper can easily find the issues. For example a bad design track will get a broken Track Volume list, after the track list has been created it will be checked for &quot;dead&quot; ends or invalid used tracks. All the assumptions made in the game code that the Track should have should be checked. Sure it would be nicer if I could directly implement it in the editor, but too bad the editor isn't really scriptable.

==30-07-2004==

Ok here was another issue. Our powerups as inventory classes, there's a lot of base code for handling an inventory since Unreal 1. But unlike all the previous Unreal games, we don't want to lose the powerup inventory item when a user dies/recovers. So, for that I could do two things, either move the complete inventory code out of the pawn or create a hack. Moving all the code is just a real pain in the ass, but ofcourse adding a hack is something you shouldn't do. I went for the hack, since the hack wasn't even that terrible. When the pawn dies I move the selected powerup instance to the PRI, then on respawn I will give the powerup back. This way the powerup selector will keep working (cycling through the list) even when you are dead. The reason why I use the PRI is because the PRI is the only common place for both AI controllers and real players. So most of the common stuff I do in the PRI. 

WOTGreal ... aaaarrrggh ... the last couple of nightly builds of WOTGreal are really broken, it slows down my development speed. Switching files is very slow, code insight is slow. It's a real nightmare. I need the nightlybuild and not the last stable release because a couple of important issues have been fixed in the current unstable release. If anyone has a WOTgreal build from before july 20th, or at least a nightly build that still working as it should, please notify me.

I changed the plug-in stuff for UnCodeX again, no longer will I support two module versions. I added a function that returns the a revision number (from one of the most important file), and based on that uncodex will accept the plug-in. Because everytime I change a little thing in the uclasses unit the older plug-ins will break, and all it needs to work again is a rebuild with the new unit. So I added an exporter function to the uclasses unit that returns the revision number. I'm also thinking about hooking up [http://www.remobjects.com/?ps RemObjects' Pascal Script] to UnCodeX so it's possible to add scripts. This way you'll get even more control on the HTML output, and other program features.

===part 2===

Argh, ok, Pascal Script is rather interesting, there's no documentation or hardly any. I'm not really sure how I want to implement it, and how to hook it up into the system(s). If anyone has some requests/ideas of the things you want to be able to do via the Pascal Script interface please let me know.

==02-08-2004==

This Pascal Script is pretty cool, it's rather easy to add functions and types to the scripting language. It's also possible to link variables from the program to the script environment.

For example the following this will be possible:
 ShowMessage(Format('Class %s has %d properties'), [SelectedUClass.fullname, SelectedUClass.properties.count]));

==03-08-2004==

There's a little downside to adding PascalScript support. I also need to document each function and class that is available in PascalScript. This is actually kind of ironic, I'm writing a program that can create documentation from documented source code files, but the source code of the program itself isn't well documented.

I guess a simple dump of the syntax of the functions and classes would be enough to start with. There are still a couple of things I have to figure out how they work with Pascal Script. For example it's possible to create ''unit''s in Pascal Script, but I don't know how to use them. Anyway, I hope to be able to release version 209 soon, it'll have the basic Pascal Script support so that people can tell me what they want, etc.

===part 2===

Actualy, working on this PascalScript implementation is quite boring and uninteresting. There's not much to do, just add functions and classes. Maybe I should start looking at the PascalScript hooks for the HTML generation, but still, that's a minor thing to do. I think it's no so motivating to work on because I know I have to spend quite some time on documenting it all.

I wonder how many people are actually using [[Legacy:UnCodeX|UnCodeX]], I know some people are using it. Looking at quite some questions asked on irc and forums a lot people should start using it, or some other method to actually browse the code. Apperently it's easier for people to ask a question and wait until somebody answers it that to search through the code to find the answer. Usually it takes me a couple of minutes to answer that question (depending on how well my regual expression was). People just want the easy way out, because of that they might mis some interesting stuff. While going through a couple of classes to set the external comments I found some interesting variables I never saw before, maybe I'll use them, maybe I wont. But when somebody asks a question that might have something to do with those variables, at least I know how they are called. Enough ranting about that.

==04-08-2004==

Woohoo, Dean fixed [[Legacy:WOTgreal|WOTgreal]], now I'm able to work on UnrealKart again.

Those vehicles remain difficult, still nobody has written a single document on how the [[Legacy:ONSVehicle|ONSVehicle]] classes really work. There are so many variables, and it's very unclear how they all relate. Maybe I should figure it out someway and write a little program that'll calculate the output or something like that. [[Legacy:AlphaOne|Plouj]] told me that the vehicle tick sucks in one way or the other and needs to be rewritten for our purpose. Is there anyone that has a clear picture how the ONSWheeledVehicle works, so that I can get a clear picture or easy method to change all the variables just to influence the final MPH of the vehicle.

I also still need to figure out how to prevent players from moving at certain points, setting bMovable to false or changing the physics type doesn't have the right effects and also break for online play. I need some kind of &quot;park&quot; gear. But apperently the engine RPM is based on the rotation of the wheels, or something, I don't know.

Ah well, another thing I have to look at is the input, I want to be able to use a simple gamepad to play the game. So I have to figure out how those gamepads in the UnrealEngine.

==07-08-2004==

I think I've said this before, writing documentation sucks. I have to document every little thing that's available in PascalScript, it's a lot of boring work. Writing normal documentation like a simple manual for a mod or an article on the UnrealWiki isn't that bad. But this is just boring as hell. I can't really release version 209 without even the most basic documentation, because it's useless unless you dig through my code.

I already have a great use for the PascalScript feature. I added a function to preselect and execute a profile from the new &quot;Run&quot; dialog. When I execute the script it will first ask me how many clients I want to start. After that it starts a server, and at set intervals it will start the requested number of clients. This makes it very easy to quickly start a client\server testing environment for UnrealKart. 

==09-08-2004==

Still working on the initial PascalScript documentation for UnCodeX, it's sooooo boring. Ah well...

Yesterday I was messing around a bit with the default input control configuration for UnrealKart. I have it now configured to have the Joystick support enabled by default, and it's configured for a 4 button gamepad, I only have my old Gravis Gamepad here. I wonder how the game behaves when no joystick\gamepad is connected but the Joystick support is still enabled. Playing UnrealKart with a gamepad is much nicer that using a keyboard. I think I'm going to implement profiles for various gamepads\joysticks, ofcourse I will include a nice config window to configure joystick\gamepad. There's still one issue I need to look at, I want the GUI to respond on joystick input, so that you can use your joystick/gamepad to navigate through the menus. So far I've been unable to capture the joystick input in the GUIController.

As for NoMut, I've added an exempt list and safe check so that gameplay important actors won't be removed. I still need to add the bRecurse feature for ReMut. After that all I need to do is finish the documentation :/ and release it.

==10-08-2004==

Wee, finally pushed out the new UnCodeX build. I've only reported all classes/functions/etc that are available through PascalScript, I didn't document it (yet). Also, the doc generator doesn't use PascalScript yet.

I've also finished NoMut, but haven't announced it yet, it's something for the next couple of days.

This morning in #unrealscript on ETG [[Legacy:Solid Snake|Solid Snake]] presented an interesting project idea, it's a SP project based on short stories. Anyway, this gave me an idea about interactive conversations through the game, and stuff like that. UT2004 has text to speech and also speech recognision (for Windows through the Microsoft Speech API). This feature hasn't really been documented, so I'm going to take a little look at how this stuff works, and create a little test case of this (just for fun). Ofcourse I will report m findings on the UnrealWiki.

==11-08-2004==

Well this some messing around with the voice recognision. But it look like I have to spend a lot of time training my speech profile before it works like it should. Anyway, I did discover some interesting things that might be usefull. Although I also encountered an issue. It looks like the speech recognision only works when running a listen server or joining as a client. That's odd since it looks like the speech recognision is independed from the voice channels (or maybe not). I will have to look into this.

Also I just rewrote the diff page handler for the [http://wiki.unrealkart.elmuerte.com wiki for UnrealKart], it now uses GNU Diff to give a nice overview similar to UnrealWiki. I'm trying to make that wiki engine behave pretty much like the UnrealWiki.

==14-08-2004==

For my &quot;cool speech recognision&quot; thing I have to implement the MetaPhone algorithm, and damn what a terrible  algorithm. I'm sure Asian languages have a much easier algorithm for MetaPhone. Ah well, as soon as one person has implemented it a lot of people can use it (woohoo, spell checking for ingame chat ;) )

Holding off other development till thursday, after that i have more time to do stuff for UnrealKart and a secret simple, but cool, gametype (it will be a tribute to the &quot;Developers of Incredible Power&quot;). I need a modeler\skinner to make one thing for that gametype.

And before I forget again, mental note: ask BU for hosting a forum for UnrealKart (I hope I will read this in the future).

==18-08-2004==

I was doing some improvements to the unrealwiki mozilla sidebar. But I've hit a couple of walls. For example, it's not possible to open the links in a new tab (ah well). But also, for some reason the pop-up blocker sometimes blocks the &quot;new window&quot;. This only happens when opening a page via the menu, or when hitting enter in the search field. In any other case it simply works, the weird thing is that they all use the &quot;oncommand&quot; event.

Anyway, this is the improved sidebar http://unreal.student.utwente.nl/mozwiki/mozwiki.php (still under construction)

==19-08-2004==

Woohoo, finally finished the [[Legacy:DoubleMetaPhone|DoubleMetaPhone]] algorithm. Almost time to work on the cool [[Legacy:Speech Recoginison|Speech Recoginison]] things.

I've decreased the loading time of the mozilla side bar by caching the &quot;side menu&quot;. By default it will updated only once an hour. Also the &quot;update&quot; now only updates the RC list, not the complete list. Also fixed the wrong initialization of the &quot;show minor changes&quot;. All I have to do is read the RC file backwards, instead of using PHP's &lt;code&gt;file()&lt;/code&gt; function. I have no idea how I can spead that up.

==20-08-2004==

Made some major performance improvements to the new mozilla side bar. It now also accepts very large RC log files. It now get the last megabyte from the RC log file and uses that. This prevents the max memory usage security from kicking in. Also I added a check to see if the local copy of Wiki_Sidebar has been changed since the last cache, if it can find the file. Otherwise the previous timeout method will be used.

I think I also figured out and fixed the sidebar method where it retreived the file localy instead of using a HTTP request.

The only thing I don't like at the moment is the pop-up blocking. I haven't found out why this happens.

'''Update'''

Ok, the pop-up blocker is a bug in the current stable mozilla releases. It's fixed in mozilla engine 1.8, however, in that version the context pop-up menu is broken. *sigh*

'''Update #2'''

Ok, found out why it didn't work in 1.8+. They [http://bugzilla.mozilla.org/show_bug.cgi?id=242010 changed] the way getCellText worked. Now the new sidebar works best with mozilla engine 1.8+ or higher (because of the above bug). I'm going to take a look to see if 1.8+ does allow tabs. Otherwise the new version is pretty much fixed. I think.

Made a couple of other changes, the pop-up window now shows more info and also allows you to open various other links, like: editor's page and history.

If you have any other feature requests for the new mozilla sidebar let me know asap.

==23-08-2004==

No feature requests for the Mozilla side bar? Ok, then I'll forward the code soon.

I've been working on the new Hint Windows for UnCodeX so it'll accept HTML code (to be used for the documentation of the variables/etc.). I'm having a couple of problems to get the window size updated correctly. Most of the times it works correctly, but once in a while it's completely messed up. Can't figure out why.

==24-08-2004==

Finally, I've got the new hint window working. Here's an example of the hint window showing info about an item in the property inspector.

http://redir.elmuerte.com/junk/uncodex-hint.png

==09-09-2004==

I've been rather busy with school the last two weeks. So I haven't done much.

'''Unreal Kart''': nothing much has been done, I need to &quot;re-activate&quot; the team, they have been slacking. In the meanwhile I've been experimenting with bot AI and path finding (to understand it better). This experimentation will result in a new gametype: Deluder

'''Deluder''': this new gametype is a tribute to the Developers of Incredible Power. It's a rather nice gametype from an old FPS game (you might now it). This gametype might be the first step on ''converting'' more of that old game. Right now I use it for experimentation for Unreal Kart to better understand bot AI and path finding. The most important part of this gametype is a roaving token that runs away from the players, so it has a somewhat reversed hunting AI. It's rather interesting, usually you want pawns to go somewhere, but in this case I want to pawn not to go somewhere. Right now the pawn tries to move away as much as possible. However, quite often it runs past the current players, and I don't want that to happen. So, in one of the test levels (Albatros) it get's stuck on AIMarker8, the AI script of that marker doesn't do anything usefull, and the pawn doesn't just jump off the ledge for some reason, so I have to figure out what it should do there.

'''UnCodeX''': haven't done anything since the HTML Hints for the the application. Soon I hope to implement PascalScript in the documentation generation. But my motivation for this project isn't that high, for some reason it's not really ''recognised'', maybe I just expect too much of it. UnDox received a shit load of attention, but UnCodeX is pretty much not present, or maybe I just don't see it. However, I did receive an email from Bruce Shankle a long time ago, he was quite impressed with it. I really wonder how many people use UnCodeX.

'''LibHTTP''': I'm working on a new version of LibHTTP, version 3. This version won't be completely backwards compatible, even tho it has the same base code. This version will ofcourse contain a couple of bug fixes (actually, just one at the moment, and it was only a bug for the UT2003 build). Some of the new features will include: easier usage via get(), post() or head() functions. Also a faster download mode when download speed is ciritcal, this will try to download more data each tick (ofcourse with setable thresholds). I'm also going to implement a document cache, and maybe some some binary options. Anyway, if you have any feature requests, let me know.

==19-09-2004==

Well found some time to work on LibHTTP version 3. So far I've made the following changes:
* Improved easy of use: get(), post(), head()
* Support for multipart/form-data POST data
* Two different transfer modes: Normal and Fast (tries to download as much data as allowed within a single tick)

Previously you had to use HttpRequest to perform a request. I made this function protected and added functions for each HTTP request method. The HttpRequest function wasn't really a nice way to perform requests. Now you will have to set the cookie data before doing a request. You can't include it with the request function (was kinda useless).

As for the POST request, now both x-url-encoded data and form-data request bodies are supported. I've added some easy to use functions to add form-data fields. Using multipart/form-data you will have much more control over the posted content, for example it's possible to use Base64 to send binary data.

I also added a additional transfer mode: Fast. This will try to download as much data as allowed (defined by a couple of variables) within a single tick. This is usefull when you need to make sure certain data is downloaded as fast as possible and system impact isn't a big issue. 

That's pretty much all the ideas I had to put into the new LibHTTP version, if you have requests, let me know ASAP.

Also LibHTTP3 will be shipped with the source code stripped from the binary package. This is to reduce the file size (87 KiB vs 33KiB). Ofcourse the source code will be included seperately with the package so you don't have to download it via CVS.

==24-09-2004==

LibHTTP 3 is getting pretty solid. I've added a test class to perform various requests. I already found a few minor bugs using that test class, bugs that have been in there for quite some time. 

The build is currently 133KiB, I'm not going to strip source from the package because of the simple reason that you can no longer use the package during compile time, only run-time. Stripping the source would reduce the package to 54KiB.

I've been thinking about creating a better source stripper. It doesn't strip the complete source, only the function and state body. The result would be that the TextBuffer (that usually contains the source code) only contains the declarations. This should be enough to use the package for compiling, and have a minimal size. I would add a comment to the top of the TextBuffer explaining that the code was removed to reduce size and stuff. However, creating such a tool isn't every easy. You can't simply replace the TextBuffer with a new one, you will have to update all the offsets in the file. Note that this tool is not for code protection, because you can still decompile the package. It's just to reduce the size.

==27-09-2004==

[[Legacy:UnCodeX|UnCodeX]] Tribes:V ponderings:

===Interfaces===

Currently, there's only one root for the class tree. I'm going to add a new root item &quot;Interfaces&quot; that contains all interfaces. Interfaces don't have parents, so this would be the best choice.

Things to think about:
* auto expand Object works differently with more than 1 root node
* no create subclass menu item for interfaces

===Defines===

I may have to redesign my complete parsing system. Maybe have to move it to a single pass parser. Right now I first construct the class tree, after that I analyse all the classes. This might not be possible anymore because of the #if ... #endif macros.

I'm pretty sure it's not possible to have a different class name, however, it might be possible that the parent class can be changed using these macros. So I would have to construct the tree and analyse the packages at the same time so all #defines are catched. The best method might be to mimick the way the unrealscript compiler does it: per package. This ofcourse would re-introduce the package order mechanism. This would be the nicest solution.

The other solution would be to extend the package scanner to parse through the whole source file every time just to capture the #define, #if...#endif macros.

Another thing I need to know is if the #define macros are system wide, or only for the subclasses. Most #defines are afaik in the Object class, so that would automatically make them system wide. 

Also I would need to implement a expression evaluator for the #if macro.

===Imports===

Depending on what the import directive does I might have to implement this too. Mostlikely it's just identical to the #import macro, which will simply import type declarations. In this case I don't need to change anything (except to ingore the import lines).

==21-12-2004==

Well, long time to entries added. Didn't feel like writing pieces of text because I already was writing and reading way to much the last couple of weeks.

I'd like to point a piece of I wrote on my general blog today, it's relevate to UnrealScript as well. It's about member visibility (private vs protected): http://elmuerte.blogspot.com/2004/12/private-vs-protected.html

I wrote it because I'm updating [[Legacy:UnCodeX|UnCodeX]] on some points and I'm running into private walls for some things I want to change.

==18-01-2005==

Current status of activities\projects
* UnrealKart &amp;ndash; '''dorment''', still plan to finish this mod in one way or the other. I want/need somebody to take the role of project manager (or something like it); e.g. make sure people do stuff, recruit new people, etc. I did a terrible job in the beginning, maybe the reason why the mod didn't took off the way I wanted. You simply can't do everything (programming, design, management).
* Deluder &amp;ndash; '''dorment''', not even sure if I'm even going to finish it. I have major issues with getting a nice AI\pathing implemented.
* UnCodeX &amp;ndash; '''semi-active''', need to implement a few things and polish quite some things. I hope to have a new stable release before UnCodeX reaches it's 2nd birthday (couting from the first stable release).
* Charon (the UnrealAdmin.org download script) &amp;ndash; '''active''', bit by bit more get's implemented, no rush really. There are a couple of things I want to add (bittorrent support (tracker and protected seed); mirror support)
* LaoZi (code repository) &amp;ndash; '''active''', currently development is behind curtains. I hope to get it hosted on BU in the end. LaoZi perpose it to provide a nice way to post\organise code samples or even complete packages. The UnrealWiki isn't a very nice place for hosting (example) code. So that's the reason why I'm working on this (as addition to the UnrealWiki).

Ofcourse there are also the other things, like work ([http://www.micronic.com 1], [http://udn.epicgames.com 2], [http://www.rename-it.nl 3]), college stuff, [http://el-muerte.student.utwente.nl/warez/ experiments] and the usual server administration work.

==25-01-2005==

Got a few minutes before the coffee is ready.

Well the results for the [http://www.unrealtournament.com/ut2003/ct_finals/ grand finals of the MSUC] are in. Red Orchestra won, not much of a surprise. They won quite some prizes in the other stages, but still the mod doesn't tickle my interest (that's why I declined their offer to join their project a long time ago). 

However, what is surprising is that the RO team is going to use the UnrealEngine license to publish their mod ([http://articles.filefront.com/Building_Better_Games_through_More_than_Unreal/;357;;;/article.html filefront interview]). I don't get it, why would you &quot;waste&quot; the license you got to publish the mod you made. When they do this they will also turn their back on everybody that supported that mod. Hoewever, on the other hand, many of their team mates left during development, and by releasing the mod as a retail game their get their fair share of it (or do they).

If it was up to me I would use the UnrealEngine for a new project. You already have got a license for an kick-ass engine. So the cost of development is greatly reduced, easier for a publisher to pick you up. 

Coffee is ready.

==14-05-2005==

A long time since the last update. I guess I should give a heads up on what I've been up to lately.

Besides the usual work (UDN updates and work for a company called Micronic) I haven't done much on other projects besides UnCodeX. A while ago I released a new stable release for it (version 227) and I expect to release another stable version soon, found some bugs but also made a few improvements. I also started to port UnCodeX to a VisualStudio.Net AddIn, it hasn't been easy to do so (check my [http://elmuerte.blogspot.com blog] for some of the details). But with enough time I should be able to create a killer AddIn that not only contains most of the UnCodeX features but also make VS.Net a editor for UnrealScript (code-insight, intellisense, whatnot). Ofcourse this is all in the future.

This doesn't mean the SA (standalone) and CL (commandline) versions of UnCodeX won't be further developed, they share most of the base code so in the future there will be three versions of UnCodeX: SA, CL and VSA. 

==17-09-2005==

It has been a while since my last dev journal entry (again). First a little update about my last entry. I'm no longer actively working on a VisualStudio AddIn. The features I wanted to add required me to write a VisualStudio Package instead of just an AddIn. Writing a package isn't as simple as writing an AddIn. I hit an issue while implementing the basic framework that I haven't been able to resolve (devstudio gives me an error when I want to load a few things here and there). So that project has been put on ice.

As for other projects, a while ago I continued some development of [[Legacy:LibHTTP|LibHTTP]] and got a bit annoyed on my testing class. So I decided to make a testing framework based on unit testing. That's how [[Legacy:UsUnit|UsUnit]] came to life. Because I wanted to include the source file and line where a check failed I had to write an UnrealScript PreProcessor, and I also wanted a few other features that a precompile could accomplish. And that's why I created [[Legacy:UCPP|UCPP]]. Well, UCPP had some releases, and it quite mature and finished right now. So I've gone back to working on [[Legacy:UsUnit|UsUnit]] some more. I've already made one release so far. But this was mostly to put out the first binary package for people to play with. You could consider it a beta release for now. I want to complete just a few more things for the next release, it can be summed up into: finish the webadmin module.

Also, today barnEbiss contacted me if I was interested in helping him with a weapon mod. His idea is quite interesting. He wants to create a weapon that allows you to create a line of gasoline and set that one fire (the fire ofcourse will hurt people). It's quite an interesting weapon to create, with some interesting implementation issues to solve. So I will also be working on that project.

Well I guess that's all I have to say about that for now.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3075</id>
      <timestamp>2006-04-07T01:11:16Z</timestamp>
      <contributor>
        <ip>Cdn-ce-chi-t2-05.area4.il.chicago.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Journal History==
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 1]]
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 2]]
# [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal History 3]]

==14-06-2004==

New phase, clean dev log.

Started working on Unreal Kart (like I said). Now the difficult part will start, the actual development. Could use another mapper to help with creating some initial maps to improve the development of the tracks. I hope [[Legacy:AlphaOne|AlphaOne]] will be able to use the experience he get got while making StrangeLove on the karts. They don't move like I want. I also need to write a little tutorial on how to map for UKart, this should be pretty simple (use our Track volumes to define the track, and how to use the player positions).

==14-07-2004==

MSUC Phase 3 Tools finalists have been announced :(

'''Mychaeel:''' Yeah :-/ &amp;ndash; I can only guess that they focused on tools for end users or those which directly benefit end users... the only reason why I can imagine that umod Wizard is a finalist and UnCodeX is not...

==18-07-2004==

Well, I was planning to keep regular updates on the progress of my new mod: UnrealKart, both the actual development and project organisation. But so far nothing. So here's a short recap of the past.

This is my first mod where I take the lead for organisation, so I have no idea if it's going well or not compared on how other mod teams are doing. We started slow, in fact the mod idea exists for at least 2 months now, I think, but the real implementation work was only started recently. We had a little &quot;break&quot; until phase 3 was closed, so that people could finish thier other creations to enter. UnrealKart is not going to be a mod to be entered in the MSUC, it's going to be a mod made for fun and because we like it. That doesn't mean I won't submit it for Phase 4 (it's a good PR opertunity if you get in the honorable mentions), but only if we have a release candidate. Back to the project organisation. Recruiting people is quite difficult, sure a mod team doesn't need to have a lot of people on it. But even getting a few members that can dedicate them to the project is quite difficult. There are a lot of people interested in doing something for the mod, but not on a semi-dedicated level. By the time we have a release candidate I expect quite some people to contribute to the project (e.g. Create a track or maybe even a kart), but currently we are not on that stage yet, so it's useless for the moment. Right now 6 people dedicated for the project (2 programmers, 1 vehicle modeler, 1 2D artist and 2 mappers). 

As I said, getting people to work on a mod is a though job. You want people that have some experience, so it's easy for them to quickly addept to the dynamic of mod development. The guy (SithLegend) that did the current [http://mods.beyondunreal.com/images/31/big/ukart.jpg?wikifix kart model] wanted us to help him with a couple of creations of him, I didn't have any problems with that. Specially not based on his [http://sithlegend.com/annihilationarsenal/ previous work]. Our 2D (Zeh) artist can handle himself, he made some very nice [http://mods.beyondunreal.com/images/31/big/hud4.jpg?wikifix concepts for the HUD]. Our mappers however need some guidance in their process, this isn't bad. Our mod is a team effort, the team makes the mod, not a group of individuals.

That's all for now, have to feed the kat+kittens of a friend of mine, when I'm back I'll tell something about some programming issues.

===part 2===

So far there have been a couple of programming issues I had to solve. The first one was to keep track if the races where either on-track or off-track. An easy solution for this would be to use volumes to tell what the track is. When player enters the volume to set the current volume to that volume. When a user leaves a volume you will check if the volume that was left is the same as the current volume, when they are the same then the user left the track. So when volumes overlap you will first enter a new track volume, this will set the current volume. When you then leave the previous volume the above check fails, so the user must still be on track.

Well that was easy, but now, how do you check a player was following the track. An obvious solution would be to use checkpoints or to check if a user entered each volume. The check so see if every volume was passed won't work because I want the racer to be able to race off-track for shortcuts, or just be a terrible driver. So check points it is. For our mod the checkpoints would be invisible. There are different ways to implement checkpoints, since we already have volumes to define the tracks we can use the volumes as checkpoints. These checkpoints should then be place on places where a racer has to go through. The racer must not be able to pass this checkpoint off-track, this just sucks becuase the racer would then have to go back to pass the checkpoint. Now there are two ways to check if a user passed the right checkpoints. You could keep a list of checkpoints available and check if a user passed them. But this has a couple of issues: alternative routes or shortcuts, where to go. So I added a variable to our volume class that contains the next possible track volumes, usualy this would be only one volume but in case of short cuts or alternative routes this can be more than one. Now every time a user enters a volume it will check if this volume is in the list of &quot;next volumes&quot;. The list of &quot;next volumes&quot; is stored for each player seperately, when a user entered the &quot;next volume&quot; the current list will be reset with the list of the next volume. This way you will always know where to go to. Ofcourse the mapper will have to set up the volumes correcty. Every track requires to have a finish volume, this finish volume must be the checpoint first volume. When a user enters this volume it will be checked if the volume was &quot;queued&quot;, if the volume was queued the player completed a lap. The finish volume is the only checkpoint that players could miss by racing off track, simply because this checkpoint is always visible. Because we know what volumes should be next we can also direct the racers where to go.

Now that we know how to follow the track we can also keep track of player positions. For this a list has to be contructed that contains the volumes to follow in order (e.g. the next volumes). Now all we have to do is sort the players based on their lap count, next volume, distance to the closest next volume (in that order).

'''T1:''' In the mod I'm working on (Momentum Control, a wipeout-ish racing game.), I was planning to use the same method that the bombing run goal uses (An invisible smesh in the center that does the scoring when it gets Touch()'ed.). But volumes are an excellent idea, because you could detect if the player just goes around a checkpoint.  Do you mind if I use that idea in Momentum Control?

'''El Muerte:''' published ideas are there to be applied/used/etc. (I think). Anyway, I don't mind, that's why post stuff on the wiki, so that others can find a use for it.

'''T1:''' Thanks. I just was asking because some people are strange and would get mad or something like that over it.

==21-07-2004==

''Report from yesterday.''

Worked out the racer position calculation. At the beginning of the race, when the racers are placed on the grid, I will do a complete calculation of all positions, during that I set for each player the next and previous player in their PRI. After that each PRI will check if the racer passed the ''next'' player, if so it will update the linked list and broadcast a message to all players about this position change. I plan to use this LocalMessage to update the HUD of each player to notify the player position change. 

I had a couple of issues testing this, with 3 clients the positions where incorrect. It appeared that I made a stupid mistake for the start position calculation.

When players join they will get a start position assigned, first to join will start on the last position (depening on the number of players/bots and stuff). Note: we will also ship a gamerule that will save the last finish positions for each player and use those to remember the start position (e.g. finish last will grant you to start first in the next MP game). Anyway, I made the following stupid mistake:

&lt;uscript&gt;
n = StartPositions-1;
while (n &lt; 255)
{
	for (i = 0; i &lt; idxs.length; i++)
	{
		if (idxs[i] == n)
		{
			n--;
			continue;
		}
	}
	break; // found position
}
&lt;/uscript&gt;

&lt;code&gt;idxs&lt;/code&gt; is a list with already in use start positions, the continue was ment to have effect on the while and not the for statement. So the 3rd client would get the same start position as the 2nd :)

Another issue I'm working on is the power-up selector power-up. It's a special power-up that contains a list of real power-ups that will cycle. After it has bee activated (or timeout) it will slow down the cycling until it stops and give you the selected power-up. I want this thing to run mostly client side to reduce the server load, there's no need for it to run server side. So it will become kind of a replication nightmare, I have to replicate the dynamic array with available power-ups, then start the cycling client side, have a timeout on the client, go to the ''activated'' state and set another timeout and notify the selected power-up to the server and give it to the player. Right now the server crashes when it get's notified about the selected power-up, pretty odd. But not very important right now.

==25-07-2004==

Ok, so I had an intresting issue. The PowerUpSelector is a inventory item that cycles through a list of powerups until one is selected. Then this powerup is given to the client. The way I programmed it it worked perfectly. But on a client-server setup it would crach the server as soon as the actor was destroyed. What I did was, I called Destroy() is a function that was called from the client on the server (client &amp;ndash;&gt; server). Apperently this is not allowed, I solved the issue by using a dirty hack: I set the LifeSpan value to a very low number. This would cause the actor to be destroyed pretty much the next Tick.

==27-07-2004==

Because the tracks in our mod can break a lot of gameply stuff I decided to add a map check routine to the gameinfo class that will check quite some thinks of the current level. These checks are then saved to an external log file so that the mapper can easily find the issues. For example a bad design track will get a broken Track Volume list, after the track list has been created it will be checked for &quot;dead&quot; ends or invalid used tracks. All the assumptions made in the game code that the Track should have should be checked. Sure it would be nicer if I could directly implement it in the editor, but too bad the editor isn't really scriptable.

==30-07-2004==

Ok here was another issue. Our powerups as inventory classes, there's a lot of base code for handling an inventory since Unreal 1. But unlike all the previous Unreal games, we don't want to lose the powerup inventory item when a user dies/recovers. So, for that I could do two things, either move the complete inventory code out of the pawn or create a hack. Moving all the code is just a real pain in the ass, but ofcourse adding a hack is something you shouldn't do. I went for the hack, since the hack wasn't even that terrible. When the pawn dies I move the selected powerup instance to the PRI, then on respawn I will give the powerup back. This way the powerup selector will keep working (cycling through the list) even when you are dead. The reason why I use the PRI is because the PRI is the only common place for both AI controllers and real players. So most of the common stuff I do in the PRI. 

WOTGreal ... aaaarrrggh ... the last couple of nightly builds of WOTGreal are really broken, it slows down my development speed. Switching files is very slow, code insight is slow. It's a real nightmare. I need the nightlybuild and not the last stable release because a couple of important issues have been fixed in the current unstable release. If anyone has a WOTgreal build from before july 20th, or at least a nightly build that still working as it should, please notify me.

I changed the plug-in stuff for UnCodeX again, no longer will I support two module versions. I added a function that returns the a revision number (from one of the most important file), and based on that uncodex will accept the plug-in. Because everytime I change a little thing in the uclasses unit the older plug-ins will break, and all it needs to work again is a rebuild with the new unit. So I added an exporter function to the uclasses unit that returns the revision number. I'm also thinking about hooking up [http://www.remobjects.com/?ps RemObjects' Pascal Script] to UnCodeX so it's possible to add scripts. This way you'll get even more control on the HTML output, and other program features.

===part 2===

Argh, ok, Pascal Script is rather interesting, there's no documentation or hardly any. I'm not really sure how I want to implement it, and how to hook it up into the system(s). If anyone has some requests/ideas of the things you want to be able to do via the Pascal Script interface please let me know.

==02-08-2004==

This Pascal Script is pretty cool, it's rather easy to add functions and types to the scripting language. It's also possible to link variables from the program to the script environment.

For example the following this will be possible:
 ShowMessage(Format('Class %s has %d properties'), [SelectedUClass.fullname, SelectedUClass.properties.count]));

==03-08-2004==

There's a little downside to adding PascalScript support. I also need to document each function and class that is available in PascalScript. This is actually kind of ironic, I'm writing a program that can create documentation from documented source code files, but the source code of the program itself isn't well documented.

I guess a simple dump of the syntax of the functions and classes would be enough to start with. There are still a couple of things I have to figure out how they work with Pascal Script. For example it's possible to create ''unit''s in Pascal Script, but I don't know how to use them. Anyway, I hope to be able to release version 209 soon, it'll have the basic Pascal Script support so that people can tell me what they want, etc.

===part 2===

Actualy, working on this PascalScript implementation is quite boring and uninteresting. There's not much to do, just add functions and classes. Maybe I should start looking at the PascalScript hooks for the HTML generation, but still, that's a minor thing to do. I think it's no so motivating to work on because I know I have to spend quite some time on documenting it all.

I wonder how many people are actually using [[Legacy:UnCodeX|UnCodeX]], I know some people are using it. Looking at quite some questions asked on irc and forums a lot people should start using it, or some other method to actually browse the code. Apperently it's easier for people to ask a question and wait until somebody answers it that to search through the code to find the answer. Usually it takes me a couple of minutes to answer that question (depending on how well my regual expression was). People just want the easy way out, because of that they might mis some interesting stuff. While going through a couple of classes to set the external comments I found some interesting variables I never saw before, maybe I'll use them, maybe I wont. But when somebody asks a question that might have something to do with those variables, at least I know how they are called. Enough ranting about that.

==04-08-2004==

Woohoo, Dean fixed [[Legacy:WOTgreal|WOTgreal]], now I'm able to work on UnrealKart again.

Those vehicles remain difficult, still nobody has written a single document on how the [[Legacy:ONSVehicle|ONSVehicle]] classes really work. There are so many variables, and it's very unclear how they all relate. Maybe I should figure it out someway and write a little program that'll calculate the output or something like that. [[Legacy:AlphaOne|Plouj]] told me that the vehicle tick sucks in one way or the other and needs to be rewritten for our purpose. Is there anyone that has a clear picture how the ONSWheeledVehicle works, so that I can get a clear picture or easy method to change all the variables just to influence the final MPH of the vehicle.

I also still need to figure out how to prevent players from moving at certain points, setting bMovable to false or changing the physics type doesn't have the right effects and also break for online play. I need some kind of &quot;park&quot; gear. But apperently the engine RPM is based on the rotation of the wheels, or something, I don't know.

Ah well, another thing I have to look at is the input, I want to be able to use a simple gamepad to play the game. So I have to figure out how those gamepads in the UnrealEngine.

==07-08-2004==

I think I've said this before, writing documentation sucks. I have to document every little thing that's available in PascalScript, it's a lot of boring work. Writing normal documentation like a simple manual for a mod or an article on the UnrealWiki isn't that bad. But this is just boring as hell. I can't really release version 209 without even the most basic documentation, because it's useless unless you dig through my code.

I already have a great use for the PascalScript feature. I added a function to preselect and execute a profile from the new &quot;Run&quot; dialog. When I execute the script it will first ask me how many clients I want to start. After that it starts a server, and at set intervals it will start the requested number of clients. This makes it very easy to quickly start a client\server testing environment for UnrealKart. 

==09-08-2004==

Still working on the initial PascalScript documentation for UnCodeX, it's sooooo boring. Ah well...

Yesterday I was messing around a bit with the default input control configuration for UnrealKart. I have it now configured to have the Joystick support enabled by default, and it's configured for a 4 button gamepad, I only have my old Gravis Gamepad here. I wonder how the game behaves when no joystick\gamepad is connected but the Joystick support is still enabled. Playing UnrealKart with a gamepad is much nicer that using a keyboard. I think I'm going to implement profiles for various gamepads\joysticks, ofcourse I will include a nice config window to configure joystick\gamepad. There's still one issue I need to look at, I want the GUI to respond on joystick input, so that you can use your joystick/gamepad to navigate through the menus. So far I've been unable to capture the joystick input in the GUIController.

As for NoMut, I've added an exempt list and safe check so that gameplay important actors won't be removed. I still need to add the bRecurse feature for ReMut. After that all I need to do is finish the documentation :/ and release it.

==10-08-2004==

Wee, finally pushed out the new UnCodeX build. I've only reported all classes/functions/etc that are available through PascalScript, I didn't document it (yet). Also, the doc generator doesn't use PascalScript yet.

I've also finished NoMut, but haven't announced it yet, it's something for the next couple of days.

This morning in #unrealscript on ETG [[Legacy:Solid Snake|Solid Snake]] presented an interesting project idea, it's a SP project based on short stories. Anyway, this gave me an idea about interactive conversations through the game, and stuff like that. UT2004 has text to speech and also speech recognision (for Windows through the Microsoft Speech API). This feature hasn't really been documented, so I'm going to take a little look at how this stuff works, and create a little test case of this (just for fun). Ofcourse I will report m findings on the UnrealWiki.

==11-08-2004==

Well this some messing around with the voice recognision. But it look like I have to spend a lot of time training my speech profile before it works like it should. Anyway, I did discover some interesting things that might be usefull. Although I also encountered an issue. It looks like the speech recognision only works when running a listen server or joining as a client. That's odd since it looks like the speech recognision is independed from the voice channels (or maybe not). I will have to look into this.

Also I just rewrote the diff page handler for the [http://wiki.unrealkart.elmuerte.com wiki for UnrealKart], it now uses GNU Diff to give a nice overview similar to UnrealWiki. I'm trying to make that wiki engine behave pretty much like the UnrealWiki.

==14-08-2004==

For my &quot;cool speech recognision&quot; thing I have to implement the MetaPhone algorithm, and damn what a terrible  algorithm. I'm sure Asian languages have a much easier algorithm for MetaPhone. Ah well, as soon as one person has implemented it a lot of people can use it (woohoo, spell checking for ingame chat ;) )

Holding off other development till thursday, after that i have more time to do stuff for UnrealKart and a secret simple, but cool, gametype (it will be a tribute to the &quot;Developers of Incredible Power&quot;). I need a modeler\skinner to make one thing for that gametype.

And before I forget again, mental note: ask BU for hosting a forum for UnrealKart (I hope I will read this in the future).

==18-08-2004==

I was doing some improvements to the unrealwiki mozilla sidebar. But I've hit a couple of walls. For example, it's not possible to open the links in a new tab (ah well). But also, for some reason the pop-up blocker sometimes blocks the &quot;new window&quot;. This only happens when opening a page via the menu, or when hitting enter in the search field. In any other case it simply works, the weird thing is that they all use the &quot;oncommand&quot; event.

Anyway, this is the improved sidebar http://unreal.student.utwente.nl/mozwiki/mozwiki.php (still under construction)

==19-08-2004==

Woohoo, finally finished the [[Legacy:DoubleMetaPhone|DoubleMetaPhone]] algorithm. Almost time to work on the cool [[Legacy:Speech Recoginison|Speech Recoginison]] things.

I've decreased the loading time of the mozilla side bar by caching the &quot;side menu&quot;. By default it will updated only once an hour. Also the &quot;update&quot; now only updates the RC list, not the complete list. Also fixed the wrong initialization of the &quot;show minor changes&quot;. All I have to do is read the RC file backwards, instead of using PHP's &lt;code&gt;file()&lt;/code&gt; function. I have no idea how I can spead that up.

==20-08-2004==

Made some major performance improvements to the new mozilla side bar. It now also accepts very large RC log files. It now get the last megabyte from the RC log file and uses that. This prevents the max memory usage security from kicking in. Also I added a check to see if the local copy of Wiki_Sidebar has been changed since the last cache, if it can find the file. Otherwise the previous timeout method will be used.

I think I also figured out and fixed the sidebar method where it retreived the file localy instead of using a HTTP request.

The only thing I don't like at the moment is the pop-up blocking. I haven't found out why this happens.

'''Update'''

Ok, the pop-up blocker is a bug in the current stable mozilla releases. It's fixed in mozilla engine 1.8, however, in that version the context pop-up menu is broken. *sigh*

'''Update #2'''

Ok, found out why it didn't work in 1.8+. They [http://bugzilla.mozilla.org/show_bug.cgi?id=242010 changed] the way getCellText worked. Now the new sidebar works best with mozilla engine 1.8+ or higher (because of the above bug). I'm going to take a look to see if 1.8+ does allow tabs. Otherwise the new version is pretty much fixed. I think.

Made a couple of other changes, the pop-up window now shows more info and also allows you to open various other links, like: editor's page and history.

If you have any other feature requests for the new mozilla sidebar let me know asap.

==23-08-2004==

No feature requests for the Mozilla side bar? Ok, then I'll forward the code soon.

I've been working on the new Hint Windows for UnCodeX so it'll accept HTML code (to be used for the documentation of the variables/etc.). I'm having a couple of problems to get the window size updated correctly. Most of the times it works correctly, but once in a while it's completely messed up. Can't figure out why.

==24-08-2004==

Finally, I've got the new hint window working. Here's an example of the hint window showing info about an item in the property inspector.

http://redir.elmuerte.com/junk/uncodex-hint.png

==09-09-2004==

I've been rather busy with school the last two weeks. So I haven't done much.

'''Unreal Kart''': nothing much has been done, I need to &quot;re-activate&quot; the team, they have been slacking. In the meanwhile I've been experimenting with bot AI and path finding (to understand it better). This experimentation will result in a new gametype: Deluder

'''Deluder''': this new gametype is a tribute to the Developers of Incredible Power. It's a rather nice gametype from an old FPS game (you might now it). This gametype might be the first step on ''converting'' more of that old game. Right now I use it for experimentation for Unreal Kart to better understand bot AI and path finding. The most important part of this gametype is a roaving token that runs away from the players, so it has a somewhat reversed hunting AI. It's rather interesting, usually you want pawns to go somewhere, but in this case I want to pawn not to go somewhere. Right now the pawn tries to move away as much as possible. However, quite often it runs past the current players, and I don't want that to happen. So, in one of the test levels (Albatros) it get's stuck on AIMarker8, the AI script of that marker doesn't do anything usefull, and the pawn doesn't just jump off the ledge for some reason, so I have to figure out what it should do there.

'''UnCodeX''': haven't done anything since the HTML Hints for the the application. Soon I hope to implement PascalScript in the documentation generation. But my motivation for this project isn't that high, for some reason it's not really ''recognised'', maybe I just expect too much of it. UnDox received a shit load of attention, but UnCodeX is pretty much not present, or maybe I just don't see it. However, I did receive an email from Bruce Shankle a long time ago, he was quite impressed with it. I really wonder how many people use UnCodeX.

'''LibHTTP''': I'm working on a new version of LibHTTP, version 3. This version won't be completely backwards compatible, even tho it has the same base code. This version will ofcourse contain a couple of bug fixes (actually, just one at the moment, and it was only a bug for the UT2003 build). Some of the new features will include: easier usage via get(), post() or head() functions. Also a faster download mode when download speed is ciritcal, this will try to download more data each tick (ofcourse with setable thresholds). I'm also going to implement a document cache, and maybe some some binary options. Anyway, if you have any feature requests, let me know.

==19-09-2004==

Well found some time to work on LibHTTP version 3. So far I've made the following changes:
* Improved easy of use: get(), post(), head()
* Support for multipart/form-data POST data
* Two different transfer modes: Normal and Fast (tries to download as much data as allowed within a single tick)

Previously you had to use HttpRequest to perform a request. I made this function protected and added functions for each HTTP request method. The HttpRequest function wasn't really a nice way to perform requests. Now you will have to set the cookie data before doing a request. You can't include it with the request function (was kinda useless).

As for the POST request, now both x-url-encoded data and form-data request bodies are supported. I've added some easy to use functions to add form-data fields. Using multipart/form-data you will have much more control over the posted content, for example it's possible to use Base64 to send binary data.

I also added a additional transfer mode: Fast. This will try to download as much data as allowed (defined by a couple of variables) within a single tick. This is usefull when you need to make sure certain data is downloaded as fast as possible and system impact isn't a big issue. 

That's pretty much all the ideas I had to put into the new LibHTTP version, if you have requests, let me know ASAP.

Also LibHTTP3 will be shipped with the source code stripped from the binary package. This is to reduce the file size (87 KiB vs 33KiB). Ofcourse the source code will be included seperately with the package so you don't have to download it via CVS.

==24-09-2004==

LibHTTP 3 is getting pretty solid. I've added a test class to perform various requests. I already found a few minor bugs using that test class, bugs that have been in there for quite some time. 

The build is currently 133KiB, I'm not going to strip source from the package because of the simple reason that you can no longer use the package during compile time, only run-time. Stripping the source would reduce the package to 54KiB.

I've been thinking about creating a better source stripper. It doesn't strip the complete source, only the function and state body. The result would be that the TextBuffer (that usually contains the source code) only contains the declarations. This should be enough to use the package for compiling, and have a minimal size. I would add a comment to the top of the TextBuffer explaining that the code was removed to reduce size and stuff. However, creating such a tool isn't every easy. You can't simply replace the TextBuffer with a new one, you will have to update all the offsets in the file. Note that this tool is not for code protection, because you can still decompile the package. It's just to reduce the size.

==27-09-2004==

[[Legacy:UnCodeX|UnCodeX]] Tribes:V ponderings:

===Interfaces===

Currently, there's only one root for the class tree. I'm going to add a new root item &quot;Interfaces&quot; that contains all interfaces. Interfaces don't have parents, so this would be the best choice.

Things to think about:
* auto expand Object works differently with more than 1 root node
* no create subclass menu item for interfaces

===Defines===

I may have to redesign my complete parsing system. Maybe have to move it to a single pass parser. Right now I first construct the class tree, after that I analyse all the classes. This might not be possible anymore because of the #if ... #endif macros.

I'm pretty sure it's not possible to have a different class name, however, it might be possible that the parent class can be changed using these macros. So I would have to construct the tree and analyse the packages at the same time so all #defines are catched. The best method might be to mimick the way the unrealscript compiler does it: per package. This ofcourse would re-introduce the package order mechanism. This would be the nicest solution.

The other solution would be to extend the package scanner to parse through the whole source file every time just to capture the #define, #if...#endif macros.

Another thing I need to know is if the #define macros are system wide, or only for the subclasses. Most #defines are afaik in the Object class, so that would automatically make them system wide. 

Also I would need to implement a expression evaluator for the #if macro.

===Imports===

Depending on what the import directive does I might have to implement this too. Mostlikely it's just identical to the #import macro, which will simply import type declarations. In this case I don't need to change anything (except to ingore the import lines).

==21-12-2004==

Well, long time to entries added. Didn't feel like writing pieces of text because I already was writing and reading way to much the last couple of weeks.

I'd like to point a piece of I wrote on my general blog today, it's relevate to UnrealScript as well. It's about member visibility (private vs protected): http://elmuerte.blogspot.com/2004/12/private-vs-protected.html

I wrote it because I'm updating [[Legacy:UnCodeX|UnCodeX]] on some points and I'm running into private walls for some things I want to change.

==18-01-2005==

Current status of activities\projects
* UnrealKart &amp;ndash; '''dorment''', still plan to finish this mod in one way or the other. I want/need somebody to take the role of project manager (or something like it); e.g. make sure people do stuff, recruit new people, etc. I did a terrible job in the beginning, maybe the reason why the mod didn't took off the way I wanted. You simply can't do everything (programming, design, management).
* Deluder &amp;ndash; '''dorment''', not even sure if I'm even going to finish it. I have major issues with getting a nice AI\pathing implemented.
* UnCodeX &amp;ndash; '''semi-active''', need to implement a few things and polish quite some things. I hope to have a new stable release before UnCodeX reaches it's 2nd birthday (couting from the first stable release).
* Charon (the UnrealAdmin.org download script) &amp;ndash; '''active''', bit by bit more get's implemented, no rush really. There are a couple of things I want to add (bittorrent support (tracker and protected seed); mirror support)
* LaoZi (code repository) &amp;ndash; '''active''', currently development is behind curtains. I hope to get it hosted on BU in the end. LaoZi perpose it to provide a nice way to post\organise code samples or even complete packages. The UnrealWiki isn't a very nice place for hosting (example) code. So that's the reason why I'm working on this (as addition to the UnrealWiki).

Ofcourse there are also the other things, like work ([http://www.micronic.com 1], [http://udn.epicgames.com 2], [http://www.rename-it.nl 3]), college stuff, [http://el-muerte.student.utwente.nl/warez/ experiments] and the usual server administration work.

==25-01-2005==

Got a few minutes before the coffee is ready.

Well the results for the [http://www.unrealtournament.com/ut2003/ct_finals/ grand finals of the MSUC] are in. Red Orchestra won, not much of a surprise. They won quite some prizes in the other stages, but still the mod doesn't tickle my interest (that's why I declined their offer to join their project a long time ago). 

However, what is surprising is that the RO team is going to use the UnrealEngine license to publish their mod ([http://articles.filefront.com/Building_Better_Games_through_More_than_Unreal/;357;;;/article.html filefront interview]). I don't get it, why would you &quot;waste&quot; the license you got to publish the mod you made. When they do this they will also turn their back on everybody that supported that mod. Hoewever, on the other hand, many of their team mates left during development, and by releasing the mod as a retail game their get their fair share of it (or do they).

If it was up to me I would use the UnrealEngine for a new project. You already have got a license for an kick-ass engine. So the cost of development is greatly reduced, easier for a publisher to pick you up. 

Coffee is ready.

==14-05-2005==

A long time since the last update. I guess I should give a heads up on what I've been up to lately.

Besides the usual work (UDN updates and work for a company called Micronic) I haven't done much on other projects besides UnCodeX. A while ago I released a new stable release for it (version 227) and I expect to release another stable version soon, found some bugs but also made a few improvements. I also started to port UnCodeX to a VisualStudio.Net AddIn, it hasn't been easy to do so (check my [http://elmuerte.blogspot.com blog] for some of the details). But with enough time I should be able to create a killer AddIn that not only contains most of the UnCodeX features but also make VS.Net a editor for UnrealScript (code-insight, intellisense, whatnot). Ofcourse this is all in the future.

This doesn't mean the SA (standalone) and CL (commandline) versions of UnCodeX won't be further developed, they share most of the base code so in the future there will be three versions of UnCodeX: SA, CL and VSA. 

==17-09-2005==

It has been a while since my last dev journal entry (again). First a little update about my last entry. I'm no longer actively working on a VisualStudio AddIn. The features I wanted to add required me to write a VisualStudio Package instead of just an AddIn. Writing a package isn't as simple as writing an AddIn. I hit an issue while implementing the basic framework that I haven't been able to resolve (devstudio gives me an error when I want to load a few things here and there). So that project has been put on ice.

As for other projects, a while ago I continued some development of [[Legacy:LibHTTP|LibHTTP]] and got a bit annoyed on my testing class. So I decided to make a testing framework based on unit testing. That's how [[Legacy:UsUnit|UsUnit]] came to life. Because I wanted to include the source file and line where a check failed I had to write an UnrealScript PreProcessor, and I also wanted a few other features that a precompile could accomplish. And that's why I created [[Legacy:UCPP|UCPP]]. Well, UCPP had some releases, and it quite mature and finished right now. So I've gone back to working on [[Legacy:UsUnit|UsUnit]] some more. I've already made one release so far. But this was mostly to put out the first binary package for people to play with. You could consider it a beta release for now. I want to complete just a few more things for the next release, it can be summed up into: finish the webadmin module.

Also, today barnEbiss contacted me if I was interested in helping him with a weapon mod. His idea is quite interesting. He wants to create a weapon that allows you to create a line of gasoline and set that one fire (the fire ofcourse will hurt people). It's quite an interesting weapon to create, with some interesting implementation issues to solve. So I will also be working on that project.

Well I guess that's all I have to say about that for now.

----

[[:Category:Legacy Journal]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte/GQP</title>
    <id>1181</id>
    <revision>
      <id>3078</id>
      <timestamp>2004-03-03T08:32:26Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">GQP stands for Gameserver Query Protocol (working title)

==Purpose ==

This document serves as a working draft for a RFC to be written later.

At the moment, there's only one protocol that can be considered a standard: the GameSpy protocol. But this protocol is not well defined and has some design flaws.

Hopefully, game developers and server query programs (like [http://www.qstat.org/ qstat] or [http://www.udpsoft.com/eye2/ ASE]) will adopt this specification once it's complete.

==Authors ==

''If you are going to work on the design of this protocol, please add your name here for later reference.''

* Michiel Hendriks &lt;elmuerte@drunksnipers.com&gt;
* Guillaume Cocatre-Zilgien, a.k.a. &quot;skamp&quot; - http://www.skamp.net/

==Design features ==

* the protocol should be as basic and serve as many purposes as possible, so it can be implemented in every game;
* authentication, possibility to protect data (through encryption/encoding?);
* easily extensible with new query commands;

...

==Grammar ==

''Client request''
    QUERY           ::= ( ENCODED )? COMMAND ( GS COMMAND )* EOT
    ENCODED         ::= SOH STRING ACK
    COMMAND         ::= STRING ( RS ARGUMENT-LIST )? 
    ARGUMENT-LIST   ::= STRING ( US STRING )* 

''Server response''
    RESPONSE        ::= ( ENCODED )? COMMAND-REPLY ( GS COMMAND-REPLY )* EOT
    COMMAND-REPLY   ::= STATUS-CODE COMMAND-NAME RS DATA
    COMMAND-NAME    ::= STRING
    STATUS-CODE     ::= DIGIT DIGIT
    DATA            ::= ACK
                      | RECORD ( RS RECORD )*
    RECORD          ::= DC1 STRING                // a simple string
                      | DC2 STRING US STRING      // name = value
                      | DC3 STRING ( US STRING )* // array
                      | DC4 STRING ( US STRING )* // labeled array (first element is the label)
                                            
    SOH             ::= &lt;SOH&gt;
    EOT             ::= &lt;EOT&gt;
    GS              ::= &lt;GS&gt;
    RS              ::= &lt;RS&gt;
    US              ::= &lt;US&gt;
    STRING          ::= ( &lt;printable&gt; )*
    DIGIT           ::= '0' ... '9'
    ACK             ::= &lt;ACK&gt;
    DC1             ::= &lt;DC1&gt;
    DC2             ::= &lt;DC2&gt;
    DC3             ::= &lt;DC3&gt;
    DC4             ::= &lt;DC4&gt;

===Server reponse data ===

The server respons data (the rules DATA and RECORD) can be one of the following format:
; empty reply : only an &lt;ACK&gt;

; text : just a single string as reply
  &quot;single item&quot;

; name/value : both a name and value
  &quot;label&quot; =&gt; &quot;single item&quot;

; array : an array of value
  Array (&quot;item one&quot;, &quot;item two&quot;, &quot;item three&quot;)

; labeled array : an array with a label
  &quot;label&quot; =&gt; Array (&quot;item one&quot;, &quot;item two&quot;, &quot;item three&quot;)
    

&lt;DLE&gt;, &lt;EOT&gt;, &lt;ETB&gt;, &lt;GS&gt;, &lt;RS&gt;, &lt;US&gt;, &lt;ACK&gt;, &lt;SOH&gt;, &lt;STX&gt; and &lt;ETX&gt; are ASCII control codes (the first 32 symbols in the ASCII table).

&lt;printable&gt; is every non-control code in the ASCII table.

'''Skamp:''' When needed, transmissions shall be split into blocks ending with &lt;ETB&gt;, &lt;EOT&gt; indicating overall completion.

'''El Muerte TDS:''' you don't need to split transmission into blocks, UDP is pretty much a constant stream of data so just start with reading until you get an &lt;EOT&gt;

'''Skamp:''' Mmm-kay.

==Encoding ==

When a Query or Command starts with &lt;SOH&gt;, the data is encoded up to &lt;EOT&gt;.

The &lt;SOH&gt; control character is followed by a string containing encoding information terminated by &lt;ACK&gt;. The choice of encoding is up to the implementor.

'''Skamp:''' I believe that &lt;DLE&gt; is more suitable for type definition; besides, one might want to specify more than one kind of encoding: for instance, &quot;bzip2&quot; + &quot;UTF-8&quot;...

'''El Muerte TDS:''' the string is just a identification string, so if you want &quot;bzip2&quot; + &quot;utf-8&quot; you can just use &quot;bzip2+utf-8&quot; as string, or even &quot;MySpecialEncoding&quot;. It really doesn't matter.

'''Skamp:''' I'm just affraid of implementations to use different syntaxes. One would use standard notations, and another one would use &quot;zip/english&quot; because ''it's just more convenient''. You're right, it doesn't really matter, as long as we specify a standard - or use an existing - ASCII notation.

'''El Muerte TDS:''' we could say use a mime string, application/gzip for example, or application/x-gamespy ;)

==Status Codes ==

Returned codes per command:

{|

|-
|''Code ''
|''Meaning''
|
|-
|10
|OK
|The command returned succesfully 
|-
|20
|Unknown command
|
|-
|21
|Unsupported feature
|The requested feature is not supported, can be returned in case of encoding or authentication 
|-
|22
|Incorrect number of arguments
|Command requires more or fewer arguments; in the latter case, this status code may be ignored 
|-
|23
|Invalid argument
|One ore more arguments aren't correctly formated 
|-
|30
|Disabled
|This command has been disabled by the admin 
|-
|31
|Temporarily unavailable
|This service or command is temporarily unavailable 
|-
|32
|Unauthorised
|Not authorised to use this command or invalid credentials 
|-
|40
|Unsupported encoding
|The used encoding isn't supported 
|-
|41
|Decode error
|An error occured while decoding 
|}

==Required commands ==

The following commands should be supported by every implementation:

; identify : return game identification info
: '''''input:''''' ''none''
: '''''output:''''' gamename = tag; gamever = version; netver = minimal net version

; echo : return the argument
: '''''input:''''' any number of arguments
: '''''output:''''' return each input argument

; auth : return challenge info to be used with the ''challenge'' command in order to access protected commands, or to be supplied with encoded data.
: '''''input:''''' login; password;
: '''''output:''''' challenge string

; challenge : validate the client after an authentication
: '''''input:''''' challenge string
: '''''output:''''' ''none''

; extensions : return the list of accepted extensions to the protocol
: '''''input:''''' ''none''
: '''''output:''''' list

...

==Example queries ==

'''Note:''' in the following examples, data sent to or received from the server is not real, but has been adapted to a more readable format.

; Query :
  &quot;identify&quot; &lt;EOT&gt;
; Response :
  10 &quot;identify&quot; &lt;RS&gt; &quot;gamename&quot; &lt;US&gt; &quot;ut&quot; &lt;RS&gt; &quot;gamever&quot; &lt;US&gt; &quot;432&quot; &lt;RS&gt; &quot;netver&quot; &lt;US&gt; &quot;432&quot; &lt;EOT&gt;

; Query :
  &quot;unknown command&quot; &lt;EOT&gt;
; Response : 
  20 &quot;unknown command&quot; &lt;RS&gt; &lt;STX&gt; &quot;error: unknown command&quot; &lt;EOT&gt; 

or 
  20 &lt;RS&gt; &lt;ACK&gt; &lt;EOT&gt;

; Query :
  &quot;echo&quot; &lt;RS&gt; &quot;this text&quot; &lt;GS&gt; &quot;echo&quot; &lt;RS&gt; &quot;more text&quot; &lt;EOT&gt;

; Response :
  10 &quot;echo&quot; &lt;RS&gt; &lt;STX&gt; &quot;this text&quot; &lt;GS&gt; 
  10 &quot;echo&quot; &lt;RS&gt; &lt;STX&gt; &quot;more text&quot; &lt;EOT&gt;

A test page: http://unreal.elmuerte.com/GQP/

==Reference ==

===ASCII Table ===

{|

|-
|'''Notation'''
|'''Meaning'''
|'''Hex. code'''
|'''Dec. code'''
|-
|&lt;SOH&gt;
|Start Of Header
|01
|1 
|-
|&lt;STX&gt;
|Start of TeXt
|02
|2 
|-
|&lt;ETX&gt;
|End of TeXt
|03
|3 
|-
|&lt;EOT&gt;
|End Of Transmission
|04
|4 
|-
|&lt;ACK&gt;
|Acknowledge
|06
|6 
|-
|&lt;DLE&gt;
|Data Link Escape
|10
|16 
|-
|&lt;DC1&gt;
|Device Control 1
|11
|17 
|-
|&lt;DC2&gt;
|Device Control 2
|12
|18 
|-
|&lt;DC3&gt;
|Device Control 3
|13
|19 
|-
|&lt;DC4&gt;
|Device Control 4
|14
|20 
|-
|&lt;ETB&gt;
|End of Transmission Block
|23
|17 
|-
|&lt;GS&gt;
|Group Separator
|1d
|29 
|-
|&lt;RS&gt;
|Record Separator
|1e
|30 
|-
|&lt;US&gt;
|Unit Separator
|1f
|31 
|}

Sources:
* http://www.cs.tut.fi/~jkorpela/chars/c0.html
* http://www.evergreen.edu/biophysics/technotes/program/ascii_ctrl.htm
* http://www.beaunet.force9.co.uk/IT4IT/glossary/CtrlCods.htm

==Discussion ==

'''El Muerte TDS:''' Everything on this page is subject for changing, this my initial concept.

'''Skamp:''' Good start! I think that in the future, technical specifications won't be enough: we will also need implementation guidelines.

'''Skamp:''' I've made some spelling and phrasing corrections, I hope you don't mind.

'''Skamp:''' Added some suggestions; I'm going to bed now :-)

----

'''Skamp:'''

''About TYPE:''

The added TYPE would allow the specification of the item's type (hexadecimal, decimal, 16 bits or 32 bits integer, signed / unsigned, etc...). I think it is important to include such information; besides, as a single char it wouldn't take much space.

The ''default type'' would apply by default to every item in the list, if not specified otherwise on a case by case basis (''specific type'').

'''El Muerte TDS:''' I think it's best to simple use plain 8bit ASCII for everything. And if the data is transmitted in UNICODE you would just add &lt;SOH&gt; &quot;UNICODE&quot; &lt;ACK&gt; in front of your transmission. I want to prevent binary data as much as possible. (unless you use an encoding)

'''Skamp:''' I didn't realize that. You should specify it somewhere, although I'm not sure to agree with that. Binary mixes quite well with ASCII, while being very suitable for numbers, and lightweight. Type enforcement is a big concern to me, since existing implementations of the GameSpy protocol have shown to be '''very''' inconsistent. I believe we need a stricter protocol.

On another subject: your redefined RECORD is much simpler and clearer than mine, sometimes I probably should go to bed earlier :-) By the way, EBNF standard notation for comments encloses them in ''(* *)''; although it doesn't matter now that you used C-like notation, it will matter when writing the RFC.

'''El Muerte TDS:''' The problem with binary data is that it will introduce endian problems (sure it's a single line in the definition that everything is big endian), But i just want to make sure we don't have to deal with 0x00.

EBNF has a format for comments ?! Didn't know that.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte/Journal History 1</title>
    <id>1179</id>
    <revision>
      <id>3076</id>
      <timestamp>2004-03-03T08:28:21Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==UTelAdSE ==

===ConsoleCommand issues ===

Console commands are great, but why does it work how it works. I want to get server access to a console as powerfull as the players console (ExtendedConsole), but requires to use Interactions.

The only accessable consolecommands (Level.ConsoleCommand and PlayerController.ConsoleCommand) only have some basic working commands, and no feedback if a consolecommand exists.

How can I use interactions on a server, I don't have a viewport (Player instance) and spawning a PlayerController doesn't give me a viewport. 

Trying to create ExtendedConsole and InteractionMaster instances on a custom PlayerController resulted in a server crash when I called ConsoleCommand. I nullified all code in my new interaction classes, and still I get an error.

Is there an other way to call console commands ?

'''Dma:''' All [[Legacy:Actor|Actor]] and [[Legacy:Interaction|Interaction]] subclasses have consolecommand.  However, the [[Legacy:Interaction|Interaction]] one returns a bool instead of a string.  There are other differences as well.  The console command is executed in the context of the actor, but this rarely makes a difference.

'''El Muerte TDS:''' Well the ConsoleCommand method in [[Legacy:Interaction|Interaction]] has more power then the one in [[Legacy:Actor|Actor]] (as I said above). I want a white-box ConsoleCommand.

===Edit gametype settings ===

How can I implement this best ? The WebAdmin and xAdmin use Game PlayInfo classes. Using PlayInfo is the best solution because this would allow you to set mutator settings as well (when they are loaded) (available in the nest UT2003 version (2136+)). I think it's best to implement it sort of the same way as the MapList editor, to use an option flag `-gametype` to set a value for the specific game type. Changes should be saved when submitted in order to support more admins at the same time.

{{innerbox| /gametype &lt;list&gt; | &lt;set&gt; [-gametype] setting value | &lt;get&gt; [-gametype] [mask]

 &lt;list&gt; display list of available gametypes

 &lt;set&gt; set a setting to value

 &lt;get&gt; get available settings, matching mask

}}

===Default properties and config ===

I came to an intresting discoverry when I released the first version of UTelAdSE. 

You can use the [[Legacy:Default Properties|default properties]] to define the default value of a configurable variable. When this option is not configured it will use the default variable. This doesn't work the same way with dynamic arrays, instead dynamic arrays will sometimes be initialised als null.

Let say you have the following:

&lt;uscript&gt;
var config string astring;
var config array&lt;string&gt; stringlist;

defaulproperties
{
  astring=&quot;not empty&quot;
  stringlist(0)=&quot;zero&quot;
  stringlist(1)=&quot;one&quot;
  stringlist(2)=&quot;two&quot;
}
&lt;/uscript&gt;

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''ini configuration'''''
| style=&quot;text-align: center&quot; |'''''initial values'''''
| style=&quot;text-align: center&quot; |'''''notes''''' 
|-
|empty
|astring=&quot;not empty&quot; &lt;br /&gt;                        stringlist(0)=&quot;zero&quot; &lt;br /&gt;                        stringlist(1)=&quot;one&quot; &lt;br /&gt;                        stringlist(2)=&quot;two&quot;
|
|-
|astring=&quot;new value&quot; &lt;br /&gt;  stringlist=&quot;0&quot; &lt;br /&gt;  stringlist=&quot;1&quot; &lt;br /&gt;  stringlist=&quot;2&quot;
|&lt;br /&gt;  astring=&quot;new value&quot; &lt;br /&gt;  stringlist(0)=&quot;0&quot; &lt;br /&gt;  stringlist(1)=&quot;1&quot; &lt;br /&gt;  stringlist(2)=&quot;2&quot;
|
|-
|astring=&quot;something&quot;
|astring=&quot;something&quot; &lt;br /&gt;                        '''stringlist(0)=null''' &lt;br /&gt;                        '''stringlist(1)=null''' &lt;br /&gt;                        '''stringlist(2)=null'''
|&lt;br /&gt;As you can see when you don't define the value of a dynamic array, but do configure an other variable the dynamic array will be initialised as null
|-
|&amp;nbsp; &lt;br /&gt;  stringlist=&quot;new&quot; &lt;br /&gt;  stringlist=&quot;newer&quot;
|&lt;br /&gt;  astring=&quot;not empty&quot; &lt;br /&gt;  stringlist(0)=&quot;new&quot; &lt;br /&gt;  stringlist(1)=&quot;newer&quot; &lt;br /&gt;  '''stringlist(2)=null'''
|
|}

===Telnet Protocol ===

Telnet is very simple, it's just 7bit ASCII and nothing more. But there's a litte bit more, Telnet Commands, these can be used for special actions like turning on/off local echo, or retreive the terminal size. The only thing is, for some commands you need binary read/write methods because the NULL char is used in some occasions.

Well no real problem, just switch to Binary mode for the negotiation. But binary support is limited to manual reading because the events are broken. Manual reading doesn't work very well since you never know if there's something to read, you can't just poll if there's data because the Data pending methods/vars are broken too.

I've now made a terrible method for doing this using some loops and stuff.

'''''19-01-2003''''' well binary events are fixed in UT2003 version 2175 and up, so now I'm able to improve the code. Ofcourse I need to keep backward compatibility with older versions so the old code is still there and used when the version is below 2175.

===Bugs ===

Bugs are a pain in the ass. But things that works ok on one system, but totaly works wrong on a other system are just ridiculous. UTelAdSE works perfectly on my test system, but a friend reported that local echo was not disabled on his client when he uses UTelAdSE on his server. The weird thing is, the client works correctly. After the login prompt is received by the client nothing should happen. But on his system telnet control negotiation happens after the prompt enabling local echo. This is just plain stupid because UTelAdSE doesn't send any control sequences to the client at that point.

Bug was solved with v101, but I didn't do anything diffirent afaik. 

===Documentation ===

Good documentation is required, even if people don't read it. Writing documentation is just plain boring. Also formatting the documentation correctly so it will be usefull and clear. Usualy this isn't realy a problem since most text is straight forward. But what to do when you have to document a lot of pretty advanced builtin commands.

For example you have a command that can do the following:
  /maplist list
  /maplist add CTF-Map.ut2 ...
  /maplist del CTF-Othermap.ut2
  /maplist move 1 2
  /maplist view
  /maplist -gametype BR list
  ...

First I have to give the full commandline possible, so something like:
  /maplist [-gametype type] &amp;lt;list|view|move x y|add maps ...|del maps ...&gt;

Then I have to explain the stuff. And that for a lot of commands. It's better that somebody else writes documentation :)

===ladder/profile editing ===

Objective: keep a list of predefined game settings

Need to ask Evolution about this.

Evo's Ladder is a shit load of non linear code (just like UT2003), damn it takes a lot of time to go through it, I bet people get the same idea when they check out the UTelAdSE code.

Thanks to the additional WebQueryHandler Evo provided with Ladder coding the UTelAdSE plugin for this is pretty easy, this way I don't have to find out everything myself. But still it's a lot of work. I'm no stuck at the Profile editing and Profile management, it's a lot of pretty &quot;dumb&quot; work, most of the time it's just copy paste and adjust. I prefer inventing stuff.

===Coding block ===

'''''19-01-2003''''' it sucks, plain as that. There are quite some TODO points left (Evo's Ladder), but I just don't feel like implementing it. Simply because it's not a real challange. I don't realy have to come up with new things, all I have to do is somewhat copy part of the gametype editing code and use it with the ladders. You can't realy force yourself to start working, so in result you just don't do shit. Besides I also have to do other stuff (yeah right).

===TitanIRCd ===

'''''26-01-2003''''' UnrealIRCD is a subclass of the UTelAdSE system, instead of followng the telnet standard it will talk IRC. This will add some limitations since the client side does all the output rendering, for example the hangman game would not be possible. But this would also introduce some usefull features for the clients connecting to it, like a channal for the chatting and real time player management (kicking/banning/chatting), auto reconnect (by the irc client), etc...

It should be quite easy to extend the current system to talk a diffirent TCP protocol, some changes have to be made in the connection accepting class tho, but that would be it.

UnrealIRCD would be a straight forward IRC server with ofcourse not all IRC feature implemented, just the one's realy needed by the server. But a possibility for the future would be an actual relay chat server (with netsplits on every map change ;))

'''''27-01-2003''''' pff, implementing an IRCd is a real pain, the IRC RFC is written from the client perspective. But with the RFC and packet sniffing I've come a long way. Ok the current set up is: two windows, one for chatting and one for the actual administrating. The admin commands have to be send via messages because it's easier to use, otherwise people need to /quote all the commands. The chat window would be pretty nice because using /whois you could retreive the user info like: host (duh), player ID, CD Key Hash, etc.. Also the /kick command should.

Admins will get a @ prefix (duh), real player will get a voice, and bots won't get anything (because they don't realy have a voice). The WebAdmin sepectator (and UTelAdSE, BullShit, etc...) will also show up in the list.

There are however a couple of normal IRC commands/features that should not work: JOIN, PART, BAN (could be possible tho), private messaging, channel mode changes, user mode changes, notices, ...

'''''28-01-2003''''' changed the name to TitanIRCd which is short for Trivial Interactive Text Administration Network . Heh.. ok it's just a name. Also found the IRCd RFC (IRC server RFC) http://rfc.sunsite.dk/rfc/rfc2813.html that would help me on my journey.

'''''28-01-2003''''' development is going pretty well, but now I walked into a wall, sort of. I need to keep track of all users in a general place, I only get join messages of real players not all sorts of other players. So I need to keep track when a unknown person speaks it should join the server. But I also also add his info record in a general place, this means I also need to keep track of the IRC clients to forward the join messages. But anyway, I have had an actualy IRC conversation on the server today :)

'''''31-01-2003''''' well development is coming a long very well, I've almost implemented all functionality. The admin channel works like it should (I think). Player joins/parts are reported. Only name changes of players are not reported, looks like I don't receive that gamemessage. There are just a few things I have to implement for the first beta release. Maybe tomorrow.

'''''10-3-2003''''' No this one isn't dead yet, just not so active. Added a couple of function to replace the usage of tabs, tabs a evil since they tend to screw up a lot. Also tabs don't work with most IRC clients. Thus I implemented AlignLeft\Right\Center, soon to be added to [[Legacy:WUtils|WUtils]]

----

'''DJPaul:''' Hope you don't mind greatly me writing here, but: UnrealIRCd is, indeed, an actual IRCd.  The same name would confuse people.  See http://www.unrealircd.com/.  If i'm reading this right, WHY does UT need a IRCd?  If you just want IRC&lt;-&gt;UT talk, you can use http://serverdev.beyondunreal.com/.  Yes, you could handle players/chat via IRC...

'''Mychaeel:''' I suppose to allow server administration via IRC.  I could imagine that'd appeal to many people more than telnet administration (though that's pretty neat too)...

'''El Muerte TDS:''' oh damn, ok.. guess I need a new name for it

===TODO ===
* ofcourse check for any security issues
* add ladder/profile editing
* documentation

==BruteForce ==

BruteForce is a small programming language written in UnrealScript. Don't ask why, just because.

The source code and specifications are available from my [[Legacy:CVS|CVS]], and accessable via

http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/BruteForce/

The language is case insensitive and type complete.

The ENBF specification is not complete.

I may need to switch to actually seperate compiling and executing. Otherwise it's notpossible to do a while loop without very ugly statements, even worse that my if-then-else solution.

Note: BruteForce has a very usefull [[Legacy:Tokenizer|Tokenizer]], you may want to take a look at it when you need to do parsing of text.

'''''16-4-2003''''' rewrote my previous grammar, and started on a new compiler to create an AST so I can actually execute the code after compiling it. On the fly execution just doesn't work.

'''''17-4-2003''''' add support for function declarations, I think I now have all the functionality I want in the grammar (except for some builtin functions, but those don't matter much). I really should start to figure out how I can implement the AST.

This could be a solution:

&lt;uscript&gt;
struct Node
{
  var tokenType  token;
  var string     value;
  var array&lt;int&gt; children;
}
array&lt;Node&gt; Tree;
&lt;/uscript&gt;

Ofcourse I need to filter out the useless tokens and convert identifiers to keywords.

oi nutter, changing infix to prefix notation is difficult when you are using a recursive decended parser. I need to switch tree nodes around or something, but I also have to track the depth... Argh, need to get my mind of this for a while.

'''''18-4-2003''''' finished the AST and implemented an interpreter. The AST is not complete since the function declarations are not passed on, I need to think of a good way to do this since I want to be able to store the functions, I don't want them executed everything the main code is executed. Also the interpreter is not complete, the operators only work for INT types at the moment and the type conversion isn't implemented yet. But for the rest it works like a charm. I've also added a print(), argc() and argv() function. To implement the function calls I had to make my grammar LL(2) :( There's no other way to do that except for a special token for a function call, and that simply sucks.

&lt;uscript&gt;
a = doSomething(a);      // nice
a = call doSomething(a); // ugly
&lt;/uscript&gt;

'''''21-4-2003''''' fixed the type completeness, there are only some wierd things, like wtf does &quot;string&quot;-&quot;string&quot; do !? So I left that ''blank''. Also fixed the execution order, 1-2+3 would be executed as 1-(2+3). To test everything I converted the timestamp function from [[Legacy:Wutils|wutils]] to BruteForce and it works , woohoo... Now to add support of functions and then my current specification is complete.

Yes... working function calls, the solution was quite easy all I had to do is add a new declaration type Function and jump to the tree node where the function code is. The input variables can just be read from the refering node. Also added AND, OR and MOD operators.

'''''22-4-2003''''' Help, it's slow ;) Takes about 2 seconds to calculate 100 easter dates. And I think most of the time is used by the Scope class to lookup declarations, not sure tho, there's no good way to calculate the time used by the Scope, or is there ?

Anyway, current state is pretty usefull. Maybe I need to add output variables to the main program block.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte/Journal History 2</title>
    <id>1180</id>
    <revision>
      <id>3077</id>
      <timestamp>2004-03-03T08:29:19Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==UnCodeX ==

[[Legacy:UnCodeX|UnCodeX homepage]]

===Status reports ===

'''''1-2-2003''''' Ok the first step works. I created a class tree from scratch in 35 seconds (source dir was on a SMB drive so might be faster when I read those file from a local machine). Also created a token parser to easily read the contents of the source.

'''''1-2-2003''''' Eek. Evolution just noted me on a nice issue: multiple classes with the same name in diffirent packages. So let's see you have the following:
 + Object
   |
   +- SomeClass (in Package1)
      |
      + SomeClass (in Package2)

How to detect that ?! The only way I can think of is is using a package priority list.

'''''2-2-2003''''' Argh, the whole tree creation time takes about 5 second now, but when there are classes with the same name in diffirent packages it breaks tree. And I can't think of a good method to create the tree and keep the algorithm fast enough.

'''''2-2-2003''''' Woohoo, found a way to use the package priority in the routine. Now the tree will only break when the package priority has not been set, and that doesn't matter much, I'll add a warning on startup when a package has not been prioritised

'''''2-2-2003''''' Ok if people want to test the current version you can download it , you have to edit the UnrealTree.ini file to point to the correct location. 

'''''3-2-2003''''' Started on the class parsing, consts and vars work. But I need to check on types of dynamic array, class and inline enums. It's still very fast :)

'''''3-2-2003''''' enums and vars of type array/class and inline enums are now parsed correctly. (new alpha available, right click the class tree for more options)

'''''4-2-2003''''' functions are also detected and almost parsed completely, same for structs. so at this time I'm able to convert a unreal class to an object with all the class it's features. Parsing the Actor class costs about 0.01 second. I think I can start the part of the HTML output. I'm going to implement the HTML output using templates for each part of the class, this way you can completely customise the way the HTML files are constructed.

'''''6-2-2003''''' Now working on the ouput module, I need a very fast replacement engine to use with templates. Before I start to write my own does anyone know of a good (basis) replacement engine for Delphi\ObjectPascal. I tried TemplatePower and it's too slow.

'''''6-2-2003''''' Started to work on my own parser, it's fast enough. The current alpha produces all the files except the class files, and does this in a little over 2 second (43 files). I've supplied a basic template with the alpa, replacements are between '%' tokens. Note, you have to start UnrealTree with the correct working directory set to the location of UnrealTree or else it can't find the template files.

To create the HTML files you first have to create the class tree.

'''''6-2-2003''''' Fixed a couple of parsing error related to the cpptext {} blocks and appear in the normal source. Also added a global ignore on state and code, need to work on state processing. All these cool features in UScript make it pretty hard to parse. At the moment analysing all 1380 classes takes 5.5 seconds, and creating all HTML files takes 18 seconds (class files are not complete). Anyway, so far so good, performance is realy better than I ever expected.

'''''7-2-2003''''' Again some more fixes in the analysing code. Also added a new option to scan for orphan classes. Use this to tweak the Package Priority settings, when the priority is correct you should have no orphan classes. The class overview HTML file how has some more info, the rest is coming. Also need to focus on type links

'''''10-2-2003''''' I need to scan functions inside the states because these functions are often used, that means I have to process state definitions because functions overwrite themselfs in states. Searching for an already defined method takes a lot of time since it has to go through the whole list everytime. So this could better be done on the output processing. But now the difficult part, state processing. The syntax of a state:

&lt;uscript&gt;
[modifiers] state &lt;name&gt; [extends &lt;name&gt;] 
{
  [ignores &lt;method&gt;, &lt;methods&gt;, ...;]

  [methods ...

  [label:
    code;
  label:
    code;
  ...]
  ...]
}
&lt;/uscript&gt;

The problem with this is that you don't know a function declaration until you find the correct keyword, checking on a semi colon is not enough since the following code is still parsed as a possible function. If UScript enoforced labels to be at the end of the statement this wouldn't be a problem, but is it enforced?

I also need some nice images for buttons and stuff.

'''''10-2-2003''''' State processing is done now, also fixed a couple of other bugs in the analyser. Most of the analyser code is done. My main focus is output processing. At this time it takes about 1 minute to generate all HTML files from scratch (including analysing of the code).

'''''10-2-2003''''' My current implementation of the type link caching is pretty slow, it doubles the time needed for HTML generation, and I only resolve the return values of functions not even the params. I think it's because of the site of the string list since it didn't matter if I used an straight list or an inheritance list for the class generation. So I guess I need create a diffirent type for the cache.

'''''11-2-2003''''' Found a pretty excelent StringHash class for delphi that brings back the HTML generation back to 45 seconds. There's just one issue and that's with classes with the same name, this might screw up the link to the type, but there's not much I can do about it.

'''''12-2-2003''''' Fixing things up on the alpha, beta should be there soon. Made a nice UnrealWiki style as default template.

'''''15-2-2003''''' The tree state can now be saved and loaded, it's a bit faster than rebuilding the tree when the files are already cached on the file system. Also changed the templates a bit to include titles, this way when an class doesn't have functions it won't display the function heading. Still thinking weather or not I should include inherited vars/enums/structs/... It's quite usefull.

'''''17-2-2003''''' Fixed a stupid bug in state loading, and implemented the inherited properties list. Need to cache this tho, takes a pretty long time an Object is scanned 1400 times :) Also need to add an option for max inherited classes, I don't people want to inherit upto object everytime.

'''''17-2-2003''''' Fix another bug in the state loading. Also inherited properties are now cached, makes it a lot faster, 90 seconds for all HTML files. Also put in a configurable limit (in template). Also sorted all the properties. Forgot the other things I fixed/changed.

'''''19-2-2003''''' renamed it to UnCodeX, it's a much better name. Finishing up some code, and implementing two new things, a glossary and classtree (in HTML). Need to address a few things before I make it beta, types: class&lt;..&gt; and array&lt;..&gt; also make sure all &lt; and &gt; are translated to the correct HTML special chars

'''''24-2-2003''''' fixed the array&lt;..&gt; return types of functions. Also implemented the glossary, and I need to redesign this because it's too slow and too big. Also resolved the types array&lt;&gt; and class&lt;&gt; and fixed the &lt;, &gt; and &quot; characters in the HTML output.

'''''27-2-2003''''' Improved the glossary code to create more pages (for every letter one), HTML generation now takes about 90 seconds. Also added replacements for package path and class filename so you can link to the source code from the browser, if you set things right the browser should open your favorite editor. Too bad that Mozilla really downloads the file from disk to disk and then launches the application. MSIE does open the direct file.

'''''2-3-2003''''' Finishing up the alpha version, added the Class Tree page and changed the page footer replacements. UnCodeX is almost full featured. If anyone has some ideas for extra feature please contact me.

'''''2-3-2003''''' Add support of MS HTML Help generation, all you have to do is install MS HTML Help Workshop, config UnCodeX to point to the HTML Help Workshop path and press the button (after you created the HTML files). A .chm file will be created (should spare you about 1000% diskapce.

'''''4-3-2003''''' Fixed a parser bug introduced in a few version back. Also optimized the HTML Help creation a bit. Added buttons to add/remove packages from the priority listing. Well this is the final alpha version. Should be finishing the code now and make it beta.

'''''6-3-2003''''' Started a bit on the polishing of the interface. Most things can now be turned of and stuff, except for the menu bar, when I hide it the System Menu addition get's screwed. Also worked a bit to get UnCodeX working as a Application Toolbar (like the taskbar and ICQ), but dang you have to do a lot of stuff yourself, I expected that I just had to announce that my app was a toolbar and that the ''window manager'' would do the rest. Oh, and I moved the log file to a horizontal position. Also from now on the source is available from my CVS server, watch out for messy code.

'''''6-3-2003''''' Added the run and join server commands, also implemented the compile class method. For the rest nothign serious.

'''''7-3-2003''''' Improved the App Bar feature, it should work now much better, also fixed the menu hiding. The only problem is that you can not unhide the menu bar when you are in App Bar mode. So I need to add a caption button to display the &quot;View&quot; menu since the System menu is disabled in that window type. Also need to implement to binding to other sides of the screen.

'''''10-3-2003''''' Well finally finished the AppBar feature, it can now be bound to the left and right side of the screen. Also you can start it as a app bar. Some funky shit happened here when you switched back to a normal windows. But by called two functions the other way around it was fixed. Any graphic artist in the room ? I need some original art for the buttons.

'''''10-3-2003''''' Again some points off my todo list. Still not sure about implemented the &quot;grep&quot; feature. Ofcourse it's cool to add as much functionality as possible to the app, but it should remain a 'tool' not a unusable swiss army knife. Also thought about adding a ''tool'' menu, but I don't think it's a good idea. UnCodeX is a tool, a tool that you would start from your favorite editor.

'''''11-3-2003''''' Implemented a full text search with regex support so search the body of all scanned classes, it's quite fast. Also added a search history to both the FTS and class search feature. And ofcourse added the option to ignore packages, I wonder why I forgot that one.

'''''13-3-2003''''' Here's an idea, caching the class details, it is usefull but requires a lot of memory thus create longer loading time. Another idea is to analyse on the fly when a class is selected, this however won't give you the ability to scan up the tree for inherited properties. But I don't think it would be wise to include inherited properties since usually there's already more than enough to display. 

Note, also add the default properties to the class.

'''''20-3-2003''''' Need to find a fast way to store/load class details and use it together with the last change date of a file. This way I could dynamically reload the class when it has changed (as long as it's parent hasn't changed). Also with the saving of class details I could add a much better tags support than ctags can provide. There should be a way to add those tags to the editor no matter what (using keypress simulations), but this can be tricky. But first, create a fast class detail loader/saver.

The way it should be saved for best load performance:
 UClass
 +&amp;ndash; state
 |   +&amp;ndash; function
 +&amp;ndash; enum
 +&amp;ndash; struct
 +&amp;ndash; var
 +&amp;ndash; const

Also considder adding a form of source code commenting, /** your text **/ would be a good format. These type of comment must precede an code block (var declaration, method, etc..) and then it will be used

'''''20-3-2003''''' Well added the option to add comments to the exported HTML files, it's JavaDoc style but without the additional formatting, so comments between /** and */ are used. To comment something you have to place it above the thing you want to comment. Also fixed the parser big time, strings now have their leading and trailing &quot; also names are supported.

Still can't figure out how to prevent the collapse\expand of the tree on a double click without breaking something else.

'''''25-3-2003''''' wrote a new state saver/loader this one can handle class details so from now on class will contain details when UnCodeX is started. Everything is saved ''except'' for the comments. The state file is around 800kb for my UT2003 installation. Also added a -tags command to display the properties on startup/reuse but the window displaying needs to be improved. When you double click a property item it will open the source (at that position). Note: also look into a way to click and add the property to the editor.

'''''26-3-2003''''' Improved the window placement of the Tags window, it will now also disappear when unfocused, unless you change it to a real window.

'''''28-3-2003''''' Writing help files is boring.

'''''8-4-2003''''' Been a while since I added something here. Currently working on a new hint window to give better feedback on the class properties. I also plan to improve the text copied to the clipboard when you select a class property. I want to add the function template when you select the function. So ''function Test(Pawn A)'' would be copied to the clipboard as: ''Test(Pawn)'' this way you would know what arguments to use. I'm also going to look into a way to add the selected property to the to the edit window you called it from (if possible).

'''''13-4-2003''''' Well UnCodeX is wrapping up, not much things to fix/add. So I think I can move it up to stable soon. The only things left are support for custom output modules, also maybe syntax highlighted source code to the HTML output. Ok so I guess theres still much to add. I'll shutup for now.

'''''29-4-2003''''' I've added an experimental source code preview in 065, it requires some fixing. Never worked with RichEdit before. For some reason I can't fill the content via a memory stream, only via a file on disk. Also need to figure out some other things like: ctrl+click to search selected word (requires an alternative word selector routine), hilight/focus a search result line

'''''2-5-2003''''' Argh I'm going nuts, in order to get a usefull source preview I need to make sure the words are broken correctly, by default the RichEdit control breaks on a '_' and that's bad. So I had to replace the word break method. No problem there, but I can't get my work break method working. The right side is always correct, by the left side always screws up. I can't see wtf I'm doing wrong.
:'''Mychaeel:''' Source code should't be word-wrapped at all to start with, in my opinion...
:'''El Muerte TDS:''' it isn't, but the word break method is used for selection, e.g. if you double click a word the function is called to retreive the selection area of the word.

'''''9-5-2003''''' Starting the final cleaning up and making sure the units are as solid as possible. Also started a little side project for a commandline version of the HTML Doc generation.  This might be included in the final release.

'''''10-5-2003''''' Well I'm going to scrap the idea of a commandline version, it's requires more effort to work around some issues than it would add more use to it. It's not even userfriendly (on a windows system).

'''''17-5-2003''''' I've been messing around with some extra plugins. On of them: a plugin to create DOT files to be used with [http://www.graphviz.org GraphViz] is giving me headachs. When I calculate the class/package dependencies I create a new list to hold these dependencies. But for some reason I keep getting errors from the memory manager.

Another thing I working on, haven't started on the coding tho, is a plug in to create XMI files. An XMI file is a standard format to store entity relationship models in. The Ecplise envoirement has a plugin for this and also other programs support it. But I fear I will get into the same problems with this plugin as I have with the GraphViz plug in.

'''''19-5-2003''''' '''aaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrggggggggggggggggggghhhhhhhhhhhhhhhhhh''' My god what a BPB, I .Free()'ed where I should have .Clear()'ed

'''''22-5-2003''''' The GraphViz plugin is coming a long nicely. Still on the lookout for creating a UML ouput plugin. The problem is that XMI doesn't seem that portable. Haven't found a free UML tool that can export to XMI, AragoUML and Eclipse use XMI internally but they are not exchangeable. At this rate the GraphViz plug-in will be included with the final UnCodeX version but the XMI/UML plug-in won't.

'''''25-5-2003''''' I've had it with this crap, XMI and about all UML tools are the largest piece of crap ever made. Even the IRC protocol specification is better than how all those UML tools implemented their support for the XMI standard. I've tried a couple of (semi-)free UML tools and whatever they generated/exported was not usable in any of the other tools. Copy pasting an example from the XMI specification couldn't even be read my any of the tools. Afaik Rational Rose is the only tool that might produce something usefull. Most UML tools had support for importing the native Rational Rose format, and I've been told that Rational Rose also has XMI support. Ok maybe the commercial versions of the tools I tried work ok but I can't try those because of the very high price on them. How do they expect that customers buy their software when their free/demo versions are a piece of crap.

'''''6-6-2003''''' Ok, one month to prepare another release of UnCodex, yes I'm going to enter it into the contest. A few things I want to implement before that time: inline search, external/internal comment processor support (HTML output), fix those &quot;weird&quot; bugs

'''''22-6-2003''''' Well added DDE support to UnCodeX to pass the commandline arguments to it. There's just one little problem. The Borland implication of DDE has a little bug (open connections are not closed on shutdown). I fixed that problem, was just one line. But I can't add that file to the UnCodeX source (it's not part on the no-nonsense license). So either I have to reimplement the whole DDE part myself, find a open source DDE implementation, find a workaround for the current problem or remove the DDE support.

----

'''Mychaeel:''' Mind if I, for the pure sake of aesthetics, rename this subpage to &quot;Developer Journal History&quot;?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte/Journal History 3</title>
    <id>1183</id>
    <revision>
      <id>3081</id>
      <timestamp>2004-08-18T02:26:04Z</timestamp>
      <contributor>
        <ip>Astound-64-83-232-27.mn.astound.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==14-7-2003==

Long time no entry. I'm going to switch the layout of my dev journal to a per day basis without sorting on project, may be much more readable and it'll allow me to rant on about other things during my developing.

So, the MSU Phase 1 is closing soon. I'm really intresting to see what people have turned in, at least I hope they are going to publish a list of all accepted entries. I wonder if UnCodeX has a chance in the Tool's section, I don't think my other mods have much chance in winning something.

But it's not like I did those projects for the money, I think people creating mods/etc. for the money will only produce crappy mods/etc. because they haven't poured their heart into the project. You can't see very well with dollar (or euro, or whatever) signs in your eyes.

Grrr... I really hoped by this time I was able to log into the VPN again, that's why I started this log entries because the f#cking VPN keeps refusing connections. I really hate it because now I can't continue with my work.

==16-7-2003==

Damn it's hot. Both the outside temperature and my coding speed have resulted in the melting of my workstation's keyboard. It looks like a Dali painting ;)

Anyway, it is damn hot. But that doesn't matter much, the problem is that it's still hot at night. And since it will remain hot for a long time I've shiften my day schedule. Usualy I'm awake from 9:00 till 2:00/3:00. But since it's much cooler in the morning I've decided to get up at 7:30. 

I really wish I had a laptop so I could sit outside and keep working, but sure you can't have everything.

So MSU phase 1 has finally been closed, I wonder how long it'll take before we'll get to see a listing of all  accepted mods.

==17-6-2003==

GUI designing is damn awefull, specially when you want too much stuff into a single screen. What's the best way to do it, how can you split it up into seperate windows, etc...

And ofcourse, you always have to keep in mind to create dynamic layouts, you don't want to hard code every GUI object when it's not needed. The real pain in dynamic layouts is that you can't simply switch to GUI editor mode to change the layout, copy and paste the new dimensions. You have to tweak your formula until it's correct. And evertytime you have to recompile and test it again.

With designing GUIs you will always run into the problem what the best layout it. Because it has to fit on the screen, but also remain functional and look good. The looking good part is something for the art department. As for designing the layout, you could just create the components and tweak them inside the engine but this is slow. A good alternative is to use a presentation program (like MS PowerPoint) to design the layout. Simply create all the components inside PowerPoint (just use rectangles of diffirent colors for the various components that don't have an existing power point representation) and drag them around until you find a good layout. Save it, print it, ... Now you have a good template on how to position the items. All you have to do now is create the components in UnrealScript, launch the game and tweak the positions using the in-game GUI editor.

==30-6-2003==

Finishing up the first release of [[Legacy:LibHTTP|LibHTTP]]. LibHTTP is a well written general purpose library for accessing data on webservers. Since this is something a lot of people want in their mod I decided it was a good idea to write one well written open-source free to use library that will do it for you.

This way mod developers can use their time on their mod instead of writing yet another class for downloading webpages.

I hope other mod developers take up this idea to create open source libraries for common operations. This way there will be more well developed building blocks to use. Which will have a result in more high quality mods available.

==4-8-2003==

It must be summer. And you know why, my damn mouse is sticky, nothing on TV, no great games released.

So I decided to play Unreal again. It's still a great game to play, the large outdoor maps and the mysterious areas makes it a great game. It's pretty damn difficult in the highest difficult setting, specially when you are in tight rooms with a lot of Skaarj (Damn ISV Kran decks).

Still haven't played Unreal 2 a lot, don't know why. Maybe because it's a bit too heavy for my machine.

==29-8-2003==

A bit silent on my public side. Just too busy with things I can't talk about yet.

On the other side. Tron 2.0 is a pretty cool game. They really respected the Tron world as defined in the first movie, basic coloring with nice glow effects. Ofcourse it looks a bit more advanced because the current computer are way more advanced. If you liked the Tron movie you might want to check this one out. 

==4-9-2003==

Well I started on a complete rewrite of my UTelAdSE system. The new design uses a central daemon that can have multiple interfaces to connect to, so it's even more modular that the previous design. Also the authentication has been split off into a seperate object. This way it's possible to change the authentication to use a diffirent system.

The telnet interface is almost done, the most important part the terminal handling is done and it's much better than the previous one. You have the same commandline powers as you have with bash, the previous implementation was very limited (like the DOS prompt).

Also started on the IRCd implementation. I'm complety changing this implementation, I'm going to design it so that you could link various servers into a network. This network would consist out of at least one real IRCd when that the UT servers will link to. This real IRCd has access to all channels servered by the various UT servers linked to it. The IRCd that runs within the engine only has access to the local channels, this is to reduce the load. The unreal IRC server will netsplit on every map (ofcourse).

As for the applications/commands, not much has changed from the previous system. I still use a dynamic array for calling the commands with arguments. However I did change it a bit, commands have to be registered in the daemon, this way I can look up what application object has the requested command. This reduces the function calls needed to call the right command.

==8-9-2003==

Man what does the IRC protocol suck. Just the basic implementation of various commands sucks.

Anyway, ordered me a nice Toshiba SatelitePro m10 laptop today so I can keep on coding where ever I am.

====Comments====

'''Dante:''' Yeah IRC protocol just sucks. I tried to write like 3 IRC clients before, I always stopped at a point when I just got annoyed ;)

'''El Muerte TDS:''' the server part is much worse than the clients part

'''Dante:''' Depends how customizable you want the client to be. I don't think the server part is much more difficult.

'''El Muerte TDS:''' IRC clients are dumb, the server has to figure out everything, and that adds a lot of administation. And it's not that it's more difficult, it's just that it's more of a pain to implement.

'''Dante:''' Yeah clients are kind of dumb, the server still isn't much more clever. Basically it does nothing more than dispatching. It doesn't care for ctcp stuff and such things. Administration is handled thru bots (which are clients) like chanserv. The main pain in writing a server might be security.

'''El Muerte TDS:''' well the server has to keep track of what channels there are, who is in that channel. But you've also got to keep track of the server relays if you have more than one server. This server relaying is hacked into the protocol, wel at least it looks like that.

==10-9-2003==

Almost completely redone the Marky Mutator, the initial release didn't even work online, that's what you get when you ship when it compiles late at night ;). Anyway, the current version is pretty much done, it supports additional pop-up faces, by default it has Mark Rein, CliffyBunny and the Dopefish. I'm waiting for a response from Mark Rein before I will ship this version. I asked Mark Rein if he could record him saying &quot;Two Weeks&quot; so I could use that when his head pops up ;)

Also yesterday my laptop arrived (damn quick), it's a really nice toy :D

==24-9-2003==

Yahoo the evil european software patent directive has been accepted. Start saving money for your first patent infringement.

'''Foxpaw:''' What's that about? I've never heard of this software patent directive?

'''El Muerte TDS:''' Read [http://yro.slashdot.org/article.pl?sid=03/09/24/1253227&amp;mode=thread&amp;tid=155&amp;tid=185&amp;tid=99 this /. article]. Be sure to check out the linked articles for more details.

'''Foxpaw:''' I still don't get it.. how does this &quot;software patent&quot; differ from the IP protection that you already have? Or does it allow people to patent a software notion like anti-aliasing?

'''El Muerte TDS:''' with patents you can prevent people from inventing the same you did, if you own a patent somebody else may not build the same unless it licenses your patent (this protects your invention, but also kills free enterprise). For example, there was a patent on the LZW compression algorithm, LZW is required for GIF files, so you had to license the LZW algorithm before you could write a program that creates GIF files (USA only). This patent is correctly assigned, it does protect the invention and research. But the new software patent possible in Europe (you could always patent these but they were not backed up by law) allows you to patent non-sence (already possible in the USA).

A few examples of non-sence patents: Amazon's &quot;One Click Buy System&quot;, or the recently assigned patent for Microsoft that describes the usage of cookies to keep track of a user id and using that info to look up the user preferences for a web services (a lot of meta sites, online stores and forums use this &quot;technology&quot;). [http://swpat.ffii.org/patents/samples/index.en.html an larger list of interesting patents].

You can't request a patent on inventions already used a lot (&quot;prior art&quot;). Patents are just evil, they used to protect inventors from large companies, but it's now used buy large companies to prevent some compitition and earn money.

And now for the answer to your question, IP is for the your creation AS-IS, not the technique. Here's an bad example (below is ofcourse not possible):

&lt;uscript&gt;
// to increase the value of a number by one:
i = i + 1;   // your creation, people may not use this AS IS

i = 1 + i;   // not the same as yours, but a patent prevents you from using it
i++;         // if you had a patent this was not allowed either
&lt;/uscript&gt;

==20-10-2003==

Screw modelers, all I wanted was a pretty simple static mesh of a beer bottle crate. No free public assets for that and nobody remotely interested in helping me out. So I decided to mess around with Maya myself. Worked out pretty well, I managed to create a 7x5x4 cube (it's harder than it sounds ;) ), and mapped by texture on it. And it looks quite well. Except that all faces of the cube are in-side-out ;)

Ahh well, easy fix (I now know how to do that). Capture The Beer is almost complete, only need to replace a few more pieces of text, so something with the announcer. And double check if it works online.

==10-11-2003==

As you may have noticed I pick-ed up development of [[Legacy:UnCodeX|UnCodeX]] again. I've already made some cosmetic changes. Currently I'm working on an major improvement of the HTML output. I'm focusing even more on the JavaDoc style. Most things don't change much except for the class details, they will now be split up into a summary and a detail view. I tried to put in to much data in the previous output. Also I've fixed the templating engine to create seperate directories for packages. Having a lot of files in a single directory is a bad idea in general, and with UT2003 2225 it generated over 5000 files. Now each package will get 2 directires: ./packagename and ./Source_packagename.

For a preview of the new html output, check here: http://unreal.elmuerte.com/uncodex

==11-11-2003==

I've come to an interesting point in the html output changes. I have to change some majors things, I could just add the new code and leave the old intact, or I could strip away the old template code. The old and new code will be not be compatible when used both in a template file. Since the new template code is much better I think I will just remove the old one. This ofcourse will break the old &quot;UnrealWiki&quot; html output templates.

==13-11-2003==

Wtf, this isn't fair: http://unreal.elmuerte.com/uncodex/Source_xinterface/guicomponent.html#163

'''Foxpaw:''' Can you elaborate on what the problem is exactly? That link just took me to a source listing.

'''El Muerte TDS:''' this:

&lt;uscript&gt;
function native final SetTimer(float Interval, optional bool bRepeat);
function native final KillTimer();
&lt;/uscript&gt;

it should be

&lt;uscript&gt;
native final function SetTimer(float Interval, optional bool bRepeat);
native final function KillTimer();
&lt;/uscript&gt;

'''Wormbo:''' Oh nice. Let's add ''function'', ''event'' and ''delegate'' to the function modifiers and tell the people that at least one of these three modifiers must be used, all other modifiers are optional and there is no fixed keyword to declare a function... o_O

'''El Muerte TDS:''' the following may appear in any order and it will be a function type:
:function, operator, postoperator, preoperator, event, delegate, native, final, private, protected, public, latent, iterator, signular, static, exec, simulated

==23-11-2003==

Hooked up the commandline version of UnCodeX (ucxcu), all the basic code for generation of the HTML files, generation of the MS HTML Help file, analysing of the packages, etc. takes up 147kb. All I need to do is combine these modules so that the commandline version does what is should do. I don't think this would take up much diskspace.

I think I'm also going to port the commandline version to linux, shouldn't require much work since most of it is pretty much system independed. Well except for the MS HTML Help generation ofcourse, that requires the MS HTML Help compiler.

==2-12-2003==

Just finished the linux install on my workstation, including Kylix 2 (wtf is my Kylix 3 cd). It sucks to install all KDE packages manualy (the debian KDE meta package was broken in testing).

Anyway, ucxcu pretty much compiled out of the box. A few things don't work yet (because there's no Linux counter part yet). These include: file copy (yes, there's no API function for that), and the comment pre-processor (this is because the IO pipe interface doesn't work for linux yet).

These are not major issues, so a linux version of the commandline utility will be released in the future. The binary is about 14kb larger than the windows version (248kb).

Still need to remove the redudant unreal script parser, currently I have two parsers that pretty much do the same. The first is used for analysing the source code, the second is used by the syntax highlighters. The source analysing should also be able to use the second parser. This would reduce the binary a bit.

==22-12-2003==

Forgot to say, I've got a fully working version of ucxcu for linux. And it's much faster than the windows version, must be because of the filesystem. I only have to add support for the comment preprocessor before the linux ucxcu is complete.

==29-12-2003==

Moved all uncodex cvs modules to a single repository, should have done that right away. The old module locations still exists (symlink to the new location).

Also updated the installer configuration so GUI and CLI versions can be installed seperately.

Done some minor work on UnGateway and checked to see if the telnet interface works for most telnet clients. It has been confirmed to work with: PuTTY 0.52, PuTTY MEGABIT-2003-07-25 IPv6, SecureCRT 4.1.0, Linux NetKit 0.17 Telnet, MS Telnet 1.0

==15-01-2004==

How damn usefull can people be. Apperently ChatFilter increases CPU usage a lot on servers (and I really mean a lot), this was something just posted on the UT2003 Server mailing list. Very usefull to hear that so I could look into it. But apperently there was this other guy that figured that out months ago...  but he never told me...

'''Wormbo:''' Heh, it's always the same. People find a bug or inconvenience, but don't report it. Nevertheless they expect it to be fixed in a later version. :rolleyes:

'''El Muerte TDS:''' now it appears it may not even be my mod at all, the guy installed deathball, irc reporter and chatfilter at the same time, and one of those caused the lag (or not). really usefull...

==26-1-2004==

Rewriting part of the GUI of UnCodeX, I'm planning to use dockable panels so you can define how and where you want the diffirent parts.

I have the docking part down, but I have to figure out how to save and load the parts. The default functions don't work very well.

I'm also adding a property inspector the the main window that will follow the currently selected class.

But this all is burning on a low fire, there are some more important projects going on that have a closer deadline.

==20-2-2004==

Woohaa, almost no update in a month. Well I've been on vacation and have been/still am busy working on a Lego Mindstorm controller robot for a university project. Also an other project is almost done. I wonder what people will think of my part in that project.

Been messing a little bit with UnCodeX, I changed the property inspector to sort the variables on the tags (like the wikifier plugin does). Had to change the drawing of the special entries a bit. I'm not really satisfied with how it looks. Maybe I just have to get used to the idea. It's just a pain to squash that much info in as little space as possible and still keep the overview clear. Also once in a little while something goes wrong with loading the dock status with as result that the status bar is above the lower dock side, this should be a minor fix (I hope).

I'm looking forward to the release of UT2004, finally a game that has potential to be fun again. It has been a while since I played a game I liked, the last one was Tron 2.0 (iirc). Same goes for movies, wtf wrong these days, there are hardly any enjoyable movies. I wish they would make more adventurous movies when the LOTR movies where released, but I was wrong. The same shit over and over again. It's so terrible that I even look forward to the 4th Indiana Jones movie, and that can only suck compared to the first three. I hope around the work in 80 days gets released soon, the cast is very interesting. Well enough about that.

Now for the motto of the day: [http://garfield.ucomics.com/index.html?uc_comic=ga&amp;uc_full_date=20040215 compromise]

==03-03-2004==

Little name change going on, I've decided to drop the [TDS] clan tag everywhere I can. I'm still a TDS member tho, but the tag just sucks. I want people to know me as El Muerte.

In the other news, I've finally figured out how to prevent the dockable components to become floating (in UnCodeX).

==19-03-2004==

Grr, ok. So I have a package I want to be server side only. But I also want a optional client package that contains some GUI stuff. This GUI stuff need to retrieve info from the server side mutator.

The solution is ofcourse easy to use 3 packages, but I don't want 3 packages.

 Mutator spawns ClientInfo actor
 Assigns self to ClientInfo variable
 ClientInfo opens MenuPage
 MenuPage calls replicated function on ClientInfo to retive data
 ClientInfo send info to MenuPage

So both Mutator and MenuPage need to access ClientInfo.

==22-03-2004==

Well handed in the report I have been working on for the last 10 weeks (120 pages of bullshit about a LEGO Mindstorm Robot capable of scanning a room). Only took us 48 hours with 5 hours of sleep for the finishing touch.

I also resolved the above issue, the client side RSS Feed Browser now works. Have to finish the [[Legacy:Open Unreal Mod License|Open Unreal Mod License]] before I can release the ServerExt package and the [[Legacy:LibHTTP|LibHTTP]] version 2.

==31-03-2004==

Well, [[Legacy:LibHTTP|LibHTTP]] version 2 released, same for the ServerExt package.

Spend about 45 minutes today to find a bug in [[Legacy:UnCodeX|UnCodeX]], for some reason the @ignore tags where ignored. But this wasn't the case, I just made a typo &quot;@ingore&quot; in the unrealscript source.

And I think I should point out the new great, cool, awesome, etc. TC I'm working on [[Legacy:Mod Ideas/UnrealKartTournament|mod ideas/UnrealKartTournament]]. Every body should join our effort becuse it's a cool mod.

==07-04-2004==

Argh, made a brown paper bag mistake today when I was working on UnGateway. I overwrote a global variable with a function argument. Pretty stupid.

UnrealKart is progressing... Still needs a shit load of work. But I have a couple of things going. We still can use some additional members\contributers for our mod. 

There are still quite some thing I have to figure out, like how to define the track in the map, and how to detect racers not taking illegal shortcuts to finish. The easiest way would be to implement a couple of invisible checkpoint in the track that are impossible to go around.

I also need to figure out how to detect a racer going off-track. The speed of the vehicle should be reduced when the racer is off-track.

Besides that I also need to think about:
* recovery
* speed boosts
* power ups system

==11-04-2004==

Damn vehicles. The ONSWheeledVehicle has too many damn variables, and it's not very clear what effect they have. I don't really feel like spending more time figuring out how to tweak the SRV to be nice for a Kart. I don't know much about cars and stuff. Apperently the SVehicle car represents much of normal car/engine things like torque, engine inertia, etc. I really have no clue wtf that all is.

I rather work on the more interesting stuff of unreal kart. But ofcourse it's important for the mappers to know how the &quot;basic&quot; kart drives.

==16-04-2004==

After quite some work and at least 40kb of code changes I finally pushed out the first beta release of UnGateway.

Can't wait until I receive a shit load of emails with questionson how to use it, oh wait I can wait. 

Hell, it was difficult to write, so it should be difficult to use.

==28-04-2004==

Weee finally have my new workstation. It's a nice AMD Athlon 64 3200+, 1GB ram, 200GB SATA Western Digital disk, Asus K8V SE Deluxe mobo, Asus V9570 TD 256MB VGA card (GeForce FX 5700), SB Audigy SL (don't have a 7.1 speaker set up, only a 2.0 so screw Audigy 2).

Oh, and a lot of mess in my room.

==29-04-2004==

Ok, so I had a single broken DIMM. Geez what a weird behaviour did that cause. After a little while the system crashed and wouldn't boot for at least 30 minutes. Got a new DIMM today and now everything seems fine.

==11-05-2004==

Bit short on time at the moment, so I don't have time to work on UnrealKart. Also MSUC Phase 3 is open soon, so I've put UnrealKart on a stall to allow people to finish things for phase 3. It's not like UnrealKart would have a worthwhile release before Phase 3 closes.

Also phase 2 results are in, can't say I'm happy about the results. Maybe a bit jealous. Altough the two mods I did submit for phase 2 where both &quot;honerable mentions&quot;, that's quite nice for two mods I made during the registration phase of phase 2. Would have been nice if either of them won anything, but on the other hand, those mods didn't deserve to win anything.

UnCodeX version 2 has been finished, waiting a little while before announcing it to the world, just in case I screwed up big time in this release. I'm going to enter UnCodeX in Phase 3, and it really should win something, it deserves to win something. UnGateway and ServerExt are also on the list to be sumbitted to Phase 3.

Talking about MSUC, today in #unrealscript Mia'cova had a nice idea. Since most of use don't agree on the results of both phases we could do out onw little contest. The idea is simple, create a very small mod and enter it in the MSUC, the mod that finishes highest wins. With a small mod it would be something like a max of X statements, or a max of X bytes. Personally I like the idea to create a mod (could be anything), with a limit on the total size of the code to be 2004 bytes. In fact, the source file(s) have to be exact 2004 bytes.

==18-05-2004==

&lt;rant&gt;Enums: damn things, enums are great, much friendlier to use than integers. But enums are not accessable from other classes. You can use the enum option names in other classes, but you can cast an integer to that enum. You have to write an accessor function for that. This is very annoying when you are writing a webadmin page for your little mod and you use enums for certain configuration options. Enums are in fact global to the package, but the parser limits it to the class. It would have been nice if there was some way of type casting an enum. You can get the EnumCount from an enum in an other class: &lt;code&gt;ClassInstance.EnumName.EnumCount&lt;/code&gt;, but you can't cast.&lt;/rant&gt;

==24-05-2004==

Phase 3 dead line has been extended to june 6, glad they did that. I can really use the time. I'm finishing a reserved slot and team balancer add-on for ServerExt, the team balancer needs quite some work and testing.

UnGateway also needs more work, well the IRC module of it anyway. UnCodeX is the only one that is pretty much done, I guess version 203 will be submitted for MSUC.

Don't have any time to implement &quot;meanwhile&quot;, the current test version doesn't even work like I want it to. When I change the viewactor it will also inherit the hud. An other option would to use DrawPortal but ofcourse that doesn't work for everybody, or does it?

==25-05-2004==

Writing documentation sucks  period

Trying to create some usefull documentation for UnGateway. Only documentating all config variables in a some what readable form takes a shit load of time. Figures why Epic never completely documented the config variables. Maybe I should write an additional plugin for UnCodeX to dump documentation files for config variables per class.

==30-05-2004==

Well looks like my idea to create a mod with only 2004 bytes of code isn't going to work. Only the initial code for &quot;meanwhile&quot; is already over 4.4KiB. Ah well...

==06-06-2004==

MSUC Phase 3 is closing... only a few hours left. I've submitted four items: UnCodeX, ServerExt, UnGateway and Meanwhile. Let's see if I win something this time. So far all my submissions have at least been a &quot;honorable mention&quot;.

==07-06-2004==

Checked out the CBP2 volumes. It's nice to see that people completely forgot the Unreal Universe (like ONS-Yorda, that belongs in Morrowind. or CTF-Skorbut, that map even runs like crap). There's maybe one map that claims to b in the unreal universe, but I don't really get the Unreal Universe feeling in that map (ONS-Valarna). Also pretty much every DM map is an inside, dark and tight unnatural collection of passages. Some maps look like factories but have rediculous passages, nobody would ever build a factory like that. Some maps do have a bit of a story telling envoirement, I like that (DM-Griffen (looks a lot like that city on Democratus in the game Anachronox), CTF-Botanic, DM-Koma (overkill on moving materials), CTF-Deep).

Stay tuned for a better review for each map (PS, I'm not going to judge on actual gameplay).

===CBP2 review part 1===

====AS-CBP2-Trust====

A small assault map. But don't really like the layout, and the objectives don't make sense. Launch a rocket using a switch?! It should have been a control room. And the position of the defense is also weird; nobody would try to defend the inside of a launch facility. It's an island to usually you have your defense set up to guard the sea around you.

The bright sun was annoying, but would make sense if you where attacking at sun set?

Assault maps are difficult to create, and this is a nice try. 

====ONS-CBP2-Argento====

Nice desert map, nice and bright. Looks good, could be part of the Unreal Universe. Just too bad about the map bugs of both bases, part of the base isn't covered by the bright sandy desert look making it way to visible.

====ONS-CBP2-Brassed====

Doesn't fit it's description. Argento was too hot, this isn't. Also from the sound of the wind I expect a heavy dust storm, but it's just a minor dust storm. And wtf is up with those large flowers, they really spoil the map. What is the story of the bases? They don't look like a temple or house, they are just... there. The roof shouldn't be that shiny.

Music doesn't fit very well; a desert should have a smooth not to busy score. No music would have been better.

====ONS-CBP2-Mirage====

Another desert map, with leafless trees, interesting. An outpost with no doors? It should at least have door that are either obstructed or just broken. Music is good though, fist the desert. And the maze of passages is great. This map fits the Unreal Universe with it's constructions. Except for the overkill on flags ;)

====ONS-CBP2-Pasargadae====

What the hell, did I just start a different game? Very nice map, the music really adds something to the atmosphere. The map however is almost useless, you can't see the roads very well, maybe it's a good thing since it kind of messes with you direction.

There's just one major down point, doesn't fit really well in the unreal universe.

====ONS-CBP2-Tropica====

Ok, this is one of my favorite music tracks from Unreal, and it fit's the environment. It really fits the Unreal Universe, this must be somewhere on Na Pali.

====ONS-CBP2-Valarna====

Claims to be on Na Pali. It's green, has one of the awesome Unreal music tracks. Buildings have the right design. Yes, this is Na Pali. But the textures on the mountains and buildings are terrible. Some Na Pali animals would also be nice (of course there are no nali cows and rabbits available, too bad). And a little more nali buildings or some skaarjs ruins would be nice.

====ONS-CBP2-Yorda====

&quot;Wow&quot;, but I get more of a Morrowind feeling than Unreal feeling. The skybox is terrible. The terrain could also use some work. And what's up with the borders of the map, shouldn't that just be rock or something instead of some kind of wall. If it is a wall, then where's the door?

====CTF-CBP2-Bahera====

Guess this fits the Pasargadae theme. There are some dark spots, but not too many. Nothing more to say about this map. 

====CTF-CBP2-Botanic====

Now this is a good map. Has the Unreal feeling and look, music is good. I like those mid-air passageways. Decorations are ok, this map is well dressed. This is maybe one of the best CBP2 maps.

====CTF-CBP2-Decadence====

Hmm.. why is there no interaction with the pipe-organ? Music is ok. Quite some passages, but not logical. And some of the cracks in the floor are ridiculous, why would there be water under a floor that's only one tile thick? Contruction style is kind of human like, and those two trees in the middle are a little bit out of context since the other trees are completely different.

====CTF-CBP2-Deep====

It's a nice map, a bit neutral, it could fit in the Unreal Universe or not. The underwater part of the level sucks, it's uncontrolled. And those sharks don't attack. The underwater part should have been limited in one way so that there's only a small part where you could go under water. Or make it larger and add air tanks or something. This just isn't _it_. It would have been better if this was an old research facility, but it doesn't look like a research facility.

====CTF-CBP2-Gazpacho====

Isn't this a remake? Classic CTF level design. The skybox part could have been nicer though. For the rest it's a normal tech level. There should have been more clouds in the middle part to make it a little bit more difficult for the camping defenders to defend; we are very high in the sky anyway.

====CTF-CBP2-Pistola====

An old and rusty factory? Where are the machines? I guess this could be in the unreal universe, maybe even somewhere on Na Pali. A bit too many arrows and pointers and less team symbols would be nicer. This map is way to symmetrical, at least change the debris.

====CTB-CBP2-Skorbut====

&quot;Wow&quot;, this looks different. A real overkill on a lot of things, this map doesn't run well. Very nice with all those alternative routes and usage of the buildings. This map really needs a lot of players to be fun. The skybox is interesting, but is just ugly. This is definitely not in the Unreal Universe. Or maybe a really screwed future of the sky city area of Na Pali, that would really suck.

====DM-CBP2-Achilles====

Just a neutral odd construction, something nobody would every build for something else than death match.

====DM-CBP2-Arhcipelago====

Could be a Unreal Universe map, same style as CTF-CBP2-Tropica. That plain in the middle doesn't belong in the Unreal Universe though.

====DM-CBP2-Azures====

Egyptian looking map, it's nice but would have been much better if more environment was used instead of buildings. In the background there are some nice locations where some nice actions could have taken place (near the waterfall for example). Music choice is good, gives a nice relaxed feeling.

====DM-CBP2-Buliwyf====

This must have been inspired by DM-Peek. This must be some kind of temple, too bad there's no altar or something like it. Also, it's too clean, no debris. And interior decoration wouldn't be a luxury.

====DM-CBP2-Drakonis====

Looks nice, but wtf is it? It starts like some kind of mountain fortress, but inside it's pretty much a cave. And what's with the dragons, they make no sense, why would there be dragons on those locations, and where does the fire come from? It's a small piece of rock behind the two dragons. And there's a little bit to much wood to fix the gaps. The water is also strange, you instantly die, would be nice if the current just took you away underwater and drown you.

====DM-CBP2-Griffen====

The invisible walls with a few obstructions to close some routes are ugly. Could have let a building collapse so the passage was closed, it now still looks like you can go through it. And why is there light burning in every house. The construction style doesn't really match the Unreal Universe. You have been cool if you could shoot at the windows so the light goes out. What's with the swords on the most illogical locations? There are quite some ledges where you can jump on, that's nice, gives the level some more interaction.

====DM-CBP2-Kadath====

A dark ruin, with the darkness corrected with a lot of lights. It's a rather strange place if it could fit in the Unreal Universe.

For the rest this map doesn't have much, it's a simple map.

====DM-CBP2-Kerosene====

Industrial map with a shit load of shiny textures, way to many if you ask me. Environment maps are nice, but don't over do it. Like the monitor, but they all have the same text. The construction of the factory isn?t even illogical, it could work. The map also has enough interior decoration.

====DM-CBP2-Khrono====

A very dark map in a clock tower. The music is terrible, doesn't fit the map. The clock is also broken; you can't really ring it very well. Some environment hazards would have been nice. It's just too dark, and not what I expect of a clock tower that big.

====DM-CBP2-KillBillyMap====

Ok this is in no way an Unreal Universe map. This map is just awesome; all the little semi-interactive things make it a great map. It also looks very nice. The fence however isn't that great, you can jump high enough to get over it, but you can't. Don't know how you could solve that problem. Music is also nice.

====DM-CBP2-Koma====

OMFG wtf is this. Way too many moving materials. The idea is great though, it's a map with a story. I don't get the city; there are windows, but again no doors. There's nothing that makes it look like people ever lived here. The &quot;roads&quot; don't make sense, why are they going to and leading from nowhere.

====DM-CBP2-KroujKran====

Another dark map with shiny textures. The map doesn't have a purpose, it's just there apparently, it has some steam and pipes. I have no clue why the building was created.

====DM-CBP2-Masurao====

Yep, looks like a Chinese temple, apparently in the middle of a lake. Some walls have a terrible construction (lose stones everywhere), while others are in perfect shape. Somehow I don't really think this sort of things belong in the Unreal Universe. I think the map would have done better if it was set at dawn, with a little fog over the lake, making it a bit more mysterious.

====DM-CBP2-Meitek====

Well, at least it's not dark. What is this, some kind of vent system? And why is there a river beneath this thing?.

====DM-CBP2-Reconstruct====

Another factory map with a weird face, and with awesome force fields. These force fields are only active when you're very close to it, a great way to create walls and bridges and still keep areas open to shoot through. These force fields look like some strange kind of alien techonology, not really something you would see in a factory like level like this. Anyway, this factory doesn't have machines or screens, or any other things that would explain the construction.

====DM-CBP2-Summit====

Some kind of weird construction in the montains. Would be nice to see more of these constructions in the skybox. I have no idea what this thing might be. There's somekind of &quot;thing&quot; below the structure that will teleport you back up when you fall of the construction (too bad).

====DM-CBP2-TelMecoMEX====

And another dark factory like level. And again the construction doesn't make sense, another &quot;factory like fight arena build by liandri&quot;? And the cleaners did a good tob on cleaning the floor, it's clean and shiny.

====DM-CBP2-TensileSteel====

Now this looks like a nice old factory, nice and dirty, broken wires, broken glass, steam pipes, things that look like they where part of a machine. But nobody would every build a factory like this, it everything but efficient. Some passages and doors should have been force into this construction, e.g. break a hole in the wall to make it a better arena. The bottom level has been made a bit like that. There are also a lot of inconsistencies in the level, at some point you see there are windows from the outside, but from the inside it's just concrete. Anyway, this doesn't look like the Unreal Universe, the outside view doesn't show a hi-tech city.

====DM-CBP2-Torkenstein====

Could be a castle on Na Pali, but don't see any nali things. Some parts of the construction don't make sense, to many doorways. I really like the small outdoor bit where you can see some additional buildings outside the castle.

====DM-CBP2-Tydal====

Wee, factory level. Oh, it's underwater. Well the construction doesn't make much sense, but at least it's not very clean. Quite some broken things. And a couple of leaks, what would be really cool is if the level would slowly fill up with water.

====DOM-CBP2-Gerroid====

Also a factory like level, but for a change the construction could be possible. Too bad there are a couple fo serious map bugs when you have to suicide to get out of.

====BR-CBP2-Aquarius====

Anoother underwater factory like level. Guess, this one could get away with it's constrution. That's pretty much it, not more things to complain about this level nor are there any additional cool things.

====BR-CBP2-Bahera====

Pretty much the same as the CTF level, except this is druing daytime. For the rest the same comments as I gave for the CTF level, except for the music. I like the music in the level, but doesn't add much to it's environment.</text>
    </revision>
    <revision>
      <id>3080</id>
      <timestamp>2004-08-18T08:33:16Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==14-7-2003==

Long time no entry. I'm going to switch the layout of my dev journal to a per day basis without sorting on project, may be much more readable and it'll allow me to rant on about other things during my developing.

So, the MSU Phase 1 is closing soon. I'm really intresting to see what people have turned in, at least I hope they are going to publish a list of all accepted entries. I wonder if UnCodeX has a chance in the Tool's section, I don't think my other mods have much chance in winning something.

But it's not like I did those projects for the money, I think people creating mods/etc. for the money will only produce crappy mods/etc. because they haven't poured their heart into the project. You can't see very well with dollar (or euro, or whatever) signs in your eyes.

Grrr... I really hoped by this time I was able to log into the VPN again, that's why I started this log entries because the f#cking VPN keeps refusing connections. I really hate it because now I can't continue with my work.

==16-7-2003==

Damn it's hot. Both the outside temperature and my coding speed have resulted in the melting of my workstation's keyboard. It looks like a Dali painting ;)

Anyway, it is damn hot. But that doesn't matter much, the problem is that it's still hot at night. And since it will remain hot for a long time I've shiften my day schedule. Usualy I'm awake from 9:00 till 2:00/3:00. But since it's much cooler in the morning I've decided to get up at 7:30. 

I really wish I had a laptop so I could sit outside and keep working, but sure you can't have everything.

So MSU phase 1 has finally been closed, I wonder how long it'll take before we'll get to see a listing of all  accepted mods.

==17-6-2003==

GUI designing is damn awefull, specially when you want too much stuff into a single screen. What's the best way to do it, how can you split it up into seperate windows, etc...

And ofcourse, you always have to keep in mind to create dynamic layouts, you don't want to hard code every GUI object when it's not needed. The real pain in dynamic layouts is that you can't simply switch to GUI editor mode to change the layout, copy and paste the new dimensions. You have to tweak your formula until it's correct. And evertytime you have to recompile and test it again.

With designing GUIs you will always run into the problem what the best layout it. Because it has to fit on the screen, but also remain functional and look good. The looking good part is something for the art department. As for designing the layout, you could just create the components and tweak them inside the engine but this is slow. A good alternative is to use a presentation program (like MS PowerPoint) to design the layout. Simply create all the components inside PowerPoint (just use rectangles of diffirent colors for the various components that don't have an existing power point representation) and drag them around until you find a good layout. Save it, print it, ... Now you have a good template on how to position the items. All you have to do now is create the components in UnrealScript, launch the game and tweak the positions using the in-game GUI editor.

==30-6-2003==

Finishing up the first release of [[Legacy:LibHTTP|LibHTTP]]. LibHTTP is a well written general purpose library for accessing data on webservers. Since this is something a lot of people want in their mod I decided it was a good idea to write one well written open-source free to use library that will do it for you.

This way mod developers can use their time on their mod instead of writing yet another class for downloading webpages.

I hope other mod developers take up this idea to create open source libraries for common operations. This way there will be more well developed building blocks to use. Which will have a result in more high quality mods available.

==4-8-2003==

It must be summer. And you know why, my damn mouse is sticky, nothing on TV, no great games released.

So I decided to play Unreal again. It's still a great game to play, the large outdoor maps and the mysterious areas makes it a great game. It's pretty damn difficult in the highest difficult setting, specially when you are in tight rooms with a lot of Skaarj (Damn ISV Kran decks).

Still haven't played Unreal 2 a lot, don't know why. Maybe because it's a bit too heavy for my machine.

==29-8-2003==

A bit silent on my public side. Just too busy with things I can't talk about yet.

On the other side. Tron 2.0 is a pretty cool game. They really respected the Tron world as defined in the first movie, basic coloring with nice glow effects. Ofcourse it looks a bit more advanced because the current computer are way more advanced. If you liked the Tron movie you might want to check this one out. 

==4-9-2003==

Well I started on a complete rewrite of my UTelAdSE system. The new design uses a central daemon that can have multiple interfaces to connect to, so it's even more modular that the previous design. Also the authentication has been split off into a seperate object. This way it's possible to change the authentication to use a diffirent system.

The telnet interface is almost done, the most important part the terminal handling is done and it's much better than the previous one. You have the same commandline powers as you have with bash, the previous implementation was very limited (like the DOS prompt).

Also started on the IRCd implementation. I'm complety changing this implementation, I'm going to design it so that you could link various servers into a network. This network would consist out of at least one real IRCd when that the UT servers will link to. This real IRCd has access to all channels servered by the various UT servers linked to it. The IRCd that runs within the engine only has access to the local channels, this is to reduce the load. The unreal IRC server will netsplit on every map (ofcourse).

As for the applications/commands, not much has changed from the previous system. I still use a dynamic array for calling the commands with arguments. However I did change it a bit, commands have to be registered in the daemon, this way I can look up what application object has the requested command. This reduces the function calls needed to call the right command.

==8-9-2003==

Man what does the IRC protocol suck. Just the basic implementation of various commands sucks.

Anyway, ordered me a nice Toshiba SatelitePro m10 laptop today so I can keep on coding where ever I am.

====Comments====

'''Dante:''' Yeah IRC protocol just sucks. I tried to write like 3 IRC clients before, I always stopped at a point when I just got annoyed ;)

'''El Muerte TDS:''' the server part is much worse than the clients part

'''Dante:''' Depends how customizable you want the client to be. I don't think the server part is much more difficult.

'''El Muerte TDS:''' IRC clients are dumb, the server has to figure out everything, and that adds a lot of administation. And it's not that it's more difficult, it's just that it's more of a pain to implement.

'''Dante:''' Yeah clients are kind of dumb, the server still isn't much more clever. Basically it does nothing more than dispatching. It doesn't care for ctcp stuff and such things. Administration is handled thru bots (which are clients) like chanserv. The main pain in writing a server might be security.

'''El Muerte TDS:''' well the server has to keep track of what channels there are, who is in that channel. But you've also got to keep track of the server relays if you have more than one server. This server relaying is hacked into the protocol, wel at least it looks like that.

==10-9-2003==

Almost completely redone the Marky Mutator, the initial release didn't even work online, that's what you get when you ship when it compiles late at night ;). Anyway, the current version is pretty much done, it supports additional pop-up faces, by default it has Mark Rein, CliffyBunny and the Dopefish. I'm waiting for a response from Mark Rein before I will ship this version. I asked Mark Rein if he could record him saying &quot;Two Weeks&quot; so I could use that when his head pops up ;)

Also yesterday my laptop arrived (damn quick), it's a really nice toy :D

==24-9-2003==

Yahoo the evil european software patent directive has been accepted. Start saving money for your first patent infringement.

'''Foxpaw:''' What's that about? I've never heard of this software patent directive?

'''El Muerte TDS:''' Read [http://yro.slashdot.org/article.pl?sid=03/09/24/1253227&amp;mode=thread&amp;tid=155&amp;tid=185&amp;tid=99 this /. article]. Be sure to check out the linked articles for more details.

'''Foxpaw:''' I still don't get it.. how does this &quot;software patent&quot; differ from the IP protection that you already have? Or does it allow people to patent a software notion like anti-aliasing?

'''El Muerte TDS:''' with patents you can prevent people from inventing the same you did, if you own a patent somebody else may not build the same unless it licenses your patent (this protects your invention, but also kills free enterprise). For example, there was a patent on the LZW compression algorithm, LZW is required for GIF files, so you had to license the LZW algorithm before you could write a program that creates GIF files (USA only). This patent is correctly assigned, it does protect the invention and research. But the new software patent possible in Europe (you could always patent these but they were not backed up by law) allows you to patent non-sence (already possible in the USA).

A few examples of non-sence patents: Amazon's &quot;One Click Buy System&quot;, or the recently assigned patent for Microsoft that describes the usage of cookies to keep track of a user id and using that info to look up the user preferences for a web services (a lot of meta sites, online stores and forums use this &quot;technology&quot;). [http://swpat.ffii.org/patents/samples/index.en.html an larger list of interesting patents].

You can't request a patent on inventions already used a lot (&quot;prior art&quot;). Patents are just evil, they used to protect inventors from large companies, but it's now used buy large companies to prevent some compitition and earn money.

And now for the answer to your question, IP is for the your creation AS-IS, not the technique. Here's an bad example (below is ofcourse not possible):

&lt;uscript&gt;
// to increase the value of a number by one:
i = i + 1;   // your creation, people may not use this AS IS

i = 1 + i;   // not the same as yours, but a patent prevents you from using it
i++;         // if you had a patent this was not allowed either
&lt;/uscript&gt;

==20-10-2003==

Screw modelers, all I wanted was a pretty simple static mesh of a beer bottle crate. No free public assets for that and nobody remotely interested in helping me out. So I decided to mess around with Maya myself. Worked out pretty well, I managed to create a 7x5x4 cube (it's harder than it sounds ;) ), and mapped by texture on it. And it looks quite well. Except that all faces of the cube are in-side-out ;)

Ahh well, easy fix (I now know how to do that). Capture The Beer is almost complete, only need to replace a few more pieces of text, so something with the announcer. And double check if it works online.

==10-11-2003==

As you may have noticed I pick-ed up development of [[Legacy:UnCodeX|UnCodeX]] again. I've already made some cosmetic changes. Currently I'm working on an major improvement of the HTML output. I'm focusing even more on the JavaDoc style. Most things don't change much except for the class details, they will now be split up into a summary and a detail view. I tried to put in to much data in the previous output. Also I've fixed the templating engine to create seperate directories for packages. Having a lot of files in a single directory is a bad idea in general, and with UT2003 2225 it generated over 5000 files. Now each package will get 2 directires: ./packagename and ./Source_packagename.

For a preview of the new html output, check here: http://unreal.elmuerte.com/uncodex

==11-11-2003==

I've come to an interesting point in the html output changes. I have to change some majors things, I could just add the new code and leave the old intact, or I could strip away the old template code. The old and new code will be not be compatible when used both in a template file. Since the new template code is much better I think I will just remove the old one. This ofcourse will break the old &quot;UnrealWiki&quot; html output templates.

==13-11-2003==

Wtf, this isn't fair: http://unreal.elmuerte.com/uncodex/Source_xinterface/guicomponent.html#163

'''Foxpaw:''' Can you elaborate on what the problem is exactly? That link just took me to a source listing.

'''El Muerte TDS:''' this:

&lt;uscript&gt;
function native final SetTimer(float Interval, optional bool bRepeat);
function native final KillTimer();
&lt;/uscript&gt;

it should be

&lt;uscript&gt;
native final function SetTimer(float Interval, optional bool bRepeat);
native final function KillTimer();
&lt;/uscript&gt;

'''Wormbo:''' Oh nice. Let's add ''function'', ''event'' and ''delegate'' to the function modifiers and tell the people that at least one of these three modifiers must be used, all other modifiers are optional and there is no fixed keyword to declare a function... o_O

'''El Muerte TDS:''' the following may appear in any order and it will be a function type:
:function, operator, postoperator, preoperator, event, delegate, native, final, private, protected, public, latent, iterator, signular, static, exec, simulated

==23-11-2003==

Hooked up the commandline version of UnCodeX (ucxcu), all the basic code for generation of the HTML files, generation of the MS HTML Help file, analysing of the packages, etc. takes up 147kb. All I need to do is combine these modules so that the commandline version does what is should do. I don't think this would take up much diskspace.

I think I'm also going to port the commandline version to linux, shouldn't require much work since most of it is pretty much system independed. Well except for the MS HTML Help generation ofcourse, that requires the MS HTML Help compiler.

==2-12-2003==

Just finished the linux install on my workstation, including Kylix 2 (wtf is my Kylix 3 cd). It sucks to install all KDE packages manualy (the debian KDE meta package was broken in testing).

Anyway, ucxcu pretty much compiled out of the box. A few things don't work yet (because there's no Linux counter part yet). These include: file copy (yes, there's no API function for that), and the comment pre-processor (this is because the IO pipe interface doesn't work for linux yet).

These are not major issues, so a linux version of the commandline utility will be released in the future. The binary is about 14kb larger than the windows version (248kb).

Still need to remove the redudant unreal script parser, currently I have two parsers that pretty much do the same. The first is used for analysing the source code, the second is used by the syntax highlighters. The source analysing should also be able to use the second parser. This would reduce the binary a bit.

==22-12-2003==

Forgot to say, I've got a fully working version of ucxcu for linux. And it's much faster than the windows version, must be because of the filesystem. I only have to add support for the comment preprocessor before the linux ucxcu is complete.

==29-12-2003==

Moved all uncodex cvs modules to a single repository, should have done that right away. The old module locations still exists (symlink to the new location).

Also updated the installer configuration so GUI and CLI versions can be installed seperately.

Done some minor work on UnGateway and checked to see if the telnet interface works for most telnet clients. It has been confirmed to work with: PuTTY 0.52, PuTTY MEGABIT-2003-07-25 IPv6, SecureCRT 4.1.0, Linux NetKit 0.17 Telnet, MS Telnet 1.0

==15-01-2004==

How damn usefull can people be. Apperently ChatFilter increases CPU usage a lot on servers (and I really mean a lot), this was something just posted on the UT2003 Server mailing list. Very usefull to hear that so I could look into it. But apperently there was this other guy that figured that out months ago...  but he never told me...

'''Wormbo:''' Heh, it's always the same. People find a bug or inconvenience, but don't report it. Nevertheless they expect it to be fixed in a later version. :rolleyes:

'''El Muerte TDS:''' now it appears it may not even be my mod at all, the guy installed deathball, irc reporter and chatfilter at the same time, and one of those caused the lag (or not). really usefull...

==26-1-2004==

Rewriting part of the GUI of UnCodeX, I'm planning to use dockable panels so you can define how and where you want the diffirent parts.

I have the docking part down, but I have to figure out how to save and load the parts. The default functions don't work very well.

I'm also adding a property inspector the the main window that will follow the currently selected class.

But this all is burning on a low fire, there are some more important projects going on that have a closer deadline.

==20-2-2004==

Woohaa, almost no update in a month. Well I've been on vacation and have been/still am busy working on a Lego Mindstorm controller robot for a university project. Also an other project is almost done. I wonder what people will think of my part in that project.

Been messing a little bit with UnCodeX, I changed the property inspector to sort the variables on the tags (like the wikifier plugin does). Had to change the drawing of the special entries a bit. I'm not really satisfied with how it looks. Maybe I just have to get used to the idea. It's just a pain to squash that much info in as little space as possible and still keep the overview clear. Also once in a little while something goes wrong with loading the dock status with as result that the status bar is above the lower dock side, this should be a minor fix (I hope).

I'm looking forward to the release of UT2004, finally a game that has potential to be fun again. It has been a while since I played a game I liked, the last one was Tron 2.0 (iirc). Same goes for movies, wtf wrong these days, there are hardly any enjoyable movies. I wish they would make more adventurous movies when the LOTR movies where released, but I was wrong. The same shit over and over again. It's so terrible that I even look forward to the 4th Indiana Jones movie, and that can only suck compared to the first three. I hope around the work in 80 days gets released soon, the cast is very interesting. Well enough about that.

Now for the motto of the day: [http://garfield.ucomics.com/index.html?uc_comic=ga&amp;uc_full_date=20040215 compromise]

==03-03-2004==

Little name change going on, I've decided to drop the [TDS] clan tag everywhere I can. I'm still a TDS member tho, but the tag just sucks. I want people to know me as El Muerte.

In the other news, I've finally figured out how to prevent the dockable components to become floating (in UnCodeX).

==19-03-2004==

Grr, ok. So I have a package I want to be server side only. But I also want a optional client package that contains some GUI stuff. This GUI stuff need to retrieve info from the server side mutator.

The solution is ofcourse easy to use 3 packages, but I don't want 3 packages.

 Mutator spawns ClientInfo actor
 Assigns self to ClientInfo variable
 ClientInfo opens MenuPage
 MenuPage calls replicated function on ClientInfo to retive data
 ClientInfo send info to MenuPage

So both Mutator and MenuPage need to access ClientInfo.

==22-03-2004==

Well handed in the report I have been working on for the last 10 weeks (120 pages of bullshit about a LEGO Mindstorm Robot capable of scanning a room). Only took us 48 hours with 5 hours of sleep for the finishing touch.

I also resolved the above issue, the client side RSS Feed Browser now works. Have to finish the [[Legacy:Open Unreal Mod License|Open Unreal Mod License]] before I can release the ServerExt package and the [[Legacy:LibHTTP|LibHTTP]] version 2.

==31-03-2004==

Well, [[Legacy:LibHTTP|LibHTTP]] version 2 released, same for the ServerExt package.

Spend about 45 minutes today to find a bug in [[Legacy:UnCodeX|UnCodeX]], for some reason the @ignore tags where ignored. But this wasn't the case, I just made a typo &quot;@ingore&quot; in the unrealscript source.

And I think I should point out the new great, cool, awesome, etc. TC I'm working on [[Legacy:Mod Ideas/UnrealKartTournament|mod ideas/UnrealKartTournament]]. Every body should join our effort becuse it's a cool mod.

==07-04-2004==

Argh, made a brown paper bag mistake today when I was working on UnGateway. I overwrote a global variable with a function argument. Pretty stupid.

UnrealKart is progressing... Still needs a shit load of work. But I have a couple of things going. We still can use some additional members\contributers for our mod. 

There are still quite some thing I have to figure out, like how to define the track in the map, and how to detect racers not taking illegal shortcuts to finish. The easiest way would be to implement a couple of invisible checkpoint in the track that are impossible to go around.

I also need to figure out how to detect a racer going off-track. The speed of the vehicle should be reduced when the racer is off-track.

Besides that I also need to think about:
* recovery
* speed boosts
* power ups system

==11-04-2004==

Damn vehicles. The ONSWheeledVehicle has too many damn variables, and it's not very clear what effect they have. I don't really feel like spending more time figuring out how to tweak the SRV to be nice for a Kart. I don't know much about cars and stuff. Apperently the SVehicle car represents much of normal car/engine things like torque, engine inertia, etc. I really have no clue wtf that all is.

I rather work on the more interesting stuff of unreal kart. But ofcourse it's important for the mappers to know how the &quot;basic&quot; kart drives.

==16-04-2004==

After quite some work and at least 40kb of code changes I finally pushed out the first beta release of UnGateway.

Can't wait until I receive a shit load of emails with questionson how to use it, oh wait I can wait. 

Hell, it was difficult to write, so it should be difficult to use.

==28-04-2004==

Weee finally have my new workstation. It's a nice AMD Athlon 64 3200+, 1GB ram, 200GB SATA Western Digital disk, Asus K8V SE Deluxe mobo, Asus V9570 TD 256MB VGA card (GeForce FX 5700), SB Audigy SL (don't have a 7.1 speaker set up, only a 2.0 so screw Audigy 2).

Oh, and a lot of mess in my room.

==29-04-2004==

Ok, so I had a single broken DIMM. Geez what a weird behaviour did that cause. After a little while the system crashed and wouldn't boot for at least 30 minutes. Got a new DIMM today and now everything seems fine.

==11-05-2004==

Bit short on time at the moment, so I don't have time to work on UnrealKart. Also MSUC Phase 3 is open soon, so I've put UnrealKart on a stall to allow people to finish things for phase 3. It's not like UnrealKart would have a worthwhile release before Phase 3 closes.

Also phase 2 results are in, can't say I'm happy about the results. Maybe a bit jealous. Altough the two mods I did submit for phase 2 where both &quot;honerable mentions&quot;, that's quite nice for two mods I made during the registration phase of phase 2. Would have been nice if either of them won anything, but on the other hand, those mods didn't deserve to win anything.

UnCodeX version 2 has been finished, waiting a little while before announcing it to the world, just in case I screwed up big time in this release. I'm going to enter UnCodeX in Phase 3, and it really should win something, it deserves to win something. UnGateway and ServerExt are also on the list to be sumbitted to Phase 3.

Talking about MSUC, today in #unrealscript Mia'cova had a nice idea. Since most of use don't agree on the results of both phases we could do out onw little contest. The idea is simple, create a very small mod and enter it in the MSUC, the mod that finishes highest wins. With a small mod it would be something like a max of X statements, or a max of X bytes. Personally I like the idea to create a mod (could be anything), with a limit on the total size of the code to be 2004 bytes. In fact, the source file(s) have to be exact 2004 bytes.

==18-05-2004==

&lt;rant&gt;Enums: damn things, enums are great, much friendlier to use than integers. But enums are not accessable from other classes. You can use the enum option names in other classes, but you can cast an integer to that enum. You have to write an accessor function for that. This is very annoying when you are writing a webadmin page for your little mod and you use enums for certain configuration options. Enums are in fact global to the package, but the parser limits it to the class. It would have been nice if there was some way of type casting an enum. You can get the EnumCount from an enum in an other class: &lt;code&gt;ClassInstance.EnumName.EnumCount&lt;/code&gt;, but you can't cast.&lt;/rant&gt;

==24-05-2004==

Phase 3 dead line has been extended to june 6, glad they did that. I can really use the time. I'm finishing a reserved slot and team balancer add-on for ServerExt, the team balancer needs quite some work and testing.

UnGateway also needs more work, well the IRC module of it anyway. UnCodeX is the only one that is pretty much done, I guess version 203 will be submitted for MSUC.

Don't have any time to implement &quot;meanwhile&quot;, the current test version doesn't even work like I want it to. When I change the viewactor it will also inherit the hud. An other option would to use DrawPortal but ofcourse that doesn't work for everybody, or does it?

==25-05-2004==

Writing documentation sucks  period

Trying to create some usefull documentation for UnGateway. Only documentating all config variables in a some what readable form takes a shit load of time. Figures why Epic never completely documented the config variables. Maybe I should write an additional plugin for UnCodeX to dump documentation files for config variables per class.

==30-05-2004==

Well looks like my idea to create a mod with only 2004 bytes of code isn't going to work. Only the initial code for &quot;meanwhile&quot; is already over 4.4KiB. Ah well...

==06-06-2004==

MSUC Phase 3 is closing... only a few hours left. I've submitted four items: UnCodeX, ServerExt, UnGateway and Meanwhile. Let's see if I win something this time. So far all my submissions have at least been a &quot;honorable mention&quot;.

==07-06-2004==

Checked out the CBP2 volumes. It's nice to see that people completely forgot the Unreal Universe (like ONS-Yorda, that belongs in Morrowind. or CTF-Skorbut, that map even runs like crap). There's maybe one map that claims to b in the unreal universe, but I don't really get the Unreal Universe feeling in that map (ONS-Valarna). Also pretty much every DM map is an inside, dark and tight unnatural collection of passages. Some maps look like factories but have rediculous passages, nobody would ever build a factory like that. Some maps do have a bit of a story telling envoirement, I like that (DM-Griffen (looks a lot like that city on Democratus in the game Anachronox), CTF-Botanic, DM-Koma (overkill on moving materials), CTF-Deep).

Stay tuned for a better review for each map (PS, I'm not going to judge on actual gameplay).

===CBP2 review part 1===

====AS-CBP2-Trust====

A small assault map. But don't really like the layout, and the objectives don't make sense. Launch a rocket using a switch?! It should have been a control room. And the position of the defense is also weird; nobody would try to defend the inside of a launch facility. It's an island to usually you have your defense set up to guard the sea around you.

The bright sun was annoying, but would make sense if you where attacking at sun set?

Assault maps are difficult to create, and this is a nice try. 

====ONS-CBP2-Argento====

Nice desert map, nice and bright. Looks good, could be part of the Unreal Universe. Just too bad about the map bugs of both bases, part of the base isn't covered by the bright sandy desert look making it way to visible.

====ONS-CBP2-Brassed====

Doesn't fit it's description. Argento was too hot, this isn't. Also from the sound of the wind I expect a heavy dust storm, but it's just a minor dust storm. And wtf is up with those large flowers, they really spoil the map. What is the story of the bases? They don't look like a temple or house, they are just... there. The roof shouldn't be that shiny.

Music doesn't fit very well; a desert should have a smooth not to busy score. No music would have been better.

====ONS-CBP2-Mirage====

Another desert map, with leafless trees, interesting. An outpost with no doors? It should at least have door that are either obstructed or just broken. Music is good though, fist the desert. And the maze of passages is great. This map fits the Unreal Universe with it's constructions. Except for the overkill on flags ;)

====ONS-CBP2-Pasargadae====

What the hell, did I just start a different game? Very nice map, the music really adds something to the atmosphere. The map however is almost useless, you can't see the roads very well, maybe it's a good thing since it kind of messes with you direction.

There's just one major down point, doesn't fit really well in the unreal universe.

====ONS-CBP2-Tropica====

Ok, this is one of my favorite music tracks from Unreal, and it fit's the environment. It really fits the Unreal Universe, this must be somewhere on Na Pali.

====ONS-CBP2-Valarna====

Claims to be on Na Pali. It's green, has one of the awesome Unreal music tracks. Buildings have the right design. Yes, this is Na Pali. But the textures on the mountains and buildings are terrible. Some Na Pali animals would also be nice (of course there are no nali cows and rabbits available, too bad). And a little more nali buildings or some skaarjs ruins would be nice.

====ONS-CBP2-Yorda====

&quot;Wow&quot;, but I get more of a Morrowind feeling than Unreal feeling. The skybox is terrible. The terrain could also use some work. And what's up with the borders of the map, shouldn't that just be rock or something instead of some kind of wall. If it is a wall, then where's the door?

====CTF-CBP2-Bahera====

Guess this fits the Pasargadae theme. There are some dark spots, but not too many. Nothing more to say about this map. 

====CTF-CBP2-Botanic====

Now this is a good map. Has the Unreal feeling and look, music is good. I like those mid-air passageways. Decorations are ok, this map is well dressed. This is maybe one of the best CBP2 maps.

====CTF-CBP2-Decadence====

Hmm.. why is there no interaction with the pipe-organ? Music is ok. Quite some passages, but not logical. And some of the cracks in the floor are ridiculous, why would there be water under a floor that's only one tile thick? Contruction style is kind of human like, and those two trees in the middle are a little bit out of context since the other trees are completely different.

====CTF-CBP2-Deep====

It's a nice map, a bit neutral, it could fit in the Unreal Universe or not. The underwater part of the level sucks, it's uncontrolled. And those sharks don't attack. The underwater part should have been limited in one way so that there's only a small part where you could go under water. Or make it larger and add air tanks or something. This just isn't _it_. It would have been better if this was an old research facility, but it doesn't look like a research facility.

====CTF-CBP2-Gazpacho====

Isn't this a remake? Classic CTF level design. The skybox part could have been nicer though. For the rest it's a normal tech level. There should have been more clouds in the middle part to make it a little bit more difficult for the camping defenders to defend; we are very high in the sky anyway.

====CTF-CBP2-Pistola====

An old and rusty factory? Where are the machines? I guess this could be in the unreal universe, maybe even somewhere on Na Pali. A bit too many arrows and pointers and less team symbols would be nicer. This map is way to symmetrical, at least change the debris.

====CTB-CBP2-Skorbut====

&quot;Wow&quot;, this looks different. A real overkill on a lot of things, this map doesn't run well. Very nice with all those alternative routes and usage of the buildings. This map really needs a lot of players to be fun. The skybox is interesting, but is just ugly. This is definitely not in the Unreal Universe. Or maybe a really screwed future of the sky city area of Na Pali, that would really suck.

====DM-CBP2-Achilles====

Just a neutral odd construction, something nobody would every build for something else than death match.

====DM-CBP2-Arhcipelago====

Could be a Unreal Universe map, same style as CTF-CBP2-Tropica. That plain in the middle doesn't belong in the Unreal Universe though.

====DM-CBP2-Azures====

Egyptian looking map, it's nice but would have been much better if more environment was used instead of buildings. In the background there are some nice locations where some nice actions could have taken place (near the waterfall for example). Music choice is good, gives a nice relaxed feeling.

====DM-CBP2-Buliwyf====

This must have been inspired by DM-Peek. This must be some kind of temple, too bad there's no altar or something like it. Also, it's too clean, no debris. And interior decoration wouldn't be a luxury.

====DM-CBP2-Drakonis====

Looks nice, but wtf is it? It starts like some kind of mountain fortress, but inside it's pretty much a cave. And what's with the dragons, they make no sense, why would there be dragons on those locations, and where does the fire come from? It's a small piece of rock behind the two dragons. And there's a little bit to much wood to fix the gaps. The water is also strange, you instantly die, would be nice if the current just took you away underwater and drown you.

====DM-CBP2-Griffen====

The invisible walls with a few obstructions to close some routes are ugly. Could have let a building collapse so the passage was closed, it now still looks like you can go through it. And why is there light burning in every house. The construction style doesn't really match the Unreal Universe. You have been cool if you could shoot at the windows so the light goes out. What's with the swords on the most illogical locations? There are quite some ledges where you can jump on, that's nice, gives the level some more interaction.

====DM-CBP2-Kadath====

A dark ruin, with the darkness corrected with a lot of lights. It's a rather strange place if it could fit in the Unreal Universe.

For the rest this map doesn't have much, it's a simple map.

====DM-CBP2-Kerosene====

Industrial map with a shit load of shiny textures, way to many if you ask me. Environment maps are nice, but don't over do it. Like the monitor, but they all have the same text. The construction of the factory isn't even illogical, it could work. The map also has enough interior decoration.

====DM-CBP2-Khrono====

A very dark map in a clock tower. The music is terrible, doesn't fit the map. The clock is also broken; you can't really ring it very well. Some environment hazards would have been nice. It's just too dark, and not what I expect of a clock tower that big.

====DM-CBP2-KillBillyMap====

Ok this is in no way an Unreal Universe map. This map is just awesome; all the little semi-interactive things make it a great map. It also looks very nice. The fence however isn't that great, you can jump high enough to get over it, but you can't. Don't know how you could solve that problem. Music is also nice.

====DM-CBP2-Koma====

OMFG wtf is this. Way too many moving materials. The idea is great though, it's a map with a story. I don't get the city; there are windows, but again no doors. There's nothing that makes it look like people ever lived here. The &quot;roads&quot; don't make sense, why are they going to and leading from nowhere.

====DM-CBP2-KroujKran====

Another dark map with shiny textures. The map doesn't have a purpose, it's just there apparently, it has some steam and pipes. I have no clue why the building was created.

====DM-CBP2-Masurao====

Yep, looks like a Chinese temple, apparently in the middle of a lake. Some walls have a terrible construction (lose stones everywhere), while others are in perfect shape. Somehow I don't really think this sort of things belong in the Unreal Universe. I think the map would have done better if it was set at dawn, with a little fog over the lake, making it a bit more mysterious.

====DM-CBP2-Meitek====

Well, at least it's not dark. What is this, some kind of vent system? And why is there a river beneath this thing?.

====DM-CBP2-Reconstruct====

Another factory map with a weird face, and with awesome force fields. These force fields are only active when you're very close to it, a great way to create walls and bridges and still keep areas open to shoot through. These force fields look like some strange kind of alien techonology, not really something you would see in a factory like level like this. Anyway, this factory doesn't have machines or screens, or any other things that would explain the construction.

====DM-CBP2-Summit====

Some kind of weird construction in the montains. Would be nice to see more of these constructions in the skybox. I have no idea what this thing might be. There's somekind of &quot;thing&quot; below the structure that will teleport you back up when you fall of the construction (too bad).

====DM-CBP2-TelMecoMEX====

And another dark factory like level. And again the construction doesn't make sense, another &quot;factory like fight arena build by liandri&quot;? And the cleaners did a good tob on cleaning the floor, it's clean and shiny.

====DM-CBP2-TensileSteel====

Now this looks like a nice old factory, nice and dirty, broken wires, broken glass, steam pipes, things that look like they where part of a machine. But nobody would every build a factory like this, it everything but efficient. Some passages and doors should have been force into this construction, e.g. break a hole in the wall to make it a better arena. The bottom level has been made a bit like that. There are also a lot of inconsistencies in the level, at some point you see there are windows from the outside, but from the inside it's just concrete. Anyway, this doesn't look like the Unreal Universe, the outside view doesn't show a hi-tech city.

====DM-CBP2-Torkenstein====

Could be a castle on Na Pali, but don't see any nali things. Some parts of the construction don't make sense, to many doorways. I really like the small outdoor bit where you can see some additional buildings outside the castle.

====DM-CBP2-Tydal====

Wee, factory level. Oh, it's underwater. Well the construction doesn't make much sense, but at least it's not very clean. Quite some broken things. And a couple of leaks, what would be really cool is if the level would slowly fill up with water.

====DOM-CBP2-Gerroid====

Also a factory like level, but for a change the construction could be possible. Too bad there are a couple fo serious map bugs when you have to suicide to get out of.

====BR-CBP2-Aquarius====

Anoother underwater factory like level. Guess, this one could get away with it's constrution. That's pretty much it, not more things to complain about this level nor are there any additional cool things.

====BR-CBP2-Bahera====

Pretty much the same as the CTF level, except this is druing daytime. For the rest the same comments as I gave for the CTF level, except for the music. I like the music in the level, but doesn't add much to it's environment.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:El Muerte/UT2003</title>
    <id>1182</id>
    <revision>
      <id>3079</id>
      <timestamp>2004-05-10T09:27:45Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Things I made for [[Legacy:UT2003|UT2003]].

I am no longer developing things for [[Legacy:UT2003|UT2003]], however some of my creations for [[Legacy:UT2004|UT2004]] might also work for [[Legacy:UT2003|UT2003]].

'''note:''' these mods might also work for UT2004, some of these creations have been ported to [[Legacy:UT2004|UT2004]].

===PlayerJoinDumpSE===

Just like the PlayerJoinDump for UT(1) will this server add-on dump player IP addresses in the log when they join the server. This is usefull when you get abuse emails about certain users and want to ban them from the server.

http://www.drunksnipers.com/services/ut/ut2003/playerjoindump

===ServerAdsSE===

Another remake of a great UT server add-on. ServerAdsSE gives you the ability to display messages/advertisements on the server (in the chat console, or on the middle of the screen). One of the biggest new features of this version is the ability to specify an URL where ServerAdsSE should download the latest messages.

http://www.drunksnipers.com/services/ut/ut2003/ServerAdsSE

===UT2003 Compress===

The UT2003 version of UTCompreZ, this tool will make UZ compression easier to handle. Just create a list of files to compress, hit the &quot;compress&quot; button and go to bed, the next morning everything will be done.

http://www.drunksnipers.com/services/ut/ut2003/ut2003compress

===ServQuery===

ServQuery is a fix for UT2003 servers. It fixes and extends the GameSpy Protocol. ServQuery will fix the backslash bug in the player names and ServQuery will add a new command to retreive Team information.

http://www.drunksnipers.com/services/ut/ut2003/servquery

===LocalStats===

LocalStats will create log files which can be converted to statistics just like Epic's ut2003stats.epicgames.com LocalStats is a server actor so it will not show up in the mutator list or requires client downloads. Also with LocalStats you can still use the global stats.

http://www.drunksnipers.com/services/ut/ut2003/localstats

===UTelAdSE &amp; TitanIRCd===

UTelAdSE is a telnet administration server that will allow you do administer your UT2003 server using a telnet client.

http://www.drunksnipers.com/services/ut/ut2003/UTelAdSE

===BullShit===

BullShit is a server actor that will make the bot in a bot game more life like. Bot will speak when they kill or get killed, they will also respond on things other players say.

http://www.drunksnipers.com/services/ut/ut2003/bullshit

===ConfigArena===

Just a little fix for the Arena mutator. This mutator can be configured via the webadmin

http://www.drunksnipers.com/services/ut/ut2003/configarena

===ChatFilter===

ChatFilter is a server add-on to clean up the chatting on a server. ChatFilter has the power to reduce spamming on a server, it can also filter bad words from the line. On bad behavior the player will get a score assigned on a defined level actions can taken against the player

http://www.drunksnipers.com/services/ut/ut2003/chatfilter

===Marky Mutator===

Epic's Mark Rein on you screen whenevery you kill three enemies in a row. Isn't that what you've always wanted.

Version 2 includes new characters like the 2nd dumbest creature in the universe (Dopefish) and a weird white bunny named Cliff

http://www.drunksnipers.com/services/ut/ut2003/marky

===Bad Adrenaline===

This mutator will corrupt certain adrenaline pills, if you pick up one of these corrupted adrenaline pills you will suffer from strange side effects.

http://www.drunksnipers.com/services/ut/ut2003/badadrenaline

===Capture the Beer===

An excelent beer game. It's based on CTF, but instead of flags you have to capture a beer crate. But time is important, while you are carrying the crate you will consume the beer until you're out. Ofcourse the beer will have it's effect on you.

http://www.drunksnipers.com/services/ut/ut2003/ctb</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ElBundee</title>
    <id>1094</id>
    <revision>
      <id>2891</id>
      <timestamp>2002-07-06T13:52:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">==ElBundee ==

&lt;font color=teal&gt;&lt;b&gt;Addition by TechnoJF:&lt;/b&gt; Allow me to be a bit knitpicky, ElBundee.  In your explanation of Kickers, the actual angle of variation is really about 26.5 degrees difference.  To get that angle, you need to calculate the inverse Tangent of 0.5, not the inverse Sine.  It's only about 5 degrees difference, but I still figure you might want to know about it.  It's just one of those little errors that raises a red flag in my mind.&lt;/font&gt;

Of course you're right - I've made a wrong picture (which is removed now). By accident the right angle of variation for the right picture is 30 degrees - which doesn't make the wrong picture more right, so thanks for the hint :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2892</id>
      <timestamp>2002-01-28T18:39:12Z</timestamp>
      <contributor>
        <ip>ElBundee</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==ElBundee ==</text>
    </revision>
    <revision>
      <id>2893</id>
      <timestamp>2002-01-31T18:49:15Z</timestamp>
      <contributor>
        <ip>ElBundee</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==ElBundee ==

&lt;font color=teal&gt;&lt;b&gt;Addition by TechnoJF:&lt;/b&gt; Allow me to be a bit knitpicky, ElBundee.  In your explanation of Kickers, the actual angle of variation is really about 26.5 degrees difference.  To get that angle, you need to calculate the inverse Tangent of 0.5, not the inverse Sine.  It's only about 5 degrees difference, but I still figure you might want to know about it.  It's just one of those little errors that raises a red flag in my mind.&lt;/font&gt;

Of course you're right - I've made a wrong picture (which is removed now). By accident the right angle of variation for the right picture is 30 degrees - which doesn't make the wrong picture more right, so thanks for the hint :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Eldhrin</title>
    <id>1151</id>
    <revision>
      <id>3016</id>
      <timestamp>2002-12-13T15:39:40Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <minor/>
      <comment>Link changes</comment>
      <text xml:space="preserve">I'm a dreadfully inexperienced UnrealScript type of person with an intent to get better at it. Preferably as fast as possible. I'm also new to the whole Wiki thing, so here I go making a mess of it I'm sure.

[[Legacy:Eldhrin/Developer Journal|My Developer Journal]] here on this marvellous Wiki.

==UT2003 Projects==

===Mutators===
; Rocket InstaGib : Unfinished. Like InstaGib (strangely enough), but with a rocket launcher. All normal rocket launcher firing modes work, the main difference being that any impact from a rocket will kill you, and as with classic InstaGib you get infinite ammo for it. These games tend to be very noisy, rather like using the Arena mutator to replace everything with the rocket launcher, but with a greater rate of fatalities. The developer journal for Rocket InstaGib is now [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rocket InstaGib|here]].
; [[Legacy:Mod Ideas/Sorcery|Mod Ideas/Sorcery]] : Some way to switch over to using magic instead of (or as well as) weapons. If I could do this as a mutator I would be overjoyed, but I don't know enough about the possibilities and limitations of them to tell yet. I learned UnrealScript with Wheel of Time, which didn't have mutators, so they're quite new to me. My initial idea is to code the spells as weapons using the same kind of ammo (to get the mana pool), then use a mutator to substitute them in and regenerate the mana pool over time. The current state of the mutator can be ascertained at my [[Legacy:Eldhrin/Developer Journal|developer journal]].

==Me==

I'm contactable at eldhrin at alledora dot co dot uk. I'm also a very busy Computer Science undergrad, but I code when I can.

----

==Guestbook==

'''Wormbo:''' Hi and welcome to the Wiki. :) Have a good time around here.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: &lt;font size=-5&gt;*Wisper*(be sure to visit the [[Legacy:Map Ideas|Map Ideas]] Page!)*Wisper*&lt;/font&gt;

'''Eldhrin:''' Thanks for the welcome people! I'm glad to be here. Map Ideas though... one of the reasons I've never bothered to learn how to make good maps is that I never have any good ideas. I'm a programmer through and through I'm afraid :-( Not that it's a bad thing, UT2003 presents many interesting opportunities :-D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3017</id>
      <timestamp>2002-12-07T19:04:01Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I'm a dreadfully inexperienced UnrealScript type of person with an intent to get better at it. Preferably as fast as possible. I'm also new to the whole Wiki thing, so here I go making a mess of it I'm sure.

[[Legacy:Eldhrin/Developer Journal|My Developer Journal]] here on this marvellous Wiki.

==UT2003 Projects==

===Mutators===
; Rocket InstaGib : Unfinished. Like InstaGib (strangely enough), but with a rocket launcher. All normal rocket launcher firing modes work, the main difference being that any impact from a rocket will kill you, and as with classic InstaGib you get infinite ammo for it. These games tend to be very noisy, rather like using the Arena mutator to replace everything with the rocket launcher, but with a greater rate of fatalities. Still to do items for this include
;* reskin rocket launcher (pointless cosmetic stuff, I don't have a clue how to do this)
;* modify rocket explosion effects to differentiate from conventional rockets
;* make sure bots know how to use the gun properly (although they're not doing too badly at the moment)
;* play with the rocket smoke trail

==UT2003 Ideas==
; [[Legacy:Mod Ideas/Sorcery|Mod Ideas/Sorcery]] : Some way to switch over to using magic instead of (or as well as) weapons. If I could do this as a mutator I would be overjoyed, but I don't know enough about the possibilities and limitations of them to tell yet. I learned UnrealScript with Wheel of Time, which didn't have mutators, so they're quite new to me. My initial idea is to code the spells as weapons using the same kind of ammo (to get the mana pool), then use a mutator to substitute them in and regenerate the mana pool over time - assuming that latter is possible. There's a far better description of this on its Mod Ideas page.

==Me==

I'm contactable at eldhrin at alledora dot co dot uk. I'm also a very busy Computer Science undergrad, but I code when I can.

----

==Guestbook==

'''Wormbo:''' Hi and welcome to the Wiki. :) Have a good time around here.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: &lt;font size=-5&gt;*Wisper*(be sure to visit the [[Legacy:Map Ideas|Map Ideas]] Page!)*Wisper*&lt;/font&gt;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Eldhrin/Developer Journal</title>
    <id>1154</id>
    <revision>
      <id>3022</id>
      <timestamp>2003-08-05T09:48:05Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">This is going to have to grow a lot before it's useful to anyone. It's also going to be very rambly, so if you can't make sense of it, well... I'm not promising this will be useful to anyone.

Now I've started work on the Sorcery mutator and its accompanying arsenal of spells (see [[Legacy:Mod Ideas/Sorcery|Mod Ideas/Sorcery]]), I've split the developer thing for Rocket InstaGib onto its own page, which is, strangely enough, at [[Legacy:Eldhrin/Rocket InstaGib|Eldhrin/Rocket InstaGib]].

==Sorcery==

===19th January 2003 (a bit later)===

Well knock me down with a feather - as far as I can tell at the present time, '''ucc make''' works under WineX. Whaddaya know... now I just need to make my mutators show up in UT2003 in Linux, and blammo, I might do more development work! I have not, however, tested if the WineX ucc make is producing correct code...

'''Tarquin:''' cough ... wanna go tell [[Legacy:Ucc|Ucc]] about it? :D

'''Eldhrin:''' I just did, in my rambling kind of way. Not very clearly I'll admit, but I'm not about to give a WineX tutorial. Now if only I could make my mutators show up in the Linux version! It's like the int files aren't there or something.

'''Tarquin:''' Look around ... the whole wiki is rambling! (well, anything I've written is). 

'''Eldhrin:''' Yeah, what you said on your page. I did put a thing on [[Legacy:Ucc|Ucc]]... I'll write more stuff as and when I know it, but at the moment most of the pages on the Wiki are teaching me things, which is wonderful. This page is my attempt to prevent people from making the same mistakes I'm going to. Bet it doesn't work. Any wisdom that accumulates may end up refactored into 'proper' pages - but no promises :-P

===19th January 2003===

Well, so, I've fallen victim to the thing that happens to most new coders... I started a project that's too big. Okay, so it's actually going very well, but I just don't have time to code up so many weapon classes for this. Anyone who wanted to help would of course be welcome to, but I very much doubt anyone else is even interested in this, so I'm going to cut it down and attempt to produce a much smaller mutator which adds flyability to all players. Not quite sure if bot AI can be extended to cope with the ability to fly, and I very much doubt I can actually pull that off even if it is possible (I did one AI module and decided it's not for me, so now I'm a programming language theorist instead). If anyone could help with that, I would be greatly appreciative - but I'd better get it working for multiplayer first I think so the bots have something to be taught!

It also occurred to me that I'd do a lot more of this stuff '''if the development tools were available on Linux'''. I'm not talking about UnrealEd, I hardly ever use that anyway. All I need is '''ucc make''' and the ability to use my custom code with the Linux client (which I currently can't do, it just ignores it - does anyone by any chance happen to know how that works? I should go search forums).

===23rd December 2002===

Sorcery has recently gained a mutator which recharges the SorceryAmmo pool, thus acting as a regenerating Mana pool without having to reimplement too much stuff. The problem is going to be balancing recharge rate with the amount of Mana the various spells are going to be using, but playtesting is the only way to find that. For testing purposes, I just crank it right up so I have effectively infinite ammo, and can get a good feel for if the weapons are working. The mutator still needs to have the ability to swap out conventional weapons for spells though. Code-wise, this has been fairly easy, just requiring some adaptation of the code from the Regeneration and InstaGib mutators.

I have also implemented another spell, which isn't on the original ideas list and might get dropped again - but it's quite fun and was very quick to code up to a working (if not polished or pretty) state. It's called the Death Spell, which is probably a bad name, and when triggered it drains a substantial amount of Mana and sets off something very like a Redeemer explosion. At the same time it spawns a Redeemer explosion effect. It does this at the player's location, so obviously they die - but so does everyone nearby, and so when triggered at just the right time it can actually increase your score. Not much good outside of individual Deathmatch I guess, although there are a few occasions it might be handy in CTF or BR games - mostly to do with delaying the opposing team members from chasing your ball/flag carrier, then when your mate's far enough away, blowing yourself (and them) to smithereens. Secondary fire on that is the new improved float-into-the-air spell which now accelerates you gradually upwards over time, and I think I'll keep it like that for now.

===13th December 2002===

Well, I started on Sorcery today... and it's going quite well :-)

After a few hours' work, with some help from [http://gamestudies.cdis.org/~jgiles/ Sega 500 Unreal Scripting], I now have a new weapon which fires fireballs and consumes mana to do it. I then couldn't be bothered to code up another weapon, so I changed the secondary fire from precisely identical fireballs to the lift-into-the-air spell, which has a few glitches that need working out. For example, at the moment if you float up and hit the ceiling, then move out from under it while still floating, you don't go up anymore because the spell doesn't notice that it should reset the velocity again. I see two options for this:
* set the velocity based on timer events
* check on timer events if the velocity should be set, and if so set it (i.e. do collision tests)

I'm not sure which will be best, and shall have to try it. One thing is certain - the bots won't have a clue what to do with this one!

I now need to make a general base class for all the spells like lift and heal which aren't actually weapons, just to save myself duplicating code.

----

My me page at [[Legacy:Eldhrin|Eldhrin]]

'''DJPaul:'''
 &gt;If anyone reading this has a suggestion for determining team colour from inside a Weapon being carried by a team member, please let me know!

If you are in a Weapon class, try: Instigator.PlayerReplicationInfo.Team.TeamIndex - if that == 0, it is red team, if it is == 1, it is blue team.

'''Eldhrin:''' Thanks :-) It turns out that code was working fine, it was something else that was mucking up... I can't fix it right now (is it too much to ask for UnrealScript development tools for Linux?) but I know how to do it now.

'''El Muerte TDS:''' yes it is too much to ask to get linux dev tools, but I wonder tho, porting UnrealED is not possible, but what about `ucc make` ? I'll check with Ryan.

'''Trystan:''' It'd be nice to see ucc make work under Linux.  Has anyone ever tried it with Wine or WineX?

'''Eldhrin:''' I haven't, although once I've got WineX set up (it's installed, but I haven't sorted out the config yet) I'll give it a go and see what happens. I'm not optimistic though.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3023</id>
      <timestamp>2003-01-19T23:22:24Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is going to have to grow a lot before it's useful to anyone. It's also going to be very rambly, so if you can't make sense of it, well... I'm not promising this will be useful to anyone.

Now I've started work on the Sorcery mutator and its accompanying arsenal of spells (see [[Legacy:Mod Ideas/Sorcery|Mod Ideas/Sorcery]]), I've split the developer thing for Rocket InstaGib onto its own page, which is, strangely enough, at [[Legacy:Eldhrin/Rocket InstaGib|Eldhrin/Rocket InstaGib]].

==Sorcery==

===19th January 2003 (a bit later)===

Well knock me down with a feather - as far as I can tell at the present time, '''ucc make''' works under WineX. Whaddaya know... now I just need to make my mutators show up in UT2003 in Linux, and blammo, I might do more development work! I have not, however, tested if the WineX ucc make is producing correct code...

'''Tarquin:''' cough ... wanna go tell [[Legacy:Ucc|Ucc]] about it? :D

'''Eldhrin:''' I just did, in my rambling kind of way. Not very clearly I'll admit, but I'm not about to give a WineX tutorial. Now if only I could make my mutators show up in the Linux version! It's like the int files aren't there or something.

===19th January 2003===

Well, so, I've fallen victim to the thing that happens to most new coders... I started a project that's too big. Okay, so it's actually going very well, but I just don't have time to code up so many weapon classes for this. Anyone who wanted to help would of course be welcome to, but I very much doubt anyone else is even interested in this, so I'm going to cut it down and attempt to produce a much smaller mutator which adds flyability to all players. Not quite sure if bot AI can be extended to cope with the ability to fly, and I very much doubt I can actually pull that off even if it is possible (I did one AI module and decided it's not for me, so now I'm a programming language theorist instead). If anyone could help with that, I would be greatly appreciative - but I'd better get it working for multiplayer first I think so the bots have something to be taught!

It also occurred to me that I'd do a lot more of this stuff '''if the development tools were available on Linux'''. I'm not talking about UnrealEd, I hardly ever use that anyway. All I need is '''ucc make''' and the ability to use my custom code with the Linux client (which I currently can't do, it just ignores it - does anyone by any chance happen to know how that works? I should go search forums).

===23rd December 2002===

Sorcery has recently gained a mutator which recharges the SorceryAmmo pool, thus acting as a regenerating Mana pool without having to reimplement too much stuff. The problem is going to be balancing recharge rate with the amount of Mana the various spells are going to be using, but playtesting is the only way to find that. For testing purposes, I just crank it right up so I have effectively infinite ammo, and can get a good feel for if the weapons are working. The mutator still needs to have the ability to swap out conventional weapons for spells though. Code-wise, this has been fairly easy, just requiring some adaptation of the code from the Regeneration and InstaGib mutators.

I have also implemented another spell, which isn't on the original ideas list and might get dropped again - but it's quite fun and was very quick to code up to a working (if not polished or pretty) state. It's called the Death Spell, which is probably a bad name, and when triggered it drains a substantial amount of Mana and sets off something very like a Redeemer explosion. At the same time it spawns a Redeemer explosion effect. It does this at the player's location, so obviously they die - but so does everyone nearby, and so when triggered at just the right time it can actually increase your score. Not much good outside of individual Deathmatch I guess, although there are a few occasions it might be handy in CTF or BR games - mostly to do with delaying the opposing team members from chasing your ball/flag carrier, then when your mate's far enough away, blowing yourself (and them) to smithereens. Secondary fire on that is the new improved float-into-the-air spell which now accelerates you gradually upwards over time, and I think I'll keep it like that for now.

===13th December 2002===

Well, I started on Sorcery today... and it's going quite well :-)

After a few hours' work, with some help from [http://gamestudies.cdis.org/~jgiles/ Sega 500 Unreal Scripting], I now have a new weapon which fires fireballs and consumes mana to do it. I then couldn't be bothered to code up another weapon, so I changed the secondary fire from precisely identical fireballs to the lift-into-the-air spell, which has a few glitches that need working out. For example, at the moment if you float up and hit the ceiling, then move out from under it while still floating, you don't go up anymore because the spell doesn't notice that it should reset the velocity again. I see two options for this:
* set the velocity based on timer events
* check on timer events if the velocity should be set, and if so set it (i.e. do collision tests)

I'm not sure which will be best, and shall have to try it. One thing is certain - the bots won't have a clue what to do with this one!

I now need to make a general base class for all the spells like lift and heal which aren't actually weapons, just to save myself duplicating code.

----

My me page at [[Legacy:Eldhrin|Eldhrin]]

'''DJPaul:'''
 &gt;If anyone reading this has a suggestion for determining team colour from inside a Weapon being carried by a team member, please let me know!

If you are in a Weapon class, try: Instigator.PlayerReplicationInfo.Team.TeamIndex - if that == 0, it is red team, if it is == 1, it is blue team.

'''Eldhrin:''' Thanks :-) It turns out that code was working fine, it was something else that was mucking up... I can't fix it right now (is it too much to ask for UnrealScript development tools for Linux?) but I know how to do it now.

'''El Muerte TDS:''' yes it is too much to ask to get linux dev tools, but I wonder tho, porting UnrealED is not possible, but what about `ucc make` ? I'll check with Ryan.

'''Trystan:''' It'd be nice to see ucc make work under Linux.  Has anyone ever tried it with Wine or WineX?

'''Eldhrin:''' I haven't, although once I've got WineX set up (it's installed, but I haven't sorted out the config yet) I'll give it a go and see what happens. I'm not optimistic though.</text>
    </revision>
    <revision>
      <id>3024</id>
      <timestamp>2003-01-20T01:56:58Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is going to have to grow a lot before it's useful to anyone. It's also going to be very rambly, so if you can't make sense of it, well... I'm not promising this will be useful to anyone.

Now I've started work on the Sorcery mutator and its accompanying arsenal of spells (see [[Legacy:Mod Ideas/Sorcery|Mod Ideas/Sorcery]]), I've split the developer thing for Rocket InstaGib onto its own page, which is, strangely enough, at [[Legacy:Eldhrin/Rocket InstaGib|Eldhrin/Rocket InstaGib]].

==Sorcery==

===19th January 2003 (a bit later)===

Well knock me down with a feather - as far as I can tell at the present time, '''ucc make''' works under WineX. Whaddaya know... now I just need to make my mutators show up in UT2003 in Linux, and blammo, I might do more development work! I have not, however, tested if the WineX ucc make is producing correct code...

'''Tarquin:''' cough ... wanna go tell [[Legacy:Ucc|Ucc]] about it? :D

'''Eldhrin:''' I just did, in my rambling kind of way. Not very clearly I'll admit, but I'm not about to give a WineX tutorial. Now if only I could make my mutators show up in the Linux version! It's like the int files aren't there or something.

'''Tarquin:''' Look around ... the whole wiki is rambling! (well, anything I've written is). 

'''Eldhrin:''' Yeah, what you said on your page. I did put a thing on [[Legacy:Ucc|Ucc]]... I'll write more stuff as and when I know it, but at the moment most of the pages on the Wiki are teaching me things, which is wonderful. This page is my attempt to prevent people from making the same mistakes I'm going to. Bet it doesn't work. Any wisdom that accumulates may end up refactored into 'proper' pages - but no promises :-P

===19th January 2003===

Well, so, I've fallen victim to the thing that happens to most new coders... I started a project that's too big. Okay, so it's actually going very well, but I just don't have time to code up so many weapon classes for this. Anyone who wanted to help would of course be welcome to, but I very much doubt anyone else is even interested in this, so I'm going to cut it down and attempt to produce a much smaller mutator which adds flyability to all players. Not quite sure if bot AI can be extended to cope with the ability to fly, and I very much doubt I can actually pull that off even if it is possible (I did one AI module and decided it's not for me, so now I'm a programming language theorist instead). If anyone could help with that, I would be greatly appreciative - but I'd better get it working for multiplayer first I think so the bots have something to be taught!

It also occurred to me that I'd do a lot more of this stuff '''if the development tools were available on Linux'''. I'm not talking about UnrealEd, I hardly ever use that anyway. All I need is '''ucc make''' and the ability to use my custom code with the Linux client (which I currently can't do, it just ignores it - does anyone by any chance happen to know how that works? I should go search forums).

===23rd December 2002===

Sorcery has recently gained a mutator which recharges the SorceryAmmo pool, thus acting as a regenerating Mana pool without having to reimplement too much stuff. The problem is going to be balancing recharge rate with the amount of Mana the various spells are going to be using, but playtesting is the only way to find that. For testing purposes, I just crank it right up so I have effectively infinite ammo, and can get a good feel for if the weapons are working. The mutator still needs to have the ability to swap out conventional weapons for spells though. Code-wise, this has been fairly easy, just requiring some adaptation of the code from the Regeneration and InstaGib mutators.

I have also implemented another spell, which isn't on the original ideas list and might get dropped again - but it's quite fun and was very quick to code up to a working (if not polished or pretty) state. It's called the Death Spell, which is probably a bad name, and when triggered it drains a substantial amount of Mana and sets off something very like a Redeemer explosion. At the same time it spawns a Redeemer explosion effect. It does this at the player's location, so obviously they die - but so does everyone nearby, and so when triggered at just the right time it can actually increase your score. Not much good outside of individual Deathmatch I guess, although there are a few occasions it might be handy in CTF or BR games - mostly to do with delaying the opposing team members from chasing your ball/flag carrier, then when your mate's far enough away, blowing yourself (and them) to smithereens. Secondary fire on that is the new improved float-into-the-air spell which now accelerates you gradually upwards over time, and I think I'll keep it like that for now.

===13th December 2002===

Well, I started on Sorcery today... and it's going quite well :-)

After a few hours' work, with some help from [http://gamestudies.cdis.org/~jgiles/ Sega 500 Unreal Scripting], I now have a new weapon which fires fireballs and consumes mana to do it. I then couldn't be bothered to code up another weapon, so I changed the secondary fire from precisely identical fireballs to the lift-into-the-air spell, which has a few glitches that need working out. For example, at the moment if you float up and hit the ceiling, then move out from under it while still floating, you don't go up anymore because the spell doesn't notice that it should reset the velocity again. I see two options for this:
* set the velocity based on timer events
* check on timer events if the velocity should be set, and if so set it (i.e. do collision tests)

I'm not sure which will be best, and shall have to try it. One thing is certain - the bots won't have a clue what to do with this one!

I now need to make a general base class for all the spells like lift and heal which aren't actually weapons, just to save myself duplicating code.

----

My me page at [[Legacy:Eldhrin|Eldhrin]]

'''DJPaul:'''
 &gt;If anyone reading this has a suggestion for determining team colour from inside a Weapon being carried by a team member, please let me know!

If you are in a Weapon class, try: Instigator.PlayerReplicationInfo.Team.TeamIndex - if that == 0, it is red team, if it is == 1, it is blue team.

'''Eldhrin:''' Thanks :-) It turns out that code was working fine, it was something else that was mucking up... I can't fix it right now (is it too much to ask for UnrealScript development tools for Linux?) but I know how to do it now.

'''El Muerte TDS:''' yes it is too much to ask to get linux dev tools, but I wonder tho, porting UnrealED is not possible, but what about `ucc make` ? I'll check with Ryan.

'''Trystan:''' It'd be nice to see ucc make work under Linux.  Has anyone ever tried it with Wine or WineX?

'''Eldhrin:''' I haven't, although once I've got WineX set up (it's installed, but I haven't sorted out the config yet) I'll give it a go and see what happens. I'm not optimistic though.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Eldhrin/Rocket InstaGib</title>
    <id>1153</id>
    <revision>
      <id>3020</id>
      <timestamp>2004-12-11T13:14:21Z</timestamp>
      <contributor>
        <ip>Bullet</ip>
      </contributor>
      <comment>Added comment</comment>
      <text xml:space="preserve">==Rocket InstaGib==

A little more complicated to do than I imagined, but still seems to have come together a lot more quickly than I would have thought, given that I've got the majority of it done in two days, barring cosmetic changes. There must be something wrong with it, there's no way it could be this easy...

===The concept...===

...was simple, just make an InstaGib mutator which uses rocket launchers instead of shock rifles. Oh that's easy, I thought to myself. I'll just subclass RocketProj, make it always-lethal, then subclass RocketLauncher, make it launch my new kind of rocket, and then poke around in the InstaGib mutator to see how to get it to replace the weapons in the map. Well, that bit went smoothly enough, but it turns out weapons are more complicated than I thought.

===How to make your own rocket launcher===

Subclassing RocketLauncher seemed like the thing to do since I wanted all its functionality, but oh no, that doesn't work very well at all. Why not? Because the RocketLauncher code has explicit typecasts to RocketLauncher in it - most specifically to call SpawnProjectile. So guess what - it fires RocketProj instead of the new projectile I'd so carefully crafted.

A further complication is added by the fact that actually firing a weapon is handled by another class derived from WeaponFire, so I had to modify those as well. As it turns out, this isn't such a bad thing, but it was irritating at the time. RocketLauncher has two firing classes derived from ProjectileFire - one of them handles primary fire mode and launches a single rocket, while the other handles secondary fire mode and launches up to three rockets in two different patterns, as you all no doubt know.

So I thought of subclassing both of them. Big mistake - it ended up firing RocketProj again no matter what I did to the default properties. And why's that? Explicit typecasts again. Haven't the UT coders heard of type abstraction? So I ended up overriding so many methods that I ended up throwing my arms up in despair and just overriding almost every method in RocketLauncher. But hey, that's what overriding is for after all... and at least UnrealScript's methods are virtual by default.

===How to make a rocket always kill people===

First I had to get rid of the proportional splash damage. By default this is handled by a method of Actor called HurtRadius, which automatically tracks down and deals damage to all the suitable Actors in the vicinity of the specified location, based on the distance from that location. I, however, wanted to kill everything in the rocket's explosion radius. This, happily, is easy enough by making a new method called HurtRadiusConstant inside my projectile class, making it do pretty much the same thing as HurtRadius but without the proportional damage falloff calculation, and then call it with a suitably high amount of damage - say 250, a figure I picked out of the RedeemerProjectile code. I was kind of hoping to do it in a slightly less cludgy way by being able to call Actor.Kill() or something, but so far I haven't located such a method.

===How to make it look different===

At the moment, Rocket InstaGib games look a lot like using the Arena mutator with Rocket Launcher as the chosen weapon, because the InstaGib version of the rocket launcher
# doesn't InstaGib, it just kills people
# has precisely the same textures and explosion effects

I'd like to change all this, but I haven't worked out how yet. Well, explosion effects are simple enough if there's already a class which does it, just Spawn the thing (what do all those extra arguments for Spawn do anyway?) but at the moment there isn't, so I need to work out how to make Emitter classes which do what I want them to do - i.e. anything at all really. Must go hunting for a tutorial, or at least someone who knows how to use them. UDN doesnt' seem to be any help. Anyone? Oh well.

===8th December 2002 - how to make it look different part two===

So one of the most visual parts of the rocket is the smoke trail, right? I mean, it's not exactly something you don't see... therefore I figured I'd change that a bit, just to make sure that people notice they're playing with rockets which are considerably more dangerous than the usual kind - infinite numbers of them at that. As I may have mentioned, games with this mutator are noisy, albeit quieter than ones using Redeemer missiles (I tried that for a laugh - never again!)

Anyway, how to make the trail different? Well, XEffects.RocketTrailSmoke is a subclass of [[Legacy:XEmitter|xEmitter]], which is, it seems, the Digital Extremes particle emitter class, as distinct from [[Legacy:Emitter|Emitter]] which is the one provided by Epic. Why they couldn't use Epic's I have no idea, the feature sets of the two at the basic level seem similar. Maybe it's some hyper-optimised version or something, I can't tell as it's implemented in native code (note to self: check if [[Legacy:Emitter|Emitter]] is native or not. If it's not, that would explain a great deal, but would be very silly). So we either subclass RocketTrailSmoke and tweak it a bit, or subclass xEmitter, copy RocketTrailSmoke's defaultproperties (which are the only thing it contains, makes sense really as it's quite a simple effect so needs no extra UnrealScript) and modify them on a more extensive basis? I opted for the latter, as I was originally intended to make larger changes than I actually did. However, it does now mean that I'm not dependent on changes in RocketTrailSmoke which might possibly be implemented in future patches, although I'll probably need to keep an eye on it to see if they change anything for the better which I should copy.

So, to the business state of affairs. I wasn't sure exactly what I could do, but the two things which suggested themselves to me immediately were mucking about with the dispersion of the smoke trail, and of course the colour.

I changed mGrowthRate a little bit, which makes the trails a bit fatter at their older ends, although not all that much that I can tell, so this change isn't really important.

What is important is mColorRange. This is a two-element array containing R, G and B components, and it's a colour which is used to modify the colour of the texture used for the xEmitter's skin (xEmitter sprite particle textures are specified using the generic Skins array rather than anything added on, as Epic's system opted to do. Clearly their design goals were different). I was happy with the texture, and I don't like mucking about with them anyway (don't know how), so I just changed mColorRange(0) and mColorRange(1). As far as I can determine, xEmitter picks a random value from 0 to 1 for each particle, and interpolates between the two mColorRange values to see how much it should modify the particle texture by. Unsure what colour I really wanted, I randomly set mColorRange(0) to (R=50,G=210,B=0) and mColorRange(1) to (R=210,G=210,B=210). The 210 comes from the settings used for RocketTrailSmoke.

This produced a rather nice green and grey kind of trail, but I figured green was too indicative of poison gas rockets (which are really something I should implement at some stage I think) so I went for red, the standard colour of danger, and changed mColorRange(0) to (R=210,G=0,B=0). Here's what it looks like:

[[Image:Legacy_eldhrin-rocketinstagib-redsmokesample.jpeg|center|Instant-kill rockets with snazzy red smoke trails]]

This screenshot is out of date, as I have now implemented team-coloured smoke trails in team games. Non-team games use red trails.

Once I've determined that it works on a LAN, I'll make it available for download. Some kind of stupidly open licence probably, I don't want to conflict too much with all the code I used from Epic and Digital Extremes, and someone might even be able to learn something from my scripting mess.

===9th December 2002 - how to make it work with the Linux client===

This doesn't seem to work... surely I should just be able to put the .u and .int file for the package into ~/.ut2003/System, right? Well it doesn't show up in the Mutators list! Argh! Tried /usr/games/ut2003/System as well and it didn't help any, neither did adding it to ServerPackages and EditPackages.

----

[[Legacy:Eldhrin/Developer Journal|Eldhrin/Developer Journal]]

[[Legacy:Eldhrin|Eldhrin]]

----

'''Bullet:''' I think you could have done all of it without building a new Weapon by modifing the exiting Rocket Launchers in CheckReplacement() and dealing lethal damage in NetDamage(). The problem with the Rocket Launcher using hardcoded projectiles is bad

but could have been resolved by subclassing and overwriting these functions ;)</text>
    </revision>
    <revision>
      <id>3021</id>
      <timestamp>2002-12-13T15:36:22Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <comment>Split off from Developer Journals/Eldhrin</comment>
      <text xml:space="preserve">==Rocket InstaGib==

A little more complicated to do than I imagined, but still seems to have come together a lot more quickly than I would have thought, given that I've got the majority of it done in two days, barring cosmetic changes. There must be something wrong with it, there's no way it could be this easy...

===The concept...===

...was simple, just make an InstaGib mutator which uses rocket launchers instead of shock rifles. Oh that's easy, I thought to myself. I'll just subclass RocketProj, make it always-lethal, then subclass RocketLauncher, make it launch my new kind of rocket, and then poke around in the InstaGib mutator to see how to get it to replace the weapons in the map. Well, that bit went smoothly enough, but it turns out weapons are more complicated than I thought.

===How to make your own rocket launcher===

Subclassing RocketLauncher seemed like the thing to do since I wanted all its functionality, but oh no, that doesn't work very well at all. Why not? Because the RocketLauncher code has explicit typecasts to RocketLauncher in it - most specifically to call SpawnProjectile. So guess what - it fires RocketProj instead of the new projectile I'd so carefully crafted.

A further complication is added by the fact that actually firing a weapon is handled by another class derived from WeaponFire, so I had to modify those as well. As it turns out, this isn't such a bad thing, but it was irritating at the time. RocketLauncher has two firing classes derived from ProjectileFire - one of them handles primary fire mode and launches a single rocket, while the other handles secondary fire mode and launches up to three rockets in two different patterns, as you all no doubt know.

So I thought of subclassing both of them. Big mistake - it ended up firing RocketProj again no matter what I did to the default properties. And why's that? Explicit typecasts again. Haven't the UT coders heard of type abstraction? So I ended up overriding so many methods that I ended up throwing my arms up in despair and just overriding almost every method in RocketLauncher. But hey, that's what overriding is for after all... and at least UnrealScript's methods are virtual by default.

===How to make a rocket always kill people===

First I had to get rid of the proportional splash damage. By default this is handled by a method of Actor called HurtRadius, which automatically tracks down and deals damage to all the suitable Actors in the vicinity of the specified location, based on the distance from that location. I, however, wanted to kill everything in the rocket's explosion radius. This, happily, is easy enough by making a new method called HurtRadiusConstant inside my projectile class, making it do pretty much the same thing as HurtRadius but without the proportional damage falloff calculation, and then call it with a suitably high amount of damage - say 250, a figure I picked out of the RedeemerProjectile code. I was kind of hoping to do it in a slightly less cludgy way by being able to call Actor.Kill() or something, but so far I haven't located such a method.

===How to make it look different===

At the moment, Rocket InstaGib games look a lot like using the Arena mutator with Rocket Launcher as the chosen weapon, because the InstaGib version of the rocket launcher
# doesn't InstaGib, it just kills people
# has precisely the same textures and explosion effects

I'd like to change all this, but I haven't worked out how yet. Well, explosion effects are simple enough if there's already a class which does it, just Spawn the thing (what do all those extra arguments for Spawn do anyway?) but at the moment there isn't, so I need to work out how to make Emitter classes which do what I want them to do - i.e. anything at all really. Must go hunting for a tutorial, or at least someone who knows how to use them. UDN doesnt' seem to be any help. Anyone? Oh well.

===8th December 2002 - how to make it look different part two===

So one of the most visual parts of the rocket is the smoke trail, right? I mean, it's not exactly something you don't see... therefore I figured I'd change that a bit, just to make sure that people notice they're playing with rockets which are considerably more dangerous than the usual kind - infinite numbers of them at that. As I may have mentioned, games with this mutator are noisy, albeit quieter than ones using Redeemer missiles (I tried that for a laugh - never again!)

Anyway, how to make the trail different? Well, XEffects.RocketTrailSmoke is a subclass of [[Legacy:XEmitter|xEmitter]], which is, it seems, the Digital Extremes particle emitter class, as distinct from [[Legacy:Emitter|Emitter]] which is the one provided by Epic. Why they couldn't use Epic's I have no idea, the feature sets of the two at the basic level seem similar. Maybe it's some hyper-optimised version or something, I can't tell as it's implemented in native code (note to self: check if [[Legacy:Emitter|Emitter]] is native or not. If it's not, that would explain a great deal, but would be very silly). So we either subclass RocketTrailSmoke and tweak it a bit, or subclass xEmitter, copy RocketTrailSmoke's defaultproperties (which are the only thing it contains, makes sense really as it's quite a simple effect so needs no extra UnrealScript) and modify them on a more extensive basis? I opted for the latter, as I was originally intended to make larger changes than I actually did. However, it does now mean that I'm not dependent on changes in RocketTrailSmoke which might possibly be implemented in future patches, although I'll probably need to keep an eye on it to see if they change anything for the better which I should copy.

So, to the business state of affairs. I wasn't sure exactly what I could do, but the two things which suggested themselves to me immediately were mucking about with the dispersion of the smoke trail, and of course the colour.

I changed mGrowthRate a little bit, which makes the trails a bit fatter at their older ends, although not all that much that I can tell, so this change isn't really important.

What is important is mColorRange. This is a two-element array containing R, G and B components, and it's a colour which is used to modify the colour of the texture used for the xEmitter's skin (xEmitter sprite particle textures are specified using the generic Skins array rather than anything added on, as Epic's system opted to do. Clearly their design goals were different). I was happy with the texture, and I don't like mucking about with them anyway (don't know how), so I just changed mColorRange(0) and mColorRange(1). As far as I can determine, xEmitter picks a random value from 0 to 1 for each particle, and interpolates between the two mColorRange values to see how much it should modify the particle texture by. Unsure what colour I really wanted, I randomly set mColorRange(0) to (R=50,G=210,B=0) and mColorRange(1) to (R=210,G=210,B=210). The 210 comes from the settings used for RocketTrailSmoke.

This produced a rather nice green and grey kind of trail, but I figured green was too indicative of poison gas rockets (which are really something I should implement at some stage I think) so I went for red, the standard colour of danger, and changed mColorRange(0) to (R=210,G=0,B=0). Here's what it looks like:

[[Image:Legacy_eldhrin-rocketinstagib-redsmokesample.jpeg|center|Instant-kill rockets with snazzy red smoke trails]]

This screenshot is out of date, as I have now implemented team-coloured smoke trails in team games. Non-team games use red trails.

Once I've determined that it works on a LAN, I'll make it available for download. Some kind of stupidly open licence probably, I don't want to conflict too much with all the code I used from Epic and Digital Extremes, and someone might even be able to learn something from my scripting mess.

===9th December 2002 - how to make it work with the Linux client===

This doesn't seem to work... surely I should just be able to put the .u and .int file for the package into ~/.ut2003/System, right? Well it doesn't show up in the Mutators list! Argh! Tried /usr/games/ut2003/System as well and it didn't help any, neither did adding it to ServerPackages and EditPackages.

----

[[Legacy:Eldhrin/Developer Journal|Eldhrin/Developer Journal]]

[[Legacy:Eldhrin|Eldhrin]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Electric Mini</title>
    <id>1157</id>
    <revision>
      <id>3030</id>
      <timestamp>2003-01-09T00:10:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Unreal Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Electric Mini''' Ok, done that! Should I move the NukeRifles stuff here, or link to my own webpages so people can get a .zip archive instead?

'''Wormbo:''' This is your personal page, do whatever you like with it. Check out other people's personal pages if you need ideas. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3031</id>
      <timestamp>2003-01-09T00:05:43Z</timestamp>
      <contributor>
        <ip>Electric Mini</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Unreal Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Electric Mini''' Ok, done that! Should I move the NukeRifles stuff here, or link to my own webpages so people can get a .zip archive instead?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ElevatorMover</title>
    <id>28260</id>
    <revision>
      <id>39917</id>
      <timestamp>2009-11-14T18:02:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ElevatorTrigger</title>
    <id>1123</id>
    <revision>
      <id>2953</id>
      <timestamp>2003-10-07T11:04:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; ElevatorTrigger}}

Works with the [[Legacy:ElevatorMover|ElevatorMover]]. A special trigger actor is required because it must send extra information to the mover: which key to move to.

However, this class has a drawback: it only responds to proximity and can't be triggered itself. [[Legacy:ElevatorTriggerPlus|ElevatorTriggerPlus]] provides a fix.

==Instructions==

Create a large room that will have an elevator

# Subtract a room 512x512x512, light and texture it as you like.
# Create a new brush 16x128x128. Place this at floor level in the middle of the room. 
# Press the right mouse button on the &quot;Add mover&quot; button (found under the brush buttons to the left of the editor) and select &quot;ElevatorMover&quot;.  A purple framed mover should appear, replacing the brush you just created.
# Press the right mouse button on the elevator and select:
## Movers
## Key 1 
# Move the elevator up to around the middle of the room .
# Press the right mouse button on the elevator again and select:
## Movers
## Key 0

The elevator should move back to floor level and this is the position we want it to start in.
# Right click on the mover/elevator to bring up properties.  Under &quot;Object&quot; and &quot;InitalState&quot; it is set to &quot;BumpOpenTimed&quot;.  Change to &quot;StandOpenTimed&quot;. Close the properties window.

#If you want to test it add a playerstart and rebuild.

#To change textures, press the right mouse button on the elevator and select:
## Mover
## Show polys

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2954</id>
      <timestamp>2003-10-07T08:55:16Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==instructions==

Create a large room that will have an elevator

# Subtract a room 512x512x512, light and texture it as you like.
# Create a new brush 16x128x128. Place this at floor level in the middle of the room. 
# Press the right mouse button on the &quot;Add mover&quot; button (found under the brush buttons to the left of the editor) and select &quot;ElevatorMover&quot;.  A purple framed mover should appear, replacing the brush you just created.
# Press the right mouse button on the elevator and select:
## Movers
## Key 1 
# Move the elevator up to around the middle of the room .
# Press the right mouse button on the elevator again and select:
## Movers
## Key 0

The elevator should move back to floor level and this is the position we want it to start in.
# Right click on the mover/elevator to bring up properties.  Under &quot;Object&quot; and &quot;InitalState&quot; it is set to &quot;BumpOpenTimed&quot;.  Change to &quot;StandOpenTimed&quot;. Close the properties window.

#If you want to test it add a playerstart and rebuild.

#To change textures, press the right mouse button on the elevator and select:
## Mover
## Show polys

See also [[Legacy:ElevatorTriggerPlus|ElevatorTriggerPlus]].

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2955</id>
      <timestamp>2003-10-07T11:01:57Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; ElevatorTrigger}}

==Instructions==

Create a large room that will have an elevator

# Subtract a room 512x512x512, light and texture it as you like.
# Create a new brush 16x128x128. Place this at floor level in the middle of the room. 
# Press the right mouse button on the &quot;Add mover&quot; button (found under the brush buttons to the left of the editor) and select &quot;ElevatorMover&quot;.  A purple framed mover should appear, replacing the brush you just created.
# Press the right mouse button on the elevator and select:
## Movers
## Key 1 
# Move the elevator up to around the middle of the room .
# Press the right mouse button on the elevator again and select:
## Movers
## Key 0

The elevator should move back to floor level and this is the position we want it to start in.
# Right click on the mover/elevator to bring up properties.  Under &quot;Object&quot; and &quot;InitalState&quot; it is set to &quot;BumpOpenTimed&quot;.  Change to &quot;StandOpenTimed&quot;. Close the properties window.

#If you want to test it add a playerstart and rebuild.

#To change textures, press the right mouse button on the elevator and select:
## Mover
## Show polys

See also [[Legacy:ElevatorTriggerPlus|ElevatorTriggerPlus]].

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ElevatorTriggerPlus</title>
    <id>1167</id>
    <revision>
      <id>3052</id>
      <timestamp>2007-11-19T12:18:54Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:ElevatorTrigger|ElevatorTrigger]] &gt;&gt; ElevatorTriggerPlus (custom)}}

The elevator trigger only responds to proximity.  This class disables proximity but adds tag event response. 

&lt;uscript&gt;
//=============================================================================
// ElevatorTriggerPlus.
//=============================================================================
class ElevatorTriggerPlus extends Triggers;

// A special trigger devised for the ElevatorMover class, since
// detecting one trigger message is not enough to determine 2 or more
// different commands (like up/down). When an event
// triggers it, it sends a message to the ElevatorMover with the desired
// keyframe change and moving time interval.

var() int GotoKeyframe;
var() float MoveTime;
var() bool bTriggerOnceOnly;

//
// Called when something triggers the trigger.
//
function Trigger( actor Other, pawn EventInstigator )
{
local ElevatorMover EM;
// Call the ElevatorMover's Move function
if( Event != '' )
foreach AllActors( class 'ElevatorMover', EM, Event )
EM.MoveKeyframe( GotoKeyFrame, MoveTime );

if( bTriggerOnceOnly )
// Ignore future touches.
SetCollision(False);
}
&lt;/uscript&gt;

==Implementation==
# open actor browser
# click on &quot;triggers&quot;
# click &quot;trigger&quot; -&gt; &quot;new script&quot;
## package: MyLevel
## name : ElevatorTriggerPlus 
# put the code over the small code UT put there
# tools  -&gt; compile changed
# use the trigger in your level before you save and exit or it wont save it

(there's a page that explains this you can link to: [[Legacy:Create A Subclass|Create A Subclass]])

==Credit==

Taken from http://forums.beyondunreal.com/showthread.php?t=88718

Credit to &quot;The_Countess&quot;.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3053</id>
      <timestamp>2006-10-16T00:53:32Z</timestamp>
      <contributor>
        <ip>Gengar003</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:ElevatorTrigger|ElevatorTrigger]] &gt;&gt; ElevatorTriggerPlus (custom)}}

The elevator trigger only responds to proximity.  This class disables proximity but adds tag event response. 

&lt;uscript&gt;
//=============================================================================
// ElevatorTriggerPlus.
//=============================================================================
class ElevatorTriggerPlus extends Triggers;

// A special trigger devised for the ElevatorMover class, since
// detecting one trigger message is not enough to determine 2 or more
// different commands (like up/down). When an event
// triggers it, it sends a message to the ElevatorMover with the desired
// keyframe change and moving time interval.

var() int GotoKeyframe;
var() float MoveTime;
var() bool bTriggerOnceOnly;

//
// Called when something triggers the trigger.
//
function Trigger( actor Other, pawn EventInstigator )
{
local ElevatorMover EM;
// Call the ElevatorMover's Move function
if( Event != '' )
foreach AllActors( class 'ElevatorMover', EM, Event )
EM.MoveKeyframe( GotoKeyFrame, MoveTime );

if( bTriggerOnceOnly )
// Ignore future touches.
SetCollision(False);
}
&lt;/uscript&gt;

==Implementation==
# open actor browser
# click on &quot;triggers&quot;
# click &quot;trigger&quot; -&gt; &quot;new script&quot;
## package: MyLevel
## name : ElevatorTriggerPlus 
# put the code over the small code UT put there
# tools  -&gt; compile changed
# use the trigger in your level before you save and exit or it wont save it

(there's a page that explains this you can link to: [[Legacy:Create A Subclass|Create A Subclass]])

==Credit==

Taken from http://forums.beyondunreal.com/showthread.php?t=88718

Credit to &quot;The_Countess&quot;.

----

'''Tarquin:''' Is this for UT or UT2003?

'''Wormbo:''' AFAIK there's no class'ElevatorMover' for UT2003.

'''Tarquin:''' Doh!
[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Eliot</title>
    <id>28576</id>
    <revision>
      <id>40330</id>
      <timestamp>2009-12-10T14:37:53Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <comment>moved [[Legacy:Eliot]] to [[User:Eliot]]:&amp;#32;legacy...</comment>
      <text xml:space="preserve">#REDIRECT [[User:Eliot]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Emacs</title>
    <id>1213</id>
    <revision>
      <id>3142</id>
      <timestamp>2007-03-04T18:46:53Z</timestamp>
      <contributor>
        <ip>62-43-5-27.user.ono.com</ip>
      </contributor>
      <comment>*Emacs Unrealscript mode</comment>
      <text xml:space="preserve">Emacs can do everything. Check out shell-mode or compile-mode for compiling unrealscript, and launching unreal.

Here is the source of unrealscript-mode. Suggestions, bug reports, etc, welcome,

&lt;pre&gt;
;;; unrealscript-mode.el &amp;rarr; unrealscript mode derived from cc-mode

;; Author:     2007 John Connors
;; Maintainer: John Connors &lt;johnc at yagc dot co dot uk&gt;
;; Created:    March 2007
;; Version:    See cc-mode.el
;; Keywords:   unrealscript cc-mode languages oop

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2 of the License, or
;; (at your option) any later version.
;; 
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;; 
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:


;; Note: The interface used in this file requires CC Mode 5.30 or
;; later.

;;; Code:

(require 'cc-mode)

;; These are only required at compile time to get the sources for the
;; language constants.  (The cc-fonts require and the font-lock
;; related constants could additionally be put inside an
;; (eval-after-load &quot;font-lock&quot; ...) but then some trickery is
;; necessary to get them compiled.)
(eval-when-compile
  (require 'cc-langs)
  (require 'cc-fonts))

(eval-and-compile
  ;; Make our mode known to the language constant system.  Use Java
  ;; mode as the fallback for the constants we don't change here.
  ;; This needs to be done also at compile time since the language
  ;; constants are evaluated then.
  (c-add-language 'unrealscript-mode 'java-mode))

;; unrealscript has no boolean but a string and a vector type.
(c-lang-defconst c-primitive-type-kwds
  unrealscript 
  (append 
   '(&quot;bool&quot; &quot;name&quot; &quot;object&quot; &quot;actor&quot; &quot;string&quot; &quot;vector&quot;)
   (delete &quot;boolean&quot;
           ;; Use append to not be destructive on the
           ;; return value below.
           (append
            ;; Due to the fallback to Java, we need not give
            ;; a language to `c-lang-const'.
            (c-lang-const c-primitive-type-kwds)
            nil))))

(c-lang-defconst c-type-modifier-keywds
   unrealscript
    (append 
      '(&quot;config&quot; &quot;deprecated&quot; &quot;edfindable&quot; &quot;editconstarray&quot; 
        &quot;editinline&quot; &quot;export&quot; &quot;noexport&quot; &quot;globalconfig&quot; 
        &quot;localized&quot; &quot;const&quot; &quot;editconst&quot; &quot;input&quot; &quot;travel&quot; 
        &quot;skip&quot; &quot;export&quot;) 
      (c-lang-const c-type-modifier-keywds) 
      nil))


;;   &quot;Keywords introducing extra declaration specifiers in the region
;; between the header and the body \(i.e. the \&quot;K&amp;R-region\&quot;) in
;; declarations.&quot;

(c-lang-defconst c-postfix-decl-spec-kwds
  unrealscript
  (append
   '(&quot;abstract&quot; &quot;native&quot; &quot;nativereplication&quot; &quot;nousercreate&quot; &quot;within&quot; 
     &quot;perobjectconfig&quot; &quot;transient&quot; &quot;noexport&quot; &quot;dependson&quot; &quot;exportstructs&quot; 
     &quot;cacheexempt&quot; &quot;hidedropdown&quot; &quot;parseconfig&quot; &quot;dontcollapsecategories&quot;
     &quot;collapsecategories&quot; &quot;hidecategories&quot; &quot;showcategories&quot; &quot;placeable&quot;
     &quot;notplaceable&quot; &quot;instanced&quot;)
   (c-lang-const c-postfix-decl-spec-kwds)
   nil))

;;   &quot;Keywords that may be followed by a comma separated list of type
;; identifiers, where each optionally can be prefixed by keywords.  (Can
;; also be used for the special case when the list can contain only one
;; element.)&quot;
(c-lang-defconst c-type-list-kwds
  unrealscript
  (cons &quot;within&quot;
        (c-lang-const c-type-list-kwds)))

;; Function declarations begin with &quot;function&quot; in this language.
;; There's currently no special keyword list for that in CC Mode, but
;; treating it as a modifier works fairly well.
(c-lang-defconst c-modifier-kwds
 unrealscript 
  (cons
    &quot;function&quot; 
   (c-lang-const c-modifier-kwds)))


(c-lang-defconst c-block-decls-with-vars
  unrealscript
  (cons 
   &quot;state&quot; 
        (c-lang-const c-other-block-decl-kwds)))

;; &quot;Keywords that may be followed by a parenthesis expression that doesn't
;; contain type identifiers.&quot;
(c-lang-defconst c-paren-nontype-kwds
  unrealscript
  (append 
   '(&quot;state&quot; &quot;var&quot;)
   (c-lang-const c-paren-nontype-kwds)
   nil))


;;   &quot;Keywords that may be followed by a parenthesis expression containing
;; type identifiers separated by arbitrary tokens.&quot;
(c-lang-defconst c-paren-type-kwds
  unrealscript
  (append
   '(&quot;config&quot; &quot;dependson&quot;)
   (c-lang-const c-paren-type-kwds)))

;; ;; No cpp in this language, but there's still a &quot;#exec&quot; directive to
;; ;; fontify.  (The definitions for the extra keywords above are enough
;; ;; to incorporate them into the fontification regexps for types and
;; ;; keywords, so no additional font-lock patterns are required.)
;; (c-lang-defconst c-cpp-matchers
;;   unrealscript 
;;       ;; Use the eval form for `font-lock-keywords' to be able to use
;;       ;; the `c-preprocessor-face-name' variable that maps to a
;;       ;; suitable face depending on the (X)Emacs version.
;;       '(eval . (list &quot;^\\s *\\(#exec\\)\\&gt;\\(.*\\)&quot;
;; 		     (list 1 c-preprocessor-face-name)
;; 		     '(2 font-lock-string-face))))

(defcustom unrealscript-font-lock-extra-types nil
  &quot;*List of extra types (aside from the type keywords) to recognize in Unrealscript mode.
Each list item should be a regexp matching a single identifier.&quot;)

(defconst unrealscript-font-lock-keywords-1 
  (c-lang-const c-matchers-1 unrealscript)
  &quot;Minimal highlighting for UNREALSCRIPT mode.&quot;)

(defconst unrealscript-font-lock-keywords-2 
  (c-lang-const c-matchers-2 unrealscript)
  &quot;Fast normal highlighting for UNREALSCRIPT mode.&quot;)

(defconst unrealscript-font-lock-keywords-3 
  (c-lang-const c-matchers-3 unrealscript)
  &quot;Accurate normal highlighting for UNREALSCRIPT mode.&quot;)

(defvar unrealscript-font-lock-keywords unrealscript-font-lock-keywords-3
  &quot;Default expressions to highlight in UNREALSCRIPT mode.&quot;)

(defvar unrealscript-mode-syntax-table nil
  &quot;Syntax table used in unrealscript-mode buffers.&quot;)
(or unrealscript-mode-syntax-table
    (setq unrealscript-mode-syntax-table
	  (funcall (c-lang-const c-make-mode-syntax-table unrealscript))))

(defvar unrealscript-mode-abbrev-table nil
  &quot;Abbreviation table used in unrealscript-mode buffers.&quot;)

(c-define-abbrev-table 'unrealscript-mode-abbrev-table
  ;; Keywords that if they occur first on a line might alter the
  ;; syntactic context, and which therefore should trig reindentation
  ;; when they are completed.
  '((&quot;else&quot; &quot;else&quot; c-electric-continued-statement 0)
    (&quot;while&quot; &quot;while&quot; c-electric-continued-statement 0)))

(defvar unrealscript-mode-map (let ((map (c-make-inherited-keymap)))
		      ;; Add bindings which are only useful for UNREALSCRIPT
		      map)
  &quot;Keymap used in unrealscript-mode buffers.&quot;)

(easy-menu-define unrealscript-menu unrealscript-mode-map &quot;UNREALSCRIPT Mode Commands&quot;
		  ;; Can use `unrealscript' as the language for `c-mode-menu'
		  ;; since its definition covers any language.  In
		  ;; this case the language is used to adapt to the
		  ;; nonexistence of a cpp pass and thus removing some
		  ;; irrelevant menu alternatives.
		  (cons &quot;UNREALSCRIPT&quot; (c-lang-const c-mode-menu unrealscript)))

;;;###Autoload
(add-to-list 'auto-mode-alist '(&quot;\\.uc\\'&quot; . unrealscript-mode))

;;;###autoload
(defun unrealscript-mode ()
  &quot;Major mode for editing UNREALSCRIPT UnrealScript is a
Java-like object-orientated programming (OOP) language created by
Epic Games for programming in-game content for the UnrealEngine.
 
The hook `c-mode-common-hook' is run with no args at mode
initialization, then `unrealscript-mode-hook'.

Key bindings:
\\{unrealscript-mode-map}&quot;
  (interactive)
  (kill-all-local-variables)
  (c-initialize-cc-mode t)
  (set-syntax-table unrealscript-mode-syntax-table)
  (setq major-mode 'unrealscript-mode
	mode-name &quot;UnrealScript&quot;
	local-abbrev-table unrealscript-mode-abbrev-table
	abbrev-mode t)
  (use-local-map c-mode-map)
  ;; `c-init-language-vars' is a macro that is expanded at compile
  ;; time to a large `setq' with all the language variables and their
  ;; customized values for our language.
  (c-init-language-vars unrealscript-mode)
  ;; `c-common-init' initializes most of the components of a CC Mode
  ;; buffer, including setup of the mode menu, font-lock, etc.
  ;; There's also a lower level routine `c-basic-common-init' that
  ;; only makes the necessary initialization to get the syntactic
  ;; analysis and similar things working.
  (c-common-init 'unrealscript-mode)
  (easy-menu-add unrealscript-menu)
  (run-hooks 'c-mode-common-hook)
  (run-hooks 'unrealscript-mode-hook)
  (setq font-lock-keywords-case-fold-search t)
  (c-update-modeline))

(provide 'unrealscript-mode)
&lt;/pre&gt;</text>
    </revision>
    <revision>
      <id>43893</id>
      <timestamp>2010-08-16T23:17:44Z</timestamp>
      <contributor>
        <ip>207.172.203.39</ip>
      </contributor>
      <comment>Header had a funky non-ascii arrow entity instead of the standard &quot;---&quot; specified in Info node &quot;(elisp) Library Headers&quot; -- fix.</comment>
      <text xml:space="preserve">Emacs can do everything. Check out shell-mode or compile-mode for compiling unrealscript, and launching unreal.

Here is the source of unrealscript-mode. Suggestions, bug reports, etc, welcome,

&lt;pre&gt;
;;; unrealscript-mode.el --- unrealscript mode derived from cc-mode

;; Author:     2007 John Connors
;; Maintainer: John Connors &lt;johnc at yagc dot co dot uk&gt;
;; Created:    March 2007
;; Version:    See cc-mode.el
;; Keywords:   unrealscript cc-mode languages oop

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2 of the License, or
;; (at your option) any later version.
;; 
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;; 
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:


;; Note: The interface used in this file requires CC Mode 5.30 or
;; later.

;;; Code:

(require 'cc-mode)

;; These are only required at compile time to get the sources for the
;; language constants.  (The cc-fonts require and the font-lock
;; related constants could additionally be put inside an
;; (eval-after-load &quot;font-lock&quot; ...) but then some trickery is
;; necessary to get them compiled.)
(eval-when-compile
  (require 'cc-langs)
  (require 'cc-fonts))

(eval-and-compile
  ;; Make our mode known to the language constant system.  Use Java
  ;; mode as the fallback for the constants we don't change here.
  ;; This needs to be done also at compile time since the language
  ;; constants are evaluated then.
  (c-add-language 'unrealscript-mode 'java-mode))

;; unrealscript has no boolean but a string and a vector type.
(c-lang-defconst c-primitive-type-kwds
  unrealscript 
  (append 
   '(&quot;bool&quot; &quot;name&quot; &quot;object&quot; &quot;actor&quot; &quot;string&quot; &quot;vector&quot;)
   (delete &quot;boolean&quot;
           ;; Use append to not be destructive on the
           ;; return value below.
           (append
            ;; Due to the fallback to Java, we need not give
            ;; a language to `c-lang-const'.
            (c-lang-const c-primitive-type-kwds)
            nil))))

(c-lang-defconst c-type-modifier-keywds
   unrealscript
    (append 
      '(&quot;config&quot; &quot;deprecated&quot; &quot;edfindable&quot; &quot;editconstarray&quot; 
        &quot;editinline&quot; &quot;export&quot; &quot;noexport&quot; &quot;globalconfig&quot; 
        &quot;localized&quot; &quot;const&quot; &quot;editconst&quot; &quot;input&quot; &quot;travel&quot; 
        &quot;skip&quot; &quot;export&quot;) 
      (c-lang-const c-type-modifier-keywds) 
      nil))


;;   &quot;Keywords introducing extra declaration specifiers in the region
;; between the header and the body \(i.e. the \&quot;K&amp;R-region\&quot;) in
;; declarations.&quot;

(c-lang-defconst c-postfix-decl-spec-kwds
  unrealscript
  (append
   '(&quot;abstract&quot; &quot;native&quot; &quot;nativereplication&quot; &quot;nousercreate&quot; &quot;within&quot; 
     &quot;perobjectconfig&quot; &quot;transient&quot; &quot;noexport&quot; &quot;dependson&quot; &quot;exportstructs&quot; 
     &quot;cacheexempt&quot; &quot;hidedropdown&quot; &quot;parseconfig&quot; &quot;dontcollapsecategories&quot;
     &quot;collapsecategories&quot; &quot;hidecategories&quot; &quot;showcategories&quot; &quot;placeable&quot;
     &quot;notplaceable&quot; &quot;instanced&quot;)
   (c-lang-const c-postfix-decl-spec-kwds)
   nil))

;;   &quot;Keywords that may be followed by a comma separated list of type
;; identifiers, where each optionally can be prefixed by keywords.  (Can
;; also be used for the special case when the list can contain only one
;; element.)&quot;
(c-lang-defconst c-type-list-kwds
  unrealscript
  (cons &quot;within&quot;
        (c-lang-const c-type-list-kwds)))

;; Function declarations begin with &quot;function&quot; in this language.
;; There's currently no special keyword list for that in CC Mode, but
;; treating it as a modifier works fairly well.
(c-lang-defconst c-modifier-kwds
 unrealscript 
  (cons
    &quot;function&quot; 
   (c-lang-const c-modifier-kwds)))


(c-lang-defconst c-block-decls-with-vars
  unrealscript
  (cons 
   &quot;state&quot; 
        (c-lang-const c-other-block-decl-kwds)))

;; &quot;Keywords that may be followed by a parenthesis expression that doesn't
;; contain type identifiers.&quot;
(c-lang-defconst c-paren-nontype-kwds
  unrealscript
  (append 
   '(&quot;state&quot; &quot;var&quot;)
   (c-lang-const c-paren-nontype-kwds)
   nil))


;;   &quot;Keywords that may be followed by a parenthesis expression containing
;; type identifiers separated by arbitrary tokens.&quot;
(c-lang-defconst c-paren-type-kwds
  unrealscript
  (append
   '(&quot;config&quot; &quot;dependson&quot;)
   (c-lang-const c-paren-type-kwds)))

;; ;; No cpp in this language, but there's still a &quot;#exec&quot; directive to
;; ;; fontify.  (The definitions for the extra keywords above are enough
;; ;; to incorporate them into the fontification regexps for types and
;; ;; keywords, so no additional font-lock patterns are required.)
;; (c-lang-defconst c-cpp-matchers
;;   unrealscript 
;;       ;; Use the eval form for `font-lock-keywords' to be able to use
;;       ;; the `c-preprocessor-face-name' variable that maps to a
;;       ;; suitable face depending on the (X)Emacs version.
;;       '(eval . (list &quot;^\\s *\\(#exec\\)\\&gt;\\(.*\\)&quot;
;; 		     (list 1 c-preprocessor-face-name)
;; 		     '(2 font-lock-string-face))))

(defcustom unrealscript-font-lock-extra-types nil
  &quot;*List of extra types (aside from the type keywords) to recognize in Unrealscript mode.
Each list item should be a regexp matching a single identifier.&quot;)

(defconst unrealscript-font-lock-keywords-1 
  (c-lang-const c-matchers-1 unrealscript)
  &quot;Minimal highlighting for UNREALSCRIPT mode.&quot;)

(defconst unrealscript-font-lock-keywords-2 
  (c-lang-const c-matchers-2 unrealscript)
  &quot;Fast normal highlighting for UNREALSCRIPT mode.&quot;)

(defconst unrealscript-font-lock-keywords-3 
  (c-lang-const c-matchers-3 unrealscript)
  &quot;Accurate normal highlighting for UNREALSCRIPT mode.&quot;)

(defvar unrealscript-font-lock-keywords unrealscript-font-lock-keywords-3
  &quot;Default expressions to highlight in UNREALSCRIPT mode.&quot;)

(defvar unrealscript-mode-syntax-table nil
  &quot;Syntax table used in unrealscript-mode buffers.&quot;)
(or unrealscript-mode-syntax-table
    (setq unrealscript-mode-syntax-table
	  (funcall (c-lang-const c-make-mode-syntax-table unrealscript))))

(defvar unrealscript-mode-abbrev-table nil
  &quot;Abbreviation table used in unrealscript-mode buffers.&quot;)

(c-define-abbrev-table 'unrealscript-mode-abbrev-table
  ;; Keywords that if they occur first on a line might alter the
  ;; syntactic context, and which therefore should trig reindentation
  ;; when they are completed.
  '((&quot;else&quot; &quot;else&quot; c-electric-continued-statement 0)
    (&quot;while&quot; &quot;while&quot; c-electric-continued-statement 0)))

(defvar unrealscript-mode-map (let ((map (c-make-inherited-keymap)))
		      ;; Add bindings which are only useful for UNREALSCRIPT
		      map)
  &quot;Keymap used in unrealscript-mode buffers.&quot;)

(easy-menu-define unrealscript-menu unrealscript-mode-map &quot;UNREALSCRIPT Mode Commands&quot;
		  ;; Can use `unrealscript' as the language for `c-mode-menu'
		  ;; since its definition covers any language.  In
		  ;; this case the language is used to adapt to the
		  ;; nonexistence of a cpp pass and thus removing some
		  ;; irrelevant menu alternatives.
		  (cons &quot;UNREALSCRIPT&quot; (c-lang-const c-mode-menu unrealscript)))

;;;###Autoload
(add-to-list 'auto-mode-alist '(&quot;\\.uc\\'&quot; . unrealscript-mode))

;;;###autoload
(defun unrealscript-mode ()
  &quot;Major mode for editing UNREALSCRIPT UnrealScript is a
Java-like object-orientated programming (OOP) language created by
Epic Games for programming in-game content for the UnrealEngine.
 
The hook `c-mode-common-hook' is run with no args at mode
initialization, then `unrealscript-mode-hook'.

Key bindings:
\\{unrealscript-mode-map}&quot;
  (interactive)
  (kill-all-local-variables)
  (c-initialize-cc-mode t)
  (set-syntax-table unrealscript-mode-syntax-table)
  (setq major-mode 'unrealscript-mode
	mode-name &quot;UnrealScript&quot;
	local-abbrev-table unrealscript-mode-abbrev-table
	abbrev-mode t)
  (use-local-map c-mode-map)
  ;; `c-init-language-vars' is a macro that is expanded at compile
  ;; time to a large `setq' with all the language variables and their
  ;; customized values for our language.
  (c-init-language-vars unrealscript-mode)
  ;; `c-common-init' initializes most of the components of a CC Mode
  ;; buffer, including setup of the mode menu, font-lock, etc.
  ;; There's also a lower level routine `c-basic-common-init' that
  ;; only makes the necessary initialization to get the syntactic
  ;; analysis and similar things working.
  (c-common-init 'unrealscript-mode)
  (easy-menu-add unrealscript-menu)
  (run-hooks 'c-mode-common-hook)
  (run-hooks 'unrealscript-mode-hook)
  (setq font-lock-keywords-case-fold-search t)
  (c-update-modeline))

(provide 'unrealscript-mode)
&lt;/pre&gt;</text>
    </revision>
    <revision>
      <id>44150</id>
      <timestamp>2010-12-01T17:48:13Z</timestamp>
      <contributor>
        <ip>88.211.46.93</ip>
      </contributor>
      <comment>Updating to new version that actually works</comment>
      <text xml:space="preserve">Emacs can do everything. Check out shell-mode or compile-mode for compiling unrealscript, and launching unreal.

Here is the source of unrealscript-mode. Suggestions, bug reports, etc, welcome,

&lt;pre&gt;
(defvar unrealscript-mode-hook nil)

(defvar unrealscript-mode-map
  (let ((unrealscript-mode-map (make-sparse-keymap)))
	(define-key unrealscript-mode-map &quot;\C-j&quot; 'newline-and-indent)
	unrealscript-mode-map)
  &quot;Keymap for UNREALSCRIPT major mode&quot;)


(defconst unrealscript-font-lock-keywords-1
  (list
   '(&quot;\\&lt;\\(?:break\\|c\\(?:\\(?:as\\|ontinu\\)e\\)\\|do\\|e\\(?:lse\\|xtends\\)\\|for\\(?:each\\)?\\|i\\(?:f\\|nterface\\)\\|new\\|return\\|switch\\|var\\|while\\|class\\)\\&gt;&quot; . font-lock-keyword-face))
  &quot;Minimal highlighting expressions for UNREALSCRIPT mode.&quot;)

(defconst unrealscript-font-lock-keywords-2
  (append unrealscript-font-lock-keywords-1
		  (list
		   '(&quot;\\&lt;\\(?:array\\|b\\(?:ool\\|yte\\)\\|c\\(?:lass\\|o\\(?:erce\\|lor\\|ords\\)\\)\\|de\\(?:faultproperties\\|legate\\)\\|e\\(?:num\\|vent\\)\\|f\\(?:alse\\|loat\\|unction\\)\\|int\\|local\\|name\\|o\\(?:ptional\\|ut\\)\\|plane\\|r\\(?:egion\\|otator\\)\\|st\\(?:ate\\|r\\(?:ing\\|uct\\)\\)\\|true\\|v\\(?:\\(?:a\\|ecto\\)r\\)\\)\\&gt;&quot; . font-lock-keyword-face)))
  &quot;Additional Keywords to highlight in UNREALSCRIPT mode.&quot;)


(defconst unrealscript-font-lock-keywords-3
  (append unrealscript-font-lock-keywords-2
		  (list
		   '(&quot;\\&lt;\\(?:A\\(?:bstract\\|llowAbstract\\|uto\\(?:Comment\\|ExpandCategories\\)\\)\\|Co\\(?:llapseCategories\\|nfig\\)\\|D\\(?:ep\\(?:endsOn\\|recated\\)\\|isplayName\\|ontCollapseCategories\\)\\|Edit\\(?:Condition\\|InlineNew\\)\\|FriendlyName\\|Hide\\(?:Categories\\|DropDown\\)\\|I\\(?:\\(?:mplemen\\|nheri\\)ts\\)\\|N\\(?:ative\\(?:Replication\\)?\\|o\\(?:Export\\|nTransient\\|t\\(?:EditInlineNew\\|Placeable\\)\\)\\)\\|P\\(?:erObject\\(?:Config\\|Localized\\)\\|laceable\\)\\|ShowCategories\\|T\\(?:oolTip\\|ransient\\)\\|Within\\)\\&gt;&quot; . font-lock-type-face)
		   '(&quot;\\&lt;\\(?:auto\\|c\\(?:lient\\|on\\(?:fig\\|st\\)\\)\\|d\\(?:atabinding\\|eprecated\\|uplicatetransient\\)\\|e\\(?:dit\\(?:const\\|fixedsize\\|inline\\(?:use\\)?\\|oronly\\)\\|x\\(?:ec\\|port\\)\\)\\|globalconfig\\|i\\(?:gnores\\|n\\(?:it\\|put\\|stanced\\|terp\\)\\|terator\\)\\|l\\(?:atent\\|ocalized\\)\\|n\\(?:ative\\(?:replication\\)?\\|o\\(?:clear\\|export\\|import\\|ntransactional\\|tforconsole\\)\\)\\|operator\\|p\\(?:o\\(?:\\(?:inte\\|stoperato\\)r\\)\\|r\\(?:eoperator\\|ivate\\|otected\\)\\|ublic\\)\\|re\\(?:liable\\|pnotify\\)\\|s\\(?:erver\\|i\\(?:mulated\\|ngular\\)\\|kip\\|tatic\\)\\|tra\\(?:nsient\\|vel\\)\\|unreliable\\)\\&gt;&quot; . font-lock-keyword-face)
		   '(&quot;\\&lt;\\(?:A\\(?:bs\\|cos\\|dd\\(?:Item\\)?\\|llActors\\|s\\(?:c\\|in\\)\\|tan\\)\\|B\\(?:asedActors\\|egin\\(?:Play\\|State\\)\\)\\|C\\(?:aps\\|eil\\|h\\(?:ildActors\\|r\\)\\|l\\(?:amp\\|earTimer\\)\\|o\\(?:\\(?:llidingActor\\)?s\\)\\)\\|D\\(?:estroyed\\|i\\(?:\\(?:sabl\\|vid\\)e\\)\\|ynamicActors\\)\\|E\\(?:mpty\\|n\\(?:\\(?:abl\\|dStat\\)e\\)\\|val\\|xp\\)\\|F\\(?:Clamp\\|M\\(?:ax\\|in\\)\\|Rand\\|astTrace\\|in\\(?:d\\|ish\\(?:Anim\\|Interpolation\\)\\)\\)\\|G\\(?:etTimer\\(?:Count\\|Rate\\)\\|oTo\\(?:State\\)?\\)\\|I\\(?:n\\(?:Str\\|itGame\\|sert\\(?:Item\\)?\\|vert\\)\\|s\\(?:\\(?:InStat\\|TimerActiv\\)e\\)\\)\\|L\\(?:e\\(?:ft\\|n\\|rp\\)\\|o\\(?:cs\\|ge\\)\\)\\|M\\(?:ax\\|i\\(?:rrorVectorByNormal\\|[dn]\\)\\)\\|Normal\\|OverlappingActors\\|P\\(?:o\\(?:pState\\|stBeginPlay\\)\\|reBeginPlay\\|ushState\\)\\|R\\(?:and\\|e\\(?:move\\(?:I\\(?:ndex\\|tem\\)\\)?\\|pl\\(?:ace\\)?\\)\\|ight\\|ound\\)\\|S\\(?:et\\(?:State\\|Timer\\)\\|in\\|leep\\|merp\\|p\\(?:awn\\|lit\\)\\|q\\(?:rt\\|uare\\)\\)\\|T\\(?:an\\|ick\\|ouchingActors\\|race\\(?:Actors\\)?\\)\\|V\\(?:Rand\\|Size\\|isible\\(?:\\(?:Colliding\\)?Actors\\)\\)\\|\\(?:ro\\|vec\\)t\\)\\&gt;&quot; . font-lock-function-name-face)))
  &quot;Balls-out highlighting in UNREALSCRIPT mode.&quot;)

(defvar unrealscript-font-lock-keywords unrealscript-font-lock-keywords-3
  &quot;Default highlighting expressions for UNREALSCRIPT mode.&quot;)


(defvar unrealscript-indent-width 4)

(defun looking-at-unrealscript-indent-keyword ()
  (or (looking-at &quot;^[\t ]*while&quot;) (looking-at &quot;^[\t ]*if&quot;) (looking-at &quot;^[\t ]*else&quot;) (looking-at &quot;^[\t ]*for&quot;)))

(defun looking-at-unrealscript-block-end ()	 
  (or (looking-at &quot;^[\t ]*end&quot;) (and (looking-at &quot;^.*}[ \t]*$&quot;) (not (looking-at &quot;^.*{&quot;)))))

(defun looking-at-unrealscript-block-start ()
  (or (looking-at &quot;^[\t ]*begin&quot;) (and (looking-at &quot;^.*{&quot;) (not (looking-at &quot;^.*}[ \t]*$&quot;)))))

;; Function to control indenting.
(defun unrealscript-indent-line ()
  &quot;Indent current line as Unrealscript code&quot;
  (interactive)
  ;; Set the point to beginning of line.
  (beginning-of-line)
  (if (bobp)
	  (indent-line-to 0)
	(let ((not-indented t) (lines-back 0) cur-indent)
	  (if	 (looking-at-unrealscript-block-end) ; Check for closing brace
		  ;; if we are at the end of a block
		  (progn
			(save-excursion
			  (forward-line -1)
			  (setq lines-back (+ lines-back 1))
			  (setq cur-indent (- (current-indentation) unrealscript-indent-width)))
			;; Safety check to make sure we don't indent negative.
			(if (&lt; cur-indent 0)
				(setq cur-indent 0)))
		;; else scan backward 
		(save-excursion
		  (if (looking-at-unrealscript-block-start) ; Opening block			  
			  (progn
				(forward-line -1)
				(setq lines-back (+ lines-back 1))
				(setq cur-indent (current-indentation))
				(setq not-indented nil))
			(while not-indented
			  (forward-line -1)
			  (setq lines-back (+ lines-back 1))
			  (if (looking-at-unrealscript-block-end) ;; Closing Block
				  (progn
					(setq cur-indent (current-indentation))
					(setq not-indented nil))
				(if (looking-at-unrealscript-block-start)
					(progn
					  (setq cur-indent (+ (current-indentation) unrealscript-indent-width))
					  (setq not-indented nil))
				  (if (looking-at-unrealscript-indent-keyword)
					  (progn
						(setq cur-indent (current-indentation))
						(forward-line 1)
						(setq lines-back (- lines-back 1))
						(if (looking-at-unrealscript-block-start)
							(setq not-indented nil) ;; has block
						  (if (zerop lines-back) ;; no block
							  (progn
								(setq cur-indent (+ cur-indent unrealscript-indent-width))						 
								(setq not-indented nil))
							(setq not-indented nil))))
					(if (bobp)
						(setq not-indented nil)))))))))
	  (if cur-indent
		  (indent-line-to cur-indent)
		(indent-line-to 0))))) 

(defun unrealscript-populate-syntax-table (table)
  &quot;Populate the given syntax table as necessary for a C-like language.
This includes setting ' and \&quot; as string delimiters, and setting up
the comment syntax to handle both line style \&quot;//\&quot; and block style
\&quot;/*\&quot; \&quot;*/\&quot; comments.&quot;

  (modify-syntax-entry ?_	 &quot;_&quot;	   table)
  (modify-syntax-entry ?\\ &quot;\\&quot;	   table)
  (modify-syntax-entry ?+	 &quot;.&quot;	   table)
  (modify-syntax-entry ?-	 &quot;.&quot;	   table)
  (modify-syntax-entry ?=	 &quot;.&quot;	   table)
  (modify-syntax-entry ?%	 &quot;.&quot;	   table)
  (modify-syntax-entry ?&lt;	 &quot;.&quot;	   table)
  (modify-syntax-entry ?&gt;	 &quot;.&quot;	   table)
  (modify-syntax-entry ?&amp;	 &quot;.&quot;	   table)
  (modify-syntax-entry ?|	 &quot;.&quot;	   table)
  (modify-syntax-entry ?\' &quot;\&quot;&quot;	   table)
  (modify-syntax-entry ?\240 &quot;.&quot;	 table)

  ;; Set up block and line oriented comments.	 The new C
  ;; standard mandates both comment styles even in C, so since
  ;; all languages now require dual comments, we make this the
  ;; default.
  (modify-syntax-entry ?/	 &quot;. 124b&quot; table)
  (modify-syntax-entry ?*	 &quot;. 23&quot;	table)

  (modify-syntax-entry ?\n &quot;&gt; b&quot;	table)
  ;; Give CR the same syntax as newline, for selective-display
  (modify-syntax-entry ?\^m &quot;&gt; b&quot; table)
  table)

(defvar unrealscript-mode-syntax-table
  (let ((unrealscript-mode-syntax-table (unrealscript-populate-syntax-table (make-syntax-table))))
	unrealscript-mode-syntax-table)
  &quot;Syntax table for unrealscript-mode&quot;)

(defun unrealscript-mode ()
  &quot;Major mode for editing Unrealscript files&quot;
  (interactive)
  (kill-all-local-variables)
  (set-syntax-table unrealscript-mode-syntax-table)
  (use-local-map unrealscript-mode-map)
  (setq indent-line-function 'unrealscript-indent-line)
  (setq font-lock-defaults '(unrealscript-font-lock-keywords nil t))
  (setq major-mode 'unrealscript-mode)
  (setq mode-name &quot;UNREALSCRIPT&quot;)
  (run-hooks 'unrealscript-mode-hook)
  (setq case-fold-search t)
  (setq font-lock-keywords-case-fold-search t))


(provide 'unrealscript-mode)
&lt;/pre&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Embedding Code</title>
    <id>1106</id>
    <revision>
      <id>2920</id>
      <timestamp>2007-09-20T23:26:43Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Since [[Legacy:Map File|Map File]]s are simply Unreal packages, they can contain all sorts of different resources in addition to geometry and [[Legacy:Texture (UT)|Texture (UT)]]s.  That includes UnrealScript code.  Rather than including a bunch of small .u files with your map distribution, embed their code into your [[Legacy:Map File|Map File]]s.  Apart from being neater, that'll make a much more professional appearance than a cluttered .zip file.

'''Don't embed code without permission.'''  (That's clear, but unfortunately not to everyone.) Be sure that the code's author is content with having his/her code embedded in maps. Besides, embedding code makes only sense for small code packages, and if being able to do a centralized update of the code package is not an issue.

==Creating Code in MyLevel==

You can create new classes in UnrealEd and store them directly into MyLevel. You might want to do this if:

* you're pasting in a complete script from one of the [[Legacy:Third-Party Components|Third-Party Components]] or [[Legacy:Open Source|Open Source]] pages
* you're daring 
* you're desperate

See [[Legacy:Create A Subclass|Create A Subclass]] for instructions.

The usual pitfalls of creating code in UnrealEd apply: Can't delete classes, can't rename classes, can't change a superclass, UnrealEd crashes when you change the property declarations of a class that is used in the map. If you're simply pasting a script (a custom one from this site for example), that's not a problem though.

==Importing Code into MyLevel==

===...from a .u file===

If you have a pre-existing .u file that you want to import in MyLevel, do it as follows:

# Make sure that you're not already using that .u file externally in your map; in other words, make the .u file import the first step of using the actors defined in that .u file.  &lt;i&gt;If&lt;/i&gt; you already have added actors from that .u file in your map, cut them into the clipboard, save your map, and close UnrealEd.

# Make sure that the .u package you're about to import isn't automatically loaded when UnrealEd starts.  Check the &lt;tt&gt;EditPackages&lt;/tt&gt; lines in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] and delete any line pointing to that .u package if necessary (then restart UnrealEd). Also, place the .u file you would like to import into the \UnrealTournament\System directory.

# 
Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Log to open the [[Legacy:Log Window|log window]] or click the button on the [[Legacy:Console Bar|Console Bar]].  At the prompt, enter:
 obj load file=whatever.u package=MyLevel

(substitute &quot;whatever&quot; by the name of the package you want to import, of course).  If everything works out, you'll see some log entries along the lines of &quot;New file, existing package.&quot;  If you made a typo in the file name, UnrealEd crashes (courtesy of the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]]).


# If you previously had cut/removed existing actors from that package from your map, paste/re-add them.

# Do a '''full rebuild,''' then save.

'''Notes:'''  After importing a package in this way, the [[Legacy:Actor Browser|actor browser]] in UnrealEd 2 will not show any imported actors that are direct descendants of actor (and possibly some others deeper in the tree too) unless you first deselect then reselect the ''Show Actor Classes Only'' checkbox to force a reload of the tree.

To get imported music to show up in the music browser, click the docked/undocked button and your imported music file will show up.

Only actors that are referenced in the map and their parent classes get saved in [[Legacy:MyLevel|MyLevel]] with the map so if you have actors that only get spawned in runtime and are in the package you just imported you need to add an example in your map somewhere out of sight so they get stored in MyLevel and can be spawned properly in game. This would apply to projectiles in custom weapon types etc. 

Be sure to test your new map on a virgin install of Unreal Tournament that has none of the packages you've imported classes from in it. Otherwise it's dead easy for a reference to something that isn't sucessfully stored in MyLevel to get missed and what you thought would be a triumphant release of your latest project gets off to a bad start when your map crashes the game on load thanks to missing resources...

===...from another map file===

Some authors distribute their scripts already embedded in [[Legacy:Map File|Map File]]s.  To use them (the &quot;with permission&quot; clause above applies, of course), do the following:

# Restart UnrealEd.  (Always a good idea before working with [[Legacy:MyLevel|MyLevel]].)
# Open the map file that contains the code you want to import.
# Without closing UnrealEd, open your own map file you want to import the code into.

UnrealEd doesn't remove the code classes from the first map file you opened when you open the second one; if you use any of those classes in your own map, they will automatically be saved along with your map.

:'''Tip:'''  If you're planning to distribute your ''own'' code via the second method (which is handy because it ''forces'' mappers to embed the code into their maps rather than bundling an .u file), be sure that you '''only place code''' in your distribution map's MyLevel.  UnrealEd is prone to crashing if there are, for instance, [[Legacy:Texture|Texture]]s left from a previously loaded map file in MyLevel when the user loads his/her own map after yours.

==Updating Code in MyLevel==

Sometimes you might have to update the code of components embedded in [[Legacy:MyLevel|MyLevel]].

# Open the map the code is embedded in.
# In the [[Legacy:Actor Browser|actor browser]], browse to the embedded actor class and double-click it.  A script editor window with the component's source code opens.
# Select all of the old source code in the script editor window and delete it.
# Copy all of the new source code '''up to, but not including''' the &lt;code&gt;defaultproperties&lt;/code&gt; section (if there is one).
# Paste the copied source code into the script editor window (click into the empty window and press Ctrl+V).
# Select ''Tools'' -&gt; ''Compile Changed'' from the script editor's menu.  After a brief processing delay, the script editor's status bar says something along the lines of &quot;Success: Compiled xx line(s), xx statement(s).&quot;  (You might have to move the script editor window up a bit in order to see its status bar.)
# Save your map.

==Related Topics ==
* [[Legacy:Writing_And_Using_An_Embedded_Mutator|Writing_And_Using_An_Embedded_Mutator]]

==Discussion==

'''SabbathCat:''' Models can be imported too!!  I've not tried with anything more complex than simple decorations, but you can definitely do it. :) So cool, no worries about &quot;version mismatch&quot;. I had a bunch of flagbase meshes I was always including with my maps, but keeping track of which version was out with which map can be difficult. What a great solution to package everything into the map. :)

'''Foxpaw:''' Yes, you should be able to package anything into a map including code, textures, sounds, models, static meshes, and prefabs. Like it says above a map is just a package like any other. In theory you could probrably even package multiple maps into a package, but you might need a third party application to do that and I'm not sure how you would go about loading the different maps.

'''Wormbo:''' Loading a map into a map? Should be possible through &lt;code&gt;OBJ LOAD File=..\Maps\TheMap.ut2 Package=myLevel&lt;/code&gt;, but I doubt this works without crashing or rendering the existing map useless.

'''Mychaeel:''' The map loading code probably either assumes that all objects in a map file belong to the same map, or it always just loads all those objects connected to the first LevelInfo object it finds in the map file.  While it should be possible to ''store'' two maps in the same Unreal package without problems, I strongly suppose it's not actually possible to ''use'' those packages without some native code changes.

'''SabbathCat:''' There's a pitfall.. I recently embedded a bunch of mesh files and one music file, all well and good, the map plays and runs without a glitch, but now  when I open it in the editor, I just get a blank screen. :(

It may perhaps be the music thing, The imported music didn't show up until I loaded another music package, I could then the MyLevel.musicname track to apply in the level properties.

Is it best to do all your importing once the map is near complete?

ah well, on the up side of course you could consider this an excellent way to safeguard maps from being re-built or plundered without permission. :)

Maybe I should try impoting the map into a new map?

'''inio:''' blank viewports or one big white screen?  if it's the later, do viewports-&gt;configure-&gt;ok

'''Wormbo:''' Music package? You're talking about UT, right? Blank screen problem in UEd is described on [[Legacy:UnrealEd Viewport|UnrealEd viewport]].

'''SabbathCat:''' Er, no. :) A blank screen as in a totally empty map. I stuck back all the .u files I'd removed from the system directory and the .umx in the music directory post-import, and it opened again.

'''Ch3z:''' This is very helpful. Answered my question. A related topics section could help too. I now wonder how to call the mutator I embedded into action. A link in the related topics secton to a page that explained that would be perfect.

'''Foxpaw:''' I'm not sure if there's a wiki page on it or not, but if you want to embed a mutator you will probrably need to also make a custom actor to load the mutator. You can then embed the actor and place one on your map. That actor can load the mutator in it's postbeginplay function and then destroy itself once the mutator is loaded.

'''Ch3z:''' Thx Fox. And I knew I had seen more on this somewhere. Finally came across it again and addeed &quot;Related&quot; section.

'''Jimbo:''' I've imported a vertex mesh into mylevel in UT2003 using the aforementioned procedure and it works quite fine. Strangely however, the mesh is not visible over netplay to the client who connects to me. I still see the mesh but he doesn't. If he disconnects from me and runs his own server or just plays an instant action match, the mesh is visible. Anyone have any ideas what might be causing this problem?

'''Kamek:''' Can OGG files be embedded into maps?

'''Wormbo:''' No. They are no package files themselves and UT200x doesn't provide any option to import generic binary files into packages.

'''Solace:''' I noticed, in my 2004 editor, if I want to import an existing .u to MyLevel, I can type &quot;obj load file=whatever.u package=MyLevel&quot; twice in a row, and I don't have to do the cutting/pasting/ect thing to make it work. Quite a time saver, if it works for anyone else.

'''MythOpus:''' It states on this page that you can't delete classes.  Apparently though, classes in MyLevel will remove themselves if they aren't in the map.  Can someone confirm this?

'''SuperApe:''' It sounds like you're referring to when an embedded object is resident in one map, then on load of another, it &quot;is removed&quot;.  If the question is, &quot;Does the embedded object remain after the next map loads?&quot;, my guess is no.  But I haven't confirmed.

'''Wormbo:''' &quot;Can't delete&quot; refers to the lack of an explicit delete feature, like there is for textures, sounds or static meshes. The implicit deleting (or better: not saving) of classes and other objects in the myLevel package is a feature of UnrealEd. To get rid of unwanted embedded stuff you simply need to make sure it's no longer referenced by the level, then save the level and restart UnrealEd.

'''MythOpus:''' Well, its a great feature then.  I afraid the 5 custom pressure volume classes that I made and didn't work would be stuck in the map forever.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2921</id>
      <timestamp>2007-09-20T17:50:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>it's a feature :D</comment>
      <text xml:space="preserve">Since [[Legacy:Map File|Map File]]s are simply Unreal packages, they can contain all sorts of different resources in addition to geometry and [[Legacy:Texture (UT)|Texture (UT)]]s.  That includes UnrealScript code.  Rather than including a bunch of small .u files with your map distribution, embed their code into your [[Legacy:Map File|Map File]]s.  Apart from being neater, that'll make a much more professional appearance than a cluttered .zip file.

'''Don't embed code without permission.'''  (That's clear, but unfortunately not to everyone.) Be sure that the code's author is content with having his/her code embedded in maps. Besides, embedding code makes only sense for small code packages, and if being able to do a centralized update of the code package is not an issue.

==Creating Code in MyLevel==

You can create new classes in UnrealEd and store them directly into MyLevel. You might want to do this if:

* you're pasting in a complete script from one of the [[Legacy:Third-Party Components|Third-Party Components]] or [[Legacy:Open Source|Open Source]] pages
* you're daring 
* you're desperate

See [[Legacy:Create A Subclass|Create A Subclass]] for instructions.

The usual pitfalls of creating code in UnrealEd apply: Can't delete classes, can't rename classes, can't change a superclass, UnrealEd crashes when you change the property declarations of a class that is used in the map. If you're simply pasting a script (a custom one from this site for example), that's not a problem though.

==Importing Code into MyLevel==

===...from a .u file===

If you have a pre-existing .u file that you want to import in MyLevel, do it as follows:

# Make sure that you're not already using that .u file externally in your map; in other words, make the .u file import the first step of using the actors defined in that .u file.  &lt;i&gt;If&lt;/i&gt; you already have added actors from that .u file in your map, cut them into the clipboard, save your map, and close UnrealEd.

# Make sure that the .u package you're about to import isn't automatically loaded when UnrealEd starts.  Check the &lt;tt&gt;EditPackages&lt;/tt&gt; lines in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] and delete any line pointing to that .u package if necessary (then restart UnrealEd). Also, place the .u file you would like to import into the \UnrealTournament\System directory.

# 
Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Log to open the [[Legacy:Log Window|log window]] or click the button on the [[Legacy:Console Bar|Console Bar]].  At the prompt, enter:
 obj load file=whatever.u package=MyLevel

(substitute &quot;whatever&quot; by the name of the package you want to import, of course).  If everything works out, you'll see some log entries along the lines of &quot;New file, existing package.&quot;  If you made a typo in the file name, UnrealEd crashes (courtesy of the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]]).


# If you previously had cut/removed existing actors from that package from your map, paste/re-add them.

# Do a '''full rebuild,''' then save.

'''Notes:'''  After importing a package in this way, the [[Legacy:Actor Browser|actor browser]] in UnrealEd 2 will not show any imported actors that are direct descendants of actor (and possibly some others deeper in the tree too) unless you first deselect then reselect the ''Show Actor Classes Only'' checkbox to force a reload of the tree.

To get imported music to show up in the music browser, click the docked/undocked button and your imported music file will show up.

Only actors that are referenced in the map and their parent classes get saved in [[Legacy:MyLevel|MyLevel]] with the map so if you have actors that only get spawned in runtime and are in the package you just imported you need to add an example in your map somewhere out of sight so they get stored in MyLevel and can be spawned properly in game. This would apply to projectiles in custom weapon types etc. 

Be sure to test your new map on a virgin install of Unreal Tournament that has none of the packages you've imported classes from in it. Otherwise it's dead easy for a reference to something that isn't sucessfully stored in MyLevel to get missed and what you thought would be a triumphant release of your latest project gets off to a bad start when your map crashes the game on load thanks to missing resources...

===...from another map file===

Some authors distribute their scripts already embedded in [[Legacy:Map File|Map File]]s.  To use them (the &quot;with permission&quot; clause above applies, of course), do the following:

# Restart UnrealEd.  (Always a good idea before working with [[Legacy:MyLevel|MyLevel]].)
# Open the map file that contains the code you want to import.
# Without closing UnrealEd, open your own map file you want to import the code into.

UnrealEd doesn't remove the code classes from the first map file you opened when you open the second one; if you use any of those classes in your own map, they will automatically be saved along with your map.

:'''Tip:'''  If you're planning to distribute your ''own'' code via the second method (which is handy because it ''forces'' mappers to embed the code into their maps rather than bundling an .u file), be sure that you '''only place code''' in your distribution map's MyLevel.  UnrealEd is prone to crashing if there are, for instance, [[Legacy:Texture|Texture]]s left from a previously loaded map file in MyLevel when the user loads his/her own map after yours.

==Updating Code in MyLevel==

Sometimes you might have to update the code of components embedded in [[Legacy:MyLevel|MyLevel]].

# Open the map the code is embedded in.
# In the [[Legacy:Actor Browser|actor browser]], browse to the embedded actor class and double-click it.  A script editor window with the component's source code opens.
# Select all of the old source code in the script editor window and delete it.
# Copy all of the new source code '''up to, but not including''' the &lt;code&gt;defaultproperties&lt;/code&gt; section (if there is one).
# Paste the copied source code into the script editor window (click into the empty window and press Ctrl+V).
# Select ''Tools'' -&gt; ''Compile Changed'' from the script editor's menu.  After a brief processing delay, the script editor's status bar says something along the lines of &quot;Success: Compiled xx line(s), xx statement(s).&quot;  (You might have to move the script editor window up a bit in order to see its status bar.)
# Save your map.

==Related Topics ==
* [[Legacy:Writing_And_Using_An_Embedded_Mutator|Writing_And_Using_An_Embedded_Mutator]]

==Discussion==

'''SabbathCat:''' Models can be imported too!!  I've not tried with anything more complex than simple decorations, but you can definitely do it. :) So cool, no worries about &quot;version mismatch&quot;. I had a bunch of flagbase meshes I was always including with my maps, but keeping track of which version was out with which map can be difficult. What a great solution to package everything into the map. :)

'''Foxpaw:''' Yes, you should be able to package anything into a map including code, textures, sounds, models, static meshes, and prefabs. Like it says above a map is just a package like any other. In theory you could probrably even package multiple maps into a package, but you might need a third party application to do that and I'm not sure how you would go about loading the different maps.

'''Wormbo:''' Loading a map into a map? Should be possible through &lt;code&gt;OBJ LOAD File=..\Maps\TheMap.ut2 Package=myLevel&lt;/code&gt;, but I doubt this works without crashing or rendering the existing map useless.

'''Mychaeel:''' The map loading code probably either assumes that all objects in a map file belong to the same map, or it always just loads all those objects connected to the first LevelInfo object it finds in the map file.  While it should be possible to ''store'' two maps in the same Unreal package without problems, I strongly suppose it's not actually possible to ''use'' those packages without some native code changes.

'''SabbathCat:''' There's a pitfall.. I recently embedded a bunch of mesh files and one music file, all well and good, the map plays and runs without a glitch, but now  when I open it in the editor, I just get a blank screen. :(

It may perhaps be the music thing, The imported music didn't show up until I loaded another music package, I could then the MyLevel.musicname track to apply in the level properties.

Is it best to do all your importing once the map is near complete?

ah well, on the up side of course you could consider this an excellent way to safeguard maps from being re-built or plundered without permission. :)

Maybe I should try impoting the map into a new map?

'''inio:''' blank viewports or one big white screen?  if it's the later, do viewports-&gt;configure-&gt;ok

'''Wormbo:''' Music package? You're talking about UT, right? Blank screen problem in UEd is described on [[Legacy:UnrealEd Viewport|UnrealEd viewport]].

'''SabbathCat:''' Er, no. :) A blank screen as in a totally empty map. I stuck back all the .u files I'd removed from the system directory and the .umx in the music directory post-import, and it opened again.

'''Ch3z:''' This is very helpful. Answered my question. A related topics section could help too. I now wonder how to call the mutator I embedded into action. A link in the related topics secton to a page that explained that would be perfect.

'''Foxpaw:''' I'm not sure if there's a wiki page on it or not, but if you want to embed a mutator you will probrably need to also make a custom actor to load the mutator. You can then embed the actor and place one on your map. That actor can load the mutator in it's postbeginplay function and then destroy itself once the mutator is loaded.

'''Ch3z:''' Thx Fox. And I knew I had seen more on this somewhere. Finally came across it again and addeed &quot;Related&quot; section.

'''Jimbo:''' I've imported a vertex mesh into mylevel in UT2003 using the aforementioned procedure and it works quite fine. Strangely however, the mesh is not visible over netplay to the client who connects to me. I still see the mesh but he doesn't. If he disconnects from me and runs his own server or just plays an instant action match, the mesh is visible. Anyone have any ideas what might be causing this problem?

'''Kamek:''' Can OGG files be embedded into maps?

'''Wormbo:''' No. They are no package files themselves and UT200x doesn't provide any option to import generic binary files into packages.

'''Solace:''' I noticed, in my 2004 editor, if I want to import an existing .u to MyLevel, I can type &quot;obj load file=whatever.u package=MyLevel&quot; twice in a row, and I don't have to do the cutting/pasting/ect thing to make it work. Quite a time saver, if it works for anyone else.

'''MythOpus:''' It states on this page that you can't delete classes.  Apparently though, classes in MyLevel will remove themselves if they aren't in the map.  Can someone confirm this?

'''SuperApe:''' It sounds like you're referring to when an embedded object is resident in one map, then on load of another, it &quot;is removed&quot;.  If the question is, &quot;Does the embedded object remain after the next map loads?&quot;, my guess is no.  But I haven't confirmed.

'''Wormbo:''' &quot;Can't delete&quot; refers to the lack of an explicit delete feature, like there is for textures, sounds or static meshes. The implicit deleting (or better: not saving) of classes and other objects in the myLevel package is a feature of UnrealEd. To get rid of unwanted embedded stuff you simply need to make sure it's no longer referenced by the level, then save the level and restart UnrealEd.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Emitter</title>
    <id>1141</id>
    <revision>
      <id>2995</id>
      <timestamp>2007-11-14T01:16:50Z</timestamp>
      <contributor>
        <ip>C-76-117-131-41.hsd1.pa.comcast.net</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Emitter (Package: Engine)}}

The Emitter class is Epic's particle emitter system (the other system is the [[Legacy:XEmitter|xEmitter]]). These can be placed in maps for a large variety of effects (waterfall, fog, smoke, sparks); they are also used by scripted elements such as the Redeemer explosion, the swirly lights over weapon bases, and the Ion Cannon explosion and beam.

The Emitter system works by using [[Legacy:Subobject|subobject]]s, which are all [[Legacy:ParticleEmitter|ParticleEmitter]]s (or child classes of this). It's these subobjects than actually generate particles, and one Emitter can hold many of them.

Remember to set &lt;tt&gt;bNoDelete=False&lt;/tt&gt; if you want to create a spawnable subclass.

==Properties==

===Emitter===
; array&lt;[[Legacy:ParticleEmitter|ParticleEmitter]]&gt; Emitters :  
The Emitter -&gt; Emitters array holds [[Legacy:Inline Object|inline object]]s: the property dialog expands to show ''their'' properties. See [[Legacy:Add An Inline Object|Add An Inline Object]] for how to use this.

It is possible to add an object to this array using unrealscript. Emitters is a regular dynamic array of [[Legacy:ParticleEmitter|ParticleEmitter]]s. Whether the new ParticleEmitters will work is untested.

Using the same ParticleEmitter object within another Emitter means you get the same properties &amp;ndash; but only half the particles for each Emitter. The maximum number of particles is being shared out between them. The velocity goes weird too.


===Main===
; bool AutoDestroy :  If this is set to true, the emitter will destroy itself when all the particles of its emitters have died.
; bool AutoReset :  If this is set to true, the emitter will reset itself and all its emitters when all the particles of its emitters have died.
; bool DisableFogging : Distance fog will have no effect on particles.
; rangevector GlobalOffsetRange :  
; range TimeTillResetRange :  If AutoReset is true, this is the time delay range for resetting.

===Hidden===
; bool ActorForcesEnabled :  
; box BoundingBox :  
; bool DeleteParticleEmitters :  
; float EmitterHeight :  
; float EmitterRadius :  
; vector GlobalOffset :  
; int Initialized :  
; ParticleMaterial ParticleMaterial :  
; float TimeTillReset :  
; bool UseParticleProjectors :  

==Known Subclasses==
* [[Legacy:BulldogDust|BulldogDust]]
* [[Legacy:DeResPart|DeResPart]]
* [[Legacy:LavaDeath|LavaDeath]]
* [[Legacy:MutantGlow|MutantGlow]] (Epic Bonuspack)
* [[Legacy:NewIonEffect|NewIonEffect]]
* [[Legacy:PlayerSpawnEffect|PlayerSpawnEffect]] (actually this is the pickup respawn effect)
* [[Legacy:RedeemerExplosion|RedeemerExplosion]]
* [[Legacy:RedeemerTrail|RedeemerTrail]]
* [[Legacy:Spiral|Spiral]] (the sparkly things over [[Legacy:XPickUpBase|xPickUpBase]]s)

==Related Topics ==
* [[Legacy:Particle System|Particle System]]
* [[Legacy:ParticleEmitter|ParticleEmitter]]
* [[Legacy:ParticleEmitter Cookbook|ParticleEmitter Cookbook]]
* [[udn2:EmittersReference]]
* [[udn2:EmittersExamples]]

===Custom Emitters===
*[[Legacy:SelfScalingFx|SelfScalingFx]]

==Discussion==

'''Foxpaw:''' Apparently if you get too many particles, the game exits without any error messages or anything - just drops back to windows. At first I thought it was my crappy video card overheating or something, but then I found that it was actually a result of a particle system I had made. (actually, a particle system composed of a pile of other particle systems.)

'''EricBlade:''' I just discovered that Emitters[0].MaxActiveParticles *= 1.2 will crash.  Anything between 0.0 and 1.19 seems to work, 1.2 or higher is a crash.  Unfortunatly, this only seems to affect placed in level Emitters, and not dynamically Spawn()ed emitters.  And the MaxParticles is a const, so no access to that one from the code. :-S

'''MythOpus:''' Using an animated texture with an emitter also crashes UnrealEd.

Vaptor: i found theres 1 exception Firetextures/WetTextures they seem to work no crashes.

However Editor sometimes will corrupt the new texture package when you try to save a firetexture.

how it was corrupted is the worst part the data looks fine but crashes when it tries loading.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2996</id>
      <timestamp>2006-04-07T08:04:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Emitter (Package: Engine)}}

The Emitter class is Epic's particle emitter system (the other system is the [[Legacy:XEmitter|xEmitter]]). These can be placed in maps for a large variety of effects (waterfall, fog, smoke, sparks); they are also used by scripted elements such as the Redeemer explosion, the swirly lights over weapon bases, and the Ion Cannon explosion and beam.

The Emitter system works by using [[Legacy:Subobject|subobject]]s, which are all [[Legacy:ParticleEmitter|ParticleEmitter]]s (or child classes of this). It's these subobjects than actually generate particles, and one Emitter can hold many of them.

Remember to set &lt;tt&gt;bNoDelete=False&lt;/tt&gt; if you want to create a spawnable subclass.

==Properties==

===Emitter===
; array&lt;[[Legacy:ParticleEmitter|ParticleEmitter]]&gt; Emitters :  
The Emitter -&gt; Emitters array holds [[Legacy:Inline Object|inline object]]s: the property dialog expands to show ''their'' properties. See [[Legacy:Add An Inline Object|Add An Inline Object]] for how to use this.

It is possible to add an object to this array using unrealscript. Emitters is a regular dynamic array of [[Legacy:ParticleEmitter|ParticleEmitter]]s. Whether the new ParticleEmitters will work is untested.

Using the same ParticleEmitter object within another Emitter means you get the same properties &amp;ndash; but only half the particles for each Emitter. The maximum number of particles is being shared out between them. The velocity goes weird too.


===Main===
; bool AutoDestroy :  If this is set to true, the emitter will destroy itself when all the particles of its emitters have died.
; bool AutoReset :  If this is set to true, the emitter will reset itself and all its emitters when all the particles of its emitters have died.
; bool DisableFogging : Distance fog will have no effect on particles.
; rangevector GlobalOffsetRange :  
; range TimeTillResetRange :  If AutoReset is true, this is the time delay range for resetting.

===Hidden===
; bool ActorForcesEnabled :  
; box BoundingBox :  
; bool DeleteParticleEmitters :  
; float EmitterHeight :  
; float EmitterRadius :  
; vector GlobalOffset :  
; int Initialized :  
; ParticleMaterial ParticleMaterial :  
; float TimeTillReset :  
; bool UseParticleProjectors :  

==Known Subclasses==
* [[Legacy:BulldogDust|BulldogDust]]
* [[Legacy:DeResPart|DeResPart]]
* [[Legacy:LavaDeath|LavaDeath]]
* [[Legacy:MutantGlow|MutantGlow]] (Epic Bonuspack)
* [[Legacy:NewIonEffect|NewIonEffect]]
* [[Legacy:PlayerSpawnEffect|PlayerSpawnEffect]] (actually this is the pickup respawn effect)
* [[Legacy:RedeemerExplosion|RedeemerExplosion]]
* [[Legacy:RedeemerTrail|RedeemerTrail]]
* [[Legacy:Spiral|Spiral]] (the sparkly things over [[Legacy:XPickUpBase|xPickUpBase]]s)

==Related Topics ==
* [[Legacy:Particle System|Particle System]]
* [[Legacy:ParticleEmitter|ParticleEmitter]]
* [[Legacy:ParticleEmitter Cookbook|ParticleEmitter Cookbook]]
* [[udn2:EmittersReference]]
* [[udn2:EmittersExamples]]

===Custom Emitters===
*[[Legacy:SelfScalingFx|SelfScalingFx]]

==Discussion==

'''Foxpaw:''' Apparently if you get too many particles, the game exits without any error messages or anything - just drops back to windows. At first I thought it was my crappy video card overheating or something, but then I found that it was actually a result of a particle system I had made. (actually, a particle system composed of a pile of other particle systems.)

'''EricBlade:''' I just discovered that Emitters[0].MaxActiveParticles *= 1.2 will crash.  Anything between 0.0 and 1.19 seems to work, 1.2 or higher is a crash.  Unfortunatly, this only seems to affect placed in level Emitters, and not dynamically Spawn()ed emitters.  And the MaxParticles is a const, so no access to that one from the code. :-S

'''MythOpus:''' Using an animated texture with an emitter also crashes UnrealEd.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44127</id>
      <timestamp>2010-11-26T10:00:59Z</timestamp>
      <contributor>
        <username>Murphy</username>
        <id>2204</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Emitter (Package: Engine)}}

The Emitter class is Epic's particle emitter system (the other system is the [[Legacy:XEmitter|xEmitter]]). These can be placed in maps for a large variety of effects (waterfall, fog, smoke, sparks); they are also used by scripted elements such as the Redeemer explosion, the swirly lights over weapon bases, and the Ion Cannon explosion and beam.

The Emitter system works by using [[Legacy:Subobject|subobject]]s, which are all [[Legacy:ParticleEmitter|ParticleEmitter]]s (or child classes of this). It's these subobjects than actually generate particles, and one Emitter can hold many of them.

Remember to set &lt;tt&gt;bNoDelete=False&lt;/tt&gt; if you want to create a spawnable subclass.

==Properties==

===Emitter===
; array&lt;[[Legacy:ParticleEmitter|ParticleEmitter]]&gt; Emitters :  
The Emitter -&gt; Emitters array holds [[Legacy:Inline Object|inline object]]s: the property dialog expands to show ''their'' properties. See [[Legacy:Add An Inline Object|Add An Inline Object]] for how to use this.

It is possible to add an object to this array using unrealscript. Emitters is a regular dynamic array of [[Legacy:ParticleEmitter|ParticleEmitter]]s. Whether the new ParticleEmitters will work is untested.

Using the same ParticleEmitter object within another Emitter means you get the same properties &amp;ndash; but only half the particles for each Emitter. The maximum number of particles is being shared out between them. The velocity goes weird too.


===Main===
; bool AutoDestroy :  If this is set to true, the emitter will destroy itself when all the particles of its emitters have died.
; bool AutoReset :  If this is set to true, the emitter will reset itself and all its emitters when all the particles of its emitters have died.
; bool DisableFogging : Distance fog will have no effect on particles.
; rangevector GlobalOffsetRange :  
; range TimeTillResetRange :  If AutoReset is true, this is the time delay range for resetting.

===Hidden===
; bool ActorForcesEnabled :  
; box BoundingBox :  
; bool DeleteParticleEmitters :  
; float EmitterHeight :  
; float EmitterRadius :  
; vector GlobalOffset :  
; int Initialized :  
; ParticleMaterial ParticleMaterial :  
; float TimeTillReset :  
; bool UseParticleProjectors :  

==Known Subclasses==
* [[Legacy:BulldogDust|BulldogDust]]
* [[Legacy:DeResPart|DeResPart]]
* [[Legacy:LavaDeath|LavaDeath]]
* [[Legacy:MutantGlow|MutantGlow]] (Epic Bonuspack)
* [[Legacy:NewIonEffect|NewIonEffect]]
* [[Legacy:PlayerSpawnEffect|PlayerSpawnEffect]] (actually this is the pickup respawn effect)
* [[Legacy:RedeemerExplosion|RedeemerExplosion]]
* [[Legacy:RedeemerTrail|RedeemerTrail]]
* [[Legacy:Spiral|Spiral]] (the sparkly things over [[Legacy:XPickUpBase|xPickUpBase]]s)

==Related Topics ==
* [[Legacy:Particle System|Particle System]]
* [[Legacy:ParticleEmitter|ParticleEmitter]]
* [[Legacy:ParticleEmitter Cookbook|ParticleEmitter Cookbook]]
* [[udn2:EmittersReference]]
* [[udn2:EmittersExamples]]

===Custom Emitters===
*[[Legacy:SelfScalingFx|SelfScalingFx]]

==Discussion==

'''Foxpaw:''' Apparently if you get too many particles, the game exits without any error messages or anything - just drops back to windows. At first I thought it was my crappy video card overheating or something, but then I found that it was actually a result of a particle system I had made. (actually, a particle system composed of a pile of other particle systems.)

'''EricBlade:''' I just discovered that Emitters[0].MaxActiveParticles *= 1.2 will crash.  Anything between 0.0 and 1.19 seems to work, 1.2 or higher is a crash.  Unfortunatly, this only seems to affect placed in level Emitters, and not dynamically Spawn()ed emitters.  And the MaxParticles is a const, so no access to that one from the code. :-S

'''MythOpus:''' Using an animated texture with an emitter also crashes UnrealEd.

Vaptor: i found theres 1 exception Firetextures/WetTextures they seem to work no crashes.

However Editor sometimes will corrupt the new texture package when you try to save a firetexture.

how it was corrupted is the worst part the data looks fine but crashes when it tries loading.

'''Murphy:''' Animated textures work on emitters in UT2004. I don't know since which engine version, but I used a two-frame animated texture in an emitter without problems (v3369) and it works in Killing Floor, too. Just to let everyone know so no one shies away from using this because they read on unreal wiki that it crashes unrealed. :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Empty Other</title>
    <id>1198</id>
    <revision>
      <id>3112</id>
      <timestamp>2004-06-09T17:12:39Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">===empty_other===

====Skills====

Mostly everything, but not good at anything. Its like having a character in D&amp;D3rd with every skill only one point high...

====Projects i have done====

Mostly none. I do something here, do something there, then i get bored, or get interested in another thing, or accidently reformat my harddrive and all my work. What i have done most is mapping (Unreal 1/Tournament/2004, Quake, HalfLife), coding(C++, UC, QC), cartoon drawing and reading(science fiction, fantasy).

====My future====

Become a game creator of some sort. Or own and run my own Norwegian &quot;Fantasy and Scifi&quot; shop.

===To contact me:===

msn:              empty_other@hotmail.com

Website /w forum: [http://www.home.no/empty www.home.no/empty]

===Guest Book===

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3113</id>
      <timestamp>2004-06-09T16:41:20Z</timestamp>
      <contributor>
        <ip>Empty Other</ip>
      </contributor>
      <minor/>
      <comment>Just created myself my own info site too...</comment>
      <text xml:space="preserve">===empty_other===

====Skills====

Mostly everything, but not good at anything. Its like having a character in D&amp;D3rd with every skill only one point high...

====Projects i have done====

Mostly none. I do something here, do something there, then i get bored, or get interested in another thing, or accidently reformat my harddrive and all my work. What i have done most is mapping (Unreal 1/Tournament/2004, Quake, HalfLife), coding(C++, UC, QC), cartoon drawing and reading(science fiction, fantasy).

====My future====

Become a game creator of some sort. Or own and run my own Norwegian &quot;Fantasy and Scifi&quot; shop.

===To contact me:===

msn:              empty_other@hotmail.com

Website /w forum: [http://www.home.no/empty www.home.no/empty]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Enforcer</title>
    <id>1136</id>
    <revision>
      <id>2984</id>
      <timestamp>2003-05-28T08:35:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; Enforcer (Package: Botpack)}}

The Enforcer is one of the two weapons (the [[Legacy:ImpactHammer|ImpactHammer]] being the other) that players are spawned with by default in UT. It uses the same [[Legacy:Ammo (UT)|Ammo (UT)]] pool as the [[Legacy:Minigun2|Minigun]]. Technically the Enforcer is '''not''' the default weapon, it's just spawned in the [[Legacy:DeathMatchPlus|DeathMatchPlus]].AddDefaultInventory function and can be replaced either in [[Legacy:Mutator|Mutator]].ModifyPlayer or through a [[Legacy:SpawnNotify|SpawnNotify]].

==Known Subclasses ==
* DoubleEnforcer (only used for weapon priority)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2985</id>
      <timestamp>2003-04-30T17:04:33Z</timestamp>
      <contributor>
        <ip>Ben 2500</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; Enforcer}}

The Enforcer is one of the two weapons (the [[Legacy:ImpactHammer|ImpactHammer]] being the other) that players are spawned with by default in UT. It uses the same [[Legacy:Ammo (UT)|Ammo (UT)]] pool as the [[Legacy:Minigun2|Minigun]]. Technically the Enforcer is '''not''' the default weapon, it's just spawned in the [[Legacy:DeathMatchPlus|DeathMatchPlus]].AddDefaultInventory function and can be replaced either in [[Legacy:Mutator|Mutator]].ModifyPlayer or through a [[Legacy:SpawnNotify|SpawnNotify]].

'''Ben:''' Need to be renamed to Enforcer(UT)

==Known Subclasses ==
* DoubleEnforcer (only used for weapon priority)

----

'''Ben 2500:''' Needs to be renamed to Enforcer(UT)</text>
    </revision>
    <revision>
      <id>2986</id>
      <timestamp>2003-04-30T18:50:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; Enforcer (Package: Botpack)}}

The Enforcer is one of the two weapons (the [[Legacy:ImpactHammer|ImpactHammer]] being the other) that players are spawned with by default in UT. It uses the same [[Legacy:Ammo (UT)|Ammo (UT)]] pool as the [[Legacy:Minigun2|Minigun]]. Technically the Enforcer is '''not''' the default weapon, it's just spawned in the [[Legacy:DeathMatchPlus|DeathMatchPlus]].AddDefaultInventory function and can be replaced either in [[Legacy:Mutator|Mutator]].ModifyPlayer or through a [[Legacy:SpawnNotify|SpawnNotify]].

==Known Subclasses ==
* DoubleEnforcer (only used for weapon priority)

----

'''Ben 2500:''' Needs to be renamed to Enforcer(UT)

'''Wormbo:''' UT classes are only renamed when there's a UT2003 class with the same name. However, adding the category and updating the header can't hurt. :) ([[Legacy:Delete Reply When You See It|Delete reply when you see it]])

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Engine</title>
    <id>1095</id>
    <revision>
      <id>2894</id>
      <timestamp>2005-12-18T01:20:36Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; Engine (Package: Engine)}}

The base class of the global application object classes.

==Properties==
; Primitive Cylinder : 
; Client Client (const) : Currently used Client object.
; AudioSubsystem Audio (const) : Currently used audio subsystem
; RenderDevice GRenDev (const) : Currently used render device.
; int bShowFrameRate : Show the frame rate. (&quot;stat fps&quot; command)
; int bShowRenderStats : Show render statistics.
; int bShowHardwareStats : 
; int bShowGameStats : 
; int bShowNetStats : Show network statistics. (&quot;Stat Net&quot; command)
; int bShowAnimStats : Show animation statistics.
; int bShowLIPSincStats : Show LIPSinc statistics.
; int bShowHistograph : 
; int bShowXboxMemStats : 
; int bShowMatineeStats : Show Matinee specific information
; int bShowAudioStats : 
; int bShowLightStats : Show dynamic lighting statistics.
; int TickCycles :
; int GameCycles :
; int ClientCycles : 
; int DetectedVideoMemory (config) : 

===Settings Group===
; int CacheSizeMegs (config) : 
; bool UseSound (config) : Whether the sound subsystem should be used.
; bool UseStaticMeshBatching (config) : 
; bool ServerReadsStdin (config) : 
; float CurrentTickRate : Current tick rate. On clients this is probably equal to the framerate.

===Color Group===

These are used mainly by UnrealEd, but they are in fact declared here, so they might as well show up under &lt;tt&gt;[Engine.[[Legacy:GameEngine|GameEngine]]]&lt;/tt&gt; in the INI file.
; color C_WorldBox (config) : 
; color C_GroundPlane (config) : 
; color C_GroundHighlight (config) : 
; color C_BrushWire (config) : 
; color C_Pivot (config) : 
; color C_Select (config) : 
; color C_Current (config) : 
; color C_AddWire (config) : 
; color C_SubtractWire (config) : 
; color C_GreyWire (config) : 
; color C_BrushVertex (config) : 
; color C_BrushSnap (config) : 
; color C_Invalid (config) : 
; color C_ActorWire (config) : 
; color C_ActorHiWire (config) : 
; color C_Black (config) : 
; color C_White (config) : 
; color C_Mask (config) : 
; color C_SemiSolidWire (config) : 
; color C_NonSolidWire (config) : 
; color C_WireBackground (config) : 
; color C_WireGridAxis (config) : 
; color C_ActorArrow (config) : 
; color C_ScaleBox (config) : 
; color C_ScaleBoxHi (config) : 
; color C_ZoneWire (config) : 
; color C_Mover (config) : 
; color C_OrthoBackground (config) : 
; color C_StaticMesh (config) : 
; color C_VolumeBrush (config) : 
; color C_ConstraintLine (config) : 
; color C_AnimMesh (config) : 
; color C_TerrainWire (config) : 

==Known Subclasses==
* [[Legacy:EditorEngine|EditorEngine]]
* [[Legacy:GameEngine|GameEngine]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2895</id>
      <timestamp>2002-04-19T21:39:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; Engine}}

The base class of the global application object classes.

==Properties ==
; config class&lt;RenderDevice&gt; GameRenderDevice :
; config class&lt;AudioSubsystem&gt; AudioDevice :
; config class&lt;[[Legacy:Console|Console]]&gt; Console :
; config class&lt;NetDriver&gt; NetworkDevice :
; config class&lt;Language&gt; Language :
; config int CacheSizeMegs :
; config bool UseSound :
; float CurrentTickRate :
; primitive Cylinder :
; const client Client :
; const renderbase Render :
; const audiosubsystem Audio :
; int TickCycles, GameCycles, ClientCycles :

==Known subclasses ==
* [[Legacy:EditorEngine|EditorEngine]]</text>
    </revision>
    <revision>
      <id>2896</id>
      <timestamp>2004-10-21T17:38:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; Engine (Package: Engine)}}

The base class of the global application object classes.

==Properties==
; Primitive Cylinder : 
; Client Client (const) : Currently used Client object.
; AudioSubsystem Audio (const) : Currently used audio subsystem
; RenderDevice GRenDev (const) : Currently used render device.
; int bShowFrameRate : Show the frame rate. (&quot;stat fps&quot; command)
; int bShowRenderStats : Show render statistics.
; int bShowHardwareStats : 
; int bShowGameStats : 
; int bShowNetStats : Show network statistics. (&quot;Stat Net&quot; command)
; int bShowAnimStats : Show animation statistics.
; int bShowLIPSincStats : Show LIPSinc statistics.
; int bShowHistograph : 
; int bShowXboxMemStats : 
; int bShowMatineeStats : Show Matinee specific information
; int bShowAudioStats : 
; int bShowLightStats : Show dynamic lighting statistics.
; int TickCycles
; int GameCycles
; int ClientCycles : 
; int DetectedVideoMemory (config) : 

===Settings Group===
; int CacheSizeMegs (config) : 
; bool UseSound (config) : Whether the sound subsystem should be used.
; bool UseStaticMeshBatching (config) : 
; bool ServerReadsStdin (config) : 
; float CurrentTickRate : Current tick rate. On clients this is probably equal to the framerate.

===Color Group===

These are used mainly by UnrealEd, but they are in fact declared here, so they might as well show up under &lt;tt&gt;[Engine.[[Legacy:GameEngine|GameEngine]]]&lt;/tt&gt; in the INI file.
; color C_WorldBox (config) : 
; color C_GroundPlane (config) : 
; color C_GroundHighlight (config) : 
; color C_BrushWire (config) : 
; color C_Pivot (config) : 
; color C_Select (config) : 
; color C_Current (config) : 
; color C_AddWire (config) : 
; color C_SubtractWire (config) : 
; color C_GreyWire (config) : 
; color C_BrushVertex (config) : 
; color C_BrushSnap (config) : 
; color C_Invalid (config) : 
; color C_ActorWire (config) : 
; color C_ActorHiWire (config) : 
; color C_Black (config) : 
; color C_White (config) : 
; color C_Mask (config) : 
; color C_SemiSolidWire (config) : 
; color C_NonSolidWire (config) : 
; color C_WireBackground (config) : 
; color C_WireGridAxis (config) : 
; color C_ActorArrow (config) : 
; color C_ScaleBox (config) : 
; color C_ScaleBoxHi (config) : 
; color C_ZoneWire (config) : 
; color C_Mover (config) : 
; color C_OrthoBackground (config) : 
; color C_StaticMesh (config) : 
; color C_VolumeBrush (config) : 
; color C_ConstraintLine (config) : 
; color C_AnimMesh (config) : 
; color C_TerrainWire (config) : 

==Known Subclasses==
* [[Legacy:EditorEngine|EditorEngine]]
* [[Legacy:GameEngine|GameEngine]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Engine Concept</title>
    <id>1161</id>
    <revision>
      <id>3038</id>
      <timestamp>2005-11-28T09:22:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page covers key concepts of the [[Legacy:Unreal Engine|Unreal Engine]].

No building meant to last is built without a foundation.  We begin working with foundations before we can speak; our first foundation in the world is reality itself, watching others and attempting to imitate what they do or sound like.  These foundations are still built on every day by us as we continue to observe the world, causes, and effects.

[[Legacy:UnrealScript|UnrealScript]] is the heart of Unreal Tournament 2003 (hereafter referred to as [[Legacy:UT2003|UT2003]] or UT2K3).  The language itself is powerful but elegant and simple.  Much like learning C++ is easy, learning UnrealScript is easy.  Applying C++ requires a knowledge of your underlying operating system, and applying UnrealScript requires an underlying knowledge of UT2K3.

This section is going to cover terms that will be used throughout the rest of the overview.  The definitions here will be vague but hopefully enough that you will have a grasp of what's going on when you're reading the remainder of the chapters.

==Unreal Tournament 2003 Terms==
; Authority : The authority of a piece of information has final say in what the information should be.  In the case of UT2K3 the server is almost always the authority as to what information is authentic, or what values a variable will hold.  If you compare your checking account to a variable, you are a client, and the server is the bank.  The bank has the ultimate say in how much money you have in your account, no matter how much you argue.

; Client : Generally speaking this is the player's copy of UT2K3.  The client requests information from the server and displays it for the local player but it also passes the local player's choices back to the server.

; Controller : A controller is used to control a pawn.  Using the chess example from Pawn below you are the controller.  If you're playing Battle Chess (tm) then there are two controllers:  one, an artificial intelligence controlled by the computer, and two, you.  A controller, at its most basic, is simply a class designed to receive input and pass that input on to the game in whatever way, shape, or form is deemed necessary. More: [[Legacy:Controller Overview|Controller Overview]].

; Event : An event is just that:  something that occurs outside of the control of the class the event happens in.  Windows 95, 98, 2000, etc., are all event driven.  Events are notated in UnrealScript with the keyword ''event.''  This basically means that at some point in time the Unreal Engine will call this function as a result of something that has occurred.  Events can be compared to driving.  In non-event driven programming you control the car the entire time you're in it, holding the steering wheel steady and always able to react to any information you manually gather.  In event driven programming you would only receive control of the car when a prespecified event occurred, i.e. if a deer runs across the road the onboard car computer would beep you and turn control over to you after passing you some basic information about the deer including its location, speed, and size. More: [[Legacy:Event|Event]].

; Native : The term native is used in the UT2K3 environment to indicate code that is not written in UnrealScript but is instead written in C/C++ and compiled by Epic.  Native items are usually made so because UnrealScript is roughly twenty times slower than C/C++.  Crucial pieces of UT2K3 or often used pieces of code are made native to optimize the game.  Quite often you'll see the term ''native magic'' thrown about:  this is usually indicative of a process that is not completely understood.  Processes like this are assumed to be handled, at least partially, in native code. More: [[Legacy:Native Coding|Native Coding]].

; Package : A mod, mutator, map, or any other item meant to be used in UT2K3 is compiled and placed into what's known as a ''package.''  These files will usually have a file extension of .u, .utx, .ut2, .usx, or .ukx.  A little known fact about UT2K3 is that all of those packages with the different extensions are actually the same:  An UT2K3 package.  The reason for differing extensions is to help separate out which primarily contain maps, static meshes, animations, or other data.  Technically, however, an animation package (official extension:  ukx) has nothing stopping it from holding a map (extension:  ut2). More: [[Legacy:Package|Package]]

; Pawn : If you were playing chess instead of UT2K3 the meaning of this word would be obvious.  A pawn is any of the pieces you control whether that is a knight, a bishop, a queen, or the namesake of the Pawn: a pawn.  A pawn can be moved, controlled, killed, destroyed, manipulated.  It is your basic unit of control as a player.

; Replication : Replication is a fancy term for taking information from either a client or a server and passing it to the other.  Consider this fabricated situation:  the server knows that there are four players out of six connected, and it knows about their currently selected weapon, their current ammunition count, their current health, powerups, and any other relevant information about said players.  In this particular case it knows this information because it is the authority.  How does a client learn about it's current situation?  The server tells the client.  The method of telling the client the current situation is known as replication.  Replication is one of the scariest and most complicated issues surrounding UT2K3 and we will spend a great deal of time on this issue later. More: [[Legacy:Replication|Replication]].

{{innerbox|'''Replication'''

A copy or reproduction; the act or process of duplicating or reproducing something.

}}

; Server : This is the machine running the server for UT2K3.  This can be either a dedicated or non dedicated server; a non dedicated server can also be used as a client although performance will suffer.  The server has complete control over the game and its variables.  It decides what information is final and what can be negotiated.

''Please add to this list.''

==Related Topics ==
* [[Legacy:Terminology|Terminology]] - the Unreal dictionary

==Discussion==

'''Tarquin:''' What is the role of this page? It's too advanced to be a tutorial. It seems to be duplicating [[Legacy:Terminology|Terminology]]. I suggest the short definitions be folded into [[Legacy:Terminology|Terminology]], and longer ones maybe get a page of their own.

'''GRAF1K:''' Agreed. I think [[Legacy:Terminology|Terminology]] should get more prominence, perhaps on [[Legacy:Home Page|Home Page]].

'''OP:''' &quot;learning C++ is easy&quot; ?? You must be joking. C++ is one of the hardest languages to master (including PROLOG, I would personally say). Learning JAVA is easy, for example. Not C++.

'''Foxpaw:''' Perhaps the author of the page considered C++ to be easy to learn.. it is actually a very straightforward language if you have a thorough background in computer science, in my opinion. I could see how some people would struggle with it if they were coming from a different background.

'''Solid Snake:''' I think it largely depends on the person. I find C++ ok and not too hard. I guess some people find C++ hard if they came from a graphical area only for example. It depends on your background and how 'intelligent' you are in terms of being able to understand a coding language. Some people will find it harder/easier than others when it comes to learning a new language.

'''Sweavo:''' First rule of writing is to know your audience ... in the context of a wiki, it's probably worth inserting a paragraph at the start stating who the page is supposed to help and maybe a little of what it's NOT meant to be... that way the many people who come by, who may edit it, will know the intended direction of the page.  OTOH you have players, mappers, artists, modelers, modders, and servermodders.  Ok that's a general point, not especially about THIS page...

'''T1:''' Why does this page refer to UT2003, not the engine?

'''Tarquin:''' My suggestion: move the intro of this page to a new page, [[Legacy:Unreal Engine Basics|Unreal Engine Basics]]. Move the definitions to [[Legacy:Terminology|Terminology]] ir subject pages such as [[Legacy:Package|Package]] or [[Legacy:Replication|Replication]]. This page can then be deleted.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3039</id>
      <timestamp>2005-06-07T14:55:16Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page covers key concepts of the [[Legacy:Unreal Engine|Unreal Engine]].

No building meant to last is built without a foundation.  We begin working with foundations before we can speak; our first foundation in the world is reality itself, watching others and attempting to imitate what they do or sound like.  These foundations are still built on every day by us as we continue to observe the world, causes, and effects.

[[Legacy:UnrealScript|UnrealScript]] is the heart of Unreal Tournament 2003 (hereafter referred to as [[Legacy:UT2003|UT2003]] or UT2K3).  The language itself is powerful but elegant and simple.  Much like learning C++ is easy, learning UnrealScript is easy.  Applying C++ requires a knowledge of your underlying operating system, and applying UnrealScript requires an underlying knowledge of UT2K3.

This section is going to cover terms that will be used throughout the rest of the overview.  The definitions here will be vague but hopefully enough that you will have a grasp of what's going on when you're reading the remainder of the chapters.

==Unreal Tournament 2003 Terms==
; Authority : The authority of a piece of information has final say in what the information should be.  In the case of UT2K3 the server is almost always the authority as to what information is authentic, or what values a variable will hold.  If you compare your checking account to a variable, you are a client, and the server is the bank.  The bank has the ultimate say in how much money you have in your account, no matter how much you argue.

; Client : Generally speaking this is the player's copy of UT2K3.  The client requests information from the server and displays it for the local player but it also passes the local player's choices back to the server.

; Controller : A controller is used to control a pawn.  Using the chess example from Pawn below you are the controller.  If you're playing Battle Chess (tm) then there are two controllers:  one, an artificial intelligence controlled by the computer, and two, you.  A controller, at its most basic, is simply a class designed to receive input and pass that input on to the game in whatever way, shape, or form is deemed necessary. More: [[Legacy:Controller Overview|Controller Overview]].

; Event : An event is just that:  something that occurs outside of the control of the class the event happens in.  Windows 95, 98, 2000, etc., are all event driven.  Events are notated in UnrealScript with the keyword ''event.''  This basically means that at some point in time the Unreal Engine will call this function as a result of something that has occurred.  Events can be compared to driving.  In non-event driven programming you control the car the entire time you're in it, holding the steering wheel steady and always able to react to any information you manually gather.  In event driven programming you would only receive control of the car when a prespecified event occurred, i.e. if a deer runs across the road the onboard car computer would beep you and turn control over to you after passing you some basic information about the deer including its location, speed, and size. More: [[Legacy:Event|Event]].

; Native : The term native is used in the UT2K3 environment to indicate code that is not written in UnrealScript but is instead written in C/C++ and compiled by Epic.  Native items are usually made so because UnrealScript is roughly twenty times slower than C/C++.  Crucial pieces of UT2K3 or often used pieces of code are made native to optimize the game.  Quite often you'll see the term ''native magic'' thrown about:  this is usually indicative of a process that is not completely understood.  Processes like this are assumed to be handled, at least partially, in native code. More: [[Legacy:Native Coding|Native Coding]].

; Package : A mod, mutator, map, or any other item meant to be used in UT2K3 is compiled and placed into what's known as a ''package.''  These files will usually have a file extension of .u, .utx, .ut2, .usx, or .ukx.  A little known fact about UT2K3 is that all of those packages with the different extensions are actually the same:  An UT2K3 package.  The reason for differing extensions is to help separate out which primarily contain maps, static meshes, animations, or other data.  Technically, however, an animation package (official extension:  ukx) has nothing stopping it from holding a map (extension:  ut2). More: [[Legacy:Package|Package]]

; Pawn : If you were playing chess instead of UT2K3 the meaning of this word would be obvious.  A pawn is any of the pieces you control whether that is a knight, a bishop, a queen, or the namesake of the Pawn: a pawn.  A pawn can be moved, controlled, killed, destroyed, manipulated.  It is your basic unit of control as a player.

; Replication : Replication is a fancy term for taking information from either a client or a server and passing it to the other.  Consider this fabricated situation:  the server knows that there are four players out of six connected, and it knows about their currently selected weapon, their current ammunition count, their current health, powerups, and any other relevant information about said players.  In this particular case it knows this information because it is the authority.  How does a client learn about it's current situation?  The server tells the client.  The method of telling the client the current situation is known as replication.  Replication is one of the scariest and most complicated issues surrounding UT2K3 and we will spend a great deal of time on this issue later. More: [[Legacy:Replication|Replication]].

{{innerbox|'''Replication'''

A copy or reproduction; the act or process of duplicating or reproducing something.

}}

; Server : This is the machine running the server for UT2K3.  This can be either a dedicated or non dedicated server; a non dedicated server can also be used as a client although performance will suffer.  The server has complete control over the game and its variables.  It decides what information is final and what can be negotiated.

''Please add to this list.''

==Related Topics ==
* [[Legacy:Terminology|Terminology]] - the Unreal dictionary

==Discussion==

'''Tarquin:''' What is the role of this page? It's too advanced to be a tutorial. It seems to be duplicating [[Legacy:Terminology|Terminology]]. I suggest the short definitions be folded into [[Legacy:Terminology|Terminology]], and longer ones maybe get a page of their own.

'''GRAF1K:''' Agreed. I think [[Legacy:Terminology|Terminology]] should get more prominence, perhaps on [[Legacy:Home Page|Home Page]].

'''OP:''' &quot;learning C++ is easy&quot; ?? You must be joking. C++ is one of the hardest languages to master (including PROLOG, I would personally say). Learning JAVA is easy, for example. Not C++.

'''Foxpaw:''' Perhaps the author of the page considered C++ to be easy to learn.. it is actually a very straightforward language if you have a thorough background in computer science, in my opinion. I could see how some people would struggle with it if they were coming from a different background.

'''Solid Snake:''' I think it largely depends on the person. I find C++ ok and not too hard. I guess some people find C++ hard if they came from a graphical area only for example. It depends on your background and how 'intelligent' you are in terms of being able to understand a coding language. Some people will find it harder/easier than others when it comes to learning a new language.

'''Sweavo:''' First rule of writing is to know your audience ... in the context of a wiki, it's probably worth inserting a paragraph at the start stating who the page is supposed to help and maybe a little of what it's NOT meant to be... that way the many people who come by, who may edit it, will know the intended direction of the page.  OTOH you have players, mappers, artists, modelers, modders, and servermodders.  Ok that's a general point, not especially about THIS page...

'''T1:''' Why does this page refer to UT2003, not the engine?

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Engine Directory Structure</title>
    <id>1128</id>
    <revision>
      <id>2965</id>
      <timestamp>2005-01-10T22:00:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">All [[Legacy:Unreal Engine|unreal engine]] games, of all [[Legacy:Unreal Engine Versions|Unreal Engine versions]] use the same directory structure.

If you want to edit the game, it is important to know this structure and how it is used by the engine to store things.

''See also the [[:Category:Legacy Basic Procedure]] page on this, [[Legacy:Set Up Package Folders|Set Up Package Folders]].''

==The Unreal base directory ==

This directory is where the game itself is installed. By default, it's called '''C:\{game name}''', eg '''C:\UnrealTournament''', '''C:\WheelOfTime''' etc. Throughout the Unreal Wiki, you'll see it referred to as {[[Legacy:Base Directory|Base Directory]]}.

Within this, there are several subdirectories. The most important is /system, which contains the actual applications that run the game, [[Legacy:UnrealEd|UnrealEd]], [[Legacy:Ucc|Ucc]], etc. Most other subdirectories contain different kinds of [[Legacy:Package|package]].

===Logs ===

This directory contains logs created using the [[Legacy:StatLog|StatLog]] class; ngStats and CSHP/UTPure do that, for instance.  Logs created by [[Legacy:StatLog|StatLog]] are encoded in [http://www.unicode.org Unicode].

If you're looking for system logs like UnrealTournament.log, Editor.log or Server.log, check the System directory instead.

===Maps ===

Maps (or levels) are the geometric structure of the space where the action will take place.

The maps are formed of solid and non-solid areas computed with the technique of [[Legacy:BSP Tree|BSP Tree]].

[[Legacy:Actor|Actor]]s evaluate and interact in this theoretical space.

===Music ===

In this directory you'll find files for background music. In pre-UT2003 versions, these are ''.UMX'' tracker files, in later versions, OGG files.

You can easily manage and import new soundtracks via the [[Legacy:Music Browser|music browser]] in unrealed.

[http://www.winamp.com WinAmp] and most other decent players can be used to play these files.  You can use ''.mod'', ''.IT'', ''.xm'', or ''.s3m'' files and convert them to UMX via Unrealed.

There is no support of the ''MP3'' format in UT and earlier games (except [[Legacy:Wheel Of Time|Wheel Of Time]]).

There's a great Tracker (music editor) called [[Legacy:ModPlug Tracker|ModPlug Tracker]] which natively supports the opening of ''UMX'' files.  It will not, however, save out ''UMX'' files, they will still have to be converted in UnrealED.

The [[Legacy:Music|Music]] page has more details on how to import and export music files.

The other major tracking programs are [http://www.relaypoint.net/~emillan/ft2/ Fast Tracker] and [http://www.noisemusic.org/it Impulse Tracker].  However, these are DOS programs and I wouldn't particularly recommend Impulse Tracker for beginner trackers.

===System ===

This directory is where the major functionality of the Unreal engine is kept.  The launchers for the game and [[Legacy:UnrealEd|UnrealEd]] (of file type .exe, for computers running a version of Windows) are both found in this folder.  Other filetypes include:
; .dll :  Packages containing native C++ code.
; .u :  These are where most of the script for the different classes is kept.  It is also where various meshes, sounds, and textures that have direct connections to these scripts are kept.
; .int :  These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition (and that's the origin of the file extension .int for &quot;international&quot; as well), they are used for language localization. See [[Legacy:INT File|INT File]] for more information.
; .ini :  These files are used to store information about how the game and its mods are configured. While they can sometimes be edited manually by users, it is usually best to edit the configurations settings directly through the game or the editor.  (However, there may occasionally be a time when this is not possible.  In such a case, this option is always open.) See also [[Legacy:Game Ini File|game ini file]].
; .bmp :  If these files have names beginning with &quot;Shot&quot; and then followed by a four-digit number, then this is a screenshot taken from within the game and saved by the engine as a Bitmap image file.  Once a screenshot has been taken, it is converted to this format by the engine and then ignored, except to prevent the engine from creating files with conflicting names.

===Sounds and Textures ===

These two directories contain exactly the types of resources that they sound like they contain.  Sounds are most often saved into ''.uax'' files and put into the Sounds directory, where Textures are usually imported into ''.utx'' files and saved into the Textures directory.

==Notes ==

'''Don't use blanks or periods in package names.'''  The engine gets confused by this.  (Periods, for instance, are used as the separator character between package and object names.)

While the convention for separating resources is used by the game's own code, it is not always necessary to organize resources in this way.  For any package that UnrealEd can be used to create (''.u'', ''.umx'', ''.uax'', ''.utx'', or ''.unr''), any different type of resource can be stored in this package.  The engine will only fail to locate a resource if its package is in the wrong location for its filetype.  So the Unreal engine cannot see a .uax file if it is in the Music folder, for example.  On the other hand, if ordinary sounds were stored in a .umx file located in the Music folder, then these sounds could be found by the engine.  You can add or alter the ''Paths'' settings in UnrealTournament.ini to modify that behavior. 

Because of this degree of modularity, it must be understood that, ignoring the file extension, '''two packages cannot possess the same name'''.  For example, there cannot be both a MyPackage.u and a MyPackage.utx, because the engine will only be able to see one or the other of these packages, depending on which one it finds first.  In this case, it will probably find the .u file first, since the [[Legacy:Game Ini File|game ini file]] is set up to look in the System folder before the Textures folder. 

==Related Topics ==
* [[Legacy:File Format|File Format]] has a list of all file types used by the Unreal engine
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Game Ini File|game ini file]]</text>
    </revision>
    <revision>
      <id>2966</id>
      <timestamp>2005-01-10T20:56:12Z</timestamp>
      <contributor>
        <ip>66.192.30.22</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>33813</id>
      <timestamp>2008-12-29T02:43:38Z</timestamp>
      <contributor>
        <username>RacelAcelg</username>
        <id>1810</id>
      </contributor>
      <comment>noourelr</comment>
      <text xml:space="preserve">lielricdron
All [[Legacy:Unreal Engine|unreal engine]] games, of all [[Legacy:Unreal Engine Versions|Unreal Engine versions]] use the same directory structure.

If you want to edit the game, it is important to know this structure and how it is used by the engine to store things.

''See also the [[:Category:Legacy Basic Procedure]] page on this, [[Legacy:Set Up Package Folders|Set Up Package Folders]].''

==The Unreal base directory ==

This directory is where the game itself is installed. By default, it's called '''C:\{game name}''', eg '''C:\UnrealTournament''', '''C:\WheelOfTime''' etc. Throughout the Unreal Wiki, you'll see it referred to as {[[Legacy:Base Directory|Base Directory]]}.

Within this, there are several subdirectories. The most important is /system, which contains the actual applications that run the game, [[Legacy:UnrealEd|UnrealEd]], [[Legacy:Ucc|Ucc]], etc. Most other subdirectories contain different kinds of [[Legacy:Package|package]].

===Logs ===

This directory contains logs created using the [[Legacy:StatLog|StatLog]] class; ngStats and CSHP/UTPure do that, for instance.  Logs created by [[Legacy:StatLog|StatLog]] are encoded in [http://www.unicode.org Unicode].

If you're looking for system logs like UnrealTournament.log, Editor.log or Server.log, check the System directory instead.

===Maps ===

Maps (or levels) are the geometric structure of the space where the action will take place.

The maps are formed of solid and non-solid areas computed with the technique of [[Legacy:BSP Tree|BSP Tree]].

[[Legacy:Actor|Actor]]s evaluate and interact in this theoretical space.

===Music ===

In this directory you'll find files for background music. In pre-UT2003 versions, these are ''.UMX'' tracker files, in later versions, OGG files.

You can easily manage and import new soundtracks via the [[Legacy:Music Browser|music browser]] in unrealed.

[http://www.winamp.com WinAmp] and most other decent players can be used to play these files.  You can use ''.mod'', ''.IT'', ''.xm'', or ''.s3m'' files and convert them to UMX via Unrealed.

There is no support of the ''MP3'' format in UT and earlier games (except [[Legacy:Wheel Of Time|Wheel Of Time]]).

There's a great Tracker (music editor) called [[Legacy:ModPlug Tracker|ModPlug Tracker]] which natively supports the opening of ''UMX'' files.  It will not, however, save out ''UMX'' files, they will still have to be converted in UnrealED.

The [[Legacy:Music|Music]] page has more details on how to import and export music files.

The other major tracking programs are [http://www.relaypoint.net/~emillan/ft2/ Fast Tracker] and [http://www.noisemusic.org/it Impulse Tracker].  However, these are DOS programs and I wouldn't particularly recommend Impulse Tracker for beginner trackers.

===System ===

This directory is where the major functionality of the Unreal engine is kept.  The launchers for the game and [[Legacy:UnrealEd|UnrealEd]] (of file type .exe, for computers running a version of Windows) are both found in this folder.  Other filetypes include:
; .dll :  Packages containing native C++ code.
; .u :  These are where most of the script for the different classes is kept.  It is also where various meshes, sounds, and textures that have direct connections to these scripts are kept.
; .int :  These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition (and that's the origin of the file extension .int for &quot;international&quot; as well), they are used for language localization. See [[Legacy:INT File|INT File]] for more information.
; .ini :  These files are used to store information about how the game and its mods are configured. While they can sometimes be edited manually by users, it is usually best to edit the configurations settings directly through the game or the editor.  (However, there may occasionally be a time when this is not possible.  In such a case, this option is always open.) See also [[Legacy:Game Ini File|game ini file]].
; .bmp :  If these files have names beginning with &quot;Shot&quot; and then followed by a four-digit number, then this is a screenshot taken from within the game and saved by the engine as a Bitmap image file.  Once a screenshot has been taken, it is converted to this format by the engine and then ignored, except to prevent the engine from creating files with conflicting names.

===Sounds and Textures ===

These two directories contain exactly the types of resources that they sound like they contain.  Sounds are most often saved into ''.uax'' files and put into the Sounds directory, where Textures are usually imported into ''.utx'' files and saved into the Textures directory.

==Notes ==

'''Don't use blanks or periods in package names.'''  The engine gets confused by this.  (Periods, for instance, are used as the separator character between package and object names.)

While the convention for separating resources is used by the game's own code, it is not always necessary to organize resources in this way.  For any package that UnrealEd can be used to create (''.u'', ''.umx'', ''.uax'', ''.utx'', or ''.unr''), any different type of resource can be stored in this package.  The engine will only fail to locate a resource if its package is in the wrong location for its filetype.  So the Unreal engine cannot see a .uax file if it is in the Music folder, for example.  On the other hand, if ordinary sounds were stored in a .umx file located in the Music folder, then these sounds could be found by the engine.  You can add or alter the ''Paths'' settings in UnrealTournament.ini to modify that behavior. 

Because of this degree of modularity, it must be understood that, ignoring the file extension, '''two packages cannot possess the same name'''.  For example, there cannot be both a MyPackage.u and a MyPackage.utx, because the engine will only be able to see one or the other of these packages, depending on which one it finds first.  In this case, it will probably find the .u file first, since the [[Legacy:Game Ini File|game ini file]] is set up to look in the System folder before the Textures folder. 

==Related Topics ==
* [[Legacy:File Format|File Format]] has a list of all file types used by the Unreal engine
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Game Ini File|game ini file]]</text>
    </revision>
    <revision>
      <id>33814</id>
      <timestamp>2008-12-29T08:17:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/RacelAcelg|RacelAcelg]] ([[User talk:RacelAcelg|Talk]]); changed back to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">All [[Legacy:Unreal Engine|unreal engine]] games, of all [[Legacy:Unreal Engine Versions|Unreal Engine versions]] use the same directory structure.

If you want to edit the game, it is important to know this structure and how it is used by the engine to store things.

''See also the [[:Category:Legacy Basic Procedure]] page on this, [[Legacy:Set Up Package Folders|Set Up Package Folders]].''

==The Unreal base directory ==

This directory is where the game itself is installed. By default, it's called '''C:\{game name}''', eg '''C:\UnrealTournament''', '''C:\WheelOfTime''' etc. Throughout the Unreal Wiki, you'll see it referred to as {[[Legacy:Base Directory|Base Directory]]}.

Within this, there are several subdirectories. The most important is /system, which contains the actual applications that run the game, [[Legacy:UnrealEd|UnrealEd]], [[Legacy:Ucc|Ucc]], etc. Most other subdirectories contain different kinds of [[Legacy:Package|package]].

===Logs ===

This directory contains logs created using the [[Legacy:StatLog|StatLog]] class; ngStats and CSHP/UTPure do that, for instance.  Logs created by [[Legacy:StatLog|StatLog]] are encoded in [http://www.unicode.org Unicode].

If you're looking for system logs like UnrealTournament.log, Editor.log or Server.log, check the System directory instead.

===Maps ===

Maps (or levels) are the geometric structure of the space where the action will take place.

The maps are formed of solid and non-solid areas computed with the technique of [[Legacy:BSP Tree|BSP Tree]].

[[Legacy:Actor|Actor]]s evaluate and interact in this theoretical space.

===Music ===

In this directory you'll find files for background music. In pre-UT2003 versions, these are ''.UMX'' tracker files, in later versions, OGG files.

You can easily manage and import new soundtracks via the [[Legacy:Music Browser|music browser]] in unrealed.

[http://www.winamp.com WinAmp] and most other decent players can be used to play these files.  You can use ''.mod'', ''.IT'', ''.xm'', or ''.s3m'' files and convert them to UMX via Unrealed.

There is no support of the ''MP3'' format in UT and earlier games (except [[Legacy:Wheel Of Time|Wheel Of Time]]).

There's a great Tracker (music editor) called [[Legacy:ModPlug Tracker|ModPlug Tracker]] which natively supports the opening of ''UMX'' files.  It will not, however, save out ''UMX'' files, they will still have to be converted in UnrealED.

The [[Legacy:Music|Music]] page has more details on how to import and export music files.

The other major tracking programs are [http://www.relaypoint.net/~emillan/ft2/ Fast Tracker] and [http://www.noisemusic.org/it Impulse Tracker].  However, these are DOS programs and I wouldn't particularly recommend Impulse Tracker for beginner trackers.

===System ===

This directory is where the major functionality of the Unreal engine is kept.  The launchers for the game and [[Legacy:UnrealEd|UnrealEd]] (of file type .exe, for computers running a version of Windows) are both found in this folder.  Other filetypes include:
; .dll :  Packages containing native C++ code.
; .u :  These are where most of the script for the different classes is kept.  It is also where various meshes, sounds, and textures that have direct connections to these scripts are kept.
; .int :  These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition (and that's the origin of the file extension .int for &quot;international&quot; as well), they are used for language localization. See [[Legacy:INT File|INT File]] for more information.
; .ini :  These files are used to store information about how the game and its mods are configured. While they can sometimes be edited manually by users, it is usually best to edit the configurations settings directly through the game or the editor.  (However, there may occasionally be a time when this is not possible.  In such a case, this option is always open.) See also [[Legacy:Game Ini File|game ini file]].
; .bmp :  If these files have names beginning with &quot;Shot&quot; and then followed by a four-digit number, then this is a screenshot taken from within the game and saved by the engine as a Bitmap image file.  Once a screenshot has been taken, it is converted to this format by the engine and then ignored, except to prevent the engine from creating files with conflicting names.

===Sounds and Textures ===

These two directories contain exactly the types of resources that they sound like they contain.  Sounds are most often saved into ''.uax'' files and put into the Sounds directory, where Textures are usually imported into ''.utx'' files and saved into the Textures directory.

==Notes ==

'''Don't use blanks or periods in package names.'''  The engine gets confused by this.  (Periods, for instance, are used as the separator character between package and object names.)

While the convention for separating resources is used by the game's own code, it is not always necessary to organize resources in this way.  For any package that UnrealEd can be used to create (''.u'', ''.umx'', ''.uax'', ''.utx'', or ''.unr''), any different type of resource can be stored in this package.  The engine will only fail to locate a resource if its package is in the wrong location for its filetype.  So the Unreal engine cannot see a .uax file if it is in the Music folder, for example.  On the other hand, if ordinary sounds were stored in a .umx file located in the Music folder, then these sounds could be found by the engine.  You can add or alter the ''Paths'' settings in UnrealTournament.ini to modify that behavior. 

Because of this degree of modularity, it must be understood that, ignoring the file extension, '''two packages cannot possess the same name'''.  For example, there cannot be both a MyPackage.u and a MyPackage.utx, because the engine will only be able to see one or the other of these packages, depending on which one it finds first.  In this case, it will probably find the .u file first, since the [[Legacy:Game Ini File|game ini file]] is set up to look in the System folder before the Textures folder. 

==Related Topics ==
* [[Legacy:File Format|File Format]] has a list of all file types used by the Unreal engine
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Game Ini File|game ini file]]</text>
    </revision>
    <revision>
      <id>34460</id>
      <timestamp>2009-06-01T05:59:09Z</timestamp>
      <contributor>
        <username>Mestinkbad</username>
        <id>1960</id>
      </contributor>
      <text xml:space="preserve">All [[Legacy:Unreal Engine|unreal engine]] games, of all [[Legacy:Unreal Engine Versions|Unreal Engine versions]] use the same directory structure.

If you want to edit the game, it is important to know this structure and how it is used by the engine to store things.

''See also the [[:Category:Legacy Basic Procedure]] page on this, [[Legacy:Set Up Package Folders|Set Up Package Folders]].''

==The Unreal base directory ==

This directory is where the game itself is installed. By default, it's called '''C:\{game name}''', eg '''C:\UnrealTournament''', '''C:\WheelOfTime''' etc. Throughout the Unreal Wiki, you'll see it referred to as {[[Legacy:Base Directory|Base Directory]]}.

Within this, there are several subdirectories. The most important is /system, which contains the actual applications that run the game, [[Legacy:UnrealEd|UnrealEd]], [[Legacy:Ucc|Ucc]], etc. Most other subdirectories contain different kinds of [[Legacy:Package|package]].

===Logs ===

This directory contains logs created using the [[Legacy:StatLog|StatLog]] class; ngStats and CSHP/UTPure do that, for instance.  Logs created by [[Legacy:StatLog|StatLog]] are encoded in [http://www.unicode.org Unicode].

If you're looking for system logs like UnrealTournament.log, Editor.log or Server.log, check the System directory instead.

===Maps ===

Maps (or levels) are the geometric structure of the space where the action will take place.

The maps are formed of solid and non-solid areas computed with the technique of [[Legacy:BSP Tree|BSP Tree]].

[[Legacy:Actor|Actor]]s evaluate and interact in this theoretical space.

===Music ===

In this directory you'll find files for background music. In pre-UT2003 versions, these are ''.UMX'' tracker files, in later versions, OGG files.

You can easily manage and import new soundtracks via the [[Legacy:Music Browser|music browser]] in unrealed.

[http://www.winamp.com WinAmp] and most other decent players can be used to play these files.  You can use ''.mod'', ''.IT'', ''.xm'', or ''.s3m'' files and convert them to UMX via Unrealed.

There is no support of the ''MP3'' format in UT and earlier games (except [[Legacy:Wheel Of Time|Wheel Of Time]]).

There's a great Tracker (music editor) called [[Legacy:ModPlug Tracker|ModPlug Tracker]] which natively supports the opening of ''UMX'' files.  It will not, however, save out ''UMX'' files, they will still have to be converted in UnrealED.

The [[Legacy:Music|Music]] page has more details on how to import and export music files.

The other major tracking programs are [http://www.relaypoint.net/~emillan/ft2/ Fast Tracker] and [http://www.noisemusic.org/it Impulse Tracker].  However, these are DOS programs and I wouldn't particularly recommend Impulse Tracker for beginner trackers.

===System ===

This directory is where the major functionality of the Unreal engine is kept.  The launchers for the game and [[Legacy:UnrealEd|UnrealEd]] (of file type .exe, for computers running a version of Windows) are both found in this folder.  Other filetypes include:
; .dll :  Compiled binaries of machine specific code, specific to the Windows operating system. 
; .u :  These are where most of the script for the different classes is kept.  It is also where various meshes, sounds, and textures that have direct connections to these scripts are kept.
; .int :  These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition (and that's the origin of the file extension .int for &quot;international&quot; as well), they are used for language localization. See [[Legacy:INT File|INT File]] for more information.
; .ini :  These files are used to store information about how the game and its mods are configured. While they can sometimes be edited manually by users, it is usually best to edit the configurations settings directly through the game or the editor.  (However, there may occasionally be a time when this is not possible.  In such a case, this option is always open.) See also [[Legacy:Game Ini File|game ini file]].
; .bmp :  If these files have names beginning with &quot;Shot&quot; and then followed by a four-digit number, then this is a screenshot taken from within the game and saved by the engine as a Bitmap image file.  Once a screenshot has been taken, it is converted to this format by the engine and then ignored, except to prevent the engine from creating files with conflicting names. Specific to the Windows operating system. 

===Sounds and Textures ===

These two directories contain exactly the types of resources that they sound like they contain.  Sounds are most often saved into ''.uax'' files and put into the Sounds directory, where Textures are usually imported into ''.utx'' files and saved into the Textures directory.

==Notes ==

'''Don't use blanks or periods in package names.'''  The engine gets confused by this.  (Periods, for instance, are used as the separator character between package and object names.)

While the convention for separating resources is used by the game's own code, it is not always necessary to organize resources in this way.  For any package that UnrealEd can be used to create (''.u'', ''.umx'', ''.uax'', ''.utx'', or ''.unr''), any different type of resource can be stored in this package.  The engine will only fail to locate a resource if its package is in the wrong location for its filetype.  So the Unreal engine cannot see a .uax file if it is in the Music folder, for example.  On the other hand, if ordinary sounds were stored in a .umx file located in the Music folder, then these sounds could be found by the engine.  You can add or alter the ''Paths'' settings in UnrealTournament.ini to modify that behavior. 

Because of this degree of modularity, it must be understood that, ignoring the file extension, '''two packages cannot possess the same name'''.  For example, there cannot be both a MyPackage.u and a MyPackage.utx, because the engine will only be able to see one or the other of these packages, depending on which one it finds first.  In this case, it will probably find the .u file first, since the [[Legacy:Game Ini File|game ini file]] is set up to look in the System folder before the Textures folder. 

==Related Topics ==
* [[Legacy:File Format|File Format]] has a list of all file types used by the Unreal engine
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Game Ini File|game ini file]]</text>
    </revision>
    <revision>
      <id>43144</id>
      <timestamp>2010-04-29T22:47:15Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{legacy page|new=[[Engine Directory Structure]]}}
All [[Legacy:Unreal Engine|unreal engine]] games, of all [[Legacy:Unreal Engine Versions|Unreal Engine versions]] use the same directory structure.

If you want to edit the game, it is important to know this structure and how it is used by the engine to store things.

''See also the [[:Category:Legacy Basic Procedure]] page on this, [[Legacy:Set Up Package Folders|Set Up Package Folders]].''

==The Unreal base directory ==

This directory is where the game itself is installed. By default, it's called '''C:\{game name}''', eg '''C:\UnrealTournament''', '''C:\WheelOfTime''' etc. Throughout the Unreal Wiki, you'll see it referred to as {[[Legacy:Base Directory|Base Directory]]}.

Within this, there are several subdirectories. The most important is /system, which contains the actual applications that run the game, [[Legacy:UnrealEd|UnrealEd]], [[Legacy:Ucc|Ucc]], etc. Most other subdirectories contain different kinds of [[Legacy:Package|package]].

===Logs ===

This directory contains logs created using the [[Legacy:StatLog|StatLog]] class; ngStats and CSHP/UTPure do that, for instance.  Logs created by [[Legacy:StatLog|StatLog]] are encoded in [http://www.unicode.org Unicode].

If you're looking for system logs like UnrealTournament.log, Editor.log or Server.log, check the System directory instead.

===Maps ===

Maps (or levels) are the geometric structure of the space where the action will take place.

The maps are formed of solid and non-solid areas computed with the technique of [[Legacy:BSP Tree|BSP Tree]].

[[Legacy:Actor|Actor]]s evaluate and interact in this theoretical space.

===Music ===

In this directory you'll find files for background music. In pre-UT2003 versions, these are ''.UMX'' tracker files, in later versions, OGG files.

You can easily manage and import new soundtracks via the [[Legacy:Music Browser|music browser]] in unrealed.

[http://www.winamp.com WinAmp] and most other decent players can be used to play these files.  You can use ''.mod'', ''.IT'', ''.xm'', or ''.s3m'' files and convert them to UMX via Unrealed.

There is no support of the ''MP3'' format in UT and earlier games (except [[Legacy:Wheel Of Time|Wheel Of Time]]).

There's a great Tracker (music editor) called [[Legacy:ModPlug Tracker|ModPlug Tracker]] which natively supports the opening of ''UMX'' files.  It will not, however, save out ''UMX'' files, they will still have to be converted in UnrealED.

The [[Legacy:Music|Music]] page has more details on how to import and export music files.

The other major tracking programs are [http://www.relaypoint.net/~emillan/ft2/ Fast Tracker] and [http://www.noisemusic.org/it Impulse Tracker].  However, these are DOS programs and I wouldn't particularly recommend Impulse Tracker for beginner trackers.

===System ===

This directory is where the major functionality of the Unreal engine is kept.  The launchers for the game and [[Legacy:UnrealEd|UnrealEd]] (of file type .exe, for computers running a version of Windows) are both found in this folder.  Other filetypes include:
; .dll :  Compiled binaries of machine specific code, specific to the Windows operating system. 
; .u :  These are where most of the script for the different classes is kept.  It is also where various meshes, sounds, and textures that have direct connections to these scripts are kept.
; .int :  These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition (and that's the origin of the file extension .int for &quot;international&quot; as well), they are used for language localization. See [[Legacy:INT File|INT File]] for more information.
; .ini :  These files are used to store information about how the game and its mods are configured. While they can sometimes be edited manually by users, it is usually best to edit the configurations settings directly through the game or the editor.  (However, there may occasionally be a time when this is not possible.  In such a case, this option is always open.) See also [[Legacy:Game Ini File|game ini file]].
; .bmp :  If these files have names beginning with &quot;Shot&quot; and then followed by a four-digit number, then this is a screenshot taken from within the game and saved by the engine as a Bitmap image file.  Once a screenshot has been taken, it is converted to this format by the engine and then ignored, except to prevent the engine from creating files with conflicting names. Specific to the Windows operating system. 

===Sounds and Textures ===

These two directories contain exactly the types of resources that they sound like they contain.  Sounds are most often saved into ''.uax'' files and put into the Sounds directory, where Textures are usually imported into ''.utx'' files and saved into the Textures directory.

==Notes ==

'''Don't use blanks or periods in package names.'''  The engine gets confused by this.  (Periods, for instance, are used as the separator character between package and object names.)

While the convention for separating resources is used by the game's own code, it is not always necessary to organize resources in this way.  For any package that UnrealEd can be used to create (''.u'', ''.umx'', ''.uax'', ''.utx'', or ''.unr''), any different type of resource can be stored in this package.  The engine will only fail to locate a resource if its package is in the wrong location for its filetype.  So the Unreal engine cannot see a .uax file if it is in the Music folder, for example.  On the other hand, if ordinary sounds were stored in a .umx file located in the Music folder, then these sounds could be found by the engine.  You can add or alter the ''Paths'' settings in UnrealTournament.ini to modify that behavior. 

Because of this degree of modularity, it must be understood that, ignoring the file extension, '''two packages cannot possess the same name'''.  For example, there cannot be both a MyPackage.u and a MyPackage.utx, because the engine will only be able to see one or the other of these packages, depending on which one it finds first.  In this case, it will probably find the .u file first, since the [[Legacy:Game Ini File|game ini file]] is set up to look in the System folder before the Textures folder. 

==Related Topics ==
* [[Legacy:File Format|File Format]] has a list of all file types used by the Unreal engine
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Game Ini File|game ini file]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems</title>
    <id>1097</id>
    <revision>
      <id>2899</id>
      <timestamp>2007-11-19T13:54:46Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

Created by: [[Legacy:Wormbo|Wormbo]]

The EnhancedItems package can be used to create mods with interesting features:
* firing speed of weapons can easily be changed by inventory items
* death and suicide messages based on the weapon or projectile that caused the death
* multiple pickups spawning at the same location (similar to the method used by Chaos UT)
* some fixes and new features for the UWindow system like auto-size for combo boxes and the ability of creating complex pulldown menus (these are also available as [[Legacy:Open Source|Open Source]] scripts)
* an enhanced player icon (EIChallengeHUD package)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/INT Files|extended INT file definitions]] (can also be used by non-EnhancedItems mods)
* many more...

==Downloads==

'''Note:''' Like the [[Legacy:UnrealScript Source|UnrealScript Source]] downloads for UT200x, the EnhancedItems source should only be used as a reference.

'''Do not recompile the EnhancedItems, EIChallengeHUD or MIConverter packages!'''
* [http://www.koehler-homepage.de/Wormbo/download/UT/EnhancedItemsSource.zip EnhancedItems packages and source code]
* [http://www.koehler-homepage.de/Wormbo/download/UT/EIClassReference.rar EIClassReference.rar] &amp;ndash; [[Legacy:UnCodeX|UnCodeX]] output of the EnhancedItems and [[Legacy:EWindow|EWindow]] classes

EnhancedItems is currently used in ''Rockets UT'', ''Arena Match'', ''BUF Bonus Pack'', ''Quake 3 Tournament'', the ''Enhanced Items Mod'', ''Who Pushed Me?'' and various smaller mutators.&lt;br /&gt;There will be no EnhancedItems package for Unreal Tournament 200x.

==Class Overview==

Also see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Hierarchy]] for the full class tree of all EnhancedItems classes.

===Package: EnhancedItems===

====[[Legacy:Actor (UT)|Actor (UT)]] subclasses:====

{{classbox|[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]]&lt;br /&gt;[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]&lt;br /&gt;[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]&lt;br /&gt;[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]}}

These are used for visual effects. If an effects causes damage it can also use the new death messages.

{{classbox|[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:DMMutator|DMMutator]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]]}}

''EnhancedMutator'' subclasses class can easily create and modify ''MultiPickupPlus'' actors. They can also replace the DMMutator (UT's BaseMutator for most gametypes) with ''EIDMMutator'', a configurable version of [[Legacy:DMMutator|DMMutator]]. The mutator can then choose, which Unreal weapons and items should be replaced by their UT counterparts.

''EnhancedArena'' can be used to create [[Legacy:Arena|Arena]] mutators that keep the [[Legacy:Translocator|Translocator]] and have some other small enhancements.

''EIDeathMessageMutator'' and ''MIConverter'' are utility classes that are spawned automatically by EnhancedMutators. The ''EIDeathMessageMutator'' handles the extended death message support in EnhancedItems-based mods, while the ''MIConverter'' converts Chaos UT MultiItems to MultiPickupPlus actors.

{{classbox|[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]]}}

The ''MultiPickupPlus'' is a nice tool for coders as well as mappers. If placed on the map it can spawn a random item from a given list. Once that item is picked up the MPP spawns another (probably the same) item from the list.

See [[Legacy:MultiPickupBase|MultiPickupBase]] for a UT2003 version of this actor.

{{classbox|[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]&lt;br /&gt;[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]]&lt;br /&gt;[[Legacy:Projectile (UT)|Projectile (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]}}

''EnhancedProjectile''s can display death messages indepentantly from the weapon the player used or currently holds.

''EnhancedWeapon''s allow HUD mutators and ''PickupPlus'' items to draw on the [[Legacy:Canvas|Canvas]] right before or after the &lt;tt&gt;RenderOverlays&lt;/tt&gt; function is executed. This function is called before the HUD mutators' &lt;tt&gt;PostRender&lt;/tt&gt; function.

The firing speed of an ''EnhancedWeapon'' can be changed easily from the ''PickupPlus'' class.

{{classbox|[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]&lt;br /&gt;[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HoldablePowerup]]&lt;br /&gt;[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TimedPowerup]]}}

The ''PickupPlus'' class and it's subclasses can be used to create complex items that can interact with each other and with ''EnhancedWeapon''s. The effects of multiple ''PickupPlus'' items can stack, i.e. if two items want to increase the player's speed or want to be the &lt;tt&gt;Affector&lt;/tt&gt; of the player's weapon they don't have to access those values directly. Instead they call special functions (in this case &lt;tt&gt;SetOwnerSpeed()&lt;/tt&gt; or &lt;tt&gt;RegisterAsAffector(&lt;i&gt;Weapon&lt;/i&gt;)&lt;/tt&gt;) and the ''PickupPlus'' code applies the changes, respecting the changes made by the other item.

====[[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:UWindowBase|UWindowBase]] subclasses:====

{{classbox|[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]] &gt;&gt; EWindowDialogClientWindow&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]] &gt;&gt; [[Legacy:UWindowPageWindow|UWindowPageWindow]] &gt;&gt; [[Legacy:UMenuPageWindow|UMenuPageWindow]] &gt;&gt; EWindowPageWindow&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowCheckbox|UWindowCheckbox]] &gt;&gt; EWindowCheckbox&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowComboControl|UWindowComboControl]] &gt;&gt; EWindowComboControl&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowEditControl|UWindowEditControl]] &gt;&gt; EWindowEditControl&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EWindowPulldownMenu&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt;[[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EWindowPulldownMenu &gt;&gt; EWindowRightClickMenu&lt;br /&gt;[[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]] &gt;&gt; EWindowPulldownMenuItem}}

Various improvements for the UWindow system. The editbox, combobox and checkbox controls allow automatic resizing. The dialog client window displays help texts of its controls by default. The pull-down/pop-up menus allow any number of submenus.

===Package: EIChallengeHUD===

{{classbox|[[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; EIChallengeHUD &gt;&gt; CustomHUDIcon}}

The ''CustomHUDIcon'' class is used by the enhanced player status icon HUD mutator (''EIChallengeHUD'') to customize the appearance of the status icon in non-standard game types.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
* [[Legacy:EWindow|EWindow]] &amp;ndash; a precompiled package with all kinds of UWindow enhancements including new radioboxes
* [[Legacy:MultiPickupBase|MultiPickupBase]] &amp;ndash; the UT2003 version of the MultiPickupPlus class

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2900</id>
      <timestamp>2005-12-10T13:33:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed download links</comment>
      <text xml:space="preserve">==Overview==

Created by: [[Legacy:Wormbo|Wormbo]]

The EnhancedItems package can be used to create mods with interesting features:
* firing speed of weapons can easily be changed by inventory items
* death and suicide messages based on the weapon or projectile that caused the death
* multiple pickups spawning at the same location (similar to the method used by Chaos UT)
* some fixes and new features for the UWindow system like auto-size for combo boxes and the ability of creating complex pulldown menus (these are also available as [[Legacy:Open Source|Open Source]] scripts)
* an enhanced player icon (EIChallengeHUD package)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/INT Files|extended INT file definitions]] (can also be used by non-EnhancedItems mods)
* many more...

==Downloads==

'''Note:''' Like the [[Legacy:UnrealScript Source|UnrealScript Source]] downloads for UT200x, the EnhancedItems source should only be used as a reference.

'''Do not recompile the EnhancedItems, EIChallengeHUD or MIConverter packages!'''
* [http://www.koehler-homepage.de/Wormbo/download/UT/EnhancedItemsSource.zip EnhancedItems packages and source code]
* [http://www.koehler-homepage.de/Wormbo/download/UT/EIClassReference.rar EIClassReference.rar] &amp;ndash; [[Legacy:UnCodeX|UnCodeX]] output of the EnhancedItems and [[Legacy:EWindow|EWindow]] classes

EnhancedItems is currently used in ''Rockets UT'', ''Arena Match'', ''BUF Bonus Pack'', ''Quake 3 Tournament'', the ''Enhanced Items Mod'', ''Who Pushed Me?'' and various smaller mutators.&lt;br /&gt;There will be no EnhancedItems package for Unreal Tournament 200x.

==Class Overview==

Also see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Class Hierarchy]] for the full class tree of all EnhancedItems classes.

===Package: EnhancedItems===

====[[Legacy:Actor (UT)|Actor (UT)]] subclasses:====

{{classbox|[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]]&lt;br /&gt;[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]&lt;br /&gt;[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]&lt;br /&gt;[[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]}}

These are used for visual effects. If an effects causes damage it can also use the new death messages.

{{classbox|[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:DMMutator|DMMutator]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]]&lt;br /&gt;[[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]]}}

''EnhancedMutator'' subclasses class can easily create and modify ''MultiPickupPlus'' actors. They can also replace the DMMutator (UT's BaseMutator for most gametypes) with ''EIDMMutator'', a configurable version of [[Legacy:DMMutator|DMMutator]]. The mutator can then choose, which Unreal weapons and items should be replaced by their UT counterparts.

''EnhancedArena'' can be used to create [[Legacy:Arena|Arena]] mutators that keep the [[Legacy:Translocator|Translocator]] and have some other small enhancements.

''EIDeathMessageMutator'' and ''MIConverter'' are utility classes that are spawned automatically by EnhancedMutators. The ''EIDeathMessageMutator'' handles the extended death message support in EnhancedItems-based mods, while the ''MIConverter'' converts Chaos UT MultiItems to MultiPickupPlus actors.

{{classbox|[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]]}}

The ''MultiPickupPlus'' is a nice tool for coders as well as mappers. If placed on the map it can spawn a random item from a given list. Once that item is picked up the MPP spawns another (probably the same) item from the list.

See [[Legacy:MultiPickupBase|MultiPickupBase]] for a UT2003 version of this actor.

{{classbox|[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]&lt;br /&gt;[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]]&lt;br /&gt;[[Legacy:Projectile (UT)|Projectile (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]}}

''EnhancedProjectile''s can display death messages indepentantly from the weapon the player used or currently holds.

''EnhancedWeapon''s allow HUD mutators and ''PickupPlus'' items to draw on the [[Legacy:Canvas|Canvas]] right before or after the &lt;tt&gt;RenderOverlays&lt;/tt&gt; function is executed. This function is called before the HUD mutators' &lt;tt&gt;PostRender&lt;/tt&gt; function.

The firing speed of an ''EnhancedWeapon'' can be changed easily from the ''PickupPlus'' class.

{{classbox|[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]&lt;br /&gt;[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HoldablePowerup]]&lt;br /&gt;[[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TimedPowerup]]}}

The ''PickupPlus'' class and it's subclasses can be used to create complex items that can interact with each other and with ''EnhancedWeapon''s. The effects of multiple ''PickupPlus'' items can stack, i.e. if two items want to increase the player's speed or want to be the &lt;tt&gt;Affector&lt;/tt&gt; of the player's weapon they don't have to access those values directly. Instead they call special functions (in this case &lt;tt&gt;SetOwnerSpeed()&lt;/tt&gt; or &lt;tt&gt;RegisterAsAffector(&lt;i&gt;Weapon&lt;/i&gt;)&lt;/tt&gt;) and the ''PickupPlus'' code applies the changes, respecting the changes made by the other item.

====[[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:UWindowBase|UWindowBase]] subclasses:====

{{classbox|[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]] &gt;&gt; EWindowDialogClientWindow&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]] &gt;&gt; [[Legacy:UWindowPageWindow|UWindowPageWindow]] &gt;&gt; [[Legacy:UMenuPageWindow|UMenuPageWindow]] &gt;&gt; EWindowPageWindow&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowCheckbox|UWindowCheckbox]] &gt;&gt; EWindowCheckbox&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowComboControl|UWindowComboControl]] &gt;&gt; EWindowComboControl&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowEditControl|UWindowEditControl]] &gt;&gt; EWindowEditControl&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt; [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EWindowPulldownMenu&lt;br /&gt;[[Legacy:UWindowWindow|UWindowWindow]] &gt;&gt; [[Legacy:UWindowDialogControl|UWindowDialogControl]] &gt;&gt; [[Legacy:UWindowListControl|UWindowListControl]] &gt;&gt;[[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]] &gt;&gt; EWindowPulldownMenu &gt;&gt; EWindowRightClickMenu&lt;br /&gt;[[Legacy:UWindowList|UWindowList]] &gt;&gt; [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]] &gt;&gt; EWindowPulldownMenuItem}}

Various improvements for the UWindow system. The editbox, combobox and checkbox controls allow automatic resizing. The dialog client window displays help texts of its controls by default. The pull-down/pop-up menus allow any number of submenus.

===Package: EIChallengeHUD===

{{classbox|[[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; EIChallengeHUD &gt;&gt; CustomHUDIcon}}

The ''CustomHUDIcon'' class is used by the enhanced player status icon HUD mutator (''EIChallengeHUD'') to customize the appearance of the status icon in non-standard game types.

==Related Topics==
* [[Legacy:Open Source|Open Source]]
* [[Legacy:EWindow|EWindow]] &amp;ndash; a precompiled package with all kinds of UWindow enhancements including new radioboxes
* [[Legacy:MultiPickupBase|MultiPickupBase]] &amp;ndash; the UT2003 version of the MultiPickupPlus class

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/Class Hierarchy</title>
    <id>1108</id>
    <revision>
      <id>2924</id>
      <timestamp>2004-12-22T15:59:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the full class tree of all classes in the [[Legacy:EnhancedItems|EnhancedItems]] package and their super classes. EnhancedItems classes are in '''bold''' font, EIChallengeHUD classes are ''italic''.

 [[Legacy:Object (UT)|Object (UT)]]
  +- [[Legacy:Actor (UT)|Actor (UT)]]
  |   +- [[Legacy:Effects (UT)|Effects (UT)]]
  |   |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]]'''
  |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]'''
  |   |           +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]'''
  |   |           +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]'''
  |   +- [[Legacy:Info (UT)|Info (UT)]]
  |   |   +- [[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
  |   |   |   +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
  |   |   |       +- [[Legacy:DeathMessagePlus|DeathMessagePlus]]
  |   |   |           +- '''EnhancedDeathMessage'''
  |   |   +- [[Legacy:Mutator (UT)|Mutator (UT)]]
  |   |       +- [[Legacy:Arena|Arena]]
  |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]]'''
  |   |       +- [[Legacy:DMMutator|DMMutator]]
  |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]]'''
  |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]'''
  |   |           +- ''EIChallengeHUD''
  |   |           |   +- ''CustomHUDIcon''
  |   |           |       +- ''DefaultHUDIcon''
  |   |           |       +- ''NoHUDIcon''
  |   |           +- '''EIDeathMessageMutator'''
  |   |           +- '''EIUseHoldable'''
  |   |           +- '''NoAlwaysAutoActivate'''
  |   |           +- [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]]
  |   +- [[Legacy:Inventory (UT)|Inventory (UT)]]
  |   |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]]'''
  |   |   +- [[Legacy:Pickup (UT)|Pickup (UT)]]
  |   |   |   +- [[Legacy:Ammo (UT)|Ammo (UT)]]
  |   |   |   |   +- [[Legacy:TournamentAmmo|TournamentAmmo]]
  |   |   |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]]'''
  |   |   |   +- [[Legacy:TournamentPickup|TournamentPickup]]
  |   |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]'''
  |   |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HoldablePowerup]]'''
  |   |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TimedPowerup]]'''
  |   |   |       +- [[Legacy:ThighPads|ThighPads]]
  |   |   |       |   +- '''ThighPadsDummy'''
  |   |   |       +- [[Legacy:UT_JumpBoots|UT_JumpBoots]]
  |   |   |       |   +- '''JumpBootsDummy'''
  |   |   |       +- [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
  |   |   |           +- '''ShieldBeltDummy'''
  |   |   +- [[Legacy:Weapon (UT)|Weapon (UT)]]
  |   |       +- [[Legacy:TournamentWeapon|TournamentWeapon]]
  |   |           +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]'''
  |   +- [[Legacy:Projectile (UT)|Projectile (UT)]]
  |   |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]'''
  |   +- [[Legacy:SpawnNotify|SpawnNotify]]
  |       +- '''EIDeathMessageSpawnNotify'''
  +- [[Legacy:UWindowBase|UWindowBase]]
      +- [[Legacy:UWindowList|UWindowList]]
      |   +- [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]]
      |       +- '''EWindowPulldownMenuItem'''
      +- [[Legacy:UWindowWindow|UWindowWindow]]
          +- [[Legacy:UWindowClientWindow|UWindowClientWindow]]
          |   +- [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]]
          |       +- '''EWindowDialogClientWindow'''
          |       +- [[Legacy:UWindowPageWindow|UWindowPageWindow]]
          |           +- [[Legacy:UMenuPageWindow|UMenuPageWindow]]
          |               +- '''EWindowPageWindow'''
          +- [[Legacy:UWindowDialogControl|UWindowDialogControl]]
              +- [[Legacy:UWindowButton|UWindowButton]]
              |   +- [[Legacy:UWindowCheckbox|UWindowCheckbox]]
              |       +- '''EWindowCheckbox'''
              +- [[Legacy:UWindowComboControl|UWindowComboControl]]
              |   +&amp;ndash; '''EWindowComboControl'''
              +- [[Legacy:UWindowEditControl|UWindowEditControl]]
              |   +- '''EWindowEditControl'''
              +- [[Legacy:UWindowListControl|UWindowListControl]]
                  +- [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]]
                      +- '''EWindowPulldownMenu'''
                          +- '''EWindowRightClickMenu'''

==Related Topics==
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]
* [[Legacy:EWindow/Class Hierarchy|EWindow/Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2925</id>
      <timestamp>2003-10-19T13:43:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the full class tree of all classes in the [[Legacy:EnhancedItems|EnhancedItems]] package and their super classes. EnhancedItems classes are in '''bold''' font, EIChallengeHUD classes are ''italic''.

 [[Legacy:Object (UT)|Object (UT)]]
  +- [[Legacy:Actor (UT)|Actor (UT)]]
  |   +- [[Legacy:Effects (UT)|Effects (UT)]]
  |   |   +- '''EIEffects'''
  |   |       +- '''PlayerShellEffect'''
  |   |           +- '''PlayerShell'''
  |   |           +- '''PlayerSphere'''
  |   +- [[Legacy:Info (UT)|Info (UT)]]
  |   |   +- [[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
  |   |   |   +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
  |   |   |       +- [[Legacy:DeathMessagePlus|DeathMessagePlus]]
  |   |   |           +- '''EnhancedDeathMessage'''
  |   |   +- [[Legacy:Mutator (UT)|Mutator (UT)]]
  |   |       +- [[Legacy:Arena|Arena]]
  |   |       |   +- '''EnhancedArena'''
  |   |       +- [[Legacy:DMMutator|DMMutator]]
  |   |       |   +- '''EIDMMutator'''
  |   |       +- '''EnhancedMutator'''
  |   |           +- ''EIChallengeHUD''
  |   |           |   +- ''CustomHUDIcon''
  |   |           |       +- ''DefaultHUDIcon''
  |   |           |       +- ''NoHUDIcon''
  |   |           +- '''EIDeathMessageMutator'''
  |   |           +- '''EIUseHoldable'''
  |   |           +- '''NoAlwaysAutoActivate'''
  |   +- [[Legacy:Inventory (UT)|Inventory (UT)]]
  |   |   +- '''MultiPickupPlus'''
  |   |   +- [[Legacy:Pickup (UT)|Pickup (UT)]]
  |   |   |   +- [[Legacy:Ammo (UT)|Ammo (UT)]]
  |   |   |   |   +- [[Legacy:TournamentAmmo|TournamentAmmo]]
  |   |   |   |       +- '''EnhancedAmmo'''
  |   |   |   +- [[Legacy:TournamentPickup|TournamentPickup]]
  |   |   |       +- '''PickupPlus'''
  |   |   |       |   +- '''HoldablePowerup'''
  |   |   |       |   +- '''TimedPowerup'''
  |   |   |       +- [[Legacy:ThighPads|ThighPads]]
  |   |   |       |   +- '''ThighPadsDummy'''
  |   |   |       +- [[Legacy:UT_JumpBoots|UT_JumpBoots]]
  |   |   |       |   +- '''JumpBootsDummy'''
  |   |   |       +- [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
  |   |   |           +- '''ShieldBeltDummy'''
  |   |   +- [[Legacy:Weapon (UT)|Weapon (UT)]]
  |   |       +- [[Legacy:TournamentWeapon|TournamentWeapon]]
  |   |           +- '''EnhancedWeapon'''
  |   +- [[Legacy:Projectile (UT)|Projectile (UT)]]
  |   |   +- '''EnhancedProjectile'''
  |   +- [[Legacy:SpawnNotify|SpawnNotify]]
  |       +- '''EIDeathMessageSpawnNotify'''
  +- [[Legacy:UWindowBase|UWindowBase]]
      +- [[Legacy:UWindowList|UWindowList]]
      |   +- [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]]
      |       +- '''EWindowPulldownMenuItem'''
      +- [[Legacy:UWindowWindow|UWindowWindow]]
          +- [[Legacy:UWindowClientWindow|UWindowClientWindow]]
          |   +- [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]]
          |       +- '''EWindowDialogClientWindow'''
          |       +- [[Legacy:UWindowPageWindow|UWindowPageWindow]]
          |           +- [[Legacy:UMenuPageWindow|UMenuPageWindow]]
          |               +- '''EWindowPageWindow'''
          +- [[Legacy:UWindowDialogControl|UWindowDialogControl]]
              +- [[Legacy:UWindowButton|UWindowButton]]
              |   +- [[Legacy:UWindowCheckbox|UWindowCheckbox]]
              |       +- '''EWindowCheckbox'''
              +- [[Legacy:UWindowComboControl|UWindowComboControl]]
              |   +&amp;ndash; '''EWindowComboControl'''
              +- [[Legacy:UWindowEditControl|UWindowEditControl]]
              |   +- '''EWindowEditControl'''
              +- [[Legacy:UWindowListControl|UWindowListControl]]
                  +- [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]]
                      +- '''EWindowPulldownMenu'''
                          +- '''EWindowRightClickMenu'''

==Related Topics==
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]
* [[Legacy:EWindow/Class Hierarchy|EWindow/Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40161</id>
      <timestamp>2009-11-17T10:18:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>formatting fixes</comment>
      <text xml:space="preserve">This is the full class tree of all classes in the [[Legacy:EnhancedItems|EnhancedItems]] package and their super classes. EnhancedItems classes are in '''bold''' font, EIChallengeHUD classes are ''italic''.

 [[Legacy:Object (UT)|Object]]
  +- [[Legacy:Actor (UT)|Actor]]
  |   +- [[Legacy:Effects (UT)|Effects]]
  |   |   +- '''[[Legacy:EnhancedItems/EIEffects|EIEffects]]'''
  |   |       +- '''[[Legacy:EnhancedItems/PlayerShellEffect|PlayerShellEffect]]'''
  |   |           +- '''[[Legacy:EnhancedItems/PlayerShell|PlayerShell]]'''
  |   |           +- '''[[Legacy:EnhancedItems/PlayerSphere|PlayerSphere]]'''
  |   +- [[Legacy:Info (UT)|Info]]
  |   |   +- [[Legacy:LocalMessage (UT)|LocalMessage]]
  |   |   |   +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
  |   |   |       +- [[Legacy:DeathMessagePlus|DeathMessagePlus]]
  |   |   |           +- '''EnhancedDeathMessage'''
  |   |   +- [[Legacy:Mutator (UT)|Mutator]]
  |   |       +- [[Legacy:Arena|Arena]]
  |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena|EnhancedArena]]'''
  |   |       +- [[Legacy:DMMutator|DMMutator]]
  |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator|EIDMMutator]]'''
  |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator|EnhancedMutator]]'''
  |   |           +- ''EIChallengeHUD''
  |   |           |   +- ''CustomHUDIcon''
  |   |           |       +- ''DefaultHUDIcon''
  |   |           |       +- ''NoHUDIcon''
  |   |           +- '''EIDeathMessageMutator'''
  |   |           +- '''EIUseHoldable'''
  |   |           +- '''NoAlwaysAutoActivate'''
  |   |           +- [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter|MIConverter]]
  |   +- [[Legacy:Inventory (UT)|Inventory (UT)]]
  |   |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus|MultiPickupPlus]]'''
  |   |   +- [[Legacy:Pickup (UT)|Pickup]]
  |   |   |   +- [[Legacy:Ammo (UT)|Ammo]]
  |   |   |   |   +- [[Legacy:TournamentAmmo|TournamentAmmo]]
  |   |   |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo|EnhancedAmmo]]'''
  |   |   |   +- [[Legacy:TournamentPickup|TournamentPickup]]
  |   |   |       +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus|PickupPlus]]'''
  |   |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HoldablePowerup|HoldablePowerup]]'''
  |   |   |       |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TimedPowerup|TimedPowerup]]'''
  |   |   |       +- [[Legacy:ThighPads|ThighPads]]
  |   |   |       |   +- '''ThighPadsDummy'''
  |   |   |       +- [[Legacy:UT_JumpBoots|UT_JumpBoots]]
  |   |   |       |   +- '''JumpBootsDummy'''
  |   |   |       +- [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]
  |   |   |           +- '''ShieldBeltDummy'''
  |   |   +- [[Legacy:Weapon (UT)|Weapon (UT)]]
  |   |       +- [[Legacy:TournamentWeapon|TournamentWeapon]]
  |   |           +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon|EnhancedWeapon]]'''
  |   +- [[Legacy:Projectile (UT)|Projectile]]
  |   |   +- '''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile|EnhancedProjectile]]'''
  |   +- [[Legacy:SpawnNotify|SpawnNotify]]
  |       +- '''EIDeathMessageSpawnNotify'''
  +- [[Legacy:UWindowBase|UWindowBase]]
      +- [[Legacy:UWindowList|UWindowList]]
      |   +- [[Legacy:UWindowPulldownMenuItem|UWindowPulldownMenuItem]]
      |       +- '''EWindowPulldownMenuItem'''
      +- [[Legacy:UWindowWindow|UWindowWindow]]
          +- [[Legacy:UWindowClientWindow|UWindowClientWindow]]
          |   +- [[Legacy:UWindowDialogClientWindow|UWindowDialogClientWindow]]
          |       +- '''EWindowDialogClientWindow'''
          |       +- [[Legacy:UWindowPageWindow|UWindowPageWindow]]
          |           +- [[Legacy:UMenuPageWindow|UMenuPageWindow]]
          |               +- '''EWindowPageWindow'''
          +- [[Legacy:UWindowDialogControl|UWindowDialogControl]]
              +- [[Legacy:UWindowButton|UWindowButton]]
              |   +- [[Legacy:UWindowCheckbox|UWindowCheckbox]]
              |       +- '''EWindowCheckbox'''
              +- [[Legacy:UWindowComboControl|UWindowComboControl]]
              |   +&amp;ndash; '''EWindowComboControl'''
              +- [[Legacy:UWindowEditControl|UWindowEditControl]]
              |   +- '''EWindowEditControl'''
              +- [[Legacy:UWindowListControl|UWindowListControl]]
                  +- [[Legacy:UWindowPulldownMenu|UWindowPulldownMenu]]
                      +- '''EWindowPulldownMenu'''
                          +- '''EWindowRightClickMenu'''

==Related Topics==
* [[Legacy:Actor Class Hierarchy (UT)|Actor Class Hierarchy (UT)]]
* [[Legacy:UWindow Class Hierarchy|UWindow Class Hierarchy]]
* [[Legacy:EWindow/Class Hierarchy|EWindow Class Hierarchy]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EIDMMutator</title>
    <id>1120</id>
    <revision>
      <id>2948</id>
      <timestamp>2007-11-19T13:55:18Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:DMMutator|DMMutator]] &gt;&gt; EIDMMutator (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This is a utility class for the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

EIDMMutator is a configurable version of BotPack.[[Legacy:DMMutator|DMMutator]] and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s can use their GetDMMutator() function to replace the base mutator with this class. By default it behaves exactly as the DMMutator.

==Properties==
; bool bKeepStationaryPawns : Prevent mutators from modifying [[Legacy:StationaryPawn|StationaryPawn]]s. Defaults to True.
; bool bReplaceAmmo : Replace Unreal ammo pickups with corresponding UT ammo. Defaults to True.
; bool bReplaceAmplifier : Replace the [[Legacy:Amplifier|Amplifier]] with the [[Legacy:UDamage|UDamage]]. Defaults to True.
; bool bReplaceArmor : Replace Unreal armor pickups with corresponding UT armor. Defaults to True.
; bool bReplaceHealth : Replace Unreal health pickups with corresponding UT health. Defaults to True.
; bool bReplaceInvisibility : Replace [[Legacy:Invisibility|Invisibility]] with [[Legacy:UT_Invisibility|UT_Invisibility]]. Defaults to True.
; bool bReplaceJumpBoots : Replace [[Legacy:JumpBoots|JumpBoots]] with [[Legacy:UT_JumpBoots|UT_JumpBoots]]. Defaults to True.
; bool bReplaceShieldbelt : Replace [[Legacy:ShieldBelt|ShieldBelt]] with [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]. Defaults to True.
; bool bReplaceWeapons : Replace Unreal [[Legacy:Weapon|Weapon]]s with their corresponding UT [[Legacy:TournamentWeapon|TournamentWeapon]] versions. Defaults to True.
; bool bSetAutoActivate : Enable bAutoActivate for all activatable pickups. Defaults to True.
; bool bSetMegaSpeed : Set mega speed if the gametype wants it. Defaults to True.
; float MegaSpeedFactor : The factor to multiply [[Legacy:Pawn (UT)|Pawn (UT)]] speeds by. Defaults to 1.4.

==Methods Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]==
;  AddMutator([[Legacy:Mutator (UT)|Mutator (UT)]] M) : Checks for the NoAlwaysAutoActivate mutator included in the [[Legacy:EnhancedItems|EnhancedItems]] package and disables bSetAutoActivate if found.
; bool AlwaysKeep([[Legacy:Actor (UT)|Actor (UT)]] Other) : The same as [[Legacy:DMMutator|DMMutator]].AlwaysKeep, except that it respects the variables mentioned above.
; bool CheckReplacement([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : The same as [[Legacy:DMMutator|DMMutator]].CheckReplacement, except that it respects the variables mentioned above.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2949</id>
      <timestamp>2004-12-23T08:47:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:DMMutator|DMMutator]] &gt;&gt; EIDMMutator (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This is a utility class for the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

EIDMMutator is a configurable version of BotPack.[[Legacy:DMMutator|DMMutator]] and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s can use their GetDMMutator() function to replace the base mutator with this class. By default it behaves exactly as the DMMutator.

==Properties==
; bool bKeepStationaryPawns : Prevent mutators from modifying [[Legacy:StationaryPawn|StationaryPawn]]s. Defaults to True.
; bool bReplaceAmmo : Replace Unreal ammo pickups with corresponding UT ammo. Defaults to True.
; bool bReplaceAmplifier : Replace the [[Legacy:Amplifier|Amplifier]] with the [[Legacy:UDamage|UDamage]]. Defaults to True.
; bool bReplaceArmor : Replace Unreal armor pickups with corresponding UT armor. Defaults to True.
; bool bReplaceHealth : Replace Unreal health pickups with corresponding UT health. Defaults to True.
; bool bReplaceInvisibility : Replace [[Legacy:Invisibility|Invisibility]] with [[Legacy:UT_Invisibility|UT_Invisibility]]. Defaults to True.
; bool bReplaceJumpBoots : Replace [[Legacy:JumpBoots|JumpBoots]] with [[Legacy:UT_JumpBoots|UT_JumpBoots]]. Defaults to True.
; bool bReplaceShieldbelt : Replace [[Legacy:ShieldBelt|ShieldBelt]] with [[Legacy:UT_ShieldBelt|UT_ShieldBelt]]. Defaults to True.
; bool bReplaceWeapons : Replace Unreal [[Legacy:Weapon|Weapon]]s with their corresponding UT [[Legacy:TournamentWeapon|TournamentWeapon]] versions. Defaults to True.
; bool bSetAutoActivate : Enable bAutoActivate for all activatable pickups. Defaults to True.
; bool bSetMegaSpeed : Set mega speed if the gametype wants it. Defaults to True.
; float MegaSpeedFactor : The factor to multiply [[Legacy:Pawn (UT)|Pawn (UT)]] speeds by. Defaults to 1.4.

==Methods Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]==
;  AddMutator([[Legacy:Mutator (UT)|Mutator (UT)]] M) : Checks for the NoAlwaysAutoActivate mutator included in the [[Legacy:EnhancedItems|EnhancedItems]] package and disables bSetAutoActivate if found.
; bool AlwaysKeep([[Legacy:Actor (UT)|Actor (UT)]] Other) : The same as [[Legacy:DMMutator|DMMutator]].AlwaysKeep, except that it respects the variables mentioned above.
; bool CheckReplacement([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : The same as [[Legacy:DMMutator|DMMutator]].CheckReplacement, except that it respects the variables mentioned above.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EIDeathMessageMutator</title>
    <id>1119</id>
    <revision>
      <id>2946</id>
      <timestamp>2007-11-19T13:55:05Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; EIDeathMessageMutator (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This is a utility class of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

It will be spawned automatically by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s to handle the extended death messages offered by several EnhancedItems classes. The mutator will automatically register itself as a message mutator and doesn't have to be registered in the general [[Legacy:Linked List|linked list]] of mutators.

It creates a [[Legacy:SpawnNotify|SpawnNotify]] (the ''EIDeathMessageSpawnNotify'') serversidely, which automatically registers the EIDeathMessageMutator with all [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]es and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] so those can use their SetKillType() and RestoreKillType() functions.

==Known Subclasses==
* WhoPushedMe (the [http://www.koehler-homepage.de/Wormbo/WhoPushedMe.html Who Pushed Me?] mutator)

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2947</id>
      <timestamp>2004-12-22T19:17:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; EIDeathMessageMutator (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This is a utility class of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

It will be spawned automatically by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s to handle the extended death messages offered by several EnhancedItems classes. The mutator will automatically register itself as a message mutator and doesn't have to be registered in the general [[Legacy:Linked List|linked list]] of mutators.

It creates a [[Legacy:SpawnNotify|SpawnNotify]] (the ''EIDeathMessageSpawnNotify'') serversidely, which automatically registers the EIDeathMessageMutator with all [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]]s, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]es and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] so those can use their SetKillType() and RestoreKillType() functions.

==Known Subclasses==
* WhoPushedMe (the [http://www.koehler-homepage.de/Wormbo/WhoPushedMe.html Who Pushed Me?] mutator)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EIEffects</title>
    <id>1112</id>
    <revision>
      <id>2932</id>
      <timestamp>2007-11-19T13:55:31Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; EIEffects (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Internal Variables==
; bool bDestroyMe : Specifies whether this effect is currently being destroyed after calling the DestroyMe() function. &quot;Destroying&quot; an EIEffect in this way needn't be the same as &quot;Destroy()ing&quot; it.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : The EIDeathMessageMutator is spawned by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s to make the EnhancedItems death messages work. You will have to spawn it yourself if your mod doesn't contain any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s and no other mod spawned it yet.

==Methods==
;  DestroyMe( ) : Starts destroying the effect. This may not have the same effect as calling Destroy(). Especially the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] subclass uses this function to start fading out the effect.
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
;  SetKillType(bool bSplashHit, bool bHeadHit, class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DamageProjectileClass) : Prepares the specified [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class' death messages to be used when a player is killed. Call this function before you damage or kill a player and revert its effect after you're done.

==Known Subclasses==

===EnhancedItems Subclasses===
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]
** [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]
** [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]

===Some Direct Subclasses in EnhancedItems-based Mods===

You are invited to explore the EnhancedItems-based mods' source code to see how these classes make use of the EIEffects features.
* BSLightningBolt &amp;ndash; a section of the lightning beam emitted by an exploding Black Shark missile in [http://www.koehler-homepage.de/Wormbo/RocketsUT.html Rockets UT]
* EIShockwave &amp;ndash; the Redeemer shockwave in the [http://www.koehler-homepage.de/Wormbo/EnhancedItems.html Enhanced Items Mod]
* RedeemerExplosion &amp;ndash; the explosion flare in the center of the Redeemer explosion in Rockets UT and [http://www.koehler-homepage.de/Wormbo/download.html#Redeemer Redeemer 2k3] (this one does the damage)

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2933</id>
      <timestamp>2004-12-23T09:17:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; EIEffects (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Internal Variables==
; bool bDestroyMe : Specifies whether this effect is currently being destroyed after calling the DestroyMe() function. &quot;Destroying&quot; an EIEffect in this way needn't be the same as &quot;Destroy()ing&quot; it.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : The EIDeathMessageMutator is spawned by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s to make the EnhancedItems death messages work. You will have to spawn it yourself if your mod doesn't contain any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s and no other mod spawned it yet.

==Methods==
;  DestroyMe( ) : Starts destroying the effect. This may not have the same effect as calling Destroy(). Especially the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] subclass uses this function to start fading out the effect.
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
;  SetKillType(bool bSplashHit, bool bHeadHit, class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DamageProjectileClass) : Prepares the specified [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class' death messages to be used when a player is killed. Call this function before you damage or kill a player and revert its effect after you're done.

==Known Subclasses==

===EnhancedItems Subclasses===
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]
** [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]
** [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]

===Some Direct Subclasses in EnhancedItems-based Mods===

You are invited to explore the EnhancedItems-based mods' source code to see how these classes make use of the EIEffects features.
* BSLightningBolt &amp;ndash; a section of the lightning beam emitted by an exploding Black Shark missile in [http://www.koehler-homepage.de/Wormbo/RocketsUT.html Rockets UT]
* EIShockwave &amp;ndash; the Redeemer shockwave in the [http://www.koehler-homepage.de/Wormbo/EnhancedItems.html Enhanced Items Mod]
* RedeemerExplosion &amp;ndash; the explosion flare in the center of the Redeemer explosion in Rockets UT and [http://www.koehler-homepage.de/Wormbo/download.html#Redeemer Redeemer 2k3] (this one does the damage)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EnhancedAmmo</title>
    <id>1111</id>
    <revision>
      <id>2930</id>
      <timestamp>2007-11-19T13:55:46Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; EnhancedAmmo (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

EnhancedAmmo classes can use the EnhancedItems death messages and they can specify, how they should be regenerated. This is used e.g. by the Relic of Wealth from the Enhanced Relics mutator in the Enhanced Items mod or the Ammo Regen relic in Q3T.

==Properties==
; bool bIsSuperWeapon : This ammo belongs to a super weapon.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : This variable contains a reference to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] responsible for displaying the enhanced death messages. The mutator automatically sets this value through a [[Legacy:SpawnNotify|SpawnNotify]] subclass.
; name IdenticalTo : Used by the OtherIsA() and ClassIsA() functions in various EnhancedItems base classes to identify an actor or class as being similar to this one. For example, the ERelicDeathInventory class (the Relic of Death pickup of the Enhanced Relics mutator) has IdenticalTo=RelicDeathInventory. This will cause OtherIsA(aPickup, 'RelicDeathInventory') to return True not only for actual subclasses of RelicDeathInventory, but also for the ERelicDeathInventory and any other EnhancedItems-based classes that have IdenticalTo=RelicDeathInventory in their default properties.
; RegenSuggestion SuggestedRegeneration : Specifies how this ammo should be regenerated. (see below) This is not used by the ammo itself, but can help other mods to find a good relation between different ammo types' regeneration cycles.

==Structures==

===RegenSuggestion===

Describes a way to regenerate this type of ammo.
; int Amount : How much ammo should be regenerated per cycle.
; int Interval : How long the cycle should be relative to other ammo types' cycles.
; int Max : Specifies the maximum amount of ammo that should be regenerated. This can be different from the default or maximum amount.

==Methods==
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property)
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property)

You may find the following two functions useful when creating Volatile Ammo pickups, i.e. ammo packs that explode when damaged.
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
;  SetKillType(bool bSplashHit, bool bHeadHit, class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DamageProjectileClass) : Prepares the specified [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class' death messages to be used when a player is killed. Call this function before you damage or kill a player and revert its effect after you're done.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2931</id>
      <timestamp>2004-12-05T00:15:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; EnhancedAmmo (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

EnhancedAmmo classes can use the EnhancedItems death messages and they can specify, how they should be regenerated. This is used e.g. by the Relic of Wealth from the Enhanced Relics mutator in the Enhanced Items mod or the Ammo Regen relic in Q3T.

==Properties==
; bool bIsSuperWeapon : This ammo belongs to a super weapon.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : This variable contains a reference to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] responsible for displaying the enhanced death messages. The mutator automatically sets this value through a [[Legacy:SpawnNotify|SpawnNotify]] subclass.
; name IdenticalTo : Used by the OtherIsA() and ClassIsA() functions in various EnhancedItems base classes to identify an actor or class as being similar to this one. For example, the ERelicDeathInventory class (the Relic of Death pickup of the Enhanced Relics mutator) has IdenticalTo=RelicDeathInventory. This will cause OtherIsA(aPickup, 'RelicDeathInventory') to return True not only for actual subclasses of RelicDeathInventory, but also for the ERelicDeathInventory and any other EnhancedItems-based classes that have IdenticalTo=RelicDeathInventory in their default properties.
; RegenSuggestion SuggestedRegeneration : Specifies how this ammo should be regenerated. (see below) This is not used by the ammo itself, but can help other mods to find a good relation between different ammo types' regeneration cycles.

==Structures==

===RegenSuggestion===

Describes a way to regenerate this type of ammo.
; int Amount : How much ammo should be regenerated per cycle.
; int Interval : How long the cycle should be relative to other ammo types' cycles.
; int Max : Specifies the maximum amount of ammo that should be regenerated. This can be different from the default or maximum amount.

==Methods==
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property)
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property)

You may find the following two functions useful when creating Volatile Ammo pickups, i.e. ammo packs that explode when damaged.
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
;  SetKillType(bool bSplashHit, bool bHeadHit, class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DamageProjectileClass) : Prepares the specified [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class' death messages to be used when a player is killed. Call this function before you damage or kill a player and revert its effect after you're done.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EnhancedArena</title>
    <id>1118</id>
    <revision>
      <id>2944</id>
      <timestamp>2007-11-19T13:55:58Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; EnhancedArena (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Features==
* Keeps the Translocator.
* Also checks [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] for correct item classes.

==Properties==
; bool bMIConverterSpawned : Whether the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] was already spawned.
; string KeepClasses[10] : Classes which should not be removed by this mutator.

==Methods==

===Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]===
; bool AlwaysKeep([[Legacy:Actor (UT)|Actor (UT)]] Other) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] if a Chaos UT MultiItem is found. Otherwise makes sure the Arena weapon and ammo types are not removed.
; bool CheckReplacement([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Works like [[Legacy:Arena|Arena]].CheckReplacement(), except that it doesn't remove the KeepClasses.

===New Functions===
; bool AlwaysKeepInMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other, class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; ItemClass) : Returns, whether the specified [[Legacy:Inventory (UT)|Inventory (UT)]] class should not be removed from a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]]
; bool CheckMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other) : Allows the mutator to modify a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]].
; bool ClassIsA(Class aClass, coerce string DesiredType) : Returns, whether a class is of a specified type.
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specified type.
;  SpawnMIConverter( ) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] if this wasn't done yet.

==Known Subclasses==
* ArenaMatchMutator ([http://www.koehler-homepage.de/Wormbo/ArenaMatch.html Arena Match])
* ClawArena (Enhanced Chaos Items)
* ComboInstaGibDM ([http://www.koehler-homepage.de/Wormbo/ComboInstaGib.html Combo InstaGib])
* CrossbowArena (Enhanced Chaos Items)

The two Enhanced Chaos Items mutators give the player three weapons and the corresponding ammo instead of only one. Arena Match is a configurable Arena mutator.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2945</id>
      <timestamp>2004-12-22T16:33:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[Legacy:Arena|Arena]] &gt;&gt; EnhancedArena (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Features==
* Keeps the Translocator.
* Also checks [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] for correct item classes.

==Properties==
; bool bMIConverterSpawned : Whether the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] was already spawned.
; string KeepClasses[10] : Classes which should not be removed by this mutator.

==Methods==

===Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]===
; bool AlwaysKeep([[Legacy:Actor (UT)|Actor (UT)]] Other) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] if a Chaos UT MultiItem is found. Otherwise makes sure the Arena weapon and ammo types are not removed.
; bool CheckReplacement([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Works like [[Legacy:Arena|Arena]].CheckReplacement(), except that it doesn't remove the KeepClasses.

===New Functions===
; bool AlwaysKeepInMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other, class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; ItemClass) : Returns, whether the specified [[Legacy:Inventory (UT)|Inventory (UT)]] class should not be removed from a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]]
; bool CheckMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other) : Allows the mutator to modify a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]].
; bool ClassIsA(Class aClass, coerce string DesiredType) : Returns, whether a class is of a specified type.
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specified type.
;  SpawnMIConverter( ) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] if this wasn't done yet.

==Known Subclasses==
* ArenaMatchMutator ([http://www.koehler-homepage.de/Wormbo/ArenaMatch.html Arena Match])
* ClawArena (Enhanced Chaos Items)
* ComboInstaGibDM ([http://www.koehler-homepage.de/Wormbo/ComboInstaGib.html Combo InstaGib])
* CrossbowArena (Enhanced Chaos Items)

The two Enhanced Chaos Items mutators give the player three weapons and the corresponding ammo instead of only one. Arena Match is a configurable Arena mutator.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EnhancedMutator</title>
    <id>1121</id>
    <revision>
      <id>2950</id>
      <timestamp>2007-11-19T13:56:14Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; EnhancedMutator (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

EnhancedMutator is an abstract base class for non-[[Legacy:Arena|Arena]] mutators in EnhancedItems-based mods.

==Features==
* can handle [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] replacement
* new RegisterHUDMutator function
* can draw on HUD before and after weapon is drawn (only if an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] is selected)
* unregisters from all mutator chains when destroyed
* activates the enhanced death messages of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]

==Properties==
; bool bAllowOnlyOnce : This mutator class should only exist once in a game. Any additional mutator of this class will be destroyed when it tries to add itself to the [[Legacy:Linked List|linked list]] of mutators.
; bool bAlwaysCreateMPP (globalconfig) : The mutator should always create a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] when replacing pickups, even if there is no need to do so.&lt;br /&gt;This can solve problems with other EnhancedMutators but can also produce new ones with non-EnhancedItems mutator. (Behavior must be implemented in CheckReplacement() of child classes.)
; string MultiPickupBaseClass : The default [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] class to use when creating MPPs.

===Internal Variables===
; bool bMIConverterSpawned : Tells, whether the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] was already spawned.
; bool bPendingHUDRegistration : Set to True when the RegisterHUDMutator() function has failed. The mutator will try to register again in the next Tick. You can set this to True in [[Legacy:Default Properties|default properties]] to automatically let the mutator register itself as HUD mutator. (See function RegisterHUDMutator() below.)
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : A reference to the EIDeathMessageMutator that enables the enhanced death messages.
; [[Legacy:ChallengeHUD|ChallengeHUD]] MyChallengeHUD : Reference to the local HUD, [[Legacy:Typecasting|typecasted]] to [[Legacy:ChallengeHUD|ChallengeHUD]], for HUD mutators.
; [[Legacy:HUD (UT)|HUD (UT)]] MyHUD : Reference to the local HUD for HUD mutators.
; [[Legacy:PlayerPawn|PlayerPawn]] PlayerOwner : Reference to the [[Legacy:Local PlayerPawn|local PlayerPawn]] for HUD mutators.

==Methods==

===General===
;  AddMutator([[Legacy:Mutator (UT)|Mutator (UT)]] M) : Makes sure the mutator isn't re-added to the mutators list if it's already there. 

; bool ClassIsA(class aClass, coerce string DesiredType) [static, final] : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property of many [[Legacy:EnhancedItems|EnhancedItems]] classes)

;  Destroyed( ) [simulated] : Unregisters the mutator from all of the four [[Legacy:Linked List|linked list]]s of mutators: mutators list, message mutators list, damage mutators list and HUD mutators list.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]] GetDMMutator( ) : Returns a reference to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]]. It will be created using ReplaceDMMutator() if it doesn't yet exist.

; [[Legacy:Weapon (UT)|Weapon (UT)]] GiveWeapon([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn, string aClassName, optional bool bBringUp) : Gives the specified weapon to a player.

; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) [static, final] : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property of many [[Legacy:EnhancedItems|EnhancedItems]] classes)

;  PreBeginPlay( ) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]], the EIChallengeHUD mutator (if desired) and the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]]. (if it doesn't exist yet)

;  ReplaceDMMutator( ) : Replaces the base mutator with the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]] if it's a [[Legacy:DMMutator|DMMutator]].

; [[Legacy:Inventory (UT)|Inventory (UT)]] ReplaceWithItem([[Legacy:Inventory (UT)|Inventory (UT)]] Other, coerce string aClassName) [final] : Replacement for the [[Legacy:Mutator (UT)|Mutator]].ReplaceWith() function with better handling for [[Legacy:Inventory (UT)|Inventory (UT)]] classes.

;  RestoreKillType( ) [final] : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.

;  SetKillType(bool bSplashHit, bool bHeadHit, class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DamageProjectileClass) [final] : Prepares the specified [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class' death messages to be used when a player is killed. Call this function before you damage or kill a player and revert its effect after you're done.

;  SpawnEIChallengeHUD( ) : Tries to spawn the EIChallengeHUD HUD mutator, which modifies the player status icon.

;  SpawnMIConverter( ) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] if it doesn't already exist.

; string StaticGetItemName(string FullName) [static] : [[Legacy:Actor (UT)|Actor]].GetItemName() as [[Legacy:Static Function|static function]].

===HUD Mutator Related===
;  Tick(float DeltaTime) [simulated] : Tries to register this mutator as HUD mutator if bPendingHUDRegistration=True.

;  PostRender([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) [simulated] : Fixed version of [[Mutator (UT)]Mutator].PostRender(), which properly calls the next HUD mutator's PostRender().

;  PostRenderOverlaysFor([[Legacy:Weapon (UT)|Weapon (UT)]] W, [[Legacy:Canvas (UT)|Canvas (UT)]] C) [simulated] : Called for all EnhancedMutators after an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]'s RenderOverlays() and before calling the PostRenderOverlaysFor() function for any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] registered as that weapon's affector.

; bool PreRenderOverlaysFor([[Legacy:Weapon (UT)|Weapon (UT)]] W, [[Legacy:Canvas (UT)|Canvas (UT)]] C) [simulated] : Called for all EnhancedMutators before an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]'s RenderOverlays() and before calling the PreRenderOverlaysFor() function for any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] registered as that weapon's affector.&lt;br /&gt;If this function returns true, the mutator will handle drawing the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] and the weapon's OldRenderOverlays() function and all PostRenderOverlaysFor() functions will be skipped. PreRenderOverlaysFor() calls for other EnhancedMutators or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] affectors will ''not'' be skipped. 

;  RegisterHUDMutator( ) [simulated] : Registers the mutator as HUD mutator. This modified version not only registers the mutator, but also sets the PlayerOwner, MyHUD and MyChallengeHUD variables to the [[Legacy:Local PlayerPawn|local PlayerPawn]] and [[Legacy:HUD (UT)|HUD (UT)]] respectively. Note that if the mutator's Owner is a [[Legacy:PlayerPawn|PlayerPawn]] it will only register as that player's HUD mutator.

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Related===
; bool AlwaysKeepInMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other, class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; ItemClass) : Returns, whether an inventory class should not be reomved from a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]].

; bool CheckMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other) : Allowes the mutator to modify a newly spawned [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] before it starts spawning items.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] ConvertToMPP([[Legacy:Inventory (UT)|Inventory (UT)]] Other, optional string MPPClass) [final] : Converts a pickup to a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] and adds the item class to it.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] ReplaceWithItemAsMPP([[Legacy:Inventory (UT)|Inventory (UT)]] Other, coerce string aClassName, optional vector NewItemOffset, optional float NewInitTime, optional float NewChance, optional float NDuration) [final] : Replaces an item with a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] and adds an item of the specified class to it.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] ReplaceWithMPP([[Legacy:Inventory (UT)|Inventory (UT)]] Other, optional string MPPClass) [final] : Replaces an item with an empty [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]].

==Known Subclasses==
* EIChallengeHUD &amp;ndash; draws the enhanced player status icon
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]]
* EIUseHoldable &amp;ndash; utility class for [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HoldablePickup]]s
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]]
* NoAlwaysAutoActivate &amp;ndash; resets the bAutoActivate values of all Pickups to their default values after [[Legacy:DMMutator|DMMutator]] set all of them to True

===...in other mods (only some)===
* ArenaPhysicsMutator &amp;ndash; the mutator responsible for the non-Arena changes in [http://www.koehler-homepage.de/Wormbo/ArenaMatch.html Arena Match]
* ERelicHUDMutator &amp;ndash; the HUD mutator of [http://www.koehler-homepage.de/Wormbo/EnhancedItems.html#Relics EnhancedRelics]

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2951</id>
      <timestamp>2004-12-23T10:41:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; EnhancedMutator (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

EnhancedMutator is an abstract base class for non-[[Legacy:Arena|Arena]] mutators in EnhancedItems-based mods.

==Features==
* can handle [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] replacement
* new RegisterHUDMutator function
* can draw on HUD before and after weapon is drawn (only if an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] is selected)
* unregisters from all mutator chains when destroyed
* activates the enhanced death messages of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]

==Properties==
; bool bAllowOnlyOnce : This mutator class should only exist once in a game. Any additional mutator of this class will be destroyed when it tries to add itself to the [[Legacy:Linked List|linked list]] of mutators.
; bool bAlwaysCreateMPP (globalconfig) : The mutator should always create a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] when replacing pickups, even if there is no need to do so.&lt;br /&gt;This can solve problems with other EnhancedMutators but can also produce new ones with non-EnhancedItems mutator. (Behavior must be implemented in CheckReplacement() of child classes.)
; string MultiPickupBaseClass : The default [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] class to use when creating MPPs.

===Internal Variables===
; bool bMIConverterSpawned : Tells, whether the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] was already spawned.
; bool bPendingHUDRegistration : Set to True when the RegisterHUDMutator() function has failed. The mutator will try to register again in the next Tick. You can set this to True in [[Legacy:Default Properties|default properties]] to automatically let the mutator register itself as HUD mutator. (See function RegisterHUDMutator() below.)
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : A reference to the EIDeathMessageMutator that enables the enhanced death messages.
; [[Legacy:ChallengeHUD|ChallengeHUD]] MyChallengeHUD : Reference to the local HUD, [[Legacy:Typecasting|typecasted]] to [[Legacy:ChallengeHUD|ChallengeHUD]], for HUD mutators.
; [[Legacy:HUD (UT)|HUD (UT)]] MyHUD : Reference to the local HUD for HUD mutators.
; [[Legacy:PlayerPawn|PlayerPawn]] PlayerOwner : Reference to the [[Legacy:Local PlayerPawn|local PlayerPawn]] for HUD mutators.

==Methods==

===General===
;  AddMutator([[Legacy:Mutator (UT)|Mutator (UT)]] M) : Makes sure the mutator isn't re-added to the mutators list if it's already there. 

; bool ClassIsA(class aClass, coerce string DesiredType) [static, final] : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property of many [[Legacy:EnhancedItems|EnhancedItems]] classes)

;  Destroyed( ) [simulated] : Unregisters the mutator from all of the four [[Legacy:Linked List|linked list]]s of mutators: mutators list, message mutators list, damage mutators list and HUD mutators list.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]] GetDMMutator( ) : Returns a reference to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]]. It will be created using ReplaceDMMutator() if it doesn't yet exist.

; [[Legacy:Weapon (UT)|Weapon (UT)]] GiveWeapon([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn, string aClassName, optional bool bBringUp) : Gives the specified weapon to a player.

; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) [static, final] : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property of many [[Legacy:EnhancedItems|EnhancedItems]] classes)

;  PreBeginPlay( ) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]], the EIChallengeHUD mutator (if desired) and the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]]. (if it doesn't exist yet)

;  ReplaceDMMutator( ) : Replaces the base mutator with the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDMMutator]] if it's a [[Legacy:DMMutator|DMMutator]].

; [[Legacy:Inventory (UT)|Inventory (UT)]] ReplaceWithItem([[Legacy:Inventory (UT)|Inventory (UT)]] Other, coerce string aClassName) [final] : Replacement for the [[Legacy:Mutator (UT)|Mutator]].ReplaceWith() function with better handling for [[Legacy:Inventory (UT)|Inventory (UT)]] classes.

;  RestoreKillType( ) [final] : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.

;  SetKillType(bool bSplashHit, bool bHeadHit, class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DamageProjectileClass) [final] : Prepares the specified [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class' death messages to be used when a player is killed. Call this function before you damage or kill a player and revert its effect after you're done.

;  SpawnEIChallengeHUD( ) : Tries to spawn the EIChallengeHUD HUD mutator, which modifies the player status icon.

;  SpawnMIConverter( ) : Spawns the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]] if it doesn't already exist.

; string StaticGetItemName(string FullName) [static] : [[Legacy:Actor (UT)|Actor]].GetItemName() as [[Legacy:Static Function|static function]].

===HUD Mutator Related===
;  Tick(float DeltaTime) [simulated] : Tries to register this mutator as HUD mutator if bPendingHUDRegistration=True.

;  PostRender([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) [simulated] : Fixed version of [[Mutator (UT)]Mutator].PostRender(), which properly calls the next HUD mutator's PostRender().

;  PostRenderOverlaysFor([[Legacy:Weapon (UT)|Weapon (UT)]] W, [[Legacy:Canvas (UT)|Canvas (UT)]] C) [simulated] : Called for all EnhancedMutators after an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]'s RenderOverlays() and before calling the PostRenderOverlaysFor() function for any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] registered as that weapon's affector.

; bool PreRenderOverlaysFor([[Legacy:Weapon (UT)|Weapon (UT)]] W, [[Legacy:Canvas (UT)|Canvas (UT)]] C) [simulated] : Called for all EnhancedMutators before an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]'s RenderOverlays() and before calling the PreRenderOverlaysFor() function for any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] registered as that weapon's affector.&lt;br /&gt;If this function returns true, the mutator will handle drawing the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] and the weapon's OldRenderOverlays() function and all PostRenderOverlaysFor() functions will be skipped. PreRenderOverlaysFor() calls for other EnhancedMutators or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] affectors will ''not'' be skipped. 

;  RegisterHUDMutator( ) [simulated] : Registers the mutator as HUD mutator. This modified version not only registers the mutator, but also sets the PlayerOwner, MyHUD and MyChallengeHUD variables to the [[Legacy:Local PlayerPawn|local PlayerPawn]] and [[Legacy:HUD (UT)|HUD (UT)]] respectively. Note that if the mutator's Owner is a [[Legacy:PlayerPawn|PlayerPawn]] it will only register as that player's HUD mutator.

===[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Related===
; bool AlwaysKeepInMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other, class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; ItemClass) : Returns, whether an inventory class should not be reomved from a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]].

; bool CheckMPP([[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] Other) : Allowes the mutator to modify a newly spawned [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] before it starts spawning items.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] ConvertToMPP([[Legacy:Inventory (UT)|Inventory (UT)]] Other, optional string MPPClass) [final] : Converts a pickup to a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] and adds the item class to it.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] ReplaceWithItemAsMPP([[Legacy:Inventory (UT)|Inventory (UT)]] Other, coerce string aClassName, optional vector NewItemOffset, optional float NewInitTime, optional float NewChance, optional float NDuration) [final] : Replaces an item with a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] and adds an item of the specified class to it.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] ReplaceWithMPP([[Legacy:Inventory (UT)|Inventory (UT)]] Other, optional string MPPClass) [final] : Replaces an item with an empty [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]].

==Known Subclasses==
* EIChallengeHUD &amp;ndash; draws the enhanced player status icon
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]]
* EIUseHoldable &amp;ndash; utility class for [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HoldablePickup]]s
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]]
* NoAlwaysAutoActivate &amp;ndash; resets the bAutoActivate values of all Pickups to their default values after [[Legacy:DMMutator|DMMutator]] set all of them to True

===...in other mods (only some)===
* ArenaPhysicsMutator &amp;ndash; the mutator responsible for the non-Arena changes in [http://www.koehler-homepage.de/Wormbo/ArenaMatch.html Arena Match]
* ERelicHUDMutator &amp;ndash; the HUD mutator of [http://www.koehler-homepage.de/Wormbo/EnhancedItems.html#Relics EnhancedRelics]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EnhancedProjectile</title>
    <id>1109</id>
    <revision>
      <id>2926</id>
      <timestamp>2007-11-19T13:56:30Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Projectile (UT)|Projectile (UT)]] &gt;&gt; EnhancedProjectile (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Features==
* death/suicide messages for projectiles (independant from weapon)
* headshot support with extra damage type, death/suicide messages and damage factor
* splash damage support with extra damage type and death/suicide messages and different momentum transfer
* can be used as a &quot;DamageType&quot; by declaring an abstract class and specifying it as DeathMessageActorClass in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] and EnhancedProjectile or as DamageProjectileClass in the SetKillType() function of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]
* can remember the instigator's DamageScaling and apply it at explosion time

==Properties==

===Globalconfig Properties===
; bool bDropEffects : Whether the projectile should drop some visual effects to increase game performance.
; bool bKeepLightEffects : Tells the projectile to keep its light effects enabled even with bDropEffects=True or under low-FPS conditions. This setting is intended to be used in combination with a darkmatch mutator, but is also useful on darked maps in general.

===Localized Properties===
; string ProjectileName : This projectile's name. (used in death messages)

The following properties are death messages and you can use these placeholders in them:

{|

|-
|%k
|Killing player's name 
|-
|%o
|Other (killed) player's name
|-
|%w
|Weapon used to make the kill (not the weapon held while making the kill!)
|-
|%p
|Name of the projectile used
|}
; string DirectHitString : Death message for kills via direct hits.
; string HeadHitString : Death message for headshots (if the projectile can cause headshots, see next section).
; string HeadSuicideFString : Suicide message for female models for self-headshots.
; string HeadSuicideString : Suicide message for male models for self-headshots.
; string SplashHitString : Death message for kills via splash damage.
; string SuicideFString : Suicide message for female models for suicides via direct hit or splash damage.
; string SuicideString : Suicide message for male models for suicides via direct hit or splash damage.

===Other Properties===
; bool bCanHeadShoot : Whether this projectile behaves differently (different damage and/or death message) when it hits a player's head.
; bool bConstantSplashDamage : Whether the projectile's explosion splash damage is the same in the whole splash area. Keep this set to False if the damage should fall off linearly with the distance to the projectile's impact location.
; bool bKeepDamageScaling : The projectile's damage (like any damage) is scaled by the instigator [[Legacy:Pawn (UT)|Pawn]]'s DamageScaling. When this property is set to true, the Instigator's DamageScaling from the moment when the projectile is fired is used instead of when it hits.
; float DamageRadius : Radius of the splash damage area.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DeathMessageActorClass : When set to an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or EnhancedProjectile class, that class' death messages are used instead of this one's.
; class&lt;[[Legacy:Effects (UT)|Effects (UT)]]&gt; ExplosionEffectClass : This effect is spawned when the projectile explodes.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; FiredFrom : The weapon class this projectile is fired from. That weapon's InventoryName is used for the %w placeholder in the death message.
; name HeadDamageType : Name of the damage type to use for headshots. Use 'Decapitated' to let UT display its &quot;Headshot!&quot; announcement for the killer.
; float HeadShotDamageFactor : The damage done by a headshot is the projectile's Damage multiplied by HeadShotDamageFactor.
; float HeadShotHeight : This defines the height, over which hits are counted as headshots. 0 means the center of the player's collision cylinder, 1 is the top, -1 is the bottom. The value used for UT's sniper rifle is 0.62, which also is the default value here.
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; HeadShotMessage : A custom [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] displayed to both the killer and the victim after a headshot. The LocalMessage class should react to the following switches:
# Message is displayed to the killer
# Message is displayed to the victim
# Message is displayed to the player after a headshot suicide :D
Mods using the EnhancedItems package don't neccessarily need to make a difference here. E.g. both the EnhancedItems Ripper and the Rockets UT Mercury Missiles just use UT's headshot announcement and display it to killer and victim. (This includes Ripper self-headshots. ;))
; name IdenticalTo : Used by the OtherIsA() and ClassIsA() functions in various EnhancedItems base classes to identify an actor or class as being similar to this one. For example, the ERelicDeathInventory class (the Relic of Death pickup of the Enhanced Relics mutator) has IdenticalTo=RelicDeathInventory. This will cause OtherIsA(aPickup, 'RelicDeathInventory') to rturn True not only for actual subclasses of RelicDeathInventory, but also for the ERelicDeathInventory and any other EnhancedItems-based classes that have IdenticalTo=RelicDeathInventory in their default properties.
; float MomentumModifier : How the instigator's DamageScaling affects the momentum applied by this projectile's explosion.
;| = 0 | no effect |
;| &gt; 0 | Momentum becomes higher with a higher DamageScaling value.
;| &lt; 0 | Momentum is reduced with a higher DamageScaling value.
; name SplashDamageType : Damage type to use for splash damage.
; float SplashMomentum : Momentum aplied by splash damage.
; float SplashRangeModifier : How the splash range is affected by the instigator's damage scaling. This works the same way as MomentumModifier.
; class&lt;[[Legacy:Projectile (UT)|Projectile (UT)]]&gt; SubMunitionClass : What type of projectiles should be spawned when this projectile explodes.
; int SubMunitionCount : How many sub-projectiles should be spawned.

===Internal Variables===
; bool bLifeSpanMode
; bool bNoLifeSpan : Used internally by the LiveSpanMode() function.
; [[Legacy:Actor (UT)|Actor (UT)]] MyTarget (replicated to clients) : A replicated version of the Target variable. Use this for whatever you like.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : The EIDeathMessageMutator is spawned by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s to make the EnhancedItems death messages work. You will have to spawn it yourself if your mod doesn't contain any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s and no other mod spawned it yet.
; float SpawnDamageScaling (replicated to clients) : When bKeepDamageScaling=True, this holds the instigator's DamageScaling at the moment the projectile was fired.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
; string GetHumanName( ) : Returns a human-readable name for this projectiole, usually the ProjectileName.
;  HitWall(vector HitNormal, [[Legacy:Actor (UT)|Actor (UT)]] Wall) : Lets the projectile explode when it hits a wall.
;  Spawned( ) : If authorative (see [[Legacy:Role|Role]]) and bKeepDamageScaling, this event remembers the instigator's DamageScaling.

===Inherited From [[Legacy:Projectile (UT)|Projectile (UT)]]===
;  BlowUp(vector HitLocation) : 
;  Explode(vector HitLocation, vector HitNormal) : This function is not as flexible in usage as the new Explosion() function, which replaces it.

===New Functions===
; name AdjustSplashDamageType([[Legacy:Actor (UT)|Actor (UT)]] Other) : Allowes you to use different damage types for different actors in the slpash area.
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property)
;  DirectHit(vector HitLocation, [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Damages Other at HitLocation. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used.
; vector EstimatedHitNormal(out vector HitLocation, out [[Legacy:Actor (UT)|Actor (UT)]] HitActor, optional vector CurLocation, optional vector Distance, optional bool bHitLevelOnly, optional vector Extend) : Tries to estimate the projectile's impact location, hit normal and hit actor.
;  Explosion(optional vector HitLocation, optional vector HitNormal, optional [[Legacy:Actor (UT)|Actor (UT)]] HitActor) : 
; bool LifeSpanMode( ) : Returns whether the LiveSpan mutator by [[Legacy:Uncommon|Uncommon]] or any similar mod (e.g. Rocket UT's fun mode &quot;Live Span&quot;) is in use. Projectiles should stay around longer in this case.
;  ModifySubMunition([[Legacy:Projectile (UT)|Projectile (UT)]] Other) : Allowes you to modify each sub-projectile spawned.
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property)
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; ReturnMessageActor( ) : Returns the DeathMessageActorClass if that's a subclass of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or EnhancedProjectile, otherwise returns this class.
; rotator RotationFromVector(vector NewDirection, optional rotator OldRotator) : Converts a vector to a rotator, mainatining OldRotator's Roll component.
;  SetKillType(bool bSplashHit, bool bHeadHit) : Prepares this class' death messages to be used when a player is killed. Call this function if you use neither DirectDamage() nor SplashDamage() to do damage or kill a player and revert its effect after you're done.
;  SpawnExplosionEffects(vector HitLocation, vector HitNormal) : Spawns an explosion effect.
;  SpawnSubMunition(vector HitLocation, vector HitNormal, int Amount) : Spawns the specified number of sub-projectiles flying into random directions. You can use HitNormal to somewhat restrict the randomness of the projectiles' directions.
;  SplashDamage(optional vector HitLocation, optional [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Similar to the HurtRadius() function, but deals out a direct hit to Other instead of doing splash dmaage to it. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used for the direct hit.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2927</id>
      <timestamp>2005-06-23T17:04:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed link to EIEffects class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Projectile (UT)|Projectile (UT)]] &gt;&gt; EnhancedProjectile (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Features==
* death/suicide messages for projectiles (independant from weapon)
* headshot support with extra damage type, death/suicide messages and damage factor
* splash damage support with extra damage type and death/suicide messages and different momentum transfer
* can be used as a &quot;DamageType&quot; by declaring an abstract class and specifying it as DeathMessageActorClass in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] and EnhancedProjectile or as DamageProjectileClass in the SetKillType() function of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedAmmo]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]
* can remember the instigator's DamageScaling and apply it at explosion time

==Properties==

===Globalconfig Properties===
; bool bDropEffects : Whether the projectile should drop some visual effects to increase game performance.
; bool bKeepLightEffects : Tells the projectile to keep its light effects enabled even with bDropEffects=True or under low-FPS conditions. This setting is intended to be used in combination with a darkmatch mutator, but is also useful on darked maps in general.

===Localized Properties===
; string ProjectileName : This projectile's name. (used in death messages)

The following properties are death messages and you can use these placeholders in them:

{|

|-
|%k
|Killing player's name 
|-
|%o
|Other (killed) player's name
|-
|%w
|Weapon used to make the kill (not the weapon held while making the kill!)
|-
|%p
|Name of the projectile used
|}
; string DirectHitString : Death message for kills via direct hits.
; string HeadHitString : Death message for headshots (if the projectile can cause headshots, see next section).
; string HeadSuicideFString : Suicide message for female models for self-headshots.
; string HeadSuicideString : Suicide message for male models for self-headshots.
; string SplashHitString : Death message for kills via splash damage.
; string SuicideFString : Suicide message for female models for suicides via direct hit or splash damage.
; string SuicideString : Suicide message for male models for suicides via direct hit or splash damage.

===Other Properties===
; bool bCanHeadShoot : Whether this projectile behaves differently (different damage and/or death message) when it hits a player's head.
; bool bConstantSplashDamage : Whether the projectile's explosion splash damage is the same in the whole splash area. Keep this set to False if the damage should fall off linearly with the distance to the projectile's impact location.
; bool bKeepDamageScaling : The projectile's damage (like any damage) is scaled by the instigator [[Legacy:Pawn (UT)|Pawn]]'s DamageScaling. When this property is set to true, the Instigator's DamageScaling from the moment when the projectile is fired is used instead of when it hits.
; float DamageRadius : Radius of the splash damage area.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DeathMessageActorClass : When set to an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or EnhancedProjectile class, that class' death messages are used instead of this one's.
; class&lt;[[Legacy:Effects (UT)|Effects (UT)]]&gt; ExplosionEffectClass : This effect is spawned when the projectile explodes.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; FiredFrom : The weapon class this projectile is fired from. That weapon's InventoryName is used for the %w placeholder in the death message.
; name HeadDamageType : Name of the damage type to use for headshots. Use 'Decapitated' to let UT display its &quot;Headshot!&quot; announcement for the killer.
; float HeadShotDamageFactor : The damage done by a headshot is the projectile's Damage multiplied by HeadShotDamageFactor.
; float HeadShotHeight : This defines the height, over which hits are counted as headshots. 0 means the center of the player's collision cylinder, 1 is the top, -1 is the bottom. The value used for UT's sniper rifle is 0.62, which also is the default value here.
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; HeadShotMessage : A custom [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] displayed to both the killer and the victim after a headshot. The LocalMessage class should react to the following switches:
# Message is displayed to the killer
# Message is displayed to the victim
# Message is displayed to the player after a headshot suicide :D
Mods using the EnhancedItems package don't neccessarily need to make a difference here. E.g. both the EnhancedItems Ripper and the Rockets UT Mercury Missiles just use UT's headshot announcement and display it to killer and victim. (This includes Ripper self-headshots. ;))
; name IdenticalTo : Used by the OtherIsA() and ClassIsA() functions in various EnhancedItems base classes to identify an actor or class as being similar to this one. For example, the ERelicDeathInventory class (the Relic of Death pickup of the Enhanced Relics mutator) has IdenticalTo=RelicDeathInventory. This will cause OtherIsA(aPickup, 'RelicDeathInventory') to rturn True not only for actual subclasses of RelicDeathInventory, but also for the ERelicDeathInventory and any other EnhancedItems-based classes that have IdenticalTo=RelicDeathInventory in their default properties.
; float MomentumModifier : How the instigator's DamageScaling affects the momentum applied by this projectile's explosion.
;| = 0 | no effect |
;| &gt; 0 | Momentum becomes higher with a higher DamageScaling value.
;| &lt; 0 | Momentum is reduced with a higher DamageScaling value.
; name SplashDamageType : Damage type to use for splash damage.
; float SplashMomentum : Momentum aplied by splash damage.
; float SplashRangeModifier : How the splash range is affected by the instigator's damage scaling. This works the same way as MomentumModifier.
; class&lt;[[Legacy:Projectile (UT)|Projectile (UT)]]&gt; SubMunitionClass : What type of projectiles should be spawned when this projectile explodes.
; int SubMunitionCount : How many sub-projectiles should be spawned.

===Internal Variables===
; bool bLifeSpanMode
; bool bNoLifeSpan : Used internally by the LiveSpanMode() function.
; [[Legacy:Actor (UT)|Actor (UT)]] MyTarget (replicated to clients) : A replicated version of the Target variable. Use this for whatever you like.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : The EIDeathMessageMutator is spawned by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s to make the EnhancedItems death messages work. You will have to spawn it yourself if your mod doesn't contain any [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]]s and no other mod spawned it yet.
; float SpawnDamageScaling (replicated to clients) : When bKeepDamageScaling=True, this holds the instigator's DamageScaling at the moment the projectile was fired.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
; string GetHumanName( ) : Returns a human-readable name for this projectiole, usually the ProjectileName.
;  HitWall(vector HitNormal, [[Legacy:Actor (UT)|Actor (UT)]] Wall) : Lets the projectile explode when it hits a wall.
;  Spawned( ) : If authorative (see [[Legacy:Role|Role]]) and bKeepDamageScaling, this event remembers the instigator's DamageScaling.

===Inherited From [[Legacy:Projectile (UT)|Projectile (UT)]]===
;  BlowUp(vector HitLocation) : 
;  Explode(vector HitLocation, vector HitNormal) : This function is not as flexible in usage as the new Explosion() function, which replaces it.

===New Functions===
; name AdjustSplashDamageType([[Legacy:Actor (UT)|Actor (UT)]] Other) : Allowes you to use different damage types for different actors in the slpash area.
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property)
;  DirectHit(vector HitLocation, [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Damages Other at HitLocation. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used.
; vector EstimatedHitNormal(out vector HitLocation, out [[Legacy:Actor (UT)|Actor (UT)]] HitActor, optional vector CurLocation, optional vector Distance, optional bool bHitLevelOnly, optional vector Extend) : Tries to estimate the projectile's impact location, hit normal and hit actor.
;  Explosion(optional vector HitLocation, optional vector HitNormal, optional [[Legacy:Actor (UT)|Actor (UT)]] HitActor) : 
; bool LifeSpanMode( ) : Returns whether the LiveSpan mutator by [[Legacy:Uncommon|Uncommon]] or any similar mod (e.g. Rocket UT's fun mode &quot;Live Span&quot;) is in use. Projectiles should stay around longer in this case.
;  ModifySubMunition([[Legacy:Projectile (UT)|Projectile (UT)]] Other) : Allowes you to modify each sub-projectile spawned.
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property)
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; ReturnMessageActor( ) : Returns the DeathMessageActorClass if that's a subclass of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] or EnhancedProjectile, otherwise returns this class.
; rotator RotationFromVector(vector NewDirection, optional rotator OldRotator) : Converts a vector to a rotator, mainatining OldRotator's Roll component.
;  SetKillType(bool bSplashHit, bool bHeadHit) : Prepares this class' death messages to be used when a player is killed. Call this function if you use neither DirectDamage() nor SplashDamage() to do damage or kill a player and revert its effect after you're done.
;  SpawnExplosionEffects(vector HitLocation, vector HitNormal) : Spawns an explosion effect.
;  SpawnSubMunition(vector HitLocation, vector HitNormal, int Amount) : Spawns the specified number of sub-projectiles flying into random directions. You can use HitNormal to somewhat restrict the randomness of the projectiles' directions.
;  SplashDamage(optional vector HitLocation, optional [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Similar to the HurtRadius() function, but deals out a direct hit to Other instead of doing splash dmaage to it. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used for the direct hit.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/EnhancedWeapon</title>
    <id>1110</id>
    <revision>
      <id>2928</id>
      <timestamp>2007-11-19T13:56:50Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; EnhancedWeapon (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by Wormbo.

Don't use the DeathMessage variable. For projectile weapons use [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]s and their death messages and for instant-hit weapons use the new hit strings.

==Properties==

===Globalconfig Properties===
; bool bDropEffects : Whether the weapon should drop some visual effects to increase game performance.

===Localized Properties===
; string DoubleName : Displayed name of the weapon when dual-wielded.
; string MenuName : Name of this weapon displayed in the weapon priority menu. (only in the Advanced Weapon Priority menu and in the Arena Match config window)
; string ProjectileName :  This weapon's projectile name. (used in death messages)

The following properties are death messages and you can use these placeholders in them:

{|

|-
|%k
|Killing player's name 
|-
|%o
|Other (killed) player's name
|-
|%w
|Weapon used to make the kill (not the weapon held while making the kill!)
|-
|%p
|Name of the projectile used
|}
; string DirectHitString : Death message for kills via direct hits.
; string HeadHitString : Death message for headshots (if the projectile can cause headshots, see next section).
; string HeadSuicideFString : Suicide message for female models for self-headshots.
; string HeadSuicideString : Suicide message for male models for self-headshots.
; string SplashHitString : Death message for kills via splash damage.
; string SuicideFString : Suicide message for female models for suicides via direct hit or splash damage.
; string SuicideString : Suicide message for male models for suicides via direct hit or splash damage.

===Other Properties===
; bool bCanHeadShoot : Whether this weapon behaves differently (different damage and/or death message) when it hits a player's head.
; bool bConstantSplashDamage : Whether the weapon's explosion splash damage is the same in the whole splash area. Keep this set to False if the damage should fall off linearly with the distance to the impact location.
; bool bCustomDrawSlave : The class whats to handle drawing the slave weapon (when dual-wielded) itself.
; float Damage : Damage done by this instant-hit weapon.
; float DamageRadius : Splash damage range of this instant-hit weapon.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DeathMessageActorClass : When set to an EnhancedWeapon or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class, that class' death messages are used instead of this one's.
; name DoublePriorityName : The priority name this weapon uses in dual mode.
; class&lt;[[Legacy:Decal|Decal]]&gt; ExplosionDecal : A decal spawned at the hit location.
; class&lt;[[Legacy:Effects (UT)|Effects (UT)]]&gt; ExplosionEffectClass : This effect is spawned when the projectile explodes.
; name HeadDamageType : Name of the damage type to use for headshots. Use 'Decapitated' to let UT display its &quot;Headshot!&quot; announcement for the killer.
; float HeadShotDamageFactor : The damage done by a headshot is the weapon's Damage multiplied by HeadShotDamageFactor.
; float HeadShotHeight : This defines the height, over which hits are counted as headshots. 0 means the center of the player's collision cylinder, 1 is the top, -1 is the bottom. The value used for UT's sniper rifle is 0.62, which also is the default value here.
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; HeadShotMessage : Custom [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] displayed to both the killer and the victim after a headshot. The LocalMessage class should react to the following switches:
* Message is displayed to the killer
* Message is displayed to the victim
* Message is displayed to the player after a headshot suicide :D
Mods using the EnhancedItems package don't neccessarily need to make a difference here. E.g. both the EnhancedItems Ripper and the Rockets UT Mercury Missiles just use UT's headshot announcement and display it to killer and victim. (This includes Ripper self-headshots. ;))
; name IdenticalTo : Used by the OtherIsA() and ClassIsA() functions in various EnhancedItems base classes to identify an actor or class as being similar to this one. For example, the ERelicDeathInventory class (the Relic of Death pickup of the Enhanced Relics mutator) has IdenticalTo=RelicDeathInventory. This will cause OtherIsA(aPickup, 'RelicDeathInventory') to rturn True not only for actual subclasses of RelicDeathInventory, but also for the ERelicDeathInventory and any other EnhancedItems-based classes that have IdenticalTo=RelicDeathInventory in their default properties.
; float MaxRange : The maximum range of this instant-hit weapon.
; [[Legacy:Mesh|Mesh]] MenuMesh : 
; rotator MenuRotation : 
; float MenuViewScale : 
; float MomentumModifier : How the instigator's DamageScaling affects the momentum applied by this projectile's explosion.
;| = 0 | no effect |
;| &gt; 0 | Momentum becomes higher with a higher DamageScaling value.
;| &lt; 0 | Momentum is reduced with a higher DamageScaling value.&lt;/wiki&gt;
; float MomentumTransfer : Momentum to apply to directly hit actors.
; float Range : Range of a melee weapon.
; name SamePriorityLike : This weapon uses the specified weapon class' priority instead of its own.
; name SplashDamageType : Damage type to use for splash damage.
; float SplashMomentum : Momentum aplied by splash damage.
; float SplashRangeModifier : How the splash range is affected by the instigator's damage scaling. This works the same way as MomentumModifier.
; class&lt;[[Legacy:Projectile (UT)|Projectile (UT)]]&gt; SubMunitionClass : What type of projectiles should be spawned when this projectile explodes.
; int SubMunitionCount : How many sub-projectiles should be spawned.

===Internal===
; bool bDrawingWeapon : Whether the weapon is currently being drawn.
; bool bIsSlave (replicated to owning client) : Whether this is the slave weapon in dual mode.
; int DoubleSwitchPriority : The priority this weapon is assigned in dual mode. 
; EIDeathMessageMutator EIDMM : The EIDeathMessageMutator is spawned by EnhancedWeapons to make the EnhancedItems death messages work.
; EnhancedWeapon SlaveWeapon (replicated to owning client) : A reference to the slave weapon in dual mode.
; float SpeedScale (replicated to owning client) : Used to speed up weapons when under the effect of the Relic of Speed (of Enhanced Relics) or similar powerups.
; EnhancedWeapon MasterWeapon (replicated to client if bIsSlave) : A reference to the master weapon in dual mode.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
;  PreBeginPlay( ) : Finds or spawns the EIDeathMessageMutator.
;  RenderOverlays([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) : Allow HUD mutators and weapon affectors to draw on the canvas right after the weapon has been rendered and before the HUD is drawn.&lt;br /&gt;Note that any number of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] items and one [[Legacy:TournamentPickup|TournamentPickup]] can affect a [[Legacy:TournamentWeapon|TournamentWeapon]] at the same time but only the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] items are allowed to draw on the canvas.

===Inherited From [[Legacy:Weapon (UT)|Weapon (UT)]]===
;  AltFire(float Value)
;  Fire(float Value) : Basic fire and altfire modes for instant-hit and projectile weapons with support for dual mode.
;  SetSwitchPriority([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : If this weapon is replacing another one it might use the same switching priority. Also, if this weapon can have a slave weapon (like Enforcer) it might use a different priority.
; float SwitchPriority( ) : Return the switch priority of the weapon (normally AutoSwitchPriority, but may be modified by environment (or by other factors for bots).

===New Functions===
; name AdjustSplashDamageType([[Legacy:Actor (UT)|Actor (UT)]] Other) : Allowes you to use different damage types for different actors in the slpash area.
; vector CalcZoomedFireOffset( ) : Returns the fire offset when zoomed.
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property)
;  DirectHit(vector HitLocation, [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Damages Other at HitLocation. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used.
; vector EstimatedHitNormal(out vector HitLocation, out [[Legacy:Actor (UT)|Actor (UT)]] HitActor, optional vector CurLocation, optional vector Distance, optional bool bHitLevelOnly, optional vector Extend) : Tries to estimate a projectile's impact location, hit normal and hit actor.
;  ModifySubMunition([[Legacy:Projectile (UT)|Projectile (UT)]] Other) : Allowes you to modify each sub-projectile spawned.
;  OldRenderOverlays([[Legacy:Canvas (UT)|Canvas (UT)]] C) : Called by this class' RenderOverlays() or PreRenderOverlays() function of an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] registered as HUD mutator or a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] registered as affector. It does the actual drawing of the weapon.
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property)
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; ReturnMessageActor( ) : Returns the DeathMessageActorClass if that's a subclass of EnhancedWeapon or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]], otherwise returns this class.
;  SetKillType(bool bSplashHit, bool bHeadHit) : Prepares this class' death messages to be used when a player is killed. Call this function if you use neither DirectDamage() nor SplashDamage() to do damage or kill a player and revert its effect after you're done.
;  SpawnExplosionEffects(vector HitLocation, vector HitNormal) : Spawns an explosion effect.
;  SpawnSubMunition(vector HitLocation, vector HitNormal, int Amount) : Spawns the specified number of sub-projectiles flying into random directions. You can use HitNormal to somewhat restrict the randomness of the projectiles' directions.
;  SplashDamage(optional vector HitLocation, optional [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Similar to the HurtRadius() function, but deals out a direct hit to Other instead of doing splash dmaage to it. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used for the direct hit.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2929</id>
      <timestamp>2004-12-04T23:57:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; EnhancedWeapon (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by Wormbo.

Don't use the DeathMessage variable. For projectile weapons use [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]]s and their death messages and for instant-hit weapons use the new hit strings.

==Properties==

===Globalconfig Properties===
; bool bDropEffects : Whether the weapon should drop some visual effects to increase game performance.

===Localized Properties===
; string DoubleName : Displayed name of the weapon when dual-wielded.
; string MenuName : Name of this weapon displayed in the weapon priority menu. (only in the Advanced Weapon Priority menu and in the Arena Match config window)
; string ProjectileName :  This weapon's projectile name. (used in death messages)

The following properties are death messages and you can use these placeholders in them:

{|

|-
|%k
|Killing player's name 
|-
|%o
|Other (killed) player's name
|-
|%w
|Weapon used to make the kill (not the weapon held while making the kill!)
|-
|%p
|Name of the projectile used
|}
; string DirectHitString : Death message for kills via direct hits.
; string HeadHitString : Death message for headshots (if the projectile can cause headshots, see next section).
; string HeadSuicideFString : Suicide message for female models for self-headshots.
; string HeadSuicideString : Suicide message for male models for self-headshots.
; string SplashHitString : Death message for kills via splash damage.
; string SuicideFString : Suicide message for female models for suicides via direct hit or splash damage.
; string SuicideString : Suicide message for male models for suicides via direct hit or splash damage.

===Other Properties===
; bool bCanHeadShoot : Whether this weapon behaves differently (different damage and/or death message) when it hits a player's head.
; bool bConstantSplashDamage : Whether the weapon's explosion splash damage is the same in the whole splash area. Keep this set to False if the damage should fall off linearly with the distance to the impact location.
; bool bCustomDrawSlave : The class whats to handle drawing the slave weapon (when dual-wielded) itself.
; float Damage : Damage done by this instant-hit weapon.
; float DamageRadius : Splash damage range of this instant-hit weapon.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; DeathMessageActorClass : When set to an EnhancedWeapon or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]] class, that class' death messages are used instead of this one's.
; name DoublePriorityName : The priority name this weapon uses in dual mode.
; class&lt;[[Legacy:Decal|Decal]]&gt; ExplosionDecal : A decal spawned at the hit location.
; class&lt;[[Legacy:Effects (UT)|Effects (UT)]]&gt; ExplosionEffectClass : This effect is spawned when the projectile explodes.
; name HeadDamageType : Name of the damage type to use for headshots. Use 'Decapitated' to let UT display its &quot;Headshot!&quot; announcement for the killer.
; float HeadShotDamageFactor : The damage done by a headshot is the weapon's Damage multiplied by HeadShotDamageFactor.
; float HeadShotHeight : This defines the height, over which hits are counted as headshots. 0 means the center of the player's collision cylinder, 1 is the top, -1 is the bottom. The value used for UT's sniper rifle is 0.62, which also is the default value here.
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; HeadShotMessage : Custom [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] displayed to both the killer and the victim after a headshot. The LocalMessage class should react to the following switches:
* Message is displayed to the killer
* Message is displayed to the victim
* Message is displayed to the player after a headshot suicide :D
Mods using the EnhancedItems package don't neccessarily need to make a difference here. E.g. both the EnhancedItems Ripper and the Rockets UT Mercury Missiles just use UT's headshot announcement and display it to killer and victim. (This includes Ripper self-headshots. ;))
; name IdenticalTo : Used by the OtherIsA() and ClassIsA() functions in various EnhancedItems base classes to identify an actor or class as being similar to this one. For example, the ERelicDeathInventory class (the Relic of Death pickup of the Enhanced Relics mutator) has IdenticalTo=RelicDeathInventory. This will cause OtherIsA(aPickup, 'RelicDeathInventory') to rturn True not only for actual subclasses of RelicDeathInventory, but also for the ERelicDeathInventory and any other EnhancedItems-based classes that have IdenticalTo=RelicDeathInventory in their default properties.
; float MaxRange : The maximum range of this instant-hit weapon.
; [[Legacy:Mesh|Mesh]] MenuMesh : 
; rotator MenuRotation : 
; float MenuViewScale : 
; float MomentumModifier : How the instigator's DamageScaling affects the momentum applied by this projectile's explosion.
;| = 0 | no effect |
;| &gt; 0 | Momentum becomes higher with a higher DamageScaling value.
;| &lt; 0 | Momentum is reduced with a higher DamageScaling value.&lt;/wiki&gt;
; float MomentumTransfer : Momentum to apply to directly hit actors.
; float Range : Range of a melee weapon.
; name SamePriorityLike : This weapon uses the specified weapon class' priority instead of its own.
; name SplashDamageType : Damage type to use for splash damage.
; float SplashMomentum : Momentum aplied by splash damage.
; float SplashRangeModifier : How the splash range is affected by the instigator's damage scaling. This works the same way as MomentumModifier.
; class&lt;[[Legacy:Projectile (UT)|Projectile (UT)]]&gt; SubMunitionClass : What type of projectiles should be spawned when this projectile explodes.
; int SubMunitionCount : How many sub-projectiles should be spawned.

===Internal===
; bool bDrawingWeapon : Whether the weapon is currently being drawn.
; bool bIsSlave (replicated to owning client) : Whether this is the slave weapon in dual mode.
; int DoubleSwitchPriority : The priority this weapon is assigned in dual mode. 
; EIDeathMessageMutator EIDMM : The EIDeathMessageMutator is spawned by EnhancedWeapons to make the EnhancedItems death messages work.
; EnhancedWeapon SlaveWeapon (replicated to owning client) : A reference to the slave weapon in dual mode.
; float SpeedScale (replicated to owning client) : Used to speed up weapons when under the effect of the Relic of Speed (of Enhanced Relics) or similar powerups.
; EnhancedWeapon MasterWeapon (replicated to client if bIsSlave) : A reference to the master weapon in dual mode.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
;  PreBeginPlay( ) : Finds or spawns the EIDeathMessageMutator.
;  RenderOverlays([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) : Allow HUD mutators and weapon affectors to draw on the canvas right after the weapon has been rendered and before the HUD is drawn.&lt;br /&gt;Note that any number of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] items and one [[Legacy:TournamentPickup|TournamentPickup]] can affect a [[Legacy:TournamentWeapon|TournamentWeapon]] at the same time but only the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] items are allowed to draw on the canvas.

===Inherited From [[Legacy:Weapon (UT)|Weapon (UT)]]===
;  AltFire(float Value)
;  Fire(float Value) : Basic fire and altfire modes for instant-hit and projectile weapons with support for dual mode.
;  SetSwitchPriority([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : If this weapon is replacing another one it might use the same switching priority. Also, if this weapon can have a slave weapon (like Enforcer) it might use a different priority.
; float SwitchPriority( ) : Return the switch priority of the weapon (normally AutoSwitchPriority, but may be modified by environment (or by other factors for bots).

===New Functions===
; name AdjustSplashDamageType([[Legacy:Actor (UT)|Actor (UT)]] Other) : Allowes you to use different damage types for different actors in the slpash area.
; vector CalcZoomedFireOffset( ) : Returns the fire offset when zoomed.
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns, whether a class is of a specific type or identical to that type. (see IdenticalTo property)
;  DirectHit(vector HitLocation, [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Damages Other at HitLocation. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used.
; vector EstimatedHitNormal(out vector HitLocation, out [[Legacy:Actor (UT)|Actor (UT)]] HitActor, optional vector CurLocation, optional vector Distance, optional bool bHitLevelOnly, optional vector Extend) : Tries to estimate a projectile's impact location, hit normal and hit actor.
;  ModifySubMunition([[Legacy:Projectile (UT)|Projectile (UT)]] Other) : Allowes you to modify each sub-projectile spawned.
;  OldRenderOverlays([[Legacy:Canvas (UT)|Canvas (UT)]] C) : Called by this class' RenderOverlays() or PreRenderOverlays() function of an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] registered as HUD mutator or a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] registered as affector. It does the actual drawing of the weapon.
; bool OtherIsA([[Legacy:Actor (UT)|Actor (UT)]] Other, name DesiredType) : Returns, whether an actor is of a specific type or identical to that type. (see IdenticalTo property)
;  RestoreKillType( ) : Reverts the effect of SetKillType(). Call this exactly as often as SetKillType() after doing damage or directly killing players.
; class&lt;[[Legacy:Actor (UT)|Actor (UT)]]&gt; ReturnMessageActor( ) : Returns the DeathMessageActorClass if that's a subclass of EnhancedWeapon or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedProjectile]], otherwise returns this class.
;  SetKillType(bool bSplashHit, bool bHeadHit) : Prepares this class' death messages to be used when a player is killed. Call this function if you use neither DirectDamage() nor SplashDamage() to do damage or kill a player and revert its effect after you're done.
;  SpawnExplosionEffects(vector HitLocation, vector HitNormal) : Spawns an explosion effect.
;  SpawnSubMunition(vector HitLocation, vector HitNormal, int Amount) : Spawns the specified number of sub-projectiles flying into random directions. You can use HitNormal to somewhat restrict the randomness of the projectiles' directions.
;  SplashDamage(optional vector HitLocation, optional [[Legacy:Actor (UT)|Actor (UT)]] Other, optional vector HitNormal, optional bool bSpecialHit) : Similar to the HurtRadius() function, but deals out a direct hit to Other instead of doing splash dmaage to it. bSpecialHit tells whether the headshot death mesages of the ''regular'' damage type should be used for the direct hit.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/INT Files</title>
    <id>1107</id>
    <revision>
      <id>2922</id>
      <timestamp>2003-10-19T12:23:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Weapon Declaration In EnhancedItems-based Mods ==

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Description'''
|'''Explanation''' 
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|&quot;Weapon Name,Group&quot;
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Used by Arena Match and Advanced Weapon Priority.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|&quot;Weapon Name,Group&quot;
|Registers weapons that are a subclass of [[TournamentWeapon
|-
|Weapons (EnhancedItems mods)
|&lt;code&gt;EnhancedItems.EnhancedWeapon&lt;/code&gt;
|EnhancedWeapon subclass
|&quot;Replaced Class,Weapon Name,Group&quot;
|Registers weapons that are a subclass of EnhancedWeapon that should ''not'' appear in the weapon priority list. The Replaced Class specifies a weapon class to replace in the weapon priority window. Usually it should be left empty or None.
|-
|Packages (.U files)
|&lt;code&gt;Engine.Info&lt;/code&gt;
|any [[Legacy:Info (UT)|Info (UT)]] subclass (will be ignored)
|&quot;Package Name,Mod Name,Short Mod Name&quot;
|Assigns a mod name and an optional short name to packages.
|-
|EIChallengeHUD player icons
|&lt;code&gt;EIChallengeHUD.CustomHUDIcon&lt;/code&gt;
|EIChallengeHUD.CustomHUDIcon subclass
|&quot;[[Legacy:HUD (UT)|HUD (UT)]] subclass&quot;
|Assigns a special player status icon based on EIChallengeHUD to the specified HUD class. This could be used to write special EIChallengeHUD icons for HUDs that have their own extensions to the player icon.
|}

====Sample INT File ====

&lt;pre&gt;
[Public]
Object=(Name=BUFPack1.Cheeselocator,Class=Class,MetaClass=EnhancedItems.EnhancedWeapon,Description=&quot;None,Cheeselocator,Weird Weapons&quot;)
Object=(Name=BUFPack1.PoopRifle,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Poop Rifle,Weird Weapons&quot;)
Object=(Name=BUFPack1.SmilieLauncher,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Smiley Launcher,Weird Weapons&quot;)
Object=(Name=BUFPack1.SheepLauncher,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Super Sheep,Weird Weapons&quot;)
Object=(Name=BUFPack1.Railgun,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Railgun,Realistic Weapons&quot;)
Object=(Name=BUFPack1.IGRailgun,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Railgun (InstaGib),Realistic Weapons&quot;)
Object=(Name=Engine.GameInfo,Class=Class,MetaClass=Engine.Info,Description=&quot;BUFPack1,BeyondUnreal Bonuspack,BUF Pack&quot;)
&lt;/pre&gt;

This INT file will create the following menu structure in Arena Match:
* BeyondUnreal Bonuspack (Realistic Weapons)
** Railgun
** Railgun (InstaGib)
* BeyondUnreal Bonuspack (Weird Weapons)
** Cheeselocator
** Poop Rifle
** Smiley Launcher
** Super Sheep

The same INT file only creates entries in the Advanced Weapon Priority for the weapons declared with MetaClass=Botpack.TournamentWeapon: ''Railgun'', ''Railgun (InstaGib)'', ''Poop Rifle'', ''Smiley Launcher'' and ''Super Sheep''.

All those weapons are actually subclasses of EnhancedWeapon, but the Cheeselocator uses the priority setting of the [[Legacy:Translocator|Translocator]]. (This can be set in defaultproperties of EnhancedWeapon subclasses.)

==Other Uses For INT Files ==

===Dynamically Adding Tabs To A Config Window ===

The &quot;Configure Wormbo's Mods&quot; window uses INT files to load the tabs displayed in it. This window is used by the Enhanced Items mod, Enhanced Relics, Combo InstaGib and some other mods.

The mod comes with the EIConfigWindow package (which contains the EIPageWindow class) and has an INT file entry like this:
 Object=(Name=ComboInstaGib.EIConfigPageCIGDM,Class=Class,MetaClass=EIConfigWindow.EIPageWindow,Description=&quot;Combo InstaGib,150,50&quot;)

Description consists of &quot;Caption,Minimum Width,Minimum Height&quot;.

The same method is used for Rockets UT, the BUF Bonuspack and the upcoming version of Arena Match.

----

==Related Topics ==
*[[Legacy:INT File|INT file]]

----

==Comments ==

'''Wormbo:''' Feel free to ask for more details. :)</text>
    </revision>
    <revision>
      <id>2923</id>
      <timestamp>2002-09-07T20:32:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Weapon Declaration In EnhancedItems-based Mods ==

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Description'''
|'''Explanation''' 
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|&quot;Weapon Name,Group&quot;
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Used by Arena Match and Advanced Weapon Priority.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|&quot;Weapon Name,Group&quot;
|Registers weapons that are a subclass of [[TournamentWeapon
|-
|Weapons (EnhancedItems mods)
|&lt;code&gt;EnhancedItems.EnhancedWeapon&lt;/code&gt;
|EnhancedWeapon subclass
|&quot;,Weapon Name,Group&quot;
|Registers weapons that are a subclass of EnhancedWeapon that should not appear in the weapon priority list. (The first comma in the description really is supposed to be there.)
|-
|Packages (.U files)
|&lt;code&gt;Engine.Info&lt;/code&gt;
|[[Legacy:Info (UT)|Info (UT)]] subclass (not used)
|&quot;Package Name,Mod Name,Short Mod Name&quot;
|Assigns a mod name and an optional short name to packages.
|}

====Sample INT File ====

&lt;pre&gt;
[Public]
Object=(Name=RocketsUT.ESLauncher,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Earth Shaker Launcher,Descent weapons&quot;)
Object=(Name=RocketsUT.BSLauncher,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Black Shark Launcher,Descent weapons&quot;)
Object=(Name=RocketsUT.RUT_Redeemer,Class=Class,MetaClass=EnhancedItems.EnhancedWeapon,Description=&quot;,Redeemer&quot;)
Object=(Name=RocketsUT.MercLauncher,Class=Class,MetaClass=Botpack.TournamentWeapon,Description=&quot;Mercury Missile Launcher,Descent weapons&quot;)
Object=(Name=RocketsUT.IGMercLauncher,Class=Class,MetaClass=EnhancedItems.EnhancedWeapon,Description=&quot;,InstaGib Mercury Launcher&quot;)
Object=(Name=Engine.GameInfo,Class=Class,MetaClass=Engine.Info,Description=&quot;RocketsUT,Rockets UT&quot;)
&lt;/pre&gt;

This INT file will create the following menu structure in Arena Match:
* Rockets UT
** InstaGib Mercury Launcher
** Redeemer
* Rockets UT (Descent weapons)
** Black Shark Launcher
** Mercury Missile Launcher
** Earth Shaker Launcher

The same INT file only creates entries in the Advanced Weapon Priority for the weapons declared with MetaClass=Botpack.TournamentWeapon: ''Black Shark Launcher'', ''Earth Shaker Launcher'' and ''Mercury Missile Launcher''.

All five weapons are subclasses of EnhancedWeapon, but the RUT_Redeemer uses the priority setting of Botpack.WarheadLauncher and IGMercLauncher uses the priority setting of MercLauncher. (This can be set in defaultproperties of EnhancedWeapon classes.)

==Other Uses For INT Files ==

===Dynamically Adding Tabs To A Config Window ===

The &quot;Configure Wormbo's Mods&quot; window uses INT files to load the tabs displayed in it. This window is used by the Enhanced Items mod, Enhanced Relics, Combo InstaGib and some other mods.

The mod comes with the EIConfigWindow package (which contains the EIPageWindow class) and has an INT file entry like this:
 Object=(Name=ComboInstaGib.EIConfigPageCIGDM,Class=Class,MetaClass=EIConfigWindow.EIPageWindow,Description=&quot;Combo InstaGib,150,50&quot;)

Description consists of &quot;Caption,Minimum Width,Minimum Height&quot;.

The same method is used for Rockets UT, the BUF Bonuspack and the upcoming version of Arena Match.

----

==Related Topics ==
*[[Legacy:INT File|INT file]]

----

==Comments ==

Feel free to ask for more details. :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/MIConverter</title>
    <id>1117</id>
    <revision>
      <id>2942</id>
      <timestamp>2007-11-19T14:03:30Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; MIConverter (Package: MIConverter)}}

This is a utility class for the [[Legacy:EnhancedItems|EnhancedItems]] package by [[Legacy:Wormbo|Wormbo]].

This class is spawned by an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]], but not added to the [[Legacy:Linked List|linked list]] of mutators.&lt;br /&gt;The MIConverter replaces all ChaosUT MultiItems with [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] items, except for those which have only one item in the list. These will be converted directly to the item. These MPP will go into emulation mode so they behave (almost) like a MultiItem but are compatible with every EnhancedMutator's CheckMPP function. You can stop the emulation mode by calling the MPP's StopEmulation() function at any time.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2943</id>
      <timestamp>2004-12-22T15:52:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] &gt;&gt; MIConverter (Package: MIConverter)}}

This is a utility class for the [[Legacy:EnhancedItems|EnhancedItems]] package by [[Legacy:Wormbo|Wormbo]].

This class is spawned by an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]], but not added to the [[Legacy:Linked List|linked list]] of mutators.&lt;br /&gt;The MIConverter replaces all ChaosUT MultiItems with [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] items, except for those which have only one item in the list. These will be converted directly to the item. These MPP will go into emulation mode so they behave (almost) like a MultiItem but are compatible with every EnhancedMutator's CheckMPP function. You can stop the emulation mode by calling the MPP's StopEmulation() function at any time.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/MultiPickupPlus</title>
    <id>1116</id>
    <revision>
      <id>2940</id>
      <timestamp>2007-11-19T14:03:41Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; MultiPickupPlus (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

See [[Legacy:MultiPickupBase|MultiPickupBase]] for a UT2003 version of this custom class.

==Features==
* spawns one of up to 20 different item classes
* the next item is chosen either randomly or in the order given in the Items array (see bRandomChoosing, RejectChance[])
* the next item is spawned after the previous one was picked up or a certein amount of time has passed (see bEmulateMultiItem, StopEmulation(), Duration[] and DefaultDuration)
* before the first item is spawned an initial interval of time set for this item has to pass (can be set individually for each item, can be zero)
* each [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] may change values after the MultiPickupPlus has been initialized through the mutator's CheckMPP() function

==Constants==
; MaxNumItems = 20 : Maximum number of items classes supported by the MultiPickupPlus.

==Properties==

===Advanced Group===
; bool bNoEmulation (globalconfig) : Whether MultiItem emulation is allowed or not. When this is true, bEmulateMultiItem and bEmulateWhenCoopMode have no effect. &quot;MultiItem emulation&quot; means, that spawned items should be swapped after some time if they didn't get picked up, like it's done by the Chaos UT MultiItem.

===MultiPickupPlus Group===
; bool bAllowItemFall : Whether spawned items may have PHYS_Falling.
; bool bAllowItemRotation : Whether spawned items may rotate.
; bool bEmulateMultiItem : Enable &quot;MultiItem emulation&quot;, i.e. swap out items that don't get picked up after a while.
; bool bEmulateWhenCoopMode : Enable MultiItem emulation for weapons when the &quot;Weapons Stay&quot; option (aka. coop weapon mode) is enabled. (recommended)
; bool bForceItemFall : Force PHYS_Falling on newly spawned items.
; bool bForceItemRotation : Force the newly spawned item's bRotatingPickup property to be set to True.
; bool bNoMutatorCheck : Don't let any mutator receive CheckMPP() calls from this MultiPickupPlus.
; bool bRandomChoosing : Select items randomly from the Items list.
; float DefaultDuration : Default duration items stay around in MultiItem emulation mode.
; float Duration[20] : Duration for each item.
; float InitRespawnTime[20] : Initial spawn delay for each item type.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; Item[20] : The item classes this MultiPickupBase should spawn.
; vector LocationOffset[20] : Location offsets for each item type. (allowes to compensate differnt item sizes, although this usually should be neccessary)
; int NumItems : Number of slots used. This will be clamped to the actual number of items in the MultiPickupBase if it's higher that that, but it will also remove any items with a higher index.
; float RejectChance[20] : Chance for an item to get rejected when randomly selecting the next item chass.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; ReplacedItem : The item that was originally in the location the MultiPickupBase now occupies. This is usually only used when a mutator has replayed that item with the MultiPickupBase.

===Internal Variables===
; bool bDebugMode : Enables debug logging. Set to the value of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]].bDebugMode in PreBeginPlay().
; bool bNotified : Set to True after all mutators have been notified about the new MultiPickupPlus.
; bool bStarted : Set to True after the first item has been spawned.
; int CheckCounter : Used to detect infinite loops while choosing a new item to spawn.
; [[Legacy:Mutator (UT)|Mutator (UT)]] CreatedBy : Reference to the mutator that spawned this MultiPickupPlus. This [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]] will not receive a CheckMPP() call by the MultiPickupPlus.
; [[Legacy:Inventory (UT)|Inventory (UT)]] CurItem : Item currently spawned.
; int CurItemIndex : Index of currently selected item.
; float CurTime : How long the currently spawned item is already there.
; byte ImportedFromMI[20] : Contains 1 for every item imported from a Chaos UT MultiItem by the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]].
; int PrevItemIndex : Index of item spawned before the current item.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
;  PreBeginPlay( ) : Initializes the MultiPickupPlus, checks its location in the world and Compact()s the Items list.

===Inherited From [[Legacy:Inventory (UT)|Inventory (UT)]]===
; float BotDesireability([[Legacy:Pawn (UT)|Pawn (UT)]] Bot) : 

===New Functions===
; bool AddItem(coerce string NewItem, optional vector NewItemOffset, optional float NewInitTime, optional float NewChance, optional float NDuration) : Add a new item class to the MultiPickupPlus.
; vector AdjustLocation(int ItemIndex) : Returns the spawn location for the specified item index.
; bool AlwaysKeep(class&lt;Inventory&gt; ItemClass) : Returns, whether an item should be kept in the Items list. Sends AlwaysKeepInMPP() calls to all [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]] mutators and returns True as soon as one of them returns True.
; bool AnyClassIsA(coerce string LookFor, out int Index, optional bool bCheckReplaced) : Returns True if any of the classes in the MultiPickupPlus is of the specified type using the ClassIsA() function.
;  CheckLocation( ) : Adjusts the MultiPickupPlus' location so it won't try to spawn items inside world geometry. This is neccessary because sometimes it doesn't properly fit into a replaced item's location.
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns whether a class is of a specified type.
;  Compact( ) : Removes empty slots in the Items list.
;  DisableCoopMode( ) : Disables &quot;Weapons Stay&quot; mode.
; bool FindItem(name LookFor, out int Index, optional bool bIdenticalClasses, optional bool bCheckReplaced ) : Returns True if the specified item type is found.
; bool InItem(class&lt;Inventory&gt; LookFor, out int Index, optional bool bSubClasses, optional bool bCheckReplaced ) : Returns True if the specified item type is found.
; class&lt;Inventory&gt; LoadItem(coerce string ItemClass) : Tries to load the specified [[Legacy:Inventory (UT)|Inventory (UT)]] class and returns it on success.
;  NotifyMutators( ) : Sends CheckMPP() calls to all [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]]s except the mutator that spawned this MultiPickupPlus.
; bool RemoveItem(int ItemIndex) : Removes an item from the MultiPickupPlus.
; bool ReplaceItem(int ItemIndex, coerce string NewItem, optional vector NewItemOffset, optional float InitTime, optional float Chance, optional float NDuration, optional bool AlwaysAdd ): 
;  StopEmulation( ) : Stops MultiItem emulation.

==Known Subclasses==
* ArrowPackMPP (Enhanced Chaos Item)
* RandomRocketMPP (RocketsUT)

(Most MPPs in EnhancedItems-based mods are generated on-the-fly.)

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2941</id>
      <timestamp>2004-12-22T16:17:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; MultiPickupPlus (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

See [[Legacy:MultiPickupBase|MultiPickupBase]] for a UT2003 version of this custom class.

==Features==
* spawns one of up to 20 different item classes
* the next item is chosen either randomly or in the order given in the Items array (see bRandomChoosing, RejectChance[])
* the next item is spawned after the previous one was picked up or a certein amount of time has passed (see bEmulateMultiItem, StopEmulation(), Duration[] and DefaultDuration)
* before the first item is spawned an initial interval of time set for this item has to pass (can be set individually for each item, can be zero)
* each [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] may change values after the MultiPickupPlus has been initialized through the mutator's CheckMPP() function

==Constants==
; MaxNumItems = 20 : Maximum number of items classes supported by the MultiPickupPlus.

==Properties==

===Advanced Group===
; bool bNoEmulation (globalconfig) : Whether MultiItem emulation is allowed or not. When this is true, bEmulateMultiItem and bEmulateWhenCoopMode have no effect. &quot;MultiItem emulation&quot; means, that spawned items should be swapped after some time if they didn't get picked up, like it's done by the Chaos UT MultiItem.

===MultiPickupPlus Group===
; bool bAllowItemFall : Whether spawned items may have PHYS_Falling.
; bool bAllowItemRotation : Whether spawned items may rotate.
; bool bEmulateMultiItem : Enable &quot;MultiItem emulation&quot;, i.e. swap out items that don't get picked up after a while.
; bool bEmulateWhenCoopMode : Enable MultiItem emulation for weapons when the &quot;Weapons Stay&quot; option (aka. coop weapon mode) is enabled. (recommended)
; bool bForceItemFall : Force PHYS_Falling on newly spawned items.
; bool bForceItemRotation : Force the newly spawned item's bRotatingPickup property to be set to True.
; bool bNoMutatorCheck : Don't let any mutator receive CheckMPP() calls from this MultiPickupPlus.
; bool bRandomChoosing : Select items randomly from the Items list.
; float DefaultDuration : Default duration items stay around in MultiItem emulation mode.
; float Duration[20] : Duration for each item.
; float InitRespawnTime[20] : Initial spawn delay for each item type.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; Item[20] : The item classes this MultiPickupBase should spawn.
; vector LocationOffset[20] : Location offsets for each item type. (allowes to compensate differnt item sizes, although this usually should be neccessary)
; int NumItems : Number of slots used. This will be clamped to the actual number of items in the MultiPickupBase if it's higher that that, but it will also remove any items with a higher index.
; float RejectChance[20] : Chance for an item to get rejected when randomly selecting the next item chass.
; class&lt;[[Legacy:Inventory (UT)|Inventory (UT)]]&gt; ReplacedItem : The item that was originally in the location the MultiPickupBase now occupies. This is usually only used when a mutator has replayed that item with the MultiPickupBase.

===Internal Variables===
; bool bDebugMode : Enables debug logging. Set to the value of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]].bDebugMode in PreBeginPlay().
; bool bNotified : Set to True after all mutators have been notified about the new MultiPickupPlus.
; bool bStarted : Set to True after the first item has been spawned.
; int CheckCounter : Used to detect infinite loops while choosing a new item to spawn.
; [[Legacy:Mutator (UT)|Mutator (UT)]] CreatedBy : Reference to the mutator that spawned this MultiPickupPlus. This [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]] or [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]] will not receive a CheckMPP() call by the MultiPickupPlus.
; [[Legacy:Inventory (UT)|Inventory (UT)]] CurItem : Item currently spawned.
; int CurItemIndex : Index of currently selected item.
; float CurTime : How long the currently spawned item is already there.
; byte ImportedFromMI[20] : Contains 1 for every item imported from a Chaos UT MultiItem by the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MIConverter]].
; int PrevItemIndex : Index of item spawned before the current item.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
;  PreBeginPlay( ) : Initializes the MultiPickupPlus, checks its location in the world and Compact()s the Items list.

===Inherited From [[Legacy:Inventory (UT)|Inventory (UT)]]===
; float BotDesireability([[Legacy:Pawn (UT)|Pawn (UT)]] Bot) : 

===New Functions===
; bool AddItem(coerce string NewItem, optional vector NewItemOffset, optional float NewInitTime, optional float NewChance, optional float NDuration) : Add a new item class to the MultiPickupPlus.
; vector AdjustLocation(int ItemIndex) : Returns the spawn location for the specified item index.
; bool AlwaysKeep(class&lt;Inventory&gt; ItemClass) : Returns, whether an item should be kept in the Items list. Sends AlwaysKeepInMPP() calls to all [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]] mutators and returns True as soon as one of them returns True.
; bool AnyClassIsA(coerce string LookFor, out int Index, optional bool bCheckReplaced) : Returns True if any of the classes in the MultiPickupPlus is of the specified type using the ClassIsA() function.
;  CheckLocation( ) : Adjusts the MultiPickupPlus' location so it won't try to spawn items inside world geometry. This is neccessary because sometimes it doesn't properly fit into a replaced item's location.
; bool ClassIsA(class aClass, coerce string DesiredType) : Returns whether a class is of a specified type.
;  Compact( ) : Removes empty slots in the Items list.
;  DisableCoopMode( ) : Disables &quot;Weapons Stay&quot; mode.
; bool FindItem(name LookFor, out int Index, optional bool bIdenticalClasses, optional bool bCheckReplaced ) : Returns True if the specified item type is found.
; bool InItem(class&lt;Inventory&gt; LookFor, out int Index, optional bool bSubClasses, optional bool bCheckReplaced ) : Returns True if the specified item type is found.
; class&lt;Inventory&gt; LoadItem(coerce string ItemClass) : Tries to load the specified [[Legacy:Inventory (UT)|Inventory (UT)]] class and returns it on success.
;  NotifyMutators( ) : Sends CheckMPP() calls to all [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedMutator]]s and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedArena]]s except the mutator that spawned this MultiPickupPlus.
; bool RemoveItem(int ItemIndex) : Removes an item from the MultiPickupPlus.
; bool ReplaceItem(int ItemIndex, coerce string NewItem, optional vector NewItemOffset, optional float InitTime, optional float Chance, optional float NDuration, optional bool AlwaysAdd ): 
;  StopEmulation( ) : Stops MultiItem emulation.

==Known Subclasses==
* ArrowPackMPP (Enhanced Chaos Item)
* RandomRocketMPP (RocketsUT)

(Most MPPs in EnhancedItems-based mods are generated on-the-fly.)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/PickupPlus</title>
    <id>1122</id>
    <revision>
      <id>2952</id>
      <timestamp>2008-02-12T21:11:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup (UT)|TournamentPickup (UT)]] &gt;&gt; PickupPlus (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Features==
* Global sound effects for respawn and pickup (heard by all players)
* aura effects for the pickup itself and the owning player
* stackable damage/speed/jump-height/air-control factors for owning player and his selected weapon (fixes the jumpboots bug when using speed relic; the weapon must be an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] to support speed scaling)
* new armor and damagetype functions
* weapon affector chain to allow more than one item to affect a weapon (use ''FireFunction()'' and set ''bFireEffectLast'' to true or false instead of using ''FireEffect()'')
* may draw on HUD before and after weapon is drawn if it is a weapon affector and the weapon is an [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EnhancedWeapon]] (see ''PreRenderOverlaysFor()'')

==Constants==
; MaxDamageFactor = 10.0
; MinDamageFactor = 0.3 : Damage factor range any combination of PickupPlus items can achieve.

; MaxSpeedFactor = 2.5
; MinSpeedFactor = 0.3 : Weapon and movement speed factor range any combination of PickupPlus items can achieve.

==Properties==
; int AltCharge : An alternate charge value provided for armor items whose charge should not be added up for the total armor amount.
; bool bAltCharge : Whether this item uses ''AltCharge'' instead of the ''Charge'' property.
; float BlinkIcon : A generic variable for a blinking effect. Various subclasses use this in different ways.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIDeathMessageMutator]] EIDMM : Reference to the currently active EnhancedItems death message mutator responsible for creating the enhanced death messages. See ''SetKillType()'' and ''RestoreKillType()'' functions.
; [[Legacy:Pawn (UT)|Pawn (UT)]] PawnOwner : The pawn owning this item.

===Globally Configurable Properties===
; bool bDebugMode : Enables EnhancedItems debug mode. In debug mode, various EnhancedItems classes will log certain events, such as registering HUD mutators, performing [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiPickupPlus]] actions, verifying PickupPlus chain etc.
; bool bDrawShieldOverWeapon : The item may draw a shield effect on the weapon.
; bool bDropEffects : Specifies whether the actor should drop some visual effects for slower machines.
; bool bEnhancedStatusDoll : Whether the EIChallengeHud mutator should automatically be loaded in order to display a customized player status icon.
; string DecimalChar : Decimal point character for customizing distance display strings.
; int UsedUnit : Prefered distance unit's index. (see localized unit properties)

===Localized Properties===
; string UnitDisplay[4] : Short name of distance units.
; string UnitFullName[4] : Full name of distance units.
; float UnitRatio[4] : Conversion ratio of distance units. (factor relative to unit 0)

===Weapon-related Properties===
; [[Legacy:TournamentWeapon|TournamentWeapon]] AffectedWeapon : The weapon this PickupPlus is currently registered to as affector.
; [[Legacy:TournamentPickup (UT)|TournamentPickup (UT)]] NextAffector : The next TournamentPickup in the affectors chain. This chain can contain any number of PickupPlus items and optionally also one TournamentPickup. Since TournamentPickups don't support an affectors chain, they are always placed last.
; bool bFireEffectLast : Whether this item's ''FireFunction()'' should be called after later affectors' ''FireEffect()'' or ''FireFunction()''.

===Pickup-related Properties===
; bool bAllowSameClassPickup : Whether this item can be picked up if another item of the same class is already in the player's inventory.
; bool bDeniedAnnounce : Whether nearby players should receive a &quot;Denied&quot; sound notification when this item is picked up.
; sound DeniedAnnounce : The &quot;Denied&quot; sound to play.
; float DeniedRadius : The radius to look for players who should hear the &quot;Denied&quot; sound.
; sound GlobalPickupSound : A sound that is heared by all players on the map when this item is picked up.
; sound GlobalRespawnSound : A sound that is heared by all players in the map when this item respawns.
; name IdenticalTo : Used by ''ClassIsA()'' and ''OtherIsA()'' functions to mark this pickup class as identical to another class.

; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] PickupShellEffect : An aura/shield effect around the pickup itself, which is created through the following two properties.
; [[Legacy:Texture (UT)|Texture (UT)]] PickupShellSkin : The texture to use for the pickup shell.
; class&lt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]&gt; PickupShellType : The pickup shell class to use.

; name ReplaceTag : Used to prevent multiple similar items in a player's inventory. When picked up, other PickupPlus items in the player's inventory with the same ReplaceTag are removed.

===Player-modifying Properties===
; float AddToBuoyancyFactor : Factor for the player's buoyancy, i.e. how well the player floats in water.
; float AddToDamageFactor : Factor for the player's damage output.
; float AddToJumpZFactor : Factor for the player's jump strength.
; float AddToMassFactor : Factor for the player's mass. Affects momentum received from hits.
; float AddToOwnerSpeed : Factor for for player's movement speed.
; float AddToSpeedFactor : Factor for player's weapon firing speed. (only affects [[Legacy:EnhancedWeapon|EnhancedWeapon]]s)
; bool bDeactivatable : Whether the item can be deactivated while it's in the player's inventory.
; bool bIsSpecialArmor : This armor item absorbs damage without draining its (alt)charge. This is used e.g. by the Enhanced Relic of Defense or the Q3T Battle Suit.
; bool bNeverAutoActivate : Whether the item must be activated manually after being picked up.
; bool bPawnDamageUp : Whether the player's damage is modified by this item.
; bool bPawnMassAffect : Whether the player's mass is modified by this item.
; bool bPawnSpeedUp : Whether the player's movement speed is modified by this item.
; bool bWeaponSpeedUp : Whether the player's weapon firing speed is modified by this item.
; float DesiredAirControl : Desired value for the player's air control.
; float ProtectedDamageFactor : Factor for damage of type ''ProtectionType''.

===Display Properties===
; bool bIsBeltArmor : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsBeltSpecial : This item should be displayed as special item in the &quot;belt&quot; slot.
; bool bIsBootsArmor : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsChestArmor : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsChestSpecial : This item should be displayed as special item in the &quot;belt&quot; slot.
; bool bIsGlovesArmor : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsGlovesSpecial : This item should be displayed as special item in the &quot;belt&quot; slot.
; bool bIsJumpBoots : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsShieldArmor : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsShieldSpecial : This item should be displayed as special item in the &quot;belt&quot; slot.
; bool bIsThighArmor : This item should be displayed as an armor item in the &quot;belt&quot; slot.
; bool bIsThighSpecial : This item should be displayed as special item in the &quot;belt&quot; slot.
; bool bMakesInvisible : Whether this item currently makes the player invisible.
; bool bRenderOverlays : Whether this item wants to do something right before or after weapon overlays are rendered.
; bool bShellAlwaysOn : Whether the player is always surrounded by an aura or shield effect.
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] ShellEffect : A reference to the shell effect spawned for the player.
; [[Legacy:Texture (UT)|Texture (UT)]] ShellSkin : The texture to apply to the player's shell effect.
; class&lt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]&gt; ShellType : The type of shell effect to spawn for the player.

----

[[:Category:Legacy Custom Class (UT)]]

[[:Category:Legacy To Do]] &amp;ndash; functions list
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/PlayerShell</title>
    <id>1114</id>
    <revision>
      <id>2936</id>
      <timestamp>2007-11-19T14:03:49Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; PlayerShell (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
; PostBeginPlay( ) : Calculates the maximum size offset.

===Inherited From [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]===
; ShowMe( ) : Sets the mesh and drawscale to the owning player's values.

===New Methods===
; byte GetIdealFatness(int FatnessOffset) : Returns a good fatness offset.
; int GetMaxOffset( ) : Returns the maximum possible fatness offset.

==Some Subclasses in EnhancedItems-based Mods==
* AuraShell &amp;ndash; Base class of effects used by the auras in Wizzard UT, a mod (maybe too?) heavily inspired by Diablo 2. It's unfinished and will never be released officially, so here's a link: http://www.koehler-homepage.de/Wormbo/other/WizzardUT.zip (You also need to download the [[Legacy:EnhancedItems|EnhancedItems]] package.)
* Q3PlayerShell &amp;ndash; PlayerShells used in [http://www.koehler-homepage.de/Wormbo/Q3T.html Quake 3 Tournament]
** EnviroShell &amp;ndash; the Battle Suit's visual effect
** QuadShell &amp;ndash; the Quad Damage's visual effect
** RegenShell &amp;ndash; the Regeneration' visual effect

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2937</id>
      <timestamp>2004-12-05T02:02:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; PlayerShell (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
; PostBeginPlay( ) : Calculates the maximum size offset.

===Inherited From [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]]===
; ShowMe( ) : Sets the mesh and drawscale to the owning player's values.

===New Methods===
; byte GetIdealFatness(int FatnessOffset) : Returns a good fatness offset.
; int GetMaxOffset( ) : Returns the maximum possible fatness offset.

==Some Subclasses in EnhancedItems-based Mods==
* AuraShell &amp;ndash; Base class of effects used by the auras in Wizzard UT, a mod (maybe too?) heavily inspired by Diablo 2. It's unfinished and will never be released officially, so here's a link: http://www.koehler-homepage.de/Wormbo/other/WizzardUT.zip (You also need to download the [[Legacy:EnhancedItems|EnhancedItems]] package.)
* Q3PlayerShell &amp;ndash; PlayerShells used in [http://www.koehler-homepage.de/Wormbo/Q3T.html Quake 3 Tournament]
** EnviroShell &amp;ndash; the Battle Suit's visual effect
** QuadShell &amp;ndash; the Quad Damage's visual effect
** RegenShell &amp;ndash; the Regeneration' visual effect

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/PlayerShellEffect</title>
    <id>1113</id>
    <revision>
      <id>2934</id>
      <timestamp>2007-11-19T14:04:00Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; PlayerShellEffect (Package: (EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

It is the base class for all kinds of effects that surround objects or players.

==Properties==
; float AnimRate : How fast the shell effect should animate in Visible state.
; bool bIdleLight : Whether the effect should still emmit light in Idle state.
; EFormAnim FormAnim : How the effect should fade in.
; float FormTime : How long it should take the effect to fade in.
; EGlowAnim GlowAnim : How the effect's glow changes over time while it's visible.
; float GlowRate : How fast the effect's glow changes while it's visible.
; float MaxGlow : Maximum brightness for glow changes.
; float MinGlow : Minimum brightness for glow changes.
; EVanishAnim VanishAnim : How the effect should fade out.
; float VanishTime : How long it takes for the effect to fade out.
; EVisibleAnim VisibleAnim : How the effect's size or fatness offset should change while the effect is visible.
; float VisibleTime : How long the effect is visible before it fased out again. (0 means visible until destroyed)

===For [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]===
; int MaxOffset
; int MinOffset : Fatness offset range while visible.

===For [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]===
; float EndSize : Final size in Vanishing state with SVANISH_GrowFade.
; float MaxSize
; float MinSize : Size range while visible.
; float StartSize : Start size when fading in and final size in Vanishing state with SVANISH_Shrink and SVANISH_ShrinkFade.

===Internal===
; float AnimTime : 
; float CurGlow : 
; int CurOffset : 
; float CurSize : 
; float FlashTime : 
; float GlowTime : 
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] Master : PickupPlus managing this effect.

==Enums==

===EFormAnim===

Fade-in animations.
; SFORM_Instant : Appears instantly. This is basically the same as a FormTime = 0.
; SFORM_Grow : Effect grows until it reaches its maximum size after FormTime.
; SFORM_LightUp : Effect's glow increases until it reaches MaxGlow after FromTime.
; SFORM_GrowLightUp : Effect grows and its glow increases while fading in.

===EGlowAnim===

How the glow changes over time while the effect is visible.
; SGLOW_Steady : No glow changes.
; SGLOW_LightUp : Glow increases over time and jumps to MinGlow when it reaches MaxGlow.
; SGLOW_Darken : Glow decreases over time and jumps to MaxGlow when it reaches MinGlow.
; SGLOW_Blink : Glow fades back and forth between MinGlow and MaxGlow.
; SGLOW_Restore : Glow fades to its original value after flashing.

===EVanishAnim===

Fade-out animations.
; SVANISH_Instant : Instantly disappears. This is basically the same as a VanishTime = 0.
; SVANISH_Shrink : Effect shrinks until it reaches its start size after VanishTime.
; SVANISH_Fade : Effect's glow decreases until it reaches 0 after VanishTime.
; SVANISH_ShrinkFade : Effects shrinks and its glow decreases while fading out.
; SVANISH_GrowFade : Effects grows to EndSize and its glow decreases while fading out.

===EVisibleAnim===

How the effect's size changes over time while the effect is visible.
; SVIS_None : No size changes.
; SVIS_Pulse : Effect's size fades back and forth between MinSize/MinOffset and MaxSize/MaxOffset.
; SVIS_Expand : Effect grows over time and jumps to MinSize/MinOffset when it reaches MaxSize/MaxOffset.
; SVIS_Collaps : Effect shrinks over time and jumps to MaxSize/MaxOffset when it reaches MinSize/MinOffset.
; SVIS_Restore : Effect's size fades to its original value after flashing.

==Methods==

===Inherited From [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]]===
;  DestroyMe( ) : Destroys the effect if it's not currently visible, otherwise puts it into state Vanishing.

===New Methods===
;  SetFlashTime(float NewFlashTime) : Lets the effect 'flash' for the specified duration.
;  ShowMe( ) : Puts the effect into state Forming if it's currently Idle.
;  UpdateFlash(float DeltaTime) : Updates the FlashTime and makes sure an bOwnerNoSee effect is visible in behind view.

==States==

===Idle===

The effect is not visible.

===Forming===

The effect fades in and then switches to state Visible.
;  UpdateAppearance( ) : Called every tick to update the effect's appearance.

===Visible===

The effect is visible.
;  UpdateAppearance( ) : Called every tick to update the effect's appearance.

===Vanishing===

The effect is fading out. It either destroys itself if DestroyMe() was called and otherwise goes into state Idle.
;  UpdateAppearance( ) : Called every tick to update the effect's appearance.

===PickupShell===

The effect is currently used as a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]' shell effect. This is being used by the Q3Enviro pickup (aka. Battle Suit) in [http://www.koehler-homepage.de/Wormbo/Q3T.html Quake 3 Tournament] to create the gold halo around the pickup itself.

==Known Subclasses==

===EnhancedItems Subclasses===
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]

===Direct Subclasses in EnhancedItems-based Mods===
* DeathShell &amp;ndash; an invisible PlayerShellEffect used by the Relic of Vengeance from [http://www.koehler-homepage.de/Wormbo/EnhancedItems.html#Relics Enhanced Relics], which spawns skulls behind the player similar to the shadows of the Relic of Speed

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2935</id>
      <timestamp>2004-12-05T01:32:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; PlayerShellEffect (Package: (EnhancedItems]])}}

This class is part of the EnhancedItems package by [[Legacy:Wormbo|Wormbo]].

It is the base class for all kinds of effects that surround objects or players.

==Properties==
; float AnimRate : How fast the shell effect should animate in Visible state.
; bool bIdleLight : Whether the effect should still emmit light in Idle state.
; EFormAnim FormAnim : How the effect should fade in.
; float FormTime : How long it should take the effect to fade in.
; EGlowAnim GlowAnim : How the effect's glow changes over time while it's visible.
; float GlowRate : How fast the effect's glow changes while it's visible.
; float MaxGlow : Maximum brightness for glow changes.
; float MinGlow : Minimum brightness for glow changes.
; EVanishAnim VanishAnim : How the effect should fade out.
; float VanishTime : How long it takes for the effect to fade out.
; EVisibleAnim VisibleAnim : How the effect's size or fatness offset should change while the effect is visible.
; float VisibleTime : How long the effect is visible before it fased out again. (0 means visible until destroyed)

===For [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]===
; int MaxOffset
; int MinOffset : Fatness offset range while visible.

===For [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]===
; float EndSize : Final size in Vanishing state with SVANISH_GrowFade.
; float MaxSize
; float MinSize : Size range while visible.
; float StartSize : Start size when fading in and final size in Vanishing state with SVANISH_Shrink and SVANISH_ShrinkFade.

===Internal===
; float AnimTime : 
; float CurGlow : 
; int CurOffset : 
; float CurSize : 
; float FlashTime : 
; float GlowTime : 
; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]] Master : PickupPlus managing this effect.

==Enums==

===EFormAnim===

Fade-in animations.
; SFORM_Instant : Appears instantly. This is basically the same as a FormTime = 0.
; SFORM_Grow : Effect grows until it reaches its maximum size after FormTime.
; SFORM_LightUp : Effect's glow increases until it reaches MaxGlow after FromTime.
; SFORM_GrowLightUp : Effect grows and its glow increases while fading in.

===EGlowAnim===

How the glow changes over time while the effect is visible.
; SGLOW_Steady : No glow changes.
; SGLOW_LightUp : Glow increases over time and jumps to MinGlow when it reaches MaxGlow.
; SGLOW_Darken : Glow decreases over time and jumps to MaxGlow when it reaches MinGlow.
; SGLOW_Blink : Glow fades back and forth between MinGlow and MaxGlow.
; SGLOW_Restore : Glow fades to its original value after flashing.

===EVanishAnim===

Fade-out animations.
; SVANISH_Instant : Instantly disappears. This is basically the same as a VanishTime = 0.
; SVANISH_Shrink : Effect shrinks until it reaches its start size after VanishTime.
; SVANISH_Fade : Effect's glow decreases until it reaches 0 after VanishTime.
; SVANISH_ShrinkFade : Effects shrinks and its glow decreases while fading out.
; SVANISH_GrowFade : Effects grows to EndSize and its glow decreases while fading out.

===EVisibleAnim===

How the effect's size changes over time while the effect is visible.
; SVIS_None : No size changes.
; SVIS_Pulse : Effect's size fades back and forth between MinSize/MinOffset and MaxSize/MaxOffset.
; SVIS_Expand : Effect grows over time and jumps to MinSize/MinOffset when it reaches MaxSize/MaxOffset.
; SVIS_Collaps : Effect shrinks over time and jumps to MaxSize/MaxOffset when it reaches MinSize/MinOffset.
; SVIS_Restore : Effect's size fades to its original value after flashing.

==Methods==

===Inherited From [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]]===
;  DestroyMe( ) : Destroys the effect if it's not currently visible, otherwise puts it into state Vanishing.

===New Methods===
;  SetFlashTime(float NewFlashTime) : Lets the effect 'flash' for the specified duration.
;  ShowMe( ) : Puts the effect into state Forming if it's currently Idle.
;  UpdateFlash(float DeltaTime) : Updates the FlashTime and makes sure an bOwnerNoSee effect is visible in behind view.

==States==

===Idle===

The effect is not visible.

===Forming===

The effect fades in and then switches to state Visible.
;  UpdateAppearance( ) : Called every tick to update the effect's appearance.

===Visible===

The effect is visible.
;  UpdateAppearance( ) : Called every tick to update the effect's appearance.

===Vanishing===

The effect is fading out. It either destroys itself if DestroyMe() was called and otherwise goes into state Idle.
;  UpdateAppearance( ) : Called every tick to update the effect's appearance.

===PickupShell===

The effect is currently used as a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PickupPlus]]' shell effect. This is being used by the Q3Enviro pickup (aka. Battle Suit) in [http://www.koehler-homepage.de/Wormbo/Q3T.html Quake 3 Tournament] to create the gold halo around the pickup itself.

==Known Subclasses==

===EnhancedItems Subclasses===
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShell]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerSphere]]

===Direct Subclasses in EnhancedItems-based Mods===
* DeathShell &amp;ndash; an invisible PlayerShellEffect used by the Relic of Vengeance from [http://www.koehler-homepage.de/Wormbo/EnhancedItems.html#Relics Enhanced Relics], which spawns skulls behind the player similar to the shadows of the Relic of Speed

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EnhancedItems/PlayerSphere</title>
    <id>1115</id>
    <revision>
      <id>2938</id>
      <timestamp>2007-11-19T14:04:09Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; PlayerSphere (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the enhancedItems package by [[Legacy:Wormbo|Wormbo]].

The PlayerSphere creates a sphere around a player.

==Properties==
; float SizeAdjust : The visible radius in [[Legacy:UU|UU]] of the sphere at DrawScale 1.
; bool bUseVortexSphere : Whether the default mesh should be replaced with the Mesh'ChaosUTMedia2.c_vortexsphere' from Chaos UT. (if that's available) This will also modify some properties if the mesh was found, so set it to false if you want to use your own mesh.

==Methods==
; PreBeginPlay( ) : Try to load Mesh'ChaosUTMedia2.c_vortexsphere' if bUseVortexSphere=True.
; PostBeginPlay( ) : Set MultiSkins[1] to Texture, because that's what's usually used as the texture when bMeshEnviroMap=False.

==Subclasses in EnhancedItems-based Mods==
* InvulSphere &amp;ndash; The shield effect of the Invulnerability holdable in [http://www.koehler-homepage.de/Wormbo/Q3T.html Quake 3 Tournament], which deflects off projectiles and hurts other players real badly. ;)

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2939</id>
      <timestamp>2005-01-11T15:30:14Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EIEffects]] &gt;&gt; [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerShellEffect]] &gt;&gt; PlayerSphere (Package: [[Legacy:EnhancedItems|EnhancedItems]])}}

This class is part of the enhancedItems package by [[Legacy:Wormbo|Wormbo]].

The PlayerSphere creates a sphere around a player.

==Properties==
; float SizeAdjust : The visible radius in [[Legacy:UU|UU]] of the sphere at DrawScale 1.
; bool bUseVortexSphere : Whether the default mesh should be replaced with the Mesh'ChaosUTMedia2.c_vortexsphere' from Chaos UT. (if that's available) This will also modify some properties if the mesh was found, so set it to false if you want to use your own mesh.

==Methods==
; PreBeginPlay( ) : Try to load Mesh'ChaosUTMedia2.c_vortexsphere' if bUseVortexSphere=True.
; PostBeginPlay( ) : Set MultiSkins[1] to Texture, because that's what's usually used as the texture when bMeshEnviroMap=False.

==Subclasses in EnhancedItems-based Mods==
* InvulSphere &amp;ndash; The shield effect of the Invulnerability holdable in [http://www.koehler-homepage.de/Wormbo/Q3T.html Quake 3 Tournament], which deflects off projectiles and hurts other players real badly. ;)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Enigmatic</title>
    <id>1184</id>
    <revision>
      <id>3082</id>
      <timestamp>2004-04-21T14:41:09Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>added DevJournal Link</comment>
      <text xml:space="preserve">==Quick Bio==

I'm a full-time poster and part-time moderator on [http://www.shacknews.com Shacknews] working on a to-be-named mod.

==Contact info:==
* Developer Journal: [[Legacy:Developer_Journals/Enigmatic|Developer_Journals/Enigmatic]]
* E-Mail: enigmatic@shackmail.com
* AIM: mcnigma (at work) or enigma1o5 (home, harder to reach me)
* ICQ: 2691633

----

'''Tarquin:''' Hi, welcome to the site :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Enigmatic:''' Thank you.  Hopefull I'll be able to add to this wiki, as it's already helped me a great deal.  I started with the Clear-Z trick for portals on the [[Legacy:Canvas|Canvas]] page, and now I've added a question/anwser to the [[Legacy:Unreal_Coding_FAQ|Unreal_Coding_FAQ]].  Hopefully I'll get some more fun stuff figured out as I see it.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3083</id>
      <timestamp>2004-03-10T16:24:25Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>replies and such</comment>
      <text xml:space="preserve">==Quick Bio==

I'm a full-time poster and part-time moderator on [http://www.shacknews.com Shacknews] working on a to-be-named mod.

==Contact info:==
* E-Mail: enigmatic@shackmail.com
* AIM: mcnigma (at work) or enigma1o5 (home, harder to reach me)
* ICQ: 2691633

----

'''Tarquin:''' Hi, welcome to the site :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Enigmatic:''' Thank you.  Hopefull I'll be able to add to this wiki, as it's already helped me a great deal.  I started with the Clear-Z trick for portals on the [[Legacy:Canvas|Canvas]] page, and now I've added a question/anwser to the [[Legacy:Unreal_Coding_FAQ|Unreal_Coding_FAQ]].  Hopefully I'll get some more fun stuff figured out as I see it.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Enos Shenk</title>
    <id>1185</id>
    <revision>
      <id>3084</id>
      <timestamp>2004-05-09T20:02:06Z</timestamp>
      <contributor>
        <ip>Enos Shenk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Episkipos Enos Shenk the Jesus-Stalker, KSC, HBB===

Name: Markhoff Chaney (No not really)

Location: Fort Wayne, Indiana

Age: 23

Stuff i do: 
* Gamer
* Paintball Technology Geek
* Webmaster
* PHP Coder
* UT Mapper dude
* ShoutCast DJ
* Champion of stepping on biosludge in UT2004

Websites I webmaster directly:
* http://www.paintballchat.net - My pride and joy, im also the main IRC/Services administrator
* http://www.paintballtech.org - My PBTech Wiki that nobody ever really uses

Other websites i like:
* http://www.tippmann.com - Tippmann Pneumatics, Im also a moderator on their forums
* http://www.macaddict.com - Proud fence-sitting mac user (No im not a zealot, go away)
* http://www.ataricommunity.com - I release all my 2004 maps there
* http://www.elysiun.com - I dabble in 3D art sometimes. Too bad im spoiled by Blender with its obscure interface, i cant stomach Maya or Max now.
* http://www.blender.org - All about Blender

My maps:
* UT99
**''DM-Claustrophobia'' - Nifty map using 6 crosshatched hallways with warp zones. Think infinite, and dodge your own rockets.
**''DM-Comm'' - Full name was D.I.M.S. Comm Station. Amataur but FUN! Imagine a network of platforms floating in outer space with a skybox spinning twice as fast as Face and on 3 axes. DIMS means &quot;Doom Induced Motion Sickness&quot; by the way.
**''DM-Tower'' - Something i rambled on and built over the course of like 6 months. No plans, just on the fly mapping.

*UT2004
**''ONS-Stranglehold'' - My first 200x map. Terrain with a twist, i DO love hazards. [http://www.paintballchat.net/ONS-Stranglehold.zip Download]
**''ONS-LunaticFringe'' - Big donut, big lava, but im not happy with it. [http://www.paintballchat.net/ONS-LunaticFringe.zip Download]
**''ONS-DeadSimple'' - My entry for the UnrealPlayground ONS mapping contest. No nodes, no vehicles. [http://www.paintballchat.net/ONS-DeadSimple.zip Download]
**''ONS-Castaway'' - A nice day on your own private pacific isle. Can you tell i like round maps? [http://www.paintballchat.net/ONS-Castaway.zip Download]

**''DM-Q1DM1'' - Remake of DM1 &quot;The Place of Two Deaths&quot; from Quake originally made by Tim Willits [http://www.paintballchat.net/DM-Q1DM1.zip Download]
**''DM-Q1DM4'' - Futuristic remix of DM4 &quot;The Bad Place&quot; from Quake. Goodbye lava, hello long karma-ridden fall! Originally by American McGee [http://www.paintballchat.net/DM-Q1DM4.zip Download]
**''DM-Q1DM5'' - Remake of DM5 &quot;The Cistern&quot; from Quake originally by Tim Willits [http://www.paintballchat.net/DM-Q1DM5.zip Download]
**''DM-1on1-SlimeCo'' - 1 on 1 grudge match in a toxic waste recycling facility. [http://www.paintballchat.net/DM-1on1-SlimeCo.zip Download]

*Under Construction for 2k4

Nothing at the moment

*Planned for 2k4
**''DM-&lt;Shhh, Sekrit&gt;'' - A Duke3D map ive got my eye on rebuilding as soon as i can find someone to make a very simple static mesh for it.
**''DM-Q1DM2'' - Claustrophobopolis, im thinking futuristic.
**''DM-Q1DM3'' - The Abandoned Base, not looking forward to this at all. Its big and mean.
**''DM-Q1DM6'' - Dark Zone, Ill probably do this one next, i have some cool ideas for special effects and lighting.

==Comments==

'''Tarquin:''' Hi! Welcome to unreal wiki :D 

'''EntropicLqd:''' Hello and welcome.  The Abandoned Base is one of my all time favourite maps.</text>
    </revision>
    <revision>
      <id>3085</id>
      <timestamp>2004-04-28T10:27:41Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">===Episkipos Enos Shenk the Jesus-Stalker, KSC, HBB===

Name: Markhoff Chaney (No not really)

Location: Fort Wayne, Indiana

Age: 23

Stuff i do: 
* Gamer
* Paintball Technology Geek
* Webmaster
* PHP Coder
* UT Mapper dude
* ShoutCast DJ
* Champion of stepping on biosludge in UT2004

Websites I webmaster directly:
* http://www.paintballchat.net - My pride and joy, im also the main IRC/Services administrator
* http://www.paintballtech.org - My PBTech Wiki that nobody ever really uses

Other websites i like:
* http://www.tippmann.com - Tippmann Pneumatics, Im also a moderator on their forums
* http://www.macaddict.com - Proud fence-sitting mac user (No im not a zealot, go away)
* http://www.ataricommunity.com - I release all my 2004 maps there
* http://www.elysiun.com - I dabble in 3D art sometimes. Too bad im spoiled by Blender with its obscure interface, i cant stomach Maya or Max now.
* http://www.blender.org - All about Blender

My maps:
* UT99
**DM-Claustrophobia - Nifty map using 6 crosshatched hallways with warp zones. Think infinite, and dodge your own rockets.
**DM-Comm - Full name was D.I.M.S. Comm Station. Amataur but FUN! Imagine a network of platforms floating in outer space with a skybox spinning twice as fast as Face and on 3 axes. DIMS means &quot;Doom Induced Motion Sickness&quot; by the way.
**DM-Tower - Something i rambled on and built over the course of like 6 months. No plans, just on the fly mapping.

*UT2004
**ONS-Stranglehold - My first 200x map. Terrain with a twist, i DO love hazards. [http://www.paintballchat.net/ONS-Stranglehold.zip Download]
**ONS-LunaticFringe - Big donut, big lava, but im not happy with it. [http://www.paintballchat.net/ONS-LunaticFringe.zip Download]
**ONS-Castaway - A nice day on your own private pacific isle. Can you tell i like round maps? [http://www.paintballchat.net/ONS-Castaway.zip Download]
**DM-Q1DM1 - Remake of DM1 &quot;The Place of Two Deaths&quot; from Quake [http://www.paintballchat.net/DM-Q1DM1.zip Download]
**DM-Q1DM4 - Futuristic remix of DM4 &quot;The Bad Place&quot; from Quake. Goodbye lava, hello long karma-ridden fall! [http://www.paintballchat.net/DM-Q1DM4.zip Download]

*Under Construction for 2k4
**DM-Q1DM5 - Beta right now, remake of DM5 &quot;The Cistern&quot; from Quake [http://www.paintballchat.net/DM-Q1DM5.zip Download]

*Planned for 2k4
**DM-Q1DM2 - Claustrophobopolis, im thinking futuristic.
**DM-Q1DM3 - The Abandoned Base, not looking forward to this at all. Its big and mean.
**DM-Q1DM6 - Dark Zone, Ill probably do this one next, i have some cool ideas for special effects and lighting.
**CTF-Untitled - Ive got a sketch of a CTF layout sitting on my desk, but im too busy remaking Quake maps :)

==Comments==

'''Tarquin:''' Hi! Welcome to unreal wiki :D 

'''EntropicLqd:''' Hello and welcome.  The Abandoned Base is one of my all time favourite maps.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EntropicLqd</title>
    <id>1098</id>
    <revision>
      <id>2901</id>
      <timestamp>2007-12-22T15:40:57Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Updated with Mutators for UT3.</comment>
      <text xml:space="preserve">==EntropicLqd's Brightly Lit and Comfortable Corner ==

Things that are currently on my list of things to pretend to be doing are:
* Breathing, living, and updating my developer journal.

Feel free to read my [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]] although it's almost never updated.

===Contacting Me ===

''EntropicLqd'', a shortened version of ''EntropicLiquid'' to avoid messing with the UT scoreboard, commonly called ''Entropic'' for short.  I'm generally reachable by mail entropic '''at''' snout-clan.co.uk or via IRC in ''#snout'' on Quakenet.  I'm normally on IRC between 21:00 and 22:00 UK local time (if at all).  Sorry, but I don't use Yahoo Messenger, ICQ, or most other IM programs.  My MSN screen name is entropiclqd '''at''' snout-clan.co.uk (suprisingly).  I log on occasionally, but not much.

The e-mail address is also on my clan web site - http://www.snout-clan.co.uk/

Here's a magic link to the [[Legacy:Mod Ideas|mod ideas]] page for UT2003.  It's a pretty cool place to hang out.

'''If you have a problem searching .uc files for keywords under XP-Pro .. visit http://udn.epicgames.com/pub/Technical/SearchUCinXP/.  It works like a dream.'''  (I'd have preferred it to go into winvi though :).

===UnrealScript ===

==Unreal Tournament 3==

Take a week off work and place it in a pot, add UT3 (patched), a pair of kids at school, a wife out most of the time, and simmer gently adding coffee and Fair Trade stem ginger cookies to suit.  The result:

; http://www.snout-clan.co.uk/mapsnmods/ChargingShockRifle1_0.zip : Think instagib only with shock rifles that charge up.  The less you fire the more damage you do but the more frustrating it is when you miss.
; http://www.snout-clan.co.uk/mapsnmods/TauntControl1_0.zip : Control the bot's taunts without having to set the voice volume to zero.
; http://www.snout-clan.co.uk/mapsnmods/SlowTimePlus1_0.zip : When you get a kill the game speed is reduced by 10% while you remain at the same speed.  If you get another kill within 2 seconds then the game speed is further reduced by 10% (again you stay at the same speed).  It gets silly with lots of Novice bots, but is great for admiring the beauty of UT3.

==Unreal Tournament==

The author of the first (as far as I know), and least publicised multi-team CTF mod, ''CTF+''.  The mod was last updated in June 2000.

I've also poked around a bit with other stuff that I'm not prepared to own up to.  Work, children, and a nagging wife conspire to keep me away from my PC more than I would like.

===Links ===

[http://www.snout-clan.co.uk/ SNOUT] &amp;ndash; The worst UK Insta-CTF clan and proud of it :)

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EntropicOnFatherhood]] &amp;ndash; A toungue in cheek rant about the joys (yeah right) of being a father.  If you are considering having kids then this is a must read.  The reality is ''much worse'' than you can possibly imagine.

[[Legacy:The Curse Of Static Meshes|The Curse Of Static Meshes]] &amp;ndash; The curse of static meshes.

[http://games.moddb.com/ mod database] &amp;ndash; A fairly large mod database.  Reasonably well executed.

===Guest Book, Comments, and Messages ===

'''ViKTiM''' I would just like to thank you for the TriggeredZonePropertyChanger, man i've been after someting to trigger gravity for about six months no, there was no way i would have been able to script it cheers dood!! 

'''EntropicLqd:''' You're quite welcome.  I forget who it was written for originally but they wanted to do the same thing.

'''Nytro:''' Where can I find this &lt;TT&gt;TriggeredZonePropertyChanger&lt;/TT&gt;?

'''EntropicLqd:''' You can find all maps n mods I've produced on the SNOUT web site - look in the UT mods section (http://www.snout-clan.co.uk/)

'''Tarquin:''' CTF-GauntPiglet looks great!!! Though you haven't set the GameType yet! ;)

'''EntropicLqd:''' Thanks Tarquin ... makes note to set gametype ... Happy Christmas m8 - hope you have a good one.

'''Nobody:''' Hi, seeing your comment at the bottom of [[Legacy:INI_File|INI_File]], you may benefit from new data added to that page on commenting lines in the ini file.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2902</id>
      <timestamp>2006-11-24T19:33:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>restoring</comment>
      <text xml:space="preserve">==EntropicLqd's Brightly Lit and Comfortable Corner ==

Things that are currently on my list of things to pretend to be doing are:
* Breathing, living, and updating my developer journal.

Feel free to read my [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]] although it's almost never updated.

===Contacting Me ===

''EntropicLqd'', a shortened version of ''EntropicLiquid'' to avoid messing with the UT scoreboard, commonly called ''Entropic'' for short.  I'm generally reachable by mail entropic '''at''' snout-clan.co.uk or via IRC in ''#snout'' on Quakenet.  I'm normally on IRC between 21:00 and 22:00 UK local time (if at all).  Sorry, but I don't use Yahoo Messenger, ICQ, or most other IM programs.  My MSN screen name is entropiclqd '''at''' snout-clan.co.uk (suprisingly).  I log on occasionally, but not much.

The e-mail address is also on my clan web site - http://www.snout-clan.co.uk/

Here's a magic link to the [[Legacy:Mod Ideas|mod ideas]] page for UT2003.  It's a pretty cool place to hang out.

'''If you have a problem searching .uc files for keywords under XP-Pro .. visit http://udn.epicgames.com/pub/Technical/SearchUCinXP/.  It works like a dream.'''  (I'd have preferred it to go into winvi though :).

===UnrealScript ===

The author of the first (as far as I know), and least publicised multi-team CTF mod, ''CTF+''.  The mod was last updated in June 2000.

I've also poked around a bit with other stuff that I'm not prepared to own up to.  Work, children, and a nagging wife conspire to keep me away from my PC more than I would like.

===Links ===

[http://www.snout-clan.co.uk/ SNOUT] &amp;ndash; The worst UK Insta-CTF clan and proud of it :)

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/EntropicOnFatherhood]] &amp;ndash; A toungue in cheek rant about the joys (yeah right) of being a father.  If you are considering having kids then this is a must read.  The reality is ''much worse'' than you can possibly imagine.

[[Legacy:The Curse Of Static Meshes|The Curse Of Static Meshes]] &amp;ndash; The curse of static meshes.

[http://games.moddb.com/ mod database] &amp;ndash; A fairly large mod database.  Reasonably well executed.

===Guest Book, Comments, and Messages ===

'''ViKTiM''' I would just like to thank you for the TriggeredZonePropertyChanger, man i've been after someting to trigger gravity for about six months no, there was no way i would have been able to script it cheers dood!! 

'''EntropicLqd:''' You're quite welcome.  I forget who it was written for originally but they wanted to do the same thing.

'''Nytro:''' Where can I find this &lt;TT&gt;TriggeredZonePropertyChanger&lt;/TT&gt;?

'''EntropicLqd:''' You can find all maps n mods I've produced on the SNOUT web site - look in the UT mods section (http://www.snout-clan.co.uk/)

'''Tarquin:''' CTF-GauntPiglet looks great!!! Though you haven't set the GameType yet! ;)

'''EntropicLqd:''' Thanks Tarquin ... makes note to set gametype ... Happy Christmas m8 - hope you have a good one.

'''Nobody:''' Hi, seeing your comment at the bottom of [[Legacy:INI_File|INI_File]], you may benefit from new data added to that page on commenting lines in the ini file.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EntropicLqd/Developer Journal</title>
    <id>1133</id>
    <revision>
      <id>2978</id>
      <timestamp>2007-12-28T16:44:27Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>My mission for the weekend.</comment>
      <text xml:space="preserve">I thought it might be interesting to be able to view my sporadic mod progress over a full year (or several) so I thought I'd re-create my developer journal.  It won't get updated regularly, but I can always hope for a monthly update.  Feel free to add comments in the appropriate sections if you so wish.  Date corrections are always welcome as it'll take me till June to remember that the years changed.

{{classbox| 28 December 2007}}

My objective for this weekend is to bang my head repeatedly against the wall of insanity that is the UT3 UI.  My goal, should time, enthusiasm and alchohol permit, is to make my regeneration mutator UI work.  Once I have got it working I'll write it up as a tutorial.  Apparently there are people that appear to have worked this stuff out, but they don't appear to want to share the information with anyone.  I guess they must power trip out on it or something.

{{classbox| 22 December 2007}}

I can't believe it was so long ago since I wrote my deployable jump pad mutator for 2K4.  This year has really flown by.  I've just spent the last week working on some mutators for UT3 (the game rocks btw).  It's been good to actually have some concentrated time to get to grips with the code.  Although, to be fair, I did spend a ''lot'' of time &quot;testing&quot; the game out.

I've got a regeneration mutator all but finished.  The only thing I have left to do is the config. menu.  And I am currently totally and utterly stumped.  I've got so many regeneration options (you can set regeneration values for individual weapons) that I have to use a scroll pane.  However, I am unable to make the

The UI code in UT3 has to be the most appalling piece of hacked together excuse for code I've ever come across.  It really is the pits.  If anyone comes across a design document for the UT3 UI please pass it my way.

My current ''efforts'' in making the Scroll Pane work cause UT3 to GPF instantly.  The only error in the log is a &quot;File not found&quot; issue.  Naturally it isn't giving me any clues as to which file it is looking for.

I haven't sworn so much in a long time.

The killer is that not being able to reliably create a UI effectively means that mods won't be released for the PS3 - no bugger will be able to configure them.

'''MythOpus:''' You know, you could just make a custom UI and hook it in somehow.  Something like the custom config menu in UT2004.  Could be fun.

'''EntropicLqd:''' If I thought I had the time then I would have a go at doing it.  I spent some time looking at the possibility of having a single UI screen that I could use for each of my mutators.  The problem is that the UI code bakes the &quot;data provider&quot; into the scene.  This means that even if I got it working, if I were to use two mutators that referenced the scene you would get all the options from both of them irrespective of which one you tried to configure.

In the couple of days I've got off over Christmas I'm going to go back and see if I can figure out a way of creating a basic scene and then dynamically adding widgets to it on the fly.

The first time I tried it I failed miserably and simply suceeded in GPF-ing UT3 100% of the time.  However, now that I've tried it the &quot;official way&quot; and reached the same point I'm going to go back at look at alternatives again.

I've got some notes for a tutorial that I need to write for the Wiki on creating a basic scene.  The only thing that's preventing me from adding it is that I think I've &quot;hacked&quot; the localization in (even though it works).

{{classbox| 18 March 2007}}

I realised that I was being particularly dense with regards to the alignment of my emitter and solved that issue.  I basically needed to calculate the length of the original vector and apply it along the right axis to get the effect I wanted.

Aligning the jump pad to the ground is proving much harder.  I've caught the landing event and got the normal of the ground the pad has landed on.  I just need to work out how to apply that to the jump pad itself.  Maybe I'll sort it sometime this week.

{{classbox| 10 March 2007}}

Inspired by a recent LAN and some comments on the BuF forum I decided to dig out the UScript sources for 2K4 and have a crack at making a deployable jump pad.  It felt like it might be a fun thing to do.

Initially I simply subclassed the UTJumpPad and set it up so it could be Spawn()'d easily.  I borrowed and tweaked the &quot;throw weapon&quot; code in order to ensure that the jump pad went in the right direction and life was good.  Life remained good right up until the point I attempted to assign a mesh (or other graphical goodness) to my subclass.  My jump pad immediately stopped working.

I backtracked a bit and now have a separate class for the mesh base, the emitter(s) I want to use for the jump pad, and the jump pad itself.  I now have two problems.

'''The first''' (and smallest) is that I can't seem to match the rotation of my SpriteEmitter with the Rotation of it's parent without using a co-ordinate system of PTCS_Relative.  Which then means that the &quot;velocity&quot; I give the emitter is wrong.  I need to put the velocity into relative co-ordinate space but I can't remember how at the moment.

'''Update:''' I feel so old and stupid.  All I needed to do was get the magnitude of the &quot;velocity&quot; and assign it to the X component of the emitters velocity vector, set the Z component appropriately and it all works because the Unreal Engine does the co-ordinate space transform for me (which is nice).  Now on to the nasty big problem.

'''The second''' problem I have is that I want to align the mesh of the jump pad with the ground.  It looks OK on flat surfaces, but put it on a slope and it looks more ugly than a very ugly thing.  I must confess, I have absoloutely no idea how to go about fixing that.  I'm thinking traces from each &quot;corner&quot; or my mesh to attempt to derive some sort of &quot;plane&quot; I can align the mesh with, but that sounds like a lot of work for a bit of graphical cleanliness.

Ah well.  That's life.  I'm kind of tired now (late night/early morning combo aleways gets me) so I'm taking a break.

{{classbox| 07 January 2007}}

And so we move into a shiny new year.  Normaly at this point I'd look back and mourn at how my real life commitments eroded all the resources (time, enthusiasm, and energy) I was planning on ploughing into some mod/programming project.  Since I didn't set myself any targets at all there wasn't anything to feel sad about.

It's weird, even though I don't map or mod for UT2K4 at all I still visit the Wiki at least once a week.  Maybe it's because I have hope that I'll get back into modding and mapping with the release of UT2007.  Or maybe it's because the stuff that gets changed is (usually) quite interesting reading.

My initial thought is that I'd quite like to create a DM map whose structure changes based upon time and the number of players.  The concept is that the map has a number of events that can occur which change the structure of the map.  E.g. An energy beam generator explodes meaning that a previously closed tunnel is now open.  Or an unreachable walk-way half collapses allowing it to be used.  The player thing is simply doors to additional rooms that open up as the player count increases.  Bot-pathing the level could get interesting.

My biggest fear with the concept is that mapping in 2K7 will be so complex as to be beyond me.  Still, one can but try.

{{classbox| 04 June 2006}}

Well, 7 months has passed since my last update and I've made almost no progress on my Java game.  Basically I got to the point where I'd ironed out most of the flaws in the behaviour, implemented corners, and was ready to start introducing more map elements.  At that point I got bogged down with the graphics.  And after several hours trying to design some acceptable graphics I gave up.  I don't think I've looked at the game since.  Probably time to get some help from a more talented individual I guess.  But I'll have to wait for some free time before I ask.

I did spend some time thinking about what it would take to move the game into a 3D world.  It would be possible to introduce some cunning puzzles and tricks if each of the marbles had different properties so I might sit down and develop the idea a bit more.

So, apart from the family slowly sucking the life out of me, the covers band I play (bass) in has been busy and keeping me practicing for several hours as week.  We recently got a live recording done which came out better than I expected.  I'm likely to have a few copies spare so if anyone wants a copy drop me an email and I'll put one in the post.

I've also been toying with a monitoring application.  Basically an application generates a UDP data packet filled with transaction information (status, performance, all that stuff) and the monitor application catches that and displays it on screen.  The application is designed to work with configurable hosts, applications, and transactions.  It's given me a real insight into Java GUI programming - and I must confess, it sucks.

Oh, I also spent some time reverse engineering the map files for Flat Out (with some limited success).  You can see the results of my research at http://snout-clan.co.uk/flatout/

More recently I've returned to gaming and have been playing GRAW.  I'm still trying to figure out how to get a server up that will allow me to play the co-op missions with my brother and sister-in-law.  Since they are both behind the same firewall it seems to prevent them from joining the same game (even though they are running unique copies of the game and can join separate servers).

Ah well, real life calls once again.  UT2007 is on the horizon, and Flat Out 2 is imminent.  Spore seems like it'll be quite good.  And one day, my children will leave home and I'll have loads of free time.  Fantastic.

{{classbox| 06 November 2005}}

It's been an interesting week in the world of my little Java game.  At the beginning of the week I decided that I needed to refactor the movement and direction code.  I had too many constants with different values used for essentially the same thing.  This ''duplication'' was causing the code to get a little bulky.

So I embarked on a fairly major refactor.  The result has been something that I'm much happier with.  I no longer have multiple overlapping constants for movement and position, and I also have less code.

Some of the encapsulation is suspect, but I can live with that for the time being.  Basically, the game position class also understands about the movement characteristics of the map element it is associated with.  This isn't great from a design point of view but I the savings I was able to make by doing things that way currently outweigh the &quot;uncleanliness&quot; of the solution.  It's something that may change as I add more map elements.

Anyways, I've updated the on-line version with a new version of the code (Java 1.4 compatable this time).  It seems a lot less error prone than the previous version.  I also finally managed to squash the intermittent collision bug I was having with the wheels.

I'm now deciding whether to work on the game entry and level finish screens or more maps.  The former is going to be dull so I should probably do that first just to get it out of the way.

'''T1:''' BTW, you might be interested in http://gpwiki.org/

{{classbox| 29 October 2005}}

I just got back from North Wales having spent a week in comparative exile with the family.  A good time was had by all despite the torrential downpour.  As always I took my slabtop along to play DVDs for the kids.  In the end it turned out to be a very productive week.

The collision code has been completely re-written and now works in all situations.  I believe there is some scope for optimisation in the code as well should I need to shave some time off the main loop.  I've also implemented a bunch of queues for input events and object destruction and the like.  This has resolved a couple of outstanding issues with general gameplay.

In fact, I've got to the point where you can play a level should you wish to complete with rudimentary sounds.  The sounds are ''very'' loud and I need to tone them down a bit, but they will do for now.  I shamelessly nicked them from the Windows pinball game.

Out of all the things I implemented over the last week was the text-based level script.  Rather than have all of the levels &quot;hard-coded&quot; within the game, they are created using a simple text file.  This means that with a small readme (or something similar) anyone can create levels for the game.  This appears to have presented me with a small problem - I don't seem to be able to place the level files in the JAR file I want to use for distribution and still be able to access them.  There's probably a way around it but I'll have to do some digging to get it resolved.

Anyways, if you are feeling particularly brave, you can see the current ''not even worthy of a pre-alpha title'' code in action at: http://www.snout-clan.co.uk/stuff/marbled/marbled.html

I'm still not entirely happy with the main loop code, and not all of the game rules are implemented.  But at least I'm making progress.

'''MythOpus:''' I think I found a bug...  when you shoot a 'marble' from one of the shooters, and there is already a marble in the hole where you're shooting too... if you click on the marble in the hole, it get's shot and when it collides with the other marble, it pushes it back to the hole where it was shot from.  Then when the two marbles (which re now on top of eachother) hit the hole, one of the marbles stays and the other marble keeps going to a hole on the next rotating thinger...  I hope I've described it well enough...  I'm not good at this :P

'''EntropicLqd:''' Heh - I call the rotating things Wheels.  I didn't think that I'd implemented marble's bouncing off each other yet though.  I'm aware of the problem you describe but not in the manner you describe.  I've seen it when fooling with the &quot;drop point&quot; (the T-Junction that goes down to the first Wheel), but not between wheels.  However, you description is good enough for me to replicate what you did.  And I did say ''not worthy to even be a pre-alpha'' :).

'''T1:''' It says:

alt=&quot;Your browser understands the &lt;APPLET&gt; tag but isn't running the applet, for some reason. It does need the Java 1.4 runtime environment.&quot; Your browser is completely ignoring the &lt;APPLET&gt; tag! 

I have java, and I've run other applets before. I'm running Konqueror on Slackware Linux. Don't know if that'll help. I can run it using Firefox, however, I have no idea whatsoever what to do, but it's sort-of-fun-ish. I've figured out how to lose, but how do you win?

'''EntropicLqd:''' I noticed yesterday that the game tells you you have lost even when you win the level :).  In terms of your Konqueror problem, try this:

* Settings -&gt; Configure Konqueror -&gt; Java &amp; JavaScript
* Look for the box labeled &quot;Path to Java executable or 'Java'&quot;
* Try ''/usr/lib/jre/bin/java'' (you need to set the path to the Java executable).
* Restart Konqueror and you should be good to go.

'''T1:''' No, you misunderstand, Java is installed, set up, and works for other java stuff, just not this ONE applet. I already have that all set up. Also, how is winning supposed to work?

'''EntropicLqd:''' Ah - apologies.  Hmm, the most obvious thing is a JRE conflict or something similar.  Does Konqueror have any form of Java Console (like Firefox does)?  If so are there any clues in there?  You win the level by getting four marbles of the same colour into each of the wheels.

{{classbox| 22 October 2005}}

Pretty much giving up on everything PC related in my spare time back in July I focussed completely on playing bass.  Learnt a few songs, half-written some other stuff, and generally improved my playing a bit.  I also got some forced rest in September (pretty much all of September) due to an attack of nightmare headache/migraine type things.  And I've replayed through SCCT and NfSU2.  In the last week or so my head's been good enough to do stuff.  So I've returned to the Java game I started writing back in Feb. 2004.

It's been really good to get back into it, even if it did take me a couple of days to work out how it all fitted together.  I've actually added comments this time round and by the time I've got the first level fully working I expect it will be fully java-doc'd up.

Anyways, I've realised something quite interesting (I think I always knew but was unaware just how deep it went).  I'm driven by obsession.  I can only properly drive myself to do stuff if I have the time to obsess about it.  Only spending an hour on the odd evening doing something isn't enough for me to get driven about it - but is enough time for me to get frustrated at not having enough time to do it.  Thus begins the downard spiral....

Quite how I solve this, or get a balance between all the things I want to do so that I don't get frustrated with any of them I'm not sure yet.

Back to the game.  After looking through the code I was unhappy with the collision code.  It was slow, and incredibly inefficient.  I've replaced it all as I've used the structure of the map to optimise it significatnyl.  This required a significant overhaul of huge sections of the code and impacted on the driving loop (that controls the animations as well).  The result is a lot less code to do the same thing faster, and I'm still not ''quite'' happy with the collision code.  However, the basic structure feels right.

The other thing I've realised I need to introduce is a queuing system for user inputs.  The game is completely mouse driven and the mouse clicks take effect immediately.  This can lead to some weird artifacts on screen (or the animation thread dying) so it's got to go.  I have a sneaky suspicion that the animation thread is dying for a different reason - but I need the input queue anyway.

{{classbox| 20 July 2005}}

I've all but stopped playing UT2004 - the social network that kept me playing it no longer exists.  I've toyed listlestly with BF2.  I've played through GTA San Andreas.  And all it has done is driven home just how pointless gaming and modding really is.  The thought of doing any kind of programming (in any language) in the evening doesn't appeal anymore.  In fact if it wasn't for my bass guitar I'd have probably resigned myself to becoming a zombified TV watching android.

Maybe I've suddenly got middle-aged.  If middle-age can be defined by a feeling that everything should have a purpose, and that fun in and of itself is not a valid purpose for doing anything, then I'm there.

Ah well.  Roll on UT2007, and STALKER.  And if anyone sees my ''spark of creativity'' lying around pop it in the post.

'''MythOpus:''' Perhaps you've just hit your peak called 'depression.'  Many people seem to be going through that lately.  I don't play UT2004 anymore.  Reason:  I don't like the game much :|  I just code for it.  Fortunately for me, I have my coding and a special someone to keep my thoughts from wandering again into what I call, &quot;Depression Zone&quot;  You have a wife do you not?  Anyways, the depression shall pass and you shall find your spark once more.  Maybe do up some graphics in your favorite image editing program (Yay Photoshop) and do a Photo Blog of sorts :)

'''Graphik:''' No, it's not about being middle-aged. I am nowhere near middle-aged (the actual distance would likely surprise you) and I've felt this way for a while. I think what is needed is to change where you look for fulfillment, as you've exhausted the current avenues. Say you found UnrealEd fun. Try making Pixar-style short films in Maya. It's a complete change in perspective, while maintaining a enough similarity to ensure you're not too far off from your original passion.

I don't think UT2007 is the answer, either; it's another UT with a new coat of paint. Looks like we'll have to wait another generation of games for somthing that really brings a community together like UT did.

'''MythOpus:''' Ya with the lost of UTIRC, I think the community really broke apart.  Not to mention the actual gameplay as in team work of UT2K- was really broken.  We really do need a new UT.  Maybe all of the coders and modellers etc on the WIKI can get together and throw some ideas around ?

'''T1:''' Hmmm. I've never had an internet capable gaming PC, so I've never really played online more than 2 or 3 times. However, I've definitely noticed a decline in the funness (That's not really a word is it?) in UT2003/UT2004 compared to UT. I usually play UT with bots and for messing with code, sometimes I play with friends on my LAN, however. Hmm.. throw some ideas around? How about some more thought-oriented gameplay? I'm really getting tired of this kill-kill-kill button-pushing that is in every game almost. I wish there was an FPS were the strategies and tactics you used we're just as important as your accuracy. I'm not really talking about making it more &quot;realistic&quot;, however &quot;semi-realistic&quot; gameplay might help a bit. I think I might make a mod ideas page for a gametype I thought of. If someone wishes to make a mod made by the combined efforts of the wikizens then I would help code such a gametype into a larger mod.

'''Graphik:''' I smell a Counter-Strike clone. ;)

'''T1:''' I wouldn't take part in such a mod. EVER.

'''EntropicLqd:''' Thanks for the thoughts.  I shall ponder them while I'm away on holiday and &quot;unplugged&quot;.

'''Solid Snake:''' I think we all go through that period where we simply just need time off the computer to pursue other needs/wants. This is somewhat common, with certain things as well as work for example. I often just not do anything computer related for awhile, or I play other games which are more sort of regenerative rather than destructive (Simcity type games vs blowing stuff up type games). That tends to recharge the batteries for myself.

'''zugy:''' Yeah I go through this alot. Lately, in order to prevent this, I go through a cycle of sorts-I do some mapping, then some coding and now I'm in a modeling stage. I need to constantly be doing new things and learning (I admit it, I like to learn...go ahead and sue me, teachers :P). By rotating around I stay interested in modding, and still keep fresh on certain aspects of it. Now that I think about it, I've been neglecting my map lately :)

'''Aphex:''' Still goin strong I see!  I still play the original UT - can't beat the old classic IMO!  Erm except I'm recently partial to a bit of BF2 actually - took a while, but grew on me in the end. Still keeping a creative spark going here: moved to writing own game.  But yes, gotta watch for the burn-out.

{{classbox| 07 January 2005}}

While I was attempting to go to sleep last night I thought of an optimisation I could make to my Tri-Puzzle solving program.  The optimisation (replacing to bitwise ANDs with an XOR) was possible because of the way I arranged the bit masks I was using to denote the different pieces.  It's not a huge optimisation, but it does shave 300ms off the total processing time.

Also of note, my eBow (www.ebow.com) arrived in the post this morning.  I'd be fiddling with it now but I'm waiting for the rain to stop before venturing out to buy a battery.

{{classbox| 06 January 2005}}

I've been sorely neglecting this journal for a long time for one simple reason.  I've pretty much halted all thoughts of modding.  This is partly due to time constraints - the family and the band keep me pretty much occupied full time.  But mainly it's because my heart isn't in it.

It depresses me to think that the most interesting piece of code I wrote in Q4 2004 was a small program to solve a 16 piece jigsaw puzzle with triangular pieces.  The whole process took about 8 hours from initial code inception, testing and debugging, and the final run which found both solutions to the puzzle.

I have considered whether I've just got to old for games, but I find that thought somewhat ludicrous.  I've also spent pretty much the entire last couple of weeks playing FlatOut (www.flatoutgame.com) and Need for Speed Undergrouns 2.  Both a nice enough games (I prefer FlatOut, my bro' prefers NSFU2).

So, what's in store for this year?  To be honest I have no idea.  It would be nice to think that I'll get back into coding in my spare time and become as enthused with software development as I was a decade ago.  It's more likely that I'll get bullied into writing a profile editor for NFSU2.  Not stunningly interesting, but potentially amusing nonetheless.

{{classbox| 19 August 2004}}

Thanks to my previous efforts, a slightly slack day at work, a bout of insomnia last night and some help from Tarquin my &quot;curve&quot; track builder appears to work.

You can specifiy the start and end radius, the angle of the curve, the start and end track width, and the start and end bank angle.  You can also opt for left/right/center alignment of the change in track width.  With the right parameters you could probably make it generate a section of straight track :).

Now that I've got curves and straights I'll have to do slope entry and exits next.  Once they are done I can start playing with some track ideas.

One thing I have noticed is that UT2004's Unreal Ed is much more prone to BSP errors than any of the previous versions.

{{classbox| 18 August 2004}}

Thanks to the [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] page I built my very first custom BrushBuilder last night to create a section of &quot;racing track&quot;.  I realise that static meshes are the way to go - but what the hell :).  It was an interesting exercise and I'm going to do another one, but this time with curves.

{{classbox| 15 August 2004}}

Since my last update I've done nothing.  Nada.  Nowt.  No modding, coding, scripting, or anything even remotely associated with creating anything of any purpose.   Maybe I'm heading for a mid-life crisis or something but I can't get enough enthusiasm to start anything even though I know I'll get into it once I've got started.

I downloaded UnWheel a couple of days ago.  It plays pretty well although it suffers from &quot;hovering car&quot; syndrome, and the cars don't really feel like they are moving that quickly.  The camera system is a little odd.  It kind of freaked me out at first that the camera was still under mouse control.  I'm still undecided as to whether I like that approach or not.  I don't know what it is with driving games, but on the whole the cars never feel like they are actually on the ground.  Trackmania, GTA VC, and Midtown Madness are notable exceptions.

Maybe I'll have a crack at building a circuit - I like racing games that don't take themselves too seriously.  Heck, having complained about the poor car handling, maybe I should see if I can do better (hah - yeah right).

{{classbox| 25 June 2004}}

I've had some bug reports from a couple of the mutators I've released.

'''Power Core Volume Control'''
* When playing a game with rounds the buzzing sound still kicks in at the end of the round.  Not a big deal as it only lasts a second or so but I'll still fix it.

'''Adjusting Energy Sphere'''
* I've had reports of people playing matches where one player in the game cannot see the Energy Sphere's - they are simply invsible.  This only seems to happen on the first game of a session.  The majority (2 out of 3) cases of this have been where people have joined mid-game.  The third case was someone playing an instant action game.
: So far I've not been able to reproduce this one on my LAN at home.  It needs fixing.

{{classbox| 15 June 2004}}

I've been ruminating on what my next project should be, and while I was lying awake in bed at 4am this monring I think I've got.  The project needed to be long term enough that I can spend a lot of time thinking about it without actually doing anything (real life is in the way atm), and something that I'm most likely going to find challenging but not impossible.

Anyway, my next project is going to be a mapping project.  I'm going to build a DM map called DM-EventFull.  The map is going to be based in an abandoned base built originally for the study of seismology but evacuated for safety reasons.

The brief is to build the map such that earthquakes occur at random intervals throughout the game.  These earthquakes trigger randomly selected ''events''.  The ideas I've had for the events so far are:
* Dust falling from the ceiling
* Collapsing pipe-work in the walls
* Short-circuiting electrics
* Cracks appearing in floors
* Beams and girders falling from the ceiling.
* Collapsing brickwork.
* Lights flickering or shutting down completely.
* Others that I'll no doubt think of later.

Because the events happen in a random order, and at random intervals no two games will be exactly alike.  I'm considering making all of the events non-gameplay effecting, but it might be fun to have different routes through the map open up as the game progresses.

If I get even half-way to realising the idea I have in my head I'll be satisfied.  Traditionally my mapping is as lacking as my drawing skills.  But we shall see how things go.

If it's anything like my normal mapping projects It'll never be finished.

{{classbox| 14 June 2004}}

Well, its finally done, dusted, and released.  The Adjusting Energy Sphere mutator finally got finished up and for those that want it, you can find it here: http://www.snout-clan.co.uk/p.php?p=3065.  Sadly that brings to a close this brief (but enjoyable) modding spree.  Real Life and work must once again take precedence over having a bit of fun.  Bummer really.  Still, serves me right for not being an unemployed bum or a college student I guess. 

{{classbox| 05 June 2004}}

Woke up this morning on the 4th June (it's gone midnight here) and realised that I was wrong about the ROLE_None statement below.  I go to correct the information on the Wiki and see that Mych. had beaten me to it (kind of).  Anyways its all sorted now.

I spent this evening optimising and tuning my mutator.  I had a couple of ''Uh-Oh what have a I done'' moments but it's all sorted now and the code is much cleaner although possibly not as clear as it was.

Anyways my mutator is done, and tested (as much as I can test it - Listen server + 1 client, dedicated server with 1 client, instant action).  It's now ready for some proper network testing once I've written the read me and commented out some of the log statements.  I'll also throw up a tutorial page on the Wiki on how it's put together.  It's another interesting one from a network/replication point of view.

Sadly that's going to be it for a while as real-life work commitments are beconing urgently.  I wouldn't mind making an ONS map next - and fleshing out the [[Legacy:Mapping For ONS|Mapping for ONS]] page a little more (with how to actually put the maps together).  Whether I'll get time remains to be seen.

And now .... it's bedtime.  Zzzzzz

{{classbox| 03 June 2004}}

Well, I have finally resolved my problems with the [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator I've been attempting to write.  It all boiled down to a misunderstanding of the way Actor's with a [[Legacy:Role|Role]] of ROLE_None actually works.  This misunderstanding was causing all sorts of weird side-effects to be seen in-game and I was tearing my hair out trying to work out what was causing them.

Actor's with a role of ROLE_None are created on both the server and the game client.  However, the two objects are '''completely independant'' of each other.  Destroying the actor on the server will not destroy it on the client, and equally, destroying the actor on the client will not remove it from the server.

The '''real killer''' is that destroying the Actor on the server from a mutator's IsRelevant() function doesn't prevent it from being created on the client.

So anyway, the upshot of this bolt from the blue is that my mutator appears to work in all network modes now.  All I need to do is optimise the code a little (I'm doing stuff in Tick() so I want it as light as possible) and get it on my server for some hammering.

{{classbox| 31st May 2004}}

Well, I've ground to a complete halt.  I can confidently say that my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] is not going to progress any further unless I have an incredible flash of inspiration and figure out just how the hell the [[Legacy:ONSPowerNodeEnergySphere|ONSPowerNodeEnergySphere]] object works.

I should have known today was going to be bad when it took me half an hour to spot an error in my code that was so glaringly obvious it was correct beyond all need of checking.  I've reproduced it below.  As a passer-by it should be immediately obvious to you.

&lt;uscript&gt;
defaultproperties {
  RemoteRole=SimulatedProxy
}
&lt;/uscript&gt;

Anyway, I'll attempt to describe my problem.

When a PowerNode is under construction a spinning circular thing appears above the node in a &quot;ghost&quot; style skin (it goes solid once the node has constructed).  This spinning circular thing is the ONSPowerNodeEnergySphere object.  This object is a pure client side construction - it has a remote role of ROLE_None.  The location of the spinning thing appears to be set by a couple of bones (who have their own unique co-ordinate system).

I want to be able to change the height of the energy sphere based upon the health of the PowerNode it is attached to.  Sounds pretty straightforward.

So I create my own energy sphere object, subclassing from the existing ONSPowerNodeEnergySphere class to avoid having to duplicate a chunk of code.  I add some code to handle the node height and things should be fluffy.  Not so.  My own energy sphere class is shown below (warning the bone location might not be right - I was fiddling with it earlier):

&lt;uscript&gt;
class AdjustingPowerNodeEnergySphere extends ONSPowerNodeEnergySphere;

var float CalculatedHeight;
var int counter;

replication {
  reliable if (Role == ROLE_Authority)
    CalculatedHeight;
}

function PostBeginPlay() {
  Super.PostBeginPlay();
  if ( self.PowerNode != None &amp;&amp; Self.PowerNode.EnergySphere == None ) {
    self.PowerNode.EnergySphere = Self;

  }
  Log(&quot;AdjustingPowerNodeEnergySphere:: PostBeingPlay() is in play&quot;);
}

simulated event Tick(float DT) {
  local vector v;
  Super.Tick(DT);
  v.X = 0; v.Y = -1*self.CalculatedHeight; v.Z = 0;
  SetBoneLocation( 'EnergyInducers', v );

  if ( ++self.Counter &gt; 100 ) Log(&quot;AdjustingPowerNodeEnergySphere:: Updating bone position&quot;);
}

defaultproperties {
  RemoteRole=ROLE_SimulatedProxy
}
&lt;/uscript&gt;

I have the following problems:
* The original spinning energy sphere is still created in its original position above the power node.
* My new energy sphere object is created in the right place and changes position with the node health, but does not have the right skin assigned to it.  I'm using bone's at the moment but setting it's absoloute position should also work.
* My new energy sphere also fails to &quot;spin&quot; in the same way that the orginal one does.

This tells me the following things:
* I'm not destroying the original Energy Sphere object properly.
* My energy sphere class isn't running any code on the client - that is, the simulated Tick() event is behaving differently for my new class than it does for the original.

So there you have it.  This one has got me stumped.  If anyone has any thoughts on what I'm missing I'd appreciate them.  I'm going to take a break from the mutator for a bit and maybe fail to make a map for a change.

'''Mychaeel:''' ServerPackages?  :-)

'''EntropicLqd:''' lol - definately not.  I have it added.  I think it's another one of these &quot;this object only exists on the client&quot; things so I might try a similar approach to my Power Core Volume Control mutator as see if that gives me any benefits. 
: Here's something that's weird though.  My Power Core Volume Control Mutator works fine with the bAddToServerPackages=True setting in the default properties section.  It works for all clients even though it's not in the ServerPackages list.
: This mutator refuses to work in the same way.  Pretty weird huh?  I've got the 2K4 source at work so I'll see if I can dig up any ''rules'' that might exist with the use of the bAddToServerPackages proeprty and see if I'm excluding it somehow.

{{classbox| 30th May 2004}}

Only a week since the last update - it feels more like a hundred years.  Damn I wisah I had a beer.  Anyways .. all things UScripty have been going reasonably well.  I finished my [[Legacy:Power Core Volume Control Mutator|Power Core Volume Control Mutator]] after coming up with what I feel is a novel solution to my client-side Emitter problem.

Since writing it I've discovered that Emitter's can be spawned on the server so the information I've added to the tutorial is incorrect.  I'll go back and correct it once I think I understand what is going on.

I've returned to my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator to continue with that.  The power node heal effect (gold glowy thing) now behaves exactly as I want it to.  However the spinning circle thing acts as an additional target is stubbornly refusing to obey even my simplest commands.

I suspect I've got another replication/network type issue although I've not tested that as I've moved to testing my code from a dedicated server by default.  Ho hum.  I guess that battle will continue tomorrow since I have the day off.  Should be able to find an hour or two somewhere.  Maybe.  Hopefully.  With luck.

On a different note I got my frettless bass back after a 5 year (maybe more) loan.  Played it in church this morning.  It was as nice as I remember it although I found it changed the way I played quite substantially.  I'll still be using the fretted bass for the gigs though.  The frettless doesn't really suit rock that well.

{{classbox| 23rd May 2004}}

Work and family life have been getting the better of me recently but I dug my heels in yesterday and locked myself in my office with the PC and actually got some Unreal Script coding in.

Rather than continue with my adjusting energy sphere mutator I thought I'd address something that I'm fed up with my clan-mates complaining about.  The electricity sound after an ONS Power Core is destroyed.  It's too loud, and universally hated.

After a bit of digging I found the [[Legacy:Emitter|Emitter]] (ooh never looked at them before) class I'd need to trap and naively thought that a simple IsA() check from the mutator's ''CheckReplacement()'' function would do the job.

It works beautifully - as long as you are on the server.

After some more digging it became evident that the vast majority of Emitters are only ever spawned on the client (which is sensible).  Unfortunately the CheckReplacement() function only ever runs on the server.  Ne'er the twain shall meet.

I'm currently engrossed in trying to find a way of trapping the creation of classes on the Clients of a networked game.  With no success so far it must be said.

If I fail to find anything then plan B is to replace the PowerCore objects with ones of my own construction (essentially a sub-class with a single function overidden) and my own Emitter.  This is not an attractive option - but needs must as the functionality fails.

{{classbox| 24th April 2004}}

I've been a very busy boy recently, but sadly its all been work related.  The total amount of time I've spent with 2K4 has been playing it late at night way past my bedtime.  Still, work should start calming down again in a couple of weeks time as we finally move all our services over to some shiny new machines (without any loss of service I might add).

My ''adjusting energy sphere'' mod still doesn't work.  It feels like the value I think is the node health actually isn't - but I've had so little time to dig into it that it's all pure conjecture at the moment. 

{{classbox| 9th April 2004}}

Well, work has progressed somewhat on the [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mod.  For a fixed height the code now works.  The ''timing'' problem I thought I had turned out to be a very simple math error.  The flare's also spawn in the correct place now.

Sadly when the node height is set to dynamic adjustment the code doesn't behave as desired.  Still, its not like I've spent any consistent time on the mutator yet so I'm still hopefull I'll be able to get it to work.  At the moment it looks like I'm using the wrong values for the node health.

{{classbox| 5th April 2004}}

I actually started work on my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator proper this weekend.  I didn't accomplish that much as I was squeezing it in between kids, visitors, and sleep.

I would appear that I've got two issues (besides a shiny GUI setup thing to do).
* Only some of the energy-sphere objects are moved to their correct height.  This feels like a timing issue - that is, my mutator is entering play before all of the energy-spheres which means some of them are being missed.
* The groovy flare thing is spawned is the wrong place when a node is re-charged.  I need to figure out a way of tieing the flare-effect to an energy sphere position.  Tricky since the flare-effect is spawned at the point the node is being built.

As you may have guessed I'm still trying to figure out a way of creating the mod without replacing any of the existing classes (that way lies madness).  The timing issue is going to be potentially inconvenient though.  I might get away with a timer on the mutator that kicks in a second after the map has started.

'''MythOpus:''' Why don't you make the flare get spawned by the energy-spheres and then attach them to themselves?

'''EntropicLqd:''' Because I'm trying hard to avoid having to sub-class the power-nodes with my own implementation and then making all the pre-existing ones invisible and handling all the un-linking of the old nodes and re-linking of the new ones.

'''Foxpaw:''' As for not getting all the energy spheres getting picked up, that's kind of wierd. However, if it is an artifact of the order stuffs being done in, you may be able to get around that by using Tick and a boolean variable like this:

&lt;uscript&gt;
var bool StillNeedsInitialization;

simulated function InitializeSpheres()
{
  StillNeedsInitialization = false;

  // Do the Init stuff here.
}

simulated function Tick( float Delta )
{
  if ( StillNeedsInitialization )
    InitializeSpheres();

  Super.Tick( Delta );
}

defaultproperties
{
  StillNeedsInitialization=true
}
&lt;/uscript&gt;

That might work better, if indeed the issue is an order of operations one. If it doesn't, you might try changing the boolean to a byte that decrements and initializes when it hits zero. Thus allowing your mutator to step in two or three ticks into play, when everything should be set up, but before players are likely to notice.

'''EntropicLqd:''' That's more or less what I had in mind.  However, I was thinking about setting a timer to fire once after a second within the PostBeginPlay() function.  That way I'll avoid the code running within Tick() each time.

Your use of simulated functions does raise something I hadn't considered .. is the &quot;healing flare&quot; created on the server or the client?  I suspect it's created on the server as it would need to be replicated to all the clients, and, the server is truth when determining &quot;hits&quot; on the energy sphere.

'''Foxpaw:''' You could use a timer if you'd like - though the code running in tick shouldn't be an issue. Reason being, that's very low impact code. (VERY low impact) It's only two (very) processor inexpensive operations. It's roughly on par with a single particle from a particle effect - less impact than a single light. So I wouldn't worry about it. ;)

As for the replication, I'm not sure about the flares - on the one hand, the server determines whether a shot hits or not. However, since the flare is more or less a purely visual effect, it may be client-side. For instance, rockets and the like, when they blow up, the explosion and stuff is draw client-side at the location that the rocket appears to hit on the client, so it appears to be right where the rocket appeared to hit. In fact, a rocket can appear to hit something and blow up on the client, and still continue and hit something on the server without any visual fx on the client. Of course, this is highly unlikely because rockets fly in a very predictable fashion, so they usually impact very near the same location on client and server.

So, the flares may be just client side and appear whenever you appear to be hitting the node - regardless of whether or not the server thinks you are or not. 

{{classbox| 30th March 2004}}

Been really busy recently with real-life stuff.  This looks set to continue for a bit so I'm probably going to have to curb my UT2004 time a little (boo hiss).  I have managed to find time to watch some of the VTMs that shipped with the SE version.  It was nice to see that they struggled to describe exactly what a ''brush'' was as well.

Anyways, my goal for this week is to finish off my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator and make sure that works.  Naturally I'll get bogged down in the config. GUI for it so it'll probably take me another 2-3 weeks to finish but that's normal.

I also need to just re-check my server query code and make sure it understands all UT2004's gametypes and responses.

{{classbox| 22nd March 2004}}

All development work has halted for the time being.  I'm taing a bit of time out to play through the single player UT2004 game.  Not sure why other than it's a lot of fun.  The weapon balance is massively improved and I'm using a fair greater variety of weapons than ever I have done before.

Things should be back to normal by the end of the week.  The gig on Saturday night went really well.  To use some immortal words, &quot;It rocked!&quot;.

'''Tarquin:''' Gig? what sort of gig? music? Glad to hear you like 2k4 &amp;ndash; seeing how much you hated 2k3, it's a very good indicator!!! :D

'''EntropicLqd:''' It was indeed a music gig.  I play Bass (5 String Honer if anyone cares) in a band.  We filled the pub we were in - about 40-50 people turned up.  Great fun.  In terms of 2K4, no-one was more suprised to find that I liked it than myself.  I was expecting to be leaving the Unreal Universe for the forseeable future.  I still find other players too hard to see but I'll be damned if I'll resort to using TTM (or some other brightskin style hack).  I'll just live with it.

{{classbox| 6th March 2004}}

Tonight (well, this morning now I guess since its 1am) I finished my server query code.  You can see it by clicking on the PHP script displayed in the directory at the URL below.  There's also all of the files required to run the script and an archive.

http://www.snout-clan.co.uk/ue_query/

The archive contains all the files including the README which took ages to write.  About the only obvious mistake you are likely to make with the form as it stands is selecting the incorrect game type.  Querying a XMP server with a game type of UT2004 is bad news.

I'll probably build some self-protection in there for the next release of the scripts (to support the retail UT2004 build).

All thoughts, comments, and feedback is welcome - especially from the code monkeys out there.  Now, I'm off to bed.  Happy playing. :)

In case you are living under a rock, UT2004 is gold and due for release on the 15th March.

'''El Muerte:''' looks nice, be prepared for emails from people that can't get your code to work :)

'''EntropicLqd:''' Thanks.  I've had to support mods and code I've released before and its generally a nightmare.  The number of people that don't even read the README never ceases to amaze me.  Still, such is life.  It's nice to know that something you've written is actually being played I guess.

{{classbox| 4th March 2004}}

Well, the XMP player status reported by the server query is fundamentally different to that of UT2K4 (not tried 2K3 yet).  There's a whole heap of artifact and class information in there that I wasn't expecting - not having ever tried U2XMP - but still.

This calls for some code refactoring.  Hopefully nothing to extreme but we shall see what transpires.  The server rules and game info seem to be in the same format though.

'''Bonus Update:'''

Oh yeah!  Amazingly I've got U2 XMP (complete with colour support), UT2003, and UT2004 server querying all apparently working like a dream.

The U2 XMP support still has some unknown values within the player data returned by the server.  Since I don't play it I don't have a client I can use to match the values up.

I'm still annoyed by the fact that you don't always get a full set of data back from the server every time you query it.  I'll probably add some optional support for persisting the data-blocks to a file or something so that if a data-block is not returned by the server I've got one handy.

The example display functions still need tweaking and the &quot;how to use this stuff&quot; documentation is also still in progress - but I'll have it done for the weekend.

The only cloud on the horizon is that with this and the 2K4 demo I've got a pile of real-life stuff to deal with.  Having to sleep is so annoying.

{{classbox| 3rd March 2004}}

I'm taking a day or two out from my Java game (which is going pretty well) to write some PHP code that will allow a 2K4 server to be queried and display the server information (current game etc).  [[Legacy:El Muerte|El Muerte]] has already looked at this problem and I'm actually extending his original code.

It's not been as straightforward as I had hoped as PHP 4.3.3 under Win32 doesn't have binary safe string functions.  The result of this is that I'm having to write my own string search and split functions.  Not difficult but a little tedious.

One of the other things I've discoverd is that UT2004 (the demo at least) only updates the server information it sends every 5 seconds or so.  Also, either I'm seeing some packet loss on my LAN (unlikely) or not all of the information is sent every time.

Having said all that it is going well, and in theory at least, the code should work for UT2003, Unreal 2, and Unreal 2004.  Whether it will or not remains to be seen.

The Java game is going well.  I can now shift marbles between wheels.  I'm intending to implement the primary and secondary game rules next.

'''Bonus Update:'''

The server query for the UT2004 demo works a treat.  Now all I need to do is update the documentation, create an example display function, and make sure it works for UT2003, UT, and Unreal 2 XMP.  All without breaking it for UT2004.  I've got to admit, there's not much of the original code left though.  I got a bit carried away.

I need an IP and port address for an Unreal 2 XMP server and a UT2003 server.  Can anyone help?

'''El Muerte:''' take your pick: http://gaming.multiplay.co.uk/?p=/serverlist.php%3Fsectionid%3D432 http://gaming.multiplay.co.uk/?p=/serverlist.php%3Fsectionid%3D432

'''EntropicLqd:''' Thanks - that's saved me 5 minutes of pain.  I would have found them myself - but I was just being lazy :o

{{classbox| 26th February 2004}}

I've re-written the mechanism used to connect the level peices together and added some additional functions that will (in theory at least) allow me to implement one of the primary game rules.

The marbles themselves can be moved around the level in a limited fashion now although there's still something really freaky going on with the rotation of them when they are within a wheel.  Its one of those problems that look like its an obvious one to solve but in reality it isn't - at least until its been found.

My new animation, movement, and collision code seems to be holding up well though, and I've got a mechanism in place to allow me to support the completion of the actual game objective.  Only the actualy checking code needs to be added.  This won't happen until I've resolved my rotation problem though.

Progress has been slowed somewhat by real-life, work on the next generation SNOUT website (code clean up mostly) and the UT2004 demo.

{{classbox| 16th February 2004}}

Most of the recent work has been focused on getting the map components required for the very first level together.  I have all the graphics in place now including the animations I need.

Most of my effort has been expended re-writing the animation and screen update functions.  While at it I also changed the way I'm handling collisions.  The code is now at the point where I don't think I'll be needing to change it again.  It's pretty flexible the way it is and feels like it will be able to support all my ideas for map pieces (famous last words).

One of the things I realised recently was that I need to change the way my map pieces are connected in order to implement one of the fundamental game rules.  It sounds like a lit of work but the change should drop out relatively easily.

Once I've resolved the map component connection issue I have I can work on getting my marbles to move around the map and start putting in the gameplay itself.

{{classbox| 10th February, 2004}}

Things are manically busy for me at the moment.  I thought I was busy before but I'm truly snowed this time.  The biggest difference being that I'm mostly having fun.

My primary task in life (not counting work which is really crap at the moment) is the build of a whole chunk of code for a business I'm starting with a few partners.  The architecture is undergoing its third interation now and is pretty much in the final shape it needs to be.  However although that's quite cool, I'm up to something even more neat.

I've decided to go all the way back to my roots and write a game.  The game itself is an approximate copy of one called ''Logical''.  It no longer runs on my PC - not suprising since it must be over a decade old now.  Maybe even 15 years.  So far it's been an interesting experience.  I've elected to write the game as a Java Applet.  This is partly because I don't have access to Flash (which would probably suit the game better) but mainly because it's relatively device independant.  Once I've got it working as an applet I'll host it on the SNOUT site and publish the source code.

Anyway, considering the small amount of time I'm actually spending on the game (given the other things I'm doing) it's actually going bery well.  I have animation and mouse input routines up and running.  I have a mechanism for holding levels that will ''do the job for now''.  The biggest area of pain has been images with transparency.  You can't copy them.  I have a work around but I'm not exactly overjoyed about it.  It's not hideous or anything, just frustrating.  The only benefit to my work around is that the memory footprint of the game will be reduced as a consequence.

Does anyone ever read this thing I wonder?

'''Tarquin:''' I do when I spot an update. I look forward to playing this applet thing. 

{{classbox| 2nd February, 2004}}

Somewhat off-topic but what the hell.  My new Bass amp, a Marshall B150, arrived today.  It's sitting in my hall at home in a ''big'' box.  Unfortunately I'm sitting at my desk at work a mere 12 miles away from a new toy with lots of twiddly knobs and sliders.  And I'm bored .... but you probably already figured that out.

Just in case anyone is remotely interested - the amp rocks.  It's truly awesomely fantastic.  It sounds so much better than the decade old Peavy I used to have that there really is no comparison.

{{classbox| 28th January, 2004}}

I fixed all the outstanding bugs in my UT mutator.  The weapon firing on re-spawn was the hardest one to spot.  All I'd done was place the weapon in a ready state as soon as it was given to the player.  Easily fixed but it took me a while to spot it.

The other two minor problems were simple logic bugs.  If the test goes well this Friday then I'll be able to formally release the mod - and that's another one out of the door.

I may do a version 2 of it that has it's own configuration page but I'll probably not bother.  I can't see the mutator being that popular.

And I still haevn't set the gametype on my map.  

{{classbox| 26th January, 2004}}

Well, my latest UT mutator [[Legacy:Mod Ideas/TeamWeaponArena|Mod Ideas/TeamWeaponArena]] is almost done.  I've got one outstanding bug to resolve and it's ready for public consumption.  Players fire immediately on spawning (unless they use jump to spawn) and I've no idea why.

I completely failed to do any work whatsoever on my CTF map - CTF-GauntPiglet.  Instead I played TrackMania.  A shallow yet compelling racing game (http://www.trackmania.com/).  If anyone can be bothered to drop me some feedback on the map, you can get the map here: http://www.snout-clan.co.uk/gauntpig.zip.

I still haven't set the gametype on the map :/

Last week was quite novel.  I had to turn down two requests to join mod teams.  Both were racing type mods and both of them would haev been pretty different.  It hurt to do but I really don't have the spare time in real life at the moment.  Maybe things will have calmed down by the end of Feb. but at the moment it's difficult to tell.</text>
    </revision>
    <revision>
      <id>2979</id>
      <timestamp>2007-12-23T17:35:13Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>A Sugg.  Of Sorts</comment>
      <text xml:space="preserve">I thought it might be interesting to be able to view my sporadic mod progress over a full year (or several) so I thought I'd re-create my developer journal.  It won't get updated regularly, but I can always hope for a monthly update.  Feel free to add comments in the appropriate sections if you so wish.  Date corrections are always welcome as it'll take me till June to remember that the years changed.

{{classbox| 22 December 2007}}

I can't believe it was so long ago since I wrote my deployable jump pad mutator for 2K4.  This year has really flown by.  I've just spent the last week working on some mutators for UT3 (the game rocks btw).  It's been good to actually have some concentrated time to get to grips with the code.  Although, to be fair, I did spend a ''lot'' of time &quot;testing&quot; the game out.

I've got a regeneration mutator all but finished.  The only thing I have left to do is the config. menu.  And I am currently totally and utterly stumped.  I've got so many regeneration options (you can set regeneration values for individual weapons) that I have to use a scroll pane.  However, I am unable to make the

The UI code in UT3 has to be the most appalling piece of hacked together excuse for code I've ever come across.  It really is the pits.  If anyone comes across a design document for the UT3 UI please pass it my way.

My current ''efforts'' in making the Scroll Pane work cause UT3 to GPF instantly.  The only error in the log is a &quot;File not found&quot; issue.  Naturally it isn't giving me any clues as to which file it is looking for.

I haven't sworn so much in a long time.

THe killer is that not being able to reliably create a UI effectively means that mods won't be released for the PS3 - no bugger will be able to configure them.

'''MythOpus:''' You know, you could just make a custom UI and hook it in somehow.  Something like the custom config menu in UT2004.  Could be fun.

{{classbox| 18 March 2007}}

I realised that I was being particularly dense with regards to the alignment of my emitter and solved that issue.  I basically needed to calculate the length of the original vector and apply it along the right axis to get the effect I wanted.

Aligning the jump pad to the ground is proving much harder.  I've caught the landing event and got the normal of the ground the pad has landed on.  I just need to work out how to apply that to the jump pad itself.  Maybe I'll sort it sometime this week.

{{classbox| 10 March 2007}}

Inspired by a recent LAN and some comments on the BuF forum I decided to dig out the UScript sources for 2K4 and have a crack at making a deployable jump pad.  It felt like it might be a fun thing to do.

Initially I simply subclassed the UTJumpPad and set it up so it could be Spawn()'d easily.  I borrowed and tweaked the &quot;throw weapon&quot; code in order to ensure that the jump pad went in the right direction and life was good.  Life remained good right up until the point I attempted to assign a mesh (or other graphical goodness) to my subclass.  My jump pad immediately stopped working.

I backtracked a bit and now have a separate class for the mesh base, the emitter(s) I want to use for the jump pad, and the jump pad itself.  I now have two problems.

'''The first''' (and smallest) is that I can't seem to match the rotation of my SpriteEmitter with the Rotation of it's parent without using a co-ordinate system of PTCS_Relative.  Which then means that the &quot;velocity&quot; I give the emitter is wrong.  I need to put the velocity into relative co-ordinate space but I can't remember how at the moment.

'''Update:''' I feel so old and stupid.  All I needed to do was get the magnitude of the &quot;velocity&quot; and assign it to the X component of the emitters velocity vector, set the Z component appropriately and it all works because the Unreal Engine does the co-ordinate space transform for me (which is nice).  Now on to the nasty big problem.

'''The second''' problem I have is that I want to align the mesh of the jump pad with the ground.  It looks OK on flat surfaces, but put it on a slope and it looks more ugly than a very ugly thing.  I must confess, I have absoloutely no idea how to go about fixing that.  I'm thinking traces from each &quot;corner&quot; or my mesh to attempt to derive some sort of &quot;plane&quot; I can align the mesh with, but that sounds like a lot of work for a bit of graphical cleanliness.

Ah well.  That's life.  I'm kind of tired now (late night/early morning combo aleways gets me) so I'm taking a break.

{{classbox| 07 January 2007}}

And so we move into a shiny new year.  Normaly at this point I'd look back and mourn at how my real life commitments eroded all the resources (time, enthusiasm, and energy) I was planning on ploughing into some mod/programming project.  Since I didn't set myself any targets at all there wasn't anything to feel sad about.

It's weird, even though I don't map or mod for UT2K4 at all I still visit the Wiki at least once a week.  Maybe it's because I have hope that I'll get back into modding and mapping with the release of UT2007.  Or maybe it's because the stuff that gets changed is (usually) quite interesting reading.

My initial thought is that I'd quite like to create a DM map whose structure changes based upon time and the number of players.  The concept is that the map has a number of events that can occur which change the structure of the map.  E.g. An energy beam generator explodes meaning that a previously closed tunnel is now open.  Or an unreachable walk-way half collapses allowing it to be used.  The player thing is simply doors to additional rooms that open up as the player count increases.  Bot-pathing the level could get interesting.

My biggest fear with the concept is that mapping in 2K7 will be so complex as to be beyond me.  Still, one can but try.

{{classbox| 04 June 2006}}

Well, 7 months has passed since my last update and I've made almost no progress on my Java game.  Basically I got to the point where I'd ironed out most of the flaws in the behaviour, implemented corners, and was ready to start introducing more map elements.  At that point I got bogged down with the graphics.  And after several hours trying to design some acceptable graphics I gave up.  I don't think I've looked at the game since.  Probably time to get some help from a more talented individual I guess.  But I'll have to wait for some free time before I ask.

I did spend some time thinking about what it would take to move the game into a 3D world.  It would be possible to introduce some cunning puzzles and tricks if each of the marbles had different properties so I might sit down and develop the idea a bit more.

So, apart from the family slowly sucking the life out of me, the covers band I play (bass) in has been busy and keeping me practicing for several hours as week.  We recently got a live recording done which came out better than I expected.  I'm likely to have a few copies spare so if anyone wants a copy drop me an email and I'll put one in the post.

I've also been toying with a monitoring application.  Basically an application generates a UDP data packet filled with transaction information (status, performance, all that stuff) and the monitor application catches that and displays it on screen.  The application is designed to work with configurable hosts, applications, and transactions.  It's given me a real insight into Java GUI programming - and I must confess, it sucks.

Oh, I also spent some time reverse engineering the map files for Flat Out (with some limited success).  You can see the results of my research at http://snout-clan.co.uk/flatout/

More recently I've returned to gaming and have been playing GRAW.  I'm still trying to figure out how to get a server up that will allow me to play the co-op missions with my brother and sister-in-law.  Since they are both behind the same firewall it seems to prevent them from joining the same game (even though they are running unique copies of the game and can join separate servers).

Ah well, real life calls once again.  UT2007 is on the horizon, and Flat Out 2 is imminent.  Spore seems like it'll be quite good.  And one day, my children will leave home and I'll have loads of free time.  Fantastic.

{{classbox| 06 November 2005}}

It's been an interesting week in the world of my little Java game.  At the beginning of the week I decided that I needed to refactor the movement and direction code.  I had too many constants with different values used for essentially the same thing.  This ''duplication'' was causing the code to get a little bulky.

So I embarked on a fairly major refactor.  The result has been something that I'm much happier with.  I no longer have multiple overlapping constants for movement and position, and I also have less code.

Some of the encapsulation is suspect, but I can live with that for the time being.  Basically, the game position class also understands about the movement characteristics of the map element it is associated with.  This isn't great from a design point of view but I the savings I was able to make by doing things that way currently outweigh the &quot;uncleanliness&quot; of the solution.  It's something that may change as I add more map elements.

Anyways, I've updated the on-line version with a new version of the code (Java 1.4 compatable this time).  It seems a lot less error prone than the previous version.  I also finally managed to squash the intermittent collision bug I was having with the wheels.

I'm now deciding whether to work on the game entry and level finish screens or more maps.  The former is going to be dull so I should probably do that first just to get it out of the way.

'''T1:''' BTW, you might be interested in http://gpwiki.org/

{{classbox| 29 October 2005}}

I just got back from North Wales having spent a week in comparative exile with the family.  A good time was had by all despite the torrential downpour.  As always I took my slabtop along to play DVDs for the kids.  In the end it turned out to be a very productive week.

The collision code has been completely re-written and now works in all situations.  I believe there is some scope for optimisation in the code as well should I need to shave some time off the main loop.  I've also implemented a bunch of queues for input events and object destruction and the like.  This has resolved a couple of outstanding issues with general gameplay.

In fact, I've got to the point where you can play a level should you wish to complete with rudimentary sounds.  The sounds are ''very'' loud and I need to tone them down a bit, but they will do for now.  I shamelessly nicked them from the Windows pinball game.

Out of all the things I implemented over the last week was the text-based level script.  Rather than have all of the levels &quot;hard-coded&quot; within the game, they are created using a simple text file.  This means that with a small readme (or something similar) anyone can create levels for the game.  This appears to have presented me with a small problem - I don't seem to be able to place the level files in the JAR file I want to use for distribution and still be able to access them.  There's probably a way around it but I'll have to do some digging to get it resolved.

Anyways, if you are feeling particularly brave, you can see the current ''not even worthy of a pre-alpha title'' code in action at: http://www.snout-clan.co.uk/stuff/marbled/marbled.html

I'm still not entirely happy with the main loop code, and not all of the game rules are implemented.  But at least I'm making progress.

'''MythOpus:''' I think I found a bug...  when you shoot a 'marble' from one of the shooters, and there is already a marble in the hole where you're shooting too... if you click on the marble in the hole, it get's shot and when it collides with the other marble, it pushes it back to the hole where it was shot from.  Then when the two marbles (which re now on top of eachother) hit the hole, one of the marbles stays and the other marble keeps going to a hole on the next rotating thinger...  I hope I've described it well enough...  I'm not good at this :P

'''EntropicLqd:''' Heh - I call the rotating things Wheels.  I didn't think that I'd implemented marble's bouncing off each other yet though.  I'm aware of the problem you describe but not in the manner you describe.  I've seen it when fooling with the &quot;drop point&quot; (the T-Junction that goes down to the first Wheel), but not between wheels.  However, you description is good enough for me to replicate what you did.  And I did say ''not worthy to even be a pre-alpha'' :).

'''T1:''' It says:

alt=&quot;Your browser understands the &lt;APPLET&gt; tag but isn't running the applet, for some reason. It does need the Java 1.4 runtime environment.&quot; Your browser is completely ignoring the &lt;APPLET&gt; tag! 

I have java, and I've run other applets before. I'm running Konqueror on Slackware Linux. Don't know if that'll help. I can run it using Firefox, however, I have no idea whatsoever what to do, but it's sort-of-fun-ish. I've figured out how to lose, but how do you win?

'''EntropicLqd:''' I noticed yesterday that the game tells you you have lost even when you win the level :).  In terms of your Konqueror problem, try this:

* Settings -&gt; Configure Konqueror -&gt; Java &amp; JavaScript
* Look for the box labeled &quot;Path to Java executable or 'Java'&quot;
* Try ''/usr/lib/jre/bin/java'' (you need to set the path to the Java executable).
* Restart Konqueror and you should be good to go.

'''T1:''' No, you misunderstand, Java is installed, set up, and works for other java stuff, just not this ONE applet. I already have that all set up. Also, how is winning supposed to work?

'''EntropicLqd:''' Ah - apologies.  Hmm, the most obvious thing is a JRE conflict or something similar.  Does Konqueror have any form of Java Console (like Firefox does)?  If so are there any clues in there?  You win the level by getting four marbles of the same colour into each of the wheels.

{{classbox| 22 October 2005}}

Pretty much giving up on everything PC related in my spare time back in July I focussed completely on playing bass.  Learnt a few songs, half-written some other stuff, and generally improved my playing a bit.  I also got some forced rest in September (pretty much all of September) due to an attack of nightmare headache/migraine type things.  And I've replayed through SCCT and NfSU2.  In the last week or so my head's been good enough to do stuff.  So I've returned to the Java game I started writing back in Feb. 2004.

It's been really good to get back into it, even if it did take me a couple of days to work out how it all fitted together.  I've actually added comments this time round and by the time I've got the first level fully working I expect it will be fully java-doc'd up.

Anyways, I've realised something quite interesting (I think I always knew but was unaware just how deep it went).  I'm driven by obsession.  I can only properly drive myself to do stuff if I have the time to obsess about it.  Only spending an hour on the odd evening doing something isn't enough for me to get driven about it - but is enough time for me to get frustrated at not having enough time to do it.  Thus begins the downard spiral....

Quite how I solve this, or get a balance between all the things I want to do so that I don't get frustrated with any of them I'm not sure yet.

Back to the game.  After looking through the code I was unhappy with the collision code.  It was slow, and incredibly inefficient.  I've replaced it all as I've used the structure of the map to optimise it significatnyl.  This required a significant overhaul of huge sections of the code and impacted on the driving loop (that controls the animations as well).  The result is a lot less code to do the same thing faster, and I'm still not ''quite'' happy with the collision code.  However, the basic structure feels right.

The other thing I've realised I need to introduce is a queuing system for user inputs.  The game is completely mouse driven and the mouse clicks take effect immediately.  This can lead to some weird artifacts on screen (or the animation thread dying) so it's got to go.  I have a sneaky suspicion that the animation thread is dying for a different reason - but I need the input queue anyway.

{{classbox| 20 July 2005}}

I've all but stopped playing UT2004 - the social network that kept me playing it no longer exists.  I've toyed listlestly with BF2.  I've played through GTA San Andreas.  And all it has done is driven home just how pointless gaming and modding really is.  The thought of doing any kind of programming (in any language) in the evening doesn't appeal anymore.  In fact if it wasn't for my bass guitar I'd have probably resigned myself to becoming a zombified TV watching android.

Maybe I've suddenly got middle-aged.  If middle-age can be defined by a feeling that everything should have a purpose, and that fun in and of itself is not a valid purpose for doing anything, then I'm there.

Ah well.  Roll on UT2007, and STALKER.  And if anyone sees my ''spark of creativity'' lying around pop it in the post.

'''MythOpus:''' Perhaps you've just hit your peak called 'depression.'  Many people seem to be going through that lately.  I don't play UT2004 anymore.  Reason:  I don't like the game much :|  I just code for it.  Fortunately for me, I have my coding and a special someone to keep my thoughts from wandering again into what I call, &quot;Depression Zone&quot;  You have a wife do you not?  Anyways, the depression shall pass and you shall find your spark once more.  Maybe do up some graphics in your favorite image editing program (Yay Photoshop) and do a Photo Blog of sorts :)

'''Graphik:''' No, it's not about being middle-aged. I am nowhere near middle-aged (the actual distance would likely surprise you) and I've felt this way for a while. I think what is needed is to change where you look for fulfillment, as you've exhausted the current avenues. Say you found UnrealEd fun. Try making Pixar-style short films in Maya. It's a complete change in perspective, while maintaining a enough similarity to ensure you're not too far off from your original passion.

I don't think UT2007 is the answer, either; it's another UT with a new coat of paint. Looks like we'll have to wait another generation of games for somthing that really brings a community together like UT did.

'''MythOpus:''' Ya with the lost of UTIRC, I think the community really broke apart.  Not to mention the actual gameplay as in team work of UT2K- was really broken.  We really do need a new UT.  Maybe all of the coders and modellers etc on the WIKI can get together and throw some ideas around ?

'''T1:''' Hmmm. I've never had an internet capable gaming PC, so I've never really played online more than 2 or 3 times. However, I've definitely noticed a decline in the funness (That's not really a word is it?) in UT2003/UT2004 compared to UT. I usually play UT with bots and for messing with code, sometimes I play with friends on my LAN, however. Hmm.. throw some ideas around? How about some more thought-oriented gameplay? I'm really getting tired of this kill-kill-kill button-pushing that is in every game almost. I wish there was an FPS were the strategies and tactics you used we're just as important as your accuracy. I'm not really talking about making it more &quot;realistic&quot;, however &quot;semi-realistic&quot; gameplay might help a bit. I think I might make a mod ideas page for a gametype I thought of. If someone wishes to make a mod made by the combined efforts of the wikizens then I would help code such a gametype into a larger mod.

'''Graphik:''' I smell a Counter-Strike clone. ;)

'''T1:''' I wouldn't take part in such a mod. EVER.

'''EntropicLqd:''' Thanks for the thoughts.  I shall ponder them while I'm away on holiday and &quot;unplugged&quot;.

'''Solid Snake:''' I think we all go through that period where we simply just need time off the computer to pursue other needs/wants. This is somewhat common, with certain things as well as work for example. I often just not do anything computer related for awhile, or I play other games which are more sort of regenerative rather than destructive (Simcity type games vs blowing stuff up type games). That tends to recharge the batteries for myself.

'''zugy:''' Yeah I go through this alot. Lately, in order to prevent this, I go through a cycle of sorts-I do some mapping, then some coding and now I'm in a modeling stage. I need to constantly be doing new things and learning (I admit it, I like to learn...go ahead and sue me, teachers :P). By rotating around I stay interested in modding, and still keep fresh on certain aspects of it. Now that I think about it, I've been neglecting my map lately :)

'''Aphex:''' Still goin strong I see!  I still play the original UT - can't beat the old classic IMO!  Erm except I'm recently partial to a bit of BF2 actually - took a while, but grew on me in the end. Still keeping a creative spark going here: moved to writing own game.  But yes, gotta watch for the burn-out.

{{classbox| 07 January 2005}}

While I was attempting to go to sleep last night I thought of an optimisation I could make to my Tri-Puzzle solving program.  The optimisation (replacing to bitwise ANDs with an XOR) was possible because of the way I arranged the bit masks I was using to denote the different pieces.  It's not a huge optimisation, but it does shave 300ms off the total processing time.

Also of note, my eBow (www.ebow.com) arrived in the post this morning.  I'd be fiddling with it now but I'm waiting for the rain to stop before venturing out to buy a battery.

{{classbox| 06 January 2005}}

I've been sorely neglecting this journal for a long time for one simple reason.  I've pretty much halted all thoughts of modding.  This is partly due to time constraints - the family and the band keep me pretty much occupied full time.  But mainly it's because my heart isn't in it.

It depresses me to think that the most interesting piece of code I wrote in Q4 2004 was a small program to solve a 16 piece jigsaw puzzle with triangular pieces.  The whole process took about 8 hours from initial code inception, testing and debugging, and the final run which found both solutions to the puzzle.

I have considered whether I've just got to old for games, but I find that thought somewhat ludicrous.  I've also spent pretty much the entire last couple of weeks playing FlatOut (www.flatoutgame.com) and Need for Speed Undergrouns 2.  Both a nice enough games (I prefer FlatOut, my bro' prefers NSFU2).

So, what's in store for this year?  To be honest I have no idea.  It would be nice to think that I'll get back into coding in my spare time and become as enthused with software development as I was a decade ago.  It's more likely that I'll get bullied into writing a profile editor for NFSU2.  Not stunningly interesting, but potentially amusing nonetheless.

{{classbox| 19 August 2004}}

Thanks to my previous efforts, a slightly slack day at work, a bout of insomnia last night and some help from Tarquin my &quot;curve&quot; track builder appears to work.

You can specifiy the start and end radius, the angle of the curve, the start and end track width, and the start and end bank angle.  You can also opt for left/right/center alignment of the change in track width.  With the right parameters you could probably make it generate a section of straight track :).

Now that I've got curves and straights I'll have to do slope entry and exits next.  Once they are done I can start playing with some track ideas.

One thing I have noticed is that UT2004's Unreal Ed is much more prone to BSP errors than any of the previous versions.

{{classbox| 18 August 2004}}

Thanks to the [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] page I built my very first custom BrushBuilder last night to create a section of &quot;racing track&quot;.  I realise that static meshes are the way to go - but what the hell :).  It was an interesting exercise and I'm going to do another one, but this time with curves.

{{classbox| 15 August 2004}}

Since my last update I've done nothing.  Nada.  Nowt.  No modding, coding, scripting, or anything even remotely associated with creating anything of any purpose.   Maybe I'm heading for a mid-life crisis or something but I can't get enough enthusiasm to start anything even though I know I'll get into it once I've got started.

I downloaded UnWheel a couple of days ago.  It plays pretty well although it suffers from &quot;hovering car&quot; syndrome, and the cars don't really feel like they are moving that quickly.  The camera system is a little odd.  It kind of freaked me out at first that the camera was still under mouse control.  I'm still undecided as to whether I like that approach or not.  I don't know what it is with driving games, but on the whole the cars never feel like they are actually on the ground.  Trackmania, GTA VC, and Midtown Madness are notable exceptions.

Maybe I'll have a crack at building a circuit - I like racing games that don't take themselves too seriously.  Heck, having complained about the poor car handling, maybe I should see if I can do better (hah - yeah right).

{{classbox| 25 June 2004}}

I've had some bug reports from a couple of the mutators I've released.

'''Power Core Volume Control'''
* When playing a game with rounds the buzzing sound still kicks in at the end of the round.  Not a big deal as it only lasts a second or so but I'll still fix it.

'''Adjusting Energy Sphere'''
* I've had reports of people playing matches where one player in the game cannot see the Energy Sphere's - they are simply invsible.  This only seems to happen on the first game of a session.  The majority (2 out of 3) cases of this have been where people have joined mid-game.  The third case was someone playing an instant action game.
: So far I've not been able to reproduce this one on my LAN at home.  It needs fixing.

{{classbox| 15 June 2004}}

I've been ruminating on what my next project should be, and while I was lying awake in bed at 4am this monring I think I've got.  The project needed to be long term enough that I can spend a lot of time thinking about it without actually doing anything (real life is in the way atm), and something that I'm most likely going to find challenging but not impossible.

Anyway, my next project is going to be a mapping project.  I'm going to build a DM map called DM-EventFull.  The map is going to be based in an abandoned base built originally for the study of seismology but evacuated for safety reasons.

The brief is to build the map such that earthquakes occur at random intervals throughout the game.  These earthquakes trigger randomly selected ''events''.  The ideas I've had for the events so far are:
* Dust falling from the ceiling
* Collapsing pipe-work in the walls
* Short-circuiting electrics
* Cracks appearing in floors
* Beams and girders falling from the ceiling.
* Collapsing brickwork.
* Lights flickering or shutting down completely.
* Others that I'll no doubt think of later.

Because the events happen in a random order, and at random intervals no two games will be exactly alike.  I'm considering making all of the events non-gameplay effecting, but it might be fun to have different routes through the map open up as the game progresses.

If I get even half-way to realising the idea I have in my head I'll be satisfied.  Traditionally my mapping is as lacking as my drawing skills.  But we shall see how things go.

If it's anything like my normal mapping projects It'll never be finished.

{{classbox| 14 June 2004}}

Well, its finally done, dusted, and released.  The Adjusting Energy Sphere mutator finally got finished up and for those that want it, you can find it here: http://www.snout-clan.co.uk/p.php?p=3065.  Sadly that brings to a close this brief (but enjoyable) modding spree.  Real Life and work must once again take precedence over having a bit of fun.  Bummer really.  Still, serves me right for not being an unemployed bum or a college student I guess. 

{{classbox| 05 June 2004}}

Woke up this morning on the 4th June (it's gone midnight here) and realised that I was wrong about the ROLE_None statement below.  I go to correct the information on the Wiki and see that Mych. had beaten me to it (kind of).  Anyways its all sorted now.

I spent this evening optimising and tuning my mutator.  I had a couple of ''Uh-Oh what have a I done'' moments but it's all sorted now and the code is much cleaner although possibly not as clear as it was.

Anyways my mutator is done, and tested (as much as I can test it - Listen server + 1 client, dedicated server with 1 client, instant action).  It's now ready for some proper network testing once I've written the read me and commented out some of the log statements.  I'll also throw up a tutorial page on the Wiki on how it's put together.  It's another interesting one from a network/replication point of view.

Sadly that's going to be it for a while as real-life work commitments are beconing urgently.  I wouldn't mind making an ONS map next - and fleshing out the [[Legacy:Mapping For ONS|Mapping for ONS]] page a little more (with how to actually put the maps together).  Whether I'll get time remains to be seen.

And now .... it's bedtime.  Zzzzzz

{{classbox| 03 June 2004}}

Well, I have finally resolved my problems with the [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator I've been attempting to write.  It all boiled down to a misunderstanding of the way Actor's with a [[Legacy:Role|Role]] of ROLE_None actually works.  This misunderstanding was causing all sorts of weird side-effects to be seen in-game and I was tearing my hair out trying to work out what was causing them.

Actor's with a role of ROLE_None are created on both the server and the game client.  However, the two objects are '''completely independant'' of each other.  Destroying the actor on the server will not destroy it on the client, and equally, destroying the actor on the client will not remove it from the server.

The '''real killer''' is that destroying the Actor on the server from a mutator's IsRelevant() function doesn't prevent it from being created on the client.

So anyway, the upshot of this bolt from the blue is that my mutator appears to work in all network modes now.  All I need to do is optimise the code a little (I'm doing stuff in Tick() so I want it as light as possible) and get it on my server for some hammering.

{{classbox| 31st May 2004}}

Well, I've ground to a complete halt.  I can confidently say that my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] is not going to progress any further unless I have an incredible flash of inspiration and figure out just how the hell the [[Legacy:ONSPowerNodeEnergySphere|ONSPowerNodeEnergySphere]] object works.

I should have known today was going to be bad when it took me half an hour to spot an error in my code that was so glaringly obvious it was correct beyond all need of checking.  I've reproduced it below.  As a passer-by it should be immediately obvious to you.

&lt;uscript&gt;
defaultproperties {
  RemoteRole=SimulatedProxy
}
&lt;/uscript&gt;

Anyway, I'll attempt to describe my problem.

When a PowerNode is under construction a spinning circular thing appears above the node in a &quot;ghost&quot; style skin (it goes solid once the node has constructed).  This spinning circular thing is the ONSPowerNodeEnergySphere object.  This object is a pure client side construction - it has a remote role of ROLE_None.  The location of the spinning thing appears to be set by a couple of bones (who have their own unique co-ordinate system).

I want to be able to change the height of the energy sphere based upon the health of the PowerNode it is attached to.  Sounds pretty straightforward.

So I create my own energy sphere object, subclassing from the existing ONSPowerNodeEnergySphere class to avoid having to duplicate a chunk of code.  I add some code to handle the node height and things should be fluffy.  Not so.  My own energy sphere class is shown below (warning the bone location might not be right - I was fiddling with it earlier):

&lt;uscript&gt;
class AdjustingPowerNodeEnergySphere extends ONSPowerNodeEnergySphere;

var float CalculatedHeight;
var int counter;

replication {
  reliable if (Role == ROLE_Authority)
    CalculatedHeight;
}

function PostBeginPlay() {
  Super.PostBeginPlay();
  if ( self.PowerNode != None &amp;&amp; Self.PowerNode.EnergySphere == None ) {
    self.PowerNode.EnergySphere = Self;
  }
  Log(&quot;AdjustingPowerNodeEnergySphere:: PostBeingPlay() is in play&quot;);
}

simulated event Tick(float DT) {
  local vector v;
  Super.Tick(DT);
  v.X = 0; v.Y = -1*self.CalculatedHeight; v.Z = 0;
  SetBoneLocation( 'EnergyInducers', v );

  if ( ++self.Counter &gt; 100 ) Log(&quot;AdjustingPowerNodeEnergySphere:: Updating bone position&quot;);
}

defaultproperties {
  RemoteRole=ROLE_SimulatedProxy
}
&lt;/uscript&gt;

I have the following problems:
* The original spinning energy sphere is still created in its original position above the power node.
* My new energy sphere object is created in the right place and changes position with the node health, but does not have the right skin assigned to it.  I'm using bone's at the moment but setting it's absoloute position should also work.
* My new energy sphere also fails to &quot;spin&quot; in the same way that the orginal one does.

This tells me the following things:
* I'm not destroying the original Energy Sphere object properly.
* My energy sphere class isn't running any code on the client - that is, the simulated Tick() event is behaving differently for my new class than it does for the original.

So there you have it.  This one has got me stumped.  If anyone has any thoughts on what I'm missing I'd appreciate them.  I'm going to take a break from the mutator for a bit and maybe fail to make a map for a change.

'''Mychaeel:''' ServerPackages?  :-)

'''EntropicLqd:''' lol - definately not.  I have it added.  I think it's another one of these &quot;this object only exists on the client&quot; things so I might try a similar approach to my Power Core Volume Control mutator as see if that gives me any benefits. 
: Here's something that's weird though.  My Power Core Volume Control Mutator works fine with the bAddToServerPackages=True setting in the default properties section.  It works for all clients even though it's not in the ServerPackages list.
: This mutator refuses to work in the same way.  Pretty weird huh?  I've got the 2K4 source at work so I'll see if I can dig up any ''rules'' that might exist with the use of the bAddToServerPackages proeprty and see if I'm excluding it somehow.

{{classbox| 30th May 2004}}

Only a week since the last update - it feels more like a hundred years.  Damn I wisah I had a beer.  Anyways .. all things UScripty have been going reasonably well.  I finished my [[Legacy:Power Core Volume Control Mutator|Power Core Volume Control Mutator]] after coming up with what I feel is a novel solution to my client-side Emitter problem.

Since writing it I've discovered that Emitter's can be spawned on the server so the information I've added to the tutorial is incorrect.  I'll go back and correct it once I think I understand what is going on.

I've returned to my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator to continue with that.  The power node heal effect (gold glowy thing) now behaves exactly as I want it to.  However the spinning circle thing acts as an additional target is stubbornly refusing to obey even my simplest commands.

I suspect I've got another replication/network type issue although I've not tested that as I've moved to testing my code from a dedicated server by default.  Ho hum.  I guess that battle will continue tomorrow since I have the day off.  Should be able to find an hour or two somewhere.  Maybe.  Hopefully.  With luck.

On a different note I got my frettless bass back after a 5 year (maybe more) loan.  Played it in church this morning.  It was as nice as I remember it although I found it changed the way I played quite substantially.  I'll still be using the fretted bass for the gigs though.  The frettless doesn't really suit rock that well.

{{classbox| 23rd May 2004}}

Work and family life have been getting the better of me recently but I dug my heels in yesterday and locked myself in my office with the PC and actually got some Unreal Script coding in.

Rather than continue with my adjusting energy sphere mutator I thought I'd address something that I'm fed up with my clan-mates complaining about.  The electricity sound after an ONS Power Core is destroyed.  It's too loud, and universally hated.

After a bit of digging I found the [[Legacy:Emitter|Emitter]] (ooh never looked at them before) class I'd need to trap and naively thought that a simple IsA() check from the mutator's ''CheckReplacement()'' function would do the job.

It works beautifully - as long as you are on the server.

After some more digging it became evident that the vast majority of Emitters are only ever spawned on the client (which is sensible).  Unfortunately the CheckReplacement() function only ever runs on the server.  Ne'er the twain shall meet.

I'm currently engrossed in trying to find a way of trapping the creation of classes on the Clients of a networked game.  With no success so far it must be said.

If I fail to find anything then plan B is to replace the PowerCore objects with ones of my own construction (essentially a sub-class with a single function overidden) and my own Emitter.  This is not an attractive option - but needs must as the functionality fails.

{{classbox| 24th April 2004}}

I've been a very busy boy recently, but sadly its all been work related.  The total amount of time I've spent with 2K4 has been playing it late at night way past my bedtime.  Still, work should start calming down again in a couple of weeks time as we finally move all our services over to some shiny new machines (without any loss of service I might add).

My ''adjusting energy sphere'' mod still doesn't work.  It feels like the value I think is the node health actually isn't - but I've had so little time to dig into it that it's all pure conjecture at the moment. 

{{classbox| 9th April 2004}}

Well, work has progressed somewhat on the [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mod.  For a fixed height the code now works.  The ''timing'' problem I thought I had turned out to be a very simple math error.  The flare's also spawn in the correct place now.

Sadly when the node height is set to dynamic adjustment the code doesn't behave as desired.  Still, its not like I've spent any consistent time on the mutator yet so I'm still hopefull I'll be able to get it to work.  At the moment it looks like I'm using the wrong values for the node health.

{{classbox| 5th April 2004}}

I actually started work on my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator proper this weekend.  I didn't accomplish that much as I was squeezing it in between kids, visitors, and sleep.

I would appear that I've got two issues (besides a shiny GUI setup thing to do).
* Only some of the energy-sphere objects are moved to their correct height.  This feels like a timing issue - that is, my mutator is entering play before all of the energy-spheres which means some of them are being missed.
* The groovy flare thing is spawned is the wrong place when a node is re-charged.  I need to figure out a way of tieing the flare-effect to an energy sphere position.  Tricky since the flare-effect is spawned at the point the node is being built.

As you may have guessed I'm still trying to figure out a way of creating the mod without replacing any of the existing classes (that way lies madness).  The timing issue is going to be potentially inconvenient though.  I might get away with a timer on the mutator that kicks in a second after the map has started.

'''MythOpus:''' Why don't you make the flare get spawned by the energy-spheres and then attach them to themselves?

'''EntropicLqd:''' Because I'm trying hard to avoid having to sub-class the power-nodes with my own implementation and then making all the pre-existing ones invisible and handling all the un-linking of the old nodes and re-linking of the new ones.

'''Foxpaw:''' As for not getting all the energy spheres getting picked up, that's kind of wierd. However, if it is an artifact of the order stuffs being done in, you may be able to get around that by using Tick and a boolean variable like this:

&lt;uscript&gt;
var bool StillNeedsInitialization;

simulated function InitializeSpheres()
{
  StillNeedsInitialization = false;

  // Do the Init stuff here.
}

simulated function Tick( float Delta )
{
  if ( StillNeedsInitialization )
    InitializeSpheres();

  Super.Tick( Delta );
}

defaultproperties
{
  StillNeedsInitialization=true
}
&lt;/uscript&gt;

That might work better, if indeed the issue is an order of operations one. If it doesn't, you might try changing the boolean to a byte that decrements and initializes when it hits zero. Thus allowing your mutator to step in two or three ticks into play, when everything should be set up, but before players are likely to notice.

'''EntropicLqd:''' That's more or less what I had in mind.  However, I was thinking about setting a timer to fire once after a second within the PostBeginPlay() function.  That way I'll avoid the code running within Tick() each time.

Your use of simulated functions does raise something I hadn't considered .. is the &quot;healing flare&quot; created on the server or the client?  I suspect it's created on the server as it would need to be replicated to all the clients, and, the server is truth when determining &quot;hits&quot; on the energy sphere.

'''Foxpaw:''' You could use a timer if you'd like - though the code running in tick shouldn't be an issue. Reason being, that's very low impact code. (VERY low impact) It's only two (very) processor inexpensive operations. It's roughly on par with a single particle from a particle effect - less impact than a single light. So I wouldn't worry about it. ;)

As for the replication, I'm not sure about the flares - on the one hand, the server determines whether a shot hits or not. However, since the flare is more or less a purely visual effect, it may be client-side. For instance, rockets and the like, when they blow up, the explosion and stuff is draw client-side at the location that the rocket appears to hit on the client, so it appears to be right where the rocket appeared to hit. In fact, a rocket can appear to hit something and blow up on the client, and still continue and hit something on the server without any visual fx on the client. Of course, this is highly unlikely because rockets fly in a very predictable fashion, so they usually impact very near the same location on client and server.

So, the flares may be just client side and appear whenever you appear to be hitting the node - regardless of whether or not the server thinks you are or not. 

{{classbox| 30th March 2004}}

Been really busy recently with real-life stuff.  This looks set to continue for a bit so I'm probably going to have to curb my UT2004 time a little (boo hiss).  I have managed to find time to watch some of the VTMs that shipped with the SE version.  It was nice to see that they struggled to describe exactly what a ''brush'' was as well.

Anyways, my goal for this week is to finish off my [[Legacy:Mod Ideas/AdjustableEnergySphereHeight|Mod Ideas/AdjustableEnergySphereHeight]] mutator and make sure that works.  Naturally I'll get bogged down in the config. GUI for it so it'll probably take me another 2-3 weeks to finish but that's normal.

I also need to just re-check my server query code and make sure it understands all UT2004's gametypes and responses.

{{classbox| 22nd March 2004}}

All development work has halted for the time being.  I'm taing a bit of time out to play through the single player UT2004 game.  Not sure why other than it's a lot of fun.  The weapon balance is massively improved and I'm using a fair greater variety of weapons than ever I have done before.

Things should be back to normal by the end of the week.  The gig on Saturday night went really well.  To use some immortal words, &quot;It rocked!&quot;.

'''Tarquin:''' Gig? what sort of gig? music? Glad to hear you like 2k4 &amp;ndash; seeing how much you hated 2k3, it's a very good indicator!!! :D

'''EntropicLqd:''' It was indeed a music gig.  I play Bass (5 String Honer if anyone cares) in a band.  We filled the pub we were in - about 40-50 people turned up.  Great fun.  In terms of 2K4, no-one was more suprised to find that I liked it than myself.  I was expecting to be leaving the Unreal Universe for the forseeable future.  I still find other players too hard to see but I'll be damned if I'll resort to using TTM (or some other brightskin style hack).  I'll just live with it.

{{classbox| 6th March 2004}}

Tonight (well, this morning now I guess since its 1am) I finished my server query code.  You can see it by clicking on the PHP script displayed in the directory at the URL below.  There's also all of the files required to run the script and an archive.

http://www.snout-clan.co.uk/ue_query/

The archive contains all the files including the README which took ages to write.  About the only obvious mistake you are likely to make with the form as it stands is selecting the incorrect game type.  Querying a XMP server with a game type of UT2004 is bad news.

I'll probably build some self-protection in there for the next release of the scripts (to support the retail UT2004 build).

All thoughts, comments, and feedback is welcome - especially from the code monkeys out there.  Now, I'm off to bed.  Happy playing. :)

In case you are living under a rock, UT2004 is gold and due for release on the 15th March.

'''El Muerte:''' looks nice, be prepared for emails from people that can't get your code to work :)

'''EntropicLqd:''' Thanks.  I've had to support mods and code I've released before and its generally a nightmare.  The number of people that don't even read the README never ceases to amaze me.  Still, such is life.  It's nice to know that something you've written is actually being played I guess.

{{classbox| 4th March 2004}}

Well, the XMP player status reported by the server query is fundamentally different to that of UT2K4 (not tried 2K3 yet).  There's a whole heap of artifact and class information in there that I wasn't expecting - not having ever tried U2XMP - but still.

This calls for some code refactoring.  Hopefully nothing to extreme but we shall see what transpires.  The server rules and game info seem to be in the same format though.

'''Bonus Update:'''

Oh yeah!  Amazingly I've got U2 XMP (complete with colour support), UT2003, and UT2004 server querying all apparently working like a dream.

The U2 XMP support still has some unknown values within the player data returned by the server.  Since I don't play it I don't have a client I can use to match the values up.

I'm still annoyed by the fact that you don't always get a full set of data back from the server every time you query it.  I'll probably add some optional support for persisting the data-blocks to a file or something so that if a data-block is not returned by the server I've got one handy.

The example display functions still need tweaking and the &quot;how to use this stuff&quot; documentation is also still in progress - but I'll have it done for the weekend.

The only cloud on the horizon is that with this and the 2K4 demo I've got a pile of real-life stuff to deal with.  Having to sleep is so annoying.

{{classbox| 3rd March 2004}}

I'm taking a day or two out from my Java game (which is going pretty well) to write some PHP code that will allow a 2K4 server to be queried and display the server information (current game etc).  [[Legacy:El Muerte|El Muerte]] has already looked at this problem and I'm actually extending his original code.

It's not been as straightforward as I had hoped as PHP 4.3.3 under Win32 doesn't have binary safe string functions.  The result of this is that I'm having to write my own string search and split functions.  Not difficult but a little tedious.

One of the other things I've discoverd is that UT2004 (the demo at least) only updates the server information it sends every 5 seconds or so.  Also, either I'm seeing some packet loss on my LAN (unlikely) or not all of the information is sent every time.

Having said all that it is going well, and in theory at least, the code should work for UT2003, Unreal 2, and Unreal 2004.  Whether it will or not remains to be seen.

The Java game is going well.  I can now shift marbles between wheels.  I'm intending to implement the primary and secondary game rules next.

'''Bonus Update:'''

The server query for the UT2004 demo works a treat.  Now all I need to do is update the documentation, create an example display function, and make sure it works for UT2003, UT, and Unreal 2 XMP.  All without breaking it for UT2004.  I've got to admit, there's not much of the original code left though.  I got a bit carried away.

I need an IP and port address for an Unreal 2 XMP server and a UT2003 server.  Can anyone help?

'''El Muerte:''' take your pick: http://gaming.multiplay.co.uk/?p=/serverlist.php%3Fsectionid%3D432 http://gaming.multiplay.co.uk/?p=/serverlist.php%3Fsectionid%3D432

'''EntropicLqd:''' Thanks - that's saved me 5 minutes of pain.  I would have found them myself - but I was just being lazy :o

{{classbox| 26th February 2004}}

I've re-written the mechanism used to connect the level peices together and added some additional functions that will (in theory at least) allow me to implement one of the primary game rules.

The marbles themselves can be moved around the level in a limited fashion now although there's still something really freaky going on with the rotation of them when they are within a wheel.  Its one of those problems that look like its an obvious one to solve but in reality it isn't - at least until its been found.

My new animation, movement, and collision code seems to be holding up well though, and I've got a mechanism in place to allow me to support the completion of the actual game objective.  Only the actualy checking code needs to be added.  This won't happen until I've resolved my rotation problem though.

Progress has been slowed somewhat by real-life, work on the next generation SNOUT website (code clean up mostly) and the UT2004 demo.

{{classbox| 16th February 2004}}

Most of the recent work has been focused on getting the map components required for the very first level together.  I have all the graphics in place now including the animations I need.

Most of my effort has been expended re-writing the animation and screen update functions.  While at it I also changed the way I'm handling collisions.  The code is now at the point where I don't think I'll be needing to change it again.  It's pretty flexible the way it is and feels like it will be able to support all my ideas for map pieces (famous last words).

One of the things I realised recently was that I need to change the way my map pieces are connected in order to implement one of the fundamental game rules.  It sounds like a lit of work but the change should drop out relatively easily.

Once I've resolved the map component connection issue I have I can work on getting my marbles to move around the map and start putting in the gameplay itself.

{{classbox| 10th February, 2004}}

Things are manically busy for me at the moment.  I thought I was busy before but I'm truly snowed this time.  The biggest difference being that I'm mostly having fun.

My primary task in life (not counting work which is really crap at the moment) is the build of a whole chunk of code for a business I'm starting with a few partners.  The architecture is undergoing its third interation now and is pretty much in the final shape it needs to be.  However although that's quite cool, I'm up to something even more neat.

I've decided to go all the way back to my roots and write a game.  The game itself is an approximate copy of one called ''Logical''.  It no longer runs on my PC - not suprising since it must be over a decade old now.  Maybe even 15 years.  So far it's been an interesting experience.  I've elected to write the game as a Java Applet.  This is partly because I don't have access to Flash (which would probably suit the game better) but mainly because it's relatively device independant.  Once I've got it working as an applet I'll host it on the SNOUT site and publish the source code.

Anyway, considering the small amount of time I'm actually spending on the game (given the other things I'm doing) it's actually going bery well.  I have animation and mouse input routines up and running.  I have a mechanism for holding levels that will ''do the job for now''.  The biggest area of pain has been images with transparency.  You can't copy them.  I have a work around but I'm not exactly overjoyed about it.  It's not hideous or anything, just frustrating.  The only benefit to my work around is that the memory footprint of the game will be reduced as a consequence.

Does anyone ever read this thing I wonder?

'''Tarquin:''' I do when I spot an update. I look forward to playing this applet thing. 

{{classbox| 2nd February, 2004}}

Somewhat off-topic but what the hell.  My new Bass amp, a Marshall B150, arrived today.  It's sitting in my hall at home in a ''big'' box.  Unfortunately I'm sitting at my desk at work a mere 12 miles away from a new toy with lots of twiddly knobs and sliders.  And I'm bored .... but you probably already figured that out.

Just in case anyone is remotely interested - the amp rocks.  It's truly awesomely fantastic.  It sounds so much better than the decade old Peavy I used to have that there really is no comparison.

{{classbox| 28th January, 2004}}

I fixed all the outstanding bugs in my UT mutator.  The weapon firing on re-spawn was the hardest one to spot.  All I'd done was place the weapon in a ready state as soon as it was given to the player.  Easily fixed but it took me a while to spot it.

The other two minor problems were simple logic bugs.  If the test goes well this Friday then I'll be able to formally release the mod - and that's another one out of the door.

I may do a version 2 of it that has it's own configuration page but I'll probably not bother.  I can't see the mutator being that popular.

And I still haevn't set the gametype on my map.  

{{classbox| 26th January, 2004}}

Well, my latest UT mutator [[Legacy:Mod Ideas/TeamWeaponArena|Mod Ideas/TeamWeaponArena]] is almost done.  I've got one outstanding bug to resolve and it's ready for public consumption.  Players fire immediately on spawning (unless they use jump to spawn) and I've no idea why.

I completely failed to do any work whatsoever on my CTF map - CTF-GauntPiglet.  Instead I played TrackMania.  A shallow yet compelling racing game (http://www.trackmania.com/).  If anyone can be bothered to drop me some feedback on the map, you can get the map here: http://www.snout-clan.co.uk/gauntpig.zip.

I still haven't set the gametype on the map :/

Last week was quite novel.  I had to turn down two requests to join mod teams.  Both were racing type mods and both of them would haev been pretty different.  It hurt to do but I really don't have the spare time in real life at the moment.  Maybe things will have calmed down by the end of Feb. but at the moment it's difficult to tell.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EntropicLqd/EntropicOnFatherhood</title>
    <id>1131</id>
    <revision>
      <id>2973</id>
      <timestamp>2007-06-16T08:26:14Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>fixed some typos</comment>
      <text xml:space="preserve">==All About Fatherhood ==

This is all Tarquin's fault.  He mentioned that I'd given a great advert for having kids.  I feel that perhaps I didn't convey the true horror that is fatherhood in one short paragraph, so here's a more lengthy analysis.

----

In order to truly appreciate the nightmarish upheaval that has taken place in my life since my ''little darlings'' have come into the world we need to rewind life a little to reveal a happy past.

Life was tranquil and calm, peace reigned supreme.  I was able to get up when I wanted at weekends and stroll into work early or late depending on how I felt.  My evenings and weekends were spent in glorious freedom; cutting code, taking the wife out for meals, and reading interesting books on algorithm design, project management, and team structure.  The wife and I lived in married bliss, our house was easily big enough for both of us, and everything had a place.  And every now and then I'd wake up with a hangover, roll over, and go back to sleep.

Now, lets wind forward in time, stopping briefly to mention that being at the birth of a child is an awesome experience.  However, I should advise that this experience alone does not come close to being able to make up for the trauma that is to come.  So, off we go again, whizzing forward in time to today.

Every (children don't understand about weekends) day now begins between 5am and 6am, abruptly.  One (or both) of my ''little angels'' will wake up and stroll into the bedroom making enough noise to wake the entire street.  They will then jump on me.  If there's two of them one will jump on my stomach and the other on my balls.  If there's only one they'll go for my balls every time.  The only bright side about this is that you can hear them coming and have enough time to prepare for the onslaught.  At this point one of two things will happen.  The children will either demand (in a &quot;if you don't do it we'll keep jumping on your balls until you do.&quot; sort of way) to be taken downstairs and put in front of the TV, or, climb into bed for some kip and a cuddle.  The cuddle involves fidgeting, kicking, scratching, and talking to everyone and playing with the huge pile of toys they have somehow managed to carry from their room into our room.  I am sure this daily migration of cuddly toys breaks several laws of Newtonian physics.  By 6am I've generally had enough and get up.

After getting washed, dressed, and allegedly prepared for the day I then have to carry both of the little elephants inhabiting my house downstairs, one in each arm, both clutching their improbable piles of cuddly toys.  They are not getting any lighter, and I'm sure they add a toy each week &amp;ndash; maybe to see at what point daddy puts his back out trying to lift it all.  The TV goes on and I have to change a nappy, empty a potty, get them some milk, stop any fights that break out.  At this point I can escape to work and leave them to jump on the wife or trash the lounge.

I arrive home from work (between 3:30pm and 4pm since I start so early) and get mobbed upon entry.  My ''little sweety-pies'' have drawn me some pictures and have been waiting to show me all day.  After inflicting their hideous scribblings upon my retina and making suitable &quot;oooh ahhh, aren't they wonderful&quot; noises I get to take my coat off and collapse in a chair.  This is the signal that daddy has become a climbing frame, slide, swing, and trampoline in one.  So, after collecting some new bruises, getting bruises on bruises, and having my balls crushed again (I think they just like the &quot;arrrrgh!&quot; sound), they have something to eat.  I've been in an hour or two by now and I've not touched my PC or had a coffee.  After tea they insist that I re-read the same story at least once.  The fact that it's the story I read yesterday, the day before, the day before that, the day .... you can see where I'm going here, is irellevant.  It's the story they must have.  Once they've had the story they start to get grizzly and whiny.  They are getting tired.  Then it's as many minutes as the wife and I can take of wailing, fighting, temper tantrums, before marching them upstairs to bed.

The time now &amp;ndash; once ''my lovelies'' have gone to bed, got up again, been put back to bed, got up again, been put back to bed, eventually fallen asleep half-on and half-off their bed buried in toys, blankets, and other miscellaneous debris they've found in their bedroom &amp;ndash; is 7pm.  I've been changed from a (relatively) fit, almost middle-aged, well adjusted and balanced man, into a wheezing wreck of an individual whose first thought is committing murder, and whose second thought is to try and remember what the first thought was.

And my house ... my house is tiny.  Everything I own has been crammed into the smallest room in the house.  A tiny cramped pit.  A pit that accumulates junk from all over the house.  The rest of the room in the house is taken up by stuff relating to kids.  Nappies, wipfe, and toys.  The toys .. oh the toys.  Big ones, small ones, huge boxes of all this stuff that my kids liberally sprinkle over the floor.  Maybe they think it will make the carpet grow.  There is no room in my lounge, and there is no flat surface that isn't overflowing with unidentifiable objects.  Partly because everything is having to move higher to escape destruction by inquiry from one or the other of my ''enchanting little darlings'', and partly because at least half of the available surface has some toys stacked on it.  There's scribbles on most of the walls.  I could render my carpet down as soup stock given the amount of food that's been dropped/hidden/cunningly concealed beneath a layer of toys on them.  In short, my once immaculate abode looks like it's been trashed by an unruly party of 20 drunken 15 year olds on a rampage.

Before I had kids I was almost completely healthy.  I practically never got ill with anything.  Since the ''sweeties'' have turned up I feel like I should be permanently quarantined.  Well, actually my kids should be permanently quarantined but I digress.  I get at least two colds a year, plus all sorts of weird viruses and flus, most of which don't have names but are probably tropical in origin.  And that's just me.  When the kids get ill it's a nightmare.  When they have a cold children don't just get a bit of a snotty nose &amp;ndash; that's a default state for a child.  When a child gets a cold they produce huge great long rail track like strands of snot from their nose.  And when they sneeze .... lets just say they could give Spiderman web casting lessons.  And if a child starts puking just make sure you've got some boots, and a peg clipped to your nose, and never wear any clothes you want to keep uncontaminated  inside the house.  Get changed in the garden if you have to.

Meal times are truly an experience.  The person who invented the bib was reasonably smart but didn't go nearly far enough &amp;ndash; Bibs should be a full blown easy-clean body bag with two holes for the kids eyes, and one hole to put the food into.  I'm not sure about they eye holes actually &amp;ndash; if they can't see what they are eating it might take them longer to tell you they don't like it.  My two ''honeys'' will quite happily smear food all over their face, the table, the floor, and the chair they are sitting on.  In fact, anything they can reach is guaranteed to get a generous coating of half masticated goo.  If there's anything they can't reach then the spray from their mouths as they talk while eating will do the job.  My ''honeys'' are able to turn weak stomached adults green in seconds at meal times.  And send unwary visitors scurrying for cover and the full body radiation suits we keep in the cloak room.

I could still go on ... I've not mentioned the gradual destruction of my belongings, the fighting, whining, moaning or whinging.  The constant, wearing lack of a continuous nights sleep.  The incessant background noise .... there's still more I could write about....

I guess by this time you are wondering why I agreed (I was always a bit reluctant and cagey) to have kids in the first place.  Well, to be honest, I was lied to.  Not one single person told me the truth about what having kids was like.  They all said, &quot;Well, it's a bit of a change of life, but it's great fun and very rewarding.&quot;.  If murder was legal I'd be hunting them down right now.  The only possible reason I can see for the lies is to ensure that I became as miserable as they are.  They obviously felt I was too happy in my child-free life.  And because of these lies I just ran out of excuses, and gave in to the wife's &quot;I want kids&quot; demand.  What I should have done was either left or refused.

But the very worst thing about kids is that once you've got them, and you realise what a hideous mistake it was, it's too late.  You can't take them back to the store as faulty goods.  They become a permanent part of your life, sucking the cash out of your wallet faster and more effectively than even the wife can manage.

So, you still want to have kids?  What part of '''&quot;don't do it! &amp;ndash; run away!&quot;''' didn't you understand?

'''Disclaimer:'''  I love my kids to bits - it's the only reason they are still alive.  However, '''all''' of the above comments have far more truth to them than you would think.  There are some good sides to having kids though &amp;ndash; I'll write them down here when I work out what they are.

''The above text is not to be reproduced without permission.''

----

'''Tarquin:'''  sounds fun. I'll swap you ;)

'''EntropicLqd:'''  For what exactly?  Or do you like getting up early?

:'''Tarquin:'''  For what? You don't want to know. I tend to be nocturnal so getting up early would mean a big routine shift. I'd probably end up having my &quot;nocturnal&quot; moments around 5am. It all sounds like hell, but it's not putting me off. A boy can get broody you know. As for the early morning call, here's a tip from my parents: they taught me how to read the hour hand on the clock, and said I was to play in my room &amp; not to wake them up until it reached a certain angle. Apparently it worked, but then again I had a really good jigaw puzzle of a steam engine that kept me occupied for hours on end.

'''Dma:'''  I am 22 (last time I checked) and haven't been married.  I haven't even been on anything close to resembling a date.  I don't really have a social life.  You make me even more certain that I made the right choices.  :-D

'''Bean:''' This has further confirmed my decision to not have kids. :p

'''Wang:'''  I can pretty much confirm all of the above (even though I &quot;only&quot; have 1 little &quot;spirited&quot; 2 year old boy) (for &quot;spirited&quot; read: if you take your eyes off him for a second he'll be diving off the sofa, climbing the kitchen table, reprogramming all the radio stations on the hifi, spreading chocolate over the remote controls and generally running everywhere as fast as he possibly can with complete dis-regard for personal safety).

I have not been able to stay in bed beyond 8.00 a.m. for two years now (literally). I have been able to stay up all night wiping his nose on numerous occasions. I am unable to get within 2m of my pc while he is up unless I am prepared to deal with the mother of all tantrums. Whilst he may appear to be playing happily with his latest favourite toy, he is merely patiently waiting to deny me any possibility of &quot;personal time&quot;.

However, the good points: Toys. I can now relive my childhood and buy the new versions of all the toys I remember. Just bought him a toy motorbike with a friction motor (it's not meant for a 2 year old but I'm sure he'll grow into it :) ). The downside to this is he seems to have the same taste in toys as me, since I can't get anywhere near it without screams of &quot;mine&quot;.

Despite all this though he means everything to me. If he's happy I'm happy. We had family over this weekend and watched the videos we have taken of him. Just made me want to pick him up love him to bits. The family didn't seem to get it though (&quot;can we fast forward this?&quot; &quot;What this bit!!???, But he's about to roll over!!!!&quot;). I reckon it's a chemical imbalance parents have to prevent them from throttling their kids.

Quote:

&quot;The rest of the room in the house is taken up by stuff relating to kids. Nappies, wife, and toys.&quot; Assuming that is a spelling mistake and it should read &quot;wife&quot;, I sure hope she never gets to see this page or you'll wish you were never born :)

For Dma, whilst I can't in all honesty recommend the kids bit the stuff before that can be fun :)

'''NFG:''' I love this page,...think Entropic should become a MAJOR comedian. Anyway, I thought I'd add some frightening real-life Intel on what my 2 year old nephew was like (Incredibly, he's still alive).

Occasionally, I'd visit my sister and brother-in-laws' house to terrorize the kids (she has two, both very bright and very funny, about grammar school age). My nephew's name is Kyle, and he was just fascinated with (obssessed by actually) large mobile equipment transport and huge trucks. His idea of fun was to run out in the road when a cement mixer or humongeous construction crane was driving along, stand DIRECTLY IN ITS PATH, and yell some thing like, &quot;Look at that Humongeous truck!&quot; He would actually laugh when three or four frantic and terrified adults would race out into the road and save him from a grizzly death. He was absolutely FEARLESS. Scared the hell out me. After that, I never let him get beyond arm's length from me. And, he attempted this ALL THE TIME. HE WAS A COMPLETE MANIAC. He'd just scream excitedly, and try to run out into the road. When we were out in public, I always made him wear an expedition-style, heavily re-inforced shirt, and, had to pay to replace these on a regular basis.

I think if I were actually his Father, I would have made him wear a climbing harness at all times, to which numerous industrial-strength elastic bungee-cords and nylon ropes, rated to withstand the fall of a horse at 100 feet, were attached . These would then be attached to major concrete structures with nautical winches. 

'''EntropicLqd:'''  Hee hee.  My eldest daughter likes to do the ''run off at high speed into mortal peril'' trick every now and then.  We do have a harness for her, but the threat of a ''clip round the ear'' can also be very effective.  I really need to tweak the main content of the page.  There's a few typos in there and whole paragraphs missing.  Hey ''Wang'' &amp;ndash; how do you manage to get them to stay in bed till 8am?  That sounds like heaven.  Heck, even getting them to sleep in to 7am would be like heaven for me.

'''Wang:''' Well despite the fact he is 2 he still sleeps in a cot with sides so he can't get out. He could feasibly climb out now but we use an infant sleeping bag that sufficiently restricts his leg movement that he can barely get to a standing position :) He is a nightmare to get to sleep though often staying awake till 9pm which is probably what causes him to sleep in &quot;late&quot;. We have now devised the clever plan of having mine and my wifes pc in the conservatory. Full double glazing completely drowns out all screams from upstairs :p

'''Kerlin:''' You have lots to look forward to, though. When they're 4 or 5 they get their own juicebox in the morning. And now at 9, the kid's making her own breakfast (bagel and cereal)...and microwave popcorn. She made a grilled cheese sandwich with her mom the other day. Enjoy it while you can cause they grow up fast. Ahhh christ, now I sound like my parents. I gotta get out of here... '':)''

----

'''Aphex:''' Oh crap.

'''Aphex:''' Ah well, kid is now 2 yrs old, and just getting naughty (that is, more naughty than before)  Should have read this page more thoroughly I think.  Wife is suggesting another one.  Am considering becoming Tibetian monk to avoid.  Suggestions? ;)

'''EntropicLqd:''' Hi M8 good to hear from you.  Has it really been two years?  That's the problem with getting older - you blink and a year passes by.  Stop to cough and splutter a bit and suddenly your half a decade older.  My two (5 and 6 this year) do actually play very nicely together most of the time.  The rest of the time they are either wailing and crying or trying to kill each other.  Be warned that having two offspring running around the place is more than twice as much work as having one.  To be honest if the wife is suggesting it you're probably doomed and you might as well give in sooner rather than later as she'll get her own way in the end anyway.  I was kind of lucky in that having two was so much work that the wife didn't want any more (she originally wanted three).

'''T1:''' 2 kids closer in age get along better because they have similar interests and can't hurt each other as much. But if the age difference is bigger, like 13 years or so, then the older one is usually responsible enough not to hurt the little one. But the little one will probably be an annoying pain in the ass to the older one.

'''Aphex:''' Yeah Entropic - good to see you're still around.  Yours are 5 &amp; 6 already!? I know what you mean - time IS flying!! :(  I'll get the wife to read this I think, but yes... probably doomed lol  ;)

----

'''Bob_The_Beheader:''' I've heard that a parent is someone who gets up in the middle of the night to see why their child is crying. A parent is also someone who gets up in the middle of the night to see why thier child is not crying. You kinda have to be a parent or know children well to get this, but I bet you get it Entropic. :)
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2974</id>
      <timestamp>2005-01-10T00:44:26Z</timestamp>
      <contributor>
        <ip>Spc2-with1-3-0-cust191.bagu.broadband.ntl.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==All About Fatherhood ==

This is all Tarquin's fault.  He mentioned that I'd given a great advert for having kids.  I feel that perhaps I didn't convey the true horror that is fatherhood in one short paragraph, so here's a more lengthy analysis.

----

In order to truly appreciate the nightmarish upheaval that has taken place in my life since my ''little darlings'' have come into the world we need to rewind life a little to reveal a happy past.

Life was tranquil and calm, peace reigned supreme.  I was able to get up when I wanted at weekends and stroll into work early or late depending on how I felt.  My evenings and weekends were spent in glorious freedom; cutting code, taking the wife out for meals, and reading interesting books on algorythm design, project management, and team structure.  The wife and I lived in married bliss, our house was easily big enough for both of us, and everything had a place.  And every now and then I'd wake up with a hangover, roll over, and go back to sleep.

Now, lets wind forward in time, stopping briefly to mention that being at the birth of a child is an awesome experience.  However, I should advise that this experience alone does not come close to being able to make up for the trauma that is to come.  So, off we go again, whizzing forward in time to today.

Every (children don't understand about weekends) day now begins between 5am and 6am, abruptly.  One (or both) of my ''little angels'' will wake up and stroll into the bedroom making enough noise to wake the entire street.  They will then jump on me.  If there's two of them one will jump on my stomach and the other on my balls.  If there's only one they'll go for my balls every time.  The only bright side about this is that you can hear them coming and have enough time to prepare for the onslaught.  At this point one of two things will happen.  The children will either demand (in a &quot;if you don't do it we'll keep jumping on your balls until you do.&quot; sort of way) to be taken downstairs and put in front of the TV, or, climb into bed for some kip and a cuddle.  The cuddle involves fidgeting, kicking, scratching, and talking to everyone and playing with the huge pile of toys they have somehow managed to carry from their room into our room.  I am sure this daily migration of cuddly toys breaks several laws of Newtonian physics.  By 6am I've generally had enough and get up.

After getting washed, dressed, and allegedly prepared for the day I then have to carry both of the little elephants inhabiting my house downstairs, one in each arm, both clutching their improbable piles of cuddly toys.  They are not getting any lighter, and I'm sure they add a toy each week &amp;ndash; maybe to see at what point daddy puts his back out trying to lift it all.  The TV goes on and I have to change a nappy, empty a potty, get them some milk, stop any fights that break out.  At this point I can escape to work and leave them to jump on the wife or trash the lounge.

I arrive home from work (between 3:30pm and 4pm since I start so early) and get mobbed upon entry.  My ''little sweety-pies'' have drawn me some pictures and have been waiting to show me all day.  After inflicting their hideous scribblings upon my retina and making suitable &quot;oooh ahhh, aren't they wonderful&quot; noises I get to take my coat off and collapse in a chair.  This is the signal that daddy has become a climbing frame, slide, swing, and trampoline in one.  So, after collecting some new bruises, getting bruises on bruises, and having my balls crushed again (I think they just like the &quot;arrrrgh!&quot; sound), they have something to eat.  I've been in an hour or two by now and I've not touched my PC or had a coffee.  After tea they insist that I re-read the same story at least once.  The fact that it's the story I read yesterday, the day before, the day before that, the day .... you can see where I'm going here, is irellevant.  It's the story they must have.  Once they've had the story they start to get grizzly and whiny.  They are getting tired.  Then it's as many minutes as the wife and I can take of wailing, fighting, temper tantrums, before marching them upstairs to bed.

The time now &amp;ndash; once ''my lovelies'' have gone to bed, got up again, been put back to bed, got up again, been put back to bed, eventually fallen asleep half-on and half-off their bed buried in toys, blankets, and other miscellaneous debris they've found in their bedroom &amp;ndash; is 7pm.  I've been changed from a (relatively) fit, almost middle-aged, well adjusted and balanced man, into a wheezing wreck of an individual whose first thought is committing murder, and whose second thought is to try and remember what the first thought was.

And my house ... my house is tiny.  Everything I own has been crammed into the smallest room in the house.  A tiny cramped pit.  A pit that accumulates junk from all over the house.  The rest of the room in the house is taken up by stuff relating to kids.  Nappies, wipfe, and toys.  The toys .. oh the toys.  Big ones, small ones, huge boxes of all this stuff that my kids liberally sprinkle over the floor.  Maybe they think it will make the carpet grow.  There is no room in my lounge, and there is no flat surface that isn't overflowing with unidentifiable objects.  Partly because everything is having to move higher to escape destruction by inquiry from one or the other of my ''enchanting little darlings'', and partly because at least half of the available surface has some toys stacked on it.  There's scribbles on most of the walls.  I could render my carpet down as soup stock given the amount of food that's been dropped/hidden/cunningly concealed beneath a layer of toys on them.  In short, my once immaculate abode looks like it's been trashed by an unruly party of 20 drunken 15 year olds on a rampage.

Before I had kids I was almost completely healthy.  I practically never got ill with anything.  Since the ''sweeties'' have turned up I feel like I should be permanently quarantined.  Well, actually my kids should be permanently quarantined but I digress.  I get at least two colds a year, plus all sorts of weird viruses and flus, most of which don't have names but are probably tropical in origin.  And that's just me.  When the kids get ill it's a nightmare.  When they have a cold children don't just get a bit of a snotty nose &amp;ndash; that's a default state for a child.  When a child gets a cold they produce huge great long rail track like strands of snot from their nose.  And when they sneeze .... lets just say they could give Spiderman web casting lessons.  And if a child starts puking just make sure you've got some boots, and a peg clipped to your nose, and never wear any clothes you want to keep uncontaminated  inside the house.  Get changed in the garden if you have to.

Meal times are truly an experience.  The person who invented the bib was reasonably smart but didn't go nearly far enough &amp;ndash; Bibs should be a full blown easy-clean body bag with two holes for the kids eyes, and one hole to put the food into.  I'm not sure about they eye holes actually &amp;ndash; if they can't see what they are eating it might take them longer to tell you they don't like it.  My two ''honeys'' will quite happily smear food all over their face, the table, the floor, and the chair they are sitting on.  In fact, anything they can reach is guaranteed to get a generous coating of half masticated goo.  If there's anything they can't reach then the spray from their mouths as they talk while eating will do the job.  My ''honeys'' are able to turn weak stomached adults green in seconds at meal times.  And send unwary visitors scurrying for cover and the full body radiation suits we keep in the cloak room.

I could still go on ... I've not mentioned the gradual destruction of my belongings, the fighting, whining, moaning or whinging.  The constant, wearing lack of a continuous nights sleep.  The incessant background noise .... there's still more I could write about....

I guess by this time you are wondering why I agreed (I was always a bit reluctant and cagey) to have kids in the first place.  Well, to be honest, I was lied to.  Not one single person told me the truth about what having kids was like.  They all said, &quot;Well, it's a bit of a change of life, but it's great fun and very rewarding.&quot;.  If murder was legal I'd be hunting them down right now.  The only possible reason I can see for the lies is to ensure that I became as miserable as they are.  They obviously felt I was too happy in my child-free life.  And because of these lies I just ran out of excuses, and gave in to the wife's &quot;I want kids&quot; demand.  What I should have done was either left or refused.

But the very worst thing about kids is that once you've got them, and you realise what a hideous mistake it was, it's too late.  You can't take them back to the store as faulty goods.  They become a permanent part of your life, sucking the cash out of your wallet faster and more effectively than even the wife can manage.

So, you still want to have kids?  What part of '''&quot;don't do it! &amp;ndash; run away!&quot;''' didn't you understand?

'''Disclaimer:'''  I love my kids to bits - it's the only reason they are still alive.  However, '''all''' of the above comments have far more truth to them than you would think.  There are some good sides to having kids though &amp;ndash; I'll write them down here when I work out what they are.

''The above text is not to be reproduced without permission.''

----

'''Tarquin:'''  sounds fun. I'll swap you ;)

'''EntropicLqd:'''  For what exactly?  Or do you like getting up early?

:'''Tarquin:'''  For what? You don't want to know. I tend to be nocturnal so getting up early would mean a big routine shift. I'd probably end up having my &quot;nocturnal&quot; moments around 5am. It all sounds like hell, but it's not putting me off. A boy can get broody you know. As for the early morning call, here's a tip from my parents: they taught me how to read the hour hand on the clock, and said I was to play in my room &amp; not to wake them up until it reached a certain angle. Apparently it worked, but then again I had a really good jigaw puzzle of a steam engine that kept me occupied for hours on end.

'''Dma:'''  I am 22 (last time I checked) and haven't been married.  I haven't even been on anything close to resembling a date.  I don't really have a social life.  You make me even more certain that I made the right choices.  :-D

'''Bean:''' This has further confirmed my decision to not have kids. :p

'''Wang:'''  I can pretty much confirm all of the above (even though I &quot;only&quot; have 1 little &quot;spirited&quot; 2 year old boy) (for &quot;spirited&quot; read: if you take your eyes off him for a second he'll be diving off the sofa, climbing the kitchen table, reprogramming all the radio stations on the hifi, spreading chocolate over the remote controls and generally running everywhere as fast as he possibly can with complete dis-regard for personal safety).

I have not been able to stay in bed beyond 8.00 a.m. for two years now (literally). I have been able to stay up all night wiping his nose on numerous occasions. I am unable to get within 2m of my pc while he is up unless I am prepared to deal with the mother of all tantrums. Whilst he may appear to be playing happily with his latest favourite toy, he is merely patiently waiting to deny me any possibility of &quot;personal time&quot;.

However, the good points: Toys. I can now relive my childhood and buy the new versions of all the toys I remember. Just bought him a toy motorbike with a friction motor (it's not meant for a 2 year old but I'm sure he'll grow into it :) ). The downside to this is he seems to have the same taste in toys as me, since I can't get anywhere near it without screams of &quot;mine&quot;.

Despite all this though he means everything to me. If he's happy I'm happy. We had family over this weekend and watched the videos we have taken of him. Just made me want to pick him up love him to bits. The family didn't seem to get it though (&quot;can we fast forward this?&quot; &quot;What this bit!!???, But he's about to roll over!!!!&quot;). I reckon it's a chemical imbalance parents have to prevent them from throttling their kids.

Quote:

&quot;The rest of the room in the house is taken up by stuff relating to kids. Nappies, wipfe, and toys.&quot; Assuming that is a spelling mistake and it should read &quot;wife&quot;, I sure hope she never gets to see this page or you'll wish you were never born :)

For Dma, whilst I can't in all honesty recommend the kids bit the stuff before that can be fun :)

'''NFG:''' I love this page,...think Entropic should become a MAJOR comedian. Anyway, I thought I'd add some frightening real-life Intel on what my 2 year old nephew was like (Incredibly, he's still alive).

Occasionally, I'd visit my sister and brother-in-laws' house to terrorize the kids (she has two, both very bright and very funny, about grammar school age). My nephew's name is Kyle, and he was just fascinated with (obssessed by actually) large mobile equipment transport and huge trucks. His idea of fun was to run out in the road when a cement mixer or humongeous construction crane was driving along, stand DIRECTLY IN ITS PATH, and yell some thing like, &quot;Look at that Humongeous truck!&quot; He would actually laugh when three or four frantic and terrified adults would race out into the road and save him from a grizzly death. He was absolutely FEARLESS. Scared the hell out me. After that, I never let him get beyond arm's length from me. And, he attempted this ALL THE TIME. HE WAS A COMPLETE MANIAC. He'd just scream excitedly, and try to run out into the road. When we were out in public, I always made him wear an expedition-style, heavily re-inforced shirt, and, had to pay to replace these on a regular basis.

I think if I were actually his Father, I would have made him wear a climbing harness at all times, to which numerous industrial-strength elastic bungee-cords and nylon ropes, rated to withstand the fall of a horse at 100 feet, were attached . These would then be attached to major concrete structures with nautical winches. 

'''EntropicLqd:'''  Hee hee.  My eldest daughter likes to do the ''run off at high speed into mortal peril'' trick every now and then.  We do have a harness for her, but the threat of a ''clip round the ear'' can also be very effective.  I really need to tweak the main content of the page.  There's a few typos in there and whole paragraphs missing.  Hey ''Wang'' &amp;ndash; how do you manage to get them to stay in bed till 8am?  That sounds like heaven.  Heck, even getting them to sleep in toll 7am would be like heaven for me.

'''Wang:''' Well despite the fact he is 2 he still sleeps in a cot with sides so he can't get out. He could feasibly climb out now but we use an infant sleeping bag that sufficiently restricts his leg movement that he can barely get to a standing position :) He is a nightmare to get to sleep though often staying awake till 9pm which is probably what causes him to sleep in &quot;late&quot;. We have now devised the clever plan of having mine and my wifes pc in the conservatory. Full double glazing completely drowns out all screams from upstairs :p

'''Kerlin:''' You have lots to look forward to, though. When they're 4 or 5 they get their own juicebox in the morning. And now at 9, the kid's making her own breakfast (bagel and cereal)...and microwave popcorn. She made a grilled cheese sandwich with her mom the other day. Enjoy it while you can cause they grow up fast. Ahhh christ, now I sound like my parents. I gotta get out of here... '':)''

----

'''Aphex:''' Oh crap.

'''Aphex:''' Ah well, kid is now 2 yrs old, and just getting naughty (that is, more naughty than before)  Should have read this page more thoroughly I think.  Wife is suggesting another one.  Am considering becoming Tibetian monk to avoid.  Suggestions? ;)

'''EntropicLqd:''' Hi M8 good to hear from you.  Has it really been two years?  That's the problem with getting older - you blink and a year passes by.  Stop to cough and splutter a bit and suddenly your half a decade older.  My two (5 and 6 this year) do actually play very nicely together most of the time.  The rest of the time they are either wailing and crying or trying to kill each other.  Be warned that having two offspring running around the place is more than twice as much work as having one.  To be honest if the wife is suggesting it you're probably doomed and you might as well give in sooner rather than later as she'll get her own way in the end anyway.  I was kind of lucky in that having two was so much work that the wife didn't want any more (she originally wanted three).

'''T1:''' 2 kids closer in age get along better because they have similar interests and can't hurt each other as much. But if the age difference is bigger, like 13 years or so, then the older one is usually responsible enough not to hurt the little one. But the little one will probably be an annoying pain in the ass to the older one.

'''Aphex:''' Yeah Entropic - good to see you're still around.  Yours are 5 &amp; 6 already!? I know what you mean - time IS flying!! :(  I'll get the wife to read this I think, but yes... probably doomed lol  ;)
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2975</id>
      <timestamp>2005-11-09T16:34:57Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==All About Fatherhood ==

This is all Tarquin's fault.  He mentioned that I'd given a great advert for having kids.  I feel that perhaps I didn't convey the true horror that is fatherhood in one short paragraph, so here's a more lengthy analysis.

----

In order to truly appreciate the nightmarish upheaval that has taken place in my life since my ''little darlings'' have come into the world we need to rewind life a little to reveal a happy past.

Life was tranquil and calm, peace reigned supreme.  I was able to get up when I wanted at weekends and stroll into work early or late depending on how I felt.  My evenings and weekends were spent in glorious freedom; cutting code, taking the wife out for meals, and reading interesting books on algorythm design, project management, and team structure.  The wife and I lived in married bliss, our house was easily big enough for both of us, and everything had a place.  And every now and then I'd wake up with a hangover, roll over, and go back to sleep.

Now, lets wind forward in time, stopping briefly to mention that being at the birth of a child is an awesome experience.  However, I should advise that this experience alone does not come close to being able to make up for the trauma that is to come.  So, off we go again, whizzing forward in time to today.

Every (children don't understand about weekends) day now begins between 5am and 6am, abruptly.  One (or both) of my ''little angels'' will wake up and stroll into the bedroom making enough noise to wake the entire street.  They will then jump on me.  If there's two of them one will jump on my stomach and the other on my balls.  If there's only one they'll go for my balls every time.  The only bright side about this is that you can hear them coming and have enough time to prepare for the onslaught.  At this point one of two things will happen.  The children will either demand (in a &quot;if you don't do it we'll keep jumping on your balls until you do.&quot; sort of way) to be taken downstairs and put in front of the TV, or, climb into bed for some kip and a cuddle.  The cuddle involves fidgeting, kicking, scratching, and talking to everyone and playing with the huge pile of toys they have somehow managed to carry from their room into our room.  I am sure this daily migration of cuddly toys breaks several laws of Newtonian physics.  By 6am I've generally had enough and get up.

After getting washed, dressed, and allegedly prepared for the day I then have to carry both of the little elephants inhabiting my house downstairs, one in each arm, both clutching their improbable piles of cuddly toys.  They are not getting any lighter, and I'm sure they add a toy each week &amp;ndash; maybe to see at what point daddy puts his back out trying to lift it all.  The TV goes on and I have to change a nappy, empty a potty, get them some milk, stop any fights that break out.  At this point I can escape to work and leave them to jump on the wife or trash the lounge.

I arrive home from work (between 3:30pm and 4pm since I start so early) and get mobbed upon entry.  My ''little sweety-pies'' have drawn me some pictures and have been waiting to show me all day.  After inflicting their hideous scribblings upon my retina and making suitable &quot;oooh ahhh, aren't they wonderful&quot; noises I get to take my coat off and collapse in a chair.  This is the signal that daddy has become a climbing frame, slide, swing, and trampoline in one.  So, after collecting some new bruises, getting bruises on bruises, and having my balls crushed again (I think they just like the &quot;arrrrgh!&quot; sound), they have something to eat.  I've been in an hour or two by now and I've not touched my PC or had a coffee.  After tea they insist that I re-read the same story at least once.  The fact that it's the story I read yesterday, the day before, the day before that, the day .... you can see where I'm going here, is irellevant.  It's the story they must have.  Once they've had the story they start to get grizzly and whiny.  They are getting tired.  Then it's as many minutes as the wife and I can take of wailing, fighting, temper tantrums, before marching them upstairs to bed.

The time now &amp;ndash; once ''my lovelies'' have gone to bed, got up again, been put back to bed, got up again, been put back to bed, eventually fallen asleep half-on and half-off their bed buried in toys, blankets, and other miscellaneous debris they've found in their bedroom &amp;ndash; is 7pm.  I've been changed from a (relatively) fit, almost middle-aged, well adjusted and balanced man, into a wheezing wreck of an individual whose first thought is committing murder, and whose second thought is to try and remember what the first thought was.

And my house ... my house is tiny.  Everything I own has been crammed into the smallest room in the house.  A tiny cramped pit.  A pit that accumulates junk from all over the house.  The rest of the room in the house is taken up by stuff relating to kids.  Nappies, wipfe, and toys.  The toys .. oh the toys.  Big ones, small ones, huge boxes of all this stuff that my kids liberally sprinkle over the floor.  Maybe they think it will make the carpet grow.  There is no room in my lounge, and there is no flat surface that isn't overflowing with unidentifiable objects.  Partly because everything is having to move higher to escape destruction by inquiry from one or the other of my ''enchanting little darlings'', and partly because at least half of the available surface has some toys stacked on it.  There's scribbles on most of the walls.  I could render my carpet down as soup stock given the amount of food that's been dropped/hidden/cunningly concealed beneath a layer of toys on them.  In short, my once immaculate abode looks like it's been trashed by an unruly party of 20 drunken 15 year olds on a rampage.

Before I had kids I was almost completely healthy.  I practically never got ill with anything.  Since the ''sweeties'' have turned up I feel like I should be permanently quarantined.  Well, actually my kids should be permanently quarantined but I digress.  I get at least two colds a year, plus all sorts of weird viruses and flus, most of which don't have names but are probably tropical in origin.  And that's just me.  When the kids get ill it's a nightmare.  When they have a cold children don't just get a bit of a snotty nose &amp;ndash; that's a default state for a child.  When a child gets a cold they produce huge great long rail track like strands of snot from their nose.  And when they sneeze .... lets just say they could give Spiderman web casting lessons.  And if a child starts puking just make sure you've got some boots, and a peg clipped to your nose, and never wear any clothes you want to keep uncontaminated  inside the house.  Get changed in the garden if you have to.

Meal times are truly an experience.  The person who invented the bib was reasonably smart but didn't go nearly far enough &amp;ndash; Bibs should be a full blown easy-clean body bag with two holes for the kids eyes, and one hole to put the food into.  I'm not sure about they eye holes actually &amp;ndash; if they can't see what they are eating it might take them longer to tell you they don't like it.  My two ''honeys'' will quite happily smear food all over their face, the table, the floor, and the chair they are sitting on.  In fact, anything they can reach is guaranteed to get a generous coating of half masticated goo.  If there's anything they can't reach then the spray from their mouths as they talk while eating will do the job.  My ''honeys'' are able to turn weak stomached adults green in seconds at meal times.  And send unwary visitors scurrying for cover and the full body radiation suits we keep in the cloak room.

I could still go on ... I've not mentioned the gradual destruction of my belongings, the fighting, whining, moaning or whinging.  The constant, wearing lack of a continuous nights sleep.  The incessant background noise .... there's still more I could write about....

I guess by this time you are wondering why I agreed (I was always a bit reluctant and cagey) to have kids in the first place.  Well, to be honest, I was lied to.  Not one single person told me the truth about what having kids was like.  They all said, &quot;Well, it's a bit of a change of life, but it's great fun and very rewarding.&quot;.  If murder was legal I'd be hunting them down right now.  The only possible reason I can see for the lies is to ensure that I became as miserable as they are.  They obviously felt I was too happy in my child-free life.  And because of these lies I just ran out of excuses, and gave in to the wife's &quot;I want kids&quot; demand.  What I should have done was either left or refused.

But the very worst thing about kids is that once you've got them, and you realise what a hideous mistake it was, it's too late.  You can't take them back to the store as faulty goods.  They become a permanent part of your life, sucking the cash out of your wallet faster and more effectively than even the wife can manage.

So, you still want to have kids?  What part of '''&quot;don't do it! &amp;ndash; run away!&quot;''' didn't you understand?

'''Disclaimer:'''  I love my kids to bits - it's the only reason they are still alive.  However, '''all''' of the above comments have far more truth to them than you would think.  There are some good sides to having kids though &amp;ndash; I'll write them down here when I work out what they are.

''The above text is not to be reproduced without permission.''

----

'''Tarquin:'''  sounds fun. I'll swap you ;)

'''EntropicLqd:'''  For what exactly?  Or do you like getting up early?

:'''Tarquin:'''  For what? You don't want to know. I tend to be nocturnal so getting up early would mean a big routine shift. I'd probably end up having my &quot;nocturnal&quot; moments around 5am. It all sounds like hell, but it's not putting me off. A boy can get broody you know. As for the early morning call, here's a tip from my parents: they taught me how to read the hour hand on the clock, and said I was to play in my room &amp; not to wake them up until it reached a certain angle. Apparently it worked, but then again I had a really good jigaw puzzle of a steam engine that kept me occupied for hours on end.

'''Dma:'''  I am 22 (last time I checked) and haven't been married.  I haven't even been on anything close to resembling a date.  I don't really have a social life.  You make me even more certain that I made the right choices.  :-D

'''Bean:''' This has further confirmed my decision to not have kids. :p

'''Wang:'''  I can pretty much confirm all of the above (even though I &quot;only&quot; have 1 little &quot;spirited&quot; 2 year old boy) (for &quot;spirited&quot; read: if you take your eyes off him for a second he'll be diving off the sofa, climbing the kitchen table, reprogramming all the radio stations on the hifi, spreading chocolate over the remote controls and generally running everywhere as fast as he possibly can with complete dis-regard for personal safety).

I have not been able to stay in bed beyond 8.00 a.m. for two years now (literally). I have been able to stay up all night wiping his nose on numerous occasions. I am unable to get within 2m of my pc while he is up unless I am prepared to deal with the mother of all tantrums. Whilst he may appear to be playing happily with his latest favourite toy, he is merely patiently waiting to deny me any possibility of &quot;personal time&quot;.

However, the good points: Toys. I can now relive my childhood and buy the new versions of all the toys I remember. Just bought him a toy motorbike with a friction motor (it's not meant for a 2 year old but I'm sure he'll grow into it :) ). The downside to this is he seems to have the same taste in toys as me, since I can't get anywhere near it without screams of &quot;mine&quot;.

Despite all this though he means everything to me. If he's happy I'm happy. We had family over this weekend and watched the videos we have taken of him. Just made me want to pick him up love him to bits. The family didn't seem to get it though (&quot;can we fast forward this?&quot; &quot;What this bit!!???, But he's about to roll over!!!!&quot;). I reckon it's a chemical imbalance parents have to prevent them from throttling their kids.

Quote:

&quot;The rest of the room in the house is taken up by stuff relating to kids. Nappies, wipfe, and toys.&quot; Assuming that is a spelling mistake and it should read &quot;wife&quot;, I sure hope she never gets to see this page or you'll wish you were never born :)

For Dma, whilst I can't in all honesty recommend the kids bit the stuff before that can be fun :)

'''NFG:''' I love this page,...think Entropic should become a MAJOR comedian. Anyway, I thought I'd add some frightening real-life Intel on what my 2 year old nephew was like (Incredibly, he's still alive).

Occasionally, I'd visit my sister and brother-in-laws' house to terrorize the kids (she has two, both very bright and very funny, about grammar school age). My nephew's name is Kyle, and he was just fascinated with (obssessed by actually) large mobile equipment transport and huge trucks. His idea of fun was to run out in the road when a cement mixer or humongeous construction crane was driving along, stand DIRECTLY IN ITS PATH, and yell some thing like, &quot;Look at that Humongeous truck!&quot; He would actually laugh when three or four frantic and terrified adults would race out into the road and save him from a grizzly death. He was absolutely FEARLESS. Scared the hell out me. After that, I never let him get beyond arm's length from me. And, he attempted this ALL THE TIME. HE WAS A COMPLETE MANIAC. He'd just scream excitedly, and try to run out into the road. When we were out in public, I always made him wear an expedition-style, heavily re-inforced shirt, and, had to pay to replace these on a regular basis.

I think if I were actually his Father, I would have made him wear a climbing harness at all times, to which numerous industrial-strength elastic bungee-cords and nylon ropes, rated to withstand the fall of a horse at 100 feet, were attached . These would then be attached to major concrete structures with nautical winches. 

'''EntropicLqd:'''  Hee hee.  My eldest daughter likes to do the ''run off at high speed into mortal peril'' trick every now and then.  We do have a harness for her, but the threat of a ''clip round the ear'' can also be very effective.  I really need to tweak the main content of the page.  There's a few typos in there and whole paragraphs missing.  Hey ''Wang'' &amp;ndash; how do you manage to get them to stay in bed till 8am?  That sounds like heaven.  Heck, even getting them to sleep in toll 7am would be like heaven for me.

'''Wang:''' Well despite the fact he is 2 he still sleeps in a cot with sides so he can't get out. He could feasibly climb out now but we use an infant sleeping bag that sufficiently restricts his leg movement that he can barely get to a standing position :) He is a nightmare to get to sleep though often staying awake till 9pm which is probably what causes him to sleep in &quot;late&quot;. We have now devised the clever plan of having mine and my wifes pc in the conservatory. Full double glazing completely drowns out all screams from upstairs :p

'''Kerlin:''' You have lots to look forward to, though. When they're 4 or 5 they get their own juicebox in the morning. And now at 9, the kid's making her own breakfast (bagel and cereal)...and microwave popcorn. She made a grilled cheese sandwich with her mom the other day. Enjoy it while you can cause they grow up fast. Ahhh christ, now I sound like my parents. I gotta get out of here... '':)''

----

'''Aphex:''' Oh crap.

'''Aphex:''' Ah well, kid is now 2 yrs old, and just getting naughty (that is, more naughty than before)  Should have read this page more thoroughly I think.  Wife is suggesting another one.  Am considering becoming Tibetian monk to avoid.  Suggestions? ;)

'''EntropicLqd:''' Hi M8 good to hear from you.  Has it really been two years?  That's the problem with getting older - you blink and a year passes by.  Stop to cough and splutter a bit and suddenly your half a decade older.  My two (5 and 6 this year) do actually play very nicely together most of the time.  The rest of the time they are either wailing and crying or trying to kill each other.  Be warned that having two offspring running around the place is more than twice as much work as having one.  To be honest if the wife is suggesting it you're probably doomed and you might as well give in sooner rather than later as she'll get her own way in the end anyway.  I was kind of lucky in that having two was so much work that the wife didn't want any more (she originally wanted three).

'''T1:''' 2 kids closer in age get along better because they have similar interests and can't hurt each other as much. But if the age difference is bigger, like 13 years or so, then the older one is usually responsible enough not to hurt the little one. But the little one will probably be an annoying pain in the ass to the older one.

'''Aphex:''' Yeah Entropic - good to see you're still around.  Yours are 5 &amp; 6 already!? I know what you mean - time IS flying!! :(  I'll get the wife to read this I think, but yes... probably doomed lol  ;)

----

'''Bob_The_Beheader:''' I've heard that a parent is someone who gets up in the middle of the night to see why their child is crying. A parent is also someone who gets up in the middle of the night to see why thier child is not crying. You kinda have to be a parent or know children well to get this, but I bet you get it Entropic. :)
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EntropicLqd/EntropicOnUT2K3</title>
    <id>1132</id>
    <revision>
      <id>2976</id>
      <timestamp>2003-11-05T17:08:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==My Thoughts on UT 2003 ==

I am determined that this page isn't going to be a review.  Rather, it's designed to be more of a bullet pointed assessment of the new game, claiming to be the next in line for the UT throne.  Overall I would have to say that I’m reasonably impressed, but, and there is a but, it lacks an awful amount of polish.

These comments are based purely on the “single player against bots” experience.  I haven’t ventured on-line with the game yet.  I currently have no plans to either.  My clan tag and name doesn’t fit into the space allowed for a start – but I’m getting ahead of myself.

===What’s good about it ===
* The game looks gorgeous.  The environments are incredibly detailed, and on full detail settings at 1280 by 1024 bring my PC to it’s knees.  So much so you can hear it pleading for mercy.
* The opening movie is fantastic.  A lot of love has been put into it and it shows.  It’s tremendous.
* The weapon balance is much improved over the original UT, and I find myself using a far wider variety of weapons in UT2003 than I did in UT.  Even the new sniper rifle is great, once you get used to the extended loading time.
* The single player game is a bit more interesting than in UT.  Having a squad of players to choose from is quite nice.  Being able to assign default orders to players is a particularly welcome feature.
* The maps have loads of cool environmental sounds, and they do sound nice.

===What’s bad about it ===
* None of the maps are particularly inspiring.  I can’t say that I’m particularly enamoured with any of the maps.  It must be said that I haven’t figured out whether it’s simply the vast amount of extra detail in the levels or the way the levels have been built.
* The manual that comes with the game sucks.  It’s crap.  It’s almost not worth the thin pieces of paper it’s written on.
* The polish.  There isn’t any.  While the game is reasonable enough in it’s own right everything about the game screams out for another 3-6 months of tidying up.  And to be honest this is the biggest disappointment about the game.  It could have been so much more.  Epic asked for feedback and then ignored pretty much all of the stuff they got bad.
* The editor crashes for me when I attempt to export .u files.  It’s a right bummer.
* There’s no speech binder.  Having to edit your user.ini file to assign messages to keys is a particularly poor interface.
* No bot customisation – unless you feel up so some more ini hacking.  One of the greatest things in UT was the ability to tweak the bot behaviour in terms of accuracy, alertness, etc.  In UT2003 this feature has been toasted.
* The game feels like a console port – and suffers because of it.  Although the interface is slick, Uwindows was a vastly superior interface.  I have a PC not a console dammit.
* The maximum length for the player name is too short.  I can’t get my clan tag and player name into it.  How this one managed to creep in I’m not sure.
* The ending.  Considering the amount of effort that went into the awesome intro, the ending is completley unbelievable.  I went back to it with all the details (projectors and stuff) turned on to see if it was any different.  The ending is pap.  No, it's worse than that.  It defies belief and explanation.  It really isn't worth the effort of playing through.

===What needs the polish ===
* User profile support is limited to the single player campaign.  This means that when you share your PC you have to remember to change your player name and preferred keys.  The profile feature has only been half-implemented.
* In the single player game you get to choose a squad of players – which is good.  However, there isn’t any way of training those players, or improving their stats (that I’ve found anyway), so you don’t really get that attached to them.  Being able to play “training” matches would have been really good.
* The HUD is particularly annoying.  Messages from players on your team don’t always have the player’s location in.  Sometimes they do, sometimes they don’t.  Also, when the location is shown it’s buried in the message.  It needs to be somewhere obvious – UT has this implemented perfectly.  Also, your health and armour are not co-located.  If you are carrying a weapon and don’t have it selected you can’t tell how much ammunition you have for it.  I find myself scanning far more of the screen to get the information I want than I did in UT.
* The command menu has taken a step backwards.  Rather than allowing you to click on the options you want while you have the voice menu key down they’ve gone for a “tribes 2” press a million keys to give an order approach.  While this does the job again I feel that the UT command menu was superior.

'''Mychaeel:''' Quite the opposite &amp;ndash; the new voice menu is a huge improvement over the old one.  (Of course those are only our respective opinions.)  The old menu required you to cumbersomely point-and-click at options while the new menu allows you to quickly tap a key sequence without even having to look at the menu &amp;ndash; that's by far more efficient.

'''Tarquin:''' I agree with Mych. I could naver use the old menu &amp;ndash; press V, fumble with mouse, wrong menu pops up, get show in the back by Sexmachine. :( This new one seems better.

* The font used for messages is nasty.  It’s all capital letters and mono-spaced.  The UT font looked nicer and was easier to read.
* Some of the maps need tweaking.  One particular map, BR-Skyline (if I remember the name right) kills my PC in certain positions.  It feels like an Antiportal is to small somewhere.  I’ll go from a happy 90-110 frames a second to around 4 (if I’m lucky).  It’s horrible.
* There’s still no option to disallow extra time in team games.  A very useful feature in clan matches (is there a mutator to do it?).

'''Tarquin:''' The HUD doesn't put the key numbers for the weapons. This is annoying. This is what made Quake unplayable IMO &amp;ndash; always thinking &quot;damn, which weapon do I want?&quot;. Can we make custom HUDs to fix this?

'''EntropicLqd:''' I've been considering attempting to build a custom HUD to see whether it's all purely client side or not, and how much the ''cheat protection'' will allow you to get away with.  I only ever use ''next weapon'' and ''previous weapon'' to select my weapons so the numbers don't actually help me much.  I just remember the relative positions.

===In summary ===

Although it seems like I’m being really harsh on the game, I’m not at all.  The new game types are nice, although Double Domination is going to be really hard.  The game is a good one.  However, the overall lack of polish, and the lack-lustre map design prevents a good game from being truly great.  Which is a shame.

Still, I guess it’ll all get fixed either by the community or, by Epic in a number of game patches.  Either that, or Epic want UT2003 to fail (or be mediocre at best) so that Unreal Warfare becomes the de-facto standard rather than UT2003.

And I still can't make up my mind about the Adrenaline moves.  It's a cute addition but really does unbalance BR and CTF games.  DD doesn't suffer so much since it's so damn hard to score anyway.

===Discussion ===

'''DJPaul: ''' I totally agree with all your points - well written.

'''EntropicLqd:''' Thanks.  There's still loads of stuff I didn't cover - like the need for an announcer volume - but this isn't a &quot;beat up on UT2003&quot; comment.  One of the CTF maps (the one with the fuel tanks) is actually really good but I'd hate to play it against real people - it's a little too small for that.  Especially with the Speed adrenaline move.  I'll keep updating this page with stuff I like (hopefully) and more irritations as I play it (hah - like I have time).

'''Aphex:''' ...and the translocator has been slaughtered!  :(  Where's the shadow?  Where's the tactile feel and the sound fx?

'''Highlander:''' I agree on most points, i REALLY miss the (zonetag) that was prefixed onto teamsay messages, however im one of those freaks who LIKED the tribes 2 chat system :P it was (imho) very well thought out and logical, however im none too fond of the ut2003 system numbers just dont do it for me. The all-caps for chat thing pisses me off to no end. Overall though its a really nice game, BR is quite the gametype... DD would strike me as very frustrating to play with good opponents. The Adrenaline moves I like in BR and CTF, Not sure about DM. Weapon balance seems fine to me. Not a big fan of the DM maps except Tokara (sp?) forest, and perhaps plunge which is a lot of fun with the x-loc on.

===Questions ===

''Any?''

==Weapons ==

'''Tarquin:''' Urg! I can't shoot ANYTHING with the lightning gun. bam. wait wait wait wait wait wait wait bam! It could at least give a charge indicator. Flak &amp;ndash; can't hit anything with this either. There's no splash damage!

'''Mychaeel:''' Well... it ''has'' a charge indicator.  See the vertical bar on the right side (in zoomed view) that fills up as you wait?

'''EntropicLqd:''' Tarquin - I assume you play with weapons hidden then?  If you don't, watch the main animation - it's a bit of a dead give-a-way.  Failing that, listen for the very faint audio cue.

'''Tarquin:''' Darn. THat means I have to go and play it some more. ;)

----

'''ZxAnPhOrIaN:''' *Grunt* I have uh.. 3 problems with the translocator.
# When i destroy the translocator beacon, you can retrieve it back without killing yourself...
# When i shoot it, it won't blast far far away...
# The ammo amount, it only has, FIVE, charges, mise well not even use the translocator.

(Anyone up for a translocator fixing mutator?)

I have 1 good thing about the translocator
# The camera...

My other peeve about weapons are the flak cannon... The flak shell doesn't travel as far as the original flak cannon in UT.

==So That's What's Wrong With It &amp;ndash; I Quit ==

'''EntropicLqd:'''
: I have a cool idea for a map.  I have all the details worked out in my head.  This is going to be a good one.  The theme is set in my head as wood, brick and metal - a la Gauntlet/Koos Galleaon.  This will work, will look nice, and play better.
: I've just been through all of the static meshes supplied with UT2003 (I'm no modeller or texture artist) and I'm screwed.  Completely and utterly knackered.  Unless I want a crappy tech. based level I've got nothing to work with.  About the only levels that comes close to the effect I'm after is DM-Asbestos and DOM-Ruination, and they don't really give me the things I need.
: The theming for UT2003 is just bollocks.  There is no variety.  I'm not suprised all the levels look the same and feel the same.  My goldfish could come up with more imaginative environments than I have available.
: And the other thing that really really irritates me is that a lot of the maps seem to have static meshes in that are not available as &quot;static meshes&quot;.  What are you supposed to do?  Save the damn things as prefabs yourself?

'''Tarquin:''' static meshes in packs: we solved that problem: http://forums.beyondunreal.com/showthread.php?s=&amp;threadid=133020 We should really write it up on [[Legacy:Mapping With Static Meshes|Mapping with Static Meshes]]. Lack of decent meshes: I have a cunning plan...

'''EntropicLqd:''' Thanks for the link Tarquin.  A most interesting read.  My conclusion is that Mychaeel has way to much time on his hands.  Now that I've calmed down a bit (and I did a thorough analysis of DOM-Ruination) I'll have a play and see what happens.  Ruination really is a very cleverly constructed map.  There's very very few meshes used in the map, and the meshes that have been used have been cunningly stretched, rotated, and otherwise manipulated to look different.  It's an impressive construction.  It's a shame they never put any proper music to it.  I'm not sure how they kept the texturing looking so sweet though.

'''Mychaeel:''' Eh, eh.  ;-)  No, I just ''know'' that packages are packages are packages for the Unreal engine, regardless of what they contain.

'''EntropicLqd:''' I'm just jealous ;-).  I just can't seem to find the time to reach the same standard of ''leetness'' at Unreal Engine stuff as I have done for the stuff I do on my day job.  It's a bit irritating really because there's stuff I feel I should just ''know'' but have never put there in the first place so don't.  As unfair as the comparison is, I feel I ought to be as good at UScript, something that I toy with for a couple of hours a week, as I am with the languages I work with for 8 (or more) hours a day.  I guess if I concentrated purely on the code and left the mapping to those that can I'd stand more of a chance.  There's just something appealing about making maps &amp;ndash; not that I ever finish them.  Maybe when I retire :)

'''Tarquin:''' I LIKE this page. So I'm unwiping it. Maybe we could rewrite it to be more general rather than one person's opinion.</text>
    </revision>
    <revision>
      <id>2977</id>
      <timestamp>2003-10-17T14:42:30Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Delete me</comment>
      <text xml:space="preserve">[[:Category:Legacy Delete Me]]

One year later I still don't like the damn game.  Maybe 2K4 will be great but the odds of that are small.  And why do I always put a comment in except when I need one - duh!
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Entry Level</title>
    <id>1137</id>
    <revision>
      <id>2987</id>
      <timestamp>2003-05-03T07:28:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>no idea what this is about...</comment>
      <text xml:space="preserve">The Entry level is an &quot;alternate reality&quot; level within a UT client.  Stuff can be stored there without being garbage-collected.  In addition, actors in the entry level can be displayed on the canvas like any other actor.  I don't believe that AllActors will iterate through actors outside the level in which whose context it is run.  Also, &quot;editactor class=something&quot; will not find actors in the entry level.  However, &quot;editactor name=something0&quot; will work.

The entry level only exists on UT clients.  I have verified that it does not exist at all on dedicated servers (as it needs to be obtained through a [[Legacy:PlayerPawn|PlayerPawn]]'s GetEntryLevel() call).</text>
    </revision>
    <revision>
      <id>2988</id>
      <timestamp>2003-04-13T22:27:34Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <comment>[[Refactor_Me]]</comment>
      <text xml:space="preserve">The Entry level is an &quot;alternate reality&quot; level within a UT client.  Stuff can be stored there without being garbage-collected.  In addition, actors in the entry level can be displayed on the canvas like any other actor.  I don't believe that AllActors will iterate through actors outside the level in which whose context it is run.  Also, &quot;editactor class=something&quot; will not find actors in the entry level.  However, &quot;editactor name=something0&quot; will work.

The entry level only exists on UT clients.  I have verified that it does not exist at all on dedicated servers (as it needs to be obtained through a [[Legacy:PlayerPawn|PlayerPawn]]'s GetEntryLevel() call).

----

[[Legacy:Refactor_Me|Refactor_Me]]</text>
    </revision>
    <revision>
      <id>33581</id>
      <timestamp>2008-12-06T13:44:53Z</timestamp>
      <contributor>
        <username>DomraCliro</username>
        <id>1724</id>
      </contributor>
      <minor/>
      <comment>celelleto</comment>
      <text xml:space="preserve">delorcac
The Entry level is an &quot;alternate reality&quot; level within a UT client.  Stuff can be stored there without being garbage-collected.  In addition, actors in the entry level can be displayed on the canvas like any other actor.  I don't believe that AllActors will iterate through actors outside the level in which whose context it is run.  Also, &quot;editactor class=something&quot; will not find actors in the entry level.  However, &quot;editactor name=something0&quot; will work.

The entry level only exists on UT clients.  I have verified that it does not exist at all on dedicated servers (as it needs to be obtained through a [[Legacy:PlayerPawn|PlayerPawn]]'s GetEntryLevel() call).</text>
    </revision>
    <revision>
      <id>33584</id>
      <timestamp>2008-12-06T18:18:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/DomraCliro|DomraCliro]] ([[User talk:DomraCliro|Talk]]); changed back to last version by [[User:Tarquin|Tarquin]]</comment>
      <text xml:space="preserve">The Entry level is an &quot;alternate reality&quot; level within a UT client.  Stuff can be stored there without being garbage-collected.  In addition, actors in the entry level can be displayed on the canvas like any other actor.  I don't believe that AllActors will iterate through actors outside the level in which whose context it is run.  Also, &quot;editactor class=something&quot; will not find actors in the entry level.  However, &quot;editactor name=something0&quot; will work.

The entry level only exists on UT clients.  I have verified that it does not exist at all on dedicated servers (as it needs to be obtained through a [[Legacy:PlayerPawn|PlayerPawn]]'s GetEntryLevel() call).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Enum</title>
    <id>28899</id>
    <revision>
      <id>42829</id>
      <timestamp>2010-03-31T11:08:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>Created page with '{{missing legacy class}}'</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Environment Mapping</title>
    <id>1125</id>
    <revision>
      <id>2958</id>
      <timestamp>2004-05-22T18:54:39Z</timestamp>
      <contributor>
        <ip>Dkgamez</ip>
      </contributor>
      <minor/>
      <comment>Dead link</comment>
      <text xml:space="preserve">This is a simple, and shortened definition of its use within Unreal Tournament.

Basically, an object is made to reflect an arbitrary image (or texture) by placing the said image on the inside surface of a cube or sphere, then mathematically placing the selected object inside the cube/sphere where the inside surface of the cube/sphere (covered with the image) is reflected. Used best with a texture that will look natural when reflected but obscured enough to be unrecognizable. E.g. a solid color texture will not work.

Using this usually just gives the illusion of reflectivity or &quot;shininess&quot; on a mesh, with a similar effect to skyboxes in reference to &quot;point of perspective&quot;. 

Another form of environment mapping is making an object reflect its surroundings dynamically, much like the mirror option for surface properties of world geometry in maps. This method involves quite complex operations and a lot of slow down if used frequently. The calculations are simpler in the previous case. ('''Foxpaw:''' How can we set a material to do this?)

'''AlphaOne:''' I think that [http://www.marblemadness2003.com marblemadness2003] mod does dynamic reflections. Here is what they say they did: [http://www.marblemadness2003.com/forum/viewtopic.php?t=2&amp;highlight=environment forum thread]

'''Foxpaw:''' Unless I'm reading that wrong.. they explicitly state that they did not use dynamic reflections on that thread.

'''AOANLA:''' You are reading it wrong. Apparently they generate a new environment map each frame, and pass that to the rendering code, as UT 2003 itself doesn't generate dynamic maps. So... it's a workaround.

'''AlphaOne:''' It looks like they have a problem with tiling.

Here is a diagram of the latter method. (not really used int Unreal, but helps understand the concept)

[[Image:Legacy_shinymap.jpeg|center|Dont remember the site i got this from, but it was made by Scott Ruggels]]

==Links ==
* Here is another link with pictures: http://home.san.rr.com/thereindels/Mapping/Mapping.html

----

[[:Category:Legacy To Do]] - There should be some description of how to do this in UnrealED.  Also both the links above are broken!
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2959</id>
      <timestamp>2003-08-06T04:44:29Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>TODO!</comment>
      <text xml:space="preserve">This is a simple, and shortened definition of its use within Unreal Tournament.

Basically, an object is made to reflect an arbitrary image (or texture) by placing the said image on the inside surface of a cube or sphere, then mathematically placing the selected object inside the cube/sphere where the inside surface of the cube/sphere (covered with the image) is reflected. Used best with a texture that will look natural when reflected but obscured enough to be unrecognizable. E.g. a solid color texture will not work.

Using this usually just gives the illusion of reflectivity or &quot;shininess&quot; on a mesh, with a similar effect to skyboxes in reference to &quot;point of perspective&quot;. 

Another form of environment mapping is making an object reflect its surroundings dynamically, much like the mirror option for surface properties of world geometry in maps. This method involves quite complex operations and alot of slow down if used frequently. The calculations are simpler in the previous case. ('''Foxpaw:''' How can we set a material to do this?)

'''AlphaOne:''' I think that [http://www.marblemadness2003.com marblemadness2003] mod does dynamic reflections. Here is what they say they did: [http://www.marblemadness2003.com/forum/viewtopic.php?t=2&amp;highlight=environment forum thread]

'''Foxpaw:''' Unless I'm reading that wrong.. they explicitly state that they did not use dynamic reflections on that thread.

'''AOANLA:''' You are reading it wrong. Apparently they generate a new environment map each frame, and pass that to the rendering code, as UT 2003 itself doesn't generate dynamic maps. So... it's a workaround.

'''AlphaOne:''' It looks like they have a problem with tiling.

Here is a diagram of the latter method. (not really used int Unreal, but helps understand the concept)

[[Image:Legacy_shinymap.jpeg|center|Dont remember the site i got this from, but it was made by Scott Ruggels]]

==Links ==
* Google says:  http://romka.demonews.com/graphics/doc/txt/envmap.htm
* Here is another link with pictures: http://home.san.rr.com/thereindels/Mapping/Mapping.html

----

[[:Category:Legacy To Do]] - There should be some description of how to do this in UnrealED.  Also both the links above are broken!
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2960</id>
      <timestamp>2003-10-24T19:41:33Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>&quot;alot&quot; is NOT a word!</comment>
      <text xml:space="preserve">This is a simple, and shortened definition of its use within Unreal Tournament.

Basically, an object is made to reflect an arbitrary image (or texture) by placing the said image on the inside surface of a cube or sphere, then mathematically placing the selected object inside the cube/sphere where the inside surface of the cube/sphere (covered with the image) is reflected. Used best with a texture that will look natural when reflected but obscured enough to be unrecognizable. E.g. a solid color texture will not work.

Using this usually just gives the illusion of reflectivity or &quot;shininess&quot; on a mesh, with a similar effect to skyboxes in reference to &quot;point of perspective&quot;. 

Another form of environment mapping is making an object reflect its surroundings dynamically, much like the mirror option for surface properties of world geometry in maps. This method involves quite complex operations and a lot of slow down if used frequently. The calculations are simpler in the previous case. ('''Foxpaw:''' How can we set a material to do this?)

'''AlphaOne:''' I think that [http://www.marblemadness2003.com marblemadness2003] mod does dynamic reflections. Here is what they say they did: [http://www.marblemadness2003.com/forum/viewtopic.php?t=2&amp;highlight=environment forum thread]

'''Foxpaw:''' Unless I'm reading that wrong.. they explicitly state that they did not use dynamic reflections on that thread.

'''AOANLA:''' You are reading it wrong. Apparently they generate a new environment map each frame, and pass that to the rendering code, as UT 2003 itself doesn't generate dynamic maps. So... it's a workaround.

'''AlphaOne:''' It looks like they have a problem with tiling.

Here is a diagram of the latter method. (not really used int Unreal, but helps understand the concept)

[[Image:Legacy_shinymap.jpeg|center|Dont remember the site i got this from, but it was made by Scott Ruggels]]

==Links ==
* Google says:  http://romka.demonews.com/graphics/doc/txt/envmap.htm
* Here is another link with pictures: http://home.san.rr.com/thereindels/Mapping/Mapping.html

----

[[:Category:Legacy To Do]] - There should be some description of how to do this in UnrealED.  Also both the links above are broken!
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Epic Games</title>
    <id>1140</id>
    <revision>
      <id>2993</id>
      <timestamp>2007-04-21T03:29:08Z</timestamp>
      <contributor>
        <ip>CPE-124-182-160-168.sa.bigpond.net.au</ip>
      </contributor>
      <comment>Added gears link</comment>
      <text xml:space="preserve">'''Epic Games''', everybody's favorite game developer.  Used to be &quot;Epic MegaGames,&quot; but they lost the &quot;Mega&quot; somewhere on the way.

==Links==

* Company website: http://www.epicgames.com

* Official Unreal-engine modding information:
* * Unreal Developer Network:  http://udn.epicgames.com
* * Unreal engine news:  http://unreal.epicgames.com

* Games created by or with help of Epic:
* * Unreal: http://www.Unreal.com
* * Unreal 2: http://www.Unreal2.com
* * Unreal Tournament:  http://www.UnrealTournament.com
* * Unreal Tournament 2003:  http://www.UnrealTournament2003.com
* * Unreal Tournament 2004:  http://www.UnrealTournament2004.com
* * Unreal Championship:
* * Unreal Championship 2:  http://www.UnrealChampionship2.com
* * Gears of War: http://www.GearsofWar.com

You can make [[Legacy:InterWiki|InterWiki]] links to the UDN with:
* udntech 
* udncontent 

If you want to see some really old games by Epic go to http://www.the-underdogs.info/company.php?id=154</text>
    </revision>
    <revision>
      <id>2994</id>
      <timestamp>2007-04-12T10:01:50Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>fixed underdogs link</comment>
      <text xml:space="preserve">'''Epic Games''', everybody's favorite game developer.  Used to be &quot;Epic MegaGames,&quot; but they lost the &quot;Mega&quot; somewhere on the way.

==Links==

* Company website: http://www.epicgames.com

* Official Unreal-engine modding information:
* * Unreal Developer Network:  http://udn.epicgames.com
* * Unreal engine news:  http://unreal.epicgames.com

* Games created by or with help of Epic:
* * Unreal: http://www.unreal.com
* * Unreal 2: http://www.unreal2.com
* * Unreal Tournament:  http://www.unrealtournament.com
* * Unreal Tournament 2003:  http://www.unrealtournament2003.com
* * Unreal Tournament 2004:  http://www.unrealtournament2004.com
* * Unreal Championship:
* * Unreal Championship 2:  http://www.UnrealChampionship2.com

You can make [[Legacy:InterWiki|InterWiki]] links to the UDN with:
* udntech 
* udncontent 

If you want to see some really old games by Epic go to http://www.the-underdogs.info/company.php?id=154</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EricBlade</title>
    <id>1208</id>
    <revision>
      <id>3133</id>
      <timestamp>2006-12-22T16:10:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Howdy!

I've come to start working with the Unreal Engine, using not an Unreal game, but actually Groove Games/BrainBox's Land of the Dead game.  It's difficult to find things that don't depend on the game-specific things, but there are some good ones around here on the Wiki.  

I've been programming virtually all my life, though the usefulness of programs that I wrote when I was 5 is .. well, nil. For that matter, it was nil then.  Most all of my programming has been modifications for games, or communications things (BBS software back in the day, and I wrote the first DOS IRC client, back in the days when Windows was barely functional.. though some would argue that's still true).  I re-coded and greatly enhanced the C-Net 64 BBS Empire game, created a web-based version of another BBS-era game, and most pertinent to what I'm doing with LotD/Unreal Engine, is that I wrote the entire codebase for a MUD (in the MUD's LPC programming language, which is actually quite similar to UnrealScript, though I think it was quite a bit more advanced than US is..).  Unfortunatly, none of the work that I have done has survived the ages, so I really don't have much of an example (you can still find my old IRC client online, but there's not much hope of using it for anything anymore).  My mods to LotD are normally released on www.undeadgames.com .. and I also am admin for a couple of other hobbyist sites, http://83poker.webhop.net/ and http://swgcrimesyndicate.com/ 
 

I would also like to help improve the Wiki, as I've noticed that a LOT of its pages are pure data, with no actual description of what/why something is useful, what it's used for, etc.  

Another thing that I've noticed is that although it's called &quot;The Unreal Engine Documentation Site&quot;, it's almost completely concerned with the actual Unreal games, excepting for Deus Ex and Postal 2.  And it seems that lots of things are being updated for UT2k4, with previous documentation phasing out.  I think that everything should have a listing for where and when and what it was implemented in, which functions work in which engine versions, so on so forth..  I (obviously) still need to learn to do real Wiki formatting, but I would very much intend to document everything that I discover about how everything works..

Things that I'm making notes of for LotD, for whatever reason:

* Setting StdTraceDistance to 0 from AdvancedWeapon, even with AltTraceDistance set, causes the Alt-Fire to fail to function.
  Probably need to actually check and see what the hell those two things do.
  (appears to need to be around 100 or so for the Alt-Fire to function)
* Karma parameters do not seem to replicate - adjusting them after the fact only works in NM_StandAlone
* The function called Notify_MeleeDamage(), called somewhere in the Weapon tree is somewhere around useless, and definitely misleading.  It is called when the weapon swings, rather than when damage is done. (to achieve knowing when damage is done, you must subclass DOTZMeleeWeapon, or something else somewhere in the tree, and jam your own call into the ProcessTraceHitOnMat)
* It appears to be virtually impossible to create a Pickup that has editable parameters, that can be injected into a weapon, as the function that creates the weapon and gives it to a player is private, and can't be overridden.  Therefore, one would have to subclass, and then re-create the -entire- pickup code, otherwise it will be calling in the wrong object in the tree, if it will even allow it at all.  
* It would've been a lot better design idea for pickups to be invisible generic placemarkers on the level that actually spawn (and re-spawn if needed) the actual object they are set for, which then handles the inventory code, instead of this bizarre method that they are now, in which case they are an action-driven (or walk over in other games) item that spawns an object directly into a players inventory.  Totally bizarre.
* Why didn't anyone think of a Caller reference, that would return whatever the heck object is calling you? and/or something that would return back whatever the heck caused your entire current chain of execution?
* Player.PlayerReplicationInfo.GamerTag is used instead of PlayerName, this is apparently something involving the Xbox support.  I can't figure out how GamerTag is set from the ?XgamerTag= option that the game is given.
* We can override DOTZPlayerController.ToggleObjectivesDisplay() to actually work in multiplayer properly, when we get around to objective based multiplayer missions
* If DOTZPlayerController.PostNetBeginPlay() calls StopAllMusic(0), why does level specified music work? Someone did report that the music gets weird at time during multiplayer play, so maybe that has something to do with it.
* There seems to be some sort of &quot;Profiler&quot; class built into the engine (since nothing for it seems to exist in Uscript) that handles remembering user profiles.  I'm thinking it is also part of the Xbox support, but have no idea for sure.
* The game does not by default allow you to carry more than one melee or thrown weapon, but does allow for several guns.  In multiplayer, you can only have two guns, one melee, and one thrown.  I'm thinking this is somehow handled in inventory, as there is code in DOTZPlayerController to actually deal with multiple melee and thrown and guns being in inventory at the same time.
* It seems to have some kind of weather support.  It appears that you setup some kind of emitter for your weather, put a WeatherEffect into your level, and assign the emitter to that WeatherEffect's &quot;WeatherEffect&quot; setting in the editor.  It appears that this causes the weather effect to play clientside, not serverside.  This would be very handy to level designers, if we had any idea how it actually works.  It does not appear at a first glance, that it supports multiple weather effects, and that the last one that it finds will override any previous ones.  it seems very odd that this would not be a zone-dependent thing.
* bShowInventory in AdvancedPawn (WHY not playercontroller? argh) causes the weapon-info to be displayed in HUD, and has nothing to do with any other inventory functions that are not particularly used in this game
* Attempting to subclass any of the DOTZGUI components causes a compiler crash, ala:

&lt;uscript&gt;Assertion failed: FriendlyName!=NAME_None [File:UnClass.cpp] [Line: 682]&lt;/uscript&gt;

* Who decided to build a system like this that doesn't support multiple inheritance?  If I ever meet them.... there will be a clash :D

====List of functions called by the Engine, in UnrealScript====
* Level.Game.InitGame(String Options, out String Error) - called very quickly after startup, along with the game's command line.  Set the Error string to something, and the engine will die with that error. Strangely, InitGame() is not called when a game is Loaded.  I wonder how to get command line when loading a game?

* Level.Game.Login(string Portal, string Options, out String Error) - called when a person attempts to login.  Return an error string if login is not allowed.  Options is the command line the user used to connect with.  Expects a return type of PlayerController.

* Level.Game.PostLogin(PlayerController NewPlayer) - called after Login() in the Gameinfo, if there was no error.  I think I'd read somewhere that it was not safe to call functions in the NewPlayer controller, until this function.  PostLogin() -seems- to get called sometimes with NewPlayer == None, sometimes, for no obvious reason.

* PostRender(Canvas C) - called in a user's HUD (and other places?) immediatly after rendering each frame, usually used to draw the HUD.

* WorldSpaceOverlays() - ? apparently called in HUD somewhere, no further information at this time

* Tick(float delta) - called every Game Tick, in every actor, with a delta being the time (in ms?) since last tick

* PostNetReceive() - called in each actor after the client receives network update

* Landed(vector X) - called in any actor when it lands on something after previously being airborne, X being a vector containing information about your landing

* ZoneChange(ZoneInfo NewZone) - called in any actor when it reaches a new map zone, newzone = the new zone information

* Kimpact(actor Other, vector Pos, vector ImpactVel, vector ImpactNorm) - Called when an object has physics set to PHYS_KARMA, and it hits something else in the world that blocks Karma actors

* PostLoad() - Called in PlayerController (and others?) after a new level or a saved game is loaded.  In LotD, it is used to register a Motion Blur camera effect

* PreClientTravel() - Called in PlayerController (and others?) before a new level is loaded. 

* FellOutOfWorld(eKillZType KillType) - Called in any actor that finds itself outside of the level geometry.  Should either destroy the object, or teleport it to a known good location.

* PreBeginPlay() - called before an object is put into the world

* PostBeginPlay() - Called in any actor, after it is dropped into the world

* Touch(actor Other) - called in one object whenever another object is touching it.  (so it would be called in both objects when they are touching each other).  Other is the object that is touching this one.  This gets called for every tick that the objects are touching.

* TakeDamage(int Damage, Pawn instigatedBy, vector HitLocation, vector Momentum, class&lt;damageType&gt; DamageType) - called to cause an object to take damage.  I'm not sure why this is in the engine, it seems much more a lib type thing (and it is called in several places in LotD's lib)

* Timer() - called by the engine, after a SetTimer() call is made

* BeginState() - called in state code, immediatly after a statechange is made, such as with GotoState()

* EndState() - called in state code, immediatly before BeginState() of a new state is called when state changes.

* PreSaveGame() - called in (all?) actors immediatly before saving a game

* PostSaveGame() - called in (all?) actors immediatly after a game is saved

* UnTouch(Actor Other) - called in touching objects, the moment they are no longer touching each other, with Other being the object that used to be touching this object.

* MultiTimer(int slotID) - called in response to a SetMultiTimer() call

* NotifyLevelChange() - called in all (GUIs? objects? actors?) when we need to be ready for a level change

* Destroyed() - called in all Actors when they are to be destroyed

* GainedChild(actor Other) - called in any object that becomes the owner of a brand new object thanks to a Spawn() call setting it as owner

* LostChild(actor Other) - called in any object that loses a child due to it's child being destroyed

* Bump(actor Other) - called in any object when it runs into something (how does this differ from Touch? it appears to be called tons of times)

* Tornoff() - called in any actor when bTearoff is set, meaning it will be deleted from the server, but kept on clients until it's Lifetime expires

* PostNetBeginPlay() - called after PostBeginPlay(), if it is a network game

* ConnectFailure(String FailCode, String URL) - called in HUD when a connection fails

* ShowUpgradeMenu() - called in HUD when you have a lower version than the MinNetVer of the server you connect to - unused in LotD, as there is only one engine version for this game

* Initialized() - called in Interaction classes after they have been created and initialized

* DetourWeight(Pawn Other, float Pathweight)
* SpecialCost(Pawn Other, ReachSpec Path)
* SuggestMovePreparation(Pawn Other)
 - these are called in PathNode actors during movement by the AI ?

* ClientLostConnection() - called in PlayerController when it becomes disconnected from the server

* SetProgressMessage(int Index, string S, color C) - called in PlayerController while downloading content from a server, also called while playing demos

* SetProgressTime(float T) - called in PlayerController - Having something to do with the above call?

... this is probably highly incomplete, and may be inaccurate, but it's what i see from some quick searching.  If this info is already archived somewhere on the Wiki, I can't find it, and it'd be really handy.

==Etc==

I'm moving a bunch of stuff to [[Legacy:EricBlade/Developer Journal|EricBlade/Developer Journal]] now that I've discovered that category.

==Random Stuff==

[[Legacy:EricBlade/ZombieZilla|EricBlade/ZombieZilla]] ; Mutator originally written for Land of the Dead, but should be easily applicable to any UE game.. Easily alter the size of your enemies :D

==Guestbook==

'''Tarquin:''' Hi. Welcome to the wiki! We're cool with stuff about older games, but there's not as many people interested in adding material on those. Go ahead with making improvements as you see fit. If you make a mistake, don't worry, someone will help guide you along :)

'''SuperApe:''' Howdy. :)  Looks like you're well-versed in programming.  Great to have you around.  Welcome.

'''Wormbo:''' You can always get the options via GetUrlOption(&quot;option name&quot;) or via the Level.Get*Url() functions. The LevelInfo functions probably include a server IP or map name.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3134</id>
      <timestamp>2006-12-22T16:02:03Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>InitGame() not called on Load</comment>
      <text xml:space="preserve">Howdy!

I've come to start working with the Unreal Engine, using not an Unreal game, but actually Groove Games/BrainBox's Land of the Dead game.  It's difficult to find things that don't depend on the game-specific things, but there are some good ones around here on the Wiki.  

I've been programming virtually all my life, though the usefulness of programs that I wrote when I was 5 is .. well, nil. For that matter, it was nil then.  Most all of my programming has been modifications for games, or communications things (BBS software back in the day, and I wrote the first DOS IRC client, back in the days when Windows was barely functional.. though some would argue that's still true).  I re-coded and greatly enhanced the C-Net 64 BBS Empire game, created a web-based version of another BBS-era game, and most pertinent to what I'm doing with LotD/Unreal Engine, is that I wrote the entire codebase for a MUD (in the MUD's LPC programming language, which is actually quite similar to UnrealScript, though I think it was quite a bit more advanced than US is..).  Unfortunatly, none of the work that I have done has survived the ages, so I really don't have much of an example (you can still find my old IRC client online, but there's not much hope of using it for anything anymore).  My mods to LotD are normally released on www.undeadgames.com .. and I also am admin for a couple of other hobbyist sites, http://83poker.webhop.net/ and http://swgcrimesyndicate.com/ 
 

I would also like to help improve the Wiki, as I've noticed that a LOT of its pages are pure data, with no actual description of what/why something is useful, what it's used for, etc.  

Another thing that I've noticed is that although it's called &quot;The Unreal Engine Documentation Site&quot;, it's almost completely concerned with the actual Unreal games, excepting for Deus Ex and Postal 2.  And it seems that lots of things are being updated for UT2k4, with previous documentation phasing out.  I think that everything should have a listing for where and when and what it was implemented in, which functions work in which engine versions, so on so forth..  I (obviously) still need to learn to do real Wiki formatting, but I would very much intend to document everything that I discover about how everything works..

Things that I'm making notes of for LotD, for whatever reason:

* Setting StdTraceDistance to 0 from AdvancedWeapon, even with AltTraceDistance set, causes the Alt-Fire to fail to function.
  Probably need to actually check and see what the hell those two things do.
  (appears to need to be around 100 or so for the Alt-Fire to function)
* Karma parameters do not seem to replicate - adjusting them after the fact only works in NM_StandAlone
* The function called Notify_MeleeDamage(), called somewhere in the Weapon tree is somewhere around useless, and definitely misleading.  It is called when the weapon swings, rather than when damage is done. (to achieve knowing when damage is done, you must subclass DOTZMeleeWeapon, or something else somewhere in the tree, and jam your own call into the ProcessTraceHitOnMat)
* It appears to be virtually impossible to create a Pickup that has editable parameters, that can be injected into a weapon, as the function that creates the weapon and gives it to a player is private, and can't be overridden.  Therefore, one would have to subclass, and then re-create the -entire- pickup code, otherwise it will be calling in the wrong object in the tree, if it will even allow it at all.  
* It would've been a lot better design idea for pickups to be invisible generic placemarkers on the level that actually spawn (and re-spawn if needed) the actual object they are set for, which then handles the inventory code, instead of this bizarre method that they are now, in which case they are an action-driven (or walk over in other games) item that spawns an object directly into a players inventory.  Totally bizarre.
* Why didn't anyone think of a Caller reference, that would return whatever the heck object is calling you? and/or something that would return back whatever the heck caused your entire current chain of execution?
* Player.PlayerReplicationInfo.GamerTag is used instead of PlayerName, this is apparently something involving the Xbox support.  I can't figure out how GamerTag is set from the ?XgamerTag= option that the game is given.
* We can override DOTZPlayerController.ToggleObjectivesDisplay() to actually work in multiplayer properly, when we get around to objective based multiplayer missions
* If DOTZPlayerController.PostNetBeginPlay() calls StopAllMusic(0), why does level specified music work? Someone did report that the music gets weird at time during multiplayer play, so maybe that has something to do with it.
* There seems to be some sort of &quot;Profiler&quot; class built into the engine (since nothing for it seems to exist in Uscript) that handles remembering user profiles.  I'm thinking it is also part of the Xbox support, but have no idea for sure.
* The game does not by default allow you to carry more than one melee or thrown weapon, but does allow for several guns.  In multiplayer, you can only have two guns, one melee, and one thrown.  I'm thinking this is somehow handled in inventory, as there is code in DOTZPlayerController to actually deal with multiple melee and thrown and guns being in inventory at the same time.
* It seems to have some kind of weather support.  It appears that you setup some kind of emitter for your weather, put a WeatherEffect into your level, and assign the emitter to that WeatherEffect's &quot;WeatherEffect&quot; setting in the editor.  It appears that this causes the weather effect to play clientside, not serverside.  This would be very handy to level designers, if we had any idea how it actually works.  It does not appear at a first glance, that it supports multiple weather effects, and that the last one that it finds will override any previous ones.  it seems very odd that this would not be a zone-dependent thing.
* bShowInventory in AdvancedPawn (WHY not playercontroller? argh) causes the weapon-info to be displayed in HUD, and has nothing to do with any other inventory functions that are not particularly used in this game
* Attempting to subclass any of the DOTZGUI components causes a compiler crash, ala:

&lt;uscript&gt;Assertion failed: FriendlyName!=NAME_None [File:UnClass.cpp] [Line: 682]&lt;/uscript&gt;

* Who decided to build a system like this that doesn't support multiple inheritance?  If I ever meet them.... there will be a clash :D

====List of functions called by the Engine, in UnrealScript====
* Level.Game.InitGame(String Options, out String Error) - called very quickly after startup, along with the game's command line.  Set the Error string to something, and the engine will die with that error. Strangely, InitGame() is not called when a game is Loaded.  I wonder how to get command line when loading a game?

* Level.Game.Login(string Portal, string Options, out String Error) - called when a person attempts to login.  Return an error string if login is not allowed.  Options is the command line the user used to connect with.  Expects a return type of PlayerController.

* Level.Game.PostLogin(PlayerController NewPlayer) - called after Login() in the Gameinfo, if there was no error.  I think I'd read somewhere that it was not safe to call functions in the NewPlayer controller, until this function.  PostLogin() -seems- to get called sometimes with NewPlayer == None, sometimes, for no obvious reason.

* PostRender(Canvas C) - called in a user's HUD (and other places?) immediatly after rendering each frame, usually used to draw the HUD.

* WorldSpaceOverlays() - ? apparently called in HUD somewhere, no further information at this time

* Tick(float delta) - called every Game Tick, in every actor, with a delta being the time (in ms?) since last tick

* PostNetReceive() - called in each actor after the client receives network update

* Landed(vector X) - called in any actor when it lands on something after previously being airborne, X being a vector containing information about your landing

* ZoneChange(ZoneInfo NewZone) - called in any actor when it reaches a new map zone, newzone = the new zone information

* Kimpact(actor Other, vector Pos, vector ImpactVel, vector ImpactNorm) - Called when an object has physics set to PHYS_KARMA, and it hits something else in the world that blocks Karma actors

* PostLoad() - Called in PlayerController (and others?) after a new level or a saved game is loaded.  In LotD, it is used to register a Motion Blur camera effect

* PreClientTravel() - Called in PlayerController (and others?) before a new level is loaded. 

* FellOutOfWorld(eKillZType KillType) - Called in any actor that finds itself outside of the level geometry.  Should either destroy the object, or teleport it to a known good location.

* PreBeginPlay() - called before an object is put into the world

* PostBeginPlay() - Called in any actor, after it is dropped into the world

* Touch(actor Other) - called in one object whenever another object is touching it.  (so it would be called in both objects when they are touching each other).  Other is the object that is touching this one.  This gets called for every tick that the objects are touching.

* TakeDamage(int Damage, Pawn instigatedBy, vector HitLocation, vector Momentum, class&lt;damageType&gt; DamageType) - called to cause an object to take damage.  I'm not sure why this is in the engine, it seems much more a lib type thing (and it is called in several places in LotD's lib)

* Timer() - called by the engine, after a SetTimer() call is made

* BeginState() - called in state code, immediatly after a statechange is made, such as with GotoState()

* EndState() - called in state code, immediatly before BeginState() of a new state is called when state changes.

* PreSaveGame() - called in (all?) actors immediatly before saving a game

* PostSaveGame() - called in (all?) actors immediatly after a game is saved

* UnTouch(Actor Other) - called in touching objects, the moment they are no longer touching each other, with Other being the object that used to be touching this object.

* MultiTimer(int slotID) - called in response to a SetMultiTimer() call

* NotifyLevelChange() - called in all (GUIs? objects? actors?) when we need to be ready for a level change

* Destroyed() - called in all Actors when they are to be destroyed

* GainedChild(actor Other) - called in any object that becomes the owner of a brand new object thanks to a Spawn() call setting it as owner

* LostChild(actor Other) - called in any object that loses a child due to it's child being destroyed

* Bump(actor Other) - called in any object when it runs into something (how does this differ from Touch? it appears to be called tons of times)

* Tornoff() - called in any actor when bTearoff is set, meaning it will be deleted from the server, but kept on clients until it's Lifetime expires

* PostNetBeginPlay() - called after PostBeginPlay(), if it is a network game

* ConnectFailure(String FailCode, String URL) - called in HUD when a connection fails

* ShowUpgradeMenu() - called in HUD when you have a lower version than the MinNetVer of the server you connect to - unused in LotD, as there is only one engine version for this game

* Initialized() - called in Interaction classes after they have been created and initialized

* DetourWeight(Pawn Other, float Pathweight)
* SpecialCost(Pawn Other, ReachSpec Path)
* SuggestMovePreparation(Pawn Other)
 - these are called in PathNode actors during movement by the AI ?

* ClientLostConnection() - called in PlayerController when it becomes disconnected from the server

* SetProgressMessage(int Index, string S, color C) - called in PlayerController while downloading content from a server, also called while playing demos

* SetProgressTime(float T) - called in PlayerController - Having something to do with the above call?

... this is probably highly incomplete, and may be inaccurate, but it's what i see from some quick searching.  If this info is already archived somewhere on the Wiki, I can't find it, and it'd be really handy.

==Etc==

I'm moving a bunch of stuff to [[Legacy:EricBlade/Developer Journal|EricBlade/Developer Journal]] now that I've discovered that category.

==Random Stuff==

[[Legacy:EricBlade/ZombieZilla|EricBlade/ZombieZilla]] ; Mutator originally written for Land of the Dead, but should be easily applicable to any UE game.. Easily alter the size of your enemies :D

==Guestbook==

'''Tarquin:''' Hi. Welcome to the wiki! We're cool with stuff about older games, but there's not as many people interested in adding material on those. Go ahead with making improvements as you see fit. If you make a mistake, don't worry, someone will help guide you along :)

'''SuperApe:''' Howdy. :)  Looks like you're well-versed in programming.  Great to have you around.  Welcome.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40305</id>
      <timestamp>2009-11-29T16:53:41Z</timestamp>
      <contributor>
        <ip>68.41.133.179</ip>
      </contributor>
      <text xml:space="preserve">Howdy!

I've come to start working with the Unreal Engine, using not an Unreal game, but actually Groove Games/BrainBox's Land of the Dead game.  It's difficult to find things that don't depend on the game-specific things, but there are some good ones around here on the Wiki.  

I've been programming virtually all my life, though the usefulness of programs that I wrote when I was 5 is .. well, nil. For that matter, it was nil then.  Most all of my programming has been modifications for games, or communications things (BBS software back in the day, and I wrote the first DOS IRC client, back in the days when Windows was barely functional.. though some would argue that's still true).  I re-coded and greatly enhanced the C-Net 64 BBS Empire game, created a web-based version of another BBS-era game, and most pertinent to what I'm doing with LotD/Unreal Engine, is that I wrote the entire codebase for a MUD (in the MUD's LPC programming language, which is actually quite similar to UnrealScript, though I think it was quite a bit more advanced than US is..).  Unfortunatly, none of the work that I have done has survived the ages, so I really don't have much of an example (you can still find my old IRC client online, but there's not much hope of using it for anything anymore).  My mods to LotD are normally released on www.undeadgames.com .. 

my websites...
http://www.landofthedeadmatchmaking.com/
http://ericblade.postalboard.com/
http://blackmagik.dynup.net/
 

I would also like to help improve the Wiki, as I've noticed that a LOT of its pages are pure data, with no actual description of what/why something is useful, what it's used for, etc.  

Another thing that I've noticed is that although it's called &quot;The Unreal Engine Documentation Site&quot;, it's almost completely concerned with the actual Unreal games, excepting for Deus Ex and Postal 2.  And it seems that lots of things are being updated for UT2k4, with previous documentation phasing out.  I think that everything should have a listing for where and when and what it was implemented in, which functions work in which engine versions, so on so forth..  I (obviously) still need to learn to do real Wiki formatting, but I would very much intend to document everything that I discover about how everything works..

Things that I'm making notes of for LotD, for whatever reason:

* Setting StdTraceDistance to 0 from AdvancedWeapon, even with AltTraceDistance set, causes the Alt-Fire to fail to function.
  Probably need to actually check and see what the hell those two things do.
  (appears to need to be around 100 or so for the Alt-Fire to function)
* Karma parameters do not seem to replicate - adjusting them after the fact only works in NM_StandAlone
* The function called Notify_MeleeDamage(), called somewhere in the Weapon tree is somewhere around useless, and definitely misleading.  It is called when the weapon swings, rather than when damage is done. (to achieve knowing when damage is done, you must subclass DOTZMeleeWeapon, or something else somewhere in the tree, and jam your own call into the ProcessTraceHitOnMat)
* It appears to be virtually impossible to create a Pickup that has editable parameters, that can be injected into a weapon, as the function that creates the weapon and gives it to a player is private, and can't be overridden.  Therefore, one would have to subclass, and then re-create the -entire- pickup code, otherwise it will be calling in the wrong object in the tree, if it will even allow it at all.  
* It would've been a lot better design idea for pickups to be invisible generic placemarkers on the level that actually spawn (and re-spawn if needed) the actual object they are set for, which then handles the inventory code, instead of this bizarre method that they are now, in which case they are an action-driven (or walk over in other games) item that spawns an object directly into a players inventory.  Totally bizarre.
* Why didn't anyone think of a Caller reference, that would return whatever the heck object is calling you? and/or something that would return back whatever the heck caused your entire current chain of execution?
* Player.PlayerReplicationInfo.GamerTag is used instead of PlayerName, this is apparently something involving the Xbox support.  I can't figure out how GamerTag is set from the ?XgamerTag= option that the game is given.
* We can override DOTZPlayerController.ToggleObjectivesDisplay() to actually work in multiplayer properly, when we get around to objective based multiplayer missions
* If DOTZPlayerController.PostNetBeginPlay() calls StopAllMusic(0), why does level specified music work? Someone did report that the music gets weird at time during multiplayer play, so maybe that has something to do with it.
* There seems to be some sort of &quot;Profiler&quot; class built into the engine (since nothing for it seems to exist in Uscript) that handles remembering user profiles.  I'm thinking it is also part of the Xbox support, but have no idea for sure.
* The game does not by default allow you to carry more than one melee or thrown weapon, but does allow for several guns.  In multiplayer, you can only have two guns, one melee, and one thrown.  I'm thinking this is somehow handled in inventory, as there is code in DOTZPlayerController to actually deal with multiple melee and thrown and guns being in inventory at the same time.
* It seems to have some kind of weather support.  It appears that you setup some kind of emitter for your weather, put a WeatherEffect into your level, and assign the emitter to that WeatherEffect's &quot;WeatherEffect&quot; setting in the editor.  It appears that this causes the weather effect to play clientside, not serverside.  This would be very handy to level designers, if we had any idea how it actually works.  It does not appear at a first glance, that it supports multiple weather effects, and that the last one that it finds will override any previous ones.  it seems very odd that this would not be a zone-dependent thing.
* bShowInventory in AdvancedPawn (WHY not playercontroller? argh) causes the weapon-info to be displayed in HUD, and has nothing to do with any other inventory functions that are not particularly used in this game
* Attempting to subclass any of the DOTZGUI components causes a compiler crash, ala:

&lt;uscript&gt;Assertion failed: FriendlyName!=NAME_None [File:UnClass.cpp] [Line: 682]&lt;/uscript&gt;

* Who decided to build a system like this that doesn't support multiple inheritance?  If I ever meet them.... there will be a clash :D

====List of functions called by the Engine, in UnrealScript====
* Level.Game.InitGame(String Options, out String Error) - called very quickly after startup, along with the game's command line.  Set the Error string to something, and the engine will die with that error. Strangely, InitGame() is not called when a game is Loaded.  I wonder how to get command line when loading a game?

* Level.Game.Login(string Portal, string Options, out String Error) - called when a person attempts to login.  Return an error string if login is not allowed.  Options is the command line the user used to connect with.  Expects a return type of PlayerController.

* Level.Game.PostLogin(PlayerController NewPlayer) - called after Login() in the Gameinfo, if there was no error.  I think I'd read somewhere that it was not safe to call functions in the NewPlayer controller, until this function.  PostLogin() -seems- to get called sometimes with NewPlayer == None, sometimes, for no obvious reason.

* PostRender(Canvas C) - called in a user's HUD (and other places?) immediatly after rendering each frame, usually used to draw the HUD.

* WorldSpaceOverlays() - ? apparently called in HUD somewhere, no further information at this time

* Tick(float delta) - called every Game Tick, in every actor, with a delta being the time (in ms?) since last tick

* PostNetReceive() - called in each actor after the client receives network update

* Landed(vector X) - called in any actor when it lands on something after previously being airborne, X being a vector containing information about your landing

* ZoneChange(ZoneInfo NewZone) - called in any actor when it reaches a new map zone, newzone = the new zone information

* Kimpact(actor Other, vector Pos, vector ImpactVel, vector ImpactNorm) - Called when an object has physics set to PHYS_KARMA, and it hits something else in the world that blocks Karma actors

* PostLoad() - Called in PlayerController (and others?) after a new level or a saved game is loaded.  In LotD, it is used to register a Motion Blur camera effect

* PreClientTravel() - Called in PlayerController (and others?) before a new level is loaded. 

* FellOutOfWorld(eKillZType KillType) - Called in any actor that finds itself outside of the level geometry.  Should either destroy the object, or teleport it to a known good location.

* PreBeginPlay() - called before an object is put into the world

* PostBeginPlay() - Called in any actor, after it is dropped into the world

* Touch(actor Other) - called in one object whenever another object is touching it.  (so it would be called in both objects when they are touching each other).  Other is the object that is touching this one.  This gets called for every tick that the objects are touching.

* TakeDamage(int Damage, Pawn instigatedBy, vector HitLocation, vector Momentum, class&lt;damageType&gt; DamageType) - called to cause an object to take damage.  I'm not sure why this is in the engine, it seems much more a lib type thing (and it is called in several places in LotD's lib)

* Timer() - called by the engine, after a SetTimer() call is made

* BeginState() - called in state code, immediatly after a statechange is made, such as with GotoState()

* EndState() - called in state code, immediatly before BeginState() of a new state is called when state changes.

* PreSaveGame() - called in (all?) actors immediatly before saving a game

* PostSaveGame() - called in (all?) actors immediatly after a game is saved

* UnTouch(Actor Other) - called in touching objects, the moment they are no longer touching each other, with Other being the object that used to be touching this object.

* MultiTimer(int slotID) - called in response to a SetMultiTimer() call

* NotifyLevelChange() - called in all (GUIs? objects? actors?) when we need to be ready for a level change

* Destroyed() - called in all Actors when they are to be destroyed

* GainedChild(actor Other) - called in any object that becomes the owner of a brand new object thanks to a Spawn() call setting it as owner

* LostChild(actor Other) - called in any object that loses a child due to it's child being destroyed

* Bump(actor Other) - called in any object when it runs into something (how does this differ from Touch? it appears to be called tons of times)

* Tornoff() - called in any actor when bTearoff is set, meaning it will be deleted from the server, but kept on clients until it's Lifetime expires

* PostNetBeginPlay() - called after PostBeginPlay(), if it is a network game

* ConnectFailure(String FailCode, String URL) - called in HUD when a connection fails

* ShowUpgradeMenu() - called in HUD when you have a lower version than the MinNetVer of the server you connect to - unused in LotD, as there is only one engine version for this game

* Initialized() - called in Interaction classes after they have been created and initialized

* DetourWeight(Pawn Other, float Pathweight)
* SpecialCost(Pawn Other, ReachSpec Path)
* SuggestMovePreparation(Pawn Other)
 - these are called in PathNode actors during movement by the AI ?

* ClientLostConnection() - called in PlayerController when it becomes disconnected from the server

* SetProgressMessage(int Index, string S, color C) - called in PlayerController while downloading content from a server, also called while playing demos

* SetProgressTime(float T) - called in PlayerController - Having something to do with the above call?

... this is probably highly incomplete, and may be inaccurate, but it's what i see from some quick searching.  If this info is already archived somewhere on the Wiki, I can't find it, and it'd be really handy.

==Etc==

I'm moving a bunch of stuff to [[Legacy:EricBlade/Developer Journal|EricBlade/Developer Journal]] now that I've discovered that category.

==Random Stuff==

[[Legacy:EricBlade/ZombieZilla|EricBlade/ZombieZilla]] ; Mutator originally written for Land of the Dead, but should be easily applicable to any UE game.. Easily alter the size of your enemies :D

==Guestbook==

'''Tarquin:''' Hi. Welcome to the wiki! We're cool with stuff about older games, but there's not as many people interested in adding material on those. Go ahead with making improvements as you see fit. If you make a mistake, don't worry, someone will help guide you along :)

'''SuperApe:''' Howdy. :)  Looks like you're well-versed in programming.  Great to have you around.  Welcome.

'''Wormbo:''' You can always get the options via GetUrlOption(&quot;option name&quot;) or via the Level.Get*Url() functions. The LevelInfo functions probably include a server IP or map name.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EricBlade's Journal</title>
    <id>1209</id>
    <revision>
      <id>3135</id>
      <timestamp>2006-03-24T04:42:28Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Seems I discover more and more about how this Wiki thingi works every day, and need this page to be deleted.  Haven't discovered how to do that, though?</text>
    </revision>
    <revision>
      <id>3136</id>
      <timestamp>2006-03-24T04:40:15Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===3/16/06===

OK, I've spent the last day and a half trying to figure out just what the hell went wrong in my custom Decoration class.  I don't override any code in the base, except to record takedamage() in my debug setup. (or at least i didn't, when it mysteriously stopped working)  As far as I can remember, it stopped working as I was working on getting sane defaultproperties, as the defaults for Decoration have virtually everything turned off for some reason.   Here's what happens:

I load a level with a nice Decoration in it (in my test case, it's an ATM Machine, although i initially found it had stopped working with a bookcase and a coffee table). I go running full tilt into the ATM machine, and *poof* it disappears.  

I reset all the default properties back to normal, recreated it, reloaded the level, and exact same thing.

Here are my default properties, with all the ones that i had changed before the issue started commented out:

      StaticMesh     = StaticMesh'DOTZSIndustrial.Outdoor.WoodenBox'

	DrawType       = DT_StaticMesh

	//bBlockActors   = true

	//bBlockKarma    = true

	//bBlockPlayers  = true

	//bCollideActors = true

	//bProjTarget    = true

	bStatic        = false

	bStasis        = false

	//bDamageable    = true

	//bPushable      = true

	//PushSound      = Sound'DOTZXActionObjects.Crate.CratePush'

	//FragType       = class'Engine.Fragment'

	//FragSkin       = Texture'SpecialFX.Particles.rockchunks02'

I have now overridden every function in Decoration, along with a few in Actor, so that I can figure out what the heck the chain of execution is (it really pisses me off that this engine has no apparent way to actually just get a text string of the current execution chain, however it sure can give it to you when you breathe too hard and crash the editor!).  Here's what's happening:
  Bump(mypawn) is getting called 4 times
  FellOutOfWorld() is called
  Destroy() then
  Destroyed()

 w.t.f?

Yay, Figured it out.  It was bCollideWorld.  Seems to be an editor issue with this, though, in that if we build all with a decoration with bCollideWorld turned on, the editor takes a trip and crashes.

==03/19/06==
 

Anyone versed in Karma?

Is it possible, that Karma might actually be disabled at the engine level? 

Just for grins, I wanted an object that I could just kick around, like the computers in Postal 2.. but in Land of the Dead.
 

So, I pull out my Postal 2 resources, load up the editor, and take a look at the computer in the RWS office.  Looks like it's a &quot;KActor&quot;, pretty much all default properties (looks like RWS may have added some extra stuff to KActor), so I go back to LOTD-Ed, and load up my test level with all my test stuff in it, and place a KActor, using the static mesh of, a hanging light.  Put the light just off the

ceiling, start it up, run into it, and bounce right off, no affect.  It's acting like PHYS_None.  

Now, can someone correct me if I'm wrong here:
 

If I give something a nice set of Karma properties (like KActor defaults to), set it's default physics to PHYS_KARMA, and set KStartsEnabled = true, and place it in the middle of open space, the first thing it should do, is fall straight to the nearest floor/other solid object?  Right? 

I do this, and it just sits there just like any other object placed in the middle of space with phys_none.  
 
 Ugh?

'''SuperApe:''' Wish I was more competent with Karma, but isn't there a KWake() function that wakes up Karma objects? (evidentally only after it has come to rest, like on the floor)  This from [[Legacy:Karma Functions And Events|Karma Functions And Events]]:
; native final function KWake(); : &quot;Wakes up&quot; the actor. This causes the Karma physics to begin simulating after the object has been deemed to be &quot;at rest.&quot;

'''EricBlade:''' thanks for the help, pretty sure that's not it,though.  The object was just sitting there, floating in mid air, even with KStartsEnabled on, even when i shot it, or ran into it with my pawn :(

'''SuperApe:''' I only mention it because &quot;floating in mid air&quot;, to me, doesn't seem like the Karma object ever came to rest.

'''EricBlade:''' Not even sure what the heck I'd do with that.. subclass kactor, and throw in a KWake in the PostBeginPlay?

'''SuperApe:''' Perhaps just try it on the floor first.

'''EricBlade:''' woot woot, i needed two things, apparently.  (1) smeshes designed for use with karma (2) HighDetailOnly = false in the Karmaparams

==03/21/06==

Yesterday's experiment: Getting player to display on camera-texture-clients in single player mode.

Success: Not easily feasible as far as I can tell. Pfhoenix actually gave me a useful hint as to where to look to try to make this work, and managed to simultaneously educate me as well.  

Today's first experiment: Download a couple of useful LWO files from turbosquid, and try and import them.  

Success: For some reason my UEd doesn't import LWO files.  The only file format supported for SMesh in is 3DS apparently.  

Figured out the Karma stuff, at least to an initial degree.  woot.  Now, must find a way to get karma collision information on all the existing models in the game :-S  i bet that's gonna be a task!

==03/22/06==

w00tness.  Severed Karma Heads!  with baseball bats, golf clubs, and shovels as our primary weapons, i can see a definite severed zombie head soccer type game in the near future.  Just need to make a gametype and some GoalVolumes. 

Now, is it possible to make Karma objects actually deal properly with hitting a player?  Or is that because the player isn't drawn in single player, that a karma object can fall right through your head, and land at your feet, and you'll suddenly be walking on it?  i know that a moving normal actor will not affect a karma actor that is at rest, so that will be an interesting thing to attempt to simulate.  I heard of someone on here doing it by spawning a karma actor and attaching it to the player pawn, but i'm curious as to if it stayed attached where it was placed, or if it started simulating.. and how would i make an invisible karma actor, anyway?  well, i guess they are already invisible if you don't give them a smesh.. hmm.. *thinks*  any thoughts?

eh, n/m, that was waaaaay easier than i thought.  In the Pawn's bump(), have it KApplyImpulse to any karma actors that it comes in contact with.  not difficult at all.  i probably need some sort of foot weapon, to come from underneath it though to get it some lift.
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EricBlade/Developer Journal</title>
    <id>1210</id>
    <revision>
      <id>3137</id>
      <timestamp>2007-01-24T05:34:22Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>* or a crash overActor-&gt;KParams in KFarfield.cpp line 411</comment>
      <text xml:space="preserve">===1/24/07===

Anyone know what this means?

Warning: Received invalid actor class 124 , 0

Warning: Received invalid actor class 126 , 0

Warning: Received invalid actor class 127 , 0

Warning: Received invalid actor class 128 , 0

Warning: Received invalid actor class 129 , 0

Warning: Received invalid actor class 130 , 0

Warning: Broken 46 , 0

Warning: Broken 124 , 0

Warning: Broken 46 , 0

Warning: Broken 46 , 0

Warning: Broken 46 , 0

.. or how about a crash with this?

Assertion failed: overActor-&gt;KParams [File:KFarfield.cpp] [Line: 411]

This happens on the client whenever I touch a Karma object in multiplayer.

===12/21/06===

Second version (1.1) of my BladeIN/DM/CTF gametypes for Land of the Dead has been released! And it made front page news on ModDB! w00t!

===11/29/06===

Wow, I forgot about my page here.  Well, both of my mods have entries on ModDB.. so, search ModDB for &quot;Land of the Dead&quot; for a game name, and you'll find my stuff :)

===05/30/06===

Wow, I've been working so much on DeadAwake that I forgot to actually come over here and write.  Though I really haven't been doing much coding, lately.  We need to get the levels that are built into a beautiful shape, so I'm helping with that.  Learning to model (some things have come out surprisingly well, and some things have come out very very surprisingly horrible).. and I've learned quite a bit about some shortcuts to use in the editor that I never learned during reading all the tutorials.. maybe one day I won't be so horrible at actually building geometry..  

===05/01/06===

Happy May!  All month long is my birthday! :D

Today's early morning revelation: BeamEmitters are teh evil.  2 dimensional objects in 3-d space.  Every use of them I've seen thus far looks like what happens with the monsters in Duke 3d.  Apparently xEmitters are supposed to be far more useful, but I don't have those.  And after the experiences I've had with fixing DE's Uscript, I'm not certain I ever want to mess with something they've had their hands in again.  I wanted to play with the &quot;TrailEmitter&quot;, I do have a UC code for it, and it does appear to be compiled into my Engine.u , but Ued can't find it when i bring up the list of emitters to play with under Emitter properties.  So, that's no fun.  I still have yet to look at this MeshEmitter thingee, but perhaps I will when I get around to making some nice gibs.  This game needs gibs.  Big time.  All we have right now are limbs that fall off, and exploding heads.  Need more gore.  Zombies are gory, and gross.  We need more.  

===04/28/06===

Woo! My first major mod is released.  A gametype addition based on the [[Legacy:Land Of The Dead|Land of the Dead]] [[Legacy:Invasion|Invasion]] game type, which adds support for fully functioning interaction with the player (previously, Level.Game.Broadcast and PlayerController.ClientMessage had no function, since there was no support for them in the HUD class), and a ton of options for server control over the Invasion options that are normally left to the level designers.  Of course, had I known more about UScript when I started working on it, I would've made it extend the standard game, and then built DM, CTF, and IN gametypes on top of it, so that everyone could use it ... but by the time I realised I should've done that, I was pretty much to the &quot;done&quot; phase, about a month ago, and since then i've been squashing the little annoying critter bugs that showed up.

Does this now make me somewhat of an accomplished coder? :D

'''Guest:''' yep, it means from now on you can't write anymore code because you have to spend all your time answering all our annoying questions :-)

===04/27/06===

Aha! After I was writing the diatribe below for today, I read my previous entry about the rockets not doing karma appropriately, and suddenly it occured to me.  If I'm throwing a rocket blast at the base of a bunch of trashcans, Visible* iterator won't contact with the second row of trash cans, because there are static meshes blocking visibility from the point of impact.  Mediocre solution: use CollidingActors for HurtRadius() instead of VisibleCollidingActors().  

Unfortunatly, this gives us a new problem: how to avoid hitting things on the opposite side of a wall, or floor/ceiling ?  I saw some things somewhere in the [[Legacy:Collision|Collision]] section that might be useful for that, although the math involved on it is currently beyond my recollection (ah, the years that have gone by since school...) .. however, I may be able to get away with simply checking to see if the hit actor is in the same zone as the explosion, and hopefully we wouldn't end up with any noticeable problems there, as long as the levels are reasonably zoned.

Spent the last day and a half re-implementing a flame thrower mod, and the results are fairly satisfying.  It feels to me like it's going to have a ton of tuning work to get it down perfect for damage rate, and things like that.  Took me a long time to get it so that we weren't spawning 2 fire objects per second, and to modify the fire scaling code that I had built using Vital's PMT as an inspiration and base for, so that it wouldn't absolutely totally suck down CPU.  It's still pretty intensive, as it would appear that Radius iterators do not deal in collision area, but only in point locations ..  if i could work in collision area, i could increase the collision size of the fire emitter as we increase the area that the emitter is emitting within, and it would become more efficient, and probably better on the visuals too.   

Of course, along with this, I screwed together some more emitter work, learned more about various emitter settings, and managed to tweak out the rocket launcher smoke trails so that they don't look quite so ugly as they did before.   Now, if only I could figure out why they have a green glow on their outer radius, i'd be about 99% done with that piece of work.  

On the bright side, we're down to somewhere around 5 known bugs that deal directly with the code that I've implemented so far, a handful of design problems in Epic or Digital Extreme's code, and all the bugs that I knew of in the original game that don't (a) involve the aforementioned design problems or (b) involve an object that was never designed to work in netplay, that shockingly, doesn't work in netplay are fixed.  

===04/24/06===

Well, I've found an absolutely fundamental flaw in the UT base code for dealing with Projectiles.  I didn't bother to check and see if this is still the same in 2k4, but it appears to be how it works in 2k3 as well as the standard Projectile base code, and LOTD.  

Here's a conversation that I had with someone on my messenger, that describes it:

Eric: that's because the way projectiles work in UT, is that a projectile doesn't actually do damage.. it explodes, and does damage

jason: interesting

Eric: so, it does damage to a radius around where it hits.  now, this doesn't take into account things that are visible in the world, it takes into account the actual Location of an item

Eric: the Location of an item is normally somewhere close to it's center.

Eric: so, it would do damage to the center of something, from the location at which it hit.

jason: ah

Eric: so, pointing a shotgun at it's skull, the explosion of the bullets would rip it's legs off, because the explosion would be affecting an angle straight down from the point of impact

jason: and you fixed this how?

Eric: by making projectiles do damage to what they hit where they hit, like trace bullets do

===04/15/06===

Well, I did not win a trip to Vegas today.  Better luck next time.

Today's adventure was attempting to fix the FastWeaponSwitch/FastReload bug.  Unless someone has some sort of bright idea on how to fix it the -proper- way (and no, i don't mind overloading an assload of code to do it, but i'd prefer not to re-write the entire goshdarned inventory system!) I think i'm going to let that one pass us by.  It does at least, after overriding quite a bit of code, manage to notify the weapon that is being switched from that it needs to be PutDown(). The -proper- way would be to actually play the DeSelect animation. However, without rigging Select/DeSelect to timers and all sorts of nasty stuff, I don't see much of a way to do that. :|

===04/12/06===

Things are progressing pretty nicely.  I've figured out a bit about [[Legacy:BeamEmitter|BeamEmitter]]s .. started in on [[Legacy:MeshEmitter|MeshEmitter]]s, but their very strange behavior compared to Mesh and [[Legacy:SpriteEmitter|SpriteEmitter]] was baffling enough for me to move on to other things I'd been wanting to tackle.

Namely, the fact that projectile explosions do not impart Karma impulses.  I figured a simple override of Explode(), add some KAddImpulse() goodness, and i'd be all set.  Not so.

First, we end up finding that we need to create our own HurtRadius function to be called instead of Actor::HurtRadius().  OK, we override that, override BlowUp() to call our new one.. throw some KAddImpulse() goodness in, and.. nothing. Increase the blast radius to around double the normal amount, to see what's going on ..  I'm throwing these explosive devices at a pile of KActors, you see, and this time, I get the one that I hit moving (expected), along with one about a foot away from it, even though there were three others in the way first.  Huh?

As I increase the size of the radius, objects farther away start getting Impulses, but objects closer stop.  Apparently VisibleCollidingActors with a Radius specified doesn't actually give you a radius, it operates in the circumference of the circle defined by the radius from the blast.  So, I move to RadiusActors.  Same result.  I move the blast radius to equal close to the area of the room.  I shoot at the center, and I hit one object that's near a wall.. everything else, nada.  

This engine is so full of things that so desperately appear to me to be bugs, I can't believe that it actually was sold to other people in the condition that it is in.  Either that, or i'm totally missing something incredibly obvious. 

===04/06/06===

I wish there were an &quot;Edit This Page&quot; link on the top, as well as the bottom, now that this page is large :)

I've spent the last couple days playing with menus, and emitters.  I've never looked at the original Unreal code, and hardly at any of the newer UT2k3 or 2k4 code except for some very specific low-levelish things, so I don't know how they do their menus, but.. inspired by the original Unreal's amazing tech demo display when you loaded it's main menu, I decided that maybe having something showing instead of just a static background for the menu would be a cool thing.  So, I spent some time farking around with the main menu, built a transparent and animated texture for the background of the main menu, and found that after closing all the other menus (why does Unreal open everything that looks like a menu, then use page flipping between them? is this a trick from 1998 to make things appear faster?) i had an actual LEVEL sticking through all that muck.  So, I threw in some zombies, and some of the neat effects that i've been working on, and coded up some camera movement stuff.  The other guys thought it was way cool :)

Also, as I've found [[Legacy:Emitter|Emitter]]s to be incredible pains in the butt, I thought I'd share a little bit of my work with them with the rest of the community here, and maybe I can inspire others to share some of theirs as well. 

 [[Legacy:EricBlade/Emitters|EricBlade/Emitters]]
 

===3/30/06===

Replicating Karma sucks.  The simulations are so radically different from each other on different machines, that it seems completely impossible that the server and clients could be using the same input data, unless the Karma system involves an assload of randomness.  Seriously.  Create a ball.  Put it in a room with a few player starts, join 3 people into the game.  Replicate the kicking of the ball, and watch as all 3 clients, plus the server, have the ball run entirely different simulations.  It's horrible.  Once you start replicating the Karma state from the server, to the clients, then you have something that moves in vaguely the same direction, but at about a quarter the speed it normally would, and it's constantly flipping back and forth between a couple of frames of animation, as it does it.  

wow, we need a/some modeler(s), and textures.  The textures that came with LOTD are ok, but 256x256 just doesn't seem to give the quality that i'm looking for.  I dumped in a couple of much higher quality textures, and they just look incredible.  Unfortunatly, the digital camera here is not so high a quality, it's one of the old Sony ones that uses a damn floppy disk for storage.  Not sure what it's resolution is, but it's probably not good.  So, I guess I need to learn how to make something look good in photoshop for Tiling purposes.  I've got a couple awesome surfaces, but they don't tile very well right now :(

DeadAwake will definitely have a lot more blood than the original game.  We've got some very awesome blood splats for use in Projectors, and such.  Hopefully I can figure out some ways of modding the stock emitters that came with the game, as well, to improve the blood effects.  Zombie games need lots of blood, right? Also, I need to look into how the corpses were done in the original game, and improve upon that, too.  In a zombie outbreak, there'd be a lot more corpses that didn't get turned, I'd expect.. I'm thinking that instead of using a pawn that is stuck in a 1 frame animation (i think that's how it's done for the dead bodies in the game), it might be better to just throw in ragdolls .. maybe?  I can't think of any other Engine games that would have corpses placed haphazardly on a level, so maybe that wouldn't be the way to do it.  hmm.

===3/26/06===

Well, all that stuff is settled and taken care of.  Now, I've moved onto [[Legacy:WeatherEffect|WeatherEffect]]. Mostly have it working, all zoned off and pretty, and good stuff here.  We've got some kick ass rain happening on a way souped up version of the original CH01 single player level (Jack's House) that came with the game.   Now, the next interesting question, and I'd appreciate it if anyone might have any insight:

How do scale an Emitter's output, so I don't kill performance on slower computers?

This works for placed Emitters:

&lt;uscript&gt;
function PostBeginPlay() {
    Emitters[0].MaxActiveParticles *= Level.Game.EmitterDetail;
}
&lt;/uscript&gt;

(obviously it's not exactly like that, but that's the meat of it)

However, it only works for emitters placed in the level.  Emitters spawned within the game (such as from the EnableWeatherEffects() functions), it has absolutely no effect on.  To make it affect those, I need to set it on a Timer.  This does decrease the number of

particles, however it leaves us with a bunch of loose particles hanging in mid-air, since the emitter has already started.  Setting

bDisabled = true, then running the timer, then setting bDisabled = false, results in the Emitter returning to it's original settings.  (I imagine that MaxActiveParticles is reset by the function that restarts the emitter) oooh. That gives me a thought.  Maybe bDisabled = true, setTimer(0.1), in the timer do bDisabled = false; then do the MaxActiveParticles.. maybe it won't have a chance to spawn all the spare ones before it gets throttled.  

Nope, that doesn't do it.  

Also, for the placed emitters, would it be better to have several small emitters placed at like windows and doors, or just have one big emitter around the entire house?  I've currently got one emitter, with a SphereRange=(Min=1200,Max=1200), which seems like that would be better performing than having several small emitters.  

===3/16/06===

OK, I've spent the last day and a half trying to figure out just what the hell went wrong in my custom Decoration class.  I don't override any code in the base, except to record takedamage() in my debug setup. (or at least i didn't, when it mysteriously stopped working)  As far as I can remember, it stopped working as I was working on getting sane defaultproperties, as the defaults for Decoration have virtually everything turned off for some reason.   Here's what happens:

I load a level with a nice Decoration in it (in my test case, it's an ATM Machine, although i initially found it had stopped working with a bookcase and a coffee table). I go running full tilt into the ATM machine, and *poof* it disappears.  

I reset all the default properties back to normal, recreated it, reloaded the level, and exact same thing.

Here are my default properties, with all the ones that i had changed before the issue started commented out:

      StaticMesh     = StaticMesh'DOTZSIndustrial.Outdoor.WoodenBox'

	DrawType       = DT_StaticMesh

	//bBlockActors   = true

	//bBlockKarma    = true

	//bBlockPlayers  = true

	//bCollideActors = true

	//bProjTarget    = true

	bStatic        = false

	bStasis        = false

	//bDamageable    = true

	//bPushable      = true

	//PushSound      = Sound'DOTZXActionObjects.Crate.CratePush'

	//FragType       = class'Engine.Fragment'

	//FragSkin       = Texture'SpecialFX.Particles.rockchunks02'

I have now overridden every function in Decoration, along with a few in Actor, so that I can figure out what the heck the chain of execution is (it really pisses me off that this engine has no apparent way to actually just get a text string of the current execution chain, however it sure can give it to you when you breathe too hard and crash the editor!).  Here's what's happening:
  Bump(mypawn) is getting called 4 times
  FellOutOfWorld() is called
  Destroy() then
  Destroyed()

 w.t.f?

Yay, Figured it out.  It was bCollideWorld.  Seems to be an editor issue with this, though, in that if we build all with a decoration with bCollideWorld turned on, the editor takes a trip and crashes.

==03/19/06==
 

Anyone versed in Karma?

Is it possible, that Karma might actually be disabled at the engine level? 

Just for grins, I wanted an object that I could just kick around, like the computers in Postal 2.. but in Land of the Dead.
 

So, I pull out my Postal 2 resources, load up the editor, and take a look at the computer in the RWS office.  Looks like it's a &quot;KActor&quot;, pretty much all default properties (looks like RWS may have added some extra stuff to KActor), so I go back to LOTD-Ed, and load up my test level with all my test stuff in it, and place a KActor, using the static mesh of, a hanging light.  Put the light just off the

ceiling, start it up, run into it, and bounce right off, no affect.  It's acting like PHYS_None.  

Now, can someone correct me if I'm wrong here:
 

If I give something a nice set of Karma properties (like KActor defaults to), set it's default physics to PHYS_KARMA, and set KStartsEnabled = true, and place it in the middle of open space, the first thing it should do, is fall straight to the nearest floor/other solid object?  Right? 

I do this, and it just sits there just like any other object placed in the middle of space with phys_none.  
 
 Ugh?

'''SuperApe:''' Wish I was more competent with Karma, but isn't there a KWake() function that wakes up Karma objects? (evidentally only after it has come to rest, like on the floor)  This from [[Legacy:Karma Functions And Events|Karma Functions And Events]]:
; native final function KWake(); : &quot;Wakes up&quot; the actor. This causes the Karma physics to begin simulating after the object has been deemed to be &quot;at rest.&quot;

'''EricBlade:''' thanks for the help, pretty sure that's not it,though.  The object was just sitting there, floating in mid air, even with KStartsEnabled on, even when i shot it, or ran into it with my pawn :(

'''SuperApe:''' I only mention it because &quot;floating in mid air&quot;, to me, doesn't seem like the Karma object ever came to rest.

'''EricBlade:''' Not even sure what the heck I'd do with that.. subclass kactor, and throw in a KWake in the PostBeginPlay?

'''SuperApe:''' Perhaps just try it on the floor first.

'''EricBlade:''' woot woot, i needed two things, apparently.  (1) smeshes designed for use with karma (2) HighDetailOnly = false in the Karmaparams

==03/21/06==

Yesterday's experiment: Getting player to display on camera-texture-clients in single player mode.

Success: Not easily feasible as far as I can tell. Pfhoenix actually gave me a useful hint as to where to look to try to make this work, and managed to simultaneously educate me as well.  

Today's first experiment: Download a couple of useful LWO files from turbosquid, and try and import them.  

Success: For some reason my UEd doesn't import LWO files.  The only file format supported for SMesh in is 3DS apparently.  

Figured out the Karma stuff, at least to an initial degree.  woot.  Now, must find a way to get karma collision information on all the existing models in the game :-S  i bet that's gonna be a task!

==03/22/06==

w00tness.  Severed Karma Heads!  with baseball bats, golf clubs, and shovels as our primary weapons, i can see a definite severed zombie head soccer type game in the near future.  Just need to make a gametype and some GoalVolumes. 

Now, is it possible to make Karma objects actually deal properly with hitting a player?  Or is that because the player isn't drawn in single player, that a karma object can fall right through your head, and land at your feet, and you'll suddenly be walking on it?  i know that a moving normal actor will not affect a karma actor that is at rest, so that will be an interesting thing to attempt to simulate.  I heard of someone on here doing it by spawning a karma actor and attaching it to the player pawn, but i'm curious as to if it stayed attached where it was placed, or if it started simulating.. and how would i make an invisible karma actor, anyway?  well, i guess they are already invisible if you don't give them a smesh.. hmm.. *thinks*  any thoughts?

eh, n/m, that was waaaaay easier than i thought.  In the Pawn's bump(), have it KApplyImpulse to any karma actors that it comes in contact with.  not difficult at all.  i probably need some sort of foot weapon, to come from underneath it though to get it some lift.
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3138</id>
      <timestamp>2006-12-22T16:06:11Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===12/21/06===

Second version (1.1) of my BladeIN/DM/CTF gametypes for Land of the Dead has been released! And it made front page news on ModDB! w00t!

===11/29/06===

Wow, I forgot about my page here.  Well, both of my mods have entries on ModDB.. so, search ModDB for &quot;Land of the Dead&quot; for a game name, and you'll find my stuff :)

===05/30/06===

Wow, I've been working so much on DeadAwake that I forgot to actually come over here and write.  Though I really haven't been doing much coding, lately.  We need to get the levels that are built into a beautiful shape, so I'm helping with that.  Learning to model (some things have come out surprisingly well, and some things have come out very very surprisingly horrible).. and I've learned quite a bit about some shortcuts to use in the editor that I never learned during reading all the tutorials.. maybe one day I won't be so horrible at actually building geometry..  

===05/01/06===

Happy May!  All month long is my birthday! :D

Today's early morning revelation: BeamEmitters are teh evil.  2 dimensional objects in 3-d space.  Every use of them I've seen thus far looks like what happens with the monsters in Duke 3d.  Apparently xEmitters are supposed to be far more useful, but I don't have those.  And after the experiences I've had with fixing DE's Uscript, I'm not certain I ever want to mess with something they've had their hands in again.  I wanted to play with the &quot;TrailEmitter&quot;, I do have a UC code for it, and it does appear to be compiled into my Engine.u , but Ued can't find it when i bring up the list of emitters to play with under Emitter properties.  So, that's no fun.  I still have yet to look at this MeshEmitter thingee, but perhaps I will when I get around to making some nice gibs.  This game needs gibs.  Big time.  All we have right now are limbs that fall off, and exploding heads.  Need more gore.  Zombies are gory, and gross.  We need more.  

===04/28/06===

Woo! My first major mod is released.  A gametype addition based on the [[Legacy:Land Of The Dead|Land of the Dead]] [[Legacy:Invasion|Invasion]] game type, which adds support for fully functioning interaction with the player (previously, Level.Game.Broadcast and PlayerController.ClientMessage had no function, since there was no support for them in the HUD class), and a ton of options for server control over the Invasion options that are normally left to the level designers.  Of course, had I known more about UScript when I started working on it, I would've made it extend the standard game, and then built DM, CTF, and IN gametypes on top of it, so that everyone could use it ... but by the time I realised I should've done that, I was pretty much to the &quot;done&quot; phase, about a month ago, and since then i've been squashing the little annoying critter bugs that showed up.

Does this now make me somewhat of an accomplished coder? :D

'''Guest:''' yep, it means from now on you can't write anymore code because you have to spend all your time answering all our annoying questions :-)

===04/27/06===

Aha! After I was writing the diatribe below for today, I read my previous entry about the rockets not doing karma appropriately, and suddenly it occured to me.  If I'm throwing a rocket blast at the base of a bunch of trashcans, Visible* iterator won't contact with the second row of trash cans, because there are static meshes blocking visibility from the point of impact.  Mediocre solution: use CollidingActors for HurtRadius() instead of VisibleCollidingActors().  

Unfortunatly, this gives us a new problem: how to avoid hitting things on the opposite side of a wall, or floor/ceiling ?  I saw some things somewhere in the [[Legacy:Collision|Collision]] section that might be useful for that, although the math involved on it is currently beyond my recollection (ah, the years that have gone by since school...) .. however, I may be able to get away with simply checking to see if the hit actor is in the same zone as the explosion, and hopefully we wouldn't end up with any noticeable problems there, as long as the levels are reasonably zoned.

Spent the last day and a half re-implementing a flame thrower mod, and the results are fairly satisfying.  It feels to me like it's going to have a ton of tuning work to get it down perfect for damage rate, and things like that.  Took me a long time to get it so that we weren't spawning 2 fire objects per second, and to modify the fire scaling code that I had built using Vital's PMT as an inspiration and base for, so that it wouldn't absolutely totally suck down CPU.  It's still pretty intensive, as it would appear that Radius iterators do not deal in collision area, but only in point locations ..  if i could work in collision area, i could increase the collision size of the fire emitter as we increase the area that the emitter is emitting within, and it would become more efficient, and probably better on the visuals too.   

Of course, along with this, I screwed together some more emitter work, learned more about various emitter settings, and managed to tweak out the rocket launcher smoke trails so that they don't look quite so ugly as they did before.   Now, if only I could figure out why they have a green glow on their outer radius, i'd be about 99% done with that piece of work.  

On the bright side, we're down to somewhere around 5 known bugs that deal directly with the code that I've implemented so far, a handful of design problems in Epic or Digital Extreme's code, and all the bugs that I knew of in the original game that don't (a) involve the aforementioned design problems or (b) involve an object that was never designed to work in netplay, that shockingly, doesn't work in netplay are fixed.  

===04/24/06===

Well, I've found an absolutely fundamental flaw in the UT base code for dealing with Projectiles.  I didn't bother to check and see if this is still the same in 2k4, but it appears to be how it works in 2k3 as well as the standard Projectile base code, and LOTD.  

Here's a conversation that I had with someone on my messenger, that describes it:

Eric: that's because the way projectiles work in UT, is that a projectile doesn't actually do damage.. it explodes, and does damage

jason: interesting

Eric: so, it does damage to a radius around where it hits.  now, this doesn't take into account things that are visible in the world, it takes into account the actual Location of an item

Eric: the Location of an item is normally somewhere close to it's center.

Eric: so, it would do damage to the center of something, from the location at which it hit.

jason: ah

Eric: so, pointing a shotgun at it's skull, the explosion of the bullets would rip it's legs off, because the explosion would be affecting an angle straight down from the point of impact

jason: and you fixed this how?

Eric: by making projectiles do damage to what they hit where they hit, like trace bullets do

===04/15/06===

Well, I did not win a trip to Vegas today.  Better luck next time.

Today's adventure was attempting to fix the FastWeaponSwitch/FastReload bug.  Unless someone has some sort of bright idea on how to fix it the -proper- way (and no, i don't mind overloading an assload of code to do it, but i'd prefer not to re-write the entire goshdarned inventory system!) I think i'm going to let that one pass us by.  It does at least, after overriding quite a bit of code, manage to notify the weapon that is being switched from that it needs to be PutDown(). The -proper- way would be to actually play the DeSelect animation. However, without rigging Select/DeSelect to timers and all sorts of nasty stuff, I don't see much of a way to do that. :|

===04/12/06===

Things are progressing pretty nicely.  I've figured out a bit about [[Legacy:BeamEmitter|BeamEmitter]]s .. started in on [[Legacy:MeshEmitter|MeshEmitter]]s, but their very strange behavior compared to Mesh and [[Legacy:SpriteEmitter|SpriteEmitter]] was baffling enough for me to move on to other things I'd been wanting to tackle.

Namely, the fact that projectile explosions do not impart Karma impulses.  I figured a simple override of Explode(), add some KAddImpulse() goodness, and i'd be all set.  Not so.

First, we end up finding that we need to create our own HurtRadius function to be called instead of Actor::HurtRadius().  OK, we override that, override BlowUp() to call our new one.. throw some KAddImpulse() goodness in, and.. nothing. Increase the blast radius to around double the normal amount, to see what's going on ..  I'm throwing these explosive devices at a pile of KActors, you see, and this time, I get the one that I hit moving (expected), along with one about a foot away from it, even though there were three others in the way first.  Huh?

As I increase the size of the radius, objects farther away start getting Impulses, but objects closer stop.  Apparently VisibleCollidingActors with a Radius specified doesn't actually give you a radius, it operates in the circumference of the circle defined by the radius from the blast.  So, I move to RadiusActors.  Same result.  I move the blast radius to equal close to the area of the room.  I shoot at the center, and I hit one object that's near a wall.. everything else, nada.  

This engine is so full of things that so desperately appear to me to be bugs, I can't believe that it actually was sold to other people in the condition that it is in.  Either that, or i'm totally missing something incredibly obvious. 

===04/06/06===

I wish there were an &quot;Edit This Page&quot; link on the top, as well as the bottom, now that this page is large :)

I've spent the last couple days playing with menus, and emitters.  I've never looked at the original Unreal code, and hardly at any of the newer UT2k3 or 2k4 code except for some very specific low-levelish things, so I don't know how they do their menus, but.. inspired by the original Unreal's amazing tech demo display when you loaded it's main menu, I decided that maybe having something showing instead of just a static background for the menu would be a cool thing.  So, I spent some time farking around with the main menu, built a transparent and animated texture for the background of the main menu, and found that after closing all the other menus (why does Unreal open everything that looks like a menu, then use page flipping between them? is this a trick from 1998 to make things appear faster?) i had an actual LEVEL sticking through all that muck.  So, I threw in some zombies, and some of the neat effects that i've been working on, and coded up some camera movement stuff.  The other guys thought it was way cool :)

Also, as I've found [[Legacy:Emitter|Emitter]]s to be incredible pains in the butt, I thought I'd share a little bit of my work with them with the rest of the community here, and maybe I can inspire others to share some of theirs as well. 

 [[Legacy:EricBlade/Emitters|EricBlade/Emitters]]
 

===3/30/06===

Replicating Karma sucks.  The simulations are so radically different from each other on different machines, that it seems completely impossible that the server and clients could be using the same input data, unless the Karma system involves an assload of randomness.  Seriously.  Create a ball.  Put it in a room with a few player starts, join 3 people into the game.  Replicate the kicking of the ball, and watch as all 3 clients, plus the server, have the ball run entirely different simulations.  It's horrible.  Once you start replicating the Karma state from the server, to the clients, then you have something that moves in vaguely the same direction, but at about a quarter the speed it normally would, and it's constantly flipping back and forth between a couple of frames of animation, as it does it.  

wow, we need a/some modeler(s), and textures.  The textures that came with LOTD are ok, but 256x256 just doesn't seem to give the quality that i'm looking for.  I dumped in a couple of much higher quality textures, and they just look incredible.  Unfortunatly, the digital camera here is not so high a quality, it's one of the old Sony ones that uses a damn floppy disk for storage.  Not sure what it's resolution is, but it's probably not good.  So, I guess I need to learn how to make something look good in photoshop for Tiling purposes.  I've got a couple awesome surfaces, but they don't tile very well right now :(

DeadAwake will definitely have a lot more blood than the original game.  We've got some very awesome blood splats for use in Projectors, and such.  Hopefully I can figure out some ways of modding the stock emitters that came with the game, as well, to improve the blood effects.  Zombie games need lots of blood, right? Also, I need to look into how the corpses were done in the original game, and improve upon that, too.  In a zombie outbreak, there'd be a lot more corpses that didn't get turned, I'd expect.. I'm thinking that instead of using a pawn that is stuck in a 1 frame animation (i think that's how it's done for the dead bodies in the game), it might be better to just throw in ragdolls .. maybe?  I can't think of any other Engine games that would have corpses placed haphazardly on a level, so maybe that wouldn't be the way to do it.  hmm.

===3/26/06===

Well, all that stuff is settled and taken care of.  Now, I've moved onto [[Legacy:WeatherEffect|WeatherEffect]]. Mostly have it working, all zoned off and pretty, and good stuff here.  We've got some kick ass rain happening on a way souped up version of the original CH01 single player level (Jack's House) that came with the game.   Now, the next interesting question, and I'd appreciate it if anyone might have any insight:

How do scale an Emitter's output, so I don't kill performance on slower computers?

This works for placed Emitters:

&lt;uscript&gt;
function PostBeginPlay() {
    Emitters[0].MaxActiveParticles *= Level.Game.EmitterDetail;
}
&lt;/uscript&gt;

(obviously it's not exactly like that, but that's the meat of it)

However, it only works for emitters placed in the level.  Emitters spawned within the game (such as from the EnableWeatherEffects() functions), it has absolutely no effect on.  To make it affect those, I need to set it on a Timer.  This does decrease the number of

particles, however it leaves us with a bunch of loose particles hanging in mid-air, since the emitter has already started.  Setting

bDisabled = true, then running the timer, then setting bDisabled = false, results in the Emitter returning to it's original settings.  (I imagine that MaxActiveParticles is reset by the function that restarts the emitter) oooh. That gives me a thought.  Maybe bDisabled = true, setTimer(0.1), in the timer do bDisabled = false; then do the MaxActiveParticles.. maybe it won't have a chance to spawn all the spare ones before it gets throttled.  

Nope, that doesn't do it.  

Also, for the placed emitters, would it be better to have several small emitters placed at like windows and doors, or just have one big emitter around the entire house?  I've currently got one emitter, with a SphereRange=(Min=1200,Max=1200), which seems like that would be better performing than having several small emitters.  

===3/16/06===

OK, I've spent the last day and a half trying to figure out just what the hell went wrong in my custom Decoration class.  I don't override any code in the base, except to record takedamage() in my debug setup. (or at least i didn't, when it mysteriously stopped working)  As far as I can remember, it stopped working as I was working on getting sane defaultproperties, as the defaults for Decoration have virtually everything turned off for some reason.   Here's what happens:

I load a level with a nice Decoration in it (in my test case, it's an ATM Machine, although i initially found it had stopped working with a bookcase and a coffee table). I go running full tilt into the ATM machine, and *poof* it disappears.  

I reset all the default properties back to normal, recreated it, reloaded the level, and exact same thing.

Here are my default properties, with all the ones that i had changed before the issue started commented out:

      StaticMesh     = StaticMesh'DOTZSIndustrial.Outdoor.WoodenBox'

	DrawType       = DT_StaticMesh

	//bBlockActors   = true

	//bBlockKarma    = true

	//bBlockPlayers  = true

	//bCollideActors = true

	//bProjTarget    = true

	bStatic        = false

	bStasis        = false

	//bDamageable    = true

	//bPushable      = true

	//PushSound      = Sound'DOTZXActionObjects.Crate.CratePush'

	//FragType       = class'Engine.Fragment'

	//FragSkin       = Texture'SpecialFX.Particles.rockchunks02'

I have now overridden every function in Decoration, along with a few in Actor, so that I can figure out what the heck the chain of execution is (it really pisses me off that this engine has no apparent way to actually just get a text string of the current execution chain, however it sure can give it to you when you breathe too hard and crash the editor!).  Here's what's happening:
  Bump(mypawn) is getting called 4 times
  FellOutOfWorld() is called
  Destroy() then
  Destroyed()

 w.t.f?

Yay, Figured it out.  It was bCollideWorld.  Seems to be an editor issue with this, though, in that if we build all with a decoration with bCollideWorld turned on, the editor takes a trip and crashes.

==03/19/06==
 

Anyone versed in Karma?

Is it possible, that Karma might actually be disabled at the engine level? 

Just for grins, I wanted an object that I could just kick around, like the computers in Postal 2.. but in Land of the Dead.
 

So, I pull out my Postal 2 resources, load up the editor, and take a look at the computer in the RWS office.  Looks like it's a &quot;KActor&quot;, pretty much all default properties (looks like RWS may have added some extra stuff to KActor), so I go back to LOTD-Ed, and load up my test level with all my test stuff in it, and place a KActor, using the static mesh of, a hanging light.  Put the light just off the

ceiling, start it up, run into it, and bounce right off, no affect.  It's acting like PHYS_None.  

Now, can someone correct me if I'm wrong here:
 

If I give something a nice set of Karma properties (like KActor defaults to), set it's default physics to PHYS_KARMA, and set KStartsEnabled = true, and place it in the middle of open space, the first thing it should do, is fall straight to the nearest floor/other solid object?  Right? 

I do this, and it just sits there just like any other object placed in the middle of space with phys_none.  
 
 Ugh?

'''SuperApe:''' Wish I was more competent with Karma, but isn't there a KWake() function that wakes up Karma objects? (evidentally only after it has come to rest, like on the floor)  This from [[Legacy:Karma Functions And Events|Karma Functions And Events]]:
; native final function KWake(); : &quot;Wakes up&quot; the actor. This causes the Karma physics to begin simulating after the object has been deemed to be &quot;at rest.&quot;

'''EricBlade:''' thanks for the help, pretty sure that's not it,though.  The object was just sitting there, floating in mid air, even with KStartsEnabled on, even when i shot it, or ran into it with my pawn :(

'''SuperApe:''' I only mention it because &quot;floating in mid air&quot;, to me, doesn't seem like the Karma object ever came to rest.

'''EricBlade:''' Not even sure what the heck I'd do with that.. subclass kactor, and throw in a KWake in the PostBeginPlay?

'''SuperApe:''' Perhaps just try it on the floor first.

'''EricBlade:''' woot woot, i needed two things, apparently.  (1) smeshes designed for use with karma (2) HighDetailOnly = false in the Karmaparams

==03/21/06==

Yesterday's experiment: Getting player to display on camera-texture-clients in single player mode.

Success: Not easily feasible as far as I can tell. Pfhoenix actually gave me a useful hint as to where to look to try to make this work, and managed to simultaneously educate me as well.  

Today's first experiment: Download a couple of useful LWO files from turbosquid, and try and import them.  

Success: For some reason my UEd doesn't import LWO files.  The only file format supported for SMesh in is 3DS apparently.  

Figured out the Karma stuff, at least to an initial degree.  woot.  Now, must find a way to get karma collision information on all the existing models in the game :-S  i bet that's gonna be a task!

==03/22/06==

w00tness.  Severed Karma Heads!  with baseball bats, golf clubs, and shovels as our primary weapons, i can see a definite severed zombie head soccer type game in the near future.  Just need to make a gametype and some GoalVolumes. 

Now, is it possible to make Karma objects actually deal properly with hitting a player?  Or is that because the player isn't drawn in single player, that a karma object can fall right through your head, and land at your feet, and you'll suddenly be walking on it?  i know that a moving normal actor will not affect a karma actor that is at rest, so that will be an interesting thing to attempt to simulate.  I heard of someone on here doing it by spawning a karma actor and attaching it to the player pawn, but i'm curious as to if it stayed attached where it was placed, or if it started simulating.. and how would i make an invisible karma actor, anyway?  well, i guess they are already invisible if you don't give them a smesh.. hmm.. *thinks*  any thoughts?

eh, n/m, that was waaaaay easier than i thought.  In the Pawn's bump(), have it KApplyImpulse to any karma actors that it comes in contact with.  not difficult at all.  i probably need some sort of foot weapon, to come from underneath it though to get it some lift.
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3139</id>
      <timestamp>2007-01-24T04:36:38Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>What does &quot;Received invalid actor class&quot; and &quot;Broken&quot; mean in the logs?</comment>
      <text xml:space="preserve">===1/24/07===

Anyone know what this means?

Warning: Received invalid actor class 124 , 0

Warning: Received invalid actor class 126 , 0

Warning: Received invalid actor class 127 , 0

Warning: Received invalid actor class 128 , 0

Warning: Received invalid actor class 129 , 0

Warning: Received invalid actor class 130 , 0

Warning: Broken 46 , 0

Warning: Broken 124 , 0

Warning: Broken 46 , 0

Warning: Broken 46 , 0

Warning: Broken 46 , 0

===12/21/06===

Second version (1.1) of my BladeIN/DM/CTF gametypes for Land of the Dead has been released! And it made front page news on ModDB! w00t!

===11/29/06===

Wow, I forgot about my page here.  Well, both of my mods have entries on ModDB.. so, search ModDB for &quot;Land of the Dead&quot; for a game name, and you'll find my stuff :)

===05/30/06===

Wow, I've been working so much on DeadAwake that I forgot to actually come over here and write.  Though I really haven't been doing much coding, lately.  We need to get the levels that are built into a beautiful shape, so I'm helping with that.  Learning to model (some things have come out surprisingly well, and some things have come out very very surprisingly horrible).. and I've learned quite a bit about some shortcuts to use in the editor that I never learned during reading all the tutorials.. maybe one day I won't be so horrible at actually building geometry..  

===05/01/06===

Happy May!  All month long is my birthday! :D

Today's early morning revelation: BeamEmitters are teh evil.  2 dimensional objects in 3-d space.  Every use of them I've seen thus far looks like what happens with the monsters in Duke 3d.  Apparently xEmitters are supposed to be far more useful, but I don't have those.  And after the experiences I've had with fixing DE's Uscript, I'm not certain I ever want to mess with something they've had their hands in again.  I wanted to play with the &quot;TrailEmitter&quot;, I do have a UC code for it, and it does appear to be compiled into my Engine.u , but Ued can't find it when i bring up the list of emitters to play with under Emitter properties.  So, that's no fun.  I still have yet to look at this MeshEmitter thingee, but perhaps I will when I get around to making some nice gibs.  This game needs gibs.  Big time.  All we have right now are limbs that fall off, and exploding heads.  Need more gore.  Zombies are gory, and gross.  We need more.  

===04/28/06===

Woo! My first major mod is released.  A gametype addition based on the [[Legacy:Land Of The Dead|Land of the Dead]] [[Legacy:Invasion|Invasion]] game type, which adds support for fully functioning interaction with the player (previously, Level.Game.Broadcast and PlayerController.ClientMessage had no function, since there was no support for them in the HUD class), and a ton of options for server control over the Invasion options that are normally left to the level designers.  Of course, had I known more about UScript when I started working on it, I would've made it extend the standard game, and then built DM, CTF, and IN gametypes on top of it, so that everyone could use it ... but by the time I realised I should've done that, I was pretty much to the &quot;done&quot; phase, about a month ago, and since then i've been squashing the little annoying critter bugs that showed up.

Does this now make me somewhat of an accomplished coder? :D

'''Guest:''' yep, it means from now on you can't write anymore code because you have to spend all your time answering all our annoying questions :-)

===04/27/06===

Aha! After I was writing the diatribe below for today, I read my previous entry about the rockets not doing karma appropriately, and suddenly it occured to me.  If I'm throwing a rocket blast at the base of a bunch of trashcans, Visible* iterator won't contact with the second row of trash cans, because there are static meshes blocking visibility from the point of impact.  Mediocre solution: use CollidingActors for HurtRadius() instead of VisibleCollidingActors().  

Unfortunatly, this gives us a new problem: how to avoid hitting things on the opposite side of a wall, or floor/ceiling ?  I saw some things somewhere in the [[Legacy:Collision|Collision]] section that might be useful for that, although the math involved on it is currently beyond my recollection (ah, the years that have gone by since school...) .. however, I may be able to get away with simply checking to see if the hit actor is in the same zone as the explosion, and hopefully we wouldn't end up with any noticeable problems there, as long as the levels are reasonably zoned.

Spent the last day and a half re-implementing a flame thrower mod, and the results are fairly satisfying.  It feels to me like it's going to have a ton of tuning work to get it down perfect for damage rate, and things like that.  Took me a long time to get it so that we weren't spawning 2 fire objects per second, and to modify the fire scaling code that I had built using Vital's PMT as an inspiration and base for, so that it wouldn't absolutely totally suck down CPU.  It's still pretty intensive, as it would appear that Radius iterators do not deal in collision area, but only in point locations ..  if i could work in collision area, i could increase the collision size of the fire emitter as we increase the area that the emitter is emitting within, and it would become more efficient, and probably better on the visuals too.   

Of course, along with this, I screwed together some more emitter work, learned more about various emitter settings, and managed to tweak out the rocket launcher smoke trails so that they don't look quite so ugly as they did before.   Now, if only I could figure out why they have a green glow on their outer radius, i'd be about 99% done with that piece of work.  

On the bright side, we're down to somewhere around 5 known bugs that deal directly with the code that I've implemented so far, a handful of design problems in Epic or Digital Extreme's code, and all the bugs that I knew of in the original game that don't (a) involve the aforementioned design problems or (b) involve an object that was never designed to work in netplay, that shockingly, doesn't work in netplay are fixed.  

===04/24/06===

Well, I've found an absolutely fundamental flaw in the UT base code for dealing with Projectiles.  I didn't bother to check and see if this is still the same in 2k4, but it appears to be how it works in 2k3 as well as the standard Projectile base code, and LOTD.  

Here's a conversation that I had with someone on my messenger, that describes it:

Eric: that's because the way projectiles work in UT, is that a projectile doesn't actually do damage.. it explodes, and does damage

jason: interesting

Eric: so, it does damage to a radius around where it hits.  now, this doesn't take into account things that are visible in the world, it takes into account the actual Location of an item

Eric: the Location of an item is normally somewhere close to it's center.

Eric: so, it would do damage to the center of something, from the location at which it hit.

jason: ah

Eric: so, pointing a shotgun at it's skull, the explosion of the bullets would rip it's legs off, because the explosion would be affecting an angle straight down from the point of impact

jason: and you fixed this how?

Eric: by making projectiles do damage to what they hit where they hit, like trace bullets do

===04/15/06===

Well, I did not win a trip to Vegas today.  Better luck next time.

Today's adventure was attempting to fix the FastWeaponSwitch/FastReload bug.  Unless someone has some sort of bright idea on how to fix it the -proper- way (and no, i don't mind overloading an assload of code to do it, but i'd prefer not to re-write the entire goshdarned inventory system!) I think i'm going to let that one pass us by.  It does at least, after overriding quite a bit of code, manage to notify the weapon that is being switched from that it needs to be PutDown(). The -proper- way would be to actually play the DeSelect animation. However, without rigging Select/DeSelect to timers and all sorts of nasty stuff, I don't see much of a way to do that. :|

===04/12/06===

Things are progressing pretty nicely.  I've figured out a bit about [[Legacy:BeamEmitter|BeamEmitter]]s .. started in on [[Legacy:MeshEmitter|MeshEmitter]]s, but their very strange behavior compared to Mesh and [[Legacy:SpriteEmitter|SpriteEmitter]] was baffling enough for me to move on to other things I'd been wanting to tackle.

Namely, the fact that projectile explosions do not impart Karma impulses.  I figured a simple override of Explode(), add some KAddImpulse() goodness, and i'd be all set.  Not so.

First, we end up finding that we need to create our own HurtRadius function to be called instead of Actor::HurtRadius().  OK, we override that, override BlowUp() to call our new one.. throw some KAddImpulse() goodness in, and.. nothing. Increase the blast radius to around double the normal amount, to see what's going on ..  I'm throwing these explosive devices at a pile of KActors, you see, and this time, I get the one that I hit moving (expected), along with one about a foot away from it, even though there were three others in the way first.  Huh?

As I increase the size of the radius, objects farther away start getting Impulses, but objects closer stop.  Apparently VisibleCollidingActors with a Radius specified doesn't actually give you a radius, it operates in the circumference of the circle defined by the radius from the blast.  So, I move to RadiusActors.  Same result.  I move the blast radius to equal close to the area of the room.  I shoot at the center, and I hit one object that's near a wall.. everything else, nada.  

This engine is so full of things that so desperately appear to me to be bugs, I can't believe that it actually was sold to other people in the condition that it is in.  Either that, or i'm totally missing something incredibly obvious. 

===04/06/06===

I wish there were an &quot;Edit This Page&quot; link on the top, as well as the bottom, now that this page is large :)

I've spent the last couple days playing with menus, and emitters.  I've never looked at the original Unreal code, and hardly at any of the newer UT2k3 or 2k4 code except for some very specific low-levelish things, so I don't know how they do their menus, but.. inspired by the original Unreal's amazing tech demo display when you loaded it's main menu, I decided that maybe having something showing instead of just a static background for the menu would be a cool thing.  So, I spent some time farking around with the main menu, built a transparent and animated texture for the background of the main menu, and found that after closing all the other menus (why does Unreal open everything that looks like a menu, then use page flipping between them? is this a trick from 1998 to make things appear faster?) i had an actual LEVEL sticking through all that muck.  So, I threw in some zombies, and some of the neat effects that i've been working on, and coded up some camera movement stuff.  The other guys thought it was way cool :)

Also, as I've found [[Legacy:Emitter|Emitter]]s to be incredible pains in the butt, I thought I'd share a little bit of my work with them with the rest of the community here, and maybe I can inspire others to share some of theirs as well. 

 [[Legacy:EricBlade/Emitters|EricBlade/Emitters]]
 

===3/30/06===

Replicating Karma sucks.  The simulations are so radically different from each other on different machines, that it seems completely impossible that the server and clients could be using the same input data, unless the Karma system involves an assload of randomness.  Seriously.  Create a ball.  Put it in a room with a few player starts, join 3 people into the game.  Replicate the kicking of the ball, and watch as all 3 clients, plus the server, have the ball run entirely different simulations.  It's horrible.  Once you start replicating the Karma state from the server, to the clients, then you have something that moves in vaguely the same direction, but at about a quarter the speed it normally would, and it's constantly flipping back and forth between a couple of frames of animation, as it does it.  

wow, we need a/some modeler(s), and textures.  The textures that came with LOTD are ok, but 256x256 just doesn't seem to give the quality that i'm looking for.  I dumped in a couple of much higher quality textures, and they just look incredible.  Unfortunatly, the digital camera here is not so high a quality, it's one of the old Sony ones that uses a damn floppy disk for storage.  Not sure what it's resolution is, but it's probably not good.  So, I guess I need to learn how to make something look good in photoshop for Tiling purposes.  I've got a couple awesome surfaces, but they don't tile very well right now :(

DeadAwake will definitely have a lot more blood than the original game.  We've got some very awesome blood splats for use in Projectors, and such.  Hopefully I can figure out some ways of modding the stock emitters that came with the game, as well, to improve the blood effects.  Zombie games need lots of blood, right? Also, I need to look into how the corpses were done in the original game, and improve upon that, too.  In a zombie outbreak, there'd be a lot more corpses that didn't get turned, I'd expect.. I'm thinking that instead of using a pawn that is stuck in a 1 frame animation (i think that's how it's done for the dead bodies in the game), it might be better to just throw in ragdolls .. maybe?  I can't think of any other Engine games that would have corpses placed haphazardly on a level, so maybe that wouldn't be the way to do it.  hmm.

===3/26/06===

Well, all that stuff is settled and taken care of.  Now, I've moved onto [[Legacy:WeatherEffect|WeatherEffect]]. Mostly have it working, all zoned off and pretty, and good stuff here.  We've got some kick ass rain happening on a way souped up version of the original CH01 single player level (Jack's House) that came with the game.   Now, the next interesting question, and I'd appreciate it if anyone might have any insight:

How do scale an Emitter's output, so I don't kill performance on slower computers?

This works for placed Emitters:

&lt;uscript&gt;
function PostBeginPlay() {
    Emitters[0].MaxActiveParticles *= Level.Game.EmitterDetail;
}
&lt;/uscript&gt;

(obviously it's not exactly like that, but that's the meat of it)

However, it only works for emitters placed in the level.  Emitters spawned within the game (such as from the EnableWeatherEffects() functions), it has absolutely no effect on.  To make it affect those, I need to set it on a Timer.  This does decrease the number of

particles, however it leaves us with a bunch of loose particles hanging in mid-air, since the emitter has already started.  Setting

bDisabled = true, then running the timer, then setting bDisabled = false, results in the Emitter returning to it's original settings.  (I imagine that MaxActiveParticles is reset by the function that restarts the emitter) oooh. That gives me a thought.  Maybe bDisabled = true, setTimer(0.1), in the timer do bDisabled = false; then do the MaxActiveParticles.. maybe it won't have a chance to spawn all the spare ones before it gets throttled.  

Nope, that doesn't do it.  

Also, for the placed emitters, would it be better to have several small emitters placed at like windows and doors, or just have one big emitter around the entire house?  I've currently got one emitter, with a SphereRange=(Min=1200,Max=1200), which seems like that would be better performing than having several small emitters.  

===3/16/06===

OK, I've spent the last day and a half trying to figure out just what the hell went wrong in my custom Decoration class.  I don't override any code in the base, except to record takedamage() in my debug setup. (or at least i didn't, when it mysteriously stopped working)  As far as I can remember, it stopped working as I was working on getting sane defaultproperties, as the defaults for Decoration have virtually everything turned off for some reason.   Here's what happens:

I load a level with a nice Decoration in it (in my test case, it's an ATM Machine, although i initially found it had stopped working with a bookcase and a coffee table). I go running full tilt into the ATM machine, and *poof* it disappears.  

I reset all the default properties back to normal, recreated it, reloaded the level, and exact same thing.

Here are my default properties, with all the ones that i had changed before the issue started commented out:

      StaticMesh     = StaticMesh'DOTZSIndustrial.Outdoor.WoodenBox'

	DrawType       = DT_StaticMesh

	//bBlockActors   = true

	//bBlockKarma    = true

	//bBlockPlayers  = true

	//bCollideActors = true

	//bProjTarget    = true

	bStatic        = false

	bStasis        = false

	//bDamageable    = true

	//bPushable      = true

	//PushSound      = Sound'DOTZXActionObjects.Crate.CratePush'

	//FragType       = class'Engine.Fragment'

	//FragSkin       = Texture'SpecialFX.Particles.rockchunks02'

I have now overridden every function in Decoration, along with a few in Actor, so that I can figure out what the heck the chain of execution is (it really pisses me off that this engine has no apparent way to actually just get a text string of the current execution chain, however it sure can give it to you when you breathe too hard and crash the editor!).  Here's what's happening:
  Bump(mypawn) is getting called 4 times
  FellOutOfWorld() is called
  Destroy() then
  Destroyed()

 w.t.f?

Yay, Figured it out.  It was bCollideWorld.  Seems to be an editor issue with this, though, in that if we build all with a decoration with bCollideWorld turned on, the editor takes a trip and crashes.

==03/19/06==
 

Anyone versed in Karma?

Is it possible, that Karma might actually be disabled at the engine level? 

Just for grins, I wanted an object that I could just kick around, like the computers in Postal 2.. but in Land of the Dead.
 

So, I pull out my Postal 2 resources, load up the editor, and take a look at the computer in the RWS office.  Looks like it's a &quot;KActor&quot;, pretty much all default properties (looks like RWS may have added some extra stuff to KActor), so I go back to LOTD-Ed, and load up my test level with all my test stuff in it, and place a KActor, using the static mesh of, a hanging light.  Put the light just off the

ceiling, start it up, run into it, and bounce right off, no affect.  It's acting like PHYS_None.  

Now, can someone correct me if I'm wrong here:
 

If I give something a nice set of Karma properties (like KActor defaults to), set it's default physics to PHYS_KARMA, and set KStartsEnabled = true, and place it in the middle of open space, the first thing it should do, is fall straight to the nearest floor/other solid object?  Right? 

I do this, and it just sits there just like any other object placed in the middle of space with phys_none.  
 
 Ugh?

'''SuperApe:''' Wish I was more competent with Karma, but isn't there a KWake() function that wakes up Karma objects? (evidentally only after it has come to rest, like on the floor)  This from [[Legacy:Karma Functions And Events|Karma Functions And Events]]:
; native final function KWake(); : &quot;Wakes up&quot; the actor. This causes the Karma physics to begin simulating after the object has been deemed to be &quot;at rest.&quot;

'''EricBlade:''' thanks for the help, pretty sure that's not it,though.  The object was just sitting there, floating in mid air, even with KStartsEnabled on, even when i shot it, or ran into it with my pawn :(

'''SuperApe:''' I only mention it because &quot;floating in mid air&quot;, to me, doesn't seem like the Karma object ever came to rest.

'''EricBlade:''' Not even sure what the heck I'd do with that.. subclass kactor, and throw in a KWake in the PostBeginPlay?

'''SuperApe:''' Perhaps just try it on the floor first.

'''EricBlade:''' woot woot, i needed two things, apparently.  (1) smeshes designed for use with karma (2) HighDetailOnly = false in the Karmaparams

==03/21/06==

Yesterday's experiment: Getting player to display on camera-texture-clients in single player mode.

Success: Not easily feasible as far as I can tell. Pfhoenix actually gave me a useful hint as to where to look to try to make this work, and managed to simultaneously educate me as well.  

Today's first experiment: Download a couple of useful LWO files from turbosquid, and try and import them.  

Success: For some reason my UEd doesn't import LWO files.  The only file format supported for SMesh in is 3DS apparently.  

Figured out the Karma stuff, at least to an initial degree.  woot.  Now, must find a way to get karma collision information on all the existing models in the game :-S  i bet that's gonna be a task!

==03/22/06==

w00tness.  Severed Karma Heads!  with baseball bats, golf clubs, and shovels as our primary weapons, i can see a definite severed zombie head soccer type game in the near future.  Just need to make a gametype and some GoalVolumes. 

Now, is it possible to make Karma objects actually deal properly with hitting a player?  Or is that because the player isn't drawn in single player, that a karma object can fall right through your head, and land at your feet, and you'll suddenly be walking on it?  i know that a moving normal actor will not affect a karma actor that is at rest, so that will be an interesting thing to attempt to simulate.  I heard of someone on here doing it by spawning a karma actor and attaching it to the player pawn, but i'm curious as to if it stayed attached where it was placed, or if it started simulating.. and how would i make an invisible karma actor, anyway?  well, i guess they are already invisible if you don't give them a smesh.. hmm.. *thinks*  any thoughts?

eh, n/m, that was waaaaay easier than i thought.  In the Pawn's bump(), have it KApplyImpulse to any karma actors that it comes in contact with.  not difficult at all.  i probably need some sort of foot weapon, to come from underneath it though to get it some lift.
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EricBlade/Emitters</title>
    <id>1212</id>
    <revision>
      <id>3141</id>
      <timestamp>2006-04-06T15:15:56Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>Rain and Fog</comment>
      <text xml:space="preserve">I've made some pretty neat looking weather emitters, and wanted to share them with everyone, since they did take me quite a while of toying with the parameters (even with guidance from UDN and Unrealwiki, the Rain one took me most of a day to tweak out).. I think it'd be really awesome if others wanted to share some of their emitter codes as well, as this is practically an arcane science, especially if you're totally new to this sort of thing.. (before working with [[Legacy:Land Of The Dead|Land of the Dead]] all my game experience has been in text-based games, both MUD and Web) 

===Rain===

&lt;uscript&gt;
class WeatherRain extends Emitter;

DefaultProperties
{
	bStatic = false
	bNoDelete = false
	 Begin Object Class=SpriteEmitter Name=RainEmitter0
	 	StartVelocityRange=(Z=(Min=-25000,Max=-25000))
	 	LifeTimeRange=(Min=0.0175,Max=0.0175)
	 	MaxParticles=400
	 	UseDirectionAs=PTDU_Up
	 	StartSizeRange=(X=(Min=0.1,Max=1.0),Y=(Min=10,Max=30))
	 	StartLocationRange=(X=(Min=-250,Max=250),Y=(Min=-250,Max=250),Z=(Min=300,Max=400))
	 	UseCollision=True
	 	DampingFactorRange=(X=(Min=10000,Max=10000),Y=(Min=10000,Max=10000),Z=(Min=10000,Max=10000))
	 	AcceptsProjectors=True
	 	MaxCollisions=(Min=1,Max=1)
	 	Texture=Texture'DATextures.Weather.Rain'
            Name=&quot;RainEmitter0&quot;
	 End Object
	 Emitters(0)=SpriteEmitter'UZGEffects.WeatherRain.RainEmitter0'
	 AmbientSound=Sound'DASounds.Environment.Rain'
	 SoundVolume=148
}
&lt;/uscript&gt;

For the Rain example, the texture is something that looks vaguely like a raindrop, and it has an ambientsound attached that sounds like a slow rainfall.  This is not a downpour type of rain, with a 400 particle maximum, it runs fairly smoothly on my 2ghz pc, actually up to around 900 or so particles before i really notice any serious degradation.  Of course more intensive games like UT2k4 would probably be harder hit, but if you're running that, you've probably got better hardware than I do :)  I use this with a special [[Legacy:WeatherEffect|WeatherEffect]] actor that attaches the emitter to the player, so that you don't have to cover the entire level with the effect.  I think it looks pretty stunning.  

===Fog===

&lt;uscript&gt;
class WeatherFog extends Emitter;

DefaultProperties
{
	bStatic = false
	bNoDelete = false
	 Begin Object Class=SpriteEmitter Name=FogEmitter0
	 	FadeIn=True
	 	FadeInEndTime=10
	 	FadeOut=True
	 	FadeOutStartTime=12
	 	MaxParticles=40
	 	ResetAfterChange=True
	 	StartLocationRange=(X=(Min=-128,Max=128),Y=(Min=-128,Max=128),Z=(Min=0,Max=0))
	 	AcceptsProjectors=True
	 	SpinParticles=True
	 	StartSizeRange=(X=(Min=128,Max=256),Y=(Min=128,Max=256),Z=(Min=128,Max=256))
	 	AutomaticInitialSpawning=True
	 	DrawStyle=PTDS_Brighten
	 	LifetimeRange=(Min=90,Max=90)
	 	StartVelocityRange=(X=(Min=-20,Max=20),Y=(Min=-10,Max=10),Z=(Min=-1,Max=-10))
	 	WarmupTicksPerSecond=1
	 	RelativeWarmupTime=1
	 	Texture=Texture'DA_Particles1.fog1'
		 Name=&quot;FogEmitter0&quot;
	 End Object
	 Emitters(0)=SpriteEmitter'UZGEffects.WeatherFog.FogEmitter0'
}
&lt;/uscript&gt;

This nifty Fog effect has a few advantages over using the traditional distance fog.  First, which is mentioned in the [[Legacy:Fog|Fog]] page, is that it can swirl and move and drift and such, like real fog normally would, as compared to distance fog  (though distance fog can be used for some pretty scary effects!).. and the second thing, which I like the most about it, is that it's not nearly as uniform as the distance fog .. and the third thing is that it can be used to cover just a certain area (like, in an outdoor area, you could have it just over a lake in the distance) or used at a specific level, to just cover the ground without obscuring everything.  Ground fog can be put to some incredible mood enhancing effects.   I have not managed to get this to work very well with the [[Legacy:WeatherEffect|WeatherEffect]] class yet, as the player moves way too fast for the particles to catch up, but I hope to find a way around that.  Also, this one needs a LOT more tweaking for use in individual areas, than the rain does.  For the rain, you can pretty much just increase the affected area and the number of particles to add more/less, but for the fog, you need to also do that, and mess with the velocities, start location, particles, a lot more to get it to cover the right area without turning it into a complete and total whiteout.

===Discussion===

'''EricBlade:''' I would love for anyone to comment, or add your own tips or codes/settings, the more we all have available, the better we all become :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EricBlade/ZombieZilla</title>
    <id>1211</id>
    <revision>
      <id>3140</id>
      <timestamp>2006-03-31T01:38:46Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>Created</comment>
      <text xml:space="preserve">==ZombieZilla==

Someone asked me to see about making the enemies in [[Legacy:Land Of The Dead|Land of the Dead]] larger, and someone asked me about making them smaller, so I wrote a mutator that does both :) This is a lot more fun than I originally thought it would be, and thought I'd give it out here.  I'd love to hear of anyone implementing it for other games, and would love to see some shots, if anyone bothers :)  

&lt;uscript&gt;
class ZombieZilla extends Mutator;

var config float ZombieScale;
var config bool bRandomScale;

function PostBeginPlay() {
	local int Waves;
	if(ZombieScale == 0 &amp;&amp; bRandomScale == false) ZombieScale = 2.0;
	if(ZombieScale &gt; 1.0 &amp;&amp; bRandomScale == false) Waves = 1;
	else Waves = 10;
	if(Level.Game.Class == class'DOTZGame.DOTZInvasion') {
		log(&quot;ZombieZilla playing on top of regular Invasion Game&quot;);
		DOTZInvasion(Level.Game).InitialWaveSize = Waves;
		DOTZInvasion(Level.Game).WaveSizeIncrement = Waves;
	}
	if(Level.Game.Class == class'BladeIN.BladeIN') {
		log(&quot;ZombieZilla playing on Blade's Invasion Game.. hope this doesn't fuck up your settings!&quot;);
		BladeIN(Level.Game).InitialWaveSize = Waves;
		BladeIN(Level.Game).WaveSizeIncrement = Waves;
		//BladeIN(Level.Game).MaxInPlay = 1;
	}
	// TODO: This causes a failure if the BladeIN package isn't installed.. so,
	// need to find a way to gracefully fail
	SaveConfig();
}
function bool CheckReplacement(Actor what, out byte bSuperRelevant) {
	local ZombiePawnBase x;
	local float zs;
	x = ZombiePawnBase(what);
	if(x != None) {
		if(bRandomScale == true) zs = RandRange(0.75, 1.5);
		else zs = ZombieScale;
	    log(&quot;ZombieZilla: scale=&quot;$zs);

		x.SetCollisionSize(x.default.CollisionRadius * zs, x.default.collisionheight * zs);
		x.SetDrawScale(zs);
		x.SetLocation(x.Location);
		if(zs &gt; 1) x.DiffDamageMultiplier = 0.5;
		else x.DiffDamageMultiplier = 2;
		x.DiffDamageMultiplier = 5;
	}
	return true;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Erik</title>
    <id>1158</id>
    <revision>
      <id>3032</id>
      <timestamp>2003-06-09T00:13:28Z</timestamp>
      <contributor>
        <ip>Erik</ip>
      </contributor>
      <comment>spamproofing, added new email addy</comment>
      <text xml:space="preserve">Hmmm, went and bought [[Legacy:UT2003|UT2003]] just to make mods, so here I am. I suppose eventually I'll put down ... stuff. here. 

For the sake of associativity, [[Legacy:Erik/Developer Journal|Erik/Developer Journal]] is my, well, obviously my developer journal. :)

Contact info

{|

|-
|name
|Erik Greenwald
|-
|email
|erik at smluc dot org&lt;BR&gt;erik at math dot smsu dot edu&lt;BR&gt;erik at opengl2 dot org
|-
|irc
|EFNet, join #opengl, look for ``Erik
|-
|aim
|ErikGreenwald
|-
|yahoo
|ErikGreenwald
|-
|icq
|10544740
|-
|webwaste
|[http://math.smsu.edu/~erik/ http://math.smsu.edu/~erik/]
|}

Codito; Ergo sum. This'll be a list (of lists (of lists (of lists))&lt;ESC&gt;%(darn, one off)%a) of things I've coded, thrown out for the public to run screaming from. 

* Mutators ([[Legacy:Erik/Mutators|Erik/Mutators]])
*; ERegen: rapid regeration, a crude hack of the real regen.
*; Dongs: a disturbing twisted sick mut with a story equally horrifying (adult material... I'll retract linkage it up here if anyone has objections, shoot 'em to erik@smluc.org if you don't want objections made public)
* Projects (bigger than a breadbox, smaller than the engine)
** (pollution to follow)

----

'''EntropicLqd:''' First and foremostly, hello and welcome to the Wiki.  Enjoy your stay here (hopefully it will be a long one).  The best way to be &quot;pseudo-useful&quot; as you put it is to update real pages rather than keep a journal.  If you find an error or something that needs to be clarified (because it's not obvious) then updating that point directly is really really helpful.  Anyway - I'm rambling now.  Have fun.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3033</id>
      <timestamp>2003-05-03T15:08:44Z</timestamp>
      <contributor>
        <ip>Erik</ip>
      </contributor>
      <minor/>
      <comment>typo</comment>
      <text xml:space="preserve">Hmmm, went and bought [[Legacy:UT2003|UT2003]] just to make mods, so here I am. I suppose eventually I'll put down ... stuff. here. 

For the sake of associativity, [[Legacy:Erik/Developer Journal|Erik/Developer Journal]] is my, well, obviously my developer journal. :)

Contact info

{|

|-
|name
|Erik Greenwald
|-
|email
|erik@smluc.org&lt;BR&gt;erik@math.smsu.edu
|-
|irc
|EFNet, join #opengl, look for ``Erik
|-
|aim
|ErikGreenwald
|-
|yahoo
|ErikGreenwald
|-
|icq
|10544740
|-
|webwaste
|[http://math.smsu.edu/~erik/ http://math.smsu.edu/~erik/]
|}

Codito; Ergo sum. This'll be a list (of lists (of lists (of lists))&lt;ESC&gt;%(darn, one off)%a) of things I've coded, thrown out for the public to run screaming from. 

* Mutators ([[Legacy:Erik/Mutators|Erik/Mutators]])
*; ERegen: rapid regeration, a crude hack of the real regen.
*; Dongs: a disturbing twisted sick mut with a story equally horrifying (adult material... I'll retract linkage it up here if anyone has objections, shoot 'em to erik@smluc.org if you don't want objections made public)
* Projects (bigger than a breadbox, smaller than the engine)
** (pollution to follow)

----

'''EntropicLqd:''' First and foremostly, hello and welcome to the Wiki.  Enjoy your stay here (hopefully it will be a long one).  The best way to be &quot;pseudo-useful&quot; as you put it is to update real pages rather than keep a journal.  If you find an error or something that needs to be clarified (because it's not obvious) then updating that point directly is really really helpful.  Anyway - I'm rambling now.  Have fun.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Erik/Developer Journal</title>
    <id>1160</id>
    <revision>
      <id>3036</id>
      <timestamp>2003-10-10T20:50:43Z</timestamp>
      <contributor>
        <ip>Spoon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For sake of associativity: [[Legacy:Erik|Erik]]

; 20030519: Joy, got a nifty gun class working :) wasted a good couple hours goofing off with it... fires projectiles (flak chunks) rapidly (600 rounds per minute) with a 30 round reloadable clip. So much fun to play with... Got the 2225 patch for my linux install... it was so obvious, it took me a while to find out... no hunting the patch on a website, just run the updater. Big issue is that it wigs out bad if try applying it AFTER the epic bonus pack.  :/
; 20030504: Installed the winderz 2225 patch today, and WOOHOO, no cd check! I'm able to put the cd back in the box, the box on the shelf, and unplug my cdrom :) I was about ready to hunt down a 'no-cd' patch for it... I find it kinda suprising that MaxFallSpeed in the xPawn class has the relation it does. One would think that as that value increases, the falling velocity would go up. That is not the case, however; the velocity increases as the number goes DOWN. Imagine my suprise :) Time to code more...
; 20030502: Added a couple mutators to my personal page, they're lame. My modellers are itching for working code to show off their stuff, but refusing to give me placeholder art :( Pisses me off a bit, as we're adding new animations and stuff that don't exist in the ut2k3 models. Kinda difficult coding this, as I have to A) reboot to windows, B) quit dorking around, and C) quit having fun playtesting the changes :) 
; 20030417: Here we go... I'm new to [[Legacy:UT2003|UT2003]] modding, so I'm going slow and careful. The last mod I made was for quake (1), I've been doing plain C and scheme for the most part... SO! I cribbed [[Legacy:Trystan|Trystan]]'s useful stuff from from [[Legacy:Trystan/Developer Journal|Trystan/Developer Journal]] and started spawning my own game type. Today I shoved a map into place and got it to come up as the only map listed for my gametype. As soon as one of my artists gives me a weapon model, I'll look to shove that in as well. As I'm sure people far more knowledgeable than me will peruse, I might use this to ask a few... questions :)
;# I got the model to come up by setting the prefix, then copying the ut2 map into ut2003/Maps/ with the appropriate prefix... is this a necessity, or can I put all my files (.u, .utx, maps, models, etc) in my own subdir? Possibly a single package? no?
;# Is a GameType the best way to do a [[Legacy:Total Conversion|Total Conversion]]?
;# What's the easiest way to add a new weapon and get it 'in game'?
;# Has anyone contacted [[Legacy:Epic Games|Epic Games]] or [[Legacy:Digital Extremes|Digital Extremes]] about getting a linux version of the compiler?

----

'''Vajuras''': About the linux version of the compiler. Yes, someone asked Epic and basically his question went unanwsered :(

'''El Muerte TDS:''': no, I did get a answer. And the answer was that the `ucc make` would add 15 minutes to the total compile time and that it would need some work to get ucc make independed from the editor. Or something, lemme lookup the email.

Here is what Ryan ([[Legacy:Icculus|icculus]]) replied:

{{innerbox| ucc make is broken at the moment, the rest is untested, and it adds 15 minutes to the build time to include it.

 It should be there in the future, but it's low priority.

}}

'''Erik''': I got in touch with Ryan this morning via email, he responded suprisingly quickly. It's low priority and without timetable, but on his list, as it annoys him :) Hopefully he'll happen across it soon, I so despise windows...

'''Spoon''': Just a note, in case you didn't know. UCC.EXE works well under Wine.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3037</id>
      <timestamp>2003-08-05T09:48:16Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">For sake of associativity: [[Legacy:Erik|Erik]]

; 20030519: Joy, got a nifty gun class working :) wasted a good couple hours goofing off with it... fires projectiles (flak chunks) rapidly (600 rounds per minute) with a 30 round reloadable clip. So much fun to play with... Got the 2225 patch for my linux install... it was so obvious, it took me a while to find out... no hunting the patch on a website, just run the updater. Big issue is that it wigs out bad if try applying it AFTER the epic bonus pack.  :/
; 20030504: Installed the winderz 2225 patch today, and WOOHOO, no cd check! I'm able to put the cd back in the box, the box on the shelf, and unplug my cdrom :) I was about ready to hunt down a 'no-cd' patch for it... I find it kinda suprising that MaxFallSpeed in the xPawn class has the relation it does. One would think that as that value increases, the falling velocity would go up. That is not the case, however; the velocity increases as the number goes DOWN. Imagine my suprise :) Time to code more...
; 20030502: Added a couple mutators to my personal page, they're lame. My modellers are itching for working code to show off their stuff, but refusing to give me placeholder art :( Pisses me off a bit, as we're adding new animations and stuff that don't exist in the ut2k3 models. Kinda difficult coding this, as I have to A) reboot to windows, B) quit dorking around, and C) quit having fun playtesting the changes :) 
; 20030417: Here we go... I'm new to [[Legacy:UT2003|UT2003]] modding, so I'm going slow and careful. The last mod I made was for quake (1), I've been doing plain C and scheme for the most part... SO! I cribbed [[Legacy:Trystan|Trystan]]'s useful stuff from from [[Legacy:Trystan/Developer Journal|Trystan/Developer Journal]] and started spawning my own game type. Today I shoved a map into place and got it to come up as the only map listed for my gametype. As soon as one of my artists gives me a weapon model, I'll look to shove that in as well. As I'm sure people far more knowledgeable than me will peruse, I might use this to ask a few... questions :)
;# I got the model to come up by setting the prefix, then copying the ut2 map into ut2003/Maps/ with the appropriate prefix... is this a necessity, or can I put all my files (.u, .utx, maps, models, etc) in my own subdir? Possibly a single package? no?
;# Is a GameType the best way to do a [[Legacy:Total Conversion|Total Conversion]]?
;# What's the easiest way to add a new weapon and get it 'in game'?
;# Has anyone contacted [[Legacy:Epic Games|Epic Games]] or [[Legacy:Digital Extremes|Digital Extremes]] about getting a linux version of the compiler?

----

'''Vajuras''': About the linux version of the compiler. Yes, someone asked Epic and basically his question went unanwsered :(

'''El Muerte TDS:''': no, I did get a answer. And the answer was that the `ucc make` would add 15 minutes to the total compile time and that it would need some work to get ucc make independed from the editor. Or something, lemme lookup the email.

Here is what Ryan ([[Legacy:Icculus|icculus]]) replied:

{{innerbox| ucc make is broken at the moment, the rest is untested, and it adds 15 minutes to the build time to include it.

 It should be there in the future, but it's low priority.

}}

'''Erik''': I got in touch with Ryan this morning via email, he responded suprisingly quickly. It's low priority and without timetable, but on his list, as it annoys him :) Hopefully he'll happen across it soon, I so despise windows...

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Erik/Mutators</title>
    <id>1159</id>
    <revision>
      <id>3034</id>
      <timestamp>2003-05-03T15:06:31Z</timestamp>
      <contributor>
        <ip>Erik</ip>
      </contributor>
      <comment>Added details and links for a mutator</comment>
      <text xml:space="preserve">Mutators!

I'm a UNIX geek, so my approach to developing is a little different. I like to develop on [http://www.freebsd.org/ FreeBSD] and [http://www.sun.com Solaris] (occasionally [http://www.debian.org linux]) using [http://www.vim.org gvim/vim] and a shell (makefiles, sometimes automake, things like lex, yacc, scripts to generate code, etc). If you open a file and see it's one line with black boxes or something where there should be line breaks, it's because that's a UNIX style text file (\n instead of \r\n), try opening it in another editor. The Makefiles are crude and meant to run in [http://sources.redhat.com/cygwin Cygwin]. Maybe some day I'll be able to compile mods and mutators in linux and/or bsd....

* ERegen
** Regenerates quickly and smoothly. Has variables for how often to update and how many points per second that can be tweaked (in the source). This is a really basic thing, I used [Regen_Mutator] (utute1) and started poking. 
** The .u and .int files are available in tarball format at [http://math.smsu.edu/~erik/files/ut2003/MutERegen.tar.gz http://math.smsu.edu/~erik/files/ut2003/MutERegen.tar.gz]. Untar into your ut2003/ directory.
** Source is available in tarball format at [http://math.smsu.edu/~erik/files/ut2003/MutERegen.src.tar.gz http://math.smsu.edu/~erik/files/ut2003/MutERegen.src.tar.gz]. 
* Dongs
** The premise is so disturbing, I feel it may be necessary to give the story of this mutators inception. During a discussion of weapons for a 'serious' mod, Nick was getting upset and said something along the lines of 'why not put purple dildos in?'... So in every following weapon related discussion, I'd quip up and say &quot;and a dildo... it has to be purple...&quot; Sooo, sever rolled up a model and I did a weapon mod based off of the biorifle. There're some things I'd like to be different, but it's not worth the time and effort.
** The .u and .int files are available in tarball format at [http://math.smsu.edu/~erik/files/ut2003/Dongs-0.0.tar.gz http://math.smsu.edu/~erik/files/ut2003/Dongs-0.0.tar.gz] (also available as .zip, just change the &quot;.tar.gz&quot; to &quot;.zip&quot; in the url). Untar into your ut2003/ directory.
** Source is available in tarball format at [http://math.smsu.edu/~erik/files/ut2003/Dongs-0.0.src.tar.gz http://math.smsu.edu/~erik/files/ut2003/Dongs-0.0.src.tar.gz] (also available as .zip, see above).</text>
    </revision>
    <revision>
      <id>3035</id>
      <timestamp>2003-05-03T14:43:12Z</timestamp>
      <contributor>
        <ip>Erik</ip>
      </contributor>
      <comment>some initial data</comment>
      <text xml:space="preserve">Mutators!

I'm a UNIX geek, so my approach to developing is a little different. I like to develop on [http://www.freebsd.org/ FreeBSD] and [http://www.sun.com Solaris] (occasionally [http://www.debian.org linux]) using [http://www.vim.org gvim/vim] and a shell (makefiles, sometimes automake, things like lex, yacc, scripts to generate code, etc). If you open a file and see it's one line with black boxes or something where there should be line breaks, it's because that's a UNIX style text file (\n instead of \r\n), try opening it in another editor. The Makefiles are crude and meant to run in [http://sources.redhat.com/cygwin Cygwin]. Maybe some day I'll be able to compile mods and mutators in linux and/or bsd....

* ERegen
** Regenerates quickly and smoothly. Has variables for how often to update and how many points per second that can be tweaked (in the source). This is a really basic thing, I used [Regen_Mutator] (utute1) and started poking. 
** The .u and .int files are available in tarball format at [http://math.smsu.edu/~erik/files/ut2003/MutERegen.tar.gz http://math.smsu.edu/~erik/files/ut2003/MutERegen.tar.gz]. Untar into your ut2003/ directory.
** Source is available in tarball format at [http://math.smsu.edu/~erik/files/ut2003/MutERegen.src.tar.gz http://math.smsu.edu/~erik/files/ut2003/MutERegen.src.tar.gz]. 
* Dongs
** (data later)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Erika</title>
    <id>1168</id>
    <revision>
      <id>3054</id>
      <timestamp>2005-11-13T22:33:00Z</timestamp>
      <contributor>
        <ip>Erika</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well its been a while since I've done anything with the wiki. I've been mapping for UT since its impossible for me to map using UED3 and MY computer. I've also been playing a lot of Unreal coop, and might as well start mapping and coding for the original that started it all. When a certain friend of mine gets a new graphics card/proc, he says he'll give me his old stuff, though it won't be fore a while. Look forward to finally reaching the specs to use UED3 and UT2004 properly!

----

'''Tarquin:''' Hello. Welcome to Unreal Wiki :)</text>
    </revision>
    <revision>
      <id>3055</id>
      <timestamp>2005-05-28T20:05:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Erika's Atelier - Website with Mutators and Stuff===

http://erika.sixwinter.com/

====On to bigger better things!====

Well now I have UT2k4 and am making mutators like mad, however, I seem to be stumbling apon an error. Right now I'm making a Turret Arena mutator, and being the dunce I am at Unreal Script, seem to be coming across a problem

(there was code here)

Yay fixed.

----

'''Tarquin:''' Hello. Welcome to Unreal Wiki :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Erika/Rants</title>
    <id>1169</id>
    <revision>
      <id>3056</id>
      <timestamp>2007-08-07T18:59:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">===This Old UT CD Version===

Once apon a time I went to Kids R Us to see if I could find Computer Games there, and suprisingly I found UT sitting there, in it's GOTYe goodness. So I buy it...

A few weeks later, v436 comes out. I download it with my crap 56k. I install it and I'm happy.A few weeks after that, something goes wrong with UT, I uninstall and I forgot to save the patch somewhere... A day later it downloads again, I patch UT and somehow, UT managed to screw itself over again. I download the patch again and patch it, everything is fine, I saved the patch... somewhere...

I go over to my cousin's house and install UT so I can play it from there. My UT disc is still v432. I try to find a server to join and I can't because of the difference in versions. I let the patch download over night. The patch is borken for some reason! I download again and try to patch the game. The game is patched and I'm happy. UT borks up on MY computer. I download the patch again. OH! Wait a second! I have no more modem! I go back to my cousin's house and put the patch on my CD-R. Problem solved.

----

[[:Category:Legacy Rant]]

----

'''Bob_The_Beheader:''' I feel very sorry for you. What a nightmare. :(
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3057</id>
      <timestamp>2005-10-27T16:20:08Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===This Old UT CD Version===

Once apon a time I went to Kids R Us to see if I could find Computer Games there, and suprisingly I found UT sitting there, in it's GOTYe goodness. So I buy it...

A few weeks later, v436 comes out. I download it with my crap 56k. I install it and I'm happy.A few weeks after that, something goes wrong with UT, I uninstall and I forgot to save the patch somewhere... A day later it downloads again, I patch UT and somehow, UT managed to screw itself over again. I download the patch again and patch it, everything is fine, I saved the patch... somewhere...

I go over to my cousin's house and install UT so I can play it from there. My UT disc is still v432. I try to find a server to join and I can't because of the difference in versions. I let the patch download over night. The patch is borken for some reason! I download again and try to patch the game. The game is patched and I'm happy. UT borks up on MY computer. I download the patch again. OH! Wait a second! I have no more modem! I go back to my cousin's house and put the patch on my CD-R. Problem solved.

----

[[:Category:Legacy Rant]]

----

'''Bob_The_Beheader:''' I feel very sorry for you. What a nightmare. :(
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3058</id>
      <timestamp>2007-08-07T14:35:05Z</timestamp>
      <contributor>
        <ip>Tor-or-anonproxy.cryptobitch.de</ip>
      </contributor>
      <comment>*Erika/Rants</comment>
      <text xml:space="preserve">===This Old UT CD Version===

Once apon a time I went to Kids R Us to see if I could find [http://wisetranslations.com/ translation] Computer Games there, and suprisingly I found UT sitting there, in it's GOTYe goodness. So I buy it...

A few weeks later, v436 comes out. I download it with my crap 56k. I install it and I'm happy.A few weeks after that, something goes wrong with UT, I uninstall and I forgot to save the patch somewhere... A day later it downloads again, I patch UT and somehow, UT managed to screw itself over again. I download the patch again and patch it, everything is fine, I saved the patch... somewhere...

I go over to my cousin's house and install UT so I can play it from there. My UT disc is still v432. I try to find a server to join and I can't because of the difference in versions. I let the patch download over night. The patch is borken for some reason! I download again and try to patch the game. The game is patched and I'm happy. UT borks up on MY computer. I download the patch again. OH! Wait a second! I have no more modem! I go back to my cousin's house and put the patch on my CD-R. Problem solved.

----

[[:Category:Legacy Rant]]

----

'''Bob_The_Beheader:''' I feel very sorry for you. What a nightmare. :(
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandBase</title>
    <id>1186</id>
    <revision>
      <id>3086</id>
      <timestamp>2004-10-17T06:06:33Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; ErrandBase (Package: Postal2Game)}}

This object defines an errand. For example, go get some milk from the store on Monday. Some errands have multiple methods of completion which are defined by the [[Legacy:ErrandGoal|ErrandGoal]]s.

==Properties ==

===Main ===
; var() const String UniqueName : Unique errand name so it can be referred to by script and level designers or testers
; var() const bool bInitiallyActive : Whether errand is initially active. Otherwise, gets activated during gameplay. If this is false it won't show up on the dude's &quot;to-do list&quot; until a certain point passes in the game... for example, the dude has goes to pick up his dry cleaning after he's kidnapped by the Rednecks and dressed in the [[Legacy:Gimp Suit|Gimp Suit]].
; var() const name NameTex : Texture to use for errand name
; var() const name LocationTex : (optional) Texture to use for errand location mark
; var() const float LocationX : (optional) X-coordinate on map for errand location
; var() const float LocationY : (optional) Y-coordinate on map for errand location
; var() const name LocationCrossTex : (optional) Texture to use to cross out errand
; var() const float LocationCrossX : (optional) X-coordinate to cross out errand on map
; var() const float LocationCrossY : (optional) Y-coordinate to cross out errand on map
; var() const name IgnoreTag : What actor tags to ignore before/after your completion.
; var() const bool bIgnoreAfterCompletion : If true, ignore IgnoreTag after errand completion, otherwise ignore IgnoreTag until after errand completion
; var() const name DudeStartComment : What the dude says when writing the comment
; var() const name DudeWhereComment : What dude says when he's looking for errand's location
; var() const name DudeFoundComment : What dude says when errand location found and marked
; var() const name DudeCompletedComment : What dude says when errand is complete
; var() editinline array&lt;[[Legacy:ErrandGoal|ErrandGoal]]&gt; Goals : How the errand can be completed

===Hidden ===
; var bool bCompleted : Whether the errand was completed or not
; var bool bActivated : Whether the errand was activated or not
; var bool bPremature : When the errand was completed, you didn't do it in the best manner. (like you robbed the bank instead of waiting in line to cash your check)

==Functions ==
; function bool CheckForValidErrandGoals() : Check to make sure each errand has at least one goal
; function bool CheckForCompletion([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] Another, [[Legacy:Pawn|Pawn]] ActionPawn, [[Legacy:GameState|GameState]] CurGameState, out name CompletionTrigger) : Checks to see if the errand has been completed by so action. If so, returns the name of a trigger to be triggered in CompletionTrigger
; function bool IgnoreThisTag([[Legacy:Actor|Actor]] Other) : Check to ignore this thing by its tag
; function bool CheckForErrandUse([[Legacy:Actor|Actor]] Other) : Check if Other is used by this errand
; function bool IsComplete() : Check if errand is complete
; function SetComplete(bool bPrematureIn) : Set errand as complete
; function bool IsActive() : Check whether errand is activated
; function Activate() : Activate errand
; function AddMyHaters([[Legacy:GameState|GameState]] CurGameState, [[Legacy:P2Player|P2Player]] CurPlayer) : Add the player hate groups for this errand
; function ForceCompletion([[Legacy:GameState|GameState]] CurGameState, [[Legacy:P2Player|P2Player]] CurPlayer) : Force an errand complete for testing
; function ForceUnCompletion([[Legacy:GameState|GameState]] CurGameState) : Force an errand un-complete for testing

==Related Topics ==
* [[Legacy:DayBase|DayBase]]
* [[Legacy:ErrandGoal|ErrandGoal]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3087</id>
      <timestamp>2004-05-28T01:18:51Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandBase|ErrandBase]]}}

This object defines an errand. For example, go get some milk from the store on Monday. Some errands have multiple methods of completion which are defined by the [[Legacy:ErrandGoal|ErrandGoal]]s.

==Properties ==

===Main ===
; var() const String UniqueName : Unique errand name so it can be referred to by script and level designers or testers
; var() const bool bInitiallyActive : Whether errand is initially active. Otherwise, gets activated during gameplay. If this is false it won't show up on the dude's &quot;to-do list&quot; until a certain point passes in the game... for example, the dude has goes to pick up his dry cleaning after he's kidnapped by the Rednecks and dressed in the [[Legacy:Gimp Suit|Gimp Suit]].
; var() const name NameTex : Texture to use for errand name
; var() const name LocationTex : (optional) Texture to use for errand location mark
; var() const float LocationX : (optional) X-coordinate on map for errand location
; var() const float LocationY : (optional) Y-coordinate on map for errand location
; var() const name LocationCrossTex : (optional) Texture to use to cross out errand
; var() const float LocationCrossX : (optional) X-coordinate to cross out errand on map
; var() const float LocationCrossY : (optional) Y-coordinate to cross out errand on map
; var() const name IgnoreTag : What actor tags to ignore before/after your completion.
; var() const bool bIgnoreAfterCompletion : If true, ignore IgnoreTag after errand completion, otherwise ignore IgnoreTag until after errand completion
; var() const name DudeStartComment : What the dude says when writing the comment
; var() const name DudeWhereComment : What dude says when he's looking for errand's location
; var() const name DudeFoundComment : What dude says when errand location found and marked
; var() const name DudeCompletedComment : What dude says when errand is complete
; var() editinline array&lt;[[Legacy:ErrandGoal|ErrandGoal]]&gt; Goals : How the errand can be completed

===Hidden ===
; var bool bCompleted : Whether the errand was completed or not
; var bool bActivated : Whether the errand was activated or not
; var bool bPremature : When the errand was completed, you didn't do it in the best manner. (like you robbed the bank instead of waiting in line to cash your check)

==Functions ==
; function bool CheckForValidErrandGoals() : Check to make sure each errand has at least one goal
; function bool CheckForCompletion([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] Another, [[Legacy:Pawn|Pawn]] ActionPawn, [[Legacy:GameState|GameState]] CurGameState, out name CompletionTrigger) : Checks to see if the errand has been completed by so action. If so, returns the name of a trigger to be triggered in CompletionTrigger
; function bool IgnoreThisTag([[Legacy:Actor|Actor]] Other) : Check to ignore this thing by its tag
; function bool CheckForErrandUse([[Legacy:Actor|Actor]] Other) : Check if Other is used by this errand
; function bool IsComplete() : Check if errand is complete
; function SetComplete(bool bPrematureIn) : Set errand as complete
; function bool IsActive() : Check whether errand is activated
; function Activate() : Activate errand
; function AddMyHaters([[Legacy:GameState|GameState]] CurGameState, [[Legacy:P2Player|P2Player]] CurPlayer) : Add the player hate groups for this errand
; function ForceCompletion([[Legacy:GameState|GameState]] CurGameState, [[Legacy:P2Player|P2Player]] CurPlayer) : Force an errand complete for testing
; function ForceUnCompletion([[Legacy:GameState|GameState]] CurGameState) : Force an errand un-complete for testing

==Related Topics ==
* [[Legacy:DayBase|DayBase]]
* [[Legacy:ErrandGoal|ErrandGoal]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoal</title>
    <id>1187</id>
    <revision>
      <id>3088</id>
      <timestamp>2004-10-17T06:06:53Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; ErrandGoal (Package: Postal2Game)}}

Defines a goal for an errand.

==Properties ==

===Main ===
; var() name TriggerOnCompletionTag : After the errand is complete, triggers all actors with the matching tag.
; var() name HateClass : After the errand is complete, this set of pawns will hate the player on sight.
; var() name HateDesTex : Texture for the description of the hate group
; var() name HatePicTex : Texture for a picture of the hate group
; var() name HateComment : Sound for dude commenting on hate group.

==Known Subclasses ==
 [[Legacy:ErrandGoal|ErrandGoal]]
 +- [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]]
 |  +- [[Legacy:ErrandGoalGetAmmoMax|ErrandGoalGetAmmoMax]]
 |  +- [[Legacy:ErrandGoalGetInvClassFromPerson|ErrandGoalGetInvClassFromPerson]]
 +- [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]]
 |  +- [[Legacy:ErrandGoalDropOffPickup|ErrandGoalDropOffPickup]]
 +- [[Legacy:ErrandGoalGiveInventory|ErrandGoalGiveInventory]]
 +- [[Legacy:ErrandGoalKillMe|ErrandGoalKillMe]]
 +- [[Legacy:ErrandGoalTag|ErrandGoalTag]]
 +- [[Legacy:ErrandGoalTalkTo|ErrandGoalTalkTo]]
 +- [[Legacy:ErrandGoalTriggeredAction|ErrandGoalTriggeredAction]]
 +- [[Legacy:ErrandGoalUrineQuotaMet|ErrandGoalUrineQuotaMet]]

==Related Topics ==
* [[Legacy:DayBase|DayBase]]
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3089</id>
      <timestamp>2004-05-28T01:33:58Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]]}}

Defines a goal for an errand.

==Properties ==

===Main ===
; var() name TriggerOnCompletionTag : After the errand is complete, triggers all actors with the matching tag.
; var() name HateClass : After the errand is complete, this set of pawns will hate the player on sight.
; var() name HateDesTex : Texture for the description of the hate group
; var() name HatePicTex : Texture for a picture of the hate group
; var() name HateComment : Sound for dude commenting on hate group.

==Known Subclasses ==
 [[Legacy:ErrandGoal|ErrandGoal]]
 +- [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]]
 |  +- [[Legacy:ErrandGoalGetAmmoMax|ErrandGoalGetAmmoMax]]
 |  +- [[Legacy:ErrandGoalGetInvClassFromPerson|ErrandGoalGetInvClassFromPerson]]
 +- [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]]
 |  +- [[Legacy:ErrandGoalDropOffPickup|ErrandGoalDropOffPickup]]
 +- [[Legacy:ErrandGoalGiveInventory|ErrandGoalGiveInventory]]
 +- [[Legacy:ErrandGoalKillMe|ErrandGoalKillMe]]
 +- [[Legacy:ErrandGoalTag|ErrandGoalTag]]
 +- [[Legacy:ErrandGoalTalkTo|ErrandGoalTalkTo]]
 +- [[Legacy:ErrandGoalTriggeredAction|ErrandGoalTriggeredAction]]
 +- [[Legacy:ErrandGoalUrineQuotaMet|ErrandGoalUrineQuotaMet]]

==Related Topics ==
* [[Legacy:DayBase|DayBase]]
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalDropOffPickup</title>
    <id>1192</id>
    <revision>
      <id>3099</id>
      <timestamp>2004-10-17T06:08:51Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]] &gt;&gt; ErrandGoalDropOffPickup (Package: MoreGame)}}

Requires that the dude drop off a particular class of pickup. Example: Return the library book to the drop box on Tuesday.

==Properties ==

===Main ===
; var() Name DropIntoHereTriggerTag : This is the trigger that the pickup the dude is throwing must touch.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3100</id>
      <timestamp>2004-05-28T01:50:30Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]] &gt;&gt; [[Legacy:ErrandGoalDropOffPickup|ErrandGoalDropOffPickup]]}}

Requires that the dude drop off a particular class of pickup.

==Properties ==

===Main ===
; var() Name DropIntoHereTriggerTag : This is the trigger that the pickup the dude is throwing must touch.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3101</id>
      <timestamp>2004-10-17T06:07:28Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]] &gt;&gt; ErrandGoalDropOffPickup (Package: MoreGame)}}

Requires that the dude drop off a particular class of pickup.

==Properties ==

===Main ===
; var() Name DropIntoHereTriggerTag : This is the trigger that the pickup the dude is throwing must touch.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalGetAmmoMax</title>
    <id>1189</id>
    <revision>
      <id>3093</id>
      <timestamp>2004-10-17T06:13:30Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]] &gt;&gt; ErrandGoalGetAmmoMax (Package: MoreGame)}}

Completes the errand when the dude maxes out his ammo for a particular weapon. Example: Dude must fill up his petition clipboard &quot;weapon&quot; with signatures to complete an errand on Tuesday.

==Properties ==

===Main ===
; var() name InvClassName : Weapon class that needs to have its ammo maxed out.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3094</id>
      <timestamp>2004-05-28T01:40:56Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]] &gt;&gt; [[Legacy:ErrandGoalGetAmmoMax|ErrandGoalGetAmmoMax]]}}

Completes the errand when the dude maxes out his ammo for a particular weapon.

==Properties ==

===Main ===
; var() name InvClassName : Weapon class that needs to have its ammo maxed out.

==Related Topics ==

[[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalGetInvClass</title>
    <id>1188</id>
    <revision>
      <id>3090</id>
      <timestamp>2004-10-17T06:13:44Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalGetInvClass}}

Completes the errand by having the dude get a certain class of inventory item into his possession. Not actually used in the game, but is a base class for [[Legacy:ErrandGoalGetInvClassFromPerson|ErrandGoalGetInvClassFromPerson]]. Errands requiring the dude to get a particular item generally use the [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]] goal instead.

==Properties ==

===Main ===
; var() name InvClassName : Inventory class to get.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3091</id>
      <timestamp>2004-05-28T01:38:15Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]]}}

Completes the errand by having the dude get a certain class of inventory item into his possession.

==Properties ==

===Main ===
; var() name InvClassName : Inventory class to get.

==Related Topics ==

[[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3092</id>
      <timestamp>2004-10-17T06:09:33Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalGetInvClass}}

Completes the errand by having the dude get a certain class of inventory item into his possession. Example: Pick up some milk (MilkInv) on Monday.

==Properties ==

===Main ===
; var() name InvClassName : Inventory class to get.

==Related Topics ==

[[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalGetInvClassFromPerson</title>
    <id>1190</id>
    <revision>
      <id>3095</id>
      <timestamp>2004-10-17T06:14:29Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]] &gt;&gt; ErrandGoalGetInvClassFromPerson (Package: MoreGame)}}

Extension of [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]]. Completes the errand by having the dude get a certain class of inventory item from a certain person. Example: Get Gary Coleman's autographed biography on Tuesday, setting off a scene where the police raid the mall and attempt to arrest/kill Gary.

==Properties ==

===Main ===
; var() name TalkToMeTag : If the person you're talking to gives you the inventory item defined by InvClassName, you're done.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3096</id>
      <timestamp>2004-05-28T01:42:33Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetInvClass|ErrandGoalGetInvClass]] &gt;&gt; [[Legacy:ErrandGoalGetInvClassFromPerson|ErrandGoalGetInvClassFromPerson]]}}

Completes the errand by having the dude get a certain class of inventory item from a certain person.

==Properties ==

===Main ===
; var() name TalkToMeTag : If the person you're talking to gives you the inventory item, you're done.

==Related Topics ==

[[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalGetPickup</title>
    <id>1191</id>
    <revision>
      <id>3097</id>
      <timestamp>2004-10-17T06:14:59Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalGetPickup (Package: MoreGame)}}

Requires that the dude get a particular item. Example: Pick up some milk (MilkPickup) on Monday.

==Properties ==

===Main ===
; var() Name PickupClassName : Class of item the dude needs to get.
; var() Name PickupTag: Tag for specific item we want to pick up. If left blank any pickup of the matching class will work.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3098</id>
      <timestamp>2004-05-28T01:48:14Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGetPickup|ErrandGoalGetPickup]]}}

Requires that the dude get a particular item.

==Properties ==

===Main ===
; var() Name PickupClassName : Class of item the dude needs to get.
; var() Name PickupTag: Tag for specific item we want to pick up. If left blank any pickup of the matching class will work

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalGiveInventory</title>
    <id>1193</id>
    <revision>
      <id>3102</id>
      <timestamp>2004-10-17T06:15:49Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalGiveInventory (Package: MoreGame)}}

Errand goal that requires the dude give someone a certain item. Example: Giving your paycheck to the bank teller on Monday triggers the bank robbers cutscene.

==Properties ==

===Main ===
; var() Name InvClassName : Class of item the dude must give away.
; var() Name GiveToMeTag : If this is set, dude must give this item to someone with the matching tag.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3103</id>
      <timestamp>2004-05-28T01:52:47Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalGiveInventory|ErrandGoalGiveInventory]]}}

Errand goal that requires the dude give someone a certain item.

==Properties ==

===Main ===
; var() Name InvClassName : Class of item the dude must give away.
; var() Name GiveToMeTag : If this is set, dude must give this item to someone with the matching tag.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalKillMe</title>
    <id>1194</id>
    <revision>
      <id>3104</id>
      <timestamp>2004-10-17T06:17:20Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalKillMe (Package: MoreGame)}}

When the dude kills a particular person, this errand is complete. Example: If you kill the priest in the confessional, it counts as completing the &quot;confess your sins&quot; errand for Tuesday. (The Islamic Fanatics still raid the church anyway.)

==Properties ==

===Main ===
; var() name KillMeTag : Tag of the person that must die for the errand to complete.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3105</id>
      <timestamp>2004-05-28T01:55:27Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalKillMe|ErrandGoalKillMe]]}}

When the dude kills a particular person, this errand is complete.

==Properties ==

===Main ===
; var() name KillMeTag : Tag of the person that must die for the errand to complete.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalTag</title>
    <id>1195</id>
    <revision>
      <id>3106</id>
      <timestamp>2004-10-17T06:18:52Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalTag (Package: MoreGame)}}

Just checks the actor for a particular tag. This is only used on the voting errand, and activates when the voting screen is finished.

==Properties ==

===Main ===
; var() Name UniqueTag : Tag we care about.

==Related Topics==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3107</id>
      <timestamp>2004-05-28T02:00:00Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalTag|ErrandGoalTag]]}}

Just checks the actor for a particular tag.

'''Kamek:''' This is only used on the voting errand, and activates when the voting screen is finished. Not quite sure how this would work for custom errands. Maybe if you made another &quot;voting&quot; type of errand.

==Properties ==

===Main ===
; var() Name UniqueTag : Tag we care about.

==Related Topics==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalTalkTo</title>
    <id>1196</id>
    <revision>
      <id>3108</id>
      <timestamp>2004-10-17T06:19:33Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalTalkTo}}

Requires the dude to talk/interact with someone. Example: confessing your sins at the church on Tuesday.

==Properties ==

===Main ===
;var() name TalkToMeTag : If the person you're talking to has this tag, you're done

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3109</id>
      <timestamp>2004-05-28T02:02:59Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalTalkTo|ErrandGoalTalkTo]]}}

Requires the dude to talk/interact with someone.

==Properties ==

===Main ===
;var() name TalkToMeTag : If the person you're talking to has this tag, you're done

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalTriggeredAction</title>
    <id>28535</id>
    <revision>
      <id>40236</id>
      <timestamp>2009-11-17T11:04:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ErrandGoalUrineQuotaMet</title>
    <id>1197</id>
    <revision>
      <id>3110</id>
      <timestamp>2004-10-17T06:20:16Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; ErrandGoalUrineQuotaMet (Package: MoreGame)}}

Requires a [[Legacy:UrineBucket|UrineBucket]] to report that the dude has pissed into it. Example: Pissing on your dad's grave on Wednesday.

==Properties ==

===Main ===
; var() name UrineRecorderTag : Tag of actor that says the dude has taken a leak.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3111</id>
      <timestamp>2004-05-28T02:12:44Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:ErrandGoal|ErrandGoal]] &gt;&gt; [[Legacy:ErrandGoalUrineQuotaMet|ErrandGoalUrineQuotaMet]]}}

Requires a [[Legacy:UrineBucket|UrineBucket]] to report that the dude has pissed into it.

==Properties ==

===Main ===
; var() name UrineRecorderTag : Tag of actor that says the dude has taken a leak.

==Related Topics ==
* [[Legacy:ErrandBase|ErrandBase]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Esc</title>
    <id>1129</id>
    <revision>
      <id>2967</id>
      <timestamp>2006-04-07T07:54:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">Gametype mod for Unreal Tournament.  See the [http://www.esconline.org website].

* Current public version: v.5.5.5

See the [[Legacy:Esc/FAQ|Esc/FAQ]]</text>
    </revision>
    <revision>
      <id>2968</id>
      <timestamp>2002-06-09T18:35:47Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Gametype mod for Unreal Tournament.  See the [http://www.esconline.org website].

* Current public version: v.5.5.5

See the [[Legacy:Esc/FAQ|Esc/FAQ]]</text>
    </revision>
    <revision>
      <id>2969</id>
      <timestamp>2006-04-06T21:05:55Z</timestamp>
      <contributor>
        <ip>Nat-7.cat.com</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">Gametype mod for Unreal Tournament.  See the [http://www.esconline.org website].

* Current public version: v.5.5.5

See the [[Legacy:Esc/FAQ|Esc/FAQ]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Esc/FAQ</title>
    <id>1134</id>
    <revision>
      <id>2980</id>
      <timestamp>2007-01-23T06:33:56Z</timestamp>
      <contributor>
        <ip>Rahhal</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{|

|-
|[http://www.esconline.org [[Image:Legacy_EscR.jpeg|]]]
|-
| style=&quot;text-align: right&quot; |http://www.esconline.org
| style=&quot;text-align: right&quot; |Revision 1, 09/06/02
|-
| style=&quot;text-align: right&quot; |Click [http://wiki.beyondunreal.com/wiki/Esc/FAQ here] for the latest version
|-
|
|}

{{innerbox|Here is the up-to-minute latest version of the FAQ for the Esc mod - http://www.esconline.org - the Only Nightclub Mod for Unreal Tournament 2004, and the original Unreal Tournament!   Enjoy!  -[[Legacy:DJPaul|DJPaul]]

}}

&lt;font size +1&gt;'''''Welcome to the Esc FAQ!'''''&lt;/font&gt;

Esc is distributed under the Gnu General Public License. Basically, you can distribute Esc, but you have to include the source or make it available to anyone who wants it. If you modify Esc and distribute it, you need to distribute the source code for your changes as well.

This is a developer's release, which means it's still pretty rough, and a non-technical user may find it difficult to figure out.

----

====Quick Start and Installation ====

To use Esc, you must have a copy of Unreal Tournament 2004.  Make sure Unreal Tournament is patched to the latest version (3339).  Double click the &quot;client&quot;  installer to install Esc.  Always use the Esc shortcut or Start menu to start Esc, since this starts up the EscDaemon which does the music streaming.  Then join a multiplayer server, just like you do in Unreal Tournament 2004.  That's it!

Esc Flagship Server: I've left MIT, so it's sporatic at best.  But you can try 209.6.112.159

To dance, hit the &quot;toggle dance mode&quot; key (default: o).  The camera will switch to an external, third person view, and red arrows should appear on the screen.  You need to hit the given arrow key on the beat of the music&amp;ndash;when the arrow flashes.  Right click to switch to &quot;pointer mode&quot; where you can scroll back the chat, send msgs to people, buy things, etc.

==== Things To Remember =====

Dancing is the ''raison d'être'' for Esc - therefore it helps if you know your 'Toggle Dance Mode' key - this will switch between the standard interface, and the Dance Mode. 

If you wish to dance, are in 'Dance Mode' yet hear no music - you are either downloading the music, or there is no 'MusicSource' near you in the level.  Read the FAQ list for solutions to these problems.

====Starting Your Own Server ====

Their are many reasons you might start an Esc server - perhaps you are hosting your own club online, or perhaps you are just hosting so you can hang out privately with your friends.  There are two ways to start an Esc server - standard method, and advanced.

This is a little more tricky.  You'll need:

* Your own music.  The auto tempo finder needs a strong beat, although you can experiment.
* An Icecast stream, which you can create using:
* Winamp 2.91 or later, or Winamp 5 (but not Winamp 3)  Comes with the server version of Esc, or get it at http://www.winamp.com
* Oddcast plugin for Winamp 2, v. 2.0.5 or later.  You don't need the &quot;LAME encoder dll.&quot;  Comes with the server version of Esc, or get it at http://www.oddsock.org/tools/oddcastv2_wa2
* Icecast2 win32 v. 2.0 from June 18, 2003 (i.e.Icecast2_win32_2.0_06182003_setup.exe) or later.  Comes with the server version of Esc, or get it from http://www.oddsock.org/tools/icecast2/
* A Windows UT2004 server with Esc installed.

1. (First time only) Configure Winamp:
* (optional, only for WinAmp 2) Doublesize winamp: In the main Winamp window (the one with the play, stop, etc. buttons) click on the small D along the left hand side.  That will make the window double size, so unless your computer is running in DOOM resolution, it'll make your life easier.
* Get Winamp to use alt volume control: Bring up the Winamp preferences window, e.g. by hitting CTRL-P.  On the left, under plug-ins, click &quot;output.&quot;  On the right, click &quot;waveOut output,&quot; then click &quot;configure.&quot;  In the window that pops up, in the bottom &quot;volume control&quot; section, make sure &quot;alt. setting method (slow)&quot; is selected.  Then click Ok.  This allows you to turn the WinAmp volume all the way down, but still hear the music in other applications, including Esc.
* Open the oddcast window: In the Winamp preferences window, on the left, under plug-ins, click DSP/Effect.  Click on &quot;oddcast DSP v2.&quot;  The oddcast window pops up.  You can move it somewhere more conveient (like near the rest of winamp) and close the preferences window.
* Configure oddcast: In the oddcast DSP window, click &quot;config.&quot;  The &quot;Edit Config&quot; window pops up.  In &quot;General,&quot; set the Sample Rate to 22050, the Channels to 1, and the Encoder Type to OGG.  In the &quot;Encode&quot; tab, click the &quot;OggVorbis&quot; tab, encoding type &quot;quality,&quot; Quality level 0.  In the Server tab, set ServerType to Icecast2, server = localhost, port = 8000.  Choose an encoder password and remember it.  Mountpoint = /spanky.ogg

2. (First time only) Configure Icecast2:
* Start up Icecast2 and select Configuration-&gt;Edit Configuration.  The only thing you need to change is the &quot;source password.&quot;  Make this the same as the &quot;encoder password&quot; you chose above.  Save and exit.

3. (First time only) Tell Esc where your Icecast2 server is:
* Some day there'll be a way to do this in the Esc menu, but for now, you have to edit a configuration file by hand.  Open up C:\UT2004\Esc\System\Esc.ini, or if that doesn't exist, C:\UT2004\Esc\System\default.ini, and near the bottom you'll see:

[EscMusic.EscMusicSource]

ConfigURL=http://127.0.0.1:8000/spanky.ogg

Change the &quot;127.0.0.1&quot; to the IP address of the machine that your Icecast2 server is running on.  The Icecast2 server can be running on a different machine than your UT server.

4. Start the server
* Start Icecast2 and click &quot;Start Server.&quot;
* Start Winamp, start playing your music, then (in the Oddcast DSP window) click &quot;connect&quot;

Now start up a level.  If it's an Esc level, it will already have a MusicSource and in a few seconds you should see a song name.  If you head to the dance floor, you should hear the music 10 seconds later.  And anyone who joins your game will connect to your Icecast server, and they'll hear it too.

If it's a regular old UT level, you can type &quot;music&quot; in the console to place a music source where you're standing.

===Advanced Server Stuff ===

-If your server is behind a router or firewall, you need to open up the standard UT ports (7777 to 7788 UDP, and maybe 27900 &amp; 27902 TCP as well?) plus the icecast port, 8000 TCP.-

====Credits ====
* DJPaul, aka Paul Gibbs, for all his UnrealScript coding.  He provided more UnrealScript code than anybody else and really put his heart into the project.
* MGanda, aka Marvel, aka Mike Ganda for his sustained energy thruought the project.  He coordinated the artists, created animations, put up with crappy tools, and even wrote two of the songs in this package.  You're a true soldier Mike.
* Ak for the menu background and entry levels.
* Angleheart, aka John, for the Eden and DuskToDawn maps.
* Billy Boy, aka Xia Chen, for creating the first version of the network code.  Let me know how that Ph.D. went.
* DJ Kat for the Raver's Island map.
* LeechDemon, aka Jason Elliot, for his kick ass textures and unwrapping.
* Mr.Mitchell for reworking the menus.
* Nemesis, aka Stephen Deaver, for all his code (even the stuff I didn't use, sorry.)
* Saturnite, aka Jason Seabaugh, for his model sheets (including Attitude and WuTang), dance animations and modelling Attitude.
* Space Grrl, aka Suzanne Duke, for the kick ass web design.
* All the people who worked on the project and got discouraged before they could contribute.  Sorry, I wish I was a better motivator/manager.
* NilreMK for the great Kasahee model.
* &quot;Aura - the sound of trace&quot; for letting us distribute Destination Skyline with this package.
* Dr. Sin for the Window Replication Info class.
* The Ogg Vorbis team for, well, Ogg Vorbis (www.xiph.org)
* SoX for it's .wav file reader
* JREIcon (I lost the name and URL, sorry!) (Used int he 0.5.x series).

====Music Credits ====

Earlier versions of Esc shipped with built in music.

&quot;Atomic Maneuver&quot; and &quot;Noise Machine&quot; are original compositions of Marvel/MGanda, our lead artist at the time.

&quot;Destination Skyline&quot; is by &quot;Aura - the sound of trance&quot; for letting us distribute their awesome song Destination Skyline with this package.  http://artists.mp3s.com/info/170/aura1.html

====LAST WORDS ====

'''We need you!'''

We'd be thrilled if you could come forward and offer your services - coders, mappers, animators, texture artists, musicians, general 1337 people would be more than appreciated.  Best email the boss. 

'''Note from MC|Spanky'''

If you've read this far (well done): What the hell are you doing?? Go join an Esc server!  

----

'''Tarquin:'''  questions about the installer: 
# is there any reason why it's an EXE and not a UMOD?
##'''DJP:''' 'Cos this is nicer - as we might (can't remember offhand) make copies of the user's user.ini/ut.ini files, and use those for Esc.  UMODs, in my experiance, are pinniky beasts.
### downside is it's not cross-platform...

'''Mychaeel:'''  That's a big downside, especially if the rest of the mod would otherwise be platform-independent (see also [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]]).  And I'm actually not sure whether you can or can't do things like copying files with UMod installers; they're by far more powerful than [[Legacy:Umod Wizard|umod Wizard]] suggests.

# what's it going to do to my UT folder? I'm wary of letting things loose on existing applications. A quick summary in the installer info itself would be nice if there's anything beyond the usual Unreal packages (eg overwriting existing files...)
##'''DJP:''' No files should be overwritten - be less scared, tarquin.
### I'll give it a try later :)

'''Mcspanky:'''  The mod isn't plaform independent, unfortunately.  It needs to call DirectSound to play the music for a number of reasons.  So, until we can get some Mac/Linux sound programmers interested, it's Windows only.  If anybody's done sound programming under either one, porting Esc wouldn't be hard, and would be a BIG help...
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2981</id>
      <timestamp>2007-01-22T23:28:40Z</timestamp>
      <contributor>
        <ip>Dsl-201-133-184-168.prod-empresarial.com.mx</ip>
      </contributor>
      <comment>http://www.dvbgjzsuq.wtcgufz.com</comment>
      <text xml:space="preserve">elnkfvj mrlx rgvdsocp eqztxvam mwaqljpu skqhpati zhsmwielb</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Event</title>
    <id>1099</id>
    <revision>
      <id>2903</id>
      <timestamp>2008-01-04T23:12:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>RTFM, stupid spam bot (*reverted*)</comment>
      <text xml:space="preserve">An '''Event''' is a key [[Legacy:Engine Concept|Engine Concept]] in Unreal. (For details on the 'event' keyword in [[Legacy:UnrealScript|UnrealScript]] see [[Legacy:Function Syntax|Function Syntax]].)

An &quot;Event&quot; is a type of message sent during the game by one [[Legacy:Actor|Actor]] to other actors. Every event has a name, chosen by the mapper or coder. Certain conditions will make an Actor &quot;call&quot;  an event; and some Actors are &quot;listening&quot; for a particular event name to be called, and when it does they will react in some way.

==Properties==

Every actor has two properties under the Events heading: 
; Event: The name of the Event that this actor can call
; Tag: The name of the Event that will make this actor react &amp;ndash; in other words, the name of the event that it listens for

You can think of this like a paging system in a hotel lobby: a groom walks through calling out the event name. Any Actor that is set to listen to this event name will respond.

In the UnrealScript code, this actually works with an [[Legacy:Iterator|iterator]] that looks at every actor in the game. Any actors whose Tag matches the event being called have their Trigger function executed:
: '''function Trigger( actor Other, pawn EventInstigator )'''

This system effectively ties two or more actors together. UnrealEd helps you keep track of this by drawing a red line between actors with matching Tag and Event properties. You can also list actors by the value of their Tag or Event in the [[Legacy:Actor Search|Actor Search]] window.

The properties themselves can be set to any string. The important thing is the matching, though it helps to use words relevant to the map, eg &quot;MainDoor&quot; or &quot;Explosion&quot;.

Some actors expand on this behaviour, and can call or listen for several events: more on this below.

==Triggering an Event==

Starting an Event is called &quot;triggering&quot;, &quot;calling&quot;, &quot;initiating&quot; or &quot;firing&quot; it &amp;ndash; every mapper or coder has their way of visualizing the process. When an actor actually calls an event depends on how its class script and its properties. The simplest example is the [[Legacy:Trigger|Trigger]] actor. This calls its Event whenever a player passes through its [[Legacy:Collision Cylinder|Collision Cylinder]].

All actors whose Tag matches the Trigger's Event will receive the message &amp;ndash; we say that they have been ''triggered''. What these actors then do depends, again, on their own class script and their own properties. Some actors will do nothing, some can react, and some can trigger other actors in turn.

It's possible to create complex chains of events like this: see [[Legacy:Trigger Systems|Trigger Systems]] for examples.

===Chain of &quot;Events&quot;===

This is what happens when Actors are triggered:

====The Trigger====

Player Bob walks into the Trigger's radius:
* Touch( actor Other )
** IsRelevant( Other ) checks the actor can actually do stuff

The Trigger runs a ForEach [[Legacy:Iterator|iterator]], to find matching actors.
* A.Trigger( Other, Other.Instigator )

where:
* Other is the actor Bob that touched the Trigger.
* Other.Instigator is another script chase for another day.

====The Target====

function Trigger( actor Other, pawn EventInstigator )

So...
* Other is the same Other as in Trigger &amp;ndash; Bob
* EventInstigator is Other.Instigator from before

====Dispatchers====

These break the chain:
: Target.Trigger( Self, Instigator )

in other words, they pass on themselves as the Other for the triggered actor, not the thing that touched the Trigger that then triggered the dispatcher. This causes problems with, for example the BumpButton state in [[Legacy:Mover|mover]]s. See [[Legacy:Dispatcher|Dispatcher]] for a fix.

==Continuous Events ==

So far, an Event is a discrete occurence. The player walks into the Trigger, something happens. But Events are technically continuous: they don't end until the player walks out of the Trigger radius.

For most setups, the length of the event is irrelevant. For example, most doors are set to start opening when Triggered, wait when fully open, then close: once Triggered there's no way to affect them. From this point of view, an Event is instantaneous.

However, some actors will respond to being UnTriggered. A door whose InitialState is &quot;TriggerControl&quot; will start opening when triggered, but will start closing as soon as the player steps out of the Trigger's radius. A good example of this behavious is the door to the Redeemer in UT's DM-Stalwart-XL.

Just remembered... Triggers can also be set to repeatedly send the trigger message... sort of repeating discrete events.... the plot thickens!

===Technical===

Functions to cover:
; Trigger() :
; UnTrigger() :
; Touch() :
; UnTouch() :

In terms of mapping, an event is a combination of certain circumstances which occurs during the game and especially a string which represents the event for Unreal. This could be player touching a [[Legacy:Trigger|Trigger]] or an opening door. 

Mention built-in events too.

===Actors that call an event when touched ===
* [[Legacy:Trigger|Trigger]]: This is the main actor for calling an event. It can be set to react when a player, pawn or indeed any class walks into its [[Legacy:Collision Cylinder|collision cylinder]] or when it suffers a certin amount of damage from being shot.

===Actors that process events ===

These actors are not affected by players passing through their collision cylinder.
* [[Legacy:Dispatcher|Dispatcher]] : this calls a list of events, with an optional delay between each call. 
* [[Legacy:RoundRobin|RoundRobin]] : each time this is triggered it calls the next event in a list

(note this isn't a complete list, just some of the important ones)

===Actors that listen for an event ===
* The Trigger actor itself can be set to wake up or go to sleep when triggered by something else.

(note this isn't a complete list, just some of the important ones)

==Troubleshooting ==

Even simple chains of events can be hard to get right. Only actors that set events and tags in the &quot;Event&quot; section are linked with red lines in the editor, so actors such as Dispatcher are somewhat harder to troubleshoot.

Suggestions:
* Use the CAUSEEVENT console command (in [[Legacy:PlayerPawn|PlayerPawn]]; you must be a server admin).  It calls Trigger on all actors with the tag given as a parameter.
* Test the chain of command: give the first Trigger that players walk into a message, and test it in game. You should see the message. 
* If an actor that is being trigerred is capable of sending a player-visible message (eg SpecialEvent), set it up so you can see in game whether it has been triggered.
* If triggered movers or pawns don't work, create a SpecialEvent that listens for the same event &amp; set it to broadcast. 
 

==Related Topics ==
* [[Legacy:Tag|Tag]]
* A [[:Category:Legacy Basic Procedure]] on this: [[Legacy:Match These Tags|Match These Tags]]
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; How to add actors, set properties etc.
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Main topic page for triggers &amp; sounds
** [[Legacy:Trigger Systems|Trigger Systems]]
** [[Legacy:Types Of Trigger|Types of Trigger]] &amp;ndash; Summary of trigger types

==Discussion==

'''Unknown:''' How does Trigger deal with a situation when more than 1 player walks into the radius? Which player makes UnTrigger occur by leaving?

'''Birelli:''' Think of it as every player inside the radius is &quot;holding open the event&quot;, the event in this case starts when any player enters the Trigger radius and is UnTriggered when there are no players left inside the radius of the trigger.

'''SuperApe:''' Edited.  Refactored some.

----

[[:Category:Legacy Troubleshooting]]

[[:Category:Legacy To Do]] &amp;ndash; Answer questions, fill in.  Related with [[Legacy:Tag|Tag]].
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2904</id>
      <timestamp>2008-01-04T22:25:21Z</timestamp>
      <contributor>
        <ip>Bd0636b7.virtua.com.br</ip>
      </contributor>
      <comment>Contuss</comment>
      <text xml:space="preserve">Hi, niice site!

[url=http://buytramadol000.blogspot.com]buy tramadol[/url] &lt;a href=&quot;http://buytramadol000.blogspot.com&quot;&gt;buy tramadol&lt;/a&gt; buy tramadol</text>
    </revision>
    <revision>
      <id>44527</id>
      <timestamp>2011-07-22T16:19:39Z</timestamp>
      <contributor>
        <username>Krylose</username>
        <id>2246</id>
      </contributor>
      <minor/>
      <comment>Minor spelling correction.</comment>
      <text xml:space="preserve">An '''Event''' is a key [[Legacy:Engine Concept|Engine Concept]] in Unreal. (For details on the 'event' keyword in [[Legacy:UnrealScript|UnrealScript]] see [[Legacy:Function Syntax|Function Syntax]].)

An &quot;Event&quot; is a type of message sent during the game by one [[Legacy:Actor|Actor]] to other actors. Every event has a name, chosen by the mapper or coder. Certain conditions will make an Actor &quot;call&quot;  an event; and some Actors are &quot;listening&quot; for a particular event name to be called, and when it does they will react in some way.

==Properties==

Every actor has two properties under the Events heading: 
; Event: The name of the Event that this actor can call
; Tag: The name of the Event that will make this actor react &amp;ndash; in other words, the name of the event that it listens for

You can think of this like a paging system in a hotel lobby: a groom walks through calling out the event name. Any Actor that is set to listen to this event name will respond.

In the UnrealScript code, this actually works with an [[Legacy:Iterator|iterator]] that looks at every actor in the game. Any actors whose Tag matches the event being called have their Trigger function executed:
: '''function Trigger( actor Other, pawn EventInstigator )'''

This system effectively ties two or more actors together. UnrealEd helps you keep track of this by drawing a red line between actors with matching Tag and Event properties. You can also list actors by the value of their Tag or Event in the [[Legacy:Actor Search|Actor Search]] window.

The properties themselves can be set to any string. The important thing is the matching, though it helps to use words relevant to the map, eg &quot;MainDoor&quot; or &quot;Explosion&quot;.

Some actors expand on this behaviour, and can call or listen for several events: more on this below.

==Triggering an Event==

Starting an Event is called &quot;triggering&quot;, &quot;calling&quot;, &quot;initiating&quot; or &quot;firing&quot; it &amp;ndash; every mapper or coder has their way of visualizing the process. When an actor actually calls an event depends on how its class script and its properties. The simplest example is the [[Legacy:Trigger|Trigger]] actor. This calls its Event whenever a player passes through its [[Legacy:Collision Cylinder|Collision Cylinder]].

All actors whose Tag matches the Trigger's Event will receive the message &amp;ndash; we say that they have been ''triggered''. What these actors then do depends, again, on their own class script and their own properties. Some actors will do nothing, some can react, and some can trigger other actors in turn.

It's possible to create complex chains of events like this: see [[Legacy:Trigger Systems|Trigger Systems]] for examples.

===Chain of &quot;Events&quot;===

This is what happens when Actors are triggered:

====The Trigger====

Player Bob walks into the Trigger's radius:
* Touch( actor Other )
** IsRelevant( Other ) checks the actor can actually do stuff

The Trigger runs a ForEach [[Legacy:Iterator|iterator]], to find matching actors.
* A.Trigger( Other, Other.Instigator )

where:
* Other is the actor Bob that touched the Trigger.
* Other.Instigator is another script chase for another day.

====The Target====

function Trigger( actor Other, pawn EventInstigator )

So...
* Other is the same Other as in Trigger &amp;ndash; Bob
* EventInstigator is Other.Instigator from before

====Dispatchers====

These break the chain:
: Target.Trigger( Self, Instigator )

in other words, they pass on themselves as the Other for the triggered actor, not the thing that touched the Trigger that then triggered the dispatcher. This causes problems with, for example the BumpButton state in [[Legacy:Mover|mover]]s. See [[Legacy:Dispatcher|Dispatcher]] for a fix.

==Continuous Events ==

So far, an Event is a discrete occurence. The player walks into the Trigger, something happens. But Events are technically continuous: they don't end until the player walks out of the Trigger radius.

For most setups, the length of the event is irrelevant. For example, most doors are set to start opening when Triggered, wait when fully open, then close: once Triggered there's no way to affect them. From this point of view, an Event is instantaneous.

However, some actors will respond to being UnTriggered. A door whose InitialState is &quot;TriggerControl&quot; will start opening when triggered, but will start closing as soon as the player steps out of the Trigger's radius. A good example of this behavious is the door to the Redeemer in UT's DM-Stalwart-XL.

Just remembered... Triggers can also be set to repeatedly send the trigger message... sort of repeating discrete events.... the plot thickens!

===Technical===

Functions to cover:
; Trigger() :
; UnTrigger() :
; Touch() :
; UnTouch() :

In terms of mapping, an event is a combination of certain circumstances which occurs during the game and especially a string which represents the event for Unreal. This could be player touching a [[Legacy:Trigger|Trigger]] or an opening door. 

Mention built-in events too.

===Actors that call an event when touched ===
* [[Legacy:Trigger|Trigger]]: This is the main actor for calling an event. It can be set to react when a player, pawn or indeed any class walks into its [[Legacy:Collision Cylinder|collision cylinder]] or when it suffers a certain amount of damage from being shot.

===Actors that process events ===

These actors are not affected by players passing through their collision cylinder.
* [[Legacy:Dispatcher|Dispatcher]] : this calls a list of events, with an optional delay between each call. 
* [[Legacy:RoundRobin|RoundRobin]] : each time this is triggered it calls the next event in a list

(note this isn't a complete list, just some of the important ones)

===Actors that listen for an event ===
* The Trigger actor itself can be set to wake up or go to sleep when triggered by something else.

(note this isn't a complete list, just some of the important ones)

==Troubleshooting ==

Even simple chains of events can be hard to get right. Only actors that set events and tags in the &quot;Event&quot; section are linked with red lines in the editor, so actors such as Dispatcher are somewhat harder to troubleshoot.

Suggestions:
* Use the CAUSEEVENT console command (in [[Legacy:PlayerPawn|PlayerPawn]]; you must be a server admin).  It calls Trigger on all actors with the tag given as a parameter.
* Test the chain of command: give the first Trigger that players walk into a message, and test it in game. You should see the message. 
* If an actor that is being trigerred is capable of sending a player-visible message (eg SpecialEvent), set it up so you can see in game whether it has been triggered.
* If triggered movers or pawns don't work, create a SpecialEvent that listens for the same event &amp; set it to broadcast. 
 

==Related Topics ==
* [[Legacy:Tag|Tag]]
* A [[:Category:Legacy Basic Procedure]] on this: [[Legacy:Match These Tags|Match These Tags]]
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; How to add actors, set properties etc.
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Main topic page for triggers &amp; sounds
** [[Legacy:Trigger Systems|Trigger Systems]]
** [[Legacy:Types Of Trigger|Types of Trigger]] &amp;ndash; Summary of trigger types

==Discussion==

'''Unknown:''' How does Trigger deal with a situation when more than 1 player walks into the radius? Which player makes UnTrigger occur by leaving?

'''Birelli:''' Think of it as every player inside the radius is &quot;holding open the event&quot;, the event in this case starts when any player enters the Trigger radius and is UnTriggered when there are no players left inside the radius of the trigger.

'''SuperApe:''' Edited.  Refactored some.

----

[[:Category:Legacy Troubleshooting]]

[[:Category:Legacy To Do]] &amp;ndash; Answer questions, fill in.  Related with [[Legacy:Tag|Tag]].
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Event Triggers</title>
    <id>1163</id>
    <revision>
      <id>3043</id>
      <timestamp>2003-09-17T12:44:17Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>U2</comment>
      <text xml:space="preserve">There is some low-level link between the key bindings and the UI events. For example, in User.ini, under [Engine.input], we have the following line:

 Escape=SendEvent ShowMenus

This states that pressing escape will trigger ShowMenus. This relates to the following in U2Menus.ui

 [Root]
 Class=MultiStateComponent
 State=NonMain
 State=Main
 Transition=ResetMenus,0,0,0,NULL
 '''Transition=ShowMenus,1,1,0,NULL'''
 TriggerEvent=0,0.0,CodeMonkey,UnPause
 TriggerEvent=1,0.0,CodeMonkey,Pause
 TriggerEvent=1,0.0,Event,MenuBackgroundBlurry.FadeOut
 TriggerEvent=1,0.0,Event,MainMenuBackgroundLarge.Grow
 TriggerEvent=1,0.0,Event,MainMenuBackgroundSmall.Show
 DrawOrder=99
 Localize=true

The line:

 Transition=ShowMenus,1,1,0,NULL

defines this particular event.

I tested this by creating a useless event, which does the same thing as notifying you of a new objective. In U2HUD.ui, this defines the ObjectiveNotify component:

 [ObjectiveNotify]
 Class=MultiStateComponent
 State=NULL
 State=ObjectiveNotifyText
 Transition=NewObjective,1,0,4.0,ObjectiveNotifyText:NewObjective
 '''Transition=Honestly,1,0,4.0,ObjectiveNotifyText:Honestly'''
 Transition=ObjectiveCompleted,1,0,4.0,ObjectiveNotifyText:ObjectiveCompleted
 Transition=ObjectiveFailed,1,0,4.0,ObjectiveNotifyText:ObjectiveFailed
 TweenLocation=false
 TweenAlpha=true
 DrawOrder=1

I added the line in bold here. Then, I entered the corresponding keybinding in User.ini:

 F3=SendEvent Honestly

Finally, in U2HUD.int, the text is defined:

 [General]
 AutoTurret=Auto Turret
 RocketTurret=Rocket Turret
 FieldGenerator=Field Generator
 ProximitySensor=Proximity Sensor
 XMP_Unknown=Unknown
 Objectives=OBJECTIVES
 NewObjective=F4 - New Objective
 '''Honestly=Honestly!'''
 ObjectiveCompleted=F4 - Objective Completed
 ObjectiveFailed=F4 - Objective Failed
 EndGame_LoadMenu=Load menu
 EndGame_QuickLoad=Quick load
 EndGame_RestartLevel=Restart
 EndGame_Quit=QUIT
 Confirmation_Ok=Ok
 Confirmation_Cancel=Cancel
 Confirmation_QuickLoad=REALLY LOAD?

Thus, when I press F3 during the game, &quot;Honestly!&quot; appears in the bottom left corner of the screen.

Normally, Objective notify events will be triggered from UnrealScript - the U2GameInfo class, in function UpdateObjective()

&lt;uscript&gt;
switch(Status)
{
  case OBJECTIVE_Incomplete: class'UIConsole'.static.SendEvent(&quot;NewObjective&quot;); break;
  case OBJECTIVE_Completed: class'UIConsole'.static.SendEvent(&quot;ObjectiveCompleted&quot;); break;
  case OBJECTIVE_Failed: class'UIConsole'.static.SendEvent(&quot;ObjectiveFailed&quot;); break;
}
&lt;/uscript&gt;

This acheives exactly the same result, and the same native function must be called, if not from UnrealScript, in the first case I described.

'''MythOpus:''' I believe [[Legacy:EventTriggers|EventTriggers]] are only used in Unreal 2 am I right?</text>
    </revision>
    <revision>
      <id>3044</id>
      <timestamp>2003-09-16T21:15:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>clean up</comment>
      <text xml:space="preserve">There is some low-level link between the key bindings and the UI events. For example, in User.ini, under [Engine.input], we have the following line:

 Escape=SendEvent ShowMenus

This states that pressing escape will trigger ShowMenus. This relates to the following in U2Menus.ui

 [Root]
 Class=MultiStateComponent
 State=NonMain
 State=Main
 Transition=ResetMenus,0,0,0,NULL
 '''Transition=ShowMenus,1,1,0,NULL'''
 TriggerEvent=0,0.0,CodeMonkey,UnPause
 TriggerEvent=1,0.0,CodeMonkey,Pause
 TriggerEvent=1,0.0,Event,MenuBackgroundBlurry.FadeOut
 TriggerEvent=1,0.0,Event,MainMenuBackgroundLarge.Grow
 TriggerEvent=1,0.0,Event,MainMenuBackgroundSmall.Show
 DrawOrder=99
 Localize=true

The line:

 Transition=ShowMenus,1,1,0,NULL

defines this particular event.

I tested this by creating a useless event, which does the same thing as notifying you of a new objective. In U2HUD.ui, this defines the ObjectiveNotify component:

 [ObjectiveNotify]
 Class=MultiStateComponent
 State=NULL
 State=ObjectiveNotifyText
 Transition=NewObjective,1,0,4.0,ObjectiveNotifyText:NewObjective
 '''Transition=Honestly,1,0,4.0,ObjectiveNotifyText:Honestly'''
 Transition=ObjectiveCompleted,1,0,4.0,ObjectiveNotifyText:ObjectiveCompleted
 Transition=ObjectiveFailed,1,0,4.0,ObjectiveNotifyText:ObjectiveFailed
 TweenLocation=false
 TweenAlpha=true
 DrawOrder=1

I added the line in bold here. Then, I entered the corresponding keybinding in User.ini:

 F3=SendEvent Honestly

Finally, in U2HUD.int, the text is defined:

 [General]
 AutoTurret=Auto Turret
 RocketTurret=Rocket Turret
 FieldGenerator=Field Generator
 ProximitySensor=Proximity Sensor
 XMP_Unknown=Unknown
 Objectives=OBJECTIVES
 NewObjective=F4 - New Objective
 '''Honestly=Honestly!'''
 ObjectiveCompleted=F4 - Objective Completed
 ObjectiveFailed=F4 - Objective Failed
 EndGame_LoadMenu=Load menu
 EndGame_QuickLoad=Quick load
 EndGame_RestartLevel=Restart
 EndGame_Quit=QUIT
 Confirmation_Ok=Ok
 Confirmation_Cancel=Cancel
 Confirmation_QuickLoad=REALLY LOAD?

Thus, when I press F3 during the game, &quot;Honestly!&quot; appears in the bottom left corner of the screen.

Normally, Objective notify events will be triggered from UnrealScript - the U2GameInfo class, in function UpdateObjective()

&lt;uscript&gt;
switch(Status)
{
  case OBJECTIVE_Incomplete: class'UIConsole'.static.SendEvent(&quot;NewObjective&quot;); break;
  case OBJECTIVE_Completed: class'UIConsole'.static.SendEvent(&quot;ObjectiveCompleted&quot;); break;
  case OBJECTIVE_Failed: class'UIConsole'.static.SendEvent(&quot;ObjectiveFailed&quot;); break;
}
&lt;/uscript&gt;

This acheives exactly the same result, and the same native function must be called, if not from UnrealScript, in the first case I described.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evil Blue Dude</title>
    <id>1176</id>
    <revision>
      <id>3069</id>
      <timestamp>2005-12-03T00:55:54Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping===

----

When I figure out something to put here, I'll put something here : P

====My Maps====

----

All my maps can be downloaded from Unreal Playground.

http://www.unrealplayground.com/mapper.php?id=1709

===Guestbook Thingy.===

----

'''EntropicLqd:''' Hi, Welcome to the Wiki.

'''SuperApe:''' Hey there, EBD. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3070</id>
      <timestamp>2005-01-10T05:07:51Z</timestamp>
      <contributor>
        <ip>81.9.22.69</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping===

----

When I figure out something to put here, I'll put something here : P

====My Maps====

----

All my maps can be downloaded from Unreal Playground.

http://www.unrealplayground.com/mapper.php?id=1709

===Geustbook Thingy.===

----

'''EntropicLqd:''' Hi, Welcome to the Wiki.

----

[[:Category:Legacy Personal Page]]

&lt;a href=&quot;http://access.valium-vicodin.com/help/spyware.html&quot;&gt;spyware&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/spyware_removal.html&quot;&gt;spyware_removal&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sex.html&quot;&gt;sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/free_porn.html&quot;&gt;free_porn&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/escorts.html&quot;&gt;escorts&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/free_sex.html&quot;&gt;free_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/replica_watches.html&quot;&gt;replica_watches&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/casino.html&quot;&gt;casino&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/penis_enlargement.html&quot;&gt;penis_enlargement&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/teen_sex.html&quot;&gt;teen_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/viagra.html&quot;&gt;viagra&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sexual_enhancement.html&quot;&gt;sexual_enhancement&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/xanax.html&quot;&gt;xanax&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/anal.html&quot;&gt;anal&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/dating.html&quot;&gt;dating&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/phentermine.html&quot;&gt;phentermine&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/single_girls.html&quot;&gt;single_girls&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/party_poker.html&quot;&gt;party_poker&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/xxx_video.html&quot;&gt;xxx_video&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/breast_enlargement.html&quot;&gt;breast_enlargement&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/games.html&quot;&gt;games&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/movies.html&quot;&gt;movies&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/fioricet.html&quot;&gt;fioricet&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hardcore_sex.html&quot;&gt;hardcore_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/x.x.x.html&quot;&gt;x.x.x&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/personals.html&quot;&gt;personals&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lesbian_sex.html&quot;&gt;lesbian_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hydrocodone.html&quot;&gt;hydrocodone&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/adult.html&quot;&gt;adult&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/vicodin.html&quot;&gt;vicodin&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/penis_pills.html&quot;&gt;penis_pills&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/valium.html&quot;&gt;valium&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/adult_dating.html&quot;&gt;adult_dating&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_pharmacy.html&quot;&gt;online_pharmacy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/group_sex.html&quot;&gt;group_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/oral_sex.html&quot;&gt;oral_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/pussy.html&quot;&gt;pussy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/personal_photos.html&quot;&gt;personal_photos&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sexual_health.html&quot;&gt;sexual_health&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/xxx_movie.html&quot;&gt;xxx_movie&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/amateur.html&quot;&gt;amateur&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/porn.html&quot;&gt;porn&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/poker.html&quot;&gt;poker&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/work_at_home.html&quot;&gt;work_at_home&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/gay.html&quot;&gt;gay&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/music.html&quot;&gt;music&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/air_travel.html&quot;&gt;air_travel&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/teens.html&quot;&gt;teens&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/carisoprodol.html&quot;&gt;carisoprodol&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_poker.html&quot;&gt;online_poker&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/tramadol.html&quot;&gt;tramadol&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lortab.html&quot;&gt;lortab&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/anal_sex.html&quot;&gt;anal_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/antivirus.html&quot;&gt;antivirus&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/auto_insurance.html&quot;&gt;auto_insurance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/adipex.html&quot;&gt;adipex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sex_video.html&quot;&gt;sex_video&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/porno.html&quot;&gt;porno&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/penis_enlargement_pill.html&quot;&gt;penis_enlargement_pill&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_gambling.html&quot;&gt;online_gambling&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/soma.html&quot;&gt;soma&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/books.html&quot;&gt;books&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lorazepam.html&quot;&gt;lorazepam&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/life_insurance.html&quot;&gt;life_insurance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/viagra_pills.html&quot;&gt;viagra_pills&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/milf.html&quot;&gt;milf&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/alprazolam.html&quot;&gt;alprazolam&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/amateur_sex.html&quot;&gt;amateur_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sport_betting.html&quot;&gt;sport_betting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/voyeur.html&quot;&gt;voyeur&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/weight_loss.html&quot;&gt;weight_loss&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lamisil.html&quot;&gt;lamisil&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/bbw.html&quot;&gt;bbw&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cheap_cigarette.html&quot;&gt;cheap_cigarette&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/ebay.html&quot;&gt;ebay&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/texas_holdem.html&quot;&gt;texas_holdem&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/antivirus_software.html&quot;&gt;antivirus_software&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lorazepam.html&quot;&gt;lorazepam&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/new_cars.html&quot;&gt;new_cars&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cialis.html&quot;&gt;cialis&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hardcore.html&quot;&gt;hardcore&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/spyware_remove.html&quot;&gt;spyware_remove&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/spyware_remover.html&quot;&gt;spyware_remover&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/blowjobs.html&quot;&gt;blowjobs&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mature.html&quot;&gt;mature&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/travel.html&quot;&gt;travel&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/used_cars.html&quot;&gt;used_cars&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/adult_movies.html&quot;&gt;adult_movies&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/black_jack.html&quot;&gt;black_jack&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lesbian.html&quot;&gt;lesbian&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/google.html&quot;&gt;google&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/fetish.html&quot;&gt;fetish&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/bdsm.html&quot;&gt;bdsm&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/asian.html&quot;&gt;asian&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/teen.html&quot;&gt;teen&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/remove_spyware.html&quot;&gt;remove_spyware&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/gay_sex.html&quot;&gt;gay_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/yahoo.html&quot;&gt;yahoo&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/flowers.html&quot;&gt;flowers&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/computers.html&quot;&gt;computers&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_dating.html&quot;&gt;online_dating&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cars.html&quot;&gt;cars&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/laptops.html&quot;&gt;laptops&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/partypoker.html&quot;&gt;partypoker&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_casinos.html&quot;&gt;online_casinos&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/car_insurance.html&quot;&gt;car_insurance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/masturbation.html&quot;&gt;masturbation&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/celebrex.html&quot;&gt;celebrex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/yahoo.com.html&quot;&gt;yahoo.com&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/vioxx.html&quot;&gt;vioxx&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/internet.html&quot;&gt;internet&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/directv.html&quot;&gt;directv&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/teen_porn.html&quot;&gt;teen_porn&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/interracial.html&quot;&gt;interracial&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/buy_phentermine.html&quot;&gt;buy_phentermine&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hotels.html&quot;&gt;hotels&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/health_insurance.html&quot;&gt;health_insurance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/ultram.html&quot;&gt;ultram&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/pop_up_blocker.html&quot;&gt;pop_up_blocker&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/virus_scan.html&quot;&gt;virus_scan&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/art.html&quot;&gt;art&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cosmetic_surgery.html&quot;&gt;cosmetic_surgery&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/home_loan.html&quot;&gt;home_loan&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/transsexuals.html&quot;&gt;transsexuals&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/roulette.html&quot;&gt;roulette&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sports_books.html&quot;&gt;sports_books&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/employment.html&quot;&gt;employment&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sports_betting.html&quot;&gt;sports_betting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/vicoprofen.html&quot;&gt;vicoprofen&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sex_toys.html&quot;&gt;sex_toys&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/butalbital.html&quot;&gt;butalbital&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mp.html&quot;&gt;mp&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/gifts.html&quot;&gt;gifts&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/real_estate.html&quot;&gt;real_estate&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/football_betting.html&quot;&gt;football_betting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/consolidate_debt.html&quot;&gt;consolidate_debt&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/codeine.html&quot;&gt;codeine&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_sports_book.html&quot;&gt;online_sports_book&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sports_book.html&quot;&gt;sports_book&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/buy_cialis.html&quot;&gt;buy_cialis&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/loan.html&quot;&gt;loan&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/popup_blocker.html&quot;&gt;popup_blocker&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/web_hosting.html&quot;&gt;web_hosting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/education.html&quot;&gt;education&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/health.html&quot;&gt;health&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/bontril.html&quot;&gt;bontril&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/free_spyware.html&quot;&gt;free_spyware&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/refinance.html&quot;&gt;refinance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/auto_prices.html&quot;&gt;auto_prices&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/home_equity_loan.html&quot;&gt;home_equity_loan&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/bondage.html&quot;&gt;bondage&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cheap_phentermine.html&quot;&gt;cheap_phentermine&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/entertainment.html&quot;&gt;entertainment&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/ativan.html&quot;&gt;ativan&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lorcet.html&quot;&gt;lorcet&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/football.html&quot;&gt;football&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/free_online_dating.html&quot;&gt;free_online_dating&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/refinance_loan.html&quot;&gt;refinance_loan&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/fitness.html&quot;&gt;fitness&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/car_rental.html&quot;&gt;car_rental&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/monster_cock.html&quot;&gt;monster_cock&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/business.html&quot;&gt;business&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_casino.html&quot;&gt;online_casino&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lesbians.html&quot;&gt;lesbians&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/diet_pills.html&quot;&gt;diet_pills&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/ambien.html&quot;&gt;ambien&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/domain_names.html&quot;&gt;domain_names&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/anti_spyware.html&quot;&gt;anti_spyware&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/gambling.html&quot;&gt;gambling&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/clonazepam.html&quot;&gt;clonazepam&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/blackjack.html&quot;&gt;blackjack&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mortgage_rates.html&quot;&gt;mortgage_rates&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/asian_porn.html&quot;&gt;asian_porn&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/levitra.html&quot;&gt;levitra&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/bankrupcy.html&quot;&gt;bankrupcy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mp_downloads.html&quot;&gt;mp_downloads&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/online_shopping.html&quot;&gt;online_shopping&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/xenical.html&quot;&gt;xenical&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/advertising.html&quot;&gt;advertising&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/magazines.html&quot;&gt;magazines&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/shemales.html&quot;&gt;shemales&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/dvd.html&quot;&gt;dvd&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/paris_hilton.html&quot;&gt;paris_hilton&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/buy_viagra.html&quot;&gt;buy_viagra&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/electronics.html&quot;&gt;electronics&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/tits.html&quot;&gt;tits&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/fine_art.html&quot;&gt;fine_art&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mature_sex.html&quot;&gt;mature_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hair_loss.html&quot;&gt;hair_loss&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/body_jewelry.html&quot;&gt;body_jewelry&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/www.google.com.html&quot;&gt;www.google.com&lt;/a&gt;   

&lt;a href=&quot;http://access.valium-vicodin.com/help/norco.html&quot;&gt;norco&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/poker_online.html&quot;&gt;poker_online&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/casino_on_net.html&quot;&gt;casino_on_net&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hgh.html&quot;&gt;hgh&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/pets.html&quot;&gt;pets&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/home_mortgage.html&quot;&gt;home_mortgage&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/klonopin.html&quot;&gt;klonopin&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/auto.html&quot;&gt;auto&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/celebs.html&quot;&gt;celebs&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/young_pussy.html&quot;&gt;young_pussy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cartoons.html&quot;&gt;cartoons&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/stop_smoking.html&quot;&gt;stop_smoking&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/asian_schoolgirls.html&quot;&gt;asian_schoolgirls&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cash_for_structured_settlement.html&quot;&gt;cash_for_structured_settlement&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/marketing.html&quot;&gt;marketing&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/pharmacy.html&quot;&gt;pharmacy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/phone_sex.html&quot;&gt;phone_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/buy_hydrocodone.html&quot;&gt;buy_hydrocodone&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/www.yahoo.com.html&quot;&gt;www.yahoo.com&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cruises.html&quot;&gt;cruises&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/timeshare_resales.html&quot;&gt;timeshare_resales&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/debt_consolidation.html&quot;&gt;debt_consolidation&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/insurance.html&quot;&gt;insurance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/alphrazolam.html&quot;&gt;alphrazolam&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/finasteride.html&quot;&gt;finasteride&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/credit_cards.html&quot;&gt;credit_cards&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mortgage.html&quot;&gt;mortgage&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/testosterone.html&quot;&gt;testosterone&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/ebony.html&quot;&gt;ebony&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/job_search.html&quot;&gt;job_search&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/airline_tickets.html&quot;&gt;airline_tickets&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hairy.html&quot;&gt;hairy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cheap_hotels.html&quot;&gt;cheap_hotels&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/play_blackjack .html&quot;&gt;play_blackjack &lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/chat.html&quot;&gt;chat&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/human_resources.html&quot;&gt;human_resources&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/animal_sex.html&quot;&gt;animal_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/uggs_boot.html&quot;&gt;uggs_boot&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/ionamin.html&quot;&gt;ionamin&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/las_vegas.html&quot;&gt;las_vegas&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/car_audio.html&quot;&gt;car_audio&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/diet.html&quot;&gt;diet&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/skin_care.html&quot;&gt;skin_care&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/what_is_lorazepam.html&quot;&gt;what_is_lorazepam&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/credit_reports.html&quot;&gt;credit_reports&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sports_gambling.html&quot;&gt;sports_gambling&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/latina.html&quot;&gt;latina&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/credit.html&quot;&gt;credit&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/adventure_travel.html&quot;&gt;adventure_travel&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sexe.html&quot;&gt;sexe&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/credit_report.html&quot;&gt;credit_report&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/computer.html&quot;&gt;computer&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/hentai.html&quot;&gt;hentai&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/gangbang_sex.html&quot;&gt;gangbang_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/home_improvement.html&quot;&gt;home_improvement&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mapquest.html&quot;&gt;mapquest&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/digital_camera.html&quot;&gt;digital_camera&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cumshot.html&quot;&gt;cumshot&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/upskirt.html&quot;&gt;upskirt&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/college.html&quot;&gt;college&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/baseball_betting.html&quot;&gt;baseball_betting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/software.html&quot;&gt;software&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/basketball_betting.html&quot;&gt;basketball_betting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/free_sex_movie.html&quot;&gt;free_sex_movie&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/credit_card.html&quot;&gt;credit_card&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/vibrators.html&quot;&gt;vibrators&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/home_business.html&quot;&gt;home_business&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/fishing.html&quot;&gt;fishing&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/weight_loss_pills.html&quot;&gt;weight_loss_pills&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/didrex.html&quot;&gt;didrex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/home_insurance.html&quot;&gt;home_insurance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/www.worldsex.com.html&quot;&gt;www.worldsex.com&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/adware.html&quot;&gt;adware&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/table_games.html&quot;&gt;table_games&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/horse_betting.html&quot;&gt;horse_betting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sex_dating.html&quot;&gt;sex_dating&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/bisexual.html&quot;&gt;bisexual&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/free.html&quot;&gt;free&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/boobs.html&quot;&gt;boobs&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/asian_sex.html&quot;&gt;asian_sex&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/pay_day_loans.html&quot;&gt;pay_day_loans&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/web_design.html&quot;&gt;web_design&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/credit_counseling.html&quot;&gt;credit_counseling&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/pornstars.html&quot;&gt;pornstars&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/sexy.html&quot;&gt;sexy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/meridia.html&quot;&gt;meridia&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/naked_celebrities.html&quot;&gt;naked_celebrities&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cigarettes.html&quot;&gt;cigarettes&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/spyware_uninstall.html&quot;&gt;spyware_uninstall&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/big_nipples.html&quot;&gt;big_nipples&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/personal_ads.html&quot;&gt;personal_ads&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cash_advance.html&quot;&gt;cash_advance&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/lose_weight.html&quot;&gt;lose_weight&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/graphic_design.html&quot;&gt;graphic_design&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/shopping.html&quot;&gt;shopping&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/breast_enlargement_pill.html&quot;&gt;breast_enlargement_pill&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/orgy.html&quot;&gt;orgy&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/spyware_eliminator.html&quot;&gt;spyware_eliminator&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/spybot.html&quot;&gt;spybot&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cheapest_airline_tickets.html&quot;&gt;cheapest_airline_tickets&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/accounting.html&quot;&gt;accounting&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/cheapest_airline_tickets.html&quot;&gt;.com&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/.com.html&quot;&gt;car_parts&lt;/a&gt;

&lt;a href=&quot;http://access.valium-vicodin.com/help/mature_dating.html&quot;&gt;mature_dating&lt;/a&gt;
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3071</id>
      <timestamp>2005-01-10T06:36:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">===Mapping===

----

When I figure out something to put here, I'll put something here : P

====My Maps====

----

All my maps can be downloaded from Unreal Playground.

http://www.unrealplayground.com/mapper.php?id=1709

===Geustbook Thingy.===

----

'''EntropicLqd:''' Hi, Welcome to the Wiki.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evil-Devil</title>
    <id>1166</id>
    <revision>
      <id>3050</id>
      <timestamp>2006-03-10T18:20:57Z</timestamp>
      <contributor>
        <ip>Evil-Devil</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Some infos about me===

Well, I wanna tell something about myself...

My real name is Benjamin Behrendt and I´m looking forward to finish my training to a Fachinformatiker Anwendungsentwicklung next year.

I´ve tried my first attemps in UScript as UnrealTournament was some time at the market. But had´t understood much off all it. Till the time UT2K3 cames out I wrote several small Mutators for myself to see what will happen when changing this or this.

Now there is UT2K3 out, and I´ve started to get into the whole content. Maybe I´ll win the fight against the code :)

So, that should be enough information. Just one informatione left. At the time I wrote this, I´m 21 years old.

----

===Projects===

====Mutators====

As time goes by and people requesting some stuff, I created lately two mutators. I just want them to be mentioned, because else no one knows about them ;)

'''No Amplifer''' [http://evil-devil.pyrokar.lima-city.de/evil-devil.com/index.php?menu=downloads&amp;cat=projects#noamplifer Get it here]

As the name allready says the Damage Amplifer is removed from the current game.

'''Sniper Match Plus''' [http://evil-devil.pyrokar.lima-city.de/evil-devil.com/index.php?menu=downloads&amp;cat=projects#snipermatchplus  Get it here]

SMP is a small mutator that I created on a users request. The rules for the match were very simple and some thinks might change in a future release. For the featured rules there is damage taking while running, loose frag on death and killed by. Pretty simple, but takes care of the users needs.

====Mods====

Actually I'm working on a small mod that uses the Scorpion as main vehicle. If you know Mario Kart and its sequals you may know that the varios vs. modes have a serious fun factor. I try to bring that fun into the world of UT2K4 and the mod will feature modes like the &quot;Bomb Op&quot; from Mario Kart Double Dash or the original &quot;Balloon&quot; mode. There will also some new modes, but first these two will be done. Later the vehicle model may change also.

====Tools====

'''Unreal Engine Development Tools'''

The [[Legacy:UEDT|UEDT]] is a [[Legacy:Eclipse|Eclipse]] Plugin that is intended to help the developer with various thinks. I planned to create several Tools like an UMOD Wizard, Package Explorer and of course UnrealScript Editor.

At the moment there is only very basic UnrealScript support, as i started the project a few weeks ago. The first public release will be as soon as i get the code outline page and syntax highlighting working.

If anyone with Eclipse Plugin experience is interested to participate, feel free to contact me.

----

'''Wormbo:''' Welcome to the Wiki. :)

'''EntropicLqd:''' Welcome to the Wiki.  Don't forget about the [[Legacy:Mod Ideas|Mod Ideas]] page.

'''Evil-Devil:''' Thanks for the welcome :) As I´d understand all this new things in the wiki world, I´ll write down my current Mutator idea. Which might be really funny if it works :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3051</id>
      <timestamp>2003-08-15T22:26:34Z</timestamp>
      <contributor>
        <ip>PD9500CFD.dip.t-dialin.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Some infos about me===

Well, I wanna tell something about myself...

My real name is Benjamin Behrendt and I´m looking forward to finish my training to a Fachinformatiker Anwendungsentwicklung next year.

I´ve tried my first attemps in UScript as UnrealTournament was some time at the market. But had´t understood much off all it. Till the time UT2K3 cames out I wrote several small Mutators for myself to see what will happen when changing this or this.

Now there is UT2K3 out, and I´ve started to get into the whole content. Maybe I´ll win the fight against the code :)

So, that should be enough information. Just one informatione left. At the time I wrote this, I´m 21 years old.

===Mutator Ideas===

nothing yet here

----

'''Wormbo:''' Welcome to the Wiki. :)

'''EntropicLqd:''' Welcome to the Wiki.  Don't forget about the [[Legacy:Mod Ideas|Mod Ideas]] page.

'''Evil-Devil:''' Thanks for the welcome :) As I´d understand all this new things in the wiki world, I´ll write down my current Mutator idea. Which might be really funny if it works :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:EvilEngine</title>
    <id>1202</id>
    <revision>
      <id>3122</id>
      <timestamp>2008-01-13T04:31:18Z</timestamp>
      <contributor>
        <ip>EvilEngine</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

===General Info===
*Author - Charles 'EvilEngine' Jones
*Homepage1 - [http://www.evilengine.net/forum/]
*Contact - EvilEngine1(at)gmail.com

===Related Interests===
*  Unreal Weapon &amp; Character Design
*  Custom Textures &amp; Model Animation

===Past Projects===
* [http://torlan.forerunners.org HaloUT] (2004)
*  Various custom UT2004 character models, and weapons
*  Currently working on the modification for UT3 called ARMS OF REDEMPTION. 
*  Various models,weapons and other items for UT3

===Current Projects===
* Personal Projects for UT3, more info at www.evilengine.net/forum/

==Guestbook==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3123</id>
      <timestamp>2005-07-28T01:40:38Z</timestamp>
      <contributor>
        <ip>EvilEngine</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

===General Info===
*Author - Charles 'EvilEngine' Jones
*Homepage1 - [http://www.bigfootstudios.com/EVILENGINE/RESUME/3D.htm http://www.bigfootstudios.com/EVILENGINE/RESUME/3D.htm]
*Homepage2 - [http://teamorbit.beyondunreal.com http://teamorbit.beyondunreal.com]

*Contact - EvilEngine1(at)gmail.com

===Related Interests===
*  Unreal Weapon &amp; Character Design
*  Custom Textures &amp; Model Animation

===Past Projects===
* [http://torlan.forerunners.org HaloUT] (2004)
*  Various custom UT2004 character models, and weapons

===Current Projects===
* [http://teamorbit.beyondunreal.com OrbitWars : Neocairo]

==Guestbook==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evilmrfrank</title>
    <id>1204</id>
    <revision>
      <id>3126</id>
      <timestamp>2006-07-27T19:42:14Z</timestamp>
      <contributor>
        <ip>65.172.136.1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Evilmrfrank:

Hey everyone I'm new to this site(obviously):P I have been making maps for about 6 years now and have gained quite a good understanding on how to make proffesional quality maps.  I have made a few maps but lost them since I did not have the internet to submit them but I have been working on a map for the last few months that should impress some people.  I am in need of some beta testers for my map before I publicly submit it.  I will be sure to put each and every one of your names in the readme file if you help me.  If anyone is interested just send me an email at evilmrfrank@yahoo.com

==News==

Here are some pics of my current level I've been working on for a while.  Tell me what you think

http://i3.photobucket.com/albums/y79/evilmrfrank/DM-Aztec4.jpg

http://i3.photobucket.com/albums/y79/evilmrfrank/DM-Aztec3.jpg

http://i3.photobucket.com/albums/y79/evilmrfrank/DM-Aztec1.jpg

The map is nearly complete but not completly.  Will post here as soon as I am done though.

==Map Downloads==

UT99 Maps

DM-Aztec - http://mapraider.com/maps/?fileid=3395

2k4 Maps

DM-Collude - http://nalicity.beyondunreal.com/map_hub.php?mid=9251

==Map Making Tips==

Ok I'm not sure if there is anywhere else on the site that has anything like this posted but I thought I would add it in.  For anyone interested on some tips on how to make a decent map I'll try and help.

First off do not build very large rooms that have giant open walls, floors and ceilings.  These kind of things will always make the playr boredbecause there is no eye candy.  Fill your level with lots of enviromental things(hanging plants, cobwebs, hanging lights, ect.)  Also add lots of ambient sounds to enhance the realism of the map.  Another thing that many noob map makers always tend to do is when they make their level they tend to have no light sources.  Always put in light sources it looks much better.    When making a Death Match level it is usually a good idea to make multiple levels that the player can access where they are not limited to only one floor. Door.

Make sure the player always has a good number of directions to choose from, this quickens the game play and also gives the player more to choose from.  But make sure to not over do it as it may confuse the player if the level is loaded with hundreds of halways going every direction.  The use of coronas is also one thing that any good map is not without.  Make sure to place them wisely and precisely though.  Dont make the corona blind the site of the player unless this is for some reason intended by the mapper.  Be sure to add lots of decoration to your maps to make the world around the player seem more real.  Never fill a room with 500 static meshes as it will decrease gameplay a lot.  Keep your map organized at all times or even the crator of the map will begin to get tiresome of it after a while.  Always put gameplay at the top of the list for your map.  After youve gotten the gameplay down you can begin work on the eye candy.  put in interesting little spots that catch the players attention, some maps put glowing eyes under the stairs or some maps put in flying birds.  Whatever you can do to make the map seem more like a real place as long as it keeps a good game flow is a good thing.

==Discussion==

'''MythOpus:''' Welcome To Teh Wikeh :P

'''Evilmrfrank:''' Sorry I guess I should have posted which game the map is for. :P It is for the original Unreal Tournament 99.  I will switch it over to 2k4 when I get the time but for now its under the old one.

'''Evilmrfrank:''' If anyone has anything to add feel free to post it here.  Its very unorganized as well.:P

'''MythOpus:''' Well, you can add that info about you mapping for UT99 in the intro para you know.  Edits on the wiki aren't one time only edits...  You can change anything anytime you wish...

'''Evilmrfrank:''' It is not entirely for UT99 as it talks about static meshes as well.  It is pretty much for any game that has deathmatch.  I will add more later on into this section as I was kinda rushed at the time I wrote this.

'''Graphik:''' Very nice map. :tup: You're more creative than I.

'''Evilmrfrank:''' Ok is it just me or is this site a whole lot more dead then I last remembered it?

'''Evilmrfrank:''' I released my newest map a few weeks back DM-Collude.  Here is the link if anyone is interested:)  http://nalicity.beyondunreal.com/map_hub.php?mid=9251</text>
    </revision>
    <revision>
      <id>3127</id>
      <timestamp>2005-10-16T18:00:09Z</timestamp>
      <contributor>
        <ip>Evilmrfrank</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Evilmrfrank:

Hey everyone I'm new to this site(obviously):P I have been making maps for about 6 years now and have gained quite a good understanding on how to make proffesional quality maps.  I have made a few maps but lost them since I did not have the internet to submit them but I have been working on a map for the last few months that should impress some people.  I am in need of some beta testers for my map before I publicly submit it.  I will be sure to put each and every one of your names in the readme file if you help me.  If anyone is interested just send me an email at evilmrfrank@yahoo.com

==News==

Here are some pics of my current level I've been working on for a while.  Tell me what you think

http://i3.photobucket.com/albums/y79/evilmrfrank/DM-Aztec4.jpg

http://i3.photobucket.com/albums/y79/evilmrfrank/DM-Aztec3.jpg

http://i3.photobucket.com/albums/y79/evilmrfrank/DM-Aztec1.jpg

The map is nearly complete but not completly.  Will post here as soon as I am done though.

==Map Downloads==

UT99 Maps

DM-Aztec - http://mapraider.com/maps/?fileid=3395

==Map Making Tips==

Ok I'm not sure if there is anywhere else on the site that has anything like this posted but I thought I would add it in.  For anyone interested on some tips on how to make a decent map I'll try and help.

First off do not build very large rooms that have giant open walls, floors and ceilings.  These kind of things will always make the playr boredbecause there is no eye candy.  Fill your level with lots of enviromental things(hanging plants, cobwebs, hanging lights, ect.)  Also add lots of ambient sounds to enhance the realism of the map.  Another thing that many noob map makers always tend to do is when they make their level they tend to have no light sources.  Always put in light sources it looks much better.    When making a Death Match level it is usually a good idea to make multiple levels that the player can access where they are not limited to only one floor. Door.

Make sure the player always has a good number of directions to choose from, this quickens the game play and also gives the player more to choose from.  But make sure to not over do it as it may confuse the player if the level is loaded with hundreds of halways going every direction.  The use of coronas is also one thing that any good map is not without.  Make sure to place them wisely and precisely though.  Dont make the corona blind the site of the player unless this is for some reason intended by the mapper.  Be sure to add lots of decoration to your maps to make the world around the player seem more real.  Never fill a room with 500 static meshes as it will decrease gameplay a lot.  Keep your map organized at all times or even the crator of the map will begin to get tiresome of it after a while.  Always put gameplay at the top of the list for your map.  After youve gotten the gameplay down you can begin work on the eye candy.  put in interesting little spots that catch the players attention, some maps put glowing eyes under the stairs or some maps put in flying birds.  Whatever you can do to make the map seem more like a real place as long as it keeps a good game flow is a good thing.

==Discussion==

'''MythOpus:''' Welcome To Teh Wikeh :P

'''Evilmrfrank:''' Sorry I guess I should have posted which game the map is for. :P It is for the original Unreal Tournament 99.  I will switch it over to 2k4 when I get the time but for now its under the old one.

'''Evilmrfrank:''' If anyone has anything to add feel free to post it here.  Its very unorganized as well.:P

'''MythOpus:''' Well, you can add that info about you mapping for UT99 in the intro para you know.  Edits on the wiki aren't one time only edits...  You can change anything anytime you wish...

'''Evilmrfrank:''' It is not entirely for UT99 as it talks about static meshes as well.  It is pretty much for any game that has deathmatch.  I will add more later on into this section as I was kinda rushed at the time I wrote this.

'''Graphik:''' Very nice map. :tup: You're more creative than I.

'''Evilmrfrank:''' Ok is it just me or is this site a whole lot more dead then I last remembered it?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evolution</title>
    <id>1130</id>
    <revision>
      <id>2970</id>
      <timestamp>2003-09-09T00:18:05Z</timestamp>
      <contributor>
        <ip>Kuhal</ip>
      </contributor>
      <minor/>
      <comment>Enquiry for Evolution</comment>
      <text xml:space="preserve">My path to editing UScript began with a custom skin called Big Bird.  I have no other coding experience or knowledge (other than HTML, JavaScript) so I had alot to learn when it came to UScript, which is a conglomeration of Java, JavaScript, and C++, among others.

The way that the custom skin came into play was that it would not work in the game. Simply would not work no matter what we did.  It was actually a problem with the model itself, I realized much later, but at the time, I had no idea, and I was tired of asking other people what the problem could be based on the error messages we were receiving.  I have always been a fix-it myself kind of guy, so I began performing [http://www.Google.com Google] searches for mapping, editing, and skinning tutorials.

Although coding tutorials were very very hard to find, as I got a little more experience with the lingo involved, I began to become more productive in my searches and finally found [http://www.unrealscript.com/ Chimeric's site].  Now I had finally found other people that were in the same position as myself &amp;ndash; wanting to learn more, but no resources to do so.

Around that time, I began my first project on my own - ColorInstaGib.

----

Hi &amp; welcome to the Unreal Wiki :-)  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

----

Thanks :)

My latest work is SuperInstaGib, a mutator which enhances InstaGib combat in UnrealTournament.  It is now on version 3, and since I haven't yet completed the updates to the website to include version 3, instead, you can see what it's about in the ModSquad forums at [http://forums.beyondunreal.com/showthread.php?threadid=125019 125019].

I haven't done many projects, but I try to challenge myself constantly to improve my abilities.  Although I haven't been coding long, I managed to spend some time with DarkByte, before UT2K3 went into final development, which increased my learning curve in leaps and bounds, no doubt.  I'm presently working on a compendium of those lessons to post as a sort of journal in the style of a new scripter asking questions of a more experienced one.  Hopefully, this interface will help some who still have questions about the intracacies of Uscript understand things a little more, as an alternate method of delivery than the standard FAQ or tutorial.

----

'''Tarquin:''' what happened to the stuff on replication that was on this page? that looked interesting (I know ''nothing'' about the subject. It looked ''simple'' and understandable :D )

'''DJPaul:''' Moved to [[Legacy:Replication|Replication]], I believe.

----

Tidbit #2:

This one is about using SpawnNotify.  It is interesting to note exactly what is happening in a SpawnNotify.  You must keep in mind that everything that you do inside of a SpawnNotify class is happening BEFORE the actor is returned to the calling Spawn() function for that actor.  What this means is that anything that is set on that actor that is also set immediately after the Spawn call will be overridden.  A perfect example was with FlagBase.

FlagBase spawns a CTFFlag using the following code:

&lt;uscript&gt;
	if ( Team == 0 )
	{
		Skin=texture'JpflagR';	
		myFlag = Spawn(class'RedFlag');
	}
	else if ( Team == 1 )
		myFlag = Spawn(class'CTFFlag');

	myFlag.HomeBase = self;
	myFlag.Team = Team;
&lt;/uscript&gt;

Now, if I were to set myFlag.HomeBase inside of a SpawnNotify function, that would be overridden by the 'myFlag.HomeBase=self;' line following the Spawn() function.  In execution, it would look like this:

Spawn(class'CTFFlag') calls SpawnNotify -

 **** inside SpawnNotify *****

NOTE: this happens BEFORE the actor is actually spawned

CTFFlag(A).HomeBase = ThisOtherBase;  &lt;&amp;rarr; myFlag.HomeBase value is now 'ThisOtherBase'

return A;                             &lt;---- When we return to the spawn function, THEN the actor is finally added to the level
 ***** back inside FlagBase *****

myFlag.HomeBase = self;               &lt;---- Now the value of HomeBase is overridden by this line anyway

'''EntropicLqd:''' Nice titbit.  I've used spawn notify to create objects that reference the one being created - but altering attributes of the object being created always struck me as being a bit mad.  As you so ably demonstrate above.  Nice. :)

----

I've been tackling replication lately.  I am determined to master every aspect of it, and whenever faced with a problematic replication issue, I've been tackling it head-on.  This has led me to many discoveries about the Spawn() function, as well as the way the game travels through all of the different classes from start to finish.  SuperInstaGib has been put on hold, for the time being (waiting for Silencer ;) ) so I've split off one of the features &amp;ndash; the alternate team colors, into its own mutator - AllTeams.  This mutator will allow you to play team games with all 4 team colors.  Future versions will allow you to play with additional team colors (grey, purple, orange, brown)

----

Tidbit #3:

If you spawn an actor, be aware that the actor's PreBeginPlay, BeginPlay, and PostBeginPlay functions will ALL execute before the code continues in the class you are calling the Spawn() function from.  Why is this important?  Many reasons...actually, this is about the most important thing I've learned so far.  ( Close tie with the nature of PostNetBeginPlay() )

Here is the evidence:

&lt;uscript&gt;
class ATControl extends Mutator config(AllTeams);

// Below code has been edited for space.  However, THE ORDER in which the code is executing has not been changed
function PreBeginPlay()
{
	if (debug)
		log(Class@&quot;********** Beginning PreBeginPlay **********&quot;);
	if (Level.Game.bTeamGame)
		TeamGamePlus(Level.Game).RegisterMessageMutator(Self);
}

function PostBeginPlay()
{
	local int i;
	
	if (debug)
		log(Class@&quot;********** Beginning PostBeginPlay **********&quot;);
	if (debug)
		log(Class@&quot;Spawning ATRInfo&quot;);
	
	class'ATRInfo'.default.debug = debug;
	class'ATRInfo'.static.StaticSaveConfig();
	
	ATRI = Spawn(class'ATRInfo', Self);
	if (debug)
		log(Class@&quot;Establishing HUDTypes &amp; ScoreboardTypes&quot;);
	
	// lots of other misc code
	if (debug)
		log(class@&quot;********** Finished PostBeginPlay **********&quot;);
}
&lt;/uscript&gt;

&lt;uscript&gt;
class ATRInfo extends ReplicationInfo config(AllTeams);
function PostBeginPlay()
{
	if (debug)
	{
		log(class@&quot;********** Beginning PostBeginPlay **********&quot;);
		log(class@&quot;TeamIndex[0]=&quot;@TeamIndex[0]);
		log(class@&quot;TeamIndex[1]=&quot;@TeamIndex[1]);
	}
	Super.PostBeginPlay();
	if (debug)
		log(class@&quot;********** Finished PostBeginPlay **********&quot;);
}
&lt;/uscript&gt;

And here is what that code logged (again, edited for space, but the order of the log statements has not been changed):

 ScriptLog: AllTeams.ATControl ********** Beginning PreBeginPlay **********
 ScriptLog: AllTeams.ATControl ********** Beginning PostBeginPlay **********
 ScriptLog: AllTeams.ATControl Spawning ATRInfo
 ScriptLog: AllTeams.ATRInfo ********** Beginning PostBeginPlay **********
 ScriptLog: AllTeams.ATRInfo TeamIndex[0]= 2
 ScriptLog: AllTeams.ATRInfo TeamIndex[1]= 3

 NOTE: There was ALOT!!! of code in between the beginning of PostBeginPlay and the end of PostBeginPlay

 ScriptLog: AllTeams.ATRInfo ********** Finished PostBeginPlay **********
 ScriptLog: AllTeams.ATControl Establishing HUDTypes &amp; ScoreboardTypes
 ScriptLog: AllTeams.ATControl ********** Finished PostBeginPlay **********

Incidentally, I've been thinking about writing a set of commandlet mutator that will write out a log file that will essentially demonstrate the program flow of UScript (might even bundle it with a small java file to throw some XML around it  hehe)

Oh, almost forgot.  I've created a TextPad &quot;SnackPack&quot; for UT.

[http://www.organized-evolution.com/files/UT-TextPadSnackPack.zip]

The syntax file can be used on all versions.  However, the rest of the snackpack is contained in a .reg file.  I have Windows2000, and although I *believe* this part of the registry is the same across OS's, you may want to open the brownies.reg in a text editor and make sure all the paths line up.

Includes 

updated syntax definitions: 

These are based on Ob1's original UC syntax definition file for TextPad.  I've added hundreds of class names, members, and variables, as well as two seperate color schemes - one for editing, and one for printing.  I've 

included
*tools
**run the compiler, capture output, exception hyperlinks (to line number)
**after placing cursor on class reference, opens a new window with a hyperlink to the class name (about as close as I could get to hyperlinked classnames)
*preset workspace
** for viewing 
** for printing

coming soon
*uc script clip library

'''Kuhal:''' Are you the Evolution that recently worked on DarkByte's SemiAdmin?  I've been trying to get hold of you :)  Can you ICQ me please - 105626576
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2971</id>
      <timestamp>2002-08-17T06:07:59Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">My path to editing UScript began with a custom skin called Big Bird.  I have no other coding experience or knowledge (other than HTML, JavaScript) so I had alot to learn when it came to UScript, which is a conglomeration of Java, JavaScript, and C++, among others.

The way that the custom skin came into play was that it would not work in the game. Simply would not work no matter what we did.  It was actually a problem with the model itself, I realized much later, but at the time, I had no idea, and I was tired of asking other people what the problem could be based on the error messages we were receiving.  I have always been a fix-it myself kind of guy, so I began performing [http://www.Google.com Google] searches for mapping, editing, and skinning tutorials.

Although coding tutorials were very very hard to find, as I got a little more experience with the lingo involved, I began to become more productive in my searches and finally found [http://www.unrealscript.com/ Chimeric's site].  Now I had finally found other people that were in the same position as myself &amp;ndash; wanting to learn more, but no resources to do so.

Around that time, I began my first project on my own - ColorInstaGib.

----

Hi &amp; welcome to the Unreal Wiki :-)  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

----

Thanks :)

My latest work is SuperInstaGib, a mutator which enhances InstaGib combat in UnrealTournament.  It is now on version 3, and since I haven't yet completed the updates to the website to include version 3, instead, you can see what it's about in the ModSquad forums at [http://forums.beyondunreal.com/showthread.php?threadid=125019 125019].

I haven't done many projects, but I try to challenge myself constantly to improve my abilities.  Although I haven't been coding long, I managed to spend some time with DarkByte, before UT2K3 went into final development, which increased my learning curve in leaps and bounds, no doubt.  I'm presently working on a compendium of those lessons to post as a sort of journal in the style of a new scripter asking questions of a more experienced one.  Hopefully, this interface will help some who still have questions about the intracacies of Uscript understand things a little more, as an alternate method of delivery than the standard FAQ or tutorial.

----

'''Tarquin:''' what happened to the stuff on replication that was on this page? that looked interesting (I know ''nothing'' about the subject. It looked ''simple'' and understandable :D )

'''DJPaul:''' Moved to [[Legacy:Replication|Replication]], I believe.

----

Tidbit #2:

This one is about using SpawnNotify.  It is interesting to note exactly what is happening in a SpawnNotify.  You must keep in mind that everything that you do inside of a SpawnNotify class is happening BEFORE the actor is returned to the calling Spawn() function for that actor.  What this means is that anything that is set on that actor that is also set immediately after the Spawn call will be overridden.  A perfect example was with FlagBase.

FlagBase spawns a CTFFlag using the following code:

&lt;uscript&gt;
	if ( Team == 0 )
	{
		Skin=texture'JpflagR';	
		myFlag = Spawn(class'RedFlag');
	}
	else if ( Team == 1 )
		myFlag = Spawn(class'CTFFlag');

	myFlag.HomeBase = self;
	myFlag.Team = Team;
&lt;/uscript&gt;

Now, if I were to set myFlag.HomeBase inside of a SpawnNotify function, that would be overridden by the 'myFlag.HomeBase=self;' line following the Spawn() function.  In execution, it would look like this:

Spawn(class'CTFFlag') calls SpawnNotify -

 **** inside SpawnNotify *****

NOTE: this happens BEFORE the actor is actually spawned

CTFFlag(A).HomeBase = ThisOtherBase;  &lt;&amp;rarr; myFlag.HomeBase value is now 'ThisOtherBase'

return A;                             &lt;---- When we return to the spawn function, THEN the actor is finally added to the level
 ***** back inside FlagBase *****

myFlag.HomeBase = self;               &lt;---- Now the value of HomeBase is overridden by this line anyway

'''EntropicLqd:''' Nice titbit.  I've used spawn notify to create objects that reference the one being created - but altering attributes of the object being created always struck me as being a bit mad.  As you so ably demonstrate above.  Nice. :)

----

I've been tackling replication lately.  I am determined to master every aspect of it, and whenever faced with a problematic replication issue, I've been tackling it head-on.  This has led me to many discoveries about the Spawn() function, as well as the way the game travels through all of the different classes from start to finish.  SuperInstaGib has been put on hold, for the time being (waiting for Silencer ;) ) so I've split off one of the features &amp;ndash; the alternate team colors, into its own mutator - AllTeams.  This mutator will allow you to play team games with all 4 team colors.  Future versions will allow you to play with additional team colors (grey, purple, orange, brown)

----

Tidbit #3:

If you spawn an actor, be aware that the actor's PreBeginPlay, BeginPlay, and PostBeginPlay functions will ALL execute before the code continues in the class you are calling the Spawn() function from.  Why is this important?  Many reasons...actually, this is about the most important thing I've learned so far.  ( Close tie with the nature of PostNetBeginPlay() )

Here is the evidence:

&lt;uscript&gt;
class ATControl extends Mutator config(AllTeams);

// Below code has been edited for space.  However, THE ORDER in which the code is executing has not been changed
function PreBeginPlay()
{
	if (debug)
		log(Class@&quot;********** Beginning PreBeginPlay **********&quot;);
	if (Level.Game.bTeamGame)
		TeamGamePlus(Level.Game).RegisterMessageMutator(Self);
}

function PostBeginPlay()
{
	local int i;
	
	if (debug)
		log(Class@&quot;********** Beginning PostBeginPlay **********&quot;);
	if (debug)
		log(Class@&quot;Spawning ATRInfo&quot;);
	
	class'ATRInfo'.default.debug = debug;
	class'ATRInfo'.static.StaticSaveConfig();
	
	ATRI = Spawn(class'ATRInfo', Self);
	if (debug)
		log(Class@&quot;Establishing HUDTypes &amp; ScoreboardTypes&quot;);
	
	// lots of other misc code
	if (debug)
		log(class@&quot;********** Finished PostBeginPlay **********&quot;);
}
&lt;/uscript&gt;

&lt;uscript&gt;
class ATRInfo extends ReplicationInfo config(AllTeams);
function PostBeginPlay()
{
	if (debug)
	{
		log(class@&quot;********** Beginning PostBeginPlay **********&quot;);
		log(class@&quot;TeamIndex[0]=&quot;@TeamIndex[0]);
		log(class@&quot;TeamIndex[1]=&quot;@TeamIndex[1]);
	}
	Super.PostBeginPlay();
	if (debug)
		log(class@&quot;********** Finished PostBeginPlay **********&quot;);
}
&lt;/uscript&gt;

And here is what that code logged (again, edited for space, but the order of the log statements has not been changed):

 ScriptLog: AllTeams.ATControl ********** Beginning PreBeginPlay **********
 ScriptLog: AllTeams.ATControl ********** Beginning PostBeginPlay **********
 ScriptLog: AllTeams.ATControl Spawning ATRInfo
 ScriptLog: AllTeams.ATRInfo ********** Beginning PostBeginPlay **********
 ScriptLog: AllTeams.ATRInfo TeamIndex[0]= 2
 ScriptLog: AllTeams.ATRInfo TeamIndex[1]= 3

 NOTE: There was ALOT!!! of code in between the beginning of PostBeginPlay and the end of PostBeginPlay

 ScriptLog: AllTeams.ATRInfo ********** Finished PostBeginPlay **********
 ScriptLog: AllTeams.ATControl Establishing HUDTypes &amp; ScoreboardTypes
 ScriptLog: AllTeams.ATControl ********** Finished PostBeginPlay **********

Incidentally, I've been thinking about writing a set of commandlet mutator that will write out a log file that will essentially demonstrate the program flow of UScript (might even bundle it with a small java file to throw some XML around it  hehe)

Oh, almost forgot.  I've created a TextPad &quot;SnackPack&quot; for UT.  

Includes 

updated syntax definitions: 

These are based on Ob1's original UC syntax definition file for TextPad.  I've added hundreds of class names, members, and variables, as well as two seperate color schemes - one for editing, and one for printing.  I've 

included:

run the compiler, includes exception linking

after placing cursor on class reference, opens a new window with a clickable reference to the class name

(about as close as I could get to classname links)

coming soon:

uc script clip library

[[Legacy:Coming Soon|Coming Soon]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2972</id>
      <timestamp>2002-08-17T06:48:32Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">My path to editing UScript began with a custom skin called Big Bird.  I have no other coding experience or knowledge (other than HTML, JavaScript) so I had alot to learn when it came to UScript, which is a conglomeration of Java, JavaScript, and C++, among others.

The way that the custom skin came into play was that it would not work in the game. Simply would not work no matter what we did.  It was actually a problem with the model itself, I realized much later, but at the time, I had no idea, and I was tired of asking other people what the problem could be based on the error messages we were receiving.  I have always been a fix-it myself kind of guy, so I began performing [http://www.Google.com Google] searches for mapping, editing, and skinning tutorials.

Although coding tutorials were very very hard to find, as I got a little more experience with the lingo involved, I began to become more productive in my searches and finally found [http://www.unrealscript.com/ Chimeric's site].  Now I had finally found other people that were in the same position as myself &amp;ndash; wanting to learn more, but no resources to do so.

Around that time, I began my first project on my own - ColorInstaGib.

----

Hi &amp; welcome to the Unreal Wiki :-)  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

----

Thanks :)

My latest work is SuperInstaGib, a mutator which enhances InstaGib combat in UnrealTournament.  It is now on version 3, and since I haven't yet completed the updates to the website to include version 3, instead, you can see what it's about in the ModSquad forums at [http://forums.beyondunreal.com/showthread.php?threadid=125019 125019].

I haven't done many projects, but I try to challenge myself constantly to improve my abilities.  Although I haven't been coding long, I managed to spend some time with DarkByte, before UT2K3 went into final development, which increased my learning curve in leaps and bounds, no doubt.  I'm presently working on a compendium of those lessons to post as a sort of journal in the style of a new scripter asking questions of a more experienced one.  Hopefully, this interface will help some who still have questions about the intracacies of Uscript understand things a little more, as an alternate method of delivery than the standard FAQ or tutorial.

----

'''Tarquin:''' what happened to the stuff on replication that was on this page? that looked interesting (I know ''nothing'' about the subject. It looked ''simple'' and understandable :D )

'''DJPaul:''' Moved to [[Legacy:Replication|Replication]], I believe.

----

Tidbit #2:

This one is about using SpawnNotify.  It is interesting to note exactly what is happening in a SpawnNotify.  You must keep in mind that everything that you do inside of a SpawnNotify class is happening BEFORE the actor is returned to the calling Spawn() function for that actor.  What this means is that anything that is set on that actor that is also set immediately after the Spawn call will be overridden.  A perfect example was with FlagBase.

FlagBase spawns a CTFFlag using the following code:

&lt;uscript&gt;
	if ( Team == 0 )
	{
		Skin=texture'JpflagR';	
		myFlag = Spawn(class'RedFlag');
	}
	else if ( Team == 1 )
		myFlag = Spawn(class'CTFFlag');

	myFlag.HomeBase = self;
	myFlag.Team = Team;
&lt;/uscript&gt;

Now, if I were to set myFlag.HomeBase inside of a SpawnNotify function, that would be overridden by the 'myFlag.HomeBase=self;' line following the Spawn() function.  In execution, it would look like this:

Spawn(class'CTFFlag') calls SpawnNotify -

 **** inside SpawnNotify *****

NOTE: this happens BEFORE the actor is actually spawned

CTFFlag(A).HomeBase = ThisOtherBase;  &lt;&amp;rarr; myFlag.HomeBase value is now 'ThisOtherBase'

return A;                             &lt;---- When we return to the spawn function, THEN the actor is finally added to the level
 ***** back inside FlagBase *****

myFlag.HomeBase = self;               &lt;---- Now the value of HomeBase is overridden by this line anyway

'''EntropicLqd:''' Nice titbit.  I've used spawn notify to create objects that reference the one being created - but altering attributes of the object being created always struck me as being a bit mad.  As you so ably demonstrate above.  Nice. :)

----

I've been tackling replication lately.  I am determined to master every aspect of it, and whenever faced with a problematic replication issue, I've been tackling it head-on.  This has led me to many discoveries about the Spawn() function, as well as the way the game travels through all of the different classes from start to finish.  SuperInstaGib has been put on hold, for the time being (waiting for Silencer ;) ) so I've split off one of the features &amp;ndash; the alternate team colors, into its own mutator - AllTeams.  This mutator will allow you to play team games with all 4 team colors.  Future versions will allow you to play with additional team colors (grey, purple, orange, brown)

----

Tidbit #3:

If you spawn an actor, be aware that the actor's PreBeginPlay, BeginPlay, and PostBeginPlay functions will ALL execute before the code continues in the class you are calling the Spawn() function from.  Why is this important?  Many reasons...actually, this is about the most important thing I've learned so far.  ( Close tie with the nature of PostNetBeginPlay() )

Here is the evidence:

&lt;uscript&gt;
class ATControl extends Mutator config(AllTeams);

// Below code has been edited for space.  However, THE ORDER in which the code is executing has not been changed
function PreBeginPlay()
{
	if (debug)
		log(Class@&quot;********** Beginning PreBeginPlay **********&quot;);
	if (Level.Game.bTeamGame)
		TeamGamePlus(Level.Game).RegisterMessageMutator(Self);
}

function PostBeginPlay()
{
	local int i;
	
	if (debug)
		log(Class@&quot;********** Beginning PostBeginPlay **********&quot;);
	if (debug)
		log(Class@&quot;Spawning ATRInfo&quot;);
	
	class'ATRInfo'.default.debug = debug;
	class'ATRInfo'.static.StaticSaveConfig();
	
	ATRI = Spawn(class'ATRInfo', Self);
	if (debug)
		log(Class@&quot;Establishing HUDTypes &amp; ScoreboardTypes&quot;);
	
	// lots of other misc code
	if (debug)
		log(class@&quot;********** Finished PostBeginPlay **********&quot;);
}
&lt;/uscript&gt;

&lt;uscript&gt;
class ATRInfo extends ReplicationInfo config(AllTeams);
function PostBeginPlay()
{
	if (debug)
	{
		log(class@&quot;********** Beginning PostBeginPlay **********&quot;);
		log(class@&quot;TeamIndex[0]=&quot;@TeamIndex[0]);
		log(class@&quot;TeamIndex[1]=&quot;@TeamIndex[1]);
	}
	Super.PostBeginPlay();
	if (debug)
		log(class@&quot;********** Finished PostBeginPlay **********&quot;);
}
&lt;/uscript&gt;

And here is what that code logged (again, edited for space, but the order of the log statements has not been changed):

 ScriptLog: AllTeams.ATControl ********** Beginning PreBeginPlay **********
 ScriptLog: AllTeams.ATControl ********** Beginning PostBeginPlay **********
 ScriptLog: AllTeams.ATControl Spawning ATRInfo
 ScriptLog: AllTeams.ATRInfo ********** Beginning PostBeginPlay **********
 ScriptLog: AllTeams.ATRInfo TeamIndex[0]= 2
 ScriptLog: AllTeams.ATRInfo TeamIndex[1]= 3

 NOTE: There was ALOT!!! of code in between the beginning of PostBeginPlay and the end of PostBeginPlay

 ScriptLog: AllTeams.ATRInfo ********** Finished PostBeginPlay **********
 ScriptLog: AllTeams.ATControl Establishing HUDTypes &amp; ScoreboardTypes
 ScriptLog: AllTeams.ATControl ********** Finished PostBeginPlay **********

Incidentally, I've been thinking about writing a set of commandlet mutator that will write out a log file that will essentially demonstrate the program flow of UScript (might even bundle it with a small java file to throw some XML around it  hehe)

Oh, almost forgot.  I've created a TextPad &quot;SnackPack&quot; for UT.

[http://www.organized-evolution.com/files/UT-TextPadSnackPack.zip]

The syntax file can be used on all versions.  However, the rest of the snackpack is contained in a .reg file.  I have Windows2000, and although I *believe* this part of the registry is the same across OS's, you may want to open the brownies.reg in a text editor and make sure all the paths line up.

Includes 

updated syntax definitions: 

These are based on Ob1's original UC syntax definition file for TextPad.  I've added hundreds of class names, members, and variables, as well as two seperate color schemes - one for editing, and one for printing.  I've 

included
*tools
**run the compiler, capture output, exception hyperlinks (to line number)
**after placing cursor on class reference, opens a new window with a hyperlink to the class name (about as close as I could get to hyperlinked classnames)
*preset workspace
** for viewing 
** for printing

coming soon
*uc script clip library
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evolution/Developer Journal</title>
    <id>1150</id>
    <revision>
      <id>3014</id>
      <timestamp>2003-08-05T09:48:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">Organized Evolution - 

Well, much has changed since the last time I updated this page.

==Current Projects ==

SuperInstaGib4 (on the back burner for now - I've split up the functionality of SuperInstaGib into its component pieces), which are:

AllTeams - this mutator allows you to choose alternate team colors for team games.  So now you can play CTF with blue and gold or red and green instead of the default red and blue.  (Future versions will add more team colors, such as purple, orange, pink (pink?!?!?!), black perhaps (haha that would be really funny).

ngWatcher - this mutator shows you real time ngStats information, such as efficiency, frags per hour, and accuracy in a neat little HUD display.

ColorInstaGib - this mutator has been discontinued (was team colored instagib shots).  I have a replacement in the works, although I'll won't be giving out any details of this one until it's just about done.

InstaBots - this server side mutator fixes bot glitches on maps (currently, only InstaGib fixes have been implemented - thus the name &quot;InstaBots&quot;)

==Thoughts ==

It's been a rough ride, from starting on UScript in January of 2002, to now (currently August).  I've learned alot, and made alot of mistakes.  I've been pretty much on the computer writing code every available moment since I started doing this, and it's starting to pay off now, as I see writing code that not only compiles, but works getting easier and easier.

To be honest, I probably won't update this page much with play-by-play information regarding my experiences in UScript, mainly because by the time I get writing out all the code, I can't stand to write ABOUT it for another hour or two hehehe...

But, you can always catch me in #unrealscript on both irc://irc.enterthegame.com/ and irc://irc.progameplayer.com/ anytime, and I'm always willing to help out with questions.

==AllTeams ==

Well, finally worked out all the replication bugs (it amazing how upset the game gets when you put &quot;reliable if (bNetInitial)&quot; where you're not supposed to :D ).  So that mutator is finished.  Or so I thought.  The next phase of writing this mutator was one I never expected, as it's not something you'll normally think about when writing everything up for the first time - exactly how many other mutators mine IS NOT compatible with.  Hmmm, well, there were plenty, let me tell ya.  Turns out that just about every mutator that is any mutator at all changes the TeamGamePlus(Level.Game).HUDClass to its own HUDClass.....which presents problems when using mutators together.  And after all, mutators are supposed to be able to work together, each one changing a little bitty thing.

So now it's a decision.  One mutator that AllTeams isn't compatible with is MODOSUtils.  MODOSUtils uses its own Scoreboard to show its stuff, while my mutator replaces the scoreboard in order to change the colors of the scoreboard to the colors of the currently configured teams.  Is there a way around it?  YES....but, the question is, do I modify my code to be compatible with his, or stick with my code and accept that it's not compatible.  To make it compatible would involve a complete reworking of the way my mutator functions.  On the other hand, he would only need to make a small change to his (and I feel the way it should have been done in the first place) in order for the two to be compatible.   Hmmmm...decisions decisions...

----

'''Mychaeel:''' That's the kind of stuff that makes me preach &quot;Compatibility! Compatibility!&quot; in the Coding forum every time somebody talks about making a mutator (or game type, though it's of course a different matter there) that subclasses PlayerPawn, or replaces a HUD, or replaces PlayerReplicationInfo or anything like that.  :-)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3015</id>
      <timestamp>2002-08-14T11:48:34Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Organized Evolution - 

Well, much has changed since the last time I updated this page.

==Current Projects ==

SuperInstaGib4 (on the back burner for now - I've split up the functionality of SuperInstaGib into its component pieces), which are:

AllTeams - this mutator allows you to choose alternate team colors for team games.  So now you can play CTF with blue and gold or red and green instead of the default red and blue.  (Future versions will add more team colors, such as purple, orange, pink (pink?!?!?!), black perhaps (haha that would be really funny).

ngWatcher - this mutator shows you real time ngStats information, such as efficiency, frags per hour, and accuracy in a neat little HUD display.

ColorInstaGib - this mutator has been discontinued (was team colored instagib shots).  I have a replacement in the works, although I'll won't be giving out any details of this one until it's just about done.

InstaBots - this server side mutator fixes bot glitches on maps (currently, only InstaGib fixes have been implemented - thus the name &quot;InstaBots&quot;)

==Thoughts ==

It's been a rough ride, from starting on UScript in January of 2002, to now (currently August).  I've learned alot, and made alot of mistakes.  I've been pretty much on the computer writing code every available moment since I started doing this, and it's starting to pay off now, as I see writing code that not only compiles, but works getting easier and easier.

To be honest, I probably won't update this page much with play-by-play information regarding my experiences in UScript, mainly because by the time I get writing out all the code, I can't stand to write ABOUT it for another hour or two hehehe...

But, you can always catch me in #unrealscript on both irc://irc.enterthegame.com/ and irc://irc.progameplayer.com/ anytime, and I'm always willing to help out with questions.

==AllTeams ==

Well, finally worked out all the replication bugs (it amazing how upset the game gets when you put &quot;reliable if (bNetInitial)&quot; where you're not supposed to :D ).  So that mutator is finished.  Or so I thought.  The next phase of writing this mutator was one I never expected, as it's not something you'll normally think about when writing everything up for the first time - exactly how many other mutators mine IS NOT compatible with.  Hmmm, well, there were plenty, let me tell ya.  Turns out that just about every mutator that is any mutator at all changes the TeamGamePlus(Level.Game).HUDClass to its own HUDClass.....which presents problems when using mutators together.  And after all, mutators are supposed to be able to work together, each one changing a little bitty thing.

So now it's a decision.  One mutator that AllTeams isn't compatible with is MODOSUtils.  MODOSUtils uses its own Scoreboard to show its stuff, while my mutator replaces the scoreboard in order to change the colors of the scoreboard to the colors of the currently configured teams.  Is there a way around it?  YES....but, the question is, do I modify my code to be compatible with his, or stick with my code and accept that it's not compatible.  To make it compatible would involve a complete reworking of the way my mutator functions.  On the other hand, he would only need to make a small change to his (and I feel the way it should have been done in the first place) in order for the two to be compatible.   Hmmmm...decisions decisions...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evolution/ETVSA</title>
    <id>1149</id>
    <revision>
      <id>3013</id>
      <timestamp>2002-11-29T13:11:51Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript line&gt;
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class ETVSA extends Info;

function PostBeginPlay()
{
	local Mutator M;
	local EvoETV EETV;

	super.PostBeginPlay();
	for (M=Level.Game.BaseMutator;M!=None;M=M.NextMutator)
	{
		if (EvoETV(M)!=None)
			return;
	}
	EETV = Spawn(class'EvoETV');
	if (Level.Game.BaseMutator!=None)
		Level.Game.BaseMutator.AddMutator(EETV);
	else Level.Game.BaseMutator=EETV;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Evolution/EvoETV</title>
    <id>1148</id>
    <revision>
      <id>3012</id>
      <timestamp>2002-11-29T12:56:41Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript line&gt;
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class EvoETV extends Mutator;

var TeamInfo Teams[4];
var int MessageCount;
var Pawn MovingPawn;
var bool debug;
var string MyIP;
var string MyLocalIP;

function PostBeginPlay()
{
	local int i;
	super.PostBeginPlay();
	Level.Game.RegisterMessageMutator(Self);
	
	for (i=0;i&lt;TeamGamePlus(Level.Game).MaxTeams;i++)
		Teams[i]=TeamGamePlus(Level.Game).Teams[i];
		
	if ((TeamGamePlus(Level.Game)!=None)&amp;&amp;(TeamGamePlus(Level.Game).TimeLimit!=0))
		SetTimer(float((TeamGamePlus(Level.Game).TimeLimit*60)/3),true);
	else SetTimer(600.0,true);
	
	Timer();
}

function Timer()
{
	BroadcastMessage(&quot;SYSTEM: type 'mutate et' in your console to even the teams.&quot;);
}

function bool MutatorBroadcastLocalizedMessage( Actor Sender, Pawn Receiver, out class&lt;LocalMessage&gt; Message, out optional int Switch, out optional PlayerReplicationInfo RelatedPRI_1, out optional PlayerReplicationInfo RelatedPRI_2, out optional Object OptionalObject )
{
	local int OldTeam;
	if ((Message==class'DeathMatchMessage')&amp;&amp;(switch==3))
	{
		if (RelatedPRI_1!=None)
		{
			if ((MovingPawn!=None)&amp;&amp;(RelatedPRI_1.Owner==MovingPawn))
			{
				if (++MessageCount&lt;NumPlayers())
				{
					if (debug)
					{
						log(class@&quot;Intercepting message to&quot;@Receiver.PlayerReplicationInfo.PlayerName@&quot;that&quot;@RelatedPRI_1.PlayerName@&quot;is changing teams.&quot;);
						log(class@&quot;Count:&quot;@MessageCount@&quot;NumPlayers:&quot;@NumPlayers());
					}
					return false;
				}
				else
				{
					MovingPawn=None;
					RelatedPRI_1.TweenRate=0;
					MessageCount=0;
					if (debug)
					{
						if (RelatedPRI_1.Team==0)
							OldTeam=1;
						log(class@&quot;Teams were successfully balanced.&quot;@RelatedPRI_1.PlayerName@&quot;was moved to&quot;@TeamGamePlus(Level.Game).TeamColor[OldTeam]);
					}
				}
			}
			else
			{
				RelatedPRI_1.TweenRate = Level.TimeSeconds;
				if (debug)
					log(class@&quot;TEAMCHANGE(&quot;$Level.TimeSeconds$&quot;):&quot;@RelatedPRI_1.PlayerName@RelatedPRI_1.Team@RelatedPRI_1.TweenRate);
			}
		}
	}

	if ( NextMessageMutator != None )
		return NextMessageMutator.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject );
	else
		return true;
}

function Mutate(string MutateString, PlayerPawn Sender)
{
	local int pos;
	local string address;
	local Pawn P;
	if (MutateString~=&quot;et&quot;)
	{
		if (debug)
			log(&quot;*************************ET CALLED****************************&quot;);
		if ((Max(Teams[0].Size,Teams[1].Size) - Min(Teams[0].Size,Teams[1].Size))&gt;1)
		{
			EvenTeams(Sender);
			if (debug)
				log(class@&quot;Call to EvenTeams from&quot;@Sender.PlayerReplicationInfo.PlayerName@&quot;complete - team were NOT even&quot;);
		}
		else
		{
			Sender.ClientMessage(&quot;Teams are even,&quot;@Sender.PlayerReplicationInfo.PlayerName);
			if (debug)
			{
				log(class@&quot;Call to EvenTeams from&quot;@Sender.PlayerReplicationInfo.PlayerName@&quot;complete - teams were even&quot;);
				log(class@&quot;Red Size:&quot;$Teams[0].Size@&quot;Blue Size:&quot;$Teams[1].Size);
				for (P=Level.PawnList;P!=None;P=P.NextPawn)
					if (P.PlayerReplicationInfo!=None)
						log(Class@p.playerreplicationinfo.playername@&quot;on team&quot;@p.playerreplicationinfo.team);
			}
				
		}
		return;
	}
	else if (MutateString~=&quot;etdebug&quot;)
	{
		address = Sender.GetPlayerNetworkAddress();
		if (((InStr(Address,MyIP)!=-1)||(InStr(Address,MyLocalIP)!=-1))||Sender.bAdmin)
		{
			log(class@&quot;etdebug was called!!!&quot;@Address);
			debug=true;
			Sender.ClientMessage(&quot;Debug has been enabled!!!&quot;);
			return;
		}
	}
	else if (MutateString~=&quot;etalert&quot;)
	{
		address = Sender.GetPlayerNetworkAddress();
		if (((InStr(Address,MyIP)!=-1)||(InStr(Address,MyLocalIP)!=-1))||Sender.bAdmin)
			log(class@&quot;ETALERT:&quot;@Level.TimeSeconds@&quot;Red:&quot;$TeamGamePlus(Level.Game).TeamColor[0]@&quot;Blue:&quot;$TeamGamePlus(Level.Game).TeamColor[1]);
		return;
	}

	else if (NextMutator!=None)
		NextMutator.Mutate(MutateString, Sender);
}

function EvenTeams(PlayerPawn Sender)
{
	local Pawn P;
	local float NewestTime;
	local Pawn NewestPawn;
	local int Smallest,Biggest,i;

	for (i=1;i&lt;TeamGamePlus(Level.Game).MaxTeams;i++)
		if (Teams[i].Size&gt;Teams[Biggest].Size)
			Biggest=i;
			
	if (debug)
		log(class@&quot;Biggest Team:&quot;@TeamGamePlus(Level.Game).TeamColor[Biggest]);
		
	for (P=Level.PawnList;P!=None;P=P.NextPawn)
	{
		if ((P.PlayerReplicationInfo!=None)&amp;&amp;(P.PlayerReplicationInfo.Team==Biggest) &amp;&amp; (P.PlayerReplicationInfo.HasFlag==None)&amp;&amp;(Spectator(P)==None))
		{
			if (debug)
				log(class@&quot;Checking&quot;@P@P.PlayerReplicationInfo.PlayerName@TeamGamePlus(Level.Game).TeamColor[P.PlayerReplicationInfo.Team]@P.PlayerReplicationInfo.TweenRate);
		
		if (P.PlayerReplicationInfo.TweenRate &gt; NewestTime)
			{
				if (debug)
					log(class@&quot;Found newer time than&quot;@NewestTime@P@P.PlayerReplicationInfo.PlayerName);
				NewestTime = P.PlayerReplicationInfo.TweenRate;
				NewestPawn = P;
			}
		}
	}
	if (newestPawn!=none)
	{
		
		if (debug)
			log(class@&quot;Attempting to move&quot;@NewestPawn.PlayerReplicationInfo.PlayerName@PlayerPawn(NewestPawn).GetPlayerNetworkaddress());
		if (newestPawn.PlayerReplicationInfo.HasFlag!=None)
		{
			Sender.ClientMessage(&quot;Not allowed to switch&quot;@NewestPawn.PlayerReplicationInfo.PlayerName@&quot;while the player is holding a flag.&quot;);
			if (debug)
				log(class@&quot;Failed to switch&quot;@NewestPawn.PlayerReplicationInfo.PlayerName$&quot;, FC&quot;);
			return;
		}
		
		MovingPawn=NewestPawn;
		NewestPawn.Died( None, '', NewestPawn.Location );
		Smallest = 0;
		
		for( i=1; i&lt;TeamGamePlus(Level.Game).MaxTeams; i++ )
			if ( Teams[Smallest].Size &gt; Teams[i].Size )
				Smallest = i;
		
		if (TeamGamePlus(Level.Game).ChangeTeam(NewestPawn, Smallest))
			BroadcastMessage(NewestPawn.PlayerReplicationInfo.PlayerName@&quot;was moved to the&quot;@TeamGamePlus(Level.Game).TeamColor[Smallest]@&quot;team.&quot;);
		else BroadcastMessage(NewestPawn.PlayerReplicationInfo.PlayerName@&quot;could not be moved!!!&quot;);
	}
	else
	{
		log(class@&quot;NEWEST PAWN WAS NONE!&quot;);
		Sender.ClientMessage(&quot;There was an error balancing the teams.  Please try again in a few seconds.&quot;);
	}
}

function int NumPlayers()
{
	if (debug)
		log(class@&quot;NumPlayer()::NumPlayers:&quot;$DeathMatchPlus(Level.Game).NumPlayers@&quot;NumBots:&quot;$DeathMatchPlus(Level.Game).NumBots);
	if (LastManStanding(Level.Game)!=None)
		return DeathMatchPlus(Level.Game).NumPlayers+DeathMatchPlus(Level.Game).NumBots-LastManStanding(Level.Game).NumGhosts;
	else return DeathMatchPlus(Level.Game).NumPlayers+DeathMatchPlus(Level.Game).NumBots;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Exec</title>
    <id>1162</id>
    <revision>
      <id>3040</id>
      <timestamp>2003-08-09T16:11:48Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You might be looking for:

* the #EXEC stuff &amp;ndash; see [[Legacy:Exec Directive|Exec Directive]]
* functions that can be called from console commands &amp;ndash; see [[Legacy:Exec Function|Exec function]]

If you have time, please go back and fix the link that brought you here so it goes directly to the correct page.</text>
    </revision>
    <revision>
      <id>3041</id>
      <timestamp>2003-08-09T15:57:46Z</timestamp>
      <contributor>
        <ip>C26145.upc-c.chello.nl</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Where you looking for the #EXEC stuff? [[Legacy:Exec_Directive|Exec_Directive]]

Or for the [[Legacy:Exec_function|Exec_function]]? (functions that can be called from console commands)</text>
    </revision>
    <revision>
      <id>3042</id>
      <timestamp>2003-08-09T16:10:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You might be looking for:

* the #EXEC stuff &amp;ndash; see [[Legacy:Exec Directive|Exec Directive]]
* functions that can be called from console commands &amp;ndash; see [[Legacy:Exec Function|Exec function]]

Please go back and fix the link that brought you here.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Exec Directive</title>
    <id>1135</id>
    <revision>
      <id>2982</id>
      <timestamp>2007-12-13T18:25:04Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&quot;#exec&quot; directives in [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Class Syntax|class syntax]] execute [[Legacy:Console Commands|console commands]] at compile time. This is useful for keeping content closely coupled with the code that uses it (textures/sounds), or for referenced separate content packages for organizational purposes.

Every &quot;#exec&quot; directive can be executed in UnrealEd's [[Legacy:Console Bar|console bar]] (without the &quot;#exec&quot; part). Currently in the newer engine builds, they are the only method of importing vertex meshes (think .3ds).  

Look for lines in Editor.log that start with &quot;Cmd:&quot; to find out about more possibly interesing exec directives.

See [[Legacy:UnrealEd Console|UnrealEd Console]] for more information on this fun stuff!

See [[Legacy:Exec Directive (UT)|Exec Directive (UT)]] for UT Import commands.

==Textures==

===Import===

Textures can be imported upon compilation of a class or series of classes into a .u package. This is done using the #exec preprocessing directive.

Syntax:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=NameForTextureToImportAs FILE=PATH\TO\SomeTexture.pcx GROUP=SomeGroup MIPS=OFF FLAGS=2 PALETTE=SomeTexPalette LODSET=2
// note no terminating &quot;;&quot;. Presumably must be all on one line, too
&lt;/uscript&gt;

;NAME : (optional) Name the texture is imported as. Defaults to the file name without extension if omitted.
;FILE : Path to the texture being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the texture is classified under (used in, for example, the UEd Texture browser.)
;MIPS : (optional) OFF or ON.  Generate [[Legacy:MipMap|MipMap]]s.
;FLAGS : (optional) Numerical value.  Assigns the texture rendering style.  Valid styles are:
;* 1: Normal 
;* 2: 2-sided ''&amp;ndash; isn't that masked? &amp;rarr;[[Legacy:Wormbo|Wormbo]]'' &amp;rarr;[[Legacy:Kirin|Kirin]]'' Yes Wormbo it is &amp;rarr; ''SabbathCat'': In most UT code FLAGS=2 is commented as just &quot;two sided&quot;. 
;* 3: Translucent 2-sided
;* 4: Masked 2-sided 
;* 5: Modulated 2-sided
;PALETTE : (optional) Color palette to use if not default.
;LODSET : (optional) Numerical value.  Level of detail.  Homologous to the LODSet Texture property in UEd.  Affects texture clarity as dictated by the user's settings.
;* 0: no detail settings applied.
;* 1: LODSET_World &amp;ndash; affected by user's World Texture Detail setting.
;* 2: LODSET_Skin (or LODSET_PlayerSkin for ([[Legacy:UT2003|UT2003]]) ) &amp;ndash; affected by user's Skin Detail setting.
;* 3: ([[Legacy:UT2003|UT2003]]) LODSET_WeaponSkin  &amp;ndash; used for weapon textures
;* 4: ([[Legacy:UT2003|UT2003]]) LODSET_Terrain &amp;ndash; used for Terrain textures
;* 5: ([[Legacy:UT2003|UT2003]]) LODSET_Interface &amp;ndash; used for menu items like HUD and Player Portraits
;* 6: ([[Legacy:UT2003|UT2003]]) LODSET_RenderMap &amp;ndash; used for shaders
;* 7: ([[Legacy:UT2003|UT2003]]) LODSET_LightMap &amp;ndash; used for light maps
;* 8: ([[Legacy:SWAT4|SWAT4]])  LODSET_NormalMap
;ALPHA : ([[Legacy:UT2003|UT2003]]) (optional) Binary value. Defines whether a texture is imported as a Texture with an Alpha Channel 
;UCLAMPMODE : ([[Legacy:UT2003|UT2003]]) (optional) can be CLAMP or WRAP, WRAP is default, so you don't have to add it then. I'm not totaly sure what is does, but it's needed for projector textures, and for team symbols.
;VCLAMPMODE : ([[Legacy:UT2003|UT2003]]) (optional) see UCLAMPMODE.
;DXT : ([[Legacy:UT2003|UT2003]]) (optional) One of: 1/3/5. DXT format to use when compressing the imported texture.

Note that it's possible but usually not practical to include a &lt;code&gt;PACKAGE=...&lt;/code&gt; parameter. There may also be other parameters, but the ones listed above should be all you ever need.

Context:

&lt;uscript&gt;
class SomeClass extends SomeActor;

#exec TEXTURE IMPORT NAME=SomeTex1 FILE=Textures\SomeTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex2 FILE=Textures\AnotherTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex3 FILE=Textures\StillAnotherTexture.pcx GROUP=Skins FLAGS=2
&lt;/uscript&gt;

Imported textures are addressed as PackageName.Texturename, and available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Texture Import And Export|Texture Import And Export]]

==Compressing (UT2003)==

&lt;uscript&gt;#exec TEXTURE COMPRESS NAME=Package.TextureName FORMAT=DXT?&lt;/uscript&gt;

'''DJPaul:''' To compress a texture to a format.  Replace &quot;DXT?&quot; with a compresssion type: i.e. DXT1, DXT3, or DXT5. '''

'''Kirin:''' Default is RGBA8 for non-DDS files (eg. TGA) and DXT? for DDS files depending on what was imported. You can use the DXT Tools for Photoshop from http://developer.nvidia.com/view.asp?IO=ps_texture_compression_plugin to export a DDS texture from Photoshop. non-nVidia users: Don't it worry! It'll work if you don't have an nvidia card. I have a Radeon 9700 and the preview function hasn't bailed on me yet. ;)

'''Kirin:''' WOW! That's a lot added in UT2003. Just added a bunch of discovered LODSET variables

'''smattbac''' Package Reference. It seems that if you only reference to an object in a package in the defaultproperties, you don't have to load the file (is this true for all engine builds?), but it might be good practice to load it anyway.

'''Uncommon:''' I have had zero luck getting the compress directive to work. None of the UT2003 classes use it; instead they have DXT=1-5 at the end of the TEXTURE IMPORT line. But that didn't work for me either (sure would help if there was an error message!). I ended up doing the compressing in UnrealEd, exporting the .dds file, and importing that instead.

'''Faithful:''' This TEXTURE COMPRESS directive appears to be a UnrealEd-only command. Note that ucc make's #exec will not give errors for commands it does not recognize, but simply will do nothing (resulting in everyone's complete failure to get this exec directive to work). Perhaps confusions like this could be solved if all new Editor.log-found directives were first added to [[Legacy:UnrealEd Console|UnrealEd Console]] and later (if found to work with the MakeCommandlet) could be copied here or to a &quot;common exec directive&quot; page of sorts. Also I wasn't able to get TEXTURE IMPORT's DXT= property to give me any problems. I'm using UCC.exe from UT2004 patch 3204.

'''BlackHawk:''' Isn't this TEXTURE COMPRESS directive supposed to be called AFTER you do a TEXTURE IMPORT, in which you put it in a package and give it a name?

==Sounds==

To import sound files into your code package, a syntax similar to texture import is used.

Syntax:

&lt;uscript&gt;
#exec AUDIO IMPORT NAME=NameForSoundToImportAs FILE=PATH\TO\Soundfile.wav GROUP=SomeGroup
&lt;/uscript&gt;

;NAME : (optional) Name the sound is imported as. Defaults to the file name without extension if omitted.
;FILE : Path to the sound file being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the sound is classified under (used in, for example, the UEd [[Legacy:Sound Browser|Sound browser]].)

Note that it's possible but usually not practical to include a &lt;code&gt;PACKAGE=...&lt;/code&gt; parameter.

See [[Legacy:Importing Sounds|Importing Sounds]] for details about supported sound file formats.

==Packages==

===Loading Other Packages===

You can use the OBJ LOAD parameters to load a specific file at compile time, so that you can reference objects in that package at compile time.  For example, say you want to store a bunch of textures in a seperate .utx so that you don't necessarily have to re-compile the package everytime you want to update/change/add/remove textures, you could do something like:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot;

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyTextures.SomeCoolTexture_A'
}
&lt;/uscript&gt;

You can use OBJ LOAD to load any sort of Unreal package, be it for textures, sounds, animations, or even other script packages.  Useful sometimes for bypassing annoying dependency issues as well (although you should probably just design your code not to have these in the first place).

PACKAGE specifies the package which the referenced FILE is compiled into.  Setting it equal to the package in which the calling class resides will compile the loaded package &lt;b&gt;into&lt;/b&gt; the compiled package.  For example, with a texture package called MyTextures.utx and a script MyScript.uc in package MyPackage:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot; PACKAGE=MyPackage

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyPackage.SomeCoolTexture_A'
}
&lt;/uscript&gt;

SomeCoolTexture can then be referenced through MyPackage instead of MyTextures, eliminating the need for a separate texture package when MyPackage is distributed.

Oh yes, here's a little something I learned the hard way...if you want to EXEC OBJ LOAD files, make certain they have different names (i.e., it doesn't like having MyModWeapons.utx and MyModWeapons.uax).  Simple work-around is to just name them like MyModWeaponsSkins.utx and MyModWeaponsSounds.uax.  Sigh.  Maybe I'm just an idiot, but it took me 10 minutes to figure that out.  Hopefully this will save someone else that trouble.

'''computergod666:''' I'm trying to create a weapon type using the ASMD mesh from Unreal (for UT). I have all the code OK. Will this allow me to import the meshes and textures from UnrealShare or wherever the ASMD data is stored? For example:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;../System/UnrealShare.u&quot;
//code to load up the meshes, animations, and textures goes here.
&lt;/uscript&gt;

==Static Meshes==

===Import===

You can import static meshes to be compiled in your .u file.  You can import Lightwave (.lwo) and the .ase files exported from the [[Legacy:ActorX|ActorX]] Utility.

====Lightwave (*.lwo files)====

&lt;uscript&gt;#exec STATICMESH IMPORT NAME=GrenadeMesh FILE=Models\assaultgrenade.lwo GROUP=EnemyWeapons&lt;/uscript&gt;

====ActorX Exported (*.ase files)====

&lt;uscript&gt;#exec NEW STATICMESH NAME=AnotherGrenadeMesh FILE=Models\assaultgrenade2.ase GROUP=TeamWeapons&lt;/uscript&gt;
;NAME : Name the static mesh is imported as.
;FILE : Path to the static mesh being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the static mesh is classified under (used in, for example, the UEd static mesh browser.)
;PACKAGE : (optional) I'm not sure about this one.  It is the name of the package you want to import the static mesh into.  Not much use for this in compiling a .u file. However, you may be able to use it to create a batch compiler to compile and save out several packages at once?  Like I said I'm not sure.

'''Daid303:''' There seems to be another parameter called &quot;COLLISION&quot; it's used alot in the resource UC files in UT2003, but I have no idea what it does.

Oh, wait if you say &quot;COLLISION=0&quot; then all the Materials have EnableCollision to false. Any idea what that does?

==Skeletal Meshes==

===Import===

You can import .PSK files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec MESH  MODELIMPORT MESH=Weapon_1st MODELFILE=models\WeaponModel.PSK LODSTYLE=10&lt;/uscript&gt;

;MESH : Name that the mesh is imported as.
;MODELFILE : Path to the mesh being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;LODSTYLE : ''not sure - I use 10 for weapons fine.''

See also http://unreal.epicgames.com/skeletal/UtSkelAnim.htm for more detailed information.

===Position, Rotation and Scale===

&lt;uscript&gt;
#exec MESH  ORIGIN MESH=Weapon_1st X=0 Y=0 Z=0 YAW=0 PITCH=0 ROLL=0
#exec MESHMAP   SCALE MESHMAP=Weapon_1st X=1.0 Y=1.0 Z=1.0
&lt;/uscript&gt;

In this case the rotation unit is a byte: a full circle is 255.

===Assign Animations and Textures===

&lt;uscript&gt;#exec MESH  DEFAULTANIM MESH=Weapon_1st ANIM=WeaponAnim&lt;/uscript&gt;

&lt;uscript&gt;#exec MESHMAP SETTEXTURE MESHMAP=Weapon_1st NUM=0 TEXTURE=WeaponTex&lt;/uscript&gt;

;NUM : Material number the texture is assigned to on the mesh.

==Animations==

===Import===

You can import .PSA files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec ANIM  IMPORT ANIM=WeaponAnim ANIMFILE=models\WeaponAnim.PSA COMPRESS=1 MAXKEYS=999999 IMPORTSEQS=1&lt;/uscript&gt;

;ANIM : Name that the animations are imported as.
;ANIMFILE : Path to the animations being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;COMPRESS : Compresses the animations.  1 is normal, uncompressed, lower numbers are more compressed.
;MAXKEYS : ''not sure''
;IMPORTSEQS : ''not sure''

==Fonts==

===Importing True Type Fonts===

Importing fonts involves using the NEW command with a factory class, the Aa [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]].

Example:

&lt;uscript&gt;#exec NEW TRUETYPEFONTFACTORY NAME=ZoomStatsFontLarge FONTNAME=&quot;OCR A Extended&quot; HEIGHT=24 ANTIALIAS=1 DROPSHADOWX=1 DROPSHADOWY=1 CHARS=&quot;.0123456789x&quot;&lt;/uscript&gt;

See [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]] for more information.

==Comments==

'''BlackHawk:''' Does anyone know if there is a way to construct shaders in an automatic way?

For example: you create a diffuse, specular, and opacity texture that have you want combined in a shader. Is there another way to do this, besides doing it by hand?

----

[[:Category:Legacy Refactor Me]] - This needs Splitting into UT and UT2003 Imports

[[:Category:Legacy To Do]] &amp;ndash; What is UT2003 and which is UT? Remove UT-only stuff from this page
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2983</id>
      <timestamp>2006-09-10T06:36:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&quot;#exec&quot; directives in [[Legacy:UnrealScript|UnrealScript]] [[Legacy:Class Syntax|class syntax]] execute [[Legacy:Console Commands|console commands]] at compile time. This is useful for keeping content closely coupled with the code that uses it (textures/sounds), or for referenced separate content packages for organizational purposes.

Every &quot;#exec&quot; directive can be executed in UnrealEd's [[Legacy:Console Bar|console bar]] (without the &quot;#exec&quot; part). Currently in the newer engine builds, they are the only method of importing vertex meshes (think .3ds).  

Look for lines in Editor.log that start with &quot;Cmd:&quot; to find out about more possibly interesing exec directives.

See [[Legacy:UnrealEd Console|UnrealEd Console]] for more information on this fun stuff!

See [[Legacy:Exec Directive (UT)|Exec Directive (UT)]] for UT Import commands.

==Textures==

===Import===

Textures can be imported upon compilation of a class or series of classes into a .u package. This is done using the #exec preprocessing directive.

Syntax:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=NameForTextureToImportAs FILE=PATH\TO\SomeTexture.pcx GROUP=SomeGroup MIPS=OFF FLAGS=2 PALETTE=SomeTexPalette LODSET=2
// note no terminating &quot;;&quot;. Presumably must be all on one line, too
&lt;/uscript&gt;

;NAME : (optional) Name the texture is imported as. Defaults to the file name without extension if omitted.
;FILE : Path to the texture being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the texture is classified under (used in, for example, the UEd Texture browser.)
;MIPS : (optional) OFF or ON.  Generate [[Legacy:MipMap|MipMap]]s.
;FLAGS : (optional) Numerical value.  Assigns the texture rendering style.  Valid styles are:
;* 1: Normal 
;* 2: 2-sided ''&amp;ndash; isn't that masked? &amp;rarr;[[Legacy:Wormbo|Wormbo]]'' &amp;rarr;[[Legacy:Kirin|Kirin]]'' Yes Wormbo it is &amp;rarr; ''SabbathCat'': In most UT code FLAGS=2 is commented as just &quot;two sided&quot;. 
;* 3: Translucent 2-sided
;* 4: Masked 2-sided 
;* 5: Modulated 2-sided
;PALETTE : (optional) Color palette to use if not default.
;LODSET : (optional) Numerical value.  Level of detail.  Homologous to the LODSet Texture property in UEd.  Affects texture clarity as dictated by the user's settings.
;* 0: no detail settings applied.
;* 1: LODSET_World &amp;ndash; affected by user's World Texture Detail setting.
;* 2: LODSET_Skin (or LODSET_PlayerSkin for ([[Legacy:UT2003|UT2003]]) ) &amp;ndash; affected by user's Skin Detail setting.
;* 3: ([[Legacy:UT2003|UT2003]]) LODSET_WeaponSkin  &amp;ndash; used for weapon textures
;* 4: ([[Legacy:UT2003|UT2003]]) LODSET_Terrain &amp;ndash; used for Terrain textures
;* 5: ([[Legacy:UT2003|UT2003]]) LODSET_Interface &amp;ndash; used for menu items like HUD and Player Portraits
;* 6: ([[Legacy:UT2003|UT2003]]) LODSET_RenderMap &amp;ndash; used for shaders
;* 7: ([[Legacy:UT2003|UT2003]]) LODSET_LightMap &amp;ndash; used for light maps
;* 8: ([[Legacy:SWAT4|SWAT4]])  LODSET_NormalMap
;ALPHA : ([[Legacy:UT2003|UT2003]]) (optional) Binary value. Defines whether a texture is imported as a Texture with an Alpha Channel 
;UCLAMPMODE : ([[Legacy:UT2003|UT2003]]) (optional) can be CLAMP or WRAP, WRAP is default, so you don't have to add it then. I'm not totaly sure what is does, but it's needed for projector textures, and for team symbols.
;VCLAMPMODE : ([[Legacy:UT2003|UT2003]]) (optional) see UCLAMPMODE.
;DXT : ([[Legacy:UT2003|UT2003]]) (optional) One of: 1/3/5. DXT format to use when compressing the imported texture.

Note that it's possible but usually not practical to include a &lt;code&gt;PACKAGE=...&lt;/code&gt; parameter. There may also be other parameters, but the ones listed above should be all you ever need.

Context:

&lt;uscript&gt;
class SomeClass extends SomeActor;

#exec TEXTURE IMPORT NAME=SomeTex1 FILE=Textures\SomeTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex2 FILE=Textures\AnotherTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex3 FILE=Textures\StillAnotherTexture.pcx GROUP=Skins FLAGS=2
&lt;/uscript&gt;

Imported textures are addressed as PackageName.Texturename, and available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Texture Import And Export|Texture Import And Export]]

==Compressing (UT2003)==

&lt;uscript&gt;#exec TEXTURE COMPRESS NAME=Package.TextureName FORMAT=DXT?&lt;/uscript&gt;

'''DJPaul:''' To compress a texture to a format.  Replace &quot;DXT?&quot; with a compresssion type: i.e. DXT1, DXT3, or DXT5. '''

'''Kirin:''' Default is RGBA8 for non-DDS files (eg. TGA) and DXT? for DDS files depending on what was imported. You can use the DXT Tools for Photoshop from http://developer.nvidia.com/view.asp?IO=ps_texture_compression_plugin to export a DDS texture from Photoshop. non-nVidia users: Don't it worry! It'll work if you don't have an nvidia card. I have a Radeon 9700 and the preview function hasn't bailed on me yet. ;)

'''Kirin:''' WOW! That's a lot added in UT2003. Just added a bunch of discovered LODSET variables

'''smattbac''' Package Reference. It seems that if you only reference to an object in a package in the defaultproperties, you don't have to load the file (is this true for all engine builds?), but it might be good practice to load it anyway.

'''Uncommon:''' I have had zero luck getting the compress directive to work. None of the UT2003 classes use it; instead they have DXT=1-5 at the end of the TEXTURE IMPORT line. But that didn't work for me either (sure would help if there was an error message!). I ended up doing the compressing in UnrealEd, exporting the .dds file, and importing that instead.

'''Faithful:''' This TEXTURE COMPRESS directive appears to be a UnrealEd-only command. Note that ucc make's #exec will not give errors for commands it does not recognize, but simply will do nothing (resulting in everyone's complete failure to get this exec directive to work). Perhaps confusions like this could be solved if all new Editor.log-found directives were first added to [[Legacy:UnrealEd Console|UnrealEd Console]] and later (if found to work with the MakeCommandlet) could be copied here or to a &quot;common exec directive&quot; page of sorts. Also I wasn't able to get TEXTURE IMPORT's DXT= property to give me any problems. I'm using UCC.exe from UT2004 patch 3204.

'''BlackHawk:''' Isn't this TEXTURE COMPRESS directive supposed to be called AFTER you do a TEXTURE IMPORT, in which you put it in a package and give it a name?

==Sounds==

To import sound files into your code package, a syntax similar to texture import is used.

Syntax:

&lt;uscript&gt;
#exec AUDIO IMPORT NAME=NameForSoundToImportAs FILE=PATH\TO\Soundfile.wav GROUP=SomeGroup
&lt;/uscript&gt;

;NAME : (optional) Name the sound is imported as. Defaults to the file name without extension if omitted.
;FILE : Path to the sound file being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the sound is classified under (used in, for example, the UEd [[Legacy:Sound Browser|Sound browser]].)

Note that it's possible but usually not practical to include a &lt;code&gt;PACKAGE=...&lt;/code&gt; parameter.

See [[Legacy:Importing Sounds|Importing Sounds]] for details about supported sound file formats.

==Packages==

===Loading Other Packages===

You can use the OBJ LOAD parameters to load a specific file at compile time, so that you can reference objects in that package at compile time.  For example, say you want to store a bunch of textures in a seperate .utx so that you don't necessarily have to re-compile the package everytime you want to update/change/add/remove textures, you could do something like:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot;

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyTextures.SomeCoolTexture_A'
}
&lt;/uscript&gt;

You can use OBJ LOAD to load any sort of Unreal package, be it for textures, sounds, animations, or even other script packages.  Useful sometimes for bypassing annoying dependency issues as well (although you should probably just design your code not to have these in the first place).

PACKAGE specifies the package which the referenced FILE is compiled into.  Setting it equal to the package in which the calling class resides will compile the loaded package &lt;b&gt;into&lt;/b&gt; the compiled package.  For example, with a texture package called MyTextures.utx and a script MyScript.uc in package MyPackage:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot; PACKAGE=MyPackage

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyPackage.SomeCoolTexture_A'
}
&lt;/uscript&gt;

SomeCoolTexture can then be referenced through MyPackage instead of MyTextures, eliminating the need for a separate texture package when MyPackage is distributed.

Oh yes, here's a little something I learned the hard way...if you want to EXEC OBJ LOAD files, make certain they have different names (i.e., it doesn't like having MyModWeapons.utx and MyModWeapons.uax).  Simple work-around is to just name them like MyModWeaponsSkins.utx and MyModWeaponsSounds.uax.  Sigh.  Maybe I'm just an idiot, but it took me 10 minutes to figure that out.  Hopefully this will save someone else that trouble.

==Static Meshes==

===Import===

You can import static meshes to be compiled in your .u file.  You can import Lightwave (.lwo) and the .ase files exported from the [[Legacy:ActorX|ActorX]] Utility.

====Lightwave (*.lwo files)====

&lt;uscript&gt;#exec STATICMESH IMPORT NAME=GrenadeMesh FILE=Models\assaultgrenade.lwo GROUP=EnemyWeapons&lt;/uscript&gt;

====ActorX Exported (*.ase files)====

&lt;uscript&gt;#exec NEW STATICMESH NAME=AnotherGrenadeMesh FILE=Models\assaultgrenade2.ase GROUP=TeamWeapons&lt;/uscript&gt;
;NAME : Name the static mesh is imported as.
;FILE : Path to the static mesh being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the static mesh is classified under (used in, for example, the UEd static mesh browser.)
;PACKAGE : (optional) I'm not sure about this one.  It is the name of the package you want to import the static mesh into.  Not much use for this in compiling a .u file. However, you may be able to use it to create a batch compiler to compile and save out several packages at once?  Like I said I'm not sure.

'''Daid303:''' There seems to be another parameter called &quot;COLLISION&quot; it's used alot in the resource UC files in UT2003, but I have no idea what it does.

Oh, wait if you say &quot;COLLISION=0&quot; then all the Materials have EnableCollision to false. Any idea what that does?

==Skeletal Meshes==

===Import===

You can import .PSK files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec MESH  MODELIMPORT MESH=Weapon_1st MODELFILE=models\WeaponModel.PSK LODSTYLE=10&lt;/uscript&gt;

;MESH : Name that the mesh is imported as.
;MODELFILE : Path to the mesh being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;LODSTYLE : ''not sure - I use 10 for weapons fine.''

See also http://unreal.epicgames.com/skeletal/UtSkelAnim.htm for more detailed information.

===Position, Rotation and Scale===

&lt;uscript&gt;
#exec MESH  ORIGIN MESH=Weapon_1st X=0 Y=0 Z=0 YAW=0 PITCH=0 ROLL=0
#exec MESHMAP   SCALE MESHMAP=Weapon_1st X=1.0 Y=1.0 Z=1.0
&lt;/uscript&gt;

In this case the rotation unit is a byte: a full circle is 255.

===Assign Animations and Textures===

&lt;uscript&gt;#exec MESH  DEFAULTANIM MESH=Weapon_1st ANIM=WeaponAnim&lt;/uscript&gt;

&lt;uscript&gt;#exec MESHMAP SETTEXTURE MESHMAP=Weapon_1st NUM=0 TEXTURE=WeaponTex&lt;/uscript&gt;

;NUM : Material number the texture is assigned to on the mesh.

==Animations==

===Import===

You can import .PSA files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec ANIM  IMPORT ANIM=WeaponAnim ANIMFILE=models\WeaponAnim.PSA COMPRESS=1 MAXKEYS=999999 IMPORTSEQS=1&lt;/uscript&gt;

;ANIM : Name that the animations are imported as.
;ANIMFILE : Path to the animations being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;COMPRESS : Compresses the animations.  1 is normal, uncompressed, lower numbers are more compressed.
;MAXKEYS : ''not sure''
;IMPORTSEQS : ''not sure''

==Fonts==

===Importing True Type Fonts===

Importing fonts involves using the NEW command with a factory class, the Aa [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]].

Example:

&lt;uscript&gt;#exec NEW TRUETYPEFONTFACTORY NAME=ZoomStatsFontLarge FONTNAME=&quot;OCR A Extended&quot; HEIGHT=24 ANTIALIAS=1 DROPSHADOWX=1 DROPSHADOWY=1 CHARS=&quot;.0123456789x&quot;&lt;/uscript&gt;

See [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]] for more information.

==Comments==

'''BlackHawk:''' Does anyone know if there is a way to construct shaders in an automatic way?

For example: you create a diffuse, specular, and opacity texture that have you want combined in a shader. Is there another way to do this, besides doing it by hand?

----

[[:Category:Legacy Refactor Me]] - This needs Splitting into UT and UT2003 Imports

[[:Category:Legacy To Do]] &amp;ndash; What is UT2003 and which is UT? Remove UT-only stuff from this page
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Exec Directive (UT)</title>
    <id>1174</id>
    <revision>
      <id>3065</id>
      <timestamp>2004-12-07T21:00:58Z</timestamp>
      <contributor>
        <ip>C-24-18-76-107.client.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">For UT2003 Imports see : [[Legacy:Exec Directive|Exec Directive]]

&quot;#exec&quot; directives execute console commands at compile time. Every &quot;#exec&quot; directive can be executed in UnrealEd's [[Legacy:Console Bar|console bar]]. (without the &quot;#exec&quot;) Currently in the newer engine builds, they are the only method of importing vertex meshes (think .3ds).  They are also useful for keeping content closely coupled with the code that uses it (textures/sounds), or for referenced seperate content packages for organizational purposes.

Look for lines in Editor.log that start with &quot;Cmd:&quot; to find out about more possibly interesing exec directives.

See [[Legacy:UnrealEd Console|UnrealEd Console]] for more information on this fun stuff!

==Textures==

===Import===

Textures may also be imported upon compilation of a class or series of classes into a .u package.  This is done using the #exec preprocessing directive.

Syntax:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=NameForTextureToImportAs FILE=PATH\TO\SomeTexture.pcx GROUP=SomeGroup MIPS=OFF FLAGS=2 PALETTE=SomeTexPalette LODSET=2
&lt;/uscript&gt;

;NAME : Name the texture is imported as.
;FILE : Path to the texture being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the texture is classified under (used in, for example, the UEd Texture browser.)
;MIPS : (optional) OFF or ON.  Generate [[Legacy:MipMap|MipMap]]s.
;FLAGS : (optional) Numerical value.  Assigns the texture rendering style.  Valid styles are:
;* 1: Normal 
;* 2: 2-sided (Use this if importing for use as a sprite)
;* 3: Translucent 2-sided
;* 4: Masked 2-sided 
;* 5: Modulated 2-sided
;PALETTE : (optional) Color palette to use if not default.
;LODSET : (optional) Numerical value.  Level of detail.  Homologous to the LODSet Texture property in UEd.  Affects texture clarity as dictated by the user's settings.
;* 0: no detail settings applied.
;* 1: LODSET_World &amp;ndash; affected by user's World Texture Detail setting.
;* 2: LODSET_Skin 

Context:

&lt;uscript&gt;
class SomeClass extends SomeActor;

#exec TEXTURE IMPORT NAME=SomeTex1 FILE=Textures\SomeTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex2 FILE=Textures\AnotherTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex3 FILE=Textures\StillAnotherTexture.pcx GROUP=Skins FLAGS=2
&lt;/uscript&gt;

Imported textures are addressed as PackageName.Texturename, and available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Texture Import And Export|Texture Import And Export]]

==Sounds==

===Import===

Sounds can be imported in a similar way to textures.  Imported sounds must be no higher quality than 22,050 Hz, 16 bit mono, and must be uncompressed PCM WAV.

Syntax:

&lt;uscript&gt;
#exec AUDIO IMPORT NAME=NameForSoundToImportAs FILE=PATH\TO\SomeSound.wav GROUP=SomeGroup
&lt;/uscript&gt;

;NAME : Name the sound is imported as.
;FILE : Path to the sound being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the sound is classified under (used in, for example, the UEd Sound browser.)

Imported sounds are addressed as PackageName.GroupName.SoundName, and are available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Importing_Sounds|Importing_Sounds]]

==Packages==

===Loading Other Packages===

You can use the OBJ LOAD parameters to load a specific package at compile time to allow specific objects in that package to be referenced if they're not already loaded in the compilation sequence (via prior inclusion or EditPackages listing).

For example, say you have a bunch of textures in a seperate .utx so that you don't necessarily have to re-compile a .u package everytime you want to update/change/add/remove textures; to insure a class accessing the .utx package compiles, you could do something like:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot;

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyTextures.SomeCoolTexture_A'
}
&lt;/uscript&gt;

You can use OBJ LOAD to load any sort of Unreal package, be it for textures, sounds, animations, or even other script packages.  Useful sometimes for bypassing annoying dependency issues as well (although you should probably just design your code not to have these in the first place).

The PACKAGE flag specifies the package which the referenced FILE is compiled into.  Setting it equal to the package in which the calling class resides will compile the loaded package &lt;b&gt;into&lt;/b&gt; the compiled package.  For example, with a texture package called MyTextures.utx and a script MyScript.uc in package MyPackage:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot; PACKAGE=MyPackage

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyPackage.SomeCoolTexture_A'
}

&lt;/uscript&gt;

SomeCoolTexture can then be referenced through MyPackage instead of MyTextures, eliminating the need for a separate texture package when MyPackage is distributed.

If you want to EXEC OBJ LOAD files, make certain they have different names (i.e., it doesn't like having MyModWeapons.utx and MyModWeapons.uax &amp;ndash; it's a circular reference and the compiler will hang as it tries to load a package into itself).  Simple work-around is to just name them like MyModWeaponsSkins.utx and MyModWeaponsSounds.uax.

===Position, Rotation and Scale===

&lt;uscript&gt;
#exec MESH  ORIGIN MESH=Weapon_1st X=0 Y=0 Z=0 YAW=0 PITCH=0 ROLL=0
#exec MESHMAP   SCALE MESHMAP=Weapon_1st X=1.0 Y=1.0 Z=1.0
&lt;/uscript&gt;

In this case the rotation unit is a byte: a full circle is 255.

===Assign Animations and Textures===

&lt;uscript&gt;#exec MESH  DEFAULTANIM MESH=Weapon_1st ANIM=WeaponAnim&lt;/uscript&gt;

&lt;uscript&gt;#exec MESHMAP SETTEXTURE MESHMAP=Weapon_1st NUM=0 TEXTURE=WeaponTex&lt;/uscript&gt;

;NUM : Material number the texture is assigned to on the mesh.

==Animations==

===Import===

You can import .PSA files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec ANIM  IMPORT ANIM=WeaponAnim ANIMFILE=models\WeaponAnim.PSA COMPRESS=1 MAXKEYS=999999 IMPORTSEQS=1&lt;/uscript&gt;

;ANIM : Name that the animations are imported as.
;ANIMFILE : Path to the animations being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;COMPRESS : Compresses the animations.  1 is normal, uncompressed, lower numbers are more compressed.
;MAXKEYS : ''not sure''
;IMPORTSEQS : ''not sure''

==Fonts==

===Import===

Fonts can be created using the TrueTypeFontFactory, you can import any truetype font on the machine doing the compilation.

Basic Syntax:

&lt;uscript&gt;
#exec NEW TRUETYPEFONTFACTORY NAME=SomeName FONTNAME=&quot;SomeFont&quot; HEIGHT=SomeSize
&lt;/uscript&gt;

;NAME : Name the font is imported as.
;FONTNAME : Name of the font to be imported, such as &quot;Arial&quot; or &quot;Times New Roman&quot;.
;HEIGHT: Height of the characters in the font - think 'font size'.

Many other parameters for this exist, see [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]].

Imported fonts are addressed as PackageName.FontName, and will show up in UnrealEd but seem to show every single currently loaded texture (akin to Engine.*Font groups).

See also [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]]

----

'''Draconx:''' Perhaps readability of this page could be improved by breaking it into subpages for each type of import?  This whole page really looks like a mess.  I'll take a look at doing just that tomorrow I suppose, as a comprehensive reference to the #exec imports is HIGHLY useful.

----

[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; What is UT2003 and which is UT? Remove UT2003 stuff from this page
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3066</id>
      <timestamp>2004-10-11T19:54:17Z</timestamp>
      <contributor>
        <ip>Captain Kewl</ip>
      </contributor>
      <minor/>
      <comment>Syntax</comment>
      <text xml:space="preserve">For UT2003 Imports see : [[Legacy:Exec Directive|Exec Directive]]

&quot;#exec&quot; directives execute console commands at compile time. Every &quot;#exec&quot; directive can be executed in UnrealEd's [[Legacy:Console Bar|console bar]]. (without the &quot;#exec&quot;) Currently in the newer engine builds, they are the only method of importing vertex meshes (think .3ds).  They are also useful for keeping content closely coupled with the code that uses it (textures/sounds), or for referenced seperate content packages for organizational purposes.

Look for lines in Editor.log that start with &quot;Cmd:&quot; to find out about more possibly interesing exec directives.

See [[Legacy:UnrealEd Console|UnrealEd Console]] for more information on this fun stuff!

==Textures==

===Import===

Textures may also be imported upon compilation of a class or series of classes into a .u package.  This is done using the #exec preprocessing directive.

Syntax:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=NameForTextureToImportAs FILE=PATH\TO\SomeTexture.pcx GROUP=SomeGroup MIPS=OFF FLAGS=2 PALETTE=SomeTexPalette LODSET=2
&lt;/uscript&gt;

;NAME : Name the texture is imported as.
;FILE : Path to the texture being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the texture is classified under (used in, for example, the UEd Texture browser.)
;MIPS : (optional) OFF or ON.  Generate [[Legacy:MipMap|MipMap]]s.
;FLAGS : (optional) Numerical value.  Assigns the texture rendering style.  Valid styles are:
;* 1: Normal 
;* 2: 2-sided (Use this if importing for use as a sprite)
;* 3: Translucent 2-sided
;* 4: Masked 2-sided 
;* 5: Modulated 2-sided
;PALETTE : (optional) Color palette to use if not default.
;LODSET : (optional) Numerical value.  Level of detail.  Homologous to the LODSet Texture property in UEd.  Affects texture clarity as dictated by the user's settings.
;* 0: no detail settings applied.
;* 1: LODSET_World &amp;ndash; affected by user's World Texture Detail setting.
;* 2: LODSET_Skin 

Context:

&lt;uscript&gt;
class SomeClass extends SomeActor;

#exec TEXTURE IMPORT NAME=SomeTex1 FILE=Textures\SomeTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex2 FILE=Textures\AnotherTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex3 FILE=Textures\StillAnotherTexture.pcx GROUP=Skins FLAGS=2
&lt;/uscript&gt;

Imported textures are addressed as PackageName.Texturename, and available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Texture Import And Export|Texture Import And Export]]

==Sounds==

===Import===

Sounds can be imported in a similar way to textures.  Imported sounds must be no higher quality than 22,050 Hz, 16 bit mono, and must be uncompressed PCM WAV.

Syntax:

&lt;uscript&gt;
#exec AUDIO NAME=NameForSoundToImportAs FILE=PATH\TO\SomeSound.wav GROUP=SomeGroup
&lt;/uscript&gt;

;NAME : Name the sound is imported as.
;FILE : Path to the sound being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the sound is classified under (used in, for example, the UEd Texture browser.)

Imported sounds are addressed as PackageName.GroupName.SoundName, and are available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Importing_Sounds|Importing_Sounds]]

==Packages==

===Loading Other Packages===

You can use the OBJ LOAD parameters to load a specific package at compile time to allow specific objects in that package to be referenced if they're not already loaded in the compilation sequence (via prior inclusion or EditPackages listing).

For example, say you have a bunch of textures in a seperate .utx so that you don't necessarily have to re-compile a .u package everytime you want to update/change/add/remove textures; to insure a class accessing the .utx package compiles, you could do something like:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot;

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyTextures.SomeCoolTexture_A'
}
&lt;/uscript&gt;

You can use OBJ LOAD to load any sort of Unreal package, be it for textures, sounds, animations, or even other script packages.  Useful sometimes for bypassing annoying dependency issues as well (although you should probably just design your code not to have these in the first place).

The PACKAGE flag specifies the package which the referenced FILE is compiled into.  Setting it equal to the package in which the calling class resides will compile the loaded package &lt;b&gt;into&lt;/b&gt; the compiled package.  For example, with a texture package called MyTextures.utx and a script MyScript.uc in package MyPackage:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot; PACKAGE=MyPackage

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyPackage.SomeCoolTexture_A'
}

&lt;/uscript&gt;

SomeCoolTexture can then be referenced through MyPackage instead of MyTextures, eliminating the need for a separate texture package when MyPackage is distributed.

If you want to EXEC OBJ LOAD files, make certain they have different names (i.e., it doesn't like having MyModWeapons.utx and MyModWeapons.uax &amp;ndash; it's a circular reference and the compiler will hang as it tries to load a package into itself).  Simple work-around is to just name them like MyModWeaponsSkins.utx and MyModWeaponsSounds.uax.

===Position, Rotation and Scale===

&lt;uscript&gt;
#exec MESH  ORIGIN MESH=Weapon_1st X=0 Y=0 Z=0 YAW=0 PITCH=0 ROLL=0
#exec MESHMAP   SCALE MESHMAP=Weapon_1st X=1.0 Y=1.0 Z=1.0
&lt;/uscript&gt;

In this case the rotation unit is a byte: a full circle is 255.

===Assign Animations and Textures===

&lt;uscript&gt;#exec MESH  DEFAULTANIM MESH=Weapon_1st ANIM=WeaponAnim&lt;/uscript&gt;

&lt;uscript&gt;#exec MESHMAP SETTEXTURE MESHMAP=Weapon_1st NUM=0 TEXTURE=WeaponTex&lt;/uscript&gt;

;NUM : Material number the texture is assigned to on the mesh.

==Animations==

===Import===

You can import .PSA files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec ANIM  IMPORT ANIM=WeaponAnim ANIMFILE=models\WeaponAnim.PSA COMPRESS=1 MAXKEYS=999999 IMPORTSEQS=1&lt;/uscript&gt;

;ANIM : Name that the animations are imported as.
;ANIMFILE : Path to the animations being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;COMPRESS : Compresses the animations.  1 is normal, uncompressed, lower numbers are more compressed.
;MAXKEYS : ''not sure''
;IMPORTSEQS : ''not sure''

----

[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; What is UT2003 and which is UT? Remove UT2003 stuff from this page
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3067</id>
      <timestamp>2004-11-03T23:58:04Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">For UT2003 Imports see : [[Legacy:Exec Directive|Exec Directive]]

&quot;#exec&quot; directives execute console commands at compile time. Every &quot;#exec&quot; directive can be executed in UnrealEd's [[Legacy:Console Bar|console bar]]. (without the &quot;#exec&quot;) Currently in the newer engine builds, they are the only method of importing vertex meshes (think .3ds).  They are also useful for keeping content closely coupled with the code that uses it (textures/sounds), or for referenced seperate content packages for organizational purposes.

Look for lines in Editor.log that start with &quot;Cmd:&quot; to find out about more possibly interesing exec directives.

See [[Legacy:UnrealEd Console|UnrealEd Console]] for more information on this fun stuff!

==Textures==

===Import===

Textures may also be imported upon compilation of a class or series of classes into a .u package.  This is done using the #exec preprocessing directive.

Syntax:

&lt;uscript&gt;
#exec TEXTURE IMPORT NAME=NameForTextureToImportAs FILE=PATH\TO\SomeTexture.pcx GROUP=SomeGroup MIPS=OFF FLAGS=2 PALETTE=SomeTexPalette LODSET=2
&lt;/uscript&gt;

;NAME : Name the texture is imported as.
;FILE : Path to the texture being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the texture is classified under (used in, for example, the UEd Texture browser.)
;MIPS : (optional) OFF or ON.  Generate [[Legacy:MipMap|MipMap]]s.
;FLAGS : (optional) Numerical value.  Assigns the texture rendering style.  Valid styles are:
;* 1: Normal 
;* 2: 2-sided (Use this if importing for use as a sprite)
;* 3: Translucent 2-sided
;* 4: Masked 2-sided 
;* 5: Modulated 2-sided
;PALETTE : (optional) Color palette to use if not default.
;LODSET : (optional) Numerical value.  Level of detail.  Homologous to the LODSet Texture property in UEd.  Affects texture clarity as dictated by the user's settings.
;* 0: no detail settings applied.
;* 1: LODSET_World &amp;ndash; affected by user's World Texture Detail setting.
;* 2: LODSET_Skin 

Context:

&lt;uscript&gt;
class SomeClass extends SomeActor;

#exec TEXTURE IMPORT NAME=SomeTex1 FILE=Textures\SomeTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex2 FILE=Textures\AnotherTexture.pcx GROUP=Skins FLAGS=2
#exec TEXTURE IMPORT NAME=SomeTex3 FILE=Textures\StillAnotherTexture.pcx GROUP=Skins FLAGS=2
&lt;/uscript&gt;

Imported textures are addressed as PackageName.Texturename, and available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Texture Import And Export|Texture Import And Export]]

==Sounds==

===Import===

Sounds can be imported in a similar way to textures.  Imported sounds must be no higher quality than 22,050 Hz, 16 bit mono, and must be uncompressed PCM WAV.

Syntax:

&lt;uscript&gt;
#exec AUDIO NAME=NameForSoundToImportAs FILE=PATH\TO\SomeSound.wav GROUP=SomeGroup
&lt;/uscript&gt;

;NAME : Name the sound is imported as.
;FILE : Path to the sound being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group the sound is classified under (used in, for example, the UEd Sound browser.)

Imported sounds are addressed as PackageName.GroupName.SoundName, and are available via UnrealEd after PackageName is loaded in the Actor browser.

See also [[Legacy:Importing_Sounds|Importing_Sounds]]

==Packages==

===Loading Other Packages===

You can use the OBJ LOAD parameters to load a specific package at compile time to allow specific objects in that package to be referenced if they're not already loaded in the compilation sequence (via prior inclusion or EditPackages listing).

For example, say you have a bunch of textures in a seperate .utx so that you don't necessarily have to re-compile a .u package everytime you want to update/change/add/remove textures; to insure a class accessing the .utx package compiles, you could do something like:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot;

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyTextures.SomeCoolTexture_A'
}
&lt;/uscript&gt;

You can use OBJ LOAD to load any sort of Unreal package, be it for textures, sounds, animations, or even other script packages.  Useful sometimes for bypassing annoying dependency issues as well (although you should probably just design your code not to have these in the first place).

The PACKAGE flag specifies the package which the referenced FILE is compiled into.  Setting it equal to the package in which the calling class resides will compile the loaded package &lt;b&gt;into&lt;/b&gt; the compiled package.  For example, with a texture package called MyTextures.utx and a script MyScript.uc in package MyPackage:

&lt;uscript&gt;
#exec OBJ LOAD FILE=&quot;..\Textures\MyTextures.utx&quot; PACKAGE=MyPackage

var Texture SomeTexture;

defaultproperties
{
    SomeTexture=Texture'MyPackage.SomeCoolTexture_A'
}

&lt;/uscript&gt;

SomeCoolTexture can then be referenced through MyPackage instead of MyTextures, eliminating the need for a separate texture package when MyPackage is distributed.

If you want to EXEC OBJ LOAD files, make certain they have different names (i.e., it doesn't like having MyModWeapons.utx and MyModWeapons.uax &amp;ndash; it's a circular reference and the compiler will hang as it tries to load a package into itself).  Simple work-around is to just name them like MyModWeaponsSkins.utx and MyModWeaponsSounds.uax.

===Position, Rotation and Scale===

&lt;uscript&gt;
#exec MESH  ORIGIN MESH=Weapon_1st X=0 Y=0 Z=0 YAW=0 PITCH=0 ROLL=0
#exec MESHMAP   SCALE MESHMAP=Weapon_1st X=1.0 Y=1.0 Z=1.0
&lt;/uscript&gt;

In this case the rotation unit is a byte: a full circle is 255.

===Assign Animations and Textures===

&lt;uscript&gt;#exec MESH  DEFAULTANIM MESH=Weapon_1st ANIM=WeaponAnim&lt;/uscript&gt;

&lt;uscript&gt;#exec MESHMAP SETTEXTURE MESHMAP=Weapon_1st NUM=0 TEXTURE=WeaponTex&lt;/uscript&gt;

;NUM : Material number the texture is assigned to on the mesh.

==Animations==

===Import===

You can import .PSA files obtained from the [[Legacy:ActorX|ActorX]] utility, that are placed in the /models folder of your package directory.

&lt;uscript&gt;#exec ANIM  IMPORT ANIM=WeaponAnim ANIMFILE=models\WeaponAnim.PSA COMPRESS=1 MAXKEYS=999999 IMPORTSEQS=1&lt;/uscript&gt;

;ANIM : Name that the animations are imported as.
;ANIMFILE : Path to the animations being imported.  Paths are local to the root of the package directory.
;GROUP : (optional) Name of the group that the mesh is classified under.
;COMPRESS : Compresses the animations.  1 is normal, uncompressed, lower numbers are more compressed.
;MAXKEYS : ''not sure''
;IMPORTSEQS : ''not sure''

==Fonts==

===Import===

Fonts can be created using the TrueTypeFontFactory, you can import any truetype font on the machine doing the compilation.

Basic Syntax:

&lt;uscript&gt;
#exec NEW TRUETYPEFONTFACTORY NAME=SomeName FONTNAME=&quot;SomeFont&quot; HEIGHT=SomeSize
&lt;/uscript&gt;

;NAME : Name the font is imported as.
;FONTNAME : Name of the font to be imported, such as &quot;Arial&quot; or &quot;Times New Roman&quot;.
;HEIGHT: Height of the characters in the font - think 'font size'.

Many other parameters for this exist, see [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]].

Imported fonts are addressed as PackageName.FontName, and will show up in UnrealEd but seem to show every single currently loaded texture (akin to Engine.*Font groups).

See also [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]]

----

'''Draconx:''' Perhaps readability of this page could be improved by breaking it into subpages for each type of import?  This whole page really looks like a mess.  I'll take a look at doing just that tomorrow I suppose, as a comprehensive reference to the #exec imports is HIGHLY useful.

----

[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; What is UT2003 and which is UT? Remove UT2003 stuff from this page
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Exec Function</title>
    <id>1165</id>
    <revision>
      <id>3048</id>
      <timestamp>2008-02-29T02:15:05Z</timestamp>
      <contributor>
        <ip>Dem1382-138-54.ppp.netnitco.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Exec Functions''' are [[Legacy:Function|function]]s that a player or user can execute by typing its name in the [[Legacy:Console|console]].  Basically, they provide a way to define new console commands in [[Legacy:UnrealScript|UnrealScript]] code.

&lt;uscript&gt;
exec function God()
{
    if ( bGodMode )
    {
        bGodMode = false;
        ClientMessage(&quot;God mode off&quot;);
        return;
    }

    bGodMode = true; 
    ClientMessage(&quot;God Mode on&quot;);
}
&lt;/uscript&gt;

'''Eliot:'''theres a much easyer way to do this like this example.

&lt;uscript&gt;
exec function God()
{
    bGodMode = !bGodMode; 
    ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

==Passing Parameters==

You can allow parameters for your console command by simply adding those parameters to the exec function's definition:

&lt;uscript&gt;
exec function Slap(string Player, int Strength)
{
    Level.Game.Broadcast(None, Player @ &quot;was slapped with strength&quot; @ Strength);
}
&lt;/uscript&gt;

When entering this console command, separate the parameters with blanks (not commas).  If the last function parameter is a string, it gobbles up everything that's remaining on the console command line.

  (&gt; Slap Mychaeel 1337
  Mychaeel was slapped with strength 1337

You can make exec function parameters [[Legacy:Function Syntax|optional]] if you want.

==Valid Places for Exec Functions==

Exec functions can be declared anywhere, but they only actually work in the following objects:

''(Note: this is only for UT2003/4, not UT or Unreal 1)''
* the [[Legacy:Console|Console]] interaction
* the [[Legacy:GameInfo|GameInfo]] actor (keep in mind that the GameInfo only exists on the server, though)
* the local player's [[Legacy:HUD|HUD]] actor
* the local player's [[Legacy:CheatManager|CheatManager]] (only offline)
* the local player's AdminManager (an [[Legacy:AdminBase|AdminBase]] subclass, only when logged in as admin and only available on the serverside)
* the local [[Legacy:PlayerController|PlayerController]]
* the local player's [[Legacy:PlayerInput|PlayerInput]]
* the local player's [[Legacy:Pawn|Pawn]]
* that Pawn's selected [[Legacy:Weapon|Weapon]] and SelectedItem ([[Legacy:Inventory|Inventory]])
* in UT2004 also any local [[Legacy:Interaction|Interaction]]

Note that an exec function must be [[Legacy:Simulated Function|simulated]] to work client-side.

==Related Topics==

* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] &amp;ndash; adding your custom console commands to the game's ''Controls'' setup menu.

==Discussion==

'''unknown:''' I put a file in UT2004/System/ called 'mysummon.ini', and put:

&lt;uscript&gt;
exec function myGod()
{
  bGodMode = !bGodMode; 
  ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

I startup UT2004 and type: &gt; myGod

into the console...but it says &quot;Command not found&quot;, or something like that :(

'''EntropicLqd:''' That's because an ini file is not a valid place for an exec function.  Ini files cannot contain code.  You would need to create your own class (see &quot;valid places for an exec function&quot; above).

'''orathaic''' Also note, bGodMode is a variable of the class controller, (and it's subclasses) This is the only variable which prevents death. So presumably you should access it with something like &lt;uscript&gt;MyController.bGodMode = !MyController.bGodMode&lt;/uscript&gt;

 or access it from the controller itself.

'''XxDangerxX:''' In what classes must you declare an exec function in UT? Also, how do you 'activate' the actor that has the exec function so that you can type it in the console?

'''VerteX''' well, i subclassed CheatManager, hooked it up so it modifies PlayerController and sets the game's cheat manager to MyCheatManager, then i tried my cheat (a custom allweapons). No go.</text>
    </revision>
    <revision>
      <id>3049</id>
      <timestamp>2007-12-20T09:57:01Z</timestamp>
      <contributor>
        <ip>124-170-30-118.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Exec Functions''' are [[Legacy:Function|function]]s that a player or user can execute by typing its name in the [[Legacy:Console|console]].  Basically, they provide a way to define new console commands in [[Legacy:UnrealScript|UnrealScript]] code.

&lt;uscript&gt;
exec function God()
{
    if ( bGodMode )
    {
        bGodMode = false;
        ClientMessage(&quot;God mode off&quot;);
        return;
    }

    bGodMode = true; 
    ClientMessage(&quot;God Mode on&quot;);
}
&lt;/uscript&gt;

'''Eliot:'''theres a much easyer way to do this like this example.

&lt;uscript&gt;
exec function God()
{
    bGodMode = !bGodMode; 
    ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

==Passing Parameters==

You can allow parameters for your console command by simply adding those parameters to the exec function's definition:

&lt;uscript&gt;
exec function Slap(string Player, int Strength)
{
    Level.Game.Broadcast(None, Player @ &quot;was slapped with strength&quot; @ Strength);
}
&lt;/uscript&gt;

When entering this console command, separate the parameters with blanks (not commas).  If the last function parameter is a string, it gobbles up everything that's remaining on the console command line.

  (&gt; Slap Mychaeel 1337
  Mychaeel was slapped with strength 1337

You can make exec function parameters [[Legacy:Function Syntax|optional]] if you want.

==Valid Places for Exec Functions==

Exec functions can be declared anywhere, but they only actually work in the following objects:

''(Note: this is only for UT2003/4, not UT or Unreal 1)''
* the [[Legacy:Console|Console]] interaction
* the [[Legacy:GameInfo|GameInfo]] actor (keep in mind that the GameInfo only exists on the server, though)
* the local player's [[Legacy:HUD|HUD]] actor
* the local player's [[Legacy:CheatManager|CheatManager]] (only offline)
* the local player's AdminManager (an [[Legacy:AdminBase|AdminBase]] subclass, only when logged in as admin and only available on the serverside)
* the local [[Legacy:PlayerController|PlayerController]]
* the local player's [[Legacy:PlayerInput|PlayerInput]]
* the local player's [[Legacy:Pawn|Pawn]]
* that Pawn's selected [[Legacy:Weapon|Weapon]] and SelectedItem ([[Legacy:Inventory|Inventory]])
* in UT2004 also any local [[Legacy:Interaction|Interaction]]

Note that an exec function must be [[Legacy:Simulated Function|simulated]] to work client-side.

==Related Topics==

* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] &amp;ndash; adding your custom console commands to the game's ''Controls'' setup menu.

==Discussion==

'''unknown:''' I put a file in UT2004/System/ called 'mysummon.ini', and put:

&lt;uscript&gt;
exec function myGod()
{
  bGodMode = !bGodMode; 
  ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

I startup UT2004 and type: &gt; myGod

into the console...but it says &quot;Command not found&quot;, or something like that :(

'''EntropicLqd:''' That's because an ini file is not a valid place for an exec function.  Ini files cannot contain code.  You would need to create your own class (see &quot;valid places for an exec function&quot; above).

'''orathaic''' Also note, bGodMode is a variable of the class controller, (and it's subclasses) This is the only variable which prevents death. So presumably you should access it with something like &lt;uscript&gt;MyController.bGodMode = !MyController.bGodMode&lt;/uscript&gt;

 or access it from the controller itself.

'''XxDangerxX:''' In what classes must you declare an exec function in UT? Also, how do you 'activate' the actor that has the exec function so that you can type it in the console?</text>
    </revision>
    <revision>
      <id>32363</id>
      <timestamp>2008-07-10T10:51:16Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <text xml:space="preserve">'''Exec Functions''' are [[Legacy:Function|function]]s that a player or user can execute by typing its name in the [[Legacy:Console|console]].  Basically, they provide a way to define new console commands in [[Legacy:UnrealScript|UnrealScript]] code.

&lt;uscript&gt;
exec function God()
{
    if ( bGodMode )
    {
        bGodMode = false;
        ClientMessage(&quot;God mode off&quot;);
        return;
    }

    bGodMode = true; 
    ClientMessage(&quot;God Mode on&quot;);
}
&lt;/uscript&gt;

'''Eliot:'''theres a much easyer way to do this like this example.

&lt;uscript&gt;
exec function God()
{
    bGodMode = !bGodMode; 
    ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

==Passing Parameters==

You can allow parameters for your console command by simply adding those parameters to the exec function's definition:

&lt;uscript&gt;
exec function Slap(string Player, int Strength)
{
    Level.Game.Broadcast(None, Player @ &quot;was slapped with strength&quot; @ Strength);
}
&lt;/uscript&gt;

When entering this console command, separate the parameters with blanks (not commas).  If the last function parameter is a string, it gobbles up everything that's remaining on the console command line.

  (&gt; Slap Mychaeel 1337
  Mychaeel was slapped with strength 1337

You can make exec function parameters [[Legacy:Function Syntax|optional]] if you want.

==Valid Places for Exec Functions==

Exec functions can be declared anywhere, but they only actually work in the following objects:

''(Note: this is only for UT2003/4, not UT or Unreal 1)''
* the [[Legacy:Console|Console]] interaction
* the [[Legacy:GameInfo|GameInfo]] actor (keep in mind that the GameInfo only exists on the server, though)
* the local player's [[Legacy:HUD|HUD]] actor
* the local player's [[Legacy:CheatManager|CheatManager]] (only offline)
* the local player's AdminManager (an [[Legacy:AdminBase|AdminBase]] subclass, only when logged in as admin and only available on the serverside)
* the local [[Legacy:PlayerController|PlayerController]]
* the local player's [[Legacy:PlayerInput|PlayerInput]]
* the local player's [[Legacy:Pawn|Pawn]]
* that Pawn's selected [[Legacy:Weapon|Weapon]] and SelectedItem ([[Legacy:Inventory|Inventory]])
* in UT2004 also any local [[Legacy:Interaction|Interaction]]

Note that an exec function must be [[Legacy:Simulated Function|simulated]] to work client-side.

==Related Topics==

* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] &amp;ndash; adding your custom console commands to the game's ''Controls'' setup menu.

==Discussion==

'''unknown:''' I put a file in UT2004/System/ called 'mysummon.ini', and put:

&lt;uscript&gt;
exec function myGod()
{
  bGodMode = !bGodMode; 
  ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

I startup UT2004 and type: &gt; myGod

into the console...but it says &quot;Command not found&quot;, or something like that :(

'''EntropicLqd:''' That's because an ini file is not a valid place for an exec function.  Ini files cannot contain code.  You would need to create your own class (see &quot;valid places for an exec function&quot; above).

'''orathaic''' Also note, bGodMode is a variable of the class controller, (and it's subclasses) This is the only variable which prevents death. So presumably you should access it with something like &lt;uscript&gt;MyController.bGodMode = !MyController.bGodMode&lt;/uscript&gt;

 or access it from the controller itself.

'''XxDangerxX:''' In what classes must you declare an exec function in UT? Also, how do you 'activate' the actor that has the exec function so that you can type it in the console?

'''VerteX''' well, i subclassed CheatManager, hooked it up so it modifies PlayerController and sets the game's cheat manager to MyCheatManager, then i tried my cheat (a custom allweapons). No go.

'''XxDangerxX:''' I've put an exec function in an Inventory item I'm making. It works! Yay! One problem though - it will only work in the console, not the quick console. What might be the cause for this? This is for UT '99.</text>
    </revision>
    <revision>
      <id>33145</id>
      <timestamp>2008-10-18T09:17:47Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <comment>/* Valid Places for Exec Functions */</comment>
      <text xml:space="preserve">'''Exec Functions''' are [[Legacy:Function|function]]s that a player or user can execute by typing its name in the [[Legacy:Console|console]].  Basically, they provide a way to define new console commands in [[Legacy:UnrealScript|UnrealScript]] code.

&lt;uscript&gt;
exec function God()
{
    if ( bGodMode )
    {
        bGodMode = false;
        ClientMessage(&quot;God mode off&quot;);
        return;
    }

    bGodMode = true; 
    ClientMessage(&quot;God Mode on&quot;);
}
&lt;/uscript&gt;

'''Eliot:'''theres a much easyer way to do this like this example.

&lt;uscript&gt;
exec function God()
{
    bGodMode = !bGodMode; 
    ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

==Passing Parameters==

You can allow parameters for your console command by simply adding those parameters to the exec function's definition:

&lt;uscript&gt;
exec function Slap(string Player, int Strength)
{
    Level.Game.Broadcast(None, Player @ &quot;was slapped with strength&quot; @ Strength);
}
&lt;/uscript&gt;

When entering this console command, separate the parameters with blanks (not commas).  If the last function parameter is a string, it gobbles up everything that's remaining on the console command line.

  (&gt; Slap Mychaeel 1337
  Mychaeel was slapped with strength 1337

You can make exec function parameters [[Legacy:Function Syntax|optional]] if you want.

==Valid Places for Exec Functions==

Exec functions can be declared anywhere, but they only actually work in the following objects:

''(Note: this is only for UT2003/4, not UT or Unreal 1)''
* the [[Legacy:Console|Console]] interaction
* the [[Legacy:GameInfo|GameInfo]] actor (keep in mind that the GameInfo only exists on the server, though)
* the local player's [[Legacy:HUD|HUD]] actor
* the local player's [[Legacy:CheatManager|CheatManager]] (only offline)
* the local player's AdminManager (an [[Legacy:AdminBase|AdminBase]] subclass, only when logged in as admin and only available on the serverside)
* the local [[Legacy:PlayerController|PlayerController]]
* the local player's [[Legacy:PlayerInput|PlayerInput]]
* the local player's [[Legacy:Pawn|Pawn]]
* that Pawn's selected [[Legacy:Weapon|Weapon]] and SelectedItem ([[Legacy:Inventory|Inventory]])
* in UT2004 also any local [[Legacy:Interaction|Interaction]]

You can not declare a *working* exec function in a mutator. You *can*, however, define the function Mutate(), which gets called from the console (see [[Legacy:Mutator|Mutator]]).

Note that an exec function must be [[Legacy:Simulated Function|simulated]] to work client-side.

==Related Topics==

* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] &amp;ndash; adding your custom console commands to the game's ''Controls'' setup menu.

==Discussion==

'''unknown:''' I put a file in UT2004/System/ called 'mysummon.ini', and put:

&lt;uscript&gt;
exec function myGod()
{
  bGodMode = !bGodMode; 
  ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

I startup UT2004 and type: &gt; myGod

into the console...but it says &quot;Command not found&quot;, or something like that :(

'''EntropicLqd:''' That's because an ini file is not a valid place for an exec function.  Ini files cannot contain code.  You would need to create your own class (see &quot;valid places for an exec function&quot; above).

'''orathaic''' Also note, bGodMode is a variable of the class controller, (and it's subclasses) This is the only variable which prevents death. So presumably you should access it with something like &lt;uscript&gt;MyController.bGodMode = !MyController.bGodMode&lt;/uscript&gt;

 or access it from the controller itself.

'''XxDangerxX:''' In what classes must you declare an exec function in UT? Also, how do you 'activate' the actor that has the exec function so that you can type it in the console?

'''VerteX''' well, i subclassed CheatManager, hooked it up so it modifies PlayerController and sets the game's cheat manager to MyCheatManager, then i tried my cheat (a custom allweapons). No go.

'''XxDangerxX:''' I've put an exec function in an Inventory item I'm making. It works! Yay! One problem though - it will only work in the console, not the quick console. What might be the cause for this? This is for UT '99.</text>
    </revision>
    <revision>
      <id>33146</id>
      <timestamp>2008-10-18T09:18:31Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <comment>/* Valid Places for Exec Functions */</comment>
      <text xml:space="preserve">'''Exec Functions''' are [[Legacy:Function|function]]s that a player or user can execute by typing its name in the [[Legacy:Console|console]].  Basically, they provide a way to define new console commands in [[Legacy:UnrealScript|UnrealScript]] code.

&lt;uscript&gt;
exec function God()
{
    if ( bGodMode )
    {
        bGodMode = false;
        ClientMessage(&quot;God mode off&quot;);
        return;
    }

    bGodMode = true; 
    ClientMessage(&quot;God Mode on&quot;);
}
&lt;/uscript&gt;

'''Eliot:'''theres a much easyer way to do this like this example.

&lt;uscript&gt;
exec function God()
{
    bGodMode = !bGodMode; 
    ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

==Passing Parameters==

You can allow parameters for your console command by simply adding those parameters to the exec function's definition:

&lt;uscript&gt;
exec function Slap(string Player, int Strength)
{
    Level.Game.Broadcast(None, Player @ &quot;was slapped with strength&quot; @ Strength);
}
&lt;/uscript&gt;

When entering this console command, separate the parameters with blanks (not commas).  If the last function parameter is a string, it gobbles up everything that's remaining on the console command line.

  (&gt; Slap Mychaeel 1337
  Mychaeel was slapped with strength 1337

You can make exec function parameters [[Legacy:Function Syntax|optional]] if you want.

==Valid Places for Exec Functions==

Exec functions can be declared anywhere, but they only actually work in the following objects:

''(Note: this is only for UT2003/4, not UT or Unreal 1)''
* the [[Legacy:Console|Console]] interaction
* the [[Legacy:GameInfo|GameInfo]] actor (keep in mind that the GameInfo only exists on the server, though)
* the local player's [[Legacy:HUD|HUD]] actor
* the local player's [[Legacy:CheatManager|CheatManager]] (only offline)
* the local player's AdminManager (an [[Legacy:AdminBase|AdminBase]] subclass, only when logged in as admin and only available on the serverside)
* the local [[Legacy:PlayerController|PlayerController]]
* the local player's [[Legacy:PlayerInput|PlayerInput]]
* the local player's [[Legacy:Pawn|Pawn]]
* that Pawn's selected [[Legacy:Weapon|Weapon]] and SelectedItem ([[Legacy:Inventory|Inventory]])
* in UT2004 also any local [[Legacy:Interaction|Interaction]]

You can not declare a working exec function in a mutator. You *can*, however, define the function Mutate(), which gets called from the console (see [[Legacy:Mutator|Mutator]]).

Note that an exec function must be [[Legacy:Simulated Function|simulated]] to work client-side.

==Related Topics==

* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] &amp;ndash; adding your custom console commands to the game's ''Controls'' setup menu.

==Discussion==

'''unknown:''' I put a file in UT2004/System/ called 'mysummon.ini', and put:

&lt;uscript&gt;
exec function myGod()
{
  bGodMode = !bGodMode; 
  ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

I startup UT2004 and type: &gt; myGod

into the console...but it says &quot;Command not found&quot;, or something like that :(

'''EntropicLqd:''' That's because an ini file is not a valid place for an exec function.  Ini files cannot contain code.  You would need to create your own class (see &quot;valid places for an exec function&quot; above).

'''orathaic''' Also note, bGodMode is a variable of the class controller, (and it's subclasses) This is the only variable which prevents death. So presumably you should access it with something like &lt;uscript&gt;MyController.bGodMode = !MyController.bGodMode&lt;/uscript&gt;

 or access it from the controller itself.

'''XxDangerxX:''' In what classes must you declare an exec function in UT? Also, how do you 'activate' the actor that has the exec function so that you can type it in the console?

'''VerteX''' well, i subclassed CheatManager, hooked it up so it modifies PlayerController and sets the game's cheat manager to MyCheatManager, then i tried my cheat (a custom allweapons). No go.

'''XxDangerxX:''' I've put an exec function in an Inventory item I'm making. It works! Yay! One problem though - it will only work in the console, not the quick console. What might be the cause for this? This is for UT '99.</text>
    </revision>
    <revision>
      <id>33147</id>
      <timestamp>2008-10-18T09:29:09Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <comment>/* Valid Places for Exec Functions */</comment>
      <text xml:space="preserve">'''Exec Functions''' are [[Legacy:Function|function]]s that a player or user can execute by typing its name in the [[Legacy:Console|console]].  Basically, they provide a way to define new console commands in [[Legacy:UnrealScript|UnrealScript]] code.

&lt;uscript&gt;
exec function God()
{
    if ( bGodMode )
    {
        bGodMode = false;
        ClientMessage(&quot;God mode off&quot;);
        return;
    }

    bGodMode = true; 
    ClientMessage(&quot;God Mode on&quot;);
}
&lt;/uscript&gt;

'''Eliot:'''theres a much easyer way to do this like this example.

&lt;uscript&gt;
exec function God()
{
    bGodMode = !bGodMode; 
    ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

==Passing Parameters==

You can allow parameters for your console command by simply adding those parameters to the exec function's definition:

&lt;uscript&gt;
exec function Slap(string Player, int Strength)
{
    Level.Game.Broadcast(None, Player @ &quot;was slapped with strength&quot; @ Strength);
}
&lt;/uscript&gt;

When entering this console command, separate the parameters with blanks (not commas).  If the last function parameter is a string, it gobbles up everything that's remaining on the console command line.

  (&gt; Slap Mychaeel 1337
  Mychaeel was slapped with strength 1337

You can make exec function parameters [[Legacy:Function Syntax|optional]] if you want.

==Valid Places for Exec Functions==

Exec functions can be declared anywhere, but they only actually work in the following objects:

''(Note: this is only for UT2003/4, not UT or Unreal 1)''
* the [[Legacy:Console|Console]] interaction
* the [[Legacy:GameInfo|GameInfo]] actor (keep in mind that the GameInfo only exists on the server, though)
* the local player's [[Legacy:HUD|HUD]] actor
* the local player's [[Legacy:CheatManager|CheatManager]] (only offline)
* the local player's AdminManager (an [[Legacy:AdminBase|AdminBase]] subclass, only when logged in as admin and only available on the serverside)
* the local [[Legacy:PlayerController|PlayerController]]
* the local player's [[Legacy:PlayerInput|PlayerInput]]
* the local player's [[Legacy:Pawn|Pawn]]
* that Pawn's selected [[Legacy:Weapon|Weapon]] and SelectedItem ([[Legacy:Inventory|Inventory]])
* in UT2004 also any local [[Legacy:Interaction|Interaction]]

You can not declare a working exec function in a mutator. You *can*, however, define the function Mutate(), which gets called from the console (see [[Legacy:Mutator|Mutator]] or [[Legacy:Mutator (UT)|Mutator (UT)]]).

Note that an exec function must be [[Legacy:Simulated Function|simulated]] to work client-side.

==Related Topics==

* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]] &amp;ndash; adding your custom console commands to the game's ''Controls'' setup menu.

==Discussion==

'''unknown:''' I put a file in UT2004/System/ called 'mysummon.ini', and put:

&lt;uscript&gt;
exec function myGod()
{
  bGodMode = !bGodMode; 
  ClientMessage(&quot;GodMode:&quot;@bGodMode);
}
&lt;/uscript&gt;

I startup UT2004 and type: &gt; myGod

into the console...but it says &quot;Command not found&quot;, or something like that :(

'''EntropicLqd:''' That's because an ini file is not a valid place for an exec function.  Ini files cannot contain code.  You would need to create your own class (see &quot;valid places for an exec function&quot; above).

'''orathaic''' Also note, bGodMode is a variable of the class controller, (and it's subclasses) This is the only variable which prevents death. So presumably you should access it with something like &lt;uscript&gt;MyController.bGodMode = !MyController.bGodMode&lt;/uscript&gt;

 or access it from the controller itself.

'''XxDangerxX:''' In what classes must you declare an exec function in UT? Also, how do you 'activate' the actor that has the exec function so that you can type it in the console?

'''VerteX''' well, i subclassed CheatManager, hooked it up so it modifies PlayerController and sets the game's cheat manager to MyCheatManager, then i tried my cheat (a custom allweapons). No go.

'''XxDangerxX:''' I've put an exec function in an Inventory item I'm making. It works! Yay! One problem though - it will only work in the console, not the quick console. What might be the cause for this? This is for UT '99.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ExplodingWall</title>
    <id>1101</id>
    <revision>
      <id>2908</id>
      <timestamp>2006-01-01T16:31:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ExplodingWall (Package: UnrealShare)}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ExplodingWall &gt;&gt; BreakingGlass (Package: UnrealShare)}}

They Both look like a little explosion.

'''UT-Only information'''. 

In UT2003 [[Legacy:Emitter|Emitter]]s can be used to create far better glass breaking effects. The [[udn2:EmittersExample]] page has a description on how to create a [http://udn.epicgames.com/pub/Content/EmittersExamples/#Breaking_Glass Breaking Glass] effect.

==ExplodingWall Properties ==

; BreakingSound : Select the sound you'd like to use whe the wall breaks.
; TranslucentGlass : If you want your glass pieces to be transparent.
; UnlitGlass : If you want glass pieces to be unlit.
; ExplosionDimension : Affects how big the explosion is. ''Experiment''
; ExplosionSize : Affects how big the explosion is. ''Experiment''
; GlassParticleSize : How big the exploding pieces are. ''Experiment''
; GlassTexture : What texture you'd like the glass to be. 
; Health : If you'd like to make your wall be able to sustain some damage before exploding than use this.
; NumGlassChunks : How many chunks/pieces of glass. ''Experiment''

NumWoodChunks/NumWallChunks, WallTexture/WoodTexture, WallParticleSize/WoodParticleSize are same as glass properties except they are for differnt materials.  You can choose to have a mix of all three if you have a wall say which is concrete and has wood and a window or use just two or a single one.  It is upto you.  Have fun and experiment.  Make sure that you do not have chunks that are too big and a lot of partciles on screen at once to prevent lag.

; bOnlyTriggerable (in Effects): If you'd like to set it off with a trigger instead of weapons based damage. Make sure to set Events -&gt; Tag to tie it to a [[Legacy:Trigger|Trigger]]. 

==BreakingGlass ==

Breaking Glass is the same as Exploding wall actor except it has an additional property called BreakingGlass -&gt; BreakingGlass where you can set the number of particles and size without messing in the ExplodingWall properties.  You also do not need to specify a glass texture here since it is automatically set to use a default one. Basically this actor is redundant as you can do the same thing with the ExplodingWall Texture.

The tutorial [[Legacy:Making Glass Break|Making Glass Break]] explains how to use this actor.

==Custom Subclasses==
* [[Legacy:RetriggerableBreakingGlass|RetriggerableBreakingGlass]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2909</id>
      <timestamp>2003-04-05T19:53:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>cleanup &amp; class tag</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ExplodingWall (Package: UnrealShare)}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ExplodingWall &gt;&gt; BreakingGlass (Package: UnrealShare)}}

They Both look like a little explosion.

'''UT-Only information'''. 

In UT2003 [[Legacy:Emitter|Emitter]]s can be used to create far better glass breaking effects. The [[udn2:EmittersExample]] page has a description on how to create a [http://udn.epicgames.com/pub/Content/EmittersExamples/#Breaking_Glass Breaking Glass] effect.

==ExplodingWall Properties ==

; BreakingSound : Select the sound you'd like to use whe the wall breaks.
; TranslucentGlass : If you want your glass pieces to be transparent.
; UnlitGlass : If you want glass pieces to be unlit.
; ExplosionDimension : Affects how big the explosion is. ''Experiment''
; ExplosionSize : Affects how big the explosion is. ''Experiment''
; GlassParticleSize : How big the exploding pieces are. ''Experiment''
; GlassTexture : What texture you'd like the glass to be. 
; Health : If you'd like to make your wall be able to sustain some damage before exploding than use this.
; NumGlassChunks : How many chunks/pieces of glass. ''Experiment''

NumWoodChunks/NumWallChunks, WallTexture/WoodTexture, WallParticleSize/WoodParticleSize are same as glass properties except they are for differnt materials.  You can choose to have a mix of all three if you have a wall say which is concrete and has wood and a window or use just two or a single one.  It is upto you.  Have fun and experiment.  Make sure that you do not have chunks that are too big and a lot of partciles on screen at once to prevent lag.

; bOnlyTriggerable (in Effects): If you'd like to set it off with a trigger instead of weapons based damage. Make sure to set Events -&gt; Tag to tie it to a [[Legacy:Trigger|Trigger]]. 

==BreakingGlass ==

Breaking Glass is the same as Exploding wall actor except it has an additional property called BreakingGlass -&gt; BreakingGlass where you can set the number of particles and size without messing in the ExplodingWall properties.  You also do not need to specify a glass texture here since it is automatically set to use a default one. Basically this actor is redundant as you can do the same thing with the ExplodingWall Texture.

The tutorial [[Legacy:Making Glass Break|Making Glass Break]] explains how to use this actor.

==Comments ==

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ExplosionChain</title>
    <id>1102</id>
    <revision>
      <id>2910</id>
      <timestamp>2007-11-19T12:19:42Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ExplosionChain (custom)}}

...a description of what it actually does is required here...

When triggered, this actor spawns an explosion sprite (class SpriteBallExplosion) and hurts things nearby. Because of the way it is scripted, it cannot be retriggered. See below for a fix.

==Properties ==
; MomentumTransfer : is passed to the HurtRadius function &amp;ndash; presumably the momentum applied to actors affected by the explosion.
; Damage : the amount of damage to inflict on surrounding actors. The radius affected is this value + 100.
; Size : scaling of the explosion sprite
; Delaytime : the explosion is delayed by a random amount, between 1 and 3 times this value.

==Comments ==

For some reason I could only add this to a map in an orthogonal viewport, not in 3D. Could someone confirm this?

'''Mychaeel:'''  UnrealEd frequently says &quot;Actor doesn't fit here&quot; when you try to place an ExplosionChain in 3D view even though its collision size is zero.  It occasionally works though even in 3D view.

This has been scripted so it's triggered... yet setting bOnlyTriggerable to true will make it ignore triggers... weird.

'''Mychaeel:'''  Hard to believe from the code.  bOnlyTriggerable should indeed make the ExplosionChain only triggerable (otherwise it could also be set off by inflicting damage on it).

'''Tarquin:'''  It was probably me that wrote that, and it looks like I read the code wrong... oops. Trigger calls TakeDamage, which is short-circuited if &lt;code&gt;bOnlyTriggerable &amp;&amp; DamageType!='Detonated')&lt;/code&gt;. 

Which part of the script actually makes a noise? 

What does the 'detonated' damage type do? 

'''RFairey:'''  The part of the code that makes a noise is in the class [[Legacy:SpriteBallExplosion|SpriteBallExplosion]], which is spawned in the Explosion Chain code. In turn, SpriteBallExplosion spawns the class [[Legacy:SpriteBallChild|SpriteBallChild]], and some smoke effects too. I think the detonated damage type is for the death message if you are caught in the blast, &quot;Player1 was detonated&quot; or something.

==Examples ==

Tutorials which use this actor:
* [[Legacy:Landmines (UT)|Landmines (UT)]]
* [[Legacy:Laser Trip Bomb|Laser Trip Bomb]]

==Extending ==

This actor destroys itself once it has been triggered and exploded, so the explosions can only be triggered once. To make it repeatable, subclass it with the following code. This class has been tested, a demo map is available from [[Legacy:Tarquin|Tarquin]] and will probably be posted here at some point. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script.

&lt;uscript&gt;
//=============================================================================
// RepeatExplosionChain.
//=============================================================================
class RepeatExplosionChain extends ExplosionChain;

state Exploding
{
	function Timer()
	{
		local SpriteBallExplosion f;
		
		bExploding = true;
 		HurtRadius(damage, Damage+100, 'Detonated', MomentumTransfer, Location);
 		f = Spawn(class'SpriteBallExplosion',,,Location + vect(0,0,1)*16,rot(16384,0,0)); 
 		f.DrawScale = (Damage/100+0.4+FRand()*0.5)*Size;
		GotoState('');
	}
}
&lt;/uscript&gt;

If there's an easier way to make it repeatable, please add it to this page.

Setting Advanced.bNoDelete won't work because once triggered it's put into Exploding state, which ignores the listening function.

==Related Topics ==
* [[Legacy:Open Source|Open Source]]

----

'''Dark Pulse:''' Is there any way to STOP the explosion once it's started? I figured this would just allow a repeatedly triggerable explosion, not one that goes on forever...

'''Foxpaw:''' You can stop the explosions by stopping the timer. I believe you can stop the timer by setting it to 0. I'm not sure if you can set the state to a blank like that, maybe you can, or you might need to make a dummy state for that purpose.

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2911</id>
      <timestamp>2005-12-20T18:41:50Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; ExplosionChain (custom)}}

...a description of what it actually does is required here...

When triggered, this actor spawns an explosion sprite (class SpriteBallExplosion) and hurts things nearby. Because of the way it is scripted, it cannot be retriggered. See below for a fix.

==Properties ==
; MomentumTransfer : is passed to the HurtRadius function &amp;ndash; presumably the momentum applied to actors affected by the explosion.
; Damage : the amount of damage to inflict on surrounding actors. The radius affected is this value + 100.
; Size : scaling of the explosion sprite
; Delaytime : the explosion is delayed by a random amount, between 1 and 3 times this value.

==Comments ==

For some reason I could only add this to a map in an orthogonal viewport, not in 3D. Could someone confirm this?

'''Mychaeel:'''  UnrealEd frequently says &quot;Actor doesn't fit here&quot; when you try to place an ExplosionChain in 3D view even though its collision size is zero.  It occasionally works though even in 3D view.

This has been scripted so it's triggered... yet setting bOnlyTriggerable to true will make it ignore triggers... weird.

'''Mychaeel:'''  Hard to believe from the code.  bOnlyTriggerable should indeed make the ExplosionChain only triggerable (otherwise it could also be set off by inflicting damage on it).

'''Tarquin:'''  It was probably me that wrote that, and it looks like I read the code wrong... oops. Trigger calls TakeDamage, which is short-circuited if &lt;code&gt;bOnlyTriggerable &amp;&amp; DamageType!='Detonated')&lt;/code&gt;. 

Which part of the script actually makes a noise? 

What does the 'detonated' damage type do? 

'''RFairey:'''  The part of the code that makes a noise is in the class [[Legacy:SpriteBallExplosion|SpriteBallExplosion]], which is spawned in the Explosion Chain code. In turn, SpriteBallExplosion spawns the class [[Legacy:SpriteBallChild|SpriteBallChild]], and some smoke effects too. I think the detonated damage type is for the death message if you are caught in the blast, &quot;Player1 was detonated&quot; or something.

==Examples ==

Tutorials which use this actor:
* [[Legacy:Landmines (UT)|Landmines (UT)]]
* [[Legacy:Laser Trip Bomb|Laser Trip Bomb]]

==Extending ==

This actor destroys itself once it has been triggered and exploded, so the explosions can only be triggered once. To make it repeatable, subclass it with the following code. This class has been tested, a demo map is available from [[Legacy:Tarquin|Tarquin]] and will probably be posted here at some point. See [[Legacy:Create A Subclass|Create A Subclass]] and [[Legacy:Embedding Code|Embedding Code]] for how to use this script.

&lt;uscript&gt;
//=============================================================================
// RepeatExplosionChain.
//=============================================================================
class RepeatExplosionChain extends ExplosionChain;

state Exploding
{
	function Timer()
	{
		local SpriteBallExplosion f;
		
		bExploding = true;
 		HurtRadius(damage, Damage+100, 'Detonated', MomentumTransfer, Location);
 		f = Spawn(class'SpriteBallExplosion',,,Location + vect(0,0,1)*16,rot(16384,0,0)); 
 		f.DrawScale = (Damage/100+0.4+FRand()*0.5)*Size;
		GotoState('');
	}
}
&lt;/uscript&gt;

If there's an easier way to make it repeatable, please add it to this page.

Setting Advanced.bNoDelete won't work because once triggered it's put into Exploding state, which ignores the listening function.

==Related Topics ==
* [[Legacy:Open Source|Open Source]]

----

'''Dark Pulse:''' Is there any way to STOP the explosion once it's started? I figured this would just allow a repeatedly triggerable explosion, not one that goes on forever...

'''Foxpaw:''' You can stop the explosions by stopping the timer. I believe you can stop the timer by setting it to 0. I'm not sure if you can set the state to a blank like that, maybe you can, or you might need to make a dummy state for that purpose.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ExportCacheCommandlet</title>
    <id>1199</id>
    <revision>
      <id>3114</id>
      <timestamp>2007-11-19T12:21:10Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; ExportCacheCommandlet (Package: Engine, no script code)}}

This commandlet exports the cacheable classes from a package to that package's UCL file for custom mutators, weapons, gametypes, vehicles, crosshair packs, announcer voices and maps. To run it on one or more packages, simply use the following command:

 ucc exportcache ''package1''.u ''package2''.u ..\Maps\''package3''.ut2 ...

As you can see you can specify multiple packages, seperated by whitespaces and each with its file extension. When the package is not located in the {[[Legacy:Base Directory|Base Directory]]}\System directory you will have to specify a path name as well.

==Larger mods==

If you are creating a larger mod that contains multiple packages that contain items to be used for caching (maps, mutators, gametypes). You might want to group all cache records into a single cache file and include that with your distribution. This reduces the clutter in the homepage. To create a single cache file simply append ''cachefile''.ucl to the end of the commandline. 

Batching the cache file creation might be usefull, by default the cache file is overwritten everytime the commandlet is executed. When the ''-a'' switch is used the records are appended. So you might want to add something like the following to your mod's build batch file:

 del MyModCache.ucl
 ucc exportcache -a MyMod*.u MyModCache.ucl
 ucc exportcache -a ..\Maps\MyMod-*.ut2 MyModCache.ucl

==Related Classes==
* [[Legacy:AnnouncerVoice|AnnouncerVoice]]
* [[Legacy:CacheManager|CacheManager]]
* [[Legacy:CrosshairPack|CrosshairPack]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]
* [[Legacy:Vehicle|Vehicle]]
* [[Legacy:Weapon|Weapon]]

==Related Topics==
* [[Legacy:Class Syntax|Class Syntax]] &amp;ndash; CacheExempt keyword
* [[Legacy:Variable Syntax|Variable Syntax]] &amp;ndash; Cache variable modifier
* [[udn2:UnrealCacheLists]] &amp;ndash; UDN docment covering the UnrealEngine2.5 Caching System

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Toolchain|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3115</id>
      <timestamp>2004-12-20T11:44:15Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>yes very usefull</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; ExportCacheCommandlet (Package: Engine, no script code)}}

This commandlet exports the cacheable classes from a package to that package's UCL file for custom mutators, weapons, gametypes, vehicles, crosshair packs, announcer voices and maps. To run it on one or more packages, simply use the following command:

 ucc exportcache ''package1''.u ''package2''.u ..\Maps\''package3''.ut2 ...

As you can see you can specify multiple packages, seperated by whitespaces and each with its file extension. When the package is not located in the {[[Legacy:Base Directory|Base Directory]]}\System directory you will have to specify a path name as well.

==Related Classes==
* [[Legacy:AnnouncerVoice|AnnouncerVoice]]
* [[Legacy:CacheManager|CacheManager]]
* [[Legacy:CrosshairPack|CrosshairPack]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]
* [[Legacy:Vehicle|Vehicle]]
* [[Legacy:Weapon|Weapon]]

==Related Topics==
* [[Legacy:Class Syntax|Class Syntax]] &amp;ndash; CacheExempt keyword
* [[Legacy:Variable Syntax|Variable Syntax]] &amp;ndash; Cache variable modifier
* [[udn2:UnrealCacheLists]] &amp;ndash; UDN docment covering the UnrealEngine2.5 Caching System

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3116</id>
      <timestamp>2005-01-08T18:31:45Z</timestamp>
      <contributor>
        <ip>Smattbac</ip>
      </contributor>
      <minor/>
      <comment>Spelling error..</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; ExportCacheCommandlet (Package: Engine, no script code)}}

This commandlet exports the cacheable classes from a package to that package's UCL file for custom mutators, weapons, gametypes, vehicles, crosshair packs, announcer voices and maps. To run it on one or more packages, simply use the following command:

 ucc exportcache ''package1''.u ''package2''.u ..\Maps\''package3''.ut2 ...

As you can see you can specify multiple packages, seperated by whitespaces and each with its file extension. When the package is not located in the {[[Legacy:Base Directory|Base Directory]]}\System directory you will have to specify a path name as well.

==Larger mods==

If you are creating a larger mod that contains multiple packages that contain items to be used for caching (maps, mutators, gametypes). You might want to group all cache records into a single cache file and include that with your distribution. This reduces the clutter in the homepage. To create a single cache file simply append ''cachefile''.ucl to the end of the commandline. 

Batching the cache file creation might be usefull, by default the cache file is overwritten everytime the commandlet is executed. When the ''-a'' switch is used the records are appended. So you might want to add something like the following to your mod's build batch file:

 del MyModCache.ucl
 ucc exportcache -a MyMod*.u MyModCache.ucl
 ucc exportcache -a ..\Maps\MyMod-*.ut2 MyModCache.ucl

==Related Classes==
* [[Legacy:AnnouncerVoice|AnnouncerVoice]]
* [[Legacy:CacheManager|CacheManager]]
* [[Legacy:CrosshairPack|CrosshairPack]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]
* [[Legacy:Vehicle|Vehicle]]
* [[Legacy:Weapon|Weapon]]

==Related Topics==
* [[Legacy:Class Syntax|Class Syntax]] &amp;ndash; CacheExempt keyword
* [[Legacy:Variable Syntax|Variable Syntax]] &amp;ndash; Cache variable modifier
* [[udn2:UnrealCacheLists]] &amp;ndash; UDN docment covering the UnrealEngine2.5 Caching System

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Extend The Dynamic Array</title>
    <id>1172</id>
    <revision>
      <id>3062</id>
      <timestamp>2003-11-24T17:26:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

A dynamic array property works like an array property, in that it displays a subtree of numbered items. But a dynamic array usually starts off empty. The [[Legacy:Actor/Display|Display]] -&gt; Skins property is a good example.

[[Image:Legacy_interface-Ed3-dynamicarray-1.png|center|]]

When the property is active, two widget buttons appear: Empty and Add. Clicking Add creates a new entry at the end of the dynamic array. Empty would remove all entries.

[[Image:Legacy_interface-Ed3-dynamicarray-2.png|center|]]

This entry works just like any other property. In this example, the property type is a texture, so it has buttons of its own to [[Legacy:Set The Resource Property|set the resource property]]. There are also the Delete and Insert buttons, which delete the selected array entry or insert a new entry above the selected one respectively.

==Comments==

'''Chip:''' Is &quot;extend&quot; the best word for the title, since it's similar to an Unreal Script keyword? Granted the context is very different, but it might be confusing for beginners. How about &quot;populate&quot;?

'''Wormbo:''' This page will only rarely be linked from coding pages and mappers usually don't care about UnrealScript-related things like words being similar some UScript keywords.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3063</id>
      <timestamp>2003-11-24T16:48:30Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <text xml:space="preserve">A dynamic array property works like an array property, in that it displays a subtree of numbered items. But a dynamic array usually starts off empty. The [[Legacy:Actor/Display|Display]] -&gt; Skins property is a good example.

[[Image:Legacy_interface-Ed3-dynamicarray-1.png|center|When the property is active, two widget buttons appear: Empty and Add.]]

[[Image:Legacy_interface-Ed3-dynamicarray-2.png|center|Clicking Add creates a new entry in the dynamic array. This entry works just like any other property. In this example, the property type is a texture, so it has buttons of its own to [[Legacy:Set The Resource Property|set the resource property]].]]

==Comments==

'''Chip:''' Is &quot;extend&quot; the best word for the title, since it's similar to an Unreal Script keyword? Granted the context is very different, but it might be confusing for beginners. How about &quot;populate&quot;?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ExtendedConsole</title>
    <id>28288</id>
    <revision>
      <id>39945</id>
      <timestamp>2009-11-14T18:24:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ExtendedToolbar</title>
    <id>28235</id>
    <revision>
      <id>39857</id>
      <timestamp>2009-11-14T11:32:44Z</timestamp>
      <contributor>
        <username>Jan</username>
        <id>1621</id>
      </contributor>
      <comment>moved [[Legacy:ExtendedToolbar]] to [[Extended Toolbar]]</comment>
      <text xml:space="preserve">#REDIRECT [[Extended Toolbar]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Extending States</title>
    <id>1096</id>
    <revision>
      <id>2897</id>
      <timestamp>2006-04-24T15:56:40Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <minor/>
      <comment>typo</comment>
      <text xml:space="preserve">[[Legacy:State|State]]s can be extended in the same way as classes. A state that extends another inherits functions of its parent state, and can of course override them or add new ones.

Extending states is probably most useful within a single class. With a child class, there is already inheritance: the Child's state Foo inherits the Parent's state Foo anyway. Extending states is useful if you have a state Foo and you also want a state FooSpecialCase, perhaps.

==Example==

(needs to be rewritten, as is overly complex...)

Suppose we have a class Monster and a subclass BugEyedMonster. 

Monster has the following states:
* Idle
* Attacking

BugEyedMonster inherits these states. We can do the following:

===Add to an Inherited State===

e.g. Add a function RollEyes to the Attacking state. (though I'm not sure what happens to label code outside of functions. help!)
: AFAIK label code outside of functions are simply executed when control is passed there via the Goto() command.  Epic pretty much always have a set of function calls after the label which invariably change the state of the object to make it do more stuff.  When defining a state they place all of the functions within the state first and then have a series of labels after the functions that do appropriate &quot;stuff&quot;.  In subclasses it ''looks'' like you can redefine labels to &quot;override them&quot; but you can never call up to the label defined in the superclass once it has been overidden in the subclass's state. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

===Add a New State===

e.g. RunningAway (because BugEyedMonsters are very cowardly)

This state will inherit functions from BugEyedMonster's null state

===Extend a State===

e.g. ScratchingButt extends Idle. We'd want most of the functionality of Idle, but with an extra occasional animation. We'd also have to add to our inherited Idle state to sometimes switch to ScratchingButt depending on circumstances.

: &lt;i&gt;I've probably got it all wrong, but if it makes Mych laugh enough he may fix it. :-)  &amp;ndash; ''Tarquin''&lt;/i&gt; 

So if we consider a function present in Monster, eg Trigger, we now have this in several flavours:

In Monster we have:
* Trigger() in null state
** Idle.Trigger() inherits null.Trigger unless we override
** Atacking.Trigger() inherits null.Trigger unless we override

In BugEyedMonster we have
* Trigger() in null state, inherits Monster.Trigger unless we override
** Idle.Trigger() &amp;ndash; this is the confusing one. see below
** Atacking.Trigger()
** ScratchingButt.Trigger() inherits Idle.Trigger() unless we override

{{innerbox|
from [[Legacy:UnrealScript Language Reference/States|UnrealScript Language Reference/States]]

The scoping rules, which resolves these complex situations, are:
* If the object is in a state, and an implementation of the function exists somewhere in that state (either in the actor?s class or in some parent class), the most-derived state version of the function is called.
* Otherwise, the most-derived non-state version of the function is called. 



}}

==Examples==

''Taken from a Discussion on UnrealScript Language Test:''

'''Wormbo:''' What I mean with &quot;super states&quot; is:

&lt;uscript&gt;
class SomeClass extends Actor;

// Super() compiler bug:
function A()
{
  // super call to sibling class function that doesn't exist in this or the super class
  Super(DestroyableTrigger).SpawnEffects(); // compiles and even executes! (spawns some visual effects)
}

// Super states:

// new function, does not exist in Actor
function X()
{
  log(&quot;SomeClass global X&quot;);
}

// new state, does not exist in Actor
state BaseState
{
  function X()
  {
    log(&quot;SomeClass BaseState X&quot;);
    // Super.X() -&gt; &quot;Error, Unknown Function 'X' in 'Class Engine.Actor'&quot;
    Global.X(); // logs the same
  }
}

state ExtendedState extends BaseState
{
  function X()
  {
    log(&quot;SomeClass ExtendedState X&quot;);
    Super.X();  // &quot;SomeClass BaseState X&quot;
    Global.X(); // &quot;SomeClass global X&quot;
  }
}

state AnotherExtendedState extends ExtendedState
{
  function X()
  {
    log(&quot;SomeClass AnotherExtendedState X&quot;);
    Super.X();  // &quot;SomeClass ExtendedState X&quot;
    // it's not possible to call &quot;SomeClass BaseState X&quot; directly through a Super(Something).X() construction:
    // Super(BaseState).X() -&gt; &quot;Error, Bad class name 'BaseState'&quot;
    // Super(SomeClass.BaseState).X() -&gt; &quot;Error, Missing ')' in 'super(classname)'&quot;
    Global.X(); // &quot;SomeClass global X&quot;
  }
}
&lt;/uscript&gt;

If the object is in state AnotherExtendedState, it will log the following when X is called:
 SomeClass AnotherExtendedState X
 SomeClass ExtendedState X
 SomeClass BaseState X
 SomeClass global X
 SomeClass global X
 SomeClass global X

The calling structure looks like this:

+AnotherExtendedState.X()

++ExtendedState.X()

+++BaseState.X()

++++global X()

+++global X()

++global X()

'''OlympusMons:''' Ahh yes thats very, very clever wormbo :D How did you ever come up with that concept, might be handy for some AI or something.

'''Wormbo:''' PlayerController already uses the concept of extending states within the sme class with BaseSpectating being the base state for Spectating, AttractMode and WaitingForPawn. The Bot class makes extensive use of extending states as well:

+MoveToGoal

++MoveToGoalWithEnemy

+++Fallback

++++Retreating

+++Charging

+++VehicleCharging

+++Hunting

++MoveToGoalNoEnemy

+++Roaming

+NoGoal

++RestFormation

==Base state function overriding and extended states==

There's a catch with behaviour of extended states when a base state function in subclass is overriden. Suppose we have class like this one:

&lt;uscript line&gt;
class SbA extends Actor;

function Test()
{
	Log(&quot;A&quot; @GetStateName() ,name);
}

function PostBeginPlay()
{
	Test();
	GotoState('SBase'); Test();
	GotoState('SExtended'); Test();
	Destroy();
}

state SBase
{
	function Test()
	{
		Log(&quot;A.Base&quot; @GetStateName() ,name);
	}
	
}

state SExtended extends SBase
{
}

/*
Log:
SbA: A SbA
SbA: A.Base SBase
SbA: A.Base SExtended
*/
&lt;/uscript&gt;This actor behaves as expected.

Lets override the test function in a subclass:

&lt;uscript line&gt;
class SbB extends SbA;

state SBase
{
	function Test()
	{
		Log(&quot;B.Base&quot; @GetStateName() ,name);
	}
}

state SExtended
{
}

/*
Log:
SbB: A SbB
SbB: B.Base SBase
SbB: A.Base SExtended
*/
&lt;/uscript&gt;

Notice that in SExtended state SbB.SBase.Test() wasn't called.

===Workarounds:===

Duplicate the function so it's in SbB.SBase and SbB.SExtended?

==Related Topics==
* [[Legacy:State|State]]
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

==Discussion==

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Revise tutorial fill in with uscript examples.
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>2898</id>
      <timestamp>2006-04-07T07:57:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">[[Legacy:State|State]]s can be extended in the same way as classes. A state that extends another inherits functions of its parent state, and can of course override them or add new ones.

Extending states is probably most useful within a single class. With a child class, there is already inheritance: the Child's state Foo inherits the Parent's state Foo anyway. Extending states is useful if you have a state Foo and you also want a state FooSpecialCase, perhaps.

==Example==

(needs to be rewritten, as is overly complex...)

Suppose we have a class Monster and a subclass BugEyedMonster. 

Monster has the following states:
* Idle
* Attacking

BugEyedMonster inherits these states. We can do the following:

===Add to an Inherited State===

e.g. Add a function RollEyes to the Attacking state. (though I'm not sure what happens to label code outside of functions. help!)
: AFAIK label code outside of functions are simply executed when control is passed there via the Goto() command.  Epic pretty much always have a set of function calls after the label which invariably change the state of the object to make it do more stuff.  When defining a state they place all of the functions within the state first and then have a series of labels after the functions that do appropriate &quot;stuff&quot;.  In subclasses it ''looks'' like you can redefine labels to &quot;override them&quot; but you can never call up to the label defined in the superclass once it has been overidden in the subclass's state. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

===Add a New State===

e.g. RunningAway (because BugEyedMonsters are very cowardly)

This state will inherit functions from BugEyedMonster's null state

===Extend a State===

e.g. ScratchingButt extends Idle. We'd want most of the functionality of Idle, but with an extra occasional animation. We'd also have to add to our inherited Idle state to sometimes switch to ScratchingButt depending on circumstances.

: &lt;i&gt;I've probably got it all wrong, but if it makes Mych laugh enough he may fix it. :-)  &amp;ndash; ''Tarquin''&lt;/i&gt; 

So if we consider a function present in Monster, eg Trigger, we now have this in several flavours:

In Monster we have:
* Trigger() in null state
** Idle.Trigger() inherits null.Trigger unless we override
** Atacking.Trigger() inherits null.Trigger unless we override

In BugEyedMonster we have
* Trigger() in null state, inherits Monster.Trigger unless we override
** Idle.Trigger() &amp;ndash; this is the confusing one. see below
** Atacking.Trigger()
** ScratchingButt.Trigger() inherits Idle.Trigger() unless we override

{{innerbox|
from [[Legacy:UnrealScript Language Reference/States|UnrealScript Language Reference/States]]

The scoping rules, which resolves these complex situations, are:
* If the object is in a state, and an implementation of the function exists somewhere in that state (either in the actor?s class or in some parent class), the most-derived state version of the function is called.
* Otherwise, the most-derived non-state version of the function is called. 



}}

==Examples==

''Taken from a Discussion on UnrealScript Language Test:''

'''Wormbo:''' What I mean with &quot;super states&quot; is:

&lt;uscript&gt;
class SomeClass extends Actor;

// Super() compiler bug:
function A()
{
  // super call to sibling class function that doesn't exist in this or the super class
  Super(DestroyableTrigger).SpawnEffects(); // compiles and even executes! (spawns some visual effects)
}

// Super states:

// new function, does not exist in Actor
function X()
{
  log(&quot;SomeClass global X&quot;);
}

// new state, does not exist in Actor
state BaseState
{
  function X()
  {
    log(&quot;SomeClass BaseState X&quot;);
    // Super.X() -&gt; &quot;Error, Unknown Function 'X' in 'Class Engine.Actor'&quot;
    Global.X(); // logs the same
  }
}

state ExtendedState extends BaseState
{
  function X()
  {
    log(&quot;SomeClass ExtendedState X&quot;);
    Super.X();  // &quot;SomeClass BaseState X&quot;
    Global.X(); // &quot;SomeClass global X&quot;
  }
}

state AnotherExtendedState extends ExtendedState
{
  function X()
  {
    log(&quot;SomeClass AnotherExtendedState X&quot;);
    Super.X();  // &quot;SomeClass ExtendedState X&quot;
    // it's not possible to call &quot;SomeClass BaseState X&quot; directly through a Super(Something).X() construction:
    // Super(BaseState).X() -&gt; &quot;Error, Bad class name 'BaseState'&quot;
    // Super(SomeClass.BaseState).X() -&gt; &quot;Error, Missing ')' in 'super(classname)'&quot;
    Global.X(); // &quot;SomeClass global X&quot;
  }
}
&lt;/uscript&gt;

If the object is in state AnotherExtendedState, it will log the following when X is called:
 SomeClass AnotherExtendedState X
 SomeClass ExtendedState X
 SomeClass BaseState X
 SomeClass global X
 SomeClass global X
 SomeClass global X

The calling structure looks like this:

+AnotherExtendedState.X()

++ExtendedState.X()

+++BaseState.X()

++++global X()

+++global X()

++global X()

'''OlympusMons:''' Ahh yes thats very, very clever wormbo :D How did you ever come up with that concept, might be handy for some AI or something.

'''Wormbo:''' PlayerController already uses the concept of extending states within the sme class with BaseSpectating being the base state for Spectating, AttractMode and WaitingForPawn. The Bot class makes extensive use of extending states as well:

+MoveToGoal

++MoveToGoalWithEnemy

+++Fallback

++++Retreating

+++Charging

+++VehicleCharging

+++Hunting

++MoveToGoalNoEnemy

+++Roaming

+NoGoal

++RestFormation

==Related Topics==
* [[Legacy:State|State]]
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

==Discussion==

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Revise tutorial fill in with uscript examples.
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:External Links</title>
    <id>1103</id>
    <revision>
      <id>2912</id>
      <timestamp>2007-11-12T10:52:57Z</timestamp>
      <contributor>
        <ip>AToulon-152-1-57-141.w83-113.abo.wanadoo.fr</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Comments ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>2913</id>
      <timestamp>2007-09-08T08:49:57Z</timestamp>
      <contributor>
        <ip>CoreWarrior</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.ut2k3.fr UT2k3.fr] &amp;ndash; le site francophone Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
* [http://unreal-x.planetunreal.gamespy.com/index2.htm] useful stuff for advanced unreal editors or people just learning

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Comments ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>2914</id>
      <timestamp>2007-09-08T20:01:11Z</timestamp>
      <contributor>
        <ip>CoreWarrior</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.ut2k3.fr UT2k3.fr] &amp;ndash; le site francophone Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Comments ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>10979</id>
      <timestamp>2008-04-12T06:23:08Z</timestamp>
      <contributor>
        <username>B-Ball</username>
        <id>200</id>
      </contributor>
      <comment>/* IRC channels */</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

irc.quakenet.org :
* [irc://irc.quakenet.org/nerfarena #NerfArena] &amp;ndash; Nerf ArenaBlast [ www.NerfArena.de.vu ]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Comments ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>12636</id>
      <timestamp>2008-05-13T17:58:45Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <minor/>
      <comment>fixed links only</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

irc.quakenet.org :
* [irc://irc.quakenet.org/nerfarena #NerfArena] &amp;ndash; Nerf ArenaBlast [ www.NerfArena.de.vu ]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Discussion ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>44376</id>
      <timestamp>2011-04-25T02:52:59Z</timestamp>
      <contributor>
        <ip>110.84.208.8</ip>
      </contributor>
      <comment>/* Unreal Engine Links */</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

* [http://www.lunetteoakley.com/  Lunette oakley]
===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

irc.quakenet.org :
* [irc://irc.quakenet.org/nerfarena #NerfArena] &amp;ndash; Nerf ArenaBlast [ www.NerfArena.de.vu ]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Discussion ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>44377</id>
      <timestamp>2011-04-25T05:50:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/110.84.208.8|110.84.208.8]] ([[User talk:110.84.208.8|Talk]]) to last revision by [[User:SuperApe|SuperApe]]</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

irc.quakenet.org :
* [irc://irc.quakenet.org/nerfarena #NerfArena] &amp;ndash; Nerf ArenaBlast [ www.NerfArena.de.vu ]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Discussion ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>44446</id>
      <timestamp>2011-05-21T08:17:00Z</timestamp>
      <contributor>
        <ip>63.223.84.146</ip>
      </contributor>
      <comment>/* Editing forums */</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]
* [http://www.replicahandbagsllc.com/gucci-handbags-c-639.html   Gucci Handbags]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

irc.quakenet.org :
* [irc://irc.quakenet.org/nerfarena #NerfArena] &amp;ndash; Nerf ArenaBlast [ www.NerfArena.de.vu ]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Discussion ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
    <revision>
      <id>44447</id>
      <timestamp>2011-05-21T15:08:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/63.223.84.146|63.223.84.146]] ([[User talk:63.223.84.146|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">Know of an Unreal site that isn't listed here? Add it!

==Unreal Engine Links==

===Official sites===
* the [http://udn.epicgames.com/ Unreal Developer Network] &amp;ndash; Epic's documentation for engine licensees, partly open to the public
** [[udn2:|The UDN Content Creation area]]
** [[udn2:|The UDN Technical area]]

===General Unreal sites ===
* [http://www.beyondunreal.com Beyond Unreal] &amp;ndash; news site for Unreal engine powered games
* [http://crokx.unreal-design.com/ Crokx Works] &amp;ndash; French Unreal Engine fan site
* [http://www.unreal2k3.com Unreal2K3.com] &amp;ndash; Devoted to Unreal Tournament 2003 (Dead Link. Anyone know where they've gone?)
* [http://www.unrealadmin.org/ the Unreal Admin page] &amp;ndash; covering server administration for Unreal engine games
* [http://www.unrealsp.org UnrealSP.org]
* [http://www.unrealwebsites.net Unreal Websites] &amp;ndash; Over 1000 Unreal Websites. (Dead Link. Anyone know where they've gone?)
* [http://www.unrealextreme.de unrealEXTREME.de]
* [http://www.unreal.fr unreal.fr] &amp;ndash; le site francophone Unreal Tournament 2003
* [http://www.planetunreal.com Planet Unreal]
* [http://www.unrealplayground.com/ UnrealPlayground]

===Content creation===
* [http://fordy.planetunreal.gamespy.com/ Fordy's Site] &amp;ndash; the #1 source of Unreal editing news
* [http://chimeric.beyondunreal.com/ CHiMERiC]
* [http://www.ego-creations.de/ EGO-CREATIONS.DE]
* [http://lode.planetunreal.gamespy.com/ Lode's Unreal]
* [http://www.planetunreal.com/uedlab UnrealEd Lab] &amp;ndash; Unrealed2.0 Tutorials
* [http://www.planetunreal.com/unrealcore UnrealCore] (Redirects to a broken link)
* [http://www.unrealized.com Unrealized] &amp;ndash; Dead Link
* [http://www.utmaniac.com UTManiac(Formerly UTInsomniac)] &amp;ndash; Currently over 500 editing tutorials linked and featured for UT,UT2K3, and U2. Note!Link redirects to parked domain
*  http://unreal-x.planetunreal.gamespy.com/index2.htm &amp;ndash; Useful stuff for advanced unreal editors or people just learning
*  http://tutorials.hourences.com/tutorialsindex.htm  &amp;ndash; Beginners Tutorials - Unreal Engine 3/UT3

===Maps===
* [http://nalicity.beyondunreal.com NaliCity]
* [http://www.mapraider.com/ MapRaider]
* [http://www.unrealplayground.com/ UnrealPlayground] &amp;ndash; useful stuff for advanced unreal editors or people just learning.

===Mods===
* [http://modsquad.beyondunreal.com/ ModSquad]
* [http://www.planetunreal.com/wod Weapons of Destruction]
* [http://www.unrealplayground.com/ UnrealPlayground]
* http://unrealmods.org/
* http://modworks.beyondunreal.com/
* User mods:
**[http://www.killingfloor.freedomsnet.net/ Killing Floor] &amp;ndash; wiki page [[Legacy:Killing Floor|Killing Floor]]

===Forums ===
* [http://forums.beyondunreal.com The BeyondUnreal Forums]
** [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 UnrealWiki forums]
* [http://tournament.com/forums/forumdisplay.php?s=&amp;forumid=18 Tournament.com]
* [http://forums.unreal2k3.com Unreal2K3.com Forums]
* [http://www.utmaniac.com/forums.html UTManiac(Formerly UTInsomniac)] &amp;ndash; Now you can see the long-term effects of not getting your rest.
* [http://board.splash.de unrealEXTREME.de - Forums]
* [http://forums.unrealplayground.com/index.php UnrealPlayground Forums]
* [http://www.unrealed.de UnrealED.de] &amp;ndash; German Unreal Editor Community
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Editing forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=101 BuF Coding]
* [http://www.ina-community.com/forums/forumdisplay.php?s=&amp;forumid=132 Infogrames UT editing]
* [http://www.forumplanet.com/planetunreal/forum.asp?fid=3698 PlanetUnreal Editing forum]
* [http://www.unrealized.com/community/forums.html Unrealized] - linear board which loads a weird font. Fairly dead at the moment
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mapping forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=9 BuF Mapping]
* [http://www.map-center.com/cgi-bin/ultimatebb.cgi?ubb=forum;f=31 Map-Center]
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=173 NaliCity Level Editing]
* [http://forums.gamedesign.net/viewforum.php?f=29 Rust] &amp;ndash; Gamedesign.net Forums
* [http://unrealplayground.com/forums/index.php UnrealPlayground Forums]

====Mod-specific forums ====
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=379 Jailbreak]
* [http://forums.tactical-ops.to//forumdisplay.php?s=&amp;forumid=6 TO]
* [http://www.unrealfortress.com/board/board.php?FID=13 UnrealFortress]
* [http://www.marblemadness2003.com/forum/ Marble Madness 2003]
* [http://p208.ezboard.com/bnerfarenablastforums Nerf Arena Tournament / NAB2UT2k4]

===Reviews ===
* [http://nalicity.beyondunreal.com Nali City] &amp;ndash; Map review site
* [http://modsquad.beyondunreal.com ModSquad] &amp;ndash; Mod and mutator review site (check the old
* [http://www.planetunreal.com/modsquad ModSquad] &amp;ndash; site for most Unreal and UT mod reviews)

===IRC channels ===

irc.enterthegame.com :
* [irc://irc.enterthegame.com/etg #etg] &amp;ndash; Enter The Game's master channel
* [irc://irc.enterthegame.com/unrealwiki #unrealwiki] &amp;ndash; Unreal Wiki 
* [irc://irc.enterthegame.com/beyondunreal #beyondunreal] &amp;ndash; Beyondunreal 
* [irc://irc.enterthegame.com/unrealed #unrealed] &amp;ndash; Level Designers 
* [irc://irc.enterthegame.com/unrealscript #unrealscript] &amp;ndash; UnrealScript - [[udn2:UnrealScriptOnETG|rules and information]]

irc.quakenet.org :
* [irc://irc.quakenet.org/nerfarena #NerfArena] &amp;ndash; Nerf ArenaBlast [ www.NerfArena.de.vu ]

===Deus Ex Sites ===

====General ====
* [http://www.deusex.com DeusEx.com] &amp;ndash; Offical Deus Ex site.
* [http://www.deusex2.com DeusEx2.com] &amp;ndash; Offical Deus Ex 2 site.
* [http://www.deus-ex.org Deus-Ex.Org] &amp;ndash; Your daily dose of Deus! From daily news, tutorials to DXMP Information, server stats and Deus Ex 2 Information and screenshots.
* [http://www.deusex-machina.com DeusEx-Machina.com] &amp;ndash; Another news site with articles, interviews etc.
* [http://www.planetdeusex.com PlanetDeusEx.com] &amp;ndash; Every good game must have a Planet side that will try to rule the world. Has almost everything you need.

====Editing/Tutorial ====
* [http://www.planetdeusex.com/deusxed/ DeusEx Ed]
* [http://www.dxediting.com DXEditing.com]
* [http://www.planetdeusex.com/tack/ Tack's DX Lab]
* [http://www.planetdeusex.com/constructor/ Universal Constructor]
* [http://www.deus-ex.org/index.php/deusex/modding/tutorials Deus-Ex.Org]
* [http://leveldesigner.digitalcog.com/ Level Designer]

===Nerf ArenaBlast sites ===

====General ====
* [http://www.NerfArena.de.vu NerfArena.de.vu] - The biggest and most famous Nerf ArenaBlast website online! It has everything.. News, Maps, Downloads, Screenshots, Wallpapers, Cheats, Forums... and a lot of more! 

====Forums ====
* [http://p208.ezboard.com/bnerfarenablastforums The Nerf ArenaBlast Forums]

===Other Unreal engine games ===
* [http://www.runegame.com/vbf/forumdisplay.php?s=&amp;forumid=4 Rune] &amp;ndash; with invisible scrollbars. One recent thread is &quot;Jc Denton Found Naked, Drunk, Passed Out In Ditch.&quot;. Go figure.

==Wiki Links ==

Places that aren't about Unreal, but are recommended for people interested in Wikis.

===Other Wikis ===
* Wikipedia,  the biggest Wiki of them all, aiming to create a free encyclopedia: [[Wikipedia:Welcome, newcomers]]. Unreal Wiki gets a mention on [[Wikipedia:Unreal]], which doesn't say as much about Unreal as it could...
* Ward's Wiki, the very first Wiki &amp;ndash; [[Wiki:WelcomeVisitors]].
* [[MeatBall:MeatballWiki]], a wiki that discusses online communities
* [[UseMod:UseModWiki]], the software which runs this Wiki.
* [http://www.twilighthalls.de/gpwiki/ GameProgrammingWiki] - wiki about general game development

You might also check out our [[Legacy:TourBusStop|TourBusStop]], and a huge list of wikis at [http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?PublicWikis YpsiEyeball:PublicWikis].

==Sites we like ==
* [http://www.seriousengine.com/ SeriousEngine], a wiki about the Serious engine, using Wikipedia's software, and citing Unreal Wiki as an influence :D

==Related Topics ==
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]

==Discussion ==

'''Jeeptrash:''' Next job is to add some kind of emphasis for sites that have some UT2K3 info over those that just have old UT pages. Also, will reorder some of the subsections to make a bit more sense.

'''CoreWarrior:''' I updated a few link in the content creation category,Plan on updating more,some are dead some have new URLs.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Extruder Brushbuilder</title>
    <id>1105</id>
    <revision>
      <id>2918</id>
      <timestamp>2007-12-13T17:18:24Z</timestamp>
      <contributor>
        <ip>Poa78-1-87-88-58-237.dsl.club-internet.fr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Tarquin's Extruder Brushbuilder can be downloaded from http://www.planetunreal.com/tarquin

I'll import the documentation at some point.

==Extruder Topics ==
* [[Legacy:Making Trim With The Extruder|Making Trim With The Extruder]]
* [[Legacy:Making Caves With The Extruder|Making Caves with the Extruder]]

==Related Topics ==
* [[Legacy:Application|Application]]
* [[Legacy:Brushbuilders|Brushbuilders]]: reference for the default brushbuilders
* [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]]; also by Tarquin

'''ProjectX:''' Tarquin, i've seen your extruder builder and for a n00b who has no experience in pretty much anything, i found it hard to use, depite the tutorials. Would it be possible to implement the brushbuilder so it takes a sheet (possibly created in the 2D Shape Editor) and extrude it? I wouldn't know though 'cos i have absolutely no knowledge of coding whatsoever, hey, i'm just a mapper :)

'''Tarquin:''' Sadly no. The [[Legacy:Red Builder Brush|red builder brush]] knows what shape it is, but the [[Legacy:BrushBuilder|BrushBuilder]] objects than run scripts when you click a button can't read it. :( See the BuF-Ed forum &amp;ndash; I',m running a poll on whether the custom brushbuilders are useful any more. Does the Extruder run under UnrealEd 3?

'''ProjectX:''' I don't know because i haven't been able to run UED3.0 long enough to use it.

'''Hellkeeper:''' Hum, the extruder is impossible do find on the net. Is there a possibility to find it somewhere ? And Where is Tarquin now ?

'''MythOpus:'''  Tarquin has Ascended into a being of ultimate power.  No jokes.  He is everywhere.  Actually, I really don't know what he's been up to lately.  '''PS:'''  Follow the link at the top of the page for the extruder.

'''Hellkeeper''': I don't have an account at PlanetUnreal (that is wrong I know). I finally found the extruder brushbuilder, along with all the Tarquinbrush builder pack, in a little modification &quot;UED_TOOLS&quot; on filefront. Now, I'm going to found a sect to honour tarquin :) Anyway, thank you MythOpus.

'''MythOpus:''' No problem.  There was a link to Download Mirrors though, in specific one for beyondunreal, but whatever works :)

'''Hellkeeper:''' Nope, the only links for TarquinExtruder for Unrealed 2.0 are fileplanet (need a account, costs money) or 3dDownnload (broken link :(). The Beyond Unreal ones are only for Unrealed 3.0 or tribes vengenance.</text>
    </revision>
    <revision>
      <id>2919</id>
      <timestamp>2007-12-13T10:01:27Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <text xml:space="preserve">Tarquin's Extruder Brushbuilder can be downloaded from http://www.planetunreal.com/tarquin

I'll import the documentation at some point.

==Extruder Topics ==
* [[Legacy:Making Trim With The Extruder|Making Trim With The Extruder]]
* [[Legacy:Making Caves With The Extruder|Making Caves with the Extruder]]

==Related Topics ==
* [[Legacy:Application|Application]]
* [[Legacy:Brushbuilders|Brushbuilders]]: reference for the default brushbuilders
* [[Legacy:Tarquin Brushbuilders|Tarquin Brushbuilders]]; also by Tarquin

'''ProjectX:''' Tarquin, i've seen your extruder builder and for a n00b who has no experience in pretty much anything, i found it hard to use, depite the tutorials. Would it be possible to implement the brushbuilder so it takes a sheet (possibly created in the 2D Shape Editor) and extrude it? I wouldn't know though 'cos i have absolutely no knowledge of coding whatsoever, hey, i'm just a mapper :)

'''Tarquin:''' Sadly no. The [[Legacy:Red Builder Brush|red builder brush]] knows what shape it is, but the [[Legacy:BrushBuilder|BrushBuilder]] objects than run scripts when you click a button can't read it. :( See the BuF-Ed forum &amp;ndash; I',m running a poll on whether the custom brushbuilders are useful any more. Does the Extruder run under UnrealEd 3?

'''ProjectX:''' I don't know because i haven't been able to run UED3.0 long enough to use it.

'''Hellkeeper:''' Hum, the extruder is impossible do find on the net. Is there a possibility to find it somewhere ? And Where is Tarquin now ?

'''MythOpus:'''  Tarquin has Ascended into a being of ultimate power.  No jokes.  He is everywhere.  Actually, I really don't know what he's been up to lately.  '''PS:'''  Follow the link at the top of the page for the extruder.

'''Hellkeeper''': I don't have an account at PlanetUnreal (that is wrong I know). I finally found the extruder brushbuilder, along with all the Tarquinbrush builder pack, in a little modification &quot;UED_TOOLS&quot; on filefront. Now, I'm going to found a sect to honour tarquin :) Anyway, thank you MythOpus.

'''MythOpus:''' No problem.  There was a link to Download Mirrors though, in specific one for beyondunreal, but whatever works :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM BallTurret Fire</title>
    <id>28872</id>
    <revision>
      <id>42799</id>
      <timestamp>2010-03-30T16:20:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM LinkTurret Fire</title>
    <id>28836</id>
    <revision>
      <id>42763</id>
      <timestamp>2010-03-30T16:11:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM Sentinel Fire</title>
    <id>28630</id>
    <revision>
      <id>40486</id>
      <timestamp>2010-01-14T08:57:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM SpaceFighter AltFire</title>
    <id>28640</id>
    <revision>
      <id>40496</id>
      <timestamp>2010-01-14T08:59:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM Turret AltFire Minigun</title>
    <id>28474</id>
    <revision>
      <id>40175</id>
      <timestamp>2009-11-17T10:53:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>moved [[Legacy:FM Turret AltFire Minigun]] to [[Legacy:FM Turret Minigun AltFire]]:&amp;#32;wrong name</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:FM Turret Minigun AltFire]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM Turret AltFire Shield</title>
    <id>28500</id>
    <revision>
      <id>40201</id>
      <timestamp>2009-11-17T10:58:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FM Turret Minigun AltFire</title>
    <id>28473</id>
    <revision>
      <id>40172</id>
      <timestamp>2009-11-17T10:50:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
    <revision>
      <id>40174</id>
      <timestamp>2009-11-17T10:53:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moved [[Legacy:FM Turret AltFire Minigun]] to [[Legacy:FM Turret Minigun AltFire]]:&amp;#32;wrong name</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FOV</title>
    <id>1240</id>
    <revision>
      <id>3199</id>
      <timestamp>2005-01-14T03:30:25Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Field of View==

Field of View or Field of Vision (FoV) is the angle of your view in the world.

[[Image:Legacy_fov.gif|center|]]

Changing the FoV will cause the view to zoom in/out. A smaller FoV would be more zoomed in.

You can set the player's FoV by setting [[Legacy:Pawn (UT)|Pawn (UT)]].FovAngle or calling [[Legacy:PlayerPawn|PlayerPawn]].SetFOVAngle (the latter is replicated to clients, the former isn't).

----

'''Phantasmagorium:''' Wouldn't it be possible to use a key bind to, say, z, and have that set to edit your FOV so that you zoom in with weapons with no scope? I seem to remember being able to do this before, but forget how to set up UT2k3 so I can do it. Hehe.

'''Foxpaw:''' You can do that, but I believe setting your FOV is considered a &quot;cheat&quot; and has to be expressly enabled on the server to allow it. On botmatches it should work fine.

'''Phantasmagorium:''' Thats mainly what I do, seeing as even with my DSL I lag really bad sometimes. It's funny to take the rocket launcher and blow off a snipers head though :)</text>
    </revision>
    <revision>
      <id>3200</id>
      <timestamp>2005-01-13T23:55:27Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPS AI Architecture, Continued</title>
    <id>1230</id>
    <revision>
      <id>3177</id>
      <timestamp>2006-04-07T08:00:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">''(Continued from, [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]])''

==The Simulation of Realistic AI Spatial Comprehension:==

The primary problem for AIs attempting to perform spatial and pathfinding reasoning and determining strategy, is that the raw geometry of the level itself is incredibly difficult to parse. Attempting to perform reasoning with the raw geometry at runtime would be prohibitively expensive, because the geometry often contains so many extraneous and irrelevant details. A section of Solid Constructive Geometry (SCG), for example, might be composed of numerous aggregate polygons, but the AI is only concerned with its collision characteristic as a barrier to travel.

As with the global pathfinding problem, the most often employed solution is to build an optimized structural database. Developers can construct a very simple, streamlined database of spatial tactical data that contains only the key information the combat AI will require to understand the tactical significance of various spatial configurations of the level.

Customized Graphical User Interfaces can automatically analyze a given level?s static geometry, determine the tactical significance of different areas, and automatically generate a detailed tactical database that will be used to direct game agent mobility. Level designers also are required to embed specific indicator objects into their navigation systems, designating certain areas as ambush points, defense points, patrolling and event-driven activity, and other command options. (See also, [[Legacy:NavigationPoint|NavigationPoint]]) 

The only major drawback to a precomputed database is that it can sometimes work poorly in environments with a large number of dynamic obstacles.

==Combat AI Tactics during Gameplay==

With the generation of a CSG tactical database, we need to direct the game AIs to access it. A combat AI component will typically draw from a structured library of tactics, in which each tactic is responsible for executing a specific behavior in combat. Prospective tactics must communicate with the movement and animation subsystems to ensure that it exhibits the appropriate behaviors.

Another critical problem is the tactic selection problem. Given an arbitrary situation in combat, we need to pick the best tactic with which to attack our opponents so that the game is continually challenging. This decision will depend on three major factors: the nature of the tactic under consideration, the relative tactical significance of all the combatants? various locations (as determined by the tactical database), and the current tactical situation (the AI agents health, weapon, ammo, and location, plus the values of those characteristics for all of its allies and opponents).

A related problem is the opponent-selection problem. Given a number of potential opponents, the combat AI needs to select one as the current ?target?. Although it does not necessarily ignore all of its other adversaries, we need to designate a ?target? to represent the fact that the AI will engage a single enemy at a time.

In complex game situations, it is usually easy to find a good target-picking heuristic by considering the relative tactical situation of the AI against every potential opponent. An AI is primarily concerned with defending itself first, and then attempting to identify whether any particular opponent is immediately threatening. If not, it can identify the most vulnerable target nearest to itself. A simple ranking function can easily make this determination and call the appropriate combat command.

After an AI has selected a target and initiated combat, it should consider changing its target whenever its tactical situation changes significantly. Obviously, if the AI or its target dies, that?s a good time to reconsider the current target.

Finally, there?s the weapon-firing problem. Most FPS weapons are high-velocity ranged (or hit-scan) weapons, so the key problem is determining where and along which line of sight to fire.

==The Integrated Agent Behavior Control Component==

At the top of the AI system hierarchy is the dominant control component called the behavior controller. This controller is responsible for determining the AI agent?s current state and a range of high-level goals. It determines the AIs overall behavior ? how it animates, what audio files it plays, where it moves, and when and how it enters combat.

There are any number of ways to model a behavior controller, depending on your game?s design requirements. Most FPS games use a finite-state machine (FSM) for this part of the AI. &lt;br /&gt;

The list below provides some typical states in the FSM for a typical FPS:
; Idle : The AI is standing guard, or not engaged in combat or movement.
; Patrolling : The AI is following a designer-specified patrol path.
; Combat : The AI is engaged in combat and has passed most of the responsibility for character control over to the combat controller.
; Wandering : Probably a fugue state, maybe even suffering romantic difficulties.
; Fleeing : The AI is attempting to flee its opponent or any perceived threat.
; Searching : The AI is looking for an opponent to fight or searching for an opponent who fled during combat.

These behaviors are each represented by an object that is responsible for communicating with the movement, animation, and combat subsystems in order to represent the behaviors appropriately. Developing these behaviors will typically be very easy, since the movement, animation, and combat subsystems already do most of the work and provide a rich palette of basic behaviors for the behavioral component to assimilate.

==The UnrealScript Language and the Event-Trigger System==

Level designers will inevitably need some way to specify their design intentions in certain ambiguous or confusing sectors of the game. They need a way to take some degree of control over the AI for triggered gameplay sequences, cut scenes, or other ?triggered? or ?scripted? events that should happen during the game under certain circumstances. In order to make this happen, it?s necessary to design an interface for communication between the trigger/scripting system and the agent AI.

This communication will typically take two forms. First, the triggered events can set AI parameters. For example, an event might enable or disable certain states of the behavior controller?s finite-state machine, or modify various aggressiveness parameters to change the priority of various potential combat tactics.

The more common form of communication consists of sending commands to any of the AI subsystems from a triggered event. For example, the trigger system can tell an AI to move to a given point or to flee from its current target by issuing a command to its behavior controller. This command changes the current state of the FSM to one that will execute the appropriate behaviors.

==Perceptual Modeling==

A game player's perception (data input) is broken down into different subsystems. Different types of perception work differently, so we model our character's visual, auditory, and tactile subsystems seperately.

The visual subsystem should take into account such factors as the distance to a given visual stimulus, the angle of the stimulus relative to the AIs field of view, and the current visibility level at the location of the stimulus (lighting and fog, and obstructions).

In order to ensure that the AI can actually see the object, it's also essential to use a Ray-Tracing network. The AI should query the underlying game engine to ensure that there's a clear line-of-sight between the AIs eyes and the object its attempting to see.

The final sensory subsystem is the tactile subsystem. This system is responsible for anything the AI feels. This includes damage notifications (whenever the AI is wounded) as well as collision notifications (whenever the AI bumps into something, or some other object bumps into it).

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Heady stuff.  Nice addition to the wiki.</text>
    </revision>
    <revision>
      <id>3178</id>
      <timestamp>2005-11-17T03:03:11Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Marked up.</comment>
      <text xml:space="preserve">''(Continued from, [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]])''

==The Simulation of Realistic AI Spatial Comprehension:==

The primary problem for AIs attempting to perform spatial and pathfinding reasoning and determining strategy, is that the raw geometry of the level itself is incredibly difficult to parse. Attempting to perform reasoning with the raw geometry at runtime would be prohibitively expensive, because the geometry often contains so many extraneous and irrelevant details. A section of Solid Constructive Geometry (SCG), for example, might be composed of numerous aggregate polygons, but the AI is only concerned with its collision characteristic as a barrier to travel.

As with the global pathfinding problem, the most often employed solution is to build an optimized structural database. Developers can construct a very simple, streamlined database of spatial tactical data that contains only the key information the combat AI will require to understand the tactical significance of various spatial configurations of the level.

Customized Graphical User Interfaces can automatically analyze a given level’s static geometry, determine the tactical significance of different areas, and automatically generate a detailed tactical database that will be used to direct game agent mobility. Level designers also are required to embed specific indicator objects into their navigation systems, designating certain areas as ambush points, defense points, patrolling and event-driven activity, and other command options. (See also, [[Legacy:NavigationPoint|NavigationPoint]]) 

The only major drawback to a precomputed database is that it can sometimes work poorly in environments with a large number of dynamic obstacles.

==Combat AI Tactics during Gameplay==

With the generation of a CSG tactical database, we need to direct the game AIs to access it. A combat AI component will typically draw from a structured library of tactics, in which each tactic is responsible for executing a specific behavior in combat. Prospective tactics must communicate with the movement and animation subsystems to ensure that it exhibits the appropriate behaviors.

Another critical problem is the tactic selection problem. Given an arbitrary situation in combat, we need to pick the best tactic with which to attack our opponents so that the game is continually challenging. This decision will depend on three major factors: the nature of the tactic under consideration, the relative tactical significance of all the combatants’ various locations (as determined by the tactical database), and the current tactical situation (the AI agents health, weapon, ammo, and location, plus the values of those characteristics for all of its allies and opponents).

A related problem is the opponent-selection problem. Given a number of potential opponents, the combat AI needs to select one as the current “target”. Although it does not necessarily ignore all of its other adversaries, we need to designate a “target” to represent the fact that the AI will engage a single enemy at a time.

In complex game situations, it is usually easy to find a good target-picking heuristic by considering the relative tactical situation of the AI against every potential opponent. An AI is primarily concerned with defending itself first, and then attempting to identify whether any particular opponent is immediately threatening. If not, it can identify the most vulnerable target nearest to itself. A simple ranking function can easily make this determination and call the appropriate combat command.

After an AI has selected a target and initiated combat, it should consider changing its target whenever its tactical situation changes significantly. Obviously, if the AI or its target dies, that’s a good time to reconsider the current target.

Finally, there’s the weapon-firing problem. Most FPS weapons are high-velocity ranged (or hit-scan) weapons, so the key problem is determining where and along which line of sight to fire.

==The Integrated Agent Behavior Control Component==

At the top of the AI system hierarchy is the dominant control component called the behavior controller. This controller is responsible for determining the AI agent’s current state and a range of high-level goals. It determines the AIs overall behavior – how it animates, what audio files it plays, where it moves, and when and how it enters combat.

There are any number of ways to model a behavior controller, depending on your game’s design requirements. Most FPS games use a finite-state machine (FSM) for this part of the AI. &lt;br /&gt;

The list below provides some typical states in the FSM for a typical FPS:
; Idle : The AI is standing guard, or not engaged in combat or movement.
; Patrolling : The AI is following a designer-specified patrol path.
; Combat : The AI is engaged in combat and has passed most of the responsibility for character control over to the combat controller.
; Wandering : Probably a fugue state, maybe even suffering romantic difficulties.
; Fleeing : The AI is attempting to flee its opponent or any perceived threat.
; Searching : The AI is looking for an opponent to fight or searching for an opponent who fled during combat.

These behaviors are each represented by an object that is responsible for communicating with the movement, animation, and combat subsystems in order to represent the behaviors appropriately. Developing these behaviors will typically be very easy, since the movement, animation, and combat subsystems already do most of the work and provide a rich palette of basic behaviors for the behavioral component to assimilate.

==The UnrealScript Language and the Event-Trigger System==

Level designers will inevitably need some way to specify their design intentions in certain ambiguous or confusing sectors of the game. They need a way to take some degree of control over the AI for triggered gameplay sequences, cut scenes, or other “triggered” or “scripted” events that should happen during the game under certain circumstances. In order to make this happen, it’s necessary to design an interface for communication between the trigger/scripting system and the agent AI.

This communication will typically take two forms. First, the triggered events can set AI parameters. For example, an event might enable or disable certain states of the behavior controller’s finite-state machine, or modify various aggressiveness parameters to change the priority of various potential combat tactics.

The more common form of communication consists of sending commands to any of the AI subsystems from a triggered event. For example, the trigger system can tell an AI to move to a given point or to flee from its current target by issuing a command to its behavior controller. This command changes the current state of the FSM to one that will execute the appropriate behaviors.

==Perceptual Modeling==

A game player's perception (data input) is broken down into different subsystems. Different types of perception work differently, so we model our character's visual, auditory, and tactile subsystems seperately.

The visual subsystem should take into account such factors as the distance to a given visual stimulus, the angle of the stimulus relative to the AIs field of view, and the current visibility level at the location of the stimulus (lighting and fog, and obstructions).

In order to ensure that the AI can actually see the object, it's also essential to use a Ray-Tracing network. The AI should query the underlying game engine to ensure that there's a clear line-of-sight between the AIs eyes and the object its attempting to see.

The final sensory subsystem is the tactile subsystem. This system is responsible for anything the AI feels. This includes damage notifications (whenever the AI is wounded) as well as collision notifications (whenever the AI bumps into something, or some other object bumps into it).

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Heady stuff.  Nice addition to the wiki.</text>
    </revision>
    <revision>
      <id>3179</id>
      <timestamp>2006-04-06T21:06:12Z</timestamp>
      <contributor>
        <ip>Dsl-KK-static-222.207.95.61.touchtelindia.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">''(Continued from, [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]])''

==The Simulation of Realistic AI Spatial Comprehension:==

The primary problem for AIs attempting to perform spatial and pathfinding reasoning and determining strategy, is that the raw geometry of the level itself is incredibly difficult to parse. Attempting to perform reasoning with the raw geometry at runtime would be prohibitively expensive, because the geometry often contains so many extraneous and irrelevant details. A section of Solid Constructive Geometry (SCG), for example, might be composed of numerous aggregate polygons, but the AI is only concerned with its collision characteristic as a barrier to travel.

As with the global pathfinding problem, the most often employed solution is to build an optimized structural database. Developers can construct a very simple, streamlined database of spatial tactical data that contains only the key information the combat AI will require to understand the tactical significance of various spatial configurations of the level.

Customized Graphical User Interfaces can automatically analyze a given level?s static geometry, determine the tactical significance of different areas, and automatically generate a detailed tactical database that will be used to direct game agent mobility. Level designers also are required to embed specific indicator objects into their navigation systems, designating certain areas as ambush points, defense points, patrolling and event-driven activity, and other command options. (See also, [[Legacy:NavigationPoint|NavigationPoint]]) 

The only major drawback to a precomputed database is that it can sometimes work poorly in environments with a large number of dynamic obstacles.

==Combat AI Tactics during Gameplay==

With the generation of a CSG tactical database, we need to direct the game AIs to access it. A combat AI component will typically draw from a structured library of tactics, in which each tactic is responsible for executing a specific behavior in combat. Prospective tactics must communicate with the movement and animation subsystems to ensure that it exhibits the appropriate behaviors.

Another critical problem is the tactic selection problem. Given an arbitrary situation in combat, we need to pick the best tactic with which to attack our opponents so that the game is continually challenging. This decision will depend on three major factors: the nature of the tactic under consideration, the relative tactical significance of all the combatants? various locations (as determined by the tactical database), and the current tactical situation (the AI agents health, weapon, ammo, and location, plus the values of those characteristics for all of its allies and opponents).

A related problem is the opponent-selection problem. Given a number of potential opponents, the combat AI needs to select one as the current ?target?. Although it does not necessarily ignore all of its other adversaries, we need to designate a ?target? to represent the fact that the AI will engage a single enemy at a time.

In complex game situations, it is usually easy to find a good target-picking heuristic by considering the relative tactical situation of the AI against every potential opponent. An AI is primarily concerned with defending itself first, and then attempting to identify whether any particular opponent is immediately threatening. If not, it can identify the most vulnerable target nearest to itself. A simple ranking function can easily make this determination and call the appropriate combat command.

After an AI has selected a target and initiated combat, it should consider changing its target whenever its tactical situation changes significantly. Obviously, if the AI or its target dies, that?s a good time to reconsider the current target.

Finally, there?s the weapon-firing problem. Most FPS weapons are high-velocity ranged (or hit-scan) weapons, so the key problem is determining where and along which line of sight to fire.

==The Integrated Agent Behavior Control Component==

At the top of the AI system hierarchy is the dominant control component called the behavior controller. This controller is responsible for determining the AI agent?s current state and a range of high-level goals. It determines the AIs overall behavior ? how it animates, what audio files it plays, where it moves, and when and how it enters combat.

There are any number of ways to model a behavior controller, depending on your game?s design requirements. Most FPS games use a finite-state machine (FSM) for this part of the AI. &lt;br /&gt;

The list below provides some typical states in the FSM for a typical FPS:
; Idle : The AI is standing guard, or not engaged in combat or movement.
; Patrolling : The AI is following a designer-specified patrol path.
; Combat : The AI is engaged in combat and has passed most of the responsibility for character control over to the combat controller.
; Wandering : Probably a fugue state, maybe even suffering romantic difficulties.
; Fleeing : The AI is attempting to flee its opponent or any perceived threat.
; Searching : The AI is looking for an opponent to fight or searching for an opponent who fled during combat.

These behaviors are each represented by an object that is responsible for communicating with the movement, animation, and combat subsystems in order to represent the behaviors appropriately. Developing these behaviors will typically be very easy, since the movement, animation, and combat subsystems already do most of the work and provide a rich palette of basic behaviors for the behavioral component to assimilate.

==The UnrealScript Language and the Event-Trigger System==

Level designers will inevitably need some way to specify their design intentions in certain ambiguous or confusing sectors of the game. They need a way to take some degree of control over the AI for triggered gameplay sequences, cut scenes, or other ?triggered? or ?scripted? events that should happen during the game under certain circumstances. In order to make this happen, it?s necessary to design an interface for communication between the trigger/scripting system and the agent AI.

This communication will typically take two forms. First, the triggered events can set AI parameters. For example, an event might enable or disable certain states of the behavior controller?s finite-state machine, or modify various aggressiveness parameters to change the priority of various potential combat tactics.

The more common form of communication consists of sending commands to any of the AI subsystems from a triggered event. For example, the trigger system can tell an AI to move to a given point or to flee from its current target by issuing a command to its behavior controller. This command changes the current state of the FSM to one that will execute the appropriate behaviors.

==Perceptual Modeling==

A game player's perception (data input) is broken down into different subsystems. Different types of perception work differently, so we model our character's visual, auditory, and tactile subsystems seperately.

The visual subsystem should take into account such factors as the distance to a given visual stimulus, the angle of the stimulus relative to the AIs field of view, and the current visibility level at the location of the stimulus (lighting and fog, and obstructions).

In order to ensure that the AI can actually see the object, it's also essential to use a Ray-Tracing network. The AI should query the underlying game engine to ensure that there's a clear line-of-sight between the AIs eyes and the object its attempting to see.

The final sensory subsystem is the tactile subsystem. This system is responsible for anything the AI feels. This includes damage notifications (whenever the AI is wounded) as well as collision notifications (whenever the AI bumps into something, or some other object bumps into it).

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Heady stuff.  Nice addition to the wiki.

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPSConsole</title>
    <id>1278</id>
    <revision>
      <id>3278</id>
      <timestamp>2005-05-15T06:09:18Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; [[Legacy:Console|Console]] &gt;&gt; FPSConsole (Package: FPSGame)}}

Simple, one-line console used for typing, talking, and team talking.

==Variable==
; float SlideUp : Internal float variable used for the sliding up effect (hence the name)

==Known Subclasses==
* [[Legacy:FPSConsoleExt|FPSConsoleExt]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPSConsoleExt</title>
    <id>1279</id>
    <revision>
      <id>3279</id>
      <timestamp>2005-05-15T06:15:42Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; [[Legacy:Console|Console]] &gt;&gt; [[Legacy:FPSConsole|FPSConsole]] &gt;&gt; [[Legacy:FPSConsoleExt|FPSConsoleExt]] (Package: FPSGame)}}

Multi-line console.

==Properties (hidden)==
; int MaxScrollbackSize [globalconfig] : Maximum number of lines allowed in the scrollback buffer.

==Variables==
; array&lt;string&gt; Scrollback : Contains the scrollback buffer.
; int SBHead
; int SBPos
; bool bCtrl
; bool bConsoleKey

==Methods==

===Exec functions===
; CLS [exec] : Clears the scrollback buffer.

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPSController</title>
    <id>1269</id>
    <revision>
      <id>3262</id>
      <timestamp>2004-10-17T06:25:58Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; FPSController (Package: FPSGame)}}

Intermediate between the engine's [[Legacy:Controller|Controller]] classes and [[Legacy:Postal 2|Postal 2]]'s AI controllers.

==Properties ==

===Hidden ===
; bool bPendingStasis :  The pending status of how you want to be in stasis.   
; float TargetRadius :  How close to go to your target  

==Functions ==
; native final latent function MoveToWithRadius(vector NewDestination, optional Actor ViewFocus, optional float UseRadius, optional float speed, optional bool bShouldWalk)
; native final latent function MoveTowardWithRadius(actor NewTarget, optional Actor ViewFocus,optional float UseRadius, optional float speed, optional float DestinationOffset, optional bool bUseStrafing, optional bool bShouldWalk)
; function PartnerReviveFromStasis(FPSPawn Reviver)
; function bool FreeToSeekPlayer()
; event ComeOutOfStasis(bool bDontRenew)
; event ReviveFromStasis()
; function GoIntoSliderStasis()

===Set Up Functions (from [[Legacy:Spawner|Spawner]] etc.) ===
; function SetToAttackPlayer(FPSPawn PlayerP) : Find the player and kick his butt
; function SetToPanic() : Run away screaming
; function SetToBeScaredOfPlayer(FPSPawn PlayerP) : Find the player and be scared of him
; function SetToAttackTag(Name AttackTag) : Find the closest actor with this tag and kick his butt
; function SetToBeScaredOfTag(Name RunTag) : Find the closest actor with this tag and be scared of him
; function SetToDance() : Dance forever until disturbed
; function SetToPlayArcadeGame() : Stand here and play an arcade game
; function SetToKeyboardType() : Stand here and type on a keyboard
; function SetToStandInQ() : Find StartInterest and stand in it
; function SetToHoldPosition() : Stand around where you are, like a cop/security guard
; function SetToStandWithGun() : Stand with gun at side. (doesn't report gun)
; function SetToStandWithGunReady() : Stand with gun out, ready to shoot (doesn't report gun)
; function SetToTurret() : Stand with gun out, ready to shoot (doesn't report gun)
; function SetToKickNearest() : Find the nearest person and kick him
; function SetToWatchPlayer(FPSPawn PlayerP) : Find a player and watch him until you get bored
; function SetToConfusedWatchPlayer(FPSPawn PlayerP) : Find a player, act confused and watch him, then get bored
; function SetToCheerPlayer(FPSPawn PlayerP) : Player gets clapped at
; function SetToLaughAtPlayer(FPSPawn PlayerP) : Player gets laughed at
; function SetToFindCop(FPSPawn PlayerP) : Find a cop and sic him on the player
; function SetToPatrolJail() : For cops in jail
; function function SetToDead() : Start dead.

==Known Subclasses ==
 FPSController
 +- [[Legacy:LambController|LambController]]
    +- [[Legacy:AnimalController|AnimalController]]
    |  +- [[Legacy:CatController|CatController]]
    |  +- [[Legacy:DogController|DogController]]
    |  +- [[Legacy:ElephantController|ElephantController]]
    |     +- [[Legacy:CowController|CowController]]
    +- [[Legacy:PersonController|PersonController]]
       +- [[Legacy:BystanderController|BystanderController]]
       |  +- [[Legacy:CashierController|CashierController]]
       |  |  +- [[Legacy:BankTellerController|BankTellerController]]
       |  |  |  +- [[Legacy:DaveController|DaveController]]
       |  |  +- [[Legacy:CitationController|CitationController]]
       |  |  |  +- [[Legacy:LibraryController|LibraryController]]
       |  |  +- [[Legacy:FFCashierController|FFCashierController]]
       |  |  |  +- [[Legacy:ButcherController|ButcherController]]
       |  |  |  +- [[Legacy:GaryController|GaryController]]
       |  |  |  +- [[Legacy:KrotchyController|KrotchyController]]
       |  |  |  +- [[Legacy:LaundryController|LaundryController]]
       |  |  |  +- [[Legacy:PriestController|PriestController]]
       |  |  +- [[Legacy:HabibController|HabibController]]
       |  |  +- [[Legacy:NapalmController|NapalmController]]
       |  |  |  +- [[Legacy:JunkyardController|JunkyardController]]
       |  |  |  +- [[Legacy:ParcelController|ParcelController]]
       |  |  +- [[Legacy:NurseController|NurseController]]
       |  +- [[Legacy:GimpController|GimpController]]
       |  +- [[Legacy:KumquatController|KumquatController]]
       |  +- [[Legacy:MarcherController|MarcherController]]
       |  |  +- [[Legacy:BandController|BandController]]
       |  |  +- [[Legacy:ProtestorController|ProtestorController]]
       |  +- [[Legacy:MuggerController|MuggerController]]
       |  +- [[Legacy:RedneckController|RedneckController]]
       |  +- [[Legacy:RobberController|RobberController]]
       |  +- [[Legacy:RWSController|RWSController]]
       |  +- [[Legacy:SeekerController|SeekerController]]
       |  +- [[Legacy:VinceController|VinceController]]
       +- [[Legacy:PoliceController|PoliceController]]
          +- [[Legacy:MilitaryController|MilitaryController]]

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3263</id>
      <timestamp>2004-05-27T23:25:46Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; [[Legacy:FPSController|FPSController]]}}

Intermediate between the engine's [[Legacy:Controller|Controller]] classes and [[Legacy:Postal 2|Postal 2]]'s controllers.

==Properties ==

===Hidden ===
; bool bPendingStasis :  The pending status of how you want to be in stasis.   
; float TargetRadius :  How close to go to your target  

==Functions ==
; native final latent function MoveToWithRadius(vector NewDestination, optional Actor ViewFocus, optional float UseRadius, optional float speed, optional bool bShouldWalk)
; native final latent function MoveTowardWithRadius(actor NewTarget, optional Actor ViewFocus,optional float UseRadius, optional float speed, optional float DestinationOffset, optional bool bUseStrafing, optional bool bShouldWalk)
; function PartnerReviveFromStasis(FPSPawn Reviver)
; function bool FreeToSeekPlayer()
; event ComeOutOfStasis(bool bDontRenew)
; event ReviveFromStasis()
; function GoIntoSliderStasis()

===Set Up Functions (from [[Legacy:Spawner|Spawner]] etc.) ===
; function SetToAttackPlayer(FPSPawn PlayerP) : Find the player and kick his butt
; function SetToPanic() : Run away screaming
; function SetToBeScaredOfPlayer(FPSPawn PlayerP) : Find the player and be scared of him
; function SetToAttackTag(Name AttackTag) : Find the closest actor with this tag and kick his butt
; function SetToBeScaredOfTag(Name RunTag) : Find the closest actor with this tag and be scared of him
; function SetToDance() : Dance forever until disturbed
; function SetToPlayArcadeGame() : Stand here and play an arcade game
; function SetToKeyboardType() : Stand here and type on a keyboard
; function SetToStandInQ() : Find StartInterest and stand in it
; function SetToHoldPosition() : Stand around where you are, like a cop/security guard
; function SetToStandWithGun() : Stand with gun at side. (doesn't report gun)
; function SetToStandWithGunReady() : Stand with gun out, ready to shoot (doesn't report gun)
; function SetToTurret() : Stand with gun out, ready to shoot (doesn't report gun)
; function SetToKickNearest() : Find the nearest person and kick him
; function SetToWatchPlayer(FPSPawn PlayerP) : Find a player and watch him until you get bored
; function SetToConfusedWatchPlayer(FPSPawn PlayerP) : Find a player, act confused and watch him, then get bored
; function SetToCheerPlayer(FPSPawn PlayerP) : Player gets clapped at
; function SetToLaughAtPlayer(FPSPawn PlayerP) : Player gets laughed at
; function SetToFindCop(FPSPawn PlayerP) : Find a cop and sic him on the player
; function SetToPatrolJail() : For cops in jail
; function function SetToDead() : Start dead.

==Known Subclasses ==
 [[Legacy:FPSController|FPSController]]
 +- [[Legacy:LambController|LambController]]
    +- [[Legacy:AnimalController|AnimalController]]
       +- [[Legacy:CatController|CatController]]
       +- [[Legacy:DogController|DogController]]
       +- [[Legacy:ElephantController|ElephantController]]
          +- [[Legacy:CowController|CowController]]
    +- [[Legacy:PersonController|PersonController]]
       +- [[Legacy:BystanderController|BystanderController]]
          +- [[Legacy:CashierController|CashierController]]
             +- [[Legacy:BankTellerController|BankTellerController]]
                +- [[Legacy:DaveController|DaveController]]
             +- [[Legacy:CitationController|CitationController]]
                +- [[Legacy:LibraryController|LibraryController]]
             +- [[Legacy:FFCashierController|FFCashierController]]
                +- [[Legacy:ButcherController|ButcherController]]
                +- [[Legacy:GaryController|GaryController]]
                +- [[Legacy:KrotchyController|KrotchyController]]
                +- [[Legacy:LaundryController|LaundryController]]
                +- [[Legacy:PriestController|PriestController]]
             +- [[Legacy:HabibController|HabibController]]
             +- [[Legacy:NapalmController|NapalmController]]
                +- [[Legacy:JunkyardController|JunkyardController]]
                +- [[Legacy:ParcelController|ParcelController]]
             +- [[Legacy:NurseController|NurseController]]
          +- [[Legacy:GimpController|GimpController]]
          +- [[Legacy:KumquatController|KumquatController]]
          +- [[Legacy:MarcherController|MarcherController]]
             +- [[Legacy:BandController|BandController]]
             +- [[Legacy:ProtestorController|ProtestorController]]
          +- [[Legacy:MuggerController|MuggerController]]
          +- [[Legacy:RedneckController|RedneckController]]
          +- [[Legacy:RobberController|RobberController]]
          +- [[Legacy:RWSController|RWSController]]
          +- [[Legacy:SeekerController|SeekerController]]
          +- [[Legacy:VinceController|VinceController]]
       +- [[Legacy:PoliceController|PoliceController]]

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPSGameInfo</title>
    <id>1275</id>
    <revision>
      <id>3274</id>
      <timestamp>2004-10-18T11:15:29Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; FPSGameInfo (Package: FPSGame)}}

Intermediate class between the engine's [[Legacy:GameInfo|GameInfo]] and [[Legacy:Postal 2|Postal 2]]'s game types.

==Structs==

===HomeListInfo===

Dynamic array of home nodes that represent the starts of linked lists of home nodes all with the same tag. Each home node in this array is the start of a linked lists of home nodes. Each home node in that particular list has the same tag as all the others like it in the current level. These are used to speed up the random walks bystanders take
; [[Legacy:HomeNode|HomeNode]] node: Start of looped list
; int Length: Length of that list

===PathListInfo===

Single list of pathnodes in level, used for random pawn walking.
; [[Legacy:PathNode|PathNode]] node: Start of looped list
; int Length: Length of that list

===SongInfo===

Info about currently playing songs.
; int RealHandle
; [[Legacy:Actor|Actor]] Actor
; string Song
; float Volume
; float Radius
; float Pitch

==Enums==

===ETravelItems===
; TRAV_WithItems: default mode
; TRAV_WithoutItems: only for special cases, like when game is over

==Properties==

===FPSGameInfo===
; float MaxStasisPercent: Maximum percentage in stasis (StasisPawns/LivePawns)
; bool bIsDemo: Whether this is a demo version of the game

===Hidden===
; int LivePawns: Total number of pawns alive in the level, in stasis or not
; int StasisPawns: Total number of pawns currently in stasis
; bool bIsValid: Whether the GameInfo is valid.  Defaults to true but complex GameInfo's should default to false and set it true when they become valid.
; array&lt;[[Legacy:ScriptedTrigger|ScriptedTrigger]]&gt; WaitingList: List of ScriptedControllers that want to be informed when GameInfo becomes valid.
; array&lt;HomeListInfo&gt; HomeNodeLists
; PathListInfo PathNodeList
; SongInfo SongInfos[9]
; localized string UnknownDiffStr
; float	DebugTextX: Debug stuff
; float	DebugTextY: Debug stuff
; float	DebugTextHeight: Debug stuff
; float	DebugTextIndent: Debug stuff

==Functions==
; BuildHomeNodeLists() [native]
; BuildPathNodeLists() [native]
; string GetGameMap(string GameCode, string PrevMapName, int Dir) [native, static]
; bool StartingUp(): Outside, we're not starting up. This is only to return true when we're inside the state of StartUp, where we prep pawns, the apocalypse, day block levels, etc.
; SendPlayerEx([[Legacy:PlayerController|PlayerController]] Player, string URL, ETravelType TravelType, ETravelItems TravelItems): Send player to specified URL. This is our own version of SendPlayer() except it allows additional travel options to be specified. This safely handles the case of the player not having a pawn (the engine version crashes to let you know the pawn is missing). This also cleans up various things that should be done prior to travel.
; GameInfoIsNowValid(): This is called to indicate the GameInfo has become valid.
; AddToWaitingList([[Legacy:ScriptedTrigger|ScriptedTrigger]] Script): Add to a list of of items that are waiting for the gameinfo to become valid.  When it does become valid, these items are notified.
; AddPawn([[Legacy:Pawn|Pawn]] AddMe): Increment the total number of live pawns in the level
; RemovePawn([[Legacy:Pawn|Pawn]] RemoveMe): Decrement the total number of live pawns in the level
; PawnInStasis([[Legacy:Pawn|Pawn]] CheckP): New pawn goes into stasis
; PawnOutOfStasis([[Legacy:Pawn|Pawn]] CheckP): New pawn comes out of stasis
; FindHomeListInfo(name UseTag, out HomeListInfo returninfo): Given a tag, return the start of a home node list
; FindPathListInfo(out PathListInfo returninfo): Return the start of a path node list
; GetSplatDetail(): Get the splat detail.. longer lasting splats, the higher the number
; PlayMusicExt(string Song, float FadeInTime): All music should be controlled through these functions instead of the similar functions in the Actor class.  Calling those functions directly will lead to serious problems if the audio system is rebooted, which can happen at any time during the game if the player changes certain options in the audio menu.  Using these following functions instead will prevent those problems and will also restore any songs that were playing after the audio system is rebooted.
; PlayMusicAttenuateExt([[Legacy:Actor|Actor]] Actor, string Song, float FadeInTime, optional float Volume, optional float Radius, optional float Pitch)
; RestoreMusicAfterAudioReboot()
; StopMusicExt(int SongHandle, float FadeOutTime)
; StopAllMusicExt(float FadeOutTime)
; int GetFreeSongInfo()
; DrawTextDebug(Canvas Canvas, String str, optional int indent): Draw text for debugging
; string GetDiffName(int DiffIndex): Get the phrase for our difficulty level (override in [[Legacy:P2GameInfoSingle|P2GameInfoSingle]])
; string SetURLOption(string URL, string Name, string Value): Set the specified option in the URL. If the option already exists in the URL, it is replaced with the new value.
; string RemoveURLOption(string URL, string Name): Remove the specified option from the URL, ignoring case. If the option doesn't exist, the URL is returned unchanged.

==Postal 2's GameInfo Class Tree==
 FPSGameInfo
 +- [[Legacy:P2GameInfo|P2GameInfo]]
    +- [[Legacy:P2GameInfoSingle|P2GameInfoSingle]]
    |  +- [[Legacy:GameSinglePlayer|GameSinglePlayer]]
    |  +- GameSinglePlayerDemo
    +- [[Legacy:P2GameInfoMulti|P2GameInfoMulti]]
       +- [[Legacy:MPGameInfo|MPGameInfo]]
          +- [[Legacy:DeathMatch (P2)|DeathMatch (P2)]]
             +- [[Legacy:GrabBagGame|GrabBagGame]]
             |  +- xGrabBag
             +- [[Legacy:TeamGame (P2)|TeamGame (P2)]]
             |  +- [[Legacy:CTFGame (P2)|CTFGame (P2)]]
             |  |  +- xCTFGame
             |  +- xTeamGame 
             +- xDeathMatch

==Related Topics==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPSPawn</title>
    <id>1270</id>
    <revision>
      <id>3264</id>
      <timestamp>2004-10-17T06:50:16Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>The Class Wikifier is overrated</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; FPSPawn (Package: FPSGame)}}

Intermediate between the engine's [[Legacy:Pawn|Pawn]] and [[Legacy:Postal 2|Postal 2]]'s pawns.

==Enums ==

===EPawnInitialState ===
; EP_Think: Drops down and starts living his life
; EP_AttackPlayer: Find a player and kick his butt
; EP_Panic: Run like a rabbit
; EP_ScaredOfPlayer: Find a player and be scared of him
; EP_HoldPosition: Stand here until bothered
; EP_KickNearest: Go to the nearest person and kick him
; EP_PatrolJail: Patrol walk, but only in a jail. Makes footstep noises
; EP_Dance: Dance until interrupted
; EP_StandWithGun: Stand with your gun out (don't report gun)
; EP_StandWithGunReady: Stand with your gun ready (don't report gun)
; EP_PlayArcade: Play an arcade game
; EP_GoStandInQueue: Go stand in StartInterest
; EP_Turret: Stand with your gun ready, wait for your enemy to approach then attack
; EP_KeyboardType: Typing away at a keyboard until interrupted
; EP_WatchPlayer: Watch the player with curiosity
; EP_ConfusedWatchPlayer: Act confused, watch the player
; EP_CheerPlayer: Applaud the player
; EP_LaughAtPlayer: Laugh at the player
; EP_BystanderGoFindCop: Find a cop and sic him on the player
; EP_Dead: Start out dead

===EGender ===
; Gender_Any
; Gender_Male
; Gender_Female

===ERace ===
; Race_Any
; Race_White
; Race_Black
; Race_Mexican
; Race_Asian
; Race_Hindu
; Race_Fanatic

===EBody ===
; Body_Any
; Body_Avg
; Body_Fat

==Properties ==

===PawnAttributes===
; float HealthMax: Max amount of health this guy has.
; bool bPlayerIsFriend: They will fight along side you, unless you shoot them
; bool bPlayerIsEnemy: They will attack you on sight if they have a weapon, or run from you if they don't have a weapon
; bool bIgnoresSenses: Markers and player that tell him about things don't register. Triggering most controllers turns this off.
; string Gang: What gang I associate with. If you're in a gang, you'll fight alongside other members of your gang.
; float DonutLove: How much we love donuts. 0 to 1.
; EPawnInitialState PawnInitialState: What a pawn does after he spawns.
; bool bCanEnterHomes: This pawn can use [[Legacy:HomeNode|HomeNode]]s
; Name HomeTag: Tag of group of [[Legacy:HomeNode|HomeNode]]s I consider my home, or use for other things
; float StartTimeTillStasis: Set in the editor, this determines TimeTillStasis, but only after the pawn gets started well enough.
; bool bPersistent: Set this to true and Tag this pawn with a unique tag for that level. If the pawn dies or travels with the player (like an animal friend) the game will remember. Must have a unique tag or this value is useless.
; bool bCanTeleportWithPlayer: Whether pawn can teleport with player.
; float SeeViewCone: -1.0 to 1 float saying how large an area he can see another character in. 0.75 is about a 30 degree area in front of a pawn. -1.0 would be 180
; bool bFriendWithAuthority: Don't mind getting shot by cops/military, and cops try not to shoot them.
; bool bAngryWithHomeInvaders: Gets mad if true, and someone in the same [[Legacy:ZoneInfo|ZoneInfo]] tagged as your HomeTag
; float DamageMult: How much more(or less) damage we cause to people when shooting them. Most people default to 1.0. The dude should use something higher like 2.0
; name HeroTag: Sets the Hero variable in [[Legacy:LambController|LambController]] if not None
; float FriendDamageThreshold: How much a player has to hurt you before you turn on him
; name StartAnimation: Provide a string for the animation to use
; bool bBodyDisappears: By default bodies eventually disappear.
; bool bReportDeath: Report death (so people get scared/puke when they see a body) If this is FALSE, then the body will automatically never disappear
; bool bIgnoresHearing: Like IgnoreSenses, but can still 'see' player with a gun.
; bool bUsePawnSlider: If this is true, then this pawn's existance is controlled with the Pawn slider in the game info. (Options -&gt; Performance -&gt; Bystander Count)
; bool bKeepForMovie: Whether we want to keep this pawn around for a cutscene
; bool bUseForErrands: I'm used for an errand, so for instance, when I die I'll tell the errand system to check if I completed an errand goal.
; bool bNoTriggerAttackPlayer: If true, then triggering him won't make him attack the player. Usually NPC's will attack the player when triggered.
; bool bRiotMode: Used only for the apocalypse&amp;ndash;makes them carry their gun out all the time so as to get in more fights.

==Known Subclasses==
 FPSPawn
 +- [[Legacy:AnimalPawn|AnimalPawn]]
 |  +- [[Legacy:CatPawn|CatPawn]]
 |  +- [[Legacy:CowPawn|CowPawn]]
 |  +- [[Legacy:DogPawn|DogPawn]]
 |  +- [[Legacy:ElephantPawn|ElephantPawn]]
 +- [[Legacy:P2Pawn|P2Pawn]]
    +- [[Legacy:P2MoCapPawn|P2MoCapPawn]]
       +- [[Legacy:MpPawn|MpPawn]]
          +- [[Legacy:PersonPawn|PersonPawn]]
             +- [[Legacy:AuthorityFigure|AuthorityFigure]]
             |  +- [[Legacy:Police|Police]]
             |     +- ATFAgent
             |     +- CopBlack
             |     +- CopBlue
             |     +- CopBrown
             +- [[Legacy:Bystander|Bystander]]
                +- [[Legacy:Dude|Dude]]
                |  +- [[Legacy:PostalDude|PostalDude]]
                |  +- [[Legacy:XMpPawn|xMpPawn]]
                |     +- MpBandmember
                |     +- MpBum
                |     +- MpDude
                |     |  +- MpMenuPawn
                |     +- MpFanatic
                |     +- MpGary
                |     +- MpGimp
                |     +- MpMilitary
                |     +- MpPriest
                |     +- MpRobber
                |     +- MpSWAT
                |     +- [[Legacy:XMpPawnSS|xMpPawnSS]]
                |        +- MpButcher
                |        +- MpCop
                |        +- MpHabib
                |        +- MpParcelWorker
                |        +- MpRedneck
                |        +- MpRWSBryan
                |        +- MpRWSGeoff
                |        +- MpRWSJosh
                |        +- MpRWSMike
                |        +- MpRWSMikeJ
                |        +- MpRWSNathan
                |        +- MpRWSSteve
                |        +- MpRWSTimb
                |        +- MpRWSVince
                |        +- MpUncleDave
                +- Marchers
                |  +- Protestors
                |  |  +- BookProtestors
                |  |  +- MeatProtestors
                |  |  +- RWSProtestors
                |  +- BandMembers
                +- RWSStaff
                |  +- RWSBryan
                |  +- RWSGeoff
                |  +- RWSJosh
                |  +- RWSMike
                |  +- RWSMikeJ
                |  +- RWSNathan
                |  +- RWSSteve
                |  +- RWSTimb
                |  +- RWSVince
                +- BankRobber
                +- Bums
                +- Bystanders
                +- Fanatics
                +- GangMembers
                +- Gary
                +- Gimp_AMW
                +- JunkyardGuy
                +- Krotchy
                +- Kumquat
                +- Librarian_AFW
                +- MallWorkers
                +- Nurses
                +- ParcelWorkers
                +- Priest_AMW
                +- Rednecks
                +- Scientist
                +- Shopkeeper_AMH
                +- Slaughterers
                +- UncleDave
                +- Zealot

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3265</id>
      <timestamp>2004-05-28T02:35:14Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>addition of enums</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:FPSPawn|FPSPawn]]}}

Intermediate between the engine's [[Legacy:Pawn|Pawn]] and [[Legacy:Postal 2|Postal 2]]'s pawns.

==Enums ==

===EPawnInitialState ===
; EP_Think: Drops down and starts living his life
; EP_AttackPlayer: Find a player and kick his butt
; EP_Panic: Run like a rabbit
; EP_ScaredOfPlayer: Find a player and be scared of him
; EP_HoldPosition: Stand here until bothered
; EP_KickNearest: Go to the nearest person and kick him
; EP_PatrolJail: Patrol walk, but only in a jail. Makes footstep noises
; EP_Dance: Dance until interrupted
; EP_StandWithGun: Stand with your gun out (don't report gun)
; EP_StandWithGunReady: Stand with your gun ready (don't report gun)
; EP_PlayArcade: Play an arcade game
; EP_GoStandInQueue: Go stand in StartInterest
; EP_Turret: Stand with your gun ready, wait for your enemy to approach then attack
; EP_KeyboardType: Typing away at a keyboard until interrupted
; EP_WatchPlayer: Watch the player with curiosity
; EP_ConfusedWatchPlayer: Act confused, watch the player
; EP_CheerPlayer: Applaud the player
; EP_LaughAtPlayer: Laugh at the player
; EP_BystanderGoFindCop: Find a cop and sic him on the player
; EP_Dead: Start out dead

===EGender ===
; Gender_Any
; Gender_Male
; Gender_Female

===ERace ===
; Race_Any
; Race_White
; Race_Black
; Race_Mexican
; Race_Asian
; Race_Hindu
; Race_Fanatic

===EBody ===
; Body_Any
; Body_Avg
; Body_Fat

==Properties ==

===PawnAttributes ===
; bool bBodyDisappears :  By default bodies eventually disappear.  
; bool bCanEnterHomes :  This pawn can use [[Legacy:HomeNode|HomeNode]]s  
; bool bReportDeath :  Report death (so people get scared/puke when they see a body)  
; float DamageMult :  How much more(or less) damage we cause to people when shooting them  
; float FriendDamageThreshold :  How much a player has to hurt you before you turn on him  
; float SeeViewCone :  -1.0 to 1 float saying how large an area he can see another character  
; name StartAnimation :  Provide a string for the animation to use  

===Hidden ===
; bool bIgnoreTimeDilation :  Defaults to false&amp;ndash;set to true if you want this pawn to not be  
; bool bIsDeathCrawling :  Animation state for doing a death crawl. On par with bIsCrouching  
; bool bTravelledWithPlayer :  We need to know if they travelled with us already  
; bool bWasDeathCrawling :  Set after you start deathcrawling. C uses this to know when to do a changeanimation.  
; Pawn DamageInstigator :  Who last attacked me.  
; float DeathCrawlHeight :  
; float DeathCrawlingPct :  Percent of motion for movement in death crawl. 0-1.  
; float DeathCrawlRadius :  collision for deathcrawling  
; Rotator DeathCrawlRotationRate :  You rotate more slowly while doing this  
; FPSPawn DupPawn :  The new pawn to duplicate this pawn into  
; float MovementPct :  Generic pecertang to reduce movement by for pawns  
; Emitter MyBodyChem :  Chemical infection effect for when they can tranfer  
; LoopPoint MyLoopPoint :  Current loop point we're going to  
; FPSPawn MyNextDead :  to know who to remove next when it's time to remove a dead pawn (as specified  
; Weapon MyUrethra :  The thing that lets pee come out of the body  
; float PathCheckTimeActor :  Max time till they reassess their path when going towards an actor  
; float PathCheckTimePoint :  Max time till they reassess their path for a point  
; float RagDollStartTime :  The level time when we first got our ragdoll. Use this to find out  
; float SafeRangeMin :  Distance past which you feel safest in relation to danger  

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FPSPlayer</title>
    <id>1271</id>
    <revision>
      <id>3266</id>
      <timestamp>2004-05-28T22:26:09Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:PlayerController|PlayerController]] &gt;&gt; [[Legacy:FPSPlayer|FPSPlayer]]}}

Intermediate between the engine's [[Legacy:PlayerController|PlayerController]] and [[Legacy:Postal 2|Postal 2]]'s [[Legacy:P2Player|P2Player]].

==Properties ==

===GlobalConfig ===
; bool bEnableDebugMenu: Whether the debug menu is enabled or not

==Functions ==
; function bool DebugEnabled(): Returns true if the debug menu is enabled
; function NotifyGotHealth(int howmuch): Tells the dude he got some health

==Related Topics ==

[[Legacy:P2Player|P2Player]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Face Drag</title>
    <id>1218</id>
    <revision>
      <id>3150</id>
      <timestamp>2003-10-27T20:58:04Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Face Drag is a mode that allows you to shape a [[Legacy:Brush|brush]] in various ways by moving its edges or vertices that define the [[Legacy:Polygon|polygon]]s that make the face. 

This is an experimental mode in [[Legacy:UnrealEd 2|UnrealEd 2]] and therefore does not have a button, although [[Legacy:Custom_toolbox_buttons|custom_toolbox_buttons]] can be made for this command.  All commands are accessible from the [[Legacy:UnrealEd Console|UnrealEd Console]].  The command for Face Drag is: &lt;tt&gt;MODE FACEDRAG&lt;/tt&gt;

'''Note:''' This tool does not function in UnrealEd 3.0, nor is it needed for UT2003 at all; [[Legacy:Static Mesh|Static Meshes]] cause all brush deformation tools to be outdated. Use Static Meshes for all detailed geometry in UT2003.

===Shaping tools===
;Face Drag: Stretches a face on a brush by dragging its edge.  This is similar to [[Legacy:Brush Scaling|brush scaling]] except that it moves only one face of a brush in any direction.  It is more efficient than brush scaling because you can choose which face to scale and do not have to move the brush after scaling.

;Rotate: Rotates the selected brushes around the red [[Legacy:Pivot|pivot]] point.  Similar to the [[Legacy:Brush Rotate|brush rotate]] mode.

;Vertex Edit: Moves the vertices of a brush underneath the pivot point.  Allows you to specify the exact shape of a brush.  If your brush is not a [[Legacy:Terrain|terrain]] and requires extensive editing, you may find the [[Legacy:2D Shape Editor|2D shape editor]] easier.  

;Move Pivot: Moves the red pivot point which can be used for the rotate function or the brush rotate mode.

{|

|-
|'''Function
|'''Key/Mouse control
|'''Where
|-
|Face Drag
|Ctl + Left mouse
|Edge
|-
|Rotate
|Ctl + Right mouse
|Brush
|-
|Rotate w/viewport
|Shift + Right mouse
|Brush
|-
|Vertex Edit
|Alt + Left mouse
|Vertex
|-
|Move Pivot
|Alt + Left mouse
|Brush
|}

====Caveats====
* The face drag mode does not let you select other brushes with the left mouse button like other modes.  Selecting another brush or adding another brush in this mode can still be accessed by the marquee pressing Ctl + Alt + LMB.
* You will need to move the brush away from the pivot point to select the pivot again because the key + mouse combinations are the same as [[Legacy:Vertex Editing|vertex editing]]. 
* Make the changes permanent by using [[Legacy:Transform Permanently|transform permanently]] from the [[Legacy:Brush Context Menu|brush context menu]] when complete.

==Related Topics==
*[[Legacy:Brush Clipping|Brush Clipping]] and [[Legacy:Intersect|Intersect]]ing are other tools for shaping brushes
*[[Legacy:UnrealEd Interface|UnrealEd Interface]] is the main reference for the interface in general
*[[Legacy:Toolbox|Toolbox]] covers all the buttons down the left-hand side of the UnrealEd window
*See [[Legacy:Mouse Control|Mouse Control]] for specific mouse actions in different modes

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3151</id>
      <timestamp>2003-10-27T20:15:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Face Drag is a mode that allows you to shape a [[Legacy:Brush|brush]] in various ways by moving its edges or vertices that define the [[Legacy:Polygon|polygon]]s that make the face. '''Note:''' This tool does not function in UnrealEd 3.0, nor is it needed for UT2003 at all; [[Legacy:Static Mesh|Static Meshes]] cause all brush deformation tools to be outdated. Use Static Meshes for all detailed geometry in UT2003.

This is an experimental mode in [[Legacy:UnrealEd 2|UnrealEd 2]] and therefore does not have a button, although [[Legacy:Custom_toolbox_buttons|custom_toolbox_buttons]] can be made for this command.  All commands are accessible from the [[Legacy:UnrealEd Console|UnrealEd Console]].  The command for Face Drag is:

&lt;tt&gt;MODE FACEDRAG&lt;/tt&gt;

===Shaping tools===
;Face Drag: Stretches a face on a brush by dragging its edge.  This is similar to [[Legacy:Brush Scaling|brush scaling]] except that it moves only one face of a brush in any direction.  It is more efficient than brush scaling because you can choose which face to scale and do not have to move the brush after scaling.

;Rotate: Rotates the selected brushes around the red [[Legacy:Pivot|pivot]] point.  Similar to the [[Legacy:Brush Rotate|brush rotate]] mode.

;Vertex Edit: Moves the vertices of a brush underneath the pivot point.  Allows you to specify the exact shape of a brush.  If your brush is not a [[Legacy:Terrain|terrain]] and requires extensive editing, you may find the [[Legacy:2D Shape Editor|2D shape editor]] easier.  

;Move Pivot: Moves the red pivot point which can be used for the rotate function or the brush rotate mode.

{|

|-
|'''Function
|'''Key/Mouse control
|'''Where
|-
|Face Drag
|Ctl + Left mouse
|Edge
|-
|Rotate
|Ctl + Right mouse
|Brush
|-
|Rotate w/viewport
|Shift + Right mouse
|Brush
|-
|Vertex Edit
|Alt + Left mouse
|Vertex
|-
|Move Pivot
|Alt + Left mouse
|Brush
|}

====Caveats====
* The face drag mode does not let you select other brushes with the left mouse button like other modes.  Selecting another brush or adding another brush in this mode can still be accessed by the marquee pressing Ctl + Alt + LMB.
* You will need to move the brush away from the pivot point to select the pivot again because the key + mouse combinations are the same as [[Legacy:Vertex Editing|vertex editing]]. 
* Make the changes permanent by using [[Legacy:Transform Permanently|transform permanently]] from the [[Legacy:Brush Context Menu|brush context menu]] when complete.

==Related Topics==
*[[Legacy:Brush Clipping|Brush Clipping]] and [[Legacy:Intersect|Intersect]]ing are other tools for shaping brushes
*[[Legacy:UnrealEd Interface|UnrealEd Interface]] is the main reference for the interface in general
*[[Legacy:Toolbox|Toolbox]] covers all the buttons down the left-hand side of the UnrealEd window
*See [[Legacy:Mouse Control|Mouse Control]] for specific mouse actions in different modes

==Comments==

'''Sobiwan:''' Could someone detail how this works in Ued3?

'''GRAF1K:''' I don't think this is really a relevent feature anymore. [[Legacy:Static Mesh|Static Meshes]] &amp;ndash; enough said.

'''Sobiwan:''' As long as it is a function in Ued, it should be described in the WIKI.  The WIKI isnt here to tell the world what is relevant... and what isnt.  :)

'''GRAF1K:''' Well, in any event, don't expect anyone to write up stuff on outdated tech.

'''RDGDanClark:''' The Face Drag button in UEd3 is wonky; it seems to me that it was put in there because they tried and tested the feature in UEd2+, but when they got around to releasing 3, it was no longer needed. Face Drag is used in programs like Maya and Max to help quickly make complex objects, but like GRAF1K said, with Static Meshes taking precedence over BSP geometry, it is no longer needed. Personally, I never saw the attraction of Face Drag in UEd, it seemed like overkill.

'''Sobiwan:'''Ah, well if it doesnt work, then that concludes it.  :)

'''GRAF1K:''' RDGDanClark is quite seriously the ONLY person in the known universe that has gotten my name right. :D Everyone else uses an 'I' instead of a '1' at the very least, and most make the (very ugly-looking) mistake of leaving it lower-case: Graf1k. /me shudders.

'''Tarquin:''' If you want to face drag, just select several vertices &amp; vertex edit!

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FaceToTalkTrigger</title>
    <id>1272</id>
    <revision>
      <id>3267</id>
      <timestamp>2004-10-17T06:21:37Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; FaceToTalkTrigger (Package: MoreGame)}}

Causes the dude to say something, but only when he's looking directly at this actor. Used in many maps where the dude can comment on his surroundings (&quot;Did someone slaughter a goat in here? Seriously, I wanna know.&quot;)

==Properties==
; float CanSeeViewCone : Tightness of view cone. 0.1 is very tight, 1 is very wide
; Sound SoundToPlay : Say exactly this when you see this trigger

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3268</id>
      <timestamp>2004-06-10T13:58:58Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; [[Legacy:FaceToTalkTrigger|FaceToTalkTrigger]]}}

Causes the dude to say something, but only when he's looking directly at this actor.

==Properties==
; float CanSeeViewCone : Tightness of view cone 0.1 is very tight, 1 is very wide
; Sound SoundToPlay : Say exactly this when you see this trigger

==Related Topics ==
* [[:Category:Legacy Class (P2)]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Factory</title>
    <id>28430</id>
    <revision>
      <id>40102</id>
      <timestamp>2009-11-15T08:30:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FadeColor</title>
    <id>1281</id>
    <revision>
      <id>3282</id>
      <timestamp>2005-10-11T16:10:44Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>FadeColor</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:FadeColor|FadeColor]] (Package: Engine)}}

A material that generates a constant color by interpolating between two colors. Useful for adding simple fading effects at runtime.

==Properties==
; Color Color1 : First color.
; Color Color2 : Second color.
; float FadePeriod : How long each fade takes.
; float FadePhase : Time offset. When creating or resetting FadeColor at runtime, set this to -Level.TimeSeconds to synchronize fade cycle.
; EColorFadeType ColorFadeType: How to fade between colors.

==Enums==

===EColorFadeType===
; FC_Linear : Interpolate between colors in a linear way.
; FC_Sinusoidal : Very similiar, stays at full color a bit longer, fading between colors is a bit faster. This settings doubles the fade time. Divide FadePeriod by 2 to get the same time as in FC_Linear.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FadeViewTrigger</title>
    <id>1219</id>
    <revision>
      <id>3152</id>
      <timestamp>2002-06-15T04:33:09Z</timestamp>
      <contributor>
        <ip>12-236-19-23.client.attbi.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; FadeViewTrigger}}

This actor, when triggered by a player, causes his view to gradually fade out into darkness.  There are only two places where this actor is known to have been used:
* The end of the CityIntro.unr map that starts when Unreal Tournament loads.
* The end of each map in the Operation:  Na Pali demo (a project to make a second Unreal Mission Pack).   (Note: In the final Operation: Na Pali version (1.2), it is no longer used, instead being replaced with a &quot;fadeoutteleporter&quot;).

This actor is primarily of cinematic use in Unreal Tournament.  Few mappers will have the need to use it, but it is still an interesting thing for them to know.</text>
    </revision>
    <revision>
      <id>3153</id>
      <timestamp>2002-01-31T09:06:42Z</timestamp>
      <contributor>
        <ip>TechnoJF</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; FadeViewTrigger}}

This actor, when triggered by a player, causes his view to gradually fade out into darkness.  There are only two places where this actor is known to have been used:
* The end of the CityIntro.unr map that starts when Unreal Tournament loads.
* The end of each map in the Operation:  Na Pali demo (a project to make a second Unreal Mission Pack).

This actor is primarily of cinematic use in Unreal Tournament.  Few mappers will have the need to use it, but it is still an interesting thing for them to know.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Faithful</title>
    <id>1255</id>
    <revision>
      <id>3234</id>
      <timestamp>2004-05-27T07:30:05Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well, as I've made a couple changes and put my name on the few comments I made I thought I might as well make a personal page...

==About==

I'm mostly a lurker. Keep to myself. But I do enjoy company most of the time.

When UT99 was popular I was usually playing Assault online and DarkMagic or MultiCTF offline/LAN. Now that I own UT2004, I'm working on a couple mods of my own (which I may or may not release) as well as playing Assault online again. (Also pop into other gametypes here and there)

==Contact==
;UT2004
: Faithful
: 0xDEADBEEF ''(which converted to decimal is 3735928559)''
;AIM
: PbcJzz13
: LinuxRejekt
;ICQ
: 22750472
;MSN
: blippitybloppity@hotmail.com ''(note: i do not check this e-mail address)''
;E-mail
: ask me

==Comments==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hi, welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3235</id>
      <timestamp>2004-05-27T06:33:52Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">Well, as I've made a couple changes and put my name on the few comments I made I thought I might as well make a personal page...

==About==

I'm mostly a lurker. Keep to myself. But I do enjoy company most of the time.

When UT99 was popular I was usually playing Assault online and DarkMagic or MultiCTF offline/LAN. Now that I own UT2004, I'm working on a couple mods of my own (which I may or may not release) as well as playing Assault online again. (Also pop into other gametypes here and there)

==Contact==
;UT2004
: Faithful
: 0xDEADBEEF ''(which converted to decimal is 3735928559)''
;AIM
: PbcJzz13
: LinuxRejekt
;ICQ
: 22750472
;MSN
: blippitybloppity@hotmail.com ''(note: i do not check this e-mail address)''
;E-mail
: ask me

==Comments==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fan2</title>
    <id>1239</id>
    <revision>
      <id>3198</id>
      <timestamp>2002-05-25T09:00:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; Fan2}}

A big fan. Remember that if placed upright its [[Legacy:Collision Cylinder|collision cylinder]] won't match the visible shape.

Tutorials that use this actor:

* [[Legacy:Deadly Fan|Deadly Fan]]
* [[Legacy:Floater Fan|Floater Fan]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fat Marrow</title>
    <id>1262</id>
    <revision>
      <id>3249</id>
      <timestamp>2005-08-02T23:44:09Z</timestamp>
      <contributor>
        <ip>Fat Marrow</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">Email mpfarrow (at) yahoo.co.uk

User number 7230 (because I always forget)

===Current projects===
* Trying to make decent static meshes in [[Legacy:Lightwave|Lightwave]]
* i.e. things like [[Legacy:Rendering Lightmaps In Lightwave|Rendering lightmaps in Lightwave]]

==Comments==

'''Tarquin:''' Hi there! welcome to the wiki. Nice work on the Maya/Common Problems page... I've renamed it [[Legacy:Maya FAQ|Maya FAQ]]

'''Fat Marrow:''' Thanks :-)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3250</id>
      <timestamp>2003-06-30T12:46:35Z</timestamp>
      <contributor>
        <ip>Fat Marrow</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Visit the World of Marrow @ http://www.doodoo.demon.co.uk/

Email mpfarrow (at) yahoo.co.uk

==Comments==

'''Tarquin:''' Hi there! welcome to the wiki. Nice work on the Maya/Common Problems page... I've renamed it [[Legacy:Maya FAQ|Maya FAQ]]

'''Fat Marrow:''' Thanks :-)</text>
    </revision>
    <revision>
      <id>3251</id>
      <timestamp>2004-04-12T12:46:52Z</timestamp>
      <contributor>
        <ip>Fat Marrow</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Visit the World of Marrow @ http://www.doodoo.demon.co.uk/

Email mpfarrow (at) yahoo.co.uk

User number 7230 (because I always forget)

==Comments==

'''Tarquin:''' Hi there! welcome to the wiki. Nice work on the Maya/Common Problems page... I've renamed it [[Legacy:Maya FAQ|Maya FAQ]]

'''Fat Marrow:''' Thanks :-)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FatBoy</title>
    <id>1220</id>
    <revision>
      <id>3154</id>
      <timestamp>2003-05-02T21:45:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; FatBoy (Package: Botpack)}}

This mutator makes players fatter or thinner depending on the ratio of the number of times they die to the number of times they get a kill.  Everytime a player scores a kill the player will get a little fatter.  Everytime a player dies they will get a little thinner.

This mutator simply makes good players easier to see - it doesn't change the size of the player's collision cylinder.

==Methods Inherited From Mutator ==
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : This function is responsible for making players fatter and thinner.  It does this by changing the &lt;tt&gt;[[Legacy:Actor (UT)|Actor]].Fatness&lt;/tt&gt; property.  For each kill a player will get 10 &quot;units&quot; fatter up to a maximum of 255.  For each death a player will get 10 &quot;units&quot; thinner down to a minimum of 60.  Just for reference the default value for &lt;tt&gt;Fatness&lt;/tt&gt; is 128.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3155</id>
      <timestamp>2003-05-01T00:21:12Z</timestamp>
      <contributor>
        <ip>Tulip</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; FatBoy (Package: Botpack)}}

This mutator makes players fatter or thinner depending on the ratio of the number of times they die to the number of times they get a kill.  Everytime a player scores a kill the player will get a little fatter.  Everytime a player dies they will get a little thinner.

This mutator simply makes good players easier to see - it doesn't change the size of the player's collision cylinder.

==Methods Inherited From Mutator ==
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : This function is responsible for making players fatter and thinner.  It does this by changing the &lt;tt&gt;[[Legacy:Actor (UT)|Actor]].Fatness&lt;/tt&gt; property.  For each kill a player will get 10 &quot;units&quot; fatter up to a maximum of 255.  For each death a player will get 10 &quot;units&quot; thinner down to a minimum of 60.  Just for reference the default value for &lt;tt&gt;Fatness&lt;/tt&gt; is 128.

----

'''Ben 2500:''' Rename to FatBoy(UT)

'''Wormbo:''' UT classes are only renamed when there's a UT2003 class with the same name. [[Legacy:Delete Reply When You See It|delete reply when you see it]]

'''Ben 2500:''' OK.:)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FatnessTrigger</title>
    <id>1253</id>
    <revision>
      <id>3230</id>
      <timestamp>2003-01-09T06:55:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; FatnessTrigger (Package: UnrealI)}}

When triggered, alters the fatness of an actor from one state to another, over a set time interval.

'''Note:''' You have to use one FatnessTrigger per Actor.

==Properties ==

===FatnessTrigger Group ===
; float ChangeTime : Time interval for the fatness change.
; int EndFatness : Final fatness value.
; name FatTag : Only the ''last'' actor with this [[Legacy:Tag|Tag]] gets its Fatness changed.
; int StartFatness : Start fatness for the actor when this trigger is activated.

===Script Only ===
; [[Legacy:Actor (UT)|Actor (UT)]] FatActor : The affected actor. This is set when the FatnessTrigger is activated.
; float TimePassed : Amount of time that has passed since the trigger was activated.

'''Ike Bart:''' I tried to use this event triggered by a trigger and it wouldn't change the fatness of any decorations that had the same tag as its FatTag. Perhaps it only works on pawns or inventory items.  I'll do some more testing on pawns and other stable objects with meshes.</text>
    </revision>
    <revision>
      <id>3231</id>
      <timestamp>2003-01-09T04:10:57Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] &gt;&gt; [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; FatnessTrigger}}

==Properties ==

===FatnessTrigger Group ===
;ChangeTime (float):
;EndFatness (int):
;FatTag (name):
;StartFatness (int):

===Script Only ===
;var actor FatActor
;var float TimePassed

'''Ike Bart:''' I tried to use this event triggered by a trigger and it wouldn't change the fatness of any decorations that had the same tag as its FatTag. Perhaps it only works on pawns or inventory items.  I'll do some more testing on pawns and other stable objects with meshes.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FavoritesTeleporter</title>
    <id>28884</id>
    <revision>
      <id>42814</id>
      <timestamp>2010-03-31T11:02:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FearSpot</title>
    <id>1221</id>
    <revision>
      <id>3156</id>
      <timestamp>2003-05-27T08:28:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; FearSpot (Package: UnrealShare)}}

This is an actor used to mark a place that any AI-controlled [[Legacy:Pawn (UT)|Pawn (UT)]] will be afraid of.  The Pawn will become afraid of this location immediately as it touches the FearSpot.  However, for the FearSpot to be effective, there should not be any paths running through the area where the FearSpot is located.

==Properties==
; bool bInitiallyActive : This is just to tell the actor that it should be working if it is active and not working if it isn't.  Triggering this actor will toggle it on and off.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3157</id>
      <timestamp>2002-01-31T05:21:58Z</timestamp>
      <contributor>
        <ip>TechnoJF</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; FearSpot}}

This is an actor used to mark a place that any AI-controlled [[Legacy:Pawn (UT)|Pawn (UT)]] will be afraid of.  The Pawn will become afraid of this location immediately as it touches the FearSpot trigger.  However, for the FearSpot to be effective, there should not be any paths running through the area where the FearSpot is located.

The actor has a single unique variable of &lt;font color=green&gt;&lt;b&gt;bInitiallyActive&lt;/b&gt;&lt;/font&gt;.  This is just to tell the actor that it should be working if it is active and not working if it isn't.  Triggering this actor will toggle it on and off.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Featured Pages</title>
    <id>1256</id>
    <revision>
      <id>3236</id>
      <timestamp>2006-08-28T19:25:24Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>OId Skool Monsta Toolz link added</comment>
      <text xml:space="preserve">Some of the latest cool pages on the Unreal Wiki:

; [[Legacy:SuperApe/Old_Skool_Monsta_Toolz|Old Skool Monsta Toolz]] : Information base for the OSMT toolset, including the OSM Adventure gametype.  Complex creature AI support in UT2004, plus much more.
; [[Legacy:Search|Search]] : The search page has been fixed.
; [[Legacy:UsUnit|UsUnit]] : an UnrealScript [[Wikipedia:Unit Test]]ing Framework, being developed by [[Legacy:El Muerte|El Muerte]].
; [[Legacy:Wiki Integration/Browser Search|Wiki Integration/Browser Search]] : Search the wiki directly from your web browser. Firefox users can install a [http://mycroft.mozdev.org/download.html?name=unreal&amp;submitform=Search plugin for the search bar].
; [[Legacy:UCPP|UCPP]] : Adds preprocessor features not possible with UCC.
; [[Legacy:Bloom|Bloom]] : Lightbloom rendering for UT2004.
; [[Legacy:G16ed|G16ed]] : essential app for working with terrain
; [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]] : Find the static mesh you're looking for quickly and easily.
; [[Legacy:Reloading Weapons|Reloading Weapons]] : Mr Evil shares insight and source code
; [[Legacy:Offline Wiki|Offline Wiki]] : download the whole site as a zip. 
; [[Legacy:UnrealScript Grammar|UnrealScript Grammar]] : EBNF specification for UnrealScript
; [[Legacy:Creating A Terrain|Creating A Terrain]] : has had an extensive rewrite. Shows you how to create a terrain in minutes!
; [[Legacy:BruteForce|BruteForce]] : a programming language written in UnrealScript

==Related Topics==
* [[Legacy:Home Page|Home Page]] &amp;ndash; the site's entry point
* [[Legacy:TourBusStop|TourBusStop]] &amp;ndash; our connection to the wiki-wide system
* [[Legacy:Recent Changes|Recent Changes]] &amp;ndash; see what people have been writing recently</text>
    </revision>
    <revision>
      <id>3237</id>
      <timestamp>2006-07-18T06:55:57Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*revert</comment>
      <text xml:space="preserve">Some of the latest cool pages on the Unreal Wiki:

; [[Legacy:Search|Search]] : The search page has been fixed.
; [[Legacy:UsUnit|UsUnit]] : an UnrealScript [[Wikipedia:Unit Test]]ing Framework, being developed by [[Legacy:El Muerte|El Muerte]].
; [[Legacy:Wiki Integration/Browser Search|Wiki Integration/Browser Search]] : Search the wiki directly from your web browser. Firefox users can install a [http://mycroft.mozdev.org/download.html?name=unreal&amp;submitform=Search plugin for the search bar].
; [[Legacy:UCPP|UCPP]] : Adds preprocessor features not possible with UCC.
; [[Legacy:Bloom|Bloom]] : Lightbloom rendering for UT2004.
; [[Legacy:G16ed|G16ed]] : essential app for working with terrain
; [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]] : Find the static mesh you're looking for quickly and easily.
; [[Legacy:Reloading Weapons|Reloading Weapons]] : Mr Evil shares insight and source code
; [[Legacy:Offline Wiki|Offline Wiki]] : download the whole site as a zip. 
; [[Legacy:UnrealScript Grammar|UnrealScript Grammar]] : EBNF specification for UnrealScript
; [[Legacy:Creating A Terrain|Creating A Terrain]] : has had an extensive rewrite. Shows you how to create a terrain in minutes!
; [[Legacy:BruteForce|BruteForce]] : a programming language written in UnrealScript

==Related Topics==
* [[Legacy:Home Page|Home Page]] &amp;ndash; the site's entry point
* [[Legacy:TourBusStop|TourBusStop]] &amp;ndash; our connection to the wiki-wide system
* [[Legacy:Recent Changes|Recent Changes]] &amp;ndash; see what people have been writing recently</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Feid</title>
    <id>1280</id>
    <revision>
      <id>3280</id>
      <timestamp>2006-06-05T10:53:40Z</timestamp>
      <contributor>
        <ip>217.33.74.20</ip>
      </contributor>
      <comment>Feid</comment>
      <text xml:space="preserve">===Feid===

====HI ya!====

well hiya everybody... this is Feid.

====25 May 2006====

I'am back!!!

Sorry i did't get time to get involved in this wiki alot for reasons concerning SchoolWork, and other Troubles.

====BIO====

----

AGE: 15 

GENDER: Male

JOB: Student

Interests: &lt;Unreal,Quake,Doom,Half-life&gt;Mapping and &lt;ASM(x86),C,C++,PERL,PASCAL,COBOL,QBASIC,VB,VBA,Uscript,Java,HTML,Css,XHTML,Javascript,shellscripts(BASH,SH,CSH)&gt;Programming..

Other interests: Reading &amp; Writing also like to listen to PLANETROCK Music!!!!

Hobbys: Mapping For UT , Programming ,Creative Writing... everything UT and Half-life (any-version)

Skills: Mapping ideas and mapping and Programming also I Create websites for Free for companys ..etc

=====For Future Refrence=====

----

===Notes ===

Is there a Problem with the Offline wikipage as all the updates seem to be old?

----

LINKS 
 [@]to be placed here

----

'''Tarquin:''' Hi. Welcome to Unreal Wiki :)

'''Feid:''' Hi Tarquin, Thanks! 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3281</id>
      <timestamp>2006-05-26T07:54:44Z</timestamp>
      <contributor>
        <ip>Feid</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Feid===

====HI ya!====

well hiya everybody... this is Feid.

====25 May 2006====

I'am back!!!

Sorry i did't get time to get involved in this wiki alot for reasons concerning SchoolWork, and other Troubles.

====BIO====

----

AGE: 15 

GENDER: Male

JOB: Student

Interests: &lt;Unreal,Quake,Doom,Half-life&gt;Mapping and &lt;ASM(x86),C,C++,PERL,PASCAL,COBOL,QBASIC,VB,VBA,Uscript,Java,HTML,Css,XHTML,Javascript,shellscripts(BASH,SH,CSH)&gt;Programming..

Other interests: Reading &amp; Writing also like to listen to PLANETROCK Music!!!!

Hobbys: Mapping For UT , Programming ,Creative Writing... everything UT and Half-life (any-version)

Skills: Mapping ideas and mapping and Programming also I Create websites for Free for companys ..etc

=====For Future Refrence=====

----

LINKS 
 [@]to be placed here

----

'''Tarquin:''' Hi. Welcome to Unreal Wiki :)

'''Feid:''' Hi Tarquin, Thanks! 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fflife</title>
    <id>1217</id>
    <revision>
      <id>3148</id>
      <timestamp>2002-10-22T07:05:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi! Welcome to the wiki! :) :tup:

'''Tarquin:''' (damn, Zxan beat me to it this time!) Hello and welcome!

'''ZxAnPhOrIaN:''' Hehe... :D

'''Wormbo:''' A bit late, but welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3149</id>
      <timestamp>2002-08-19T14:30:16Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi! Welcome to the wiki! :) :tup:

'''Tarquin:''' (damn, Zxan beat me to it this time!) Hello and welcome!

'''ZxAnPhOrIaN:''' Hehe... :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fik</title>
    <id>1241</id>
    <revision>
      <id>3201</id>
      <timestamp>2002-09-20T16:15:44Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>Hello!</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: (I put a Category Personal Page footer on this page.)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:File Format</title>
    <id>1251</id>
    <revision>
      <id>3226</id>
      <timestamp>2008-03-10T19:16:08Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>added some more formats</comment>
      <text xml:space="preserve">The [[Legacy:Unreal Engine|Unreal Engine]] uses many different file formats. On this page we present an overview of them all.

==Package File==

The Unreal Engine has one principal file format, the [[Legacy:Package|package]]. It's this that stores all the [[Legacy:Unreal Resource|Unreal resource]]s: maps, textures, compiled UnrealScript classes, etc. 

There is only one [[Legacy:Package File Format|Package File Format]] for all the extensions listed, so in fact ''any'' package can hold any type of resource, irrespective of where it is kept and its extension. But the usual contents are:

* [[Legacy:U File|U file]] &amp;ndash;  [[Legacy:UnrealScript|UnrealScript]] classes compiled with [[Legacy:Ucc|ucc]]
* UNR file / UT2 file - [[Legacy:Map File|Map File]]s
* [[Legacy:UTX File|UTX file]] &amp;ndash; textures and materials
* [[Legacy:UMX File|UMX file]] &amp;ndash; music
* [[Legacy:UAX File|UAX file]] &amp;ndash; sound
* [[Legacy:UKX File|UKX file]] &amp;ndash; animations
* [[Legacy:UZ File|UZ file]] / UZ2 file &amp;ndash; Unreal zip (can be compressed and decompressed with [[Legacy:Ucc|ucc]])

Map files can have other resources embedded within them; see [[Legacy:MyLevel|MyLevel]] or [[Legacy:Embedding Code|Embedding code]]. 

Each type of package should be put in specific subfolder: see [[Legacy:Engine Directory Structure|Engine Directory Structure]]. Despite being in different folders and having different extensions, the engine considers only the package name. This means that two packages such as:
 /Sounds/Foo.uax
 /Textures/Foo.utx

will be considered by the engine as the ''same package'', which will cause considerable problems. The usual way to be sure you don't use the same name twice is to append the type of resource to the name, eg MyProjectSounds.uax, MyProjectTextures.utx.

==Other formats ==

Installers:
* [[Legacy:UMOD|UMOD]]/UT2MOD &amp;ndash; Unreal Module or UT2003 Module files are installer packages for the Unreal engine.

Mapping:
* [[Legacy:T3D File|T3D file]] &amp;ndash; brush saved by UnrealEd
* [[Legacy:2DS File|2DS file]] &amp;ndash; 2D shape saved by the UnrealEd [[Legacy:2D Shape Editor|2D Shape Editor]]

Coding:
* [[Legacy:INI File|INI file]] &amp;ndash; see [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]]
* [[Legacy:INT File|INT file]] &amp;ndash; see also [[Legacy:Localization|localization]]
* [[Legacy:UC File|UC file]] &amp;ndash; UnrealScript source code
* [[Legacy:UPL File|UPL file]] &amp;ndash; see [[Legacy:UPL File|UPL File]]
* [[Legacy:UPKG File|UPKG file]] &amp;ndash; Package flags

Importable:
* [[Legacy:DXF File|DXF file]]
* [[Legacy:ASC File|ASC file]]
* [[Legacy:LWO File|LWO file]]
* [[Legacy:ASE File Format|ASE file format]]
* [[Legacy:OBJ File|OBJ file]]

Other importable formats:
* [[Legacy:WAV File|WAV file]] &amp;ndash; wave files are imported and saved as ''.uax''
* [[Legacy:3D File|3D file]] &amp;ndash; LOD Mesh and Animation data used by early builds of UnrealEngine 1.0, see [[Legacy:3ds2unr|3ds2unr]]
* [[Legacy:PSK File|PSK file]] &amp;ndash; Skeletal Mesh file, see [[Legacy:Skeletal_Mesh|Skeletal_Mesh]]
* [[Legacy:PSA File|PSA file]] &amp;ndash; Skeletal Animation file

Other file formats recognized by the engine:
* [[Legacy:OGG File|OGG file]] &amp;ndash; for music and sound
* [[Legacy:Ucs File|Ucs file]] &amp;ndash; for [[Legacy:AI Scripting|AI scripting]]
* [[Legacy:KA File|KA file]] &amp;ndash; for Karma data (ragdolls?)

==Related Topics==
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3227</id>
      <timestamp>2007-06-25T04:55:10Z</timestamp>
      <contributor>
        <ip>Home-001511.b.astral.ro</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Unreal Engine|Unreal Engine]] uses many different file formats. On this page we present an overview of them all.

==Package File==

The Unreal Engine has one principal file format, the [[Legacy:Package|package]]. It's this that stores all the [[Legacy:Unreal Resource|Unreal resource]]s: maps, textures, compiled UnrealScript classes, etc. 

There is only one [[Legacy:Package File Format|Package File Format]] for all the extensions listed, so in fact ''any'' package can hold any type of resource, irrespective of where it is kept and its extension. But the usual contents are:

* [[Legacy:U File|U file]] &amp;ndash;  [[Legacy:UnrealScript|UnrealScript]] classes compiled with [[Legacy:Ucc|ucc]]
* UNR file / UT2 file - [[Legacy:Map File|Map File]]s
* [[Legacy:UTX File|UTX file]] &amp;ndash; textures and materials
* [[Legacy:UMX File|UMX file]] &amp;ndash; music
* [[Legacy:UAX File|UAX file]] &amp;ndash; sound
* [[Legacy:UKX File|UKX file]] &amp;ndash; animations
* [[Legacy:UZ File|UZ file]] / UZ2 file &amp;ndash; Unreal zip (can be compressed and decompressed with [[Legacy:Ucc|ucc]])

Map files can have other resources embedded within them; see [[Legacy:MyLevel|MyLevel]] or [[Legacy:Embedding Code|Embedding code]]. 

Each type of package should be put in specific subfolder: see [[Legacy:Engine Directory Structure|Engine Directory Structure]]. Despite being in different folders and having different extensions, the engine considers only the package name. This means that two packages such as:
 /Sounds/Foo.uax
 /Textures/Foo.utx

will be considered by the engine as the ''same package'', which will cause considerable problems. The usual way to be sure you don't use the same name twice is to append the type of resource to the name, eg MyProjectSounds.uax, MyProjectTextures.utx.

==Other formats ==

Installers:
* [[Legacy:UMOD|UMOD]]/UT2MOD &amp;ndash; Unreal Module or UT2003 Module files are installer packages for the Unreal engine.

Mapping:
* [[Legacy:T3D File|T3D file]] &amp;ndash; brush saved by UnrealEd
* [[Legacy:2DS File|2DS file]] &amp;ndash; 2D shape saved by the UnrealEd [[Legacy:2D Shape Editor|2D Shape Editor]]

Coding:
* [[Legacy:INI File|INI file]] &amp;ndash; see [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]]
* [[Legacy:INT File|INT file]] &amp;ndash; see also [[Legacy:Localization|localization]]
* [[Legacy:UC File|UC file]] &amp;ndash; UnrealScript source code
* [[Legacy:UPL File|UPL file]] &amp;ndash; see [[Legacy:UPL File|UPL File]]
* [[Legacy:UPKG File|UPKG file]] &amp;ndash; Package flags

Importable:
* [[Legacy:DXF File|DXF file]]
* [[Legacy:ASC File|ASC file]]
* [[Legacy:LWO File|LWO file]]
* [[Legacy:ASE File Format|ASE file format]]
* [[Legacy:OBJ File|OBJ file]]

Other file formats recognized by the engine:
* [[Legacy:OGG File|OGG file]] &amp;ndash; for music and sound
* [[Legacy:Ucs File|Ucs file]] &amp;ndash; for [[Legacy:AI Scripting|AI scripting]]
* [[Legacy:KA File|KA file]] &amp;ndash; for Karma data (ragdolls?)

==Related Topics==
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]

----

[[:Category:Legacy FAQ]]

Shouldn't the .PSK and .PSA extensions have entries on this page?
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FileLog</title>
    <id>1264</id>
    <revision>
      <id>3254</id>
      <timestamp>2006-03-31T00:49:54Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FileLog (Package: Engine)}}

FileLog lets you write to an independant log file (rather than the normal UT2003.log).  From what I gather, its usage is simple:

# Create an instance of FileLog.
# Call OpenLog() on the instance to open the log file with a filename (minus extension) you specify - the file will be placed in the &quot;User Logs&quot; folder with a .log extension
# Write to the log using Logf(String)
# Close the log using CloseLog()

==Properties==
; pointer LogAr : Internal pointer to the file archive. You can't do anything with this.
; string LogFileName : The filename used, this will be set after the call to OpenLog().

==Methods==

===Native Functions===
; CloseLog ( ) : Close the log file.
; Logf (string LogString) : Write the string ''LogString'' to the opened file.
; OpenLog (string FName) : Open a log file with the filename as defined by ''FName''. '''Note:''' the filename can only contain alphanumeric characters and a few symbols. The following symbols will be converted to an '_': ':', '\', '/', '.' &lt;br /&gt;The extention '.log' will always be appended to the filename, and the files will be saved in the ../UserLogs directory.

===Events===
; Destroyed ( ): This will automatically close the log file.

==Notes==

The output is buffered, that means nothing will be flushed to the actual log file until the buffer is full. So when the server shuts down without the FileLog being closed the log file will not contain the last few log lines.

The event Destroyed(); is actually never called. So you have to do your own checking to close the file, a good method is to enable the Tick() event and check if &lt;code&gt;Level.NextURL != &quot;&quot;&lt;/code&gt; and then close the file. This does ofcourse not work when you shut down the server.

'''''Important:''''' files can only be opened once, if you try to open a file that is already opened the server will crash. So be sure to make the log file name unique per server. The following code is a usefull addition to your mod, it will allow users to configure the name of the log file with the aid of a couple place holders

&lt;uscript&gt;
function string GetServerPort()
{
    local string S;
    local int i;
    // Figure out the server's port.
    S = Level.GetAddressURL();
    i = InStr( S, &quot;:&quot; );
    assert(i&gt;=0);
    return Mid(S,i+1);
}

function string LogFilename()
{
  local string result;
  result = sFileFormat;
  ReplaceText(result, &quot;%P&quot;, GetServerPort());
  ReplaceText(result, &quot;%N&quot;, Level.Game.GameReplicationInfo.ServerName);
  ReplaceText(result, &quot;%Y&quot;, Right(&quot;0000&quot;$string(Level.Year), 4));
  ReplaceText(result, &quot;%M&quot;, Right(&quot;00&quot;$string(Level.Month), 2));
  ReplaceText(result, &quot;%D&quot;, Right(&quot;00&quot;$string(Level.Day), 2));
  ReplaceText(result, &quot;%H&quot;, Right(&quot;00&quot;$string(Level.Hour), 2));
  ReplaceText(result, &quot;%I&quot;, Right(&quot;00&quot;$string(Level.Minute), 2));
  ReplaceText(result, &quot;%W&quot;, Right(&quot;0&quot;$string(Level.DayOfWeek), 1));
  ReplaceText(result, &quot;%S&quot;, Right(&quot;00&quot;$string(Level.Second), 2));
  return result;
}
&lt;/uscript&gt;

==Discussion==

'''Foxpaw:''' A less hacky way of having the FileLog destroy itself would be to have it destroyed, by whatever actor is using it to write stuff, in that actors destroyed function.

'''EricBlade:''' My FileLog crashes the engine if you don't immediatly close it after writing (Land of the Dead, engine 2226).. had to subclass GameStats to make that work right, and have it open and close the log after each write.  However, this leads to a bunch of &quot;Opened user log&quot; lines in the main log, can I use Suppress= in the INI to suppress those messages?

'''El Muerte:''' No you need to close it before the game switches to a new map. Pre UE2.5 the log file wasn't properly closed.

'''EricBlade:''' If I do

&lt;uscript&gt;
file.OpenLog(&quot;test&quot;);
file.logf(&quot;test&quot;);
&lt;/uscript&gt;

without a file.CloseLog(); after, I get a GPF. :(

'''El Muerte:''' When do you get the GPF? Also note, that only one filelog instance can write to a file, if an other files opens it it will also crash

'''EricBlade:''' The crash message says that it crashes in the logf() call, but since it only does it if i don't close the file, it doesn't make any sense.  The actual code that I was using was:

&lt;uscript&gt;
var FileLog AdminLog;
function alog(string x, optional name tag) {
    if(AdminLog == None) {
        AdminLog = spawn(class'FileLog');
        if(AdminLog != None) {
            AdminLog.OpenLog(&quot;admin&quot;);
            AdminLog.Logf(tag@x);
        } else {
            log(x, tag);
        }
    } else {
        AdminLog.Logf(tag@x);
    }
}
&lt;/uscript&gt;

I also got the same GPF if I enabled StatsLogging on the server, until I subclassed GameStats to close the log immediatly after writing.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3255</id>
      <timestamp>2006-03-30T19:10:43Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FileLog (Package: Engine)}}

FileLog lets you write to an independant log file (rather than the normal UT2003.log).  From what I gather, its usage is simple:

# Create an instance of FileLog.
# Call OpenLog() on the instance to open the log file with a filename (minus extension) you specify - the file will be placed in the &quot;User Logs&quot; folder with a .log extension
# Write to the log using Logf(String)
# Close the log using CloseLog()

==Properties==
; pointer LogAr : Internal pointer to the file archive. You can't do anything with this.
; string LogFileName : The filename used, this will be set after the call to OpenLog().

==Methods==

===Native Functions===
; CloseLog ( ) : Close the log file.
; Logf (string LogString) : Write the string ''LogString'' to the opened file.
; OpenLog (string FName) : Open a log file with the filename as defined by ''FName''. '''Note:''' the filename can only contain alphanumeric characters and a few symbols. The following symbols will be converted to an '_': ':', '\', '/', '.' &lt;br /&gt;The extention '.log' will always be appended to the filename, and the files will be saved in the ../UserLogs directory.

===Events===
; Destroyed ( ): This will automatically close the log file.

==Notes==

The output is buffered, that means nothing will be flushed to the actual log file until the buffer is full. So when the server shuts down without the FileLog being closed the log file will not contain the last few log lines.

The event Destroyed(); is actually never called. So you have to do your own checking to close the file, a good method is to enable the Tick() event and check if &lt;code&gt;Level.NextURL != &quot;&quot;&lt;/code&gt; and then close the file. This does ofcourse not work when you shut down the server.

'''''Important:''''' files can only be opened once, if you try to open a file that is already opened the server will crash. So be sure to make the log file name unique per server. The following code is a usefull addition to your mod, it will allow users to configure the name of the log file with the aid of a couple place holders

&lt;uscript&gt;
function string GetServerPort()
{
    local string S;
    local int i;
    // Figure out the server's port.
    S = Level.GetAddressURL();
    i = InStr( S, &quot;:&quot; );
    assert(i&gt;=0);
    return Mid(S,i+1);
}

function string LogFilename()
{
  local string result;
  result = sFileFormat;
  ReplaceText(result, &quot;%P&quot;, GetServerPort());
  ReplaceText(result, &quot;%N&quot;, Level.Game.GameReplicationInfo.ServerName);
  ReplaceText(result, &quot;%Y&quot;, Right(&quot;0000&quot;$string(Level.Year), 4));
  ReplaceText(result, &quot;%M&quot;, Right(&quot;00&quot;$string(Level.Month), 2));
  ReplaceText(result, &quot;%D&quot;, Right(&quot;00&quot;$string(Level.Day), 2));
  ReplaceText(result, &quot;%H&quot;, Right(&quot;00&quot;$string(Level.Hour), 2));
  ReplaceText(result, &quot;%I&quot;, Right(&quot;00&quot;$string(Level.Minute), 2));
  ReplaceText(result, &quot;%W&quot;, Right(&quot;0&quot;$string(Level.DayOfWeek), 1));
  ReplaceText(result, &quot;%S&quot;, Right(&quot;00&quot;$string(Level.Second), 2));
  return result;
}
&lt;/uscript&gt;

==Discussion==

'''Foxpaw:''' A less hacky way of having the FileLog destroy itself would be to have it destroyed, by whatever actor is using it to write stuff, in that actors destroyed function.

'''EricBlade:''' My FileLog crashes the engine if you don't immediatly close it after writing (Land of the Dead, engine 2226).. had to subclass GameStats to make that work right, and have it open and close the log after each write.  However, this leads to a bunch of &quot;Opened user log&quot; lines in the main log, can I use Suppress= in the INI to suppress those messages?

'''El Muerte:''' No you need to close it before the game switches to a new map. Pre UE2.5 the log file wasn't properly closed.

'''EricBlade:''' If I do

&lt;uscript&gt;
file.OpenLog(&quot;test&quot;);
file.logf(&quot;test&quot;);
&lt;/uscript&gt;

without a file.CloseLog(); after, I get a GPF. :(

'''El Muerte:''' When do you get the GPF? Also note, that only one filelog instance can write to a file, if an other files opens it it will also crash

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FinalBlend</title>
    <id>1265</id>
    <revision>
      <id>3256</id>
      <timestamp>2005-03-05T19:02:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>useful info about ZWrite</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:Modifier|Modifier]] &gt;&gt; FinalBlend (Package: Engine)}}

''What exactly does this class do except enabling alpha channels and creating UT1-style translucent textures?''

==Properties==
; bool AlphaTest : 
; byte AlphaRef : 
; EFrameBufferBlending FrameBufferBlending : The way the material should be modified. See EFrameBufferBlending enum below for details.
; bool TwoSided : Whether the material should be made two-sided.
; bool ZTest : 
; bool ZWrite : Setting this property to True can fix Z-order problems with complex [[Legacy:Shader|Shader]]s. For example a Shader that uses a texture with an [[Legacy:Alpha Channel|alpha channel]] a its Diffuse and Opacity and a [[Legacy:ConstantColor|ConstantColor]] as Specular might cause weird overdrawing effects on meshes. Instead of using the Opacity value, the Shader can be passed through a FinalBlend with ZWrite=True and FrameBufferBlending=FB_AlphaBlend for the same result without the Z-order problem.

===Inherited from [[Legacy:Modifier|Modifier]]===
; [[Legacy:Material|Material]] Material ([[Legacy:Editinline|editinline]]use) : The material to modify.

===Inherited from [[Legacy:Material|Material]]===
; [[Legacy:Material|Material]] FallbackMaterial : Material to use instead when this FinalBlend can't be displayed, e.g. because the material it modifies is too complex.

==Enums==

===EFrameBufferBlending===
; FB_Overwrite : 
; FB_Modulate : 
; FB_AlphaBlend : Activates the alpha channel of the material. This is useful when a texture was imported without enabling the ''Alpha'' option or when using a [[Legacy:Combiner|Combiner]] which can create a new alpha channel but never enables it.
; FB_AlphaModulate_MightNotFogCorrectly : 
; FB_Translucent : Creates a new alpha channel based on the material's brightness. Darker areas will be more translucent, brighter areas will be less translucent.
; FB_Darken : 
; FB_Brighten : 
; FB_Invisible : 

----

[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; Explain the other properties and blending modes and add a class description.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3257</id>
      <timestamp>2004-05-04T18:48:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:Modifier|Modifier]] &gt;&gt; FinalBlend (Package: Engine)}}

''What exactly does this class do except enabling alpha channels and creating UT1-style translucent textures?''

==Properties==
; bool AlphaTest : 
; byte AlphaRef : 
; EFrameBufferBlending FrameBufferBlending : The way the material should be modified. See EFrameBufferBlending enum below for details.
; bool TwoSided : Whether the material should be made two-sided.
; bool ZTest : 
; bool ZWrite : 

===Inherited from [[Legacy:Modifier|Modifier]]===
; [[Legacy:Material|Material]] Material ([[Legacy:Editinline|editinline]]use) : The material to modify.

===Inherited from [[Legacy:Material|Material]]===
; [[Legacy:Material|Material]] FallbackMaterial : Material to use instead when this FinalBlend can't be displayed, e.g. because the material it modifies is too complex.

==Enums==

===EFrameBufferBlending===
; FB_Overwrite : 
; FB_Modulate : 
; FB_AlphaBlend : Activates the alpha channel of the material. This is useful when a texture was imported without enabling the ''Alpha'' option or when using a [[Legacy:Combiner|Combiner]] which can create a new alpha channel but never enables it.
; FB_AlphaModulate_MightNotFogCorrectly : 
; FB_Translucent : Creates a new alpha channel based on the material's brightness. Darker areas will be more translucent, brighter areas will be less translucent.
; FB_Darken : 
; FB_Brighten : 
; FB_Invisible : 

----

[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; Explain the other properties and blending modes and add a class description.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fire And Forget Self-Guided Missile</title>
    <id>1289</id>
    <revision>
      <id>3293</id>
      <timestamp>2006-07-18T06:52:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This tutorial describes an implementation of self-guided missile.

==Note==

This is not a complete mutator. This example assumes that you should implement your own class (probably derived from RocketProj) and insert the code below in it. For details on how implement the complete mutator, see [[Legacy:Weapon Mutator Tutorial|Weapon Mutator Tutorial]] for example.

==What we will do==

We will implement a 'fire-and-forget' missile. Original UT2004 rocket launcher may fire with player-guided missile, i.e. player (bot or human) should select the target and 'point' to it with crosshair before launching the missile. Our missile will be self-guied - it will pick the target and adjust the trajectory without any player intervention.

==Implementation overview==

Our missile will 'think' at each game tick. This means that the logic and algorithms should be very fast. On the other side, we would like to get a quite 'intelligent' and physicaly realistic missile. To achieve this, we will guide with the following assumptions:

# Flying missile observes the semisphere in front of itself .
# Missile treats all targets as motionless and doesn't try to predict the target location in the near future.
# Missile should't adjust it's trajectory too much at once. For example, it shouldn't turn the direction with 90 (and even 10 or 5) degrees during one tick - it should do a few tens small adjustments with 0.5 degree each instead. This gives a smooth, arch-like and realistic resulting trajectory.

==Code and comments==

The following two new variables controls the behaviour of missile:

&lt;uscript&gt;
var float MaxAngleDelta;
&lt;/uscript&gt;

This is a maximum angle (in radians) to rotate the direction vector at each tick. For example, if V1 = Normal(Vector(Rotation)) at tick N and V2 = Normal(Vector(Rotation)) at tick N+1, then Acos(Normal(V1) Dot Normal(V2)) &lt;= MaxAngleDelta. Let's set it to 0.0015. This means that if missile speed is 1000 UUs/second and one game tick takes 0.01 second, it will require at least 104 ticks to turn the direction on 90 degrees. This is pleasantly smooth on my taste.

&lt;uscript&gt;
var float MaxTargetRadius;
&lt;/uscript&gt;

This is a 'radius of visibility' (in UUs) - our missile M will 'see' the target T if VSize(T.Location - M.Location) &lt;= MaxTargetRadius. Let's set it to 10000. On the most of maps, this means the distance 'from missile to the end of the world'. It's large, really.

&lt;b&gt;End of well-documented stuff&lt;/b&gt;

This is a function which observes the semi-sphere in front of the flying missile and picks the target which may be reached with the best probability.

&lt;uscript&gt;
simulated function Pawn PickTarget(float DeltaTime, out float OutDistance, out float OutAngle)
{
    local Pawn Candidate, ReachableTarget, UnreachableTarget;
    local vector direction, V;
    local float D, distance, angle;

    Candidate = None;
    ReachableTarget = None;
    UnreachableTarget = None;
    OutDistance = 0.0;
    OutAngle = 0.0;
    direction = Normal(Vector(Rotation));
    D = - (direction dot Location);

    foreach VisibleCollidingActors(class'Pawn', Candidate, MaxTargetRadius)
    {
       // Skip myself and dying pawns
       if ((Candidate == Instigator) || (Candidate.IsInState('Dying')))
          continue;

       // Skip teammates in team games
       if (Level.Game.bTeamGame &amp;&amp; (Instigator.GetTeamNum() == Candidate.GetTeamNum()))
          continue;

       if ((direction dot Candidate.Location + D) &gt; 0.0)
       {
          // Candidate is in front semisphere of the missile
          V = Candidate.Location - Location;
          distance = VSize(V);
          angle = Acos(direction dot Normal(V));
          if (((distance / Speed) / DeltaTime) * MaxAngleDelta &gt;= angle)
          {
             if ((ReachableTarget == None) || (distance &lt; OutDistance))
             {
                ReachableTarget = Candidate;
                OutDistance = distance;
                OutAngle = angle;
             }
          }
          else
          {  
             if ((UnreachableTarget == None) || (angle &lt; OutAngle))
             {  
                UnreachableTarget = Candidate;
                OutDistance = distance;
                OutAngle = angle;
             }
          }
       }
    }
    
    if (ReachableTarget != None)
       return ReachableTarget;
    return UnreachableTarget;
}
&lt;/uscript&gt;

This is a function which is called each game tick and adjusts the missile's trajectory in attempt to reach the picked target.

&lt;uscript&gt;
simulated function Tick(float DeltaTime)
{
    local Pawn Target;
    local float angle, distance, lambda;

    Target = PickTarget(DeltaTime, distance, angle);
    if ((Target == None) || (angle == 0.0))
       return;

    if (angle &lt;= MaxAngleDelta)
       Velocity = VSize(Velocity) * Normal(Target.Location - Location);
    else
    {
       lambda = MaxAngleDelta / (angle - MaxAngleDelta);
       Velocity = Normal(((Normal(Vector(Rotation)) * distance + Location) +
                lambda * Target.Location) * (1.0 / (1.0 + lambda)) - Location) * VSize(Velocity);
    }
    Speed = VSize(Velocity);
    SetRotation (rotator(Velocity));
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>3294</id>
      <timestamp>2006-07-13T13:59:56Z</timestamp>
      <contributor>
        <ip>Rtsoft2.corbina.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial describes an implementation of self-guided missile.

==Note==

This is not a complete mutator. This example assumes that you should implement your own class (probably derived from RocketProj) and insert the code below in it. For details on how implement the complete mutator, see [[Legacy:Weapon Mutator Tutorial|Weapon Mutator Tutorial]] for example.

==What we will do==

We will implement a 'fire-and-forget' missile. Original UT2004 rocket launcher may fire with player-guided missile, i.e. player (bot or human) should select the target and 'point' to it with crosshair before launching the missile. Our missile will be self-guied - it will pick the target and adjust the trajectory without any player intervention.

==Implementation overview==

Our missile will 'think' at each game tick. This means that the logic and algorithms should be very fast. On the other side, we would like to get a quite 'intelligent' and physicaly realistic missile. To achieve this, we will guide with the following assumptions:

# Flying missile observes the semisphere in front of itself .
# Missile treats all targets as motionless and doesn't try to predict the target location in the near future.
# Missile should't adjust it's trajectory too much at once. For example, it shouldn't turn the direction with 90 (and even 10 or 5) degrees during one tick - it should do a few tens small adjustments with 0.5 degree each instead. This gives a smooth, arch-like and realistic resulting trajectory.

==Code and comments==

The following two new variables controls the behaviour of missile:

&lt;uscript&gt;
var float MaxAngleDelta;
&lt;/uscript&gt;

This is a maximum angle (in radians) to rotate the direction vector at each tick. For example, if V1 = Normal(Vector(Rotation)) at tick N and V2 = Normal(Vector(Rotation)) at tick N+1, then Acos(Normal(V1) Dot Normal(V2)) &lt;= MaxAngleDelta. Let's set it to 0.0015. This means that if missile speed is 1000 UUs/second and one game tick takes 0.01 second, it will require at least 104 ticks to turn the direction on 90 degrees. This is pleasantly smooth on my taste.

&lt;uscript&gt;
var float MaxTargetRadius;
&lt;/uscript&gt;

This is a 'radius of visibility' (in UUs) - our missile M will 'see' the target T if VSize(T.Location - M.Location) &lt;= MaxTargetRadius. Let's set it to 10000. On the most of maps, this means the distance 'from missile to the end of the world'. It's large, really.

&lt;b&gt;End of well-documented stuff&lt;/b&gt;

This is a function which observes the semi-sphere in front of the flying missile and picks the target which may be reached with the best probability.

&lt;uscript&gt;
simulated function Pawn PickTarget(float DeltaTime, out float OutDistance, out float OutAngle)
{
    local Pawn Candidate, ReachableTarget, UnreachableTarget;
    local vector direction, V;
    local float D, distance, angle;

    Candidate = None;
    ReachableTarget = None;
    UnreachableTarget = None;
    OutDistance = 0.0;
    OutAngle = 0.0;
    direction = Normal(Vector(Rotation));
    D = - (direction dot Location);

    foreach VisibleCollidingActors(class'Pawn', Candidate, MaxTargetRadius)
    {
       // Skip myself and dying pawns
       if ((Candidate == Instigator) || (Candidate.IsInState('Dying')))
          continue;

       // Skip teammates in team games
       if (Level.Game.bTeamGame &amp;&amp; (Instigator.GetTeamNum() == Candidate.GetTeamNum()))
          continue;

       if ((direction dot Candidate.Location + D) &gt; 0.0)
       {
          // Candidate is in front semisphere of the missile
          V = Candidate.Location - Location;
          distance = VSize(V);
          angle = Acos(direction dot Normal(V));
          if (((distance / Speed) / DeltaTime) * MaxAngleDelta &gt;= angle)
          {
             if ((ReachableTarget == None) || (distance &lt; OutDistance))
             {
                ReachableTarget = Candidate;
                OutDistance = distance;
                OutAngle = angle;
             }
          }
          else
          {  
             if ((UnreachableTarget == None) || (angle &lt; OutAngle))
             {  
                UnreachableTarget = Candidate;
                OutDistance = distance;
                OutAngle = angle;
             }
          }
       }
    }
    
    if (ReachableTarget != None)
       return ReachableTarget;
    return UnreachableTarget;
}
&lt;/uscript&gt;

This is a function which is called each game tick and adjusts the missile's trajectory in attempt to reach the picked target.

&lt;uscript&gt;
simulated function Tick(float DeltaTime)
{
    local Pawn Target;
    local float angle, distance, lambda;

    Target = PickTarget(DeltaTime, distance, angle);
    if ((Target == None) || (angle == 0.0))
       return;

    if (angle &lt;= MaxAngleDelta)
       Velocity = VSize(Velocity) * Normal(Target.Location - Location);
    else
    {
       lambda = MaxAngleDelta / (angle - MaxAngleDelta);
       Velocity = Normal(((Normal(Vector(Rotation)) * distance + Location) +
                lambda * Target.Location) * (1.0 / (1.0 + lambda)) - Location) * VSize(Velocity);
    }
    Speed = VSize(Velocity);
    SetRotation (rotator(Velocity));
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>3295</id>
      <timestamp>2006-07-18T04:50:10Z</timestamp>
      <contributor>
        <ip>59.16.104.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.dirare.com'&gt;yellow pages main&lt;/a&gt; : [http://www.dirare.com business yellowpages] - [HTTP://www.dirare.com business yellowpages] : [international directory|http://www.dirare.com] - [international directory|HTTP://www.dirare.com] : http://www.dirare.com/India/ : [[http://www.dirare.com companies of the world]] : [[http://www.dirare.com | YP national]] : &quot;global directory&quot; http://www.dirare.com : [http://www.dirare.com|online directory] &lt;/u&gt;This tutorial describes an implementation of self-guided missile.

==Note==

This is not a complete mutator. This example assumes that you should implement your own class (probably derived from RocketProj) and insert the code below in it. For details on how implement the complete mutator, see [[Legacy:Weapon Mutator Tutorial|Weapon Mutator Tutorial]] for example.

==What we will do==

We will implement a 'fire-and-forget' missile. Original UT2004 rocket launcher may fire with player-guided missile, i.e. player (bot or human) should select the target and 'point' to it with crosshair before launching the missile. Our missile will be self-guied - it will pick the target and adjust the trajectory without any player intervention.

==Implementation overview==

Our missile will 'think' at each game tick. This means that the logic and algorithms should be very fast. On the other side, we would like to get a quite 'intelligent' and physicaly realistic missile. To achieve this, we will guide with the following assumptions:

# Flying missile observes the semisphere in front of itself .
# Missile treats all targets as motionless and doesn't try to predict the target location in the near future.
# Missile should't adjust it's trajectory too much at once. For example, it shouldn't turn the direction with 90 (and even 10 or 5) degrees during one tick - it should do a few tens small adjustments with 0.5 degree each instead. This gives a smooth, arch-like and realistic resulting trajectory.

==Code and comments==

The following two new variables controls the behaviour of missile:

&lt;uscript&gt;
var float MaxAngleDelta;
&lt;/uscript&gt;

This is a maximum angle (in radians) to rotate the direction vector at each tick. For example, if V1 = Normal(Vector(Rotation)) at tick N and V2 = Normal(Vector(Rotation)) at tick N+1, then Acos(Normal(V1) Dot Normal(V2)) &lt;= MaxAngleDelta. Let's set it to 0.0015. This means that if missile speed is 1000 UUs/second and one game tick takes 0.01 second, it will require at least 104 ticks to turn the direction on 90 degrees. This is pleasantly smooth on my taste.

&lt;uscript&gt;
var float MaxTargetRadius;
&lt;/uscript&gt;

This is a 'radius of visibility' (in UUs) - our missile M will 'see' the target T if VSize(T.Location - M.Location) &lt;= MaxTargetRadius. Let's set it to 10000. On the most of maps, this means the distance 'from missile to the end of the world'. It's large, really.

&lt;b&gt;End of well-documented stuff&lt;/b&gt;

This is a function which observes the semi-sphere in front of the flying missile and picks the target which may be reached with the best probability.

&lt;uscript&gt;
simulated function Pawn PickTarget(float DeltaTime, out float OutDistance, out float OutAngle)
{
    local Pawn Candidate, ReachableTarget, UnreachableTarget;
    local vector direction, V;
    local float D, distance, angle;

    Candidate = None;
    ReachableTarget = None;
    UnreachableTarget = None;
    OutDistance = 0.0;
    OutAngle = 0.0;
    direction = Normal(Vector(Rotation));
    D = - (direction dot Location);

    foreach VisibleCollidingActors(class'Pawn', Candidate, MaxTargetRadius)
    {
       // Skip myself and dying pawns
       if ((Candidate == Instigator) || (Candidate.IsInState('Dying')))
          continue;

       // Skip teammates in team games
       if (Level.Game.bTeamGame &amp;&amp; (Instigator.GetTeamNum() == Candidate.GetTeamNum()))
          continue;

       if ((direction dot Candidate.Location + D) &gt; 0.0)
       {
          // Candidate is in front semisphere of the missile
          V = Candidate.Location - Location;
          distance = VSize(V);
          angle = Acos(direction dot Normal(V));
          if (((distance / Speed) / DeltaTime) * MaxAngleDelta &gt;= angle)
          {
             if ((ReachableTarget == None) || (distance &lt; OutDistance))
             {
                ReachableTarget = Candidate;
                OutDistance = distance;
                OutAngle = angle;
             }
          }
          else
          {  
             if ((UnreachableTarget == None) || (angle &lt; OutAngle))
             {  
                UnreachableTarget = Candidate;
                OutDistance = distance;
                OutAngle = angle;
             }
          }
       }
    }
    
    if (ReachableTarget != None)
       return ReachableTarget;
    return UnreachableTarget;
}
&lt;/uscript&gt;

This is a function which is called each game tick and adjusts the missile's trajectory in attempt to reach the picked target.

&lt;uscript&gt;
simulated function Tick(float DeltaTime)
{
    local Pawn Target;
    local float angle, distance, lambda;

    Target = PickTarget(DeltaTime, distance, angle);
    if ((Target == None) || (angle == 0.0))
       return;

    if (angle &lt;= MaxAngleDelta)
       Velocity = VSize(Velocity) * Normal(Target.Location - Location);
    else
    {
       lambda = MaxAngleDelta / (angle - MaxAngleDelta);
       Velocity = Normal(((Normal(Vector(Rotation)) * distance + Location) +
                lambda * Target.Location) * (1.0 / (1.0 + lambda)) - Location) * VSize(Velocity);
    }
    Speed = VSize(Velocity);
    SetRotation (rotator(Velocity));
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FireFly</title>
    <id>1222</id>
    <revision>
      <id>3158</id>
      <timestamp>2007-11-19T14:05:27Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; ???}}

''FireFly'' is a new scripted creature resembling a firefly flying around in random circles.

More information and download:  [http://www.planetunreal.com/slick/v2_custom_scripts.htm Slick Willy's Custom Scripts]

Created by [[Legacy:SlickWilly|SlickWilly]].

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

[[Category:Legacy Dead Links|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3159</id>
      <timestamp>2003-06-20T11:12:32Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>The link worked for me. Since there's no real content on this page, perhaps we could move the link somewhere where it is relevant, instead of having a &quot;wikiquickie&quot; here?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; ???}}

''FireFly'' is a new scripted creature resembling a firefly flying around in random circles.

More information and download:  [http://www.planetunreal.com/slick/v2_custom_scripts.htm Slick Willy's Custom Scripts]

Created by [[Legacy:SlickWilly|SlickWilly]].

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FireProperties</title>
    <id>28374</id>
    <revision>
      <id>40043</id>
      <timestamp>2009-11-15T08:03:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FireSkaarj</title>
    <id>28343</id>
    <revision>
      <id>40010</id>
      <timestamp>2009-11-14T20:16:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FireTexture</title>
    <id>1235</id>
    <revision>
      <id>3187</id>
      <timestamp>2005-01-17T22:33:23Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; FireTexture (Package: Fire)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; FireTexture (Package: Fire)}}

Can render fire, lightning and other effects.

==Properties ==

===FirePaint ===

All '''FX_''' parameters are applied only to new sparks when drawing them in the editor. All other parameters take effect instantly. The FX parameters have different effects based on the type of spark selected. See ''ESpark enum'' below.
; bool bRising :  Whether &quot;flames&quot; should move upwards.
; DMode DrawMode :  
; byte FX_Area :  
; byte FX_AuxSize :  An additional size parameter for the effect.
; byte FX_Frequency :  
; byte FX_Heat :  Brightness of the individual spark.
; byte FX_HorizSpeed :  Horizontal speed of the effect. (128 = no horizontal movement)
; byte FX_Phase :  
; byte FX_Size :  The size of the effect.
; byte FX_VertSpeed :  Vertical speed of the effect. (128 = no vertical movement)
; byte RenderHeat :  The overall intensity.
; int SparksLimit :  The maximum number of sparks allowed to be displayed. Both the permanent (drawn in the editor) and the transient (created when animating the texture) sparks are counted here. Lowering this number can improve performance, while a higher number allows more complex effects.
; ESpark SparkType :  The type of spark to draw in the editor.

===UnrealScript-Only Properties ===
; int NumSparks : 
; byte OldRenderHeat (transient) :  
; byte PenDownX (transient) :  
; byte PenDownY (transient) :  
; byte RenderTable[1028] (transient) :  
; array&lt;Spark&gt; Sparks (transient) :  
; byte StarStatus (transient) :  

==Enums ==

===ESpark ===
; SPARK_Burn : Simple, nonmoving sparks of random intensity. Looks best with ''bRising'' set to ''True''.
; SPARK_Sparkle : Sparks with random positional jitter over an area of horizontal size ''FX_Size'', vertical size ''FX_AuxSize'', with intensity ''FX_Heat''.
; SPARK_Pulse : Great for pulse-trains, ''FX_Frequency'' sets the time frequency, and ''FX_Phase'' is the spatial frequency: 0=pulsed fire, use higher values for moving trains of sparks.&lt;br /&gt;The shieldbelt effect uses this kind of spark.
; SPARK_Signal : Like ''SPARK_Burn'', but this has several options to customize the graininess, brightness and intensity distribution to any desired output, providing a versatile base fire effect.&lt;br /&gt;''FX_Frequency'' sets the average pattern frequency, ''FX_Heat'' determines the ratio of bright patches to dark ones, i.e. a medium setting increases the contrast of the overall effect.
; SPARK_Blaze : Emits sparks in all directions.
; SPARK_OzHasSpoken : Simple up-moving, fading-out sparks.
; SPARK_Cone : Like ''SPARK_Blaze'', but with gravity acting on the sparks. A nice sparse effect to put at the center of complex ramped lighting bolt scenes, for example.
; SPARK_BlazeRight&lt;br /&gt;SPARK_BlazeLeft : Simple eruptions to the right and left, falling down.
; SPARK_Cylinder : Sparks moving in horizontal, 'cylindrical' orbits, with angular velocity ''FX_HorizSpeed''. ''FX_Heat'' determines the minimum intensity, which always varies along a spark's orbit - this means that a low ''FX_Heat'' setting gives a collection of sparks a 3d-appearance, as if the 'backfacing' sparks are removed. ''FX_Size'' sets the amplitude of the orbits.&lt;br /&gt;''DrawMode'' influences the ''FX_Size'' dynamically; when set to any of the 'Lathe' options, as long as you keep the mouse button pressed while drawing, all sparks will be aligned around an invisible vertical axis so it's as if you're using a lathe. Lathe_2, _3 and _4 draw multiple sparks at regular spacings around the cylinder, instead of just one.&lt;br /&gt;The way the initial position of sparks wind around the cylinder as you draw is influenced by ''FX_Frequency''.
; SPARK_Cylinder3D : Like ''SPARK_Cylinder'', but this type makes all the 'backfaced' sparks disappear completely.
; SPARK_Lissajous : ''FX_Size'' determines the amplitude of the orbits, at ''FX_Frequency''.&lt;br /&gt;''FX_HorizSpeed'' and ''FX_VertSpeed'' determine the horizontal and vertical frequencies independently. Like SPARK_Cylinder, individual spark intensity depends on the phase of the horizontal movement and this is always offset by ''FX_Heat''.
; SPARK_Jugglers : ''FX_Size'' sets the amplitude of these, moving on a simple vertical sine wave pattern at ''FX_Frequency''. As with ''SPARK_Cylinder'', the 'back-facing' effect depends on the ''FX_Heat'' setting.
; SPARK_Emit : Moving in the directions set by ''FX_HorizSpeed'' and ''FX_VertSpeed'', these glow out as they progress over straight trajectories of determined by both ''FX_Size'' and the initial heat ''FX_Heat''.&lt;br /&gt;With the speeds set to extremes (0, 128, 255) the trajectories become clean straight lines.
; SPARK_Fountain : Like SPARK_Emit, but the sparks have gravity acting on them. A great effect for stuff like streaming lava, steam or water. Setting initial speeds to zero (128, 128) makes the sparks oozing down.
; SPARK_Flocks : A random moving flock of sparks drawn at ''FX_Heat'', jittering in circular orbits of size ''FX_Area'', with ''FX_Size'' being the lifetime of individual sparks.
; SPARK_Eels : Random cloud of straight moving sparks drawn at ''FX_Heat'' with lifetime ''FX_Size''.
; SPARK_Organic : Fast moving sparks going upward at V-shaped angles.
; SPARK_WanderOrganic : Wandering Organic sparks.
; SPARK_RandomCloud : A wandering cloud of double-speed upward moving sparks.
; SPARK_CustomCloud : Completely customizable clouds using ''FX_HorizSpeed'' and ''FX_VertSpeed''. While moving, sparks glow up to the maximum brightness and then disappear. ''FX_Area'' determines the spark's lifetime by setting their initial brightness. A high ''FX_Area'' value makes sparks start at a lower heat so they take longer to reach full heat. Set the speeds at or around zero (128, 128) to create a nice sparkly effect.
; SPARK_LocalCloud : Like SPARK_CustomCloud, but the spawning points of these are random within an ''FX_Area'' sized square, the upper left corner of which is the mouse position where you draw the effect.
; SPARK_Stars : Unlike any other sparks, this one doesn't get washed out by the fire algorithm, but consists of single pixels of brightness ''FX_Heat'', which get obscured by any fire passing across it, unless the flames have a very low intensity.
; SPARK_LineLightning : Click, stretch out the lightning to the desired end location, and release it. A low setting of ''FX_Frequency'' gives continuous lightning bolts, while a high setting makes it flash more intermittently. Most lightning looks coolest when it's kind of sparse, achieve this by either adjusting the ''RenderHeat'' or setting a higher ''FX_Frequency''.
; SPARK_RampLightning : Like ''SPARK_LineLightning'', but with intensity diminishing towards the endpoint of the bolt.
; SPARK_SphereLightning : Spherically symmetrical lightning, with diameter ''FX_Size''. Sparse by default, to get more coverage put a few of them on top of each other.
; SPARK_Wheel : Sparks move outward in circular orbits the size of which is determined by ''FX_Area'', over a path of length ''FX_Size''. They are emitted at an initial angle ''FX_Phase'', ''FX_Frequency'' sets the rotation speed.
; SPARK_Gametes : Random cloud of straight moving sparks drawn at ''FX_Heat'' with lifetime ''FX_Size''.
; SPARK_Sprinkler : Spawns upward wavy streams, ''FX_Frequency'' determines the speed at which the initial angle changes. ''FX_Phase'' controls the relative phase. On a low ''FX_Heat'' setting, a few of these can be combined together or with other effects to design smoky whirls.

===DMode ===
; DRAW_Normal : 
; DRAW_Lathe : 
; DRAW_Lathe_2 : 
; DRAW_Lathe_3 : 
; DRAW_Lathe_4 : 

==Structs ==

===Spark ===

Information about a single spark. (Used internally.)

&lt;uscript&gt;
struct Spark
{
    var ESpark Type;   // Spark type.
    var byte   Heat;   // Spark heat.
    var byte   X;      // Spark X location (0 - Xdimension-1).
    var byte   Y;      // Spark Y location (0 - Ydimension-1).

    var byte   ByteA;  // X-speed.
    var byte   ByteB;  // Y-speed.
    var byte   ByteC;  // Age, Emitter freq.
    var byte   ByteD;  // Exp.Time.
};
&lt;/uscript&gt;

==Discussion ==

'''Draconx:''' I'd love to see a description on how the Lathe modes work, I've seen images of cool looking fire textures supposedly done using the lathe modes, yet no actual explanation to their use.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3188</id>
      <timestamp>2003-05-23T07:31:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; FireTexture (Package: Fire)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; FireTexture (Package: Fire)}}

Can render fire, lightning and other effects.

==Properties ==

===FirePaint ===

All '''FX_''' parameters are applied only to new sparks when drawing them in the editor. All other parameters take effect instantly. The FX parameters have different effects based on the type of spark selected. See ''ESpark enum'' below.
; bool bRising :  Whether &quot;flames&quot; should move upwards.
; DMode DrawMode :  
; byte FX_Area :  
; byte FX_AuxSize :  An additional size parameter for the effect.
; byte FX_Frequency :  
; byte FX_Heat :  Brightness of the individual spark.
; byte FX_HorizSpeed :  Horizontal speed of the effect. (128 = no horizontal movement)
; byte FX_Phase :  
; byte FX_Size :  The size of the effect.
; byte FX_VertSpeed :  Vertical speed of the effect. (128 = no vertical movement)
; byte RenderHeat :  The overall intensity.
; int SparksLimit :  The maximum number of sparks allowed to be displayed. Both the permanent (drawn in the editor) and the transient (created when animating the texture) sparks are counted here. Lowering this number can improve performance, while a higher number allows more complex effects.
; ESpark SparkType :  The type of spark to draw in the editor.

===UnrealScript-Only Properties ===
; int NumSparks : 
; byte OldRenderHeat (transient) :  
; byte PenDownX (transient) :  
; byte PenDownY (transient) :  
; byte RenderTable[1028] (transient) :  
; array&lt;Spark&gt; Sparks (transient) :  
; byte StarStatus (transient) :  

==Enums ==

===ESpark ===
; SPARK_Burn : Simple, nonmoving sparks of random intensity. Looks best with ''bRising'' set to ''True''.
; SPARK_Sparkle : Sparks with random positional jitter over an area of horizontal size ''FX_Size'', vertical size ''FX_AuxSize'', with intensity ''FX_Heat''.
; SPARK_Pulse : Great for pulse-trains, ''FX_Frequency'' sets the time frequency, and ''FX_Phase'' is the spatial frequency: 0=pulsed fire, use higher values for moving trains of sparks.&lt;br /&gt;The shieldbelt effect uses this kind of spark.
; SPARK_Signal : Like ''SPARK_Burn'', but this has several options to customize the graininess, brightness and intensity distribution to any desired output, providing a versatile base fire effect.&lt;br /&gt;''FX_Frequency'' sets the average pattern frequency, ''FX_Heat'' determines the ratio of bright patches to dark ones, i.e. a medium setting increases the contrast of the overall effect.
; SPARK_Blaze : Emits sparks in all directions.
; SPARK_OzHasSpoken : Simple up-moving, fading-out sparks.
; SPARK_Cone : Like ''SPARK_Blaze'', but with gravity acting on the sparks. A nice sparse effect to put at the center of complex ramped lighting bolt scenes, for example.
; SPARK_BlazeRight&lt;br /&gt;SPARK_BlazeLeft : Simple eruptions to the right and left, falling down.
; SPARK_Cylinder : Sparks moving in horizontal, 'cylindrical' orbits, with angular velocity ''FX_HorizSpeed''. ''FX_Heat'' determines the minimum intensity, which always varies along a spark's orbit - this means that a low ''FX_Heat'' setting gives a collection of sparks a 3d-appearance, as if the 'backfacing' sparks are removed. ''FX_Size'' sets the amplitude of the orbits.&lt;br /&gt;''DrawMode'' influences the ''FX_Size'' dynamically; when set to any of the 'Lathe' options, as long as you keep the mouse button pressed while drawing, all sparks will be aligned around an invisible vertical axis so it's as if you're using a lathe. Lathe_2, _3 and _4 draw multiple sparks at regular spacings around the cylinder, instead of just one.&lt;br /&gt;The way the initial position of sparks wind around the cylinder as you draw is influenced by ''FX_Frequency''.
; SPARK_Cylinder3D : Like ''SPARK_Cylinder'', but this type makes all the 'backfaced' sparks disappear completely.
; SPARK_Lissajous : ''FX_Size'' determines the amplitude of the orbits, at ''FX_Frequency''.&lt;br /&gt;''FX_HorizSpeed'' and ''FX_VertSpeed'' determine the horizontal and vertical frequencies independently. Like SPARK_Cylinder, individual spark intensity depends on the phase of the horizontal movement and this is always offset by ''FX_Heat''.
; SPARK_Jugglers : ''FX_Size'' sets the amplitude of these, moving on a simple vertical sine wave pattern at ''FX_Frequency''. As with ''SPARK_Cylinder'', the 'back-facing' effect depends on the ''FX_Heat'' setting.
; SPARK_Emit : Moving in the directions set by ''FX_HorizSpeed'' and ''FX_VertSpeed'', these glow out as they progress over straight trajectories of determined by both ''FX_Size'' and the initial heat ''FX_Heat''.&lt;br /&gt;With the speeds set to extremes (0, 128, 255) the trajectories become clean straight lines.
; SPARK_Fountain : Like SPARK_Emit, but the sparks have gravity acting on them. A great effect for stuff like streaming lava, steam or water. Setting initial speeds to zero (128, 128) makes the sparks oozing down.
; SPARK_Flocks : A random moving flock of sparks drawn at ''FX_Heat'', jittering in circular orbits of size ''FX_Area'', with ''FX_Size'' being the lifetime of individual sparks.
; SPARK_Eels : Random cloud of straight moving sparks drawn at ''FX_Heat'' with lifetime ''FX_Size''.
; SPARK_Organic : Fast moving sparks going upward at V-shaped angles.
; SPARK_WanderOrganic : Wandering Organic sparks.
; SPARK_RandomCloud : A wandering cloud of double-speed upward moving sparks.
; SPARK_CustomCloud : Completely customizable clouds using ''FX_HorizSpeed'' and ''FX_VertSpeed''. While moving, sparks glow up to the maximum brightness and then disappear. ''FX_Area'' determines the spark's lifetime by setting their initial brightness. A high ''FX_Area'' value makes sparks start at a lower heat so they take longer to reach full heat. Set the speeds at or around zero (128, 128) to create a nice sparkly effect.
; SPARK_LocalCloud : Like SPARK_CustomCloud, but the spawning points of these are random within an ''FX_Area'' sized square, the upper left corner of which is the mouse position where you draw the effect.
; SPARK_Stars : Unlike any other sparks, this one doesn't get washed out by the fire algorithm, but consists of single pixels of brightness ''FX_Heat'', which get obscured by any fire passing across it, unless the flames have a very low intensity.
; SPARK_LineLightning : Click, stretch out the lightning to the desired end location, and release it. A low setting of ''FX_Frequency'' gives continuous lightning bolts, while a high setting makes it flash more intermittently. Most lightning looks coolest when it's kind of sparse, achieve this by either adjusting the ''RenderHeat'' or setting a higher ''FX_Frequency''.
; SPARK_RampLightning : Like ''SPARK_LineLightning'', but with intensity diminishing towards the endpoint of the bolt.
; SPARK_SphereLightning : Spherically symmetrical lightning, with diameter ''FX_Size''. Sparse by default, to get more coverage put a few of them on top of each other.
; SPARK_Wheel : Sparks move outward in circular orbits the size of which is determined by ''FX_Area'', over a path of length ''FX_Size''. They are emitted at an initial angle ''FX_Phase'', ''FX_Frequency'' sets the rotation speed.
; SPARK_Gametes : Random cloud of straight moving sparks drawn at ''FX_Heat'' with lifetime ''FX_Size''.
; SPARK_Sprinkler : Spawns upward wavy streams, ''FX_Frequency'' determines the speed at which the initial angle changes. ''FX_Phase'' controls the relative phase. On a low ''FX_Heat'' setting, a few of these can be combined together or with other effects to design smoky whirls.

===DMode ===
; DRAW_Normal : 
; DRAW_Lathe : 
; DRAW_Lathe_2 : 
; DRAW_Lathe_3 : 
; DRAW_Lathe_4 : 

==Structs ==

===Spark ===

Information about a single spark. (Used internally.)

&lt;uscript&gt;
struct Spark
{
    var ESpark Type;   // Spark type.
    var byte   Heat;   // Spark heat.
    var byte   X;      // Spark X location (0 - Xdimension-1).
    var byte   Y;      // Spark Y location (0 - Ydimension-1).

    var byte   ByteA;  // X-speed.
    var byte   ByteB;  // Y-speed.
    var byte   ByteC;  // Age, Emitter freq.
    var byte   ByteD;  // Exp.Time.
};
&lt;/uscript&gt;

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Firing InstantFire Weapons</title>
    <id>1250</id>
    <revision>
      <id>3223</id>
      <timestamp>2006-01-23T01:50:21Z</timestamp>
      <contributor>
        <ip>CanadEHn</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: InstantFire Weapons.

I will try to make a path through the many calls of shooting a instant hit weapon. More specifically, a Shock Beam Rifle.

In UT2003 the Instant hit weapons are [[Legacy:AssaultRifle|AssaultRifle]], [[Legacy:Minigun|Minigun]], [[Legacy:ShockRifle|ShockRifle]], and the [[Legacy:SniperRifle|SniperRifle]]. An instant hit weapon is the one that have no projectiles and you cannot dodge its shots once they were fired.

Here is the continuation of the function call chain:

'''[[Legacy:InstantFire|InstantFire]].DoFireEffect()'''
* Finds out where the start of the hit trace will be; 
* Calls DoTrace;

'''[[Legacy:InstantFire|InstantFire]].DoTrace(StartTrace, R)'''
* This function tells where we hit;
* Take care of the beam reflection;
* Applies damage 
* Call the creation of the visual effects;

'''[[Legacy:ShockBeamFire|ShockBeamFire]].SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum)'''
* This one creates the visual effects in this line: 

&lt;uscript&gt;
Beam = Spawn(BeamEffectClass,,, Start, Dir);
&lt;/uscript&gt;
* Set where is the destination of the beam with

&lt;uscript&gt;
Beam.AimAt(HitLocation, HitNormal);
&lt;/uscript&gt;

'''[[Legacy:ShockBeamEffect|ShockBeamEffect]].AimAt(HitLocation, HitNormal);
* Define where your beam is going (the mSpawnVecA vector is the hit location)
* Create the effects in the hit location with the SpawnEffects function.

'''[[Legacy:ShockBeamEffect|ShockBeamEffect]].SpawnEffects()

Here is where the effects are created. For the ShockRifle, these are the effect classes:

Effects spawned in the hit location:

[[Legacy:ShockImpactFlare|ShockImpactFlare]], [[Legacy:ShockImpactRing|ShockImpactRing]], [[Legacy:ShockImpactScorch|ShockImpactScorch]], [[Legacy:ShockExplosionCore|ShockExplosionCore]]

And this is the beam itself:

[[Legacy:ShockBeamCoil|ShockBeamCoil]]

==Flowchart==

http://webpages.charter.net/bmschkerke/Images/UT2K3/ProjectileFireFlow.jpg

==Comments==

'''Tarquin:''' The flow chart is a great idea, but now I've looked at it closely, I see that it is mostly linear &amp;ndash; it looks more complex than it is because of the way some lines turn corners so it can all fit in the image. I think it might be an idea to try &amp; make this in text with nested lists.

'''Bananna_Manuk:''' Hi i`m totally new to unreal script but i think more flow charts like this one really help get a grip whats going on.. some times a page full of text is a little daunting to some body such as myself still trying to get to grips with the basics ... Great job really helped

'''OlympusMons:''' I agree flow charts for me are alot easier to follow. Ive actually had to try and write some out so its easier for me to learn how all the unreal script classes interact, not an easy task. I hope some of you pro's might be able to lend a hand here. I can help a little myself but I'll be learning as we go. Mind you I have done databases in access and particle flows in max 6 so I know a bit about flowcharts.

'''T1:''' I see a mistake but I'm not quite sure how to reword it.... anyway, ShockBeamCoil is NOT the shock rifle's beam. ShockBeamCoil is that ribbonlike thing that twists around the beam on higher detail levels. ShockBeamEffect is the actual beam, and it additionally spawns the hit fx and the coil. Also the title of this page should be Firing_InstantFire_Weapons(UT2003), because it doesn't apply to UT2004 and definitely not UT99.

'''OlympusMons:''' Maybe we can come up with two more flowcharts to add to this ut2k4, ut99. Ive noticed there are calls for a weapon tutorials for ut99 and Im sure ut2k4, this would probably be helpful to anyone trying to make tutorials or weapons. :P

'''RegularX:''' Thankfully there are few things as complicated as firing a weapon.  Which seems odd for an FPS, but there you go.

'''CanadEHn:''' Would it be possible to spawn multiple beams in different directions, at the same time? I have made a firing class that shoots a beam in a random direction, but I cannot find out how to spawn multiple beams at once, all in random directions.</text>
    </revision>
    <revision>
      <id>3224</id>
      <timestamp>2004-12-30T16:36:45Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: InstantFire Weapons.

I will try to make a path through the many calls of shooting a instant hit weapon. More specifically, a Shock Beam Rifle.

In UT2003 the Instant hit weapons are [[Legacy:AssaultRifle|AssaultRifle]], [[Legacy:Minigun|Minigun]], [[Legacy:ShockRifle|ShockRifle]], and the [[Legacy:SniperRifle|SniperRifle]]. An instant hit weapon is the one that have no projectiles and you cannot dodge its shots once they were fired.

Here is the continuation of the function call chain:

'''[[Legacy:InstantFire|InstantFire]].DoFireEffect()'''
* Finds out where the start of the hit trace will be; 
* Calls DoTrace;

'''[[Legacy:InstantFire|InstantFire]].DoTrace(StartTrace, R)'''
* This function tells where we hit;
* Take care of the beam reflection;
* Applies damage 
* Call the creation of the visual effects;

'''[[Legacy:ShockBeamFire|ShockBeamFire]].SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum)'''
* This one creates the visual effects in this line: 

&lt;uscript&gt;
Beam = Spawn(BeamEffectClass,,, Start, Dir);
&lt;/uscript&gt;
* Set where is the destination of the beam with

&lt;uscript&gt;
Beam.AimAt(HitLocation, HitNormal);
&lt;/uscript&gt;

'''[[Legacy:ShockBeamEffect|ShockBeamEffect]].AimAt(HitLocation, HitNormal);
* Define where your beam is going (the mSpawnVecA vector is the hit location)
* Create the effects in the hit location with the SpawnEffects function.

'''[[Legacy:ShockBeamEffect|ShockBeamEffect]].SpawnEffects()

Here is where the effects are created. For the ShockRifle, these are the effect classes:

Effects spawned in the hit location:

[[Legacy:ShockImpactFlare|ShockImpactFlare]], [[Legacy:ShockImpactRing|ShockImpactRing]], [[Legacy:ShockImpactScorch|ShockImpactScorch]], [[Legacy:ShockExplosionCore|ShockExplosionCore]]

And this is the beam itself:

[[Legacy:ShockBeamCoil|ShockBeamCoil]]

==Flowchart==

http://webpages.charter.net/bmschkerke/Images/UT2K3/ProjectileFireFlow.jpg

==Comments==

'''Tarquin:''' The flow chart is a great idea, but now I've looked at it closely, I see that it is mostly linear &amp;ndash; it looks more complex than it is because of the way some lines turn corners so it can all fit in the image. I think it might be an idea to try &amp; make this in text with nested lists.

'''Bananna_Manuk:''' Hi i`m totally new to unreal script but i think more flow charts like this one really help get a grip whats going on.. some times a page full of text is a little daunting to some body such as myself still trying to get to grips with the basics ... Great job really helped

'''OlympusMons:''' I agree flow charts for me are alot easier to follow. Ive actually had to try and write some out so its easier for me to learn how all the unreal script classes interact, not an easy task. I hope some of you pro's might be able to lend a hand here. I can help a little myself but I'll be learning as we go. Mind you I have done databases in access and particle flows in max 6 so I know a bit about flowcharts.

'''T1:''' I see a mistake but I'm not quite sure how to reword it.... anyway, ShockBeamCoil is NOT the shock rifle's beam. ShockBeamCoil is that ribbonlike thing that twists around the beam on higher detail levels. ShockBeamEffect is the actual beam, and it additionally spawns the hit fx and the coil. Also the title of this page should be Firing_InstantFire_Weapons(UT2003), because it doesn't apply to UT2004 and definitely not UT99.

'''OlympusMons:''' Maybe we can come up with two more flowcharts to add to this ut2k4, ut99. Ive noticed there are calls for a weapon tutorials for ut99 and Im sure ut2k4, this would probably be helpful to anyone trying to make tutorials or weapons. :P

'''RegularX:''' Thankfully there are few things as complicated as firing a weapon.  Which seems odd for an FPS, but there you go.</text>
    </revision>
    <revision>
      <id>3225</id>
      <timestamp>2006-01-23T01:45:54Z</timestamp>
      <contributor>
        <ip>CanadEHn</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: InstantFire Weapons.

I will try to make a path through the many calls of shooting a instant hit weapon. More specifically, a Shock Beam Rifle.

In UT2003 the Instant hit weapons are [[Legacy:AssaultRifle|AssaultRifle]], [[Legacy:Minigun|Minigun]], [[Legacy:ShockRifle|ShockRifle]], and the [[Legacy:SniperRifle|SniperRifle]]. An instant hit weapon is the one that have no projectiles and you cannot dodge its shots once they were fired.

Here is the continuation of the function call chain:

'''[[Legacy:InstantFire|InstantFire]].DoFireEffect()'''
* Finds out where the start of the hit trace will be; 
* Calls DoTrace;

'''[[Legacy:InstantFire|InstantFire]].DoTrace(StartTrace, R)'''
* This function tells where we hit;
* Take care of the beam reflection;
* Applies damage 
* Call the creation of the visual effects;

'''[[Legacy:ShockBeamFire|ShockBeamFire]].SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum)'''
* This one creates the visual effects in this line: 

&lt;uscript&gt;
Beam = Spawn(BeamEffectClass,,, Start, Dir);
&lt;/uscript&gt;
* Set where is the destination of the beam with

&lt;uscript&gt;
Beam.AimAt(HitLocation, HitNormal);
&lt;/uscript&gt;

'''[[Legacy:ShockBeamEffect|ShockBeamEffect]].AimAt(HitLocation, HitNormal);
* Define where your beam is going (the mSpawnVecA vector is the hit location)
* Create the effects in the hit location with the SpawnEffects function.

'''[[Legacy:ShockBeamEffect|ShockBeamEffect]].SpawnEffects()

Here is where the effects are created. For the ShockRifle, these are the effect classes:

Effects spawned in the hit location:

[[Legacy:ShockImpactFlare|ShockImpactFlare]], [[Legacy:ShockImpactRing|ShockImpactRing]], [[Legacy:ShockImpactScorch|ShockImpactScorch]], [[Legacy:ShockExplosionCore|ShockExplosionCore]]

And this is the beam itself:

[[Legacy:ShockBeamCoil|ShockBeamCoil]]

==Flowchart==

http://webpages.charter.net/bmschkerke/Images/UT2K3/ProjectileFireFlow.jpg

==Comments==

'''Tarquin:''' The flow chart is a great idea, but now I've looked at it closely, I see that it is mostly linear &amp;ndash; it looks more complex than it is because of the way some lines turn corners so it can all fit in the image. I think it might be an idea to try &amp; make this in text with nested lists.

'''Bananna_Manuk:''' Hi i`m totally new to unreal script but i think more flow charts like this one really help get a grip whats going on.. some times a page full of text is a little daunting to some body such as myself still trying to get to grips with the basics ... Great job really helped

'''OlympusMons:''' I agree flow charts for me are alot easier to follow. Ive actually had to try and write some out so its easier for me to learn how all the unreal script classes interact, not an easy task. I hope some of you pro's might be able to lend a hand here. I can help a little myself but I'll be learning as we go. Mind you I have done databases in access and particle flows in max 6 so I know a bit about flowcharts.

'''T1:''' I see a mistake but I'm not quite sure how to reword it.... anyway, ShockBeamCoil is NOT the shock rifle's beam. ShockBeamCoil is that ribbonlike thing that twists around the beam on higher detail levels. ShockBeamEffect is the actual beam, and it additionally spawns the hit fx and the coil. Also the title of this page should be Firing_InstantFire_Weapons(UT2003), because it doesn't apply to UT2004 and definitely not UT99.

'''OlympusMons:''' Maybe we can come up with two more flowcharts to add to this ut2k4, ut99. Ive noticed there are calls for a weapon tutorials for ut99 and Im sure ut2k4, this would probably be helpful to anyone trying to make tutorials or weapons. :P

'''RegularX:''' Thankfully there are few things as complicated as firing a weapon.  Which seems odd for an FPS, but there you go.

'''CanadEHn:''' Would it be possible to spawn multiple beams in different directions, at the same time?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Firing Projectile Weapons</title>
    <id>1252</id>
    <revision>
      <id>3228</id>
      <timestamp>2004-01-10T02:58:25Z</timestamp>
      <contributor>
        <ip>210-55-121-166.dialup.xtra.co.nz</ip>
      </contributor>
      <comment>Solid Snake adds thoughts</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: Projectile Weapons

===Easy Way===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.

====The Second Chain====

The second chain is shorter, and as such will be examined first.  PlayerController.Fire() checks to see if the game is currently paused, and if it is unpauses the game and returns without further action.  If the game is not paused, PlayerController.Fire() calls Pawn.Fire().

&lt;uscript&gt;
exec function Fire( optional float F )
{
    if ( Level.Pauser == PlayerReplicationInfo )
    {
        SetPause(false);
        return;
    }
    Pawn.Fire(F);
}
&lt;/uscript&gt;

Pawn.Fire() checks to see if there's a valid weapon, and if so executes Weapon.Fire().  You'll note the check against None; this prevents access nones from appearing when the player does not have a valid weapon.  Similar error checking code should be introduced in any code you write.

&lt;uscript&gt;
function Fire( optional float F )
{
    if( Weapon!=None )
        Weapon.Fire(F);
}
&lt;/uscript&gt;

Weapon.Fire() would seem to be the function that actually fires the weapon, but this is not true.  The base Weapon.Fire() is actually empty.  As an abstract class this would be expected, except that most every class that derives from Weapon fails to override Fire() with their own function.  It is, effectively, blank for every weapon included with Unreal Tournament 2003.

&lt;uscript&gt;
simulated function Fire(float F)
{
}
&lt;/uscript&gt;

====The First Chain====

The actual processing of the firing of the weapon occurs in the first chain of events mentioned above.  There is no visible link in the UnrealScript code provided by Epic or extracted from UnrealEd from Unreal Tournament 2003 between the Fire alias and ModeDoFire().  The link is handled by the engine, natively, through the boolean variable bFire and ModeDoFire().

ModeDoFire is called based upon the player's currently selected weapon, and whether or not we're in the Fire or AltFire chain of events.  They proceed identically; the major difference is that FireModeClass(0).ModeDoFire() is called with Fire, and FireModeClass(1).ModeDoFire() is called with AltFire.  (''FireModeClass(x) is defined in the weapon class, and directs the engine to the appropriate class to be called when a weapon is fired. See [[Legacy:Weapon|Weapon]] for more information.'')

The first thing ModeDoFire does is check if firing is currently allowed.  A variety of circumstances may exist to prevent firing:  a timer may have to expire between shots, the player may not have ammunition, the player may be dead.  If any of these circumstances are met ModeDoFire simply exits and acts as if fire was not pressed.  Then, again, we split off into two chains of possible events.

======The First Chain:  Server======

----

'''Wormbo:''' There's a small error in the Projectile Fire Flowchart. The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

'''Dante:''' It seems as if UT is calling Weapon.ClientStartFire/Weapon.ServerStartFire which sets WeaponFire.bIsFiring = true (in Weapon.StartFire) which might be the trigger to call modeDoFire.

'''Ceej:''' Excellent flowchart, thank you. This is really the page to start with when attempting to understand weapons. The general weapon firing page still has the misleading PlayerController.Fire() call chain front and center. Maybe move the flowchart onto the general page and save this for projectile specifics?

'''Solid Snake:''' I've been dealing with the weapon code a lot now for the last 12 hours, and it seems that there is a little more complxities to this than detailed about. Other statements such as ServerStartFire(), ClientStartFire() and StartFire() all seem to play an important role into what makes the gun fire, of course you can always called DoFireMode to force fire the gun, but you miss out some other checks as well that may be important to make sure that the gun is fired properly over a network game. I'm not exactly to sure about this at the moment, but I will report back about this on my studies in this area. The one thing I can say is that Epic certainly doesn't make any easier to decipher what exactly is going on.</text>
    </revision>
    <revision>
      <id>3229</id>
      <timestamp>2003-11-02T17:51:29Z</timestamp>
      <contributor>
        <ip>Ceej</ip>
      </contributor>
      <comment>*comment</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: Projectile Weapons

===Easy Way===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.

====The Second Chain====

The second chain is shorter, and as such will be examined first.  PlayerController.Fire() checks to see if the game is currently paused, and if it is unpauses the game and returns without further action.  If the game is not paused, PlayerController.Fire() calls Pawn.Fire().

&lt;uscript&gt;
exec function Fire( optional float F )
{
    if ( Level.Pauser == PlayerReplicationInfo )
    {
        SetPause(false);
        return;
    }
    Pawn.Fire(F);
}
&lt;/uscript&gt;

Pawn.Fire() checks to see if there's a valid weapon, and if so executes Weapon.Fire().  You'll note the check against None; this prevents access nones from appearing when the player does not have a valid weapon.  Similar error checking code should be introduced in any code you write.

&lt;uscript&gt;
function Fire( optional float F )
{
    if( Weapon!=None )
        Weapon.Fire(F);
}
&lt;/uscript&gt;

Weapon.Fire() would seem to be the function that actually fires the weapon, but this is not true.  The base Weapon.Fire() is actually empty.  As an abstract class this would be expected, except that most every class that derives from Weapon fails to override Fire() with their own function.  It is, effectively, blank for every weapon included with Unreal Tournament 2003.

&lt;uscript&gt;
simulated function Fire(float F)
{
}
&lt;/uscript&gt;

====The First Chain====

The actual processing of the firing of the weapon occurs in the first chain of events mentioned above.  There is no visible link in the UnrealScript code provided by Epic or extracted from UnrealEd from Unreal Tournament 2003 between the Fire alias and ModeDoFire().  The link is handled by the engine, natively, through the boolean variable bFire and ModeDoFire().

ModeDoFire is called based upon the player's currently selected weapon, and whether or not we're in the Fire or AltFire chain of events.  They proceed identically; the major difference is that FireModeClass(0).ModeDoFire() is called with Fire, and FireModeClass(1).ModeDoFire() is called with AltFire.  (''FireModeClass(x) is defined in the weapon class, and directs the engine to the appropriate class to be called when a weapon is fired. See [[Legacy:Weapon|Weapon]] for more information.'')

The first thing ModeDoFire does is check if firing is currently allowed.  A variety of circumstances may exist to prevent firing:  a timer may have to expire between shots, the player may not have ammunition, the player may be dead.  If any of these circumstances are met ModeDoFire simply exits and acts as if fire was not pressed.  Then, again, we split off into two chains of possible events.

======The First Chain:  Server======

----

'''Wormbo:''' There's a small error in the Projectile Fire Flowchart. The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

'''Dante:''' It seems as if UT is calling Weapon.ClientStartFire/Weapon.ServerStartFire which sets WeaponFire.bIsFiring = true (in Weapon.StartFire) which might be the trigger to call modeDoFire.

'''Ceej:''' Excellent flowchart, thank you. This is really the page to start with when attempting to understand weapons. The general weapon firing page still has the misleading PlayerController.Fire() call chain front and center. Maybe move the flowchart onto the general page and save this for projectile specifics?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:First Person Shooter AI Architecture</title>
    <id>1227</id>
    <revision>
      <id>3170</id>
      <timestamp>2006-10-11T13:28:18Z</timestamp>
      <contributor>
        <ip>193.195.126.253</ip>
      </contributor>
      <comment>* typo</comment>
      <text xml:space="preserve">==Preliminary Description and Basic Concepts==

===Introduction===

The information in this article is adapted from a chapter in the recently published book, '''&quot;AI Game Programming Wisdom&quot;''', published 2002. It was written by Paul Tozour, and entitled, &quot;First-Person Shooter AI Archtecture&quot;. The author prefaces the article with this statement: 

This article describes a generic AI architecture for the typical first-person shooter (&quot;FPS&quot;) game such as any of the titles associated with the ''Quake'', ''Unreal'', or ''Half-Life'' engines.

===Overview:===

[[Legacy:Artificial Intelligence|Artificial Intelligence]] (AI) in First Person Shooter (FPS) game architectures tends be organized and controlled as seperate, individual agents, rather than coordinated teams that are synchronized to the same strategy playbook. The FPS Artificial Intelligence architecture is organized into a hierarchy with four major integrated components: '''Behavior''', '''Movement''', '''Animation''', and '''Combat'''. 

==Principal Game AI Components:==

The '''movement''' component is tasked with determining how the character should move in the game world. The movement AI is what makes the character avoid obstacles, follow navigation system nodes, and find paths through the complex environments to reach its destination. The movement subsystem never determines where to move, only how to do so. It simply receives commands from other components telling it where to move, and it is responsible for making sure the character moves to that point in an appropriate manner.

The '''animation''' component is responsible for controlling the game bot’s skeletal articulation and display appearance during gameplay. Its major role is selecting, parameterizing, and playing character animation sequences. It is also responsible for generating animations that cannot be played from pre-assembled animation sequences. Since we can’t tell in advance in what direction a character will face in a given scene, we need a method of integrated control over the real-time animation to ensure that the character behaves correctly.
 

The '''combat''' component is assigned the role of assessing the character’s current tactical situation, selecting tactics in combat, aiming and firing at opponents, deciding when to pick up a new weapon, and so on. Since combat is the core gameplay dynamic in most FPS games, the performance of this subsystem will be crucial to the player’s perception of the AI.

The '''behavior''' component is the integrating framework that determines the character’s current goal, orders, state, and immediate destination, and communicates with the other subsystems to coordinate physical motion towards a determined staging area. It is the highest-level AI subsystem and sits on top of all the other subsystems.

==Pathfinding and the Bot Navigation System:==

Fundamental to the movement AI system is the pathfinding component. This system is responsible for finding a Bot path from any coordinate location in the level to any other. Given a starting point, a state designation, and a goal or destination, it will find a series of waypoints that comprise an optimal path to some intermediate destination. It is possible that it will report that no path can be found, or will generate an apparent error in its repertoire of simulated human motion. The game AI pathfinder in ''Unreal Tournament'' uses a pre-computed data structure for guiding movement. This is a complex algorithm-controlled assemblage of linked lists, [[Legacy:NavigationPoint|NavigationPoint]]s, and Binary Space Partitioning ([[Legacy:BSP Tree|BSP]]) collision data. The FPS game world is relatively static, so it makes sense to pre-generate a database that is highly optimized for performing fast pathfinding in a particular section of the game world. At runtime, the pathfinding database is initialized and parameterized. The performance of this directed navigation system search is highly correlated with how appropriately the pathfinding database is optimized. 

==Realistic Interaction with Moving Objects and the Physics System:==

The obvious weakness with the global pathfinding system is that it does not correctly interact with dynamic obstacles. Practical solutions to the problem of efficient in-game agent avoidance of moving obstacles are built on communication between the physics system and the local pathfinding system. Since dynamic obstacles can be moved at any time, the AI needs to continually query the physics system for the presence of dynamic obstacles in any area it intends to move through. This designated the local pathfinding system, and is an essential quality of any object capable of three dimensional movement in the level.

A local pathfinder does not replace a global pathfinder; the two are integrated and each subsystem is optimized for a different part of the problem. The local pathfinding system is built on top of the global pathfinder. When an AI needs to move from point A to point B, its movement AI first queries the global pathfinding system, and if it’s successful, the global pathfinder will return an ordered list of points that constitute a path from A to B. The AI can then use the global path as a guideline, and use the local pathfinding system to find a path to each successive waypoint in that global path, avoiding any obstacles that it might happen to interact with along the way.

Fundamentally, a local pathfinder needs to be based on a search algorithm which constrains possible initial directions to the immediate area near the origin of the search. This technique will ensure that the optimal path is found if such a path exists. A good way to do this is to perform sampling (for example, querying the physics system for the presence of obstacles) using a fixed size grid oriented toward the destination point. However, keep in mind that sampling can be computationally expensive if it’s performed too often, so it’s very important to take steps to minimize the amount of sampling that the system needs to perform in any given local search.

==The Agent Movement Control Component:==

The movement AI acts as the client of all the other parts of the AI; that is, it is a subsystem that performs arbitrary tasks assigned to it by higher-level components. Those tasks are issued in the form of discrete movement commands, such as, “move to point (X,Y,Z)”, “move to object B”, “turn to face point (X,Y,Z)”, or “stop moving”.

The movement AI will be executing exactly one of those movement commands at any given moment. We describe the movement component as the object that “owns” the current movement command.

Once we have done this, we can design the appropriate algorithms to execute the movement commands into the individual movement command objects themselves. A command such as, “move to (X,Y,Z)”, for example, will be responsible for using the global and local pathfinding systems to find and execute a path to (X,Y,Z), and making the appropriate engine calls to ensure that the character moves along the specified path. If no path is available, or when the AI entity reaches the end of its path, the movement command reports back to the movement controller so that it can be garbage-collected.

This technique is also useful for handling different types of movement. Different types of movement commands can handle tasks such as walking, running, swimming, and dying, with appropriate parameters to determine the AI agent’s acceleration, movement range, turn rate, animations, and other movement characteristics. 

==The Combat Control Component:==

When an AI initiates combat, control for the majority of its behaviors is transferred to a combat control component. The combat controller is responsible for all combat-related tasks, such as selecting an opponent, selecting a weapon, maneuvering, firing, and searching for additional weapons and ammo.

The most difficult part of the combat problem is determining how to intelligently assess the current situation, and select and execute an appropriate tactic in response.

The challenge comes from the extraordinary difficulty of getting an AI entity to understand the significance of the spatial configuration of any given area. Any human can glance at his current surroundings and immediately form an assessment of the space.

----

Go on to the next part: [[Legacy:FPS AI Architecture, Continued|FPS AI Architecture, Continued]]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super Topic for all AI (bots, Monsters, NPCs, etc)
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]</text>
    </revision>
    <revision>
      <id>3171</id>
      <timestamp>2005-11-16T21:44:42Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Preliminary Description and Basic Concepts==

===Introduction===

The information in this article is adapted from a chapter in the recently published book, '''&quot;AI Game Programming Wisdom&quot;''', published 2002. It was written by Paul Tozour, and entitled, &quot;First-Person Shooter AI Archtecture&quot;. The author prefaces the article with this statement: 

This article describes a generic AI architecture for the typical first-person shooter (&quot;FPS&quot;) game such as any of the titles associated with the ''Quake'', ''Unreal'', or ''Half-Life'' engines.

===Overview:===

[[Legacy:Artificial Intelligence|Artificial Intelligence]] (AI) in First Person Shooter (FPS) game architectures tends be organized and controlled as seperate, individual agents, rather than coordinated teams that are synchronized to the same strategy playbook. The FPS Artificial Intelligence architecture is organized into a hierarchy with four major integrated components: '''Behavior''', '''Movement''', '''Animation''', and '''Combat'''. 

==Principal Game AI Components:==

The '''movement''' component is tasked with determining how the character should move in the game world. The movement AI is what makes the character avoid obstacles, follow navigation system nodes, and find paths through the complex environments to reach its destination. The movement subsystem never determines where to move, only how to do so. It simply receives commands from other components telling it where to move, and it is responsible for making sure the character moves to that point in an appropriate manner.

The '''animation''' component is responsible for controlling the game bot’s skeletal articulation and display appearance during gameplay. Its major role is selecting, parameterizing, and playing character animation sequences. It is also responsible for generating animations that cannot be played from pre-assembled animation sequences. Since we can’t tell in advance in what direction a character will face in a given scene, we need a method of integrated control over the real-time animation to ensure that the character behaves correctly.
 

The '''combat''' component is assigned the role of assessing the character’s current tactical situation, selecting tactics in combat, aiming and firing at opponents, deciding when to pick up a new weapon, and so on. Since combat is the core gameplay dynamic in most FPS games, the performance of this subsystem will be crucial to the player’s perception of the AI.

The '''behavior''' component is the integrating framework that determines the character’s current goal, orders, state, and immediate destination, and communicates with the other subsystems to coordinate physical motion towards a determined staging area. It is the highest-level AI subsystem and sits on top of all the other subsystems.

==Pathfinding and the Bot Navigation System:==

Fundamental to the movement AI system is the pathfinding component. This system is responsible for finding a Bot path from any coordinate location in the level to any other. Given a starting point, a state designation, and a goal or destination, it will find a series of waypoints that comprise an optimal path to some intermediate destination. It is possible that it will report that no path can be found, or will generate an apparent error in its repertoire of simulated human motion. The game AI pathfinder in ''Unreal Tournament'' uses a pre-computed data structure for guiding movement. This is a complex algorithm-controlled assemblage of linked lists, [[Legacy:NavigationPoint|NavigationPoint]]s, and Binary Space Partitioning ([[Legacy:BSP Tree|BSP]]) collision data. The FPS game world is relatively static, so it makes sense to pre-generate a database that is highly optimized for performing fast pathfinding in a particular section of the game world. At runtime, the pathfinding database is initialized and parameterized. The performance of this directed navigation system search is highly correlated with how appropriately the pathfinding database is optimized. 

==Realistic Interaction with Moving Objects and the Physics System:==

The obvious weakness with the global pathfinding system is that it does not correctly interact with dynamic obstacles. Practical solutions to the problem of efficient in-game agent avoidance of moving obstacles are built on communication between the physics system and the local pathfinding system. Since dynamic obstacles can be moved at any time, the AI needs to continually query the physics system for the presence of dynamic obstacles in any area it intends to move through. This designated the local pathfinding system, and is an essential quality of any object capable of three dimensional movement in the level.

A local pathfinder does not replace a global pathfinder; the two are integrated and each subsystem is optimized for a different part of the problem. The local pathfinding system is built on top of the global pathfinder. When an AI needs to move from point A to point B, its movement AI first queries the global pathfinding system, and if it’s successful, the global pathfinder will return an ordered list of points that constitute a path from A to B. The AI can then use the global path as a guideline, and use the local pathfinding system to find a path to each successive waypoint in that global path, avoiding any obstacles that it might happen to interact with along the way.

Fundamentally, a local pathfinder needs to be based on a search algorithm which constrains possible initial directions to the immediate area near the origin of the search. This technique will ensure that the optimal path is found if such a path exists. A good way to do this is to perform sampling (for example, querying the physics system for the presence of obstacles) using a fixed size grid oriented toward the destination point. However, keep in mind that sampling can be computationally expensive if it’s performed too often, so it’s very important to take steps to minimize the amount of sampling that the system needs to perform in any given local search.

==The Agent Movement Control Component:==

The movement AI acts as the client of all the other parts of the AI; that is, it is a subsystem that performs arbitrary tasks assigned to it by higher-level components. Those tasks are issued in the form of discrete movement commands, such as, “move to point (X,Y,Z)”, “move to object B”, “turn to face point (X,Y,Z)”, or “stop moving”.

The movement AI will be executing exactly one of those movement commands at any given moment. We describe the movement component as the object that “owns” the current movement command.

Once we have done this, we can design the appropriate algorithms to execute the movement commands into the individual movement command objects themselves. A command such as, “move to (X,Y,Z)”, for example, will be responsible for using the global and local pathfinding systems to find and execute a path to (X,Y,Z), and making the appropriate engine calls to ensure that the character moves along the specified path. If no path is available, or when the AI entity reaches the end of its path, the movement command reports back to the movement controller so that it can be garbage-collected.

This technique is also useful for handling different types of movement. Different types of movement commands can handle tasks such as walking, running, swimming, and dying, with appropriate parameters to determine the AI agent’s acceleration, movement range, turn rate, animations, and other movement characteristics. 

==The Combat Control Component:==

When an AI initiates combat, control for the majority of its behaviors is transferred to a combat control component. The combat controller is responsible for all combat-related tasks, such as selecting an opponent, selecting a weapon, maneuvering, firing, and searching for additional weapons and ammo.

The most difficult part of the combat problem is determining how to intelligently assess the current situation, and select and execute an appropriate tactic in response.

The challenge comes from the extraordinary difficulty of getting an AI entity to understand the significance of the spatial configuration of any given area. Any human can glance at his current surroundings and immediately form an assessment of the space.

----

Go on to the next part: [[Legacy:FPS AI Architecture, Continued|FPS AI Architecture, Continued]]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super Topic for all AI (bots, Monesters, NPCs, etc)
* [[Legacy:Introduction To Game AI|Introduction to Game AI]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FirstBloodMessage</title>
    <id>28881</id>
    <revision>
      <id>42811</id>
      <timestamp>2010-03-31T11:02:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FixedMover</title>
    <id>1268</id>
    <revision>
      <id>3261</id>
      <timestamp>2004-05-10T23:07:05Z</timestamp>
      <contributor>
        <ip>Vty229a4.emba.uvm.edu</ip>
      </contributor>
      <comment>Moved class to separate page...</comment>
      <text xml:space="preserve">Movers that rotate in the process of opening or closing (doors, for instance) don't work well in network games; clients may see those movers rotated in ways that don't match their actual rotation on the server.  The following class, presumptuously called '''FixedMover''', fixes that problem.  (See [[Legacy:Embedding Code|Embedding Code]] for how to use it in your maps.)

&lt;uscript&gt;
class FixedMover extends Mover;


var int RealRotationYaw;
var int RealRotationPitch;
var int RealRotationRoll;


replication {

  reliable if (Role == ROLE_Authority)
    RealRotationYaw, RealRotationPitch, RealRotationRoll;
  }


simulated event Timer() {

  // first problem: rotators not replicated correctly
  if (Role &lt; ROLE_Authority) {
    RealRotation.Yaw   = RealRotationYaw;
    RealRotation.Pitch = RealRotationPitch;
    RealRotation.Roll  = RealRotationRoll;
    }

  // second problem: rotation not taken into account when updating position
  if (RealRotation != Rotation)
    bClientPause = true;

  Super.Timer();
  
  if (Role == ROLE_Authority) {
    RealRotationYaw   = RealRotation.Yaw;
    RealRotationPitch = RealRotation.Pitch;
    RealRotationRoll  = RealRotation.Roll;
    }
  }
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlagBase</title>
    <id>1223</id>
    <revision>
      <id>3160</id>
      <timestamp>2006-01-10T15:29:02Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; FlagBase (Package: )}}

The FlagBase actor is the actor which tells UT where to place the flag for CTF or any mod that uses flags at various points in the level. When you place a FlagBase in the level it will appear as a blue flag.

For the UT200x version of the FlagBase, see [[Legacy:XRealCTFBase|xRealCTFBase]].

The flag will appear the right color in-game as long as you set the Flagbase -&gt; Team property to the team you want.

The [[Legacy:Team Number|team number]]s are '''0 = Red, 1 = Blue'''.

==Properties==

===Main===
; int Team : The [[Legacy:Team Number|team number]] of the ''defending'' team for this flag.

==Related Topics==
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]] (UT2004)

==Discussion==

'''Omarr:''' I've checked this page a million times... I can never remember which color is which number.

'''ZxAnPhOrIaN:''' Think of red as being the beginning of the spectrum and blue is after red. 1 is after 0, so that is how I remember it.

'''Tarquin:''' I like playing on red. So red is zero, the best number :D okay, I mean the default number. For people who can never remember (like me) there's the [[Legacy:Team Number|team number]] page you can link to from any page that mentions them.

'''ZxAnPhOrIaN:''' Zero is easy to remember, think opposites. Zero to red (4 letters to 3 letters), One to blue (3 letters to 4 letters)

'''SuperApe:''' This class page needs property, function, event and state defs.  A Package name too.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3161</id>
      <timestamp>2003-02-04T15:47:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|UT: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; FlagBase}}

The FlagBase actor is the actor which tells UT where to place the flag for CTF or any mod that uses flags at various points in the level. When you place a FlagBase in the level it will appear as a blue flag. Don't worry, the flag will appear the right color in-game. Just set the Flagbase -&gt; Team property of the actor to the team you want. The [[Legacy:Team Number|team number]]s are:
* Red &amp;ndash; 0
* Blue &amp;ndash; 1

{{classbox|UT2003: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:CTFBase|CTFBase]] &gt;&gt; [[Legacy:XRealCTFBase|xRealCTFBase]] &gt;&gt; x[color]FlagBase}}

For UT2003, all you have to do is add the xRedFlagBase or xBlueFlagBase to the red and blue bases.  The ut2003 flags will make a colored 'stand' for themselves automatically when the game is run, make sure that the bottom of the pole is exactly touching the floor of the flagroom for it to appear properly.

----

'''Omarr:''' I've checked this page a million times... I can never remember which color is which number.

'''ZxAnPhOrIaN:''' Think of red as being the beginning of the spectrum and blue is after red. 1 is after 0, so that is how I remember it.

'''Tarquin:''' I like playing on red. So red is zero, the best number :D okay, I mean the default number. For people who can never remember (like me) there's the [[Legacy:Team Number|team number]] page you can link to from any page that mentions them.

'''ZxAnPhOrIaN:''' Zero is easy to remember, think opposites. Zero to red (4 letters to 3 letters), One to blue (3 letters to 4 letters)</text>
    </revision>
    <revision>
      <id>3162</id>
      <timestamp>2006-01-10T15:26:07Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; FlagBase (Package: )}}

The FlagBase actor is the actor which tells UT where to place the flag for CTF or any mod that uses flags at various points in the level. When you place a FlagBase in the level it will appear as a blue flag.

For the UT200x version of the FlagBase, see [[Legacy:XRealCTFBase|xRealCTFBase]].

The flag will appear the right color in-game as long as you set the Flagbase -&gt; Team property to the team you want.

The [[Legacy:Team Number|team number]]s are '''0 = Red, 1 = Blue'''.

==Properties==

===Main===
; int Team : The team number of the defending team for this flag.

==Related Topics==
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]] (UT2004)

==Discussion==

'''Omarr:''' I've checked this page a million times... I can never remember which color is which number.

'''ZxAnPhOrIaN:''' Think of red as being the beginning of the spectrum and blue is after red. 1 is after 0, so that is how I remember it.

'''Tarquin:''' I like playing on red. So red is zero, the best number :D okay, I mean the default number. For people who can never remember (like me) there's the [[Legacy:Team Number|team number]] page you can link to from any page that mentions them.

'''ZxAnPhOrIaN:''' Zero is easy to remember, think opposites. Zero to red (4 letters to 3 letters), One to blue (3 letters to 4 letters)

'''SuperApe:''' This class page needs property, function, event and state defs.  A Package name too.

[[Category:Legacy Class UT|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43926</id>
      <timestamp>2010-08-30T22:30:18Z</timestamp>
      <contributor>
        <ip>82.35.8.5</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; FlagBase (Package: )}}

The FlagBase actor is the actor which tells UT where to place the flag for CTF or any mod that uses flags at various points in the level. When you place a FlagBase in the level it will appear as a blue flag.

For the UT200x version of the FlagBase, see [[Legacy:XRealCTFBase|xRealCTFBase]].

The flag will appear the right color in-game as long as you set the Flagbase -&gt; Team property to the team you want.

The [[Legacy:Team Number|team number]]s are '''0 = Red, 1 = Blue'''.

==Properties==

===Main===
; int Team : The [[Legacy:Team Number|team number]] of the ''defending'' team for this flag.

==Related Topics==
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]] (UT2004)

==Discussion==

'''Omarr:''' I've checked this page a million times... I can never remember which color is which number.

'''ZxAnPhOrIaN:''' Think of red as being the beginning of the spectrum and blue is after red. 1 is after 0, so that is how I remember it.

'''Tarquin:''' I like playing on red. So red is zero, the best number :D okay, I mean the default number. For people who can never remember (like me) there's the [[Legacy:Team Number|team number]] page you can link to from any page that mentions them.

'''ZxAnPhOrIaN:''' Zero is easy to remember, think opposites. Zero to red (4 letters to 3 letters), One to blue (3 letters to 4 letters)

'''SuperApe:''' This class page needs property, function, event and state defs.  A Package name too.

'''R3plicant:''' Tarquin, hi. I'd like to have a working-online UT99 Flagbase, (Red &amp; Blue obv'), that will keep a non-scrolling scrolling-message-texture scoreboard, (think Red above Blue, static, with Flag Cap score at the end of the team colour), updated with both red &amp; Blue teams' scores as and when they happen - how would I achieve that? Second to that and a little off-topic, but indirectly related to this; I wanted a custom-font scripted texture to use for it, but haven't had any luck in making one. As you're probably aware it's simply not a case of making a new font texture, (which I DID manage, just). Any help much appreciated. Thanks! I can be found in #unrealed on Quakenet in irc during the day.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43927</id>
      <timestamp>2010-08-31T06:12:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moving old discussion to talk page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; FlagBase (Package: )}}

The FlagBase actor is the actor which tells UT where to place the flag for CTF or any mod that uses flags at various points in the level. When you place a FlagBase in the level it will appear as a blue flag.

For the UT200x version of the FlagBase, see [[Legacy:XRealCTFBase|xRealCTFBase]].

The flag will appear the right color in-game as long as you set the Flagbase -&gt; Team property to the team you want.

The [[Legacy:Team Number|team number]]s are '''0 = Red, 1 = Blue'''.

==Properties==

===Main===
; int Team : The [[Legacy:Team Number|team number]] of the ''defending'' team for this flag.

==Related Topics==
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]] (UT2004)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Flagbasemutatorjrm</title>
    <id>1267</id>
    <revision>
      <id>3259</id>
      <timestamp>2003-11-19T10:20:48Z</timestamp>
      <contributor>
        <ip>SabbathCat</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===A Flagbase mutator that adds a mesh to show where the flag was. ===

&lt;br /&gt;&lt;br /&gt;[[Legacy:SabbathCat|SabbathCat]] : '''''Note: This doesn't actually work, I'm still trying to figure out why.''''' &lt;br /&gt;

=====FlagBaseJrM &lt;br /&gt;The Flagbase thing itself..=====

&lt;uscript&gt;
//=============================================================================
// FlagBaseJrM.
//=============================================================================
class FlagBaseJRM expands FlagBase;

var() byte Team;
var() Sound TakenSound;

function PostBeginPlay()
{
	local CTFFlag myFlag;

	Super.PostBeginPlay();
	LoopAnim('newflag');
	if ( !Level.Game.IsA('CTFGame') )
		return;

	bHidden = false;
	if ( Team == 0 )
	{
		Skin=texture'BotPack.Skins.RedSkin2';	
		myFlag = Spawn(class'RedFlag');
                Spawn(class'flagbasemutejrm.flgred',, '',);
	}
	else if ( Team == 1 )
		myFlag = Spawn(class'CTFFlag');
                Spawn(class'flagbasemutejrm.flgblu',, '',);

	myFlag.HomeBase = self;
	myFlag.Team = Team;
	CTFReplicationInfo(Level.Game.GameReplicationInfo).FlagList[Team] = myFlag;
}

function PlayAlarm()
{
	SetTimer(5.0, false);
	AmbientSound = TakenSound;
}

function Timer()
{
	AmbientSound = None;
}

defaultproperties
{
     TakenSound=Sound'Botpack.CTF.flagtaken'
     bStatic=False
     bNoDelete=True
     bAlwaysRelevant=True
     DrawType=DT_Mesh
     Skin=Texture'BotPack.Skins.BlueSkin2'
     Mesh=Mesh'flgred'
     DrawScale=1.300000
     SoundRadius=255
     SoundVolume=255
     CollisionRadius=60.000000
     CollisionHeight=60.000000
     bCollideActors=True
     NetUpdateFrequency=3.000000
}
&lt;/uscript&gt;

=====flgred=====

One of the flagbase's (There are two, one for each team. )

&lt;uscript&gt;// Generated by MeshMaker (c) 2001 by Mychaeel &lt;mychaeel@planetunreal.com&gt;

class flgred extends Decoration;

// Include EditPackages=BotPack in UnrealTournament.ini

#exec mesh import mesh=flgred anivfile=Models\flgred_a.3d datafile=Models\flgred_d.3d x=0 y=0 z=0 mlod=0
#exec mesh origin mesh=flgred x=0 y=0 z=0
#exec mesh sequence mesh=flgred seq=All startframe=0 numframes=1

#exec meshmap new meshmap=flgred mesh=flgred
#exec meshmap scale meshmap=flgred x=0.50000 y=0.50000 z=1.00000

defaultproperties
{
  DrawType=DT_Mesh
  Mesh=Mesh'flgred'
  bCollideWhenPlacing=False
  CollisionHeight=128.00000
  MultiSkins(0)=Texture'BotPack.Skins.jpillar'
  MultiSkins(1)=Texture'BotPack.Skins.RedSkin2'
  MultiSkins(2)=Texture'BotPack.Skins.jtubelight2'
  DrawScale=0.25000
  ScaleGlow=3.00000
}
&lt;/uscript&gt;

[[:Category:Legacy Mod Ideas]] |  [[:Category:Legacy Personal Page]]
[[Category:Legacy Mod Ideas|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3260</id>
      <timestamp>2003-11-19T10:10:54Z</timestamp>
      <contributor>
        <ip>SabbathCat</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===A [[Legacy:Flagbase|flagbase]] mutator that adds a mesh to show where the flag was. ===

====The Flagbase thing itself..====

&lt;uscript&gt;
//=============================================================================
// FlagBaseJrM.
//=============================================================================
class FlagBaseJRM expands FlagBase;

var() byte Team;
var() Sound TakenSound;

function PostBeginPlay()
{
	local CTFFlag myFlag;

	Super.PostBeginPlay();
	LoopAnim('newflag');
	if ( !Level.Game.IsA('CTFGame') )
		return;

	bHidden = false;
	if ( Team == 0 )
	{
		Skin=texture'BotPack.Skins.RedSkin2';	
		myFlag = Spawn(class'RedFlag');
                Spawn(class'flagbasemutejrm.flgred',, '',);
	}
	else if ( Team == 1 )
		myFlag = Spawn(class'CTFFlag');
                Spawn(class'flagbasemutejrm.flgblu',, '',);

	myFlag.HomeBase = self;
	myFlag.Team = Team;
	CTFReplicationInfo(Level.Game.GameReplicationInfo).FlagList[Team] = myFlag;
}

function PlayAlarm()
{
	SetTimer(5.0, false);
	AmbientSound = TakenSound;
}

function Timer()
{
	AmbientSound = None;
}

defaultproperties
{
     TakenSound=Sound'Botpack.CTF.flagtaken'
     bStatic=False
     bNoDelete=True
     bAlwaysRelevant=True
     DrawType=DT_Mesh
     Skin=Texture'BotPack.Skins.BlueSkin2'
     Mesh=Mesh'flgred'
     DrawScale=1.300000
     SoundRadius=255
     SoundVolume=255
     CollisionRadius=60.000000
     CollisionHeight=60.000000
     bCollideActors=True
     NetUpdateFrequency=3.000000
}
&lt;/uscript&gt;

----

One of the flagbase's &lt;sup&gt;(There are two, one for each team. )&lt;/sup&gt;

&lt;uscript&gt;// Generated by MeshMaker (c) 2001 by Mychaeel &lt;mychaeel@planetunreal.com&gt;

class flgred extends Decoration;

// Include EditPackages=BotPack in UnrealTournament.ini

#exec mesh import mesh=flgred anivfile=Models\flgred_a.3d datafile=Models\flgred_d.3d x=0 y=0 z=0 mlod=0
#exec mesh origin mesh=flgred x=0 y=0 z=0
#exec mesh sequence mesh=flgred seq=All startframe=0 numframes=1

#exec meshmap new meshmap=flgred mesh=flgred
#exec meshmap scale meshmap=flgred x=0.50000 y=0.50000 z=1.00000

defaultproperties
{
  DrawType=DT_Mesh
  Mesh=Mesh'flgred'
  bCollideWhenPlacing=False
  CollisionHeight=128.00000
  MultiSkins(0)=Texture'BotPack.Skins.jpillar'
  MultiSkins(1)=Texture'BotPack.Skins.RedSkin2'
  MultiSkins(2)=Texture'BotPack.Skins.jtubelight2'
  DrawScale=0.25000
  ScaleGlow=3.00000
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>28658</id>
      <timestamp>2008-05-20T10:53:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed non-existing category</comment>
      <text xml:space="preserve">===A Flagbase mutator that adds a mesh to show where the flag was. ===

&lt;br /&gt;&lt;br /&gt;[[Legacy:SabbathCat|SabbathCat]] : '''''Note: This doesn't actually work, I'm still trying to figure out why.''''' &lt;br /&gt;

=====FlagBaseJrM &lt;br /&gt;The Flagbase thing itself..=====

&lt;uscript&gt;
//=============================================================================
// FlagBaseJrM.
//=============================================================================
class FlagBaseJRM expands FlagBase;

var() byte Team;
var() Sound TakenSound;

function PostBeginPlay()
{
	local CTFFlag myFlag;

	Super.PostBeginPlay();
	LoopAnim('newflag');
	if ( !Level.Game.IsA('CTFGame') )
		return;

	bHidden = false;
	if ( Team == 0 )
	{
		Skin=texture'BotPack.Skins.RedSkin2';	
		myFlag = Spawn(class'RedFlag');
                Spawn(class'flagbasemutejrm.flgred',, '',);
	}
	else if ( Team == 1 )
		myFlag = Spawn(class'CTFFlag');
                Spawn(class'flagbasemutejrm.flgblu',, '',);

	myFlag.HomeBase = self;
	myFlag.Team = Team;
	CTFReplicationInfo(Level.Game.GameReplicationInfo).FlagList[Team] = myFlag;
}

function PlayAlarm()
{
	SetTimer(5.0, false);
	AmbientSound = TakenSound;
}

function Timer()
{
	AmbientSound = None;
}

defaultproperties
{
     TakenSound=Sound'Botpack.CTF.flagtaken'
     bStatic=False
     bNoDelete=True
     bAlwaysRelevant=True
     DrawType=DT_Mesh
     Skin=Texture'BotPack.Skins.BlueSkin2'
     Mesh=Mesh'flgred'
     DrawScale=1.300000
     SoundRadius=255
     SoundVolume=255
     CollisionRadius=60.000000
     CollisionHeight=60.000000
     bCollideActors=True
     NetUpdateFrequency=3.000000
}
&lt;/uscript&gt;

=====flgred=====

One of the flagbase's (There are two, one for each team. )

&lt;uscript&gt;// Generated by MeshMaker (c) 2001 by Mychaeel &lt;mychaeel@planetunreal.com&gt;

class flgred extends Decoration;

// Include EditPackages=BotPack in UnrealTournament.ini

#exec mesh import mesh=flgred anivfile=Models\flgred_a.3d datafile=Models\flgred_d.3d x=0 y=0 z=0 mlod=0
#exec mesh origin mesh=flgred x=0 y=0 z=0
#exec mesh sequence mesh=flgred seq=All startframe=0 numframes=1

#exec meshmap new meshmap=flgred mesh=flgred
#exec meshmap scale meshmap=flgred x=0.50000 y=0.50000 z=1.00000

defaultproperties
{
  DrawType=DT_Mesh
  Mesh=Mesh'flgred'
  bCollideWhenPlacing=False
  CollisionHeight=128.00000
  MultiSkins(0)=Texture'BotPack.Skins.jpillar'
  MultiSkins(1)=Texture'BotPack.Skins.RedSkin2'
  MultiSkins(2)=Texture'BotPack.Skins.jtubelight2'
  DrawScale=0.25000
  ScaleGlow=3.00000
}
&lt;/uscript&gt;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlakAltFire</title>
    <id>1231</id>
    <revision>
      <id>3180</id>
      <timestamp>2004-06-13T23:46:14Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt; [[Legacy:ProjectileFire|ProjectileFire]] &gt;&gt; FlakAltFire (Package: XWeapons)}}

This example is useful for a grenade style weapon, such as, well, grenades

==Code==

&lt;uscript&gt;
class FlakAltFire extends ProjectileFire; // class and the parent class

function InitEffects()                    // initiates the muzzle flash emitter
{
  Super.InitEffects();
  if ( FlashEmitter == None )
    FlashEmitter = Weapon.FireMode[0].FlashEmitter;
}

defaultproperties                         // default properties for some of the variables
{                                         // (others are inherited from ProjectileFire)
     ProjSpawnOffset=(X=25.000000,Y=9.000000,Z=-12.000000)  // where the projectile is spawned
                                                            // relative to the player's view
     FireAnim=&quot;AltFire&quot;                   // animation sequence for firing
     FireEndAnim=&quot;None&quot;
     FireSound=SoundGroup'WeaponSounds.FlakCannon.FlakCannonAltFire' // sound you get when firing
     FireForce=&quot;FlakCannonAltFire&quot;        // force feedback effect when firing
     FireRate=1.000000                    // seconds per shot
     AmmoClass=Class'XWeapons.FlakAmmo'   // the ammunition class used by this firing mode
     AmmoPerFire=1                        // ammo to use for each shot
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-20.000000)
     ShakeOffsetRate=(X=-1000.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'XWeapons.FlakShell'  // the projectile class to be spawned
     BotRefireRate=0.500000
     WarnTargetPct=0.900000
     bSplashDamage=True                   // (AI) this firing mode does splash damage
     bRecommendSplashDamage=True          // (AI) the splash damage is worth being used
     bTossed=True                         // (AI) the projectile is affected by gravity
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Code References|Code References]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3181</id>
      <timestamp>2004-01-19T23:19:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt; [[Legacy:ProjectileFire|ProjectileFire]] &gt;&gt; FlakAltFire (Package: XWeapons)}}

'''Tarquin:''' What is this page for?

'''GRAF1K:''' Dunno. [[:Category:Legacy Delete Me]] &amp;ndash; useless, whatever it's for.

'''MythOpus:''' Found it, Code References :)  

'''HSDanClark:''' A while back me and Dragonmaw put together the minigun classes and a few others, then he posted this a few days ago... I'm not sure why, unless it's going to be part of another series like the minigun  O_O

'''Dragonmaw:''' The Flak Cannon examples are going to be used for projectile fire, since minigun is instant fire, like the shock rifle.  Plus, the code would be useful for, say, a shotgun.

==Code==

&lt;uscript&gt;
class FlakAltFire extends ProjectileFire; // class and the parent class

function InitEffects()                    // initiates the muzzle flash emitter
{
  Super.InitEffects();
  if ( FlashEmitter == None )
    FlashEmitter = Weapon.FireMode[0].FlashEmitter;
}

defaultproperties                         // default properties for some of the variables
{                                         // (others are inherited from ProjectileFire)
     ProjSpawnOffset=(X=25.000000,Y=9.000000,Z=-12.000000)  // where the projectile is spawned
                                                            // relative to the player's view
     FireAnim=&quot;AltFire&quot;                   // animation sequence for firing
     FireEndAnim=&quot;None&quot;
     FireSound=SoundGroup'WeaponSounds.FlakCannon.FlakCannonAltFire' // sound you get when firing
     FireForce=&quot;FlakCannonAltFire&quot;        // force feedback effect when firing
     FireRate=1.000000                    // seconds per shot
     AmmoClass=Class'XWeapons.FlakAmmo'   // the ammunition class used by this firing mode
     AmmoPerFire=1                        // ammo to use for each shot
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-20.000000)
     ShakeOffsetRate=(X=-1000.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'XWeapons.FlakShell'  // the projectile class to be spawned
     BotRefireRate=0.500000
     WarnTargetPct=0.900000
     bSplashDamage=True                   // (AI) this firing mode does splash damage
     bRecommendSplashDamage=True          // (AI) the splash damage is worth being used
     bTossed=True                         // (AI) the projectile is affected by gravity
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Code References|Code References]]

[[Category:Legacy Delete Me|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlakAmmo</title>
    <id>1274</id>
    <revision>
      <id>3272</id>
      <timestamp>2004-07-22T04:54:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; FlakAmmo (Package: Botpack)}}

This is the ammo for the [[Legacy:UT_FlakCannon|UT_FlakCannon]]. it contains 10 flak shells. the maximum amount is 50.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3273</id>
      <timestamp>2004-07-21T16:11:52Z</timestamp>
      <contributor>
        <ip>Buu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the ammo for the [[Legacy:UT_FlakCannon|UT_FlakCannon]]. it contains 10 flak shells. the maximum amount is 50.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlakAmmoPickup</title>
    <id>28337</id>
    <revision>
      <id>40004</id>
      <timestamp>2009-11-14T20:15:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlakBox</title>
    <id>1224</id>
    <revision>
      <id>3163</id>
      <timestamp>2003-05-12T09:12:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; FlakBox (Package: UnrealI)}}

Ammunition for the Unreal Flak Canon.

==Known Subclasses ==
* [[Legacy:FlakShellAmmo|FlakShellAmmo]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3164</id>
      <timestamp>2003-05-02T16:39:19Z</timestamp>
      <contributor>
        <ip>Otdial-212-144-063-225.arcor-ip.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; FlakBox}}

==Known subclasses ==
* [[Legacy:FlakShellAmmo|FlakShellAmmo]]

ammunition for the Flack Canon of UnrealTournament (1)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlakCannon</title>
    <id>28339</id>
    <revision>
      <id>40006</id>
      <timestamp>2009-11-14T20:15:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlakFire</title>
    <id>1285</id>
    <revision>
      <id>3289</id>
      <timestamp>2006-04-13T19:50:52Z</timestamp>
      <contributor>
        <ip>C-68-50-149-215.hsd1.md.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt; [[Legacy:ProjectileFire|ProjectileFire]] &gt;&gt; FlakFire (Package: XWeapons)}}

Flak Fire(borrowed the word stuff from flakalt but i just wanted this to be up here)

==Code==

&lt;uscript&gt;
class FlakFire extends ProjectileFire;

function InitEffects()
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'tip');
}

defaultproperties
{
     ProjPerFire=9
     ProjSpawnOffset=(X=25.000000,Y=5.000000,Z=-6.000000)
     FireEndAnim=
     FireAnimRate=0.950000
     FireSound=SoundGroup'WeaponSounds.FlakCannon.FlakCannonFire'
     FireForce=&quot;FlakCannonFire&quot;
     FireRate=0.894700
     AmmoClass=Class'XWeapons.FlakAmmo'
     AmmoPerFire=1
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=-20.000000)
     ShakeOffsetRate=(X=-1000.000000)
     ShakeOffsetTime=2.000000
     ProjectileClass=Class'XWeapons.FlakChunk'
     BotRefireRate=0.700000
     FlashEmitterClass=Class'XEffects.FlakMuzFlash1st'
     Spread=1400.000000
     SpreadStyle=SS_Random
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Code References|Code References]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlashLightBeam</title>
    <id>28835</id>
    <revision>
      <id>42762</id>
      <timestamp>2010-03-30T16:11:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Flashman</title>
    <id>1245</id>
    <revision>
      <id>3210</id>
      <timestamp>2002-12-21T15:56:55Z</timestamp>
      <contributor>
        <ip>Flashman</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====M E ====

''(a little about)''

{|

|-
| style=&quot;text-align: right&quot; |'''''Name:'''''
|Ashley Lewis
|-
| style=&quot;text-align: right&quot; |'''D.O.B:'''
|18/03/82 - be sure and send me a birthday card!
|-
| style=&quot;text-align: right&quot; |'''Ocupation:'''
|Software Engineer for a little company called EDS
|-
| style=&quot;text-align: right&quot; |'''Location:'''
|Shropshire, UK
|-
| style=&quot;text-align: right&quot; |'''Contact:'''
|magicrabbit_@hotmail.com
|-
| style=&quot;text-align: right&quot; |'''Games:'''
|Unreal, UT, CounterStrike Tour of Duty (see links)
|-
| style=&quot;text-align: right&quot; |'''Mapping:'''
|Can't get used to Quake Engine mapping now that I've dabbled so long in UT's matrix methodology. I Love creating maps, but have never released one, taught myself a lot of knowledge since I first opened up UED. Fairly skilled with Studio MAX as well, and pretty good with photoshop, but my texture efforts with UT maps have been mainly adding dirt, features or team colours/symbols on someone else's base textures. I have a comprehensive graveyard of unfinished maps with some cool ideas in them, and they get progressively less cool the older the &quot;last modified&quot; date is :P
|-
| style=&quot;text-align: right&quot; |'''Hardware'''
|Athlon 1800+ on Epox 8k5a 2+ Mobo, 512Mb DDR2100 RAM, 60Gb ATA100 RAID-0 Array, GeForceII MX 400 (64Mb), SBLive 1024 - and a cable connection.
|}

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Projects]] I hope to keep this section up to date, appologies for any waywardness, I have a busy life :)

====Announcements====

''07 Nov: UT2k3!''

Sorry for the lack of updates i've been off in the land of Dead motherboards! Yep I finally got UT2003, opened up UED 3 and I must admit, I'm scared. I'm posting today an appeal for anyone interested in colaboration on a couple of maps, any offers considered. I'm an able mapper and an average modeler, but my texturing needs work. If you're interested (possibly looking at turning this into a full scale mapping team eventually) then post at the bottom in the general natterings section

''21 Nov: *Gasp* (Comes back up for air)''

Maaan this new manner of mapping takes some getting used to, I've been playing around with MAX and exporting some meshes for the past fortnight, and I think I got it sussed now! That said I also learned something about myself that I was in complete denial about before :) ... I cant do textures. Every time I've tried to build a texture myself to go on one of my meshes it ends up looking like something puked all over it! :( I don't expect I'll have a map ready for a couple of weeks yet. I'm still looking for any bods out there willing to collaborate though... any takers?

====Useful Links====

''More for my own reference, but if you all want to use them I won't stop you:''

*[[Legacy:Mod Ideas/U-Replay|Mod Ideas/U-Replay]] - a little something I made earlier 
*''Keep-Or-Delete - The 'Save the Weather in London page poll'!!! '' - '''Too late, Tarq had his way before the people could speak :)'''

----
* http://www.tourofdutymod.com/ - A foundling mod for the halflife engine based on the vietnam war.
* Of course theres more to come!

====General Natterings====

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3211</id>
      <timestamp>2002-11-27T04:31:37Z</timestamp>
      <contributor>
        <ip>Mythopus</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">====M E ====

''(a little about)''

{|

|-
| style=&quot;text-align: right&quot; |'''''Name:'''''
|Ashley Lewis
|-
| style=&quot;text-align: right&quot; |'''D.O.B:'''
|18/03/82 - be sure and send me a birthday card!
|-
| style=&quot;text-align: right&quot; |'''Ocupation:'''
|Software Engineer for a little company called EDS
|-
| style=&quot;text-align: right&quot; |'''Location:'''
|Shropshire, UK
|-
| style=&quot;text-align: right&quot; |'''Contact:'''
|magicrabbit_@hotmail.com
|-
| style=&quot;text-align: right&quot; |'''Games:'''
|Unreal, UT, CounterStrike Tour of Duty (see links)
|-
| style=&quot;text-align: right&quot; |'''Mapping:'''
|Can't get used to Quake Engine mapping now that I've dabbled so long in UT's matrix methodology. I Love creating maps, but have never released one, taught myself a lot of knowledge since I first opened up UED. Fairly skilled with Studio MAX as well, and pretty good with photoshop, but my texture efforts with UT maps have been mainly adding dirt, features or team colours/symbols on someone else's base textures. I have a comprehensive graveyard of unfinished maps with some cool ideas in them, and they get progressively less cool the older the &quot;last modified&quot; date is :P
|-
| style=&quot;text-align: right&quot; |'''Hardware'''
|Athlon 1800+ on Epox 8k5a 2+ Mobo, 512Mb DDR2100 RAM, 60Gb ATA100 RAID-0 Array, GeForceII MX 400 (64Mb), SBLive 1024 - and a cable connection.
|}

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Projects]] I hope to keep this section up to date, appologies for any waywardness, I have a busy life :)

====Announcements====

''07 Nov: UT2k3!''

Sorry for the lack of updates i've been off in the land of Dead motherboards! Yep I finally got UT2003, opened up UED 3 and I must admit, I'm scared. I'm posting today an appeal for anyone interested in colaboration on a couple of maps, any offers considered. I'm an able mapper and an average modeler, but my texturing needs work. If you're interested (possibly looking at turning this into a full scale mapping team eventually) then post at the bottom in the general natterings section

''21 Nov: *Gasp* (Comes back up for air)''

Maaan this new manner of mapping takes some getting used to, I've been playing around with MAX and exporting some meshes for the past fortnight, and I think I got it sussed now! That said I also learned something about myself that I was in complete denial about before :) ... I cant do textures. Every time I've tried to build a texture myself to go on one of my meshes it ends up looking like something puked all over it! :( I don't expect I'll have a map ready for a couple of weeks yet. I'm still looking for any bods out there willing to collaborate though... any takers?

====Useful Links====

''More for my own reference, but if you all want to use them I won't stop you:''

*[[Legacy:Mod Ideas/U-Replay|Mod Ideas/U-Replay]] - a little something I made earlier 
*''Keep-Or-Delete - The 'Save the Weather in London page poll'!!! '' - '''Too late, Tarq had his way before the people could speak :)'''

----
* http://www.tourofdutymod.com/ - A foundling mod for the halflife engine based on the vietnam war.
* Of course theres more to come!

====General Natterings====

'''Mythopus:''' Y0 !  Well, I don't have UT2003 yet :( however I ''WILL'' get it ! Anewayz, you want a mapper and even though I've only made a few maps for Unreal and UT (only a few are actually good bcuz only in the last year i actually got goooood, realy good ;) ) and I think I could be an &quot;Able&quot; mapper for UT2003 too so if you still are interested... 

'''Flashman:''' Appologies for the lag in replying, I've been busy with the new editor and practicing my MEsh modelling/mapping skills. I'm certainly interested, how are you at texture work? have you got any examples of maps you'd be willing to pass my way?

'''Mythopus''': :( Sadly, my dad reformatted our hard drive bcuz of ram problems and he said he transfered all my other stuff (maps,tex packs, map macks ,etc.) on to our other computer (The computer I'd give anythin to get rid of ;) ) so it may take me awhile to get you a map, but I am great at lightning :D;) I assure you but when you say &quot;am I  good at texturing&quot; I'm like, wut do u mean?? I know how to texture and rotate tex's and pan them etc. so yea, reply soon :D:D:D

'''Flashman:''' Not exactly the ''application'' of textures, but the ''creation'' of fresh ones. It's an art in itself if you ask me and most professional outfits agree. Contributary skills to good texture building/creation include Photoshop or another image manipulation program and usually 3D design skills (Maya/3DStudio MAX/Lightwave)

'''Mythopus:''' Ah, I see.  In that case, I sadly am not good at that.  I probly would be, that is if I had photoshop or anything like that, I'm just stuck with lame old Windows Paint :'(

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Flashman/Projects</title>
    <id>1246</id>
    <revision>
      <id>3212</id>
      <timestamp>2002-10-15T18:59:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This will be my developers journal, with screenies of current projects and, if I get round to releasing any, links to the downloads.

=='''''??'''''-Carpark==

====Description====

As yet undecided as to what gametype this one will be, currently its 'narrowed down' to DM, CTF, or DOM, although its symmetrical I'd love to make this a CTF map, we'll just see how it goes.

====Status====

I'm doing the texturing lighting etc and adding the last few buildings outside, after adding the skybox decided I would let the players out of the carpark and into the surrounding scenery I had created, but didn't stop to think how much extra work I'd just given myself - D'OH!

====Screenshot====

There's one or two on their way in the next couple of days - promise!

====Comments====

''This is the bit where you all pass judgement on what you see. All criticisms and offers for help accepted :)''

'''Tarquin:''' BTW there's a gathering of journals at [[Legacy:Developer Journals|Developer Journals]]. I can move this page to be with those if you like :)

'''Flashman:''' '''''/Me blushes a n00b status''''' Yeah, if you could do that for me m8. Pleas forgive all my floundering about - but i'm getting there! :)

'''Flashman:''' ...Tarq? whats the going verdict on this page? It would be kinda nice to know :)

'''Tarquin:''' Up to you. It's fine having your own subpages for your stuff, plenty of people do it, including me. It's sort of an accident that journals are of the form &quot;Journals/User&quot; instead of &quot;user/Journal&quot;.  Might be more logical if we did it that way. I'll ponder. In the meantime, you can link to here from the Journals page, if you like. (renaming a page updates all links to it too, so that won't create extra work later)</text>
    </revision>
    <revision>
      <id>3213</id>
      <timestamp>2002-10-15T18:43:48Z</timestamp>
      <contributor>
        <ip>Flashman</ip>
      </contributor>
      <comment>Tarq?</comment>
      <text xml:space="preserve">This will be my developers journal, with screenies of current projects and, if I get round to releasing any, links to the downloads.

=='''''??'''''-Carpark==

====Description====

As yet undecided as to what gametype this one will be, currently its 'narrowed down' to DM, CTF, or DOM, although its symmetrical I'd love to make this a CTF map, we'll just see how it goes.

====Status====

I'm doing the texturing lighting etc and adding the last few buildings outside, after adding the skybox decided I would let the players out of the carpark and into the surrounding scenery I had created, but didn't stop to think how much extra work I'd just given myself - D'OH!

====Screenshot====

There's one or two on their way in the next couple of days - promise!

====Comments====

''This is the bit where you all pass judgement on what you see. All criticisms and offers for help accepted :)''

'''Tarquin:''' BTW there's a gathering of journals at [[Legacy:Developer Journals|Developer Journals]]. I can move this page to be with those if you like :)

'''Flashman:''' '''''/Me blushes a n00b status''''' Yeah, if you could do that for me m8. Pleas forgive all my floundering about - but i'm getting there! :)

'''Flashman:''' ...Tarq? whats the going verdict on this page? It would be kinda nice to know :)</text>
    </revision>
    <revision>
      <id>3214</id>
      <timestamp>2002-10-15T18:59:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This will be my developers journal, with screenies of current projects and, if I get round to releasing any, links to the downloads.

=='''''??'''''-Carpark==

====Description====

As yet undecided as to what gametype this one will be, currently its 'narrowed down' to DM, CTF, or DOM, although its symmetrical I'd love to make this a CTF map, we'll just see how it goes.

====Status====

I'm doing the texturing lighting etc and adding the last few buildings outside, after adding the skybox decided I would let the players out of the carpark and into the surrounding scenery I had created, but didn't stop to think how much extra work I'd just given myself - D'OH!

====Screenshot====

There's one or two on their way in the next couple of days - promise!

====Comments====

''This is the bit where you all pass judgement on what you see. All criticisms and offers for help accepted :)''

'''Tarquin:''' BTW there's a gathering of journals at [[Legacy:Developer Journals|Developer Journals]]. I can move this page to be with those if you like :)

'''Flashman:''' '''''/Me blushes a n00b status''''' Yeah, if you could do that for me m8. Pleas forgive all my floundering about - but i'm getting there! :)

'''Flashman:''' ...Tarq? whats the going verdict on this page? It would be kinda nice to know :)

'''Tarquin:''' Up to you. It's fine having your own subpages for your stuff, plenty of people do it, including me. It's sort of an accident that journals are of the form &quot;Journals/User&quot; instead of &quot;user/Journal&quot;.  Might be more logical if we did it that way. I'll ponder. In the meantime, you can link to here from the Journals page. (renaming a page updates all links to it too, so that won't create extra work later)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Flashpoint Black</title>
    <id>1254</id>
    <revision>
      <id>3232</id>
      <timestamp>2004-01-31T13:03:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Personal===

My name is David Hollingshead from Ohio, USA. I live in an apartment in a small boring town with my girlfriend. I just got a new rig... it's my real baby. Not incredibly top of the line, but it works for what I need it for. and more!

===My Rig===
*Windows 2000 Professional (Default Boot)
*Windows XP Home (Emergencies ONLY)
*AMD AthlonXP 2200+
*512MB DDR400 Crucial RAM
*60GB Western Digital Hard Drive
*30GB Western Digital Hard Drive

Sometime soon I'm going to be getting TWO 120GB, 8MB Cache Mitsumi Hard Drives... They'll be RAIDed together. :)

===Stage of Development===

Simply put, I'm a total newbie. My maps are all still very clumsy, but I'm working on it. Generally, all critisism is appriciated, because I need direction. treat me as a toddler! I can be pretty slow sometimes.

I haven't yet gotten UT2003, I've been mind-bogglingly short of funds as of late. which is part of the reason I decided to start making my own maps... it takes alot of time. :)

===Current Project===

[[Legacy:Map Ideas/DM-Theater|Map Ideas/DM-Theater]] - This is based off of a simple, old Musical Theater... (where one would go to see plays, not rock concerts)

===Other===

[[Legacy:Q+A|Q+A]]

----

'''Tarquin:''' Hi, welcome to the Unreal Wiki :) 

'''Flashpoint Black:''' Thanks, Tarquin. I hope to someday be able to contribute instead of sucking up knowledge like a smelly sponge!

'''Piglet:''' There's nothing wrong with sucking up knowledge :)

'''Mozzie:''' Ya, but I'd look into the Sponge thing... ;)

'''Flashpoint Black:''' Any chance we could delete this page? I've since dropped the project and lost interest...

'''Tarquin:''' Sure, I can delete it. But we have many pages of contributors who aren't around much any more, so it's just as fine to leave your page here until you pick UT up again, if ever. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3233</id>
      <timestamp>2004-01-31T11:09:41Z</timestamp>
      <contributor>
        <ip>User208.net1081.oh.sprint-hsd.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Personal===

My name is David Hollingshead from Ohio, USA. I live in an apartment in a small boring town with my girlfriend. I just got a new rig... it's my real baby. Not incredibly top of the line, but it works for what I need it for. and more!

===My Rig===
*Windows 2000 Professional (Default Boot)
*Windows XP Home (Emergencies ONLY)
*AMD AthlonXP 2200+
*512MB DDR400 Crucial RAM
*60GB Western Digital Hard Drive
*30GB Western Digital Hard Drive

Sometime soon I'm going to be getting TWO 120GB, 8MB Cache Mitsumi Hard Drives... They'll be RAIDed together. :)

===Stage of Development===

Simply put, I'm a total newbie. My maps are all still very clumsy, but I'm working on it. Generally, all critisism is appriciated, because I need direction. treat me as a toddler! I can be pretty slow sometimes.

I haven't yet gotten UT2003, I've been mind-bogglingly short of funds as of late. which is part of the reason I decided to start making my own maps... it takes alot of time. :)

===Current Project===

[[Legacy:Map Ideas/DM-Theater|Map Ideas/DM-Theater]] - This is based off of a simple, old Musical Theater... (where one would go to see plays, not rock concerts)

===Other===

[[Legacy:Q+A|Q+A]]

----

'''Tarquin:''' Hi, welcome to the Unreal Wiki :) 

'''Flashpoint Black:''' Thanks, Tarquin. I hope to someday be able to contribute instead of sucking up knowledge like a smelly sponge!

'''Piglet:''' There's nothing wrong with sucking up knowledge :)

'''Mozzie:''' Ya, but I'd look into the Sponge thing... ;)

'''Flashpoint Black:''' Any chance we could delete this page? I've since dropped the project and lost interest...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fleshsniper1</title>
    <id>1293</id>
    <revision>
      <id>3302</id>
      <timestamp>2008-03-13T18:32:40Z</timestamp>
      <contributor>
        <ip>Adsl-68-127-116-19.dsl.frsn02.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Everything has changed, dont know if this page is of any use to me anymore.</text>
    </revision>
    <revision>
      <id>3303</id>
      <timestamp>2007-07-28T06:23:10Z</timestamp>
      <contributor>
        <ip>Fleshsniper1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What is up! I got a personal page up all thanks to this open minded wiki. Who am i? Just another guy who wants to make a game. Below here is my mod's info. Ill try to make my page more sexier when i have the time. I barely know the syntax of this wiki, and most of the awesome formating was done by another user. So, thanks to him.

==Flesh==

===Introduction===

I am making this game for fun. I plan to take over 1 year to get a fully complete version done, meaning all class and core features are implemented. I can do this all by myself but help will be appreciated in scripting.

Here is the style I will be using and yes they are mine.

&lt;img src=&quot;http://img261.imageshack.us/img261/1323/demoncompleteunrealzp4.png&quot; border=&quot;0&quot; alt=&quot;Image Hosted by ImageShack.us&quot;/&gt;

From here on is just my doc... Please comment and give advice or ask questions. I now have internet connection :).

===CREATURES===

{|

|-
|Demons
|300HP
|Demons lurk around in the dark and can manifest into physical form from shadows, when they are mad they can be very fast. 
|-
|Huge demons
|500HP
|See 'Demons'. 
|-
|Fiends
|500HP
|Fiends are like gods or demi gods. 
|-
|Huge Fiends
|900HP
|See 'Fiends'. 
|-
|Spirits
|500HP
|Opaqe beings, a form of life or energy. 
|-
|Zombies
|200HP
|Things that died recently and brought back to life by dark forces. 
|-
|Ghouls
|200HP
|Creatures that died in a situation that obstructed the proper way of dieing and are lost and stuck in a unseen realm. 
|-
|Huge Ghouls
|300hp
|See 'Ghouls'. 
|-
|Humans
|100HP
|Beings that are pitiful and ignorant X). 
|-
|Soilders
|100HP
|Most ignorant form of human ;\. 
|-
|Vagabonds
|100HP
|Lone wanderer. 
|-
|Rebels
|100HP
|One or many people going against the system. 
|-
|Wanderers
|100HP
|one or many people with no home. 
|-
|Bandits
|100HP
|One or many people who steal from others. 
|-
|Lonewolf
|-
|A respected lone wanderer. 
|-
|Shamans
|100HP
|Ancient art develope to protect humans from unseen unknown forces. 
|-
|Lions
|300HP
|Animal found mostly in Africa. 
|-
|Bears
|200HP
|Animal found near woods. 
|-
|Large bears
|300HP
|See 'Bears'. 
|-
|Dogs
|100HP
|Animal found in citys 'man's best friend'. 
|-
|Cats
|50HP
|Animal found in citys. 
|-
|Rats
|50HP
|Animal found in city sewers and anywhere. 
|-
|Birds
|30HP
|Animal found anywhere there is life or food, they are mostly found in trees and the sky where they roam. 
|-
|Mouse
|30HP
|Animal found near human homes. 
|}

===Controlling The Fighter===

{|

|-
|R1
|LOCK-ON
|Lock on to target, hold JUMP to sway in any desire direction (counter by attacking right after they attack), hold JUMP and INTERACT to roll out of the way, hold INTERACT to block (deflect by interacting apon contact, by deflecting you slow them down 2x for 1 sec)
|-
|L1+down
|SPECIAL ABILITY
|Press down while holding down L1 to select different ability catagorys and press right to select ability
|-
|L1+R1
|CAMERA CHANGE
|Switch between 3rd person or first person or dream view
|-
|L1+square
|THROW
|Throw things
|-
|L1+triangle
|PICK UP
|Pick up for 'hand' use or 'bag' storage
|-
|L2
|SWITCH RANGE
|Choose different range weapon
|-
|R2
|SWITCH MELEE
|Choose different melee weapon
|-
|square
|RANGE ATTACK
|Attack with range weapon
|-
|triangle
|MELEE ATTACK
|Attack with melee, hold on to any attack to add 20HP damage, the attack will charge and take 2x longer to execute - no SFX
|-
|circle
|INTERACT
|Open doors, talk, grab on edges, investigate/activate
|-
|x
|JUMP
|Jump up to 3 or 5 feet, rocketjet from walls, jump on wall to reach higher places, backflips and combinations
|-
|Select
|SELECT MODE
|Change controller mode
|}

===Damage Effect===
*There are vital organs for target - brain, heart, jaw, private, liver, thigh, chest, and the nonvital parts.
*The first and third chance of Damage Effect is 10% each.

brain and heart shots - 50/200/300HP

jaw shots - 30/100/200HP

private and liver shots - 50/100/200HP

thigh and chest - 30/50/90HP

nonvital parts - 20/30/50HP

'''Gun Damage''' - HANDGUN, REVOLVER2x, SHOTGUN3x, RIFLE SMALL2x, RIFLE HUGE3x, SNIPER4x, EXTREME SNIPER5X, BAZOOKA7x+5, GRENADE5x, ROCKET10x+5x, MISSLE12X+5x|

===Gameplay===

{|

|-
|Realistic gameplay
|No double jumping, no running 35mph, no fake moves/movement that defy human physics. 
|-
|Realtime gameplay
|Inventory/option access, magic and summoning, fighting, interaction, choose weapon in realtime. 
|-
|Camera view
|First person camera will be right on player character's 2 eyes. third person and dream view can all be changed anytime during gameplay. 
|-
|LOCK-ON mode
|In first person camera it turns into zoom mode, you cant sprint. 
|-
|Multiple controller mode
|One for fighting, one for interacting, and one for driving. 
|-
|Hit walls
|Be careful of your surroundings, with barehands you will bleed and lose health, with weapons you will lose weapon quality. 
|-
|Limbs all over
|Cut and blow limbs apart. 
|}

===Interaction and Features===
*pick up limited bags to carry extra items
*real world interaction - climb, collusion, interact, and move just about anything, pick up, throw
*real world destruction - destroy just about anything
*special ability - spit, throw up, refuse, accept, good, bad
*store items anywhere - engine will remember where everything is and what stat it had. this data will be stored on HD or memory card
*equip unequip everything
*all traveling possibility, cars, bike, motocycle, helicopter, small plane, jet... horsy too

===Skills===

'''blacksmith''' - lets you restore nongun weapons and enchance your weapon

'''carsmith''' - lets you restore cars and enchance your car

'''gunsmith''' - lets you restore guns and create ammo and enchance either

----

[[:Category:Legacy Personal Page]]

----

==Discussion==

'''MythOpus:''' Could you please format this page up and possibly resize the pictures just a bit?

'''fleshsniper1''' I dont know the syntax/code for wikis, and i dont have internet access to learn it with my limited time. But in time i will fix it peace by peace. I just wanted to get it up for advice and comments. And i resized the picture smaller :) And i even tried to reformat it the best i can.

'''MythOpus:''' I took the time to format the best I can.  Please read over it to make sure everything is in good order, especially the 'Guns' heading.  When you have the time, I strongly suggest reading over [[Legacy:Wiki Markup|Wiki Markup]] as it shows you how to do things with the syntax and what not.  I was looking over your keys and realized they were for game controllers.  Will this mod be only available for PC users who have game controllers?  Please give more details :)

'''fleshsniper1''' X) Amazing! I was breathless to come back and find this great edit. Thanks so much MythOpus i will remember this great deed of yours :) No you dont need a controller, i just have a habit of using the PXS controller for layout. It will be for the keyboards too.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Floater Fan</title>
    <id>1238</id>
    <revision>
      <id>3195</id>
      <timestamp>2006-04-07T07:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">The &quot;floater fan&quot; is essentially a powerful, vertical wind tunnel that will blow an object that enters it upward. It is quite easy to implement and is an interesting alternative to a lift, kicker, or teleporter.

===Implementation in UT2003===

To make the floater fan &quot;blow&quot; actors around, you must make a physics volume in the shape of the area you want to be affected by the fan. This area can be as large or as small as you like, but generally a roughly cylindrical shape extending from the origin of the &quot;fan&quot; effect. (usually the fan itself) Then, set the gravity in the volume to an appropriate setting based on the power and facing of the fan. You can set a terminalvelocity if you want a more precise exit velocity, otherwise the exit velocity will generally depend on the entrance velocity and the length of time spent in the wind tunnel.

You will also probrably want to add a visual effect for the wind tunnel. This can be done by using a static mesh of a duct opening or a static mesh or mesh of an actual fan blade, with an appropriate rotation and physics type applied to it. To give more of an impression of the power of the fan you can add an emitter with bits of dust and whatnot coming out to make a visual &quot;wind&quot; effect.

===Implementation in Unreal or Unreal Tournament===

Similar to the UT2003 implementation, this is made instead by zoning off the area that the floater fan should affect. The ZoneGravity and TerminalVelocity settings of the new zone's ZoneInfo can then be set appropriately. ZoneVelocity can be used instead of ZoneGravity to make a more precise exit velocity.

To make a visual effect for the wind tunnel you will generally use a decoration, though a BSP-based &quot;grate&quot; could also suffice if that is your preference. Again, if it is a fan blade decoration you will likely want to make it rotate to get the best effect.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Provide links to this page from appropriate places.  Make into more of a tutorial.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3196</id>
      <timestamp>2005-12-02T23:42:37Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The &quot;floater fan&quot; is essentially a powerful, vertical wind tunnel that will blow an object that enters it upward. It is quite easy to implement and is an interesting alternative to a lift, kicker, or teleporter.

===Implementation in UT2003===

To make the floater fan &quot;blow&quot; actors around, you must make a physics volume in the shape of the area you want to be affected by the fan. This area can be as large or as small as you like, but generally a roughly cylindrical shape extending from the origin of the &quot;fan&quot; effect. (usually the fan itself) Then, set the gravity in the volume to an appropriate setting based on the power and facing of the fan. You can set a terminalvelocity if you want a more precise exit velocity, otherwise the exit velocity will generally depend on the entrance velocity and the length of time spent in the wind tunnel.

You will also probrably want to add a visual effect for the wind tunnel. This can be done by using a static mesh of a duct opening or a static mesh or mesh of an actual fan blade, with an appropriate rotation and physics type applied to it. To give more of an impression of the power of the fan you can add an emitter with bits of dust and whatnot coming out to make a visual &quot;wind&quot; effect.

===Implementation in Unreal or Unreal Tournament===

Similar to the UT2003 implementation, this is made instead by zoning off the area that the floater fan should affect. The ZoneGravity and TerminalVelocity settings of the new zone's ZoneInfo can then be set appropriately. ZoneVelocity can be used instead of ZoneGravity to make a more precise exit velocity.

To make a visual effect for the wind tunnel you will generally use a decoration, though a BSP-based &quot;grate&quot; could also suffice if that is your preference. Again, if it is a fan blade decoration you will likely want to make it rotate to get the best effect.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Provide links to this page from appropriate places.  Make into more of a tutorial.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3197</id>
      <timestamp>2006-04-06T21:06:00Z</timestamp>
      <contributor>
        <ip>CDN-CE-INFLOW-T2-06.inflow.pa.bo.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">The &quot;floater fan&quot; is essentially a powerful, vertical wind tunnel that will blow an object that enters it upward. It is quite easy to implement and is an interesting alternative to a lift, kicker, or teleporter.

===Implementation in UT2003===

To make the floater fan &quot;blow&quot; actors around, you must make a physics volume in the shape of the area you want to be affected by the fan. This area can be as large or as small as you like, but generally a roughly cylindrical shape extending from the origin of the &quot;fan&quot; effect. (usually the fan itself) Then, set the gravity in the volume to an appropriate setting based on the power and facing of the fan. You can set a terminalvelocity if you want a more precise exit velocity, otherwise the exit velocity will generally depend on the entrance velocity and the length of time spent in the wind tunnel.

You will also probrably want to add a visual effect for the wind tunnel. This can be done by using a static mesh of a duct opening or a static mesh or mesh of an actual fan blade, with an appropriate rotation and physics type applied to it. To give more of an impression of the power of the fan you can add an emitter with bits of dust and whatnot coming out to make a visual &quot;wind&quot; effect.

===Implementation in Unreal or Unreal Tournament===

Similar to the UT2003 implementation, this is made instead by zoning off the area that the floater fan should affect. The ZoneGravity and TerminalVelocity settings of the new zone's ZoneInfo can then be set appropriately. ZoneVelocity can be used instead of ZoneGravity to make a more precise exit velocity.

To make a visual effect for the wind tunnel you will generally use a decoration, though a BSP-based &quot;grate&quot; could also suffice if that is your preference. Again, if it is a fan blade decoration you will likely want to make it rotate to get the best effect.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Provide links to this page from appropriate places.  Make into more of a tutorial.

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlockMasterPawn</title>
    <id>28306</id>
    <revision>
      <id>39963</id>
      <timestamp>2009-11-14T18:27:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlockPawn</title>
    <id>1236</id>
    <revision>
      <id>3189</id>
      <timestamp>2004-02-16T15:25:56Z</timestamp>
      <contributor>
        <ip>208.177.55.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; FlockPawn}}

These are quite easy, so i dont know why no-one did them before:

The flockpawns are:
*Bird1
*BiterFish
*Bloblet
*Horsefly
*NaliRabbit

All of these (except the rabbit and the bird) need a [[Legacy:FlockMasterPawn|FlockMasterPawn]] to work.

Heres how to use them all:

===The Amoeba (Bloblet)===

This is the most complicated flockpawn, and has only ever been used properly once (I think).

To work it, place several Bloblet actors in one area, then place the ParentBlob pawn (the controller of the bloblets) in the middle of the group.  Open the propertys of all the bloblets + the parentblob and change them to the same tag, add several triggers around your map and set the event to the amoeba's tag (to keep it constantly agressive) and there you have a working amoeba!

Note: I dont know if this works online, but it does offline.

===Biter Fish===

These are easier than bloblets, you just simply put the [[Legacy:FlockMasterPawn|FlockMasterPawn]] in the level, then change the properties to control the number of fish, the fact that they are violent, and how far the fish swim from the master pawn.  Horseflies work in the same way

===Birds and Nali Rabbits===

These are the easiest to work.  Just place them in the level and watch them go!  no master pawn needed

'''Ghost:''' With regards to the FlockMasterPawn Bird1, is it possible to export the Bird1 animation along with it's script sequence from UT over to UT2003?  

'''Wormbo:''' You might be able to export it with the [[Legacy:WOTgreal|WOTgreal]] exporter or with the [[Legacy:UT Package Tool|UT Package Tool]]. To import it just use the [[Legacy:Exec Directive|exec directive]]s of the Bird1 class.

'''Ghost:''' That worked, thanks.

==Related Topics ==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3190</id>
      <timestamp>2003-12-24T20:52:11Z</timestamp>
      <contributor>
        <ip>Wc11.mtnk.rnc.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; FlockPawn}}

These are quite easy, so i dont know why no-one did them before:

The flockpawns are:
*Bird1
*BiterFish
*Bloblet
*Horsefly
*NaliRabbit

All of these (except the rabbit and the bird) need a [[Legacy:FlockMasterPawn|FlockMasterPawn]] to work.

Heres how to use them all:

===The Amoeba (Bloblet)===

This is the most complicated flockpawn, and has only ever been used properly once (I think).

To work it, place several Bloblet actors in one area, then place the ParentBlob pawn (the controller of the bloblets) in the middle of the group.  Open the propertys of all the bloblets + the parentblob and change them to the same tag, add several triggers around your map and set the event to the amoeba's tag (to keep it constantly agressive) and there you have a working amoeba!

Note: I dont know if this works online, but it does offline.

===Biter Fish===

These are easier than bloblets, you just simply put the [[Legacy:FlockMasterPawn|FlockMasterPawn]] in the level, then change the properties to control the number of fish, the fact that they are violent, and how far the fish swim from the master pawn.  Horseflies work in the same way

===Birds and Nali Rabbits===

These are the easiest to work.  Just place them in the level and watch them go!  no master pawn needed

'''Ghost:''' With regards to the FlockMasterPawn Bird1, is it possible to export the Bird1 animation along with it's script sequence from Unrealed 2 (Unreal Tournament) over to Unrealed 3 (UT2003)? Any help on this would be greatly appreciated... 

'''Wormbo:''' You might be able to export it with the [[Legacy:WOTgreal|WOTgreal]] exporter or with the [[Legacy:UT Package Tool|UT Package Tool]]. To import it just use the [[Legacy:Exec Directive|exec directive]]s of the Bird1 class.

&lt;em class=&quot;em2&quot;&gt;Ghost:&lt;/em&gt; Woaaah.... the WOTgreal exporter is very cool. I've been trying to figure out how to get access to the unrealshare.u file in UT and this program appears to do exactly that. Thanks!

&lt;em class=&quot;em2&quot;&gt;Ghost:&lt;/em&gt; Hmmm... The exporter worked fine but for some reason I can't seem to figure out how to successfully import the bird into UT2003. Of course I've never been a prodigy at script. Hey Wormbo, any chance you could walk me through it? All I need is to get the bird into my map and have it circle while flapping it's wings. I've exported the files and I now have 4 folders: Classes, images, models and sounds. Each with the appropriate files. Now what do I do? Help!

==Related Topics ==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3191</id>
      <timestamp>2003-12-29T21:13:28Z</timestamp>
      <contributor>
        <ip>208.177.55.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; FlockPawn}}

These are quite easy, so i dont know why no-one did them before:

The flockpawns are:
*Bird1
*BiterFish
*Bloblet
*Horsefly
*NaliRabbit

All of these (except the rabbit and the bird) need a [[Legacy:FlockMasterPawn|FlockMasterPawn]] to work.

Heres how to use them all:

===The Amoeba (Bloblet)===

This is the most complicated flockpawn, and has only ever been used properly once (I think).

To work it, place several Bloblet actors in one area, then place the ParentBlob pawn (the controller of the bloblets) in the middle of the group.  Open the propertys of all the bloblets + the parentblob and change them to the same tag, add several triggers around your map and set the event to the amoeba's tag (to keep it constantly agressive) and there you have a working amoeba!

Note: I dont know if this works online, but it does offline.

===Biter Fish===

These are easier than bloblets, you just simply put the [[Legacy:FlockMasterPawn|FlockMasterPawn]] in the level, then change the properties to control the number of fish, the fact that they are violent, and how far the fish swim from the master pawn.  Horseflies work in the same way

===Birds and Nali Rabbits===

These are the easiest to work.  Just place them in the level and watch them go!  no master pawn needed

'''Ghost:''' With regards to the FlockMasterPawn Bird1, is it possible to export the Bird1 animation along with it's script sequence from Unrealed 2 (Unreal Tournament) over to Unrealed 3 (UT2003)? Any help on this would be greatly appreciated... 

'''Wormbo:''' You might be able to export it with the [[Legacy:WOTgreal|WOTgreal]] exporter or with the [[Legacy:UT Package Tool|UT Package Tool]]. To import it just use the [[Legacy:Exec Directive|exec directive]]s of the Bird1 class.

&lt;em class=&quot;em2&quot;&gt;Ghost:&lt;/em&gt; Woaaah.... the WOTgreal exporter is very cool. I've been trying to figure out how to get access to the unrealshare.u file in UT and this program appears to do exactly that. Thanks!

&lt;em class=&quot;em2&quot;&gt;Ghost:&lt;/em&gt; Hmmm... The exporter worked fine but for some reason I can't seem to figure out how to successfully import the bird into UT2003. Of course I've never been a prodigy at script. Hey Wormbo, (or anyone else) any chance you could walk me through it? All I need is to get the bird into my map and have it circle while flapping it's wings. I've exported the files and I now have 4 folders: Classes, images, models and sounds. Each with the appropriate files. Now what do I do? Help!

==Related Topics ==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Flow Syntax</title>
    <id>1225</id>
    <revision>
      <id>3165</id>
      <timestamp>2006-07-18T06:57:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==Basics ==

There are two basic flow control functions in [[Legacy:UnrealScript|UnrealScript]], ''GoTo'' and ''If...Else''.

Any other functions and loops described here (except ''ForEach'') could be replaced by combinations of these two functions (In fact, that happens in UnrealScript byte code for ''While'', ''For'' and ''Do...Until'' loops.), but it's considered bad coding practise to actually do so.

If a loop, ''If'' or ''Else'' contains only one line of code the '''{ }''' are optional. A single loop, ''If'' or ''Switch'' statement is treated as one command in this context.

Example:

&lt;uscript&gt;
If ( bExecute )
    For (i = 0; i &lt; 5; i++) {
        a += i;
        b *= i;
    }
&lt;/uscript&gt;

'''Note:''' Due to a compiler bug it is not possible to use a loop (&lt;tt&gt;for&lt;/tt&gt;, &lt;tt&gt;while&lt;/tt&gt;, ...) as the statement in a simple &lt;tt&gt;else&lt;/tt&gt; statement.

&lt;uscript&gt;
if (foo)
  bar();
else // Doesn't work, compiler error!
  for (i = 0; i &lt; 10; i++) {
    blargh(i);
  }
&lt;/uscript&gt;

You have to use a &quot;block-else&quot; instead, i.e.:

&lt;uscript&gt;
if (foo)
  bar();
else { // Actually the same thing, but works!
  for (i = 0; i &lt; 10; i++) {
    blargh(i);
  }
}
&lt;/uscript&gt;

Stand-alone blocks, i.e. statements grouped in '''{ }''', are not allowed in UnrealScript.

==Special Flow Commands ==

===Return ''expression'' ===

The ''return'' keyword terminates execution of the function in which it appears and returns control (and the value of ''expression'' if given) to the calling function or state.

If the function returns a certain type of value the return value has to be specified in the ''return'' command. If a function with a return value ends without ''return'' it will return a null value for its data type. (e.g. &lt;code&gt;0&lt;/code&gt;, empty string, &lt;code&gt;None&lt;/code&gt;, etc.)

===Break ===

The ''break'' keyword terminates the smallest enclosing ''do'', ''for'', ''foreach'', ''switch'' or ''while'' statement in which it appears. Code execution continues with the next line of code after the loop.

Example:

&lt;uscript&gt;
for ( Inv=Pawn.Inventory; Inv!=None; Inv=Inv.Inventory ) //Iterating through the inventory list
{
      if( Inv != None &amp;&amp; Inv.InventoryGroup == 1) //If there is an inventory item in Group 1 then...
      {
         //Destroy that item.  That item will become 'None' after that, and will
         //Magically create an 'Accessed None' Error
         Inv.Destroy();
	 break;  //To crush that Accessed none error, you must 'break'
      }
}
&lt;/uscript&gt;

Unlike some other languages (e.g. Java or Perl) UnrealScript does '''not''' support the &lt;tt&gt;break ''label'';&lt;/tt&gt; syntax to break the loop with the specified label.

===Continue ===

The continue keyword passes control to the next iteration of the smallest enclosing ''do'', ''for'', ''foreach'' or ''while'' statement in which it appears.

Example:

&lt;uscript&gt;
While (i &lt; 10) {
    if ( i % 2 == 0 )
        Continue;
    log(i);
}
&lt;/uscript&gt;

Unlike some other languages (e.g. Java or Perl) UnrealScript does '''not''' support the &lt;tt&gt;continue ''label'';&lt;/tt&gt; syntax to skip to the next iteration of the loop with the specified label.

===Stop ===

Imediately stops execution of [[Legacy:State|State]] code. This is like the ''return'' command for states.

===Assert (''expression'') ===

If the expression passed to ''Assert'' evaluates to &lt;tt&gt;False&lt;/tt&gt;, the game shuts down with an error message telling you the file (class) and the line the ''Assert'' call is in.

Example:

&lt;uscript&gt;
Assert(numPlayers &gt; 0);
&lt;/uscript&gt;

==GoTo (''label'') ==

Continues code execution at the specified label. ''GoTo'' is mainly used in state code, but is also allowed within functions, although it is rarely used there. For state flow there's also GotoState( Statename, label): see [[Legacy:State|state]] for more on this.

Syntax:

&lt;uscript&gt;GoTo('label');&lt;/uscript&gt;

Example:

&lt;uscript&gt;
State Idle
{
Begin:
    PlayIdleAnim();
    FinishAnim();
    Sleep(0.5);
    GoTo('Begin');
}
&lt;/uscript&gt;

In UT2004 case the goto syntax varies. In function code the parentheses are invalid, apostrophes are optional. In state code the parentheses are optional, apostrophes are required. Therefore the syntax that's valid in both types of code is:&lt;uscript&gt;GoTo 'label';&lt;/uscript&gt;

==If Statements ==

''If'' statements execute some code if a certain condition is true. The optional ''Else'' part executes some other code if the condition is false. Multiple ''If...Else'' statements can be combined to create ''If...ElseIf...Else'' statements.

Syntax:

&lt;uscript&gt;
// single line if:
if ( condition )
   // statement

// simple block if:
if ( condition ) {
   ...
}
// if...else:
if ( condition ) {
   ...
}
else {
   ...
}&lt;/uscript&gt;

Example:

(The second ''If'' is the command executed if the first condition is false.)

&lt;uscript&gt;
If ( Pawn(Owner) != None &amp;&amp; Pawn(Owner).bIsPlayer ) {
    log(Pawn(Owner).PlayerReplicationInfo.PlayerName);
    Pawn(Owner).PlayerReplicationInfo.Score += 2;
}
Else If ( Pawn(Owner) != None )
    Owner.Destroy();
Else
    log(&quot;No Pawn.&quot;);
&lt;/uscript&gt;

==Switch Statements ==

''Switch'' statements can be used to check if a certain expression is set to one of several values.

Syntax:

&lt;uscript&gt;
Switch ( expression ) {
Case value1:
    ...
    break;
Case value2:
Case value3:
    ...
    break;
Default:
    ...
    break;
}&lt;/uscript&gt;

In this example a variable ''i'' is checked. If its value is 1 the DoSomething function is called and code execution continues below the ''Switch'' statement. If its value is 2 or 3 both DoSomethingElse and DoSomethingMore are called and the current function is canceled (due to the ''return'' command). If the value of ''i'' is 4 only the DoSomethingMore function is called and the current function is canceled. If ''i'' has a different value the DoNothingSpecial function is called and code execution continues below the ''Switch'' statement.

Note that without a break; or return; at the end of a case, execution will simply fall through to the next case's statements.

Example:

&lt;uscript&gt;
Switch (i) {
Case 1:
    DoSomething();
    break;
Case 2:
Case 3:
    DoSomethingElse();
Case 4:
    DoSomethingMore();
    return;
Default:
    DoNothingSpecial();
    break;
}
&lt;/uscript&gt;

==While Loops ==

''While'' loops are executed as long as the condition stays true. If the condition is false before the loop starts, the whole ''While'' loop is not executed.

Syntax:

&lt;uscript&gt;
While ( condition ) {
    ...
}&lt;/uscript&gt;

'''Note:''' Due to a compiler bug it is possible to append an ''Until(...);'' clause to a ''While'' loop, effectively turning it into a loop with two conditions &amp;ndash; one executed before and one after each iteration. Please don't use this &quot;feature&quot; though, it might be removed in the future.

==For Loops ==

''For'' loops can be used similar to ''While'' loops. The ''InitialCommand'' is executed before the first loop cycle starts, ''LoopCondition'' is checked before each (including the first) loop cycle and ''UpdateCommand '' is executed at the end of every loop cycle. The ''For'' loop is executed as long as the condition stays true, but it will not be executed at all if the condition initially is false.

Syntax:

&lt;uscript&gt;
For ( InitialCommand; LoopCondition; UpdateCommand ) {
    ...
}&lt;/uscript&gt;

Unlike other languages, UnrealScript does '''not''' accept multiple statements as ''InitialCommand'' or ''UpdateCommand''. Additional initial commands must be added above the loop. Attempting to use multiple update commands can become very tricky if you want to use the '''Continue''' statement, but if you don't need '''Continue''' you can just add the additional update commands as the last statements of the '''For''' statement block.

Also unlike other languages, UnrealScript does not allow empty statements as ''InitialCommand'', ''LoopCondition'' or ''UpdateCommand''. Consider using a '''While''' loop instead if you don't need initial ''InitialCommand'' or ''UpdateCommand''.

''For'' loops can be used to make simple loops with a counter or to iterate through a linked list.

Examples:

&lt;uscript&gt;
For (i = 0; i &lt; 10; i++) {
    ...
}
&lt;/uscript&gt;

The above example will execute for i = 0, 1, ... 9. The endgame scenario is: 
* execute loop for 9
* increment i to 10
* start from the top: check i and it fails the condition; so move on.

The following example loops through all [[Legacy:Pawn (UT)|Pawns]] in the level: (works only server-side)

&lt;uscript&gt;
For (P = Level.PawnList; P != None; P = P.NextPawn) {

    ...
}
&lt;/uscript&gt;

If you were to rewrite a For loop only with If and GoTo statements, it would probably look similar to this:

&lt;uscript&gt;
InitialCommand;
beginloop:
if (LoopCondition) {

  /* loop code block */

continuetarget: // this is where a 'continue' statement would jump to
  UpdateCommand;
  goto 'beginloop';
}
breaktarget: // this is where a 'break' statement would jump to
&lt;/uscript&gt;

==Do...Until Loops ==

''Do...Until'' loops are always executed at least once. The loop stops if the condition becomes true.

Syntax:

&lt;uscript&gt;
Do {
    ...
} Until ( condition );
&lt;/uscript&gt;

Example:

&lt;uscript&gt;
Do {
    log(i);
} Until (i++ &gt; 10);
&lt;/uscript&gt;

'''Note:''' Due to a compiler bug you can leave out the '''Until''' clause, effectively turning this into an infinite loop. It is not recommended to use this &quot;feature&quot; since it will probably be fixed in the future, but if you do you will have to add a '''Break''' or '''Return''' somewhere in the loop.

==ForEach Loops ==

''ForEach'' uses an [[Legacy:Iterator|iterator]] function to loop through a list of actors.

Syntax:

&lt;uscript&gt;
ForEach IteratorFunction(BaseActorClass, IteratorVariable, IteratorParameters) {
    ...
}&lt;/uscript&gt;

''IteratorFunction'' must be a valid reference to a native function with the &lt;code&gt;iterator&lt;/code&gt; [[Legacy:Function Syntax|specifier]].

The first example iterates through all HUD actors in the map.&lt;br /&gt;The second one iterates through all projectiles, which are in the same zone like the actor calling the ''ForEach'' loop.

Examples:

&lt;uscript&gt;
ForEach AllActors(class'HUD', H) {
    ...
}
&lt;/uscript&gt;

&lt;uscript&gt;
ForEach Region.Zone.ZoneActors(class'Projectile', P) {
    ...
}
&lt;/uscript&gt;

'''Note:''' If you access the iterator function through an object reference, make absolutely sure the reference is valid, becasue this is the only place where accessing &lt;tt&gt;None&lt;/tt&gt; will not generate a warning but actually crash the game.

Another example for using ''ForEach'':

RadiusActors - ''argument 1'' actors (stored in ''argument 2'' variable) which are in the ''argument 3'' radius of the calling actor.

&lt;uscript&gt;
ForEach RadiusActors(class'Projectile', P, 128) {
    ...
}
&lt;/uscript&gt;

==Discussion ==

'''EricBlade:''' I've never seen the 'stop' keyword.  Does that return the object to it's default state (auto state, or no state)? Or does it remain in that state, with no state code running?

'''Wormbo:''' 'Stop' simply halts state code execution without changing states. There's actually an implicit 'Stop' after the last code statement in every state that contains state code.

'''Sweavo:''' [[Legacy:UnrealScript Language Reference/Program Structure|UnrealScript Language Reference/Program Structure]] covers much of this material and it much prettier.  I'm inclined to remove the subjects from here that are covered there then see what's left and refocus the page...?

'''Wormbo:''' [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]] is only a copy of an Epic Games document that we are allowed to host here but not modify. This page here is our own description of these language constructs and it's much easier to link to from other pages.

'''Kartoshka:''' Just before the &quot;Special Flow Commands&quot; section there is a partial sentence &quot;Statement blocks of&quot;. Is that just something that got left in one edit, or left out? I have no idea if it was important anyway...

'''Wormbo:''' I don't know what I wanted to write there. Removed it.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Special UnrealScript Keywords|Special UnrealScript Keywords]]
** [[Legacy:Iterator|Iterator]]
** [[Legacy:State|State]]
* [[Legacy:UnrealScript Language Reference/Program Structure|UnrealScript Language Reference/Program Structure]]</text>
    </revision>
    <revision>
      <id>3166</id>
      <timestamp>2006-06-22T14:55:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Basics ==

There are two basic flow control functions in [[Legacy:UnrealScript|UnrealScript]], ''GoTo'' and ''If...Else''.

Any other functions and loops described here (except ''ForEach'') could be replaced by combinations of these two functions (In fact, that happens in UnrealScript byte code for ''While'', ''For'' and ''Do...Until'' loops.), but it's considered bad coding practise to actually do so.

If a loop, ''If'' or ''Else'' contains only one line of code the '''{ }''' are optional. A single loop, ''If'' or ''Switch'' statement is treated as one command in this context.

Example:

&lt;uscript&gt;
If ( bExecute )
    For (i = 0; i &lt; 5; i++) {
        a += i;
        b *= i;
    }
&lt;/uscript&gt;

'''Note:''' Due to a compiler bug it is not possible to use a loop (&lt;tt&gt;for&lt;/tt&gt;, &lt;tt&gt;while&lt;/tt&gt;, ...) as the statement in a simple &lt;tt&gt;else&lt;/tt&gt; statement.

&lt;uscript&gt;
if (foo)
  bar();
else // Doesn't work, compiler error!
  for (i = 0; i &lt; 10; i++) {
    blargh(i);
  }
&lt;/uscript&gt;

You have to use a &quot;block-else&quot; instead, i.e.:

&lt;uscript&gt;
if (foo)
  bar();
else { // Actually the same thing, but works!
  for (i = 0; i &lt; 10; i++) {
    blargh(i);
  }
}
&lt;/uscript&gt;

Stand-alone blocks, i.e. statements grouped in '''{ }''', are not allowed in UnrealScript.

==Special Flow Commands ==

===Return ''expression'' ===

The ''return'' keyword terminates execution of the function in which it appears and returns control (and the value of ''expression'' if given) to the calling function or state.

If the function returns a certain type of value the return value has to be specified in the ''return'' command. If a function with a return value ends without ''return'' it will return a null value for its data type. (e.g. &lt;code&gt;0&lt;/code&gt;, empty string, &lt;code&gt;None&lt;/code&gt;, etc.)

===Break ===

The ''break'' keyword terminates the smallest enclosing ''do'', ''for'', ''foreach'', ''switch'' or ''while'' statement in which it appears. Code execution continues with the next line of code after the loop.

Example:

&lt;uscript&gt;
for ( Inv=Pawn.Inventory; Inv!=None; Inv=Inv.Inventory ) //Iterating through the inventory list
{
      if( Inv != None &amp;&amp; Inv.InventoryGroup == 1) //If there is an inventory item in Group 1 then...
      {
         //Destroy that item.  That item will become 'None' after that, and will
         //Magically create an 'Accessed None' Error
         Inv.Destroy();
	 break;  //To crush that Accessed none error, you must 'break'
      }
}
&lt;/uscript&gt;

Unlike some other languages (e.g. Java or Perl) UnrealScript does '''not''' support the &lt;tt&gt;break ''label'';&lt;/tt&gt; syntax to break the loop with the specified label.

===Continue ===

The continue keyword passes control to the next iteration of the smallest enclosing ''do'', ''for'', ''foreach'' or ''while'' statement in which it appears.

Example:

&lt;uscript&gt;
While (i &lt; 10) {
    if ( i % 2 == 0 )
        Continue;
    log(i);
}
&lt;/uscript&gt;

Unlike some other languages (e.g. Java or Perl) UnrealScript does '''not''' support the &lt;tt&gt;continue ''label'';&lt;/tt&gt; syntax to skip to the next iteration of the loop with the specified label.

===Stop ===

Imediately stops execution of [[Legacy:State|State]] code. This is like the ''return'' command for states.

===Assert (''expression'') ===

If the expression passed to ''Assert'' evaluates to &lt;tt&gt;False&lt;/tt&gt;, the game shuts down with an error message telling you the file (class) and the line the ''Assert'' call is in.

Example:

&lt;uscript&gt;
Assert(numPlayers &gt; 0);
&lt;/uscript&gt;

==GoTo (''label'') ==

Continues code execution at the specified label. ''GoTo'' is mainly used in state code, but is also allowed within functions, although it is rarely used there. For state flow there's also GotoState( Statename, label): see [[Legacy:State|state]] for more on this.

Syntax:

&lt;uscript&gt;GoTo('label');&lt;/uscript&gt;

Example:

&lt;uscript&gt;
State Idle
{
Begin:
    PlayIdleAnim();
    FinishAnim();
    Sleep(0.5);
    GoTo('Begin');
}
&lt;/uscript&gt;

In UT2004 case the goto syntax varies. In function code the parentheses are invalid, apostrophes are optional. In state code the parentheses are optional, apostrophes are required. Therefore the syntax that's valid in both types of code is:&lt;uscript&gt;GoTo 'label';&lt;/uscript&gt;

==If Statements ==

''If'' statements execute some code if a certain condition is true. The optional ''Else'' part executes some other code if the condition is false. Multiple ''If...Else'' statements can be combined to create ''If...ElseIf...Else'' statements.

Syntax:

&lt;uscript&gt;
// single line if:
if ( condition )
   // statement

// simple block if:
if ( condition ) {
   ...
}
// if...else:
if ( condition ) {
   ...
}
else {
   ...
}&lt;/uscript&gt;

Example:

(The second ''If'' is the command executed if the first condition is false.)

&lt;uscript&gt;
If ( Pawn(Owner) != None &amp;&amp; Pawn(Owner).bIsPlayer ) {
    log(Pawn(Owner).PlayerReplicationInfo.PlayerName);
    Pawn(Owner).PlayerReplicationInfo.Score += 2;
}
Else If ( Pawn(Owner) != None )
    Owner.Destroy();
Else
    log(&quot;No Pawn.&quot;);
&lt;/uscript&gt;

==Switch Statements ==

''Switch'' statements can be used to check if a certain expression is set to one of several values.

Syntax:

&lt;uscript&gt;
Switch ( expression ) {
Case value1:
    ...
    break;
Case value2:
Case value3:
    ...
    break;
Default:
    ...
    break;
}&lt;/uscript&gt;

In this example a variable ''i'' is checked. If its value is 1 the DoSomething function is called and code execution continues below the ''Switch'' statement. If its value is 2 or 3 both DoSomethingElse and DoSomethingMore are called and the current function is canceled (due to the ''return'' command). If the value of ''i'' is 4 only the DoSomethingMore function is called and the current function is canceled. If ''i'' has a different value the DoNothingSpecial function is called and code execution continues below the ''Switch'' statement.

Note that without a break; or return; at the end of a case, execution will simply fall through to the next case's statements.

Example:

&lt;uscript&gt;
Switch (i) {
Case 1:
    DoSomething();
    break;
Case 2:
Case 3:
    DoSomethingElse();
Case 4:
    DoSomethingMore();
    return;
Default:
    DoNothingSpecial();
    break;
}
&lt;/uscript&gt;

==While Loops ==

''While'' loops are executed as long as the condition stays true. If the condition is false before the loop starts, the whole ''While'' loop is not executed.

Syntax:

&lt;uscript&gt;
While ( condition ) {
    ...
}&lt;/uscript&gt;

'''Note:''' Due to a compiler bug it is possible to append an ''Until(...);'' clause to a ''While'' loop, effectively turning it into a loop with two conditions &amp;ndash; one executed before and one after each iteration. Please don't use this &quot;feature&quot; though, it might be removed in the future.

==For Loops ==

''For'' loops can be used similar to ''While'' loops. The ''InitialCommand'' is executed before the first loop cycle starts, ''LoopCondition'' is checked before each (including the first) loop cycle and ''UpdateCommand '' is executed at the end of every loop cycle. The ''For'' loop is executed as long as the condition stays true, but it will not be executed at all if the condition initially is false.

Syntax:

&lt;uscript&gt;
For ( InitialCommand; LoopCondition; UpdateCommand ) {
    ...
}&lt;/uscript&gt;

Unlike other languages, UnrealScript does '''not''' accept multiple statements as ''InitialCommand'' or ''UpdateCommand''. Additional initial commands must be added above the loop. Attempting to use multiple update commands can become very tricky if you want to use the '''Continue''' statement, but if you don't need '''Continue''' you can just add the additional update commands as the last statements of the '''For''' statement block.

Also unlike other languages, UnrealScript does not allow empty statements as ''InitialCommand'', ''LoopCondition'' or ''UpdateCommand''. Consider using a '''While''' loop instead if you don't need initial ''InitialCommand'' or ''UpdateCommand''.

''For'' loops can be used to make simple loops with a counter or to iterate through a linked list.

Examples:

&lt;uscript&gt;
For (i = 0; i &lt; 10; i++) {
    ...
}
&lt;/uscript&gt;

The above example will execute for i = 0, 1, ... 9. The endgame scenario is: 
* execute loop for 9
* increment i to 10
* start from the top: check i and it fails the condition; so move on.

The following example loops through all [[Legacy:Pawn (UT)|Pawns]] in the level: (works only server-side)

&lt;uscript&gt;
For (P = Level.PawnList; P != None; P = P.NextPawn) {

    ...
}
&lt;/uscript&gt;

If you were to rewrite a For loop only with If and GoTo statements, it would probably look similar to this:

&lt;uscript&gt;
InitialCommand;
beginloop:
if (LoopCondition) {

  /* loop code block */

continuetarget: // this is where a 'continue' statement would jump to
  UpdateCommand;
  goto 'beginloop';
}
breaktarget: // this is where a 'break' statement would jump to
&lt;/uscript&gt;

==Do...Until Loops ==

''Do...Until'' loops are always executed at least once. The loop stops if the condition becomes true.

Syntax:

&lt;uscript&gt;
Do {
    ...
} Until ( condition );
&lt;/uscript&gt;

Example:

&lt;uscript&gt;
Do {
    log(i);
} Until (i++ &gt; 10);
&lt;/uscript&gt;

'''Note:''' Due to a compiler bug you can leave out the '''Until''' clause, effectively turning this into an infinite loop. It is not recommended to use this &quot;feature&quot; since it will probably be fixed in the future, but if you do you will have to add a '''Break''' or '''Return''' somewhere in the loop.

==ForEach Loops ==

''ForEach'' uses an [[Legacy:Iterator|iterator]] function to loop through a list of actors.

Syntax:

&lt;uscript&gt;
ForEach IteratorFunction(BaseActorClass, IteratorVariable, IteratorParameters) {
    ...
}&lt;/uscript&gt;

''IteratorFunction'' must be a valid reference to a native function with the &lt;code&gt;iterator&lt;/code&gt; [[Legacy:Function Syntax|specifier]].

The first example iterates through all HUD actors in the map.&lt;br /&gt;The second one iterates through all projectiles, which are in the same zone like the actor calling the ''ForEach'' loop.

Examples:

&lt;uscript&gt;
ForEach AllActors(class'HUD', H) {
    ...
}
&lt;/uscript&gt;

&lt;uscript&gt;
ForEach Region.Zone.ZoneActors(class'Projectile', P) {
    ...
}
&lt;/uscript&gt;

'''Note:''' If you access the iterator function through an object reference, make absolutely sure the reference is valid, becasue this is the only place where accessing &lt;tt&gt;None&lt;/tt&gt; will not generate a warning but actually crash the game.

Another example for using ''ForEach'':

RadiusActors - ''argument 1'' actors (stored in ''argument 2'' variable) which are in the ''argument 3'' radius of the calling actor.

&lt;uscript&gt;
ForEach RadiusActors(class'Projectile', P, 128) {
    ...
}
&lt;/uscript&gt;

==Discussion ==

'''EricBlade:''' I've never seen the 'stop' keyword.  Does that return the object to it's default state (auto state, or no state)? Or does it remain in that state, with no state code running?

'''Wormbo:''' 'Stop' simply halts state code execution without changing states. There's actually an implicit 'Stop' after the last code statement in every state that contains state code.

'''Sweavo:''' [[Legacy:UnrealScript Language Reference/Program Structure|UnrealScript Language Reference/Program Structure]] covers much of this material and it much prettier.  I'm inclined to remove the subjects from here that are covered there then see what's left and refocus the page...?

'''Wormbo:''' [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]] is only a copy of an Epic Games document that we are allowed to host here but not modify. This page here is our own description of these language constructs and it's much easier to link to from other pages.

'''Kartoshka:''' Just before the &quot;Special Flow Commands&quot; section there is a partial sentence &quot;Statement blocks of&quot;. Is that just something that got left in one edit, or left out? I have no idea if it was important anyway...

'''Wormbo:''' I don't know what I wanted to write there. Removed it.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Special UnrealScript Keywords|Special UnrealScript Keywords]]
** [[Legacy:Iterator|Iterator]]
** [[Legacy:State|State]]
* [[Legacy:UnrealScript Language Reference/Program Structure|UnrealScript Language Reference/Program Structure]]</text>
    </revision>
    <revision>
      <id>3167</id>
      <timestamp>2006-07-18T04:50:13Z</timestamp>
      <contributor>
        <ip>218.150.32.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.dirare.com'&gt;yellow pages main&lt;/a&gt; : [http://www.dirare.com business yellowpages] - [HTTP://www.dirare.com business yellowpages] : [international directory|http://www.dirare.com] - [international directory|HTTP://www.dirare.com] : http://www.dirare.com/India/ : [[http://www.dirare.com companies of the world]] : [[http://www.dirare.com | YP national]] : &quot;global directory&quot; http://www.dirare.com : [http://www.dirare.com|online directory] &lt;/u&gt;== Basics ==

There are two basic flow control functions in [[Legacy:UnrealScript|UnrealScript]], ''GoTo'' and ''If...Else''.

Any other functions and loops described here (except ''ForEach'') could be replaced by combinations of these two functions (In fact, that happens in UnrealScript byte code for ''While'', ''For'' and ''Do...Until'' loops.), but it's considered bad coding practise to actually do so.

If a loop, ''If'' or ''Else'' contains only one line of code the '''{ }''' are optional. A single loop, ''If'' or ''Switch'' statement is treated as one command in this context.

Example:

&lt;uscript&gt;
If ( bExecute )
    For (i = 0; i &lt; 5; i++) {
        a += i;
        b *= i;
    }
&lt;/uscript&gt;

'''Note:''' Due to a compiler bug it is not possible to use a loop (&lt;tt&gt;for&lt;/tt&gt;, &lt;tt&gt;while&lt;/tt&gt;, ...) as the statement in a simple &lt;tt&gt;else&lt;/tt&gt; statement.

&lt;uscript&gt;
if (foo)
  bar();
else // Doesn't work, compiler error!
  for (i = 0; i &lt; 10; i++) {
    blargh(i);
  }
&lt;/uscript&gt;

You have to use a &quot;block-else&quot; instead, i.e.:

&lt;uscript&gt;
if (foo)
  bar();
else { // Actually the same thing, but works!
  for (i = 0; i &lt; 10; i++) {
    blargh(i);
  }
}
&lt;/uscript&gt;

Stand-alone blocks, i.e. statements grouped in '''{ }''', are not allowed in UnrealScript.

==Special Flow Commands ==

===Return ''expression'' ===

The ''return'' keyword terminates execution of the function in which it appears and returns control (and the value of ''expression'' if given) to the calling function or state.

If the function returns a certain type of value the return value has to be specified in the ''return'' command. If a function with a return value ends without ''return'' it will return a null value for its data type. (e.g. &lt;code&gt;0&lt;/code&gt;, empty string, &lt;code&gt;None&lt;/code&gt;, etc.)

===Break ===

The ''break'' keyword terminates the smallest enclosing ''do'', ''for'', ''foreach'', ''switch'' or ''while'' statement in which it appears. Code execution continues with the next line of code after the loop.

Example:

&lt;uscript&gt;
for ( Inv=Pawn.Inventory; Inv!=None; Inv=Inv.Inventory ) //Iterating through the inventory list
{
      if( Inv != None &amp;&amp; Inv.InventoryGroup == 1) //If there is an inventory item in Group 1 then...
      {
         //Destroy that item.  That item will become 'None' after that, and will
         //Magically create an 'Accessed None' Error
         Inv.Destroy();
	 break;  //To crush that Accessed none error, you must 'break'
      }
}
&lt;/uscript&gt;

Unlike some other languages (e.g. Java or Perl) UnrealScript does '''not''' support the &lt;tt&gt;break ''label'';&lt;/tt&gt; syntax to break the loop with the specified label.

===Continue ===

The continue keyword passes control to the next iteration of the smallest enclosing ''do'', ''for'', ''foreach'' or ''while'' statement in which it appears.

Example:

&lt;uscript&gt;
While (i &lt; 10) {
    if ( i % 2 == 0 )
        Continue;
    log(i);
}
&lt;/uscript&gt;

Unlike some other languages (e.g. Java or Perl) UnrealScript does '''not''' support the &lt;tt&gt;continue ''label'';&lt;/tt&gt; syntax to skip to the next iteration of the loop with the specified label.

===Stop ===

Imediately stops execution of [[Legacy:State|State]] code. This is like the ''return'' command for states.

===Assert (''expression'') ===

If the expression passed to ''Assert'' evaluates to &lt;tt&gt;False&lt;/tt&gt;, the game shuts down with an error message telling you the file (class) and the line the ''Assert'' call is in.

Example:

&lt;uscript&gt;
Assert(numPlayers &gt; 0);
&lt;/uscript&gt;

==GoTo (''label'') ==

Continues code execution at the specified label. ''GoTo'' is mainly used in state code, but is also allowed within functions, although it is rarely used there. For state flow there's also GotoState( Statename, label): see [[Legacy:State|state]] for more on this.

Syntax:

&lt;uscript&gt;GoTo('label');&lt;/uscript&gt;

Example:

&lt;uscript&gt;
State Idle
{
Begin:
    PlayIdleAnim();
    FinishAnim();
    Sleep(0.5);
    GoTo('Begin');
}
&lt;/uscript&gt;

In UT2004 case the goto syntax varies. In function code the parentheses are invalid, apostrophes are optional. In state code the parentheses are optional, apostrophes are required. Therefore the syntax that's valid in both types of code is:&lt;uscript&gt;GoTo 'label';&lt;/uscript&gt;

==If Statements ==

''If'' statements execute some code if a certain condition is true. The optional ''Else'' part executes some other code if the condition is false. Multiple ''If...Else'' statements can be combined to create ''If...ElseIf...Else'' statements.

Syntax:

&lt;uscript&gt;
// single line if:
if ( condition )
   // statement

// simple block if:
if ( condition ) {
   ...
}
// if...else:
if ( condition ) {
   ...
}
else {
   ...
}&lt;/uscript&gt;

Example:

(The second ''If'' is the command executed if the first condition is false.)

&lt;uscript&gt;
If ( Pawn(Owner) != None &amp;&amp; Pawn(Owner).bIsPlayer ) {
    log(Pawn(Owner).PlayerReplicationInfo.PlayerName);
    Pawn(Owner).PlayerReplicationInfo.Score += 2;
}
Else If ( Pawn(Owner) != None )
    Owner.Destroy();
Else
    log(&quot;No Pawn.&quot;);
&lt;/uscript&gt;

==Switch Statements ==

''Switch'' statements can be used to check if a certain expression is set to one of several values.

Syntax:

&lt;uscript&gt;
Switch ( expression ) {
Case value1:
    ...
    break;
Case value2:
Case value3:
    ...
    break;
Default:
    ...
    break;
}&lt;/uscript&gt;

In this example a variable ''i'' is checked. If its value is 1 the DoSomething function is called and code execution continues below the ''Switch'' statement. If its value is 2 or 3 both DoSomethingElse and DoSomethingMore are called and the current function is canceled (due to the ''return'' command). If the value of ''i'' is 4 only the DoSomethingMore function is called and the current function is canceled. If ''i'' has a different value the DoNothingSpecial function is called and code execution continues below the ''Switch'' statement.

Note that without a break; or return; at the end of a case, execution will simply fall through to the next case's statements.

Example:

&lt;uscript&gt;
Switch (i) {
Case 1:
    DoSomething();
    break;
Case 2:
Case 3:
    DoSomethingElse();
Case 4:
    DoSomethingMore();
    return;
Default:
    DoNothingSpecial();
    break;
}
&lt;/uscript&gt;

==While Loops ==

''While'' loops are executed as long as the condition stays true. If the condition is false before the loop starts, the whole ''While'' loop is not executed.

Syntax:

&lt;uscript&gt;
While ( condition ) {
    ...
}&lt;/uscript&gt;

'''Note:''' Due to a compiler bug it is possible to append an ''Until(...);'' clause to a ''While'' loop, effectively turning it into a loop with two conditions &amp;ndash; one executed before and one after each iteration. Please don't use this &quot;feature&quot; though, it might be removed in the future.

==For Loops ==

''For'' loops can be used similar to ''While'' loops. The ''InitialCommand'' is executed before the first loop cycle starts, ''LoopCondition'' is checked before each (including the first) loop cycle and ''UpdateCommand '' is executed at the end of every loop cycle. The ''For'' loop is executed as long as the condition stays true, but it will not be executed at all if the condition initially is false.

Syntax:

&lt;uscript&gt;
For ( InitialCommand; LoopCondition; UpdateCommand ) {
    ...
}&lt;/uscript&gt;

Unlike other languages, UnrealScript does '''not''' accept multiple statements as ''InitialCommand'' or ''UpdateCommand''. Additional initial commands must be added above the loop. Attempting to use multiple update commands can become very tricky if you want to use the '''Continue''' statement, but if you don't need '''Continue''' you can just add the additional update commands as the last statements of the '''For''' statement block.

Also unlike other languages, UnrealScript does not allow empty statements as ''InitialCommand'', ''LoopCondition'' or ''UpdateCommand''. Consider using a '''While''' loop instead if you don't need initial ''InitialCommand'' or ''UpdateCommand''.

''For'' loops can be used to make simple loops with a counter or to iterate through a linked list.

Examples:

&lt;uscript&gt;
For (i = 0; i &lt; 10; i++) {
    ...
}
&lt;/uscript&gt;

The above example will execute for i = 0, 1, ... 9. The endgame scenario is: 
* execute loop for 9
* increment i to 10
* start from the top: check i and it fails the condition; so move on.

The following example loops through all [[Legacy:Pawn (UT)|Pawns]] in the level: (works only server-side)

&lt;uscript&gt;
For (P = Level.PawnList; P != None; P = P.NextPawn) {

    ...
}
&lt;/uscript&gt;

If you were to rewrite a For loop only with If and GoTo statements, it would probably look similar to this:

&lt;uscript&gt;
InitialCommand;
beginloop:
if (LoopCondition) {

  /* loop code block */

continuetarget: // this is where a 'continue' statement would jump to
  UpdateCommand;
  goto 'beginloop';
}
breaktarget: // this is where a 'break' statement would jump to
&lt;/uscript&gt;

==Do...Until Loops ==

''Do...Until'' loops are always executed at least once. The loop stops if the condition becomes true.

Syntax:

&lt;uscript&gt;
Do {
    ...
} Until ( condition );
&lt;/uscript&gt;

Example:

&lt;uscript&gt;
Do {
    log(i);
} Until (i++ &gt; 10);
&lt;/uscript&gt;

'''Note:''' Due to a compiler bug you can leave out the '''Until''' clause, effectively turning this into an infinite loop. It is not recommended to use this &quot;feature&quot; since it will probably be fixed in the future, but if you do you will have to add a '''Break''' or '''Return''' somewhere in the loop.

==ForEach Loops ==

''ForEach'' uses an [[Legacy:Iterator|iterator]] function to loop through a list of actors.

Syntax:

&lt;uscript&gt;
ForEach IteratorFunction(BaseActorClass, IteratorVariable, IteratorParameters) {
    ...
}&lt;/uscript&gt;

''IteratorFunction'' must be a valid reference to a native function with the &lt;code&gt;iterator&lt;/code&gt; [[Legacy:Function Syntax|specifier]].

The first example iterates through all HUD actors in the map.\

The second one iterates through all projectiles, which are in the same zone like the actor calling the ''ForEach'' loop.

Examples:

&lt;uscript&gt;
ForEach AllActors(class'HUD', H) {
    ...
}
&lt;/uscript&gt;

&lt;uscript&gt;
ForEach Region.Zone.ZoneActors(class'Projectile', P) {
    ...
}
&lt;/uscript&gt;

'''Note:''' If you access the iterator function through an object reference, make absolutely sure the reference is valid, becasue this is the only place where accessing &lt;tt&gt;None&lt;/tt&gt; will not generate a warning but actually crash the game.

Another example for using ''ForEach'':

RadiusActors - ''argument 1'' actors (stored in ''argument 2'' variable) which are in the ''argument 3'' radius of the calling actor.

&lt;uscript&gt;
ForEach RadiusActors(class'Projectile', P, 128) {
    ...
}
&lt;/uscript&gt;

==Discussion ==

'''EricBlade:''' I've never seen the 'stop' keyword.  Does that return the object to it's default state (auto state, or no state)? Or does it remain in that state, with no state code running?

'''Wormbo:''' 'Stop' simply halts state code execution without changing states. There's actually an implicit 'Stop' after the last code statement in every state that contains state code.

'''Sweavo:''' [[Legacy:UnrealScript Language Reference/Program Structure|UnrealScript Language Reference/Program Structure]] covers much of this material and it much prettier.  I'm inclined to remove the subjects from here that are covered there then see what's left and refocus the page...?

'''Wormbo:''' [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]] is only a copy of an Epic Games document that we are allowed to host here but not modify. This page here is our own description of these language constructs and it's much easier to link to from other pages.

'''Kartoshka:''' Just before the &quot;Special Flow Commands&quot; section there is a partial sentence &quot;Statement blocks of&quot;. Is that just something that got left in one edit, or left out? I have no idea if it was important anyway...

'''Wormbo:''' I don't know what I wanted to write there. Removed it.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Special UnrealScript Keywords|Special UnrealScript Keywords]]
** [[Legacy:Iterator|Iterator]]
** [[Legacy:State|State]]
* [[Legacy:UnrealScript Language Reference/Program Structure|UnrealScript Language Reference/Program Structure]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fluid Surfaces</title>
    <id>1243</id>
    <revision>
      <id>3205</id>
      <timestamp>2007-12-23T06:25:06Z</timestamp>
      <contributor>
        <ip>Obliterous</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will introduce you to the basics of '''FluidSurfaces'''. As you can see in the first screen shot, I've made a room with some dirt (see [[Legacy:Subtract A Space|subtract a space]]), and I'd like to add a thin layer of water.

[[Image:Legacy_fluidsurfaces-1.jpeg|center|we'll add water there]]

FYI: Since I (Freon) am french, the boolean values in the properties boxes are in french too. ''Vrai'' is for true and ''Faux'' is for false. Enjoy now :)

==Adding a water volume==

[[Legacy:Add A Volume|Add a volume]]: Resize your [[Legacy:Red Builder Brush|red builder brush]] to fit the size of the room you want to fill with water (or even a little more). Use the height to determine how deep the water will be. Place your red brush where the water should be and right click on the volume button [[Image:Legacy_volumebutton.jpeg|]] and choose '''[[Legacy:WaterVolume|WaterVolume]]'''. That's all you need for now.

==Adding the surface==

The water volume is invisible. You could use a simple [[Legacy:Sheet|sheet]] to make the surface visible, but it would be a little static and won't slosh around. [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FluidSurfaceInfo in the middle of your room, at the surface height.

[[Image:Legacy_fluidsurfaces-2.jpeg|center|the water volume is placed at mid-height of the terrain]]

[[Legacy:Set The Following Properties|Set the following properties]]:
* FluidSurfaceInfo -&gt; FluidXSize and FluidYSize to fit the room size
* You can also use '''FluidGridSpacing''' to determine how big the grid should be.

[[Image:Legacy_fluidsurfaces-3.jpeg|center|top view]]

See [[Legacy:Creating A Material|creating a material]] for info on how to create a shader material for your FluidSurface.

'''9.''' Open the ''FluidSurfaceInfo'' properties, click on ''Display'' -&gt; ''Skins'' and click on the ''Add'' button. Then pick the shader you want applied to the surface with the textures browser.

[[Image:Legacy_fluidsurfaces-14.jpeg|center|adding a skin]]

You can adjust the values in the oscillator and the scalers especially the last one to fit the shores.

[[Image:Legacy_fluidsurfaces-15.jpeg|center|final shot :)]]

Don't forget setting '''bUnlit''' on ''False'' in the Display properties.

[http://www.essi.fr/~cortina/wiki/liquidsurface_files.zip Download the test map]

==Comments==

'''Mychaeel:''' A very nice tutorial.  Feel free to use our image uploader to put the images on our Unreal Wiki webspace; but before you do that, give them less generic file names please (something along the lines of &quot;fluidsurfaces-1.jpg&quot; to &quot;fluidsurfaces-9.jpg&quot; would do fine instead of &quot;tut1.jpg&quot; to &quot;tut9.jpg&quot;).

'''Freon:''' Tarquin told me i could upload them but that you were a little short on web space ;) I'll let the zipfile on my homepage

'''Tarquin:''' We're not short on space; what I meant is that I'm trying to cut down on duplication: for example, many tutorials have a step saying &quot;set the following surface properties&quot; &amp;ndash; so we only need one screenshot of the surface props window for the whole wiki. The next phase is to have pages for [[:Category:Legacy Basic Procedure]] which tute writers can just link to &amp;ndash; take a look at that page.

'''Tarquin:''' How about we split off the part on creating a material into [[Legacy:Creating A Material|Creating a material]], since we might want to link to that specifically?

'''\/\/0RF:''' Someone please follow Tarquin's suggestion, as this tut alone clearly shows that there are a lot of different material types, with numerous differences in how they are set up.  Working with materials can be a powerful tool to bring a lot of eye candy to regular textures without taxing the engine too hard, if someone could provide clear instructions on how they are built.

'''MadNad''' I wrote this tut on fluid surface that tells you how to get reflections and opacity in your water.  Don't forget to add your WaterVolume to make it act like water when you enter it.  http://madnad.com/UT2004/WaterTutorial/

'''Bob_The_Beheader:''' Done! I hope the link to the [[Legacy:Creating A Material|creating a material]] is noticable enough. 

'''Obliterous:''' can this be expanded to include light emitting surfaces like lava?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3206</id>
      <timestamp>2006-04-18T00:03:48Z</timestamp>
      <contributor>
        <ip>Mask228.ups.edu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial will introduce you to the basics of '''FluidSurfaces'''. As you can see in the first screen shot, I've made a room with some dirt (see [[Legacy:Subtract A Space|subtract a space]]), and I'd like to add a thin layer of water.

[[Image:Legacy_fluidsurfaces-1.jpeg|center|we'll add water there]]

FYI: Since I (Freon) am french, the boolean values in the properties boxes are in french too. ''Vrai'' is for true and ''Faux'' is for false. Enjoy now :)

==Adding a water volume==

[[Legacy:Add A Volume|Add a volume]]: Resize your [[Legacy:Red Builder Brush|red builder brush]] to fit the size of the room you want to fill with water (or even a little more). Use the height to determine how deep the water will be. Place your red brush where the water should be and right click on the volume button [[Image:Legacy_volumebutton.jpeg|]] and choose '''[[Legacy:WaterVolume|WaterVolume]]'''. That's all you need for now.

==Adding the surface==

The water volume is invisible. You could use a simple [[Legacy:Sheet|sheet]] to make the surface visible, but it would be a little static and won't slosh around. [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FluidSurfaceInfo in the middle of your room, at the surface height.

[[Image:Legacy_fluidsurfaces-2.jpeg|center|the water volume is placed at mid-height of the terrain]]

[[Legacy:Set The Following Properties|Set the following properties]]:
* FluidSurfaceInfo -&gt; FluidXSize and FluidYSize to fit the room size
* You can also use '''FluidGridSpacing''' to determine how big the grid should be.

[[Image:Legacy_fluidsurfaces-3.jpeg|center|top view]]

See [[Legacy:Creating A Material|creating a material]] for info on how to create a shader material for your FluidSurface.

'''9.''' Open the ''FluidSurfaceInfo'' properties, click on ''Display'' -&gt; ''Skins'' and click on the ''Add'' button. Then pick the shader you want applied to the surface with the textures browser.

[[Image:Legacy_fluidsurfaces-14.jpeg|center|adding a skin]]

You can adjust the values in the oscillator and the scalers especially the last one to fit the shores.

[[Image:Legacy_fluidsurfaces-15.jpeg|center|final shot :)]]

Don't forget setting '''bUnlit''' on ''False'' in the Display properties.

[http://www.essi.fr/~cortina/wiki/liquidsurface_files.zip Download the test map]

==Comments==

'''Mychaeel:''' A very nice tutorial.  Feel free to use our image uploader to put the images on our Unreal Wiki webspace; but before you do that, give them less generic file names please (something along the lines of &quot;fluidsurfaces-1.jpg&quot; to &quot;fluidsurfaces-9.jpg&quot; would do fine instead of &quot;tut1.jpg&quot; to &quot;tut9.jpg&quot;).

'''Freon:''' Tarquin told me i could upload them but that you were a little short on web space ;) I'll let the zipfile on my homepage

'''Tarquin:''' We're not short on space; what I meant is that I'm trying to cut down on duplication: for example, many tutorials have a step saying &quot;set the following surface properties&quot; &amp;ndash; so we only need one screenshot of the surface props window for the whole wiki. The next phase is to have pages for [[:Category:Legacy Basic Procedure]] which tute writers can just link to &amp;ndash; take a look at that page.

'''Tarquin:''' How about we split off the part on creating a material into [[Legacy:Creating A Material|Creating a material]], since we might want to link to that specifically?

'''\/\/0RF:''' Someone please follow Tarquin's suggestion, as this tut alone clearly shows that there are a lot of different material types, with numerous differences in how they are set up.  Working with materials can be a powerful tool to bring a lot of eye candy to regular textures without taxing the engine too hard, if someone could provide clear instructions on how they are built.

'''MadNad''' I wrote this tut on fluid surface that tells you how to get reflections and opacity in your water.  Don't forget to add your WaterVolume to make it act like water when you enter it.  http://madnad.com/UT2004/WaterTutorial/

'''Bob_The_Beheader:''' Done! I hope the link to the [[Legacy:Creating A Material|creating a material]] is noticable enough. 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FluidSurfaceInfo</title>
    <id>1247</id>
    <revision>
      <id>3215</id>
      <timestamp>2006-07-09T21:03:24Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Lame work-around for FluidSurface &quot;freezing&quot;.  Any better solutions welcome.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FluidSurfaceInfo (Package: Engine)}}

A water-like surface. Actors can cause ripples by touching it. Unlike [[Legacy:XProcMesh|xProcMesh]]es, FluidSurfaceInfos do not deform when damaged.

==Properties ==

===FluidSurfaceInfo Group ===
; float AlphaCurveScale : 
; float AlphaHeightScale : 
; byte AlphaMax : 

does anyone know how to use the surface alpha property of fluidsurfaceinfo to blend a second material onto the peaks of the waves in a water surface? -jeeptrash

; bool bShowBoundingBox : 
; bool bUseNoRenderZ : 
; [[Legacy:TerrainInfo|TerrainInfo]] ClampTerrain (edfindable): Terrain used for auto-clamping water verts if below terrain level.
; color FluidColor : 
; float FluidDamping : between 0 and 1
; float FluidGridSpacing : distance between grid points
; EFluidGridType FluidGridType : 
; float FluidHeightScale : vertical scale factor
; float FluidNoiseFrequency
; range FluidNoiseStrength : &quot;Noise&quot; or ripples that exist without a player interaction
; float FluidSpeed : wave speed
; int FluidXSize : num vertices in X direction
; int FluidYSize : num vertices in Y direction
; float NoRenderZ : 
; bool OrientTouchEffect : 
; bool OrientShootEffect : 
; float RippleVelocityFactor : How much to ripple the water when interacting with actors
; class&lt;[[Legacy:Actor|Actor]]&gt; ShootEffect : Class of effect spawned when water surface it shot or touched by an actor
; float ShootRadius : How large a radius is affected when water is shot
; float ShootStrength : How hard to ripple water when shot
; bool TestRipple 
; float TestRippleSpeed
; float TestRippleStrength
; float TestRippleRadius : Test ripple that shows only in editor.
; class&lt;[[Legacy:Actor|Actor]]&gt; TouchEffect : 
; float TouchStrength : 
; float UOffset : 
; float UpdateRate : Rate at which fluid sim will be updated.
; float UTiles : 
; float VOffset : 
; float VTiles : 
; float WarmUpTime : Amount of time to simulate during postload before water is first displayed

===UnrealScript-Only Properties ===
; array&lt;int&gt; ClampBitmap : Bitmap indicating which water verts are 'clamped' ie. dont move
; array&lt;float&gt; Verts0 (transient, const) : 
; array&lt;float&gt; Verts1 (transient, const) : 
; array&lt;byte&gt; VertAlpha (transient, const) : 
; int LatestVerts (transient, const) : 
; box FluidBoundingBox (transient, const) : Current world-space AABB
; vector FluidOrigin (transient, const) : Current bottom-left corner
; float TimeRollover (transient, const) : 
; float TestRippleAng (transient, const) : 
; [[Legacy:FluidSurfacePrimitive|FluidSurfacePrimitive]] Primitive (transient, const) : 
; array&lt;[[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]&gt; Oscillators (transient, const) : 
; bool bHasWarmedUp (transient, const) : 

==Enums ==

===EFluidGridType ===
; FGT_Square : 
; FGT_Hexagonal : 

==Tips==
* If your FluidSurface inexplicably stops moving (it may have been working fine, then stopped after a rebuild or after subsequent additions/changes to your map), you're apparently experiencing a bug in the PHYS_FluidSurface Physics setting.  I'm told this problem also appears in DM-IronDiety, as their fluid surface seems all set up, but is completely immobile.  A lame, but servicable work-around is to &quot;jiggle&quot; (or change, then change back) a setting in your FluidSurfaceInfo actor, like FluidXSize, to get the surface physics to &quot;wake up&quot; in Ued, '''then''' save your map without another rebuild.  This will save the FluidSurface in a state that is active and it will appear so in game as well.  Unfortunately, this &quot;jiggling&quot; must take place after each rebuild to ensure your FluidSurface doesn't save in a frozen state.

==Quick HOWTO==

Here is a quick way to get a fluid surface in a level.

# [[Legacy:Add An Actor|Add an Actor]] of class FluidSurfaceInfo to the level.
# Change the FluidXSize and FluidYSize along with the FluidGridSpacing to size it correctly for the level space you want to use it in.
# Find the [[Legacy:Texture|Texture]] you want to use, and assign it to the first material in the  Display -&gt; Skins array
# Tweak extra settings to suit your level.
# Go shoot it.

==Related Topics==
* [[Legacy:Fluid Surfaces|Fluid Surfaces]] tutorial
* [[Legacy:XProcMesh|xProcMesh]] class
* [[Legacy:Holes In Fluid Surfaces|Holes In Fluid Surfaces]] tutorial

==Discussion==

'''Highlander:''' It seems that the FluidSurface is unlit by default as well. BTW.. the [[Legacy:Class Wikifier|Class Wikifier]] is pretty neat

'''Wormbo:''' Yeah, it's neat, but it still needs some work. I've redone the Properties section.

'''Jeeptrash:''' Anybody know what AlphaCurveScale and AlphaHeightScale do? The UDN tutorial implies that they change the alpha based on the height of a vertex but I can't seem to get this working to demo it. Does it change the alpha of an alpha map in the material? of the whole shader?

'''The Twiggman:''' Wow those things are neat. Lol I always wondered how some of the volumes were moving like that, so I decided to find out and I looked at curse3's little area. Now you can just replace that old sheet with one of these for good effects. But doesn't that make you think you can make neat effects like a big web or something and have it ripple as you fall through it.

'''Tony:''' So is it possible to create circular liquid surfaces with this actor, or is the engine limited in this aspect?

'''Wormbo:''' It seems the FluidSurcafeInfo is limited to flat surfaces. If you want a different shape you need to use an [[Legacy:XProcMesh|xProcMesh]].

'''Zengi:''' Is it possible to make a fluid type mesh while in game through code for summoning?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3216</id>
      <timestamp>2006-07-09T21:02:05Z</timestamp>
      <contributor>
        <ip>Dialup-4.231.163.219.Dial1.LosAngeles1.Level3.net</ip>
      </contributor>
      <comment>Lame work-around for FluidSurface &quot;freezing&quot;.  Any better solutions welcome.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FluidSurfaceInfo (Package: Engine)}}

A water-like surface. Actors can cause ripples by touching it. Unlike [[Legacy:XProcMesh|xProcMesh]]es, FluidSurfaceInfos do not deform when damaged.

==Properties ==

===FluidSurfaceInfo Group ===
; float AlphaCurveScale : 
; float AlphaHeightScale : 
; byte AlphaMax : 

does anyone know how to use the surface alpha property of fluidsurfaceinfo to blend a second material onto the peaks of the waves in a water surface? -jeeptrash

; bool bShowBoundingBox : 
; bool bUseNoRenderZ : 
; [[Legacy:TerrainInfo|TerrainInfo]] ClampTerrain (edfindable): Terrain used for auto-clamping water verts if below terrain level.
; color FluidColor : 
; float FluidDamping : between 0 and 1
; float FluidGridSpacing : distance between grid points
; EFluidGridType FluidGridType : 
; float FluidHeightScale : vertical scale factor
; float FluidNoiseFrequency
; range FluidNoiseStrength : &quot;Noise&quot; or ripples that exist without a player interaction
; float FluidSpeed : wave speed
; int FluidXSize : num vertices in X direction
; int FluidYSize : num vertices in Y direction
; float NoRenderZ : 
; bool OrientTouchEffect : 
; bool OrientShootEffect : 
; float RippleVelocityFactor : How much to ripple the water when interacting with actors
; class&lt;[[Legacy:Actor|Actor]]&gt; ShootEffect : Class of effect spawned when water surface it shot or touched by an actor
; float ShootRadius : How large a radius is affected when water is shot
; float ShootStrength : How hard to ripple water when shot
; bool TestRipple 
; float TestRippleSpeed
; float TestRippleStrength
; float TestRippleRadius : Test ripple that shows only in editor.
; class&lt;[[Legacy:Actor|Actor]]&gt; TouchEffect : 
; float TouchStrength : 
; float UOffset : 
; float UpdateRate : Rate at which fluid sim will be updated.
; float UTiles : 
; float VOffset : 
; float VTiles : 
; float WarmUpTime : Amount of time to simulate during postload before water is first displayed

===UnrealScript-Only Properties ===
; array&lt;int&gt; ClampBitmap : Bitmap indicating which water verts are 'clamped' ie. dont move
; array&lt;float&gt; Verts0 (transient, const) : 
; array&lt;float&gt; Verts1 (transient, const) : 
; array&lt;byte&gt; VertAlpha (transient, const) : 
; int LatestVerts (transient, const) : 
; box FluidBoundingBox (transient, const) : Current world-space AABB
; vector FluidOrigin (transient, const) : Current bottom-left corner
; float TimeRollover (transient, const) : 
; float TestRippleAng (transient, const) : 
; [[Legacy:FluidSurfacePrimitive|FluidSurfacePrimitive]] Primitive (transient, const) : 
; array&lt;[[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]&gt; Oscillators (transient, const) : 
; bool bHasWarmedUp (transient, const) : 

==Enums ==

===EFluidGridType ===
; FGT_Square : 
; FGT_Hexagonal : 

==Quick HOWTO==

Here is a quick way to get a fluid surface in a level.

# [[Legacy:Add An Actor|Add an Actor]] of class FluidSurfaceInfo to the level.
# Change the FluidXSize and FluidYSize along with the FluidGridSpacing to size it correctly for the level space you want to use it in.
# Find the [[Legacy:Texture|Texture]] you want to use, and assign it to the first material in the  Display -&gt; Skins array
# Tweak extra settings to suit your level.
# Go shoot it.

==Tips==
* If your FluidSurface inexplicably stops moving (it may have been working fine, then stopped after a rebuild or after subsequent additions/changes to your map), you're apparently experiencing a bug in the PHYS_FluidSurface Physics setting.  I'm told this problem also appears in DM-IronDiety, as their fluid surface seems all set up, but is completely immobile.  A lame, but servicable work-around is to &quot;jiggle&quot; (or change, then change back) a setting in your FluidSurfaceInfo actor, like FluidXSize, to get the surface physics to &quot;wake up&quot; in Ued, '''then''' save your map without another rebuild.  This will save the FluidSurface in a state that is active and it will appear so in game as well.  Unfortunately, this &quot;jiggling&quot; must take place after each rebuild to ensure your FluidSurface doesn't save in a frozen state.

==Related Topics==
* [[Legacy:Fluid Surfaces|Fluid Surfaces]] tutorial
* [[Legacy:XProcMesh|xProcMesh]] class
* [[Legacy:Holes In Fluid Surfaces|Holes In Fluid Surfaces]] tutorial

==Discussion==

'''Highlander:''' It seems that the FluidSurface is unlit by default as well. BTW.. the [[Legacy:Class Wikifier|Class Wikifier]] is pretty neat

'''Wormbo:''' Yeah, it's neat, but it still needs some work. I've redone the Properties section.

'''Jeeptrash:''' Anybody know what AlphaCurveScale and AlphaHeightScale do? The UDN tutorial implies that they change the alpha based on the height of a vertex but I can't seem to get this working to demo it. Does it change the alpha of an alpha map in the material? of the whole shader?

'''The Twiggman:''' Wow those things are neat. Lol I always wondered how some of the volumes were moving like that, so I decided to find out and I looked at curse3's little area. Now you can just replace that old sheet with one of these for good effects. But doesn't that make you think you can make neat effects like a big web or something and have it ripple as you fall through it.

'''Tony:''' So is it possible to create circular liquid surfaces with this actor, or is the engine limited in this aspect?

'''Wormbo:''' It seems the FluidSurcafeInfo is limited to flat surfaces. If you want a different shape you need to use an [[Legacy:XProcMesh|xProcMesh]].

'''Zengi:''' Is it possible to make a fluid type mesh while in game through code for summoning?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3217</id>
      <timestamp>2006-07-09T21:03:00Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FluidSurfaceInfo (Package: Engine)}}

A water-like surface. Actors can cause ripples by touching it. Unlike [[Legacy:XProcMesh|xProcMesh]]es, FluidSurfaceInfos do not deform when damaged.

==Properties ==

===FluidSurfaceInfo Group ===
; float AlphaCurveScale : 
; float AlphaHeightScale : 
; byte AlphaMax : 

does anyone know how to use the surface alpha property of fluidsurfaceinfo to blend a second material onto the peaks of the waves in a water surface? -jeeptrash

; bool bShowBoundingBox : 
; bool bUseNoRenderZ : 
; [[Legacy:TerrainInfo|TerrainInfo]] ClampTerrain (edfindable): Terrain used for auto-clamping water verts if below terrain level.
; color FluidColor : 
; float FluidDamping : between 0 and 1
; float FluidGridSpacing : distance between grid points
; EFluidGridType FluidGridType : 
; float FluidHeightScale : vertical scale factor
; float FluidNoiseFrequency
; range FluidNoiseStrength : &quot;Noise&quot; or ripples that exist without a player interaction
; float FluidSpeed : wave speed
; int FluidXSize : num vertices in X direction
; int FluidYSize : num vertices in Y direction
; float NoRenderZ : 
; bool OrientTouchEffect : 
; bool OrientShootEffect : 
; float RippleVelocityFactor : How much to ripple the water when interacting with actors
; class&lt;[[Legacy:Actor|Actor]]&gt; ShootEffect : Class of effect spawned when water surface it shot or touched by an actor
; float ShootRadius : How large a radius is affected when water is shot
; float ShootStrength : How hard to ripple water when shot
; bool TestRipple 
; float TestRippleSpeed
; float TestRippleStrength
; float TestRippleRadius : Test ripple that shows only in editor.
; class&lt;[[Legacy:Actor|Actor]]&gt; TouchEffect : 
; float TouchStrength : 
; float UOffset : 
; float UpdateRate : Rate at which fluid sim will be updated.
; float UTiles : 
; float VOffset : 
; float VTiles : 
; float WarmUpTime : Amount of time to simulate during postload before water is first displayed

===UnrealScript-Only Properties ===
; array&lt;int&gt; ClampBitmap : Bitmap indicating which water verts are 'clamped' ie. dont move
; array&lt;float&gt; Verts0 (transient, const) : 
; array&lt;float&gt; Verts1 (transient, const) : 
; array&lt;byte&gt; VertAlpha (transient, const) : 
; int LatestVerts (transient, const) : 
; box FluidBoundingBox (transient, const) : Current world-space AABB
; vector FluidOrigin (transient, const) : Current bottom-left corner
; float TimeRollover (transient, const) : 
; float TestRippleAng (transient, const) : 
; [[Legacy:FluidSurfacePrimitive|FluidSurfacePrimitive]] Primitive (transient, const) : 
; array&lt;[[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]&gt; Oscillators (transient, const) : 
; bool bHasWarmedUp (transient, const) : 

==Enums ==

===EFluidGridType ===
; FGT_Square : 
; FGT_Hexagonal : 

==Quick HOWTO==

Here is a quick way to get a fluid surface in a level.

# [[Legacy:Add An Actor|Add an Actor]] of class FluidSurfaceInfo to the level.
# Change the FluidXSize and FluidYSize along with the FluidGridSpacing to size it correctly for the level space you want to use it in.
# Find the [[Legacy:Texture|Texture]] you want to use, and assign it to the first material in the  Display -&gt; Skins array
# Tweak extra settings to suit your level.
# Go shoot it.

==Related Topics==
* [[Legacy:Fluid Surfaces|Fluid Surfaces]] tutorial
* [[Legacy:XProcMesh|xProcMesh]] class
* [[Legacy:Holes In Fluid Surfaces|Holes In Fluid Surfaces]] tutorial

==Discussion==

'''Highlander:''' It seems that the FluidSurface is unlit by default as well. BTW.. the [[Legacy:Class Wikifier|Class Wikifier]] is pretty neat

'''Wormbo:''' Yeah, it's neat, but it still needs some work. I've redone the Properties section.

'''Jeeptrash:''' Anybody know what AlphaCurveScale and AlphaHeightScale do? The UDN tutorial implies that they change the alpha based on the height of a vertex but I can't seem to get this working to demo it. Does it change the alpha of an alpha map in the material? of the whole shader?

'''The Twiggman:''' Wow those things are neat. Lol I always wondered how some of the volumes were moving like that, so I decided to find out and I looked at curse3's little area. Now you can just replace that old sheet with one of these for good effects. But doesn't that make you think you can make neat effects like a big web or something and have it ripple as you fall through it.

'''Tony:''' So is it possible to create circular liquid surfaces with this actor, or is the engine limited in this aspect?

'''Wormbo:''' It seems the FluidSurcafeInfo is limited to flat surfaces. If you want a different shape you need to use an [[Legacy:XProcMesh|xProcMesh]].

'''Zengi:''' Is it possible to make a fluid type mesh while in game through code for summoning?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34535</id>
      <timestamp>2009-07-15T12:00:22Z</timestamp>
      <contributor>
        <username>Rejecht</username>
        <id>1657</id>
      </contributor>
      <minor/>
      <comment>/* EFluidGridType */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; FluidSurfaceInfo (Package: Engine)}}

A water-like surface. Actors can cause ripples by touching it. Unlike [[Legacy:XProcMesh|xProcMesh]]es, FluidSurfaceInfos do not deform when damaged.

==Properties ==

===FluidSurfaceInfo Group ===
; float AlphaCurveScale : 
; float AlphaHeightScale : 
; byte AlphaMax : 

does anyone know how to use the surface alpha property of fluidsurfaceinfo to blend a second material onto the peaks of the waves in a water surface? -jeeptrash

; bool bShowBoundingBox : 
; bool bUseNoRenderZ : 
; [[Legacy:TerrainInfo|TerrainInfo]] ClampTerrain (edfindable): Terrain used for auto-clamping water verts if below terrain level.
; color FluidColor : 
; float FluidDamping : between 0 and 1
; float FluidGridSpacing : distance between grid points
; EFluidGridType FluidGridType : 
; float FluidHeightScale : vertical scale factor
; float FluidNoiseFrequency
; range FluidNoiseStrength : &quot;Noise&quot; or ripples that exist without a player interaction
; float FluidSpeed : wave speed
; int FluidXSize : num vertices in X direction
; int FluidYSize : num vertices in Y direction
; float NoRenderZ : 
; bool OrientTouchEffect : 
; bool OrientShootEffect : 
; float RippleVelocityFactor : How much to ripple the water when interacting with actors
; class&lt;[[Legacy:Actor|Actor]]&gt; ShootEffect : Class of effect spawned when water surface it shot or touched by an actor
; float ShootRadius : How large a radius is affected when water is shot
; float ShootStrength : How hard to ripple water when shot
; bool TestRipple 
; float TestRippleSpeed
; float TestRippleStrength
; float TestRippleRadius : Test ripple that shows only in editor.
; class&lt;[[Legacy:Actor|Actor]]&gt; TouchEffect : 
; float TouchStrength : 
; float UOffset : 
; float UpdateRate : Rate at which fluid sim will be updated.
; float UTiles : 
; float VOffset : 
; float VTiles : 
; float WarmUpTime : Amount of time to simulate during postload before water is first displayed

===UnrealScript-Only Properties ===
; array&lt;int&gt; ClampBitmap : Bitmap indicating which water verts are 'clamped' ie. dont move
; array&lt;float&gt; Verts0 (transient, const) : 
; array&lt;float&gt; Verts1 (transient, const) : 
; array&lt;byte&gt; VertAlpha (transient, const) : 
; int LatestVerts (transient, const) : 
; box FluidBoundingBox (transient, const) : Current world-space AABB
; vector FluidOrigin (transient, const) : Current bottom-left corner
; float TimeRollover (transient, const) : 
; float TestRippleAng (transient, const) : 
; [[Legacy:FluidSurfacePrimitive|FluidSurfacePrimitive]] Primitive (transient, const) : 
; array&lt;[[Legacy:FluidSurfaceOscillator|FluidSurfaceOscillator]]&gt; Oscillators (transient, const) : 
; bool bHasWarmedUp (transient, const) : 

==Enums ==

===EFluidGridType ===
; FGT_Square : 
; FGT_Hexagonal :

FGT_Square is slightly faster.
FGT_Hexagonal looks better (default).

==Tips==
* If your FluidSurface inexplicably stops moving (it may have been working fine, then stopped after a rebuild or after subsequent additions/changes to your map), you're apparently experiencing a bug in the PHYS_FluidSurface Physics setting.  I'm told this problem also appears in DM-IronDiety, as their fluid surface seems all set up, but is completely immobile.  A lame, but servicable work-around is to &quot;jiggle&quot; (or change, then change back) a setting in your FluidSurfaceInfo actor, like FluidXSize, to get the surface physics to &quot;wake up&quot; in Ued, '''then''' save your map without another rebuild.  This will save the FluidSurface in a state that is active and it will appear so in game as well.  Unfortunately, this &quot;jiggling&quot; must take place after each rebuild to ensure your FluidSurface doesn't save in a frozen state.

==Quick HOWTO==

Here is a quick way to get a fluid surface in a level.

# [[Legacy:Add An Actor|Add an Actor]] of class FluidSurfaceInfo to the level.
# Change the FluidXSize and FluidYSize along with the FluidGridSpacing to size it correctly for the level space you want to use it in.
# Find the [[Legacy:Texture|Texture]] you want to use, and assign it to the first material in the  Display -&gt; Skins array
# Tweak extra settings to suit your level.
# Go shoot it.

==Related Topics==
* [[Legacy:Fluid Surfaces|Fluid Surfaces]] tutorial
* [[Legacy:XProcMesh|xProcMesh]] class
* [[Legacy:Holes In Fluid Surfaces|Holes In Fluid Surfaces]] tutorial

==Discussion==

'''Highlander:''' It seems that the FluidSurface is unlit by default as well. BTW.. the [[Legacy:Class Wikifier|Class Wikifier]] is pretty neat

'''Wormbo:''' Yeah, it's neat, but it still needs some work. I've redone the Properties section.

'''Jeeptrash:''' Anybody know what AlphaCurveScale and AlphaHeightScale do? The UDN tutorial implies that they change the alpha based on the height of a vertex but I can't seem to get this working to demo it. Does it change the alpha of an alpha map in the material? of the whole shader?

'''The Twiggman:''' Wow those things are neat. Lol I always wondered how some of the volumes were moving like that, so I decided to find out and I looked at curse3's little area. Now you can just replace that old sheet with one of these for good effects. But doesn't that make you think you can make neat effects like a big web or something and have it ripple as you fall through it.

'''Tony:''' So is it possible to create circular liquid surfaces with this actor, or is the engine limited in this aspect?

'''Wormbo:''' It seems the FluidSurcafeInfo is limited to flat surfaces. If you want a different shape you need to use an [[Legacy:XProcMesh|xProcMesh]].

'''Zengi:''' Is it possible to make a fluid type mesh while in game through code for summoning?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FluidSurfaceOscillator</title>
    <id>1283</id>
    <revision>
      <id>3285</id>
      <timestamp>2005-11-18T20:53:21Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; FluidSurfaceOscillator}}

==Introduction==

A fluid surface oscilator is an actor used to create ripples or waves at a point of origin on a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]] sheet, rather than having ambient ripples over a whole water surface.  The speed that the ripples travel, and the rate at which they die out, are governed by the FluidSurfaceInfo actor.  The FluidSurfaceOscillator is like a mechanical plunger moving up and down at a point on the surface.

==Properties==

===Main===
; FluidSurfaceInfo FluidInfo : Which [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]] sheet to affect.
; float Frequency : The rate of wave production.
; byte Phase: The wave offset.
; float Strength : The force applied to the fluid surface.
; float Radius : Determines the area affected by the oscillator. 

===Hidden===
; float OscTime (transient, const) :

==Notes==

Increasing the Frequency and keeping Strength the same results in smaller-height waves.

'''''NOTE:''''' The Radius property does not NOT need to be big enough to cover the fluid surface and it does NOT limit the extent of the wave effect on the fluid surface.

Radius seems to determine the area of the fluid surface that is directly driven by the FluidSurfaceOscillator.  Ripples can propagate beyond that distance, and indeed it's better if they 

do as they look more natural that way.

The affected radius can be viewed by right-clicking on the top bar of any viewport, and selecting Actors -&gt; Radii view.

==Discussion==

'''SuperApe:''' Is it possible that the smaller wave height resulting from the conditions mentioned in the Frequency note is actually due to the limits on the resolution of the Fluid Surface?

'''Sweavo:'''I don't think it was a graphical artifact that I was seeing.  It looks like Strength is actually modelled as a force, so at higher frequencies the force is applied for less time in each direction, resulting in lower ripples.  Actually, that makes so much sense, I'm changing the definition above!
 

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3286</id>
      <timestamp>2005-11-16T01:15:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; FluidSurfaceOscillator}}

A fluid surface oscilator is an actor used to create ripples or waves on a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]] sheet, rather than having ambient ripples over a whole water surface.  The speed that the ripples travel, and the rate at which they die out, are governed by the FluidSurfaceInfo actor.  The FluidSurfaceOscillator is like a mechanical plunger moving up and down at a point on the surface.

==Properties==

===Main===
; FluidSurfaceInfo FluidInfo : Which [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]] sheet to affect.
; float Frequency : The rate of wave production.  

Note that increasing the Frequency and keeping Strength the same results in smaller-height waves.
; byte Phase: The wave offset.
; float Strength : Influences the height of the waves or ripples.
; float Radius : Determines the area affected by the oscillator. 

This seems to determine the area of the fluid surface that is directly driven by the FluidSurfaceOscillator.  Ripples can propagate beyond that distance, and indeed it's better if they do as they look more natural that way.  

'''''NOTE:''''' The Radius property does not NOT need to be big enough to cover the fluid surface and it does NOT limit the extent of the wave effect on the fluid surface.

The affected radius can be viewed by right-clicking on the top bar of any viewport, and selecting Actors -&gt; Radii view.

===Hidden===
; float OscTime (transient, const) :

==Discussion==

'''SuperApe:''' Is it possible that the smaller wave height resulting from the conditions mentioned in the Frequency note is actually due to the limits on the resolution of the Fluid Surface?

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3287</id>
      <timestamp>2005-11-18T20:49:16Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; FluidSurfaceOscillator}}

==Introduction==

A fluid surface oscilator is an actor used to create ripples or waves at a point of origin on a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]] sheet, rather than having ambient ripples over a whole water surface.  The speed that the ripples travel, and the rate at which they die out, are governed by the FluidSurfaceInfo actor.  The FluidSurfaceOscillator is like a mechanical plunger moving up and down at a point on the surface.

==Properties==

===Main===
; FluidSurfaceInfo FluidInfo : Which [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]] sheet to affect.
; float Frequency : The rate of wave production.  
; Note that increasing the Frequency and keeping Strength the same results in smaller-height waves.
; byte Phase: The wave offset.
; float Strength : The force applied to the fluid surface.
; float Radius : Determines the area affected by the oscillator. 
; This seems to determine the area of the fluid surface that is directly driven by the FluidSurfaceOscillator.  Ripples can propagate beyond that distance, and indeed it's better if they do as they look more natural that way.  
; '''''NOTE:''''' The Radius property does not NOT need to be big enough to cover the fluid surface and it does NOT limit the extent of the wave effect on the fluid surface.

===Hidden===
; float OscTime (transient, const) :

==Tips==

The affected radius can be viewed by right-clicking on the top bar of any viewport, and selecting Actors -&gt; Radii view.

==Discussion==

'''SuperApe:''' Is it possible that the smaller wave height resulting from the conditions mentioned in the Frequency note is actually due to the limits on the resolution of the Fluid Surface?

'''Sweavo:'''I don't think it was a graphical artifact that I was seeing.  It looks like Strength is actually modelled as a force, so at higher frequencies the force is applied for less time in each direction, resulting in lower ripples.  Actually, that makes so much sense, I'm changing the definition above!
 

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FluidSurfacePrimitive</title>
    <id>28503</id>
    <revision>
      <id>40204</id>
      <timestamp>2009-11-17T10:58:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FluidTexture</title>
    <id>1249</id>
    <revision>
      <id>3220</id>
      <timestamp>2005-12-18T00:31:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; [[Legacy:WaterTexture|WaterTexture]] &gt;&gt; FluidTexture (Package: Fire)}}

A non-abstract subclass of WaterTexture without any new properties or methods and no subclasses.

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3221</id>
      <timestamp>2003-02-18T05:55:53Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; [[Legacy:WaterTexture|WaterTexture]] &gt;&gt; FluidTexture}}

A non-abstract subclass of WaterTexture without any new properties or methods and no subclasses.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3222</id>
      <timestamp>2003-05-23T07:32:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; [[Legacy:WaterTexture|WaterTexture]] &gt;&gt; FluidTexture (Package: Fire)}}

A non-abstract subclass of WaterTexture without any new properties or methods and no subclasses.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fly</title>
    <id>28342</id>
    <revision>
      <id>40009</id>
      <timestamp>2009-11-14T20:16:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FlyingPathNode</title>
    <id>1282</id>
    <revision>
      <id>3283</id>
      <timestamp>2007-07-27T14:10:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]] &gt;&gt; FlyingPathNode (Package: Engine)}}

[[Image:Legacy_UT2004.S_FlyingPath.png|right|FlyingPathNode icon]]

This is a PathNode actor for flying vehicles like the space fighters from AS-Mothership, the Raptor or the Cicada. If a hovering vehicle like the Manta should be able to use the path as well, use a [[Legacy:HoverPathNode|HoverPathNode]] instead.

==Related Topics==
* [[Legacy:Bot Pathing|Bot Pathing]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For ONS|Mapping for ONS]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For VCTF|Mapping for VCTF]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3284</id>
      <timestamp>2006-01-18T16:06:55Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] :: [[Legacy:NavigationPoint|NavigationPoint]] :: [[Legacy:PathNode|PathNode]] &gt;&gt; FlyingPathNode (Package: Engine)}}

This is a PathNode actor meant for flying vehicles.

==Related Topics==
* [[Legacy:Bot Pathing|Bot Pathing]]
** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For ONS|Mapping for ONS]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For VCTF|Mapping for VCTF]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fog</title>
    <id>1232</id>
    <revision>
      <id>3182</id>
      <timestamp>2006-11-29T02:23:04Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <comment>*Added Links</comment>
      <text xml:space="preserve">Fog can be used to great effect to create atmosphere and emphasize distance. There are several types of fog available in the [[Legacy:Unreal Engine|unreal engine]]:

; [[Legacy:View Fog|View Fog]] : works by simply tinting the rendered scene by a specified amount. Cheap but not realistic. Works in [[Legacy:UT|UT]]-generation versions, and theoretically in [[Legacy:UT2003|UT2003]].
; [[Legacy:Volumetric Fog|volumetric fog]] : something like an extended corona. It behaves like distance fog, but takes the shape of a sphere around a light source. Present in UT, not sure about UT2003. See below.
; [[Legacy:Distance Fog|Distance Fog]] : sort of possible in UT (we think), and radically updated for UT2003. Very realistic: the tint of an object is deeper the further away it is form the camera, so the fog appears thick at a distance, so much so that it can hide things completely. This can be used to occlude, which helps with [[Legacy:Map Optimization|map optimization]].
; [[Legacy:Emitter Fog|emitter fog]] : new in UT2003. The most demanding form of fog, resource wise. The only advantage Emitter-based fog has over distance fog is that emitter-based fog can move and creep about on your level. See below.
; [[Legacy:Fog Ring|fog ring]] : this isn't fog at all, but a way of faking fog in the [[Legacy:SkyBox|SkyBox]]. A fog ring is simply a cylindrical static mesh with a foggy-looking texture. See the [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]] for where to find them in UT2003/2004 packages.

==[[Legacy:Emitter Fog|Emitter Fog]]==

Emitter Fog is available only in UT2003 and UT2004 and is the most demanding form of fog, resource wise. The only advantage Emitter-based fog has over distance fog is that emitter-based fog can move and creep about on your level. Emitter fog is created by simply making an [[Legacy:Emitter|Emitter]] with a very large range of locations for particles to be spawned. The particles should be translucent, very slow moving, relatively large (for performance reasons), and also should look somewhat foggy. This can take some experimentation to get right, but fortunately, emitter fog can be seen in the 3D viewport in the editor if [[Legacy:Realtime Preview|realtime preview]] is enabled.

==[[Legacy:Volumetric Fog|Volumetric Fog]]==

Volumetric fog is something like an extended corona. It behaves like distance fog, but takes the shape of a sphere around a light source. I do not know if it is availible in UT2003, but I would suspect that it is. In Unreal Tournament, the radius of the spherical &quot;fog&quot; can be specified in the light's properties by setting the VolumeBrightness, VolumeFog, and VolumeRadius properties in the Lighting group.  The fog will only be visible if the camera is within a zone that has ''bFogZone''=true.

==Tips and Tricks ==

===Original Unreal Tournament ===

Fog is ''very'' handy with skyboxes that are a moving sky scene in the air. Your map will be more eye-pleasing if you have fog in the skybox. Also, who would want to see the sides of the skybox if your supposed to see the clouds flying by because your high in the sky? Anyway, if the skybox is a square, put eight lights on the perimeter and one in the center. Select all of the lights that you just created and fool around with the properties mentioned above. Be sure to not forget to set the &quot;bFogZone&quot; property to &quot;True&quot;.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Lighting|Lighting]]

==Discussion==

'''Ragdoll:''' I tend to use physicsvolume fog rather than distance fog. Distance fog has a tendency to allow you to see the outermost walls of your level fold away revealing the void, which can cause a HOM. Isn't this supposed to be prevented by '''bCleartofogcolour=True''' ? 

'''Foxpaw:''' The fog in physics volumes is distance fog. Fog can also be set for zones, but both are examples of distance fog.

'''EricBlade:''' I'm curious as to if anyone knows a way to attach an emitter's particles to a moving base?  I've managed to create some really great looking emitter fog, and my game has a special [[Legacy:WeatherEffect|WeatherEffect]] that attaches to a player, to simulate weather throughout an entire zone, by just attaching a smaller amount directly to the player.  It works fantastically for rain, snow, some occasional falling leaves, but for something slow moving/building like fog, the player just outruns it unless sitting still for a time.  

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3183</id>
      <timestamp>2006-04-06T14:46:33Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Fog can be used to great effect to create atmosphere and emphasize distance. There are several types of fog available in the [[Legacy:Unreal Engine|unreal engine]]:

; view fog : works by simply tinting the rendered scene by a specified amount. Cheap but not realistic. Works in [[Legacy:UT|UT]]-generation versions, and theoretically in [[Legacy:UT2003|UT2003]]. See [[Legacy:View Fog|View Fog]].
; volumetric fog : something like an extended corona. It behaves like distance fog, but takes the shape of a sphere around a light source. Present in UT, not sure about UT2003. See below.
; distance fog : sort of possible in UT (we think), and radically updated for UT2003. Very realistic: the tint of an object is deeper the further away it is form the camera, so the fog appears thick at a distance, so much so that it can hide things completely. This can be used to occlude, which helps with [[Legacy:Map Optimization|map optimization]]. See [[Legacy:Distance Fog|Distance Fog]].
; emitter fog : new in UT2003. The most demanding form of fog, resource wise. The only advantage Emitter-based fog has over distance fog is that emitter-based fog can move and creep about on your level. See below.
; fog ring : this isn't fog at all, but a way of faking fog in the [[Legacy:SkyBox|SkyBox]]. A fog ring is simply a cylindrical static mesh with a foggy-looking texture. See the [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]] for where to find them in UT2003/2004 packages.

==Emitter Fog==

Emitter Fog is available only in UT2003 and UT2004 and is the most demanding form of fog, resource wise. The only advantage Emitter-based fog has over distance fog is that emitter-based fog can move and creep about on your level. Emitter fog is created by simply making an [[Legacy:Emitter|Emitter]] with a very large range of locations for particles to be spawned. The particles should be translucent, very slow moving, relatively large (for performance reasons), and also should look somewhat foggy. This can take some experimentation to get right, but fortunately, emitter fog can be seen in the 3D viewport in the editor if [[Legacy:Realtime Preview|realtime preview]] is enabled.

==Volumetric Fog==

Volumetric fog is something like an extended corona. It behaves like distance fog, but takes the shape of a sphere around a light source. I do not know if it is availible in UT2003, but I would suspect that it is. In Unreal Tournament, the radius of the spherical &quot;fog&quot; can be specified in the light's properties by setting the VolumeBrightness, VolumeFog, and VolumeRadius properties in the Lighting group.  The fog will only be visible if the camera is within a zone that has ''bFogZone''=true.

==Tips and Tricks ==

===Original Unreal Tournament ===

Fog is ''very'' handy with skyboxes that are a moving sky scene in the air. Your map will be more eye-pleasing if you have fog in the skybox. Also, who would want to see the sides of the skybox if your supposed to see the clouds flying by because your high in the sky? Anyway, if the skybox is a square, put eight lights on the perimeter and one in the center. Select all of the lights that you just created and fool around with the properties mentioned above. Be sure to not forget to set the &quot;bFogZone&quot; property to &quot;True&quot;.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Lighting|Lighting]]

==Discussion==

'''Ragdoll:''' I tend to use physicsvolume fog rather than distance fog. Distance fog has a tendency to allow you to see the outermost walls of your level fold away revealing the void, which can cause a HOM. Isn't this supposed to be prevented by '''bCleartofogcolour=True''' ? 

'''Foxpaw:''' The fog in physics volumes is distance fog. Fog can also be set for zones, but both are examples of distance fog.

'''EricBlade:''' I'm curious as to if anyone knows a way to attach an emitter's particles to a moving base?  I've managed to create some really great looking emitter fog, and my game has a special [[Legacy:WeatherEffect|WeatherEffect]] that attaches to a player, to simulate weather throughout an entire zone, by just attaching a smaller amount directly to the player.  It works fantastically for rain, snow, some occasional falling leaves, but for something slow moving/building like fog, the player just outruns it unless sitting still for a time.  

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; This &quot;overview&quot; page should have proper linkage.  Perhaps revise and/or refactor.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Font</title>
    <id>1228</id>
    <revision>
      <id>3172</id>
      <timestamp>2004-03-15T17:43:10Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>Added related topics</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; Font ''(Primitive, in UnTex.h, no class source)''}}

A font object contains information about a set of glyphs.  The glyph bitmaps are stored in the contained textures, while the font database only contains the coordinates of the individual glyph.

hmm i think this is about the scrolling textures that display the score so ill just describe that. All you have to do is find scripted utx and select something like condemed font. now place this texture on the thing u want it on. now you want to go find the scrolling text actor (i forgot were it is :\) and place it by the scoreboard. it's defaulted to say what the score is, so thats it. You can also make it say whatever you want basicly. you just find were it says the text in the actor proporties of the scrolling text thingy and mess around with it.

To be covered:

* How to use Canvas.Font and the MyFonts class.
* How to import font textures.
* [http://unreal.epicgames.com/TTFImport.htm How to import own TrueType fonts].
* Link to [[Legacy:RotatedText|RotatedText]] and [[Legacy:Screen|Screen]].

==Related topics ==
* [[udn2:FontTutorial]]
* [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]]

&amp;rarr;Comments&amp;rarr;

'''Soldat:''' I've been fussing around with the ut2003 menu fonts, trying to add my own fonts, and I realize that i have to subclass GUIController or do something stupid like that. I think a page devoted to ut2003 fonts should be made, but i'm not sure where to put it.

'''Csimbi:''' The following constants are available in UT'99:
* F_Normal = 0
* F_Bold = 1 
* F_Large = 2 
* F_LargeBold = 3</text>
    </revision>
    <revision>
      <id>3173</id>
      <timestamp>2003-12-03T21:47:59Z</timestamp>
      <contributor>
        <ip>Csimbi</ip>
      </contributor>
      <comment>Added font constants</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; Font ''(Primitive, in UnTex.h, no class source)''}}

A font object contains information about a set of glyphs.  The glyph bitmaps are stored in the contained textures, while the font database only contains the coordinates of the individual glyph.

hmm i think this is about the scrolling textures that display the score so ill just describe that. All you have to do is find scripted utx and select something like condemed font. now place this texture on the thing u want it on. now you want to go find the scrolling text actor (i forgot were it is :\) and place it by the scoreboard. it's defaulted to say what the score is, so thats it. You can also make it say whatever you want basicly. you just find were it says the text in the actor proporties of the scrolling text thingy and mess around with it.

To be covered:

* How to use Canvas.Font and the MyFonts class.
* How to import font textures.
* [http://unreal.epicgames.com/TTFImport.htm How to import own TrueType fonts].
* Link to [[Legacy:RotatedText|RotatedText]] and [[Legacy:Screen|Screen]].

&amp;rarr;Comments&amp;rarr;

'''Soldat:''' I've been fussing around with the ut2003 menu fonts, trying to add my own fonts, and I realize that i have to subclass GUIController or do something stupid like that. I think a page devoted to ut2003 fonts should be made, but i'm not sure where to put it.

'''Csimbi:''' The following constants are available in UT'99:
* F_Normal = 0
* F_Bold = 1 
* F_Large = 2 
* F_LargeBold = 3</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FontInfo</title>
    <id>1234</id>
    <revision>
      <id>3186</id>
      <timestamp>2002-08-10T22:54:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; FontInfo}}

Loads and stores the fonts used by the [[Legacy:ChallengeHUD|ChallengeHUD]] classes.

==Properties ==
; float SavedWidth[7] :
; Font SavedFont[7] :

==Methods ==

====Non-Static ====
; Font GetHugeFont (float Width)
; Font GetBigFont (float Width)
; Font GetMediumFont (float Width)
; Font GetSmallFont (float Width)
; Font GetSmallestFont (float Width)
; Font GetAReallySmallFont (float Width)
; Font GetACompletelyUnreadableFont (float Width) : Returns a font based on the width of the screen. This font is saved in the SavedFont variable for each font size.

====Static ====
; Font GetStaticHugeFont (float Width)
; Font GetStaticBigFont (float Width)
; Font GetStaticMediumFont (float Width)
; Font GetStaticSmallFont (float Width)
; Font GetStaticSmallestFont (float Width)
; Font GetStaticAReallySmallFont (float Width)
; Font GetStaticACompletelyUnreadableFont (float Width) : Loads and returns a font based on the width of the screen.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foogod</title>
    <id>1273</id>
    <revision>
      <id>3269</id>
      <timestamp>2006-07-19T16:07:46Z</timestamp>
      <contributor>
        <ip>C-71-195-63-30.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Greetings!==

I am Foogod.  Welcome to my page.

I hope to have something more interesting here soon, but at the moment I'm working on finishing the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] here on the Wiki.

If you have questions or comments about the tutorial, or anything else, feel free to post them here, and I'll do my best to answer them.

==My Stylesheet==

In case anybody cares, I've put together a custom stylesheet for the Wiki here which I like a bit better than the default options.  You can read all about it on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stylesheet]].

==My Journal==

For anyone who might be interested, I also have a (small) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal|developer journal]] as well.

==Comments==

'''Mychaeel:''' Welcome to the wiki :-)

'''Graphik:''' Excellent work you've been doing. :tup:

'''Zxanphorian:''' Hi and welcome to the wiki :):tup: BTW: your assault mapping tutorial is awesome, it has pictures and an example map (which is always needed for a mapping tutorial) ;)

'''Foogod:''' Thanks, all..  I've learned a great deal from reading this Wiki and wanted to contribute something useful.  I'd also been rather frustrated at the lack of good UT2004-Assault tutorials out there on the web, so I figured this was a good opportunity (I actually just noticed shortly before uploading all of this that MarZer had made some comments about making an Assault tutorial a little bit ago.. I hope I didn't tromple all over anything that other people were in the middle of working on themselves).  I'm hoping that this tutorial will actually get people a bit more interested in making Assault maps, and hopefully good Assault maps, as that's something the UT2004 world seems to be severely lacking at the moment..  With luck, I'll have the rest of it written up and posted within a week or two..

'''Graphik:''' I wouldn't worry about duplicating things MarZer's working on; he hasn't been around in a while.

'''Suran:''' Yo im useing part of ur tutorial to make a map of my own. How would u make it so when u destroy and object it triggers a

door to open? THX in advance :) :tup: :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3270</id>
      <timestamp>2004-12-16T06:55:33Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Greetings!==

I am Foogod.  Welcome to my page.

I hope to have something more interesting here soon, but at the moment I'm working on finishing the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] here on the Wiki.

If you have questions or comments about the tutorial, or anything else, feel free to post them here, and I'll do my best to answer them.

==My Stylesheet==

In case anybody cares, I've put together a custom stylesheet for the Wiki here which I like a bit better than the default options.  You can read all about it on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stylesheet]].

==My Journal==

For anyone who might be interested, I also have a (small) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal|developer journal]] as well.

==Comments==

'''Mychaeel:''' Welcome to the wiki :-)

'''Graphik:''' Excellent work you've been doing. :tup:

'''Zxanphorian:''' Hi and welcome to the wiki :):tup: BTW: your assault mapping tutorial is awesome, it has pictures and an example map (which is always needed for a mapping tutorial) ;)

'''Foogod:''' Thanks, all..  I've learned a great deal from reading this Wiki and wanted to contribute something useful.  I'd also been rather frustrated at the lack of good UT2004-Assault tutorials out there on the web, so I figured this was a good opportunity (I actually just noticed shortly before uploading all of this that MarZer had made some comments about making an Assault tutorial a little bit ago.. I hope I didn't tromple all over anything that other people were in the middle of working on themselves).  I'm hoping that this tutorial will actually get people a bit more interested in making Assault maps, and hopefully good Assault maps, as that's something the UT2004 world seems to be severely lacking at the moment..  With luck, I'll have the rest of it written up and posted within a week or two..

'''Graphik:''' I wouldn't worry about duplicating things MarZer's working on; he hasn't been around in a while.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3271</id>
      <timestamp>2006-07-19T16:06:59Z</timestamp>
      <contributor>
        <ip>C-71-195-63-30.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Greetings!==

I am Foogod.  Welcome to my page.

I hope to have something more interesting here soon, but at the moment I'm working on finishing the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] here on the Wiki.

If you have questions or comments about the tutorial, or anything else, feel free to post them here, and I'll do my best to answer them.

==My Stylesheet==

In case anybody cares, I've put together a custom stylesheet for the Wiki here which I like a bit better than the default options.  You can read all about it on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stylesheet]].

==My Journal==

For anyone who might be interested, I also have a (small) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal|developer journal]] as well.

==Comments==

'''Mychaeel:''' Welcome to the wiki :-)

'''Graphik:''' Excellent work you've been doing. :tup:

'''Zxanphorian:''' Hi and welcome to the wiki :):tup: BTW: your assault mapping tutorial is awesome, it has pictures and an example map (which is always needed for a mapping tutorial) ;)

'''Foogod:''' Thanks, all..  I've learned a great deal from reading this Wiki and wanted to contribute something useful.  I'd also been rather frustrated at the lack of good UT2004-Assault tutorials out there on the web, so I figured this was a good opportunity (I actually just noticed shortly before uploading all of this that MarZer had made some comments about making an Assault tutorial a little bit ago.. I hope I didn't tromple all over anything that other people were in the middle of working on themselves).  I'm hoping that this tutorial will actually get people a bit more interested in making Assault maps, and hopefully good Assault maps, as that's something the UT2004 world seems to be severely lacking at the moment..  With luck, I'll have the rest of it written up and posted within a week or two..

'''Graphik:''' I wouldn't worry about duplicating things MarZer's working on; he hasn't been around in a while.

'''Suran:''' Yo im useing part of ur tutorial to make a map of my own. How would u make it so when u destroy and object it triggers a

door to open? THX in advance ;);););)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foogod/Journal</title>
    <id>1277</id>
    <revision>
      <id>3276</id>
      <timestamp>2008-02-07T20:48:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>...</comment>
      <text xml:space="preserve">==Developer Journal==

What am I up to?  Let's find out...

===Dec 15, 2004===

Well, it took longer than I had planned (work's been kinda hectic lately), but I finally got [[Legacy:Assault Mapping Tutorial/Continuing The Assault|Assault Mapping Tutorial/Continuing the Assault]] and [[Legacy:Assault Mapping Tutorial/Other Objectives|Assault Mapping Tutorial/Other Objectives]] up, with accompanying map files and everything.  I still need to clean up a few links to Wiki pages which don't exist yet but should..  I actually want to add a bit to the objectives page about delivery-type objectives (Junkyard energy core based stuff) and LockedObjectives, but since those both require a bit of scripting I didn't have time to really put together a good explanation.  Hopefully I'll be able to do that soon.

Not sure how much time I'll have for this sort of stuff in the near future what with Xmas coming and all, but we'll see.. I'd really like to get the tutorial done before I have a whole bunch of new toys to play with under the tree..</text>
    </revision>
    <revision>
      <id>3277</id>
      <timestamp>2008-02-07T20:19:42Z</timestamp>
      <contributor>
        <ip>64-73-249-183.static-ip.telepacific.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">lulz gone</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foogod/Stylesheet</title>
    <id>1276</id>
    <revision>
      <id>3275</id>
      <timestamp>2004-12-10T05:13:25Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>Made a new stylesheet for the wiki..</comment>
      <text xml:space="preserve">I (Foogod) have put together a custom CSS stylesheet for use with the Wiki.  Anyone who wants to is welcome to use it as well.

==Simple Gray Stylesheet==

(The following is quoted from the comments included with the CSS stylesheet:)

This is a stylesheet intended to be used with the Unreal Wiki (http://wiki.beyondunreal.com/).  This theme is based on the &quot;Chilled Blue&quot; stylesheet, with some changes to accomplish a few particular goals:

# Reduction of wasted space.  The width of the sidebar has been reduced so it isn't taking up so much of the content area of the screen.  Quote boxes now take up a decent portion of the content width, instead of having huge blank spaces on either side of a &quot;cash register receipt width&quot; box of text.  Various other elements have had margins or other whitespace reduced to make more effective use of the screen real estate.

# Made some elements (table borders, colored text) a bit more visible on some LCD screens.

# More consistent theme.  Some of the elements of the &quot;Chilled Blue&quot; style seemed somewhat inconsistent and jarring (the green headers, etc).  Well, to me at least..

# Better distinction of different parts of the Wiki interface.  The footer, diff displays, etc are now clearly distinct from the content of the page. (not really critical, but I think it makes it look better and is a bit easier to find what you're looking for at a glance)

Other things done along the way:

* Color changes to make a general &quot;shades of gray&quot; theme.  Personally, I find this not only to look good, but also to be more soothing to read.

* Made underline (&lt;code&gt;&lt;u&gt;&lt;/u&gt;&lt;/code&gt;) styling more distinctive, so it won't be confused with links.

* Cleaned up the stylesheet to use more relative font sizing and element spacing, so the font can be (more or less) scaled globally (to account for higher resolution screens, etc) and everything else will adjust appropriately.  (if nothing else, it's good CSS policy to do things this way)

==Using the Stylesheet==

To use this stylesheet, open your Preferences page, go to the bottom, and enter the following URL into the box labelled &quot;External CSS file (overrides content)&quot;:

 http://www.foogod.com/~alex/styles.sgray.css

That's all there is to it.  Feedback is welcome.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:For</title>
    <id>1286</id>
    <revision>
      <id>3290</id>
      <timestamp>2006-06-20T17:47:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Flow Syntax]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Flow Syntax|Flow Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ForEach</title>
    <id>1287</id>
    <revision>
      <id>3291</id>
      <timestamp>2006-06-20T17:47:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Flow Syntax]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Flow Syntax|Flow Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ForceScoreReset</title>
    <id>1284</id>
    <revision>
      <id>3288</id>
      <timestamp>2006-04-05T22:11:45Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Just a nice bit of code if you ever want to reset the Team Scores of an Assault game

&lt;uscript&gt;
//=============================================================================
// ASForceScoreReset.
//=============================================================================
class ASForceScoreReset extends Triggers
	placeable;

function Trigger( actor Other, pawn EventInstigator )
{
	ASGameInfo(Level.Game).Teams[0].Score = 0;
	ASGameInfo(Level.Game).Teams[1].Score = 0;
}
&lt;/uscript&gt;

All you have to do is trigger this when to round begins (a scripted trigger with a trigger event as its first value will do) or just set the objects tag to BeginRound (not tested)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FortStandard</title>
    <id>1237</id>
    <revision>
      <id>3192</id>
      <timestamp>2006-12-22T13:27:34Z</timestamp>
      <contributor>
        <ip>Tarnationsauce2</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:StationaryPawn|StationaryPawn]] &gt;&gt; FortStandard}}

This actor marks objectives in an Assault type map. See [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]].

You need to make this in your assault levels to make them work.

To make the time limit for your assault level you need to open the last FortStandard's properties and select defense time and put what ever you want the time limit to be for your level.

You will need to plan and build your level before using this actor. Once you have built your level place a FortStandard VERY CLOSE to the objective, as there are two ways to trigger this actor: damage and touch. First a list of all the actor specific variables you will need to be familiar with:

==Properties ==
; bFinalFort : When this objective has been triggered, the mission will end. 
; bFlashing : When damage is taken, the fort standard will flash. Not sure what the damage threshold for this is. 
; bForceRadius : If true, bots will charge when they are within a specified radius. 
; bSayDestroyed : Bots will use a voicepack recording if they have accomplished this objective. 
; bSelfDisplayed : If true, the fort standard will be visible as a small flag in game. Almost always set false. 
; bTriggerOnly : Set to true if you want the objective to be triggered by touch instead of damage.
; ChargeDist : This is the distance from which bots will  begin charging if bForceRadius is set true. 
; DamageEvent : This has several slots for calling multiple events. Similar to a [[Legacy:Dispatcher|Dispatcher]]. 
; DmgEventThreshold : The amount of damage that is needed to trigger DamageEvent. Different damage amounts can be set for different events.
; DefensePriority : In which order bots should defend the objectives. The higher the number, the higher the Priority. I have no idea if there is a limit to the amount of objectives, or how big a number to put here. I do know that you can only place seven objectives in the [[Legacy:AssaultInfo|AssaultInfo]] actor. (Explained later)
; DefenseTime : Simply the amount of time in minutes that players have to complete the level. The default value is ten, meaning ten minutes. But I have found out by fiddling that if you have different values in this field for each FortStandard, the engine will take the highest value as the intended game time limit
; DestroyedMessage : This is the message to be shown when objective is destroyed. Used in combination with the FortName value.
; EndCamTag : Tag of the [[Legacy:SpectatorCam|SpectatorCam]] you are using as an end camera. I do not know if each standard needs this or if it is only the final.
; FallBackFort : The tag of the fort which defenders should fall back to. I would recommend leaving this blank, and utilizing the DefensePriority property to indicate for the bots where to go.
; FortName : Name of the objective. Will be shown with the destroyed message. 
; NearestPathNodeTag : The Tag of the nearest [[Legacy:PathNode|PathNode]] looking in the direction of the attackers (see [[Legacy:Match These Tags|Match These Tags]] for more information). Bots should reach this node ''before'' they reach the FortStandard.

==Discussion ==

[[Legacy:SabbathCat|SabbathCat]] :  Hey Mango, nice work collating. Hope you stick around a while to add some more, definitely a pro already with WIKI mark-up. I added the pathnode tag thing. As observed from a fair few AS maps from Epic. :)  

'''Tarquin:''' Nice stuff, but should maybe be moved to [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]? :)

'''King Mango:''' Yup will do. New here, but am getting the hang of the method. Thanks guys :D!!

'''Tarquin:''' the props list says set DefenseTime  to the same value for each one, but the top paragraphs say you only need to set it for the final Standard. Which is true?

'''MythOpus:''' I believe you only have to set the time in the AssaultInfo... or at least, thats how I remember it.  I'ts been so long O_o

'''King Mango''' I have found out by experimentation regarding the correct info for DefenseTime. Page reflects changes.

'''SabbathKatze:''' Do the Damage Events actually work? I've tried linking them to both a Movers Tag and Event, and neither seems to fire them off. :S?

'''King Mango''' My apologies, I misinformed as to defense priority. It has been fixed. Couldn't figure out why my bots kept trying to attack and defend from the second objective as I was playtesting. Then changed the values, and batta-boom, batta-bing, they are working fine.

'''xX)(Xx'''

Also, fortstandards in Assault maps are affected by ZEROPING weapons, the zeroping weapons just can't hit the fortstandards, it would be great to know why, see 

http://wiki.beyondunreal.com/wiki/Lag_Compensation 

for more info on ZeroPing

'''tarnationsauce2''' It seems FortStandards are hard coded at a maximum of 16 (0-15).

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3193</id>
      <timestamp>2004-02-23T04:33:43Z</timestamp>
      <contributor>
        <ip>Ben2500</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:StationaryPawn|StationaryPawn]] &gt;&gt; FortStandard}}

This actor marks objectives in an Assault type map. See [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]].

You need to make this in your assault levels to make them work.

To make the time limit for your assault level you need to open the last FortStandard's properties and select defense time and put what ever you want the time limit to be for your level.

You will need to plan and build your level before using this actor. Once you have built your level place a FortStandard VERY CLOSE to the objective, as there are two ways to trigger this actor: damage and touch. First a list of all the actor specific variables you will need to be familiar with:

==Properties ==
; bFinalFort : When this objective has been triggered, the mission will end. 
; bFlashing : When damage is taken, the fort standard will flash. Not sure what the damage threshold for this is. 
; bForceRadius : If true, bots will charge when they are within a specified radius. 
; bSayDestroyed : Bots will use a voicepack recording if they have accomplished this objective. 
; bSelfDisplayed : If true, the fort standard will be visible as a small flag in game. Almost always set false. 
; bTriggerOnly : Set to true if you want the objective to be triggered by touch instead of damage.
; ChargeDist : This is the distance from which bots will  begin charging if bForceRadius is set true. 
; DamageEvent : This has several slots for calling multiple events. Similar to a [[Legacy:Dispatcher|Dispatcher]]. 
; DmgEventThreshold : The amount of damage that is needed to trigger DamageEvent. Different damage amounts can be set for different events.
; DefensePriority : In which order bots should defend the objectives. The higher the number, the higher the Priority. I have no idea if there is a limit to the amount of objectives, or how big a number to put here. I do know that you can only place seven objectives in the [[Legacy:AssaultInfo|AssaultInfo]] actor. (Explained later)
; DefenseTime : Simply the amount of time in minutes that players have to complete the level. The default value is ten, meaning ten minutes. But I have found out by fiddling that if you have different values in this field for each FortStandard, the engine will take the highest value as the intended game time limit
; DestroyedMessage : This is the message to be shown when objective is destroyed. Used in combination with the FortName value.
; EndCamTag : Tag of the [[Legacy:SpectatorCam|SpectatorCam]] you are using as an end camera. I do not know if each standard needs this or if it is only the final.
; FallBackFort : The tag of the fort which defenders should fall back to. I would recommend leaving this blank, and utilizing the DefensePriority property to indicate for the bots where to go.
; FortName : Name of the objective. Will be shown with the destroyed message. 
; NearestPathNodeTag : The Tag of the nearest [[Legacy:PathNode|PathNode]] looking in the direction of the attackers (see [[Legacy:Match These Tags|Match These Tags]] for more information). Bots should reach this node ''before'' they reach the FortStandard.

==Discussion ==

[[Legacy:SabbathCat|SabbathCat]] :  Hey Mango, nice work collating. Hope you stick around a while to add some more, definitely a pro already with WIKI mark-up. I added the pathnode tag thing. As observed from a fair few AS maps from Epic. :)  

'''Tarquin:''' Nice stuff, but should maybe be moved to [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]? :)

'''King Mango:''' Yup will do. New here, but am getting the hang of the method. Thanks guys :D!!

'''Tarquin:''' the props list says set DefenseTime  to the same value for each one, but the top paragraphs say you only need to set it for the final Standard. Which is true?

'''MythOpus:''' I believe you only have to set the time in the AssaultInfo... or at least, thats how I remember it.  I'ts been so long O_o

'''King Mango''' I have found out by experimentation regarding the correct info for DefenseTime. Page reflects changes.

'''SabbathKatze:''' Do the Damage Events actually work? I've tried linking them to both a Movers Tag and Event, and neither seems to fire them off. :S?

'''King Mango''' My apologies, I misinformed as to defense priority. It has been fixed. Couldn't figure out why my bots kept trying to attack and defend from the second objective as I was playtesting. Then changed the values, and batta-boom, batta-bing, they are working fine.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3194</id>
      <timestamp>2004-09-19T11:37:06Z</timestamp>
      <contributor>
        <ip>ACBDA274.ipt.aol.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:StationaryPawn|StationaryPawn]] &gt;&gt; FortStandard}}

This actor marks objectives in an Assault type map. See [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]].

You need to make this in your assault levels to make them work.

To make the time limit for your assault level you need to open the last FortStandard's properties and select defense time and put what ever you want the time limit to be for your level.

You will need to plan and build your level before using this actor. Once you have built your level place a FortStandard VERY CLOSE to the objective, as there are two ways to trigger this actor: damage and touch. First a list of all the actor specific variables you will need to be familiar with:

==Properties ==
; bFinalFort : When this objective has been triggered, the mission will end. 
; bFlashing : When damage is taken, the fort standard will flash. Not sure what the damage threshold for this is. 
; bForceRadius : If true, bots will charge when they are within a specified radius. 
; bSayDestroyed : Bots will use a voicepack recording if they have accomplished this objective. 
; bSelfDisplayed : If true, the fort standard will be visible as a small flag in game. Almost always set false. 
; bTriggerOnly : Set to true if you want the objective to be triggered by touch instead of damage.
; ChargeDist : This is the distance from which bots will  begin charging if bForceRadius is set true. 
; DamageEvent : This has several slots for calling multiple events. Similar to a [[Legacy:Dispatcher|Dispatcher]]. 
; DmgEventThreshold : The amount of damage that is needed to trigger DamageEvent. Different damage amounts can be set for different events.
; DefensePriority : In which order bots should defend the objectives. The higher the number, the higher the Priority. I have no idea if there is a limit to the amount of objectives, or how big a number to put here. I do know that you can only place seven objectives in the [[Legacy:AssaultInfo|AssaultInfo]] actor. (Explained later)
; DefenseTime : Simply the amount of time in minutes that players have to complete the level. The default value is ten, meaning ten minutes. But I have found out by fiddling that if you have different values in this field for each FortStandard, the engine will take the highest value as the intended game time limit
; DestroyedMessage : This is the message to be shown when objective is destroyed. Used in combination with the FortName value.
; EndCamTag : Tag of the [[Legacy:SpectatorCam|SpectatorCam]] you are using as an end camera. I do not know if each standard needs this or if it is only the final.
; FallBackFort : The tag of the fort which defenders should fall back to. I would recommend leaving this blank, and utilizing the DefensePriority property to indicate for the bots where to go.
; FortName : Name of the objective. Will be shown with the destroyed message. 
; NearestPathNodeTag : The Tag of the nearest [[Legacy:PathNode|PathNode]] looking in the direction of the attackers (see [[Legacy:Match These Tags|Match These Tags]] for more information). Bots should reach this node ''before'' they reach the FortStandard.

==Discussion ==

[[Legacy:SabbathCat|SabbathCat]] :  Hey Mango, nice work collating. Hope you stick around a while to add some more, definitely a pro already with WIKI mark-up. I added the pathnode tag thing. As observed from a fair few AS maps from Epic. :)  

'''Tarquin:''' Nice stuff, but should maybe be moved to [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]? :)

'''King Mango:''' Yup will do. New here, but am getting the hang of the method. Thanks guys :D!!

'''Tarquin:''' the props list says set DefenseTime  to the same value for each one, but the top paragraphs say you only need to set it for the final Standard. Which is true?

'''MythOpus:''' I believe you only have to set the time in the AssaultInfo... or at least, thats how I remember it.  I'ts been so long O_o

'''King Mango''' I have found out by experimentation regarding the correct info for DefenseTime. Page reflects changes.

'''SabbathKatze:''' Do the Damage Events actually work? I've tried linking them to both a Movers Tag and Event, and neither seems to fire them off. :S?

'''King Mango''' My apologies, I misinformed as to defense priority. It has been fixed. Couldn't figure out why my bots kept trying to attack and defend from the second objective as I was playtesting. Then changed the values, and batta-boom, batta-bing, they are working fine.

'''xX)(Xx'''

Also, fortstandards in Assault maps are affected by ZEROPING weapons, the zeroping weapons just can't hit the fortstandards, it would be great to know why, see 

http://wiki.beyondunreal.com/wiki/Lag_Compensation 

for more info on ZeroPing

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foxpaw</title>
    <id>1233</id>
    <revision>
      <id>3184</id>
      <timestamp>2007-12-24T18:41:30Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Foxpaw???</comment>
      <text xml:space="preserve">==Current Project==

I don't have a page up for my new project yet. It's not a mod, but an Unrealscript programming tool. It's actually a compiler for a language very similar to Unrealscript. The long and the short of it is, it compiles this langugage, and decompiles the result back to Unrealscript. The decompiled Unrealscript can then be compiled by UCC. (This will ensure that the final product has the most recent bytecode, and it also frees me from using Epic's bytecode.)

The benefit of using this over using UCC directly is of course, features. Unrealscript will be directly compilable, but you will also have capabilities that are not available with UCC. Planned features are:

; Flexible Directory Layout : The compiler traverses all subdirectories of a given root directory. This allows you to have subdirectories to organize the source code for large packages. UCC does not permit this behaviour.

; &lt;nowiki&gt;#INCLUDE and #DEFINE support&lt;/nowiki&gt; : Fairly self explanatory, these allow for tweakable constants to be kept in one file, among other things. Macro definition will also be possible. 

; Inline Functions : For those who don't know, an &quot;inline function&quot; is written as a function but the compiler inserts the function body into the code where the function is called - saving a function call. This allows you to write code that is very well organized, without the overhead associated with numerous function calls. Inline functions must also be final, for obvious reasons. In short, it can make your code run faster.

; Auto-Finalization : An optional feature (command line argument) that will cause all functions to be declared as &quot;final,&quot; except those that are overridden in a subclass. Some keyword will likely be provided to override this behaviour on certain functions that you want left open for overriding. Functions declared as final execute slightly faster because the engine does not have to check for polymorphism.

; Variables Anywhere : In Unrealscript, all variables must be declared at the head of a function or class. This compiler allows variable declarations anywhere in the class or function body, allowing you to make some code a little cleaner.

; Obfuscation : An optional feature (command line argument) that will render any decompiled code very difficult for humans to read. I have a number of ideas of how this could be done very well in Unrealscript, but to prevent defeating the purpose of code obfuscation I won't explain how I plan to do this.

; Static Variables : Variables can be declared as &quot;static.&quot; In this case all references to that variable will be automatically changed to references that class' default properties. This variable can also be accessed from anywhere with the syntax ClassName.VariableName. Note that declared variables will take precedence over the static notation, so the static variable can be obscured if a variable named ClassName is declared in a given scope.

; Singleton Classes : Classes can be declared as &quot;singleton&quot; classes. This allows an instance of that class to be accessed from anywhere by using the classes name. For instance, ClassName.VariableName would access the variable &quot;VariableName&quot; as an instance member of a singleton instance of &quot;ClassName.&quot; The singleton instance will be maintained statically. For actors the setup and cleanup of this singleton instance will be handled automatically by inserting appropriate code into the beginning of PreBeginPlay() and the end of Destroyed(). For objects it may be up to the coder to create and cleanup the singleton reference. This behaviour can be obscured by declared variables as described above for static variables.

; Flexible Class Placement : When the compiler decompiles back to UnrealScript, a separate appropriately named file will be created for each class. The source input to the compiler can have multiple classes per file, or none at all. The name of the input files need not bear any relation to the classes contained within. This could be useful if making something where several small classes need some logical association. (IE a simple weapon mutator where default properties must be changed in 4 different classes, but little else.)

; Forced Access : This feature may not actually get implemented, but we'll see. Access to private functions and variables is restricted only by UCC. You can get access to these functions and variables by toggling the private bit for that member in the package the class is contained in, then compiling. You can toggle the bit back after compilation and your code will still have access to those private members. However, I don't see much application for this as mostly Epic has only declared things as private when the interact natively in some way, so this would probrably only allow people to get themselves into trouble.

; Minor Typographical Error Correction : Some minor typos can be tolerated by the compiler, in any case where you couldn't have possibly intended otherwise. Examples would be missing the semicolon from the last line of code within brackets (the closing bracket must be on a new &quot;line&quot; of code, and so can't possibly be part of the previous line) or missing closing brackets from the last thing in the file. (Since classes cannot span multiple files, the end of the file must also indicate that all open brackets need to be closed.) This is of questionable value as a feature but is actually an artifact of how the compiler dissects source code heirarchially.

; Verbose Error Reporting : Unfortunately because the compiler parses the code heirarchially any information about line numbers is, of course, lost. However, the heirarchial parsing means that a lot of context information is available when an error is encountered.

; Compilation to Machine Code or Flexible Export : The intermediate data can be exported to pretty much any language that I can think of. Right now I have a working exporter for Unrealscript, but you could just as easily make an exporter for another language. The ability to compile directly to native machine code will also be available. (Native classes for dealing with streams, processes, etcetera will be provided as an interface for this kind of coding.)

==Past Project==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cosmic Fury]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived Developer Journal]]

This mod was unfortunately ill-fated, and all work on it was lost due to a hard drive failure coinciding with a recent loss of all backups. I'll probrably clean up the developer journal and stuff sometime. I will likely pick this project up again at some point, in one form or another.

==War On Terror: Americans In Iraq==

Just for fun I made a little minimod called &quot;War On Terror: Americans in Iraq.&quot; Due to the amount of copyrighted art I used I don't feel that a release is appropriate, so it's a bit of a tease, but I didn't want everyone to think I was idle. Just as a further tease:

&quot;War On Terror&quot; is an over-the-top parody based the stereotype of the hyper-patriotic American. Your mission: keep control in Baghdad among a constantly increasing Insurgent presence. Insurgents spawn in any area not directly monitored by American forces - as American forces are eliminated, the number of unmonitored areas increases, causing Insurgent spawns to increase for every American lost.

* Battle Insurgents armed with AK47s, RPGs, and Molotov Cocktails in the streets of Baghdad.
* Race against time to stay alive amidst heavy handed airstrikes that increase in frequency and intensity as the concentration of American soldiers dwindles.
* Persistent blood and gore tells the grisly story long after the battle is over.

One level was specially prepared for the mod, but it can be played on any map. Any map type can be used, but assault maps may not work well. Online play should probrably work but has not been tested.

Note that certain persons may find the quasi-political nature of this mod offensive. This mod was designed solely on what I thought might be a fun scenario with a backstory that allowed for ample references to pop culture considered comical by some. (EG, the tanks sound system plays &quot;Let the bodies hit the floor,&quot; a reference to Farenheit 9/11.)

I kind of lost interest in doing the polishing, so there's no HUD or much of an interface. The gameplay is still a blast, however.

I don't have any decent image editing software on my PC right now, I might put up some screenshots at some point.

----

'''MythOpus:''' Foxpaw, its been awhile since I've seen any updates from you at all.  How are you, what are you up to?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3185</id>
      <timestamp>2006-01-09T16:05:43Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Unreleased project.</comment>
      <text xml:space="preserve">==Current Project==

I don't have a page up for my new project yet. It's not a mod, but an Unrealscript programming tool. It's actually a compiler for a language very similar to Unrealscript. The long and the short of it is, it compiles this langugage, and decompiles the result back to Unrealscript. The decompiled Unrealscript can then be compiled by UCC. (This will ensure that the final product has the most recent bytecode, and it also frees me from using Epic's bytecode.)

The benefit of using this over using UCC directly is of course, features. Unrealscript will be directly compilable, but you will also have capabilities that are not available with UCC. Planned features are:

; Flexible Directory Layout : The compiler traverses all subdirectories of a given root directory. This allows you to have subdirectories to organize the source code for large packages. UCC does not permit this behaviour.

; &lt;nowiki&gt;#INCLUDE and #DEFINE support&lt;/nowiki&gt; : Fairly self explanatory, these allow for tweakable constants to be kept in one file, among other things. Macro definition will also be possible. 

; Inline Functions : For those who don't know, an &quot;inline function&quot; is written as a function but the compiler inserts the function body into the code where the function is called - saving a function call. This allows you to write code that is very well organized, without the overhead associated with numerous function calls. Inline functions must also be final, for obvious reasons. In short, it can make your code run faster.

; Auto-Finalization : An optional feature (command line argument) that will cause all functions to be declared as &quot;final,&quot; except those that are overridden in a subclass. Some keyword will likely be provided to override this behaviour on certain functions that you want left open for overriding. Functions declared as final execute slightly faster because the engine does not have to check for polymorphism.

; Variables Anywhere : In Unrealscript, all variables must be declared at the head of a function or class. This compiler allows variable declarations anywhere in the class or function body, allowing you to make some code a little cleaner.

; Obfuscation : An optional feature (command line argument) that will render any decompiled code very difficult for humans to read. I have a number of ideas of how this could be done very well in Unrealscript, but to prevent defeating the purpose of code obfuscation I won't explain how I plan to do this.

; Static Variables : Variables can be declared as &quot;static.&quot; In this case all references to that variable will be automatically changed to references that class' default properties. This variable can also be accessed from anywhere with the syntax ClassName.VariableName. Note that declared variables will take precedence over the static notation, so the static variable can be obscured if a variable named ClassName is declared in a given scope.

; Singleton Classes : Classes can be declared as &quot;singleton&quot; classes. This allows an instance of that class to be accessed from anywhere by using the classes name. For instance, ClassName.VariableName would access the variable &quot;VariableName&quot; as an instance member of a singleton instance of &quot;ClassName.&quot; The singleton instance will be maintained statically. For actors the setup and cleanup of this singleton instance will be handled automatically by inserting appropriate code into the beginning of PreBeginPlay() and the end of Destroyed(). For objects it may be up to the coder to create and cleanup the singleton reference. This behaviour can be obscured by declared variables as described above for static variables.

; Flexible Class Placement : When the compiler decompiles back to UnrealScript, a separate appropriately named file will be created for each class. The source input to the compiler can have multiple classes per file, or none at all. The name of the input files need not bear any relation to the classes contained within. This could be useful if making something where several small classes need some logical association. (IE a simple weapon mutator where default properties must be changed in 4 different classes, but little else.)

; Forced Access : This feature may not actually get implemented, but we'll see. Access to private functions and variables is restricted only by UCC. You can get access to these functions and variables by toggling the private bit for that member in the package the class is contained in, then compiling. You can toggle the bit back after compilation and your code will still have access to those private members. However, I don't see much application for this as mostly Epic has only declared things as private when the interact natively in some way, so this would probrably only allow people to get themselves into trouble.

; Minor Typographical Error Correction : Some minor typos can be tolerated by the compiler, in any case where you couldn't have possibly intended otherwise. Examples would be missing the semicolon from the last line of code within brackets (the closing bracket must be on a new &quot;line&quot; of code, and so can't possibly be part of the previous line) or missing closing brackets from the last thing in the file. (Since classes cannot span multiple files, the end of the file must also indicate that all open brackets need to be closed.) This is of questionable value as a feature but is actually an artifact of how the compiler dissects source code heirarchially.

; Verbose Error Reporting : Unfortunately because the compiler parses the code heirarchially any information about line numbers is, of course, lost. However, the heirarchial parsing means that a lot of context information is available when an error is encountered.

; Compilation to Machine Code or Flexible Export : The intermediate data can be exported to pretty much any language that I can think of. Right now I have a working exporter for Unrealscript, but you could just as easily make an exporter for another language. The ability to compile directly to native machine code will also be available. (Native classes for dealing with streams, processes, etcetera will be provided as an interface for this kind of coding.)

==Past Project==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cosmic Fury]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived Developer Journal]]

This mod was unfortunately ill-fated, and all work on it was lost due to a hard drive failure coinciding with a recent loss of all backups. I'll probrably clean up the developer journal and stuff sometime. I will likely pick this project up again at some point, in one form or another.

==War On Terror: Americans In Iraq==

Just for fun I made a little minimod called &quot;War On Terror: Americans in Iraq.&quot; Due to the amount of copyrighted art I used I don't feel that a release is appropriate, so it's a bit of a tease, but I didn't want everyone to think I was idle. Just as a further tease:

&quot;War On Terror&quot; is an over-the-top parody based the stereotype of the hyper-patriotic American. Your mission: keep control in Baghdad among a constantly increasing Insurgent presence. Insurgents spawn in any area not directly monitored by American forces - as American forces are eliminated, the number of unmonitored areas increases, causing Insurgent spawns to increase for every American lost.

* Battle Insurgents armed with AK47s, RPGs, and Molotov Cocktails in the streets of Baghdad.
* Race against time to stay alive amidst heavy handed airstrikes that increase in frequency and intensity as the concentration of American soldiers dwindles.
* Persistent blood and gore tells the grisly story long after the battle is over.

One level was specially prepared for the mod, but it can be played on any map. Any map type can be used, but assault maps may not work well. Online play should probrably work but has not been tested.

Note that certain persons may find the quasi-political nature of this mod offensive. This mod was designed solely on what I thought might be a fun scenario with a backstory that allowed for ample references to pop culture considered comical by some. (EG, the tanks sound system plays &quot;Let the bodies hit the floor,&quot; a reference to Farenheit 9/11.)

I kind of lost interest in doing the polishing, so there's no HUD or much of an interface. The gameplay is still a blast, however.

I don't have any decent image editing software on my PC right now, I might put up some screenshots at some point.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foxpaw/Archived Developer Journal</title>
    <id>1261</id>
    <revision>
      <id>3246</id>
      <timestamp>2005-05-28T10:34:47Z</timestamp>
      <contributor>
        <ip>Watdenku.demon.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*corrected link to a moved page</comment>
      <text xml:space="preserve">{{classbox| August 2nd, 2003}}
: Most of the personell/boarding actions stuff is completed. The AI is a little lousy, but since I haven't finished the ships the bots lack any real direction. They just roam about, blowing the living crap out of anything unfriendly that gets in their way. I noticed that having dozens of karma ragdoll carcasses littered about had an effect on the framerate, but then again, my computer isn't that grand.. it doesn't even meet the &quot;minimum&quot; specs for UT2003. The combat patterns of the bots are also relatively predictable, but I believe this is a result of the shoestring path network I made. I was going to add a couple of gametypes for just the &quot;on foot&quot; stuff and try to get that polished up and working perfectly for phase 2 of the MSU contest. I may instead forge ahead and make the ships, but I am worried that I will not have them ready in time for phase 2, and I'd like a shot at some free money.

: On an unrelated note, my ability to make good textures for particle effects does not appear to exist. I may try to recruit someone to do this when the mod is more complete. For now I'll be satisfied with ugly bars for laser beams and abrupt squarish things for the &quot;coronas&quot; created by said lasers. Fortunately, the Kinetic Rifles look pretty decent, making fancy hollywood style plumes of debris and dust expelled from the walls/floor/etc. on impact. I'm somewhat disappointed that FPS' just use sparks for this. They've obviously never seen WWII movies. Impacts are supposed to cause a plume of dust, (in games and movies) darnit!!!

: An ironic note: A while ago I abolished and removed the &quot;actions&quot; system, preferring to use my &quot;inputs&quot; system for everything, since the two can be converted to each other fairly easily and inputs take less processing to generate initially. However, &quot;actions&quot; is definately more tangible to the AI, now that I've come to writing the AI with more complexity. Actions also replicate marginally better because sometimes &quot;inputs&quot; have no effect, while &quot;actions&quot; always do something.

: I almost forgot: I'm having difficulty deciding whether or not to use Karma for the ship physics. On the one hand, it will definately be better than whatever system I would use to replace it. That's the upside. The downside to Karma is that it drains resources if used with lots of simulation. If each ship has one engine, generator, a cockpit, loading ramp, a couple of guns, plus extraneous armor plating, etcetera, that's looking at 10 or more Karma simulated actors per ship.. more for larger ships.

: Also, though UDN claims that there is a hard limit of 200 on the number of Karma simulated actors, however I have performed an experiment and found that this is NOT true.

{{classbox| August 4, 2003}}
: Initially appearing to be a bad thing, a change that I made caused all havok with the rest of the code. After tracking what the problem was I revealed a dormant bug that had been released through the expansion of the code. I'm not exactly sure why that didn't cause crashes before, but it had something with no KParams attempting to block Karma objects. This has now been fixed so I can get back to finishing up redoing the input stuff or alternatively working on the vehicles.

: Replication is being a nightmare. Specifically, the notion that things may arrive out of order. I figured this would be easy to work around.. I can just put anything that must arrive in a given order in a struct along with a timestamp and they can be sorted by their timestamp so they are recieved in the correct order. However, this actually will not work on a network with latency because the packets recieved out of order will be processed before the other packets arrive, thus they will already be gone by the time we want to sort. The only way around this would be to place a delay on incoming packets, but that would make the network appear slower. An example of the problem I'm having: Player A strafes left, strafes back right, then stops. Seems simple enough. But the movements arrive out of order. Player B percieves this as strafing left, stopping, and strafing right. Though Player A is standing still, the pawn continues strafing right endlessly on Player B's machine. For obvious reasons, this is a problem.

{{classbox| August 5th, 2003}}
: Wrote up some code for triggers inside of vehicles so you can assume control of the vehicle by walking up to the wheel/joystick/buttons/whatever kind of controls it has. Also added the keybind to leave the vehicle and one for self-destruct, though that one was mainly just to test to see if the controls were working.

: A perpetual thorn in my side, two parts of the walking physics need to be redone: stairs and the surface detection. It turns out that the surface detection does not work very well on TerrainInfo surfaces. It &quot;works,&quot; but sporadically flickers on and off, so the pawn more or less just stumbles and trips as they walk. The stairs need to be redone as I've found that they allow you to &quot;pass through&quot; sloped walls to an extent. Fortunately each of those things is contained to a single function each so there's no loose ends that need to be tied up once I've figured out a better way to do them.

: For the remainder of the day I'm probrably just going to try my hand at making a nicer ship model.. one that isn't just a cone with a subtracted cube. :P

{{classbox| August 6th, 2003}}
: The UnrealEd Goblin has bitten me in a way I never suspected. FClamp has ceased working properly. I didn't think something so simple and so commonly used could simply cease working for me. It still works in other classes, just not MY classes. FClamp is acting the same as FMin, that is, it will return the first value if the second value is lesser than it, however, it totally disregards the third value and will gleefully exceed it. I could just write my own FClamp function, but really, this is rediculous.. I can't see how a function like FClamp could suddenly just go wrong like that!

{{classbox| August 7th, 2003}}
: FClamp still doesn't work. I can live without, I suppose. Now that I'm not on vacation anymore I don't have as much time to code. On the upside, however, I'm going to be going part-time soon so in theory I'd have more time. However, that will be short-lived as the reason I'm going part time is to go to University in the fall.

: Wrote my own coordinate rotation operators because the native ones weren't cutting the mustard. They didn't seem to be particularly accurate, although they were still half decent. I'm in the process of cooking up a scheme for the controls of the ships and whatnot. Jets are back in so the flying warehouse is a bit more mobile. I'm going to get the controls going smoothly and then I'll add weapons back in. The modularity is really starting to shine through, which is good. When I wrote the code for walking personnell I put in all of the hooks I would need for vehicles, so the going has been swift.

{{classbox| August 8th, 2003}}
: Not much to say so far since I just got home from work and I'm headed for bed, but I thought I'd put this note here anyways. I just had an idea but I'm probrably going to forget it when I go to sleep. To that end I'm putting a note here. A hypnotist taught me a neat memory trick. Because I am thinking of my idea while I write this, when I read this tomorrow I will recall that idea. Let's see if it works.

: It worked. While reading [[Legacy:CorDharel|CorDharel]]'s [[Legacy:BioRocket|BioRocket]] page I got an idea. Originally I thought that the intent was to create a rocket launcher with a biological warhead, IE it flies like a rocket and on impact splatters the bio goop. That sounded like a neat idea but after reading the page it turned out that wasn't quite what he had done, so I decided to make the &quot;BioWarhead Launcher.&quot; It's a bit of a diversion from my main project but it only took an hour to make so it can't be too bad. It effectively extends the range of the secondary fire of the biorifle, so it might present a balance issue, but the secondary fire of the biorifle is only really useful for charging up before a confrontation or during a lull in the action anyway. With high speed rockets it may be useful as an alternative sniper weapon.

{{classbox| August 10th, 2003}}
: Things have been very slow going with the vehicle code for today and yesterday. Why, oh why did Epic not include a KConstraint that just sticks things together? One would think that the simplest type of contraint should be one that allows no movement and basically just attaches two KActors together. Unfortunately there is not only no constraint that does this, but no constraint that is easily modified to do this. Strangely enough, though the KCarWheelJoint constraint demonstrates that the engine supports it, there are no linear constraints, like springs or just string type constraints. These could be custom coded, but unfortunately due to the highly native nature of constraints, custom scripting constraints is limited.

: Following is the code I have written for a rigid constraint. With the latest update, it appears nearly flawless. It's a bit hacky, but a clever solution if I do say so myself, which I just did.
: &lt;uscript&gt;
///// Rigidly affixes two karma simulated actors together.
///// Written by Foxpaw.
///// If you use this, please give credit. If you do not, I may eat your children*.
class KRigidJoint extends KHinge placeable;

var KRigidJoint Slave;

simulated function PostBeginPlay()
{
  if ( KConstraintActor1 != None || KConstraintActor2 != None )
    Initialize( KConstraintActor1, KConstraintActor2 );
  Super.PostBeginPlay();
}

simulated function Initialize( actor A, actor B, optional bool bIsSlave )
{
  if ( Slave != None ) Slave.Destroy();

  SetPhysics(PHYS_None);
  KConstraintActor1 = A;
  KConstraintActor2 = B;
  SetPhysics(PHYS_Karma);
  
  if ( !bIsSlave )
  {
    Slave = Spawn( class'KRigidJoint', self,, Location, Rotation + Rot( 16834,0,0 ) );
    Slave.Initialize( A, B, true );
  }
}

simulated function Destroyed()
{
  if ( Slave != None ) Slave.Destroy();
  Super.Destroyed();
}

defaultproperties
{
  bKDisableCollision=true
  bKForceFrameUpdate=true

  bStatic=false
  bNoDelete=false
  Physics=PHYS_None
}
&lt;/uscript&gt;
: This can be set up in a map or spawned in real-time. If you spawn it in real time, you must call the initialize function and pass references to the two actors you want constrained. For the time being this does not allow for constraining things to the world, though that would not be difficult to do. (However, I would question the value of constraining a Karma actor rigidly to the world, since then it wouldn't be able to move or rotate at all anyway.) The bKForceFrameUpdate will make you life much, much easier if you plan to set up the constraint in real-time. If you will only be using it in a map you can leave that false. At some point I may make a bunch of Karma constraints and package them so we won't have a myriad of custom constraints floating around embedded in maps taking up space. If you do use this in a map or mod please credit me for it and please ask if you would like to use it in a commercial application.

: Earlier today I was attempting to make a wrapper for KTire to use with my mod. Though KTire would have been better implemented as a subclass of KarmaParamsRBFull, it was instead implemented as a subclass of KActor, meaning that if you, for instance, wanted a pawn that rolled along the ground like a tire, you can't use the native tire simulation. This is curious because the Tire simulation is simply a special type of simulation and as such should belong in the KarmaParams, instead of having it's own class. Regardless, it was not coded that way. I was attempting to wrap the tire and basically use the tire wrapper to maintain compatibility while using the actual KTire for physics simulation. This did not pan out due to the fact that I cannot have an invisible, non-blocking Karma object, and if the wrapper is not designated as using PHYS_Karma, it will not recieve the configuration for Karma physics, which it needs to pass on to the tire. Instead of wrapping the tire, I've decided to make my own. I don't know how well it will work, but time will tell I suppose.

{{classbox| August 16th, 2003}}
: I haven't done anything with my mod for a few days, unfortunately. I started playing with the tires again and I've decided to axe them for the time being. They have an acute tendancy to get &quot;lodged&quot; in the ground. The native tire simulation does not have this problem, of course. I'm likely still going to have &quot;tires,&quot; but they will not use a physically accurate tire model, and rather be powered purely by impulse.

: Aside from that, I'm still working on a good method of controlling. I've got it working half decent, but it still isn't really what I wanted it to be. I'm hoping to put up screenshots once I've got a test vehicle that isn't so ugly. It's been transformed from a flying warehouse to a flying warehouse with warp nacelles glued on the side and a big cannon glued on top. While testing the wheels, it also had wheels on the side.

: Hours later... brain is burning. I need to come up with a scheme to control the firing of various thrusters on the ship to attain the desired orientation and velocity. The problem being of course that said engines can be at ANY angle, ANY location relative to the center of mass of the ship, and the desired orientation can be ANY angle relative to the center of mass of the ship as well. As you might imagine, trying to compute which engines should fire to create the desired angular velocity is.. trying, to say the least. I believe I have a partial solution, or rather a partial visualization of how I need it to work. I am going to need to use some kind of a plane that represents the cutoff of where the engine will be able to produce useful output. This plane needs to pass through the center of mass of the ship and I believe that it's orientation will be in some way related to the rotation of the ship. A vector made from the desired orientation can then be measured to see which side of the plane it falls on. The only problems being:

* I don't know how to determine what side of a plane a given point lies on. I think I could make a coordinate system from the plane and use coordinate rotation to do this, but that's a pretty big &quot;I think.&quot;
* I don't know how to determine the heading of the plane. I believe it needs to be parallel to the vector rotation of the engine, but that's just what seems right to me.

: My current idea is maybe a bit easier and maybe more efficient. I think that I can find a line perpindicular to the vector rotation of the engine that will intercept the vector rotation of the engine when centered around the center of mass of the ship instead of the engine. I can then take the normal of that first (perpindicular) line and use it to find if the vector of the desired heading is within a 90 degree cone from the normal of the perpindicular line. I'm pretty sure I learned some formula to determine where two lines will intercept in Grade 9, but I don't remember it, so I'm trying to think if there might be an even easier way to find the normal. Since all I really need to trace the intercept for is to determine that I actually have the correct perpendicular normal, I may be able to forego that entirely.

{{classbox| August 20th, 2003}}
: Engines and turrets are going nowhere. Something simple is eluding me, but I can't put my finger on it. They both &quot;work,&quot; but the control system that I was planning to use has to do some kind of computation, and I don't know what it is. I'm positive it's somehow involved with coordinate rotation, but I can't put my finger on it. Of course, it's kind of hard to play around with stuff when your engines can't do anything except propel you straight forward. I may write a short &quot;hack&quot; to handle the flight controls until I can figure out the proper functionality. I really want to have something to show for the MSU Phase 2.

: A friend of mine saw the movie, Freddy vs. Jason, and now he's obsessed with the idea of me making a mod for him based around serial killers/horror icons. :rolleyes: Once mine is fairly stable it wouldn't be a difficult extension, but still, that's not my bag, baby! :P

: The controls are still.. yuck. I wrote the hack to get the engines to work. (not properly, I'm still figuring that out, but it works for experimentation) I can now see why astronauts have to train so much. :P My attempts to fly resulted in much spinning, and me being tossed around in the cockpit trying to maintain control. I think I may need seatbelts or some type of restraints. Eventually the thing was spinning so out of control I got flung into a wall really fast and jibbed. I guess it's a better way to go than getting thrown out the open hatch. :rolleyes:

{{classbox| September 3rd, 2003}}
: First day back at University. There was lots of foxy ladies there, but unfortunately, none of them are in senior level computer science. :( In other news, I've been spending the last week racking my brain trying to figure out why the engines weren't working right. Turns out that the vector I was using that was supposedly the desired rotation.. wasn't actually the desired rotation. I don't know why, since it's code is seemingly identical to that of the targeting reticle, but if I use the actual location of the targeting reticle it works. Go figure. The cameras still don't work though. I went over the vehicle code again and found that it doesn't even reference the camera, except in superclasses, which work fine. It's possible that I forgot to call a Super function in one of my functions, so I'll probrably take a look for that later.

{{classbox| September 4th, 2003}}
: Figured out what was up with the camera. Turns out I had the operator precedences messed up. I wrote a custom operator a while ago and it turns out that it was getting evaluated after +. This realization happened while screwing around (a good way to find bugs, in my opinion) and I noticed that the camera actually was moving, (it was hard to notice, what with being in space and all) just not in the way it was supposed to. A set of brackets later, the camera and the jet's controls seem to be working.

: UPDATE: I spoke too soon. The jet's controls actually don't work properly, they worked in that configuration but don't work in all other configurations. It's quite frustrating. Stupid rocket science.

: In other news, the turrets now appear to be working, which is cool. Turrets can also be &quot;stacked&quot; to provide greater freedom, though this can look a bit odd. This could probrably be rectified but I don't know if it should be. Right now each turret attempts to face as close as possible to the &quot;desired&quot; heading. In a sense this is better because it means that your guns are better aligned while the other turrets get into position. However, it does lead to some backtracking which could mean that the turret would take longer to get into it's final position. It also doesn't look as cool. As soon as I get the jets working 100% I'll be able to start doing &quot;fun stuff&quot; again and maybe make a better looking ship model.

{{classbox| September 5th, 2003}}
: While experimenting, I found something that worked extremely well. Unfortunately, however, it doesn't work the way I actually intended it to. It works better. In a way that's good, however, it's probrably not good that I don't understand how it's doing what it's doing. The part I'm referring to is the engine controls. They now seems to be firing as if they somehow magically knew what to do. Though that was kind of the idea, the notion of having &quot;overlap&quot; where an engine would still fire even though technically it was outside the zone that it should (to produce smoother manuevering) seems to be operating despite the fact that I didn't yet implement it. :roll: Tomorrow I'll throw in some debug statements and see where it's going wrong.. or going right, however you look at it.

{{classbox| September 6th, 2003}}
: I found out what was going on with the engines, and got them working pretty decent now. Decent enough to do some manuevering anyway. I want to make the manuevering a bit gentler, since right now the engines will only toggle between full throttle and no throttle. I'll likely add something proportional to the engines, but the only issue I can see there is that &quot;thrusting&quot; engines require the opposite proportionality as &quot;manuevering&quot; engines. Manuevering engines should taper off as the ship approaches it's desired heading, while the main thrusters should start to pick up at that point. Thrusters should also be less discriminating about when they fire, because the rotation they impart to the ship is less critial. To resolve this I'm going to assign a &quot;manueverability&quot; value to each type of engine to dictate it's behaviour.

{{classbox| September 7th, 2003}}
: The jets are running a bit smoother, and I changed the controls up a little bit so they are a little fancier too. I think there might be a slight bug in them but I don't know if I'll fix it or not. The view kind of &quot;drifts&quot; around the ship when you aren't moving the mouse pointer. It shouldn't be hard to fix, but it looks kind of cool anyway so I might not worry about it.

: I've been feeling that so far I don't have much to show for my efforts because most of the stuff I've written so far is abstract. To that end I've slapped together a stationary pillbox to show off my fancy vehicle technology. Although the pillbox doesn't move, it does have the full benefit of the vehicle code that I've written, so you can do cool stuff like.. well, stand inside and shoot out the windows. It also has a gun turret on top and you can stand inside that as well. If you like you can peek out the hatch and shoot at people without leaving the turret. However, seeing as it IS a gun turret, some would question why you would want to do that. It's mostly for the &quot;look cool factor&quot; at this point. Although a vehicle would probrably have been way cooler, I'm not much of a modeller and a pillbox doesn't call for a particularly complex model, so that's why I decided to make one. Considering that it's texturing is just one texture plastered over the entire model I think it looks pretty half-decent.

{{classbox| September 8th, 2003}}
: Figured out what was causing the drifing of the view. Though cool looking, it was a severe pain in the butt trying to aim at distant targets, plus the &quot;why&quot; of the bug could have led to problems in the future. It resulted from an earlier &quot;bug fix&quot; that I've now fixed in a different way so as to avoid that problem.

: I'm also going to remove the MeshController on vehicle components, but keep it for people on foot. It is a system somewhat equivalent to having various player models using the same class for all the code. However, my mod has some information attached to the models, much like the species code. To that end, I made the meshcontroller class which sets your mesh, and takes care of all that goodness. It also handles the fancy skeletal aiming, so you could freeze gameplay and trace a line (barring inaccuracy inherent in the weapon) to predict where the shot would land. Basically it's just eye candy. The ships, however, don't really need that functionality because what with their Karma parameters and the fact that a given mesh isn't likely to be reused by different components, I decided to move that functionality back to the actual component classes. I found it quite a pain to have to make two classes for each component.

: I've also refined the controls somewhat and made a few assorted improvements to various classes. I also crushed a simple bug that I hadn't gotten around to fixing, and streamlined the function it was in while I was at it. I expect to put up some screenshots soon.

{{classbox| September 12th, 2003}}
: I meant to put this up last night, but I was having some problems with either the UnrealWiki or with my ISP, I'm not sure. At any rate, things were going super slow, so I decided to leave it until today. I took a few screenshots, but then I realized that most of them weren't particularly relevant, so I just left the one screenshot to show off one of the fancier features of my mod.

[[Image:Legacy_FoxpawsTurretScreenShot.jpeg|center|This is actually a stationary pillbox and gun turret, but it's running on the vehicle code. It just doesn't have any jets/wheels/any form of locomotion. As this picutre illustrates, you can fire out of firing ports on the vehicles and fire into them from the outside, though it's understandably more difficult to hit through from the outside. The gun turret on the outside can also be rotated and fired at things.]]

: Unfortunately, although I made this pillbox/turret combo mainly for the purpose of showing the configurability feature of my mod, when I made it I found that I couldn't really make much in the way of variants from that system. That is to say, there's not much USEFUL variation you can make. Because it's stationary you need a turret if you're going to hit anything with it, and you can't really get away with taking off the guns. To that end, I'm making a new spacecraft model that should be somewhat configurable, and I'll try to come up with a way to configure the pillbox differently to show off that feature of the mod. It is kind of like the premise, after all. :P

{{classbox| September 14th, 2003}}
: Made a few miscellaneous improvements, adjustments and so forth. I moved the turret calculations out of the turret constraint and into the turret actor itself, removing some redundancy, and I also made the driving code a bit more abstract so it was more amiable to being driven by different types of actor. The aiming stuff for turrets was a bit flaky before, (though theoretically it SHOULD have been sound, it didn't work that well in-game) so I've improved the aiming to make it smoother.

: Unfortunately, however, I'm wondering what I should do next. I need to make a new ship model to thoroughly test the configurability, but that's bogging me down a bit. I made the model but now I need to make a change to it, and making that change appears to cause havok in Rhino. When I made the original model (well, okay, I more or less ripped it off of homeworld, but still... :P) the glass over the cockpit was rigid. I want to separate it from the cockpit itself so I can make it swing open and close so that people can get in.. Unfortunately when I split the solid object that is the cockpit, Rhino ceases to recognize it as separate solid objects and now does not agree with me that the two objects are actually closed polysurfaces. Arr..

{{classbox| September 19th, 2003}}
: I wasn't sure what to do next, so I thought I'd do the front end for my mod. I want to make a new front end from scratch, but I'm not sure how to do that. Some GUI stuff is referenced from the .ini file, but I don't know if it has native significance or if it's just a reference to make things easier for the coders. I understand that UWindows was built off the console - so maybe I have to override the console and replace the console reference in the .ini file. Basically, I don't want Epics GUI windows to come up at all. Getting my own GUI to appear when I want it to is easy enough, but I don't know two things about the GUI:
* How it is loaded up initially when you start the game. Does the &quot;startup level&quot; (the nVidia logo) load the GUI somehow or is the GUI loaded by the engine through some entry point that I don't know about?
* When you hit escape, it brings up the &quot;quick menu.&quot; Is this simply a result of the GUI intercepting a console command bound to the escape key, or something else?

{{classbox| September 21st, 2003}}
: I decided to take a fresh stab at making tires. A discovery that I made along the way I thought would help me out: that is that a karma simulated object can have a static mesh for simulation and a different type of display. This allowed me to make the wrapper &quot;tires&quot; invisible, and use the KTire for the tire simulation. I was also going to use the KRigidJoint above to basically make the vehicle component be the wheel, and the KTire be the tire on it. This unfortunately, did not pan out, because apparently KTires are quite picky about what things are constrained to them. Instead, I decided to try my own proprietary tire physics and so far it seems to be working pretty decently. The tires start to bounce around a bit on the ground at higher speeds, but I think this can be fixed with tweaks to the suspension.

{{classbox| Septembter 28th, 2003}}
: Yowza, it's been a week since I've updated this. I've been busily making my own GUI, which has been slowed because I'm not much of an artist so I don't have any fancy textures to work with. I've also come upon a realization, which I found quite bizarre. Epic's GUI code is native, so one would think it would run quite a bit faster. Yet, my custom code, made in Unrealscript, runs WAY faster and UT2003 loads up in about half of the time too. This leads me to believe that not only is Epics/DEs GUI code loading up a LOT of stuff when you first load the game, but it also seems to be swallowing a lot of cycles somewhere. From clicking the UT2003 icon to the GUI appearing, ready to go, takes less than 2 seconds (including splash screen and all that jazz) on my computer.. which doesn't even meet the minimum specs for UT2003. Loading using the standard GUI takes over 5 seconds. :rolleyes: It's not that big of a difference, but still nice when you're loading up UT2003 once every minute or so for tweaking the location of interface bits.

{{classbox| September 30th, 2003}}
: I'm hereby expanding my Pawn rant to the GUI class as well. I've hit a major roadblock in trying to make my own UI. Apparently all the classes that deal with metaclasses (the map list, weapon list, character list, mutator list) are all 100% bonafide native and firmly lodged in the GUIController class. Now I'm going to have to pollute my fancy AI with a hacky workaround to access those lists by creating a dummy GUIController. :( To add insult to injury, UT2004 promises a new UI which will probrably be incompatible with the current system.

: Having said that, I have managed to wrangle the GUI system into having a &quot;dummy&quot; GUI that creates my real GUI. It was quite difficult because although the GUIController is an interaction, it does not get ticked even if you have bRequiresTick set to true. Further, it is created pretty much before anything, and in most of the events called on it, a viewport hasn't even been created yet! This causes an obvious problem, as if the GUI is going to draw anything, it needs a viewport to draw it on. Fortunately there is one event that is called just after the viewport is created. Unfortunately, there's still no controller attached to that viewport, and no level, pretty much no nothing. :P I've worked around this by having the GUI create another interaction (which will get ticked) and have that interaction do the actual initialization in IT's tick function, allowing me to do the initialization after everything is already loaded up and ready to go. DE works around this by distracting you with a video of Gorge. :P The CinematicGame gametype of that gorge into (and the various replacements I've seen floating around the internet) calls back to the menu when it completes and the menu then goes into full-blown operation.

: In other news, I've been having to get back into programming in C and Java lately what with school and all. It's then that you really appreciate UnrealScript. When I went to University initially, all you had to do was make a source file and compile it into an executable. Nowadays, they've got all this garbage with &quot;solutions,&quot; &quot;projects,&quot; and settings that don't actually exist anywhere in the source, only in menus from the IDE. I think that's all senseless. I really don't need 4 files to make a hello world program in C. Even Java won't compile cross-platform without complaint anymore, thanks to individual IDEs storing their own garbage in with your source. I wish there was a way to compile Unrealscript to standalone executables.. Mmmmm, that'd be fancy. Did I mention NetBeans hijacks portions of your code and will not let you modify them under any circumstances, instead preferring to use it's own generated code (on which the formatting is yucky!)

{{classbox| October 1st, 2003}}
: The GUI system is my unwitting slave. Muahahahaha! My GUI can now load maps with a selected gametype, and all the hooks are in there for me to speedily write the other junk, as soon as I decide what other junk there is to be written.

: The future of bots for my mod is up in the air. There will definately be AI controlled pawns, but I'm not sure if I want them to have fancy names and specified accuracies and all that &quot;personality&quot; junk that UT2003 tries to inject into it's characters. I might not use any of that stuff, but I'm still deciding. On the one hand, it doesn't really hurt anything to have it there. But on the other hand, it does add complexity and clutter to the interface.

: Also, I've had a crazy idea but I don't know what to do with it. I was thinking maybe I'd just do away with people being in the ships altogether, and have them be like remote controlled fighter drone thingies. On the upside, that would be easier to make ships for, because they wouldn't require an interior. On the downside, it might not be as cool. Maybe I'll just include support for both.

: Further, I think I'm going to need to find some real optimizations for the ship physics, because I'm not sure the system can feasably handle that many karma actors. At first I figured it would just be the ships for the players, which is manageable, but now incorporating AI ships and whatnot, the numbers grow quickly: Suppose a simple outpost consists of 15 components. Some structural components, turrets, a few guns, some generators, and maybe a few bits for constructing other ships. Simple drone ships from it have a foreward chassis, rear chassis, engine, two stabilizers, two jets, a pair of guns, a fuel tank and a generator. That's 11 right there. (I think.) Now suppose there's 5 of those fightesr flying in formation. (55 + the 15 for the outpost.) The outpost has 3 formations garissoned and another 2 on patrol. That's approaching 300 karma simulated actors, about the limit of what my system can handle. Now suppose there's 5 starbases on a large map. :/ Granted, it's not likely every starbase would have a garrison of that size, but still. The potential exists for their garrisons to grow that large if the players are particularly bad at the game. :P

{{classbox| October 7, 2003}}
: Added an implementation for fins today. Though one could argue that a fin/aerofoil would be pointless in space, (and it more or less would) I added them because it makes the game so much simpler. You can rotate to face any direction with a mere 8 thrusters, but for smaller ships, I doubt players are going to want to place every tiny manuevering thruster. To that end, I've added a new type of vehicular component: astrofoils. They act kind of like a rudder in space. (there's no real physics behind that, they just do. :P) There's a bit of strategy to using them, of course, the faster you go, the greater force the astrofoil can exert to rotate the ship. Conversely, the faster you go, the greater drag will be placed on the ship while you turn (so you have to sacrifice velocity to rotate yourself using the astrofoils) Also, if you are facing more or less the same direction the fins are facing, they will act as a stabilizer, keeping you headed straighter. I've finally got a half-decent ship model imported, but unfortunately the textures on it are still ugly. The black chrome that looked highly cool on the target drones is quite unappealing on the fighters, so I'll have to come up with something else.

{{classbox| October 9th, 2003}}
: I've discovered something incredibly interesting in my studies at University. Turns out that eternal youth is not only possible, but quite feasable, so long as you ignore the moral implications. Just thought I'd tease you all with that. :D

: As far as the Unreal world goes, I got the astrofoils running a bit more stasble and I'm tweaking the interface some more. I'm not sure what I should do as far as the view goes. Specifically, if the ship rolls to be upside down, should the camera roll as well? It makes sense, but it can be disorienting. Plus, then your controls are all messed up, unless you also compansate for the controls, but that in itself also means that your controls will be severely messed up WHILE you are rolling. :/

{{classbox| October 11, 2003}}
: A GPF has been biting me but with no apparent pattern. It's something to do with a &quot;path&quot; but I don't know if that is a path as in pathnode, or a path as in file path or perhaps the path of an object in some kind of internal organizational tree. It's going to be difficult to fix unless it starts appearing with some kind of consistency. Until then I can't really do anything about it. I also found another error that was introducing a runaway loop condition. How it was doing that I don't know, but I've put in a safeguard so it won't happen again anyway.

{{classbox| October 12, 2003}}
: I found a way to speed up the Karma engine dramatically. It's internal collision engine runs EXTREMELY slow compared to a simpler collision system. This is very good considering my mod is very Karma-intensive. I sped it up by having the script determine what things are potentially colliding, and then disabling collision for everything else. This leaves the Karma collision detection with a lot less to consider, making it run much quicker. (My mod has some objects that may be in very close proximity for long periods, but they are in sync so they will never collide. The Karma engine, of course, does not know that.)

: The issue with that is: it's a hack. To put it in an appropriate place would require using nested iterators (yuck!) so I put it in the vehicle code instead, because it already has pointers to it's other parts (the ones that are very close but never actually colliding) so I can just disable collision directly. The reason why that's bad is, some parts of vehicles MAY collide with the vehicle (turrets for instance) and thus the disabling should not take effect for those types of objects. However, in proper OOP form, no class should have to know about a subclass of itself. (and turrets are a subclass of the base vehicle components)

: I have mixed feelings about that. It does run very fast, but it doesn't feel right. I'll have to see if I can find a reasonably fast way of doing it without requiring that exception.

: On the bright side, the mod is really coming together. The ship I've been using for experimenting needs a paint job before I dare to release screenshots, (:D) but it's got most of the finishing touches on it: roaring jet exhaust, muzzle flash on the guns, and, for added coolness, if it scrapes against something a pile of sparks comes off the point of impact. The controls seem pretty decent and the interface seems decent. Things are definately looking up, if I do say so myself. The only catch is, I don't really have much in the way of modelling skills or texturing skills or level building skills or sound making skills. I'll have to figure something out there. I'm a bit leery of trying to recruit people, however. This is my &quot;dream project&quot; and I've been working on it for a long time. This makes me wary of recruiting a team because:
# I don't want to lose creative control. I definately want people to exercise their own creativity in making parts packs, etc. but I'm still somewhat concerned that others may have a different vision of what direction they want the mod to take.
# Although it's not my primary goal, I would like to make a commercial incarnation of this mod at some point. That may be a while off, or it may not happen at all, but if it does, and some people on the team want to keep it free, there may be some legal issues around intellectual property. At the very least I'd have to remove their work, but they could likely claim that their work formed a synergy with the rest of the work and could not simply be replaced.
# Right now I don't owe anyone a mod. If for whatever reason I get busy or otherwise can't continue work on it, or simply decide I don't want to finish it, I can simply drop it and noone can blame me for it. If I recruit a team and they begin working on it, making content, etcetera, I can't in fairness stop working on the mod. So far I've invested a lot of time and effort in making it but it's still MY time and effort and if I should choose to let it go to waste by stopping work on the mod it's entirely my choice. When other people get involved, I would have an obligation to continue working, since I have no right to make their work go to waste as well.

: Right now I'm just using models ported from Homeworld, which is fine for testing, but I can't release them for obvious reasons.

{{classbox| October 16, 2003}}
: Wow. Looks like learning about database systems came in handy after all. I ran into a brick wall momentarily when I found the Unreal engine can't write a single config variable thats more than about a kilobyte in size. Seeing as how the vehicles were a veritable tree of components, I found that I was going to have to build a relational database to store my data in. Mmmmm, USQL... :P

{{classbox| October 18, 2003}}
: I looked at a few &quot;previews&quot; of UT2004 and something unsettling dawned on me. Maybe it's just my imagination, but the &quot;Onslaught&quot; gametype seems ALOT like Overload 2k3. Invasion seems very similar to Invasion for UT. I'd hate to level accusations but it almost seems like they might be drawing a bit too much inspiration from successful mods. Not a bad plan from a marketing standpoint, since it's already a proven concept, but still, it doesn't feel right to me. On the other hand I could just be imagining this or it could be coincidence. I'll have to wait and see if the same thing happens with future releases.

{{classbox| October 19, 2003}}
: I decided to redo the user interface from scratch. Mine was pretty good, but there was a little bit of redundancy which is certainately less than ideal. There was also a lot of settings that I was using in ways other than they were intended. This unfortunately was a consequence of Unrealscript not supporting multiple inheritance. I wanted menus to have the properties of a &quot;sliding page&quot; and of a button, but unfortunately that was getting far too complicated becase the way it was implemented then required a subclassed button and a subclassed sliding page working together in unison. Not so hard to implement, but a pain when you want to make the actual GUI, since you have to manage two sets of settings instead of just one. Now I've changed it to a system that seems to work a little nicer. I reworked it all to work on relative coordinate systems for everything, which makes it alot easier to have &quot;add and forget&quot; pieces to the UI. With the absolute coordinate system I was using before it was still pretty decent, because any calls to move things around were passed down the line so everything got moved by the same amount. (keeping all child objects in sync) This way I prefer though because it makes some computations faster and all around reduces complexity.

: I also downloaded the UnrealEngine2 Runtime to see what it was like, but I have mixed feelings on it. On the one hand, being free is neat because you can distribute your mod more. Also, a mod built on the Runtime is likely to be viewed more as a separate game rather than a mod, which might be good in some ways. The downsides to the runtime are that it's not valid for the MSU contest, though that's not that big of a deal; and that you have to rewrite everything. That's not really an issue for me, since the first thing I did when making my mod was make my own pawn classes, etcetera, so I could probrably (not sure if the meshes and whatnot would port 100%) plug my mod right into the runtime and have it work. I do think that it's still an issue though, because I expect a lot of people are going to see this engine and get a little too ambitious, which doesn't really harm me, but it's a shame because I think that alot of the projects attempted on this engine won't reach fruition.

Plus, mine boots in less than half the time of UT2003s GUI, and runs a lot faster. :D

{{classbox| October 23, 2003}}
: Overall a pretty productive day. I finally bit the bullet and did some work on the editor. After much progress, followed by frustration, followed by vocabulary expansion, I finally got it working pretty good. First FClamp went on me, then equals went on the fritz. That's right. Equals. The assignment operator. The following piece of code ceased to function:

&lt;uscript&gt;
ViewRot.Pitch = Grandpa.CursorX * Grandpa.PrimaryComponent.XScl;
log( (Grandpa.CursorX * Grandpa.PrimaryComponent.XScl) );
log( ViewRot.Pitch );
&lt;/uscript&gt;
: Believe it or not, the first log gives the correct result, the second log always is 0. Go figure. I erased the whole thing and tried a different approach, which worked pretty good. I'm glad I didn't start content creation yet, since now there's another bit of information that needs to be set up for each component. (I actually foresaw this from the beginning but wasn't sure if it would be a good idea. It takes away some flexibility from the user, but after a while I realized that if I didn't install a constraint on what sorts of combinations of parts people could use, there could be a great deal of &quot;cheating,&quot; in the sense of going against the spirit of the game. (Such as having a ship that's just a supercompressed clump of guns and such. Technically that would make you prone to area effect weapons, but you could cover a massive amount of components with a very small amount of armor, making your ship nigh indestructable.)

: I've also been cooking up a plot for the single-player mode. I think it's pretty good. I've decided to stray away from video-game stereotypes and make it more like a real-world conflict, where the &quot;good guys&quot; and the &quot;bad guys&quot; depends entirely on which uniform you're wearing. Of course, everyone has their view of what's right and wrong, and thus which guys are good and bad, but obviously the bad guys have a different view of right and wrong, right? Unfortunately, I don't think that many people would be able to adjust their mindset like that so instead I'm going to have a strong &quot;propeganda machine&quot; to make every race, other than the one you are playing, seem downright barbaric and murderous.

{{classbox| October 26th, 2003}}
: Don't you just hate it when a piece of code seems to be working but actually isn't? Turns out that a piece of code in the vehicle design area which appeared to be working properly actually was not working. It worked fine when I was making sensible designs, but then for the heck of it I tried to slap together the shoddiest piece of junkyard trash I possibly could and it turned out the code actually wasn't working in all situations.

: The most annoying part is it used to work 100% but I decided to change a rotator to a vector (since roll did not apply in this situation and a vector would be easier to specify). Unfortunately, however, this seems to have caused all sorts of havok and now it doesn't wokrk that well anymore. The locational attachment seems to work 100%, just the rotational is not always accurate. The issue I'm having is as follows:

: I have two actors, each of which has a &quot;socket&quot; on it. That socket can have any location and rotation relative to the actor to which it belongs. These sockets must be lines up so that they face exactly the opposite direction - so that one would &quot;fit into&quot; the other, as it were. The sockets cannot be rotated relative to their actor, and only the second actor can be moved.

: I used to have this working, but I replaced that code with new code which appeared to be working fine. (A couple days later I found out it wasn't) Finding the absolute rotation of the first socket is quite simple. Thus, finding the absolute location that the second socket should have is also quite simple (it's simply the inverse of the first socket's absolute rotation) Although it seems like it should be simple enough to then derive the rotation of the second actor from the relative rotation of the socket and it's absolute rotation, this doesn't seem to have been working.

{{innerbox| When in doubt, let the user figure it out!

}}

{{classbox| October 29, 2003}}
: I was going to post up some screenshots of some cool ships I made, but they were a bit over the maximum image file size for the wiki and I didn't really feel like cropping or resizing them tonight. They turned out pretty good considering that they are just the same 7 or so components rearranged. I also think I'm going to need to add in some design aids to make it a bit easier to design the ships. It turned out to be a bit difficult to line up guns on the ship for accurate fire by eye alone, so maybe I'll put in a sort of 3D grid with some axis indicators and maybe a line showing the heading of components, so you can be sure that your guns really are pointing foreward and your engines are facing more or less straight back.

: The lousy GUI keeps crashing, and I don't really know how to fix it. It's quite annoying. It crashes fairly frequently and is consistent, but it GPFs before it even reaches my code (the GPF is in the interactionmaster, but because it's repeatable it must be related in some way to my code. This is highly annoying as I doubt the end user will want to be restarting the game every couple minutes. Granted, it takes under a second from icon click till you're in the editor, but still, it's annoying.

{{classbox| October 30th, 2003}}
: AHA! I've said it numerous times before, but when you debug something, make sure the tool you are using to debug it is working properly first. Turns out that the stack trace provided on a GPF is not always 100% accurate, interestingly enough. Turns out there is actually at least two distinct things causing a GPF, but they were actually a consequence of my input system, not a fault in the Interaction Master as the stack trace suggested. (It said that execution never made it out of the interaction master, when in fact it had gone about 6 functions down the line when it crashed.)

: I trimmed the number of crashes to about half by simply changing a return false to return true in KeyType. Apparently, KeyType does not like inputs being left unprocessed. My loading function was still crashing but I did some tests and found it's actually something in the vehicle loading that's doing it. (Commenting out the vehicle loading prevented crashes, and I also placed the vehicle loading in the postbeginplay of an actor so I can invoke it on demand, that crashed the game just the same.)

: Armed with that knowledge, I was able to trace it to a bug in the native iterator code. A short workaround later, and the bug has been thoroughly stomped to death!

{{classbox| November 2, 2003}}
: Eureka! I finally got the bots to not have crappy aim, and did it in an interesting fashion too. I was trying to find a formula that would determine the ideal heading of the ship to have the weapons bearing on the target. That seems simple enough until you consider that unless the ship is balanced absolutely 100% perfectly, There is going to be some disagreement between the theoretical &quot;heading&quot; of the ship and the direction it is actually facing and travelling. This is especially the case when a ship is damaged which can cause it's center of gravity to change.

: I had a formula that calculated quite precisely where the shots should go, but I couldn't find a satisfactory way to make the bots aim and shoot at that point. After thinking about it for a while, I decided to use a very un-computery method. Instead, the bots aim using a semblance of the way human beings would aim. They use a formula to get them facing in the general direction of the enemy, then track their &quot;crosshair&quot; relative to the target's location &quot;on screen.&quot; Armed with that information, they constantly adjust their heading to bring the &quot;crosshair&quot; ever closer to the targets &quot;on screen&quot; position. This seems to work surprisingly well and should also theoretically work regardless of the weapon configuration on their ship.

{{classbox| November 4th, 2003}}
: Been having problems with gimbal lock. The ships don't suffer, and the aiming doesn't suffer, just the camera does. That of course causes problems as the camera whips around 180 degrees frequently if you are flying more or less straight &quot;up&quot; or &quot;down.&quot; I've tried a number of solutions but I've yet to find one that I'm satisfied with.

: I thought quaternions were the answer but they didn't produce the effect I wanted, at least on the controls. I still want to maintain the &quot;distorted&quot; nature of Euler Angles, but I don't want them constrained to the Z-axis, instead being relative to the ship's Z-axis.

: This I managed without too much trouble but the camera still has it's gimbal lock around the world Z-axis so it spins whenever it crosses the world axis. I may try using quaternions only for the camera while leaving the aiming and controls strictly vector math.

: I also came up with an ingenious scheme. Originally, I wanted to make the AIs pretend to be players. Then, as I was writing some stability management code, I thought that I really should just make the players a special type of &quot;AI&quot; player. At first it seems like a wierd notion, but really, it makes a lot of sense when I think about it.

{{classbox| November 5th, 2003}}
: I've got the gimbal lock cleared up, temporarily at least. I'm not that fond of the way I fixed it, but it suffices for now. Previously the camera would always stay looking at the ship, but the angle it was viewed from depended on the ship's aim. I have since abandoned this system and gone for a more &quot;chase plane&quot; style of camera. This has a very different feel to it than the previous camera but I'm undecided whether this one is good or not. At the very least, it rendered the existing &quot;crosshairs&quot; useless at best. The old system had a series of parrallax crosshairs to show the path of the weapons. That system is useless in the new system, because there is virtually no camera movement relative to the ship, so the parrallax cannot be observed, and thus cannot be used to infer any information on range.

: The new system uses an adaptive crosshair instead that places itself at a distance from the camera proportional to the target's distance from the ship. Thus, the range can be inferred from the size of the crosshair. This has proven to be an extremely reliable and easy way to hit the target, but unfortunately it's a bit lacking in &quot;look cool factor.&quot; The parrallax looked very sci-fi, while this system, though a superior system from an accuracy point of view, does not have that same feel.

: I also forgot that DT_Sprite does not support materials, so I'm going to have to use a static mesh &quot;card&quot; with the crosshair material on it. Until I do that, I'm stuck with a bland, non-fancy crosshair.

: I made the AI pilots a bit smarter, but they're still not all that good. They seem to be joining up and flying in formation when they attack, but I'm pretty sure that's just a coincidence, because the formation code is not yet complete. They still manage to kill me, but it's usually my own fault. I have a bad habit of ramming into the drone fighters, because I wait too long before turning away, and consequently usually lose a wing or other fairly important piece of equipment.

: I've also actually grown quite fond of the drone fighters and other ships I made. When I made the original set of parts I didn't expect there to be much variety, I was expecting that that would come in afterward when I started adding more parts. However, interestingly enough none of the ships I have designed look much like the original model I dissected to make the parts. One thing I had not foreseen was that the semi-user friendly method I made to make parts has a fatal flaw in it. Though it seems reasonable to make them by hand in the editor, this results in slight differences in the mass distribution and as such a ship that appears symmetrical is actually not necessarily balanced all that well. I believe that this is why the original drone fighters I constructed (which were predefined in code and did not follow the normal vehicle rules) fought a lot better than the new breed. I'll definately have to put some code in the part editor to search for things that seem like they should be symmetrical, line up things that are more or less coplanar, etc.

{{classbox| November 7, 2003}}
: I really don't like modern advertising. One of the archetypes I especially don't like is the kind that tries to appeal to your nostalgia, like the &quot;good old days&quot; were so much better. That's why it pains me to say this:

: Modern image editing software is so hideous it makes me want to kick something. I recently upgraded my video drivers so Aldus Photostyler stopped working. (It's been out of production and unsupported for over a decade.) This means that I'm forced to &quot;upgrade&quot; to something newer.

: I tried Adobe Photoshop first. My first impression was that it's needlessly complicated. Operations that took two clicks in Photostyler now took a half dozen. That's of course AFTER you've gotten &quot;the hang of it.&quot; There's all this needless nonsense in it. All I want to do is create and modify images, I can live without so many bells and whistles it shatters the windows in your house when so much as a tooltip is displayed.

: After that, I tried Paint Shop Pro, which I liked even less. I kind of figured that a newer piece of software would run faster with more features and functionality. Boy was I surprised! As cute as the idea of collapsing ten tools into one highly customizable one sounds, it makes it a bit difficult when you want to go from a pen to a brush and back. Heck, why bother having a pen AND a brush, when they can just make both the same tool that you can adjust? :/ To add more fuel to the fire, tools that I had in Photostyler apparently have no more place in modern image editing software, as they are mysteriously absent. 

: Apparently Jasc has a different definition of &quot;alpha channel&quot; than everyone else in the industry. In fact, in Paint Shop Pro, not only can you have multiple alpha channels, but they don't even do anything! They're just a place to store extra image data, just in case they port the program to an operating system that hasn't developed the concept of a file system, I guess.

: Did I mention that Paint Shop Pro also personally vomits on anything you try to save in the Targa format? After a few hours I managed to produce an entertaining variety of rotated images and images with the color channels switched around so pink is purple and black is yellow. Just to keep it interesting, it usually also cut the image to ribbons and rearranged it in a lovely collage. If nothing else, at least it keeps you on your toes.

: Then there's &quot;layers.&quot; What's with that anyway? It's a 2D image, by definition the concept of adding a 2D layer to a 2D object just doesn't make sense. Why should I have to &quot;flatten&quot; an image every time I edit something? I suppose it might help if you wanted to change something later, but Photostyler had that feature licked a long time ago. First you press control, then you press Z. Amazing!

: I personally can't believe that corporations that buy this software actually put up with stuff like that. Here's a tip: buy a Pentium 233 without an accelerated graphics card and install Aldus Photostyler. You'll at least double your productivity, and the suicide rate among graphic artists will drop dramatically.

{{classbox| November 8th, 2003}}
: I've been working on the formation code, but it's much trickier than I thought it would be. Flying in formation is actually surprisingly complex when your ships can't strafe, go backwards, or freely rotate. I've gotten them to fly in formation as long as the formation leader only makes gentle movements or accelerates and decelerates very slowly.

: I got them to fly half-decently like that by calculating where they &quot;should&quot; be in the formation, and having them aim some distance ahead of that location. In theory, that eventually results in them facing the same direction as the formation leader, and more or less in the correct direction. Then, the throttle is manipulated to fit the ship into it's position in the formation. This system, however, is not particularly amiable to rapid rotation and does not allow fighters to form up to a slow-moving or stationary formation.

: Having said all that, I'm not exactly clear on what the benefit to having fighters fly in formation is anyway, other than aesthetics. It does look kind of cool though.

{{classbox| November 9th, 2003}}
: I've been getting a bit bored with working on game mechanics like the ships, so I thought I'd work through some of the GUI elements. They still look fugly, seeing as I use a grand total of 3 textures for the whole interface, with various stretchings and such applied. (4 textures if you could the default textures in the entry level)

: However, I've got some stuff made for all of the major areas. I got a start on the video settings area, enough that you can set your resolution and color depth at least. Detail level controls and audio controls will probrably come soon. I've had to struggle with this because a lot of configuration stuff is stored in playercontroller/player/playerreplicationinfo, which I don't use except as a glorified camera. Unfortunately, since there's a lot of native stuff involved with those settings it makes it a bit trickier.

: I also had a nifty ambition to make more customizable characters but it's hit a bit of a snag as well. I was going to have it be something like UPaint, only a bit more structured. For instance, you could select, say, a piece of armor, and change it's coloration and markings and whatnot. The original texture of the armor would be preserved, you'd just more or less draw &quot;on top&quot; of it.

: Unfortunately, I realized today that skeletal meshes have cylinder collision, so that way won't really work. I've considered making them ragdolls, which would give better collision so I could trace and see where you were trying to draw, but that still might not work that well because I'm not confident that it will return the correct Material from the trace function. I think that might only work on BSP. Maybe I should test it though.

: At any rate, it's also an issue because it means I won't be able to use &quot;regular&quot; models. I would like for players to be able to just download a mesh from polycount or wherever and use it, but this system may not be very compatible with that sort of system. One would likely have to have made the model for the mod in order for it to work. Models made for my mod could theoretically still be used in UT2003 with a small mutator, but not really the other way around.

: For that reason I've decided to leave that idea on the backburner for a while and just sort out some other menu stuff. I'm a bit unsure what to do next game mechanic-wise. I don't really feel like it's ready for full-blown content creation but yet I can't think of anything that still needs to be done. I just have that feeling that it's not ready yet.

{{classbox| November 10th, 2003}}
: Implemented a neat feature, in my opinion. The effectiveness of a weapon is now related somewhat to it's configuration. IE If an energy weapon is starved for energy because the generators are not large enough or they simply can't (for whatever reason) get the energy into the energy weapon, that weapon will not fire as fast. Weapons also have an internal energy buffer, so they can fire in bursts if fully charged. Basically it works like so:

: Every time the weapon fires, it drains energy. The weapons have a very short mandatory cycle time before they fire again. However, they can only fire if they have enough energy to do so. All weapons have an internal energy buffer so they can often fire several times in quick succession without any external energy source, but the internal buffer doesn't hold a lot of energy. Once the weapon fires, and is no longer at full energy, it will start to siphon energy from things around it. The more abundant energy is in the things around it, the more quickly it will be able to replenish it's energy. The more quickly energy can be replenished, of course, the longer the internal buffer is going to last. (the reinforcement of energy helps it in it's &quot;uphill battle&quot; against the consumption of energy by the weapon.) Eventually, if energy is abundant enough, the energy may be able to be replenished faster than it is being consumed, so fully-automatic fire will be possible.

: This adds an additional design consideration. The farther the generators are from the weapons, the longer it's going to take energy to get there, thus the weapons will not perform as well. Also, there is a tradeoff between energy and weaponry. If you have too many weapons and not enough generators, your weapons will not perform as well, whereas if you have a lot of generators and only a few weapons, those weapons will be &quot;supercharged&quot; with all the excess energy. Kind of a quality vs. quantity balancing act.

{{classbox| November 11th, 2003}}
: I implemented a shady &quot;hack&quot; to overcome a wierd problem I was having with SetLocation. Hopefully I can find out why it wasn't working as I expected before. The system I have now isn't really a hack, per se, just a system that I don't want to use. Before, I had an actor that was created, and then moved itself to the location where it was supposed to be. This didn't seem to work though, so I implemented a static function that finds the location it's supposed to be, and then it just gets spawned in that location.

: It seems elegant in theory, but it's needless duplication, as I also have a non-static version of the function which is almost identical. I don't want to use the static function for both though because it requires some additional parameters. Also, it doesn't fell right, because it's conceptually an &quot;instance&quot; function. In this instance you have to supply as an argument the rotation that it is going to have when created in order for it to give back the results. I also don't feel right about it because it works in the editor, but in the game, which uses the exact same actor to spawn the ships, it doesn't work. It's crazy like that. :rolleyes:

{{classbox| November 15th, 2003}}
: I've been &quot;renovating&quot; the code and package structure to move things to where they are a bit more appropriate. There was some stuff kicking around in the base package that was a bit more specific so I moved it out, also I redid the input handler because it was a bit ancient. Originally I had a buffered input system that was going to get sent over the network, but I've since found that that system is not particularly efficient so I converted it so inputs were not buffered and instead handled immediately.

: However, that conversion was still that: a conversion of a different system. To clean it up a bit I just rewrote the whole thing. I also moved most of the functionality into the &quot;HumanPlayer&quot; class. (something akin to playercontroller)

: Most recently I've been pondering on a way to have two GUIs running simultaneously. Basically I was thinking I could make the HUD and scoreboard just another type of menu, which would allow them to use the same skinning system as the menu. (Which is pretty flaky right now but whatever. :P) However, being that it was the GUI I designed it fairly invasively so I'm not sure how well it would handle running side-by-side with another GUI.

: I've also encountered a bit of a &quot;problem.&quot; It's more a design consideration really. That is, the matter of scale. Realistically, futuristic space fighters would probrably go blindingly fast. This poses an obvious problem as your target would go from the horizon line to behind you in a fraction of a second. Obviously, that would make for rather boring ship combat. However, having the ships at a speed that's &quot;fun&quot; makes them either rediculously slow, or rediculously large. Given that they are scaled appropriately to persons on foot, that makes them really slow.

: I'm not sure if that's really a bad thing or not, but it might be. A lot of people complained about UnrealSpeed because the cars didn't go that fast - when the speedometer was reading over 100MPH, your car was moving along at about 40 clicks. (Similarly, the scout in homeworld allegedly travelled at 1050 m/s and the probe at 4km/s, but noone complained then. :rolleyes: Then again, the size of the fighter craft compared to the capital ships, and the size of the capital ships compared to the windows on those capital ships, suggest that the fighter craft in homeworld were about the size of an apartment building, while the larger capital ships approximated a city block. :rolleyes:)

: Anyways, I need to cook up a good premise for why the ships would be so slow, but so far I haven't really come up with a good one. I could say it was masses of ablative armor to cope with the power of futuristic weapons, but that feels like a cop-out to me.

{{classbox| November 17th}}
: I've been feeling some apathy towards coding lately so I'm trying to get something a bit more polished and professional looking. The game mechanics seem to be mostly done. Or so it would seem. I can't really think of anything that's missing, at any rate.

: In my attempt to do that I've been playing around with the scoring system. I'm stuck between two ideas: having fixed ship values or having flexible ones that affect your scoring. IE There could be a limit set for the game, whereby no player could spawn with a ship that was deemed to be beyond a certain power level. This however poses a slight problem in that it promotes reckless agression - the faster you can destroy your ship, the sooner you'll get a shiny new one. This also poses a problem in that you can spawn, suicide your cockpit into something leaving the rest of the ship reasonably intact, then destroy the remainder of your own ship (which can't exactly fight back at this point) and collect the points for it. I could penalize players for suicides, but I don't really want to do that because often your ship will be extremely crippled and there will be effectively nothing you can do, except possibly spin around in a circle with your one remaining thruster. In those situations, suicide is expected.

: The other system is geared more to a kills:death ratio, while factoring in the cost of your ship. When you spawn, you lose an amount of points equivalent to the &quot;value&quot; of your ship. When you destroy or damage enemy ships you get a proportion of that ships &quot;value&quot; back in points. Therefore, players who kill about as often as they are killed will have a score around 0, players who kill a lot and are rarely damaged will have positive scores, and players who get slaughtered like lambs will have a negative score. The problem I see with this is, (as some people feel is the case with existing gametypes) a small difference in skill may lead to a dramatic difference in points. Also, evenly matched players will end up in a virtual deadlock, both unable to accumulate enough points to end the match.

: I'm thinking I may be able to combat that, however, by having ships worth their value in points, and the player themselves worth something. Therefore, the bulk of the points will come from destroying opposing PILOTS, instead of from destroying the bulk of their ship. This would also help prevent a pileup of crippled ships, as there would be a strong incentive to finish off the cockpit. Presently, the cockpit is a secondary target, as it is relatively low value and fairly heavily armoured. This leads to a strong tendancy to attack the engines, then engage the immobile, (and now helpless) target and rip their ship to smithereens. Once the bulk of the superstructure has been destroyed, however, it requires too precise of shooting to mop up all the stray bits of debris that are left over, and usually one of said bits is the cockpit. This &quot;soluttion&quot; however, poses a new problem - that is, a player could suicide directly before they were finished off, thus denying the would-be killer the points.

: I could substitute when you suicide - when you hit the suicide button, instead of self-destructing the cockpit, it could just respawn the player and substitute in a passive AI that just waits to get killed. That way the would-be killer still collects the points. But wait - then we're back to square 1 - a player can spawn, suicide, then kill the defenseless ship they just suicided from and reap the points. Maybe I could make the AI temporarily be on the same &quot;team&quot; so it would count against you if you killed your own stand-in. Hmmm..

{{classbox| November 18th, 2003}}
: I felt that the effect for the lightning gun was a bit lack-luster so I set about trying to make a better one. Unfortunately, I hit a bit of a roadblock: apparently, emitters can't use materials, only textures. That is a shame because I could make a much fancier effect without straining the system if I could use a Combiner as the texture for the beam effect. Unfortunately, that doesn't seem like it will be an option so I'd have to come up with another alternative, or something.

: That was a bit of a diversion from my mod, but I'm not really sure what I want to do with that next so it's kind of sitting on the backburner. I think I've been coding too much because it's started to creep into my conciousness at all times. For instance, last night I tossed a plastic bag into the cardboard recycling, but instead of saying &quot;Oops, that's the wrong container,&quot; I said &quot;Wait a minute, that's not going to compile.&quot;

: I also forgot to mention, I'm at a bit of an impasse with the mod AI-wise. The AI sucks, but multiplayer is a long, long way off. (I won't implement multiplayer until the botmatch stuff is finalized.) I need a way to make the AI better, but I'm not really sure how I can go about doing that. The AI isn't bad on larger ships - only on the fighters.

: Capital ship combat is not too difficult for the AI. The target is fairly large, and coupled with turreted weapons it is virtually child's play to engage an opposing capital ship. Even attacking fighters is rendered much simpler by the availibility of turrets. Gunships are also generally armed with either turrets or homing missiles, making aiming much simpler.

: Fighters are a different story, however. When your guns are bolted to the frame of your fighter, suddenly the dynamics of your craft come into play in a big way. If the ship is slightly off balance, you're going to have to compensate by leaning toward one direction or the other. (the &quot;crab&quot; technique) This of course is massively complicated to the AI. It has to adjust it's aim to compensate for any imbalance on the ship. (which is a given once a few hits have been taken.)

: The system that I have now works &quot;decent.&quot; It works decent, in that it '''works.''' However, the AI is relatively slow at acquiring a target, compared to a human player, and is next to hopeless against a moving target. This is because it's current system works by making minute adjustments to it's aim until eventually the guns are lined up. IE, it uses a formula to determine theoretically which direction it would have to aim, then when it's aiming that direction thinks &quot;I'm aiming where I theoretically SHOULD be, but my guns are aimed below the target, so I need to adjust upward.&quot; In theory that system is good, but it's sort of delayed gratification, and difficult to track an evasive target.

{{classbox| November 21st, 2003}}
: Did some various diagnostics to find out why my mod was running too slow, and I found a couple of interesting things:
# The script uses a lot of time, about 15ms per tick per complete ship. This is of course on my POS computer so take that statistic with a grain of salt. The time taken is directly proportional to the number of ships. Though this is steep compared to the script time for most mods, one must also consider the sheer amount of math that takes place - computing engine thrust vectors and throttle levels is not as quick as one might think when you consider that the system must acommodate thrusters placed in any location and any orientation, even the most bizarre ones.
# The Karma simulation, which I suspected as being the main culprit of the slowness, actually only takes about 7ms per ship.
# The static mesh collision checks appear to grow exponentially with the number of ships and appears to be the main cause of the slowdown.
# My interactions are taking about 10ms of each tick. That is insane, but appears to be an artifact of the way interactions are implemented, rather than any fault in my specific interaction code.
# About 35ms was spent rendering, except when I riddled a fuel tank full of holes and fuel started streaming out. The particle systems involved caused the rendering time to skyrocket in excess of 100ms just for the particles. I'll have to rework those effects to be a bit more friendly.

{{classbox| November 22, 2003}}
: I came up with a brute-force solution to a problem I've been having with calculating the correct rotation for things in the editor. The solution actually turned out pretty good. It's essentially a very small scale neural network system. I thought that it would be a bit slow, but it's not noticeable, and it's only used in the editor, where framerate wouldn't be as important anyway. I wouldn't use something like that in Tick, for sure, but this is a &quot;one time&quot; function that gets called only based on a certain user action, and they can't really perform that action frequently enough to strain the framerate.

====Later that day...====

: I fixed another problem that had been bugging me for a long time. The editor is much improved now, in my opinion. My progress has been stifled somewhat however, with the discovery of an engine limit. It turns out that although in theory Unreal Units are all relative, this is not the case.

: First I found that lightradius and soundradius are in a certain set scale. That's not that big of an issue however, as static lights are best kept small, and dynamic lights can be made quite large. (dynamic lights operate on a vastly different scale than static lights)

: Apparently, the engine automatically clips things that are  more than about 60,000 unreal units from the camera. That is bad, because although fighter craft have long since disappeared into the blackness of space by that point, large capital ships are clipped before they could rightly be seen.

: I've covered up the clipping by using black fog (I've had it all along, I just had to adjust it to go to the clipping distance) but it's still a bit short. When a capital ship begins to fade into view, it's still pretty far away, for a fighter craft, but certainately not at the range that standoff combat between large capital ships may occur at. It also doesn't look very good against a non-black background because it always fades to black, not to whatever color the object is behind. It would be nice if there was a &quot;fade to translucent&quot; of some sort.

: Also, I've noticed a boon to the relative slowness of the fighters: number 1, it makes the capital ships feel huger. number 2, it makes space feel bigger. The maximum size for a map in UT2003 is pretty big, but not really big enough to do a large space area justice. However, because the fighter ships are relatively slow, they can fly for quite some time before hitting the edge of the world. (The heavy fighter I designed has just enough fuel to fly from one corner of the &quot;world&quot; to the other, though since the carriers are closer to the edge you could concievably hit the edge if you flew directly away from the enemy carrier for a while. This can be remedied somewhat, because the map is not as big as it could be. It actually only takes up about half the maximum map size.

{{classbox| November 27th, 2003}}
: I'm not really sure what coding to do next: I feel like everythings &quot;done,&quot; but it obviously isn't. I just don't know where to jump in I guess. I guess I'll work on the menu system some more.

{{classbox| December 9th, 2003}}
: It's been more than 10 days since I updated this and I haven't really done any coding. I think I'm experiencing a case of the &quot;winter blahs.&quot; I think I'm going to modify the camera code a bit, and then maybe do some ground-based stuff.

{{classbox| December 13th, 2003}}
: I made nifty bullet-style weapons with fancy penetration and everything! I think that various &quot;realism&quot; mods have had something like this in them, but mine's better! :D

: Simply enough, all bullets have a muzzle energy, drag coefficient, hard target penetration coefficient (ships, walls, etc.) and a soft target penetration coefficient. (people) The weapons then does a series of successive traces, and every time it hits something, it figures out whether its hard or soft, and how thick it is. Then the bullet does damage, slows down, transfers momentum, and travels through the target as applicable. It also makes fancy chips and junk come out of the point where it &quot;penetrated&quot; a hard object, and makes blood and stuff come out of the place where it &quot;penetrates&quot; a soft object.

: Though it would be very nifty to have dynamically projected &quot;portals&quot; projected on things so you could see &quot;through&quot; the cavity left by the bullet, this would be too processor intensive. To that end, only static &quot;hole&quot; decals are going to be used, and then only on pieces of the world. (Constantly computing projector locations for moving and rotating ships uses too much processing power.

: The penetration is mostly going to be relatively weak through hard objects, otherwise a human player could just spray aimlessly at walls and hit people a couple of rooms over. The hard target penetration is going to be sufficiently low that only relatively thin objects (like a railing, fence, maybe a lamp post) can be penetrated. Of course, different weapons will have different penetrations, the human submachinegun has relatively low penetration, while the assault rifle has reasonable penetration. Sniper rifles would be an ideal candidate for this sort of penetration, however I'm going to have the sniper rifle be like.. that rifle in Deep Space Nine. The one that teleports it's projectile to just in front of it's target, so every shot is at point blank.

{{classbox| December 16th, 2003}}
: Apparently my pathfinding code doesn't work anymore. It pulls either an &quot;infinite recursion,&quot; (not actually infinite, just more than 250 calls) or a &quot;runaway loop.&quot; This is kind of strange since it never used to do that, and it used to run quite fast even with multiple AI players running around.

: I have two potential solutions: Number 1, I can have the editor preprocess the path information. This is more or less what Epic does, but I don't really want to do it that way because then you can't have the path network &quot;learn&quot; in real-time. (IE if someone sprays a bunch of napalm around a navpoint, it should be excluded from pathmaking by any bot that knows it's exteremely dangerous.) The second potential system is to have a heirarchial type of path network. Essentially, the path network would be split up into larger areas, and the path would be generated area - area. Then each time an area was entered, a path would be generated pathnode - pathnode to get from that area to the next area. This method would greatly reduce the path length that had to be considered at any one time, however, it requires more effort for the mapper as they will have to set up the areas as well as the individual pathnodes.

{{classbox| December 18, 2003}}
: I've temporarily fixed the pathfinding system by instituting a hard limit on maximum path length. It's not the ideal solution, but for any reasonably-sized map it should be fine. Unlike Epic's pathnodes, there is no need for mine to be a set maximum distance apart, so you can cover a large outdoor area relatively easily by just placing one pathnode at every place where the bots are going to need to turn. Basically, the bots need to be able to make a beeline from one node to another, but distance doesn't matter.

: Having said that I still need to come up with a solution to having multiple sets of pathnodes on a level. Obviously there are going to be some paths that persons on foot can travel, but some vehicles may not be able to make it. Aircraft and spacecraft also should use an airborne set of paths, instead of attempting to follow along the ground. (Though maybe I could just have them fly a given distance above the ground path network.)

{{classbox| December 24th, 2003}}
: I implemented a snazzy path caching scheme to speed up the pathfinding. It's very nifty - but it still has the same problem as before, it's not amiable to changing path values. That part kinda sucks. However, it does result in a 25-50 times reduction in time spent pathfinding, so I guess it's okay.

: The existing paths, without caching, were working okay now, but I wanted to do a lot MORE pathfinding. Presently the bots pick somewhere they want to go and pathfind their merry way there. I want them to use pathfinding to pick where to go too. IE:

# Bot scans availible pickups in the world
# Bot traces path to each pickup to find approximate time to acquire. (No aggregation of pickups will be considered for now. EG it's worth it to travel twice as far to pickup one health vial instead of another, if there's four more health vials on the way..)
# Bot pathfinds its way to the pickup.

: This of course requires a great deal of pathfinding every time the bot wants to decide what to do. The bots are actually pretty good as it is, even though their AI is incredibly simple. The only real improvements that they &quot;need&quot; are to pick up weapons and such when they need one. Many times I'll loose a three-round burst into a bot and watch it heave over, with it's gun clattering to the floor, only to have it crawl and stagger back to it's feet and hightail it away from me empty handed. (Instead if picking up the gun that it dropped and is mere feet away.)

: Fortunately, the whole thing is rather &quot;leet&quot; if I do say so myself. Which I wouldn't. Because I don't use that expression. But if I did, then I would. :P The mod makes gratuitous use of Karma, which is good for plenty of eye-candy. It's got the Karma injury system brainstormed over on [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]], and when you get ragdolled in this manner, you also drop the weapon you were carrying. (Understandable, since you've just been sent flying from an explosion or otherwise sent off your feet.) This is super neat because the attachment falls from your hand and uses Karma to tumble away on the ground. So, while you are getting tossed away by a concussive blast, your weapon goes too, but likely will not end up in exactly the same place as you. Sometimes it will land near you, and if you manage to stagger back to your feet you can just grab it and get back into the action, other times it will have gone over a railing into some lava, or landed up on a ledge where you can't reach it so you'll have to find another.

: I played a mutator at one point that made you drop your weapon if you got hurt badly, but I didn't like it very much compared to this. In that one, you'd be running along and suddenly your weapon would change. (when you got hit) That I found very frustrating and all around not very fun. In my mod, the feel is much different, since you're sent flying anyway and will be lucky to even survive.

: Speaking of which, I'm not really sure what I should do about the deaths. Right now, if you're using the first person camera, the camera follows your head when you're ragdolling. (Some internal adjustments are done to prevent you from seeing clipping should your head end up through a wall or something.) This is quite nifty actually. The same thing happens when you die. My first thoughts were when I implemented it, that it's very reminiscent of DOOM. :P

: Anyways, when you are sent ragdolling, it's basically the same regardless of whether you're dead or just severely wounded. I'm not sure if this is good or bad. The only way you can really tell which it is is if you're dead, you can respawn by clicking fire, whereas if you're just severely wounded, clicking fire does nothing until you are back up. Actually, if you have a secondary weapon you can draw your secondary while you lie on the ground and can sort of half-decently shoot it. Very nifty. Anyways, the other obvious way to tell, of course, is that if you aren't dead you'll claw your way back to your feet after a short time spent wounded. I'm not sure if I should make a way to easily tell between being dead and just being wounded.

: I've been making lots of eye-candy lately instead of doing &quot;real&quot; programming, and I'm quite proud of the results. (As you can probrably tell by the amount of rambling about this cool feature and that :P) The final part I've made that I also think is super cool, is loads of blood and a more-or-less realistic &quot;combat inspired blood distribution.&quot; :P

: Basically, when you are wounded by different things, different stuff can happen. This can be custom scripted by modellers and skinners, or they could use one of the default types. It's kind of like the species code.. only a lot better, because that just defines gibs and blood and stuff. This allows you to script responses to different types of attack. For instance, if a Terran is shot and the bullet penetrates his body and comes out the other side (did I mention I made nifty ballistics and penetration calculations :D) blood sprays from his backside. (and he generally dies) These blood droplets then fly through the air eventually landing somewhere. This means A) if you have a decent framerate you can see the blood spray from the body before it gets smeared all over a wall, and B) the blood is patterned on the wall depending on the angle of the hit and such. Shooting a person above you tends to cause blood to spray upwards and lightly coat an area, while shooting someone below you tends to create a dense splatter on the floor some distance behind them. Other damage types have different responses, for instance impact damage (taken from falling too far, hitting something too fast, getting hit by a car, etc.) leave a bloody mark where you impacted, but only if the impact was severe, or the person was already heavily wounded to begin with. If a heavily wounded terran is ragdolled and slides down a ramp or stairs, he'll leave a smeared trail of blood wherever he slides.

: All in all I'm very excited about it.

{{classbox| December 25, 2003}}
: Got Homeworld 2 and Unreal II for Christmas. Programming is unofficially suspended until I finish/get bored of both. :D

{{classbox| January 2nd, 2004}}
: I've been making various visual improvements, but I'm still snagged on the ~60,000 UU maximum draw distance. I tried scaling everything down to allieviate this, but that caused all hell to break loose when things got too small and the loss of precision with integers started causing visual problems that were even worse. Plus, scaling everything down was going to force me to remove one of the cooler features of my mod, (the ability to walk around inside the ship while in flight or landed) which I didn't really want to do. So, for the time being things remain invisible at moderately long distances. I also tried having &quot;stand-ins&quot; for things that were far away that would appear at 60,000 UUs away and scale appropriately to make them look farther away, but I scrapped that when I realized that that would not look good if a player was using a stereoscopic display of any sort.

{{classbox| January 3rd, 2004}}
: I decided to make the stand-in actors anyway. This won't look right to anyone using a stereoscopic display, but I'll have to settle for the time being. It will in fact look quite bizarre to them because the stand-ins are relatively close to the camera. (This is to prevent them being obscured by fog.)

: Fortunately, the appropriate placement and drawscale was easy - it's a straight linear scaling. IE, something twice as far is half the size on-screen. This seems only logical, but some games use a non-linear scaling so you can make out details better at long distances. (Homeworld is an ideal example of this.. the difference in size between ships is much lesser when zoomed out.) Anyways, this made it very easy to make a seamless transition from stand-in the the real thing and vice versa. There's a few visual glitches that would be difficult if not near impossible to rectify - for like if a missile impacts a capital ship, the explosion will not appear on the stand-in. You could fix that by giving EVERYTHING a stand-in, which would be easy enough to do, but I don't want to have stand-ins for stuff that's REALLY far away. I tried setting everything to use them, but ended up with annoying glittering pixels of fighters that were really far away. I guess it might look okay at, say 65000x40000 resolution though. :P

: This situation normally wouldn't be all that bad, if not for the great differences in size of different ships. That was something that kind of bugged me in Homeworld - the fighters were approaching the size of the frigates. The frigates had little windows painted on them to show that they were real big, but then a fighter would fly by with a cockpit about a dozen frigate windows long. Also the asteroids were pretty puny compared to the size of the ships. I've never visited one, but it's my understanding that asteroids are generally pretty big compared to pretty much anything man-made. Unless maybe you count the great wall of China. I hear it's pretty big. Anyways, my ships have appropriate scaling, so the fighters are relatively tiny compared to carriers. (Though the difference in scale is not as much as I would like, they also have to be scaled appropriately to persons on the ground, and the Unreal Engine does have a maximum map size, ya know. ;))

: Also, I got rid of the environment maps on ships. They looked fancy in the editor, but looked crappy in-game. When it's dark, (as it tends to be in deep space) the environment map (which doesn't appear to be affected much by changes in light level) becomes much brighter than the diffuse texture, and ends up looking lousy. That's the grey with white polka dots you see in the screenshots I posted earlier. Now that the environment map is gone, the ships look a lot better. (Well, not the carriers, because they didn't have environment maps. Only player ships had the crappy environment maps on them.) Speaking of which, I'll post new screenshots soon. I got a new computer, and I'm doing all my programming on that one now, but that one isn't connected to the internet, so I have to lug a hard drive in between computers to transfer files and such. Or I guess I could compress them and use a floppy disk. I don't like floppy disks though.

{{classbox| January 6th, 2004}}
: Heuristastic! Plus, I curse integers again. In lieu of actual knowledge of how to do a coordinate rotation on a Euler angle using another Euler angle, I implemented a theoretically slow heuristic instead. It's not actually noticeably slow and the only time it ever gets called is when a ship is loaded, built, or otherwise spawned. Even so, it runs surprisingly fast considering that it's a nested loop with numerous comparisons and operations taking place. Unfortuantely, due to some wacky loss of precision with integers, it's only accurate to within one unreal rotation unit in the roll direction, but hey, that's still 99.999999999999644728632119949907% accurate, according to windows calculator, which is probrably better far tighter tolerance than the human designer is going to be able to manage anyway.

: I also came up with a scheme to have all ships carry liquid ballast. I also have a feeling I wrote this already, but maybe not. Anyways, the liquid ballast can be pumped around the ship (this is handled automatically) to keep the center of mass, well.. centered. I decided I needed something like this because once your ships starts taking heavy fire and a good chunk of it is absent, the center of mass of your ship shifts way off the center and once it shifts laterally past your thrusters, you're going nowhere except in a circle. Once you start getting close to that point you can only fly by shifting the engine balance all the way to one side and using all your vector exhaust to stay straight. This makes it extremely difficult to aim and the AI can't handle it at all. (The AI compensation heuristic only kicks in once it's half-decently lined up.) Granted, by the time you've lost that much of your ship there's not much you can do, since most of your systems are probrably offline by then, but still... Anways, the problem I've been having with the ballast is twofold - number one, more ballast is needed to maintain stability than I had realised. This is bad because it roughly doubles the weight of your ship. Also, there's a slight problem in that the ballast adds a great deal of mass to the ship, which slows it down. Fast &quot;flag carrier&quot; ships may prefer no ballast for maximum speed, and sacrifice the stability instead. Also, placing the ballast closer to the outside of the ship makes more of an impact with less added mass. This is good. However, the outermost parts of the ship are liable to be the first ones destroyed, so keeping your ballast at the end of your wings has it's own downside there, too. However, to keep it more central, where it will be safer, requires more mass to be added, reducing the potential speed of your craft...

: In other news, the AI now has slightly more of a clue of what to do. I've been developing so far under the premise of the &quot;carrier attack&quot; gametype, because it offers some of everything, so all of the code can be tested within the same level and gametype, which is good because it spares me from making more levels and gametypes just to test different features. Anyways, the AI now has the wit to attack the enemy carrier, as well as engaging enemy pilots en route to the friendly carrier.  However, they don't yet have the brains to avoid ramming into things. Generally, that's not a problem, but the AI from one carrier has a tendancy to crash inside the hangar of it's carrier as it launches. This will be improved in the near future. And new screenshots are coming soon. Soon! They're still on the other computer.

====And then some!====

: I wrote some stuff for collision avoidance. Unfortunately, it turned out to be rediculously slow. Initially I was using traces to detect nearby objects. You can't just take the difference in location between two objects because the location of a large ship may be a considerable distance from the surface of that ship. So I was using traces. This was slow. I figured it was because of the traces. I found out traces aren't that slow after all.

: I substituted it for what seemed ingenious. I'd just use a dummy actor with cylinder collision, set it's location to the location of the ship detecting nearby objects, and go through it's touchingactors array. Seems simple and fast. It wasn't.

: I was quite shocked to find that this ran at about a third of the speed of the trace method. Why, I have no plausable explanation. I did some optimization but still only got it down to taking about twice the time of the trace method. I don't like either method, however, because the trace method is too slow to use with more than about 8 bots at a time, and the dummy actor method is even slower. To remedy this, I have a couple of pontential solutions. I can reduce the extents of the traces used to detect nearby objects. A zero-extent trace would be ideal but if the extents are too small the ships think they have a clear path when they actually do not - obviously a bad thing. The extents have to be generous because there is no reasonably fast way to determine the extents of a static mesh from within unrealscript. Therefore, there's no real way to determine the extents you need to use except to have a generous preset amount that should cover the majority of ships that that particular AI will be flying.

==Jaunary 9th, 2004==
: I made a super-fancy skybox substitute. Screenshots are coming. Honest! :P I don't really like the way it looks, in that it isn't black so it doesn't look like space to me. However, it is much fancier from a technological standpoint, and probrably draws faster. I was stuck for a way to draw stuff &quot;under&quot; the world, which could then show through by making a HOM effect deliberately. I didn't have success with that, but then it hit me: the skybox gets drawn first, then the world gets drawn on top of it. So, I could draw stuff &quot;under&quot; the world by simply putting a static mesh sheet in the skybox that would automatically move and rotate so it was always facing the camera. Unfortunately, it's not perfect. There's a slight visual glitch that I'm not sure how I can fix, if I can fix it at all. I didn't want to use a scriptedtexture to update the stuff on the sheet, (since obviously it has to look different when you look differnt directions) because that would sacrifice compatibility with Mac and Linux, which I didn't really want to do if I could avoid it.  The glitch is caused by a Gimbal Lock issue which may be difficult to resolve. I'll make a scriptedtexture version for DirectX users, which will be free of the visual glitch. I'll post the screenshots up soon, on account of I have to go to work now, but maybe when I get back. Then people can decide for themselves.

: The new screenshots also show off a fugly ship I made. More of a modification of an existing ship. My interceptors were getting chewed up by the enemy carrier and didn't really ahve anything that could cause appreciable damage to it, so rather than go to all the trouble of implementing some more weapon types, I just hopped into the vehicle editor and tacked on 5 of the biggest anti-fighter cannons and another generator to power the whole mess. This was all done without leaving the game, mind you, so hopefully the new screenshots will give more of an idea as to the vehicle design part. Also included are some shots showing some more action. Coming soon!

{{classbox| January 11th, 2004}}
: Quite the frustrating day. I don't know why I didn't think of it before, but I realized that if I moved the &quot;safe distance&quot; from ships out of the ship AI and into the actual ship components, I could make an quasi-trace in Unrealscript. It actually worked quite well, and very fast too. Because I wasn't constrained to the &quot;upright cylinder&quot; collision, I was able to make a custom cylinder collision, where the cylinder is essentially the length of the trace, while the radius is the extents of it. This worked surprisingly well, and also allowed me to compensate for the movement of other ships (no use going around if it's moving out of your way already. Formerly there was a &quot;right of way&quot; system and the other ship was assumed to be getting out of your way if you had the right of way.) as well as compensating for the movement of the ship in question. (Fast moving ships are going to need to predict collision farther in advance than slower moving ships)

: Unfortunately, this improved collision prediction system showed a big failing in the avoidance system, specifically that the ships would get kind of antsy if other ships were around, but not moving in such a way that a collision was likely. (IE flying in formation) These ships weren't picked up at all by the old system, so the ships didn't get antsy about it, but that wasn't really that bad, since those ships are virtually never on an actual collision course. This is what I spent most of the day trying to fix.

: First, I figured I could use something like the code the fighters use to break off an attack run on a capital ship when they get too close. (This is not related to the collision avoidance, because the range at which they break off and such is not collision-related - it's based on the ship's estimated combat capabilities, as well as those of the target. IE get in close to carriers who can't defend themselves well, stay away from gunships, stay at long range and harrass large capital ships, etc.) Anyways, that didn't pan out, because the collision avoidance operates at much closer ranges and so that sort of gentle course alteration didn't work very well. Making it just plain steeper didn't work well, as the fighters would attempt to make a tight turn and their momentum would carry them into the thing they were trying to avoid.

: Secondly, I remembered some stuff from calculus about the surface of a circle and so on. I figured that, similarly, I could find the point on a sphere that was the minimum &quot;safe&quot; distance away from the carrier, and the portion of the circumference that represented the distance the fighter would travel in the time it was predicting ahead by. This didn't work. The fighters overshot the predicted point, then tried to do a 180 to correct, and hit the carrier.

: After fiddling with that for a little while, I came up with another idea: I could set the &quot;predicted point&quot; some distance ahead of the fighter: basically, where the fighter is expected to be a second (or some arbitrary amount of time) from now. Then, I could have large objects &quot;push&quot; on the predicted points. So, if you could imagine, it's like magnets of the same polarity, the large objects &quot;push&quot; the predicted endpoint away from the ship. Then, the fighter aims for the adjusted predicted point. This seems to work good and produces a very smoothe avoidance.

: After I got that taken care of I've been trying to streamline everything. I think the core functionality is all in now, so there shouldn't be any other major loads placed on the system from now on. (I hope.) Unfortunately, the game can get kind of slow when you get large numbers of ships flying around. I'm not sure where the time is being taken, however, so I've been taking various measurements to try to find the bottleneck. I've been hoping I'll find one horribe error I've made somewhere that's sucking up all the cycles, but more likely it's distributed and can't be easily fixed like that. It's a bit perplexing, however, as there seems to be a great deal of time unaccounted for. The timing measurements that I took don't add up to anywhere near the reported times in '''stat all'''. Earlier, it was reporting about 10ms script processing per ship I added to the world. However, my timer only found about 6 to 8 of those milliseconds.

: Even 6 to 8 milliseconds per ship, however, is much higher than I want, since I want the ability to have lots of fighter craft. Unfortunately, the code all appears to be pretty much optimal, though I did manage to squeeze 0.05 ms per component out of the resource model. (energy, fuel, ammo, and such) The old model had each component on a ship do it's own resourcing and go through a modest nested loop to compute resource distribution. The new method is slightly different, but theoretically should execute at nearly the same rate: instead of each component doing it's own resourcing with a nested loop, I made only one component on the ship do the resourcing, and it uses a doubly nested loop. So, basically:

Called once per component:

* For each component...
** Do resourcing between Self and j

: became:

* For each component...
** For each component...
*** Do resourcing between j and k.

: Theoretically these should be almost exactly the same. The only reason I was changing it was because there was a single redundant line that only needed to get called once a tick, but was getting called once a component. However, that call was cached anyway, so it was akin to an assignment. But, I was desparate. I was pleasantly shocked to find that the new method resulted in a 25% decrease in execution time! (0.2ms per component to 0.15ms per component) This, coupled with other information gleaned during the earlier timings, suggests to me that there is a considerable amount of overhead involved in every Unrealscript function call. (Rudimentary tests suggest about 0.009ms per function call, which doesn't seem like much, but can add up if you use recursion or function calls in loops.)

: To try to gain some speed I've been swapping some of the more time-critical code from Object Oriented Programming to Procedural Programming. So far the results have been favourable, from a performance standpoint anyway. It does sacrifice some readability. I've also been caching anything that gets called even half-ways frequently. (Center of Mass, master component, (the one that administers the resource model) nearest controller. (for ships with more than one pilot/gunner/whatever, this points to the component that houses the controls for this component. On fighters this is generally the cockpit everywhere, larger ships might have a turret controlling some pieces, while the cockpit controls others..) I also cached a dynamic array of related components, which saves me from doing the recursion to find them all as frequently. (ship parts that are a part of the ship in question)

: All these improvements have brought the speed to the point that you could concievably have a moderate sized game, by UT bot count standards anyway, depending on your machine and your desired framerate, anyway. I just know that there's still something hiding in the code gobbling up cycles, because I made a test ship that was light a freighter, with just a big stack of bulkheads and no engines or weapons (they time okay, but I strongly suspect they are the culprit) and I could make like 20 of them and still have a decent framerate. So I know that it's not Karma going slow, nor is it rendering, nor is it a problem at the heart of my vehicle code. I just know it's in there somewhere... and I need to make it go faster, since I want to have each side able to have at least a couple dozen fighters.

{{classbox| January 11th, 2003}}
: Apparently, using SetLocation is a fairly costly operation, even on non-colliding invisible things that can't affect anything as a result of moving. Hmmm. Turns out this was causing a slowdown in weapons and engines, since I always had the &quot;firecontroller&quot; (the business portion of the weapon) move to the point where the projectile/beam/whatever should come out of, and this needs to be constantly updated to stay in sync with a weapon that's likely also moving. This was costing many a cycle. I fixed it (a tad bit hackily) by simply changing all references to the firecontroller's location/rotation to &quot;effectivelocation/effectiverotation&quot;, and the two &quot;effective&quot; variables are set to the location/rotation where weapons fire should come from, instead of moving the actual firecontroller. This way is much faster. In theory. The framerate ''felt'' slower, even though it was actually faster. It's probrably just me. The fighters also started ramming into things again, this was because I forgot to change a reference in the AI to the firecontroller's location and rotation. (It uses this to line up it's weapons) I remembered that while I was writing the above.

{{classbox| January 14th, 2004}}
: I cooked up a scheme while I was at university today, to do faster coordinate rotations. I was thinking about how games use trig tables so they can just look up the result very quickly. Then I thought, why not have a coordinate rotation table? I could just have an array with 65536 cubed elements, and easily specify the rotation as an index into the array and get the result! Ingenious! Unfortunately, the lousy compiler won't let me make an array with 281474976710656 elements. It wouldn't even let me nest structs with arrays in them, and then make arrays of those structs, etc. (the compiler hung when I tried) I may (maybe) try doing it with dynamic arrays, but they might not be as fast because they probrably won't get a contiguous block of 3 or 4 megs in RAM so it'd be skipping around a lot.

====The fun never stops!====

: I was having a slight problem with Karma things &quot;exploding&quot; from trying to rotate too fast. This was only really a problem with the bots, though, because a human can't really turn fast enough for it to be a problem, unless they are getting really low framerates. (Reason's being they can't move the mouse fast enough to turn that fast, and even if they could, they couldn't see where they were trying to turn to since you can't see the rotation cursor thingy once it's past about 45 degress off the rotation of the ship. (though with practice you can wing it around and have it stop pretty much where you wanted it to) The bots however, gleefully do a 180 in their desired direction on a fairly regular basis, such as when turning around for another attack run on a carrier. This was causing a big problem. I tried a couple of fancy solutions, like storing the most recent &quot;good&quot; rigid body state, and restoring it if imminent Karma breakdown was detected, but this didn't work too good. It just resulted in the ship being reset to the instant before Karma broke down, and since it was under virtually identical conditions, it basically entered a loop of breaking down and being restored every couple of ticks.

: So, I decided to prevent the problem in the first place by smoothing the rotation of the AI. Basically, the AI's &quot;aim&quot; is metered out to the vehicle over a few ticks instead of giving it an instantaneous change in direction. I tried making them just have a maxmimum 90 degree offset in their &quot;aim,&quot; but that didn't work very good, and used more cycles than this way. The new way is super simple and surprisingly effective. Basically, every tick, the vehicle's &quot;aim&quot; and the vehicle's AI's &quot;aim&quot; are averaged. Now, you might say, &quot;every tick you average them? Why, my good man, that will cause synchronization issues on different machines on a network! Surely such methods are folly!&quot; But they aren't. It's framerate dependant for a reason: because the Karma explosion problem is. The slower the framerate, the gentler you have to be, (keep in mind these are futuristic space fighters, doing a 180 in 0.2 seconds is &quot;gentle&quot;) and the slower framerate results in less averages and thus a smoother motion. Besides, the AI is only simulated on the server side anyway, and the clients get the vehicle's updated aim, so they'll still be synchronized. So put that in your pipe and smoke it! :P

: I've also been trying to eliminate the visual glitch I was having with the backdrops. Basically it's like, if you can imagine a perfect sphere with the backdrop as it's texture, and you're looking at it from the inside. Because it's a perfect sphere, you get the same effect by panning and rotating the 2D texture and can forego all triangles, which is good, because a perfect sphere would require an infinite number of triangles, which could really bog down the framerate. ;)

: However, it's trickier than one might think: It has to pan seamlessly, which means you have to have a seamless wraparound. This is easy enough If your image tiles. In theory. It's actually not so simple. Horizontally, it tiles. That's simple enough. Vertically, it doesn't. It sort of &quot;collapses.&quot; Remember this is supposed to be the inside of a perfect sphere, and if you try to fold a piece of paper into a sphere you'll find that one axis tiles, and the other end you just kind of have to scrunch it all together to fit. The inspiration and pioneer of this technique, Homeworld, had it easy. They just gimbal locked at two poles so they never had that problem - because you can't roll when nearly level or &quot;yaw&quot; when pitched all the way up or down, they can just draw it un-scrunched and it still looks okay. Of course, if you were to measure things the view is actually quite distored in places using that cop-out, but you don't really notice, unless you were to bust out a ruler, then maybe you could see that when pitched all the way up or down the scale doesn't agree at different angles.. but I digress.

: Point is, I want to use something like the system they use, only better, because I can't have gimbal lock, for obvious reasons. It's very important that the background pan and rotate realistically, because my experience while developing the backdrop system so far has shown me that the background is very important to your sense of direction. When the backdrop was just fixed and didn't pan or anything, I couldn't tell where I was going. When it was going backwards, I could never accurately judge how far to turn, and so on. Point is, it has to be perfect! I want to avoid using a pseudo-skybox approach though, because I want to keep it entirely 2D, because it'll look better.

{{classbox| January 15th, 2004}}
: I implemented a nifty system to help the bots make more intelligent aiming decisions. I had the idea a while ago but I was surprised at how elegant it turned out. It won't get called alot, it'll get cached, and it's not processing intensive anyway, so I can afford to make it elegant. Basically, every ship is issued a &quot;classification,&quot; which, interestingly enough, is a reference to a class. These classes form a heirarchy which is very handy. I was able to encapsulate virtually everything in the base classification class as well.

: The solution turned out really good. Each &quot;class&quot; of vehicle/ship has two things: a rate function, and a list of subclasses in the defaultproperties. Interestingly enough, &quot;subclasses&quot; don't actually have to be a subclass, allowing for a non-linear descent down the &quot;class tree.&quot;

: Basically, a function is called on the base class, which iterates through it's list of subclasses, and calls the Rate function of each. Rate returns a float, and whichever subclass returned the highest value get's a function called in it, which does the same thing as this just did. (only, of course, iterating though that subclasses subclass list instead of the base classes list.)

: Rate is a simple static function that gets overridden in each class. It takes a struct as input, (for extensibility) which contains a considerable amount of statistical information about the ship in question. (Firepower, armor, manueverability, mass, resource processing capabilities, sensor range, resource storage abilities, etc.) The rate function just has to return some floating point value to indicate how closely the vehicle matches this particular subclass. For instance, let's say the ship in question was a superiority fighter. The process might go something like this:

: The Base Class calls Rate in C_StrikeCraft, C_Capital, and C_Station. The vehicle has a relatively low mass, so C_StrikeCraft returns a high value. C_Station returns high if the vehicle passed to it is nearly immobile, which is not the case, so it returns a low value. C_Capital is looking for high mass, so returns a low value.

: C_StrikeCraft now iterates through it's list: C_Fighter, C_Gunship, C_Transport. The fighter has no turrets, and a relatively high manueverability compared to it's weapons, so C_Gunship returns a low value. The fighter doesn't have much storage, but it has a fair bit of fuel and energy considering it's size, so C_Transport returns a moderate value. The fighter is very agile, however, so C_Fighter returns a high value.

: C_Fighter now iterates through it's list: C_SuperiorityFighter, C_Bomber, C_Interceptor. C_Interceptor likes manueverable craft with lots of weapons, but weapons take priority. Since the fighter in question is more manueverable than it is heavily armed, C_Interceptor returns a moderately high value. C_Bomber heavily favors weapons over manueverability. Because it wants LOTS of firepower, and the fighter only has a moderate amount, it returns a relatively low value. The high manueverability helps the rating from C_Bomber, but not by alot. C_SuperiorityFighter focuses mainly on manueverability. The more manueverable/faster the vehicle in question is, the higher the rating from C_SuperiorityFighter. C_SuperiorityFighter also gives points for weapons, but not as much as C_Interceptor. C_SuperiorityFighter returns a high value because the vehicle is question has lots of manueverability.

: At this point, C_SuperiorityFighter would go through it's subclasses, if it had any, which it doesn't. So instead it just returns itself back up the chain to give the eventual result.

: That was a bit of an example, but I was having difficulty putting it into words. One advantage of this system is it's easily extendable, and it's heirarchial nature allows for &quot;IsA&quot;-like calls. For instance, if a hostile ship was approaching a transport of some kind, it might do something like:

&lt;uscript&gt;
if ( IsVehicleClass( Incoming, class'C_Fighter' ) )
{
  // We can't outrun it. Is it harmless?
  if ( !IsVehicleClass( Incoming, class'C_Transport' ) )
  {
    // We won't be able to outrun a fighter or a gunship. Best
    // to head for the nearest friendly units and call for
    // backup.
  }
} else ( IsVehicleClass( Incoming, class'C_Capital' ) )
{
  // We can outrun it. Fly directly away from Incoming.
}
&lt;/uscript&gt;

: In this way it doesn't need to check through the myriad of types, and doesn't need to bother with whether an incoming fighter is a superiority fighter, a bomber, or an interceptor. Similarly, if it's a capital ship, it's a fairly safe bet we can get away. There's no sense bothing which what class of capital ship it is, or whether it's armed with anti-fighter or anti-capital ship weaponry, etcetera.

: Another big advantage is it allows you to approximate the role of any ship. Since a player can design a ship in any style and with any combination of armament, etc. they please, the AI needs some way to know what's dangerous to it, what it's dangerous to, etcetera. This way, the AI can transparently pick targets intelligently. Superiority fighters will engage enemy fighters, interceptors will engage bombers, and bombers will engage capital ships, without the user having to specify to the ship or AI what sort of ship it's piloting and what it should do with it.

: I had this idea sitting around for a while, but I was getting kind of annoyed when the interceptors I built almost always went straight for the enemy carrier, ignoring enemy bombers launching from the enemy carrier.

{{classbox| January 18th, 2004}}
: It took a while to get the idea I implemented yesterday nicely balanced. The specific problem being, having particularly heavily armed interceptors being mistaken for bombers, due to their sheer amount of firepower. However, these interceptors also had very powerful engines and thus should act like interceptors. I eventually realized that I could figure out what's a bomber and what's just an all-around powerful ship by finding ships with a large amount of firepower relative to their manueverability. This works well, because if a bomber is so manueverable it can fly like an interceptor, there's no reason why it shouldn't do so - and if an interceptor is so clumsy it looks like a bomber, it makes sense to keep away from overly acrobatic movements.

: I also uncovered an interesting balance issue. If a ship is armed with missile/bomb/torpedo/rocket launchers, there is a variety of warheads that can go on any given bomb or missile or rocket or torpedo.  For instance, you could arm your macro missiles with fusion warheads to get a blast effect, or you could cap your dumbfire bombs with plasma warheads to get extra punch against capital ships. The balance issue that I've noticed is that the plasma warheads are a lot more useful than the fusion warheads. Fusion warheads have a blast effect, in theory making them useful against fighter craft. However, it can sometimes take several hits to destroy a fighter with fusion warheads. I had expected that plasma warheads would not be very useful against fighters since they have no blast effect and therefore would probrably only knock off a fin or a gun. However, I found while playing around that macro missiles armed with plasma warheads are actually very effective if you target the enemy fighters cockpit or midsection.

: So, I have a couple of options: I can make the fusion warheads have a bigger blast, to make them more effective. Alternatively, I can pump up the damage on fusion warheads to bring them closer to the damage plasma warheads do. I don't really like either of these options. The reason is really in the scaling. Dumbfire bombs are a very large warhead. They make a big blast with fusion warheads, probrably enough to take out several adjacent fighters. (though hitting a fighter with an unguided, unpropelled bomb is next to impossible) The macro missile packs about a tenth the warhead size. It's blast is thus very small. If I bring up the blast size of the fusion warheads, then the dumbfire bombs will have an absolutely huge blast radius with fusion warheads, which will cause a considerable slowdown with the particle effect used for the explosion. If I bring up the damage of the fusion warheads, I risk unbalancing them with the other weapons.

: Maybe what I need to do is &quot;dumb down&quot; the macro missiles themselves. Right now they track very intelligently, even going so far as to turn around and make another &quot;attack run&quot; if the target evades them on the first pass. If I make them explode when they are detected to overshoot the target, this might make the fusion warheads more attractive.

===Technically it's the 19th..===
: I set up the missiles to explode once they detected that they've overshot. They have some leeway, however, basically, once they are close enough to the target that they predict an impact within a second, the warheads are &quot;armed&quot; and will go off either on impact or if the missiles are both headed away from the target and are more than a seconds travel away - clearly overshot. This change worked quite well. The fusion warheads are now definately better versus fighters, (plus the wanton explosions and such is much cooler than the &quot;precision strike&quot; of the plasma warheads) and the plasma warheads are better versus capital ships.

I realized what was causing the funny scrolling with the 2D backdrop. Unfortunately, I'm still scratching my head trying to figure out how to fix it. I had hacked it into a TexOscillator, but I just realized today that the movement of a TexOscillator is sinusodial, not linear. I need to find a way to compensate for that by adjusting the phase appropriately to counter the sinusodial effect.

{{classbox| January 20th, 2004}}
: My backdrop system got a new leash on life when I finally figured out how to get it to pan 100%. Then I realized something else. I need to somehow &quot;warp&quot; the texture as it gets farther away from the center. As it stands right now it works really good at tighter FOVs, but when the FOV gets too large it starts to look funny. I wasn't sure what it was, until I tried going back to using a skybox for a while, and then it hit me. Figuratively speaking. The texture needs to &quot;stretch out&quot; as it approaches the edge of the screen. Unfortunately, I'm not sure how I can go about doing that from within Unrealscript. That may spell the end of the backdrop system in it's current form. However, I may be able to cook something up yet.

: Also, I think I need to make another type of AI, essentially a &quot;commander&quot; AI to decide what ships the AI pilots should build. For the time being it's random, but it would be nice if there was an AI &quot;commander&quot; that would decide what sorts of ships were needed and dispatch appropriately.

: Also, I think I need a way to &quot;rearm&quot; after launching from your carrier. It doesn't take long for the bombers to run out of bombs, and missile launchers eventually run out of missiles. I may change the way the carriers work a bit to facilitate this. For the time being, you spawn inside the carrier and it launches you out like a cannon. (like the &quot;catapults&quot; on modern aircraft carriers) For now, if you try to fly back into the carrier, it just launches you back out. I may change this and make it possible to fly back in and land back on the carrier, at which point it would resupply you, refill your fuel and energy, and possibly repair damage. That way seems fraught with complications, like someone spawning and getting launched out of the carrier as you are trying to fly back in. Not only will both ships pulverize each other, but they'll leave a debris field inside the carrier, so when both players respawn they'll probrably get blown up from all the debris, and make a big loop. Which would be bad.

: So, what I'm probrably going to have to do, is have a volume around the carrier's hangar, and if there's any friendly ships in the volume, no ships will launch. Ideally I would have a big hangar with little stalls you could land in and stuff, but I think that if I scale up the capital ships to the level that that would require, I'll probrably run out of map space. Plus, that would call for some sort of forcefield airlock thingy, which I don't really want to have at this point, but maybe I'll change my mind.

: Also, I found out what was up with the scale in Homeworld. While texturing up some of the components I looked at some other Homeworld ships and realized something. A &quot;fighter&quot; in homeworld is about the size of a small capital ship by most science fiction standards. I couldn't even find the cockpit on the Kushan bomber at first, then I noticed a little square about a hundredth the size of the ship, which is apparently the cockpit. The cockpit I've been using for testing was pulled off a Taiidan Interceptor, and when I went to texture it I found that apparently the part that looks kind of like a big glass hatch when untextured, is actually like a whole control room. I tried to texture it a bit different to make it not look so wierd as one big window, but it ended up looking like some kind of robot drone or insect cockpit. However, the retexturing made some things look a lot better. Also, the way the Unreal Engine likes to anti-alias stuff makes the textures from Homeworld look kind of crappy. A lot of those textures use squarish shapes that look fine when stretched, but when they get antialiased they start looking like what they are - a 16-pixel wide texture that's been blown up to a humongous scale.

{{classbox| January 24th, 2004}}
: Wow. Talk about a blast from the past. I found a hard drive while cleaning up a while ago, a Quantum Fireball 270 MB drive to be precise. The date on it says July 94, and it has MS-DOS 6 with Windows 3.1 installed. Computers have sure come a long way in the past ten years...

: Having said that, I haven't been doing much coding the last couple of days. Instead, I've been playing games. Specifically, space shooters. The aim being, I don't want to lose sight of what I'm aiming for. Even more specifically, I don't want to pack in a bunch of realism and end up with a game like Orbiter. (Not that I've played Orbiter, I'm making a guess that it wouldn't be very entertaining.) Unfortunately, I was a bit stumped when I realized that there wasn't any recent space shooters that I knew of. The exception being Freelancer of course, but that one basically feels like a stat-building hack-n-slash - basically, Diablo II in space. Granted, Diablo II IS pretty popular, so maybe that's not so bad, but it's not really what I'm aiming for. 

: Strangely, reviews and screenshots of Freelancer look crappier than I remember watching over the shoulder of people in the senior computer lab at university. In a way this is good, and in a way it's bad. It's good because it means that the level of graphics that I thought that Freelancer had was just my imagination, so now I don't need to compare my game to a seemingly unattainable vision. It's bad though, because I want my game to look like what I thought Freelancer looked like.

: So I found a copy of Freespace 2, which is kinda old, but I don't know what's newer as far as popular space shooters go. Even so, I don't think that gameplay has really advanced that much, though the graphics are a bit dated. Anyways, I started playing, with the intent of getting some inspiration of how to make my mod better. The first thing I noticed was, &quot;this game has way too many bloody controls.&quot; Plus it didn't support my mouse wheel. So, I busted out the old Thrustmaster Tacticalboard and mapped some keys. Then I started thinking, &quot;maybe I need some more keys.&quot;

: Right now, there is hardly any for my mod. The control system is a bit more configurable than most games to support the possibility of any ship design. Basically, you've got &quot;actions,&quot; which can be defined and mapped onto stuff that happens. (IE, you could create an action &quot;Start Firing&quot; and map it onto all of your weapons so they all fire when the &quot;Start Firing&quot; action is performed. Then, you map keys to your actions. This way, you can have an arbitrary number of actions and assign them however you like. For instance, you might set a weapon to use &quot;Fire Guns&quot; while another weapon uses &quot;Fire Missiles.&quot; Then, the keys can be mapped differently. And, if you later want to change your key configuration, you only have to reassign keys to your actions, instead of having to reconfigure all of your ships. So far, on all the ships I've made, I have all the weapons on one key, while theres a few keys to fire engines: right click to go to full throttle, release right click to go to 0 throttle, mousewheel up or down to modify throttle. The up key also applies full throttle, and the down key applies full reverse throttle. (IE retros)

: For now, this system has worked well - the ships have only really had one weapon system. However, I can see where having different &quot;banks&quot; of weapons can add to the fun. That brings me to my next point. I think I need missile locks. Right now, the missiles are smart enough that they will automatically home on your selected target. It was kind of fun getting a missile lock for the &quot;aspect&quot; missiles in Freespace 2. So I think I need something like that.

: Also, a big one, I need either weaker weapons, shields of some kind, or tougher ships. I don't want to remove the locational damage stuff that I have now, but I do want to make the fighters a little tougher initially. Reason being, the ships start to fall apart once they lose pretty much anything. They don't really have much that they can &quot;afford&quot; to lose. I kind of liked having shields and a central &quot;hull integrity&quot; - this way you can take some damage and &quot;be in trouble&quot; without being totally helpless, whereas on my mod 50% hull integrity basically amounts to 50% of your equipment missing - and you can't do much without an engine. It kind of adds a &quot;desparation&quot; or &quot;last ditch effort&quot; kind of an aspect, which I liked. Unfortunately, shields don't fit in very well with the atmosphere I wanted to have, but maybe I'll just up the hitpoints of some of the smaller components a bit, and see how it goes. That's the only place there's really a problem: your cockpit and major structural pieces can take something of a beating, but smaller (yet essential) things like fins will get torn off the minute they take any serious fire.

: Also, the ships in Freespace 2 carry an unrealistic amount of ordnance, but it doesn't really detract from the gameplay. In fact, I think it's good. It retains the feel of limited ammo without forcing you to be a miser.

: Anyways, that's all for now, except I looked at the tracefire weapon code and updated it a bit. Interestingly, it almost feels harder to hit people with tracefire weapons than it did with projectile weapons, but maybe that's just a consequence of decreased volume of fire. I'm curious if maybe it's actually the slight &quot;thickness&quot; of projectiles that makes them easier to hit with, but I'm not sure if that's the case or if it's something else. Maybe I'm just so used to leading the target that I'm having trouble with the tracefire weapons. Or something.

{{classbox| January 25th, 2004}}
: Yikes! The issue with the engine not drawing things more than about 60,000 units away has come back at me. I had it fixed more or less by having &quot;stand-ins&quot; to make an accurate semblance of what was going on at great distance. This sytem actually worked surprisingly well. However, I've encountered a new problem: beam weapons and such ALSO get clipped at 60,000 units. Which means that there's a gap between where the beam appears to originate, and the place where the beam first begins to be drawn.

: In theory, I could probrably have the visual effects for the beams find the appropriate place on the stand-in and appear to come from there - but I'm not sure how well that would work. The simple reason being that stuff that's really far away is drawn in the skybox. That makes it a bit more complicated to have the two appear to &quot;line up.&quot;

: Also, the lighting is imperfect on the stand-in system, but there's not much I can do about that. It would be nice if I could disable the automatic clipping at 60,000(ish) UUs, however.

: Unfortunately, since that's not an option, I'll have to figure something else out. I'm not yet sure what exactly to do about it. Eventually I may break down and use some scheme to determine the on-screen location of the start of the beam (theoretically) and then manipulate the beam to make it appear to come from that location. That's a less-than-ideal solution, since it would require a fair bit of processing overhead, however.

{{classbox| January 26th, 2003}}
: Most of today's coding efforts was just doing research on assorted things. I had some interesting findings. In my search for more speed for my mod, I considered if static arrays might be faster than dynamic arrays. So, I set up a bunch of loops to test assignment, creation and deletion of elements in a dynamic array, etc. I had some interesting findings:
* The times fluctuated considerably on different runs, even with 2048 iterations. (max size for a static array)
* There were, however, clear trends. Interestingly enough, dynamic arrays were fairly consistently faster. This is contrary to what I had anticipated.
* The values assigned to the arrays does not seem to matter. This suggests there was no caching magic going on as performance was comparable with random numbers as well as with fixed ones. (Except for slight overhead for the FRand() call, but this was the same difference on both static and dynamic arrays)
* Dynamic arrays can add elements faster in a batch than alone. IE, if you have to add 10 elements, increasing the length by 10 is better than increasing the length by one 10 times. However, this difference was relatively small.
* Strangely enough, assignment and creation combined (IE, assigning a value to a nonexistant index) was faster than either! In fact, assigning 2048 individual elements (to non-existant elements) was faster than just setting the arrays length to 2048! This implies to me that perhaps initialization is a relatively expensive operation, though this seems strange.
* The differences in times were obvious, but generally almost insignificant. The vast, vast majority of the time elapsed during the tests was overhead from the loops. Unfortunately, overhead from the loops was difficult to measure because it fluctuated wildly. However, the for loop appeared to consume about 80% of the elapsed time. (measured by executing an empty for loop 2048 times)

{{classbox| January 28th, 2004}}
: While poking around in my UT folder I found some parts of the humble beginnings of my mod. I was hoping that there was enough preserved to post some &quot;1st generation&quot; screenshots, but it was not to be. Going over the code I'm amazed not only at how far it's come, but also at how developed it was. The script for it was about a third of what I have now. However, I didn't really have any AI, except for crude turret AI. It was still pretty neat though. One interesting thing (which is not in the current version) was the ability to super-customize all your weapons and such, like in ''Freedom Force'', if any of you have played it.

{{classbox| January 31, 2004}}
: Unfortunately I've been really busy with school lately so I haven't been doing much modding. I've considering changing the scale a bit though. Not changing the scale as in literally changing the drawscales of stuff, but changing the focus from fighters to small capital ships. I'm not sure about that though. On the one hand, even with a large number of players the number of fighter present may seem unrealistically small. One would think in a real fleet engagement there would be dozens upon dozens of fighter craft. This isn't really possible of course, due to a lack of players and a lack of processing power for that many AIs. If each player had a frigate-sized capital ship, that would make for a more realistic fleet engagement. However, I don't know if that would be a good move: space combat wouldn't really be the same without fighters. Also, the style of combat between capital ships would likely be very different than that of fighters. It wouldn't necessarily be a &quot;slugfest&quot; as Star Trek games generally don't have much in the way of fighter combat but still turn out okay. Still, it's not really what I was aiming for, so I'll just have to think about it some more and see what I come up with.

{{classbox| February 3, 2004}}
: Man, the word February looks really wierd when you write it. Anyways, I noticed that my previous &quot;fix&quot; for the beams, of forcing them to less than 60,000 UUs length, did nothing to fix the problem. It seemed logical at first, but then I realized, no matter how show the beam is, if you are more than 60,000 units from it's start but not from it's end, or vice versa, the beam is going to appear broken.

: So, I've started considering shrinking everything. If I just scale everything down so the entire space area is only 60,000 units across, that would more or less fix the problem for good. However, there's an inherent problem with that: if I want to scale down everything in space, I'm gonna have to scale down the pawns so they can still fit inside the ships and stations and such. I'm not sure how well that will work, however, since I'll probrably have to scale the world down a lot, and the people will probrably end up being about 2 UUs tall. The problem with that being, I don't know how well it will work with the physics and such. Presently there's an &quot;uber-leet&quot; physics system on the pawns that allows them to walk on any surface within a certain number of degrees perpendicular to the direction of gravity. IE, your feet have to be facing the direction gravity would be pulling you. This is nifty because it allows you to walk on the decks of your ship, regardless of the direction your ship is actually facing. I'm not sure how well that sort of system would bode with super-small pawns. I guess I'll have to bite the bullet and try it out...

{{classbox| February 4th, 2004}}
: No dice on making stuff smaller. That played havoc with the Karma, greatly amplifying the constraint bug I've been having. It appears that that bug must be caused by a loss of precision in floating point somewhere, possibly resulting in division by zero or some other such hazard. Of course, such speculation doesn't help much since I can't modify the source anyway.

: Speaking of which, I've been inserting tons of hacks into my code to try to get stuff to appear properly. Specifically, the beam effects. I hate having to work around the engine limit so much - it's turning into a real pain. Unfortunately, I can't even cleanly encapsulate them in many cases because of specialized behaviour of some pieces. For instance, the firecontroller of a weapon (something like the WeaponFire actors in UT2003) never actually moves, so effects can't be spawned out of it, but instead need to get spawned out of wherever the weapon is. However, the code in the superclass for generating special effects goes by the location. Now, this was easy enough to work around, by simply having the function overridden, convert the coordinates appropriately, and feed them into the superclasses function. Unfortunately, I can't do that with trying to work around the distance because now I require not only locational adjustments, but also scaling adjustment. Hence, I now have two nearly duplicate functions, which is not very good programming style. Of course, the perfect place to encapsulate this stuff would be in the renderer, but I can't access it unfortunately. Even better would be if Epic hadn't instituted an arbitrary limit on the distance. The bit of cruel irony is that there's a cull distance variable that does the exact same thing, but it doesn't get used in any of the stock code. (instead preferring the hard-coded limit :rolleyes:) It would have been a piece of cake to set the default culldistance of actor to 60000 or so, and then just use that culling functionality.

{{classbox| February 5th, 2004}}
: I'm still dearly hoping that Mosquito is right and that the 60,000 UU limit on the renderer has been removed. That's one of two nagging problems that I haven't been able to fix - until now, anyway.

: Today I think I've sealed the fate of the second problem, the &quot;karma constraint explosion&quot; problem. Originally I had planned to basically have the server fake replication to itself, so if the main version failed, it could revert to the &quot;replicated&quot; version (which doesn't use karma, but instead uses a nifty movement extrapolation system to predict where it should be on the server given ping and such.)

: Anyways, that solution wasn't working that good. Reason being, the ship get's &quot;tippy&quot; shortly before &quot;exploding.&quot; The tippiness doesn't set off the &quot;explosion&quot; detection, and so the tippiness is recorded as normal behaviour and sent off to clients. This is a problem. However, today I found something that appears to have sharply reduced the incidence of constraint explosion.

: You can have fins/wings on your ship which help you to manuever. It's not all that realistic, since there's no atmosphere and all, but fins and wings look cool and if they didn't do anything, I doubt many people would use them. Anyways, they have a semi-sophisticated system to detect how they should apply &quot;rudder&quot; in order to rotate the ship to the desired facing. The greater your velocity, the stronger the fins become. Also, if you are travelling fast in a straight-ish line, they stabilize the craft, making it easier to line up shots.

: Turns out that something in their code is putting an insane stress on the mathematics inside the Karma engine. I don't know whether it's the stabilization or the rotation part, but commenting out all the fin code appeared to have more-or-less stopped the constraint explosion dead in it's tracks.

: Interestingly, I sort of thought the fins might be responsible all along - like a voice in my head saying &quot;maybe it's the fins. They get more powerful at speed, and so does the constraint problem. Maybe there's a connection.&quot; Unfortunately, for a long time I ignored that voice, dismissing the notion as absurd.

: So anyways, now I'm going to dissect the fin code and see if I can find out what's causing all the mayhem. I'm also going to continue hoping that the 60,000 UU limit will be fixed in UT2004, or some future version of the engine at any rate. That would save me a lot of script execution time and improve visuals at the same time.

: New screenshots ARE coming, they're &quot;simmering&quot; on my screensaver while I decide which ones are the best. I'm also hoping to have something &quot;new&quot; to show off before I post new screenshots - most of the improvements since the last batch of screenshots have just been coding improvements that aren't really reflected in the visuals.

{{classbox| February 12th, 2004}}
: I played the UT2004 demo, and had mixed feelings about it. Some things were neat: specifically I liked some of the emitter effects and such. I also liked the matinee movie at the beginning of the assault map.

: I don't like the new sniper rifle. It should have been named, the &quot;slower than death&quot; rifle. I haven't tried any of the space vehicles, but I didn't really like the ground-based vehicle combat that much. Reasons being, they're way too flimsy, the tank feels floaty, and the vehicle combat just feels like a run-of-the-mill tank combat game. Though in theory this is what it should be, since they are tanks and such, it doesn't really have a FPS feel to it. Also, the terrain is appparently just for looks, since basically all the vehicles can go over pretty much any obstacle and can shoot far enough and fast enough that range is almost a non-issue.

: They also changed a lot of the weapon meshes, though I can't figure out why. Some of the new ones I think look markedly uglier than their predecessors. (Shock rifle and assault rifle in particular)

: Supposedly there was going to be a new UI in UT2004, but I had sort of expected that meant a different type of UI, not the same UI with different graphics and buttons in different places. The AI has also supposedly been improved, but when I played the Assault level the AI just sat in minigun turrets (which are lousy) while me and my team walked right through and hit all of the objectives. At one point I had to hit F1 just to make sure I hadn't accidentally forgot to put bots on the blue team! When they were attacking I saw them, and they zig-zag relentlessly - good from an avoiding incoming fire perspective, but kind of annoying. Reminds me of counterstrike &quot;bunny hopping.&quot;

: Unfortunately, the whole thing seems more sports-game like than UT2003, which was a complaint many people seem to have had about UT2003 itself. Onslaught is kind of fun, but it's basically just the game Battlezone/Battlezone II with a bunch of the cool stuff removed.

: Anyways, having said all that - I got the fins taken apart so the &quot;constraint explosion&quot; seems to be more or less fixed. The only problem is, without the manuevring assistance of the fins, the ships are a bit &quot;wobbly.&quot; That is, they overshoot their desired rotation when turning, and then they have to turn back, and so on, which makes it a bit tricky to line up your shots. I'm looking for a solution to this problem, but unfortunately the ideal solution is probrably not a practical one.

{{classbox| February 14th, 2004}}
: I made a nifty &quot;spectator cam&quot; for spectators, which should help in making a movie of a game-in-progress. It's a bit jittery, but I'll put in some smoothing later. What's important is I noticed a couple quirky things. The ships wobble a bit - this is due to the new physics for the jets, which are necessary. I'm still trying to iron out the wobbling though, especially since it makes the bots have terrible aim.

: Also, the fighters are now getting into &quot;turning contests&quot; and trying to circle strafe each other, which is not the behaviour I was hoping for. The reason for this appears to be that two fighters attacking each other pass at moderate distance, sufficiently far apart that they both believe that they are far enough away to continue their attack run without getting into this sort of turning contest. I can increase the &quot;break off distance&quot; for the attack runs, but I'd rather cook up a scheme to detect this circle strafing behaviour. I've been working at that, but so far it doesn't seem to work. (sometimes it does, but other times it doesn't...)

{{classbox| February 17th, 2004}}
: Hmm. I could have sworn I wrote an update yesterday. Oh well. I got the ships to cease wobbling. However, this creates kind of a funny feeling, but I guess it's not too bad. Basically, the stabilizers come on strong when you overshoot your intended rotation, with a gentle activation while returning to the desired rotation. This creates a fairly smoothe rotation, but the smoothe rotation gets a bit sharper when you reach the desired rotation. However, this satisfies both conditions required for good controls: it's smoothe when making large turns, without being sluggish when making precise aiming.

: I also noticed a bit of a bug that was preventing the &quot;bot cheating&quot; auto-aiming from working. The new spectator camera allows me to track the action much more efficiently and I noticed that the biggest problem with the bots is that they face off at rather long ranges. This is only natural in space, of course, but it makes projectile weapons, with the exception of rediculously fast projectiles, very difficult to hit with. The lead is easy to calculate for any speed of projectile, but the target will often change heading, even if only slightly, during the flight of the projectile, and this makes it very difficult for the fighters to hit each other, except with very fast projectiles.

: 
I'm not sure what to do about this. The problem isn't so much the speed of the projectiles as it is the distance between fighters when they dogfight. (the time the projectile spends in transit, specifically, is the problem.) I have a couple of potential solutions:
; Make the projectiles faster: I've tried this but I don't really like it. In order to be effective, the projectiles have to go so fast that you can barely see them in flight. This is not what I want.
; Make the ships slower, and reduce projectile range to force ships to fight at closer ranges: I don't really like this one because it involves making the fighters slower. This actually seems to be the norm in space games. For instance, the fastest fighters in Homeworld only travelled at about 150 km/h. (My own guesstimate based on realistic ship size and space travelled relative to ship length) To be completely accurate, they actually went a lot faster, but were just rediculously huge and styled funny. (a Taiidan Interceptor appears to be roughly the size of a Defiant-class warship from Star Trek.) Anyways, if we imagine the Homeworld fighters were actually like single-seater fighters, they'd only be going about 150 km/h - kind of slow for a space craft. Freespace 2 also has pretty slow ships. The fastest ones only go about 100 metres per second, which is only a few hundred kilometers an hour. I want mine to go fast, like a few thousand kiometers an hour. However, such high speeds necessitate combat at long ranges.
; Relegate Projectile Weapons to a supporting role, use trace-fire weapons for most things: I don't really like this one, although it is admittedly realistic. The smallest weapon a space fighter is likely to carry would be a 20mm anti-materiel machine gun, the bullets (if you want to call them that, more like a steak knife if you ask me) go really, really fast. So fast they can punch through both sides of an APC from several miles away - and that's including wind resistance, which has a MASSIVE effect on the speed of a projectile. Point being - 

modern projectile weapons go really really fast. However, science fiction space craft projectiles typically do not go all that fast, which is probrably for looks more than anything, but still. Looks are important.
; Leave it as-is and have the effectiveness of projectile weapons largely determined by how well you can predict when the opponent is going to fly straight and when they're going to turn: This is, on the surface, an ideal solution. However, this sort of prediction is bound to be very difficult for an AI pilot to do. Whether or not a human player is going to turn away or fly straight is, of course, impossible to predict with complete accuracy, though it could be predicted somewhat, there are so many variables that would impractical to figure out, like volume of fire the target is taking, both from the AI in question and others, the targets capabilities, condition (damage wise), presence of friendlies, etc. I don't think that an AI pilot could handle this well without doing a lot of computation.


: I '''do''' want combat to occur at closer ranges, but I don't want to slow down the ships. Also, there is a considerable difference in speed between different designs, which would make it hard to simply enforce close-in fighting by reducing ranges. One can't really argue the light and manueverable versus slow heavy-hitter argument, since some ships are just plain better equipped. (One design I made has twin engines, 6 fuel tanks, two heavy cannons, two machineguns, and an on-board fusion reactor, but is considerably faster than a lightly equipped superiority fighter I made that has only a single engine and fuel tank, two missile bays and a machinegun. (The more stuff you have, the more points an enemy gets for destroying you - it's kind of a diminishing returns thing since bigger ships are bigger targets.))

====As if that weren't enough! (Later that day)====
: I think I need new music for the level I've made to test stuff in. The current music was okay, but it doesn't seem to fit anymore. Unfortunately, UT2003 came with a relatively inappropriate soundtrack for space-based conflicts. Hard rock seems most appropriate, but this might be better suited to the spectator-cam view. For the spectators it's all about the action, which I why I think that something like that would be best for a spectator's view. However, for the players I'd like something that caters more to the tension of a heated dogfight. Alternatively, I could go for more of a &quot;space ambience&quot; soundtrack with basically just assorted creaks and rattles and beeps and such - various space-craft noises to serve as the background for the sound effects from actual stuff happening.

: I guess that'll have to wait until I get an actual team together, but I'm going to wait at least until UT2004 comes out before doing that. (I want to see if the 60,000 UU render distance actually has been removed, as Mosquito suggested. Preliminary tests with the Runtime suggest it may well have been, but I can't say that with complete certainty yet.)

{{classbox| February 18th, 2004}}
: I could have sworn I updated earlier. Oh well. Today I've been just playing around with the UI, making it a bit fancier. I added detail level options to the GUI as well. Basically boring stuff. I also swapped all the weapons to fusion cannons to test to see ifthe projectile thing I suspected above was the case. The bots have no difficulty fighting with instant-hit weapons. (They better not, they have the advantage of auto-aim! :P) So the problem is fairly isolated to incorrect determination of lead - I'm fairly certain that this is a result of the target changing heading, as detailed above.

: Also I want to do some optimization but I don't know what needs optimization. I haven't written any new processor-intensive code since the last update, in fact I've optimized the resource distribution system even more! Even so, I can only get about 8 players at one time now before the framerate suffers, whilst before I could have twelve. Granted, I have pretty trails now which are relatively expensive effects to generate. Unfortunately, I don't know of any practical way to find out where all the time is being spent. Once again I wish Epic would profide some sort of &quot;execution profiler&quot; that would count and time every function call (should be simple if you had access to the interpreter) so you could see which function calls were eating all the CPU time.

Also, I desperately need a &quot;sloppy clipping&quot; option for Emitters. I can make some killer particle effects, but they use so much GPU time being clipped to fit around polygons whenever a ship passes through them, it causes an unacceptable GPU hit. If there was a way to do &quot;sloppy clipping&quot; where a &quot;sloppy&quot; sprite would either be behind or in front of a given triangle (or even entire meshes), but wouldn't be drawn intersecting, that would allow me to make way nicer effects with less GPU usage.

{{classbox| February 21st, 2004}}
: I meant to write this up last night, but once I got in front of this computer last night I couldn't remember what I was going to write. I remember now, though, so now I'm writing it!

: Anyways: I kept hearing about this game Call of Duty so I decided to give it a shot. (This was about a week ago) It was pretty fun, which is saying alot, since I generally don't like world war II games. Later I played Red Orchestra for UT2003, and I remembered what I could from TTR for UT a long time ago when I tried that.

: I didn't like Red Orchestra or TTR. This got me thinking. Thinking that, since generally I don't like WWII games, if I liked Call of Duty, it must have something special about it. If I could figure out what it was that made it so good, I could likely make my mod that much better.

: The graphics weren't much to write home about: they were decent, but not excellent. If I had to rate them I'd say they are slightly behind the Unreal engine's graphics capabilities. So I knew it wasn't the graphics. I was playing on my mom's computer, and someone had been screwing with the sound settings, and I wasn't in the mood to fix it, so I was playing without sound. So it wasn't the sound or the music. (if there is music)

: I'm not a fan of WWII games in general, so I knew it wasn't the theme. The FG42 was cool looking, but other than that I didn't care for the weapons especially. So, still looking for the reason I liked it, I was thinking, it just feels so realistic! Now, TTR and Red Orchestra both appear to have a &quot;realism&quot; element to them too, so what's the difference? Well, the difference appears to be that Call of Duty has realism, while TTR and Red Orchestra had &quot;realism.&quot;

: What is the difference, one might ask? Well, both have deadly, instant-hit weapons. Both have reloading and authentic weapons and iron sights. (Actually I don't know if TTR had iron sights or not) Both seemed to have reasonably authentic levels and such. However, what Call of Duty had that Red Orchestra/TTR did not, is a realistic AI.

: This goes for pretty well all &quot;realism mods&quot; I've seen on the Unreal Engine. I don't really remember if TTR even had bots, but I know Red Orchestra did. Tactical Ops did. Infiltration did too. (But I think they tweaked the bots, so I won't count them.) I'm sure there's others. The problem with the AI in those mods is it's just the standard Unreal AI - good for arena-style combat with mysteriously weak weapons and such, but the Unreal AI is hardly realistic, which is why I think it makes &quot;realism&quot; mods feel unrealistic. (No pun intended there)

: Most of these modders have probrably never been in a heated firefight, so maybe you can't blame them. Trust me, you don't zig zag back and forth firing madly. The only time you ever jump is if you have to get over someone else. As far as I'm concerned, realism mods don't need a jump button at all. Trust me. Jumping in a firefight is stupid. The only thing to do is hide behind something solid and take pot shots when you think nobodies looking. Sometimes you might sprint or crawl to a better piece of cover, but that's usually dangerous. More often than not, your boot gets caught on a branch, or the webbing on your tactical vest catches on barbed wire. Then you're a sitting duck, and you get hit.

: Anyways, this is exactly what the AI in Call of Duty does. They just cower behind stuff and take occasional pot shots. They barely ever hit. (It's quite possible to empty a magazine without hitting anything despite firing responsibly, because the enemy will almost always be behind dense cover, just like you are.)

: Another nice thing, AI related, is that they may not notice you based on various factors. Hiding behind bushes and stuff makes a difference, and muzzle flashes give you away. Other stuff that's going on also serves as a distraction and makes the AI less aware of your movements. (Or at least, it acts less aware of your movements) Also, whether or not the AI hits you is more a question of when, rather than if. The AI appears to start with a really innacurate aim, then &quot;bullet hose&quot; toward you from that initial aim. This I like better than the Unreal AIs straight &quot;chance to hit&quot; style of accuracy.

: Also I like that there's no classes or anything. Class selection in WWII games is annoying. I like the way that Call of Duty gives you several weapons, and you can just use whichever one you prefer. If you don't like it, there's plenty of other weapons laying around.

: Anyways, just thought I'd post that here. Hopefully some people will read it and maybe it'll help the AI for their mod be that much better. (Not sure of the technical issues associated with detecting whether a view of a player is obstructed by a terrain deco layer, but I'm sure you could find a way.

{{classbox| March 4th, 2004}}
: I haven't done anything with the mod in a couple of weeks, unfortunately. I've been busy with various things such as University and getting a new car and such. Also, I've been cooking up a scheme for pseudo-atomic bomb that wouldn't require any radioactive material or cause any fall-out. Very clean and relatively cheap to build. I've been pondering if that might make an efficient powertrain for an automobile or possibly an aircraft. (Hmm, fusion-powered rocket engine.. sounds dangerous :/)

: Something else I've come up with is an interesting concept for an operating system. As you may or may not be aware, there's a million and one things that operating systems do to prevent programs from messing with each other, control access to devices, etcetera. Also, they switch off control from one process to another every 10 milliseconds, including all of the overhead required to &quot;clean up&quot; the CPU for the next process while preserving the exact state of the CPU, to be restored when the previous process runs again. There's also memory relocation to make all programs believe they are the only thing executing in memory and various other things that I could only describe as &quot;hacks&quot; to attempt to work around the architecture. Many of these things have even been implemented in hardware to reduce the performance hit. Why that's bad is because they're hacky workarounds to begin with. What's really needed is a brand new multitasking architecture in which address translation, protection and such isn't an issue.

: One might say, but that's impossible! You can't prevent programs from messing with each other without using hardware to do it, unless you're going to precheck every instruction as it gets executed, which would slow down the system by an order of magnitude. But that would be thinking &quot;inside the box.&quot; Here's my scheme: you can check every instruction without much impact if by doing so you can reduce the total number of instructions. This can be accomplished rather easily since most things you would want to do do not require the granularity of straight machine code. So, the check (which is like two instructions anyway, what with a clever scheme I had) is amortized over a larger number of machine lanuage instructions. Since there's less overhead, (no context switches, address translation, etc.) I think it may end up actually being faster than present operating system architechtures.

: I got this idea when thinking about a number of things at the same time, mostly I was thinking about how Java is so ungodly slow, whilst Unrealscript is very fast, for an interpreted language. I'm fairly certain that the difference is that in Java, virtually every low-level structure and such is implemented in Java, which is unavoidably slower than C or assembler. In UnrealScript, all the low-level stuff is implemented natively, which is good, because it's almost always stuff you would never want to change anyway. (Such as concatenation of strings and stuff.)

: Anyways, basically a compiler's going to make something in-between bytecode and machine code. I was initially considering having an interpreted setup like unrealscript, but decided that that would be too slow - then you have to look up a bytecode for every instruction. However, you also can't have applications run at the machine level, because then you have to use a million and one hacks to prevent them from either inadvertandly or maliciously tying up a shared resource, damaging each other, running away with the processor, etc.

: So I figured you need a middle ground. Basically, machine language, but a machine language that doesn't provide the functionality required to do the above evil things.

: Anyways. There's probrably lots more I could say about that, but it's late, and I'm kind of tired of thinking about it for the time being. And there's one more thing I wanted to rant about:

: This was obviously going to have to be written largely in assembler. That's okay, since I've locked horns with machine code before. Though manually looking up opcodes in a reference manual and entering them into memory on a Commodore 64 is something I'd rather avoid doing again, I figured that since back then they had these things called &quot;assemblers,&quot; (I didn't have one) it would be a lot easier for me now that I could just download an assembler off the internet. These assemblers would allow you to enter the instructions one per line and it would convert it into opcodes and enter it into memory for you. You could even save programs and everything! Quite the marvel of technology. So anyways, I downloaded a few and was quite surprised to find that apparently assembly language had evolved into something else. Not the good kind of evolution (the kind I don't believe in anyway) where species supposedly evolve into other species. This is the kind of evolution where you live next to a nuclear plant and your firstborn has five arms.

: It was my understanding that assembly language was supposed to convert 1:1 to machine language opcodes. There wasn't supposed to be any functionality that wasn't availible at the machine level. So, to my surprise, I find not only structs being declared in machine language, but functions too! After a little bit of reading I find that this is called &quot;MASM&quot; and was made by Microsoft. Apparently, it's supposed to be a lot like programming in C. See, the thing about that is, if I wanted to program in something like C, I'd program in C. The real beauty of assembly language is that it is supposed to be exactly like the way the processor actually operates. So, the very first long word I reserve space for in a bootloader really does go at location 0 in memory. (presumably, anyway) By putting structs and functions in assembly language, you defeat the purpose of using assembly language.

: One might argue that that functionality is all optional, and you don't have to use it if you don't want to. That's fair, if you'd consider listing human blood on a drink menu (on the grounds that you don't have to order it if you don't want to) fair.

: So anyway, long story short, the chair of the computer science department of the University I go to wrote a software package that emulates a PC and some hardware, specifically intended for experimenting with operating systems concepts. I obtained a copy of it and I've been using the included assembler and linker. I'm assuming (hoping) that it's compatible with x86, though I'm fairly certain it would be. At the most I might need to change the names of a few opcodes, but that would likely only entail writing a simple disassembler that takes the compiled binaries and spits them out with x86 opcodes.

: On the upside, I've learned some interesting things about the way C programs look after compilation. For some reason I had suspected that when compiled all the function names would be different, or maybe even in many cases absent. However, they appear to translate literally to references that can be picked up in assembler using .extref.

{{classbox| March 12th, 2004}}
: I've still been super busy and haven't been able to do much with the mod. I've made a few small tweaks in the short time that I've had the opportunity to. I made the bombs self-propelled, so they're more like a slow-moving rocket, kind of like in Freespace. Previously they were basically a pure dive-bomb, requiring vehicle momentum to hit. Unfortunately, this seems to be a fairly difficult thing to guarantee for bots. Vehicle momentum still counts, of course, but the bombs are a little more predictable. I've also been considering changing salvoes of bombs (world war II style) for singular, more powerful bombs. (Like in Freespace.) That would be better for networking, and maybe would make the limited ammo on bombers a bit less limited.

: Speaking of limited ammo, I've noticed something interesting when observing botmatches. The bots run out of gas. This isn't normally a problem, since they're just sitting ducks then. The issue is, if I leave it for a long time, when I come back, all the bots will be out of gas and just hanging in space. I have a couple of potential fixes to this: I can make thrusters not use any fuel. I don't really like that idea too much - it removes any incentive to carry larger fuel tanks. I could make the thrusters more efficient, but the generators still consumes fuel, so I'd have to make them more efficient too. I don't really want to do that, because there again, it removes incentive to carry additional fuel. I could make the bots suicide when they run out of gas. I'm not sure how good of an idea that is. I could also do like in Homeworld, where if a ship is out of fuel, it can still move, albeit very slowly. My qualm with this is that it might require something of a hack. I'd have to either provide some stipulation in the firecontroller to accomodate that, or make engines generate fuel at a very slow rate.

====Later that day...====
: Aha! I got to thinking about the scale and the render distance and such, and then it hit me. The reason I couldn't just scale stuff down was because I was using the wrong factors. I didn't realize that reducing the ships to 1/10th their current size, requires the engine power, etc. to be reduced by a factor of a hundred, not by a factor of ten. (Ten times because the world is now a tenth the size, and ten times that because the ships are only a tenth of their previous size - so the ship requires a tenth the impulse to move at the same speed in UUs, but since everythings scaled down, it only should go at a tenth the speed it was going before.) This is good. It will make the world look better. Unfortunately, it's going to be a lot of work, because unless I just put something in the superclass of all my special effects, I have to update all the special effects. I don't want to put a hack in the superclass because that incurs a cost at runtime.

====It's STILL the 12th? Geez.====
: Got more of the scale stuff changed. I also found a wierd bug that only manifested itself when I reduces the scale. This is very queer, as the bug has apparently been there for some time without effect. Almost makes me wonder if there was some other bug cancelling out the effect of this bug, forcing it to lay dormant until now. Hmmm.

: Anyways, everything's scaled down, (except the lights and sounds, so the lighting is kind of washed out and you can hear things from a long way away) but I haven't decreased weapons range yet which had some interesting effects. Firstly, this is kind of bad, because you can &quot;snipe&quot; the enemy carrier from near your own. This isn't necessarily bad if you had some sort of long ranged weapons, but for the time being, any weapons will reach far beyond the enemy carrier. (Note to self: I have to reduce the projectile speed to accomodate the new scale.) Anyways, that's going to be changed when I update the ranges. The ranges on the carrier weapons may or may not be changed. I'm still deciding. After fixing the but mentioned above, the bots would fire again, which caused an interesting behaviour. The carriers shot at each other. This isn't in itself a bad thing, in fact it was more or less something I wanted to happen. Unfortunately, the AI is pretty good at crippling enemy capital ships. One carrier mauls the weapons on the other carrier, while the other carrier molests the inside of the first carrier's flight deck with it's beam weapons. Though effective, these things are kind of bad. Carrier two loses it's ability to defend itself from fighter attack, so there is less need for diversity to take down the carrier. Not that it matters, since your chance of making it out of the flight deck on carrier one are next to none.

: I'm not sure how to deal with this, I do want the carriers to shoot at each other somewhat, but not to the extent that they severely impact the fighter's combats. Potential solutions:
* Adjust the headings of the carriers so the flight deck of carrier one doesn't face carrier twos main weapons and also so that carrier ones guns can't easily hit anything important on carrier two. This also poses a slight balance issue as fighters launching from carrier one have a slightly more direct path to carrier two.
* Start the carriers out of range from each other, and have them close in. Premise being, by the time they're in range, the attacks will already be well underway, so carrier two will already be missing most of it's guns, and fighters will mostly be launched (barring those that are respawning) so carrier two can't bottleneck carrier one's fighter bays.
* Change the carriers. Or something. This is possibly the best option. Both are copyrighted material so I can't release anything with them in it anyway. Meaning, they're going to get removed anyway, so maybe I shouldn't worry about it. Of course, there's no guarantee that their replacement won't have similar problems.

{{classbox| March 14th, 2004}}
: That annoying &quot;constraint explosion&quot; was starting to creep back in, and I was kind of annoyed. The only way I could find to keep it in check was to smoothe everything out. The AI was bad for this, since it doesn't need to move a mouse or joystick and thus can make &quot;isntantaneous&quot; changes in it's desired heading. Anyways, the problem was cropping up when ships would get hit hard by capital ships. They'd go careening off, the stabilizers would go crazy trying to correct, and the resultant pressure put on the Karma engine by the stabilizers wrecked everything.

: Interestingly, it wasn't until today that I realized I could stop this behaviour by simply placing an upper limit on the maximum amount of stability assist that can be provided. Unfortunately, like the smoothing schemes I was using before, this is more or less only a stopgap measure - albeit an effective one. If you REALLY try to strain the Karma system, (setting level.timedilation to 10 does the trick) it's still possible to cause the constraint explosion. However, you can't really play at that kind of speed anyway, since unless you have an ungodly framrate you wouldn't really even be able to see stuff coming.

: I also changed the mouse control a little bit to make it more like first person space sims. Previously you could use mouse control which was sort of like Freelancer, and your ship would &quot;chase&quot; the cursor, or you could use joystick, where it was like a flight sim. I've changed the system so the mouse is more like a flight sim mouse setup. This is cleverly set up to mimic a joystick, so the mouse basically just fakes it, based on how fast the mouse is moving, and/or the time since the last mouse movement. So, if you move the mouse quickly, then stop, that's like jerking the joystick and then releasing it. The downside of course is if you want to make a big turn. However, I don't think that will be that big of an issue, since I have a trackball, and I don't think there's any better solution for the brick type of mouse anyway.

: One reason I made that change is so that the experience is similar using either. The other reason is that one had a bit of an unfair advantage. The joystick can only be moved so far, and has to be relative to your ship. For sensitivity reasons, you can't have extreme left be 180 degrees (behind the ship) otherwise you wouldn't be able to control very well. However, with the mouse, you could just scroll more, and thus could set your desired heading to any angle you wanted. This allowed for harder turns for mouse users. Unfortunately, it also means that the turning ability of a given craft will never be realized to it's full potential because the controls have been restricted. I'm not sure what to think about that. In a sense the ships aren't working to their potential. In another sense, limiting the amount you can turn makes the ships move a little more gracefully.</text>
    </revision>
    <revision>
      <id>3247</id>
      <timestamp>2003-11-27T16:50:53Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Removed overlap between archive and current journal.</comment>
      <text xml:space="preserve">{{classbox| August 2nd, 2003}}
: Most of the personell/boarding actions stuff is completed. The AI is a little lousy, but since I haven't finished the ships the bots lack any real direction. They just roam about, blowing the living crap out of anything unfriendly that gets in their way. I noticed that having dozens of karma ragdoll carcasses littered about had an effect on the framerate, but then again, my computer isn't that grand.. it doesn't even meet the &quot;minimum&quot; specs for UT2003. The combat patterns of the bots are also relatively predictable, but I believe this is a result of the shoestring path network I made. I was going to add a couple of gametypes for just the &quot;on foot&quot; stuff and try to get that polished up and working perfectly for phase 2 of the MSU contest. I may instead forge ahead and make the ships, but I am worried that I will not have them ready in time for phase 2, and I'd like a shot at some free money.

: On an unrelated note, my ability to make good textures for particle effects does not appear to exist. I may try to recruit someone to do this when the mod is more complete. For now I'll be satisfied with ugly bars for laser beams and abrupt squarish things for the &quot;coronas&quot; created by said lasers. Fortunately, the Kinetic Rifles look pretty decent, making fancy hollywood style plumes of debris and dust expelled from the walls/floor/etc. on impact. I'm somewhat disappointed that FPS' just use sparks for this. They've obviously never seen WWII movies. Impacts are supposed to cause a plume of dust, (in games and movies) darnit!!!

: An ironic note: A while ago I abolished and removed the &quot;actions&quot; system, preferring to use my &quot;inputs&quot; system for everything, since the two can be converted to each other fairly easily and inputs take less processing to generate initially. However, &quot;actions&quot; is definately more tangible to the AI, now that I've come to writing the AI with more complexity. Actions also replicate marginally better because sometimes &quot;inputs&quot; have no effect, while &quot;actions&quot; always do something.

: I almost forgot: I'm having difficulty deciding whether or not to use Karma for the ship physics. On the one hand, it will definately be better than whatever system I would use to replace it. That's the upside. The downside to Karma is that it drains resources if used with lots of simulation. If each ship has one engine, generator, a cockpit, loading ramp, a couple of guns, plus extraneous armor plating, etcetera, that's looking at 10 or more Karma simulated actors per ship.. more for larger ships.

: Also, though UDN claims that there is a hard limit of 200 on the number of Karma simulated actors, however I have performed an experiment and found that this is NOT true.

{{classbox| August 4, 2003}}
: Initially appearing to be a bad thing, a change that I made caused all havok with the rest of the code. After tracking what the problem was I revealed a dormant bug that had been released through the expansion of the code. I'm not exactly sure why that didn't cause crashes before, but it had something with no KParams attempting to block Karma objects. This has now been fixed so I can get back to finishing up redoing the input stuff or alternatively working on the vehicles.

: Replication is being a nightmare. Specifically, the notion that things may arrive out of order. I figured this would be easy to work around.. I can just put anything that must arrive in a given order in a struct along with a timestamp and they can be sorted by their timestamp so they are recieved in the correct order. However, this actually will not work on a network with latency because the packets recieved out of order will be processed before the other packets arrive, thus they will already be gone by the time we want to sort. The only way around this would be to place a delay on incoming packets, but that would make the network appear slower. An example of the problem I'm having: Player A strafes left, strafes back right, then stops. Seems simple enough. But the movements arrive out of order. Player B percieves this as strafing left, stopping, and strafing right. Though Player A is standing still, the pawn continues strafing right endlessly on Player B's machine. For obvious reasons, this is a problem.

{{classbox| August 5th, 2003}}
: Wrote up some code for triggers inside of vehicles so you can assume control of the vehicle by walking up to the wheel/joystick/buttons/whatever kind of controls it has. Also added the keybind to leave the vehicle and one for self-destruct, though that one was mainly just to test to see if the controls were working.

: A perpetual thorn in my side, two parts of the walking physics need to be redone: stairs and the surface detection. It turns out that the surface detection does not work very well on TerrainInfo surfaces. It &quot;works,&quot; but sporadically flickers on and off, so the pawn more or less just stumbles and trips as they walk. The stairs need to be redone as I've found that they allow you to &quot;pass through&quot; sloped walls to an extent. Fortunately each of those things is contained to a single function each so there's no loose ends that need to be tied up once I've figured out a better way to do them.

: For the remainder of the day I'm probrably just going to try my hand at making a nicer ship model.. one that isn't just a cone with a subtracted cube. :P

{{classbox| August 6th, 2003}}
: The UnrealEd Goblin has bitten me in a way I never suspected. FClamp has ceased working properly. I didn't think something so simple and so commonly used could simply cease working for me. It still works in other classes, just not MY classes. FClamp is acting the same as FMin, that is, it will return the first value if the second value is lesser than it, however, it totally disregards the third value and will gleefully exceed it. I could just write my own FClamp function, but really, this is rediculous.. I can't see how a function like FClamp could suddenly just go wrong like that!

{{classbox| August 7th, 2003}}
: FClamp still doesn't work. I can live without, I suppose. Now that I'm not on vacation anymore I don't have as much time to code. On the upside, however, I'm going to be going part-time soon so in theory I'd have more time. However, that will be short-lived as the reason I'm going part time is to go to University in the fall.

: Wrote my own coordinate rotation operators because the native ones weren't cutting the mustard. They didn't seem to be particularly accurate, although they were still half decent. I'm in the process of cooking up a scheme for the controls of the ships and whatnot. Jets are back in so the flying warehouse is a bit more mobile. I'm going to get the controls going smoothly and then I'll add weapons back in. The modularity is really starting to shine through, which is good. When I wrote the code for walking personnell I put in all of the hooks I would need for vehicles, so the going has been swift.

{{classbox| August 8th, 2003}}
: Not much to say so far since I just got home from work and I'm headed for bed, but I thought I'd put this note here anyways. I just had an idea but I'm probrably going to forget it when I go to sleep. To that end I'm putting a note here. A hypnotist taught me a neat memory trick. Because I am thinking of my idea while I write this, when I read this tomorrow I will recall that idea. Let's see if it works.

: It worked. While reading [[Legacy:CorDharel|CorDharel]]'s [[Legacy:BioRocket|BioRocket]] page I got an idea. Originally I thought that the intent was to create a rocket launcher with a biological warhead, IE it flies like a rocket and on impact splatters the bio goop. That sounded like a neat idea but after reading the page it turned out that wasn't quite what he had done, so I decided to make the &quot;BioWarhead Launcher.&quot; It's a bit of a diversion from my main project but it only took an hour to make so it can't be too bad. It effectively extends the range of the secondary fire of the biorifle, so it might present a balance issue, but the secondary fire of the biorifle is only really useful for charging up before a confrontation or during a lull in the action anyway. With high speed rockets it may be useful as an alternative sniper weapon.

{{classbox| August 10th, 2003}}
: Things have been very slow going with the vehicle code for today and yesterday. Why, oh why did Epic not include a KConstraint that just sticks things together? One would think that the simplest type of contraint should be one that allows no movement and basically just attaches two KActors together. Unfortunately there is not only no constraint that does this, but no constraint that is easily modified to do this. Strangely enough, though the KCarWheelJoint constraint demonstrates that the engine supports it, there are no linear constraints, like springs or just string type constraints. These could be custom coded, but unfortunately due to the highly native nature of constraints, custom scripting constraints is limited.

: Following is the code I have written for a rigid constraint. With the latest update, it appears nearly flawless. It's a bit hacky, but a clever solution if I do say so myself, which I just did.
: &lt;uscript&gt;
///// Rigidly affixes two karma simulated actors together.
///// Written by Foxpaw.
///// If you use this, please give credit. If you do not, I may eat your children*.
class KRigidJoint extends KHinge placeable;

var KRigidJoint Slave;

simulated function PostBeginPlay()
{
  if ( KConstraintActor1 != None || KConstraintActor2 != None )
    Initialize( KConstraintActor1, KConstraintActor2 );
  Super.PostBeginPlay();
}

simulated function Initialize( actor A, actor B, optional bool bIsSlave )
{
  if ( Slave != None ) Slave.Destroy();

  SetPhysics(PHYS_None);
  KConstraintActor1 = A;
  KConstraintActor2 = B;
  SetPhysics(PHYS_Karma);
  
  if ( !bIsSlave )
  {
    Slave = Spawn( class'KRigidJoint', self,, Location, Rotation + Rot( 16834,0,0 ) );
    Slave.Initialize( A, B, true );
  }
}

simulated function Destroyed()
{
  if ( Slave != None ) Slave.Destroy();
  Super.Destroyed();
}

defaultproperties
{
  bKDisableCollision=true
  bKForceFrameUpdate=true

  bStatic=false
  bNoDelete=false
  Physics=PHYS_None
}
&lt;/uscript&gt;
: This can be set up in a map or spawned in real-time. If you spawn it in real time, you must call the initialize function and pass references to the two actors you want constrained. For the time being this does not allow for constraining things to the world, though that would not be difficult to do. (However, I would question the value of constraining a Karma actor rigidly to the world, since then it wouldn't be able to move or rotate at all anyway.) The bKForceFrameUpdate will make you life much, much easier if you plan to set up the constraint in real-time. If you will only be using it in a map you can leave that false. At some point I may make a bunch of Karma constraints and package them so we won't have a myriad of custom constraints floating around embedded in maps taking up space. If you do use this in a map or mod please credit me for it and please ask if you would like to use it in a commercial application.

: Earlier today I was attempting to make a wrapper for KTire to use with my mod. Though KTire would have been better implemented as a subclass of KarmaParamsRBFull, it was instead implemented as a subclass of KActor, meaning that if you, for instance, wanted a pawn that rolled along the ground like a tire, you can't use the native tire simulation. This is curious because the Tire simulation is simply a special type of simulation and as such should belong in the KarmaParams, instead of having it's own class. Regardless, it was not coded that way. I was attempting to wrap the tire and basically use the tire wrapper to maintain compatibility while using the actual KTire for physics simulation. This did not pan out due to the fact that I cannot have an invisible, non-blocking Karma object, and if the wrapper is not designated as using PHYS_Karma, it will not recieve the configuration for Karma physics, which it needs to pass on to the tire. Instead of wrapping the tire, I've decided to make my own. I don't know how well it will work, but time will tell I suppose.

{{classbox| August 16th, 2003}}
: I haven't done anything with my mod for a few days, unfortunately. I started playing with the tires again and I've decided to axe them for the time being. They have an acute tendancy to get &quot;lodged&quot; in the ground. The native tire simulation does not have this problem, of course. I'm likely still going to have &quot;tires,&quot; but they will not use a physically accurate tire model, and rather be powered purely by impulse.

: Aside from that, I'm still working on a good method of controlling. I've got it working half decent, but it still isn't really what I wanted it to be. I'm hoping to put up screenshots once I've got a test vehicle that isn't so ugly. It's been transformed from a flying warehouse to a flying warehouse with warp nacelles glued on the side and a big cannon glued on top. While testing the wheels, it also had wheels on the side.

: Hours later... brain is burning. I need to come up with a scheme to control the firing of various thrusters on the ship to attain the desired orientation and velocity. The problem being of course that said engines can be at ANY angle, ANY location relative to the center of mass of the ship, and the desired orientation can be ANY angle relative to the center of mass of the ship as well. As you might imagine, trying to compute which engines should fire to create the desired angular velocity is.. trying, to say the least. I believe I have a partial solution, or rather a partial visualization of how I need it to work. I am going to need to use some kind of a plane that represents the cutoff of where the engine will be able to produce useful output. This plane needs to pass through the center of mass of the ship and I believe that it's orientation will be in some way related to the rotation of the ship. A vector made from the desired orientation can then be measured to see which side of the plane it falls on. The only problems being:

* I don't know how to determine what side of a plane a given point lies on. I think I could make a coordinate system from the plane and use coordinate rotation to do this, but that's a pretty big &quot;I think.&quot;
* I don't know how to determine the heading of the plane. I believe it needs to be parallel to the vector rotation of the engine, but that's just what seems right to me.

: My current idea is maybe a bit easier and maybe more efficient. I think that I can find a line perpindicular to the vector rotation of the engine that will intercept the vector rotation of the engine when centered around the center of mass of the ship instead of the engine. I can then take the normal of that first (perpindicular) line and use it to find if the vector of the desired heading is within a 90 degree cone from the normal of the perpindicular line. I'm pretty sure I learned some formula to determine where two lines will intercept in Grade 9, but I don't remember it, so I'm trying to think if there might be an even easier way to find the normal. Since all I really need to trace the intercept for is to determine that I actually have the correct perpendicular normal, I may be able to forego that entirely.

{{classbox| August 20th, 2003}}
: Engines and turrets are going nowhere. Something simple is eluding me, but I can't put my finger on it. They both &quot;work,&quot; but the control system that I was planning to use has to do some kind of computation, and I don't know what it is. I'm positive it's somehow involved with coordinate rotation, but I can't put my finger on it. Of course, it's kind of hard to play around with stuff when your engines can't do anything except propel you straight forward. I may write a short &quot;hack&quot; to handle the flight controls until I can figure out the proper functionality. I really want to have something to show for the MSU Phase 2.

: A friend of mine saw the movie, Freddy vs. Jason, and now he's obsessed with the idea of me making a mod for him based around serial killers/horror icons. :rolleyes: Once mine is fairly stable it wouldn't be a difficult extension, but still, that's not my bag, baby! :P

: The controls are still.. yuck. I wrote the hack to get the engines to work. (not properly, I'm still figuring that out, but it works for experimentation) I can now see why astronauts have to train so much. :P My attempts to fly resulted in much spinning, and me being tossed around in the cockpit trying to maintain control. I think I may need seatbelts or some type of restraints. Eventually the thing was spinning so out of control I got flung into a wall really fast and jibbed. I guess it's a better way to go than getting thrown out the open hatch. :rolleyes:

{{classbox| September 3rd, 2003}}
: First day back at University. There was lots of foxy ladies there, but unfortunately, none of them are in senior level computer science. :( In other news, I've been spending the last week racking my brain trying to figure out why the engines weren't working right. Turns out that the vector I was using that was supposedly the desired rotation.. wasn't actually the desired rotation. I don't know why, since it's code is seemingly identical to that of the targeting reticle, but if I use the actual location of the targeting reticle it works. Go figure. The cameras still don't work though. I went over the vehicle code again and found that it doesn't even reference the camera, except in superclasses, which work fine. It's possible that I forgot to call a Super function in one of my functions, so I'll probrably take a look for that later.

{{classbox| September 4th, 2003}}
: Figured out what was up with the camera. Turns out I had the operator precedences messed up. I wrote a custom operator a while ago and it turns out that it was getting evaluated after +. This realization happened while screwing around (a good way to find bugs, in my opinion) and I noticed that the camera actually was moving, (it was hard to notice, what with being in space and all) just not in the way it was supposed to. A set of brackets later, the camera and the jet's controls seem to be working.

: UPDATE: I spoke too soon. The jet's controls actually don't work properly, they worked in that configuration but don't work in all other configurations. It's quite frustrating. Stupid rocket science.

: In other news, the turrets now appear to be working, which is cool. Turrets can also be &quot;stacked&quot; to provide greater freedom, though this can look a bit odd. This could probrably be rectified but I don't know if it should be. Right now each turret attempts to face as close as possible to the &quot;desired&quot; heading. In a sense this is better because it means that your guns are better aligned while the other turrets get into position. However, it does lead to some backtracking which could mean that the turret would take longer to get into it's final position. It also doesn't look as cool. As soon as I get the jets working 100% I'll be able to start doing &quot;fun stuff&quot; again and maybe make a better looking ship model.

{{classbox| September 5th, 2003}}
: While experimenting, I found something that worked extremely well. Unfortunately, however, it doesn't work the way I actually intended it to. It works better. In a way that's good, however, it's probrably not good that I don't understand how it's doing what it's doing. The part I'm referring to is the engine controls. They now seems to be firing as if they somehow magically knew what to do. Though that was kind of the idea, the notion of having &quot;overlap&quot; where an engine would still fire even though technically it was outside the zone that it should (to produce smoother manuevering) seems to be operating despite the fact that I didn't yet implement it. :roll: Tomorrow I'll throw in some debug statements and see where it's going wrong.. or going right, however you look at it.

{{classbox| September 6th, 2003}}
: I found out what was going on with the engines, and got them working pretty decent now. Decent enough to do some manuevering anyway. I want to make the manuevering a bit gentler, since right now the engines will only toggle between full throttle and no throttle. I'll likely add something proportional to the engines, but the only issue I can see there is that &quot;thrusting&quot; engines require the opposite proportionality as &quot;manuevering&quot; engines. Manuevering engines should taper off as the ship approaches it's desired heading, while the main thrusters should start to pick up at that point. Thrusters should also be less discriminating about when they fire, because the rotation they impart to the ship is less critial. To resolve this I'm going to assign a &quot;manueverability&quot; value to each type of engine to dictate it's behaviour.

{{classbox| September 7th, 2003}}
: The jets are running a bit smoother, and I changed the controls up a little bit so they are a little fancier too. I think there might be a slight bug in them but I don't know if I'll fix it or not. The view kind of &quot;drifts&quot; around the ship when you aren't moving the mouse pointer. It shouldn't be hard to fix, but it looks kind of cool anyway so I might not worry about it.

: I've been feeling that so far I don't have much to show for my efforts because most of the stuff I've written so far is abstract. To that end I've slapped together a stationary pillbox to show off my fancy vehicle technology. Although the pillbox doesn't move, it does have the full benefit of the vehicle code that I've written, so you can do cool stuff like.. well, stand inside and shoot out the windows. It also has a gun turret on top and you can stand inside that as well. If you like you can peek out the hatch and shoot at people without leaving the turret. However, seeing as it IS a gun turret, some would question why you would want to do that. It's mostly for the &quot;look cool factor&quot; at this point. Although a vehicle would probrably have been way cooler, I'm not much of a modeller and a pillbox doesn't call for a particularly complex model, so that's why I decided to make one. Considering that it's texturing is just one texture plastered over the entire model I think it looks pretty half-decent.

{{classbox| September 8th, 2003}}
: Figured out what was causing the drifing of the view. Though cool looking, it was a severe pain in the butt trying to aim at distant targets, plus the &quot;why&quot; of the bug could have led to problems in the future. It resulted from an earlier &quot;bug fix&quot; that I've now fixed in a different way so as to avoid that problem.

: I'm also going to remove the MeshController on vehicle components, but keep it for people on foot. It is a system somewhat equivalent to having various player models using the same class for all the code. However, my mod has some information attached to the models, much like the species code. To that end, I made the meshcontroller class which sets your mesh, and takes care of all that goodness. It also handles the fancy skeletal aiming, so you could freeze gameplay and trace a line (barring inaccuracy inherent in the weapon) to predict where the shot would land. Basically it's just eye candy. The ships, however, don't really need that functionality because what with their Karma parameters and the fact that a given mesh isn't likely to be reused by different components, I decided to move that functionality back to the actual component classes. I found it quite a pain to have to make two classes for each component.

: I've also refined the controls somewhat and made a few assorted improvements to various classes. I also crushed a simple bug that I hadn't gotten around to fixing, and streamlined the function it was in while I was at it. I expect to put up some screenshots soon.

{{classbox| September 12th, 2003}}
: I meant to put this up last night, but I was having some problems with either the UnrealWiki or with my ISP, I'm not sure. At any rate, things were going super slow, so I decided to leave it until today. I took a few screenshots, but then I realized that most of them weren't particularly relevant, so I just left the one screenshot to show off one of the fancier features of my mod.

[[Image:Legacy_FoxpawsTurretScreenShot.jpeg|center|This is actually a stationary pillbox and gun turret, but it's running on the vehicle code. It just doesn't have any jets/wheels/any form of locomotion. As this picutre illustrates, you can fire out of firing ports on the vehicles and fire into them from the outside, though it's understandably more difficult to hit through from the outside. The gun turret on the outside can also be rotated and fired at things.]]

: Unfortunately, although I made this pillbox/turret combo mainly for the purpose of showing the configurability feature of my mod, when I made it I found that I couldn't really make much in the way of variants from that system. That is to say, there's not much USEFUL variation you can make. Because it's stationary you need a turret if you're going to hit anything with it, and you can't really get away with taking off the guns. To that end, I'm making a new spacecraft model that should be somewhat configurable, and I'll try to come up with a way to configure the pillbox differently to show off that feature of the mod. It is kind of like the premise, after all. :P

{{classbox| September 14th, 2003}}
: Made a few miscellaneous improvements, adjustments and so forth. I moved the turret calculations out of the turret constraint and into the turret actor itself, removing some redundancy, and I also made the driving code a bit more abstract so it was more amiable to being driven by different types of actor. The aiming stuff for turrets was a bit flaky before, (though theoretically it SHOULD have been sound, it didn't work that well in-game) so I've improved the aiming to make it smoother.

: Unfortunately, however, I'm wondering what I should do next. I need to make a new ship model to thoroughly test the configurability, but that's bogging me down a bit. I made the model but now I need to make a change to it, and making that change appears to cause havok in Rhino. When I made the original model (well, okay, I more or less ripped it off of homeworld, but still... :P) the glass over the cockpit was rigid. I want to separate it from the cockpit itself so I can make it swing open and close so that people can get in.. Unfortunately when I split the solid object that is the cockpit, Rhino ceases to recognize it as separate solid objects and now does not agree with me that the two objects are actually closed polysurfaces. Arr..

{{classbox| September 19th, 2003}}
: I wasn't sure what to do next, so I thought I'd do the front end for my mod. I want to make a new front end from scratch, but I'm not sure how to do that. Some GUI stuff is referenced from the .ini file, but I don't know if it has native significance or if it's just a reference to make things easier for the coders. I understand that UWindows was built off the console - so maybe I have to override the console and replace the console reference in the .ini file. Basically, I don't want Epics GUI windows to come up at all. Getting my own GUI to appear when I want it to is easy enough, but I don't know two things about the GUI:
* How it is loaded up initially when you start the game. Does the &quot;startup level&quot; (the nVidia logo) load the GUI somehow or is the GUI loaded by the engine through some entry point that I don't know about?
* When you hit escape, it brings up the &quot;quick menu.&quot; Is this simply a result of the GUI intercepting a console command bound to the escape key, or something else?

{{classbox| September 21st, 2003}}
: I decided to take a fresh stab at making tires. A discovery that I made along the way I thought would help me out: that is that a karma simulated object can have a static mesh for simulation and a different type of display. This allowed me to make the wrapper &quot;tires&quot; invisible, and use the KTire for the tire simulation. I was also going to use the KRigidJoint above to basically make the vehicle component be the wheel, and the KTire be the tire on it. This unfortunately, did not pan out, because apparently KTires are quite picky about what things are constrained to them. Instead, I decided to try my own proprietary tire physics and so far it seems to be working pretty decently. The tires start to bounce around a bit on the ground at higher speeds, but I think this can be fixed with tweaks to the suspension.

{{classbox| Septembter 28th, 2003}}
: Yowza, it's been a week since I've updated this. I've been busily making my own GUI, which has been slowed because I'm not much of an artist so I don't have any fancy textures to work with. I've also come upon a realization, which I found quite bizarre. Epic's GUI code is native, so one would think it would run quite a bit faster. Yet, my custom code, made in Unrealscript, runs WAY faster and UT2003 loads up in about half of the time too. This leads me to believe that not only is Epics/DEs GUI code loading up a LOT of stuff when you first load the game, but it also seems to be swallowing a lot of cycles somewhere. From clicking the UT2003 icon to the GUI appearing, ready to go, takes less than 2 seconds (including splash screen and all that jazz) on my computer.. which doesn't even meet the minimum specs for UT2003. Loading using the standard GUI takes over 5 seconds. :rolleyes: It's not that big of a difference, but still nice when you're loading up UT2003 once every minute or so for tweaking the location of interface bits.

{{classbox| September 30th, 2003}}
: I'm hereby expanding my Pawn rant to the GUI class as well. I've hit a major roadblock in trying to make my own UI. Apparently all the classes that deal with metaclasses (the map list, weapon list, character list, mutator list) are all 100% bonafide native and firmly lodged in the GUIController class. Now I'm going to have to pollute my fancy AI with a hacky workaround to access those lists by creating a dummy GUIController. :( To add insult to injury, UT2004 promises a new UI which will probrably be incompatible with the current system.

: Having said that, I have managed to wrangle the GUI system into having a &quot;dummy&quot; GUI that creates my real GUI. It was quite difficult because although the GUIController is an interaction, it does not get ticked even if you have bRequiresTick set to true. Further, it is created pretty much before anything, and in most of the events called on it, a viewport hasn't even been created yet! This causes an obvious problem, as if the GUI is going to draw anything, it needs a viewport to draw it on. Fortunately there is one event that is called just after the viewport is created. Unfortunately, there's still no controller attached to that viewport, and no level, pretty much no nothing. :P I've worked around this by having the GUI create another interaction (which will get ticked) and have that interaction do the actual initialization in IT's tick function, allowing me to do the initialization after everything is already loaded up and ready to go. DE works around this by distracting you with a video of Gorge. :P The CinematicGame gametype of that gorge into (and the various replacements I've seen floating around the internet) calls back to the menu when it completes and the menu then goes into full-blown operation.

: In other news, I've been having to get back into programming in C and Java lately what with school and all. It's then that you really appreciate UnrealScript. When I went to University initially, all you had to do was make a source file and compile it into an executable. Nowadays, they've got all this garbage with &quot;solutions,&quot; &quot;projects,&quot; and settings that don't actually exist anywhere in the source, only in menus from the IDE. I think that's all senseless. I really don't need 4 files to make a hello world program in C. Even Java won't compile cross-platform without complaint anymore, thanks to individual IDEs storing their own garbage in with your source. I wish there was a way to compile Unrealscript to standalone executables.. Mmmmm, that'd be fancy. Did I mention NetBeans hijacks portions of your code and will not let you modify them under any circumstances, instead preferring to use it's own generated code (on which the formatting is yucky!)

{{classbox| October 1st, 2003}}
: The GUI system is my unwitting slave. Muahahahaha! My GUI can now load maps with a selected gametype, and all the hooks are in there for me to speedily write the other junk, as soon as I decide what other junk there is to be written.

: The future of bots for my mod is up in the air. There will definately be AI controlled pawns, but I'm not sure if I want them to have fancy names and specified accuracies and all that &quot;personality&quot; junk that UT2003 tries to inject into it's characters. I might not use any of that stuff, but I'm still deciding. On the one hand, it doesn't really hurt anything to have it there. But on the other hand, it does add complexity and clutter to the interface.

: Also, I've had a crazy idea but I don't know what to do with it. I was thinking maybe I'd just do away with people being in the ships altogether, and have them be like remote controlled fighter drone thingies. On the upside, that would be easier to make ships for, because they wouldn't require an interior. On the downside, it might not be as cool. Maybe I'll just include support for both.

: Further, I think I'm going to need to find some real optimizations for the ship physics, because I'm not sure the system can feasably handle that many karma actors. At first I figured it would just be the ships for the players, which is manageable, but now incorporating AI ships and whatnot, the numbers grow quickly: Suppose a simple outpost consists of 15 components. Some structural components, turrets, a few guns, some generators, and maybe a few bits for constructing other ships. Simple drone ships from it have a foreward chassis, rear chassis, engine, two stabilizers, two jets, a pair of guns, a fuel tank and a generator. That's 11 right there. (I think.) Now suppose there's 5 of those fightesr flying in formation. (55 + the 15 for the outpost.) The outpost has 3 formations garissoned and another 2 on patrol. That's approaching 300 karma simulated actors, about the limit of what my system can handle. Now suppose there's 5 starbases on a large map. :/ Granted, it's not likely every starbase would have a garrison of that size, but still. The potential exists for their garrisons to grow that large if the players are particularly bad at the game. :P

{{classbox| October 7, 2003}}
: Added an implementation for fins today. Though one could argue that a fin/aerofoil would be pointless in space, (and it more or less would) I added them because it makes the game so much simpler. You can rotate to face any direction with a mere 8 thrusters, but for smaller ships, I doubt players are going to want to place every tiny manuevering thruster. To that end, I've added a new type of vehicular component: astrofoils. They act kind of like a rudder in space. (there's no real physics behind that, they just do. :P) There's a bit of strategy to using them, of course, the faster you go, the greater force the astrofoil can exert to rotate the ship. Conversely, the faster you go, the greater drag will be placed on the ship while you turn (so you have to sacrifice velocity to rotate yourself using the astrofoils) Also, if you are facing more or less the same direction the fins are facing, they will act as a stabilizer, keeping you headed straighter. I've finally got a half-decent ship model imported, but unfortunately the textures on it are still ugly. The black chrome that looked highly cool on the target drones is quite unappealing on the fighters, so I'll have to come up with something else.

{{classbox| October 9th, 2003}}
: I've discovered something incredibly interesting in my studies at University. Turns out that eternal youth is not only possible, but quite feasable, so long as you ignore the moral implications. Just thought I'd tease you all with that. :D

: As far as the Unreal world goes, I got the astrofoils running a bit more stasble and I'm tweaking the interface some more. I'm not sure what I should do as far as the view goes. Specifically, if the ship rolls to be upside down, should the camera roll as well? It makes sense, but it can be disorienting. Plus, then your controls are all messed up, unless you also compansate for the controls, but that in itself also means that your controls will be severely messed up WHILE you are rolling. :/

{{classbox| October 11, 2003}}
: A GPF has been biting me but with no apparent pattern. It's something to do with a &quot;path&quot; but I don't know if that is a path as in pathnode, or a path as in file path or perhaps the path of an object in some kind of internal organizational tree. It's going to be difficult to fix unless it starts appearing with some kind of consistency. Until then I can't really do anything about it. I also found another error that was introducing a runaway loop condition. How it was doing that I don't know, but I've put in a safeguard so it won't happen again anyway.

{{classbox| October 12, 2003}}
: I found a way to speed up the Karma engine dramatically. It's internal collision engine runs EXTREMELY slow compared to a simpler collision system. This is very good considering my mod is very Karma-intensive. I sped it up by having the script determine what things are potentially colliding, and then disabling collision for everything else. This leaves the Karma collision detection with a lot less to consider, making it run much quicker. (My mod has some objects that may be in very close proximity for long periods, but they are in sync so they will never collide. The Karma engine, of course, does not know that.)

: The issue with that is: it's a hack. To put it in an appropriate place would require using nested iterators (yuck!) so I put it in the vehicle code instead, because it already has pointers to it's other parts (the ones that are very close but never actually colliding) so I can just disable collision directly. The reason why that's bad is, some parts of vehicles MAY collide with the vehicle (turrets for instance) and thus the disabling should not take effect for those types of objects. However, in proper OOP form, no class should have to know about a subclass of itself. (and turrets are a subclass of the base vehicle components)

: I have mixed feelings about that. It does run very fast, but it doesn't feel right. I'll have to see if I can find a reasonably fast way of doing it without requiring that exception.

: On the bright side, the mod is really coming together. The ship I've been using for experimenting needs a paint job before I dare to release screenshots, (:D) but it's got most of the finishing touches on it: roaring jet exhaust, muzzle flash on the guns, and, for added coolness, if it scrapes against something a pile of sparks comes off the point of impact. The controls seem pretty decent and the interface seems decent. Things are definately looking up, if I do say so myself. The only catch is, I don't really have much in the way of modelling skills or texturing skills or level building skills or sound making skills. I'll have to figure something out there. I'm a bit leery of trying to recruit people, however. This is my &quot;dream project&quot; and I've been working on it for a long time. This makes me wary of recruiting a team because:
# I don't want to lose creative control. I definately want people to exercise their own creativity in making parts packs, etc. but I'm still somewhat concerned that others may have a different vision of what direction they want the mod to take.
# Although it's not my primary goal, I would like to make a commercial incarnation of this mod at some point. That may be a while off, or it may not happen at all, but if it does, and some people on the team want to keep it free, there may be some legal issues around intellectual property. At the very least I'd have to remove their work, but they could likely claim that their work formed a synergy with the rest of the work and could not simply be replaced.
# Right now I don't owe anyone a mod. If for whatever reason I get busy or otherwise can't continue work on it, or simply decide I don't want to finish it, I can simply drop it and noone can blame me for it. If I recruit a team and they begin working on it, making content, etcetera, I can't in fairness stop working on the mod. So far I've invested a lot of time and effort in making it but it's still MY time and effort and if I should choose to let it go to waste by stopping work on the mod it's entirely my choice. When other people get involved, I would have an obligation to continue working, since I have no right to make their work go to waste as well.

: Right now I'm just using models ported from Homeworld, which is fine for testing, but I can't release them for obvious reasons.

{{classbox| October 16, 2003}}
: Wow. Looks like learning about database systems came in handy after all. I ran into a brick wall momentarily when I found the Unreal engine can't write a single config variable thats more than about a kilobyte in size. Seeing as how the vehicles were a veritable tree of components, I found that I was going to have to build a relational database to store my data in. Mmmmm, USQL... :P

{{classbox| October 18, 2003}}
: I looked at a few &quot;previews&quot; of UT2004 and something unsettling dawned on me. Maybe it's just my imagination, but the &quot;Onslaught&quot; gametype seems ALOT like Overload 2k3. Invasion seems very similar to Invasion for UT. I'd hate to level accusations but it almost seems like they might be drawing a bit too much inspiration from successful mods. Not a bad plan from a marketing standpoint, since it's already a proven concept, but still, it doesn't feel right to me. On the other hand I could just be imagining this or it could be coincidence. I'll have to wait and see if the same thing happens with future releases.

{{classbox| October 19, 2003}}
: I decided to redo the user interface from scratch. Mine was pretty good, but there was a little bit of redundancy which is certainately less than ideal. There was also a lot of settings that I was using in ways other than they were intended. This unfortunately was a consequence of Unrealscript not supporting multiple inheritance. I wanted menus to have the properties of a &quot;sliding page&quot; and of a button, but unfortunately that was getting far too complicated becase the way it was implemented then required a subclassed button and a subclassed sliding page working together in unison. Not so hard to implement, but a pain when you want to make the actual GUI, since you have to manage two sets of settings instead of just one. Now I've changed it to a system that seems to work a little nicer. I reworked it all to work on relative coordinate systems for everything, which makes it alot easier to have &quot;add and forget&quot; pieces to the UI. With the absolute coordinate system I was using before it was still pretty decent, because any calls to move things around were passed down the line so everything got moved by the same amount. (keeping all child objects in sync) This way I prefer though because it makes some computations faster and all around reduces complexity.

: I also downloaded the UnrealEngine2 Runtime to see what it was like, but I have mixed feelings on it. On the one hand, being free is neat because you can distribute your mod more. Also, a mod built on the Runtime is likely to be viewed more as a separate game rather than a mod, which might be good in some ways. The downsides to the runtime are that it's not valid for the MSU contest, though that's not that big of a deal; and that you have to rewrite everything. That's not really an issue for me, since the first thing I did when making my mod was make my own pawn classes, etcetera, so I could probrably (not sure if the meshes and whatnot would port 100%) plug my mod right into the runtime and have it work. I do think that it's still an issue though, because I expect a lot of people are going to see this engine and get a little too ambitious, which doesn't really harm me, but it's a shame because I think that alot of the projects attempted on this engine won't reach fruition.

Plus, mine boots in less than half the time of UT2003s GUI, and runs a lot faster. :D

{{classbox| October 23, 2003}}
: Overall a pretty productive day. I finally bit the bullet and did some work on the editor. After much progress, followed by frustration, followed by vocabulary expansion, I finally got it working pretty good. First FClamp went on me, then equals went on the fritz. That's right. Equals. The assignment operator. The following piece of code ceased to function:

&lt;uscript&gt;
ViewRot.Pitch = Grandpa.CursorX * Grandpa.PrimaryComponent.XScl;
log( (Grandpa.CursorX * Grandpa.PrimaryComponent.XScl) );
log( ViewRot.Pitch );
&lt;/uscript&gt;
: Believe it or not, the first log gives the correct result, the second log always is 0. Go figure. I erased the whole thing and tried a different approach, which worked pretty good. I'm glad I didn't start content creation yet, since now there's another bit of information that needs to be set up for each component. (I actually foresaw this from the beginning but wasn't sure if it would be a good idea. It takes away some flexibility from the user, but after a while I realized that if I didn't install a constraint on what sorts of combinations of parts people could use, there could be a great deal of &quot;cheating,&quot; in the sense of going against the spirit of the game. (Such as having a ship that's just a supercompressed clump of guns and such. Technically that would make you prone to area effect weapons, but you could cover a massive amount of components with a very small amount of armor, making your ship nigh indestructable.)

: I've also been cooking up a plot for the single-player mode. I think it's pretty good. I've decided to stray away from video-game stereotypes and make it more like a real-world conflict, where the &quot;good guys&quot; and the &quot;bad guys&quot; depends entirely on which uniform you're wearing. Of course, everyone has their view of what's right and wrong, and thus which guys are good and bad, but obviously the bad guys have a different view of right and wrong, right? Unfortunately, I don't think that many people would be able to adjust their mindset like that so instead I'm going to have a strong &quot;propeganda machine&quot; to make every race, other than the one you are playing, seem downright barbaric and murderous.

{{classbox| October 26th, 2003}}
: Don't you just hate it when a piece of code seems to be working but actually isn't? Turns out that a piece of code in the vehicle design area which appeared to be working properly actually was not working. It worked fine when I was making sensible designs, but then for the heck of it I tried to slap together the shoddiest piece of junkyard trash I possibly could and it turned out the code actually wasn't working in all situations.

: The most annoying part is it used to work 100% but I decided to change a rotator to a vector (since roll did not apply in this situation and a vector would be easier to specify). Unfortunately, however, this seems to have caused all sorts of havok and now it doesn't wokrk that well anymore. The locational attachment seems to work 100%, just the rotational is not always accurate. The issue I'm having is as follows:

: I have two actors, each of which has a &quot;socket&quot; on it. That socket can have any location and rotation relative to the actor to which it belongs. These sockets must be lines up so that they face exactly the opposite direction - so that one would &quot;fit into&quot; the other, as it were. The sockets cannot be rotated relative to their actor, and only the second actor can be moved.

: I used to have this working, but I replaced that code with new code which appeared to be working fine. (A couple days later I found out it wasn't) Finding the absolute rotation of the first socket is quite simple. Thus, finding the absolute location that the second socket should have is also quite simple (it's simply the inverse of the first socket's absolute rotation) Although it seems like it should be simple enough to then derive the rotation of the second actor from the relative rotation of the socket and it's absolute rotation, this doesn't seem to have been working.

{{innerbox| When in doubt, let the user figure it out!

}}

{{classbox| October 29, 2003}}
: I was going to post up some screenshots of some cool ships I made, but they were a bit over the maximum image file size for the wiki and I didn't really feel like cropping or resizing them tonight. They turned out pretty good considering that they are just the same 7 or so components rearranged. I also think I'm going to need to add in some design aids to make it a bit easier to design the ships. It turned out to be a bit difficult to line up guns on the ship for accurate fire by eye alone, so maybe I'll put in a sort of 3D grid with some axis indicators and maybe a line showing the heading of components, so you can be sure that your guns really are pointing foreward and your engines are facing more or less straight back.

: The lousy GUI keeps crashing, and I don't really know how to fix it. It's quite annoying. It crashes fairly frequently and is consistent, but it GPFs before it even reaches my code (the GPF is in the interactionmaster, but because it's repeatable it must be related in some way to my code. This is highly annoying as I doubt the end user will want to be restarting the game every couple minutes. Granted, it takes under a second from icon click till you're in the editor, but still, it's annoying.

{{classbox| October 30th, 2003}}
: AHA! I've said it numerous times before, but when you debug something, make sure the tool you are using to debug it is working properly first. Turns out that the stack trace provided on a GPF is not always 100% accurate, interestingly enough. Turns out there is actually at least two distinct things causing a GPF, but they were actually a consequence of my input system, not a fault in the Interaction Master as the stack trace suggested. (It said that execution never made it out of the interaction master, when in fact it had gone about 6 functions down the line when it crashed.)

: I trimmed the number of crashes to about half by simply changing a return false to return true in KeyType. Apparently, KeyType does not like inputs being left unprocessed. My loading function was still crashing but I did some tests and found it's actually something in the vehicle loading that's doing it. (Commenting out the vehicle loading prevented crashes, and I also placed the vehicle loading in the postbeginplay of an actor so I can invoke it on demand, that crashed the game just the same.)

: Armed with that knowledge, I was able to trace it to a bug in the native iterator code. A short workaround later, and the bug has been thoroughly stomped to death!

{{classbox| November 2, 2003}}
: Eureka! I finally got the bots to not have crappy aim, and did it in an interesting fashion too. I was trying to find a formula that would determine the ideal heading of the ship to have the weapons bearing on the target. That seems simple enough until you consider that unless the ship is balanced absolutely 100% perfectly, There is going to be some disagreement between the theoretical &quot;heading&quot; of the ship and the direction it is actually facing and travelling. This is especially the case when a ship is damaged which can cause it's center of gravity to change.

: I had a formula that calculated quite precisely where the shots should go, but I couldn't find a satisfactory way to make the bots aim and shoot at that point. After thinking about it for a while, I decided to use a very un-computery method. Instead, the bots aim using a semblance of the way human beings would aim. They use a formula to get them facing in the general direction of the enemy, then track their &quot;crosshair&quot; relative to the target's location &quot;on screen.&quot; Armed with that information, they constantly adjust their heading to bring the &quot;crosshair&quot; ever closer to the targets &quot;on screen&quot; position. This seems to work surprisingly well and should also theoretically work regardless of the weapon configuration on their ship.

{{classbox| November 4th, 2003}}
: Been having problems with gimbal lock. The ships don't suffer, and the aiming doesn't suffer, just the camera does. That of course causes problems as the camera whips around 180 degrees frequently if you are flying more or less straight &quot;up&quot; or &quot;down.&quot; I've tried a number of solutions but I've yet to find one that I'm satisfied with.

: I thought quaternions were the answer but they didn't produce the effect I wanted, at least on the controls. I still want to maintain the &quot;distorted&quot; nature of Euler Angles, but I don't want them constrained to the Z-axis, instead being relative to the ship's Z-axis.

: This I managed without too much trouble but the camera still has it's gimbal lock around the world Z-axis so it spins whenever it crosses the world axis. I may try using quaternions only for the camera while leaving the aiming and controls strictly vector math.

: I also came up with an ingenious scheme. Originally, I wanted to make the AIs pretend to be players. Then, as I was writing some stability management code, I thought that I really should just make the players a special type of &quot;AI&quot; player. At first it seems like a wierd notion, but really, it makes a lot of sense when I think about it.

{{classbox| November 5th, 2003}}
: I've got the gimbal lock cleared up, temporarily at least. I'm not that fond of the way I fixed it, but it suffices for now. Previously the camera would always stay looking at the ship, but the angle it was viewed from depended on the ship's aim. I have since abandoned this system and gone for a more &quot;chase plane&quot; style of camera. This has a very different feel to it than the previous camera but I'm undecided whether this one is good or not. At the very least, it rendered the existing &quot;crosshairs&quot; useless at best. The old system had a series of parrallax crosshairs to show the path of the weapons. That system is useless in the new system, because there is virtually no camera movement relative to the ship, so the parrallax cannot be observed, and thus cannot be used to infer any information on range.

: The new system uses an adaptive crosshair instead that places itself at a distance from the camera proportional to the target's distance from the ship. Thus, the range can be inferred from the size of the crosshair. This has proven to be an extremely reliable and easy way to hit the target, but unfortunately it's a bit lacking in &quot;look cool factor.&quot; The parrallax looked very sci-fi, while this system, though a superior system from an accuracy point of view, does not have that same feel.

: I also forgot that DT_Sprite does not support materials, so I'm going to have to use a static mesh &quot;card&quot; with the crosshair material on it. Until I do that, I'm stuck with a bland, non-fancy crosshair.

: I made the AI pilots a bit smarter, but they're still not all that good. They seem to be joining up and flying in formation when they attack, but I'm pretty sure that's just a coincidence, because the formation code is not yet complete. They still manage to kill me, but it's usually my own fault. I have a bad habit of ramming into the drone fighters, because I wait too long before turning away, and consequently usually lose a wing or other fairly important piece of equipment.

: I've also actually grown quite fond of the drone fighters and other ships I made. When I made the original set of parts I didn't expect there to be much variety, I was expecting that that would come in afterward when I started adding more parts. However, interestingly enough none of the ships I have designed look much like the original model I dissected to make the parts. One thing I had not foreseen was that the semi-user friendly method I made to make parts has a fatal flaw in it. Though it seems reasonable to make them by hand in the editor, this results in slight differences in the mass distribution and as such a ship that appears symmetrical is actually not necessarily balanced all that well. I believe that this is why the original drone fighters I constructed (which were predefined in code and did not follow the normal vehicle rules) fought a lot better than the new breed. I'll definately have to put some code in the part editor to search for things that seem like they should be symmetrical, line up things that are more or less coplanar, etc.

{{classbox| November 7, 2003}}
: I really don't like modern advertising. One of the archetypes I especially don't like is the kind that tries to appeal to your nostalgia, like the &quot;good old days&quot; were so much better. That's why it pains me to say this:

: Modern image editing software is so hideous it makes me want to kick something. I recently upgraded my video drivers so Aldus Photostyler stopped working. (It's been out of production and unsupported for over a decade.) This means that I'm forced to &quot;upgrade&quot; to something newer.

: I tried Adobe Photoshop first. My first impression was that it's needlessly complicated. Operations that took two clicks in Photostyler now took a half dozen. That's of course AFTER you've gotten &quot;the hang of it.&quot; There's all this needless nonsense in it. All I want to do is create and modify images, I can live without so many bells and whistles it shatters the windows in your house when so much as a tooltip is displayed.

: After that, I tried Paint Shop Pro, which I liked even less. I kind of figured that a newer piece of software would run faster with more features and functionality. Boy was I surprised! As cute as the idea of collapsing ten tools into one highly customizable one sounds, it makes it a bit difficult when you want to go from a pen to a brush and back. Heck, why bother having a pen AND a brush, when they can just make both the same tool that you can adjust? :/ To add more fuel to the fire, tools that I had in Photostyler apparently have no more place in modern image editing software, as they are mysteriously absent. 

: Apparently Jasc has a different definition of &quot;alpha channel&quot; than everyone else in the industry. In fact, in Paint Shop Pro, not only can you have multiple alpha channels, but they don't even do anything! They're just a place to store extra image data, just in case they port the program to an operating system that hasn't developed the concept of a file system, I guess.

: Did I mention that Paint Shop Pro also personally vomits on anything you try to save in the Targa format? After a few hours I managed to produce an entertaining variety of rotated images and images with the color channels switched around so pink is purple and black is yellow. Just to keep it interesting, it usually also cut the image to ribbons and rearranged it in a lovely collage. If nothing else, at least it keeps you on your toes.

: Then there's &quot;layers.&quot; What's with that anyway? It's a 2D image, by definition the concept of adding a 2D layer to a 2D object just doesn't make sense. Why should I have to &quot;flatten&quot; an image every time I edit something? I suppose it might help if you wanted to change something later, but Photostyler had that feature licked a long time ago. First you press control, then you press Z. Amazing!

: I personally can't believe that corporations that buy this software actually put up with stuff like that. Here's a tip: buy a Pentium 233 without an accelerated graphics card and install Aldus Photostyler. You'll at least double your productivity, and the suicide rate among graphic artists will drop dramatically.

{{classbox| November 8th, 2003}}
: I've been working on the formation code, but it's much trickier than I thought it would be. Flying in formation is actually surprisingly complex when your ships can't strafe, go backwards, or freely rotate. I've gotten them to fly in formation as long as the formation leader only makes gentle movements or accelerates and decelerates very slowly.

: I got them to fly half-decently like that by calculating where they &quot;should&quot; be in the formation, and having them aim some distance ahead of that location. In theory, that eventually results in them facing the same direction as the formation leader, and more or less in the correct direction. Then, the throttle is manipulated to fit the ship into it's position in the formation. This system, however, is not particularly amiable to rapid rotation and does not allow fighters to form up to a slow-moving or stationary formation.

: Having said all that, I'm not exactly clear on what the benefit to having fighters fly in formation is anyway, other than aesthetics. It does look kind of cool though.

{{classbox| November 9th, 2003}}
: I've been getting a bit bored with working on game mechanics like the ships, so I thought I'd work through some of the GUI elements. They still look fugly, seeing as I use a grand total of 3 textures for the whole interface, with various stretchings and such applied. (4 textures if you could the default textures in the entry level)

: However, I've got some stuff made for all of the major areas. I got a start on the video settings area, enough that you can set your resolution and color depth at least. Detail level controls and audio controls will probrably come soon. I've had to struggle with this because a lot of configuration stuff is stored in playercontroller/player/playerreplicationinfo, which I don't use except as a glorified camera. Unfortunately, since there's a lot of native stuff involved with those settings it makes it a bit trickier.

: I also had a nifty ambition to make more customizable characters but it's hit a bit of a snag as well. I was going to have it be something like UPaint, only a bit more structured. For instance, you could select, say, a piece of armor, and change it's coloration and markings and whatnot. The original texture of the armor would be preserved, you'd just more or less draw &quot;on top&quot; of it.

: Unfortunately, I realized today that skeletal meshes have cylinder collision, so that way won't really work. I've considered making them ragdolls, which would give better collision so I could trace and see where you were trying to draw, but that still might not work that well because I'm not confident that it will return the correct Material from the trace function. I think that might only work on BSP. Maybe I should test it though.

: At any rate, it's also an issue because it means I won't be able to use &quot;regular&quot; models. I would like for players to be able to just download a mesh from polycount or wherever and use it, but this system may not be very compatible with that sort of system. One would likely have to have made the model for the mod in order for it to work. Models made for my mod could theoretically still be used in UT2003 with a small mutator, but not really the other way around.

: For that reason I've decided to leave that idea on the backburner for a while and just sort out some other menu stuff. I'm a bit unsure what to do next game mechanic-wise. I don't really feel like it's ready for full-blown content creation but yet I can't think of anything that still needs to be done. I just have that feeling that it's not ready yet.

{{classbox| November 10th, 2003}}
: Implemented a neat feature, in my opinion. The effectiveness of a weapon is now related somewhat to it's configuration. IE If an energy weapon is starved for energy because the generators are not large enough or they simply can't (for whatever reason) get the energy into the energy weapon, that weapon will not fire as fast. Weapons also have an internal energy buffer, so they can fire in bursts if fully charged. Basically it works like so:

: Every time the weapon fires, it drains energy. The weapons have a very short mandatory cycle time before they fire again. However, they can only fire if they have enough energy to do so. All weapons have an internal energy buffer so they can often fire several times in quick succession without any external energy source, but the internal buffer doesn't hold a lot of energy. Once the weapon fires, and is no longer at full energy, it will start to siphon energy from things around it. The more abundant energy is in the things around it, the more quickly it will be able to replenish it's energy. The more quickly energy can be replenished, of course, the longer the internal buffer is going to last. (the reinforcement of energy helps it in it's &quot;uphill battle&quot; against the consumption of energy by the weapon.) Eventually, if energy is abundant enough, the energy may be able to be replenished faster than it is being consumed, so fully-automatic fire will be possible.

: This adds an additional design consideration. The farther the generators are from the weapons, the longer it's going to take energy to get there, thus the weapons will not perform as well. Also, there is a tradeoff between energy and weaponry. If you have too many weapons and not enough generators, your weapons will not perform as well, whereas if you have a lot of generators and only a few weapons, those weapons will be &quot;supercharged&quot; with all the excess energy. Kind of a quality vs. quantity balancing act.

{{classbox| November 11th, 2003}}
: I implemented a shady &quot;hack&quot; to overcome a wierd problem I was having with SetLocation. Hopefully I can find out why it wasn't working as I expected before. The system I have now isn't really a hack, per se, just a system that I don't want to use. Before, I had an actor that was created, and then moved itself to the location where it was supposed to be. This didn't seem to work though, so I implemented a static function that finds the location it's supposed to be, and then it just gets spawned in that location.

: It seems elegant in theory, but it's needless duplication, as I also have a non-static version of the function which is almost identical. I don't want to use the static function for both though because it requires some additional parameters. Also, it doesn't fell right, because it's conceptually an &quot;instance&quot; function. In this instance you have to supply as an argument the rotation that it is going to have when created in order for it to give back the results. I also don't feel right about it because it works in the editor, but in the game, which uses the exact same actor to spawn the ships, it doesn't work. It's crazy like that. :rolleyes:

{{classbox| November 15th, 2003}}
: I've been &quot;renovating&quot; the code and package structure to move things to where they are a bit more appropriate. There was some stuff kicking around in the base package that was a bit more specific so I moved it out, also I redid the input handler because it was a bit ancient. Originally I had a buffered input system that was going to get sent over the network, but I've since found that that system is not particularly efficient so I converted it so inputs were not buffered and instead handled immediately.

: However, that conversion was still that: a conversion of a different system. To clean it up a bit I just rewrote the whole thing. I also moved most of the functionality into the &quot;HumanPlayer&quot; class. (something akin to playercontroller)

: Most recently I've been pondering on a way to have two GUIs running simultaneously. Basically I was thinking I could make the HUD and scoreboard just another type of menu, which would allow them to use the same skinning system as the menu. (Which is pretty flaky right now but whatever. :P) However, being that it was the GUI I designed it fairly invasively so I'm not sure how well it would handle running side-by-side with another GUI.

: I've also encountered a bit of a &quot;problem.&quot; It's more a design consideration really. That is, the matter of scale. Realistically, futuristic space fighters would probrably go blindingly fast. This poses an obvious problem as your target would go from the horizon line to behind you in a fraction of a second. Obviously, that would make for rather boring ship combat. However, having the ships at a speed that's &quot;fun&quot; makes them either rediculously slow, or rediculously large. Given that they are scaled appropriately to persons on foot, that makes them really slow.

: I'm not sure if that's really a bad thing or not, but it might be. A lot of people complained about UnrealSpeed because the cars didn't go that fast - when the speedometer was reading over 100MPH, your car was moving along at about 40 clicks. (Similarly, the scout in homeworld allegedly travelled at 1050 m/s and the probe at 4km/s, but noone complained then. :rolleyes: Then again, the size of the fighter craft compared to the capital ships, and the size of the capital ships compared to the windows on those capital ships, suggest that the fighter craft in homeworld were about the size of an apartment building, while the larger capital ships approximated a city block. :rolleyes:)

: Anyways, I need to cook up a good premise for why the ships would be so slow, but so far I haven't really come up with a good one. I could say it was masses of ablative armor to cope with the power of futuristic weapons, but that feels like a cop-out to me.

{{classbox| November 17th}}
: I've been feeling some apathy towards coding lately so I'm trying to get something a bit more polished and professional looking. The game mechanics seem to be mostly done. Or so it would seem. I can't really think of anything that's missing, at any rate.

: In my attempt to do that I've been playing around with the scoring system. I'm stuck between two ideas: having fixed ship values or having flexible ones that affect your scoring. IE There could be a limit set for the game, whereby no player could spawn with a ship that was deemed to be beyond a certain power level. This however poses a slight problem in that it promotes reckless agression - the faster you can destroy your ship, the sooner you'll get a shiny new one. This also poses a problem in that you can spawn, suicide your cockpit into something leaving the rest of the ship reasonably intact, then destroy the remainder of your own ship (which can't exactly fight back at this point) and collect the points for it. I could penalize players for suicides, but I don't really want to do that because often your ship will be extremely crippled and there will be effectively nothing you can do, except possibly spin around in a circle with your one remaining thruster. In those situations, suicide is expected.

: The other system is geared more to a kills:death ratio, while factoring in the cost of your ship. When you spawn, you lose an amount of points equivalent to the &quot;value&quot; of your ship. When you destroy or damage enemy ships you get a proportion of that ships &quot;value&quot; back in points. Therefore, players who kill about as often as they are killed will have a score around 0, players who kill a lot and are rarely damaged will have positive scores, and players who get slaughtered like lambs will have a negative score. The problem I see with this is, (as some people feel is the case with existing gametypes) a small difference in skill may lead to a dramatic difference in points. Also, evenly matched players will end up in a virtual deadlock, both unable to accumulate enough points to end the match.

: I'm thinking I may be able to combat that, however, by having ships worth their value in points, and the player themselves worth something. Therefore, the bulk of the points will come from destroying opposing PILOTS, instead of from destroying the bulk of their ship. This would also help prevent a pileup of crippled ships, as there would be a strong incentive to finish off the cockpit. Presently, the cockpit is a secondary target, as it is relatively low value and fairly heavily armoured. This leads to a strong tendancy to attack the engines, then engage the immobile, (and now helpless) target and rip their ship to smithereens. Once the bulk of the superstructure has been destroyed, however, it requires too precise of shooting to mop up all the stray bits of debris that are left over, and usually one of said bits is the cockpit. This &quot;soluttion&quot; however, poses a new problem - that is, a player could suicide directly before they were finished off, thus denying the would-be killer the points.

: I could substitute when you suicide - when you hit the suicide button, instead of self-destructing the cockpit, it could just respawn the player and substitute in a passive AI that just waits to get killed. That way the would-be killer still collects the points. But wait - then we're back to square 1 - a player can spawn, suicide, then kill the defenseless ship they just suicided from and reap the points. Maybe I could make the AI temporarily be on the same &quot;team&quot; so it would count against you if you killed your own stand-in. Hmmm..

{{classbox| November 18th, 2003}}
: I felt that the effect for the lightning gun was a bit lack-luster so I set about trying to make a better one. Unfortunately, I hit a bit of a roadblock: apparently, emitters can't use materials, only textures. That is a shame because I could make a much fancier effect without straining the system if I could use a Combiner as the texture for the beam effect. Unfortunately, that doesn't seem like it will be an option so I'd have to come up with another alternative, or something.

: That was a bit of a diversion from my mod, but I'm not really sure what I want to do with that next so it's kind of sitting on the backburner. I think I've been coding too much because it's started to creep into my conciousness at all times. For instance, last night I tossed a plastic bag into the cardboard recycling, but instead of saying &quot;Oops, that's the wrong container,&quot; I said &quot;Wait a minute, that's not going to compile.&quot;

: I also forgot to mention, I'm at a bit of an impasse with the mod AI-wise. The AI sucks, but multiplayer is a long, long way off. (I won't implement multiplayer until the botmatch stuff is finalized.) I need a way to make the AI better, but I'm not really sure how I can go about doing that. The AI isn't bad on larger ships - only on the fighters.

: Capital ship combat is not too difficult for the AI. The target is fairly large, and coupled with turreted weapons it is virtually child's play to engage an opposing capital ship. Even attacking fighters is rendered much simpler by the availibility of turrets. Gunships are also generally armed with either turrets or homing missiles, making aiming much simpler.

: Fighters are a different story, however. When your guns are bolted to the frame of your fighter, suddenly the dynamics of your craft come into play in a big way. If the ship is slightly off balance, you're going to have to compensate by leaning toward one direction or the other. (the &quot;crab&quot; technique) This of course is massively complicated to the AI. It has to adjust it's aim to compensate for any imbalance on the ship. (which is a given once a few hits have been taken.)

: The system that I have now works &quot;decent.&quot; It works decent, in that it '''works.''' However, the AI is relatively slow at acquiring a target, compared to a human player, and is next to hopeless against a moving target. This is because it's current system works by making minute adjustments to it's aim until eventually the guns are lined up. IE, it uses a formula to determine theoretically which direction it would have to aim, then when it's aiming that direction thinks &quot;I'm aiming where I theoretically SHOULD be, but my guns are aimed below the target, so I need to adjust upward.&quot; In theory that system is good, but it's sort of delayed gratification, and difficult to track an evasive target.

{{classbox| November 21st, 2003}}
: Did some various diagnostics to find out why my mod was running too slow, and I found a couple of interesting things:
# The script uses a lot of time, about 15ms per tick per complete ship. This is of course on my POS computer so take that statistic with a grain of salt. The time taken is directly proportional to the number of ships. Though this is steep compared to the script time for most mods, one must also consider the sheer amount of math that takes place - computing engine thrust vectors and throttle levels is not as quick as one might think when you consider that the system must acommodate thrusters placed in any location and any orientation, even the most bizarre ones.
# The Karma simulation, which I suspected as being the main culprit of the slowness, actually only takes about 7ms per ship.
# The static mesh collision checks appear to grow exponentially with the number of ships and appears to be the main cause of the slowdown.
# My interactions are taking about 10ms of each tick. That is insane, but appears to be an artifact of the way interactions are implemented, rather than any fault in my specific interaction code.
# About 35ms was spent rendering, except when I riddled a fuel tank full of holes and fuel started streaming out. The particle systems involved caused the rendering time to skyrocket in excess of 100ms just for the particles. I'll have to rework those effects to be a bit more friendly.</text>
    </revision>
    <revision>
      <id>3248</id>
      <timestamp>2004-03-18T20:37:05Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Archived stuff.</comment>
      <text xml:space="preserve">{{classbox| August 2nd, 2003}}
: Most of the personell/boarding actions stuff is completed. The AI is a little lousy, but since I haven't finished the ships the bots lack any real direction. They just roam about, blowing the living crap out of anything unfriendly that gets in their way. I noticed that having dozens of karma ragdoll carcasses littered about had an effect on the framerate, but then again, my computer isn't that grand.. it doesn't even meet the &quot;minimum&quot; specs for UT2003. The combat patterns of the bots are also relatively predictable, but I believe this is a result of the shoestring path network I made. I was going to add a couple of gametypes for just the &quot;on foot&quot; stuff and try to get that polished up and working perfectly for phase 2 of the MSU contest. I may instead forge ahead and make the ships, but I am worried that I will not have them ready in time for phase 2, and I'd like a shot at some free money.

: On an unrelated note, my ability to make good textures for particle effects does not appear to exist. I may try to recruit someone to do this when the mod is more complete. For now I'll be satisfied with ugly bars for laser beams and abrupt squarish things for the &quot;coronas&quot; created by said lasers. Fortunately, the Kinetic Rifles look pretty decent, making fancy hollywood style plumes of debris and dust expelled from the walls/floor/etc. on impact. I'm somewhat disappointed that FPS' just use sparks for this. They've obviously never seen WWII movies. Impacts are supposed to cause a plume of dust, (in games and movies) darnit!!!

: An ironic note: A while ago I abolished and removed the &quot;actions&quot; system, preferring to use my &quot;inputs&quot; system for everything, since the two can be converted to each other fairly easily and inputs take less processing to generate initially. However, &quot;actions&quot; is definately more tangible to the AI, now that I've come to writing the AI with more complexity. Actions also replicate marginally better because sometimes &quot;inputs&quot; have no effect, while &quot;actions&quot; always do something.

: I almost forgot: I'm having difficulty deciding whether or not to use Karma for the ship physics. On the one hand, it will definately be better than whatever system I would use to replace it. That's the upside. The downside to Karma is that it drains resources if used with lots of simulation. If each ship has one engine, generator, a cockpit, loading ramp, a couple of guns, plus extraneous armor plating, etcetera, that's looking at 10 or more Karma simulated actors per ship.. more for larger ships.

: Also, though UDN claims that there is a hard limit of 200 on the number of Karma simulated actors, however I have performed an experiment and found that this is NOT true.

{{classbox| August 4, 2003}}
: Initially appearing to be a bad thing, a change that I made caused all havok with the rest of the code. After tracking what the problem was I revealed a dormant bug that had been released through the expansion of the code. I'm not exactly sure why that didn't cause crashes before, but it had something with no KParams attempting to block Karma objects. This has now been fixed so I can get back to finishing up redoing the input stuff or alternatively working on the vehicles.

: Replication is being a nightmare. Specifically, the notion that things may arrive out of order. I figured this would be easy to work around.. I can just put anything that must arrive in a given order in a struct along with a timestamp and they can be sorted by their timestamp so they are recieved in the correct order. However, this actually will not work on a network with latency because the packets recieved out of order will be processed before the other packets arrive, thus they will already be gone by the time we want to sort. The only way around this would be to place a delay on incoming packets, but that would make the network appear slower. An example of the problem I'm having: Player A strafes left, strafes back right, then stops. Seems simple enough. But the movements arrive out of order. Player B percieves this as strafing left, stopping, and strafing right. Though Player A is standing still, the pawn continues strafing right endlessly on Player B's machine. For obvious reasons, this is a problem.

{{classbox| August 5th, 2003}}
: Wrote up some code for triggers inside of vehicles so you can assume control of the vehicle by walking up to the wheel/joystick/buttons/whatever kind of controls it has. Also added the keybind to leave the vehicle and one for self-destruct, though that one was mainly just to test to see if the controls were working.

: A perpetual thorn in my side, two parts of the walking physics need to be redone: stairs and the surface detection. It turns out that the surface detection does not work very well on TerrainInfo surfaces. It &quot;works,&quot; but sporadically flickers on and off, so the pawn more or less just stumbles and trips as they walk. The stairs need to be redone as I've found that they allow you to &quot;pass through&quot; sloped walls to an extent. Fortunately each of those things is contained to a single function each so there's no loose ends that need to be tied up once I've figured out a better way to do them.

: For the remainder of the day I'm probrably just going to try my hand at making a nicer ship model.. one that isn't just a cone with a subtracted cube. :P

{{classbox| August 6th, 2003}}
: The UnrealEd Goblin has bitten me in a way I never suspected. FClamp has ceased working properly. I didn't think something so simple and so commonly used could simply cease working for me. It still works in other classes, just not MY classes. FClamp is acting the same as FMin, that is, it will return the first value if the second value is lesser than it, however, it totally disregards the third value and will gleefully exceed it. I could just write my own FClamp function, but really, this is rediculous.. I can't see how a function like FClamp could suddenly just go wrong like that!

{{classbox| August 7th, 2003}}
: FClamp still doesn't work. I can live without, I suppose. Now that I'm not on vacation anymore I don't have as much time to code. On the upside, however, I'm going to be going part-time soon so in theory I'd have more time. However, that will be short-lived as the reason I'm going part time is to go to University in the fall.

: Wrote my own coordinate rotation operators because the native ones weren't cutting the mustard. They didn't seem to be particularly accurate, although they were still half decent. I'm in the process of cooking up a scheme for the controls of the ships and whatnot. Jets are back in so the flying warehouse is a bit more mobile. I'm going to get the controls going smoothly and then I'll add weapons back in. The modularity is really starting to shine through, which is good. When I wrote the code for walking personnell I put in all of the hooks I would need for vehicles, so the going has been swift.

{{classbox| August 8th, 2003}}
: Not much to say so far since I just got home from work and I'm headed for bed, but I thought I'd put this note here anyways. I just had an idea but I'm probrably going to forget it when I go to sleep. To that end I'm putting a note here. A hypnotist taught me a neat memory trick. Because I am thinking of my idea while I write this, when I read this tomorrow I will recall that idea. Let's see if it works.

: It worked. While reading [[Legacy:CorDharel|CorDharel]]'s [[Legacy:BioRocket|BioRocket]] page I got an idea. Originally I thought that the intent was to create a rocket launcher with a biological warhead, IE it flies like a rocket and on impact splatters the bio goop. That sounded like a neat idea but after reading the page it turned out that wasn't quite what he had done, so I decided to make the &quot;BioWarhead Launcher.&quot; It's a bit of a diversion from my main project but it only took an hour to make so it can't be too bad. It effectively extends the range of the secondary fire of the biorifle, so it might present a balance issue, but the secondary fire of the biorifle is only really useful for charging up before a confrontation or during a lull in the action anyway. With high speed rockets it may be useful as an alternative sniper weapon.

{{classbox| August 10th, 2003}}
: Things have been very slow going with the vehicle code for today and yesterday. Why, oh why did Epic not include a KConstraint that just sticks things together? One would think that the simplest type of contraint should be one that allows no movement and basically just attaches two KActors together. Unfortunately there is not only no constraint that does this, but no constraint that is easily modified to do this. Strangely enough, though the KCarWheelJoint constraint demonstrates that the engine supports it, there are no linear constraints, like springs or just string type constraints. These could be custom coded, but unfortunately due to the highly native nature of constraints, custom scripting constraints is limited.

: Following is the code I have written for a rigid constraint. With the latest update, it appears nearly flawless. It's a bit hacky, but a clever solution if I do say so myself, which I just did.
: &lt;uscript&gt;
///// Rigidly affixes two karma simulated actors together.
///// Written by Foxpaw.
///// If you use this, please give credit. If you do not, I may eat your children*.
class KRigidJoint extends KHinge placeable;

var KRigidJoint Slave;

simulated function PostBeginPlay()
{
  if ( KConstraintActor1 != None || KConstraintActor2 != None )
    Initialize( KConstraintActor1, KConstraintActor2 );
  Super.PostBeginPlay();
}

simulated function Initialize( actor A, actor B, optional bool bIsSlave )
{
  if ( Slave != None ) Slave.Destroy();

  SetPhysics(PHYS_None);
  KConstraintActor1 = A;
  KConstraintActor2 = B;
  SetPhysics(PHYS_Karma);
  
  if ( !bIsSlave )
  {
    Slave = Spawn( class'KRigidJoint', self,, Location, Rotation + Rot( 16834,0,0 ) );
    Slave.Initialize( A, B, true );
  }
}

simulated function Destroyed()
{
  if ( Slave != None ) Slave.Destroy();
  Super.Destroyed();
}

defaultproperties
{
  bKDisableCollision=true
  bKForceFrameUpdate=true

  bStatic=false
  bNoDelete=false
  Physics=PHYS_None
}
&lt;/uscript&gt;
: This can be set up in a map or spawned in real-time. If you spawn it in real time, you must call the initialize function and pass references to the two actors you want constrained. For the time being this does not allow for constraining things to the world, though that would not be difficult to do. (However, I would question the value of constraining a Karma actor rigidly to the world, since then it wouldn't be able to move or rotate at all anyway.) The bKForceFrameUpdate will make you life much, much easier if you plan to set up the constraint in real-time. If you will only be using it in a map you can leave that false. At some point I may make a bunch of Karma constraints and package them so we won't have a myriad of custom constraints floating around embedded in maps taking up space. If you do use this in a map or mod please credit me for it and please ask if you would like to use it in a commercial application.

: Earlier today I was attempting to make a wrapper for KTire to use with my mod. Though KTire would have been better implemented as a subclass of KarmaParamsRBFull, it was instead implemented as a subclass of KActor, meaning that if you, for instance, wanted a pawn that rolled along the ground like a tire, you can't use the native tire simulation. This is curious because the Tire simulation is simply a special type of simulation and as such should belong in the KarmaParams, instead of having it's own class. Regardless, it was not coded that way. I was attempting to wrap the tire and basically use the tire wrapper to maintain compatibility while using the actual KTire for physics simulation. This did not pan out due to the fact that I cannot have an invisible, non-blocking Karma object, and if the wrapper is not designated as using PHYS_Karma, it will not recieve the configuration for Karma physics, which it needs to pass on to the tire. Instead of wrapping the tire, I've decided to make my own. I don't know how well it will work, but time will tell I suppose.

{{classbox| August 16th, 2003}}
: I haven't done anything with my mod for a few days, unfortunately. I started playing with the tires again and I've decided to axe them for the time being. They have an acute tendancy to get &quot;lodged&quot; in the ground. The native tire simulation does not have this problem, of course. I'm likely still going to have &quot;tires,&quot; but they will not use a physically accurate tire model, and rather be powered purely by impulse.

: Aside from that, I'm still working on a good method of controlling. I've got it working half decent, but it still isn't really what I wanted it to be. I'm hoping to put up screenshots once I've got a test vehicle that isn't so ugly. It's been transformed from a flying warehouse to a flying warehouse with warp nacelles glued on the side and a big cannon glued on top. While testing the wheels, it also had wheels on the side.

: Hours later... brain is burning. I need to come up with a scheme to control the firing of various thrusters on the ship to attain the desired orientation and velocity. The problem being of course that said engines can be at ANY angle, ANY location relative to the center of mass of the ship, and the desired orientation can be ANY angle relative to the center of mass of the ship as well. As you might imagine, trying to compute which engines should fire to create the desired angular velocity is.. trying, to say the least. I believe I have a partial solution, or rather a partial visualization of how I need it to work. I am going to need to use some kind of a plane that represents the cutoff of where the engine will be able to produce useful output. This plane needs to pass through the center of mass of the ship and I believe that it's orientation will be in some way related to the rotation of the ship. A vector made from the desired orientation can then be measured to see which side of the plane it falls on. The only problems being:

* I don't know how to determine what side of a plane a given point lies on. I think I could make a coordinate system from the plane and use coordinate rotation to do this, but that's a pretty big &quot;I think.&quot;
* I don't know how to determine the heading of the plane. I believe it needs to be parallel to the vector rotation of the engine, but that's just what seems right to me.

: My current idea is maybe a bit easier and maybe more efficient. I think that I can find a line perpindicular to the vector rotation of the engine that will intercept the vector rotation of the engine when centered around the center of mass of the ship instead of the engine. I can then take the normal of that first (perpindicular) line and use it to find if the vector of the desired heading is within a 90 degree cone from the normal of the perpindicular line. I'm pretty sure I learned some formula to determine where two lines will intercept in Grade 9, but I don't remember it, so I'm trying to think if there might be an even easier way to find the normal. Since all I really need to trace the intercept for is to determine that I actually have the correct perpendicular normal, I may be able to forego that entirely.

{{classbox| August 20th, 2003}}
: Engines and turrets are going nowhere. Something simple is eluding me, but I can't put my finger on it. They both &quot;work,&quot; but the control system that I was planning to use has to do some kind of computation, and I don't know what it is. I'm positive it's somehow involved with coordinate rotation, but I can't put my finger on it. Of course, it's kind of hard to play around with stuff when your engines can't do anything except propel you straight forward. I may write a short &quot;hack&quot; to handle the flight controls until I can figure out the proper functionality. I really want to have something to show for the MSU Phase 2.

: A friend of mine saw the movie, Freddy vs. Jason, and now he's obsessed with the idea of me making a mod for him based around serial killers/horror icons. :rolleyes: Once mine is fairly stable it wouldn't be a difficult extension, but still, that's not my bag, baby! :P

: The controls are still.. yuck. I wrote the hack to get the engines to work. (not properly, I'm still figuring that out, but it works for experimentation) I can now see why astronauts have to train so much. :P My attempts to fly resulted in much spinning, and me being tossed around in the cockpit trying to maintain control. I think I may need seatbelts or some type of restraints. Eventually the thing was spinning so out of control I got flung into a wall really fast and jibbed. I guess it's a better way to go than getting thrown out the open hatch. :rolleyes:

{{classbox| September 3rd, 2003}}
: First day back at University. There was lots of foxy ladies there, but unfortunately, none of them are in senior level computer science. :( In other news, I've been spending the last week racking my brain trying to figure out why the engines weren't working right. Turns out that the vector I was using that was supposedly the desired rotation.. wasn't actually the desired rotation. I don't know why, since it's code is seemingly identical to that of the targeting reticle, but if I use the actual location of the targeting reticle it works. Go figure. The cameras still don't work though. I went over the vehicle code again and found that it doesn't even reference the camera, except in superclasses, which work fine. It's possible that I forgot to call a Super function in one of my functions, so I'll probrably take a look for that later.

{{classbox| September 4th, 2003}}
: Figured out what was up with the camera. Turns out I had the operator precedences messed up. I wrote a custom operator a while ago and it turns out that it was getting evaluated after +. This realization happened while screwing around (a good way to find bugs, in my opinion) and I noticed that the camera actually was moving, (it was hard to notice, what with being in space and all) just not in the way it was supposed to. A set of brackets later, the camera and the jet's controls seem to be working.

: UPDATE: I spoke too soon. The jet's controls actually don't work properly, they worked in that configuration but don't work in all other configurations. It's quite frustrating. Stupid rocket science.

: In other news, the turrets now appear to be working, which is cool. Turrets can also be &quot;stacked&quot; to provide greater freedom, though this can look a bit odd. This could probrably be rectified but I don't know if it should be. Right now each turret attempts to face as close as possible to the &quot;desired&quot; heading. In a sense this is better because it means that your guns are better aligned while the other turrets get into position. However, it does lead to some backtracking which could mean that the turret would take longer to get into it's final position. It also doesn't look as cool. As soon as I get the jets working 100% I'll be able to start doing &quot;fun stuff&quot; again and maybe make a better looking ship model.

{{classbox| September 5th, 2003}}
: While experimenting, I found something that worked extremely well. Unfortunately, however, it doesn't work the way I actually intended it to. It works better. In a way that's good, however, it's probrably not good that I don't understand how it's doing what it's doing. The part I'm referring to is the engine controls. They now seems to be firing as if they somehow magically knew what to do. Though that was kind of the idea, the notion of having &quot;overlap&quot; where an engine would still fire even though technically it was outside the zone that it should (to produce smoother manuevering) seems to be operating despite the fact that I didn't yet implement it. :roll: Tomorrow I'll throw in some debug statements and see where it's going wrong.. or going right, however you look at it.

{{classbox| September 6th, 2003}}
: I found out what was going on with the engines, and got them working pretty decent now. Decent enough to do some manuevering anyway. I want to make the manuevering a bit gentler, since right now the engines will only toggle between full throttle and no throttle. I'll likely add something proportional to the engines, but the only issue I can see there is that &quot;thrusting&quot; engines require the opposite proportionality as &quot;manuevering&quot; engines. Manuevering engines should taper off as the ship approaches it's desired heading, while the main thrusters should start to pick up at that point. Thrusters should also be less discriminating about when they fire, because the rotation they impart to the ship is less critial. To resolve this I'm going to assign a &quot;manueverability&quot; value to each type of engine to dictate it's behaviour.

{{classbox| September 7th, 2003}}
: The jets are running a bit smoother, and I changed the controls up a little bit so they are a little fancier too. I think there might be a slight bug in them but I don't know if I'll fix it or not. The view kind of &quot;drifts&quot; around the ship when you aren't moving the mouse pointer. It shouldn't be hard to fix, but it looks kind of cool anyway so I might not worry about it.

: I've been feeling that so far I don't have much to show for my efforts because most of the stuff I've written so far is abstract. To that end I've slapped together a stationary pillbox to show off my fancy vehicle technology. Although the pillbox doesn't move, it does have the full benefit of the vehicle code that I've written, so you can do cool stuff like.. well, stand inside and shoot out the windows. It also has a gun turret on top and you can stand inside that as well. If you like you can peek out the hatch and shoot at people without leaving the turret. However, seeing as it IS a gun turret, some would question why you would want to do that. It's mostly for the &quot;look cool factor&quot; at this point. Although a vehicle would probrably have been way cooler, I'm not much of a modeller and a pillbox doesn't call for a particularly complex model, so that's why I decided to make one. Considering that it's texturing is just one texture plastered over the entire model I think it looks pretty half-decent.

{{classbox| September 8th, 2003}}
: Figured out what was causing the drifing of the view. Though cool looking, it was a severe pain in the butt trying to aim at distant targets, plus the &quot;why&quot; of the bug could have led to problems in the future. It resulted from an earlier &quot;bug fix&quot; that I've now fixed in a different way so as to avoid that problem.

: I'm also going to remove the MeshController on vehicle components, but keep it for people on foot. It is a system somewhat equivalent to having various player models using the same class for all the code. However, my mod has some information attached to the models, much like the species code. To that end, I made the meshcontroller class which sets your mesh, and takes care of all that goodness. It also handles the fancy skeletal aiming, so you could freeze gameplay and trace a line (barring inaccuracy inherent in the weapon) to predict where the shot would land. Basically it's just eye candy. The ships, however, don't really need that functionality because what with their Karma parameters and the fact that a given mesh isn't likely to be reused by different components, I decided to move that functionality back to the actual component classes. I found it quite a pain to have to make two classes for each component.

: I've also refined the controls somewhat and made a few assorted improvements to various classes. I also crushed a simple bug that I hadn't gotten around to fixing, and streamlined the function it was in while I was at it. I expect to put up some screenshots soon.

{{classbox| September 12th, 2003}}
: I meant to put this up last night, but I was having some problems with either the UnrealWiki or with my ISP, I'm not sure. At any rate, things were going super slow, so I decided to leave it until today. I took a few screenshots, but then I realized that most of them weren't particularly relevant, so I just left the one screenshot to show off one of the fancier features of my mod.

[[Image:Legacy_FoxpawsTurretScreenShot.jpeg|center|This is actually a stationary pillbox and gun turret, but it's running on the vehicle code. It just doesn't have any jets/wheels/any form of locomotion. As this picutre illustrates, you can fire out of firing ports on the vehicles and fire into them from the outside, though it's understandably more difficult to hit through from the outside. The gun turret on the outside can also be rotated and fired at things.]]

: Unfortunately, although I made this pillbox/turret combo mainly for the purpose of showing the configurability feature of my mod, when I made it I found that I couldn't really make much in the way of variants from that system. That is to say, there's not much USEFUL variation you can make. Because it's stationary you need a turret if you're going to hit anything with it, and you can't really get away with taking off the guns. To that end, I'm making a new spacecraft model that should be somewhat configurable, and I'll try to come up with a way to configure the pillbox differently to show off that feature of the mod. It is kind of like the premise, after all. :P

{{classbox| September 14th, 2003}}
: Made a few miscellaneous improvements, adjustments and so forth. I moved the turret calculations out of the turret constraint and into the turret actor itself, removing some redundancy, and I also made the driving code a bit more abstract so it was more amiable to being driven by different types of actor. The aiming stuff for turrets was a bit flaky before, (though theoretically it SHOULD have been sound, it didn't work that well in-game) so I've improved the aiming to make it smoother.

: Unfortunately, however, I'm wondering what I should do next. I need to make a new ship model to thoroughly test the configurability, but that's bogging me down a bit. I made the model but now I need to make a change to it, and making that change appears to cause havok in Rhino. When I made the original model (well, okay, I more or less ripped it off of homeworld, but still... :P) the glass over the cockpit was rigid. I want to separate it from the cockpit itself so I can make it swing open and close so that people can get in.. Unfortunately when I split the solid object that is the cockpit, Rhino ceases to recognize it as separate solid objects and now does not agree with me that the two objects are actually closed polysurfaces. Arr..

{{classbox| September 19th, 2003}}
: I wasn't sure what to do next, so I thought I'd do the front end for my mod. I want to make a new front end from scratch, but I'm not sure how to do that. Some GUI stuff is referenced from the .ini file, but I don't know if it has native significance or if it's just a reference to make things easier for the coders. I understand that UWindows was built off the console - so maybe I have to override the console and replace the console reference in the .ini file. Basically, I don't want Epics GUI windows to come up at all. Getting my own GUI to appear when I want it to is easy enough, but I don't know two things about the GUI:
* How it is loaded up initially when you start the game. Does the &quot;startup level&quot; (the nVidia logo) load the GUI somehow or is the GUI loaded by the engine through some entry point that I don't know about?
* When you hit escape, it brings up the &quot;quick menu.&quot; Is this simply a result of the GUI intercepting a console command bound to the escape key, or something else?

{{classbox| September 21st, 2003}}
: I decided to take a fresh stab at making tires. A discovery that I made along the way I thought would help me out: that is that a karma simulated object can have a static mesh for simulation and a different type of display. This allowed me to make the wrapper &quot;tires&quot; invisible, and use the KTire for the tire simulation. I was also going to use the KRigidJoint above to basically make the vehicle component be the wheel, and the KTire be the tire on it. This unfortunately, did not pan out, because apparently KTires are quite picky about what things are constrained to them. Instead, I decided to try my own proprietary tire physics and so far it seems to be working pretty decently. The tires start to bounce around a bit on the ground at higher speeds, but I think this can be fixed with tweaks to the suspension.

{{classbox| Septembter 28th, 2003}}
: Yowza, it's been a week since I've updated this. I've been busily making my own GUI, which has been slowed because I'm not much of an artist so I don't have any fancy textures to work with. I've also come upon a realization, which I found quite bizarre. Epic's GUI code is native, so one would think it would run quite a bit faster. Yet, my custom code, made in Unrealscript, runs WAY faster and UT2003 loads up in about half of the time too. This leads me to believe that not only is Epics/DEs GUI code loading up a LOT of stuff when you first load the game, but it also seems to be swallowing a lot of cycles somewhere. From clicking the UT2003 icon to the GUI appearing, ready to go, takes less than 2 seconds (including splash screen and all that jazz) on my computer.. which doesn't even meet the minimum specs for UT2003. Loading using the standard GUI takes over 5 seconds. :rolleyes: It's not that big of a difference, but still nice when you're loading up UT2003 once every minute or so for tweaking the location of interface bits.

{{classbox| September 30th, 2003}}
: I'm hereby expanding my Pawn rant to the GUI class as well. I've hit a major roadblock in trying to make my own UI. Apparently all the classes that deal with metaclasses (the map list, weapon list, character list, mutator list) are all 100% bonafide native and firmly lodged in the GUIController class. Now I'm going to have to pollute my fancy AI with a hacky workaround to access those lists by creating a dummy GUIController. :( To add insult to injury, UT2004 promises a new UI which will probrably be incompatible with the current system.

: Having said that, I have managed to wrangle the GUI system into having a &quot;dummy&quot; GUI that creates my real GUI. It was quite difficult because although the GUIController is an interaction, it does not get ticked even if you have bRequiresTick set to true. Further, it is created pretty much before anything, and in most of the events called on it, a viewport hasn't even been created yet! This causes an obvious problem, as if the GUI is going to draw anything, it needs a viewport to draw it on. Fortunately there is one event that is called just after the viewport is created. Unfortunately, there's still no controller attached to that viewport, and no level, pretty much no nothing. :P I've worked around this by having the GUI create another interaction (which will get ticked) and have that interaction do the actual initialization in IT's tick function, allowing me to do the initialization after everything is already loaded up and ready to go. DE works around this by distracting you with a video of Gorge. :P The CinematicGame gametype of that gorge into (and the various replacements I've seen floating around the internet) calls back to the menu when it completes and the menu then goes into full-blown operation.

: In other news, I've been having to get back into programming in C and Java lately what with school and all. It's then that you really appreciate UnrealScript. When I went to University initially, all you had to do was make a source file and compile it into an executable. Nowadays, they've got all this garbage with &quot;solutions,&quot; &quot;projects,&quot; and settings that don't actually exist anywhere in the source, only in menus from the IDE. I think that's all senseless. I really don't need 4 files to make a hello world program in C. Even Java won't compile cross-platform without complaint anymore, thanks to individual IDEs storing their own garbage in with your source. I wish there was a way to compile Unrealscript to standalone executables.. Mmmmm, that'd be fancy. Did I mention NetBeans hijacks portions of your code and will not let you modify them under any circumstances, instead preferring to use it's own generated code (on which the formatting is yucky!)

{{classbox| October 1st, 2003}}
: The GUI system is my unwitting slave. Muahahahaha! My GUI can now load maps with a selected gametype, and all the hooks are in there for me to speedily write the other junk, as soon as I decide what other junk there is to be written.

: The future of bots for my mod is up in the air. There will definately be AI controlled pawns, but I'm not sure if I want them to have fancy names and specified accuracies and all that &quot;personality&quot; junk that UT2003 tries to inject into it's characters. I might not use any of that stuff, but I'm still deciding. On the one hand, it doesn't really hurt anything to have it there. But on the other hand, it does add complexity and clutter to the interface.

: Also, I've had a crazy idea but I don't know what to do with it. I was thinking maybe I'd just do away with people being in the ships altogether, and have them be like remote controlled fighter drone thingies. On the upside, that would be easier to make ships for, because they wouldn't require an interior. On the downside, it might not be as cool. Maybe I'll just include support for both.

: Further, I think I'm going to need to find some real optimizations for the ship physics, because I'm not sure the system can feasably handle that many karma actors. At first I figured it would just be the ships for the players, which is manageable, but now incorporating AI ships and whatnot, the numbers grow quickly: Suppose a simple outpost consists of 15 components. Some structural components, turrets, a few guns, some generators, and maybe a few bits for constructing other ships. Simple drone ships from it have a foreward chassis, rear chassis, engine, two stabilizers, two jets, a pair of guns, a fuel tank and a generator. That's 11 right there. (I think.) Now suppose there's 5 of those fightesr flying in formation. (55 + the 15 for the outpost.) The outpost has 3 formations garissoned and another 2 on patrol. That's approaching 300 karma simulated actors, about the limit of what my system can handle. Now suppose there's 5 starbases on a large map. :/ Granted, it's not likely every starbase would have a garrison of that size, but still. The potential exists for their garrisons to grow that large if the players are particularly bad at the game. :P

{{classbox| October 7, 2003}}
: Added an implementation for fins today. Though one could argue that a fin/aerofoil would be pointless in space, (and it more or less would) I added them because it makes the game so much simpler. You can rotate to face any direction with a mere 8 thrusters, but for smaller ships, I doubt players are going to want to place every tiny manuevering thruster. To that end, I've added a new type of vehicular component: astrofoils. They act kind of like a rudder in space. (there's no real physics behind that, they just do. :P) There's a bit of strategy to using them, of course, the faster you go, the greater force the astrofoil can exert to rotate the ship. Conversely, the faster you go, the greater drag will be placed on the ship while you turn (so you have to sacrifice velocity to rotate yourself using the astrofoils) Also, if you are facing more or less the same direction the fins are facing, they will act as a stabilizer, keeping you headed straighter. I've finally got a half-decent ship model imported, but unfortunately the textures on it are still ugly. The black chrome that looked highly cool on the target drones is quite unappealing on the fighters, so I'll have to come up with something else.

{{classbox| October 9th, 2003}}
: I've discovered something incredibly interesting in my studies at University. Turns out that eternal youth is not only possible, but quite feasable, so long as you ignore the moral implications. Just thought I'd tease you all with that. :D

: As far as the Unreal world goes, I got the astrofoils running a bit more stasble and I'm tweaking the interface some more. I'm not sure what I should do as far as the view goes. Specifically, if the ship rolls to be upside down, should the camera roll as well? It makes sense, but it can be disorienting. Plus, then your controls are all messed up, unless you also compansate for the controls, but that in itself also means that your controls will be severely messed up WHILE you are rolling. :/

{{classbox| October 11, 2003}}
: A GPF has been biting me but with no apparent pattern. It's something to do with a &quot;path&quot; but I don't know if that is a path as in pathnode, or a path as in file path or perhaps the path of an object in some kind of internal organizational tree. It's going to be difficult to fix unless it starts appearing with some kind of consistency. Until then I can't really do anything about it. I also found another error that was introducing a runaway loop condition. How it was doing that I don't know, but I've put in a safeguard so it won't happen again anyway.

{{classbox| October 12, 2003}}
: I found a way to speed up the Karma engine dramatically. It's internal collision engine runs EXTREMELY slow compared to a simpler collision system. This is very good considering my mod is very Karma-intensive. I sped it up by having the script determine what things are potentially colliding, and then disabling collision for everything else. This leaves the Karma collision detection with a lot less to consider, making it run much quicker. (My mod has some objects that may be in very close proximity for long periods, but they are in sync so they will never collide. The Karma engine, of course, does not know that.)

: The issue with that is: it's a hack. To put it in an appropriate place would require using nested iterators (yuck!) so I put it in the vehicle code instead, because it already has pointers to it's other parts (the ones that are very close but never actually colliding) so I can just disable collision directly. The reason why that's bad is, some parts of vehicles MAY collide with the vehicle (turrets for instance) and thus the disabling should not take effect for those types of objects. However, in proper OOP form, no class should have to know about a subclass of itself. (and turrets are a subclass of the base vehicle components)

: I have mixed feelings about that. It does run very fast, but it doesn't feel right. I'll have to see if I can find a reasonably fast way of doing it without requiring that exception.

: On the bright side, the mod is really coming together. The ship I've been using for experimenting needs a paint job before I dare to release screenshots, (:D) but it's got most of the finishing touches on it: roaring jet exhaust, muzzle flash on the guns, and, for added coolness, if it scrapes against something a pile of sparks comes off the point of impact. The controls seem pretty decent and the interface seems decent. Things are definately looking up, if I do say so myself. The only catch is, I don't really have much in the way of modelling skills or texturing skills or level building skills or sound making skills. I'll have to figure something out there. I'm a bit leery of trying to recruit people, however. This is my &quot;dream project&quot; and I've been working on it for a long time. This makes me wary of recruiting a team because:
# I don't want to lose creative control. I definately want people to exercise their own creativity in making parts packs, etc. but I'm still somewhat concerned that others may have a different vision of what direction they want the mod to take.
# Although it's not my primary goal, I would like to make a commercial incarnation of this mod at some point. That may be a while off, or it may not happen at all, but if it does, and some people on the team want to keep it free, there may be some legal issues around intellectual property. At the very least I'd have to remove their work, but they could likely claim that their work formed a synergy with the rest of the work and could not simply be replaced.
# Right now I don't owe anyone a mod. If for whatever reason I get busy or otherwise can't continue work on it, or simply decide I don't want to finish it, I can simply drop it and noone can blame me for it. If I recruit a team and they begin working on it, making content, etcetera, I can't in fairness stop working on the mod. So far I've invested a lot of time and effort in making it but it's still MY time and effort and if I should choose to let it go to waste by stopping work on the mod it's entirely my choice. When other people get involved, I would have an obligation to continue working, since I have no right to make their work go to waste as well.

: Right now I'm just using models ported from Homeworld, which is fine for testing, but I can't release them for obvious reasons.

{{classbox| October 16, 2003}}
: Wow. Looks like learning about database systems came in handy after all. I ran into a brick wall momentarily when I found the Unreal engine can't write a single config variable thats more than about a kilobyte in size. Seeing as how the vehicles were a veritable tree of components, I found that I was going to have to build a relational database to store my data in. Mmmmm, USQL... :P

{{classbox| October 18, 2003}}
: I looked at a few &quot;previews&quot; of UT2004 and something unsettling dawned on me. Maybe it's just my imagination, but the &quot;Onslaught&quot; gametype seems ALOT like Overload 2k3. Invasion seems very similar to Invasion for UT. I'd hate to level accusations but it almost seems like they might be drawing a bit too much inspiration from successful mods. Not a bad plan from a marketing standpoint, since it's already a proven concept, but still, it doesn't feel right to me. On the other hand I could just be imagining this or it could be coincidence. I'll have to wait and see if the same thing happens with future releases.

{{classbox| October 19, 2003}}
: I decided to redo the user interface from scratch. Mine was pretty good, but there was a little bit of redundancy which is certainately less than ideal. There was also a lot of settings that I was using in ways other than they were intended. This unfortunately was a consequence of Unrealscript not supporting multiple inheritance. I wanted menus to have the properties of a &quot;sliding page&quot; and of a button, but unfortunately that was getting far too complicated becase the way it was implemented then required a subclassed button and a subclassed sliding page working together in unison. Not so hard to implement, but a pain when you want to make the actual GUI, since you have to manage two sets of settings instead of just one. Now I've changed it to a system that seems to work a little nicer. I reworked it all to work on relative coordinate systems for everything, which makes it alot easier to have &quot;add and forget&quot; pieces to the UI. With the absolute coordinate system I was using before it was still pretty decent, because any calls to move things around were passed down the line so everything got moved by the same amount. (keeping all child objects in sync) This way I prefer though because it makes some computations faster and all around reduces complexity.

: I also downloaded the UnrealEngine2 Runtime to see what it was like, but I have mixed feelings on it. On the one hand, being free is neat because you can distribute your mod more. Also, a mod built on the Runtime is likely to be viewed more as a separate game rather than a mod, which might be good in some ways. The downsides to the runtime are that it's not valid for the MSU contest, though that's not that big of a deal; and that you have to rewrite everything. That's not really an issue for me, since the first thing I did when making my mod was make my own pawn classes, etcetera, so I could probrably (not sure if the meshes and whatnot would port 100%) plug my mod right into the runtime and have it work. I do think that it's still an issue though, because I expect a lot of people are going to see this engine and get a little too ambitious, which doesn't really harm me, but it's a shame because I think that alot of the projects attempted on this engine won't reach fruition.

Plus, mine boots in less than half the time of UT2003s GUI, and runs a lot faster. :D

{{classbox| October 23, 2003}}
: Overall a pretty productive day. I finally bit the bullet and did some work on the editor. After much progress, followed by frustration, followed by vocabulary expansion, I finally got it working pretty good. First FClamp went on me, then equals went on the fritz. That's right. Equals. The assignment operator. The following piece of code ceased to function:

&lt;uscript&gt;
ViewRot.Pitch = Grandpa.CursorX * Grandpa.PrimaryComponent.XScl;
log( (Grandpa.CursorX * Grandpa.PrimaryComponent.XScl) );
log( ViewRot.Pitch );
&lt;/uscript&gt;
: Believe it or not, the first log gives the correct result, the second log always is 0. Go figure. I erased the whole thing and tried a different approach, which worked pretty good. I'm glad I didn't start content creation yet, since now there's another bit of information that needs to be set up for each component. (I actually foresaw this from the beginning but wasn't sure if it would be a good idea. It takes away some flexibility from the user, but after a while I realized that if I didn't install a constraint on what sorts of combinations of parts people could use, there could be a great deal of &quot;cheating,&quot; in the sense of going against the spirit of the game. (Such as having a ship that's just a supercompressed clump of guns and such. Technically that would make you prone to area effect weapons, but you could cover a massive amount of components with a very small amount of armor, making your ship nigh indestructable.)

: I've also been cooking up a plot for the single-player mode. I think it's pretty good. I've decided to stray away from video-game stereotypes and make it more like a real-world conflict, where the &quot;good guys&quot; and the &quot;bad guys&quot; depends entirely on which uniform you're wearing. Of course, everyone has their view of what's right and wrong, and thus which guys are good and bad, but obviously the bad guys have a different view of right and wrong, right? Unfortunately, I don't think that many people would be able to adjust their mindset like that so instead I'm going to have a strong &quot;propeganda machine&quot; to make every race, other than the one you are playing, seem downright barbaric and murderous.

{{classbox| October 26th, 2003}}
: Don't you just hate it when a piece of code seems to be working but actually isn't? Turns out that a piece of code in the vehicle design area which appeared to be working properly actually was not working. It worked fine when I was making sensible designs, but then for the heck of it I tried to slap together the shoddiest piece of junkyard trash I possibly could and it turned out the code actually wasn't working in all situations.

: The most annoying part is it used to work 100% but I decided to change a rotator to a vector (since roll did not apply in this situation and a vector would be easier to specify). Unfortunately, however, this seems to have caused all sorts of havok and now it doesn't wokrk that well anymore. The locational attachment seems to work 100%, just the rotational is not always accurate. The issue I'm having is as follows:

: I have two actors, each of which has a &quot;socket&quot; on it. That socket can have any location and rotation relative to the actor to which it belongs. These sockets must be lines up so that they face exactly the opposite direction - so that one would &quot;fit into&quot; the other, as it were. The sockets cannot be rotated relative to their actor, and only the second actor can be moved.

: I used to have this working, but I replaced that code with new code which appeared to be working fine. (A couple days later I found out it wasn't) Finding the absolute rotation of the first socket is quite simple. Thus, finding the absolute location that the second socket should have is also quite simple (it's simply the inverse of the first socket's absolute rotation) Although it seems like it should be simple enough to then derive the rotation of the second actor from the relative rotation of the socket and it's absolute rotation, this doesn't seem to have been working.

{{innerbox| When in doubt, let the user figure it out!

}}

{{classbox| October 29, 2003}}
: I was going to post up some screenshots of some cool ships I made, but they were a bit over the maximum image file size for the wiki and I didn't really feel like cropping or resizing them tonight. They turned out pretty good considering that they are just the same 7 or so components rearranged. I also think I'm going to need to add in some design aids to make it a bit easier to design the ships. It turned out to be a bit difficult to line up guns on the ship for accurate fire by eye alone, so maybe I'll put in a sort of 3D grid with some axis indicators and maybe a line showing the heading of components, so you can be sure that your guns really are pointing foreward and your engines are facing more or less straight back.

: The lousy GUI keeps crashing, and I don't really know how to fix it. It's quite annoying. It crashes fairly frequently and is consistent, but it GPFs before it even reaches my code (the GPF is in the interactionmaster, but because it's repeatable it must be related in some way to my code. This is highly annoying as I doubt the end user will want to be restarting the game every couple minutes. Granted, it takes under a second from icon click till you're in the editor, but still, it's annoying.

{{classbox| October 30th, 2003}}
: AHA! I've said it numerous times before, but when you debug something, make sure the tool you are using to debug it is working properly first. Turns out that the stack trace provided on a GPF is not always 100% accurate, interestingly enough. Turns out there is actually at least two distinct things causing a GPF, but they were actually a consequence of my input system, not a fault in the Interaction Master as the stack trace suggested. (It said that execution never made it out of the interaction master, when in fact it had gone about 6 functions down the line when it crashed.)

: I trimmed the number of crashes to about half by simply changing a return false to return true in KeyType. Apparently, KeyType does not like inputs being left unprocessed. My loading function was still crashing but I did some tests and found it's actually something in the vehicle loading that's doing it. (Commenting out the vehicle loading prevented crashes, and I also placed the vehicle loading in the postbeginplay of an actor so I can invoke it on demand, that crashed the game just the same.)

: Armed with that knowledge, I was able to trace it to a bug in the native iterator code. A short workaround later, and the bug has been thoroughly stomped to death!

{{classbox| November 2, 2003}}
: Eureka! I finally got the bots to not have crappy aim, and did it in an interesting fashion too. I was trying to find a formula that would determine the ideal heading of the ship to have the weapons bearing on the target. That seems simple enough until you consider that unless the ship is balanced absolutely 100% perfectly, There is going to be some disagreement between the theoretical &quot;heading&quot; of the ship and the direction it is actually facing and travelling. This is especially the case when a ship is damaged which can cause it's center of gravity to change.

: I had a formula that calculated quite precisely where the shots should go, but I couldn't find a satisfactory way to make the bots aim and shoot at that point. After thinking about it for a while, I decided to use a very un-computery method. Instead, the bots aim using a semblance of the way human beings would aim. They use a formula to get them facing in the general direction of the enemy, then track their &quot;crosshair&quot; relative to the target's location &quot;on screen.&quot; Armed with that information, they constantly adjust their heading to bring the &quot;crosshair&quot; ever closer to the targets &quot;on screen&quot; position. This seems to work surprisingly well and should also theoretically work regardless of the weapon configuration on their ship.

{{classbox| November 4th, 2003}}
: Been having problems with gimbal lock. The ships don't suffer, and the aiming doesn't suffer, just the camera does. That of course causes problems as the camera whips around 180 degrees frequently if you are flying more or less straight &quot;up&quot; or &quot;down.&quot; I've tried a number of solutions but I've yet to find one that I'm satisfied with.

: I thought quaternions were the answer but they didn't produce the effect I wanted, at least on the controls. I still want to maintain the &quot;distorted&quot; nature of Euler Angles, but I don't want them constrained to the Z-axis, instead being relative to the ship's Z-axis.

: This I managed without too much trouble but the camera still has it's gimbal lock around the world Z-axis so it spins whenever it crosses the world axis. I may try using quaternions only for the camera while leaving the aiming and controls strictly vector math.

: I also came up with an ingenious scheme. Originally, I wanted to make the AIs pretend to be players. Then, as I was writing some stability management code, I thought that I really should just make the players a special type of &quot;AI&quot; player. At first it seems like a wierd notion, but really, it makes a lot of sense when I think about it.

{{classbox| November 5th, 2003}}
: I've got the gimbal lock cleared up, temporarily at least. I'm not that fond of the way I fixed it, but it suffices for now. Previously the camera would always stay looking at the ship, but the angle it was viewed from depended on the ship's aim. I have since abandoned this system and gone for a more &quot;chase plane&quot; style of camera. This has a very different feel to it than the previous camera but I'm undecided whether this one is good or not. At the very least, it rendered the existing &quot;crosshairs&quot; useless at best. The old system had a series of parrallax crosshairs to show the path of the weapons. That system is useless in the new system, because there is virtually no camera movement relative to the ship, so the parrallax cannot be observed, and thus cannot be used to infer any information on range.

: The new system uses an adaptive crosshair instead that places itself at a distance from the camera proportional to the target's distance from the ship. Thus, the range can be inferred from the size of the crosshair. This has proven to be an extremely reliable and easy way to hit the target, but unfortunately it's a bit lacking in &quot;look cool factor.&quot; The parrallax looked very sci-fi, while this system, though a superior system from an accuracy point of view, does not have that same feel.

: I also forgot that DT_Sprite does not support materials, so I'm going to have to use a static mesh &quot;card&quot; with the crosshair material on it. Until I do that, I'm stuck with a bland, non-fancy crosshair.

: I made the AI pilots a bit smarter, but they're still not all that good. They seem to be joining up and flying in formation when they attack, but I'm pretty sure that's just a coincidence, because the formation code is not yet complete. They still manage to kill me, but it's usually my own fault. I have a bad habit of ramming into the drone fighters, because I wait too long before turning away, and consequently usually lose a wing or other fairly important piece of equipment.

: I've also actually grown quite fond of the drone fighters and other ships I made. When I made the original set of parts I didn't expect there to be much variety, I was expecting that that would come in afterward when I started adding more parts. However, interestingly enough none of the ships I have designed look much like the original model I dissected to make the parts. One thing I had not foreseen was that the semi-user friendly method I made to make parts has a fatal flaw in it. Though it seems reasonable to make them by hand in the editor, this results in slight differences in the mass distribution and as such a ship that appears symmetrical is actually not necessarily balanced all that well. I believe that this is why the original drone fighters I constructed (which were predefined in code and did not follow the normal vehicle rules) fought a lot better than the new breed. I'll definately have to put some code in the part editor to search for things that seem like they should be symmetrical, line up things that are more or less coplanar, etc.

{{classbox| November 7, 2003}}
: I really don't like modern advertising. One of the archetypes I especially don't like is the kind that tries to appeal to your nostalgia, like the &quot;good old days&quot; were so much better. That's why it pains me to say this:

: Modern image editing software is so hideous it makes me want to kick something. I recently upgraded my video drivers so Aldus Photostyler stopped working. (It's been out of production and unsupported for over a decade.) This means that I'm forced to &quot;upgrade&quot; to something newer.

: I tried Adobe Photoshop first. My first impression was that it's needlessly complicated. Operations that took two clicks in Photostyler now took a half dozen. That's of course AFTER you've gotten &quot;the hang of it.&quot; There's all this needless nonsense in it. All I want to do is create and modify images, I can live without so many bells and whistles it shatters the windows in your house when so much as a tooltip is displayed.

: After that, I tried Paint Shop Pro, which I liked even less. I kind of figured that a newer piece of software would run faster with more features and functionality. Boy was I surprised! As cute as the idea of collapsing ten tools into one highly customizable one sounds, it makes it a bit difficult when you want to go from a pen to a brush and back. Heck, why bother having a pen AND a brush, when they can just make both the same tool that you can adjust? :/ To add more fuel to the fire, tools that I had in Photostyler apparently have no more place in modern image editing software, as they are mysteriously absent. 

: Apparently Jasc has a different definition of &quot;alpha channel&quot; than everyone else in the industry. In fact, in Paint Shop Pro, not only can you have multiple alpha channels, but they don't even do anything! They're just a place to store extra image data, just in case they port the program to an operating system that hasn't developed the concept of a file system, I guess.

: Did I mention that Paint Shop Pro also personally vomits on anything you try to save in the Targa format? After a few hours I managed to produce an entertaining variety of rotated images and images with the color channels switched around so pink is purple and black is yellow. Just to keep it interesting, it usually also cut the image to ribbons and rearranged it in a lovely collage. If nothing else, at least it keeps you on your toes.

: Then there's &quot;layers.&quot; What's with that anyway? It's a 2D image, by definition the concept of adding a 2D layer to a 2D object just doesn't make sense. Why should I have to &quot;flatten&quot; an image every time I edit something? I suppose it might help if you wanted to change something later, but Photostyler had that feature licked a long time ago. First you press control, then you press Z. Amazing!

: I personally can't believe that corporations that buy this software actually put up with stuff like that. Here's a tip: buy a Pentium 233 without an accelerated graphics card and install Aldus Photostyler. You'll at least double your productivity, and the suicide rate among graphic artists will drop dramatically.

{{classbox| November 8th, 2003}}
: I've been working on the formation code, but it's much trickier than I thought it would be. Flying in formation is actually surprisingly complex when your ships can't strafe, go backwards, or freely rotate. I've gotten them to fly in formation as long as the formation leader only makes gentle movements or accelerates and decelerates very slowly.

: I got them to fly half-decently like that by calculating where they &quot;should&quot; be in the formation, and having them aim some distance ahead of that location. In theory, that eventually results in them facing the same direction as the formation leader, and more or less in the correct direction. Then, the throttle is manipulated to fit the ship into it's position in the formation. This system, however, is not particularly amiable to rapid rotation and does not allow fighters to form up to a slow-moving or stationary formation.

: Having said all that, I'm not exactly clear on what the benefit to having fighters fly in formation is anyway, other than aesthetics. It does look kind of cool though.

{{classbox| November 9th, 2003}}
: I've been getting a bit bored with working on game mechanics like the ships, so I thought I'd work through some of the GUI elements. They still look fugly, seeing as I use a grand total of 3 textures for the whole interface, with various stretchings and such applied. (4 textures if you could the default textures in the entry level)

: However, I've got some stuff made for all of the major areas. I got a start on the video settings area, enough that you can set your resolution and color depth at least. Detail level controls and audio controls will probrably come soon. I've had to struggle with this because a lot of configuration stuff is stored in playercontroller/player/playerreplicationinfo, which I don't use except as a glorified camera. Unfortunately, since there's a lot of native stuff involved with those settings it makes it a bit trickier.

: I also had a nifty ambition to make more customizable characters but it's hit a bit of a snag as well. I was going to have it be something like UPaint, only a bit more structured. For instance, you could select, say, a piece of armor, and change it's coloration and markings and whatnot. The original texture of the armor would be preserved, you'd just more or less draw &quot;on top&quot; of it.

: Unfortunately, I realized today that skeletal meshes have cylinder collision, so that way won't really work. I've considered making them ragdolls, which would give better collision so I could trace and see where you were trying to draw, but that still might not work that well because I'm not confident that it will return the correct Material from the trace function. I think that might only work on BSP. Maybe I should test it though.

: At any rate, it's also an issue because it means I won't be able to use &quot;regular&quot; models. I would like for players to be able to just download a mesh from polycount or wherever and use it, but this system may not be very compatible with that sort of system. One would likely have to have made the model for the mod in order for it to work. Models made for my mod could theoretically still be used in UT2003 with a small mutator, but not really the other way around.

: For that reason I've decided to leave that idea on the backburner for a while and just sort out some other menu stuff. I'm a bit unsure what to do next game mechanic-wise. I don't really feel like it's ready for full-blown content creation but yet I can't think of anything that still needs to be done. I just have that feeling that it's not ready yet.

{{classbox| November 10th, 2003}}
: Implemented a neat feature, in my opinion. The effectiveness of a weapon is now related somewhat to it's configuration. IE If an energy weapon is starved for energy because the generators are not large enough or they simply can't (for whatever reason) get the energy into the energy weapon, that weapon will not fire as fast. Weapons also have an internal energy buffer, so they can fire in bursts if fully charged. Basically it works like so:

: Every time the weapon fires, it drains energy. The weapons have a very short mandatory cycle time before they fire again. However, they can only fire if they have enough energy to do so. All weapons have an internal energy buffer so they can often fire several times in quick succession without any external energy source, but the internal buffer doesn't hold a lot of energy. Once the weapon fires, and is no longer at full energy, it will start to siphon energy from things around it. The more abundant energy is in the things around it, the more quickly it will be able to replenish it's energy. The more quickly energy can be replenished, of course, the longer the internal buffer is going to last. (the reinforcement of energy helps it in it's &quot;uphill battle&quot; against the consumption of energy by the weapon.) Eventually, if energy is abundant enough, the energy may be able to be replenished faster than it is being consumed, so fully-automatic fire will be possible.

: This adds an additional design consideration. The farther the generators are from the weapons, the longer it's going to take energy to get there, thus the weapons will not perform as well. Also, there is a tradeoff between energy and weaponry. If you have too many weapons and not enough generators, your weapons will not perform as well, whereas if you have a lot of generators and only a few weapons, those weapons will be &quot;supercharged&quot; with all the excess energy. Kind of a quality vs. quantity balancing act.

{{classbox| November 11th, 2003}}
: I implemented a shady &quot;hack&quot; to overcome a wierd problem I was having with SetLocation. Hopefully I can find out why it wasn't working as I expected before. The system I have now isn't really a hack, per se, just a system that I don't want to use. Before, I had an actor that was created, and then moved itself to the location where it was supposed to be. This didn't seem to work though, so I implemented a static function that finds the location it's supposed to be, and then it just gets spawned in that location.

: It seems elegant in theory, but it's needless duplication, as I also have a non-static version of the function which is almost identical. I don't want to use the static function for both though because it requires some additional parameters. Also, it doesn't fell right, because it's conceptually an &quot;instance&quot; function. In this instance you have to supply as an argument the rotation that it is going to have when created in order for it to give back the results. I also don't feel right about it because it works in the editor, but in the game, which uses the exact same actor to spawn the ships, it doesn't work. It's crazy like that. :rolleyes:

{{classbox| November 15th, 2003}}
: I've been &quot;renovating&quot; the code and package structure to move things to where they are a bit more appropriate. There was some stuff kicking around in the base package that was a bit more specific so I moved it out, also I redid the input handler because it was a bit ancient. Originally I had a buffered input system that was going to get sent over the network, but I've since found that that system is not particularly efficient so I converted it so inputs were not buffered and instead handled immediately.

: However, that conversion was still that: a conversion of a different system. To clean it up a bit I just rewrote the whole thing. I also moved most of the functionality into the &quot;HumanPlayer&quot; class. (something akin to playercontroller)

: Most recently I've been pondering on a way to have two GUIs running simultaneously. Basically I was thinking I could make the HUD and scoreboard just another type of menu, which would allow them to use the same skinning system as the menu. (Which is pretty flaky right now but whatever. :P) However, being that it was the GUI I designed it fairly invasively so I'm not sure how well it would handle running side-by-side with another GUI.

: I've also encountered a bit of a &quot;problem.&quot; It's more a design consideration really. That is, the matter of scale. Realistically, futuristic space fighters would probrably go blindingly fast. This poses an obvious problem as your target would go from the horizon line to behind you in a fraction of a second. Obviously, that would make for rather boring ship combat. However, having the ships at a speed that's &quot;fun&quot; makes them either rediculously slow, or rediculously large. Given that they are scaled appropriately to persons on foot, that makes them really slow.

: I'm not sure if that's really a bad thing or not, but it might be. A lot of people complained about UnrealSpeed because the cars didn't go that fast - when the speedometer was reading over 100MPH, your car was moving along at about 40 clicks. (Similarly, the scout in homeworld allegedly travelled at 1050 m/s and the probe at 4km/s, but noone complained then. :rolleyes: Then again, the size of the fighter craft compared to the capital ships, and the size of the capital ships compared to the windows on those capital ships, suggest that the fighter craft in homeworld were about the size of an apartment building, while the larger capital ships approximated a city block. :rolleyes:)

: Anyways, I need to cook up a good premise for why the ships would be so slow, but so far I haven't really come up with a good one. I could say it was masses of ablative armor to cope with the power of futuristic weapons, but that feels like a cop-out to me.

{{classbox| November 17th}}
: I've been feeling some apathy towards coding lately so I'm trying to get something a bit more polished and professional looking. The game mechanics seem to be mostly done. Or so it would seem. I can't really think of anything that's missing, at any rate.

: In my attempt to do that I've been playing around with the scoring system. I'm stuck between two ideas: having fixed ship values or having flexible ones that affect your scoring. IE There could be a limit set for the game, whereby no player could spawn with a ship that was deemed to be beyond a certain power level. This however poses a slight problem in that it promotes reckless agression - the faster you can destroy your ship, the sooner you'll get a shiny new one. This also poses a problem in that you can spawn, suicide your cockpit into something leaving the rest of the ship reasonably intact, then destroy the remainder of your own ship (which can't exactly fight back at this point) and collect the points for it. I could penalize players for suicides, but I don't really want to do that because often your ship will be extremely crippled and there will be effectively nothing you can do, except possibly spin around in a circle with your one remaining thruster. In those situations, suicide is expected.

: The other system is geared more to a kills:death ratio, while factoring in the cost of your ship. When you spawn, you lose an amount of points equivalent to the &quot;value&quot; of your ship. When you destroy or damage enemy ships you get a proportion of that ships &quot;value&quot; back in points. Therefore, players who kill about as often as they are killed will have a score around 0, players who kill a lot and are rarely damaged will have positive scores, and players who get slaughtered like lambs will have a negative score. The problem I see with this is, (as some people feel is the case with existing gametypes) a small difference in skill may lead to a dramatic difference in points. Also, evenly matched players will end up in a virtual deadlock, both unable to accumulate enough points to end the match.

: I'm thinking I may be able to combat that, however, by having ships worth their value in points, and the player themselves worth something. Therefore, the bulk of the points will come from destroying opposing PILOTS, instead of from destroying the bulk of their ship. This would also help prevent a pileup of crippled ships, as there would be a strong incentive to finish off the cockpit. Presently, the cockpit is a secondary target, as it is relatively low value and fairly heavily armoured. This leads to a strong tendancy to attack the engines, then engage the immobile, (and now helpless) target and rip their ship to smithereens. Once the bulk of the superstructure has been destroyed, however, it requires too precise of shooting to mop up all the stray bits of debris that are left over, and usually one of said bits is the cockpit. This &quot;soluttion&quot; however, poses a new problem - that is, a player could suicide directly before they were finished off, thus denying the would-be killer the points.

: I could substitute when you suicide - when you hit the suicide button, instead of self-destructing the cockpit, it could just respawn the player and substitute in a passive AI that just waits to get killed. That way the would-be killer still collects the points. But wait - then we're back to square 1 - a player can spawn, suicide, then kill the defenseless ship they just suicided from and reap the points. Maybe I could make the AI temporarily be on the same &quot;team&quot; so it would count against you if you killed your own stand-in. Hmmm..

{{classbox| November 18th, 2003}}
: I felt that the effect for the lightning gun was a bit lack-luster so I set about trying to make a better one. Unfortunately, I hit a bit of a roadblock: apparently, emitters can't use materials, only textures. That is a shame because I could make a much fancier effect without straining the system if I could use a Combiner as the texture for the beam effect. Unfortunately, that doesn't seem like it will be an option so I'd have to come up with another alternative, or something.

: That was a bit of a diversion from my mod, but I'm not really sure what I want to do with that next so it's kind of sitting on the backburner. I think I've been coding too much because it's started to creep into my conciousness at all times. For instance, last night I tossed a plastic bag into the cardboard recycling, but instead of saying &quot;Oops, that's the wrong container,&quot; I said &quot;Wait a minute, that's not going to compile.&quot;

: I also forgot to mention, I'm at a bit of an impasse with the mod AI-wise. The AI sucks, but multiplayer is a long, long way off. (I won't implement multiplayer until the botmatch stuff is finalized.) I need a way to make the AI better, but I'm not really sure how I can go about doing that. The AI isn't bad on larger ships - only on the fighters.

: Capital ship combat is not too difficult for the AI. The target is fairly large, and coupled with turreted weapons it is virtually child's play to engage an opposing capital ship. Even attacking fighters is rendered much simpler by the availibility of turrets. Gunships are also generally armed with either turrets or homing missiles, making aiming much simpler.

: Fighters are a different story, however. When your guns are bolted to the frame of your fighter, suddenly the dynamics of your craft come into play in a big way. If the ship is slightly off balance, you're going to have to compensate by leaning toward one direction or the other. (the &quot;crab&quot; technique) This of course is massively complicated to the AI. It has to adjust it's aim to compensate for any imbalance on the ship. (which is a given once a few hits have been taken.)

: The system that I have now works &quot;decent.&quot; It works decent, in that it '''works.''' However, the AI is relatively slow at acquiring a target, compared to a human player, and is next to hopeless against a moving target. This is because it's current system works by making minute adjustments to it's aim until eventually the guns are lined up. IE, it uses a formula to determine theoretically which direction it would have to aim, then when it's aiming that direction thinks &quot;I'm aiming where I theoretically SHOULD be, but my guns are aimed below the target, so I need to adjust upward.&quot; In theory that system is good, but it's sort of delayed gratification, and difficult to track an evasive target.

{{classbox| November 21st, 2003}}
: Did some various diagnostics to find out why my mod was running too slow, and I found a couple of interesting things:
# The script uses a lot of time, about 15ms per tick per complete ship. This is of course on my POS computer so take that statistic with a grain of salt. The time taken is directly proportional to the number of ships. Though this is steep compared to the script time for most mods, one must also consider the sheer amount of math that takes place - computing engine thrust vectors and throttle levels is not as quick as one might think when you consider that the system must acommodate thrusters placed in any location and any orientation, even the most bizarre ones.
# The Karma simulation, which I suspected as being the main culprit of the slowness, actually only takes about 7ms per ship.
# The static mesh collision checks appear to grow exponentially with the number of ships and appears to be the main cause of the slowdown.
# My interactions are taking about 10ms of each tick. That is insane, but appears to be an artifact of the way interactions are implemented, rather than any fault in my specific interaction code.
# About 35ms was spent rendering, except when I riddled a fuel tank full of holes and fuel started streaming out. The particle systems involved caused the rendering time to skyrocket in excess of 100ms just for the particles. I'll have to rework those effects to be a bit more friendly.

{{classbox| November 22, 2003}}
: I came up with a brute-force solution to a problem I've been having with calculating the correct rotation for things in the editor. The solution actually turned out pretty good. It's essentially a very small scale neural network system. I thought that it would be a bit slow, but it's not noticeable, and it's only used in the editor, where framerate wouldn't be as important anyway. I wouldn't use something like that in Tick, for sure, but this is a &quot;one time&quot; function that gets called only based on a certain user action, and they can't really perform that action frequently enough to strain the framerate.

====Later that day...====

: I fixed another problem that had been bugging me for a long time. The editor is much improved now, in my opinion. My progress has been stifled somewhat however, with the discovery of an engine limit. It turns out that although in theory Unreal Units are all relative, this is not the case.

: First I found that lightradius and soundradius are in a certain set scale. That's not that big of an issue however, as static lights are best kept small, and dynamic lights can be made quite large. (dynamic lights operate on a vastly different scale than static lights)

: Apparently, the engine automatically clips things that are  more than about 60,000 unreal units from the camera. That is bad, because although fighter craft have long since disappeared into the blackness of space by that point, large capital ships are clipped before they could rightly be seen.

: I've covered up the clipping by using black fog (I've had it all along, I just had to adjust it to go to the clipping distance) but it's still a bit short. When a capital ship begins to fade into view, it's still pretty far away, for a fighter craft, but certainately not at the range that standoff combat between large capital ships may occur at. It also doesn't look very good against a non-black background because it always fades to black, not to whatever color the object is behind. It would be nice if there was a &quot;fade to translucent&quot; of some sort.

: Also, I've noticed a boon to the relative slowness of the fighters: number 1, it makes the capital ships feel huger. number 2, it makes space feel bigger. The maximum size for a map in UT2003 is pretty big, but not really big enough to do a large space area justice. However, because the fighter ships are relatively slow, they can fly for quite some time before hitting the edge of the world. (The heavy fighter I designed has just enough fuel to fly from one corner of the &quot;world&quot; to the other, though since the carriers are closer to the edge you could concievably hit the edge if you flew directly away from the enemy carrier for a while. This can be remedied somewhat, because the map is not as big as it could be. It actually only takes up about half the maximum map size.

{{classbox| November 27th, 2003}}
: I'm not really sure what coding to do next: I feel like everythings &quot;done,&quot; but it obviously isn't. I just don't know where to jump in I guess. I guess I'll work on the menu system some more.

{{classbox| December 9th, 2003}}
: It's been more than 10 days since I updated this and I haven't really done any coding. I think I'm experiencing a case of the &quot;winter blahs.&quot; I think I'm going to modify the camera code a bit, and then maybe do some ground-based stuff.

{{classbox| December 13th, 2003}}
: I made nifty bullet-style weapons with fancy penetration and everything! I think that various &quot;realism&quot; mods have had something like this in them, but mine's better! :D

: Simply enough, all bullets have a muzzle energy, drag coefficient, hard target penetration coefficient (ships, walls, etc.) and a soft target penetration coefficient. (people) The weapons then does a series of successive traces, and every time it hits something, it figures out whether its hard or soft, and how thick it is. Then the bullet does damage, slows down, transfers momentum, and travels through the target as applicable. It also makes fancy chips and junk come out of the point where it &quot;penetrated&quot; a hard object, and makes blood and stuff come out of the place where it &quot;penetrates&quot; a soft object.

: Though it would be very nifty to have dynamically projected &quot;portals&quot; projected on things so you could see &quot;through&quot; the cavity left by the bullet, this would be too processor intensive. To that end, only static &quot;hole&quot; decals are going to be used, and then only on pieces of the world. (Constantly computing projector locations for moving and rotating ships uses too much processing power.

: The penetration is mostly going to be relatively weak through hard objects, otherwise a human player could just spray aimlessly at walls and hit people a couple of rooms over. The hard target penetration is going to be sufficiently low that only relatively thin objects (like a railing, fence, maybe a lamp post) can be penetrated. Of course, different weapons will have different penetrations, the human submachinegun has relatively low penetration, while the assault rifle has reasonable penetration. Sniper rifles would be an ideal candidate for this sort of penetration, however I'm going to have the sniper rifle be like.. that rifle in Deep Space Nine. The one that teleports it's projectile to just in front of it's target, so every shot is at point blank.

{{classbox| December 16th, 2003}}
: Apparently my pathfinding code doesn't work anymore. It pulls either an &quot;infinite recursion,&quot; (not actually infinite, just more than 250 calls) or a &quot;runaway loop.&quot; This is kind of strange since it never used to do that, and it used to run quite fast even with multiple AI players running around.

: I have two potential solutions: Number 1, I can have the editor preprocess the path information. This is more or less what Epic does, but I don't really want to do it that way because then you can't have the path network &quot;learn&quot; in real-time. (IE if someone sprays a bunch of napalm around a navpoint, it should be excluded from pathmaking by any bot that knows it's exteremely dangerous.) The second potential system is to have a heirarchial type of path network. Essentially, the path network would be split up into larger areas, and the path would be generated area - area. Then each time an area was entered, a path would be generated pathnode - pathnode to get from that area to the next area. This method would greatly reduce the path length that had to be considered at any one time, however, it requires more effort for the mapper as they will have to set up the areas as well as the individual pathnodes.

{{classbox| December 18, 2003}}
: I've temporarily fixed the pathfinding system by instituting a hard limit on maximum path length. It's not the ideal solution, but for any reasonably-sized map it should be fine. Unlike Epic's pathnodes, there is no need for mine to be a set maximum distance apart, so you can cover a large outdoor area relatively easily by just placing one pathnode at every place where the bots are going to need to turn. Basically, the bots need to be able to make a beeline from one node to another, but distance doesn't matter.

: Having said that I still need to come up with a solution to having multiple sets of pathnodes on a level. Obviously there are going to be some paths that persons on foot can travel, but some vehicles may not be able to make it. Aircraft and spacecraft also should use an airborne set of paths, instead of attempting to follow along the ground. (Though maybe I could just have them fly a given distance above the ground path network.)

{{classbox| December 24th, 2003}}
: I implemented a snazzy path caching scheme to speed up the pathfinding. It's very nifty - but it still has the same problem as before, it's not amiable to changing path values. That part kinda sucks. However, it does result in a 25-50 times reduction in time spent pathfinding, so I guess it's okay.

: The existing paths, without caching, were working okay now, but I wanted to do a lot MORE pathfinding. Presently the bots pick somewhere they want to go and pathfind their merry way there. I want them to use pathfinding to pick where to go too. IE:

# Bot scans availible pickups in the world
# Bot traces path to each pickup to find approximate time to acquire. (No aggregation of pickups will be considered for now. EG it's worth it to travel twice as far to pickup one health vial instead of another, if there's four more health vials on the way..)
# Bot pathfinds its way to the pickup.

: This of course requires a great deal of pathfinding every time the bot wants to decide what to do. The bots are actually pretty good as it is, even though their AI is incredibly simple. The only real improvements that they &quot;need&quot; are to pick up weapons and such when they need one. Many times I'll loose a three-round burst into a bot and watch it heave over, with it's gun clattering to the floor, only to have it crawl and stagger back to it's feet and hightail it away from me empty handed. (Instead if picking up the gun that it dropped and is mere feet away.)

: Fortunately, the whole thing is rather &quot;leet&quot; if I do say so myself. Which I wouldn't. Because I don't use that expression. But if I did, then I would. :P The mod makes gratuitous use of Karma, which is good for plenty of eye-candy. It's got the Karma injury system brainstormed over on [[Legacy:Karma Ragdoll|Karma Ragdoll]], and when you get ragdolled in this manner, you also drop the weapon you were carrying. (Understandable, since you've just been sent flying from an explosion or otherwise sent off your feet.) This is super neat because the attachment falls from your hand and uses Karma to tumble away on the ground. So, while you are getting tossed away by a concussive blast, your weapon goes too, but likely will not end up in exactly the same place as you. Sometimes it will land near you, and if you manage to stagger back to your feet you can just grab it and get back into the action, other times it will have gone over a railing into some lava, or landed up on a ledge where you can't reach it so you'll have to find another.

: I played a mutator at one point that made you drop your weapon if you got hurt badly, but I didn't like it very much compared to this. In that one, you'd be running along and suddenly your weapon would change. (when you got hit) That I found very frustrating and all around not very fun. In my mod, the feel is much different, since you're sent flying anyway and will be lucky to even survive.

: Speaking of which, I'm not really sure what I should do about the deaths. Right now, if you're using the first person camera, the camera follows your head when you're ragdolling. (Some internal adjustments are done to prevent you from seeing clipping should your head end up through a wall or something.) This is quite nifty actually. The same thing happens when you die. My first thoughts were when I implemented it, that it's very reminiscent of DOOM. :P

: Anyways, when you are sent ragdolling, it's basically the same regardless of whether you're dead or just severely wounded. I'm not sure if this is good or bad. The only way you can really tell which it is is if you're dead, you can respawn by clicking fire, whereas if you're just severely wounded, clicking fire does nothing until you are back up. Actually, if you have a secondary weapon you can draw your secondary while you lie on the ground and can sort of half-decently shoot it. Very nifty. Anyways, the other obvious way to tell, of course, is that if you aren't dead you'll claw your way back to your feet after a short time spent wounded. I'm not sure if I should make a way to easily tell between being dead and just being wounded.

: I've been making lots of eye-candy lately instead of doing &quot;real&quot; programming, and I'm quite proud of the results. (As you can probrably tell by the amount of rambling about this cool feature and that :P) The final part I've made that I also think is super cool, is loads of blood and a more-or-less realistic &quot;combat inspired blood distribution.&quot; :P

: Basically, when you are wounded by different things, different stuff can happen. This can be custom scripted by modellers and skinners, or they could use one of the default types. It's kind of like the species code.. only a lot better, because that just defines gibs and blood and stuff. This allows you to script responses to different types of attack. For instance, if a Terran is shot and the bullet penetrates his body and comes out the other side (did I mention I made nifty ballistics and penetration calculations :D) blood sprays from his backside. (and he generally dies) These blood droplets then fly through the air eventually landing somewhere. This means A) if you have a decent framerate you can see the blood spray from the body before it gets smeared all over a wall, and B) the blood is patterned on the wall depending on the angle of the hit and such. Shooting a person above you tends to cause blood to spray upwards and lightly coat an area, while shooting someone below you tends to create a dense splatter on the floor some distance behind them. Other damage types have different responses, for instance impact damage (taken from falling too far, hitting something too fast, getting hit by a car, etc.) leave a bloody mark where you impacted, but only if the impact was severe, or the person was already heavily wounded to begin with. If a heavily wounded terran is ragdolled and slides down a ramp or stairs, he'll leave a smeared trail of blood wherever he slides.

: All in all I'm very excited about it.

{{classbox| December 25, 2003}}
: Got Homeworld 2 and Unreal II for Christmas. Programming is unofficially suspended until I finish/get bored of both. :D

{{classbox| January 2nd, 2004}}
: I've been making various visual improvements, but I'm still snagged on the ~60,000 UU maximum draw distance. I tried scaling everything down to allieviate this, but that caused all hell to break loose when things got too small and the loss of precision with integers started causing visual problems that were even worse. Plus, scaling everything down was going to force me to remove one of the cooler features of my mod, (the ability to walk around inside the ship while in flight or landed) which I didn't really want to do. So, for the time being things remain invisible at moderately long distances. I also tried having &quot;stand-ins&quot; for things that were far away that would appear at 60,000 UUs away and scale appropriately to make them look farther away, but I scrapped that when I realized that that would not look good if a player was using a stereoscopic display of any sort.

{{classbox| January 3rd, 2004}}
: I decided to make the stand-in actors anyway. This won't look right to anyone using a stereoscopic display, but I'll have to settle for the time being. It will in fact look quite bizarre to them because the stand-ins are relatively close to the camera. (This is to prevent them being obscured by fog.)

: Fortunately, the appropriate placement and drawscale was easy - it's a straight linear scaling. IE, something twice as far is half the size on-screen. This seems only logical, but some games use a non-linear scaling so you can make out details better at long distances. (Homeworld is an ideal example of this.. the difference in size between ships is much lesser when zoomed out.) Anyways, this made it very easy to make a seamless transition from stand-in the the real thing and vice versa. There's a few visual glitches that would be difficult if not near impossible to rectify - for like if a missile impacts a capital ship, the explosion will not appear on the stand-in. You could fix that by giving EVERYTHING a stand-in, which would be easy enough to do, but I don't want to have stand-ins for stuff that's REALLY far away. I tried setting everything to use them, but ended up with annoying glittering pixels of fighters that were really far away. I guess it might look okay at, say 65000x40000 resolution though. :P

: This situation normally wouldn't be all that bad, if not for the great differences in size of different ships. That was something that kind of bugged me in Homeworld - the fighters were approaching the size of the frigates. The frigates had little windows painted on them to show that they were real big, but then a fighter would fly by with a cockpit about a dozen frigate windows long. Also the asteroids were pretty puny compared to the size of the ships. I've never visited one, but it's my understanding that asteroids are generally pretty big compared to pretty much anything man-made. Unless maybe you count the great wall of China. I hear it's pretty big. Anyways, my ships have appropriate scaling, so the fighters are relatively tiny compared to carriers. (Though the difference in scale is not as much as I would like, they also have to be scaled appropriately to persons on the ground, and the Unreal Engine does have a maximum map size, ya know. ;))

: Also, I got rid of the environment maps on ships. They looked fancy in the editor, but looked crappy in-game. When it's dark, (as it tends to be in deep space) the environment map (which doesn't appear to be affected much by changes in light level) becomes much brighter than the diffuse texture, and ends up looking lousy. That's the grey with white polka dots you see in the screenshots I posted earlier. Now that the environment map is gone, the ships look a lot better. (Well, not the carriers, because they didn't have environment maps. Only player ships had the crappy environment maps on them.) Speaking of which, I'll post new screenshots soon. I got a new computer, and I'm doing all my programming on that one now, but that one isn't connected to the internet, so I have to lug a hard drive in between computers to transfer files and such. Or I guess I could compress them and use a floppy disk. I don't like floppy disks though.

{{classbox| January 6th, 2004}}
: Heuristastic! Plus, I curse integers again. In lieu of actual knowledge of how to do a coordinate rotation on a Euler angle using another Euler angle, I implemented a theoretically slow heuristic instead. It's not actually noticeably slow and the only time it ever gets called is when a ship is loaded, built, or otherwise spawned. Even so, it runs surprisingly fast considering that it's a nested loop with numerous comparisons and operations taking place. Unfortuantely, due to some wacky loss of precision with integers, it's only accurate to within one unreal rotation unit in the roll direction, but hey, that's still 99.999999999999644728632119949907% accurate, according to windows calculator, which is probrably better far tighter tolerance than the human designer is going to be able to manage anyway.

: I also came up with a scheme to have all ships carry liquid ballast. I also have a feeling I wrote this already, but maybe not. Anyways, the liquid ballast can be pumped around the ship (this is handled automatically) to keep the center of mass, well.. centered. I decided I needed something like this because once your ships starts taking heavy fire and a good chunk of it is absent, the center of mass of your ship shifts way off the center and once it shifts laterally past your thrusters, you're going nowhere except in a circle. Once you start getting close to that point you can only fly by shifting the engine balance all the way to one side and using all your vector exhaust to stay straight. This makes it extremely difficult to aim and the AI can't handle it at all. (The AI compensation heuristic only kicks in once it's half-decently lined up.) Granted, by the time you've lost that much of your ship there's not much you can do, since most of your systems are probrably offline by then, but still... Anways, the problem I've been having with the ballast is twofold - number one, more ballast is needed to maintain stability than I had realised. This is bad because it roughly doubles the weight of your ship. Also, there's a slight problem in that the ballast adds a great deal of mass to the ship, which slows it down. Fast &quot;flag carrier&quot; ships may prefer no ballast for maximum speed, and sacrifice the stability instead. Also, placing the ballast closer to the outside of the ship makes more of an impact with less added mass. This is good. However, the outermost parts of the ship are liable to be the first ones destroyed, so keeping your ballast at the end of your wings has it's own downside there, too. However, to keep it more central, where it will be safer, requires more mass to be added, reducing the potential speed of your craft...

: In other news, the AI now has slightly more of a clue of what to do. I've been developing so far under the premise of the &quot;carrier attack&quot; gametype, because it offers some of everything, so all of the code can be tested within the same level and gametype, which is good because it spares me from making more levels and gametypes just to test different features. Anyways, the AI now has the wit to attack the enemy carrier, as well as engaging enemy pilots en route to the friendly carrier.  However, they don't yet have the brains to avoid ramming into things. Generally, that's not a problem, but the AI from one carrier has a tendancy to crash inside the hangar of it's carrier as it launches. This will be improved in the near future. And new screenshots are coming soon. Soon! They're still on the other computer.

====And then some!====

: I wrote some stuff for collision avoidance. Unfortunately, it turned out to be rediculously slow. Initially I was using traces to detect nearby objects. You can't just take the difference in location between two objects because the location of a large ship may be a considerable distance from the surface of that ship. So I was using traces. This was slow. I figured it was because of the traces. I found out traces aren't that slow after all.

: I substituted it for what seemed ingenious. I'd just use a dummy actor with cylinder collision, set it's location to the location of the ship detecting nearby objects, and go through it's touchingactors array. Seems simple and fast. It wasn't.

: I was quite shocked to find that this ran at about a third of the speed of the trace method. Why, I have no plausable explanation. I did some optimization but still only got it down to taking about twice the time of the trace method. I don't like either method, however, because the trace method is too slow to use with more than about 8 bots at a time, and the dummy actor method is even slower. To remedy this, I have a couple of pontential solutions. I can reduce the extents of the traces used to detect nearby objects. A zero-extent trace would be ideal but if the extents are too small the ships think they have a clear path when they actually do not - obviously a bad thing. The extents have to be generous because there is no reasonably fast way to determine the extents of a static mesh from within unrealscript. Therefore, there's no real way to determine the extents you need to use except to have a generous preset amount that should cover the majority of ships that that particular AI will be flying.

==Jaunary 9th, 2004==
: I made a super-fancy skybox substitute. Screenshots are coming. Honest! :P I don't really like the way it looks, in that it isn't black so it doesn't look like space to me. However, it is much fancier from a technological standpoint, and probrably draws faster. I was stuck for a way to draw stuff &quot;under&quot; the world, which could then show through by making a HOM effect deliberately. I didn't have success with that, but then it hit me: the skybox gets drawn first, then the world gets drawn on top of it. So, I could draw stuff &quot;under&quot; the world by simply putting a static mesh sheet in the skybox that would automatically move and rotate so it was always facing the camera. Unfortunately, it's not perfect. There's a slight visual glitch that I'm not sure how I can fix, if I can fix it at all. I didn't want to use a scriptedtexture to update the stuff on the sheet, (since obviously it has to look different when you look differnt directions) because that would sacrifice compatibility with Mac and Linux, which I didn't really want to do if I could avoid it.  The glitch is caused by a Gimbal Lock issue which may be difficult to resolve. I'll make a scriptedtexture version for DirectX users, which will be free of the visual glitch. I'll post the screenshots up soon, on account of I have to go to work now, but maybe when I get back. Then people can decide for themselves.

: The new screenshots also show off a fugly ship I made. More of a modification of an existing ship. My interceptors were getting chewed up by the enemy carrier and didn't really ahve anything that could cause appreciable damage to it, so rather than go to all the trouble of implementing some more weapon types, I just hopped into the vehicle editor and tacked on 5 of the biggest anti-fighter cannons and another generator to power the whole mess. This was all done without leaving the game, mind you, so hopefully the new screenshots will give more of an idea as to the vehicle design part. Also included are some shots showing some more action. Coming soon!

{{classbox| January 11th, 2004}}
: Quite the frustrating day. I don't know why I didn't think of it before, but I realized that if I moved the &quot;safe distance&quot; from ships out of the ship AI and into the actual ship components, I could make an quasi-trace in Unrealscript. It actually worked quite well, and very fast too. Because I wasn't constrained to the &quot;upright cylinder&quot; collision, I was able to make a custom cylinder collision, where the cylinder is essentially the length of the trace, while the radius is the extents of it. This worked surprisingly well, and also allowed me to compensate for the movement of other ships (no use going around if it's moving out of your way already. Formerly there was a &quot;right of way&quot; system and the other ship was assumed to be getting out of your way if you had the right of way.) as well as compensating for the movement of the ship in question. (Fast moving ships are going to need to predict collision farther in advance than slower moving ships)

: Unfortunately, this improved collision prediction system showed a big failing in the avoidance system, specifically that the ships would get kind of antsy if other ships were around, but not moving in such a way that a collision was likely. (IE flying in formation) These ships weren't picked up at all by the old system, so the ships didn't get antsy about it, but that wasn't really that bad, since those ships are virtually never on an actual collision course. This is what I spent most of the day trying to fix.

: First, I figured I could use something like the code the fighters use to break off an attack run on a capital ship when they get too close. (This is not related to the collision avoidance, because the range at which they break off and such is not collision-related - it's based on the ship's estimated combat capabilities, as well as those of the target. IE get in close to carriers who can't defend themselves well, stay away from gunships, stay at long range and harrass large capital ships, etc.) Anyways, that didn't pan out, because the collision avoidance operates at much closer ranges and so that sort of gentle course alteration didn't work very well. Making it just plain steeper didn't work well, as the fighters would attempt to make a tight turn and their momentum would carry them into the thing they were trying to avoid.

: Secondly, I remembered some stuff from calculus about the surface of a circle and so on. I figured that, similarly, I could find the point on a sphere that was the minimum &quot;safe&quot; distance away from the carrier, and the portion of the circumference that represented the distance the fighter would travel in the time it was predicting ahead by. This didn't work. The fighters overshot the predicted point, then tried to do a 180 to correct, and hit the carrier.

: After fiddling with that for a little while, I came up with another idea: I could set the &quot;predicted point&quot; some distance ahead of the fighter: basically, where the fighter is expected to be a second (or some arbitrary amount of time) from now. Then, I could have large objects &quot;push&quot; on the predicted points. So, if you could imagine, it's like magnets of the same polarity, the large objects &quot;push&quot; the predicted endpoint away from the ship. Then, the fighter aims for the adjusted predicted point. This seems to work good and produces a very smoothe avoidance.

: After I got that taken care of I've been trying to streamline everything. I think the core functionality is all in now, so there shouldn't be any other major loads placed on the system from now on. (I hope.) Unfortunately, the game can get kind of slow when you get large numbers of ships flying around. I'm not sure where the time is being taken, however, so I've been taking various measurements to try to find the bottleneck. I've been hoping I'll find one horribe error I've made somewhere that's sucking up all the cycles, but more likely it's distributed and can't be easily fixed like that. It's a bit perplexing, however, as there seems to be a great deal of time unaccounted for. The timing measurements that I took don't add up to anywhere near the reported times in '''stat all'''. Earlier, it was reporting about 10ms script processing per ship I added to the world. However, my timer only found about 6 to 8 of those milliseconds.

: Even 6 to 8 milliseconds per ship, however, is much higher than I want, since I want the ability to have lots of fighter craft. Unfortunately, the code all appears to be pretty much optimal, though I did manage to squeeze 0.05 ms per component out of the resource model. (energy, fuel, ammo, and such) The old model had each component on a ship do it's own resourcing and go through a modest nested loop to compute resource distribution. The new method is slightly different, but theoretically should execute at nearly the same rate: instead of each component doing it's own resourcing with a nested loop, I made only one component on the ship do the resourcing, and it uses a doubly nested loop. So, basically:

Called once per component:

* For each component...
** Do resourcing between Self and j

: became:

* For each component...
** For each component...
*** Do resourcing between j and k.

: Theoretically these should be almost exactly the same. The only reason I was changing it was because there was a single redundant line that only needed to get called once a tick, but was getting called once a component. However, that call was cached anyway, so it was akin to an assignment. But, I was desparate. I was pleasantly shocked to find that the new method resulted in a 25% decrease in execution time! (0.2ms per component to 0.15ms per component) This, coupled with other information gleaned during the earlier timings, suggests to me that there is a considerable amount of overhead involved in every Unrealscript function call. (Rudimentary tests suggest about 0.009ms per function call, which doesn't seem like much, but can add up if you use recursion or function calls in loops.)

: To try to gain some speed I've been swapping some of the more time-critical code from Object Oriented Programming to Procedural Programming. So far the results have been favourable, from a performance standpoint anyway. It does sacrifice some readability. I've also been caching anything that gets called even half-ways frequently. (Center of Mass, master component, (the one that administers the resource model) nearest controller. (for ships with more than one pilot/gunner/whatever, this points to the component that houses the controls for this component. On fighters this is generally the cockpit everywhere, larger ships might have a turret controlling some pieces, while the cockpit controls others..) I also cached a dynamic array of related components, which saves me from doing the recursion to find them all as frequently. (ship parts that are a part of the ship in question)

: All these improvements have brought the speed to the point that you could concievably have a moderate sized game, by UT bot count standards anyway, depending on your machine and your desired framerate, anyway. I just know that there's still something hiding in the code gobbling up cycles, because I made a test ship that was light a freighter, with just a big stack of bulkheads and no engines or weapons (they time okay, but I strongly suspect they are the culprit) and I could make like 20 of them and still have a decent framerate. So I know that it's not Karma going slow, nor is it rendering, nor is it a problem at the heart of my vehicle code. I just know it's in there somewhere... and I need to make it go faster, since I want to have each side able to have at least a couple dozen fighters.

{{classbox| January 11th, 2003}}
: Apparently, using SetLocation is a fairly costly operation, even on non-colliding invisible things that can't affect anything as a result of moving. Hmmm. Turns out this was causing a slowdown in weapons and engines, since I always had the &quot;firecontroller&quot; (the business portion of the weapon) move to the point where the projectile/beam/whatever should come out of, and this needs to be constantly updated to stay in sync with a weapon that's likely also moving. This was costing many a cycle. I fixed it (a tad bit hackily) by simply changing all references to the firecontroller's location/rotation to &quot;effectivelocation/effectiverotation&quot;, and the two &quot;effective&quot; variables are set to the location/rotation where weapons fire should come from, instead of moving the actual firecontroller. This way is much faster. In theory. The framerate ''felt'' slower, even though it was actually faster. It's probrably just me. The fighters also started ramming into things again, this was because I forgot to change a reference in the AI to the firecontroller's location and rotation. (It uses this to line up it's weapons) I remembered that while I was writing the above.

{{classbox| January 14th, 2004}}
: I cooked up a scheme while I was at university today, to do faster coordinate rotations. I was thinking about how games use trig tables so they can just look up the result very quickly. Then I thought, why not have a coordinate rotation table? I could just have an array with 65536 cubed elements, and easily specify the rotation as an index into the array and get the result! Ingenious! Unfortunately, the lousy compiler won't let me make an array with 281474976710656 elements. It wouldn't even let me nest structs with arrays in them, and then make arrays of those structs, etc. (the compiler hung when I tried) I may (maybe) try doing it with dynamic arrays, but they might not be as fast because they probrably won't get a contiguous block of 3 or 4 megs in RAM so it'd be skipping around a lot.

====The fun never stops!====

: I was having a slight problem with Karma things &quot;exploding&quot; from trying to rotate too fast. This was only really a problem with the bots, though, because a human can't really turn fast enough for it to be a problem, unless they are getting really low framerates. (Reason's being they can't move the mouse fast enough to turn that fast, and even if they could, they couldn't see where they were trying to turn to since you can't see the rotation cursor thingy once it's past about 45 degress off the rotation of the ship. (though with practice you can wing it around and have it stop pretty much where you wanted it to) The bots however, gleefully do a 180 in their desired direction on a fairly regular basis, such as when turning around for another attack run on a carrier. This was causing a big problem. I tried a couple of fancy solutions, like storing the most recent &quot;good&quot; rigid body state, and restoring it if imminent Karma breakdown was detected, but this didn't work too good. It just resulted in the ship being reset to the instant before Karma broke down, and since it was under virtually identical conditions, it basically entered a loop of breaking down and being restored every couple of ticks.

: So, I decided to prevent the problem in the first place by smoothing the rotation of the AI. Basically, the AI's &quot;aim&quot; is metered out to the vehicle over a few ticks instead of giving it an instantaneous change in direction. I tried making them just have a maxmimum 90 degree offset in their &quot;aim,&quot; but that didn't work very good, and used more cycles than this way. The new way is super simple and surprisingly effective. Basically, every tick, the vehicle's &quot;aim&quot; and the vehicle's AI's &quot;aim&quot; are averaged. Now, you might say, &quot;every tick you average them? Why, my good man, that will cause synchronization issues on different machines on a network! Surely such methods are folly!&quot; But they aren't. It's framerate dependant for a reason: because the Karma explosion problem is. The slower the framerate, the gentler you have to be, (keep in mind these are futuristic space fighters, doing a 180 in 0.2 seconds is &quot;gentle&quot;) and the slower framerate results in less averages and thus a smoother motion. Besides, the AI is only simulated on the server side anyway, and the clients get the vehicle's updated aim, so they'll still be synchronized. So put that in your pipe and smoke it! :P

: I've also been trying to eliminate the visual glitch I was having with the backdrops. Basically it's like, if you can imagine a perfect sphere with the backdrop as it's texture, and you're looking at it from the inside. Because it's a perfect sphere, you get the same effect by panning and rotating the 2D texture and can forego all triangles, which is good, because a perfect sphere would require an infinite number of triangles, which could really bog down the framerate. ;)

: However, it's trickier than one might think: It has to pan seamlessly, which means you have to have a seamless wraparound. This is easy enough If your image tiles. In theory. It's actually not so simple. Horizontally, it tiles. That's simple enough. Vertically, it doesn't. It sort of &quot;collapses.&quot; Remember this is supposed to be the inside of a perfect sphere, and if you try to fold a piece of paper into a sphere you'll find that one axis tiles, and the other end you just kind of have to scrunch it all together to fit. The inspiration and pioneer of this technique, Homeworld, had it easy. They just gimbal locked at two poles so they never had that problem - because you can't roll when nearly level or &quot;yaw&quot; when pitched all the way up or down, they can just draw it un-scrunched and it still looks okay. Of course, if you were to measure things the view is actually quite distored in places using that cop-out, but you don't really notice, unless you were to bust out a ruler, then maybe you could see that when pitched all the way up or down the scale doesn't agree at different angles.. but I digress.

: Point is, I want to use something like the system they use, only better, because I can't have gimbal lock, for obvious reasons. It's very important that the background pan and rotate realistically, because my experience while developing the backdrop system so far has shown me that the background is very important to your sense of direction. When the backdrop was just fixed and didn't pan or anything, I couldn't tell where I was going. When it was going backwards, I could never accurately judge how far to turn, and so on. Point is, it has to be perfect! I want to avoid using a pseudo-skybox approach though, because I want to keep it entirely 2D, because it'll look better.

{{classbox| January 15th, 2004}}
: I implemented a nifty system to help the bots make more intelligent aiming decisions. I had the idea a while ago but I was surprised at how elegant it turned out. It won't get called alot, it'll get cached, and it's not processing intensive anyway, so I can afford to make it elegant. Basically, every ship is issued a &quot;classification,&quot; which, interestingly enough, is a reference to a class. These classes form a heirarchy which is very handy. I was able to encapsulate virtually everything in the base classification class as well.

: The solution turned out really good. Each &quot;class&quot; of vehicle/ship has two things: a rate function, and a list of subclasses in the defaultproperties. Interestingly enough, &quot;subclasses&quot; don't actually have to be a subclass, allowing for a non-linear descent down the &quot;class tree.&quot;

: Basically, a function is called on the base class, which iterates through it's list of subclasses, and calls the Rate function of each. Rate returns a float, and whichever subclass returned the highest value get's a function called in it, which does the same thing as this just did. (only, of course, iterating though that subclasses subclass list instead of the base classes list.)

: Rate is a simple static function that gets overridden in each class. It takes a struct as input, (for extensibility) which contains a considerable amount of statistical information about the ship in question. (Firepower, armor, manueverability, mass, resource processing capabilities, sensor range, resource storage abilities, etc.) The rate function just has to return some floating point value to indicate how closely the vehicle matches this particular subclass. For instance, let's say the ship in question was a superiority fighter. The process might go something like this:

: The Base Class calls Rate in C_StrikeCraft, C_Capital, and C_Station. The vehicle has a relatively low mass, so C_StrikeCraft returns a high value. C_Station returns high if the vehicle passed to it is nearly immobile, which is not the case, so it returns a low value. C_Capital is looking for high mass, so returns a low value.

: C_StrikeCraft now iterates through it's list: C_Fighter, C_Gunship, C_Transport. The fighter has no turrets, and a relatively high manueverability compared to it's weapons, so C_Gunship returns a low value. The fighter doesn't have much storage, but it has a fair bit of fuel and energy considering it's size, so C_Transport returns a moderate value. The fighter is very agile, however, so C_Fighter returns a high value.

: C_Fighter now iterates through it's list: C_SuperiorityFighter, C_Bomber, C_Interceptor. C_Interceptor likes manueverable craft with lots of weapons, but weapons take priority. Since the fighter in question is more manueverable than it is heavily armed, C_Interceptor returns a moderately high value. C_Bomber heavily favors weapons over manueverability. Because it wants LOTS of firepower, and the fighter only has a moderate amount, it returns a relatively low value. The high manueverability helps the rating from C_Bomber, but not by alot. C_SuperiorityFighter focuses mainly on manueverability. The more manueverable/faster the vehicle in question is, the higher the rating from C_SuperiorityFighter. C_SuperiorityFighter also gives points for weapons, but not as much as C_Interceptor. C_SuperiorityFighter returns a high value because the vehicle is question has lots of manueverability.

: At this point, C_SuperiorityFighter would go through it's subclasses, if it had any, which it doesn't. So instead it just returns itself back up the chain to give the eventual result.

: That was a bit of an example, but I was having difficulty putting it into words. One advantage of this system is it's easily extendable, and it's heirarchial nature allows for &quot;IsA&quot;-like calls. For instance, if a hostile ship was approaching a transport of some kind, it might do something like:

&lt;uscript&gt;
if ( IsVehicleClass( Incoming, class'C_Fighter' ) )
{
  // We can't outrun it. Is it harmless?
  if ( !IsVehicleClass( Incoming, class'C_Transport' ) )
  {
    // We won't be able to outrun a fighter or a gunship. Best
    // to head for the nearest friendly units and call for
    // backup.
  }
} else ( IsVehicleClass( Incoming, class'C_Capital' ) )
{
  // We can outrun it. Fly directly away from Incoming.
}
&lt;/uscript&gt;

: In this way it doesn't need to check through the myriad of types, and doesn't need to bother with whether an incoming fighter is a superiority fighter, a bomber, or an interceptor. Similarly, if it's a capital ship, it's a fairly safe bet we can get away. There's no sense bothing which what class of capital ship it is, or whether it's armed with anti-fighter or anti-capital ship weaponry, etcetera.

: Another big advantage is it allows you to approximate the role of any ship. Since a player can design a ship in any style and with any combination of armament, etc. they please, the AI needs some way to know what's dangerous to it, what it's dangerous to, etcetera. This way, the AI can transparently pick targets intelligently. Superiority fighters will engage enemy fighters, interceptors will engage bombers, and bombers will engage capital ships, without the user having to specify to the ship or AI what sort of ship it's piloting and what it should do with it.

: I had this idea sitting around for a while, but I was getting kind of annoyed when the interceptors I built almost always went straight for the enemy carrier, ignoring enemy bombers launching from the enemy carrier.

{{classbox| January 18th, 2004}}
: It took a while to get the idea I implemented yesterday nicely balanced. The specific problem being, having particularly heavily armed interceptors being mistaken for bombers, due to their sheer amount of firepower. However, these interceptors also had very powerful engines and thus should act like interceptors. I eventually realized that I could figure out what's a bomber and what's just an all-around powerful ship by finding ships with a large amount of firepower relative to their manueverability. This works well, because if a bomber is so manueverable it can fly like an interceptor, there's no reason why it shouldn't do so - and if an interceptor is so clumsy it looks like a bomber, it makes sense to keep away from overly acrobatic movements.

: I also uncovered an interesting balance issue. If a ship is armed with missile/bomb/torpedo/rocket launchers, there is a variety of warheads that can go on any given bomb or missile or rocket or torpedo.  For instance, you could arm your macro missiles with fusion warheads to get a blast effect, or you could cap your dumbfire bombs with plasma warheads to get extra punch against capital ships. The balance issue that I've noticed is that the plasma warheads are a lot more useful than the fusion warheads. Fusion warheads have a blast effect, in theory making them useful against fighter craft. However, it can sometimes take several hits to destroy a fighter with fusion warheads. I had expected that plasma warheads would not be very useful against fighters since they have no blast effect and therefore would probrably only knock off a fin or a gun. However, I found while playing around that macro missiles armed with plasma warheads are actually very effective if you target the enemy fighters cockpit or midsection.

: So, I have a couple of options: I can make the fusion warheads have a bigger blast, to make them more effective. Alternatively, I can pump up the damage on fusion warheads to bring them closer to the damage plasma warheads do. I don't really like either of these options. The reason is really in the scaling. Dumbfire bombs are a very large warhead. They make a big blast with fusion warheads, probrably enough to take out several adjacent fighters. (though hitting a fighter with an unguided, unpropelled bomb is next to impossible) The macro missile packs about a tenth the warhead size. It's blast is thus very small. If I bring up the blast size of the fusion warheads, then the dumbfire bombs will have an absolutely huge blast radius with fusion warheads, which will cause a considerable slowdown with the particle effect used for the explosion. If I bring up the damage of the fusion warheads, I risk unbalancing them with the other weapons.

: Maybe what I need to do is &quot;dumb down&quot; the macro missiles themselves. Right now they track very intelligently, even going so far as to turn around and make another &quot;attack run&quot; if the target evades them on the first pass. If I make them explode when they are detected to overshoot the target, this might make the fusion warheads more attractive.

===Technically it's the 19th..===
: I set up the missiles to explode once they detected that they've overshot. They have some leeway, however, basically, once they are close enough to the target that they predict an impact within a second, the warheads are &quot;armed&quot; and will go off either on impact or if the missiles are both headed away from the target and are more than a seconds travel away - clearly overshot. This change worked quite well. The fusion warheads are now definately better versus fighters, (plus the wanton explosions and such is much cooler than the &quot;precision strike&quot; of the plasma warheads) and the plasma warheads are better versus capital ships.

I realized what was causing the funny scrolling with the 2D backdrop. Unfortunately, I'm still scratching my head trying to figure out how to fix it. I had hacked it into a TexOscillator, but I just realized today that the movement of a TexOscillator is sinusodial, not linear. I need to find a way to compensate for that by adjusting the phase appropriately to counter the sinusodial effect.

{{classbox| January 20th, 2004}}
: My backdrop system got a new leash on life when I finally figured out how to get it to pan 100%. Then I realized something else. I need to somehow &quot;warp&quot; the texture as it gets farther away from the center. As it stands right now it works really good at tighter FOVs, but when the FOV gets too large it starts to look funny. I wasn't sure what it was, until I tried going back to using a skybox for a while, and then it hit me. Figuratively speaking. The texture needs to &quot;stretch out&quot; as it approaches the edge of the screen. Unfortunately, I'm not sure how I can go about doing that from within Unrealscript. That may spell the end of the backdrop system in it's current form. However, I may be able to cook something up yet.

: Also, I think I need to make another type of AI, essentially a &quot;commander&quot; AI to decide what ships the AI pilots should build. For the time being it's random, but it would be nice if there was an AI &quot;commander&quot; that would decide what sorts of ships were needed and dispatch appropriately.

: Also, I think I need a way to &quot;rearm&quot; after launching from your carrier. It doesn't take long for the bombers to run out of bombs, and missile launchers eventually run out of missiles. I may change the way the carriers work a bit to facilitate this. For the time being, you spawn inside the carrier and it launches you out like a cannon. (like the &quot;catapults&quot; on modern aircraft carriers) For now, if you try to fly back into the carrier, it just launches you back out. I may change this and make it possible to fly back in and land back on the carrier, at which point it would resupply you, refill your fuel and energy, and possibly repair damage. That way seems fraught with complications, like someone spawning and getting launched out of the carrier as you are trying to fly back in. Not only will both ships pulverize each other, but they'll leave a debris field inside the carrier, so when both players respawn they'll probrably get blown up from all the debris, and make a big loop. Which would be bad.

: So, what I'm probrably going to have to do, is have a volume around the carrier's hangar, and if there's any friendly ships in the volume, no ships will launch. Ideally I would have a big hangar with little stalls you could land in and stuff, but I think that if I scale up the capital ships to the level that that would require, I'll probrably run out of map space. Plus, that would call for some sort of forcefield airlock thingy, which I don't really want to have at this point, but maybe I'll change my mind.

: Also, I found out what was up with the scale in Homeworld. While texturing up some of the components I looked at some other Homeworld ships and realized something. A &quot;fighter&quot; in homeworld is about the size of a small capital ship by most science fiction standards. I couldn't even find the cockpit on the Kushan bomber at first, then I noticed a little square about a hundredth the size of the ship, which is apparently the cockpit. The cockpit I've been using for testing was pulled off a Taiidan Interceptor, and when I went to texture it I found that apparently the part that looks kind of like a big glass hatch when untextured, is actually like a whole control room. I tried to texture it a bit different to make it not look so wierd as one big window, but it ended up looking like some kind of robot drone or insect cockpit. However, the retexturing made some things look a lot better. Also, the way the Unreal Engine likes to anti-alias stuff makes the textures from Homeworld look kind of crappy. A lot of those textures use squarish shapes that look fine when stretched, but when they get antialiased they start looking like what they are - a 16-pixel wide texture that's been blown up to a humongous scale.

{{classbox| January 24th, 2004}}
: Wow. Talk about a blast from the past. I found a hard drive while cleaning up a while ago, a Quantum Fireball 270 MB drive to be precise. The date on it says July 94, and it has MS-DOS 6 with Windows 3.1 installed. Computers have sure come a long way in the past ten years...

: Having said that, I haven't been doing much coding the last couple of days. Instead, I've been playing games. Specifically, space shooters. The aim being, I don't want to lose sight of what I'm aiming for. Even more specifically, I don't want to pack in a bunch of realism and end up with a game like Orbiter. (Not that I've played Orbiter, I'm making a guess that it wouldn't be very entertaining.) Unfortunately, I was a bit stumped when I realized that there wasn't any recent space shooters that I knew of. The exception being Freelancer of course, but that one basically feels like a stat-building hack-n-slash - basically, Diablo II in space. Granted, Diablo II IS pretty popular, so maybe that's not so bad, but it's not really what I'm aiming for. 

: Strangely, reviews and screenshots of Freelancer look crappier than I remember watching over the shoulder of people in the senior computer lab at university. In a way this is good, and in a way it's bad. It's good because it means that the level of graphics that I thought that Freelancer had was just my imagination, so now I don't need to compare my game to a seemingly unattainable vision. It's bad though, because I want my game to look like what I thought Freelancer looked like.

: So I found a copy of Freespace 2, which is kinda old, but I don't know what's newer as far as popular space shooters go. Even so, I don't think that gameplay has really advanced that much, though the graphics are a bit dated. Anyways, I started playing, with the intent of getting some inspiration of how to make my mod better. The first thing I noticed was, &quot;this game has way too many bloody controls.&quot; Plus it didn't support my mouse wheel. So, I busted out the old Thrustmaster Tacticalboard and mapped some keys. Then I started thinking, &quot;maybe I need some more keys.&quot;

: Right now, there is hardly any for my mod. The control system is a bit more configurable than most games to support the possibility of any ship design. Basically, you've got &quot;actions,&quot; which can be defined and mapped onto stuff that happens. (IE, you could create an action &quot;Start Firing&quot; and map it onto all of your weapons so they all fire when the &quot;Start Firing&quot; action is performed. Then, you map keys to your actions. This way, you can have an arbitrary number of actions and assign them however you like. For instance, you might set a weapon to use &quot;Fire Guns&quot; while another weapon uses &quot;Fire Missiles.&quot; Then, the keys can be mapped differently. And, if you later want to change your key configuration, you only have to reassign keys to your actions, instead of having to reconfigure all of your ships. So far, on all the ships I've made, I have all the weapons on one key, while theres a few keys to fire engines: right click to go to full throttle, release right click to go to 0 throttle, mousewheel up or down to modify throttle. The up key also applies full throttle, and the down key applies full reverse throttle. (IE retros)

: For now, this system has worked well - the ships have only really had one weapon system. However, I can see where having different &quot;banks&quot; of weapons can add to the fun. That brings me to my next point. I think I need missile locks. Right now, the missiles are smart enough that they will automatically home on your selected target. It was kind of fun getting a missile lock for the &quot;aspect&quot; missiles in Freespace 2. So I think I need something like that.

: Also, a big one, I need either weaker weapons, shields of some kind, or tougher ships. I don't want to remove the locational damage stuff that I have now, but I do want to make the fighters a little tougher initially. Reason being, the ships start to fall apart once they lose pretty much anything. They don't really have much that they can &quot;afford&quot; to lose. I kind of liked having shields and a central &quot;hull integrity&quot; - this way you can take some damage and &quot;be in trouble&quot; without being totally helpless, whereas on my mod 50% hull integrity basically amounts to 50% of your equipment missing - and you can't do much without an engine. It kind of adds a &quot;desparation&quot; or &quot;last ditch effort&quot; kind of an aspect, which I liked. Unfortunately, shields don't fit in very well with the atmosphere I wanted to have, but maybe I'll just up the hitpoints of some of the smaller components a bit, and see how it goes. That's the only place there's really a problem: your cockpit and major structural pieces can take something of a beating, but smaller (yet essential) things like fins will get torn off the minute they take any serious fire.

: Also, the ships in Freespace 2 carry an unrealistic amount of ordnance, but it doesn't really detract from the gameplay. In fact, I think it's good. It retains the feel of limited ammo without forcing you to be a miser.

: Anyways, that's all for now, except I looked at the tracefire weapon code and updated it a bit. Interestingly, it almost feels harder to hit people with tracefire weapons than it did with projectile weapons, but maybe that's just a consequence of decreased volume of fire. I'm curious if maybe it's actually the slight &quot;thickness&quot; of projectiles that makes them easier to hit with, but I'm not sure if that's the case or if it's something else. Maybe I'm just so used to leading the target that I'm having trouble with the tracefire weapons. Or something.

{{classbox| January 25th, 2004}}
: Yikes! The issue with the engine not drawing things more than about 60,000 units away has come back at me. I had it fixed more or less by having &quot;stand-ins&quot; to make an accurate semblance of what was going on at great distance. This sytem actually worked surprisingly well. However, I've encountered a new problem: beam weapons and such ALSO get clipped at 60,000 units. Which means that there's a gap between where the beam appears to originate, and the place where the beam first begins to be drawn.

: In theory, I could probrably have the visual effects for the beams find the appropriate place on the stand-in and appear to come from there - but I'm not sure how well that would work. The simple reason being that stuff that's really far away is drawn in the skybox. That makes it a bit more complicated to have the two appear to &quot;line up.&quot;

: Also, the lighting is imperfect on the stand-in system, but there's not much I can do about that. It would be nice if I could disable the automatic clipping at 60,000(ish) UUs, however.

: Unfortunately, since that's not an option, I'll have to figure something else out. I'm not yet sure what exactly to do about it. Eventually I may break down and use some scheme to determine the on-screen location of the start of the beam (theoretically) and then manipulate the beam to make it appear to come from that location. That's a less-than-ideal solution, since it would require a fair bit of processing overhead, however.

{{classbox| January 26th, 2003}}
: Most of today's coding efforts was just doing research on assorted things. I had some interesting findings. In my search for more speed for my mod, I considered if static arrays might be faster than dynamic arrays. So, I set up a bunch of loops to test assignment, creation and deletion of elements in a dynamic array, etc. I had some interesting findings:
* The times fluctuated considerably on different runs, even with 2048 iterations. (max size for a static array)
* There were, however, clear trends. Interestingly enough, dynamic arrays were fairly consistently faster. This is contrary to what I had anticipated.
* The values assigned to the arrays does not seem to matter. This suggests there was no caching magic going on as performance was comparable with random numbers as well as with fixed ones. (Except for slight overhead for the FRand() call, but this was the same difference on both static and dynamic arrays)
* Dynamic arrays can add elements faster in a batch than alone. IE, if you have to add 10 elements, increasing the length by 10 is better than increasing the length by one 10 times. However, this difference was relatively small.
* Strangely enough, assignment and creation combined (IE, assigning a value to a nonexistant index) was faster than either! In fact, assigning 2048 individual elements (to non-existant elements) was faster than just setting the arrays length to 2048! This implies to me that perhaps initialization is a relatively expensive operation, though this seems strange.
* The differences in times were obvious, but generally almost insignificant. The vast, vast majority of the time elapsed during the tests was overhead from the loops. Unfortunately, overhead from the loops was difficult to measure because it fluctuated wildly. However, the for loop appeared to consume about 80% of the elapsed time. (measured by executing an empty for loop 2048 times)

{{classbox| January 28th, 2004}}
: While poking around in my UT folder I found some parts of the humble beginnings of my mod. I was hoping that there was enough preserved to post some &quot;1st generation&quot; screenshots, but it was not to be. Going over the code I'm amazed not only at how far it's come, but also at how developed it was. The script for it was about a third of what I have now. However, I didn't really have any AI, except for crude turret AI. It was still pretty neat though. One interesting thing (which is not in the current version) was the ability to super-customize all your weapons and such, like in ''Freedom Force'', if any of you have played it.

{{classbox| January 31, 2004}}
: Unfortunately I've been really busy with school lately so I haven't been doing much modding. I've considering changing the scale a bit though. Not changing the scale as in literally changing the drawscales of stuff, but changing the focus from fighters to small capital ships. I'm not sure about that though. On the one hand, even with a large number of players the number of fighter present may seem unrealistically small. One would think in a real fleet engagement there would be dozens upon dozens of fighter craft. This isn't really possible of course, due to a lack of players and a lack of processing power for that many AIs. If each player had a frigate-sized capital ship, that would make for a more realistic fleet engagement. However, I don't know if that would be a good move: space combat wouldn't really be the same without fighters. Also, the style of combat between capital ships would likely be very different than that of fighters. It wouldn't necessarily be a &quot;slugfest&quot; as Star Trek games generally don't have much in the way of fighter combat but still turn out okay. Still, it's not really what I was aiming for, so I'll just have to think about it some more and see what I come up with.

{{classbox| February 3, 2004}}
: Man, the word February looks really wierd when you write it. Anyways, I noticed that my previous &quot;fix&quot; for the beams, of forcing them to less than 60,000 UUs length, did nothing to fix the problem. It seemed logical at first, but then I realized, no matter how show the beam is, if you are more than 60,000 units from it's start but not from it's end, or vice versa, the beam is going to appear broken.

: So, I've started considering shrinking everything. If I just scale everything down so the entire space area is only 60,000 units across, that would more or less fix the problem for good. However, there's an inherent problem with that: if I want to scale down everything in space, I'm gonna have to scale down the pawns so they can still fit inside the ships and stations and such. I'm not sure how well that will work, however, since I'll probrably have to scale the world down a lot, and the people will probrably end up being about 2 UUs tall. The problem with that being, I don't know how well it will work with the physics and such. Presently there's an &quot;uber-leet&quot; physics system on the pawns that allows them to walk on any surface within a certain number of degrees perpendicular to the direction of gravity. IE, your feet have to be facing the direction gravity would be pulling you. This is nifty because it allows you to walk on the decks of your ship, regardless of the direction your ship is actually facing. I'm not sure how well that sort of system would bode with super-small pawns. I guess I'll have to bite the bullet and try it out...

{{classbox| February 4th, 2004}}
: No dice on making stuff smaller. That played havoc with the Karma, greatly amplifying the constraint bug I've been having. It appears that that bug must be caused by a loss of precision in floating point somewhere, possibly resulting in division by zero or some other such hazard. Of course, such speculation doesn't help much since I can't modify the source anyway.

: Speaking of which, I've been inserting tons of hacks into my code to try to get stuff to appear properly. Specifically, the beam effects. I hate having to work around the engine limit so much - it's turning into a real pain. Unfortunately, I can't even cleanly encapsulate them in many cases because of specialized behaviour of some pieces. For instance, the firecontroller of a weapon (something like the WeaponFire actors in UT2003) never actually moves, so effects can't be spawned out of it, but instead need to get spawned out of wherever the weapon is. However, the code in the superclass for generating special effects goes by the location. Now, this was easy enough to work around, by simply having the function overridden, convert the coordinates appropriately, and feed them into the superclasses function. Unfortunately, I can't do that with trying to work around the distance because now I require not only locational adjustments, but also scaling adjustment. Hence, I now have two nearly duplicate functions, which is not very good programming style. Of course, the perfect place to encapsulate this stuff would be in the renderer, but I can't access it unfortunately. Even better would be if Epic hadn't instituted an arbitrary limit on the distance. The bit of cruel irony is that there's a cull distance variable that does the exact same thing, but it doesn't get used in any of the stock code. (instead preferring the hard-coded limit :rolleyes:) It would have been a piece of cake to set the default culldistance of actor to 60000 or so, and then just use that culling functionality.

{{classbox| February 5th, 2004}}
: I'm still dearly hoping that Mosquito is right and that the 60,000 UU limit on the renderer has been removed. That's one of two nagging problems that I haven't been able to fix - until now, anyway.

: Today I think I've sealed the fate of the second problem, the &quot;karma constraint explosion&quot; problem. Originally I had planned to basically have the server fake replication to itself, so if the main version failed, it could revert to the &quot;replicated&quot; version (which doesn't use karma, but instead uses a nifty movement extrapolation system to predict where it should be on the server given ping and such.)

: Anyways, that solution wasn't working that good. Reason being, the ship get's &quot;tippy&quot; shortly before &quot;exploding.&quot; The tippiness doesn't set off the &quot;explosion&quot; detection, and so the tippiness is recorded as normal behaviour and sent off to clients. This is a problem. However, today I found something that appears to have sharply reduced the incidence of constraint explosion.

: You can have fins/wings on your ship which help you to manuever. It's not all that realistic, since there's no atmosphere and all, but fins and wings look cool and if they didn't do anything, I doubt many people would use them. Anyways, they have a semi-sophisticated system to detect how they should apply &quot;rudder&quot; in order to rotate the ship to the desired facing. The greater your velocity, the stronger the fins become. Also, if you are travelling fast in a straight-ish line, they stabilize the craft, making it easier to line up shots.

: Turns out that something in their code is putting an insane stress on the mathematics inside the Karma engine. I don't know whether it's the stabilization or the rotation part, but commenting out all the fin code appeared to have more-or-less stopped the constraint explosion dead in it's tracks.

: Interestingly, I sort of thought the fins might be responsible all along - like a voice in my head saying &quot;maybe it's the fins. They get more powerful at speed, and so does the constraint problem. Maybe there's a connection.&quot; Unfortunately, for a long time I ignored that voice, dismissing the notion as absurd.

: So anyways, now I'm going to dissect the fin code and see if I can find out what's causing all the mayhem. I'm also going to continue hoping that the 60,000 UU limit will be fixed in UT2004, or some future version of the engine at any rate. That would save me a lot of script execution time and improve visuals at the same time.

: New screenshots ARE coming, they're &quot;simmering&quot; on my screensaver while I decide which ones are the best. I'm also hoping to have something &quot;new&quot; to show off before I post new screenshots - most of the improvements since the last batch of screenshots have just been coding improvements that aren't really reflected in the visuals.

{{classbox| February 12th, 2004}}
: I played the UT2004 demo, and had mixed feelings about it. Some things were neat: specifically I liked some of the emitter effects and such. I also liked the matinee movie at the beginning of the assault map.

: I don't like the new sniper rifle. It should have been named, the &quot;slower than death&quot; rifle. I haven't tried any of the space vehicles, but I didn't really like the ground-based vehicle combat that much. Reasons being, they're way too flimsy, the tank feels floaty, and the vehicle combat just feels like a run-of-the-mill tank combat game. Though in theory this is what it should be, since they are tanks and such, it doesn't really have a FPS feel to it. Also, the terrain is appparently just for looks, since basically all the vehicles can go over pretty much any obstacle and can shoot far enough and fast enough that range is almost a non-issue.

: They also changed a lot of the weapon meshes, though I can't figure out why. Some of the new ones I think look markedly uglier than their predecessors. (Shock rifle and assault rifle in particular)

: Supposedly there was going to be a new UI in UT2004, but I had sort of expected that meant a different type of UI, not the same UI with different graphics and buttons in different places. The AI has also supposedly been improved, but when I played the Assault level the AI just sat in minigun turrets (which are lousy) while me and my team walked right through and hit all of the objectives. At one point I had to hit F1 just to make sure I hadn't accidentally forgot to put bots on the blue team! When they were attacking I saw them, and they zig-zag relentlessly - good from an avoiding incoming fire perspective, but kind of annoying. Reminds me of counterstrike &quot;bunny hopping.&quot;

: Unfortunately, the whole thing seems more sports-game like than UT2003, which was a complaint many people seem to have had about UT2003 itself. Onslaught is kind of fun, but it's basically just the game Battlezone/Battlezone II with a bunch of the cool stuff removed.

: Anyways, having said all that - I got the fins taken apart so the &quot;constraint explosion&quot; seems to be more or less fixed. The only problem is, without the manuevring assistance of the fins, the ships are a bit &quot;wobbly.&quot; That is, they overshoot their desired rotation when turning, and then they have to turn back, and so on, which makes it a bit tricky to line up your shots. I'm looking for a solution to this problem, but unfortunately the ideal solution is probrably not a practical one.

{{classbox| February 14th, 2004}}
: I made a nifty &quot;spectator cam&quot; for spectators, which should help in making a movie of a game-in-progress. It's a bit jittery, but I'll put in some smoothing later. What's important is I noticed a couple quirky things. The ships wobble a bit - this is due to the new physics for the jets, which are necessary. I'm still trying to iron out the wobbling though, especially since it makes the bots have terrible aim.

: Also, the fighters are now getting into &quot;turning contests&quot; and trying to circle strafe each other, which is not the behaviour I was hoping for. The reason for this appears to be that two fighters attacking each other pass at moderate distance, sufficiently far apart that they both believe that they are far enough away to continue their attack run without getting into this sort of turning contest. I can increase the &quot;break off distance&quot; for the attack runs, but I'd rather cook up a scheme to detect this circle strafing behaviour. I've been working at that, but so far it doesn't seem to work. (sometimes it does, but other times it doesn't...)

{{classbox| February 17th, 2004}}
: Hmm. I could have sworn I wrote an update yesterday. Oh well. I got the ships to cease wobbling. However, this creates kind of a funny feeling, but I guess it's not too bad. Basically, the stabilizers come on strong when you overshoot your intended rotation, with a gentle activation while returning to the desired rotation. This creates a fairly smoothe rotation, but the smoothe rotation gets a bit sharper when you reach the desired rotation. However, this satisfies both conditions required for good controls: it's smoothe when making large turns, without being sluggish when making precise aiming.

: I also noticed a bit of a bug that was preventing the &quot;bot cheating&quot; auto-aiming from working. The new spectator camera allows me to track the action much more efficiently and I noticed that the biggest problem with the bots is that they face off at rather long ranges. This is only natural in space, of course, but it makes projectile weapons, with the exception of rediculously fast projectiles, very difficult to hit with. The lead is easy to calculate for any speed of projectile, but the target will often change heading, even if only slightly, during the flight of the projectile, and this makes it very difficult for the fighters to hit each other, except with very fast projectiles.

: 
I'm not sure what to do about this. The problem isn't so much the speed of the projectiles as it is the distance between fighters when they dogfight. (the time the projectile spends in transit, specifically, is the problem.) I have a couple of potential solutions:
; Make the projectiles faster: I've tried this but I don't really like it. In order to be effective, the projectiles have to go so fast that you can barely see them in flight. This is not what I want.
; Make the ships slower, and reduce projectile range to force ships to fight at closer ranges: I don't really like this one because it involves making the fighters slower. This actually seems to be the norm in space games. For instance, the fastest fighters in Homeworld only travelled at about 150 km/h. (My own guesstimate based on realistic ship size and space travelled relative to ship length) To be completely accurate, they actually went a lot faster, but were just rediculously huge and styled funny. (a Taiidan Interceptor appears to be roughly the size of a Defiant-class warship from Star Trek.) Anyways, if we imagine the Homeworld fighters were actually like single-seater fighters, they'd only be going about 150 km/h - kind of slow for a space craft. Freespace 2 also has pretty slow ships. The fastest ones only go about 100 metres per second, which is only a few hundred kilometers an hour. I want mine to go fast, like a few thousand kiometers an hour. However, such high speeds necessitate combat at long ranges.
; Relegate Projectile Weapons to a supporting role, use trace-fire weapons for most things: I don't really like this one, although it is admittedly realistic. The smallest weapon a space fighter is likely to carry would be a 20mm anti-materiel machine gun, the bullets (if you want to call them that, more like a steak knife if you ask me) go really, really fast. So fast they can punch through both sides of an APC from several miles away - and that's including wind resistance, which has a MASSIVE effect on the speed of a projectile. Point being - 

modern projectile weapons go really really fast. However, science fiction space craft projectiles typically do not go all that fast, which is probrably for looks more than anything, but still. Looks are important.
; Leave it as-is and have the effectiveness of projectile weapons largely determined by how well you can predict when the opponent is going to fly straight and when they're going to turn: This is, on the surface, an ideal solution. However, this sort of prediction is bound to be very difficult for an AI pilot to do. Whether or not a human player is going to turn away or fly straight is, of course, impossible to predict with complete accuracy, though it could be predicted somewhat, there are so many variables that would impractical to figure out, like volume of fire the target is taking, both from the AI in question and others, the targets capabilities, condition (damage wise), presence of friendlies, etc. I don't think that an AI pilot could handle this well without doing a lot of computation.


: I '''do''' want combat to occur at closer ranges, but I don't want to slow down the ships. Also, there is a considerable difference in speed between different designs, which would make it hard to simply enforce close-in fighting by reducing ranges. One can't really argue the light and manueverable versus slow heavy-hitter argument, since some ships are just plain better equipped. (One design I made has twin engines, 6 fuel tanks, two heavy cannons, two machineguns, and an on-board fusion reactor, but is considerably faster than a lightly equipped superiority fighter I made that has only a single engine and fuel tank, two missile bays and a machinegun. (The more stuff you have, the more points an enemy gets for destroying you - it's kind of a diminishing returns thing since bigger ships are bigger targets.))

====As if that weren't enough! (Later that day)====
: I think I need new music for the level I've made to test stuff in. The current music was okay, but it doesn't seem to fit anymore. Unfortunately, UT2003 came with a relatively inappropriate soundtrack for space-based conflicts. Hard rock seems most appropriate, but this might be better suited to the spectator-cam view. For the spectators it's all about the action, which I why I think that something like that would be best for a spectator's view. However, for the players I'd like something that caters more to the tension of a heated dogfight. Alternatively, I could go for more of a &quot;space ambience&quot; soundtrack with basically just assorted creaks and rattles and beeps and such - various space-craft noises to serve as the background for the sound effects from actual stuff happening.

: I guess that'll have to wait until I get an actual team together, but I'm going to wait at least until UT2004 comes out before doing that. (I want to see if the 60,000 UU render distance actually has been removed, as Mosquito suggested. Preliminary tests with the Runtime suggest it may well have been, but I can't say that with complete certainty yet.)

{{classbox| February 18th, 2004}}
: I could have sworn I updated earlier. Oh well. Today I've been just playing around with the UI, making it a bit fancier. I added detail level options to the GUI as well. Basically boring stuff. I also swapped all the weapons to fusion cannons to test to see ifthe projectile thing I suspected above was the case. The bots have no difficulty fighting with instant-hit weapons. (They better not, they have the advantage of auto-aim! :P) So the problem is fairly isolated to incorrect determination of lead - I'm fairly certain that this is a result of the target changing heading, as detailed above.

: Also I want to do some optimization but I don't know what needs optimization. I haven't written any new processor-intensive code since the last update, in fact I've optimized the resource distribution system even more! Even so, I can only get about 8 players at one time now before the framerate suffers, whilst before I could have twelve. Granted, I have pretty trails now which are relatively expensive effects to generate. Unfortunately, I don't know of any practical way to find out where all the time is being spent. Once again I wish Epic would profide some sort of &quot;execution profiler&quot; that would count and time every function call (should be simple if you had access to the interpreter) so you could see which function calls were eating all the CPU time.

Also, I desperately need a &quot;sloppy clipping&quot; option for Emitters. I can make some killer particle effects, but they use so much GPU time being clipped to fit around polygons whenever a ship passes through them, it causes an unacceptable GPU hit. If there was a way to do &quot;sloppy clipping&quot; where a &quot;sloppy&quot; sprite would either be behind or in front of a given triangle (or even entire meshes), but wouldn't be drawn intersecting, that would allow me to make way nicer effects with less GPU usage.

{{classbox| February 21st, 2004}}
: I meant to write this up last night, but once I got in front of this computer last night I couldn't remember what I was going to write. I remember now, though, so now I'm writing it!

: Anyways: I kept hearing about this game Call of Duty so I decided to give it a shot. (This was about a week ago) It was pretty fun, which is saying alot, since I generally don't like world war II games. Later I played Red Orchestra for UT2003, and I remembered what I could from TTR for UT a long time ago when I tried that.

: I didn't like Red Orchestra or TTR. This got me thinking. Thinking that, since generally I don't like WWII games, if I liked Call of Duty, it must have something special about it. If I could figure out what it was that made it so good, I could likely make my mod that much better.

: The graphics weren't much to write home about: they were decent, but not excellent. If I had to rate them I'd say they are slightly behind the Unreal engine's graphics capabilities. So I knew it wasn't the graphics. I was playing on my mom's computer, and someone had been screwing with the sound settings, and I wasn't in the mood to fix it, so I was playing without sound. So it wasn't the sound or the music. (if there is music)

: I'm not a fan of WWII games in general, so I knew it wasn't the theme. The FG42 was cool looking, but other than that I didn't care for the weapons especially. So, still looking for the reason I liked it, I was thinking, it just feels so realistic! Now, TTR and Red Orchestra both appear to have a &quot;realism&quot; element to them too, so what's the difference? Well, the difference appears to be that Call of Duty has realism, while TTR and Red Orchestra had &quot;realism.&quot;

: What is the difference, one might ask? Well, both have deadly, instant-hit weapons. Both have reloading and authentic weapons and iron sights. (Actually I don't know if TTR had iron sights or not) Both seemed to have reasonably authentic levels and such. However, what Call of Duty had that Red Orchestra/TTR did not, is a realistic AI.

: This goes for pretty well all &quot;realism mods&quot; I've seen on the Unreal Engine. I don't really remember if TTR even had bots, but I know Red Orchestra did. Tactical Ops did. Infiltration did too. (But I think they tweaked the bots, so I won't count them.) I'm sure there's others. The problem with the AI in those mods is it's just the standard Unreal AI - good for arena-style combat with mysteriously weak weapons and such, but the Unreal AI is hardly realistic, which is why I think it makes &quot;realism&quot; mods feel unrealistic. (No pun intended there)

: Most of these modders have probrably never been in a heated firefight, so maybe you can't blame them. Trust me, you don't zig zag back and forth firing madly. The only time you ever jump is if you have to get over someone else. As far as I'm concerned, realism mods don't need a jump button at all. Trust me. Jumping in a firefight is stupid. The only thing to do is hide behind something solid and take pot shots when you think nobodies looking. Sometimes you might sprint or crawl to a better piece of cover, but that's usually dangerous. More often than not, your boot gets caught on a branch, or the webbing on your tactical vest catches on barbed wire. Then you're a sitting duck, and you get hit.

: Anyways, this is exactly what the AI in Call of Duty does. They just cower behind stuff and take occasional pot shots. They barely ever hit. (It's quite possible to empty a magazine without hitting anything despite firing responsibly, because the enemy will almost always be behind dense cover, just like you are.)

: Another nice thing, AI related, is that they may not notice you based on various factors. Hiding behind bushes and stuff makes a difference, and muzzle flashes give you away. Other stuff that's going on also serves as a distraction and makes the AI less aware of your movements. (Or at least, it acts less aware of your movements) Also, whether or not the AI hits you is more a question of when, rather than if. The AI appears to start with a really innacurate aim, then &quot;bullet hose&quot; toward you from that initial aim. This I like better than the Unreal AIs straight &quot;chance to hit&quot; style of accuracy.

: Also I like that there's no classes or anything. Class selection in WWII games is annoying. I like the way that Call of Duty gives you several weapons, and you can just use whichever one you prefer. If you don't like it, there's plenty of other weapons laying around.

: Anyways, just thought I'd post that here. Hopefully some people will read it and maybe it'll help the AI for their mod be that much better. (Not sure of the technical issues associated with detecting whether a view of a player is obstructed by a terrain deco layer, but I'm sure you could find a way.

{{classbox| March 4th, 2004}}
: I haven't done anything with the mod in a couple of weeks, unfortunately. I've been busy with various things such as University and getting a new car and such. Also, I've been cooking up a scheme for pseudo-atomic bomb that wouldn't require any radioactive material or cause any fall-out. Very clean and relatively cheap to build. I've been pondering if that might make an efficient powertrain for an automobile or possibly an aircraft. (Hmm, fusion-powered rocket engine.. sounds dangerous :/)

: Something else I've come up with is an interesting concept for an operating system. As you may or may not be aware, there's a million and one things that operating systems do to prevent programs from messing with each other, control access to devices, etcetera. Also, they switch off control from one process to another every 10 milliseconds, including all of the overhead required to &quot;clean up&quot; the CPU for the next process while preserving the exact state of the CPU, to be restored when the previous process runs again. There's also memory relocation to make all programs believe they are the only thing executing in memory and various other things that I could only describe as &quot;hacks&quot; to attempt to work around the architecture. Many of these things have even been implemented in hardware to reduce the performance hit. Why that's bad is because they're hacky workarounds to begin with. What's really needed is a brand new multitasking architecture in which address translation, protection and such isn't an issue.

: One might say, but that's impossible! You can't prevent programs from messing with each other without using hardware to do it, unless you're going to precheck every instruction as it gets executed, which would slow down the system by an order of magnitude. But that would be thinking &quot;inside the box.&quot; Here's my scheme: you can check every instruction without much impact if by doing so you can reduce the total number of instructions. This can be accomplished rather easily since most things you would want to do do not require the granularity of straight machine code. So, the check (which is like two instructions anyway, what with a clever scheme I had) is amortized over a larger number of machine lanuage instructions. Since there's less overhead, (no context switches, address translation, etc.) I think it may end up actually being faster than present operating system architechtures.

: I got this idea when thinking about a number of things at the same time, mostly I was thinking about how Java is so ungodly slow, whilst Unrealscript is very fast, for an interpreted language. I'm fairly certain that the difference is that in Java, virtually every low-level structure and such is implemented in Java, which is unavoidably slower than C or assembler. In UnrealScript, all the low-level stuff is implemented natively, which is good, because it's almost always stuff you would never want to change anyway. (Such as concatenation of strings and stuff.)

: Anyways, basically a compiler's going to make something in-between bytecode and machine code. I was initially considering having an interpreted setup like unrealscript, but decided that that would be too slow - then you have to look up a bytecode for every instruction. However, you also can't have applications run at the machine level, because then you have to use a million and one hacks to prevent them from either inadvertandly or maliciously tying up a shared resource, damaging each other, running away with the processor, etc.

: So I figured you need a middle ground. Basically, machine language, but a machine language that doesn't provide the functionality required to do the above evil things.

: Anyways. There's probrably lots more I could say about that, but it's late, and I'm kind of tired of thinking about it for the time being. And there's one more thing I wanted to rant about:

: This was obviously going to have to be written largely in assembler. That's okay, since I've locked horns with machine code before. Though manually looking up opcodes in a reference manual and entering them into memory on a Commodore 64 is something I'd rather avoid doing again, I figured that since back then they had these things called &quot;assemblers,&quot; (I didn't have one) it would be a lot easier for me now that I could just download an assembler off the internet. These assemblers would allow you to enter the instructions one per line and it would convert it into opcodes and enter it into memory for you. You could even save programs and everything! Quite the marvel of technology. So anyways, I downloaded a few and was quite surprised to find that apparently assembly language had evolved into something else. Not the good kind of evolution (the kind I don't believe in anyway) where species supposedly evolve into other species. This is the kind of evolution where you live next to a nuclear plant and your firstborn has five arms.

: It was my understanding that assembly language was supposed to convert 1:1 to machine language opcodes. There wasn't supposed to be any functionality that wasn't availible at the machine level. So, to my surprise, I find not only structs being declared in machine language, but functions too! After a little bit of reading I find that this is called &quot;MASM&quot; and was made by Microsoft. Apparently, it's supposed to be a lot like programming in C. See, the thing about that is, if I wanted to program in something like C, I'd program in C. The real beauty of assembly language is that it is supposed to be exactly like the way the processor actually operates. So, the very first long word I reserve space for in a bootloader really does go at location 0 in memory. (presumably, anyway) By putting structs and functions in assembly language, you defeat the purpose of using assembly language.

: One might argue that that functionality is all optional, and you don't have to use it if you don't want to. That's fair, if you'd consider listing human blood on a drink menu (on the grounds that you don't have to order it if you don't want to) fair.

: So anyway, long story short, the chair of the computer science department of the University I go to wrote a software package that emulates a PC and some hardware, specifically intended for experimenting with operating systems concepts. I obtained a copy of it and I've been using the included assembler and linker. I'm assuming (hoping) that it's compatible with x86, though I'm fairly certain it would be. At the most I might need to change the names of a few opcodes, but that would likely only entail writing a simple disassembler that takes the compiled binaries and spits them out with x86 opcodes.

: On the upside, I've learned some interesting things about the way C programs look after compilation. For some reason I had suspected that when compiled all the function names would be different, or maybe even in many cases absent. However, they appear to translate literally to references that can be picked up in assembler using .extref.

{{classbox| March 12th, 2004}}
: I've still been super busy and haven't been able to do much with the mod. I've made a few small tweaks in the short time that I've had the opportunity to. I made the bombs self-propelled, so they're more like a slow-moving rocket, kind of like in Freespace. Previously they were basically a pure dive-bomb, requiring vehicle momentum to hit. Unfortunately, this seems to be a fairly difficult thing to guarantee for bots. Vehicle momentum still counts, of course, but the bombs are a little more predictable. I've also been considering changing salvoes of bombs (world war II style) for singular, more powerful bombs. (Like in Freespace.) That would be better for networking, and maybe would make the limited ammo on bombers a bit less limited.

: Speaking of limited ammo, I've noticed something interesting when observing botmatches. The bots run out of gas. This isn't normally a problem, since they're just sitting ducks then. The issue is, if I leave it for a long time, when I come back, all the bots will be out of gas and just hanging in space. I have a couple of potential fixes to this: I can make thrusters not use any fuel. I don't really like that idea too much - it removes any incentive to carry larger fuel tanks. I could make the thrusters more efficient, but the generators still consumes fuel, so I'd have to make them more efficient too. I don't really want to do that, because there again, it removes incentive to carry additional fuel. I could make the bots suicide when they run out of gas. I'm not sure how good of an idea that is. I could also do like in Homeworld, where if a ship is out of fuel, it can still move, albeit very slowly. My qualm with this is that it might require something of a hack. I'd have to either provide some stipulation in the firecontroller to accomodate that, or make engines generate fuel at a very slow rate.

====Later that day...====
: Aha! I got to thinking about the scale and the render distance and such, and then it hit me. The reason I couldn't just scale stuff down was because I was using the wrong factors. I didn't realize that reducing the ships to 1/10th their current size, requires the engine power, etc. to be reduced by a factor of a hundred, not by a factor of ten. (Ten times because the world is now a tenth the size, and ten times that because the ships are only a tenth of their previous size - so the ship requires a tenth the impulse to move at the same speed in UUs, but since everythings scaled down, it only should go at a tenth the speed it was going before.) This is good. It will make the world look better. Unfortunately, it's going to be a lot of work, because unless I just put something in the superclass of all my special effects, I have to update all the special effects. I don't want to put a hack in the superclass because that incurs a cost at runtime.

====It's STILL the 12th? Geez.====
: Got more of the scale stuff changed. I also found a wierd bug that only manifested itself when I reduces the scale. This is very queer, as the bug has apparently been there for some time without effect. Almost makes me wonder if there was some other bug cancelling out the effect of this bug, forcing it to lay dormant until now. Hmmm.

: Anyways, everything's scaled down, (except the lights and sounds, so the lighting is kind of washed out and you can hear things from a long way away) but I haven't decreased weapons range yet which had some interesting effects. Firstly, this is kind of bad, because you can &quot;snipe&quot; the enemy carrier from near your own. This isn't necessarily bad if you had some sort of long ranged weapons, but for the time being, any weapons will reach far beyond the enemy carrier. (Note to self: I have to reduce the projectile speed to accomodate the new scale.) Anyways, that's going to be changed when I update the ranges. The ranges on the carrier weapons may or may not be changed. I'm still deciding. After fixing the but mentioned above, the bots would fire again, which caused an interesting behaviour. The carriers shot at each other. This isn't in itself a bad thing, in fact it was more or less something I wanted to happen. Unfortunately, the AI is pretty good at crippling enemy capital ships. One carrier mauls the weapons on the other carrier, while the other carrier molests the inside of the first carrier's flight deck with it's beam weapons. Though effective, these things are kind of bad. Carrier two loses it's ability to defend itself from fighter attack, so there is less need for diversity to take down the carrier. Not that it matters, since your chance of making it out of the flight deck on carrier one are next to none.

: I'm not sure how to deal with this, I do want the carriers to shoot at each other somewhat, but not to the extent that they severely impact the fighter's combats. Potential solutions:
* Adjust the headings of the carriers so the flight deck of carrier one doesn't face carrier twos main weapons and also so that carrier ones guns can't easily hit anything important on carrier two. This also poses a slight balance issue as fighters launching from carrier one have a slightly more direct path to carrier two.
* Start the carriers out of range from each other, and have them close in. Premise being, by the time they're in range, the attacks will already be well underway, so carrier two will already be missing most of it's guns, and fighters will mostly be launched (barring those that are respawning) so carrier two can't bottleneck carrier one's fighter bays.
* Change the carriers. Or something. This is possibly the best option. Both are copyrighted material so I can't release anything with them in it anyway. Meaning, they're going to get removed anyway, so maybe I shouldn't worry about it. Of course, there's no guarantee that their replacement won't have similar problems.

{{classbox| March 14th, 2004}}
: That annoying &quot;constraint explosion&quot; was starting to creep back in, and I was kind of annoyed. The only way I could find to keep it in check was to smoothe everything out. The AI was bad for this, since it doesn't need to move a mouse or joystick and thus can make &quot;isntantaneous&quot; changes in it's desired heading. Anyways, the problem was cropping up when ships would get hit hard by capital ships. They'd go careening off, the stabilizers would go crazy trying to correct, and the resultant pressure put on the Karma engine by the stabilizers wrecked everything.

: Interestingly, it wasn't until today that I realized I could stop this behaviour by simply placing an upper limit on the maximum amount of stability assist that can be provided. Unfortunately, like the smoothing schemes I was using before, this is more or less only a stopgap measure - albeit an effective one. If you REALLY try to strain the Karma system, (setting level.timedilation to 10 does the trick) it's still possible to cause the constraint explosion. However, you can't really play at that kind of speed anyway, since unless you have an ungodly framrate you wouldn't really even be able to see stuff coming.

: I also changed the mouse control a little bit to make it more like first person space sims. Previously you could use mouse control which was sort of like Freelancer, and your ship would &quot;chase&quot; the cursor, or you could use joystick, where it was like a flight sim. I've changed the system so the mouse is more like a flight sim mouse setup. This is cleverly set up to mimic a joystick, so the mouse basically just fakes it, based on how fast the mouse is moving, and/or the time since the last mouse movement. So, if you move the mouse quickly, then stop, that's like jerking the joystick and then releasing it. The downside of course is if you want to make a big turn. However, I don't think that will be that big of an issue, since I have a trackball, and I don't think there's any better solution for the brick type of mouse anyway.

: One reason I made that change is so that the experience is similar using either. The other reason is that one had a bit of an unfair advantage. The joystick can only be moved so far, and has to be relative to your ship. For sensitivity reasons, you can't have extreme left be 180 degrees (behind the ship) otherwise you wouldn't be able to control very well. However, with the mouse, you could just scroll more, and thus could set your desired heading to any angle you wanted. This allowed for harder turns for mouse users. Unfortunately, it also means that the turning ability of a given craft will never be realized to it's full potential because the controls have been restricted. I'm not sure what to think about that. In a sense the ships aren't working to their potential. In another sense, limiting the amount you can turn makes the ships move a little more gracefully.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foxpaw/Cosmic Fury</title>
    <id>1259</id>
    <revision>
      <id>3242</id>
      <timestamp>2007-05-30T02:08:07Z</timestamp>
      <contributor>
        <ip>Adsl-221-204-15.mgm.bellsouth.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''I don't like that name anymore, but I'll come up with a better one eventually.'''''

==Overview==

Imagine Homeworld. Now, add in the ability to fly your ships in first person with all the fidelity of a space-shooter. Then, add the ability to custom-design ships from scratch, assembling them in any pattern you can imagine from a library of &quot;parts&quot; that can be designed with complete flexibility. Now, instead of a static 2-4 player strategy deathmatch, the battle takes place in a massive universe with numerous fleets, systems, and, of course, resources.

From what visual effects to use, to &quot;stats&quot; such as thrust, vector exhaust capability, and fuel consumption for thrusters, or damage, projectile speed, fire rate, energy draw, and more for weapons. Nearly every aspect of every part can be modified and customized by the player. Of course, the more powerful your weapons and systems, the more resources you'll need to build them...

You can mine resources and build a massive space armada, freelance for wealthier players to gain the resources to improve your custom ships, or become a pirate and raid resourcing operations to build up a nomadic pirate fleet - if you get a powerful enough fleet (either through ships with high stats, or just lots of them) you might be able to carve out your own little empire. In the meantime, you can take shelter with a larger friendly fleet and add your guns to their own. 

----

The above basically summarises what the mod has become/is in the process of becoming. There will likely be a single player campaign/story too, but I'm not sure yet what that will be. So far progress has been steady, and the only real hurdle is obtaining a large enough server/bunch of servers to handle a &quot;massive&quot; universe. Also I'm not sure how I should go about having an &quot;auto-resolve&quot; for fleets in other areas during single-player.

==Progress==

===First Generation===

[[Image:Legacy_FoxpawsGen1Boarding.jpeg|right|]]

I recently found the source for generation 1, which used a custom physics system and lots of other fancy stuff. The first generation was made for UT, before UT2003 came out. It eventually ran into problems and I lost interest, only to regain interest when I got a copy of UT2003. Looking back, some parts seemed incredibly primitive, while I'm surprised by how clever some other parts of the old code were.

[[Image:Legacy_FoxpawsGen1Hangar.jpeg|left|]]

[[Image:Legacy_FoxpawsGen1Carrier.png|right|]]

===Second Generation===

[[Image:Legacy_FoxpawsNebula1.jpeg|left|]]

[[Image:Legacy_FoxpawsNebula2.jpeg|right|]]

----

Second generation was for UT2003 and used Karma. I didn't take many screenshots of this generation, unfortunately. This generation was using KVehicles. This actually worked pretty good but the transformation from being derived from KVehicle to being derived from Actor eventually ended in a complete rewrite, giving birth to the third generation.

===Third Generation===

[[Image:Legacy_FoxpawsGen3Left.jpeg|left|]]

[[Image:Legacy_FoxpawsLoneFighterB.jpeg|right|]]

[[Image:Legacy_FoxpawsGen3Backdrop1-2.png|left|]]

[[Image:Legacy_FoxpawsGen3Backdrop1.jpeg|right|]]

----

The third generation was also written for UT2003 and also used Karma. However, unlike the second generation, the third generation did not use KVehicles. Instead I wrote my own classes that utilized the Karma physics system. This generation got pretty far along but the performance was not that great due to requiring numerous workarounds to keep the Karma engine funcitoning the way I wanted it to. Eventually I dropped it and rewrote from scratch using a custom physics system, like that used in the first generation code.

===Fourth Generation===

Eventually I decided to rewrite from scratch for improved speed and to expand my options gameplay-wise. It took a while just to get up to the point where I was at with the third generation, but I managed to catch up and surpass it. The graphics have improved somewhat, the editor has improved a lot, and the performance has improved dramatically. This especially is good as it will allow for more ships to be flying around at once. 

I was going to say, &quot;you're probrably getting tired of seeing the same rear view of that same test fighter with the crooked fin, so here's some screenshots with other ships.&quot; However, I realized that I had only taken two screenshots with that fighter in them, so that wouldn't of really made sense.

At any rate, here's some new screenshots. Most of them have a cruiser that I slapped together. It actually looks pretty decent from most angles. I haven't made any &quot;bridge&quot; for it, so it's got a fighter cockpit stemming from it's front. Thusly, I've been careful not to post any pics showing it's front. ;)

[[Image:Legacy_FoxpawsCruiser1.jpeg|center|I dislike JPEGs. This screenshot looks better on my machine. It has a capital ship in it!]]

[[Image:Legacy_FoxpawsCruiserTurret.jpeg|center|Turret view, plus turret. Camera has been cleverly turned to give a more visually appealing side view instead of the normal rear view.]]

[[Image:Legacy_FoxpawsCruiserSide.jpeg|center|Cruiser shooting at something small and pesky. Note crooked fin and unsightly clipping on hilariously outdated placeholder model!]]

[[Image:Legacy_FoxpawsCruiserVsFighters.jpeg|center|Small team of fighters in an unfair fight. Note crooked fin (sans clipping) on hilariously outdated placeholder model!]]

[[Image:Legacy_FoxpawsRVGun.jpeg|center|Kind of an old screenshot, but I forgot to post it up here so that's an excuse to pawn it off as new. ;) Pretty on the outside, low poly on the inside.]]

===Fifth Generation===

[[Image:Legacy_FoxpawsDrunkenMissiles.png|left|]]

[[Image:Legacy_FoxpawsCloseInFrigates.png|right|]]

[[Image:Legacy_FoxpawsFrigateFormation.png|left|]]

[[Image:Legacy_Foxpaws2on3.png|right|]]

----

The ill-fated, possibly final generation of the mod. This one was turning out very good and I didn't see any way it could be improved, but unfortunately all the data was lost as a result of harddrive failure. The backups were also lost recently before this in an unfortunate coincidence. If there is ever a sixth generation, it will likely be very similar to this one code-wise.

'''MythOpus:''' Any chance you'll ever rebuild this baby?  I've actually dreamt of playing it...

'''T-1 not logged in:''' I would LOVE to see this, it'd make me reinstall UT.</text>
    </revision>
    <revision>
      <id>3243</id>
      <timestamp>2007-05-27T23:23:26Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <text xml:space="preserve">'''''I don't like that name anymore, but I'll come up with a better one eventually.'''''

==Overview==

Imagine Homeworld. Now, add in the ability to fly your ships in first person with all the fidelity of a space-shooter. Then, add the ability to custom-design ships from scratch, assembling them in any pattern you can imagine from a library of &quot;parts&quot; that can be designed with complete flexibility. Now, instead of a static 2-4 player strategy deathmatch, the battle takes place in a massive universe with numerous fleets, systems, and, of course, resources.

From what visual effects to use, to &quot;stats&quot; such as thrust, vector exhaust capability, and fuel consumption for thrusters, or damage, projectile speed, fire rate, energy draw, and more for weapons. Nearly every aspect of every part can be modified and customized by the player. Of course, the more powerful your weapons and systems, the more resources you'll need to build them...

You can mine resources and build a massive space armada, freelance for wealthier players to gain the resources to improve your custom ships, or become a pirate and raid resourcing operations to build up a nomadic pirate fleet - if you get a powerful enough fleet (either through ships with high stats, or just lots of them) you might be able to carve out your own little empire. In the meantime, you can take shelter with a larger friendly fleet and add your guns to their own. 

----

The above basically summarises what the mod has become/is in the process of becoming. There will likely be a single player campaign/story too, but I'm not sure yet what that will be. So far progress has been steady, and the only real hurdle is obtaining a large enough server/bunch of servers to handle a &quot;massive&quot; universe. Also I'm not sure how I should go about having an &quot;auto-resolve&quot; for fleets in other areas during single-player.

==Progress==

===First Generation===

[[Image:Legacy_FoxpawsGen1Boarding.jpeg|right|]]

I recently found the source for generation 1, which used a custom physics system and lots of other fancy stuff. The first generation was made for UT, before UT2003 came out. It eventually ran into problems and I lost interest, only to regain interest when I got a copy of UT2003. Looking back, some parts seemed incredibly primitive, while I'm surprised by how clever some other parts of the old code were.

[[Image:Legacy_FoxpawsGen1Hangar.jpeg|left|]]

[[Image:Legacy_FoxpawsGen1Carrier.png|right|]]

===Second Generation===

[[Image:Legacy_FoxpawsNebula1.jpeg|left|]]

[[Image:Legacy_FoxpawsNebula2.jpeg|right|]]

----

Second generation was for UT2003 and used Karma. I didn't take many screenshots of this generation, unfortunately. This generation was using KVehicles. This actually worked pretty good but the transformation from being derived from KVehicle to being derived from Actor eventually ended in a complete rewrite, giving birth to the third generation.

===Third Generation===

[[Image:Legacy_FoxpawsGen3Left.jpeg|left|]]

[[Image:Legacy_FoxpawsLoneFighterB.jpeg|right|]]

[[Image:Legacy_FoxpawsGen3Backdrop1-2.png|left|]]

[[Image:Legacy_FoxpawsGen3Backdrop1.jpeg|right|]]

----

The third generation was also written for UT2003 and also used Karma. However, unlike the second generation, the third generation did not use KVehicles. Instead I wrote my own classes that utilized the Karma physics system. This generation got pretty far along but the performance was not that great due to requiring numerous workarounds to keep the Karma engine funcitoning the way I wanted it to. Eventually I dropped it and rewrote from scratch using a custom physics system, like that used in the first generation code.

===Fourth Generation===

Eventually I decided to rewrite from scratch for improved speed and to expand my options gameplay-wise. It took a while just to get up to the point where I was at with the third generation, but I managed to catch up and surpass it. The graphics have improved somewhat, the editor has improved a lot, and the performance has improved dramatically. This especially is good as it will allow for more ships to be flying around at once. 

I was going to say, &quot;you're probrably getting tired of seeing the same rear view of that same test fighter with the crooked fin, so here's some screenshots with other ships.&quot; However, I realized that I had only taken two screenshots with that fighter in them, so that wouldn't of really made sense.

At any rate, here's some new screenshots. Most of them have a cruiser that I slapped together. It actually looks pretty decent from most angles. I haven't made any &quot;bridge&quot; for it, so it's got a fighter cockpit stemming from it's front. Thusly, I've been careful not to post any pics showing it's front. ;)

[[Image:Legacy_FoxpawsCruiser1.jpeg|center|I dislike JPEGs. This screenshot looks better on my machine. It has a capital ship in it!]]

[[Image:Legacy_FoxpawsCruiserTurret.jpeg|center|Turret view, plus turret. Camera has been cleverly turned to give a more visually appealing side view instead of the normal rear view.]]

[[Image:Legacy_FoxpawsCruiserSide.jpeg|center|Cruiser shooting at something small and pesky. Note crooked fin and unsightly clipping on hilariously outdated placeholder model!]]

[[Image:Legacy_FoxpawsCruiserVsFighters.jpeg|center|Small team of fighters in an unfair fight. Note crooked fin (sans clipping) on hilariously outdated placeholder model!]]

[[Image:Legacy_FoxpawsRVGun.jpeg|center|Kind of an old screenshot, but I forgot to post it up here so that's an excuse to pawn it off as new. ;) Pretty on the outside, low poly on the inside.]]

===Fifth Generation===

[[Image:Legacy_FoxpawsDrunkenMissiles.png|left|]]

[[Image:Legacy_FoxpawsCloseInFrigates.png|right|]]

[[Image:Legacy_FoxpawsFrigateFormation.png|left|]]

[[Image:Legacy_Foxpaws2on3.png|right|]]

----

The ill-fated, possibly final generation of the mod. This one was turning out very good and I didn't see any way it could be improved, but unfortunately all the data was lost as a result of harddrive failure. The backups were also lost recently before this in an unfortunate coincidence. If there is ever a sixth generation, it will likely be very similar to this one code-wise.

'''MythOpus:''' Any chance you'll ever rebuild this baby?  I've actually dreamt of playing it...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foxpaw/Developer Journal</title>
    <id>1260</id>
    <revision>
      <id>3244</id>
      <timestamp>2005-09-02T18:37:36Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====July 5th, 2004====

Well, I've integrated the menus all into one, which is neat. I also worked out some accessed nones and revised the gameinfo to allow the level to run before the level is actually &quot;run.&quot; That is, there's only the one level that is ever played in, but that level is loaded while the front menu is being displayed. Obviously, you don't want gameplay to begin until after the player has selected some stuff from the main menu.

However, the upside is that the whole thing is really fast. It's kind of neat, but also kind of bad. Specifically, it's kind of bad because it feels unnatural to be dumped into the game when you've barely released your mouse button. Most games have loading screens, and I was expecting to see one when I hit &quot;new singleplayer game.&quot;

To remedy this, I've implemented a short delay which is supposed to represent all your ships and stuff coming out of warp space. Basically, you log off by entering warp space, and remain there until you log in again the next time. This greatly simplifies saving and loading to a level manageable from within Unrealscript, since a lot of the &quot;state&quot; is not stored. (projectiles in transit, particle effects, etc. do not need to be preserved in this way.)

Some players would rather have a true &quot;save&quot; and &quot;load&quot; feature on the single-player game, but for the time being that is not practical without native saving and loading support, or large amounts of Unrealscript code to store and restore the state of all objects.

So anyway, I've got the menu flow working. I haven't tried the vehicle editor yet since I changed some of the workings of the menu, but all the other menus seem to work normally so I'm assuming that will to. If anything it should require only minor debugging. With all that working, you can now build stuff, give orders to friendly units, manuever the menu system, shoot at things, get shot at by AI things, and design vehicles. That doesn't leave much left to do. In theory. There will be a lot of polishing and content creation to do, of course.

Also, I still have that cursed problem to solve with the rotations of stuff in the editor. However, I'm confident that the solution will come to me eventually.

====July 19th, 2004====

It's been a few days without internet access because I had a network cable disconnected and I didn't really get around to reconnecting it. However, I did do some coding, which has been in short supply lately. I got the editor working again alongside the regular level, so you don't have to load a separate level to access the editor anymore. I'm not sure why, but the saving of designs wasn't working anymore so I fixed that too.

Then I added the actual saving functionality, which is cool. It had a few bugs to work out, but in the end, it all worked nifty. So now I can retain a persistent world state without native loading and saving stuff. Also, I added the ability to switch which of your ships you are controlling. I'm pretty excited that both of those things are working. I might change the switching between ships part a bit, but most of that code will remain the same.

Iterestingly, it was not THAT difficult to allow saving of the world state in UnrealScript. Unfortunately, there are a couple of things that can't be saved in this manner - in particular, the progression of an objects state code, or emitter particles, for instance. However, for the most part, stuff can be saved by simply providing a list of variables to be saved. Since Unrealscript can look up variables by their string name, and also read the value in string form and set the value in string form, this was surprisingly easy. Basically, you just have a list of properties that you want saved, each one has a GetPropertyText done on it, and the variable name and value is stored in a relational database. Then, come loading time, all the actors are spawned again, and the tuples of the database are iterated through with SetPropertyText. This allows you to very quickly recreate the world as it was saved.

Of course, some things like references can't be stored in this manner. For that reason and for simplicity, as little as possible is saved. This doesn't cause the exact game state to be stored, but that isn't the intention either. Admittedly, for singleplayer it would be nice to store an exact game state, but that will require native support (to store references and such) which, to my knowledge, is not available in UT2004. (It's not available in UT2003, and I don't have UT2004 yet.)

'''Wormbo:''' Save games (like in Unreal) are available in UT2004, the implementation still seems to have a few problems, though.

'''MythOpus:''' I've been trying to follow your mod development as closely as possible...  I think I have the basic idea put together in my head but correct me here...  players will be immersed into an always expanding, always changing world.  The player will be in charge of a fleet.  He must then build up that fleet, gather resources etc... to eventually wage wars and what not to take control of the persistent world?  Okay...  now on to another question...  will it be multi-player capable (as in online warfare)  or do you doubt it... and when a player logs out and 'goes into hyper-space', does the world save everything and pause or does it keep on going if you leave it on?  If it keeps on going and you choose to log back in... what would happen if another fleet of ships was right your hyperspace wake?  I request to be a beta-tester also :P

'''Foxpaw:''' Well, that's pretty much it. You can control a fleet, or you can dump all your resources into building a small group of ships or a single ship with more exotic (and expensive) weaponry. So it caters to both first person space shooter-type players as well as those who want something more like an RTS/Homeworld kind of play. For the single-player I plan to have a campaign and stuff to keep it a little more interesting. In multiplayer it will be more like an MMO. To facilitate a large number of players, I'm planning a peer-to-peer networking and distributed computing scheme using the IP wrapper classes in the Unreal Engine.

In single player the world will likely be &quot;frozen&quot; when you &quot;log off,&quot; (quit the game) and will resume when you return. I have considered the idea of having the game simulate some passage of time when you return, but I haven't decided on that yet. If possible, single player may also have the ability to save the game state as-is and return directly to the action.

For multiplayer, of course, the world will continue while the player is offline. I have considered the possible conflict that could arise if a player tries to log in and other stuff is occupying the space where the player's stuff was when they logged off. I haven't yet decided what to do about that. I have decided that there will be a visual and audio cue when a player is starting to log in. (like when their login has been accepted by the login server and they're connecting to their peers) This would be something like swirling dust or something around the point where a wormhole is about to open.. or something like that. I haven't decided whether the ships should just come through and collide with stuff, encouraging people to log off in less-trafficked areas, or possibly to have them adjust their position so they would warp in clear of any obstacles.

Beta testing is still a while off I think, but I expect when the time comes I'll try to recruit some people for the beta testing both here on the wiki and on BeyondUnreal Forums. (as much as I dislike forums)

'''Mosquito:''' I wouldn't recruit off the forums, alot of bad apples their and bunch of people that wont give you useful feedback, select or testers carefully, 5 good testers can be better then 50 bitchy llamas.

'''NickR:''' I'd really appreciate the chance to beta test. :D 

'''T1:''' Well, I can't resist. I wish to beta test also.

====July 26th, 2004====

Well, it looks like I might actually have the editor rotation thing down pat. We'll see though. I knew that the solution would be deceptively simple, and the solution that appears to be working is indeed simple, but I'm skeptical. It doesn't feel like it should actually work, though it appears to. I'm hoping that it will continue to work.

So, then, now I can get into singleplayer, have it load up the persistent state, fly around, build stuff I've designed in the editor, and give AI pilots orders to attack and stuff. The AI pilots are a little erratic, but sufficiently effective. So, now I need to make some higher-level AI so I'll have an enemy to play against. Plus a ton of polishing to do. However, I think that the AI is what's needed most at this point.

Simply enough, every ship has it's own AI pilot, which can recieve orders from some external source. AI pilots have limited ability to make decisions and can fight and such on their own. However, they have no knowledge of the larger scale goals and such of their &quot;team.&quot; So, for instance, a fighter is smart enough to escort a transport, and a transport is smart enough to travel to a given destination, but neither is intelligent enough to know what needs to be transported or why.

This is where the higher level AI comes in: it does all of the planning and stuff in pursuit of whatever goals that particular AI player has. I've also built in some limited support for heirarchies of AI players.

So for instance, a higher-level AI may preside over a mining base somewhere, and would give &quot;orders&quot; to mining vessels, fighter escorts, and transports to send processed materials to other bases where they may be needed.

Anyways, the higher level AI is likely going to have to be some kind of an RTS AI basically. The problem is that I know very little about how to implement an AI for an RTS game. I have looked at the Homeworld source which was released by Sierra, which may be a good starting point. The problem with that is that the Homeworld AI is a bit crude and has no &quot;political&quot; affinity aside from a predetermined list of enemies and non-enemies. Then it basically builds one of a few loosely defined fleets and launches an attack at what it considers to be the most valuable assets of the target player - usually the mothership or carrier.

I'd like an AI that is a bit more diplomatic, perhaps attacking people only with reason to do so and such. However, now that I mention it, a mining base is probrably the perfect test-bed for developing the AIs, since it has a pretty straightforeward motive. I think I'll give that a shot.

====September 3rd, 2004====

I'd been holding off on buying any new games until I got a new video card, since I would possibly get a sub-par gaming experience with my integrated graphics. Shortly before my last update I got an X800 Pro and I've been mostly playing games since. Unfortunately, I haven't been doing any work on my own mod.

I was going to make a mining base as a platform to develop the AI further, but then I realized that building a base was going to require me to make new meshes for the base parts, since I couldn't really build a base out of fighter parts.

The editor rotation thing does seem to work, but another part that seemed like the easier part of that problem doesn't seem to. This I find wierd because it's essentially the same code as the turrets, which seem to work. This has raised an unsettling feeling that maybe the turrets actually don't work, and they only appeared to work because of some coincidence in the way that I tested them. ...

Actually while I was writing that I realized that the turrets work because their axis of rotation is always the same relative to the turret's own internal coordinate system, (it can be anything in relation to the rest of the ship) but when rotating components in the editor the axis of rotation is dependant on how the component has been attached. To facilitate proper rotation I'm probrably going to have to make some of the turret code global to all ship parts, in that the rotation of a given part will be expressed as an axis of rotation and a rotation around that axis, instead of just a straight rotation relative to it's parent component.

That's reminded me of an interesting point: explaining things to people seems to be a good method of gaining new insight into those things. I've noticed this before, but never really written or said anything about it. However, it seems to hold true - many times I've been writing about a problem or telling someone about it when mid-explanation I'd have an epiphany. Sometimes I even have mock &quot;Q &amp; A sessions&quot; with myself when noone is around. (They might think I was crazy if they realized I was conversing with myself.)

At any rate, I'm hoping to get back into programming soon.

'''MythOpus:'''  Talking to myself always helps me figure out all my problems too.  My family usually thinks I'm talking to them though.  Anyhoo, how is the mod coming along?

'''Foxpaw:''' Well, as mentioned above it's somewhat stalled for the time being due to the editor rotation shenanigans. It's pretty much the only major coding hurdle that I can see still remaining to be surmounted.

Completion of the editor is essential to the creation of the game world, which is going to be required to experiment with a few more things.

Once I have the editor done I can start building up the game world, and then do some quasi-fun AI stuff.

====September 16th, 2004====

Well then, I actually did a bit of coding patching up a few minor issues. Now I'm thinking I want to change some of the lower-level workings of the ships, but I'm uncertain as to the best way to go about doing so.

Basically each ship is a heirarchy of parts. The part at the very top of that heirarchy keeps track of ship-specific stuff like the center of mass of the whole thing, the pilot, resources stored on-board, etcetera. However, every part has the capacity to store this information, but only the top part does. This is a waste of RAM. Further, it slows down run-time execution somewhat and complicates the AI system. Lately I've been noticing some oversights that have resulted from working with this system.

So, now I want to have a central &quot;ship&quot; actor, which will still have it's parts, but instead of the topmost element in the heirarchy holding the ship-specific data, the &quot;ship&quot; actor itself will store ship-specific data and handle the camera and such. It will also handle some of the AI which I want to simplify. Originally I was using a controller sort of system kind of like the system used by UT2003/UT2004. However, this system no longer makes sense to me, as every ship except for one is going to have an AI controller. (Barring network stuff, of course, but that's handled differently.) Then, every time a player leaves the control of their ship to go to a menu or something, an AI has to be created to take over, and then has to get destroyed for the player to come back in.

Instead, I'm likely going to have an AI built into the &quot;ship&quot; actor which will simply be overridden by the player. This also has the added advantage of having some continuity - that is, if a player takes over control of one of their ships temporarily and then leaves, it won't be replaced with a new, &quot;clueless&quot; AI. This should also simplify the code so I won't end up with oversights like stray cameras and AIs that didn't get cleaned up due to some anomalous condition.

However, I'm not really sure how to go about implementing a centralized &quot;ship&quot; actor - there are many ways that a ship can be created, and frankly I'm not sure that I remember them all. I'll take a stab at it later and see what I come up with though.

----

Well, now it's about 5 hours later, and it was easier to change than I expected. I came up with a clever scheme of just changing the name of the ship part class and then creating a new ship class to hold the per-ship data. Then I just caught all the errors tossed at me by the compiler to find all the places where the two classes were referenced. It ended up being relatively simple to change, because most places where a ship part was being referenced, it was either accessing per-ship data, or per-component data, and rarely were the two mixed. In fact, I had only two major bugs after recompiling and testing, which I'd say is pretty good for splitting a 29KB class into two.

Let me take this opportunity to curse Microsoft's Multimedia Keyboard, upon which the decision was made that people don't really use insert so it should be removed as a key and instead added as a third function of the print screen/system request button. Of course, no indication is made as to how to activate that feature, so when I accidentally enable insert somehow I now can't disable it.

Anyway, back to what I was saying: the new structure seems better and allowed me to remove several if checks, some recursion, and other assorted stuff. It also allows me to standardize ship controls a little more, which I guess is a good thing. It's faster at runtime, which is good. I've taken advantage of the speed increase to implement a more flexible resource system, though the most critical resources on a ship, energy and fuel, will remain with the older system as it is faster - so the things using the more complex system will be more like cargo and unrefined stuff that's been mined or whatever.

====September 17th, 2004====

So, I've been coding up a storm, but I've hit a roadblock and I'm stumped. Normally I can deduce my way out of any error, especially one as tame as an Accessed None, but so far I'm unable to overcome it. The reason being that I can't figure out what's going on. It seems I have an object reference that is None, but at the same time it's not None. How is this possible you say? Err.. well I don't know. But the following bit of code:

&lt;uscript&gt;
  if ( Parts[0] == None )
    DebugMSG( Parts[0]$&quot; is teh none!&quot; );
  else
    DebugMSG( Parts[0]$&quot; exists.&quot; );
&lt;/uscript&gt;

reliably generates the message &quot;World.ShipPart is teh none!&quot; which doesn't make any sense. Clearly, Parts[0] == None since it would have to pass the check to display that message. However, the very fact that the object's name, World.ShipPart, shows up in the message, means that Parts[0] can't be none.

I'm going to continue working on this bug and perhaps try some more deductive methods of finding out what's wrong, particularly finding out what's causing this anomalous condition. I'll post an update if I figure it out, though it might take a while due to the apparently impossible nature of the bug. (My suspicion is that perhaps somehow I have accidentally foiled the garbage collection system, but I'm not sure how I could have done so as ShipPart is a subclass of actor)

----

'''UPDATE:''' Okay, I was close. I also caught a fleeting glimpse into the garbage collector. Apparently, the Parts[0] WAS none, but whether it's &quot;none&quot; or not appears to be based on some flag stored in memory, as opposed to an actual value stored in the reference. This means that evaluating == None returns true, but casting to a String gets passed the &quot;accessed none&quot; checks and uses the region of memory that previously held a valid object. This condition persists for only a short time, and this memory appears to be reused after a short time. A most interesting bug to have.

'''Mychaeel:''' That flag you're talking about is probably &lt;code&gt;bDeleteMe&lt;/code&gt;.  Its consequences are mentioned already in the comments to the entry of May 31, 2004 on [[Legacy:Mychaeel/Developer Journal|Mychaeel/Developer Journal]].

'''Foxpaw:''' Possibly - but I think it might be a native bit. It could be bDeleteMe, but this isn't an instance where something has been deleted but still has bDeleteMe set - if you tried to access bDeleteMe in this case you would just get an accessed none. The ability to get the name of the objects by casting to a string persisted for several seconds after the reference was None, which is not (to my knowledge) the use of bDeleteMe. It was my understanding that bDeleteMe is only intended to be used to test if an object had been destroyed earlier in that Tick.

'''Mychaeel:''' No.  &lt;code&gt;bDeleteMe&lt;/code&gt; is set for any destroyed actor until it is garbage-collected &amp;ndash; and that usually takes until the next match starts.

Earlier engine versions just set the &lt;code&gt;bDeleteMe&lt;/code&gt; flag, removed the actor from the actor list (and put it in the &quot;just-deleted chain&quot; of actors which is maintained via the &lt;code&gt;Deleted&lt;/code&gt; reference defined in [[Legacy:Actor|Actor]]) and set any references to it to &lt;code&gt;None&lt;/code&gt;.

Newer engine versions also check the &lt;code&gt;bDeleteMe&lt;/code&gt; flag whenever an actor is accessed in UnrealScript (as in the &quot;==&quot; operation or when accessing any member of it) and return &lt;code&gt;None&lt;/code&gt; instead of the actual actor reference if it is set.  (In earlier versions, you could access a just-destroyed actor without problems as long as you had a reference to it &amp;ndash; that's not possible anymore.)  It might be that casting an actor reference to a string as it is done in those log statements of yours doesn't do that &lt;code&gt;bDeleteMe&lt;/code&gt; check, so you'd get an object name there even though comparing the reference to &lt;code&gt;None&lt;/code&gt; will yield &quot;true.&quot;

I've had some problems with accessing destroyed actors of my own when I assumed that destroying an actor would effectively set all references to it to &lt;code&gt;None&lt;/code&gt; &amp;ndash; that's apparently not the case, for instance when you've referenced an actor from a &quot;static variable&quot; (i.e. the default value of a variable).

====September 18th, 2004====

Well, I finally knuckled under and did the grunt work of implementing the component editor. It actually ended up being less of a nasty hack than I had expected, though it could still use some improvement.

At any rate, I can now use all parts of the editor so I can fabricate ships from start to end and build them in hangars. Previously I had manually edited some stuff to make the components, and then used the vehicle editor to just assemble them. The component editor was a complex part to implement because although it didn't involve anything particularly fancy, it involved a large number of variables that could be set, and which variables would be available for setting was dependant on what type of component it was. A mechanism for changing what type of component it is was also needed.

Anyways, now that that's done, there should be at least one new screenshot coming soon. I know I said that a long time ago, but I got kind of sidetracked. Unfortunately, I've been had by Sierra and the sample textures included in their Homeworld 2 SDK don't actually line up, although they look like they should. Further examination showed that the diffuse channel of the background in the level of Homeworld 2 that the sample textures are from is slightly different from the actual sample textures provided. The &quot;star mask&quot; appears to be the one from the production game, while the diffuse channel was perhaps modified prior to shipping.

What this means is that there are a few wierd artifacts where the alpha channel doesn't agree with the diffuse channel. I'll try to take screenshots that hide this anomaly. I have improved the backdrop code somewhat so it looks much nicer now too. This should be obvious when I upload the screenshots. Unfortunately, JPEG will probrably have something to say about the quality of the screenshots, but we'll see.

====September 29th, 2004====

First off, let me take this moment to thank Epic for making classes with very generic names, and then putting them in Engine so they effectively reserve the word into perpetuity. I really appreciate writing a lengthy but relatively straightforeward class only to find that it won't compile because Epic felt like they should include a class called VehiclePart that isn't even used at all and, though native, provides no apparent functionality. It's like finding a prize in your cereal, only instead of a prize, it's a broken bottle of arsenic. Ruins the whole bowl. I, of course, had the good fortune of naming a struct that and then writing a class using it I had to change it to something else, which was not as simple as search and replace as that particular string was also a substring of some other stuff that I didn't want changed. I actually knew about this class and thought it would work anyway, since, in most cases it does. However, the behaviour in this case appears to be somewhat inconsistent, so certain sorts of declarations used the struct, while others tried to use the class. This allowed me to pretty much finish the class before discovering this lovely surprise. Of course, since tons of stuff that is unrelated to the engine is stored in the Engine package, which you can't really exclude from your compilation, there's no way to really escape these generic &quot;reserved classes.&quot;

: '''Mychaeel:''' You can always fully qualify any class with its package name: &quot;MyPackage.VehiclePart&quot;.

: '''Foxpaw:''' Yes, but this is a struct interfering with a class, not a class interfereing with another class. Does the same apply for structs?

:'''Mychaeel:''' You can fully qualify a struct name with its class name: &quot;HudBase.SpriteWidget&quot;, or &quot;XInterface.HudBase.SpriteWidget&quot;.

Anyways, now that I've said that, the class I was mentioning was the one that stores your various ship blueprints and stuff. I wanted to change this for two reasons. Number one was that for some reason saving a ship would sometimes wipe out all of your saved component designs, and sometimes saving a component would wipe out all your ship designs. Bad news. I think I found the cause of that while doing a complete rewrite of that class, but I wanted to rewrite it anyway. Previously, the vehicle &quot;catalog&quot; that stores your designs was a subclassed &quot;persistant state&quot; that stored only your components and ships that you had designed and never actually got loaded into the game wholesale. I decided to change this for one main reason:

When I originally wrote the class, I thought that that system would be good. Ships, once designed, would retain all of their properties, so if you changed a component design, ships already designed with that component would not be affected. At the time I considered this to be a good thing, as it would allow you to keep your older designs without having their parts cluttering up the part designer. I've changed my mind on this though, as I think it might be inconvenient for players to redesign all of their ships if they wanted to change some of the stats of a weapon or something. So now, ship designs just reference the components they are made from instead of making their own copies. This neccessitated a separate &quot;catalog&quot; class and not just a subclassed &quot;persistent state.&quot; With the new system, changes made to components after a ship was designed will affect all ships that have that particular component on them somewhere, but only ships built from that point onward. For the time being, there is no mechanism to retrofit existing ships, though I might be able to implement something like that by having it compare the components of your ships to find the closest component and retrofit to that. No reference to the original component templates used is stored in the components, so I would have to find some scheme to figure it out based on which component template was the most similar.

I also found a small bug that I'm amazed eluded me for so long. If a ship takes enough damage to certain areas it can be severed into two or more independant parts. This is done automatically in the function that causes a ship to remove components from itself. What I didn't realize was that when I remove a component from a ship so that I can put it on another ship, I was &quot;severing&quot; it off of ship A to put it on ship B, but the act of &quot;severing&quot; it from ship A caused it to be made into a fragment, a member of the new &quot;ship,&quot; ship C. Then it merrily went about adding it to ship B, (having passed the check to see if it's part of a ship already, and severing it if it is) and thus ended up as a member of TWO ships. This was causing wierd rotation issues that would be fixed by saving and reloading. (As the saving code will only recognize one of the two ships as the actual owner of the component.) I suspected it was something like that, but I was having difficulty finding out where in the code that was happening as all of the references from the component to it's parent ship pointed to ship B, but ship C was sitting inconspicuously in RAM with references to the component.

Also, in addition to my earlier rant, I'd also like to express my feelings for the changes made to the broadcast system for UT2004. How could this be a problem, one might say? Here's how: UT2003 had a queue of up to a thousand messages in the console window. (Though I don't think it would actually display that many.) It did so with little performance overhead. UT2004 has a queue of a hundred. How is this bad, you might ask? Well, despite having a queue 1/10th the size, if you pump a lot of messages into it fast, it slows down the game enormously. I first noticed when I spawned a UniversalThingTally. (a debugging tool I made which does an allactors and reports back a count of each type of actor existing in the world, and it does this every tick. I use it to find things that aren't getting cleaned up like they should.) Now, a UniversalThingTally puts a LOT of messages on the console. It caused a minor slowdown in UT2003. But in UT2004, it drags my system from a peppy 200fps to 20 as soon as it's instantiated, and over the next few seconds, it goes down to 5, then to 2, then to 1, then I hit tilde, type in &quot;exit&quot; and hit enter, wait a few seconds, then shout some profanities.

I fail to see how the changes made to the broadcast system are an improvement. I copy and pasted UT2003s code into a subclass of ExtendedConsole and all was well.

I recently ported the code for the mod over to UT2004, by the way. I suppose I didn't explicitly mention that. The mod directory structure is cool, and the fact that saved games are supposed to work in UT2004 is cool too. Most of the other code changes (low-level packages like Engine, IPDrv, etc. only - I can't speak for the UT2004 game stuff) are of questionable value.

====September 30th, 2004====

Turns out that I actually didn't have the problem fixed that I thought I had fixed. Now, I have found the problem. It's certainately devious. As you likely know the contents of structs are stored if a variable of that struct's type is declared as a config variable. What you may or may not know is that elements of the struct declared as transient are not saved. This is obvious when you think about it, and is desired behaviour.

However, what I've rudely discovered was causing me so much grief, is that transient elements are not only not saved, but they are '''reset to zero/null/empty array''' when you save the struct using SaveConfig() or StaticSaveConfig(). This seems like a most bizarre behaviour and was likely not intended by Epic. What probrably happens is it writes out the data, then reads it back in. Reading no value for the transient members of the struct, they are set to their appropriate initialization value.

Also, the cool Homeworld-esque trail system I made seems to have been antiquated by the behaviour of TrailEmitters being changed. Although TrailEmitters are inferior to my system (you can see some visual artifacts if they are viewed from certain angles) I'm going to switch due to the increased performance of the native trailemitters.

To top that all off, I got some high-poly models up and running, which has upped the visual quality. (Screenshots are on the [/Cosmic Fury] page.) I've actually gotten a surprisingly large amount of stuff done today, though granted I only had one and a half hours of class today so I spent a lot of time on the mod. I've got almost all the bugs worked out, except for some reason the vehicle editor crashes sometimes when you try to save. Oddly enough, the longer you go between saves, the more likely it is to save when you eventually do do the save. This seems bizarre, but I have no idea what could be causing it. It's crashing in a static function, I know that much from the stack trace, but the whole vehicle &quot;catalog&quot; is static functions, so, err.. yeah. If it becomes a big enough problem I'll try instantiating the catalog and see if the stack trace gives me some more useful output then.

====October 4th, 2004====

Today I mucked around with some special effects stuff, but I don't have much to show for it. First I made bullets that looked more like carrots, but I was eventually able to improve them so they look more like tracers and stuff in flight. I also worked on my generic explosion effect which was dandy. I'm still not quite happy with the effect, but it's not bad.

I did, however, implement a proper &quot;turret cam&quot; which greatly helps when using the space station I made. The annoying thing that was going wrong with that was, any combination of pitch and yaw will result in some roll. (Assuming you don't use a fixed coordinate system.) Normally this isn't a problem. Your ship just rolls and your camera is &quot;upright&quot; before you even notice that you rolled slightly. However, since the space station has no form of mobility, and as such CAN'T roll, those little rolls start to add up and next thing you know you can barely control your crosshairs. The new turret cam puts your view squarely behind a turret of your choice, (pressing a button cycles through all available turrets and then back to the ship view) and all rotations are in the reference frame of the turret. Further, all roll control is negated in this mode, allowing you to aim more easily with turrets. This actually ended up being more complex implementation-wise than I had expected, because of course, the reference frame of a turret changes as it rotates.

'''Mosquito:''' you should consider implementing a master turret control, which you can select targets that all turrets in line of sight shoot at. It would be a pain to only use individual turrets while all the others idle.

'''Foxpaw:''' The turrets are actually already linked, and can fire in four modes - if they have their own target, they auto-aim at that target; if they have a human pilot with nothing targetted they all aim parrallel in the direction the pilot aims (either from the ship view or any turret's view); if the human pilot has targetted something the turrets aim so that their shots will converge at a distance equal to the distance from the ship to the target. (so the shots converge on the target, but you can still lead); and, if the ship is being flown by an AI pilot the turrets autoaim at the AI pilots' target.

====October 5th, 2004====

Since introducing some non-low poly models, things have been looking much better eye-candy wise. I keep taking screenshots that I want to post up but I know that I'll have better ones in a few hours anyway, so I've been holding off entirely.

I noticed that the fighters are very difficult for the AI to hit. (likewise for humans, but.. ermm.. I'm sure that's just me) This I attribute to a slight fault in the bit of code that does the lead-in calculations. Unfortunately those calculations are fairly complicated as it has to take into account movement of the ship firing, movement of the ship being fired upon, and of course the muzzle velocity of the weapon. The trick, however, seems to be that by adjusting the aim to lead the target, this subtly changes the distance before impact, which subtly increases the amount of time it will take for the projectile to impact, which subtly increases the amount of lead-in required. This seems to be pretty much a neverending cycle, which causes the AI to just barely miss most of the time. This problem is not particularly prevalent on larger targets, such as capital ships and space stations. To this end I think that I might either need to implement some sort of iterative system whereby the aim is repeatedly refined, or maybe I could just leave the lead-in calculations as they are on the premise that, as mentioned, hitting other fighters isn't that easy to do anyway.

'''MythOpus:''' Homeworld (I think) uses the repeadtedly refining method.  The AI usually misses fighters for the first two shots but then starts getting closer and closer to hitting them.  I think it works rather well, but you should inkorporate some sort of randomness.

'''Foxpaw:''' Heh, I was writing that I had finished implementing it while you were writing in support of it. ;) I actually haven't looked at how Homeworld does it, though I do have the source to Homeworld, so maybe I'll look there and see if they have a more efficient method.

----

Okay, so I implemented the iterative lead-in system, which resulted in fairly frightening accuracy on the part of the bots. This is good as I was hoping I could achieve this - if the bots have the ability to hit unerringly, then I can just factor in mistakes for them on lower skill settings. This way though, they have the code capability to be truly &quot;godlike.&quot; This took less time than I thought and uses amazingly few iterations. I was concerned about the performance implications since lead-in calculations are done fairly frequently - once per weapon on an AI controlled ship and sometimes once for the AI itself. However, it turns out that the iterative lead-in actually only goes for 2-4 cycles to get 1/1000th of a second resolution.

Also, now that everything's working pretty decently, I've been trying to arrange some larger battles betwen AI units. It's now that I've decided some optimization is needed. The framerate is still decent in a larger battle, but I can tell that at it's current performance it will not be able to handle a game world considerably larger than what I have now at acceptable framerates. So, unfortunately, I have to optimize, which is not very entertaining. That is of course, unless you like watching tons of numbers scroll by in the console and looking for ones that are abnormally high.

Fortunately, I wrote it with some optimization hooks so I can easily time to see which actors are whiling away all my precious milliseconds. The main culprits are turrets, and the master ship actor. The master ship actor is spending about 0.30 ms average in it's physics simulation, and about 0.20 ms doing AI. The other primary culprit is turrets, which consume about 0.22 ms each.

Interestingly, the physics simulation uses very little time most of the time but occasionally &quot;spikes&quot; every few frames. I've isolated this down to a few lines of code, all of which seem to spike similarly often. One of them performs a matrix multiplication, which should be somewhat time consuming, but strangely it is pretty fast for most executions - only spiking up once every few frames. Another line is simply a setlocation call. This I can't do much about except hope that perhaps some tweak in the next patch will eliminate the sporatic spiking. The third does another matrix multiplication, and a setrotation. I haven't dissected that yet to see which of the two are spiking, or if it's both.

----

Well, I couldn't figure out what was causing the spikes, so I optimized as much as I could and left it. The turrets were optimized simply by reducing their resolution a bit. (Resolution in this sense meaning the minimum amount that the turret must turn before it will go to the trouble of updating all of it's physics and such) This helped because the AI tends to have a slight &quot;jiggle&quot; which is too small to be noticeable on screen but was still stressing the turret physics more than was neccessary. I optimized the AI by implementing an &quot;awareness&quot; feature - basically, the less aware the AI, the less frequently it scans for targets, etc. The awareness of a given AI is based on it's current activities, so an AI with no orders or a simple movement order is the least aware, AIs with defensive orders like escorting another ship or holding a blockade are more aware, and AIs actively engaged in combat are the most aware.

====October 10th, 2004====

I finally implemented the last part of the physics system for the spacecraft. Previously I had most of the physics in, but applying an impulse could only give a linear velocity, and not &quot;spin&quot; you around. I changed that over the course of today. This actually proved to be trickier than it sounds, because you have to take into account both the location of the impulse relative to the center of mass of the ship, as well as the direction of the impulse. After puzzling for a while on tangents, planes, and a derivative or two, I eventually got a solution using cross products. The derivatives were eliminated by putting a simple constraint on the system, that a force could only be at maximum the approximate radius of the object around. So, for instance, a force can only be applied to an object from within that object somewhere. (or on it's outer surface) Forces with a &quot;location&quot; outside of the object are treated as if they were right on the surface of the object.

I'm somewhat surprised that companies actually get paid good money to develop physics systems, but mine only took 2-3 pages of UnrealScript and a couple of days to implement.

'''MythOpus:'''  Instead of making physics systems that Epic will no doubt steal from you anyways... get a job from Epic to work specifically on physics systems :O

'''Mychaeel:''' Physics are simple as long as you have a single, solid body which is exposed to simple forces.  It gets interesting as soon as you have that body interact with another one in a non-trivial manner (i.e. have a barrel fall on a floor, or have a body with arms and legs attached by joints collide with a barrel).  Just ''maybe'' that might be the reason real physics systems take months or years to be developed and loads of money to license.

====October 11th, 2004====

Not much today - I spent most of the day mucking around with the AI to try to get it to aim a little better. Unfortunately I didn't have much success with that, though I did confirm that my aiming routines were mostly working, for some reason there is a slight difference from the direction the bot is &quot;aiming&quot; and the direction that it's guns actually end up pointing. I'm not sure yet why that is occurring, but I'm sure I'll figure it out eventually.

I also implemented some nifty view shake which was surpringly effective. I had intended it just as a &quot;nice touch&quot; but it seems to add a lot of energy to the game and also serves as a semi-useful feedback device to let you know when you are hit, and gives a satisfying rumble when you fire weapons with a lot of recoil.

Unfortunately, the AI's movement seems to be messed up somehow. They used to fly off into space seemingly randomly when given a movement instruction, but they worked fine when fighting. Now, however, they seem to fly off when instructed to attack as well. So, I'm going to have to figure out what's causing them to fly off like that. I suspect it's something simple, but it seems like it might be difficult to diagnose.

----

All right, that took me all of 5 minutes to fix. I feel kind of silly for not noticing that I was referencing the AIs rotation and velocity, when of course the AI doesn't actually move, only it's ship moves. I must have let that slip in while I was optimizing some code or something.

====OCtober 18th, 2004====

One week later, so what have I accomplished? Well, err.. I, umm. Yeah. Not much. I think I spent most of the week thinking about girls, playing Far Cry, and I'm pretty sure I did some other stuff that I'm sure was productive or something.

However, I did have a potentially valuable insight. While I was pondering more stuff for an operating system that I may write someday. (I haven't really gotten started besides a simple &quot;Hello World!&quot; OS, as I'm not really sure where to begin.) Anyways, I was thinking about optimizing for performance (as I often do) and I was thinking about arrays. Then I started thinking about Unrealscript, and how I had a lot of arrays in my mod. It wasn't until a couple of days ago that I realized that a linked list would probrably be a lot faster than an array. The reason being, almost all of the accesses to the arrays are iterative ones inside a for loop. Every time I access the ith array element, that involves a multiplication, which takes over 30 cycles to complete, not to mention the additions and other operations necessary to find and return an array element. This as compared to a linked list, which involves an assignment, an addition, possibly another addition, and one memory access. (In theory, in practice, references are probrably more like pointers to pointers, so add in another memory access and possibly another addition.) Anyways, the point is, now I'm wondering if linked lists might be a lot faster than the arrays I'm using, since accessing arbitrary elements is rarely necessary and almost all of their use is iterative. I'll do some tests and post the results up here later.

----

Hmm, well, my first results showed linked lists to be much faster. However, it turns out that that was because there was a bug in the code. So I fixed that, and linked lists still appeared to be faster. Then I noticed another bug, so I fixed that one too. Now that the whole test seemed to be running properly, both linked lists and arrays gave comparable results - however arrays were given the benefit of going second in the simulation and so may have benefitted from some caching. Linked lists took ever-so-slightly more time to create, (~2.3% longer) but took considerably less time to destroy than dynamic arrays. (~30% faster) The times for both included the time to actually spawn or destroy an actor, however, so the differences would be more pronounced if this factor was not included. Time spent iterating through the list was inconsistent and varied considerably from run to run. 400 - 650 ms to iterate 1000 elements for dynamic arrays, and 500 - 800 ms to iterate 1000 elements in the linked list. In most of the runs the dynamic arrays were faster.

These results seem a bit illogical but probrably result from the array lookup being primarily native code while the linked list operates primarily in Unrealscript - though I'm only speculating on the actual cause.

It would be nice if UnrealScript had a mechanism to iterate a given dynamic array, without having to do a multiply on the index for every element though.

----

Wheeeee! I finally figured out what was causing the turrets to aim imperfectly. Turns out I had a == None where I should have had a != None. Thus, the turret believed that it was not equipped with any functional weapons and so used the fallback (less accurate, but much faster) aiming calculations. The AI hits almost all of the time now. It still misses occasionally, but I'm not sure what this is caused by.

Now I need to code in a system whereby lower skilled AI pilots will deliberately miss sometimes. I'm not really sure how the best way to do that is though. I can't just add a random offset to their aim, as it takes time to turn and so the offsets would end up averaging out to cause very little loss in aiming ability. (Not to mention that there might be a noticeable &quot;wobble&quot; if a ship was deliberately throwing off it's aim randomly.) Instead I think that I need some method of having the AIs aim &quot;zero in&quot; on the target over a certain amount of time, effectively interpolating between it's current aim and the aim it should have. However, the amount of interpolation will have to go down the longer it's been aiming, otherwise with even a little interpolation it's aim will always lag behind a fast-moving target.

====October 26th, 2004====

Well, I made some asteroids. I'm still having some difficulty having them look right. My plan for how the asteroids and harvesting of them will work is, you damage the asteroids which causes them to break into smaller pieces, much like in the game, Asteroids. When they're small enough, a &quot;harvester&quot; part will suck in the pebbles like some kind of space vacuum-cleaner. This seems simple enough and doesn't appear to cause any performance issues. (I was concerned that having tons of little pebbles being simulated might mean a performance hit.) 

The issue that I'm having with that is that it looks funny when an asteroid suddnly turns into 5 or so much smaller asteroids. I had planned to cover this up by having a big &quot;burst&quot; of dust come out of the spot where it &quot;cracked open,&quot; thus making an opaque cloud of dust so you couldn't see one asteroid transform into five or so smaller ones. Unfortunately, I haven't had much success making a believable dust effect. The dust effect has to appear quickly enough to hide the asteroid breaking apart, and be big enough to cover it. So far, I haven't been able to make it look natural enough when it appears, but I'll figure something out originally. Alternatively, I might make a completely different system of mining asteroids, whereby you just &quot;suck them dry&quot; but the asteroid doesn't actually disappear - it just gets &quot;depleted.&quot; I'll have to think about that over the next little while.

In other news, I finally made that mining base AI I was planning to. So far it can float defiantly, mass-producing waves of fighters. The AIs production capabilities have made for larger battles than I'd had previously, and I'm noticing more and more that space is getting littered with garbage. I'm not sure how to go about fixing that yet.

The thing is, a ship can easily be disabled without being completely wiped out. For instance, a fighter who's midsection has been sufficiently damaged could bust in twain along it's midsection, leaving a drifting cockpit with chin guns, and an uncontrolled thruster/fins/some other junk. Both parts are effectively just useless debris, so presumably I could just make them explode and maybe leave behind a single static mesh which would have less processing overhead. (So the remains can still be salvaged for resources.)

However, that poses a problem: what if a ship is redered derelict, but a player is planning on sending out something to repair it or salvage it as is? (Not just salvaging the wreckage for resources, but repairing it and making it operational again.) This could make sense as it might save build time or something. I don't really know of any specific case where it would be useful, but I'm fairly confident that there are reasons why a player might want to repair their derelict ships, or capture fragments of an enemy ship.

Another problem arises if the computer's definition of a derlict ship may differ from that of the player. For instance, a drifting cockpit with only a chin gun atttached is not particularly valuable. However, it could still be used to keep an eye on something, and it's gun might be useful if something should unwittingly stray past it. On the other hand, there has to be some point at which a ship is deemed derelict, because the buildup of half-ships from any protracted conflict soon escalates to the point where performance takes a big hit. The question of &quot;what makes a ship&quot; is also of some consequence here: For instance, some kind of gun platform may appear to be quite derelict, as it is pretty much just a cockpit and a gun. (and likely some turret mechanism) Some stationary facilities with no guns might also end up being mistakenly shuffled into the category of &quot;derelict&quot; ships, even if they are in good condition. Unfortunately health isn't really an option as a ship could be severely crippled even by a relatively small amount of damage, (if applied in the right place) and effectively be debris despite being in relatively good health.

So now what I'm thinking is that I'll have a slow decay on ships that are fragments. When part of a ship breaks off, one part becomes a &quot;fragment&quot; while the other retains recognition as the ship in question. Anyways, the fragment will lose health over time and eventually be destroyed completely. The other part, that isn't a fragment, is going to stay as-is, as it will still be targetted by enemies so hopefully will get cleaned up eventually.

====Octover 28th, 2004====

For a long while I was dreading making the master &quot;player&quot; AIs to manage fleets of AI ships, as it seemed like it would be extremely complex and I didn't really know where to begin. However, once I got going things actually went pretty smoothly. Firstly I wrote a couple of hooks for the AI, notifications when one of it's hangar has completed a ship, etcetera. Then I wrote a simple routine that just made the AI build a certain type of ship non-stop. (It queues up a new one every time it gets the &quot;ship completed&quot; notification.)

Then I had it organize the ships into an array and when the array reached 5 in length it would give all the ships an order to attack and clear the array. That was pretty simple and reasonably useful in the limited test environment. Then, I altered the setup to instead store an array of &quot;wings,&quot; each of which contained an array of ships and some information about that wings objectives. The same array storing recently built ships was used, and when 5 ships were built they were added to the &quot;wings&quot; list as a new wing of fighters. Then, I just added a timesliced function to check (every 10 ticks) all of the fighter wings and see if any is idle (target was destroyed, etc.) and also to reorganize the wing if necessary. (if members were lost, etc.)  

That worked pretty good. In fact, I was quite impressed with how well it worked, as the fighter wings all got the same attack orders at the same time so they ended up fighting in little clusters. Previously I made an edit saying that I didn't see the tactical value in formations, but I could see when they fought in clusters they were a lot more effective when they &quot;ganged up on&quot; enemies.

So, I decided to revisit the formal formation code that I had written previously. It was old and decrepit, and out of date with changes that I had made elsewhere. However, it didn't take that long to get working, and it worked surprisingly well. The most time consuming part was probrably writing and debugging the portion of code that determines each fighters placement in the formation, which sounds easy, but it was difficult to debug due to a small oversight I had made. At first the formations were kind of &quot;loose&quot; as the formation leader would take off and have a &quot;head start&quot; on his formation members. I was able to relatively easily rectify this by having the formation members request the formation leader to slow down if they are having difficulty keeping up. Though I don't really feel quite right about that (as it means that a formation doesn't move quite as quickly as individual fighters during turns, etcetera) it seems to work pretty decently.

Soon I'll add some scheme for making different types of wings, and have it build resourcers and stuff. Unfortunately, my original control scheme probrably isn't going to work out, as the number of possible instructions has grown somewhat. However, I can probrably work around that by having more submenus on the &quot;smart menu&quot; and relegating some of the things currently on the &quot;smart menu&quot; to their own key on the keyboard for lesser used instructions, like ram, kamikaze, and scuttle.

'''T1:''' Have you tried pie menus? Like in the sims? Harder to code than normal menus, but easier to use, since all the options are equally easy to reach.

'''Foxpaw:''' Hmm, I haven't played the Sims, so I don't know if that would work or not. The menus that I'm using are keyboard based menus, like the UT2004 voice menu. The mouse is needed elsewhere during play. ;)

'''T1:''' Oh yah, I forgot about the mouse being needed... In that case pie menus just look graphically different but are used the same. Neverwinter Nights also uses pie menus. That's the only other example I can think of. Hmmmm... You could make the menus user configurable/rearrangeable.

----

Hrmm. I've run into a slight problem with having swarms of fighters. Well, two problems. Both are performance issues. Although the use of formations reduced the performance hit from loads of fighters somewhat, once you get into the range of about 60 AI controlled fighters in a massive dogfight the time spent doing AI and physics calculations on the fighters start to add up, plus the polygon load starts straining the video card with that many fighters (plus the space stations launching them) onscreen.  I can optimize some by cutting back the particle effects, but many of the models I'm using now are low-poly so when they are replaced with high-poly versions, that's going to introduce more strain, resulting in no net gain. (Though if I use rigidized skeletal meshes with LOD that might help some.)

I also don't know how much more I can optimize the fighter AI. It may be that massive fleet confrontations are not something that modern hardware can really handle. (Technically I suppose Homeworld and Homeworld 2 have big battles, but they also have a '''massively''' simplified flight model and they also don't have 20,000+ poly battlestations on screen.)

So, I'm going to have to do something about that. As it stands right now, fighters are of questionable effectiveness against larger targets due to their relatively small weapons and relatively light armor. Their only redeeming quality is an ability to be disgorged en masse towards a foe. I need to either find a way to have large numbers of fighters without a serious performance hit, or find a way to make fighters more powerful without breaking obvious logical rules.

In lots of games this is worked around by having fighters have amazing power for their size. Capital ships, despite being much larger and theoretically being capable of mounting entire arrays of fighter weaponry, are often armed with weapons only a couple of times more powerful than the fighter's weapons, though said weapons take up tens or even hundreds of times as much space. How does this make sense? 

I don't really want to implent a system whereby fighters have such a rediculous advantage, plus it would not be technically feasable as players get to design their own ships, so it wouldn't take long to figure out that they could make their ships a lot more powerful if they just use clusters of fighter weaponry instead of larger weapons. So, I can't give fighters an artificial boost statistically like that.

Unfortunately, the strategic role of fighters in a real-life situation is somewhat limited. Though they definately have uses, the sort of science fiction view of fighters is highly unrealistic so I'm not really sure how I can work it in. Previously the fighters had a useful edge even in small numbers because they were small and fast, and hence very difficult to hit. However, improvements to the AI aiming routines have removed that advantage from fighters as turrets armed with trace-fire weapons or explosive projectiles (think flak) can make short work of them.

Also, it's not really feasable for me to just ignore it, as that will likely lean towards a bigger-is-better philosophy where instead of fleets it will just be individual behemoths roaming about and having 1-on-1 slugfests.

The only feasable solution I can think of is to artificially inflate the price of turrets, which would make countering fighters with fast-tracking powerful turrets inadvisable. Err.. but then people will just built huge quantities of fighters. Unless I was to artificially cap the maximum &quot;crew&quot; a player could have, and have different classes of ship (the player's designs are classified automatically based on speed, firepower, etc. so the AI can fight more effectively) require different amounts of &quot;crew&quot; to function.

Hrmm. I kind of like that idea, actually. Fleets could still grow in strength because the stats (and hence cost) of the ships could still be built up, but the QUANTITY of ships (and hence, the processor and video card load) would not go up.

The downside is then to have large &quot;empires&quot; (AI Controlled) you would need to have a bunch of AIs that would just be allied, which is questionably realistic as then you would have to orchestrate &quot;diplomacy&quot; between the AIs...

It's an idea though. Maybe having a &quot;crew cap&quot; would be good for the gameplay. Though 60 fighters is kind of a low cap. Hrrmmm.

'''Mosquito:''' let me just dig up some old crap: [[Legacy:Mosquito/Notebook|Mosquito/notebook]]

Some old idea from like 2 years ago, but why not instead of having millions of complex fighters, wouldn't it be much more... epic if it was 60 massive complex battleships? Fighters could be very simple construction and in large numbers, while afew dozen juggernaughts slug it out, I was still poundering doing something with my idea, but I'm really not doing anything with it. I just can't get much inspiration in level design for just big ships floating around in a void.

'''T1:''' You could make fighters require an &quot;owner&quot; ship and have a limited number of fighters per ship (more fighters for bigger ships).

'''Foxpaw:''' I don't see how that would help the situation - the problem isn't that fighters are too good and need to be limited for balance sake, it's that the system can't handle enough fighters to be practical. Hence, if people can't build enough fighters to stand a decent chance against larger ships, they likely won't build them at all. (which is what I want to avoid.)

'''DJPaul:''' What about creating a mesh that is a bunch of fighters?  You'd have one mesh for a group of ten fighters (flying in formation).  When something required responses from indidivudal ships, you could destroy the group ship mesh and spawn ten individual fighters.  I imagine this might also make the part of your AI code that controls ships flying in formation easier.

'''Foxpaw:''' Err, hmm. I did sort of consider that idea at distance, but even if I did do that it would still be pure fancy without having access to C++ code. Since the fighters are designed during play by the players, there would be no way for me to make a mesh containing multiple fighters, when there's no way of knowing what those fighters will even look like until the player designs them.

'''Ryan:''' I don't know how this would affect your gameplay, or even if it is possible in the Unreal engine (newbie Unreal scripter).  Could you use some sort of proxy mesh for an individual fighter which maybe suggests that it is partially cloaked, which then changes to the high poly mesh when it attacks.  You would get the feel of large numbers of fighters with quite a lot of action with them uncloaking and cloaking.  The tactical aspects might be more complex if aiming at cloaked vehicles was more difficult, a chance for the turret ai to show it's mettle.

'''DJPaul:''' Hmm.  How &quot;dumb&quot; are non-leader fighters when they are in a formation?

'''Foxpaw:''' I suppose I could use a different mesh to represent the fighters when they aren't in combat, but I'd rather not do that. I think that that might adversely affect the visuals, and maybe make the combat kind of confusing to watch.

As for how dumb the non-leading fighter are in formation, they aren't really &quot;dumb&quot; per se, more so &quot;oblivious.&quot; They do pretty much all of the same things as the leading fighter does, with the notable exception of scanning for targets. Though presumably the formation members wouldn't have to compute flight paths and stuff, they still do in order to stay in formation.

====November 2nd, 2004====

Well, I found one place that I can save a lot of polygons. I have nifty space dust floating around, which I was considering to have a negligible impact on performance. However, I noticed that the performance imapct was not so negligible. For some reason, the space dust was not getting cleaned up properly so when I called up my &quot;thing tally&quot; (which is just a debugging tool that generates a list of all classes of object in existance and how many of them there are) I found that for some reason I had 4 times the amount of dust particles as usual. This was of course a bug, which was quickly fixed.

However, it got me thinking - surely even 3000 of the dust particles couldn't have dragged down my X800 that much, could it? So I looked into it. Admittedly I'd never done the math. Surely 750 dust particles at 48 triangles each couldn't be that many polygons, could it? I busted out the calculator and my worst fears were confirmed. 36,000 polygons. That's one heavyweight particle effect. Granted, not all of those were on-screen at a time, but still, it was a lot of polygons to render and light just for the space dust effect. Now, I do want to keep the space dust effect - it's very handy to provide some reference frame for which direction you're drifting in and how fast you are drifting. Plus it's got the &quot;ooh ahh&quot; factor when you whiz close by a chunk of dirt and see it's all lit properly and even has smoothing groups on it.

Unfortunately, the polygon load is too high. So, I'm going to toy with the 4 parameters for the space dust and see what I can do with less particles. I suspect that I can achieve a similar effect with a lot less particles, as I have a hunch that most of the particles are too far away to be noticed. I can reduce the number of particles while reducing the size of the effect to keep the particle density the same. I'll play with that and see what I come up with.

I'm also considering making an &quot;abridged&quot; version of the older stuff in my developer's journal, and maybe making it into some tutorials or something. It's really big, and the wiki doesn't seem to like extremely large pages, so I've had to trim some stuff off of it. (This is probrably a timeout issue with uploading all of the text.) That stuff is still on my hard drive, but I'd like to keep it up here, though admittedly most of it is pretty ancient Gen 3 stuff.

====November 2nd, 2004====

Ahoy! It's time for me once again to squel with delight having spotted another area for improvement. I've massively improved the fine manuevering ability of the AI fighters. Gather round, ye all, to hear another long-winded tail of my train of thought and how it led me to this improved system.

Today as I was bored in class, I started scratching out a flow chart of a much more advanced docking system from what I had currently implemented. Previously fighters that wanted to dock would simply fly to within a certain proximity of the hangar they wanted to dock with, and wait. The problem with this method is they were often in the path of fighters launching, approaching the hangar at an awkward angle and running into something, or other such mayhem. The second one, I realized in class, was super easy to fix, all I had to do was have them approach at a certain fixed angle, relative to the hangar. (the direction of it's opening, of course) I'm not really sure why I didn't think of that before.

Anyways, that of course posed a new problem. If all incoming fighters were trying to come in at the same angle, obviously they would crash into each other. Easily solved, I thought, by simply having them wait in a queue like holding pattern. Of course, to prevent colliding with the fighters that might launch from the hangar, I'm then going to have to have the holding pattern be out of the way somewhat, in a direction that launching fighters are not likely to travel in. (Collision prediction is disabled presently for performance reasons, but it's suspended during launch and docking anyway to prevent craft from panicking as they close in on the hangar.)

So I have to have a queue of fighters, all maintaining a safe distance from each other and from the hangar, proceeding in an orderly fashion toward the hangar, and they can't be aligned with the hangar because that would block the launch of other fighters, so I now need some kind of controller to make sure that a fighter positions itself at the correct approach angle before launch... phew, better draw a diagram. Hence, I drew the first flow chart that I've made of my own free will. Normally I despise the things, as I'd rather hammer it out in code. However, I was stuck in class, and the professor was droning on about the influence of parenting styles on adolescent development or something, so I drew out the flow chart. The first one was sub-par, so I started with a fresh sheet and ended up using the whole sheet of paper for this flow chart, but alas, the whole process was planned out.

So, I go home, implement everything on the chart, and low and behold the fighters are positioning themselves all over the place, screaming into the hangar at full speed when it's already occupied, and other assorted mayhem. I briefly consider why I trusted a flow chart in the first place, but then set about getting the code working. A few oversights and typing mistakes later, the fighters are now lining up really sloppy, and ramming each other as they tried to settle into position. A short while later, I had it good enough that they no longer rammed each other (often) but had difficulty aligning themselves to the hangar and going in straight. Simply enough, their momentum was too great as they lined themselves up, and they didn't end up going straight into the hangar.

So I thought about this. The manuevering code had something in it to control drift (undesirable momentum) but it was commented out because I had inadvertantly coded it so that it also misinterpreted slight strafing movements as drifting. After enabling it, the fighters were flying all crazy, so while examining the function and trying to figure out why, I started to puzzle. Why did I have the cancellation of undesirable momentum and the application of desirable momentum handled separately? Surely I could just figure out what momentum I wanted based on the functionality I already had for computing acceleration/deeleration and figuring out, based on distance and acceleration/deceleration rate, the ideal speed to travel at.

It dawned on me quickly that I could make a simpler function that worked better if instead of finding an optimum ''speed'', I simply find an optimum ''momentum'', then I could compare it to my current momentum (desirable and drift) to find the change in momentum that would be required, and apply thrust based on this. I implemented that system and was very impressed. The AI pilots can now make tight manuevers much less recklessly and they are also a lot better at predicting their coasting and such when they decelerate to a halt. I haven't tried building any formations of fighters since implementing the new system, but I suspect that the fighters will fly in a much &quot;tighter&quot; formation with the new manuevering code.

So ends another trilling tale of intrigue from the dark corridors of my mind. Hrmm, actually that ended up being a lot longer than I thought. Maybe I should be a novelist. ;)

====November 9th, 2004====

It appears that I've finally wrapped up the second &quot;rotation in editor&quot; issue. The solution was deceptively simple. I was trying lots of stuff with matrices and trig to try and figure out the rotation, but that wasn't working very well. Eventually I realized that instead of trying to artificially adjust the rotation of the components attached via sockets, I could just rotate the socket itself. Since the sockets don't normally use their roll for anything, and altering the roll would cause exactly the effect I wanted, I did that. I'm not sure why I didn't think of that before, but it's probrably because back in third gen I was using vectors for that which couldn't be rolled, obviously, so I probrably had the mindset that changing the socket was not an option.

====November 10th, 2004====

I'm so excited. Not only do I have a five day weekend starting today, but I spent most of the time I was in class today scheming and plotting. It seems I've found a way to build a 2-to-1 multiplexer that's twice as fast, a 4-to-1 multiplexer thats thrice as fast, an adder that's twice as fast, and a logic unit that's almost 5 times as fast. (one fifth the transistor depth, plus one transistor) It seems that the overly modular design of modern computers has resulted in much waste. Also I noticed how you can take two of the 2 to 1 multiplexers in the function unit and turn them into a dedicated combinational circuit that would be faster and use less transistors. 

Unfortunately I have a relatively small selection of transistors at my house, and I don't want to pay the exorbitant prices at Radio Shack, so I'll have to contact my neighbor who teaches electronics at a high school and see if he has some I can borrow to see if the circuits I've designed actually work. If that doesn't pan out I'll see if the Verilog HDL has any syntax for specifying individual transistors and maybe I can do something with that. That's a last resort though, as the software I use for Verilog simulations (ModelSim) seems kind of shifty.

====November 14th, 2004====

Blech. Bugs seem to be coming out of the woodworks for no apparent reason. Code that was previously stable is now spitting out loads of accessed nones and other chicanery. One annoying bug turned out to be caused by things getting destroyed due to collisions mid-physics-simulation. Interestingly Karma suffers from the exact same bug. Some other accessed nones still remain, which I'm trying to figure out now.

In other news, I made a different fleet AI which was quite fancy. Unfortunately, it's much more processing intensive than the one I had before, and mysteriously causes GPFs. At first I put this down to using some things derived from Object to save memory, but when converted to Actor subclasses there were still GPFs. GPFs of course are the most annoying bug one could possibly have, as log statements leading up to the GPF don't get printed (they are still in the log buffer, which doesn't get flushed in the event of a GPF) and your options for debugging are fairly limited.

----

Well, that's that. I figured out why all the accessed nones were appearing now. At first it was quite strange as a new AI was causing accessed nones in the physics system, which seemed completely unrelated. Turns out that the flaws were in the physics system all along, but the new AI was smarter than the old one, and realized that blowing up ships while they are docked is easier than trying to blow up ones that shoot back. While docked, the ships are in an anomalous state where they are actually part of two ships simultaneously. (Themselves and the ship they are docked with.) When parts of them were dismembered, they were being removed from one ship, but not both.

So then, with that figured out I got back to work on the new AI. It's turning out to be a lot more complicated than I thought it would be - but seems like it should have good potential. The first system that I used built ships on a ratio basis, and periodically scanned it's squadrons to find idle ones, then found jobs for them to do. This ended up being relatively simple to implement and created a good illusion of the AI actually attempting to accomplish something.

The new system that I'm trying to implement is more or less the opposite: an objective manager determines things that it wants done, and the importance of each objective. This will probrably eventually become heirarchial, with subobjectives being determined to complete higher level objectives. Anyways, the squadron manager then has to rate the effectiveness of all of it's squadrons, and determine appropriate assignments, so the most important objectives will have the most &quot;effectiveness&quot; worth of ships dedicated to that task. Then, the construction manager looks at the assignments made by the squadron manager, and &quot;fills in the gaps&quot; by building ships appropriate to the objectives. For instance, if there was a lot of things that needed harvesting, and not many ships available for harvesting, harvesting squadrons would have priority for being built first.

The reason why this is complicated may be obvious at this point - you have an objectives manager, squadron manager, and construction manager working in concert, and objectives and squadrons have to be frequently reevaluated for changing importance or effectiveness. AI is also notoriously difficult to debug. However, I'm confident that the end result will be worth it.

====November 16th, 2004====

Hrmm. I haven't done anything with the mod in the last couple of days. I got laid off about 4 months ago. This coincided with my return to school, which was convenient. My original plan was to collect employment insurance while I was going to school, which I understood was a legitimate use of a program that I've paid out the hiney for since I started working at the tender age of 14. Apparently, however, employment insurance is all about ensuring employment for the workers at employment insurance office. (I'm aware that insure and ensure are completely different, but I like the way it sounds anyway.) Apparently, they accomplish this by explicitly advising people who have been advised of an impending layoff to wait until they have finished working, then 4 weeks after they've made an application and are under the guise that they are eligible for benefits they get a phone call notifying them that they are ineligible because they did not submit form X prior to the layoff. As a final insult, they send you a letter notifying you that any monies recieved at your termination, such as vacation pay for the portion of the year that you've worked, is not only not eligible for benefits, but actually gets directly deducted from the benefits that you aren't recieving.

So anyways, plan B was to live off of savings. As I'm frugal, I figured I should have no difficulty living for roughly a year on three thousand dollars. This budgets for car payments and car insurance, while leaving some left over for surprise expenses. Unfortunately, my grand plan did not compensate for the fact that so many games that I wanted would be released, nor had I considered that Christmas was going to happen.

So now I have to find work. At this point, you might be asking yourself, what, is this a blog now? What does this have to do with journaling development? Well, I have to do school work. On top of that, I have to find actual work. Unfortunately, this is not exactly prime time for finding work - apparently my options are babysitting, taking care of senior citizens, delivering pizza, shampooing carpets, telemarketing, or joining the army. Err.. yeah. You may have heard the term &quot;overqualified.&quot; When I was younger, I didn't see how being &quot;overqualified&quot; could possibly be a bad thing, but it makes work a lot less fun. You show up, and work for a couple of hours before the manager is dropping a log because you're already better at your job than the rest of his staff, so you get promoted a few times your first day and all of a sudden everyone resents you because you came out of nowhere are usurped the promotion they were hoping for your first day. However, because you haven't yet had a chance to become acclimatized to the immense amounts of BS present in any corporation, from your elevated perch you can clearly see that the company you're working for totally blows and working there sucks.

Now, you might be thinking: Foxpaw, you didn't even answer the question. What does this have to do with you mod? Okay, I'll cut to the chase. Most of those jobs I'm ludicrously overqualified for. So I narrowed it down to: pizza delivery, because then I'll at least get to drive my fancy car and listen to my own music, plus I won't have to deal with as much corporate BS, and I'll get tips; or, the army, because then I'll get to play with guns and make explosions. Tomorrow I have an interview at Pizza Express, which is a less popular pizza place (my conjecture being that the more obscure the pizza joint, the less likely they are to have those things that go on your window or roof, as I don't want to risk damaging my $50,000 car so Dominos can advertise. I also have an interview with a recruiter for the 26th field regiment tomorrow. Although artillery is probrably the most boring of all the combat roles, it requires the least training and it also has the shortest commute.

So, now you might be saying: Foxpaw, you just dodged the question '''again.''' Okay, okay. I would prefer the army to pizza delivery. The army is not known for short shifts or lots of free time. I also have school work to do. Plus my family has sold their house so I have to move. I also have a purebred cat that I have to find a home for, and I just realized that end of term is like two weeks away and I haven't started a term paper in adolescent psychology which I'm doing crappy in so I can't afford to bomb on the paper. This paper is based on a book that I had to pick from a reading list that was supplied. Unfortunately, now that I've read the book I've come to the realization that it doesn't have any major adolescent characters so I'm going to have to fudge the whole essay, while making it sound good enough to get a decent mark so I won't get a lousy mark in the course.

So, I've got a lot of stuff to do for school, and I have to fit moving and finding a home for my cat in there. All of this stuff has deadlines, and I have to do that stuff while still going to class and likely spending at least 5 hours a day making craters. Plus I still have to fit in going to the gym. Weekends are also going to be busy as I'm trying to con, err.. I mean, con'''vince''' my friends sister into going out with me. Hence, I have to spend all of my time on my growing &quot;to-do&quot; list, and I can't afford to spend any time on modding. So, there might not be many updates for a while. I'll probrably still pop into the wiki on a fairly regular basis, but I don't have any time to spend writing and debugging any code of my own.

The soonest I can foresee things cooling down is, like.. a month from now, when exams are over. Except.. errr.. well, crap. I just remembered that when exams end, we're moving, I have no idea where I'm going to be living for about a month, then we move into our new house, but for reasons I won't elaborate on too much I won't have Internet access until, like, the spring at least. I might be able to sneak in an update from the University, but there likely won't be any screenshots or any sort of media for a while.

I should have internet again in the spring. Hopefully the mod will be something that I can call &quot;done&quot; at that point. I've so far seemed to be suffering from some kind of compulsion: I have a vision of what the mod will be when it's &quot;done.&quot; However, once I reach that point, my vision has grown to something larger. At first it was relatively simple, to have existing gametypes playable on spacey maps with customizable space craft. Once I had that, I wanted organized, custom gametypes where other ships would be objectives and stuff (like the &quot;Carrier Assault&quot; gametype I had planned.) Once I had that, I wanted it to be like an action/rpg/strategy kind of deal. It's like I'm never satisfied. o_O

Anyways, we'll see. I just thought I should post so as to avoid postulation that the whole thing is &quot;vaporware&quot; or other such chicanery.

'''Mosquito:''' I'm nearly to grief stricken to comment! You're one of more innovative and intelligent minds in the whole of the unreal modding community! Real life sucks, but I guess you gotta set your priorities. I wouldn't recommend military though, unless you live in canada, because most other industralized nations are pretty engaged in conflict. Unlike canada, who would really like to do stuff, but just can't afford to send or return troops and equipment.

'''Foxpaw:''' I do live in Canada, but regardless, since I would be working only part time that would more or less disqualify me from service overseas. ;)

'''Mosquito:''' Join the reserves, I know afew people in it and its not too bad. Its good money. Where abouts canada anyway, I don't know why, but I though you were english.

'''Foxpaw:''' I live in Manitoba. I went to see a recruiter yesterday, who gave me a stack of paperwork as thick as the Bible and told me that once I had filled it out I can expect a call within 1-6 months. Silly me, I had assumed that since they had a sign in front of the armoury looking for part time workers that meant that they were looking to hire people sometime this century. :rolleyes:

'''T1:''' That sucks... to say the least. Good luck in getting a job you like. Hmmm... Have you thought of letting some other people to try to continue the development of the mod? But then again, I understand your dislike of working with other people.

'''MythOpus:''' Good luck with everything man!  And I live in Canada Too. YAY CANADA!

'''Graphik:''' I know what you mean about never being satisfied with a mod. Just decide on a milestone, reach it and release. ''Then'' consider going further.

I have no advice for Real Life... it's so difficult to mod. :(

'''Mr.Mitchell:''' Sorry to hear about the problems you are facing. I never dropped a note in the journal, but I loved reading it. I wish you good luck with reallife. 

====December 31st, 2004====

It turns out that fate has smiled on me, somewhat. The plans with regards to moving have changed somewhat so now I'm housesitting for the next three months, which means I have internet access. I'll also have internet access at the new house when it's built, as my parents have changed their mind about the wireless connection they were planning to get, which could not be set up until spring.

So I have internet until further notice. I don't know how much work I'll be doing on the mod though as the bedroom that I have the computer set up in is quite small and the computer is set up on the floor next to the bed which is not the most comfortable position.

I think that any modding I do in the next short while will probrably be rewriting some internal stuff. Circumstances resulting in the corruption of the test level have only recently been rectified. During the time when it was out of commission I wasn't able to work on the mod, but I did take some of the base classes and use them to make a mini-mod of a different type, the purpose being to test how abstract my abstract base classes were. This has improved my base classes somewhat, which will require minor tweaks to incorporate back into the main mod.

====January 14th, 2005====

Well, I haven't worked on the mod much at all. I'm considering rewriting some stuff but I don't want to do a complete rewrite again, so I'm a bit stuck at where to begin. I've decided that I want to separate the in-game physical representation of ship parts from their workings. This will require a lot of modifications.

The intent of this is so that I can have ships with no physical representation in the world, such as those harbored inside another ship. Right now the only kind of docking I can really do is to have a ship occupy a hangar, which is more realistic, but also somewhat problematic and much more resource intensive.

I'm also considering using objects instead of actors for a bunch of stuff but I don't know if that's a good idea or not. Objects seem to be kind of crashy even if you are careful not to leave any dangling references. However, the WeaponFire classes for UT2004 are objects, and they seem to work, so maybe I'll give it a try. I suspect that I may regret this decision, however.

On the plus side I realized that if I were to insert a few hacks I could probrably make a simple gametype using the stuff that's already implemented... so maybe I'll do that. I haven't decided yet. I've been pretty busy lately but I might have a few hours after work today, so maybe I'll see if I can hack together a gametype and maybe polish some things.

Also I had a couple of neat ideas for the HUD, particularly the radar, which I'll write more about when I have the ideas more finalized.

====January 24th, 2005====

I haven't made much progress. I've been pretty frustrated and unfortunately it looks like I might do another rewrite from scratch because I'm speculating that that might be simpler than retrofitting the existing code. Unfortunately, simply getting sufficient code updated so it will compile has been an exercise taking up several days. Seeing as it only took about 3 days to do a complete rewrite before, I might do that again.

I don't really want to though, as it means lots of work for little apparent gain. However, the changes must be made, so I think I may have to &quot;bite the bullet&quot; so to speak.

'''NickR:''' Any chance we might see some of your previous versions? Maybe the source code to those previous versions aswell? It would be cool to see exactly what you are trying to do. :D 

'''MythOpus''' His previous versions (screenshots at least) are here &gt; [[Legacy:Foxpaw/Cosmic_Fury|Foxpaw/Cosmic_Fury]]  As for his source, that's up to him.

'''Foxpaw:''' Err.. sorry, I don't have the source code to my previous versions, as per below:

====March 3rd, 2005====

It's been a while since I've updated here. I unfortunately haven't done much coding. I've been highly unmotivated to work on a new iteration of the code and I've been unable to decide between redoing it or finishing the stuff I had. Tonight I decided that maybe I'd finish what I had, but that was followed by the stark realization that that version was archived on my parent's PC. I recently formatted that PC for my parents. Although I backed up their stuff, I had forgotten that I had my own backups on there.

So, I'm stuck forging ahead with some redoing. Unfortunately, there's another fly in that ointment. Not sure if I updated this or not, but I now have two jobs. I'm working as a research assistant on a project involving spiritual interactions through machines.. or something. I haven't really payed too much attention to the theory behind it, as I'm taking the whole thing with a grain of salt. Regardless, someone got a research grant to do this, and it'll look good on my resume. My title of &quot;Research Assistant&quot; also seems to impress the ladies.

Anyways, I'm also working part time at McDonalds, which is sweet because I get food at half price, but more importantly there's tons of foxy ladies there. In light of the abundance of ladies this mod has had some difficulty competing for my attention, particularly as I've already figured out all the &quot;fun&quot; stuff. Presently the part I have to re-implement is the saving/loading code, which is rather dry programming, which hasn't helped either. I'm confident that I'll update eventually.

'''CIpen:''' Perhaps I missed it?  Perhaps I didn't look or read enough?  Was there ever any sort of release of your (Foxpaw/Cosmic_Fury) mod?  Pictures at the Cosmic_Fury link is all that I discovered.  I keep  thinking I'm missing something that everyone else has :(

'''MythOpus:''' Sadly... there was no release.  Nor was there even a beta (not to my knowledge anyway).  He kept redoing the code when he got it to work hehehe.  I say, we kidnap him and tie him up with a computer infront of him and force him to finish the mod.  Then WE can steal it and say we programmed it.  He won't be able to do anything about it because we would either have him still tied up.. or we would find some blackmail thing agaist him :D muhaha.  HAH.

'''CIpen''' Hehe, MythOpus :)  But why take so long?  Why keep redoing it?  I mean, there is a reason something might be messy.  Either you just don't have time or it is just to many lines of code.  If you write something from scratch normally you have it well organized.  That stick shift car class I did is rather a good example of what BAD coding looks like, on the other hand you prolly wouldn't think it was me that coded the sun/moon package I did (uses an emitter for the sun and moon and lets you set the hours/colors of them at different times you specify).  Well, my two cents is this: what's the use of a well oiled machine if it just sits around?

'''Foxpaw:''' I haven't had too much time to work on it lately, as I've been pretty occupied with other stuff. The intent of redoing stuff was to make it perform better and to expand the possibilities of what I could do. The first iteration was using UT, and the code kind of got messed up somehow. The second one was a very evolutionary sort of design that wasn't really planned out from the start and hence, wasn't very flexible. The next one was planned out, and worked, but had poor performance and some annoying issues with Karma that I couldn't work around very elegantly. Because of the poor performance, it was limited to about a dozen ships at a time, which was far too few for what I wanted to do. There was also things that didn't seem like they were going to work at all, such as having ships existing &quot;outside&quot; the map in other sectors and such. The next one had support for stuff in other sectors, and had persistent state loading/saving, and performed well enough to have scores of fighters flying about without a heavy performance hit. However, some things were starting to get a little hackier than I liked, and I saw room for some substantial improvements in performance (both computer wise and AI wise) that could only be realized with some changes to the code design. The rewrite shouldn't take a lot of &quot;man-hours&quot; to do, but time to work on it has been scarce as I've been occupied with other stuff.

I'm hoping this iteration will be the last as each successive iteration went much further than it's predecessor. The version before the current one had basically everything except for network code and a facility to have a &quot;hangar&quot; on a ship. (Ships could dock, but only external &quot;docking&quot; like a modern aircraft carrier was possible.) The new code has functional hangar code so that is at least settled. The rest is mostly just porting code over from the last iteration.

====June 11th, 2005====

I've been spending more time on this, so I've elected to finally make an update. Previous iterations of the code had some amount of &quot;drag&quot; on the ships so they effectively had a maximum speed. I've decided to get rid of that for more realism, to speed up physics calculations, and to improve the accuracy with which the AI can plan out manuevers.

This posed a problem of it's own. Without a max speed, I ended up going way faster than I had intended, and easily attained uncontrollable speeds. This was less than ideal and the great amount of momentum I accumulated made it very difficult to make quick manuevers to dodge fire, etcetera. I tried fixing this by reducing the power of the ship's engines, but that didn't quite work out. The ships went slower, but were not very responsive.

To solve this problem, I've implemented a &quot;combat speed&quot; setting. Basically, you have two controls for your speed, a boolean throttle control and the &quot;combat speed&quot; control. The &quot;combat speed&quot; can be adjusted to whatever speed you like, and represents the speed that you want the ship to travel. The ship applies full thrust when you have the boolean thrust control active and your speed is less than the combat speed you have chosen.

This allows you to keep the throttle control pinned all the time during battle without accelerating beyond your chosen speed. This has proven very helpful as it removes the need to attain speed, then &quot;coast&quot; at that speed until you need to change direction, at which point you must engage the thrusters again, etcetera. A ship that accelerates more quickly, of course, can have a higher combat speed while maintaining the same agility as a craft with slower acceleration, or keep the same combat speed and enjoy more responsive changes in direction. With the combat speed set to about what you can accelerate to in 2-3 seconds, you have good speed with good manueverability, or if the combat speed is at the speed you can attain after about a second of acceleration you can adjust direction quickly enough to evade incoming fire.

The other major thing is a new implementation idea for fighters. Previously, I was planning to have fighters be the same as any other ship, but they would be carried in carriers and spill out on demand to wreak havoc. While experimenting with carrier code, I had carriers that auto-generated fighters within their hangars. I had intended this only for testing, but it turned out to be really cool to watch. When I went to carriers that only carried existing ships, the battles were much less exciting as one fighter group would eliminate the other after a short time, and then the fighter-less carrier would be ganged up on by the fighters until it was destroyed. This turned out to be much less fun to watch than a carrier constantly pumping out fighters and being taken out through attrition against another carrier.

So, my plan is to have fighter carrying carriers as before, but to also have &quot;drone carriers&quot; that construct and launch flimsy drone fighters during battle. This is similar to using regular fighters in terms of combat effectiveness, but is far more entertaining. Drones have the advantage of requiring less micromanagement and requiring no resources, other than energy, to construct. Full size fighters retain the advantage of being many times as durable, having more powerful weaponry, and being able to use equipment such as warp drives and cloaking devices.

'''MythOpus:''' Foxpaw, you always seem to amaze me.  I do need a bit of clarification on something though.  Is this an RTS, a first person space ship shooter, or a combination of both?  Who commands the heavy ships in the fleet (i.e. the carriers etc...)?  I can't wait to see what this looks like.  I want to warp into an area full of big ship, with a few backup fighters on my 6ix, and activate our cloaking devices and lay mines across the hulls of all the big ships and blow them all to hell :D

'''Foxpaw:''' It's kind of a mix.. Have you ever played the game Battlezone, or the distantly-related sequel, Battlezone II? Battlezone was an RTS played from first person - kind of like Tribes but you can build buildings and harvest resources and stuff too. Of course, you can also go into combat in any of your vehicles too.

This mod is kind of like that. It's sort of like Battlezone, but in space. So, you can fly any of your ships in first person view with a joystick or mouse or whatever peripheral you prefer. Any ships that you aren't directly controlled by a human are AI controlled and can be given various wingman-like orders: attack my target, escort my target, etcetera.

Multiplayer I expect to be a fairly free-form space sim with economic and combat elements. Single-player will probrably be a little more focused toward combat, but I haven't worked out the details of what sort of story that will have.

====June 12th, 2005====

Today I had to use Calculus to figure out a formula. Interestingly, I had to use Calculus II, which I've only just completed. Perhaps if I had not procrastinated so much I might have ended up frustrated at this problem. The issue at hand was having the AI decide what ships are best against what other ships. The formula for this was straightforward: it takes the attacker's tracking ability and divides it by the targets agility, then takes that and divides it by the estimated time it would take for the attacker to destroy the defender assuming the use of all weapon systems. Travel time to the defender is also added to the &quot;time to kill,&quot; and the &quot;time to kill&quot; is limited to a tenth of a second to prevent needless overkill.

That part was pretty straightforward, but what wasn't so simple was determining the tracking speed. Tracking speed for turrets was simple enough - they have a max rotation speed already. Factoring the ship's own ability to turn was much trickier. Ships don't really have a fixed rotation rate but rather a certain rotational acceleration. So, I had to compute an average turn rate given the rotational acceleration. The average turn rate depends on the acceleration and the amount of time spent accelerating, and the amount of time spent accelerating depends on the distance being rotated and... the average turn rate.

Fortunately I remembered that a derivative essentially represents a rate of change - so the turn rate is essentially the rate of change of the ship's rotation, and the acceleration is the derivative of the turn rate. So all this involved was a couple of quick integrations, then a pile of algebra, and I eventually ended up with the average turn rate, assuming a 32768 URU turn, being:
 (32768 / sqrt((2*32768)/RotationalAcceleration))/2

In-game testing suggests that this is accurate, as 32768 divided by the number given by that formula seems to be the number of seconds spent on a 180 degree turn.

'''MythOpus:''' That was so over my head it's not even funny = |  That's okay though.  I wish coding could be a lot simpler where math came into the picture.  I wish you could just explain what you need done, like you did before... this and this ned to be taken to the twelth power but only if it is above this number and if it's this number than make it destroy that other ship.  Ugh.  Even that made my head hurt :(

====June 13th, 2005====

Well, I've been fairly active on this, so with any luck mod production will be back in full swing again. I've hit a minor setback today that I'm not sure what to do about.

Using objects instead of actors and various clever optimizations, I've been able to increase the number of ships that can be flying around doing stuff simultaneously. Increased significantly, in fact, so literally hundreds of ships can be in play at a time. I haven't stress tested to see how high it can go before the framerate starts to drop.

However, I've hit a minor snag: the physics, etcetera seems to be able to handle tons of ships everywhere without a hitch, but the &quot;fleet command&quot; AI hasn't been so friendly. The fleet command AI operates using a list of objectives, and a list of squads. Each target that needs to be waxed has a &quot;destroy&quot; objective associated with it, each harvestable resource a &quot;harvest&quot; objective, etcetera. Periodically, the AI generates a table of the effectiveness of each squad with regards to each objective. It then uses this table to pick the best squads for the given job, and how many forces are needed to win a given battle, etcetera. All in all it gives quite intelligent behaviour. Different fleet behaviours can be elicited by modifying the relative importance of different objectives, which is factored into the effectiveness table.

The problem with that is that it grows exponentially. So, for instance, 10 friendly squads versus 10 hostiles creates a table with 100 cells. 30 friendlies versus 30 hostiles, however, creates 900 cells. The number of entries in the table quickly escalates as the number of ships and the number of targets goes up. As a temporary fix, I have limited the frequency of squad redistribution to a function of the number of squads and objectives. So, basically, as the table grows, the time between updates grows at the same rate, causing the processing time used by the AI to be fixed regardless of fleet size or target numbers.

However, I can see how that might become a problem, if the frequency of updates gets too long, the fleet will have sluggish responses which will prevent fighters and drones from fighting effectively. It would also make AIs somewhat susceptible to swarming by drones, as a large number of targets could make the frequency of updates too slow for efficient targetting.

Since the vast majority of squads that the AI controls are drones, I have considered having drones and turrets use a separate, more crude targetting method. that will remove a lot of the squads from an AI player, but unfortunately does nothing to reduce the number of targets. It also has the disadvantage of having drones fight less intelligently, which is definately less than ideal.

I could also reduce the problem by reducing the number of drones and increasing their power. I'll toy with the drone maximums and see what kind of results I can get. I'm a bit concerned that having too few drones will remove the fireworks show that occurs between battling carriers. I'll try it out and see how it goes, however.

====June 14th, 2005====

I've reached a sort of temporary solution by implementing a &quot;performance throttle.&quot; This is an idea I had used before for graphical elements to scale back particle effects when the framerate starts to dip. Basically, the higher the framerate, the more frequently the AI updates. If the load on the scripts gets too high, the AI will update less frequently to compensate, which is handy.

The only slight snag with that is that the AI, if it has enough ships and objectives, can still cause a noticeable &quot;jerk&quot; on the frame that it does update on. I'll have to see what optimizations I can make to speed this up.

====June 15th, 2005====

Today I was playing around with MeshSpawning on Emitters. I had the clever idea of using MeshSpawning on arbitrary meshes, then extracting the locations of the spawned particles, to in effect extract vertex information from the model. I got some good results with this, but not as good as I had hoped. I had envisioned collecting vertex information, and sorting by distance from the point of impact of some weapon, to have a shield effect whereby the shield &quot;haze&quot; would spread across the hull of the ship from the point of impact outward. 

Unfortunately, I needed to collect and sort about a thousand vertices to make the effect move smoothly over the hulls, and the amount of processing involved in collecting those vertices and sorting them caused a &quot;hiccup&quot; every time it was performed. I may still make use of this for effects requiring less smoothness, like perhaps lighting arcing over the hull away from the point of impact of some EMP weapon or something like that. That would require a lot less vertices to make a nice effect.

'''MythOpus:''' I think a shield effect that would require less amount of processing power is the shield system found in good old Homeworld: Catyclysm.  The sentinels shields are simple, and not very flashy, but if you were able to modify it but keep the basic principle, you might not have to go through all this vertices sorting and what not.  You could flash up the shield effect and make it appear only after the ship was hit or something.

'''Foxpaw:''' It's been a while since I've played that. I don't remember what that effect looks like, so.. I don't really have much to say about that, but I thought I'd respond so you didn't think I was ignoring your comment.

====June 16th, 2005====

Well, I optimized the vertex collection and sorting a whole bunch, to the point where it might be feasable for some use, so long as it's not used heavily. Once I had a shield effect working like I had envisioned it, I decided that I didn't want it. It was rather slick and high-tech looking, which made it look quite out of place amidst the backdrop of fire, smoke and dust provided by exploding drones, missiles, and cannon fire.

I also made some optimization to the fleet AI.. unfortunately it's only about 12% faster, but on the plus side the optimized code actually ended up with less lines of code and fewer variables required, so the code is a bit cleaner from that.

====June 18th, 2005====

I put together a cruiser to test out some stuff yesterday. Other than that I was making minor tweaks. I have noticed something interesting with the capital ships, however. All ships have access to automation on various components. AI players use all of the automation options, and then provide a little additional guidance. I've found that this is the most effective way to fight for humans too.

Since the majority of weapon systems on a capital ship are turret mounted, or guided missiles, the tracking computer and targetting computer end up doing most of the fighting for you. Of course, you can do these things manually, but it doesn't make a lot of sense. The tracking computer can track more precisely and with faster response time, and the targetting computer can consider many more targets in a given time span than a human could, and make very good decisions about whom to attack and with what weapons. In effect, the automatic tracking and automatic targetting greatly exceeds the capabilities of any human.

I'm not sure what to think of this. The fighter combat is highly technical - aiming and manuevering which relies on one's hand-eye coordination and quick thinking. The capital ship combat stands in sharp contrast to this. The capital ship combat is far removed from one's technique. Since your turrets can target, track, and fire on their own, and given the ponderous pace of capital ships, the combat ends up being much more strategic and based on planning and shrewd strategic decisions rather than split-second decisions and precise handling of the controls.

I've found this to be an interesting way to fight in a space sim. You can turn to bring the target into the range of motion of as many turrets as possible, or turn to present a less damaged side of the ship to the enemy at a cost of preventing some of your turrets from hitting the enemy. You can close with the enemy to bring more weaponry into range, or try to keep the enemy at range to minimize the number of weapons they can bring to bear on you. You can target a specific enemy, forcing more turrets to fire on that target - allowing you to concentrate your fire at some cost of efficiency. (Your turrets will automatically target the ship that they can eliminate the most quickly without overkill, so anything that you manually target is a &quot;worse&quot; target than the ones your turrets are already attacking.) Other ships can also be given orders to attack or protect certain targets. (Though again, they generally fight more efficiently by themselves, but there are cases where their judgement may not be the best.) The role of the human player in a capital ship, then, is more like a general or an admiral rather than the bridge commander of a ship.

====June 19th, 2005====

I made a major optimization to the fleet AI today. Originally, the different combat arrangements were sorted using [[Legacy:QuickSort|QuickSort]] and then the best one was taken off the top. The list was then stripped of all assignments that required the use of that squad, the tactical value of targets that the assigned squads were attacking was reduced (as they are already being dealth with, so the rest of the fleet can engage elsewhere) and the assignments involving that target were then reinserted appropriately into the list. This process was then repeated so that the lesser squads could get assignments without affecting the movements of the most major squads. I later optimized this as I found that [[Legacy:QuickSort|QuickSort]]ing the entire list again was faster than reinserting the modified members. This is the 12% speed increase noted above.

Today, I tried something different. I was trying to get more speed by trimming the list - not including assignments that would not get picked anyway, to make less work for the sort. Then I thought, maybe I can get away without doing the sort at all. To this end, I tried using a linear search to find the best tactical arrangements instead of sorting them. This seems to be far faster than sorting the list and going in order. I suppose sometimes the cost of being disorganized is not high enough to justify cleaning up. Unfortunately I don't think many spouses would go for that explanation. :)

I also did some relatively boring bug-hunting. Oddly, I had a division-by-zero that was crashing the engine. I found this quite peculiar as I understood that the engine gracefully handled division by zero by returning the maximum integer or maximum floating point value. (as the case may be) This one took a long time to figure out since the engine was crashing, leaving me without the benefit of logs to find the problem.

Now, with the bugs cleared out, all the stuff for combat is basically hammered out and some of it has been minorly polished. There's things I still plan to implement, but the stuff required to have a scrap is in place and working.

Hence, I have elected to focus on the economic side of the game - gathering of resources, construction of ships, pillaging helpless convoys, the usual. I'll probrably set up a testbed area for this tomorrow.

====June 20th, 2005====

So freighting stuff around, docking, undocking, and fleet AI coordination of such is all working. Economic stuff turned out to be way less action-packed than fighting. Then I thought it would be neat if there was pirate ships to harass the stations. Then I thought it would be better if the pirates had a fleet of ships. To counter this, I gave the trading group a fleet of ships too. At this point the economics stuff kind of went out the window and I was focusing on combat again.

I expect that I will do more economy-based stuff later. I still have to make mining stuff and something to deal with ship construction. However, I've become slightly sidetracked with the combat stuff.

Combat wise, I've made the missiles follow a drunken path, which seems like a good idea, as a missile following a drunken path would be basically impossible to intercept with another missile. It also looks much cooler. When a ship launches multiple missiles, it looks kind of like the &quot;swirl&quot; thing on the UT2004 rocket launcher, but much sweeter. The drunken missile code was fairly simple, basically I take the sine of the distance to the target multiplied by a random constant. This constant is determined at fire time. The sine is then applied to one vector perpindicular to the missile. Another sine with a different constant is applied to a vector perpindicular to the velocity and the first vector. So the path isn't truly random, but it is still much more complex. I'm considering having the constants change in flight randomly which would give a truly drunken path.

Presently the fleet AI functions at roughly the level of an English Admiral, circa 1600 AD. At this point, ships are moving to combat individual targets based on an assessment of target capabilities and their own capabilities. Their strategic sense is excellent in this sense, but it causes the ships to get somewhat &quot;mixed up&quot; as they close on each other. Shortly after the 1600s Robert Blake developed the &quot;line of battle&quot; tactic, whereby powerful, tough ships would line up to broadside an enemy fleet. Positioned end-to-end, friendly fire was eliminated, which was a problem with the previous tactic of squaring off with individual targets.

My ships don't have a problem with friendly fire. This is because they are fairly good shots and the three dimensional nature of space combat means that the lines of fire rarely cross a friendly ship, even when the target is surrounded. For this reason I'm not sure that I want to implement &quot;line of battle&quot; tactics. Artificially restricting the movement of the ships might make them less effective. On the other hand, it would make for a gap between the battling sides, which might be more visually pleasing, and it would also prevent the occasional case where two ships, battling back and forth, end up manuevering quite far away from the main conflict.

A third possibility is the tactics popular today, the so called &quot;battle group&quot; tactic. The &quot;line of battle&quot; fell out of popularity near the end of world war II as a bunch of battleships end-to-end in a straight line were an amazing target for bombers. (SAM systems did not exist at this point) The &quot;battle group&quot; tactics basically has one large ship supported by other ships. So, an aircraft carrier, for instance, would move about, and a number of cruisers, destroyers, frigates, and submarines would follow in formation, providing anti-air, anti-submarine, and anti-torpedo support. The main disadvantage of this tactic is that a lot of your firepower is wasted as the destroyers, etc. are not in range of the enemy battle group, so they spend a lot of their time screwing around.

In other news, there MIGHT be a video coming soon. The combat is looking fancy, but screenshots seem to turn out a bit stale looking so I'd like to produce something in motion. However, a video takes a lot more time to prepare, what with video editing and such involved. I've included some screenshots in this journal entry even though they don't really do the mod justice in my opinion.

[[Image:Legacy_FoxpawsDrunkenMissiles.png|left|(a)]]

[[Image:Legacy_FoxpawsCloseInFrigates.png|right|(b)]]

[[Image:Legacy_FoxpawsFrigateFormation.png|left|(c)]]

[[Image:Legacy_Foxpaws2on3.png|right|(d)]]

----

(a) These missiles are drunker than a teenager at a grad party.

(b) Naval Combat, circa 1600 AD.

(c) &quot;Line of Battle,&quot; circa 1700 AD.

(d) Sucks to be that guy.

----

'''Bonehed316:''' This sounds really cool.  The pictures dont look as cool as the idea sounds, but I'm sure it looks much better in person.  For your missiles, I have an algorithm that sends missiles to a &quot;midpoint&quot; location, which is located somewhere between the weapon (or whatever is firing the missile) and the target, then offsets it so that the missiles all spread outward, once they reach that point, or travel in that direction for a specific amount of time (determined by the distance between the two objects), they then switch &quot;target location&quot; to the actual target's location.  The result is a more interesting flight pattern, and is very useful for multiple missiles fired at once.  The only problem I forsee with a drunken pattern is it might increase the possibility of missing your target.

'''Foxpaw:''' Ah, the missiles don't fly a random pattern, as it appears they do. Since their offset is a function of the sine of the distance to the target, when they reach the targets location the distance is zero, so the sine of the distance is zero, hence the offset is zero. For that reason, the &quot;drunken&quot; flight pattern is actually just as precise as a straight flying missile.

====June 26th, 2005====

Today I implemented some mining stuff. Mining lasers, asteroids, and a technical means of storing these as cargo without using tons of resources were implemented. I plan to implement a few other means of mining, specifically I want to have mining drones, and mining bases that you could deploy onto asteroids.

To coordinate this I had to expand the AI somewhat to have an economic controller. Previously I already had a means to coordinate freighters' pickups and dropoffs. The economic controller generates the &quot;work orders&quot; for the freighter management. It also generates &quot;work orders&quot; for resourcing vessels, and decides when they should drop off the stuff they've mined and to where.

So presently the testbed area contains a cluster of asteroids, a mining station, mining ships, freighters, and a space city. The miners mine from the asteroids, drop that off at the mining station, then the freighters load up at the mining station and carry haul the minerals or whatever to the space city, which is some distance away.

Speaking of some distance away, that blasted 60,000 UU render distance is giving me trouble again. I scaled everything down to get rid of that the first time, which worked good at the time, but as things have gotten bigger, it's creeped up on me again. The space city and the mining station cease to be rendered before they shrink away to nothingness, causing undue ugliness when they pop into view. I could rectify this by scaling everything down again, but I don't really like that idea, as it means I would have to scale down all the special effects and sound and light radii, which would take a while to get nicely balanced again. I may have to reinstate the &quot;imposter&quot; system used in the third generation to deal with this thorn in my side.

'''Mosquito:''' why not just use distance fog that makes the large city fade away into the backround before it could ever stop rendering?

'''Foxpaw:''' I have been using the distance fog but the two problems with that is firstly that it fades to a fixed color, and the backdrop behind it is not one constant color, so you can see a &quot;silhouette.&quot; The other problem is that at the distance where it stops rendering (the point at which it is completely fogged) is still close enough to the player that it's sort of unrealistic to have it disappear from the screen.

'''Mosquito:''' What about fading it Alpha wise?

'''O-GL''' Very interesting reading all your recent updates Foxpaw.  I guess the imposter system would be best for this problem.  Hopefully the imposter system doesn't use too much processing power.  Alot of games with such large view distances have things popping into view or have them popping in with a silhouette.  Of course, it isn't optimal for the game experience to have any 'popping' at all &amp;ndash; but as long as the player can play the game with the opportunity to interact with all targets, that is all that matters.  

I haven't updated my wiki page for a few years, but your efforts here are really motivational for me.  One question: what changed in your life so that you could work so much on your mod?

'''Bonehed316:''' In homeworld, for example, they explained the &quot;popping&quot; with sensor distances.  When a ship wasnt in any of your fleet's sensors, it wouldnt get drawn.  This isnt so easy for you, but it IS possible.  You simply need a &quot;sensor&quot; object, and use its collision cylinder to detect when pawns (or whatever you use) touch it, but is not a projectile target so things wont shoot it.  Any actor will of course trigger the Touch/UnTouch events for the sensor object, which can then unhide other actors, or whatever so they are drawn.  But that may not be what you have in mind, but it is one solution.

OR you can borrow an idea from [[Legacy:Tamearia_Player_Opacity|Angel_Mapper]] and rig the materials on the ships that come into view with a material and adjust the transparency.

'''Foxpaw:''' I have considered the &quot;sensors&quot; thing but I'm not sure if I like that idea or not. The major issue that I see with it is that one would expect your sensors would have a farther reach than your visual range.

I've been working on the mod much more lately, though I'm not entirely sure what has given me more time. I think I might just be procrastinating less.

'''O-GL:''' Do you have a part-time job?  What job did you end up getting and how much time does it take up?

'''Foxpaw:''' I'm working as a research assistant at the University and at McDonalds part time. McDonalds is about 20 hours a week, at the University, it's supposedly full time but in reality there is a fair bit of downtime when meetings have to be scheduled around other people and stuff.

'''Switch`:''' The far clipping plane is at 65536uu, you can change it by editing Core.dll, in 3355 it's a float at offset 0xAD96C.

====July 6th, 2005====

I mostly only have technical stuff to report. I've been making various improvements all around, until today when I did some meatier stuff. I noticed there was some slowdown that was occurring when I tried a pirate spawning test.

In this test, pirate ships randomly spawn around the area where mining or freighting operations are taking place. This is in place of a proper pirate faction with it's own AI and other such goodies, which will be in place eventually. Although the ships spawned more quickly than I had intended, this does not appear to be the cause of the slowdown as the number of ships spawning was not great.

To track down the problem, I started profiling code. This was rather easy as I had previously made my own code to tick my ships and parts and stuff. I hadn't written about this earlier, but it's quite nifty. I can control the order in which things are ticked, making the AI more accurate. First, ships move, then AIs adjust their movement controls and aim. Then, turrets get ticked, allowing them to move to the new directions desired by the AI. Finally, weapons get ticked. (There is other stuff in between too.) This order allows turrets to hit targets at their new position instead of sometimes being a tick away. (Depending on the order in which they are spawned.)

Isolating the ticks like this also allows for some super nifty stuff, like having ships get more or less delta in a given cycle to have time dilation or stasis effects without any hacks. Another very useful possibility is that it will allow me to tick ships that are very far away from the player or in other systems less frequently (with a higher delta) to reduce computer resources dedicated to them.

As a side effect it also makes it easier to find where optimizations can be made. First I discovered an oversight in the turret code that was making it use far more resources than were necessary. With a few changes I cut their running time to a tenth of what it was before. The other big user of tick time was the ships themselves - most specifically their physics.

While optimizing the ships physics things didn't go so well. I accidentally introduced a bad bug that I had a very hard time tracking down because I introduced that bug in a very commonly used part of my math library, so it was producing odd behaviours and using WinDiff between current versions and backups of the files that I ''thought'' were the relevant classes revealed no changes. I also found something else problematic.

When looking over the physics code I found a place where there was a possibility of parts maintaining some physics related references to parts on a different ship, if those parts had been on the same ship but had been separated by damage. I hadn't caught on to this because the design of the ships I've made is prone to having all the small bits stripped off before any major structural components are destroyed.

This turned out to be somewhat difficult to solve. To do this cleanly I was going to have to break apart the entire ship, maintaining all heirarchial information, and then reassemble it. The reassembly would correct all physics references. To maintain the heirarchy, I tried using a struct. This struct contained a reference to one part, and a dynamic array of more such structs. It was, essentially, a tree structure.

Unrealscript didn't like this. I don't know if it was the tree-ing of structs that it didn't like, or simply the referencing of Objects from within said tree. I'm inclined to think the latter, given Unrealscript's general attitude toward Objects. I was getting wierd behaviour like a GPF if I tried to assign anything to any element of the dynamic array, ''except the first element''. I ended up solving this using Objects instead of structs. I was a bit apprehensive about using Objects for this as I suspected that they would be more prone to crashing than structs. It appears my concern was unwarranted in this case.

With all that I never did get around to figuring out the source of the slowdown with the pirate spawning. I'll probrably get to that soon.

====July 27th, 2005====

I haven't written an update in a while, but I have been doing stuff. Mostly technical improvements, so there hasn't been much to say. I don't have much to say about that since a large problem has come up.

Tragedy has struck. Though I may never know how a piece of software operating in protected mode can cause permanent damage to hardware, it seems possible. While extracting some files from an archive using WinRAR, the computer froze up and the hard drive was making a funny noise. So I rebooted without incident and breathed a sigh of relief as no data seemed to be damaged. (My backups had somewhat recently been erased as the computer they were on was reformatted.) Assuming this was some wierd fluke, (I had another idea about what might have gone wrong, but I won't go into the boring details) I tried extracting the archive again, with the same results. A lockup, accompanied by a wierd noise from the harddrive.

So I tried rebooting again. Wierd noise from the harddrive on startup this time, and the disk isn't autodetected by the BIOS. My harddrive has a jumper setting which stops the platter from spinning, and the drive autodetects in this setting, but for obvious reasons it does not function. The wierd sound that the hard drive is making sounds like one of the heads is continuously sliding back and forth between the extents of it's travel. The drive makes this sound even with the IDE cable disconnected, so it appears there is damage to the harddrive and not to the BIOS.

Tomorrow I plan to look into my options. ''If'' the head can be repaired without destroying the data, I may be able to recover the data. However, if the head has contacted the spinning platter (which seems plausable given it's obvious hardware malfunction) all the data will be lost. If that is not the case I ''may'' be able to transplant the platter into an identical drive and get at the data that way. Though I believe I have the tools and the know-how to prevent dust from getting into the drive and possibly to perform a successful transplant, it will require endangering a brand new hard drive, so I'm not too keen on that idea. On the other hand, losing all the data would be the pits, as I had an important database, and of course the mod and the operating system that I had more or less completed on the drive.

So I'm going to look into my options tomorrow and play it by ear for now. Since this coincides very badly with the loss of the backups, it might mean a start from scratch if all the data has been lost. That would be very unpleasant since this iteration of the code is the first for which I did not see any way in which I could improve upon it if I did it again.

We'll see how things unfold from here.

'''Graphik:''' Online file storage = good.

====July 30th, 2005====

It appears that I have little recourse with the failed harddrive, so all my data is lost. This is quite unfortunate.

As far as the mod goes, I could remake everything from scratch, creating yet another iteration, but I'm not sure that I want to do that. I don't see any way that I could improve upon the previous iteration, so redoing everything would be kind of boring. On the other hand, I've worked on this a long time and it would be a shame if I end up with nothing to show for it. I also don't want to disappoint those people who may have been eagerly awaiting a release. I also quite like the idea but I doubt it's mainstream enough that a commercial game studio would ever tackle it, so if I ever hope to play such a game I may have to make it myself.

I might try doing a completely different style of mod instead. I'm not really sure at this point. For now my plan is to play some games, and see if I get any ideas or if perhaps an unmodable game with no sequel on the horizon cries out for more. (like Manhunt)

'''T1:''' You know, the only thing I've been wanting to play more than this mod is coding for Unreal Engine 3 (not the actual games...) and TES4: Oblivion.

====September 2nd, 2005====

I've decided to try to write a compiler. This is detailed on the root of my personal page, [[Legacy:Foxpaw|Foxpaw]]. That specification will likely be moved out to a different location at some point. Most of the functionality is complete at this point, but using it to compile a mod is as yet not possible because I don't have everything for inheriting from classes in other packages working.

My original vision was to make a compiler that is completely compatible with Unrealscript, and then add functionality to it. However, I'm no longer sure if that's what I want it to be. Writing a compiler for UnrealScript is turning out to be more complicated than I had expected, as the syntax of the language has many exceptions to it. Unrealscript also has many language features that I have very little interest in, and some features that I would like to implement would require adding yet more exceptions to the language.

Now I'm wondering if I should instead try to standardize a little bit and instead of making exceptions in the compiler to handle nuances of UnrealScript, I could instead modify UnrealScript for more straightforward compilation. I could make more powerful language features from within a more straightforward language.

However, compatibility with Unrealscript was a fairly central part of what I was trying to do, so I'm not keen on changing that. I'll make some decision on what to do, maybe in a few days. I haven't been spending much time on this, so it might be a while before I can release anything.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3245</id>
      <timestamp>2005-08-21T22:13:29Z</timestamp>
      <contributor>
        <ip>Dial-513.wroclaw.dialog.net.pl</ip>
      </contributor>
      <comment>far clipping plane</comment>
      <text xml:space="preserve">====July 5th, 2004====

Well, I've integrated the menus all into one, which is neat. I also worked out some accessed nones and revised the gameinfo to allow the level to run before the level is actually &quot;run.&quot; That is, there's only the one level that is ever played in, but that level is loaded while the front menu is being displayed. Obviously, you don't want gameplay to begin until after the player has selected some stuff from the main menu.

However, the upside is that the whole thing is really fast. It's kind of neat, but also kind of bad. Specifically, it's kind of bad because it feels unnatural to be dumped into the game when you've barely released your mouse button. Most games have loading screens, and I was expecting to see one when I hit &quot;new singleplayer game.&quot;

To remedy this, I've implemented a short delay which is supposed to represent all your ships and stuff coming out of warp space. Basically, you log off by entering warp space, and remain there until you log in again the next time. This greatly simplifies saving and loading to a level manageable from within Unrealscript, since a lot of the &quot;state&quot; is not stored. (projectiles in transit, particle effects, etc. do not need to be preserved in this way.)

Some players would rather have a true &quot;save&quot; and &quot;load&quot; feature on the single-player game, but for the time being that is not practical without native saving and loading support, or large amounts of Unrealscript code to store and restore the state of all objects.

So anyway, I've got the menu flow working. I haven't tried the vehicle editor yet since I changed some of the workings of the menu, but all the other menus seem to work normally so I'm assuming that will to. If anything it should require only minor debugging. With all that working, you can now build stuff, give orders to friendly units, manuever the menu system, shoot at things, get shot at by AI things, and design vehicles. That doesn't leave much left to do. In theory. There will be a lot of polishing and content creation to do, of course.

Also, I still have that cursed problem to solve with the rotations of stuff in the editor. However, I'm confident that the solution will come to me eventually.

====July 19th, 2004====

It's been a few days without internet access because I had a network cable disconnected and I didn't really get around to reconnecting it. However, I did do some coding, which has been in short supply lately. I got the editor working again alongside the regular level, so you don't have to load a separate level to access the editor anymore. I'm not sure why, but the saving of designs wasn't working anymore so I fixed that too.

Then I added the actual saving functionality, which is cool. It had a few bugs to work out, but in the end, it all worked nifty. So now I can retain a persistent world state without native loading and saving stuff. Also, I added the ability to switch which of your ships you are controlling. I'm pretty excited that both of those things are working. I might change the switching between ships part a bit, but most of that code will remain the same.

Iterestingly, it was not THAT difficult to allow saving of the world state in UnrealScript. Unfortunately, there are a couple of things that can't be saved in this manner - in particular, the progression of an objects state code, or emitter particles, for instance. However, for the most part, stuff can be saved by simply providing a list of variables to be saved. Since Unrealscript can look up variables by their string name, and also read the value in string form and set the value in string form, this was surprisingly easy. Basically, you just have a list of properties that you want saved, each one has a GetPropertyText done on it, and the variable name and value is stored in a relational database. Then, come loading time, all the actors are spawned again, and the tuples of the database are iterated through with SetPropertyText. This allows you to very quickly recreate the world as it was saved.

Of course, some things like references can't be stored in this manner. For that reason and for simplicity, as little as possible is saved. This doesn't cause the exact game state to be stored, but that isn't the intention either. Admittedly, for singleplayer it would be nice to store an exact game state, but that will require native support (to store references and such) which, to my knowledge, is not available in UT2004. (It's not available in UT2003, and I don't have UT2004 yet.)

'''Wormbo:''' Save games (like in Unreal) are available in UT2004, the implementation still seems to have a few problems, though.

'''MythOpus:''' I've been trying to follow your mod development as closely as possible...  I think I have the basic idea put together in my head but correct me here...  players will be immersed into an always expanding, always changing world.  The player will be in charge of a fleet.  He must then build up that fleet, gather resources etc... to eventually wage wars and what not to take control of the persistent world?  Okay...  now on to another question...  will it be multi-player capable (as in online warfare)  or do you doubt it... and when a player logs out and 'goes into hyper-space', does the world save everything and pause or does it keep on going if you leave it on?  If it keeps on going and you choose to log back in... what would happen if another fleet of ships was right your hyperspace wake?  I request to be a beta-tester also :P

'''Foxpaw:''' Well, that's pretty much it. You can control a fleet, or you can dump all your resources into building a small group of ships or a single ship with more exotic (and expensive) weaponry. So it caters to both first person space shooter-type players as well as those who want something more like an RTS/Homeworld kind of play. For the single-player I plan to have a campaign and stuff to keep it a little more interesting. In multiplayer it will be more like an MMO. To facilitate a large number of players, I'm planning a peer-to-peer networking and distributed computing scheme using the IP wrapper classes in the Unreal Engine.

In single player the world will likely be &quot;frozen&quot; when you &quot;log off,&quot; (quit the game) and will resume when you return. I have considered the idea of having the game simulate some passage of time when you return, but I haven't decided on that yet. If possible, single player may also have the ability to save the game state as-is and return directly to the action.

For multiplayer, of course, the world will continue while the player is offline. I have considered the possible conflict that could arise if a player tries to log in and other stuff is occupying the space where the player's stuff was when they logged off. I haven't yet decided what to do about that. I have decided that there will be a visual and audio cue when a player is starting to log in. (like when their login has been accepted by the login server and they're connecting to their peers) This would be something like swirling dust or something around the point where a wormhole is about to open.. or something like that. I haven't decided whether the ships should just come through and collide with stuff, encouraging people to log off in less-trafficked areas, or possibly to have them adjust their position so they would warp in clear of any obstacles.

Beta testing is still a while off I think, but I expect when the time comes I'll try to recruit some people for the beta testing both here on the wiki and on BeyondUnreal Forums. (as much as I dislike forums)

'''Mosquito:''' I wouldn't recruit off the forums, alot of bad apples their and bunch of people that wont give you useful feedback, select or testers carefully, 5 good testers can be better then 50 bitchy llamas.

'''NickR:''' I'd really appreciate the chance to beta test. :D 

'''T1:''' Well, I can't resist. I wish to beta test also.

====July 26th, 2004====

Well, it looks like I might actually have the editor rotation thing down pat. We'll see though. I knew that the solution would be deceptively simple, and the solution that appears to be working is indeed simple, but I'm skeptical. It doesn't feel like it should actually work, though it appears to. I'm hoping that it will continue to work.

So, then, now I can get into singleplayer, have it load up the persistent state, fly around, build stuff I've designed in the editor, and give AI pilots orders to attack and stuff. The AI pilots are a little erratic, but sufficiently effective. So, now I need to make some higher-level AI so I'll have an enemy to play against. Plus a ton of polishing to do. However, I think that the AI is what's needed most at this point.

Simply enough, every ship has it's own AI pilot, which can recieve orders from some external source. AI pilots have limited ability to make decisions and can fight and such on their own. However, they have no knowledge of the larger scale goals and such of their &quot;team.&quot; So, for instance, a fighter is smart enough to escort a transport, and a transport is smart enough to travel to a given destination, but neither is intelligent enough to know what needs to be transported or why.

This is where the higher level AI comes in: it does all of the planning and stuff in pursuit of whatever goals that particular AI player has. I've also built in some limited support for heirarchies of AI players.

So for instance, a higher-level AI may preside over a mining base somewhere, and would give &quot;orders&quot; to mining vessels, fighter escorts, and transports to send processed materials to other bases where they may be needed.

Anyways, the higher level AI is likely going to have to be some kind of an RTS AI basically. The problem is that I know very little about how to implement an AI for an RTS game. I have looked at the Homeworld source which was released by Sierra, which may be a good starting point. The problem with that is that the Homeworld AI is a bit crude and has no &quot;political&quot; affinity aside from a predetermined list of enemies and non-enemies. Then it basically builds one of a few loosely defined fleets and launches an attack at what it considers to be the most valuable assets of the target player - usually the mothership or carrier.

I'd like an AI that is a bit more diplomatic, perhaps attacking people only with reason to do so and such. However, now that I mention it, a mining base is probrably the perfect test-bed for developing the AIs, since it has a pretty straightforeward motive. I think I'll give that a shot.

====September 3rd, 2004====

I'd been holding off on buying any new games until I got a new video card, since I would possibly get a sub-par gaming experience with my integrated graphics. Shortly before my last update I got an X800 Pro and I've been mostly playing games since. Unfortunately, I haven't been doing any work on my own mod.

I was going to make a mining base as a platform to develop the AI further, but then I realized that building a base was going to require me to make new meshes for the base parts, since I couldn't really build a base out of fighter parts.

The editor rotation thing does seem to work, but another part that seemed like the easier part of that problem doesn't seem to. This I find wierd because it's essentially the same code as the turrets, which seem to work. This has raised an unsettling feeling that maybe the turrets actually don't work, and they only appeared to work because of some coincidence in the way that I tested them. ...

Actually while I was writing that I realized that the turrets work because their axis of rotation is always the same relative to the turret's own internal coordinate system, (it can be anything in relation to the rest of the ship) but when rotating components in the editor the axis of rotation is dependant on how the component has been attached. To facilitate proper rotation I'm probrably going to have to make some of the turret code global to all ship parts, in that the rotation of a given part will be expressed as an axis of rotation and a rotation around that axis, instead of just a straight rotation relative to it's parent component.

That's reminded me of an interesting point: explaining things to people seems to be a good method of gaining new insight into those things. I've noticed this before, but never really written or said anything about it. However, it seems to hold true - many times I've been writing about a problem or telling someone about it when mid-explanation I'd have an epiphany. Sometimes I even have mock &quot;Q &amp; A sessions&quot; with myself when noone is around. (They might think I was crazy if they realized I was conversing with myself.)

At any rate, I'm hoping to get back into programming soon.

'''MythOpus:'''  Talking to myself always helps me figure out all my problems too.  My family usually thinks I'm talking to them though.  Anyhoo, how is the mod coming along?

'''Foxpaw:''' Well, as mentioned above it's somewhat stalled for the time being due to the editor rotation shenanigans. It's pretty much the only major coding hurdle that I can see still remaining to be surmounted.

Completion of the editor is essential to the creation of the game world, which is going to be required to experiment with a few more things.

Once I have the editor done I can start building up the game world, and then do some quasi-fun AI stuff.

====September 16th, 2004====

Well then, I actually did a bit of coding patching up a few minor issues. Now I'm thinking I want to change some of the lower-level workings of the ships, but I'm uncertain as to the best way to go about doing so.

Basically each ship is a heirarchy of parts. The part at the very top of that heirarchy keeps track of ship-specific stuff like the center of mass of the whole thing, the pilot, resources stored on-board, etcetera. However, every part has the capacity to store this information, but only the top part does. This is a waste of RAM. Further, it slows down run-time execution somewhat and complicates the AI system. Lately I've been noticing some oversights that have resulted from working with this system.

So, now I want to have a central &quot;ship&quot; actor, which will still have it's parts, but instead of the topmost element in the heirarchy holding the ship-specific data, the &quot;ship&quot; actor itself will store ship-specific data and handle the camera and such. It will also handle some of the AI which I want to simplify. Originally I was using a controller sort of system kind of like the system used by UT2003/UT2004. However, this system no longer makes sense to me, as every ship except for one is going to have an AI controller. (Barring network stuff, of course, but that's handled differently.) Then, every time a player leaves the control of their ship to go to a menu or something, an AI has to be created to take over, and then has to get destroyed for the player to come back in.

Instead, I'm likely going to have an AI built into the &quot;ship&quot; actor which will simply be overridden by the player. This also has the added advantage of having some continuity - that is, if a player takes over control of one of their ships temporarily and then leaves, it won't be replaced with a new, &quot;clueless&quot; AI. This should also simplify the code so I won't end up with oversights like stray cameras and AIs that didn't get cleaned up due to some anomalous condition.

However, I'm not really sure how to go about implementing a centralized &quot;ship&quot; actor - there are many ways that a ship can be created, and frankly I'm not sure that I remember them all. I'll take a stab at it later and see what I come up with though.

----

Well, now it's about 5 hours later, and it was easier to change than I expected. I came up with a clever scheme of just changing the name of the ship part class and then creating a new ship class to hold the per-ship data. Then I just caught all the errors tossed at me by the compiler to find all the places where the two classes were referenced. It ended up being relatively simple to change, because most places where a ship part was being referenced, it was either accessing per-ship data, or per-component data, and rarely were the two mixed. In fact, I had only two major bugs after recompiling and testing, which I'd say is pretty good for splitting a 29KB class into two.

Let me take this opportunity to curse Microsoft's Multimedia Keyboard, upon which the decision was made that people don't really use insert so it should be removed as a key and instead added as a third function of the print screen/system request button. Of course, no indication is made as to how to activate that feature, so when I accidentally enable insert somehow I now can't disable it.

Anyway, back to what I was saying: the new structure seems better and allowed me to remove several if checks, some recursion, and other assorted stuff. It also allows me to standardize ship controls a little more, which I guess is a good thing. It's faster at runtime, which is good. I've taken advantage of the speed increase to implement a more flexible resource system, though the most critical resources on a ship, energy and fuel, will remain with the older system as it is faster - so the things using the more complex system will be more like cargo and unrefined stuff that's been mined or whatever.

====September 17th, 2004====

So, I've been coding up a storm, but I've hit a roadblock and I'm stumped. Normally I can deduce my way out of any error, especially one as tame as an Accessed None, but so far I'm unable to overcome it. The reason being that I can't figure out what's going on. It seems I have an object reference that is None, but at the same time it's not None. How is this possible you say? Err.. well I don't know. But the following bit of code:

&lt;uscript&gt;
  if ( Parts[0] == None )
    DebugMSG( Parts[0]$&quot; is teh none!&quot; );
  else
    DebugMSG( Parts[0]$&quot; exists.&quot; );
&lt;/uscript&gt;

reliably generates the message &quot;World.ShipPart is teh none!&quot; which doesn't make any sense. Clearly, Parts[0] == None since it would have to pass the check to display that message. However, the very fact that the object's name, World.ShipPart, shows up in the message, means that Parts[0] can't be none.

I'm going to continue working on this bug and perhaps try some more deductive methods of finding out what's wrong, particularly finding out what's causing this anomalous condition. I'll post an update if I figure it out, though it might take a while due to the apparently impossible nature of the bug. (My suspicion is that perhaps somehow I have accidentally foiled the garbage collection system, but I'm not sure how I could have done so as ShipPart is a subclass of actor)

----

'''UPDATE:''' Okay, I was close. I also caught a fleeting glimpse into the garbage collector. Apparently, the Parts[0] WAS none, but whether it's &quot;none&quot; or not appears to be based on some flag stored in memory, as opposed to an actual value stored in the reference. This means that evaluating == None returns true, but casting to a String gets passed the &quot;accessed none&quot; checks and uses the region of memory that previously held a valid object. This condition persists for only a short time, and this memory appears to be reused after a short time. A most interesting bug to have.

'''Mychaeel:''' That flag you're talking about is probably &lt;code&gt;bDeleteMe&lt;/code&gt;.  Its consequences are mentioned already in the comments to the entry of May 31, 2004 on [[Legacy:Mychaeel/Developer Journal|Mychaeel/Developer Journal]].

'''Foxpaw:''' Possibly - but I think it might be a native bit. It could be bDeleteMe, but this isn't an instance where something has been deleted but still has bDeleteMe set - if you tried to access bDeleteMe in this case you would just get an accessed none. The ability to get the name of the objects by casting to a string persisted for several seconds after the reference was None, which is not (to my knowledge) the use of bDeleteMe. It was my understanding that bDeleteMe is only intended to be used to test if an object had been destroyed earlier in that Tick.

'''Mychaeel:''' No.  &lt;code&gt;bDeleteMe&lt;/code&gt; is set for any destroyed actor until it is garbage-collected &amp;ndash; and that usually takes until the next match starts.

Earlier engine versions just set the &lt;code&gt;bDeleteMe&lt;/code&gt; flag, removed the actor from the actor list (and put it in the &quot;just-deleted chain&quot; of actors which is maintained via the &lt;code&gt;Deleted&lt;/code&gt; reference defined in [[Legacy:Actor|Actor]]) and set any references to it to &lt;code&gt;None&lt;/code&gt;.

Newer engine versions also check the &lt;code&gt;bDeleteMe&lt;/code&gt; flag whenever an actor is accessed in UnrealScript (as in the &quot;==&quot; operation or when accessing any member of it) and return &lt;code&gt;None&lt;/code&gt; instead of the actual actor reference if it is set.  (In earlier versions, you could access a just-destroyed actor without problems as long as you had a reference to it &amp;ndash; that's not possible anymore.)  It might be that casting an actor reference to a string as it is done in those log statements of yours doesn't do that &lt;code&gt;bDeleteMe&lt;/code&gt; check, so you'd get an object name there even though comparing the reference to &lt;code&gt;None&lt;/code&gt; will yield &quot;true.&quot;

I've had some problems with accessing destroyed actors of my own when I assumed that destroying an actor would effectively set all references to it to &lt;code&gt;None&lt;/code&gt; &amp;ndash; that's apparently not the case, for instance when you've referenced an actor from a &quot;static variable&quot; (i.e. the default value of a variable).

====September 18th, 2004====

Well, I finally knuckled under and did the grunt work of implementing the component editor. It actually ended up being less of a nasty hack than I had expected, though it could still use some improvement.

At any rate, I can now use all parts of the editor so I can fabricate ships from start to end and build them in hangars. Previously I had manually edited some stuff to make the components, and then used the vehicle editor to just assemble them. The component editor was a complex part to implement because although it didn't involve anything particularly fancy, it involved a large number of variables that could be set, and which variables would be available for setting was dependant on what type of component it was. A mechanism for changing what type of component it is was also needed.

Anyways, now that that's done, there should be at least one new screenshot coming soon. I know I said that a long time ago, but I got kind of sidetracked. Unfortunately, I've been had by Sierra and the sample textures included in their Homeworld 2 SDK don't actually line up, although they look like they should. Further examination showed that the diffuse channel of the background in the level of Homeworld 2 that the sample textures are from is slightly different from the actual sample textures provided. The &quot;star mask&quot; appears to be the one from the production game, while the diffuse channel was perhaps modified prior to shipping.

What this means is that there are a few wierd artifacts where the alpha channel doesn't agree with the diffuse channel. I'll try to take screenshots that hide this anomaly. I have improved the backdrop code somewhat so it looks much nicer now too. This should be obvious when I upload the screenshots. Unfortunately, JPEG will probrably have something to say about the quality of the screenshots, but we'll see.

====September 29th, 2004====

First off, let me take this moment to thank Epic for making classes with very generic names, and then putting them in Engine so they effectively reserve the word into perpetuity. I really appreciate writing a lengthy but relatively straightforeward class only to find that it won't compile because Epic felt like they should include a class called VehiclePart that isn't even used at all and, though native, provides no apparent functionality. It's like finding a prize in your cereal, only instead of a prize, it's a broken bottle of arsenic. Ruins the whole bowl. I, of course, had the good fortune of naming a struct that and then writing a class using it I had to change it to something else, which was not as simple as search and replace as that particular string was also a substring of some other stuff that I didn't want changed. I actually knew about this class and thought it would work anyway, since, in most cases it does. However, the behaviour in this case appears to be somewhat inconsistent, so certain sorts of declarations used the struct, while others tried to use the class. This allowed me to pretty much finish the class before discovering this lovely surprise. Of course, since tons of stuff that is unrelated to the engine is stored in the Engine package, which you can't really exclude from your compilation, there's no way to really escape these generic &quot;reserved classes.&quot;

: '''Mychaeel:''' You can always fully qualify any class with its package name: &quot;MyPackage.VehiclePart&quot;.

: '''Foxpaw:''' Yes, but this is a struct interfering with a class, not a class interfereing with another class. Does the same apply for structs?

:'''Mychaeel:''' You can fully qualify a struct name with its class name: &quot;HudBase.SpriteWidget&quot;, or &quot;XInterface.HudBase.SpriteWidget&quot;.

Anyways, now that I've said that, the class I was mentioning was the one that stores your various ship blueprints and stuff. I wanted to change this for two reasons. Number one was that for some reason saving a ship would sometimes wipe out all of your saved component designs, and sometimes saving a component would wipe out all your ship designs. Bad news. I think I found the cause of that while doing a complete rewrite of that class, but I wanted to rewrite it anyway. Previously, the vehicle &quot;catalog&quot; that stores your designs was a subclassed &quot;persistant state&quot; that stored only your components and ships that you had designed and never actually got loaded into the game wholesale. I decided to change this for one main reason:

When I originally wrote the class, I thought that that system would be good. Ships, once designed, would retain all of their properties, so if you changed a component design, ships already designed with that component would not be affected. At the time I considered this to be a good thing, as it would allow you to keep your older designs without having their parts cluttering up the part designer. I've changed my mind on this though, as I think it might be inconvenient for players to redesign all of their ships if they wanted to change some of the stats of a weapon or something. So now, ship designs just reference the components they are made from instead of making their own copies. This neccessitated a separate &quot;catalog&quot; class and not just a subclassed &quot;persistent state.&quot; With the new system, changes made to components after a ship was designed will affect all ships that have that particular component on them somewhere, but only ships built from that point onward. For the time being, there is no mechanism to retrofit existing ships, though I might be able to implement something like that by having it compare the components of your ships to find the closest component and retrofit to that. No reference to the original component templates used is stored in the components, so I would have to find some scheme to figure it out based on which component template was the most similar.

I also found a small bug that I'm amazed eluded me for so long. If a ship takes enough damage to certain areas it can be severed into two or more independant parts. This is done automatically in the function that causes a ship to remove components from itself. What I didn't realize was that when I remove a component from a ship so that I can put it on another ship, I was &quot;severing&quot; it off of ship A to put it on ship B, but the act of &quot;severing&quot; it from ship A caused it to be made into a fragment, a member of the new &quot;ship,&quot; ship C. Then it merrily went about adding it to ship B, (having passed the check to see if it's part of a ship already, and severing it if it is) and thus ended up as a member of TWO ships. This was causing wierd rotation issues that would be fixed by saving and reloading. (As the saving code will only recognize one of the two ships as the actual owner of the component.) I suspected it was something like that, but I was having difficulty finding out where in the code that was happening as all of the references from the component to it's parent ship pointed to ship B, but ship C was sitting inconspicuously in RAM with references to the component.

Also, in addition to my earlier rant, I'd also like to express my feelings for the changes made to the broadcast system for UT2004. How could this be a problem, one might say? Here's how: UT2003 had a queue of up to a thousand messages in the console window. (Though I don't think it would actually display that many.) It did so with little performance overhead. UT2004 has a queue of a hundred. How is this bad, you might ask? Well, despite having a queue 1/10th the size, if you pump a lot of messages into it fast, it slows down the game enormously. I first noticed when I spawned a UniversalThingTally. (a debugging tool I made which does an allactors and reports back a count of each type of actor existing in the world, and it does this every tick. I use it to find things that aren't getting cleaned up like they should.) Now, a UniversalThingTally puts a LOT of messages on the console. It caused a minor slowdown in UT2003. But in UT2004, it drags my system from a peppy 200fps to 20 as soon as it's instantiated, and over the next few seconds, it goes down to 5, then to 2, then to 1, then I hit tilde, type in &quot;exit&quot; and hit enter, wait a few seconds, then shout some profanities.

I fail to see how the changes made to the broadcast system are an improvement. I copy and pasted UT2003s code into a subclass of ExtendedConsole and all was well.

I recently ported the code for the mod over to UT2004, by the way. I suppose I didn't explicitly mention that. The mod directory structure is cool, and the fact that saved games are supposed to work in UT2004 is cool too. Most of the other code changes (low-level packages like Engine, IPDrv, etc. only - I can't speak for the UT2004 game stuff) are of questionable value.

====September 30th, 2004====

Turns out that I actually didn't have the problem fixed that I thought I had fixed. Now, I have found the problem. It's certainately devious. As you likely know the contents of structs are stored if a variable of that struct's type is declared as a config variable. What you may or may not know is that elements of the struct declared as transient are not saved. This is obvious when you think about it, and is desired behaviour.

However, what I've rudely discovered was causing me so much grief, is that transient elements are not only not saved, but they are '''reset to zero/null/empty array''' when you save the struct using SaveConfig() or StaticSaveConfig(). This seems like a most bizarre behaviour and was likely not intended by Epic. What probrably happens is it writes out the data, then reads it back in. Reading no value for the transient members of the struct, they are set to their appropriate initialization value.

Also, the cool Homeworld-esque trail system I made seems to have been antiquated by the behaviour of TrailEmitters being changed. Although TrailEmitters are inferior to my system (you can see some visual artifacts if they are viewed from certain angles) I'm going to switch due to the increased performance of the native trailemitters.

To top that all off, I got some high-poly models up and running, which has upped the visual quality. (Screenshots are on the [/Cosmic Fury] page.) I've actually gotten a surprisingly large amount of stuff done today, though granted I only had one and a half hours of class today so I spent a lot of time on the mod. I've got almost all the bugs worked out, except for some reason the vehicle editor crashes sometimes when you try to save. Oddly enough, the longer you go between saves, the more likely it is to save when you eventually do do the save. This seems bizarre, but I have no idea what could be causing it. It's crashing in a static function, I know that much from the stack trace, but the whole vehicle &quot;catalog&quot; is static functions, so, err.. yeah. If it becomes a big enough problem I'll try instantiating the catalog and see if the stack trace gives me some more useful output then.

====October 4th, 2004====

Today I mucked around with some special effects stuff, but I don't have much to show for it. First I made bullets that looked more like carrots, but I was eventually able to improve them so they look more like tracers and stuff in flight. I also worked on my generic explosion effect which was dandy. I'm still not quite happy with the effect, but it's not bad.

I did, however, implement a proper &quot;turret cam&quot; which greatly helps when using the space station I made. The annoying thing that was going wrong with that was, any combination of pitch and yaw will result in some roll. (Assuming you don't use a fixed coordinate system.) Normally this isn't a problem. Your ship just rolls and your camera is &quot;upright&quot; before you even notice that you rolled slightly. However, since the space station has no form of mobility, and as such CAN'T roll, those little rolls start to add up and next thing you know you can barely control your crosshairs. The new turret cam puts your view squarely behind a turret of your choice, (pressing a button cycles through all available turrets and then back to the ship view) and all rotations are in the reference frame of the turret. Further, all roll control is negated in this mode, allowing you to aim more easily with turrets. This actually ended up being more complex implementation-wise than I had expected, because of course, the reference frame of a turret changes as it rotates.

'''Mosquito:''' you should consider implementing a master turret control, which you can select targets that all turrets in line of sight shoot at. It would be a pain to only use individual turrets while all the others idle.

'''Foxpaw:''' The turrets are actually already linked, and can fire in four modes - if they have their own target, they auto-aim at that target; if they have a human pilot with nothing targetted they all aim parrallel in the direction the pilot aims (either from the ship view or any turret's view); if the human pilot has targetted something the turrets aim so that their shots will converge at a distance equal to the distance from the ship to the target. (so the shots converge on the target, but you can still lead); and, if the ship is being flown by an AI pilot the turrets autoaim at the AI pilots' target.

====October 5th, 2004====

Since introducing some non-low poly models, things have been looking much better eye-candy wise. I keep taking screenshots that I want to post up but I know that I'll have better ones in a few hours anyway, so I've been holding off entirely.

I noticed that the fighters are very difficult for the AI to hit. (likewise for humans, but.. ermm.. I'm sure that's just me) This I attribute to a slight fault in the bit of code that does the lead-in calculations. Unfortunately those calculations are fairly complicated as it has to take into account movement of the ship firing, movement of the ship being fired upon, and of course the muzzle velocity of the weapon. The trick, however, seems to be that by adjusting the aim to lead the target, this subtly changes the distance before impact, which subtly increases the amount of time it will take for the projectile to impact, which subtly increases the amount of lead-in required. This seems to be pretty much a neverending cycle, which causes the AI to just barely miss most of the time. This problem is not particularly prevalent on larger targets, such as capital ships and space stations. To this end I think that I might either need to implement some sort of iterative system whereby the aim is repeatedly refined, or maybe I could just leave the lead-in calculations as they are on the premise that, as mentioned, hitting other fighters isn't that easy to do anyway.

'''MythOpus:''' Homeworld (I think) uses the repeadtedly refining method.  The AI usually misses fighters for the first two shots but then starts getting closer and closer to hitting them.  I think it works rather well, but you should inkorporate some sort of randomness.

'''Foxpaw:''' Heh, I was writing that I had finished implementing it while you were writing in support of it. ;) I actually haven't looked at how Homeworld does it, though I do have the source to Homeworld, so maybe I'll look there and see if they have a more efficient method.

----

Okay, so I implemented the iterative lead-in system, which resulted in fairly frightening accuracy on the part of the bots. This is good as I was hoping I could achieve this - if the bots have the ability to hit unerringly, then I can just factor in mistakes for them on lower skill settings. This way though, they have the code capability to be truly &quot;godlike.&quot; This took less time than I thought and uses amazingly few iterations. I was concerned about the performance implications since lead-in calculations are done fairly frequently - once per weapon on an AI controlled ship and sometimes once for the AI itself. However, it turns out that the iterative lead-in actually only goes for 2-4 cycles to get 1/1000th of a second resolution.

Also, now that everything's working pretty decently, I've been trying to arrange some larger battles betwen AI units. It's now that I've decided some optimization is needed. The framerate is still decent in a larger battle, but I can tell that at it's current performance it will not be able to handle a game world considerably larger than what I have now at acceptable framerates. So, unfortunately, I have to optimize, which is not very entertaining. That is of course, unless you like watching tons of numbers scroll by in the console and looking for ones that are abnormally high.

Fortunately, I wrote it with some optimization hooks so I can easily time to see which actors are whiling away all my precious milliseconds. The main culprits are turrets, and the master ship actor. The master ship actor is spending about 0.30 ms average in it's physics simulation, and about 0.20 ms doing AI. The other primary culprit is turrets, which consume about 0.22 ms each.

Interestingly, the physics simulation uses very little time most of the time but occasionally &quot;spikes&quot; every few frames. I've isolated this down to a few lines of code, all of which seem to spike similarly often. One of them performs a matrix multiplication, which should be somewhat time consuming, but strangely it is pretty fast for most executions - only spiking up once every few frames. Another line is simply a setlocation call. This I can't do much about except hope that perhaps some tweak in the next patch will eliminate the sporatic spiking. The third does another matrix multiplication, and a setrotation. I haven't dissected that yet to see which of the two are spiking, or if it's both.

----

Well, I couldn't figure out what was causing the spikes, so I optimized as much as I could and left it. The turrets were optimized simply by reducing their resolution a bit. (Resolution in this sense meaning the minimum amount that the turret must turn before it will go to the trouble of updating all of it's physics and such) This helped because the AI tends to have a slight &quot;jiggle&quot; which is too small to be noticeable on screen but was still stressing the turret physics more than was neccessary. I optimized the AI by implementing an &quot;awareness&quot; feature - basically, the less aware the AI, the less frequently it scans for targets, etc. The awareness of a given AI is based on it's current activities, so an AI with no orders or a simple movement order is the least aware, AIs with defensive orders like escorting another ship or holding a blockade are more aware, and AIs actively engaged in combat are the most aware.

====October 10th, 2004====

I finally implemented the last part of the physics system for the spacecraft. Previously I had most of the physics in, but applying an impulse could only give a linear velocity, and not &quot;spin&quot; you around. I changed that over the course of today. This actually proved to be trickier than it sounds, because you have to take into account both the location of the impulse relative to the center of mass of the ship, as well as the direction of the impulse. After puzzling for a while on tangents, planes, and a derivative or two, I eventually got a solution using cross products. The derivatives were eliminated by putting a simple constraint on the system, that a force could only be at maximum the approximate radius of the object around. So, for instance, a force can only be applied to an object from within that object somewhere. (or on it's outer surface) Forces with a &quot;location&quot; outside of the object are treated as if they were right on the surface of the object.

I'm somewhat surprised that companies actually get paid good money to develop physics systems, but mine only took 2-3 pages of UnrealScript and a couple of days to implement.

'''MythOpus:'''  Instead of making physics systems that Epic will no doubt steal from you anyways... get a job from Epic to work specifically on physics systems :O

'''Mychaeel:''' Physics are simple as long as you have a single, solid body which is exposed to simple forces.  It gets interesting as soon as you have that body interact with another one in a non-trivial manner (i.e. have a barrel fall on a floor, or have a body with arms and legs attached by joints collide with a barrel).  Just ''maybe'' that might be the reason real physics systems take months or years to be developed and loads of money to license.

====October 11th, 2004====

Not much today - I spent most of the day mucking around with the AI to try to get it to aim a little better. Unfortunately I didn't have much success with that, though I did confirm that my aiming routines were mostly working, for some reason there is a slight difference from the direction the bot is &quot;aiming&quot; and the direction that it's guns actually end up pointing. I'm not sure yet why that is occurring, but I'm sure I'll figure it out eventually.

I also implemented some nifty view shake which was surpringly effective. I had intended it just as a &quot;nice touch&quot; but it seems to add a lot of energy to the game and also serves as a semi-useful feedback device to let you know when you are hit, and gives a satisfying rumble when you fire weapons with a lot of recoil.

Unfortunately, the AI's movement seems to be messed up somehow. They used to fly off into space seemingly randomly when given a movement instruction, but they worked fine when fighting. Now, however, they seem to fly off when instructed to attack as well. So, I'm going to have to figure out what's causing them to fly off like that. I suspect it's something simple, but it seems like it might be difficult to diagnose.

----

All right, that took me all of 5 minutes to fix. I feel kind of silly for not noticing that I was referencing the AIs rotation and velocity, when of course the AI doesn't actually move, only it's ship moves. I must have let that slip in while I was optimizing some code or something.

====OCtober 18th, 2004====

One week later, so what have I accomplished? Well, err.. I, umm. Yeah. Not much. I think I spent most of the week thinking about girls, playing Far Cry, and I'm pretty sure I did some other stuff that I'm sure was productive or something.

However, I did have a potentially valuable insight. While I was pondering more stuff for an operating system that I may write someday. (I haven't really gotten started besides a simple &quot;Hello World!&quot; OS, as I'm not really sure where to begin.) Anyways, I was thinking about optimizing for performance (as I often do) and I was thinking about arrays. Then I started thinking about Unrealscript, and how I had a lot of arrays in my mod. It wasn't until a couple of days ago that I realized that a linked list would probrably be a lot faster than an array. The reason being, almost all of the accesses to the arrays are iterative ones inside a for loop. Every time I access the ith array element, that involves a multiplication, which takes over 30 cycles to complete, not to mention the additions and other operations necessary to find and return an array element. This as compared to a linked list, which involves an assignment, an addition, possibly another addition, and one memory access. (In theory, in practice, references are probrably more like pointers to pointers, so add in another memory access and possibly another addition.) Anyways, the point is, now I'm wondering if linked lists might be a lot faster than the arrays I'm using, since accessing arbitrary elements is rarely necessary and almost all of their use is iterative. I'll do some tests and post the results up here later.

----

Hmm, well, my first results showed linked lists to be much faster. However, it turns out that that was because there was a bug in the code. So I fixed that, and linked lists still appeared to be faster. Then I noticed another bug, so I fixed that one too. Now that the whole test seemed to be running properly, both linked lists and arrays gave comparable results - however arrays were given the benefit of going second in the simulation and so may have benefitted from some caching. Linked lists took ever-so-slightly more time to create, (~2.3% longer) but took considerably less time to destroy than dynamic arrays. (~30% faster) The times for both included the time to actually spawn or destroy an actor, however, so the differences would be more pronounced if this factor was not included. Time spent iterating through the list was inconsistent and varied considerably from run to run. 400 - 650 ms to iterate 1000 elements for dynamic arrays, and 500 - 800 ms to iterate 1000 elements in the linked list. In most of the runs the dynamic arrays were faster.

These results seem a bit illogical but probrably result from the array lookup being primarily native code while the linked list operates primarily in Unrealscript - though I'm only speculating on the actual cause.

It would be nice if UnrealScript had a mechanism to iterate a given dynamic array, without having to do a multiply on the index for every element though.

----

Wheeeee! I finally figured out what was causing the turrets to aim imperfectly. Turns out I had a == None where I should have had a != None. Thus, the turret believed that it was not equipped with any functional weapons and so used the fallback (less accurate, but much faster) aiming calculations. The AI hits almost all of the time now. It still misses occasionally, but I'm not sure what this is caused by.

Now I need to code in a system whereby lower skilled AI pilots will deliberately miss sometimes. I'm not really sure how the best way to do that is though. I can't just add a random offset to their aim, as it takes time to turn and so the offsets would end up averaging out to cause very little loss in aiming ability. (Not to mention that there might be a noticeable &quot;wobble&quot; if a ship was deliberately throwing off it's aim randomly.) Instead I think that I need some method of having the AIs aim &quot;zero in&quot; on the target over a certain amount of time, effectively interpolating between it's current aim and the aim it should have. However, the amount of interpolation will have to go down the longer it's been aiming, otherwise with even a little interpolation it's aim will always lag behind a fast-moving target.

====October 26th, 2004====

Well, I made some asteroids. I'm still having some difficulty having them look right. My plan for how the asteroids and harvesting of them will work is, you damage the asteroids which causes them to break into smaller pieces, much like in the game, Asteroids. When they're small enough, a &quot;harvester&quot; part will suck in the pebbles like some kind of space vacuum-cleaner. This seems simple enough and doesn't appear to cause any performance issues. (I was concerned that having tons of little pebbles being simulated might mean a performance hit.) 

The issue that I'm having with that is that it looks funny when an asteroid suddnly turns into 5 or so much smaller asteroids. I had planned to cover this up by having a big &quot;burst&quot; of dust come out of the spot where it &quot;cracked open,&quot; thus making an opaque cloud of dust so you couldn't see one asteroid transform into five or so smaller ones. Unfortunately, I haven't had much success making a believable dust effect. The dust effect has to appear quickly enough to hide the asteroid breaking apart, and be big enough to cover it. So far, I haven't been able to make it look natural enough when it appears, but I'll figure something out originally. Alternatively, I might make a completely different system of mining asteroids, whereby you just &quot;suck them dry&quot; but the asteroid doesn't actually disappear - it just gets &quot;depleted.&quot; I'll have to think about that over the next little while.

In other news, I finally made that mining base AI I was planning to. So far it can float defiantly, mass-producing waves of fighters. The AIs production capabilities have made for larger battles than I'd had previously, and I'm noticing more and more that space is getting littered with garbage. I'm not sure how to go about fixing that yet.

The thing is, a ship can easily be disabled without being completely wiped out. For instance, a fighter who's midsection has been sufficiently damaged could bust in twain along it's midsection, leaving a drifting cockpit with chin guns, and an uncontrolled thruster/fins/some other junk. Both parts are effectively just useless debris, so presumably I could just make them explode and maybe leave behind a single static mesh which would have less processing overhead. (So the remains can still be salvaged for resources.)

However, that poses a problem: what if a ship is redered derelict, but a player is planning on sending out something to repair it or salvage it as is? (Not just salvaging the wreckage for resources, but repairing it and making it operational again.) This could make sense as it might save build time or something. I don't really know of any specific case where it would be useful, but I'm fairly confident that there are reasons why a player might want to repair their derelict ships, or capture fragments of an enemy ship.

Another problem arises if the computer's definition of a derlict ship may differ from that of the player. For instance, a drifting cockpit with only a chin gun atttached is not particularly valuable. However, it could still be used to keep an eye on something, and it's gun might be useful if something should unwittingly stray past it. On the other hand, there has to be some point at which a ship is deemed derelict, because the buildup of half-ships from any protracted conflict soon escalates to the point where performance takes a big hit. The question of &quot;what makes a ship&quot; is also of some consequence here: For instance, some kind of gun platform may appear to be quite derelict, as it is pretty much just a cockpit and a gun. (and likely some turret mechanism) Some stationary facilities with no guns might also end up being mistakenly shuffled into the category of &quot;derelict&quot; ships, even if they are in good condition. Unfortunately health isn't really an option as a ship could be severely crippled even by a relatively small amount of damage, (if applied in the right place) and effectively be debris despite being in relatively good health.

So now what I'm thinking is that I'll have a slow decay on ships that are fragments. When part of a ship breaks off, one part becomes a &quot;fragment&quot; while the other retains recognition as the ship in question. Anyways, the fragment will lose health over time and eventually be destroyed completely. The other part, that isn't a fragment, is going to stay as-is, as it will still be targetted by enemies so hopefully will get cleaned up eventually.

====Octover 28th, 2004====

For a long while I was dreading making the master &quot;player&quot; AIs to manage fleets of AI ships, as it seemed like it would be extremely complex and I didn't really know where to begin. However, once I got going things actually went pretty smoothly. Firstly I wrote a couple of hooks for the AI, notifications when one of it's hangar has completed a ship, etcetera. Then I wrote a simple routine that just made the AI build a certain type of ship non-stop. (It queues up a new one every time it gets the &quot;ship completed&quot; notification.)

Then I had it organize the ships into an array and when the array reached 5 in length it would give all the ships an order to attack and clear the array. That was pretty simple and reasonably useful in the limited test environment. Then, I altered the setup to instead store an array of &quot;wings,&quot; each of which contained an array of ships and some information about that wings objectives. The same array storing recently built ships was used, and when 5 ships were built they were added to the &quot;wings&quot; list as a new wing of fighters. Then, I just added a timesliced function to check (every 10 ticks) all of the fighter wings and see if any is idle (target was destroyed, etc.) and also to reorganize the wing if necessary. (if members were lost, etc.)  

That worked pretty good. In fact, I was quite impressed with how well it worked, as the fighter wings all got the same attack orders at the same time so they ended up fighting in little clusters. Previously I made an edit saying that I didn't see the tactical value in formations, but I could see when they fought in clusters they were a lot more effective when they &quot;ganged up on&quot; enemies.

So, I decided to revisit the formal formation code that I had written previously. It was old and decrepit, and out of date with changes that I had made elsewhere. However, it didn't take that long to get working, and it worked surprisingly well. The most time consuming part was probrably writing and debugging the portion of code that determines each fighters placement in the formation, which sounds easy, but it was difficult to debug due to a small oversight I had made. At first the formations were kind of &quot;loose&quot; as the formation leader would take off and have a &quot;head start&quot; on his formation members. I was able to relatively easily rectify this by having the formation members request the formation leader to slow down if they are having difficulty keeping up. Though I don't really feel quite right about that (as it means that a formation doesn't move quite as quickly as individual fighters during turns, etcetera) it seems to work pretty decently.

Soon I'll add some scheme for making different types of wings, and have it build resourcers and stuff. Unfortunately, my original control scheme probrably isn't going to work out, as the number of possible instructions has grown somewhat. However, I can probrably work around that by having more submenus on the &quot;smart menu&quot; and relegating some of the things currently on the &quot;smart menu&quot; to their own key on the keyboard for lesser used instructions, like ram, kamikaze, and scuttle.

'''T1:''' Have you tried pie menus? Like in the sims? Harder to code than normal menus, but easier to use, since all the options are equally easy to reach.

'''Foxpaw:''' Hmm, I haven't played the Sims, so I don't know if that would work or not. The menus that I'm using are keyboard based menus, like the UT2004 voice menu. The mouse is needed elsewhere during play. ;)

'''T1:''' Oh yah, I forgot about the mouse being needed... In that case pie menus just look graphically different but are used the same. Neverwinter Nights also uses pie menus. That's the only other example I can think of. Hmmmm... You could make the menus user configurable/rearrangeable.

----

Hrmm. I've run into a slight problem with having swarms of fighters. Well, two problems. Both are performance issues. Although the use of formations reduced the performance hit from loads of fighters somewhat, once you get into the range of about 60 AI controlled fighters in a massive dogfight the time spent doing AI and physics calculations on the fighters start to add up, plus the polygon load starts straining the video card with that many fighters (plus the space stations launching them) onscreen.  I can optimize some by cutting back the particle effects, but many of the models I'm using now are low-poly so when they are replaced with high-poly versions, that's going to introduce more strain, resulting in no net gain. (Though if I use rigidized skeletal meshes with LOD that might help some.)

I also don't know how much more I can optimize the fighter AI. It may be that massive fleet confrontations are not something that modern hardware can really handle. (Technically I suppose Homeworld and Homeworld 2 have big battles, but they also have a '''massively''' simplified flight model and they also don't have 20,000+ poly battlestations on screen.)

So, I'm going to have to do something about that. As it stands right now, fighters are of questionable effectiveness against larger targets due to their relatively small weapons and relatively light armor. Their only redeeming quality is an ability to be disgorged en masse towards a foe. I need to either find a way to have large numbers of fighters without a serious performance hit, or find a way to make fighters more powerful without breaking obvious logical rules.

In lots of games this is worked around by having fighters have amazing power for their size. Capital ships, despite being much larger and theoretically being capable of mounting entire arrays of fighter weaponry, are often armed with weapons only a couple of times more powerful than the fighter's weapons, though said weapons take up tens or even hundreds of times as much space. How does this make sense? 

I don't really want to implent a system whereby fighters have such a rediculous advantage, plus it would not be technically feasable as players get to design their own ships, so it wouldn't take long to figure out that they could make their ships a lot more powerful if they just use clusters of fighter weaponry instead of larger weapons. So, I can't give fighters an artificial boost statistically like that.

Unfortunately, the strategic role of fighters in a real-life situation is somewhat limited. Though they definately have uses, the sort of science fiction view of fighters is highly unrealistic so I'm not really sure how I can work it in. Previously the fighters had a useful edge even in small numbers because they were small and fast, and hence very difficult to hit. However, improvements to the AI aiming routines have removed that advantage from fighters as turrets armed with trace-fire weapons or explosive projectiles (think flak) can make short work of them.

Also, it's not really feasable for me to just ignore it, as that will likely lean towards a bigger-is-better philosophy where instead of fleets it will just be individual behemoths roaming about and having 1-on-1 slugfests.

The only feasable solution I can think of is to artificially inflate the price of turrets, which would make countering fighters with fast-tracking powerful turrets inadvisable. Err.. but then people will just built huge quantities of fighters. Unless I was to artificially cap the maximum &quot;crew&quot; a player could have, and have different classes of ship (the player's designs are classified automatically based on speed, firepower, etc. so the AI can fight more effectively) require different amounts of &quot;crew&quot; to function.

Hrmm. I kind of like that idea, actually. Fleets could still grow in strength because the stats (and hence cost) of the ships could still be built up, but the QUANTITY of ships (and hence, the processor and video card load) would not go up.

The downside is then to have large &quot;empires&quot; (AI Controlled) you would need to have a bunch of AIs that would just be allied, which is questionably realistic as then you would have to orchestrate &quot;diplomacy&quot; between the AIs...

It's an idea though. Maybe having a &quot;crew cap&quot; would be good for the gameplay. Though 60 fighters is kind of a low cap. Hrrmmm.

'''Mosquito:''' let me just dig up some old crap: [[Legacy:Mosquito/Notebook|Mosquito/notebook]]

Some old idea from like 2 years ago, but why not instead of having millions of complex fighters, wouldn't it be much more... epic if it was 60 massive complex battleships? Fighters could be very simple construction and in large numbers, while afew dozen juggernaughts slug it out, I was still poundering doing something with my idea, but I'm really not doing anything with it. I just can't get much inspiration in level design for just big ships floating around in a void.

'''T1:''' You could make fighters require an &quot;owner&quot; ship and have a limited number of fighters per ship (more fighters for bigger ships).

'''Foxpaw:''' I don't see how that would help the situation - the problem isn't that fighters are too good and need to be limited for balance sake, it's that the system can't handle enough fighters to be practical. Hence, if people can't build enough fighters to stand a decent chance against larger ships, they likely won't build them at all. (which is what I want to avoid.)

'''DJPaul:''' What about creating a mesh that is a bunch of fighters?  You'd have one mesh for a group of ten fighters (flying in formation).  When something required responses from indidivudal ships, you could destroy the group ship mesh and spawn ten individual fighters.  I imagine this might also make the part of your AI code that controls ships flying in formation easier.

'''Foxpaw:''' Err, hmm. I did sort of consider that idea at distance, but even if I did do that it would still be pure fancy without having access to C++ code. Since the fighters are designed during play by the players, there would be no way for me to make a mesh containing multiple fighters, when there's no way of knowing what those fighters will even look like until the player designs them.

'''Ryan:''' I don't know how this would affect your gameplay, or even if it is possible in the Unreal engine (newbie Unreal scripter).  Could you use some sort of proxy mesh for an individual fighter which maybe suggests that it is partially cloaked, which then changes to the high poly mesh when it attacks.  You would get the feel of large numbers of fighters with quite a lot of action with them uncloaking and cloaking.  The tactical aspects might be more complex if aiming at cloaked vehicles was more difficult, a chance for the turret ai to show it's mettle.

'''DJPaul:''' Hmm.  How &quot;dumb&quot; are non-leader fighters when they are in a formation?

'''Foxpaw:''' I suppose I could use a different mesh to represent the fighters when they aren't in combat, but I'd rather not do that. I think that that might adversely affect the visuals, and maybe make the combat kind of confusing to watch.

As for how dumb the non-leading fighter are in formation, they aren't really &quot;dumb&quot; per se, more so &quot;oblivious.&quot; They do pretty much all of the same things as the leading fighter does, with the notable exception of scanning for targets. Though presumably the formation members wouldn't have to compute flight paths and stuff, they still do in order to stay in formation.

====November 2nd, 2004====

Well, I found one place that I can save a lot of polygons. I have nifty space dust floating around, which I was considering to have a negligible impact on performance. However, I noticed that the performance imapct was not so negligible. For some reason, the space dust was not getting cleaned up properly so when I called up my &quot;thing tally&quot; (which is just a debugging tool that generates a list of all classes of object in existance and how many of them there are) I found that for some reason I had 4 times the amount of dust particles as usual. This was of course a bug, which was quickly fixed.

However, it got me thinking - surely even 3000 of the dust particles couldn't have dragged down my X800 that much, could it? So I looked into it. Admittedly I'd never done the math. Surely 750 dust particles at 48 triangles each couldn't be that many polygons, could it? I busted out the calculator and my worst fears were confirmed. 36,000 polygons. That's one heavyweight particle effect. Granted, not all of those were on-screen at a time, but still, it was a lot of polygons to render and light just for the space dust effect. Now, I do want to keep the space dust effect - it's very handy to provide some reference frame for which direction you're drifting in and how fast you are drifting. Plus it's got the &quot;ooh ahh&quot; factor when you whiz close by a chunk of dirt and see it's all lit properly and even has smoothing groups on it.

Unfortunately, the polygon load is too high. So, I'm going to toy with the 4 parameters for the space dust and see what I can do with less particles. I suspect that I can achieve a similar effect with a lot less particles, as I have a hunch that most of the particles are too far away to be noticed. I can reduce the number of particles while reducing the size of the effect to keep the particle density the same. I'll play with that and see what I come up with.

I'm also considering making an &quot;abridged&quot; version of the older stuff in my developer's journal, and maybe making it into some tutorials or something. It's really big, and the wiki doesn't seem to like extremely large pages, so I've had to trim some stuff off of it. (This is probrably a timeout issue with uploading all of the text.) That stuff is still on my hard drive, but I'd like to keep it up here, though admittedly most of it is pretty ancient Gen 3 stuff.

====November 2nd, 2004====

Ahoy! It's time for me once again to squel with delight having spotted another area for improvement. I've massively improved the fine manuevering ability of the AI fighters. Gather round, ye all, to hear another long-winded tail of my train of thought and how it led me to this improved system.

Today as I was bored in class, I started scratching out a flow chart of a much more advanced docking system from what I had currently implemented. Previously fighters that wanted to dock would simply fly to within a certain proximity of the hangar they wanted to dock with, and wait. The problem with this method is they were often in the path of fighters launching, approaching the hangar at an awkward angle and running into something, or other such mayhem. The second one, I realized in class, was super easy to fix, all I had to do was have them approach at a certain fixed angle, relative to the hangar. (the direction of it's opening, of course) I'm not really sure why I didn't think of that before.

Anyways, that of course posed a new problem. If all incoming fighters were trying to come in at the same angle, obviously they would crash into each other. Easily solved, I thought, by simply having them wait in a queue like holding pattern. Of course, to prevent colliding with the fighters that might launch from the hangar, I'm then going to have to have the holding pattern be out of the way somewhat, in a direction that launching fighters are not likely to travel in. (Collision prediction is disabled presently for performance reasons, but it's suspended during launch and docking anyway to prevent craft from panicking as they close in on the hangar.)

So I have to have a queue of fighters, all maintaining a safe distance from each other and from the hangar, proceeding in an orderly fashion toward the hangar, and they can't be aligned with the hangar because that would block the launch of other fighters, so I now need some kind of controller to make sure that a fighter positions itself at the correct approach angle before launch... phew, better draw a diagram. Hence, I drew the first flow chart that I've made of my own free will. Normally I despise the things, as I'd rather hammer it out in code. However, I was stuck in class, and the professor was droning on about the influence of parenting styles on adolescent development or something, so I drew out the flow chart. The first one was sub-par, so I started with a fresh sheet and ended up using the whole sheet of paper for this flow chart, but alas, the whole process was planned out.

So, I go home, implement everything on the chart, and low and behold the fighters are positioning themselves all over the place, screaming into the hangar at full speed when it's already occupied, and other assorted mayhem. I briefly consider why I trusted a flow chart in the first place, but then set about getting the code working. A few oversights and typing mistakes later, the fighters are now lining up really sloppy, and ramming each other as they tried to settle into position. A short while later, I had it good enough that they no longer rammed each other (often) but had difficulty aligning themselves to the hangar and going in straight. Simply enough, their momentum was too great as they lined themselves up, and they didn't end up going straight into the hangar.

So I thought about this. The manuevering code had something in it to control drift (undesirable momentum) but it was commented out because I had inadvertantly coded it so that it also misinterpreted slight strafing movements as drifting. After enabling it, the fighters were flying all crazy, so while examining the function and trying to figure out why, I started to puzzle. Why did I have the cancellation of undesirable momentum and the application of desirable momentum handled separately? Surely I could just figure out what momentum I wanted based on the functionality I already had for computing acceleration/deeleration and figuring out, based on distance and acceleration/deceleration rate, the ideal speed to travel at.

It dawned on me quickly that I could make a simpler function that worked better if instead of finding an optimum ''speed'', I simply find an optimum ''momentum'', then I could compare it to my current momentum (desirable and drift) to find the change in momentum that would be required, and apply thrust based on this. I implemented that system and was very impressed. The AI pilots can now make tight manuevers much less recklessly and they are also a lot better at predicting their coasting and such when they decelerate to a halt. I haven't tried building any formations of fighters since implementing the new system, but I suspect that the fighters will fly in a much &quot;tighter&quot; formation with the new manuevering code.

So ends another trilling tale of intrigue from the dark corridors of my mind. Hrmm, actually that ended up being a lot longer than I thought. Maybe I should be a novelist. ;)

====November 9th, 2004====

It appears that I've finally wrapped up the second &quot;rotation in editor&quot; issue. The solution was deceptively simple. I was trying lots of stuff with matrices and trig to try and figure out the rotation, but that wasn't working very well. Eventually I realized that instead of trying to artificially adjust the rotation of the components attached via sockets, I could just rotate the socket itself. Since the sockets don't normally use their roll for anything, and altering the roll would cause exactly the effect I wanted, I did that. I'm not sure why I didn't think of that before, but it's probrably because back in third gen I was using vectors for that which couldn't be rolled, obviously, so I probrably had the mindset that changing the socket was not an option.

====November 10th, 2004====

I'm so excited. Not only do I have a five day weekend starting today, but I spent most of the time I was in class today scheming and plotting. It seems I've found a way to build a 2-to-1 multiplexer that's twice as fast, a 4-to-1 multiplexer thats thrice as fast, an adder that's twice as fast, and a logic unit that's almost 5 times as fast. (one fifth the transistor depth, plus one transistor) It seems that the overly modular design of modern computers has resulted in much waste. Also I noticed how you can take two of the 2 to 1 multiplexers in the function unit and turn them into a dedicated combinational circuit that would be faster and use less transistors. 

Unfortunately I have a relatively small selection of transistors at my house, and I don't want to pay the exorbitant prices at Radio Shack, so I'll have to contact my neighbor who teaches electronics at a high school and see if he has some I can borrow to see if the circuits I've designed actually work. If that doesn't pan out I'll see if the Verilog HDL has any syntax for specifying individual transistors and maybe I can do something with that. That's a last resort though, as the software I use for Verilog simulations (ModelSim) seems kind of shifty.

====November 14th, 2004====

Blech. Bugs seem to be coming out of the woodworks for no apparent reason. Code that was previously stable is now spitting out loads of accessed nones and other chicanery. One annoying bug turned out to be caused by things getting destroyed due to collisions mid-physics-simulation. Interestingly Karma suffers from the exact same bug. Some other accessed nones still remain, which I'm trying to figure out now.

In other news, I made a different fleet AI which was quite fancy. Unfortunately, it's much more processing intensive than the one I had before, and mysteriously causes GPFs. At first I put this down to using some things derived from Object to save memory, but when converted to Actor subclasses there were still GPFs. GPFs of course are the most annoying bug one could possibly have, as log statements leading up to the GPF don't get printed (they are still in the log buffer, which doesn't get flushed in the event of a GPF) and your options for debugging are fairly limited.

----

Well, that's that. I figured out why all the accessed nones were appearing now. At first it was quite strange as a new AI was causing accessed nones in the physics system, which seemed completely unrelated. Turns out that the flaws were in the physics system all along, but the new AI was smarter than the old one, and realized that blowing up ships while they are docked is easier than trying to blow up ones that shoot back. While docked, the ships are in an anomalous state where they are actually part of two ships simultaneously. (Themselves and the ship they are docked with.) When parts of them were dismembered, they were being removed from one ship, but not both.

So then, with that figured out I got back to work on the new AI. It's turning out to be a lot more complicated than I thought it would be - but seems like it should have good potential. The first system that I used built ships on a ratio basis, and periodically scanned it's squadrons to find idle ones, then found jobs for them to do. This ended up being relatively simple to implement and created a good illusion of the AI actually attempting to accomplish something.

The new system that I'm trying to implement is more or less the opposite: an objective manager determines things that it wants done, and the importance of each objective. This will probrably eventually become heirarchial, with subobjectives being determined to complete higher level objectives. Anyways, the squadron manager then has to rate the effectiveness of all of it's squadrons, and determine appropriate assignments, so the most important objectives will have the most &quot;effectiveness&quot; worth of ships dedicated to that task. Then, the construction manager looks at the assignments made by the squadron manager, and &quot;fills in the gaps&quot; by building ships appropriate to the objectives. For instance, if there was a lot of things that needed harvesting, and not many ships available for harvesting, harvesting squadrons would have priority for being built first.

The reason why this is complicated may be obvious at this point - you have an objectives manager, squadron manager, and construction manager working in concert, and objectives and squadrons have to be frequently reevaluated for changing importance or effectiveness. AI is also notoriously difficult to debug. However, I'm confident that the end result will be worth it.

====November 16th, 2004====

Hrmm. I haven't done anything with the mod in the last couple of days. I got laid off about 4 months ago. This coincided with my return to school, which was convenient. My original plan was to collect employment insurance while I was going to school, which I understood was a legitimate use of a program that I've paid out the hiney for since I started working at the tender age of 14. Apparently, however, employment insurance is all about ensuring employment for the workers at employment insurance office. (I'm aware that insure and ensure are completely different, but I like the way it sounds anyway.) Apparently, they accomplish this by explicitly advising people who have been advised of an impending layoff to wait until they have finished working, then 4 weeks after they've made an application and are under the guise that they are eligible for benefits they get a phone call notifying them that they are ineligible because they did not submit form X prior to the layoff. As a final insult, they send you a letter notifying you that any monies recieved at your termination, such as vacation pay for the portion of the year that you've worked, is not only not eligible for benefits, but actually gets directly deducted from the benefits that you aren't recieving.

So anyways, plan B was to live off of savings. As I'm frugal, I figured I should have no difficulty living for roughly a year on three thousand dollars. This budgets for car payments and car insurance, while leaving some left over for surprise expenses. Unfortunately, my grand plan did not compensate for the fact that so many games that I wanted would be released, nor had I considered that Christmas was going to happen.

So now I have to find work. At this point, you might be asking yourself, what, is this a blog now? What does this have to do with journaling development? Well, I have to do school work. On top of that, I have to find actual work. Unfortunately, this is not exactly prime time for finding work - apparently my options are babysitting, taking care of senior citizens, delivering pizza, shampooing carpets, telemarketing, or joining the army. Err.. yeah. You may have heard the term &quot;overqualified.&quot; When I was younger, I didn't see how being &quot;overqualified&quot; could possibly be a bad thing, but it makes work a lot less fun. You show up, and work for a couple of hours before the manager is dropping a log because you're already better at your job than the rest of his staff, so you get promoted a few times your first day and all of a sudden everyone resents you because you came out of nowhere are usurped the promotion they were hoping for your first day. However, because you haven't yet had a chance to become acclimatized to the immense amounts of BS present in any corporation, from your elevated perch you can clearly see that the company you're working for totally blows and working there sucks.

Now, you might be thinking: Foxpaw, you didn't even answer the question. What does this have to do with you mod? Okay, I'll cut to the chase. Most of those jobs I'm ludicrously overqualified for. So I narrowed it down to: pizza delivery, because then I'll at least get to drive my fancy car and listen to my own music, plus I won't have to deal with as much corporate BS, and I'll get tips; or, the army, because then I'll get to play with guns and make explosions. Tomorrow I have an interview at Pizza Express, which is a less popular pizza place (my conjecture being that the more obscure the pizza joint, the less likely they are to have those things that go on your window or roof, as I don't want to risk damaging my $50,000 car so Dominos can advertise. I also have an interview with a recruiter for the 26th field regiment tomorrow. Although artillery is probrably the most boring of all the combat roles, it requires the least training and it also has the shortest commute.

So, now you might be saying: Foxpaw, you just dodged the question '''again.''' Okay, okay. I would prefer the army to pizza delivery. The army is not known for short shifts or lots of free time. I also have school work to do. Plus my family has sold their house so I have to move. I also have a purebred cat that I have to find a home for, and I just realized that end of term is like two weeks away and I haven't started a term paper in adolescent psychology which I'm doing crappy in so I can't afford to bomb on the paper. This paper is based on a book that I had to pick from a reading list that was supplied. Unfortunately, now that I've read the book I've come to the realization that it doesn't have any major adolescent characters so I'm going to have to fudge the whole essay, while making it sound good enough to get a decent mark so I won't get a lousy mark in the course.

So, I've got a lot of stuff to do for school, and I have to fit moving and finding a home for my cat in there. All of this stuff has deadlines, and I have to do that stuff while still going to class and likely spending at least 5 hours a day making craters. Plus I still have to fit in going to the gym. Weekends are also going to be busy as I'm trying to con, err.. I mean, con'''vince''' my friends sister into going out with me. Hence, I have to spend all of my time on my growing &quot;to-do&quot; list, and I can't afford to spend any time on modding. So, there might not be many updates for a while. I'll probrably still pop into the wiki on a fairly regular basis, but I don't have any time to spend writing and debugging any code of my own.

The soonest I can foresee things cooling down is, like.. a month from now, when exams are over. Except.. errr.. well, crap. I just remembered that when exams end, we're moving, I have no idea where I'm going to be living for about a month, then we move into our new house, but for reasons I won't elaborate on too much I won't have Internet access until, like, the spring at least. I might be able to sneak in an update from the University, but there likely won't be any screenshots or any sort of media for a while.

I should have internet again in the spring. Hopefully the mod will be something that I can call &quot;done&quot; at that point. I've so far seemed to be suffering from some kind of compulsion: I have a vision of what the mod will be when it's &quot;done.&quot; However, once I reach that point, my vision has grown to something larger. At first it was relatively simple, to have existing gametypes playable on spacey maps with customizable space craft. Once I had that, I wanted organized, custom gametypes where other ships would be objectives and stuff (like the &quot;Carrier Assault&quot; gametype I had planned.) Once I had that, I wanted it to be like an action/rpg/strategy kind of deal. It's like I'm never satisfied. o_O

Anyways, we'll see. I just thought I should post so as to avoid postulation that the whole thing is &quot;vaporware&quot; or other such chicanery.

'''Mosquito:''' I'm nearly to grief stricken to comment! You're one of more innovative and intelligent minds in the whole of the unreal modding community! Real life sucks, but I guess you gotta set your priorities. I wouldn't recommend military though, unless you live in canada, because most other industralized nations are pretty engaged in conflict. Unlike canada, who would really like to do stuff, but just can't afford to send or return troops and equipment.

'''Foxpaw:''' I do live in Canada, but regardless, since I would be working only part time that would more or less disqualify me from service overseas. ;)

'''Mosquito:''' Join the reserves, I know afew people in it and its not too bad. Its good money. Where abouts canada anyway, I don't know why, but I though you were english.

'''Foxpaw:''' I live in Manitoba. I went to see a recruiter yesterday, who gave me a stack of paperwork as thick as the Bible and told me that once I had filled it out I can expect a call within 1-6 months. Silly me, I had assumed that since they had a sign in front of the armoury looking for part time workers that meant that they were looking to hire people sometime this century. :rolleyes:

'''T1:''' That sucks... to say the least. Good luck in getting a job you like. Hmmm... Have you thought of letting some other people to try to continue the development of the mod? But then again, I understand your dislike of working with other people.

'''MythOpus:''' Good luck with everything man!  And I live in Canada Too. YAY CANADA!

'''Graphik:''' I know what you mean about never being satisfied with a mod. Just decide on a milestone, reach it and release. ''Then'' consider going further.

I have no advice for Real Life... it's so difficult to mod. :(

'''Mr.Mitchell:''' Sorry to hear about the problems you are facing. I never dropped a note in the journal, but I loved reading it. I wish you good luck with reallife. 

====December 31st, 2004====

It turns out that fate has smiled on me, somewhat. The plans with regards to moving have changed somewhat so now I'm housesitting for the next three months, which means I have internet access. I'll also have internet access at the new house when it's built, as my parents have changed their mind about the wireless connection they were planning to get, which could not be set up until spring.

So I have internet until further notice. I don't know how much work I'll be doing on the mod though as the bedroom that I have the computer set up in is quite small and the computer is set up on the floor next to the bed which is not the most comfortable position.

I think that any modding I do in the next short while will probrably be rewriting some internal stuff. Circumstances resulting in the corruption of the test level have only recently been rectified. During the time when it was out of commission I wasn't able to work on the mod, but I did take some of the base classes and use them to make a mini-mod of a different type, the purpose being to test how abstract my abstract base classes were. This has improved my base classes somewhat, which will require minor tweaks to incorporate back into the main mod.

====January 14th, 2005====

Well, I haven't worked on the mod much at all. I'm considering rewriting some stuff but I don't want to do a complete rewrite again, so I'm a bit stuck at where to begin. I've decided that I want to separate the in-game physical representation of ship parts from their workings. This will require a lot of modifications.

The intent of this is so that I can have ships with no physical representation in the world, such as those harbored inside another ship. Right now the only kind of docking I can really do is to have a ship occupy a hangar, which is more realistic, but also somewhat problematic and much more resource intensive.

I'm also considering using objects instead of actors for a bunch of stuff but I don't know if that's a good idea or not. Objects seem to be kind of crashy even if you are careful not to leave any dangling references. However, the WeaponFire classes for UT2004 are objects, and they seem to work, so maybe I'll give it a try. I suspect that I may regret this decision, however.

On the plus side I realized that if I were to insert a few hacks I could probrably make a simple gametype using the stuff that's already implemented... so maybe I'll do that. I haven't decided yet. I've been pretty busy lately but I might have a few hours after work today, so maybe I'll see if I can hack together a gametype and maybe polish some things.

Also I had a couple of neat ideas for the HUD, particularly the radar, which I'll write more about when I have the ideas more finalized.

====January 24th, 2005====

I haven't made much progress. I've been pretty frustrated and unfortunately it looks like I might do another rewrite from scratch because I'm speculating that that might be simpler than retrofitting the existing code. Unfortunately, simply getting sufficient code updated so it will compile has been an exercise taking up several days. Seeing as it only took about 3 days to do a complete rewrite before, I might do that again.

I don't really want to though, as it means lots of work for little apparent gain. However, the changes must be made, so I think I may have to &quot;bite the bullet&quot; so to speak.

'''NickR:''' Any chance we might see some of your previous versions? Maybe the source code to those previous versions aswell? It would be cool to see exactly what you are trying to do. :D 

'''MythOpus''' His previous versions (screenshots at least) are here &gt; [[Legacy:Foxpaw/Cosmic_Fury|Foxpaw/Cosmic_Fury]]  As for his source, that's up to him.

'''Foxpaw:''' Err.. sorry, I don't have the source code to my previous versions, as per below:

====March 3rd, 2005====

It's been a while since I've updated here. I unfortunately haven't done much coding. I've been highly unmotivated to work on a new iteration of the code and I've been unable to decide between redoing it or finishing the stuff I had. Tonight I decided that maybe I'd finish what I had, but that was followed by the stark realization that that version was archived on my parent's PC. I recently formatted that PC for my parents. Although I backed up their stuff, I had forgotten that I had my own backups on there.

So, I'm stuck forging ahead with some redoing. Unfortunately, there's another fly in that ointment. Not sure if I updated this or not, but I now have two jobs. I'm working as a research assistant on a project involving spiritual interactions through machines.. or something. I haven't really payed too much attention to the theory behind it, as I'm taking the whole thing with a grain of salt. Regardless, someone got a research grant to do this, and it'll look good on my resume. My title of &quot;Research Assistant&quot; also seems to impress the ladies.

Anyways, I'm also working part time at McDonalds, which is sweet because I get food at half price, but more importantly there's tons of foxy ladies there. In light of the abundance of ladies this mod has had some difficulty competing for my attention, particularly as I've already figured out all the &quot;fun&quot; stuff. Presently the part I have to re-implement is the saving/loading code, which is rather dry programming, which hasn't helped either. I'm confident that I'll update eventually.

'''CIpen:''' Perhaps I missed it?  Perhaps I didn't look or read enough?  Was there ever any sort of release of your (Foxpaw/Cosmic_Fury) mod?  Pictures at the Cosmic_Fury link is all that I discovered.  I keep  thinking I'm missing something that everyone else has :(

'''MythOpus:''' Sadly... there was no release.  Nor was there even a beta (not to my knowledge anyway).  He kept redoing the code when he got it to work hehehe.  I say, we kidnap him and tie him up with a computer infront of him and force him to finish the mod.  Then WE can steal it and say we programmed it.  He won't be able to do anything about it because we would either have him still tied up.. or we would find some blackmail thing agaist him :D muhaha.  HAH.

'''CIpen''' Hehe, MythOpus :)  But why take so long?  Why keep redoing it?  I mean, there is a reason something might be messy.  Either you just don't have time or it is just to many lines of code.  If you write something from scratch normally you have it well organized.  That stick shift car class I did is rather a good example of what BAD coding looks like, on the other hand you prolly wouldn't think it was me that coded the sun/moon package I did (uses an emitter for the sun and moon and lets you set the hours/colors of them at different times you specify).  Well, my two cents is this: what's the use of a well oiled machine if it just sits around?

'''Foxpaw:''' I haven't had too much time to work on it lately, as I've been pretty occupied with other stuff. The intent of redoing stuff was to make it perform better and to expand the possibilities of what I could do. The first iteration was using UT, and the code kind of got messed up somehow. The second one was a very evolutionary sort of design that wasn't really planned out from the start and hence, wasn't very flexible. The next one was planned out, and worked, but had poor performance and some annoying issues with Karma that I couldn't work around very elegantly. Because of the poor performance, it was limited to about a dozen ships at a time, which was far too few for what I wanted to do. There was also things that didn't seem like they were going to work at all, such as having ships existing &quot;outside&quot; the map in other sectors and such. The next one had support for stuff in other sectors, and had persistent state loading/saving, and performed well enough to have scores of fighters flying about without a heavy performance hit. However, some things were starting to get a little hackier than I liked, and I saw room for some substantial improvements in performance (both computer wise and AI wise) that could only be realized with some changes to the code design. The rewrite shouldn't take a lot of &quot;man-hours&quot; to do, but time to work on it has been scarce as I've been occupied with other stuff.

I'm hoping this iteration will be the last as each successive iteration went much further than it's predecessor. The version before the current one had basically everything except for network code and a facility to have a &quot;hangar&quot; on a ship. (Ships could dock, but only external &quot;docking&quot; like a modern aircraft carrier was possible.) The new code has functional hangar code so that is at least settled. The rest is mostly just porting code over from the last iteration.

====June 11th, 2005====

I've been spending more time on this, so I've elected to finally make an update. Previous iterations of the code had some amount of &quot;drag&quot; on the ships so they effectively had a maximum speed. I've decided to get rid of that for more realism, to speed up physics calculations, and to improve the accuracy with which the AI can plan out manuevers.

This posed a problem of it's own. Without a max speed, I ended up going way faster than I had intended, and easily attained uncontrollable speeds. This was less than ideal and the great amount of momentum I accumulated made it very difficult to make quick manuevers to dodge fire, etcetera. I tried fixing this by reducing the power of the ship's engines, but that didn't quite work out. The ships went slower, but were not very responsive.

To solve this problem, I've implemented a &quot;combat speed&quot; setting. Basically, you have two controls for your speed, a boolean throttle control and the &quot;combat speed&quot; control. The &quot;combat speed&quot; can be adjusted to whatever speed you like, and represents the speed that you want the ship to travel. The ship applies full thrust when you have the boolean thrust control active and your speed is less than the combat speed you have chosen.

This allows you to keep the throttle control pinned all the time during battle without accelerating beyond your chosen speed. This has proven very helpful as it removes the need to attain speed, then &quot;coast&quot; at that speed until you need to change direction, at which point you must engage the thrusters again, etcetera. A ship that accelerates more quickly, of course, can have a higher combat speed while maintaining the same agility as a craft with slower acceleration, or keep the same combat speed and enjoy more responsive changes in direction. With the combat speed set to about what you can accelerate to in 2-3 seconds, you have good speed with good manueverability, or if the combat speed is at the speed you can attain after about a second of acceleration you can adjust direction quickly enough to evade incoming fire.

The other major thing is a new implementation idea for fighters. Previously, I was planning to have fighters be the same as any other ship, but they would be carried in carriers and spill out on demand to wreak havoc. While experimenting with carrier code, I had carriers that auto-generated fighters within their hangars. I had intended this only for testing, but it turned out to be really cool to watch. When I went to carriers that only carried existing ships, the battles were much less exciting as one fighter group would eliminate the other after a short time, and then the fighter-less carrier would be ganged up on by the fighters until it was destroyed. This turned out to be much less fun to watch than a carrier constantly pumping out fighters and being taken out through attrition against another carrier.

So, my plan is to have fighter carrying carriers as before, but to also have &quot;drone carriers&quot; that construct and launch flimsy drone fighters during battle. This is similar to using regular fighters in terms of combat effectiveness, but is far more entertaining. Drones have the advantage of requiring less micromanagement and requiring no resources, other than energy, to construct. Full size fighters retain the advantage of being many times as durable, having more powerful weaponry, and being able to use equipment such as warp drives and cloaking devices.

'''MythOpus:''' Foxpaw, you always seem to amaze me.  I do need a bit of clarification on something though.  Is this an RTS, a first person space ship shooter, or a combination of both?  Who commands the heavy ships in the fleet (i.e. the carriers etc...)?  I can't wait to see what this looks like.  I want to warp into an area full of big ship, with a few backup fighters on my 6ix, and activate our cloaking devices and lay mines across the hulls of all the big ships and blow them all to hell :D

'''Foxpaw:''' It's kind of a mix.. Have you ever played the game Battlezone, or the distantly-related sequel, Battlezone II? Battlezone was an RTS played from first person - kind of like Tribes but you can build buildings and harvest resources and stuff too. Of course, you can also go into combat in any of your vehicles too.

This mod is kind of like that. It's sort of like Battlezone, but in space. So, you can fly any of your ships in first person view with a joystick or mouse or whatever peripheral you prefer. Any ships that you aren't directly controlled by a human are AI controlled and can be given various wingman-like orders: attack my target, escort my target, etcetera.

Multiplayer I expect to be a fairly free-form space sim with economic and combat elements. Single-player will probrably be a little more focused toward combat, but I haven't worked out the details of what sort of story that will have.

====June 12th, 2005====

Today I had to use Calculus to figure out a formula. Interestingly, I had to use Calculus II, which I've only just completed. Perhaps if I had not procrastinated so much I might have ended up frustrated at this problem. The issue at hand was having the AI decide what ships are best against what other ships. The formula for this was straightforward: it takes the attacker's tracking ability and divides it by the targets agility, then takes that and divides it by the estimated time it would take for the attacker to destroy the defender assuming the use of all weapon systems. Travel time to the defender is also added to the &quot;time to kill,&quot; and the &quot;time to kill&quot; is limited to a tenth of a second to prevent needless overkill.

That part was pretty straightforward, but what wasn't so simple was determining the tracking speed. Tracking speed for turrets was simple enough - they have a max rotation speed already. Factoring the ship's own ability to turn was much trickier. Ships don't really have a fixed rotation rate but rather a certain rotational acceleration. So, I had to compute an average turn rate given the rotational acceleration. The average turn rate depends on the acceleration and the amount of time spent accelerating, and the amount of time spent accelerating depends on the distance being rotated and... the average turn rate.

Fortunately I remembered that a derivative essentially represents a rate of change - so the turn rate is essentially the rate of change of the ship's rotation, and the acceleration is the derivative of the turn rate. So all this involved was a couple of quick integrations, then a pile of algebra, and I eventually ended up with the average turn rate, assuming a 32768 URU turn, being:
 (32768 / sqrt((2*32768)/RotationalAcceleration))/2

In-game testing suggests that this is accurate, as 32768 divided by the number given by that formula seems to be the number of seconds spent on a 180 degree turn.

'''MythOpus:''' That was so over my head it's not even funny = |  That's okay though.  I wish coding could be a lot simpler where math came into the picture.  I wish you could just explain what you need done, like you did before... this and this ned to be taken to the twelth power but only if it is above this number and if it's this number than make it destroy that other ship.  Ugh.  Even that made my head hurt :(

====June 13th, 2005====

Well, I've been fairly active on this, so with any luck mod production will be back in full swing again. I've hit a minor setback today that I'm not sure what to do about.

Using objects instead of actors and various clever optimizations, I've been able to increase the number of ships that can be flying around doing stuff simultaneously. Increased significantly, in fact, so literally hundreds of ships can be in play at a time. I haven't stress tested to see how high it can go before the framerate starts to drop.

However, I've hit a minor snag: the physics, etcetera seems to be able to handle tons of ships everywhere without a hitch, but the &quot;fleet command&quot; AI hasn't been so friendly. The fleet command AI operates using a list of objectives, and a list of squads. Each target that needs to be waxed has a &quot;destroy&quot; objective associated with it, each harvestable resource a &quot;harvest&quot; objective, etcetera. Periodically, the AI generates a table of the effectiveness of each squad with regards to each objective. It then uses this table to pick the best squads for the given job, and how many forces are needed to win a given battle, etcetera. All in all it gives quite intelligent behaviour. Different fleet behaviours can be elicited by modifying the relative importance of different objectives, which is factored into the effectiveness table.

The problem with that is that it grows exponentially. So, for instance, 10 friendly squads versus 10 hostiles creates a table with 100 cells. 30 friendlies versus 30 hostiles, however, creates 900 cells. The number of entries in the table quickly escalates as the number of ships and the number of targets goes up. As a temporary fix, I have limited the frequency of squad redistribution to a function of the number of squads and objectives. So, basically, as the table grows, the time between updates grows at the same rate, causing the processing time used by the AI to be fixed regardless of fleet size or target numbers.

However, I can see how that might become a problem, if the frequency of updates gets too long, the fleet will have sluggish responses which will prevent fighters and drones from fighting effectively. It would also make AIs somewhat susceptible to swarming by drones, as a large number of targets could make the frequency of updates too slow for efficient targetting.

Since the vast majority of squads that the AI controls are drones, I have considered having drones and turrets use a separate, more crude targetting method. that will remove a lot of the squads from an AI player, but unfortunately does nothing to reduce the number of targets. It also has the disadvantage of having drones fight less intelligently, which is definately less than ideal.

I could also reduce the problem by reducing the number of drones and increasing their power. I'll toy with the drone maximums and see what kind of results I can get. I'm a bit concerned that having too few drones will remove the fireworks show that occurs between battling carriers. I'll try it out and see how it goes, however.

====June 14th, 2005====

I've reached a sort of temporary solution by implementing a &quot;performance throttle.&quot; This is an idea I had used before for graphical elements to scale back particle effects when the framerate starts to dip. Basically, the higher the framerate, the more frequently the AI updates. If the load on the scripts gets too high, the AI will update less frequently to compensate, which is handy.

The only slight snag with that is that the AI, if it has enough ships and objectives, can still cause a noticeable &quot;jerk&quot; on the frame that it does update on. I'll have to see what optimizations I can make to speed this up.

====June 15th, 2005====

Today I was playing around with MeshSpawning on Emitters. I had the clever idea of using MeshSpawning on arbitrary meshes, then extracting the locations of the spawned particles, to in effect extract vertex information from the model. I got some good results with this, but not as good as I had hoped. I had envisioned collecting vertex information, and sorting by distance from the point of impact of some weapon, to have a shield effect whereby the shield &quot;haze&quot; would spread across the hull of the ship from the point of impact outward. 

Unfortunately, I needed to collect and sort about a thousand vertices to make the effect move smoothly over the hulls, and the amount of processing involved in collecting those vertices and sorting them caused a &quot;hiccup&quot; every time it was performed. I may still make use of this for effects requiring less smoothness, like perhaps lighting arcing over the hull away from the point of impact of some EMP weapon or something like that. That would require a lot less vertices to make a nice effect.

'''MythOpus:''' I think a shield effect that would require less amount of processing power is the shield system found in good old Homeworld: Catyclysm.  The sentinels shields are simple, and not very flashy, but if you were able to modify it but keep the basic principle, you might not have to go through all this vertices sorting and what not.  You could flash up the shield effect and make it appear only after the ship was hit or something.

'''Foxpaw:''' It's been a while since I've played that. I don't remember what that effect looks like, so.. I don't really have much to say about that, but I thought I'd respond so you didn't think I was ignoring your comment.

====June 16th, 2005====

Well, I optimized the vertex collection and sorting a whole bunch, to the point where it might be feasable for some use, so long as it's not used heavily. Once I had a shield effect working like I had envisioned it, I decided that I didn't want it. It was rather slick and high-tech looking, which made it look quite out of place amidst the backdrop of fire, smoke and dust provided by exploding drones, missiles, and cannon fire.

I also made some optimization to the fleet AI.. unfortunately it's only about 12% faster, but on the plus side the optimized code actually ended up with less lines of code and fewer variables required, so the code is a bit cleaner from that.

====June 18th, 2005====

I put together a cruiser to test out some stuff yesterday. Other than that I was making minor tweaks. I have noticed something interesting with the capital ships, however. All ships have access to automation on various components. AI players use all of the automation options, and then provide a little additional guidance. I've found that this is the most effective way to fight for humans too.

Since the majority of weapon systems on a capital ship are turret mounted, or guided missiles, the tracking computer and targetting computer end up doing most of the fighting for you. Of course, you can do these things manually, but it doesn't make a lot of sense. The tracking computer can track more precisely and with faster response time, and the targetting computer can consider many more targets in a given time span than a human could, and make very good decisions about whom to attack and with what weapons. In effect, the automatic tracking and automatic targetting greatly exceeds the capabilities of any human.

I'm not sure what to think of this. The fighter combat is highly technical - aiming and manuevering which relies on one's hand-eye coordination and quick thinking. The capital ship combat stands in sharp contrast to this. The capital ship combat is far removed from one's technique. Since your turrets can target, track, and fire on their own, and given the ponderous pace of capital ships, the combat ends up being much more strategic and based on planning and shrewd strategic decisions rather than split-second decisions and precise handling of the controls.

I've found this to be an interesting way to fight in a space sim. You can turn to bring the target into the range of motion of as many turrets as possible, or turn to present a less damaged side of the ship to the enemy at a cost of preventing some of your turrets from hitting the enemy. You can close with the enemy to bring more weaponry into range, or try to keep the enemy at range to minimize the number of weapons they can bring to bear on you. You can target a specific enemy, forcing more turrets to fire on that target - allowing you to concentrate your fire at some cost of efficiency. (Your turrets will automatically target the ship that they can eliminate the most quickly without overkill, so anything that you manually target is a &quot;worse&quot; target than the ones your turrets are already attacking.) Other ships can also be given orders to attack or protect certain targets. (Though again, they generally fight more efficiently by themselves, but there are cases where their judgement may not be the best.) The role of the human player in a capital ship, then, is more like a general or an admiral rather than the bridge commander of a ship.

====June 19th, 2005====

I made a major optimization to the fleet AI today. Originally, the different combat arrangements were sorted using [[Legacy:QuickSort|QuickSort]] and then the best one was taken off the top. The list was then stripped of all assignments that required the use of that squad, the tactical value of targets that the assigned squads were attacking was reduced (as they are already being dealth with, so the rest of the fleet can engage elsewhere) and the assignments involving that target were then reinserted appropriately into the list. This process was then repeated so that the lesser squads could get assignments without affecting the movements of the most major squads. I later optimized this as I found that [[Legacy:QuickSort|QuickSort]]ing the entire list again was faster than reinserting the modified members. This is the 12% speed increase noted above.

Today, I tried something different. I was trying to get more speed by trimming the list - not including assignments that would not get picked anyway, to make less work for the sort. Then I thought, maybe I can get away without doing the sort at all. To this end, I tried using a linear search to find the best tactical arrangements instead of sorting them. This seems to be far faster than sorting the list and going in order. I suppose sometimes the cost of being disorganized is not high enough to justify cleaning up. Unfortunately I don't think many spouses would go for that explanation. :)

I also did some relatively boring bug-hunting. Oddly, I had a division-by-zero that was crashing the engine. I found this quite peculiar as I understood that the engine gracefully handled division by zero by returning the maximum integer or maximum floating point value. (as the case may be) This one took a long time to figure out since the engine was crashing, leaving me without the benefit of logs to find the problem.

Now, with the bugs cleared out, all the stuff for combat is basically hammered out and some of it has been minorly polished. There's things I still plan to implement, but the stuff required to have a scrap is in place and working.

Hence, I have elected to focus on the economic side of the game - gathering of resources, construction of ships, pillaging helpless convoys, the usual. I'll probrably set up a testbed area for this tomorrow.

====June 20th, 2005====

So freighting stuff around, docking, undocking, and fleet AI coordination of such is all working. Economic stuff turned out to be way less action-packed than fighting. Then I thought it would be neat if there was pirate ships to harass the stations. Then I thought it would be better if the pirates had a fleet of ships. To counter this, I gave the trading group a fleet of ships too. At this point the economics stuff kind of went out the window and I was focusing on combat again.

I expect that I will do more economy-based stuff later. I still have to make mining stuff and something to deal with ship construction. However, I've become slightly sidetracked with the combat stuff.

Combat wise, I've made the missiles follow a drunken path, which seems like a good idea, as a missile following a drunken path would be basically impossible to intercept with another missile. It also looks much cooler. When a ship launches multiple missiles, it looks kind of like the &quot;swirl&quot; thing on the UT2004 rocket launcher, but much sweeter. The drunken missile code was fairly simple, basically I take the sine of the distance to the target multiplied by a random constant. This constant is determined at fire time. The sine is then applied to one vector perpindicular to the missile. Another sine with a different constant is applied to a vector perpindicular to the velocity and the first vector. So the path isn't truly random, but it is still much more complex. I'm considering having the constants change in flight randomly which would give a truly drunken path.

Presently the fleet AI functions at roughly the level of an English Admiral, circa 1600 AD. At this point, ships are moving to combat individual targets based on an assessment of target capabilities and their own capabilities. Their strategic sense is excellent in this sense, but it causes the ships to get somewhat &quot;mixed up&quot; as they close on each other. Shortly after the 1600s Robert Blake developed the &quot;line of battle&quot; tactic, whereby powerful, tough ships would line up to broadside an enemy fleet. Positioned end-to-end, friendly fire was eliminated, which was a problem with the previous tactic of squaring off with individual targets.

My ships don't have a problem with friendly fire. This is because they are fairly good shots and the three dimensional nature of space combat means that the lines of fire rarely cross a friendly ship, even when the target is surrounded. For this reason I'm not sure that I want to implement &quot;line of battle&quot; tactics. Artificially restricting the movement of the ships might make them less effective. On the other hand, it would make for a gap between the battling sides, which might be more visually pleasing, and it would also prevent the occasional case where two ships, battling back and forth, end up manuevering quite far away from the main conflict.

A third possibility is the tactics popular today, the so called &quot;battle group&quot; tactic. The &quot;line of battle&quot; fell out of popularity near the end of world war II as a bunch of battleships end-to-end in a straight line were an amazing target for bombers. (SAM systems did not exist at this point) The &quot;battle group&quot; tactics basically has one large ship supported by other ships. So, an aircraft carrier, for instance, would move about, and a number of cruisers, destroyers, frigates, and submarines would follow in formation, providing anti-air, anti-submarine, and anti-torpedo support. The main disadvantage of this tactic is that a lot of your firepower is wasted as the destroyers, etc. are not in range of the enemy battle group, so they spend a lot of their time screwing around.

In other news, there MIGHT be a video coming soon. The combat is looking fancy, but screenshots seem to turn out a bit stale looking so I'd like to produce something in motion. However, a video takes a lot more time to prepare, what with video editing and such involved. I've included some screenshots in this journal entry even though they don't really do the mod justice in my opinion.

[[Image:Legacy_FoxpawsDrunkenMissiles.png|left|(a)]]

[[Image:Legacy_FoxpawsCloseInFrigates.png|right|(b)]]

[[Image:Legacy_FoxpawsFrigateFormation.png|left|(c)]]

[[Image:Legacy_Foxpaws2on3.png|right|(d)]]

----

(a) These missiles are drunker than a teenager at a grad party.

(b) Naval Combat, circa 1600 AD.

(c) &quot;Line of Battle,&quot; circa 1700 AD.

(d) Sucks to be that guy.

----

'''Bonehed316:''' This sounds really cool.  The pictures dont look as cool as the idea sounds, but I'm sure it looks much better in person.  For your missiles, I have an algorithm that sends missiles to a &quot;midpoint&quot; location, which is located somewhere between the weapon (or whatever is firing the missile) and the target, then offsets it so that the missiles all spread outward, once they reach that point, or travel in that direction for a specific amount of time (determined by the distance between the two objects), they then switch &quot;target location&quot; to the actual target's location.  The result is a more interesting flight pattern, and is very useful for multiple missiles fired at once.  The only problem I forsee with a drunken pattern is it might increase the possibility of missing your target.

'''Foxpaw:''' Ah, the missiles don't fly a random pattern, as it appears they do. Since their offset is a function of the sine of the distance to the target, when they reach the targets location the distance is zero, so the sine of the distance is zero, hence the offset is zero. For that reason, the &quot;drunken&quot; flight pattern is actually just as precise as a straight flying missile.

====June 26th, 2005====

Today I implemented some mining stuff. Mining lasers, asteroids, and a technical means of storing these as cargo without using tons of resources were implemented. I plan to implement a few other means of mining, specifically I want to have mining drones, and mining bases that you could deploy onto asteroids.

To coordinate this I had to expand the AI somewhat to have an economic controller. Previously I already had a means to coordinate freighters' pickups and dropoffs. The economic controller generates the &quot;work orders&quot; for the freighter management. It also generates &quot;work orders&quot; for resourcing vessels, and decides when they should drop off the stuff they've mined and to where.

So presently the testbed area contains a cluster of asteroids, a mining station, mining ships, freighters, and a space city. The miners mine from the asteroids, drop that off at the mining station, then the freighters load up at the mining station and carry haul the minerals or whatever to the space city, which is some distance away.

Speaking of some distance away, that blasted 60,000 UU render distance is giving me trouble again. I scaled everything down to get rid of that the first time, which worked good at the time, but as things have gotten bigger, it's creeped up on me again. The space city and the mining station cease to be rendered before they shrink away to nothingness, causing undue ugliness when they pop into view. I could rectify this by scaling everything down again, but I don't really like that idea, as it means I would have to scale down all the special effects and sound and light radii, which would take a while to get nicely balanced again. I may have to reinstate the &quot;imposter&quot; system used in the third generation to deal with this thorn in my side.

'''Mosquito:''' why not just use distance fog that makes the large city fade away into the backround before it could ever stop rendering?

'''Foxpaw:''' I have been using the distance fog but the two problems with that is firstly that it fades to a fixed color, and the backdrop behind it is not one constant color, so you can see a &quot;silhouette.&quot; The other problem is that at the distance where it stops rendering (the point at which it is completely fogged) is still close enough to the player that it's sort of unrealistic to have it disappear from the screen.

'''Mosquito:''' What about fading it Alpha wise?

'''O-GL''' Very interesting reading all your recent updates Foxpaw.  I guess the imposter system would be best for this problem.  Hopefully the imposter system doesn't use too much processing power.  Alot of games with such large view distances have things popping into view or have them popping in with a silhouette.  Of course, it isn't optimal for the game experience to have any 'popping' at all &amp;ndash; but as long as the player can play the game with the opportunity to interact with all targets, that is all that matters.  

I haven't updated my wiki page for a few years, but your efforts here are really motivational for me.  One question: what changed in your life so that you could work so much on your mod?

'''Bonehed316:''' In homeworld, for example, they explained the &quot;popping&quot; with sensor distances.  When a ship wasnt in any of your fleet's sensors, it wouldnt get drawn.  This isnt so easy for you, but it IS possible.  You simply need a &quot;sensor&quot; object, and use its collision cylinder to detect when pawns (or whatever you use) touch it, but is not a projectile target so things wont shoot it.  Any actor will of course trigger the Touch/UnTouch events for the sensor object, which can then unhide other actors, or whatever so they are drawn.  But that may not be what you have in mind, but it is one solution.

OR you can borrow an idea from [[Legacy:Tamearia_Player_Opacity|Angel_Mapper]] and rig the materials on the ships that come into view with a material and adjust the transparency.

'''Foxpaw:''' I have considered the &quot;sensors&quot; thing but I'm not sure if I like that idea or not. The major issue that I see with it is that one would expect your sensors would have a farther reach than your visual range.

I've been working on the mod much more lately, though I'm not entirely sure what has given me more time. I think I might just be procrastinating less.

'''O-GL:''' Do you have a part-time job?  What job did you end up getting and how much time does it take up?

'''Foxpaw:''' I'm working as a research assistant at the University and at McDonalds part time. McDonalds is about 20 hours a week, at the University, it's supposedly full time but in reality there is a fair bit of downtime when meetings have to be scheduled around other people and stuff.

'''Switch`:''' The far clipping plane is at 65536uu, you can change it by editing Core.dll, in 3355 it's a float at offset 0xAD96C.

====July 6th, 2005====

I mostly only have technical stuff to report. I've been making various improvements all around, until today when I did some meatier stuff. I noticed there was some slowdown that was occurring when I tried a pirate spawning test.

In this test, pirate ships randomly spawn around the area where mining or freighting operations are taking place. This is in place of a proper pirate faction with it's own AI and other such goodies, which will be in place eventually. Although the ships spawned more quickly than I had intended, this does not appear to be the cause of the slowdown as the number of ships spawning was not great.

To track down the problem, I started profiling code. This was rather easy as I had previously made my own code to tick my ships and parts and stuff. I hadn't written about this earlier, but it's quite nifty. I can control the order in which things are ticked, making the AI more accurate. First, ships move, then AIs adjust their movement controls and aim. Then, turrets get ticked, allowing them to move to the new directions desired by the AI. Finally, weapons get ticked. (There is other stuff in between too.) This order allows turrets to hit targets at their new position instead of sometimes being a tick away. (Depending on the order in which they are spawned.)

Isolating the ticks like this also allows for some super nifty stuff, like having ships get more or less delta in a given cycle to have time dilation or stasis effects without any hacks. Another very useful possibility is that it will allow me to tick ships that are very far away from the player or in other systems less frequently (with a higher delta) to reduce computer resources dedicated to them.

As a side effect it also makes it easier to find where optimizations can be made. First I discovered an oversight in the turret code that was making it use far more resources than were necessary. With a few changes I cut their running time to a tenth of what it was before. The other big user of tick time was the ships themselves - most specifically their physics.

While optimizing the ships physics things didn't go so well. I accidentally introduced a bad bug that I had a very hard time tracking down because I introduced that bug in a very commonly used part of my math library, so it was producing odd behaviours and using WinDiff between current versions and backups of the files that I ''thought'' were the relevant classes revealed no changes. I also found something else problematic.

When looking over the physics code I found a place where there was a possibility of parts maintaining some physics related references to parts on a different ship, if those parts had been on the same ship but had been separated by damage. I hadn't caught on to this because the design of the ships I've made is prone to having all the small bits stripped off before any major structural components are destroyed.

This turned out to be somewhat difficult to solve. To do this cleanly I was going to have to break apart the entire ship, maintaining all heirarchial information, and then reassemble it. The reassembly would correct all physics references. To maintain the heirarchy, I tried using a struct. This struct contained a reference to one part, and a dynamic array of more such structs. It was, essentially, a tree structure.

Unrealscript didn't like this. I don't know if it was the tree-ing of structs that it didn't like, or simply the referencing of Objects from within said tree. I'm inclined to think the latter, given Unrealscript's general attitude toward Objects. I was getting wierd behaviour like a GPF if I tried to assign anything to any element of the dynamic array, ''except the first element''. I ended up solving this using Objects instead of structs. I was a bit apprehensive about using Objects for this as I suspected that they would be more prone to crashing than structs. It appears my concern was unwarranted in this case.

With all that I never did get around to figuring out the source of the slowdown with the pirate spawning. I'll probrably get to that soon.

====July 27th, 2005====

I haven't written an update in a while, but I have been doing stuff. Mostly technical improvements, so there hasn't been much to say. I don't have much to say about that since a large problem has come up.

Tragedy has struck. Though I may never know how a piece of software operating in protected mode can cause permanent damage to hardware, it seems possible. While extracting some files from an archive using WinRAR, the computer froze up and the hard drive was making a funny noise. So I rebooted without incident and breathed a sigh of relief as no data seemed to be damaged. (My backups had somewhat recently been erased as the computer they were on was reformatted.) Assuming this was some wierd fluke, (I had another idea about what might have gone wrong, but I won't go into the boring details) I tried extracting the archive again, with the same results. A lockup, accompanied by a wierd noise from the harddrive.

So I tried rebooting again. Wierd noise from the harddrive on startup this time, and the disk isn't autodetected by the BIOS. My harddrive has a jumper setting which stops the platter from spinning, and the drive autodetects in this setting, but for obvious reasons it does not function. The wierd sound that the hard drive is making sounds like one of the heads is continuously sliding back and forth between the extents of it's travel. The drive makes this sound even with the IDE cable disconnected, so it appears there is damage to the harddrive and not to the BIOS.

Tomorrow I plan to look into my options. ''If'' the head can be repaired without destroying the data, I may be able to recover the data. However, if the head has contacted the spinning platter (which seems plausable given it's obvious hardware malfunction) all the data will be lost. If that is not the case I ''may'' be able to transplant the platter into an identical drive and get at the data that way. Though I believe I have the tools and the know-how to prevent dust from getting into the drive and possibly to perform a successful transplant, it will require endangering a brand new hard drive, so I'm not too keen on that idea. On the other hand, losing all the data would be the pits, as I had an important database, and of course the mod and the operating system that I had more or less completed on the drive.

So I'm going to look into my options tomorrow and play it by ear for now. Since this coincides very badly with the loss of the backups, it might mean a start from scratch if all the data has been lost. That would be very unpleasant since this iteration of the code is the first for which I did not see any way in which I could improve upon it if I did it again.

We'll see how things unfold from here.

'''Graphik:''' Online file storage = good.

====July 30th, 2005====

It appears that I have little recourse with the failed harddrive, so all my data is lost. This is quite unfortunate.

As far as the mod goes, I could remake everything from scratch, creating yet another iteration, but I'm not sure that I want to do that. I don't see any way that I could improve upon the previous iteration, so redoing everything would be kind of boring. On the other hand, I've worked on this a long time and it would be a shame if I end up with nothing to show for it. I also don't want to disappoint those people who may have been eagerly awaiting a release. I also quite like the idea but I doubt it's mainstream enough that a commercial game studio would ever tackle it, so if I ever hope to play such a game I may have to make it myself.

I might try doing a completely different style of mod instead. I'm not really sure at this point. For now my plan is to play some games, and see if I get any ideas or if perhaps an unmodable game with no sequel on the horizon cries out for more. (like Manhunt)

'''T1:''' You know, the only thing I've been wanting to play more than this mod is coding for Unreal Engine 3 (not the actual games...) and TES4: Oblivion.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foxpaw/The Nature Of The Universe</title>
    <id>1257</id>
    <revision>
      <id>3238</id>
      <timestamp>2006-03-16T13:01:50Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====This is part rant, part scientific paper. Of course it's not actually paper, but it's still called paper for traditions sake.====

==Foreward==

My job leaves me with a lot of time to think. Some people ask if I lie awake at night thinking about these things. Said people have no respect for legitimate scientific theory. Having said that, scientific theories are primarily what I ponder on while spraying scalding hot water at assorted bits of machinery.

Where I live, (in Canada) there used to be these things called &quot;residential schools.&quot; Their aim was to assimilate the Native Americans by removing them from their society at a young age so they would only absorb the European culture. They were forbidden from learning about their native culture or from speaking their native language. These have, of course, been abolished for some time now. However, when I think about it, in a way, they still exist: they're called public schools.

I went to a public school when I was young, and I accepted the things they told me about the world, politics, etcetera. Now that I'm older I'm appalled at what they teach: they, in fact, teach unproven theory as if it were rigid fact! For a long time I believed the theories they supported - evolution, big bang theory, even the scourge of scientific theories, &quot;common sense.&quot; Fortunately, I have since considered these and realize that they are in fact mere theories.

==The Universe, Abridged==

Here's a brief timeline of theories on what created the universe:

'''65000 BC:''' How did the Universe come to be? &quot;It just did. Don't question it.&quot;

'''3000 BC:''' How was the Universe created? &quot;Assorted gods made it. Don't question them, they are far wiser than you.&quot;

'''1000 AD:''' How was the Universe created? &quot;God made it. Don't question him, he is far wiser than you.&quot;

'''2000 AD:''' How was the Universe created? &quot;Matter became so condensed that it exploded. Voila. Universe.&quot; What matter? There wasn't even a Universe yet! &quot;Don't question it. The people who discovered that have far more schooling than you.&quot;

Surely you can sense the pattern. All of these theories have the same amount of grounding. In fact, the big bang theory is the least logical of them all because it relies on matter existing within a Universe that did not even exist yet. At least the middle two relied on omnipotent beings, who, being omnipotent, could theoretically exist without requiring any Universe to contain them.

Here's my theory: It's actually very similar to creationism, only instead of an omnipotent being in the sky, it's something beyond human understanding, likely something existing in at least 4 dimensions. I call this theory: '''I don't know, and frankly I don't want to know.''' I firmly believe that the creation of the Universe is far beyond the cognitive capabilities of a human being. Consider the surface of a piece of paper. A flat, two dimensional space. On it lives a stick figure, who is alive. Try to explain to a two dimensional being who cannot leave or see outside it's two dimensional piece of paper the process by which that page was created. Some say that nothing is impossible, but I dare say that no stick figure, however intelligent, could comprehend the three dimensional processes that brought about the paper on which it exists. Similarly, I don't believe that any three dimensional being can possibly understand the extradimensional processes that brought about the Universe it lives in.

==Discussion==

I hope that anyone who reads the above will give it some serious thought before tearing down the above as preposterous. I recognize that it is difficult for three dimensional creatures such as ourselves to visualize what existance is to a two dimensional or extradimensional being. This section is, of course, open to legitimate scientific debate - if there exists any theory that has more backing, or if new evidence has been discovered to support the lofty big bang theory, (IE an explanation as to how matter existed within something that did not exist) I'd certainately be interested to hear it below:

'''Mychaeel:''' The people saying &quot;Don't question this-or-that, the people who created this theory had more schooling that you&quot; are (presumably) right.  It is ''very'' hard to argue anything you have not thoroughly understood.  You can try, no doubt, but you're almost bound to come to false conclusions in regard to the plausibility and consistency of a theory if you haven't thoroughly studied it (way beyond descriptions in popular scientific books).

That said, I don't claim thorough knowledge of those theories myself; certainly not enough to competently discuss them.  It's probably sufficient for idle talk like this though. &amp;ndash;

Physics with more than three dimensions?  Give physicists more credit.  The superstring theory deals with no less than ''nine'' spatial dimensions.  Visually imagining such a space is a non-issue; it's all down to (heavy) maths.

Big Bang theory?  It is widely accepted because it is consistent with observations made to date (which is the ultimate requirement for any scientific theory).  It's also well-known that it leaves some tough questions unanswered such as what happened ''prior'' to it, leaving open the definition of &quot;prior&quot; given that ''time'' came into being along with space at the Big Bang.  But it'll do, for now.

'''Foxpaw:''' I'd certainately agree that the Big Bang theory is supported by much of the evidence that has been observed so far, though I still maintain that it is unproven and should not be preached as if it were absolute fact. My target in this rant was not the big bang theory in particular - just that it is treated as if it were absolute fact. I also recognize that extradimensional physics have been pondered on somewhat, though superstring theory is incredibly vague and no attempt is made to understand the nature or construction of the superstrings - somewhat like creationism but with a seemingly indefinite number of entities working as a network.

'''Mychaeel:''' By principle, no scientifical theory (except for mathematical theory) can ever possibly be ''proven'' &amp;ndash; it can only be ''disproven'' if it turns out that new observations are inconsistent with accepted theory. &amp;ndash; If anybody ever told you that a certain theory was proven fact, consider that a simplification for the sake of explanation.  Obviously no theory ever ''can'' be proven fact.

'''Foxpaw:''' Exactly - that's why I'm opposed to the acceptance of theories as if they were proven fact.

'''El Muerte TDS:''' that's also an interesting thing. How can you ever prove anything, it's all based on your perception of life, the universe, everything. But what is our reality, it's our perception of life, the universe, everything. So why would you want to prove anything outside our reality, if you prove something that's correct in our current perception of the reality isn't that just prove enough to accept. If we would expand our reality we could challange the established theories, like man did over the years. The discovery of the new continents expanded our reality, which resulted in a change of the world. But it becomes much harder to expand the reality , it's no longer something we can see or touch. Or it's a matter of time you don't have (e.g. more than a life time). So then it comes down to theories. And for understanding theories you need to have basic knowledge about the subject. And you can't just challange a theory if you don't have enough knowledge about the subject. It's just like a race between a rocket car and a toy car. The thing you have to doubt is ''fact''. 

Like your example above:
: '''65000 BC:''' == well nothing really &lt;br /&gt;'''3000 BC:''' == fact &lt;br /&gt;'''1000 AD:''' == fact &lt;br /&gt;'''2000 AD:''' == theory

'''Mychaeel:''' The goal of all theory (at large) is to find systematics in observations that allow ''prediction'' of future observations.  For that, it's irrelevant whether the universe &quot;actually exists&quot; (subject to definition of &quot;existence&quot;) or is just a whim of my fantasy (I think, therefore I am). &amp;ndash; But that's not natural science anymore, it's philosophy.

'''Foxpaw:''' Well, I do understand the big bang theory, it's simplified above because the details aren't as important as the fact that it is not proven. The suggestion that it can't be proven is fair, and so long as it is not I think it should be regarded as such. That is my beef with the way it is regarded - most people regard the big bang theory as if it were proven fact, and in fact it is taught in public schools that it is a proven fact, which it is not. I admit, it is a relatively solid theory, however I do not like the way that it is regarded like it was proven fact, when it is not.

'''Tynan:''' Nothing can ever be positively proven. Not even in abstract math, because all mathematical system rest on a few basic axioms (assumptions). We're also having a problem with the common versus scientific uses of the word &quot;theory&quot;. In common use, a &quot;theory&quot; is just an idea, something thought up and untested. The equivalent word for this in science is &quot;conjecture&quot;. A scientific &quot;Theory&quot; is the closest a principle can come to being proven. Theories in science have been analyzed and tested hard, to the point where engineers have enough confidence that they are true to begin actually using the theory for practical applications. This is the closest an idea or principle can ever come to being proven. One looking at something labelled &quot;theory&quot; by scientists can be quite certain that it is, in fact, as true as can be, literally, and one may also be pretty sure that they have used a machine based on this &quot;theory&quot; in their daily lives. Computer microprocessors are based on quantum theory. The food you eat was artificially selected using principles that were organized by Darwin as the theory of evolution. So really, when something is labelled a &quot;theory&quot;, then that's as good as you can get in terms of  proof of a scientific principle. Theories can be disproven. When one theory has been around for a long time, however, and brutally and repeatedly tested by many scientists, all coming up with results that don't disprove said theory, you can be pretty sure (not certain) that said theory may be used to predict future behaviour. The problems come up when people start trying to apply natural scientific principles to philosophical debates for which they were not designed. Scientists aren't philosiphers. 

Also, I'm not sure &quot;Matter became so condensed that it exploded&quot; really properly summarizes the big bang theory. I'm pretty sure that it doesn't say much about what happened BEFORE the event occurred (&quot;matter condensing&quot;).

'''Foxpaw:''' That's more or less my point. Though it is quite reliable, it is still not proven and likely cannot be. It's ability to be relied upon for future predictions, though useful, does not change that fact, nor is it particularly relevant as such capacity is a useful product, rather than the ultimate goal of speculation on the true nature of the universe. That's my opinion anyway - some scientists may not really care how it really happened as long as their current explanation can be relied upon for future preditiction. In my eyes, that's the same as the people in math classes who don't want to understand how the math works, just &quot;how to get the answer.&quot; As far as the big bang theory goes, that is the &quot;theory&quot; behind what &quot;caused it.&quot; That all of the matter in the universe was already there, and the gravitational attraction between the molecules caused all of said matter to be compacted into a single point which subsequently caused the birth of the universe.

'''Tynan:''' Of course, it will never be proven, since proof is impossible.

But I'm pretty sure that BB theory does not say that there was matter which compacted itself before the event. That would lead to a theory where one would have to believe that the universe goes through constant cycles of compact-explode-compact-explode (which does not concur with our current data on the rate of expansion of the universe which says that the universe will continue to expand forever). The BB theory does not say anything about what happened before the event. It says that the universe was infinitely small, and for some reason it decided to explode. Clarification: the universe itself was infinitely small - not that there was some really compacted superdense object inside the universe somewhere that decided to explode and happened to have every bit fo matter in the universe in it, which it couldn't. If things went around exploding big-bang style when they reached critical mass, then it seems likely that they would explode without having to have every particle of matter in the universe on them, and so either:

1. We'd be seeing big bangs happening or

2. We'd be observing some matter that was not part of the original big bang.

You can't visualize anything about this event from the usual physical perspective, because all the rules change when matter and energy become that dense. We are discussing a primeval atom of infinitely (or just extremely) small size that completely fill an infinitely (or just extremely) small universe.

'''GRAF!K:''' I'm not sure exactly what is meant by &quot;infinitely&quot; small. How can anything be &quot;infinitely&quot; small, if you can divide that size in half, then that in half...

Feel free to tell me I'm an idiot, or that I completely misunderstood what you meant (or both, they're not neccesarily mutually exclusive :P).

'''MythOpus:''' I'm a little late I guess... but here goes me...I am a Christian and I believe saying &quot;God made it. Don't question him, he is far wiser than you.&quot; as a mere theory as to how the universe was created and then saying it was based on the same amount of grounding as the rest of the theories is wrong.  If you read the bible, and compare it to actual events in the world that have occured you will see that they match completely.  So why (say the bible is fake) would you start of the book of life with false &quot; theories &quot; of god creating the world if your &quot; Theory &quot; was indeed based on actual fact.  This didn't exactly come out as I would have liked it to but I tried ;)  and I find your theory Interesting.  But instead of thinking it a 4 dimensional universe, I tend to think of it as a 6 dimensional universe (just like on Stargate the movie and the series)  

'''Mychaeel:''' If the bible accurately recounts events of the past, that makes it a history book, not a scientifical theory.  The latter tries to find the underlying rules that govern those events.

It's a bit as if I write a book that says &quot;Paul dropped a stone from 1.0 meters height.  It took 0.45 seconds to fall to the ground.  Then, Peter dropped a stone from 2.0 meters height.  It took 0.64 seconds to fall to the ground.&quot;  That'd be a historical recounting without any science involved (given that I actually measured those times and distances).  A ''scientist'' would try to find out whether there's a rule behind those numbers &amp;ndash; one term that explains both events, given the height as a variable parameter.

And even though a theory explaining the time a stone takes to fall to the ground from a given height does ''not'' explain what the stone is, nor how it happened to get above ground in the first place, nor who Peter and Paul are, it is a valid scientifical theory since it explains any of the observations made within its scope.  On top of that it even allows predictions for other parameter choices &amp;ndash; if Michael takes a stone and holds it 3.0 meters above the ground, the theory can accurately predict that that stone will take 0.78 seconds to reach the ground.

'''Tynan:''' At GRAF!K - This is what makes the big bang theory so hard to explain to people. The physical forces involved are so far outside of normal physical rules that it's incomprehensible. This happens with a lot of areas of physics (quantum mechanics, where rules of conservation of energy stop applying and special/general relativity, etc). Since the conditions around the BB event are even further outside of our range of experience, and we really don't have a way to recreate it yet, we don't understand exactly what went on. Even the stuff we think we do understand is very hard to explain to the layperson (or so I hear, I'm not that knowledgeable about this stuff).

Any time you talk about the beginning of the universe you will always run into a paradox by which something that exists must be caused to exist by something else (which may not nessecarily be true, but it usually is assumed to be). &quot;The big bang was the start of the universe.&quot; &quot;What caused the big bang?&quot; &quot;God created the universe.&quot; &quot;Where did God come from?&quot; etc etc. This has been the case so far.

'''StrikeFerret:''' Well, when you talk about proofs, you're talking inductive and deductive. And I can't recall which is which. But most mathmatical and logical proofs -are- proofs. Like all those silly side-angle-side proofs and such they made me do so many years ago, so long as the information provided was accurate, so was the proof.

I left myself open there, but bear with me. The other proof (I do believe this THIS is the inductive) relies on any sort of sensory perception. This includes everything based thereon, such as if you measured said triangle for a proof. It also includes things like the sun rising in the East. Just because it has for all or recorded history is no assurance that it will come up tomorrow. Although I plan on it anyway.

Most of the theories presented never really cover everything. I've seen theories regarding a spontaneous creation of a high-energy particle which exploded into this. Perhaps. They say it only had to happen once. 

Or if you consider the argument that matter is simply energy in a certain state. Well, then, the energy sorta sneezed one day and we're feeling the effects of it since. Where did that energy come from? Well maybe, since all energy in waveform is net zero, maybe there IS nothing and we're just percieving this because we're in said system.

I don't pretend to know. I'm not sure I agree with your statment about not wanting to know, but it certainly isn't worth losing too much sleep over. We exist. Or at least I do. Or You do. Heinlein had it right in Starship Troopers, you only worry about your part of the war. If you want to ponder things, by all means, go ahead. It's healthy and fun. But if you can't figure it out, at least you realize you don't know.

'''Phantasmagorium:''' I, going through and digging up all sorts of stuff ((as was required to stay sane in public schools)) to make sure I wasn't being taught bull, want to congratulate fox on this page. Even in the United States, where 40% of the people claim we're better than everyone else, we have public schools that state theory as if it were fact. It's not right, and honestly, our TEACHERS decide that they need to put thier own political spin on thing - exceptionally frustrating, but besides the point. They are there to teach fact, and tell us theories, not to make intelectual clones of themselves and tell us that the creation of the universe can contradict (On further thought, more of a paradox than a contradiction, as if I remember correctly they claim that the big bang was a bunch of energy that exploded and was somehow was converted to matter) proven scientific fact ((Matter and energy cannot be destroyed but are interchangable - correct me on that if I got it just a little wong)). However, whether the Big Bang really happenned or not is pointless. Another '''theory''' that they seem all too fond of toting around as fact is evolution, and that is impossible given the laws of thermodynamics (in particular, the second one, which is the law governing entropy). So while the Big Bang theory is perfectly acceptable using known, scientific 'fact' (which has been proven to the greatest extent possible by humanity, and are taught as fact in pretty much every science book Ive ever seen, except my last one, which said once it was a theory. Thank God (lol, no pun intended) that my teachers this time around knew fact from theory from fiction) as the universe is running down and spreading out, evolution, which states everything is improving, needs more (a lot more) tweaking before acceptable by the second law of thermodynamics. Odd, how evolutionists usually also believe in the Big Bang. I agree no theory can be proven, and while technically thier names really are the lwas of thermodynamics, and they probably won't be disproven (as you can see the second one happen, I just have to watch my bedroom), I do wish to emphasize that these are '''theories'''. Just pretty much rock-solid ones. Also (slightly off-topic), a Godlike being is incomprehensible to humans because  he has no begining, no end, and can do whatever the heck he wants. And because we, as humans, are arrogant creatures, we can't believe that theres something ot there that ut would kill us to look in the eyes (stated in the Bible, see God's face and you die. Also in the Jewish text (if I remember right, the Koran as well). So, the three biggest (or at least best known, and last time I checkd definately two out of three) all agree that if you saw his face directly you would die. Hmm... so maybe humanity is resenful as well? Ok, babbling rant over :P.

'''Strikeferret''' Ah, yes . . . Entropy. Not to discredit you, but you're stating that it's incorrect because of a law of thermodymanics, which in and of itself, is only a theory. Disregarding that, I don't think it really applies to something which actively tries to better itself, either through will or through indirect action. If a string of protein somehow reproduces itself, there will be more of them. And if B makes more copies than A, then there shall be more of B. I believe that logic is deductive, and as such stands to reason as fact. Correct me if I'm wrong. I've also discussed micro versus macro evolution before, and I personally don't think we have the space here to do so. 

To move away from Evolution, however, yes, according to several theories that are being tested, matter and evergy are one and the same, insofar as matter -can- spontaneously decay into energy. I have no followup information on that experiment, however. As for a diety, I encourage you to look at the Tao and consider if something perfect would have human-like qualities at all. Usually, I'd suspect anything anthropomorphic to be hideously imperfect by definition.

'''Foxpaw:''' That's the premise behind the nuclear bomb, deuterium fusion bomb, and neutron implosion bomb... so yes, it's does appear to be possible. :P

'''scumble:''' There's a bit of confusion about evolution. As far as I'm concerned, evolution is an observed phenomenon, not a theory. The theories try to explain how it works, like Natural Selection. I suppose most theories dealing with the process of evolution are a variation on NS, but the &quot;Theory of Evolution&quot; as such, doesn't actually exist, it's a misnomer.

I'm not entirely convinced by the Big Bang myself, Foxpaw. It's all a bit contrived - especially the Inflation bit. The best bits of cosmology deal with what we can see now.

'''Mychaeel:''' Scientists tend to believe that the simplest explanation for a phenomenon is the one that's most likely to actually reflect the truth; and a &quot;higher being&quot; having conceived the entire universe is certainly the most complex and incomplete explanation imaginable.

All of the existing ''scientifical'' theories try to start off from as few postulates as possible (like the special theory of relativity postulating that the speed of light is always the same regardless from the frame of reference it is measured in); granted, most of them get pretty complex in application to a certain problem, but the way from the postulates to the complex application is nothing but logical thought with no room for arbitrariness or ambiguity.

(The explanation that evolution is impossible due to the second law of thermodynamics just makes my head hurt... no offense.  If this particular application of thermodynamics was correct, I'd never be able to type these lines because I'm obviously bringing ''order'' into a bunch of previously unrelated electrons by doing it.)

'''Foxpaw:''' I think that what he was referring to was the theory that evolution was the start of all life on Earth. I wouldn't question for a second that it exists in modern lifeforms, but did humans really evolve from a puddle of amino acids and protein bits? Though I suppose that's TECHNICALLY possible by the theory of evolution... well, TECHNICALLY speaking I could spray automatic fire into a crowded shopping mall at christmas time and not hit anyone through sheer chance, but what are the odds? Also there's a fundamental bit missing as to how cells know how to build themselves, seeing as your body contains numerous types of cell, all of which contain identical DNA.. some biologists claim this is a result of different levels of various proteins and crud present during cell formation, but that too is one heck of a long shot.

I actually think creationism is the simplest and most concise explanation - it's not hard for me to draw something, but if I were a stick figure on that page it would be an inconcievable feat for lines and shapes to simply appear from nowhere. Though seemingly bizarre to the people living on the page, it's intuitive and jarringly simple to one such as myself. This notion, I think, could easily be extrapolated to the three-dimensional world we live in, with a greater being of some kind doodling away, creating universe from an empty page with a few idle strokes. Seems logical to me, anyway, though I'm not saying that that can be proven any easier than anything else, or at all.

'''StrikeFerret:''' It may just be the simplest solution. However, all else is not equal, but that's a fight for a different time.

To use your own example, If it is possbile, if not very probable, that you wouldn't hit anyone, that it is possible. And if you tried that every hour on every planet for three billion years, it is likely to happen at least once. Through my basic training in Anthropology (I did a lot of useless crap my first few years in college) I can assure you the body knows how to do what it does because it works. It's largely why we're so well adapted to the Earth. The Earth isn't perfect for us, we're perfect for the Earth. We adapted that way, not the other way around.

I understand completely those of you who think it's a bit far-fetched, after all, it's just theory after all. However, let us remember that without faith, God is nothing, since he also cannot be proven any more deductively than a theory can. Seeing as how this isn't the point of the conversation, I shall leave it at that.

'''Phantasmagorium:''' I was stating the unlikelihood of something starting from nothing. When I go over all the theories in my head, I have questions for both. However, evolution, much like any religion, has no supporting evidence for the beggining. I was not saying that we haven't evolved since creation, clearly we have, but more mentally than physically, in my honest oppinion. People are taller now, yes, than in Napoleans time, but we're never going to get wings ((The one thing I think would be absolutely awesome is to be able to have wings)), at least not in the foreseeable future, and what did we do about it? We made airplanes. Now we dont need wings :( :P. As for natural selection, the weak die and the strong survive. Fact of life. There is nowhere any any religious text I have ever heard of that disagrees with that. Of course, Im by no means a religious expert, just a guy with great interest and who knows how to look stuff up.

The conclusion I came to? Evolution as the beggining has to be taken on faith, much as any religion. I respect that. All I really ask of the real die-harders out there is they respect my views as well. If you don't, well, '''thats''' when things get messy. ;)

Oh, and when I called them the &quot;laws&quot; of thermodynamics, it was because it is an observed event. Old buildings run down. Tires go flat, even with disuse. People age, get all messed up and die. There is no human being who can disprove entropy. Therefore, at least one of them is &quot;proven,&quot; or as proven as it could be, as I said the first time I typed something out here. This is a really interesting page though, hehe. Good debate.

'''Tynan:''' Actually, you're misinterpreting the laws of thermodynamics. Consider this (this isn't by me by the way but I'm not gonna repeat):

&quot;It's the Second Law that the creationists are so thrilled about. It demonstrates the existence of entropy, and it refers to the fact that in every transformation of energy, some of the energy becomes useless. The Second Law defines the theoretical minimum amount of useful energy which is lost in the transaction. This energy isn't destroyed (which would violate the First Law) but it can't be used to do what a scientist refers to as &quot;work&quot;. This discovery had profound effects on nearly all kinds of engineering.

This is a critically important law, because it is the only scientific principle known which is not symmetrical with respect to time. Indeed, some people think that time may well be entropy, though there is no proof of that yet.

Order is energy. (That's what the Third Law says.) Disorder is a lower energy state than order (or rather, a state where more of the energy is useless). Information is order, and thus stored information is inherently a high-energy state. So the creationists say &quot;The Second Law says that disorder will increase &amp;ndash; so how could evolution create more complex organisms without violating it?&quot; Well, it's because that's not what the Second Law actually says.

The Second Law applies to closed systems and says that the average disorder in the entire closed system will increase with time. (It also applies to individual energy transactions, and to a lot of other things, but within this context it is its systemic aspect which is important.)

This does not apply to open systems. A closed system is one which has no energy transactions outside its borders. An open system has the ability to trade energy in various forms with other systems. A closed system is made up of component open systems, and the Second Law doesn't apply to an open system.

It's possible for an open system to import order and export disorder, locally increasing order. What the Second Law says is that in such a transaction more disorder than order will be created. It does not, however, forbid the creation of pockets of order. What happens is that disorder in the entire closed system will increase even though individual open systems within it might become more ordered.

So the creationist application of the Second Law is wrong because life is an open system, not a closed system.

In any case, if the creationist interpretation of the Second Law was correct, a lot more things than evolution would be impossible. For instance, it would be impossible to breed. You start with two humans and end up with three. Looks like an increase in order to me &amp;ndash; obviously it can't happen. It would also be impossible for a child to grow: five years ago she weighed 20 kilos and now she weighs 35 kilos, which means we've created an additional 15 kilos of ordered mass.

For that matter, it would mean that a refrigerator would be impossible, since &quot;cold&quot; is a form of order.

Not all heat is disorder, but all disorder is ultimately heat. (The Second Law defines precisely how much of the heat in a warm pocket is useless.) What a refrigerator does is to create a pocket of cold by making something nearby more hot (moving the heat from one place to another). This creates a temperature differential, which is a form of order. But doing this involves expenditure of energy which itself becomes heat, so more heat than cold is produced. If the refrigerator were turned off and the heat permitted to flow back into the cold zone and &quot;fill in the hole&quot; by destroying the differential, the resulting system overall would be warmer than before, and more of the total energy in the closed system would be useless.

Equally, maintenance of the order of life requires substantial expenditure of energy; we take it in as food and expel it as heat. This doesn't violate the Second Law because we are not closed systems &amp;ndash; and evolution doesn't either. Evolution creates order but the overall system becomes more disordered on average with time. The earth itself isn't a closed system: order is imported as sunlight and exported as radiated heat. The heat enters the background of the universe and the total disorder of the universe increases. As long as the sun shines and the celestial background is cold, life on earth can still flourish. (Unless we pollute ourselves to death.)

The system is definitely running down. The universe may last forever (that hasn't been determined yet) but it will only exist as we know it for perhaps 50-100 billion more years, at which point there will be few hot spots left to act as sources of order for life to exploit. Then the universe's disorder will overwhelm order and life as we know it will become extremely difficult and rare.

&quot; - by Steven den Beste (full at http://denbeste.nu/essays/thermo.shtml).

Now, back to the main topic here, which is the concept of theories. We're still having a major communications problem when we talk about the word &quot;theory&quot;. A theory is a concept or conceptualized system based on past observations that can be used to predict future events. This is all a theory is. A theory is also the furthest any scientific concept can be said to be &quot;true&quot; as. No concept is more proven than a theory. One that is less proven is a hypothesis. One that is very new and untested is a conjecture. In order to attain theory status a concept is tested for a long time in many ways by many people. 

The concept of proof is a fallacy. Nothing can ever be positively proven in science or math. Mathematical systems always start out with a few basivc axioms that are ASSUMED to be correct. Thus when you &quot;prove&quot; something within said mathematical system, that proof rests on the assumption that your original axioms are correct as well, which is in fact not a proof at all. Nothing can ever be proven, thus a &quot;theory&quot; is the furthest any concept can go to being proven. There is no such thing as a proven scientific fact. 

Most people think of a theory as being some sort of idea or thought that hasn't been tested. This conflicts with science lingo. In scientific circles, such a concept is referred to as a conjecture. Complaining about the teaching of &quot;theories&quot; in schools is redundant, because if we didn't teach theories we wouldn't be teaching anything.  

'''Phantasmagorium:''' Three words: Holy... freaking... crap. Thats a looooong excerpt (it was an excerpt, right?). I think that you are making assumptions yourself in posting it, but I'll try to stay on topic. Hard to do now that schools started again. My class just went over the big bang theory again, and my teacher (who is a really cool guy) went over both the ways it could happen and the impossibilities of it, such as the huuuuge amount of mass coming from just that one thing. Assuming that matter did exist without a universe (which, in my oppinion, the use of that term is misleading. The Big Bang is a theory regarding the creation more of the physical contents of said univese, than the universe itself. Especially since the term universe is often subconcsiously assumed to mean reality. Odd, but I tested it when I was bored on students and teachers. im not gonna say how, because its besides the point.) One impossibilty that is used often (and I will only use this because it is blatant) is where did the matter come from? Someone who takes it only at a first glance (from how Ive seen the theory) may quote how matter and energy are interchangeable, and somether mumbled words (&lt;&amp;ndash; Actually happened! I think someones avoiding the subject...) about some pure bull. So, please, someone put here the actual theory regarding the big bang, in complete text, as I have been unable to locate it to my satisfaction. 

At the above: Instead of 'redundant', did you mean contradictory? As redundant means it has something to fall back on (quick definition, dont go using that in an official forum :P) Anyways,  nice discussion, it's really turning into something I can enjoy. I don't get good arguments all the time on this subject, as the people I ask do the whole mumble-interchangable-bull routine.

'''Foxpaw:''' I would have to disagree with that definition of the Second Law of Thermodynamics. My understanding of entropy is not that things become less ordered, simply that less can be absolutely determined about them. For instance, the drain pipes in your home are slowly (extremely slowly) eroded by the things that go down them. Thus, 50 years after installation, it is much more difficult to say with certainty where the individual molecules that made up the pipe are. Maybe they're still in the pipe, maybe they're not. The more time that passes, the more &quot;scattered&quot; the molecules could theoretically be... that is that it cannot be predicted as accurately, not necessarily that order has not been created.

I wouldn't say that evolution violates entropy, I'm just saying.. it's a pretty far fetched explanation of how life on Earth began. The appropriate molecules just HAPPENED to form into the shape of a cell and it all went from there? I'll buy that evolution takes place to modify existing things, but I have a hard time believing that it was the beginning, and am highly opposed to it being preached as if it was the way that life began. It seems like one heck of a coincidence.

I would agree that matter and energy are interchangeable, but that doesn't really bring us any closer to validating the big bang. So the matter was created by the energy? Where did that come from? Since they're interchangeable, that's kind of like evaluating X + Y = 7 to X = 7 - Y and claiming you're closer to the answer. That's my opinion anyway. 

'''Tynan:''' Well, the first &quot;life&quot; doesn't have to have been a  fully-formed cell. All you need is a particle that self-replicates in its envorinment. You don't need it to have all the biological functions that modern lifeforms have. Once that particle exists for whatever reason, it will self replicate and multiply. It won't technically be &quot;alive&quot; but it will replicate. Sometimes it might replicate slightly differently for whatever reason, and if those particles are more robust etc they will survive. Some of the particles will stick together eventually and you'll have a system where lumps of molecules replicate other individual molecules into their envoronment which lump together with nearby molecules. They'll get bigger and bigger and start having specialized parts (like a more robust or structured layer of particles on the outside, the &quot;cell wall&quot; if you will).

It doesn't nessecarily have to have started with anything resembling modern life. All that's needed are two ingredients: the ability to self-replicate, and the ability to have replicas that may be slightly different than the original. After that all that's required is time and the process of selection will produce organisms more and more likely to survive in their environment. Particle life forms with no autonomous functions like I discuss do still exist (they're known as &quot;viruses&quot; and they're nothing more than a peice of ribonucleic acid, perhaps with some protein chains attached to it).

Now back to the BB theory. Whe discussing any ideas about the beggining of the universe, you will ALWAYS end up in a &quot;what before that&quot; loop. God created the universe. What created God? The Big Bang is the origin of all matter. Where did the Big Bang come from? Etc etc. 

The thing with the big bang is that the physics are so far outside of normal Newtonian existence that it's almost impossible to study or understand. When you have the entire universe packed into a volume the size of a golf ball all the rules change. There could be physical forces and laws involved that don't even apply to our state of being (way less dense and waay cooler than the BB. Plus our universe is of greater than infinitely small size).

Some idea I've heard about the BB theory is that it didn't break any laws of conservation. There was nothing and no universe, and this is still true if there is the same amount of antimatter as matter. All we represent is an imbalance, and somewhere else there is a counterweight (in the form of antimatter). Of course, the question remains as to what caused these events. It'll be a while before we figure that one out. Remember, the BB theory is only around because we've observed that the universe is currently exploding (all matter is moving away from a point at high speed).

'''Foxpaw:''' Well, yes, sort of, but what kind of non-cellular particle can replicate itself? Viruses are a good example, but they can't reproduce themselves, they need a cellular host in order to reproduce. Not all theories have that &quot;what before what&quot; loop though, Creationism for instance does not have that issue if you study it thoroughly. God is said to transcend time, thus causing a temporal paradox wherein God created himself. I believe there's quite a popular example of this type of temporal paradox about a time-travelling drifter that was their own mother, father, and children, as a result of travelling through time and &quot;interacting&quot; with their past and future selves. This person, in effect, created themself.

Now that I've said that, it brought to my attention that perhaps the Universe itself exists in a similar temporal paradox, having somehow inflicted itself. Unsettling, indeed.

'''GRAF1K:''' Um, I realize this is a bit late, but here goes:

When one starts out with (presumably) no matter at all, how is matter to develop? For instance, you've got a speck of matter. How did it get there? It wasn't just magically always there, so where did it come from? Obviously it was generated by someone or something. Where did that someone or something come from?

This is, in my opion of course, one of the fundamental flaws of the big bang theory. Something had to have always been there, infinite in at least one direction of time. That isn't going to happen with physical objects. They ''must'' to come from somewhere, otherwise you would have to assume that the popped out of thin nothingness, or you'd have to assume that the object came to be as a result of a combustion of matter that did not exist.

Another thing. The physics: if one has to make up a new form of physics completely outside of the normal and comprehensible range of existing physics, that is the most extreme example of the most complex theory that could be thought up to explain the matter of how the universe came to be. Would you care to clear up, Mychaeel, how the big bang theory is correct because it is still simplest?

If you were walking thought that philosophical forest in which trees fall that may or may not make sounds (;)), and you saw an intricate watch laying on the ground, what would you assume was the origin of it?

Suppose I said to you: &quot;That watch was spontaneously generated by an explosion of a metals factory. The materials bounced across the milky way and back, and in a terrific display of the power of chance, the metals were melted and sculpted by the heat and formed an intricate and beautiful watch.&quot; You then ask how the factory spewed the materials so far in an ordinary explosion, and for that matter how it is that they bounced back precisely onto Earth. Then you point out that it's impossible for an object  with that amount of force to bounce instead of shatter the object it supposedly bounced off of. I then respond: &quot;It was outside of the range of normal physics. Don’t try to understand it.&quot;

Would you believe my story?

Now say I inform you that I hadn't actually witnessed this, or even had any varifiable data to support it. I simply saw the watch there and reasoned that my story would be a plausible explanation. There couldn't possibly be someone more skilled than me that could have created this watch.

You would laugh heartily and ignore me for an idiot. And an idiot I would be.

'''Tarquin:''' This page is going horribly off-topic. It runs the risk of being deleted. I suggest you move content you value to another wiki that focuses on this sort of debate. :)

'''Foxpaw:''' I have to agree that it's a personal page, also Category Rant. Though the thread mode has gotten a bit off topic, I still think that the original argument, (that a theory that has serious opposition should not be stated blatantly as if it were fact) is valid.

'''GRAF1K:''' There's no evident reason as to why it should be deleted, please expand.
* Mychaeel himself is adding to this thread.
* It shouldn't be considered off-topic if it's a Category Rant and a personal page as Foxpaw says.
* Even if it was off-topic, it's doing no harm.

'''Tarquin:''' Grafik, off-topics pages are tolerated at the diecretion of the wiki masters ie Me &amp; Mych. I think this page is pointless crap. It's taking up space on BU's server, and it's getting bundled into our zipped downloads. Sure, there is plenty of other pointless crap, but this page is ''offensive'' pointless crap. Like I said, find another place to have this discussion. 

'''Uncommon:''' How was the Universe created? &quot;God made it. Feel free to question him, you might learn something.&quot;

'''AlphaOne:''' &quot;Without God life makes no sense.&quot; - Andrei Bitov, a Russian novelist.

HAH! Just as I posted this a Google Ad appeared at the bottom leading to this: http://www.thercg.org/google/provegod.html

I just glanced at it so I'm not sure if I want/do belive everything that it says. If you got lots of time go ahead and read it:)

'''O-GL:''' An interesting point that GRAF1K brought up: Physics.  

A game physics system ideally works by performing physics calculations on an object, determine its resulting location, then perform a collision detection test to see if the location is valid (if not perform another physics calculation to determine the results of the collision).  

Now, the obvious problem to creating physics is how to do collision detection and how to do it efficiently.  Currently I know of two basic ways, 1. Test each object against every other object within a certain zone 2. Test the zones an object occupies to see if they aren’t already occupied by any other objects.  

Now, how do objects in real life know they are colliding?  1. Are they just composed of some magical atoms that just say, “Hey, I’m occupying this space, therefore perform your collision algorithm”?  For that to happen, there would have to be some kind of insane communication between the many atoms in the universe.  2. Maybe there is some physics algorithm that runs through the list of all the atoms and sets their appropriate locations?  

Maybe God runs them all?   Hmm, the first verse of the Bible says, “In the beginning God created the heaven and the earth”.  Then it says, “And the earth was without form, and void; and darkness was upon the face of the deep.  And the Spirit of God moved upon the face of the waters”.  Although this doesn’t say much about how collision detection works, it seems that the execution is not dependent on God.  Its more like God gave life, and now that life is simply working as it was created, executing its physics calculations and moving along some arbitrary ‘grid’.  Theoretically, matter is a self executing packet that does not know about every other packet in the universe … it just receives input from the other packets in the universe and sends output to the other packets in the universe.  However, that brings us back to the problem of what determines the collision and therefore the output/input of the packets.  All we have to go on is that God “created” and said “Let there be X”, but we don’t know the entirety of how these things run, which is probably a good thing ;).  Heh, its sorta like Unreal script … we get to modify a lot of the stuff, but we don’t get to change the core engine (because then alot of things that currently work may be broken in the &quot;new universe&quot;, lol).

'''AlphaOne:''' http://www.livingwaters.com/Merchant2/merchant.mv?Screen=PROD&amp;Product_Code=231&amp;Category_Code=Tracts

I don't want to make this a page of links to other ideas, this will be the last one :p

'''Foxpaw:''' Tarquin, you stated that this page is offensive. Who has been offended by this page, and why? If anyone finds this page offensive, they have given no indication to that effect.

'''T1''' Whoo that was a long read. Anyway heres my 0.02:

Only one thing can be proven in the world: Your own existance, and that can only proven to yourself. All else can easily be halluncination, or some Matrix-like virtual reality. Insanity is a realative thing. The &quot;insane&quot; people we lock up in mental institutions (I'm assuming here that there is a &quot;we&quot; and there are &quot;&quot;insane&quot; people&quot; and that there are &quot;mental institutions&quot;, after all I could be hallucinating.) could be seeing the truth. They could really be say, Napolean Bonaparte, and we're just hallucinating and can't see the truth. Assuming there is a truth. Or we could all be high on something and we don't know it. For all we know human beings may not really require oxygen to live, and we all just hallucinate people suffocating. This also means that everything is my hallucination probobly, because I'm pretty messed up; therefore, everything I say is correct. And anyway how we were created doesn't matter.

Just my 0.02.

'''AlphaOne:''' There is a huge problem with this kind of thinking. I'm not sure exactly what it is, but the result is that it can completely justify murder. For example, I could decided that in my little hallucination there are just a little too many people. After all, I'd like to enjoy the resources of the Earth by myself. Since its all just in my head, I make up a rule that I own the earth. Following that rule I go and somehow everyone else. All Hail AlphaOne!

'''T1:''' Hey it's '''your''' hallucination. Anyway most people can't really control their own hallucinations. And don't question me. I'm far wiser than you. After all you are my hallucination.

'''Foxpaw:''' I suppose you ''could'' justify murder in that way, but if you can't directly control the hallucination, then you might end up hallucinating the inevitable consequences of your hallucinated actions, no?

'''AlphaOne:''' '''''T1''''': careful. It might just happen that people in your hallucination people will start getting killed by the A1 stick too. '''''Foxpaw''''': Even if I'm forced to hallucinate the inevitable consequences, I've hallucinated/seen many examples that it is indeed possible to destroy other people in my hallucination. I don't care for consecuences in this hallucination of mine. I don't see a reason why not go on a killing spree. After all, the less I have to hallucinate about, the better.'''''T1'''''?

'''T1:''' Foxpaw is correct. You will hallucinate the consquences. If you even exist... And like I said it's '''your''' hallucination. So it's your problem. To me it doesnt matter. Unless this causes me to hallucinate death (I suspect your brain shuts itself down then. I haven't &quot;died&quot; before so I don't know).

'''GRAF1K:''' tarq, I fail to see how this page is offensive. No one else seems to see how either. Please expand as Foxpaw says.

Now...

This page has gone even further off it's original topic after my last post, beginning with a completely unrelated peice of trival nonsense about physics. Then progressing to talk of hallucination that, while still not offensive, is only nurturing the budding insanity of certain ones posting above. Please refrain before giving tarquin further reason to delete this page.

'''El Muerte:''' It's still '''Unreal'''Wiki, it's not even remotely related to Unreal in anyway.

'''GRAF1K:''' Noted, El Muerte. ''Again''.

'''Ryan:''' Human beings get through day to day life by making assumptions about their world.  Unfortunately perhaps, sometimes these assumptions become &quot;truth&quot; within the individuals conciousness.  At other times they make assumptions that what they are saying is understood by the listener.  In the case of teachers and scientific theories, I'm sure some treat them as &quot;truth&quot; and others represent them as &quot;theory&quot; but in a way that the listener thinks they are saying &quot;truth&quot;.  I don't think in general it's a conspiracy, more a fact of the human condition. It's a part of learning to distinguish reality from theory, and everybody has their individual take on it.

'''Boff:''' I ewould like to point out that we assume matter was present at the beginning of the universe. What if there was just energy. I remember reading something somewhere about the Theory of Relativity and that matter is merely heavliy condensed energy, or even energy that has slowed down from the speed of light.

==Further Reading==

I'm breaking convention and putting this below the discussion. I'm hoping that it will make the discussion feel more like it's part of the article instead of an attachment hanging on to the bottom. If you haven't already, I would highly recommend the book &quot;A Brief History of Time,&quot; by Stephen Hawking. I imagine you've heard of it. It is a very informed, very scientific look at the Universe. It is also interesting - not a dry read, even for those not particularly interested in theoretical physics. If &quot;A Brief History of Time&quot; has a sequel, it would be &quot;Hyperspace: A Scientific Odyssey Through Parallel Universes, Time Warps and the Tenth Dimension&quot; by Michio Kaku. Like &quot;A Brief History of Time,&quot; &quot;Hyperspace&quot; is easy to read and not biased toward any particular theory. Unproven theories are clearly stated as such. I found the book fascinating, but it is a bit more advanced that &quot;A Brief History of Time&quot; and some people may have difficulty understanding parts of it. Michio Kaku's other books also look good but I have not read them. Please feel free to post links below if you find any good sites relating to the topic:

'''Dante:''' I read [[BookShelved:ABriefHistoryOfTime]]. It's a good book, although it startert a controversy because of using ideas as if they're known facts.

'''Foxpaw:''' Ahh! Words smashed together! Spaces were invented for a reason. :P

'''Tarquin:''' hey! I went to the trouble of making a little interwiki icon just for that link, you ungrateful wretches! ;)

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3239</id>
      <timestamp>2004-10-31T02:08:05Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>moved inappropriately placed comment</comment>
      <text xml:space="preserve">====This is part rant, part scientific paper. Of course it's not actually paper, but it's still called paper for traditions sake.====

==Foreward==

My job leaves me with a lot of time to think. Some people ask if I lie awake at night thinking about these things. Said people have no respect for legitimate scientific theory. Having said that, scientific theories are primarily what I ponder on while spraying scalding hot water at assorted bits of machinery.

Where I live, (in Canada) there used to be these things called &quot;residential schools.&quot; Their aim was to assimilate the Native Americans by removing them from their society at a young age so they would only absorb the European culture. They were forbidden from learning about their native culture or from speaking their native language. These have, of course, been abolished for some time now. However, when I think about it, in a way, they still exist: they're called public schools.

I went to a public school when I was young, and I accepted the things they told me about the world, politics, etcetera. Now that I'm older I'm appalled at what they teach: they, in fact, teach unproven theory as if it were rigid fact! For a long time I believed the theories they supported - evolution, big bang theory, even the scourge of scientific theories, &quot;common sense.&quot; Fortunately, I have since considered these and realize that they are in fact mere theories.

==The Universe, Abridged==

Here's a brief timeline of theories on what created the universe:

'''65000 BC:''' How did the Universe come to be? &quot;It just did. Don't question it.&quot;

'''3000 BC:''' How was the Universe created? &quot;Assorted gods made it. Don't question them, they are far wiser than you.&quot;

'''1000 AD:''' How was the Universe created? &quot;God made it. Don't question him, he is far wiser than you.&quot;

'''2000 AD:''' How was the Universe created? &quot;Matter became so condensed that it exploded. Voila. Universe.&quot; What matter? There wasn't even a Universe yet! &quot;Don't question it. The people who discovered that have far more schooling than you.&quot;

Surely you can sense the pattern. All of these theories have the same amount of grounding. In fact, the big bang theory is the least logical of them all because it relies on matter existing within a Universe that did not even exist yet. At least the middle two relied on omnipotent beings, who, being omnipotent, could theoretically exist without requiring any Universe to contain them.

Here's my theory: It's actually very similar to creationism, only instead of an omnipotent being in the sky, it's something beyond human understanding, likely something existing in at least 4 dimensions. I call this theory: '''I don't know, and frankly I don't want to know.''' I firmly believe that the creation of the Universe is far beyond the cognitive capabilities of a human being. Consider the surface of a piece of paper. A flat, two dimensional space. On it lives a stick figure, who is alive. Try to explain to a two dimensional being who cannot leave or see outside it's two dimensional piece of paper the process by which that page was created. Some say that nothing is impossible, but I dare say that no stick figure, however intelligent, could comprehend the three dimensional processes that brought about the paper on which it exists. Similarly, I don't believe that any three dimensional being can possibly understand the extradimensional processes that brought about the Universe it lives in.

==Discussion==

I hope that anyone who reads the above will give it some serious thought before tearing down the above as preposterous. I recognize that it is difficult for three dimensional creatures such as ourselves to visualize what existance is to a two dimensional or extradimensional being. This section is, of course, open to legitimate scientific debate - if there exists any theory that has more backing, or if new evidence has been discovered to support the lofty big bang theory, (IE an explanation as to how matter existed within something that did not exist) I'd certainately be interested to hear it below:

'''Mychaeel:''' The people saying &quot;Don't question this-or-that, the people who created this theory had more schooling that you&quot; are (presumably) right.  It is ''very'' hard to argue anything you have not thoroughly understood.  You can try, no doubt, but you're almost bound to come to false conclusions in regard to the plausibility and consistency of a theory if you haven't thoroughly studied it (way beyond descriptions in popular scientific books).

That said, I don't claim thorough knowledge of those theories myself; certainly not enough to competently discuss them.  It's probably sufficient for idle talk like this though. &amp;ndash;

Physics with more than three dimensions?  Give physicists more credit.  The superstring theory deals with no less than ''nine'' spatial dimensions.  Visually imagining such a space is a non-issue; it's all down to (heavy) maths.

Big Bang theory?  It is widely accepted because it is consistent with observations made to date (which is the ultimate requirement for any scientific theory).  It's also well-known that it leaves some tough questions unanswered such as what happened ''prior'' to it, leaving open the definition of &quot;prior&quot; given that ''time'' came into being along with space at the Big Bang.  But it'll do, for now.

'''Foxpaw:''' I'd certainately agree that the Big Bang theory is supported by much of the evidence that has been observed so far, though I still maintain that it is unproven and should not be preached as if it were absolute fact. My target in this rant was not the big bang theory in particular - just that it is treated as if it were absolute fact. I also recognize that extradimensional physics have been pondered on somewhat, though superstring theory is incredibly vague and no attempt is made to understand the nature or construction of the superstrings - somewhat like creationism but with a seemingly indefinite number of entities working as a network.

'''Mychaeel:''' By principle, no scientifical theory (except for mathematical theory) can ever possibly be ''proven'' &amp;ndash; it can only be ''disproven'' if it turns out that new observations are inconsistent with accepted theory. &amp;ndash; If anybody ever told you that a certain theory was proven fact, consider that a simplification for the sake of explanation.  Obviously no theory ever ''can'' be proven fact.

'''Foxpaw:''' Exactly - that's why I'm opposed to the acceptance of theories as if they were proven fact.

'''El Muerte TDS:''' that's also an interesting thing. How can you ever prove anything, it's all based on your perception of life, the universe, everything. But what is our reality, it's our perception of life, the universe, everything. So why would you want to prove anything outside our reality, if you prove something that's correct in our current perception of the reality isn't that just prove enough to accept. If we would expand our reality we could challange the established theories, like man did over the years. The discovery of the new continents expanded our reality, which resulted in a change of the world. But it becomes much harder to expand the reality , it's no longer something we can see or touch. Or it's a matter of time you don't have (e.g. more than a life time). So then it comes down to theories. And for understanding theories you need to have basic knowledge about the subject. And you can't just challange a theory if you don't have enough knowledge about the subject. It's just like a race between a rocket car and a toy car. The thing you have to doubt is ''fact''. 

Like your example above:
: '''65000 BC:''' == well nothing really &lt;br /&gt;'''3000 BC:''' == fact &lt;br /&gt;'''1000 AD:''' == fact &lt;br /&gt;'''2000 AD:''' == theory

'''Mychaeel:''' The goal of all theory (at large) is to find systematics in observations that allow ''prediction'' of future observations.  For that, it's irrelevant whether the universe &quot;actually exists&quot; (subject to definition of &quot;existence&quot;) or is just a whim of my fantasy (I think, therefore I am). &amp;ndash; But that's not natural science anymore, it's philosophy.

'''Foxpaw:''' Well, I do understand the big bang theory, it's simplified above because the details aren't as important as the fact that it is not proven. The suggestion that it can't be proven is fair, and so long as it is not I think it should be regarded as such. That is my beef with the way it is regarded - most people regard the big bang theory as if it were proven fact, and in fact it is taught in public schools that it is a proven fact, which it is not. I admit, it is a relatively solid theory, however I do not like the way that it is regarded like it was proven fact, when it is not.

'''Tynan:''' Nothing can ever be positively proven. Not even in abstract math, because all mathematical system rest on a few basic axioms (assumptions). We're also having a problem with the common versus scientific uses of the word &quot;theory&quot;. In common use, a &quot;theory&quot; is just an idea, something thought up and untested. The equivalent word for this in science is &quot;conjecture&quot;. A scientific &quot;Theory&quot; is the closest a principle can come to being proven. Theories in science have been analyzed and tested hard, to the point where engineers have enough confidence that they are true to begin actually using the theory for practical applications. This is the closest an idea or principle can ever come to being proven. One looking at something labelled &quot;theory&quot; by scientists can be quite certain that it is, in fact, as true as can be, literally, and one may also be pretty sure that they have used a machine based on this &quot;theory&quot; in their daily lives. Computer microprocessors are based on quantum theory. The food you eat was artificially selected using principles that were organized by Darwin as the theory of evolution. So really, when something is labelled a &quot;theory&quot;, then that's as good as you can get in terms of  proof of a scientific principle. Theories can be disproven. When one theory has been around for a long time, however, and brutally and repeatedly tested by many scientists, all coming up with results that don't disprove said theory, you can be pretty sure (not certain) that said theory may be used to predict future behaviour. The problems come up when people start trying to apply natural scientific principles to philosophical debates for which they were not designed. Scientists aren't philosiphers. 

Also, I'm not sure &quot;Matter became so condensed that it exploded&quot; really properly summarizes the big bang theory. I'm pretty sure that it doesn't say much about what happened BEFORE the event occurred (&quot;matter condensing&quot;).

'''Foxpaw:''' That's more or less my point. Though it is quite reliable, it is still not proven and likely cannot be. It's ability to be relied upon for future predictions, though useful, does not change that fact, nor is it particularly relevant as such capacity is a useful product, rather than the ultimate goal of speculation on the true nature of the universe. That's my opinion anyway - some scientists may not really care how it really happened as long as their current explanation can be relied upon for future preditiction. In my eyes, that's the same as the people in math classes who don't want to understand how the math works, just &quot;how to get the answer.&quot; As far as the big bang theory goes, that is the &quot;theory&quot; behind what &quot;caused it.&quot; That all of the matter in the universe was already there, and the gravitational attraction between the molecules caused all of said matter to be compacted into a single point which subsequently caused the birth of the universe.

'''Tynan:''' Of course, it will never be proven, since proof is impossible.

But I'm pretty sure that BB theory does not say that there was matter which compacted itself before the event. That would lead to a theory where one would have to believe that the universe goes through constant cycles of compact-explode-compact-explode (which does not concur with our current data on the rate of expansion of the universe which says that the universe will continue to expand forever). The BB theory does not say anything about what happened before the event. It says that the universe was infinitely small, and for some reason it decided to explode. Clarification: the universe itself was infinitely small - not that there was some really compacted superdense object inside the universe somewhere that decided to explode and happened to have every bit fo matter in the universe in it, which it couldn't. If things went around exploding big-bang style when they reached critical mass, then it seems likely that they would explode without having to have every particle of matter in the universe on them, and so either:

1. We'd be seeing big bangs happening or

2. We'd be observing some matter that was not part of the original big bang.

You can't visualize anything about this event from the usual physical perspective, because all the rules change when matter and energy become that dense. We are discussing a primeval atom of infinitely (or just extremely) small size that completely fill an infinitely (or just extremely) small universe.

'''GRAF!K:''' I'm not sure exactly what is meant by &quot;infinitely&quot; small. How can anything be &quot;infinitely&quot; small, if you can divide that size in half, then that in half...

Feel free to tell me I'm an idiot, or that I completely misunderstood what you meant (or both, they're not neccesarily mutually exclusive :P).

'''MythOpus:''' I'm a little late I guess... but here goes me...I am a Christian and I believe saying &quot;God made it. Don't question him, he is far wiser than you.&quot; as a mere theory as to how the universe was created and then saying it was based on the same amount of grounding as the rest of the theories is wrong.  If you read the bible, and compare it to actual events in the world that have occured you will see that they match completely.  So why (say the bible is fake) would you start of the book of life with false &quot; theories &quot; of god creating the world if your &quot; Theory &quot; was indeed based on actual fact.  This didn't exactly come out as I would have liked it to but I tried ;)  and I find your theory Interesting.  But instead of thinking it a 4 dimensional universe, I tend to think of it as a 6 dimensional universe (just like on Stargate the movie and the series)  

'''Mychaeel:''' If the bible accurately recounts events of the past, that makes it a history book, not a scientifical theory.  The latter tries to find the underlying rules that govern those events.

It's a bit as if I write a book that says &quot;Paul dropped a stone from 1.0 meters height.  It took 0.45 seconds to fall to the ground.  Then, Peter dropped a stone from 2.0 meters height.  It took 0.64 seconds to fall to the ground.&quot;  That'd be a historical recounting without any science involved (given that I actually measured those times and distances).  A ''scientist'' would try to find out whether there's a rule behind those numbers &amp;ndash; one term that explains both events, given the height as a variable parameter.

And even though a theory explaining the time a stone takes to fall to the ground from a given height does ''not'' explain what the stone is, nor how it happened to get above ground in the first place, nor who Peter and Paul are, it is a valid scientifical theory since it explains any of the observations made within its scope.  On top of that it even allows predictions for other parameter choices &amp;ndash; if Michael takes a stone and holds it 3.0 meters above the ground, the theory can accurately predict that that stone will take 0.78 seconds to reach the ground.

'''Tynan:''' At GRAF!K - This is what makes the big bang theory so hard to explain to people. The physical forces involved are so far outside of normal physical rules that it's incomprehensible. This happens with a lot of areas of physics (quantum mechanics, where rules of conservation of energy stop applying and special/general relativity, etc). Since the conditions around the BB event are even further outside of our range of experience, and we really don't have a way to recreate it yet, we don't understand exactly what went on. Even the stuff we think we do understand is very hard to explain to the layperson (or so I hear, I'm not that knowledgeable about this stuff).

Any time you talk about the beginning of the universe you will always run into a paradox by which something that exists must be caused to exist by something else (which may not nessecarily be true, but it usually is assumed to be). &quot;The big bang was the start of the universe.&quot; &quot;What caused the big bang?&quot; &quot;God created the universe.&quot; &quot;Where did God come from?&quot; etc etc. This has been the case so far.

'''StrikeFerret:''' Well, when you talk about proofs, you're talking inductive and deductive. And I can't recall which is which. But most mathmatical and logical proofs -are- proofs. Like all those silly side-angle-side proofs and such they made me do so many years ago, so long as the information provided was accurate, so was the proof.

I left myself open there, but bear with me. The other proof (I do believe this THIS is the inductive) relies on any sort of sensory perception. This includes everything based thereon, such as if you measured said triangle for a proof. It also includes things like the sun rising in the East. Just because it has for all or recorded history is no assurance that it will come up tomorrow. Although I plan on it anyway.

Most of the theories presented never really cover everything. I've seen theories regarding a spontaneous creation of a high-energy particle which exploded into this. Perhaps. They say it only had to happen once. 

Or if you consider the argument that matter is simply energy in a certain state. Well, then, the energy sorta sneezed one day and we're feeling the effects of it since. Where did that energy come from? Well maybe, since all energy in waveform is net zero, maybe there IS nothing and we're just percieving this because we're in said system.

I don't pretend to know. I'm not sure I agree with your statment about not wanting to know, but it certainly isn't worth losing too much sleep over. We exist. Or at least I do. Or You do. Heinlein had it right in Starship Troopers, you only worry about your part of the war. If you want to ponder things, by all means, go ahead. It's healthy and fun. But if you can't figure it out, at least you realize you don't know.

'''Phantasmagorium:''' I, going through and digging up all sorts of stuff ((as was required to stay sane in public schools)) to make sure I wasn't being taught bull, want to congratulate fox on this page. Even in the United States, where 40% of the people claim we're better than everyone else, we have public schools that state theory as if it were fact. It's not right, and honestly, our TEACHERS decide that they need to put thier own political spin on thing - exceptionally frustrating, but besides the point. They are there to teach fact, and tell us theories, not to make intelectual clones of themselves and tell us that the creation of the universe can contradict (On further thought, more of a paradox than a contradiction, as if I remember correctly they claim that the big bang was a bunch of energy that exploded and was somehow was converted to matter) proven scientific fact ((Matter and energy cannot be destroyed but are interchangable - correct me on that if I got it just a little wong)). However, whether the Big Bang really happenned or not is pointless. Another '''theory''' that they seem all too fond of toting around as fact is evolution, and that is impossible given the laws of thermodynamics (in particular, the second one, which is the law governing entropy). So while the Big Bang theory is perfectly acceptable using known, scientific 'fact' (which has been proven to the greatest extent possible by humanity, and are taught as fact in pretty much every science book Ive ever seen, except my last one, which said once it was a theory. Thank God (lol, no pun intended) that my teachers this time around knew fact from theory from fiction) as the universe is running down and spreading out, evolution, which states everything is improving, needs more (a lot more) tweaking before acceptable by the second law of thermodynamics. Odd, how evolutionists usually also believe in the Big Bang. I agree no theory can be proven, and while technically thier names really are the lwas of thermodynamics, and they probably won't be disproven (as you can see the second one happen, I just have to watch my bedroom), I do wish to emphasize that these are '''theories'''. Just pretty much rock-solid ones. Also (slightly off-topic), a Godlike being is incomprehensible to humans because  he has no begining, no end, and can do whatever the heck he wants. And because we, as humans, are arrogant creatures, we can't believe that theres something ot there that ut would kill us to look in the eyes (stated in the Bible, see God's face and you die. Also in the Jewish text (if I remember right, the Koran as well). So, the three biggest (or at least best known, and last time I checkd definately two out of three) all agree that if you saw his face directly you would die. Hmm... so maybe humanity is resenful as well? Ok, babbling rant over :P.

'''Strikeferret''' Ah, yes . . . Entropy. Not to discredit you, but you're stating that it's incorrect because of a law of thermodymanics, which in and of itself, is only a theory. Disregarding that, I don't think it really applies to something which actively tries to better itself, either through will or through indirect action. If a string of protein somehow reproduces itself, there will be more of them. And if B makes more copies than A, then there shall be more of B. I believe that logic is deductive, and as such stands to reason as fact. Correct me if I'm wrong. I've also discussed micro versus macro evolution before, and I personally don't think we have the space here to do so. 

To move away from Evolution, however, yes, according to several theories that are being tested, matter and evergy are one and the same, insofar as matter -can- spontaneously decay into energy. I have no followup information on that experiment, however. As for a diety, I encourage you to look at the Tao and consider if something perfect would have human-like qualities at all. Usually, I'd suspect anything anthropomorphic to be hideously imperfect by definition.

'''Foxpaw:''' That's the premise behind the nuclear bomb, deuterium fusion bomb, and neutron implosion bomb... so yes, it's does appear to be possible. :P

'''scumble:''' There's a bit of confusion about evolution. As far as I'm concerned, evolution is an observed phenomenon, not a theory. The theories try to explain how it works, like Natural Selection. I suppose most theories dealing with the process of evolution are a variation on NS, but the &quot;Theory of Evolution&quot; as such, doesn't actually exist, it's a misnomer.

I'm not entirely convinced by the Big Bang myself, Foxpaw. It's all a bit contrived - especially the Inflation bit. The best bits of cosmology deal with what we can see now.

'''Mychaeel:''' Scientists tend to believe that the simplest explanation for a phenomenon is the one that's most likely to actually reflect the truth; and a &quot;higher being&quot; having conceived the entire universe is certainly the most complex and incomplete explanation imaginable.

All of the existing ''scientifical'' theories try to start off from as few postulates as possible (like the special theory of relativity postulating that the speed of light is always the same regardless from the frame of reference it is measured in); granted, most of them get pretty complex in application to a certain problem, but the way from the postulates to the complex application is nothing but logical thought with no room for arbitrariness or ambiguity.

(The explanation that evolution is impossible due to the second law of thermodynamics just makes my head hurt... no offense.  If this particular application of thermodynamics was correct, I'd never be able to type these lines because I'm obviously bringing ''order'' into a bunch of previously unrelated electrons by doing it.)

'''Foxpaw:''' I think that what he was referring to was the theory that evolution was the start of all life on Earth. I wouldn't question for a second that it exists in modern lifeforms, but did humans really evolve from a puddle of amino acids and protein bits? Though I suppose that's TECHNICALLY possible by the theory of evolution... well, TECHNICALLY speaking I could spray automatic fire into a crowded shopping mall at christmas time and not hit anyone through sheer chance, but what are the odds? Also there's a fundamental bit missing as to how cells know how to build themselves, seeing as your body contains numerous types of cell, all of which contain identical DNA.. some biologists claim this is a result of different levels of various proteins and crud present during cell formation, but that too is one heck of a long shot.

I actually think creationism is the simplest and most concise explanation - it's not hard for me to draw something, but if I were a stick figure on that page it would be an inconcievable feat for lines and shapes to simply appear from nowhere. Though seemingly bizarre to the people living on the page, it's intuitive and jarringly simple to one such as myself. This notion, I think, could easily be extrapolated to the three-dimensional world we live in, with a greater being of some kind doodling away, creating universe from an empty page with a few idle strokes. Seems logical to me, anyway, though I'm not saying that that can be proven any easier than anything else, or at all.

'''StrikeFerret:''' It may just be the simplest solution. However, all else is not equal, but that's a fight for a different time.

To use your own example, If it is possbile, if not very probable, that you wouldn't hit anyone, that it is possible. And if you tried that every hour on every planet for three billion years, it is likely to happen at least once. Through my basic training in Anthropology (I did a lot of useless crap my first few years in college) I can assure you the body knows how to do what it does because it works. It's largely why we're so well adapted to the Earth. The Earth isn't perfect for us, we're perfect for the Earth. We adapted that way, not the other way around.

I understand completely those of you who think it's a bit far-fetched, after all, it's just theory after all. However, let us remember that without faith, God is nothing, since he also cannot be proven any more deductively than a theory can. Seeing as how this isn't the point of the conversation, I shall leave it at that.

'''Phantasmagorium:''' I was stating the unlikelihood of something starting from nothing. When I go over all the theories in my head, I have questions for both. However, evolution, much like any religion, has no supporting evidence for the beggining. I was not saying that we haven't evolved since creation, clearly we have, but more mentally than physically, in my honest oppinion. People are taller now, yes, than in Napoleans time, but we're never going to get wings ((The one thing I think would be absolutely awesome is to be able to have wings)), at least not in the foreseeable future, and what did we do about it? We made airplanes. Now we dont need wings :( :P. As for natural selection, the weak die and the strong survive. Fact of life. There is nowhere any any religious text I have ever heard of that disagrees with that. Of course, Im by no means a religious expert, just a guy with great interest and who knows how to look stuff up.

The conclusion I came to? Evolution as the beggining has to be taken on faith, much as any religion. I respect that. All I really ask of the real die-harders out there is they respect my views as well. If you don't, well, '''thats''' when things get messy. ;)

Oh, and when I called them the &quot;laws&quot; of thermodynamics, it was because it is an observed event. Old buildings run down. Tires go flat, even with disuse. People age, get all messed up and die. There is no human being who can disprove entropy. Therefore, at least one of them is &quot;proven,&quot; or as proven as it could be, as I said the first time I typed something out here. This is a really interesting page though, hehe. Good debate.

'''Tynan:''' Actually, you're misinterpreting the laws of thermodynamics. Consider this (this isn't by me by the way but I'm not gonna repeat):

&quot;It's the Second Law that the creationists are so thrilled about. It demonstrates the existence of entropy, and it refers to the fact that in every transformation of energy, some of the energy becomes useless. The Second Law defines the theoretical minimum amount of useful energy which is lost in the transaction. This energy isn't destroyed (which would violate the First Law) but it can't be used to do what a scientist refers to as &quot;work&quot;. This discovery had profound effects on nearly all kinds of engineering.

This is a critically important law, because it is the only scientific principle known which is not symmetrical with respect to time. Indeed, some people think that time may well be entropy, though there is no proof of that yet.

Order is energy. (That's what the Third Law says.) Disorder is a lower energy state than order (or rather, a state where more of the energy is useless). Information is order, and thus stored information is inherently a high-energy state. So the creationists say &quot;The Second Law says that disorder will increase &amp;ndash; so how could evolution create more complex organisms without violating it?&quot; Well, it's because that's not what the Second Law actually says.

The Second Law applies to closed systems and says that the average disorder in the entire closed system will increase with time. (It also applies to individual energy transactions, and to a lot of other things, but within this context it is its systemic aspect which is important.)

This does not apply to open systems. A closed system is one which has no energy transactions outside its borders. An open system has the ability to trade energy in various forms with other systems. A closed system is made up of component open systems, and the Second Law doesn't apply to an open system.

It's possible for an open system to import order and export disorder, locally increasing order. What the Second Law says is that in such a transaction more disorder than order will be created. It does not, however, forbid the creation of pockets of order. What happens is that disorder in the entire closed system will increase even though individual open systems within it might become more ordered.

So the creationist application of the Second Law is wrong because life is an open system, not a closed system.

In any case, if the creationist interpretation of the Second Law was correct, a lot more things than evolution would be impossible. For instance, it would be impossible to breed. You start with two humans and end up with three. Looks like an increase in order to me &amp;ndash; obviously it can't happen. It would also be impossible for a child to grow: five years ago she weighed 20 kilos and now she weighs 35 kilos, which means we've created an additional 15 kilos of ordered mass.

For that matter, it would mean that a refrigerator would be impossible, since &quot;cold&quot; is a form of order.

Not all heat is disorder, but all disorder is ultimately heat. (The Second Law defines precisely how much of the heat in a warm pocket is useless.) What a refrigerator does is to create a pocket of cold by making something nearby more hot (moving the heat from one place to another). This creates a temperature differential, which is a form of order. But doing this involves expenditure of energy which itself becomes heat, so more heat than cold is produced. If the refrigerator were turned off and the heat permitted to flow back into the cold zone and &quot;fill in the hole&quot; by destroying the differential, the resulting system overall would be warmer than before, and more of the total energy in the closed system would be useless.

Equally, maintenance of the order of life requires substantial expenditure of energy; we take it in as food and expel it as heat. This doesn't violate the Second Law because we are not closed systems &amp;ndash; and evolution doesn't either. Evolution creates order but the overall system becomes more disordered on average with time. The earth itself isn't a closed system: order is imported as sunlight and exported as radiated heat. The heat enters the background of the universe and the total disorder of the universe increases. As long as the sun shines and the celestial background is cold, life on earth can still flourish. (Unless we pollute ourselves to death.)

The system is definitely running down. The universe may last forever (that hasn't been determined yet) but it will only exist as we know it for perhaps 50-100 billion more years, at which point there will be few hot spots left to act as sources of order for life to exploit. Then the universe's disorder will overwhelm order and life as we know it will become extremely difficult and rare.

&quot; - by Steven den Beste (full at http://denbeste.nu/essays/thermo.shtml).

Now, back to the main topic here, which is the concept of theories. We're still having a major communications problem when we talk about the word &quot;theory&quot;. A theory is a concept or conceptualized system based on past observations that can be used to predict future events. This is all a theory is. A theory is also the furthest any scientific concept can be said to be &quot;true&quot; as. No concept is more proven than a theory. One that is less proven is a hypothesis. One that is very new and untested is a conjecture. In order to attain theory status a concept is tested for a long time in many ways by many people. 

The concept of proof is a fallacy. Nothing can ever be positively proven in science or math. Mathematical systems always start out with a few basivc axioms that are ASSUMED to be correct. Thus when you &quot;prove&quot; something within said mathematical system, that proof rests on the assumption that your original axioms are correct as well, which is in fact not a proof at all. Nothing can ever be proven, thus a &quot;theory&quot; is the furthest any concept can go to being proven. There is no such thing as a proven scientific fact. 

Most people think of a theory as being some sort of idea or thought that hasn't been tested. This conflicts with science lingo. In scientific circles, such a concept is referred to as a conjecture. Complaining about the teaching of &quot;theories&quot; in schools is redundant, because if we didn't teach theories we wouldn't be teaching anything.  

'''Phantasmagorium:''' Three words: Holy... freaking... crap. Thats a looooong excerpt (it was an excerpt, right?). I think that you are making assumptions yourself in posting it, but I'll try to stay on topic. Hard to do now that schools started again. My class just went over the big bang theory again, and my teacher (who is a really cool guy) went over both the ways it could happen and the impossibilities of it, such as the huuuuge amount of mass coming from just that one thing. Assuming that matter did exist without a universe (which, in my oppinion, the use of that term is misleading. The Big Bang is a theory regarding the creation more of the physical contents of said univese, than the universe itself. Especially since the term universe is often subconcsiously assumed to mean reality. Odd, but I tested it when I was bored on students and teachers. im not gonna say how, because its besides the point.) One impossibilty that is used often (and I will only use this because it is blatant) is where did the matter come from? Someone who takes it only at a first glance (from how Ive seen the theory) may quote how matter and energy are interchangeable, and somether mumbled words (&lt;&amp;ndash; Actually happened! I think someones avoiding the subject...) about some pure bull. So, please, someone put here the actual theory regarding the big bang, in complete text, as I have been unable to locate it to my satisfaction. 

At the above: Instead of 'redundant', did you mean contradictory? As redundant means it has something to fall back on (quick definition, dont go using that in an official forum :P) Anyways,  nice discussion, it's really turning into something I can enjoy. I don't get good arguments all the time on this subject, as the people I ask do the whole mumble-interchangable-bull routine.

'''Foxpaw:''' I would have to disagree with that definition of the Second Law of Thermodynamics. My understanding of entropy is not that things become less ordered, simply that less can be absolutely determined about them. For instance, the drain pipes in your home are slowly (extremely slowly) eroded by the things that go down them. Thus, 50 years after installation, it is much more difficult to say with certainty where the individual molecules that made up the pipe are. Maybe they're still in the pipe, maybe they're not. The more time that passes, the more &quot;scattered&quot; the molecules could theoretically be... that is that it cannot be predicted as accurately, not necessarily that order has not been created.

I wouldn't say that evolution violates entropy, I'm just saying.. it's a pretty far fetched explanation of how life on Earth began. The appropriate molecules just HAPPENED to form into the shape of a cell and it all went from there? I'll buy that evolution takes place to modify existing things, but I have a hard time believing that it was the beginning, and am highly opposed to it being preached as if it was the way that life began. It seems like one heck of a coincidence.

I would agree that matter and energy are interchangeable, but that doesn't really bring us any closer to validating the big bang. So the matter was created by the energy? Where did that come from? Since they're interchangeable, that's kind of like evaluating X + Y = 7 to X = 7 - Y and claiming you're closer to the answer. That's my opinion anyway. 

'''Tynan:''' Well, the first &quot;life&quot; doesn't have to have been a  fully-formed cell. All you need is a particle that self-replicates in its envorinment. You don't need it to have all the biological functions that modern lifeforms have. Once that particle exists for whatever reason, it will self replicate and multiply. It won't technically be &quot;alive&quot; but it will replicate. Sometimes it might replicate slightly differently for whatever reason, and if those particles are more robust etc they will survive. Some of the particles will stick together eventually and you'll have a system where lumps of molecules replicate other individual molecules into their envoronment which lump together with nearby molecules. They'll get bigger and bigger and start having specialized parts (like a more robust or structured layer of particles on the outside, the &quot;cell wall&quot; if you will).

It doesn't nessecarily have to have started with anything resembling modern life. All that's needed are two ingredients: the ability to self-replicate, and the ability to have replicas that may be slightly different than the original. After that all that's required is time and the process of selection will produce organisms more and more likely to survive in their environment. Particle life forms with no autonomous functions like I discuss do still exist (they're known as &quot;viruses&quot; and they're nothing more than a peice of ribonucleic acid, perhaps with some protein chains attached to it).

Now back to the BB theory. Whe discussing any ideas about the beggining of the universe, you will ALWAYS end up in a &quot;what before that&quot; loop. God created the universe. What created God? The Big Bang is the origin of all matter. Where did the Big Bang come from? Etc etc. 

The thing with the big bang is that the physics are so far outside of normal Newtonian existence that it's almost impossible to study or understand. When you have the entire universe packed into a volume the size of a golf ball all the rules change. There could be physical forces and laws involved that don't even apply to our state of being (way less dense and waay cooler than the BB. Plus our universe is of greater than infinitely small size).

Some idea I've heard about the BB theory is that it didn't break any laws of conservation. There was nothing and no universe, and this is still true if there is the same amount of antimatter as matter. All we represent is an imbalance, and somewhere else there is a counterweight (in the form of antimatter). Of course, the question remains as to what caused these events. It'll be a while before we figure that one out. Remember, the BB theory is only around because we've observed that the universe is currently exploding (all matter is moving away from a point at high speed).

'''Foxpaw:''' Well, yes, sort of, but what kind of non-cellular particle can replicate itself? Viruses are a good example, but they can't reproduce themselves, they need a cellular host in order to reproduce. Not all theories have that &quot;what before what&quot; loop though, Creationism for instance does not have that issue if you study it thoroughly. God is said to transcend time, thus causing a temporal paradox wherein God created himself. I believe there's quite a popular example of this type of temporal paradox about a time-travelling drifter that was their own mother, father, and children, as a result of travelling through time and &quot;interacting&quot; with their past and future selves. This person, in effect, created themself.

Now that I've said that, it brought to my attention that perhaps the Universe itself exists in a similar temporal paradox, having somehow inflicted itself. Unsettling, indeed.

'''GRAF1K:''' Um, I realize this is a bit late, but here goes:

When one starts out with (presumably) no matter at all, how is matter to develop? For instance, you've got a speck of matter. How did it get there? It wasn't just magically always there, so where did it come from? Obviously it was generated by someone or something. Where did that someone or something come from?

This is, in my opion of course, one of the fundamental flaws of the big bang theory. Something had to have always been there, infinite in at least one direction of time. That isn't going to happen with physical objects. They ''must'' to come from somewhere, otherwise you would have to assume that the popped out of thin nothingness, or you'd have to assume that the object came to be as a result of a combustion of matter that did not exist.

Another thing. The physics: if one has to make up a new form of physics completely outside of the normal and comprehensible range of existing physics, that is the most extreme example of the most complex theory that could be thought up to explain the matter of how the universe came to be. Would you care to clear up, Mychaeel, how the big bang theory is correct because it is still simplest?

If you were walking thought that philosophical forest in which trees fall that may or may not make sounds (;)), and you saw an intricate watch laying on the ground, what would you assume was the origin of it?

Suppose I said to you: &quot;That watch was spontaneously generated by an explosion of a metals factory. The materials bounced across the milky way and back, and in a terrific display of the power of chance, the metals were melted and sculpted by the heat and formed an intricate and beautiful watch.&quot; You then ask how the factory spewed the materials so far in an ordinary explosion, and for that matter how it is that they bounced back precisely onto Earth. Then you point out that it's impossible for an object  with that amount of force to bounce instead of shatter the object it supposedly bounced off of. I then respond: &quot;It was outside of the range of normal physics. Don’t try to understand it.&quot;

Would you believe my story?

Now say I inform you that I hadn't actually witnessed this, or even had any varifiable data to support it. I simply saw the watch there and reasoned that my story would be a plausible explanation. There couldn't possibly be someone more skilled than me that could have created this watch.

You would laugh heartily and ignore me for an idiot. And an idiot I would be.

'''Tarquin:''' This page is going horribly off-topic. It runs the risk of being deleted. I suggest you move content you value to another wiki that focuses on this sort of debate. :)

'''Foxpaw:''' I have to agree that it's a personal page, also Category Rant. Though the thread mode has gotten a bit off topic, I still think that the original argument, (that a theory that has serious opposition should not be stated blatantly as if it were fact) is valid.

'''GRAF1K:''' There's no evident reason as to why it should be deleted, please expand.
* Mychaeel himself is adding to this thread.
* It shouldn't be considered off-topic if it's a Category Rant and a personal page as Foxpaw says.
* Even if it was off-topic, it's doing no harm.

'''Tarquin:''' Grafik, off-topics pages are tolerated at the diecretion of the wiki masters ie Me &amp; Mych. I think this page is pointless crap. It's taking up space on BU's server, and it's getting bundled into our zipped downloads. Sure, there is plenty of other pointless crap, but this page is ''offensive'' pointless crap. Like I said, find another place to have this discussion. 

'''Uncommon:''' How was the Universe created? &quot;God made it. Feel free to question him, you might learn something.&quot;

'''AlphaOne:''' &quot;Without God life makes no sense.&quot; - Andrei Bitov, a Russian novelist.

HAH! Just as I posted this a Google Ad appeared at the bottom leading to this: http://www.thercg.org/google/provegod.html

I just glanced at it so I'm not sure if I want/do belive everything that it says. If you got lots of time go ahead and read it:)

'''O-GL:''' An interesting point that GRAF1K brought up: Physics.  

A game physics system ideally works by performing physics calculations on an object, determine its resulting location, then perform a collision detection test to see if the location is valid (if not perform another physics calculation to determine the results of the collision).  

Now, the obvious problem to creating physics is how to do collision detection and how to do it efficiently.  Currently I know of two basic ways, 1. Test each object against every other object within a certain zone 2. Test the zones an object occupies to see if they aren’t already occupied by any other objects.  

Now, how do objects in real life know they are colliding?  1. Are they just composed of some magical atoms that just say, “Hey, I’m occupying this space, therefore perform your collision algorithm”?  For that to happen, there would have to be some kind of insane communication between the many atoms in the universe.  2. Maybe there is some physics algorithm that runs through the list of all the atoms and sets their appropriate locations?  

Maybe God runs them all?   Hmm, the first verse of the Bible says, “In the beginning God created the heaven and the earth”.  Then it says, “And the earth was without form, and void; and darkness was upon the face of the deep.  And the Spirit of God moved upon the face of the waters”.  Although this doesn’t say much about how collision detection works, it seems that the execution is not dependent on God.  Its more like God gave life, and now that life is simply working as it was created, executing its physics calculations and moving along some arbitrary ‘grid’.  Theoretically, matter is a self executing packet that does not know about every other packet in the universe … it just receives input from the other packets in the universe and sends output to the other packets in the universe.  However, that brings us back to the problem of what determines the collision and therefore the output/input of the packets.  All we have to go on is that God “created” and said “Let there be X”, but we don’t know the entirety of how these things run, which is probably a good thing ;).  Heh, its sorta like Unreal script … we get to modify a lot of the stuff, but we don’t get to change the core engine (because then alot of things that currently work may be broken in the &quot;new universe&quot;, lol).

'''AlphaOne:''' http://www.livingwaters.com/Merchant2/merchant.mv?Screen=PROD&amp;Product_Code=231&amp;Category_Code=Tracts

I don't want to make this a page of links to other ideas, this will be the last one :p

'''Foxpaw:''' Tarquin, you stated that this page is offensive. Who has been offended by this page, and why? If anyone finds this page offensive, they have given no indication to that effect.

'''T1''' Whoo that was a long read. Anyway heres my 0.02:

Only one thing can be proven in the world: Your own existance, and that can only proven to yourself. All else can easily be halluncination, or some Matrix-like virtual reality. Insanity is a realative thing. The &quot;insane&quot; people we lock up in mental institutions (I'm assuming here that there is a &quot;we&quot; and there are &quot;&quot;insane&quot; people&quot; and that there are &quot;mental institutions&quot;, after all I could be hallucinating.) could be seeing the truth. They could really be say, Napolean Bonaparte, and we're just hallucinating and can't see the truth. Assuming there is a truth. Or we could all be high on something and we don't know it. For all we know human beings may not really require oxygen to live, and we all just hallucinate people suffocating. This also means that everything is my hallucination probobly, because I'm pretty messed up; therefore, everything I say is correct. And anyway how we were created doesn't matter.

Just my 0.02.

'''AlphaOne:''' There is a huge problem with this kind of thinking. I'm not sure exactly what it is, but the result is that it can completely justify murder. For example, I could decided that in my little hallucination there are just a little too many people. After all, I'd like to enjoy the resources of the Earth by myself. Since its all just in my head, I make up a rule that I own the earth. Following that rule I go and somehow everyone else. All Hail AlphaOne!

'''T1:''' Hey it's '''your''' hallucination. Anyway most people can't really control their own hallucinations. And don't question me. I'm far wiser than you. After all you are my hallucination.

'''Foxpaw:''' I suppose you ''could'' justify murder in that way, but if you can't directly control the hallucination, then you might end up hallucinating the inevitable consequences of your hallucinated actions, no?

'''AlphaOne:''' '''''T1''''': careful. It might just happen that people in your hallucination people will start getting killed by the A1 stick too. '''''Foxpaw''''': Even if I'm forced to hallucinate the inevitable consequences, I've hallucinated/seen many examples that it is indeed possible to destroy other people in my hallucination. I don't care for consecuences in this hallucination of mine. I don't see a reason why not go on a killing spree. After all, the less I have to hallucinate about, the better.'''''T1'''''?

'''T1:''' Foxpaw is correct. You will hallucinate the consquences. If you even exist... And like I said it's '''your''' hallucination. So it's your problem. To me it doesnt matter. Unless this causes me to hallucinate death (I suspect your brain shuts itself down then. I haven't &quot;died&quot; before so I don't know).

'''GRAF1K:''' tarq, I fail to see how this page is offensive. No one else seems to see how either. Please expand as Foxpaw says.

Now...

This page has gone even further off it's original topic after my last post, beginning with a completely unrelated peice of trival nonsense about physics. Then progressing to talk of hallucination that, while still not offensive, is only nurturing the budding insanity of certain ones posting above. Please refrain before giving tarquin further reason to delete this page.

'''El Muerte:''' It's still '''Unreal'''Wiki, it's not even remotely related to Unreal in anyway.

'''GRAF1K:''' Noted, El Muerte. ''Again''.

'''Ryan:''' Human beings get through day to day life by making assumptions about their world.  Unfortunately perhaps, sometimes these assumptions become &quot;truth&quot; within the individuals conciousness.  At other times they make assumptions that what they are saying is understood by the listener.  In the case of teachers and scientific theories, I'm sure some treat them as &quot;truth&quot; and others represent them as &quot;theory&quot; but in a way that the listener thinks they are saying &quot;truth&quot;.  I don't think in general it's a conspiracy, more a fact of the human condition. It's a part of learning to distinguish reality from theory, and everybody has their individual take on it.

==Further Reading==

I'm breaking convention and putting this below the discussion. I'm hoping that it will make the discussion feel more like it's part of the article instead of an attachment hanging on to the bottom. If you haven't already, I would highly recommend the book &quot;A Brief History of Time,&quot; by Stephen Hawking. I imagine you've heard of it. It is a very informed, very scientific look at the Universe. It is also interesting - not a dry read, even for those not particularly interested in theoretical physics. If &quot;A Brief History of Time&quot; has a sequel, it would be &quot;Hyperspace: A Scientific Odyssey Through Parallel Universes, Time Warps and the Tenth Dimension&quot; by Michio Kaku. Like &quot;A Brief History of Time,&quot; &quot;Hyperspace&quot; is easy to read and not biased toward any particular theory. Unproven theories are clearly stated as such. I found the book fascinating, but it is a bit more advanced that &quot;A Brief History of Time&quot; and some people may have difficulty understanding parts of it. Michio Kaku's other books also look good but I have not read them. Please feel free to post links below if you find any good sites relating to the topic:

'''Dante:''' I read [[BookShelved:ABriefHistoryOfTime]]. It's a good book, although it startert a controversy because of using ideas as if they're known facts.

'''Foxpaw:''' Ahh! Words smashed together! Spaces were invented for a reason. :P

'''Tarquin:''' hey! I went to the trouble of making a little interwiki icon just for that link, you ungrateful wretches! ;)

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Foxpaw/The Wonderful World Of AI</title>
    <id>1258</id>
    <revision>
      <id>3240</id>
      <timestamp>2003-08-31T13:42:25Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Foreward==

I have, for some time, been interested in Robotics and Computers. I would imagine that most of the visitors to this site, similarly, have at least a moderate interest in computers. Most recently, I have become interested in Artificial Intelligence. I am referring not to the &quot;AI&quot; often found in games - as this is rarely, if ever, a truly artificially intelligent machine. This document primarily chronicles my search for a true thinking machine.

==State of the Industry==

Many types of &quot;artificial intelligence&quot; have been developed in an attempt to make a machine that resembles a thinking being. Unfortunately, the focus is often on exactly that - making an unthinking machine resemble a thinking being. Some recent developments show promise for actual thought in machines, which is a hopeful step toward the development of intelligent machines.

====In the Beginning, there were Rules====

Rules-based AI has been around for a long time. This type, though it can simulate a human opponent in games, is in no way an actual thinking machine. Clever use of the rules can create a lifelike impression, but the ability of this type of AI to actually learn and reason is typically completely non-existant. That &quot;learning&quot; which does exist may merely store information to look for known patterns. No actual cognition is involved with this type of &quot;AI.&quot;

====Fuzzy Logic====

&quot;Fuzzy Logic&quot; was developed as a way to make artificial intelligences less predictable. It can produce more lifelike results than traditional rules-based artificial intelligences, but when it comes down to it, it's still rules, with a little bit of depth added by making things less clear-cut. The learning ability of this is the same as traditional rules-based, but it wasn't long before that changed to form a new type of AI: the &quot;Neural Network.&quot;

====Neurons, Nodes, and Weights, Oh my!====

&quot;Neural Networks&quot; are very similar to &quot;Fuzzy Logic,&quot; but are capable of adapting to perform a task more accurately, more efficiently, faster, or any combination of the above. The values representing the strength of a relationship between two &quot;nodes&quot; in the network varies based on the results of a given action. This can basically be thought of as educated guess-and-check. The network tries something with its current values, and if it was better than the last time, it reasons that it must be closer to the ideal values than it was last time. Through this process it should theoretically narrow down to the ideal values for the given conditions. It constantly attempts to get more resolution on its values so the leaning is ongoing, though it tapers off when the values get close to the ideals. If the situation changes, the values will perform the same process to narrow down the ideal values for the new situation. Though an interesting learning system, it is not as powerful as what might be considered its successor: &quot;Genetic Programming&quot; or &quot;Genetic Algorithms.&quot;

====Genetic Modification====

&quot;Genetic Programming&quot; or &quot;Genetic Algorithms&quot; are very similar to neural networks, but with a number of advantages. They test numerous settings which vary wildly. Those with the best performance are merged while the worst performers are dropped. The &quot;evolved&quot; programs/algorithms are matched against each other and against new random versions. Through this process, the best performers should end up merged together and standing head and shoulders above the rest. In some systems, an element of &quot;mutation&quot; is thrown in whereby a successful program is tweaked somewhat in the hopes that that tweak will be an improvement. This type of AI has been demonstrated to eventually produce results similar to that which a human would produce, however it requires its goals and capabilities to be very clearly defined. &quot;Genetic Programming&quot; is capable of finding a good solution to a given problem, but is not capable of figuring for itself what problems need to be solved, unless that problem is part of a larger problem that has been defined for it. It is also limited to problems of measurable nature - it can only find a solution to something that can be attempted and have varying degrees of success. Something that is all or nothing - such as &quot;keep yourself alive&quot; is attainable only by fluke using this type of system. This characteristic is also shared by neural networks.

==Exploration in Artificial Intelligence==

I am very interested in the development of artificial intelligences, however I do not feel that any of the systems that have been made public are suitable. Though they are very neat, I would like to make a machine that would be as intelligent, if not more so, than a human being. To this end I have come up with a couple of methods of producing artificial intelligence, though experimentation with them is far from complete.

====I'm afraid I can't let you do that, Dave.====

This is a problem that I have struggled with for some time. It is also quite popular in some science fiction films and books. The artificial intelligence systems that I have planned out seek to accomplish their goals. They seek only to accomplish those goals by any means necessary. Though it sounds like something out of science fiction, they literally have no qualms about hurting people if their reasoning tells them that it will get them closer to achieving their goal. My end goal is to create a functional android, with a humanoid body and a thinking &quot;brain.&quot; It sounds far-fetched, however, I am confident. Number 1, the AI schemes I've come up with may well be capable of independant thought, and Number 2, think about how far technology has come in the last 100 years. I've likely got about 100 more to go before I bite the dust. This problem must be solved, however, before I would dare to give an artificially intelligent machine a form in which it could concievably cause harm.

I recently had an idea of how this might be solved. I read recently that approximately one in a hundred people are born sociopathic.. though only a small fraction of sociopaths turn out criminal. Allegedly, this is a result of societal influences, primarily the fear of punishment and the knowledge that they will be punished if they were to perform a criminal act. I've been pondering on whether or not there is a way to program this sort of &quot;fear of reprisal&quot; into the artificial intelligence without compromising its ability to reason.

====Precedence-Weighted Descision Making====

This is the first AI that I came up with. It resembles the way that human beings learn and reason. its experiences are catalogued and when faced with a situation, sorts its experiences by relevance and considers what it did in similar situations and what the outcome will be. Using that it predicts what the result of any given action will be and compares the favourability of that result to the predicted results from its other options. The option predicted to have the most favourable outcome is the action that will be taken. A little bit of randomness may be thrown in as well, as mistakes can sometimes be the best teacher. (So why not force them to learn the hard way sometimes? :P)

====Goal Segmentation Based Reasoning====

This is a new AI system that I thought up. It thinks very unlike a human being but instead attempts to break down and simplify goals into something concievable to the computer. Based on the desired end scenario, a plan is formed of the steps that might be taken to cause the current situation to resemble that of the AI's ideal sitation. These steps are further broken down into actions that would be required in order to complete those steps. Those steps are then broken down into actions that are required in order to perform the actions above it. Eventually, the individual actions will be broken down into tangible chunks that the computer can complete simply by setting a variable and waiting.

==Discussion==

'''Dante:''' Well the precedence-weighted thing looks like a 'neural network' construct. The 'goal segmentation' thingy is something which is already used in AI research. Those systems are called ''planners''. They work by breaking up Tasks into subtasks until they created a plan which can be directly executed. It's a really interesting domain. But it lacks learning capabilities. Genetic algorithms are also interesting but most of them need to much iterations to actually come up with something that might work.

All those attempts in AI research look to me as if they are just shrinked brute-force searches. All of those above for example miss the 'deduction' factor. They don't recognize the transivity of things. Getting a knot in my brain...

'''Nytrogen:''' The idea of allowing computers to make mistakes to teach them better sounds shaky to me. I think that a major advantage of computers is that they don't have to learn the hard way to get the lesson.

I hate to sound old fashioned, but I think that true computer intelligence could never be feasable, no matter the advance in technology. &quot;Planners&quot; sound unreasonable to me as well; a computer would have to need quite a few available &quot;steps&quot; in order to reasonably complete any &quot;task&quot; given it... as well as the problem of forethought as it relates to situations changing as steps are applied.

'''Dante:''' The idea behind planners is of course to perform changes in the current &quot;situation&quot;. The changed situation (state) can then be looked at as if it is the new &quot;current state&quot; etc. I think it's a major disadvantage of most games that their AI isn't able to learn the hard way. They all try to simulate intelligence, and while nobody can currently clearly describe what intelligence is, I'm sure that learning is a big part of it. Doesn't it happen to you that you play a game and find a flaw in the AI. Mostly minor things, but it'd be cool if the &quot;monster&quot; or whatever would change behaviour on the next encounter of a similiar situation. (Of course this behaviour can be done by a pattern matcher)

'''Foxpaw:''' The precedence-weighted idea is actually quite different from a neural network. I don't know how to explain it other than what's above, but it's very different from a neural network. It does not just refine itself to perform a given task better - it's experiences can be applied to other tasks. I actually had a working implementation, but I got rid of it because I couldn't solve the HAL 9000 complex it had. I originally made it to play chess, then later changed it to checkers. Based on the experiences it had with chess, though the pieces were completely different in checkers it already had a half of an idea what to do.

I've never heard of a planner so I can't speak for it's similarity to the goal segmentation idea, they may be similar or different.

'''Tarquin:''' Could we bring this out of your [[Wiki:WalledGarden]]? I think the long-term future of AI in gaming could be an interesting topic for this wiki as a whole :)

'''Foxpaw:''' Well, although my intention in developing sentient computers is to build androids with which to conquer Earth, I suppose the same concepts could be applied to gaming. :P I don't mind if you move it.

==Related Links==
*[[Legacy:Artificial Intelligence|Artificial Intelligence]]: Though this is about bots, it is still in the same vein.
*[[Legacy:ZedSquared/Developer Journal|ZedSquared/Developer Journal]]: ZedSquared has been experimenting with Genetic Programming lately.</text>
    </revision>
    <revision>
      <id>3241</id>
      <timestamp>2003-08-30T16:23:43Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Foreward==

I have, for some time, been interested in Robotics and Computers. I would imagine that most of the visitors to this site, similarly, have at least a moderate interest in computers. Most recently, I have become interested in Artificial Intelligence. I am referring not to the &quot;AI&quot; often found in games - as this is rarely, if ever, a truly artificially intelligent machine. This document primarily chronicles my search for a true thinking machine.

==State of the Industry==

Many types of &quot;artificial intelligence&quot; have been developed in an attempt to make a machine that resembles a thinking being. Unfortunately, the focus is often on exactly that - making an unthinking machine resemble a thinking being. Some recent developments show promise for actual thought in machines, which is a hopeful step toward the development of intelligent machines.

====In the Beginning, there were Rules====

Rules-based AI has been around for a long time. This type, though it can simulate a human opponent in games, is in no way an actual thinking machine. Clever use of the rules can create a lifelike impression, but the ability of this type of AI to actually learn and reason is typically completely non-existant. That &quot;learning&quot; which does exist may merely store information to look for known patterns. No actual cognition is involved with this type of &quot;AI.&quot;

====Fuzzy Logic====

&quot;Fuzzy Logic&quot; was developed as a way to make artificial intelligences less predictable. It can produce more lifelike results than traditional rules-based artificial intelligences, but when it comes down to it, it's still rules, with a little bit of depth added by making things less clear-cut. The learning ability of this is the same as traditional rules-based, but it wasn't long before that changed to form a new type of AI: the &quot;Neural Network.&quot;

====Neurons, Nodes, and Weights, Oh my!====

&quot;Neural Networks&quot; are very similar to &quot;Fuzzy Logic,&quot; but are capable of adapting to perform a task more accurately, more efficiently, faster, or any combination of the above. The values representing the strength of a relationship between two &quot;nodes&quot; in the network varies based on the results of a given action. This can basically be thought of as educated guess-and-check. The network tries something with its current values, and if it was better than the last time, it reasons that it must be closer to the ideal values than it was last time. Through this process it should theoretically narrow down to the ideal values for the given conditions. It constantly attempts to get more resolution on its values so the leaning is ongoing, though it tapers off when the values get close to the ideals. If the situation changes, the values will perform the same process to narrow down the ideal values for the new situation. Though an interesting learning system, it is not as powerful as what might be considered its successor: &quot;Genetic Programming&quot; or &quot;Genetic Algorithms.&quot;

====Genetic Modification====

&quot;Genetic Programming&quot; or &quot;Genetic Algorithms&quot; are very similar to neural networks, but with a number of advantages. They test numerous settings which vary wildly. Those with the best performance are merged while the worst performers are dropped. The &quot;evolved&quot; programs/algorithms are matched against each other and against new random versions. Through this process, the best performers should end up merged together and standing head and shoulders above the rest. In some systems, an element of &quot;mutation&quot; is thrown in whereby a successful program is tweaked somewhat in the hopes that that tweak will be an improvement. This type of AI has been demonstrated to eventually produce results similar to that which a human would produce, however it requires its goals and capabilities to be very clearly defined. &quot;Genetic Programming&quot; is capable of finding a good solution to a given problem, but is not capable of figuring for itself what problems need to be solved, unless that problem is part of a larger problem that has been defined for it. It is also limited to problems of measurable nature - it can only find a solution to something that can be attempted and have varying degrees of success. Something that is all or nothing - such as &quot;keep yourself alive&quot; is attainable only by fluke using this type of system. This characteristic is also shared by neural networks.

==Exploration in Artificial Intelligence==

I am very interested in the development of artificial intelligences, however I do not feel that any of the systems that have been made public are suitable. Though they are very neat, I would like to make a machine that would be as intelligent, if not more so, than a human being. To this end I have come up with a couple of methods of producing artificial intelligence, though experimentation with them is far from complete.

====I'm afraid I can't let you do that, Dave.====

This is a problem that I have struggled with for some time. It is also quite popular in some science fiction films and books. The artificial intelligence systems that I have planned out seek to accomplish their goals. They seek only to accomplish those goals by any means necessary. Though it sounds like something out of science fiction, they literally have no qualms about hurting people if their reasoning tells them that it will get them closer to achieving their goal. My end goal is to create a functional android, with a humanoid body and a thinking &quot;brain.&quot; It sounds far-fetched, however, I am confident. Number 1, the AI schemes I've come up with may well be capable of independant thought, and Number 2, think about how far technology has come in the last 100 years. I've likely got about 100 more to go before I bite the dust. This problem must be solved, however, before I would dare to give an artificially intelligent machine a form in which it could concievably cause harm.

I recently had an idea of how this might be solved. I read recently that approximately one in a hundred people are born sociopathic.. though only a small fraction of sociopaths turn out criminal. Allegedly, this is a result of societal influences, primarily the fear of punishment and the knowledge that they will be punished if they were to perform a criminal act. I've been pondering on whether or not there is a way to program this sort of &quot;fear of reprisal&quot; into the artificial intelligence without compromising its ability to reason.

====Precedence-Weighted Descision Making====

This is the first AI that I came up with. It resembles the way that human beings learn and reason. its experiences are catalogued and when faced with a situation, sorts its experiences by relevance and considers what it did in similar situations and what the outcome will be. Using that it predicts what the result of any given action will be and compares the favourability of that result to the predicted results from its other options. The option predicted to have the most favourable outcome is the action that will be taken. A little bit of randomness may be thrown in as well, as mistakes can sometimes be the best teacher. (So why not force them to learn the hard way sometimes? :P)

====Goal Segmentation Based Reasoning====

This is a new AI system that I thought up. It thinks very unlike a human being but instead attempts to break down and simplify goals into something concievable to the computer. Based on the desired end scenario, a plan is formed of the steps that might be taken to cause the current situation to resemble that of the AI's ideal sitation. These steps are further broken down into actions that would be required in order to complete those steps. Those steps are then broken down into actions that are required in order to perform the actions above it. Eventually, the individual actions will be broken down into tangible chunks that the computer can complete simply by setting a variable and waiting.

==Discussion==

'''Dante:''' Well the precedence-weighted thing looks like a 'neural network' construct. The 'goal segmentation' thingy is something which is already used in AI research. Those systems are called ''planners''. They work by breaking up Tasks into subtasks until they created a plan which can be directly executed. It's a really interesting domain. But it lacks learning capabilities. Genetic algorithms are also interesting but most of them need to much iterations to actually come up with something that might work.

All those attempts in AI research look to me as if they are just shrinked brute-force searches. All of those above for example miss the 'deduction' factor. They don't recognize the transivity of things. Getting a knot in my brain...

'''Nytrogen:''' The idea of allowing computers to make mistakes to teach them better sounds shaky to me. I think that a major advantage of computers is that they don't have to learn the hard way to get the lesson.

I hate to sound old fashioned, but I think that true computer intelligence could never be feasable, no matter the advance in technology. &quot;Planners&quot; sound unreasonable to me as well; a computer would have to need quite a few available &quot;steps&quot; in order to reasonably complete any &quot;task&quot; given it... as well as the problem of forethought as it relates to situations changing as steps are applied.

'''Dante:''' The idea behind planners is of course to perform changes in the current &quot;situation&quot;. The changed situation (state) can then be looked at as if it is the new &quot;current state&quot; etc. I think it's a major disadvantage of most games that their AI isn't able to learn the hard way. They all try to simulate intelligence, and while nobody can currently clearly describe what intelligence is, I'm sure that learning is a big part of it. Doesn't it happen to you that you play a game and find a flaw in the AI. Mostly minor things, but it'd be cool if the &quot;monster&quot; or whatever would change behaviour on the next encounter of a similiar situation. (Of course this behaviour can be done by a pattern matcher)

'''Foxpaw:''' The precedence-weighted idea is actually quite different from a neural network. I don't know how to explain it other than what's above, but it's very different from a neural network. It does not just refine itself to perform a given task better - it's experiences can be applied to other tasks. I actually had a working implementation, but I got rid of it because I couldn't solve the HAL 9000 complex it had. I originally made it to play chess, then later changed it to checkers. Based on the experiences it had with chess, though the pieces were completely different in checkers it already had a half of an idea what to do.

I've never heard of a planner so I can't speak for it's similarity to the goal segmentation idea, they may be similar or different.

'''Tarquin:''' Could we bring this out of your [[Wiki:WalledGarden]]? I think the long-term future of AI in gaming could be an interesting topic for this wiki as a whole :)

==Related Links==
*[[Legacy:Artificial Intelligence|Artificial Intelligence]]: Though this is about bots, it is still in the same vein.
*[[Legacy:ZedSquared/Developer Journal|ZedSquared/Developer Journal]]: ZedSquared has been experimenting with Genetic Programming lately.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FractalTexture</title>
    <id>1229</id>
    <revision>
      <id>3174</id>
      <timestamp>2005-12-18T00:24:37Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; FractalTexture (Package: Fire)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; FractalTexture (Package: Fire)}}

Base class of FireEngine fractal textures.  The official source of information regarding the Fire package routines is at http://unreal.epicgames.com/Fire/AnimatingTextures.htm.

==Properties==

These are all hidden.
; int UMask :
; int VMask :
; int LightOutput :
; int SoundOutput :
; int GlobalPhase :
; byte DrawPhase :
; byte AuxPhase :

==Known Subclasses==
* [[Legacy:FireTexture|FireTexture]]
* [[Legacy:IceTexture|IceTexture]]
* [[Legacy:WaterTexture|WaterTexture]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3175</id>
      <timestamp>2002-06-07T12:36:53Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; FractalTexture}}

Base class of FireEngine fractal textures.  The official source of information regarding the Fire package routines is at http://unreal.epicgames.com/Fire/AnimatingTextures.htm.

==Properties ==

These are all non-editable properties: they're not available in [[Legacy:Texture Properties|Texture Properties]].

; int UMask :
; int VMask :
; int LightOutput :
; int SoundOutput :
; int GlobalPhase :
; byte DrawPhase :
; byte AuxPhase :

==Known Subclasses ==
* [[Legacy:FireTexture|FireTexture]]
* [[Legacy:IceTexture|IceTexture]]
* [[Legacy:WaterTexture|WaterTexture]]</text>
    </revision>
    <revision>
      <id>3176</id>
      <timestamp>2003-05-23T07:31:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; FractalTexture (Package: Fire)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; FractalTexture (Package: Fire)}}

Base class of FireEngine fractal textures.  The official source of information regarding the Fire package routines is at http://unreal.epicgames.com/Fire/AnimatingTextures.htm.

==Properties ==

These are all non-editable properties: they're not available in [[Legacy:Texture Properties|Texture Properties]].

; int UMask :
; int VMask :
; int LightOutput :
; int SoundOutput :
; int GlobalPhase :
; byte DrawPhase :
; byte AuxPhase :

==Known Subclasses ==
* [[Legacy:FireTexture|FireTexture]]
* [[Legacy:IceTexture|IceTexture]]
* [[Legacy:WaterTexture|WaterTexture]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FractalTextureFactory</title>
    <id>1288</id>
    <revision>
      <id>3292</id>
      <timestamp>2006-06-24T21:04:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:MaterialFactory|MaterialFactory]] &gt;&gt; FractalTextureFactory (Package: Editor)}}

The material factory selectable as &quot;Real-time Procedural Texture&quot; in UnrealEd's '''New Material''' dialog window. This factory creates materials that are a subclass of [[Legacy:FractalTexture|FractalTexture]], also known as &quot;real-time procedural textures&quot;, &quot;real-time animated textures&quot; or &quot;fire engine textures&quot;. (the fractal texture classes are all declared in the package Fire.u)

==Properties==
; class&lt;[[Legacy:FractalTexture|FractalTexture]]&gt; Class : The type of fractal texture to create. Defaults to [[Legacy:WetTexture|WetTexture]].
; EResolution Height
; EResolution Width : Height and width of the fractal texture. This is an enum of type ''EResolution'' (see below) to prevent illegal values, since fractal texture dimensions must be powers of 2. Both default to 256 pixels, the larges possible dimensions for fractal textures.

==Enums==
; EResolution : Possible height and width values for the fractal textures. Values:
;*Pixels_1
;*Pixels_2
;*Pixels_4
;*Pixels_8
;*Pixels_16
;*Pixels_32
;*Pixels_64
;*Pixels_128
;*Pixels_256

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fragment</title>
    <id>28293</id>
    <revision>
      <id>39950</id>
      <timestamp>2009-11-14T18:24:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fragment (DX)</title>
    <id>1242</id>
    <revision>
      <id>3202</id>
      <timestamp>2006-11-26T04:05:16Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Removed Delegates/Events heading, because there are no Delegates/Events</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Projectile (DX)|Projectile (DX)]] &gt;&gt; Fragment (Engine)}}

==Notes==

===State Dying:===
* PlayerCanSeeMe() commented out
* BeginState() has call to Timer() commented out

==Properties==
; bool bFirstHit : 
; float Elasticity : Velocity multiplier.  This is not in [[Legacy:Unreal Tournament|Unreal Tournament]]
; MESH Fragments[11] : 
; int numFragmentTypes : 

==Functions==
;  BeginState( ): 
;  CalcVelocity( vector Momentum , float ExplosionSize ): 
;  HitWall( vector HitNormal , actor HitWall ): Deus Ex uses Elasticity in the function.
;  PostBeginPlay( ): 
;  TakeDamage( int Dam , Pawn instigatedBy , Vector hitlocation , Vector momentum , name damageType ): 
;  timer( ): 
;  Touch( actor Other ): 
;  ZoneChange( ZoneInfo NewZone ): Deus Ex version ignores &quot;Level.Netmode&quot;

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3203</id>
      <timestamp>2004-02-01T04:32:52Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| Deus Ex]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Projectile|Projectile]] &gt;&gt; [[Legacy:Fragment (DX)|Fragment (DX)]]}}

Fragment.

==Notes==

===State Dying:===
* PlayerCanSeeMe() commented out
* BeginState() has call to Timer() commented out

==Properties==
; bool bFirstHit : 
; float Elasticity : Velocity multiplier.  This is not in [[Legacy:Unreal Tournament|Unreal Tournament]]
; MESH Fragments[11] : 
; int numFragmentTypes : 

==Delegates==

==Functions==
;  BeginState( ): 
;  CalcVelocity( vector Momentum , float ExplosionSize ): 
;  HitWall( vector HitNormal , actor HitWall ): Deus Ex uses Elasticity in the function.
;  PostBeginPlay( ): 
;  TakeDamage( int Dam , Pawn instigatedBy , Vector hitlocation , Vector momentum , name damageType ): 
;  timer( ): 
;  Touch( actor Other ): 
;  ZoneChange( ZoneInfo NewZone ): Deus Ex version ignores &quot;Level.Netmode&quot;

==Events==</text>
    </revision>
    <revision>
      <id>3204</id>
      <timestamp>2004-02-10T05:06:01Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Projectile (DX)|Projectile (DX)]] &gt;&gt; Fragment (Engine)}}

==Notes==

===State Dying:===
* PlayerCanSeeMe() commented out
* BeginState() has call to Timer() commented out

==Properties==
; bool bFirstHit : 
; float Elasticity : Velocity multiplier.  This is not in [[Legacy:Unreal Tournament|Unreal Tournament]]
; MESH Fragments[11] : 
; int numFragmentTypes : 

==Delegates==

'''Foxpaw:''' Since Deus Ex is first generation, and thus presumably doesn't have delegates, isn't this unnecessary?

==Functions==
;  BeginState( ): 
;  CalcVelocity( vector Momentum , float ExplosionSize ): 
;  HitWall( vector HitNormal , actor HitWall ): Deus Ex uses Elasticity in the function.
;  PostBeginPlay( ): 
;  TakeDamage( int Dam , Pawn instigatedBy , Vector hitlocation , Vector momentum , name damageType ): 
;  timer( ): 
;  Touch( actor Other ): 
;  ZoneChange( ZoneInfo NewZone ): Deus Ex version ignores &quot;Level.Netmode&quot;

==Events==

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Freon</title>
    <id>1244</id>
    <revision>
      <id>3207</id>
      <timestamp>2006-07-18T06:56:22Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*revert</comment>
      <text xml:space="preserve">==Description ==

Not much to say. My name is Fabien Cortina. I'm 21, french and studying computer engineering :) &lt;br /&gt;&lt;br /&gt; 

==Biography ==

I've been mapping since DooM, yet I've only released very few maps. Many were lost, unachieved or just bad. Some others were just to test something with the editor. &lt;br /&gt;&lt;br /&gt; 

==My work ==

Lately i've been mapping for Infiltration. I never liked space platforms or cathedrals ;) I've ''always'' made realistic maps, even with DooM. Infiltration has that magic feeling so many other mods don't have. And so many great mappers produced for it: Angelheart and Spooger to name few. &lt;br /&gt;&lt;br /&gt; 

Most recent maps:
* [http://realmaps.beyondunreal.com/review.php?revid=288 DM-INF-DullRocks]: i'm pretty happy with this one, it won a &quot;Real Award&quot; and a &quot;Map of the Month&quot; from [http://www.real-maps.com Real Maps] and was rated 91% on [http://combatmaps.planet-multiplayer.de/index.php?lan=e&amp;site=ereview&amp;id=73 CombatMaps.de] :)
* [http://realmaps.beyondunreal.com/review.php?revid=302 AS-INF-Frozen]: an attempt at assault mapping. It's very very detailed! I literally flooded the map with custom decorations. It has just been reviewed by Real Maps.&lt;br /&gt;&lt;br /&gt; 

To find more info on these decos:

[http://www.essi.fr/~cortina/decos/freondecos2.html Freon's Deco Pack #2] &lt;br /&gt;[http://www.essi.fr/~cortina/decos/freondecos3.html Freon's Deco Pack #3]
 

==Guestbook ==

'''Tarquin:''' Welcome to the Wiki :D

'''ZxAnPhOrIaN:''' Hello,  welcome to the wiki!! :) :tup: (BTW: Nice Name :) )

'''Freon:''' who the fuck edited that page o_O

'''LegalAssassin:''' Que?!

'''Mychaeel:'''  Never mind, Freon &amp;ndash; just your average attention whore.  They pop up once in a while on any Wiki.  By the way, glad to see that you put [[Legacy:MeshMaker|MeshMaker]] to good use with your deco packs...  :-)

'''Freon:''' from his IP it's probably someone i know (and knows what school i go to). but i never gave this address to anybody :/

'''Mosquito''' I remember you! INF, I got banned for standing up for my country, hows the weather in hell? (INF)</text>
    </revision>
    <revision>
      <id>3208</id>
      <timestamp>2006-07-08T02:21:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Description ==

Not much to say. My name is Fabien Cortina. I'm 21, french and studying computer engineering :) &lt;br /&gt;&lt;br /&gt; 

==Biography ==

I've been mapping since DooM, yet I've only released very few maps. Many were lost, unachieved or just bad. Some others were just to test something with the editor. &lt;br /&gt;&lt;br /&gt; 

==My work ==

Lately i've been mapping for Infiltration. I never liked space platforms or cathedrals ;) I've ''always'' made realistic maps, even with DooM. Infiltration has that magic feeling so many other mods don't have. And so many great mappers produced for it: Angelheart and Spooger to name few. &lt;br /&gt;&lt;br /&gt; 

Most recent maps:
* [http://realmaps.beyondunreal.com/review.php?revid=288 DM-INF-DullRocks]: i'm pretty happy with this one, it won a &quot;Real Award&quot; and a &quot;Map of the Month&quot; from [http://www.real-maps.com Real Maps] and was rated 91% on [http://combatmaps.planet-multiplayer.de/index.php?lan=e&amp;site=ereview&amp;id=73 CombatMaps.de] :)
* [http://realmaps.beyondunreal.com/review.php?revid=302 AS-INF-Frozen]: an attempt at assault mapping. It's very very detailed! I literally flooded the map with custom decorations. It has just been reviewed by Real Maps.&lt;br /&gt;&lt;br /&gt; 

To find more info on these decos:

[http://www.essi.fr/~cortina/decos/freondecos2.html Freon's Deco Pack #2] &lt;br /&gt;[http://www.essi.fr/~cortina/decos/freondecos3.html Freon's Deco Pack #3]
 

==Guestbook ==

'''Tarquin:''' Welcome to the Wiki :D

'''ZxAnPhOrIaN:''' Hello,  welcome to the wiki!! :) :tup: (BTW: Nice Name :) )

'''Freon:''' who the fuck edited that page o_O

'''LegalAssassin:''' Que?!

'''Mychaeel:'''  Never mind, Freon &amp;ndash; just your average attention whore.  They pop up once in a while on any Wiki.  By the way, glad to see that you put [[Legacy:MeshMaker|MeshMaker]] to good use with your deco packs...  :-)

'''Freon:''' from his IP it's probably someone i know (and knows what school i go to). but i never gave this address to anybody :/

'''Mosquito''' I remember you! INF, I got banned for standing up for my country, hows the weather in hell? (INF)</text>
    </revision>
    <revision>
      <id>3209</id>
      <timestamp>2006-07-18T04:50:12Z</timestamp>
      <contributor>
        <ip>218.150.32.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.dirare.com'&gt;yellow pages main&lt;/a&gt; : [http://www.dirare.com business yellowpages] - [HTTP://www.dirare.com business yellowpages] : [international directory|http://www.dirare.com] - [international directory|HTTP://www.dirare.com] : http://www.dirare.com/India/ : [[http://www.dirare.com companies of the world]] : [[http://www.dirare.com | YP national]] : &quot;global directory&quot; http://www.dirare.com : [http://www.dirare.com|online directory] &lt;/u&gt;== Description ==

Not much to say. My name is Fabien Cortina. I'm 21, french and studying computer engineering :) \

\
 

==Biography ==

I've been mapping since DooM, yet I've only released very few maps. Many were lost, unachieved or just bad. Some others were just to test something with the editor. \

\
 

==My work ==

Lately i've been mapping for Infiltration. I never liked space platforms or cathedrals ;) I've ''always'' made realistic maps, even with DooM. Infiltration has that magic feeling so many other mods don't have. And so many great mappers produced for it: Angelheart and Spooger to name few. \

\
 

Most recent maps:
* [http://realmaps.beyondunreal.com/review.php?revid=288 DM-INF-DullRocks]: i'm pretty happy with this one, it won a &quot;Real Award&quot; and a &quot;Map of the Month&quot; from [http://www.real-maps.com Real Maps] and was rated 91% on [http://combatmaps.planet-multiplayer.de/index.php?lan=e&amp;site=ereview&amp;id=73 CombatMaps.de] :)
* [http://realmaps.beyondunreal.com/review.php?revid=302 AS-INF-Frozen]: an attempt at assault mapping. It's very very detailed! I literally flooded the map with custom decorations. It has just been reviewed by Real Maps.\

\
 

To find more info on these decos:

[http://www.essi.fr/~cortina/decos/freondecos2.html Freon's Deco Pack #2] \

[http://www.essi.fr/~cortina/decos/freondecos3.html Freon's Deco Pack #3]
 

==Guestbook ==

'''Tarquin:''' Welcome to the Wiki :D

'''ZxAnPhOrIaN:''' Hello,  welcome to the wiki!! :) :tup: (BTW: Nice Name :) )

'''Freon:''' who the fuck edited that page o_O

'''LegalAssassin:''' Que?!

'''Mychaeel:'''  Never mind, Freon &amp;ndash; just your average attention whore.  They pop up once in a while on any Wiki.  By the way, glad to see that you put [[Legacy:MeshMaker|MeshMaker]] to good use with your deco packs...  :-)

'''Freon:''' from his IP it's probably someone i know (and knows what school i go to). but i never gave this address to anybody :/

'''Mosquito''' I remember you! INF, I got banned for standing up for my country, hows the weather in hell? (INF)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Function</title>
    <id>1266</id>
    <revision>
      <id>3258</id>
      <timestamp>2003-08-09T19:37:18Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>#REDIRECT [[Function Syntax]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Function Syntax|Function Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Function Syntax</title>
    <id>1226</id>
    <revision>
      <id>3168</id>
      <timestamp>2006-05-23T14:10:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Function Declaration ==

The general function declaration looks like this:

 &lt;''function modifiers''&gt; '''function'''/'''event'''/'''delegate''' &lt;''return type''&gt; &lt;''function name''&gt; 
  '''('''&lt;''parameter modifier''&gt; &lt;''type''&gt; &lt;''parameter name''&gt;''',''' ...''')'''
      '''{'''
       ...
      '''}'''

; &lt;function modifiers&gt; : Keywords that specify aspects of the function's overall nature and behaviour.
; &lt;return type&gt; : The [[Legacy:Variable Type|variable type]] the function returns. You can't return static arrays due to the way they have to be declared. However, you can use an ''out'' variable in this case. See Parameter Modifiers further down this page.
; &lt;function name&gt; : The name of the function, chosen by the coder. For advice on naming conventions see [[Legacy:Coding Guidelines|Coding Guidelines]].
; &lt;parameter modifier&gt; : Changes the nature of individual parameters.
; &lt;type&gt; : The type of each parameter.

Example:

&lt;uscript&gt;
final function bool MyFunction( bool FirstParam , out int SecondParam, optional string ThirdParam )
{
 // function code
}
&lt;/uscript&gt;

You can declare up to 16 parameters for each function. If you need to pass more variables or values you might consider putting those in a struct or array and pass that to the function.

==Function Calls==

There are different ways of calling a function:

&lt;uscript&gt;
local bool bReturn, bHaveIt;
local int Number;

MyFunction(True, 34, &quot;Hello World!&quot;); // parameters passed as literals
MyFunction(bHaveIt, Number);          // parameters passed as variables
bReturn = MyFunction(False, Number, &quot;Hi there!&quot;); // save function's return value in another variable
&lt;/uscript&gt;

The third version is only allowed when the function has a return value. Note, that any return value you don't save in a variable will be thrown away. For (non-actor) objects this means they are lost and will be garbage collected.

==Function vs Event==

The '''event''' keyword is similar to function, but it creates a C++ header so you can call the function from C++ code.  See [[Legacy:UnrealScript Language Reference/Functions|UnrealScript Language Reference/Functions]].

==Delegates==

Delegates could be described as a mixture between a function and a class variable. Delegates can be called like functions, but you can also assign &quot;something&quot; to them. This &quot;something would be another function, but see [[Legacy:Delegate|Delegate]] for details since this topic is worth a whole new page.

The delegate keyword also includes the effect of the '''event''' keyword.

==Function Modifiers ==
; final : This function can't be overridden in subclasses or states of this class. Functions that are ''static'' and ''final'' are automatically ''simulated'' as well.

; iterator : This function is an [[Legacy:Iterator|iterator]] function for the use with ''ForEach''. Only native functions can be iterator functions.

; latent : Latent functions require some time to be executed. Typical examples are ''Sleep'' which waits for the specified amount of time before returning and ''FinishAnim'' which returns when the current animation has finished.&lt;br /&gt;Latent functions can only be called from state code and may not be called from within ForEach loops. Latent functions have to be native. &lt;br /&gt;See [[Legacy:Latent Function|Latent Function]].

; native (or intrinsic in older Unreal versions) : The function is written in native C++ code.
; native(''&lt;number&gt;'') : The number is a unique identifier for the function. Functions in UScript get numbers automatically, except for native functions, which can &quot;reserve&quot; a function number with this syntax. This is useful because this number must appear in the native code, and if it is not fixed in this fashion it could fluctuate with different builds.

; simulated : The function can be executed on the server or a client in a network game. Any function not declared simulated is ignored on the client.&lt;br /&gt;See [[Legacy:Simulated Function|Simulated Function]].&lt;br /&gt;'''Note:''' Simulated functions are not automatically executed on the server and all clients. See [[Legacy:Replication|Replication]] for details.
; singular : prevents reentrancy (recursively calling the same function, in the same object).  It can be very useful to prevent certain types of 'endless recursion loop' crashes, but it usefulness is limited by a few caveats.  When an object enters a singular function, a flag is set &lt;b&gt;on the object itself&lt;/b&gt; that prevents it from re-entering a singular function.  This means that any other singular functions that are called on that object will not be executed until the initial singular function has returned, and the 'i'm in a singular function' flag has been unset on the object.  This includes base versions of the same function declared in super classes.  For example&lt;nowiki&gt;:&lt;/nowiki&gt;

&lt;uscript&gt;
class Base extends Object;
singular function DoSomething() { log(&quot;blah&quot;); }
...
...
class Derived extends Base;
singular function DoSomething() { Super.DoSomething(); }
&lt;/uscript&gt;

When Derived.DoSomething() is called, Super.DoSomething() will not be called, since the object already has a &lt;nowiki&gt;'singular'&lt;/nowiki&gt; function in its call stack.
; static : Declares the function as static. See [[Legacy:Static Function|Static Function]].
; exec : The function can be called from the console.
; protected : The function is only visible from the class it was declared in and in all subclasses.
; private : The function is only visible from the class it was declared in, but not in any of its subclasses.

==Parameter Types ==

You can use any built-in [[Legacy:Variable Type|variable type]]s, structs, enums, static and dynamic arrays or objects as type.  However, you can't use ''out'' bool or ''optional'' dynamic arrays. See Parameter Modifiers below.

==Parameter Modifiers ==
; out :
When you pass a variable to a function, its value is copied to a local variable in that function. The '''out''' modifier will copy the modified local value back to the original variable when the function returns.

You can use this modifier when you want a function to return more than one variable. Don't try to use it as performance improvement, though. Especially with larger variable types like dynamic arrays it tends to actually slow things down.

Here's a simple test case to demonstrate how the '''out''' modifier works:

&lt;uscript&gt;
class TestCommandlet extends Commandlet;

var int i;

function int Main(string Args)
{
  i = 1;
  log(i);
  testout(i);
  log(i);
  return 0;
}

function testout(out int j)
{
  log(i@j);
  j++;
  log(i@j);
}
&lt;/uscript&gt;

Call &lt;code&gt;UCC YourPackage.Test&lt;/code&gt; at the command line and you get:&lt;pre&gt;1
1 1
1 2
2&lt;/pre&gt;As you can see, the global variable didn't change while the &lt;code&gt;testout&lt;/code&gt; function was executed. But it changed right after the function returned.

; optional : This parameter may be skipped in a call. If a parameter should be skipped add commas as normal. If the skipped parameter is the last one the comma can be left out as well. This modifier is ignored for dynamic arrays.
; coerce : Automatically casts the parameter to the specified type. (see [[Legacy:Typecasting|Typecasting]] for details)
; skip : Only valid as modifier of the second parameter of a native operator. If the first parameter already is enough to decide the operators return value then the second one will not be evaluated. This is used for the &lt;code&gt;{|

|-
|
|}
&lt;/code&gt; and &lt;code&gt;&amp;&amp;&lt;/code&gt; operators.

==Empty Functions ==

Two reasons to declare an 'empty' function:
* declare an &quot;abstract&quot; empty function that can then be &quot;specialised&quot; in a subclass or a state
* override a function with one that does nothing, in a subclass or state

Both of the following types of syntax work for both applications:

&lt;uscript&gt;
function Foo( float MyParam ) {}
function Foo( float MyParam ) ;
&lt;/uscript&gt;

When such a function is called, it does nothing.  If it is declared to return a value, that value is the respective data type's &quot;empty&quot; value (0, &quot;&quot;, None or the like).

'''Note:''' There's not much use in making an empty function simulated. The simulated keyword (like most other function modifiers) isn't inherited and when there's no code, there's nothing to be executed on a client. ;)

'''Vitaloverdose''' I cant seem to find any example of how to overwrite a function with a return value. Can this be done without recieving a warning in the log?

'''Wormbo:''' What do you mean? UT is full of overridden functions that have a return value and use the super version's return value in some way as well.

'''Sweavo:''' @vital: do you mean overriding a function that hasn't got a return value with one that has? (I don't have the answer, I just thought that was a version of the question that might make sense!)

'''Wormbo:''' That'd involve changing the function prototype, which is not allowed in UnrealScript.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Delegate|Delegate]]
** [[Legacy:Exec Function|Exec Function]]
** [[Legacy:Latent Function|Latent Function]]
** [[Legacy:Global Function|Global Function]]
** [[Legacy:Replicated Function|Replicated Function]]
** [[Legacy:Scripting Operators|Scripting Operators]]
** [[Legacy:Simulated Function|Simulated Function]]
** [[Legacy:Static Function|Static Function]]
* [[Legacy:UnrealScript Language Reference/Functions|UnrealScript Language Reference/Functions]]</text>
    </revision>
    <revision>
      <id>3169</id>
      <timestamp>2006-05-23T13:24:02Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Eh? cont'd</comment>
      <text xml:space="preserve">==Function Declaration ==

The general function declaration looks like this:

 &lt;''function modifiers''&gt; '''function'''/'''event'''/'''delegate''' &lt;''return type''&gt; &lt;''function name''&gt; 
  '''('''&lt;''parameter modifier''&gt; &lt;''type''&gt; &lt;''parameter name''&gt;''',''' ...''')'''
      '''{'''
       ...
      '''}'''

; &lt;function modifiers&gt; : Keywords that specify aspects of the function's overall nature and behaviour.
; &lt;return type&gt; : The [[Legacy:Variable Type|variable type]] the function returns. You can't return static arrays due to the way they have to be declared. However, you can use an ''out'' variable in this case. See Parameter Modifiers further down this page.
; &lt;function name&gt; : The name of the function, chosen by the coder. For advice on naming conventions see [[Legacy:Coding Guidelines|Coding Guidelines]].
; &lt;parameter modifier&gt; : Changes the nature of individual parameters.
; &lt;type&gt; : The type of each parameter.

Example:

&lt;uscript&gt;
final function bool MyFunction( bool FirstParam , out int SecondParam, optional string ThirdParam )
{
 // function code
}
&lt;/uscript&gt;

You can declare up to 16 parameters for each function. If you need to pass more variables or values you might consider putting those in a struct or array and pass that to the function.

==Function Calls==

There are different ways of calling a function:

&lt;uscript&gt;
local bool bReturn, bHaveIt;
local int Number;

MyFunction(True, 34, &quot;Hello World!&quot;); // parameters passed as literals
MyFunction(bHaveIt, Number);          // parameters passed as variables
bReturn = MyFunction(False, Number, &quot;Hi there!&quot;); // save function's return value in another variable
&lt;/uscript&gt;

The third version is only allowed when the function has a return value. Note, that any return value you don't save in a variable will be thrown away. For (non-actor) objects this means they are lost and will be garbage collected.

==Function vs Event==

The '''event''' keyword is similar to function, but it creates a C++ header so you can call the function from C++ code.  See [[Legacy:UnrealScript Language Reference/Functions|UnrealScript Language Reference/Functions]].

==Delegates==

Delegates could be described as a mixture between a function and a class variable. Delegates can be called like functions, but you can also assign &quot;something&quot; to them. This &quot;something would be another function, but see [[Legacy:Delegate|Delegate]] for details since this topic is worth a whole new page.

The delegate keyword also includes the effect of the '''event''' keyword.

==Function Modifiers ==
; final : This function can't be overridden in subclasses or states of this class. Functions that are ''static'' and ''final'' are automatically ''simulated'' as well.

; iterator : This function is an [[Legacy:Iterator|iterator]] function for the use with ''ForEach''. Only native functions can be iterator functions.

; latent : Latent functions require some time to be executed. Typical examples are ''Sleep'' which waits for the specified amount of time before returning and ''FinishAnim'' which returns when the current animation has finished.&lt;br /&gt;Latent functions can only be called from state code and may not be called from within ForEach loops. Latent functions have to be native. &lt;br /&gt;See [[Legacy:Latent Function|Latent Function]].

; native (or intrinsic in older Unreal versions) : The function is written in native C++ code.
; native(''&lt;number&gt;'') : The number is a unique identifier for the function. Functions in UScript get numbers automatically, except for native functions, which can &quot;reserve&quot; a function number with this syntax. This is useful because this number must appear in the native code, and if it is not fixed in this fashion it could fluctuate with different builds.

; simulated : The function can be executed on the server or a client in a network game. Any function not declared simulated is ignored on the client.&lt;br /&gt;See [[Legacy:Simulated Function|Simulated Function]].&lt;br /&gt;'''Note:''' Simulated functions are not automatically executed on the server and all clients. See [[Legacy:Replication|Replication]] for details.
; singular : prevents reentrancy (recursively calling the same function, in the same object).  It can be very useful to prevent certain types of 'endless recursion loop' crashes, but it usefulness is limited by a few caveats.  When an object enters a singular function, a flag is set &lt;b&gt;on the object itself&lt;/b&gt; that prevents it from re-entering a singular function.  This means that any other singular functions that are called on that object will not be executed until the initial singular function has returned, and the 'i'm in a singular function' flag has been unset on the object.  This includes base versions of the same function declared in super classes.  For example&lt;nowiki&gt;:&lt;/nowiki&gt;

&lt;uscript&gt;
class Base extends Object;
singular function DoSomething() { log(&quot;blah&quot;); }
...
...
class Derived extends Base;
singular function DoSomething() { Super.DoSomething(); }
&lt;/uscript&gt;

When Derived.DoSomething() is called, Super.DoSomething() will not be called, since the object already has a &lt;nowiki&gt;'singular'&lt;/nowiki&gt; function in its call stack.
; static : Declares the function as static. See [[Legacy:Static Function|Static Function]].
; exec : The function can be called from the console.
; protected : The function is only visible from the class it was declared in and in all subclasses.
; private : The function is only visible from the class it was declared in, but not in any of its subclasses.

==Parameter Types ==

You can use any built-in [[Legacy:Variable Type|variable type]]s, structs, enums, static and dynamic arrays or objects as type.  However, you can't use ''out'' bool or ''optional'' dynamic arrays. See Parameter Modifiers below.

==Parameter Modifiers ==
; out :
When you pass a variable to a function, its value is copied to a local variable in that function. The '''out''' modifier will copy the modified local value back to the original variable when the function returns.

You can use this modifier when you want a function to return more than one variable. Don't try to use it as performance improvement, though. Especially with larger variable types like dynamic arrays it tends to actually slow things down.

Here's a simple test case to demonstrate how the '''out''' modifier works:

&lt;uscript&gt;
class TestCommandlet extends Commandlet;

var int i;

function int Main(string Args)
{
  i = 1;
  log(i);
  testout(i);
  log(i);
  return 0;
}

function testout(out int j)
{
  log(i@j);
  j++;
  log(i@j);
}
&lt;/uscript&gt;

Call &lt;code&gt;UCC YourPackage.Test&lt;/code&gt; at the command line and you get:&lt;pre&gt;1
1 1
1 2
2&lt;/pre&gt;As you can see, the global variable didn't change while the &lt;code&gt;testout&lt;/code&gt; function was executed. But it changed right after the function returned.

; optional : This parameter may be skipped in a call. If a parameter should be skipped add commas as normal. If the skipped parameter is the last one the comma can be left out as well. This modifier is ignored for dynamic arrays.
; coerce : Automatically casts the parameter to the specified type. (see [[Legacy:Typecasting|Typecasting]] for details)
; skip : Only valid as modifier of the second parameter of a native operator. If the first parameter already is enough to decide the operators return value then the second one will not be evaluated. This is used for the &lt;code&gt;{|

|-
|
|}
&lt;/code&gt; and &lt;code&gt;&amp;&amp;&lt;/code&gt; operators.

==Empty Functions ==

Two reasons to declare an 'empty' function:
* declare an &quot;abstract&quot; empty function that can then be &quot;specialised&quot; in a subclass or a state
* override a function with one that does nothing, in a subclass or state

Both of the following types of syntax work for both applications:

&lt;uscript&gt;
function Foo( float MyParam ) {}
function Foo( float MyParam ) ;
&lt;/uscript&gt;

When such a function is called, it does nothing.  If it is declared to return a value, that value is the respective data type's &quot;empty&quot; value (0, &quot;&quot;, None or the like).

'''Note:''' There's not much use in making an empty function simulated. The simulated keyword (like most other function modifiers) isn't inherited and when there's no code, there's nothing to be executed on a client. ;)

'''Vitaloverdose''' I cant seem to find any example of how to overwrite a function with a return value. Can this be done without recieving a warning in the log?

'''Wormbo:''' What do you mean? UT is full of overridden functions that have a return value and use the super version's return value in some way as well.

'''Sweavo:''' @vital: do you mean overriding a function that hasn't got a return value with one that has? (I don't have the answer, I just thought that was a version of the question that might make sense!)

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Delegate|Delegate]]
** [[Legacy:Exec Function|Exec Function]]
** [[Legacy:Latent Function|Latent Function]]
** [[Legacy:Global Function|Global Function]]
** [[Legacy:Replicated Function|Replicated Function]]
** [[Legacy:Scripting Operators|Scripting Operators]]
** [[Legacy:Simulated Function|Simulated Function]]
** [[Legacy:Static Function|Static Function]]
* [[Legacy:UnrealScript Language Reference/Functions|UnrealScript Language Reference/Functions]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Furrycat</title>
    <id>1263</id>
    <revision>
      <id>3252</id>
      <timestamp>2003-07-09T11:56:59Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>welcome :-)</comment>
      <text xml:space="preserve">===furrycat's mods and stuff===

As soon as I get round to it, I will write some blurb about the coding of these mods, which were made to learn about UnrealScript and may not work well or at all for you.

* [http://furryclan.net/members/furrycat/Blocks-2003-05-28.exe Blocks (installer for Windows)]: Clone of a ''Yahoo! Games'' sliding blocks game whose name escapes me.

* [http://furryclan.net/members/furrycat/Blocks-2003-05-21.zip Blocks (zip file)]: Older version of '''Blocks'''.  I know, I should update this for Linux/Mac users.

* [http://furryclan.net/members/furrycat/Reflect-o-Beam-2003-05-04.zip Reflect-o-Beam]: Modified Shock Rifle whose beams reflect off surfaces.  Can be configured so each reflect increases or decreases damage dealt or set to Zoom Instagib mode.  Top fun but probably laggy.

* [http://http://furryclan.net/members/furrycat/StickyCam-2003-04-21-01.zip StickyCam]: Splinter Cell style Sticky Cam.  Sticks to surfaces (and other players!) and cams.  Hence the name.  My first mutator so inefficient but seems to work in netplay.

* [http://furryclan.net/members/furrycat/ThirdPerson-2003-05-02-02.zip ThirdPerson]: Splinter Cell style third person player controller.  For testing purposes; not worth downloading.

===furrycat's tutorials and ramblings===

* [http://furryclan.net/members/furrycat/unreal/animation Animated mesh import] from Maya to UnrealEd.  Candidate for wikification if deemed not to suck.

===furrycat's other game pages===

Other pages I did at some point.

* [http://swat3.furrycat.net/ SWAT3]: Everything worth knowing about SWAT3 and a bunch of stuff not worth knowing.
* [http://golf.furrycat.net/ Tiger Woods golf]: Aborted attempt to reverse engineer various game file formats.
* [http://jk2.furrycat.net/ Jedi Outcast]: How to make a custom sabre and not much else.
* [http://uj.furrycat.net/ SWAT: Urban Justice]: Game will never be released but the introduction to Maya tutorials live on.

=== furrycat != Furrycat

The Wiki wants to capitalise the first letter of every page, and hence of everyone's name.  Please note I am '''furrycat''' not '''Furrycat'''.  Meow!

----

'''Mychaeel:''' Welcome to the Wiki, and sorry 'bout the Wiki's capitalization conventions.  [[Legacy:Tarquin|tarquin]] suffers as well.  ;-) &amp;ndash; Please, by all means do wikify your Maya-to-UT2003 tutorial.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3253</id>
      <timestamp>2003-07-09T11:30:21Z</timestamp>
      <contributor>
        <ip>Furrycat</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===furrycat's mods and stuff===

As soon as I get round to it, I will write some blurb about the coding of these mods, which were made to learn about UnrealScript and may not work well or at all for you.

* [http://furryclan.net/members/furrycat/Blocks-2003-05-28.exe Blocks (installer for Windows)]: Clone of a ''Yahoo! Games'' sliding blocks game whose name escapes me.

* [http://furryclan.net/members/furrycat/Blocks-2003-05-21.zip Blocks (zip file)]: Older version of '''Blocks'''.  I know, I should update this for Linux/Mac users.

* [http://furryclan.net/members/furrycat/Reflect-o-Beam-2003-05-04.zip Reflect-o-Beam]: Modified Shock Rifle whose beams reflect off surfaces.  Can be configured so each reflect increases or decreases damage dealt or set to Zoom Instagib mode.  Top fun but probably laggy.

* [http://http://furryclan.net/members/furrycat/StickyCam-2003-04-21-01.zip StickyCam]: Splinter Cell style Sticky Cam.  Sticks to surfaces (and other players!) and cams.  Hence the name.  My first mutator so inefficient but seems to work in netplay.

* [http://furryclan.net/members/furrycat/ThirdPerson-2003-05-02-02.zip ThirdPerson]: Splinter Cell style third person player controller.  For testing purposes; not worth downloading.

===furrycat's tutorials and ramblings===

* [http://furryclan.net/members/furrycat/unreal/animation Animated mesh import] from Maya to UnrealEd.  Candidate for wikification if deemed not to suck.

===furrycat's other game pages===

Other pages I did at some point.

* [http://swat3.furrycat.net/ SWAT3]: Everything worth knowing about SWAT3 and a bunch of stuff not worth knowing.
* [http://golf.furrycat.net/ Tiger Woods golf]: Aborted attempt to reverse engineer various game file formats.
* [http://jk2.furrycat.net/ Jedi Outcast]: How to make a custom sabre and not much else.
* [http://uj.furrycat.net/ SWAT: Urban Justice]: Game will never be released but the introduction to Maya tutorials live on.

=== furrycat != Furrycat

The Wiki wants to capitalise the first letter of every page, and hence of everyone's name.  Please note I am '''furrycat''' not '''Furrycat'''.  Meow!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:FyFire</title>
    <id>1248</id>
    <revision>
      <id>3218</id>
      <timestamp>2002-11-27T23:19:35Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">FyFire is short for &quot;friendly fire&quot;.

Meet me at one of those places, where I work as a coder:

* http://www.redorchestramod.com
* http://www.lostspecies.de

Or see my humble wiki contributions:
* [[Legacy:SpeciesType|SpeciesType]]
* [[Legacy:Defining SpeciesTypes|Defining SpeciesTypes]]

----

'''Tarquin:''' Hello &amp; welcome to the unreal wiki :D

'''ZxAnPhOrIaN:''' HI! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3219</id>
      <timestamp>2002-11-27T23:17:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">FyFire is short for &quot;friendly fire&quot;.

Meet me at one of those places, where I work as a coder:

* http://www.redorchestramod.com
* http://www.lostspecies.de

Or see my humble wiki contributions:
* [[Legacy:SpeciesType|SpeciesType]]
* [[Legacy:Defining SpeciesTypes|Defining SpeciesTypes]]

----

'''Tarquin:''' Hello &amp; welcome to the unreal wiki :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fyfe</title>
    <id>1290</id>
    <revision>
      <id>3296</id>
      <timestamp>2006-12-06T07:42:33Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Code Snippets==
* [[Legacy:Fyfe/PawnFactory|PawnFactory]]
* [[Legacy:Fyfe/AnotherPawn|AnotherPawn]]

==Wiki Stuff==

===Orphan Page Hunting===

====What's an orphan page?====

It's a page that no other page on the wiki links to. Meaning there's no way to access the page (except via the [http://wiki.beyondunreal.com/wiki?action=index Wiki Index]).

So the aim of this expedition is to go out and find these lost souls and create links to them on the appropriate page(s), or add them here if an appropriate place can't be found so they can be dealt with.

The small exception is personal pages, as long as they contain a link to [[:Category:Legacy Personal Page]] they don't need to be linked to by any other pages.

'''Fyfe:''' Back links seem a bit flakie when it comes to sub pages.

====Current Progress====

'''''Completed''''': [[Legacy:2COOL4-U|2COOL4-U]] to [[Legacy:BSP Tree|BSP Tree]]

====Orphaned Pages====
* [[Legacy:Accessed None|Accessed None]] &amp;ndash; Redirects to [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:Actor Classes|Actor Classes]] &amp;ndash; Redirects to [[Legacy:Actor Class Browser|Actor Class Browser]]
* [[Legacy:Actor Properties|Actor Properties]] &amp;ndash; Redirects to [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Actor_Screen|Actor_Screen]] &amp;ndash; Redirects to [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Assault2Uzi|Assault2Uzi]]

==Discussion==

'''SuperApe:''' Hi, Fyfe.  Welcome to the wiki.  Thanks for your recent cleanup work.  That's great! :D

'''Fyfe:''' Glad I could help :D Now am I brave enough to start working on [[Legacy:Replication|Replication]]?

'''SuperApe:''' I know Wormbo has been tinkering with the Replication pages, if you get stuck or have a question or want his opinion, I'd ask him. :)

'''Fyfe:''' I'll needed all the help I can get :D I undertand the concept but I'm still a bit fuzzy on how it's implemented.

'''SuperApe:''' Hmmm.  Then apart from general organization, I'd probably leave that to Wormbo or another Wiki user as experienced.

----

[[:Category:Legacy Personal Page]]

----

==Bookmarks==

====UScript====
* [[Legacy:AdrenalinePickup/Script|AdrenalinePickup/Script]]

=====[[Legacy:Replication|Replication]] Pages=====
* [[Legacy:Actor/Replication|Actor/Replication]]
* [[Legacy:Animation Replication|Animation Replication]]
* [[Legacy:Another Look At Replication|Another Look At Replication]]

====wiki====
* [[Legacy:Aedis/TableOfContentsMockup|Aedis/TableOfContentsMockup]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3297</id>
      <timestamp>2006-12-02T20:44:33Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Code Snippets==
* [[Legacy:Fyfe/PawnFactory|PawnFactory]]
* [[Legacy:Fyfe/AnotherPawn|AnotherPawn]]

==Wiki Stuff==

===Orphan Page Hunting===

====What's an orphan page?====

It's a page that no other page on the wiki links to. Meaning there's no way to access the page (except via the [http://wiki.beyondunreal.com/wiki?action=index Wiki Index]).

So the aim of this expedition is to go out and find these lost souls and create links to them on the appropriate page(s), or add them here if an appropriate place can't be found so they can be dealt with.

The small exception is personal pages, as long as they contain a link to [[:Category:Legacy Personal Page]] they don't need to be linked to by any other pages.

'''Fyfe:''' Back links seem a bit flakie when it comes to sub pages.

====Current Progress====

'''''Completed''''': [[Legacy:2COOL4-U|2COOL4-U]] to [[Legacy:Artificial Intelligence|Artificial Intelligence]]

====Orphaned Pages====
* [[Legacy:Accessed None|Accessed None]] &amp;ndash; Redirects to [[Legacy:Log Warnings|Log Warnings]]
* [[Legacy:Actor Classes|Actor Classes]] &amp;ndash; Redirects to [[Legacy:Actor Class Browser|Actor Class Browser]]
* [[Legacy:Actor Properties|Actor Properties]] &amp;ndash; Redirects to [[Legacy:Actor Overview|Actor Overview]]
* [[Legacy:Actor_Screen|Actor_Screen]] &amp;ndash; Redirects to [[Legacy:Actor Overview|Actor Overview]]

==Discussion==

'''SuperApe:''' Hi, Fyfe.  Welcome to the wiki.  Thanks for your recent cleanup work.  That's great! :D

'''Fyfe:''' Glad I could help :D Now am I brave enough to start working on [[Legacy:Replication|Replication]]?

'''SuperApe:''' I know Wormbo has been tinkering with the Replication pages, if you get stuck or have a question or want his opinion, I'd ask him. :)

'''Fyfe:''' I'll needed all the help I can get :D I undertand the concept but I'm still a bit fuzzy on how it's implemented.

'''SuperApe:''' Hmmm.  Then apart from general organization, I'd probably leave that to Wormbo or another Wiki user as experienced.

----

[[:Category:Legacy Personal Page]]

----

==Bookmarks==

====UScript====
* [[Legacy:AdrenalinePickup/Script|AdrenalinePickup/Script]]

=====[[Legacy:Replication|Replication]] Pages=====
* [[Legacy:Actor/Replication|Actor/Replication]]
* [[Legacy:Animation Replication|Animation Replication]]
* [[Legacy:Another Look At Replication|Another Look At Replication]]

====wiki====
* [[Legacy:Aedis/TableOfContentsMockup|Aedis/TableOfContentsMockup]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10896</id>
      <timestamp>2008-04-07T23:08:37Z</timestamp>
      <contributor>
        <username>Fyfe</username>
        <id>128</id>
      </contributor>
      <minor/>
      <comment>Redirect to new user page.</comment>
      <text xml:space="preserve">#REDIRECT [[User:Fyfe]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fyfe/AnotherPawn</title>
    <id>1292</id>
    <revision>
      <id>3300</id>
      <timestamp>2007-11-19T14:06:11Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; AnotherPawn (Custom)}}

A generic pawn that can be spawned by a [[Legacy:Fyfe/PawnFactory|PawnFactory]].

==Properties==

===Main===
; [[Legacy:Fyfe/PawnFactory|PawnFactory]] ParentFactory : The factory that created the pawn.

==Functions==
; Destroyed() (simulated)

==Code==

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
// ============================================================================
// AnotherPawn
// Copyright (c) 2006 by Andrew Fyfe &lt;andrew@neptune-one.net&gt;
// This program is free software; you can redistribute and/or modify 
// it under the terms of the Lesser Open Unreal Mod License version 1.1.
//
// A generic pawn that can be spawned by a PawnFactory.
// ============================================================================

class AnotherPawn extends xPawn
	abstract;


// ============================================================================
// Properties
// ============================================================================

var	PawnFactory	ParentFactory; // The factory that created the pawn.


// ============================================================================
// Destroyed
// ============================================================================

simulated function Destroyed()
{
	// If we were made in a factory, tell them we're dead :(
	if ( ParentFactory != None )
		ParentFactory.PawnDestroyed( self );

	super.Destroyed();
}


// ============================================================================
// Defaults
// ============================================================================

DefaultProperties
{
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

==Discussion==

'''fyfe:''' Doesn't do anything fancy just adds a variable to hold the factory that created the pawn.

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3301</id>
      <timestamp>2006-10-11T19:51:39Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Oops AnotherPawn is a sub-class of xPawn not Pawn</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; AnotherPawn (Custom)}}

A generic pawn that can be spawned by a [[Legacy:Fyfe/PawnFactory|PawnFactory]].

==Properties==

===Main===
; [[Legacy:Fyfe/PawnFactory|PawnFactory]] ParentFactory : The factory that created the pawn.

==Functions==
; Destroyed() (simulated)

==Code==

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
// ============================================================================
// AnotherPawn
// Copyright (c) 2006 by Andrew Fyfe &lt;andrew@neptune-one.net&gt;
// This program is free software; you can redistribute and/or modify 
// it under the terms of the Lesser Open Unreal Mod License version 1.1.
//
// A generic pawn that can be spawned by a PawnFactory.
// ============================================================================

class AnotherPawn extends xPawn
	abstract;


// ============================================================================
// Properties
// ============================================================================

var	PawnFactory	ParentFactory; // The factory that created the pawn.


// ============================================================================
// Destroyed
// ============================================================================

simulated function Destroyed()
{
	// If we were made in a factory, tell them we're dead :(
	if ( ParentFactory != None )
		ParentFactory.PawnDestroyed( self );

	super.Destroyed();
}


// ============================================================================
// Defaults
// ============================================================================

DefaultProperties
{
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

==Discussion==

'''fyfe:''' Doesn't do anything fancy just adds a variable to hold the factory that created the pawn.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10900</id>
      <timestamp>2008-04-07T23:15:17Z</timestamp>
      <contributor>
        <username>Fyfe</username>
        <id>128</id>
      </contributor>
      <minor/>
      <comment>Redirecting to [[Open Source/Another Pawn]]</comment>
      <text xml:space="preserve">#REDIRECT [[Open Source/Another Pawn]]</text>
    </revision>
    <revision>
      <id>11638</id>
      <timestamp>2008-04-29T09:04:31Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>removing double redirect</comment>
      <text xml:space="preserve">#REDIRECT [[UE2:AnotherPawn]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Fyfe/PawnFactory</title>
    <id>1291</id>
    <revision>
      <id>3298</id>
      <timestamp>2007-11-19T14:06:43Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; PawnFactory (Custom)}}

A generic factory for spawning pawns. The pawns need to be a sub-class of [[Legacy:Fyfe/AnotherPawn|AnotherPawn]].

'''NOTE:''' If your looking for a factory for vehicles check out [[Legacy:SVehicleFactory|Engine.SVehicleFactory]]

==Properties==

===Main===
; bool bEnabled : Factory is enabled by default.
; class&lt;[[Legacy:Fyfe/AnotherPawn|AnotherPawn]]&gt; PawnClass : The pawn to spawn.
; int MaxPawnCount : The max number of pawns this factory can create.

===Hidden===
; int PawnCount : The current number of pawns this factory has created.

==Events==
; PawnCreated( [[Legacy:Fyfe/AnotherPawn|AnotherPawn]] Pawn ) : Called by the factory when a pawn is created.
; PawnDestroyed( [[Legacy:Fyfe/AnotherPawn|AnotherPawn]] Pawn ) : Called by the pawn when it's destroyed.
; Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Spawns a new pawn if &lt;code&gt;PawnClass&lt;/code&gt; is set and we haven't reached the &lt;code&gt;MaxPawnCount&lt;/code&gt;.

==Code==

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
// ============================================================================
// PawnFactory
// Copyright (c) 2006 by Andrew Fyfe &lt;andrew@neptune-one.net&gt;
// This program is free software; you can redistribute and/or modify
// it under the terms of the Lesser Open Unreal Mod License version 1.1.
//
// A generic factory for spawning pawns. The pawns need to be a sub-class of
// NeptuneOne.AnotherPawn.
//
// NOTE: If your looking for a factory for vehicles check out
// Engine.SVehicleFactory
// ============================================================================

class PawnFactory extends Actor
	placeable;


// ============================================================================
// Properties
// ============================================================================

var()	bool				bEnabled;		// Factory is enabled by default.
var()	class&lt;AnotherPawn&gt;	PawnClass;		// The pawn to spawn.
var()	int 				MaxPawnCount;	// The max number of pawns this factory can create.
var		int 				PawnCount;		// The current number of pawns this factory has created.


// ============================================================================
// PawnCreated
//
// Called by the factory when a pawn is created.
// ============================================================================

event PawnCreated( AnotherPawn Pawn )
{
	PawnCount++;
	Pawn.ParentFactory = self;

	if ( PawnCount &gt;= MaxPawnCount )
	{
		Log( &quot;PawnFactory.Trigger(): MaxPawnCount reached, I'm not going to spawn another pawn.&quot;, 'NeptuneOne' );
		bEnabled = false;
	}
}


// ============================================================================
// PawnDestroyed
//
// Called by the pawn when it's destroyed.
// ============================================================================

event PawnDestroyed( AnotherPawn Pawn )
{
	PawnCount--;

	if ( PawnCount &lt; MaxPawnCount )
	{
		Log( &quot;PawnFactory.PawnDestroyed(): The factory is enabled again.&quot;, 'NeptuneOne' );
		bEnabled = true;
	}
}


// ============================================================================
// Trigger
//
// Spawns a new pawn if PawnClass is set and we haven't reached the
// MaxPawnCount.
// ============================================================================

event Trigger( Actor Other, Pawn EventInstigator )
{
	local AnotherPawn CreatedPawn;

	if ( !bEnabled )
		return;

	if ( PawnClass == None )
	{
		// Oops somebody forgot to set a PawnClass.
		Warn( &quot;PawnFactory.Trigger(): &quot;@self@&quot; has no PawnClass! Disabling factory!&quot; );
		bEnabled = false;
		return;
	}

	CreatedPawn = Spawn( PawnClass, , , Location, Rotation );
	if ( CreatedPawn != None )
		PawnCreated( CreatedPawn );
}


// ============================================================================
// Defaults
// ============================================================================

defaultproperties
{
	bEnabled=true
	MaxPawnCount=1

	bHidden=true
	Texture=S_Keypoint
	RemoteRole=ROLE_None
	bNoDelete=true
	bDirectional=true
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

==Discussion==

'''fyfe:''' Nothing overly fancy or original, it's based off of [[Legacy:SVehicleFactory|Engine.SVehicleFactory]].

'''fyfe:''' Added &lt;code&gt;PawnCreated()&lt;/code&gt;, and added some code to set &lt;code&gt;bEnabled&lt;/code&gt; to false while &lt;code&gt;PawnCount == MaxPawnCount&lt;/code&gt; or if &lt;code&gt;PawnClass&lt;/code&gt; isn't set.

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3299</id>
      <timestamp>2006-10-11T22:36:21Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Added PawnCreated(), and added some code to set bEnabled to false while PawnCount == MaxPawnCount or if PawnClass isn't set.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; PawnFactory (Custom)}}

A generic factory for spawning pawns. The pawns need to be a sub-class of [[Legacy:Fyfe/AnotherPawn|AnotherPawn]].

'''NOTE:''' If your looking for a factory for vehicles check out [[Legacy:SVehicleFactory|Engine.SVehicleFactory]]

==Properties==

===Main===
; bool bEnabled : Factory is enabled by default.
; class&lt;[[Legacy:Fyfe/AnotherPawn|AnotherPawn]]&gt; PawnClass : The pawn to spawn.
; int MaxPawnCount : The max number of pawns this factory can create.

===Hidden===
; int PawnCount : The current number of pawns this factory has created.

==Events==
; PawnCreated( [[Legacy:Fyfe/AnotherPawn|AnotherPawn]] Pawn ) : Called by the factory when a pawn is created.
; PawnDestroyed( [[Legacy:Fyfe/AnotherPawn|AnotherPawn]] Pawn ) : Called by the pawn when it's destroyed.
; Trigger( [[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Spawns a new pawn if &lt;code&gt;PawnClass&lt;/code&gt; is set and we haven't reached the &lt;code&gt;MaxPawnCount&lt;/code&gt;.

==Code==

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;
&lt;uscript&gt;
// ============================================================================
// PawnFactory
// Copyright (c) 2006 by Andrew Fyfe &lt;andrew@neptune-one.net&gt;
// This program is free software; you can redistribute and/or modify
// it under the terms of the Lesser Open Unreal Mod License version 1.1.
//
// A generic factory for spawning pawns. The pawns need to be a sub-class of
// NeptuneOne.AnotherPawn.
//
// NOTE: If your looking for a factory for vehicles check out
// Engine.SVehicleFactory
// ============================================================================

class PawnFactory extends Actor
	placeable;


// ============================================================================
// Properties
// ============================================================================

var()	bool				bEnabled;		// Factory is enabled by default.
var()	class&lt;AnotherPawn&gt;	PawnClass;		// The pawn to spawn.
var()	int 				MaxPawnCount;	// The max number of pawns this factory can create.
var		int 				PawnCount;		// The current number of pawns this factory has created.


// ============================================================================
// PawnCreated
//
// Called by the factory when a pawn is created.
// ============================================================================

event PawnCreated( AnotherPawn Pawn )
{
	PawnCount++;
	Pawn.ParentFactory = self;

	if ( PawnCount &gt;= MaxPawnCount )
	{
		Log( &quot;PawnFactory.Trigger(): MaxPawnCount reached, I'm not going to spawn another pawn.&quot;, 'NeptuneOne' );
		bEnabled = false;
	}
}


// ============================================================================
// PawnDestroyed
//
// Called by the pawn when it's destroyed.
// ============================================================================

event PawnDestroyed( AnotherPawn Pawn )
{
	PawnCount--;

	if ( PawnCount &lt; MaxPawnCount )
	{
		Log( &quot;PawnFactory.PawnDestroyed(): The factory is enabled again.&quot;, 'NeptuneOne' );
		bEnabled = true;
	}
}


// ============================================================================
// Trigger
//
// Spawns a new pawn if PawnClass is set and we haven't reached the
// MaxPawnCount.
// ============================================================================

event Trigger( Actor Other, Pawn EventInstigator )
{
	local AnotherPawn CreatedPawn;

	if ( !bEnabled )
		return;

	if ( PawnClass == None )
	{
		// Oops somebody forgot to set a PawnClass.
		Warn( &quot;PawnFactory.Trigger(): &quot;@self@&quot; has no PawnClass! Disabling factory!&quot; );
		bEnabled = false;
		return;
	}

	CreatedPawn = Spawn( PawnClass, , , Location, Rotation );
	if ( CreatedPawn != None )
		PawnCreated( CreatedPawn );
}


// ============================================================================
// Defaults
// ============================================================================

defaultproperties
{
	bEnabled=true
	MaxPawnCount=1

	bHidden=true
	Texture=S_Keypoint
	RemoteRole=ROLE_None
	bNoDelete=true
	bDirectional=true
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

==Discussion==

'''fyfe:''' Nothing overly fancy or original, it's based off of [[Legacy:SVehicleFactory|Engine.SVehicleFactory]].

'''fyfe:''' Added &lt;code&gt;PawnCreated()&lt;/code&gt;, and added some code to set &lt;code&gt;bEnabled&lt;/code&gt; to false while &lt;code&gt;PawnCount == MaxPawnCount&lt;/code&gt; or if &lt;code&gt;PawnClass&lt;/code&gt; isn't set.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10897</id>
      <timestamp>2008-04-07T23:12:48Z</timestamp>
      <contributor>
        <username>Fyfe</username>
        <id>128</id>
      </contributor>
      <minor/>
      <comment>Redirecting to [[Open Source/Pawn Factory]]</comment>
      <text xml:space="preserve">#REDIRECT [[Open Source/Pawn Factory]]</text>
    </revision>
    <revision>
      <id>11639</id>
      <timestamp>2008-04-29T09:04:49Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>Redirecting to [[UE2:TeamVehicleFactory]]</comment>
      <text xml:space="preserve">#REDIRECT [[UE2:TeamVehicleFactory]]</text>
    </revision>
    <revision>
      <id>11660</id>
      <timestamp>2008-04-29T16:27:03Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <comment>Address this, please.  Fyfe's old PawnFactory bears no connection to my TeamVehicleFactory.  Did you delete Fyfe's page altogether?</comment>
      <text xml:space="preserve">TeamVehicleFactory bears absolutely no connection to Fyfe's Pawn Factory.  What were you intending here, Haarg? -- [[User:SuperApe|SuperApe]] 09:26 (PST) 29 April 2008.</text>
    </revision>
    <revision>
      <id>11663</id>
      <timestamp>2008-04-29T17:23:15Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>Redirecting to [[UE2:PawnFactory]]</comment>
      <text xml:space="preserve">#REDIRECT [[UE2:PawnFactory]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:G-LiTe</title>
    <id>1321</id>
    <revision>
      <id>3367</id>
      <timestamp>2003-05-07T12:23:17Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <comment>Guess I should update this... even though I haven't done much lately ;)</comment>
      <text xml:space="preserve">===The I ;) ===

So I still need to put some stuff here about myself. :) &lt;br /&gt;Nickname's G-LiTe, member of clan [http://www.clanrsu.com RSU], though we've disbanded. :( Hopefully we'll still play some friendly matches and stuff. &lt;br /&gt;Not gonna tell my real name, some people know (or forgot) it already, but I'm trying to sortof hide it lately. ;) (Not that I really care) &lt;br /&gt;Hobby, well basically anything that's got to do with computers. Mapping is just a part of it. :) [http://overload.beyondunreal.com/ Overload] is one of the things I've worked on. There's some other projects of which [http://nil.sf.net/ one] has gone inactive and the [http://www.uni-mainz.de/~bauec002/B2Main.html other] is progressing slowly. I'm really just watching the mailinglists lately, not doing much.

===Discussion ===

'''Wormbo:''' Concider this your official welcome to the Unreal Wiki, G-LiTe. This is your personal page. :) You can add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you want.

'''G-LiTe:''' hmmmm... juicy. So what should I do with this page? (/me digs thru his hd for his ASCII pr0n archive)

Well, I've edited two pages and created a page already so far, so yes I'm definitly gonna add myself to that list. ;)

'''Tarquin:''' Hi &amp; welcome to the site :D

'''G-LiTe:''': Yay! hehe, getting popular among the admins. ;)

'''G-LiTe:''': God this page was (is?) outdated.

'''MythOpus:''' Welcome.  (Sry I haven't said this sooner ;) )

'''G-LiTe:''': I'm not all that regular around here anyways. I quit Ued soon after I joined, I became interested in Linux. :) &lt;br /&gt;I'm really just doing some cleanups here and there. Not much. I usually keep track of the recent changes, see if anything interesting comes up. ;) &lt;br /&gt;It'd be cool if they ported the compiler and editor to Linux... but noooooo. :/

'''MythOpus:''' LoL.  Poor You... :P Port it yourself ;) Or are you still a noob to linux ;)

'''G-LiTe:''': How am I supposed to do that? License the engine? Figure out all the library calls? I suck at GUI coding btw. ;)

'''MythOpus:''' HaHaHA :P .... So do I o_O

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3368</id>
      <timestamp>2003-04-11T14:13:33Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>HAHA</comment>
      <text xml:space="preserve">===The I ;) ===

So I still need to put some stuff here about myself. :) &lt;br /&gt;Nickname's G-LiTe, member of clan [http://www.clanrsu.com RSU], though we've been rather inactive lately. Even the jolt league got canceled. :( We're starting on Wireplay soonish. &lt;br /&gt;Not gonna tell my real name, some people know (or forgot) it already, but I'm trying to sortof hide it lately. ;) (Not that I really care) &lt;br /&gt;Hobby, well basically anything that's got to do with computers. Mapping is just a part of it. :) I was working on some projects before which seem to have gone inactive now. They aren't really related to UT anyways, so let's skip that. ;)

===Discussion ===

'''Wormbo:''' Concider this your official welcome to the Unreal Wiki, G-LiTe. This is your personal page. :) You can add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you want.

'''G-LiTe:''' hmmmm... juicy. So what should I do with this page? (/me digs thru his hd for his ASCII pr0n archive)

Well, I've edited two pages and created a page already so far, so yes I'm definitly gonna add myself to that list. ;)

'''Tarquin:''' Hi &amp; welcome to the site :D

'''G-LiTe:''': Yay! hehe, getting popular among the admins. ;)

'''G-LiTe:''': God this page was (is?) outdated.

'''MythOpus:''' Welcome.  (Sry I haven't said this sooner ;) )

'''G-LiTe:''': I'm not all that regular around here anyways. I quit Ued soon after I joined, I became interested in Linux. :) &lt;br /&gt;I'm really just doing some cleanups here and there. Not much. I usually keep track of the recent changes, see if anything interesting comes up. ;) &lt;br /&gt;It'd be cool if they ported the compiler and editor to Linux... but noooooo. :/

'''MythOpus:''' LoL.  Poor You... :P Port it yourself ;) Or are you still a noob to linux ;)

'''G-LiTe:''': How am I supposed to do that? License the engine? Figure out all the library calls? I suck at GUI coding btw. ;)

'''MythOpus:''' HaHaHA :P .... So do I o_O

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:G16ed</title>
    <id>1362</id>
    <revision>
      <id>3458</id>
      <timestamp>2007-08-09T12:59:41Z</timestamp>
      <contributor>
        <ip>Userdf178.dsl.pipex.com</ip>
      </contributor>
      <comment>Added comment</comment>
      <text xml:space="preserve">'''G16Ed''' is an [[Legacy:Application|application]] that edits [[Legacy:UnrealEd 3|UnrealEd 3]] [[Legacy:Terrain|terrain]] heightmaps. These are 16-bit greyscale (G16), and can be exported from UnrealEd as BMP ([[Wikipedia:Windows bitmap]]) format. Currently, G16Ed is the only [[Legacy:Graphics Application|graphics application]] that allows you to work with this format and keeps the 16-bit accuracy of the heightmap, so you can change it while developing the map in the editor. The latest version has fractal noise creation and PSP-like interface. 

You can't &quot;see&quot; more than 8 bits of grayscale in any image editors, since 24 and 32-bit textures have 8 bits per channel, and since grayscale means r=g=b, no video adapters will show more than that for one channel. Both UnrealEd and G16ed show you an 8-bit representation on the screen, but the full 16-bit information is there.

* [http://homepage.ntlworld.com/martingbell/ut2003/ Website]

==Tips==

If you need to select a  precise area of terrain, do the following:
# In UnrealEd, find the corners of the area you'll want to select. Go into [[Legacy:Terrain Mode|Terrain Mode]], and set the brush size to the absolute mininum and the strength to 100%.
# With the [[Legacy:Painting Terrain Tool|Painting Terrain Tool]], lower the single terrain grid point that you want to mark. The further you lower it, the easier it will be to see in G16ed, so go as far as you like. You can actually do this step in an orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], which may be easier. Don't worry about damaging your terrain, you can easily restore the lowered point with the Flatten tool later.
# Export your terrain once you have marked all reference spots you need
# Open it in G16ed. Zoom in on your terrain. Your reference points should be clearly visible as single black pixels.

==Feature requests==

* define a selection numerically
* rotate non-square areas
* clearer indication of which tool is currently active

==Comments==

Aphex: Whoops re: bug - I tested it with terragen heightmaps which I found out later are flipped in the Y axis :o

'''Tarquin:''' That would be cool :D

'''Aphex:''' New version of g16ed uploaded.  That Y flip bug Tarquin; what were you importing?  The code seems to work ok as far as I can see...

'''Tarquin:''' 16-bit bitmaps from UnrealEd. The bug appears fixed in 145. I have just tried opening files in both 145 and 144, and in 144 they are flipped and 145 they are fine. Nice work! :)

'''Aphex:''' Lol - I probably fixed it ages ago and forgot ;)  I'll add the other improvements when I get time.

'''Anonymous:''' A wonderful tool thankyou - I have been searching for something that did this job for days and yours is the only one that works. I used it to export to an 8 bit image that I could then edit in the GIMP and then I converted it back into 16 bit again.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3459</id>
      <timestamp>2006-01-20T10:36:56Z</timestamp>
      <contributor>
        <ip>AToulouse-254-1-62-92.w81-49.abo.wanadoo.fr</ip>
      </contributor>
      <text xml:space="preserve">'''G16Ed''' is an [[Legacy:Application|application]] that edits [[Legacy:UnrealEd 3|UnrealEd 3]] [[Legacy:Terrain|terrain]] heightmaps. These are 16-bit greyscale (G16), and can be exported from UnrealEd as BMP ([[Wikipedia:Windows bitmap]]) format. Currently, G16Ed is the only [[Legacy:Graphics Application|graphics application]] that allows you to work with this format and keeps the 16-bit accuracy of the heightmap, so you can change it while developing the map in the editor. The latest version has fractal noise creation and PSP-like interface. 

You can't &quot;see&quot; more than 8 bits of grayscale in any image editors, since 24 and 32-bit textures have 8 bits per channel, and since grayscale means r=g=b, no video adapters will show more than that for one channel. Both UnrealEd and G16ed show you an 8-bit representation on the screen, but the full 16-bit information is there.

* [http://homepage.ntlworld.com/martingbell/ut2003/ Website]

==Tips==

If you need to select a  precise area of terrain, do the following:
# In UnrealEd, find the corners of the area you'll want to select. Go into [[Legacy:Terrain Mode|Terrain Mode]], and set the brush size to the absolute mininum and the strength to 100%.
# With the [[Legacy:Painting Terrain Tool|Painting Terrain Tool]], lower the single terrain grid point that you want to mark. The further you lower it, the easier it will be to see in G16ed, so go as far as you like. You can actually do this step in an orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]], which may be easier. Don't worry about damaging your terrain, you can easily restore the lowered point with the Flatten tool later.
# Export your terrain once you have marked all reference spots you need
# Open it in G16ed. Zoom in on your terrain. Your reference points should be clearly visible as single black pixels.

==Feature requests==

* define a selection numerically
* rotate non-square areas
* clearer indication of which tool is currently active

==Comments==

Aphex: Whoops re: bug - I tested it with terragen heightmaps which I found out later are flipped in the Y axis :o

'''Tarquin:''' That would be cool :D

'''Aphex:''' New version of g16ed uploaded.  That Y flip bug Tarquin; what were you importing?  The code seems to work ok as far as I can see...

'''Tarquin:''' 16-bit bitmaps from UnrealEd. The bug appears fixed in 145. I have just tried opening files in both 145 and 144, and in 144 they are flipped and 145 they are fine. Nice work! :)

'''Aphex:''' Lol - I probably fixed it ages ago and forgot ;)  I'll add the other improvements when I get time.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GESBioRifle</title>
    <id>28845</id>
    <revision>
      <id>42772</id>
      <timestamp>2010-03-30T16:16:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GODZ Inception</title>
    <id>1329</id>
    <revision>
      <id>3384</id>
      <timestamp>2003-04-16T16:22:50Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Name:      [[Legacy:Vajuras|Vajuras]]

Mod:       GODZ

Site:      http://www.planetunreal.com/godz

Position:  Creator, Lead Coder, Web Designer, Animator

{{innerbox|Well, I guess I'll post my thoughts on how GODZ was started in the hopes it will help someone looking for ideas on how to start a team, recruit key talent, and implement their ideas.

}}

GODZ was basically conceived by two guys, James 'Disector' Morris and myself, vajuras, sometime around Spring 2001. We had knew each other because of our work on FEBA, a partial conversion for UT.

Our desire was to create a total conversion for Unreal Tournament that would feature new fighters, enviroments, etc. At thetime, Disector could skin, create music, and map. I pretty much possessed the other talents he didn't have: coding, modeling, and animating. The first thing I did was develop the initial concept. I wanted it to be very short and simple (like the game title). So I came up with simple concept of a universal wide tournament that features supernatural beings. At the time, I was burned out on modeling/animating weapons so we decided GODZ wouldn't use any weapons and it would feature 3rd person.

After a few weeks we organized a simple little site and got together a set of models. This was the key to our strategy- we would first develop some early prototypes and start showing them around to people. We wanted experienced  artists/mappers working on the mod, so we figured it would help to have some nice stuff to show around. Back then, we wasn't sure if we could attract any mappers to the mod so we kept things simple- the mod would focus on 1-on-1 matches. This way, the maps could be small.

Our first recruit was a mapper that had worked with us previously on the FEBA team, Adam Stiles. Adam quickly put together a nice map and from there we started hand picking the mappers we wanted to join. I only invited mappers that had previously released content to the mapping review sites and their work fit into our theme some what (the maps were fantasy/sci-fi). 

I could tell we had a good concept because the majority of the folks we invited joined immediately. If they couldn't join, they replied saying that they thought the idea was good. Now, I am not bragging but I think that is very important- basing a mod on a solid concept. ''A concept that can be explained in just a few lines''.

After a few months we launched the site on PU. The initial design wasn't all that great but it was a start. However, the mod didn't seem to grasp people like we thought it would. Our web site hits wasn't quite what I expected. Doing the public relations stuff to pimp your mod can sometimes be the hardest part. Especially if your mod doesn't 'fit' into a particular genre. The best way I could think of to describe GODZ was to just compare it to DBZ. As expected, this aroused a lot of attention in the mod. Then I redid the site design to appeal to DBZ fans and we released a 'preview' movie.  

Our hits started going up quite a bit then. It wasn't a volume of traffic as huge as tactical ops but still it helped us feel like there was some folks out there that was interested in the mod. I think that is one place where I went wrong- expecting a huge volume of traffic. When a team directly bases their product on the '''Matrix''' or '''Dragonball''' - you inherit their fan base. However, if you create something brand new, you don't always have the base created for you. So it took some advertising and a lot of pimping to get folks out there to recognize what the mod was.

Another struggle we had was that I wanted to get some C++ coding experience. So I created a native dll that would play mp3/ogg music. The downside was that the dll would not work on linux/mac users. I naviely thought perhaps those other systems were just a small part of the unreal community. Boy was I wrong!

Our first release was carefully coordinated with gamespy so that we could get the best pimpage possible. The first version was d/l over 10,000 or so just from fileplanet within the first day. Not bad for a Windows only mod. Unfortunately, mac/linux users were left out. And boy- did they make their discouragement felt.

After a few days the first mod review was published. The first release had gotten like a 6.0 or something. Now, we were wasn't happy with the score but that was not the problem. '''The reviewer only played 1 level out of the 16 that was included and just reviewed the mod based on that.''' We could tell because the only picture he posted was the worst level we included (plus he made 2-3 incorrect statements). One of our mappers basically made a crappy level but we included it anyway because that was our policy- to include everyone's work. Of course now I know much better :)

In any case, we contacted the site and they updated their score to 8.0. Then modsquad reviewed the mod and gave us a 9.6 or something high like that. Kewl.

After that our forums started really jumping with activity and our servers pretty much stayed busy during peak hours. Inspite of all that, I pretty much have always kept a modest view about the mod. It suprises me when I meet people that play our mod, etc. Since the release we have been invited to a lot of nice events such as the Westwood College (met Infiltration, UnF, and some other teams there) and the Epic mod event. Every time I'm like - &quot;How did they find out about GODZ???&quot;

Since that time we've lost a lot of good talent and others have joined. We once thought we would only get 1 mapper and maybe only release with 3-4 maps. The first release contained over 11 maps and the team grew so big we started turning away a lot of talent. 

Anyway, this is how our mod started. It's been a fun ride ever since.</text>
    </revision>
    <revision>
      <id>3385</id>
      <timestamp>2003-04-16T03:35:52Z</timestamp>
      <contributor>
        <ip>Cs6710130-120.houston.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Name:      Richard 'vajuras' Osborne

Mod:       GODZ

Site:      http://www.planetunreal.com/godz

Position:  Creator, Lead Coder, Web Designer, Animator

{{innerbox|Well, I guess I'll post my thoughts on how GODZ was started in the hopes it will help someone looking for ideas on how to start a team, recruit key talent, and implement their ideas.

}}

GODZ was basically conceived by two guys, James 'Disector' Morris and myself, vajuras, sometime around Spring 2001. We had knew each other because of our work on FEBA, a partial conversion for UT.

Our desire was to create a total conversion for Unreal Tournament that would feature new fighters, enviroments, etc. At thetime, Disector could skin, create music, and map. I pretty much possessed the other talents he didn't have: coding, modeling, and animating. The first thing I did was develop the initial concept. I wanted it to be very short and simple (like the game title). So I came up with simple concept of a universal wide tournament that features supernatural beings. At the time, I was burned out on modeling/animating weapons so we decided GODZ wouldn't use any weapons and it would feature 3rd person.

After a few weeks we organized a simple little site and got together a set of models. This was the key to our strategy- we would first develop some early prototypes and start showing them around to people. We wanted experienced  artists/mappers working on the mod, so we figured it would help to have some nice stuff to show around. Back then, we wasn't sure if we could attract any mappers to the mod so we kept things simple- the mod would focus on 1-on-1 matches. This way, the maps could be small.

Our first recruit was a mapper that had worked with us previously on the FEBA team, Adam Stiles. Adam quickly put together a nice map and from there we started hand picking the mappers we wanted to join. I only invited mappers that had previously released content to the mapping review sites and their work fit into our theme some what (the maps were fantasy/sci-fi). 

I could tell we had a good concept because the majority of the folks we invited joined immediately. If they couldn't join, they replied saying that they thought the idea was good. Now, I am not bragging but I think that is very important- basing a mod on a solid concept. ''A concept that can be explained in just a few lines''.

After a few months we launched the site on PU. The initial design wasn't all that great but it was a start. However, the mod didn't seem to grasp people like we thought it would. Our web site hits wasn't quite what I expected. Doing the public relations stuff to pimp your mod can sometimes be the hardest part. Especially if your mod doesn't 'fit' into a particular genre. The best way I could think of to describe GODZ was to just compare it to DBZ. As expected, this aroused a lot of attention in the mod. Then I redid the site design to appeal to DBZ fans and we released a 'preview' movie.  

Our hits started going up quite a bit then. It wasn't a volume of traffic as huge as tactical ops but still it helped us feel like there was some folks out there that was interested in the mod. I think that is one place where I went wrong- expecting a huge volume of traffic. When a team directly bases their product on the '''Matrix''' or '''Dragonball''' - you inherit their fan base. However, if you create something brand new, you don't always have the base created for you. So it took some advertising and a lot of pimping to get folks out there to recognize what the mod was.

Another struggle we had was that I wanted to get some C++ coding experience. So I created a native dll that would play mp3/ogg music. The downside was that the dll would not work on linux/mac users. I naviely thought perhaps those other systems were just a small part of the unreal community. Boy was I wrong!

Our first release was carefully coordinated with gamespy so that we could get the best pimpage possible. The first version was d/l over 10,000 or so just from fileplanet within the first day. Not bad for a Windows only mod. Unfortunately, mac/linux users were left out. And boy- did they make their discouragement felt.

After a few days the first mod review was published. The first release had gotten like a 6.0 or something. Now, we were wasn't happy with the score but that was not the problem. '''The reviewer only played 1 level out of the 16 that was included and just reviewed the mod based on that.''' We could tell because the only picture he posted was the worst level we included (plus he made 2-3 incorrect statements). One of our mappers basically made a crappy level but we included it anyway because that was our policy- to include everyone's work. Of course now I know much better :)

In any case, we contacted the site and they updated their score to 8.0. Then modsquad reviewed the mod and gave us a 9.6 or something high like that. Kewl.

After that our forums started really jumping with activity and our servers pretty much stayed busy during peak hours. Inspite of all that, I pretty much have always kept a modest view about the mod. It suprises me when I meet people that play our mod, etc. Since the release we have been invited to a lot of nice events such as the Westwood College (met Infiltration, UnF, and some other teams there) and the Epic mod event. Every time I'm like - &quot;How did they find out about GODZ???&quot;

Since that time we've lost a lot of good talent and others have joined. We once thought we would only get 1 mapper and maybe only release with 3-4 maps. The first release contained over 11 maps and the team grew so big we started turning away a lot of talent. 

Anyway, this is how our mod started. It's been a fun ride ever since.</text>
    </revision>
    <revision>
      <id>3386</id>
      <timestamp>2003-04-16T16:21:45Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Name:      Wiki.Vajuras

Mod:       GODZ

Site:      http://www.planetunreal.com/godz

Position:  Creator, Lead Coder, Web Designer, Animator

{{innerbox|Well, I guess I'll post my thoughts on how GODZ was started in the hopes it will help someone looking for ideas on how to start a team, recruit key talent, and implement their ideas.

}}

GODZ was basically conceived by two guys, James 'Disector' Morris and myself, vajuras, sometime around Spring 2001. We had knew each other because of our work on FEBA, a partial conversion for UT.

Our desire was to create a total conversion for Unreal Tournament that would feature new fighters, enviroments, etc. At thetime, Disector could skin, create music, and map. I pretty much possessed the other talents he didn't have: coding, modeling, and animating. The first thing I did was develop the initial concept. I wanted it to be very short and simple (like the game title). So I came up with simple concept of a universal wide tournament that features supernatural beings. At the time, I was burned out on modeling/animating weapons so we decided GODZ wouldn't use any weapons and it would feature 3rd person.

After a few weeks we organized a simple little site and got together a set of models. This was the key to our strategy- we would first develop some early prototypes and start showing them around to people. We wanted experienced  artists/mappers working on the mod, so we figured it would help to have some nice stuff to show around. Back then, we wasn't sure if we could attract any mappers to the mod so we kept things simple- the mod would focus on 1-on-1 matches. This way, the maps could be small.

Our first recruit was a mapper that had worked with us previously on the FEBA team, Adam Stiles. Adam quickly put together a nice map and from there we started hand picking the mappers we wanted to join. I only invited mappers that had previously released content to the mapping review sites and their work fit into our theme some what (the maps were fantasy/sci-fi). 

I could tell we had a good concept because the majority of the folks we invited joined immediately. If they couldn't join, they replied saying that they thought the idea was good. Now, I am not bragging but I think that is very important- basing a mod on a solid concept. ''A concept that can be explained in just a few lines''.

After a few months we launched the site on PU. The initial design wasn't all that great but it was a start. However, the mod didn't seem to grasp people like we thought it would. Our web site hits wasn't quite what I expected. Doing the public relations stuff to pimp your mod can sometimes be the hardest part. Especially if your mod doesn't 'fit' into a particular genre. The best way I could think of to describe GODZ was to just compare it to DBZ. As expected, this aroused a lot of attention in the mod. Then I redid the site design to appeal to DBZ fans and we released a 'preview' movie.  

Our hits started going up quite a bit then. It wasn't a volume of traffic as huge as tactical ops but still it helped us feel like there was some folks out there that was interested in the mod. I think that is one place where I went wrong- expecting a huge volume of traffic. When a team directly bases their product on the '''Matrix''' or '''Dragonball''' - you inherit their fan base. However, if you create something brand new, you don't always have the base created for you. So it took some advertising and a lot of pimping to get folks out there to recognize what the mod was.

Another struggle we had was that I wanted to get some C++ coding experience. So I created a native dll that would play mp3/ogg music. The downside was that the dll would not work on linux/mac users. I naviely thought perhaps those other systems were just a small part of the unreal community. Boy was I wrong!

Our first release was carefully coordinated with gamespy so that we could get the best pimpage possible. The first version was d/l over 10,000 or so just from fileplanet within the first day. Not bad for a Windows only mod. Unfortunately, mac/linux users were left out. And boy- did they make their discouragement felt.

After a few days the first mod review was published. The first release had gotten like a 6.0 or something. Now, we were wasn't happy with the score but that was not the problem. '''The reviewer only played 1 level out of the 16 that was included and just reviewed the mod based on that.''' We could tell because the only picture he posted was the worst level we included (plus he made 2-3 incorrect statements). One of our mappers basically made a crappy level but we included it anyway because that was our policy- to include everyone's work. Of course now I know much better :)

In any case, we contacted the site and they updated their score to 8.0. Then modsquad reviewed the mod and gave us a 9.6 or something high like that. Kewl.

After that our forums started really jumping with activity and our servers pretty much stayed busy during peak hours. Inspite of all that, I pretty much have always kept a modest view about the mod. It suprises me when I meet people that play our mod, etc. Since the release we have been invited to a lot of nice events such as the Westwood College (met Infiltration, UnF, and some other teams there) and the Epic mod event. Every time I'm like - &quot;How did they find out about GODZ???&quot;

Since that time we've lost a lot of good talent and others have joined. We once thought we would only get 1 mapper and maybe only release with 3-4 maps. The first release contained over 11 maps and the team grew so big we started turning away a lot of talent. 

Anyway, this is how our mod started. It's been a fun ride ever since.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GTA Radar</title>
    <id>1313</id>
    <revision>
      <id>3351</id>
      <timestamp>2005-08-19T00:47:21Z</timestamp>
      <contributor>
        <ip>Angel Mapper</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a GTA-like radar that I made for a small mod.  The GameInfo class holds a list of all of the Objectives in the map.  Objectives are Actor classes that trigger missions.

&lt;uscript&gt;class MyCustomHUD extends HudBase;

var Shader MyShader;
var TexScaler MyScaler;
var TexRotator MyRotator, PlayerIconRotator;
var texture MapRadarTexture, HUDMapOpacity, HUDMapBorder, PlayerIcon, WaypointIcon;
var material TargetPawnIcon;
var float RadarScale, MapScale;

var MyCustomGame TheGame;

simulated event PostBeginPlay()
{
    local MapScaleActor MSA;

    Super.PostBeginPlay();

    // Set up all of the textures.
    TheGame = MyCustomGame(Level.Game);
    MyShader = New(None) class'Shader';
    MyScaler = New(None) class'TexScaler';
    MyRotator = New(None) class'TexRotator';
    PlayerIconRotator = New(None) class'TexRotator';
    PlayerIconRotator.Material = PlayerIcon;

    // Half of the PlayerIcon's texture size.
    PlayerIconRotator.UOffset = 32;
    PlayerIconRotator.VOffset = 32;

    // Set up the Radar image, set the rotation point to the middle.
    if(Level.RadarMapImage != none)
    {
        RadarScale = texture(Level.RadarMapImage).UClamp/256;
        MyScaler.Material = Level.RadarMapImage;
        MyScaler.UScale = 2;
        MyScaler.VScale = 2;
        MyScaler.UOffset = 64*RadarScale;
        MyScaler.VOffset = 64*RadarScale;
        MyRotator.Material = MyScaler;
        MyRotator.UOffset = 128*RadarScale;
        MyRotator.VOffset = 128*RadarScale;
        MyShader.Diffuse = MyRotator;
        MyShader.Opacity = HUDMapOpacity;
    }

    // MapScaleActor tells the game the ratio between the RadarMap and the actual level.
    foreach AllActors(class'MapScaleActor',MSA)
        MapScale = MSA.MapScale;
}

simulated function DrawHudPassA(Canvas C)
{
    local rotator Dir;
    local float Angle;
    local vector PlayerLocZeroed, ObjectiveLocZeroed;
    local int i;

    // Get the player's rotation and position on the map.
    if(PawnOwner != none)
    {
        MyScaler.UOffset = (PawnOwner.Location.X/(MapScale/(256*RadarScale))) + (64*RadarScale);
        MyScaler.VOffset = (PawnOwner.Location.Y/(MapScale/(256*RadarScale))) + (64*RadarScale);
        MyRotator.Rotation.Yaw = PlayerOwner.CalcViewRotation.Yaw + 16384;
        PlayerIconRotator.Rotation.Yaw = PlayerOwner.CalcViewRotation.Yaw - PawnOwner.Rotation.Yaw;
    }

    // Draw the Radar Image
    C.SetDrawColor(150,150,150);
    C.SetPos(32*C.ClipX/1280,C.ClipY - (288*C.ClipY/1024));
    C.DrawTileScaled(MyShader,(C.ClipX/1280)/RadarScale,(C.ClipY/1024)/RadarScale);
    C.SetDrawColor(200,200,200);
    C.SetPos(32*C.ClipX/1280,C.ClipY - (288*C.ClipY/1024));
    C.DrawTileScaled(HUDMapBorder,(C.ClipX/1280)/RadarScale,(C.ClipY/1024)/RadarScale);

    // Draw the Player Icon
    C.SetPos(144*C.ClipX/1280,C.ClipY - (176*C.ClipY/1024));
    C.SetDrawColor(255,75,255);
    C.DrawTileScaled(PlayerIconRotator,0.5*C.ClipX/1280,0.5*C.ClipY/1024);

    // Objective icons
    if(TheGame != None)
    {
        for(i=0;i&lt;TheGame(Level.Game).Objectives.Length;i++)
        {
            if(TheGame(Level.Game).Objectives[i].bEnabled &amp;&amp; !TheGame(Level.Game).Objectives[i].bHidden)
            {
            	Dir = rotator(TheGame(Level.Game).Objectives[i].Location - PawnOwner.Location);
            	Angle = ((Dir.Yaw - PlayerOwner.CalcViewRotation.Yaw) &amp; 65535) * 6.2832/65536;

            	PlayerLocZeroed = PawnOwner.Location;
            	PlayerLocZeroed.Z = 0;
            	ObjectiveLocZeroed = TheGame(Level.Game).Objectives[i].Location;
            	ObjectiveLocZeroed.Z = 0;

                C.SetPos((144*C.ClipX/1280)+(128 * FMin(VSize(PlayerLocZeroed-ObjectiveLocZeroed)/(MapScale/4),1) * sin(Angle) * C.ClipX/1280),
         			    (C.ClipY-(176*C.ClipY/1024)) - (128*FMin(VSize(PlayerLocZeroed-ObjectiveLocZeroed)/(MapScale/4),1) * cos(Angle) * C .ClipY/1024));
                C.SetDrawColor(TheGame(Level.Game).Objectives[i].ObjectiveIconColor.R,
                               TheGame(Level.Game).Objectives[i].ObjectiveIconColor.G,
                               TheGame(Level.Game).Objectives[i].ObjectiveIconColor.B);
            	C.DrawTileScaled(TheGame(Level.Game).Objectives[i].ObjectiveIcon,0.5*C.ClipX/1280,0.5*C.ClipY/1024);
            }
        }
    }

    DrawCrosshair(C);
}

defaultproperties
{
    HUDMapOpacity=Texture'MyTextures.HUDMapOpacity'
    HUDMapBorder=Texture'MyTextures.HUDMapBorder'
    PlayerIcon=Texture'ONSInterface-TX.CurrentPlayerIcon'
    WaypointIcon=texture'MyTextures.ObjectiveWaypointTex'
    TargetPawnIcon=material'MyTextures.ObjectivePawnFinal'
}&lt;/uscript&gt;

The HUDMapOpacity is a texture with a white circle in the alpha, so that the map is displayed as a circle and not a square.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GTD-Carthage</title>
    <id>1375</id>
    <revision>
      <id>3486</id>
      <timestamp>2005-09-17T09:31:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===GTD-Carthage===

Nothing to say here yet but I'm new. :) This page will be updated soon though. :D 

----

'''Tarquin:''' hello :)</text>
    </revision>
    <revision>
      <id>3487</id>
      <timestamp>2005-09-17T06:07:16Z</timestamp>
      <contributor>
        <ip>GTD-Carthage</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===GTD-Carthage===

Nothing to say here yet but I'm new. :) This page will be updated soon though. :D 

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUI</title>
    <id>1333</id>
    <revision>
      <id>3394</id>
      <timestamp>2005-11-21T18:39:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; GUI (Package: XInterface)}}

The GUI class is an abstract class that holds all of the enums and structs for the UT2003 GUI ([[Wikipedia:Graphical User Interface]]) system. 

Most people who are starting to play with the GUI in Unreal Tournament will want to check out the Wiki article on the [[Legacy:GUIController|GUIController]] which contains information about the &quot;Interactive Gui design mode&quot;.

See [[Legacy:UWindowBase|UWindowBase]] for a similar class in [[Legacy:UT|UT]].

==Properties==
; [[Legacy:GUIController|GUIController]] Controller : A reference to the [[Legacy:GUIController|GUIController]] object. This is an [[Legacy:Interaction|Interaction]] subclass and can be used to execute [[Legacy:Console Commands|console commands]] and to access the local [[Legacy:PlayerController|PlayerController]] which in turn provides access to all other available actors.

==Constants==

These constants are used by the [[Legacy:GUIQuestionPage|GUIQuestionPage]] class to display certain buttons in a message box. You can combine any of these constants with the bitwise AND [[Legacy:Operator|operator]] &lt;tt&gt;&amp;&lt;/tt&gt; to get two or more buttons in the message box. For more information see [[Legacy:GUIQuestionPage|GUIQuestionPage]].
; QBTN_Ok          = 1   : Displays a button with the label &quot;Ok&quot;.
; QBTN_Cancel      = 2   : Displays a button with the label &quot;Cancel&quot;.
; QBTN_Retry       = 4   : Displays a button with the label &quot;Retry&quot;.
; QBTN_Continue    = 8   : Displays a button with the label &quot;Continue&quot;.
; QBTN_Yes         = 16  : Displays a button with the label &quot;Yes&quot;.
; QBTN_No          = 32  : Displays a button with the label &quot;No&quot;.
; QBTN_Abort       = 64  : Displays a button with the label &quot;Abort&quot;.
; QBTN_Ignore      = 128 : Displays a button with the label &quot;Ignore&quot;.
; QBTN_OkCancel    = 3   : Displays two buttons with the labels &quot;Ok&quot; and &quot;Cancel&quot;. This is a combination of the corresponding single-button constants above. You can get the same effect with &lt;code&gt;QBTN_Ok &amp; QBTN_Cancel&lt;/code&gt;.
; QBTN_AbortRetry  = 68  : Displays two buttons with the labels &quot;Abort&quot; and &quot;Retry&quot;. This is a combination of the corresponding single-button constants above.
; QBTN_YesNo       = 48  : Displays two buttons with the labels &quot;Yes&quot; and &quot;No&quot;. This is a combination of the corresponding single-button constants above.
; QBTN_YesNoCancel = 50  : Displays three buttons with the labels &quot;Yes&quot;, &quot;No&quot; and &quot;Cancel&quot;. This is a combination of the corresponding single-button constants above.

==Enums==

===eMenuState===

Defines the various states of a component.
;MSAT_Blurry : Component has no focus at all.
;MSAT_Watched : Component is being watched, i.e. Mouse is hovering over, etc.
;MSAT_Focused : Component is focused/selected.
;MSAT_Pressed : Component is being pressed.
;MSAT_Disabled : Component is disabled.

===eTextAlign===

Used for aligning text in a box.
;TXTA_Left :
;TXTA_Center :
;TXTA_Right :

===eTextCase===

Used for forcing case on text.
;TXTC_None : Text is displayed without modifications.
;TXTC_Upper : Text is displayed as UPPERCASE.
;TXTC_Lower : Text is displayed as lowercase.

===eImgStyle===

Used to define the style for an image.
;ISTY_Normal :
;ISTY_Stretched :
;ISTY_Scaled :
;ISTY_Bound :
;ISTY_Justified :

===eImgAlign===

Used for aligning justified images in a box.
;IMGA_TopLeft :
;IMGA_Center :
;IMGA_BottomRight :

===eEditMask===

Used to define the mask of an input box.
;EDM_None :
;EDM_Alpha :
;EDM_Numeric :

===EMenuRenderStyle===

Same order as the [[Legacy:Actor|Actor]].ERenderStyle enum. See [[Legacy:Actor.Display|Actor.Display]] and [[Legacy:Color Blending|Color Blending]].
;MSTY_None :
;MSTY_Normal :
;MSTY_Masked :
;MSTY_Translucent :
;MSTY_Modulated :
;MSTY_Alpha :
;MSTY_Additive :
;MSTY_Subtractive :
;MSTY_Particle :
;MSTY_AlphaZ :

===eIconPosition===
;ICP_Normal :
;ICP_Center :
;ICP_Scaled :
;ICP_Stretched :
;ICP_Bound :

===ePageAlign===

Used to align panels to a form.
;PGA_None :
;PGA_Client :
;PGA_Left :
;PGA_Right :
;PGA_Top :
;PGA_Bottom :

==Structs==

===GUIListElem===

Used by the [[Legacy:GUIList|GUIList]] class to store information for each list element.

&lt;uscript&gt;
struct GUIListElem
{
	var string item;
	var object ExtraData;
	var string ExtraStrData;
};
&lt;/uscript&gt;

==Known Subclasses==
* [[Legacy:GUIComponent|GUIComponent]]
* [[Legacy:GUIFont|GUIFont]]
* [[Legacy:GUIStyles|GUIStyles]]
* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]]

==Related Topics==
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]
* [[udn2:GUIReference]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3395</id>
      <timestamp>2003-10-14T20:19:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[udntech:GUIReference]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; GUI (Package: XInterface)}}

The GUI class is an abstract class that holds all of the enums and structs for the UT2003 GUI ([[Wikipedia:Graphical User Interface]]) system.

See [[Legacy:UWindowBase|UWindowBase]] for a similar class in [[Legacy:UT|UT]].

==Properties==
; [[Legacy:GUIController|GUIController]] Controller : A reference to the [[Legacy:GUIController|GUIController]] object. This is an [[Legacy:Interaction|Interaction]] subclass and can be used to execute [[Legacy:Console Commands|console commands]] and to access the local [[Legacy:PlayerController|PlayerController]] which in turn provides access to all other available actors.

==Constants==

These constants are used by the [[Legacy:GUIQuestionPage|GUIQuestionPage]] class to display certain buttons in a message box. You can combine any of these constants with the bitwise AND [[Legacy:Operator|operator]] &lt;tt&gt;&amp;&lt;/tt&gt; to get two or more buttons in the message box. For more information see [[Legacy:GUIQuestionPage|GUIQuestionPage]].
; QBTN_Ok          = 1   : Displays a button with the label &quot;Ok&quot;.
; QBTN_Cancel      = 2   : Displays a button with the label &quot;Cancel&quot;.
; QBTN_Retry       = 4   : Displays a button with the label &quot;Retry&quot;.
; QBTN_Continue    = 8   : Displays a button with the label &quot;Continue&quot;.
; QBTN_Yes         = 16  : Displays a button with the label &quot;Yes&quot;.
; QBTN_No          = 32  : Displays a button with the label &quot;No&quot;.
; QBTN_Abort       = 64  : Displays a button with the label &quot;Abort&quot;.
; QBTN_Ignore      = 128 : Displays a button with the label &quot;Ignore&quot;.
; QBTN_OkCancel    = 3   : Displays two buttons with the labels &quot;Ok&quot; and &quot;Cancel&quot;. This is a combination of the corresponding single-button constants above. You can get the same effect with &lt;code&gt;QBTN_Ok &amp; QBTN_Cancel&lt;/code&gt;.
; QBTN_AbortRetry  = 68  : Displays two buttons with the labels &quot;Abort&quot; and &quot;Retry&quot;. This is a combination of the corresponding single-button constants above.
; QBTN_YesNo       = 48  : Displays two buttons with the labels &quot;Yes&quot; and &quot;No&quot;. This is a combination of the corresponding single-button constants above.
; QBTN_YesNoCancel = 50  : Displays three buttons with the labels &quot;Yes&quot;, &quot;No&quot; and &quot;Cancel&quot;. This is a combination of the corresponding single-button constants above.

==Enums==

===eMenuState===

Defines the various states of a component.
;MSAT_Blurry : Component has no focus at all.
;MSAT_Watched : Component is being watched, i.e. Mouse is hovering over, etc.
;MSAT_Focused : Component is focused/selected.
;MSAT_Pressed : Component is being pressed.
;MSAT_Disabled : Component is disabled.

===eTextAlign===

Used for aligning text in a box.
;TXTA_Left :
;TXTA_Center :
;TXTA_Right :

===eTextCase===

Used for forcing case on text.
;TXTC_None : Text is displayed without modifications.
;TXTC_Upper : Text is displayed as UPPERCASE.
;TXTC_Lower : Text is displayed as lowercase.

===eImgStyle===

Used to define the style for an image.
;ISTY_Normal :
;ISTY_Stretched :
;ISTY_Scaled :
;ISTY_Bound :
;ISTY_Justified :

===eImgAlign===

Used for aligning justified images in a box.
;IMGA_TopLeft :
;IMGA_Center :
;IMGA_BottomRight :

===eEditMask===

Used to define the mask of an input box.
;EDM_None :
;EDM_Alpha :
;EDM_Numeric :

===EMenuRenderStyle===

Same order as the [[Legacy:Actor|Actor]].ERenderStyle enum. See [[Legacy:Actor.Display|Actor.Display]] and [[Legacy:Color Blending|Color Blending]].
;MSTY_None :
;MSTY_Normal :
;MSTY_Masked :
;MSTY_Translucent :
;MSTY_Modulated :
;MSTY_Alpha :
;MSTY_Additive :
;MSTY_Subtractive :
;MSTY_Particle :
;MSTY_AlphaZ :

===eIconPosition===
;ICP_Normal :
;ICP_Center :
;ICP_Scaled :
;ICP_Stretched :
;ICP_Bound :

===ePageAlign===

Used to align panels to a form.
;PGA_None :
;PGA_Client :
;PGA_Left :
;PGA_Right :
;PGA_Top :
;PGA_Bottom :

==Structs==

===GUIListElem===

Used by the [[Legacy:GUIList|GUIList]] class to store information for each list element.

&lt;uscript&gt;
struct GUIListElem
{
	var string item;
	var object ExtraData;
	var string ExtraStrData;
};
&lt;/uscript&gt;

==Known Subclasses==
* [[Legacy:GUIComponent|GUIComponent]]
* [[Legacy:GUIFont|GUIFont]]
* [[Legacy:GUIStyles|GUIStyles]]
* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]]

==Related Topics==
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]
* [[udn2:GUIReference]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3396</id>
      <timestamp>2004-09-29T09:58:07Z</timestamp>
      <contributor>
        <ip>219-88-205-170.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>Mention of the guicontroller article</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; GUI (Package: XInterface)}}

The GUI class is an abstract class that holds all of the enums and structs for the UT2003 GUI ([[Wikipedia:Graphical User Interface]]) system. 

Most people who are starting to play with the GUI in Unreal Tournament will want to check out the Wiki article on the [[Legacy:GUIController|GUIController]] which contains information about the &quot;Interactive Gui design mode&quot;.

See [[Legacy:UWindowBase|UWindowBase]] for a similar class in [[Legacy:UT|UT]].

==Properties==
; [[Legacy:GUIController|GUIController]] Controller : A reference to the [[Legacy:GUIController|GUIController]] object. This is an [[Legacy:Interaction|Interaction]] subclass and can be used to execute [[Legacy:Console Commands|console commands]] and to access the local [[Legacy:PlayerController|PlayerController]] which in turn provides access to all other available actors.

==Constants==

These constants are used by the [[Legacy:GUIQuestionPage|GUIQuestionPage]] class to display certain buttons in a message box. You can combine any of these constants with the bitwise AND [[Legacy:Operator|operator]] &lt;tt&gt;&amp;&lt;/tt&gt; to get two or more buttons in the message box. For more information see [[Legacy:GUIQuestionPage|GUIQuestionPage]].
; QBTN_Ok          = 1   : Displays a button with the label &quot;Ok&quot;.
; QBTN_Cancel      = 2   : Displays a button with the label &quot;Cancel&quot;.
; QBTN_Retry       = 4   : Displays a button with the label &quot;Retry&quot;.
; QBTN_Continue    = 8   : Displays a button with the label &quot;Continue&quot;.
; QBTN_Yes         = 16  : Displays a button with the label &quot;Yes&quot;.
; QBTN_No          = 32  : Displays a button with the label &quot;No&quot;.
; QBTN_Abort       = 64  : Displays a button with the label &quot;Abort&quot;.
; QBTN_Ignore      = 128 : Displays a button with the label &quot;Ignore&quot;.
; QBTN_OkCancel    = 3   : Displays two buttons with the labels &quot;Ok&quot; and &quot;Cancel&quot;. This is a combination of the corresponding single-button constants above. You can get the same effect with &lt;code&gt;QBTN_Ok &amp; QBTN_Cancel&lt;/code&gt;.
; QBTN_AbortRetry  = 68  : Displays two buttons with the labels &quot;Abort&quot; and &quot;Retry&quot;. This is a combination of the corresponding single-button constants above.
; QBTN_YesNo       = 48  : Displays two buttons with the labels &quot;Yes&quot; and &quot;No&quot;. This is a combination of the corresponding single-button constants above.
; QBTN_YesNoCancel = 50  : Displays three buttons with the labels &quot;Yes&quot;, &quot;No&quot; and &quot;Cancel&quot;. This is a combination of the corresponding single-button constants above.

==Enums==

===eMenuState===

Defines the various states of a component.
;MSAT_Blurry : Component has no focus at all.
;MSAT_Watched : Component is being watched, i.e. Mouse is hovering over, etc.
;MSAT_Focused : Component is focused/selected.
;MSAT_Pressed : Component is being pressed.
;MSAT_Disabled : Component is disabled.

===eTextAlign===

Used for aligning text in a box.
;TXTA_Left :
;TXTA_Center :
;TXTA_Right :

===eTextCase===

Used for forcing case on text.
;TXTC_None : Text is displayed without modifications.
;TXTC_Upper : Text is displayed as UPPERCASE.
;TXTC_Lower : Text is displayed as lowercase.

===eImgStyle===

Used to define the style for an image.
;ISTY_Normal :
;ISTY_Stretched :
;ISTY_Scaled :
;ISTY_Bound :
;ISTY_Justified :

===eImgAlign===

Used for aligning justified images in a box.
;IMGA_TopLeft :
;IMGA_Center :
;IMGA_BottomRight :

===eEditMask===

Used to define the mask of an input box.
;EDM_None :
;EDM_Alpha :
;EDM_Numeric :

===EMenuRenderStyle===

Same order as the [[Legacy:Actor|Actor]].ERenderStyle enum. See [[Legacy:Actor.Display|Actor.Display]] and [[Legacy:Color Blending|Color Blending]].
;MSTY_None :
;MSTY_Normal :
;MSTY_Masked :
;MSTY_Translucent :
;MSTY_Modulated :
;MSTY_Alpha :
;MSTY_Additive :
;MSTY_Subtractive :
;MSTY_Particle :
;MSTY_AlphaZ :

===eIconPosition===
;ICP_Normal :
;ICP_Center :
;ICP_Scaled :
;ICP_Stretched :
;ICP_Bound :

===ePageAlign===

Used to align panels to a form.
;PGA_None :
;PGA_Client :
;PGA_Left :
;PGA_Right :
;PGA_Top :
;PGA_Bottom :

==Structs==

===GUIListElem===

Used by the [[Legacy:GUIList|GUIList]] class to store information for each list element.

&lt;uscript&gt;
struct GUIListElem
{
	var string item;
	var object ExtraData;
	var string ExtraStrData;
};
&lt;/uscript&gt;

==Known Subclasses==
* [[Legacy:GUIComponent|GUIComponent]]
* [[Legacy:GUIFont|GUIFont]]
* [[Legacy:GUIStyles|GUIStyles]]
* [[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]]

==Related Topics==
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]
* [[udn2:GUIReference]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUI Class Hierarchy</title>
    <id>1348</id>
    <revision>
      <id>3427</id>
      <timestamp>2006-04-07T07:56:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This is the [[Legacy:Class Tree|class tree]] extending from GUI in [[Legacy:UT2003|UT2003]].  For a class tree of the Actor hierarchy see [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]].  [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] has some information on how these classes can be used to build a configuration screen for a small mutator.

==Adding new class pages==

Any UT2003 GUI class page should begin with the text:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; etc}}

==Class Tree==

All classes are in the xInterface package unless otherwise stated.

  [[Legacy:GUI|GUI]]
   +-[[Legacy:GUIComponent|GUIComponent]]
   |    +-[[Legacy:GUIButton|GUIButton]]
   |    |    +-[[Legacy:GUIEditBox|GUIEditBox]]
   |    |    +-[[Legacy:GUIGFXButton|GUIGFXButton]]
   |    |    |    +-[[Legacy:GUICheckBoxButton|GUICheckBoxButton]]
   |    |    |    +-[[Legacy:GUIHorizGripButton|GUIHorizGripButton]]
   |    |    |    +-[[Legacy:GUIHorizScrollButton|GUIHorizScrollButton]]
   |    |    |    +-[[Legacy:GUISpinnerButton|GUISpinnerButton]]
   |    |    |    +-[[Legacy:GUIVertGripButton|GUIVertGripButton]]
   |    |    |    +-[[Legacy:GUIVertScrollButton|GUIVertScrollButton]]
   |    |    |    |    +-[[Legacy:GUIComboButton|GUIComboButton]]
   |    |    |    +-[[Legacy:LadderButton|LadderButton]]
   |    |    +-[[Legacy:GUITabButton|GUITabButton]]
   |    +-[[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
   |    +-[[Legacy:GUIImage|GUIImage]]
   |    |    +-[[Legacy:GUIImageList|GUIImageList]]
   |    +-[[Legacy:GUILabel|GUILabel]]
   |    +-[[Legacy:GUIListBase|GUIListBase]]
   |    |    +-[[Legacy:GUICircularList|GUICircularList]]
   |    |    |    +-[[Legacy:GUICharacterList|GUICharacterList]]
   |    |    |         +-[[Legacy:GUICharacterListTeam|GUICharacterListTeam]]
   |    |    +-[[Legacy:GUIHorzList|GUIHorzList]]
   |    |    +-[[Legacy:GUIVertList|GUIVertList]]
   |    |         +-[[Legacy:GUIList|GUIList]]
   |    |         |    +-[[Legacy:GUIScrollText|GUIScrollText]]
   |    |         +-[[Legacy:GUIMultiColumnList|GUIMultiColumnList]] &amp;ndash; ''Not expanded here''
   |    +-[[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
   |    +-[[Legacy:GUIMultiComponent|GUIMultiComponent]]
   |    |    +-[[Legacy:GUIComboBox|GUIComboBox]]
   |    |    +-[[Legacy:GUIFloatEdit|GUIFloatEdit]]
   |    |    +-[[Legacy:GUIListBoxBase|GUIListBoxBase]]
   |    |    |    +-[[Legacy:GUIListBox|GUIListBox]]
   |    |    |    +-[[Legacy:GUIMultiColumnListBox|GUIMultiColumnListBox]]
   |    |    |    +-[[Legacy:GUIScrollTextBox|GUIScrollTextBox]]
   |    |    +-[[Legacy:GUIMenuOption|GUIMenuOption]]
   |    |    |    +-[[Legacy:MoCheckBox|moCheckBox]]
   |    |    |    +-[[Legacy:MoComboBox|moComboBox]]
   |    |    |    +-[[Legacy:MoEditBox|moEditBox]]
   |    |    |    +-[[Legacy:MoFloatEdit|moFloatEdit]]
   |    |    |    +-[[Legacy:MoNumericEdit|moNumericEdit]]
   |    |    +-[[Legacy:GUINumericEdit|GUINumericEdit]]
   |    |    +-[[Legacy:GUIPage|GUIPage]] &amp;ndash; ''Not expanded here''
   |    |    +-[[Legacy:GUIPanel|GUIPanel]]
   |    |    |    +-[[Legacy:GUISplitter|GUISplitter]]
   |    |    |    +-[[Legacy:GUITabPanel|GUITabPanel]] &amp;ndash; ''Not expanded here''
   |    |    +-[[Legacy:GUIScrollBarBase|GUIScrollBarBase]]
   |    |    |    +-[[Legacy:GUIHorzScrollBar|GUIHorzScrollBar]]
   |    |    |    +-[[Legacy:GUIVertScrollBar|GUIVertScrollBar]]
   |    |    +-[[Legacy:GUITabControl|GUITabControl]]
   |    +-[[Legacy:GUIProgressBar|GUIProgressBar]]
   |    +-[[Legacy:GUISlider|GUISlider]]
   |    +-[[Legacy:GUITitleBar|GUITitleBar]]
   |    +-[[Legacy:GUIVertScrollZone|GUIVertScrollZone]]
   +-[[Legacy:GUIFont|GUIFont]] &amp;ndash; ''Not expanded here''
   +-[[Legacy:GUIStyles|GUIStyles]] &amp;ndash; ''Not expanded here''
   +-[[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]]

==Related Topics==
* [[Legacy:GUIController|GUIController]] class
* [[Legacy:Making Mods|Making Mods]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3428</id>
      <timestamp>2005-12-03T03:09:20Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the [[Legacy:Class Tree|class tree]] extending from GUI in [[Legacy:UT2003|UT2003]].  For a class tree of the Actor hierarchy see [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]].  [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] has some information on how these classes can be used to build a configuration screen for a small mutator.

==Adding new class pages ==

Any UT2003 GUI class page should begin with the text:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; etc}}

==Class Tree ==

All classes are in the xInterface package unless otherwise stated.

  [[Legacy:GUI|GUI]]
   +-[[Legacy:GUIComponent|GUIComponent]]
   |    +-[[Legacy:GUIButton|GUIButton]]
   |    |    +-[[Legacy:GUIEditBox|GUIEditBox]]
   |    |    +-[[Legacy:GUIGFXButton|GUIGFXButton]]
   |    |    |    +-[[Legacy:GUICheckBoxButton|GUICheckBoxButton]]
   |    |    |    +-[[Legacy:GUIHorizGripButton|GUIHorizGripButton]]
   |    |    |    +-[[Legacy:GUIHorizScrollButton|GUIHorizScrollButton]]
   |    |    |    +-[[Legacy:GUISpinnerButton|GUISpinnerButton]]
   |    |    |    +-[[Legacy:GUIVertGripButton|GUIVertGripButton]]
   |    |    |    +-[[Legacy:GUIVertScrollButton|GUIVertScrollButton]]
   |    |    |    |    +-[[Legacy:GUIComboButton|GUIComboButton]]
   |    |    |    +-[[Legacy:LadderButton|LadderButton]]
   |    |    +-[[Legacy:GUITabButton|GUITabButton]]
   |    +-[[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
   |    +-[[Legacy:GUIImage|GUIImage]]
   |    |    +-[[Legacy:GUIImageList|GUIImageList]]
   |    +-[[Legacy:GUILabel|GUILabel]]
   |    +-[[Legacy:GUIListBase|GUIListBase]]
   |    |    +-[[Legacy:GUICircularList|GUICircularList]]
   |    |    |    +-[[Legacy:GUICharacterList|GUICharacterList]]
   |    |    |         +-[[Legacy:GUICharacterListTeam|GUICharacterListTeam]]
   |    |    +-[[Legacy:GUIHorzList|GUIHorzList]]
   |    |    +-[[Legacy:GUIVertList|GUIVertList]]
   |    |         +-[[Legacy:GUIList|GUIList]]
   |    |         |    +-[[Legacy:GUIScrollText|GUIScrollText]]
   |    |         +-[[Legacy:GUIMultiColumnList|GUIMultiColumnList]] &amp;ndash; ''Not expanded here''
   |    +-[[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
   |    +-[[Legacy:GUIMultiComponent|GUIMultiComponent]]
   |    |    +-[[Legacy:GUIComboBox|GUIComboBox]]
   |    |    +-[[Legacy:GUIFloatEdit|GUIFloatEdit]]
   |    |    +-[[Legacy:GUIListBoxBase|GUIListBoxBase]]
   |    |    |    +-[[Legacy:GUIListBox|GUIListBox]]
   |    |    |    +-[[Legacy:GUIMultiColumnListBox|GUIMultiColumnListBox]]
   |    |    |    +-[[Legacy:GUIScrollTextBox|GUIScrollTextBox]]
   |    |    +-[[Legacy:GUIMenuOption|GUIMenuOption]]
   |    |    |    +-[[Legacy:MoCheckBox|moCheckBox]]
   |    |    |    +-[[Legacy:MoComboBox|moComboBox]]
   |    |    |    +-[[Legacy:MoEditBox|moEditBox]]
   |    |    |    +-[[Legacy:MoFloatEdit|moFloatEdit]]
   |    |    |    +-[[Legacy:MoNumericEdit|moNumericEdit]]
   |    |    +-[[Legacy:GUINumericEdit|GUINumericEdit]]
   |    |    +-[[Legacy:GUIPage|GUIPage]] &amp;ndash; ''Not expanded here''
   |    |    +-[[Legacy:GUIPanel|GUIPanel]]
   |    |    |    +-[[Legacy:GUISplitter|GUISplitter]]
   |    |    |    +-[[Legacy:GUITabPanel|GUITabPanel]] &amp;ndash; ''Not expanded here''
   |    |    +-[[Legacy:GUIScrollBarBase|GUIScrollBarBase]]
   |    |    |    +-[[Legacy:GUIHorzScrollBar|GUIHorzScrollBar]]
   |    |    |    +-[[Legacy:GUIVertScrollBar|GUIVertScrollBar]]
   |    |    +-[[Legacy:GUITabControl|GUITabControl]]
   |    +-[[Legacy:GUIProgressBar|GUIProgressBar]]
   |    +-[[Legacy:GUISlider|GUISlider]]
   |    +-[[Legacy:GUITitleBar|GUITitleBar]]
   |    +-[[Legacy:GUIVertScrollZone|GUIVertScrollZone]]
   +-[[Legacy:GUIFont|GUIFont]] &amp;ndash; ''Not expanded here''
   +-[[Legacy:GUIStyles|GUIStyles]] &amp;ndash; ''Not expanded here''
   +-[[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]]

==Related Topics==
* [[Legacy:GUIController|GUIController]] class
* [[Legacy:Making Mods|Making Mods]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3429</id>
      <timestamp>2006-04-06T21:05:59Z</timestamp>
      <contributor>
        <ip>User.thomson.com</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">This is the [[Legacy:Class Tree|class tree]] extending from GUI in [[Legacy:UT2003|UT2003]].  For a class tree of the Actor hierarchy see [[Legacy:Actor Class Hierarchy|Actor Class Hierarchy]].  [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] has some information on how these classes can be used to build a configuration screen for a small mutator.

==Adding new class pages ==

Any UT2003 GUI class page should begin with the text:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; etc}}

==Class Tree ==

All classes are in the xInterface package unless otherwise stated.

  [[Legacy:GUI|GUI]]
   +-[[Legacy:GUIComponent|GUIComponent]]
   |    +-[[Legacy:GUIButton|GUIButton]]
   |    |    +-[[Legacy:GUIEditBox|GUIEditBox]]
   |    |    +-[[Legacy:GUIGFXButton|GUIGFXButton]]
   |    |    |    +-[[Legacy:GUICheckBoxButton|GUICheckBoxButton]]
   |    |    |    +-[[Legacy:GUIHorizGripButton|GUIHorizGripButton]]
   |    |    |    +-[[Legacy:GUIHorizScrollButton|GUIHorizScrollButton]]
   |    |    |    +-[[Legacy:GUISpinnerButton|GUISpinnerButton]]
   |    |    |    +-[[Legacy:GUIVertGripButton|GUIVertGripButton]]
   |    |    |    +-[[Legacy:GUIVertScrollButton|GUIVertScrollButton]]
   |    |    |    |    +-[[Legacy:GUIComboButton|GUIComboButton]]
   |    |    |    +-[[Legacy:LadderButton|LadderButton]]
   |    |    +-[[Legacy:GUITabButton|GUITabButton]]
   |    +-[[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
   |    +-[[Legacy:GUIImage|GUIImage]]
   |    |    +-[[Legacy:GUIImageList|GUIImageList]]
   |    +-[[Legacy:GUILabel|GUILabel]]
   |    +-[[Legacy:GUIListBase|GUIListBase]]
   |    |    +-[[Legacy:GUICircularList|GUICircularList]]
   |    |    |    +-[[Legacy:GUICharacterList|GUICharacterList]]
   |    |    |         +-[[Legacy:GUICharacterListTeam|GUICharacterListTeam]]
   |    |    +-[[Legacy:GUIHorzList|GUIHorzList]]
   |    |    +-[[Legacy:GUIVertList|GUIVertList]]
   |    |         +-[[Legacy:GUIList|GUIList]]
   |    |         |    +-[[Legacy:GUIScrollText|GUIScrollText]]
   |    |         +-[[Legacy:GUIMultiColumnList|GUIMultiColumnList]] &amp;ndash; ''Not expanded here''
   |    +-[[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
   |    +-[[Legacy:GUIMultiComponent|GUIMultiComponent]]
   |    |    +-[[Legacy:GUIComboBox|GUIComboBox]]
   |    |    +-[[Legacy:GUIFloatEdit|GUIFloatEdit]]
   |    |    +-[[Legacy:GUIListBoxBase|GUIListBoxBase]]
   |    |    |    +-[[Legacy:GUIListBox|GUIListBox]]
   |    |    |    +-[[Legacy:GUIMultiColumnListBox|GUIMultiColumnListBox]]
   |    |    |    +-[[Legacy:GUIScrollTextBox|GUIScrollTextBox]]
   |    |    +-[[Legacy:GUIMenuOption|GUIMenuOption]]
   |    |    |    +-[[Legacy:MoCheckBox|moCheckBox]]
   |    |    |    +-[[Legacy:MoComboBox|moComboBox]]
   |    |    |    +-[[Legacy:MoEditBox|moEditBox]]
   |    |    |    +-[[Legacy:MoFloatEdit|moFloatEdit]]
   |    |    |    +-[[Legacy:MoNumericEdit|moNumericEdit]]
   |    |    +-[[Legacy:GUINumericEdit|GUINumericEdit]]
   |    |    +-[[Legacy:GUIPage|GUIPage]] &amp;ndash; ''Not expanded here''
   |    |    +-[[Legacy:GUIPanel|GUIPanel]]
   |    |    |    +-[[Legacy:GUISplitter|GUISplitter]]
   |    |    |    +-[[Legacy:GUITabPanel|GUITabPanel]] &amp;ndash; ''Not expanded here''
   |    |    +-[[Legacy:GUIScrollBarBase|GUIScrollBarBase]]
   |    |    |    +-[[Legacy:GUIHorzScrollBar|GUIHorzScrollBar]]
   |    |    |    +-[[Legacy:GUIVertScrollBar|GUIVertScrollBar]]
   |    |    +-[[Legacy:GUITabControl|GUITabControl]]
   |    +-[[Legacy:GUIProgressBar|GUIProgressBar]]
   |    +-[[Legacy:GUISlider|GUISlider]]
   |    +-[[Legacy:GUITitleBar|GUITitleBar]]
   |    +-[[Legacy:GUIVertScrollZone|GUIVertScrollZone]]
   +-[[Legacy:GUIFont|GUIFont]] &amp;ndash; ''Not expanded here''
   +-[[Legacy:GUIStyles|GUIStyles]] &amp;ndash; ''Not expanded here''
   +-[[Legacy:GUIUserKeyBinding|GUIUserKeyBinding]]

==Related Topics==
* [[Legacy:GUIController|GUIController]] class
* [[Legacy:Making Mods|Making Mods]]

----

[[:Category:Legacy Class Tree]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUI Overview</title>
    <id>1378</id>
    <revision>
      <id>3493</id>
      <timestamp>2006-05-14T21:59:19Z</timestamp>
      <contributor>
        <ip>Dyn-62-56-79-144.dslaccess.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Not sure where this should be linked in from, or if there's another page that would provide a better home for this information.  If someone knows of a better place for this page, please feel free to move it, rename it, refactor it, whatever.  In its present form it's basically just raw data.

==What is the relationship between the [[Legacy:Canvas|Canvas]], [[Legacy:Interactions|Interactions]], [[Legacy:GUI|GUI]] and [[Legacy:HUD|HUD]]?==

Canvas is the mid-level interface that handles rendering to the screen (that is, rendering things that are not part of the world). Anything that needs to be rendered directly to the screen (GUI, HUD, etc.) will render to the Canvas object.

Interactions are objects that are solely used for the purpose of interacting with the player - they [typically] don't really care what's going on in the world, and are not bound to the GUI. The GUI is simply the most prominent usage of the Interaction system.

Some interactions:
; GUIController: it takes input from the player, passes that input to various GUI objects, and tells GUI objects when and how to render
; Console: it takes input (in the form of text commands) from the player, and renders the results of those commands onscreen
; StreamInteraction (UT2004): responsible for sending/receiving messages with the low-level audio code to play MP3/OGG files, according to playlists configured by the user.

GUI objects are the graphical tools that the GUIController uses to interact with the player.

The HUD is used by the game to communicate game state information to the player. It is not an Interaction - it cannot process input from the player.

==How do I make a new GUI? ==

The best way to understand how to make a new GUI is to read http://udn.epicgames.com/Two/GuiReference, browse the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] and look at the [[Legacy:UnrealScript Source|UnrealScript source]]. You will probably find the best documentation is in the source code itself.

Generally speaking, every GUI &quot;widget&quot; is a subclass of [[Legacy:GUIComponent|GUIComponent]]. GUIComponent's that consist of or contain other GUIComponents are subclasses of [[Legacy:GUIMultiComponent|GUIMultiComponent]]. There is an [[Legacy:Interactive GUI|Interactive GUI]] mode for interactive GUI design, which will dump out to a file the specified components and properties, or you can code it in UnrealScript from scratch.

Typically, you would define your own subclass of [[Legacy:GUIPage|GUIPage]], for example, specify each subcomponent as an [[Legacy:Automated Component|Automated Component]] and specify the properties, including position, size, appearance, and whether it's scaled and positioned according to its parent component, in the [[Legacy:Default Properties|default properties]] section.

If you do need to directly instantiate a [[Legacy:GUIComponent|GUIComponent]], e.g. &lt;code&gt;button = new class'GUIButton'&lt;/code&gt;, you would have to set the properties on the object and then add it to the parent component by calling AppendComponent.

==How do I change the GUI look-and-feel? ==

Each [[Legacy: GUIComponent | GUIComponent ]] has a styleName variable associated with a [[Legacy:GUIStyles|GUIStyles]] object that specifies the component appearance. See http://udn.epicgames.com/Two/GUIStylesExample for detail on how to construct one.

Note that the GUIStyles affect some components differently, e.g. [[Legacy: GUILabel | GUILabel ]] has member variables that explicitly set transparency, background color, and so forth. And a [[Legacy: GUIMultiComponent | GUIMultiComponent ]] does not automatically propagate its styleName to its subcomponents - you will have to set those explicitly on a case by case basis.

To use a [[Legacy:GUIStyles|GUIStyles]] object, it has to be registered with the [[Legacy: GUIController | GUIController ]], e.g. in the InitComponent function of the enclosing [[Legacy: GUIPage | GUIPage ]]

==How do I use a new font? ==

The font used in each [[Legacy:GUIComponent|GUIComponent]] is specified in its [[Legacy:GUIStyles|GUIStyles]] object. A [[Legacy:GUIStyles|GUIStyles]] object has a 15-element string array called FontArrayNames, each entry identifying a [[Legacy:GUIFont|GUIFont]] object. A [[Legacy:GUIFont|GUIFont]] in turn has a dynamic array that references [[Legacy:Font|Font]] objects. A new [[Legacy:Font|Font]] can be loaded using the [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]] [[Legacy:Exec Directive|Exec Directive]]. The new [[Legacy:GUIFont|GUIFont]] must be added to the [[Legacy:GUIController|GUIController]] font stack, typically by subclassing [[Legacy:GUIController|GUIController]] (and then specifying the new [[Legacy:GUIController|GUIController]] in the game .ini file.

==How do I use the UT2004 GUI animation system?==

GUI animation is fairly simplistic. Each GUIComponent stores keyframe data using an array of vectors for each type of animation supported, where the X and Y components are dependent on the type of animation, and the Z component represents the remaining interpolation time. GUIComponent.MotionFrame tracks position keyframes, whereas GUIComponent.SizeFrame tracks dimension keyframes.

Interpolation is strictly linear - each frame, &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt; adjusts the component's position/dimension based on the time remaining for the first keyframe, and decrements that keyframe's counter. Once the counter for that keyframe reaches 0, it is removed from the list of keyframes, the component is notified via delegateOnArrival (see below), and the process continues using the next keyframe, if it exists.

Script-side, position keyframes are added by calling Animate(), and dimension keyframes are added by calling Resize(). For the most part, you'll want to use these functions to add keyframes, rather than modifying the keyframe arrays directly, so that all of the various notifications are called in the correct order. There are several events and delegates related to GUI animation:
; event BeginAnimation(): indicates that this component has started an animation sequence. Called from Animate/Resize when there are no existing keyframes, and will be propagated up the MenuOwner chain.
; event EndAnimation(): indicates that this component has ended an animation sequence. Called from &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt;(), after removing a keyframe when there are no additionl keyframes, and is propagated up the MenuOwner chain.
; function KillAnimation(): immediately removes all keyframes and ends all animation for the component. This function would be called by client code to force animation sequences to end.
; delegate OnArrival(): indicates that this component has arrived at a keypoint. Called from &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt;(), each time a keyframe is removed from the current sequence.
; delegate OnEndAnimation(): indicates that this component has ended an animation sequence. Called from GUIComponent.EndAnimation. While EndAnimation event would be called on each component in the MenuOwner chain, OnEndAnimation would only be called on the component that was animating.

==Is the GUI animation system related to drag-n-drop?==

No, drag-n-drop is completely separate from the GUI animation code. Here is an overview of the drag-n-drop system. The following properties are related to drag-n-drop:

; GUIController.DropSource: Pointer to the GUIComponent that is the source of the drag-n-drop, or NULL if not currently performing a drag-n-drop.  enerally, the DropSource will have the first opportunity to handle input events, such as mouse clicks, releases, and movement. 
; GUIController.DropTarget: Pointer to the GUIComponent that will receive the drag-n-drop - generally the component that the mouse is currently hovering over (the GUIController's ActiveControl), or NULL if no valid target exists (if we're not performing a drag-n-drop, or the ActiveControl does not support drag-n-drop
; GUIComponent.bDropSource: Must be true in order for a component to be the source of a drag-n-drop operation.
; GUIComponent.bDropTarget: Must be true in order for the component to be the target of a drag-n-drop. (Note: it is perfectly acceptable for a  GUIComponent to be a valid drop-source, but not a drop-target, or vice-versa)
; GUIComponent.DropState: The current drag-n-drop state of the component 

The following events and delegates are related to drag-n-drop (all located in GUIComponent.uc):
; event DropStateChange(eDropState NewState): Called when the drag-n-drop state of the component changes, e.g. the component becomes the GUIController's DropSource (beginning a drag-n-drop), the component becomes the GUIController's DropTarget (moused over while a drag-n-drop operation is in progress), etc.
; delegate bool OnBeginDrag(GUIComponent Sender): Called once on a component when it becomes the DropSource. Return false to prevent the drag-n-drop operation from beginning.
; delegate OnEndDrag(GUIComponent Sender, bool bAccepted): Called on the DropSource when the user releases the mouse during a drag-n-drop operation.  Accepted indicates whether the drag-n-drop operation was successful. A false value indicates that there was no valid DropTarget (if Sender == None), or that the DropTarget didn't want to receive the drag-n-drop for any reason.
; delegate bool OnDragDrop(GUIComponent Sender): Called once on the DropTarget when the user releases the mouse. The return value of this delegate is used as the value for bAccepted in OnEndDrag.
; delegate OnDragEnter(GUIComponent Sender): Called once on a component that is a valid DropTarget (that is, bDropTarget is true), when the mouse enters that component's bounds. 
; delegate OnDragLeave(GUIComponent Sender): Similar to the above, for leaving the component's Bounds. 
; delegate OnDragOver(GUIComponent Sender): Called on the DropTarget once each cycle. 

In most cases, the actual work of a drag-n-drop operation will be performed from OnEndDrag (for the dropsource) and OnDragDrop (for the droptarget), and depending on exactly what you're doing, may be the only delegates you'll need to hook up. 

For a working example, see the GUIListBase class. It contains all functionality necessary to enable drag-n-drop operations to and from lists. It is structured so that child classes of GUIListBase need only implement the two delegates I mentioned above - OnEndDrag and OnDragDrop, which have been assigned in GUIListBase to InternalOnEndDrag and InternalOnDragDrop, repectively, to simplify overriding the default behavior in child classes.

==How do I handle mouse click events?==

GUI mouse clicks are handled by &lt;nowiki&gt;UGUIController::MousePressed and UGUIController::MouseReleased&lt;/nowiki&gt;. For most input events (including mouse clicks), the general order in which components will receive notification of the input event is:
# GUIController.ActiveControl (which is updated natively each tick)
# GUIController.ActivePage (the last opened menu)
# each page in the GUIController's menustack, starting with the most recently opened menu

GUIComponents indicate that they've handled the input by returning true from the appropriate input function. Once that happens, the input chain stops. For mouse input, this function is &lt;nowiki&gt;UGUIComponent::MousePressed and UGUIComponent::MouseReleased&lt;/nowiki&gt;. For example, if the ActiveControl returns true from its MousePressed function, then the ActivePage and MenuStack would not be notified of the mouse press.

When a component receives a call to MousePressed/MouseReleased, it notifies unrealscript by calling delegates. To have unrealscript do something when mouse input is received, you should assign these delegates and perform whatever logic you want to do from there. Here's an overview of the mouse-related delegates:

; delegate OnMousePressed(): called from &lt;nowiki&gt;UGUIComponent::MousePressed&lt;/nowiki&gt;, when the left mouse button is pressed or held. 
; delegate OnMouseReleased(): called from &lt;nowiki&gt;UGUIComponent::MouseReleased&lt;/nowiki&gt;, when the left mouse button is released
; delegate OnClick: This is the primary mouse input function; called immediately after OnMouseReleased. The return value from this delegate is used as the return value for the native MouseRelease(). 
; delegate OnDblClick: when the user double-clicks on a component
; delegate OnRightClick: when the right mouse button is released

==How do I handle mouseover events?==

; delegate OnHover: when the mouse is moved over a component

----

==Related Topics ==
* [[Legacy:Interactive GUI|Interactive GUI Design Mode]]
* [[Legacy:Automated Component|Automated Components in UT2004]]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3494</id>
      <timestamp>2006-03-08T00:06:44Z</timestamp>
      <contributor>
        <ip>Technicat</ip>
      </contributor>
      <comment>link to Unrealscript source page</comment>
      <text xml:space="preserve">Not sure where this should be linked in from, or if there's another page that would provide a better home for this information.  If someone knows of a better place for this page, please feel free to move it, rename it, refactor it, whatever.  In its present form it's basically just raw data.

==What is the relationship between the [[Legacy:Canvas|Canvas]], [[Legacy:Interactions|Interactions]], [[Legacy:GUI|GUI]] and [[Legacy:HUD|HUD]]?==

Canvas is the mid-level interface that handles rendering to the screen (that is, rendering things that are not part of the world). Anything that needs to be rendered directly to the screen (GUI, HUD, etc.) will render to the Canvas object.

Interactions are objects that are solely used for the purpose of interacting with the player - they [typically] don't really care what's going on in the world, and are not bound to the GUI. The GUI is simply the most prominent usage of the Interaction system.

Some interactions:
; GUIController: it takes input from the player, passes that input to various GUI objects, and tells GUI objects when and how to render
; Console: it takes input (in the form of text commands) from the player, and renders the results of those commands onscreen
; StreamInteraction (UT2004): responsible for sending/receiving messages with the low-level audio code to play MP3/OGG files, according to playlists configured by the user.

GUI objects are the graphical tools that the GUIController uses to interact with the player.

The HUD is used by the game to communicate game state information to the player. It is not an Interaction - it cannot process input from the player.

==How do I make a new GUI? ==

The best way to understand how to make a new GUI is to read http://udn.epicgames.com/Two/GUIReference, browse the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] and look at the [[Legacy:UnrealScript Source|UnrealScript source]]. You will probably find the best documentation is in the source code itself.

Generally speaking, every GUI &quot;widget&quot; is a subclass of [[Legacy:GUIComponent|GUIComponent]]. GUIComponent's that consist of or contain other GUIComponents are subclasses of [[Legacy:GUIMultiComponent|GUIMultiComponent]]. There is an [[Legacy:Interactive GUI|Interactive GUI]] mode for interactive GUI design, which will dump out to a file the specified components and properties, or you can code it in UnrealScript from scratch.

Typically, you would define your own subclass of [[Legacy:GUIPage|GUIPage]], for example, specify each subcomponent as an [[Legacy:Automated Component|Automated Component]] and specify the properties, including position, size, appearance, and whether it's scaled and positioned according to its parent component, in the [[Legacy:Default Properties|default properties]] section.

If you do need to directly instantiate a [[Legacy:GUIComponent|GUIComponent]], e.g. &lt;code&gt;button = new class'GUIButton'&lt;/code&gt;, you would have to set the properties on the object and then add it to the parent component by calling AppendComponent.

==How do I change the GUI look-and-feel? ==

Each [[Legacy: GUIComponent | GUIComponent ]] has a styleName variable associated with a [[Legacy:GUIStyles|GUIStyles]] object that specifies the component appearance. See http://udn.epicgames.com/Two/GUIStylesExample for detail on how to construct one.

Note that the GUIStyles affect some components differently, e.g. [[Legacy: GUILabel | GUILabel ]] has member variables that explicitly set transparency, background color, and so forth. And a [[Legacy: GUIMultiComponent | GUIMultiComponent ]] does not automatically propagate its styleName to its subcomponents - you will have to set those explicitly on a case by case basis.

To use a [[Legacy:GUIStyles|GUIStyles]] object, it has to be registered with the [[Legacy: GUIController | GUIController ]], e.g. in the InitComponent function of the enclosing [[Legacy: GUIPage | GUIPage ]]

==How do I use a new font? ==

The font used in each [[Legacy:GUIComponent|GUIComponent]] is specified in its [[Legacy:GUIStyles|GUIStyles]] object. A [[Legacy:GUIStyles|GUIStyles]] object has a 15-element string array called FontArrayNames, each entry identifying a [[Legacy:GUIFont|GUIFont]] object. A [[Legacy:GUIFont|GUIFont]] in turn has a dynamic array that references [[Legacy:Font|Font]] objects. A new [[Legacy:Font|Font]] can be loaded using the [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]] [[Legacy:Exec Directive|Exec Directive]]. The new [[Legacy:GUIFont|GUIFont]] must be added to the [[Legacy:GUIController|GUIController]] font stack, typically by subclassing [[Legacy:GUIController|GUIController]] (and then specifying the new [[Legacy:GUIController|GUIController]] in the game .ini file.

==How do I use the UT2004 GUI animation system?==

GUI animation is fairly simplistic. Each GUIComponent stores keyframe data using an array of vectors for each type of animation supported, where the X and Y components are dependent on the type of animation, and the Z component represents the remaining interpolation time. GUIComponent.MotionFrame tracks position keyframes, whereas GUIComponent.SizeFrame tracks dimension keyframes.

Interpolation is strictly linear - each frame, &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt; adjusts the component's position/dimension based on the time remaining for the first keyframe, and decrements that keyframe's counter. Once the counter for that keyframe reaches 0, it is removed from the list of keyframes, the component is notified via delegateOnArrival (see below), and the process continues using the next keyframe, if it exists.

Script-side, position keyframes are added by calling Animate(), and dimension keyframes are added by calling Resize(). For the most part, you'll want to use these functions to add keyframes, rather than modifying the keyframe arrays directly, so that all of the various notifications are called in the correct order. There are several events and delegates related to GUI animation:
; event BeginAnimation(): indicates that this component has started an animation sequence. Called from Animate/Resize when there are no existing keyframes, and will be propagated up the MenuOwner chain.
; event EndAnimation(): indicates that this component has ended an animation sequence. Called from &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt;(), after removing a keyframe when there are no additionl keyframes, and is propagated up the MenuOwner chain.
; function KillAnimation(): immediately removes all keyframes and ends all animation for the component. This function would be called by client code to force animation sequences to end.
; delegate OnArrival(): indicates that this component has arrived at a keypoint. Called from &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt;(), each time a keyframe is removed from the current sequence.
; delegate OnEndAnimation(): indicates that this component has ended an animation sequence. Called from GUIComponent.EndAnimation. While EndAnimation event would be called on each component in the MenuOwner chain, OnEndAnimation would only be called on the component that was animating.

==Is the GUI animation system related to drag-n-drop?==

No, drag-n-drop is completely separate from the GUI animation code. Here is an overview of the drag-n-drop system. The following properties are related to drag-n-drop:

; GUIController.DropSource: Pointer to the GUIComponent that is the source of the drag-n-drop, or NULL if not currently performing a drag-n-drop.  enerally, the DropSource will have the first opportunity to handle input events, such as mouse clicks, releases, and movement. 
; GUIController.DropTarget: Pointer to the GUIComponent that will receive the drag-n-drop - generally the component that the mouse is currently hovering over (the GUIController's ActiveControl), or NULL if no valid target exists (if we're not performing a drag-n-drop, or the ActiveControl does not support drag-n-drop
; GUIComponent.bDropSource: Must be true in order for a component to be the source of a drag-n-drop operation.
; GUIComponent.bDropTarget: Must be true in order for the component to be the target of a drag-n-drop. (Note: it is perfectly acceptable for a  GUIComponent to be a valid drop-source, but not a drop-target, or vice-versa)
; GUIComponent.DropState: The current drag-n-drop state of the component 

The following events and delegates are related to drag-n-drop (all located in GUIComponent.uc):
; event DropStateChange(eDropState NewState): Called when the drag-n-drop state of the component changes, e.g. the component becomes the GUIController's DropSource (beginning a drag-n-drop), the component becomes the GUIController's DropTarget (moused over while a drag-n-drop operation is in progress), etc.
; delegate bool OnBeginDrag(GUIComponent Sender): Called once on a component when it becomes the DropSource. Return false to prevent the drag-n-drop operation from beginning.
; delegate OnEndDrag(GUIComponent Sender, bool bAccepted): Called on the DropSource when the user releases the mouse during a drag-n-drop operation.  Accepted indicates whether the drag-n-drop operation was successful. A false value indicates that there was no valid DropTarget (if Sender == None), or that the DropTarget didn't want to receive the drag-n-drop for any reason.
; delegate bool OnDragDrop(GUIComponent Sender): Called once on the DropTarget when the user releases the mouse. The return value of this delegate is used as the value for bAccepted in OnEndDrag.
; delegate OnDragEnter(GUIComponent Sender): Called once on a component that is a valid DropTarget (that is, bDropTarget is true), when the mouse enters that component's bounds. 
; delegate OnDragLeave(GUIComponent Sender): Similar to the above, for leaving the component's Bounds. 
; delegate OnDragOver(GUIComponent Sender): Called on the DropTarget once each cycle. 

In most cases, the actual work of a drag-n-drop operation will be performed from OnEndDrag (for the dropsource) and OnDragDrop (for the droptarget), and depending on exactly what you're doing, may be the only delegates you'll need to hook up. 

For a working example, see the GUIListBase class. It contains all functionality necessary to enable drag-n-drop operations to and from lists. It is structured so that child classes of GUIListBase need only implement the two delegates I mentioned above - OnEndDrag and OnDragDrop, which have been assigned in GUIListBase to InternalOnEndDrag and InternalOnDragDrop, repectively, to simplify overriding the default behavior in child classes.

==How do I handle mouse click events?==

GUI mouse clicks are handled by &lt;nowiki&gt;UGUIController::MousePressed and UGUIController::MouseReleased&lt;/nowiki&gt;. For most input events (including mouse clicks), the general order in which components will receive notification of the input event is:
# GUIController.ActiveControl (which is updated natively each tick)
# GUIController.ActivePage (the last opened menu)
# each page in the GUIController's menustack, starting with the most recently opened menu

GUIComponents indicate that they've handled the input by returning true from the appropriate input function. Once that happens, the input chain stops. For mouse input, this function is &lt;nowiki&gt;UGUIComponent::MousePressed and UGUIComponent::MouseReleased&lt;/nowiki&gt;. For example, if the ActiveControl returns true from its MousePressed function, then the ActivePage and MenuStack would not be notified of the mouse press.

When a component receives a call to MousePressed/MouseReleased, it notifies unrealscript by calling delegates. To have unrealscript do something when mouse input is received, you should assign these delegates and perform whatever logic you want to do from there. Here's an overview of the mouse-related delegates:

; delegate OnMousePressed(): called from &lt;nowiki&gt;UGUIComponent::MousePressed&lt;/nowiki&gt;, when the left mouse button is pressed or held. 
; delegate OnMouseReleased(): called from &lt;nowiki&gt;UGUIComponent::MouseReleased&lt;/nowiki&gt;, when the left mouse button is released
; delegate OnClick: This is the primary mouse input function; called immediately after OnMouseReleased. The return value from this delegate is used as the return value for the native MouseRelease(). 
; delegate OnDblClick: when the user double-clicks on a component
; delegate OnRightClick: when the right mouse button is released

----

How about 'GUI Overview'?

==Related Topics ==
* [[Legacy:Interactive GUI|Interactive GUI Design Mode]]
* [[Legacy:Automated Component|Automated Components in UT2004]]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3495</id>
      <timestamp>2006-04-08T06:25:50Z</timestamp>
      <contributor>
        <ip>Technicat</ip>
      </contributor>
      <comment>onHover for mousovers</comment>
      <text xml:space="preserve">Not sure where this should be linked in from, or if there's another page that would provide a better home for this information.  If someone knows of a better place for this page, please feel free to move it, rename it, refactor it, whatever.  In its present form it's basically just raw data.

==What is the relationship between the [[Legacy:Canvas|Canvas]], [[Legacy:Interactions|Interactions]], [[Legacy:GUI|GUI]] and [[Legacy:HUD|HUD]]?==

Canvas is the mid-level interface that handles rendering to the screen (that is, rendering things that are not part of the world). Anything that needs to be rendered directly to the screen (GUI, HUD, etc.) will render to the Canvas object.

Interactions are objects that are solely used for the purpose of interacting with the player - they [typically] don't really care what's going on in the world, and are not bound to the GUI. The GUI is simply the most prominent usage of the Interaction system.

Some interactions:
; GUIController: it takes input from the player, passes that input to various GUI objects, and tells GUI objects when and how to render
; Console: it takes input (in the form of text commands) from the player, and renders the results of those commands onscreen
; StreamInteraction (UT2004): responsible for sending/receiving messages with the low-level audio code to play MP3/OGG files, according to playlists configured by the user.

GUI objects are the graphical tools that the GUIController uses to interact with the player.

The HUD is used by the game to communicate game state information to the player. It is not an Interaction - it cannot process input from the player.

==How do I make a new GUI? ==

The best way to understand how to make a new GUI is to read http://udn.epicgames.com/Two/GUIReference, browse the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] and look at the [[Legacy:UnrealScript Source|UnrealScript source]]. You will probably find the best documentation is in the source code itself.

Generally speaking, every GUI &quot;widget&quot; is a subclass of [[Legacy:GUIComponent|GUIComponent]]. GUIComponent's that consist of or contain other GUIComponents are subclasses of [[Legacy:GUIMultiComponent|GUIMultiComponent]]. There is an [[Legacy:Interactive GUI|Interactive GUI]] mode for interactive GUI design, which will dump out to a file the specified components and properties, or you can code it in UnrealScript from scratch.

Typically, you would define your own subclass of [[Legacy:GUIPage|GUIPage]], for example, specify each subcomponent as an [[Legacy:Automated Component|Automated Component]] and specify the properties, including position, size, appearance, and whether it's scaled and positioned according to its parent component, in the [[Legacy:Default Properties|default properties]] section.

If you do need to directly instantiate a [[Legacy:GUIComponent|GUIComponent]], e.g. &lt;code&gt;button = new class'GUIButton'&lt;/code&gt;, you would have to set the properties on the object and then add it to the parent component by calling AppendComponent.

==How do I change the GUI look-and-feel? ==

Each [[Legacy: GUIComponent | GUIComponent ]] has a styleName variable associated with a [[Legacy:GUIStyles|GUIStyles]] object that specifies the component appearance. See http://udn.epicgames.com/Two/GUIStylesExample for detail on how to construct one.

Note that the GUIStyles affect some components differently, e.g. [[Legacy: GUILabel | GUILabel ]] has member variables that explicitly set transparency, background color, and so forth. And a [[Legacy: GUIMultiComponent | GUIMultiComponent ]] does not automatically propagate its styleName to its subcomponents - you will have to set those explicitly on a case by case basis.

To use a [[Legacy:GUIStyles|GUIStyles]] object, it has to be registered with the [[Legacy: GUIController | GUIController ]], e.g. in the InitComponent function of the enclosing [[Legacy: GUIPage | GUIPage ]]

==How do I use a new font? ==

The font used in each [[Legacy:GUIComponent|GUIComponent]] is specified in its [[Legacy:GUIStyles|GUIStyles]] object. A [[Legacy:GUIStyles|GUIStyles]] object has a 15-element string array called FontArrayNames, each entry identifying a [[Legacy:GUIFont|GUIFont]] object. A [[Legacy:GUIFont|GUIFont]] in turn has a dynamic array that references [[Legacy:Font|Font]] objects. A new [[Legacy:Font|Font]] can be loaded using the [[Legacy:TrueTypeFontFactory|TrueTypeFontFactory]] [[Legacy:Exec Directive|Exec Directive]]. The new [[Legacy:GUIFont|GUIFont]] must be added to the [[Legacy:GUIController|GUIController]] font stack, typically by subclassing [[Legacy:GUIController|GUIController]] (and then specifying the new [[Legacy:GUIController|GUIController]] in the game .ini file.

==How do I use the UT2004 GUI animation system?==

GUI animation is fairly simplistic. Each GUIComponent stores keyframe data using an array of vectors for each type of animation supported, where the X and Y components are dependent on the type of animation, and the Z component represents the remaining interpolation time. GUIComponent.MotionFrame tracks position keyframes, whereas GUIComponent.SizeFrame tracks dimension keyframes.

Interpolation is strictly linear - each frame, &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt; adjusts the component's position/dimension based on the time remaining for the first keyframe, and decrements that keyframe's counter. Once the counter for that keyframe reaches 0, it is removed from the list of keyframes, the component is notified via delegateOnArrival (see below), and the process continues using the next keyframe, if it exists.

Script-side, position keyframes are added by calling Animate(), and dimension keyframes are added by calling Resize(). For the most part, you'll want to use these functions to add keyframes, rather than modifying the keyframe arrays directly, so that all of the various notifications are called in the correct order. There are several events and delegates related to GUI animation:
; event BeginAnimation(): indicates that this component has started an animation sequence. Called from Animate/Resize when there are no existing keyframes, and will be propagated up the MenuOwner chain.
; event EndAnimation(): indicates that this component has ended an animation sequence. Called from &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt;(), after removing a keyframe when there are no additionl keyframes, and is propagated up the MenuOwner chain.
; function KillAnimation(): immediately removes all keyframes and ends all animation for the component. This function would be called by client code to force animation sequences to end.
; delegate OnArrival(): indicates that this component has arrived at a keypoint. Called from &lt;nowiki&gt;UGUIComponent::PreDraw&lt;/nowiki&gt;(), each time a keyframe is removed from the current sequence.
; delegate OnEndAnimation(): indicates that this component has ended an animation sequence. Called from GUIComponent.EndAnimation. While EndAnimation event would be called on each component in the MenuOwner chain, OnEndAnimation would only be called on the component that was animating.

==Is the GUI animation system related to drag-n-drop?==

No, drag-n-drop is completely separate from the GUI animation code. Here is an overview of the drag-n-drop system. The following properties are related to drag-n-drop:

; GUIController.DropSource: Pointer to the GUIComponent that is the source of the drag-n-drop, or NULL if not currently performing a drag-n-drop.  enerally, the DropSource will have the first opportunity to handle input events, such as mouse clicks, releases, and movement. 
; GUIController.DropTarget: Pointer to the GUIComponent that will receive the drag-n-drop - generally the component that the mouse is currently hovering over (the GUIController's ActiveControl), or NULL if no valid target exists (if we're not performing a drag-n-drop, or the ActiveControl does not support drag-n-drop
; GUIComponent.bDropSource: Must be true in order for a component to be the source of a drag-n-drop operation.
; GUIComponent.bDropTarget: Must be true in order for the component to be the target of a drag-n-drop. (Note: it is perfectly acceptable for a  GUIComponent to be a valid drop-source, but not a drop-target, or vice-versa)
; GUIComponent.DropState: The current drag-n-drop state of the component 

The following events and delegates are related to drag-n-drop (all located in GUIComponent.uc):
; event DropStateChange(eDropState NewState): Called when the drag-n-drop state of the component changes, e.g. the component becomes the GUIController's DropSource (beginning a drag-n-drop), the component becomes the GUIController's DropTarget (moused over while a drag-n-drop operation is in progress), etc.
; delegate bool OnBeginDrag(GUIComponent Sender): Called once on a component when it becomes the DropSource. Return false to prevent the drag-n-drop operation from beginning.
; delegate OnEndDrag(GUIComponent Sender, bool bAccepted): Called on the DropSource when the user releases the mouse during a drag-n-drop operation.  Accepted indicates whether the drag-n-drop operation was successful. A false value indicates that there was no valid DropTarget (if Sender == None), or that the DropTarget didn't want to receive the drag-n-drop for any reason.
; delegate bool OnDragDrop(GUIComponent Sender): Called once on the DropTarget when the user releases the mouse. The return value of this delegate is used as the value for bAccepted in OnEndDrag.
; delegate OnDragEnter(GUIComponent Sender): Called once on a component that is a valid DropTarget (that is, bDropTarget is true), when the mouse enters that component's bounds. 
; delegate OnDragLeave(GUIComponent Sender): Similar to the above, for leaving the component's Bounds. 
; delegate OnDragOver(GUIComponent Sender): Called on the DropTarget once each cycle. 

In most cases, the actual work of a drag-n-drop operation will be performed from OnEndDrag (for the dropsource) and OnDragDrop (for the droptarget), and depending on exactly what you're doing, may be the only delegates you'll need to hook up. 

For a working example, see the GUIListBase class. It contains all functionality necessary to enable drag-n-drop operations to and from lists. It is structured so that child classes of GUIListBase need only implement the two delegates I mentioned above - OnEndDrag and OnDragDrop, which have been assigned in GUIListBase to InternalOnEndDrag and InternalOnDragDrop, repectively, to simplify overriding the default behavior in child classes.

==How do I handle mouse click events?==

GUI mouse clicks are handled by &lt;nowiki&gt;UGUIController::MousePressed and UGUIController::MouseReleased&lt;/nowiki&gt;. For most input events (including mouse clicks), the general order in which components will receive notification of the input event is:
# GUIController.ActiveControl (which is updated natively each tick)
# GUIController.ActivePage (the last opened menu)
# each page in the GUIController's menustack, starting with the most recently opened menu

GUIComponents indicate that they've handled the input by returning true from the appropriate input function. Once that happens, the input chain stops. For mouse input, this function is &lt;nowiki&gt;UGUIComponent::MousePressed and UGUIComponent::MouseReleased&lt;/nowiki&gt;. For example, if the ActiveControl returns true from its MousePressed function, then the ActivePage and MenuStack would not be notified of the mouse press.

When a component receives a call to MousePressed/MouseReleased, it notifies unrealscript by calling delegates. To have unrealscript do something when mouse input is received, you should assign these delegates and perform whatever logic you want to do from there. Here's an overview of the mouse-related delegates:

; delegate OnMousePressed(): called from &lt;nowiki&gt;UGUIComponent::MousePressed&lt;/nowiki&gt;, when the left mouse button is pressed or held. 
; delegate OnMouseReleased(): called from &lt;nowiki&gt;UGUIComponent::MouseReleased&lt;/nowiki&gt;, when the left mouse button is released
; delegate OnClick: This is the primary mouse input function; called immediately after OnMouseReleased. The return value from this delegate is used as the return value for the native MouseRelease(). 
; delegate OnDblClick: when the user double-clicks on a component
; delegate OnRightClick: when the right mouse button is released

==How do I handle mouseover events?==

; delegate OnHover: when the mouse is moved over a component

----

==Related Topics ==
* [[Legacy:Interactive GUI|Interactive GUI Design Mode]]
* [[Legacy:Automated Component|Automated Components in UT2004]]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIButton</title>
    <id>1377</id>
    <revision>
      <id>3491</id>
      <timestamp>2006-05-05T02:35:47Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIButton|GUIButton]]}}

==Properties==
; string Caption : Label to put inside a button

==Functions==
;  InitComponent(GUIController MyController, GUIComponent MyOwner ): Sets InternalOnKeyEvent to handle Keyboard events, and InternalOnXControllerEvent to handle XBox events
; bool InternalOnKeyEvent(out byte Key, out byte State, float delta ): Clicks Self if Enter is pressed, goes to next control on 0x026, or previous control on 0x028
; bool InternalOnXControllerEvent(byte Id, eXControllerCodes iCode ): Clicks Self if the Start button is pressed on the XBox controller

==Events==
;  ButtonPressed( ): Called when button is pressed
;  ButtonReleased( ): Called when button is released</text>
    </revision>
    <revision>
      <id>3492</id>
      <timestamp>2006-05-05T02:28:31Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIButton|GUIButton]]}}

==Properties==
; string Caption : Label to put inside a button

==Functions==
;  InitComponent(GUIController MyController, GUIComponent MyOwner ): Sets InternalOnKeyEvent to handle Keyboard events, and InternalOnXControllerEvent to handle XBox events
; bool InternalOnKeyEvent(out byte Key, out byte State, float delta ): Clicks Self if Enter is pressed, goes to next control on 0x026, or previous control on 0x028
; bool InternalOnXControllerEvent(byte Id, eXControllerCodes iCode ): Clicks Self if the Start button is pressed on the XBox controller

==Events==
;  ButtonPressed( ): 
;  ButtonReleased( ):</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIComboBox</title>
    <id>28262</id>
    <revision>
      <id>39919</id>
      <timestamp>2009-11-14T18:03:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIComponent</title>
    <id>1323</id>
    <revision>
      <id>3371</id>
      <timestamp>2007-08-22T16:32:05Z</timestamp>
      <contributor>
        <ip>206.135.90.253</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; GUIComponent}}

This is the superclass for all widgets that can be displayed on the UT200x GUI.

==Properties ==

===Menu ===
;string IniOption: Points to the INI option to load for this component ''(what does that mean then?)''.
;string IniDefault: The default value for a missing ini option.
;string StyleName: Name of my Style.
;bool bBoundToParent: Use the Parent's Bounds for all positioning.
;bool bScaleToParent: Use the Parent for scaling.
;bool bHasFocus: Does this component currently have input focus.
;bool bVisible: True if this component currently visible.
;bool bAcceptsInput: True if this control accepts input.
;bool bCaptureTabs: This control wants tabs.
;bool bCaptureMouse: Set this if the control should capture the mouse when pressed.
;bool bNeverFocus: This control should never fully receive focus.
;bool bRepeatClick: Have the system accept holding down of the mouse.
;bool bRequireReleaseClick: If True, this component wants the click on release even if it's not active.
;GUIComponent FocusInstead: Who should get the focus instead of this control if bNeverFocus is true.
;localized string Hint: The hint that gets displayed for this component.
;float WinTop, WinLeft, WinWidth, WinHeight: These set the size and position of this component relative to its parent. If a value is &lt;= 1 then the position is calculated as WinTop * parent component's value. If this value is &gt; 1 then a value in pixels ''possibly'' is used. Using pixels means the component will have a different size relative to the whole screen at different screen resolutions.
;int MouseCursorIndex: The mouse cursor to use when over this control.
;bool bTabStop: Does a TAB/Shift-Tab stop here.
;bool bFocusOnWatch: If true, watching focuses.
;int Tag: Not used ''allegedly''.
;[[Legacy:GUILabel|GUILabel]] FriendlyLabel: My state is projected on this object's state. (as in [[Legacy:GUIMenuOption|GUIMenuOption]])
;bool bMouseOverSound: Should component bleep when mouse goes over it.
;enum [[Legacy:OnClickSound|OnClickSound]] EClickSound: The sound the component makes if sound is required.

==Delegates==

(See also [[Legacy:Delegate|Delegate]].)

===Drawing delegates return true if you want to short-circuit the default drawing code===
; bool OnPreDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called before the component is rendered. Return True to skip the native PreDraw code.
; bool OnDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called whenthe component is rendered. Return True to skip the native Draw code. Only works for [[Legacy:GUIPage|GUIPage]] and [[Legacy:GUIPanel|GUIPanel]] in UT2003.
; OnActivate ( ) : Called when the component gains focus
; OnDeActivate ( ) : Called when the component loses focus
; OnWatch ( ) : Called when the component is being watched
; OnHitTest (float MouseX, float MouseY) : Called when Hit test is performed for mouse input
; OnRender ([[Legacy:Canvas|Canvas]] Canvas) : Broken in UT2003. (never called)
; OnMessage (coerce string Msg, float MsgLife) : When a message comes down the line
; OnInvalidate ( ) : Called when the background is clicked

===Input event delegates===
; bool OnClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was clicked on this control
; bool OnDblClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was double-clicked on this control
; bool OnRightClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : Control was right clicked.
; OnMousePressed ([[Legacy:GUIComponent|GUIComponent]] Sender, bool bRepeat) : Sent when a mouse is pressed (initially)
; OnMouseRelease ([[Legacy:GUIComponent|GUIComponent]] Sender) : Sent when the mouse is released.
; OnChange ([[Legacy:GUIComponent|GUIComponent]] Sender) : Called when a component changes its value. Beware: while mouse and key delegates have native magic that calls them when things happen, this one does not appear to. Unless your custom widget inherited it, you may need to explicitly call this in at an appropriate point.
; bool OnKeyType (out byte Key, optional string Unicode) Key Strokes
; bool OnKeyEvent (out byte Key, out byte State, float delta)
; bool OnCapturedMouseMove (float deltaX, float deltaY)
; OnLoadINI ([[Legacy:GUIComponent|GUIComponent]] Sender, string s) : Do the actual work here
; string OnSaveINI ([[Legacy:GUIComponent|GUIComponent]] Sender) : Do the actual work here

==Methods==
; function InitComponent(GUIController MyController, GUIComponent MyOwner)

==Known Subclasses ==

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] for a full tree.

* [[Legacy:GUIButton|GUIButton]]
* [[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
* [[Legacy:GUIImage|GUIImage]]
* [[Legacy:GUILabel|GUILabel]]
* [[Legacy:GUIListBase|GUIListBase]]
* [[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
* [[Legacy:GUIMultiComponent|GUIMultiComponent]]
* [[Legacy:GUIProgressBar|GUIProgressBar]]
* [[Legacy:GUISlider|GUISlider]]
* [[Legacy:GUITitleBar|GUITitleBar]]
* [[Legacy:GUIVertScrollZone|GUIVertScrollZone]]

==Comments==

'''Tarquin:''' There seem to be two ways to define properties of components of a window or panel: use an inline object in the default properties, or use InitComponent(). I;m baffled about this in the defaults though (it's Jailbreak code BTW) 

&lt;uscript&gt;
Controls(0)=GUIButton'JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton'
&lt;/uscript&gt;

I can't see where JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton was defined. Does that statement actually ''create'' the GUIButton object and define its name?

'''Mychaeel:''' The benefit from doing it in the defaultproperties section is that it happens at compile time rather than run time.  Plus, it looks neater. &amp;ndash; As for that GUIButton, if I'm looking at the same source as you are, it's defined just above that line.  (The &quot;JBAddonProtection.JBGUIPanelProtectionConfig.&quot; part is just the full qualifier of that object template.)

'''Tarquin:''' I exported the source from UEd. I must be missing something &amp;ndash; I have no &quot;BeginObject&quot; at all in there.

'''Wormbo:''' [[Legacy:Subobject|Subobject]]s aren't exported. You will have to download the [[Legacy:UnrealScript Source|UnrealScript Source]] to see them.

'''RealmRPGer:''' Like a lot of other things, GUIComponents don't work well with gamepads. The OnKeyEvent doesn't catch button releases while at the same time simultaneously receiving pressed and held events of the same button. 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3372</id>
      <timestamp>2004-03-28T16:47:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; GUIComponent}}

This is the superclass for all widgets that can be displayed on the UT2003 GUI.

==Properties ==

===Menu ===
;string IniOption: Points to the INI option to load for this component ''(what does that mean then?)''.
;string IniDefault: The default value for a missing ini option.
;string StyleName: Name of my Style.
;bool bBoundToParent: Use the Parent's Bounds for all positioning.
;bool bScaleToParent: Use the Parent for scaling.
;bool bHasFocus: Does this component currently have input focus.
;bool bVisible: True if this component currently visible.
;bool bAcceptsInput: True if this control accepts input.
;bool bCaptureTabs: This control wants tabs.
;bool bCaptureMouse: Set this if the control should capture the mouse when pressed.
;bool bNeverFocus: This control should never fully receive focus.
;bool bRepeatClick: Have the system accept holding down of the mouse.
;bool bRequireReleaseClick: If True, this component wants the click on release even if it's not active.
;GUIComponent FocusInstead: Who should get the focus instead of this control if bNeverFocus is true.
;localized string Hint: The hint that gets displayed for this component.
;float WinTop, WinLeft, WinWidth, WinHeight: These set the size and position of this component relative to its parent. If a value is &lt;= 1 then the position is calculated as WinTop * parent component's value. If this value is &gt; 1 then a value in pixels ''possibly'' is used. Using pixels means the component will have a different size relative to the whole screen at different screen resolutions.
;int MouseCursorIndex: The mouse cursor to use when over this control.
;bool bTabStop: Does a TAB/Shift-Tab stop here.
;bool bFocusOnWatch: If true, watching focuses.
;int Tag: Not used ''allegedly''.
;[[Legacy:GUILabel|GUILabel]] FriendlyLabel: My state is projected on this objects state. Anyone had any luck getting this to work?

'''Wormbo:''' Works perfectly in [[Legacy:GUIMenuOption|GUIMenuOption]]s.
;bool bMouseOverSound: Should component bleep when mouse goes over it.
;enum [[Legacy:OnClickSound|OnClickSound]] EClickSound: The sound the component makes if sound is required.

==Delegates==

(See also [[Legacy:Delegate|Delegate]].)

===Drawing delegates return true if you want to short-circuit the default drawing code===
; bool OnPreDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called before the component is rendered. Return True to skip the native PreDraw code.
; bool OnDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called whenthe component is rendered. Return True to skip the native Draw code. Only works for [[Legacy:GUIPage|GUIPage]] and [[Legacy:GUIPanel|GUIPanel]] in UT2003.
; OnActivate ( ) : Called when the component gains focus
; OnDeActivate ( ) : Called when the component loses focus
; OnWatch ( ) : Called when the component is being watched
; OnHitTest (float MouseX, float MouseY) : Called when Hit test is performed for mouse input
; OnRender ([[Legacy:Canvas|Canvas]] Canvas) : Broken in UT2003. (never called)
; OnMessage (coerce string Msg, float MsgLife) : When a message comes down the line
; OnInvalidate ( ) : Called when the background is clicked

===Input event delegates===
; bool OnClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was clicked on this control
; bool OnDblClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was double-clicked on this control
; bool OnRightClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : Control was right clicked.
; OnMousePressed ([[Legacy:GUIComponent|GUIComponent]] Sender, bool bRepeat) : Sent when a mouse is pressed (initially)
; OnMouseRelease ([[Legacy:GUIComponent|GUIComponent]] Sender) : Sent when the mouse is released.
; OnChange ([[Legacy:GUIComponent|GUIComponent]] Sender) : Called when a component changes its value. Beware: while mouse and key delegates have native magic that calls them when things happen, this one does not appear to. Unless your custom widget inherited it, you may need to explicitly call this in at an appropriate point.
; bool OnKeyType (out byte Key, optional string Unicode) Key Strokes
; bool OnKeyEvent (out byte Key, out byte State, float delta)
; bool OnCapturedMouseMove (float deltaX, float deltaY)
; OnLoadINI ([[Legacy:GUIComponent|GUIComponent]] Sender, string s) : Do the actual work here
; string OnSaveINI ([[Legacy:GUIComponent|GUIComponent]] Sender) : Do the actual work here

==Methods==
; function InitComponent(GUIController MyController, GUIComponent MyOwner)

==Known Subclasses ==

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] for a full tree.

* [[Legacy:GUIButton|GUIButton]]
* [[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
* [[Legacy:GUIImage|GUIImage]]
* [[Legacy:GUILabel|GUILabel]]
* [[Legacy:GUIListBase|GUIListBase]]
* [[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
* [[Legacy:GUIMultiComponent|GUIMultiComponent]]
* [[Legacy:GUIProgressBar|GUIProgressBar]]
* [[Legacy:GUISlider|GUISlider]]
* [[Legacy:GUITitleBar|GUITitleBar]]
* [[Legacy:GUIVertScrollZone|GUIVertScrollZone]]

==Comments==

'''Tarquin:''' There seem to be two ways to define properties of components of a window or panel: use an inline object in the default properties, or use InitComponent(). I;m baffled about this in the defaults though (it's Jailbreak code BTW) 

&lt;uscript&gt;
Controls(0)=GUIButton'JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton'
&lt;/uscript&gt;

I can't see where JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton was defined. Does that statement actually ''create'' the GUIButton object and define its name?

'''Mychaeel:''' The benefit from doing it in the defaultproperties section is that it happens at compile time rather than run time.  Plus, it looks neater. &amp;ndash; As for that GUIButton, if I'm looking at the same source as you are, it's defined just above that line.  (The &quot;JBAddonProtection.JBGUIPanelProtectionConfig.&quot; part is just the full qualifier of that object template.)

'''Tarquin:''' I exported the source from UEd. I must be missing something &amp;ndash; I have no &quot;BeginObject&quot; at all in there.

'''Wormbo:''' [[Legacy:Subobject|Subobject]]s aren't exported. You will have to download the [[Legacy:UnrealScript Source|UnrealScript Source]] to see them.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3373</id>
      <timestamp>2007-08-18T23:25:10Z</timestamp>
      <contributor>
        <ip>C-24-16-159-160.hsd1.mn.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; GUIComponent}}

This is the superclass for all widgets that can be displayed on the UT2003 GUI.

==Properties ==

===Menu ===
;string IniOption: Points to the INI option to load for this component ''(what does that mean then?)''.
;string IniDefault: The default value for a missing ini option.
;string StyleName: Name of my Style.
;bool bBoundToParent: Use the Parent's Bounds for all positioning.
;bool bScaleToParent: Use the Parent for scaling.
;bool bHasFocus: Does this component currently have input focus.
;bool bVisible: True if this component currently visible.
;bool bAcceptsInput: True if this control accepts input.
;bool bCaptureTabs: This control wants tabs.
;bool bCaptureMouse: Set this if the control should capture the mouse when pressed.
;bool bNeverFocus: This control should never fully receive focus.
;bool bRepeatClick: Have the system accept holding down of the mouse.
;bool bRequireReleaseClick: If True, this component wants the click on release even if it's not active.
;GUIComponent FocusInstead: Who should get the focus instead of this control if bNeverFocus is true.
;localized string Hint: The hint that gets displayed for this component.
;float WinTop, WinLeft, WinWidth, WinHeight: These set the size and position of this component relative to its parent. If a value is &lt;= 1 then the position is calculated as WinTop * parent component's value. If this value is &gt; 1 then a value in pixels ''possibly'' is used. Using pixels means the component will have a different size relative to the whole screen at different screen resolutions.
;int MouseCursorIndex: The mouse cursor to use when over this control.
;bool bTabStop: Does a TAB/Shift-Tab stop here.
;bool bFocusOnWatch: If true, watching focuses.
;int Tag: Not used ''allegedly''.
;[[Legacy:GUILabel|GUILabel]] FriendlyLabel: My state is projected on this objects state. Anyone had any luck getting this to work?

'''Wormbo:''' Works perfectly in [[Legacy:GUIMenuOption|GUIMenuOption]]s.
;bool bMouseOverSound: Should component bleep when mouse goes over it.
;enum [[Legacy:OnClickSound|OnClickSound]] EClickSound: The sound the component makes if sound is required.

==Delegates==

(See also [[Legacy:Delegate|Delegate]].)

===Drawing delegates return true if you want to short-circuit the default drawing code===
; bool OnPreDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called before the component is rendered. Return True to skip the native PreDraw code.
; bool OnDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called whenthe component is rendered. Return True to skip the native Draw code. Only works for [[Legacy:GUIPage|GUIPage]] and [[Legacy:GUIPanel|GUIPanel]] in UT2003.
; OnActivate ( ) : Called when the component gains focus
; OnDeActivate ( ) : Called when the component loses focus
; OnWatch ( ) : Called when the component is being watched
; OnHitTest (float MouseX, float MouseY) : Called when Hit test is performed for mouse input
; OnRender ([[Legacy:Canvas|Canvas]] Canvas) : Broken in UT2003. (never called)
; OnMessage (coerce string Msg, float MsgLife) : When a message comes down the line
; OnInvalidate ( ) : Called when the background is clicked

===Input event delegates===
; bool OnClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was clicked on this control
; bool OnDblClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was double-clicked on this control
; bool OnRightClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : Control was right clicked.
; OnMousePressed ([[Legacy:GUIComponent|GUIComponent]] Sender, bool bRepeat) : Sent when a mouse is pressed (initially)
; OnMouseRelease ([[Legacy:GUIComponent|GUIComponent]] Sender) : Sent when the mouse is released.
; OnChange ([[Legacy:GUIComponent|GUIComponent]] Sender) : Called when a component changes its value. Beware: while mouse and key delegates have native magic that calls them when things happen, this one does not appear to. Unless your custom widget inherited it, you may need to explicitly call this in at an appropriate point.
; bool OnKeyType (out byte Key, optional string Unicode) Key Strokes
; bool OnKeyEvent (out byte Key, out byte State, float delta)
; bool OnCapturedMouseMove (float deltaX, float deltaY)
; OnLoadINI ([[Legacy:GUIComponent|GUIComponent]] Sender, string s) : Do the actual work here
; string OnSaveINI ([[Legacy:GUIComponent|GUIComponent]] Sender) : Do the actual work here

==Methods==
; function InitComponent(GUIController MyController, GUIComponent MyOwner)

==Known Subclasses ==

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] for a full tree.

* [[Legacy:GUIButton|GUIButton]]
* [[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
* [[Legacy:GUIImage|GUIImage]]
* [[Legacy:GUILabel|GUILabel]]
* [[Legacy:GUIListBase|GUIListBase]]
* [[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
* [[Legacy:GUIMultiComponent|GUIMultiComponent]]
* [[Legacy:GUIProgressBar|GUIProgressBar]]
* [[Legacy:GUISlider|GUISlider]]
* [[Legacy:GUITitleBar|GUITitleBar]]
* [[Legacy:GUIVertScrollZone|GUIVertScrollZone]]

==Comments==

'''Tarquin:''' There seem to be two ways to define properties of components of a window or panel: use an inline object in the default properties, or use InitComponent(). I;m baffled about this in the defaults though (it's Jailbreak code BTW) 

&lt;uscript&gt;
Controls(0)=GUIButton'JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton'
&lt;/uscript&gt;

I can't see where JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton was defined. Does that statement actually ''create'' the GUIButton object and define its name?

'''Mychaeel:''' The benefit from doing it in the defaultproperties section is that it happens at compile time rather than run time.  Plus, it looks neater. &amp;ndash; As for that GUIButton, if I'm looking at the same source as you are, it's defined just above that line.  (The &quot;JBAddonProtection.JBGUIPanelProtectionConfig.&quot; part is just the full qualifier of that object template.)

'''Tarquin:''' I exported the source from UEd. I must be missing something &amp;ndash; I have no &quot;BeginObject&quot; at all in there.

'''Wormbo:''' [[Legacy:Subobject|Subobject]]s aren't exported. You will have to download the [[Legacy:UnrealScript Source|UnrealScript Source]] to see them.

'''RealmRPGer:''' Like a lot of other things, GUIComponents don't work well with gamepads. The OnKeyEvent doesn't catch button releases while at the same time simultaneously receiving pressed and held events of the same button. 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32348</id>
      <timestamp>2008-06-27T15:42:01Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <comment>/* Menu */   bCaptureMouse detail.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; GUIComponent}}

This is the superclass for all widgets that can be displayed on the UT200x GUI.

==Properties ==

===Menu ===
;string IniOption: Points to the INI option to load for this component ''(what does that mean then?)''.
;string IniDefault: The default value for a missing ini option.
;string StyleName: Name of my Style.
;bool bBoundToParent: Use the Parent's Bounds for all positioning.
;bool bScaleToParent: Use the Parent for scaling.
;bool bHasFocus: Does this component currently have input focus.
;bool bVisible: True if this component currently visible.
;bool bAcceptsInput: True if this control accepts input.
;bool bCaptureTabs: This control wants tabs.
;bool bCaptureMouse: Set this if the control should capture the mouse when pressed.  ''Note: Setting to false on components that use the OnMouseRelease() delegate allows users to cancel the action by moving the cursor off the component before release. (which is a common standard GUI practice for Windows, Mac, Flash, etc.)''
;bool bNeverFocus: This control should never fully receive focus.
;bool bRepeatClick: Have the system accept holding down of the mouse.
;bool bRequireReleaseClick: If True, this component wants the click on release even if it's not active.
;GUIComponent FocusInstead: Who should get the focus instead of this control if bNeverFocus is true.
;localized string Hint: The hint that gets displayed for this component.
;float WinTop, WinLeft, WinWidth, WinHeight: These set the size and position of this component relative to its parent. If a value is &lt;= 1 then the position is calculated as WinTop * parent component's value. If this value is &gt; 1 then a value in pixels ''possibly'' is used. Using pixels means the component will have a different size relative to the whole screen at different screen resolutions.
;int MouseCursorIndex: The mouse cursor to use when over this control.
;bool bTabStop: Does a TAB/Shift-Tab stop here.
;bool bFocusOnWatch: If true, watching focuses.
;int Tag: Not used ''allegedly''.
;[[Legacy:GUILabel|GUILabel]] FriendlyLabel: My state is projected on this object's state. (as in [[Legacy:GUIMenuOption|GUIMenuOption]])
;bool bMouseOverSound: Should component bleep when mouse goes over it.
;enum [[Legacy:OnClickSound|OnClickSound]] EClickSound: The sound the component makes if sound is required.

==Delegates==

(See also [[Legacy:Delegate|Delegate]].)

===Drawing delegates return true if you want to short-circuit the default drawing code===
; bool OnPreDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called before the component is rendered. Return True to skip the native PreDraw code.
; bool OnDraw ([[Legacy:Canvas|Canvas]] Canvas) : Called whenthe component is rendered. Return True to skip the native Draw code. Only works for [[Legacy:GUIPage|GUIPage]] and [[Legacy:GUIPanel|GUIPanel]] in UT2003.
; OnActivate ( ) : Called when the component gains focus
; OnDeActivate ( ) : Called when the component loses focus
; OnWatch ( ) : Called when the component is being watched
; OnHitTest (float MouseX, float MouseY) : Called when Hit test is performed for mouse input
; OnRender ([[Legacy:Canvas|Canvas]] Canvas) : Broken in UT2003. (never called)
; OnMessage (coerce string Msg, float MsgLife) : When a message comes down the line
; OnInvalidate ( ) : Called when the background is clicked

===Input event delegates===
; bool OnClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was clicked on this control
; bool OnDblClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : The mouse was double-clicked on this control
; bool OnRightClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : Control was right clicked.
; OnMousePressed ([[Legacy:GUIComponent|GUIComponent]] Sender, bool bRepeat) : Sent when a mouse is pressed (initially)
; OnMouseRelease ([[Legacy:GUIComponent|GUIComponent]] Sender) : Sent when the mouse is released.
; OnChange ([[Legacy:GUIComponent|GUIComponent]] Sender) : Called when a component changes its value. Beware: while mouse and key delegates have native magic that calls them when things happen, this one does not appear to. Unless your custom widget inherited it, you may need to explicitly call this in at an appropriate point.
; bool OnKeyType (out byte Key, optional string Unicode) Key Strokes
; bool OnKeyEvent (out byte Key, out byte State, float delta)
; bool OnCapturedMouseMove (float deltaX, float deltaY)
; OnLoadINI ([[Legacy:GUIComponent|GUIComponent]] Sender, string s) : Do the actual work here
; string OnSaveINI ([[Legacy:GUIComponent|GUIComponent]] Sender) : Do the actual work here

==Methods==
; function InitComponent(GUIController MyController, GUIComponent MyOwner)

==Known Subclasses ==

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] for a full tree.

* [[Legacy:GUIButton|GUIButton]]
* [[Legacy:GUIHorzScrollZone|GUIHorzScrollZone]]
* [[Legacy:GUIImage|GUIImage]]
* [[Legacy:GUILabel|GUILabel]]
* [[Legacy:GUIListBase|GUIListBase]]
* [[Legacy:GUIMultiColumnListHeader|GUIMultiColumnListHeader]]
* [[Legacy:GUIMultiComponent|GUIMultiComponent]]
* [[Legacy:GUIProgressBar|GUIProgressBar]]
* [[Legacy:GUISlider|GUISlider]]
* [[Legacy:GUITitleBar|GUITitleBar]]
* [[Legacy:GUIVertScrollZone|GUIVertScrollZone]]

==Comments==

'''Tarquin:''' There seem to be two ways to define properties of components of a window or panel: use an inline object in the default properties, or use InitComponent(). I;m baffled about this in the defaults though (it's Jailbreak code BTW) 

&lt;uscript&gt;
Controls(0)=GUIButton'JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton'
&lt;/uscript&gt;

I can't see where JBAddonProtection.JBGUIPanelProtectionConfig.ResetButton was defined. Does that statement actually ''create'' the GUIButton object and define its name?

'''Mychaeel:''' The benefit from doing it in the defaultproperties section is that it happens at compile time rather than run time.  Plus, it looks neater. &amp;ndash; As for that GUIButton, if I'm looking at the same source as you are, it's defined just above that line.  (The &quot;JBAddonProtection.JBGUIPanelProtectionConfig.&quot; part is just the full qualifier of that object template.)

'''Tarquin:''' I exported the source from UEd. I must be missing something &amp;ndash; I have no &quot;BeginObject&quot; at all in there.

'''Wormbo:''' [[Legacy:Subobject|Subobject]]s aren't exported. You will have to download the [[Legacy:UnrealScript Source|UnrealScript Source]] to see them.

'''RealmRPGer:''' Like a lot of other things, GUIComponents don't work well with gamepads. The OnKeyEvent doesn't catch button releases while at the same time simultaneously receiving pressed and held events of the same button. 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIController</title>
    <id>1331</id>
    <revision>
      <id>3390</id>
      <timestamp>2004-10-06T07:58:13Z</timestamp>
      <contributor>
        <ip>222-152-45-131.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>Taking out the description of the interactive gui design mode and putting it in its own doc</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; [[Legacy:BaseGUIController|BaseGUIController]] &gt;&gt; GUIController (Package: XInterface)}}

The GUIController contains a simple first-in, last-out menu stack.  You have three things you can do:
* '''Open a menu''' &amp;ndash; adds the menu to the top of the stack.
* '''Replace a menu''' &amp;ndash; replaces the current menu with the new menu.
* '''Close a menu''' &amp;ndash; returns you to the last menu on the stack.

The GUIController is the [[Legacy:GUI|GUI]] system's only interface to the world of [[Legacy:Actor|Actor]]s.

A similar [[Legacy:UT|UT]] class would probably be the [[Legacy:WindowConsole|WindowConsole]], although the UWindow system in UT is more like a console extension while UT2003's GUIController and [[Legacy:Console|Console]] are both [[Legacy:Interaction|Interaction]]s without being a subclass of eachother.

==Properties==
; [[Legacy:GUIComponent|GUIComponent]] ActiveControl : Which control is currently active.
; [[Legacy:GUIPage|GUIPage]] ActivePage : Points to the currently active page.
; bool AltPressed : Alt key is being held.
; array&lt;string&gt; AutoLoad (config) : Any menu classes in here will be automatically loaded.
; bool bCurMenuInitialized : Has the current Menu Finished initialization.
; bool bDesignMode : Are we in design mode.
; bool bForceMouseCheck : 
; bool bHighlightCurrent : Highlight the current control being edited.
; bool bIgnoreNextRelease : Used to make sure discard errant releases.
; bool bIgnoreUntilPress : 
; bool bModAuthor (config) : Enables interactive GUI design mode.  See above for details.
; float ButtonRepeatDelay : The amount of delay for faking button repeats.
; sound ClickSound : 
; bool CtrlPressed : Ctrl key is being held.
; float CursorFade : How visible is the cursor.
; int CursorStep : Are we fading in or out.
; float DblClickWindow : How long do you have for a double click.
; sound DownSound : 
; sound EditSound : 
; float FastCursorFade : How visible is the cursor.
; int FastCursorStep : Are we fading in or out.
; [[Legacy:GUIComponent|GUIComponent]] FocusedControl : Top most Focused control.
; array&lt;[[Legacy:GUIFont|GUIFont]]&gt; FontStack (editinline) : Holds all the possible fonts.
; string GameResolution : 
; float LastClickTime : When did the last click occur.
; int LastClickX&lt;br /&gt;int LastClickY : Who was the active component
; float LastMouseX : 
; float LastMouseY : 
; bool MainNotWanted : Set to true if you don't want main to appear.
; float MenuMouseSens (config) : 
; array&lt;[[Legacy:GUIPage|GUIPage]]&gt; MenuStack (editinline, export) : Holds the stack of menus.
; Array&lt;vector&gt; MouseCursorOffset (editinline) : Only X,Y used, between 0 and 1. 'Hot Spot' of cursor material.
; Array&lt;[[Legacy:Material|Material]]&gt; MouseCursors (editinline) : Holds a list of all possible mouse coursers.
; sound MouseOverSound : 
; float MouseX&lt;br /&gt;float MouseY : Where is the mouse currently located.
; [[Legacy:GUIComponent|GUIComponent]] MoveControl : Used for visual design.
; array&lt;[[Legacy:GUIPage|GUIPage]]&gt; PersistentStack : Holds the set of pages which are persistent across close/open.
; float RepeatDelta : Data var
; byte RepeatKey : Used to determine what should repeat.
; float RepeatTime : How long until the next repeat.
; bool ShiftPressed : Shift key is being held.
; [[Legacy:GUIComponent|GUIComponent]] SkipControl : This control should be skipped over and drawn at the end.
; array&lt;string&gt; StyleNames : Holds the name of all styles to use.
; array&lt;[[Legacy:GUIStyles|GUIStyles]]&gt; StyleStack : Holds all of the possible styles.
; sound UpSound : 
; [[Legacy:Material|Material]] WhiteBorder : 

==Methods==

===Inherited from [[Legacy:Interaction|Interaction]]===
; NotifyLevelChange ( ) [event] : 

===Inherited from [[Legacy:BaseGUIController|BaseGUIController]]===
; AutoLoadMenus ( ) [event] : 
; bool OpenMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Opens a new menu and places it on top of the stack.
; bool ReplaceMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Replaces a menu in the stack.  Returns true if success.
; CloseAll (bool bCancel) [event] : 
; bool CloseMenu (optional bool bCanceled) [event] : Close the top menu.  returns true if success.
; InitializeController ( ) [event] : 
; SetControllerStatus (bool On) : 
; SetRequiredGameResolution (string GameRes) [event] : 
; bool NeedsMenuResolution() [event] : 

===Newly Declared Methods===
; ChangeFocus ([[Legacy:GUIComponent|GUIComponent]] Who) [event] : 
; ClearControls ([[Legacy:GUIMultiComponent|GUIMultiComponent]] Comp) : 
; [[Legacy:GUIPage|GUIPage]] CreateMenu (string NewMenuName) [event] : Attempts to create a menu.  Returns none if it can't.
; string GetCurrentRes ( ) [native] : Returns the current res as a string.
; string GetMainMenuClass ( ) [native] : Returns GameEngine.MainMenuClass.
; GetMapList (string Prefix , [[Legacy:GUIList|GUIList]] list) [native] : 
; [[Legacy:GUIFont|GUIFont]] GetMenuFont (string FontName) [native event] : Finds a given font in the FontStack.
; GetOGGList (out array&lt;string&gt; OGGFiles) [native] : 
; GetProfileList (string Prefix, out array&lt;string&gt; ProfileList) [native] : 
; [[Legacy:GUIStyles|GUIStyles]] GetStyle (string StyleName) [native event] : Find a style on the stack.
; GetTeamSymbolList (array&lt;string&gt; SymbolNames, optional bool bNoSinglePlayer) [native] : 
; GetWeaponList (out array&lt;class&lt;[[Legacy:Weapon|Weapon]]&gt;&gt; WeaponClass , out array&lt;string&gt; WeaponDesc) [native] : 
; bool HasMouseMoved ( ) : 
; string LoadDecoText (string PackageName , string DecoTextName) [native] : 
; MoveFocused ([[Legacy:GUIComponent|GUIComponent]] Ctrl , int bmLeft, int bmTop, int bmWidth, int bmHeight, float ClipX , float ClipY) [event] : 
; bool RegisterStyle (class&lt;[[Legacy:GUIStyles|GUIStyles]]&gt; StyleClass) : 
; ResetFocus() : 
; ResetKeyboard ( ) [native] : 
; [[Legacy:GUIPage|GUIPage]] TopPage ( ) : 

===Delegates===
; bool OnNeedRawKeyPress (byte NewKey) : 

==Known Subclasses==
* [[Legacy:ProGUIController|ProGUIController]] &amp;ndash; used by the UT2003 Pro GUI
* [[Legacy:UT2K4GUIController|UT2K4GUIController]]

==Related Topics==
* [[Legacy:GUI|GUI]]
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]
* [[Legacy:Interactive GUI|Interactive GUI Design Mode]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3391</id>
      <timestamp>2004-09-29T11:01:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; [[Legacy:BaseGUIController|BaseGUIController]] &gt;&gt; GUIController (Package: XInterface)}}

The GUIController contains a simple first-in, last-out menu stack.  You have three things you can do:
* '''Open a menu''' &amp;ndash; adds the menu to the top of the stack.
* '''Replace a menu''' &amp;ndash; replaces the current menu with the new menu.
* '''Close a menu''' &amp;ndash; returns you to the last menu on the stack.

The GUIController is the [[Legacy:GUI|GUI]] system's only interface to the world of [[Legacy:Actor|Actor]]s.

A similar [[Legacy:UT|UT]] class would probably be the [[Legacy:WindowConsole|WindowConsole]], although the UWindow system in UT is more like a console extension while UT2003's GUIController and [[Legacy:Console|Console]] are both [[Legacy:Interaction|Interaction]]s without being a subclass of eachother.

==Interactive GUI Design Mode==

To enable the interactive GUI design mode, open the [[Legacy:Game Ini File|Game ini file]] and set the following property:

'''UT2003.ini:'''
  [XInterface.GUIController]
  bModAuthor=True

In unreal tournament 2004 you'll need to edit the user.ini instead.  I found that I had to set both of the following to get this to work

'''user.ini:'''
  [XInterface.GUIController]
  bModAuthor=True

  [GUI2K4.UT2K4GUIController]
  bModAuthor=True

Press &lt;code&gt;Ctrl+Alt+D&lt;/code&gt; to enter the interactive GUI design mode.  In that mode, you can:

* Hold down &lt;code&gt;F1&lt;/code&gt; for a list of commands. The most common ones are mentioned below.
* &lt;code&gt;Ctrl+Click&lt;/code&gt; a control to select it.  Repeatedly &lt;code&gt;Ctrl+Click&lt;/code&gt; to select overlapping controls.
* Press &lt;code&gt;Shift&lt;/code&gt; to temporarily hide the selection rectangle.
* Press &lt;code&gt;Ctrl+ArrowUp&lt;/code&gt;, &lt;code&gt;Ctrl+ArrowLeft&lt;/code&gt;, &lt;code&gt;Ctrl+ArrowRight&lt;/code&gt; and &lt;code&gt;Ctrl+ArrowDown&lt;/code&gt; to move the selected control.
* Alternatively, hold &lt;code&gt;Ctrl+Alt&lt;/code&gt; with the control selected to move it with the mouse. You can also use &lt;code&gt;Ctrl+Alt+Any Arrow&lt;/code&gt; to move the control 5 pixels at a time.
* Press &lt;code&gt;Ctrl+GrayPlus&lt;/code&gt; and &lt;code&gt;Ctrl+GrayMinus&lt;/code&gt; to change the horizontal size of the selected control. &lt;br /&gt;Press &lt;code&gt;Ctrl+Plus&lt;/code&gt; and &lt;code&gt;Ctrl+Minus&lt;/code&gt; (on the alphanumeric keyboard) to change the vertical size of the selected control.

Add &lt;code&gt;Alt&lt;/code&gt; to the movement and sizing key combinations to move or size faster.

* Press Ctrl+C to copy the selected control's window metrics to the clipboard.  You can directly paste them into your control's inline object definition in the &lt;code&gt;defaultproperties&lt;/code&gt; section.

==Properties==
; [[Legacy:GUIComponent|GUIComponent]] ActiveControl : Which control is currently active.
; [[Legacy:GUIPage|GUIPage]] ActivePage : Points to the currently active page.
; bool AltPressed : Alt key is being held.
; array&lt;string&gt; AutoLoad (config) : Any menu classes in here will be automatically loaded.
; bool bCurMenuInitialized : Has the current Menu Finished initialization.
; bool bDesignMode : Are we in design mode.
; bool bForceMouseCheck : 
; bool bHighlightCurrent : Highlight the current control being edited.
; bool bIgnoreNextRelease : Used to make sure discard errant releases.
; bool bIgnoreUntilPress : 
; bool bModAuthor (config) : Enables interactive GUI design mode.  See above for details.
; float ButtonRepeatDelay : The amount of delay for faking button repeats.
; sound ClickSound : 
; bool CtrlPressed : Ctrl key is being held.
; float CursorFade : How visible is the cursor.
; int CursorStep : Are we fading in or out.
; float DblClickWindow : How long do you have for a double click.
; sound DownSound : 
; sound EditSound : 
; float FastCursorFade : How visible is the cursor.
; int FastCursorStep : Are we fading in or out.
; [[Legacy:GUIComponent|GUIComponent]] FocusedControl : Top most Focused control.
; array&lt;[[Legacy:GUIFont|GUIFont]]&gt; FontStack (editinline) : Holds all the possible fonts.
; string GameResolution : 
; float LastClickTime : When did the last click occur.
; int LastClickX&lt;br /&gt;int LastClickY : Who was the active component
; float LastMouseX : 
; float LastMouseY : 
; bool MainNotWanted : Set to true if you don't want main to appear.
; float MenuMouseSens (config) : 
; array&lt;[[Legacy:GUIPage|GUIPage]]&gt; MenuStack (editinline, export) : Holds the stack of menus.
; Array&lt;vector&gt; MouseCursorOffset (editinline) : Only X,Y used, between 0 and 1. 'Hot Spot' of cursor material.
; Array&lt;[[Legacy:Material|Material]]&gt; MouseCursors (editinline) : Holds a list of all possible mouse coursers.
; sound MouseOverSound : 
; float MouseX&lt;br /&gt;float MouseY : Where is the mouse currently located.
; [[Legacy:GUIComponent|GUIComponent]] MoveControl : Used for visual design.
; array&lt;[[Legacy:GUIPage|GUIPage]]&gt; PersistentStack : Holds the set of pages which are persistent across close/open.
; float RepeatDelta : Data var
; byte RepeatKey : Used to determine what should repeat.
; float RepeatTime : How long until the next repeat.
; bool ShiftPressed : Shift key is being held.
; [[Legacy:GUIComponent|GUIComponent]] SkipControl : This control should be skipped over and drawn at the end.
; array&lt;string&gt; StyleNames : Holds the name of all styles to use.
; array&lt;[[Legacy:GUIStyles|GUIStyles]]&gt; StyleStack : Holds all of the possible styles.
; sound UpSound : 
; [[Legacy:Material|Material]] WhiteBorder : 

==Methods==

===Inherited from [[Legacy:Interaction|Interaction]]===
; NotifyLevelChange ( ) [event] : 

===Inherited from [[Legacy:BaseGUIController|BaseGUIController]]===
; AutoLoadMenus ( ) [event] : 
; bool OpenMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Opens a new menu and places it on top of the stack.
; bool ReplaceMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Replaces a menu in the stack.  Returns true if success.
; CloseAll (bool bCancel) [event] : 
; bool CloseMenu (optional bool bCanceled) [event] : Close the top menu.  returns true if success.
; InitializeController ( ) [event] : 
; SetControllerStatus (bool On) : 
; SetRequiredGameResolution (string GameRes) [event] : 
; bool NeedsMenuResolution() [event] : 

===Newly Declared Methods===
; ChangeFocus ([[Legacy:GUIComponent|GUIComponent]] Who) [event] : 
; ClearControls ([[Legacy:GUIMultiComponent|GUIMultiComponent]] Comp) : 
; [[Legacy:GUIPage|GUIPage]] CreateMenu (string NewMenuName) [event] : Attempts to create a menu.  Returns none if it can't.
; string GetCurrentRes ( ) [native] : Returns the current res as a string.
; string GetMainMenuClass ( ) [native] : Returns GameEngine.MainMenuClass.
; GetMapList (string Prefix , [[Legacy:GUIList|GUIList]] list) [native] : 
; [[Legacy:GUIFont|GUIFont]] GetMenuFont (string FontName) [native event] : Finds a given font in the FontStack.
; GetOGGList (out array&lt;string&gt; OGGFiles) [native] : 
; GetProfileList (string Prefix, out array&lt;string&gt; ProfileList) [native] : 
; [[Legacy:GUIStyles|GUIStyles]] GetStyle (string StyleName) [native event] : Find a style on the stack.
; GetTeamSymbolList (array&lt;string&gt; SymbolNames, optional bool bNoSinglePlayer) [native] : 
; GetWeaponList (out array&lt;class&lt;[[Legacy:Weapon|Weapon]]&gt;&gt; WeaponClass , out array&lt;string&gt; WeaponDesc) [native] : 
; bool HasMouseMoved ( ) : 
; string LoadDecoText (string PackageName , string DecoTextName) [native] : 
; MoveFocused ([[Legacy:GUIComponent|GUIComponent]] Ctrl , int bmLeft, int bmTop, int bmWidth, int bmHeight, float ClipX , float ClipY) [event] : 
; bool RegisterStyle (class&lt;[[Legacy:GUIStyles|GUIStyles]]&gt; StyleClass) : 
; ResetFocus() : 
; ResetKeyboard ( ) [native] : 
; [[Legacy:GUIPage|GUIPage]] TopPage ( ) : 

===Delegates===
; bool OnNeedRawKeyPress (byte NewKey) : 

==Known Subclasses==
* [[Legacy:ProGUIController|ProGUIController]] &amp;ndash; used by the UT2003 Pro GUI
* [[Legacy:UT2K4GUIController|UT2K4GUIController]]

==Related Topics==
* [[Legacy:GUI|GUI]]
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43399</id>
      <timestamp>2010-06-03T05:07:49Z</timestamp>
      <contributor>
        <ip>60.247.21.86</ip>
      </contributor>
      <comment>Replaced content with '&lt;uscript&gt;
event TempFunction(string GameRes)
{
    GameResolution = GameRes;
    return true;
}
&lt;/uscript&gt;'</comment>
      <text xml:space="preserve">&lt;uscript&gt;
event TempFunction(string GameRes)
{
    GameResolution = GameRes;
    return true;
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>43400</id>
      <timestamp>2010-06-03T08:19:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/60.247.21.86|60.247.21.86]] ([[User talk:60.247.21.86|Talk]]) to last revision by [[User:222-152-45-131.adsl.ihug.co.nz|222-152-45-131.adsl.ihug.co.nz]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; [[Legacy:Interaction|Interaction]] &gt;&gt; [[Legacy:BaseGUIController|BaseGUIController]] &gt;&gt; GUIController (Package: XInterface)}}

The GUIController contains a simple first-in, last-out menu stack.  You have three things you can do:
* '''Open a menu''' &amp;ndash; adds the menu to the top of the stack.
* '''Replace a menu''' &amp;ndash; replaces the current menu with the new menu.
* '''Close a menu''' &amp;ndash; returns you to the last menu on the stack.

The GUIController is the [[Legacy:GUI|GUI]] system's only interface to the world of [[Legacy:Actor|Actor]]s.

A similar [[Legacy:UT|UT]] class would probably be the [[Legacy:WindowConsole|WindowConsole]], although the UWindow system in UT is more like a console extension while UT2003's GUIController and [[Legacy:Console|Console]] are both [[Legacy:Interaction|Interaction]]s without being a subclass of eachother.

==Properties==
; [[Legacy:GUIComponent|GUIComponent]] ActiveControl : Which control is currently active.
; [[Legacy:GUIPage|GUIPage]] ActivePage : Points to the currently active page.
; bool AltPressed : Alt key is being held.
; array&lt;string&gt; AutoLoad (config) : Any menu classes in here will be automatically loaded.
; bool bCurMenuInitialized : Has the current Menu Finished initialization.
; bool bDesignMode : Are we in design mode.
; bool bForceMouseCheck : 
; bool bHighlightCurrent : Highlight the current control being edited.
; bool bIgnoreNextRelease : Used to make sure discard errant releases.
; bool bIgnoreUntilPress : 
; bool bModAuthor (config) : Enables interactive GUI design mode.  See above for details.
; float ButtonRepeatDelay : The amount of delay for faking button repeats.
; sound ClickSound : 
; bool CtrlPressed : Ctrl key is being held.
; float CursorFade : How visible is the cursor.
; int CursorStep : Are we fading in or out.
; float DblClickWindow : How long do you have for a double click.
; sound DownSound : 
; sound EditSound : 
; float FastCursorFade : How visible is the cursor.
; int FastCursorStep : Are we fading in or out.
; [[Legacy:GUIComponent|GUIComponent]] FocusedControl : Top most Focused control.
; array&lt;[[Legacy:GUIFont|GUIFont]]&gt; FontStack (editinline) : Holds all the possible fonts.
; string GameResolution : 
; float LastClickTime : When did the last click occur.
; int LastClickX&lt;br /&gt;int LastClickY : Who was the active component
; float LastMouseX : 
; float LastMouseY : 
; bool MainNotWanted : Set to true if you don't want main to appear.
; float MenuMouseSens (config) : 
; array&lt;[[Legacy:GUIPage|GUIPage]]&gt; MenuStack (editinline, export) : Holds the stack of menus.
; Array&lt;vector&gt; MouseCursorOffset (editinline) : Only X,Y used, between 0 and 1. 'Hot Spot' of cursor material.
; Array&lt;[[Legacy:Material|Material]]&gt; MouseCursors (editinline) : Holds a list of all possible mouse coursers.
; sound MouseOverSound : 
; float MouseX&lt;br /&gt;float MouseY : Where is the mouse currently located.
; [[Legacy:GUIComponent|GUIComponent]] MoveControl : Used for visual design.
; array&lt;[[Legacy:GUIPage|GUIPage]]&gt; PersistentStack : Holds the set of pages which are persistent across close/open.
; float RepeatDelta : Data var
; byte RepeatKey : Used to determine what should repeat.
; float RepeatTime : How long until the next repeat.
; bool ShiftPressed : Shift key is being held.
; [[Legacy:GUIComponent|GUIComponent]] SkipControl : This control should be skipped over and drawn at the end.
; array&lt;string&gt; StyleNames : Holds the name of all styles to use.
; array&lt;[[Legacy:GUIStyles|GUIStyles]]&gt; StyleStack : Holds all of the possible styles.
; sound UpSound : 
; [[Legacy:Material|Material]] WhiteBorder : 

==Methods==

===Inherited from [[Legacy:Interaction|Interaction]]===
; NotifyLevelChange ( ) [event] : 

===Inherited from [[Legacy:BaseGUIController|BaseGUIController]]===
; AutoLoadMenus ( ) [event] : 
; bool OpenMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Opens a new menu and places it on top of the stack.
; bool ReplaceMenu (string NewMenuName, optional string Param1, optional string Param2) [event] : Replaces a menu in the stack.  Returns true if success.
; CloseAll (bool bCancel) [event] : 
; bool CloseMenu (optional bool bCanceled) [event] : Close the top menu.  returns true if success.
; InitializeController ( ) [event] : 
; SetControllerStatus (bool On) : 
; SetRequiredGameResolution (string GameRes) [event] : 
; bool NeedsMenuResolution() [event] : 

===Newly Declared Methods===
; ChangeFocus ([[Legacy:GUIComponent|GUIComponent]] Who) [event] : 
; ClearControls ([[Legacy:GUIMultiComponent|GUIMultiComponent]] Comp) : 
; [[Legacy:GUIPage|GUIPage]] CreateMenu (string NewMenuName) [event] : Attempts to create a menu.  Returns none if it can't.
; string GetCurrentRes ( ) [native] : Returns the current res as a string.
; string GetMainMenuClass ( ) [native] : Returns GameEngine.MainMenuClass.
; GetMapList (string Prefix , [[Legacy:GUIList|GUIList]] list) [native] : 
; [[Legacy:GUIFont|GUIFont]] GetMenuFont (string FontName) [native event] : Finds a given font in the FontStack.
; GetOGGList (out array&lt;string&gt; OGGFiles) [native] : 
; GetProfileList (string Prefix, out array&lt;string&gt; ProfileList) [native] : 
; [[Legacy:GUIStyles|GUIStyles]] GetStyle (string StyleName) [native event] : Find a style on the stack.
; GetTeamSymbolList (array&lt;string&gt; SymbolNames, optional bool bNoSinglePlayer) [native] : 
; GetWeaponList (out array&lt;class&lt;[[Legacy:Weapon|Weapon]]&gt;&gt; WeaponClass , out array&lt;string&gt; WeaponDesc) [native] : 
; bool HasMouseMoved ( ) : 
; string LoadDecoText (string PackageName , string DecoTextName) [native] : 
; MoveFocused ([[Legacy:GUIComponent|GUIComponent]] Ctrl , int bmLeft, int bmTop, int bmWidth, int bmHeight, float ClipX , float ClipY) [event] : 
; bool RegisterStyle (class&lt;[[Legacy:GUIStyles|GUIStyles]]&gt; StyleClass) : 
; ResetFocus() : 
; ResetKeyboard ( ) [native] : 
; [[Legacy:GUIPage|GUIPage]] TopPage ( ) : 

===Delegates===
; bool OnNeedRawKeyPress (byte NewKey) : 

==Known Subclasses==
* [[Legacy:ProGUIController|ProGUIController]] &amp;ndash; used by the UT2003 Pro GUI
* [[Legacy:UT2K4GUIController|UT2K4GUIController]]

==Related Topics==
* [[Legacy:GUI|GUI]]
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]
* [[Legacy:Interactive GUI|Interactive GUI Design Mode]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIFloatEdit</title>
    <id>28559</id>
    <revision>
      <id>40260</id>
      <timestamp>2009-11-17T11:09:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIFont</title>
    <id>1355</id>
    <revision>
      <id>3444</id>
      <timestamp>2004-03-17T07:18:24Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; GUIFont (Package: XInterface)}}

GUIFont is used to give a single pipeline for handling fonts at multiple resolutions while at the same time supporting resolution independant fonts (for browsers, etc). 

==Properties==

; string KeyName : This is the name used for lookup.

; bool bFixedSize : If true, only FontArray[0] is used.

; array&lt;string&gt; FontArrayNames : Holds all of the names of the fonts.

; array&lt;[[Legacy:Font|Font]]&gt; FontArrayFonts : Holds all of the fonts.

==Methods==

; [[Legacy:Font|Font]] GetFont( int XRes ) [native,event] : Returns the font for the current resolution.

; [[Legacy:Font|Font]] LoadFontStatic( int i ) [static] : Dynamically loads a font from default.FontArrayNames into default.FontArrayFonts and returns it.

; [[Legacy:Font|Font]] LoadFont( int i ) : Dynamically loads a font from FontArrayNames into FontArrayFonts and returns it.

==Known Subclasses==

* [[Legacy:UT2DefaultFont|UT2DefaultFont]]
* [[Legacy:UT2HeaderFont|UT2HeaderFont]]
* [[Legacy:UT2IRCFont|UT2IRCFont]]
* [[Legacy:UT2LargeFont|UT2LargeFont]]
* [[Legacy:UT2MenuFont|UT2MenuFont]]
* [[Legacy:UT2MidGameFont|UT2MidGameFont]]
* [[Legacy:UT2ServerListFont|UT2ServerListFont]]
* [[Legacy:UT2SmallFont|UT2SmallFont]]
* [[Legacy:UT2SmallHeaderFont|UT2SmallHeaderFont]]

==Related Topics==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIHorzScrollZone</title>
    <id>28841</id>
    <revision>
      <id>42768</id>
      <timestamp>2010-03-30T16:15:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIImage</title>
    <id>28848</id>
    <revision>
      <id>42775</id>
      <timestamp>2010-03-30T16:16:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUILabel</title>
    <id>1325</id>
    <revision>
      <id>3377</id>
      <timestamp>2004-04-27T21:06:53Z</timestamp>
      <contributor>
        <ip>ACCF530C.ipt.aol.com</ip>
      </contributor>
      <comment>bMultiLine : If the text is too big for the bounding box it gets truncated (confirmation)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUILabel}}

This class is a text label.  You use it to display labels or multiple lines of text.  It's probably more complex than you are expecting - but at least it's easy to use.

==Properties ==

===Menu ===
;localized string Caption: The text to display.
;eTextAlign TextAlign: How the text is aligned in its bounding box (the bounding box attributes are inherited from GUIComponent).
;color TextColor: The color of the text when it doesn't have focus (labels don't normally get focus).
;color FocusedTextColor: The color of the text when the label does have focus (unusual).
;EMenuRenderStyle TextStyle: The canvas style to use to display the label.
;string TextFont: The font the text for the label should be displayed in.  The string refers to a class derived from [[Legacy:GUIFont|GUIFont]].  '''Doesn't work''' &amp;ndash; the fonts specified in the style selected by the inherited StyleName property are used.
;bool bTransparent: Set this to false if your label should have a background drawn for it (default is true).
;bool bMultiLine: If this is true the text will be cut so that it is displayed on multiple lines within its bounding box. If the text is too big for the bounding box it gets truncated
;color BackColor: This is the background color for the label.  This is only relevant if bTransparent = false.

==Example Definition==

&lt;uscript&gt;
defaultproperties {
  Begin Object class=GUILabel Name=TestLabel
    Caption=&quot;Label text&quot;
    WinLeft=0
    WinTop=0.2
    WinWidth=0.4
    WinHeight=20
    bBoundToParent=true
    bScaleToParent=true
  End Object
  Controls(2)=GUILabel'TestLabel'
}
&lt;/uscript&gt;

----

[[Category Class (UT2003)</text>
    </revision>
    <revision>
      <id>3378</id>
      <timestamp>2003-12-04T21:28:34Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUILabel}}

This class is a text label.  You use it to display labels or multiple lines of text.  It's probably more complex than you are expecting - but at least it's easy to use.

==Properties ==

===Menu ===
;localized string Caption: The text to display.
;eTextAlign TextAlign: How the text is aligned in its bounding box (the bounding box attributes are inherited from GUIComponent).
;color TextColor: The color of the text when it doesn't have focus (labels don't normally get focus).
;color FocusedTextColor: The color of the text when the label does have focus (unusual).
;EMenuRenderStyle TextStyle: The canvas style to use to display the label.
;string TextFont: The font the text for the label should be displayed in.  The string refers to a class derived from [[Legacy:GUIFont|GUIFont]].  '''Doesn't work''' &amp;ndash; the fonts specified in the style selected by the inherited StyleName property are used.
;bool bTransparent: Set this to false if your label should have a background drawn for it (default is true).
;bool bMultiLine: If this is true the text will be cut so that it is displayed on multiple lines within its bounding box. ''(What happens if the text is too big for the bounding box? I think it gets truncated)''
;color BackColor: This is the background color for the label.  This is only relevant if bTransparent = false.

==Example Definition==

&lt;uscript&gt;
defaultproperties {
  Begin Object class=GUILabel Name=TestLabel
    Caption=&quot;Label text&quot;
    WinLeft=0
    WinTop=0.2
    WinWidth=0.4
    WinHeight=20
    bBoundToParent=true
    bScaleToParent=true
  End Object
  Controls(2)=GUILabel'TestLabel'
}
&lt;/uscript&gt;

----

[[Category Class (UT2003)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIList</title>
    <id>28266</id>
    <revision>
      <id>39923</id>
      <timestamp>2009-11-14T18:04:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIListBase</title>
    <id>28365</id>
    <revision>
      <id>40033</id>
      <timestamp>2009-11-15T07:55:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIListBoxBase</title>
    <id>28385</id>
    <revision>
      <id>40056</id>
      <timestamp>2009-11-15T08:15:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIMenuOption</title>
    <id>1347</id>
    <revision>
      <id>3425</id>
      <timestamp>2006-01-04T03:13:56Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIMenuOption (Package: XInterface)}}

Parent class for combined components that include a caption and a widget.

==Properties==
; string ComponentClassName : Name of the component to spawn. Subclasses of this set a default.
; localized string Caption : Caption for the label
; string LabelFont : Name of the Font for the label
; Color LabelColor : Color for the label 
; bool bHeightFromComponent : Get the Height of this component from the subcomponent (the thing spawned by ComponentClassName). For example, a [[Legacy:MoComboBox|moComboBox]] will obtain its WinHeight from its embedded [[Legacy:GUIComboBox|GUIComboBox]] object's default height. Beware of this property! It is True ''by default'', and that means that setting WinHeight will have NO effect and you'll be tearing your hair to work out why!
; float CaptionWidth : How big should the Caption be
; float ComponentWidth : How big should the Component be (-1 = 1-CaptionWidth)
; bool bFlipped : Draw the Component to the left of the caption
; eTextAlign LabelJustification : How do we justify the label: one of TXTA_Left, TXTA_Center, TXTA_Right (defined in [[Legacy:GUI|GUI]]).
; eTextAlign ComponentJustification : How do we justify the label
; bool bSquare : Use the Height for the Width
; bool bVerticalLayout : Layout controls vertically

==Known Subclasses==
 GUIMenuOption
   +- [[Legacy:GUIListSpacer|GUIListSpacer]] (UT2004)
   |    +- [[Legacy:GUIListHeader|GUIListHeader]] 
   +- [[Legacy:MoButton|moButton]] (UT2004)
   +- [[Legacy:MoCheckBox|moCheckBox]]
   +- [[Legacy:MoComboBox|moComboBox]]
   |    +- [[Legacy:MoComboBoxPlus|moComboBoxPlus]] 
   +- [[Legacy:MoEditBox|moEditBox]]
   |    +- [[Legacy:AnimatedEditBox|AnimatedEditBox]] 
   +- [[Legacy:MoFloatEdit|moFloatEdit]]
   +- [[Legacy:MoNumericEdit|moNumericEdit]]
   |    +- [[Legacy:MoFormatNumEdit|moFormatNumEdit]] 
   +- [[Legacy:MoSlider|moSlider]] (UT2004)

==Discussion==

'''Tarquin:''' these are great, but is there a nice way to set properties for the subwidgets? Eg, I can do this:
  moComboBox.MyComboBox.List.TextAlign=TXTA_Right;

in the InitComponent() of the panel I'm using this in, but not this in default props of the same panel:
  Begin Object class=moComboBox Name=TestComboBox
    WinTop    = 0.4;
    WinLeft   = 0.0;
    WinWidth  = 1.0;
    WinHeight = 0.1;
    CaptionWidth=0.45
    Caption=&quot;Combo box&quot;
    MyComboBox.List.TextAlign=TXTA_Left; // chokes!
  End Object

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3426</id>
      <timestamp>2004-03-20T18:32:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>MyComboBox.List.TextAlign=TXTA_Left; // chokes! help!</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIMenuOption}}

Parent class for combined components that include a caption and a widget.

==Properties==
; string ComponentClassName : Name of the component to spawn. Subclasses of this set a default.
; localized string Caption : Caption for the label
; string LabelFont : Name of the Font for the label
; Color LabelColor : Color for the label 
; bool bHeightFromComponent : Get the Height of this component from the subcomponent (the thing spawned by ComponentClassName). For example, a [[Legacy:MoComboBox|moComboBox]] will obtain its WinHeight from its embedded [[Legacy:GUIComboBox|GUIComboBox]] object's default height. Beware of this property! It is True ''by default'', and that means that setting WinHeight will have NO effect and you'll be tearing your hair to work out why!
; float CaptionWidth : How big should the Caption be
; float ComponentWidth : How big should the Component be (-1 = 1-CaptionWidth)
; bool bFlipped : Draw the Component to the left of the caption
; eTextAlign LabelJustification : How do we justify the label: one of TXTA_Left, TXTA_Center, TXTA_Right (defined in [[Legacy:GUI|GUI]]).
; eTextAlign ComponentJustification : How do we justify the label
; bool bSquare : Use the Height for the Width
; bool bVerticalLayout : Layout controls vertically

==Known subclasses==
* [[Legacy:MoCheckBox|moCheckBox]]
* [[Legacy:MoComboBox|moComboBox]]
* [[Legacy:MoEditBox|moEditBox]]
* [[Legacy:MoFloatEdit|moFloatEdit]]
* [[Legacy:MoNumericEdit|moNumericEdit]]

==Comments==

'''Tarquin:''' these are great, but is there a nice way to set properties for the subwidgets? Eg, I can do this:
  moComboBox.MyComboBox.List.TextAlign=TXTA_Right;

in the InitComponent() of the panel I'm using this in, but not this in default props of the same panel:
  Begin Object class=moComboBox Name=TestComboBox
    WinTop    = 0.4;
    WinLeft   = 0.0;
    WinWidth  = 1.0;
    WinHeight = 0.1;
    CaptionWidth=0.45
    Caption=&quot;Combo box&quot;
    MyComboBox.List.TextAlign=TXTA_Left; // chokes!
  End Object

----

[[Category Class (UT2003)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIMultiColumnListHeader</title>
    <id>28486</id>
    <revision>
      <id>40187</id>
      <timestamp>2009-11-17T10:56:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIMultiComponent</title>
    <id>1346</id>
    <revision>
      <id>3422</id>
      <timestamp>2007-08-22T17:32:44Z</timestamp>
      <contributor>
        <ip>206.135.90.253</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUIMultiComponent (package: XInterface)}}

{{innerbox| GUIMultiComponents are collections of components that work together.  When initialized, GUIMultiComponents transfer all of their components to the to the GUIPage that owns them.

}}

The parents class of panels, pages and various input components such as scrollbars and editboxes. 

==Properties==

===Main===
; bool bAlwaysAutomate : If true, empty Controls array when InitializeControls() is called. (Generally required in order to use automated components when subclassing classes that have Controls members defined in default properties)
; bool PropagateVisibility : Does changes to visibility propagate down the line?
; bool bOldStyleMenus : Is this a UT2003 menu or UT2004? ''(UT2004 only)''
; int AnimationCount (noexport, editconst) : Every time a component begins an animation frame, this is increased.

===State===
; bool bDrawFocusedLast : Draw focused control last. (focused control will always appear on top)
; [[Legacy:GUIComponent|GUIComponent]] FocusedControl (noexport, editconst) : Which component inside this object has focus?

===Menu===
; array&lt;GUIComponent&gt; Components (noexport, editconstarray) : An array of Controls that can be tabbed to. ''(components with bTabStop = true)''
; array&lt;GUIComponent&gt; Controls (editinlinenotify, export) : An array of Components that make up this Control.

==Known Subclasses==

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] for a full tree.
* [[Legacy:GUIComboBox|GUIComboBox]]
* [[Legacy:GUIFloatEdit|GUIFloatEdit]]
* [[Legacy:GUIListBoxBase|GUIListBoxBase]]
* [[Legacy:GUIMenuOption|GUIMenuOption]]
* [[Legacy:GUINumericEdit|GUINumericEdit]]
* [[Legacy:GUIPage|GUIPage]]
* [[Legacy:GUIPanel|GUIPanel]]
* [[Legacy:GUIScrollBarBase|GUIScrollBarBase]]
*[[Legacy:GUITabControl|GUITabControl]]</text>
    </revision>
    <revision>
      <id>3423</id>
      <timestamp>2004-03-18T19:43:24Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUIMultiComponent (package: XInterface)}}

{{innerbox| GUIMultiComponents are collections of components that work together.

}}

The parents class of panels and tab panels. 

==Properties ==
; Controls : a [[Legacy:Dynamic Array|dynamic array]] of [[Legacy:GUIComponent|GUIComponent]]s.
; FocusedControl : the currnetly focussed GUIComponent.

==Known Subclasses==

(someone copy from [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] please!)</text>
    </revision>
    <revision>
      <id>3424</id>
      <timestamp>2005-04-12T09:17:03Z</timestamp>
      <contributor>
        <ip>Arelius</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUIMultiComponent (package: XInterface)}}

{{innerbox| GUIMultiComponents are collections of components that work together.

}}

The parents class of panels and tab panels. 

==Properties ==
; Controls : a [[Legacy:Dynamic Array|dynamic array]] of [[Legacy:GUIComponent|GUIComponent]]s.
; FocusedControl : the currnetly focussed GUIComponent.

==Known Subclasses==

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]] for a full tree.
* [[Legacy:GUIComboBox|GUIComboBox]]
* [[Legacy:GUIFloatEdit|GUIFloatEdit]]
* [[Legacy:GUIListBoxBase|GUIListBoxBase]]
* [[Legacy:GUIMenuOption|GUIMenuOption]]
* [[Legacy:GUINumericEdit|GUINumericEdit]]
* [[Legacy:GUIPage|GUIPage]]
* [[Legacy:GUIPanel|GUIPanel]]
* [[Legacy:GUIScrollBarBase|GUIScrollBarBase]]
*[[Legacy:GUITabControl|GUITabControl]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUINumericEdit</title>
    <id>28452</id>
    <revision>
      <id>40149</id>
      <timestamp>2009-11-17T10:08:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIPage</title>
    <id>1337</id>
    <revision>
      <id>3403</id>
      <timestamp>2006-09-02T06:48:29Z</timestamp>
      <contributor>
        <ip>64-110-208-134.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIPage}}

'''Note:''' If you create a subclass of [[Legacy:GUIPage|GUIPage]] you must have '''bAllowedAsLast''' set to true to stop it from exiting to the main menu when you have closed your custom [[Legacy:GUIPage|GUIPage]].

===Using GUIPage To Make a GUI===

The general need for a GUI is to provide some level of interaction with the player.  If you just want to display something, chance are you want to use the [[Legacy:ScoreBoard|ScoreBoard]] or some other Canvas-aimed class.  So let's start with something simple: a button.  It will call the SetupStuff() function in the player.

The first thing you'll need to do is create a [[Legacy:Subobject|Subobject]] in your default properties (this isn't mandatory, but it fits perfectly with the purpose.)  It looks like this:

&lt;uscript&gt;
defaultproperties
{
    Begin Object Class=GUIButton Name=SetupButton
        Caption   = &quot;Setup Stuff&quot;;
        //Size of this button
        WinTop    = 0.800;  //NOTE!! This is 0-1, with 0 being the *top* of the screen.
        WinLeft   = 0.100;
        WinWidth  = 0.300;
        WinHeight = 0.040;
        StyleName = &quot;RoundButton&quot;;
        OnClick   = InternalOnClick;
    End Object

    Controls[0] = GUIButton'SetupButton';
}
&lt;/uscript&gt;

Notice the OnClick delegate function assignment.  There are numerous delegate functions in the GUIComponent class and the important thing to remember is that whatever function you assign it to, it has the same arguments.  In the case of the delegate OnClick, right here, we are passed a GUIComponent, which will be the component clicked.  We can use this function to check what was clicked and act on it, like so:

&lt;uscript&gt;
function bool InternalOnClick(GUIComponent Sender)
{
    //My custom player controller that needs to be set up.
    local myPlayerController PC;    

    //Check to see if our SetupButton was what was clicked
    if( Sender == Controls[0] )
    {
        //ViewportOwner comes from Interaction, which
        //our GUIController (the dude who manages this)
        //is a subclass of
        PC = myPlayerController(Controller.ViewportOwner);

        //Always check!
        if( PC == none )
            return false;

        //Set up our player's stuff!
        PC.SetupStuff();
        return true;
    }
 
    return false;
}
&lt;/uscript&gt;

So we first check to see if it was our button that called the function (sometimes you'll have several you want to differentiate between.)  Then we get our playercontroller and call the function on it.  Simple!

You can use a lot besides buttons, just check out the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

'''''A special note:''''' This is in fact ''client side'' which means that if you want it to affect things on the server you must use proper replication.  For instance, if you want SetupStuff() to set health and armor data, you would want to replicate that function to the server.

===How to Change the Music Played at the Main Menu===

One of the common things a Mod Maker will want to do is alter the Music played during the main menu. The easiest way to do this is by adding this simple piece of code to your GUIPage (could even use different music for difference pages in theory).

&lt;uscript&gt;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
    Super.InitComponent(MyController, MyOwner);
    Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;
}
&lt;/uscript&gt;

The other way of achieving this is to use a custom Entry.ut2 map. This map is always loaded even when playing other maps, so for performance reasons it is best to keep this simple. When making your own Entry.ut2 map, it's recommended to place this in a separate directory (eg. UT2003/MyMod/Maps). You can use all manner of mapping tools here, such a matinee sequences. It's easy enough to set the level music for this map. To make use of this, your mod would need to use it's own .ini file. Find the Core.System and place your ../MyMod/Maps/*.ut2 entry above the existing Maps entry.

  [Core.System]
  ...
  ...
  Paths=../MyMod/Maps/*.ut2
  Paths=../Maps/*.ut2
  Paths= ...
  ...
  ...

Using this method Unreal will find your custom Entry.ut2 map before the default one and use that. Just keep in mind this map is always loaded, so keep it fairly simple.

===Adding Music to a UT2004 MOD's MainMenu ===

In your GUIPage you'll want to do something along the lines of what's below to play a .ogg file:

&lt;uscript&gt;
function InternalOnOpen()
{
        // &quot;theme&quot; in the line below corresponds to a &quot;theme.ogg&quot; file
        // in the music folder

        // you can find more MTRAN settings in the Actor enums

	PlayerOwner().ClientSetInitialMusic(theme,MTRAN_Instant);
}
&lt;/uscript&gt;

'''Haral:''' I decided to make something of a practical GUI guide here.  If I just missed someone else's, it sucks, or something of that nature delete it, move it, or whatever.

'''Wormbo:''' We definately have a [[:Category:Legacy To Do]] here. Wiki class header, properties, methods and known subclasses like on other class pages should be added.

'''Daemonica:''' I've added some knowledge I've picked up about changing the music played during maps. This can be found at [[Legacy:Daemonica/Previous Problems|Daemonica/Previous Problems]], hope it's helpful.

'''Kungfu Hampster:''' I'd like to see some stuff about making ingame menus as well...as well as other GUI related stuff ;)

'''SimEnzo:''' I added a little section about adding music to the main menu of a UT2004 mod.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3404</id>
      <timestamp>2005-12-09T05:41:19Z</timestamp>
      <contributor>
        <ip>161.38.223.243</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIPage}}

VERY IMPORTANT FOR n00bs:

if, when you close your GUIPages, it exits the level to the main menu, READ THIS:

from GUIPage.uc

&lt;uscript&gt;
...
var bool bAllowedAsLast;    // If this is true, closing this page will not bring up the main menu
...
&lt;/uscript&gt;

HEHEHE, so your GUIPAge subclass better have '''bAllowedAsLast=true''' in ''defaultproperties'', or else, you will spend two days figuring it out and, will even dream about it!

by AlphaOne

===Using GUIPage To Make a GUI===

The general need for a GUI is to provide some level of interaction with the player.  If you just want to display something, chance are you want to use the [[Legacy:ScoreBoard|ScoreBoard]] or some other Canvas-aimed class.  So let's start with something simple: a button.  It will call the SetupStuff() function in the player.

The first thing you'll need to do is create a [[Legacy:Subobject|Subobject]] in your default properties (this isn't mandatory, but it fits perfectly with the purpose.)  It looks like this:

&lt;uscript&gt;
defaultproperties
{
    Begin Object Class=GUIButton Name=SetupButton
        Caption   = &quot;Setup Stuff&quot;;
        //Size of this button
        WinTop    = 0.800;  //NOTE!! This is 0-1, with 0 being the *top* of the screen.
        WinLeft   = 0.100;
        WinWidth  = 0.300;
        WinHeight = 0.040;
        StyleName = &quot;RoundButton&quot;;
        OnClick   = InternalOnClick;
    End Object

    Controls[0] = GUIButton'SetupButton';
}
&lt;/uscript&gt;

Notice the OnClick delegate function assignment.  There are numerous delegate functions in the GUIComponent class and the important thing to remember is that whatever function you assign it to, it has the same arguments.  In the case of the delegate OnClick, right here, we are passed a GUIComponent, which will be the component clicked.  We can use this function to check what was clicked and act on it, like so:

&lt;uscript&gt;
function bool InternalOnClick(GUIComponent Sender)
{
    //My custom player controller that needs to be set up.
    local myPlayerController PC;    

    //Check to see if our SetupButton was what was clicked
    if( Sender == Controls[0] )
    {
        //ViewportOwner comes from Interaction, which
        //our GUIController (the dude who manages this)
        //is a subclass of
        PC = myPlayerController(Controller.ViewportOwner);

        //Always check!
        if( PC == none )
            return false;

        //Set up our player's stuff!
        PC.SetupStuff();
        return true;
    }
 
    return false;
}
&lt;/uscript&gt;

So we first check to see if it was our button that called the function (sometimes you'll have several you want to differentiate between.)  Then we get our playercontroller and call the function on it.  Simple!

You can use a lot besides buttons, just check out the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

'''''A special note:''''' This is in fact ''client side'' which means that if you want it to affect things on the server you must use proper replication.  For instance, if you want SetupStuff() to set health and armor data, you would want to replicate that function to the server.

===How to Change the Music Played at the Main Menu===

One of the common things a Mod Maker will want to do is alter the Music played during the main menu. The easiest way to do this is by adding this simple piece of code to your GUIPage (could even use different music for difference pages in theory).

&lt;uscript&gt;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
    Super.InitComponent(MyController, MyOwner);
    Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;
}
&lt;/uscript&gt;

The other way of achieving this is to use a custom Entry.ut2 map. This map is always loaded even when playing other maps, so for performance reasons it is best to keep this simple. When making your own Entry.ut2 map, it's recommended to place this in a separate directory (eg. UT2003/MyMod/Maps). You can use all manner of mapping tools here, such a matinee sequences. It's easy enough to set the level music for this map. To make use of this, your mod would need to use it's own .ini file. Find the Core.System and place your ../MyMod/Maps/*.ut2 entry above the existing Maps entry.

  [Core.System]
  ...
  ...
  Paths=../MyMod/Maps/*.ut2
  Paths=../Maps/*.ut2
  Paths= ...
  ...
  ...

Using this method Unreal will find your custom Entry.ut2 map before the default one and use that. Just keep in mind this map is always loaded, so keep it fairly simple.

===Adding Music to a UT2004 MOD's MainMenu ===

In your GUIPage you'll want to do something along the lines of what's below to play a .ogg file:

&lt;uscript&gt;
function InternalOnOpen()
{
        // &quot;theme&quot; in the line below corresponds to a &quot;theme.ogg&quot; file
        // in the music folder

        // you can find more MTRAN settings in the Actor enums

	PlayerOwner().ClientSetInitialMusic(theme,MTRAN_Instant);
}
&lt;/uscript&gt;

'''Haral:''' I decided to make something of a practical GUI guide here.  If I just missed someone else's, it sucks, or something of that nature delete it, move it, or whatever.

'''Wormbo:''' We definately have a [[:Category:Legacy To Do]] here. Wiki class header, properties, methods and known subclasses like on other class pages should be added.

'''Daemonica:''' I've added some knowledge I've picked up about changing the music played during maps. This can be found at [[Legacy:Daemonica/Previous Problems|Daemonica/Previous Problems]], hope it's helpful.

'''Kungfu Hampster:''' I'd like to see some stuff about making ingame menus as well...as well as other GUI related stuff ;)

'''SimEnzo:''' I added a little section about adding music to the main menu of a UT2004 mod.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34145</id>
      <timestamp>2009-03-24T11:38:59Z</timestamp>
      <contributor>
        <ip>213.220.240.210</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIPage}}

'''Note:''' If you create a subclass of [[Legacy:GUIPage|GUIPage]] you must have '''bAllowedAsLast''' set to true to stop it from exiting to the main menu when you have closed your custom [[Legacy:GUIPage|GUIPage]].

===Using GUIPage To Make a GUI===

The general need for a GUI is to provide some level of interaction with the player.  If you just want to display something, chance are you want to use the [[Legacy:ScoreBoard|ScoreBoard]] or some other Canvas-aimed class.  So let's start with something simple: a button.  It will call the SetupStuff() function in the player.

The first thing you'll need to do is create a [[Legacy:Subobject|Subobject]] in your default properties (this isn't mandatory, but it fits perfectly with the purpose.)  It looks like this:

&lt;uscript&gt;
defaultproperties
{
    Begin Object Class=GUIButton Name=SetupButton
        Caption   = &quot;Setup Stuff&quot;;
        //Size of this button
        WinTop    = 0.800;  //NOTE!! This is 0-1, with 0 being the *top* of the screen.
        WinLeft   = 0.100;
        WinWidth  = 0.300;
        WinHeight = 0.040;
        StyleName = &quot;RoundButton&quot;;
        OnClick   = InternalOnClick;
    End Object

    Controls[0] = GUIButton'SetupButton';
}
&lt;/uscript&gt;

Notice the OnClick delegate function assignment.  There are numerous delegate functions in the GUIComponent class and the important thing to remember is that whatever function you assign it to, it has the same arguments.  In the case of the delegate OnClick, right here, we are passed a GUIComponent, which will be the component clicked.  We can use this function to check what was clicked and act on it, like so:

&lt;uscript&gt;
function bool InternalOnClick(GUIComponent Sender)
{
    //My custom player controller that needs to be set up.
    local myPlayerController PC;    

    //Check to see if our SetupButton was what was clicked
    if( Sender == Controls[0] )
    {
        //ViewportOwner comes from Interaction, which
        //our GUIController (the dude who manages this)
        //is a subclass of
        PC = myPlayerController(Controller.ViewportOwner);

        //Always check!
        if( PC == none )
            return false;

        //Set up our player's stuff!
        PC.SetupStuff();
        return true;
    }
 
    return false;
}
&lt;/uscript&gt;

So we first check to see if it was our button that called the function (sometimes you'll have several you want to differentiate between.)  Then we get our playercontroller and call the function on it.  Simple!

You can use a lot besides buttons, just check out the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

'''''A special note:''''' This is in fact ''client side'' which means that if you want it to affect things on the server you must use proper replication.  For instance, if you want SetupStuff() to set health and armor data, you would want to replicate that function to the server.

===How to Change the Music Played at the Main Menu===

One of the common things a Mod Maker will want to do is alter the Music played during the main menu. The easiest way to do this is by adding this simple piece of code to your GUIPage (could even use different music for difference pages in theory).

&lt;uscript&gt;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
    Super.InitComponent(MyController, MyOwner);
    Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;
}
&lt;/uscript&gt;

The other way of achieving this is to use a custom Entry.ut2 map. This map is always loaded even when playing other maps, so for performance reasons it is best to keep this simple. When making your own Entry.ut2 map, it's recommended to place this in a separate directory (eg. UT2003/MyMod/Maps). You can use all manner of mapping tools here, such a matinee sequences. It's easy enough to set the level music for this map. To make use of this, your mod would need to use it's own .ini file. Find the Core.System and place your ../MyMod/Maps/*.ut2 entry above the existing Maps entry.

  [Core.System]
  ...
  ...
  Paths=../MyMod/Maps/*.ut2
  Paths=../Maps/*.ut2
  Paths= ...
  ...
  ...

Using this method Unreal will find your custom Entry.ut2 map before the default one and use that. Just keep in mind this map is always loaded, so keep it fairly simple.

===Adding Music to a UT2004 MOD's MainMenu ===

In your GUIPage you'll want to do something along the lines of what's below to play a .ogg file:

&lt;uscript&gt;
function InternalOnOpen()
{
        // &quot;theme&quot; in the line below corresponds to a &quot;theme.ogg&quot; file
        // in the music folder

        // you can find more MTRAN settings in the Actor enums

	PlayerOwner().ClientSetInitialMusic(theme,MTRAN_Instant);
}
&lt;/uscript&gt;

'''Haral:''' I decided to make something of a practical GUI guide here.  If I just missed someone else's, it sucks, or something of that nature delete it, move it, or whatever.

'''Wormbo:''' We definately have a [[:Category:Legacy To Do]] here. Wiki class header, properties, methods and known subclasses like on other class pages should be added.

'''Daemonica:''' I've added some knowledge I've picked up about changing the music played during maps. This can be found at [[Legacy:Daemonica/Previous Problems|Daemonica/Previous Problems]], hope it's helpful.

'''Kungfu Hampster:''' I'd like to see some stuff about making ingame menus as well...as well as other GUI related stuff ;)

'''SimEnzo:''' I added a little section about adding music to the main menu of a UT2004 mod.
'''Flavius:''' How can I &quot;spawn&quot; the page? For example I want to display a map, when user presses a key - I saw Show method in GuiComponent, but actually I don't know, where to create the new instance of MyGuiPage...
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34146</id>
      <timestamp>2009-03-24T11:40:31Z</timestamp>
      <contributor>
        <ip>213.220.240.210</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIPage}}

'''Note:''' If you create a subclass of [[Legacy:GUIPage|GUIPage]] you must have '''bAllowedAsLast''' set to true to stop it from exiting to the main menu when you have closed your custom [[Legacy:GUIPage|GUIPage]].

===Using GUIPage To Make a GUI===

The general need for a GUI is to provide some level of interaction with the player.  If you just want to display something, chance are you want to use the [[Legacy:ScoreBoard|ScoreBoard]] or some other Canvas-aimed class.  So let's start with something simple: a button.  It will call the SetupStuff() function in the player.

The first thing you'll need to do is create a [[Legacy:Subobject|Subobject]] in your default properties (this isn't mandatory, but it fits perfectly with the purpose.)  It looks like this:

&lt;uscript&gt;
defaultproperties
{
    Begin Object Class=GUIButton Name=SetupButton
        Caption   = &quot;Setup Stuff&quot;;
        //Size of this button
        WinTop    = 0.800;  //NOTE!! This is 0-1, with 0 being the *top* of the screen.
        WinLeft   = 0.100;
        WinWidth  = 0.300;
        WinHeight = 0.040;
        StyleName = &quot;RoundButton&quot;;
        OnClick   = InternalOnClick;
    End Object

    Controls[0] = GUIButton'SetupButton';
}
&lt;/uscript&gt;

Notice the OnClick delegate function assignment.  There are numerous delegate functions in the GUIComponent class and the important thing to remember is that whatever function you assign it to, it has the same arguments.  In the case of the delegate OnClick, right here, we are passed a GUIComponent, which will be the component clicked.  We can use this function to check what was clicked and act on it, like so:

&lt;uscript&gt;
function bool InternalOnClick(GUIComponent Sender)
{
    //My custom player controller that needs to be set up.
    local myPlayerController PC;    

    //Check to see if our SetupButton was what was clicked
    if( Sender == Controls[0] )
    {
        //ViewportOwner comes from Interaction, which
        //our GUIController (the dude who manages this)
        //is a subclass of
        PC = myPlayerController(Controller.ViewportOwner);

        //Always check!
        if( PC == none )
            return false;

        //Set up our player's stuff!
        PC.SetupStuff();
        return true;
    }
 
    return false;
}
&lt;/uscript&gt;

So we first check to see if it was our button that called the function (sometimes you'll have several you want to differentiate between.)  Then we get our playercontroller and call the function on it.  Simple!

You can use a lot besides buttons, just check out the [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

'''''A special note:''''' This is in fact ''client side'' which means that if you want it to affect things on the server you must use proper replication.  For instance, if you want SetupStuff() to set health and armor data, you would want to replicate that function to the server.

===How to Change the Music Played at the Main Menu===

One of the common things a Mod Maker will want to do is alter the Music played during the main menu. The easiest way to do this is by adding this simple piece of code to your GUIPage (could even use different music for difference pages in theory).

&lt;uscript&gt;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
    Super.InitComponent(MyController, MyOwner);
    Controller.ViewPortOwner.Actor.GetEntryLevel().Song = &quot;UMS_Main_Menu_Music&quot;;
}
&lt;/uscript&gt;

The other way of achieving this is to use a custom Entry.ut2 map. This map is always loaded even when playing other maps, so for performance reasons it is best to keep this simple. When making your own Entry.ut2 map, it's recommended to place this in a separate directory (eg. UT2003/MyMod/Maps). You can use all manner of mapping tools here, such a matinee sequences. It's easy enough to set the level music for this map. To make use of this, your mod would need to use it's own .ini file. Find the Core.System and place your ../MyMod/Maps/*.ut2 entry above the existing Maps entry.

  [Core.System]
  ...
  ...
  Paths=../MyMod/Maps/*.ut2
  Paths=../Maps/*.ut2
  Paths= ...
  ...
  ...

Using this method Unreal will find your custom Entry.ut2 map before the default one and use that. Just keep in mind this map is always loaded, so keep it fairly simple.

===Adding Music to a UT2004 MOD's MainMenu ===

In your GUIPage you'll want to do something along the lines of what's below to play a .ogg file:

&lt;uscript&gt;
function InternalOnOpen()
{
        // &quot;theme&quot; in the line below corresponds to a &quot;theme.ogg&quot; file
        // in the music folder

        // you can find more MTRAN settings in the Actor enums

	PlayerOwner().ClientSetInitialMusic(theme,MTRAN_Instant);
}
&lt;/uscript&gt;

'''Haral:''' I decided to make something of a practical GUI guide here.  If I just missed someone else's, it sucks, or something of that nature delete it, move it, or whatever.

'''Wormbo:''' We definately have a [[:Category:Legacy To Do]] here. Wiki class header, properties, methods and known subclasses like on other class pages should be added.

'''Daemonica:''' I've added some knowledge I've picked up about changing the music played during maps. This can be found at [[Legacy:Daemonica/Previous Problems|Daemonica/Previous Problems]], hope it's helpful.

'''Kungfu Hampster:''' I'd like to see some stuff about making ingame menus as well...as well as other GUI related stuff ;)

'''SimEnzo:''' I added a little section about adding music to the main menu of a UT2004 mod.

'''Flavius:''' How can I &quot;spawn&quot; the page? For example I want to display a map, when user presses a key - I saw Show method in GuiComponent, but actually I don't know, where to create the new instance of MyGuiPage...
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIPanel</title>
    <id>1357</id>
    <revision>
      <id>3446</id>
      <timestamp>2008-02-14T23:32:23Z</timestamp>
      <contributor>
        <ip>69-11-86-35.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; GUIPanel (package: XInterface)}}

See [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].</text>
    </revision>
    <revision>
      <id>3447</id>
      <timestamp>2008-02-14T22:07:27Z</timestamp>
      <contributor>
        <ip>Dsl88-244-13102.ttnet.net.tr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;

&lt;!&amp;ndash; saved from url=(0014)about:internet &amp;ndash;&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta name=&quot;generator&quot; content=&quot;Web Page Maker V2&quot;&gt;

&lt;/head&gt;

&lt;style type=&quot;text/css&quot;&gt;

/*----------Text Styles----------*/

.ws6 {font-size: 8px;}

.ws7 {font-size: 9.3px;}

.ws8 {font-size: 11px;}

.ws9 {font-size: 12px;}

.ws10 {font-size: 13px;}

.ws11 {font-size: 15px;}

.ws12 {font-size: 16px;}

.ws14 {font-size: 19px;}

.ws16 {font-size: 21px;}

.ws18 {font-size: 24px;}

.ws20 {font-size: 27px;}

.ws22 {font-size: 29px;}

.ws24 {font-size: 32px;}

.ws26 {font-size: 35px;}

.ws28 {font-size: 37px;}

.ws36 {font-size: 48px;}

.ws48 {font-size: 64px;}

.ws72 {font-size: 96px;}

.wpmd {font-size: 13px;font-family: 'Arial';font-style: normal;font-weight: normal;}

/*----------Para Styles----------*/

DIV,UL,OL /* Left */

{
 margin-top: 0px;
 margin-bottom: 0px;

}
&lt;/style&gt;

&lt;body background=&quot;http://img179.imageshack.us/img179/9726/bbbbbbbtm7.jpg&quot;&gt;

&lt;/body&gt;

&lt;/html&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIProgressBar</title>
    <id>28515</id>
    <revision>
      <id>40216</id>
      <timestamp>2009-11-17T11:00:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIScrollBarBase</title>
    <id>28840</id>
    <revision>
      <id>42767</id>
      <timestamp>2010-03-30T16:15:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIScrollText</title>
    <id>1339</id>
    <revision>
      <id>3407</id>
      <timestamp>2005-01-14T02:07:04Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>* revert</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIListBase|GUIListBase]] &gt;&gt; [[Legacy:GUIVertList|GUIVertList]] &gt;&gt; [[Legacy:GUIList|GUIList]] &gt;&gt; GUIScrollText (Package: XInterface)}}

This class is really only used as part of a [[Legacy:GUIScrollTextBox|GUIScrollTextBox]].

==Properties==

===Public Properties===
; bool bClickText : Upon clicking on this text box, fill in ClickedString field.
; bool bNoTeletype : Dont do the teletyping effect at all.
; bool bRepeat : Should the sequence be repeated ?
; float CharDelay : This is the delay between each character. Regardless of this property characters are never displayed faster than 1 char per frame.
; string ClickedString : Filled in (if bClickText is true) when user clicks on a word.
; float EOLDelay : This is the delay to use when reaching end of a line.
; float InitialDelay : Initial delay after new content was set.
; int MaxHistory : Maximum number of rows. Only used in conjunction with NewText. 0 indicates no limit.
; string NewText : New text to add at the end of the current text.
; float RepeatDelay : This is used after all the text has been displayed and bRepeat is true.
; string Separator : Line separator to use.

===Protected Properties===
; bool bNewContent : This is set when new text content has been set for the control.; bool bStopped : Tells when the sequence has stopped animating (can be rushed by clicking ?)
; string Content : This is the content to display in 1 single string.
; int oldWidth : Last width of the display area.
; eScrollState ScrollState : What was the last action we did.
; int VisibleChars : How many chars in the last displayed line are visible.
; int VisibleLines : This is the number of visible lines.

==Enums==

===eScrollState===
; STS_None :
; STS_Initial :
; STS_Char :
; STS_EOL :
; STS_Repeat :

==Delegates==
; OnEndOfLine ( ) : 

==Methods==

===Inherited From [[Legacy:GUIComponent|GUIComponent]]===
; Timer ( ) : EOLDelay is the end of line delay, it will wait that long until display text on the next line.

===New Methods===
; EndScrolling ( ) : 
; string GetWordUnderCursor ( ) : 
; InitComponent ([[Legacy:GUIController|GUIController]] MyController, [[Legacy:GUIComponent|GUIComponent]] MyOwner) : 
; bool InternalOnClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : 
; bool InternalOnKeyEvent (out byte Key, out byte State, float delta) : 
; bool InternalOnKeyType (out byte Key, optional string Unicode) : 
; Restart ( ) : 
; SetContent (string NewContent, optional string sep) :  
; bool SkipChar ( ) : 
; Stop ( ) : 

==Related Topics==
* [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3408</id>
      <timestamp>2005-01-14T00:38:37Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIScrollTextBox</title>
    <id>1338</id>
    <revision>
      <id>3405</id>
      <timestamp>2003-07-20T14:28:21Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>added real properties</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIListBoxBase|GUIListBoxBase]] &gt;&gt; GUIScrollTextBox (Package: XInterface)}}

This class is very handy when you have more information than space or if you just want a box with text in it.  It will automatically handle new lines for you, and it has some fun parameters.

==Properties==

===Public Properties===

;[[Legacy:GUIScrollText|GUIScrollText]] MyScrollText: A [[Legacy:Subobject|Subobject]] which defines text this box displays.
;bool bRepeat: Repeat the sequence.
;bool bNoTeletype: Don't do the teletyping effect at all.
;bool bStripColors: Strip out IRC-style colour characters (^C)
;float InitialDelay: Initial delay after new content was set
;float CharDelay: This is the delay between each char
;float EOLDelay: This is the delay to use when reaching end of line
;float RepeatDelay: This is used after all the text has been displayed and bRepeat is true
;eTextAlign TextAlign: How is text Aligned in the control

==Methods==

===Inherited From [[Legacy:GUIComponent|GUIComponent]]===
; InitComponent ([[Legacy:GUIController|GUIController]] MyController, [[Legacy:GUIComponent|GUIComponent]] MyOwner) :

===New Methods===
; SetContent (string NewContent, optional string sep) : Sets/Replaces text in MyScrollText
; Restart ( ) : Sets values in MyScrollText to defaults.
; Stop ( ) : 
; bool SkipChar ( ) : 
; InternalOnAdjustTop (GUIComponent Sender) : Called by MyScrollText's delegate OnAdjustTop, stops text scrolling.
; bool IsNumber (string Num) :
; string StripColors (string MyString) : Removes IRC color codes
; AddText (string NewText) : Concatenates text and uses MyScrollText.Separator.

==Using It==

Besides probably declaring it as a [[Legacy:Subobject|Subobject]] in a subclass of [[Legacy:GUIPage|GUIPage]] you will need to do a couple of things to make use of it.  This GUIComponent is somewhat unique in having functions to set its variables: AddText and SetContent.

&lt;uscript&gt;
TextBox.SetContent(&quot;Hi, I'm GUI text box.&quot;);
TextBox.AddText(&quot;You may know me from such scripts as: \&quot;Mango, the Vengeance\&quot; and \&quot;Where Did My Function Go?\&quot;&quot;);
&lt;/uscript&gt;

This will give you a textbox that will display (linewrapped):

{{innerbox|Hi, I'm GUI text box.  You may know me from such scripts as: &quot;Mango, the Vengeance&quot; and &quot;Where Did My Function Go?&quot;

}}

Now, if you want to intentionally go to the next line, there's something specific for that.  The var '''Separator'''.  If you set this, it will automatically insert this between existing text and your argument in AddText().  ''Note that it will not be inserted if you do not put anything in AddText().''

'''AlphaOne:''' Is there any way to &quot;disable&quot; or stop the insertion of the separator? I would like to display a sequence of dots &quot;...&quot; displayed with a delay, one line.

'''Haral:''' Err well, if you don't set the Separator to anything, it will be &quot;&quot; and thus won't insert anything.  If all you want to do is display &quot;...&quot; on one line with a delay, you set the InitialDelay and say TextBox.SetContent(&quot;...&quot;);  Note that there is a set rate it &quot;writes&quot; the text at, I'm not sure where that's set.

'''Evolution:''' The rate at which it writes the characters out is stored in the CharDelay variable

&lt;uscript&gt;
TextBox.SetContent(&quot;Hi, I'm GUI text box.&quot;, Chr(13));
TextBox.MyScrollText.Separator = Chr(13);  //Set a newline separator.  Redundant with second SetContent parameter.
TextBox.AddText(&quot;You may know me from such scripts as: \&quot;Mango, the Vengeance\&quot; and \&quot;Where Did My Function Go?\&quot;&quot;);
&lt;/uscript&gt;

{{innerbox|Hi, I'm GUI Text box.

You may know me from such scripts as: &quot;Mango, the Vengeance&quot; and &quot;Where Did My Function Go?&quot;

}}

'''I, or somebody else, can update this a bit later with all of its class info.'''  &amp;rarr;[[Legacy:Haral|Haral]]

'''Haral:''' Oops.  This page sort of combined GUIScrollTextBox and GUIScrollText.  I started it, so I'll fix it.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3406</id>
      <timestamp>2003-07-09T18:35:08Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>Fixed the inheritance tree :)</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIListBoxBase|GUIListBoxBase]] &gt;&gt; GUIScrollTextBox (Package: XInterface)}}

This class is very handy when you have more information than space or if you just want a box with text in it.  It will automatically handle new lines for you, and it has some fun parameters.

==Properties==

===Public Properties===
; bool bClickText : Upon clicking on this text box, fill in ClickedString field.
; bool bNoTeletype : Dont do the teletyping effect at all.
; bool bRepeat : Should the sequence be repeated ?
; float CharDelay : This is the delay between each character. Regardless of this property characters are never displayed faster than 1 char per frame.
; string ClickedString : Filled in (if bClickText is true) when user clicks on a word.
; float EOLDelay : This is the delay to use when reaching end of a line.
; float InitialDelay : Initial delay after new content was set.
; int MaxHistory : Maximum number of rows. Only used in conjunction with NewText. 0 indicates no limit.
; string NewText : New text to add at the end of the current text.
; float RepeatDelay : This is used after all the text has been displayed and bRepeat is true.
; string Separator : Line separator to use.

===Protected Properties===
; bool bNewContent : This is set when new text content has been set for the control.; bool bStopped : Tells when the sequence has stopped animating (can be rushed by clicking ?)
; string Content : This is the content to display in 1 single string.
; int oldWidth : Last width of the display area.
; eScrollState ScrollState : What was the last action we did.
; int VisibleChars : How many chars in the last displayed line are visible.
; int VisibleLines : This is the number of visible lines.

==Enums==

===eScrollState===
; STS_None :
; STS_Initial :
; STS_Char :
; STS_EOL :
; STS_Repeat :

==Delegates==
; OnEndOfLine ( ) : 

==Methods==

===Inherited From [[Legacy:GUIComponent|GUIComponent]]===
; Timer ( ) : EOLDelay is the end of line delay, it will wait that long until display text on the next line.

===New Methods===
; EndScrolling ( ) : 
; string GetWordUnderCursor ( ) : 
; InitComponent ([[Legacy:GUIController|GUIController]] MyController, [[Legacy:GUIComponent|GUIComponent]] MyOwner) : 
; bool InternalOnClick ([[Legacy:GUIComponent|GUIComponent]] Sender) : 
; bool InternalOnKeyEvent (out byte Key, out byte State, float delta) : 
; bool InternalOnKeyType (out byte Key, optional string Unicode) : 
; Restart ( ) : 
; SetContent (string NewContent, optional string sep) :  
; bool SkipChar ( ) : 
; Stop ( ) : 

==Using It==

Besides probably declaring it as a [[Legacy:Subobject|Subobject]] in a subclass of [[Legacy:GUIPage|GUIPage]] you will need to do a couple of things to make use of it.  This GUIComponent is somewhat unique in having functions to set its variables: AddText and SetContent.

&lt;uscript&gt;
TextBox.SetContent(&quot;Hi, I'm GUI text box.&quot;);
TextBox.AddText(&quot;You may know me from such scripts as: \&quot;Mango, the Vengeance\&quot; and \&quot;Where Did My Function Go?\&quot;&quot;);
&lt;/uscript&gt;

This will give you a textbox that will display (linewrapped):

{{innerbox|Hi, I'm GUI text box.  You may know me from such scripts as: &quot;Mango, the Vengeance&quot; and &quot;Where Did My Function Go?&quot;

}}

Now, if you want to intentionally go to the next line, there's something specific for that.  The var '''Separator'''.  If you set this, it will automatically insert this between existing text and your argument in AddText().  ''Note that it will not be inserted if you do not put anything in AddText().''

'''AlphaOne:''' Is there any way to &quot;disable&quot; or stop the insertion of the separator? I would like to display a sequence of dots &quot;...&quot; displayed with a delay, one line.

'''Haral:''' Err well, if you don't set the Separator to anything, it will be &quot;&quot; and thus won't insert anything.  If all you want to do is display &quot;...&quot; on one line with a delay, you set the InitialDelay and say TextBox.SetContent(&quot;...&quot;);  Note that there is a set rate it &quot;writes&quot; the text at, I'm not sure where that's set.

'''Evolution:''' The rate at which it writes the characters out is stored in the CharDelay variable

&lt;uscript&gt;
TextBox.SetContent(&quot;Hi, I'm GUI text box.&quot;);
TextBox.Separator = Chr(13);  //Set a newline separator.
TextBox.AddText(&quot;You may know me from such scripts as: \&quot;Mango, the Vengeance\&quot; and \&quot;Where Did My Function Go?\&quot;&quot;);
&lt;/uscript&gt;

{{innerbox|Hi, I'm GUI Text box.

You may know me from such scripts as: &quot;Mango, the Vengeance&quot; and &quot;Where Did My Function Go?&quot;

}}

'''I, or somebody else, can update this a bit later with all of its class info.'''  &amp;rarr;[[Legacy:Haral|Haral]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUISlider</title>
    <id>1324</id>
    <revision>
      <id>3374</id>
      <timestamp>2005-12-03T02:41:03Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUISlider}}

This GUI component displays a slider whose value can be changed by dragging the ''slider control'' left and right.  The minimum and maximum values of the slider can be specified.

Note that when the default value for the slider is set on the control (when it's created) the minimum and maximum values are ignored.  This can lead to some funny display problems if the slider's default value is outside of the minimum and maximum values set.

==Properties ==

===Menu ===
;float MinValue: This is the minimum value of the slider.
;float MaxValue: This is the maximum value of the slider.
;float Value: This is the current value of the slider.
;String CaptionStyleName: This is the style that will be applied to the caption of the slider.  The default value is ''SliderCaption''.
;bool bIntSlider: Set this value to true to ensure the slider can only hold integer values.

==Functions ==
;function SetValue(float NewValue): This function sets the slider value to NewValue after taking into account the minimum and maximum value of the slider. Causes an OnChange event.
;function InitComponent(GUIController MyController, GUIComponent MyOwner): Initialises the component and assigns some of the delegate functions.
;function bool InternalCapturedMouseMove(float deltaX, float deltaY): ''Called when the mouse is used to move the slider control?''
;function bool InternalOnKeyEvent(out byte Key, out byte State, float delta): ''Called when the keyboard is used to move the slider control?''
;function Adjust(float amount): Adjusts the slider value by the percentage value in amount.  Use 1.0 for 100%.  The value in amount should be negative to reduce the slider value.
;function bool InternalOnClick(GUIComponent Sender): Called when the slider is released or clicked on.
;function InternalOnMousePressed(GUIComponent Sender,bool RepeatClick): Called when a mouse click down event is trapped.
;delegate string OnDrawCaption(): A [[Legacy:Delegate|delegate]] called to update the caption of the slider as the control is dragged left and right.  By default displays the value of the slider in brackets.

==Example Definition ==

&lt;uscript&gt;
defaultproperties {
  Begin Object class=GUISlider Name=FMBlueSlider
    MinValue=0
    MaxValue=255
    Value=128
    bIntSlider=true
    OnChange=ColourSliderChanged  // Called when mouse button is released after slide
    WinTop=0.72
    WinLeft=0.18
    WinWidth=0.5
    bBoundToParent=true
    bScaleToParent=true
    MenuOwner=FMConfigBackground
    Hint=&quot;Sets the colour of the fog.&quot;
  End Object
  Controls(10)=GUISlider'FMBlueSlider'
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3375</id>
      <timestamp>2003-12-04T21:28:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUISlider}}

This GUI component displays a slider whose value can be changed by dragging the ''slider control'' left and right.  The minimum and maximum values of the slider can be specified.

Note that when the default value for the slider is set on the control (when it's created) the minimum and maximum values are ignored.  This can lead to some funny display problems if the slider's default value is outside of the minimum and maximum values set.

==Properties ==

===Menu ===
;float MinValue: This is the minimum value of the slider.
;float MaxValue: This is the maximum value of the slider.
;float Value: This is the current value of the slider.
;String CaptionStyleName: This is the style that will be applied to the caption of the slider.  The default value is ''SliderCaption''.
;bool bIntSlider: Set this value to true to ensure the slider can only hold integer values.

==Functions ==
;function SetValue(float NewValue): This function sets the slider value to NewValue after taking into account the minimum and maximum value of the slider.
;function InitComponent(GUIController MyController, GUIComponent MyOwner): Initialises the component and assigns some of the delegate functions.
;function bool InternalCapturedMouseMove(float deltaX, float deltaY): ''Called when the mouse is used to move the slider control?''
;function bool InternalOnKeyEvent(out byte Key, out byte State, float delta): ''Called when the keyboard is used to move the slider control?''
;function Adjust(float amount): Adjusts the slider value by the percentage value in amount.  Use 1.0 for 100%.  The value in amount should be negative to reduce the slider value.
;function bool InternalOnClick(GUIComponent Sender): Called when the slider is released or clicked on.
;function InternalOnMousePressed(GUIComponent Sender,bool RepeatClick): Called when a mouse click down event is trapped.
;delegate string OnDrawCaption(): A [[Legacy:Delegate|delegate]] called to update the caption of the slider as the control is dragged left and right.  By default displays the value of the slider in brackets.

==Example Definition ==

&lt;uscript&gt;
defaultproperties {
  Begin Object class=GUISlider Name=FMBlueSlider
    MinValue=0
    MaxValue=255
    Value=128
    bIntSlider=true
    OnChange=ColourSliderChanged  // Called when mouse button is released after slide
    WinTop=0.72
    WinLeft=0.18
    WinWidth=0.5
    bBoundToParent=true
    bScaleToParent=true
    MenuOwner=FMConfigBackground
    Hint=&quot;Sets the colour of the fog.&quot;
  End Object
  Controls(10)=GUISlider'FMBlueSlider'
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3376</id>
      <timestamp>2004-03-13T09:18:02Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; GUISlider}}

This GUI component displays a slider whose value can be changed by dragging the ''slider control'' left and right.  The minimum and maximum values of the slider can be specified.

Note that when the default value for the slider is set on the control (when it's created) the minimum and maximum values are ignored.  This can lead to some funny display problems if the slider's default value is outside of the minimum and maximum values set.

==Properties ==

===Menu ===
;float MinValue: This is the minimum value of the slider.
;float MaxValue: This is the maximum value of the slider.
;float Value: This is the current value of the slider.
;String CaptionStyleName: This is the style that will be applied to the caption of the slider.  The default value is ''SliderCaption''.
;bool bIntSlider: Set this value to true to ensure the slider can only hold integer values.

==Functions ==
;function SetValue(float NewValue): This function sets the slider value to NewValue after taking into account the minimum and maximum value of the slider. Causes an OnChange event.
;function InitComponent(GUIController MyController, GUIComponent MyOwner): Initialises the component and assigns some of the delegate functions.
;function bool InternalCapturedMouseMove(float deltaX, float deltaY): ''Called when the mouse is used to move the slider control?''
;function bool InternalOnKeyEvent(out byte Key, out byte State, float delta): ''Called when the keyboard is used to move the slider control?''
;function Adjust(float amount): Adjusts the slider value by the percentage value in amount.  Use 1.0 for 100%.  The value in amount should be negative to reduce the slider value.
;function bool InternalOnClick(GUIComponent Sender): Called when the slider is released or clicked on.
;function InternalOnMousePressed(GUIComponent Sender,bool RepeatClick): Called when a mouse click down event is trapped.
;delegate string OnDrawCaption(): A [[Legacy:Delegate|delegate]] called to update the caption of the slider as the control is dragged left and right.  By default displays the value of the slider in brackets.

==Example Definition ==

&lt;uscript&gt;
defaultproperties {
  Begin Object class=GUISlider Name=FMBlueSlider
    MinValue=0
    MaxValue=255
    Value=128
    bIntSlider=true
    OnChange=ColourSliderChanged  // Called when mouse button is released after slide
    WinTop=0.72
    WinLeft=0.18
    WinWidth=0.5
    bBoundToParent=true
    bScaleToParent=true
    MenuOwner=FMConfigBackground
    Hint=&quot;Sets the colour of the fog.&quot;
  End Object
  Controls(10)=GUISlider'FMBlueSlider'
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIStyles</title>
    <id>1354</id>
    <revision>
      <id>3442</id>
      <timestamp>2005-12-16T19:24:09Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; GUIStyles (Package: XInterface)}}

The GUIStyle is an object that is used to describe common visible components of the interface.

==Properties==
; string KeyName : This is the name of the style used for lookup.
; EMenuRenderStyle RStyles[5] : The render styles for each state.
; Material Images[5] : This array holds 1 material for each state ( Blurry, Watched, Focused, Pressed, Disabled ).
; eImgStyle ImgStyle[5] : How should each image for each state be drawed.
; Color FontColors[5] : This array holds 1 font color for each state.
; Color ImgColors[5] : This array holds 1 image color for each state.
; [[Legacy:GUIFont|GUIFont]] Fonts[5] : Holds the fonts for each state.
; int BorderOffsets[4] : How thick is the border.
; string FontNames[5] : Holds the names of the 5 fonts to use.
; bool bRegistered : Used as Default only. Tells if Controller has this style registered.

==Methods==

===Function===
; Draw( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height ) :
; DrawText( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height, eTextAlign Align, string Text ) :

===Events===
; Initialize() :

===Delegates===
; bool OnDraw( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height ) : Can be used to draw.  Return true to skip the default draw method.
; bool OnDrawText( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height, eTextAlign Align, string Text ) : Can be used to draw.  Return true to skip the default draw method.

==Known Subclasses==
* [[Legacy:STY_IRCEntry|STY_IRCEntry]]
* [[Legacy:STY_IRCText|STY_IRCText]]
* [[Legacy:STY_LadderButton|STY_LadderButton]]
* [[Legacy:STY_NoBackground|STY_NoBackground]]
* [[Legacy:STY_Page|STY_Page]]
* [[Legacy:STY_RosterButton|STY_RosterButton]]
* [[Legacy:STY_RoundButton|STY_RoundButton]]
* [[Legacy:STY_ScrollZone|STY_ScrollZone]]
* [[Legacy:STY_ServerBrowserGrid|STY_ServerBrowserGrid]]
* [[Legacy:STY_ServerBrowserGridHeader|STY_ServerBrowserGridHeader]]
* [[Legacy:STY_SliderCaption|STY_SliderCaption]]
* [[Legacy:STY_SquareButton|STY_SquareButton]]
* [[Legacy:STY_TabButton|STY_TabButton]]
* [[Legacy:STY_TextButton|STY_TextButton]]
* [[Legacy:STY_TextLabel|STY_TextLabel]]

==Related Topics==
* [[Legacy:HUD|HUD]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3443</id>
      <timestamp>2004-03-17T06:56:59Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>Right from the source</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; GUIStyles (Package: XInterface)}}

The GUIStyle is an object that is used to describe common visible components of the interface.

==Properties==

; string KeyName : This is the name of the style used for lookup.

; EMenuRenderStyle RStyles[5] : The render styles for each state.

; Material Images[5] : This array holds 1 material for each state ( Blurry, Watched, Focused, Pressed, Disabled ).

; eImgStyle ImgStyle[5] : How should each image for each state be drawed.

; Color FontColors[5] : This array holds 1 font color for each state.

; Color ImgColors[5] : This array holds 1 image color for each state.

; [[Legacy:GUIFont|GUIFont]] Fonts[5] : Holds the fonts for each state.

; int BorderOffsets[4] : How thick is the border.

; string FontNames[5] : Holds the names of the 5 fonts to use.

; bool bRegistered : Used as Default only. Tells if Controller has this style registered.

==Methods==

===Native Function===

; Draw( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height ) :

; DrawText( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height, eTextAlign Align, string Text ) :

===Events===

; Initialize() :

===Delegates===

; bool OnDraw( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height ) : Can be used to draw.  Return true to skip the default draw method.

; bool OnDrawText( [[Legacy:Canvas|Canvas]] Canvas, eMenuState MenuState, float left, float top, float width, float height, eTextAlign Align, string Text ) : Can be used to draw.  Return true to skip the default draw method.

==Known Subclasses==

* [[Legacy:STY_IRCEntry|STY_IRCEntry]]
* [[Legacy:STY_IRCText|STY_IRCText]]
* [[Legacy:STY_LadderButton|STY_LadderButton]]
* [[Legacy:STY_NoBackground|STY_NoBackground]]
* [[Legacy:STY_Page|STY_Page]]
* [[Legacy:STY_RosterButton|STY_RosterButton]]
* [[Legacy:STY_RoundButton|STY_RoundButton]]
* [[Legacy:STY_ScrollZone|STY_ScrollZone]]
* [[Legacy:STY_ServerBrowserGrid|STY_ServerBrowserGrid]]
* [[Legacy:STY_ServerBrowserGridHeader|STY_ServerBrowserGridHeader]]
* [[Legacy:STY_SliderCaption|STY_SliderCaption]]
* [[Legacy:STY_SquareButton|STY_SquareButton]]
* [[Legacy:STY_TabButton|STY_TabButton]]
* [[Legacy:STY_TextButton|STY_TextButton]]
* [[Legacy:STY_TextLabel|STY_TextLabel]]

==Related Topics==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUITabButton</title>
    <id>28475</id>
    <revision>
      <id>40176</id>
      <timestamp>2009-11-17T10:54:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUITabControl</title>
    <id>28345</id>
    <revision>
      <id>40012</id>
      <timestamp>2009-11-14T20:16:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUITabPanel</title>
    <id>1341</id>
    <revision>
      <id>3411</id>
      <timestamp>2006-11-16T20:26:05Z</timestamp>
      <contributor>
        <ip>Smattbac</ip>
      </contributor>
      <comment>It seems that tabs wont be drawn unless they have atleast one control with bTabStop=True?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIPanel|GUIPanel]] &gt;&gt; GUITabPanel (Package: XInterface)}}

The GUITabPanel is the basic building block for the majority of the menu systems for the game.  All the tab menus in the menu system can be found as subclasses.

==Properties==
; bool bFillHeight : If true, the panel will set its height = Top - ClipY
; [[Legacy:GUITabButton|GUITabButton]] MyButton : 

==Methods==
; InitPanel ( ) : An empty method that should be subclassed for specific behavior.
; ShowPanel (bool bShow)	: Specifies whether the panel should shown, should be subclassed for specific behavior.
; bool CanShowPanel ( ) : The selection of the behavior of the tab, should be subclassed for specific behavior.
; Refresh ( ) : Refreshes the TabPanel.

==Known Subclases==
 GUITabPanel
  +-[[Legacy:Browser_Page|Browser_Page]]
  |  +-[[Legacy:Browser_IRC|Browser_IRC]]
  |  +-[[Legacy:Browser_MOTD|Browser_MOTD]]
  |  +-[[Legacy:Browser_Prefs|Browser_Prefs]]
  |  +-[[Legacy:Browser_ServerListPageBase|Browser_ServerListPageBase]]
  |     +-[[Legacy:Browser_ServerListPageFavorties|Browser_ServerListPageFavorties]]
  |     +-[[Legacy:Browser_ServerListPageLAN|Browser_ServerListPageLAN]]
  |     +-[[Legacy:Browser_ServerListPageMS|Browser_ServerListPageMS]]
  |        +-[[Legacy:Browser_ServerListPageBuddy|Browser_ServerListPageBuddy]]
  |        +-[[Legacy:Browser_ServerListPAgeMSCustom|Browser_ServerListPAgeMSCustom]]
  +-[[Legacy:IRC_Page|IRC_Page]]
  |  +-[[Legacy:IRC_Channel|IRC_Channel]]
  |  |  +-[[Legacy:IRC_Private|IRC_Private]]
  |  +-[[Legacy:IRC_System|IRC_System]]
  +-[[Legacy:Tab_AdminPlayerList|Tab_AdminPlayerList]] 
  +-[[Legacy:Tab_AudioSettings|Tab_AudioSettings]]
  +-[[Legacy:Tab_ControllSettings|Tab_ControllSettings]]
  |  +-[[Legacy:Tab_SpeechBinder|Tab_SpeechBinder]]
  +-[[Legacy:Tab_DetailSettings|Tab_DetailSettings]]
  +-[[Legacy:Tab_GameSettings|Tab_GameSettings]]
  +-[[Legacy:Tab_HudSettings|Tab_HudSettings]]
  +-[[Legacy:Tab_IAMyTab|Tab_IAMyTab]]
  +-[[Legacy:Tab_IForceSettings|Tab_IForceSettings]]
  +-[[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]]
  |  +-[[Legacy:Tab_IABombingRun|Tab_IABombingRun]]
  |  +-[[Legacy:Tab_IACaptureTheFlag|Tab_IACaptureTheFlag]]
  |  +-[[Legacy:Tab_IADeathMatch|Tab_IADeathMatch]]
  |  |  +-[[Legacy:Tab_IATeamDeathMatch|Tab_IATeamDeathMatch]]
  |  +-[[Legacy:Tab_IADoubleDomination|Tab_IADoubleDomination]]
  +-[[Legacy:Tab_InstantActionBotConfig|Tab_InstantActionBotConfig]]
  +-[[Legacy:Tab_InstantActionMain|Tab_InstantActionMain]]
  +-[[Legacy:Tab_InstantActionMapList|Tab_InstantActionMapList]]
  +-[[Legacy:Tab_InstantActionMutators|Tab_InstantActionMutators]]
  +-[[Legacy:Tab_MultiplayerHostMain|Tab_MultiplayerHostMain]]
  +-[[Legacy:Tab_MultiplayerHostServerSettings|Tab_MultiplayerHostServerSettings]]
  +-[[Legacy:Tab_NetworkSettings|Tab_NetworkSettings]]
  +-[[Legacy:Tab_PlayerSettings|Tab_PlayerSettings]]
  +-[[Legacy:Tab_ServerInfo|Tab_ServerInfo]]
  +-[[Legacy:Tab_ServerMOTD|Tab_ServerMOTD]]
  +-[[Legacy:Tab_SPPanelBase|Tab_SPPanelBase]]
  |  +-[[Legacy:Tab_SPLadderBase|Tab_SPLadderBase]]
  |  |  +-[[Legacy:Tab_SPLadderQualify|Tab_SPLadderQualify]]
  |  |  +-[[Legacy:Tab_SPLadderTeam|Tab_SPLadderTeam]]
  |  +-[[Legacy:Tab_SPProfileLoad|Tab_SPProfileLoad]]
  |  +-[[Legacy:Tab_SPProfileNew|Tab_SPProfileNew]]
  |  +-[[Legacy:Tab_SPRoster|Tab_SPRoster]]
  |  +-[[Legacy:Tab_SPTutorial|Tab_SPTutorial]]
  +-[[Legacy:Tab_VideoSettings|Tab_VideoSettings]]
  +-[[Legacy:Tab_WeaponPref|Tab_WeaponPref]]

----

'''smattbac:''' It seems that tabs wont be drawn unless they have atleast one control with bTabStop=True?

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3412</id>
      <timestamp>2003-12-04T21:15:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIPanel|GUIPanel]] &gt;&gt; GUITabPanel (Package: XInterface)}}

The GUITabPanel is the basic building block for the majority of the menu systems for the game.  All the tab menus in the menu system can be found as subclasses.

==Properties==
; bool bFillHeight : If true, the panel will set its height = Top - ClipY
; [[Legacy:GUITabButton|GUITabButton]] MyButton : 

==Methods==
; InitPanel ( ) : An empty method that should be subclassed for specific behavior.
; ShowPanel (bool bShow)	: Specifies whether the panel should shown, should be subclassed for specific behavior.
; bool CanShowPanel ( ) : The selection of the behavior of the tab, should be subclassed for specific behavior.
; Refresh ( ) : Refreshes the TabPanel.

==Known Subclases==
 GUITabPanel
  +-[[Legacy:Browser_Page|Browser_Page]]
  |  +-[[Legacy:Browser_IRC|Browser_IRC]]
  |  +-[[Legacy:Browser_MOTD|Browser_MOTD]]
  |  +-[[Legacy:Browser_Prefs|Browser_Prefs]]
  |  +-[[Legacy:Browser_ServerListPageBase|Browser_ServerListPageBase]]
  |     +-[[Legacy:Browser_ServerListPageFavorties|Browser_ServerListPageFavorties]]
  |     +-[[Legacy:Browser_ServerListPageLAN|Browser_ServerListPageLAN]]
  |     +-[[Legacy:Browser_ServerListPageMS|Browser_ServerListPageMS]]
  |        +-[[Legacy:Browser_ServerListPageBuddy|Browser_ServerListPageBuddy]]
  |        +-[[Legacy:Browser_ServerListPAgeMSCustom|Browser_ServerListPAgeMSCustom]]
  +-[[Legacy:IRC_Page|IRC_Page]]
  |  +-[[Legacy:IRC_Channel|IRC_Channel]]
  |  |  +-[[Legacy:IRC_Private|IRC_Private]]
  |  +-[[Legacy:IRC_System|IRC_System]]
  +-[[Legacy:Tab_AdminPlayerList|Tab_AdminPlayerList]] 
  +-[[Legacy:Tab_AudioSettings|Tab_AudioSettings]]
  +-[[Legacy:Tab_ControllSettings|Tab_ControllSettings]]
  |  +-[[Legacy:Tab_SpeechBinder|Tab_SpeechBinder]]
  +-[[Legacy:Tab_DetailSettings|Tab_DetailSettings]]
  +-[[Legacy:Tab_GameSettings|Tab_GameSettings]]
  +-[[Legacy:Tab_HudSettings|Tab_HudSettings]]
  +-[[Legacy:Tab_IAMyTab|Tab_IAMyTab]]
  +-[[Legacy:Tab_IForceSettings|Tab_IForceSettings]]
  +-[[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]]
  |  +-[[Legacy:Tab_IABombingRun|Tab_IABombingRun]]
  |  +-[[Legacy:Tab_IACaptureTheFlag|Tab_IACaptureTheFlag]]
  |  +-[[Legacy:Tab_IADeathMatch|Tab_IADeathMatch]]
  |  |  +-[[Legacy:Tab_IATeamDeathMatch|Tab_IATeamDeathMatch]]
  |  +-[[Legacy:Tab_IADoubleDomination|Tab_IADoubleDomination]]
  +-[[Legacy:Tab_InstantActionBotConfig|Tab_InstantActionBotConfig]]
  +-[[Legacy:Tab_InstantActionMain|Tab_InstantActionMain]]
  +-[[Legacy:Tab_InstantActionMapList|Tab_InstantActionMapList]]
  +-[[Legacy:Tab_InstantActionMutators|Tab_InstantActionMutators]]
  +-[[Legacy:Tab_MultiplayerHostMain|Tab_MultiplayerHostMain]]
  +-[[Legacy:Tab_MultiplayerHostServerSettings|Tab_MultiplayerHostServerSettings]]
  +-[[Legacy:Tab_NetworkSettings|Tab_NetworkSettings]]
  +-[[Legacy:Tab_PlayerSettings|Tab_PlayerSettings]]
  +-[[Legacy:Tab_ServerInfo|Tab_ServerInfo]]
  +-[[Legacy:Tab_ServerMOTD|Tab_ServerMOTD]]
  +-[[Legacy:Tab_SPPanelBase|Tab_SPPanelBase]]
  |  +-[[Legacy:Tab_SPLadderBase|Tab_SPLadderBase]]
  |  |  +-[[Legacy:Tab_SPLadderQualify|Tab_SPLadderQualify]]
  |  |  +-[[Legacy:Tab_SPLadderTeam|Tab_SPLadderTeam]]
  |  +-[[Legacy:Tab_SPProfileLoad|Tab_SPProfileLoad]]
  |  +-[[Legacy:Tab_SPProfileNew|Tab_SPProfileNew]]
  |  +-[[Legacy:Tab_SPRoster|Tab_SPRoster]]
  |  +-[[Legacy:Tab_SPTutorial|Tab_SPTutorial]]
  +-[[Legacy:Tab_VideoSettings|Tab_VideoSettings]]
  +-[[Legacy:Tab_WeaponPref|Tab_WeaponPref]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUITitleBar</title>
    <id>28532</id>
    <revision>
      <id>40233</id>
      <timestamp>2009-11-17T11:04:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIUserKeyBinding</title>
    <id>1326</id>
    <revision>
      <id>3379</id>
      <timestamp>2005-06-14T03:07:07Z</timestamp>
      <contributor>
        <ip>222-152-115-12.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>Fixed the default properties</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; GUIUserKeyBinding (Package: XInterface)}}

As of build 2181, allows mod authors to add their own key bindings to the standard key binder dialog.

==Usage==

# Subclass GUIUserKeyBinding.

# Add entries to the KeyData array:
# * Put the name of a section heading or a key binding in the KeyLabel structure element.
# * Set the bIsSection structure element to True if this entry is a section label and not a key binding.
# * Put the console command you want to bind in the Alias structure element.

# 
Make a MyPackage.int file with the following data in it:

&lt;pre&gt;[Public]
Object=(Name=MyPackage.MyKeyBindings,Class=Class,MetaClass=XInterface.GUIUserKeyBinding)&lt;/pre&gt;

The corresponding MyKeyBinding class:

&lt;uscript&gt;
class MyKeyBindings extends GUIUserKeyBinding;

// Warning: Don't add any extra spaces between elements in struct variable defaults!

defaultproperties
{
    KeyData[0]=(KeyLabel=&quot;Capture the Mage&quot;,bIsSection=True)
    KeyData[1]=(KeyLabel=&quot;Cast Spell&quot;,Alias=&quot;castspell&quot;)
    KeyData[2]=(KeyLabel=&quot;Activate Shield&quot;,Alias=&quot;activateshield&quot;)
}
&lt;/uscript&gt;



==Caveats==

* As of build 2199, UT2003 only supports a limited number of custom key bindings in its standard dialog.  Any key bindings going beyond that limit will be ignored.

'''BigJohn:''' I have tested this and it doesn't seem to be an issue anymore with ut2004

* Key bindings created with this method are global in UT2003.  To make per-mod key bindings (without resorting to workarounds like using a custom .ini file), you can intercept key press and release events with an [[Legacy:Interaction|Interaction]].

* Note that the sample line stated in the comment header of GUIUserKeyBinding is incorrect.&lt;pre&gt;
Object=(Class=class;MetaClass=Xinterface.GUIUserKeyBinding,Name=&lt;classname&gt;)  - WRONG!
Object=(Class=class,MetaClass=Xinterface.GUIUserKeyBinding,Name=&lt;classname&gt;)  - correct
&lt;/pre&gt;

==Related Topics ==
* [[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] &amp;ndash; a similar facility in [[Legacy:UT|UT]]
* [[Legacy:Keypress Interactions|Keypress Interactions]] &amp;ndash; how to intercept previously bound keys
* [[Legacy:InputKeyMap|InputKeyMap]] &amp;ndash; list of key mapping and default bindings
* [[Legacy:Binding Keys|Binding Keys]] &amp;ndash; ways to set up the bindings

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3380</id>
      <timestamp>2004-04-11T03:19:20Z</timestamp>
      <contributor>
        <ip>Adsl-64-175-120-75.dsl.lsan03.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:GUI|GUI]] &gt;&gt; GUIUserKeyBinding (Package: XInterface)}}

As of build 2181, allows mod authors to add their own key bindings to the standard key binder dialog.

==Usage==

# Subclass GUIUserKeyBinding.

# Add entries to the KeyData array:
# * Put the name of a section heading or a key binding in the KeyLabel structure element.
# * Set the bIsSection structure element to True if this entry is a section label and not a key binding.
# * Put the console command you want to bind in the Alias structure element.

# 
Make a MyPackage.int file with the following data in it:

&lt;pre&gt;[Public]
Object=(Name=MyPackage.MyKeyBindings,Class=Class,MetaClass=XInterface.GUIUserKeyBinding)&lt;/pre&gt;

The corresponding MyKeyBinding class:

&lt;uscript&gt;
class MyKeyBindings extends GUIUserKeyBinding;

// Warning: Don't add any extra spaces between elements in struct variable defaults!

defaultproperties
{
    KeyData[0] = (KeyLabel=&quot;Capture the Mage&quot;,bIsSection=True);
    KeyData[1] = (KeyLabel=&quot;Cast Spell&quot;,Alias=&quot;castspell&quot;);
    KeyData[2] = (KeyLabel=&quot;Activate Shield&quot;,Alias=&quot;activateshield&quot;);
}
&lt;/uscript&gt;



==Caveats==

* As of build 2199, UT2003 only supports a limited number of custom key bindings in its standard dialog.  Any key bindings going beyond that limit will be ignored.

'''BigJohn:''' I have tested this and it doesn't seem to be an issue anymore with ut2004

* Key bindings created with this method are global in UT2003.  To make per-mod key bindings (without resorting to workarounds like using a custom .ini file), you can intercept key press and release events with an [[Legacy:Interaction|Interaction]].

* Note that the sample line stated in the comment header of GUIUserKeyBinding is incorrect.&lt;pre&gt;
Object=(Class=class;MetaClass=Xinterface.GUIUserKeyBinding,Name=&lt;classname&gt;)  - WRONG!
Object=(Class=class,MetaClass=Xinterface.GUIUserKeyBinding,Name=&lt;classname&gt;)  - correct
&lt;/pre&gt;

==Related Topics ==
* [[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] &amp;ndash; a similar facility in [[Legacy:UT|UT]]
* [[Legacy:Keypress Interactions|Keypress Interactions]] &amp;ndash; how to intercept previously bound keys
* [[Legacy:InputKeyMap|InputKeyMap]] &amp;ndash; list of key mapping and default bindings
* [[Legacy:Binding Keys|Binding Keys]] &amp;ndash; ways to set up the bindings

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIVertList</title>
    <id>28846</id>
    <revision>
      <id>42773</id>
      <timestamp>2010-03-30T16:16:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GUIVertScrollZone</title>
    <id>28546</id>
    <revision>
      <id>40247</id>
      <timestamp>2009-11-17T11:06:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Game Balance</title>
    <id>1349</id>
    <revision>
      <id>3430</id>
      <timestamp>2005-12-03T04:26:09Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Game balance is something which it seems a lot of developers out there, amateur and professional alike, overemphasise.  What is game balance?  It is the level of equality in value of all choices a player (or bot) can make.  Now, game balance is important, but not in a strict way.  Should a game have any lasting enjoyment to it, the choices available to a player should amount to more than a dry technical weighing.  If the numbers going into damage, strength, or whatever you are working with are so important that they need to be perfect, then your player can logically come to only two conclusions:

# One item is superior and should be used whenever possible.  This removes all of the interest gained through variety in your game.
# Two or more items are equally good, and the choice does not matter, so the player's choices really don't mean anything.  It's pointless.

==The Problem==

How can you avoid imbalance in your game, without making it dry and boring?  Let's just say we're balancing weapons right now.  The above points become demonstratable.  You have three weapons:

One does 10 damage and can attack once a second.

One does 20 damage and can attack once in two seconds.

One does 50 damage and can attack once in four seconds.

The value becomes apparent in the simple math of damage / rate, coming out to 10, 10, and 12.5.  You can manipulate those numbers your entire life and never get around the two problems illustrated above.

==The Beginning of a Solution==

The above example not only demonstrates a problem, but a solution.  A player's choice needs to be able to make a difference.  In the above example, you might have noticed there are times when the value of the weapons changes.

If your opponent is at 30 health, using the first and then the second weapon will result in 3 seconds rather than four to kill it, despite the better rate of damage.  Likewise at 20, either the first or the second will yield half the time to kill the opponent.

I call this the beginning of a solution, however, for a reason.  These are situational advantages, and are often overemphasised just like balnace in general is.  The fact of the matter is, these choices can be mathmatically weighed and decided on bringing you right back to the original two problems.

==Where It's At==

So let's take the example into greater detail.  Let's talk about a first person shooter.  Let's say the first weapon hits so long as the victim is visible, the second is an instantfire weapon, and the third is a projectile weapon.  Now we can say:

# The weapon does 10 damage in 1 second if you can see the victim.
# The weapon does 20 damage in 2 seconds if you are aiming directly at the victim.
# The weapon does 50 damage in 4 seconds if you are aiming at the point of intersection between the victim's eventual path and your projectile's path.

Now, the picture has changed.  We're talking about conditional statements.  Thus, the previous calculated values would be multiplied by a .##% probability of the condition being true.  In this case, those numbers are impossible to calculate, but instead hinge, for the first time, on the specific player in control.  A good player in a first person shooter is someone able to make those conditions come up true for them more often, and for their opponents less.

So now weighing these options and their worth depends on your best assessment of a player's relative skill with weapons.  Hitting someone directly with an instantfire weapon is easier for most than with a projectile.

Understanding that it is these differences in skills, not the differences in power of the weapons, which creates lasting fun.  A lot of people love matches with single instant-fire weapons...  Avoiding that whole argument all together, I'll just point out a fact from this:  This is ground down to a complete lack of balance issues... and I believe it's that which makes them so popular.  Not because they're perfectly balanced, exactly, but because it's &quot;all skill.&quot;  It's a pure contest of ability, but of a smaller set of abilities.  Someone is going to win, and the only variable is skill (and ping/fps but let's not get into that.)

So that's really what balance is all about.  It's the technical balance itself, but the best arrangement of your variables to allow skill to show through the most.  The goal in any game is to win, and your game should do its best to acknowledge who played the better game.  Note that this doesn't mean an imbalanced game can let a lesser player win (never, unless the players have unequal access to items.  That kind of situation has the same issues but the consequences of a bad design are just worse.)  It means that an imbalanced game can make a lesser player appear as good as a slightly better player.

Example:  Splash damage weapons.  Say you have a simple projectile which does 40 damage to everything in the splash radius.  This is a bad weapon... why?  Because one player can be more accurate with the weapon, and do the same damage so long as he's within that radius.  One can hit the other player directly every time (if that's what he wants) and the other can just barely hit that radius back... and their aiming skills are judged equivalent by the rules of the game.  Instead you want a weapon which scales its splash damage with distance, so that it makes a better reflection of the player's performance.

==The Facts of Life==

In most games you cannot keep track of all the variables which contribute to a player's skill.  There are a '''lot''' of them.  Anything that can vary within a situation is a factor.  It's near impossible to plan for them and simply futile.  You shouldn't even care... because these are small.  Do not expect to have a perfectly balanced game, it's a nice thought, but it's just not happening.

The truth is, as stated before, inbalances in the game distort the judgement of skill.  A good game should be rigorous in its list of abilities it tests, accurate in its judgement, and at the same time favor none of them over another.  Each little detail doesn't need to be perfectly situated, because the variance in skill is by and large dispersed enough that they will not come into importance.

You might never be good at this.  Any good designer will be a good player, this is a hard fact.  To make a good game by anything other than luck you have to understand the abilities being tested because you're the one testing.  A truly good test in anything is created by an expert, and you must be an expert.  This is not to say you've got to be extremely skillful, but you have to understand the skills, which will put you at least in the upper realm of players.

----

Okay, that was the main point of this topic right up there.  I'm guessing the response would have been &quot;duh,&quot; or it went over your head.  It's really an observation of the definitions of all the things which a designer is working with.  So I'd like to move on and just address some little points.

==Chance==

Chance, randomness... it's been used a lot in games.  Of course, the reason I'm talking about it here is because of the '''misuse''' of chance.

In reality, things are not random.  This goes back to causality.  There is no little microchip in a gun which decides your shot will vary between some percentage of error from where you aim it.  We use randomness to represent systems which are effected by so many minute variables, it would be ridiculous to try and realistically implement them.  This is really what we do with computers, simulate things from life&amp;ndash;not recreate them.

Randomness, however, does NOTHING for a game's design.  Ignoring the possibility of people having oracular powers, there is nothing to do with skill in this.  In fact, this is a common misconception with one of my favorite games, poker:

In poker your goal is to make the best five card hand.  There are a lot of different varieties of poker, but which cards make the best hand and using 5 of them remains the same.  The hand heirarchy is actually determined by the probability of them occuring.  Probability plays a big part in all games of &quot;chance&quot; but it is '''not''' what poker is about.  Poker is about bets and analysing people.

If you walk up to a slot machine and play, you are pretty much an idiot unless you are cheating.  I'm sure the people around here are smart enough to know why:  You can win in the short run, but the average case is you're going to lose.  Beside oracles, which we are ignoring for this discussion, it is impossible for you to have any impact on this outcome.  This is as exciting as watching anything else in life you cannot control, and there are places you can do this without spending your own money.

Poker, however, is different.  This is for one basic fact:  There are two ways to win at poker.  One is to have the best hand.  One is to get your opponents to fold.  If it were merely the first, poker would be a pointless game where you're either just trading money around and possibly giving up a rake (money payed to the house, not the other players, on a per-hand basis.)

So the primary goal of poker, since everyone has an equal chance of having the best hand, is to deceive and read your opponents.  To make them think what you want them to think, and to avoid the same from them.  So long as your opponent does not have the best possible hand, it is possible to convince them you have a better hand.  That's what betting is all about.  It's saying &quot;I have a better hand than you do.  Think I'm lying?  Put out the money and find out.&quot;  This is why chance is not what makes poker an interesting game, most the time.  Chance does allow the better player to lose some of the time, but this is actually a good thing (for the better player) because it tricks more people into putting their money out there.  The better player wins over time.

So bringing this into other games... Chance merely makes you look at averages rather than one immediate result.  It means the better choice won't always win&amp;ndash;but it's '''always''' the better choice.  It's necessary in some games (like poker) to introduce an unknown quantity which other things can be put upon... by itself, however, it's pointless.

Do not use random variables for whatever unless you have an intelligent reason to.  It just uses up more resources.

'''Foxpaw:''' Plus random variables can't be simulated client-side either - so there's another reason. Anyways, I was going to post this in response to your comment on my developer journal page but it applies here too, so I'll compile what I was going to say there and what I was going to say here into one:

One of the neat things about Unreal Tournament (and UT2k3) is that the weapons are all inherently different - not just different in fire-rate and damage, there is more or less no two weapons that are used the same. In essense, each weapon requires a different skill or set of skills to use. This makes is very difficult to say that one weapon is &quot;better&quot; than another, though there's certainately statistical favourites. For instance, if you were to go mathematically, the &quot;best&quot; weapon is probrably the bio-rifle. (barring Instagib) It's fast firing, precise, and dishes out loads of damage. Given it's (considerably) greater damage per second, some might say it's the &quot;best&quot; weapon. However, it's still considered by many to be about the worst weapon you could have. Interestingly, some of the most preferred weapons have about the lowest &quot;stats.&quot; The shock rifle takes like 3 whole seconds to kill a person, and the rocket launcher is not much better. (it's probrably worse, if you consider the travel time of the rockets.) Anyways, I'm getting a bit off topic.

In UT, the weapons are all pretty much different enough that numerical comparisons are difficult to apply. To take an extreme example, flak cannon versus lightning gun/sniper rifle. Arguing numbers between the two would be totally senseless - it's clear that the flak cannon does a heck of a lot more damage but has a much shorter effective range. In constrast, a game like counterstrike is easy to argue numbers over - all the weapons are pretty much the same. (Then again, they basically all have about the same stopping power anyway, the weakest handgun you can get only takes like 4 shots to kill somebody ;) )

Anyways, I think that's the key thing to keeping the variety - keeping the weapons all different. Otherwise there will certainately arise a favourite, as is noticeable in UT with the enforcer/assault rifle and minigun. This is about the only case where they have two weapons that are virtually identical, only the minigun is basically better in every way. (Technically it doesn't do as much damage as the enforcer per shot, but it shoots a lot faster and is the same style of weapon)

Now then, as for weapons on spacecraft (so the above intro doesn't need to be repeated here and on my developer journal) I agree to some extent that weapons in space are a bit more limited. However, with some creativity there are some things that can make it seem like there's more options. (There isn't really, but stuff that hasn't really been done in ground based FPSs anyway) Also, you can make use of stuff that would just be considered &quot;cheap&quot; on the ground, but may take skillful flying to use in space, thus making a weapon that's too cheap to see the light of day on the ground be a real &quot;skill&quot; weapon in space. Anyways, I'll throw out a few ideas that I had:

* Fast moving projectile weapons - pretty straightforward.
* Energy draining weapons - weapons, projectile or otherwise, that prevent the target from firing or makes them lose energy or whatever. Also, they'd do some damage. The fact that the enemy can't fire back would make this more effective than a more basic weapon, but since it doesn't do that much damage it would take longer to kill an enemy, leaving more time for enemy reinforcements to arrive, or for them to get away in CTF or something. (risk vs reward, sort of)
* Basic instant hit and continuous beam type weapons.
* Area effect type weapons, IE everything near the shooter gets damaged. This would be super cheap on the ground, but in space it's probrably much more difficult to stay close to an enemy that's avoiding you, introducing some skill.
* Persistant damage weapons, like acid or something like that.
* A glue sprayer kind of thing. I was thinking kind of like how the biorifle when charged up splatters - anyways, the main chunk hits something and then if a splatter hits something else than the two things (the thing the main chunk hit and the thing the splatter hit) would be stuck together. (maybe somewhat elastically)
* A projectile that kind of &quot;zig-zags&quot; along a straight path. This would take a fair bit of skill to hit with because you would need the target to be a multiple of a certain distance to hit them with it. (IE the projectile would have to be crossing over it's center point as it approached them) Kind of hard to explain, but I'm sure you see what I mean.
* A projectile that you sort of &quot;charge up&quot; - basically holding the fire button sets a timer on it, so you'd hold the fire button for say a half a second and then release it, the projectile fires out and detonates two seconds after. Or something. Basically the flight time is dictated by the time spent holding down the fire button. THe projectile could do virtually no damage if it impacted something, but the explosion would do lots.
* Kind of like the above, only harder to do and maybe more effective - primary fire launches the projectile, which travels through things without hitting them. Alt-fire makes a sort of &quot;force cage&quot; around the projectile. The projectile would move pretty fast, so you'd have to have good timing to make the cage coalsce while the projectile was very near the target.
* A delayed-fire weapon of some kind - basically you fire the weapon, then the location and rotation of the shot are locked in (maybe the ship could launch some kind of a gun-drone or something to justify the location and rotation of the shot not following the ship that fired it) and a short time afterward the gun fires. This would require something sort of like leading the target, but maybe different. It could be a relatively easy weapon to hit with (like maybe a really fat beam or something) so would primarily serve to force the target to change course to avoid getting hit. It could also work well in concert with the glue weapon above.
* A two-part projectile.. firing drops a mine kind of thing and shoots a projectile, then alt-fire makes an instant-fire shot between the mine and the projectile. (This might be kind of hard to hit people with)
* An &quot;instant hit&quot; weapon that just creates a small explosion a certain distance ahead of the ship, with some accompanying beam effect or something to make it plausable. This would require good depth perception and range estimation ability.

Anyways, just thought I'd throw out some ideas to help you come up with weapons.

'''Haral:''' No doubt and no doubt.  Having more than one weapon that acts the same way, for the reasons I pretty much detailed already, is pointless.  I didn't really go into that as it was more on the subject of balancing what you have rather than introducing new items.

As for coming up with weapons, I don't have too much trouble with that.  A lot of &quot;different&quot; effects can be introduced, it's just hard coming up with '''simple''' variety.  I've grown to the philosophy that no single thing in a game should ever be complicated, although the end result might be.  In my mod I'm currently not too satisfied with many of the weapons I've made because they're too awkward or specialised...  I think I only really like one of them so far, and I've made 8 so far.  &amp;ndash; That is, weapons like your &quot;zig-zag&quot; ones are of a good variety, but ones that involve shooting out multiple projectiles, etc are a bit too complicated.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]

==Discussion==

'''Tarquin:''' Interesting page. Mind if I move it out to the main space, so other people can contribute?

'''Haral:''' Not at all.  Go for it.

'''Tarquin:''' Done. Need somewhere to link it from though :) Do we have a page on general mod concepts?

'''Dirk Fist:''' My view of game balance is that the game should be fun, for people of differing skill levels (within reason) and differing play styles. Basically someone can't come in and dominate unless they are SUBSTANTIALLY better. In my opinion FACE(UT) is an example of an unbalanced map. 

'''darktoad:''' Game balance for weapons is a very tricky subject. I've seen a number of approaches for handling this, here are a couple:
# '''Make specialized weapons:''' Weapons that have unique purposes force players to use weapons that are ideal for the given situation, instead of relying on a single do-it-all weapon. Examples: A weapon that freezes opponents. A weapon that makes your opponents drop all their inventory. A weapon that swaps your location with your opponent's. ''OR'' Make weapons that affect only certain attributes. Make a weapon that strips armor or one that bypasses armor, but does little damage...

# '''Balance weapons by their attributes:''' Ammo Capacity, Firing Rate, Effective Range, Time to target, Damage, Area of Effect, and Accuracy.

These all relate into a simple system of Effective Damage Over Time. When comparing weapons that just deal damage, you're balancing two tangible things: Effectiveness in hitting target and damage inflicted when the target is hit. Obviously a game with weapons that always hit and kill with one hit is not a challenging game but it is very balanced. On the other hand, a game with a weapon that kills a target in four hits compared to another weapon that kills in one hit...the balancing factors here are clear (how reliable are the weapons in hitting their target, and how long does it take to fire subsquent shots?).</text>
    </revision>
    <revision>
      <id>3431</id>
      <timestamp>2004-04-25T14:45:10Z</timestamp>
      <contributor>
        <ip>H000393203748.ne.client2.attbi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Game balance is something which it seems a lot of developers out there, amateur and professional alike, overemphasise.  What is game balance?  It is the level of equality in value of all choices a player (or bot) can make.  Now, game balance is important, but not in a strict way.  Should a game have any lasting enjoyment to it, the choices available to a player should amount to more than a dry technical weighing.  If the numbers going into damage, strength, or whatever you are working with are so important that they need to be perfect, then your player can logically come to only two conclusions:

# One item is superior and should be used whenever possible.  This removes all of the interest gained through variety in your game.
# Two or more items are equally good, and the choice does not matter, so the player's choices really don't mean anything.  It's pointless.

==The Problem==

How can you avoid imbalance in your game, without making it dry and boring?  Let's just say we're balancing weapons right now.  The above points become demonstratable.  You have three weapons:

One does 10 damage and can attack once a second.

One does 20 damage and can attack once in two seconds.

One does 50 damage and can attack once in four seconds.

The value becomes apparent in the simple math of damage / rate, coming out to 10, 10, and 12.5.  You can manipulate those numbers your entire life and never get around the two problems illustrated above.

==The Beginning of a Solution==

The above example not only demonstrates a problem, but a solution.  A player's choice needs to be able to make a difference.  In the above example, you might have noticed there are times when the value of the weapons changes.

If your opponent is at 30 health, using the first and then the second weapon will result in 3 seconds rather than four to kill it, despite the better rate of damage.  Likewise at 20, either the first or the second will yield half the time to kill the opponent.

I call this the beginning of a solution, however, for a reason.  These are situational advantages, and are often overemphasised just like balnace in general is.  The fact of the matter is, these choices can be mathmatically weighed and decided on bringing you right back to the original two problems.

==Where It's At==

So let's take the example into greater detail.  Let's talk about a first person shooter.  Let's say the first weapon hits so long as the victim is visible, the second is an instantfire weapon, and the third is a projectile weapon.  Now we can say:

# The weapon does 10 damage in 1 second if you can see the victim.
# The weapon does 20 damage in 2 seconds if you are aiming directly at the victim.
# The weapon does 50 damage in 4 seconds if you are aiming at the point of intersection between the victim's eventual path and your projectile's path.

Now, the picture has changed.  We're talking about conditional statements.  Thus, the previous calculated values would be multiplied by a .##% probability of the condition being true.  In this case, those numbers are impossible to calculate, but instead hinge, for the first time, on the specific player in control.  A good player in a first person shooter is someone able to make those conditions come up true for them more often, and for their opponents less.

So now weighing these options and their worth depends on your best assessment of a player's relative skill with weapons.  Hitting someone directly with an instantfire weapon is easier for most than with a projectile.

Understanding that it is these differences in skills, not the differences in power of the weapons, which creates lasting fun.  A lot of people love matches with single instant-fire weapons...  Avoiding that whole argument all together, I'll just point out a fact from this:  This is ground down to a complete lack of balance issues... and I believe it's that which makes them so popular.  Not because they're perfectly balanced, exactly, but because it's &quot;all skill.&quot;  It's a pure contest of ability, but of a smaller set of abilities.  Someone is going to win, and the only variable is skill (and ping/fps but let's not get into that.)

So that's really what balance is all about.  It's the technical balance itself, but the best arrangement of your variables to allow skill to show through the most.  The goal in any game is to win, and your game should do its best to acknowledge who played the better game.  Note that this doesn't mean an imbalanced game can let a lesser player win (never, unless the players have unequal access to items.  That kind of situation has the same issues but the consequences of a bad design are just worse.)  It means that an imbalanced game can make a lesser player appear as good as a slightly better player.

Example:  Splash damage weapons.  Say you have a simple projectile which does 40 damage to everything in the splash radius.  This is a bad weapon... why?  Because one player can be more accurate with the weapon, and do the same damage so long as he's within that radius.  One can hit the other player directly every time (if that's what he wants) and the other can just barely hit that radius back... and their aiming skills are judged equivalent by the rules of the game.  Instead you want a weapon which scales its splash damage with distance, so that it makes a better reflection of the player's performance.

==The Facts of Life==

In most games you cannot keep track of all the variables which contribute to a player's skill.  There are a '''lot''' of them.  Anything that can vary within a situation is a factor.  It's near impossible to plan for them and simply futile.  You shouldn't even care... because these are small.  Do not expect to have a perfectly balanced game, it's a nice thought, but it's just not happening.

The truth is, as stated before, inbalances in the game distort the judgement of skill.  A good game should be rigorous in its list of abilities it tests, accurate in its judgement, and at the same time favor none of them over another.  Each little detail doesn't need to be perfectly situated, because the variance in skill is by and large dispersed enough that they will not come into importance.

You might never be good at this.  Any good designer will be a good player, this is a hard fact.  To make a good game by anything other than luck you have to understand the abilities being tested because you're the one testing.  A truly good test in anything is created by an expert, and you must be an expert.  This is not to say you've got to be extremely skillful, but you have to understand the skills, which will put you at least in the upper realm of players.

----

Okay, that was the main point of this topic right up there.  I'm guessing the response would have been &quot;duh,&quot; or it went over your head.  It's really an observation of the definitions of all the things which a designer is working with.  So I'd like to move on and just address some little points.

==Chance==

Chance, randomness... it's been used a lot in games.  Of course, the reason I'm talking about it here is because of the '''misuse''' of chance.

In reality, things are not random.  This goes back to causality.  There is no little microchip in a gun which decides your shot will vary between some percentage of error from where you aim it.  We use randomness to represent systems which are effected by so many minute variables, it would be ridiculous to try and realistically implement them.  This is really what we do with computers, simulate things from life&amp;ndash;not recreate them.

Randomness, however, does NOTHING for a game's design.  Ignoring the possibility of people having oracular powers, there is nothing to do with skill in this.  In fact, this is a common misconception with one of my favorite games, poker:

In poker your goal is to make the best five card hand.  There are a lot of different varieties of poker, but which cards make the best hand and using 5 of them remains the same.  The hand heirarchy is actually determined by the probability of them occuring.  Probability plays a big part in all games of &quot;chance&quot; but it is '''not''' what poker is about.  Poker is about bets and analysing people.

If you walk up to a slot machine and play, you are pretty much an idiot unless you are cheating.  I'm sure the people around here are smart enough to know why:  You can win in the short run, but the average case is you're going to lose.  Beside oracles, which we are ignoring for this discussion, it is impossible for you to have any impact on this outcome.  This is as exciting as watching anything else in life you cannot control, and there are places you can do this without spending your own money.

Poker, however, is different.  This is for one basic fact:  There are two ways to win at poker.  One is to have the best hand.  One is to get your opponents to fold.  If it were merely the first, poker would be a pointless game where you're either just trading money around and possibly giving up a rake (money payed to the house, not the other players, on a per-hand basis.)

So the primary goal of poker, since everyone has an equal chance of having the best hand, is to deceive and read your opponents.  To make them think what you want them to think, and to avoid the same from them.  So long as your opponent does not have the best possible hand, it is possible to convince them you have a better hand.  That's what betting is all about.  It's saying &quot;I have a better hand than you do.  Think I'm lying?  Put out the money and find out.&quot;  This is why chance is not what makes poker an interesting game, most the time.  Chance does allow the better player to lose some of the time, but this is actually a good thing (for the better player) because it tricks more people into putting their money out there.  The better player wins over time.

So bringing this into other games... Chance merely makes you look at averages rather than one immediate result.  It means the better choice won't always win&amp;ndash;but it's '''always''' the better choice.  It's necessary in some games (like poker) to introduce an unknown quantity which other things can be put upon... by itself, however, it's pointless.

Do not use random variables for whatever unless you have an intelligent reason to.  It just uses up more resources.

'''Foxpaw:''' Plus random variables can't be simulated client-side either - so there's another reason. Anyways, I was going to post this in response to your comment on my developer journal page but it applies here too, so I'll compile what I was going to say there and what I was going to say here into one:

One of the neat things about Unreal Tournament (and UT2k3) is that the weapons are all inherently different - not just different in fire-rate and damage, there is more or less no two weapons that are used the same. In essense, each weapon requires a different skill or set of skills to use. This makes is very difficult to say that one weapon is &quot;better&quot; than another, though there's certainately statistical favourites. For instance, if you were to go mathematically, the &quot;best&quot; weapon is probrably the bio-rifle. (barring Instagib) It's fast firing, precise, and dishes out loads of damage. Given it's (considerably) greater damage per second, some might say it's the &quot;best&quot; weapon. However, it's still considered by many to be about the worst weapon you could have. Interestingly, some of the most preferred weapons have about the lowest &quot;stats.&quot; The shock rifle takes like 3 whole seconds to kill a person, and the rocket launcher is not much better. (it's probrably worse, if you consider the travel time of the rockets.) Anyways, I'm getting a bit off topic.

In UT, the weapons are all pretty much different enough that numerical comparisons are difficult to apply. To take an extreme example, flak cannon versus lightning gun/sniper rifle. Arguing numbers between the two would be totally senseless - it's clear that the flak cannon does a heck of a lot more damage but has a much shorter effective range. In constrast, a game like counterstrike is easy to argue numbers over - all the weapons are pretty much the same. (Then again, they basically all have about the same stopping power anyway, the weakest handgun you can get only takes like 4 shots to kill somebody ;) )

Anyways, I think that's the key thing to keeping the variety - keeping the weapons all different. Otherwise there will certainately arise a favourite, as is noticeable in UT with the enforcer/assault rifle and minigun. This is about the only case where they have two weapons that are virtually identical, only the minigun is basically better in every way. (Technically it doesn't do as much damage as the enforcer per shot, but it shoots a lot faster and is the same style of weapon)

Now then, as for weapons on spacecraft (so the above intro doesn't need to be repeated here and on my developer journal) I agree to some extent that weapons in space are a bit more limited. However, with some creativity there are some things that can make it seem like there's more options. (There isn't really, but stuff that hasn't really been done in ground based FPSs anyway) Also, you can make use of stuff that would just be considered &quot;cheap&quot; on the ground, but may take skillful flying to use in space, thus making a weapon that's too cheap to see the light of day on the ground be a real &quot;skill&quot; weapon in space. Anyways, I'll throw out a few ideas that I had:

* Fast moving projectile weapons - pretty straightforward.
* Energy draining weapons - weapons, projectile or otherwise, that prevent the target from firing or makes them lose energy or whatever. Also, they'd do some damage. The fact that the enemy can't fire back would make this more effective than a more basic weapon, but since it doesn't do that much damage it would take longer to kill an enemy, leaving more time for enemy reinforcements to arrive, or for them to get away in CTF or something. (risk vs reward, sort of)
* Basic instant hit and continuous beam type weapons.
* Area effect type weapons, IE everything near the shooter gets damaged. This would be super cheap on the ground, but in space it's probrably much more difficult to stay close to an enemy that's avoiding you, introducing some skill.
* Persistant damage weapons, like acid or something like that.
* A glue sprayer kind of thing. I was thinking kind of like how the biorifle when charged up splatters - anyways, the main chunk hits something and then if a splatter hits something else than the two things (the thing the main chunk hit and the thing the splatter hit) would be stuck together. (maybe somewhat elastically)
* A projectile that kind of &quot;zig-zags&quot; along a straight path. This would take a fair bit of skill to hit with because you would need the target to be a multiple of a certain distance to hit them with it. (IE the projectile would have to be crossing over it's center point as it approached them) Kind of hard to explain, but I'm sure you see what I mean.
* A projectile that you sort of &quot;charge up&quot; - basically holding the fire button sets a timer on it, so you'd hold the fire button for say a half a second and then release it, the projectile fires out and detonates two seconds after. Or something. Basically the flight time is dictated by the time spent holding down the fire button. THe projectile could do virtually no damage if it impacted something, but the explosion would do lots.
* Kind of like the above, only harder to do and maybe more effective - primary fire launches the projectile, which travels through things without hitting them. Alt-fire makes a sort of &quot;force cage&quot; around the projectile. The projectile would move pretty fast, so you'd have to have good timing to make the cage coalsce while the projectile was very near the target.
* A delayed-fire weapon of some kind - basically you fire the weapon, then the location and rotation of the shot are locked in (maybe the ship could launch some kind of a gun-drone or something to justify the location and rotation of the shot not following the ship that fired it) and a short time afterward the gun fires. This would require something sort of like leading the target, but maybe different. It could be a relatively easy weapon to hit with (like maybe a really fat beam or something) so would primarily serve to force the target to change course to avoid getting hit. It could also work well in concert with the glue weapon above.
* A two-part projectile.. firing drops a mine kind of thing and shoots a projectile, then alt-fire makes an instant-fire shot between the mine and the projectile. (This might be kind of hard to hit people with)
* An &quot;instant hit&quot; weapon that just creates a small explosion a certain distance ahead of the ship, with some accompanying beam effect or something to make it plausable. This would require good depth perception and range estimation ability.

Anyways, just thought I'd throw out some ideas to help you come up with weapons.

'''Haral:''' No doubt and no doubt.  Having more than one weapon that acts the same way, for the reasons I pretty much detailed already, is pointless.  I didn't really go into that as it was more on the subject of balancing what you have rather than introducing new items.

As for coming up with weapons, I don't have too much trouble with that.  A lot of &quot;different&quot; effects can be introduced, it's just hard coming up with '''simple''' variety.  I've grown to the philosophy that no single thing in a game should ever be complicated, although the end result might be.  In my mod I'm currently not too satisfied with many of the weapons I've made because they're too awkward or specialised...  I think I only really like one of them so far, and I've made 8 so far.  &amp;ndash; That is, weapons like your &quot;zig-zag&quot; ones are of a good variety, but ones that involve shooting out multiple projectiles, etc are a bit too complicated.

----

'''Tarquin:''' Interesting page. Mind if I move it out to the main space, so other people can contribute?

'''Haral:''' Not at all.  Go for it.

'''Tarquin:''' Done. Need somewhere to link it from though :) Do we have a page on general mod concepts?

'''Dirk Fist:''' My view of game balance is that the game should be fun, for people of differing skill levels (within reason) and differing play styles. Basically someone can't come in and dominate unless they are SUBSTANTIALLY better. In my opinion FACE(UT) is an example of an unbalanced map. 

'''darktoad:''' Game balance for weapons is a very tricky subject. I've seen a number of approaches for handling this, here are a couple:
# '''Make specialized weapons:''' Weapons that have unique purposes force players to use weapons that are ideal for the given situation, instead of relying on a single do-it-all weapon. Examples: A weapon that freezes opponents. A weapon that makes your opponents drop all their inventory. A weapon that swaps your location with your opponent's. 

# '''Balance weapons by their attributes:''' Ammo Capacity, Firing Rate, Effective Range, Time to target, Damage, Area of Effect, and Accuracy.

These all relate into a simple system of Effective Damage Over Time. When comparing weapons that just deal damage, you're balancing two tangible things: Effectiveness in hitting target and damage inflicted when the target is hit. Obviously a game with weapons that always hit and kill with one hit is not a challenging game but it is very balanced. On the other hand, a game with a weapon that kills a target in four hits compared to another weapon that kills in one hit...the balancing factors here are clear (how reliable are the weapons in hitting their target, and how long does it take to fire subsquent shots?).</text>
    </revision>
    <revision>
      <id>3432</id>
      <timestamp>2004-04-25T15:20:20Z</timestamp>
      <contributor>
        <ip>H000393203748.ne.client2.attbi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Game balance is something which it seems a lot of developers out there, amateur and professional alike, overemphasise.  What is game balance?  It is the level of equality in value of all choices a player (or bot) can make.  Now, game balance is important, but not in a strict way.  Should a game have any lasting enjoyment to it, the choices available to a player should amount to more than a dry technical weighing.  If the numbers going into damage, strength, or whatever you are working with are so important that they need to be perfect, then your player can logically come to only two conclusions:

# One item is superior and should be used whenever possible.  This removes all of the interest gained through variety in your game.
# Two or more items are equally good, and the choice does not matter, so the player's choices really don't mean anything.  It's pointless.

==The Problem==

How can you avoid imbalance in your game, without making it dry and boring?  Let's just say we're balancing weapons right now.  The above points become demonstratable.  You have three weapons:

One does 10 damage and can attack once a second.

One does 20 damage and can attack once in two seconds.

One does 50 damage and can attack once in four seconds.

The value becomes apparent in the simple math of damage / rate, coming out to 10, 10, and 12.5.  You can manipulate those numbers your entire life and never get around the two problems illustrated above.

==The Beginning of a Solution==

The above example not only demonstrates a problem, but a solution.  A player's choice needs to be able to make a difference.  In the above example, you might have noticed there are times when the value of the weapons changes.

If your opponent is at 30 health, using the first and then the second weapon will result in 3 seconds rather than four to kill it, despite the better rate of damage.  Likewise at 20, either the first or the second will yield half the time to kill the opponent.

I call this the beginning of a solution, however, for a reason.  These are situational advantages, and are often overemphasised just like balnace in general is.  The fact of the matter is, these choices can be mathmatically weighed and decided on bringing you right back to the original two problems.

==Where It's At==

So let's take the example into greater detail.  Let's talk about a first person shooter.  Let's say the first weapon hits so long as the victim is visible, the second is an instantfire weapon, and the third is a projectile weapon.  Now we can say:

# The weapon does 10 damage in 1 second if you can see the victim.
# The weapon does 20 damage in 2 seconds if you are aiming directly at the victim.
# The weapon does 50 damage in 4 seconds if you are aiming at the point of intersection between the victim's eventual path and your projectile's path.

Now, the picture has changed.  We're talking about conditional statements.  Thus, the previous calculated values would be multiplied by a .##% probability of the condition being true.  In this case, those numbers are impossible to calculate, but instead hinge, for the first time, on the specific player in control.  A good player in a first person shooter is someone able to make those conditions come up true for them more often, and for their opponents less.

So now weighing these options and their worth depends on your best assessment of a player's relative skill with weapons.  Hitting someone directly with an instantfire weapon is easier for most than with a projectile.

Understanding that it is these differences in skills, not the differences in power of the weapons, which creates lasting fun.  A lot of people love matches with single instant-fire weapons...  Avoiding that whole argument all together, I'll just point out a fact from this:  This is ground down to a complete lack of balance issues... and I believe it's that which makes them so popular.  Not because they're perfectly balanced, exactly, but because it's &quot;all skill.&quot;  It's a pure contest of ability, but of a smaller set of abilities.  Someone is going to win, and the only variable is skill (and ping/fps but let's not get into that.)

So that's really what balance is all about.  It's the technical balance itself, but the best arrangement of your variables to allow skill to show through the most.  The goal in any game is to win, and your game should do its best to acknowledge who played the better game.  Note that this doesn't mean an imbalanced game can let a lesser player win (never, unless the players have unequal access to items.  That kind of situation has the same issues but the consequences of a bad design are just worse.)  It means that an imbalanced game can make a lesser player appear as good as a slightly better player.

Example:  Splash damage weapons.  Say you have a simple projectile which does 40 damage to everything in the splash radius.  This is a bad weapon... why?  Because one player can be more accurate with the weapon, and do the same damage so long as he's within that radius.  One can hit the other player directly every time (if that's what he wants) and the other can just barely hit that radius back... and their aiming skills are judged equivalent by the rules of the game.  Instead you want a weapon which scales its splash damage with distance, so that it makes a better reflection of the player's performance.

==The Facts of Life==

In most games you cannot keep track of all the variables which contribute to a player's skill.  There are a '''lot''' of them.  Anything that can vary within a situation is a factor.  It's near impossible to plan for them and simply futile.  You shouldn't even care... because these are small.  Do not expect to have a perfectly balanced game, it's a nice thought, but it's just not happening.

The truth is, as stated before, inbalances in the game distort the judgement of skill.  A good game should be rigorous in its list of abilities it tests, accurate in its judgement, and at the same time favor none of them over another.  Each little detail doesn't need to be perfectly situated, because the variance in skill is by and large dispersed enough that they will not come into importance.

You might never be good at this.  Any good designer will be a good player, this is a hard fact.  To make a good game by anything other than luck you have to understand the abilities being tested because you're the one testing.  A truly good test in anything is created by an expert, and you must be an expert.  This is not to say you've got to be extremely skillful, but you have to understand the skills, which will put you at least in the upper realm of players.

----

Okay, that was the main point of this topic right up there.  I'm guessing the response would have been &quot;duh,&quot; or it went over your head.  It's really an observation of the definitions of all the things which a designer is working with.  So I'd like to move on and just address some little points.

==Chance==

Chance, randomness... it's been used a lot in games.  Of course, the reason I'm talking about it here is because of the '''misuse''' of chance.

In reality, things are not random.  This goes back to causality.  There is no little microchip in a gun which decides your shot will vary between some percentage of error from where you aim it.  We use randomness to represent systems which are effected by so many minute variables, it would be ridiculous to try and realistically implement them.  This is really what we do with computers, simulate things from life&amp;ndash;not recreate them.

Randomness, however, does NOTHING for a game's design.  Ignoring the possibility of people having oracular powers, there is nothing to do with skill in this.  In fact, this is a common misconception with one of my favorite games, poker:

In poker your goal is to make the best five card hand.  There are a lot of different varieties of poker, but which cards make the best hand and using 5 of them remains the same.  The hand heirarchy is actually determined by the probability of them occuring.  Probability plays a big part in all games of &quot;chance&quot; but it is '''not''' what poker is about.  Poker is about bets and analysing people.

If you walk up to a slot machine and play, you are pretty much an idiot unless you are cheating.  I'm sure the people around here are smart enough to know why:  You can win in the short run, but the average case is you're going to lose.  Beside oracles, which we are ignoring for this discussion, it is impossible for you to have any impact on this outcome.  This is as exciting as watching anything else in life you cannot control, and there are places you can do this without spending your own money.

Poker, however, is different.  This is for one basic fact:  There are two ways to win at poker.  One is to have the best hand.  One is to get your opponents to fold.  If it were merely the first, poker would be a pointless game where you're either just trading money around and possibly giving up a rake (money payed to the house, not the other players, on a per-hand basis.)

So the primary goal of poker, since everyone has an equal chance of having the best hand, is to deceive and read your opponents.  To make them think what you want them to think, and to avoid the same from them.  So long as your opponent does not have the best possible hand, it is possible to convince them you have a better hand.  That's what betting is all about.  It's saying &quot;I have a better hand than you do.  Think I'm lying?  Put out the money and find out.&quot;  This is why chance is not what makes poker an interesting game, most the time.  Chance does allow the better player to lose some of the time, but this is actually a good thing (for the better player) because it tricks more people into putting their money out there.  The better player wins over time.

So bringing this into other games... Chance merely makes you look at averages rather than one immediate result.  It means the better choice won't always win&amp;ndash;but it's '''always''' the better choice.  It's necessary in some games (like poker) to introduce an unknown quantity which other things can be put upon... by itself, however, it's pointless.

Do not use random variables for whatever unless you have an intelligent reason to.  It just uses up more resources.

'''Foxpaw:''' Plus random variables can't be simulated client-side either - so there's another reason. Anyways, I was going to post this in response to your comment on my developer journal page but it applies here too, so I'll compile what I was going to say there and what I was going to say here into one:

One of the neat things about Unreal Tournament (and UT2k3) is that the weapons are all inherently different - not just different in fire-rate and damage, there is more or less no two weapons that are used the same. In essense, each weapon requires a different skill or set of skills to use. This makes is very difficult to say that one weapon is &quot;better&quot; than another, though there's certainately statistical favourites. For instance, if you were to go mathematically, the &quot;best&quot; weapon is probrably the bio-rifle. (barring Instagib) It's fast firing, precise, and dishes out loads of damage. Given it's (considerably) greater damage per second, some might say it's the &quot;best&quot; weapon. However, it's still considered by many to be about the worst weapon you could have. Interestingly, some of the most preferred weapons have about the lowest &quot;stats.&quot; The shock rifle takes like 3 whole seconds to kill a person, and the rocket launcher is not much better. (it's probrably worse, if you consider the travel time of the rockets.) Anyways, I'm getting a bit off topic.

In UT, the weapons are all pretty much different enough that numerical comparisons are difficult to apply. To take an extreme example, flak cannon versus lightning gun/sniper rifle. Arguing numbers between the two would be totally senseless - it's clear that the flak cannon does a heck of a lot more damage but has a much shorter effective range. In constrast, a game like counterstrike is easy to argue numbers over - all the weapons are pretty much the same. (Then again, they basically all have about the same stopping power anyway, the weakest handgun you can get only takes like 4 shots to kill somebody ;) )

Anyways, I think that's the key thing to keeping the variety - keeping the weapons all different. Otherwise there will certainately arise a favourite, as is noticeable in UT with the enforcer/assault rifle and minigun. This is about the only case where they have two weapons that are virtually identical, only the minigun is basically better in every way. (Technically it doesn't do as much damage as the enforcer per shot, but it shoots a lot faster and is the same style of weapon)

Now then, as for weapons on spacecraft (so the above intro doesn't need to be repeated here and on my developer journal) I agree to some extent that weapons in space are a bit more limited. However, with some creativity there are some things that can make it seem like there's more options. (There isn't really, but stuff that hasn't really been done in ground based FPSs anyway) Also, you can make use of stuff that would just be considered &quot;cheap&quot; on the ground, but may take skillful flying to use in space, thus making a weapon that's too cheap to see the light of day on the ground be a real &quot;skill&quot; weapon in space. Anyways, I'll throw out a few ideas that I had:

* Fast moving projectile weapons - pretty straightforward.
* Energy draining weapons - weapons, projectile or otherwise, that prevent the target from firing or makes them lose energy or whatever. Also, they'd do some damage. The fact that the enemy can't fire back would make this more effective than a more basic weapon, but since it doesn't do that much damage it would take longer to kill an enemy, leaving more time for enemy reinforcements to arrive, or for them to get away in CTF or something. (risk vs reward, sort of)
* Basic instant hit and continuous beam type weapons.
* Area effect type weapons, IE everything near the shooter gets damaged. This would be super cheap on the ground, but in space it's probrably much more difficult to stay close to an enemy that's avoiding you, introducing some skill.
* Persistant damage weapons, like acid or something like that.
* A glue sprayer kind of thing. I was thinking kind of like how the biorifle when charged up splatters - anyways, the main chunk hits something and then if a splatter hits something else than the two things (the thing the main chunk hit and the thing the splatter hit) would be stuck together. (maybe somewhat elastically)
* A projectile that kind of &quot;zig-zags&quot; along a straight path. This would take a fair bit of skill to hit with because you would need the target to be a multiple of a certain distance to hit them with it. (IE the projectile would have to be crossing over it's center point as it approached them) Kind of hard to explain, but I'm sure you see what I mean.
* A projectile that you sort of &quot;charge up&quot; - basically holding the fire button sets a timer on it, so you'd hold the fire button for say a half a second and then release it, the projectile fires out and detonates two seconds after. Or something. Basically the flight time is dictated by the time spent holding down the fire button. THe projectile could do virtually no damage if it impacted something, but the explosion would do lots.
* Kind of like the above, only harder to do and maybe more effective - primary fire launches the projectile, which travels through things without hitting them. Alt-fire makes a sort of &quot;force cage&quot; around the projectile. The projectile would move pretty fast, so you'd have to have good timing to make the cage coalsce while the projectile was very near the target.
* A delayed-fire weapon of some kind - basically you fire the weapon, then the location and rotation of the shot are locked in (maybe the ship could launch some kind of a gun-drone or something to justify the location and rotation of the shot not following the ship that fired it) and a short time afterward the gun fires. This would require something sort of like leading the target, but maybe different. It could be a relatively easy weapon to hit with (like maybe a really fat beam or something) so would primarily serve to force the target to change course to avoid getting hit. It could also work well in concert with the glue weapon above.
* A two-part projectile.. firing drops a mine kind of thing and shoots a projectile, then alt-fire makes an instant-fire shot between the mine and the projectile. (This might be kind of hard to hit people with)
* An &quot;instant hit&quot; weapon that just creates a small explosion a certain distance ahead of the ship, with some accompanying beam effect or something to make it plausable. This would require good depth perception and range estimation ability.

Anyways, just thought I'd throw out some ideas to help you come up with weapons.

'''Haral:''' No doubt and no doubt.  Having more than one weapon that acts the same way, for the reasons I pretty much detailed already, is pointless.  I didn't really go into that as it was more on the subject of balancing what you have rather than introducing new items.

As for coming up with weapons, I don't have too much trouble with that.  A lot of &quot;different&quot; effects can be introduced, it's just hard coming up with '''simple''' variety.  I've grown to the philosophy that no single thing in a game should ever be complicated, although the end result might be.  In my mod I'm currently not too satisfied with many of the weapons I've made because they're too awkward or specialised...  I think I only really like one of them so far, and I've made 8 so far.  &amp;ndash; That is, weapons like your &quot;zig-zag&quot; ones are of a good variety, but ones that involve shooting out multiple projectiles, etc are a bit too complicated.

----

'''Tarquin:''' Interesting page. Mind if I move it out to the main space, so other people can contribute?

'''Haral:''' Not at all.  Go for it.

'''Tarquin:''' Done. Need somewhere to link it from though :) Do we have a page on general mod concepts?

'''Dirk Fist:''' My view of game balance is that the game should be fun, for people of differing skill levels (within reason) and differing play styles. Basically someone can't come in and dominate unless they are SUBSTANTIALLY better. In my opinion FACE(UT) is an example of an unbalanced map. 

'''darktoad:''' Game balance for weapons is a very tricky subject. I've seen a number of approaches for handling this, here are a couple:
# '''Make specialized weapons:''' Weapons that have unique purposes force players to use weapons that are ideal for the given situation, instead of relying on a single do-it-all weapon. Examples: A weapon that freezes opponents. A weapon that makes your opponents drop all their inventory. A weapon that swaps your location with your opponent's. ''OR'' Make weapons that affect only certain attributes. Make a weapon that strips armor or one that bypasses armor, but does little damage...

# '''Balance weapons by their attributes:''' Ammo Capacity, Firing Rate, Effective Range, Time to target, Damage, Area of Effect, and Accuracy.

These all relate into a simple system of Effective Damage Over Time. When comparing weapons that just deal damage, you're balancing two tangible things: Effectiveness in hitting target and damage inflicted when the target is hit. Obviously a game with weapons that always hit and kill with one hit is not a challenging game but it is very balanced. On the other hand, a game with a weapon that kills a target in four hits compared to another weapon that kills in one hit...the balancing factors here are clear (how reliable are the weapons in hitting their target, and how long does it take to fire subsquent shots?).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Game Event Flow</title>
    <id>1330</id>
    <revision>
      <id>3387</id>
      <timestamp>2005-12-18T00:22:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

The flow of game events is the sequence of actions taken during the game.  Knowing the Game Event Flow allows programmers to properly manage modifications to the engine or it's components.

==About this page==

This is going to be the home page for documentation on how the UnrealScript classes get called in the VM from the native engine code.  It will probably always be incomplete.  But it should provide a good starting point for those who are trying to learn &quot;what gets called when&quot;.

There are three objectives here:
# Define important game events
# Document UScript class entry points
# Create flowcharts for important game event cycles

First, we'll try to define the set of &quot;important&quot; game events, such as game start, map change, player spawn, etc.  These are not necessarily &quot;events&quot; in the UScript sense, but they are often related.  These would simply be definitions of terms for reference in the other areas here.

Second, each of the methods in any classes (or derived classes) that are called directly by the engine would be documented on a per-class basis. This is a reference-style section, so you can look at a class and see what types of game events cause method calls for this class.

Note:  Events should be documented in the &quot;least derived class&quot; for which they are relevant.  Thus, events that are really designed for the UnrealPawn class should be documented there, not in Actor, nor in xPawn. This is a judgment call, but we should try to keep it as clear and intuitive as possible.

Third, something that I think would help tremendously in the learning process would be graphical flowcharts that show &quot;game cycles&quot; and how they work.  So, for example, what happens when a player joins a game, or a projectile is fired? There are a number of key methods (listed in the above section) that are called, in a very specific order.

We don't need to get down to the microscopic source-level, as that would be redundant with reading the sources.  But a high-level view of important processes in the game will be very useful.

==Status==

Starting to get the sub-pages filled out.  Please take a look at the notes in [[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]] and offer feedback if you think this is heading in the right direction, or is too redundant with other areas of the Wiki.

-Laz-

==How to Contribute==

If you want to contribute to this area, please add your name below and simply add your content to the pages.  Please be careful about content, and if you believe someone else's information is wrong, please make sure to resolve it with them first before changing it.

If you don't want to deal with the Wiki directly, feel free to email any information or content to me and I will add it.

Lazarus (lazarus @ iforcemod.com)

==Contributors==

Lazarus

==Related Topics==
* [[Legacy:Game Event Glossary|Game Event Glossary]]
* [[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]]
* [[Legacy:Flowcharts|Flowcharts]]
* [[Legacy:Native Coding|Native Coding]]
* [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]]

==Discussion==

'''CH3Z:''' Nice. This will be very usefull. Good work so far, Laz. =)

'''Tarquin:''' This needs to be properly tied in with [[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]]

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3388</id>
      <timestamp>2004-05-05T19:49:14Z</timestamp>
      <contributor>
        <ip>LuserSPAZ</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

(To be written.)

==Areas==
*[[Legacy:Game Event Glossary|Game Event Glossary]]
*[[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]]
*[[Legacy:Flowcharts|Flowcharts]]

==About this page==

This is going to be the home page for documentation on how the UnrealScript classes get called in the VM from the native engine code.  It will probably always be incomplete.  But it should provide a good starting point for those who are trying to learn &quot;what gets called when&quot;.

There are three objectives here:
# Define important game events
# Document UScript class entry points
# Create flowcharts for important game event cycles

First, we'll try to define the set of &quot;important&quot; game events, such as game start, map change, player spawn, etc.  These are not necessarily &quot;events&quot; in the UScript sense, but they are often related.  These would simply be definitions of terms for reference in the other areas here.

Second, each of the methods in any classes (or derived classes) that are called directly by the engine would be documented on a per-class basis. This is a reference-style section, so you can look at a class and see what types of game events cause method calls for this class.

Note:  Events should be documented in the &quot;least derived class&quot; for which they are relevant.  Thus, events that are really designed for the UnrealPawn class should be documented there, not in Actor, nor in xPawn. This is a judgment call, but we should try to keep it as clear and intuitive as possible.

Third, something that I think would help tremendously in the learning process would be graphical flowcharts that show &quot;game cycles&quot; and how they work.  So, for example, what happens when a player joins a game, or a projectile is fired? There are a number of key methods (listed in the above section) that are called, in a very specific order.

We don't need to get down to the microscopic source-level, as that would be redundant with reading the sources.  But a high-level view of important processes in the game will be very useful.

==Status==

Starting to get the sub-pages filled out.  Please take a look at the notes in [[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]] and offer feedback if you think this is heading in the right direction, or is too redundant with other areas of the Wiki.

-Laz-

==How to Contribute==

If you want to contribute to this area, please add your name below and simply add your content to the pages.  Please be careful about content, and if you believe someone else's information is wrong, please make sure to resolve it with them first before changing it.

If you don't want to deal with the Wiki directly, feel free to email any information or content to me and I will add it.

Lazarus (lazarus @ iforcemod.com)

==Contributors==

Lazarus

==Related Topics==
* [[Legacy:Native Coding|Native Coding]]
* [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]]

==Comments?==

'''CH3Z:''' Nice. This will be very usefull. Good work so far, Laz. =)</text>
    </revision>
    <revision>
      <id>3389</id>
      <timestamp>2005-11-13T17:02:31Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

(To be written.)

==Areas==
*[[Legacy:Game Event Glossary|Game Event Glossary]]
*[[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]]
*[[Legacy:Flowcharts|Flowcharts]]

==About this page==

This is going to be the home page for documentation on how the UnrealScript classes get called in the VM from the native engine code.  It will probably always be incomplete.  But it should provide a good starting point for those who are trying to learn &quot;what gets called when&quot;.

There are three objectives here:
# Define important game events
# Document UScript class entry points
# Create flowcharts for important game event cycles

First, we'll try to define the set of &quot;important&quot; game events, such as game start, map change, player spawn, etc.  These are not necessarily &quot;events&quot; in the UScript sense, but they are often related.  These would simply be definitions of terms for reference in the other areas here.

Second, each of the methods in any classes (or derived classes) that are called directly by the engine would be documented on a per-class basis. This is a reference-style section, so you can look at a class and see what types of game events cause method calls for this class.

Note:  Events should be documented in the &quot;least derived class&quot; for which they are relevant.  Thus, events that are really designed for the UnrealPawn class should be documented there, not in Actor, nor in xPawn. This is a judgment call, but we should try to keep it as clear and intuitive as possible.

Third, something that I think would help tremendously in the learning process would be graphical flowcharts that show &quot;game cycles&quot; and how they work.  So, for example, what happens when a player joins a game, or a projectile is fired? There are a number of key methods (listed in the above section) that are called, in a very specific order.

We don't need to get down to the microscopic source-level, as that would be redundant with reading the sources.  But a high-level view of important processes in the game will be very useful.

==Status==

Starting to get the sub-pages filled out.  Please take a look at the notes in [[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]] and offer feedback if you think this is heading in the right direction, or is too redundant with other areas of the Wiki.

-Laz-

==How to Contribute==

If you want to contribute to this area, please add your name below and simply add your content to the pages.  Please be careful about content, and if you believe someone else's information is wrong, please make sure to resolve it with them first before changing it.

If you don't want to deal with the Wiki directly, feel free to email any information or content to me and I will add it.

Lazarus (lazarus @ iforcemod.com)

==Contributors==

Lazarus

==Related Topics==
* [[Legacy:Native Coding|Native Coding]]
* [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]]

==Comments?==

'''CH3Z:''' Nice. This will be very usefull. Good work so far, Laz. =)

'''Tarquin:''' This needs to be properly tied in with [[Legacy:UnrealScript Entry Points|UnrealScript Entry Points]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Game Event Glossary</title>
    <id>1332</id>
    <revision>
      <id>3392</id>
      <timestamp>2005-11-13T17:03:12Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General Startup Events==

===Server Startup===

An server starts, goes through an initialization process.  (This should stop short of World Spawn, as the latter will be repeated throughout the lifetime of the server.)

===World Spawn===

A level is loaded, world objects are initialized and the server enters a state where it is ready to accept player connections.

===Player Connect===

A player connects to a server, initiates authentication and is accepted/rejected.

===Player Join===

A player joins, spawns a Pawn, and becomes active in the game.

==In-game Events==

===General Replication Updates===

Replication information is passed between the client and the server.

===Movement===

Moves are recorded on the client side, sent to the server, and adjustments are sent back to the client if necessary.

===Weapon is Fired (non-projectile)===

Player activates an instantaneous-travel attack given a rotation and location in the world space.  Server finds first point of impact on the path and determines outcome.

===Weapon is Fired (projectile)===

Player activates the launching of a projectile given a rotation and location in the world space.  Server measures point of impact based on Karma physics and/or detonates after a timeout, distributing applicable damage in a radius.

'''Foxpaw:''' I do not believe that this is accurate. The projectile does not use Karma physics at all for collision. It 'skips' along, teleporting from location to location based on it's velocity and the time since the last tick, as all objects with PHYS_Projectile do. When it's collision radius/height overlaps the collision hull of another actor, the Touch function is called which determines if the actor we just hit should cause the projectile to impact. If it does, a trace is taken between the projectile's location last tick and it's current location to see where exactly the projectile should have impacted.

'''Wormbo:''' Actually Karma physics are only really used in two places: ragdolls and vehicles. Maybe there are also some maps using Karma objects, but although Epic said so in the first place the BR bomb definately doesn't.

'''Foxpaw:''' Isn't that what I just said? :P Epic probrably decided it was pointless to use Karma physics on the bombing run ball because it's a ball and it's physics could be simulated using less CPU without Karma.

===Weapon is Fired (Redeemer)===

Player activates a guided missle type attack.  Control may or may not be passed to the PlayerController to affect its trajectory and otherwise control its impact.  Likewise, the player's point-of-view can be attached to the missle for some period of time.

===Inventory Item is Dropped===

Player drops an inventory item, which destroys the item and spawns a pickup object for the appropriate class.

===Inventory Item is Picked up===

Player receives a newly spawned inventory item, potentially removing the pickup object from the world.

===Player Takes Damage===

The player takes some form of damage from a world event, either directly or indirectly through radius damage, falling, etc.

===Player Dies===

The player (pawn) dies in game, may be given an opportunity to rewpawn in selected or random location.

===Teleporting===

Player is instantly transported from one location in the world to another.  This applies to both portals and the translocator.

===Spectating===

The player is outside the gamestate, and able to freely roam the world or follow the POV of a player currently in the game.

==Post Game Events==

===End of Round===

The end of the round is triggered in some game dependent way, causing all gameplay to end.  This can result in the start of another round (reset) or a level change (server travel).

===Level Change (Server Travel)===

All players are transported to a new level.  (Might this be identical to world spawn above, with clients simply automatically reconnecting?)

===Player Disconnect===

A player voluntarily ends his session, disconnecting himself from the server (and causing the destruction of all resources pertaining to that player).

===Server Shutdown===

The server is terminate by an admin either through a remote console, web-server, etc.

==Back to Parent==
* [[Legacy:Game Event Flow|Game Event Flow]]

==Comments?==

'''Tarquin:''' Needs links with [[Legacy:Terminology|Terminology]], and clearer formatting.</text>
    </revision>
    <revision>
      <id>3393</id>
      <timestamp>2003-06-27T17:54:47Z</timestamp>
      <contributor>
        <ip>Mentalflossboy</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==General Startup Events==

===Server Startup===

An server starts, goes through an initialization process.  (This should stop short of World Spawn, as the latter will be repeated throughout the lifetime of the server.)

===World Spawn===

A level is loaded, world objects are initialized and the server enters a state where it is ready to accept player connections.

===Player Connect===

A player connects to a server, initiates authentication and is accepted/rejected.

===Player Join===

A player joins, spawns a Pawn, and becomes active in the game.

==In-game Events==

===General Replication Updates===

Replication information is passed between the client and the server.

===Movement===

Moves are recorded on the client side, sent to the server, and adjustments are sent back to the client if necessary.

===Weapon is Fired (non-projectile)===

Player activates an instantaneous-travel attack given a rotation and location in the world space.  Server finds first point of impact on the path and determines outcome.

===Weapon is Fired (projectile)===

Player activates the launching of a projectile given a rotation and location in the world space.  Server measures point of impact based on Karma physics and/or detonates after a timeout, distributing applicable damage in a radius.

'''Foxpaw:''' I do not believe that this is accurate. The projectile does not use Karma physics at all for collision. It 'skips' along, teleporting from location to location based on it's velocity and the time since the last tick, as all objects with PHYS_Projectile do. When it's collision radius/height overlaps the collision hull of another actor, the Touch function is called which determines if the actor we just hit should cause the projectile to impact. If it does, a trace is taken between the projectile's location last tick and it's current location to see where exactly the projectile should have impacted.

'''Wormbo:''' Actually Karma physics are only really used in two places: ragdolls and vehicles. Maybe there are also some maps using Karma objects, but although Epic said so in the first place the BR bomb definately doesn't.

'''Foxpaw:''' Isn't that what I just said? :P Epic probrably decided it was pointless to use Karma physics on the bombing run ball because it's a ball and it's physics could be simulated using less CPU without Karma.

===Weapon is Fired (Redeemer)===

Player activates a guided missle type attack.  Control may or may not be passed to the PlayerController to affect its trajectory and otherwise control its impact.  Likewise, the player's point-of-view can be attached to the missle for some period of time.

===Inventory Item is Dropped===

Player drops an inventory item, which destroys the item and spawns a pickup object for the appropriate class.

===Inventory Item is Picked up===

Player receives a newly spawned inventory item, potentially removing the pickup object from the world.

===Player Takes Damage===

The player takes some form of damage from a world event, either directly or indirectly through radius damage, falling, etc.

===Player Dies===

The player (pawn) dies in game, may be given an opportunity to rewpawn in selected or random location.

===Teleporting===

Player is instantly transported from one location in the world to another.  This applies to both portals and the translocator.

===Spectating===

The player is outside the gamestate, and able to freely roam the world or follow the POV of a player currently in the game.

==Post Game Events==

===End of Round===

The end of the round is triggered in some game dependent way, causing all gameplay to end.  This can result in the start of another round (reset) or a level change (server travel).

===Level Change (Server Travel)===

All players are transported to a new level.  (Might this be identical to world spawn above, with clients simply automatically reconnecting?)

===Player Disconnect===

A player voluntarily ends his session, disconnecting himself from the server (and causing the destruction of all resources pertaining to that player).

===Server Shutdown===

The server is terminate by an admin either through a remote console, web-server, etc.

==Back to Parent==
* [[Legacy:Game Event Flow|Game Event Flow]]

==Comments?==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Game Ini File</title>
    <id>1345</id>
    <revision>
      <id>3420</id>
      <timestamp>2006-09-08T07:14:15Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <comment>On Removing Editpackages</comment>
      <text xml:space="preserve">The '''Game Ini File''' or '''Game configuration file''' is an INI file with the same name as the executable file of the particular [[Legacy:Unreal Engine|unreal engine]] game. For instance, UnrealTournament.ini or UT2003.ini.

This file:
* sets up the paths for the [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* stores configuration set in [[Legacy:Class Syntax|Class Syntax]] (by default; classes can specify another file)
* tells [[Legacy:Ucc|Ucc]] which [[Legacy:Package|package]]s to compile
* tells the game which packages to load
* tells [[Legacy:UnrealEd|UnrealEd]] which packages to load. It's here that you can add [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]s.

==Headings ==

===[URL]===

===[FirstRun]===

The FirstRun entry tells you which version of the game you're currently running, in other words, are you on the latest patch?

===[Engine.Engine]===

===[Core.System]===

===[Engine.GameEngine]===

===[WinDrv.WindowsClient]===

===[SDLDrv.SDLClient]===

===[Engine.Player]===

===[ALAudio.ALAudioSubsystem]===

===[IpDrv.TcpNetDriver]===

===[IpDrv.HTTPDownload]===

===[Engine.DemoRecDriver]===

===[Engine.GameReplicationInfo]===

===[IpServer.UdpServerQuery]===

===[IpDrv.UdpBeacon]===

===[D3DDrv.D3DRenderDevice]===

===[OpenGLDrv.OpenGLRenderDevice]===

===[Engine.NullRenderDevice]===

===[Editor.EditorEngine]===

&quot;EditPackages&quot; lines list packages to load with UnrealEd.

'''Tarquin:''' Are ''all'' of these necessary? When working with textures or static meshes, there's an awful lot of guff already loaded that detracts from the resources currently in use in your map. Can any be removed safely?

'''StarWeaver:''' I'm actually going through and taking a look at the contents of the packages in UDE and removing the ones that seem likely. As far as I know, all removing a package will do is remove actors you might need to place from the actor browser, so you may well be able to remove e.g. Onslaught if you don't care about editing ONS all the time. I'm not sure what happens to packages that inherit from other packages, but considering how textures and everything are loaded i'd GUESS that they're loaded as needed.

These are the pacakges that seem to be completly irrelavant to work in the editor, and I'm going to attempt running without them for a while. &amp;ndash; I just tested and seemed to be able to load maps OK with these pacakages removed.

(Unfortunatly this dosn't remove much from the texture browser. I really wish there was some kind of list of packages used in the map or something so I could e.g. only see texture packages that I loaded manually at least once ...)

* GUI2K4
* UTV2004c
* UTV2004s
* UWeb
* XInterface
* XAdmin
* XWebAdmin
* xVoting

All that are in these packages are classes that import meshes and such, so I'm not sure that they matter in the editor either, but I'm leaving them in for now.

* XGame_rc
* XWeapons_rc
* XPickups_rc
* SkaarjPack_rc

Here are the ones i'm not sure about at all:

* StreamlineFX: Appears to be first person versions of muzzle flashes and some blood miscellany. Seems unlikely to be important in the ed.

* XEffects: So many of these are just one-off emitter effects that are used by coded objects like rocket trails and such, but there's at least one direct derive from Actor (MeshEffect) that might be important?

Also, if you just want to work with your own statics or whatever, I *Think* you can drop everything but core, engine, fire, editor, unrealed, and ipdrv and still load the program.

On another note, does anyone have any idea how CutdownPackages work?

===[UWeb.WebServer]===

===[Engine.Console]===

===[Engine.AccessControl]===

===[Engine.GameInfo]===

===[Engine.AmbientSound]===

===[Engine.LevelInfo]===

===[xInterface.Tab_MultiplayerHostMain]===

===[xInterface.Tab_InstantActionMain]===

===[xInterface.Tab_InstantActionBaseRules]===

===[xInterface.Tab_IADeathMatch]===

===[xInterface.Tab_IATeamDeathMatch]===

===[xInterface.Tab_IACaptureTheFlag]===

===[xInterface.Tab_IABombingRun]===

===[xInterface.Tab_IADoubleDomination]===

===[xInterface.Tab_InstantActionMutators]===

===[xInterface.Tab_MultiplayerHostServerSettings]===

===[xInterface.ExtendedConsole]===

===[XInterface.GUIController]===

Enable Interactive GUI Design Mode here (see [[Legacy:GUIController|GUIController]])

===[XGame.xDeathMatch]===

===[XGame.xTeamGame]===

===[XGame.xCTFGame]===

===[XGame.xDoubleDom]===

===[XGame.xBombingRun]===

===[IpDrv.MasterServerLink]===

===[XInterface.MapListDeathMatch]===

===[XInterface.MapListTeamDeathMatch]===

===[XInterface.MapListCaptureTheFlag]===

===[XInterface.MapListDoubleDomination]===

===[XInterface.MapListBombingRun]===

===[xInterface.IRC_System]===

===[xInterface.IRC_Page]===

===[XInterface.ServerBrowser]===

===[Xinterface.Tab_AudioSettings]===

===[BonusPack.xLastManStandingGame]===

===[Skaarjpack.Invasion]===

===[UnrealGame.DMMutator]===

===[UnrealEd.UnrealEdEngine]===

==Game Specific Information==
* [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]]
* [[Legacy:DeusEx.INI|DeusEx.INI]]
* [[Legacy:UT2004.Ini|UT2004.ini]]
** [[Legacy:UT2k4Mod.Ini|UT2k4Mod.ini]] &amp;ndash; For Epic's Mod system
** [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Used for generating UT2004.ini's
** [[Legacy:UT2k4 DefaultUser.Ini|UT2k4 DefaultUser.ini]] Used for generating User.ini's

==Discussion==

'''Chip:''' If it's not already in the works, I think an explanation of the many &lt;game&gt;.ini sections and what info they contain/how they function would be very helpful, particularly for those new to writing their own &lt;mymod&gt;.ini files. Syntax notes would also be useful. Examples like that for [Core.System] on the [[Legacy:Releasing A Mod|Releasing a Mod]] page are very instructive.

'''HSDanClark:''' The section headings are going to be different for each game (and the content gets changed/updated with each patch), but it would be a great idea to post the current-build version of the UT2003.ini with explanations. I'll set to work on it tonight if nobody beats me to it.

'''Tarquin:''' well there are the headings from mine if that's any help. Aren't any headigns at all common to all engine versions?

'''HSDanClark:''' The major ones, like [Core.System] or [Engine.Engine] are common to all versions (as far as I know), but others such as [XGame.xBombingRun] or [XGame.DoubleDom] are specific to UT2003 or higher.

'''Chip:''' I think documentation of UT2003.ini should be enough to provide a basis for figuring out many headings/sections not explicitly described on this page. The [Package.Class] heading syntax is consistent, right? If there's similar consistency in the section entries, that'll be a good clue for reading other .ini's.

'''OlympusMons:''' Maybe this should be the base page for unreal engine game ini's and all other game specific ini's can be on there respective pages. I'll see what I can do about adding some details and maybe a [[Legacy:UT2004.Ini|UT2004.ini]] page.

----

[[:Category:Legacy To Do]] &amp;ndash; add more to this page &amp; change links to [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]] to link here if suitable
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3421</id>
      <timestamp>2006-05-18T11:44:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Game Ini File''' or '''Game configuration file''' is an INI file with the same name as the executable file of the particular [[Legacy:Unreal Engine|unreal engine]] game. For instance, UnrealTournament.ini or UT2003.ini.

This file:
* sets up the paths for the [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* stores configuration set in [[Legacy:Class Syntax|Class Syntax]] (by default; classes can specify another file)
* tells [[Legacy:Ucc|Ucc]] which [[Legacy:Package|package]]s to compile
* tells the game which packages to load
* tells [[Legacy:UnrealEd|UnrealEd]] which packages to load. It's here that you can add [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]s.

==Headings ==

===[URL]===

===[FirstRun]===

The FirstRun entry tells you which version of the game you're currently running, in other words, are you on the latest patch?

===[Engine.Engine]===

===[Core.System]===

===[Engine.GameEngine]===

===[WinDrv.WindowsClient]===

===[SDLDrv.SDLClient]===

===[Engine.Player]===

===[ALAudio.ALAudioSubsystem]===

===[IpDrv.TcpNetDriver]===

===[IpDrv.HTTPDownload]===

===[Engine.DemoRecDriver]===

===[Engine.GameReplicationInfo]===

===[IpServer.UdpServerQuery]===

===[IpDrv.UdpBeacon]===

===[D3DDrv.D3DRenderDevice]===

===[OpenGLDrv.OpenGLRenderDevice]===

===[Engine.NullRenderDevice]===

===[Editor.EditorEngine]===

&quot;EditPackages&quot; lines list packages to load with UnrealEd.

'''Tarquin:''' Are ''all'' of these necessary? When working with textures or static meshes, there's an awful lot of guff already loaded that detracts from the resources currently in use in your map. Can any be removed safely?

===[UWeb.WebServer]===

===[Engine.Console]===

===[Engine.AccessControl]===

===[Engine.GameInfo]===

===[Engine.AmbientSound]===

===[Engine.LevelInfo]===

===[xInterface.Tab_MultiplayerHostMain]===

===[xInterface.Tab_InstantActionMain]===

===[xInterface.Tab_InstantActionBaseRules]===

===[xInterface.Tab_IADeathMatch]===

===[xInterface.Tab_IATeamDeathMatch]===

===[xInterface.Tab_IACaptureTheFlag]===

===[xInterface.Tab_IABombingRun]===

===[xInterface.Tab_IADoubleDomination]===

===[xInterface.Tab_InstantActionMutators]===

===[xInterface.Tab_MultiplayerHostServerSettings]===

===[xInterface.ExtendedConsole]===

===[XInterface.GUIController]===

Enable Interactive GUI Design Mode here (see [[Legacy:GUIController|GUIController]])

===[XGame.xDeathMatch]===

===[XGame.xTeamGame]===

===[XGame.xCTFGame]===

===[XGame.xDoubleDom]===

===[XGame.xBombingRun]===

===[IpDrv.MasterServerLink]===

===[XInterface.MapListDeathMatch]===

===[XInterface.MapListTeamDeathMatch]===

===[XInterface.MapListCaptureTheFlag]===

===[XInterface.MapListDoubleDomination]===

===[XInterface.MapListBombingRun]===

===[xInterface.IRC_System]===

===[xInterface.IRC_Page]===

===[XInterface.ServerBrowser]===

===[Xinterface.Tab_AudioSettings]===

===[BonusPack.xLastManStandingGame]===

===[Skaarjpack.Invasion]===

===[UnrealGame.DMMutator]===

===[UnrealEd.UnrealEdEngine]===

==Game Specific Information==
* [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]]
* [[Legacy:DeusEx.INI|DeusEx.INI]]
* [[Legacy:UT2004.Ini|UT2004.ini]]
** [[Legacy:UT2k4Mod.Ini|UT2k4Mod.ini]] &amp;ndash; For Epic's Mod system
** [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Used for generating UT2004.ini's
** [[Legacy:UT2k4 DefaultUser.Ini|UT2k4 DefaultUser.ini]] Used for generating User.ini's

==Discussion==

'''Chip:''' If it's not already in the works, I think an explanation of the many &lt;game&gt;.ini sections and what info they contain/how they function would be very helpful, particularly for those new to writing their own &lt;mymod&gt;.ini files. Syntax notes would also be useful. Examples like that for [Core.System] on the [[Legacy:Releasing A Mod|Releasing a Mod]] page are very instructive.

'''HSDanClark:''' The section headings are going to be different for each game (and the content gets changed/updated with each patch), but it would be a great idea to post the current-build version of the UT2003.ini with explanations. I'll set to work on it tonight if nobody beats me to it.

'''Tarquin:''' well there are the headings from mine if that's any help. Aren't any headigns at all common to all engine versions?

'''HSDanClark:''' The major ones, like [Core.System] or [Engine.Engine] are common to all versions (as far as I know), but others such as [XGame.xBombingRun] or [XGame.DoubleDom] are specific to UT2003 or higher.

'''Chip:''' I think documentation of UT2003.ini should be enough to provide a basis for figuring out many headings/sections not explicitly described on this page. The [Package.Class] heading syntax is consistent, right? If there's similar consistency in the section entries, that'll be a good clue for reading other .ini's.

'''OlympusMons:''' Maybe this should be the base page for unreal engine game ini's and all other game specific ini's can be on there respective pages. I'll see what I can do about adding some details and maybe a [[Legacy:UT2004.Ini|UT2004.ini]] page.

----

[[:Category:Legacy To Do]] &amp;ndash; add more to this page &amp; change links to [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]] to link here if suitable
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42535</id>
      <timestamp>2010-02-11T14:15:41Z</timestamp>
      <contributor>
        <username>Hanz</username>
        <id>2090</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">The '''Game Ini File''' or '''Game configuration file''' is an INI file with the same name as the executable file of the particular [[Legacy:Unreal Engine|unreal engine]] game. For instance, UnrealTournament.ini or UT2003.ini.

This file:
* sets up the paths for the [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* stores configuration set in [[Legacy:Class Syntax|Class Syntax]] (by default; classes can specify another file)
* tells [[Legacy:Ucc|Ucc]] which [[Legacy:Package|package]]s to compile
* tells the game which packages to load
* tells [[Legacy:UnrealEd|UnrealEd]] which packages to load. It's here that you can add [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]s.

==Headings ==

===[URL]===

===[FirstRun]===

The FirstRun entry tells you which version of the game you're currently running, in other words, are you on the latest patch?

===[Engine.Engine]===

===[Core.System]===

===[Engine.GameEngine]===

===[WinDrv.WindowsClient]===

===[SDLDrv.SDLClient]===

===[Engine.Player]===

===[ALAudio.ALAudioSubsystem]===

===[IpDrv.TcpNetDriver]===

===[IpDrv.HTTPDownload]===

===[Engine.DemoRecDriver]===

===[Engine.GameReplicationInfo]===

===[IpServer.UdpServerQuery]===

===[IpDrv.UdpBeacon]===

===[D3DDrv.D3DRenderDevice]===

===[OpenGLDrv.OpenGLRenderDevice]===

===[Engine.NullRenderDevice]===

===[Editor.EditorEngine]===

&quot;EditPackages&quot; lines list packages to load with UnrealEd.

'''Tarquin:''' Are ''all'' of these necessary? When working with textures or static meshes, there's an awful lot of guff already loaded that detracts from the resources currently in use in your map. Can any be removed safely?

'''StarWeaver:''' I'm actually going through and taking a look at the contents of the packages in UDE and removing the ones that seem likely. As far as I know, all removing a package will do is remove actors you might need to place from the actor browser, so you may well be able to remove e.g. Onslaught if you don't care about editing ONS all the time. I'm not sure what happens to packages that inherit from other packages, but considering how textures and everything are loaded i'd GUESS that they're loaded as needed.

These are the pacakges that seem to be completly irrelavant to work in the editor, and I'm going to attempt running without them for a while. &amp;ndash; I just tested and seemed to be able to load maps OK with these pacakages removed.

(Unfortunatly this dosn't remove much from the texture browser. I really wish there was some kind of list of packages used in the map or something so I could e.g. only see texture packages that I loaded manually at least once ...)

* GUI2K4
* UTV2004c
* UTV2004s
* UWeb
* XInterface
* XAdmin
* XWebAdmin
* xVoting

All that are in these packages are classes that import meshes and such, so I'm not sure that they matter in the editor either, but I'm leaving them in for now.

* XGame_rc
* XWeapons_rc
* XPickups_rc
* SkaarjPack_rc

Here are the ones i'm not sure about at all:

* StreamlineFX: Appears to be first person versions of muzzle flashes and some blood miscellany. Seems unlikely to be important in the ed.

* XEffects: So many of these are just one-off emitter effects that are used by coded objects like rocket trails and such, but there's at least one direct derive from Actor (MeshEffect) that might be important?

Also, if you just want to work with your own statics or whatever, I *Think* you can drop everything but core, engine, fire, editor, unrealed, and ipdrv and still load the program.

On another note, does anyone have any idea how CutdownPackages work?

===[UWeb.WebServer]===

===[Engine.Console]===

===[Engine.AccessControl]===

===[Engine.GameInfo]===

===[Engine.AmbientSound]===

===[Engine.LevelInfo]===

===[xInterface.Tab_MultiplayerHostMain]===

===[xInterface.Tab_InstantActionMain]===

===[xInterface.Tab_InstantActionBaseRules]===

===[xInterface.Tab_IADeathMatch]===

===[xInterface.Tab_IATeamDeathMatch]===

===[xInterface.Tab_IACaptureTheFlag]===

===[xInterface.Tab_IABombingRun]===

===[xInterface.Tab_IADoubleDomination]===

===[xInterface.Tab_InstantActionMutators]===

===[xInterface.Tab_MultiplayerHostServerSettings]===

===[xInterface.ExtendedConsole]===

===[XInterface.GUIController]===

Enable Interactive GUI Design Mode here (see [[Legacy:GUIController|GUIController]])

===[XGame.xDeathMatch]===

===[XGame.xTeamGame]===

===[XGame.xCTFGame]===

===[XGame.xDoubleDom]===

===[XGame.xBombingRun]===

===[IpDrv.MasterServerLink]===

===[XInterface.MapListDeathMatch]===

===[XInterface.MapListTeamDeathMatch]===

===[XInterface.MapListCaptureTheFlag]===

===[XInterface.MapListDoubleDomination]===

===[XInterface.MapListBombingRun]===

===[xInterface.IRC_System]===

===[xInterface.IRC_Page]===

===[XInterface.ServerBrowser]===

===[Xinterface.Tab_AudioSettings]===

===[BonusPack.xLastManStandingGame]===

===[Skaarjpack.Invasion]===

===[UnrealGame.DMMutator]===

===[UnrealEd.UnrealEdEngine]===

==Game Specific Information==
* [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]]
* [[Legacy:DeusEx.INI|DeusEx.INI]]
* [[Legacy:UT2004.Ini|UT2004.ini]]
** [[Legacy:UT2k4Mod.Ini|UT2k4Mod.ini]] &amp;ndash; For Epic's Mod system
** [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Used for generating UT2004.ini's
** [[Legacy:UT2k4 DefaultUser.Ini|UT2k4 DefaultUser.ini]] Used for generating User.ini's

==Discussion==

'''Chip:''' If it's not already in the works, I think an explanation of the many &lt;game&gt;.ini sections and what info they contain/how they function would be very helpful, particularly for those new to writing their own &lt;mymod&gt;.ini files. Syntax notes would also be useful. Examples like that for [Core.System] on the [[Legacy:Releasing A Mod|Releasing a Mod]] page are very instructive.

'''HSDanClark:''' The section headings are going to be different for each game (and the content gets changed/updated with each patch), but it would be a great idea to post the current-build version of the UT2003.ini with explanations. I'll set to work on it tonight if nobody beats me to it.

'''Tarquin:''' well there are the headings from mine if that's any help. Aren't any headigns at all common to all engine versions?

'''HSDanClark:''' The major ones, like [Core.System] or [Engine.Engine] are common to all versions (as far as I know), but others such as [XGame.xBombingRun] or [XGame.DoubleDom] are specific to UT2003 or higher.

'''Chip:''' I think documentation of UT2003.ini should be enough to provide a basis for figuring out many headings/sections not explicitly described on this page. The [Package.Class] heading syntax is consistent, right? If there's similar consistency in the section entries, that'll be a good clue for reading other .ini's.

'''OlympusMons:''' Maybe this should be the base page for unreal engine game ini's and all other game specific ini's can be on there respective pages. I'll see what I can do about adding some details and maybe a [[Legacy:UT2004.Ini|UT2004.ini]] page.

'''HanzFreiz:''' Is there a way(function) to write a data in the ini files? Without have to write a DLL or create a class like:

&lt;uscript&gt; class example extends actor 
             config(MyIniFile);

var config array&lt;String&gt; MyData;

function BeginPlay()
{
       Super.BeginPlay();

       SaveConfigs();
}

&lt;/uscript&gt;

I need it to create a savegame system.

----

[[:Category:Legacy To Do]] &amp;ndash; add more to this page &amp; change links to [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]] to link here if suitable
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42536</id>
      <timestamp>2010-02-11T16:48:31Z</timestamp>
      <contributor>
        <username>00zX</username>
        <id>1898</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">The '''Game Ini File''' or '''Game configuration file''' is an INI file with the same name as the executable file of the particular [[Legacy:Unreal Engine|unreal engine]] game. For instance, UnrealTournament.ini or UT2003.ini.

This file:
* sets up the paths for the [[Legacy:Engine Directory Structure|Engine Directory Structure]]
* stores configuration set in [[Legacy:Class Syntax|Class Syntax]] (by default; classes can specify another file)
* tells [[Legacy:Ucc|Ucc]] which [[Legacy:Package|package]]s to compile
* tells the game which packages to load
* tells [[Legacy:UnrealEd|UnrealEd]] which packages to load. It's here that you can add [[Legacy:Custom Brushbuilder|Custom Brushbuilder]]s.

==Headings ==

===[URL]===

===[FirstRun]===

The FirstRun entry tells you which version of the game you're currently running, in other words, are you on the latest patch?

===[Engine.Engine]===

===[Core.System]===

===[Engine.GameEngine]===

===[WinDrv.WindowsClient]===

===[SDLDrv.SDLClient]===

===[Engine.Player]===

===[ALAudio.ALAudioSubsystem]===

===[IpDrv.TcpNetDriver]===

===[IpDrv.HTTPDownload]===

===[Engine.DemoRecDriver]===

===[Engine.GameReplicationInfo]===

===[IpServer.UdpServerQuery]===

===[IpDrv.UdpBeacon]===

===[D3DDrv.D3DRenderDevice]===

===[OpenGLDrv.OpenGLRenderDevice]===

===[Engine.NullRenderDevice]===

===[Editor.EditorEngine]===

&quot;EditPackages&quot; lines list packages to load with UnrealEd.

'''Tarquin:''' Are ''all'' of these necessary? When working with textures or static meshes, there's an awful lot of guff already loaded that detracts from the resources currently in use in your map. Can any be removed safely?

'''StarWeaver:''' I'm actually going through and taking a look at the contents of the packages in UDE and removing the ones that seem likely. As far as I know, all removing a package will do is remove actors you might need to place from the actor browser, so you may well be able to remove e.g. Onslaught if you don't care about editing ONS all the time. I'm not sure what happens to packages that inherit from other packages, but considering how textures and everything are loaded i'd GUESS that they're loaded as needed.

These are the pacakges that seem to be completly irrelavant to work in the editor, and I'm going to attempt running without them for a while. &amp;ndash; I just tested and seemed to be able to load maps OK with these pacakages removed.

(Unfortunatly this dosn't remove much from the texture browser. I really wish there was some kind of list of packages used in the map or something so I could e.g. only see texture packages that I loaded manually at least once ...)

* GUI2K4
* UTV2004c
* UTV2004s
* UWeb
* XInterface
* XAdmin
* XWebAdmin
* xVoting

All that are in these packages are classes that import meshes and such, so I'm not sure that they matter in the editor either, but I'm leaving them in for now.

* XGame_rc
* XWeapons_rc
* XPickups_rc
* SkaarjPack_rc

Here are the ones i'm not sure about at all:

* StreamlineFX: Appears to be first person versions of muzzle flashes and some blood miscellany. Seems unlikely to be important in the ed.

* XEffects: So many of these are just one-off emitter effects that are used by coded objects like rocket trails and such, but there's at least one direct derive from Actor (MeshEffect) that might be important?

Also, if you just want to work with your own statics or whatever, I *Think* you can drop everything but core, engine, fire, editor, unrealed, and ipdrv and still load the program.

On another note, does anyone have any idea how CutdownPackages work?

===[UWeb.WebServer]===

===[Engine.Console]===

===[Engine.AccessControl]===

===[Engine.GameInfo]===

===[Engine.AmbientSound]===

===[Engine.LevelInfo]===

===[xInterface.Tab_MultiplayerHostMain]===

===[xInterface.Tab_InstantActionMain]===

===[xInterface.Tab_InstantActionBaseRules]===

===[xInterface.Tab_IADeathMatch]===

===[xInterface.Tab_IATeamDeathMatch]===

===[xInterface.Tab_IACaptureTheFlag]===

===[xInterface.Tab_IABombingRun]===

===[xInterface.Tab_IADoubleDomination]===

===[xInterface.Tab_InstantActionMutators]===

===[xInterface.Tab_MultiplayerHostServerSettings]===

===[xInterface.ExtendedConsole]===

===[XInterface.GUIController]===

Enable Interactive GUI Design Mode here (see [[Legacy:GUIController|GUIController]])

===[XGame.xDeathMatch]===

===[XGame.xTeamGame]===

===[XGame.xCTFGame]===

===[XGame.xDoubleDom]===

===[XGame.xBombingRun]===

===[IpDrv.MasterServerLink]===

===[XInterface.MapListDeathMatch]===

===[XInterface.MapListTeamDeathMatch]===

===[XInterface.MapListCaptureTheFlag]===

===[XInterface.MapListDoubleDomination]===

===[XInterface.MapListBombingRun]===

===[xInterface.IRC_System]===

===[xInterface.IRC_Page]===

===[XInterface.ServerBrowser]===

===[Xinterface.Tab_AudioSettings]===

===[BonusPack.xLastManStandingGame]===

===[Skaarjpack.Invasion]===

===[UnrealGame.DMMutator]===

===[UnrealEd.UnrealEdEngine]===

==Game Specific Information==
* [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]]
* [[Legacy:DeusEx.INI|DeusEx.INI]]
* [[Legacy:UT2004.Ini|UT2004.ini]]
** [[Legacy:UT2k4Mod.Ini|UT2k4Mod.ini]] &amp;ndash; For Epic's Mod system
** [[Legacy:UT2k4 Default.Ini|UT2k4 Default.ini]] &amp;ndash; Used for generating UT2004.ini's
** [[Legacy:UT2k4 DefaultUser.Ini|UT2k4 DefaultUser.ini]] Used for generating User.ini's

==Discussion==

'''Chip:''' If it's not already in the works, I think an explanation of the many &lt;game&gt;.ini sections and what info they contain/how they function would be very helpful, particularly for those new to writing their own &lt;mymod&gt;.ini files. Syntax notes would also be useful. Examples like that for [Core.System] on the [[Legacy:Releasing A Mod|Releasing a Mod]] page are very instructive.

'''HSDanClark:''' The section headings are going to be different for each game (and the content gets changed/updated with each patch), but it would be a great idea to post the current-build version of the UT2003.ini with explanations. I'll set to work on it tonight if nobody beats me to it.

'''Tarquin:''' well there are the headings from mine if that's any help. Aren't any headigns at all common to all engine versions?

'''HSDanClark:''' The major ones, like [Core.System] or [Engine.Engine] are common to all versions (as far as I know), but others such as [XGame.xBombingRun] or [XGame.DoubleDom] are specific to UT2003 or higher.

'''Chip:''' I think documentation of UT2003.ini should be enough to provide a basis for figuring out many headings/sections not explicitly described on this page. The [Package.Class] heading syntax is consistent, right? If there's similar consistency in the section entries, that'll be a good clue for reading other .ini's.

'''OlympusMons:''' Maybe this should be the base page for unreal engine game ini's and all other game specific ini's can be on there respective pages. I'll see what I can do about adding some details and maybe a [[Legacy:UT2004.Ini|UT2004.ini]] page.

'''HanzFreiz:''' Is there a way(function) to write a data in the ini files? Without have to write a DLL or create a class like:

&lt;uscript&gt; class example extends actor 
             config(MyIniFile);

var config array&lt;String&gt; MyData;

function BeginPlay()
{
       Super.BeginPlay();

       SaveConfigs();
}

&lt;/uscript&gt;

I need it to create a savegame system.

'''00zX:'''[[Legacy:DataObject|DataObject]] is this what you are looking for? or are you wanting something UE3 related? --[[User:00zX|00zX]] 16:48, 11 February 2010 (UTC)
----

[[:Category:Legacy To Do]] &amp;ndash; add more to this page &amp; change links to [[Legacy:UnrealTournament.Ini|UnrealTournament.Ini]] to link here if suitable
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameConfigSet</title>
    <id>28897</id>
    <revision>
      <id>42827</id>
      <timestamp>2010-03-31T11:03:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameEngine</title>
    <id>1368</id>
    <revision>
      <id>3470</id>
      <timestamp>2006-07-30T23:32:48Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; [[Legacy:Engine|Engine]] &gt;&gt; GameEngine (Package: Engine)}}

The game subsystem.

This is the description of the UT200x version of this class. The UT version doesn't have any UnrealScript source.

==Structs==

===URL===
; string Protocol : Protocol, e.g. &quot;unreal&quot; or &quot;http&quot;.
; string Host : Optional hostname, e.g. &quot;204.157.115.40&quot; or &quot;unreal.epicgames.com&quot;, blank if local.
; int Port : Optional host port.
; string Map : Map name, e.g. &quot;SkyCity&quot;, default is &quot;Index&quot;.
; array&lt;string&gt; Op : Options.
; string Portal : Portal to enter through, default is &quot;&quot;.
; int Valid : 

==Properties==

===Settings Group===
; bool ColorHighDetailMeshes (config) : 
; bool ColorSlowCollisionMeshes (config) : 
; bool ColorNoCollisionMeshes (config) : 
; bool ColorWorldTextures (config) : 
; bool ColorPlayerAndWeaponTextures (config) : 
; bool ColorInterfaceTextures (config) : 

===VoiceChat Group===
; bool VoIPAllowVAD (globalconfig) : 

===Other Configurable Properties===
; string ConnectingMenuClass (globalconfig) : Menu that appears when you are connecting to a server or loading a map in Instant Action mode. This is a [[Legacy:Vignette|Vignette]] subclass.
; string DisconnectMenuClass (globalconfig) : Menu that appears when you are disconnected.
; string LoadingClass (globalconfig) : Loading screen that appears when loading a map in the single player ladder. This is a [[Legacy:Vignette|Vignette]] subclass.
; string MainMenuClass (globalconfig) : Menu that appears when you first start the game.  This is loaded immediatly after loading the Entry level.  It appears that most games do not actually use this, but rather open their menu from a trigger in their Intro level.  
; array&lt;string&gt; ServerActors (config) : List of actor classes to spawn on map startup. These actors are handled like map actors during the [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]].
; array&lt;string&gt; ServerPackages (config) : List of package names that are loaded on map startup. These packages and any package they depend on have to be present on clients that want to connect unless a package is flagged as ServerSideOnly or ClientOptional. Packages that are present on the client need to have the same GUID as on the server. All code packages here which are flagged as AllowDownload are sent to the client if downloads are enabled and the client doesn't have a package.
; string SinglePlayerMenuClass (globalconfig) : Menu that appears when you return from a single player match after a cinematic game.

===Other Properties===
; bool bCheatProtection : I think this tells whether Quick MD5 checks are performed on a client's code packages.
; array&lt;[[Legacy:Object|Object]]&gt; DummyArray :
; [[Legacy:Object|Object]] DummyObject :
; string DummyString : Source comment: Do not modify
; Level GEntry : Reference to the entry level object. (the same as Actor.XLevel of actor in the entry level)
; Level GLevel : Reference to the current level object. (the same as Actor.XLevel of actors in the current map)
; PendingLevel GPendingLevel : 
; URL LastURL : 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3471</id>
      <timestamp>2006-07-17T09:29:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; [[Legacy:Engine|Engine]] &gt;&gt; GameEngine (Package: Engine)}}

The game subsystem.

This is the description of the UT200x version of this class. The UT version doesn't have any UnrealScript source.

==Structs==

===URL===
; string Protocol : Protocol, e.g. &quot;unreal&quot; or &quot;http&quot;.
; string Host : Optional hostname, e.g. &quot;204.157.115.40&quot; or &quot;unreal.epicgames.com&quot;, blank if local.
; int Port : Optional host port.
; string Map : Map name, e.g. &quot;SkyCity&quot;, default is &quot;Index&quot;.
; array&lt;string&gt; Op : Options.
; string Portal : Portal to enter through, default is &quot;&quot;.
; int Valid : 

==Properties==

===Settings Group===
; bool ColorHighDetailMeshes (config) : 
; bool ColorSlowCollisionMeshes (config) : 
; bool ColorNoCollisionMeshes (config) : 
; bool ColorWorldTextures (config) : 
; bool ColorPlayerAndWeaponTextures (config) : 
; bool ColorInterfaceTextures (config) : 

===VoiceChat Group===
; bool VoIPAllowVAD (globalconfig) : 

===Other Configurable Properties===
; string ConnectingMenuClass (globalconfig) : Menu that appears when you are connecting to a server or loading a map in Instant Action mode. This is a [[Legacy:Vignette|Vignette]] subclass.
; string DisconnectMenuClass (globalconfig) : Menu that appears when you are disconnected.
; string LoadingClass (globalconfig) : Loading screen that appears when loading a map in the single player ladder. This is a [[Legacy:Vignette|Vignette]] subclass.
; string MainMenuClass (globalconfig) : Menu that appears when you first start the game.
; array&lt;string&gt; ServerActors (config) : List of actor classes to spawn on map startup. These actors are handled like map actors during the [[Legacy:Chain Of Events At Level Startup|chain of events at level startup]].
; array&lt;string&gt; ServerPackages (config) : List of package names that are loaded on map startup. These packages and any package they depend on have to be present on clients that want to connect unless a package is flagged as ServerSideOnly or ClientOptional. Packages that are present on the client need to have the same GUID as on the server. All code packages here which are flagged as AllowDownload are sent to the client if downloads are enabled and the client doesn't have a package.
; string SinglePlayerMenuClass (globalconfig) : Menu that appears when you return from a single player match after a cinematic game.

===Other Properties===
; bool bCheatProtection : I think this tells whether Quick MD5 checks are performed on a client's code packages.
; array&lt;[[Legacy:Object|Object]]&gt; DummyArray :
; [[Legacy:Object|Object]] DummyObject :
; string DummyString : Source comment: Do not modify
; Level GEntry : Reference to the entry level object. (the same as Actor.XLevel of actor in the entry level)
; Level GLevel : Reference to the current level object. (the same as Actor.XLevel of actors in the current map)
; PendingLevel GPendingLevel : 
; URL LastURL : 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameInfo</title>
    <id>1294</id>
    <revision>
      <id>3304</id>
      <timestamp>2006-11-26T13:14:30Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Grouped DataObject functions and linked back to DataObject</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameInfo (Package: Engine)}}

See [[Legacy:GameInfo_(UT)|GameInfo_(UT)]] for the UT version of this class.

The GameInfo defines the game being played: the game rules, scoring, what actors are allowed to exist in this game type, and who may enter the game. While the GameInfo class is the public interface, much of this functionality is delegated to several classes to allow easy modification of specific game components. These  classes include GameInfo, AccessControl, Mutator, BroadcastHandler, and GameRules. A GameInfo actor is instantiated when the level is initialized for gameplay (in C++ UGameEngine::LoadMap( ) ).  The class of this GameInfo actor is determined by (in order):
# the DefaultGameType if specified in the [[Legacy:LevelInfo|LevelInfo]]
# the DefaultGame entry in the [[Legacy:Game Ini File|game ini file]] (in the Engine.Engine section), unless it's a network game in which case the DefaultServerGame entry is used.

==Structs==

===KeyValuePair ===

Contains a string key with a corresponding string value.
; string Key : 
; string Value :

===PlayerResponseLine (native export)===

Contains information about the player, 
; int PlayerNum : The number given to the player.
; string PlayerName : The name of the player.
; int Ping : The ping from the server to the player.
; int Score : The score of the player.
; int StatsID : The ID used to maintain stats about the player

===ServerResponseLine (native export)===
; int ServerID : The ID of the server.
; string IP : The IP adress of the server.
; int Port : The port that the Unreal Server is running on.
; int QueryPort :
; string ServerName : The name of the Server.
; string MapName : The name of the current map.
; string GameType : The name of the current game.
; int CurrentPlayers : The current number of players on the server.
; int MaxPlayers : The maximum number of players allowed in the game.
; int Ping : The ping to the server.
; array&lt;KeyValuePair&gt; ServerInfo : A detailed list of what is loaded on the  server (Mutators,GameRules,etc...).
; array&lt;PlayerResponseLine&gt; PlayerInfo : A list of the Players on the server.

===VoiceChatterInfo ===
; [[Legacy:Controller|Controller]] Controller : 
; int IpAddr : 
; int Handle : 

==Properties==

===Globalconfig===
; bool bChangeLevels : ''True'' if the game is allowed to change levels and ''false'' if the game is not allowed to change levels.
; bool bEnableStatLogging : ''True'' the game will be enabled to track stats and ''false'' the game will not track stats.
; bool bAdminCanPause : ''True'' the game is pauseable by the admin and ''false'' if the game is not pauseable by the admin.
; bool bWeaponShouldViewShake : ''True'' the weapon will shake the view and ''false'' the weapon will not shake the view.
; float GameDifficulty : 
; int GoreLevel : 0 is normal gore, while increasing the value will yield less gore.
; float AutoAim : 1 is no aiming and 0 is always auto-aiming  (cosine of max error to correct).
; float GameSpeed : The scale applied to the rate of the game.
; int MaxSpectators : The Maximum number of spectators.
; int MaxPlayers : The Maximum number of players.
; string AccessControlClass : The class name of the AccessControl class.
; string GameStatsClass : The class name of the GameStats class.

===Config===
; bool bWeaponStay : ''True'' the weapons stay when picked up and ''False'' they do not stay when picked up. 
; bool bAllowWeaponThrowing : ''True'' if the [[Legacy:Pawn|Pawn]] is allowed to throw their weapon and ''false'' if they are not allowed to throw their weapons.
; bool bAllowBehindView : ''True'' if the [[Legacy:PlayerController|PlayerController]] is allowed to view their [[Legacy:Pawn|Pawn]] from behind and ''false'' if the behind view is not allowed.
; int GoalScore : The goal score of the level.
; int MaxLives : The maximum lives a player has on the level.  (0 means there is not limit).
; int TimeLimit : The time limit of the game.

===Localized===
; bool bAlternateMode : Used when setting the gore level of the game.
; string DefaultPlayerName : The default name of the player when they have not specified a name.
; string GameName : The name of the game.

===Main===
; bool bRestartLevel : ''True'' if the level needs to be restarted and ''false'' if it does not need to be restarted.
; bool bPauseable :  ''True'' if the game is pauseable and ''false'' if the game is not pauseable.
; bool bCanChangeSkin : ''True'' if the [[Legacy:Controller|Controller]] can change the skin of the of the [[Legacy:Pawn|Pawn]].
; bool bTeamGame : ''True'' if the game is a team game and ''false'' if the game is not a team game.
; bool GameEnded : ''True'' if the game has ended and ''false'' if the game has not ended.
; bool bOverTime : ''True'' if the game is in overtime (because a win condition hasn't been met) and ''false'' if the game is not in overtime.
; bool bCanViewOthers : ''True'' if a [[Legacy:PlayerController|PlayerController]] is able to view other players in spectator mode and ''false'' if they are unable to view other players.
; bool bDelayedStart :  ''True'' if the start of a [[Legacy:Controller|Controller]]'s game start is delayed and ''false'' if it is not delayed. 
; bool bWaitingToStartMatch : ''True'' if the match is being waiting to start and ''false'' if the game has started. 
; bool bAlreadyChanged :
; bool bLoggingGame : ''True'' if the game is a logged game and ''false'' if the game is not being logged.
; bool bGameRestarted : 
; bool bModViewShake : ''True'' if the game allows for weapon shaking and ''false'' if the game does not allow weapon shaking.
; bool bForceClassicView :
; float StartTime : 
; string ScoreBoardType : The class name of the [[Legacy:ScoreBoard|ScoreBoard]] that is loaded for this game.
; string BotMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the game bots.
; string RulesMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the rules.
; string SettingsMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the game settings.
; string GameUMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game dropdown.
; string MultiplayerUMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for multiplayer dropdown.
; string GameOptionsMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for options dropdown.
; string HUDType : The class name of the [[Legacy:HUD|HUD]] that is loaded for the game.
; string MapListType : The class name of the [[Legacy:MapList|MapList]] that is loaded for this game.
; string MapPrefix : The prefix designation that the game uses for it's maps.
; string BeaconName : Identifying string used for finding LAN servers.
; int NumSpectators : The current number of spectators in the game.
; int NumPlayers : The current number of players in the game.
; int NumBots : The current number of bots in the game.
; int CurrentID : The game server ID.
; float FearCostFallOff : The rate at which the FearCost in NavigationPoints decreases over time.
; class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; DeathMessageClass : The message class that handles the messages concerned with death of a [[Legacy:Pawn|Pawn]].
; class&lt;[[Legacy:GameMessage|GameMessage]]&gt; GameMessageClass : The message class that handles the messages in the game.
; name OtherMesgGroup : 
; string MutatorClass : The class name of the '''BaseMutator'''.
; [[Legacy:Mutator|Mutator]] BaseMutator : The reference to the first mutator in the [[Legacy:Linked List|linked list]] of Mutators.
; [[Legacy:AccessControl|AccessControl]] AccessControl : The instance of the [[Legacy:AccessControl|AccessControl]] class that handles the security, banning and various other administrative tasks.
; [[Legacy:GameRules|GameRules]] GameRulesModifiers : The reference to the Linked-List of [[Legacy:GameRules|GameRules]].
; string BroadcaseHandlerClass : The class name for the '''BroadCastHandler'''.
; [[Legacy:BroadcastHandler|BroadcastHandler]] BroadcastHandler : The reference to the Linked-List of [[Legacy:BroadCastHandler|BroadCastHandler]].
; class&lt;[[Legacy:PlayerController|PlayerController]]&gt; PlayerControllerClass :  The specific class of the [[Legacy:PlayerController|PlayerController]] in this game.
; string PlayerControllerClassName : The class name of the '''PlayerControllerClass'''. This should be set while the PlayerControllerClass is dynamically loaded using this string.
; class&lt;[[Legacy:GameReplicationInfo|GameReplicationInfo]]&gt; GameReplicationInfoClass : The class that contains [[Legacy:Replication|Replication]] info about the game.
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GameReplicationInfo : The instance of the [[Legacy:GameReplicationInfo|GameReplicationInfo]] class that contains important information concerning the game and the server.
; bool bWelcomePending : ''True'' if the welcome message is still needed to be given to a new player, and ''False'' if the welcome message has already been presented.
; [[Legacy:GameStats|GameStats]] GameStats : The instance of the [[Legacy:GameStats|GameStats]] where events and information are logged.
; array&lt;VoiceChatterInfo&gt; VoiceChatters :
; String ScreenShotName :
; String DecoTextName :
; String Acronym : 
; [[Legacy:GameProfile|GameProfile]] CurrentGameProfile (transient) : Persistant game data management.
; [[Legacy:Manifest|Manifest]] SaveGameManifest (private const) : persistant game data management.
; bool bAttractCam : 

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed() :  Used to destroy the GameInfo object.  Destroys the [[Legacy:GameProfile|GameProfile]] and then calls Actor's ''Destroy''.
; PostBeginPlay() : Called right after play starts.  This function is used to initialize variables and objects that are set after play has just begun or gotten underway.
; PreBeginPlay() : Called before play starts.  This function is used to initialize varibles and objects that need to be set before the game begins.  In this case, GameInfo sets start time, gamespeed and starts logging and the game replication info.
; Reset() : Used for restarting the level.  Returns the GameInfo Object to it's initial state.
; Timer() : Used to handle events at a given time interval that is important to the GameInfo object.  In this case it makes sure that all players have been welcomed to the server. 
; UpdatePrecacheMaterials() : Precaches textures used in the map by calling PrecacheGameTextures.
; UpdatePrecacheStaticMeshes() : Precaches the static meshes used in the map by calling PrecacheGameStaticMeshes.

===Inherited From [[Legacy:Info|Info]]===
; FillPlayInfo( [[Legacy:PlayInfo|PlayInfo]] PlayInfo ) (static) :  Used to load a PlayInfo with appropriate information about the game.  Which should be added to the [[Legacy:GameReplicationInfo|GameReplicationInfo]] so that the information is retreivable by all players.

===Events===
; AcceptInventory( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Examine the passed player's inventory, and accept or discard each item.  AcceptInventory needs to gracefully handle the case of some inventory being accepted but other inventory not being accepted (such as the default weapon).  There are several things that can go wrong: A weapon's AmmoType not being accepted but the weapon being accepted &amp;ndash; the weapon should be killed off. Or the player's selected inventory item, active weapon, etc. not being accepted, leaving the player weaponless or leaving the HUD inventory rendering messed up (AcceptInventory should pick another applicable weapon/item as current).
; PreLogin( string Options, string Address, string PlayerID, out string Error, out string FailCode ) : Accept or reject a player on the server.  Fails login if you set the Error to a non-empty string.
; Broadcast( [[Legacy:Actor|Actor]] Sender, coerce string Msg, optional name Type ) : Passes this information on to the BroadCastHandler object's method ''Broadcast''.
; DetailChange() : This event takes place when the detail level changes from low to high or high to low.
; string GetBeaconText() : Return beacon text for serverbeacon.
; InitGame( string Options, out string Error ) : The GameInfo's InitGame( ) function is called before any other scripts (including PreBeginPlay( ) ), and is used by the GameInfo to initialize parameters and spawn its helper classes.  Warning: this is called before actors' PreBeginPlay.  The ''Options'' string contains the key-value pairs of options for the game.  ''Error'' contains error information during the initializing of the game.  In this case, it loads all the game speed, max players, password, mutators, game rules, etc...
; PlayerController Login( string Portal, string Options, out string Error ) : Fails login if you set the Error string. PreLogin is called before Login, but significant game time may pass before Login is called, especially if content is downloaded.

===Exec Functions===
; AdminSay( string Msg ) : Sends ''Msg'' to to all [[Legacy:PlayerControllers|PlayerControllers]].
; KillBots( int num ) : This methods destroys ''num'' bots.

===Iterators===
; AllDataObjects( [[Legacy:Class|class]] objClass, out Object obj, string packageName ) (native, final) : Iterates through all data objects in a package created with the ''SavePackage'' function.

===Native Functions===
; string GetNetworkNumber() : Replication related function.
; LoadMapList( string MapPrefix, out array&lt;string&gt; Maps ) (static, final) : Returns an array of Map names with the following ''MapPrefix''.
; string ParseKillMessage( string KillerName, string VictimName, string DeathMessage ) [static] : 

====[[Legacy:DataObject|DataObject]] Functions====
; [[Legacy:Manifest|Manifest]] GetSavedGames() (final) : Returns a [[Legacy:Manifest|Manifest]] of saved games.
; [[Legacy:Object|Object]] CreateDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) :
; [[Legacy:Object|Object]] LoadDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) : Creates an instance of the ''objClass'' from the ''packageName'' with the ''packageName'' as its name.
; bool DeleteDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) : Returns ''true'' if this method is able to delete the instance of the object.
; bool SavePackage( string packageName ) (final) : Returns ''true'' if the package labeled ''packageName'' has been saved and returns ''false'' if the package was not saved.
; bool DeletePackage( string packageName ) (final) : Returns ''true'' if the package labeled ''packageName'' has been deleted and ''false'' if the package was not deleted.

===Other Methods ===
; AddDefaultInventory( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Add to the [[Legacy:Pawn|Pawn]] specific [[Legacy:Inventory|Inventory]] items required for the game.  In this case, the base mutator is queried for the default weapon and it is added to the inventory and made so it is not throwable.  Then it calls ''SetPlayerDefaults''.
; AddGameSpecificInventory( [[Legacy:Pawn|Pawn]] p ) : Add to the [[Legacy:Pawn|Pawn]] specific [[Legacy:Inventory|Inventory]] items required for the game.  This is the same as ''AddDefaultInventory'' method except that it does not call ''SetPlayerDefaults'' when it is done.
; AddMutator( string mutname, optional bool bUserAdded ) : Utility function that creates a physical instance of the ''mutname'' class and then adds it to the '''BaseMutator''' variable.
; bool AtCapacity( bool bSpectator ) : Returns ''true'' if the game is at capacity and returns ''false'' if the the server is not at capacity.  ''bSpectator'' is used to specify for which type of capactity.  if ''bSpectator'' is false then you are asking if there is room for more players.  If ''bSpectator'' is true then you are asking if there is room for more spectators.
; BroadcastDeathMessage( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : Broadcase a message that [[Legacy:Controller|Controller]] Killer has killed himself or another player.
; BroadcastLocalized( [[Legacy:Actor|Actor]] Sender, class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) :  Broadcast a localized message to all players.  Most message deal with 0 to 2 related PRIs.  The [[Legacy:LocalMessage|LocalMessage]] class defines how the PRI's and optional actor are used.
; BroadcastTeam( [[Legacy:Controller|Controller]] Sender, coerce string Msg, optional name Type ) : Passes this information on to the BroadCastHandler object's method ''BroadcastTeam''.
; bool CanSpectate( [[Legacy:PlayerController|PlayerController]] Viewer, bool bOnlySpectator, [[Legacy:Actor|Actor]] ViewTarget ) : Returns ''true'' if the ''Viewer'' is able to spectate in the game of the following [[Legacy:Actor|Actor]] ''ViewTarget'' and returns ''false'' if the ''Viewer'' may not.  In this case it always returns true.
; ChangeMap( int ContextID ) : Changes the map that is currently being played to the one specified by the ContextID.  
; ChangeName( [[Legacy:Controller|Controller]] Other, coerce string S, bool bNameChange ) : If ''bNameChange'' is allowing name changes then change the name of [[Legacy:Controller|Controller]] Other's name to ''S''.
; bool ChangeTeam( [[Legacy:Controller|Controller]] Other, int N, bool bNewTeam ) : If ''bNewTeam'' is allowing team changes then change [[Legacy:Controller|Controller]] Other's team to team number ''N''.
; ChangeVoiceChatter( [[Legacy:Controller|Controller]] Client, int IpAddr, int Handle, bool Add ) :
; bool CheckEndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) : Called when the game is over.  Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to handle the end game.  In this case, if no GameRules modifies the end game then it loops through each [[Legacy:Controller|Controller]] and calls ''ClientGameEnded'' and ''GameHasEnded''.
; CheckScore( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer ) : Sees if this score means the game ends.  This method should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to augment the determination of the end game for this ''Scorer''.
; DiscardInventory( [[Legacy:Pawn|Pawn]] Other ) : Removes and destroys all the [[Legacy:Inventory|Inventory]] of the [[Legacy:Pawn|Pawn]] Other's [[Legacy:Inventory|Inventory]].
; EndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) : The end of the game has been reached.  In this case, it calls ''CheckEndGame'' to see if perhaps the winning conditions have not been reached.   Then sets the ''bGameEnded'' to false and then Triggers the event ''EndGame''.
; EndLogging( string Reason ) : Used to close and destroy all the logging classes in the GameInfo class.
; string FindPlayerByID( int PlayerID ) : Returns the name of the player given a ''playerID''.
; [[Legacy:NavigationPoint|NavigationPoint]] FindPlayerStart( [[Legacy:Controller|Controller]] Player, option byte inTeam, optional string incomingName ) : Return the 'best' player start for this player to start from.
; [[Legacy:Actor|Actor]] FindSpecGoalFor( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, int TeamIndex ) : Returns an actor that has special goal or situation taking place.  For example, in [[Legacy:XBombingRun|xBombingRun]] games the [[Legacy:Pawn|Pawn]] with the [[Legacy:XBombFlag|xBombFlag]] is returned or the bomb itself if no one has control of it.
; string FindTeamDesignation( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI, [[Legacy:Actor|Actor]] A ) (static) : Used to determine the team's designation of the [[Legacy:Actor|Actor]] A.  Returns the string name of the team.
; GameEnding() : Handles the action when a game ends.  In this case it simply turns off the logging.
; class&lt;[[Legacy:Pawn|Pawn]]&gt; GetDefaultPlayerClass( [[Legacy:Controller|Controller]] C ) : Returns an instance of the [[Legacy:Pawn|Pawn]] class that the [[Legacy:Controller|Controller]] C is using as their Pawn. This is called from inside RestartPlayer(), if C.PawnClass couldn't be spawend. RestartPlayer may be overriden and may not call this in your case.
; int GetIntOption( string Options, string ParseString, int CurrentValue ) : Returns the int value from a key-value pair.  Options is the string you is the string of options.  ParseString is the key.  CurrentValue is a default value that the option is set at before calling this method.
; GetKeyValue( string Pair, out string Key, out string Value ) : This utility function breaks the string ''Pair'' into it's key and value.  The key-value pair is a string in the form of &quot;key=value&quot;
; [[Legacy:MapList|MapList]] GetMapList( string MapListType ) : Returns an instance of the class ''MapListType''.
; int GetNumPlayers() : Used to return the number of players in the game.
; GetServerDetails( out ServerResponseLine ServerState ) : Used to return detailed information about the server in the ''ServerResponseLine'' struct defined above.
; GetServerInfo( out ServerResponseLine ServerState ) : Used to return information about the server in the ''ServerResponseLine'' struct defined above.
; GetServerPlayers( out ServerResponseLine ServerState ) : Used to return the information about the players using the ''PlayerResponseLine'' struct defined above.
; int GetServerPort() : Returns the port that the server is operating on.
; bool GrabOption( out string Options, out string Result ) : This utility function is used to grab options from a string.  The option is in the form of &quot;?option1?option2&quot;.  
; bool HasOption( string Options, string InKey ) : Returns ''true'' if the ''InKey'' key has a value in the option string.  ''False'' is returned if the ''InKey'' doesn't exist as a key in the ''Options'' string.
; InitGameReplicationInfo() : Starts the appropriate game information to the [[Legacy:GameReplicationInfo|GameReplicationInfo]] object.  In this case it copies whether it is a team game, the game name, the game class, and the max lives.
; InitLogging() : Starts the logging for the game.  Usually a [[Legacy:GameStats|GameStats]] object that is instantiated specified with a specific class specified by the string ''GameStatsClass''.  
; bool IsOnTeam( [[Legacy:Controller|Controller]] Other, int TeamNum ) : Returns ''true'' if the [[Legacy:Controller|Controller]] ''Other'' is on ''TeamNum'' and returns ''false'' of the ''Other'' is not on the ''TeamNum''.
; Kick( string S ) : ''S'' is the name of the player that is being kicked off the game server.
; KickBan( string S ) : ''S'' is the name of the player that is being kicked off and banned from the game server.  The ''KickBan'' function denies them based on the player's IP address.
; Killed( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : This function handles calling the ''KillEvent'' for the appropriate logging and then handles the death and removal of inventory of the ''KilledPawn''.
; KillEvent( string Killtype, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim, class&lt;[[Legacy:DamageType|DamageType]]&gt; Damage ) : Call when a kill event has taken place.  In this case, the [[Legacy:GameStats|GameStats]] object logs the ''KillEvent''.
; Logout( [[Legacy:Controller|Controller]] Exiting ) : When a player logs out of the game.  ''Exiting'' is the [[Legacy:Controller|Controller]] that is leaving the game.
; NotifyKilled( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn ) : Used to notify the death of ''Killed''.  In this case, each [[Legacy:Controller|Controller]] calls ''NotifiedKilled''.
; [[Legacy:TeamInfo|TeamInfo]] OtherTeam( [[Legacy:TeamInfo|TeamInfo]] Requester ) : Returns the opposing team's information.  In [[Legacy:TeamGame|TeamGame]] if you are the first team it returns the second team's information.
; string ParseChatPercVar( [[Legacy:Mutator|Mutator]] BaseMutator, [[Legacy:Controller|Controller]] Who, string Cmd ) (static) : Calls the ''BaseMutator'' method ''ParseChatPercVar'' and accepts the string that returns.  Then calls the [[Legacy:Controller|Controller]] Who method ''ParseChatPercVar'' and returns that string.  Used for Adreneline and Sheild count?
; string ParseMessageString( [[Legacy:Mutator|Mutator]] BaseMutator, [[Legacy:Controller|Controller]] Who, String Message ) (static) : Parse out the % vars from the ''Message''.  In this case, it simply returns the ''Message''.
; string ParseOption( string Options, string InKey ) : This utility function returns the value of the ''InKey'' parameter from the key-value pair.
; byte PickTeam( byte Current, [[Legacy:Controller|Controller]] C ) : Allows the [[Legacy:Controller|Controller]] C to pick the team ''Current'' if it wasn't already given a team number.
; bool PickupQuery( [[Legacy:Pawn|Pawn]] Other, [[Legacy:Pickup|Pickup]] item ) : Called when the [[Legacy:Pawn|Pawn]] Other touches a [[Legacy:Pickup|Pickup]] and returns ''true'' if the [[Legacy:Pawn|Pawn]] is able and wants to pick it up and returns ''false'' if the Pawn is not able or doesn't want to pick it up.  
; PostLogin( [[Legacy:PlayerController|PlayerController]] NewPlayer ) : Called after a successful login. This is the first place it is safe to call replicated functions on the PlayerPawn.  ''NewPlayer'' is the [[Legacy:PlayerController|PlayerController]] that has successfully logged in.
; PrecacheGameStaticMeshes( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) : 
; PrecacheGameTextures( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) : 
; bool PreventDeath( [[Legacy:Pawn|Pawn]] Killed, [[Legacy:Controller|Controller]] Killer, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector HitLocation ) : Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to prevent the death of the the ''Killed'' [[Legacy:Pawn|Pawn]].  Returns true if Pawn is to remain alive.
; bool PreventSever( [[Legacy:Pawn|Pawn]] Killed, Name boneName, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to prevent the severing of limb of the the ''Killed'' [[Legacy:Pawn|Pawn]].
; ProcessServerTravel( string URL, bool bItems ) : This method handles moving the [[Legacy:PlayerController|PlayerController]] objects to a new ''URL''.  ''bItems'' is a flag that is set to true if items are to move with players and ''false'' if they are to lose them upon traveling.  In this case, the method checks with the [[Legacy:Mutator|Mutator]] list and then calls each individual [[Legacy:PlayerController|PlayerController]] method ''ClientTravel''. 
; float RatePlayerStart( [[Legacy:NavigationPoint|NavigationPoint]] N, byte Team, [[Legacy:Controller|Controller]] Player ) : Rate whether player should choose this NavigationPoint as its start default implementation is for single player game.
; string RecommendCombo( string ComboName ) : Returns a string name of an [[Legacy:Adrenaline|Adrenaline]] Combo that the method recommends to the player.  This is a [[Legacy:Combo|Combo]] that could be randomly selected or based on the ''ComboName'' parameter.
; int ReduceDamage( int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : Determins if the damage should be reduced.  Should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to reduce damage of the ''injured'' [[Legacy:Pawn|Pawn]].  In this case, it checks whether the ''injured'' is a neutral zone, in GodMode, or wearing armor.
; RestartGame() : Restart the game.  Allows the [[Legacy:GameRules|GameRules]] GameRulesModifier list to handle the game restart.  If no GameRules modify how the game restarts then handle the restart of the game.
; RestartPlayer( [[Legacy:Controller|Controller]] aPlayer ) : Restart a player.	
; ReviewJumpSpots( name TestLabel ) : Overridden in [[Legacy:DeathMatch|DeathMatch]] to test all the [[Legacy:JumpSpot|JumpSpot]]s in the level.
; ScoreEvent( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, float Points, string Desc ) : When a score event takes place, this method has the ''Who'', the ''Points'', and the description ''Desc'' of the score event.  In this case, [[Legacy:GameStats|GameStats]] object ''ScoreEvent'' method is called with the above information.
; ScoreKill( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other ) : Determines if the death was caused by surroundings, suicide, or another player and scores the event respectively.  Allows the [[Legacy:GameRules|GameRules]] GameRulesModifier list to handle the ScoreKill.  
; ScoreObjective( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer, Int Score ) : Handles the scoring of ''Scorer''.  This method should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to augment the score of the ''Scorer''.see if this score means the game ends
; SendPlayer( [[Legacy:PlayerController|PlayerController]] aPlayer, string URL ) : Sends [[Legacy:PlayerController|PlayerController]] aPlayer to the ''URL'' specified. This is used when a player changes maps.
; SessionKickBan( string S ) : Ban's the player by calling the [[Legacy:AccessControl|AccessControl]] method ''SessionKickBan'' which removes the player and blocks the IP address from joining again.
; SetGameSpeed( float T ) : Sets the speed of the game.  In this instance it sets the game speed and the time dilation of the level and then stores any changes of game speed.
; bool SetPause( bool bPause, [[Legacy:PlayerController|PlayerController]] P ) :  Pauses/Unpauses the game if the [[Legacy:PlayerController|PlayerController]] is allowed to pause/unpause the game.
; SetPlayerDefaults( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Sets the default characteristics of the ''PlayerPawn''.  In this case they sit AirControl, GroundSpeed, WaterSpeed, AirSpeed, Acceleration, JumpZ.  Then it allows the [[Legacy:Mutator|Mutator]] list to augment these values.
; SetWeaponViewShake( [[Legacy:PlayerController|PlayerController]] P ) : Sets the [[Legacy:PlayerController|PlayerController]] weapon to shake.  In this case it it determines whether ''bWeaponShouldViewShake'' and ''bModViewShake'' are both true and then calls PlayerController's ''ClientSetWeaponViewShake''.
; bool ShouldRespawn( [[Legacy:Pickup|Pickup]] Other ) : Returns ''true'' if the [[Legacy:Pickup|Pickup]] should respawn and ''false'' if it should not respawn.  In this case, it checks what the game type (Standalone games do not respawn) and then with the ''RespawnTime'' of the item.
; StartMatch() : Starts the game.  Informs all actors that the match is starting and spawn player's pawns.
; TeamScoreEvent( int Team, float Points, string Desc ) : When a team score event takes place, this method has the ''Who'', the ''Points'', and the description ''Desc'' of the team score event.  In this case, [[Legacy:GameStats|GameStats]] object ''TeamScoreEvent'' method is called with the above information.
; bool TooManyBots( [[Legacy:Controller|Controller]] botToRemove ) : Returns ''true'' if there are too many bots and returns ''false'' if there are not too many bots.  In this case, it always returns ''false''.
; bool UseLowGore() (static) : Returns whether to display less gore. (i.e., green blood instead of red blood and no gibs)

==Known Subclasses ==
 GameInfo
    +- [[Legacy:CinematicGame|CinematicGame]]
    +- [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]
        +- [[Legacy:DeathMatch|DeathMatch]]
             +- [[Legacy:TeamGame|TeamGame]]
             |   +- [[Legacy:CTFGame|CTFGame]]
             |   |   +- [[Legacy:XCTFGame|xCTFGame]]
             |   |       +- [[Legacy:InstagibCTF|InstagibCTF]] (UT200x)
             |   |       +- [[Legacy:XVehicleCTFGame|xVehicleCTFGame]] (UT2004)
             |   +- [[Legacy:XBombingRun|xBombingRun]] (UT200x)
             |   +- [[Legacy:XDoubleDom|xDoubleDom]] (UT200x)
             |   +- [[Legacy:XTeamGame|xTeamGame]]
             |       +- [[Legacy:ASGameInfo|ASGameInfo]] (UT2004)
             |       +- [[Legacy:Invasion|Invasion]] (UT2004)
             |       +- [[Legacy:ONSOnslaughtGame|ONSOnslaughtGame]] (UT2004)
             +- [[Legacy:XDeathMatch|xDeathMatch]]
                +- [[Legacy:BossDM|BossDM]]
                +- [[Legacy:XLastManStandingGame|xLastManStandingGame]] (UT2004)
                +- [[Legacy:XMutantGame|xMutantGame]] (UT2004)
               

----

'''JCBDigger:''' Anyone have some example code for GetServerDetails( ... ) and GetServerInfo( ... ) for a mutator.  I have been trying to get the MapName back to display on a menu from a mutator, but just get blank strings!

For anyone interested, I used a different method to get what I wanted.

The parent class of Mutator is the Map Name I needed.

&lt;uscript&gt;
class MyMutator extends Mutator;

function string GetThisMapName()
{
  local string sParentClass, sClassTree, sThisClass;
  sClassTree = string(self);    // e.g. DM-1on1-MyLevel.MyMutator
  sThisClass = string(self.name);    // e.g. MyMutator
  // take one from the other to leave DM-1on1-MyLevel
  sParentClass = left(sClassTree, (InStr(sClassTree,sThisClass) -1));  // e.g. DM-1on1-MyLevel
  return sParentClass;
}
&lt;/uscript&gt;

There must be a better way.

'''Mortal Monkey:''' Try this: &lt;uscript&gt;sClassTree = string(self.class);&lt;/uscript&gt; Other that that you coud use Actor's ''string GetURLMap()'', or find the map's title in ''LevelInfo.Title''.

'''Wormbo:''' To get the map's package name you can just use &lt;code&gt;string(Outer)&lt;/code&gt; in any Actor. For the map's title you'd use &lt;code&gt;Level.Title&lt;/code&gt;, again this works in every Actor.

'''OlympusMons:''' Maybe a [[Legacy:GameInfo (UT2003)|GameInfo (UT2003)]] or [[Legacy:GameInfo (UT2004)|GameInfo (UT2004)]] page is in order then.

----

[[:Category:Legacy Class (UT2004)]] &amp;ndash; Looks like there are enough differences that 2k4 should have it's own version of this page.&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy Class Tree]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3305</id>
      <timestamp>2006-06-22T14:33:45Z</timestamp>
      <contributor>
        <ip>NogginBasher</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameInfo (Package: Engine)}}

See [[Legacy:GameInfo_(UT)|GameInfo_(UT)]] for the UT version of this class.

The GameInfo defines the game being played: the game rules, scoring, what actors are allowed to exist in this game type, and who may enter the game. While the GameInfo class is the public interface, much of this functionality is delegated to several classes to allow easy modification of specific game components. These  classes include GameInfo, AccessControl, Mutator, BroadcastHandler, and GameRules. A GameInfo actor is instantiated when the level is initialized for gameplay (in C++ UGameEngine::LoadMap( ) ).  The class of this GameInfo actor is determined by (in order):
# the DefaultGameType if specified in the [[Legacy:LevelInfo|LevelInfo]]
# the DefaultGame entry in the [[Legacy:Game Ini File|game ini file]] (in the Engine.Engine section), unless it's a network game in which case the DefaultServerGame entry is used.

==Structs==

===KeyValuePair ===

Contains a string key with a corresponding string value.
; string Key : 
; string Value :

===PlayerResponseLine (native export)===

Contains information about the player, 
; int PlayerNum : The number given to the player.
; string PlayerName : The name of the player.
; int Ping : The ping from the server to the player.
; int Score : The score of the player.
; int StatsID : The ID used to maintain stats about the player

===ServerResponseLine (native export)===
; int ServerID : The ID of the server.
; string IP : The IP adress of the server.
; int Port : The port that the Unreal Server is running on.
; int QueryPort :
; string ServerName : The name of the Server.
; string MapName : The name of the current map.
; string GameType : The name of the current game.
; int CurrentPlayers : The current number of players on the server.
; int MaxPlayers : The maximum number of players allowed in the game.
; int Ping : The ping to the server.
; array&lt;KeyValuePair&gt; ServerInfo : A detailed list of what is loaded on the  server (Mutators,GameRules,etc...).
; array&lt;PlayerResponseLine&gt; PlayerInfo : A list of the Players on the server.

===VoiceChatterInfo ===
; [[Legacy:Controller|Controller]] Controller : 
; int IpAddr : 
; int Handle : 

==Properties==

===Globalconfig===
; bool bChangeLevels : ''True'' if the game is allowed to change levels and ''false'' if the game is not allowed to change levels.
; bool bEnableStatLogging : ''True'' the game will be enabled to track stats and ''false'' the game will not track stats.
; bool bAdminCanPause : ''True'' the game is pauseable by the admin and ''false'' if the game is not pauseable by the admin.
; bool bWeaponShouldViewShake : ''True'' the weapon will shake the view and ''false'' the weapon will not shake the view.
; float GameDifficulty : 
; int GoreLevel : 0 is normal gore, while increasing the value will yield less gore.
; float AutoAim : 1 is no aiming and 0 is always auto-aiming  (cosine of max error to correct).
; float GameSpeed : The scale applied to the rate of the game.
; int MaxSpectators : The Maximum number of spectators.
; int MaxPlayers : The Maximum number of players.
; string AccessControlClass : The class name of the AccessControl class.
; string GameStatsClass : The class name of the GameStats class.

===Config===
; bool bWeaponStay : ''True'' the weapons stay when picked up and ''False'' they do not stay when picked up. 
; bool bAllowWeaponThrowing : ''True'' if the [[Legacy:Pawn|Pawn]] is allowed to throw their weapon and ''false'' if they are not allowed to throw their weapons.
; bool bAllowBehindView : ''True'' if the [[Legacy:PlayerController|PlayerController]] is allowed to view their [[Legacy:Pawn|Pawn]] from behind and ''false'' if the behind view is not allowed.
; int GoalScore : The goal score of the level.
; int MaxLives : The maximum lives a player has on the level.  (0 means there is not limit).
; int TimeLimit : The time limit of the game.

===Localized===
; bool bAlternateMode : Used when setting the gore level of the game.
; string DefaultPlayerName : The default name of the player when they have not specified a name.
; string GameName : The name of the game.

===Main===
; bool bRestartLevel : ''True'' if the level needs to be restarted and ''false'' if it does not need to be restarted.
; bool bPauseable :  ''True'' if the game is pauseable and ''false'' if the game is not pauseable.
; bool bCanChangeSkin : ''True'' if the [[Legacy:Controller|Controller]] can change the skin of the of the [[Legacy:Pawn|Pawn]].
; bool bTeamGame : ''True'' if the game is a team game and ''false'' if the game is not a team game.
; bool GameEnded : ''True'' if the game has ended and ''false'' if the game has not ended.
; bool bOverTime : ''True'' if the game is in overtime (because a win condition hasn't been met) and ''false'' if the game is not in overtime.
; bool bCanViewOthers : ''True'' if a [[Legacy:PlayerController|PlayerController]] is able to view other players in spectator mode and ''false'' if they are unable to view other players.
; bool bDelayedStart :  ''True'' if the start of a [[Legacy:Controller|Controller]]'s game start is delayed and ''false'' if it is not delayed. 
; bool bWaitingToStartMatch : ''True'' if the match is being waiting to start and ''false'' if the game has started. 
; bool bAlreadyChanged :
; bool bLoggingGame : ''True'' if the game is a logged game and ''false'' if the game is not being logged.
; bool bGameRestarted : 
; bool bModViewShake : ''True'' if the game allows for weapon shaking and ''false'' if the game does not allow weapon shaking.
; bool bForceClassicView :
; float StartTime : 
; string ScoreBoardType : The class name of the [[Legacy:ScoreBoard|ScoreBoard]] that is loaded for this game.
; string BotMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the game bots.
; string RulesMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the rules.
; string SettingsMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the game settings.
; string GameUMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game dropdown.
; string MultiplayerUMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for multiplayer dropdown.
; string GameOptionsMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for options dropdown.
; string HUDType : The class name of the [[Legacy:HUD|HUD]] that is loaded for the game.
; string MapListType : The class name of the [[Legacy:MapList|MapList]] that is loaded for this game.
; string MapPrefix : The prefix designation that the game uses for it's maps.
; string BeaconName : Identifying string used for finding LAN servers.
; int NumSpectators : The current number of spectators in the game.
; int NumPlayers : The current number of players in the game.
; int NumBots : The current number of bots in the game.
; int CurrentID : The game server ID.
; float FearCostFallOff : The rate at which the FearCost in NavigationPoints decreases over time.
; class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; DeathMessageClass : The message class that handles the messages concerned with death of a [[Legacy:Pawn|Pawn]].
; class&lt;[[Legacy:GameMessage|GameMessage]]&gt; GameMessageClass : The message class that handles the messages in the game.
; name OtherMesgGroup : 
; string MutatorClass : The class name of the '''BaseMutator'''.
; [[Legacy:Mutator|Mutator]] BaseMutator : The reference to the first mutator in the [[Legacy:Linked List|linked list]] of Mutators.
; [[Legacy:AccessControl|AccessControl]] AccessControl : The instance of the [[Legacy:AccessControl|AccessControl]] class that handles the security, banning and various other administrative tasks.
; [[Legacy:GameRules|GameRules]] GameRulesModifiers : The reference to the Linked-List of [[Legacy:GameRules|GameRules]].
; string BroadcaseHandlerClass : The class name for the '''BroadCastHandler'''.
; [[Legacy:BroadcastHandler|BroadcastHandler]] BroadcastHandler : The reference to the Linked-List of [[Legacy:BroadCastHandler|BroadCastHandler]].
; class&lt;[[Legacy:PlayerController|PlayerController]]&gt; PlayerControllerClass :  The specific class of the [[Legacy:PlayerController|PlayerController]] in this game.
; string PlayerControllerClassName : The class name of the '''PlayerControllerClass'''. This should be set while the PlayerControllerClass is dynamically loaded using this string.
; class&lt;[[Legacy:GameReplicationInfo|GameReplicationInfo]]&gt; GameReplicationInfoClass : The class that contains [[Legacy:Replication|Replication]] info about the game.
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GameReplicationInfo : The instance of the [[Legacy:GameReplicationInfo|GameReplicationInfo]] class that contains important information concerning the game and the server.
; bool bWelcomePending : ''True'' if the welcome message is still needed to be given to a new player, and ''False'' if the welcome message has already been presented.
; [[Legacy:GameStats|GameStats]] GameStats : The instance of the [[Legacy:GameStats|GameStats]] where events and information are logged.
; array&lt;VoiceChatterInfo&gt; VoiceChatters :
; String ScreenShotName :
; String DecoTextName :
; String Acronym : 
; [[Legacy:GameProfile|GameProfile]] CurrentGameProfile (transient) : Persistant game data management.
; [[Legacy:Manifest|Manifest]] SaveGameManifest (private const) : persistant game data management.
; bool bAttractCam : 

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed() :  Used to destroy the GameInfo object.  Destroys the [[Legacy:GameProfile|GameProfile]] and then calls Actor's ''Destroy''.
; PostBeginPlay() : Called right after play starts.  This function is used to initialize variables and objects that are set after play has just begun or gotten underway.
; PreBeginPlay() : Called before play starts.  This function is used to initialize varibles and objects that need to be set before the game begins.  In this case, GameInfo sets start time, gamespeed and starts logging and the game replication info.
; Reset() : Used for restarting the level.  Returns the GameInfo Object to it's initial state.
; Timer() : Used to handle events at a given time interval that is important to the GameInfo object.  In this case it makes sure that all players have been welcomed to the server. 
; UpdatePrecacheMaterials() : Precaches textures used in the map by calling PrecacheGameTextures.
; UpdatePrecacheStaticMeshes() : Precaches the static meshes used in the map by calling PrecacheGameStaticMeshes.

===Inherited From [[Legacy:Info|Info]]===
; FillPlayInfo( [[Legacy:PlayInfo|PlayInfo]] PlayInfo ) (static) :  Used to load a PlayInfo with appropriate information about the game.  Which should be added to the [[Legacy:GameReplicationInfo|GameReplicationInfo]] so that the information is retreivable by all players.

===Events===
; AcceptInventory( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Examine the passed player's inventory, and accept or discard each item.  AcceptInventory needs to gracefully handle the case of some inventory being accepted but other inventory not being accepted (such as the default weapon).  There are several things that can go wrong: A weapon's AmmoType not being accepted but the weapon being accepted &amp;ndash; the weapon should be killed off. Or the player's selected inventory item, active weapon, etc. not being accepted, leaving the player weaponless or leaving the HUD inventory rendering messed up (AcceptInventory should pick another applicable weapon/item as current).
; PreLogin( string Options, string Address, string PlayerID, out string Error, out string FailCode ) : Accept or reject a player on the server.  Fails login if you set the Error to a non-empty string.
; Broadcast( [[Legacy:Actor|Actor]] Sender, coerce string Msg, optional name Type ) : Passes this information on to the BroadCastHandler object's method ''Broadcast''.
; DetailChange() : This event takes place when the detail level changes from low to high or high to low.
; string GetBeaconText() : Return beacon text for serverbeacon.
; InitGame( string Options, out string Error ) : The GameInfo's InitGame( ) function is called before any other scripts (including PreBeginPlay( ) ), and is used by the GameInfo to initialize parameters and spawn its helper classes.  Warning: this is called before actors' PreBeginPlay.  The ''Options'' string contains the key-value pairs of options for the game.  ''Error'' contains error information during the initializing of the game.  In this case, it loads all the game speed, max players, password, mutators, game rules, etc...
; PlayerController Login( string Portal, string Options, out string Error ) : Fails login if you set the Error string. PreLogin is called before Login, but significant game time may pass before Login is called, especially if content is downloaded.

===Exec Functions===
; AdminSay( string Msg ) : Sends ''Msg'' to to all [[Legacy:PlayerControllers|PlayerControllers]].
; KillBots( int num ) : This methods destroys ''num'' bots.

===Iterators===
; AllDataObjects( [[Legacy:Class|class]] objClass, out Object obj, string packageName ) (native, final) : Iterates through all data objects in a package created with the ''SavePackage'' function.

===Native Functions===
; [[Legacy:Object|Object]] CreateDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) :
; bool DeleteDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) : Returns ''true'' if this method is able to delete the instance of the object.
; bool DeletePackage( string packageName ) (final) : Returns ''true'' if the package labeled ''packageName'' has been deleted and ''false'' if the package was not deleted.
; string GetNetworkNumber() : Replication related function.
; [[Legacy:Manifest|Manifest]] GetSavedGames() (final) : Returns a [[Legacy:Manifest|Manifest]] of saved games.
; [[Legacy:Object|Object]] LoadDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) : Creates an instance of the ''objClass'' from the ''packageName'' with the ''packageName'' as its name.
; LoadMapList( string MapPrefix, out array&lt;string&gt; Maps ) (static, final) : Returns an array of Map names with the following ''MapPrefix''.
; string ParseKillMessage( string KillerName, string VictimName, string DeathMessage ) [static] : 
; bool SavePackage( string packageName ) (final) : Returns ''true'' if the package labeled ''packageName'' has been saved and returns ''false'' if the package was not saved.

===Other Methods ===
; AddDefaultInventory( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Add to the [[Legacy:Pawn|Pawn]] specific [[Legacy:Inventory|Inventory]] items required for the game.  In this case, the base mutator is queried for the default weapon and it is added to the inventory and made so it is not throwable.  Then it calls ''SetPlayerDefaults''.
; AddGameSpecificInventory( [[Legacy:Pawn|Pawn]] p ) : Add to the [[Legacy:Pawn|Pawn]] specific [[Legacy:Inventory|Inventory]] items required for the game.  This is the same as ''AddDefaultInventory'' method except that it does not call ''SetPlayerDefaults'' when it is done.
; AddMutator( string mutname, optional bool bUserAdded ) : Utility function that creates a physical instance of the ''mutname'' class and then adds it to the '''BaseMutator''' variable.
; bool AtCapacity( bool bSpectator ) : Returns ''true'' if the game is at capacity and returns ''false'' if the the server is not at capacity.  ''bSpectator'' is used to specify for which type of capactity.  if ''bSpectator'' is false then you are asking if there is room for more players.  If ''bSpectator'' is true then you are asking if there is room for more spectators.
; BroadcastDeathMessage( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : Broadcase a message that [[Legacy:Controller|Controller]] Killer has killed himself or another player.
; BroadcastLocalized( [[Legacy:Actor|Actor]] Sender, class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) :  Broadcast a localized message to all players.  Most message deal with 0 to 2 related PRIs.  The [[Legacy:LocalMessage|LocalMessage]] class defines how the PRI's and optional actor are used.
; BroadcastTeam( [[Legacy:Controller|Controller]] Sender, coerce string Msg, optional name Type ) : Passes this information on to the BroadCastHandler object's method ''BroadcastTeam''.
; bool CanSpectate( [[Legacy:PlayerController|PlayerController]] Viewer, bool bOnlySpectator, [[Legacy:Actor|Actor]] ViewTarget ) : Returns ''true'' if the ''Viewer'' is able to spectate in the game of the following [[Legacy:Actor|Actor]] ''ViewTarget'' and returns ''false'' if the ''Viewer'' may not.  In this case it always returns true.
; ChangeMap( int ContextID ) : Changes the map that is currently being played to the one specified by the ContextID.  
; ChangeName( [[Legacy:Controller|Controller]] Other, coerce string S, bool bNameChange ) : If ''bNameChange'' is allowing name changes then change the name of [[Legacy:Controller|Controller]] Other's name to ''S''.
; bool ChangeTeam( [[Legacy:Controller|Controller]] Other, int N, bool bNewTeam ) : If ''bNewTeam'' is allowing team changes then change [[Legacy:Controller|Controller]] Other's team to team number ''N''.
; ChangeVoiceChatter( [[Legacy:Controller|Controller]] Client, int IpAddr, int Handle, bool Add ) :
; bool CheckEndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) : Called when the game is over.  Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to handle the end game.  In this case, if no GameRules modifies the end game then it loops through each [[Legacy:Controller|Controller]] and calls ''ClientGameEnded'' and ''GameHasEnded''.
; CheckScore( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer ) : Sees if this score means the game ends.  This method should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to augment the determination of the end game for this ''Scorer''.
; DiscardInventory( [[Legacy:Pawn|Pawn]] Other ) : Removes and destroys all the [[Legacy:Inventory|Inventory]] of the [[Legacy:Pawn|Pawn]] Other's [[Legacy:Inventory|Inventory]].
; EndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) : The end of the game has been reached.  In this case, it calls ''CheckEndGame'' to see if perhaps the winning conditions have not been reached.   Then sets the ''bGameEnded'' to false and then Triggers the event ''EndGame''.
; EndLogging( string Reason ) : Used to close and destroy all the logging classes in the GameInfo class.
; string FindPlayerByID( int PlayerID ) : Returns the name of the player given a ''playerID''.
; [[Legacy:NavigationPoint|NavigationPoint]] FindPlayerStart( [[Legacy:Controller|Controller]] Player, option byte inTeam, optional string incomingName ) : Return the 'best' player start for this player to start from.
; [[Legacy:Actor|Actor]] FindSpecGoalFor( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, int TeamIndex ) : Returns an actor that has special goal or situation taking place.  For example, in [[Legacy:XBombingRun|xBombingRun]] games the [[Legacy:Pawn|Pawn]] with the [[Legacy:XBombFlag|xBombFlag]] is returned or the bomb itself if no one has control of it.
; string FindTeamDesignation( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI, [[Legacy:Actor|Actor]] A ) (static) : Used to determine the team's designation of the [[Legacy:Actor|Actor]] A.  Returns the string name of the team.
; GameEnding() : Handles the action when a game ends.  In this case it simply turns off the logging.
; class&lt;[[Legacy:Pawn|Pawn]]&gt; GetDefaultPlayerClass( [[Legacy:Controller|Controller]] C ) : Returns an instance of the [[Legacy:Pawn|Pawn]] class that the [[Legacy:Controller|Controller]] C is using as their Pawn. This is called from inside RestartPlayer(), if C.PawnClass couldn't be spawend. RestartPlayer may be overriden and may not call this in your case.
; int GetIntOption( string Options, string ParseString, int CurrentValue ) : Returns the int value from a key-value pair.  Options is the string you is the string of options.  ParseString is the key.  CurrentValue is a default value that the option is set at before calling this method.
; GetKeyValue( string Pair, out string Key, out string Value ) : This utility function breaks the string ''Pair'' into it's key and value.  The key-value pair is a string in the form of &quot;key=value&quot;
; [[Legacy:MapList|MapList]] GetMapList( string MapListType ) : Returns an instance of the class ''MapListType''.
; int GetNumPlayers() : Used to return the number of players in the game.
; GetServerDetails( out ServerResponseLine ServerState ) : Used to return detailed information about the server in the ''ServerResponseLine'' struct defined above.
; GetServerInfo( out ServerResponseLine ServerState ) : Used to return information about the server in the ''ServerResponseLine'' struct defined above.
; GetServerPlayers( out ServerResponseLine ServerState ) : Used to return the information about the players using the ''PlayerResponseLine'' struct defined above.
; int GetServerPort() : Returns the port that the server is operating on.
; bool GrabOption( out string Options, out string Result ) : This utility function is used to grab options from a string.  The option is in the form of &quot;?option1?option2&quot;.  
; bool HasOption( string Options, string InKey ) : Returns ''true'' if the ''InKey'' key has a value in the option string.  ''False'' is returned if the ''InKey'' doesn't exist as a key in the ''Options'' string.
; InitGameReplicationInfo() : Starts the appropriate game information to the [[Legacy:GameReplicationInfo|GameReplicationInfo]] object.  In this case it copies whether it is a team game, the game name, the game class, and the max lives.
; InitLogging() : Starts the logging for the game.  Usually a [[Legacy:GameStats|GameStats]] object that is instantiated specified with a specific class specified by the string ''GameStatsClass''.  
; bool IsOnTeam( [[Legacy:Controller|Controller]] Other, int TeamNum ) : Returns ''true'' if the [[Legacy:Controller|Controller]] ''Other'' is on ''TeamNum'' and returns ''false'' of the ''Other'' is not on the ''TeamNum''.
; Kick( string S ) : ''S'' is the name of the player that is being kicked off the game server.
; KickBan( string S ) : ''S'' is the name of the player that is being kicked off and banned from the game server.  The ''KickBan'' function denies them based on the player's IP address.
; Killed( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : This function handles calling the ''KillEvent'' for the appropriate logging and then handles the death and removal of inventory of the ''KilledPawn''.
; KillEvent( string Killtype, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim, class&lt;[[Legacy:DamageType|DamageType]]&gt; Damage ) : Call when a kill event has taken place.  In this case, the [[Legacy:GameStats|GameStats]] object logs the ''KillEvent''.
; Logout( [[Legacy:Controller|Controller]] Exiting ) : When a player logs out of the game.  ''Exiting'' is the [[Legacy:Controller|Controller]] that is leaving the game.
; NotifyKilled( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn ) : Used to notify the death of ''Killed''.  In this case, each [[Legacy:Controller|Controller]] calls ''NotifiedKilled''.
; [[Legacy:TeamInfo|TeamInfo]] OtherTeam( [[Legacy:TeamInfo|TeamInfo]] Requester ) : Returns the opposing team's information.  In [[Legacy:TeamGame|TeamGame]] if you are the first team it returns the second team's information.
; string ParseChatPercVar( [[Legacy:Mutator|Mutator]] BaseMutator, [[Legacy:Controller|Controller]] Who, string Cmd ) (static) : Calls the ''BaseMutator'' method ''ParseChatPercVar'' and accepts the string that returns.  Then calls the [[Legacy:Controller|Controller]] Who method ''ParseChatPercVar'' and returns that string.  Used for Adreneline and Sheild count?
; string ParseMessageString( [[Legacy:Mutator|Mutator]] BaseMutator, [[Legacy:Controller|Controller]] Who, String Message ) (static) : Parse out the % vars from the ''Message''.  In this case, it simply returns the ''Message''.
; string ParseOption( string Options, string InKey ) : This utility function returns the value of the ''InKey'' parameter from the key-value pair.
; byte PickTeam( byte Current, [[Legacy:Controller|Controller]] C ) : Allows the [[Legacy:Controller|Controller]] C to pick the team ''Current'' if it wasn't already given a team number.
; bool PickupQuery( [[Legacy:Pawn|Pawn]] Other, [[Legacy:Pickup|Pickup]] item ) : Called when the [[Legacy:Pawn|Pawn]] Other touches a [[Legacy:Pickup|Pickup]] and returns ''true'' if the [[Legacy:Pawn|Pawn]] is able and wants to pick it up and returns ''false'' if the Pawn is not able or doesn't want to pick it up.  
; PostLogin( [[Legacy:PlayerController|PlayerController]] NewPlayer ) : Called after a successful login. This is the first place it is safe to call replicated functions on the PlayerPawn.  ''NewPlayer'' is the [[Legacy:PlayerController|PlayerController]] that has successfully logged in.
; PrecacheGameStaticMeshes( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) : 
; PrecacheGameTextures( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) : 
; bool PreventDeath( [[Legacy:Pawn|Pawn]] Killed, [[Legacy:Controller|Controller]] Killer, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector HitLocation ) : Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to prevent the death of the the ''Killed'' [[Legacy:Pawn|Pawn]].  Returns true if Pawn is to remain alive.
; bool PreventSever( [[Legacy:Pawn|Pawn]] Killed, Name boneName, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to prevent the severing of limb of the the ''Killed'' [[Legacy:Pawn|Pawn]].
; ProcessServerTravel( string URL, bool bItems ) : This method handles moving the [[Legacy:PlayerController|PlayerController]] objects to a new ''URL''.  ''bItems'' is a flag that is set to true if items are to move with players and ''false'' if they are to lose them upon traveling.  In this case, the method checks with the [[Legacy:Mutator|Mutator]] list and then calls each individual [[Legacy:PlayerController|PlayerController]] method ''ClientTravel''. 
; float RatePlayerStart( [[Legacy:NavigationPoint|NavigationPoint]] N, byte Team, [[Legacy:Controller|Controller]] Player ) : Rate whether player should choose this NavigationPoint as its start default implementation is for single player game.
; string RecommendCombo( string ComboName ) : Returns a string name of an [[Legacy:Adrenaline|Adrenaline]] Combo that the method recommends to the player.  This is a [[Legacy:Combo|Combo]] that could be randomly selected or based on the ''ComboName'' parameter.
; int ReduceDamage( int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : Determins if the damage should be reduced.  Should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to reduce damage of the ''injured'' [[Legacy:Pawn|Pawn]].  In this case, it checks whether the ''injured'' is a neutral zone, in GodMode, or wearing armor.
; RestartGame() : Restart the game.  Allows the [[Legacy:GameRules|GameRules]] GameRulesModifier list to handle the game restart.  If no GameRules modify how the game restarts then handle the restart of the game.
; RestartPlayer( [[Legacy:Controller|Controller]] aPlayer ) : Restart a player.	
; ReviewJumpSpots( name TestLabel ) : Overridden in [[Legacy:DeathMatch|DeathMatch]] to test all the [[Legacy:JumpSpot|JumpSpot]]s in the level.
; ScoreEvent( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, float Points, string Desc ) : When a score event takes place, this method has the ''Who'', the ''Points'', and the description ''Desc'' of the score event.  In this case, [[Legacy:GameStats|GameStats]] object ''ScoreEvent'' method is called with the above information.
; ScoreKill( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other ) : Determines if the death was caused by surroundings, suicide, or another player and scores the event respectively.  Allows the [[Legacy:GameRules|GameRules]] GameRulesModifier list to handle the ScoreKill.  
; ScoreObjective( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer, Int Score ) : Handles the scoring of ''Scorer''.  This method should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to augment the score of the ''Scorer''.see if this score means the game ends
; SendPlayer( [[Legacy:PlayerController|PlayerController]] aPlayer, string URL ) : Sends [[Legacy:PlayerController|PlayerController]] aPlayer to the ''URL'' specified. This is used when a player changes maps.
; SessionKickBan( string S ) : Ban's the player by calling the [[Legacy:AccessControl|AccessControl]] method ''SessionKickBan'' which removes the player and blocks the IP address from joining again.
; SetGameSpeed( float T ) : Sets the speed of the game.  In this instance it sets the game speed and the time dilation of the level and then stores any changes of game speed.
; bool SetPause( bool bPause, [[Legacy:PlayerController|PlayerController]] P ) :  Pauses/Unpauses the game if the [[Legacy:PlayerController|PlayerController]] is allowed to pause/unpause the game.
; SetPlayerDefaults( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Sets the default characteristics of the ''PlayerPawn''.  In this case they sit AirControl, GroundSpeed, WaterSpeed, AirSpeed, Acceleration, JumpZ.  Then it allows the [[Legacy:Mutator|Mutator]] list to augment these values.
; SetWeaponViewShake( [[Legacy:PlayerController|PlayerController]] P ) : Sets the [[Legacy:PlayerController|PlayerController]] weapon to shake.  In this case it it determines whether ''bWeaponShouldViewShake'' and ''bModViewShake'' are both true and then calls PlayerController's ''ClientSetWeaponViewShake''.
; bool ShouldRespawn( [[Legacy:Pickup|Pickup]] Other ) : Returns ''true'' if the [[Legacy:Pickup|Pickup]] should respawn and ''false'' if it should not respawn.  In this case, it checks what the game type (Standalone games do not respawn) and then with the ''RespawnTime'' of the item.
; StartMatch() : Starts the game.  Informs all actors that the match is starting and spawn player's pawns.
; TeamScoreEvent( int Team, float Points, string Desc ) : When a team score event takes place, this method has the ''Who'', the ''Points'', and the description ''Desc'' of the team score event.  In this case, [[Legacy:GameStats|GameStats]] object ''TeamScoreEvent'' method is called with the above information.
; bool TooManyBots( [[Legacy:Controller|Controller]] botToRemove ) : Returns ''true'' if there are too many bots and returns ''false'' if there are not too many bots.  In this case, it always returns ''false''.
; bool UseLowGore() (static) : Returns whether to display less gore. (i.e., green blood instead of red blood and no gibs)

==Known Subclasses ==
 GameInfo
    +- [[Legacy:CinematicGame|CinematicGame]]
    +- [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]
        +- [[Legacy:DeathMatch|DeathMatch]]
             +- [[Legacy:TeamGame|TeamGame]]
             |   +- [[Legacy:CTFGame|CTFGame]]
             |   |   +- [[Legacy:XCTFGame|xCTFGame]]
             |   |       +- [[Legacy:InstagibCTF|InstagibCTF]] (UT200x)
             |   |       +- [[Legacy:XVehicleCTFGame|xVehicleCTFGame]] (UT2004)
             |   +- [[Legacy:XBombingRun|xBombingRun]] (UT200x)
             |   +- [[Legacy:XDoubleDom|xDoubleDom]] (UT200x)
             |   +- [[Legacy:XTeamGame|xTeamGame]]
             |       +- [[Legacy:ASGameInfo|ASGameInfo]] (UT2004)
             |       +- [[Legacy:Invasion|Invasion]] (UT2004)
             |       +- [[Legacy:ONSOnslaughtGame|ONSOnslaughtGame]] (UT2004)
             +- [[Legacy:XDeathMatch|xDeathMatch]]
                +- [[Legacy:BossDM|BossDM]]
                +- [[Legacy:XLastManStandingGame|xLastManStandingGame]] (UT2004)
                +- [[Legacy:XMutantGame|xMutantGame]] (UT2004)
               

----

'''JCBDigger:''' Anyone have some example code for GetServerDetails( ... ) and GetServerInfo( ... ) for a mutator.  I have been trying to get the MapName back to display on a menu from a mutator, but just get blank strings!

For anyone interested, I used a different method to get what I wanted.

The parent class of Mutator is the Map Name I needed.

&lt;uscript&gt;
class MyMutator extends Mutator;

function string GetThisMapName()
{
  local string sParentClass, sClassTree, sThisClass;
  sClassTree = string(self);    // e.g. DM-1on1-MyLevel.MyMutator
  sThisClass = string(self.name);    // e.g. MyMutator
  // take one from the other to leave DM-1on1-MyLevel
  sParentClass = left(sClassTree, (InStr(sClassTree,sThisClass) -1));  // e.g. DM-1on1-MyLevel
  return sParentClass;
}
&lt;/uscript&gt;

There must be a better way.

'''Mortal Monkey:''' Try this: &lt;uscript&gt;sClassTree = string(self.class);&lt;/uscript&gt; Other that that you coud use Actor's ''string GetURLMap()'', or find the map's title in ''LevelInfo.Title''.

'''Wormbo:''' To get the map's package name you can just use &lt;code&gt;string(Outer)&lt;/code&gt; in any Actor. For the map's title you'd use &lt;code&gt;Level.Title&lt;/code&gt;, again this works in every Actor.

'''OlympusMons:''' Maybe a [[Legacy:GameInfo (UT2003)|GameInfo (UT2003)]] or [[Legacy:GameInfo (UT2004)|GameInfo (UT2004)]] page is in order then.

----

[[:Category:Legacy Class (UT2004)]] &amp;ndash; Looks like there are enough differences that 2k4 should have it's own version of this page.&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy Class Tree]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10880</id>
      <timestamp>2008-04-07T19:54:20Z</timestamp>
      <contributor>
        <username>Hyde</username>
        <id>122</id>
      </contributor>
      <minor/>
      <comment>Minor spelling correction.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameInfo (Package: Engine)}}

See [[Legacy:GameInfo_(UT)|GameInfo_(UT)]] for the UT version of this class.

The GameInfo defines the game being played: the game rules, scoring, what actors are allowed to exist in this game type, and who may enter the game. While the GameInfo class is the public interface, much of this functionality is delegated to several classes to allow easy modification of specific game components. These  classes include GameInfo, AccessControl, Mutator, BroadcastHandler, and GameRules. A GameInfo actor is instantiated when the level is initialized for gameplay (in C++ UGameEngine::LoadMap( ) ).  The class of this GameInfo actor is determined by (in order):
# the DefaultGameType is specified in the [[Legacy:LevelInfo|LevelInfo]]
# the DefaultGame entry in the [[Legacy:Game Ini File|game ini file]] (in the Engine.Engine section), unless it's a network game in which case the DefaultServerGame entry is used.

==Structs==

===KeyValuePair ===

Contains a string key with a corresponding string value.
; string Key : 
; string Value :

===PlayerResponseLine (native export)===

Contains information about the player, 
; int PlayerNum : The number given to the player.
; string PlayerName : The name of the player.
; int Ping : The ping from the server to the player.
; int Score : The score of the player.
; int StatsID : The ID used to maintain stats about the player

===ServerResponseLine (native export)===
; int ServerID : The ID of the server.
; string IP : The IP adress of the server.
; int Port : The port that the Unreal Server is running on.
; int QueryPort :
; string ServerName : The name of the Server.
; string MapName : The name of the current map.
; string GameType : The name of the current game.
; int CurrentPlayers : The current number of players on the server.
; int MaxPlayers : The maximum number of players allowed in the game.
; int Ping : The ping to the server.
; array&lt;KeyValuePair&gt; ServerInfo : A detailed list of what is loaded on the  server (Mutators,GameRules,etc...).
; array&lt;PlayerResponseLine&gt; PlayerInfo : A list of the Players on the server.

===VoiceChatterInfo ===
; [[Legacy:Controller|Controller]] Controller : 
; int IpAddr : 
; int Handle : 

==Properties==

===Globalconfig===
; bool bChangeLevels : ''True'' if the game is allowed to change levels and ''false'' if the game is not allowed to change levels.
; bool bEnableStatLogging : ''True'' the game will be enabled to track stats and ''false'' the game will not track stats.
; bool bAdminCanPause : ''True'' the game is pauseable by the admin and ''false'' if the game is not pauseable by the admin.
; bool bWeaponShouldViewShake : ''True'' the weapon will shake the view and ''false'' the weapon will not shake the view.
; float GameDifficulty : 
; int GoreLevel : 0 is normal gore, while increasing the value will yield less gore.
; float AutoAim : 1 is no aiming and 0 is always auto-aiming  (cosine of max error to correct).
; float GameSpeed : The scale applied to the rate of the game.
; int MaxSpectators : The Maximum number of spectators.
; int MaxPlayers : The Maximum number of players.
; string AccessControlClass : The class name of the AccessControl class.
; string GameStatsClass : The class name of the GameStats class.

===Config===
; bool bWeaponStay : ''True'' the weapons stay when picked up and ''False'' they do not stay when picked up. 
; bool bAllowWeaponThrowing : ''True'' if the [[Legacy:Pawn|Pawn]] is allowed to throw their weapon and ''false'' if they are not allowed to throw their weapons.
; bool bAllowBehindView : ''True'' if the [[Legacy:PlayerController|PlayerController]] is allowed to view their [[Legacy:Pawn|Pawn]] from behind and ''false'' if the behind view is not allowed.
; int GoalScore : The goal score of the level.
; int MaxLives : The maximum lives a player has on the level.  (0 means there is not limit).
; int TimeLimit : The time limit of the game.

===Localized===
; bool bAlternateMode : Used when setting the gore level of the game.
; string DefaultPlayerName : The default name of the player when they have not specified a name.
; string GameName : The name of the game.

===Main===
; bool bRestartLevel : ''True'' if the level needs to be restarted and ''false'' if it does not need to be restarted.
; bool bPauseable :  ''True'' if the game is pauseable and ''false'' if the game is not pauseable.
; bool bCanChangeSkin : ''True'' if the [[Legacy:Controller|Controller]] can change the skin of the of the [[Legacy:Pawn|Pawn]].
; bool bTeamGame : ''True'' if the game is a team game and ''false'' if the game is not a team game.
; bool GameEnded : ''True'' if the game has ended and ''false'' if the game has not ended.
; bool bOverTime : ''True'' if the game is in overtime (because a win condition hasn't been met) and ''false'' if the game is not in overtime.
; bool bCanViewOthers : ''True'' if a [[Legacy:PlayerController|PlayerController]] is able to view other players in spectator mode and ''false'' if they are unable to view other players.
; bool bDelayedStart :  ''True'' if the start of a [[Legacy:Controller|Controller]]'s game start is delayed and ''false'' if it is not delayed. 
; bool bWaitingToStartMatch : ''True'' if the match is being waiting to start and ''false'' if the game has started. 
; bool bAlreadyChanged :
; bool bLoggingGame : ''True'' if the game is a logged game and ''false'' if the game is not being logged.
; bool bGameRestarted : 
; bool bModViewShake : ''True'' if the game allows for weapon shaking and ''false'' if the game does not allow weapon shaking.
; bool bForceClassicView :
; float StartTime : 
; string ScoreBoardType : The class name of the [[Legacy:ScoreBoard|ScoreBoard]] that is loaded for this game.
; string BotMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the game bots.
; string RulesMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the rules.
; string SettingsMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game to control the game settings.
; string GameUMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for this game dropdown.
; string MultiplayerUMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for multiplayer dropdown.
; string GameOptionsMenuType : The class name of the [[Legacy:GUIComponent|GUIComponent]] that is loaded for options dropdown.
; string HUDType : The class name of the [[Legacy:HUD|HUD]] that is loaded for the game.
; string MapListType : The class name of the [[Legacy:MapList|MapList]] that is loaded for this game.
; string MapPrefix : The prefix designation that the game uses for it's maps.
; string BeaconName : Identifying string used for finding LAN servers.
; int NumSpectators : The current number of spectators in the game.
; int NumPlayers : The current number of players in the game.
; int NumBots : The current number of bots in the game.
; int CurrentID : The game server ID.
; float FearCostFallOff : The rate at which the FearCost in NavigationPoints decreases over time.
; class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; DeathMessageClass : The message class that handles the messages concerned with death of a [[Legacy:Pawn|Pawn]].
; class&lt;[[Legacy:GameMessage|GameMessage]]&gt; GameMessageClass : The message class that handles the messages in the game.
; name OtherMesgGroup : 
; string MutatorClass : The class name of the '''BaseMutator'''.
; [[Legacy:Mutator|Mutator]] BaseMutator : The reference to the first mutator in the [[Legacy:Linked List|linked list]] of Mutators.
; [[Legacy:AccessControl|AccessControl]] AccessControl : The instance of the [[Legacy:AccessControl|AccessControl]] class that handles the security, banning and various other administrative tasks.
; [[Legacy:GameRules|GameRules]] GameRulesModifiers : The reference to the Linked-List of [[Legacy:GameRules|GameRules]].
; string BroadcaseHandlerClass : The class name for the '''BroadCastHandler'''.
; [[Legacy:BroadcastHandler|BroadcastHandler]] BroadcastHandler : The reference to the Linked-List of [[Legacy:BroadCastHandler|BroadCastHandler]].
; class&lt;[[Legacy:PlayerController|PlayerController]]&gt; PlayerControllerClass :  The specific class of the [[Legacy:PlayerController|PlayerController]] in this game.
; string PlayerControllerClassName : The class name of the '''PlayerControllerClass'''. This should be set while the PlayerControllerClass is dynamically loaded using this string.
; class&lt;[[Legacy:GameReplicationInfo|GameReplicationInfo]]&gt; GameReplicationInfoClass : The class that contains [[Legacy:Replication|Replication]] info about the game.
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GameReplicationInfo : The instance of the [[Legacy:GameReplicationInfo|GameReplicationInfo]] class that contains important information concerning the game and the server.
; bool bWelcomePending : ''True'' if the welcome message is still needed to be given to a new player, and ''False'' if the welcome message has already been presented.
; [[Legacy:GameStats|GameStats]] GameStats : The instance of the [[Legacy:GameStats|GameStats]] where events and information are logged.
; array&lt;VoiceChatterInfo&gt; VoiceChatters :
; String ScreenShotName :
; String DecoTextName :
; String Acronym : 
; [[Legacy:GameProfile|GameProfile]] CurrentGameProfile (transient) : Persistant game data management.
; [[Legacy:Manifest|Manifest]] SaveGameManifest (private const) : persistant game data management.
; bool bAttractCam : 

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed() :  Used to destroy the GameInfo object.  Destroys the [[Legacy:GameProfile|GameProfile]] and then calls Actor's ''Destroy''.
; PostBeginPlay() : Called right after play starts.  This function is used to initialize variables and objects that are set after play has just begun or gotten underway.
; PreBeginPlay() : Called before play starts.  This function is used to initialize varibles and objects that need to be set before the game begins.  In this case, GameInfo sets start time, gamespeed and starts logging and the game replication info.
; Reset() : Used for restarting the level.  Returns the GameInfo Object to it's initial state.
; Timer() : Used to handle events at a given time interval that is important to the GameInfo object.  In this case it makes sure that all players have been welcomed to the server. 
; UpdatePrecacheMaterials() : Precaches textures used in the map by calling PrecacheGameTextures.
; UpdatePrecacheStaticMeshes() : Precaches the static meshes used in the map by calling PrecacheGameStaticMeshes.

===Inherited From [[Legacy:Info|Info]]===
; FillPlayInfo( [[Legacy:PlayInfo|PlayInfo]] PlayInfo ) (static) :  Used to load a PlayInfo with appropriate information about the game.  Which should be added to the [[Legacy:GameReplicationInfo|GameReplicationInfo]] so that the information is retreivable by all players.

===Events===
; AcceptInventory( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Examine the passed player's inventory, and accept or discard each item.  AcceptInventory needs to gracefully handle the case of some inventory being accepted but other inventory not being accepted (such as the default weapon).  There are several things that can go wrong: A weapon's AmmoType not being accepted but the weapon being accepted &amp;ndash; the weapon should be killed off. Or the player's selected inventory item, active weapon, etc. not being accepted, leaving the player weaponless or leaving the HUD inventory rendering messed up (AcceptInventory should pick another applicable weapon/item as current).
; PreLogin( string Options, string Address, string PlayerID, out string Error, out string FailCode ) : Accept or reject a player on the server.  Fails login if you set the Error to a non-empty string.
; Broadcast( [[Legacy:Actor|Actor]] Sender, coerce string Msg, optional name Type ) : Passes this information on to the BroadCastHandler object's method ''Broadcast''.
; DetailChange() : This event takes place when the detail level changes from low to high or high to low.
; string GetBeaconText() : Return beacon text for serverbeacon.
; InitGame( string Options, out string Error ) : The GameInfo's InitGame( ) function is called before any other scripts (including PreBeginPlay( ) ), and is used by the GameInfo to initialize parameters and spawn its helper classes.  Warning: this is called before actors' PreBeginPlay.  The ''Options'' string contains the key-value pairs of options for the game.  ''Error'' contains error information during the initializing of the game.  In this case, it loads all the game speed, max players, password, mutators, game rules, etc...
; PlayerController Login( string Portal, string Options, out string Error ) : Fails login if you set the Error string. PreLogin is called before Login, but significant game time may pass before Login is called, especially if content is downloaded.

===Exec Functions===
; AdminSay( string Msg ) : Sends ''Msg'' to to all [[Legacy:PlayerControllers|PlayerControllers]].
; KillBots( int num ) : This methods destroys ''num'' bots.

===Iterators===
; AllDataObjects( [[Legacy:Class|class]] objClass, out Object obj, string packageName ) (native, final) : Iterates through all data objects in a package created with the ''SavePackage'' function.

===Native Functions===
; string GetNetworkNumber() : Replication related function.
; LoadMapList( string MapPrefix, out array&lt;string&gt; Maps ) (static, final) : Returns an array of Map names with the following ''MapPrefix''.
; string ParseKillMessage( string KillerName, string VictimName, string DeathMessage ) [static] : 

====[[Legacy:DataObject|DataObject]] Functions====
; [[Legacy:Manifest|Manifest]] GetSavedGames() (final) : Returns a [[Legacy:Manifest|Manifest]] of saved games.
; [[Legacy:Object|Object]] CreateDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) :
; [[Legacy:Object|Object]] LoadDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) : Creates an instance of the ''objClass'' from the ''packageName'' with the ''packageName'' as its name.
; bool DeleteDataObject( [[Legacy:Class|class]] objClass, string objName, string packageName ) (final) : Returns ''true'' if this method is able to delete the instance of the object.
; bool SavePackage( string packageName ) (final) : Returns ''true'' if the package labeled ''packageName'' has been saved and returns ''false'' if the package was not saved.
; bool DeletePackage( string packageName ) (final) : Returns ''true'' if the package labeled ''packageName'' has been deleted and ''false'' if the package was not deleted.

===Other Methods ===
; AddDefaultInventory( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Add to the [[Legacy:Pawn|Pawn]] specific [[Legacy:Inventory|Inventory]] items required for the game.  In this case, the base mutator is queried for the default weapon and it is added to the inventory and made so it is not throwable.  Then it calls ''SetPlayerDefaults''.
; AddGameSpecificInventory( [[Legacy:Pawn|Pawn]] p ) : Add to the [[Legacy:Pawn|Pawn]] specific [[Legacy:Inventory|Inventory]] items required for the game.  This is the same as ''AddDefaultInventory'' method except that it does not call ''SetPlayerDefaults'' when it is done.
; AddMutator( string mutname, optional bool bUserAdded ) : Utility function that creates a physical instance of the ''mutname'' class and then adds it to the '''BaseMutator''' variable.
; bool AtCapacity( bool bSpectator ) : Returns ''true'' if the game is at capacity and returns ''false'' if the the server is not at capacity.  ''bSpectator'' is used to specify for which type of capactity.  if ''bSpectator'' is false then you are asking if there is room for more players.  If ''bSpectator'' is true then you are asking if there is room for more spectators.
; BroadcastDeathMessage( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : Broadcase a message that [[Legacy:Controller|Controller]] Killer has killed himself or another player.
; BroadcastLocalized( [[Legacy:Actor|Actor]] Sender, class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject ) :  Broadcast a localized message to all players.  Most message deal with 0 to 2 related PRIs.  The [[Legacy:LocalMessage|LocalMessage]] class defines how the PRI's and optional actor are used.
; BroadcastTeam( [[Legacy:Controller|Controller]] Sender, coerce string Msg, optional name Type ) : Passes this information on to the BroadCastHandler object's method ''BroadcastTeam''.
; bool CanSpectate( [[Legacy:PlayerController|PlayerController]] Viewer, bool bOnlySpectator, [[Legacy:Actor|Actor]] ViewTarget ) : Returns ''true'' if the ''Viewer'' is able to spectate in the game of the following [[Legacy:Actor|Actor]] ''ViewTarget'' and returns ''false'' if the ''Viewer'' may not.  In this case it always returns true.
; ChangeMap( int ContextID ) : Changes the map that is currently being played to the one specified by the ContextID.  
; ChangeName( [[Legacy:Controller|Controller]] Other, coerce string S, bool bNameChange ) : If ''bNameChange'' is allowing name changes then change the name of [[Legacy:Controller|Controller]] Other's name to ''S''.
; bool ChangeTeam( [[Legacy:Controller|Controller]] Other, int N, bool bNewTeam ) : If ''bNewTeam'' is allowing team changes then change [[Legacy:Controller|Controller]] Other's team to team number ''N''.
; ChangeVoiceChatter( [[Legacy:Controller|Controller]] Client, int IpAddr, int Handle, bool Add ) :
; bool CheckEndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) : Called when the game is over.  Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to handle the end game.  In this case, if no GameRules modifies the end game then it loops through each [[Legacy:Controller|Controller]] and calls ''ClientGameEnded'' and ''GameHasEnded''.
; CheckScore( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer ) : Sees if this score means the game ends.  This method should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to augment the determination of the end game for this ''Scorer''.
; DiscardInventory( [[Legacy:Pawn|Pawn]] Other ) : Removes and destroys all the [[Legacy:Inventory|Inventory]] of the [[Legacy:Pawn|Pawn]] Other's [[Legacy:Inventory|Inventory]].
; EndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) : The end of the game has been reached.  In this case, it calls ''CheckEndGame'' to see if perhaps the winning conditions have not been reached.   Then sets the ''bGameEnded'' to false and then Triggers the event ''EndGame''.
; EndLogging( string Reason ) : Used to close and destroy all the logging classes in the GameInfo class.
; string FindPlayerByID( int PlayerID ) : Returns the name of the player given a ''playerID''.
; [[Legacy:NavigationPoint|NavigationPoint]] FindPlayerStart( [[Legacy:Controller|Controller]] Player, option byte inTeam, optional string incomingName ) : Return the 'best' player start for this player to start from.
; [[Legacy:Actor|Actor]] FindSpecGoalFor( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, int TeamIndex ) : Returns an actor that has special goal or situation taking place.  For example, in [[Legacy:XBombingRun|xBombingRun]] games the [[Legacy:Pawn|Pawn]] with the [[Legacy:XBombFlag|xBombFlag]] is returned or the bomb itself if no one has control of it.
; string FindTeamDesignation( [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI, [[Legacy:Actor|Actor]] A ) (static) : Used to determine the team's designation of the [[Legacy:Actor|Actor]] A.  Returns the string name of the team.
; GameEnding() : Handles the action when a game ends.  In this case it simply turns off the logging.
; class&lt;[[Legacy:Pawn|Pawn]]&gt; GetDefaultPlayerClass( [[Legacy:Controller|Controller]] C ) : Returns an instance of the [[Legacy:Pawn|Pawn]] class that the [[Legacy:Controller|Controller]] C is using as their Pawn. This is called from inside RestartPlayer(), if C.PawnClass couldn't be spawend. RestartPlayer may be overriden and may not call this in your case.
; int GetIntOption( string Options, string ParseString, int CurrentValue ) : Returns the int value from a key-value pair.  Options is the string you is the string of options.  ParseString is the key.  CurrentValue is a default value that the option is set at before calling this method.
; GetKeyValue( string Pair, out string Key, out string Value ) : This utility function breaks the string ''Pair'' into it's key and value.  The key-value pair is a string in the form of &quot;key=value&quot;
; [[Legacy:MapList|MapList]] GetMapList( string MapListType ) : Returns an instance of the class ''MapListType''.
; int GetNumPlayers() : Used to return the number of players in the game.
; GetServerDetails( out ServerResponseLine ServerState ) : Used to return detailed information about the server in the ''ServerResponseLine'' struct defined above.
; GetServerInfo( out ServerResponseLine ServerState ) : Used to return information about the server in the ''ServerResponseLine'' struct defined above.
; GetServerPlayers( out ServerResponseLine ServerState ) : Used to return the information about the players using the ''PlayerResponseLine'' struct defined above.
; int GetServerPort() : Returns the port that the server is operating on.
; bool GrabOption( out string Options, out string Result ) : This utility function is used to grab options from a string.  The option is in the form of &quot;?option1?option2&quot;.  
; bool HasOption( string Options, string InKey ) : Returns ''true'' if the ''InKey'' key has a value in the option string.  ''False'' is returned if the ''InKey'' doesn't exist as a key in the ''Options'' string.
; InitGameReplicationInfo() : Starts the appropriate game information to the [[Legacy:GameReplicationInfo|GameReplicationInfo]] object.  In this case it copies whether it is a team game, the game name, the game class, and the max lives.
; InitLogging() : Starts the logging for the game.  Usually a [[Legacy:GameStats|GameStats]] object that is instantiated specified with a specific class specified by the string ''GameStatsClass''.  
; bool IsOnTeam( [[Legacy:Controller|Controller]] Other, int TeamNum ) : Returns ''true'' if the [[Legacy:Controller|Controller]] ''Other'' is on ''TeamNum'' and returns ''false'' of the ''Other'' is not on the ''TeamNum''.
; Kick( string S ) : ''S'' is the name of the player that is being kicked off the game server.
; KickBan( string S ) : ''S'' is the name of the player that is being kicked off and banned from the game server.  The ''KickBan'' function denies them based on the player's IP address.
; Killed( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : This function handles calling the ''KillEvent'' for the appropriate logging and then handles the death and removal of inventory of the ''KilledPawn''.
; KillEvent( string Killtype, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim, class&lt;[[Legacy:DamageType|DamageType]]&gt; Damage ) : Call when a kill event has taken place.  In this case, the [[Legacy:GameStats|GameStats]] object logs the ''KillEvent''.
; Logout( [[Legacy:Controller|Controller]] Exiting ) : When a player logs out of the game.  ''Exiting'' is the [[Legacy:Controller|Controller]] that is leaving the game.
; NotifyKilled( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn ) : Used to notify the death of ''Killed''.  In this case, each [[Legacy:Controller|Controller]] calls ''NotifiedKilled''.
; [[Legacy:TeamInfo|TeamInfo]] OtherTeam( [[Legacy:TeamInfo|TeamInfo]] Requester ) : Returns the opposing team's information.  In [[Legacy:TeamGame|TeamGame]] if you are the first team it returns the second team's information.
; string ParseChatPercVar( [[Legacy:Mutator|Mutator]] BaseMutator, [[Legacy:Controller|Controller]] Who, string Cmd ) (static) : Calls the ''BaseMutator'' method ''ParseChatPercVar'' and accepts the string that returns.  Then calls the [[Legacy:Controller|Controller]] Who method ''ParseChatPercVar'' and returns that string.  Used for Adreneline and Sheild count?
; string ParseMessageString( [[Legacy:Mutator|Mutator]] BaseMutator, [[Legacy:Controller|Controller]] Who, String Message ) (static) : Parse out the % vars from the ''Message''.  In this case, it simply returns the ''Message''.
; string ParseOption( string Options, string InKey ) : This utility function returns the value of the ''InKey'' parameter from the key-value pair.
; byte PickTeam( byte Current, [[Legacy:Controller|Controller]] C ) : Allows the [[Legacy:Controller|Controller]] C to pick the team ''Current'' if it wasn't already given a team number.
; bool PickupQuery( [[Legacy:Pawn|Pawn]] Other, [[Legacy:Pickup|Pickup]] item ) : Called when the [[Legacy:Pawn|Pawn]] Other touches a [[Legacy:Pickup|Pickup]] and returns ''true'' if the [[Legacy:Pawn|Pawn]] is able and wants to pick it up and returns ''false'' if the Pawn is not able or doesn't want to pick it up.  
; PostLogin( [[Legacy:PlayerController|PlayerController]] NewPlayer ) : Called after a successful login. This is the first place it is safe to call replicated functions on the PlayerPawn.  ''NewPlayer'' is the [[Legacy:PlayerController|PlayerController]] that has successfully logged in.
; PrecacheGameStaticMeshes( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) : 
; PrecacheGameTextures( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) : 
; bool PreventDeath( [[Legacy:Pawn|Pawn]] Killed, [[Legacy:Controller|Controller]] Killer, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector HitLocation ) : Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to prevent the death of the the ''Killed'' [[Legacy:Pawn|Pawn]].  Returns true if Pawn is to remain alive.
; bool PreventSever( [[Legacy:Pawn|Pawn]] Killed, Name boneName, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : Allows [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to prevent the severing of limb of the the ''Killed'' [[Legacy:Pawn|Pawn]].
; ProcessServerTravel( string URL, bool bItems ) : This method handles moving the [[Legacy:PlayerController|PlayerController]] objects to a new ''URL''.  ''bItems'' is a flag that is set to true if items are to move with players and ''false'' if they are to lose them upon traveling.  In this case, the method checks with the [[Legacy:Mutator|Mutator]] list and then calls each individual [[Legacy:PlayerController|PlayerController]] method ''ClientTravel''. 
; float RatePlayerStart( [[Legacy:NavigationPoint|NavigationPoint]] N, byte Team, [[Legacy:Controller|Controller]] Player ) : Rate whether player should choose this NavigationPoint as its start default implementation is for single player game.
; string RecommendCombo( string ComboName ) : Returns a string name of an [[Legacy:Adrenaline|Adrenaline]] Combo that the method recommends to the player.  This is a [[Legacy:Combo|Combo]] that could be randomly selected or based on the ''ComboName'' parameter.
; int ReduceDamage( int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : Determins if the damage should be reduced.  Should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to reduce damage of the ''injured'' [[Legacy:Pawn|Pawn]].  In this case, it checks whether the ''injured'' is a neutral zone, in GodMode, or wearing armor.
; RestartGame() : Restart the game.  Allows the [[Legacy:GameRules|GameRules]] GameRulesModifier list to handle the game restart.  If no GameRules modify how the game restarts then handle the restart of the game.
; RestartPlayer( [[Legacy:Controller|Controller]] aPlayer ) : Restart a player.	
; ReviewJumpSpots( name TestLabel ) : Overridden in [[Legacy:DeathMatch|DeathMatch]] to test all the [[Legacy:JumpSpot|JumpSpot]]s in the level.
; ScoreEvent( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, float Points, string Desc ) : When a score event takes place, this method has the ''Who'', the ''Points'', and the description ''Desc'' of the score event.  In this case, [[Legacy:GameStats|GameStats]] object ''ScoreEvent'' method is called with the above information.
; ScoreKill( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other ) : Determines if the death was caused by surroundings, suicide, or another player and scores the event respectively.  Allows the [[Legacy:GameRules|GameRules]] GameRulesModifier list to handle the ScoreKill.  
; ScoreObjective( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer, Int Score ) : Handles the scoring of ''Scorer''.  This method should allow [[Legacy:GameRules|GameRules]] in the ''GameRulesModifiers'' linked-list a chance to augment the score of the ''Scorer''.see if this score means the game ends
; SendPlayer( [[Legacy:PlayerController|PlayerController]] aPlayer, string URL ) : Sends [[Legacy:PlayerController|PlayerController]] aPlayer to the ''URL'' specified. This is used when a player changes maps.
; SessionKickBan( string S ) : Ban's the player by calling the [[Legacy:AccessControl|AccessControl]] method ''SessionKickBan'' which removes the player and blocks the IP address from joining again.
; SetGameSpeed( float T ) : Sets the speed of the game.  In this instance it sets the game speed and the time dilation of the level and then stores any changes of game speed.
; bool SetPause( bool bPause, [[Legacy:PlayerController|PlayerController]] P ) :  Pauses/Unpauses the game if the [[Legacy:PlayerController|PlayerController]] is allowed to pause/unpause the game.
; SetPlayerDefaults( [[Legacy:Pawn|Pawn]] PlayerPawn ) : Sets the default characteristics of the ''PlayerPawn''.  In this case they sit AirControl, GroundSpeed, WaterSpeed, AirSpeed, Acceleration, JumpZ.  Then it allows the [[Legacy:Mutator|Mutator]] list to augment these values.
; SetWeaponViewShake( [[Legacy:PlayerController|PlayerController]] P ) : Sets the [[Legacy:PlayerController|PlayerController]] weapon to shake.  In this case it it determines whether ''bWeaponShouldViewShake'' and ''bModViewShake'' are both true and then calls PlayerController's ''ClientSetWeaponViewShake''.
; bool ShouldRespawn( [[Legacy:Pickup|Pickup]] Other ) : Returns ''true'' if the [[Legacy:Pickup|Pickup]] should respawn and ''false'' if it should not respawn.  In this case, it checks what the game type (Standalone games do not respawn) and then with the ''RespawnTime'' of the item.
; StartMatch() : Starts the game.  Informs all actors that the match is starting and spawn player's pawns.
; TeamScoreEvent( int Team, float Points, string Desc ) : When a team score event takes place, this method has the ''Who'', the ''Points'', and the description ''Desc'' of the team score event.  In this case, [[Legacy:GameStats|GameStats]] object ''TeamScoreEvent'' method is called with the above information.
; bool TooManyBots( [[Legacy:Controller|Controller]] botToRemove ) : Returns ''true'' if there are too many bots and returns ''false'' if there are not too many bots.  In this case, it always returns ''false''.
; bool UseLowGore() (static) : Returns whether to display less gore. (i.e., green blood instead of red blood and no gibs)

==Known Subclasses ==
 GameInfo
    +- [[Legacy:CinematicGame|CinematicGame]]
    +- [[Legacy:UnrealMPGameInfo|UnrealMPGameInfo]]
        +- [[Legacy:DeathMatch|DeathMatch]]
             +- [[Legacy:TeamGame|TeamGame]]
             |   +- [[Legacy:CTFGame|CTFGame]]
             |   |   +- [[Legacy:XCTFGame|xCTFGame]]
             |   |       +- [[Legacy:InstagibCTF|InstagibCTF]] (UT200x)
             |   |       +- [[Legacy:XVehicleCTFGame|xVehicleCTFGame]] (UT2004)
             |   +- [[Legacy:XBombingRun|xBombingRun]] (UT200x)
             |   +- [[Legacy:XDoubleDom|xDoubleDom]] (UT200x)
             |   +- [[Legacy:XTeamGame|xTeamGame]]
             |       +- [[Legacy:ASGameInfo|ASGameInfo]] (UT2004)
             |       +- [[Legacy:Invasion|Invasion]] (UT2004)
             |       +- [[Legacy:ONSOnslaughtGame|ONSOnslaughtGame]] (UT2004)
             +- [[Legacy:XDeathMatch|xDeathMatch]]
                +- [[Legacy:BossDM|BossDM]]
                +- [[Legacy:XLastManStandingGame|xLastManStandingGame]] (UT2004)
                +- [[Legacy:XMutantGame|xMutantGame]] (UT2004)
               

----

'''JCBDigger:''' Anyone have some example code for GetServerDetails( ... ) and GetServerInfo( ... ) for a mutator.  I have been trying to get the MapName back to display on a menu from a mutator, but just get blank strings!

For anyone interested, I used a different method to get what I wanted.

The parent class of Mutator is the Map Name I needed.

&lt;uscript&gt;
class MyMutator extends Mutator;

function string GetThisMapName()
{
  local string sParentClass, sClassTree, sThisClass;
  sClassTree = string(self);    // e.g. DM-1on1-MyLevel.MyMutator
  sThisClass = string(self.name);    // e.g. MyMutator
  // take one from the other to leave DM-1on1-MyLevel
  sParentClass = left(sClassTree, (InStr(sClassTree,sThisClass) -1));  // e.g. DM-1on1-MyLevel
  return sParentClass;
}
&lt;/uscript&gt;

There must be a better way.

'''Mortal Monkey:''' Try this: &lt;uscript&gt;sClassTree = string(self.class);&lt;/uscript&gt; Other that that you coud use Actor's ''string GetURLMap()'', or find the map's title in ''LevelInfo.Title''.

'''Wormbo:''' To get the map's package name you can just use &lt;code&gt;string(Outer)&lt;/code&gt; in any Actor. For the map's title you'd use &lt;code&gt;Level.Title&lt;/code&gt;, again this works in every Actor.

'''OlympusMons:''' Maybe a [[Legacy:GameInfo (UT2003)|GameInfo (UT2003)]] or [[Legacy:GameInfo (UT2004)|GameInfo (UT2004)]] page is in order then.

----

[[:Category:Legacy Class (UT2004)]] &amp;ndash; Looks like there are enough differences that 2k4 should have it's own version of this page.&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy Class Tree]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameInfo (DX)</title>
    <id>1351</id>
    <revision>
      <id>3436</id>
      <timestamp>2004-02-10T05:05:23Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Info (DX)|Info (DX)]] &gt;&gt; GameInfo (Engine)}}

default game info is normal single player

==Differences from UT ==
* bVeryLowGore is not globalconfig in DX
* DX doesn't have bExternalBatcher() property
* DX doesn't have MessageMutator()
* EnabledMutators is global in UT, local to GetRules() function in DX.
* UT's AdminLogout() function has new stuff
** DX doesn't do stuff if Admin password is empty string, don't know why
* UT's GetInfo() function has new stuff for WorldLogging, DX doesn't
* GetRules() function in DX, looks like it always does the mutator looping, EnabledMutators isn't defined outside of the function
* Login() event slightly different
* AddDefaultInventory() a little different
* Killed() function changed
* no RegisterMessageMutator() function in DX
* PickupQuery changed in UT (no Mutator stuff in DX)
* UT adds new stuff to AllowsBroadcast() function
* Endgame() function different, DX has no mutator stuff here
* usual differences in defaultproperties, but IPPolicies looks very different (an array in UT, not in DX?)

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameInfo (UT)</title>
    <id>1314</id>
    <revision>
      <id>3352</id>
      <timestamp>2006-06-22T14:51:03Z</timestamp>
      <contributor>
        <ip>NogginBasher</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; GameInfo (Package: Engine)}}

A GameInfo subclass contains the rules for a gametype.  This includes timelimit, fraglimit, scoring, difficulty, game speed, allowed playerpawn classes, default inventory assignment, and if appropriate, team assignment and general bot behavior.

This is assigned to a map in the [[Legacy:Level Properties|Level Properties]] window, under LevelInfo -&gt; DefaultGameType.

The &lt;tt&gt;GameInfo&lt;/tt&gt; for the current game can be retrieved from every actor in that game via &lt;tt&gt;Level.Game&lt;/tt&gt;, but ''only'' on the server.  &lt;tt&gt;GameInfo&lt;/tt&gt; is not replicated to network clients; only [[Legacy:GameReplicationInfo (UT)|GameReplicationInfo (UT)]] is.

See [[Legacy:GameInfo|GameInfo]] for the UT200x version of this class.

==Properties==

===Globalconfig Properties===
; bool bMuteSpectators : Whether spectators are allowed to speak.
; bool bLowGore : Whether or not to reduce gore.
; bool bVeryLowGore : Greatly reduces gore.
; bool bNoCheating : Disallows cheating. Hehe.
; bool bAllowFOV : Allows FOV changes in net games
; bool bExternalBatcher : 
; float AutoAim : How much autoaiming to do (1 = none, 0 = always). (cosine of max error to correct)
; float GameSpeed : Scale applied to game rate.
; int MaxSpectators : Maximum number of spectators.
; private string AdminPassword : Password to receive bAdmin privileges.
; private string GamePassword : Password to enter game.
; int MaxPlayers : 
; string ServerLogName : Server Log
; bool bLocalLog : 
; bool bWorldLog : 
; bool bBatchLocal : 
; int DemoBuild : 
; int DemoHasTuts : 
; string IPPolicies[50] : 

===Config Properties===
; bool bNoMonsters : Whether monsters are allowed in this play mode.
; bool bHumansOnly : Whether non human player models are allowed.
; bool bCoopWeaponMode : Whether or not weapons stay when picked up.
; bool bClassicDeathmessages : Weapon deathmessages if false.

===Localized Properties===
; bool bAlternateMode : 
; string SwitchLevelMessage : 
; string DefaultPlayerName : 
; string LeftMessage : 
; string FailedSpawnMessage : 
; string FailedPlaceMessage : 
; string FailedTeamMessage : 
; string NameChangedMessage : 
; string EnteredMessage : 
; string GameName : 
; string MaxedOutMessage : 
; string WrongPassword : 
; string NeedPassword : 
; string IPBanned : 

===Other Properties===
; int ItemGoals, KillGoals, SecretGoals : Special game goals.
; byte Difficulty : In Unreal: 0=easy, 1=medium, 2=hard, 3=very hard. In UT: 0=Novice, 1=
; bool bRestartLevel : 
; bool bPauseable : Whether the level is pauseable.
; bool bCanChangeSkin : Allow player to change skins in game.
; bool bTeamGame : This is a teamgame.
; bool bDeathMatch : This game is some type of deathmatch (where players can respawn during gameplay)
; bool bGameEnded : set when game ends
; bool bOverTime : 
; bool bCanViewOthers : 
; float StartTime : 
; class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; DefaultPlayerClass : 
; class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; DefaultWeapon : Default weapon given to player at start.
; int NumSpectators : Current number of spectators.
; class&lt;[[Legacy:ScoreBoard|ScoreBoard]]&gt; ScoreBoardType : Type of scoreboard this game uses.
; class&lt;[[Legacy:Menu|Menu]]&gt; GameMenuType : Type of oldstyle game options menu to display.
; string BotMenuType : Type of bot menu to display.
; string RulesMenuType : Type of rules menu to display.
; string SettingsMenuType : Type of settings menu to display.
; string GameUMenuType : Type of Game dropdown to display.
; string MultiplayerUMenuType : Type of Multiplayer dropdown to display.
; string GameOptionsMenuType : Type of options dropdown to display.
; class&lt;[[Legacy:HUD (UT)|HUD (UT)]]&gt; HUDType : HUD class this game uses.
; class&lt;[[Legacy:MapList|MapList]]&gt; MapListType : Maplist this game uses.
; string MapPrefix : Prefix characters for names of maps for this game type.
; string BeaconName : Identifying string used for finding LAN servers.
; string SpecialDamageString : 
; int SentText : 
; int NumPlayers : 
; int CurrentID : 
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; DeathMessageClass : 
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; DMMessageClass : A message class to be used for commonly used messages. For example, the [[Legacy:DeathMatchPlus|DeathMatchPlus]] gametype sets [[Legacy:DeathMatchMessage|DeathMatchMessage]] as the default, which contains messages for overtime, players leaving and joining the game, players changing names, and players switching teams.
; class&lt;[[Legacy:Mutator|Mutator]]&gt; MutatorClass : Class of this gametype's base mutator. (Default is Engine.[[Legacy:Mutator|Mutator]], [[Legacy:DeathMatchPlus|DeathMatchPlus]] uses Botpack.[[Legacy:DMMutator|DMMutator]].)
; [[Legacy:Mutator|Mutator]] BaseMutator : 
; [[Legacy:Mutator|Mutator]] DamageMutator : [[Legacy:Linked List|Linked list]] of mutators which affect damage.
; [[Legacy:Mutator|Mutator]] MessageMutator : [[Legacy:Linked List|Linked list]] of mutators which get localized message queries.
; class&lt;[[Legacy:ZoneInfo|ZoneInfo]]&gt; WaterZoneType : Default waterzone entry and exit effects
; name DefaultPlayerState : What state a player should start in for this game type
; class&lt;[[Legacy:GameReplicationInfo|GameReplicationInfo]]&gt; GameReplicationInfoClass : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GameReplicationInfo : 
; [[Legacy:StatLog|StatLog]] LocalLog : 
; [[Legacy:StatLog|StatLog]] WorldLog : 
; bool bLoggingGame : Does this gametype log?
; string LocalLogFileName : 
; string WorldLogFileName : 
; class&lt;[[Legacy:StatLog|StatLog]]&gt; StatLogClass : 
; string EnabledMutators : Server query info

==Methods ==
; AdminLogin ([[Legacy:PlayerPawn|PlayerPawn]] P, string Password) : This function will allow a player to log in as the administrator if the password entered is correct.  The function also broadcasts a notification message to the other players.
; AdminLogout ([[Legacy:PlayerPawn|PlayerPawn]] P) : This function is called when a player leaves administrator mode.  It ensures that the player is forced to &quot;Walk&quot;, and kills them.  &lt;i&gt;There is code in there to preserve the players score when they die from logging out of admin mode but I'm sure it doesn't work in practice. &amp;ndash; must check&lt;/i&gt;.
; InitLogging ( ) : Called from &lt;code&gt;PostBeginPlay()&lt;/code&gt;. Logs more stuff than you can shake a big stick at.  Calls functions on the WorldLog, Log, and LocalLog objects to do so.
; InitGameReplicationInfo ( ) : This function is responsible for placing the values of the attributes of the GameInfo class important to the client onto the [[Legacy:GameReplicationInfo|GameReplicationInfo]] object.
; string GetInfo ( ) : Returns the status of the World log.
; string GetRules ( ) : This function builds up a description of the server from the list of mutators currently in use, the type of server (Listen or otherwise), and whether there is a password on the server or not.
; int GetServerPort ( ) : This functon returns the port the server is runing on by interrogating the level URL.
; bool SetPause (bool bPause, [[Legacy:PlayerPawn|PlayerPawn]] P) : If the level can be paused then the player who paused the game is stored and the function returns &lt;tt&gt;true&lt;/tt&gt;.  If the game is not pausable then the function will return &lt;tt&gt;false&lt;/tt&gt;.
; LogGameParameters ([[Legacy:StatLog|StatLog]] StatLog) : This function writes the general game parameters to the stat. log.
; SetGameSpeed (float T) : This function sets the game speed.
; bool IsRelevant ([[Legacy:Actor|Actor]] Other) : This function is called from any [[Legacy:Actor|Actor]]'s &lt;code&gt;PreBeginPlay()&lt;/code&gt;.  If this function returns &lt;tt&gt;true&lt;/tt&gt; the actor continues to exist.  If the function returns &lt;tt&gt;false&lt;/tt&gt; then the actor is removed from the game.  This function calls the &lt;tt&gt;AlwaysKeep(), and IsRelevant()&lt;/tt&gt; functions on any mutators within the game prior to checking actor difficulty levels and &quot;odds of appearing&quot; values.  The function also counts the number of remaining &lt;tt&gt;SecretGoals&lt;/tt&gt;, &lt;tt&gt;ItemGoals&lt;/tt&gt;, and &lt;tt&gt;KillGoals&lt;/tt&gt; left within the level. (also see [[Legacy:Creating Actors And Objects|Creating Actors And Objects]])
; bool GrabOption (out string Options, out string Result) : &lt;i&gt;finish me&lt;/i&gt;
; GetKeyValue (string Pair, out string Key, out string Value) : &lt;i&gt;finish me&lt;/i&gt;
; bool HasOption (string Options, string InKey) : &lt;i&gt;finish me&lt;/i&gt;
; string ParseOption (string Options, string InKey) : &lt;i&gt;finsh me&lt;/i&gt;
; ProcessServerTravel (string URL, bool bItems) : Called when a map changes.  Is responsible for handling the transfer of players and their inventory as well as ensuring that all logging for the level jsut played is tidied up.
; bool AtCapacity (string Options) : This function returns true if the server has the maximum number of players allowed on it.
; bool CheckIPPolicy (string Address) : Returns &lt;tt&gt;true&lt;/tt&gt; if the IP address of the client is allowed to connect to the server.
; int GetIntOption( string Options, string ParseString, int CurrentValue ) : &lt;i&gt;finish me&lt;/i&gt;
; Logout ([[Legacy:Pawn (UT)|Pawn (UT)]] Exiting) : Logs the player out and tells the logging engine about it.
; AddDefaultInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Add any default inventory to the player.
; NavigationPoint FindPlayerStart ([[Legacy:Pawn (UT)|Pawn (UT)]] Player, optional byte InTeam, optional string incomingName) : Locates the &quot;best&quot; player start for the player.
; bool RestartPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] aPlayer) : Restart a player after they have died.  This function adds the default inventory by calling AddDefaultInventory(), finds a start location by calling (you guessed it) FindPlayerStart().  Once this has been acomplished, sets the player's stats back to defaults.
; StartPlayer ([[Legacy:PlayerPawn|PlayerPawn]] Other) : Start a player. &lt;i&gt;Finish me&lt;/i&gt;
; Killed ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Called when someon gets killed.  This function broadcasts the death message, logs the event, and calls the &lt;tt&gt;ScoreKill()&lt;/tt&gt; function.
; BroadcastRegularDeathMessage ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Calls on to &lt;tt&gt;BroadcastLocalizedMessage()&lt;/tt&gt;.
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Increases the Killer's killCount and score by 1 unless it was a suicide - in which case the killed pawn loses a point.
; string KillMessage (name damageType, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) [static] : Returns &quot; died.&quot; as a default catch all death message.
; bool CanSpectate ([[Legacy:Pawn (UT)|Pawn (UT)]] Viewer, [[Legacy:Actor|Actor]] ViewTarget) : Returns whether players are allowed to use a certain Actor as ViewTarget.
; RegisterDamageMutator ([[Legacy:Mutator|Mutator]] M) : Adds a damage mutator at the front of the list of damage mutators.
; RegisterMessageMutator ([[Legacy:Mutator|Mutator]] M) : Adds a message mutator at the front of the list of message mutators.
; int ReduceDamage (int Damage, name DamageType, [[Legacy:Pawn (UT)|Pawn (UT)]] injured, [[Legacy:Pawn (UT)|Pawn (UT)]] instigatedBy) : This function returns a damage of 0 if the injured [[Legacy:Pawn (UT)|Pawn (UT)]] is in a zone that has it's &lt;tt&gt;bNeutralZone&lt;/tt&gt; property set to &lt;tt&gt;true&lt;/tt&gt;.  Otherwise the original damage is returned.
; bool ShouldRespawn ([[Legacy:Actor|Actor]] Other) : Returns whether an actor item should respawn. In death matches this function should return True for weapon and item pickups.
; bool PickupQuery ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Inventory (UT)|Inventory (UT)]] Item) : Called when pawn has a chance to pick Item up (i.e. when the pawn touches a weapon or item pickup). Should return true if he wants to pick it up, false if he does not want it.
; DiscardInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Discard a player's inventory after he dies.
; float PlayerJumpZScaling ( ) : Returns 1.0, but could be overidden for &quot;low grav&quot; game types
; ChangeName ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, coerce string S, bool bNameChange) : Attempt to change a players name.
; bool ChangeTeam ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, int N) : Return whether a player can change teams or not.
; float PlaySpawnEffect ([[Legacy:Inventory (UT)|Inventory (UT)]] Inv) : Play an inventory respawn effect.
; string PlayerKillMessage (name damageType, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Other) [static] : returns &quot; was killed by &quot;.
; string CreatureKillMessage (name damageType, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) [static] : returns &quot;was killed by a &quot;
; SendPlayer ([[Legacy:PlayerPawn|PlayerPawn]] aPlayer, string URL) : Send the player specified to the URL passed to the function.
; RestartGame ( ) : Called to restart the current game
; bool AllowsBroadcast ([[Legacy:Actor|Actor]] broadcaster, int Len) : Returns &lt;tt&gt;true&lt;/tt&gt; if the [[Legacy:Actor|Actor]] passed to the function is allowed to broadcast a message.
; EndGame (string Reason) : Called at the end of the game.  Is responsible for checking with the mutator function &lt;tt&gt;HandleEndGame()&lt;/tt&gt; and the function &lt;tt&gt;SetEndCams&lt;/tt&gt; to determine whether the ame should go into extra time.  The function also closes the game logging down.
; bool SetEndCams (string Reason) : Puts all player pawns into a ''GameEnded'' state and calls the &lt;tt&gt;clientGameEnded()&lt;/tt&gt; function on them.  The function returns &lt;tt&gt;true&lt;/tt&gt;.
; ResetGame ( ) [static] : &lt;i&gt;finish me&lt;/i&gt;
; bool AddBot ( ) : &lt;i&gt;finish me&lt;/i&gt;
; bool ForceAddBot ( ) : &lt;i&gt;finish me&lt;/i&gt;
; PlayTeleportEffect ([[Legacy:Actor|Actor]] Incoming, bool bOut, bool bSound) : &lt;i&gt;finish me&lt;/i&gt;

===Native Functions ===
; string GetNetworkNumber() : &lt;i&gt;finish me&lt;/i&gt;
; string ParseKillMessage (string KillerName, string VictimName, string WeaponName, string DeathMessage) [static] : Parses the kill message.  Replaces the first occurances of &lt;tt&gt;%k&lt;/tt&gt;, &lt;tt&gt;%o&lt;/tt&gt; and &lt;tt&gt;%w&lt;/tt&gt; with &lt;tt&gt;KillerName&lt;/tt&gt;, &lt;tt&gt;VictimName&lt;/tt&gt; and &lt;tt&gt;WeaponName&lt;/tt&gt; respectively. (also see [[Legacy:Message Placeholder|Message Placeholder]])

===Events ===
; GameEnding ( ) : This functon is called when a game is shut down.  It halts any world logging and local logging.
; DetailChange ( ) : This function is called whenever the client changes their level of detail (high to low, or low to high).  Apart from re-linking all of the zones to a SkyBox, any actors with their &lt;tt&gt;bHighDetailMode&lt;/tt&gt; property set to true will be destroyed on entry to a &quot;low detail&quot; mode.
; InitGame (string Options, out string Error) : This function is called before the [[Legacy:Actor|Actor]]s &lt;tt&gt;PreBeginPlay()&lt;/tt&gt; function if the comment in the file is to be believed.  It sets up some of the game options.
; string GetBeaconText ( ) : &lt;i&gt;finish me&lt;/i&gt;
; PreLogin (string Options, string Address, out string Error, out string FailCode) : Accepts or rejects a player based upon any game password vlaidation, IP bans, and current server capacity.
; [[Legacy:PlayerPawn|PlayerPawn]] Login (string Portal, string Options, out string Error, class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; SpawnClass) : Log a player in.  Fails login if you set the Error string.  PreLogin is called before Login, but significant game time may pass before Login is called, especially if content is downloaded.
; PostLogin ([[Legacy:PlayerPawn|PlayerPawn]] NewPlayer) : Called after a successful login. This is the first place it is safe to call replicated functions on the PlayerPawn. &lt;i&gt;finish me&lt;/i&gt;
; AcceptInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Called when new inventory is accepted.  Calls the function &lt;tt&gt;AddDefaultInventory&lt;/tt&gt;.
; ScoreEvent (name EventName, [[Legacy:Actor|Actor]] EventActor, [[Legacy:Pawn (UT)|Pawn (UT)]] InstigatedBy) : Placeholder event function.

==Known subclasses ==
* [[Legacy:UnrealGameInfo|UnrealGameInfo]]
* [[Legacy:TournamentGameInfo|TournamentGameInfo]]

==Comments ==

We could do with a nice time diagram showing when all of the different functions and events (including those on the mutators) get called.

==Related Topics ==

See [[Legacy:Function Syntax|Function Syntax]] and [[Legacy:Variable Syntax|Variable Syntax]] for additional background information.

----

[[:Category:Legacy Class (UT)]]

----

'''Fearless''': Hmmm, some interesting information here even if it's basic. I'd really like to do a mutator that changes gamespeed without the intervention of an admin. I have also a little question concerning the adminlogout command. It says here that the player is killed when the command is invoked. This does happen on our Linux 4.40 server but this doesn't happen on a server you're hosting yourself. Does anyone have any idea why this is :P ?

'''NogginBasher''': You can do that using a combination of x3dfxMapVote and IdeFiX's ServerMode.  In ServerMode.ini you need something like: &quot;Commands[11]=SET Engine.GameInfo GameSpeed 1.25&quot;.  I'm currently testing: &quot;Commands[12]=SET Botpack.DeathMatchPlus bHardcoreMode True&quot;
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3353</id>
      <timestamp>2004-12-03T17:43:19Z</timestamp>
      <contributor>
        <ip>Fearless</ip>
      </contributor>
      <comment>comment added.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; GameInfo (Package: Engine)}}

A GameInfo subclass contains the rules for a gametype.  This includes timelimit, fraglimit, scoring, difficulty, game speed, allowed playerpawn classes, default inventory assignment, and if appropriate, team assignment and general bot behavior.

This is assigned to a map in the [[Legacy:Level Properties|Level Properties]] window, under LevelInfo -&gt; DefaultGameType.

The &lt;tt&gt;GameInfo&lt;/tt&gt; for the current game can be retrieved from every actor in that game via &lt;tt&gt;Level.Game&lt;/tt&gt;, but ''only'' on the server.  &lt;tt&gt;GameInfo&lt;/tt&gt; is not replicated to network clients; only [[Legacy:GameReplicationInfo (UT)|GameReplicationInfo (UT)]] is.

See [[Legacy:GameInfo|GameInfo]] for the UT200x version of this class.

==Properties==

===Globalconfig Properties===
; bool bMuteSpectators : Whether spectators are allowed to speak.
; bool bLowGore : Whether or not to reduce gore.
; bool bVeryLowGore : Greatly reduces gore.
; bool bNoCheating : Disallows cheating. Hehe.
; bool bAllowFOV : Allows FOV changes in net games
; bool bExternalBatcher : 
; float AutoAim : How much autoaiming to do (1 = none, 0 = always). (cosine of max error to correct)
; float GameSpeed : Scale applied to game rate.
; int MaxSpectators : Maximum number of spectators.
; private string AdminPassword : Password to receive bAdmin privileges.
; private string GamePassword : Password to enter game.
; int MaxPlayers : 
; string ServerLogName : Server Log
; bool bLocalLog : 
; bool bWorldLog : 
; bool bBatchLocal : 
; int DemoBuild : 
; int DemoHasTuts : 
; string IPPolicies[50] : 

===Config Properties===
; bool bNoMonsters : Whether monsters are allowed in this play mode.
; bool bHumansOnly : Whether non human player models are allowed.
; bool bCoopWeaponMode : Whether or not weapons stay when picked up.
; bool bClassicDeathmessages : Weapon deathmessages if false.

===Localized Properties===
; bool bAlternateMode : 
; string SwitchLevelMessage : 
; string DefaultPlayerName : 
; string LeftMessage : 
; string FailedSpawnMessage : 
; string FailedPlaceMessage : 
; string FailedTeamMessage : 
; string NameChangedMessage : 
; string EnteredMessage : 
; string GameName : 
; string MaxedOutMessage : 
; string WrongPassword : 
; string NeedPassword : 
; string IPBanned : 

===Other Properties===
; int ItemGoals, KillGoals, SecretGoals : Special game goals.
; byte Difficulty : In Unreal: 0=easy, 1=medium, 2=hard, 3=very hard. In UT: 0=Novice, 1=
; bool bRestartLevel : 
; bool bPauseable : Whether the level is pauseable.
; bool bCanChangeSkin : Allow player to change skins in game.
; bool bTeamGame : This is a teamgame.
; bool bDeathMatch : This game is some type of deathmatch (where players can respawn during gameplay)
; bool bGameEnded : set when game ends
; bool bOverTime : 
; bool bCanViewOthers : 
; float StartTime : 
; class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; DefaultPlayerClass : 
; class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; DefaultWeapon : Default weapon given to player at start.
; int NumSpectators : Current number of spectators.
; class&lt;[[Legacy:ScoreBoard|ScoreBoard]]&gt; ScoreBoardType : Type of scoreboard this game uses.
; class&lt;[[Legacy:Menu|Menu]]&gt; GameMenuType : Type of oldstyle game options menu to display.
; string BotMenuType : Type of bot menu to display.
; string RulesMenuType : Type of rules menu to display.
; string SettingsMenuType : Type of settings menu to display.
; string GameUMenuType : Type of Game dropdown to display.
; string MultiplayerUMenuType : Type of Multiplayer dropdown to display.
; string GameOptionsMenuType : Type of options dropdown to display.
; class&lt;[[Legacy:HUD (UT)|HUD (UT)]]&gt; HUDType : HUD class this game uses.
; class&lt;[[Legacy:MapList|MapList]]&gt; MapListType : Maplist this game uses.
; string MapPrefix : Prefix characters for names of maps for this game type.
; string BeaconName : Identifying string used for finding LAN servers.
; string SpecialDamageString : 
; int SentText : 
; int NumPlayers : 
; int CurrentID : 
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; DeathMessageClass : 
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; DMMessageClass : A message class to be used for commonly used messages. For example, the [[Legacy:DeathMatchPlus|DeathMatchPlus]] gametype sets [[Legacy:DeathMatchMessage|DeathMatchMessage]] as the default, which contains messages for overtime, players leaving and joining the game, players changing names, and players switching teams.
; class&lt;[[Legacy:Mutator|Mutator]]&gt; MutatorClass : Class of this gametype's base mutator. (Default is Engine.[[Legacy:Mutator|Mutator]], [[Legacy:DeathMatchPlus|DeathMatchPlus]] uses Botpack.[[Legacy:DMMutator|DMMutator]].)
; [[Legacy:Mutator|Mutator]] BaseMutator : 
; [[Legacy:Mutator|Mutator]] DamageMutator : [[Legacy:Linked List|Linked list]] of mutators which affect damage.
; [[Legacy:Mutator|Mutator]] MessageMutator : [[Legacy:Linked List|Linked list]] of mutators which get localized message queries.
; class&lt;[[Legacy:ZoneInfo|ZoneInfo]]&gt; WaterZoneType : Default waterzone entry and exit effects
; name DefaultPlayerState : What state a player should start in for this game type
; class&lt;[[Legacy:GameReplicationInfo|GameReplicationInfo]]&gt; GameReplicationInfoClass : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GameReplicationInfo : 
; [[Legacy:StatLog|StatLog]] LocalLog : 
; [[Legacy:StatLog|StatLog]] WorldLog : 
; bool bLoggingGame : Does this gametype log?
; string LocalLogFileName : 
; string WorldLogFileName : 
; class&lt;[[Legacy:StatLog|StatLog]]&gt; StatLogClass : 
; string EnabledMutators : Server query info

==Methods ==
; AdminLogin ([[Legacy:PlayerPawn|PlayerPawn]] P, string Password) : This function will allow a player to log in as the administrator if the password entered is correct.  The function also broadcasts a notification message to the other players.
; AdminLogout ([[Legacy:PlayerPawn|PlayerPawn]] P) : This function is called when a player leaves administrator mode.  It ensures that the player is forced to &quot;Walk&quot;, and kills them.  &lt;i&gt;There is code in there to preserve the players score when they die from logging out of admin mode but I'm sure it doesn't work in practice. &amp;ndash; must check&lt;/i&gt;.
; InitLogging ( ) : Called from &lt;code&gt;PostBeginPlay()&lt;/code&gt;. Logs more stuff than you can shake a big stick at.  Calls functions on the WorldLog, Log, and LocalLog objects to do so.
; InitGameReplicationInfo ( ) : This function is responsible for placing the values of the attributes of the GameInfo class important to the client onto the [[Legacy:GameReplicationInfo|GameReplicationInfo]] object.
; string GetInfo ( ) : Returns the status of the World log.
; string GetRules ( ) : This function builds up a description of the server from the list of mutators currently in use, the type of server (Listen or otherwise), and whether there is a password on the server or not.
; int GetServerPort ( ) : This functon returns the port the server is runing on by interrogating the level URL.
; bool SetPause (bool bPause, [[Legacy:PlayerPawn|PlayerPawn]] P) : If the level can be paused then the player who paused the game is stored and the function returns &lt;tt&gt;true&lt;/tt&gt;.  If the game is not pausable then the function will return &lt;tt&gt;false&lt;/tt&gt;.
; LogGameParameters ([[Legacy:StatLog|StatLog]] StatLog) : This function writes the general game parameters to the stat. log.
; SetGameSpeed (float T) : This function sets the game speed.
; bool IsRelevant ([[Legacy:Actor|Actor]] Other) : This function is called from any [[Legacy:Actor|Actor]]'s &lt;code&gt;PreBeginPlay()&lt;/code&gt;.  If this function returns &lt;tt&gt;true&lt;/tt&gt; the actor continues to exist.  If the function returns &lt;tt&gt;false&lt;/tt&gt; then the actor is removed from the game.  This function calls the &lt;tt&gt;AlwaysKeep(), and IsRelevant()&lt;/tt&gt; functions on any mutators within the game prior to checking actor difficulty levels and &quot;odds of appearing&quot; values.  The function also counts the number of remaining &lt;tt&gt;SecretGoals&lt;/tt&gt;, &lt;tt&gt;ItemGoals&lt;/tt&gt;, and &lt;tt&gt;KillGoals&lt;/tt&gt; left within the level. (also see [[Legacy:Creating Actors And Objects|Creating Actors And Objects]])
; bool GrabOption (out string Options, out string Result) : &lt;i&gt;finish me&lt;/i&gt;
; GetKeyValue (string Pair, out string Key, out string Value) : &lt;i&gt;finish me&lt;/i&gt;
; bool HasOption (string Options, string InKey) : &lt;i&gt;finish me&lt;/i&gt;
; string ParseOption (string Options, string InKey) : &lt;i&gt;finsh me&lt;/i&gt;
; ProcessServerTravel (string URL, bool bItems) : Called when a map changes.  Is responsible for handling the transfer of players and their inventory as well as ensuring that all logging for the level jsut played is tidied up.
; bool AtCapacity (string Options) : This function returns true if the server has the maximum number of players allowed on it.
; bool CheckIPPolicy (string Address) : Returns &lt;tt&gt;true&lt;/tt&gt; if the IP address of the client is allowed to connect to the server.
; int GetIntOption( string Options, string ParseString, int CurrentValue ) : &lt;i&gt;finish me&lt;/i&gt;
; Logout ([[Legacy:Pawn (UT)|Pawn (UT)]] Exiting) : Logs the player out and tells the logging engine about it.
; AddDefaultInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Add any default inventory to the player.
; NavigationPoint FindPlayerStart ([[Legacy:Pawn (UT)|Pawn (UT)]] Player, optional byte InTeam, optional string incomingName) : Locates the &quot;best&quot; player start for the player.
; bool RestartPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] aPlayer) : Restart a player after they have died.  This function adds the default inventory by calling AddDefaultInventory(), finds a start location by calling (you guessed it) FindPlayerStart().  Once this has been acomplished, sets the player's stats back to defaults.
; StartPlayer ([[Legacy:PlayerPawn|PlayerPawn]] Other) : Start a player. &lt;i&gt;Finish me&lt;/i&gt;
; Killed ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Called when someon gets killed.  This function broadcasts the death message, logs the event, and calls the &lt;tt&gt;ScoreKill()&lt;/tt&gt; function.
; BroadcastRegularDeathMessage ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Calls on to &lt;tt&gt;BroadcastLocalizedMessage()&lt;/tt&gt;.
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Increases the Killer's killCount and score by 1 unless it was a suicide - in which case the killed pawn loses a point.
; string KillMessage (name damageType, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) [static] : Returns &quot; died.&quot; as a default catch all death message.
; bool CanSpectate ([[Legacy:Pawn (UT)|Pawn (UT)]] Viewer, [[Legacy:Actor|Actor]] ViewTarget) : Returns whether players are allowed to use a certain Actor as ViewTarget.
; RegisterDamageMutator ([[Legacy:Mutator|Mutator]] M) : Adds a damage mutator at the front of the list of damage mutators.
; RegisterMessageMutator ([[Legacy:Mutator|Mutator]] M) : Adds a message mutator at the front of the list of message mutators.
; int ReduceDamage (int Damage, name DamageType, [[Legacy:Pawn (UT)|Pawn (UT)]] injured, [[Legacy:Pawn (UT)|Pawn (UT)]] instigatedBy) : This function returns a damage of 0 if the injured [[Legacy:Pawn (UT)|Pawn (UT)]] is in a zone that has it's &lt;tt&gt;bNeutralZone&lt;/tt&gt; property set to &lt;tt&gt;true&lt;/tt&gt;.  Otherwise the original damage is returned.
; bool ShouldRespawn ([[Legacy:Actor|Actor]] Other) : Returns whether an actor item should respawn. In death matches this function should return True for weapon and item pickups.
; bool PickupQuery ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Inventory (UT)|Inventory (UT)]] Item) : Called when pawn has a chance to pick Item up (i.e. when the pawn touches a weapon or item pickup). Should return true if he wants to pick it up, false if he does not want it.
; DiscardInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Discard a player's inventory after he dies.
; float PlayerJumpZScaling ( ) : Returns 1.0, but could be overidden for &quot;low grav&quot; game types
; ChangeName ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, coerce string S, bool bNameChange) : Attempt to change a players name.
; bool ChangeTeam ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, int N) : Return whether a player can change teams or not.
; float PlaySpawnEffect ([[Legacy:Inventory (UT)|Inventory (UT)]] Inv) : Play an inventory respawn effect.
; string PlayerKillMessage (name damageType, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Other) [static] : returns &quot; was killed by &quot;.
; string CreatureKillMessage (name damageType, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) [static] : returns &quot;was killed by a &quot;
; SendPlayer ([[Legacy:PlayerPawn|PlayerPawn]] aPlayer, string URL) : Send the player specified to the URL passed to the function.
; RestartGame ( ) : Called to restart the current game
; bool AllowsBroadcast ([[Legacy:Actor|Actor]] broadcaster, int Len) : Returns &lt;tt&gt;true&lt;/tt&gt; if the [[Legacy:Actor|Actor]] passed to the function is allowed to broadcast a message.
; EndGame (string Reason) : Called at the end of the game.  Is responsible for checking with the mutator function &lt;tt&gt;HandleEndGame()&lt;/tt&gt; and the function &lt;tt&gt;SetEndCams&lt;/tt&gt; to determine whether the ame should go into extra time.  The function also closes the game logging down.
; bool SetEndCams (string Reason) : Puts all player pawns into a ''GameEnded'' state and calls the &lt;tt&gt;clientGameEnded()&lt;/tt&gt; function on them.  The function returns &lt;tt&gt;true&lt;/tt&gt;.
; ResetGame ( ) [static] : &lt;i&gt;finish me&lt;/i&gt;
; bool AddBot ( ) : &lt;i&gt;finish me&lt;/i&gt;
; bool ForceAddBot ( ) : &lt;i&gt;finish me&lt;/i&gt;
; PlayTeleportEffect ([[Legacy:Actor|Actor]] Incoming, bool bOut, bool bSound) : &lt;i&gt;finish me&lt;/i&gt;

===Native Functions ===
; string GetNetworkNumber() : &lt;i&gt;finish me&lt;/i&gt;
; string ParseKillMessage (string KillerName, string VictimName, string WeaponName, string DeathMessage) [static] : Parses the kill message.  Replaces the first occurances of &lt;tt&gt;%k&lt;/tt&gt;, &lt;tt&gt;%o&lt;/tt&gt; and &lt;tt&gt;%w&lt;/tt&gt; with &lt;tt&gt;KillerName&lt;/tt&gt;, &lt;tt&gt;VictimName&lt;/tt&gt; and &lt;tt&gt;WeaponName&lt;/tt&gt; respectively. (also see [[Legacy:Message Placeholder|Message Placeholder]])

===Events ===
; GameEnding ( ) : This functon is called when a game is shut down.  It halts any world logging and local logging.
; DetailChange ( ) : This function is called whenever the client changes their level of detail (high to low, or low to high).  Apart from re-linking all of the zones to a SkyBox, any actors with their &lt;tt&gt;bHighDetailMode&lt;/tt&gt; property set to true will be destroyed on entry to a &quot;low detail&quot; mode.
; InitGame (string Options, out string Error) : This function is called before the [[Legacy:Actor|Actor]]s &lt;tt&gt;PreBeginPlay()&lt;/tt&gt; function if the comment in the file is to be believed.  It sets up some of the game options.
; string GetBeaconText ( ) : &lt;i&gt;finish me&lt;/i&gt;
; PreLogin (string Options, string Address, out string Error, out string FailCode) : Accepts or rejects a player based upon any game password vlaidation, IP bans, and current server capacity.
; [[Legacy:PlayerPawn|PlayerPawn]] Login (string Portal, string Options, out string Error, class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; SpawnClass) : Log a player in.  Fails login if you set the Error string.  PreLogin is called before Login, but significant game time may pass before Login is called, especially if content is downloaded.
; PostLogin ([[Legacy:PlayerPawn|PlayerPawn]] NewPlayer) : Called after a successful login. This is the first place it is safe to call replicated functions on the PlayerPawn. &lt;i&gt;finish me&lt;/i&gt;
; AcceptInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Called when new inventory is accepted.  Calls the function &lt;tt&gt;AddDefaultInventory&lt;/tt&gt;.
; ScoreEvent (name EventName, [[Legacy:Actor|Actor]] EventActor, [[Legacy:Pawn (UT)|Pawn (UT)]] InstigatedBy) : Placeholder event function.

==Known subclasses ==
* [[Legacy:UnrealGameInfo|UnrealGameInfo]]
* [[Legacy:TournamentGameInfo|TournamentGameInfo]]

==Comments ==

We could do with a nice time diagram showing when all of the different functions and events (including those on the mutators) get called.

==Related Topics ==

See [[Legacy:Function Syntax|Function Syntax]] and [[Legacy:Variable Syntax|Variable Syntax]] for additional background information.

----

[[:Category:Legacy Class (UT)]]

----

'''Fearless''': Hmmm, some interesting information here even if it's basic. I'd really like to do a mutator that changes gamespeed without the intervention of an admin. I have also a little question concerning the adminlogout command. It says here that the player is killed when the command is invoked. This does happen on our Linux 4.40 server but this doesn't happen on a server you're hosting yourself. Does anyone have any idea why this is :P ?
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3354</id>
      <timestamp>2006-06-22T14:37:14Z</timestamp>
      <contributor>
        <ip>NogginBasher</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; GameInfo (Package: Engine)}}

A GameInfo subclass contains the rules for a gametype.  This includes timelimit, fraglimit, scoring, difficulty, game speed, allowed playerpawn classes, default inventory assignment, and if appropriate, team assignment and general bot behavior.

This is assigned to a map in the [[Legacy:Level Properties|Level Properties]] window, under LevelInfo -&gt; DefaultGameType.

The &lt;tt&gt;GameInfo&lt;/tt&gt; for the current game can be retrieved from every actor in that game via &lt;tt&gt;Level.Game&lt;/tt&gt;, but ''only'' on the server.  &lt;tt&gt;GameInfo&lt;/tt&gt; is not replicated to network clients; only [[Legacy:GameReplicationInfo (UT)|GameReplicationInfo (UT)]] is.

See [[Legacy:GameInfo|GameInfo]] for the UT200x version of this class.

==Properties==

===Globalconfig Properties===
; bool bMuteSpectators : Whether spectators are allowed to speak.
; bool bLowGore : Whether or not to reduce gore.
; bool bVeryLowGore : Greatly reduces gore.
; bool bNoCheating : Disallows cheating. Hehe.
; bool bAllowFOV : Allows FOV changes in net games
; bool bExternalBatcher : 
; float AutoAim : How much autoaiming to do (1 = none, 0 = always). (cosine of max error to correct)
; float GameSpeed : Scale applied to game rate.
; int MaxSpectators : Maximum number of spectators.
; private string AdminPassword : Password to receive bAdmin privileges.
; private string GamePassword : Password to enter game.
; int MaxPlayers : 
; string ServerLogName : Server Log
; bool bLocalLog : 
; bool bWorldLog : 
; bool bBatchLocal : 
; int DemoBuild : 
; int DemoHasTuts : 
; string IPPolicies[50] : 

===Config Properties===
; bool bNoMonsters : Whether monsters are allowed in this play mode.
; bool bHumansOnly : Whether non human player models are allowed.
; bool bCoopWeaponMode : Whether or not weapons stay when picked up.
; bool bClassicDeathmessages : Weapon deathmessages if false.

===Localized Properties===
; bool bAlternateMode : 
; string SwitchLevelMessage : 
; string DefaultPlayerName : 
; string LeftMessage : 
; string FailedSpawnMessage : 
; string FailedPlaceMessage : 
; string FailedTeamMessage : 
; string NameChangedMessage : 
; string EnteredMessage : 
; string GameName : 
; string MaxedOutMessage : 
; string WrongPassword : 
; string NeedPassword : 
; string IPBanned : 

===Other Properties===
; int ItemGoals, KillGoals, SecretGoals : Special game goals.
; byte Difficulty : In Unreal: 0=easy, 1=medium, 2=hard, 3=very hard. In UT: 0=Novice, 1=
; bool bRestartLevel : 
; bool bPauseable : Whether the level is pauseable.
; bool bCanChangeSkin : Allow player to change skins in game.
; bool bTeamGame : This is a teamgame.
; bool bDeathMatch : This game is some type of deathmatch (where players can respawn during gameplay)
; bool bGameEnded : set when game ends
; bool bOverTime : 
; bool bCanViewOthers : 
; float StartTime : 
; class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; DefaultPlayerClass : 
; class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; DefaultWeapon : Default weapon given to player at start.
; int NumSpectators : Current number of spectators.
; class&lt;[[Legacy:ScoreBoard|ScoreBoard]]&gt; ScoreBoardType : Type of scoreboard this game uses.
; class&lt;[[Legacy:Menu|Menu]]&gt; GameMenuType : Type of oldstyle game options menu to display.
; string BotMenuType : Type of bot menu to display.
; string RulesMenuType : Type of rules menu to display.
; string SettingsMenuType : Type of settings menu to display.
; string GameUMenuType : Type of Game dropdown to display.
; string MultiplayerUMenuType : Type of Multiplayer dropdown to display.
; string GameOptionsMenuType : Type of options dropdown to display.
; class&lt;[[Legacy:HUD (UT)|HUD (UT)]]&gt; HUDType : HUD class this game uses.
; class&lt;[[Legacy:MapList|MapList]]&gt; MapListType : Maplist this game uses.
; string MapPrefix : Prefix characters for names of maps for this game type.
; string BeaconName : Identifying string used for finding LAN servers.
; string SpecialDamageString : 
; int SentText : 
; int NumPlayers : 
; int CurrentID : 
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; DeathMessageClass : 
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; DMMessageClass : A message class to be used for commonly used messages. For example, the [[Legacy:DeathMatchPlus|DeathMatchPlus]] gametype sets [[Legacy:DeathMatchMessage|DeathMatchMessage]] as the default, which contains messages for overtime, players leaving and joining the game, players changing names, and players switching teams.
; class&lt;[[Legacy:Mutator|Mutator]]&gt; MutatorClass : Class of this gametype's base mutator. (Default is Engine.[[Legacy:Mutator|Mutator]], [[Legacy:DeathMatchPlus|DeathMatchPlus]] uses Botpack.[[Legacy:DMMutator|DMMutator]].)
; [[Legacy:Mutator|Mutator]] BaseMutator : 
; [[Legacy:Mutator|Mutator]] DamageMutator : [[Legacy:Linked List|Linked list]] of mutators which affect damage.
; [[Legacy:Mutator|Mutator]] MessageMutator : [[Legacy:Linked List|Linked list]] of mutators which get localized message queries.
; class&lt;[[Legacy:ZoneInfo|ZoneInfo]]&gt; WaterZoneType : Default waterzone entry and exit effects
; name DefaultPlayerState : What state a player should start in for this game type
; class&lt;[[Legacy:GameReplicationInfo|GameReplicationInfo]]&gt; GameReplicationInfoClass : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GameReplicationInfo : 
; [[Legacy:StatLog|StatLog]] LocalLog : 
; [[Legacy:StatLog|StatLog]] WorldLog : 
; bool bLoggingGame : Does this gametype log?
; string LocalLogFileName : 
; string WorldLogFileName : 
; class&lt;[[Legacy:StatLog|StatLog]]&gt; StatLogClass : 
; string EnabledMutators : Server query info

==Methods ==
; AdminLogin ([[Legacy:PlayerPawn|PlayerPawn]] P, string Password) : This function will allow a player to log in as the administrator if the password entered is correct.  The function also broadcasts a notification message to the other players.
; AdminLogout ([[Legacy:PlayerPawn|PlayerPawn]] P) : This function is called when a player leaves administrator mode.  It ensures that the player is forced to &quot;Walk&quot;, and kills them.  &lt;i&gt;There is code in there to preserve the players score when they die from logging out of admin mode but I'm sure it doesn't work in practice. &amp;ndash; must check&lt;/i&gt;.
; InitLogging ( ) : Called from &lt;code&gt;PostBeginPlay()&lt;/code&gt;. Logs more stuff than you can shake a big stick at.  Calls functions on the WorldLog, Log, and LocalLog objects to do so.
; InitGameReplicationInfo ( ) : This function is responsible for placing the values of the attributes of the GameInfo class important to the client onto the [[Legacy:GameReplicationInfo|GameReplicationInfo]] object.
; string GetInfo ( ) : Returns the status of the World log.
; string GetRules ( ) : This function builds up a description of the server from the list of mutators currently in use, the type of server (Listen or otherwise), and whether there is a password on the server or not.
; int GetServerPort ( ) : This functon returns the port the server is runing on by interrogating the level URL.
; bool SetPause (bool bPause, [[Legacy:PlayerPawn|PlayerPawn]] P) : If the level can be paused then the player who paused the game is stored and the function returns &lt;tt&gt;true&lt;/tt&gt;.  If the game is not pausable then the function will return &lt;tt&gt;false&lt;/tt&gt;.
; LogGameParameters ([[Legacy:StatLog|StatLog]] StatLog) : This function writes the general game parameters to the stat. log.
; SetGameSpeed (float T) : This function sets the game speed.
; bool IsRelevant ([[Legacy:Actor|Actor]] Other) : This function is called from any [[Legacy:Actor|Actor]]'s &lt;code&gt;PreBeginPlay()&lt;/code&gt;.  If this function returns &lt;tt&gt;true&lt;/tt&gt; the actor continues to exist.  If the function returns &lt;tt&gt;false&lt;/tt&gt; then the actor is removed from the game.  This function calls the &lt;tt&gt;AlwaysKeep(), and IsRelevant()&lt;/tt&gt; functions on any mutators within the game prior to checking actor difficulty levels and &quot;odds of appearing&quot; values.  The function also counts the number of remaining &lt;tt&gt;SecretGoals&lt;/tt&gt;, &lt;tt&gt;ItemGoals&lt;/tt&gt;, and &lt;tt&gt;KillGoals&lt;/tt&gt; left within the level. (also see [[Legacy:Creating Actors And Objects|Creating Actors And Objects]])
; bool GrabOption (out string Options, out string Result) : &lt;i&gt;finish me&lt;/i&gt;
; GetKeyValue (string Pair, out string Key, out string Value) : &lt;i&gt;finish me&lt;/i&gt;
; bool HasOption (string Options, string InKey) : &lt;i&gt;finish me&lt;/i&gt;
; string ParseOption (string Options, string InKey) : &lt;i&gt;finsh me&lt;/i&gt;
; ProcessServerTravel (string URL, bool bItems) : Called when a map changes.  Is responsible for handling the transfer of players and their inventory as well as ensuring that all logging for the level jsut played is tidied up.
; bool AtCapacity (string Options) : This function returns true if the server has the maximum number of players allowed on it.
; bool CheckIPPolicy (string Address) : Returns &lt;tt&gt;true&lt;/tt&gt; if the IP address of the client is allowed to connect to the server.
; int GetIntOption( string Options, string ParseString, int CurrentValue ) : &lt;i&gt;finish me&lt;/i&gt;
; Logout ([[Legacy:Pawn (UT)|Pawn (UT)]] Exiting) : Logs the player out and tells the logging engine about it.
; AddDefaultInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Add any default inventory to the player.
; NavigationPoint FindPlayerStart ([[Legacy:Pawn (UT)|Pawn (UT)]] Player, optional byte InTeam, optional string incomingName) : Locates the &quot;best&quot; player start for the player.
; bool RestartPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] aPlayer) : Restart a player after they have died.  This function adds the default inventory by calling AddDefaultInventory(), finds a start location by calling (you guessed it) FindPlayerStart().  Once this has been acomplished, sets the player's stats back to defaults.
; StartPlayer ([[Legacy:PlayerPawn|PlayerPawn]] Other) : Start a player. &lt;i&gt;Finish me&lt;/i&gt;
; Killed ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Called when someon gets killed.  This function broadcasts the death message, logs the event, and calls the &lt;tt&gt;ScoreKill()&lt;/tt&gt; function.
; BroadcastRegularDeathMessage ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other, name damageType) : Calls on to &lt;tt&gt;BroadcastLocalizedMessage()&lt;/tt&gt;.
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Increases the Killer's killCount and score by 1 unless it was a suicide - in which case the killed pawn loses a point.
; string KillMessage (name damageType, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) [static] : Returns &quot; died.&quot; as a default catch all death message.
; bool CanSpectate ([[Legacy:Pawn (UT)|Pawn (UT)]] Viewer, [[Legacy:Actor|Actor]] ViewTarget) : Returns whether players are allowed to use a certain Actor as ViewTarget.
; RegisterDamageMutator ([[Legacy:Mutator|Mutator]] M) : Adds a damage mutator at the front of the list of damage mutators.
; RegisterMessageMutator ([[Legacy:Mutator|Mutator]] M) : Adds a message mutator at the front of the list of message mutators.
; int ReduceDamage (int Damage, name DamageType, [[Legacy:Pawn (UT)|Pawn (UT)]] injured, [[Legacy:Pawn (UT)|Pawn (UT)]] instigatedBy) : This function returns a damage of 0 if the injured [[Legacy:Pawn (UT)|Pawn (UT)]] is in a zone that has it's &lt;tt&gt;bNeutralZone&lt;/tt&gt; property set to &lt;tt&gt;true&lt;/tt&gt;.  Otherwise the original damage is returned.
; bool ShouldRespawn ([[Legacy:Actor|Actor]] Other) : Returns whether an actor item should respawn. In death matches this function should return True for weapon and item pickups.
; bool PickupQuery ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Inventory (UT)|Inventory (UT)]] Item) : Called when pawn has a chance to pick Item up (i.e. when the pawn touches a weapon or item pickup). Should return true if he wants to pick it up, false if he does not want it.
; DiscardInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Discard a player's inventory after he dies.
; float PlayerJumpZScaling ( ) : Returns 1.0, but could be overidden for &quot;low grav&quot; game types
; ChangeName ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, coerce string S, bool bNameChange) : Attempt to change a players name.
; bool ChangeTeam ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, int N) : Return whether a player can change teams or not.
; float PlaySpawnEffect ([[Legacy:Inventory (UT)|Inventory (UT)]] Inv) : Play an inventory respawn effect.
; string PlayerKillMessage (name damageType, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Other) [static] : returns &quot; was killed by &quot;.
; string CreatureKillMessage (name damageType, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) [static] : returns &quot;was killed by a &quot;
; SendPlayer ([[Legacy:PlayerPawn|PlayerPawn]] aPlayer, string URL) : Send the player specified to the URL passed to the function.
; RestartGame ( ) : Called to restart the current game
; bool AllowsBroadcast ([[Legacy:Actor|Actor]] broadcaster, int Len) : Returns &lt;tt&gt;true&lt;/tt&gt; if the [[Legacy:Actor|Actor]] passed to the function is allowed to broadcast a message.
; EndGame (string Reason) : Called at the end of the game.  Is responsible for checking with the mutator function &lt;tt&gt;HandleEndGame()&lt;/tt&gt; and the function &lt;tt&gt;SetEndCams&lt;/tt&gt; to determine whether the ame should go into extra time.  The function also closes the game logging down.
; bool SetEndCams (string Reason) : Puts all player pawns into a ''GameEnded'' state and calls the &lt;tt&gt;clientGameEnded()&lt;/tt&gt; function on them.  The function returns &lt;tt&gt;true&lt;/tt&gt;.
; ResetGame ( ) [static] : &lt;i&gt;finish me&lt;/i&gt;
; bool AddBot ( ) : &lt;i&gt;finish me&lt;/i&gt;
; bool ForceAddBot ( ) : &lt;i&gt;finish me&lt;/i&gt;
; PlayTeleportEffect ([[Legacy:Actor|Actor]] Incoming, bool bOut, bool bSound) : &lt;i&gt;finish me&lt;/i&gt;

===Native Functions ===
; string GetNetworkNumber() : &lt;i&gt;finish me&lt;/i&gt;
; string ParseKillMessage (string KillerName, string VictimName, string WeaponName, string DeathMessage) [static] : Parses the kill message.  Replaces the first occurances of &lt;tt&gt;%k&lt;/tt&gt;, &lt;tt&gt;%o&lt;/tt&gt; and &lt;tt&gt;%w&lt;/tt&gt; with &lt;tt&gt;KillerName&lt;/tt&gt;, &lt;tt&gt;VictimName&lt;/tt&gt; and &lt;tt&gt;WeaponName&lt;/tt&gt; respectively. (also see [[Legacy:Message Placeholder|Message Placeholder]])

===Events ===
; GameEnding ( ) : This functon is called when a game is shut down.  It halts any world logging and local logging.
; DetailChange ( ) : This function is called whenever the client changes their level of detail (high to low, or low to high).  Apart from re-linking all of the zones to a SkyBox, any actors with their &lt;tt&gt;bHighDetailMode&lt;/tt&gt; property set to true will be destroyed on entry to a &quot;low detail&quot; mode.
; InitGame (string Options, out string Error) : This function is called before the [[Legacy:Actor|Actor]]s &lt;tt&gt;PreBeginPlay()&lt;/tt&gt; function if the comment in the file is to be believed.  It sets up some of the game options.
; string GetBeaconText ( ) : &lt;i&gt;finish me&lt;/i&gt;
; PreLogin (string Options, string Address, out string Error, out string FailCode) : Accepts or rejects a player based upon any game password vlaidation, IP bans, and current server capacity.
; [[Legacy:PlayerPawn|PlayerPawn]] Login (string Portal, string Options, out string Error, class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; SpawnClass) : Log a player in.  Fails login if you set the Error string.  PreLogin is called before Login, but significant game time may pass before Login is called, especially if content is downloaded.
; PostLogin ([[Legacy:PlayerPawn|PlayerPawn]] NewPlayer) : Called after a successful login. This is the first place it is safe to call replicated functions on the PlayerPawn. &lt;i&gt;finish me&lt;/i&gt;
; AcceptInventory ([[Legacy:Pawn (UT)|Pawn (UT)]] PlayerPawn) : Called when new inventory is accepted.  Calls the function &lt;tt&gt;AddDefaultInventory&lt;/tt&gt;.
; ScoreEvent (name EventName, [[Legacy:Actor|Actor]] EventActor, [[Legacy:Pawn (UT)|Pawn (UT)]] InstigatedBy) : Placeholder event function.

==Known subclasses ==
* [[Legacy:UnrealGameInfo|UnrealGameInfo]]
* [[Legacy:TournamentGameInfo|TournamentGameInfo]]

==Comments ==

We could do with a nice time diagram showing when all of the different functions and events (including those on the mutators) get called.

==Related Topics ==

See [[Legacy:Function Syntax|Function Syntax]] and [[Legacy:Variable Syntax|Variable Syntax]] for additional background information.

----

[[:Category:Legacy Class (UT)]]

----

'''Fearless''': Hmmm, some interesting information here even if it's basic. I'd really like to do a mutator that changes gamespeed without the intervention of an admin. I have also a little question concerning the adminlogout command. It says here that the player is killed when the command is invoked. This does happen on our Linux 4.40 server but this doesn't happen on a server you're hosting yourself. Does anyone have any idea why this is :P ?

'''NogginBasher''': You can do that using a combination of x3dfxMapVote and ServerMode.  In ServerMode.ini you put &quot;Commands[11]=SET Engine.GameInfo GameSpeed 1.25&quot;, but I'm still trying to find out how to set hardcore damage.
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameMessage</title>
    <id>28331</id>
    <revision>
      <id>39998</id>
      <timestamp>2009-11-14T20:14:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameObject</title>
    <id>1350</id>
    <revision>
      <id>3433</id>
      <timestamp>2005-12-24T21:34:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Class page markup</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; GameObject (Package: UnrealGame)}}

GameObject is an abstract, notplaceable parentclass for all gameplay-related objects players can pick up.  Most (if not all) of these objects need to be brought to a [[Legacy:GameObjective|GameObjective]] actor (HomeBase) in order to score.

==Properties==

All of these properties are Hidden.
; bool bHome : Is the object at its home location?
; bool bHeld : Is the object being held?
; bool bDisabled : Used to hide the object between rounds.
; bool bLastSecondSave :
; [[Legacy:UnrealPawn|UnrealPawn]] Holder : The [[Legacy:Pawn|Pawn]] that is holding the object
; [[Legacy:TeamPlayerReplicationInfo|TeamPlayerReplicationInfo]] HolderPRI : The holder's [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]].
; [[Legacy:GameObjective|GameObjective]] HomeBase : The [[Legacy:GameObjective|GameObjective]] where the object starts out.
; float TakenTime : When the object was taken from its home.
; float MaxDropTime : How long the object will sit in its Dropped state before it resets.
; [[Legacy:Controller|Controller]] FirstTouch : Who touched this objective first.
; array&lt;[[Legacy:Controller|Controller]]&gt; Assists : Other players who held it after FirstTouch.
; name GameObjBone : The name of the bone to attach to while held.
; vector GameObjOffset :
; rotator GameObjRot :
; [[Legacy:TeamInfo|TeamInfo]] OldTeam : Used mainly by [[Legacy:XBombFlag|xBombFlag]] to keep track of when a team has gone &quot;on offense&quot;.

==Functions==
; PostBeginPlay() : Assumes the Owner is the HomeBase GameObjective.
; bool CanBeThrownBy( Pawn P ) : Returns true.
; bool CanBePickedUpBy( Pawn P ) : Returns true.
; SetHolder( [[Legacy:Controller|Controller]] C ) : This function is given a [[Legacy:Controller|Controller]], and assumes that the controller's pawn is an [[Legacy:UnrealPawn|UnrealPawn]]. This causes problems with the Vehicle Pickups mutator, which also allows picking up flags in vehicles. When a vehicle picks up a flag, the controller's pawn is a [[Legacy:Vehicle|Vehicle]], causing some accessed nones and other problems.
; Score() : Disables Touch(), resets Location and Rotation to HomeBase and switches to state Home.
; Drop( vectro NewVel ) : Logs a drop.  Sets location, velocity and switches to state Dropped.
; SendHome() : Sets location to homebase and switches to state Home.
; SendHomeDisabled ( float Timeout ) : EMPTY
; CalcSetHome() : Do some cleanup before going home.  Includes AI help.
; ClearHolder() : Make sure nobody thinks they're holding the object.
; SetDisable( bool disable ) (protected) : Sets bDisable and bHidden.
; Actor Position() : Get the [[Legacy:Actor|Actor]] that represents the object's position.  May be the object itself, the home base, or the holder.
; bool IsHome : Returns false.
; bool ValidHolder( Actor Other ) : Can the given [[Legacy:Actor|Actor]] hold this object?
; Touch( Actor Other ) (singluar) : This is where it gets picked up.
; Landed( vector HitNormall ) : Signal to bots that it's available at it's current Location.
; BaseChange() (singular, simulated) : EMPTY

==Events==
; FellOutOfWorld(eKillZType KillType) : Calls SendHome().
; NotReachableBy( Pawn P ) : Calls SendHome() if not reachable.
; LogTaken( [[Legacy:Controller|Controller]] C ) : EMPTY
; LogDropped : EMPTY
; LogReturned : EMPTY

==States==

===Home (auto)===

Ignores SendHome, Score, Drop.

====Functions====
; CheckTouching() :
; bool IsHome() : Returns true.
; BeginState() : Disables Touch() during setting bHome, Location and Rotation.  Enables Touch().
; EndState() : Disables bHome to false.  Sets TakenTime.
; '''''Begin''''' : Sets Sleep for 0.05 seconds and calls CheckTouching(), in case enemy was sitting on HomeBase.

===Held===

Ignores SetHolder, SendHome.

====Functions====
; BeginState() : Sets properties associated with holding.
; EndState() : Unsets the properties associated with holding.

===Dropped===

Ignores Drop.

====Functions====
; Timer() : Calls SendHome().
; BeingState() : Sets Physics to PHYS_Falling and sets Timer for MaxDropTime.
; EndState() : Sets Physics to PHYS_None.

==Known Subclasses==
 GameObject
   +- [[Legacy:CTFFlag|CTFFlag]]
   |   +- [[Legacy:XBlueFlag|xBlueFlag]]
   |   +- [[Legacy:XRedFlag|xRedFlag]]
   +- [[Legacy:GameObject_EnergyCore|GameObject_EnergyCore]]
   +- [[Legacy:XBombFlag|xBombFlag]]

==Related Topics==
* [[Legacy:GameObjective|GameObjective]]
* [[Legacy:GameInfo|GameInfo]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3434</id>
      <timestamp>2004-12-07T19:56:00Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>SetHolder and Vehicle Pickups</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; GameObject (Package: UnrealGame)}}

GameObject is an abstract, notplaceable parentclass for all gameplay-related objects players can pick up. Most (if not all) of these objects need to be brought to a [[Legacy:GameObjective|GameObjective]] actor in order to score.

==Properties ==
; bHome : Is the object at its home location?
; bHeld : Is the object being held?
; Holder : The [[Legacy:Pawn|Pawn]] that is holding the object
; HolderPRI : The holder's [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]].
; HomeBase : The [[Legacy:GameObjective|GameObjective]] where the object starts out.
; TakenTime : When the object was taken from its home.
; MaxDropTime : How long the object will sit in its Dropped state before it resets.
; bDisabled : Used to hide the object between rounds.
; FirstTouch : Who touched it first.
; Assists : Other players who held it at some point.
; GameObjBone : The name of the bone to attach to while held.
; OldTeam : Used mainly by [[Legacy:XBombFlag|xBombFlag]] to keep track of when a team has gone &quot;on offense&quot;.

==Methods ==

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Assumes the home base is the object's Owner.
; Touch : This is where it gets picked up.
; FellOutOfWorld
; Landed
; BaseChange

===Inherited from [[Legacy:Decoration|Decoration]]===
; NotReachableBy

===Other Methods===
; SetHolder : This function is given a [[Legacy:Controller|Controller]], and assumes that the controller's pawn is an [[Legacy:UnrealPawn|UnrealPawn]]. This causes problems with the Vehicle Pickups mutator, which also allows picking up flags in vehicles. When a vehicle picks up a flag, the controller's pawn is a [[Legacy:Vehicle|Vehicle]], causing some accessed nones and other problems.
; Score
; Drop
; SendHome
; SendHomeDisabled
; CalcSetHome : Do some cleanup before going home.
; ClearHolder : Make sure nobody thinks they're holding the object.
; SetDisable
; Position : Get the [[Legacy:Actor|Actor]] that represents the object's position. May be the object itself, the home base, or the holder.
; IsHome : Only returns true in the Home state.
; ValidHolder : Can the given [[Legacy:Actor|Actor]] hold this object?
; LogTaken
; LogDropped
; LogReturned

===Home===
; CheckTouching
; IsHome : Yes I am!
; BeginState
; EndState

===Held===
; BeginState
; EndState

===Dropped===
; BeginState
; EndState
; Timer

==Known Subclasses==
* [[Legacy:CTFFlag|CTFFlag]]
* [[Legacy:XBombFlag|xBombFlag]]

==Related Topics==
* [[Legacy:GameObjective|GameObjective]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3435</id>
      <timestamp>2005-11-21T18:38:52Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; GameObject (Package: UnrealGame)}}

GameObject is an abstract, notplaceable parentclass for all gameplay-related objects players can pick up. Most (if not all) of these objects need to be brought to a [[Legacy:GameObjective|GameObjective]] actor in order to score.

==Properties ==
; bHome : Is the object at its home location?
; bHeld : Is the object being held?
; Holder : The [[Legacy:Pawn|Pawn]] that is holding the object
; HolderPRI : The holder's [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]].
; HomeBase : The [[Legacy:GameObjective|GameObjective]] where the object starts out.
; TakenTime : When the object was taken from its home.
; MaxDropTime : How long the object will sit in its Dropped state before it resets.
; bDisabled : Used to hide the object between rounds.
; FirstTouch : Who touched it first.
; Assists : Other players who held it at some point.
; GameObjBone : The name of the bone to attach to while held.
; OldTeam : Used mainly by [[Legacy:XBombFlag|xBombFlag]] to keep track of when a team has gone &quot;on offense&quot;.

==Methods ==

===Inherited from [[Legacy:Actor|Actor]]===
; PostBeginPlay : Assumes the home base is the object's Owner.
; Touch : This is where it gets picked up.
; FellOutOfWorld
; Landed
; BaseChange

===Inherited from [[Legacy:Decoration|Decoration]]===
; NotReachableBy

===Other Methods===
; SetHolder : This function is given a [[Legacy:Controller|Controller]], and assumes that the controller's pawn is an [[Legacy:UnrealPawn|UnrealPawn]]. This causes problems with the Vehicle Pickups mutator, which also allows picking up flags in vehicles. When a vehicle picks up a flag, the controller's pawn is a [[Legacy:Vehicle|Vehicle]], causing some accessed nones and other problems.
; Score
; Drop
; SendHome
; SendHomeDisabled
; CalcSetHome : Do some cleanup before going home.
; ClearHolder : Make sure nobody thinks they're holding the object.
; SetDisable
; Position : Get the [[Legacy:Actor|Actor]] that represents the object's position. May be the object itself, the home base, or the holder.
; IsHome : Only returns true in the Home state.
; ValidHolder : Can the given [[Legacy:Actor|Actor]] hold this object?
; LogTaken
; LogDropped
; LogReturned

===Home===
; CheckTouching
; IsHome : Yes I am!
; BeginState
; EndState

===Held===
; BeginState
; EndState

===Dropped===
; BeginState
; EndState
; Timer

==Known Subclasses==
* [[Legacy:CTFFlag|CTFFlag]]
* [[Legacy:XBombFlag|xBombFlag]]

==Related Topics==
* [[Legacy:GameObjective|GameObjective]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameObjective</title>
    <id>1320</id>
    <revision>
      <id>3365</id>
      <timestamp>2006-12-27T15:15:22Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; GameObjective (package UnrealGame)}}

Actors of class '''GameObjective''' (or rather subclasses thereof) are part of UT2003's [[Legacy:Bot Support|bot support]].  

While a GameObjective is &quot;active&quot;, [[Legacy:Bot|bot]]s of one team seek it out, bots of the other try and defend it. When the attacking team reaches it, they &quot;disable&quot; it in some way &amp;ndash; the various subclasses tell the bots that they need to do (can a coder confirm this bit?). This is used to implement CTF flags, Domination points, and so on.

Ways to disable:
* [[Legacy:DestroyableObjective|DestroyableObjective]] does it when the objective's Health reaches zero. 
* [[Legacy:KeyInventory|KeyInventory]] in conjunction with a [[Legacy:LockedObjective|LockedObjective]] when a player bearing the key approaches the locked objective.
* [[Legacy:TriggeredObjective|TriggeredObjective]] when a player triggers the objective.

The GameObjective actor can be tied to defense points created with [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s, and routes to the objective are defined with [[Legacy:AssaultPath|AssaultPath]]s.

==Coding with GameObjectives ==

Normally, a GameObjective will be added to a map manually by level designers, but it ''is'' possible to have game code spawn GameObjective objects (of subclasses where bStatic and bNoDelete are both set to False), but since they're not part of the navigation network bots won't find them.  To facilitate that anyway, overwrite TellBotHowToDisable in your GameObjective subclass and direct the bot to a nearby regular actor (either a static NavigationPoint that has been pathed or an actor not derived from NavigationPoint at all).

You might also need to set the bCollideWhenPlacing property to False so that the spawn actually succeeds if you try to spawn it at the map origin.  This is one reason why the code might work on some maps and not on others.

Another trap here is that GameObjective contains a built in [[Legacy:Linked List|linked list]] which can get corrupted into a circular list if you spawn GOs at runtime. (Depending on the order that AllActors passes the existing GOs). This will cause anything using the linked list to crash the game (infinite loop).

The problem is that GameObjective's PostBeginPlay assumes no more GameObjectives are spawned after the first's PostBeginPlay is called. The solution is to fix the list yourself with something like:

&lt;uscript&gt;
   prevGO = none;
   foreach AllActors(class'GameObjective', GO)
   {
      //Clear NextObjective on all, since GameObjective code has got it wrong
      GO.NextObjective = none;
      if(prevGO != none)
      {
         prevGO.NextObjective = GO;
         GO.bFirstObjective = false;
      }
      else
         GO.bFirstObjective = true;
      prevGO = GO;
   }
&lt;/uscript&gt;

Ideally do this in an override of GO.PostBeginPlay. Then you don't have to care what else (like TeamAI) might keep its own reference to the list, as that will happen later.

==Properties==

===Main===
; name Event : Inherited from [[Legacy:Actor|Actor]].  Event that is fired when this objective has been disabled.
; bool bTeamControlled : Disabling this objective changes the objective's team rather than removing it.  (Used for [[Legacy:Domination|Domination]] control points.)
; bool bAccruePoints : If set, the controlling team accrues points.  (Can be used for Unreal Tournament-style Domination control points.)
; byte DefenderTeamIndex : [[Legacy:Team Number|Team number]] of the team defending this objective : 0=red, 1=blue.
; byte DefensePriority : Used to set objective order.  Objectives that should be completed first should be given a higher DefensePriority.  The last objective should have a DefensePriority of 0, and each previous objective should have its DefensePriority increased by one.
; int Score : If the bAccruePoints property is set, score given to the team holding this objective every second.  Otherwise, score given to player who completes/disables this objective.

===Bot Support===
; name DefenseScriptTags : [[Legacy:Tag|Tag]] of [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s used by bots that defend this objective.
; name AreaVolumeTag : Optional tag of a [[Legacy:Volume|Volume]] defining the base area around this objective.  Used by the game to determine whether a bot is close to this objective.
; float BaseRadius : Radius of a simple base area around this objective.  Can be used instead of or in addition to AreaVolumeTag.
; float BaseExitTime : Time (in seconds) it takes a bot to get entirely away from the base.  In [[Legacy:CTF|CTF]], used by bots to make a guess whether an enemy has already left the base after taking the flag.

===Localized===
; string ObjectiveName (localized) : Human-readable name of this objective.
; string DestructionMessage (localized) : Message displayed when this objective has been destroyed.
; string LocationPrefix (localized) : Text displayed before the human-readable objective name as a player's location in the scoreboard.
; string LocationPostfix (localized) : (Text displayed after)

==Hidden Properties==

===General===
; bool bDisabled : Set by DisableObjective when this objective has been disabled/destroyed.
; byte StartTeam : Initial value of DefenderTeamIndex.  Set by PostBeginPlay and used solely by the Reset function.

===Bot Support===
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] DefenseScripts : First [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] in a linked list of defense scripts associated with this objective.  PostBeginPlay looks for scripts whose [[Legacy:Tag|Tag]] matches the objective's DefenseScriptTags property and initializes the DefenseScripts variable with a reference to the first script in the linked list.
; bool bHasShootSpots : Used exclusively by [[Legacy:Bombing Run|Bombing Run]] bot support and specifies whether a goal has associated [[Legacy:ShootSpot|ShootSpot]]s from where the bomb can be shot through the hoop.  Set by PostBeginPlay in [[Legacy:XBombDelivery|xBombDelivery]], used by [[Legacy:BombingRunSquadAI|BombingRunSquadAI]].
; [[Legacy:AssaultPath|AssaultPath]] AlternatePaths : References the first of a [[Legacy:Linked List|linked list]] of AssaultPaths associated with this GameObjective. All paths for a GameObjective are stored in a single list according to the order they are encountered by the AllActors [[Legacy:Iterator|iterator]] function ignoring any priority or path specifications.
; [[Legacy:Volume|Volume]] MyBaseVolume : Initialized with a reference to the [[Legacy:Volume|volume]] specified by the AreaVolumeTag property (see above).  Used by BotNearObjective.

===Linked List===
; bool bFirstObjective : Used internally to link all objectives by their NextObjective property in PostBeginPlay.  Set to True only for the first objective in the linked list.
; [[Legacy:GameObjective|GameObjective]] NextObjective : Links to the next objective in the linked objective list.

==Functions==

===General===
; PostBeginPlay() : Performs several initialization tasks:
; * Finds the first [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] in the [[Legacy:Linked List|linked list]] whose [[Legacy:Tag|Tag]] matches the tag given by the DefenseScriptTags property and stores a reference to it in the DefenseScripts variable.
; * Chains all GameObjective actors found in the map to a list linked by the NextObjective variable.  The first GameObjective actor in the list has its bFirstObjective variable set to &lt;code&gt;True&lt;/code&gt;.  The SetObjectiveLists function in [[Legacy:TeamAI|TeamAI]] (and other functions there) use this to find the start of the chain.
; * Initializes the AlternatePaths [[Legacy:Linked List|linked list]] of [[Legacy:AssaultPath|AssaultPath]] actors with a matching ObjectiveTag. Every AssaultPath added to the list will check, whether it is the first or last (known) node in each of its paths and correct the bFirstPath and bLastPath properties accordingly.
; * Finds the [[Legacy:Volume|Volume]] specified by the AreaVolumeTag property and stores a reference to it in the MyBaseVolume variable.
; * If the bAccruePoints property is set, starts the timer with a one-second interval.
; Timer() : If the bAccruePoints property is set, adds the number of points specified in the Score property to the total score of the team currently holding this objective. 
; float GetDifficulty() : Returns a generic &quot;difficulty&quot; value.  Only implemented by the [[Legacy:XBombDelivery|xBombDelivery]] subclass of GameObjective and used by function PreferShootScore in [[Legacy:BombingRunSquadAI|BombingRunSquadAI]] to make a decision whether a bot prefers shooting through the hoop or making a touchdown.
; function PlayAlarm() : Can be overwritten in subclasses to play an alarm (for instance when a domination point or a flag is taken).  Must be explicitely called.
; DisableObjective( [[Legacy:Pawn|Pawn]] Instigator ) : Called when this objective has been disabled.  The default implementation fires the objective's [[Legacy:Event|Event]], gives points to the attackers and changes the attacking bots' orders.  Various other classes call DisableObjective:
; * [[Legacy:DestroyableObjective|DestroyableObjective]] does it when the objective's Health reaches zero.
; * [[Legacy:KeyInventory|KeyInventory]] in conjunction with a [[Legacy:LockedObjective|LockedObjective]] when a player bearing the key approaches the locked objective.
; * [[Legacy:TriggeredObjective|TriggeredObjective]] when a player triggers the objective.

===Bot Support===
; bool BotNearObjective( [[Legacy:Bot|Bot]] B ) : Returns whether the given [[Legacy:Bot|Bot]] is &quot;near&quot; this objective.  Uses the volume specified through the AreaVolumeTag property and the BaseRadius property to figure that out.
; bool OwnsDefenseScript( [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] S ) : Checks and returns whether the given [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] is in the list of defense scripts for this objective.
; bool TellBotHowToDisable( [[Legacy:Bot|Bot]] B) : Tells the given bot how to disable this objective; the default implementation simply shows the bot a path to it.  Only returns True if valid and useable orders were given to the bot.  Called by CheckSquadObjectives in [[Legacy:SquadAI|SquadAI]] (which in turn is indirectly called by a [[Legacy:Bot|Bot]] itself).
; int GetNumDefenders() : Returns the number of players and bots currently defending this objective.  Used by the GetLeastDefendedObjective and GetMostDefendedObjective functions in [[Legacy:TeamAI|TeamAI]] (which in turn are used to make a decision about where to send bots for attack or defense).

===Information===
; string GetHumanReadableName() (simulated) : Inherited from [[Legacy:Actor|Actor]].  Returns a human-readable name for this objective.  Used for logging.
; bool BetterObjectiveThan( [[Legacy:GameObjective|GameObjective]] Best, byte DesiredTeamNum, byte RequesterTeamNum ) : Solely used to display [[Legacy:WillowWhisp|WillowWhisp]]s to show (human) players the path to the next objective.

==Known Subclasses==
 [[Legacy:GameObjective|GameObjective]]
  +- [[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]] (UT2004 only)
  +- [[Legacy:CTFBase|CTFBase]]
  +- [[Legacy:DestroyableObjective|DestroyableObjective]]
  |   +- [[Legacy:ONSPowerCore|ONSPowerCore]]
  |       +- [[Legacy:ONSPowerCoreBlue|ONSPowerCoreBlue]]
  |       +- [[Legacy:ONSPowerCoreRed|ONSPowerCoreRed]]
  |       +- [[Legacy:ONSPowerNode|ONSPowerNode]]
  |           +- [[Legacy:ONSPowerNodeNeutral|ONSPowerNodeNeutral]]
  +- [[Legacy:DominationPoint|DominationPoint]]
  |   +- [[Legacy:XDomPoint|xDomPoint]]
  |       +- [[Legacy:XDomPointA|xDomPointA]]
  |       +- [[Legacy:XDomPointB|xDomPointB]]
  +- [[Legacy:LockedObjective|LockedObjective]] (UT2003 only)
  +- [[Legacy:ProximityObjective|ProximityObjective]] (UT2004 only)
  |   +- [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]]
  |       +- [[Legacy:HoldObjective|HoldObjective]]
  |       +- [[Legacy:LockedObjective|LockedObjective]]
  |       +- [[Legacy:UseObjective|UseObjective]]
  +- [[Legacy:TouchableObjective|TouchableObjective]] (custom class)
  +- [[Legacy:TriggeredObjective|TriggeredObjective]]
  +- [[Legacy:XBombDelivery|xBombDelivery]]
  +- [[Legacy:XBombSpawn|xBombSpawn]]

==Related Topics==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:TeamAI|TeamAI]]
* [[Legacy:SquadAI|SquadAI]]
* [[Legacy:Gametype|Gametype]]

===Questions/Comments===

'''MythOpus:''' I want to set my [[Legacy:HoldObjective|HoldObjective]] to start out with no team.  Since 2,3 and 255 are completely ignored, how can I do this?  Also, even when I have the bTeamControlled set to true and the red team completes the objective, the blue team is still left defending it and cannot retake control.  Does anyone know how to make this possible?

'''Ironblayde:''' Is there some advantage to setting up an AreaVolumeTag? Under what circumstances would the game use this, and to what end? I didn't find any other pages on the Wiki that mention this property, so I'm curious as to whether anyone knows more about it.

'''SuperApe:''' Added subclass tree.  Marked up propeties, functions.

'''IceCreamYou:''' Should DefenderTeamIndex be set to 0 or 1 for normal objectives?  Also, I'm confused about DefensePriority: as I understand it, this field is for ordering your objectives, not setting which ones are more important as this page would currently imply.

'''SuperApe:''' To answer your question: That depends on which team the GameObjective is defended by. (0=red, 1=blue)

'''IceCreamYou:''' Numbering in Assault, unlike other gametypes, is relative.  0=attackers, 1=defenders (and even that doesn't apply when setting up playerstarts).  However, after experimentation, I found that the number in DefenderTeamIndex has absolutely no effect on anything.  I also changed the passage about DefensePriority to better reflect its usage.

'''SuperApe:''' Different gametypes will use that property as advertised, a few will not (as you found that AS is the ''odd duck'' in the group).  But, on futher experimentation (say, in a CTF, BR or DDOM map), you'll find this property does what it's supposed to do.  

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3366</id>
      <timestamp>2006-12-27T03:13:40Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; GameObjective (package UnrealGame)}}

Actors of class '''GameObjective''' (or rather subclasses thereof) are part of UT2003's [[Legacy:Bot Support|bot support]].  

While a GameObjective is &quot;active&quot;, [[Legacy:Bot|bot]]s of one team seek it out, bots of the other try and defend it. When the attacking team reaches it, they &quot;disable&quot; it in some way &amp;ndash; the various subclasses tell the bots that they need to do (can a coder confirm this bit?). This is used to implement CTF flags, Domination points, and so on.

Ways to disable:
* [[Legacy:DestroyableObjective|DestroyableObjective]] does it when the objective's Health reaches zero. 
* [[Legacy:KeyInventory|KeyInventory]] in conjunction with a [[Legacy:LockedObjective|LockedObjective]] when a player bearing the key approaches the locked objective.
* [[Legacy:TriggeredObjective|TriggeredObjective]] when a player triggers the objective.

The GameObjective actor can be tied to defense points created with [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s, and routes to the objective are defined with [[Legacy:AssaultPath|AssaultPath]]s.

==Coding with GameObjectives ==

Normally, a GameObjective will be added to a map manually by level designers, but it ''is'' possible to have game code spawn GameObjective objects (of subclasses where bStatic and bNoDelete are both set to False), but since they're not part of the navigation network bots won't find them.  To facilitate that anyway, overwrite TellBotHowToDisable in your GameObjective subclass and direct the bot to a nearby regular actor (either a static NavigationPoint that has been pathed or an actor not derived from NavigationPoint at all).

You might also need to set the bCollideWhenPlacing property to False so that the spawn actually succeeds if you try to spawn it at the map origin.  This is one reason why the code might work on some maps and not on others.

Another trap here is that GameObjective contains a built in [[Legacy:Linked List|linked list]] which can get corrupted into a circular list if you spawn GOs at runtime. (Depending on the order that AllActors passes the existing GOs). This will cause anything using the linked list to crash the game (infinite loop).

The problem is that GameObjective's PostBeginPlay assumes no more GameObjectives are spawned after the first's PostBeginPlay is called. The solution is to fix the list yourself with something like:

&lt;uscript&gt;
   prevGO = none;
   foreach AllActors(class'GameObjective', GO)
   {
      //Clear NextObjective on all, since GameObjective code has got it wrong
      GO.NextObjective = none;
      if(prevGO != none)
      {
         prevGO.NextObjective = GO;
         GO.bFirstObjective = false;
      }
      else
         GO.bFirstObjective = true;
      prevGO = GO;
   }
&lt;/uscript&gt;

Ideally do this in an override of GO.PostBeginPlay. Then you don't have to care what else (like TeamAI) might keep its own reference to the list, as that will happen later.

==Properties==

===Main===
; name Event : Inherited from [[Legacy:Actor|Actor]].  Event that is fired when this objective has been disabled.
; bool bTeamControlled : Disabling this objective changes the objective's team rather than removing it.  (Used for [[Legacy:Domination|Domination]] control points.)
; bool bAccruePoints : If set, the controlling team accrues points.  (Can be used for Unreal Tournament-style Domination control points.)
; byte DefenderTeamIndex : [[Legacy:Team Number|Team number]] of the team defending this objective (0 = attackers, 1 = defenders).  This property doesn't actually work.
; byte DefensePriority : Used to set objective order.  Objectives that should be completed first should be given a higher DefensePriority.  The last objective should have a DefensePriority of 0, and each previous objective should have its DefensePriority increased by one.
; int Score : If the bAccruePoints property is set, score given to the team holding this objective every second.  Otherwise, score given to player who completes/disables this objective.

===Bot Support===
; name DefenseScriptTags : [[Legacy:Tag|Tag]] of [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s used by bots that defend this objective.
; name AreaVolumeTag : Optional tag of a [[Legacy:Volume|Volume]] defining the base area around this objective.  Used by the game to determine whether a bot is close to this objective.
; float BaseRadius : Radius of a simple base area around this objective.  Can be used instead of or in addition to AreaVolumeTag.
; float BaseExitTime : Time (in seconds) it takes a bot to get entirely away from the base.  In [[Legacy:CTF|CTF]], used by bots to make a guess whether an enemy has already left the base after taking the flag.

===Localized===
; string ObjectiveName (localized) : Human-readable name of this objective.
; string DestructionMessage (localized) : Message displayed when this objective has been destroyed.
; string LocationPrefix (localized) : Text displayed before the human-readable objective name as a player's location in the scoreboard.
; string LocationPostfix (localized) : (Text displayed after)

==Hidden Properties==

===General===
; bool bDisabled : Set by DisableObjective when this objective has been disabled/destroyed.
; byte StartTeam : Initial value of DefenderTeamIndex.  Set by PostBeginPlay and used solely by the Reset function.

===Bot Support===
; [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] DefenseScripts : First [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] in a linked list of defense scripts associated with this objective.  PostBeginPlay looks for scripts whose [[Legacy:Tag|Tag]] matches the objective's DefenseScriptTags property and initializes the DefenseScripts variable with a reference to the first script in the linked list.
; bool bHasShootSpots : Used exclusively by [[Legacy:Bombing Run|Bombing Run]] bot support and specifies whether a goal has associated [[Legacy:ShootSpot|ShootSpot]]s from where the bomb can be shot through the hoop.  Set by PostBeginPlay in [[Legacy:XBombDelivery|xBombDelivery]], used by [[Legacy:BombingRunSquadAI|BombingRunSquadAI]].
; [[Legacy:AssaultPath|AssaultPath]] AlternatePaths : References the first of a [[Legacy:Linked List|linked list]] of AssaultPaths associated with this GameObjective. All paths for a GameObjective are stored in a single list according to the order they are encountered by the AllActors [[Legacy:Iterator|iterator]] function ignoring any priority or path specifications.
; [[Legacy:Volume|Volume]] MyBaseVolume : Initialized with a reference to the [[Legacy:Volume|volume]] specified by the AreaVolumeTag property (see above).  Used by BotNearObjective.

===Linked List===
; bool bFirstObjective : Used internally to link all objectives by their NextObjective property in PostBeginPlay.  Set to True only for the first objective in the linked list.
; [[Legacy:GameObjective|GameObjective]] NextObjective : Links to the next objective in the linked objective list.

==Functions==

===General===
; PostBeginPlay() : Performs several initialization tasks:
; * Finds the first [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] in the [[Legacy:Linked List|linked list]] whose [[Legacy:Tag|Tag]] matches the tag given by the DefenseScriptTags property and stores a reference to it in the DefenseScripts variable.
; * Chains all GameObjective actors found in the map to a list linked by the NextObjective variable.  The first GameObjective actor in the list has its bFirstObjective variable set to &lt;code&gt;True&lt;/code&gt;.  The SetObjectiveLists function in [[Legacy:TeamAI|TeamAI]] (and other functions there) use this to find the start of the chain.
; * Initializes the AlternatePaths [[Legacy:Linked List|linked list]] of [[Legacy:AssaultPath|AssaultPath]] actors with a matching ObjectiveTag. Every AssaultPath added to the list will check, whether it is the first or last (known) node in each of its paths and correct the bFirstPath and bLastPath properties accordingly.
; * Finds the [[Legacy:Volume|Volume]] specified by the AreaVolumeTag property and stores a reference to it in the MyBaseVolume variable.
; * If the bAccruePoints property is set, starts the timer with a one-second interval.
; Timer() : If the bAccruePoints property is set, adds the number of points specified in the Score property to the total score of the team currently holding this objective. 
; float GetDifficulty() : Returns a generic &quot;difficulty&quot; value.  Only implemented by the [[Legacy:XBombDelivery|xBombDelivery]] subclass of GameObjective and used by function PreferShootScore in [[Legacy:BombingRunSquadAI|BombingRunSquadAI]] to make a decision whether a bot prefers shooting through the hoop or making a touchdown.
; function PlayAlarm() : Can be overwritten in subclasses to play an alarm (for instance when a domination point or a flag is taken).  Must be explicitely called.
; DisableObjective( [[Legacy:Pawn|Pawn]] Instigator ) : Called when this objective has been disabled.  The default implementation fires the objective's [[Legacy:Event|Event]], gives points to the attackers and changes the attacking bots' orders.  Various other classes call DisableObjective:
; * [[Legacy:DestroyableObjective|DestroyableObjective]] does it when the objective's Health reaches zero.
; * [[Legacy:KeyInventory|KeyInventory]] in conjunction with a [[Legacy:LockedObjective|LockedObjective]] when a player bearing the key approaches the locked objective.
; * [[Legacy:TriggeredObjective|TriggeredObjective]] when a player triggers the objective.

===Bot Support===
; bool BotNearObjective( [[Legacy:Bot|Bot]] B ) : Returns whether the given [[Legacy:Bot|Bot]] is &quot;near&quot; this objective.  Uses the volume specified through the AreaVolumeTag property and the BaseRadius property to figure that out.
; bool OwnsDefenseScript( [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] S ) : Checks and returns whether the given [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] is in the list of defense scripts for this objective.
; bool TellBotHowToDisable( [[Legacy:Bot|Bot]] B) : Tells the given bot how to disable this objective; the default implementation simply shows the bot a path to it.  Only returns True if valid and useable orders were given to the bot.  Called by CheckSquadObjectives in [[Legacy:SquadAI|SquadAI]] (which in turn is indirectly called by a [[Legacy:Bot|Bot]] itself).
; int GetNumDefenders() : Returns the number of players and bots currently defending this objective.  Used by the GetLeastDefendedObjective and GetMostDefendedObjective functions in [[Legacy:TeamAI|TeamAI]] (which in turn are used to make a decision about where to send bots for attack or defense).

===Information===
; string GetHumanReadableName() (simulated) : Inherited from [[Legacy:Actor|Actor]].  Returns a human-readable name for this objective.  Used for logging.
; bool BetterObjectiveThan( [[Legacy:GameObjective|GameObjective]] Best, byte DesiredTeamNum, byte RequesterTeamNum ) : Solely used to display [[Legacy:WillowWhisp|WillowWhisp]]s to show (human) players the path to the next objective.

==Known Subclasses==
 [[Legacy:GameObjective|GameObjective]]
  +- [[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]] (UT2004 only)
  +- [[Legacy:CTFBase|CTFBase]]
  +- [[Legacy:DestroyableObjective|DestroyableObjective]]
  |   +- [[Legacy:ONSPowerCore|ONSPowerCore]]
  |       +- [[Legacy:ONSPowerCoreBlue|ONSPowerCoreBlue]]
  |       +- [[Legacy:ONSPowerCoreRed|ONSPowerCoreRed]]
  |       +- [[Legacy:ONSPowerNode|ONSPowerNode]]
  |           +- [[Legacy:ONSPowerNodeNeutral|ONSPowerNodeNeutral]]
  +- [[Legacy:DominationPoint|DominationPoint]]
  |   +- [[Legacy:XDomPoint|xDomPoint]]
  |       +- [[Legacy:XDomPointA|xDomPointA]]
  |       +- [[Legacy:XDomPointB|xDomPointB]]
  +- [[Legacy:LockedObjective|LockedObjective]] (UT2003 only)
  +- [[Legacy:ProximityObjective|ProximityObjective]] (UT2004 only)
  |   +- [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]]
  |       +- [[Legacy:HoldObjective|HoldObjective]]
  |       +- [[Legacy:LockedObjective|LockedObjective]]
  |       +- [[Legacy:UseObjective|UseObjective]]
  +- [[Legacy:TouchableObjective|TouchableObjective]] (custom class)
  +- [[Legacy:TriggeredObjective|TriggeredObjective]]
  +- [[Legacy:XBombDelivery|xBombDelivery]]
  +- [[Legacy:XBombSpawn|xBombSpawn]]

==Related Topics==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:TeamAI|TeamAI]]
* [[Legacy:SquadAI|SquadAI]]
* [[Legacy:Gametype|Gametype]]

===Questions/Comments===

'''MythOpus:''' I want to set my [[Legacy:HoldObjective|HoldObjective]] to start out with no team.  Since 2,3 and 255 are completely ignored, how can I do this?  Also, even when I have the bTeamControlled set to true and the red team completes the objective, the blue team is still left defending it and cannot retake control.  Does anyone know how to make this possible?

'''Ironblayde:''' Is there some advantage to setting up an AreaVolumeTag? Under what circumstances would the game use this, and to what end? I didn't find any other pages on the Wiki that mention this property, so I'm curious as to whether anyone knows more about it.

'''SuperApe:''' Added subclass tree.  Marked up propeties, functions.

'''IceCreamYou:''' Should DefenderTeamIndex be set to 0 or 1 for normal objectives?  Also, I'm confused about DefensePriority: as I understand it, this field is for ordering your objectives, not setting which ones are more important as this page would currently imply.

'''SuperApe:''' To answer you question: That depends on which team the GameObjective is defended by. (0=red, 1=blue)

'''IceCreamYou:''' Numbering in Assault, unlike other gametypes, is relative.  0=attackers, 1=defenders (and even that doesn't apply when setting up playerstarts).  However, after experimentation, I found that the number in DefenderTeamIndex has absolutely no effect on anything.  I also changed the passage about DefensePriority to better reflect its usage.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameProfile</title>
    <id>28281</id>
    <revision>
      <id>39938</id>
      <timestamp>2009-11-14T18:07:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameReplicationInfo</title>
    <id>1300</id>
    <revision>
      <id>3319</id>
      <timestamp>2006-01-09T17:09:03Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; GameReplicationInfo (Package: Engine)}}

Holds information about the current game which is replicated (and thus available) to network clients.

To get hold of a game's GameReplicationInfo on a network client, get it from &lt;tt&gt;Level.GRI&lt;/tt&gt; or [[Legacy:Netcode Idioms|local PlayerController]] (&lt;tt&gt;PlayerController.GameReplicationInfo&lt;/tt&gt;), ''not'' from &lt;tt&gt;Level.Game.GameReplicationInfo&lt;/tt&gt;.  (&lt;tt&gt;Level.Game&lt;/tt&gt; doesn't exist on network clients.)

==Properties ==

===Globalconfig ===
; string AdminEmail :  Email address of the server admin.  (replicated once)
; string AdminName :  Name of the server admin.  (replicated once)
; string MOTDLine1
; string MOTDLine2
; string MOTDLine3
; string MOTDLine4 : Four lines for the Message Of The Day. (replicated once)
; int ServerRegion :  Region of the game server.  (replicated once)

===UnrealScript-Only Properties ===
; bool bMatchHasBegun :  (replicated when changed)
; bool bStopCountDown :  (replicated when changed)
; bool bTeamGame :  Assigned by GameInfo.  (replicated once)
; bool bTeamSymbolsUpdated :  
; int ElapsedTime (replicated once) : Number of seconds since gameplay started.  Even though this value is only replicated once, it is autonomously kept up to date client-side.
; int RemainingTime (replicated once) : If a time limit is set, number of seconds to go until that time limit is hit.  RemainingTime stays at zero in overtime; it doesn't go into the negative numbers.  Autonomously kept up to date client-side.  (Effectively the replicated value is discarded; see below for an explanation.)
; int RemainingMinute (replicated) : 


Internally used to resynchronize RemainingTime (but not ElapsedTime) with the server.  Despite its name, contains a number of seconds, not minutes.  Set once per minute by the Timer event in state MatchInProgress in [[Legacy:DeathMatch|DeathMatch]] and is then replicated to all clients; there, it is copied to RemainingTime when it is received.

'''Warning:'''  Unfortunately that concept doesn't work out fully.  A client connecting to a server in mid-game receives both a more or less up-to-date value for RemainingTime ''and'' the last set value of RemainingMinute.  Consequently, RemainingTime is directly set to the last full minute, and the replicated value of RemainingTime is discarded.  The timer catches up only when RemainingTime is set server-side the ''next'' time, which means that directly after connecting it may be off by and for up to a minute.  If you need higher precision, you'll have to invent a more direct [[Legacy:Developer Journals/Mychaeel|time synchronization mechanism]].



; vector FlagPos :  Replicated 2D position of one object.  (replicated when changed)
; EFlagState FlagState[2]  :  (replicated when changed, see [[Legacy:Actor/Enums|Actor/Enums]])
; string GameClass :  Assigned by GameInfo.  (replicated once)
; string GameName :  Assigned by GameInfo.  (replicated once)
; int GoalScore :  (replicated once)
; string GRIPropsDisplayText[8] (private, localized) :  
; int MatchID :  (replicated when changed)
; int MaxLives :  (replicated once)
; array&lt;[[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]&gt; PRIArray :  
; float SecondCount :  
; [[Legacy:TeamInfo|TeamInfo]] Teams[2]  :  (replicated when changed)
; [[Legacy:Texture|Texture]] TeamSymbols[2]  :  (replicated once)
; int TimeLimit :  (replicated once)
; [[Legacy:Actor|Actor]] Winner :  Set by gameinfo when game ends. (replicated when changed)

==Functions==

===Inherited From [[Legacy:Actor|Actor]]===
; PostNetBeginPlay() (simulated) : Searches for [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s and adds them to the PRIArray. Also calls the TeamSymbolNotify function on network clients.
; PostBeginPlay() (simulated) : Clears the ServerName, MOTD and Admin info strings on clients to make sure the server's values are used. Also initializes SecondCount to &lt;tt&gt;Level.TimeSeconds&lt;/tt&gt; and starts the Timer with an interval of one second and looping enabled.
; Reset() : Executes the superclass's Reset function and resets Winner to None.
; Timer() (simulated) : Updates the game time and calls TeamSymbolNotify if the team symbols need to be updated.
; UpdatePrecacheMaterials() (simulated) : Precaches the team symbols.

===Inherited From [[Legacy:Info|Info]]===
; FillPlayInfo( [[Legacy:PlayInfo|PlayInfo]] PlayInfo ) (static) : 

===Other Functions===
; TeamSymbolNotify() (simulated) : 
; AddPRI( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI ) (simulated) : 
; RemovePRI( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI ) (simulated) : 
; GetPRIArray( out array&lt;[[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]&gt; pris ) (simulated) : Returns a copy of the PRIArray through the out parameter.

==Known Subclasses==
 GameReplicationInfo
   +- [[Legacy:ASGameReplicationInfo|ASGameReplicationInfo]] (UT2004)
   +- [[Legacy:InvasionGameReplicationInfo|InvasionGameReplicationInfo]] (UT2004)
   +- [[Legacy:MutantGameReplicationInfo|MutantGameReplicationInfo]] (UT2004)

==Related Topics==
* [[Legacy:Replication|Replication]]

==Discussion==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3320</id>
      <timestamp>2005-10-18T19:27:02Z</timestamp>
      <contributor>
        <ip>Pool0006.cvx7-bradley.dialup.earthlink.net</ip>
      </contributor>
      <comment>SuperApe: Yes, Switch.  Confirmed: Level.GRI is available on Clients.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; GameReplicationInfo}}

Holds information about the current game which is replicated (and thus available) to network clients.

To get hold of a game's GameReplicationInfo on a network client, get it from &lt;tt&gt;Level.GRI&lt;/tt&gt; or [[Legacy:Netcode Idioms|local PlayerController]] (&lt;tt&gt;PlayerController.GameReplicationInfo&lt;/tt&gt;), ''not'' from &lt;tt&gt;Level.Game.GameReplicationInfo&lt;/tt&gt;.  (&lt;tt&gt;Level.Game&lt;/tt&gt; doesn't exist on network clients.)

==Properties ==

===Globalconfig Properties ===
; string AdminEmail :  Email address of the server admin.  (replicated once)
; string AdminName :  Name of the server admin.  (replicated once)
; string MOTDLine1
; string MOTDLine2
; string MOTDLine3
; string MOTDLine4 : Four lines for the Message Of The Day. (replicated once)
; int ServerRegion :  Region of the game server.  (replicated once)

===UnrealScript-Only Properties ===
; bool bMatchHasBegun :  (replicated when changed)
; bool bStopCountDown :  (replicated when changed)
; bool bTeamGame :  Assigned by GameInfo.  (replicated once)
; bool bTeamSymbolsUpdated :  

; int ElapsedTime (replicated once) : Number of seconds since gameplay started.  Even though this value is only replicated once, it is autonomously kept up to date client-side.
; int RemainingTime (replicated once) : If a time limit is set, number of seconds to go until that time limit is hit.  RemainingTime stays at zero in overtime; it doesn't go into the negative numbers.  Autonomously kept up to date client-side.  (Effectively the replicated value is discarded; see below for an explanation.)
; int RemainingMinute (replicated) : 


Internally used to resynchronize RemainingTime (but not ElapsedTime) with the server.  Despite its name, contains a number of seconds, not minutes.  Set once per minute by the Timer event in state MatchInProgress in [[Legacy:DeathMatch|DeathMatch]] and is then replicated to all clients; there, it is copied to RemainingTime when it is received.

'''Warning:'''  Unfortunately that concept doesn't work out fully.  A client connecting to a server in mid-game receives both a more or less up-to-date value for RemainingTime ''and'' the last set value of RemainingMinute.  Consequently, RemainingTime is directly set to the last full minute, and the replicated value of RemainingTime is discarded.  The timer catches up only when RemainingTime is set server-side the ''next'' time, which means that directly after connecting it may be off by and for up to a minute.  If you need higher precision, you'll have to invent a more direct [[Legacy:Developer Journals/Mychaeel|time synchronization mechanism]].



; vector FlagPos :  Replicated 2D position of one object.  (replicated when changed)
; EFlagState FlagState[2]  :  (replicated when changed, see [[Legacy:Actor/Enums|Actor/Enums]])
; string GameClass :  Assigned by GameInfo.  (replicated once)
; string GameName :  Assigned by GameInfo.  (replicated once)
; int GoalScore :  (replicated once)
; string GRIPropsDisplayText[8] (private, localized) :  
; int MatchID :  (replicated when changed)
; int MaxLives :  (replicated once)
; array&lt;[[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]&gt; PRIArray :  
; float SecondCount :  
; [[Legacy:TeamInfo|TeamInfo]] Teams[2]  :  (replicated when changed)
; [[Legacy:Texture|Texture]] TeamSymbols[2]  :  (replicated once)
; int TimeLimit :  (replicated once)
; [[Legacy:Actor|Actor]] Winner :  Set by gameinfo when game ends. (replicated when changed)

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PostNetBeginPlay ( ) [simulated] : Searches for [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s and adds them to the PRIArray. Also calls the TeamSymbolNotify function on network clients.
; PostBeginPlay ( ) [simulated] : Clears the ServerName, MOTD and Admin info strings on clients to make sure the server's values are used. Also initializes SecondCount to &lt;tt&gt;Level.TimeSeconds&lt;/tt&gt; and starts the Timer with an interval of one second and looping enabled.
; Reset ( ) : Executes the superclass's Reset function and resets Winner to None.
; Timer ( ) [simulated] : Updates the game time and calls TeamSymbolNotify if the team symbols need to be updated.
; UpdatePrecacheMaterials ( ) [simulated] : Precaches the team symbols.

===Inherited From [[Legacy:Info|Info]] ===
; FillPlayInfo ([[Legacy:PlayInfo|PlayInfo]] PlayInfo) [static] : 

===Other Functions ===
; TeamSymbolNotify ( ) [simulated] : 
; AddPRI ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI) [simulated] : 
; RemovePRI ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI) [simulated]] : 
; GetPRIArray (out array&lt;[[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]&gt; pris) [simulated] : Returns a copy of the PRIArray through the out parameter.

==Known Subclasses ==

None</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameReplicationInfo (UT)</title>
    <id>1322</id>
    <revision>
      <id>3369</id>
      <timestamp>2006-01-10T15:55:06Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; GameReplicationInfo (Package: Engine)}}

Holds information about the current game which is replicated (and thus available) to network clients.

For the UT200x version of this actor, see [[Legacy:GameReplicationInfo|GameReplicationInfo]].

To get hold of a game's GameReplicationInfo on a network client, get it from the [[Legacy:Replication|local PlayerPawn]], ''not'' from &lt;tt&gt;Level.Game.GameReplicationInfo&lt;/tt&gt;.  (&lt;tt&gt;Level.Game&lt;/tt&gt; doesn't exist on network clients.)

==Known Subclasses==
* [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]]

==Related Topics==
* [[Legacy:Replication|Replication]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3370</id>
      <timestamp>2002-12-31T09:16:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; GameReplicationInfo (Package: Engine)}}

Holds information about the current game which is replicated (and thus available) to network clients.

To get hold of a game's GameReplicationInfo on a network client, get it from the [[Legacy:Replication|local PlayerPawn]], ''not'' from &lt;tt&gt;Level.Game.GameReplicationInfo&lt;/tt&gt;.  (&lt;tt&gt;Level.Game&lt;/tt&gt; doesn't exist on network clients.)

==Known Subclasses ==
* [[Legacy:TournamentGameReplicationInfo|TournamentGameReplicationInfo]]

==Related Topics ==
* [[Legacy:Replication|Replication]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameRules</title>
    <id>1334</id>
    <revision>
      <id>3397</id>
      <timestamp>2007-06-29T02:56:11Z</timestamp>
      <contributor>
        <ip>210.1.221.213</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameRules (Package: Engine)}}

The GameRules class handles game rule modifications for the [[Legacy:GameInfo|GameInfo]] such as scoring, pickups, death, kills, finding player starts and damage modification.

GameRules modifies the play laid out by the [[Legacy:GameInfo|GameInfo]].  GameRulesModifier is the instance of this class inside [[Legacy:GameInfo|GameInfo]].  GameRules is a [[Legacy:Linked List|linked list]] of GameRules.  Every time an function is called in [[Legacy:GameInfo|GameInfo]] it searches through every GameRules in the list that override the any of the below functions.  So GameRules augments the gameplay in a modular fashion by applying rules to an already existing game behavior.

==Properties==
; GameRules NextGameRules : The next GameRules actor in the [[Legacy:Linked List|linked list]] of GameRules.

==Methods==
; AddGameRules (GameRules GR) : Adds a GameRules to the end of the GameRules [[Legacy:Linked List|linked list]].
; bool CheckEndGame ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason) : Called when the EndGame conditions have been met.
; bool CheckScore ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer) : Augments the score and returns whether the EndGame conditions have been met.
; bool CriticalPlayer ([[Legacy:Controller|Controller]] Other) : Returns whether a player should be concidered a &quot;critical player&quot;. E.g the flag or bomb carriers in CTF and Bombing run respectively are considered critical players.
; [[Legacy:NavigationPoint|NavigationPoint]] FindPlayerStart ([[Legacy:Controller|Controller]] Player, optional byte InTeam, optional string incomingName) : 
; string GetRules ( ) : Returns a string of information that contains the information about what this game rule does.
; GetServerDetails (out [[Legacy:GameInfo|GameInfo]].ServerResponseLine ServerState) : Like in [[Legacy:Mutator|Mutator]].GetServerDetails() you can add information to the server information displayed in the server browser, however unlike mutators GameRules are not added to the server details by default. GameRules.GetServerDetails() is called after [[Legacy:Mutator|Mutator]].GetServerDetails().
; bool HandleRestartGame ( ) : Augments whether the game is restarted or not.
; int NetDamage (int OriginalDamage, int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : Allowes the GameRules to modify the damage (return value) and momentum. The OriginalDamage parameter should be passed to the next GameRules without any modifications.
; bool OverridePickupQuery ([[Legacy:Pawn|Pawn]] Other, [[Legacy:Pickup|Pickup]] item, out byte bAllowPickup) : Can be used like [[Legacy:Inventory|Inventory]].HandlePickupQuery() to modify the way the item gets (not) picked up. Returning &lt;code&gt;True&lt;/code&gt; means that the value of the &lt;code&gt;bAllowPickup&lt;/code&gt; variable determines whether the item may be picked up. Otherwise the [[Legacy:Inventory|Inventory]].HandlePickupQuery() is called for the player's inventory to possibly handle the pickup query.
; bool PreventDeath ([[Legacy:Pawn|Pawn]] Killed, [[Legacy:Controller|Controller]] Killer, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector HitLocation) : Called right before the pawn dies. Returning &lt;code&gt;True&lt;/code&gt; prevents the death and sets the pawn's health to at least 1. Usually you will want to set it to a higher value, though.
; bool PreventSever ([[Legacy:Pawn|Pawn]] Killed, name boneName, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : Augments the action taken when a player would normally lose a limb.  Returns ''true'' to prevent the severing of the boneName or ''false'' to allow the limb to be severed.
; ScoreKill ([[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed) : Augements the action taken when a player scores a kill.  Not the score itself, but having to do with the Controllers involved in the Kill.
; ScoreObjective ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer, Int Score) : Augments the action taken when a player scores in the game.

==Known Subclases==
* [[Legacy:BigHeadRules|BigHeadRules]]
* [[Legacy:SpeciesGameRules|SpeciesGameRules]]
* [[Legacy:UTClassicGameRules|UTClassicGameRules]] (Epic Bonuspack)
* [[Legacy:VampireGameRules|VampireGameRules]]

==Example: Adding a GameRule==

I was able to add a GameRule to my gamplay through the [[Legacy:GUITabPanel|GUITabPanel]] that I wrote.  Inside [[Legacy:GUITabPanel|GUITabPanel]] there is a ''Play'' function that is called when the user has selected the gameplay to begin.  When this happens the  [[Legacy:GUIComponent|GUIComponent]]s that make up the [[Legacy:GUITabPanel|GUITabPanel]] are queried for their state and setting to determine how the game should proceed.

&lt;uscript&gt;
function string Play()
{
    LastAutoAdjustSkill = moCheckBox(Controls[15]).IsChecked();
    SaveConfig();
    return Super.Play()$&quot;?AutoAdjust=&quot;$LastAutoAdjustSkill$&quot;?GameRules=MyPackageName.MyGameRule&quot;;
}
&lt;/uscript&gt;

Above, I simply created a new subclass of [[Legacy:TabInstantActionBaseRules|TabInstantActionBaseRules]], copied [[Legacy:Tab_IADeathMatch|Tab_IADeathMatch]] and then edited the ''Play'' function.  I added:

{{innerbox|$&quot;?GameRules=MyPackageName.MyGameRule&quot;;

}}

'''$''' concatenates the existing string with what follows.  Then I use the '''?''' to add a new option to the ''Play'' string.  '''GameRules=''' is an important keyword that [[Legacy:GameInfo|GameInfo]] looks for when parsing this ''Play'' string.  If I had more than one [[Legacy:GameRules|GameRules]] I would use a comma '','' to seperate each one.

{{innerbox|''MyPackageName'' is the name of package that the [[Legacy:GameRules|GameRules]], that you've created and named ''MyGameRule'', is located.

}}

'''Burtlo:''' I thought that I would include a sort of how-to to set up the GameRule.  However there might be anothe way to set it up through defaultproperties in the [[Legacy:GameInfo|GameInfo]] class.  Someone should double-check my work.

'''Wormbo:''' Please be careful when the wiki tells you there's a conflict. You can loose information added by other contributors if you simply copy over your own edited version. Also you don't need to link a class name if that class is described on the same page, i.e. you don't need to link the NextGameRules variable's type because it's &quot;GameRules&quot; and that's this page already.

'''burtlo:''' I apologize, I thought that it gave me that error because I had it opened in another browser window.

'''porkmanii:''' Alternatively, you can add a GameRules actor after gameplay begins by doing this:

&lt;uscript&gt;Level.Game.AddGameModifier(Spawn(class'MyGameRule'));&lt;/uscript&gt;

==Working with other GameRules==

'''Tarquin:''' What's the correct way to work with the other GamesRules in the linked list? IN code, I see things like:

&lt;uscript&gt;
function foo {
  if(NextGameRules != None)
      return NextGameRules.foo();
}
&lt;/uscript&gt;

but I don't quite understand how to handle it if I want my foo() to return something else &amp;ndash; how do I combine my result with the other GameRules that might want to customize foo() ?

'''Mychaeel:''' Simple:  If you want your GameRules to override whatever other GameRules might want to say about this, just return that value.  Otherwise, return the result of Super.foo() (which ''should'' call foo() of the next GameRules actor in the chain).  Like this:

&lt;uscript&gt;
function bool foo() {
  if (bByAllMeansReturnTrue)  return True;
  if (bByAllMeansReturnFalse) return False;

  return Super.foo();
}
&lt;/uscript&gt;

'''Tarquin:''' So the flow of functions is:
* super calls...
** first child in list, calls...
*** super, calls...
**** 2nd child in list

... and so on? 

'''Mychaeel:''' Yes &amp;ndash; the chain of GameRules actors is followed recursively.  (That's not very efficient for very long [[Legacy:Linked List|linked list]]s, but for a list with only a couple of objects it works well enough.)

'''Argon:''' This is my first post, so hopefully I don't screw anything up...  I'm building a mutator that uses NetDamage to modify damage based on a variety of factors, and it seems to work in most gametypes, but not in Invasion.  Whenever monsters get damaged, they take normal damage and none of my code in Netdamage runs on them.  Debugging shows that Netdamage isn't even being called when monsters take damage.  I've been looking through the Skaarjpack.u code, but the only thing I can find is a reducedamage function, which is based on the same function in TeamGame, but that doesn't seem to be what I'm looking for, as it doesn't explain why this isn't being passed to NetDamage.  Anyone have any insights?

==Related Topics==
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]]
* Tutorials that feature this class:
** [[Legacy:MiceMenGrav Mutator|MiceMenGrav Mutator]]
** [[Legacy:Power Core Volume Control Mutator|Power Core Volume Control Mutator]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3398</id>
      <timestamp>2006-03-12T17:15:00Z</timestamp>
      <contributor>
        <ip>Argon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameRules (Package: Engine)}}

The GameRules class handles game rule modifications for the [[Legacy:GameInfo|GameInfo]] such as scoring, pickups, death, kills, finding player starts and damage modification.

GameRules modifies the play laid out by the [[Legacy:GameInfo|GameInfo]].  GameRulesModifier is the instance of this class inside [[Legacy:GameInfo|GameInfo]].  GameRules is a [[Legacy:Linked List|linked list]] of GameRules.  Every time an function is called in [[Legacy:GameInfo|GameInfo]] it searches through every GameRules in the list that override the any of the below functions.  So GameRules augments the gameplay in a modular fashion by applying rules to an already existing game behavior.

==Properties==
; GameRules NextGameRules : The next GameRules actor in the [[Legacy:Linked List|linked list]] of GameRules.

==Methods==
; AddGameRules (GameRules GR) : Adds a GameRules to the end of the GameRules [[Legacy:Linked List|linked list]].
; bool CheckEndGame ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason) : Called when the EndGame conditions have been met.
; bool CheckScore ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer) : Augments the score and returns whether the EndGame conditions have been met.
; bool CriticalPlayer ([[Legacy:Controller|Controller]] Other) : Returns whether a player should be concidered a &quot;critical player&quot;. E.g the flag or bomb carriers in CTF and Bombing run respectively are considered critical players.
; [[Legacy:NavigationPoint|NavigationPoint]] FindPlayerStart ([[Legacy:Controller|Controller]] Player, optional byte InTeam, optional string incomingName) : 
; string GetRules ( ) : Returns a string of information that contains the information about what this game rule does.
; GetServerDetails (out [[Legacy:GameInfo|GameInfo]].ServerResponseLine ServerState) : Like in [[Legacy:Mutator|Mutator]].GetServerDetails() you can add information to the server information displayed in the server browser, however unlike mutators GameRules are not added to the server details by default. GameRules.GetServerDetails() is called after [[Legacy:Mutator|Mutator]].GetServerDetails().
; bool HandleRestartGame ( ) : Augments whether the game is restarted or not.
; int NetDamage (int OriginalDamage, int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : Allowes the GameRules to modify the damage (return value) and momentum. The OriginalDamage parameter should be passed to the next GameRules without any modifications.
; bool OverridePickupQuery ([[Legacy:Pawn|Pawn]] Other, [[Legacy:Pickup|Pickup]] item, out byte bAllowPickup) : Can be used like [[Legacy:Inventory|Inventory]].HandlePickupQuery() to modify the way the item gets (not) picked up. Returning &lt;code&gt;True&lt;/code&gt; means that the value of the &lt;code&gt;bAllowPickup&lt;/code&gt; variable determines whether the item may be picked up. Otherwise the [[Legacy:Inventory|Inventory]].HandlePickupQuery() is called for the player's inventory to possibly handle the pickup query.
; bool PreventDeath ([[Legacy:Pawn|Pawn]] Killed, [[Legacy:Controller|Controller]] Killer, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType, vector HitLocation) : Called right before the pawn dies. Returning &lt;code&gt;True&lt;/code&gt; prevents the death and sets the pawn's health to at least 1. Usually you will want to set it to a higher value, though.
; bool PreventSever ([[Legacy:Pawn|Pawn]] Killed, name boneName, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType) : Augments the action taken when a player would normally lose a limb.  Returns ''true'' to prevent the severing of the boneName or ''false'' to allow the limb to be severed.
; ScoreKill ([[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed) : Augements the action taken when a player scores a kill.  Not the score itself, but having to do with the Controllers involved in the Kill.
; ScoreObjective ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer, Int Score) : Augments the action taken when a player scores in the game.

==Known Subclases==
* [[Legacy:BigHeadRules|BigHeadRules]]
* [[Legacy:SpeciesGameRules|SpeciesGameRules]]
* [[Legacy:UTClassicGameRules|UTClassicGameRules]] (Epic Bonuspack)
* [[Legacy:VampireGameRules|VampireGameRules]]

==Example: Adding a GameRule==

I was able to add a GameRule to my gamplay through the [[Legacy:GUITabPanel|GUITabPanel]] that I wrote.  Inside [[Legacy:GUITabPanel|GUITabPanel]] there is a ''Play'' function that is called when the user has selected the gameplay to begin.  When this happens the  [[Legacy:GUIComponent|GUIComponent]]s that make up the [[Legacy:GUITabPanel|GUITabPanel]] are queried for their state and setting to determine how the game should proceed.

&lt;uscript&gt;
function string Play()
{
    LastAutoAdjustSkill = moCheckBox(Controls[15]).IsChecked();
    SaveConfig();
    return Super.Play()$&quot;?AutoAdjust=&quot;$LastAutoAdjustSkill$&quot;?GameRules=MyPackageName.MyGameRule&quot;;
}
&lt;/uscript&gt;

Above, I simply created a new subclass of [[Legacy:TabInstantActionBaseRules|TabInstantActionBaseRules]], copied [[Legacy:Tab_IADeathMatch|Tab_IADeathMatch]] and then edited the ''Play'' function.  I added:

{{innerbox|$&quot;?GameRules=MyPackageName.MyGameRule&quot;;

}}

'''$''' concatenates the existing string with what follows.  Then I use the '''?''' to add a new option to the ''Play'' string.  '''GameRules=''' is an important keyword that [[Legacy:GameInfo|GameInfo]] looks for when parsing this ''Play'' string.  If I had more than one [[Legacy:GameRules|GameRules]] I would use a comma '','' to seperate each one.

{{innerbox|''MyPackageName'' is the name of package that the [[Legacy:GameRules|GameRules]], that you've created and named ''MyGameRule'', is located.

}}

'''Burtlo:''' I thought that I would include a sort of how-to to set up the GameRule.  However there might be anothe way to set it up through defaultproperties in the [[Legacy:GameInfo|GameInfo]] class.  Someone should double-check my work.

'''Wormbo:''' Please be careful when the wiki tells you there's a conflict. You can loose information added by other contributors if you simply copy over your own edited version. Also you don't need to link a class name if that class is described on the same page, i.e. you don't need to link the NextGameRules variable's type because it's &quot;GameRules&quot; and that's this page already.

'''burtlo:''' I apologize, I thought that it gave me that error because I had it opened in another browser window.

==Working with other GameRules==

'''Tarquin:''' What's the correct way to work with the other GamesRules in the linked list? IN code, I see things like:

&lt;uscript&gt;
function foo {
  if(NextGameRules != None)
      return NextGameRules.foo();
}
&lt;/uscript&gt;

but I don't quite understand how to handle it if I want my foo() to return something else &amp;ndash; how do I combine my result with the other GameRules that might want to customize foo() ?

'''Mychaeel:''' Simple:  If you want your GameRules to override whatever other GameRules might want to say about this, just return that value.  Otherwise, return the result of Super.foo() (which ''should'' call foo() of the next GameRules actor in the chain).  Like this:

&lt;uscript&gt;
function bool foo() {
  if (bByAllMeansReturnTrue)  return True;
  if (bByAllMeansReturnFalse) return False;

  return Super.foo();
}
&lt;/uscript&gt;

'''Tarquin:''' So the flow of functions is:
* super calls...
** first child in list, calls...
*** super, calls...
**** 2nd child in list

... and so on? 

'''Mychaeel:''' Yes &amp;ndash; the chain of GameRules actors is followed recursively.  (That's not very efficient for very long [[Legacy:Linked List|linked list]]s, but for a list with only a couple of objects it works well enough.)

'''Argon:''' This is my first post, so hopefully I don't screw anything up...  I'm building a mutator that uses NetDamage to modify damage based on a variety of factors, and it seems to work in most gametypes, but not in Invasion.  Whenever monsters get damaged, they take normal damage and none of my code in Netdamage runs on them.  Debugging shows that Netdamage isn't even being called when monsters take damage.  I've been looking through the Skaarjpack.u code, but the only thing I can find is a reducedamage function, which is based on the same function in TeamGame, but that doesn't seem to be what I'm looking for, as it doesn't explain why this isn't being passed to NetDamage.  Anyone have any insights?

==Related Topics==
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]]
* Tutorials that feature this class:
** [[Legacy:MiceMenGrav Mutator|MiceMenGrav Mutator]]
** [[Legacy:Power Core Volume Control Mutator|Power Core Volume Control Mutator]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameSinglePlayer</title>
    <id>28626</id>
    <revision>
      <id>40482</id>
      <timestamp>2010-01-14T08:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameState</title>
    <id>28373</id>
    <revision>
      <id>40041</id>
      <timestamp>2009-11-15T07:58:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GameStats</title>
    <id>1342</id>
    <revision>
      <id>3413</id>
      <timestamp>2006-02-26T22:43:32Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameStats (Package: Engine)}}

The GameStats object is used to send individual stat events to the stats server. Each game should spawn a GameStats object if it wishes to have stat logging.

{{innerbox|Bots and Spectators events,scores, and connects/disconnects are not stored.

}}

{{innerbox|Chr(9) is equivalent to a tab character.  And is used frequently in this class to space data appropriately.

}}

{{innerbox|All events are logged and use the method ''Header()'' to give them a formatted ''TimeStamp'' to note the time when the event occurred.

}}

==Properties ==
; bool bShowBots : Specifies whether stats on the bots should be logged.  This property is not used anywhere in UT2003's UnrealScript code.

; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI : An instance of [[Legacy:GameReplicationInfo|GameReplicationInfo]] stored in the Level, which is used to gather information for logging purposes.

; [[Legacy:FileLog|FileLog]] TempLog : A log file that is opened as ''&quot;stats.txt&quot;'', which is written to by the ''Logf'' method throughout the game. 

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) : Shuts down the stats logging.
; PostBeginPlay ( ) : Initializes the stats logging.

===New Methods===
; ConnectEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs when a player join the server.

; DisconnectEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs when a player disconnect from the server.

; EndGame (string Reason) : Called when the game ends.  Loops through the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s to gather their score and deaths.

; string FullTimeDate ( ) : Returns a string with the date in the format: YEAR-MONTH-DAY HOUR:MINUTE:SECOND

; GameEvent (string GEvent, string Desc, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs special events that take place in game.

; string GetMapFileName ( ) [native final] : Returns the name of the current map.

; string GetStatsIdentifier ([[Legacy:Controller|Controller]] C) [native final] : Returns the players login identifier (see [[Legacy:Uniquely Identify A Player|Uniquely Identify A Player]]).

; string Header ( ) : Returns the ''TimeStamp'' with a tab appended.

; Init ( ) : Creates the [[Legacy:FileLog|FileLog]] and opens &quot;Stats.txt&quot; as the log file.  If it fails, then the GameStats object is destroyed.

; KillEvent (string Killtype, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim, class&lt;[[Legacy:DamageType|DamageType]]&gt; Damage) : Logs a kill with the time, who did the killing (even environment), who was killed, and by the damage type they were killed by. 

; Logf (string LogString) : Writes to the &quot;Stats.txt&quot; file through the [[Legacy:FileLog|FileLog]] that was created during the ''init'' method.

; string MapName ( ) : Gets the mapname from the native function ''GetMapFileName'' and then strips off the extension &quot;.ut2&quot; and removes any tab characters.

; NewGame ( ) : Logs the Level Title, Level Author, Level GameName, Server Time, Server Time Zone, ''MapName'', and all the [[Legacy:Mutator|Mutator]] and [[Legacy:GameRules|GameRules]] objects that are loaded. 

; ScoreEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, float Points, string Desc) : Logs the timestamp, player name, points scored, and the description of the score.

; ServerInfo ( ) : Logs the Server Name, Time Zone, Admin Email, Admin Name, IP:port (filled by MasterServer), and stores all the key/value pairs of the ServerState.

; Shutdown ( ) : Closes the [[Legacy:FileLog|FileLog]].

; SpecialEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, string Desc) : Logs the time and the special event caused by a player.

; StartGame ( ) : Logs the time and the initials for the start of the game.

; TeamScoreEvent (int Team, float Points, string Desc) : Logs the time, the team number, points scored, and the description of the scoring.

; string TimeStamp ( ) : Returns a string with the time on the level rounded to the nearest second.

; String TimeZone ( ) : Currently returns 0, has a comment that this needs to be fixed. 

==Known Subclases==
* [[Legacy:MasterServerGameStats|MasterServerGameStats]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3414</id>
      <timestamp>2003-08-13T08:44:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>minor tweaks and not [[Category Class Tree]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameStats (Package: Engine)}}

The GameStats object is used to send individual stat events to the stats server. Each game should spawn a GameStats object if it wishes to have stat logging.

{{innerbox|Bots and Spectators events,scores, and connects/disconnects are not stored.

}}

{{innerbox|Chr(9) is equivalent to a tab character.  And is used frequently in this class to space data appropriately.

}}

{{innerbox|All events are logged and use the method ''Header()'' to give them a formatted ''TimeStamp'' to note the time when the event occurred.

}}

==Properties ==
; bool bShowBots : Specifies whether stats on the bots should be logged.  This property is not used anywhere in UT2003's UnrealScript code.

; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI : An instance of [[Legacy:GameReplicationInfo|GameReplicationInfo]] stored in the Level, which is used to gather information for logging purposes.

; [[Legacy:FileLog|FileLog]] TempLog : A log file that is opened as ''&quot;stats.txt&quot;'', which is written to by the ''Logf'' method throughout the game. 

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) : Shuts down the stats logging.
; PostBeginPlay ( ) : Initializes the stats logging.

===New Methods===
; ConnectEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs when a player join the server.

; DisconnectEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs when a player disconnect from the server.

; EndGame (string Reason) : Called when the game ends.  Loops through the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s to gather their score and deaths.

; string FullTimeDate ( ) : Returns a string with the date in the format: YEAR-MONTH-DAY HOUR:MINUTE:SECOND

; GameEvent (string GEvent, string Desc, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs special events that take place in game.

; string GetMapFileName ( ) [native final] : Returns the name of the current map.

; string GetStatsIdentifier ([[Legacy:Controller|Controller]] C) [native final] : Returns the players login identifier.

; string Header ( ) : Returns the ''TimeStamp'' with a tab appended.

; Init ( ) : Creates the [[Legacy:FileLog|FileLog]] and opens &quot;Stats.txt&quot; as the log file.  If it fails, then the GameStats object is destroyed.

; KillEvent (string Killtype, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim, class&lt;[[Legacy:DamageType|DamageType]]&gt; Damage) : Logs a kill with the time, who did the killing (even environment), who was killed, and by the damage type they were killed by. 

; Logf (string LogString) : Writes to the &quot;Stats.txt&quot; file through the [[Legacy:FileLog|FileLog]] that was created during the ''init'' method.

; string MapName ( ) : Gets the mapname from the native function ''GetMapFileName'' and then strips off the extension &quot;.ut2&quot; and removes any tab characters.

; NewGame ( ) : Logs the Level Title, Level Author, Level GameName, Server Time, Server Time Zone, ''MapName'', and all the [[Legacy:Mutator|Mutator]] and [[Legacy:GameRules|GameRules]] objects that are loaded. 

; ScoreEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, float Points, string Desc) : Logs the timestamp, player name, points scored, and the description of the score.

; ServerInfo ( ) : Logs the Server Name, Time Zone, Admin Email, Admin Name, IP:port (filled by MasterServer), and stores all the key/value pairs of the ServerState.

; Shutdown ( ) : Closes the [[Legacy:FileLog|FileLog]].

; SpecialEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, string Desc) : Logs the time and the special event caused by a player.

; StartGame ( ) : Logs the time and the initials for the start of the game.

; TeamScoreEvent (int Team, float Points, string Desc) : Logs the time, the team number, points scored, and the description of the scoring.

; string TimeStamp ( ) : Returns a string with the time on the level rounded to the nearest second.

; String TimeZone ( ) : Currently returns 0, has a comment that this needs to be fixed. 

==Known Subclases==
* [[Legacy:MasterServerGameStats|MasterServerGameStats]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3415</id>
      <timestamp>2006-02-26T19:41:49Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; GameStats (Package: Engine)}}

The GameStats object is used to send individual stat events to the stats server. Each game should spawn a GameStats object if it wishes to have stat logging.

{{innerbox|Bots and Spectators events,scores, and connects/disconnects are not stored.

}}

{{innerbox|Chr(9) is equivalent to a tab character.  And is used frequently in this class to space data appropriately.

}}

{{innerbox|All events are logged and use the method ''Header()'' to give them a formatted ''TimeStamp'' to note the time when the event occurred.

}}

==Properties ==
; bool bShowBots : Specifies whether stats on the bots should be logged.  This property is not used anywhere in UT2003's UnrealScript code.

; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI : An instance of [[Legacy:GameReplicationInfo|GameReplicationInfo]] stored in the Level, which is used to gather information for logging purposes.

; [[Legacy:FileLog|FileLog]] TempLog : A log file that is opened as ''&quot;stats.txt&quot;'', which is written to by the ''Logf'' method throughout the game. 

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) : Shuts down the stats logging.
; PostBeginPlay ( ) : Initializes the stats logging.

===New Methods===
; ConnectEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs when a player join the server.

; DisconnectEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs when a player disconnect from the server.

; EndGame (string Reason) : Called when the game ends.  Loops through the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s to gather their score and deaths.

; string FullTimeDate ( ) : Returns a string with the date in the format: YEAR-MONTH-DAY HOUR:MINUTE:SECOND

; GameEvent (string GEvent, string Desc, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who) : Logs special events that take place in game.

; string GetMapFileName ( ) [native final] : Returns the name of the current map.

; string GetStatsIdentifier ([[Legacy:Controller|Controller]] C) [native final] : Returns the players login identifier (see [[Legacy:Uniquely Identify A Player|Uniquely Identify A Player]]).

; string Header ( ) : Returns the ''TimeStamp'' with a tab appended.

; Init ( ) : Creates the [[Legacy:FileLog|FileLog]] and opens &quot;Stats.txt&quot; as the log file.  If it fails, then the GameStats object is destroyed.

; KillEvent (string Killtype, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Killer, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Victim, class&lt;[[Legacy:DamageType|DamageType]]&gt; Damage) : Logs a kill with the time, who did the killing (even environment), who was killed, and by the damage type they were killed by. 

; Logf (string LogString) : Writes to the &quot;Stats.txt&quot; file through the [[Legacy:FileLog|FileLog]] that was created during the ''init'' method.

; string MapName ( ) : Gets the mapname from the native function ''GetMapFileName'' and then strips off the extension &quot;.ut2&quot; and removes any tab characters.

; NewGame ( ) : Logs the Level Title, Level Author, Level GameName, Server Time, Server Time Zone, ''MapName'', and all the [[Legacy:Mutator|Mutator]] and [[Legacy:GameRules|GameRules]] objects that are loaded. 

; ScoreEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, float Points, string Desc) : Logs the timestamp, player name, points scored, and the description of the score.

; ServerInfo ( ) : Logs the Server Name, Time Zone, Admin Email, Admin Name, IP:port (filled by MasterServer), and stores all the key/value pairs of the ServerState.

; Shutdown ( ) : Closes the [[Legacy:FileLog|FileLog]].

; SpecialEvent ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Who, string Desc) : Logs the time and the special event caused by a player.

; StartGame ( ) : Logs the time and the initials for the start of the game.

; TeamScoreEvent (int Team, float Points, string Desc) : Logs the time, the team number, points scored, and the description of the scoring.

; string TimeStamp ( ) : Returns a string with the time on the level rounded to the nearest second.

; String TimeZone ( ) : Currently returns 0, has a comment that this needs to be fixed. 

==Known Subclases==
* [[Legacy:MasterServerGameStats|MasterServerGameStats]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gameplay</title>
    <id>1309</id>
    <revision>
      <id>3341</id>
      <timestamp>2005-11-04T20:13:04Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Gameplay''' is the overall value of a game as it is played.  This term is also often used to describe the ''playability'' of a distinct part of a game, such as a Mod, a Mutator or a particular map.

==Basic Game Elements ==

All games share similar elements that contribute to gameplay.  Although the Unreal game engine provides a basis for these elements by default, an overview of Game Design elements can be useful to modders and mappers alike.

===Rules===

In any game, players must have a clearly defined set of rules to work with.  These rules are used by the player to plan ahead and predict opponent moves.  The rules of the game provide structure in an situation where the outcome is uncertain.

===Chance===

Chance is a critical part of Game Design.  Without some chance or variety involved, the event is a series of predicatble incidents, like watching paint dry, which offers no incentive for the players to engage the rules or develop strategies.

===Tasks===

Players need tasks to perform in a game.  Examples of tasks include basic human behavior such as hunting, gathering, exploring, trading, and nurturing.  In a first-person-shooter like Unreal, the most obvious tasks are hunting and exploring, but examples of item gathering and trading (weapons throwing) are common.  An example of nurturing is the energizing of ONS power nodes in UT2004.  More complex tasks like puzzle solving can involve a series of simpler tasks building towards a defined goal.

===Goals===

Ultimately the tasks a player engages in are meant to help achieve a goal.  The overall goal or objective in a game should be very clear.  Lesser goals can be less obvious and left for players to discover as strategies.  The buildup of lesser goals towards a larger SuperGoal will help players feel more engaged and satisfied with the tasks they've performed.

==Elements of First-Person-Shooter Gameplay==

These are some of the more common and important gameplay elements that relate specifically to FPS games.

===Individuality===

The ability for each player to make a significant impact on the game and to appreciate each other player's involvement. A game should allow each player to have a significant impact on the game.  In CTF, if a defender simply stops playing then the flag is at risk unless one of the attackers falls back to cover that role.  This fall back position then reduces the total attack capability of the team.

===Teamwork (TeamGames)===

The ability to work with others to achieve a common goal and to act as a single entity. This is a basic social desire; to belong to a group that will increase chances of success.  

===Competition===

An awareness of other player's involvement in the game and the motivation to challenge it. Competition is a basic impulse shared by all humans.  Within clearly defined rules, a player is constantly comparing their situation to their opponent's, and attempting to do better.

===Strategy===

The awareness of a conflict that involves planning in advance of action. Each game is a unique puzzle for a player to solve.  Humans are consumate puzzle-solvers.

===Emergence===

The player's ability to modestly alter some rules of play for more strategic opportunities.  In well-defined systems set for emergence, some rules or guidlines are available to be modified by the players themselves during play; allowing for strategic action that reveals sub-strategies or tactics.

===Exploration===

The ability to discover unknown items, situations or events. A fundamental human need that is based on the idea that there is a possibility for better conditions or circumstances as a result of exploring the unknown.

===Escapism===

The ability to escape normal circumstances, situations, and locations. Whether the game simulated or iconic, the world of the game is one in which the player transports themselves to while playing.

===Persistence===

The lingering thoughts and emotions related to a game beyond play.  This extends the idea of escapism to include the mere thoughts of a game; so that the game persists in the mind of the player long after they have stopped playing.

==Related Topics==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Revision done. What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3342</id>
      <timestamp>2004-08-31T04:39:57Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Gameplay''' is the overall value of a game as it is played.  This term is also often used to describe the ''playability'' of a distinct part of a game, such as a Mod, a Mutator or a particular map.

==Basic Game Elements ==

All games share similar elements that contribute to gameplay.  Although the Unreal game engine provides a basis for these elements by default, an overview of Game Design elements can be useful to modders and mappers alike.

;Rules:In any game, players must have a clearly defined set of rules to work with.  These rules are used by the player to plan ahead and predict opponent moves.  The rules of the game provide structure in an situation where the outcome is uncertain.

;Chance:Chance is a critical part of Game Design.  Without some chance or variety involved, the event is a series of predicatble incidents, like watching paint dry, which offers no incentive for the players to engage the rules or develop strategies.

;Tasks:Players need tasks to perform in a game.  Examples of tasks include basic human behavior such as hunting, gathering, exploring, trading, and nurturing.  In a first-person-shooter like Unreal, the most obvious tasks are hunting and exploring, but examples of item gathering and trading (weapons throwing) are common.  An example of nurturing is the energizing of ONS power nodes in UT2004.  More complex tasks like puzzle solving can involve a series of simpler tasks building towards a defined goal.

;Goals:Ultimately the tasks a player engages in are meant to help achieve a goal.  The overall goal or objective in a game should be very clear.  Lesser goals can be less obvious and left for players to discover as strategies.  The buildup of lesser goals towards a larger SuperGoal will help players feel more engaged and satisfied with the tasks they've performed.

==Elements of First-Person-Shooter Gameplay==
;Individuality:The ability for each player to make a significant impact on the game and to appreciate each other player's involvement. A game should allow each player to have a significant impact on the game.  In CTF, if a defender simply stops playing then the flag is at risk unless one of the attackers falls back to cover that role.  This fall back position then reduces the total attack capability of the team.

;Teamwork (TeamGames):The ability to work with others to achieve a common goal and to act as a single entity. This is a basic social desire; to belong to a group that will increase chances of success.  

;Competition:An awareness of other player's involvement in the game and the motivation to challenge it. Competition is a basic impulse shared by all humans.  Within clearly defined rules, a player is constantly comparing their situation to their opponent's, and attempting to do better.

;Strategy:The awareness of a conflict that involves planning in advance of action. Each game is a unique puzzle for a player to solve.  Humans are consumate puzzle-solvers.
;:'''Emergence:''' The player's ability to modestly alter some rules of play for more strategic opportunities.  In well-defined systems set for emergence, some rules or guidlines are available to be modified by the players themselves during play; allowing for strategic action that reveals sub-strategies or tactics.

;Exploration:The ability to discover unknown items, situations or events. A fundamental human need that is based on the idea that there is a possibility for better conditions or circumstances as a result of exploring the unknown.

;Escapism:The ability to escape normal circumstances, situations, and locations. Whether the game simulated or iconic, the world of the game is one in which the player transports themselves to while playing.
;:'''Persistence:''' The lingering thoughts and emotions related to a game beyond play.  This extends the idea of escapism to include the mere thoughts of a game; so that the game persists in the mind of the player long after they have stopped playing.

==Related Topics==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Revision done. What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3343</id>
      <timestamp>2005-01-20T06:13:36Z</timestamp>
      <contributor>
        <ip>Geist</ip>
      </contributor>
      <comment>fixed apparent definition typos</comment>
      <text xml:space="preserve">'''Gameplay''' is the overall value of a game as it is played.  This term is also often used to describe the ''playability'' of a distinct part of a game, such as a Mod, a Mutator or a particular map.

==Basic Game Elements ==

All games share similar elements that contribute to gameplay.  Although the Unreal game engine provides a basis for these elements by default, an overview of Game Design elements can be useful to modders and mappers alike.

;Rules:In any game, players must have a clearly defined set of rules to work with.  These rules are used by the player to plan ahead and predict opponent moves.  The rules of the game provide structure in an situation where the outcome is uncertain.

;Chance:Chance is a critical part of Game Design.  Without some chance or variety involved, the event is a series of predicatble incidents, like watching paint dry, which offers no incentive for the players to engage the rules or develop strategies.

;Tasks:Players need tasks to perform in a game.  Examples of tasks include basic human behavior such as hunting, gathering, exploring, trading, and nurturing.  In a first-person-shooter like Unreal, the most obvious tasks are hunting and exploring, but examples of item gathering and trading (weapons throwing) are common.  An example of nurturing is the energizing of ONS power nodes in UT2004.  More complex tasks like puzzle solving can involve a series of simpler tasks building towards a defined goal.

;Goals:Ultimately the tasks a player engages in are meant to help achieve a goal.  The overall goal or objective in a game should be very clear.  Lesser goals can be less obvious and left for players to discover as strategies.  The buildup of lesser goals towards a larger SuperGoal will help players feel more engaged and satisfied with the tasks they've performed.

==Elements of First-Person-Shooter Gameplay==
;Individuality:The ability for each player to make a significant impact on the game and to appreciate each other player's involvement. A game should allow each player to have a significant impact on the game.  In CTF, if a defender simply stops playing then the flag is at risk unless one of the attackers falls back to cover that role.  This fall back position then reduces the total attack capability of the team.

;Teamwork (TeamGames):The ability to work with others to achieve a common goal and to act as a single entity. This is a basic social desire; to belong to a group that will increase chances of success.  

;Competition:An awareness of other player's involvement in the game and the motivation to challenge it. Competition is a basic impulse shared by all humans.  Within clearly defined rules, a player is constantly comparing their situation to their opponent's, and attempting to do better.

;Strategy:The awareness of a conflict that involves planning in advance of action. Each game is a unique puzzle for a player to solve.  Humans are consumate puzzle-solvers.

;Emergence:The player's ability to modestly alter some rules of play for more strategic opportunities.  In well-defined systems set for emergence, some rules or guidlines are available to be modified by the players themselves during play; allowing for strategic action that reveals sub-strategies or tactics.

;Exploration:The ability to discover unknown items, situations or events. A fundamental human need that is based on the idea that there is a possibility for better conditions or circumstances as a result of exploring the unknown.

;Escapism:The ability to escape normal circumstances, situations, and locations. Whether the game simulated or iconic, the world of the game is one in which the player transports themselves to while playing.

;Persistence:The lingering thoughts and emotions related to a game beyond play.  This extends the idea of escapism to include the mere thoughts of a game; so that the game persists in the mind of the player long after they have stopped playing.

==Related Topics==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

'''SuperApe:''' Revision done. What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gametype</title>
    <id>1301</id>
    <revision>
      <id>3321</id>
      <timestamp>2006-08-30T18:50:07Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Unreal Tournament (1/2003/2004) comes with a number of gametypes, and more are created by modders. Each gametype has its own rules for the player, and sometimes its own systems of actors that must be implemented by the mapper. Just as important, the general gameplay aspect of a map is influenced by the gametype it is designed for. This topic page lists pages that cover individual gametypes.  For a full list of available gametypes, see the subclass tree at [[Legacy:GameInfo|GameInfo]].

==Standard Game Types==
* [[Legacy:Mapping For DM|Mapping for DM]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]

[[Legacy:UT2004|UT2004]] only gametypes:
* [[Legacy:Mapping For ONS|Mapping for ONS]]
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]] and [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]

[[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] gametypes:
* [[Legacy:Mapping For BR|Mapping for BR]]
* [[Legacy:Mapping For DDOM|Mapping for DDOM]]

[[Legacy:Unreal Tournament|Unreal Tournament]] only gametypes:
* [[Legacy:Mapping For DOM|Mapping for DOM]]
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]

[[Legacy:Unreal 1|Unreal 1]] gametypes:
* [[Legacy:Mapping For Unreal SinglePlayer|Mapping for Unreal SinglePlayer]]
* [[Legacy:Mapping For Unreal Coop|Mapping for Unreal Coop]]

==UT2004 Mods==
* [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping for OSM Adventure]]
* [[Legacy:Mapping For BR4|Mapping for BR4]]
* [[Legacy:OverloadUT/Making CTF4 Maps|Mapping for CTF4]]
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]]
* [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]

==UT2003 Mods==
* [[Legacy:Mapping For Find The Ball|Mapping for Find The Ball]]
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]]
* [[Legacy:Mapping For Jailbreak|Mapping for Jailbreak]]
* [[Legacy:Mapping For One Flag Capture|Mapping for One Flag Capture]]

==UT Mods ==
* [[Legacy:Mapping For FEBA|Mapping for FEBA]]
* [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
* [[Legacy:Mapping For King Of The Hill|Mapping for King of the Hill]]
* [[Legacy:Mapping For MCTF|Mapping for MCTF]]
* [[Legacy:Mapping For RocketArena|Mapping for RocketArena]]
* [[Legacy:Mapping For Monster Hunt|Mapping for Monster Hunt]]
* [[Legacy:Monster_Arena_Mapping|Monster_Arena_Mapping]]
* [[Legacy:Mapping For UnrealFortress|Mapping for UnrealFortress]]
* [[Legacy:Mapping For TTR|Mapping for TTR]]

==Other Gametypes ==
* [[Legacy:Mapping For Territories|Mapping for territories]]
* [[Legacy:Mapping For DrawBridges|Mapping for DrawBridges]]

==Mod pages ==

A number of mods have dedicated pages on the wiki:
* [[Legacy:Jailbreak|Jailbreak]]
* [[Legacy:Esc|Esc]], and [[Legacy:Esc/FAQ|Esc/FAQ]]
* [[Legacy:ThieveryUT|ThieveryUT]]

==Related Topics==
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:GameInfo|GameInfo]] &amp;ndash; The class that determins gametype
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Gameplay|Gameplay]] &amp;ndash; The concept in general
* [[Legacy:Map Design|Map Design]] &amp;ndash; Game concepts related to mapping
* [[Legacy:Map Flow|Map Flow]] &amp;ndash; Maximizing replay value through design
* [[Legacy:Z-Axis|Z-Axis]] &amp;ndash; Effectively using the dimension of height in map layouts
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; A breeding ground for new maps
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; A breeding ground for new mods
* [[Legacy:Map File Prefix|Map File Prefix]]

==Discussion==

'''Sweavo:''' Should fill in all the actual gametype names here.  Obviously there are new ones coming along from time to time, but the official ones can be listed and the Power of Wiki can be left to deal with the rest.

'''Milambyr:''' What about VCTF??

'''Phoenix:''' AlphaCoop is another one I would like dealt with.

'''SuperApe:''' [[Legacy:Mapping For VCTF|Mapping for VCTF]] page created.

'''EricBlade:''' May I suggest renaming it &quot;Unreal Tournament Game Types&quot;?

'''Tarquin:''' Non-UT gametypes are welcome here :) ... at least until the page gets too big.

'''Tarquin:''' Sorry, the key idea is hideous. If you prefer a flat list, just use the game names, they are short enough.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3322</id>
      <timestamp>2006-05-25T22:41:05Z</timestamp>
      <contributor>
        <ip>88-96-28-150.dsl.zen.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Unreal Tournament (1/2003/2004) comes with a number of gametypes, and more are created by modders. Each gametype has its own rules for the player, and sometimes its own systems of actors that must be implemented by the mapper. Just as important, the general gameplay aspect of a map is influenced by the gametype it is designed for. This topic page lists pages that cover individual gametypes.  For a full list of available gametypes, see the subclass tree at [[Legacy:GameInfo|GameInfo]].

Key: '''''&amp;''''' UT2004 only,'''''%''''' UT2003 only, '''''+''''' UT2003/4 only, '''''@''''' UT'99 only

==Standard Game Types==
* [[Legacy:Mapping For DM|Mapping for DM]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Mapping For ONS|Mapping for ONS]] '''''&amp;'''''
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]] and [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] '''''&amp;'''''
* [[Legacy:Mapping For VCTF|Mapping for VCTF]] '''''&amp;'''''
* [[Legacy:Mapping For BR|Mapping for BR]] '''''+'''''
* [[Legacy:Mapping For DDOM|Mapping for DDOM]] '''''+'''''
* [[Legacy:Mapping For DOM|Mapping for DOM]] '''''@'''''
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]] '''''@'''''
* [[Legacy:Mapping For Unreal SinglePlayer|Mapping for Unreal SinglePlayer]] '''''@'''''
* [[Legacy:Mapping For Unreal Coop|Mapping for Unreal Coop]] '''''@'''''

==Mods==
* [[Legacy:Mapping For BR4|Mapping for BR4]] '''''&amp;'''''
* [[Legacy:OverloadUT/Making CTF4 Maps|Mapping for CTF4]] '''''&amp;'''''
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]] '''''&amp;'''''
* [[Legacy:Mapping For UTXMP|Mapping For UTXMP]] '''''&amp;'''''
* [[Legacy:Mapping For Find The Ball|Mapping for Find The Ball]] '''''%'''''
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]] '''''%'''''
* [[Legacy:Mapping For Jailbreak|Mapping for Jailbreak]] '''''%'''''
* [[Legacy:Mapping For One Flag Capture|Mapping for One Flag Capture]] '''''%'''''
* [[Legacy:Mapping For FEBA|Mapping for FEBA]] '''''@'''''
* [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]] '''''@'''''
* [[Legacy:Mapping For King Of The Hill|Mapping for King of the Hill]] '''''@'''''
* [[Legacy:Mapping For MCTF|Mapping for MCTF]] '''''@'''''
* [[Legacy:Mapping For RocketArena|Mapping for RocketArena]] '''''@'''''
* [[Legacy:Mapping For Monster Hunt|Mapping for Monster Hunt]] '''''@'''''
* [[Legacy:Monster_Arena_Mapping|Monster_Arena_Mapping]] '''''@'''''
* [[Legacy:Mapping For UnrealFortress|Mapping for UnrealFortress]] '''''@'''''
* [[Legacy:Mapping For TTR|Mapping for TTR]] '''''@'''''

==Other Gametypes ==
* [[Legacy:Mapping For Territories|Mapping for territories]]
* [[Legacy:Mapping For DrawBridges|Mapping for DrawBridges]]

==Mod sub-sites ==

A number of mods have dedicated pages on the wiki:
* [[Legacy:Jailbreak|Jailbreak]]
* [[Legacy:Esc|Esc]], and [[Legacy:Esc/FAQ|Esc/FAQ]]
* [[Legacy:ThieveryUT|ThieveryUT]]

==Related Topics==
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:GameInfo|GameInfo]] &amp;ndash; The class that determins gametype
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Gameplay|Gameplay]] &amp;ndash; The concept in general
* [[Legacy:Map Design|Map Design]] &amp;ndash; Game concepts related to mapping
* [[Legacy:Map Flow|Map Flow]] &amp;ndash; Maximizing replay value through design
* [[Legacy:Z-Axis|Z-Axis]] &amp;ndash; Effectively using the dimension of height in map layouts
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; A breeding ground for new maps
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; A breeding ground for new mods
* [[Legacy:Map File Prefix|Map File Prefix]]

==Discussion==

'''Sweavo:''' Should fill in all the actual gametype names here.  Obviously there are new ones coming along from time to time, but the official ones can be listed and the Power of Wiki can be left to deal with the rest.

'''Milambyr:''' What about VCTF??

'''Phoenix:''' AlphaCoop is another one I would like dealt with.

'''SuperApe:''' [[Legacy:Mapping For VCTF|Mapping for VCTF]] page created.

'''EricBlade:''' May I suggest renaming it &quot;Unreal Tournament Game Types&quot;?

'''Tarquin:''' Non-UT gametypes are welcome here :) ... at least until the page gets too big.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3323</id>
      <timestamp>2006-06-01T10:58:12Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>the key is not good</comment>
      <text xml:space="preserve">Unreal Tournament (1/2003/2004) comes with a number of gametypes, and more are created by modders. Each gametype has its own rules for the player, and sometimes its own systems of actors that must be implemented by the mapper. Just as important, the general gameplay aspect of a map is influenced by the gametype it is designed for. This topic page lists pages that cover individual gametypes.  For a full list of available gametypes, see the subclass tree at [[Legacy:GameInfo|GameInfo]].

==Standard Game Types==
* [[Legacy:Mapping For DM|Mapping for DM]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]

[[Legacy:UT2004|UT2004]] only gametypes:
* [[Legacy:Mapping For ONS|Mapping for ONS]]
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]] and [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]

[[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] gametypes:
* [[Legacy:Mapping For BR|Mapping for BR]]
* [[Legacy:Mapping For DDOM|Mapping for DDOM]]

[[Legacy:Unreal Tournament|Unreal Tournament]] only gametypes:
* [[Legacy:Mapping For DOM|Mapping for DOM]]
* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]

[[Legacy:Unreal 1|Unreal 1]] gametypes:
* [[Legacy:Mapping For Unreal SinglePlayer|Mapping for Unreal SinglePlayer]]
* [[Legacy:Mapping For Unreal Coop|Mapping for Unreal Coop]]

==UT2004 Mods==
* [[Legacy:Mapping For BR4|Mapping for BR4]]
* [[Legacy:OverloadUT/Making CTF4 Maps|Mapping for CTF4]]
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]]
* [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]

==UT2003 Mods==
* [[Legacy:Mapping For Find The Ball|Mapping for Find The Ball]]
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]]
* [[Legacy:Mapping For Jailbreak|Mapping for Jailbreak]]
* [[Legacy:Mapping For One Flag Capture|Mapping for One Flag Capture]]

==UT Mods ==
* [[Legacy:Mapping For FEBA|Mapping for FEBA]]
* [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
* [[Legacy:Mapping For King Of The Hill|Mapping for King of the Hill]]
* [[Legacy:Mapping For MCTF|Mapping for MCTF]]
* [[Legacy:Mapping For RocketArena|Mapping for RocketArena]]
* [[Legacy:Mapping For Monster Hunt|Mapping for Monster Hunt]]
* [[Legacy:Monster_Arena_Mapping|Monster_Arena_Mapping]]
* [[Legacy:Mapping For UnrealFortress|Mapping for UnrealFortress]]
* [[Legacy:Mapping For TTR|Mapping for TTR]]

==Other Gametypes ==
* [[Legacy:Mapping For Territories|Mapping for territories]]
* [[Legacy:Mapping For DrawBridges|Mapping for DrawBridges]]

==Mod pages ==

A number of mods have dedicated pages on the wiki:
* [[Legacy:Jailbreak|Jailbreak]]
* [[Legacy:Esc|Esc]], and [[Legacy:Esc/FAQ|Esc/FAQ]]
* [[Legacy:ThieveryUT|ThieveryUT]]

==Related Topics==
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:GameInfo|GameInfo]] &amp;ndash; The class that determins gametype
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Gameplay|Gameplay]] &amp;ndash; The concept in general
* [[Legacy:Map Design|Map Design]] &amp;ndash; Game concepts related to mapping
* [[Legacy:Map Flow|Map Flow]] &amp;ndash; Maximizing replay value through design
* [[Legacy:Z-Axis|Z-Axis]] &amp;ndash; Effectively using the dimension of height in map layouts
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; A breeding ground for new maps
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; A breeding ground for new mods
* [[Legacy:Map File Prefix|Map File Prefix]]

==Discussion==

'''Sweavo:''' Should fill in all the actual gametype names here.  Obviously there are new ones coming along from time to time, but the official ones can be listed and the Power of Wiki can be left to deal with the rest.

'''Milambyr:''' What about VCTF??

'''Phoenix:''' AlphaCoop is another one I would like dealt with.

'''SuperApe:''' [[Legacy:Mapping For VCTF|Mapping for VCTF]] page created.

'''EricBlade:''' May I suggest renaming it &quot;Unreal Tournament Game Types&quot;?

'''Tarquin:''' Non-UT gametypes are welcome here :) ... at least until the page gets too big.

'''Tarquin:''' Sorry, the key idea is hideous. If you prefer a flat list, just use the game names, they are short enough.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Garbage Collection</title>
    <id>1302</id>
    <revision>
      <id>3324</id>
      <timestamp>2006-04-07T07:57:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">'''Garbage''' is an unused part or element of code to which memory was allocated, (some resource of a program, or process), and, subsequently, has no pointers to it or has had its references destroyed. Garbage does no damage to a program initially, but it will gradually monopolize all available memory and the system will tend to run slower and slower and eventually fail or crash. Garbage collection involves running a program periodically that identifies and collects all garbage and frees memory (for more garbage). All objects and actors in Unreal are garbage-collected using a tree-following garbage collector similar to that of the Java VM.

Garbage Collection in Unreal essentially consists of serializing all Objects in the game (that includes Actors too, of course), and then deleting anything that doesn't end up being serialized.  Full Garbage Collection in Unreal occurs automatically at a level change, or can be forced with a [[Legacy:Console|console]] command.  Generally since most Objects are relatively small, the overhead for having the Objects stay around in memory is also relatively small (with the gluttonous [[Legacy:UWindowWindow|UWindowWindow]] being an exception of course).

==Related Topics ==
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Wikipedia:Automatic garbage collection]]</text>
    </revision>
    <revision>
      <id>3325</id>
      <timestamp>2005-01-11T15:50:44Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>despam</comment>
      <text xml:space="preserve">'''Garbage''' is an unused part or element of code to which memory was allocated, (some resource of a program, or process), and, subsequently, has no pointers to it or has had its references destroyed. Garbage does no damage to a program initially, but it will gradually monopolize all available memory and the system will tend to run slower and slower and eventually fail or crash. Garbage collection involves running a program periodically that identifies and collects all garbage and frees memory (for more garbage). All objects and actors in Unreal are garbage-collected using a tree-following garbage collector similar to that of the Java VM.

Garbage Collection in Unreal essentially consists of serializing all Objects in the game (that includes Actors too, of course), and then deleting anything that doesn't end up being serialized.  Full Garbage Collection in Unreal occurs automatically at a level change, or can be forced with a [[Legacy:Console|console]] command.  Generally since most Objects are relatively small, the overhead for having the Objects stay around in memory is also relatively small (with the gluttonous [[Legacy:UWindowWindow|UWindowWindow]] being an exception of course).

==Related Topics ==
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Wikipedia:Automatic garbage collection]]</text>
    </revision>
    <revision>
      <id>3326</id>
      <timestamp>2006-04-06T21:06:05Z</timestamp>
      <contributor>
        <ip>Mailhost.segurosmultiples.com</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">'''Garbage''' is an unused part or element of code to which memory was allocated, (some resource of a program, or process), and, subsequently, has no pointers to it or has had its references destroyed. Garbage does no damage to a program initially, but it will gradually monopolize all available memory and the system will tend to run slower and slower and eventually fail or crash. Garbage collection involves running a program periodically that identifies and collects all garbage and frees memory (for more garbage). All objects and actors in Unreal are garbage-collected using a tree-following garbage collector similar to that of the Java VM.

Garbage Collection in Unreal essentially consists of serializing all Objects in the game (that includes Actors too, of course), and then deleting anything that doesn't end up being serialized.  Full Garbage Collection in Unreal occurs automatically at a level change, or can be forced with a [[Legacy:Console|console]] command.  Generally since most Objects are relatively small, the overhead for having the Objects stay around in memory is also relatively small (with the gluttonous [[Legacy:UWindowWindow|UWindowWindow]] being an exception of course).

==Related Topics ==
* [[Legacy:Destroying Objects|Destroying Objects]]
* [[Wikipedia:Automatic garbage collection]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gasbag</title>
    <id>28388</id>
    <revision>
      <id>40059</id>
      <timestamp>2009-11-15T08:16:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gehn</title>
    <id>1344</id>
    <revision>
      <id>3418</id>
      <timestamp>2003-11-07T22:38:15Z</timestamp>
      <contributor>
        <ip>Gehn</ip>
      </contributor>
      <comment>added KoC link</comment>
      <text xml:space="preserve">===It's a small world, but it's all mine===

====The Being That Is Me====

I'm 17 years old and in my senior year of highschool. My real name is Matthew Park and my alias is from the Myst game and book series. I started to learn Visual Basic when I was about 12 but soon gave up since I did not have the patience. When highschool started I got into the introductory Visual Basic courses and did thoses through my junior year. Through all this I learned that Visual Basic is mostly for people involved with databases and I DON'T want to do databases. This year I am taking AP Computer Science where we are learning Java. It is a blast but I still haven't gotten use to the semicolon at the end of almost every line; I do not know much about Unreal Script but I hope this will be a good source to learn from, it looks very promising and maybe as I go through it I will be able to correct some small errors until I learn it enough to make my own article. I plan on going on to a 4-year degree in Computer Science and possibly getting a programming position for some company.

====How You Doing?====

If ya want to be my wiki friend just contact me somehow. I'm sure I could use the help every once and while on some uscript code I am trying to get to work.

ICQ: 162148182

AIM: Gehn6

MSN: savepotatoes@msn.com

KoC Link. PLEASE CLICK MY LINK!!! I NEED MEN!!  http://www.kingsofchaos.com/recruit.php?uniqid=svsg7887

====Why I Need Clicks====

It was a horrible battle. I got about 8 friends to play KoC with me and they were all under me. Then someone sabatoged one of my friends weapons and now he left, joined another person, and all of my 8 friends are under him now. For some reason they declared war on me and now I have to fend for myself. If people click the link I get 50 gold per turn more. This would GREATLY help me. Thanks in advanced.

==Discussion==

'''Daid303:''' &quot;If ya want to be my wiki friend&quot; that sounds pretty stupid some how.... :P anyhow, welcome :D

'''Corran:''' Hey Gehn, it's Matt here from Unreal Racing. How you doing?

'''Gehn:''' I'm good. How you doing?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3419</id>
      <timestamp>2003-11-06T21:43:30Z</timestamp>
      <contributor>
        <ip>Corran</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===It's a small world, but it's all mine===

====The Being That Is Me====

I'm 17 years old and in my senior year of highschool. My real name is Matthew Park and my alias is from the Myst game and book series. I started to learn Visual Basic when I was about 12 but soon gave up since I did not have the patience. When highschool started I got into the introductory Visual Basic courses and did thoses through my junior year. Through all this I learned that Visual Basic is mostly for people involved with databases and I DON'T want to do databases. This year I am taking AP Computer Science where we are learning Java. It is a blast but I still haven't gotten use to the semicolon at the end of almost every line; I do not know much about Unreal Script but I hope this will be a good source to learn from, it looks very promising and maybe as I go through it I will be able to correct some small errors until I learn it enough to make my own article. I plan on going on to a 4-year degree in Computer Science and possibly getting a programming position for some company.

====How You Doing?====

If ya want to be my wiki friend just contact me somehow. I'm sure I could use the help every once and while on some uscript code I am trying to get to work.

ICQ: 162148182

AIM: Gehn6

MSN: savepotatoes@msn.com

==Discussion==

'''Daid303:''' &quot;If ya want to be my wiki friend&quot; that sounds pretty stupid some how.... :P anyhow, welcome :D

'''Corran:''' Hey Gehn, it's Matt here from Unreal Racing. How you doing?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Geist</title>
    <id>1358</id>
    <revision>
      <id>3448</id>
      <timestamp>2008-01-02T06:10:59Z</timestamp>
      <contributor>
        <ip>Geist</ip>
      </contributor>
      <comment>minor updates (links and UT3, etc)</comment>
      <text xml:space="preserve">=Who am I?=

{|

|-
|Name
|Allan Campbell 
|-
|Email
|geist@bop-mod.com 
|}

As you might have noticed from my website (see BOP site below), I've been modding games for a LONG time.  However, it goes back much farther than that project alone.  Like many others, I was involved when Doom was getting hacked to use different art for the creatures, like Barney, StormTroopers, etc.  I was very active in the Quake (1) modding community... my mods included a chain-lightning mod (lightning that would jump from target to target in one blast, depending on their conductivity and proximity &amp;ndash; I once took out 12 zombies simulataneously in the graveyard area!).  Plus, I generated a fair amount of contributions on the Quake2 (and later, Shogo-MAD) modding mailing lists and websites, answering many questions and writing tutorials.  (I think I may have been using the ''Zor Prime'' nick during the Q2 days.)

Regrettably, my PC hardware has always lagged behind the times.  When Unreal first hit the scene, there was no way I'd be able to run it on my Pentium75 with a Monster3D (voodoo1) vid card, so I just let it slide and knew that one day I would give it a run.  So instead, I resigned to modding on lesser engines on lesser hardware.  In a way, I now wish I had gotten into Unreal/UT modding much earlier, but things just have a way of working out anyway.  By that, I mean that my work with the Shogo-MAD community ended up kick-starting my professional game-development career (i.e. I got a job with LithTech in 2000), and later I moved back to NC to work with some great people at Vicious Cycle (on several console projects, with both good and mediocre designs and production cycles).

And now, after a LONG hiatus (during which I devoted much of my time to my family and career), I've decided to revive my modding projects and finally realize some of the designs that have been floating around in my head for the last few years.  I will most-likely finish the &quot;Macross: Balance of Power&quot; project using UT2004, and I have several other smaller components to implement that will become weapons, items, mutators, and a few simple gametypes on their own.  In addition, I feel that this Wiki is a perfect place to call &quot;home&quot; for giving back to the modding community that seems rather quiet (lately, at least), but still has so much to offer.  I don't think the Wiki concept is a &quot;perfect&quot; solution to organizing info in this type of community, but it's the BEST thing I've come across SO FAR. :)

ANYWAY, I fear I'm getting too long-winded now.  I just want to state that I'm happy to be here, and I hope to fulfill any needs the Wiki asks of me while I explore this engine more closely and complete my projects.

'''[Update: I am currently dabbling in UT3 scripting/modding, and although it has its challenges, it is still fairly rewarding.  My main problems are lack of a decent video card to really see what I'm making in all its glory, and the sheer amount of work it takes to do some things that were kinda simple in UT2k4, such as providing a UI configuration interface for a mutator.  Anyway, I'm making progress... and the community is maturing.]'''

----

=Projects=

==Balance of Power==

http://www.bop-mod.com

I'll update the Bio text to reflect this, but for now, an update in this section should suffice.  As mentioned on the project website, I've updated a lot of the text about the shift to the UT2k4 engine '''[Now UT3]'''.  Also, the scope (as a whole) of the project has become more concise -&gt; No longer will I try to recreate the DM, CTF, ObjectiveDriven modes, etc.  Instead, I will provide a mutator to allow substitutions with vehicles in the Onslaught and VehicleCTF modes of UT2k4.  This allows me to concentrate on balancing and tweaking just ONE new mode, dubbed ''Balance Of Power''.  The initial set of vehicles/weapons will be from the ''Macross'' universe (hence the name ''BOP: Macross''), but later I will be releasing sets of vehicles from other licenses (e.g. ''BOP: Gundam'', ''BOP: Star Wars'', ''BOP: Transformers'') and even some new designs I have on the back-burner '''[and some of which are being created as I learn UT3's quirks]'''.

Note:  The vehicles I'm creating are not derived from SVehicle, since they are skeletal mecha.  Also, they cannot derive from KVehicle, because they're not restricted to PHYS_Karma and PHYS_None.  Instead, I'm attempting to create a new class (derived directly from Vehicle) that includes a lot of the perks from those classes (including ONSVehicle), but of course, is a thundering mecha with multiple weapon systems available to one pilot.  I've seen other mods replace player models with mecha, but to my knowledge, no one has tried this with bipedal vehicles before. So as I get some conclusive/stable findings, I will begin posting them to this Wiki for others to benefit.

And btw, as a tidbit, I currently have the '''HWR-00-Mk II Monster''' romping around ONS-RedPlanet, with initial sounds and anims.  After some additional anims and camera-work are completed, I'll add the weapons and targeting system, and ensure the script is net-friendly... then it should be ready for at least a small download as one new vehicle (as a taste of what is to come), and I'll probably start creating some Wiki pages.

'''Small Update:'''  Because the '''Monster''' was in the wrong space in Maya (X-right, Y-Up, Z-forward), it was causing ''major'' problems when trying to move it (and aim the nodes) in UT2k4.  Therefore, I totally rebuilt its skeleton (after rigging up the '''Tomahawk''' model as a test), re-animated it, and re-exported it.  That sucked a lot of time away, but at this point (6/5/05), I have some weapons in, and I expect to have a release of the '''Monster''' as a new vehicle within a few weeks.  About 1/2 the code and about 1/4 the anims are done right now.  Of course, I'll may need someone to help with the texture work, but it's not really a priority right now.

===Notes===
* Vehicles derived from '''SVehicle''' (e.g. '''ONSVehicle''') will assert in C++ land (and crash the game) if they are not &lt;tt&gt;PHYS_None&lt;/tt&gt; or &lt;tt&gt;PHYS_Karma&lt;/tt&gt;.  That blows, but I can only imagine the native code (replication, etc) makes some assumptions that require this restriction.  Derive from '''Vehicle''' (or '''ASVehicle''') to use other movement types.
* ''GetRootLocationDelta()'' and ''GetRootRotation()'' both return (0,0,0) (vector and rotator, respectively) when you have a '''BOPWeapon''' attached (subclassed from '''ONSWeapon''').  Not really sure why yet, though, since these functions work fine when attaching a weapon derived from '''Inventory''' (e.g. '''ShockRifle''', etc).  Btw, the vehicle is not really stuck... you can modify the ''Velocity'' and it still moves just fine.
* It seems that no matter which ''space'' value you specify (e.g. 0 or 1), ''GetBoneRotation()'' always returns the worldspace rotation.  Also, no matter which ''space'' value, ''SetBoneRotation()'' always seems to be '''additive''', meaning it moves the bone with the animation, then adds the specified rotation. For example, '''SetBoneRotation( 'j_Torso', rotator( 8192, 0, 0) )''' will point the torso up 45 deg from its current anim position.  I'm not ''sure'' if this is ''completely'' accurate, since for the '''Monster''', I had to make some adjustments in rotation of shoulders, and I've seen extra rotation in the torso when yawing the pelvis.

----

=Guestbook=

'''Tarquin:''' Welcome! :) Enjoy your stay on unreal wiki.

'''EntropicLqd:''' Hello and welcome to the Wiki.  Enjoy your stay here.

'''Geist:'''  Thanks guys!  I've been visiting for a while, trying to get more into UT modding (it's LONG overdue), and now I finally have time from work to really dive in.  I have a fair amount of history with game engine documentation and development, so I expect to contibute a lot.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3449</id>
      <timestamp>2005-01-17T18:15:03Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">; Name : Allan Campbell
; Email : geist@maxgaming.net
; Website : http://macross.mgonetwork.com

More to come about current projects (and a bio)...

----

'''Tarquin:''' Welcome! :) Enjoy your stay on unreal wiki.

'''EntropicLqd:''' Hello and welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3450</id>
      <timestamp>2005-06-16T04:09:23Z</timestamp>
      <contributor>
        <ip>Geist</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Who am I?=

{|

|-
|Name
|Allan Campbell 
|-
|Email
|geist@maxgaming.net 
|}

As you might have noticed from my website, I've been modding games for a LONG time.  However, it goes back much farther than that project alone.  Like many others, I was involved when Doom was getting hacked to use different art for the creatures, like Barney, StormTroopers, etc.  I was very active in the Quake (1) modding community... my mods included a chain-lightning mod (lightning that would jump from target to target in one blast, depending on their conductivity and proximity &amp;ndash; I once took out 12 zombies simulataneously in the graveyard area!).  Plus, I generated a fair amount of contributions on the Quake2 (and later, Shogo-MAD) modding mailing lists and websites, answering many questions and writing tutorials.  (I think I may have been using the ''Zor Prime'' nick during the Q2 days.)

Regrettably, my PC hardware has always lagged behind the times.  When Unreal first hit the scene, there was no way I'd be able to run it on my Pentium75 with a Monster3D (voodoo1) vid card, so I just let it slide and knew that one day I would give it a run.  So instead, I resigned to modding on lesser engines on lesser hardware.  In a way, I now wish I had gotten into Unreal/UT modding much earlier, but things just have a way of working out anyway.  By that, I mean that my work with the Shogo-MAD community ended up kick-starting my professional game-development career (i.e. I got a job with LithTech in 2000), and later I moved back to NC to work with some great people at Vicious Cycle (on several console projects, with both good and mediocre designs and productions).

And now, after a LONG hiatus (during which I devoted much of my time to my family and career), I've decided to revive my modding projects and finally realize some of the designs that have been floating around in my head for the last few years.  I will most-likely finish the &quot;Macross: Balance of Power&quot; project using UT2004, and I have several other smaller components to implement that will become weapons, items, mutators, and a few simple gametypes on their own.  In addition, I feel that this Wiki is a perfect place to call &quot;home&quot; for giving back to the modding community that seems rather quiet (lately, at least), but still has so much to offer.  I don't think the Wiki concept is a &quot;perfect&quot; solution to organizing info in this type of community, but it's the BEST thing I've come across SO FAR. :)

ANYWAY, I fear I'm getting too long-winded now.  I just want to state that I'm happy to be here, and I hope to fulfill any needs the Wiki asks of me while I explore this engine more closely and complete my projects.

----

=Projects=

==Balance of Power==

http://macross.mgonetwork.com

I'll update the Bio text to reflect this, but for now, an update in this section should suffice.  As mentioned on the project website, I've updated a lot of the text about the shift to the UT2k4 engine.  Also, the scope (as a whole) of the project has become more concise -&gt; No longer will I try to recreate the DM, CTF, ObjectiveDriven modes, etc.  Instead, I will provide a mutator to allow substitutions with vehicles in the Onslaught and VehicleCTF modes of UT2k4.  This allows me to concentrate on balancing and tweaking just ONE new mode, dubbed ''Balance Of Power''.  The initial set of vehicles/weapons will be from the ''Macross'' universe (hence the name ''BOP: Macross''), but later I will be releasing sets of vehicles from other licenses (e.g. ''BOP: Gundam'', ''BOP: Star Wars'', ''BOP: Transformers'') and even some new designs I have on the back-burner.

Note:  The vehicles I'm creating are not derived from SVehicle, since they are skeletal mecha.  Also, they cannot derive from KVehicle, because they're not restricted to PHYS_Karma and PHYS_None.  Instead, I'm attempting to create a new class (derived directly from Vehicle) that includes a lot of the perks from those classes (including ONSVehicle), but of course, is a thundering mecha with multiple weapon systems available to one pilot.  I've seen other mods replace player models with mecha, but to my knowledge, no one has tried this with bipedal vehicles before. So as I get some conclusive/stable findings, I will begin posting them to this Wiki for others to benefit.

And btw, as a tidbit, I currently have the '''HWR-00-Mk II Monster''' romping around ONS-RedPlanet, with initial sounds and anims.  After some additional anims and camera-work are completed, I'll add the weapons and targeting system, and ensure the script is net-friendly... then it should be ready for at least a small download as one new vehicle (as a taste of what is to come), and I'll probably start creating some Wiki pages.

'''Small Update:'''  Because the '''Monster''' was in the wrong space in Maya (X-right, Y-Up, Z-forward), it was causing ''major'' problems when trying to move it (and aim the nodes) in UT2k4.  Therefore, I totally rebuilt its skeleton (after rigging up the '''Tomahawk''' model as a test), re-animated it, and re-exported it.  That sucked a lot of time away, but at this point (6/5/05), I have some weapons in, and I expect to have a release of the '''Monster''' as a new vehicle within a few weeks.  About 1/2 the code and about 1/4 the anims are done right now.  Of course, I'll may need someone to help with the texture work, but it's not really a priority right now.

===Notes===
* Vehicles derived from '''SVehicle''' (e.g. '''ONSVehicle''') will assert in C++ land (and crash the game) if they are not &lt;tt&gt;PHYS_None&lt;/tt&gt; or &lt;tt&gt;PHYS_Karma&lt;/tt&gt;.  That blows, but I can only imagine the native code (replication, etc) makes some assumptions that require this restriction.  Derive from '''Vehicle''' (or '''ASVehicle''') to use other movement types.
* ''GetRootLocationDelta()'' and ''GetRootRotation()'' both return (0,0,0) (vector and rotator, respectively) when you have a '''BOPWeapon''' attached (subclassed from '''ONSWeapon''').  Not really sure why yet, though, since these functions work fine when attaching a weapon derived from '''Inventory''' (e.g. '''ShockRifle''', etc).  Btw, the vehicle is not really stuck... you can modify the ''Velocity'' and it still moves just fine.
* It seems that no matter which ''space'' value you specify (e.g. 0 or 1), ''GetBoneRotation()'' always returns the worldspace rotation.  Also, no matter which ''space'' value, ''SetBoneRotation()'' always seems to be '''additive''', meaning it moves the bone with the animation, then adds the specified rotation. For example, '''SetBoneRotation( 'j_Torso', rotator( 8192, 0, 0) )''' will point the torso up 45 deg from its current anim position.  I'm not ''sure'' if this is ''completely'' accurate, since for the '''Monster''', I had to make some adjustments in rotation of shoulders, and I've seen extra rotation in the torso when yawing the pelvis.

----

=Guestbook=

'''Tarquin:''' Welcome! :) Enjoy your stay on unreal wiki.

'''EntropicLqd:''' Hello and welcome to the Wiki.  Enjoy your stay here.

'''Geist:'''  Thanks guys!  I've been visiting for a while, trying to get more into UT modding (it's LONG overdue), and now I finally have time from work to really dive in.  I have a fair amount of history with game engine documentation and development, so I expect to contibute a lot.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:General Scale And Dimensions</title>
    <id>1296</id>
    <revision>
      <id>3308</id>
      <timestamp>2007-09-24T10:14:43Z</timestamp>
      <contributor>
        <ip>Client-82-2-128-124.manc.adsl.virgin.net</ip>
      </contributor>
      <minor/>
      <comment>Fixed a link - outpt</comment>
      <text xml:space="preserve">This page is in the process of being cleaned up.

Material has been moved to:
* [[Legacy:Unreal Unit|Unreal Unit]] &amp;ndash; what UUs represent, how to convert them, etc
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]] &amp;ndash; how far players can move, run, jump, etc
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]

==Units &amp; Scale ==

The [[Legacy:Unreal Engine|Unreal engine]] uses two units: 

===Length ===

Unreal Units, or UU. Often simply called &quot;units&quot;, or even not given a name at all (&quot;build a 256x256x64 box&quot;). The UnrealEd [[Legacy:Grid|grid]], dimensions of [[Legacy:Brush|brush]]es, positions of [[Legacy:Actor|actor]]s and sizes of [[Legacy:Collision Cylinder|collision cylinder]]s are all measured in these units. The [[Legacy:Unreal World|Unreal World]] can have a maximum size of 65536 UU (=2^16) in Unreal/UT. UT2003 and U2 have worlds of 524288 UU (=2^19). 

One UU doesn't actually ''mean'' anything in the real world, it's just something within the engine. 

An arbitrary scale is used for game programming because the scale may change. One game may be an FPS, while another may be a space sim with several planets on an entire map. Obviously, because of the constraint on the map size, you cannot have a whole planet on a map scaled to an appropriate size for an FPS. That is why everything works in abstract &quot;units.&quot; 

But each game picks a scale to work at: the size of players and objects, which means there is an effective conversion factor between UU and real physical units. In the Unreal series of games, this is generally held to be roughly:

* 256 UU  = 487.68 cm = 16 feet. 
* 1 meter = 52.5 UU
* 1 foot  = 16 UU
* 1 cm = 0.525 UU
* 1 UU = 0.75 inches

Note that these are approximations. To illustrate, try converting the [[Legacy:TournamentPlayer|TournamentPlayer]] (UT) dimensions listed here to the 16 units/foot and 12 units/foot scale and you will find that although the 12 units/foot scale is more reasonable, neither is quite right.

{|

|-
| colspan=&quot;3&quot; |Scale
|TournamentPlayer(UT) height = 78uu
|JCDenton(DX) height = 95uu
|-
|256uu
|128uu
|1uu
|Player height(UT)
|Player height(DX)
|-
|16ft(192in)
|8ft(96in)
|.75in.
|4'11&quot;
|5'11&quot;
|-
|20ft(240in)
|10ft(120in)
|.9375in.
|6'1&quot;
|7'5&quot;
|-
|256in(21.3ft)
|128in(10.67ft)
|1in.
|6'6&quot;
|7'11&quot;
|-
|6in
|3in
|.0234375in
|1.83&quot; (Giant scale map!)
|2.23&quot;
|}

Looking at player heights, 16 units/foot makes sense for DeusEx but not for UT (unless the players are meant to be dwarves!) The 12 units/foot scale gives a reasonable player height for UT and works well if you think in inches (1uu=1in). Using 1uu=.9375in. gives a very similar player height and works well for larger distances where you tend to think in feet(128uu=10ft).

Using UnrealEd for other Unreal games, e.g. DeusEx or UT2003, is a little different, due to the characters being different sizes.  Also, there is a slight distortion between the horizontal and vertical dimensions.  If you were to try to create a replica of a real-world structure, the above conversion would make you a giant horizontally, though your vertical dimensions would seem only a little small.  Therefore you may want to use horizontal measurements:  1 meter = 70 units, vertical measurements: 1 meter = 60 units. 

UUs are not completely arbitrary: there are some things you have to scale to that you can't change. Specifically, light and sound have radii that have a set range, which you can't change. If you don't scale appropriately to the max limits of lightradius and soundradius, you will either lose resolution on those controls (if your world is too small) or be unable to make those things big enough. (if your world is too large).  Also, the engine will not render anything that's more than about 60000 UUs away from the camera (the far clipping plane), and if you make things too small the loss of precision when the engine converts various things from float point to integers becomes significant.

====UT2004 Scale====

UT2004 appears to be using 1 meter = 50 unreal units scale.
* The UT2004's Karma physics engine uses 1 karma unit = 50 unreal units scale internally.
* Player is 88 unreal units high, that's 1.76m, an average [http://en.wikipedia.org/wiki/Human#Physiology_and_genetics human male height].
* Player running speed is 440 unreal units per second, that's 8.8m/s, an average speed of a [http://en.wikipedia.org/wiki/400_metres 400m runner].

===Angle===

Unreal Rotation Units are used to measure angles, to set the direction and rotation of actors for example. 65536 (=2^16) is a full circle. These units are used by [[Legacy:Rotator|rotator]]s, a special UnrealScript variable type. An actor's orientation is given by a rotator in the property Movement -&gt; Rotation.

Not all angles in unreal use these units though:
* Maths functions such as sin() use radians.
* When importing a mesh into the engine with an [[Legacy:Exec Directive|exec directive]], you can specify a rotation for the mesh during import ('# EXEC MESH ORIGIN MESH=Blablabla YAW=..PITCH=..YAW=...) . In this case the rotation unit is a byte: a full circle is 255.

{|

|-
|'''Value'''
|'''Degrees'''
|'''Remarks''' 
|-
| style=&quot;text-align: left&quot; |3640
| style=&quot;text-align: left&quot; |20
|0-19 degrees slope does not slow down players
|-
| style=&quot;text-align: left&quot; |6371
| style=&quot;text-align: left&quot; |35
|20-35 degrees slope slows down players but is climbable
|-
| style=&quot;text-align: left&quot; |8192
| style=&quot;text-align: left&quot; |45
|
|-
| style=&quot;text-align: left&quot; |16384
| style=&quot;text-align: left&quot; |90          
|-
| style=&quot;text-align: left&quot; |24576
| style=&quot;text-align: left&quot; |135          
|-
| style=&quot;text-align: left&quot; |32768
| style=&quot;text-align: left&quot; |180          
|-
| style=&quot;text-align: left&quot; |40960
| style=&quot;text-align: left&quot; |225          
|-
| style=&quot;text-align: left&quot; |49152
| style=&quot;text-align: left&quot; |270          
|-
| style=&quot;text-align: left&quot; |57344
| style=&quot;text-align: left&quot; |315          
|-
| style=&quot;text-align: left&quot; |65536
| style=&quot;text-align: left&quot; |360          
|}

===Conversion Utilities ===

If you want to use a handy unit conversion, you can use a [[Legacy:Scripting_Operators|postoperator]] for this, like so:

&lt;uscript&gt;
const Meter=52.5;

// These can be somewhere fairly global...
static final postoperator float Meters( float Units )
{ return Units * Meter; }

static final postoperator float MPS( float Units )
{ return Units Meters; }

function SetSomething()
{
  SetCollisionSize( 5 Meters, 3 Meters );
  Velocity = Vector( Rotation ) * 5 MPS;
}
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for angle conversion factors.

Two handy javascript unit converters:
* UU_Convert (2002)
** (does anyone have updated links for this? These are dead. -gblues)
** for linear units: [http://home.wanadoo.nl/ariadohq/tutes/uu_convert.html dead link]
** for angular units: [http://home.wanadoo.nl/ariadohq/tutes/ruu_convert.html dead link]
*** Standalone version/utility: [http://home.wanadoo.nl/ariadohq/tutes/uuc.zip dead link] [http://www.outpt.co.uk/files/uuc08.zip]
***  Feature list (warning: pop-ups): http://www.angelfire.com/games3/thealien/util_ut.html
* REAL2UNREAL (2004)
**  for linear and angular units: http://streamlab.info/real2unreal/
*** Standalone version/utility: http://streamlab.info/download/real2unreal-0.3b.zip

==Actor Dimensions ==

Dimensions of players and bots in UT:
* 78 units tall = Collision -&gt; CollisionHeight * 2
* 34 units wide = Collision -&gt; CollisionRadius * 2

Dimensions of players and bots in UT2003:

{|

|-
|
| style=&quot;text-align: center&quot; |'''standing'''
| style=&quot;text-align: center&quot; |'''crouching''' 
|-
|height
| style=&quot;text-align: right&quot; |88 UU
| style=&quot;text-align: right&quot; |58 UU           
|-
|width
| style=&quot;text-align: right&quot; |50 UU
| style=&quot;text-align: right&quot; |50 UU           
|}

This is the size of the [[Legacy:Collision Cylinder|collision cylinder]]: it's this that determines an actor's size for bumping and fitting into spaces. Note that crouching does not change this in the original UT, although some mods have implemented it ([[Legacy:Jailbreak|Jailbreak]]). 

Humans in UT are represented by the class [[Legacy:TournamentPlayer|TournamentPlayer]]. To check other classes without having to add one to a map, right-click in the [[Legacy:Actor Classes|Actor Classes]] browser, open the default properties and look in the [[Legacy:Actor (UT)/Collision|collision properties]]. Remember these give the radius and half the height: in this case, a CollisionHeight of 39 means the actor's cylinder is 78 units tall.

==Movement ==

For the maxmimum and minimum distances players are able to move, see:
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]

==Player Environment==

===Ceilings===
* Absolute minimum: 83 units
* Recommended: 128 units

From experience, it is known that a Player can walk into any room 83 Units or higher (the engine has the Player bobbing up and down), and cannot walk into a room with a height less than 83. It is suggested that rooms be designed a minimum of 128 units in height. 

For best results, the ceiling should always be at least two feet above the player's head, and it looks best when significantly higher. In regular domestic architecture, ceilings under 10 feet high are uncommon.

===Hallways===
* Absolute minimum: 48 units
* Recommended: 

These must be a minimum of 48 units wide, and, this is generally considered too narrow for [[Legacy:Bot Pathing|Bot Pathing]].  PathNodes should be placed at intersections and turns so that there is as much clearance as possible from corners (at least 50 world units if possible).  And PathNodes should be clear to the width of the maximum width (twice the CollisionRadius) of creatures which will use this path.  See also [[Legacy:Bot Support|Bot Support]].

When creating a passage that must be crouched through, the minimum ceiling height is 66 units, the minimum hall width is 52 units, and the maximums are 1 less than the minimum values described above for normal hallways.

===Steps ===
* Maximum: 24 units
* Recommended: 16 units

TournamentPlayers can climb any step that is 24 units or less. Using 16 as default stepheight is a smart thing to do, because stuff will align to the grid better that way.

'''Tarquin:''' has this increased in UT2003? I seem to be able to do 32.

===Jumps ===
* Approx. maximum jump up a step: 64 - 72

It is generally reported that the ability of Players to jump to some maximum height in game varies somewhat. Typically, all Players can jump up to a height of about 64 units, and cannot reach 72 units without JumpBoots. 

'''SuperApe:''' Could the variation be due to the bobbing up and down mentioned in 'Ceilings'?

====Some things that might be handy to know====

Does anyone know these?
* Equivalent minimum distances that Player can maneuver in Low Gravity and Water environments.\
* Normal running speed of a bot or a player (so we don't make a house with a room which takes 15 seconds to cross - i.e., out of proportion)
* Normal silent creeping speed of a player
* Maximum horizontal distance cleared from an impact hammer jump.
* Maximum distance of dodges, sideways, backwards &amp; forwards  
* Maximum distance the translocator can be thrown.

'''SuperApe:''' It appears the maximum vertical distance a translocator can be thrown in normal gravity is 1536 units.  Fancy math should be able to determine horizontal distance with normal gravity and a 45&amp;deg; angle.

'''MarZer:''' Using a small projectile motion program I wrote a whole back, I came up with the following figures (variables used shown):

Velocity 1200 UUs&lt;sup&gt;-1-&lt;/sup&gt;, Angle 45°, Gravity -950UUs&lt;sup&gt;-2-&lt;/sup&gt;

Maximum height 378.947368421053 UU,

Horizontal displacement 1.51578947368421 x10&lt;sup&gt;3&lt;/sup&gt; UU,

Time of flight 0.893187513077744 s  :-)

'''CMan:''' Doing a dodge however will change the distances, much like a double jump would raise the height.  I suppose you could get the velocity modifiers from the Code of xPawn to get the max.

===Slopes===
* A slope less than 20 degrees behaves exactly like a floor (and is actually considered a floor). Players can move on these without obstruction.
* A slope between 20 and 35 degrees is a grade. The player can move up these but he/she slides and must continually struggle to climb to avoid sliding all the way down. 
* A slope over 35 degrees is unclimbable. 

'''KingMango:''' Since when? I hesitate to edit this page but the slope info seems to be way off. I don't slide on any slope 45 degrees or less.

'''SuperApe:''' This section ''could'' be referring to UT99.  I agree that UT2k3 and later seem to be more forgiving on slopes.

==Tips==

Many experienced mappers place a model of a player in a prominent location when designing the level.
* Actor &gt;&gt; Decoration &gt;&gt; Introdude
* Actor &gt;&gt; Pawn &gt;&gt; Bot &gt;&gt; HumanBotPlus &gt;&gt; ''one of the child classes''

Introdude is exactly the same height as the '''TournamentPlayer''' when set at a drawscale (in the Properties window) of 1.075. 
: I've had intermittent problems with an Introdude simply not showing in any view except Wireframe, so I use a bot. Anyone know why this might happen?  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

A good way of checking to see if bots will take an odd path is to try to set a pathnode in the region. Some brushes (128 units high) vertex edited up or down will be ok for a player to run through, but some bots will not take the path. Try setting a pathnode on the slope by right clicking and selecting &quot;Set Pathnode Here (don't duplicate or move a pathnode there). If it appears, you're set. If not, you may want to change your brush.

==Discussion==

'''Niaht:''' I would like to suggest moving the &quot;Scale&quot; section to the top of the document. It seems to be good information to prep for reading the specs on the actors, player environment and other information. It was also one of my first questions when I started working in UnrealEd and I think would be canidate for entry into a kind of Mapping Quick Ref (is there one already?).

'''Tarquin:'''  Done :) Some of the pathnoding stuff under Hallways and Tip should probably be moved to either [[Legacy:Pathnoding|Pathnoding]] or maybe a new page on design considerations for bots. (snappier title needed...)&lt;br /&gt;On the subject of a Mapping Quick Ref: we have [[Legacy:UnrealEd Tips|UnrealEd Tips]] and [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]], but the problem is that any &quot;quick ref&quot; page rapidly bloats up, simply because there is sooooo much to cover. beginners expects them, but I'm starting to think that &quot;quick ref&quot; pages are the documentation equivalent of the beginner coder's &quot;DoIt&quot; procedure... 

'''Kerlin:''' What about double jumps? Lift jumps? Jump distance increases with speed (adrenaline) but does jump height increase as well? If I had the first clue in gathering such metrics, I'd update it myself. '':)''

'''Wormbo:''' The Playtesting Values above are the results gathered using a HUD mutator for the original UT. I'm currently working on a hopefully network compatible version for UT2k3, but don't hold your breath. ;)

----

'''Tarquin:''' This page is getting long. Here's my suggestion for splitting it:
* &quot;Unreal Unit&quot; &amp;ndash; for the top bit
* either this name or &quot;Metrics&quot; for the rest.

'''Wormbo:''' I guess everything above == Player Environment == would be moved to [[Legacy:Unreal Unit|Unreal Unit]] or [[Legacy:UU|UU]] then.

'''Tarquin:''' Yup. I'd forgotten about [[Legacy:UU|UU]].

'''Tarquin:''' Phase 1 of cleanup: stuff has been moved out to:
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]

'''EdgeCrusheR''' i dont know... i think there is something wrong with my AOT ed(its not so different from UTed) so anyway i make a CUBE 160*256*256 and from to TOP view it isnt a square!(looks more like 160*256*380 and the worst part is in AOT i can jump in this cube...

what is wrong with my ED? 

'''Legal:''' I doubt there's anything wrong with your UED, I'd rather suspect you've resized your (red) builder brush. Rightclick on it and in the popup menu click on Transform&gt; Transform Permanently. This resets any rotation and scaling '''the next time you build your brush''' (click the box icon again )

This is unrelated to this page, please delete this when you've read it :) A better place to get answers quick is the [[Legacy:Help Desk|Help Desk]], as more people will look at that page to help.

----

'''CCFreak2K:''' I'm new around here. :| There's mention of the ceiling (83 units high, 128 recommended), but no mention of crawlspace (where the player crawls...) ceilings.  I've never actually seen this done outside of Deus Ex and Perfect Dark, but it might be useful information.  Maybe someone can measure and add this...?

'''DawnTreader:''' i just noticed that there are measurements for 2003, i assume that 2004 is the same? if not can someone post them? and i may be able to post stuff about the double jump and such, have to see if one of my cohorts still has that info.

'''GRAF1K:''' 
* Removed chunk on 3DSMax units that should be on the application's page instead.
* How does one place a player for scale reference in UT200X? I haven't really been into mapping since UT

'''UltraNew-B:'''  There is a handy universal uu conversion calculator here: http://home.tiscali.nl/ariadohq/tutes/uu_convert.html

----

'''BobTheBeheader:'''

I'm a real n00b, so I'm not to sure how a postprocessor is implemented by UnrealEd, although I understand the concept. Could someone please elaborate?

'''Foxpaw:''' What do you mean by a postprocessor in this context?

'''Kirk''' I think he meant the bit about the postoperator. See [[Legacy:Scripting_Operators|Scripting_Operators]].

----

'''Tidalwv:''' Is there information out there on the optimal surface angle for wall jumping (Climbing a surface with a slope &gt; 35 degrees by jumping up against it) or if there is a height at which it becomes ineffective?

----

'''Geist:'''  Hmmm... it seems that UE3 must be using a different scale?  Like maybe 1uu = 0.5 inch?  In a recent interview, Lead Level Designer ''Lee Perry'' had this to say about Marcus Fenix in ''Gears of War'' (http://gearsofwar.com/BehindTheScenes/Interview_Lee_Perry.htm):

; Gamers love Marcus Fenix. If you had to describe Marcus to someone who knows nothing about Gears of War, what would you tell them about Marcus?
: GearPawn_Marcus is 162 Unreal units tall, has a 50 unit wide collision cylinder, requires 96 units of vertical space to be considered “in cover”, has a default health value as well as movement rate of 300, has 50 bones, 2048x2048 texture resolution, and 12,570 polygons. That’s pretty much how I see Marcus.

Now, using UE2 conversions, this would put Marcus at over 10 ft tall!  But at 1uu = 0.5inch, that makes him 6' 9&quot; (including full gear), requires 4' for cover, is 2' 1&quot; wide (collision to the shoulders), and moves at about 8.5mph (could sprint a mile in 7 min, if he could keep up that pace, assuming that's 300uu/s).  Can anyone confirm this change in scale for UE3?

==Related Topics ==
* [[Legacy:Unreal Unit|Unreal Unit]]
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:Unreal World|Unreal World]]
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3309</id>
      <timestamp>2006-08-06T15:23:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is in the process of being cleaned up.

Material has been moved to:
* [[Legacy:Unreal Unit|Unreal Unit]] &amp;ndash; what UUs represent, how to convert them, etc
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]] &amp;ndash; how far players can move, run, jump, etc
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]

==Units &amp; Scale ==

The [[Legacy:Unreal Engine|Unreal engine]] uses two units: 

===Length ===

Unreal Units, or UU. Often simply called &quot;units&quot;, or even not given a name at all (&quot;build a 256x256x64 box&quot;). The UnrealEd [[Legacy:Grid|grid]], dimensions of [[Legacy:Brush|brush]]es, positions of [[Legacy:Actor|actor]]s and sizes of [[Legacy:Collision Cylinder|collision cylinder]]s are all measured in these units. The [[Legacy:Unreal World|Unreal World]] can have a maximum size of 65536 UU (=2^16) in Unreal/UT. UT2003 and U2 have worlds of 524288 UU (=2^19). 

One UU doesn't actually ''mean'' anything in the real world, it's just something within the engine. 

An arbitrary scale is used for game programming because the scale may change. One game may be an FPS, while another may be a space sim with several planets on an entire map. Obviously, because of the constraint on the map size, you cannot have a whole planet on a map scaled to an appropriate size for an FPS. That is why everything works in abstract &quot;units.&quot; 

But each game picks a scale to work at: the size of players and objects, which means there is an effective conversion factor between UU and real physical units. In the Unreal series of games, this is generally held to be roughly:

* 256 UU  = 487.68 cm = 16 feet. 
* 1 meter = 52.5 UU
* 1 foot  = 16 UU
* 1 cm = 0.525 UU
* 1 UU = 0.75 inches

Note that these are approximations. To illustrate, try converting the [[Legacy:TournamentPlayer|TournamentPlayer]] (UT) dimensions listed here to the 16 units/foot and 12 units/foot scale and you will find that although the 12 units/foot scale is more reasonable, neither is quite right.

{|

|-
| colspan=&quot;3&quot; |Scale
|TournamentPlayer(UT) height = 78uu
|JCDenton(DX) height = 95uu
|-
|256uu
|128uu
|1uu
|Player height(UT)
|Player height(DX)
|-
|16ft(192in)
|8ft(96in)
|.75in.
|4'11&quot;
|5'11&quot;
|-
|20ft(240in)
|10ft(120in)
|.9375in.
|6'1&quot;
|7'5&quot;
|-
|256in(21.3ft)
|128in(10.67ft)
|1in.
|6'6&quot;
|7'11&quot;
|-
|6in
|3in
|.0234375in
|1.83&quot; (Giant scale map!)
|2.23&quot;
|}

Looking at player heights, 16 units/foot makes sense for DeusEx but not for UT (unless the players are meant to be dwarves!) The 12 units/foot scale gives a reasonable player height for UT and works well if you think in inches (1uu=1in). Using 1uu=.9375in. gives a very similar player height and works well for larger distances where you tend to think in feet(128uu=10ft).

Using UnrealEd for other Unreal games, e.g. DeusEx or UT2003, is a little different, due to the characters being different sizes.  Also, there is a slight distortion between the horizontal and vertical dimensions.  If you were to try to create a replica of a real-world structure, the above conversion would make you a giant horizontally, though your vertical dimensions would seem only a little small.  Therefore you may want to use horizontal measurements:  1 meter = 70 units, vertical measurements: 1 meter = 60 units. 

UUs are not completely arbitrary: there are some things you have to scale to that you can't change. Specifically, light and sound have radii that have a set range, which you can't change. If you don't scale appropriately to the max limits of lightradius and soundradius, you will either lose resolution on those controls (if your world is too small) or be unable to make those things big enough. (if your world is too large).  Also, the engine will not render anything that's more than about 60000 UUs away from the camera (the far clipping plane), and if you make things too small the loss of precision when the engine converts various things from float point to integers becomes significant.

====UT2004 Scale====

UT2004 appears to be using 1 meter = 50 unreal units scale.
* The UT2004's Karma physics engine uses 1 karma unit = 50 unreal units scale internally.
* Player is 88 unreal units high, that's 1.76m, an average [http://en.wikipedia.org/wiki/Human#Physiology_and_genetics human male height].
* Player running speed is 440 unreal units per second, that's 8.8m/s, an average speed of a [http://en.wikipedia.org/wiki/400_metres 400m runner].

===Angle===

Unreal Rotation Units are used to measure angles, to set the direction and rotation of actors for example. 65536 (=2^16) is a full circle. These units are used by [[Legacy:Rotator|rotator]]s, a special UnrealScript variable type. An actor's orientation is given by a rotator in the property Movement -&gt; Rotation.

Not all angles in unreal use these units though:
* Maths functions such as sin() use radians.
* When importing a mesh into the engine with an [[Legacy:Exec Directive|exec directive]], you can specify a rotation for the mesh during import ('# EXEC MESH ORIGIN MESH=Blablabla YAW=..PITCH=..YAW=...) . In this case the rotation unit is a byte: a full circle is 255.

{|

|-
|'''Value'''
|'''Degrees'''
|'''Remarks''' 
|-
| style=&quot;text-align: left&quot; |3640
| style=&quot;text-align: left&quot; |20
|0-19 degrees slope does not slow down players
|-
| style=&quot;text-align: left&quot; |6371
| style=&quot;text-align: left&quot; |35
|20-35 degrees slope slows down players but is climbable
|-
| style=&quot;text-align: left&quot; |8192
| style=&quot;text-align: left&quot; |45
|
|-
| style=&quot;text-align: left&quot; |16384
| style=&quot;text-align: left&quot; |90          
|-
| style=&quot;text-align: left&quot; |24576
| style=&quot;text-align: left&quot; |135          
|-
| style=&quot;text-align: left&quot; |32768
| style=&quot;text-align: left&quot; |180          
|-
| style=&quot;text-align: left&quot; |40960
| style=&quot;text-align: left&quot; |225          
|-
| style=&quot;text-align: left&quot; |49152
| style=&quot;text-align: left&quot; |270          
|-
| style=&quot;text-align: left&quot; |57344
| style=&quot;text-align: left&quot; |315          
|-
| style=&quot;text-align: left&quot; |65536
| style=&quot;text-align: left&quot; |360          
|}

===Conversion Utilities ===

If you want to use a handy unit conversion, you can use a [[Legacy:Scripting_Operators|postoperator]] for this, like so:

&lt;uscript&gt;
const Meter=52.5;

// These can be somewhere fairly global...
static final postoperator float Meters( float Units )
{ return Units * Meter; }

static final postoperator float MPS( float Units )
{ return Units Meters; }

function SetSomething()
{
  SetCollisionSize( 5 Meters, 3 Meters );
  Velocity = Vector( Rotation ) * 5 MPS;
}
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for angle conversion factors.

Two handy javascript unit converters:
* UU_Convert (2002)
** (does anyone have updated links for this? These are dead. -gblues)
** for linear units: [http://home.wanadoo.nl/ariadohq/tutes/uu_convert.html dead link]
** for angular units: [http://home.wanadoo.nl/ariadohq/tutes/ruu_convert.html dead link]
*** Standalone version/utility: [http://home.wanadoo.nl/ariadohq/tutes/uuc.zip dead link] [http://www.outpt.co.uk/files/uuc.zip]
***  Feature list (warning: pop-ups): http://www.angelfire.com/games3/thealien/util_ut.html
* REAL2UNREAL (2004)
**  for linear and angular units: http://streamlab.info/real2unreal/
*** Standalone version/utility: http://streamlab.info/download/real2unreal-0.3b.zip

==Actor Dimensions ==

Dimensions of players and bots in UT:
* 78 units tall = Collision -&gt; CollisionHeight * 2
* 34 units wide = Collision -&gt; CollisionRadius * 2

Dimensions of players and bots in UT2003:

{|

|-
|
| style=&quot;text-align: center&quot; |'''standing'''
| style=&quot;text-align: center&quot; |'''crouching''' 
|-
|height
| style=&quot;text-align: right&quot; |88 UU
| style=&quot;text-align: right&quot; |58 UU           
|-
|width
| style=&quot;text-align: right&quot; |50 UU
| style=&quot;text-align: right&quot; |50 UU           
|}

This is the size of the [[Legacy:Collision Cylinder|collision cylinder]]: it's this that determines an actor's size for bumping and fitting into spaces. Note that crouching does not change this in the original UT, although some mods have implemented it ([[Legacy:Jailbreak|Jailbreak]]). 

Humans in UT are represented by the class [[Legacy:TournamentPlayer|TournamentPlayer]]. To check other classes without having to add one to a map, right-click in the [[Legacy:Actor Classes|Actor Classes]] browser, open the default properties and look in the [[Legacy:Actor (UT)/Collision|collision properties]]. Remember these give the radius and half the height: in this case, a CollisionHeight of 39 means the actor's cylinder is 78 units tall.

==Movement ==

For the maxmimum and minimum distances players are able to move, see:
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]

==Player Environment==

===Ceilings===
* Absolute minimum: 83 units
* Recommended: 128 units

From experience, it is known that a Player can walk into any room 83 Units or higher (the engine has the Player bobbing up and down), and cannot walk into a room with a height less than 83. It is suggested that rooms be designed a minimum of 128 units in height. 

For best results, the ceiling should always be at least two feet above the player's head, and it looks best when significantly higher. In regular domestic architecture, ceilings under 10 feet high are uncommon.

===Hallways===
* Absolute minimum: 48 units
* Recommended: 

These must be a minimum of 48 units wide, and, this is generally considered too narrow for [[Legacy:Bot Pathing|Bot Pathing]].  PathNodes should be placed at intersections and turns so that there is as much clearance as possible from corners (at least 50 world units if possible).  And PathNodes should be clear to the width of the maximum width (twice the CollisionRadius) of creatures which will use this path.  See also [[Legacy:Bot Support|Bot Support]].

When creating a passage that must be crouched through, the minimum ceiling height is 66 units, the minimum hall width is 52 units, and the maximums are 1 less than the minimum values described above for normal hallways.

===Steps ===
* Maximum: 24 units
* Recommended: 16 units

TournamentPlayers can climb any step that is 24 units or less. Using 16 as default stepheight is a smart thing to do, because stuff will align to the grid better that way.

'''Tarquin:''' has this increased in UT2003? I seem to be able to do 32.

===Jumps ===
* Approx. maximum jump up a step: 64 - 72

It is generally reported that the ability of Players to jump to some maximum height in game varies somewhat. Typically, all Players can jump up to a height of about 64 units, and cannot reach 72 units without JumpBoots. 

'''SuperApe:''' Could the variation be due to the bobbing up and down mentioned in 'Ceilings'?

====Some things that might be handy to know====

Does anyone know these?
* Equivalent minimum distances that Player can maneuver in Low Gravity and Water environments.\
* Normal running speed of a bot or a player (so we don't make a house with a room which takes 15 seconds to cross - i.e., out of proportion)
* Normal silent creeping speed of a player
* Maximum horizontal distance cleared from an impact hammer jump.
* Maximum distance of dodges, sideways, backwards &amp; forwards  
* Maximum distance the translocator can be thrown.

'''SuperApe:''' It appears the maximum vertical distance a translocator can be thrown in normal gravity is 1536 units.  Fancy math should be able to determine horizontal distance with normal gravity and a 45&amp;deg; angle.

'''MarZer:''' Using a small projectile motion program I wrote a whole back, I came up with the following figures (variables used shown):

Velocity 1200 UUs&lt;sup&gt;-1-&lt;/sup&gt;, Angle 45°, Gravity -950UUs&lt;sup&gt;-2-&lt;/sup&gt;

Maximum height 378.947368421053 UU,

Horizontal displacement 1.51578947368421 x10&lt;sup&gt;3&lt;/sup&gt; UU,

Time of flight 0.893187513077744 s  :-)

'''CMan:''' Doing a dodge however will change the distances, much like a double jump would raise the height.  I suppose you could get the velocity modifiers from the Code of xPawn to get the max.

===Slopes===
* A slope less than 20 degrees behaves exactly like a floor (and is actually considered a floor). Players can move on these without obstruction.
* A slope between 20 and 35 degrees is a grade. The player can move up these but he/she slides and must continually struggle to climb to avoid sliding all the way down. 
* A slope over 35 degrees is unclimbable. 

'''KingMango:''' Since when? I hesitate to edit this page but the slope info seems to be way off. I don't slide on any slope 45 degrees or less.

'''SuperApe:''' This section ''could'' be referring to UT99.  I agree that UT2k3 and later seem to be more forgiving on slopes.

==Tips==

Many experienced mappers place a model of a player in a prominent location when designing the level.
* Actor &gt;&gt; Decoration &gt;&gt; Introdude
* Actor &gt;&gt; Pawn &gt;&gt; Bot &gt;&gt; HumanBotPlus &gt;&gt; ''one of the child classes''

Introdude is exactly the same height as the '''TournamentPlayer''' when set at a drawscale (in the Properties window) of 1.075. 
: I've had intermittent problems with an Introdude simply not showing in any view except Wireframe, so I use a bot. Anyone know why this might happen?  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

A good way of checking to see if bots will take an odd path is to try to set a pathnode in the region. Some brushes (128 units high) vertex edited up or down will be ok for a player to run through, but some bots will not take the path. Try setting a pathnode on the slope by right clicking and selecting &quot;Set Pathnode Here (don't duplicate or move a pathnode there). If it appears, you're set. If not, you may want to change your brush.

==Discussion==

'''Niaht:''' I would like to suggest moving the &quot;Scale&quot; section to the top of the document. It seems to be good information to prep for reading the specs on the actors, player environment and other information. It was also one of my first questions when I started working in UnrealEd and I think would be canidate for entry into a kind of Mapping Quick Ref (is there one already?).

'''Tarquin:'''  Done :) Some of the pathnoding stuff under Hallways and Tip should probably be moved to either [[Legacy:Pathnoding|Pathnoding]] or maybe a new page on design considerations for bots. (snappier title needed...)&lt;br /&gt;On the subject of a Mapping Quick Ref: we have [[Legacy:UnrealEd Tips|UnrealEd Tips]] and [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]], but the problem is that any &quot;quick ref&quot; page rapidly bloats up, simply because there is sooooo much to cover. beginners expects them, but I'm starting to think that &quot;quick ref&quot; pages are the documentation equivalent of the beginner coder's &quot;DoIt&quot; procedure... 

'''Kerlin:''' What about double jumps? Lift jumps? Jump distance increases with speed (adrenaline) but does jump height increase as well? If I had the first clue in gathering such metrics, I'd update it myself. '':)''

'''Wormbo:''' The Playtesting Values above are the results gathered using a HUD mutator for the original UT. I'm currently working on a hopefully network compatible version for UT2k3, but don't hold your breath. ;)

----

'''Tarquin:''' This page is getting long. Here's my suggestion for splitting it:
* &quot;Unreal Unit&quot; &amp;ndash; for the top bit
* either this name or &quot;Metrics&quot; for the rest.

'''Wormbo:''' I guess everything above == Player Environment == would be moved to [[Legacy:Unreal Unit|Unreal Unit]] or [[Legacy:UU|UU]] then.

'''Tarquin:''' Yup. I'd forgotten about [[Legacy:UU|UU]].

'''Tarquin:''' Phase 1 of cleanup: stuff has been moved out to:
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]

'''EdgeCrusheR''' i dont know... i think there is something wrong with my AOT ed(its not so different from UTed) so anyway i make a CUBE 160*256*256 and from to TOP view it isnt a square!(looks more like 160*256*380 and the worst part is in AOT i can jump in this cube...

what is wrong with my ED? 

'''Legal:''' I doubt there's anything wrong with your UED, I'd rather suspect you've resized your (red) builder brush. Rightclick on it and in the popup menu click on Transform&gt; Transform Permanently. This resets any rotation and scaling '''the next time you build your brush''' (click the box icon again )

This is unrelated to this page, please delete this when you've read it :) A better place to get answers quick is the [[Legacy:Help Desk|Help Desk]], as more people will look at that page to help.

----

'''CCFreak2K:''' I'm new around here. :| There's mention of the ceiling (83 units high, 128 recommended), but no mention of crawlspace (where the player crawls...) ceilings.  I've never actually seen this done outside of Deus Ex and Perfect Dark, but it might be useful information.  Maybe someone can measure and add this...?

'''DawnTreader:''' i just noticed that there are measurements for 2003, i assume that 2004 is the same? if not can someone post them? and i may be able to post stuff about the double jump and such, have to see if one of my cohorts still has that info.

'''GRAF1K:''' 
* Removed chunk on 3DSMax units that should be on the application's page instead.
* How does one place a player for scale reference in UT200X? I haven't really been into mapping since UT

'''UltraNew-B:'''  There is a handy universal uu conversion calculator here: http://home.tiscali.nl/ariadohq/tutes/uu_convert.html

----

'''BobTheBeheader:'''

I'm a real n00b, so I'm not to sure how a postprocessor is implemented by UnrealEd, although I understand the concept. Could someone please elaborate?

'''Foxpaw:''' What do you mean by a postprocessor in this context?

'''Kirk''' I think he meant the bit about the postoperator. See [[Legacy:Scripting_Operators|Scripting_Operators]].

----

'''Tidalwv:''' Is there information out there on the optimal surface angle for wall jumping (Climbing a surface with a slope &gt; 35 degrees by jumping up against it) or if there is a height at which it becomes ineffective?

==Related Topics ==
* [[Legacy:Unreal Unit|Unreal Unit]]
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:Unreal World|Unreal World]]
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3310</id>
      <timestamp>2007-04-17T15:57:36Z</timestamp>
      <contributor>
        <ip>Geist</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is in the process of being cleaned up.

Material has been moved to:
* [[Legacy:Unreal Unit|Unreal Unit]] &amp;ndash; what UUs represent, how to convert them, etc
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]] &amp;ndash; how far players can move, run, jump, etc
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]

==Units &amp; Scale ==

The [[Legacy:Unreal Engine|Unreal engine]] uses two units: 

===Length ===

Unreal Units, or UU. Often simply called &quot;units&quot;, or even not given a name at all (&quot;build a 256x256x64 box&quot;). The UnrealEd [[Legacy:Grid|grid]], dimensions of [[Legacy:Brush|brush]]es, positions of [[Legacy:Actor|actor]]s and sizes of [[Legacy:Collision Cylinder|collision cylinder]]s are all measured in these units. The [[Legacy:Unreal World|Unreal World]] can have a maximum size of 65536 UU (=2^16) in Unreal/UT. UT2003 and U2 have worlds of 524288 UU (=2^19). 

One UU doesn't actually ''mean'' anything in the real world, it's just something within the engine. 

An arbitrary scale is used for game programming because the scale may change. One game may be an FPS, while another may be a space sim with several planets on an entire map. Obviously, because of the constraint on the map size, you cannot have a whole planet on a map scaled to an appropriate size for an FPS. That is why everything works in abstract &quot;units.&quot; 

But each game picks a scale to work at: the size of players and objects, which means there is an effective conversion factor between UU and real physical units. In the Unreal series of games, this is generally held to be roughly:

* 256 UU  = 487.68 cm = 16 feet. 
* 1 meter = 52.5 UU
* 1 foot  = 16 UU
* 1 cm = 0.525 UU
* 1 UU = 0.75 inches

Note that these are approximations. To illustrate, try converting the [[Legacy:TournamentPlayer|TournamentPlayer]] (UT) dimensions listed here to the 16 units/foot and 12 units/foot scale and you will find that although the 12 units/foot scale is more reasonable, neither is quite right.

{|

|-
| colspan=&quot;3&quot; |Scale
|TournamentPlayer(UT) height = 78uu
|JCDenton(DX) height = 95uu
|-
|256uu
|128uu
|1uu
|Player height(UT)
|Player height(DX)
|-
|16ft(192in)
|8ft(96in)
|.75in.
|4'11&quot;
|5'11&quot;
|-
|20ft(240in)
|10ft(120in)
|.9375in.
|6'1&quot;
|7'5&quot;
|-
|256in(21.3ft)
|128in(10.67ft)
|1in.
|6'6&quot;
|7'11&quot;
|-
|6in
|3in
|.0234375in
|1.83&quot; (Giant scale map!)
|2.23&quot;
|}

Looking at player heights, 16 units/foot makes sense for DeusEx but not for UT (unless the players are meant to be dwarves!) The 12 units/foot scale gives a reasonable player height for UT and works well if you think in inches (1uu=1in). Using 1uu=.9375in. gives a very similar player height and works well for larger distances where you tend to think in feet(128uu=10ft).

Using UnrealEd for other Unreal games, e.g. DeusEx or UT2003, is a little different, due to the characters being different sizes.  Also, there is a slight distortion between the horizontal and vertical dimensions.  If you were to try to create a replica of a real-world structure, the above conversion would make you a giant horizontally, though your vertical dimensions would seem only a little small.  Therefore you may want to use horizontal measurements:  1 meter = 70 units, vertical measurements: 1 meter = 60 units. 

UUs are not completely arbitrary: there are some things you have to scale to that you can't change. Specifically, light and sound have radii that have a set range, which you can't change. If you don't scale appropriately to the max limits of lightradius and soundradius, you will either lose resolution on those controls (if your world is too small) or be unable to make those things big enough. (if your world is too large).  Also, the engine will not render anything that's more than about 60000 UUs away from the camera (the far clipping plane), and if you make things too small the loss of precision when the engine converts various things from float point to integers becomes significant.

====UT2004 Scale====

UT2004 appears to be using 1 meter = 50 unreal units scale.
* The UT2004's Karma physics engine uses 1 karma unit = 50 unreal units scale internally.
* Player is 88 unreal units high, that's 1.76m, an average [http://en.wikipedia.org/wiki/Human#Physiology_and_genetics human male height].
* Player running speed is 440 unreal units per second, that's 8.8m/s, an average speed of a [http://en.wikipedia.org/wiki/400_metres 400m runner].

===Angle===

Unreal Rotation Units are used to measure angles, to set the direction and rotation of actors for example. 65536 (=2^16) is a full circle. These units are used by [[Legacy:Rotator|rotator]]s, a special UnrealScript variable type. An actor's orientation is given by a rotator in the property Movement -&gt; Rotation.

Not all angles in unreal use these units though:
* Maths functions such as sin() use radians.
* When importing a mesh into the engine with an [[Legacy:Exec Directive|exec directive]], you can specify a rotation for the mesh during import ('# EXEC MESH ORIGIN MESH=Blablabla YAW=..PITCH=..YAW=...) . In this case the rotation unit is a byte: a full circle is 255.

{|

|-
|'''Value'''
|'''Degrees'''
|'''Remarks''' 
|-
| style=&quot;text-align: left&quot; |3640
| style=&quot;text-align: left&quot; |20
|0-19 degrees slope does not slow down players
|-
| style=&quot;text-align: left&quot; |6371
| style=&quot;text-align: left&quot; |35
|20-35 degrees slope slows down players but is climbable
|-
| style=&quot;text-align: left&quot; |8192
| style=&quot;text-align: left&quot; |45
|
|-
| style=&quot;text-align: left&quot; |16384
| style=&quot;text-align: left&quot; |90          
|-
| style=&quot;text-align: left&quot; |24576
| style=&quot;text-align: left&quot; |135          
|-
| style=&quot;text-align: left&quot; |32768
| style=&quot;text-align: left&quot; |180          
|-
| style=&quot;text-align: left&quot; |40960
| style=&quot;text-align: left&quot; |225          
|-
| style=&quot;text-align: left&quot; |49152
| style=&quot;text-align: left&quot; |270          
|-
| style=&quot;text-align: left&quot; |57344
| style=&quot;text-align: left&quot; |315          
|-
| style=&quot;text-align: left&quot; |65536
| style=&quot;text-align: left&quot; |360          
|}

===Conversion Utilities ===

If you want to use a handy unit conversion, you can use a [[Legacy:Scripting_Operators|postoperator]] for this, like so:

&lt;uscript&gt;
const Meter=52.5;

// These can be somewhere fairly global...
static final postoperator float Meters( float Units )
{ return Units * Meter; }

static final postoperator float MPS( float Units )
{ return Units Meters; }

function SetSomething()
{
  SetCollisionSize( 5 Meters, 3 Meters );
  Velocity = Vector( Rotation ) * 5 MPS;
}
&lt;/uscript&gt;

See [[Legacy:Useful Maths Functions|Useful Maths Functions]] for angle conversion factors.

Two handy javascript unit converters:
* UU_Convert (2002)
** (does anyone have updated links for this? These are dead. -gblues)
** for linear units: [http://home.wanadoo.nl/ariadohq/tutes/uu_convert.html dead link]
** for angular units: [http://home.wanadoo.nl/ariadohq/tutes/ruu_convert.html dead link]
*** Standalone version/utility: [http://home.wanadoo.nl/ariadohq/tutes/uuc.zip dead link] [http://www.outpt.co.uk/files/uuc.zip]
***  Feature list (warning: pop-ups): http://www.angelfire.com/games3/thealien/util_ut.html
* REAL2UNREAL (2004)
**  for linear and angular units: http://streamlab.info/real2unreal/
*** Standalone version/utility: http://streamlab.info/download/real2unreal-0.3b.zip

==Actor Dimensions ==

Dimensions of players and bots in UT:
* 78 units tall = Collision -&gt; CollisionHeight * 2
* 34 units wide = Collision -&gt; CollisionRadius * 2

Dimensions of players and bots in UT2003:

{|

|-
|
| style=&quot;text-align: center&quot; |'''standing'''
| style=&quot;text-align: center&quot; |'''crouching''' 
|-
|height
| style=&quot;text-align: right&quot; |88 UU
| style=&quot;text-align: right&quot; |58 UU           
|-
|width
| style=&quot;text-align: right&quot; |50 UU
| style=&quot;text-align: right&quot; |50 UU           
|}

This is the size of the [[Legacy:Collision Cylinder|collision cylinder]]: it's this that determines an actor's size for bumping and fitting into spaces. Note that crouching does not change this in the original UT, although some mods have implemented it ([[Legacy:Jailbreak|Jailbreak]]). 

Humans in UT are represented by the class [[Legacy:TournamentPlayer|TournamentPlayer]]. To check other classes without having to add one to a map, right-click in the [[Legacy:Actor Classes|Actor Classes]] browser, open the default properties and look in the [[Legacy:Actor (UT)/Collision|collision properties]]. Remember these give the radius and half the height: in this case, a CollisionHeight of 39 means the actor's cylinder is 78 units tall.

==Movement ==

For the maxmimum and minimum distances players are able to move, see:
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]

==Player Environment==

===Ceilings===
* Absolute minimum: 83 units
* Recommended: 128 units

From experience, it is known that a Player can walk into any room 83 Units or higher (the engine has the Player bobbing up and down), and cannot walk into a room with a height less than 83. It is suggested that rooms be designed a minimum of 128 units in height. 

For best results, the ceiling should always be at least two feet above the player's head, and it looks best when significantly higher. In regular domestic architecture, ceilings under 10 feet high are uncommon.

===Hallways===
* Absolute minimum: 48 units
* Recommended: 

These must be a minimum of 48 units wide, and, this is generally considered too narrow for [[Legacy:Bot Pathing|Bot Pathing]].  PathNodes should be placed at intersections and turns so that there is as much clearance as possible from corners (at least 50 world units if possible).  And PathNodes should be clear to the width of the maximum width (twice the CollisionRadius) of creatures which will use this path.  See also [[Legacy:Bot Support|Bot Support]].

When creating a passage that must be crouched through, the minimum ceiling height is 66 units, the minimum hall width is 52 units, and the maximums are 1 less than the minimum values described above for normal hallways.

===Steps ===
* Maximum: 24 units
* Recommended: 16 units

TournamentPlayers can climb any step that is 24 units or less. Using 16 as default stepheight is a smart thing to do, because stuff will align to the grid better that way.

'''Tarquin:''' has this increased in UT2003? I seem to be able to do 32.

===Jumps ===
* Approx. maximum jump up a step: 64 - 72

It is generally reported that the ability of Players to jump to some maximum height in game varies somewhat. Typically, all Players can jump up to a height of about 64 units, and cannot reach 72 units without JumpBoots. 

'''SuperApe:''' Could the variation be due to the bobbing up and down mentioned in 'Ceilings'?

====Some things that might be handy to know====

Does anyone know these?
* Equivalent minimum distances that Player can maneuver in Low Gravity and Water environments.\
* Normal running speed of a bot or a player (so we don't make a house with a room which takes 15 seconds to cross - i.e., out of proportion)
* Normal silent creeping speed of a player
* Maximum horizontal distance cleared from an impact hammer jump.
* Maximum distance of dodges, sideways, backwards &amp; forwards  
* Maximum distance the translocator can be thrown.

'''SuperApe:''' It appears the maximum vertical distance a translocator can be thrown in normal gravity is 1536 units.  Fancy math should be able to determine horizontal distance with normal gravity and a 45&amp;deg; angle.

'''MarZer:''' Using a small projectile motion program I wrote a whole back, I came up with the following figures (variables used shown):

Velocity 1200 UUs&lt;sup&gt;-1-&lt;/sup&gt;, Angle 45°, Gravity -950UUs&lt;sup&gt;-2-&lt;/sup&gt;

Maximum height 378.947368421053 UU,

Horizontal displacement 1.51578947368421 x10&lt;sup&gt;3&lt;/sup&gt; UU,

Time of flight 0.893187513077744 s  :-)

'''CMan:''' Doing a dodge however will change the distances, much like a double jump would raise the height.  I suppose you could get the velocity modifiers from the Code of xPawn to get the max.

===Slopes===
* A slope less than 20 degrees behaves exactly like a floor (and is actually considered a floor). Players can move on these without obstruction.
* A slope between 20 and 35 degrees is a grade. The player can move up these but he/she slides and must continually struggle to climb to avoid sliding all the way down. 
* A slope over 35 degrees is unclimbable. 

'''KingMango:''' Since when? I hesitate to edit this page but the slope info seems to be way off. I don't slide on any slope 45 degrees or less.

'''SuperApe:''' This section ''could'' be referring to UT99.  I agree that UT2k3 and later seem to be more forgiving on slopes.

==Tips==

Many experienced mappers place a model of a player in a prominent location when designing the level.
* Actor &gt;&gt; Decoration &gt;&gt; Introdude
* Actor &gt;&gt; Pawn &gt;&gt; Bot &gt;&gt; HumanBotPlus &gt;&gt; ''one of the child classes''

Introdude is exactly the same height as the '''TournamentPlayer''' when set at a drawscale (in the Properties window) of 1.075. 
: I've had intermittent problems with an Introdude simply not showing in any view except Wireframe, so I use a bot. Anyone know why this might happen?  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

A good way of checking to see if bots will take an odd path is to try to set a pathnode in the region. Some brushes (128 units high) vertex edited up or down will be ok for a player to run through, but some bots will not take the path. Try setting a pathnode on the slope by right clicking and selecting &quot;Set Pathnode Here (don't duplicate or move a pathnode there). If it appears, you're set. If not, you may want to change your brush.

==Discussion==

'''Niaht:''' I would like to suggest moving the &quot;Scale&quot; section to the top of the document. It seems to be good information to prep for reading the specs on the actors, player environment and other information. It was also one of my first questions when I started working in UnrealEd and I think would be canidate for entry into a kind of Mapping Quick Ref (is there one already?).

'''Tarquin:'''  Done :) Some of the pathnoding stuff under Hallways and Tip should probably be moved to either [[Legacy:Pathnoding|Pathnoding]] or maybe a new page on design considerations for bots. (snappier title needed...)&lt;br /&gt;On the subject of a Mapping Quick Ref: we have [[Legacy:UnrealEd Tips|UnrealEd Tips]] and [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]], but the problem is that any &quot;quick ref&quot; page rapidly bloats up, simply because there is sooooo much to cover. beginners expects them, but I'm starting to think that &quot;quick ref&quot; pages are the documentation equivalent of the beginner coder's &quot;DoIt&quot; procedure... 

'''Kerlin:''' What about double jumps? Lift jumps? Jump distance increases with speed (adrenaline) but does jump height increase as well? If I had the first clue in gathering such metrics, I'd update it myself. '':)''

'''Wormbo:''' The Playtesting Values above are the results gathered using a HUD mutator for the original UT. I'm currently working on a hopefully network compatible version for UT2k3, but don't hold your breath. ;)

----

'''Tarquin:''' This page is getting long. Here's my suggestion for splitting it:
* &quot;Unreal Unit&quot; &amp;ndash; for the top bit
* either this name or &quot;Metrics&quot; for the rest.

'''Wormbo:''' I guess everything above == Player Environment == would be moved to [[Legacy:Unreal Unit|Unreal Unit]] or [[Legacy:UU|UU]] then.

'''Tarquin:''' Yup. I'd forgotten about [[Legacy:UU|UU]].

'''Tarquin:''' Phase 1 of cleanup: stuff has been moved out to:
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]

'''EdgeCrusheR''' i dont know... i think there is something wrong with my AOT ed(its not so different from UTed) so anyway i make a CUBE 160*256*256 and from to TOP view it isnt a square!(looks more like 160*256*380 and the worst part is in AOT i can jump in this cube...

what is wrong with my ED? 

'''Legal:''' I doubt there's anything wrong with your UED, I'd rather suspect you've resized your (red) builder brush. Rightclick on it and in the popup menu click on Transform&gt; Transform Permanently. This resets any rotation and scaling '''the next time you build your brush''' (click the box icon again )

This is unrelated to this page, please delete this when you've read it :) A better place to get answers quick is the [[Legacy:Help Desk|Help Desk]], as more people will look at that page to help.

----

'''CCFreak2K:''' I'm new around here. :| There's mention of the ceiling (83 units high, 128 recommended), but no mention of crawlspace (where the player crawls...) ceilings.  I've never actually seen this done outside of Deus Ex and Perfect Dark, but it might be useful information.  Maybe someone can measure and add this...?

'''DawnTreader:''' i just noticed that there are measurements for 2003, i assume that 2004 is the same? if not can someone post them? and i may be able to post stuff about the double jump and such, have to see if one of my cohorts still has that info.

'''GRAF1K:''' 
* Removed chunk on 3DSMax units that should be on the application's page instead.
* How does one place a player for scale reference in UT200X? I haven't really been into mapping since UT

'''UltraNew-B:'''  There is a handy universal uu conversion calculator here: http://home.tiscali.nl/ariadohq/tutes/uu_convert.html

----

'''BobTheBeheader:'''

I'm a real n00b, so I'm not to sure how a postprocessor is implemented by UnrealEd, although I understand the concept. Could someone please elaborate?

'''Foxpaw:''' What do you mean by a postprocessor in this context?

'''Kirk''' I think he meant the bit about the postoperator. See [[Legacy:Scripting_Operators|Scripting_Operators]].

----

'''Tidalwv:''' Is there information out there on the optimal surface angle for wall jumping (Climbing a surface with a slope &gt; 35 degrees by jumping up against it) or if there is a height at which it becomes ineffective?

----

'''Geist:'''  Hmmm... it seems that UE3 must be using a different scale?  Like maybe 1uu = 0.5 inch?  In a recent interview, Lead Level Designer ''Lee Perry'' had this to say about Marcus Fenix in ''Gears of War'' (http://gearsofwar.com/BehindTheScenes/Interview_Lee_Perry.htm):

; Gamers love Marcus Fenix. If you had to describe Marcus to someone who knows nothing about Gears of War, what would you tell them about Marcus?
: GearPawn_Marcus is 162 Unreal units tall, has a 50 unit wide collision cylinder, requires 96 units of vertical space to be considered “in cover”, has a default health value as well as movement rate of 300, has 50 bones, 2048x2048 texture resolution, and 12,570 polygons. That’s pretty much how I see Marcus.

Now, using UE2 conversions, this would put Marcus at over 10 ft tall!  But at 1uu = 0.5inch, that makes him 6' 9&quot; (including full gear), requires 4' for cover, is 2' 1&quot; wide (collision to the shoulders), and moves at about 8.5mph (could sprint a mile in 7 min, if he could keep up that pace, assuming that's 300uu/s).  Can anyone confirm this change in scale for UE3?

==Related Topics ==
* [[Legacy:Unreal Unit|Unreal Unit]]
* [[Legacy:Movement Metrics (UT)|Movement metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:Unreal World|Unreal World]]
* [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of a bot path network

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:General Unreal Timeline</title>
    <id>1360</id>
    <revision>
      <id>3453</id>
      <timestamp>2008-02-06T21:07:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>should go to Liandri Archives</comment>
      <text xml:space="preserve">===Unreal Universe Timeline===

Here follows a history leading up to the present time:
* '''2215''' New Earth Government formed to battle Skaarj Empire.
* '''2216''' The famous '7 days Siege' of earth, who ended in a victory over the Skaarj empire.
* '''2241''' &quot;Strider Wars&quot; won by sacrificing a planet. (Unreal2)
* '''2251'''  The 'Cloning tank' used in the Tournament gets invented. (Unreal2, i think. Just dont remember that scene to well, you know, where the Marshal get to train fighting in the tutorial. Please fill it out someone who remember the details)
* '''2267''' In the Green's World Rebellion, three thousand miners revolt against harsh working conditions.
* '''2283''' The infamous AI uprising on LBX-7683. (UT2004)
* '''2291''' 'Consensual murder' legalized, and the Liandri corporation start to broadcast the 'Tournament'. (UT)
* '''2293''' Malcolm, a human, becomes Champion in the 'Tournament'. (UT)
* '''2302''' Gorge, another human, becomes Champion of the 'Tournament'. (UT2003)
* '''2303''' Xan Kriegor returns to the 'Tournament', winner still not declared.

(But something tells me it going to be Jakob)

==Discussion==

'''Unknown: (author?)''' Mostly taken from [http://www.unrealtournament.com/ www.UnrealTournament.com]

'''Tarquin:''' when you say &quot;taken&quot;, do you mean &quot;copied&quot;, or &quot;using informating from&quot;?

'''Legal:''' I can't speak for anyone, but here's the source I guess: http://www.unrealtournament.com/general/timeline.php

Looks like copied to me.

'''empty_other:''' Sorry people, its clean copied for the moment, im going to work and extend it, detailing it a bit, was my plan. Its too focused on UT2003/2004 view. Just looking trough Unreal, UT99 and UT2004 for more details right now...

'''empty_other:''' That was really what i had in mind, as theyrs timeline was way to focused on UT2004, and not the general story... Cant get much from ut99 and unreal though, as it seem that my computer rejects the Unreal engine suddenly.

'''Raikoh:''' The &quot;Cloning Tank&quot; in Unreal 2 wasn't a cloning tank, it was a holographic simulator. Think of the combat tutorial in Unreal 2 as being similar to laser tag, only instead of fake guns, fake people.

'''Wormbo:''' I don't think the UnrealWiki is the place for in-game history lessons. Stuff like this belongs on BeyondUnreal's [http://liandri.beyondunreal.com/ Liandri Archives] wiki.

----

[[:Category:Legacy To Do]] &amp;ndash; Link up or delete.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3454</id>
      <timestamp>2008-02-06T20:14:33Z</timestamp>
      <contributor>
        <ip>Ppp-67-37-36-71.dialup.dytnoh.ameritech.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Unreal Universe Timeline===

Here follows a history leading up to the present time:
* '''2215''' New Earth Government formed to battle Skaarj Empire.
* '''2216''' The famous '7 days Siege' of earth, who ended in a victory over the Skaarj empire.
* '''2241''' &quot;Strider Wars&quot; won by sacrificing a planet. (Unreal2)
* '''2251'''  The 'Cloning tank' used in the Tournament gets invented. (Unreal2, i think. Just dont remember that scene to well, you know, where the Marshal get to train fighting in the tutorial. Please fill it out someone who remember the details)
* '''2267''' In the Green's World Rebellion, three thousand miners revolt against harsh working conditions.
* '''2283''' The infamous AI uprising on LBX-7683. (UT2004)
* '''2291''' 'Consensual murder' legalized, and the Liandri corporation start to broadcast the 'Tournament'. (UT)
* '''2293''' Malcolm, a human, becomes Champion in the 'Tournament'. (UT)
* '''2302''' Gorge, another human, becomes Champion of the 'Tournament'. (UT2003)
* '''2303''' Xan Kriegor returns to the 'Tournament', winner still not declared.

(But something tells me it going to be Jakob)

==Discussion==

'''Unknown: (author?)''' Mostly taken from [http://www.unrealtournament.com/ www.UnrealTournament.com]

'''Tarquin:''' when you say &quot;taken&quot;, do you mean &quot;copied&quot;, or &quot;using informating from&quot;?

'''Legal:''' I can't speak for anyone, but here's the source I guess: http://www.unrealtournament.com/general/timeline.php

Looks like copied to me.

'''empty_other:''' Sorry people, its clean copied for the moment, im going to work and extend it, detailing it a bit, was my plan. Its too focused on UT2003/2004 view. Just looking trough Unreal, UT99 and UT2004 for more details right now...

'''empty_other:''' That was really what i had in mind, as theyrs timeline was way to focused on UT2004, and not the general story... Cant get much from ut99 and unreal though, as it seem that my computer rejects the Unreal engine suddenly.

'''Raikoh:''' The &quot;Cloning Tank&quot; in Unreal 2 wasn't a cloning tank, it was a holographic simulator. Think of the combat tutorial in Unreal 2 as being similar to laser tag, only instead of fake guns, fake people.

----

[[:Category:Legacy To Do]] &amp;ndash; Link up or delete.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10696</id>
      <timestamp>2008-04-01T17:43:01Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <text xml:space="preserve">{{delete}}
===Unreal Universe Timeline===

Here follows a history leading up to the present time:
* '''2215''' New Earth Government formed to battle Skaarj Empire.
* '''2216''' The famous '7 days Siege' of earth, who ended in a victory over the Skaarj empire.
* '''2241''' &quot;Strider Wars&quot; won by sacrificing a planet. (Unreal2)
* '''2251'''  The 'Cloning tank' used in the Tournament gets invented. (Unreal2, i think. Just dont remember that scene to well, you know, where the Marshal get to train fighting in the tutorial. Please fill it out someone who remember the details)
* '''2267''' In the Green's World Rebellion, three thousand miners revolt against harsh working conditions.
* '''2283''' The infamous AI uprising on LBX-7683. (UT2004)
* '''2291''' 'Consensual murder' legalized, and the Liandri corporation start to broadcast the 'Tournament'. (UT)
* '''2293''' Malcolm, a human, becomes Champion in the 'Tournament'. (UT)
* '''2302''' Gorge, another human, becomes Champion of the 'Tournament'. (UT2003)
* '''2303''' Xan Kriegor returns to the 'Tournament', winner still not declared.

(But something tells me it going to be Jakob)

==Discussion==

'''Unknown: (author?)''' Mostly taken from [http://www.unrealtournament.com/ www.UnrealTournament.com]

'''Tarquin:''' when you say &quot;taken&quot;, do you mean &quot;copied&quot;, or &quot;using informating from&quot;?

'''Legal:''' I can't speak for anyone, but here's the source I guess: http://www.unrealtournament.com/general/timeline.php

Looks like copied to me.

'''empty_other:''' Sorry people, its clean copied for the moment, im going to work and extend it, detailing it a bit, was my plan. Its too focused on UT2003/2004 view. Just looking trough Unreal, UT99 and UT2004 for more details right now...

'''empty_other:''' That was really what i had in mind, as theyrs timeline was way to focused on UT2004, and not the general story... Cant get much from ut99 and unreal though, as it seem that my computer rejects the Unreal engine suddenly.

'''Raikoh:''' The &quot;Cloning Tank&quot; in Unreal 2 wasn't a cloning tank, it was a holographic simulator. Think of the combat tutorial in Unreal 2 as being similar to laser tag, only instead of fake guns, fake people.

'''Wormbo:''' I don't think the UnrealWiki is the place for in-game history lessons. Stuff like this belongs on BeyondUnreal's [http://liandri.beyondunreal.com/ Liandri Archives] wiki.

----

[[:Category:Legacy To Do]] &amp;ndash; Link up or delete.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:General Utilities</title>
    <id>1379</id>
    <revision>
      <id>3496</id>
      <timestamp>2006-12-31T22:09:05Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>A list for 'general utilites' applications, refactored from Application</comment>
      <text xml:space="preserve">General Utilities that may prove useful for mapping and modding UT.

==Unreal Tournament Specific:==
* [[Legacy:Ucc|Ucc]] &amp;ndash; Unreal's general-purpose command line application.
* [[Legacy:Umod Wizard|umod Wizard]] &amp;ndash; Creates UMod installers.
* [[Legacy:UMod Browser|UMod Browser]] &amp;ndash; Extract the contents of any Unreal Modules (UMOD)
* [[Legacy:UMOD Extractor|UMOD Extractor]] &amp;ndash; Extract the contents of a UMod.
* [[Legacy:UT Package Tool|UT Package Tool]] &amp;ndash; Examine and decompile the contents of a UT package.
* [[Legacy:UT2Kx Regcheck|UT2Kx Regcheck]] &amp;ndash; Add and manage your UT2kx win-registry-keys

==Other Useful Utilities:==
* [[Legacy:MS_PowerToys|MS_PowerToys]] &amp;ndash; Useful tool which may or may not be useful in regards to UT.

==Related Topics:==

[[Legacy:Application|Application]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Generic Badass</title>
    <id>1353</id>
    <revision>
      <id>3440</id>
      <timestamp>2004-03-13T13:21:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

Well, I'm pretty much just another FPS fan, born and raised in the FPS world on Doom, Quake, Quake II, and Quake III. I had heard of UT but didn't really think much of it. Then, once upon a time, I downloaded the UT demo just to see what all the hubbub was about. I liked it enough that I bought UT:GOTYE shortly thereafter.

I've been a casual mapper for Q2 (and Q3 somewhat) and I wanted to try my hand at UT mapping. UT is much different than I anticipated; much more sophisticated, inside (mapping, engine) and out (gameplay). The jury's still out on whether or not I like it more than Q3.

==Contact Info==

I don't use e-mail anymore unless it's absolutely necessary (eg., to sign up for something) because of spam. My preferred form of contact is via IRC or various message boards.
* IRC: enterthegame.com, generally in #php, #maps, #higs and #ut
* Homepage: [http://zero-soul.panicus.org/quake/ Generic Personal Quake Site], the primary content of which are the maps I've made, most of which are for Q2. (it covers UT too; as I said, I started out with Quake)
* In my homepage is a small message board at which you can leave messages for me if you wish.

==Messages==

'''EntropicLqd:''' Hi, Welcome to the Wiki.

'''Tarquin:''' Hi, welcome :) The custom on wikis is to have a message board section in your personal page. Like thism, in fact :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3441</id>
      <timestamp>2004-03-13T10:17:56Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">==Overview==

Well, I'm pretty much just another FPS fan, born and raised in the FPS world on Doom, Quake, Quake II, and Quake III. I had heard of UT but didn't really think much of it. Then, once upon a time, I downloaded the UT demo just to see what all the hubbub was about. I liked it enough that I bought UT:GOTYE shortly thereafter.

I've been a casual mapper for Q2 (and Q3 somewhat) and I wanted to try my hand at UT mapping. UT is much different than I anticipated; much more sophisticated, inside (mapping, engine) and out (gameplay). The jury's still out on whether or not I like it more than Q3.

==Contact Info==

I don't use e-mail anymore unless it's absolutely necessary (eg., to sign up for something) because of spam. My preferred form of contact is via IRC or various message boards.
* IRC: enterthegame.com, generally in #php, #maps, #higs and #ut
* Homepage: [http://zero-soul.panicus.org/quake/ Generic Personal Quake Site], the primary content of which are the maps I've made, most of which are for Q2. (it covers UT too; as I said, I started out with Quake)
* In my homepage is a small message board at which you can leave messages for me if you wish.

----

'''EntropicLqd:''' Hi, Welcome to the Wiki.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Genetic Programming</title>
    <id>1366</id>
    <revision>
      <id>3466</id>
      <timestamp>2004-07-25T08:51:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

[[Legacy:Zedsquared|Zedsquared]] writes in his [[Legacy:ZedSquared/Developer Journal|Developer Journal]]...

{{innerbox|
I'm currently coding for [http://www.utron.org UTRon] the tron mod and am looking into the AI for the lightcycle game ATM, I remembered stumbling upon [http://dendrite.cs.brandeis.edu/tron This Site] a while back where you can play (ordinary, boring, top down, 2D) lightcycles against opponnents that are controlled using [http://www.genetic-programming.com/ Genetic Programming] techniques... go there now and give those bots some more training... go on! there's a high score table and everything :)

The more I read about it the more it seemed like a cool thing to try out... evolve an AI by randomly generating loads of controlling programs and playing them off against each other and humans, the best performing ones get creamed off the top and allowed to 'interbreed' with a little mutation thrown in for good measure thus producing a new generation to be tested and so on until eventually (maybe) AI is evolved that plays a decent game.

Now it strikes me that UT could be quite a good environment for this sort of thing, the large number of trials needed to evolve from 'random nonsense' to 'random seeming nonsense that somehow just *works*' can be carried out on many pcs in parrallel all talking to a central server that keeps track of the gene pool (think SETI@Home with a moebius twist). Uscript already has some TCP link classes that I need to get to grips with anyway so what the hell.. let's go!

Rewind a fortnight or two... I'm sitting on my own in a hotel in Milton Keynes (work... don't ask!) with a laptop loaded up with UT, WOTGreal and winCVS, fired by the inspirational knowlege that Bletchly Park (where this whole computing thing was kick started by Alan Turing waaay back when) is only a few miles down the road I decide that the time has come to turn this whim into a reality, I start to scribble, realise I have no pen, borrow one from reception and *really* start to scribble, strange blobby tree diagrams cover the paper, occasionally the distinctive crack of lightly chewed Bic casing is heard, all falls quiet for a second, my hands hover over the keyboard for a contemplative second or so and kapow! An edifice of code starts to take shape, it's turning as recursive as a very recursive thing (but that's OK), seems nicely modular, and might, just might... actually work! I missed out on the best thing about hotel life ( huge breakfast! ) next morning due to oversleeping a little :) 

Fast forward to the present and that core has been expanded upon and is approaching something workable... having a full on breeding program is close, just got the tcpip stuff to work on really.

Here's some code and stuff to be lightly refactored into a tutorial later with any luck:



}}

'''Tarquin:''' Well it's perhaps not ready to be a tutorial yet, but the pages have been static for about a year now, so I've taken the step of moving them here :)

==Contents==
* Episode I: [[Legacy:Genetic Programming/Nodes|Genetic Programming/Nodes]]
* Episode II: [[Legacy:Genetic Programming/Genes|Genetic Programming/Genes]]
* Episode III: [[Legacy:Genetic Programming/Mutation|Genetic Programming/Mutation]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Genetic Programming/Genes</title>
    <id>1364</id>
    <revision>
      <id>3462</id>
      <timestamp>2004-08-01T15:10:19Z</timestamp>
      <contributor>
        <ip>Wetering.xs4all.nl</ip>
      </contributor>
      <comment>Fixed link</comment>
      <text xml:space="preserve">[[Legacy:ZedSquared/Developer Journal|This page]] introduced the core class and ideas behind breeding a routine using [http://www.genetic-programming.com/ Genetic Programming.]  

Having sorted out the core stuff we need to think about the bigger picture:

The 'outer loop' of GP goes like this:
# Pick a candidate from a population of random programmes
# Test the candidate, keep track of how well it does
# Repeat untill all candidates have had enough trials to get a measure of their fitness for the task in hand
# Breed a new population by:
## Finding the best performing members of the current 'generation'
## Perform 'genetic operations' on these elite performers to generate members of the next generation by combining or changing their code in some way.
## Repeat untill you have a new population to test.
# Start all over again at 1), repeat until you deem performance good enough.

Now the classical way to do this involves running one large population on one machine and this is  what I'll start off with. But this can have some disadvantages as the population can become under diversified as an early partial solution to the problem rises to the top and monopolises all the gene pool. 

One way around this is to adopt the so called 'island' model and maintain many populations, each randomised at the start, and to allow those to breed for a while and then periodically allow exchange of members with the others thus ensuring some diversity. These populations can be run on different machines communicating over a network, or as many processes on one machine.

Anyway that's getting a bit ahead of myself... I need some way of storing and manipulating these things so it's time for a fresh class:  The GPmaster:

&lt;uscript&gt;
//---------------------------------------------------------
// class that handles breeding, fitness selection etc of GP
// trees
//-----------------------------------------------------------

class GPMaster extends Info config(Genes);

&lt;/uscript&gt;

A good start :) as the only way of storing persistant data in uscript is via ini files we make this use genes.ini as a gene pool database (see [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]] ).

Uscript never was meant to be used as a heavy duty database so if the breeding programme takes off and requires the tracking of thousands of individuals then I'll have to look at using [[Legacy:TcpLink|TcpLink]] to talk to an external decent DBMS like MySQL or something. But at this stage in development ini files will do.

To keep track of a member of the population we need to store the code that it uses and its performance in the trials, this sounds like just the job for a struct:

&lt;uscript&gt;

struct gene
  {
    var string code;
    var fitnessstats fitness;
    var int PoolIdx;
    var int trials;  // number of times this has been tested in this run
    var int rank;
  };

&lt;/uscript&gt;

At this point I realised that the GP framework I'm putting together could get used for many different tasks, not just breeding something that's good at steering lightcycles. Different tasks will have different ways of measuring success, not just number of frags... perhaps number of hits/bullets fired, or time spent staying alive, or prisoners rescued... whatever, the point is that we don't know what info will be returned by the other game code (the stuff that's actually running the trials ) so we make this gpmaster class somewhat abstract and fill in nitty gritty details in a subclass.

My first thought was along the lines of:

&lt;uscript&gt;

struct fitnessstats    // redefined in subclasses  for different tasks
                      
  {
   
  };

function initfitstats( fitnessstats f)
{
 // called to initialise stats on new gene
 // define in subclass
}



function addfitstats( fitnessStats new, fitnessstats old )
{
  // merges fitness stats from gene returning from trial
  // with those in pool
  // define in subclass
}

function gene best( gene g1, gene g2 )
{
// evaluate and return fittest of the two genes
// submitted.
// Used to sort genes to find the best performers
// define in subclass
}
&lt;/uscript&gt;

And all seemed fine, I coded up a subclass, put some actual variables in the struct and all compiled fine.. then I wrote initfitstats to suit and blarrrt! compiler error about redefining initfitstats, probably because even though the number of arguments to that function seemingly haven't changed (there's still just one struct passed) there are now more variables in that struct, hence the confusion :) No panic, I'll just have to define an object to hold fitness variables and subclass that instead I guess. Actually this is a bit neater as that class can also hold the functions needed to initialise itself and so on, but is messier as storing these variables is a problem... hmmm some more thought needed there, quick workround for now, though is to define all the stuff I need to get *my* task done up here in the superclass and worry about being versatile later :) So we have the variable definition block in full:

&lt;uscript&gt;
struct fitnessstats    // need to replace this with an object so it can be redifined in subclasses
                       // for different tasks
  {
   var   int gameswonVbots;
   var   int gameslostVbots;
   var   int GameswonVhumans;
   var   int GameslostVhumans;
   var float timespentplaying;
  };


struct gene
  {
    var string code;
    var fitnessstats fitness;
    var int PoolIdx;
    var int trials;  // number of times this has been tested in this run
    var int rank;
  };

var config gene pool[200];
var config int totaltrials,PoolPtr;
var int maxdepth;

&lt;/uscript&gt;

So you can see we have an array of genes, size 200 for our population (number 200 pulled out of the air... may grow later), and a couple of persistant variables to keep track of how many trials have been made and which was the last gene plucked fro the pool for testing.

Right, now for some proper meat:

&lt;uscript&gt;

function PullGene(out gpinfo result)
{
// grab a gene from the pool

 local gpnode root1;
 Local int idx;
 log(&quot; *GPM* pullgene called with gpi = &quot;$result);
 // alternate between next gene from pool and random gene
 if(toggler ==0) idx = rand(600);
 else
   {
     idx = poolptr;
     poolptr ++;
     if (poolptr ==601) poolptr=0;
   }
 toggler = 1-toggler;

 result.initialise();
 if( pool[idx].code == &quot;&quot; )
   {
     // grow random tree to fill empty pool position
     root1=spawn(class'gpnode');
     root1.RandomGrow(0,maxdepth);
     root1.WriteToString(result.code);
     log(&quot; GPM new code generated = &quot;$result.code);
     root1.prune();
     pool[idx].PoolIdx = idx;
     pool[idx].trials=0;
     pool[idx].code=result.code;
     root1.Destroy();
   }


 result.code=pool[idx].code;
 result.ID=idx;
 saveconfig();

}

function returngene( GPinfo incoming )
{
 // maybe some sort of hash function for indexing genes later ?
 addfitstats(incoming);
 pool[incoming.id].trials ++;
 pool[incoming.id].rank=eval(pool[incoming.id]);
 totaltrials++;
 if(totaltrials % Trials_per_generation==0)
     breednewpool();
 saveconfig();
}
&lt;/uscript&gt;

Pullgene will be used by the game entity that's going to be controlled by the GP tree to request a new brain for testing, it alternately selects either a random gene or the next one in sequence, this was done so I could ensure that as, long as I run at least twice as many tests as there are candidates in the pool, each candidate is guaranteed to be tested but not only against its immediate neighbours as would happen if I were simply to go through the genes sequentially. 

Within each gene struct is stored an index to the pool array so that when it comes back from the trial and returngene() is called then the appropriate set of fitness stats gets updated, remember there could be any number of in game bots all requesting new brains at different times during a trial so this is the best way to keep track of things IMO.

Now a break from the higher level logic for an actual genetic operator: the crossover operator. What this should do is take two trees, chose a node at random on each one,and swap over those nodes, along with any sub tree attached to them. 

&lt;uscript&gt;

function crossover( gene g1, gene g2, out gene g3, out gene g4)
{
local int n1,n2;
local int nc1,nc2;
local string s1,s2;
local gpnode root1,root2, node1, node2;

log(&quot; crossover: building trees &quot;);
root1=spawn(class'gpnode');
root2=spawn(class'gpnode');

log(&quot;code string1 =&quot;$g1.code);
log(&quot;code string2 =&quot;$g2.code);
root1.ReadFromString(g1.code);
root2.ReadFromString(g2.code);

// count nodes in candidates
root1.CountNodes(nc1);
root2.CountNodes(nc2);

log(&quot; crossover: nodes counted in tree 1 = &quot;$nc1);
log(&quot; crossover: nodes counted in tree 2 = &quot;$nc2);
// select a couple of nodes at random

n1 = rand(nc1-1)+2;

n2 = rand(nc2-1)+2;

log(&quot; Crossover point 1 = &quot;$n1);
log(&quot; CRossover point 2 = &quot;$n2);

node1 = root1.findnode(n1);
node2 = root2.findnode(n2);

log(&quot; crossover node on tree1 = &quot;$node1);
log(&quot; crossover node on tree2 = &quot;$node2);
//swap over subtrees

node1.parent.children[node1.childnum]=node2;
node2.parent.children[node2.childnum]=node1;

// write out new strings
root1.WriteToString(s1);
root2.WriteToString(s2);

log(&quot; after crossover tree1 =&quot;$s1);
log(&quot; after crossover tree2 =&quot;$s2);

// kill orphans


root1.prune(); root1.destroy();
root2.prune(); root2.Destroy();

// initialise new stats blocks.
initfitstats(g3);
initfitstats(g4);

// assign new code strings

g3.code=s1;
g4.code=s2;
// the end!
}
&lt;/uscript&gt;

All those logs are from testing and I'm pleased to say it all worked OK... here's some annotated log snippage to illustrate:

ScriptLog:  crossover: building trees 

ScriptLog: code string1 =XXERQG

ScriptLog: code string2 =N*HNK0.020814LQ-A+&lt;A+HEA+K0.155583GE

ScriptLog:  crossover: nodes counted in tree 1 = 7

ScriptLog:  crossover: nodes counted in tree 2 = 21

ScriptLog:  Crossover point 1 = 7

ScriptLog:  CRossover point 2 = 11

ScriptLog:  crossover node on tree1 = UTronCyclebottrainerTEST.GPTlookLeft4180

ScriptLog:  crossover node on tree2 = UTronCyclebottrainerTEST.GPFplus5064

So the seventh node on tree1 is the chosen crossover point with the eleventh node on tree2. Counting along the strings (starting from 2 to allow for the root node) gives us the characters 'G' and '+' respectively and the logged node types agree... great! that means the node counting and selecting routines all work.

ScriptLog:  after crossover tree1 =XXERQ+&lt;A+HEA+K0.155583GE

ScriptLog:  after crossover tree2 =N*HNK0.020814LQ-AG

And checking those resulting strings confirms that the crossover went OK, woot! 

Now for the next main genetic operator... mutation, but this page is getting large so hop on along to:

[[Legacy:Genetic Programming/Mutation|Genetic Programming/Mutation]]

==your comments welcome==

'''Tarquin:''' Suggestions: 
# move content out of [[Legacy:ZedSquared/Developer Journal|ZedSquared/Developer Journal]] to be episode I of GP.
# change the page names, eg  [[Legacy:Genetic Programming/Mutation|Genetic Programming/Mutation]] for episode 3.

'''Zedsquared'''  Cheers for the suggestions Tarq, I'll be doing that sort of thing once I get to the end of my adventure, meanwhile it's somewhat of a shambling pile... bit like me really :)</text>
    </revision>
    <revision>
      <id>3463</id>
      <timestamp>2003-04-24T16:45:09Z</timestamp>
      <contributor>
        <ip>Zedsquared</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:ZedSquared/Developer Journal|This page]] introduced the core class and ideas behind breeding a routine using [http://www.genetic-programming.com/ Genetic Programming.]  

Having sorted out the core stuff we need to think about the bigger picture:

The 'outer loop' of GP goes like this:
# Pick a candidate from a population of random programmes
# Test the candidate, keep track of how well it does
# Repeat untill all candidates have had enough trials to get a measure of their fitness for the task in hand
# Breed a new population by:
## Finding the best performing members of the current 'generation'
## Perform 'genetic operations' on these elite performers to generate members of the next generation by combining or changing their code in some way.
## Repeat untill you have a new population to test.
# Start all over again at 1), repeat until you deem performance good enough.

Now the classical way to do this involves running one large population on one machine and this is  what I'll start off with. But this can have some disadvantages as the population can become under diversified as an early partial solution to the problem rises to the top and monopolises all the gene pool. 

One way around this is to adopt the so called 'island' model and maintain many populations, each randomised at the start, and to allow those to breed for a while and then periodically allow exchange of members with the others thus ensuring some diversity. These populations can be run on different machines communicating over a network, or as many processes on one machine.

Anyway that's getting a bit ahead of myself... I need some way of storing and manipulating these things so it's time for a fresh class:  The GPmaster:

&lt;uscript&gt;
//---------------------------------------------------------
// class that handles breeding, fitness selection etc of GP
// trees
//-----------------------------------------------------------

class GPMaster extends Info config(Genes);

&lt;/uscript&gt;

A good start :) as the only way of storing persistant data in uscript is via ini files we make this use genes.ini as a gene pool database (see [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]] ).

Uscript never was meant to be used as a heavy duty database so if the breeding programme takes off and requires the tracking of thousands of individuals then I'll have to look at using [[Legacy:TcpLink|TcpLink]] to talk to an external decent DBMS like MySQL or something. But at this stage in development ini files will do.

To keep track of a member of the population we need to store the code that it uses and its performance in the trials, this sounds like just the job for a struct:

&lt;uscript&gt;

struct gene
  {
    var string code;
    var fitnessstats fitness;
    var int PoolIdx;
    var int trials;  // number of times this has been tested in this run
    var int rank;
  };

&lt;/uscript&gt;

At this point I realised that the GP framework I'm putting together could get used for many different tasks, not just breeding something that's good at steering lightcycles. Different tasks will have different ways of measuring success, not just number of frags... perhaps number of hits/bullets fired, or time spent staying alive, or prisoners rescued... whatever, the point is that we don't know what info will be returned by the other game code (the stuff that's actually running the trials ) so we make this gpmaster class somewhat abstract and fill in nitty gritty details in a subclass.

My first thought was along the lines of:

&lt;uscript&gt;

struct fitnessstats    // redefined in subclasses  for different tasks
                      
  {
   
  };

function initfitstats( fitnessstats f)
{
 // called to initialise stats on new gene
 // define in subclass
}



function addfitstats( fitnessStats new, fitnessstats old )
{
  // merges fitness stats from gene returning from trial
  // with those in pool
  // define in subclass
}

function gene best( gene g1, gene g2 )
{
// evaluate and return fittest of the two genes
// submitted.
// Used to sort genes to find the best performers
// define in subclass
}
&lt;/uscript&gt;

And all seemed fine, I coded up a subclass, put some actual variables in the struct and all compiled fine.. then I wrote initfitstats to suit and blarrrt! compiler error about redefining initfitstats, probably because even though the number of arguments to that function seemingly haven't changed (there's still just one struct passed) there are now more variables in that struct, hence the confusion :) No panic, I'll just have to define an object to hold fitness variables and subclass that instead I guess. Actually this is a bit neater as that class can also hold the functions needed to initialise itself and so on, but is messier as storing these variables is a problem... hmmm some more thought needed there, quick workround for now, though is to define all the stuff I need to get *my* task done up here in the superclass and worry about being versatile later :) So we have the variable definition block in full:

&lt;uscript&gt;
struct fitnessstats    // need to replace this with an object so it can be redifined in subclasses
                       // for different tasks
  {
   var   int gameswonVbots;
   var   int gameslostVbots;
   var   int GameswonVhumans;
   var   int GameslostVhumans;
   var float timespentplaying;
  };


struct gene
  {
    var string code;
    var fitnessstats fitness;
    var int PoolIdx;
    var int trials;  // number of times this has been tested in this run
    var int rank;
  };

var config gene pool[200];
var config int totaltrials,PoolPtr;
var int maxdepth;

&lt;/uscript&gt;

So you can see we have an array of genes, size 200 for our population (number 200 pulled out of the air... may grow later), and a couple of persistant variables to keep track of how many trials have been made and which was the last gene plucked fro the pool for testing.

Right, now for some proper meat:

&lt;uscript&gt;

function PullGene(out gpinfo result)
{
// grab a gene from the pool

 local gpnode root1;
 Local int idx;
 log(&quot; *GPM* pullgene called with gpi = &quot;$result);
 // alternate between next gene from pool and random gene
 if(toggler ==0) idx = rand(600);
 else
   {
     idx = poolptr;
     poolptr ++;
     if (poolptr ==601) poolptr=0;
   }
 toggler = 1-toggler;

 result.initialise();
 if( pool[idx].code == &quot;&quot; )
   {
     // grow random tree to fill empty pool position
     root1=spawn(class'gpnode');
     root1.RandomGrow(0,maxdepth);
     root1.WriteToString(result.code);
     log(&quot; GPM new code generated = &quot;$result.code);
     root1.prune();
     pool[idx].PoolIdx = idx;
     pool[idx].trials=0;
     pool[idx].code=result.code;
     root1.Destroy();
   }


 result.code=pool[idx].code;
 result.ID=idx;
 saveconfig();

}

function returngene( GPinfo incoming )
{
 // maybe some sort of hash function for indexing genes later ?
 addfitstats(incoming);
 pool[incoming.id].trials ++;
 pool[incoming.id].rank=eval(pool[incoming.id]);
 totaltrials++;
 if(totaltrials % Trials_per_generation==0)
     breednewpool();
 saveconfig();
}
&lt;/uscript&gt;

Pullgene will be used by the game entity that's going to be controlled by the GP tree to request a new brain for testing, it alternately selects either a random gene or the next one in sequence, this was done so I could ensure that as, long as I run at least twice as many tests as there are candidates in the pool, each candidate is guaranteed to be tested but not only against its immediate neighbours as would happen if I were simply to go through the genes sequentially. 

Within each gene struct is stored an index to the pool array so that when it comes back from the trial and returngene() is called then the appropriate set of fitness stats gets updated, remember there could be any number of in game bots all requesting new brains at different times during a trial so this is the best way to keep track of things IMO.

Now a break from the higher level logic for an actual genetic operator: the crossover operator. What this should do is take two trees, chose a node at random on each one,and swap over those nodes, along with any sub tree attached to them. 

&lt;uscript&gt;

function crossover( gene g1, gene g2, out gene g3, out gene g4)
{
local int n1,n2;
local int nc1,nc2;
local string s1,s2;
local gpnode root1,root2, node1, node2;

log(&quot; crossover: building trees &quot;);
root1=spawn(class'gpnode');
root2=spawn(class'gpnode');

log(&quot;code string1 =&quot;$g1.code);
log(&quot;code string2 =&quot;$g2.code);
root1.ReadFromString(g1.code);
root2.ReadFromString(g2.code);

// count nodes in candidates
root1.CountNodes(nc1);
root2.CountNodes(nc2);

log(&quot; crossover: nodes counted in tree 1 = &quot;$nc1);
log(&quot; crossover: nodes counted in tree 2 = &quot;$nc2);
// select a couple of nodes at random

n1 = rand(nc1-1)+2;

n2 = rand(nc2-1)+2;

log(&quot; Crossover point 1 = &quot;$n1);
log(&quot; CRossover point 2 = &quot;$n2);

node1 = root1.findnode(n1);
node2 = root2.findnode(n2);

log(&quot; crossover node on tree1 = &quot;$node1);
log(&quot; crossover node on tree2 = &quot;$node2);
//swap over subtrees

node1.parent.children[node1.childnum]=node2;
node2.parent.children[node2.childnum]=node1;

// write out new strings
root1.WriteToString(s1);
root2.WriteToString(s2);

log(&quot; after crossover tree1 =&quot;$s1);
log(&quot; after crossover tree2 =&quot;$s2);

// kill orphans


root1.prune(); root1.destroy();
root2.prune(); root2.Destroy();

// initialise new stats blocks.
initfitstats(g3);
initfitstats(g4);

// assign new code strings

g3.code=s1;
g4.code=s2;
// the end!
}
&lt;/uscript&gt;

All those logs are from testing and I'm pleased to say it all worked OK... here's some annotated log snippage to illustrate:

ScriptLog:  crossover: building trees 

ScriptLog: code string1 =XXERQG

ScriptLog: code string2 =N*HNK0.020814LQ-A+&lt;A+HEA+K0.155583GE

ScriptLog:  crossover: nodes counted in tree 1 = 7

ScriptLog:  crossover: nodes counted in tree 2 = 21

ScriptLog:  Crossover point 1 = 7

ScriptLog:  CRossover point 2 = 11

ScriptLog:  crossover node on tree1 = UTronCyclebottrainerTEST.GPTlookLeft4180

ScriptLog:  crossover node on tree2 = UTronCyclebottrainerTEST.GPFplus5064

So the seventh node on tree1 is the chosen crossover point with the eleventh node on tree2. Counting along the strings (starting from 2 to allow for the root node) gives us the characters 'G' and '+' respectively and the logged node types agree... great! that means the node counting and selecting routines all work.

ScriptLog:  after crossover tree1 =XXERQ+&lt;A+HEA+K0.155583GE

ScriptLog:  after crossover tree2 =N*HNK0.020814LQ-AG

And checking those resulting strings confirms that the crossover went OK, woot! 

Now for the next main genetic operator... mutation, but this page is getting large so hop on along to:

[[Legacy:Adventures In GP Episode III|Adventures in GP Episode III]]

==your comments welcome==

'''Tarquin:''' Suggestions: 
# move content out of [[Legacy:ZedSquared/Developer Journal|ZedSquared/Developer Journal]] to be episode I of GP.
# change the page names, eg  [[Legacy:Genetic Programming/Mutation|Genetic Programming/Mutation]] for episode 3.

'''Zedsquared'''  Cheers for the suggestions Tarq, I'll be doing that sort of thing once I get to the end of my adventure, meanwhile it's somewhat of a shambling pile... bit like me really :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Genetic Programming/Mutation</title>
    <id>1365</id>
    <revision>
      <id>3464</id>
      <timestamp>2003-06-19T14:02:28Z</timestamp>
      <contributor>
        <ip>Zedsquared</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">... continuing on from [[Legacy:Genetic Programming/Genes|Genetic Programming/Genes]]

The mutation genetic operation is used fairly sparingly in the breeding process and works by chosing a node at random then replacing the tree below it by new randomly generated code. It's pretty straightforeward:

&lt;uscript&gt;

function gene mutate( gene g1)
{
 // chose a node at random and replace with new random subtree

 local int numnodes, nodenum,i;
 local gpnode root1,target;
 local gene result;
 Local string s1;


 initfitstats(result);

 // grow tree from gene
 root1=spawn(class'gpnode');
 root1.ReadFromString(g1.code);

 // find out how many nodes are in the tree we're mutating
 root1.countnodes(numnodes);

 // pick one at random
 nodenum=rand(numnodes-1)+2;
 
 // get reference to target node
 target=root1.findnode(nodenum);

 // clear subtree below target node
 target.prune();

 // grow new subtree
 target.RandomGrow(target.depth,maxdepth);

 // write out new tree
 root1.WriteToString(result.code);

 // clean up
 root1.prune();
 root1.Destroy();

 return(result);
}

&lt;/uscript&gt;

So, having coded up routines to mangle GP trees in various ways there's a need for something to actually organise the planned orgy of interbreeding. Sorting the array in order of performance sounds like a good idea to start with so why not break out a good old bubblesort, I know there are quicker ways but this only gets done fairly rarely and our array isn't that huge so what the heck:

&lt;uscript&gt;

function sortgenes()
{
  local int i,j;

  for(i=0;i&lt;599;i++)
    for(j=0;j&lt;(599-i);J++)
        if(eval(pool[i+1]) &gt; eval(pool[i])) swap(i,i+1);

}

function float eval( gene g1)
{
// evaluate fitness of gene
// submitted.
// define in subclass

local float result;
local  float playedVhumans, playedVbots;

playedVhumans = g1.stats.GameswonVhumans + g1.stats.GameslostVhumans;
playedvbots = g1.stats.gameswonVbots + g1.stats.gameslostVbots;

if( playedVhumans ==0 ) playedVHumans=1;   // to avoid divide by zeros
if( playedVbots ==0) playedVbots=1;

result = (g1.stats.gameswonVbots / playedvbots) + 2 * (g1.stats.gameswonVhumans / playedVhumans) ;

return(result);
}


function swap( int idx1, int idx2)
{
 // swap over two genes in pool
 // define in subclass
 local gene temp;

 temp=pool[idx1];
 pool[idx1]=pool[idx2];
 pool[idx2]=temp;
 pool[idx1].PoolIdx=idx1;
 pool[idx2].PoolIdx=idx2;
}

&lt;/uscript&gt;

That takes care if the sorting, now to code up the routine that makes actual *evolution* happen, so far  all we've been doing is randomising everything, now we select our stud stock and breed the next generation of AI... it's a nested loop fest, it's:

&lt;uscript&gt;
function breednewpool()
{
  local gene breeders[16];
  local int i,j;
  // take the top performers and breed a new generation from them
  // first sort them in order of performance
  sortgenes();
  // keep top fifteen performers
  for(i=0;i&lt;16;i++) breeders[i]=pool[i];

  // breed (crossover) the top sixteen against each other in all perms... twice
  for(i=0;i&lt;16;i++)
    for(j=0;j&lt;16;j+=2)
        crossover(breeders[i],breeders[j],pool[16+j+i*16],pool[j+17+i*16]);
  for(i=0;i&lt;15;i++)
    for(j=0;j&lt;15;j+=2)
        crossover(breeders[i],breeders[j],pool[272+j+i*16],pool[273+j+i*16]);


  // throw in a few mutations  each too
  for(i=1;i&lt;16;i++)
    {
     pool[512+i]=mutate(breeders[i]);
     pool[528+i]=mutate(breeders[i]);
     pool[544+i]=mutate(breeders[i]);
     pool[560+i]=mutate(breeders[i]);
    }
//  that makes 576 by my reckoning... blank the code of the lowest performers so they
// get new random code next time
    for(i=576;i&lt;600;i++)
      {
        pool[i].code=&quot;&quot;;
        initfitstats(pool[i]);
      }

    generations ++;
    saveconfig();
}
 

&lt;/uscript&gt;

... to be continued ...

'''Foxpaw:''' I didn't see the crossover function listed, I'm curious as to how it works on that tree. Have you written it yet?

'''Zedsquared:''' Yep, it's back a page on [[Legacy:Genetic Programming/Genes|Genetic Programming/Genes]] I hope to be getting back in the saddle with this stuff soon, watch this space :)</text>
    </revision>
    <revision>
      <id>3465</id>
      <timestamp>2003-06-19T11:41:32Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">... continuing on from [[Legacy:Genetic Programming/Genes|Genetic Programming/Genes]]

The mutation genetic operation is used fairly sparingly in the breeding process and works by chosing a node at random then replacing the tree below it by new randomly generated code. It's pretty straightforeward:

&lt;uscript&gt;

function gene mutate( gene g1)
{
 // chose a node at random and replace with new random subtree

 local int numnodes, nodenum,i;
 local gpnode root1,target;
 local gene result;
 Local string s1;


 initfitstats(result);

 // grow tree from gene
 root1=spawn(class'gpnode');
 root1.ReadFromString(g1.code);

 // find out how many nodes are in the tree we're mutating
 root1.countnodes(numnodes);

 // pick one at random
 nodenum=rand(numnodes-1)+2;
 
 // get reference to target node
 target=root1.findnode(nodenum);

 // clear subtree below target node
 target.prune();

 // grow new subtree
 target.RandomGrow(target.depth,maxdepth);

 // write out new tree
 root1.WriteToString(result.code);

 // clean up
 root1.prune();
 root1.Destroy();

 return(result);
}

&lt;/uscript&gt;

So, having coded up routines to mangle GP trees in various ways there's a need for something to actually organise the planned orgy of interbreeding. Sorting the array in order of performance sounds like a good idea to start with so why not break out a good old bubblesort, I know there are quicker ways but this only gets done fairly rarely and our array isn't that huge so what the heck:

&lt;uscript&gt;

function sortgenes()
{
  local int i,j;

  for(i=0;i&lt;599;i++)
    for(j=0;j&lt;(599-i);J++)
        if(eval(pool[i+1]) &gt; eval(pool[i])) swap(i,i+1);

}

function float eval( gene g1)
{
// evaluate fitness of gene
// submitted.
// define in subclass

local float result;
local  float playedVhumans, playedVbots;

playedVhumans = g1.stats.GameswonVhumans + g1.stats.GameslostVhumans;
playedvbots = g1.stats.gameswonVbots + g1.stats.gameslostVbots;

if( playedVhumans ==0 ) playedVHumans=1;   // to avoid divide by zeros
if( playedVbots ==0) playedVbots=1;

result = (g1.stats.gameswonVbots / playedvbots) + 2 * (g1.stats.gameswonVhumans / playedVhumans) ;

return(result);
}


function swap( int idx1, int idx2)
{
 // swap over two genes in pool
 // define in subclass
 local gene temp;

 temp=pool[idx1];
 pool[idx1]=pool[idx2];
 pool[idx2]=temp;
 pool[idx1].PoolIdx=idx1;
 pool[idx2].PoolIdx=idx2;
}

&lt;/uscript&gt;

That takes care if the sorting, now to code up the routine that makes actual *evolution* happen, so far  all we've been doing is randomising everything, now we select our stud stock and breed the next generation of AI... it's a nested loop fest, it's:

&lt;uscript&gt;
function breednewpool()
{
  local gene breeders[16];
  local int i,j;
  // take the top performers and breed a new generation from them
  // first sort them in order of performance
  sortgenes();
  // keep top fifteen performers
  for(i=0;i&lt;16;i++) breeders[i]=pool[i];

  // breed (crossover) the top sixteen against each other in all perms... twice
  for(i=0;i&lt;16;i++)
    for(j=0;j&lt;16;j+=2)
        crossover(breeders[i],breeders[j],pool[16+j+i*16],pool[j+17+i*16]);
  for(i=0;i&lt;15;i++)
    for(j=0;j&lt;15;j+=2)
        crossover(breeders[i],breeders[j],pool[272+j+i*16],pool[273+j+i*16]);


  // throw in a few mutations  each too
  for(i=1;i&lt;16;i++)
    {
     pool[512+i]=mutate(breeders[i]);
     pool[528+i]=mutate(breeders[i]);
     pool[544+i]=mutate(breeders[i]);
     pool[560+i]=mutate(breeders[i]);
    }
//  that makes 576 by my reckoning... blank the code of the lowest performers so they
// get new random code next time
    for(i=576;i&lt;600;i++)
      {
        pool[i].code=&quot;&quot;;
        initfitstats(pool[i]);
      }

    generations ++;
    saveconfig();
}
 

&lt;/uscript&gt;

... to be continued ...

'''Foxpaw:''' I didn't see the crossover function listed, I'm curious as to how it works on that tree. Have you written it yet?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Genetic Programming/Nodes</title>
    <id>1363</id>
    <revision>
      <id>3460</id>
      <timestamp>2004-07-25T08:54:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">First off, read the introduction on [[Legacy:Genetic Programming|Genetic Programming]], and go look at the animated tutorial at [http://www.genetic-programming.com/gpanimatedtutorial.html www.genetic-programming.com/gpanimatedtutorial.html] or all of this is all going to be nonsense :)

OK, by now you should know that GP uses a tree structure of linked objects to do its 'thinking' these objects are either 'Terminals' (i.e. 'leaves' at the end of the tree branches which return either sensor input or constant values) or 'Functions' which take one or more values and return another.

In my implimentation all nodes take and return floats as arguments so it doesn't matter how much you mix things up, no node gets presented with data it can't cope with.

Here's a simple node that adds together its two inputs:

&lt;uscript&gt;
//-----------------------------------------------------------
// arithmetic addition function
//-----------------------------------------------------------
class GPFplus extends GPnode;


function float evaluate()
{
  return( children[0].evaluate() + children[1].evaluate());
}

function string makemytoken()
{
  return(&quot;+&quot;);
}


DefaultProperties
{
 childcount=2
}

&lt;/uscript&gt;

It extends GPnode which is the base class of all the nodes and includes lots of baggage to be explained later, for now just notice that the nodes below it in the parse tree are referenced by the children[] array and that the evaluate method is called on these children in order to get the values that need to be added together. This is the basic magic, all the objects in the tree are linked together and control flows down the branches until something that actually returns a value is evaluated. Some nodes are conditional and branches get evaluated or not depending on conditions... in this way we can produce a program that actually varies its behavior according to conditions, unlike any of the simple examples in the tutorial linked to above which are more like equations than anything we'd call 'code'.

As an example here's evaluate for the 'less than' node:

&lt;uscript&gt;

function float evaluate()
{
  local float arg1,arg2;
  arg1=children[0].evaluate();
  arg2=children[1].evaluate();
  if(arg1&lt;arg2) return(children[2].evaluate());
  else
    return(children[3].evaluate());
}

&lt;/uscript&gt;

Notice how sometimes children[2] gets evaluated and other times it's children[3] that gets to see some action.

Now in order to get any of this to work we need a way of storing the tree so it can be passed around and manipulated, this is where makemytoken() comes in, its job is to return the string representation of that node... pretty simple here but nodes which hold values need something more... here's evaluate and makemytoken for the 'constant' terminal node:

&lt;uscript&gt;

var float val;

function float evaluate()
{
    return(val);
}

function string makemytoken()
{
  return(&quot;K&quot;$val);
}

&lt;/uscript&gt;

As you can see I use the character K to flag a constant and then append the value to is using uscripts really rather useful built in type conversions.

Enough specifics, I hope that conveys the gist, here's the core GPnode code in it's glory:

&lt;uscript&gt;

//-----------------------------------------------------------
// Genetic Programming parse tree node root class
//-----------------------------------------------------------
class GPnode extends Actor;


Var int Childcount;
var GPnode children[4], parent;
var int childnum, depth; // self = parent.chilren[childnum]
var string mytoken;
var actor mypawn;            // might not be always be a pawn, hence type = actor for now
var const string terminators, functions;
var const string alltypes;


function float evaluate()
{
  return(children[0].evaluate());
}


&lt;/uscript&gt;

Variables and a very empty evaluate method.

Now more recursion: this is how the tree gets written out as a string: the node writes it's own token to the string then calls writetostring on its children, those children in turn get their children to write a token to the string and so on... somehow satisfyingly cool to someone like myself who's never been beyond a simple recursive factiorial function before :)

&lt;uscript&gt;

function WriteToString( out string genome )
{
 local int i;
 genome = genome$MakeMyToken();
 if(childcount == 0) return;
 else
  {
    for(i=0;i&lt;childcount;i++)
     {
       children[i].WriteToString(genome);
     }
  }
}

function string makemytoken()
{
//log(&quot;makemytoken called on &quot;$self);
// null token for base class, make this return the string that represents
// any subclass (mostly one char but constant terminators need to write out
// their value forinstance)
return(&quot;&quot;);
}









&lt;/uscript&gt;

Notice also cunning use of an 'out' declaration there so all that needs to be done to create the genome string is simply call WriteToString(s) on the root node of the tree and as if by magic, S gets an encoded version of the object tree written to it.. by now I'm really starting to grock recursion properly and feel like I'm on a run, the elegence of these objects all describing themselves is appealing but in the background I can't help wondering if it all might fall apart somehow... 

Doubts or not, this is how most of the functionality has shaped up, simply call a method on the root node and all else follows for various tree manipulation tasks.

Now having written this string we neeed a way of reading it back in and creating an object tree out of it... so let's go all recursive again and we have the imaginatively named:

&lt;uscript&gt;
Function ReadFromString( out string genome)
{
  local int i;
  local string char;
  local GPnode node;
  for ( i =0; i&lt;childcount;i++)
  {
    // eat and analyse first (leftmost) char of string
    
    char = left(genome,1);
    genome = right(genome,len(genome)-1);
    node = addchild( char,i);
    node.ReadFromString(genome);
 }
}

&lt;/uscript&gt;

So basically you start by spawning a gpnode as the root, feed it the string of gobbledegook generated by writetostring and it reads (and discards) the first character, spawns the appropriate node actor, makes that its first child and passes the rest of the string to it so it can make any children it might need in turn... and so it goes on down the tree.

Addchild is a big switch that takes care of spawning the right sort of node type according to the character token that has been read in:

&lt;uscript&gt;


function gpnode addchild(string childtype, int i)
{
  local class&lt;actor&gt;  childclass;
  local gpnode node;

   switch(childtype)
   {
    // functions first
      case &quot;+&quot;:
          childclass = class'GPFplus';
          break;
      case &quot;-&quot;:
          childclass = class'GPFminus';
          break;
      case &quot;*&quot;:
          childclass = class'GPFmultiply';
          break;
      case &quot;%&quot;:
          childclass = class'GPFsafeDivide';
          break;
      case &quot;&lt;&quot;:
          childclass = class'GPFlessThan';
          break;
      case &quot;Q&quot;:
          childclass = class'GPFSqrt';
          break;
      case &quot;N&quot;:
          childclass = class'GPFMin';
          break;
      case &quot;X&quot;:
          childclass = class'GPFMax';
          break;
      // then the terminators
      case &quot;R&quot;:
          childclass = class'GPFrightTurn';
          break;
      case &quot;L&quot;:
          childclass = class'GPFleftTurn';
          break;
      case &quot;K&quot;:
          childclass = class'GPTconstant';
          break;
      case &quot;A&quot;:
          childclass = class'GPTlookAhead';
          break;
      case &quot;B&quot;:
          childclass = class'GPTlookAheadRight';
          break;
      case &quot;C&quot;:
          childclass = class'GPTlookRight';
          break;
      case &quot;D&quot;:
          childclass = class'GPTlookBackRight';
          break;
      case &quot;E&quot;:
          childclass = class'GPTlookBack';
          break;
      case &quot;F&quot;:
          childclass = class'GPTlookBackLeft';
          break;
      case &quot;G&quot;:
          childclass = class'GPTlookLeft';
          break;
      case &quot;H&quot;:
          childclass = class'GPTlookAheadLeft';
          break;
      default:
          log( &quot; *gennode* Uh Oh! unknown token! &quot;$childtype);
          break;
    }
   // log(&quot; childclass = &quot;$childclass);
    node = gpnode( spawn(childclass));
    children[i]=node;
    node.mypawn = mypawn;
    node.parent=self;
    node.childnum=i;
    node.depth=depth+1;
    return(node);
}

&lt;/uscript&gt;

... and the sands of time draw a close to the first session editing this page... things are already a lot clearer in my head thanks to explaining a little to you, dear reader... till the next time I leave you with the remainder of the gpnode class which deals with things like growing random sub trees and other housekeeping. You can view the rest of the classes so far on CVS at the home of UTron on sourcefore here: [https://sourceforge.net/projects/utron/] click on 'browse CVS' and look for classes in the package 'UTron' with names beginning with GP.

&lt;uscript&gt;



function RandomGrow ( int depth, int maxdepth )
{
local int i,j,r;
local string char;
local GPnode node;
  //log(&quot; random grow called on &quot;$self@&quot;depth = &quot;$depth);
  for ( i =0; i&lt;childcount;i++)
  {
   //log(&quot; randomgrow on &quot;$self$&quot;choosing child&quot;$i);
    if(depth == maxdepth) {
     // log(&quot;max depth reached&quot;);
      char = mid(terminators,rand(len(terminators)),1);
  //    log(&quot;char = &quot;$char);
      node = addchild(char,i);
    //  log(&quot;new terminator node = &quot;$node);
    }
    else
      {
       if(depth &lt;4) char = mid(functions,rand(len(functions)),1); // add a bit of depth to start with for testing
        else char = mid(alltypes,rand(len(alltypes)),1);
      // log(&quot;char = &quot;$char);
       node = addchild( char,i);
      // log(&quot;new node = &quot;$node);
       if(node.Childcount &gt;0)  node.RandomGrow(depth+1,maxdepth);
      }
  }

}

&lt;/uscript&gt;

RandomGrow is the function that creates random trees for seeding the initial population and for use in the genetic 'mutation' operation too. Note the plentiful commented out log statments... no more than curious fossils now, they were useful in the extreme when debugging this stuff, a comment after every line is usually a sign that I was tracking down an accessed none... I really should get round to deleting them :)

Since there are currently quite a few more terminal nodes defined that there are functions the tree had a habit of being very small most of the time so you'll notice that I make sure that all nodes up to depth 4 are chosen from the set of functions in order to give it a bit of depth... strictly speaking this is biasing what should be a totally random process, the fitness selection and evolution should take care of any runts, so this will probably go once things are fully set up. For now though it's a handy feature for testing.

Sometimes we might need to prune off the branch of a tree before replacing it with something else (like a branch chosen randomly from a tree that performs well at our chosen task, or just another random growth when mutating ) so the prune function recursively destroys nodes below the one on which it is first called.

It still feels a little crufty, that first check on childcount should be redundant really as the parent of any nodes with childcount == 0 will destroy them so that will go soon methinks. In fact a more elegant system would have terminal nodes destroy themselves but at the time I wasn't confident that a function in a node that called that nodes destroy() function  would actually return, so nodes destroy their children instead (after having called prune on child nodes to ensure that their children get destroyed in turn ).

&lt;uscript&gt;

function prune()    // remove objects below this node
{
  local int i;
  if(childcount == 0 ) return;
  else
    for(i=0;i&lt;childcount;i++)
      if(children[i].Childcount==0) children[i].Destroy();
        else
           {
             children[i].prune();
             children[i].Destroy();
             children[i]=none;
           }
  return;
}

&lt;/uscript&gt;

All of the tree manipulation functions used in creating new trees from an exisiting one need to chose a node at random and then do stuff to it. So the two functions below are used to:
# Count the nodes in the tree so that correct range can be used when a random number is generated to pick a node.
# Actually return a reference to that random node

&lt;uscript&gt;
function countnodes(out int nodecount)
{
 local int i;
 //recursively count nodes in tree below this one
 nodecount ++;
 for (i=0;i&lt;childcount;i++)  children[i].countnodes(nodecount);
 return;
}

function gpnode findnode(out int nodenum) 
{
  local int i;
  local gpnode result;
  nodenum --;
  if(nodenum ==0) return(self);
  else
    {
       for (i=0;i&lt;childcount;i++)
         {
           result = children[i].findnode(nodenum);
           if(result != none)
              return(result);
         }
       return(none);
    }
}


&lt;/uscript&gt;

last but not least, cloneme() spawns a duplicate of a node and all the tree below it... yet more recursive majick :)

&lt;uscript&gt;

function gpnode cloneme()
{
  // clone this object, used recursively to duplicate subtrees
  local int i;
  local gpnode newnode;

  newnode = spawn(class);
  for(i=0;i&lt;childcount;i++)
    newnode.children[i] = children[i].cloneme();
    newnode.mypawn=mypawn;
  return(newnode);
}

&lt;/uscript&gt;

The most interesting things in the deafult properties are the strings which are used to hold lists of the tokens of the different types of nodes. Add to these when new nodes are made (my current one character per token scheme is nice and simple and I reckon if you find yourself running out of characters as node types undergo runaway expansion you need to think again about how much control you're willing to hand over to the evolution process... stick to minimal building blocks and let complexity sort itself out... another lesson from mr Turing :) )

&lt;uscript&gt;

DefaultProperties
{
DrawType=DT_none
bCollideWorld=false
bCollideActors=false
bProjtarget=false
childcount=1
Terminators=&quot;RLKABCDEFGH&quot;
AllTypes=&quot;+-*%&lt;RLKABCDEFGHQNX&quot;
functions=&quot;+-*%&lt;QNX&quot;
}

&lt;/uscript&gt;

So there you have it, the core node class. But for this to do any good we need a way of storing 'genes' and keeping track of which ones are doing well at our trials, as well as performing the actual 'breeding' and mutation of those high performers. Find the class that does this and further ramblings over at:

[[Legacy:Genetic Programming/Genes|Genetic Programming/Genes]]

==Your Comments Welcome ==

'''DJPaul:''' Blimey.

'''Zedsquared'''  heh!  I'll take that as a good 'Blimey' then ;) food for thought I hope?

'''Chazums:''' Strangely enough, just stumbled onto the idea of using this kind of thing for AI today.  Nicely written walk through, makes things clearer in my mind too.

'''Zedsquared''' Cheers Chazums, glad my explanations make some sense to you, here's a good link to a page full of such goodies (the whole site is good for AI too) [http://www.gameai.com/genetics.html GameAi.com]</text>
    </revision>
    <revision>
      <id>3461</id>
      <timestamp>2004-07-25T08:51:09Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">First off, go look at the animated tutorial at [http://www.genetic-programming.com/gpanimatedtutorial.html www.genetic-programming.com/gpanimatedtutorial.html] or all of this is all going to be nonsense :)

OK, by now you should know that GP uses a tree structure of linked objects to do its 'thinking' these objects are either 'Terminals' (i.e. 'leaves' at the end of the tree branches which return either sensor input or constant values) or 'Functions' which take one or more values and return another.

In my implimentation all nodes take and return floats as arguments so it doesn't matter how much you mix things up, no node gets presented with data it can't cope with.

Here's a simple node that adds together its two inputs:

&lt;uscript&gt;
//-----------------------------------------------------------
// arithmetic addition function
//-----------------------------------------------------------
class GPFplus extends GPnode;


function float evaluate()
{
  return( children[0].evaluate() + children[1].evaluate());
}

function string makemytoken()
{
  return(&quot;+&quot;);
}


DefaultProperties
{
 childcount=2
}

&lt;/uscript&gt;

It extends GPnode which is the base class of all the nodes and includes lots of baggage to be explained later, for now just notice that the nodes below it in the parse tree are referenced by the children[] array and that the evaluate method is called on these children in order to get the values that need to be added together. This is the basic magic, all the objects in the tree are linked together and control flows down the branches until something that actually returns a value is evaluated. Some nodes are conditional and branches get evaluated or not depending on conditions... in this way we can produce a program that actually varies its behavior according to conditions, unlike any of the simple examples in the tutorial linked to above which are more like equations than anything we'd call 'code'.

As an example here's evaluate for the 'less than' node:

&lt;uscript&gt;

function float evaluate()
{
  local float arg1,arg2;
  arg1=children[0].evaluate();
  arg2=children[1].evaluate();
  if(arg1&lt;arg2) return(children[2].evaluate());
  else
    return(children[3].evaluate());
}

&lt;/uscript&gt;

Notice how sometimes children[2] gets evaluated and other times it's children[3] that gets to see some action.

Now in order to get any of this to work we need a way of storing the tree so it can be passed around and manipulated, this is where makemytoken() comes in, its job is to return the string representation of that node... pretty simple here but nodes which hold values need something more... here's evaluate and makemytoken for the 'constant' terminal node:

&lt;uscript&gt;

var float val;

function float evaluate()
{
    return(val);
}

function string makemytoken()
{
  return(&quot;K&quot;$val);
}

&lt;/uscript&gt;

As you can see I use the character K to flag a constant and then append the value to is using uscripts really rather useful built in type conversions.

Enough specifics, I hope that conveys the gist, here's the core GPnode code in it's glory:

&lt;uscript&gt;

//-----------------------------------------------------------
// Genetic Programming parse tree node root class
//-----------------------------------------------------------
class GPnode extends Actor;


Var int Childcount;
var GPnode children[4], parent;
var int childnum, depth; // self = parent.chilren[childnum]
var string mytoken;
var actor mypawn;            // might not be always be a pawn, hence type = actor for now
var const string terminators, functions;
var const string alltypes;


function float evaluate()
{
  return(children[0].evaluate());
}


&lt;/uscript&gt;

Variables and a very empty evaluate method.

Now more recursion: this is how the tree gets written out as a string: the node writes it's own token to the string then calls writetostring on its children, those children in turn get their children to write a token to the string and so on... somehow satisfyingly cool to someone like myself who's never been beyond a simple recursive factiorial function before :)

&lt;uscript&gt;

function WriteToString( out string genome )
{
 local int i;
 genome = genome$MakeMyToken();
 if(childcount == 0) return;
 else
  {
    for(i=0;i&lt;childcount;i++)
     {
       children[i].WriteToString(genome);
     }
  }
}

function string makemytoken()
{
//log(&quot;makemytoken called on &quot;$self);
// null token for base class, make this return the string that represents
// any subclass (mostly one char but constant terminators need to write out
// their value forinstance)
return(&quot;&quot;);
}









&lt;/uscript&gt;

Notice also cunning use of an 'out' declaration there so all that needs to be done to create the genome string is simply call WriteToString(s) on the root node of the tree and as if by magic, S gets an encoded version of the object tree written to it.. by now I'm really starting to grock recursion properly and feel like I'm on a run, the elegence of these objects all describing themselves is appealing but in the background I can't help wondering if it all might fall apart somehow... 

Doubts or not, this is how most of the functionality has shaped up, simply call a method on the root node and all else follows for various tree manipulation tasks.

Now having written this string we neeed a way of reading it back in and creating an object tree out of it... so let's go all recursive again and we have the imaginatively named:

&lt;uscript&gt;
Function ReadFromString( out string genome)
{
  local int i;
  local string char;
  local GPnode node;
  for ( i =0; i&lt;childcount;i++)
  {
    // eat and analyse first (leftmost) char of string
    
    char = left(genome,1);
    genome = right(genome,len(genome)-1);
    node = addchild( char,i);
    node.ReadFromString(genome);
 }
}

&lt;/uscript&gt;

So basically you start by spawning a gpnode as the root, feed it the string of gobbledegook generated by writetostring and it reads (and discards) the first character, spawns the appropriate node actor, makes that its first child and passes the rest of the string to it so it can make any children it might need in turn... and so it goes on down the tree.

Addchild is a big switch that takes care of spawning the right sort of node type according to the character token that has been read in:

&lt;uscript&gt;


function gpnode addchild(string childtype, int i)
{
  local class&lt;actor&gt;  childclass;
  local gpnode node;

   switch(childtype)
   {
    // functions first
      case &quot;+&quot;:
          childclass = class'GPFplus';
          break;
      case &quot;-&quot;:
          childclass = class'GPFminus';
          break;
      case &quot;*&quot;:
          childclass = class'GPFmultiply';
          break;
      case &quot;%&quot;:
          childclass = class'GPFsafeDivide';
          break;
      case &quot;&lt;&quot;:
          childclass = class'GPFlessThan';
          break;
      case &quot;Q&quot;:
          childclass = class'GPFSqrt';
          break;
      case &quot;N&quot;:
          childclass = class'GPFMin';
          break;
      case &quot;X&quot;:
          childclass = class'GPFMax';
          break;
      // then the terminators
      case &quot;R&quot;:
          childclass = class'GPFrightTurn';
          break;
      case &quot;L&quot;:
          childclass = class'GPFleftTurn';
          break;
      case &quot;K&quot;:
          childclass = class'GPTconstant';
          break;
      case &quot;A&quot;:
          childclass = class'GPTlookAhead';
          break;
      case &quot;B&quot;:
          childclass = class'GPTlookAheadRight';
          break;
      case &quot;C&quot;:
          childclass = class'GPTlookRight';
          break;
      case &quot;D&quot;:
          childclass = class'GPTlookBackRight';
          break;
      case &quot;E&quot;:
          childclass = class'GPTlookBack';
          break;
      case &quot;F&quot;:
          childclass = class'GPTlookBackLeft';
          break;
      case &quot;G&quot;:
          childclass = class'GPTlookLeft';
          break;
      case &quot;H&quot;:
          childclass = class'GPTlookAheadLeft';
          break;
      default:
          log( &quot; *gennode* Uh Oh! unknown token! &quot;$childtype);
          break;
    }
   // log(&quot; childclass = &quot;$childclass);
    node = gpnode( spawn(childclass));
    children[i]=node;
    node.mypawn = mypawn;
    node.parent=self;
    node.childnum=i;
    node.depth=depth+1;
    return(node);
}

&lt;/uscript&gt;

... and the sands of time draw a close to the first session editing this page... things are already a lot clearer in my head thanks to explaining a little to you, dear reader... till the next time I leave you with the remainder of the gpnode class which deals with things like growing random sub trees and other housekeeping. You can view the rest of the classes so far on CVS at the home of UTron on sourcefore here: [https://sourceforge.net/projects/utron/] click on 'browse CVS' and look for classes in the package 'UTron' with names beginning with GP.

&lt;uscript&gt;



function RandomGrow ( int depth, int maxdepth )
{
local int i,j,r;
local string char;
local GPnode node;
  //log(&quot; random grow called on &quot;$self@&quot;depth = &quot;$depth);
  for ( i =0; i&lt;childcount;i++)
  {
   //log(&quot; randomgrow on &quot;$self$&quot;choosing child&quot;$i);
    if(depth == maxdepth) {
     // log(&quot;max depth reached&quot;);
      char = mid(terminators,rand(len(terminators)),1);
  //    log(&quot;char = &quot;$char);
      node = addchild(char,i);
    //  log(&quot;new terminator node = &quot;$node);
    }
    else
      {
       if(depth &lt;4) char = mid(functions,rand(len(functions)),1); // add a bit of depth to start with for testing
        else char = mid(alltypes,rand(len(alltypes)),1);
      // log(&quot;char = &quot;$char);
       node = addchild( char,i);
      // log(&quot;new node = &quot;$node);
       if(node.Childcount &gt;0)  node.RandomGrow(depth+1,maxdepth);
      }
  }

}

&lt;/uscript&gt;

RandomGrow is the function that creates random trees for seeding the initial population and for use in the genetic 'mutation' operation too. Note the plentiful commented out log statments... no more than curious fossils now, they were useful in the extreme when debugging this stuff, a comment after every line is usually a sign that I was tracking down an accessed none... I really should get round to deleting them :)

Since there are currently quite a few more terminal nodes defined that there are functions the tree had a habit of being very small most of the time so you'll notice that I make sure that all nodes up to depth 4 are chosen from the set of functions in order to give it a bit of depth... strictly speaking this is biasing what should be a totally random process, the fitness selection and evolution should take care of any runts, so this will probably go once things are fully set up. For now though it's a handy feature for testing.

Sometimes we might need to prune off the branch of a tree before replacing it with something else (like a branch chosen randomly from a tree that performs well at our chosen task, or just another random growth when mutating ) so the prune function recursively destroys nodes below the one on which it is first called.

It still feels a little crufty, that first check on childcount should be redundant really as the parent of any nodes with childcount == 0 will destroy them so that will go soon methinks. In fact a more elegant system would have terminal nodes destroy themselves but at the time I wasn't confident that a function in a node that called that nodes destroy() function  would actually return, so nodes destroy their children instead (after having called prune on child nodes to ensure that their children get destroyed in turn ).

&lt;uscript&gt;

function prune()    // remove objects below this node
{
  local int i;
  if(childcount == 0 ) return;
  else
    for(i=0;i&lt;childcount;i++)
      if(children[i].Childcount==0) children[i].Destroy();
        else
           {
             children[i].prune();
             children[i].Destroy();
             children[i]=none;
           }
  return;
}

&lt;/uscript&gt;

All of the tree manipulation functions used in creating new trees from an exisiting one need to chose a node at random and then do stuff to it. So the two functions below are used to:
# Count the nodes in the tree so that correct range can be used when a random number is generated to pick a node.
# Actually return a reference to that random node

&lt;uscript&gt;
function countnodes(out int nodecount)
{
 local int i;
 //recursively count nodes in tree below this one
 nodecount ++;
 for (i=0;i&lt;childcount;i++)  children[i].countnodes(nodecount);
 return;
}

function gpnode findnode(out int nodenum) 
{
  local int i;
  local gpnode result;
  nodenum --;
  if(nodenum ==0) return(self);
  else
    {
       for (i=0;i&lt;childcount;i++)
         {
           result = children[i].findnode(nodenum);
           if(result != none)
              return(result);
         }
       return(none);
    }
}


&lt;/uscript&gt;

last but not least, cloneme() spawns a duplicate of a node and all the tree below it... yet more recursive majick :)

&lt;uscript&gt;

function gpnode cloneme()
{
  // clone this object, used recursively to duplicate subtrees
  local int i;
  local gpnode newnode;

  newnode = spawn(class);
  for(i=0;i&lt;childcount;i++)
    newnode.children[i] = children[i].cloneme();
    newnode.mypawn=mypawn;
  return(newnode);
}

&lt;/uscript&gt;

The most interesting things in the deafult properties are the strings which are used to hold lists of the tokens of the different types of nodes. Add to these when new nodes are made (my current one character per token scheme is nice and simple and I reckon if you find yourself running out of characters as node types undergo runaway expansion you need to think again about how much control you're willing to hand over to the evolution process... stick to minimal building blocks and let complexity sort itself out... another lesson from mr Turing :) )

&lt;uscript&gt;

DefaultProperties
{
DrawType=DT_none
bCollideWorld=false
bCollideActors=false
bProjtarget=false
childcount=1
Terminators=&quot;RLKABCDEFGH&quot;
AllTypes=&quot;+-*%&lt;RLKABCDEFGHQNX&quot;
functions=&quot;+-*%&lt;QNX&quot;
}

&lt;/uscript&gt;

So there you have it, the core node class. But for this to do any good we need a way of storing 'genes' and keeping track of which ones are doing well at our trials, as well as performing the actual 'breeding' and mutation of those high performers. Find the class that does this and further ramblings over at:

[[Legacy:Genetic Programming/Genes|Genetic Programming/Genes]]

==Your Comments Welcome ==

'''DJPaul:''' Blimey.

'''Zedsquared'''  heh!  I'll take that as a good 'Blimey' then ;) food for thought I hope?

'''Chazums:''' Strangely enough, just stumbled onto the idea of using this kind of thing for AI today.  Nicely written walk through, makes things clearer in my mind too.

'''Zedsquared''' Cheers Chazums, glad my explanations make some sense to you, here's a good link to a page full of such goodies (the whole site is good for AI too) [http://www.gameai.com/genetics.html GameAi.com]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GeniusDex</title>
    <id>1316</id>
    <revision>
      <id>3357</id>
      <timestamp>2005-01-14T03:30:13Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==About Me ==

I'm GeniusDex, Dutch and 14 years old. I'm a very n00b at Unreal Script, but i'm surely not at mIRC scripting :)

==My Unreal Wiki mIRC Scripts ==

My mIRC scripts for the Unreal Wiki community.

If you find any bugs you can post them at the bottom of this section, there's a bug section over there.

===URL / Search script (bots) ===

I just finished a nice Unreal Wiki URL / Search script for bots. You can download it from http://geniusdex.endoria.net/zooi/uwiki.mrc

New version online, much cleaner search code :) Removed double error checking and such, and also rewritten !wiki for the urls.

====Known Issues ====

None yet

===BUGS ===

I HATE bugs in my scripts. Found any? post them here :)

==Guest Book ==

'''EntropicLqd:''' Hi, and welcome to the Wiki.  I win - even though I'm not really here :)

'''GeniusDex:''' Thanx :) (When i finish a script you can see it on the IRC_Scripts page ;), but not before it's finished :))

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup: Win what entropic? O_o

'''Wormbo:''' Everyone's a winner, baby! ;) Hi and welcome to the Wiki, GeniusDex. please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''GeniusDex:''' Ok Wormbo :) Done that :P

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3358</id>
      <timestamp>2005-01-13T23:54:04Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gerco</title>
    <id>1317</id>
    <revision>
      <id>3359</id>
      <timestamp>2002-11-01T20:01:18Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>gu hi jo</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Gerco:''' Alright, I did that, I didn't know it existed.

'''ZxAnPhOrIaN:''' It does exist, but i dont! :) (jk) Anyway, welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3360</id>
      <timestamp>2002-10-31T22:03:44Z</timestamp>
      <contributor>
        <ip>Gerco</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Gerco:''' Alright, I did that, I didn't know it existed.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Getting Started In UnrealScript</title>
    <id>1311</id>
    <revision>
      <id>3346</id>
      <timestamp>2003-05-02T13:56:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is superseded by [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]. 

It will be deleted as soon as we're all satisfied the new page has all the material from here &amp; all the links are changed :)

----

Some rough notes of things to mention:

* basic syntax features: [[Legacy:Function Syntax|functions]], [[Legacy:Variable Syntax|variables]], [[Legacy:Flow Syntax|conditional execution of code &amp; loops]], [[Legacy:Special UnrealScript Keywords|special keywords]] like None, Self, etc.
* lack of an &quot;entry point&quot;. Simple classes like [[Legacy:Mutator|Mutator]] maybe?
* inheritance, link to [[Legacy:Object Oriented Programming Overview|Object Oriented Programming Overview]]

==Scripting Environment==

First of all, although you can, you don't want to use UnrealEd for coding.  It's great for making levels, but really inferior for coding.  Instead, by far the easiest way is to use an editor such as [http://www.wotgreal.com WOTgreal] or [http://www.midnightinteractive.com/VUC/ Visual UC++] (comes with UT2003 as &quot;UDE&quot;), they have great Graphical User Interfaces for editing and compiling. Also, if there are any errors, they will open the source file and move the cursor to that line. Really handy. 

A simple stand-alone way to compile UnrealScript projects is [[Legacy:UMake|UMake]].  It provides similar features as those integrated development environments mentioned above, but assumes that you use your own (favorite) text editor to create and edit your sources.

The original way was to open up a command prompt/DOS window, cd into your UnrealTournament\System or UT2003\System directory, delete the .u file for your project and any project that depends on it, and type &quot;ucc make&quot;. (see [[Legacy:Compiling With UCC|Compiling With UCC]]).

However, if all of the above has already scared you then you could look at the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] and see if that is less scary.  It's going to do everything by hand and the long way without using any of the tools mentioned above, but, will be enough to get you going.

==Extract Source Code==

===Downloading then Official Sources===

Go to [[Legacy:Class Tree|Class Tree]] and download the UnrealScript sources of the predefined classes available in UT2003; that's the base you'll be creating your projects on.

===Extracting the Sources Yourself===

Otherwise, you do need to do one thing in UnrealEd however: Extract the source code that comes with the Unreal games yourself.  That's right, all Unreal games come with full source to the UnrealScript parts.  To get it out, start up UnrealEd, click on the little chess pawn (the [[Legacy:Actor  Classes|Actor  Classes]] browser), and select &quot;Export All&quot; from the menu.  Then close UnrealEd and never open it again for coding.  :)

Note that for [[Legacy:UT2003|UT2003]] you should install the latest patch first. UnrealEd 3 in the unpatched retail version has problems with extracting classes from certain packages and the patch at least fixes the crash, but the exporter still has problems exporting the complete code for some classes. Especially the exported GUI classes are almost worthless because important information is missing.

The first tutorial you should read is [[Legacy:Mod Authoring|Mod Authoring]] by Brandon Reinhart. (Keep in mind that it is written for pre-UT2003 builds of the Unreal Engine, so some things have to be &quot;translated&quot; manually to UT2003 syntax and classes. See also [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]].)

Some other good tutorials are RegularX' [[Legacy:UTutes|UTutes]]. He talks about basic [[Legacy:OOP|OOP]], compiling code for UT2003 and how to code simple mutators.

In UnrealScript, like most Object Oriented programming (and unlike Quake or Half-Life coding), you never change something that exists.  You really don't want to change the code that comes with the game, since that will change all versions of the game and all mods, and most people don't want that. (Not to mention that this will break network compatibility.)  Instead, when you want to change something in a class, you create your own version of the class, then get the game to use your version instead of the built in version.  How you get it to use the new version depends pretty heavily on which class it is.

==Related Topics==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

----

[[:Category:Legacy Tutorial]]

----

This page and [[Legacy:UTute1|UTute1]] need merging - maybe call it [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3347</id>
      <timestamp>2003-04-28T19:27:39Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Some rough notes of things to mention:

* basic syntax features: [[Legacy:Function Syntax|functions]], [[Legacy:Variable Syntax|variables]], [[Legacy:Flow Syntax|conditional execution of code &amp; loops]], [[Legacy:Special UnrealScript Keywords|special keywords]] like None, Self, etc.
* lack of an &quot;entry point&quot;. Simple classes like [[Legacy:Mutator|Mutator]] maybe?
* inheritance, link to [[Legacy:Object Oriented Programming Overview|Object Oriented Programming Overview]]

==Scripting Environment==

First of all, although you can, you don't want to use UnrealEd for coding.  It's great for making levels, but really inferior for coding.  Instead, by far the easiest way is to use an editor such as [http://www.wotgreal.com WOTgreal] or [http://www.midnightinteractive.com/VUC/ Visual UC++] (comes with UT2003 as &quot;UDE&quot;), they have great Graphical User Interfaces for editing and compiling. Also, if there are any errors, they will open the source file and move the cursor to that line. Really handy. 

A simple stand-alone way to compile UnrealScript projects is [[Legacy:UMake|UMake]].  It provides similar features as those integrated development environments mentioned above, but assumes that you use your own (favorite) text editor to create and edit your sources.

The original way was to open up a command prompt/DOS window, cd into your UnrealTournament\System or UT2003\System directory, delete the .u file for your project and any project that depends on it, and type &quot;ucc make&quot;. (see [[Legacy:Compiling With UCC|Compiling With UCC]]).

However, if all of the above has already scared you then you could look at the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] and see if that is less scary.  It's going to do everything by hand and the long way without using any of the tools mentioned above, but, will be enough to get you going.

==Extract Source Code==

===Downloading then Official Sources===

Go to [[Legacy:Class Tree|Class Tree]] and download the UnrealScript sources of the predefined classes available in UT2003; that's the base you'll be creating your projects on.

===Extracting the Sources Yourself===

Otherwise, you do need to do one thing in UnrealEd however: Extract the source code that comes with the Unreal games yourself.  That's right, all Unreal games come with full source to the UnrealScript parts.  To get it out, start up UnrealEd, click on the little chess pawn (the [[Legacy:Actor  Classes|Actor  Classes]] browser), and select &quot;Export All&quot; from the menu.  Then close UnrealEd and never open it again for coding.  :)

Note that for [[Legacy:UT2003|UT2003]] you should install the latest patch first. UnrealEd 3 in the unpatched retail version has problems with extracting classes from certain packages and the patch at least fixes the crash, but the exporter still has problems exporting the complete code for some classes. Especially the exported GUI classes are almost worthless because important information is missing.

The first tutorial you should read is [[Legacy:Mod Authoring|Mod Authoring]] by Brandon Reinhart. (Keep in mind that it is written for pre-UT2003 builds of the Unreal Engine, so some things have to be &quot;translated&quot; manually to UT2003 syntax and classes. See also [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]].)

Some other good tutorials are RegularX' [[Legacy:UTutes|UTutes]]. He talks about basic [[Legacy:OOP|OOP]], compiling code for UT2003 and how to code simple mutators.

In UnrealScript, like most Object Oriented programming (and unlike Quake or Half-Life coding), you never change something that exists.  You really don't want to change the code that comes with the game, since that will change all versions of the game and all mods, and most people don't want that. (Not to mention that this will break network compatibility.)  Instead, when you want to change something in a class, you create your own version of the class, then get the game to use your version instead of the built in version.  How you get it to use the new version depends pretty heavily on which class it is.

==Related Topics==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

----

[[:Category:Legacy Tutorial]]

----

This page and [[Legacy:UTute1|UTute1]] need merging - maybe call it [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3348</id>
      <timestamp>2003-05-02T13:55:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is superceded by [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]. 

It will be deleted as soon as we're all satisfied the new page has all the material from here &amp; all the links are changed :)

----

Some rough notes of things to mention:

* basic syntax features: [[Legacy:Function Syntax|functions]], [[Legacy:Variable Syntax|variables]], [[Legacy:Flow Syntax|conditional execution of code &amp; loops]], [[Legacy:Special UnrealScript Keywords|special keywords]] like None, Self, etc.
* lack of an &quot;entry point&quot;. Simple classes like [[Legacy:Mutator|Mutator]] maybe?
* inheritance, link to [[Legacy:Object Oriented Programming Overview|Object Oriented Programming Overview]]

==Scripting Environment==

First of all, although you can, you don't want to use UnrealEd for coding.  It's great for making levels, but really inferior for coding.  Instead, by far the easiest way is to use an editor such as [http://www.wotgreal.com WOTgreal] or [http://www.midnightinteractive.com/VUC/ Visual UC++] (comes with UT2003 as &quot;UDE&quot;), they have great Graphical User Interfaces for editing and compiling. Also, if there are any errors, they will open the source file and move the cursor to that line. Really handy. 

A simple stand-alone way to compile UnrealScript projects is [[Legacy:UMake|UMake]].  It provides similar features as those integrated development environments mentioned above, but assumes that you use your own (favorite) text editor to create and edit your sources.

The original way was to open up a command prompt/DOS window, cd into your UnrealTournament\System or UT2003\System directory, delete the .u file for your project and any project that depends on it, and type &quot;ucc make&quot;. (see [[Legacy:Compiling With UCC|Compiling With UCC]]).

However, if all of the above has already scared you then you could look at the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] and see if that is less scary.  It's going to do everything by hand and the long way without using any of the tools mentioned above, but, will be enough to get you going.

==Extract Source Code==

===Downloading then Official Sources===

Go to [[Legacy:Class Tree|Class Tree]] and download the UnrealScript sources of the predefined classes available in UT2003; that's the base you'll be creating your projects on.

===Extracting the Sources Yourself===

Otherwise, you do need to do one thing in UnrealEd however: Extract the source code that comes with the Unreal games yourself.  That's right, all Unreal games come with full source to the UnrealScript parts.  To get it out, start up UnrealEd, click on the little chess pawn (the [[Legacy:Actor  Classes|Actor  Classes]] browser), and select &quot;Export All&quot; from the menu.  Then close UnrealEd and never open it again for coding.  :)

Note that for [[Legacy:UT2003|UT2003]] you should install the latest patch first. UnrealEd 3 in the unpatched retail version has problems with extracting classes from certain packages and the patch at least fixes the crash, but the exporter still has problems exporting the complete code for some classes. Especially the exported GUI classes are almost worthless because important information is missing.

The first tutorial you should read is [[Legacy:Mod Authoring|Mod Authoring]] by Brandon Reinhart. (Keep in mind that it is written for pre-UT2003 builds of the Unreal Engine, so some things have to be &quot;translated&quot; manually to UT2003 syntax and classes. See also [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]].)

Some other good tutorials are RegularX' [[Legacy:UTutes|UTutes]]. He talks about basic [[Legacy:OOP|OOP]], compiling code for UT2003 and how to code simple mutators.

In UnrealScript, like most Object Oriented programming (and unlike Quake or Half-Life coding), you never change something that exists.  You really don't want to change the code that comes with the game, since that will change all versions of the game and all mods, and most people don't want that. (Not to mention that this will break network compatibility.)  Instead, when you want to change something in a class, you create your own version of the class, then get the game to use your version instead of the built in version.  How you get it to use the new version depends pretty heavily on which class it is.

==Related Topics==
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

----

[[:Category:Legacy Tutorial]]

----

This page and [[Legacy:UTute1|UTute1]] need merging - maybe call it [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ghost3021</title>
    <id>1371</id>
    <revision>
      <id>3477</id>
      <timestamp>2005-03-18T04:29:56Z</timestamp>
      <contributor>
        <ip>Ghost3021</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well im Ghost3021 alot of peoples ask me what 3021 stands for, and i say: its counting down from 3 to 0 except its scrambled so i can remember it. ;)

I've been mapping for just over a year now, and have coded [[Legacy:UScript|UScript]] for 9 monthsish.

Though my first 10 months of mapping were spent in UEd3, i have been finding myself more fond of UT99's UEd2, the lack of support for high poly meshes mean that my sucky UT2k4 maps look 1337 on a 7-year old game. ;)

I am currenty animating for [http://MVPB.net MVPB], and mapping in sorts for [[Legacy:T1|T1]]'s slaughter.

----

[[:Category:Legacy Personal Page]]

==Comments==

'''Ghost3021:'''Well, here I am. Consider me a newbie to the wiki, I hope over time others will learn as I have over the course of my &quot;Great UEd Journey&quot; :p
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3478</id>
      <timestamp>2005-03-18T04:28:25Z</timestamp>
      <contributor>
        <ip>Ghost3021</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well im Ghost3021 alot of peoples ask me what 3021 stands for, and i say: its counting down from 3 to 0 except its scrambled so i can remember it. ;)

I've been mapping for just over a year now, and have coded [[Legacy:UScript|UScript]] for 9 monthsish.

Though my first 10 months of mapping were spent in UEd3, i have been finding myself more fond of UT99's UEd2, the lack of support for high poly meshes mean that my sucky UT2k4 maps look 1337 on a 7-year old game. ;)

I am currenty animating for [http://MVPB.net MVPB], and mapping in sorts for [[Legacy:T1|T1]]'s slaughter.

----

[[:Category:Legacy Personal Page]]

http://wiki.beyondunreal.com/wiki/Ghost3021/Rants

PLZ read.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ghost3021/Rants</title>
    <id>1372</id>
    <revision>
      <id>3479</id>
      <timestamp>2005-12-29T01:54:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Rant1: &quot;OldSkool&quot;===

Well, with UEngine3 coming soon, and more and more 'profesional' mod-teams appearing for UT2k4, i can't help but glace back at my monster 10G UnrealTournament folder and wonder: &quot;Why the heck do I find myself playing ONP, SevenB, and Unreal1 over and over again? And then I answer myself; it's because:

# They are WAY more fun than RedOrchestra or AlienSwarm...or CarBall,...or any of those 'modern''profesional' mods that keep on appearing for UT2k4...
# Graphics. I like the 'sucky' [WetTextures] WAY more than [FluidSurfaceInfo]s; at high res and color they get a never-ending infinate detain, just zoom into a puddle at 1280*1024 32 bit to see what i mean...and the texturing is way...cooler...more 'sci-fi' than UT2k4...
# Build. The ''architecture'' looks...so...smoooth...so much better than any LM'ed mesh can (lightmapped). Everything was soo....dynamic...it was beautiful just to '''look''' at...
# Standards. If you make a map for U2k4, then it'll be rated a 0 in no time if you dont have:
#* Custom meshes
#* Custom Scripts
#* Custom Sounds
#* Custom Textures
#* Custom Music

If you don't have any of the above, its a newb map. For UT99, however, all you need is a :

Complex Mover Brush that you made yourself.

THATS IT! JUST A MOVER!!!! THEY WERE SOOO HARD AND SOOO FUN TO MAKE THAT THEY '''WERE''' THE STANDARD! :-(

also, ut2k4 has NO singleplayer, NO coop, NO INVENTORY SYSTEM, the weapons take 6 HOURS TO MAKE, and whereas in ut99, it just took 15 mins....

ok im done here, i have recently dedicated myself to modding for OldSkool Amp'd , i hope others follow in my footsteps...

Plz comment ...here.

==Discussion==

'''T1:''' Whatever happened to mapping for Slaughter? Weapons don't take 6 hours to make in UE2.5, they take 3 minutes. And UT2k4 has plenty of single player. It's called &quot;BOTS&quot;. Inventory system? What was the most recent first person shooter I've seen that had one of those??? DXIW? And Alien Swarm is DIFFERENT kind of fun than UT99. I play both very often.

'''GTD-Carthage:''' My computer can play UT2k4 properly but can't mod as my specs can't handle it. UT shows a different approach in &quot;style&quot; as well as UT2k4. I'm forever gonna be a UT99-man.

'''El Muerte:''' the inventory system is still pretty much in tact in UT2004, it's just not really used.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3480</id>
      <timestamp>2005-04-08T08:49:22Z</timestamp>
      <contributor>
        <ip>210.213.199.41.pldt.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Rant1: &quot;OldSkool&quot;===

Well, with UEngine3 coming soon, and more and more 'profesional' mod-teams appearing for UT2k4, i can't help but glace back at my monster 10G UnrealTournament folder and wonder: &quot;Why the heck do I find myself playing ONP, SevenB, and Unreal1 over and over again? And then I answer myself; it's because:

# They are WAY more fun than RedOrchestra or AlienSwarm...or CarBall,...or any of those 'modern''profesional' mods that keep on appearing for UT2k4...
# Graphics. I like the 'sucky' [WetTextures] WAY more than [FluidSurfaceInfo]s; at high res and color they get a never-ending infinate detain, just zoom into a puddle at 1280*1024 32 bit to see what i mean...and the texturing is way...cooler...more 'sci-fi' than UT2k4...
# Build. The ''architecture'' looks...so...smoooth...so much better than any LM'ed mesh can (lightmapped). Everything was soo....dynamic...it was beautiful just to '''look''' at...
# Standards. If you make a map for U2k4, then it'll be rated a 0 in no time if you dont have:
#* Custom meshes
#* Custom Scripts
#* Custom Sounds
#* Custom Textures
#* Custom Music

If you don't have any of the above, its a newb map. For UT99, however, all you need is a :

Complex Mover Brush that you made yourself.

THATS IT! JUST A MOVER!!!! THEY WERE SOOO HARD AND SOOO FUN TO MAKE THAT THEY '''WERE''' THE STANDARD! :-(

also, ut2k4 has NO singleplayer, NO coop, NO INVENTORY SYSTEM, the weapons take 6 HOURS TO MAKE, and whereas in ut99, it just took 15 mins....

ok im done here, i have recently dedicated myself to modding for OldSkool Amp'd , i hope others follow in my footsteps...

Plz comment ...here.

==Comment Box==

'''T1:''' Whatever happened to mapping for Slaughter? Weapons don't take 6 hours to make in UE2.5, they take 3 minutes. And UT2k4 has plenty of single player. It's called &quot;BOTS&quot;. Inventory system? What was the most recent first person shooter I've seen that had one of those??? DXIW? And Alien Swarm is DIFFERENT kind of fun than UT99. I play both very often.

'''GTD-Carthage:''' My computer can play UT2k4 properly but can't mod as my specs can't handle it. UT shows a different approach in &quot;style&quot; as well as UT2k4. I'm forever gonna be a UT99-man.</text>
    </revision>
    <revision>
      <id>3481</id>
      <timestamp>2005-04-08T13:23:16Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Rant1: &quot;OldSkool&quot;===

Well, with UEngine3 coming soon, and more and more 'profesional' mod-teams appearing for UT2k4, i can't help but glace back at my monster 10G UnrealTournament folder and wonder: &quot;Why the heck do I find myself playing ONP, SevenB, and Unreal1 over and over again? And then I answer myself; it's because:

# They are WAY more fun than RedOrchestra or AlienSwarm...or CarBall,...or any of those 'modern''profesional' mods that keep on appearing for UT2k4...
# Graphics. I like the 'sucky' [WetTextures] WAY more than [FluidSurfaceInfo]s; at high res and color they get a never-ending infinate detain, just zoom into a puddle at 1280*1024 32 bit to see what i mean...and the texturing is way...cooler...more 'sci-fi' than UT2k4...
# Build. The ''architecture'' looks...so...smoooth...so much better than any LM'ed mesh can (lightmapped). Everything was soo....dynamic...it was beautiful just to '''look''' at...
# Standards. If you make a map for U2k4, then it'll be rated a 0 in no time if you dont have:
#* Custom meshes
#* Custom Scripts
#* Custom Sounds
#* Custom Textures
#* Custom Music

If you don't have any of the above, its a newb map. For UT99, however, all you need is a :

Complex Mover Brush that you made yourself.

THATS IT! JUST A MOVER!!!! THEY WERE SOOO HARD AND SOOO FUN TO MAKE THAT THEY '''WERE''' THE STANDARD! :-(

also, ut2k4 has NO singleplayer, NO coop, NO INVENTORY SYSTEM, the weapons take 6 HOURS TO MAKE, and whereas in ut99, it just took 15 mins....

ok im done here, i have recently dedicated myself to modding for OldSkool Amp'd , i hope others follow in my footsteps...

Plz comment ...here.

==Comment Box==

'''T1:''' Whatever happened to mapping for Slaughter? Weapons don't take 6 hours to make in UE2.5, they take 3 minutes. And UT2k4 has plenty of single player. It's called &quot;BOTS&quot;. Inventory system? What was the most recent first person shooter I've seen that had one of those??? DXIW? And Alien Swarm is DIFFERENT kind of fun than UT99. I play both very often.

'''GTD-Carthage:''' My computer can play UT2k4 properly but can't mod as my specs can't handle it. UT shows a different approach in &quot;style&quot; as well as UT2k4. I'm forever gonna be a UT99-man.

'''El Muerte:''' the inventory system is still pretty much in tact in UT2004, it's just not really used.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ghosts</title>
    <id>1308</id>
    <revision>
      <id>3339</id>
      <timestamp>2004-09-21T20:04:24Z</timestamp>
      <contributor>
        <ip>Adsl-209-8-84.asm.bellsouth.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here's how to make a ghost for your level. Just download [http://www.geocities.com/r_astleyuk/WikiStuff.html The Page with the Zip File] and follow the instructions.  This will be featured in my new and first (probably last too) release for UT

[[Image:Legacy_GhostNoLight.gif|center|The ghost in an area with no lights]]

[[Image:Legacy_GhostLight.jpeg|center|The ghost with the searchlight pointed at it]]

-Icedude-

==Comments ==

'''Tarquin:'''  a few of points, Icedude:
* instead of the info.jpg picture of settings, do this:
*# select the ghost actor in your map
*# copy it
*# paste to a text editor
*# you'll get a list of all the properties that differ from the default. 
*# a bit of editing (or search &amp; replace) will turn it into a Wiki definition list ( with ; : ) for this page
* you can post the instrcutions here too
* the zip with the PCX can hosted here if you like.

'''anonymous'''
*neeto! gota use that in my next level!</text>
    </revision>
    <revision>
      <id>3340</id>
      <timestamp>2002-07-05T16:09:51Z</timestamp>
      <contributor>
        <ip>WebcacheB04a.cache.pol.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here's how to make a ghost for your level. Just download [http://www.geocities.com/r_astleyuk/WikiStuff.html The Page with the Zip File] and follow the instructions.  This will be featured in my new and first (probably last too) release for UT

[[Image:Legacy_GhostNoLight.gif|center|The ghost in an area with no lights]]

[[Image:Legacy_GhostLight.jpeg|center|The ghost with the searchlight pointed at it]]

-Icedude-

==Comments ==

'''Tarquin:'''  a few of points, Icedude:
* instead of the info.jpg picture of settings, do this:
*# select the ghost actor in your map
*# copy it
*# paste to a text editor
*# you'll get a list of all the properties that differ from the default. 
*# a bit of editing (or search &amp; replace) will turn it into a Wiki definition list ( with ; : ) for this page
* you can post the instrcutions here too
* the zip with the PCX can hosted here if you like.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gib</title>
    <id>28371</id>
    <revision>
      <id>40039</id>
      <timestamp>2009-11-15T07:57:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Githianki</title>
    <id>1319</id>
    <revision>
      <id>3363</id>
      <timestamp>2002-12-24T11:02:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Welcome ==

HELP! Apparently cookies were cleared while I was gone and I can't find my bleepin password.  My user number is 2556.  How do I log in to fix this?  I think I created a user called 2556 with an ID of 3??? by mistake.  Yep. Um. Crud.  What do I do? Respond here I guess.

'''Tarquin:''' Just try logging in again &amp;ndash; there's a special [[Legacy:Log In|log in]] page, it's not done at the Preferences page. Do you know your password? If not, I can grab it off the server &amp; mail it to you.

Well. I am back from my trip. Holidays are upon us though so I doubt I'll get to much until the new year.  Just skimming over the tons of new work people have done and grabbing some files to try over the holidays, like Spatial Fear and some of the new maps for UT2k3. Patches too. Updated the Milkshape page.  I never got around to thinking about wiki organization but I have some neat stuff lined up on the modelling front.  Enjoy the holidays!

-Dec 23, 2002-

----

Wow. So it has been a week I guess and lots of fun adding, editing, etc.  I have left up my original post for my own record.  I have a handle on markup, etc. and gotten a sense of where I can make some decent contributions.  Unfortunately, I am going to be away on a trip for 2 1/2 weeks or so and I am not even at my own machine right now.  That means alot of what I am planning has to wait until I get back in mid-Dec.  Nevertheless, I ought to be able to organize during the down times travelling.  Gotta love index cards. 

So far what I intend on doing is putting up info on getting meshes from Milkshape3D into Unreal/UT/UT2003 and from Wings3D, putting up a player model tutorial for UT based on a model I have been working on (and off) forever, and putting up a tutorial on player models for UT2003.  I have saved lots of material (in progress shots, etc.) for the model I have, but the UT2003 one is going to be from scratch and so will likely take longer and go up in pieces.  I also want to flesh out the [[Legacy:Package Extension Catalog|Package Extension Catalog]] with as much info as I have and can find, try to get all the Unreal Engine Games listed there and on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, and put up all the links I have buried around my computer to forums related to various other  Unreal engine games.

I also intend to give some thought to how the wiki might be better organized to provide info across the various versions.  Right now some of the info is clearly specified as for UT or UT2003 but I think that the whole wiki might need some serious reorganizing if it is to handle the 3 main engine versions (Unreal/UT, UT2003, and Unreal2) as well as be a resource for other games (which I think it should be).  There is so much duplication of effort on the net and in the Unreal community that could be avoided.  I think this wiki could easily become the biggest and best resource for Unreal Engine games on the net even if there are single better tutorials or docs on other sites.  It is ever so close to being that already.

Well that sounds like enough for the rest of this year at least, since it doesn't even include my non-wiki UT projects :).  Truth is I bet I get wiki stuff finished first since it is easy to define what needs to be done for those ideas.  

-Gith-

minor rant&gt; It really sucks that MayaPLE won't run on WinME.  I have long hesitated to upgrade to WinXP since I change around hardware alot (drives mostly).  Also WinXP costs money, needs tons of patches, and really offers me only minimum benefits over a basically stable OS (for me at least). I also don't want to lose out the use of stuff that doesn't work with XP which I gather is a lot.  I'd like the crash protection (it works nice on my friend's comp), the better use of my RAM (I have 768MB, hacked for WinME), and the use of some tools that are WinXP specific (besides MayaPLE) but...  It just seems stramge that Maya would have a Learning Edition and then cut out a large chunk of users who don't have WinXP. I really wanted to try Maya out and it seemed like the production pipeline would be way better than what I have now (which is a mess).  Oh well.  Anybody have advice feel free to comment below under Comments. 

----

My first post (saved for posterity):

This is where I might actually put some stuff. [[Legacy:Wormbo|Wormbo]] was kind enough to welcome me and get me going. [[Legacy:Wiki Markup|Wiki Markup]] is cool stuff. Unreal and all its permutations are VERY cool stuff. Now I have a place on the web that will be easy to update! No website hassles.  I always wanted a full site but wikis are so nice and easy, and most importantly for me (being pressed for time) quick and simple.  I decided the Unreal Wiki is the wiki of choice for me, as its main subject matter is also the main center of gravity for many of my interests and hobbies.  Not only that but wikis also provide room for much else besides, thus I don't feel constrained.  I am not sure I'll actually put up anything besides Unreal related stuff, but I do feel free to.  I also find it nice to join a community of people I have great respect for and whose work I have always admired.  I guess I actually did put something. Well not useful yet but I'll get there. See you around!

----

==Comments ==

==Guestbook ==

'''Wormbo:''' Welcome to the Wiki, Githianki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

Hee. Hi :). You made me a page. Goodie, cause I wasn't exactly sure how to, or actually where from to, if you know what I mean. 

'''Wormbo:''' Play around with [[Legacy:Wiki Markup|Wiki Markup]] on the [[Legacy:Sandbox|Sandbox]] page, you can do some pretty nifty stuff with it. :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3364</id>
      <timestamp>2002-12-24T08:27:10Z</timestamp>
      <contributor>
        <ip>2556</ip>
      </contributor>
      <comment>*ug.screwed up my login. admin help?</comment>
      <text xml:space="preserve">==Welcome ==

HELP! Apparently cookies were cleared while I was gone and I can't find my bleepin password.  My user number is 2556.  How do I log in to fix this?  I think I created a user called 2556 with an ID of 3??? by mistake.  Yep. Um. Crud.  What do I do? Respond here I guess.

Well. I am back from my trip. Holidays are upon us though so I doubt I'll get to much until the new year.  Just skimming over the tons of new work people have done and grabbing some files to try over the holidays, like Spatial Fear and some of the new maps for UT2k3. Patches too. Updated the Milkshape page.  I never got around to thinking about wiki organization but I have some neat stuff lined up on the modelling front.  Enjoy the holidays!

-Dec 23, 2002-

----

Wow. So it has been a week I guess and lots of fun adding, editing, etc.  I have left up my original post for my own record.  I have a handle on markup, etc. and gotten a sense of where I can make some decent contributions.  Unfortunately, I am going to be away on a trip for 2 1/2 weeks or so and I am not even at my own machine right now.  That means alot of what I am planning has to wait until I get back in mid-Dec.  Nevertheless, I ought to be able to organize during the down times travelling.  Gotta love index cards. 

So far what I intend on doing is putting up info on getting meshes from Milkshape3D into Unreal/UT/UT2003 and from Wings3D, putting up a player model tutorial for UT based on a model I have been working on (and off) forever, and putting up a tutorial on player models for UT2003.  I have saved lots of material (in progress shots, etc.) for the model I have, but the UT2003 one is going to be from scratch and so will likely take longer and go up in pieces.  I also want to flesh out the [[Legacy:Package Extension Catalog|Package Extension Catalog]] with as much info as I have and can find, try to get all the Unreal Engine Games listed there and on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, and put up all the links I have buried around my computer to forums related to various other  Unreal engine games.

I also intend to give some thought to how the wiki might be better organized to provide info across the various versions.  Right now some of the info is clearly specified as for UT or UT2003 but I think that the whole wiki might need some serious reorganizing if it is to handle the 3 main engine versions (Unreal/UT, UT2003, and Unreal2) as well as be a resource for other games (which I think it should be).  There is so much duplication of effort on the net and in the Unreal community that could be avoided.  I think this wiki could easily become the biggest and best resource for Unreal Engine games on the net even if there are single better tutorials or docs on other sites.  It is ever so close to being that already.

Well that sounds like enough for the rest of this year at least, since it doesn't even include my non-wiki UT projects :).  Truth is I bet I get wiki stuff finished first since it is easy to define what needs to be done for those ideas.  

-Gith-

minor rant&gt; It really sucks that MayaPLE won't run on WinME.  I have long hesitated to upgrade to WinXP since I change around hardware alot (drives mostly).  Also WinXP costs money, needs tons of patches, and really offers me only minimum benefits over a basically stable OS (for me at least). I also don't want to lose out the use of stuff that doesn't work with XP which I gather is a lot.  I'd like the crash protection (it works nice on my friend's comp), the better use of my RAM (I have 768MB, hacked for WinME), and the use of some tools that are WinXP specific (besides MayaPLE) but...  It just seems stramge that Maya would have a Learning Edition and then cut out a large chunk of users who don't have WinXP. I really wanted to try Maya out and it seemed like the production pipeline would be way better than what I have now (which is a mess).  Oh well.  Anybody have advice feel free to comment below under Comments. 

----

My first post (saved for posterity):

This is where I might actually put some stuff. [[Legacy:Wormbo|Wormbo]] was kind enough to welcome me and get me going. [[Legacy:Wiki Markup|Wiki Markup]] is cool stuff. Unreal and all its permutations are VERY cool stuff. Now I have a place on the web that will be easy to update! No website hassles.  I always wanted a full site but wikis are so nice and easy, and most importantly for me (being pressed for time) quick and simple.  I decided the Unreal Wiki is the wiki of choice for me, as its main subject matter is also the main center of gravity for many of my interests and hobbies.  Not only that but wikis also provide room for much else besides, thus I don't feel constrained.  I am not sure I'll actually put up anything besides Unreal related stuff, but I do feel free to.  I also find it nice to join a community of people I have great respect for and whose work I have always admired.  I guess I actually did put something. Well not useful yet but I'll get there. See you around!

----

==Comments ==

==Guestbook ==

'''Wormbo:''' Welcome to the Wiki, Githianki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

Hee. Hi :). You made me a page. Goodie, cause I wasn't exactly sure how to, or actually where from to, if you know what I mean. 

'''Wormbo:''' Play around with [[Legacy:Wiki Markup|Wiki Markup]] on the [[Legacy:Sandbox|Sandbox]] page, you can do some pretty nifty stuff with it. :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Glass</title>
    <id>1297</id>
    <revision>
      <id>3311</id>
      <timestamp>2006-11-26T12:53:06Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Merged with Making Windows. Redirect to Making Windows to prevent future duplicates on the topic.</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Making Windows|Making Windows]]</text>
    </revision>
    <revision>
      <id>3312</id>
      <timestamp>2006-08-03T19:08:42Z</timestamp>
      <contributor>
        <ip>Wolf Man</ip>
      </contributor>
      <comment>Response to response</comment>
      <text xml:space="preserve">If you're looking for the old UT tutorial, it can be found here: [[Legacy:Making Windows (UT)|Making Windows (UT)]]

==Glass/Window tutorial==

I'll just cover the basics of windows creation: that is to say, how to create a glass-like material and how to make a window using it.

===Creating a texture===

You don't really need anything fancy, a very simple texture will do the trick. It doesn't even have to tile ;) What is more important is the [[Legacy:Alpha Channel|alpha channel]]. It will determine how translucent the windows will be. If you want the windows to &quot;shine&quot; when you walk past them, the alpha channel should not be uniform. For instance:

[[Image:Legacy_ut2k3windows1.jpeg|center|The window texture on the left, and the alpha channel on the right.]]

===Creating the material===

Open UnrealEd, import the texture you just created. You can import it into any package, but the &quot;MyLevel&quot; package is good, as it will cause the materials to be stored inside the level, so it will be easier to distribute your map.

Now you have to create a reflective material. Choose ''File'' -&gt; ''New'' and pick '''Combiner''' in the combo list. You can use any name you want for the material.

In the combiner's properties, set the first material to your use your glass texture. For the second material, use a '''TexEnvMap'''. Ideally it should match your level, but it won't be overly clear anyway so it needn't match exactly. There are a lot of these in CubeMaps.utx, or you can create your own. For the combiners operation, select '''CO_Alphablend_With_Mask''' from the ''CombineOperation'' combo list. The mask material defines the way the two material will blend. Use the glass texture once again (since it contains an alpha channel). You may have to set '''InvertMask''' to ''true''. You should experiment with both settings to see which gives you the effect you desire.

Now we need to make a translucent version of that material. Create a new material, a '''Shader'''. Use the ''combiner'' you just created for the '''Diffuse''' slot and the glass texture for the '''Opacity slot'''.

[[Image:Legacy_ut2k3windows2.jpeg|center|You should have something like this.]]

===Creating the window===

You could use the glass material on a regular brush but it's not the best way to do it, because the BSP takes more time to render. Use your red builder brush to create a rectangular window (128x128x4 for instance), select the glass shader and click on the '''Convert to Static Mesh button''', name it ''Glass_128x128x4'' and save it in ''MyLevel'' or in a custom package.

Now you have a ready-to-use window. You can still resize it with the '''DrawScale3D''' fields. Changes made to the static mesh will affect every instance in your level. Moreover, using a static mesh allows you to turn the windows into [[Legacy:Mover|mover]]s (to make them breakable).

[[Image:Legacy_ut2k3windows3.jpeg|center|The final result.]]

Most of the time windows are too dark, you can fix that easily by setting the '''ScaleGlow''' value to something around ''64'' in the ''Display'' properties of your static meshes. Alternatively you can use the '''Self Illumination''' layer of the Shader material you created.

[http://www.essi.fr/~cortina/wiki/window_files.zip Download the test map]

----

[[:Category:Legacy Mapping]]

----

'''Wolf Man''' - Noob question here: Can't you just make the glass window (I.E 160x160x4), set it's texture to a translucent texture you imported, then set the brush's/Static mesh's Actor/Display/Style (I believe it's listed as ERenderStyle here) to STY_Translucent? That's how I've been doing windows, and it seems to work, though the windows can get a little &quot;tinted&quot;.

'''MythOpus:''' I'm  not sure what you mean but if you make a brush with a translucent texture, once you convert it into a mesh it should stay tranluscent so there's no need to change the meshes DrawStyle.  Also, an easier method would be to size up the red builder brush the way you want your window to look and then simply right click on -it- (without adding it) and converting it into a static mesh.  You can then go to the StaticMesh browser and select your new static mesh and under it's materials, create a new one and set it to your imported translucent texture.  Then you can add the window as many times as you wish without having to mess with it's DefaultProperties.

'''Wolf Man:''' That sounds about right, but I haven't had too much experince with UE (Just started a few days ago). The point I was trying to make was that you don't have to make Combiners or Shaders, just use the orginal, translucent texture. The only reason I changed ERenderStyle was because I didn't know if it would work with just the Texture alone.
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3313</id>
      <timestamp>2006-11-26T04:29:50Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Refactor into Making Windows (UT). Comments anyone...</comment>
      <text xml:space="preserve">If you're looking for the old UT tutorial, it can be found here: [[Legacy:Making Windows (UT)|Making Windows (UT)]]

==Glass/Window tutorial==

I'll just cover the basics of windows creation: that is to say, how to create a glass-like material and how to make a window using it.

===Creating a texture===

You don't really need anything fancy, a very simple texture will do the trick. It doesn't even have to tile ;) What is more important is the [[Legacy:Alpha Channel|alpha channel]]. It will determine how translucent the windows will be. If you want the windows to &quot;shine&quot; when you walk past them, the alpha channel should not be uniform. For instance:

[[Image:Legacy_ut2k3windows1.jpeg|center|The window texture on the left, and the alpha channel on the right.]]

===Creating the material===

Open UnrealEd, import the texture you just created. You can import it into any package, but the &quot;MyLevel&quot; package is good, as it will cause the materials to be stored inside the level, so it will be easier to distribute your map.

Now you have to create a reflective material. Choose ''File'' -&gt; ''New'' and pick '''Combiner''' in the combo list. You can use any name you want for the material.

In the combiner's properties, set the first material to your use your glass texture. For the second material, use a '''TexEnvMap'''. Ideally it should match your level, but it won't be overly clear anyway so it needn't match exactly. There are a lot of these in CubeMaps.utx, or you can create your own. For the combiners operation, select '''CO_Alphablend_With_Mask''' from the ''CombineOperation'' combo list. The mask material defines the way the two material will blend. Use the glass texture once again (since it contains an alpha channel). You may have to set '''InvertMask''' to ''true''. You should experiment with both settings to see which gives you the effect you desire.

Now we need to make a translucent version of that material. Create a new material, a '''Shader'''. Use the ''combiner'' you just created for the '''Diffuse''' slot and the glass texture for the '''Opacity slot'''.

[[Image:Legacy_ut2k3windows2.jpeg|center|You should have something like this.]]

===Creating the window===

You could use the glass material on a regular brush but it's not the best way to do it, because the BSP takes more time to render. Use your red builder brush to create a rectangular window (128x128x4 for instance), select the glass shader and click on the '''Convert to Static Mesh button''', name it ''Glass_128x128x4'' and save it in ''MyLevel'' or in a custom package.

Now you have a ready-to-use window. You can still resize it with the '''DrawScale3D''' fields. Changes made to the static mesh will affect every instance in your level. Moreover, using a static mesh allows you to turn the windows into [[Legacy:Mover|mover]]s (to make them breakable).

[[Image:Legacy_ut2k3windows3.jpeg|center|The final result.]]

Most of the time windows are too dark, you can fix that easily by setting the '''ScaleGlow''' value to something around ''64'' in the ''Display'' properties of your static meshes. Alternatively you can use the '''Self Illumination''' layer of the Shader material you created.

[http://www.essi.fr/~cortina/wiki/window_files.zip Download the test map] [Dead Link]

----

[[:Category:Legacy Mapping]]

----

'''Wolf Man''' - Noob question here: Can't you just make the glass window (I.E 160x160x4), set it's texture to a translucent texture you imported, then set the brush's/Static mesh's Actor/Display/Style (I believe it's listed as ERenderStyle here) to STY_Translucent? That's how I've been doing windows, and it seems to work, though the windows can get a little &quot;tinted&quot;.

'''MythOpus:''' I'm  not sure what you mean but if you make a brush with a translucent texture, once you convert it into a mesh it should stay tranluscent so there's no need to change the meshes DrawStyle.  Also, an easier method would be to size up the red builder brush the way you want your window to look and then simply right click on -it- (without adding it) and converting it into a static mesh.  You can then go to the StaticMesh browser and select your new static mesh and under it's materials, create a new one and set it to your imported translucent texture.  Then you can add the window as many times as you wish without having to mess with it's DefaultProperties.

'''Wolf Man:''' That sounds about right, but I haven't had too much experince with UE (Just started a few days ago). The point I was trying to make was that you don't have to make Combiners or Shaders, just use the orginal, translucent texture. The only reason I changed ERenderStyle was because I didn't know if it would work with just the Texture alone.

----

[[:Category:Legacy Refactor Me]]

'''Fyfe:''' merge with [[Legacy:Making_Windows|Making_Windows]], they are almost identical.

'''Fyfe:''' [[Legacy:Making Windows (UT)|Making Windows (UT)]] looks like a better tutorial, maybe refactoring into there would be better. Comments anyone...
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Global Function</title>
    <id>1327</id>
    <revision>
      <id>3381</id>
      <timestamp>2007-12-21T23:19:58Z</timestamp>
      <contributor>
        <ip>DaWrecka</ip>
      </contributor>
      <comment>* Expanded on the purpose of SetPropertyText, slightly clarified DynamicLoadObject.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] (Methods)}}

The functions listed here are globally available in all classes.  Due to [[Legacy:UnrealScript|UnrealScript]]'s strict object-oriented approach, they're actually methods of the [[Legacy:Object|Object]] class.

Almost all of these functions are declared as native and final (see [[Legacy:Class Syntax|class syntax]]) and most of them are also [[Legacy:Static Function|static function]]s.

See [[Legacy:Vector|vector]], [[Legacy:Rotator|rotator]] and [[Legacy:Quaternion|quaternion]] for functions on those variable types.

See [[Legacy:Global Function (UT)|Global Function (UT)]] for a list of global functions in UT.

==Integer Functions ==
; int Rand (int Max) [static] : Returns a random number ranging from 0 to Max-1.
; int Min (int A, int B) [static] : Returns the lower of the two values.
; int Max (int A, int B) [static] : Returns the higher of the two values.
; int Clamp (int V, int A, int B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.

==Float Functions ==

Note that you can use the following functions with integers, but be prepared for precision errors if the integer is greater than 6 digits.  For example Abs( -50764630 ) returns 50764632.

; float Abs (float A) [static] : Returns the absolute value (also known as the modulo) of A, usually written |A|. Eg: Abs(5) == Abs(-5) == 5.
; float Sin (float A) [static] : Returns sine( A ), where A is in [[Wikipedia:Radian]]s.
; float Asin (float A) [static] : Inverse sine. Returns sin&lt;sup&gt;-1-&lt;/sup&gt;(A).
; float Cos (float A) [static] : Returns cosine( A ), where A is in [[Wikipedia:Radian]]s.
; float Acos (float A) [static] : Inverse cosine. Returns cos&lt;sup&gt;-1-&lt;/sup&gt;(A).
; float Tan (float A) [static] : Returns tan( A ), where A is in [[Wikipedia:Radian]]s.
; float Atan (float B, float A) [static] : 
Returns the inverse tangent of B/A, where A is the adjacent side and B is the opposite side of the triangle.  The result is in [[Wikipedia:Radian]]s.

Normally, the inverse tangent function has results between &amp;ndash;&amp;pi;/2 and +&amp;pi;/2, giving the same result for B/A and &amp;ndash;B/&amp;ndash;A.  The two-argument form allows the Atan function to return results between &amp;ndash;&amp;pi; and +&amp;pi;, i.e. on the full circle, which is generally much more useful.  Additionally, the two-argument form supports A&amp;nbsp;=&amp;nbsp;0, which is impossible in the single-argument form (since that single argument would have to be infinity in that case).

To emulate the inverse tangent with a single argument B, say '''Atan(B,1)'''.


; float Exp (float A) [static] : Returns e&lt;sup&gt;A&lt;/sup&gt;
; float Loge (float A) [static] : Returns ln(A), the natural logarithm.
; float Sqrt (float A) [static] : Returns the square root of A.
; float Square (float A) [static] : Returns A&lt;sup&gt;2&lt;/sup&gt;.
; float FRand ( ) : Returns a random number between 0 and 1.
; float FMin (float A, float B) [static] : Returns the lower of the two values.
; float FMax (float A, float B) [static] : Returns the higher of the two values.
; float FClamp (float V, float A, float B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.
; float Lerp (float Alpha, float A, float B) [static] : &quot;Returns the linear interpolation between A and B.&quot;&lt;br /&gt;The return value is calculated through something like this:&lt;br /&gt;&lt;tt&gt;(B - A) * Alpha + A&lt;/tt&gt;
; float Smerp (float Alpha, float A, float B) [static] : Returns an Alpha-smooth nonlinear interpolation between A and B.&lt;br /&gt;The return value seems to be calculated through something like this:&lt;br /&gt;&lt;tt&gt;(-2 * (B - A) * Alpha ** 3) + (3 * (B - A) * Alpha ** 2) + A&lt;/tt&gt;
; [[Image:Legacy_interpolation-smerp.gif|]]
; float RandRange (float Min, float Max) [not native] : Returns a random number between Min and Max. This function is not static.
; float Ceil (float A) [static] : Returns A rounded off to the next higher whole number, e.g. Ceil(1.8) returns 2, Ceil(-1.8) returns -1, etc. Ceil will always round up while typecasting float to int rounds up for negative numbers and down for positive numbers, i.e. int casts simply discard everything after the decimal point.
; float Round (float A) [static] : Returns A rounded off to the nearest whole number, e.g. pass 1.05 and it returns 1.00, 5.5 will return 6.0 etc.

==String Functions ==
; int Len (coerce string S) [static] : Returns the length of the string, i.e. the number of characters in it.
; int InStr (coerce string haystack, coerce string needle) [static] : If the string &lt;tt&gt;needle&lt;/tt&gt; is found inside &lt;tt&gt;haystack&lt;/tt&gt;, the number of characters in &lt;tt&gt;haystack&lt;/tt&gt; ''before'' the first occurance of &lt;tt&gt;needle&lt;/tt&gt; is returned. That is, if the &lt;tt&gt;needle&lt;/tt&gt; is found right at the beginning of &lt;tt&gt;haystack&lt;/tt&gt;, 0 is returned. If &lt;tt&gt;haystack&lt;/tt&gt; doesn't contain &lt;tt&gt;needle&lt;/tt&gt;, InStr returns -1.
; string Mid (coerce string S, int skip, optional int num) [static] : Returns a substring of &lt;tt&gt;S&lt;/tt&gt;, skipping &lt;tt&gt;skip&lt;/tt&gt; characters and returning the next &lt;tt&gt;num&lt;/tt&gt; characters or all remaining if the third parameter is left out. Mid(&quot;hello&quot;, 0, 2) returns &quot;he&quot;, Mid(&quot;hello&quot;, 1) returns &quot;ello&quot;, i.e. all but the first character.
; string Left (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; leftmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Right (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; rightmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Caps (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to uppercase.
; string Chr (int i) [static] : Returns the character matchin the given ASCII code.
; int Asc (string S) [static] : Returns the ASCII code of the first character in &lt;tt&gt;S&lt;/tt&gt;.
; bool Divide (coerce string Src, string Divider, out string LeftPart, out string RigthPart) [static] : Divides a string and returns the two parts.
; int Split (coerce string Src, string Divider, out array&lt;string&gt; Parts) [static] : Splits a string at the specified divider and returns the parts as a dynamic array of strings.  If the input string starts with the given divider, the first element of the output array will be empty.  '''Note:'''  In early patch version of UT2003 this function was buggy.  See [[Legacy:El Muerte TDS/WUtils|El Muerte TDS/wUtils]] for a fix.

===UT2004 Specific ===
; string Locs (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to lowercase.
; string Repl (coerce string Src, coerce string Match, coerce string With, optional bool bCaseSensitive) [static] : Replaces all occurances of &lt;tt&gt;Match&lt;/tt&gt; in string &lt;tt&gt;Src&lt;/tt&gt;.  Specify true for &lt;tt&gt;bCaseSensitive&lt;/tt&gt; if matching should be case-sensitive.
; string Eval ( bool Condition, coerce string ResultIfTrue, coerce string ResultIfFalse ) [static] : Given boolean expression &lt;tt&gt;Condition&lt;/tt&gt;, return string &lt;tt&gt;ResultIfTrue&lt;/tt&gt; if the expression evaluates to true, otherwise return &lt;tt&gt;ResultIfFalse&lt;/tt&gt;.
; int StrCmp (coerce string S, coerce string T, optional int Count, optional bool bCaseSensitive) [static] : 
; ReplaceText (out string Text, string Replace, string With) [static, not native] : Like Repl, but modifies the input string variable directly and is always case-sensitive.
; EatStr(out string Dest, out string Source, int Num) [static, not native] : Removes Num characters from the source string and adds them at the end of the destination string.
; string GetItemName (string FullName) [not native] : Returns 'ItemName' from 'Package.Group.ItemName'.

==General Functions ==

===InterpCurve Functions ===
; float InterpCurveEval (InterpCurve curve, float input) : Interpolates the points in &lt;tt&gt;curve&lt;/tt&gt; to determine which value the curve would have, had we the point at &lt;tt&gt;input&lt;/tt&gt;.
; InterpCurveGetOutputRange (InterpCurve curve, out float min, out float max) [static] : Probably returns the minimum and maximum value of the curve defined by the points in &lt;tt&gt;curve&lt;/tt&gt;.
; InterpCurveGetInputDomain (InterpCurve curve, out float min, out float max)  [static] : Probably returns the minimum and maximum argument values for the curve defined by the points in &lt;tt&gt;curve&lt;/tt&gt;.

===Logging ===
; Log (coerce string S, optional name Tag) [static] : Writes a line to the log file. The line begins with the Tag or &quot;ScriptLog:&quot; if Tag was not specified, followed by the log string.&lt;br /&gt;The tags 'Error' and 'Warning' (and probably others, too) have a special meaning in [[Legacy:Commandlet|Commandlet]]s.
; Warn (coerce string S) [static] : Same like &lt;tt&gt;Log&lt;/tt&gt;, but the line starts with &quot;ScriptWarning:&quot; and contains information about the object, state and function that called &lt;tt&gt;Warn&lt;/tt&gt;.
; string Localize (string SectionName, string KeyName, string PackageName) [static] : Returns the string found in ''PackageName''.int in the [''SectionName''] section. Logs an error if no localization for the specified string is found.

===State-Related ===
; GotoState (optional name NewState, optional name Label) : Switches to a new state. State code execution begins at the specified label or at &quot;Begin:&quot; if &lt;tt&gt;Label&lt;/tt&gt; is not specified.&lt;br /&gt;Before the state is changed the old state's &lt;tt&gt;EndState&lt;/tt&gt; function is called. After the state changed &lt;tt&gt;BeginState&lt;/tt&gt; of the new state is called.
; bool IsInState (name TestState) : Returns whether the object's current state is the one specified.
; name GetStateName ( ) : Returns the object's current state name.
; BeginState ( ) [not native, not final] : This event is executed during GotoState right after the object switched to the new state. This function can be overridden in any state of any class.
; EndState ( ) [not native, not final] : This event is executed during GotoState right before the object switches to the new state. This function can be overridden in any state of any class.

===Class Hierarchy ===
; bool ClassIsChildOf (class TestClass, class ParentClass) [static] : Returns whether &lt;tt&gt;TestClass&lt;/tt&gt; is a subclass of &lt;tt&gt;Parentclass&lt;/tt&gt;. If the two classes are the same it returns true.

; bool IsA (name ClassName) : Returns whether the object's class is the specified class or a subclass. This function doesn't need a reference to the desired class, but just the class's name.

===Enabling / Disabling Functions ===
; Enable (name ProbeFunc) : Enables a [[Legacy:Probe Function|probe function]].
; Disable (name ProbeFunc) : Disables a [[Legacy:Probe Function|probe function]].

===Objects / Properties ===
; string GetPropertyText (string PropName) : Returns the value of the specified property [[Legacy:Typecasting|typecasted]] to string. It is not possible to access default properties in this manner. This is useful when you don't want any dependencies to the package of an object, but still need to access its public (i.e. neither &lt;tt&gt;private&lt;/tt&gt; nor &lt;tt&gt;protected&lt;/tt&gt;) properties.&lt;br /&gt;Usage: &lt;tt&gt;aString = anObject.GetPropertyText(&quot;''PropertyName''&quot;);&lt;/tt&gt;
; bool SetPropertyText (string PropName, string PropValue) : Assigns a value to the specified public non-constant property of an object. Only use this for properties that can be [[Legacy:Typecasting|typecasted]] from string.&lt;br /&gt;Usage: &lt;tt&gt;anObject.SetPropertyText(&quot;''PropertyName''&quot;, &quot;''new value''&quot;);&lt;/tt&gt;&lt;br /&gt;Returns true if the assignment succeeded; False if it did not. Properties declared as &lt;tt&gt;private&lt;/tt&gt;, &lt;tt&gt;protected&lt;/tt&gt; or &lt;tt&gt;const&lt;/tt&gt; cannot be altered this way, and will return false just as if the named property did not exist at all.
; name GetEnum (Object E, coerce int i) [static] : Returns the i-th element of the given enumeration, as in &lt;code&gt;GetEnum(enum'MyEnum', 2)&lt;/code&gt; or an empty name of the specified index exceeds the number of elements in the enumeration. The second parameter is only declared 'coerce' in UT2004.
; [[Legacy:Object|Object]] DynamicLoadObject (string ObjectName, Class ObjectClass, optional bool MayFail) [static] : Returns a reference to a specified object, loading it from disk if necessary. See [[Legacy:DynamicLoadObject|DynamicLoadObject]].
; [[Legacy:Object|Object]] FindObject (string ObjectName, class ObjectClass) [static] : 
;*'''Sonic:''' How does this function work?
;*'''Wormbo:''' Exactly like DynamicLoadObject(), except that it only returns objects that are already in memory.
; SaveConfig ( ) : Saves the current values of config and globalconfig variables of this object to the ini file and sets them as default values for the object's class.
; StaticSaveConfig ( ) [static] : Saves the default values of config and globalconfig variables of this object's class to the ini file.
; ResetConfig ( ) [static] : Resets the config and globalconfig variables of this object's class to the values stored in Default.ini or DefUser.ini.

====UT2004 Specific ====
; ClearConfig (optional string PropertyName) : Remove this object's section from the appropriate .ini file, and reload the script defaults for this object.  If &lt;tt&gt;PropertyName&lt;/tt&gt; is specified, only remove and reload that property, if found.
; StaticClearConfig (optional string PropertyName) [static] : Static version of ClearConfig().
; ResetConfig (optional string PropertyName) [static] : If object's class does not have a section in the default.ini or defuser.ini, ResetConfig() now performs ClearConfig().  Otherwise, functionality is same as before.  If &lt;tt&gt;PropertyName&lt;/tt&gt; is specified, only reset and reload that property, if found.
; array&lt;string&gt; GetPerObjectNames (string ININame) [static] : Returns all section names that exist in the .ini file specified by &lt;tt&gt;ININame&lt;/tt&gt; which correspond to PerObjectConfig classes.
; GetReferencers ([[Legacy:Object|Object]] Target, out array&lt;[[Legacy:Object|Object]]&gt; Referencers) : Returns a list of objects referencing the specified target object. Useful for debugging garbage collection problems.

==Other Functions ==
; StopWatch (optional bool bStop) [static] : For script timing.  Have done some testing, having StopWatch called on Tick() with different values for bStop.  bStop=False seems to do nothing, not showing any HUD messages, output to stdout/err, or to logfile.  First call with bStop=True prints text &quot;UNICODE str: Time=%lf ms&quot; to output, logs &quot;Log: Unknown percent in UnUnix.cpp::wvsnprintf().&quot;, and crashes, whether there have been zero, one, or many previous calls with bStop=False.  So far, none of this looks useful, but perhaps it needs to be used in a different context to work properly - on dedicated server, or in an Actor (my test was in an Interaction, in an &quot;Instant Action&quot; game).&lt;br /&gt;StopWatch( false ); starts the stopwatch. StopWatch( true ); disables and resets the timer. When you stop the timer, a line will be printed in the log stating something like: Time=41.768ms. This is the time that the stopwatch was at when it was stopped. This makes it appear to be very much like clock.. but the log statement that shows the stop time is not what you can really do with StopWatch.&lt;br /&gt;The magic of stopwatch is that when it is running it timestamps log entries. Each is stamped with the time elapsed since the timer was started. It is great for finding out the time taken throughout a function, without writing a veritable pile of clock and unclock statements, as well as adding temporary variables for them, and the works! See [[Legacy:Code Optimization|Code Optimization]] for more. - StopWatch is apparently an Epic addition, as it does not seem to exist in Runtime or in other UT2003 era games.

; bool IsOnConsole ( ) : For console specific stuff; the only reference to IsOnConsole() to be found is in 2136 of UT2K3 in a fragment found in PlayerController.uc.  &quot;Console&quot; in this case refers to a game console, specifically the X-Box.  Not the console dropped down and typed into.
; bool IsSoaking ( ) : For console specific stuff; the only references to IsSoaking() are to be found in 2136 of UT2K3 in Console.Initialized() and Console.KeyEvent().

===UT2004-specific===
; bool PlatformIsMacOS() :
; bool PlatformIsUnix() :
; bool PlatformIsWindows() :
; bool PlatformIs64Bit() : These report basic truths about the target OS. You should only use them for basic things (MacOS? Don't report Direct3D support, etc). MacOSX is a Unix of sorts, but does not report PlatformIsUnix()==true. PlatformIsWindows() is for Win32 and Win64. PlatformIs64Bit() may be true in conjunction with any other platform function if the binary is 64-bit native (not 32-bit on a 64-bit platform).

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class Syntax|Class Syntax]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Operators|Operators]]
** [[Legacy:Object|Object class]]

----</text>
    </revision>
    <revision>
      <id>3382</id>
      <timestamp>2007-12-20T13:41:53Z</timestamp>
      <contributor>
        <ip>85.133.171.75</ip>
      </contributor>
      <minor/>
      <comment>Changed the order of Atan's parameters to the right form (was Atan (float A, float B)).</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] (Methods)}}

The functions listed here are globally available in all classes.  Due to [[Legacy:UnrealScript|UnrealScript]]'s strict object-oriented approach, they're actually methods of the [[Legacy:Object|Object]] class.

Almost all of these functions are declared as native and final (see [[Legacy:Class Syntax|class syntax]]) and most of them are also [[Legacy:Static Function|static function]]s.

See [[Legacy:Vector|vector]], [[Legacy:Rotator|rotator]] and [[Legacy:Quaternion|quaternion]] for functions on those variable types.

See [[Legacy:Global Function (UT)|Global Function (UT)]] for a list of global functions in UT.

==Integer Functions ==
; int Rand (int Max) [static] : Returns a random number ranging from 0 to Max-1.
; int Min (int A, int B) [static] : Returns the lower of the two values.
; int Max (int A, int B) [static] : Returns the higher of the two values.
; int Clamp (int V, int A, int B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.

==Float Functions ==

Note that you can use the following functions with integers, but be prepared for precision errors if the integer is greater than 6 digits.  For example Abs( -50764630 ) returns 50764632.

; float Abs (float A) [static] : Returns the absolute value (also known as the modulo) of A, usually written |A|. Eg: Abs(5) == Abs(-5) == 5.
; float Sin (float A) [static] : Returns sine( A ), where A is in [[Wikipedia:Radian]]s.
; float Asin (float A) [static] : Inverse sine. Returns sin&lt;sup&gt;-1-&lt;/sup&gt;(A).
; float Cos (float A) [static] : Returns cosine( A ), where A is in [[Wikipedia:Radian]]s.
; float Acos (float A) [static] : Inverse cosine. Returns cos&lt;sup&gt;-1-&lt;/sup&gt;(A).
; float Tan (float A) [static] : Returns tan( A ), where A is in [[Wikipedia:Radian]]s.
; float Atan (float B, float A) [static] : 
Returns the inverse tangent of B/A, where A is the adjacent side and B is the opposite side of the triangle.  The result is in [[Wikipedia:Radian]]s.

Normally, the inverse tangent function has results between &amp;ndash;&amp;pi;/2 and +&amp;pi;/2, giving the same result for B/A and &amp;ndash;B/&amp;ndash;A.  The two-argument form allows the Atan function to return results between &amp;ndash;&amp;pi; and +&amp;pi;, i.e. on the full circle, which is generally much more useful.  Additionally, the two-argument form supports A&amp;nbsp;=&amp;nbsp;0, which is impossible in the single-argument form (since that single argument would have to be infinity in that case).

To emulate the inverse tangent with a single argument B, say '''Atan(B,1)'''.


; float Exp (float A) [static] : Returns e&lt;sup&gt;A&lt;/sup&gt;
; float Loge (float A) [static] : Returns ln(A), the natural logarithm.
; float Sqrt (float A) [static] : Returns the square root of A.
; float Square (float A) [static] : Returns A&lt;sup&gt;2&lt;/sup&gt;.
; float FRand ( ) : Returns a random number between 0 and 1.
; float FMin (float A, float B) [static] : Returns the lower of the two values.
; float FMax (float A, float B) [static] : Returns the higher of the two values.
; float FClamp (float V, float A, float B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.
; float Lerp (float Alpha, float A, float B) [static] : &quot;Returns the linear interpolation between A and B.&quot;&lt;br /&gt;The return value is calculated through something like this:&lt;br /&gt;&lt;tt&gt;(B - A) * Alpha + A&lt;/tt&gt;
; float Smerp (float Alpha, float A, float B) [static] : Returns an Alpha-smooth nonlinear interpolation between A and B.&lt;br /&gt;The return value seems to be calculated through something like this:&lt;br /&gt;&lt;tt&gt;(-2 * (B - A) * Alpha ** 3) + (3 * (B - A) * Alpha ** 2) + A&lt;/tt&gt;
; [[Image:Legacy_interpolation-smerp.gif|]]
; float RandRange (float Min, float Max) [not native] : Returns a random number between Min and Max. This function is not static.
; float Ceil (float A) [static] : Returns A rounded off to the next higher whole number, e.g. Ceil(1.8) returns 2, Ceil(-1.8) returns -1, etc. Ceil will always round up while typecasting float to int rounds up for negative numbers and down for positive numbers, i.e. int casts simply discard everything after the decimal point.
; float Round (float A) [static] : Returns A rounded off to the nearest whole number, e.g. pass 1.05 and it returns 1.00, 5.5 will return 6.0 etc.

==String Functions ==
; int Len (coerce string S) [static] : Returns the length of the string, i.e. the number of characters in it.
; int InStr (coerce string haystack, coerce string needle) [static] : If the string &lt;tt&gt;needle&lt;/tt&gt; is found inside &lt;tt&gt;haystack&lt;/tt&gt;, the number of characters in &lt;tt&gt;haystack&lt;/tt&gt; ''before'' the first occurance of &lt;tt&gt;needle&lt;/tt&gt; is returned. That is, if the &lt;tt&gt;needle&lt;/tt&gt; is found right at the beginning of &lt;tt&gt;haystack&lt;/tt&gt;, 0 is returned. If &lt;tt&gt;haystack&lt;/tt&gt; doesn't contain &lt;tt&gt;needle&lt;/tt&gt;, InStr returns -1.
; string Mid (coerce string S, int skip, optional int num) [static] : Returns a substring of &lt;tt&gt;S&lt;/tt&gt;, skipping &lt;tt&gt;skip&lt;/tt&gt; characters and returning the next &lt;tt&gt;num&lt;/tt&gt; characters or all remaining if the third parameter is left out. Mid(&quot;hello&quot;, 0, 2) returns &quot;he&quot;, Mid(&quot;hello&quot;, 1) returns &quot;ello&quot;, i.e. all but the first character.
; string Left (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; leftmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Right (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; rightmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Caps (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to uppercase.
; string Chr (int i) [static] : Returns the character matchin the given ASCII code.
; int Asc (string S) [static] : Returns the ASCII code of the first character in &lt;tt&gt;S&lt;/tt&gt;.
; bool Divide (coerce string Src, string Divider, out string LeftPart, out string RigthPart) [static] : Divides a string and returns the two parts.
; int Split (coerce string Src, string Divider, out array&lt;string&gt; Parts) [static] : Splits a string at the specified divider and returns the parts as a dynamic array of strings.  If the input string starts with the given divider, the first element of the output array will be empty.  '''Note:'''  In early patch version of UT2003 this function was buggy.  See [[Legacy:El Muerte TDS/WUtils|El Muerte TDS/wUtils]] for a fix.

===UT2004 Specific ===
; string Locs (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to lowercase.
; string Repl (coerce string Src, coerce string Match, coerce string With, optional bool bCaseSensitive) [static] : Replaces all occurances of &lt;tt&gt;Match&lt;/tt&gt; in string &lt;tt&gt;Src&lt;/tt&gt;.  Specify true for &lt;tt&gt;bCaseSensitive&lt;/tt&gt; if matching should be case-sensitive.
; string Eval ( bool Condition, coerce string ResultIfTrue, coerce string ResultIfFalse ) [static] : Given boolean expression &lt;tt&gt;Condition&lt;/tt&gt;, return string &lt;tt&gt;ResultIfTrue&lt;/tt&gt; if the expression evaluates to true, otherwise return &lt;tt&gt;ResultIfFalse&lt;/tt&gt;.
; int StrCmp (coerce string S, coerce string T, optional int Count, optional bool bCaseSensitive) [static] : 
; ReplaceText (out string Text, string Replace, string With) [static, not native] : Like Repl, but modifies the input string variable directly and is always case-sensitive.
; EatStr(out string Dest, out string Source, int Num) [static, not native] : Removes Num characters from the source string and adds them at the end of the destination string.
; string GetItemName (string FullName) [not native] : Returns 'ItemName' from 'Package.Group.ItemName'.

==General Functions ==

===InterpCurve Functions ===
; float InterpCurveEval (InterpCurve curve, float input) : Interpolates the points in &lt;tt&gt;curve&lt;/tt&gt; to determine which value the curve would have, had we the point at &lt;tt&gt;input&lt;/tt&gt;.
; InterpCurveGetOutputRange (InterpCurve curve, out float min, out float max) [static] : Probably returns the minimum and maximum value of the curve defined by the points in &lt;tt&gt;curve&lt;/tt&gt;.
; InterpCurveGetInputDomain (InterpCurve curve, out float min, out float max)  [static] : Probably returns the minimum and maximum argument values for the curve defined by the points in &lt;tt&gt;curve&lt;/tt&gt;.

===Logging ===
; Log (coerce string S, optional name Tag) [static] : Writes a line to the log file. The line begins with the Tag or &quot;ScriptLog:&quot; if Tag was not specified, followed by the log string.&lt;br /&gt;The tags 'Error' and 'Warning' (and probably others, too) have a special meaning in [[Legacy:Commandlet|Commandlet]]s.
; Warn (coerce string S) [static] : Same like &lt;tt&gt;Log&lt;/tt&gt;, but the line starts with &quot;ScriptWarning:&quot; and contains information about the object, state and function that called &lt;tt&gt;Warn&lt;/tt&gt;.
; string Localize (string SectionName, string KeyName, string PackageName) [static] : Returns the string found in ''PackageName''.int in the [''SectionName''] section. Logs an error if no localization for the specified string is found.

===State-Related ===
; GotoState (optional name NewState, optional name Label) : Switches to a new state. State code execution begins at the specified label or at &quot;Begin:&quot; if &lt;tt&gt;Label&lt;/tt&gt; is not specified.&lt;br /&gt;Before the state is changed the old state's &lt;tt&gt;EndState&lt;/tt&gt; function is called. After the state changed &lt;tt&gt;BeginState&lt;/tt&gt; of the new state is called.
; bool IsInState (name TestState) : Returns whether the object's current state is the one specified.
; name GetStateName ( ) : Returns the object's current state name.
; BeginState ( ) [not native, not final] : This event is executed during GotoState right after the object switched to the new state. This function can be overridden in any state of any class.
; EndState ( ) [not native, not final] : This event is executed during GotoState right before the object switches to the new state. This function can be overridden in any state of any class.

===Class Hierarchy ===
; bool ClassIsChildOf (class TestClass, class ParentClass) [static] : Returns whether &lt;tt&gt;TestClass&lt;/tt&gt; is a subclass of &lt;tt&gt;Parentclass&lt;/tt&gt;. If the two classes are the same it returns true.

; bool IsA (name ClassName) : Returns whether the object's class is the specified class or a subclass. This function doesn't need a reference to the desired class, but just the class's name.

===Enabling / Disabling Functions ===
; Enable (name ProbeFunc) : Enables a [[Legacy:Probe Function|probe function]].
; Disable (name ProbeFunc) : Disables a [[Legacy:Probe Function|probe function]].

===Objects / Properties ===
; string GetPropertyText (string PropName) : Returns the value of the specified property [[Legacy:Typecasting|typecasted]] to string. It is not possible to access default properties in this manner. This is useful when you don't want any dependencies to the package of an object, but still need to access its public (i.e. neither &lt;tt&gt;private&lt;/tt&gt; nor &lt;tt&gt;protected&lt;/tt&gt;) properties.&lt;br /&gt;Usage: &lt;tt&gt;aString = anObject.GetPropertyText(&quot;''PropertyName''&quot;);&lt;/tt&gt;
; SetPropertyText (string PropName, string PropValue) : Assigns a value to the specified public non-constant property of an object. Only use this for properties that can be [[Legacy:Typecasting|typecasted]] from string.&lt;br /&gt;Usage: &lt;tt&gt;anObject.SetPropertyString(&quot;''PropertyName''&quot;, &quot;''new value''&quot;);&lt;/tt&gt;
; name GetEnum (Object E, coerce int i) [static] : Returns the i-th element of the given enumeration, as in &lt;code&gt;GetEnum(enum'MyEnum', 2)&lt;/code&gt; or an empty name of the specified index exceeds the number of elements in the enumeration. The second parameter is only declared 'coerce' in UT2004.
; [[Legacy:Object|Object]] DynamicLoadObject (string ObjectName, Class ObjectClass, optional bool MayFail) [static] : Returns a reference to a specified object, loading it if necessary. See [[Legacy:DynamicLoadObject|DynamicLoadObject]].
; [[Legacy:Object|Object]] FindObject (string ObjectName, class ObjectClass) [static] : 
;*'''Sonic:''' How does this function work?
;*'''Wormbo:''' Exactly like DynamicLoadObject(), except that it only returns objects that are already in memory.
; SaveConfig ( ) : Saves the current values of config and globalconfig variables of this object to the ini file and sets them as default values for the object's class.
; StaticSaveConfig ( ) [static] : Saves the default values of config and globalconfig variables of this object's class to the ini file.
; ResetConfig ( ) [static] : Resets the config and globalconfig variables of this object's class to the values stored in Default.ini or DefUser.ini.

====UT2004 Specific ====
; ClearConfig (optional string PropertyName) : Remove this object's section from the appropriate .ini file, and reload the script defaults for this object.  If &lt;tt&gt;PropertyName&lt;/tt&gt; is specified, only remove and reload that property, if found.
; StaticClearConfig (optional string PropertyName) [static] : Static version of ClearConfig().
; ResetConfig (optional string PropertyName) [static] : If object's class does not have a section in the default.ini or defuser.ini, ResetConfig() now performs ClearConfig().  Otherwise, functionality is same as before.  If &lt;tt&gt;PropertyName&lt;/tt&gt; is specified, only reset and reload that property, if found.
; array&lt;string&gt; GetPerObjectNames (string ININame) [static] : Returns all section names that exist in the .ini file specified by &lt;tt&gt;ININame&lt;/tt&gt; which correspond to PerObjectConfig classes.
; GetReferencers ([[Legacy:Object|Object]] Target, out array&lt;[[Legacy:Object|Object]]&gt; Referencers) : Returns a list of objects referencing the specified target object. Useful for debugging garbage collection problems.

==Other Functions ==
; StopWatch (optional bool bStop) [static] : For script timing.  Have done some testing, having StopWatch called on Tick() with different values for bStop.  bStop=False seems to do nothing, not showing any HUD messages, output to stdout/err, or to logfile.  First call with bStop=True prints text &quot;UNICODE str: Time=%lf ms&quot; to output, logs &quot;Log: Unknown percent in UnUnix.cpp::wvsnprintf().&quot;, and crashes, whether there have been zero, one, or many previous calls with bStop=False.  So far, none of this looks useful, but perhaps it needs to be used in a different context to work properly - on dedicated server, or in an Actor (my test was in an Interaction, in an &quot;Instant Action&quot; game).&lt;br /&gt;StopWatch( false ); starts the stopwatch. StopWatch( true ); disables and resets the timer. When you stop the timer, a line will be printed in the log stating something like: Time=41.768ms. This is the time that the stopwatch was at when it was stopped. This makes it appear to be very much like clock.. but the log statement that shows the stop time is not what you can really do with StopWatch.&lt;br /&gt;The magic of stopwatch is that when it is running it timestamps log entries. Each is stamped with the time elapsed since the timer was started. It is great for finding out the time taken throughout a function, without writing a veritable pile of clock and unclock statements, as well as adding temporary variables for them, and the works! See [[Legacy:Code Optimization|Code Optimization]] for more. - StopWatch is apparently an Epic addition, as it does not seem to exist in Runtime or in other UT2003 era games.

; bool IsOnConsole ( ) : For console specific stuff; the only reference to IsOnConsole() to be found is in 2136 of UT2K3 in a fragment found in PlayerController.uc.  &quot;Console&quot; in this case refers to a game console, specifically the X-Box.  Not the console dropped down and typed into.
; bool IsSoaking ( ) : For console specific stuff; the only references to IsSoaking() are to be found in 2136 of UT2K3 in Console.Initialized() and Console.KeyEvent().

===UT2004-specific===
; bool PlatformIsMacOS() :
; bool PlatformIsUnix() :
; bool PlatformIsWindows() :
; bool PlatformIs64Bit() : These report basic truths about the target OS. You should only use them for basic things (MacOS? Don't report Direct3D support, etc). MacOSX is a Unix of sorts, but does not report PlatformIsUnix()==true. PlatformIsWindows() is for Win32 and Win64. PlatformIs64Bit() may be true in conjunction with any other platform function if the binary is 64-bit native (not 32-bit on a 64-bit platform).

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class Syntax|Class Syntax]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Operators|Operators]]
** [[Legacy:Object|Object class]]

----</text>
    </revision>
    <revision>
      <id>43655</id>
      <timestamp>2010-07-14T15:40:18Z</timestamp>
      <contributor>
        <username>WGH</username>
        <id>676</id>
      </contributor>
      <minor/>
      <comment>/* Float Functions */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] (Methods)}}

The functions listed here are globally available in all classes.  Due to [[Legacy:UnrealScript|UnrealScript]]'s strict object-oriented approach, they're actually methods of the [[Legacy:Object|Object]] class.

Almost all of these functions are declared as native and final (see [[Legacy:Class Syntax|class syntax]]) and most of them are also [[Legacy:Static Function|static function]]s.

See [[Legacy:Vector|vector]], [[Legacy:Rotator|rotator]] and [[Legacy:Quaternion|quaternion]] for functions on those variable types.

See [[Legacy:Global Function (UT)|Global Function (UT)]] for a list of global functions in UT.

==Integer Functions ==
; int Rand (int Max) [static] : Returns a random number ranging from 0 to Max-1.
; int Min (int A, int B) [static] : Returns the lower of the two values.
; int Max (int A, int B) [static] : Returns the higher of the two values.
; int Clamp (int V, int A, int B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.

==Float Functions ==

Note that you can use the following functions with integers, but be prepared for precision errors if the integer is greater than 6 digits.  For example Abs( -50764630 ) returns 50764632.

; float Abs (float A) [static] : Returns the absolute value (also known as the modulo) of A, usually written |A|. Eg: Abs(5) == Abs(-5) == 5.
; float Sin (float A) [static] : Returns sine( A ), where A is in [[Wikipedia:Radian]]s.
; float Asin (float A) [static] : Inverse sine. Returns sin&lt;sup&gt;-1-&lt;/sup&gt;(A).
; float Cos (float A) [static] : Returns cosine( A ), where A is in [[Wikipedia:Radian]]s.
; float Acos (float A) [static] : Inverse cosine. Returns cos&lt;sup&gt;-1-&lt;/sup&gt;(A).
; float Tan (float A) [static] : Returns tan( A ), where A is in [[Wikipedia:Radian]]s.
; float Atan (float B, float A) [static] : 
Returns the inverse tangent of B/A, where A is the adjacent side and B is the opposite side of the triangle.  The result is in [[Wikipedia:Radian]]s.

Normally, the inverse tangent function has results between &amp;ndash;&amp;pi;/2 and +&amp;pi;/2, giving the same result for B/A and &amp;ndash;B/&amp;ndash;A.  The two-argument form allows the Atan function to return results between &amp;ndash;&amp;pi; and +&amp;pi;, i.e. on the full circle, which is generally much more useful.  Additionally, the two-argument form supports A&amp;nbsp;=&amp;nbsp;0, which is impossible in the single-argument form (since that single argument would have to be infinity in that case).

To emulate the inverse tangent with a single argument B, say '''Atan(B,1)'''.


; float Exp (float A) [static] : Returns e&lt;sup&gt;A&lt;/sup&gt;
; float Loge (float A) [static] : Returns ln(A), the natural logarithm.
; float Sqrt (float A) [static] : Returns the square root of A.
; float Square (float A) [static] : Returns A&lt;sup&gt;2&lt;/sup&gt;.
; float FRand ( ) : Returns a random number between 0 and 1.
; float FMin (float A, float B) [static] : Returns the lower of the two values.
; float FMax (float A, float B) [static] : Returns the higher of the two values.
; float FClamp (float V, float A, float B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.
; float Lerp (float Alpha, float A, float B) [static] : &quot;Returns the linear interpolation between A and B.&quot;&lt;br /&gt;The return value is calculated through something like this:&lt;br /&gt;&lt;tt&gt;(B - A) * Alpha + A&lt;/tt&gt;
; float Smerp (float Alpha, float A, float B) [static] : Returns an Alpha-smooth nonlinear interpolation between A and B.&lt;br /&gt;The return value seems to be calculated through something like this:&lt;br /&gt;&lt;tt&gt;(-2 * (B - A) * Alpha ** 3) + (3 * (B - A) * Alpha ** 2) + A&lt;/tt&gt;
; [[Image:Legacy_interpolation-smerp.gif]]
; float RandRange (float Min, float Max) [not native] : Returns a random number between Min and Max. This function is not static.
; float Ceil (float A) [static] : Returns A rounded off to the next higher whole number, e.g. Ceil(1.8) returns 2, Ceil(-1.8) returns -1, etc. Ceil will always round up while typecasting float to int rounds up for negative numbers and down for positive numbers, i.e. int casts simply discard everything after the decimal point.
; float Round (float A) [static] : Returns A rounded off to the nearest whole number, e.g. pass 1.05 and it returns 1.00, 5.5 will return 6.0 etc.

==String Functions ==
; int Len (coerce string S) [static] : Returns the length of the string, i.e. the number of characters in it.
; int InStr (coerce string haystack, coerce string needle) [static] : If the string &lt;tt&gt;needle&lt;/tt&gt; is found inside &lt;tt&gt;haystack&lt;/tt&gt;, the number of characters in &lt;tt&gt;haystack&lt;/tt&gt; ''before'' the first occurance of &lt;tt&gt;needle&lt;/tt&gt; is returned. That is, if the &lt;tt&gt;needle&lt;/tt&gt; is found right at the beginning of &lt;tt&gt;haystack&lt;/tt&gt;, 0 is returned. If &lt;tt&gt;haystack&lt;/tt&gt; doesn't contain &lt;tt&gt;needle&lt;/tt&gt;, InStr returns -1.
; string Mid (coerce string S, int skip, optional int num) [static] : Returns a substring of &lt;tt&gt;S&lt;/tt&gt;, skipping &lt;tt&gt;skip&lt;/tt&gt; characters and returning the next &lt;tt&gt;num&lt;/tt&gt; characters or all remaining if the third parameter is left out. Mid(&quot;hello&quot;, 0, 2) returns &quot;he&quot;, Mid(&quot;hello&quot;, 1) returns &quot;ello&quot;, i.e. all but the first character.
; string Left (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; leftmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Right (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; rightmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Caps (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to uppercase.
; string Chr (int i) [static] : Returns the character matchin the given ASCII code.
; int Asc (string S) [static] : Returns the ASCII code of the first character in &lt;tt&gt;S&lt;/tt&gt;.
; bool Divide (coerce string Src, string Divider, out string LeftPart, out string RigthPart) [static] : Divides a string and returns the two parts.
; int Split (coerce string Src, string Divider, out array&lt;string&gt; Parts) [static] : Splits a string at the specified divider and returns the parts as a dynamic array of strings.  If the input string starts with the given divider, the first element of the output array will be empty.  '''Note:'''  In early patch version of UT2003 this function was buggy.  See [[Legacy:El Muerte TDS/WUtils|El Muerte TDS/wUtils]] for a fix.

===UT2004 Specific ===
; string Locs (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to lowercase.
; string Repl (coerce string Src, coerce string Match, coerce string With, optional bool bCaseSensitive) [static] : Replaces all occurances of &lt;tt&gt;Match&lt;/tt&gt; in string &lt;tt&gt;Src&lt;/tt&gt;.  Specify true for &lt;tt&gt;bCaseSensitive&lt;/tt&gt; if matching should be case-sensitive.
; string Eval ( bool Condition, coerce string ResultIfTrue, coerce string ResultIfFalse ) [static] : Given boolean expression &lt;tt&gt;Condition&lt;/tt&gt;, return string &lt;tt&gt;ResultIfTrue&lt;/tt&gt; if the expression evaluates to true, otherwise return &lt;tt&gt;ResultIfFalse&lt;/tt&gt;.
; int StrCmp (coerce string S, coerce string T, optional int Count, optional bool bCaseSensitive) [static] : 
; ReplaceText (out string Text, string Replace, string With) [static, not native] : Like Repl, but modifies the input string variable directly and is always case-sensitive.
; EatStr(out string Dest, out string Source, int Num) [static, not native] : Removes Num characters from the source string and adds them at the end of the destination string.
; string GetItemName (string FullName) [not native] : Returns 'ItemName' from 'Package.Group.ItemName'.

==General Functions ==

===InterpCurve Functions ===
; float InterpCurveEval (InterpCurve curve, float input) : Interpolates the points in &lt;tt&gt;curve&lt;/tt&gt; to determine which value the curve would have, had we the point at &lt;tt&gt;input&lt;/tt&gt;.
; InterpCurveGetOutputRange (InterpCurve curve, out float min, out float max) [static] : Probably returns the minimum and maximum value of the curve defined by the points in &lt;tt&gt;curve&lt;/tt&gt;.
; InterpCurveGetInputDomain (InterpCurve curve, out float min, out float max)  [static] : Probably returns the minimum and maximum argument values for the curve defined by the points in &lt;tt&gt;curve&lt;/tt&gt;.

===Logging ===
; Log (coerce string S, optional name Tag) [static] : Writes a line to the log file. The line begins with the Tag or &quot;ScriptLog:&quot; if Tag was not specified, followed by the log string.&lt;br /&gt;The tags 'Error' and 'Warning' (and probably others, too) have a special meaning in [[Legacy:Commandlet|Commandlet]]s.
; Warn (coerce string S) [static] : Same like &lt;tt&gt;Log&lt;/tt&gt;, but the line starts with &quot;ScriptWarning:&quot; and contains information about the object, state and function that called &lt;tt&gt;Warn&lt;/tt&gt;.
; string Localize (string SectionName, string KeyName, string PackageName) [static] : Returns the string found in ''PackageName''.int in the [''SectionName''] section. Logs an error if no localization for the specified string is found.

===State-Related ===
; GotoState (optional name NewState, optional name Label) : Switches to a new state. State code execution begins at the specified label or at &quot;Begin:&quot; if &lt;tt&gt;Label&lt;/tt&gt; is not specified.&lt;br /&gt;Before the state is changed the old state's &lt;tt&gt;EndState&lt;/tt&gt; function is called. After the state changed &lt;tt&gt;BeginState&lt;/tt&gt; of the new state is called.
; bool IsInState (name TestState) : Returns whether the object's current state is the one specified.
; name GetStateName ( ) : Returns the object's current state name.
; BeginState ( ) [not native, not final] : This event is executed during GotoState right after the object switched to the new state. This function can be overridden in any state of any class.
; EndState ( ) [not native, not final] : This event is executed during GotoState right before the object switches to the new state. This function can be overridden in any state of any class.

===Class Hierarchy ===
; bool ClassIsChildOf (class TestClass, class ParentClass) [static] : Returns whether &lt;tt&gt;TestClass&lt;/tt&gt; is a subclass of &lt;tt&gt;Parentclass&lt;/tt&gt;. If the two classes are the same it returns true.

; bool IsA (name ClassName) : Returns whether the object's class is the specified class or a subclass. This function doesn't need a reference to the desired class, but just the class's name.

===Enabling / Disabling Functions ===
; Enable (name ProbeFunc) : Enables a [[Legacy:Probe Function|probe function]].
; Disable (name ProbeFunc) : Disables a [[Legacy:Probe Function|probe function]].

===Objects / Properties ===
; string GetPropertyText (string PropName) : Returns the value of the specified property [[Legacy:Typecasting|typecasted]] to string. It is not possible to access default properties in this manner. This is useful when you don't want any dependencies to the package of an object, but still need to access its public (i.e. neither &lt;tt&gt;private&lt;/tt&gt; nor &lt;tt&gt;protected&lt;/tt&gt;) properties.&lt;br /&gt;Usage: &lt;tt&gt;aString = anObject.GetPropertyText(&quot;''PropertyName''&quot;);&lt;/tt&gt;
; bool SetPropertyText (string PropName, string PropValue) : Assigns a value to the specified public non-constant property of an object. Only use this for properties that can be [[Legacy:Typecasting|typecasted]] from string.&lt;br /&gt;Usage: &lt;tt&gt;anObject.SetPropertyText(&quot;''PropertyName''&quot;, &quot;''new value''&quot;);&lt;/tt&gt;&lt;br /&gt;Returns true if the assignment succeeded; False if it did not. Properties declared as &lt;tt&gt;private&lt;/tt&gt;, &lt;tt&gt;protected&lt;/tt&gt; or &lt;tt&gt;const&lt;/tt&gt; cannot be altered this way, and will return false just as if the named property did not exist at all.
; name GetEnum (Object E, coerce int i) [static] : Returns the i-th element of the given enumeration, as in &lt;code&gt;GetEnum(enum'MyEnum', 2)&lt;/code&gt; or an empty name of the specified index exceeds the number of elements in the enumeration. The second parameter is only declared 'coerce' in UT2004.
; [[Legacy:Object|Object]] DynamicLoadObject (string ObjectName, Class ObjectClass, optional bool MayFail) [static] : Returns a reference to a specified object, loading it from disk if necessary. See [[Legacy:DynamicLoadObject|DynamicLoadObject]].
; [[Legacy:Object|Object]] FindObject (string ObjectName, class ObjectClass) [static] : 
;*'''Sonic:''' How does this function work?
;*'''Wormbo:''' Exactly like DynamicLoadObject(), except that it only returns objects that are already in memory.
; SaveConfig ( ) : Saves the current values of config and globalconfig variables of this object to the ini file and sets them as default values for the object's class.
; StaticSaveConfig ( ) [static] : Saves the default values of config and globalconfig variables of this object's class to the ini file.
; ResetConfig ( ) [static] : Resets the config and globalconfig variables of this object's class to the values stored in Default.ini or DefUser.ini.

====UT2004 Specific ====
; ClearConfig (optional string PropertyName) : Remove this object's section from the appropriate .ini file, and reload the script defaults for this object.  If &lt;tt&gt;PropertyName&lt;/tt&gt; is specified, only remove and reload that property, if found.
; StaticClearConfig (optional string PropertyName) [static] : Static version of ClearConfig().
; ResetConfig (optional string PropertyName) [static] : If object's class does not have a section in the default.ini or defuser.ini, ResetConfig() now performs ClearConfig().  Otherwise, functionality is same as before.  If &lt;tt&gt;PropertyName&lt;/tt&gt; is specified, only reset and reload that property, if found.
; array&lt;string&gt; GetPerObjectNames (string ININame) [static] : Returns all section names that exist in the .ini file specified by &lt;tt&gt;ININame&lt;/tt&gt; which correspond to PerObjectConfig classes.
; GetReferencers ([[Legacy:Object|Object]] Target, out array&lt;[[Legacy:Object|Object]]&gt; Referencers) : Returns a list of objects referencing the specified target object. Useful for debugging garbage collection problems.

==Other Functions ==
; StopWatch (optional bool bStop) [static] : For script timing.  Have done some testing, having StopWatch called on Tick() with different values for bStop.  bStop=False seems to do nothing, not showing any HUD messages, output to stdout/err, or to logfile.  First call with bStop=True prints text &quot;UNICODE str: Time=%lf ms&quot; to output, logs &quot;Log: Unknown percent in UnUnix.cpp::wvsnprintf().&quot;, and crashes, whether there have been zero, one, or many previous calls with bStop=False.  So far, none of this looks useful, but perhaps it needs to be used in a different context to work properly - on dedicated server, or in an Actor (my test was in an Interaction, in an &quot;Instant Action&quot; game).&lt;br /&gt;StopWatch( false ); starts the stopwatch. StopWatch( true ); disables and resets the timer. When you stop the timer, a line will be printed in the log stating something like: Time=41.768ms. This is the time that the stopwatch was at when it was stopped. This makes it appear to be very much like clock.. but the log statement that shows the stop time is not what you can really do with StopWatch.&lt;br /&gt;The magic of stopwatch is that when it is running it timestamps log entries. Each is stamped with the time elapsed since the timer was started. It is great for finding out the time taken throughout a function, without writing a veritable pile of clock and unclock statements, as well as adding temporary variables for them, and the works! See [[Legacy:Code Optimization|Code Optimization]] for more. - StopWatch is apparently an Epic addition, as it does not seem to exist in Runtime or in other UT2003 era games.

; bool IsOnConsole ( ) : For console specific stuff; the only reference to IsOnConsole() to be found is in 2136 of UT2K3 in a fragment found in PlayerController.uc.  &quot;Console&quot; in this case refers to a game console, specifically the X-Box.  Not the console dropped down and typed into.
; bool IsSoaking ( ) : For console specific stuff; the only references to IsSoaking() are to be found in 2136 of UT2K3 in Console.Initialized() and Console.KeyEvent().

===UT2004-specific===
; bool PlatformIsMacOS() :
; bool PlatformIsUnix() :
; bool PlatformIsWindows() :
; bool PlatformIs64Bit() : These report basic truths about the target OS. You should only use them for basic things (MacOS? Don't report Direct3D support, etc). MacOSX is a Unix of sorts, but does not report PlatformIsUnix()==true. PlatformIsWindows() is for Win32 and Win64. PlatformIs64Bit() may be true in conjunction with any other platform function if the binary is 64-bit native (not 32-bit on a 64-bit platform).

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class Syntax|Class Syntax]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Operators|Operators]]
** [[Legacy:Object|Object class]]

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Global Function (UT)</title>
    <id>1335</id>
    <revision>
      <id>3399</id>
      <timestamp>2006-02-02T03:28:48Z</timestamp>
      <contributor>
        <ip>Bc179129.bendcable.com</ip>
      </contributor>
      <comment>that seems better =)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] (Methods)}}

The functions listed here are globally available in all classes.  Due to [[Legacy:UnrealScript|UnrealScript]]'s strict object-oriented approach, they're actually methods of the [[Legacy:Object (UT)|Object (UT)]] class.

Almost all of these functions are declared as native and final (see [[Legacy:Class Syntax|class syntax]]) and most of them are also [[Legacy:Static Function|static function]]s.

See [[Legacy:Vector|vector]] and [[Legacy:Rotator|rotator]] for functions on those variable types.

See [[Legacy:Global Function|Global Function]] for global UT2003 functions.

===Integer Functions ===
; int Rand (int Max) [static] : Returns a random number ranging from 0 to Max-1.
; int Min (int A, int B) [static] : Returns the lower of the two values.
; int Max (int A, int B) [static] : Returns the higher of the two values.
; int Clamp (int V, int A, int B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.

===Float Functions ===
; float Abs (float A) [static] : Returns the absolute value (also known as the modulo) of A, usually written |A|. Eg: Abs(5) == Abs(-5) == 5.
; float Sin (float A) [static] : Returns sine( A )
; float Cos (float A) [static] : Returns cosine( A )
; float Tan (float A) [static] : Returns tan( A )
; float Atan (float A) [static] : Inverse tangent. Returns tan&lt;sup&gt;-1-&lt;/sup&gt;(A). Other inverse trig functions are not included in [[Legacy:UT|UT]]'s UnrealScript. (see [[Legacy:Useful Maths Functions|Useful Maths Functions]])
; float Exp (float A) [static] : Returns e&lt;sup&gt;A&lt;/sup&gt;
; float Loge (float A) [static] : Returns log(A), the natural logarithm.
; float Sqrt (float A) [static] : Returns the square root of A.
; float Square (float A) [static] : Returns A&lt;sup&gt;2&lt;/sup&gt;.
; float FRand ( ) : Returns a random number between 0 and 1.
; float FMin (float A, float B) [static] : Returns the lower of the two values.
; float FMax (float A, float B) [static] : Returns the higher of the two values.
; float FClamp (float V, float A, float B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.
; float Lerp (float Alpha, float A, float B) [static] : &quot;Returns the linear interpolation between A and B.&quot;&lt;br /&gt;The return value is calculated through something like this:&lt;br /&gt;&lt;tt&gt;(B - A) * Alpha + A&lt;/tt&gt;
; float Smerp (float Alpha, float A, float B) [static] : Returns an Alpha-smooth nonlinear interpolation between A and B.&lt;br /&gt;The return value seems to be calculated through something like this:&lt;br /&gt;&lt;tt&gt;(-2 * (B - A) * Alpha ** 3) + (3 * (B - A) * Alpha ** 2) + A&lt;/tt&gt;
;[[Image:Legacy_interpolation-smerp.gif|]]
; float RandRange (float Min, float Max) : Returns a random number between Min and Max. This function is not static.

===String Functions ===
; int Len (coerce string S) [static] : Returns the length of the string, i.e. the number of characters in it.
; int InStr (coerce string haystack, coerce string needle) [static] : If the string &lt;tt&gt;needle&lt;/tt&gt; is found inside &lt;tt&gt;haystack&lt;/tt&gt;, the number of characters in &lt;tt&gt;haystack&lt;/tt&gt; ''before'' the first occurance of &lt;tt&gt;needle&lt;/tt&gt; is returned. That is, if the &lt;tt&gt;needle&lt;/tt&gt; is found right at the beginning of &lt;tt&gt;haystack&lt;/tt&gt;, 0 is returned. If &lt;tt&gt;haystack&lt;/tt&gt; doesn't contain &lt;tt&gt;needle&lt;/tt&gt;, InStr returns -1.
; string Mid (coerce string S, int skip, optional int num) [static] : Returns a substring of &lt;tt&gt;S&lt;/tt&gt;, skipping &lt;tt&gt;skip&lt;/tt&gt; characters and returning the next &lt;tt&gt;num&lt;/tt&gt; characters or all remaining if the third parameter is left out. Mid(&quot;hello&quot;, 0, 2) returns &quot;he&quot;, Mid(&quot;hello&quot;, 1) returns &quot;ello&quot;, i.e. all but the first character.
; string Left (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; leftmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Right (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; rightmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Caps (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to uppercase.
; string Chr (int i) [static] : Returns the character matchin the given ASCII code.
; int Asc (string S) [static] : Returns the ASCII code of the first character in &lt;tt&gt;S&lt;/tt&gt;.

===General Functions ===

====Logging ====
; Log (coerce string S, optional name Tag) [static] : Writes a line to the log file. The line begins with the Tag or &quot;ScriptLog:&quot; if Tag was not specified, followed by the log string.&lt;br /&gt;The tags 'Error' and 'Warning' (and probably others, too) have a special meaning in [[Legacy:Commandlet|Commandlet]]s.
; Warn (coerce string S) [static] : Same like &lt;tt&gt;Log&lt;/tt&gt;, but the line starts with &quot;ScriptWarning:&quot; and contains information about the object, state and function that called &lt;tt&gt;Warn&lt;/tt&gt;.
; string Localize (string SectionName, string KeyName, string PackageName) [static] : Returns the string found in ''PackageName''.int in the [''SectionName''] section. Logs an error if no localization for the specified string is found.

====State-Related ====
; GotoState (optional name NewState, optional name Label) : Switches to a new state. State code execution begins at the specified label or at &quot;Begin:&quot; if &lt;tt&gt;Label&lt;/tt&gt; is not specified.&lt;br /&gt;Before the state is changed the old state's &lt;tt&gt;EndState&lt;/tt&gt; function is called. After the state changed &lt;tt&gt;BeginState&lt;/tt&gt; of the new state is called.
; bool IsInState (name TestState) : Returns whether the object's current state is the one specified.
; name GetStateName ( ) : Returns the object's current state name.
; BeginState ( ) [not native, not final] : This event is executed during GotoState right after the object switched to the new state. This function can be overridden in any state of any class.
; EndState ( ) [not native, not final] : This event is executed during GotoState right before the object switches to the new state. This function can be overridden in any state of any class.

====Class Hierarchy ====
; bool ClassIsChildOf (class TestClass, class ParentClass) [static] : Returns whether &lt;tt&gt;TestClass&lt;/tt&gt; is a subclass of &lt;tt&gt;Parentclass&lt;/tt&gt;.
; bool IsA (name ClassName) : Returns whether the object's class is the specified class or a subclass. This function doesn't need a reference to the desired class, but just the class's name.

====Enabling / Disabling Functions ====
; Enable (name ProbeFunc) : Enables a [[Legacy:Probe Function|probe function]].
; Disable (name ProbeFunc) : Disables a [[Legacy:Probe Function|probe function]].

====Objects / Properties ====
; string GetPropertyText (string PropName) : Returns the value of the specified property [[Legacy:Typecasting|typecasted]] to string. This is useful when you don't want any dependencies to the package of an object, but still need to access its properties.&lt;br /&gt;Usage: &lt;tt&gt;aString = anObject.GetPropertyText(&quot;''PropertyName''&quot;);&lt;/tt&gt;
; SetPropertyText (string PropName, string PropValue) : Assigns a value to the specified property of an object. Only use this for properties that can be [[Legacy:Typecasting|typecasted]] from string.&lt;br /&gt;Usage: &lt;tt&gt;anObject.SetPropertyString(&quot;''PropertyName''&quot;, &quot;''new value''&quot;);&lt;/tt&gt;
; name GetEnum (Object E, int i) [static] : Returns the i-th element of the given enumeration, as in &lt;code&gt;GetEnum(enum'MyEnum', 2)&lt;/code&gt; or an empty name of the specified index exceeds the number of elements in the enumeration.
; [[Legacy:Object (UT)|Object (UT)]] DynamicLoadObject (string ObjectName, Class ObjectClass, optional bool MayFail) [static] : Loads and returns the specified object. If &lt;tt&gt;bMayFail&lt;/tt&gt; is true no error will be logged.
; SaveConfig ( ) : Saves the current values of config and globalconfig variables of this object to the ini file and sets them as default values for the object's class.
; StaticSaveConfig ( ) [static] : Saves the default values of config and globalconfig variables of this object's class to the ini file.
; ResetConfig ( ) [static] : Resets the config and globalconfig variables of this object's class to the values stored in Default.ini or DefUser.ini.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class Syntax|Class Syntax]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Operators|Operators]]
** [[Legacy:Object (UT)|Object class]]</text>
    </revision>
    <revision>
      <id>3400</id>
      <timestamp>2006-02-01T17:53:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>better description for the string functions</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] (Methods)}}

The functions listed here are globally available in all classes.  Due to [[Legacy:UnrealScript|UnrealScript]]'s strict object-oriented approach, they're actually methods of the [[Legacy:Object (UT)|Object (UT)]] class.

Almost all of these functions are declared as native and final (see [[Legacy:Class Syntax|class syntax]]) and most of them are also [[Legacy:Static Function|static function]]s.

See [[Legacy:Vector|vector]] and [[Legacy:Rotator|rotator]] for functions on those variable types.

See [[Legacy:Global Function|Global Function]] for global UT2003 functions.

===Integer Functions ===
; int Rand (int Max) [static] : Returns a random number ranging from 0 to Max-1.
; int Min (int A, int B) [static] : Returns the lower of the two values.
; int Max (int A, int B) [static] : Returns the higher of the two values.
; int Clamp (int V, int A, int B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.

===Float Functions ===
; float Abs (float A) [static] : Returns the absolute value (also known as the modulo) of A, usually written |A|. Eg: Abs(5) == Abs(-5) == 5.
; float Sin (float A) [static] : Returns sine( A )
; float Cos (float A) [static] : Returns cosine( A )
; float Tan (float A) [static] : Returns tan( A )
; float Atan (float A) [static] : Inverse tangent. Returns tan&lt;sup&gt;-1-&lt;/sup&gt;(A). Other inverse trig functions are not included in [[Legacy:UT|UT]]'s UnrealScript. (see [[Legacy:Useful Maths Functions|Useful Maths Functions]])
; float Exp (float A) [static] : Returns e&lt;sup&gt;A&lt;/sup&gt;
; float Loge (float A) [static] : Returns log(A), the natural logarithm.
; float Sqrt (float A) [static] : Returns the square root of A.
; float Square (float A) [static] : Returns A&lt;sup&gt;2&lt;/sup&gt;.
; float FRand ( ) : Returns a random number between 0 and 1.
; float FMin (float A, float B) [static] : Returns the lower of the two values.
; float FMax (float A, float B) [static] : Returns the higher of the two values.
; float FClamp (float V, float A, float B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.
; float Lerp (float Alpha, float A, float B) [static] : &quot;Returns the linear interpolation between A and B.&quot;&lt;br /&gt;The return value is calculated through something like this:&lt;br /&gt;&lt;tt&gt;(B - A) * Alpha + A&lt;/tt&gt;
; float Smerp (float Alpha, float A, float B) [static] : Returns an Alpha-smooth nonlinear interpolation between A and B.&lt;br /&gt;The return value seems to be calculated through something like this:&lt;br /&gt;&lt;tt&gt;(-2 * (B - A) * Alpha ** 3) + (3 * (B - A) * Alpha ** 2) + A&lt;/tt&gt;
;[[Image:Legacy_interpolation-smerp.gif|]]
; float RandRange (float Min, float Max) : Returns a random number between Min and Max. This function is not static.

===String Functions ===
; int Len (coerce string S) [static] : Returns the length of the string, i.e. the number of characters in it.
; int InStr (coerce string haystack, coerce string needle) [static] : If the string &lt;tt&gt;needle&lt;/tt&gt; is found inside &lt;tt&gt;haystack&lt;/tt&gt;, the number of characters in &lt;tt&gt;haystack&lt;/tt&gt; ''before'' the first occurance of &lt;tt&gt;needle&lt;/tt&gt; is returned. That is, if the &lt;tt&gt;needle&lt;/tt&gt; is found right at the beginning of &lt;tt&gt;haystack&lt;/tt&gt;, 0 is returned. If &lt;tt&gt;haystack&lt;/tt&gt; doesn't contain &lt;tt&gt;needle&lt;/tt&gt;, InStr returns -1.
; string Mid (coerce string S, int skip, optional int num) [static] : Returns a substring of &lt;tt&gt;S&lt;/tt&gt;, skipping &lt;tt&gt;skip&lt;/tt&gt; characters and returning the next &lt;tt&gt;num&lt;/tt&gt; characters or all remaining if the third parameter is left out. Mid(&quot;hello&quot;, 0, 2) returns &quot;he&quot;, Mid(&quot;hello&quot;, 1) returns &quot;ello&quot;, i.e. all but the first character.
; string Left (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; leftmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Right (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; rightmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Caps (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to uppercase.
; string Chr (int i) [static] : Returns the character matchin the given ASCII code.
; int Asc (string S) [static] : Returns the ASCII code of the first character in &lt;tt&gt;S&lt;/tt&gt;.

===General Functions ===

====Logging ====
; Log (coerce string S, optional name Tag) [static] : Writes a line to the log file. The line begins with the Tag or &quot;ScriptLog:&quot; if Tag was not specified, followed by the log string.&lt;br /&gt;The tags 'Error' and 'Warning' (and probably others, too) have a special meaning in [[Legacy:Commandlet|Commandlet]]s.
; Warn (coerce string S) [static] : Same like &lt;tt&gt;Log&lt;/tt&gt;, but the line starts with &quot;ScriptWarning:&quot; and contains information about the object, state and function that called &lt;tt&gt;Warn&lt;/tt&gt;.
; string Localize (string SectionName, string KeyName, string PackageName) [static] : Returns the string found in ''PackageName''.int in the [''SectionName''] section. Logs an error if no localization for the specified string is found.

====State-Related ====
; GotoState (optional name NewState, optional name Label) : Switches to a new state. State code execution begins at the specified label or at &quot;Begin:&quot; if &lt;tt&gt;Label&lt;/tt&gt; is not specified.&lt;br /&gt;Before the state is changed the old state's &lt;tt&gt;EndState&lt;/tt&gt; function is called. After the state changed &lt;tt&gt;BeginState&lt;/tt&gt; of the new state is called.
; bool IsInState (name TestState) : Returns whether the object's current state is the one specified.
; name GetStateName ( ) : Returns the object's current state name.
; BeginState ( ) [not native, not final] : This event is executed during GotoState right after the object switched to the new state. This function can be overridden in any state of any class.
; EndState ( ) [not native, not final] : This event is executed during GotoState right before the object switches to the new state. This function can be overridden in any state of any class.

====Class Hierarchy ====
; bool ClassIsChildOf (class TestClass, class ParentClass) [static] : Returns whether &lt;tt&gt;TestClass&lt;/tt&gt; is a subclass of &lt;tt&gt;Parentclass&lt;/tt&gt;.
; bool IsA (name ClassName) : Returns whether the object's class is the specified class or a subclass. This function doesn't need a reference to the desired class, but just the class's name.

====Enabling / Disabling Functions ====
; Enable (name ProbeFunc) : Enables a [[Legacy:Probe Function|probe function]].
; Disable (name ProbeFunc) : Disables a [[Legacy:Probe Function|probe function]].

====Objects / Properties ====
; string GetPropertyText (string PropName) : Returns the value of the specified property [[Legacy:Typecasting|typecasted]] to string. This is useful when you don't want any dependencies to the package of an object, but still need to access its properties.&lt;br /&gt;Usage: &lt;tt&gt;aString = anObject.GetPropertyText(&quot;''PropertyName''&quot;);&lt;/tt&gt;
; SetPropertyText (string PropName, string PropValue) : Assigns a value to the specified property of an object. Only use this for properties that can be [[Legacy:Typecasting|typecasted]] from string.&lt;br /&gt;Usage: &lt;tt&gt;anObject.SetPropertyString(&quot;''PropertyName''&quot;, &quot;''new value''&quot;);&lt;/tt&gt;
; name GetEnum (Object E, int i) [static] : Returns the i-th element of the given enumeration, as in &lt;code&gt;GetEnum(enum'MyEnum', 2)&lt;/code&gt; or an empty name of the specified index exceeds the number of elements in the enumeration.
; [[Legacy:Object (UT)|Object (UT)]] DynamicLoadObject (string ObjectName, Class ObjectClass, optional bool MayFail) [static] : Loads and returns the specified object. If &lt;tt&gt;bMayFail&lt;/tt&gt; is true no error will be logged.
; SaveConfig ( ) : Saves the current values of config and globalconfig variables of this object to the ini file and sets them as default values for the object's class.
; StaticSaveConfig ( ) [static] : Saves the default values of config and globalconfig variables of this object's class to the ini file.
; ResetConfig ( ) [static] : Resets the config and globalconfig variables of this object's class to the values stored in Default.ini or DefUser.ini.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class Syntax|Class Syntax]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Operators|Operators]]
** [[Legacy:Object (UT)|Object class]]

==Discussion==
:'''Nobody:''' Do all the string functions count the first character of the passed string as 0? I know it says here that instr(...) does this, and I've updated mid(...) to show this, not sure of the others, if so needs clarified.</text>
    </revision>
    <revision>
      <id>33855</id>
      <timestamp>2008-12-30T15:40:07Z</timestamp>
      <contributor>
        <username>Azura</username>
        <id>1856</id>
      </contributor>
      <minor/>
      <comment>Removed incorrect reference to modulo in description of Abs function</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] (Methods)}}

The functions listed here are globally available in all classes.  Due to [[Legacy:UnrealScript|UnrealScript]]'s strict object-oriented approach, they're actually methods of the [[Legacy:Object (UT)|Object (UT)]] class.

Almost all of these functions are declared as native and final (see [[Legacy:Class Syntax|class syntax]]) and most of them are also [[Legacy:Static Function|static function]]s.

See [[Legacy:Vector|vector]] and [[Legacy:Rotator|rotator]] for functions on those variable types.

See [[Legacy:Global Function|Global Function]] for global UT2003 functions.

===Integer Functions ===
; int Rand (int Max) [static] : Returns a random number ranging from 0 to Max-1.
; int Min (int A, int B) [static] : Returns the lower of the two values.
; int Max (int A, int B) [static] : Returns the higher of the two values.
; int Clamp (int V, int A, int B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.

===Float Functions ===
; float Abs (float A) [static] : Returns the absolute value of A, usually written |A|. Eg: Abs(5) == Abs(-5) == 5.
; float Sin (float A) [static] : Returns sine( A )
; float Cos (float A) [static] : Returns cosine( A )
; float Tan (float A) [static] : Returns tan( A )
; float Atan (float A) [static] : Inverse tangent. Returns tan&lt;sup&gt;-1-&lt;/sup&gt;(A). Other inverse trig functions are not included in [[Legacy:UT|UT]]'s UnrealScript. (see [[Legacy:Useful Maths Functions|Useful Maths Functions]])
; float Exp (float A) [static] : Returns e&lt;sup&gt;A&lt;/sup&gt;
; float Loge (float A) [static] : Returns log(A), the natural logarithm.
; float Sqrt (float A) [static] : Returns the square root of A.
; float Square (float A) [static] : Returns A&lt;sup&gt;2&lt;/sup&gt;.
; float FRand ( ) : Returns a random number between 0 and 1.
; float FMin (float A, float B) [static] : Returns the lower of the two values.
; float FMax (float A, float B) [static] : Returns the higher of the two values.
; float FClamp (float V, float A, float B) [static] : If V is smaller than A, A is returned. If V is larger than B, B is returned. In any other case V is returned.
; float Lerp (float Alpha, float A, float B) [static] : &quot;Returns the linear interpolation between A and B.&quot;&lt;br /&gt;The return value is calculated through something like this:&lt;br /&gt;&lt;tt&gt;(B - A) * Alpha + A&lt;/tt&gt;
; float Smerp (float Alpha, float A, float B) [static] : Returns an Alpha-smooth nonlinear interpolation between A and B.&lt;br /&gt;The return value seems to be calculated through something like this:&lt;br /&gt;&lt;tt&gt;(-2 * (B - A) * Alpha ** 3) + (3 * (B - A) * Alpha ** 2) + A&lt;/tt&gt;
;[[Image:Legacy_interpolation-smerp.gif|Legacy_interpolation-smerp.gif]]
; float RandRange (float Min, float Max) : Returns a random number between Min and Max. This function is not static.

===String Functions ===
; int Len (coerce string S) [static] : Returns the length of the string, i.e. the number of characters in it.
; int InStr (coerce string haystack, coerce string needle) [static] : If the string &lt;tt&gt;needle&lt;/tt&gt; is found inside &lt;tt&gt;haystack&lt;/tt&gt;, the number of characters in &lt;tt&gt;haystack&lt;/tt&gt; ''before'' the first occurance of &lt;tt&gt;needle&lt;/tt&gt; is returned. That is, if the &lt;tt&gt;needle&lt;/tt&gt; is found right at the beginning of &lt;tt&gt;haystack&lt;/tt&gt;, 0 is returned. If &lt;tt&gt;haystack&lt;/tt&gt; doesn't contain &lt;tt&gt;needle&lt;/tt&gt;, InStr returns -1.
; string Mid (coerce string S, int skip, optional int num) [static] : Returns a substring of &lt;tt&gt;S&lt;/tt&gt;, skipping &lt;tt&gt;skip&lt;/tt&gt; characters and returning the next &lt;tt&gt;num&lt;/tt&gt; characters or all remaining if the third parameter is left out. Mid(&quot;hello&quot;, 0, 2) returns &quot;he&quot;, Mid(&quot;hello&quot;, 1) returns &quot;ello&quot;, i.e. all but the first character.
; string Left (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; leftmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Right (coerce string S, int num) [static] : Returns the &lt;tt&gt;num&lt;/tt&gt; rightmost characters of &lt;tt&gt;S&lt;/tt&gt; or all of them if &lt;tt&gt;S&lt;/tt&gt; contains less than &lt;tt&gt;num&lt;/tt&gt; characters.
; string Caps (coerce string S) [static] : Returns &lt;tt&gt;S&lt;/tt&gt; converted to uppercase.
; string Chr (int i) [static] : Returns the character matchin the given ASCII code.
; int Asc (string S) [static] : Returns the ASCII code of the first character in &lt;tt&gt;S&lt;/tt&gt;.

===General Functions ===

====Logging ====
; Log (coerce string S, optional name Tag) [static] : Writes a line to the log file. The line begins with the Tag or &quot;ScriptLog:&quot; if Tag was not specified, followed by the log string.&lt;br /&gt;The tags 'Error' and 'Warning' (and probably others, too) have a special meaning in [[Legacy:Commandlet|Commandlet]]s.
; Warn (coerce string S) [static] : Same like &lt;tt&gt;Log&lt;/tt&gt;, but the line starts with &quot;ScriptWarning:&quot; and contains information about the object, state and function that called &lt;tt&gt;Warn&lt;/tt&gt;.
; string Localize (string SectionName, string KeyName, string PackageName) [static] : Returns the string found in ''PackageName''.int in the [''SectionName''] section. Logs an error if no localization for the specified string is found.

====State-Related ====
; GotoState (optional name NewState, optional name Label) : Switches to a new state. State code execution begins at the specified label or at &quot;Begin:&quot; if &lt;tt&gt;Label&lt;/tt&gt; is not specified.&lt;br /&gt;Before the state is changed the old state's &lt;tt&gt;EndState&lt;/tt&gt; function is called. After the state changed &lt;tt&gt;BeginState&lt;/tt&gt; of the new state is called.
; bool IsInState (name TestState) : Returns whether the object's current state is the one specified.
; name GetStateName ( ) : Returns the object's current state name.
; BeginState ( ) [not native, not final] : This event is executed during GotoState right after the object switched to the new state. This function can be overridden in any state of any class.
; EndState ( ) [not native, not final] : This event is executed during GotoState right before the object switches to the new state. This function can be overridden in any state of any class.

====Class Hierarchy ====
; bool ClassIsChildOf (class TestClass, class ParentClass) [static] : Returns whether &lt;tt&gt;TestClass&lt;/tt&gt; is a subclass of &lt;tt&gt;Parentclass&lt;/tt&gt;.
; bool IsA (name ClassName) : Returns whether the object's class is the specified class or a subclass. This function doesn't need a reference to the desired class, but just the class's name.

====Enabling / Disabling Functions ====
; Enable (name ProbeFunc) : Enables a [[Legacy:Probe Function|probe function]].
; Disable (name ProbeFunc) : Disables a [[Legacy:Probe Function|probe function]].

====Objects / Properties ====
; string GetPropertyText (string PropName) : Returns the value of the specified property [[Legacy:Typecasting|typecasted]] to string. This is useful when you don't want any dependencies to the package of an object, but still need to access its properties.&lt;br /&gt;Usage: &lt;tt&gt;aString = anObject.GetPropertyText(&quot;''PropertyName''&quot;);&lt;/tt&gt;
; SetPropertyText (string PropName, string PropValue) : Assigns a value to the specified property of an object. Only use this for properties that can be [[Legacy:Typecasting|typecasted]] from string.&lt;br /&gt;Usage: &lt;tt&gt;anObject.SetPropertyString(&quot;''PropertyName''&quot;, &quot;''new value''&quot;);&lt;/tt&gt;
; name GetEnum (Object E, int i) [static] : Returns the i-th element of the given enumeration, as in &lt;code&gt;GetEnum(enum'MyEnum', 2)&lt;/code&gt; or an empty name of the specified index exceeds the number of elements in the enumeration.
; [[Legacy:Object (UT)|Object (UT)]] DynamicLoadObject (string ObjectName, Class ObjectClass, optional bool MayFail) [static] : Loads and returns the specified object. If &lt;tt&gt;bMayFail&lt;/tt&gt; is true no error will be logged.
; SaveConfig ( ) : Saves the current values of config and globalconfig variables of this object to the ini file and sets them as default values for the object's class.
; StaticSaveConfig ( ) [static] : Saves the default values of config and globalconfig variables of this object's class to the ini file.
; ResetConfig ( ) [static] : Resets the config and globalconfig variables of this object's class to the values stored in Default.ini or DefUser.ini.

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Class Syntax|Class Syntax]]
** [[Legacy:Function Syntax|Function Syntax]]
** [[Legacy:Operators|Operators]]
** [[Legacy:Object (UT)|Object class]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Glossary</title>
    <id>1328</id>
    <revision>
      <id>3383</id>
      <timestamp>2003-04-13T22:35:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>#REDIRECT [[Terminology]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Terminology|Terminology]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gmax</title>
    <id>1359</id>
    <revision>
      <id>3451</id>
      <timestamp>2006-09-06T03:22:33Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <minor/>
      <comment>My wording sucked.</comment>
      <text xml:space="preserve">A [[Legacy:Modeling Application|Modeling Application]].

Taken from [http://www4.discreet.com/gmax/ the gmax website]:

{{innerbox|gmax®  is a free 3D modeling and animation tool based on Discreet's award-winning 3ds max® software. Built for gamers to create their own in-game content for gmax ready games, a gamer can produce everything from characters and vehicles to landscapes and props. Not only do you get to customize your games, you also learn 3D design within a professional-level tool. 

}}

Visit the gmax website at http://www4.discreet.com/gmax/ to learn more or [http://www.turbosquid.com/gmax download gmax] from TurboSquid.

Note, [http://www.discreet.com discreet] has stopped the development of GMAX.

===How to use Gmax models in Unreal===

Unfortunatly there has never been an official Unreal gamespack for Gmax, making it difficult to export models to Unreal. Follow these 5. steps to use Gmax as your modeller for Unreal.

1. First you will need to get Gmax, download it from [http://www.turbosquid.com/gmax Turbosquid]. During the installation you will be asked for a serial code which can be attained through the registration link provided in the setup program. The registration is done at the Turbosquid site. Now create a model.

2. Now that you have Gmax, you will need the MD3 exporter to export the model outside of Gmax. You can download Quake-3 MD3 exporter beta v1.0 (ExportMD3_gmax_beta1.zip) from [http://pages.videotron.com/browser/ Browser ICE's home of Chris Cookson GMAX and 3d max plugins/scripts]  . MD3 is the format Quake3 uses for it's models. Put the dle file in the plugins directory. The next time you load Gmax, you will be able to export to the MD3 file format. From here it is only a small step.

3. Download the [http://doom3.planet-multiplayer.de/download.php?view.96 Quake3 to Doom3 file converter]. Put the md3toASE file in the meshes directory of Gmax, it is all you will need. Go to the directory in the Command Prompt and use &quot;md3toASE myfile.md3 myfile.ase&quot; to convert your file. This converts the file to .ASE file format. Now your file will work in Doom3. However if you load it into UnrealEd, it will crash. This is due to a small bug in the .ASE file format that the converter produces.

4. You will need to manually edit the numbers of the faces of the ASE file to have a ':' behind them. Example:

Old: *MESH_FACE 0 A: 3 B: 1 C: 0  AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING *MESH_MTLID 0

New: *MESH_FACE 0: A: 3 B: 1 C: 0  AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING *MESH_MTLID 0

Also, edit the line with the filename of the texture that you used (All sides of the model need to be textured) to have the correct extension and remove the part that refers to Doom

Example:
*BITMAP &quot;C:\mybitmap.bmp&quot;

5. Now import your model in UnrealEd! Make sure to save your map before importing, a small error is enough to crash UnrealEd...

----

'''Tgusagalpa:''' As of October 6, 2005 GMax will no longer be offered as a free product, but you may have a free 30-day trial.

'''StarWeaver:''' Um, from the forum linked from this site [http://usa.autodesk.com/adsk/servlet/index?id=5562445&amp;siteID=123112 Autodesk GMAX site], it looks like what's really happening is this:
* The current version of gmax will continue to be released as-is, but with no further support.
* At some future time, a new version of gmax, coded around windows vista, will be released and supported. (It looks like the whole problem here is that the application is too tightly bound to the current versions of the OS and won't run on the newer one without admin privledges or some such.)

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3452</id>
      <timestamp>2006-08-27T01:55:55Z</timestamp>
      <contributor>
        <ip>Tgusagalpa</ip>
      </contributor>
      <comment>No more GMax</comment>
      <text xml:space="preserve">A [[Legacy:Modeling Application|Modeling Application]].

Taken from [http://www4.discreet.com/gmax/ the gmax website]:

{{innerbox|gmax®  is a free 3D modeling and animation tool based on Discreet's award-winning 3ds max® software. Built for gamers to create their own in-game content for gmax ready games, a gamer can produce everything from characters and vehicles to landscapes and props. Not only do you get to customize your games, you also learn 3D design within a professional-level tool. 

}}

Visit the gmax website at http://www4.discreet.com/gmax/ to learn more or [http://www.turbosquid.com/gmax download gmax] from TurboSquid.

Note, [http://www.discreet.com discreet] has stopped the development of GMAX.

===How to use Gmax models in Unreal===

Unfortunatly there has never been an official Unreal gamespack for Gmax, making it difficult to export models to Unreal. Follow these 5. steps to use Gmax as your modeller for Unreal.

1. First you will need to get Gmax, download it from [http://www.turbosquid.com/gmax Turbosquid]. During the installation you will be asked for a serial code which can be attained through the registration link provided in the setup program. The registration is done at the Turbosquid site. Now create a model.

2. Now that you have Gmax, you will need the MD3 exporter to export the model outside of Gmax. You can download Quake-3 MD3 exporter beta v1.0 (ExportMD3_gmax_beta1.zip) from [http://pages.videotron.com/browser/ Browser ICE's home of Chris Cookson GMAX and 3d max plugins/scripts]  . MD3 is the format Quake3 uses for it's models. Put the dle file in the plugins directory. The next time you load Gmax, you will be able to export to the MD3 file format. From here it is only a small step.

3. Download the [http://doom3.planet-multiplayer.de/download.php?view.96 Quake3 to Doom3 file converter]. Put the md3toASE file in the meshes directory of Gmax, it is all you will need. Go to the directory in the Command Prompt and use &quot;md3toASE myfile.md3 myfile.ase&quot; to convert your file. This converts the file to .ASE file format. Now your file will work in Doom3. However if you load it into UnrealEd, it will crash. This is due to a small bug in the .ASE file format that the converter produces.

4. You will need to manually edit the numbers of the faces of the ASE file to have a ':' behind them. Example:

Old: *MESH_FACE 0 A: 3 B: 1 C: 0  AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING *MESH_MTLID 0

New: *MESH_FACE 0: A: 3 B: 1 C: 0  AB: 1 BC: 1 CA: 1 *MESH_SMOOTHING *MESH_MTLID 0

Also, edit the line with the filename of the texture that you used (All sides of the model need to be textured) to have the correct extension and remove the part that refers to Doom

Example:
*BITMAP &quot;C:\mybitmap.bmp&quot;

5. Now import your model in UnrealEd! Make sure to save your map before importing, a small error is enough to crash UnrealEd...

----

'''Tgusagalpa:''' As of October 6, 2005 GMax will no longer be offered as a free product, but you may have a free 30-day trial.

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GnuMake</title>
    <id>1370</id>
    <revision>
      <id>3474</id>
      <timestamp>2007-11-19T12:25:52Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Building UnrealScript with GNU Make==

This page is relevant to [[Legacy:UT2004|UT2004]] and possibly earlier.

I like to develop under [[Wikipedia:cygwin]] as it gives me civilized features like vi and forward-slashes for directories.  If you think I'm mad, then this isn't the page for you.

To make new packages, you should put the source in $UTHOME/$MYMODNAME/Classes

Unreal's &lt;tt&gt;ucc make&lt;/tt&gt; command is very disappointing since it does not examine dependencies or timestamps.

Here's a handy makefile for cygwin users.  It goes in the same directory as the source files and lets you build the package just by going &lt;tt&gt;make&lt;/tt&gt; in the source dir.  Since your package will not be built unless it appears in the UT2004.ini file, this makefile also checks for its presence.  If you can code a script to insert the desired line into the .ini file, then it will be fully automatic.

==Session script:==
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $ ls
 Makefile           TBSniperAmmo.uc        TBSniperAttachment.uc  TBSniperRifle.uc        TBSniperSmoke.uc
 MutUseTBSniper.uc  TBSniperAmmoPickup.uc  TBSniperFire.uc        TBSniperRiflePickup.uc  TBSniperZoom.uc
 
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $ cat Makefile
 #
 # Makefile for UT2004 projects under cygwin.
 #
 # Place this in your Classes directory next to all your sources.
 #
 # $Id: $
 
 ########################################################################
 # Assign the name of your Package.
 
 PKG=MutTBSniper
 
 ########################################################################
 # You shouldn't need to change below this text for code-only mods. I
 # haven't tried anything with meshes or textures yet, but chances are
 # you just need to alter the INS wildcard declaration below
 ########################################################################
 
 INS+=$(wildcard *.uc)
 OUTS+=../../System/$(PKG).u
 OUTS+=../../System/$(PKG).ucl
 
 SYS=../../System
 
 ifeq ($(shell fgrep EditPackages=$(PKG) $(SYS)/UT2004.ini),)
 $(error You need to insert &quot;EditPackages=$(PKG)&quot; in $(SYS)/UT2004.ini after those packages it depends upon)
 endif
 
 $(OUTS): $(INS) Makefile
         @-rm $(OUTS)
         (cd $(SYS); ./UCC.exe make )
 
 
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $

----

Enjoy!

'''El Muerte:''' doesn't this also work with other &lt;code&gt;make&lt;/code&gt; tools? Like borland's make program, included with the free CBuilder 5.5 compile: http://www.borland.com/products/downloads/download_cbuilder.html#

'''Sweavo:''' possibly, but I wouldn't like to bet on it: all versions of make are subtly different, and I wouldn't bet on the &lt;code&gt;$(shell ...)&lt;/code&gt; or &lt;code&gt;$(wildcard ...)&lt;/code&gt; functions being present anywhere except [http://www.gnu.org/software/make/manual/html_mono/make.html gnu make 3.80].
[[Category:Legacy Toolchain|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3475</id>
      <timestamp>2005-03-09T07:34:43Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Building UnrealScript with GNU Make==

This page is relevant to [[Legacy:UT2004|UT2004]] and possibly earlier.

I like to develop under [[Wikipedia:cygwin]] as it gives me civilized features like vi and forward-slashes for directories.  If you think I'm mad, then this isn't the page for you.

To make new packages, you should put the source in $UTHOME/$MYMODNAME/Classes

Unreal's &lt;tt&gt;ucc make&lt;/tt&gt; command is very disappointing since it does not examine dependencies or timestamps.

Here's a handy makefile for cygwin users.  It goes in the same directory as the source files and lets you build the package just by going &lt;tt&gt;make&lt;/tt&gt; in the source dir.  Since your package will not be built unless it appears in the UT2004.ini file, this makefile also checks for its presence.  If you can code a script to insert the desired line into the .ini file, then it will be fully automatic.

==Session script:==
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $ ls
 Makefile           TBSniperAmmo.uc        TBSniperAttachment.uc  TBSniperRifle.uc        TBSniperSmoke.uc
 MutUseTBSniper.uc  TBSniperAmmoPickup.uc  TBSniperFire.uc        TBSniperRiflePickup.uc  TBSniperZoom.uc
 
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $ cat Makefile
 #
 # Makefile for UT2004 projects under cygwin.
 #
 # Place this in your Classes directory next to all your sources.
 #
 # $Id: $
 
 ########################################################################
 # Assign the name of your Package.
 
 PKG=MutTBSniper
 
 ########################################################################
 # You shouldn't need to change below this text for code-only mods. I
 # haven't tried anything with meshes or textures yet, but chances are
 # you just need to alter the INS wildcard declaration below
 ########################################################################
 
 INS+=$(wildcard *.uc)
 OUTS+=../../System/$(PKG).u
 OUTS+=../../System/$(PKG).ucl
 
 SYS=../../System
 
 ifeq ($(shell fgrep EditPackages=$(PKG) $(SYS)/UT2004.ini),)
 $(error You need to insert &quot;EditPackages=$(PKG)&quot; in $(SYS)/UT2004.ini after those packages it depends upon)
 endif
 
 $(OUTS): $(INS) Makefile
         @-rm $(OUTS)
         (cd $(SYS); ./UCC.exe make )
 
 
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $

----

Enjoy!

'''El Muerte:''' doesn't this also work with other &lt;code&gt;make&lt;/code&gt; tools? Like borland's make program, included with the free CBuilder 5.5 compile: http://www.borland.com/products/downloads/download_cbuilder.html#</text>
    </revision>
    <revision>
      <id>3476</id>
      <timestamp>2005-03-09T13:08:18Z</timestamp>
      <contributor>
        <ip>80.168.208.70</ip>
      </contributor>
      <comment>posted reply to comment</comment>
      <text xml:space="preserve">==Building UnrealScript with GNU Make==

This page is relevant to [[Legacy:UT2004|UT2004]] and possibly earlier.

I like to develop under [[Wikipedia:cygwin]] as it gives me civilized features like vi and forward-slashes for directories.  If you think I'm mad, then this isn't the page for you.

To make new packages, you should put the source in $UTHOME/$MYMODNAME/Classes

Unreal's &lt;tt&gt;ucc make&lt;/tt&gt; command is very disappointing since it does not examine dependencies or timestamps.

Here's a handy makefile for cygwin users.  It goes in the same directory as the source files and lets you build the package just by going &lt;tt&gt;make&lt;/tt&gt; in the source dir.  Since your package will not be built unless it appears in the UT2004.ini file, this makefile also checks for its presence.  If you can code a script to insert the desired line into the .ini file, then it will be fully automatic.

==Session script:==
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $ ls
 Makefile           TBSniperAmmo.uc        TBSniperAttachment.uc  TBSniperRifle.uc        TBSniperSmoke.uc
 MutUseTBSniper.uc  TBSniperAmmoPickup.uc  TBSniperFire.uc        TBSniperRiflePickup.uc  TBSniperZoom.uc
 
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $ cat Makefile
 #
 # Makefile for UT2004 projects under cygwin.
 #
 # Place this in your Classes directory next to all your sources.
 #
 # $Id: $
 
 ########################################################################
 # Assign the name of your Package.
 
 PKG=MutTBSniper
 
 ########################################################################
 # You shouldn't need to change below this text for code-only mods. I
 # haven't tried anything with meshes or textures yet, but chances are
 # you just need to alter the INS wildcard declaration below
 ########################################################################
 
 INS+=$(wildcard *.uc)
 OUTS+=../../System/$(PKG).u
 OUTS+=../../System/$(PKG).ucl
 
 SYS=../../System
 
 ifeq ($(shell fgrep EditPackages=$(PKG) $(SYS)/UT2004.ini),)
 $(error You need to insert &quot;EditPackages=$(PKG)&quot; in $(SYS)/UT2004.ini after those packages it depends upon)
 endif
 
 $(OUTS): $(INS) Makefile
         @-rm $(OUTS)
         (cd $(SYS); ./UCC.exe make )
 
 
 Steve@bigbro /cygdrive/c/UT2004/MutTBSniper/Classes
 $

----

Enjoy!

'''El Muerte:''' doesn't this also work with other &lt;code&gt;make&lt;/code&gt; tools? Like borland's make program, included with the free CBuilder 5.5 compile: http://www.borland.com/products/downloads/download_cbuilder.html#

'''Sweavo:''' possibly, but I wouldn't like to bet on it: all versions of make are subtly different, and I wouldn't bet on the &lt;code&gt;$(shell ...)&lt;/code&gt; or &lt;code&gt;$(wildcard ...)&lt;/code&gt; functions being present anywhere except [http://www.gnu.org/software/make/manual/html_mono/make.html gnu make 3.80].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GoldWave</title>
    <id>1376</id>
    <revision>
      <id>3488</id>
      <timestamp>2006-05-05T18:41:50Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Cleared out closed discussion</comment>
      <text xml:space="preserve">[[Image:Legacy_GoldWaveLogo.png|right|]]

[http://www.goldwave.com GoldWave]] is a shareware application for recording and editing sound files.  It can import many sound formats, has a number of useful effects, and can write .ogg files, which UT uses for the music track.

It cannot directly save sounds as .uax ( [[Legacy:UAX_File|UAX_File]] ), UT's internal sound package file format, but [[Legacy:UnrealEd_2|UnrealEd_2]] can easily import sounds that GoldWave exports. 

This means that GoldWave can be used to record and edit all the sounds you will ever need to use in UT and you will not need any other software except [[Legacy:UnrealEd_2|UnrealEd_2]]. Cool, huh?

===Supported File Formats:===

GoldWave supports many file formats at many levels of quality:

==Import:==

.wav - WAVE file

.mp3 - MPEG layer 3 audio file

.xac - Extended audio

.aif - Apple audio

.afc - Apple-C

.iff - Amiga

.au  - Sun

.voc - Sound Blaster

.snd - Raw

.sds - MIDI Instrument Sample

.smp - SampleVision

.vox - Dialogic

.mat - Matlab

.txt - Numerical Text 

.tmp - GoldWave temp file

.avi - System

.flac - FLAC lossless codec

.ogg - OGG vorbis (UT uses this as it's music format)

.wma - Windows Media Audio

==Export:==

GoldWave exports to all of the above file types, in a vast range of qualities, compression levels, and sample rates, also either in monophone or stereo format.  For sounds in UT (not music) you need 22500kHz, 16-bit , mono.  See [[Legacy:Importing Sounds|Importing Sounds]].

===Shareware:===

GoldWave is shareware, meaning you can download and use it as if it were the retail product, but to use it in it's entirity, you must register it for a fee or purchase it.

==Limitations:==

When you open the Shareware version of GoldWave, its help file (not a HTML browser window) pops up asking you to register. 

Shareware GoldWave limits you to 3000 commands before it stops working until you register it. I have been using GoldWave for about a year and have used up 785 commands. There is a box on the status window showing how many commands you have used so far.

Additionally, Goldwave limits you to 150 commands each time you run the software before its help file pops up with each command asking you to register.  You can still save your work if you are on command 150, it's not like the program ceases to function and you lose all your work. 

==Registration:==

As of when this page was created (November 07, 2005) registering GoldWave cost CAD$55 (Canadian dollars) which is about $48 US. Registration is done with credit card.

===Links:===

[http://www.goldwave.com GoldWave Website]

This page was created by Bob_The_Beheader, nov. 07, 2005

===Comments:===

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3489</id>
      <timestamp>2005-11-28T16:53:55Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_GoldWaveLogo.png|right|]]

[http://www.goldwave.com GoldWave]] is a shareware application for recording and editing sound files. It has no ability to save sounds as .uax ( [[Legacy:UAX_File|UAX_File]] ) , UT's internal sound package file format, but [[Legacy:UnrealEd_2|UnrealEd_2]] can easily import sounds that GoldWave exports. Also, GoldWave can export files of the .ogg format, which UT uses as it's music files. This means that GoldWave can be used to record and edit all the sounds you will ever need to use in UT and you will not need any other software except [[Legacy:UnrealEd_2|UnrealEd_2]]. Cool, huh?

===Supported File Formats:===

GoldWave supports many file formats at many levels of quality:

==Import:==

.wav - WAVE file

.mp3 - MPEG layer 3 audio file

.xac - Extended audio

.aif - Apple audio

.afc - Apple-C

.iff - Amiga

.au  - Sun

.voc - Sound Blaster

.snd - Raw

.sds - MIDI Instrument Sample

.smp - SampleVision

.vox - Dialogic

.mat - Matlab

.txt - Numerical Text 

.tmp - GoldWave temp file

.avi - System

.flac - FLAC lossless codec

.ogg - OGG vorbis (UT uses this as it's music format)

.wma - Windows Media Audio

==Export:==

GoldWave exports to all of the above file types, in a vast range of qualities, compression levels, and sample rates, also either in monophone or stereo format.

===Shareware:===

GoldWave is shareware, meaning you can download and use it as if it were the retail product, but to use it in it's entirity, you must register it for a fee or purchace it.

==Limitations:==

When you open the Shareware version of GoldWave, it's help file (not a HTML browser window) pops up asking you to register. 

Shareware GoldWave limits you to 3000 commands before it stops working until you register it. I have been using GoldWave for about a year and have used up 785 commands. There is a box on the status window showing how many commands you have used so far.

Additionally, Goldwave limits you to 150 commands each time you run the software before it's help file pops up with each command asking you to register. You can still save your work if you are on command 150, it's not like the program ceases to function and you loose all your work. 

==Registration:==

As of when this page was created (November 07, 2005) registering GoldWave cost CAD$55 (Canadian dollars) which is about $48 US. Registration is done with credit card.

===Links:===

[http://www.goldwave.com GoldWave Website]

This page was created by Bob_The_Beheader, nov. 07, 2005

===Comments:===

'''Sweavo:''' Why have this page?  If you want to create wavs you can google for it.  The wiki is hard enough to find your way around as a new user without pages that have nothing to do with unreal.  I suggest this page is removed.

'''Solid Snake:''' Agreed. There are better freeware programs than this.

'''Bob_The_Beheader:''' :confused: OK... I just think that, you know, the wike has alot of pages and articles about modeling and creating meshes and stuff, but kind of ignores the aspect that sound plays in the game...I was just trying to add some stuff about creating new sounds for UT. Anyways, as for your argument, Sweavo, This page is here for the same reason that pages exist for [[Legacy:3D_Studio_Max|3D_Studio_Max]] and [[Legacy:Maya|Maya]]. You could just google for them too, so why have pages about 'em? This page is sort of advertisment-ish, talking about prices and stuff, but hell - take it out if it bothers you... There probably are better programs then this one, and so, why not make a page for them?

'''Graphik:''' Seems to have worth to some. No deletion necessary.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3490</id>
      <timestamp>2005-11-28T17:04:31Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>Change of heart re: deletion, made page slightly more task-focused</comment>
      <text xml:space="preserve">[[Image:Legacy_GoldWaveLogo.png|right|]]

[http://www.goldwave.com GoldWave]] is a shareware application for recording and editing sound files.  It can import many sound formats, has a number of useful effects, and can write .ogg files, which UT uses for the music track.

It cannot directly save sounds as .uax ( [[Legacy:UAX_File|UAX_File]] ), UT's internal sound package file format, but [[Legacy:UnrealEd_2|UnrealEd_2]] can easily import sounds that GoldWave exports. 

This means that GoldWave can be used to record and edit all the sounds you will ever need to use in UT and you will not need any other software except [[Legacy:UnrealEd_2|UnrealEd_2]]. Cool, huh?

===Supported File Formats:===

GoldWave supports many file formats at many levels of quality:

==Import:==

.wav - WAVE file

.mp3 - MPEG layer 3 audio file

.xac - Extended audio

.aif - Apple audio

.afc - Apple-C

.iff - Amiga

.au  - Sun

.voc - Sound Blaster

.snd - Raw

.sds - MIDI Instrument Sample

.smp - SampleVision

.vox - Dialogic

.mat - Matlab

.txt - Numerical Text 

.tmp - GoldWave temp file

.avi - System

.flac - FLAC lossless codec

.ogg - OGG vorbis (UT uses this as it's music format)

.wma - Windows Media Audio

==Export:==

GoldWave exports to all of the above file types, in a vast range of qualities, compression levels, and sample rates, also either in monophone or stereo format.  For sounds in UT (not music) you need 22500kHz, 16-bit , mono.  See [[Legacy:Importing Sounds|Importing Sounds]].

===Shareware:===

GoldWave is shareware, meaning you can download and use it as if it were the retail product, but to use it in it's entirity, you must register it for a fee or purchase it.

==Limitations:==

When you open the Shareware version of GoldWave, its help file (not a HTML browser window) pops up asking you to register. 

Shareware GoldWave limits you to 3000 commands before it stops working until you register it. I have been using GoldWave for about a year and have used up 785 commands. There is a box on the status window showing how many commands you have used so far.

Additionally, Goldwave limits you to 150 commands each time you run the software before its help file pops up with each command asking you to register.  You can still save your work if you are on command 150, it's not like the program ceases to function and you lose all your work. 

==Registration:==

As of when this page was created (November 07, 2005) registering GoldWave cost CAD$55 (Canadian dollars) which is about $48 US. Registration is done with credit card.

===Links:===

[http://www.goldwave.com GoldWave Website]

This page was created by Bob_The_Beheader, nov. 07, 2005

===Comments:===

'''Sweavo:''' Why have this page?  If you want to create wavs you can google for it.  The wiki is hard enough to find your way around as a new user without pages that have nothing to do with unreal.  I suggest this page is removed.

'''Solid Snake:''' Agreed. There are better freeware programs than this.

'''Bob_The_Beheader:''' :confused: OK... I just think that, you know, the wike has alot of pages and articles about modeling and creating meshes and stuff, but kind of ignores the aspect that sound plays in the game...I was just trying to add some stuff about creating new sounds for UT. Anyways, as for your argument, Sweavo, This page is here for the same reason that pages exist for [[Legacy:3D_Studio_Max|3D_Studio_Max]] and [[Legacy:Maya|Maya]]. You could just google for them too, so why have pages about 'em? This page is sort of advertisment-ish, talking about prices and stuff, but hell - take it out if it bothers you... There probably are better programs then this one, and so, why not make a page for them? 

'''Graphik:''' Seems to have worth to some. No deletion necessary.

'''Sweavo:''' Heh, I must confess I've had a change of heart on this one, the reason being, I searched for Syntax Highlighting and turned up heaps of pages about text editors.  So now I reckon this probably shouldn't be deleted, but needed a bit better tie-in with how it's used for UT.  It was a bit odd with the first line being &quot;it can't do UAX files&quot; !  So I've tweakified it... hope that's OK!  (I use Goldwave at home and love it BTW)

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Golem</title>
    <id>1369</id>
    <revision>
      <id>3472</id>
      <timestamp>2006-01-08T15:03:32Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>Can someone upload GolemEd v1.02 somewhere? The link in the post is dead.</comment>
      <text xml:space="preserve">There's nothing about Golem on the wiki yet.

When GlmEd whines about not being able to create a Direct3D viewport and dies, lower your monitor refresh rate and restart the app. 

However, BU hosts the [http://golem.beyondunreal.com/ Golem university] site, which has not been updated in a long time.

What do we think of asking Chris Hargrove who created that site whether he'd like to move his courses on Golem over to the wiki where they can be expanded &amp; completed?

'''Solid Snake:''' There is an updated version of Golem, v1.02 that is floating around. I found it in a really old thread. No idea what exactly he (Chris Hargrove) has changed however. I may consider writing some documentation even though I know it is redundant. Unfortunately when I attempt to load up any GEM files to view it just crashes the GolemEd. No idea why at the moment.

'''Switch`:''' Can someone upload GolemEd v1.02 somewhere? The link in the post is dead.

(BU forum mods: [http://forums.beyondunreal.com/showthread.php?threadid=149056 149056])</text>
    </revision>
    <revision>
      <id>3473</id>
      <timestamp>2005-06-08T04:46:54Z</timestamp>
      <contributor>
        <ip>222-152-115-4.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There's nothing about Golem on the wiki yet.

However, BU hosts the [http://golem.beyondunreal.com/ Golem university] site, which has not been updated in a long time.

What do we think of asking Chris Hargrove who created that site whether he'd like to move his courses on Golem over to the wiki where they can be expanded &amp; completed?

'''Solid Snake:''' There is an updated version of Golem, v1.02 that is floating around. I found it in a really old thread. No idea what exactly he (Chris Hargrove) has changed however. I may consider writing some documentation even though I know it is redundant. Unfortunately when I attempt to load up any GEM files to view it just crashes the GolemEd. No idea why at the moment.

(BU forum mods: [http://forums.beyondunreal.com/showthread.php?threadid=149056 149056])</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GrabBagGame</title>
    <id>28506</id>
    <revision>
      <id>40207</id>
      <timestamp>2009-11-17T10:59:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Grace</title>
    <id>1374</id>
    <revision>
      <id>3484</id>
      <timestamp>2005-09-09T08:59:13Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">:The title of this article is incorrect due to [http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_%28technical_restrictions%29 technical limitations]. The correct title is '''gracefool'''.

In [[Wikipedia:real life|real life]] I'm called Chris Wood, and live in [[Wikipedia:Lower Hutt|Lower Hutt]], [[Wikipedia:New Zealand|New Zealand]].

See also [http://purl.oclc.org/NET/gf/ my website].

==gracefool @ other wikis==
*[http://meta.wikimedia.org/wiki/User:Gracefool Meta-Wikimedia]
**[http://en.wikipedia.org/wiki/User:Gracefool Wikipedia]
**[http://commons.wikimedia.org/wiki/User:Gracefool Wikimedia Commons]
**[http://en.wikibooks.org/wiki/User:Gracefool Wikibooks]
**[http://en.wikiquote.org/wiki/User:Gracefool Wikiquote]
**[http://en.wikipedia.org/wiki/simple:User:Gracefool Simple English]
*[http://kb.mozillazine.org/User:Gracefool Mozillazine Knowledge Base]

'''Solid Snake:'''Its nice to see another NZ'er here, but... do you do anything Unreal related or do you just belong to a lot of Wiki's?

'''Mychaeel:''' Welcome to the Wiki.  Wouldn't [[Legacy:Gracefool|Gracefool]] be a more prudent name for this page?  (Would you like me to rename it?)</text>
    </revision>
    <revision>
      <id>3485</id>
      <timestamp>2005-09-09T05:36:48Z</timestamp>
      <contributor>
        <ip>Student-3.networking.otago.ac.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">:The title of this article is incorrect due to [http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_%28technical_restrictions%29 technical limitations]. The correct title is '''gracefool'''.

In [[Wikipedia:real life|real life]] I'm called Chris Wood, and live in [[Wikipedia:Lower Hutt|Lower Hutt]], [[Wikipedia:New Zealand|New Zealand]].

See also [http://purl.oclc.org/NET/gf/ my website].

==gracefool @ other wikis==
*[http://meta.wikimedia.org/wiki/User:Gracefool Meta-Wikimedia]
**[http://en.wikipedia.org/wiki/User:Gracefool Wikipedia]
**[http://commons.wikimedia.org/wiki/User:Gracefool Wikimedia Commons]
**[http://en.wikibooks.org/wiki/User:Gracefool Wikibooks]
**[http://en.wikiquote.org/wiki/User:Gracefool Wikiquote]
**[http://en.wikipedia.org/wiki/simple:User:Gracefool Simple English]
*[http://kb.mozillazine.org/User:Gracefool Mozillazine Knowledge Base]

'''Solid Snake:'''Its nice to see another NZ'er here, but... do you do anything Unreal related or do you just belong to a lot of Wiki's?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GradualMover</title>
    <id>1299</id>
    <revision>
      <id>3317</id>
      <timestamp>2007-08-10T06:39:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Mover (UT)|Mover (UT)]] &gt;&gt; GradualMover (Package: UnrealI)}}

Allows a specific tag and time to be set for each sequence in the mover's [[Legacy:Keyframe|keyframe]]. It also adds three new states:
* GradualTriggerOpenTimed,
* GradualTriggerPound and
* GradualTriggerToggle.

The original Mover states may not work as expected when used in this class.

There is no UT200x version of this class, but one of the custom [[Legacy:Mover|Mover]] classes might be doing what you want.

==Properties ==
; OpenTimes[6] : OpenTimes[''n''] is the time taken to open to keyframe ''n+1''. Eg, The mover opens to keyframe 1 in OpenTimes[0] seconds.
; CloseTimes[6] : CloseTimes[''n''] is the time taken to close to keyframe ''n''. Eg, The mover closes back to keyframe 0 in OpenTimes[0] seconds.
; Tags [6] : Tags[''n''] is the [[Legacy:Event|event]] the GradualMover listens for when at keyframe ''n''.
; Events [6] : Event[''n''] is the triggering string for all actors with a matching [[Legacy:Tag|tag]] when at keyframe ''n''.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3318</id>
      <timestamp>2007-08-09T19:30:51Z</timestamp>
      <contributor>
        <ip>141.217.86.217</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Mover|Mover]] &gt;&gt; GradualMover}}

Allows a specific tag and time to be set for each sequence in the mover's [[Legacy:Keyframe|keyframe]].

Adds three new states: GradualTriggerOpenTimed, GradualTriggerPound, GradualTriggerToggle.

(can the original Mover states be used with this class?)

==Properties ==
; OpenTimes[6] : OpenTimes[''n''] is the time taken to open to keyframe ''n+1''. Eg, The mover opens to keyframe 1 in OpenTimes[0] seconds.
; CloseTimes[6] : CloseTimes[''n''] is the time taken to close to keyframe ''n''. Eg, The mover closes back to keyframe 0 in OpenTimes[0] seconds.
; Tags [6] : Tags[''n''] is the [[Legacy:Event|event]] the GradualMover listens for when at keyframe ''n''.
; Events [6] : Event[''n''] is the triggering string for all actors with a matching [[Legacy:Tag|tag]] when at keyframe ''n''.

==Discussion ==

'''Xian:''' I must be missing something... I see a lot of references here such as Tags[KeyNum] or Events[KeyNum]. There are 8 keyframes and 6 gradual Tags/Events. Won't this lead to an array out of bounds error ?

'''EMA:''' Can this exist in UT2003?  I can't seem to find it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Graham</title>
    <id>1373</id>
    <revision>
      <id>3482</id>
      <timestamp>2005-08-10T17:39:13Z</timestamp>
      <contributor>
        <ip>Graham</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Messing around in unreal.

----

==Eye Candy:==

===Heat Distortion Effects [in progress]===

I've been trying to create a nice distortion effect for flames / plasma for some tme now using scripted textures and plane meshes. I need to work out some scaling / FOV problems.

===&quot;Wet&quot; BumpMapping [in progress]===

Pushing IceTextures to their extreme. Using custom static meshes and complex shaders + custom pawn code to create a dynamic effect that resembles a &quot;wet&quot; or icy surface.

===Better Invisibility [in progress]===

Using the same priciples of my distortion effect, but applied to a player's skin to recreate a &quot;predator&quot; type invisibility effect.

----

==Fun With Bio Rifles:==

===Caustic BioRifle [complete]===
; Primary : Launches a flaming glob.
; Secondary : Charges up a flaming glob.
; Notes : Globs do not merge.

===Bouncy BioRifle [in progress]===
; Primary : Launches a bouncing glob.
; Secondary : Charges up a &quot;hunting&quot; glob. Hunting globs bounce to the closest player.
; Notes : Having real problems with the hunting globs.

----

==Mutators Coding:==

===Devil May Cry Items [Complete w/ minor revisions outstanding]===

Replaces the ordinary pickups with ones inspired by the playstation 2 game by Capcom, Devil May Cry.

&lt;uscript&gt;
function GetBestPawn()
{
    local Pawn P;
    local float Dist;

    for (P = level.pawnlist; P != None &amp;&amp; (Target == none || VSize(P.Location - Location) &lt; Dist); P=P.nextpawn)
    {
        Dist = VSize(P.Location - Location);
        P = Target;
    }
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>3483</id>
      <timestamp>2005-08-10T16:02:31Z</timestamp>
      <contributor>
        <ip>Graham</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Messing around in unreal.

----

==Eye Candy:==

===Heat Distortion Effects [in progress]===

I've been trying to create a nice distortion effect for flames / plasma for some tme now using scripted textures and plane meshes. I need to work out some scaling / FOV problems.

===&quot;Wet&quot; BumpMapping [in progress]===

Pushing IceTextures to their extreme. Using custom static meshes and complex shaders + custom pawn code to create a dynamic effect that resembles a &quot;wet&quot; or icy surface.

===Better Invisibility [in progress]===

Using the same priciples of my distortion effect, but applied to a player's skin to recreate a &quot;predator&quot; type invisibility effect.

----

==Fun With Bio Rifles:==

===Caustic BioRifle [complete]===
; Primary : Launches a flaming glob.
; Secondary : Charges up a flaming glob.
; Notes : Globs do not merge.

===Bouncy BioRifle [in progress]===
; Primary : Launches a bouncing glob.
; Secondary : Charges up a &quot;hunting&quot; glob. Hunting globs bounce to the closest player.
; Notes : Having real problems with the hunting globs.

----

==Mutators Coding:==

===Devil May Cry Items [Complete w/ minor revisions outstanding]===

Replaces the ordinary pickups with ones inspired by the playstation 2 game by Capcom, Devil May Cry.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Graphics Application</title>
    <id>1336</id>
    <revision>
      <id>3401</id>
      <timestamp>2006-07-03T08:12:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Application|Application]]s used for working with textures and [[Legacy:Texture Creation|Texture creation]]:

* [[Legacy:UPaint|UPaint]]
* [[Legacy:UT Skin Maker|UT Skin Maker]] &amp;ndash; Automates the process of skin package creation.
* [[Legacy:UTX-Viewer|UTX-Viewer]] &amp;ndash; Extracts and creates texture packages.
* [[Legacy:Wally|Wally]] &amp;ndash; A freeware texture editing program.
* [[Legacy:Impact Texture Studio|Impact Texture Studio]] &amp;ndash; A freeware program for creating tileable textures.

==Genetica==

http://www.spiralgraphics.biz/gen2tour/index.htm

Shareware.  

Extremely powerful and easy to use seamless tiling texture editing software.&lt;br /&gt;

==Impact Texture Studio==

http://www.scene.org/its

Freeware.&lt;br&gt;

Another simple but powerful program for creating seamless tiling textures.

==I-Tex ==

http://www.i-tex.de

Shareware.  

Very powerful creation program - not the easiest to use but once you're started you can produce good stuff.&lt;br&gt;

==[[Legacy:Wally|Wally]]==

http://www.telefragged.com/wally/

Freeware.&lt;br&gt;

d&lt;description&gt;&lt;br&gt;

==Allegorithmic==

http://www.allegorithmic.com/

Commercial.&lt;br&gt;

A program for creating &quot;Fully Editable Procedural Maps.&quot; Looks pretty cool, if you want to pay 295$, 249€. Dont be confused, free stuff is just plugins

==The GIMP ==

http://www.gimp.org/

GNU license.&lt;br&gt;

Very powerful graphics editing program comparable to Photoshop, and completely free. Works best under Linux, but other platforms are available.  The Windows version used to be flaky but has become pretty stable.&lt;br&gt;

For more detailed information and installation instructions for various platforms, see [[Legacy:The GIMP|The GIMP]] page.

==TexSynth ==

http://users.chello.be/sf15772/texsynth/

http://www.bpeers.com/software/texsynth/

Freeware?

Kind of a texture wrapping utility...

==PhotoShop ==

http://www.adobe.com/products/photoshop/main.html

Commercial Product

No description required. Probably the best graphics editor about.

The Clouds and Difference Clouds filters create nice [[Legacy:Terrain|Terrain]] heightmaps!

==Paint Shop Pro ==

http://www.jasc.com/

Commercial Product. (Evaluation copy available for download)

Getting better with each release. Almost comparable to PhotoShop. Unfortunately it's also becoming just as expensive.

==Pixia ==

http://www.ab.wakwak.com/~knight/

Freeware package&lt;br&gt;

Just translated into English (from Japanese). More &quot;airbrush&quot; style then &quot;drawing&quot; style.

==(Untitled) Image Utilities ==

http://3d.kerlinsoftworks.com     '''THIS LINK IS DEAD''' can anyone update it?

Donationware&lt;br&gt;

A collection of previoulsy commercial products bundled into one package. The ~10M download includes Eleblend (terrain texture blending, artificial texture aging), Ripple Rain (animated water ripple bump maps, animated alpha channel rain maps), Mosaica (creates mosaic with matching bump map), Gradient Thief (multicolor gradients from existing images; good for skyboxes perhaps), and UT Screenshot Assistant (a batch resize/thumbnail image processor with image correction).

==Related Topics ==
* [[Legacy:DXT|DXT]]
* [[Legacy:Application|Application]] &amp;ndash; other types of software

==Reader questions ==

'''DawnTreader:''' Is there any programs out there that allow for hieght map creation? I tried one but it wasnt a real paint program and had an aweful way of creating terrain. I want to be able to design with ease a hieght map and import it. Any suggestions?

'''DawnTreader:''' I am going to check out the one mentioned here, eleblend. it looks promising.

'''Bob_The_Beheader:''' I've used Terragen [http://www.planetside.co.uk/terragen/ Terragen Website] to make heightmaps, but the software is more focused on, as they say on their website, &quot;photorealistic results for professional landscape visualisation, special effects, art and recreation.&quot; In other words, you can  make pretty pictures, but it's difficult to use for any other application. You can't export the heightmaps into anything UnrealEd can import, as far as I know. I usually end of taking a screenshot (the PrintScreen key) of the hieghtmap, and then cropping everything else on the screen and saving it as a .bmp .</text>
    </revision>
    <revision>
      <id>3402</id>
      <timestamp>2006-07-03T06:04:28Z</timestamp>
      <contributor>
        <ip>Ppp-2172.olypen.com</ip>
      </contributor>
      <comment>http://3d.kerlinsoftworks.com is a dead link. can anyone update it?</comment>
      <text xml:space="preserve">[[Legacy:Application|Application]]s used for working with textures and [[Legacy:Texture Creation|Texture creation]]:

* [[Legacy:UPaint|UPaint]]
* [[Legacy:UT Skin Maker|UT Skin Maker]] &amp;ndash; Automates the process of skin package creation.
* [[Legacy:UTX-Viewer|UTX-Viewer]] &amp;ndash; Extracts and creates texture packages.
* [[Legacy:Wally|Wally]] &amp;ndash; A freeware texture editing program.
* [[Legacy:Impact Texture Studio|Impact Texture Studio]] &amp;ndash; A freeware program for creating tileable textures.

==Genetica==

http://www.spiralgraphics.biz/gen2tour/index.htm

Shareware.  

Extremely powerful and easy to use seamless tiling texture editing software.&lt;br /&gt;

==Impact Texture Studio==

http://www.scene.org/its

Freeware.&lt;br&gt;

Another simple but powerful program for creating seamless tiling textures.

==I-Tex ==

http://www.i-tex.de

Shareware.  

Very powerful creation program - not the easiest to use but once you're started you can produce good stuff.&lt;br&gt;

==[[Legacy:Wally|Wally]]==

http://www.telefragged.com/wally/

Freeware.&lt;br&gt;

d&lt;description&gt;&lt;br&gt;

==Allegorithmic==

http://www.allegorithmic.com/

Commercial.&lt;br&gt;

A program for creating &quot;Fully Editable Procedural Maps.&quot; Looks pretty cool, if you want to pay 295$, 249€. Dont be confused, free stuff is just plugins

==The GIMP ==

http://www.gimp.org/

GNU license.&lt;br&gt;

Very powerful graphics editing program comparable to Photoshop, and completely free. Works best under Linux, but other platforms are available.  The Windows version used to be flaky but has become pretty stable.&lt;br&gt;

For more detailed information and installation instructions for various platforms, see [[Legacy:The GIMP|The GIMP]] page.

==TexSynth ==

http://users.chello.be/sf15772/texsynth/

http://www.bpeers.com/software/texsynth/

Freeware?

Kind of a texture wrapping utility...

==PhotoShop ==

http://www.adobe.com/products/photoshop/main.html

Commercial Product

No description required. Probably the best graphics editor about.

The Clouds and Difference Clouds filters create nice [[Legacy:Terrain|Terrain]] heightmaps!

==Paint Shop Pro ==

http://www.jasc.com/

Commercial Product. (Evaluation copy available for download)

Getting better with each release. Almost comparable to PhotoShop. Unfortunately it's also becoming just as expensive.

: WARNING &amp;ndash; PaintShopPro alters a ton of windows file associations without asking. At least it did about 5 years ago, I haven't touched it since. It's taken me that long to fix my registry :(

'''ZxAnPhOrIaN:''' It didn't alter my windows file associations. .jpg (JPEG) files still open up in Internet Explorer! :P

==Pixia ==

http://www.ab.wakwak.com/~knight/

Freeware package&lt;br&gt;

Just translated into English (from Japanese). More &quot;airbrush&quot; style then &quot;drawing&quot; style.

==(Untitled) Image Utilities ==

http://3d.kerlinsoftworks.com     '''THIS LINK IS DEAD''' can anyone update it?

Donationware&lt;br&gt;

A collection of previoulsy commercial products bundled into one package. The ~10M download includes Eleblend (terrain texture blending, artificial texture aging), Ripple Rain (animated water ripple bump maps, animated alpha channel rain maps), Mosaica (creates mosaic with matching bump map), Gradient Thief (multicolor gradients from existing images; good for skyboxes perhaps), and UT Screenshot Assistant (a batch resize/thumbnail image processor with image correction).

==Related Topics ==
* [[Legacy:DXT|DXT]]
* [[Legacy:Application|Application]] &amp;ndash; other types of software

==Reader questions ==

'''DawnTreader:''' Is there any programs out there that allow for hieght map creation? I tried one but it wasnt a real paint program and had an aweful way of creating terrain. I want to be able to design with ease a hieght map and import it. Any suggestions?

'''DawnTreader:''' I am going to check out the one mentioned here, eleblend. it looks promising.

'''Bob_The_Beheader:''' I've used Terragen [http://www.planetside.co.uk/terragen/ Terragen Website] to make heightmaps, but the software is more focused on, as they say on their website, &quot;photorealistic results for professional landscape visualisation, special effects, art and recreation.&quot; In other words, you can  make pretty pictures, but it's difficult to use for any other application. You can't export the heightmaps into anything UnrealEd can import, as far as I know. I usually end of taking a screenshot (the PrintScreen key) of the hieghtmap, and then cropping everything else on the screen and saving it as a .bmp .</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gravgun</title>
    <id>1367</id>
    <revision>
      <id>3467</id>
      <timestamp>2004-07-28T22:56:26Z</timestamp>
      <contributor>
        <ip>Wc11.ym.rnc.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">WORK IN PROGRESSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS!!!!!!!!!!!!!!!!!!!!!

I am OrigHammer from www.masteringunreal.com.  I am the creator of the GravGun for Unreal 2004, it is not finished but I am going to start writing a tutorial.  The gun can be found in the forums at http://sv3.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=73788.

This gun if focused around the linkgun but changes much of its functionality.

It all started off as a simple project but turned into something more.  The gun is not bug free but this experience has taught me a lot about unrealscript so I figured I would share my experiences, both bad and good.

This gun grabs objects and then can throw them.  Eg.  (Throwing a player or picking up a barrel and throwing it at a player)

Before I jump into things, what I originally wanted was a gun to pick things up and throw them, thats all.  The only gun that I could think of was the linkgun because it shot out a beam so I figure I could attach objects to the beam.  Over the course of the gun I changed things and totally rewrote code, I will take you through both the old and new code so you too can learn from mistakes.

So here goes:

* Classes that are edited:
*# Editing LinkFire.uc (The heart of the gun)
*# Editing LinkGun.uc
*# Editing LinkAltFire.uc
*# Editing LinkBeamEffect.uc

Heres how its gonna work.  Im gonna take you through my thought process (even if it was wrong), then I will tell you the better way of doing things.  At first there was so much code and I was scared, now I understand a lot lot more, so just hang in there.

===LinkFire.uc===

When first looking at LinkFire.uc, (Dont be scared, I know its fairly large), I wanted to find where the player was damaged, because if I could find out where the player gets hit, then I could attach the player (or object) to the beam instead of creating damage.  The area of code im talking about is in the function ModeTick, here it is:

&lt;uscript&gt;
// beam is updated every frame, but damage is only done based on the firing rate
if ( bDoHit ) //bDoHit just means the beam hit something
{
   if ( Beam != None )  //self explanitory
      Beam.bLockedOn = false;  //the Beam is not locked onto another player or vehicle

      Instigator.MakeNoise(1.0);

      AdjustedDamage = AdjustLinkDamage( LinkGun, Other, Damage );

      if ( !Other.bWorldGeometry )  //This says that the beam did not hit world geometry
      {  //This if statement just makes sure if the beam his a player on your own team then they dont get hurt
         if ( Level.Game.bTeamGame &amp;&amp; Pawn(Other) != None &amp;&amp; Pawn(Other).PlayerReplicationInfo != None
	     &amp;&amp; Pawn(Other).PlayerReplicationInfo.Team == Instigator.PlayerReplicationInfo.Team)
             AdjustedDamage = 0;

	 HealObjective = DestroyableObjective(Other);
	 if ( HealObjective == None )
	    HealObjective = DestroyableObjective(Other.Owner);
	 if ( HealObjective != None &amp;&amp; HealObjective.TeamLink(Instigator.GetTeamNum()) )
	 {
	    SetLinkTo(None);
	    bIsHealingObjective = true;
	    if (!HealObjective.HealDamage(AdjustedDamage, Instigator.Controller, DamageType))
		LinkGun.ConsumeAmmo(ThisModeNum, -AmmoPerFire);
	 }
	 else
	    Other.TakeDamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType);
         if ( Beam != None )
	    Beam.bLockedOn = true;
}
&lt;/uscript&gt;

SO WHAT THE HELL DOES THIS MEAN????

Well to start off remember we are looking for where the player gets hurt.  Hey whats that I notice the line Other.Takedamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType); right near the bottom.  Well looks like we found what we are looking for.  At least let me help you with the other part though.  So I added comments in the code to help.  Remember, ask and ill explain as best I can.

So we found where the player gets hurt.  What do we do next.  From looking through code and the Actor functions described at the Unreal Devolopers Network I found a function called SetBase.  It was exactly what I wanted to attach the beam to the player or object right? WRONG!  The problem was this, the beam is made of particles.  Particles move and particles dye.  So by doing, Beam.SetBase(Other);, I could pick things up but if I moved quickly they would drop because the particle that was attached to the player was either dying or moving.  I realized that a better way to move around objects was to use either SetLocation or Move / MoveSmooth functions.  The functions are similar yet very very different.  The setlocation function takes a vector and moves and object instantaneously to that position.  The move function moves an object in the direction of the vector you give it.  So how do I move an object around?

&lt;uscript&gt;
Weapon.GetViewAxes(A,C,D);
Other.MoveSmooth((Instigator.Location + 250*A + vect(0,0,50)) - Other.Location);
&lt;/uscript&gt;

I got rid of setbase and used MoveSmooth because the UDN (unreal developers network) says that movesmooth is faster, even though it was harder to use.  This always moves the object towards the crosshair.  If I used SetLocation I would have just done:

&lt;uscript&gt;
Weapon.GetViewAxes(A,C,D);
Other.SetLocation((Instigator.Location + 250*A + vect(0,0,50)));
&lt;/uscript&gt;

Now let me tell you what those actually mean.  Instigator.Location is just the location of the player you control. A, C, and D are vectors but the only one we are interested in is A.  It will be a unit vector that points in the direction of the crosshair (where the player is looking).  250*A is the distance we want the object from us.  The bigger the number the further away.  I add 50 to the z-axis so that the object is around eye level.  There is an actual EyeHeight variable I could have used but I did not know about it then.  Other.Location is a vector of where the object we are holding is.  The two are very close in terms of code, yet very different in what they do.  The code in MoveSmooth makes the object move towards the crosshair.  SetLocation just makes the object be at the location of the crosshair, but it updates so quickly that it looks like its moving, not just changing positions.

You may wonder why I did not use Instigator.Rotation or Weapon.Rotation to get the direction that the player is looking.  The reason for this is simply because it wont work.  A rotator has 3 components, Yaw, Pitch and Roll.  The problem is that a player running around and looking around has a Yaw and a Pitch, but not a Roll.  Therefore when converting the rotator to a vector the Z-axis part of the vector will always be 0, NOT what I want.  (This is what I think to be correct at least, so correct me if im wrong).

But when we try to pick something up nothing happens, well thats because we have to worry about physics.  Ill tell you right away that the Karma physics used in the unreal engine are flawed and that they suck compared to quality physics engines out there, such as the Hovok engine that will be used in the game Half Life 2 and many others.

You can set the physics of an object to be a wide variety of things.  (Listed in the Actor class.  Search for PHYS_)  So, when I wanted to grab an object I set its physics to none by doing,  Other.SetPhysics(PHYS_None);(set the physics of the object to nothing), but if I moved around quickly then all of a sudden the object was just floating in space.  Or at least is was until I stopped using the SetBase function.  On top of that the object will go right through walls.  As a quick side note, the Unreal engine is really the wrong engine to be making this gun because the PHYSICS SUCK.  In the Karma physics documentation they even admit that the physics are very limited and there are problems that have not been fixed.  But back to how to stop putting objects going through walls.  I discovered a variable in the actor class called bCollideWorld, I set that sucker to true and things stopped going through walls.  If you played UT2004 you would know that this does not work perfectly because vehicles can get stuck or sink in world geometry.  BLAME KARMA.  (I know im bashing them a lot but in the next unreal engine, Unreal Engine 3, they are using a newer physics engine.)</text>
    </revision>
    <revision>
      <id>3468</id>
      <timestamp>2004-07-28T02:15:04Z</timestamp>
      <contributor>
        <ip>Wc11.ym.rnc.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">WORK IN PROGRESSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS!!!!!!!!!!!!!!!!!!!!!

I am OrigHammer from www.masteringunreal.com.  I am the creator of the GravGun for Unreal 2004, it is not finished but I am going to start writing a tutorial.  The gun can be found in the forums at http://sv3.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=73788.

This gun if focused around the linkgun but changes much of its functionality.

It all started off as a simple project but turned into something more.  The gun is not bug free but this experience has taught me a lot about unrealscript so I figured I would share my experiences, both bad and good.

This gun grabs objects and then can throw them.  Eg.  (Throwing a player or picking up a barrel and throwing it at a player)

Before I jump into things, what I originally wanted was a gun to pick things up and throw them, thats all.  The only gun that I could think of was the linkgun because it shot out a beam so I figure I could attach objects to the beam.  Over the course of the gun I changed things and totally rewrote code, I will take you through both the old and new code so you too can learn from mistakes.

So here goes:

* Classes that are edited:
*# Editing LinkFire.uc (The heart of the gun)
*# Editing LinkGun.uc
*# Editing LinkAltFire.uc
*# Editing LinkBeamEffect.uc

Heres how its gonna work.  Im gonna take you through my thought process (even if it was wrong), then I will tell you the better way of doing things.  At first there was so much code and I was scared, now I understand a lot lot more, so just hang in there.

===LinkFire.uc===

When first looking at LinkFire.uc, (Dont be scared, I know its fairly large), I wanted to find where the player was damaged, because if I could find out where the player gets hit, then I could attach the player (or object) to the beam instead of creating damage.  The area of code im talking about is in the function ModeTick, here it is:

&lt;uscript&gt;
// beam is updated every frame, but damage is only done based on the firing rate
if ( bDoHit ) //bDoHit just means the beam hit something
{
   if ( Beam != None )  //self explanitory
      Beam.bLockedOn = false;  //the Beam is not locked onto another player or vehicle

      Instigator.MakeNoise(1.0);

      AdjustedDamage = AdjustLinkDamage( LinkGun, Other, Damage );

      if ( !Other.bWorldGeometry )  //This says that the beam did not hit world geometry
      {  //This if statement just makes sure if the beam his a player on your own team then they dont get hurt
         if ( Level.Game.bTeamGame &amp;&amp; Pawn(Other) != None &amp;&amp; Pawn(Other).PlayerReplicationInfo != None
	     &amp;&amp; Pawn(Other).PlayerReplicationInfo.Team == Instigator.PlayerReplicationInfo.Team)
             AdjustedDamage = 0;

	 HealObjective = DestroyableObjective(Other);
	 if ( HealObjective == None )
	    HealObjective = DestroyableObjective(Other.Owner);
	 if ( HealObjective != None &amp;&amp; HealObjective.TeamLink(Instigator.GetTeamNum()) )
	 {
	    SetLinkTo(None);
	    bIsHealingObjective = true;
	    if (!HealObjective.HealDamage(AdjustedDamage, Instigator.Controller, DamageType))
		LinkGun.ConsumeAmmo(ThisModeNum, -AmmoPerFire);
	 }
	 else
	    Other.TakeDamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType);
         if ( Beam != None )
	    Beam.bLockedOn = true;
}
&lt;/uscript&gt;

SO WHAT THE HELL DOES THIS MEAN????

Well to start off remember we are looking for where the player gets hurt.  Hey whats that I notice the line Other.Takedamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType); right near the bottom.  Well looks like we found what we are looking for.  At least let me help you with the other part though.  So I added comments in the code to help.  Remember, ask and ill explain as best I can.

So we found where the player gets hurt.  What do we do next.  From looking through code and the Actor functions described at the Unreal Devolopers Network I found a function called SetBase.  It was exactly what I wanted to attach the beam to the player or object right? WRONG!  The problem was this, the beam is made of particles.  Particles move and particles dye.  So by doing, Beam.SetBase(Other);, I could pick things up but if I moved quickly they would drop.  What really made me want to pick up my monitor and smash it was playing around with physics.  You can set the physics of an object to be a wide variety of things.  (Listed in the Actor class.  Search for PHYS_)  So, when I wanted to grab an object I set its physics to none by doing.  Other.SetPhysics(PHYS_None);, but if I moved around quickly then all of a sudden the object was just floating in space.  On top of that the object will go right through walls.  As a quick side note, the Unreal engine is really the wrong engine to be making this gun because the PHYSICS SUCK.  In the Karma physics documentation they even admit that the physics are very limited and there are problems that have not been fixed.  But back to how to stop putting objects going through walls.  I discovered a variable in the actor class called bCollideWorld, I set that sucker to true and things stopped going through walls.  If you played UT2004 you would know that this does not work perfectly because vehicles can get stuck in world geometry.  BLAME KARMA.</text>
    </revision>
    <revision>
      <id>3469</id>
      <timestamp>2004-07-28T02:37:48Z</timestamp>
      <contributor>
        <ip>Wc11.ym.rnc.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">WORK IN PROGRESSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS!!!!!!!!!!!!!!!!!!!!!

I am OrigHammer from www.masteringunreal.com.  I am the creator of the GravGun for Unreal 2004, it is not finished but I am going to start writing a tutorial.  The gun can be found in the forums at http://sv3.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=73788.

This gun if focused around the linkgun but changes much of its functionality.

It all started off as a simple project but turned into something more.  The gun is not bug free but this experience has taught me a lot about unrealscript so I figured I would share my experiences, both bad and good.

This gun grabs objects and then can throw them.  Eg.  (Throwing a player or picking up a barrel and throwing it at a player)

Before I jump into things, what I originally wanted was a gun to pick things up and throw them, thats all.  The only gun that I could think of was the linkgun because it shot out a beam so I figure I could attach objects to the beam.  Over the course of the gun I changed things and totally rewrote code, I will take you through both the old and new code so you too can learn from mistakes.

So here goes:

* Classes that are edited:
*# Editing LinkFire.uc (The heart of the gun)
*# Editing LinkGun.uc
*# Editing LinkAltFire.uc
*# Editing LinkBeamEffect.uc

Heres how its gonna work.  Im gonna take you through my thought process (even if it was wrong), then I will tell you the better way of doing things.  At first there was so much code and I was scared, now I understand a lot lot more, so just hang in there.

===LinkFire.uc===

When first looking at LinkFire.uc, (Dont be scared, I know its fairly large), I wanted to find where the player was damaged, because if I could find out where the player gets hit, then I could attach the player (or object) to the beam instead of creating damage.  The area of code im talking about is in the function ModeTick, here it is:

&lt;uscript&gt;
// beam is updated every frame, but damage is only done based on the firing rate
if ( bDoHit ) //bDoHit just means the beam hit something
{
   if ( Beam != None )  //self explanitory
      Beam.bLockedOn = false;  //the Beam is not locked onto another player or vehicle

      Instigator.MakeNoise(1.0);

      AdjustedDamage = AdjustLinkDamage( LinkGun, Other, Damage );

      if ( !Other.bWorldGeometry )  //This says that the beam did not hit world geometry
      {  //This if statement just makes sure if the beam his a player on your own team then they dont get hurt
         if ( Level.Game.bTeamGame &amp;&amp; Pawn(Other) != None &amp;&amp; Pawn(Other).PlayerReplicationInfo != None
	     &amp;&amp; Pawn(Other).PlayerReplicationInfo.Team == Instigator.PlayerReplicationInfo.Team)
             AdjustedDamage = 0;

	 HealObjective = DestroyableObjective(Other);
	 if ( HealObjective == None )
	    HealObjective = DestroyableObjective(Other.Owner);
	 if ( HealObjective != None &amp;&amp; HealObjective.TeamLink(Instigator.GetTeamNum()) )
	 {
	    SetLinkTo(None);
	    bIsHealingObjective = true;
	    if (!HealObjective.HealDamage(AdjustedDamage, Instigator.Controller, DamageType))
		LinkGun.ConsumeAmmo(ThisModeNum, -AmmoPerFire);
	 }
	 else
	    Other.TakeDamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType);
         if ( Beam != None )
	    Beam.bLockedOn = true;
}
&lt;/uscript&gt;

SO WHAT THE HELL DOES THIS MEAN????

Well to start off remember we are looking for where the player gets hurt.  Hey whats that I notice the line Other.Takedamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType); right near the bottom.  Well looks like we found what we are looking for.  At least let me help you with the other part though.  So I added comments in the code to help.  Remember, ask and ill explain as best I can.

So we found where the player gets hurt.  What do we do next.  From looking through code and the Actor functions described at the Unreal Devolopers Network I found a function called SetBase.  It was exactly what I wanted to attach the beam to the player or object right? WRONG!  The problem was this, the beam is made of particles.  Particles move and particles dye.  So by doing, Beam.SetBase(Other);, I could pick things up but if I moved quickly they would drop because the particle that was attached to the player was either dying or moving.  I realized that a better way to move around objects was to use either SetLocation or Move / MoveSmooth functions.  The functions are similar yet very very different.  The setlocation function takes a vector and moves and object instantaneously to that position.  The move function moves an object in the difection of the vector you give it.  So how do I move an object around?

&lt;uscript&gt;
Weapon.GetViewAxes(A,C,D);
Other.MoveSmooth((Instigator.Location + 250*A + vect(0,0,50)) - Other.Location);
&lt;/uscript&gt;

I got rid of my buddy setbase and used MoveSmooth because the UDN (unreal developers network) says that movesmooth is faster, even though it was harder to use.  This always moves the object towards the crosshair.  If I used SetLocation I would have just done:

&lt;uscript&gt;
Weapon.GetViewAxes(A,C,D);
Other.SetLocation((Instigator.Location + 250*A + vect(0,0,50)));
&lt;/uscript&gt;

What really made me want to pick up my monitor and smash it was playing around with physics.  You can set the physics of an object to be a wide variety of things.  (Listed in the Actor class.  Search for PHYS_)  So, when I wanted to grab an object I set its physics to none by doing.  Other.SetPhysics(PHYS_None);, but if I moved around quickly then all of a sudden the object was just floating in space.  On top of that the object will go right through walls.  As a quick side note, the Unreal engine is really the wrong engine to be making this gun because the PHYSICS SUCK.  In the Karma physics documentation they even admit that the physics are very limited and there are problems that have not been fixed.  But back to how to stop putting objects going through walls.  I discovered a variable in the actor class called bCollideWorld, I set that sucker to true and things stopped going through walls.  If you played UT2004 you would know that this does not work perfectly because vehicles can get stuck in world geometry.  BLAME KARMA.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gravity, Warp Tunnels</title>
    <id>1307</id>
    <revision>
      <id>3336</id>
      <timestamp>2008-02-15T15:04:57Z</timestamp>
      <contributor>
        <ip>C-67-171-102-23.hsd1.pa.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Simply Simple===

Make these types of things in UnrealEd is quite easy, and I'll attempt to explain it as quickly and concisely as possible.  First of all, I'll assume you already know about [[Legacy:Zoning|Zoning]].  Now that we've assumed that, go into your actor browser under Info.  

====Getting Set up====

Add a [[Legacy:ZoneInfo|ZoneInfo]] (just plain &quot;ZoneInfo&quot;, nothing fancy&quot;) into your map in the appropriate zone (the one that you want to have different gravity or velocity effects).  

====ZoneGravity====

Now go into that new ZoneInfo's properties.  Under the &quot;ZoneInfo&quot; tab inside its properties, you shall find settings called &quot;ZoneGravity&quot; and &quot;ZoneVelocity&quot;.  Zone gravity is just that - the gravity of the area.  It starts at -950.00Z, and 0 in the X and Y axis'.  What does this mean?  You're moving downward (hence the minus sign) 950 units at whatever rate the editor uses - the standard UT gravity, which I'm sure you're familiar with.  Turning it to, say, -450 would allow you to jump over twice as high and fall half as fast.  The X-axis refers to the horizontal plane, and the Y-axis refers to the vertical plane, from a bird's eye perspective.  Setting these to plus or minus would pull you in that direction in that plane.  Note that with ZoneGravity you will always run at the same speed, etc, unless your feet leave the ground - in which case, your gravity settings will influence the player's movement. More technically, gravity only affects players when they are in Physics state &quot;Falling&quot;.

====ZoneVelocity====

ZoneVelocity, unlike gravity, automatically shoots players in whatever direction you say, but it works the same way.  There is not much distinction between gravity and Velocity, as far as I can tell, but they do interact with each other - look at CTF-HallofGiants, for example.  You can use these in conjunction for more realistic gravity effects, or you can use ZoneVelocity to create warp tunnels (separate your warp tunnel into several different zones, and use a ZoneInfo in each zone with the ZoneVelocity property set to appropriate levels, and your players will be shot through it at whatever direction you've chosen, assuming you set the XYZ velocity properly).

Tip: to make dynamic water, you can use the following settings as an example, ZoneInfo -&gt; ZoneLight -&gt; TexVPanSpeed = 7 correspond to WaterZoneInfo -&gt; ZoneInfo -&gt; ZoneVelocity -&gt; Y = 100 (for instance, a river stream) -Gui

===Wrapping it Up===

This should give you some basics, but I can't tell you everything - just work off of what you've learned and experiment, experiment, experiment.  Eventually you'll figure it out, but as with all XYZ coordinate systems, you'll still be experimenting a lot.

[[:Category:Legacy Tutorial]]

----

'''Balu:''' If I got the two above sections correct there is a very big distinction between gravity and velocity. Gravity doesn't move you if your feet are on the ground, but you get moved in a Velocity-Zone. So e.g. if you'd have a wind-tunnel with a big fan at the end and want to make that move players around the tunnel you'd have to use velocity. (which let's me think of nice traps - Can you trigger Velocity/Gravity on and off? ;)

'''Jeeptrash:''' As far as gravity vs velocity goes- you can be moved in one direction by gravity with your feet on the ground: +Z, aka up. I have a zone that I wanted to use gravity in a horizontal direction in, so I set the +X gravity that I wanted to have, and then set Z to +8... just enough of a lift to get the feet off the ground. 

You may have read elsewhere that jumppads can be flaky when used on bots. I've found that all zoneVelocity is flaky with bots, which I assume most peoples jumppads use. I use zoneGravity instead and tho its not perfect its much more reliable.

'''Luggage:''' Someone should point out that ZoneGravity gradually accelerates players until they reach the specified TerminalVelocity, while ZoneVelocity adds the set velocity to the players instantly.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3337</id>
      <timestamp>2005-01-14T02:50:30Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>3338</id>
      <timestamp>2005-01-14T03:12:25Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">===Simply Simple===

Make these types of things in UnrealEd is quite easy, and I'll attempt to explain it as quickly and concisely as possible.  First of all, I'll assume you already know about [[Legacy:Zoning|Zoning]].  Now that we've assumed that, go into your actor browser under Info.  

====Getting Set up====

Add a [[Legacy:ZoneInfo|ZoneInfo]] (just plain &quot;ZoneInfo&quot;, nothing fancy&quot;) into your map in the appropriate zone (the one that you want to have different gravity or velocity effects).  

====ZoneGravity====

Now go into that new ZoneInfo's properties.  Under the &quot;ZoneInfo&quot; tab inside its properties, you shall find settings called &quot;ZoneGravity&quot; and &quot;ZoneVelocity&quot;.  Zone gravity is just that - the gravity of the area.  It starts at -950.00Z, and 0 in the X and Y axis'.  What does this mean?  You're moving downward (hence the minus sign) 950 units at whatever rate the editor uses - the standard UT gravity, which I'm sure you're familiar with.  Turning it to, say, -450 would allow you to jump over twice as high and fall half as fast.  The X-axis refers to the horizontal plane, and the Y-axis refers to the vertical plane, from a bird's eye perspective.  Setting these to plus or minus would pull you in that direction in that plane.  Note that with ZoneGravity you will always run at the same speed, etc, unless your feet leave the ground - in which case, your gravity settings will influence the player's movement. More technically, gravity only affects players when they are in Physics state &quot;Falling&quot;.

====ZoneVelocity====

ZoneVelocity, unlike gravity, automatically shoots players in whatever direction you say, but it works the same way.  There is not much distinction between gravity and Velocity, as far as I can tell, but they do interact with each other - look at CTF-HallofGiants, for example.  You can use these in conjunction for more realistic graviy effects, or you can use ZoneVelocity to create warp tunnels (separate your warp tunnel into several different zones, and use a ZoneInfo in each zone with the ZoneVelocity property set to appropriate levels, and your players will be shot through it at whatever direction you've chosen, assuming you set the XYZ velocity properly).

Tip: to make dynamic water, you can use the following settings as an example, ZoneInfo -&gt; ZoneLight -&gt; TexVPanSpeed = 7 correspond to WaterZoneInfo -&gt; ZoneInfo -&gt; ZoneVelocity -&gt; Y = 100 (for instance, a river stream) -Gui

===Wrapping it Up===

This should give you some basics, but I can't tell you everything - just work off of what you've learned and experiment, experiment, experiment.  Eventually you'll figure it out, but as with all XYZ coordidinate systems, you'll still be experimenting a lot.

[[:Category:Legacy Tutorial]]

----

'''Balu:''' If I got the two above sections correct there is a very big distinction between gravity and velocity. Gravity doesn't move you if your feet are on the ground, but you get moved in a Velocity-Zone. So e.g. if you'd have a wind-tunnel with a big fan at the end and want to make that move players around the tunnel you'd have to use velocity. (which let's me think of nice traps - Can you trigger Velocity/Gravity on and off? ;)

'''Jeeptrash:''' As far as gravity vs velocity goes- you can be moved in one direction by gravity with your feet on the ground: +Z, aka up. I have a zone that I wanted to use gravity in a horizontal direction in, so I set the +X gravity that I wanted to have, and then set Z to +8... just enough of a lift to get the feet off the ground. 

You may have read elsewhere that jumppads can be flaky when used on bots. I've found that all zoneVelocity is flaky with bots, which I assume most peoples jumppads use. I use zoneGravity instead and tho its not perfect its much more reliable.

'''Luggage:''' Someone should point out that ZoneGravity gradually accelerates players until they reach the specified TerminalVelocity, while ZoneVelocity adds the set velocity to the players instantly.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gregor</title>
    <id>1361</id>
    <revision>
      <id>3455</id>
      <timestamp>2004-06-10T21:27:54Z</timestamp>
      <contributor>
        <ip>Gregor</ip>
      </contributor>
      <minor/>
      <comment>* Stupid phrasing</comment>
      <text xml:space="preserve">===Pointless History===

* When it comes to 3D, I'm generally a tinkerer.  For the most part, I buy a new FPS to explore the capabilities of the medium, not for the game itself (at least not primarily).  This means that I'm even more attracted to the latest thing than the typical player.

* I've been using [[Legacy:Lightwave|Lightwave]] 3D to fiddle with CGI for nearly a decade at this point, starting with Amiga Lightwave 3.5, the first standalone version.  Currently, I use version 8.

* I first started playing the FPS genre with Quake and quickly got into mapping with the BSP editor by Valve's Yahn Bernier because I was intrigued by the possibilities.  Prior to this, I favored games like Descent and avoided Doom because I was repelled by the violence.

* I picked up [[Legacy:Unreal|Unreal]] a few days after its release.  In terms of Unreal games, I've got that game, [[Legacy:Unreal 2|Unreal 2]], [[Legacy:UT|UT]], [[Legacy:Wheel Of Time|Wheel of Time]], and [[Legacy:UT2003|UT2003]].

* I was one of the two people who gave the QuArK editor its name (in a contest).

* I'm a gamer (pen and paper RPGs, that is).

===Stuff I've done===

* A whole bunch of levels created solely to visualize locations frequented in the RPG du jour.

* The only playable level that I know I've released is DOM-HallOfGiants, a Domination version of Pancho Eekels' [[Legacy:CTF|CTF]] level for UT (used by permission).  It's nothing particularly stunning, I just liked the level.

----

===Comments===

'''Lilguy:''' Welcome to the wiki! I'm kind of new here myself.

'''Gregor:''' Thanks!

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hi, welcome. I liked QuArK, particularly its top-down view that could be rotated, and the automatic repeater brushes.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3456</id>
      <timestamp>2004-06-10T17:05:58Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">==Gregor==

===Pointless History===

* When it comes to 3D, I'm generally a tinkerer.  For the most part, I buy a new FPS to explore these elements, not for the game itself (at least not primarily).  This means that I'm even more attracted to the latest thing than the typical player.

* I've been using [[Legacy:Lightwave|Lightwave]] 3D to fiddle with CGI for nearly a decade at this point, starting with Amiga Lightwave 3.5, the first standalone version.  Currently, I use version 8.

* I first started playing FPSs with Quake and quickly got into mapping with the BSP editor by Valve's Yahn Bernier because I was intrigued by the possibilities.  Prior to this, I favored games like Descent and avoided Doom because I was repelled by the violence.

* I picked up [[Legacy:Unreal|Unreal]] a few days after its release.  In terms of Unreal games, I've got that game, [[Legacy:Unreal 2|Unreal 2]], [[Legacy:UT|UT]], [[Legacy:Wheel Of Time|Wheel of Time]], and [[Legacy:UT2003|UT2003]].

* I was one of the two people who gave the QuArK editor its name (in a contest).

* I'm a gamer (pen and paper RPGs, that is).

===Stuff I've done===

* A whole bunch of levels created solely to visualize locations frequented in the RPG du jour.

* The only playable level that I know I've released is DOM-HallOfGiants, a Domination version of Pancho Eekels' [[Legacy:CTF|CTF]] level for UT (used by permission).  It's nothing particularly stunning, I just liked the level.

----

===Comments===

'''Lilguy:''' Welcome to the wiki! I'm kind of new here myself.

'''Gregor:''' Thanks!

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3457</id>
      <timestamp>2004-06-10T17:55:06Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Gregor==

===Pointless History===

* When it comes to 3D, I'm generally a tinkerer.  For the most part, I buy a new FPS to explore these elements, not for the game itself (at least not primarily).  This means that I'm even more attracted to the latest thing than the typical player.

* I've been using [[Legacy:Lightwave|Lightwave]] 3D to fiddle with CGI for nearly a decade at this point, starting with Amiga Lightwave 3.5, the first standalone version.  Currently, I use version 8.

* I first started playing FPSs with Quake and quickly got into mapping with the BSP editor by Valve's Yahn Bernier because I was intrigued by the possibilities.  Prior to this, I favored games like Descent and avoided Doom because I was repelled by the violence.

* I picked up [[Legacy:Unreal|Unreal]] a few days after its release.  In terms of Unreal games, I've got that game, [[Legacy:Unreal 2|Unreal 2]], [[Legacy:UT|UT]], [[Legacy:Wheel Of Time|Wheel of Time]], and [[Legacy:UT2003|UT2003]].

* I was one of the two people who gave the QuArK editor its name (in a contest).

* I'm a gamer (pen and paper RPGs, that is).

===Stuff I've done===

* A whole bunch of levels created solely to visualize locations frequented in the RPG du jour.

* The only playable level that I know I've released is DOM-HallOfGiants, a Domination version of Pancho Eekels' [[Legacy:CTF|CTF]] level for UT (used by permission).  It's nothing particularly stunning, I just liked the level.

----

===Comments===

'''Lilguy:''' Welcome to the wiki! I'm kind of new here myself.

'''Gregor:''' Thanks!

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hi, welcome. I liked QuArK, particularly its top-down view that could be rotated, and the automatic repeater brushes.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GrenadeAmmo</title>
    <id>28492</id>
    <revision>
      <id>40193</id>
      <timestamp>2009-11-17T10:56:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GreySim</title>
    <id>1295</id>
    <revision>
      <id>3306</id>
      <timestamp>2003-11-01T23:48:48Z</timestamp>
      <contributor>
        <ip>GreySim</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I'm still pretty new to modding and whatnot, so I have nothing to really put in this space yet, but I hope to start writing tutorials and whatnot as I learn various things, and hopefully plug some cool stuff into the Wiki as I poke around at the engine and see what it can do.

Things went on hiatus while I was primarily using Linux at home for a few months, but I've come back to Windows and UnrealEd, so I'm going to start looking at starting to get into modding again.  :)

For the moment, I'm not really using my [[Legacy:GreySim/Developer_Journal|GreySim/Developer_Journal]], but I'm hoping in a few days or next weekend I'll have gotten back into the loop enough to start pumping out content.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3307</id>
      <timestamp>2003-08-10T01:46:22Z</timestamp>
      <contributor>
        <ip>GreySim</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I'm still pretty new to modding and whatnot, so I have nothing to really put in this space yet, but I hope to start writing tutorials and whatnot as I learn various things, and hopefully plug some cool stuff into the Wiki as I poke around at the engine and see what it can do.

I also have grandiose ideas for a few &quot;incredibly cool&quot; mods, but we'll see where that goes.  ;)

And I've decided to at least start a [[Legacy:GreySim/Developer_Journal|GreySim/Developer_Journal]].

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GreySim/Developer Journal</title>
    <id>1340</id>
    <revision>
      <id>3409</id>
      <timestamp>2003-08-10T13:24:53Z</timestamp>
      <contributor>
        <ip>GreySim</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===August 9th, 2003===

Decided to start work on bringing some aspects of Perfect Dark to UT2k3, as a way to get familiar with UnrealScript and general content creation.  I have no official plans on what (or how much) I'm doing, or if it's even going to be public or just for my personal enjoyment.  (I would plan on making it a publicly available &quot;thing&quot; from the start, but I'm worried about [[Legacy:Mod_Copyright|Mod_Copyright]]. IF I can secure permission for public distribution though, it'll be available when it's done.)

The first thing I decided to do was go for a new gametype, Pop A Cap.  Keep in mind that I have no clue what I'm doing yet when I'm documenting this, by the way.  First thing I did, was start a subclass of GameInfo, PDGameInfo.  I figure from here I can build the other gametypes, but from a base with all the Perfect Dark info.  For now I've just copied the code for UnrealMPGameInfo.  Looking at that, I figured I'd want my own version of PlayerReplicationInfo, so I subclassed ReplicationInfo to get PDPlayerReplicationInfo.  Again, I just copied the existing subclass of PlayerReplicationInfo.  I'll start tweaking it next time I work on things (tomorrow, likely).

====Comments?====

'''GreySim:''' Is this something that might be of use to anyone? I don't want to waste anyone's time or wiki space if I'm just talking to myself here. I plan on getting to &quot;meaty&quot; stuff too, but I spent most of today poring over tutorials and the class tree and looking at the existing classes, trying to get a feel for things. :hmm:

'''Foxpaw:''' I believe the correct &quot;ebonics&quot; grammar would be &quot;bust a cap,&quot; rather than &quot;pop a cap,&quot; unless that's not what you were thinking.

'''GreySim:''' Heh. I meant Pop A Cap.  It's a specific gametype from Perfect Dark.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3410</id>
      <timestamp>2003-08-10T10:05:08Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===August 9th, 2003===

Decided to start work on bringing some aspects of Perfect Dark to UT2k3, as a way to get familiar with UnrealScript and general content creation.  I have no official plans on what (or how much) I'm doing, or if it's even going to be public or just for my personal enjoyment.  (I would plan on making it a publicly available &quot;thing&quot; from the start, but I'm worried about [[Legacy:Mod_Copyright|Mod_Copyright]]. IF I can secure permission for public distribution though, it'll be available when it's done.)

The first thing I decided to do was go for a new gametype, Pop A Cap.  Keep in mind that I have no clue what I'm doing yet when I'm documenting this, by the way.  First thing I did, was start a subclass of GameInfo, PDGameInfo.  I figure from here I can build the other gametypes, but from a base with all the Perfect Dark info.  For now I've just copied the code for UnrealMPGameInfo.  Looking at that, I figured I'd want my own version of PlayerReplicationInfo, so I subclassed ReplicationInfo to get PDPlayerReplicationInfo.  Again, I just copied the existing subclass of PlayerReplicationInfo.  I'll start tweaking it next time I work on things (tomorrow, likely).

====Comments?====

'''GreySim:''' Is this something that might be of use to anyone? I don't want to waste anyone's time or wiki space if I'm just talking to myself here. I plan on getting to &quot;meaty&quot; stuff too, but I spent most of today poring over tutorials and the class tree and looking at the existing classes, trying to get a feel for things. :hmm:

'''Foxpaw:''' I believe the correct &quot;ebonics&quot; grammar would be &quot;bust a cap,&quot; rather than &quot;pop a cap,&quot; unless that's not what you were thinking.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Grid</title>
    <id>1298</id>
    <revision>
      <id>3314</id>
      <timestamp>2003-05-25T09:21:58Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">Something about the grid in UEd.

Things to cover include:

* How to set grid size.
* Why it's best to keep brushes on the grid. See, the [[Legacy:Snap To Grid|Snap to Grid]] Feature.
* How to make other actors snap to grid

maybe also:
* mention that snap to point seems buggy

==Advanced Grid Options ==

These are set under [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]].

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3315</id>
      <timestamp>2002-02-14T22:07:29Z</timestamp>
      <contributor>
        <ip>Nuclear Fuzz Grunge</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Something about the grid in UEd.

Things to cover include:

* How to set grid size.
* Why it's best to keep brushes on the grid. See, the [[Legacy:Snap To Grid|Snap to Grid]] Feature.
* How to make other actors snap to grid

maybe also:
* mention that snap to point seems buggy</text>
    </revision>
    <revision>
      <id>3316</id>
      <timestamp>2002-03-30T09:08:16Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Something about the grid in UEd.

Things to cover include:

* How to set grid size.
* Why it's best to keep brushes on the grid. See, the [[Legacy:Snap To Grid|Snap to Grid]] Feature.
* How to make other actors snap to grid

maybe also:
* mention that snap to point seems buggy

==Advanced Grid Options ==

These are set under [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gridghost</title>
    <id>1352</id>
    <revision>
      <id>3437</id>
      <timestamp>2004-12-17T22:21:56Z</timestamp>
      <contributor>
        <ip>Gridghost</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">All well and good in the modding community. &lt;br /&gt;As time goes by, things change and people too. I've been through hell and back (almost literally) and now I'm back with newfound strength and vigor.&lt;br /&gt;My new project are not related to Unreal unfortunatly, but it may be of interest to some of you browsing this wiki so i'll post a link.&lt;br /&gt;

[http://www.freekick.org freekick.org] is a (european) football management game in its crib. It's free and you are always welcome to try it out and&lt;br /&gt;give some creative critics in the freekick forums. 

/Regards

gridghost

==comments==

'''Tarquin:''' Hi, welcome to the wiki :D

'''Gridghost:''' Thanx. :) Check out the files (removed)...

'''EntropicLqd:''' Hi - welcome to the Wiki.  Enjoy your stay here :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3438</id>
      <timestamp>2004-03-04T21:53:03Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Welcome</comment>
      <text xml:space="preserve">All well and good in the modding community. &lt;br /&gt;I am working on a mod now and have made some progress and though about contributing to the wiki for some time now, and finally, I'm here. In the not so far future I'll post what I've done.

'''This is what I've done so far:''' &lt;br /&gt;[http://teddy.d1.nu/files/SixthSun.u SixthSun.u], [http://teddy.d1.nu/files/SixthSun.int SixthSun.int] &lt;br /&gt;This is what I've done so far on my mod. It got a working 3rd person view(in sixthsungame), sourced player shadows (in sixthsungame) and civilian type bots (in mutator TestBotMatch) with sourced shadows. The shadows are not perfect and I'll continue working on them but I wanted to post all of it right now so that the community could share it.

/Regards

gridghost

==comments==

'''Tarquin:''' Hi, welcome to the wiki :D

'''Gridghost:''' Thanx. :) Check out the files...

'''EntropicLqd:''' Hi - welcome to the Wiki.  Enjoy your stay here :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3439</id>
      <timestamp>2004-03-05T13:22:07Z</timestamp>
      <contributor>
        <ip>Gridghost</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">All well and good in the modding community. &lt;br /&gt;I am working on a mod now and have made some progress and though about contributing to the wiki for some time now, and finally, I'm here. In the not so far future I'll post what I've done.

'''This is what I've done so far:''' &lt;br /&gt;[http://teddy.d1.nu/files/SixthSun.u SixthSun.u], [http://teddy.d1.nu/files/SixthSun.int SixthSun.int], [http://teddy.d1.nu/files/DM-GG-Werehouse.zip DM-GG-Werehouse.zip] &lt;br /&gt;This is what I've done so far on my mod. It got a working 3rd person view(in sixthsungame), sourced player shadows (in sixthsungame) and civilian type bots (in mutator TestBotMatch) with sourced shadows. The shadows are not perfect and I'll continue working on them but I wanted to post all of it right now so that the community could share it.

I've added the map I used to test all the above things in. It work there without any probs and I hope it'll do so for anyone downloading it.

/Regards

gridghost

==comments==

'''Tarquin:''' Hi, welcome to the wiki :D

'''Gridghost:''' Thanx. :) Check out the files...

'''EntropicLqd:''' Hi - welcome to the Wiki.  Enjoy your stay here :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Group Browser</title>
    <id>1318</id>
    <revision>
      <id>3361</id>
      <timestamp>2006-09-07T03:37:22Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <comment>More notes (Checkbox effects and group property.)</comment>
      <text xml:space="preserve">The '''Group Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]]. It allows you to save groupings of objects you have selected in the main views (like a cluster of brushes) and toggle their visiblity in the editor. This can be useful in a large complex level for isolating a particular area to work with, or grouping objects meant for detail (like decor, furniture, etc) and hiding them from view so you can see underneath more clearly.

[[Image:Legacy_interface-Ed3-groupbrowser.png|center|Group Browser]]

==Opening ==

The Group Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Group Browser
* Press the Group Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like a &quot;G&quot;.

==Browser Toolbar Buttons ==

The Group Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* New Group
* Delete
* Add Selected Actors to Group(s)
* Delete Selected Actors from Group(s)
* Refresh Group List
* Select Actors in Group(s)
* Deselect Actors in Group(s)

==Notes==

The names used for groups are stored by UnrealEd in the same way as names for actor properties. This is why you may see the [[Legacy:Name Case Jump|Name case jump]] effect on names you don't think you've used already. There is probably no danger in using a name as both a group name and, say, a trigger tag, since the two systems are totally unrelated.

An actor's membership of groups is stored in Object -&gt; Group. This appears to have a limited length. Once an actor belongs to many groups, you may find adding it to further groups problematic (the group name may be truncated and appear as a new group in the browser).

Adding a group to an actor's Group property will not add that group to the group browser, though if you then create a group of the same name that actor will act as a member of it.

The visibility checkboxes in the group listing work inverse to what one might expect: if any of an object's groups are unchecked, that object is hidden. You can't use one group to hide a large set of items and then another group to show a subset of those items.

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Actor Class Browser|Actor Class Browser]] | [[Legacy:Music Browser|Music Browser]] '''Next &gt;'''

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3362</id>
      <timestamp>2004-06-19T19:20:34Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Group Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]]. It allows you to save groupings of objects you have selected in the main views (like a cluster of brushes) and toggle their visiblity in the editor. This can be useful in a large complex level for isolating a particular area to work with, or grouping objects meant for detail (like decor, furniture, etc) and hiding them from view so you can see underneath more clearly.

[[Image:Legacy_interface-Ed3-groupbrowser.png|center|Group Browser]]

==Opening ==

The Group Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Group Browser
* Press the Group Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like a &quot;G&quot;.

==Browser Toolbar Buttons ==

The Group Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* New Group
* Delete
* Add Selected Actors to Group(s)
* Delete Selected Actors from Group(s)
* Refresh Group List
* Select Actors in Group(s)
* Deselect Actors in Group(s)

==Notes==

The names used for groups are stored by UnrealEd in the same way as names for actor properties. This is why you may see the [[Legacy:Name Case Jump|Name case jump]] effect on names you don't think you've used already. There is probably no danger in using a name as both a group name and, say, a trigger tag, since the two systems are totally unrelated.

An actor's membership of groups is stored in Object -&gt; Group. This appears to have a limited length. Once an actor belongs to many groups, you may find adding it to further groups problematic (the group name may be truncated and appear as a new group in the browser).

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Actor Class Browser|Actor Class Browser]] | [[Legacy:Music Browser|Music Browser]] '''Next &gt;'''

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:GuardPoint</title>
    <id>1356</id>
    <revision>
      <id>3445</id>
      <timestamp>2006-02-09T17:25:32Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; GuardPoint (Package: ''Engine?'', ''UnrealShare?'') }}

The GuardPoint is a keypoint generated by [[Legacy:ScriptedPawn|ScriptedPawn]]s set with Orders to guard an item.  This is spawned automatically by the ScriptedPawn code during it's StartUp state.  There appears to be no need to place them explicitly.

==Properties==

==Functions==

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]

==Discussion==

'''SuperApe:''' Added this page when I found the code within ScriptedPawn that spawns this actor.  Unfortunately, I do not have ''this'' actor's code and can't confirm any other Properties, Functions or the Package name.  If you can, please fill it in/correct.  Thanks.

----

[[:Category:Legacy Class (UT)]]

[[:Category:Legacy To Do]] &amp;ndash; See discussion note above.
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gubar</title>
    <id>1312</id>
    <revision>
      <id>3349</id>
      <timestamp>2002-09-20T17:24:08Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Wormbo:''' Hi and welcome! :) Erm ZxAn, do you actually find all the new people on the [[Legacy:Recent Changes|Recent Changes]] page or do you just add pages for everyone who sets a username for him/herself and therefore appears at the bottom of each page?

'''ZxAnPhOrIaN:''' :/ I find new people on the bottom of the page and on the right of the [[Legacy:Recent Changes|Recent Changes]] page.

'''Wormbo:''' Please don't grab them off the bottom of the pages. Wait 'till they edited something so we can see how many people really added stuff to the Wiki.

'''ZxAnPhOrIaN:''' OK. (My bad! :( )

'''Tarquin:''' Yup, it's best to wait till they edit. Otherwise they may get a little freaked out! (well, they will anyway... but you see what I mean)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3350</id>
      <timestamp>2002-09-20T16:26:33Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Wormbo:''' Hi and welcome! :) Erm ZxAn, do you actually find all the new people on the [[Legacy:Recent Changes|Recent Changes]] page or do you just add pages for everyone who sets a username for him/herself and therefore appears at the bottom of each page?

'''ZxAnPhOrIaN:''' :/ I find new people on the bottom of the page and on the right of the [[Legacy:Recent Changes|Recent Changes]] page.

'''Wormbo:''' Please don't grab them off the bottom of the pages. Wait 'till they edited something so we can see how many people really added stuff to the Wiki.

'''ZxAnPhOrIaN:''' OK. (My bad! :( )

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Guidelines On General Style</title>
    <id>1304</id>
    <revision>
      <id>3329</id>
      <timestamp>2005-01-10T22:04:20Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">This page defines (and debates) general style for the project. See also:

* [[Legacy:Guidelines On Page Links|Guidelines On Page Links]] for more on where to put links and what to link.
* [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]] for tutorial conventions and using [[:Category:Legacy Basic Procedure]] pages to make writing tutorials simpler.

==Writing Conventions ==

'''Avoid abbreviations.'''  Their meaning may be clear to you, but abbreviations have the inherent risk of being ambiguous and confusing not only newbies.  ''Very'' common acronyms like [[Legacy:HUD|HUD]] and [[Legacy:BSP|BSP]] have their own pages &amp;ndash; link to them.

===Text formatting ===

Some simple guidelines:
* use &lt;nowiki&gt;'' and  ''' &lt;/nowiki&gt; wiki-style formatting instead of B and I tags. Use &lt;nowiki&gt;''''' &lt;/nowiki&gt; if you '''''really''''' must, but ask yourself: why does it need to stand out so much?
* don't use the U tags, it can get confused with links.
* don't use font colours. 

And some reasons for them:

In general, ask yourself the above question: why does it need to stand out so much? It's up to the reader to give your article his/her attention, not up to you to grab it. If they are reading your page, then they want to learn about what you have written.

Don't overuse emphasis. It loses its effect and makes articles hard to read. Some things will stand out of their own accord, if you use the agree formatting conventions:
* class names and window names (because they're a link &amp;ndash; or should be)
* menu commands and properties (because the -&gt; glyph is distinctive) 

A fact that there's no escaping is that most of the procedures described on the site involve many complex steps. Readers of this site are aware of this, and will read carefully &amp;ndash; if they don't they'll soon learn.

Consider alternatives to lots of bolding:
* a bullet list
* a table, for example if an actor needs lots of properties setting

==Technical formatting==

===Class Pages Layout ===

Class pages on the Wiki have this format at the head:

{{innerbox|&lt;wiki&gt;@@[[Legacy:UT|UT]]/[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; foo &gt;&gt; bar (Package: package name)

}}

Some clever description  of the class.

==Properties ==

===Interesting Group ===
; string Property1 [replicated to clients]: That's some mighty interesting property.
; [[Legacy:Pawn (UT)|Pawn (UT)]] Property2 : That one might be less important.
; class&lt;[[Legacy:Actor|Actor]]&gt; Property3 [const] : Not changable but still not neglectable.

===Not-so-interesting Group ===
; int anArray[4] : Dunno.

==Structs==

===SpecialStruct===
; int X
; int Y : Where am I?
; float Range : How far is it?

==Enums==

===EThisAndThat===
; TAT_One : First enum value.
; TAT_Two : ...
; TAT_Three : etc.

==Delegates==
; bool OnStupidIdea (coerce string Description) : Called whenever the author has a stupid idea. (Like now :-))

==Methods ==

===Native Function ===
; float SomeNativeFunction (Class&lt;[[Legacy:Canvas|Canvas]]&gt; C) [static, final] : Whatever this one does.

===Events ===
; PostBeginDelete ( ) [simulated] : Panic and cry.

===Other Functions ===
; [[Legacy:Pawn (UT)|Pawn (UT)]] NextVictim (bool bHungry, optional bool bAngry) : Well, yeah.

==Known Subclasses ==
* anything that's left

----

[[:Category:Legacy Class (UT)]] &lt;br /&gt;[[:Category:Legacy Class (UT2003)]]

&lt;/wiki&gt;

'''Question:''' Should we farm out the above to a separate template class page? Would it be clearer?

Comments on a better layout are welcome, but we should stick to one layout throughout the site to to keep the confusion at a minimum level.

'''Uncommon:''' What about having a way of coloring variable and function declarations so that the names stand out more? I've been leaving out the types and parameters because I think having all that stuff makes it harder to read. Maybe leave the name in the normal color and make the rest gray.

'''Tarquin:''' Could be done, I suppose, by searching for keywords within a ;: wiki tag. [[Legacy:Wookee|Wookee]] scares me though :(

More: [[Legacy:Guidelines On Technical Names|Guidelines On Technical Names]]

Component by componenent, this is:

====Class box====

{{classbox| {game} :: [[Legacy:Actor|Actor]] &gt;&gt; ... &gt;&gt; ... &gt;&gt; ThisClass (package)}}

====property lists====
; type Name (variable modifiers or replication comments) : description

===Class Boxes and Property Settings===

Giving a list of properties the reader should set on specific actors. No set standard as such, though you might want to use something like:

[[Legacy:Set The Following Properties|Set the following properties]]:
* Trigger A : Events -&gt; Tag = 'foo'
* Monster B : Movement -&gt; Something = 567

==Suggestions ==

===Search Keywords ===

Suggestion: adding keywords to some pages so they can be found by the search function?

==Related Topics ==
* [[Legacy:Guidelines On Page Creation|Guidelines on Page Creation]]
* [[Legacy:Guidelines On Page Links|Guidelines on Page Links]]
* [[Legacy:Guidelines On Technical Names|Guidelines on Technical Names]]
* [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]]</text>
    </revision>
    <revision>
      <id>3330</id>
      <timestamp>2005-01-10T20:56:06Z</timestamp>
      <contributor>
        <ip>66.192.30.22</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Guidelines On Page Creation</title>
    <id>1306</id>
    <revision>
      <id>3333</id>
      <timestamp>2006-01-21T00:02:36Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>,,|, had enough of you know it all pricks, shove this wiki.</comment>
      <text xml:space="preserve">==Starting a page==

Creating a new page is easy and you don't need a huge amount of material to begin, but do a search to see if the topic is already covered somewhere else.

Here's what [http://www.wikipedia.com Wikipedia] has to say on starting new pages:

{{innerbox|
* If you like, you can enter just a line or two of text for an entry. It's a start. Full-blown articles are not required. Adding any (accurate, helpful) information is welcome! Of course, if you can write more, that's all the better.
* How you word your articles will determine, to some extent, how likely it is other people will work on it. Examples:
** An article that leaves many intriguing-sounding links or leaves ellipses (...), etc., might invite other know-it-alls to fill in the blanks.
** Straightforward requests for information in an article can lead to good articles.


}}

==Page Names ==

===Use Singular Names ===

Pages with singular names are easier to link to than plural names. For example:

{{innerbox|Foo is a [[Legacy:Global Function|Global Function]].

Foo and bar are both [[Legacy:Global Function|Global Function]]s.

}}

===&quot;How To&quot; Pages ===

Try to give titles that can easily be linked within the flow of page text. For example, &quot;Create a skybox&quot; is easier to link to than &quot;Creating a skybox&quot;:

 We'll need a place for the lightning, so [[Legacy:Create A Skybox|create a skybox]] and...

See [[:Category:Legacy Basic Procedure]] for more on this naming scheme.

===Topic Hubs===

'''Tarquin:''' some of these are called &quot;Topics on foo&quot;, some are &quot;Foo topics&quot; and some are just, eg, [[Legacy:Lighting|Lighting]]. Do we need to standardize and how?

'''SuperApe:''' I'd say yes for main categories like Mapping, Modding and Modeling.  However, it could get out of hand if we started to redo subtopic pages as well.  It's probably not critical.  &quot;Topics on foo&quot; sounds better than the others.  We could simply identify those topic hub pages and transfer the text into the new page.  Then, we'd have to go through all the backlinks to the old hub.  A little tedious, perhaps.  


==Topic Hub Pages==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Topics On Animation|Topics On Animation]]
* [[Legacy:Topics On Modding|Topics On Modding]]
* [[Legacy:Topics On Scripting|Topics On Scripting]]
* [[Legacy:Topics On UnrealWiki Use|Topics On UnrealWiki Use]]



'''Tarquin:''' It doesn't have to be tedious. Ask an admin to rename pages. All links are updated :)

'''SuperApe:''' The previous list was a suggested list.  What do we think of them? :)

'''Tarquin:''' Looks good. Though Animation, not Animating. scripting is fine.

'''SuperApe:''' I thought Scripting was good, then I thought &quot;UScripting&quot; might be more specific.  Animation it is.  Any other good &lt;u&gt;Main&lt;/u&gt; topic hub page ideas?  Edit: Check out ''this'' old page: [[Legacy:Topics|Topics]].

===Subtopic Names ===

When you're describing a subtopic of a larger topic, make that page a subpage by linking to it as &lt;code&gt;MainPage/SubPage&lt;/code&gt; (or just &lt;code&gt;/SubPage&lt;/code&gt; on the &lt;code&gt;MainPage&lt;/code&gt; itself).  That'll provide an extra link to the main page on all sub pages, and it helps to keep the articles structured.  For instance, if you add a page describing techniques using [[Legacy:MeshMaker|MeshMaker]], call that page [[Legacy:MeshMaker/Techniques|MeshMaker/Techniques]].  One major benefit of this type of organization is that search results are displayed with their topic/sub-topic relationships apparent (for example, search on the keyword 'Actor' and see how sub-topics of Actor are indented under the main topic.

However, it's best to only do this when the subtopic won't need to be linked from elsewhere. 

See also: 
* [[Legacy:Subtopic Discussion|subtopic discussion]]
* ''UseModWiki'' on using subpages: [[UseMod:SubPage]].

==Page Links ==

In brief: once you have created a page, go forth and find places to link to it. Put relevant links on the page too. [[Legacy:Guidelines On Page Links|Guidelines on Page Links]] has more suggestions on this.

==Refactoring ==

==Redirect Pages ==

Consider the benefits of creating redirect pages for any alternative wordings of the topic you've created.  If you do this, you reduce the potential of someone creating a page concerning the same topic but unaware that your page exists.

==See Also ==
* [[Legacy:MetaTopics|MetaTopics]]
** [[Legacy:Guidelines On Technical Names|Guidelines On Technical Names]]
** [[Legacy:Project FAQ|Project FAQ]]
** [[Legacy:Wiki FAQ|Wiki FAQ]]</text>
    </revision>
    <revision>
      <id>3334</id>
      <timestamp>2005-12-16T20:05:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Starting a page==

Creating a new page is easy and you don't need a huge amount of material to begin, but do a search to see if the topic is already covered somewhere else.

Here's what [http://www.wikipedia.com Wikipedia] has to say on starting new pages:

{{innerbox|
* If you like, you can enter just a line or two of text for an entry. It's a start. Full-blown articles are not required. Adding any (accurate, helpful) information is welcome! Of course, if you can write more, that's all the better.
* How you word your articles will determine, to some extent, how likely it is other people will work on it. Examples:
** An article that leaves many intriguing-sounding links or leaves ellipses (...), etc., might invite other know-it-alls to fill in the blanks.
** Straightforward requests for information in an article can lead to good articles.


}}

==Page Names ==

===Use Singular Names ===

Pages with singular names are easier to link to than plural names. For example:

{{innerbox|Foo is a [[Legacy:Global Function|Global Function]].

Foo and bar are both [[Legacy:Global Function|Global Function]]s.

}}

===&quot;How To&quot; Pages ===

Try to give titles that can easily be linked within the flow of page text. For example, &quot;Create a skybox&quot; is easier to link to than &quot;Creating a skybox&quot;:

 We'll need a place for the lightning, so [[Legacy:Create A Skybox|create a skybox]] and...

See [[:Category:Legacy Basic Procedure]] for more on this naming scheme.

===Topic Hubs===

'''Tarquin:''' some of these are called &quot;Topics on foo&quot;, some are &quot;Foo topics&quot; and some are just, eg, [[Legacy:Lighting|Lighting]]. Do we need to standardize and how?

'''SuperApe:''' I'd say yes for main categories like Mapping, Modding and Modeling.  However, it could get out of hand if we started to redo subtopic pages as well.  It's probably not critical.  &quot;Topics on foo&quot; sounds better than the others.  We could simply identify those topic hub pages and transfer the text into the new page.  Then, we'd have to go through all the backlinks to the old hub.  A little tedious, perhaps.  


==Topic Hub Pages==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Topics On Animation|Topics On Animation]]
* [[Legacy:Topics On Modding|Topics On Modding]]
* [[Legacy:Topics On Scripting|Topics On Scripting]]
* [[Legacy:Topics On UnrealWiki Use|Topics On UnrealWiki Use]]



'''Tarquin:''' It doesn't have to be tedious. Ask an admin to rename pages. All links are updated :)

'''SuperApe:''' The previous list was a suggested list.  What do we think of them? :)

'''Tarquin:''' Looks good. Though Animation, not Animating. scripting is fine.

'''SuperApe:''' I thought Scripting was good, then I thought &quot;UScripting&quot; might be more specific.  Animation it is.  Any other good &lt;u&gt;Main&lt;/u&gt; topic hub page ideas?  Edit: Check out ''this'' old page: [[Legacy:Topics|Topics]].

===Subtopic Names ===

When you're describing a subtopic of a larger topic, make that page a subpage by linking to it as &lt;code&gt;MainPage/SubPage&lt;/code&gt; (or just &lt;code&gt;/SubPage&lt;/code&gt; on the &lt;code&gt;MainPage&lt;/code&gt; itself).  That'll provide an extra link to the main page on all sub pages, and it helps to keep the articles structured.  For instance, if you add a page describing techniques using [[Legacy:MeshMaker|MeshMaker]], call that page [[Legacy:MeshMaker/Techniques|MeshMaker/Techniques]].  One major benefit of this type of organization is that search results are displayed with their topic/sub-topic relationships apparent (for example, search on the keyword 'Actor' and see how sub-topics of Actor are indented under the main topic.

However, it's best to only do this when the subtopic won't need to be linked from elsewhere. 

See also: 
* [[Legacy:Subtopic Discussion|subtopic discussion]]
* ''UseModWiki'' on using subpages: [[UseMod:SubPage]].

==Page Links ==

In brief: once you have created a page, go forth and find places to link to it. Put relevant links on the page too. [[Legacy:Guidelines On Page Links|Guidelines on Page Links]] has more suggestions on this.

==Refactoring ==

==Redirect Pages ==

Consider the benefits of creating redirect pages for any alternative wordings of the topic you've created.  If you do this, you reduce the potential of someone creating a page concerning the same topic but unaware that your page exists.

==See Also ==
* [[Legacy:MetaTopics|MetaTopics]]
** [[Legacy:Guidelines On Technical Names|Guidelines On Technical Names]]
** [[Legacy:Project FAQ|Project FAQ]]
** [[Legacy:Wiki FAQ|Wiki FAQ]]</text>
    </revision>
    <revision>
      <id>3335</id>
      <timestamp>2006-01-18T17:38:46Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>Attn: Tarq. I think i'm on to something here.</comment>
      <text xml:space="preserve">==Starting a page==

Creating a new page is easy and you don't need a huge amount of material to begin, but do a search to see if the topic is already covered somewhere else.

Here's what [http://www.wikipedia.com Wikipedia] has to say on starting new pages:

{{innerbox|
* If you like, you can enter just a line or two of text for an entry. It's a start. Full-blown articles are not required. Adding any (accurate, helpful) information is welcome! Of course, if you can write more, that's all the better.
* How you word your articles will determine, to some extent, how likely it is other people will work on it. Examples:
** An article that leaves many intriguing-sounding links or leaves ellipses (...), etc., might invite other know-it-alls to fill in the blanks.
** Straightforward requests for information in an article can lead to good articles.


}}

==Page Names ==

===Use Singular Names ===

Pages with singular names are easier to link to than plural names. For example:

{{innerbox|Foo is a [[Legacy:Global Function|Global Function]].

Foo and bar are both [[Legacy:Global Function|Global Function]]s.

}}

===&quot;How To&quot; Pages ===

Try to give titles that can easily be linked within the flow of page text. For example, &quot;Create a skybox&quot; is easier to link to than &quot;Creating a skybox&quot;:

 We'll need a place for the lightning, so [[Legacy:Create A Skybox|create a skybox]] and...

See [[:Category:Legacy Basic Procedure]] for more on this naming scheme.

===Topic Hubs===

'''Tarquin:''' some of these are called &quot;Topics on foo&quot;, some are &quot;Foo topics&quot; and some are just, eg, [[Legacy:Lighting|Lighting]]. Do we need to standardize and how?

'''SuperApe:''' I'd say yes for main categories like Mapping, Modding and Modeling.  However, it could get out of hand if we started to redo subtopic pages as well.  It's probably not critical.  &quot;Topics on foo&quot; sounds better than the others.  We could simply identify those topic hub pages and transfer the text into the new page.  Then, we'd have to go through all the backlinks to the old hub.  A little tedious, perhaps.  


==Topic Hub Pages==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Topics On Animation|Topics On Animation]]
* [[Legacy:Topics On Modding|Topics On Modding]]
* [[Legacy:Topics On Scripting|Topics On Scripting]]
* [[Legacy:Topics On UnrealWiki Use|Topics On UnrealWiki Use]]



'''Tarquin:''' It doesn't have to be tedious. Ask an admin to rename pages. All links are updated :)

'''SuperApe:''' The previous list was a suggested list.  What do we think of them? :)

'''Tarquin:''' Looks good. Though Animation, not Animating. scripting is fine.

'''SuperApe:''' I thought Scripting was good, then I thought &quot;UScripting&quot; might be more specific.  Animation it is.  Any other good &lt;u&gt;Main&lt;/u&gt; topic hub page ideas?  Edit: Check out ''this'' old page: [[Legacy:Topics|Topics]].

'''CH3Z:''' I'm thinking that these hubs are great for main topics like you are doing, very helpfull, but the subtopics are still scattered. Renaming all the pages to make them subpages of the main hub is more work and work that will never be done as new pages are created and the standard not followed. What I propose is that pages like [[:Category:Legacy Mapping]] have subpages and more specific tags are put on all of the subtopic pages rather than additional tags, ie. [Category Mapping/Lighting]. This way no matter where the page actually resides, perhaps even as a subpage of someone's personal page, it can be tied to it's main topic without moving the page and without having a category tag and seperately some kind of subtopic tag. Then if you see that tag at the bottom of a page about lighting as it applies to mapping, and click on it, the subpage of Category Mapping called /Lighting would open up and have a list at the bottom like Category Mapping does, but listing all pages that have the tag &quot;Category Mapping/Lighting&quot; on them. It may just work out that those pages are still listed in the window at the bottom of Category Mapping because of the tag, I haven't seen the code that populates that window. I think too that once this is implemented we can more easily see where some pages need to be refactored into another page or pages with that tag.&lt;br /&gt;I've also been thinking that since all pages SHOULD have a Related Topics section on them, that the Category tags should be listed there with a breif explanation of why a person should vist it rather than having it be a loose link at the bottom of the page that newcommers to the wiki don't understand and don't realize the value of.

===Subtopic Names ===

When you're describing a subtopic of a larger topic, make that page a subpage by linking to it as &lt;code&gt;MainPage/SubPage&lt;/code&gt; (or just &lt;code&gt;/SubPage&lt;/code&gt; on the &lt;code&gt;MainPage&lt;/code&gt; itself).  That'll provide an extra link to the main page on all sub pages, and it helps to keep the articles structured.  For instance, if you add a page describing techniques using [[Legacy:MeshMaker|MeshMaker]], call that page [[Legacy:MeshMaker/Techniques|MeshMaker/Techniques]].  One major benefit of this type of organization is that search results are displayed with their topic/sub-topic relationships apparent (for example, search on the keyword 'Actor' and see how sub-topics of Actor are indented under the main topic.

However, it's best to only do this when the subtopic won't need to be linked from elsewhere. 

See also: 
* [[Legacy:Subtopic Discussion|subtopic discussion]]
* ''UseModWiki'' on using subpages: [[UseMod:SubPage]].

==Page Links ==

In brief: once you have created a page, go forth and find places to link to it. Put relevant links on the page too. [[Legacy:Guidelines On Page Links|Guidelines on Page Links]] has more suggestions on this.

==Refactoring ==

==Redirect Pages ==

Consider the benefits of creating redirect pages for any alternative wordings of the topic you've created.  If you do this, you reduce the potential of someone creating a page concerning the same topic but unaware that your page exists.

==See Also ==
* [[Legacy:MetaTopics|MetaTopics]]
** [[Legacy:Guidelines On Technical Names|Guidelines On Technical Names]]
** [[Legacy:Project FAQ|Project FAQ]]
** [[Legacy:Wiki FAQ|Wiki FAQ]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Guidelines On Page Links</title>
    <id>1305</id>
    <revision>
      <id>3331</id>
      <timestamp>2006-01-21T20:24:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It's important to keep the wiki rich in links. It makes it easier to find things without having to use the ''search'' function, and it reduces the possibility of people duplicating what's already written (although a new slant on things is often good). [[Wiki:LinksAreContent]].

Feel free to add or discuss guidelines here.

==Places to link from ==

When you create a page, you need it to be linked from other pages so people can navigate their way to it. Here are some suggestions:

* The main topic pages that are listed on [[Legacy:Home Page|Home Page]].
* For tutorials: [[Legacy:Mapping Lessons|Mapping Lessons]] or [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* The class pages. For example, a list of &quot;Tutorials which use this actor&quot;
* Other pages on the same subject. For example, if you write a tutorial on advanced doors, put a link to it on other door tutorials, so readers can easily read more on the subject.

Try to avoid hidden links, unless they make a sentence really clumsy. Write &lt;nowiki&gt;[[Legacy:Actor|actor]]s rather than [[Legacy:Actor|actors]]&lt;/nowiki&gt;. This helps quickly see what links are when housekeeping.

==Links on a page ==

Broadly speaking, there are 4 places to put links on a page: in the text of the page, in the Related Topics section, in the External Links section, and the category footer.

===Pages to consider linking to ===

* '''Class pages''' for the actors you write about. For instance, breaking walls and glass involve two different actors, so make a link. If the page doesn't exist yet, consider making a brief start on it &amp;ndash; adding a link back to your page, naturally. Make sure you name them exactly as they appear in the browser.
* '''Technical terms''', like [[Legacy:Semisolid|Semisolid]], [[Legacy:HUD (UT)|HUD (UT)]], [[Legacy:Red Builder Brush|red builder brush]] or [[Legacy:Pivot|pivot]].  Make the most of the wiki system and link instead of explaining the terms yet again. The text flows more cleanly and beginners can follow the link if they need a detailed explanation.
* '''Basic procedures''', like [[Legacy:Making A 2D Shape|Making a 2D Shape]], [[Legacy:Texture Import And Export|Texture Import and Export]] or [[Legacy:Actor Overview|Actor Overview]]. Avoid duplicating content on many pages: see [[:Category:Legacy Basic Procedure]] for the current proposal on this.
* '''Other tutorials'''. Suggest some prerequisite tutorials, and maybe some tutorials for advanced reading in the Related Topics section (see below). Give the reader some places to go to.
* '''Topic pages''' such as [[Legacy:Mover Topics|Mover Topics]] or [[Legacy:Lighting|Lighting]].
* '''Menu names''' give full menu commands and link the menu name, like this: &quot;[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; File -&gt; New&quot;. See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for the list of page names.

===General guidelines on links ===

* '''Don't overdo linking.'''  That's the extreme opposite of not linking at all.  It's most convenient for authors and readers alike to link only the first occurrence of a term in a logical unit (a section of a tutorial, for instance).  Since links stand out visually, they have the potential to disrupt the reader's flow and make reading a long text a pain when each and every sentence has one or more links. For example, if you mention &quot;PlayerStart&quot; several times, link only the first one, or the one that's relating to something technical, at a point where the reader might logically want to read up on the specifics. 

* '''Connect related pages.''' Click on the page title to do a search on the page name. If you find pages which you think are related, create a link both ways.

* '''Link terms in their singular form''' and not their plural form; for instance, link &lt;code&gt;[[Legacy:Zone|zone]]s&lt;/code&gt;, not &lt;code&gt;[[Legacy:Zones|zones]]&lt;/code&gt; (and not &lt;code&gt;[[Legacy:Zone|zones]]&lt;/code&gt; either).  That will make it easier to link to that article in a sentence like &quot;create another &lt;code&gt;[[Legacy:Zone|zone]]&lt;/code&gt;.&quot;

* On the other hand, '''link duplication is good.''' It's easy for n00bs to land on technical pages. Give them a link to something simple, like [[Legacy:Types Of Trigger|Types of Trigger]] on the [[Legacy:Triggers (UT)|Triggers (UT)]] class spec. The hierarchy is quite vague &amp;ndash; one page may get a link on several topic pages.

* '''Avoid abbreviations.'''  Their meaning may be clear to you, but abbreviations have the inherent risk of being ambiguous and confusing not only to newbies.  ''Very'' common acronyms like [[Legacy:HUD (UT)|HUD (UT)]] and [[Legacy:BSP|BSP]] have their own pages &amp;ndash; link to them.  If you use an abbreviation, give the full term in parenthesis the first time you use it on a page, like &quot;OCD (Object Collision Detection)&quot; or vice-versa, &quot;Object Collision Detection (OCD).&quot;

* '''No &quot;here&quot; links.'''  Linking along the lines of &quot;Click [[:Category:Legacy Personal Page|here]] to get a list of contributors&quot; is ''very'' bad style and detrimental to readability.  If you by any means can, link the actual page titles.

==Related Topics links==

Most pages have a section at the end titled &quot;Related Topics&quot;. List here all the links which don't fit into the text of the page.

It's helpful to commment on how the links relate to the current page.

==External links ==

External links are altered and re-routed all the time because people change servers, or lose interest in maintaining the structure, or eliminate the page because it becomes obsolete. It might be an idea to occasionally check external links.

On the other hand, the interest of 'wiki' is precisely to avoid links at all costs and make the most comprehensive thing in one place.

==Category links ==

Links to category pages are usually put at the foot of a page, beneath a rule-off ('----' in markup). However, category pages that count as a related topic, eg &quot;Category Mapping&quot; can go in the Related Topics section.

'''T1:''' So does this mean we should always put the link in both places, or choose based on the situation? I vote for the &quot;both places&quot; choice if it's up for vote.

'''OlympusMons:''' I thought the ''Topics on whatever'' would go in the ''related topics'' where the ''catergories'' would go in the well ''catergory links'' unless the ''catergories'' is moved above the ''related topics''. Preferrably Id like to see ''related topics'' at the tops of the page with the ''catergories'' on the bottom but this isnt a huge issue. I think actually getting the main pages for everything to some sort of complete status would be then we can discuss formatting once ut2k7 is alittle closer. Also I have seen pages with links up the top, they are under ''required reading''.

'''Tarquin:''' I'd say if the category link is in the related topics, only 1 copy is needed. But having 2 won't do any harm :)

'''SuperApe:''' I agree that it can be considered a Related Topic, but if all the other pages are formatted one way and we begin to subjectively change ''some'' of them, what's the point?  And where would the line be drawn?  To me, they seem to be nearly in the same location on the page; near the bottom along with External Links, etc.  They also seem to be a separate kind of page, one that uses the MAGIC keyword to group all pages, but itself is not a page containing topic info.  You're right, there's no ''harm'' done either way, but if we're going to have a standard or method to this madness, I vote that it stay consistent. (at the bottom, under a rule-off and grouped with other category and wiki tags.) /my $0.02 ''(Btw, I've recieved an email from Ch3z, and from that it doesn't sound to me like he's interested in coming back.  I dunno.)''

==InterMap ==

We're running an intermap: that means that certain wiki-type links lead to other Wiki sites. A wiki link with a prefix and a : separator creates an interwiki link:
 &lt;nowiki&gt;[[Wikipedia:fish]]&lt;/nowiki&gt;

See [[Legacy:InterWiki|InterWiki]] for more.

Note the prefix is (annoyingly) case-sensitive. The most commonly used ones are:

* udntech 
* udncontent 
* Thread 
* Posting 
* Wikipedia 
* Wiki 
* UseMod 
* MeatBall</text>
    </revision>
    <revision>
      <id>3332</id>
      <timestamp>2006-01-21T18:21:23Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It's important to keep the wiki rich in links. It makes it easier to find things without having to use the ''search'' function, and it reduces the possibility of people duplicating what's already written (although a new slant on things is often good). [[Wiki:LinksAreContent]].

Feel free to add or discuss guidelines here.

==Places to link from ==

When you create a page, you need it to be linked from other pages so people can navigate their way to it. Here are some suggestions:

* The main topic pages that are listed on [[Legacy:Home Page|Home Page]].
* For tutorials: [[Legacy:Mapping Lessons|Mapping Lessons]] or [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* The class pages. For example, a list of &quot;Tutorials which use this actor&quot;
* Other pages on the same subject. For example, if you write a tutorial on advanced doors, put a link to it on other door tutorials, so readers can easily read more on the subject.

Try to avoid hidden links, unless they make a sentence really clumsy. Write &lt;nowiki&gt;[[Legacy:Actor|actor]]s rather than [[Legacy:Actor|actors]]&lt;/nowiki&gt;. This helps quickly see what links are when housekeeping.

==Links on a page ==

Broadly speaking, there are 4 places to put links on a page: in the text of the page, in the Related Topics section, in the External Links section, and the category footer.

===Pages to consider linking to ===

* '''Class pages''' for the actors you write about. For instance, breaking walls and glass involve two different actors, so make a link. If the page doesn't exist yet, consider making a brief start on it &amp;ndash; adding a link back to your page, naturally. Make sure you name them exactly as they appear in the browser.
* '''Technical terms''', like [[Legacy:Semisolid|Semisolid]], [[Legacy:HUD (UT)|HUD (UT)]], [[Legacy:Red Builder Brush|red builder brush]] or [[Legacy:Pivot|pivot]].  Make the most of the wiki system and link instead of explaining the terms yet again. The text flows more cleanly and beginners can follow the link if they need a detailed explanation.
* '''Basic procedures''', like [[Legacy:Making A 2D Shape|Making a 2D Shape]], [[Legacy:Texture Import And Export|Texture Import and Export]] or [[Legacy:Actor Overview|Actor Overview]]. Avoid duplicating content on many pages: see [[:Category:Legacy Basic Procedure]] for the current proposal on this.
* '''Other tutorials'''. Suggest some prerequisite tutorials, and maybe some tutorials for advanced reading in the Related Topics section (see below). Give the reader some places to go to.
* '''Topic pages''' such as [[Legacy:Mover Topics|Mover Topics]] or [[Legacy:Lighting|Lighting]].
* '''Menu names''' give full menu commands and link the menu name, like this: &quot;[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; File -&gt; New&quot;. See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for the list of page names.

===General guidelines on links ===

* '''Don't overdo linking.'''  That's the extreme opposite of not linking at all.  It's most convenient for authors and readers alike to link only the first occurrence of a term in a logical unit (a section of a tutorial, for instance).  Since links stand out visually, they have the potential to disrupt the reader's flow and make reading a long text a pain when each and every sentence has one or more links. For example, if you mention &quot;PlayerStart&quot; several times, link only the first one, or the one that's relating to something technical, at a point where the reader might logically want to read up on the specifics. 

* '''Connect related pages.''' Click on the page title to do a search on the page name. If you find pages which you think are related, create a link both ways.

* '''Link terms in their singular form''' and not their plural form; for instance, link &lt;code&gt;[[Legacy:Zone|zone]]s&lt;/code&gt;, not &lt;code&gt;[[Legacy:Zones|zones]]&lt;/code&gt; (and not &lt;code&gt;[[Legacy:Zone|zones]]&lt;/code&gt; either).  That will make it easier to link to that article in a sentence like &quot;create another &lt;code&gt;[[Legacy:Zone|zone]]&lt;/code&gt;.&quot;

* On the other hand, '''link duplication is good.''' It's easy for n00bs to land on technical pages. Give them a link to something simple, like [[Legacy:Types Of Trigger|Types of Trigger]] on the [[Legacy:Triggers (UT)|Triggers (UT)]] class spec. The hierarchy is quite vague &amp;ndash; one page may get a link on several topic pages.

* '''Avoid abbreviations.'''  Their meaning may be clear to you, but abbreviations have the inherent risk of being ambiguous and confusing not only to newbies.  ''Very'' common acronyms like [[Legacy:HUD (UT)|HUD (UT)]] and [[Legacy:BSP|BSP]] have their own pages &amp;ndash; link to them.  If you use an abbreviation, give the full term in parenthesis the first time you use it on a page, like &quot;OCD (Object Collision Detection)&quot; or vice-versa, &quot;Object Collision Detection (OCD).&quot;

* '''No &quot;here&quot; links.'''  Linking along the lines of &quot;Click [[:Category:Legacy Personal Page|here]] to get a list of contributors&quot; is ''very'' bad style and detrimental to readability.  If you by any means can, link the actual page titles.

==Related Topics links==

Most pages have a section at the end titled &quot;Related Topics&quot;. List here all the links which don't fit into the text of the page.

It's helpful to commment on how the links relate to the current page.

==External links ==

External links are altered and re-routed all the time because people change servers, or lose interest in maintaining the structure, or eliminate the page because it becomes obsolete. It might be an idea to occasionally check external links.

On the other hand, the interest of 'wiki' is precisely to avoid links at all costs and make the most comprehensive thing in one place.

==Category links ==

Links to category pages are usually put at the foot of a page, beneath a rule-off ('----' in markup). However, category pages that count as a related topic, eg &quot;Category Mapping&quot; can go in the Related Topics section.

'''T1:''' So does this mean we should always put the link in both places, or choose based on the situation? I vote for the &quot;both places&quot; choice if it's up for vote.

'''OlympusMons:''' I thought the ''Topics on whatever'' would go in the ''related topics'' where the ''catergories'' would go in the well ''catergory links'' unless the ''catergories'' is moved above the ''related topics''. Preferrably Id like to see ''related topics'' at the tops of the page with the ''catergories'' on the bottom but this isnt a huge issue. I think actually getting the main pages for everything to some sort of complete status would be then we can discuss formatting once ut2k7 is alittle closer. Also I have seen pages with links up the top, they are under ''required reading''.

'''Tarquin:''' I'd say if the category link is in the related topics, only 1 copy is needed. But having 2 won't do any harm :)

==InterMap ==

We're running an intermap: that means that certain wiki-type links lead to other Wiki sites. A wiki link with a prefix and a : separator creates an interwiki link:
 &lt;nowiki&gt;[[Wikipedia:fish]]&lt;/nowiki&gt;

See [[Legacy:InterWiki|InterWiki]] for more.

Note the prefix is (annoyingly) case-sensitive. The most commonly used ones are:

* udntech 
* udncontent 
* Thread 
* Posting 
* Wikipedia 
* Wiki 
* UseMod 
* MeatBall</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Guidelines On Spelling</title>
    <id>1343</id>
    <revision>
      <id>3416</id>
      <timestamp>2004-06-05T01:41:23Z</timestamp>
      <contributor>
        <ip>Hsdbrg64-110-209-71.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">==English vs American spelling==

We've settled on American spellings on Unreal Wiki, largely because these are the spellings found in Unreal Engine script comments and Epic's documentation.. So &quot;color&quot; rather than &quot;colour&quot;, &quot;modeling&quot; with just one &quot;l&quot; and so on.

It's a good idea to make a redirect page for the English spelling.

==Common mistakes ==

===The apostrophe===

Please pay attention to correct usage of the apostrophe. In particular, the word &quot;it's&quot; only stands for &quot;it is&quot; or &quot;it has&quot;. See http://www.angryflower.com/ for helpful hints.

===Words that don't exist===

The following are not words:

* alot (you mean &quot;a lot&quot; or &quot;allot&quot;)
* definately (you mean &quot;definitely&quot; - just think of &quot;definition&quot;)

==Discussion ==

'''Birelli:''' Whose  spelling are we using? We're going to waste a lot of time if we spend it &quot;correcting&quot; other people's spelling to our own, because others will just change it back. There are genuine disagreements here, not just &quot;mistakes&quot;. The most obvious of them (and the one that prompted this) is &quot;color&quot; vs. &quot;colour&quot;, but there is also &quot;center&quot; vs. &quot;centre&quot; and tons more in the same vein as both of these.

'''Tarquin:''' I've previously said we can use both; Mych has suggested we use US spelling everywhere. I don't really mind that much, as long as people get apostrophes right ;)

'''Mychaeel:''' Adhering to a consistent way of spelling (at least in page titles) makes searching easier and avoids accidental mis-linking of pages and/or creation of page doubles (one American English version, one British English version; as in modeling/modelling).  That's the pragmatic approach and the most striking argument here, I believe.

I'm neither British nor American (English lessons in school somewhat favored British English), but I've personally decided sometime that I'd try stick to the American English spelling of words &amp;ndash; it's generally simpler (which appeals to the programmer in me), and most importantly it's far more widespread.

'''Foxpaw:''' I don't know which spellings belong to which, I generally just use whichever I feel like at the time. I usually use center and color, but words like armour or modelling I just use whichever spelling I like. Having said that, anyone is welcome to change the spelling on any page I've written to comply to a wiki standard if one is agreed upon.

'''Birelli:''' Being American it's obviously a lot easier for me to follow a US-english standard, but I know how hard it can be to constantly remind yourself to spell things in a way that feels wrong. Perhaps it would be best to say that the Wiki is using a US standard, but ignore differences if they're in text that doesn't affect technical things. Links kind of have to be stringently enforced though, as with the modeling/modelling example.

'''Mychaeel:''' If (when, I mean, of course) the new search engine outlined on [[Legacy:Wiki Development|Wiki Development]] becomes reality sometime in future, it might be possible to provide it with a list of British/American English word pairs to make it more liberal in terms of spelling; so a search for &quot;colour&quot; would also find pages containing only the word &quot;color.&quot;

'''dUc0N:''' What about &quot;disambiguation&quot; pages like those on WikiPedia? The concept is a set of pages that offer links to documents you were probably looking for. For example, on WikiPedia, the 'Mercury' page would have links to the element, the planet, the car, the record label, the NASA manned spaceflight project and the Roman god. Another type of page like this could cover spelling differences. For example, use US spelling as the convention for the site, but for a page with Color in the title, add a page where it's spelled Colour, but redirects to the US spelling version. Thoughts?

'''Tarquin:''' redirects for alternate spellings are a good idea.

'''MythOpus:'''  definately is spelt correctly :)  Or at least thats how we spell it here in Canada... or I spell it....

'''Wormbo:''' Well, then you probably spell it incorrectly: http://dictionary.reference.com/search?q=definately

'''MythOpus:''' Sigh.  Well that just sucks.  (Updating Brain-Dictionary)</text>
    </revision>
    <revision>
      <id>3417</id>
      <timestamp>2004-06-04T22:59:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==English vs American spelling==

We've settled on American spellings on Unreal Wiki, largely because these are the spellings found in Unreal Engine script comments and Epic's documentation.. So &quot;color&quot; rather than &quot;colour&quot;, &quot;modeling&quot; with just one &quot;l&quot; and so on.

It's a good idea to make a redirect page for the English spelling.

==Common mistakes ==

===The apostrophe===

Please pay attention to correct usage of the apostrophe. In particular, the word &quot;it's&quot; only stands for &quot;it is&quot; or &quot;it has&quot;. See http://www.angryflower.com/ for helpful hints.

===Words that don't exist===

The following are not words:

* alot (you mean &quot;a lot&quot; or &quot;allot&quot;)
* definately (you mean &quot;definitely&quot; - just think of &quot;definition&quot;)

==Discussion ==

'''Birelli:''' Whose  spelling are we using? We're going to waste a lot of time if we spend it &quot;correcting&quot; other people's spelling to our own, because others will just change it back. There are genuine disagreements here, not just &quot;mistakes&quot;. The most obvious of them (and the one that prompted this) is &quot;color&quot; vs. &quot;colour&quot;, but there is also &quot;center&quot; vs. &quot;centre&quot; and tons more in the same vein as both of these.

'''Tarquin:''' I've previously said we can use both; Mych has suggested we use US spelling everywhere. I don't really mind that much, as long as people get apostrophes right ;)

'''Mychaeel:''' Adhering to a consistent way of spelling (at least in page titles) makes searching easier and avoids accidental mis-linking of pages and/or creation of page doubles (one American English version, one British English version; as in modeling/modelling).  That's the pragmatic approach and the most striking argument here, I believe.

I'm neither British nor American (English lessons in school somewhat favored British English), but I've personally decided sometime that I'd try stick to the American English spelling of words &amp;ndash; it's generally simpler (which appeals to the programmer in me), and most importantly it's far more widespread.

'''Foxpaw:''' I don't know which spellings belong to which, I generally just use whichever I feel like at the time. I usually use center and color, but words like armour or modelling I just use whichever spelling I like. Having said that, anyone is welcome to change the spelling on any page I've written to comply to a wiki standard if one is agreed upon.

'''Birelli:''' Being American it's obviously a lot easier for me to follow a US-english standard, but I know how hard it can be to constantly remind yourself to spell things in a way that feels wrong. Perhaps it would be best to say that the Wiki is using a US standard, but ignore differences if they're in text that doesn't affect technical things. Links kind of have to be stringently enforced though, as with the modeling/modelling example.

'''Mychaeel:''' If (when, I mean, of course) the new search engine outlined on [[Legacy:Wiki Development|Wiki Development]] becomes reality sometime in future, it might be possible to provide it with a list of British/American English word pairs to make it more liberal in terms of spelling; so a search for &quot;colour&quot; would also find pages containing only the word &quot;color.&quot;

'''dUc0N:''' What about &quot;disambiguation&quot; pages like those on WikiPedia? The concept is a set of pages that offer links to documents you were probably looking for. For example, on WikiPedia, the 'Mercury' page would have links to the element, the planet, the car, the record label, the NASA manned spaceflight project and the Roman god. Another type of page like this could cover spelling differences. For example, use US spelling as the convention for the site, but for a page with Color in the title, add a page where it's spelled Colour, but redirects to the US spelling version. Thoughts?

'''Tarquin:''' redirects for alternate spellings are a good idea.

'''MythOpus:'''  definately is spelt correctly :)  Or at least thats how we spell it here in Canada... or I spell it....

'''Wormbo:''' Well, then you probably spell it incorrectly: http://dictionary.reference.com/search?q=definately</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Guidelines On Technical Names</title>
    <id>1303</id>
    <revision>
      <id>3327</id>
      <timestamp>2004-09-24T09:35:06Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Chinese spam!</comment>
      <text xml:space="preserve">This is a page to discuss and establish conventions for referring to specific types things. Most technical terms now have an established format, but many wiki pages may not conform to these, either because they're old, or because new writers haven't seen this page. If you spot them while browsing, please fix them if you have time.

List below of types. Add to the list if there are ommissions, and discuss. :-)

==Menu commands ==

When giving menu commands, stick to the following format:

* use their '''actual spelling and capitalization'''
* give the '''full menu command''', so new users can easily find them
* '''link the menu name''', so readers can look up the full reference for that menu

Examples:
 &lt;nowiki&gt;[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; File -&gt; New
 [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add Light here&lt;/nowiki&gt;
 

See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for the list of page names for menus.

The character pair &quot;&lt;code&gt;-&gt;-&lt;/code&gt;&quot; is parsed to an arrow and will look like this:
:Polygons -&gt; To Brush

Use emphasis if you want the menu command to stand out, but do this sparingly:

&lt;pre&gt;'''Polygons -&gt; To Brush'''&lt;/pre&gt;

Current consensus is (probably) to use -&gt; between menu names. (at least that was what the debate stopped at. Feel free to continue the discussion :)  ''Tarquin'')

Other options were:
* Polygons &gt;&gt; To Brush (confusable with class hierarchy)
* Polygons &gt; To Brush
* Polygons | To Brush (the | character is used for tables and links)

==Class names ==

===Just the name ===

When quoting class or property names, please stick to the ''original capitalization''; for instance, &quot;[[Legacy:Tag|Tag]]&quot; and &quot;[[Legacy:NavigationPoint|NavigationPoint]]&quot; rather than &quot;tag&quot; and &quot;naVigationpOint&quot;.

===Top of a class ===

For a page that specifically describes an [[Legacy:Actor|Actor]], add its ''location'' in the [[Legacy:Actor|Actor]] tree to the top of the page, with links to the parent classes like this:

&lt;pre&gt;{{classbox| [[Legacy:{Game}|{Game}]] [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; ... &gt;&gt; {ThisClass} (package)}}&lt;/pre&gt;

The &lt;code&gt;{{classbox|}}&lt;/code&gt; prefix will render this line in a neat box:

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; ...}}

To make it easy for users to browse the class tree, start with:
* [[Legacy:Actor|Actor]] for Actor subclasses 
* [[Legacy:UWindowBase|UWindowBase]] for UWindow classes
* [[Legacy:Object|Object]] for everything else

===Full tree quotations ===

Full tree quotations within the text should be marked out in the same way, eg:

&lt;pre&gt;[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; SmellofFeetHere to your 
level for that realistic just jogged-in trainers effect&lt;/pre&gt;

Remember to link to the [[Legacy:Add An Actor|add an actor]] [[Legacy:Basic Procedure|basic procedure]], so you don't need to explain how to open the class browser yet again!

==Property names ==

Current consensus is &lt;nowiki&gt;Advanced -&gt; bDirectional&lt;/nowiki&gt;, which is parsed as Advanced -&gt; bDirectional. (If your browser doesn't show the &amp;rarr; character, please post on [[Legacy:Wookee/Problems|Wookee/Problems]].)

Other options were:
* Advanced.bDirectional
** Use of the period for hierarchy is not descriptive and may confuse beginners. Also technically misleading: the dot is used in UnrealEd to separate packages, groups and names; in UnrealScript it separates object or class references and properties/methods. This notation implies that it's one of those, and that you actually have to refer to this property as &quot;Advanced.bDirectional&quot; if you want to access it from a script.
* Advanced -&gt; bDirectional 
** because it's basically a menu-like grouping for convenience. 
** possibly with the &quot;&lt;code&gt;-&gt;-&lt;/code&gt;&quot; pair parsed into a picture or a &amp;rarr; character (if that doesn't show on your browser, please bing here)
* Advanced &gt;&gt; bDirectional
** perhaps too similar to class notation?
* Advanced_bDirectional
** As the underscore is a valid character in symbol names, that's bound to add to the confusion, especially if there ever was a property group or property that contained one.
* (Advanced)bDirectional
** matches the script syntax most closely, but not terribly clear on the eye. Most mappers don't need to know what the script looks like anyway.
* Advanced:bDirectional
** reaching point of desperation.
* Advanced/bDirectional

Question: how to distinguish between the properties of several different actors? here's two possible snips:

{{innerbox| Tip: to make dynamic water, you can use the following settings as an example, ZoneInfo -&gt; ZoneLight -&gt; TexVPanSpeed = 7 correspond to WaterZoneInfo -&gt; ZoneInfo -&gt; ZoneVelocity -&gt; Y = 100 

}}

{{innerbox| Tip: to make dynamic water, you can use the following settings as an example, ZoneInfo : ZoneLight -&gt; TexVPanSpeed = 7 correspond to WaterZoneInfo : ZoneInfo -&gt; ZoneVelocity -&gt; Y = 100 

}}

Any thoughts?

==Resource names==

Things that come in [[Legacy:Package|package]]s, like sounds, textures, [[Legacy:Static Mesh|static mesh]]es etc. Eg
:NaliCastle.Floors.whatever
:AbbadonArchitecture.Beams.somebeammesh

Reasoning: the dotted syntax is exactly the one the engine expects.

==Directories==

Since we now deal with many different games, instead of writing &quot;Unreal Tournament\System&quot;, write the more generic:

 {[[Legacy:Base Directory|Base Directory]]}\System

The { } indicate (hopefully) that this isn't an ''actual'' directory called that. The page [[Legacy:Base Directory|Base Directory]] should explain it all.

'''Olorin:''' :hmm: why not &lt;tt&gt; &lt;[[Legacy:Base Directory|Base Directory]]&gt;\System &lt;/tt&gt; (or &lt;tt&gt;/System&lt;/tt&gt;) ? Sort of a non-terminal in BNF ?

==Related Topics ==
* [[Legacy:MetaTopics|MetaTopics]]
* [[Legacy:Guidelines On Page Creation|Guidelines On Page Creation]]</text>
    </revision>
    <revision>
      <id>3328</id>
      <timestamp>2004-09-24T08:17:25Z</timestamp>
      <contributor>
        <ip>210.82.76.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a page to discuss and establish conventions for referring to specific types things. Most technical terms now have an established format, but many wiki pages may not conform to these, either because they're old, or because new writers haven't seen this page. If you spot them while browsing, please fix them if you have time.

List below of types. Add to the list if there are ommissions, and discuss. :-)

==Menu commands ==

When giving menu commands, stick to the following format:

* use their '''actual spelling and capitalization'''
* give the '''full menu command''', so new users can easily find them
* '''link the menu name''', so readers can look up the full reference for that menu

Examples:
 &lt;nowiki&gt;[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; File -&gt; New
 [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Add Light here&lt;/nowiki&gt;
 

See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for the list of page names for menus.

The character pair &quot;&lt;code&gt;-&gt;-&lt;/code&gt;&quot; is parsed to an arrow and will look like this:
:Polygons -&gt; To Brush

Use emphasis if you want the menu command to stand out, but do this sparingly:

&lt;pre&gt;'''Polygons -&gt; To Brush'''&lt;/pre&gt;

Current consensus is (probably) to use -&gt; between menu names. (at least that was what the debate stopped at. Feel free to continue the discussion :)  ''Tarquin'')

Other options were:
* Polygons &gt;&gt; To Brush (confusable with class hierarchy)
* Polygons &gt; To Brush
* Polygons | To Brush (the | character is used for tables and links)

==Class names ==

===Just the name ===

When quoting class or property names, please stick to the ''original capitalization''; for instance, &quot;[[Legacy:Tag|Tag]]&quot; and &quot;[[Legacy:NavigationPoint|NavigationPoint]]&quot; rather than &quot;tag&quot; and &quot;naVigationpOint&quot;.

===Top of a class ===

For a page that specifically describes an [[Legacy:Actor|Actor]], add its ''location'' in the [[Legacy:Actor|Actor]] tree to the top of the page, with links to the parent classes like this:

&lt;pre&gt;{{classbox| [[Legacy:{Game}|{Game}]] [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; ... &gt;&gt; {ThisClass} (package)}}&lt;/pre&gt;

The &lt;code&gt;{{classbox|}}&lt;/code&gt; prefix will render this line in a neat box:

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; ...}}

To make it easy for users to browse the class tree, start with:
* [[Legacy:Actor|Actor]] for Actor subclasses 
* [[Legacy:UWindowBase|UWindowBase]] for UWindow classes
* [[Legacy:Object|Object]] for everything else

===Full tree quotations ===

Full tree quotations within the text should be marked out in the same way, eg:

&lt;pre&gt;[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; SmellofFeetHere to your 
level for that realistic just jogged-in trainers effect&lt;/pre&gt;

Remember to link to the [[Legacy:Add An Actor|add an actor]] [[Legacy:Basic Procedure|basic procedure]], so you don't need to explain how to open the class browser yet again!

==Property names ==

Current consensus is &lt;nowiki&gt;Advanced -&gt; bDirectional&lt;/nowiki&gt;, which is parsed as Advanced -&gt; bDirectional. (If your browser doesn't show the &amp;rarr; character, please post on [[Legacy:Wookee/Problems|Wookee/Problems]].)

Other options were:
* Advanced.bDirectional
** Use of the period for hierarchy is not descriptive and may confuse beginners. Also technically misleading: the dot is used in UnrealEd to separate packages, groups and names; in UnrealScript it separates object or class references and properties/methods. This notation implies that it's one of those, and that you actually have to refer to this property as &quot;Advanced.bDirectional&quot; if you want to access it from a script.
* Advanced -&gt; bDirectional 
** because it's basically a menu-like grouping for convenience. 
** possibly with the &quot;&lt;code&gt;-&gt;-&lt;/code&gt;&quot; pair parsed into a picture or a &amp;rarr; character (if that doesn't show on your browser, please bing here)
* Advanced &gt;&gt; bDirectional
** perhaps too similar to class notation?
* Advanced_bDirectional
** As the underscore is a valid character in symbol names, that's bound to add to the confusion, especially if there ever was a property group or property that contained one.
* (Advanced)bDirectional
** matches the script syntax most closely, but not terribly clear on the eye. Most mappers don't need to know what the script looks like anyway.
* Advanced:bDirectional
** reaching point of desperation.
* Advanced/bDirectional

Question: how to distinguish between the properties of several different actors? here's two possible snips:

{{innerbox| Tip: to make dynamic water, you can use the following settings as an example, ZoneInfo -&gt; ZoneLight -&gt; TexVPanSpeed = 7 correspond to WaterZoneInfo -&gt; ZoneInfo -&gt; ZoneVelocity -&gt; Y = 100 

}}

{{innerbox| Tip: to make dynamic water, you can use the following settings as an example, ZoneInfo : ZoneLight -&gt; TexVPanSpeed = 7 correspond to WaterZoneInfo : ZoneInfo -&gt; ZoneVelocity -&gt; Y = 100 

}}

Any thoughts?

==Resource names==

Things that come in [[Legacy:Package|package]]s, like sounds, textures, [[Legacy:Static Mesh|static mesh]]es etc. Eg
:NaliCastle.Floors.whatever
:AbbadonArchitecture.Beams.somebeammesh

Reasoning: the dotted syntax is exactly the one the engine expects.

==Directories==

Since we now deal with many different games, instead of writing &quot;Unreal Tournament\System&quot;, write the more generic:

 {[[Legacy:Base Directory|Base Directory]]}\System

The { } indicate (hopefully) that this isn't an ''actual'' directory called that. The page [[Legacy:Base Directory|Base Directory]] should explain it all.

'''Olorin:''' :hmm: why not &lt;tt&gt; &lt;[[Legacy:Base Directory|Base Directory]]&gt;\System &lt;/tt&gt; (or &lt;tt&gt;/System&lt;/tt&gt;) ? Sort of a non-terminal in BNF ?

==Related Topics ==
* [[Legacy:MetaTopics|MetaTopics]]
* [[Legacy:Guidelines On Page Creation|Guidelines On Page Creation]]

----

[http://www.zytemp.com.cn/hwcw.htm 红外测温]

[http://www.hmlaser.com/laser.htm 激光]

[http://www.hmlaser.com/diaokeji.htm 雕刻机]

[http://www.vorx.com.cn/spjk.htm 视频监控]

[http://www.vorx.com.cn/bjmq.htm 编解码器]

[http://www.albaudio.com/newindex/ 灯光]

[http://suji.freewebpage.org 速记培训]

[http://www.bjsailing.com.cn/chuanganqi.htm 传感器]

[http://www.bjsailing.com.cn/yali.htm 压力传感器]

[http://www.bjsailing.com.cn/wendu.htm 温度传感器]

[http://www.bjsailing.com.cn/pt100.htm pt100]

[http://www.bjsailing.com.cn/kongzhiqi.htm 控制器]

[http://www.online-ccc.com ccc certification]

[http://www.vorx.com.cn/pubg/wscp_wscp1.htm 光端机]

[http://www.hm-it.com 接口转换器]

[http://welltrend.freewebpage.org 移民]

[http://www.1so.com.cn/shipinhuiyi/index.htm 视频会议]

[http://www.1so.com.cn/sony/index.htm sony投影机]

[http://www.antu.com.cn 电子政务]

[http://www.antu.com.cn/fme_jjie.htm 地理信息系统]

[http://www.cmmdc.com.cn/yaopinpifa.htm 药品批发]

[http://www.cmmdc.com.cn/dianzishangwu.htm 医药电子商务]

[http://www.cmmdc.com.cn/yiyaopifa.htm 医药批发]

[http://www.hp-ibm.com 小型机]

[http://www.hp-ibm.com 磁带机]

[http://www.1so.com.cn/hunqing/index.htm 婚庆]

[http://hunqing.freewebpage.org 婚庆]

[http://www.65588125.com/hunqing.htm 婚庆]

[http://www.1so.com.cn/qingdian/index.htm 庆典]

[http://www.1so.com.cn/liyi/index.htm 礼仪]

[http://www.westzh.com/yali.htm 压力传感器]

[http://www.westzh.com/niuju.htm 扭矩传感器]

[http://www.qs.com.cn/sjgrq.htm 手机干扰器]

[http://www.qs.com.cn/wlaqglk.htm 安全隔离卡]

[http://www.qs.com.cn/jsjgrq.htm 计算机扰器]

[http://www.qs.com.cn/sjxhzdq.htm 手机信号阻断器]

[http://www.bccec.com.cn 法国留学]

[http://www.bccec.com.cn 法语培训]

[http://www.huahuan.com/cp/h9mox-155.htm sdh]

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Guidelines On Tutorials</title>
    <id>1315</id>
    <revision>
      <id>3355</id>
      <timestamp>2005-12-15T22:53:59Z</timestamp>
      <contributor>
        <ip>192.251.69.127</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">These are rough guidelines for writing tutorials on the site. You might want to read [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] and [[Legacy:Wiki FAQ|Wiki FAQ]] first.

==Title ==

The name of a page is what is used to link with. Tutorials tend to have &quot;procedural&quot; names, such as &quot;Building a Skybox&quot; or &quot;Using the Terrain Tool&quot;. But above all, pick a page name that will hopefully show up in searches. (though experience shows that whatever you pick, someone will type in completely different search terms and complain that they can't find it :( )

===Prerequisites ===

You should add prerequisites to the tutorial page in order for the person to fully enjoy following through with it. They should be in bulleted format.

===Class overview===

A coding tutorial might give an overview of the classes created, like this:

; Standard parent class &gt;&gt; New class : Description.

==Text==

The text of your tutorial should allow the audience (another Wiki user) to follow your lead as you go from ignorance to knowledge of a useful topic.

===Do===
* Attempt to address your audience and their needs.
* Organize your thoughts in a logical progression.
* Build upon past knowledge and basic proceedures.
* Reach the basic goals first, reach further and beyond afterwards.

===Avoid===
* Avoid putting your specific ideas ahead of the audience's generalized needs.
* Avoid large blocks of text without some organized headings and subheadings.
* Avoid new ideas until the ideas they are based on are made clear.
* Avoid ranting, commentary and circular discussions.

==Making it findable==

===Link from somewhere ===

The wiki is a web: it's important that pages interconnect, so you need to find a spot to link from. You'll need to create a link on at least one page to get started. It's a good idea to link from any page that is relevant. 

Some place you could link from:

* one of the Topic pages that are listed in the &quot;Encyclopedia&quot; section on [[Legacy:Home Page|Home Page]]. This means your page is only two levels down the hierarchy
* the &quot;Lessons&quot; pages on [[Legacy:Home Page|Home Page]] might also be suitable
* other related tutorials
* class spec pages which are related to what you're doing. For example, if your tutorial uses [[Legacy:Emitter|Emitter]]s, you could make a list at the foot of that page of &quot;Tutorials which demonstrate using this actor&quot; or something.

All this will help people find your page in the wiki (1,600 pages as of March 03!).

===Tag it ===

Add a link to [[:Category:Legacy Tutorial]]  at the foot of your tutorial. This tags your page so it shows up on category searches.

==Add links ==

There is a huge amount of material on the wiki that you can link to. Remember to link to:

* &quot;parent&quot; pages: the wiki is a web, so there's no knowing how someone will arrive on your page. If you write it as a child of some other page (eg &quot;Terrain tool specifics&quot;, remember to give a link to the parent page (&quot;Terrain tool overview&quot; or whatever).
* related Topic pages
* related tutorials.

Class pages, basic procedure pages and interface pages will make your tutorial considerably simpler to write. Here's how:

===Class pages ===

These give the full spec for a class. The name of a class spec page is, well, just the name of the class. Like this: [[Legacy:XEmitter|xEmitter]]. You don't need to write an explanation of what the class is &amp;ndash; or you can just copy what's on the class page.

===Interface pages ===

Most of the [[Legacy:UnrealEd Interface|UnrealEd Interface]] is documented. You don't need to explain the toolbar or the actor properties window ''yet again'' for n00bs: just link. Pages such as [[Legacy:Toolbar|toolbar]] and [[Legacy:Texture Browser|texture browser]] will give all the details (and if you think those pages aren't good enough: improve them). When giving menu commands, use the [[Legacy:UnrealEd Menus|UnrealEd Menus]] pages.

===Basic procedures===

Even better than that, simple procedures are already explained on separate pages. You don't need to explain how to add a new actor to the map: this is covered completely on [[Legacy:Add An Actor|Add an Actor]], with screenshots, whistles and bells. The idea behind this is that tutorials are a little bit modular: 

* tutorial writers  don't have to keep reinventing the wheel. 
* Beginners will find everything they need, and will also recognize the same procedures in different tutorials and learn them more quickly 
* more advanced readers won't get bored skipping though stuff they already know.

There is a full list of these &quot;mini tutorials&quot; along with ideas on how to link them into your text on [[:Category:Legacy Basic Procedure]]. Take a look at what is there before writing your tutorial. Feel free to improve these or add new ones.

==Images ==

The same idea as above: don't reinvent the wheel. If an image already exists on the wiki, reuse it. Steal images from:
* [[:Category:Legacy Basic Procedure]] pages
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] pages

In fact, if you find an image that already covers what you are doing, consider splitting that section off into a Basic Procedure module.

See also [[Legacy:Images|Images]] for guidelines on image names.</text>
    </revision>
    <revision>
      <id>3356</id>
      <timestamp>2005-04-21T16:12:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">These are rough guidelines for writing tutorials on the site. You might want to read [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] and [[Legacy:Wiki FAQ|Wiki FAQ]] first.

==Title ==

The name of a page is what is used to link with. Tutorials tend to have &quot;procedural&quot; names, such as &quot;Building a Skybox&quot; or &quot;Using the Terrain Tool&quot;. But above all, pick a page name that will hopefully show up in searches. (though experience shows that whatever you pick, someone will type in completely different search terms and complain that they can't find it :( )

===Prerequisites ===

You should add prerequisites to the tutorial page in order for the person to fully enjoy following through with it. They should be in bulleted format.

===Class overview===

A coding tutorial might give an overview of the classes created, like this:

; Standard parent class &gt;&gt; New class : Description.

==Making it findable==

===Link from somewhere ===

The wiki is a web: it's important that pages interconnect, so you need to find a spot to link from. You'll need to create a link on at least one page to get started. It's a good idea to link from any page that is relevant. 

Some place you could link from:

* one of the Topic pages that are listed in the &quot;Encyclopedia&quot; section on [[Legacy:Home Page|Home Page]]. This means your page is only two levels down the hierarchy
* the &quot;Lessons&quot; pages on [[Legacy:Home Page|Home Page]] might also be suitable
* other related tutorials
* class spec pages which are related to what you're doing. For example, if your tutorial uses [[Legacy:Emitter|Emitter]]s, you could make a list at the foot of that page of &quot;Tutorials which demonstrate using this actor&quot; or something.

All this will help people find your page in the wiki (1,600 pages as of March 03!).

===Tag it ===

Add a link to [[:Category:Legacy Tutorial]]  at the foot of your tutorial. This tags your page so it shows up on category searches.

==Add links ==

There is a huge amount of material on the wiki that you can link to. Remember to link to:

* &quot;parent&quot; pages: the wiki is a web, so there's no knowing how someone will arrive on your page. If you write it as a child of some other page (eg &quot;Terrain tool specifics&quot;, remember to give a link to the parent page (&quot;Terrain tool overview&quot; or whatever).
* related Topic pages
* related tutorials.

Class pages, basic procedure pages and interface pages will make your tutorial considerably simpler to write. Here's how:

===Class pages ===

These give the full spec for a class. The name of a class spec page is, well, just the name of the class. Like this: [[Legacy:XEmitter|xEmitter]]. You don't need to write an explanation of what the class is &amp;ndash; or you can just copy what's on the class page.

===Interface pages ===

Most of the [[Legacy:UnrealEd Interface|UnrealEd Interface]] is documented. You don't need to explain the toolbar or the actor properties window ''yet again'' for n00bs: just link. Pages such as [[Legacy:Toolbar|toolbar]] and [[Legacy:Texture Browser|texture browser]] will give all the details (and if you think those pages aren't good enough: improve them). When giving menu commands, use the [[Legacy:UnrealEd Menus|UnrealEd Menus]] pages.

===Basic procedures===

Even better than that, simple procedures are already explained on separate pages. You don't need to explain how to add a new actor to the map: this is covered completely on [[Legacy:Add An Actor|Add an Actor]], with screenshots, whistles and bells. The idea behind this is that tutorials are a little bit modular: 

* tutorial writers  don't have to keep reinventing the wheel. 
* Beginners will find everything they need, and will also recognize the same procedures in different tutorials and learn them more quickly 
* more advanced readers won't get bored skipping though stuff they already know.

There is a full list of these &quot;mini tutorials&quot; along with ideas on how to link them into your text on [[:Category:Legacy Basic Procedure]]. Take a look at what is there before writing your tutorial. Feel free to improve these or add new ones.

==Images ==

The same idea as above: don't reinvent the wheel. If an image already exists on the wiki, reuse it. Steal images from:
* [[:Category:Legacy Basic Procedure]] pages
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] pages

In fact, if you find an image that already covers what you are doing, consider splitting that section off into a Basic Procedure module.

See also [[Legacy:Images|Images]] for guidelines on image names.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Gundy</title>
    <id>1310</id>
    <revision>
      <id>3344</id>
      <timestamp>2002-08-17T20:48:27Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:''' Hello Gundy. Welcome to the Unreal Wiki :)

'''ZxAnPhOrIaN:''' Hi! Welcome to the wiki :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3345</id>
      <timestamp>2002-08-17T07:55:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>hello</comment>
      <text xml:space="preserve">'''Tarquin:''' Hello Gundy. Welcome to the Unreal Wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HAiNeSy</title>
    <id>1403</id>
    <revision>
      <id>3551</id>
      <timestamp>2002-09-01T19:18:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Damn the capitalisation!

'''ZxAnPhOrIaN:''' Hey, Welcome to the wiki! :) :tup:

'''Tarquin:''' Hello.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3552</id>
      <timestamp>2002-09-01T17:07:10Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Damn the capitalisation!

'''ZxAnPhOrIaN:''' Hey, Welcome to the wiki! :) :tup:</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HCDenton</title>
    <id>1442</id>
    <revision>
      <id>3635</id>
      <timestamp>2006-03-21T18:46:15Z</timestamp>
      <contributor>
        <ip>Static24-72-1-67.reverse.rbe.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">Hi everyone!

My first experience with the unreal engine was when I opened deusex.ini once just for fun and thought, this must be a hell of an engine.. (I think this was some time in 2001)

Shortly after that, I heard about the DX SDK, and downloaded it immediately. I used UnrealEd ever since..

Before that, I've experimenting with Worldcraft, creating some half life maps. I hated the way the editing worked with worldcraft.

I'm currently working on a mod for Deus Ex (I know that's a little late, but who cares anyway?) so I'm mainly interested in the Unreal 1 Engine.. I don't know too much about the other versions of the engine, but I try to improve wiki pages that lack information about the unreal 1 engine.

I'm currently experimenting with native unreal classes, and will probably add some pages about that topic when I'm finished (there doesn't seem to be much in this wiki about native coding)

I am looking forward for Eidos to release the DX2 SDK...

You can check out my deus ex site here: http://deusex.hcesperer.org 

==Guestbook==

'''Tarquin:''' Hi, welcome to Unreal Wiki :)

'''MythOpus:''' Welcome To Teh Wikiness :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3636</id>
      <timestamp>2006-03-21T17:30:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi everyone!

My first experience with the unreal engine was when I opened deusex.ini once just for fun and thought, this must be a hell of an engine.. (I think this was some time in 2001)

Shortly after that, I heard about the DX SDK, and downloaded it immediately. I used UnrealEd ever since..

Before that, I've experimenting with Worldcraft, creating some half life maps. I hated the way the editing worked with worldcraft.

I'm currently working on a mod for Deus Ex (I know that's a little late, but who cares anyway?) so I'm mainly interested in the Unreal 1 Engine.. I don't know too much about the other versions of the engine, but I try to improve wiki pages that lack information about the unreal 1 engine.

I'm currently experimenting with native unreal classes, and will probably add some pages about that topic when I'm finished (there doesn't seem to be much in this wiki about native coding)

I am looking forward for Eidos to release the DX2 SDK...

You can check out my deus ex site here: http://deusex.hcesperer.org 

==Guestbook==

'''Tarquin:''' Hi, welcome to Unreal Wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HLS To RGB Conversion</title>
    <id>1407</id>
    <revision>
      <id>3561</id>
      <timestamp>2006-07-10T08:52:25Z</timestamp>
      <contributor>
        <ip>82-43-89-237.cable.ubr08.croy.blueyonder.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This set of functions can convert HLS values to RGB.  hls2rgb takes the byte values of Hue, Luminosity, and Saturation and returns the Color it represents.  (HueToRGB is a support function for the main conversion.)

Very liberally adapted from http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html

{{innerbox|'''How to convert HLS value to RGB value?'''

This is an useful function extracted from Microsoft's old sample code, modified a little by Rei for her own product. Note that this code is copyrighted to Microsoft Corporation.

:''Quoted from that page.''

}}

&lt;uscript&gt;
const HLSMAX = 240;
const RGBMAX = 255;


final simulated function float HueToRGB(float n1, float n2, float hue)
{
	if ( hue &lt; 0 ) hue += HLSMAX;
	if ( hue &gt; HLSMAX ) hue -= HLSMAX;

	/* return r,g, or b value from this tridrant */
	if ( hue &lt; (HLSMAX/6) )
		return ( n1 + (((n2-n1)*hue + (HLSMAX/12))/(HLSMAX/6)) );
	if ( hue &lt; (HLSMAX/2) )
		return n2;
	if ( hue &lt; ((HLSMAX*2)/3) )
		return ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue) + (HLSMAX/12))/(HLSMAX/6)) );
	else
		return n1;
}


final simulated function Color hls2rgb(byte hue, byte lum, byte sat)
{
	local Color C;
	local float Magic1, Magic2;
	local int R,G,B;

	if ( sat==0)
	{     /* achromatic case */
		C.R = (lum*RGBMAX) / HLSMAX;
		C.G = C.R;
		C.B = C.R;

		/* Small fix */
		R = C.R;
		G = C.G;
		B = C.B;
	}
	else
	{       /* chromatic case */
		/* set up magic numbers */
		if (lum &lt;= (HLSMAX/2))
			Magic2 = (lum*(HLSMAX+sat)+(HLSMAX/2)) / HLSMAX;
		else
			Magic2 = lum+sat - ((lum*sat)+(HLSMAX/2)) / HLSMAX;

		Magic1 = 2*lum - Magic2;

		/* get RGB, change units from HLSMAX to RGBMAX */
		R = (HueToRGB(Magic1, Magic2, hue+(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		G = (HueToRGB(Magic1, Magic2, hue)
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		B = (HueToRGB(Magic1, Magic2, hue-(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
	}

	C.R = R;
	C.G = G;
	C.B = B;
	C.A = 255;
	return C;
}
&lt;/uscript&gt;

&lt;uscript&gt;
// ============================================================================
// HLStoRGB
//
// Converts the given HLS color value to its RGB equivalent and returns it.
//
//   H   Hue          from 0 (red) over 80 (green) and 160 (blue) to 240 (red)
//   L   Lightness    from 0 (black) over 120 (full color) to 240 (white)
//   S   Saturation   from 0 (gray) to 240 (full color)
//
// Due to its use of the color scaling operator this function expects to be
// implemented in an Actor subclass.
// ============================================================================

static function Color HLStoRGB(int H, int L, int S) {

  local int OffsetLightness;
  local int OffsetSaturation;
  local Color Color;
  
  if (H &lt; 0) H = (240 - H) % 240;
        else H =        H  % 240;

       if (H &lt;  80) Color.R = Min(255, 255 * (80 - H)  / 40);
  else if (H &gt; 160) Color.R = Min(255, 255 * (H - 160) / 40);
  
  if (H &lt; 160) Color.G = Min(255, 255 * (80 - Abs(H -  80)) / 40);
  if (H &gt;  80) Color.B = Min(255, 255 * (80 - Abs(H - 160)) / 40);
  
  if (S &lt; 240) {
    Color = Color * (float(S) / 240);
    OffsetSaturation = 128 * (240 - S) / 240;
    Color.R += OffsetSaturation;
    Color.G += OffsetSaturation;
    Color.B += OffsetSaturation;
    }

  L = Min(240, L);
  Color = Color * ((120 - Abs(L - 120)) / 120);

  if (L &gt; 120) {
    OffsetLightness = 256 * (L - 120) / 120;
    Color.R += OffsetLightness;
    Color.G += OffsetLightness;
    Color.B += OffsetLightness;
    }

  return Color;
  }
&lt;/uscript&gt;

'''UArch''' slight modification to the above script

ok changed it now, im using this custom version for a script im doing

input HLS values range from 0-255, output vector with ranges 0-1 x=R y=G z=B

&lt;uscript&gt;
simulated final function vector HLStoRGB(float H,float L,float S)
{
	local float OffsetLightness;
	local float OffsetSaturation;
	local vector cout;

	H = fclamp(H,0,255);
	L = fclamp(L,0,255);
	S = fclamp(S,0,255);
	S = 255 - S;

	if(H &lt; 85)
		cout.x = fMin(1, (85 - H)  / 42.5);

	else if(H &gt; 170)
		cout.x = fMin(1, (H - 170) / 42.5);

	if (H &lt; 170)
		cout.y = fMin(1, (85 - Abs(H -  85)) / 42.5);

	if (H &gt; 85)
		cout.z = fMin(1, (85 - Abs(H - 170)) / 42.5);

	if (S &lt; 255)
	{
		cout = cout * (S / 255);
		OffsetSaturation = /*128 **/ (255 - S) / 255;
		cout.x += OffsetSaturation;
		cout.y += OffsetSaturation;
		cout.z += OffsetSaturation;
	}

	cout = cout * ((255 - Abs(L - 255)) / 255);

	return cout;
}
&lt;/uscript&gt;

Here's what [[Legacy:Sourced Player Shadows|Sourced Player Shadows]] uses to determine the light color when casting colored shadows.  It's based on direct measurements of the color of white walls in a zone with various ambient colors set.  You'll have to add your own code to scale for light brightness.  This isn't anything like the scientifically correct way to do the conversion, but my guess is they were just kinda guessing when they wrote it the first time.

&lt;uscript&gt;
// Convert the color (not brightness) of an Unreal light to RGB values from 0 to 1
// inputs are float so I don't have to worry about casting them.
simulated function Chroma2RGB(float hue, float saturation,
                     out float r, out float g, out float b) {
  hue /= 85;
  if (hue &lt;= 1)      { g = hue  ; r = 1-g; b = 0;}
  else if (hue &lt;= 2) { b = hue-1; g = 1-b; r = 0;}
  else               { r = hue-2; b = 1-r; g = 0;}
  saturation = FClamp(saturation/255,0,1);
  r = lerp(saturation,r,1);
  g = lerp(saturation,g,1);
  b = lerp(saturation,b,1);
}

&lt;/uscript&gt;

==Comments==

'''capt.k:'''  HLSMAX and RGBMAX are variables (which can obviously be hard-coded into the script) because I wasn't sure at the time of writing what values would be appropriate.  The UEd color picker uses 240 as the max for HLS values, but the slider has 255.

'''Wormbo:''' Actor.LightSaturation goes from 0 to 255, where 0 means full saturation and 255 indicates a pure grey color. LightHue also goes from 0 to 255 and LightBrightness is an unlimited float value. The color picker in UEd is somwhat useless for light colors, except for the hue value.

'''Mychaeel:''' Since in Windows the &quot;saturation&quot; property usually goes from 0 for &quot;no saturation&quot; (grayscale) to 255 for &quot;full saturation&quot; (full color), that could be the reason that the algorithm posted above doesn't work here without adaptation.

'''Mychaeel:''' I've posted an alternative implementation created from scratch that also uses Windows' HLS definition (see comment header).  If Unreal's really differs from it, adapt the parameters before passing them to that function.

Please test it.  If it works as advertised, let's get rid of the first Microsoft-derived implementation (which is longer and not designed for UnrealScript).

'''inio:''' Added what I came up with for [[Legacy:Sourced Player Shadows|Sourced Player Shadows]].

'''Sixpack-Shambler''' Am I wrong or in the first HLStoRGB function on this page, if Sat == 0 (Achromatic case) will the result not turn out with no colours at all? Look at the code, at the end of it the local variables R G B are applied to C.R, C.G and C.B but if Sat == 0  then the R G B variables are not modifed?

I've changed the code a bit to 'fix' that

==Related Topics==
* [[Legacy:RGB To HLS Conversion|RGB To HLS Conversion]]
* [[Legacy:Color Operators|Color Operators]]
* [[Legacy:Open Source|Open Source]] &amp;ndash; questionable, see quote at the top of this page?</text>
    </revision>
    <revision>
      <id>3562</id>
      <timestamp>2003-11-09T01:54:09Z</timestamp>
      <contributor>
        <ip>R99-142.bas1.srl.dublin.eircom.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This set of functions can convert HLS values to RGB.  hls2rgb takes the byte values of Hue, Luminosity, and Saturation and returns the Color it represents.  (HueToRGB is a support function for the main conversion.)

Very liberally adapted from http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html

{{innerbox|'''How to convert HLS value to RGB value?'''

This is an useful function extracted from Microsoft's old sample code, modified a little by Rei for her own product. Note that this code is copyrighted to Microsoft Corporation.

:''Quoted from that page.''

}}

&lt;uscript&gt;
const HLSMAX = 240;
const RGBMAX = 255;


final simulated function float HueToRGB(float n1, float n2, float hue)
{
	if ( hue &lt; 0 ) hue += HLSMAX;
	if ( hue &gt; HLSMAX ) hue -= HLSMAX;

	/* return r,g, or b value from this tridrant */
	if ( hue &lt; (HLSMAX/6) )
		return ( n1 + (((n2-n1)*hue + (HLSMAX/12))/(HLSMAX/6)) );
	if ( hue &lt; (HLSMAX/2) )
		return n2;
	if ( hue &lt; ((HLSMAX*2)/3) )
		return ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue) + (HLSMAX/12))/(HLSMAX/6)) );
	else
		return n1;
}


final simulated function Color hls2rgb(byte hue, byte lum, byte sat)
{
	local Color C;
	local float Magic1, Magic2;
	local int R,G,B;

	if ( sat==0)
	{     /* achromatic case */
		C.R = (lum*RGBMAX) / HLSMAX;
		C.G = C.R;
		C.B = C.R;

		/* Small fix */
		R = C.R;
		G = C.G;
		B = C.B;
	}
	else
	{       /* chromatic case */
		/* set up magic numbers */
		if (lum &lt;= (HLSMAX/2))
			Magic2 = (lum*(HLSMAX+sat)+(HLSMAX/2)) / HLSMAX;
		else
			Magic2 = lum+sat - ((lum*sat)+(HLSMAX/2)) / HLSMAX;

		Magic1 = 2*lum - Magic2;

		/* get RGB, change units from HLSMAX to RGBMAX */
		R = (HueToRGB(Magic1, Magic2, hue+(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		G = (HueToRGB(Magic1, Magic2, hue)
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		B = (HueToRGB(Magic1, Magic2, hue-(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
	}

	C.R = R;
	C.G = G;
	C.B = B;
	C.A = 255;
	return C;
}
&lt;/uscript&gt;

&lt;uscript&gt;
// ============================================================================
// HLStoRGB
//
// Converts the given HLS color value to its RGB equivalent and returns it.
//
//   H   Hue          from 0 (red) over 80 (green) and 160 (blue) to 240 (red)
//   L   Lightness    from 0 (black) over 120 (full color) to 240 (white)
//   S   Saturation   from 0 (gray) to 240 (full color)
//
// Due to its use of the color scaling operator this function expects to be
// implemented in an Actor subclass.
// ============================================================================

static function Color HLStoRGB(int H, int L, int S) {

  local int OffsetLightness;
  local int OffsetSaturation;
  local Color Color;
  
  if (H &lt; 0) H = (240 - H) % 240;
        else H =        H  % 240;

       if (H &lt;  80) Color.R = Min(255, 255 * (80 - H)  / 40);
  else if (H &gt; 160) Color.R = Min(255, 255 * (H - 160) / 40);
  
  if (H &lt; 160) Color.G = Min(255, 255 * (80 - Abs(H -  80)) / 40);
  if (H &gt;  80) Color.B = Min(255, 255 * (80 - Abs(H - 160)) / 40);
  
  if (S &lt; 240) {
    Color = Color * (float(S) / 240);
    OffsetSaturation = 128 * (240 - S) / 240;
    Color.R += OffsetSaturation;
    Color.G += OffsetSaturation;
    Color.B += OffsetSaturation;
    }

  L = Min(240, L);
  Color = Color * ((120 - Abs(L - 120)) / 120);

  if (L &gt; 120) {
    OffsetLightness = 256 * (L - 120) / 120;
    Color.R += OffsetLightness;
    Color.G += OffsetLightness;
    Color.B += OffsetLightness;
    }

  return Color;
  }
&lt;/uscript&gt;

Here's what [[Legacy:Sourced Player Shadows|Sourced Player Shadows]] uses to determine the light color when casting colored shadows.  It's based on direct measurements of the color of white walls in a zone with various ambient colors set.  You'll have to add your own code to scale for light brightness.  This isn't anything like the scientifically correct way to do the conversion, but my guess is they were just kinda guessing when they wrote it the first time.

&lt;uscript&gt;
// Convert the color (not brightness) of an Unreal light to RGB values from 0 to 1
// inputs are float so I don't have to worry about casting them.
simulated function Chroma2RGB(float hue, float saturation,
                     out float r, out float g, out float b) {
  hue /= 85;
  if (hue &lt;= 1)      { g = hue  ; r = 1-g; b = 0;}
  else if (hue &lt;= 2) { b = hue-1; g = 1-b; r = 0;}
  else               { r = hue-2; b = 1-r; g = 0;}
  saturation = FClamp(saturation/255,0,1);
  r = lerp(saturation,r,1);
  g = lerp(saturation,g,1);
  b = lerp(saturation,b,1);
}

&lt;/uscript&gt;

==Comments==

'''capt.k:'''  HLSMAX and RGBMAX are variables (which can obviously be hard-coded into the script) because I wasn't sure at the time of writing what values would be appropriate.  The UEd color picker uses 240 as the max for HLS values, but the slider has 255.

'''Wormbo:''' Actor.LightSaturation goes from 0 to 255, where 0 means full saturation and 255 indicates a pure grey color. LightHue also goes from 0 to 255 and LightBrightness is an unlimited float value. The color picker in UEd is somwhat useless for light colors, except for the hue value.

'''Mychaeel:''' Since in Windows the &quot;saturation&quot; property usually goes from 0 for &quot;no saturation&quot; (grayscale) to 255 for &quot;full saturation&quot; (full color), that could be the reason that the algorithm posted above doesn't work here without adaptation.

'''Mychaeel:''' I've posted an alternative implementation created from scratch that also uses Windows' HLS definition (see comment header).  If Unreal's really differs from it, adapt the parameters before passing them to that function.

Please test it.  If it works as advertised, let's get rid of the first Microsoft-derived implementation (which is longer and not designed for UnrealScript).

'''inio:''' Added what I came up with for [[Legacy:Sourced Player Shadows|Sourced Player Shadows]].

'''Sixpack-Shambler''' Am I wrong or in the first HLStoRGB function on this page, if Sat == 0 (Achromatic case) will the result not turn out with no colours at all? Look at the code, at the end of it the local variables R G B are applied to C.R, C.G and C.B but if Sat == 0  then the R G B variables are not modifed?

I've changed the code a bit to 'fix' that

==Related Topics==
* [[Legacy:RGB To HLS Conversion|RGB To HLS Conversion]]
* [[Legacy:Color Operators|Color Operators]]
* [[Legacy:Open Source|Open Source]] &amp;ndash; questionable, see quote at the top of this page?</text>
    </revision>
    <revision>
      <id>3563</id>
      <timestamp>2006-07-09T16:51:18Z</timestamp>
      <contributor>
        <ip>82-43-89-237.cable.ubr08.croy.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This set of functions can convert HLS values to RGB.  hls2rgb takes the byte values of Hue, Luminosity, and Saturation and returns the Color it represents.  (HueToRGB is a support function for the main conversion.)

Very liberally adapted from http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html

{{innerbox|'''How to convert HLS value to RGB value?'''

This is an useful function extracted from Microsoft's old sample code, modified a little by Rei for her own product. Note that this code is copyrighted to Microsoft Corporation.

:''Quoted from that page.''

}}

&lt;uscript&gt;
const HLSMAX = 240;
const RGBMAX = 255;


final simulated function float HueToRGB(float n1, float n2, float hue)
{
	if ( hue &lt; 0 ) hue += HLSMAX;
	if ( hue &gt; HLSMAX ) hue -= HLSMAX;

	/* return r,g, or b value from this tridrant */
	if ( hue &lt; (HLSMAX/6) )
		return ( n1 + (((n2-n1)*hue + (HLSMAX/12))/(HLSMAX/6)) );
	if ( hue &lt; (HLSMAX/2) )
		return n2;
	if ( hue &lt; ((HLSMAX*2)/3) )
		return ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue) + (HLSMAX/12))/(HLSMAX/6)) );
	else
		return n1;
}


final simulated function Color hls2rgb(byte hue, byte lum, byte sat)
{
	local Color C;
	local float Magic1, Magic2;
	local int R,G,B;

	if ( sat==0)
	{     /* achromatic case */
		C.R = (lum*RGBMAX) / HLSMAX;
		C.G = C.R;
		C.B = C.R;

		/* Small fix */
		R = C.R;
		G = C.G;
		B = C.B;
	}
	else
	{       /* chromatic case */
		/* set up magic numbers */
		if (lum &lt;= (HLSMAX/2))
			Magic2 = (lum*(HLSMAX+sat)+(HLSMAX/2)) / HLSMAX;
		else
			Magic2 = lum+sat - ((lum*sat)+(HLSMAX/2)) / HLSMAX;

		Magic1 = 2*lum - Magic2;

		/* get RGB, change units from HLSMAX to RGBMAX */
		R = (HueToRGB(Magic1, Magic2, hue+(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		G = (HueToRGB(Magic1, Magic2, hue)
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		B = (HueToRGB(Magic1, Magic2, hue-(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
	}

	C.R = R;
	C.G = G;
	C.B = B;
	C.A = 255;
	return C;
}
&lt;/uscript&gt;

&lt;uscript&gt;
// ============================================================================
// HLStoRGB
//
// Converts the given HLS color value to its RGB equivalent and returns it.
//
//   H   Hue          from 0 (red) over 80 (green) and 160 (blue) to 240 (red)
//   L   Lightness    from 0 (black) over 120 (full color) to 240 (white)
//   S   Saturation   from 0 (gray) to 240 (full color)
//
// Due to its use of the color scaling operator this function expects to be
// implemented in an Actor subclass.
// ============================================================================

static function Color HLStoRGB(int H, int L, int S) {

  local int OffsetLightness;
  local int OffsetSaturation;
  local Color Color;
  
  if (H &lt; 0) H = (240 - H) % 240;
        else H =        H  % 240;

       if (H &lt;  80) Color.R = Min(255, 255 * (80 - H)  / 40);
  else if (H &gt; 160) Color.R = Min(255, 255 * (H - 160) / 40);
  
  if (H &lt; 160) Color.G = Min(255, 255 * (80 - Abs(H -  80)) / 40);
  if (H &gt;  80) Color.B = Min(255, 255 * (80 - Abs(H - 160)) / 40);
  
  if (S &lt; 240) {
    Color = Color * (float(S) / 240);
    OffsetSaturation = 128 * (240 - S) / 240;
    Color.R += OffsetSaturation;
    Color.G += OffsetSaturation;
    Color.B += OffsetSaturation;
    }

  L = Min(240, L);
  Color = Color * ((120 - Abs(L - 120)) / 120);

  if (L &gt; 120) {
    OffsetLightness = 256 * (L - 120) / 120;
    Color.R += OffsetLightness;
    Color.G += OffsetLightness;
    Color.B += OffsetLightness;
    }

  return Color;
  }
&lt;/uscript&gt;

'''UArch''' slight modification to the above script

&lt;uscript&gt;
// ============================================================================

// HLStoRGB
//
// Converts the given HLS color value to its RGB equivalent and returns it.
// input hue lightness and saturation from 0-255
// output rgb from 0-255
//
// Due to its use of the color scaling operator this function expects to be
// implemented in an Actor subclass.
// ============================================================================

static function Color HLStoRGB(int H, int L, int S) {
  local int OffsetLightness;
  local int OffsetSaturation;
  local Color Color;

//too lazy to modify the rest of the script so i just scale down :P
H*=0.9375;
L*=0.9375;
S=255 - S; //invert to compensate for backwards saturation
S*=0.9375;
  
  if (H &lt; 0) H = (240 - H) % 240;
        else H =        H  % 240;

       if (H &lt;  80) Color.R = Min(255, 255 * (80 - H)  / 40);
  else if (H &gt; 160) Color.R = Min(255, 255 * (H - 160) / 40);
  
  if (H &lt; 160) Color.G = Min(255, 255 * (80 - Abs(H -  80)) / 40);
  if (H &gt;  80) Color.B = Min(255, 255 * (80 - Abs(H - 160)) / 40);
  
  if (S &lt; 240) {
    Color = Color * (float(S) / 240);
    OffsetSaturation = 128 * (240 - S) / 240;
    Color.R += OffsetSaturation;
    Color.G += OffsetSaturation;
    Color.B += OffsetSaturation;
    }

  L = Min(240, L);

  Color = Color * ((240 - Abs(L - 240)) / 240);
//  Color = Color * ((120 - Abs(L - 120)) / 120);

/* //this block makes the colors go whiter after mid-brightness, unreal lights dont do this
  if (L &gt; 120) {
    OffsetLightness = 256 * (L - 120) / 120;
    Color.R += OffsetLightness;
    Color.G += OffsetLightness;
    Color.B += OffsetLightness;
    }*/

  return Color;
  }
&lt;/uscript&gt;

Here's what [[Legacy:Sourced Player Shadows|Sourced Player Shadows]] uses to determine the light color when casting colored shadows.  It's based on direct measurements of the color of white walls in a zone with various ambient colors set.  You'll have to add your own code to scale for light brightness.  This isn't anything like the scientifically correct way to do the conversion, but my guess is they were just kinda guessing when they wrote it the first time.

&lt;uscript&gt;
// Convert the color (not brightness) of an Unreal light to RGB values from 0 to 1
// inputs are float so I don't have to worry about casting them.
simulated function Chroma2RGB(float hue, float saturation,
                     out float r, out float g, out float b) {
  hue /= 85;
  if (hue &lt;= 1)      { g = hue  ; r = 1-g; b = 0;}
  else if (hue &lt;= 2) { b = hue-1; g = 1-b; r = 0;}
  else               { r = hue-2; b = 1-r; g = 0;}
  saturation = FClamp(saturation/255,0,1);
  r = lerp(saturation,r,1);
  g = lerp(saturation,g,1);
  b = lerp(saturation,b,1);
}

&lt;/uscript&gt;

==Comments==

'''capt.k:'''  HLSMAX and RGBMAX are variables (which can obviously be hard-coded into the script) because I wasn't sure at the time of writing what values would be appropriate.  The UEd color picker uses 240 as the max for HLS values, but the slider has 255.

'''Wormbo:''' Actor.LightSaturation goes from 0 to 255, where 0 means full saturation and 255 indicates a pure grey color. LightHue also goes from 0 to 255 and LightBrightness is an unlimited float value. The color picker in UEd is somwhat useless for light colors, except for the hue value.

'''Mychaeel:''' Since in Windows the &quot;saturation&quot; property usually goes from 0 for &quot;no saturation&quot; (grayscale) to 255 for &quot;full saturation&quot; (full color), that could be the reason that the algorithm posted above doesn't work here without adaptation.

'''Mychaeel:''' I've posted an alternative implementation created from scratch that also uses Windows' HLS definition (see comment header).  If Unreal's really differs from it, adapt the parameters before passing them to that function.

Please test it.  If it works as advertised, let's get rid of the first Microsoft-derived implementation (which is longer and not designed for UnrealScript).

'''inio:''' Added what I came up with for [[Legacy:Sourced Player Shadows|Sourced Player Shadows]].

'''Sixpack-Shambler''' Am I wrong or in the first HLStoRGB function on this page, if Sat == 0 (Achromatic case) will the result not turn out with no colours at all? Look at the code, at the end of it the local variables R G B are applied to C.R, C.G and C.B but if Sat == 0  then the R G B variables are not modifed?

I've changed the code a bit to 'fix' that

==Related Topics==
* [[Legacy:RGB To HLS Conversion|RGB To HLS Conversion]]
* [[Legacy:Color Operators|Color Operators]]
* [[Legacy:Open Source|Open Source]] &amp;ndash; questionable, see quote at the top of this page?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HOM</title>
    <id>1425</id>
    <revision>
      <id>3605</id>
      <timestamp>2005-10-20T16:13:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Hall of Mirrors]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Hall Of Mirrors|Hall of Mirrors]]</text>
    </revision>
    <revision>
      <id>3606</id>
      <timestamp>2005-10-20T12:04:37Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>See Hall of Mirrors.</comment>
      <text xml:space="preserve">See [[Legacy:Hall Of Mirrors|Hall of Mirrors]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HSDanClark</title>
    <id>1428</id>
    <revision>
      <id>3611</id>
      <timestamp>2003-11-02T18:30:10Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==My Unreal Wiki Page==

===Who Am I?===

I am the Artist Formerly Known As [[Legacy:RDGDanClark|RDGDanClark]]. I have created a new entity, Hectic Studios, and am currently involved with two projects. The first project is a continuation of sorts of the RDG project, Net Combat. It has gone through a complete overhaul, and I will be posting details of that project soon. I will be promoting the project and looking to round out a team while I'm at [[Legacy:Unreal_University|Unreal_University]], so if you're going to be there, I'd like to talk to you :) The second project is actually not Unreal-related. It's a complete (read: salable) game using the Torque engine from [http://www.garagegames.com Garage Games]. Though it's off-topic for the wiki, anyone who'd like to help out with the Torque project is welcome to, and people putting in significant work will even be eligible for a cut of the profits.

If you catch me playing UT/UT2003 online, I go by the name [HS]TheGodfather.&lt;br /&gt;&lt;i&gt;'Cause I'll make you an offer you can't refuse!&lt;/i&gt;

Contact:
*games@danielmclark.com
*AIM: HSDanClark
*Yahoo IM: HSDanClark

====Journals====

*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT]]
**CTF-Lerxst
**CTF-Dirk
**CTF-Pratt
**DM-Massassi
**DM-Castle
**DM-Platforms
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT2003]]
**CTF-Lerxst][
**CTF-Pratt][
**DM-Platforms][

====Rants====

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]
*Camping &amp;ndash; What it is, what it isn't, and why people feel they need to justify their loss by complaining about it.
*Rush In Rio &amp;ndash; Non-UT related, a semi-review of the new Rush in Rio DVD/CD. Rush rocks.

----

====Leave Your Mark====

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.

'''Dragonmaw:''' Welcome!  Always good to have experienced modders helping.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HSDanClark/Rants</title>
    <id>1431</id>
    <revision>
      <id>3614</id>
      <timestamp>2004-07-28T09:02:21Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Rants==

Some are UT related, some aren't. They're all entertaining though :D

==Camping==

====What is camping?====

The definition of camping depends on who you ask. Some people believe that standing still for more than 2 seconds is camping, and they'll go on and on that the reason they lost the match is because of it. Some people believe that finding a dark corner to hide in and shoot from is camping, and they'll go on and on that the reason they lost the match is because of it. Some people believe that sitting in front of a spawn point and instantly killing whatever comes out is camping, and they'll go on and on... you get the idea.

====What isn't camping?====

Basically, all of what I just described.

I'll never understand why some people think that the defenders are supposed to make life easy on the attackers. As far as I know, the only goal of any game is to win. In order to win, a team must do whatever it takes short of actual cheating (see below) to score more points/goals/kills than the other team.

{{innerbox| Cheat: '''a :''' to practice fraud or trickery '''b :''' to violate rules dishonestly (as at cards or on an examination) '''c :''' to be sexually unfaithful

}}

As I'm relatively sure that nobody is being sexually unfaithful to someone while playing a game like UT2003, the first two definitions are probably what concern us. &quot;to practice fraud or trickery&quot; is somewhat vague, but the second bit, &quot;to violate rules dishonestly&quot;, now '''''that''''' sounds like what we're looking for. The question now would be: is camping (by the popular definition) cheating?

How ''can'' it be? There are no rules to violate on this subject. Standing still is not a violation of any rule, nor is hiding in a dark corner. Even &quot;spawn camping&quot; isn't against any rules. So, if camping (by the popular definition) isn't cheating, and the whole point of playing is to win by any means necessary (short of actual cheating), then what's the problem? 

In fact, the only rules in UT2003 for example, are the rules laid out in the EULA as put forth in the manual. You're not allowed to hack the game or otherwise change the game in such a way that it gives you an unfair advantage. That means no bots and no hacks. You know what it '''doesn't''' mean? It doesn't mean that &quot;camping&quot; is against the rules. It actually means that &quot;camping&quot; is well within the rules. It also doesn't mean that a person is cheating when they use a transparent skin, or one that is entirely black. True, people like that are pathetic losers who have no sense of decency or fun, but they're not cheaters.

''And if they're not cheating, then they're doing everything possible to win the match, and that's the whole point of playing!''

====How do deal with people who you think are camping.====

Kill them. How hard can it be? They're not moving, you know where they are, so go and kill them. And quit complaining about it, you sound like a whiny, pathetic loser.

====Yeah, whatever, you're probably a camper!====

Got that right. According to the popular definition of a camper, I certainly am one. I like to play defense. I like to kill flag carriers. If I'm playing a map that allows me to keep an eye on my flag and repel the invaders, then hell yes, I'm going to do that. I will leave it up to other members of my team to go on offense. If I'm playing a map with UT-style Sniper Rifles, or a Zark mod, I will do my best to get up somewhere high where I can pick people off. What's the point of having a Sniper Rifle with a nifty zoom feature if you're just going to use it like a pistol or assault rifle? People, if you're playing a map/mod that way, do yourself a favor and just leave and play somewhere else. The best players use the weapons they've been given in creative and effective ways. Perching on a high point and headshot-ing enemies from across the map is '''very''' effective. One thing I don't do though is intentional spawn-killing. That's just plain boring. 

====To the mapmakers====

If you make a CTF map with only one entrance to a small room with the flag in it, your map sucks. Actually, for me, it's great, but as far as the Camping Crybabies&amp;trade; are concerned, you're a cheater-by-proxy. You're making it easy for someone to load up on rockets, hide inside that one entrance you put in, and blow away any invaders that step foot into the room before they even know it. Don't do it. Always have more than one way to and from each flag. If someone is able to spawn-kill, your map sucks. Being able to spawn-kill means that you either have too few spawn points, or all the spawn points for one team are in the same place with easy access to the enemy team. Spread them out. Put them in different rooms with no line of sight to each other.

====And finally...====

Of course, all this has been based on logic, and we all know that the people who scream &quot;CAMPER!&quot; the loudest are the ones that have just lost a match and are looking to blame anything or anyone but themselves. When that happens, logic goes right out the window.

Try to accept that there are players better than you out there (and don't even get me started about people who Cry Bot).

===Comments===

'''GRAF1K:''' If you can meet their silly rules (while still winning), by all means do so!

Some things, like spawn camping, kill the fun of the game, but aren't cheating. There is more than one server they can go to.

Invisible skins, though, are the essence of &quot;change[ing] the game in such a way that it gives you an unfair advantage&quot;.

Whiners will always be there, but in the end they're no fun to play against anyway. Again, there's more than one server running in the world. Just ignore whiners &amp;ndash; that's always fun. ;-)

'''Solid Snake:''' If someone ruins gameplay fun I usually think that it is kind of bad. Camping can do this, but it depends. I like to guard my places, especially in bombing run but that doesn't make me a camper. Well, I usually make mods which don't have sniper rifles in them anyways... or at least with FOV alterations.

==Rush in Rio==

Q: Russian Rio... isn't that a drink?

A: No.

The rest of this rant is coming shortly.

'''Dark Pulse:''' Erm, OK.

----

===Comments===

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3615</id>
      <timestamp>2003-11-02T18:32:33Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Rants==

Some are UT related, some aren't. They're all entertaining though :D

==Camping==

====What is camping?====

The definition of camping depends on who you ask. Some people believe that standing still for more than 2 seconds is camping, and they'll go on and on that the reason they lost the match is because of it. Some people believe that finding a dark corner to hide in and shoot from is camping, and they'll go on and on that the reason they lost the match is because of it. Some people believe that sitting in front of a spawn point and instantly killing whatever comes out is camping, and they'll go on and on... you get the idea.

====What isn't camping?====

Basically, all of what I just described.

I'll never understand why some people think that the defenders are supposed to make life easy on the attackers. As far as I know, the only goal of any game is to win. In order to win, a team must do whatever it takes short of actual cheating (see below) to score more points/goals/kills than the other team.

{{innerbox| Cheat: '''a :''' to practice fraud or trickery '''b :''' to violate rules dishonestly (as at cards or on an examination) '''c :''' to be sexually unfaithful

}}

As I'm relatively sure that nobody is being sexually unfaithful to someone while playing a game like UT2003, the first two definitions are probably what concern us. &quot;to practice fraud or trickery&quot; is somewhat vague, but the second bit, &quot;to violate rules dishonestly&quot;, now '''''that''''' sounds like what we're looking for. The question now would be: is camping (by the popular definition) cheating?

How ''can'' it be? There are no rules to violate on this subject. Standing still is not a violation of any rule, nor is hiding in a dark corner. Even &quot;spawn camping&quot; isn't against any rules. So, if camping (by the popular definition) isn't cheating, and the whole point of playing is to win by any means necessary (short of actual cheating), then what's the problem? 

In fact, the only rules in UT2003 for example, are the rules laid out in the EULA as put forth in the manual. You're not allowed to hack the game or otherwise change the game in such a way that it gives you an unfair advantage. That means no bots and no hacks. You know what it '''doesn't''' mean? It doesn't mean that &quot;camping&quot; is against the rules. It actually means that &quot;camping&quot; is well within the rules. It also doesn't mean that a person is cheating when they use a transparent skin, or one that is entirely black. True, people like that are pathetic losers who have no sense of decency or fun, but they're not cheaters.

''And if they're not cheating, then they're doing everything possible to win the match, and that's the whole point of playing!''

====How do deal with people who you think are camping.====

Kill them. How hard can it be? They're not moving, you know where they are, so go and kill them. And quit complaining about it, you sound like a whiny, pathetic loser.

====Yeah, whatever, you're probably a camper!====

Got that right. According to the popular definition of a camper, I certainly am one. I like to play defense. I like to kill flag carriers. If I'm playing a map that allows me to keep an eye on my flag and repel the invaders, then hell yes, I'm going to do that. I will leave it up to other members of my team to go on offense. If I'm playing a map with UT-style Sniper Rifles, or a Zark mod, I will do my best to get up somewhere high where I can pick people off. What's the point of having a Sniper Rifle with a nifty zoom feature if you're just going to use it like a pistol or assault rifle? People, if you're playing a map/mod that way, do yourself a favor and just leave and play somewhere else. The best players use the weapons they've been given in creative and effective ways. Perching on a high point and headshot-ing enemies from across the map is '''very''' effective. One thing I don't do though is intentional spawn-killing. That's just plain boring. 

====To the mapmakers====

If you make a CTF map with only one entrance to a small room with the flag in it, your map sucks. Actually, for me, it's great, but as far as the Camping Crybabies&amp;trade; are concerned, you're a cheater-by-proxy. You're making it easy for someone to load up on rockets, hide inside that one entrance you put in, and blow away any invaders that step foot into the room before they even know it. Don't do it. Always have more than one way to and from each flag. If someone is able to spawn-kill, your map sucks. Being able to spawn-kill means that you either have too few spawn points, or all the spawn points for one team are in the same place with easy access to the enemy team. Spread them out. Put them in different rooms with no line of sight to each other.

====And finally...====

Of course, all this has been based on logic, and we all know that the people who scream &quot;CAMPER!&quot; the loudest are the ones that have just lost a match and are looking to blame anything or anyone but themselves. When that happens, logic goes right out the window.

Try to accept that there are players better than you out there (and don't even get me started about people who Cry Bot).

===Comments===

'''GRAF1K:''' If you can meet their silly rules (while still winning), by all means do so!

Some things, like spawn camping, kill the fun of the game, but aren't cheating. There is more than one server they can go to.

Invisible skins, though, are the essence of &quot;change[ing] the game in such a way that it gives you an unfair advantage&quot;.

Whiners will always be there, but in the end they're no fun to play against anyway. Again, there's more than one server running in the world. Just ignore whiners &amp;ndash; that's always fun. ;-)

==Rush in Rio==

Q: Russian Rio... isn't that a drink?

A: No.

The rest of this rant is coming shortly.

----

===Comments===

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3616</id>
      <timestamp>2003-11-02T18:41:37Z</timestamp>
      <contributor>
        <ip>Solid Snake</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Rants==

Some are UT related, some aren't. They're all entertaining though :D

==Camping==

====What is camping?====

The definition of camping depends on who you ask. Some people believe that standing still for more than 2 seconds is camping, and they'll go on and on that the reason they lost the match is because of it. Some people believe that finding a dark corner to hide in and shoot from is camping, and they'll go on and on that the reason they lost the match is because of it. Some people believe that sitting in front of a spawn point and instantly killing whatever comes out is camping, and they'll go on and on... you get the idea.

====What isn't camping?====

Basically, all of what I just described.

I'll never understand why some people think that the defenders are supposed to make life easy on the attackers. As far as I know, the only goal of any game is to win. In order to win, a team must do whatever it takes short of actual cheating (see below) to score more points/goals/kills than the other team.

{{innerbox| Cheat: '''a :''' to practice fraud or trickery '''b :''' to violate rules dishonestly (as at cards or on an examination) '''c :''' to be sexually unfaithful

}}

As I'm relatively sure that nobody is being sexually unfaithful to someone while playing a game like UT2003, the first two definitions are probably what concern us. &quot;to practice fraud or trickery&quot; is somewhat vague, but the second bit, &quot;to violate rules dishonestly&quot;, now '''''that''''' sounds like what we're looking for. The question now would be: is camping (by the popular definition) cheating?

How ''can'' it be? There are no rules to violate on this subject. Standing still is not a violation of any rule, nor is hiding in a dark corner. Even &quot;spawn camping&quot; isn't against any rules. So, if camping (by the popular definition) isn't cheating, and the whole point of playing is to win by any means necessary (short of actual cheating), then what's the problem? 

In fact, the only rules in UT2003 for example, are the rules laid out in the EULA as put forth in the manual. You're not allowed to hack the game or otherwise change the game in such a way that it gives you an unfair advantage. That means no bots and no hacks. You know what it '''doesn't''' mean? It doesn't mean that &quot;camping&quot; is against the rules. It actually means that &quot;camping&quot; is well within the rules. It also doesn't mean that a person is cheating when they use a transparent skin, or one that is entirely black. True, people like that are pathetic losers who have no sense of decency or fun, but they're not cheaters.

''And if they're not cheating, then they're doing everything possible to win the match, and that's the whole point of playing!''

====How do deal with people who you think are camping.====

Kill them. How hard can it be? They're not moving, you know where they are, so go and kill them. And quit complaining about it, you sound like a whiny, pathetic loser.

====Yeah, whatever, you're probably a camper!====

Got that right. According to the popular definition of a camper, I certainly am one. I like to play defense. I like to kill flag carriers. If I'm playing a map that allows me to keep an eye on my flag and repel the invaders, then hell yes, I'm going to do that. I will leave it up to other members of my team to go on offense. If I'm playing a map with UT-style Sniper Rifles, or a Zark mod, I will do my best to get up somewhere high where I can pick people off. What's the point of having a Sniper Rifle with a nifty zoom feature if you're just going to use it like a pistol or assault rifle? People, if you're playing a map/mod that way, do yourself a favor and just leave and play somewhere else. The best players use the weapons they've been given in creative and effective ways. Perching on a high point and headshot-ing enemies from across the map is '''very''' effective. One thing I don't do though is intentional spawn-killing. That's just plain boring. 

====To the mapmakers====

If you make a CTF map with only one entrance to a small room with the flag in it, your map sucks. Actually, for me, it's great, but as far as the Camping Crybabies&amp;trade; are concerned, you're a cheater-by-proxy. You're making it easy for someone to load up on rockets, hide inside that one entrance you put in, and blow away any invaders that step foot into the room before they even know it. Don't do it. Always have more than one way to and from each flag. If someone is able to spawn-kill, your map sucks. Being able to spawn-kill means that you either have too few spawn points, or all the spawn points for one team are in the same place with easy access to the enemy team. Spread them out. Put them in different rooms with no line of sight to each other.

====And finally...====

Of course, all this has been based on logic, and we all know that the people who scream &quot;CAMPER!&quot; the loudest are the ones that have just lost a match and are looking to blame anything or anyone but themselves. When that happens, logic goes right out the window.

Try to accept that there are players better than you out there (and don't even get me started about people who Cry Bot).

===Comments===

'''GRAF1K:''' If you can meet their silly rules (while still winning), by all means do so!

Some things, like spawn camping, kill the fun of the game, but aren't cheating. There is more than one server they can go to.

Invisible skins, though, are the essence of &quot;change[ing] the game in such a way that it gives you an unfair advantage&quot;.

Whiners will always be there, but in the end they're no fun to play against anyway. Again, there's more than one server running in the world. Just ignore whiners &amp;ndash; that's always fun. ;-)

'''Solid Snake:''' If someone ruins gameplay fun I usually think that it is kind of bad. Camping can do this, but it depends. I like to guard my places, especially in bombing run but that doesn't make me a camper. Well, I usually make mods which don't have sniper rifles in them anyways... or at least with FOV alterations.

==Rush in Rio==

Q: Russian Rio... isn't that a drink?

A: No.

The rest of this rant is coming shortly.

----

===Comments===

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HSDanClark/UT</title>
    <id>1429</id>
    <revision>
      <id>3612</id>
      <timestamp>2003-11-02T18:30:55Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''My maps for UT'''

All six of these maps were featured in the first ever Orlando area [http://www.lancombat.com LanCombat] Tournament. Unfortunately for me, the tournament was the same weekend as the Game Developer's Conference in California, so I couldn't go. I talked to Thrullas, who was in charge of the event, and he said that the maps were very well recieved, and I actually got pictures of people playing them, so that's cool.

==CTF-Lerxst==

This is the first map I ever made for UT, and it's named after Alex &quot;Lerxst&quot; Lifeson from the band [http://www.rush.com Rush]. It's pretty simple as maps go, actually I got a lot of inspiration for it from the Thorns series of maps. This map took me the longest to make, as I was completely new to mapping for games &amp;ndash; not just UT, any games! I'm quite pleased with the way it came out finally though.

==CTF-Pratt==

This was the second map I made, and I got quite ambitious here. I wanted to do a remake of Overdose (mpterra1), the large, S-shaped outdoor map that comes with Quake III: Team Arena. I still do. CTF-Pratt didn't quite make it, though I'm happy with the way it came out in the end. Where Overdose is a dirt-and-grass-style terrain map, Pratt is a metallic S-shaped valley, with a base at the ends of the S and a lookout post on the curves of the S. There is a weapons building for each team close to the bases, and a water pit that divides the map, like a line in a dollar sign &amp;ndash; $. The part that I remember most about making this map was trying to get the coronas right. I didn't use any for Lerxst, and it must have taken me two or three days to figure it out. Like Lerxst, this map is named for a member of Rush, Neil &quot;Pratt&quot; Peart.

==CTF-Dirk==

I started work on Lerxst and Pratt on my own, in my own time. A while later, I saw an ad for the aforementioned LanCombat tournament, and since I live down the street from where it was taking place, I emailed Thrullas and asked if there was anything I could do to help. He asked if I knew how to make maps for UT, and I lied and said yes ;). He told me that he was looking for six maps to use in the tournament, maps that had not been in the public domain before. I told him I could handle that, as I already had 2 (mostly) done, and the tournament was still several months away. CTF-Dirk was the first map I worked on for the tournament. It's pretty standard CTF fare, with a flag base at either end of a long hallway, but there are multiple side rooms and a pretty cool second level with a glass floor that looks down onto the bottom floor. This was the first map that I put hidden rooms into as well, with redeemers and damage modifiers behind the team symbols. This map is named after the final member of Rush, Geddy &quot;Dirk&quot; Lee... can you tell I'm a fan?

==DM-Platforms==

The tournament called for 3 CTF and 3 DM maps, and this was the first DM map I worked on. I always liked the outer space maps in UT, and this map took some inspiration from CTF-Romra. The main area is a large platform (heh) with a structure in the middle. Surrounding this platform, at varying heights, are 14 smaller platforms with teleports between them. The whole level is low gravity &amp;ndash;  the only low grav map here. I got the hang of the coronas when working on Pratt, and used them pretty liberally on this map.

==DM-Castle==

This is probably my favorite map of the six (well... maybe Lerxst is, but this would be a very close second). I didn't start out with any pre-production on this, I just new that I wanted a gothic DM-Curse kinda feel to it. I started with a small room, then just added hallways and other rooms as I felt like it. I connected everything with various stairs and ramps, and there are several levels to the map. One of the coolest features I think is the pair of giant winding stairs. The room that houses the stairs is circular with a large radius, and several rooms break off the stairway as you go up it. This was the first map that I started playing around with the 2D Editor on. I used it for several curved passageways. My only regret is that I didn't give it a more unique name, but I was pressed for time and couldn't think of anything catchy.

==DM-Massassi==

If you've ever read any of the Star Wars line of novels, you might know that the great temples on Yavin 4 (where the Death Star was trying to kill the rebel base in the original movie), were built by a race of people called the Massassi. That's what this map is, it's a large area with lots of trees, a few water pits, and three giant pyramid-shaped temples. There's also a great underground tunnel system with several access points on the forest floor.

----

I've started and abandoned other maps, but as they say, whatever doesn't kill us makes us stronger...

===Comments===

I will add links for download later on.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HSDanClark/UT2003</title>
    <id>1430</id>
    <revision>
      <id>3613</id>
      <timestamp>2003-11-02T18:31:44Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''My Maps for UT2003'''

==CTF-Lerxst][==

A remake of the CTF-Lerxst map from UT, I've altered the look of the level, changing it from a gothic/stone level to a metallic/starship level. The floor layout is the same, but the textures and static meshes are completely different. This is still in progress, though I actually think it's probably done. I'm going to go back to it in about 3 days to look at it with a fresh perspective and make sure all is well for release.

==CTF-Pratt][==

If you read the description of the original CTF-Pratt from my UT page, you'll read that I was trying for a nice remake of the Q3:TA map Overdose, but that I went in a different direction style-wise. Now, with more mapping experience, and an easier terrain tool, I'm going for a more faithful adaptation of the source material. The map is in it's infancy, as I put it down to do a quick job on the new Platforms map.

==DM-Platforms][==

The map I'm currently working on. It's a remake of my DM-Platforms map from UT. With support for static meshes, the level is looking ten times better than the original  :)

----

As each map is completed, I'll put up links for downloads.

===Comments===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HSGrifter</title>
    <id>1438</id>
    <revision>
      <id>3629</id>
      <timestamp>2007-08-06T14:05:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>what?</comment>
      <text xml:space="preserve">==My Unreal Wiki Page==

===Who Am I?===

If you catch me playing UT/UT2003/UT2004 online, I go by the name [HS]Grifter.

After a long absense from mapmaking/modding, I'm planning on getting back into it. Wish me luck  :)

Contact:
*grifter@hecticstudios.com

====Leave Your Mark====

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3630</id>
      <timestamp>2007-08-06T13:50:16Z</timestamp>
      <contributor>
        <ip>Pvestnik2.mirotel.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==My Unreal Wiki Page==

===Who Am I?===

If you catch me playing UT/UT2003/UT2004 online, I go by the name [HS]Grifter.

After a long absense from mapmaking/modding, I'm planning on getting back into it. Wish me luck  :)

Contact:
*grifter@hecticstudios.com

====Leave Your Mark====

* [http://www.google.com Google]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HUD</title>
    <id>1385</id>
    <revision>
      <id>3509</id>
      <timestamp>2005-12-18T03:03:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; HUD (Package: Engine)}}

The base class of all HUD (Heads Up Display) classes.

''Also see [[Legacy:HUD (UT)|HUD (UT)]].''

==Properties==

===GlobalConfig Properties ===
; bool bHideHUD : 
; bool bMessageBeep : 
; bool bShowWeaponInfo : 
; bool bShowPersonalInfo : 
; bool bShowPoints : 
; bool bShowWeaponBar : 
; bool bCrosshairShow : 
; bool bShowPortrait : 
; float HudScale : Global Scale for all widgets
; float HudOpacity : make everything transparent
; float HudCanvasScale : Specifies amount of screen-space to use (for TV's).
; int CrosshairStyle : 
; float CrosshairScale : 
; float CrosshairOpacity : 
; color CrossHairColor : 
; int ConsoleMessageCount : 

; int ConsoleFontSize : 
; int MessageFontOffset : 
; bool bNoEnemyNames : 

===Other Properties===
; [[Legacy:PlayerController|PlayerController]] PlayerOwner : 
; [[Legacy:Pawn|Pawn]] PawnOwner : 
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PawnOwnerPRI : 
; [[Legacy:Console|Console]] PlayerConsole : 
; [[Legacy:ScoreBoard|ScoreBoard]] ScoreBoard : 
; [[Legacy:ScoreBoard|ScoreBoard]] LocalStatsScreen : 
; [[Legacy:Actor|Actor]] VoteMenu : hook for mod authors
; color WhiteColor, RedColor, GreenColor, CyanColor, BlueColor, GoldColor, PurpleColor, TurqColor, GrayColor : 
; bool bShowVoteMenu : 
; bool bShowScoreBoard : Display current score-board instead of Hud elements
; bool bShowDebugInfo : if true, show properties of current ViewTarget
; bool bShowBadConnectionAlert : Display indication of bad connection
; bool bBuiltMOTD : Set to true when the MOTD has been set
; bool bShowLocalStats : 
; Color ConsoleColor : 
; string ProgressFontName (localized) : 
; [[Legacy:Font|Font]] ProgressFontFont : 
; string OverrideConsoleFontName (localized) : 
; Font OverrideConsoleFont : 
; float ProgressFadeTime : 
; Color MOTDColor : 

; float ResScaleX, ResScaleY (transient) : The current screen resolution divided by 640 by 480.  It is updated at the beginning of the hud's PostRender from Canvas.SizeX and Canvas.SizeY.

; ConsoleMessage TextMessages[8] : 
; float ConsoleMessagePosX, ConsoleMessagePosY : DP_LowerLeft
; string FontArrayNames[9] (localized) : 
; [[Legacy:Font|Font]] FontArrayFonts[9] : 
; int FontScreenWidthMedium[9] : 
; int FontScreenWidthSmall[9] : 
; string MOTD[4] : Holds the expanded MOTD Lines
; int MOTDState : 

==Structs ==

===ConsoleMessage ===
; string Text : 
; color TextColor : 
; float MessageLife : 
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI : 

==Methods ==

===Inherited From [[Legacy:Actor|Actor]]===
; PostBeginPlay ( ) : 
; Destroyed ( ) : 
; Reset ( ) : 

===Native Functions ===
; Draw3DLine (vector Start, vector End, color LineColor) (final) : Draws a line in world space. Should be used when engine calls RenderWorldOverlays() event.

===Empty Functions ===
; CreateKeyMenus ( ) : 
; CheckCountdown ([[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI) : 
; GetLocalStatsScreen ( ) : 
; DrawInstructionGfx ([[Legacy:Canvas|Canvas]] C) : 
; SetInstructionText (string text) : 
; SetInstructionKeyText (string text) : 
; DrawHud ([[Legacy:Canvas|Canvas]] C) : 
; DrawSpectatingHud ([[Legacy:Canvas|Canvas]] C) : 
; bool DrawLevelAction ([[Legacy:Canvas|Canvas]] C) : 
; DisplayBadConnectionAlert ([[Legacy:Canvas|Canvas]] C) : Warn user about connection problems.
; LocalizedMessage (class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject, optional string CriticalString) : 
; DisplayPortrait ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI) : 
; SetTargeting (bool bShow, optional vector TargetLocation, optional float Size) : 
; DrawCrosshair ([[Legacy:Canvas|Canvas]] C) : Should draw the crosshair.
; SetCropping (bool Active) : 
; DrawTargeting ([[Legacy:Canvas|Canvas]] C) : 

===Exec Functions===
; ShowScores ( ) : Toggles the scoreboard on/off.
; ShowStats ( ) : Toggles local stats on/off.
; NextStats ( ) : 
; ShowDebug ( ) : Toggles debug information on/off.
; ShowHud ( ) : Toggles the HUD on/off.
; GrowHUD ( ) : Makes the HUD larger.
; ShrinkHUD ( ) : Makes the HUD smaller.

===Static Functions===
; [[Legacy:Font|Font]] LoadFontStatic (int i) : 
; [[Legacy:Font|Font]] GetConsoleFont ([[Legacy:Canvas|Canvas]] C) : 
; [[Legacy:Font|Font]] GetMediumFontFor ([[Legacy:Canvas|Canvas]] Canvas) : 
; [[Legacy:Font|Font]] LargerFontThan ([[Legacy:Font|Font]] aFont) : 

===Other Functions===
; PostRender ([[Legacy:Canvas|Canvas]] Canvas) : Called after rendering world geometry. This is the place where the HUD is actually drawn. '''Note:''' DrawHud will only be called if the player is no spectator ''and has a pawn'', otherwise DrawSpectatingHud is called instead. So if you want to draw your hud without your player having a pawn (for example for a RTS type of view), you have to overwrite this function.

==Known Subclasses==
 HUD
  +- [[Legacy:CinematicHud|CinematicHud]]
  +- [[Legacy:HudBase|HudBase]]
      +- [[Legacy:HudBDeathMatch|HudBDeathMatch]]
          +- [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
              +- [[Legacy:HudBBombingRun|HudBBombingRun]]
              +- [[Legacy:HudBCaptureTheFlag|HudBCaptureTheFlag]]
              +- [[Legacy:HudBDoubleDomination|HudBDoubleDomination]]
      +- [[Legacy:HudCDeathMatch|HudCDeathMatch]] ([[Legacy:UT2004|UT2004]] only)
          +- [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
              +- [[Legacy:HudCBombingRun|HudCBombingRun]]
              +- [[Legacy:HudCCaptureTheFlag|HudCCaptureTheFlag]]
              +- [[Legacy:HudCDoubleDomination|HudCDoubleDomination]]
              +- [[Legacy:HudInvasion|HudInvasion]]
              +- [[Legacy:Hud_Assault|Hud_Assault]]
              +- [[Legacy:ONSHUDOnslaught|ONSHUDOnslaught]]

==External Links==
* [[udn2:HeadsUpDisplayTutorial]]

==Related Topics==
* [[Legacy:Making A HUD|Making a HUD]]
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]]
* [[Legacy:HUD Interactions|HUD Interactions]]
* [[Legacy:HudOverlay|HudOverlay]]
** [[Legacy:ScriptedHudOverlay|ScriptedHudOverlay]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3510</id>
      <timestamp>2004-11-16T17:58:35Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>UT2004 HUDs</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; HUD (Package: Engine)}}

The base class of all HUD (Heads Up Display) classes.

''Also see [[Legacy:HUD (UT)|HUD (UT)]].''

==Properties ==

===GlobalConfig Properties ===
; bool bHideHUD : 
; bool bMessageBeep : 
; bool bShowWeaponInfo : 
; bool bShowPersonalInfo : 
; bool bShowPoints : 
; bool bShowWeaponBar : 
; bool bCrosshairShow : 
; bool bShowPortrait : 
; float HudScale : Global Scale for all widgets
; float HudOpacity : make everything transparent
; float HudCanvasScale : Specifies amount of screen-space to use (for TV's).
; int CrosshairStyle : 
; float CrosshairScale : 
; float CrosshairOpacity : 
; color CrossHairColor : 
; int ConsoleMessageCount : 

; int ConsoleFontSize : 
; int MessageFontOffset : 
; bool bNoEnemyNames : 

===Other Properties ===
; [[Legacy:PlayerController|PlayerController]] PlayerOwner : 
; [[Legacy:Pawn|Pawn]] PawnOwner : 
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PawnOwnerPRI : 
; [[Legacy:Console|Console]] PlayerConsole : 
; [[Legacy:ScoreBoard|ScoreBoard]] ScoreBoard : 
; [[Legacy:ScoreBoard|ScoreBoard]] LocalStatsScreen : 
; [[Legacy:Actor|Actor]] VoteMenu : hook for mod authors
; color WhiteColor, RedColor, GreenColor, CyanColor, BlueColor, GoldColor, PurpleColor, TurqColor, GrayColor : 
; bool bShowVoteMenu : 
; bool bShowScoreBoard : Display current score-board instead of Hud elements
; bool bShowDebugInfo : if true, show properties of current ViewTarget
; bool bShowBadConnectionAlert : Display indication of bad connection
; bool bBuiltMOTD : Set to true when the MOTD has been set
; bool bShowLocalStats : 
; Color ConsoleColor : 
; string ProgressFontName (localized) : 
; [[Legacy:Font|Font]] ProgressFontFont : 
; string OverrideConsoleFontName (localized) : 
; Font OverrideConsoleFont : 
; float ProgressFadeTime : 
; Color MOTDColor : 

; float ResScaleX, ResScaleY (transient) : The current screen resolution divided by 640 by 480.  It is updated at the beginning of the hud's PostRender from Canvas.SizeX and Canvas.SizeY.

; ConsoleMessage TextMessages[8] : 
; float ConsoleMessagePosX, ConsoleMessagePosY : DP_LowerLeft
; string FontArrayNames[9] (localized) : 
; [[Legacy:Font|Font]] FontArrayFonts[9] : 
; int FontScreenWidthMedium[9] : 
; int FontScreenWidthSmall[9] : 
; string MOTD[4] : Holds the expanded MOTD Lines
; int MOTDState : 

==Structs ==

===ConsoleMessage ===
; string Text : 
; color TextColor : 
; float MessageLife : 
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI : 

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PostBeginPlay ( ) : 
; Destroyed ( ) : 
; Reset ( ) : 

===Native Functions ===
; Draw3DLine (vector Start, vector End, color LineColor) (final) : Draws a line in world space. Should be used when engine calls RenderWorldOverlays() event.

===Empty Functions ===
; CreateKeyMenus ( ) : 
; CheckCountdown ([[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI) : 
; GetLocalStatsScreen ( ) : 
; DrawInstructionGfx ([[Legacy:Canvas|Canvas]] C) : 
; SetInstructionText (string text) : 
; SetInstructionKeyText (string text) : 
; DrawHud ([[Legacy:Canvas|Canvas]] C) : 
; DrawSpectatingHud ([[Legacy:Canvas|Canvas]] C) : 
; bool DrawLevelAction ([[Legacy:Canvas|Canvas]] C) : 
; DisplayBadConnectionAlert ([[Legacy:Canvas|Canvas]] C) : Warn user about connection problems.
; LocalizedMessage (class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject, optional string CriticalString) : 
; DisplayPortrait ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI) : 
; SetTargeting (bool bShow, optional vector TargetLocation, optional float Size) : 
; DrawCrosshair ([[Legacy:Canvas|Canvas]] C) : Should draw the crosshair.
; SetCropping (bool Active) : 
; DrawTargeting ([[Legacy:Canvas|Canvas]] C) : 

===Exec Functions ===
; ShowScores ( ) : Toggles the scoreboard on/off.
; ShowStats ( ) : Toggles local stats on/off.
; NextStats ( ) : 
; ShowDebug ( ) : Toggles debug information on/off.
; ShowHud ( ) : Toggles the HUD on/off.
; GrowHUD ( ) : Makes the HUD larger.
; ShrinkHUD ( ) : Makes the HUD smaller.

===Static Functions ===
; [[Legacy:Font|Font]] LoadFontStatic (int i) : 
; [[Legacy:Font|Font]] GetConsoleFont ([[Legacy:Canvas|Canvas]] C) : 
; [[Legacy:Font|Font]] GetMediumFontFor ([[Legacy:Canvas|Canvas]] Canvas) : 
; [[Legacy:Font|Font]] LargerFontThan ([[Legacy:Font|Font]] aFont) : 

===Other Functions ===
; PostRender ([[Legacy:Canvas|Canvas]] Canvas) : Called after rendering world geometry. This is the place where the HUD is actually drawn. '''Note:''' DrawHud will only be called if the player is no spectator ''and has a pawn'', otherwise DrawSpectatingHud is called instead. So if you want to draw your hud without your player having a pawn (for example for a RTS type of view), you have to overwrite this function.

==Known Subclasses ==
 HUD
  +- [[Legacy:CinematicHud|CinematicHud]]
  +- [[Legacy:HudBase|HudBase]]
      +- [[Legacy:HudBDeathMatch|HudBDeathMatch]]
          +- [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
              +- [[Legacy:HudBBombingRun|HudBBombingRun]]
              +- [[Legacy:HudBCaptureTheFlag|HudBCaptureTheFlag]]
              +- [[Legacy:HudBDoubleDomination|HudBDoubleDomination]]
      +- [[Legacy:HudCDeathMatch|HudCDeathMatch]] ([[Legacy:UT2004|UT2004]] only)
          +- [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
              +- [[Legacy:HudCBombingRun|HudCBombingRun]]
              +- [[Legacy:HudCCaptureTheFlag|HudCCaptureTheFlag]]
              +- [[Legacy:HudCDoubleDomination|HudCDoubleDomination]]
              +- [[Legacy:HudInvasion|HudInvasion]]
              +- [[Legacy:Hud_Assault|Hud_Assault]]
              +- [[Legacy:ONSHUDOnslaught|ONSHUDOnslaught]]

==Related Topics ==
* [[Legacy:Making A HUD|Making a HUD]]
* [[udn2:HeadsUpDisplayTutorial]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3511</id>
      <timestamp>2005-07-16T20:25:31Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; HUD (Package: Engine)}}

The base class of all HUD (Heads Up Display) classes.

''Also see [[Legacy:HUD (UT)|HUD (UT)]].''

==Properties ==

===GlobalConfig Properties ===
; bool bHideHUD : 
; bool bMessageBeep : 
; bool bShowWeaponInfo : 
; bool bShowPersonalInfo : 
; bool bShowPoints : 
; bool bShowWeaponBar : 
; bool bCrosshairShow : 
; bool bShowPortrait : 
; float HudScale : Global Scale for all widgets
; float HudOpacity : make everything transparent
; float HudCanvasScale : Specifies amount of screen-space to use (for TV's).
; int CrosshairStyle : 
; float CrosshairScale : 
; float CrosshairOpacity : 
; color CrossHairColor : 
; int ConsoleMessageCount : 

; int ConsoleFontSize : 
; int MessageFontOffset : 
; bool bNoEnemyNames : 

===Other Properties ===
; [[Legacy:PlayerController|PlayerController]] PlayerOwner : 
; [[Legacy:Pawn|Pawn]] PawnOwner : 
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PawnOwnerPRI : 
; [[Legacy:Console|Console]] PlayerConsole : 
; [[Legacy:ScoreBoard|ScoreBoard]] ScoreBoard : 
; [[Legacy:ScoreBoard|ScoreBoard]] LocalStatsScreen : 
; [[Legacy:Actor|Actor]] VoteMenu : hook for mod authors
; color WhiteColor, RedColor, GreenColor, CyanColor, BlueColor, GoldColor, PurpleColor, TurqColor, GrayColor : 
; bool bShowVoteMenu : 
; bool bShowScoreBoard : Display current score-board instead of Hud elements
; bool bShowDebugInfo : if true, show properties of current ViewTarget
; bool bShowBadConnectionAlert : Display indication of bad connection
; bool bBuiltMOTD : Set to true when the MOTD has been set
; bool bShowLocalStats : 
; Color ConsoleColor : 
; string ProgressFontName (localized) : 
; [[Legacy:Font|Font]] ProgressFontFont : 
; string OverrideConsoleFontName (localized) : 
; Font OverrideConsoleFont : 
; float ProgressFadeTime : 
; Color MOTDColor : 

; float ResScaleX, ResScaleY (transient) : The current screen resolution divided by 640 by 480.  It is updated at the beginning of the hud's PostRender from Canvas.SizeX and Canvas.SizeY.

; ConsoleMessage TextMessages[8] : 
; float ConsoleMessagePosX, ConsoleMessagePosY : DP_LowerLeft
; string FontArrayNames[9] (localized) : 
; [[Legacy:Font|Font]] FontArrayFonts[9] : 
; int FontScreenWidthMedium[9] : 
; int FontScreenWidthSmall[9] : 
; string MOTD[4] : Holds the expanded MOTD Lines
; int MOTDState : 

==Structs ==

===ConsoleMessage ===
; string Text : 
; color TextColor : 
; float MessageLife : 
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI : 

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PostBeginPlay ( ) : 
; Destroyed ( ) : 
; Reset ( ) : 

===Native Functions ===
; Draw3DLine (vector Start, vector End, color LineColor) (final) : Draws a line in world space. Should be used when engine calls RenderWorldOverlays() event.

===Empty Functions ===
; CreateKeyMenus ( ) : 
; CheckCountdown ([[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI) : 
; GetLocalStatsScreen ( ) : 
; DrawInstructionGfx ([[Legacy:Canvas|Canvas]] C) : 
; SetInstructionText (string text) : 
; SetInstructionKeyText (string text) : 
; DrawHud ([[Legacy:Canvas|Canvas]] C) : 
; DrawSpectatingHud ([[Legacy:Canvas|Canvas]] C) : 
; bool DrawLevelAction ([[Legacy:Canvas|Canvas]] C) : 
; DisplayBadConnectionAlert ([[Legacy:Canvas|Canvas]] C) : Warn user about connection problems.
; LocalizedMessage (class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject, optional string CriticalString) : 
; DisplayPortrait ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI) : 
; SetTargeting (bool bShow, optional vector TargetLocation, optional float Size) : 
; DrawCrosshair ([[Legacy:Canvas|Canvas]] C) : Should draw the crosshair.
; SetCropping (bool Active) : 
; DrawTargeting ([[Legacy:Canvas|Canvas]] C) : 

===Exec Functions ===
; ShowScores ( ) : Toggles the scoreboard on/off.
; ShowStats ( ) : Toggles local stats on/off.
; NextStats ( ) : 
; ShowDebug ( ) : Toggles debug information on/off.
; ShowHud ( ) : Toggles the HUD on/off.
; GrowHUD ( ) : Makes the HUD larger.
; ShrinkHUD ( ) : Makes the HUD smaller.

===Static Functions ===
; [[Legacy:Font|Font]] LoadFontStatic (int i) : 
; [[Legacy:Font|Font]] GetConsoleFont ([[Legacy:Canvas|Canvas]] C) : 
; [[Legacy:Font|Font]] GetMediumFontFor ([[Legacy:Canvas|Canvas]] Canvas) : 
; [[Legacy:Font|Font]] LargerFontThan ([[Legacy:Font|Font]] aFont) : 

===Other Functions ===
; PostRender ([[Legacy:Canvas|Canvas]] Canvas) : Called after rendering world geometry. This is the place where the HUD is actually drawn. '''Note:''' DrawHud will only be called if the player is no spectator ''and has a pawn'', otherwise DrawSpectatingHud is called instead. So if you want to draw your hud without your player having a pawn (for example for a RTS type of view), you have to overwrite this function.

==Known Subclasses ==
 HUD
  +- [[Legacy:CinematicHud|CinematicHud]]
  +- [[Legacy:HudBase|HudBase]]
      +- [[Legacy:HudBDeathMatch|HudBDeathMatch]]
          +- [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
              +- [[Legacy:HudBBombingRun|HudBBombingRun]]
              +- [[Legacy:HudBCaptureTheFlag|HudBCaptureTheFlag]]
              +- [[Legacy:HudBDoubleDomination|HudBDoubleDomination]]
      +- [[Legacy:HudCDeathMatch|HudCDeathMatch]] ([[Legacy:UT2004|UT2004]] only)
          +- [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
              +- [[Legacy:HudCBombingRun|HudCBombingRun]]
              +- [[Legacy:HudCCaptureTheFlag|HudCCaptureTheFlag]]
              +- [[Legacy:HudCDoubleDomination|HudCDoubleDomination]]
              +- [[Legacy:HudInvasion|HudInvasion]]
              +- [[Legacy:Hud_Assault|Hud_Assault]]
              +- [[Legacy:ONSHUDOnslaught|ONSHUDOnslaught]]

==Related Topics ==
* [[Legacy:Making A HUD|Making a HUD]]
* [[udn2:HeadsUpDisplayTutorial]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HUD (UT)</title>
    <id>1404</id>
    <revision>
      <id>3553</id>
      <timestamp>2005-10-06T16:38:18Z</timestamp>
      <contributor>
        <ip>68-119-22-2.dhcp.stcl.mn.charter.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; HUD}}

The superclass for all heads-up display classes.

==Properties ==

===Variables ===
; globalconfig int HudMode :
; globalconfig int Crosshair : The number of the currently selected crosshair. &lt;i&gt;(?)&lt;/i&gt;
; class&lt;[[Legacy:Menu|Menu]]&gt; MainMenuType :
; [[Legacy:Menu|Menu]] MainMenu : The menu used in Unreal.
; string HUDConfigWindowType : The name of the class used to configure this HUD.
; Color WhiteColor : A ''color'' variable containing the color used as &quot;white&quot;. (Default is R=0, G=128, B=255 which is a kind of light blue)
; [[Legacy:Mutator|Mutator]] HUDMutator : The first [[Legacy:Mutator|Mutator]] registered as HUD mutator. To go through all HUD mutators use the mutator's NexHUDMutator variable.
; [[Legacy:PlayerPawn|PlayerPawn]] PlayerOwner : The player owning this HUD. ([[Legacy:ChallengeHUD|ChallengeHUD]].PawnOwner is the [[Legacy:Pawn (UT)|Pawn (UT)]] the HUD currently displays info for)

===HUDLocalizedMessage struct ===
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message : The [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] class used to create this message.
; int Switch : The Switch parameter used in various functions of the LocalMessage.
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI :
; [[Legacy:Object|Object]] OptionalObject : The Optional[[Legacy:Object|Object]] parameter used in various functions of the LocalMessage.
; float EndOfLife :
; float LifeTime :
; bool bDrawing :
; int numLines :
; string StringMessage :
; color DrawColor : The message's text color.
; font StringFont : The message's font.
; float XL, YL :
; float YPos :

==Functions ==
; function ClearMessage (out HUDLocalizedMessage M) : Resets the HUDLocalizedMessage M.
; function CopyMessage (out HUDLocalizedMessage M1, HUDLocalizedMessage M2) : Copies the values of M2 into M1.
; simulated event PreRender ([[Legacy:Canvas|Canvas]] Canvas) : Called before world geometry is drawn.
; simulated event PostRender ([[Legacy:Canvas|Canvas]] Canvas) : Called after world geometry is drawn and fog is applied. This contains the main HUD rendering functionality.
; simulated function InputNumber (byte F) : ???
; simulated function ChangeHud (int d) : Probably used to select a HUD type as saved in the HudMode variable. (???)
; simulated function ChangeCrosshair (int d) : Changes the crosshair.
; simulated function DrawCrossHair ([[Legacy:Canvas|Canvas]] Canvas, int StartX, int StartY) : Draws the crosshair.
; simulated function Message ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, coerce string Msg, name N) : Called when receiving a new string message. (e.g. a kill with damage type 'SpecialDamage')
; simulated function LocalizedMessage (class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject, optional string CriticalString) : Called when receiving a new LocalMessage. (e.g. flag capture, any kill in UT, etc...)
; simulated function PlayReceivedMessage (string S, string PName, [[Legacy:ZoneInfo|ZoneInfo]] PZone) :
; simulated function bool DisplayMessages ([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) : DisplayMessages is called by the [[Legacy:Console|Console]] in PostRender. It offers the HUD a chance to deal with messages instead of the [[Legacy:Console|Console]].  Returns true if messages were dealt with.
; function bool ProcessKeyEvent (int Key, int Action, float Delta) : 

==Known subclasses ==
* [[Legacy:ChallengeHUD|ChallengeHUD]]
* [[Legacy:UnrealHUD|UnrealHUD]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3554</id>
      <timestamp>2002-04-12T13:16:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; HUD}}

The superclass for all heads-up display classes.

==Properties ==

===Variables ===
; HudMode :
; Crosshair : The number of the currently selected crosshair. &lt;i&gt;(?)&lt;/i&gt;
; MainMenuType : A [[Legacy:Menu|Menu]] class.
; MainMenu : A Menu. &lt;i&gt;(I remember that early versions of Unreal didn't contain the UWindow system. Could this be the menu system used before UWindow? &amp;ndash; [[Legacy:Wormbo|Wormbo]])&lt;/i&gt;
; HUDConfigWindowType : The name of the class used to configure this HUD.
; WhiteColor : A ''color'' variable containing the color used as &quot;white&quot;. (Default is R=0, G=128, B=255 which is a kind of light blue)
; HUDMutator : The first [[Legacy:Mutator|Mutator]] registered as HUD mutator. To go through all HUD mutators use the mutator's NexHUDMutator variable.
; PlayerOwner : The [[Legacy:PlayerPawn|PlayerPawn]] owning this HUD. ([[Legacy:ChallengeHUD|ChallengeHUD]].PawnOwner is the [[Legacy:Pawn (UT)|Pawn (UT)]] the HUD currently displays info for)

===HUDLocalizedMessage struct ===
; class&lt;LocalMessage&gt; Message : The [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] class used to create this message.
; int Switch : The Switch parameter used in various functions of the LocalMessage.
; PlayerReplicationInfo RelatedPRI : A [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]. &lt;i&gt;(Whose is it?)&lt;/i&gt;
; Object OptionalObject : The Optional[[Legacy:Object|Object]] parameter used in various functions of the LocalMessage.
; float EndOfLife :
; float LifeTime :
; bool bDrawing :
; int numLines :
; string StringMessage :
; color DrawColor : The message's text color.
; font StringFont : The message's font.
; float XL, YL :
; float YPos :

==Functions ==
; function ClearMessage(out HUDLocalizedMessage M) : Resets the HUDLocalizedMessage M.
; function CopyMessage(out HUDLocalizedMessage M1, HUDLocalizedMessage M2) : Copies the values of M2 into M1.
; simulated event PreRender(canvas Canvas) : Called before world geometry is drawn.
; simulated event PostRender(canvas Canvas) : Called after world geometry is drawn and fog is applied. This contains the main HUD rendering functionality.
; simulated function InputNumber(byte F) : ???
; simulated function ChangeHud(int d) : Probably used to select a HUD type as saved in the HudMode variable. (???)
; simulated function ChangeCrosshair(int d) : Changes the crosshair.
; simulated function DrawCrossHair( canvas Canvas, int StartX, int StartY) : Draws the crosshair.
; simulated function Message(PlayerReplicationInfo PRI, coerce string Msg, name N) : Called when receiving a new string message. (e.g. a kill with damage type 'SpecialDamage')
; simulated function LocalizedMessage(class&lt;LocalMessage&gt; Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject, optional string CriticalString) : Called when receiving a new LocalMessage. (e.g. flag capture, any kill in UT, etc...)
; simulated function PlayReceivedMessage(string S, string PName, ZoneInfo PZone) :
; simulated function bool DisplayMessages(canvas Canvas) : DisplayMessages is called by the Console in PostRender. It offers the HUD a chance to deal with messages instead of the Console.  Returns true if messages were dealt with.
; function bool ProcessKeyEvent(int Key, int Action, float Delta) : 

==Known subclasses ==
* [[Legacy:ChallengeHUD|ChallengeHUD]]
* [[Legacy:UnrealHUD|UnrealHUD]]</text>
    </revision>
    <revision>
      <id>3555</id>
      <timestamp>2003-01-22T13:26:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; HUD}}

The superclass for all heads-up display classes.

==Properties ==

===Variables ===
; globalconfig int HudMode :
; globalconfig int Crosshair : The number of the currently selected crosshair. &lt;i&gt;(?)&lt;/i&gt;
; class&lt;[[Legacy:Menu|Menu]]&gt; MainMenuType :
; [[Legacy:Menu|Menu]] MainMenu : The menu used in Unreal.
; string HUDConfigWindowType : The name of the class used to configure this HUD.
; Color WhiteColor : A ''color'' variable containing the color used as &quot;white&quot;. (Default is R=0, G=128, B=255 which is a kind of light blue)
; [[Legacy:Mutator|Mutator]] HUDMutator : The first [[Legacy:Mutator|Mutator]] registered as HUD mutator. To go through all HUD mutators use the mutator's NexHUDMutator variable.
; [[Legacy:PlayerPawn|PlayerPawn]] PlayerOwner : The player owning this HUD. ([[Legacy:ChallengeHUD|ChallengeHUD]].PawnOwner is the [[Legacy:Pawn (UT)|Pawn (UT)]] the HUD currently displays info for)

===HUDLocalizedMessage struct ===
; class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message : The [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] class used to create this message.
; int Switch : The Switch parameter used in various functions of the LocalMessage.
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI :
; [[Legacy:Object|Object]] OptionalObject : The Optional[[Legacy:Object|Object]] parameter used in various functions of the LocalMessage.
; float EndOfLife :
; float LifeTime :
; bool bDrawing :
; int numLines :
; string StringMessage :
; color DrawColor : The message's text color.
; font StringFont : The message's font.
; float XL, YL :
; float YPos :

==Functions ==
; function ClearMessage (out HUDLocalizedMessage M) : Resets the HUDLocalizedMessage M.
; function CopyMessage (out HUDLocalizedMessage M1, HUDLocalizedMessage M2) : Copies the values of M2 into M1.
; simulated event PreRender ([[Legacy:Canvas|Canvas]] Canvas) : Called before world geometry is drawn.
; simulated event PostRender ([[Legacy:Canvas|Canvas]] Canvas) : Called after world geometry is drawn and fog is applied. This contains the main HUD rendering functionality.
; simulated function InputNumber (byte F) : ???
; simulated function ChangeHud (int d) : Probably used to select a HUD type as saved in the HudMode variable. (???)
; simulated function ChangeCrosshair (int d) : Changes the crosshair.
; simulated function DrawCrossHair ([[Legacy:Canvas|Canvas]] Canvas, int StartX, int StartY) : Draws the crosshair.
; simulated function Message ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, coerce string Msg, name N) : Called when receiving a new string message. (e.g. a kill with damage type 'SpecialDamage')
; simulated function LocalizedMessage (class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject, optional string CriticalString) : Called when receiving a new LocalMessage. (e.g. flag capture, any kill in UT, etc...)
; simulated function PlayReceivedMessage (string S, string PName, [[Legacy:ZoneInfo|ZoneInfo]] PZone) :
; simulated function bool DisplayMessages ([[Legacy:Canvas|Canvas]] Canvas) : DisplayMessages is called by the [[Legacy:Console|Console]] in PostRender. It offers the HUD a chance to deal with messages instead of the [[Legacy:Console|Console]].  Returns true if messages were dealt with.
; function bool ProcessKeyEvent (int Key, int Action, float Delta) : 

==Known subclasses ==
* [[Legacy:ChallengeHUD|ChallengeHUD]]
* [[Legacy:UnrealHUD|UnrealHUD]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HUD Interactions</title>
    <id>1406</id>
    <revision>
      <id>3558</id>
      <timestamp>2005-12-18T02:44:08Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Okay, so you want a [[Legacy:HUDMutator|HUDMutator]] in [[Legacy:UT2003|UT2003]]? Tough - they're dead. You'll need to use something called an [[Legacy:Interaction|interaction]] instead. Interactions recieve PostRender and PreRender events from the engine, as well as intercept keypresses and messages.

Interactions also contain a whole load of useful functions like &quot;WorldToScreen&quot;, which will take a location as a vector and turn it into a set of screen co-ordinates. Of course, it's also possible to use the client-sided interaction to spawn a HUD, and use its ability to receive PostRender calls to call this function for the HUD it spawned. This allows you to use all the functionality of a HUD class, most notably the [[Legacy:DrawSpriteWidget|DrawSpriteWidget]] function, which is defined in the [[Legacy:HudBase|HudBase]] class.

More on this method of making a HUD [[Legacy:Mutator|mutator]] 2003-style on the bottom of this page.

A couple of nights ago, I started work on something I though would be simple. All it would do is draw a small icon around a player to make them more visible. HUD mutators are dead, so I needed to use an interaction.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating_An_Interaction_From_A_Mutator|Creating_An_Interaction_From_A_Mutator]] to find out how.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

The interaction is very easy to use. Just create a subclass of Interaction, chuck in a &quot;Simulated Function PostRender (canvas Canvas)&quot;, add a couple of lines to defaultproperties, and you're ready to go! Obviously what you want to draw on-screen goes in PostRender.

You need this, at least, in defaultproperties:

&lt;uscript&gt;
bVisible=true
bActive=true
&lt;/uscript&gt;

Setting &lt;code&gt;bActive&lt;/code&gt; to true means that this Interaction will actually be used. Setting &lt;code&gt;bVisible&lt;/code&gt; to true means it will recieve PostRender and PreRender calls.

If you need to use a tick, add:

&lt;uscript&gt;
bRequiresTick=True
&lt;/uscript&gt;

Remember when making your interaction, that an interaction IS NOT AN ACTOR! To use anything that requires an actor (ie: DynamicActors), use 

&lt;uscript&gt;
ForEach ViewportOwner.Actor.DynamicActors(Class'Foo', Bar)
&lt;/uscript&gt;

Also remember than interactions are clientside. You only have access to variables and actors that are replicated to clients.

If you need to do anything when the Interaction is initialized, use

&lt;uscript&gt;
event Initialized()
{
	Log(&quot;foo&quot;);
}
&lt;/uscript&gt;

The interaction I have used for my mutator is detailed below for example.

&lt;uscript&gt;
Class icu_interaction extends interaction;

#exec TEXTURE IMPORT NAME=red FILE=TEXTURES\red.PCX GROUP=&quot;Icons&quot; MIPS=OFF Flags=2
#exec TEXTURE IMPORT NAME=green FILE=TEXTURES\green.PCX GROUP=&quot;Icons&quot; MIPS=OFF Flags=2

Var GameReplicationInfo GRI;

event Initialized()
{
	//log(&quot;Interaction Initialized&quot;);
	foreach ViewportOwner.Actor.DynamicActors(class'GameReplicationInfo', GRI)
		If (GRI != None)
			Break;
}

function PostRender( canvas Canvas )
{
	local Pawn P;
	local vector CameraLocation, dir, ScreenLocation;
	local rotator CameraRotation;
	local float dist, draw_scale;

	foreach ViewportOwner.Actor.DynamicActors(class'Pawn', P)
		{
		if (ViewportOwner.Actor.Pawn == None || P == None)
			Return;

		//A trace to tell if you can see this thing
		If ((Canvas.Viewport.Actor.FastTrace(P.Location, ViewportOwner.Actor.Pawn.Location)) &amp;&amp; (P != ViewportOwner.Actor.Pawn) &amp;&amp; (P.PlayerReplicationInfo != None) &amp;&amp; (P.Health &gt; 0))
			{
			//Convert 3d location to 2d for display on the Canvas
			ScreenLocation = WorldToScreen(P.location);
			Canvas.GetCameraLocation(CameraLocation, CameraRotation);
			dir = P.Location - CameraLocation;
			dist = VSize(dir); //Distance between me and them			
			
			if ((dist &lt; 8000) &amp;&amp; (dist &gt; -8000) &amp;&amp; (dir dot vector(CameraRotation) &gt; 0))
				{
				draw_scale = 512 / dist; //Calculate the drawscale, 512 is the &quot;1:1&quot; distance.
				//Set drawing params
				Canvas.SetPos(ScreenLocation.X - (32 * draw_scale), ScreenLocation.Y - (32 * draw_scale));
				Canvas.Style = 3;
				Canvas.SetDrawColor(255,255,255);
				if ((P.PlayerReplicationInfo.Team.TeamIndex != ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex) || (!GRI.bTeamGame))
					Canvas.DrawIcon(texture'red', draw_scale);
				else if (P.PlayerReplicationInfo.Team.TeamIndex == ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex)
					Canvas.DrawIcon(texture'green', draw_scale);
				}
			}
		}
}

defaultproperties
{
	bVisible=true
	bActive=true
}
&lt;/uscript&gt;

And if you are interested what the end result of my mutator is, see ICU (I See You) on [[Legacy:Will|Will]].

'''Boksha:'''

As stated at the top of this page, you can use interaction's PostRender calls to spawn and feed a HUD for each client. This method gives you both the ability to completely replace the old HUD, or add small features to it, only the former case allows only one modified HUD, and it would be easier to do it using only a clientside mutator. That's very similar to what Will did above, only you set the player's HUD instead of spawning an interaction for him.

Anyway, if you want to make only a small addition to the player's HUD, while keeping the original HUD intact, here's how:

First, make sure your mutator spawns an interaction for every client, like Will explained in [[Legacy:Creating_An_Interaction_From_A_Mutator|Creating_An_Interaction_From_A_Mutator]]. Done that? OK, now comes the easy part. Just make sure your Interaction object contains code like this

&lt;uscript&gt;
Class MyHUDInteraction extends Interaction;

var HUD ThisHudOfMine;

event Initialized()
{
	ThisHudOfMine = ViewportOwner.Actor.spawn(class'GravHud', ViewportOwner.Actor);
}

function PostRender( canvas Canvas )
{
	ThisHudOfMine.PostRender(Canvas);
}

defaultproperties
{
    bVisible=true
    bActive=true
}
&lt;/uscript&gt;

And really, that's ALL there is to it! If your interaction does that, you have a nice extra HUD that does not replace, but rather augment the original HUD. This will become very useful once the [[Legacy:DrawSpriteWidget|DrawSpriteWidget]] function is documented, as it allows you to quickly draw on the HUD independant of the resolution.

==Helpful Information ==

'''Wormbo:''' &quot;HUD interactions&quot; don't even touch the HUD itself. (See [[Legacy:Maintaining Compatibility|Maintaining Compatibility]] for good reasons for that.) Once created they just draw on the [[Legacy:Canvas|Canvas]] each frame after the HUD finished drawing on the very same Canvas. One example of using HUD interactions and [[Legacy:Keypress Interactions|keypress interactions]] is my mutator [[Legacy:Mod Ideas/Mercury Missile InstaGib|Mod Ideas/Mercury Missile InstaGib]]. Just download that, extract its UnrealScript sources and have a look at the MercZoomConfig class.&lt;br /&gt;What Boksha did in his code is spawning an ''additional'' HUD actor and calling that HUD's PostRender() from the Interaction's PostRender(). There are only very few cases where you really need to do something like this, because e.g. the DrawSpriteWidget() function also works when called for the player's HUD from another class, like this:

&lt;uscript&gt;
HudBase(ViewportOwner.Actor.myHUD).DrawSpriteWidget(someSpriteWidgetVariable);
&lt;/uscript&gt;

Of course you can also save a reference to the HUD in a variable for easier access to it.

'''Foxpaw:''' In the mutator, you can add the interaction, and the drawing takes place in the interactions' PostRender() function. You can call a function on the Canvas to draw stuff, depending on what you want to draw. I believe that there is a Wiki page about the Canvas that details the various drawing functions you can use on the canvas.

'''Wormbo:''' If you need an example of a HUD interaction, I can offer JumpStats (see [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]) which draws a lot of text.

===How do I draw a text?===

'''CorDharel:'''

&lt;uscript&gt;
Canvas.SetPos(50,100);
Canvas.SetDrawColor(0,0,0);
Canvas.DrawText(&quot;a text&quot;);
&lt;/uscript&gt;

===bVisible is set to true, but I can't see a text===

The values (0,0,0) sets the color to be  black, which doesn't show up very easily. Maybe its there but you just can't see it.

==Related Topics==
* [[Legacy:Interaction|Interaction]]
* [[Legacy:Canvas|Canvas]]
* [[Legacy:Mutator Topics|Mutator Topics]] and [[Legacy:Mod Making|Mod Making]]
* [[Legacy:HUD|HUD]]
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]]
* [[Legacy:HudOverlay|HudOverlay]]

==Discussion ==

'''DJPaul:''' The tone of this page could be wrong; is this page meant to be ''about'' HUD Interactions, or how to ''implement'' one?  I think it should be the former, and the implementation moved to a tutorial (it sounds very tutorial-ly at the moment anyway).

BTW, where should coding tutorials live?

'''Foxpaw:''' Why does the code above create a HUD and then call that? How is that better than just using the PostRender in the interaction itself?

'''CorDharel:''' I refactored this page. When I can draw a text on the hud (;)) I will expand the &quot;how do I draw a text&quot; section or create a new site. What do you mean?

'''Lilguy:''' It's really not a good idea to call foreach DynamicActors(class'Pawn', P)in a function that's called every frame. Even though this is faster than AllActors, it still has to iterate through a pretty big list to find all the pawns. It'd be much better to call foreach VisibleActors(...) since it uses the engine's fast collision logic to find the actors in your viewport, and it saves you all the logic of trying to determine that stuff. 

'''Foxpaw:''' That seems a bit strange. VisibleActors does a trace on every thing it finds, which is not very fast. I believe that there is linked list of Pawns that would likely be faster than any iterator.

'''Wormbo:''' In a reasonably large radius and with extra checks that do not depend on traces DynamicActors is actually faster than Visible(Colliding)Actors. See [[Legacy:Optimization Techniques|Optimization Techniques]] for details.

'''Kungfu Hampster:'''  Is there a way to contol whether the Interaction HUD will be visible or not through the user control (the bHideHud command)

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3559</id>
      <timestamp>2004-06-23T21:12:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Okay, so you want a [[Legacy:HUDMutator|HUDMutator]] in [[Legacy:UT2003|UT2003]]? Tough - they're dead. You'll need to use something called an [[Legacy:Interaction|interaction]] instead. Interactions recieve PostRender and PreRender events from the engine, as well as intercept keypresses and messages.

Interactions also contain a whole load of useful functions like &quot;WorldToScreen&quot;, which will take a location as a vector and turn it into a set of screen co-ordinates. Of course, it's also possible to use the client-sided interaction to spawn a HUD, and use its ability to receive PostRender calls to call this function for the HUD it spawned. This allows you to use all the functionality of a HUD class, most notably the [[Legacy:DrawSpriteWidget|DrawSpriteWidget]] function, which is defined in the [[Legacy:HudBase|HudBase]] class.

More on this method of making a HUD [[Legacy:Mutator|mutator]] 2003-style on the bottom of this page.

A couple of nights ago, I started work on something I though would be simple. All it would do is draw a small icon around a player to make them more visible. HUD mutators are dead, so I needed to use an interaction.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating_An_Interaction_From_A_Mutator|Creating_An_Interaction_From_A_Mutator]] to find out how.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

The interaction is very easy to use. Just create a subclass of Interaction, chuck in a &quot;Simulated Function PostRender (canvas Canvas)&quot;, add a couple of lines to defaultproperties, and you're ready to go! Obviously what you want to draw on-screen goes in PostRender.

You need this, at least, in defaultproperties:

&lt;uscript&gt;
bVisible=true
bActive=true
&lt;/uscript&gt;

Setting &lt;code&gt;bActive&lt;/code&gt; to true means that this Interaction will actually be used. Setting &lt;code&gt;bVisible&lt;/code&gt; to true means it will recieve PostRender and PreRender calls.

If you need to use a tick, add:

&lt;uscript&gt;
bRequiresTick=True
&lt;/uscript&gt;

Remember when making your interaction, that an interaction IS NOT AN ACTOR! To use anything that requires an actor (ie: DynamicActors), use 

&lt;uscript&gt;
ForEach ViewportOwner.Actor.DynamicActors(Class'Foo', Bar)
&lt;/uscript&gt;

Also remember than interactions are clientside. You only have access to variables and actors that are replicated to clients.

If you need to do anything when the Interaction is initialized, use

&lt;uscript&gt;
event Initialized()
{
	Log(&quot;foo&quot;);
}
&lt;/uscript&gt;

The interaction I have used for my mutator is detailed below for example.

&lt;uscript&gt;
Class icu_interaction extends interaction;

#exec TEXTURE IMPORT NAME=red FILE=TEXTURES\red.PCX GROUP=&quot;Icons&quot; MIPS=OFF Flags=2
#exec TEXTURE IMPORT NAME=green FILE=TEXTURES\green.PCX GROUP=&quot;Icons&quot; MIPS=OFF Flags=2

Var GameReplicationInfo GRI;

event Initialized()
{
	//log(&quot;Interaction Initialized&quot;);
	foreach ViewportOwner.Actor.DynamicActors(class'GameReplicationInfo', GRI)
		If (GRI != None)
			Break;
}

function PostRender( canvas Canvas )
{
	local Pawn P;
	local vector CameraLocation, dir, ScreenLocation;
	local rotator CameraRotation;
	local float dist, draw_scale;

	foreach ViewportOwner.Actor.DynamicActors(class'Pawn', P)
		{
		if (ViewportOwner.Actor.Pawn == None || P == None)
			Return;

		//A trace to tell if you can see this thing
		If ((Canvas.Viewport.Actor.FastTrace(P.Location, ViewportOwner.Actor.Pawn.Location)) &amp;&amp; (P != ViewportOwner.Actor.Pawn) &amp;&amp; (P.PlayerReplicationInfo != None) &amp;&amp; (P.Health &gt; 0))
			{
			//Convert 3d location to 2d for display on the Canvas
			ScreenLocation = WorldToScreen(P.location);
			Canvas.GetCameraLocation(CameraLocation, CameraRotation);
			dir = P.Location - CameraLocation;
			dist = VSize(dir); //Distance between me and them			
			
			if ((dist &lt; 8000) &amp;&amp; (dist &gt; -8000) &amp;&amp; (dir dot vector(CameraRotation) &gt; 0))
				{
				draw_scale = 512 / dist; //Calculate the drawscale, 512 is the &quot;1:1&quot; distance.
				//Set drawing params
				Canvas.SetPos(ScreenLocation.X - (32 * draw_scale), ScreenLocation.Y - (32 * draw_scale));
				Canvas.Style = 3;
				Canvas.SetDrawColor(255,255,255);
				if ((P.PlayerReplicationInfo.Team.TeamIndex != ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex) || (!GRI.bTeamGame))
					Canvas.DrawIcon(texture'red', draw_scale);
				else if (P.PlayerReplicationInfo.Team.TeamIndex == ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex)
					Canvas.DrawIcon(texture'green', draw_scale);
				}
			}
		}
}

defaultproperties
{
	bVisible=true
	bActive=true
}
&lt;/uscript&gt;

And if you are interested what the end result of my mutator is, see ICU (I See You) on [[Legacy:Will|Will]].

'''Boksha:'''

As stated at the top of this page, you can use interaction's PostRender calls to spawn and feed a HUD for each client. This method gives you both the ability to completely replace the old HUD, or add small features to it, only the former case allows only one modified HUD, and it would be easier to do it using only a clientside mutator. That's very similar to what Will did above, only you set the player's HUD instead of spawning an interaction for him.

Anyway, if you want to make only a small addition to the player's HUD, while keeping the original HUD intact, here's how:

First, make sure your mutator spawns an interaction for every client, like Will explained in [[Legacy:Creating_An_Interaction_From_A_Mutator|Creating_An_Interaction_From_A_Mutator]]. Done that? OK, now comes the easy part. Just make sure your Interaction object contains code like this

&lt;uscript&gt;
Class MyHUDInteraction extends Interaction;

var HUD ThisHudOfMine;

event Initialized()
{
	ThisHudOfMine = ViewportOwner.Actor.spawn(class'GravHud', ViewportOwner.Actor);
}

function PostRender( canvas Canvas )
{
	ThisHudOfMine.PostRender(Canvas);
}

defaultproperties
{
    bVisible=true
    bActive=true
}
&lt;/uscript&gt;

And really, that's ALL there is to it! If your interaction does that, you have a nice extra HUD that does not replace, but rather augment the original HUD. This will become very useful once the [[Legacy:DrawSpriteWidget|DrawSpriteWidget]] function is documented, as it allows you to quickly draw on the HUD independant of the resolution.

==Helpful Information ==

'''Wormbo:''' &quot;HUD interactions&quot; don't even touch the HUD itself. (See [[Legacy:Maintaining Compatibility|Maintaining Compatibility]] for good reasons for that.) Once created they just draw on the [[Legacy:Canvas|Canvas]] each frame after the HUD finished drawing on the very same Canvas. One example of using HUD interactions and [[Legacy:Keypress Interactions|keypress interactions]] is my mutator [[Legacy:Mod Ideas/Mercury Missile InstaGib|Mod Ideas/Mercury Missile InstaGib]]. Just download that, extract its UnrealScript sources and have a look at the MercZoomConfig class.&lt;br /&gt;What Boksha did in his code is spawning an ''additional'' HUD actor and calling that HUD's PostRender() from the Interaction's PostRender(). There are only very few cases where you really need to do something like this, because e.g. the DrawSpriteWidget() function also works when called for the player's HUD from another class, like this:

&lt;uscript&gt;
HudBase(ViewportOwner.Actor.myHUD).DrawSpriteWidget(someSpriteWidgetVariable);
&lt;/uscript&gt;

Of course you can also save a reference to the HUD in a variable for easier access to it.

'''Foxpaw:''' In the mutator, you can add the interaction, and the drawing takes place in the interactions' PostRender() function. You can call a function on the Canvas to draw stuff, depending on what you want to draw. I believe that there is a Wiki page about the Canvas that details the various drawing functions you can use on the canvas.

'''Wormbo:''' If you need an example of a HUD interaction, I can offer JumpStats (see [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]) which draws a lot of text.

===How do I draw a text?===

'''CorDharel:'''

&lt;uscript&gt;
Canvas.SetPos(50,100);
Canvas.SetDrawColor(0,0,0);
Canvas.DrawText(&quot;a text&quot;);
&lt;/uscript&gt;

===bVisible is set to true, but I can't see a text===

The values (0,0,0) sets the color to be  black, which doesn't show up very easily. Maybe its there but you just can't see it.

==Related Topics==
* [[Legacy:Interaction|Interaction]]
* [[Legacy:Canvas|Canvas]]

==Discussion ==

'''DJPaul:''' The tone of this page could be wrong; is this page meant to be ''about'' HUD Interactions, or how to ''implement'' one?  I think it should be the former, and the implementation moved to a tutorial (it sounds very tutorial-ly at the moment anyway).

BTW, where should coding tutorials live?

'''Foxpaw:''' Why does the code above create a HUD and then call that? How is that better than just using the PostRender in the interaction itself?

'''CorDharel:''' I refactored this page. When I can draw a text on the hud (;)) I will expand the &quot;how do I draw a text&quot; section or create a new site. What do you mean?

'''Lilguy:''' It's really not a good idea to call foreach DynamicActors(class'Pawn', P)in a function that's called every frame. Even though this is faster than AllActors, it still has to iterate through a pretty big list to find all the pawns. It'd be much better to call foreach VisibleActors(...) since it uses the engine's fast collision logic to find the actors in your viewport, and it saves you all the logic of trying to determine that stuff. 

'''Foxpaw:''' That seems a bit strange. VisibleActors does a trace on every thing it finds, which is not very fast. I believe that there is linked list of Pawns that would likely be faster than any iterator.

'''Wormbo:''' In a reasonably large radius and with extra checks that do not depend on traces DynamicActors is actually faster than Visible(Colliding)Actors. See [[Legacy:Optimization Techniques|Optimization Techniques]] for details.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3560</id>
      <timestamp>2004-11-22T15:30:06Z</timestamp>
      <contributor>
        <ip>65-43-78-76.rdgi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Okay, so you want a [[Legacy:HUDMutator|HUDMutator]] in [[Legacy:UT2003|UT2003]]? Tough - they're dead. You'll need to use something called an [[Legacy:Interaction|interaction]] instead. Interactions recieve PostRender and PreRender events from the engine, as well as intercept keypresses and messages.

Interactions also contain a whole load of useful functions like &quot;WorldToScreen&quot;, which will take a location as a vector and turn it into a set of screen co-ordinates. Of course, it's also possible to use the client-sided interaction to spawn a HUD, and use its ability to receive PostRender calls to call this function for the HUD it spawned. This allows you to use all the functionality of a HUD class, most notably the [[Legacy:DrawSpriteWidget|DrawSpriteWidget]] function, which is defined in the [[Legacy:HudBase|HudBase]] class.

More on this method of making a HUD [[Legacy:Mutator|mutator]] 2003-style on the bottom of this page.

A couple of nights ago, I started work on something I though would be simple. All it would do is draw a small icon around a player to make them more visible. HUD mutators are dead, so I needed to use an interaction.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating_An_Interaction_From_A_Mutator|Creating_An_Interaction_From_A_Mutator]] to find out how.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

The interaction is very easy to use. Just create a subclass of Interaction, chuck in a &quot;Simulated Function PostRender (canvas Canvas)&quot;, add a couple of lines to defaultproperties, and you're ready to go! Obviously what you want to draw on-screen goes in PostRender.

You need this, at least, in defaultproperties:

&lt;uscript&gt;
bVisible=true
bActive=true
&lt;/uscript&gt;

Setting &lt;code&gt;bActive&lt;/code&gt; to true means that this Interaction will actually be used. Setting &lt;code&gt;bVisible&lt;/code&gt; to true means it will recieve PostRender and PreRender calls.

If you need to use a tick, add:

&lt;uscript&gt;
bRequiresTick=True
&lt;/uscript&gt;

Remember when making your interaction, that an interaction IS NOT AN ACTOR! To use anything that requires an actor (ie: DynamicActors), use 

&lt;uscript&gt;
ForEach ViewportOwner.Actor.DynamicActors(Class'Foo', Bar)
&lt;/uscript&gt;

Also remember than interactions are clientside. You only have access to variables and actors that are replicated to clients.

If you need to do anything when the Interaction is initialized, use

&lt;uscript&gt;
event Initialized()
{
	Log(&quot;foo&quot;);
}
&lt;/uscript&gt;

The interaction I have used for my mutator is detailed below for example.

&lt;uscript&gt;
Class icu_interaction extends interaction;

#exec TEXTURE IMPORT NAME=red FILE=TEXTURES\red.PCX GROUP=&quot;Icons&quot; MIPS=OFF Flags=2
#exec TEXTURE IMPORT NAME=green FILE=TEXTURES\green.PCX GROUP=&quot;Icons&quot; MIPS=OFF Flags=2

Var GameReplicationInfo GRI;

event Initialized()
{
	//log(&quot;Interaction Initialized&quot;);
	foreach ViewportOwner.Actor.DynamicActors(class'GameReplicationInfo', GRI)
		If (GRI != None)
			Break;
}

function PostRender( canvas Canvas )
{
	local Pawn P;
	local vector CameraLocation, dir, ScreenLocation;
	local rotator CameraRotation;
	local float dist, draw_scale;

	foreach ViewportOwner.Actor.DynamicActors(class'Pawn', P)
		{
		if (ViewportOwner.Actor.Pawn == None || P == None)
			Return;

		//A trace to tell if you can see this thing
		If ((Canvas.Viewport.Actor.FastTrace(P.Location, ViewportOwner.Actor.Pawn.Location)) &amp;&amp; (P != ViewportOwner.Actor.Pawn) &amp;&amp; (P.PlayerReplicationInfo != None) &amp;&amp; (P.Health &gt; 0))
			{
			//Convert 3d location to 2d for display on the Canvas
			ScreenLocation = WorldToScreen(P.location);
			Canvas.GetCameraLocation(CameraLocation, CameraRotation);
			dir = P.Location - CameraLocation;
			dist = VSize(dir); //Distance between me and them			
			
			if ((dist &lt; 8000) &amp;&amp; (dist &gt; -8000) &amp;&amp; (dir dot vector(CameraRotation) &gt; 0))
				{
				draw_scale = 512 / dist; //Calculate the drawscale, 512 is the &quot;1:1&quot; distance.
				//Set drawing params
				Canvas.SetPos(ScreenLocation.X - (32 * draw_scale), ScreenLocation.Y - (32 * draw_scale));
				Canvas.Style = 3;
				Canvas.SetDrawColor(255,255,255);
				if ((P.PlayerReplicationInfo.Team.TeamIndex != ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex) || (!GRI.bTeamGame))
					Canvas.DrawIcon(texture'red', draw_scale);
				else if (P.PlayerReplicationInfo.Team.TeamIndex == ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex)
					Canvas.DrawIcon(texture'green', draw_scale);
				}
			}
		}
}

defaultproperties
{
	bVisible=true
	bActive=true
}
&lt;/uscript&gt;

And if you are interested what the end result of my mutator is, see ICU (I See You) on [[Legacy:Will|Will]].

'''Boksha:'''

As stated at the top of this page, you can use interaction's PostRender calls to spawn and feed a HUD for each client. This method gives you both the ability to completely replace the old HUD, or add small features to it, only the former case allows only one modified HUD, and it would be easier to do it using only a clientside mutator. That's very similar to what Will did above, only you set the player's HUD instead of spawning an interaction for him.

Anyway, if you want to make only a small addition to the player's HUD, while keeping the original HUD intact, here's how:

First, make sure your mutator spawns an interaction for every client, like Will explained in [[Legacy:Creating_An_Interaction_From_A_Mutator|Creating_An_Interaction_From_A_Mutator]]. Done that? OK, now comes the easy part. Just make sure your Interaction object contains code like this

&lt;uscript&gt;
Class MyHUDInteraction extends Interaction;

var HUD ThisHudOfMine;

event Initialized()
{
	ThisHudOfMine = ViewportOwner.Actor.spawn(class'GravHud', ViewportOwner.Actor);
}

function PostRender( canvas Canvas )
{
	ThisHudOfMine.PostRender(Canvas);
}

defaultproperties
{
    bVisible=true
    bActive=true
}
&lt;/uscript&gt;

And really, that's ALL there is to it! If your interaction does that, you have a nice extra HUD that does not replace, but rather augment the original HUD. This will become very useful once the [[Legacy:DrawSpriteWidget|DrawSpriteWidget]] function is documented, as it allows you to quickly draw on the HUD independant of the resolution.

==Helpful Information ==

'''Wormbo:''' &quot;HUD interactions&quot; don't even touch the HUD itself. (See [[Legacy:Maintaining Compatibility|Maintaining Compatibility]] for good reasons for that.) Once created they just draw on the [[Legacy:Canvas|Canvas]] each frame after the HUD finished drawing on the very same Canvas. One example of using HUD interactions and [[Legacy:Keypress Interactions|keypress interactions]] is my mutator [[Legacy:Mod Ideas/Mercury Missile InstaGib|Mod Ideas/Mercury Missile InstaGib]]. Just download that, extract its UnrealScript sources and have a look at the MercZoomConfig class.&lt;br /&gt;What Boksha did in his code is spawning an ''additional'' HUD actor and calling that HUD's PostRender() from the Interaction's PostRender(). There are only very few cases where you really need to do something like this, because e.g. the DrawSpriteWidget() function also works when called for the player's HUD from another class, like this:

&lt;uscript&gt;
HudBase(ViewportOwner.Actor.myHUD).DrawSpriteWidget(someSpriteWidgetVariable);
&lt;/uscript&gt;

Of course you can also save a reference to the HUD in a variable for easier access to it.

'''Foxpaw:''' In the mutator, you can add the interaction, and the drawing takes place in the interactions' PostRender() function. You can call a function on the Canvas to draw stuff, depending on what you want to draw. I believe that there is a Wiki page about the Canvas that details the various drawing functions you can use on the canvas.

'''Wormbo:''' If you need an example of a HUD interaction, I can offer JumpStats (see [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]) which draws a lot of text.

===How do I draw a text?===

'''CorDharel:'''

&lt;uscript&gt;
Canvas.SetPos(50,100);
Canvas.SetDrawColor(0,0,0);
Canvas.DrawText(&quot;a text&quot;);
&lt;/uscript&gt;

===bVisible is set to true, but I can't see a text===

The values (0,0,0) sets the color to be  black, which doesn't show up very easily. Maybe its there but you just can't see it.

==Related Topics==
* [[Legacy:Interaction|Interaction]]
* [[Legacy:Canvas|Canvas]]

==Discussion ==

'''DJPaul:''' The tone of this page could be wrong; is this page meant to be ''about'' HUD Interactions, or how to ''implement'' one?  I think it should be the former, and the implementation moved to a tutorial (it sounds very tutorial-ly at the moment anyway).

BTW, where should coding tutorials live?

'''Foxpaw:''' Why does the code above create a HUD and then call that? How is that better than just using the PostRender in the interaction itself?

'''CorDharel:''' I refactored this page. When I can draw a text on the hud (;)) I will expand the &quot;how do I draw a text&quot; section or create a new site. What do you mean?

'''Lilguy:''' It's really not a good idea to call foreach DynamicActors(class'Pawn', P)in a function that's called every frame. Even though this is faster than AllActors, it still has to iterate through a pretty big list to find all the pawns. It'd be much better to call foreach VisibleActors(...) since it uses the engine's fast collision logic to find the actors in your viewport, and it saves you all the logic of trying to determine that stuff. 

'''Foxpaw:''' That seems a bit strange. VisibleActors does a trace on every thing it finds, which is not very fast. I believe that there is linked list of Pawns that would likely be faster than any iterator.

'''Wormbo:''' In a reasonably large radius and with extra checks that do not depend on traces DynamicActors is actually faster than Visible(Colliding)Actors. See [[Legacy:Optimization Techniques|Optimization Techniques]] for details.

'''Kungfu Hampster:'''  Is there a way to contol whether the Interaction HUD will be visible or not through the user control (the bHideHud command)

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HUDBase</title>
    <id>28487</id>
    <revision>
      <id>40188</id>
      <timestamp>2009-11-17T10:56:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HUDMutator</title>
    <id>1398</id>
    <revision>
      <id>3540</id>
      <timestamp>2006-04-07T08:00:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; HUDMutator (Package: Relics)}}

''This page relates to [[Legacy:UT|UT]].  To find out how to draw on the HUD in [[Legacy:UT2003|UT2003]], see [[Legacy:Creating An Interaction From A Mutator|Creating an Interaction from a Mutator]].''

The HUDMutator class is used in Epic's Relic mutators, because UT 400 didn't have the Mutator.NextHUDMutator variable.

Please consider breaking compatibility with the Relic HUD mutator (which only draws the Relic icon) instead of creating additional trouble for other mutator authors who want to use a HUD mutator.

See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] for details on creating HUD mutators that work online.

==Properties ==
; HUDMutator NextRHUDMutator : Similar to the NextHUDMutator variable, but since this is of type HUDMutator it is incompatible to any other mutator not subclassing HUDMutator.

==Methods ==
; RegisteraHUDMutator ( ) [simulated] : Similar to the RegisterHUDMutator function.

==Known Subclasses ==
* RelicHUDMutator

==Related Topics ==
* [[Legacy:Relics Patch|Relics Patch]] fixes the compatibility issues

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3541</id>
      <timestamp>2003-07-23T07:46:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; HUDMutator (Package: Relics)}}

''This page relates to [[Legacy:UT|UT]].  To find out how to draw on the HUD in [[Legacy:UT2003|UT2003]], see [[Legacy:Creating An Interaction From A Mutator|Creating an Interaction from a Mutator]].''

The HUDMutator class is used in Epic's Relic mutators, because UT 400 didn't have the Mutator.NextHUDMutator variable.

Please consider breaking compatibility with the Relic HUD mutator (which only draws the Relic icon) instead of creating additional trouble for other mutator authors who want to use a HUD mutator.

See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] for details on creating HUD mutators that work online.

==Properties ==
; HUDMutator NextRHUDMutator : Similar to the NextHUDMutator variable, but since this is of type HUDMutator it is incompatible to any other mutator not subclassing HUDMutator.

==Methods ==
; RegisteraHUDMutator ( ) [simulated] : Similar to the RegisterHUDMutator function.

==Known Subclasses ==
* RelicHUDMutator

==Related Topics ==
* [[Legacy:Relics Patch|Relics Patch]] fixes the compatibility issues

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3542</id>
      <timestamp>2006-04-06T21:06:16Z</timestamp>
      <contributor>
        <ip>219.156.123.225</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; HUDMutator (Package: Relics)}}

''This page relates to [[Legacy:UT|UT]].  To find out how to draw on the HUD in [[Legacy:UT2003|UT2003]], see [[Legacy:Creating An Interaction From A Mutator|Creating an Interaction from a Mutator]].''

The HUDMutator class is used in Epic's Relic mutators, because UT 400 didn't have the Mutator.NextHUDMutator variable.

Please consider breaking compatibility with the Relic HUD mutator (which only draws the Relic icon) instead of creating additional trouble for other mutator authors who want to use a HUD mutator.

See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] for details on creating HUD mutators that work online.

==Properties ==
; HUDMutator NextRHUDMutator : Similar to the NextHUDMutator variable, but since this is of type HUDMutator it is incompatible to any other mutator not subclassing HUDMutator.

==Methods ==
; RegisteraHUDMutator ( ) [simulated] : Similar to the RegisterHUDMutator function.

==Known Subclasses ==
* RelicHUDMutator

==Related Topics ==
* [[Legacy:Relics Patch|Relics Patch]] fixes the compatibility issues

----

[[:Category:Legacy Class (UT)]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hall Of Mirrors</title>
    <id>1415</id>
    <revision>
      <id>3580</id>
      <timestamp>2005-12-29T17:00:59Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>Removed &quot;Merge With BSP Hole&quot;. The  2 things aren't the same at all. Sometimes a HOM is caused by a BSP hole, but they aren't the same.</comment>
      <text xml:space="preserve">==What is a Hall of Mirrors (HOM)?==

The Hall of Mirrors is the scourge of 3D level design. A HOM is a common mistake/error where there is a surface that seems to mirror objects in front of them (this is not entirely accurate, but this is how the HOM got its name), or create visual copies of them.

HOMs are not quite the same as a [[Legacy:BSP Hole|BSP Hole]], though a BSP hole is often the cause of a HOM.

==What causes a Hall of Mirrors effect?==

A hall of mirrors effect is usually created when a objects are drawn to the screen without erasing the previous frame. The most common reason for this occurring in the Unreal Engine is a BSP hole, a transparent/translucent texture on a wall that has nothing behind it, or too short distance fog on a map with no [[Legacy:SkyBox|SkyBox]].

==How does this create this effect?==

When a frame is drawn by the game engine, it is usually drawn '''over''' the previous frame. When there is a HOM effect, there is nothing to cover up the previous frame, so anything that moves in front of the surface of the HOM will &quot;imprint&quot; on the HOM. If you use the ghost cheat, the HOM will appear black because the ghost cheat has the additional effect of drawing a black square behind all objects on the screen, for the purpose of preventing HOM effects when inside a wall.

==What does one look like?==

An example using Half-Life can be viewed with the link below:

* [http://collective.valve-erc.com/index.php?doc=1028187409-05594200 HOM Effect]

==How to fix the HOM Effect (when it is caused by a [[Legacy:BSP Hole|BSP Hole]])==

Sometimes this is fixed with a rebuild, sometimes not. One effective technique is to add another brush in such a way that it is flush with the surface.

The best way is to study zone/portal view to work out which surface might be responsible. Reordering brushes or changing the way an area is built may help.

==How to Cause the HOM Effect (deliberately)==

If for some reason, you WANT to introduce a hall of mirrors effect, you can do so by setting a surface's 'invisible' flag to true. This, of course, only causes a HOM effect on surfaces that &quot;border&quot; the world, like those that would normally be designated fake backdrop.

NOTE -&gt; HOM's Are VERY VERY Bad, and Ugly !

==Related Pages==
* [[Legacy:Troubleshooting|Troubleshooting]]
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:BSP Hole Background|BSP Hole Background]]

==Discussion==

'''Mosquito:''' Is there a page that lists common mapping errors?  Errors such as the HOM effect and BSP holes and possible textures not working, I don't know any others.  If there isn't I think we should make one.  A page like that can be very helpful for newbie mappers that have a similar problem and can't figure out what to do.  Pages like the BSP hole are very helpful for someone that doesn't know what to do.  I think we need to cover more problems in such detail as that.

'''T1:''' The first page linked to is dead, so I removed it. Also, is the &quot;[[:Category:Legacy To Do]] &amp;ndash; merge into [[Legacy:BSP Hole|BSP Hole]]&quot; truly needed? HOWEVER, It should definitely be merged with [[Legacy:HOM|HOM]].

'''GRAF1K:''' I'll bet there's a few little-know HOM fixes floating around. Here's a good place to post them.

'''MasterOfTheDark:''' I made a relatively simple (bad for very large levels, but hey, it worked) fix for the HOM effect:  I subracted a hollow box from around a room that caused the HOM effect and made a ''tiny'' hole between the two.  You can find my sample here (22 KB): http://motd.4d2.org/UT/fixHOM.ut2  A skybox might also fix the problem, though I haven't tried.

'''GRAF1K:''' The 1on1Pack has used your HOM fix, see DM-1on1-Tangora.

'''T1:''' Merged info from [[Legacy:HOM|HOM]] to here.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3581</id>
      <timestamp>2005-12-29T01:22:19Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What is a Hall of Mirrors (HOM)?==

The Hall of Mirrors is the scourge of 3D level design. A HOM is a common mistake/error where there is a surface that seems to mirror objects in front of them (this is not entirely accurate, but this is how the HOM got its name), or create visual copies of them.

HOMs are not quite the same as a [[Legacy:BSP Hole|BSP Hole]], though a BSP hole is often the cause of a HOM.

==What causes a Hall of Mirrors effect?==

A hall of mirrors effect is usually created when a objects are drawn to the screen without erasing the previous frame. The most common reason for this occurring in the Unreal Engine is a BSP hole, a transparent/translucent texture on a wall that has nothing behind it, or too short distance fog on a map with no [[Legacy:SkyBox|SkyBox]].

==How does this create this effect?==

When a frame is drawn by the game engine, it is usually drawn '''over''' the previous frame. When there is a HOM effect, there is nothing to cover up the previous frame, so anything that moves in front of the surface of the HOM will &quot;imprint&quot; on the HOM. If you use the ghost cheat, the HOM will appear black because the ghost cheat has the additional effect of drawing a black square behind all objects on the screen, for the purpose of preventing HOM effects when inside a wall.

==What does one look like?==

An example using Half-Life can be viewed with the link below:

* [http://collective.valve-erc.com/index.php?doc=1028187409-05594200 HOM Effect]

==How to fix the HOM Effect (when it is caused by a [[Legacy:BSP Hole|BSP Hole]])==

Sometimes this is fixed with a rebuild, sometimes not. One effective technique is to add another brush in such a way that it is flush with the surface.

The best way is to study zone/portal view to work out which surface might be responsible. Reordering brushes or changing the way an area is built may help.

==How to Cause the HOM Effect (deliberately)==

If for some reason, you WANT to introduce a hall of mirrors effect, you can do so by setting a surface's 'invisible' flag to true. This, of course, only causes a HOM effect on surfaces that &quot;border&quot; the world, like those that would normally be designated fake backdrop.

NOTE -&gt; HOM's Are VERY VERY Bad, and Ugly !

==Related Pages==
* [[Legacy:Troubleshooting|Troubleshooting]]
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:BSP Hole Background|BSP Hole Background]]

==Discussion==

'''Mosquito:''' Is there a page that lists common mapping errors?  Errors such as the HOM effect and BSP holes and possible textures not working, I don't know any others.  If there isn't I think we should make one.  A page like that can be very helpful for newbie mappers that have a similar problem and can't figure out what to do.  Pages like the BSP hole are very helpful for someone that doesn't know what to do.  I think we need to cover more problems in such detail as that.

'''T1:''' The first page linked to is dead, so I removed it. Also, is the &quot;[[:Category:Legacy To Do]] &amp;ndash; merge into [[Legacy:BSP Hole|BSP Hole]]&quot; truly needed? HOWEVER, It should definitely be merged with [[Legacy:HOM|HOM]].

'''GRAF1K:''' I'll bet there's a few little-know HOM fixes floating around. Here's a good place to post them.

'''MasterOfTheDark:''' I made a relatively simple (bad for very large levels, but hey, it worked) fix for the HOM effect:  I subracted a hollow box from around a room that caused the HOM effect and made a ''tiny'' hole between the two.  You can find my sample here (22 KB): http://motd.4d2.org/UT/fixHOM.ut2  A skybox might also fix the problem, though I haven't tried.

'''GRAF1K:''' The 1on1Pack has used your HOM fix, see DM-1on1-Tangora.

'''T1:''' Merged info from [[Legacy:HOM|HOM]] to here.

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; merge into [[Legacy:BSP Hole|BSP Hole]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3582</id>
      <timestamp>2005-12-29T17:00:32Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>Removed &quot;Merge With BSP Hole&quot;. The  2 things aren't the same at all. Sometimes a HOM is caused by a BSP hole, but they aren't the same.</comment>
      <text xml:space="preserve">==What is a Hall of Mirrors (HOM)?==

The Hall of Mirrors is the scourge of 3D level design. A HOM is a common mistake/error where there is a surface that seems to mirror objects in front of them (this is not entirely accurate, but this is how the HOM got its name), or create visual copies of them.

HOMs are not quite the same as a [[Legacy:BSP Hole|BSP Hole]], though a BSP hole is often the cause of a HOM.

==What causes a Hall of Mirrors effect?==

A hall of mirrors effect is usually created when a objects are drawn to the screen without erasing the previous frame. The most common reason for this occurring in the Unreal Engine is a BSP hole, a transparent/translucent texture on a wall that has nothing behind it, or too short distance fog on a map with no [[Legacy:SkyBox|SkyBox]].

==How does this create this effect?==

When a frame is drawn by the game engine, it is usually drawn '''over''' the previous frame. When there is a HOM effect, there is nothing to cover up the previous frame, so anything that moves in front of the surface of the HOM will &quot;imprint&quot; on the HOM. If you use the ghost cheat, the HOM will appear black because the ghost cheat has the additional effect of drawing a black square behind all objects on the screen, for the purpose of preventing HOM effects when inside a wall.

==What does one look like?==

An example using Half-Life can be viewed with the link below:

* [http://collective.valve-erc.com/index.php?doc=1028187409-05594200 HOM Effect]

==How to fix the HOM Effect (when it is caused by a [[Legacy:BSP Hole|BSP Hole]])==

Sometimes this is fixed with a rebuild, sometimes not. One effective technique is to add another brush in such a way that it is flush with the surface.

The best way is to study zone/portal view to work out which surface might be responsible. Reordering brushes or changing the way an area is built may help.

==How to Cause the HOM Effect (deliberately)==

If for some reason, you WANT to introduce a hall of mirrors effect, you can do so by setting a surface's 'invisible' flag to true. This, of course, only causes a HOM effect on surfaces that &quot;border&quot; the world, like those that would normally be designated fake backdrop.

NOTE -&gt; HOM's Are VERY VERY Bad, and Ugly !

==Related Pages==
* [[Legacy:Troubleshooting|Troubleshooting]]
* [[Legacy:BSP Hole|BSP Hole]]
* [[Legacy:BSP Hole Background|BSP Hole Background]]

==Discussion==

'''Mosquito:''' Is there a page that lists common mapping errors?  Errors such as the HOM effect and BSP holes and possible textures not working, I don't know any others.  If there isn't I think we should make one.  A page like that can be very helpful for newbie mappers that have a similar problem and can't figure out what to do.  Pages like the BSP hole are very helpful for someone that doesn't know what to do.  I think we need to cover more problems in such detail as that.

'''T1:''' The first page linked to is dead, so I removed it. Also, is the &quot;[[:Category:Legacy To Do]] &amp;ndash; merge into [[Legacy:BSP Hole|BSP Hole]]&quot; truly needed? HOWEVER, It should definitely be merged with [[Legacy:HOM|HOM]].

'''GRAF1K:''' I'll bet there's a few little-know HOM fixes floating around. Here's a good place to post them.

'''MasterOfTheDark:''' I made a relatively simple (bad for very large levels, but hey, it worked) fix for the HOM effect:  I subracted a hollow box from around a room that caused the HOM effect and made a ''tiny'' hole between the two.  You can find my sample here (22 KB): http://motd.4d2.org/UT/fixHOM.ut2  A skybox might also fix the problem, though I haven't tried.

'''GRAF1K:''' The 1on1Pack has used your HOM fix, see DM-1on1-Tangora.

'''T1:''' Merged info from [[Legacy:HOM|HOM]] to here.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HammerJump</title>
    <id>1393</id>
    <revision>
      <id>3528</id>
      <timestamp>2004-03-11T05:10:24Z</timestamp>
      <contributor>
        <ip>Ip68-99-17-45.om.om.cox.net</ip>
      </contributor>
      <comment>Removed an error stating that a Hammer Jump is necessary to get the Redeemer in DM-Barricade.</comment>
      <text xml:space="preserve">A '''Hammer Jump''' is a higher than normal jump using the [[Legacy:ImpactHammer|Impact Hammer]] weapon.  

The Impact Hammer adds a little extra upward force to the upward motion resulting in a higher jump. This jump will cause your player to take some damage.

Some maps have weapons and other objects on boxes or other obstacles which require a weapon assisted jump to get to (e.g. the damage amp in ''DM-Turbine'').  This makes the object harder to get because it takes more time to do a weapon assisted jump and also because damage is taken by the player doing the jump.

To do a Hammer jump:
# Use the Impact Hammer weapon.
# Point the weapon directly downward.
# Fully charge the impact hammer by holding the left mouse button down.
# Jump.
# Immediately release left mouse button to release the Impact Hammer's stored energy.

Note: In team games, this effect can also be produced by hammering a teamate who jumps up in front of you when team damage is off. The jump produced is higher than a normal self-induced hammer jump. The technique is called &quot;boosting&quot; and is most commonly used in Assault games, where it is used to propell players over walls and other obstacles, usually to the generally agreed upon detriment to game play, although some custom maps incorporate this type of movement and even require it.

'''ZxAnPhOrIaN:'''  I'm going to create a Hammer Jump obstacle course for newbies to train in!

See also:
* [[Legacy:RocketJump|RocketJump]] - same type of jump using the [[Legacy:UT_Eightball|Rocket Launcher]]

'''Tarquin:'''  Impact Jump Metrics from [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]

'''Ironblayde:''' Removed the reference to needing the boots or a Hammer Jump to get the Redeemer in DM-Barricade, since you can reach it easily with a regular jump from one of the towers. :) You can get even farther with a lift jump.</text>
    </revision>
    <revision>
      <id>3529</id>
      <timestamp>2002-07-16T15:55:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''Hammer Jump''' is a higher than normal jump using the [[Legacy:ImpactHammer|Impact Hammer]] weapon.  

The Impact Hammer adds a little extra upward force to the upward motion resulting in a higher jump. This jump will cause your player to take some damage.

Some maps have weapons and other objects on boxes or other obstacles which require a weapon assisted jump to get to (e.g. the damage amp in ''DM-Turbine'' and the redeemer in ''DM-Barricade'' if you don't have jump boots on).  This makes the object harder to get because it takes more time to do a weapon assisted jump and also because damage is taken by the player doing the jump.

To do a Hammer jump:
# Use the Impact Hammer weapon.
# Point the weapon directly downward.
# Fully charge the impact hammer by holding the left mouse button down.
# Jump.
# Immediately release left mouse button to release the Impact Hammer's stored energy.

Note: In team games, this effect can also be produced by hammering a teamate who jumps up in front of you when team damage is off. The jump produced is higher than a normal self-induced hammer jump. The technique is called &quot;boosting&quot; and is most commonly used in Assault games, where it is used to propell players over walls and other obstacles, usually to the generally agreed upon detriment to game play, although some custom maps incorporate this type of movement and even require it.

'''ZxAnPhOrIaN:'''  I'm going to create a Hammer Jump obstacle course for newbies to train in!

See also:
* [[Legacy:RocketJump|RocketJump]] - same type of jump using the [[Legacy:UT_Eightball|Rocket Launcher]]

'''Tarquin:'''  Impact Jump Metrics from [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Haral</title>
    <id>1418</id>
    <revision>
      <id>3588</id>
      <timestamp>2004-01-19T06:40:51Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi.  I am generally known as Haral on the internet.  I don't even remember why...

===Projects===

[http://mod.maqn.com/ Legend of the Serilim]: I have been unofficially helping out LotS for a while, and now I'm just doing a bit of extra gametype/weapon programming.

[http://plasmaworks.com/vt Vanguard Tactics]: Also doing weapon/gametype programming, but more in depth.

'''''Stellar Assault''''': No page (yet) for this one.  My current personal project.

And a bunch of my Wheel of Time mods can be found on [http://www.projectsphere.org Project Sphere].

===Misc bits===

[[Legacy:Haral/Work Ethic Rant|Work Ethic Rant]].

[[Legacy:Haral/Developer Journal|Haral/Developer Journal]]

[[Legacy:Game Balance|Game Balance]]

===Comments, Etc===

'''EntropicLqd:''' Hi, welcome to the wiki.  Enjoy your stay.

'''Haral:''' Thanks, this is a great site!

----
  [[:Category:Legacy Personal Page]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3589</id>
      <timestamp>2003-07-11T20:38:22Z</timestamp>
      <contributor>
        <ip>JoeDark</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Am I doing this right?  Whatever in the...

Um, hi?

...

.....

...

Right then.  I've been programming for a pretty long time now (uh, 8 years I think) and I have been doggedly avoiding making anything outside of games.  As a result I still love it.  Back in '00 I started my first experience in mod making with Redemption for the [http://www.wheeloftime.com Wheel of Time game] (great game for multiplayer, if not for ''modding'' multiplayer.  Very inexpensive, try it out.)  That was an interesting little experience.  The things I learned about assembling, managing, and working with a team are invaluable and have probably given me an ulcer.  The single player portion of the project eventually sunk into the water but to my credit that is partly because of the lack of personel and bad reception mods get within that community.  If you're interested, you can still catch some games of Hold the Citadel and Team Arena on servers from time to time.  I'd link to the mod website but I haven't been able to access my PlanetWoT account in over a year.  The news is so old.

I've made more mods for WoT since then (SWTG, WoTOps, CheatBlocker, Turrets) and done consulting and assistance for some other mods (like Shadowed Destiny and WoTSecure.)  Now I'm moving on... partially influenced by the MSUT.  I do love competition.  So a few unknown boys from WoTland are working on some mysterious TC called OC.  I figure there will be more information about that soon enough.  I do enjoy rambling on about whatever is on my mind, so this page will probably end up 10 miles long.

====July 3, 2003====

OC has been moving along, although it seems slower since I got back from my trip to Seattle last weekend.  I am hoping to take my long weekend and turn it into something a little more productive.  I am getting a new computer, as well, so let's hope everything works out ok there.

I'm still not sure what the release status will be on OC.  It largely depends upon how everything looks and feels 5 days from now.  It could certainly be ready for a release, but it's hard to say.  It partially depends upon what all Dally gets done in the area of modelling.  His top priority is the first player model we're concerned with.  I just recently pulled a concept sketch with proper perspective out of Josh.  [http://foo.bz/tank.html Right here].  We'll see how Dally's model comes out soon enough I suppose.

On another note, in my free time at work I've been making a web code archive sort of thing... helps keep track of bugs and changes in the revisions, in a pretty simple way.  You just create a new revision, and then add bugs/fixes/changes to it and it keeps track of it from there.  You can search on it etc.  If anyone is actually reading this, have any suggestions for where I could go from here?  I know there are such things available for free already, but I just sort of feel like making my own for myself.

On yet another note, go check out [http://mod.maqn.com/ LotS].  Also, visit it every so often, there will be things to see in the next soon little while shortly.

====June 30, 2003====

That last post is pretty funny... All like I know something.  Yeah.

I'd think about making a Dev Journal for myself for these posts, but it doesn't seem right as I won't be telling anyone very much about what I'm actually doing.  I'm secretive.  However, I will say that I've been doing a LOT of whatever that something is.  OC is counting at 72 classes right now.  If this is good or not, considering it has many more to come, will yet be seen.

Of course, the number of classes isn't really much of an indication of what's been created.  Still suffice to say I have created a whole lot.  In 10 days I have made most of the major things for the first deadline.  I still don't think I will be able to make it.  One person can only do so much, and my other two team members are pretty busy with LotS.

So I'm cutting back on what will be in the first revision of OC.  Still debating with myself if I should release it or not.  There's the whole contest thing and it would be nice to be considered.  A bunch of new weapons and a gametype aint too bad of a mod.  Still might give the wrong impression of things to come.

We'll see!

====June 25, 2003====

Oi!  So I have a lot of free time at work.  I'm either just idly browsing sites, brushing up on some language, or more likely, thinking about whatever terrible place I left off at in my scripting.  OC is a pretty big mod and I have been going at it with more time than is probably healthy.  Right now I'm battling with replication again... Having to do with replicating a function server-&gt;client in a Weapon.  But that's ok.  It makes sense that this is difficult, as it is the last part of the stage I am working on.  It's like meeting up with one of the sub-bosses of debugging, you know that part of the plot is about to come to a conclusion and transition to the next phase.

Work was split 2 ways (3 now that a new guy is on board) and I decided that my compandre should handle the weapons because he is less familiar with UScript.  Weapons are pretty straight-forward and simple, to me at least.  Sometimes I break down and do one anyway.  Like the new rocket launcher I made.  I mean sure, seeking rocket launchers are nothing new... but I've always despised the way they seek!  It's always some really stupid tracking method that I don't want because I can aim better.  I intentionally pull off locks in UT...

So I went and made it so that it's always looking for a target if it doesn't have one, first of all (best target by a ratio of distance away and rot distance from center of the screen.)  Then I went and made it so that once it has a target, it's continually calculating simple leading on it to decide where it's going to aim.  This makes it nearly unerring of course, so what I did then was cap the amount it can rotate, which makes sense.  So by adjusting the MaxRotPerSec var it changes in its ability to catch a dodging player.  I'm tweaking it to find that sweet spot where players can dodge out of the way, but if it has room it will turn around and keep taking passes until it hits.  If it doesn't have room, it will hit a wall and explode.

Let me just say, that it's these details that make a great game.  It's the feel of a weapon that makes a player love it, not the genius of its concept.  The same applies to every aspect of your game.  Every aspect of your game should boil down to one simple principle of enjoyment, and you should know what enjoyment that will be.  There's no need to make a science out of it (although you probably could.)  You need to ask yourself if it's fun, and if it is why is it fun, and with that in mind, if it mixes with the rest of your fun things.  A cohesive game is always better, and even though your totally rad dynamic grappling arm might be the best thing ever, it probably won't fit anywhere but in a spy game or something meant to be ecclectic.

Quick edit here... about the above paragraph.  I feel I should also point out that this isn't just a matter of genre.  It is a matter of appeal as well.  I hinted at that but didn't quite nail it down.  There's a completely different satisfaction you get from any major genre, and many components within that genre.  CTF, DM, Dom, Assault, they are all different experiences and have different types of enjoyment.  I tend to feel exhausted and stretched after a good game of DM.  In a good game of CTF, my adrenaline will soar (not just in the game) and my blood will start pounding in my veins.  It's these differences you must know and understand.  Game design isn't about concepts, ideas, or documents.  It is about creating a specific emotional experience in your players.  Try and make sure that emotion isn't frustration or boredom.

===Comments, Etc===

'''EntropicLqd:''' Hi, welcome to the wiki.  Enjoy your stay.

'''Haral:''' Thanks, this is a great site!

----
  [[:Category:Legacy Personal Page]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3590</id>
      <timestamp>2004-01-17T22:17:10Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>journal link</comment>
      <text xml:space="preserve">Hi.  I am generally known as Haral on the internet.  I don't even remember why...

===Projects===

[http://mod.maqn.com/ Legend of the Serilim]: I have been unofficially helping out LotS for a while, and now I'm just doing a bit of extra gametype/weapon programming.

[http://plasmaworks.com/vt Vanguard Tactics]: Also doing weapon/gametype programming, but more in depth.

'''''Stellar Assault''''': No page (yet) for this one.  My current personal project.

And a bunch of my Wheel of Time mods can be found on [http://www.projectsphere.org Project Sphere].

===Misc bits===

[[Legacy:Haral/Work Ethic Rant|Work Ethic Rant]].

[[Legacy:Haral/Developer Journal|Haral/Developer Journal]]

===Comments, Etc===

'''EntropicLqd:''' Hi, welcome to the wiki.  Enjoy your stay.

'''Haral:''' Thanks, this is a great site!

----
  [[:Category:Legacy Personal Page]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Haral/Developer Journal</title>
    <id>1420</id>
    <revision>
      <id>3593</id>
      <timestamp>2004-02-18T04:35:02Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| Jan 17th, 2004}}

I've been working on 'Stellar Assault' (my favorite name so far) quite a bit lately.  I've also noticed a number of people around these parts have been/are working on space mods of some sort.  Lucky for me everything I do is off-track so this isn't really a problem other than that a bunch of people are doing mods of a similar theme and that usually results in lesser success for all.

So I'm at one of the least fun parts of development, at least for me.  The foundation is in.  You can board ships (translation still needs a little tweaking), fly them around, shoot the turrets inside.  They have stabilizers to keep roll centered so you don't get too disoriented.  There are all kinds of armor mods in, a bunch of turrets.  The problem?  Everything works, just not well.  It's a clunkly concept demo that looks terrible.  Even besides my very novice modeling skills, it's replication that's really getting to me.

I know UT2k4 is said to make improvements to the vehicle code, but I want to get things working now and oh man is it bad.  The movement is jerky, the rotation is even more jerky.  The turrets are equally bad.  I don't know what I can do to smooth it out... I fear wading through the player movement code and seeing if I can take advantage of its nativity but even more I don't know if I can use it for this.

Another really confusing bit of awkwardness is the collision for my custom ships.  Parts of them well, don't collide.  I just used the simple DOP options.  I use show collision in the game and it seems to be fit snug around the ship.  But about half of it doesn't collide at times.  It's got me confused.

{{classbox| Jan 20th, 2004}}

Work work work..  I've done quite a fair amount of graphical stuff lately.  New emitters for turrets, ship explosions, and shield impacts.  Finally set up a basic HUD that displays ship health/shields/energy in bars.  Threw in a targeting system that cycles through valid targets in range and highlights them with a circular bar representing their shield strength.  Trying out different backdrop systems.  It's starting to make a dent in this and is appearing more and more like a real mod.

So to follow that up I've been working on getting all of the tools to make a nice looking level so that I can put one together.  I once again wish for multiple inheritance within unrealscript (PLEASE OH PLEASE) as I recreated a large portion of everything within my ship class and added it into a &quot;Station&quot; class.  Stations are simply any boardable static mesh that does not move.  Like a space station.  Could also be a planet.  These are not controlled by karma and are not pawns, so they take up fewer resources, which is why I went through the pain of putting in so many exceptions all over the place to account for both of them.  Stations can actually move, they just cannot be controlled in any direct way.  A level editor could add in a path of revolution or something and it'd work out dandy.

With this in place the entirety of the space portion *can* (doesn't have to be) represented by static meshes of varying scale.  I am contemplating putting a handle on this within the level editor, so maps can have their own unique scale.  This way maps can be made larger if necessary, or scaled to look right if the mapper wants the player out in space.  There are other ways of doing that however, so I might just leave everything tiny.  Hmm... more later, if I feel like it.

{{classbox| Feb 2, 2 something and four}}

Still breathing.  Still working.  Cognizance questionable.

Mod almost pretty.

{{classbox| Feb 17, 2004}}

Ok well ignoring all the development I've done (as it's really not that interesting, just systematically tweaking weapons really) I'll go into a topic that kind of irks me:  UT2004.

I came to ut2k3 more for the purpose of modding than actually playing.  I played the demo and had some fun with it, but I wasn't really all that impressed or put off when I got the full game (a standard for me and recent games, sadly.)  I've been having a great time playing the 2k4 demo, however, so they've certainly done a number of things right this time.  I've taken a look at the script, however, and I am getting really annoyed.

The code for vehicles is so blatantly specific to what they've done it's kind of sick.  Did they even stop to think about mods for a second?  I mean, it's obvious enough seeing that every specific kind of vehicle is prefixed with ONS, but the script is cluttered with all kinds of things I don't want.  I haven't yet found anything that will prevent me from using it, but it will be ugly and I can't play with it to see what happens.

Whenever I think someone else is going to work off of my code, I make a point and taking the most essential parts to my base classes and separating them from anything specific to what I'm doing.  Isn't that really what object oriented programming is ABOUT?  Honestly, though, they could seriously placate a lot of my concerns just by having ANYTHING related to physics (that is, any changes related to location (including velocity, accl) and rotation) that is done natively available from the actor level.

I am still mystified as to why they made the great move of having a controller class and then made it nearly worthless by restricting controllers to the bulky pawn class.  Why not simply have a controller's pawn be a very basic child of actor which has added only full native support for player input replication?  Epic has in their own code 2 obvious exceptions to their controller/pawn relationship: the Redeemer and vehicle turrets.  Considering they seem to want people to make mods for UT* they should imagine that if they have 2, many more will emerge in user script.

I guess I'm mostly just annoyed at how long it's going to take me to adjust things to make use of 2k4's vehicle code.

----

'''''A &quot;brief&quot; description of Stellar Assault'''''

Stellar Assault is a team space combat mod.  The teams have bases, and in those bases there can be terminals of various sorts.  Some of these terminals are used for outfitting and deploying ships.  For instance, you walk up to the terminal, see a pretty ship, equip a couple of firebrand guns and a burrfire turret, give it some armor modifications, and then deploy it.  It then appears near the base.  Before I go on...

SA takes a piece from one of my earlier mods and relies on 'batteries.'  A battery is a very simple concept, and a flexible class in the script.  It is simply an actor that has energy (and a max energy) and a rate of recharge.  Most everything in the mod works off of a battery (and they usually share batteries.)  This includes 'Inventory Terminals' which can issue weapons, turrets, and possibly player respawning as well.  

Ok, so now the entire reason I'm making this mod.  The primary concept behind this is that you can move around in these ships.  The ships can fly around in space, and you can run around in them.  The primary reason to allow this is for the possibility of boarding and combat on a ship.  I later realised this opens an entire new world, which I'll go into in a moment.  So I needed a way of boarding ships that could be done in hostile encounters and in basic setups.  What I came up with, is the 'boarding turret.'

Ok, now it might seem kind of silly, but the boarding turret shoots a projectile which is effectively the player.  It will place the player in the first 'habitable' area in comes across, and if it doesn't find anything within its range, the player turns into a glob of exploded bits in space.  It's pretty easy to hit a ship sitting still or moving slowly&amp;ndash;the projectile moves quickly.  It's difficult to hit a ship that's maneuvering, so boarding isn't exactly easy.  What I'm hoping (and it looks like it's worked) is that this will create a fast-paced way of merging standard first person and space combat.

In order to use a boarding turret, your shields must be down.  Shields play a pretty big part, they are beneficial and detrimental.  Besides protecting your ship from damage, shields provide a signature for certain projectiles to lock onto, will cause some more deadly projectiles to simply disintegrate, and make you easier to track.  There's good and bad there, the trick is knowing when you want them up and when you don't.  Taking them down is instant, bringing them back up takes a few seconds.

Now, for those who might be curious how exactly it works having a ship flying around that you can move in, it's actually pretty simple.  The place the player moves around in doesn't move, it's just your ordinary subtracted space sitting in the level.  However, in the center of it there's a marker with the ship's name on it.  When the ship gets hit by a boarding projectile, it uses the marker's location to translate that hit into relative coordinates and finds the location to translate to.  So there's your ordinary karma space ship flying around, controlled by whoever is currently at the helm inside the ship.

Now, what this means is actually pretty rad.  This allows for big mobile carrier ships which can deploy other ships.  A possible gametype I've thought of is simple 'carrier wars' wherein both teams start with big, beefy carrier ships and just have to destroy the other team's carrier.

There are some nitpicky design issues left to be wrestled with, but all in all it's set up.

===All the cool kids are saying...===

'''Foxpaw:''' Hmm. That's nifty. It sounds kind of like my mod, only different in some ways. The walking around inside ship is implemented differently on mine, and the customization of ships also sounds different. Also, I like the notion of shields having some negative effects as well as positive.

I would recommend adding the 'carrier wars' gametype you described. The first gametype I made (and so far the only one) was &quot;Carrier Assault&quot; which is very similar in concept.

Anyways, is there anywhere this mod is availible for download, or even just screenshots? I'd be interested to see how the interfaces and gameplay and such are in comparison to mine.

'''Haral:''' Hrm... This is about the only thing worth showing:

@block@Haral-SA-01 Ship Deployment GUI.  The skin of the ship in the preview can change with your selections.  Black Heat Generator will turn the entire thing black.  Also, 'Frenzied Peacock' is the name of that instance of the ship.  Fighter is the model (called Ridgeback now.)  The name is set in the level.

An actual download is really dependant upon getting controls in netplay smoothed out and getting some half-decent skins and levels.  All of the gameplay is there but there's not much to display until I get it polished.

I don't know much about the specifics of your mod... I took a look and noticed your mod is so pretty it makes me jealous.  If you want we can chat and compare notes, though.

'''Foxpaw:''' Netcode, you say. Does it have bot support? I haven't done anything network-related really on mine yet - though I might get to that point soon. So far I've been focusing on botplay mostly. (intelligently avoiding impacts with other ships was trickier than I expected, but my solution is explained on my developer journal if you run into the same issue)

I haven't really tried netplay yet, though I've heard Karma actors are tricky to replicate properly. I had an idea but haven't tried it yet - I was thinking, the ships could be simulated Karmically on the server, and the clients would have a &quot;proxy.&quot; The ships would not actually be replicated, but instead feed info into a &quot;replicationinfo&quot; type of thing. The client would then take that information and use it to display a ship with the same static mesh and such, but it could interpolate and extrapolate movement instead of using Karma on the client side. I'm not sure if this would work or not, but it might. I made a &quot;stand-in&quot; system because things farther than about 60,000 UUs don't get rendered, and lots of stuff was that far away or farther in my mod. The &quot;stand-in&quot; uses something similar to what I just described, except of course it's in a zero-lag environment. Basically, the server keeps a &quot;real&quot; version and a mock-up that imitates the real version, and the mock-up is the one that gets replicated.

Anyways, don't know if that would be helpful to you or not, but it's just an idea. If you try it, let me know how it turns out.

'''Haral:''' Well, if the simulation could be good enough, that could be a brilliant way to take load off of a client.  I'm sure you know that karma is expensive.  However, part of the issue is that karma and normal physics are just so different that the simulation would be weak at points no matter how good you 'fake it' with your client version.  When you bump into another ship, for instance, normal physics dictates you stop, karma physics dictates you bounce and roll like crazy.

I do not have any plans for bot support.  It's &quot;possible&quot; but I feel it's a choice between a great multiplayer game and an okay SP/MP game.  Making bots that shoot, dodge, and move realistically is hard enough, especially in a ship.  Making them decide between flying a ship, shooting weapon turrets, boarding an enemy ship, outfitting ships... It's possible.  In fact, part of being me means that just considering it I have a bunch of possible code for it in my brain now.  But not right now.

The whole distance thing is an issue no matter what (I discovered it the first time I tried to make a level) but I have power in deciding the scale of the game.  The 'insides' of things and space can be made segregated, since effectively I'm just dealing with little model ships and stations anyway, so I can make them whatever size I like.  At the same time, I want this to take place in open space and not restrict level size more than it is already, so I figure I will need to use fog.  Also, I need to look into placing warpzones or something at the edges so that space never actually &quot;ends.&quot;  I wonder if this would kill the engine.

'''Foxpaw:''' Using fog is a good idea - I tried that and it looked very good for small craft. The problem I had with it was that large craft were easily visible from far past 60,000 UUs, so covering it up with fog made them not fade into view until much later than expected. One side-effect of using fog also, is that your ships will fade to black or what-have you, even if the background is some other color. When I was first making a level I was using the sky ripped from DM-PhobosII and it looked like crap when something faded in from black, silhouetted against the red planet.

Having said that though, those two things not being an issue, the fog makes a very nice effect. As far as space ending, I wouldn't really worry about it, since you have a lot of room to use for a level - especially if you scale the ships down. Warpzones don't work like they did in UT, unfortunately, and apparently the framerate plummets if there is a skybox and a warpzone visible at the same time (maybe not relevant since the warpzones don't display anymore anyway ;) )

You are right that the simulation would not be too accurate during a collision using the mock-up system I suggested. However, the Karma system will simulate differently on different machines - so a ship may slide or roll or whatever in a totally different direction on the client than it does on the server - either way Karma can't really be kept 100% consistent between the server and client.

My idea with the mockup was actually not to simulate any physics at all - it'd just be a staticmesh with no bBlockActors, etc. When it collided with another ship on the server, the mock-ups motion would be adjusted when it's next updated. Because the mock-ups wouldn't be colliding, they wouldn't really affect anything in the simulation. The ships might overlap briefly while waiting for the update from the server, but this would only really be noticeable at very short ranges, IE if another ship hit the player's ship. (It's an update of only a few bytes, after all, so even at relatively high pings it shouldn't be noticeable.. I would think.)

One thing that you would need to do though is, the client's ship would need to be Karma simulated. This is similar to what the player movement code does: Basically, the player uses an &quot;autonomous proxy.&quot; Basically, this means that actors using an autonomous proxy act as if they were the authority (server) version. They behave in every way as if they were operating in botplay, except when the server and client disagree, in which case the server takes precedence. The player stores it's movements and sends them separately - basically the server &quot;takes the client's word for it&quot; on matters involving movement - unless the server decides that the server version and client version are too far apart, and a correction must take place. This is important for the client controlled actors, because if your ping is, say 200, that's still a fifth of a second from when you press a button to when it responds. On other players ships and such, you don't need that kind of system locally because you don't know when they pressed the button and thus wouldn't notice any delay.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3594</id>
      <timestamp>2004-02-03T04:28:30Z</timestamp>
      <contributor>
        <ip>12.180.0.xxx</ip>
      </contributor>
      <comment>my mind!</comment>
      <text xml:space="preserve">{{classbox| Jan 17th, 2004}}

I've been working on 'Stellar Assault' (my favorite name so far) quite a bit lately.  I've also noticed a number of people around these parts have been/are working on space mods of some sort.  Lucky for me everything I do is off-track so this isn't really a problem other than that a bunch of people are doing mods of a similar theme and that usually results in lesser success for all.

So I'm at one of the least fun parts of development, at least for me.  The foundation is in.  You can board ships (translation still needs a little tweaking), fly them around, shoot the turrets inside.  They have stabilizers to keep roll centered so you don't get too disoriented.  There are all kinds of armor mods in, a bunch of turrets.  The problem?  Everything works, just not well.  It's a clunkly concept demo that looks terrible.  Even besides my very novice modeling skills, it's replication that's really getting to me.

I know UT2k4 is said to make improvements to the vehicle code, but I want to get things working now and oh man is it bad.  The movement is jerky, the rotation is even more jerky.  The turrets are equally bad.  I don't know what I can do to smooth it out... I fear wading through the player movement code and seeing if I can take advantage of its nativity but even more I don't know if I can use it for this.

Another really confusing bit of awkwardness is the collision for my custom ships.  Parts of them well, don't collide.  I just used the simple DOP options.  I use show collision in the game and it seems to be fit snug around the ship.  But about half of it doesn't collide at times.  It's got me confused.

{{classbox| Jan 20th, 2004}}

Work work work..  I've done quite a fair amount of graphical stuff lately.  New emitters for turrets, ship explosions, and shield impacts.  Finally set up a basic HUD that displays ship health/shields/energy in bars.  Threw in a targeting system that cycles through valid targets in range and highlights them with a circular bar representing their shield strength.  Trying out different backdrop systems.  It's starting to make a dent in this and is appearing more and more like a real mod.

So to follow that up I've been working on getting all of the tools to make a nice looking level so that I can put one together.  I once again wish for multiple inheritance within unrealscript (PLEASE OH PLEASE) as I recreated a large portion of everything within my ship class and added it into a &quot;Station&quot; class.  Stations are simply any boardable static mesh that does not move.  Like a space station.  Could also be a planet.  These are not controlled by karma and are not pawns, so they take up fewer resources, which is why I went through the pain of putting in so many exceptions all over the place to account for both of them.  Stations can actually move, they just cannot be controlled in any direct way.  A level editor could add in a path of revolution or something and it'd work out dandy.

With this in place the entirety of the space portion *can* (doesn't have to be) represented by static meshes of varying scale.  I am contemplating putting a handle on this within the level editor, so maps can have their own unique scale.  This way maps can be made larger if necessary, or scaled to look right if the mapper wants the player out in space.  There are other ways of doing that however, so I might just leave everything tiny.  Hmm... more later, if I feel like it.

{{classbox| Feb 2, 2 something and four}}

Still breathing.  Still working.  Cognizance questionable.

Mod almost pretty.

----

'''''A &quot;brief&quot; description of Stellar Assault'''''

Stellar Assault is a team space combat mod.  The teams have bases, and in those bases there can be terminals of various sorts.  Some of these terminals are used for outfitting and deploying ships.  For instance, you walk up to the terminal, see a pretty ship, equip a couple of firebrand guns and a burrfire turret, give it some armor modifications, and then deploy it.  It then appears near the base.  Before I go on...

SA takes a piece from one of my earlier mods and relies on 'batteries.'  A battery is a very simple concept, and a flexible class in the script.  It is simply an actor that has energy (and a max energy) and a rate of recharge.  Most everything in the mod works off of a battery (and they usually share batteries.)  This includes 'Inventory Terminals' which can issue weapons, turrets, and possibly player respawning as well.  

Ok, so now the entire reason I'm making this mod.  The primary concept behind this is that you can move around in these ships.  The ships can fly around in space, and you can run around in them.  The primary reason to allow this is for the possibility of boarding and combat on a ship.  I later realised this opens an entire new world, which I'll go into in a moment.  So I needed a way of boarding ships that could be done in hostile encounters and in basic setups.  What I came up with, is the 'boarding turret.'

Ok, now it might seem kind of silly, but the boarding turret shoots a projectile which is effectively the player.  It will place the player in the first 'habitable' area in comes across, and if it doesn't find anything within its range, the player turns into a glob of exploded bits in space.  It's pretty easy to hit a ship sitting still or moving slowly&amp;ndash;the projectile moves quickly.  It's difficult to hit a ship that's maneuvering, so boarding isn't exactly easy.  What I'm hoping (and it looks like it's worked) is that this will create a fast-paced way of merging standard first person and space combat.

In order to use a boarding turret, your shields must be down.  Shields play a pretty big part, they are beneficial and detrimental.  Besides protecting your ship from damage, shields provide a signature for certain projectiles to lock onto, will cause some more deadly projectiles to simply disintegrate, and make you easier to track.  There's good and bad there, the trick is knowing when you want them up and when you don't.  Taking them down is instant, bringing them back up takes a few seconds.

Now, for those who might be curious how exactly it works having a ship flying around that you can move in, it's actually pretty simple.  The place the player moves around in doesn't move, it's just your ordinary subtracted space sitting in the level.  However, in the center of it there's a marker with the ship's name on it.  When the ship gets hit by a boarding projectile, it uses the marker's location to translate that hit into relative coordinates and finds the location to translate to.  So there's your ordinary karma space ship flying around, controlled by whoever is currently at the helm inside the ship.

Now, what this means is actually pretty rad.  This allows for big mobile carrier ships which can deploy other ships.  A possible gametype I've thought of is simple 'carrier wars' wherein both teams start with big, beefy carrier ships and just have to destroy the other team's carrier.

There are some nitpicky design issues left to be wrestled with, but all in all it's set up.

===All the cool kids are saying...===

'''Foxpaw:''' Hmm. That's nifty. It sounds kind of like my mod, only different in some ways. The walking around inside ship is implemented differently on mine, and the customization of ships also sounds different. Also, I like the notion of shields having some negative effects as well as positive.

I would recommend adding the 'carrier wars' gametype you described. The first gametype I made (and so far the only one) was &quot;Carrier Assault&quot; which is very similar in concept.

Anyways, is there anywhere this mod is availible for download, or even just screenshots? I'd be interested to see how the interfaces and gameplay and such are in comparison to mine.

'''Haral:''' Hrm... This is about the only thing worth showing:

@block@Haral-SA-01 Ship Deployment GUI.  The skin of the ship in the preview can change with your selections.  Black Heat Generator will turn the entire thing black.  Also, 'Frenzied Peacock' is the name of that instance of the ship.  Fighter is the model (called Ridgeback now.)  The name is set in the level.

An actual download is really dependant upon getting controls in netplay smoothed out and getting some half-decent skins and levels.  All of the gameplay is there but there's not much to display until I get it polished.

I don't know much about the specifics of your mod... I took a look and noticed your mod is so pretty it makes me jealous.  If you want we can chat and compare notes, though.

'''Foxpaw:''' Netcode, you say. Does it have bot support? I haven't done anything network-related really on mine yet - though I might get to that point soon. So far I've been focusing on botplay mostly. (intelligently avoiding impacts with other ships was trickier than I expected, but my solution is explained on my developer journal if you run into the same issue)

I haven't really tried netplay yet, though I've heard Karma actors are tricky to replicate properly. I had an idea but haven't tried it yet - I was thinking, the ships could be simulated Karmically on the server, and the clients would have a &quot;proxy.&quot; The ships would not actually be replicated, but instead feed info into a &quot;replicationinfo&quot; type of thing. The client would then take that information and use it to display a ship with the same static mesh and such, but it could interpolate and extrapolate movement instead of using Karma on the client side. I'm not sure if this would work or not, but it might. I made a &quot;stand-in&quot; system because things farther than about 60,000 UUs don't get rendered, and lots of stuff was that far away or farther in my mod. The &quot;stand-in&quot; uses something similar to what I just described, except of course it's in a zero-lag environment. Basically, the server keeps a &quot;real&quot; version and a mock-up that imitates the real version, and the mock-up is the one that gets replicated.

Anyways, don't know if that would be helpful to you or not, but it's just an idea. If you try it, let me know how it turns out.

'''Haral:''' Well, if the simulation could be good enough, that could be a brilliant way to take load off of a client.  I'm sure you know that karma is expensive.  However, part of the issue is that karma and normal physics are just so different that the simulation would be weak at points no matter how good you 'fake it' with your client version.  When you bump into another ship, for instance, normal physics dictates you stop, karma physics dictates you bounce and roll like crazy.

I do not have any plans for bot support.  It's &quot;possible&quot; but I feel it's a choice between a great multiplayer game and an okay SP/MP game.  Making bots that shoot, dodge, and move realistically is hard enough, especially in a ship.  Making them decide between flying a ship, shooting weapon turrets, boarding an enemy ship, outfitting ships... It's possible.  In fact, part of being me means that just considering it I have a bunch of possible code for it in my brain now.  But not right now.

The whole distance thing is an issue no matter what (I discovered it the first time I tried to make a level) but I have power in deciding the scale of the game.  The 'insides' of things and space can be made segregated, since effectively I'm just dealing with little model ships and stations anyway, so I can make them whatever size I like.  At the same time, I want this to take place in open space and not restrict level size more than it is already, so I figure I will need to use fog.  Also, I need to look into placing warpzones or something at the edges so that space never actually &quot;ends.&quot;  I wonder if this would kill the engine.

'''Foxpaw:''' Using fog is a good idea - I tried that and it looked very good for small craft. The problem I had with it was that large craft were easily visible from far past 60,000 UUs, so covering it up with fog made them not fade into view until much later than expected. One side-effect of using fog also, is that your ships will fade to black or what-have you, even if the background is some other color. When I was first making a level I was using the sky ripped from DM-PhobosII and it looked like crap when something faded in from black, silhouetted against the red planet.

Having said that though, those two things not being an issue, the fog makes a very nice effect. As far as space ending, I wouldn't really worry about it, since you have a lot of room to use for a level - especially if you scale the ships down. Warpzones don't work like they did in UT, unfortunately, and apparently the framerate plummets if there is a skybox and a warpzone visible at the same time (maybe not relevant since the warpzones don't display anymore anyway ;) )

You are right that the simulation would not be too accurate during a collision using the mock-up system I suggested. However, the Karma system will simulate differently on different machines - so a ship may slide or roll or whatever in a totally different direction on the client than it does on the server - either way Karma can't really be kept 100% consistent between the server and client.

My idea with the mockup was actually not to simulate any physics at all - it'd just be a staticmesh with no bBlockActors, etc. When it collided with another ship on the server, the mock-ups motion would be adjusted when it's next updated. Because the mock-ups wouldn't be colliding, they wouldn't really affect anything in the simulation. The ships might overlap briefly while waiting for the update from the server, but this would only really be noticeable at very short ranges, IE if another ship hit the player's ship. (It's an update of only a few bytes, after all, so even at relatively high pings it shouldn't be noticeable.. I would think.)

One thing that you would need to do though is, the client's ship would need to be Karma simulated. This is similar to what the player movement code does: Basically, the player uses an &quot;autonomous proxy.&quot; Basically, this means that actors using an autonomous proxy act as if they were the authority (server) version. They behave in every way as if they were operating in botplay, except when the server and client disagree, in which case the server takes precedence. The player stores it's movements and sends them separately - basically the server &quot;takes the client's word for it&quot; on matters involving movement - unless the server decides that the server version and client version are too far apart, and a correction must take place. This is important for the client controlled actors, because if your ping is, say 200, that's still a fifth of a second from when you press a button to when it responds. On other players ships and such, you don't need that kind of system locally because you don't know when they pressed the button and thus wouldn't notice any delay.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3595</id>
      <timestamp>2004-02-18T04:33:42Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| Jan 17th, 2004}}

I've been working on 'Stellar Assault' (my favorite name so far) quite a bit lately.  I've also noticed a number of people around these parts have been/are working on space mods of some sort.  Lucky for me everything I do is off-track so this isn't really a problem other than that a bunch of people are doing mods of a similar theme and that usually results in lesser success for all.

So I'm at one of the least fun parts of development, at least for me.  The foundation is in.  You can board ships (translation still needs a little tweaking), fly them around, shoot the turrets inside.  They have stabilizers to keep roll centered so you don't get too disoriented.  There are all kinds of armor mods in, a bunch of turrets.  The problem?  Everything works, just not well.  It's a clunkly concept demo that looks terrible.  Even besides my very novice modeling skills, it's replication that's really getting to me.

I know UT2k4 is said to make improvements to the vehicle code, but I want to get things working now and oh man is it bad.  The movement is jerky, the rotation is even more jerky.  The turrets are equally bad.  I don't know what I can do to smooth it out... I fear wading through the player movement code and seeing if I can take advantage of its nativity but even more I don't know if I can use it for this.

Another really confusing bit of awkwardness is the collision for my custom ships.  Parts of them well, don't collide.  I just used the simple DOP options.  I use show collision in the game and it seems to be fit snug around the ship.  But about half of it doesn't collide at times.  It's got me confused.

{{classbox| Jan 20th, 2004}}

Work work work..  I've done quite a fair amount of graphical stuff lately.  New emitters for turrets, ship explosions, and shield impacts.  Finally set up a basic HUD that displays ship health/shields/energy in bars.  Threw in a targeting system that cycles through valid targets in range and highlights them with a circular bar representing their shield strength.  Trying out different backdrop systems.  It's starting to make a dent in this and is appearing more and more like a real mod.

So to follow that up I've been working on getting all of the tools to make a nice looking level so that I can put one together.  I once again wish for multiple inheritance within unrealscript (PLEASE OH PLEASE) as I recreated a large portion of everything within my ship class and added it into a &quot;Station&quot; class.  Stations are simply any boardable static mesh that does not move.  Like a space station.  Could also be a planet.  These are not controlled by karma and are not pawns, so they take up fewer resources, which is why I went through the pain of putting in so many exceptions all over the place to account for both of them.  Stations can actually move, they just cannot be controlled in any direct way.  A level editor could add in a path of revolution or something and it'd work out dandy.

With this in place the entirety of the space portion *can* (doesn't have to be) represented by static meshes of varying scale.  I am contemplating putting a handle on this within the level editor, so maps can have their own unique scale.  This way maps can be made larger if necessary, or scaled to look right if the mapper wants the player out in space.  There are other ways of doing that however, so I might just leave everything tiny.  Hmm... more later, if I feel like it.

{{classbox| Feb 2, 2 something and four}}

Still breathing.  Still working.  Cognizance questionable.

Mod almost pretty.

{{classbox| Feb 17, 2004}}

Ok well ignoring all the development I've done (as it's really not that interesting, just systematically tweaking weapons really) I'll go into a topic that kind of irks me:  UT2004.

I came to ut2k3 more for the purpose of modding than actually playing.  I played the demo and had some fun with it, but I wasn't really all that impressed or put off (a standard for me and recent games, sadly.)  I've been greatly playing the demo, however, so they've certainly done a number of things right.  I've taken a look at the script, however, and I am getting really annoyed.

The code for vehicles is so blatantly specific to what they've done it's kind of sick.  Did they even stop to think about mods for a second?  I mean, it's obvious enough seeing that every specific kind of vehicle is prefixed with ONS, but the script is cluttered with all kinds of things I don't want.  I haven't yet found anything that will prevent me from using it, but it will be ugly and I can't play with it to see what happens.

Whenever I think someone else is going to work off of my code, I make a point and taking the most essential parts to my base classes and separating them from anything specific to what I'm doing.  Isn't that really what object oriented programming is ABOUT?  Honestly, though, they could seriously placate a lot of my concerns just by having ANYTHING related to physics (that is, any changes related to location (including velocity, accl) and rotation) that is done natively available from the actor level.

I am still mystified as to why they made the great move of having a controller class and then made it nearly worthless by restricting controllers to the bulky pawn class.  Why not simply have a controller's pawn be a very basic child of actor which has added only full native support for player input replication?  Epic has in their own code 2 obvious exceptions to their controller/pawn relationship: the Redeemer and vehicle turrets.  Considering they seem to want people to make mods for UT* they should imagine that if they have 2, many more will emerge in user script.

I guess I'm mostly just annoyed at how long it's going to take me to adjust things to make use of 2k4's vehicle code.

----

'''''A &quot;brief&quot; description of Stellar Assault'''''

Stellar Assault is a team space combat mod.  The teams have bases, and in those bases there can be terminals of various sorts.  Some of these terminals are used for outfitting and deploying ships.  For instance, you walk up to the terminal, see a pretty ship, equip a couple of firebrand guns and a burrfire turret, give it some armor modifications, and then deploy it.  It then appears near the base.  Before I go on...

SA takes a piece from one of my earlier mods and relies on 'batteries.'  A battery is a very simple concept, and a flexible class in the script.  It is simply an actor that has energy (and a max energy) and a rate of recharge.  Most everything in the mod works off of a battery (and they usually share batteries.)  This includes 'Inventory Terminals' which can issue weapons, turrets, and possibly player respawning as well.  

Ok, so now the entire reason I'm making this mod.  The primary concept behind this is that you can move around in these ships.  The ships can fly around in space, and you can run around in them.  The primary reason to allow this is for the possibility of boarding and combat on a ship.  I later realised this opens an entire new world, which I'll go into in a moment.  So I needed a way of boarding ships that could be done in hostile encounters and in basic setups.  What I came up with, is the 'boarding turret.'

Ok, now it might seem kind of silly, but the boarding turret shoots a projectile which is effectively the player.  It will place the player in the first 'habitable' area in comes across, and if it doesn't find anything within its range, the player turns into a glob of exploded bits in space.  It's pretty easy to hit a ship sitting still or moving slowly&amp;ndash;the projectile moves quickly.  It's difficult to hit a ship that's maneuvering, so boarding isn't exactly easy.  What I'm hoping (and it looks like it's worked) is that this will create a fast-paced way of merging standard first person and space combat.

In order to use a boarding turret, your shields must be down.  Shields play a pretty big part, they are beneficial and detrimental.  Besides protecting your ship from damage, shields provide a signature for certain projectiles to lock onto, will cause some more deadly projectiles to simply disintegrate, and make you easier to track.  There's good and bad there, the trick is knowing when you want them up and when you don't.  Taking them down is instant, bringing them back up takes a few seconds.

Now, for those who might be curious how exactly it works having a ship flying around that you can move in, it's actually pretty simple.  The place the player moves around in doesn't move, it's just your ordinary subtracted space sitting in the level.  However, in the center of it there's a marker with the ship's name on it.  When the ship gets hit by a boarding projectile, it uses the marker's location to translate that hit into relative coordinates and finds the location to translate to.  So there's your ordinary karma space ship flying around, controlled by whoever is currently at the helm inside the ship.

Now, what this means is actually pretty rad.  This allows for big mobile carrier ships which can deploy other ships.  A possible gametype I've thought of is simple 'carrier wars' wherein both teams start with big, beefy carrier ships and just have to destroy the other team's carrier.

There are some nitpicky design issues left to be wrestled with, but all in all it's set up.

===All the cool kids are saying...===

'''Foxpaw:''' Hmm. That's nifty. It sounds kind of like my mod, only different in some ways. The walking around inside ship is implemented differently on mine, and the customization of ships also sounds different. Also, I like the notion of shields having some negative effects as well as positive.

I would recommend adding the 'carrier wars' gametype you described. The first gametype I made (and so far the only one) was &quot;Carrier Assault&quot; which is very similar in concept.

Anyways, is there anywhere this mod is availible for download, or even just screenshots? I'd be interested to see how the interfaces and gameplay and such are in comparison to mine.

'''Haral:''' Hrm... This is about the only thing worth showing:

@block@Haral-SA-01 Ship Deployment GUI.  The skin of the ship in the preview can change with your selections.  Black Heat Generator will turn the entire thing black.  Also, 'Frenzied Peacock' is the name of that instance of the ship.  Fighter is the model (called Ridgeback now.)  The name is set in the level.

An actual download is really dependant upon getting controls in netplay smoothed out and getting some half-decent skins and levels.  All of the gameplay is there but there's not much to display until I get it polished.

I don't know much about the specifics of your mod... I took a look and noticed your mod is so pretty it makes me jealous.  If you want we can chat and compare notes, though.

'''Foxpaw:''' Netcode, you say. Does it have bot support? I haven't done anything network-related really on mine yet - though I might get to that point soon. So far I've been focusing on botplay mostly. (intelligently avoiding impacts with other ships was trickier than I expected, but my solution is explained on my developer journal if you run into the same issue)

I haven't really tried netplay yet, though I've heard Karma actors are tricky to replicate properly. I had an idea but haven't tried it yet - I was thinking, the ships could be simulated Karmically on the server, and the clients would have a &quot;proxy.&quot; The ships would not actually be replicated, but instead feed info into a &quot;replicationinfo&quot; type of thing. The client would then take that information and use it to display a ship with the same static mesh and such, but it could interpolate and extrapolate movement instead of using Karma on the client side. I'm not sure if this would work or not, but it might. I made a &quot;stand-in&quot; system because things farther than about 60,000 UUs don't get rendered, and lots of stuff was that far away or farther in my mod. The &quot;stand-in&quot; uses something similar to what I just described, except of course it's in a zero-lag environment. Basically, the server keeps a &quot;real&quot; version and a mock-up that imitates the real version, and the mock-up is the one that gets replicated.

Anyways, don't know if that would be helpful to you or not, but it's just an idea. If you try it, let me know how it turns out.

'''Haral:''' Well, if the simulation could be good enough, that could be a brilliant way to take load off of a client.  I'm sure you know that karma is expensive.  However, part of the issue is that karma and normal physics are just so different that the simulation would be weak at points no matter how good you 'fake it' with your client version.  When you bump into another ship, for instance, normal physics dictates you stop, karma physics dictates you bounce and roll like crazy.

I do not have any plans for bot support.  It's &quot;possible&quot; but I feel it's a choice between a great multiplayer game and an okay SP/MP game.  Making bots that shoot, dodge, and move realistically is hard enough, especially in a ship.  Making them decide between flying a ship, shooting weapon turrets, boarding an enemy ship, outfitting ships... It's possible.  In fact, part of being me means that just considering it I have a bunch of possible code for it in my brain now.  But not right now.

The whole distance thing is an issue no matter what (I discovered it the first time I tried to make a level) but I have power in deciding the scale of the game.  The 'insides' of things and space can be made segregated, since effectively I'm just dealing with little model ships and stations anyway, so I can make them whatever size I like.  At the same time, I want this to take place in open space and not restrict level size more than it is already, so I figure I will need to use fog.  Also, I need to look into placing warpzones or something at the edges so that space never actually &quot;ends.&quot;  I wonder if this would kill the engine.

'''Foxpaw:''' Using fog is a good idea - I tried that and it looked very good for small craft. The problem I had with it was that large craft were easily visible from far past 60,000 UUs, so covering it up with fog made them not fade into view until much later than expected. One side-effect of using fog also, is that your ships will fade to black or what-have you, even if the background is some other color. When I was first making a level I was using the sky ripped from DM-PhobosII and it looked like crap when something faded in from black, silhouetted against the red planet.

Having said that though, those two things not being an issue, the fog makes a very nice effect. As far as space ending, I wouldn't really worry about it, since you have a lot of room to use for a level - especially if you scale the ships down. Warpzones don't work like they did in UT, unfortunately, and apparently the framerate plummets if there is a skybox and a warpzone visible at the same time (maybe not relevant since the warpzones don't display anymore anyway ;) )

You are right that the simulation would not be too accurate during a collision using the mock-up system I suggested. However, the Karma system will simulate differently on different machines - so a ship may slide or roll or whatever in a totally different direction on the client than it does on the server - either way Karma can't really be kept 100% consistent between the server and client.

My idea with the mockup was actually not to simulate any physics at all - it'd just be a staticmesh with no bBlockActors, etc. When it collided with another ship on the server, the mock-ups motion would be adjusted when it's next updated. Because the mock-ups wouldn't be colliding, they wouldn't really affect anything in the simulation. The ships might overlap briefly while waiting for the update from the server, but this would only really be noticeable at very short ranges, IE if another ship hit the player's ship. (It's an update of only a few bytes, after all, so even at relatively high pings it shouldn't be noticeable.. I would think.)

One thing that you would need to do though is, the client's ship would need to be Karma simulated. This is similar to what the player movement code does: Basically, the player uses an &quot;autonomous proxy.&quot; Basically, this means that actors using an autonomous proxy act as if they were the authority (server) version. They behave in every way as if they were operating in botplay, except when the server and client disagree, in which case the server takes precedence. The player stores it's movements and sends them separately - basically the server &quot;takes the client's word for it&quot; on matters involving movement - unless the server decides that the server version and client version are too far apart, and a correction must take place. This is important for the client controlled actors, because if your ping is, say 200, that's still a fifth of a second from when you press a button to when it responds. On other players ships and such, you don't need that kind of system locally because you don't know when they pressed the button and thus wouldn't notice any delay.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Haral/Work Ethic Rant</title>
    <id>1419</id>
    <revision>
      <id>3591</id>
      <timestamp>2004-10-31T02:05:32Z</timestamp>
      <contributor>
        <ip>Ryan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">GRRRR.

Okay, so I have a tendency to bite off more than the average man can chew.  I think small and end up with something huge.  It's not unfair to say I deserve a lot of the frustrations I get.  But still... ''What the hell?''

My first experience in leading a real team was with the mod Redemption for the Wheel of Time game.  It was a pretty typical sight, and one I'm not exactly proud of.  I decided to make the mod because I figured I could do it better than other people.  I'm not so convinced that I was wrong, but it was a sad, sad thing.  I wasn't going to program for it.  I wasn't going to level design.  Nope, no models... no sound fx.  No, my great contribution was design and story, the two least valuable products in the mod community.

And you know what?  That was the '''only''' time I ended up with a hard working team.  It pretty well broke up later on due to life issues with some and probably burnout on others (see first paragraph.)  I ended up releasing a pretty decent MP mod that had nothing to do with what was originally planned, and it was 90% my own work.  Everyone I recruited once I actually was a productive member myself was ''totally lazy''.

Since then I have tried everything I can think of to get people to just work on '''''something'''''.  I've tried giving them creative influence, I've tried giving them a totally solid and complete design layout.  I've TOLD them EXACTLY what they need to do, just hoping that they might do it and accidentally find themselves doing something else afterwards.  But no... I end up having to do it myself.

It doesn't bother me if people don't want to work on my mod.  That's FINE!  If everyone just said &quot;No, I wanna do my own thing,&quot; or &quot;you sux0rz g0 t00 h3llzzz&quot; I would not hate them except for not recognising the difference between 'to' and 'too.'  But that's not what happens!  It's more like this:

'''Haral''': blah blah blah talk about project blah blah

'''Whoever''': That's rad, can I work on it?

'''Haral''':  Yeah I guess.  You gotta keep up with the work though, I don't have any need for another name.

'''Whoever''': Totally!

A couple weeks goes by...

'''Haral''': So are you going to do anything?

'''Whoever''': Yeah, I've just been really busy.

Busy?  I HATE YOU.  Busy playing games?  Busy watching tv?  Busy staring at a wall?  These are things I've actually found the people were doing!

I am constantly trying to make things easier for other people to get their work done.  I tell them that if there's anything stopping them from getting something done, ''tell me''.  All I get, however, is '''I'm busy.'''  I'm not asking you out on a date!  You aren't busy!  '''I AM'''.  Busy getting things done while you sit there wasting space!  I have a full time job.  I go to school.  I hang out with my friends.  I keep a social life.  I still get things done.

If any of you people are out there reading this, come to grips with reality:

'''You are not busy.  You have the time.  You just don't want to spend it.'''

If you don't want to take the time, that's fine.  Just stop wasting '''my''' time by saying you're gonna keep up.

'''*deep breath*'''

What in the world am I doing wrong here?  How can I get people to actually put forth something I can recognise as real effort?  I have a hard time even getting people to come and test something I'm working on.  It's like people think making a game is like some mail-order degree.  Just sign up for the credit, without any of the work!  Even worse, it's like people think it's some sort of chore.  At times it's tedious, but most of the time it's engaging and FUN.

So here's three years of frustration of being stuck doing everything myself:

'''AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''

==Disscusion==

'''Nytro:''' I agree that many in the modding community can be lazy. One thing that can help with this problem (in case you haven't done this):

{{innerbox|'''LazyModder:''' Hey, can I join your mod team?

'''Haral:''' What kind of stuff can you do?

'''LazyModder:''' Uh, I can model stuff.

'''Haral:''' Show me a screenshot of something you've done.

}}

Now, at this point the ''really lazy'' modder will ignore you.

The ''not-as-lazy'' modder will give you a screenshot of something not very good. You can then tell them that you don't think you need their specific talents at the moment (since their talents happen to suck, but *SHH*, don't tell them that). The ''even-less-lazy'' modder will give you a good screenshot. Then you consider accepting them:

{{innerbox|'''Even-Less-Lazy Modder:''' So, can I join now?

'''Haral:''' That screenshot looks really good! Try a (thing); if you can do that, I'll know you have the right skills.

}}

So, now we reach the crossroads between ''even-less-lazy'' modder and ''non-lazy'' modder. If you get a decent (thing), they'll most probably give you more once they're in. If you determine that they're not ''non-lazy'' but just ''even-less-lazy'' modder, you then factor in how desperate you are to have anyone at all.

'''Haral:''' I think I'm just cursed.  I only recruit for specific talents, and those specific talents are only ever modelling and programming.  Every one of them has had some sort of accomplishment for me to take them aboard.  Like the rant says, it was only when I was handling things like an idiot did anyone else get things done.  I think the next thing I'm gonna try is closing my eyes, spinning around, and pointing to a day on the calender.  Then I'll laugh maniacally and declare, &quot;If you don't have your task done by *whatever date*, you're gone!&quot;  At least it'd be more entertaining for me, anyway.

'''Foxpaw:''' I'd have to agree 100%. I rarely try to recruit the help of others because I'd like to have all the code done before I ask people if they will do some art, etc... If, for whatever reason, I can't continue to work on it, I don't want to be the one letting everyone else down. However, I noticed this phenomenon when I was &quot;lead&quot; programmer on an online game back in the day. (The actual lead programmer I saw twice in the year I was there, so since I was second to him, I assumed the role.)

I'll be the first to admit, I was lazy sometimes too. There were times I would rather PLAY the game instead of fixing small bugs, which was all that remained at the time. The &quot;mappers,&quot; if you would call them that, were the worst. Most of them would &quot;work&quot; for weeks and have nothing to show for it.

However, having said that - About a year ago I was supervisor of a gas station. The cashiers weren't too bad, on account of they didn't really have a lot of work to do, but the gas attendants were just plain lazy. When new people were hired and I trained them, though, I noticed that they were not lazy and would work consistently. I've surmised that this was due to a different attitude of myself vs. the person who trained these people. The previous trainers gave the attentants a sense that they and the trainer (the supervisor) were &quot;on the same level.&quot; That's all fine and good for comaraderie, and as much as I would like to do half of their work plus my own, it's not very efficient when I know that they are perfectly capable. The result of that mentality is that since attendant and supervisor are placed at the same level, this gives the impression that since the supervisor sometimes disappears to do paperwork/whatever, the attendant should be able to do the same. This, of course, does not result in very good customer service if both people are away at the same time. :P When I trained people I wasn't &quot;high and mighty,&quot; about it, but I did ensure to give the impression that I couldn't always be there because I had other stuff to do. Some people think that this sort of thing will make your staff resent you, but this is not the case. I much prefer having a very defined set of responsibilities, instead of overlapping responsibilities that can be neglected if you think the other person had it taken care of. Unfortunately, since you aren't paying the people on your mod team, (generally) this would likely just breed resentment.

The point is... generally, people don't like to look bad. They know that if they shirk their responsibilities they'll look incompetent and lazy. As a result, if you give the impression that it needs to be done and noone else is going to do it (it's important to do this without being bossy, of course) it's a great motivator, because they know they'll be letting down the team if they don't do it. On the other hand though, some people are just plain lazy, and only want to be a part of the mod so they can see their name in the credits and tell people that they were on the modelling team that made all that great art, etc.

'''Kerlin:''' I'm a database admin by day. Yeah, it's uncool but game developers can be a little infantile in project planning and development. The absolute best people I've had on my team have been people that I mentored. Three prerequisites for getting on the db team: creativity (when dealing with 30G of data, this is important), logic (see previous), and hunger (willingness to learn). I've &quot;brought up&quot; guys in my team who have since moved on (after the .com folded). Now years later, when I have conversations with them I sometimes find myself saying, &quot;Really? I didn't know you could do that.&quot;. 

My point: Consider finding someone hungry. Someone you wouldn't normally consider for the job. Someone who has the raw ability but not the polish. Mentor them, push them, rinse, repeat. You don't get the attitude (&quot;my work speaks for itself&quot;, &quot;i could get on any team with my skillz&quot;, etc), they appreciate that you're sharing your knowledge, and they'll give you more than what you ask because they want to &quot;prove themselves&quot;. Start up time is a little longer but you're trying to make a fine wine, not lemonade, right? You both win in the end. 

'''EntropicLqd:''' I enjoyed reading this - in a sick ''I feel your pain'' kind of way.  I had the sad misfortune to work with a contractor in real life who was way more lazy than anyone you describe.  He actually created negative work he was so bad.  One thing to bear in mind .. If you approach someone to work on a mod and they tell you they are too busy, keep hold of their contact details.  If they won't commit because they know they don't have the time you can be fairly sure that should you approach them when they do have the time you'll get some decent output from them.

'''NickR:''' Very interesting read! :D I myself am one of the hungry. I'm always trying to learn new interesting aspects of UnrealScript and how I can achieve something. Usually in different ways: modular code, flexible code, easy to read code, as little code as possible. And because I'm a perfectionist I like to try and combine the lot. I'm coming to point where I know so much of that aspect of the Unreal engine I need to start to learn another aspect. And since modeling is the most complicated aspect (to me anyway), I ventured into the mapping scene with some small success. 

It is also a challenge to attempt to do asmuch of the development of a mod as possible on your own. It is a testment to a persons will to complete such a project without anyones help. I look forward to releasing my projects that I complete myself, because I can take all the credit for it. I'm not one for sharing! :D

'''Haral:''' Yeah I know how that is, however the way I see it is that to achieve more ambitious goals I'll need the help of others.  Right now I'm working more or less alone (with assistance, but not direct collaboration of anyone else.)  I too have taken up learning modeling programs and all that.  I'm just tired of watching things fall apart on me, and the only way to ensure they don't is to be willing to drag it to the end by myself.

'''O-GL:''' I’ve found that some people just don’t have what it takes to make games.  It has to be a major part of your life and you have to yearn everyday to make something cooler/better.

You need someone on your team that uses their computer all the time to help make something relating to games.  

If you get a programmer to join your team during the development of the project, and that person has never programmed a game before, chances are their desires are not in the right place.  Any good team member would have spent time on their own making a game because they have simply always been interested in it.  If they have little to show before they join your team, chances are, they’ll have little to show when they leave your team.  

I’ve found that modelers are a bit different.  They can often have a good skill set and do the work you require very well and fast, but they tend to pull out before the project is finished.  I think most of the time this is because they get fed up with the engine or your code making more work for them.  They tend to get excited by new graphic effects, but when it gets boring, they just quit to something more exciting.  On the whole, I think its good to have modelers doing models and very rough level designs at the start of the project to give the programmers something to work with.  Even if the modelers find they have nothing to do while the programmers work, and they leave, you can always go back (hopefully) to get them later.  When the programmers get the majority of the code done, the modelers can finish the project with the guidance of the programmer.  Thats what I'm hoping anyway :tup:.

'''Haral:''' Hmm... I'm not so sure.  While you certainly don't want anyone completely new to programming, (probably not even anyone new to unrealscript) those you describe are perhaps the worst.  Those who are in love with game dev usually want to make their own stuff... and while they might get entranced by your design, code challenges, or simply like you, that can wear out quickly and they'll wanna split and do something else.  I know I often do... I have to fight that urge for the sake of getting somewhere.

Perhaps the real issue we should obsess over is sharing.  I know I want glory, credit, etc as a game designer (not just a programmer.)  I also consider myself a good designer in general (I'm the best, of course) so I have a lot I'd like to get out there.  But if you look for a moment, you'll see Foxpaw, NickR, and I have haunted each others' space a bit because we're all working on similar designs.  Each has its own unique aspects (and mine is the best, of course) but it's a problem.  Each takes away a hard working programmer.  Each is competing for any additional team members, and if they are completed they are all in direct competition for players.  If we could all team up and get along, we could probably make one incredible mod that would wipe every mod out of the water (especially if it was mine, because I'm the best.)

Will this happen?  Hmmm... probably not.  Ambition cuts both ways.  I could let other people work with me, but I couldn't give up the reins on design.  I like my mod.  It's the best.

'''Ryan:''' I think that putting it down to just laziness is a little simplistic.  I think that focus is the major factor in determining if someone will carry on or not.  There are many reasons for people to lose focus, RL issues, other interests, biting off more than they can chew.  I'm sure there are some lazy people around, I've not met any yet though.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3592</id>
      <timestamp>2004-01-25T12:37:00Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">GRRRR.

Okay, so I have a tendency to bite off more than the average man can chew.  I think small and end up with something huge.  It's not unfair to say I deserve a lot of the frustrations I get.  But still... ''What the hell?''

My first experience in leading a real team was with the mod Redemption for the Wheel of Time game.  It was a pretty typical sight, and one I'm not exactly proud of.  I decided to make the mod because I figured I could do it better than other people.  I'm not so convinced that I was wrong, but it was a sad, sad thing.  I wasn't going to program for it.  I wasn't going to level design.  Nope, no models... no sound fx.  No, my great contribution was design and story, the two least valuable products in the mod community.

And you know what?  That was the '''only''' time I ended up with a hard working team.  It pretty well broke up later on due to life issues with some and probably burnout on others (see first paragraph.)  I ended up releasing a pretty decent MP mod that had nothing to do with what was originally planned, and it was 90% my own work.  Everyone I recruited once I actually was a productive member myself was ''totally lazy''.

Since then I have tried everything I can think of to get people to just work on '''''something'''''.  I've tried giving them creative influence, I've tried giving them a totally solid and complete design layout.  I've TOLD them EXACTLY what they need to do, just hoping that they might do it and accidentally find themselves doing something else afterwards.  But no... I end up having to do it myself.

It doesn't bother me if people don't want to work on my mod.  That's FINE!  If everyone just said &quot;No, I wanna do my own thing,&quot; or &quot;you sux0rz g0 t00 h3llzzz&quot; I would not hate them except for not recognising the difference between 'to' and 'too.'  But that's not what happens!  It's more like this:

'''Haral''': blah blah blah talk about project blah blah

'''Whoever''': That's rad, can I work on it?

'''Haral''':  Yeah I guess.  You gotta keep up with the work though, I don't have any need for another name.

'''Whoever''': Totally!

A couple weeks goes by...

'''Haral''': So are you going to do anything?

'''Whoever''': Yeah, I've just been really busy.

Busy?  I HATE YOU.  Busy playing games?  Busy watching tv?  Busy staring at a wall?  These are things I've actually found the people were doing!

I am constantly trying to make things easier for other people to get their work done.  I tell them that if there's anything stopping them from getting something done, ''tell me''.  All I get, however, is '''I'm busy.'''  I'm not asking you out on a date!  You aren't busy!  '''I AM'''.  Busy getting things done while you sit there wasting space!  I have a full time job.  I go to school.  I hang out with my friends.  I keep a social life.  I still get things done.

If any of you people are out there reading this, come to grips with reality:

'''You are not busy.  You have the time.  You just don't want to spend it.'''

If you don't want to take the time, that's fine.  Just stop wasting '''my''' time by saying you're gonna keep up.

'''*deep breath*'''

What in the world am I doing wrong here?  How can I get people to actually put forth something I can recognise as real effort?  I have a hard time even getting people to come and test something I'm working on.  It's like people think making a game is like some mail-order degree.  Just sign up for the credit, without any of the work!  Even worse, it's like people think it's some sort of chore.  At times it's tedious, but most of the time it's engaging and FUN.

So here's three years of frustration of being stuck doing everything myself:

'''AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''

==Disscusion==

'''Nytro:''' I agree that many in the modding community can be lazy. One thing that can help with this problem (in case you haven't done this):

{{innerbox|'''LazyModder:''' Hey, can I join your mod team?

'''Haral:''' What kind of stuff can you do?

'''LazyModder:''' Uh, I can model stuff.

'''Haral:''' Show me a screenshot of something you've done.

}}

Now, at this point the ''really lazy'' modder will ignore you.

The ''not-as-lazy'' modder will give you a screenshot of something not very good. You can then tell them that you don't think you need their specific talents at the moment (since their talents happen to suck, but *SHH*, don't tell them that). The ''even-less-lazy'' modder will give you a good screenshot. Then you consider accepting them:

{{innerbox|'''Even-Less-Lazy Modder:''' So, can I join now?

'''Haral:''' That screenshot looks really good! Try a (thing); if you can do that, I'll know you have the right skills.

}}

So, now we reach the crossroads between ''even-less-lazy'' modder and ''non-lazy'' modder. If you get a decent (thing), they'll most probably give you more once they're in. If you determine that they're not ''non-lazy'' but just ''even-less-lazy'' modder, you then factor in how desperate you are to have anyone at all.

'''Haral:''' I think I'm just cursed.  I only recruit for specific talents, and those specific talents are only ever modelling and programming.  Every one of them has had some sort of accomplishment for me to take them aboard.  Like the rant says, it was only when I was handling things like an idiot did anyone else get things done.  I think the next thing I'm gonna try is closing my eyes, spinning around, and pointing to a day on the calender.  Then I'll laugh maniacally and declare, &quot;If you don't have your task done by *whatever date*, you're gone!&quot;  At least it'd be more entertaining for me, anyway.

'''Foxpaw:''' I'd have to agree 100%. I rarely try to recruit the help of others because I'd like to have all the code done before I ask people if they will do some art, etc... If, for whatever reason, I can't continue to work on it, I don't want to be the one letting everyone else down. However, I noticed this phenomenon when I was &quot;lead&quot; programmer on an online game back in the day. (The actual lead programmer I saw twice in the year I was there, so since I was second to him, I assumed the role.)

I'll be the first to admit, I was lazy sometimes too. There were times I would rather PLAY the game instead of fixing small bugs, which was all that remained at the time. The &quot;mappers,&quot; if you would call them that, were the worst. Most of them would &quot;work&quot; for weeks and have nothing to show for it.

However, having said that - About a year ago I was supervisor of a gas station. The cashiers weren't too bad, on account of they didn't really have a lot of work to do, but the gas attendants were just plain lazy. When new people were hired and I trained them, though, I noticed that they were not lazy and would work consistently. I've surmised that this was due to a different attitude of myself vs. the person who trained these people. The previous trainers gave the attentants a sense that they and the trainer (the supervisor) were &quot;on the same level.&quot; That's all fine and good for comaraderie, and as much as I would like to do half of their work plus my own, it's not very efficient when I know that they are perfectly capable. The result of that mentality is that since attendant and supervisor are placed at the same level, this gives the impression that since the supervisor sometimes disappears to do paperwork/whatever, the attendant should be able to do the same. This, of course, does not result in very good customer service if both people are away at the same time. :P When I trained people I wasn't &quot;high and mighty,&quot; about it, but I did ensure to give the impression that I couldn't always be there because I had other stuff to do. Some people think that this sort of thing will make your staff resent you, but this is not the case. I much prefer having a very defined set of responsibilities, instead of overlapping responsibilities that can be neglected if you think the other person had it taken care of. Unfortunately, since you aren't paying the people on your mod team, (generally) this would likely just breed resentment.

The point is... generally, people don't like to look bad. They know that if they shirk their responsibilities they'll look incompetent and lazy. As a result, if you give the impression that it needs to be done and noone else is going to do it (it's important to do this without being bossy, of course) it's a great motivator, because they know they'll be letting down the team if they don't do it. On the other hand though, some people are just plain lazy, and only want to be a part of the mod so they can see their name in the credits and tell people that they were on the modelling team that made all that great art, etc.

'''Kerlin:''' I'm a database admin by day. Yeah, it's uncool but game developers can be a little infantile in project planning and development. The absolute best people I've had on my team have been people that I mentored. Three prerequisites for getting on the db team: creativity (when dealing with 30G of data, this is important), logic (see previous), and hunger (willingness to learn). I've &quot;brought up&quot; guys in my team who have since moved on (after the .com folded). Now years later, when I have conversations with them I sometimes find myself saying, &quot;Really? I didn't know you could do that.&quot;. 

My point: Consider finding someone hungry. Someone you wouldn't normally consider for the job. Someone who has the raw ability but not the polish. Mentor them, push them, rinse, repeat. You don't get the attitude (&quot;my work speaks for itself&quot;, &quot;i could get on any team with my skillz&quot;, etc), they appreciate that you're sharing your knowledge, and they'll give you more than what you ask because they want to &quot;prove themselves&quot;. Start up time is a little longer but you're trying to make a fine wine, not lemonade, right? You both win in the end. 

'''EntropicLqd:''' I enjoyed reading this - in a sick ''I feel your pain'' kind of way.  I had the sad misfortune to work with a contractor in real life who was way more lazy than anyone you describe.  He actually created negative work he was so bad.  One thing to bear in mind .. If you approach someone to work on a mod and they tell you they are too busy, keep hold of their contact details.  If they won't commit because they know they don't have the time you can be fairly sure that should you approach them when they do have the time you'll get some decent output from them.

'''NickR:''' Very interesting read! :D I myself am one of the hungry. I'm always trying to learn new interesting aspects of UnrealScript and how I can achieve something. Usually in different ways: modular code, flexible code, easy to read code, as little code as possible. And because I'm a perfectionist I like to try and combine the lot. I'm coming to point where I know so much of that aspect of the Unreal engine I need to start to learn another aspect. And since modeling is the most complicated aspect (to me anyway), I ventured into the mapping scene with some small success. 

It is also a challenge to attempt to do asmuch of the development of a mod as possible on your own. It is a testment to a persons will to complete such a project without anyones help. I look forward to releasing my projects that I complete myself, because I can take all the credit for it. I'm not one for sharing! :D

'''Haral:''' Yeah I know how that is, however the way I see it is that to achieve more ambitious goals I'll need the help of others.  Right now I'm working more or less alone (with assistance, but not direct collaboration of anyone else.)  I too have taken up learning modeling programs and all that.  I'm just tired of watching things fall apart on me, and the only way to ensure they don't is to be willing to drag it to the end by myself.

'''O-GL:''' I’ve found that some people just don’t have what it takes to make games.  It has to be a major part of your life and you have to yearn everyday to make something cooler/better.

You need someone on your team that uses their computer all the time to help make something relating to games.  

If you get a programmer to join your team during the development of the project, and that person has never programmed a game before, chances are their desires are not in the right place.  Any good team member would have spent time on their own making a game because they have simply always been interested in it.  If they have little to show before they join your team, chances are, they’ll have little to show when they leave your team.  

I’ve found that modelers are a bit different.  They can often have a good skill set and do the work you require very well and fast, but they tend to pull out before the project is finished.  I think most of the time this is because they get fed up with the engine or your code making more work for them.  They tend to get excited by new graphic effects, but when it gets boring, they just quit to something more exciting.  On the whole, I think its good to have modelers doing models and very rough level designs at the start of the project to give the programmers something to work with.  Even if the modelers find they have nothing to do while the programmers work, and they leave, you can always go back (hopefully) to get them later.  When the programmers get the majority of the code done, the modelers can finish the project with the guidance of the programmer.  Thats what I'm hoping anyway :tup:.

'''Haral:''' Hmm... I'm not so sure.  While you certainly don't want anyone completely new to programming, (probably not even anyone new to unrealscript) those you describe are perhaps the worst.  Those who are in love with game dev usually want to make their own stuff... and while they might get entranced by your design, code challenges, or simply like you, that can wear out quickly and they'll wanna split and do something else.  I know I often do... I have to fight that urge for the sake of getting somewhere.

Perhaps the real issue we should obsess over is sharing.  I know I want glory, credit, etc as a game designer (not just a programmer.)  I also consider myself a good designer in general (I'm the best, of course) so I have a lot I'd like to get out there.  But if you look for a moment, you'll see Foxpaw, NickR, and I have haunted each others' space a bit because we're all working on similar designs.  Each has its own unique aspects (and mine is the best, of course) but it's a problem.  Each takes away a hard working programmer.  Each is competing for any additional team members, and if they are completed they are all in direct competition for players.  If we could all team up and get along, we could probably make one incredible mod that would wipe every mod out of the water (especially if it was mine, because I'm the best.)

Will this happen?  Hmmm... probably not.  Ambition cuts both ways.  I could let other people work with me, but I couldn't give up the reins on design.  I like my mod.  It's the best.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hardware Brush</title>
    <id>1391</id>
    <revision>
      <id>3522</id>
      <timestamp>2003-06-19T19:05:30Z</timestamp>
      <contributor>
        <ip>Inet-netcache2-o.oracle.com</ip>
      </contributor>
      <minor/>
      <comment>Spelling changes</comment>
      <text xml:space="preserve">This page is largely obsolete discussion &amp; speculation from pre-[[Legacy:UT2003|UT2003]] days. See [[Legacy:Static Mesh|static mesh]].

===What are Hardware Brushes? ===

Hardware Brushes (or &quot;Static Meshes&quot; as they will be called from here on), are just as they are called, meshes. These are how the Unreal Engine can push the insane polygon counts this time around, because these meshes utilize your video card's T+L unit. They are created in an external 3D modelling program, such as [[Legacy:3D Studio Max|3D Studio Max]] or [[Legacy:Maya|Maya]], textured, then imported into UnrealEd using the ASE file format. [[Legacy:BSP|BSP]] is still used for base construction of a map, but the Static Meshes should be used for decorations and much of the architecture.

Static meshes have a collision hull that's separate from their visual appearance.  That collision hull can be either imported along with the mesh from the modelling program (as an object with a special name prefix), or automatically generated in UnrealEd (as a convex object with a definable complexity).  Of course, the mesh itself can be defined to be its collision hull, which results in per-poly collision.

Some other thing to note:
* Static Meshes can be rotated and scaled among X, Y, and Z
* Movers are now static meshes, not brushes.
* Static meshes can be converted to brushes and vice versa in UnrealEd.
* Static Meshes use vertex lighting. To use lightmaps on static meshes, they must be &quot;baked&quot; onto the mesh's textures using a 3D program.
* Static Meshes don't occlude; you have to use [[UT2003:antiportal]]s for that.  (For that matter, BSP doesn't automatically occlude either anymore.)

Another great thing about static meshes are that they can be set up with [[Legacy:Karma|Karma]] courtesy of MathEngine. For example, you can set up a lamp mesh that hangs from the ceiling (via chain) using Karma. Upon being shot, it with swing and spin realistically. The possibilities can be endless with Karma physics.

See also:  [[Legacy:Building With Static Meshes|Building With Static Meshes]]

----

So what exactly is gonna be the deal with hardware brushes? Here's a [http://c2.com/cgi/wiki?HowToVote Wiki poll]... to vote, edit this page and increment your choice's count by 1. BTW, feel free to add options if you think they're required.

(the alternative, BTW is a [http://c2.com/cgi/wiki?WikiGreatFoobarLists Wiki multiple vote] &amp;ndash; harder to read though)

# [2] bah, UT2 will ship with tons of groovy hardware prefabs. We'll have hours of endless amusement working with those, just as we were happy with UT's built-in textures for a long time.
# [0] a minority of uber-l33t modellers will create new prefabs for the community to use. That will be enough to add to the creative mix.
# [0] I intend to or already have a version of Max which dropped off the back of a lorry, honest guv '''OR''' I am a professional or rich and I have a legal copy (note: 5th amendment to the US constitution is deemed to apply internationally here :))
# [1] Existing cheap or free tools will suffice (GMax, [[Legacy:MeshMaker|MeshMaker]] etc)
# [0] an [[Legacy:Open Source|open source]] Unreal engine modeller might be a good idea

'''EntropicLqd:''' Well, we know the answer now I guess - I looked in my prefab directory and it was empty.  There's a rant coming ... I can feel it.

'''Mychaeel:''' Try looking into the StaticMeshes directory &amp;ndash; it is not quite as empty.  (And there are tons more static meshes in the maps.)

----

'''Mychaeel:'''  Although I'm a bit biased in favor of [[Legacy:MeshMaker|MeshMaker]], it's main purpose of getting prefabs into maps as decorations becomes more or less obsolete with the introduction of hardware brushes.  I understand the new UnrealEd has exactly MeshMaker's functionality built in for converting regular brushes to hardware brushes. &amp;ndash; What I don't know is whether hardware brushes are ''necessarily'' added to the [[Legacy:BSP|BSP]] for collision checking or just ''optionally''; same for raytraced lighting.  If those two features (BSP and raytraced lighting) which come at an expense are mandatory for hardware brushes, there might even be a place left for MeshMaker in U2 and UT2003 mapping.

'''Tarquin:'''  I didn't know UEd will be able to convert BSP brushes to hardware. The general rumblings on the forums are that unless you have Max, you're stuck with the HW brushes that Epic will deliver. Many mappers feel that this will make for custom maps which are just permutations of existing architecture. At the same time, I'm hitting the buffers with my [[Legacy:BrushBuilder|BrushBuilder]]s. There's things I ''could'' do, but the parameter list for a builder is longer than the box, has long arrays, and various hacky workarounds such as parameters doing different things in different circumstances. I could do a lot more with a more flexible interface. 

'''Mychaeel:'''  Maybe that's where an external program, putting the brush definition in .t3d format into the clipboard, could come in... that'd be much more flexible than UnrealEd's class property interface while still being way less complex to code and to use than a 3D modelling application.

:'''Tarquin:'''  I think I once saw an app that loaded &amp; displayed a saved brush. I remember a single window app which just loaded a brush &amp; allowed you to rotate it. There's [[Legacy:UTToolkit|UTToolkit]] which looks advanced.

'''Mychaeel:'''  By the way, in response to the last votable option, I had the idea of trying to analyze GMax's native file format in order to create a converter for it a while ago.  As far as I see not even GMax's license objects to that &amp;ndash; the license for the game developer edition of GMax (with which you can create &quot;game packs&quot;) is ''way'' more restrictive there, up to the point that game packs aren't allowed to make GMax export file formats that could be considered &quot;industry standard.&quot;

'''Bean:''' From what I have gathered by snooping and generally trying to pay attention to developers (which is tough to follow sometimes :) ), you can covert between BSP and HW Brushes in the editor, but it turns out bad half the time. Also, you kinda need an external modelling program to make decent looking prefabs. It's easier to make things in 3ds max than UnrealED geometry-wise. Also, the HW brushes DO use BSP for their per-poly collision detection. Also, the light drawn on to the HW brushes I believe is vertex, but the light can be pre-lit in 3ds max so shadows can be raytraced on HW brushes for an overall more pleasing look. As for the prefabs shipping with UT2003, there will be TONS of them. But most mappers will definately make their own (like me.)

'''Mychaeel:'''  My point was:  Are hardware brushes ''required'' to use per-poly collision (and thus be part of the BSP tree)?  Or is it also possible to have hardware brushes with the usual collision cylinder, or without collision at all?

'''Bean:''' Quoted from build 633 release notes:

{{innerbox| BSP trees are now used for collision with static meshes.  This results in a delay as the BSP is built when you add a static mesh. It also means static meshes '''can''' have per-polygon collision. Since a BSP is used for collision, collision is vulnerable to BSP errors.

}}

Hmmm... :)

'''Tarquin:'''  BSP holes in meshes... euwww...!

'''Mychaeel:'''  Bean, I know that quote, but it still leaves me uncertain about what I asked.  The first sentence sounds as if BSP trees are now used for collision with static meshes ''in any case'' (nothing in that sentence points to that it's an optional feature).  That &quot;can&quot; in the third sentence doesn't mean at all that there are other options like a collision cylinder as well. &amp;ndash; But that's all far beyond my point.  What I'm actually interested in is:  Are static meshes suited (and supposed) to replace decorations in the new engine?

'''Bean:''' Yes, hardware brushes are meant for deco and architecture. ive seen many screens of in-editor for U2 and UT2003, and all that BSP (from what ive seen) is used for is to subtract large spaces for terrain and to subtract rooms out for in-door areas. Static meshes are used for the rest.

'''Mychaeel:'''  What is the difference between &quot;static mesh&quot; and &quot;hardware brush&quot;?  (I thought those terms would be used interchangably.)

'''Bean:''' as far as i know, no difference. i just inadvertantly used both in my above reply.

'''Mychaeel:'''  Well, as we know now, it's possible that Maya PLE will be bundled with the game, and static mesh collision hulls can have arbitrary complexity (as opposed to being bound to the mesh's actual poly complexity), so the statement about BSP errors may be true, but isn't as problematic as it may sound.

----

'''Mychaeel:'''  Hehehe.  :)  Anybody up for creating new paragraph markup for automated polls?  Like having live counters, radio buttons and a &quot;Vote!&quot; button?  Shouldn't be so hard to implement...

'''Tarquin:'''  awwww.... it's more fun this way. :-D

'''EntropicLqd:'''  So what's the distinction between a &quot;static mesh&quot; and a &quot;prefab&quot;?  As far as I can tell, a static mesh would typically be used in game as an object the player can interact with (player models, weapons, ammo, vehicles and the like), and a prefab would be part of the level the player doesn't interact with (walls and floors for example).  However, they both appear to be sourced in exactly the same way - so maybe the distinction is one of logical categorisation - and a decision on import into UT.

'''Mychaeel:''' No. Static meshes are, like the name says, static (as in &quot;can't be animated&quot; &amp;ndash; that'd defeat their main point of being one static set of vertex information in the video card's memory), so they can't be used for player models and the like.  The closest equivalent to a static mesh is indeed a prefab in Unreal Tournament.

'''EntropicLqd:''' In one of the screenshots/videos featuring the editor I've seen, Meshes, Prefabs and static meshes all have separate tabs in the object viewer thingy (ooh techie terms).

'''Wormbo:''' The meshes are the same kind of meshes like the ones in UT. (used for weapons, etc.) Prefabs are also the same like in UT. (brushes built in the editor) Just the static meshes are new. (they are meshes, but are used like prefabs, that's how I understood it)

'''Mychaeel:''' They are ''used'' like decorations in Unreal Tournament.  Technically, they're more like prefabs in that they're non-animated (and they can be created from actual prefabs even though it's discouraged), and like models in how they're usually created.

'''EntropicLqd:'''  Right then .. lets see if I understand what's going on.  Ultimately, a ''mesh'', and a ''static mesh'' are the same thing.  However, a ''static mesh'' cannot be animated (or form part of an animation chain) or deformed dynamically in any way whatsoever.  So, the CTF flag would be a ''mesh'', and a box of flak shells (assuming it doesn't move) would be a ''static mesh''.  However I've heard that static meshes are also used for ledges, walls, sky boxes, and whole pieces of geometry in the level - so the use of meshes has pretty much replaced the brush work required in UT.  So where do prefabs fit in then?  I've never knowingly used any prefabs in UT so I've got no real reference point.  However, given the previous comments about static meshes, is the prefab system simply a mechanism for building up libraries of static meshes?  In which case, there would be no difference between a static mesh and a prefab except the directory it's contained within.  Possibly static meshes are part of the level data, but prefabs would be available to all levels (like putting textures in their own package or using MyLevel package).  Am I close?  I didn't get muc sleep last night (eldest was somewhat sick) and this is starting to make my head hurt.

'''Mychaeel:''' I suppose ammo packs are still regular meshes with a normal actor collision cylinder. &amp;ndash; From a technical point of view, meshes and static meshes are quite different.  The main purpose of static meshes is level for furnishing levels, and they're also used for movers now.  The term &quot;prefab&quot; is occasionally used interchangably with &quot;static mesh&quot; for the new Unreal engine versions, but the &quot;old&quot; notion of a prefab (a saved builder brush) is still available too.

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; merge into [[Legacy:Static Mesh|Static Mesh]] or delete
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3523</id>
      <timestamp>2002-10-09T17:40:49Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is largely obsolete discussion &amp; speculation from pre-[[Legacy:UT2003|UT2003]] days. See [[Legacy:Static Mesh|static mesh]].

===What are Hardware Brushes? ===

Hardware Brushes (or &quot;Static Meshes&quot; as they will be called for here on in), are just as they are called, meshes. These are how the Unreal Engine can push the insane polygon counts this time around, because these meshes utilize your video card's T+L unit. They are created in an external 3D modelling program, such as [[Legacy:3D Studio Max|3D Studio Max]] or [[Legacy:Maya|Maya]], textured, then imported into UnrealEd using the ASE file format. [[Legacy:BSP|BSP]] is still used for base construction of a map, but the Static Meshes should be used for decorations and much of the architecture.

Static meshes have a collision hull that's separate from their visual appearance.  That collision hull can be either imported along with the mesh from the modelling program (as an object with a special name prefix), or automatically generated in UnrealEd (as a convex object with a definable complexity).  Of course, the mesh itself can be defined to be its collision hull, which results in per-poly collision.

Some other thing to note:
* Static Meshes can be rotated and scaled among X, Y, and Z
* Movers are now static meshes, not brushes.
* Static meshes can be converted to brushes and vice versa in UnrealEd.
* Static Meshes use vertex lighting. To use lightmaps on static meshes, they must be &quot;baked&quot; onto the mesh's textures using a 3D program.
* Static Meshes don't occlude; you have to use [[UT2003:antiportal]]s for that.  (For that matter, BSP doesn't automatically occlude either anymore.)

Another great thing about static meshes are that they can be set up with [[Legacy:Karma|Karma]] courtesy of MathEngine. For example, you can set up a lamp mesh that hangs from the ceiling (via chain) using Karma. Upon being shot, it with swing and spin realistically. The possibilities can be endless with Karma physics.

See also:  [[Legacy:Building With Static Meshes|Building With Static Meshes]]

----

So what exactly is gonna be the deal with hardware brushes? Here's a [http://c2.com/cgi/wiki?HowToVote Wiki poll]... to vote, edit this page and increment your choice's count by 1. BTW, feel free to add options if you think they're required.

(the alternative, BTW is a [http://c2.com/cgi/wiki?WikiGreatFoobarLists Wiki multiple vote] &amp;ndash; harder to read though)

# [2] bah, UT2 will ship with tons of groovy hardware prefabs. We'll have hours of endless amusement working with those, just as we were happy with UT's built-in textures for a long time.
# [0] a minority of uber-l33t modellers will create new prefabs for the community to use. That will be enough to add to the creative mix.
# [0] I intend to or already have a version of Max which dropped off the back of a lorry, honest guv '''OR''' I am a professional or rich and I have a legal copy (note: 5th amendment to the US constitution is deemed to apply internationally here :))
# [1] Existing cheap or free tools will suffice (GMax, [[Legacy:MeshMaker|MeshMaker]] etc)
# [0] an [[Legacy:Open Source|open source]] Unreal engine modeller might be a good idea

'''EntropicLqd:''' Well, we know the answer now I guess - I looked in my prefab directory and it was empty.  There's a rant coming ... I can feel it.

'''Mychaeel:''' Try looking into the StaticMeshes directory &amp;ndash; it is not quite as empty.  (And there are tons more static meshes in the maps.)

----

'''Mychaeel:'''  Although I'm a bit biased in favor of [[Legacy:MeshMaker|MeshMaker]], it's main purpose of getting prefabs into maps as decorations becomes more or less obsolete with the introduction of hardware brushes.  I understand the new UnrealEd has exactly MeshMaker's functionality built in for converting regular brushes to hardware brushes. &amp;ndash; What I don't know is whether hardware brushes are ''necessarily'' added to the [[Legacy:BSP|BSP]] for collision checking or just ''optionally''; same for raytraced lighting.  If those two features (BSP and raytraced lighting) which come at an expense are mandatory for hardware brushes, there might even be a place left for MeshMaker in U2 and UT2003 mapping.

'''Tarquin:'''  I didn't know UEd will be able to convert BSP brushes to hardware. The general rumblings on the forums are that unless you have Max, you're stuck with the HW brushes that Epic will deliver. Many mappers feel that this will make for custom maps which are just permutations of existing architecture. At the same time, I'm hitting the buffers with my [[Legacy:BrushBuilder|BrushBuilder]]s. There's things I ''could'' do, but the parameter list for a builder is longer than the box, has long arrays, and various hacky workarounds such as parameters doing different things in different circumstances. I could do a lot more with a more flexible interface. 

'''Mychaeel:'''  Maybe that's where an external program, putting the brush definition in .t3d format into the clipboard, could come in... that'd be much more flexible than UnrealEd's class property interface while still being way less complex to code and to use than a 3D modelling application.

:'''Tarquin:'''  I think I once saw an app that loaded &amp; displayed a saved brush. I remember a single window app which just loaded a brush &amp; allowed you to rotate it. There's [[Legacy:UTToolkit|UTToolkit]] which looks advanced.

'''Mychaeel:'''  By the way, in response to the last votable option, I had the idea of trying to analyze GMax's native file format in order to create a converter for it a while ago.  As far as I see not even GMax's license objects to that &amp;ndash; the license for the game developer edition of GMax (with which you can create &quot;game packs&quot;) is ''way'' more restrictive there, up to the point that game packs aren't allowed to make GMax export file formats that could be considered &quot;industry standard.&quot;

'''Bean:''' From what I have gathered by snooping and generally trying to pay attention to developers (which is tough to follow sometimes :) ), you can covert between BSP and HW Brushes in the editor, but it turns out bad half the time. Also, you kinda need an external modelling program to make decent looking prefabs. It's easier to make things in 3ds max than UnrealED geometry-wise. Also, the HW brushes DO use BSP for their per-poly collision detection. Also, the light drawn on to the HW brushes I believe is vertex, but the light can be pre-lit in 3ds max so shadows can be raytraced on HW brushes for an overall more pleasing look. As for the prefabs shipping with UT2003, there will be TONS of them. But most mappers will definately make their own (like me.)

'''Mychaeel:'''  My point was:  Are hardware brushes ''required'' to use per-poly collision (and thus be part of the BSP tree)?  Or is it also possible to have hardware brushes with the usual collision cylinder, or without collision at all?

'''Bean:''' Quoted from build 633 release notes:

{{innerbox| BSP trees are now used for collision with static meshes.  This results in a delay as the BSP is built when you add a static mesh. It also means static meshes '''can''' have per-polygon collision. Since a BSP is used for collision, collision is vulnerable to BSP errors.

}}

Hmmm... :)

'''Tarquin:'''  BSP holes in meshes... euwww...!

'''Mychaeel:'''  Bean, I know that quote, but it still leaves me uncertain about what I asked.  The first sentence sounds as if BSP trees are now used for collision with static meshes ''in any case'' (nothing in that sentence points to that it's an optional feature).  That &quot;can&quot; in the third sentence doesn't mean at all that there are other options like a collision cylinder as well. &amp;ndash; But that's all far beyond my point.  What I'm actually interested in is:  Are static meshes suited (and supposed) to replace decorations in the new engine?

'''Bean:''' Yes, hardware brushes are meant for deco and architecture. ive seen many screens of in-editor for U2 and UT2003, and all that BSP (from what ive seen) is used for is to subtract large spaces for terrain and to subtract rooms out for in-door areas. Static meshes are used for the rest.

'''Mychaeel:'''  What is the difference between &quot;static mesh&quot; and &quot;hardware brush&quot;?  (I thought those terms would be used interchangably.)

'''Bean:''' as far as i know, no difference. i just inadvertantly used both in my above reply.

'''Mychaeel:'''  Well, as we know now, it's possible that Maya PLE will be bundled with the game, and static mesh collision hulls can have arbitrary complexity (as opposed to being bound to the mesh's actual poly complexity), so the statement about BSP errors may be true, but isn't as problematic as it may sound.

----

'''Mychaeel:'''  Hehehe.  :)  Anybody up for creating new paragraph markup for automated polls?  Like having live counters, radio buttons and a &quot;Vote!&quot; button?  Shouldn't be so hard to implement...

'''Tarquin:'''  awwww.... it's more fun this way. :-D

'''EntropicLqd:'''  So what's the distinction between a &quot;static mesh&quot; and a &quot;prefab&quot;?  As far as I can tell, a static mesh would typically be used in game as an object the player can interact with (player models, weapons, ammo, vehicles and the like), and a prefab would be part of the level the player doesn't interact with (walls and floors for example).  However, they both appear to be sourced in exactly the same way - so maybe the distinction is one of logical categorisation - and a decision on import into UT.

'''Mychaeel:''' No. Static meshes are, like the name says, static (as in &quot;can't be animated&quot; &amp;ndash; that'd defeat their main point of being one static set of vertex information in the video card's memory), so they can't be used for player models and the like.  The closest equivalent to a static mesh is indeed a prefab in Unreal Tournament.

'''EntropicLqd:''' In one of the screenshots/videos featuring the editor I've seen, Meshes, Prefabs and static meshes all have separate tabs in the object viewer thingy (ooh techie terms).

'''Wormbo:''' The meshes are the same kind of meshes like the ones in UT. (used for weapons, etc.) Prefabs are also the same like in UT. (brushes built in the editor) Just the static meshes are new. (they are meshes, but are used like prefabs, that's how I understood it)

'''Mychaeel:''' They are ''used'' like decorations in Unreal Tournament.  Technically, they're more like prefabs in that they're non-animated (and they can be created from actual prefabs even though it's discouraged), and like models in how they're usually created.

'''EntropicLqd:'''  Right then .. lets see if I understand what's going on.  Ultimately, a ''mesh'', and a ''static mesh'' are the same thing.  However, a ''static mesh'' cannot be animated (or form part of an animation chain) or deformed dynamically in any way whatsoever.  So, the CTF flag would be a ''mesh'', and a box of flak shells (assuming it doesn't move) would be a ''static mesh''.  However I've heard that static meshes are also used for ledges, walls, sky boxes, and whole pieces of geometry in the level - so the use of meshes has pretty much replaced the brush work required in UT.  So where do prefabs fit in then?  I've never knowingly used any prefabs in UT so I've got no real reference point.  However, given the previous comments about static meshes, is the prefab system simply a mechanism for building up libraries of static meshes?  In which case, there would be no difference between a static mesh and a prefab except the directory it's contained within.  Possibly static meshes are part of the level data, but prefabs would be available to all levels (like putting textures in their own package or using MyLevel package).  Am I close?  I didn't get muc sleep last night (eldest was somewhat sick) and this is starting to make my head hurt.

'''Mychaeel:''' I suppose ammo packs are still regular meshes with a normal actor collision cylinder. &amp;ndash; From a technical point of view, meshes and static meshes are quite different.  The main purpose of static meshes is level for furnishing levels, and they're also used for movers now.  The term &quot;prefab&quot; is occasionally used interchangably with &quot;static mesh&quot; for the new Unreal engine versions, but the &quot;old&quot; notion of a prefab (a saved builder brush) is still available too.</text>
    </revision>
    <revision>
      <id>3524</id>
      <timestamp>2003-05-25T09:50:32Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>[[Category Mapping]], [[Category To Do]] -- merge into [[Static Mesh]] or delete</comment>
      <text xml:space="preserve">This page is largely obsolete discussion &amp; speculation from pre-[[Legacy:UT2003|UT2003]] days. See [[Legacy:Static Mesh|static mesh]].

===What are Hardware Brushes? ===

Hardware Brushes (or &quot;Static Meshes&quot; as they will be called for here on in), are just as they are called, meshes. These are how the Unreal Engine can push the insane polygon counts this time around, because these meshes utilize your video card's T+L unit. They are created in an external 3D modelling program, such as [[Legacy:3D Studio Max|3D Studio Max]] or [[Legacy:Maya|Maya]], textured, then imported into UnrealEd using the ASE file format. [[Legacy:BSP|BSP]] is still used for base construction of a map, but the Static Meshes should be used for decorations and much of the architecture.

Static meshes have a collision hull that's separate from their visual appearance.  That collision hull can be either imported along with the mesh from the modelling program (as an object with a special name prefix), or automatically generated in UnrealEd (as a convex object with a definable complexity).  Of course, the mesh itself can be defined to be its collision hull, which results in per-poly collision.

Some other thing to note:
* Static Meshes can be rotated and scaled among X, Y, and Z
* Movers are now static meshes, not brushes.
* Static meshes can be converted to brushes and vice versa in UnrealEd.
* Static Meshes use vertex lighting. To use lightmaps on static meshes, they must be &quot;baked&quot; onto the mesh's textures using a 3D program.
* Static Meshes don't occlude; you have to use [[UT2003:antiportal]]s for that.  (For that matter, BSP doesn't automatically occlude either anymore.)

Another great thing about static meshes are that they can be set up with [[Legacy:Karma|Karma]] courtesy of MathEngine. For example, you can set up a lamp mesh that hangs from the ceiling (via chain) using Karma. Upon being shot, it with swing and spin realistically. The possibilities can be endless with Karma physics.

See also:  [[Legacy:Building With Static Meshes|Building With Static Meshes]]

----

So what exactly is gonna be the deal with hardware brushes? Here's a [http://c2.com/cgi/wiki?HowToVote Wiki poll]... to vote, edit this page and increment your choice's count by 1. BTW, feel free to add options if you think they're required.

(the alternative, BTW is a [http://c2.com/cgi/wiki?WikiGreatFoobarLists Wiki multiple vote] &amp;ndash; harder to read though)

# [2] bah, UT2 will ship with tons of groovy hardware prefabs. We'll have hours of endless amusement working with those, just as we were happy with UT's built-in textures for a long time.
# [0] a minority of uber-l33t modellers will create new prefabs for the community to use. That will be enough to add to the creative mix.
# [0] I intend to or already have a version of Max which dropped off the back of a lorry, honest guv '''OR''' I am a professional or rich and I have a legal copy (note: 5th amendment to the US constitution is deemed to apply internationally here :))
# [1] Existing cheap or free tools will suffice (GMax, [[Legacy:MeshMaker|MeshMaker]] etc)
# [0] an [[Legacy:Open Source|open source]] Unreal engine modeller might be a good idea

'''EntropicLqd:''' Well, we know the answer now I guess - I looked in my prefab directory and it was empty.  There's a rant coming ... I can feel it.

'''Mychaeel:''' Try looking into the StaticMeshes directory &amp;ndash; it is not quite as empty.  (And there are tons more static meshes in the maps.)

----

'''Mychaeel:'''  Although I'm a bit biased in favor of [[Legacy:MeshMaker|MeshMaker]], it's main purpose of getting prefabs into maps as decorations becomes more or less obsolete with the introduction of hardware brushes.  I understand the new UnrealEd has exactly MeshMaker's functionality built in for converting regular brushes to hardware brushes. &amp;ndash; What I don't know is whether hardware brushes are ''necessarily'' added to the [[Legacy:BSP|BSP]] for collision checking or just ''optionally''; same for raytraced lighting.  If those two features (BSP and raytraced lighting) which come at an expense are mandatory for hardware brushes, there might even be a place left for MeshMaker in U2 and UT2003 mapping.

'''Tarquin:'''  I didn't know UEd will be able to convert BSP brushes to hardware. The general rumblings on the forums are that unless you have Max, you're stuck with the HW brushes that Epic will deliver. Many mappers feel that this will make for custom maps which are just permutations of existing architecture. At the same time, I'm hitting the buffers with my [[Legacy:BrushBuilder|BrushBuilder]]s. There's things I ''could'' do, but the parameter list for a builder is longer than the box, has long arrays, and various hacky workarounds such as parameters doing different things in different circumstances. I could do a lot more with a more flexible interface. 

'''Mychaeel:'''  Maybe that's where an external program, putting the brush definition in .t3d format into the clipboard, could come in... that'd be much more flexible than UnrealEd's class property interface while still being way less complex to code and to use than a 3D modelling application.

:'''Tarquin:'''  I think I once saw an app that loaded &amp; displayed a saved brush. I remember a single window app which just loaded a brush &amp; allowed you to rotate it. There's [[Legacy:UTToolkit|UTToolkit]] which looks advanced.

'''Mychaeel:'''  By the way, in response to the last votable option, I had the idea of trying to analyze GMax's native file format in order to create a converter for it a while ago.  As far as I see not even GMax's license objects to that &amp;ndash; the license for the game developer edition of GMax (with which you can create &quot;game packs&quot;) is ''way'' more restrictive there, up to the point that game packs aren't allowed to make GMax export file formats that could be considered &quot;industry standard.&quot;

'''Bean:''' From what I have gathered by snooping and generally trying to pay attention to developers (which is tough to follow sometimes :) ), you can covert between BSP and HW Brushes in the editor, but it turns out bad half the time. Also, you kinda need an external modelling program to make decent looking prefabs. It's easier to make things in 3ds max than UnrealED geometry-wise. Also, the HW brushes DO use BSP for their per-poly collision detection. Also, the light drawn on to the HW brushes I believe is vertex, but the light can be pre-lit in 3ds max so shadows can be raytraced on HW brushes for an overall more pleasing look. As for the prefabs shipping with UT2003, there will be TONS of them. But most mappers will definately make their own (like me.)

'''Mychaeel:'''  My point was:  Are hardware brushes ''required'' to use per-poly collision (and thus be part of the BSP tree)?  Or is it also possible to have hardware brushes with the usual collision cylinder, or without collision at all?

'''Bean:''' Quoted from build 633 release notes:

{{innerbox| BSP trees are now used for collision with static meshes.  This results in a delay as the BSP is built when you add a static mesh. It also means static meshes '''can''' have per-polygon collision. Since a BSP is used for collision, collision is vulnerable to BSP errors.

}}

Hmmm... :)

'''Tarquin:'''  BSP holes in meshes... euwww...!

'''Mychaeel:'''  Bean, I know that quote, but it still leaves me uncertain about what I asked.  The first sentence sounds as if BSP trees are now used for collision with static meshes ''in any case'' (nothing in that sentence points to that it's an optional feature).  That &quot;can&quot; in the third sentence doesn't mean at all that there are other options like a collision cylinder as well. &amp;ndash; But that's all far beyond my point.  What I'm actually interested in is:  Are static meshes suited (and supposed) to replace decorations in the new engine?

'''Bean:''' Yes, hardware brushes are meant for deco and architecture. ive seen many screens of in-editor for U2 and UT2003, and all that BSP (from what ive seen) is used for is to subtract large spaces for terrain and to subtract rooms out for in-door areas. Static meshes are used for the rest.

'''Mychaeel:'''  What is the difference between &quot;static mesh&quot; and &quot;hardware brush&quot;?  (I thought those terms would be used interchangably.)

'''Bean:''' as far as i know, no difference. i just inadvertantly used both in my above reply.

'''Mychaeel:'''  Well, as we know now, it's possible that Maya PLE will be bundled with the game, and static mesh collision hulls can have arbitrary complexity (as opposed to being bound to the mesh's actual poly complexity), so the statement about BSP errors may be true, but isn't as problematic as it may sound.

----

'''Mychaeel:'''  Hehehe.  :)  Anybody up for creating new paragraph markup for automated polls?  Like having live counters, radio buttons and a &quot;Vote!&quot; button?  Shouldn't be so hard to implement...

'''Tarquin:'''  awwww.... it's more fun this way. :-D

'''EntropicLqd:'''  So what's the distinction between a &quot;static mesh&quot; and a &quot;prefab&quot;?  As far as I can tell, a static mesh would typically be used in game as an object the player can interact with (player models, weapons, ammo, vehicles and the like), and a prefab would be part of the level the player doesn't interact with (walls and floors for example).  However, they both appear to be sourced in exactly the same way - so maybe the distinction is one of logical categorisation - and a decision on import into UT.

'''Mychaeel:''' No. Static meshes are, like the name says, static (as in &quot;can't be animated&quot; &amp;ndash; that'd defeat their main point of being one static set of vertex information in the video card's memory), so they can't be used for player models and the like.  The closest equivalent to a static mesh is indeed a prefab in Unreal Tournament.

'''EntropicLqd:''' In one of the screenshots/videos featuring the editor I've seen, Meshes, Prefabs and static meshes all have separate tabs in the object viewer thingy (ooh techie terms).

'''Wormbo:''' The meshes are the same kind of meshes like the ones in UT. (used for weapons, etc.) Prefabs are also the same like in UT. (brushes built in the editor) Just the static meshes are new. (they are meshes, but are used like prefabs, that's how I understood it)

'''Mychaeel:''' They are ''used'' like decorations in Unreal Tournament.  Technically, they're more like prefabs in that they're non-animated (and they can be created from actual prefabs even though it's discouraged), and like models in how they're usually created.

'''EntropicLqd:'''  Right then .. lets see if I understand what's going on.  Ultimately, a ''mesh'', and a ''static mesh'' are the same thing.  However, a ''static mesh'' cannot be animated (or form part of an animation chain) or deformed dynamically in any way whatsoever.  So, the CTF flag would be a ''mesh'', and a box of flak shells (assuming it doesn't move) would be a ''static mesh''.  However I've heard that static meshes are also used for ledges, walls, sky boxes, and whole pieces of geometry in the level - so the use of meshes has pretty much replaced the brush work required in UT.  So where do prefabs fit in then?  I've never knowingly used any prefabs in UT so I've got no real reference point.  However, given the previous comments about static meshes, is the prefab system simply a mechanism for building up libraries of static meshes?  In which case, there would be no difference between a static mesh and a prefab except the directory it's contained within.  Possibly static meshes are part of the level data, but prefabs would be available to all levels (like putting textures in their own package or using MyLevel package).  Am I close?  I didn't get muc sleep last night (eldest was somewhat sick) and this is starting to make my head hurt.

'''Mychaeel:''' I suppose ammo packs are still regular meshes with a normal actor collision cylinder. &amp;ndash; From a technical point of view, meshes and static meshes are quite different.  The main purpose of static meshes is level for furnishing levels, and they're also used for movers now.  The term &quot;prefab&quot; is occasionally used interchangably with &quot;static mesh&quot; for the new Unreal engine versions, but the &quot;old&quot; notion of a prefab (a saved builder brush) is still available too.

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; merge into [[Legacy:Static Mesh|Static Mesh]] or delete
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HardwareShader</title>
    <id>1434</id>
    <revision>
      <id>3622</id>
      <timestamp>2004-04-12T14:36:24Z</timestamp>
      <contributor>
        <ip>CPE-144-137-195-4.sa.bigpond.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:... ENGINE ...|... ENGINE ...]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:HardwareShader|HardwareShader]]}}

==Properties==
; int NumPasses : 
; int PixelShader[4] : 
; int VertexShader[4] : 

===HardwareShader===
; int AlphaBlending[4] : 
; byte AlphaRef[4] : 
; int AlphaTest[4] : 
; byte DestBlend[16] : 
; string PixelShaderText[4] : 
; SConstantsInfo PSConstants[32] : 
; byte SrcBlend[16] : 
; array&lt;INT&gt; StreamMapping : * Indexed array of where the streams will show up&lt;br /&gt; * if StreamMapping[0] == NORMAL then v0 will contain the vertex normal
; Texture Textures[32] : 
; string VertexShaderText[4] : 
; SConstantsInfo VSConstants[200] : 
; int ZTest[4] : 
; int ZWrite[4] : 

==Enums==

===SConstant===

; EVC_Unused :
; EVC_MaterialDefined :
; EVC_ViewProjMatrix :
; EVC_WorldViewProjMatrix :
; EVC_WorldMatrix :
; EVC_InvViewMatrix :
; EVC_ViewMatrix :
; EVC_InvWorldMatrix :
; EVC_Time :
; EVC_CosTime :
; EVC_SinTime :
; EVC_TanTime :
; EVC_Eye :
; EVC_XYCircle :
; EVC_NearestLightPos1 :
; EVC_InvLightRadius1 :
; EVC_NearestLightPos2 :
; EVC_InvLightRadius2 :
; EVC_LightColor1 :
; EVC_LightColor2 :
; EVC_Max :

==Structures==

===SConstantsInfo===
* Used to specify constants for a vertex shader.
; SConstant Type : 
; Plane Value :</text>
    </revision>
    <revision>
      <id>12665</id>
      <timestamp>2008-05-17T10:16:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed bad game link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Unreal 2|Unreal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:HardwareShader|HardwareShader]]}}

==Properties==
; int NumPasses : 
; int PixelShader[4] : 
; int VertexShader[4] : 

===HardwareShader===
; int AlphaBlending[4] : 
; byte AlphaRef[4] : 
; int AlphaTest[4] : 
; byte DestBlend[16] : 
; string PixelShaderText[4] : 
; SConstantsInfo PSConstants[32] : 
; byte SrcBlend[16] : 
; array&lt;INT&gt; StreamMapping : * Indexed array of where the streams will show up&lt;br /&gt; * if StreamMapping[0] == NORMAL then v0 will contain the vertex normal
; Texture Textures[32] : 
; string VertexShaderText[4] : 
; SConstantsInfo VSConstants[200] : 
; int ZTest[4] : 
; int ZWrite[4] : 

==Enums==

===SConstant===

; EVC_Unused :
; EVC_MaterialDefined :
; EVC_ViewProjMatrix :
; EVC_WorldViewProjMatrix :
; EVC_WorldMatrix :
; EVC_InvViewMatrix :
; EVC_ViewMatrix :
; EVC_InvWorldMatrix :
; EVC_Time :
; EVC_CosTime :
; EVC_SinTime :
; EVC_TanTime :
; EVC_Eye :
; EVC_XYCircle :
; EVC_NearestLightPos1 :
; EVC_InvLightRadius1 :
; EVC_NearestLightPos2 :
; EVC_InvLightRadius2 :
; EVC_LightColor1 :
; EVC_LightColor2 :
; EVC_Max :

==Structures==

===SConstantsInfo===
* Used to specify constants for a vertex shader.
; SConstant Type : 
; Plane Value :</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HarvesterUT/Developer Journal</title>
    <id>1423</id>
    <revision>
      <id>3599</id>
      <timestamp>2003-08-05T09:48:55Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===29 APR 2003===

I got one reply from a coder interested in my mod, we chatted, but i never heard back from the guy.

Oh well, i was so close to having the last coding slot filled.  Well i picked up 2 guys who will

doing 2D work for us on a &quot;freelance&quot; basis.  I have been working on the fighter models, and fleet

ship models.  I knew it would be tough putting a team together....and now i REALLY know how hard it

is.  Checking 6-7 forums 2-3 times a day to see if anyone replied to my request posts, and finding

new forums to pimp the mod in.  Every day I am encouraged b/c of the positive response the mod gets.

No one tells me idea sucks....thats a start, right?

===Old===

my mod is Space Conflict, a game that combines Descent, with BF1942, and X-Wing/Tie-Fighter.

right now the team has 3 members; myself and 2 coders.

I have been making many models for the game, mainly fighters and large battle fleet ships.

They are all low poly (160-600 polys depending on the ship).  I know your thinking 160 polys?

But the model look decent and will be nice when it's skinned.  Im keeping the poly count low

because of the way the game is setup.  There will not be many zones b/c it is all in space,

and you can see all the ships.  Im not sure how the game will handle each player in their own

vehicle AND many HUGE sized fleet ships.  I mean these things are probably the largest meshes

used in UT2003 so far.  Each one takes over a minute to run across.

any thoughts on how the engine will handle 20-30 large static meshes on screen at once?  most

of them will be vehicles....

more on this later

==Comments ==

'''DJPaul:''' Sorry to post a comment on your journal, but, &quot;any thoughts on how the engine will handle 20-30 large static meshes on screen at once&quot; - depends: if they are the same model, you will notice the same performance hit as if you had just one static mesh.  If they are differentl, each will have to be loaded, thus using more memory.

'''HarvesterUT''' oh dont worry about commenting, thats what its for!  well i figure each faction will have 3-4 different fighters, and

at any given time there might be 4-6 DIFFERENT large static meshes in there as well....so thats maybe 10-12 diff meshes on screen at once.

i figure the upper limit on most large ships will be 1000 and the fighters will be like 300.  you also gotta figure that if 12-16 people

are playing at the same time they each have their own player models and their own vehicle.

'''Original9:''' I wouldn't worry about the polycount. If your models are running around with 2048x2048 textures that takes up a lot of memory bandwidth. If you haves models with 3000~ polys and a 512x512 it'll most likely run fast then a model with 1500~ with 1024x1024. Someone correct me if I'm wrong. ;)

'''MythOpus:''' Harvester man, wut happend to the mod ?  I go away for awhile , I come back and a new mod for UT2k4 is being made ????

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3600</id>
      <timestamp>2003-04-29T05:22:06Z</timestamp>
      <contributor>
        <ip>Adsl-64-217-73-75.dsl.austtx.swbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===29 APR 2003===

I got one reply from a coder interested in my mod, we chatted, but i never heard back from the guy.

Oh well, i was so close to having the last coding slot filled.  Well i picked up 2 guys who will

doing 2D work for us on a &quot;freelance&quot; basis.  I have been working on the fighter models, and fleet

ship models.  I knew it would be tough putting a team together....and now i REALLY know how hard it

is.  Checking 6-7 forums 2-3 times a day to see if anyone replied to my request posts, and finding

new forums to pimp the mod in.  Every day I am encouraged b/c of the positive response the mod gets.

No one tells me idea sucks....thats a start, right?

===Old===

my mod is Space Conflict, a game that combines Descent, with BF1942, and X-Wing/Tie-Fighter.

right now the team has 3 members; myself and 2 coders.

I have been making many models for the game, mainly fighters and large battle fleet ships.

They are all low poly (160-600 polys depending on the ship).  I know your thinking 160 polys?

But the model look decent and will be nice when it's skinned.  Im keeping the poly count low

because of the way the game is setup.  There will not be many zones b/c it is all in space,

and you can see all the ships.  Im not sure how the game will handle each player in their own

vehicle AND many HUGE sized fleet ships.  I mean these things are probably the largest meshes

used in UT2003 so far.  Each one takes over a minute to run across.

any thoughts on how the engine will handle 20-30 large static meshes on screen at once?  most

of them will be vehicles....

more on this later

==Comments ==

'''DJPaul:''' Sorry to post a comment on your journal, but, &quot;any thoughts on how the engine will handle 20-30 large static meshes on screen at once&quot; - depends: if they are the same model, you will notice the same performance hit as if you had just one static mesh.  If they are differentl, each will have to be loaded, thus using more memory.

'''HarvesterUT''' oh dont worry about commenting, thats what its for!  well i figure each faction will have 3-4 different fighters, and

at any given time there might be 4-6 DIFFERENT large static meshes in there as well....so thats maybe 10-12 diff meshes on screen at once.

i figure the upper limit on most large ships will be 1000 and the fighters will be like 300.  you also gotta figure that if 12-16 people

are playing at the same time they each have their own player models and their own vehicle.

'''Original9:''' I wouldn't worry about the polycount. If your models are running around with 2048x2048 textures that takes up a lot of memory bandwidth. If you haves models with 3000~ polys and a 512x512 it'll most likely run fast then a model with 1500~ with 1024x1024. Someone correct me if I'm wrong. ;)</text>
    </revision>
    <revision>
      <id>3601</id>
      <timestamp>2003-07-02T07:52:44Z</timestamp>
      <contributor>
        <ip>Hsdbrg64-110-208-108.sasknet.sk.ca</ip>
      </contributor>
      <comment>HEY?</comment>
      <text xml:space="preserve">===29 APR 2003===

I got one reply from a coder interested in my mod, we chatted, but i never heard back from the guy.

Oh well, i was so close to having the last coding slot filled.  Well i picked up 2 guys who will

doing 2D work for us on a &quot;freelance&quot; basis.  I have been working on the fighter models, and fleet

ship models.  I knew it would be tough putting a team together....and now i REALLY know how hard it

is.  Checking 6-7 forums 2-3 times a day to see if anyone replied to my request posts, and finding

new forums to pimp the mod in.  Every day I am encouraged b/c of the positive response the mod gets.

No one tells me idea sucks....thats a start, right?

===Old===

my mod is Space Conflict, a game that combines Descent, with BF1942, and X-Wing/Tie-Fighter.

right now the team has 3 members; myself and 2 coders.

I have been making many models for the game, mainly fighters and large battle fleet ships.

They are all low poly (160-600 polys depending on the ship).  I know your thinking 160 polys?

But the model look decent and will be nice when it's skinned.  Im keeping the poly count low

because of the way the game is setup.  There will not be many zones b/c it is all in space,

and you can see all the ships.  Im not sure how the game will handle each player in their own

vehicle AND many HUGE sized fleet ships.  I mean these things are probably the largest meshes

used in UT2003 so far.  Each one takes over a minute to run across.

any thoughts on how the engine will handle 20-30 large static meshes on screen at once?  most

of them will be vehicles....

more on this later

==Comments ==

'''DJPaul:''' Sorry to post a comment on your journal, but, &quot;any thoughts on how the engine will handle 20-30 large static meshes on screen at once&quot; - depends: if they are the same model, you will notice the same performance hit as if you had just one static mesh.  If they are differentl, each will have to be loaded, thus using more memory.

'''HarvesterUT''' oh dont worry about commenting, thats what its for!  well i figure each faction will have 3-4 different fighters, and

at any given time there might be 4-6 DIFFERENT large static meshes in there as well....so thats maybe 10-12 diff meshes on screen at once.

i figure the upper limit on most large ships will be 1000 and the fighters will be like 300.  you also gotta figure that if 12-16 people

are playing at the same time they each have their own player models and their own vehicle.

'''Original9:''' I wouldn't worry about the polycount. If your models are running around with 2048x2048 textures that takes up a lot of memory bandwidth. If you haves models with 3000~ polys and a 512x512 it'll most likely run fast then a model with 1500~ with 1024x1024. Someone correct me if I'm wrong. ;)

'''MythOpus:''' Harvester man, wut happend to the mod ?  I go away for awhile , I come back and a new mod for UT2k4 is being made ????</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Health</title>
    <id>1382</id>
    <revision>
      <id>3501</id>
      <timestamp>2006-11-25T23:53:57Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; Health (Package: UnrealShare)}}

Upon pickup, increases a player's &lt;tt&gt;Health&lt;/tt&gt; by &lt;tt&gt;HealingAmount&lt;/tt&gt;.

==Properties==
; int HealingAmount : Amount to increase a player's health by.  Will not cause health to exceed default value (ie go over 100, the default player full health) unless &lt;tt&gt;bSuperHeal&lt;/tt&gt; = &lt;tt&gt;True&lt;/tt&gt;. Default value is 20.

; bool bSuperHeal : If &lt;tt&gt;True&lt;/tt&gt;, allows &lt;tt&gt;Health&lt;/tt&gt; + &lt;tt&gt;HealingAmount&lt;/tt&gt; to exceed default &lt;tt&gt;Health&lt;/tt&gt; up to twice the default value.

==Known Subclasses==
 Health
  +- Bandages &amp;ndash; (HealingAmount = 5)
  +- [[Legacy:NaliFruit|NaliFruit]]
  +- SuperHealth &amp;ndash; (HealingAmount = 100, bSuperHeal = True)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3502</id>
      <timestamp>2005-04-30T13:32:49Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>despam and ban</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; Health}}

Upon pickup, increases a player's Health by HealingAmount.

==Properties ==
; int HealingAmount : Amount to increase a player's health by.  Will not cause health to exceed default value (ie go over 100, the default player full health) unless bSuperHeal = True. Default value is 20.
; bool bSuperHeal : If true, allows Health + HealingAmount to exceed default Health up to twice the default value.

==Known subclasses ==
* Bandages (HealingAmount = 5)
* [[Legacy:NaliFruit|NaliFruit]]
* SuperHealth (HealingAmount = 100, bSuperHeal = True)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HealthPack</title>
    <id>1424</id>
    <revision>
      <id>3602</id>
      <timestamp>2005-12-18T00:55:43Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; HealthPack (Package: XPickups)}}

This is the standard HealthPack Pickup giving 50 points of health to a player by default.

==How it works==

This code is from [[Legacy:UT2003|UT2003]] Build 2225

&lt;uscript&gt;
//=============================================================================
// HealthPack
//=============================================================================
class HealthPack extends TournamentHealth;  // our class and its parent

#exec OBJ LOAD FILE=PickupSounds.uax // the PickupSounds.uax package contains... wait for it... sounds.
#exec OBJ LOAD FILE=E_Pickups.usx    // loading these two files is the only way we can access their contents here in our code.

defaultproperties
{
    Physics=PHYS_Rotating                       // sets our big blue health cross rotating on the xPickupBase.
    RotationRate=(Yaw=24000)                    // sets the speed that it rotates at
    DrawScale=0.4                               // the model is much larger than it appears as in the game. This scales it down.
    PickupSound=sound'PickupSounds.HealthPack'  // the sound you hear when you pick it up.
    PickupForce=&quot;HealthPack&quot;  // jdf
    DrawType=DT_StaticMesh                      // if you want to use a static mesh for the object, you have to tell the engine.
    StaticMesh=StaticMesh'E_Pickups.MidHealth'  // this is the particular static mesh we want to use.   
    CollisionRadius=32.0                        // determines how close to the object you must be to pick it up.
    HealingAmount=25                            // how much healing it does
    Style=STY_AlphaZ
    ScaleGlow=0.6
}
&lt;/uscript&gt;

The Health pickup line of classes aren't very big or complicated, they get most of their functionality from the [[Legacy:TournamentPickup|TournamentPickup]] and [[Legacy:Pickup|Pickup]] classes.

==Related Topics==
* [[Legacy:Inventory Item Placement|Inventory Item Placement]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3603</id>
      <timestamp>2005-07-16T13:18:43Z</timestamp>
      <contributor>
        <ip>CPE0080c8b807b3-CM00111a59bdc0.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; HealthPack (Package: XPickups)}}

==How it works==

This code is from [[Legacy:UT2003|UT2003]] Build 2225

&lt;uscript&gt;
//=============================================================================
// HealthPack(UT2003)
//=============================================================================
class HealthPack extends TournamentHealth;  // our class and its parent

#exec OBJ LOAD FILE=PickupSounds.uax // the PickupSounds.uax package contains... wait for it... sounds.
#exec OBJ LOAD FILE=E_Pickups.usx    // loading these two files is the only way we can access their contents here in our code.

defaultproperties
{
    Physics=PHYS_Rotating                       // sets our big blue health cross rotating on the xPickupBase.
    RotationRate=(Yaw=24000)                    // sets the speed that it rotates at
    DrawScale=0.4                               // the model is much larger than it appears as in the game. This scales it down.
    PickupSound=sound'PickupSounds.HealthPack'  // the sound you hear when you pick it up.
    PickupForce=&quot;HealthPack&quot;  // jdf
    DrawType=DT_StaticMesh                      // if you want to use a static mesh for the object, you have to tell the engine.
    StaticMesh=StaticMesh'E_Pickups.MidHealth'  // this is the particular static mesh we want to use.   
    CollisionRadius=32.0                        // determines how close to the object you must be to pick it up.
    HealingAmount=25                            // how much healing it does
    Style=STY_AlphaZ
    ScaleGlow=0.6
}
&lt;/uscript&gt;

The Health pickup line of classes aren't very big or complicated, they get most of their functionality from the [[Legacy:TournamentPickup|TournamentPickup]] and [[Legacy:Pickup|Pickup]] classes.

==Subclasses==
*None

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3604</id>
      <timestamp>2005-07-16T13:19:11Z</timestamp>
      <contributor>
        <ip>CPE0080c8b807b3-CM00111a59bdc0.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; HealthPack (Package: XPickups)}}

==How it works==

This code is from [[Legacy:UT2003|UT2003]] Build 2225

&lt;uscript&gt;
//=============================================================================
// HealthPack
//=============================================================================
class HealthPack extends TournamentHealth;  // our class and its parent

#exec OBJ LOAD FILE=PickupSounds.uax // the PickupSounds.uax package contains... wait for it... sounds.
#exec OBJ LOAD FILE=E_Pickups.usx    // loading these two files is the only way we can access their contents here in our code.

defaultproperties
{
    Physics=PHYS_Rotating                       // sets our big blue health cross rotating on the xPickupBase.
    RotationRate=(Yaw=24000)                    // sets the speed that it rotates at
    DrawScale=0.4                               // the model is much larger than it appears as in the game. This scales it down.
    PickupSound=sound'PickupSounds.HealthPack'  // the sound you hear when you pick it up.
    PickupForce=&quot;HealthPack&quot;  // jdf
    DrawType=DT_StaticMesh                      // if you want to use a static mesh for the object, you have to tell the engine.
    StaticMesh=StaticMesh'E_Pickups.MidHealth'  // this is the particular static mesh we want to use.   
    CollisionRadius=32.0                        // determines how close to the object you must be to pick it up.
    HealingAmount=25                            // how much healing it does
    Style=STY_AlphaZ
    ScaleGlow=0.6
}
&lt;/uscript&gt;

The Health pickup line of classes aren't very big or complicated, they get most of their functionality from the [[Legacy:TournamentPickup|TournamentPickup]] and [[Legacy:Pickup|Pickup]] classes.

==Subclasses==
*None

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HealthVial</title>
    <id>1441</id>
    <revision>
      <id>3634</id>
      <timestamp>2006-02-20T13:08:25Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==HealhVial==

This is the actor class for the little blue health vials that add 5 to your health to a maximum of 199. It has bSuperheal set to true.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Heinz57</title>
    <id>1417</id>
    <revision>
      <id>3585</id>
      <timestamp>2003-06-06T19:49:05Z</timestamp>
      <contributor>
        <ip>Heinz57</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hello.

----

'''Mychaeel:''' Welcome to the Unreal Wiki, Heinz57.  Feel free to change this page to your liking.  :-)

'''Heinz57:''' Thanks!  What a wicked site.  Invaluable, really.  I feel like modding till the sun goes down (or I run out of coffee, whichever comes first :-o).  There are some great resources here :-).

Cheers.

'''Tarquin:''' Welcome to the site :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3586</id>
      <timestamp>2003-05-30T18:35:23Z</timestamp>
      <contributor>
        <ip>Heinz57</ip>
      </contributor>
      <comment>I feel like a geek with a purpose, again!</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Unreal Wiki, Heinz57.  Feel free to change this page to your liking.  :-)

'''Heinz57:''' Thanks!  What a wicked site.  Invaluable, really.  I feel like modding till the sun goes down (or I run out of coffee, whichever comes first :-o).  There are some great resources here.  And I love the editablity.  Loads of fun.  My fiancee is feeling neglected ;-)

Cheers.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3587</id>
      <timestamp>2003-05-30T18:41:33Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Unreal Wiki, Heinz57.  Feel free to change this page to your liking.  :-)

'''Heinz57:''' Thanks!  What a wicked site.  Invaluable, really.  I feel like modding till the sun goes down (or I run out of coffee, whichever comes first :-o).  There are some great resources here.  And I love the editablity.  Loads of fun.  My fiancee is feeling neglected ;-)

Cheers.

'''Tarquin:''' Welcome to the site :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hellkeeper</title>
    <id>1448</id>
    <revision>
      <id>3645</id>
      <timestamp>2007-12-12T12:31:45Z</timestamp>
      <contributor>
        <ip>Poa78-1-87-88-58-237.dsl.club-internet.fr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Hellkeeper==

I'm a generic and useless french mapper. You can find me on http://hellkeeper.net/ . Some code improvements have recently made HK.net accessible from any browser. Mail is Hellkeeper@Hotmail.fr

currently 5 maps realeased (and a freestyle map : cockpit.ut2)

I wrote about 45 tutorials about unrealed 1.0, 2.0 ans 3.0. A full list is available at hellkeeper.net. Nothing special to say by now.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3646</id>
      <timestamp>2007-12-10T16:12:36Z</timestamp>
      <contributor>
        <ip>Hellkeeper</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Hellkeeper==

I'm a generic and useless french mapper. You can find me on http://hellkeeper.net/ . This is a temporary webiste. Mail is Hellkeeper@Hotmail.fr

currently 5 maps realeased (and a freestyle map : cockpit.ut2)

I wrote about 45 tutorials about unrealed 1.0, 2.0 ans 3.0. A full list is available at hellkeeper.net. Nothing special to say by now.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11671</id>
      <timestamp>2008-05-01T07:35:56Z</timestamp>
      <contributor>
        <username>Hellkeeper</username>
        <id>245</id>
      </contributor>
      <minor/>
      <comment>Removing all content from page</comment>
      <text xml:space="preserve" />
    </revision>
    <revision>
      <id>11673</id>
      <timestamp>2008-05-01T15:34:31Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <comment>Redirecting to [[User:Hellkeeper]]</comment>
      <text xml:space="preserve">#REDIRECT [[User:Hellkeeper]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hello</title>
    <id>1445</id>
    <revision>
      <id>3640</id>
      <timestamp>2007-01-02T09:38:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>locked/redirected to Chongqing Page</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Chongqing Page|Chongqing Page]]</text>
    </revision>
    <revision>
      <id>3641</id>
      <timestamp>2007-01-02T08:55:47Z</timestamp>
      <contributor>
        <ip>Ice.130.client212.icenet.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hello, nice site look this:

&lt;a href= http://gatrell.carauto-insurance.org/car-insurance-td.html &gt;car insurance td&lt;/a&gt; [url=http://gatrell.carauto-insurance.org/car-insurance-td.html]car insurance td[/url]

&lt;a href= http://gatrell.carauto-insurance.org/car-insurance-types.html &gt;car insurance types&lt;/a&gt; [url=http://gatrell.carauto-insurance.org/car-insurance-types.html]car insurance types[/url]

&lt;a href= http://gatrell.carauto-insurance.org/car-insurance-tennessee.html &gt;car insurance tennessee&lt;/a&gt; [url=http://gatrell.carauto-insurance.org/car-insurance-tennessee.html]car insurance tennessee[/url]

&lt;a href= http://gatrell.carauto-insurance.org/car-insurance-the-cheapest.html &gt;car insurance the cheapest&lt;/a&gt; [url=http://gatrell.carauto-insurance.org/car-insurance-the-cheapest.html]car insurance the cheapest[/url]

End ^) See you</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HelloWeb</title>
    <id>1387</id>
    <revision>
      <id>3515</id>
      <timestamp>2007-02-20T02:12:36Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:WebApplication|WebApplication]] &gt;&gt; HelloWeb (Package: UWeb)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:WebApplication|WebApplication]] &gt;&gt; HelloWeb (Package: UWeb)}}

This is a sample web application, to demonstrate how to program for the web server.

To use it open UnrealTournament.ini, search the &lt;tt&gt;[UWeb.WebServer]&lt;/tt&gt; section and add
  Applications[x]=&quot;UWeb.HelloWeb&quot;
  ApplicationPaths[x]=&quot;/hello&quot;
  bEnabled=True

(Change &quot;x&quot; to the first unused slot, usually 2.)

Then start a dedicated UT server and open a web browser. Type ''&lt;tt&gt;&lt;nowiki&gt;http://&lt;/nowiki&gt;&lt;/tt&gt;&lt;i&gt;server-ip&lt;/i&gt;&lt;tt&gt;/hello&lt;/tt&gt;'' as address and play around with the pages. The user name and password are both &quot;test&quot;.

==HelloWeb code ==

&lt;uscript line&gt;
class HelloWeb extends WebApplication;

/* Usage:
This is a sample web application, to demonstrate how to program for the web server.

[UWeb.WebServer]
Applications[0]=&quot;UWeb.HelloWeb&quot;
ApplicationPaths[0]=&quot;/hello&quot;
bEnabled=True

http://server.ip.address/hello
*/

event Query(WebRequest Request, WebResponse Response)
{
	local int i;

	if(Request.Username != &quot;test&quot; || Request.Password != &quot;test&quot;)
	{
		Response.FailAuthentication(&quot;HelloWeb&quot;);
		return;
	}		

	switch(Request.URI)
	{
	case &quot;/form.html&quot;:
		Response.SendText(&quot;&lt;form method=post action=submit.html&gt;&quot;);
		Response.SendText(&quot;&lt;input type=edit name=TestEdit&gt;&quot;);
		Response.SendText(&quot;&lt;p&gt;&lt;select multiple name=selecter&gt;&quot;);
		Response.SendText(&quot;&lt;option value=\&quot;one\&quot;&gt;Number One&quot;);
		Response.SendText(&quot;&lt;option value=\&quot;two\&quot;&gt;Number Two&quot;);
		Response.SendText(&quot;&lt;option value=\&quot;three\&quot;&gt;Number Three&quot;);
		Response.SendText(&quot;&lt;option value=\&quot;four\&quot;&gt;Number Four&quot;);
		Response.SendText(&quot;&lt;/select&gt;&lt;p&gt;&quot;);
		Response.SendText(&quot;&lt;input type=submit name=Submit value=Submit&gt;&quot;);
		Response.SendText(&quot;&lt;/form&gt;&quot;);
		break;
	case &quot;/submit.html&quot;:
		Response.SendText(&quot;Thanks for submitting the form.&lt;br /&gt;&quot;);
		Response.SendText(&quot;TestEdit was \&quot;&quot;$Request.GetVariable(&quot;TestEdit&quot;)$&quot;\&quot;&lt;p&gt;&quot;);
		Response.SendText(&quot;You selected these items:&lt;br&gt;&quot;);
		for(i=Request.GetVariableCount(&quot;selecter&quot;)-1;i&gt;=0;i--)
			Response.SendText(&quot;\&quot;&quot;$Request.GetVariableNumber(&quot;selecter&quot;, i)$&quot;\&quot;&lt;br&gt;&quot;);
		break;
	case &quot;/include.html&quot;:
		Response.Subst(&quot;variable1&quot;, &quot;This is variable 1&quot;);
		Response.Subst(&quot;variable2&quot;, &quot;This is variable 2&quot;);
		Response.Subst(&quot;variable3&quot;, &quot;This is variable 3&quot;);
		Response.IncludeUHTM(&quot;testinclude.html&quot;);
		break;
	default:		
		Response.SendText(&quot;Hello web!  The current level is &quot;$Level.Title);
		Response.SendText(&quot;&lt;br&gt;Click &lt;a href=\&quot;form.html\&quot;&gt;this link&lt;/a&gt; to go to a test form&quot;);
		break;
	}
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3516</id>
      <timestamp>2007-02-19T21:57:16Z</timestamp>
      <contributor>
        <ip>58-65-236-1.myrdns.com</ip>
      </contributor>
      <comment>Unknown</comment>
      <text xml:space="preserve">

&lt;a href=&quot; http://volny.cz/sukinah/levitra/index.html &quot;&gt;levitra&lt;/a&gt;

&lt;a href=&quot; http://volny.cz/sukinah/levitra/Buy-Levitra.html &quot;&gt;buy levitra&lt;/a&gt;

&lt;a href=&quot; http://volny.cz/sukinah/levitra/Levitra-Online.html &quot;&gt;levitra online&lt;/a&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Help Desk</title>
    <id>1405</id>
    <revision>
      <id>3556</id>
      <timestamp>2008-01-31T02:00:49Z</timestamp>
      <contributor>
        <ip>204-83-254-227.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>Response For LavaVolume</comment>
      <text xml:space="preserve">Got a problem? Post your question here and we'll attempt to answer it. 

==Read Before Posting==

{{innerbox| A Wiki is not the ideal way to carry on long discussions. '''BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums] are recommended instead'''.

}}

===Before Posting===

The question that you plan on asking '''may have already be answered''', either here or elsewhere. Before posting, please:

* Scan this page
* [[Legacy:Search|Search]] the Wiki
* Search the [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums]

===When Posting===

When posting a question, please:

* Use correct [[Legacy:Wiki Markup|wiki markup]]
* Give your question a heading (level 3)
*''' Post your question above all other questions to avoid scrolling through older ones!'''

===After Posting===

After you have received an answer to your question, please:
* Write up the information somewhere on the site. This may involve refactoring the text from this page or a complete rewrite
* '''Remove the question and answer from this page'''
* Delete any images you uploaded to show the problem

If you see a question or discussion that has been idle for over three weeks, '''remove the question and answer.'''

==Questions==

===Expontiental Damage in a Lava Field===

I have been trying to write a script for exponiental lava damage following the inverse square law. Basically, a lavavolume that deals more damage to the player the closer it gets to the center of the lava. I've found everything I need except for a way to input the player's position. Is there any function that can call a player's x,y, and z coordinates?

'''MythOpus:''' Yes... and no.  There is a function in LevelInfo called GetLocalPlayerController.  It can be accessed using Level.GetLocalPlayerController.  This will return the clients player controller.  From there you simply need to get the location of the pawn.  This will work wonders if it'll be used offline.  The problems might start while online.  I'm not sure if it'll work properly without simulating or replication but you can always try.

===Problem Loading Maps===

'''SenorDoom:''' I'm trying to load a map from one computer into another and keep receiving this error.

History: ULinkerLoad&lt;&lt;FName &lt;- (LinkerLoad Package.LinkerLoad195 262305)) &lt;- FPoly&lt;&lt; &lt;- UPolys::Serialize &lt;- LoadObject &lt;- (Polys myLevel.Polys6081 262305==262305/1193606 111461 180953) &lt;- ULinkerLoad::Preload &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::Exec_Map &lt;- UEditorEngine::Exec &lt;- (MAP LOAD FILE=&quot;L:\royZach_map1.ut2&quot;) &lt;- UUnrealEdEngine::Exec &lt;- FileOpen &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- MessagePump &lt;- MainLoop

I've been unsuccesful finding any help with this at all.

'''Raven:''' There is an error in loading up a brush. Possible that it an error coming in from something else. Are you using any custom packages (code, static meshes, textures, ect)?

'''SenorDoom:''' No, I'm not using any custom pacakages, its all from prefabs.

'''Raven:''' Another thing to check is that verion of UT on the computer that you are moving to is the same as the one you are comming from. (i.e. both are patched the same)

===Editing Shaders ===

'''Hellborg:''' UT3, I would like to modify the standard postprocess (DOFAndBloomBlendPixelShader) used in Unreal Tournament 3. In the UT3 tech based Roboblitz I can simply edit the postprocess by directly editing the file DOFAndBloomBlendPixelShader.usf in the Engine/Shaders folder with notepad. I then simply remove the shadercache, run roboblitz, and the new shadercode is used. I can thereby implement cartoon shading in roboblitz. I tried the same with UT3, deleted the shadercashe (files RefShaderCache-PC-D3D-SM2.upk,RefShaderCache-PC-D3D-SM3.upk and RefShaderCache-PC-D3D-SM4.upk and edited DOFAndBloomBlendPixelShader.usf in notepad. However, the game gives a runtime error on startup even after the tiniest change in the shader script. I am sure,that the shader code is still fine - just changing a single constant produces this error. There is also no information given by the error message. Do I need to change certain configuration files to allow modified shader script, or is there a more general problem with my method in UT3? Or, is there a more elegant way to add a custom postprocess to the whole game scene? I asked this question in many formus already, but nobody seems to have a clue...

===Third Person View ===

'''Stick:''' UT99, I would like to use UT in third Person view, using behindview 1 works, but the crosshair is not there, and the camera is at a bad angle, i have used a mutator called 'Bullet time 3.00' it fixes this, but i dont like the rest of the things on that mutator, i would like to know how to do this without out.

===Polys Visible through walls &quot;In-Game&quot; ===

'''VENOM:''' UT99, I can &quot;see&quot; ALL my polys through walls, I have an open area map with a building in the middle, I can stand outside next to the wall and see the polycount (stat global) through the wall 900+!!, outside is about 300 polys, I can find nothing on this subject, and yes the wall is solid bsp, anyone?

===SmallNavigationPoint/Timer() ===

'''vitaloverdose'''Ive been updating my vehicle booster script and a lot of people have suggested using a navigation point for the parent class. Ive re-written the script using smallnavigation point as the parent but i cant get the timer function to fire. Is the the function available using small navigation point as a parent?   

===Scriptable Trigger===

'''Sopa de letras:''' I miss a scriptable trigger for UT1. I wish all triggering functions and conditions would be merged in one trigger :(. It's so time consuming to make chains of different triggers :(

===Weapons Slowing Down Player When Holding It===

'''Fey''':  I've been working for quite some time trying to figure out how to simulate weapons having weight.  The idea being that if you were holding a gun in your hand, it would slow you down by some arbitrary amount.  But if you changed that gun out for another one you'd speed back up again.  Over the past several days I've hit several dead ends in trying to do this.  Currently I'm thinking that I'm going to need to put a timer on somthing and then find a way to check if the characters are holding the gun, perhaps on the pawn that might be using the weapon.  I can't seem to find a good page explaing (this is my first mutator ever) how timers work, and what functions might close them.  I read on the inventory class page discription that timers are unmade in some functions.  If I try to put a timer on a pawn, will it get erased after the pawn dies, or some other event that I may not realize?  If so, I'll have to recrete the timer everytime the pawn spawns, I guess via ModifyPlayer().  

Is using a timer really the best way to do this?  I'm still trying to find a function on weapon or inventory that might trigger when a weapon is being readied or unreadied, but in the past few days I've not been able to find anything worked.  I've also not been able to find a pre-existing mutator code that makes somthing happen when the player is holding a weapon, so I've got nothing to experiment with.

'''MythOpus:'''  I suggest that instead of using the mutator to do the guts of what you're trying to do, use an [[Legacy:Interaction|Interaction]] instead.  You could do what you're proposing in the Tick function.

===Command Prompt/UCC Issue===

'''VerteX''': Command Prompt being strange

everytime i compile a code, it parsers, compiles, imports, then when it's done, it gives me warning 

Warning: Failed to load 'UberLinkGun.u': Can't find file 'UberLinkGun.u'

Warning: Failed loading package: Can't find file 'UberLinkGun.u'

Log: Analyzing...

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\DamTypeUberLinkGun.uc)

Log: Class: DamTypeUberLinkGun extends DamTypeRocket

Log: Imported: Class UberLinkGun.DamTypeUberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGun.uc)

Log: Class: UberLinkGun extends LinkGun

Log: Imported: Class UberLinkGun.UberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunAttach.uc)

Log: Class: UberLinkGunAttach extends LinkAttachment

Log: Imported: Class UberLinkGun.UberLinkGunAttach

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunFire.uc)

Log: Class: UberLinkGunFire extends LinkAltFire

Log: Imported: Class UberLinkGun.UberLinkGunFire

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunPickup.uc)

Log: Class: UberLinkGunPickup extends LinkGunPickup

Log: Imported: Class UberLinkGun.UberLinkGunPickup

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunProj.uc)

Log: Class: UberLinkGunProj extends RocketProj

Log: Imported: Class UberLinkGun.UberLinkGunProj

Log: Parsing UberLinkGunAttach

Log: Parsing DamTypeUberLinkGun

Log: Parsing UberLinkGun

Log: Parsing UberLinkGunPickup

Log: Parsing UberLinkGunProj

Log: Parsing UberLinkGunFire

Log: Compiling UberLinkGunAttach

Log: Compiling DamTypeUberLinkGun

Log: Compiling UberLinkGun

Log: Compiling UberLinkGunPickup

Log: Compiling UberLinkGunProj

Log: Compiling UberLinkGunFire

Log: Importing Defaults for UberLinkGunAttach

Log: Importing Defaults for DamTypeUberLinkGun

Log: Importing Defaults for UberLinkGun

Log: Importing Defaults for UberLinkGunPickup

Log: Importing Defaults for UberLinkGunProj

Log: Importing Defaults for UberLinkGunFire

Log: Success: Compiled 43 line(s), 9 statement(s).

Log: Save=205.184198

Log: Moving '\System\Save.tmp' to '\System\UberLinkGun.u'

Warning: Failed to load '\System\UberLinkGun': Can't find file '\System\UberLinkGun'

Warning: Failed loading package: Can't find file '\System\UberLinkGun'

Warning: Error loading \System\UberLinkGun !!!

Log: Success - 0 error(s), 1 warning(s)

Exit: Preparing to exit.

Log: Purging garbage

Log: Unbound to Core.dll

Log: Unbound to Editor.dll

Log: Unbound to Engine.dll

Exit: Editor shut down

Log: Unbound to Fire.dll

Log: Unbound to IpDrv.dll

Log: Unbound to UWeb.dll

Log: Unbound to XGame.dll

Log: Unbound to XInterface.dll

Log: Unbound to Onslaught.dll

Log: Garbage: objects: 73914-&gt;0; refs: 0

Exit: Object subsystem successfully closed.

Exit: Exiting.

Log: FileManager: Reading 0 GByte 112 MByte 940 KByte 709 Bytes from HD took 0.836996 seconds (0.570996 reading, 0.266000 seeking).

Log: FileManager: 0.149000 seconds spent with misc. duties

Uninitialized: Name subsystem shut down

Uninitialized: Allocation checking disabled

Uninitialized: Log file closed, 07/15/07 15:19:17

MV was what i was trying to compile...i have no idea what to do seeing as it used to work, but recently it started giving me that warning

===Forum Issues===

'''StarWeaver''': This probably really isn't the place for this but I'm hoping someone here can point me in the right direction. My forums.beyondunreal account (same name) is totally locked down (can't post, can't PM, don't exist in the user list). I've tried emailing the contact link and haven't gotten a response in about a week, and I don't have any idea who else to talk to. I don't really want to create a new user ID if I can help it. Thanks, and sorry for the inappropriate topic.

===Question about native classes===

'''Illiander''' I'm trying to make a UT2k4 vehicle that switches between a wheeled car-type, and a flyer.  Basic problem, when I try to extend ONSVehicle, and just copy in all of ONSChopperCraft, it doen't pick up on any of the movement inputs.  Same with ONSWheeledCraft.  But when I extend those classes it picks up on the inputs.  Am I doomed to failure in this, or is there some way for me to pick up on movement commands in UScript?

===Question===

'''vertex''' I have an assault level i am making for my family to use for fun. I thought (since i'm the only mapper), that'd i'd make a little sniping area with a non-solid brush over it with the outside texture matching the wall and the inside texture transparent. The problem is, when i test it, the defending bots (who appear by a weapon locker with sniper rifles) kill me everytime i go to my secret place. Is there a way around that, so that people and bots can't see me, but i can see them and shoot them.

===Questions about certain errors===

Jameso123 

I have had a problem with UnrealED 3 i got with UT 2004 whan i start the editor the part where the vieworts should be are just white all the other stuff is working, there just isnt any viewports

'''shadow21''' I've been having a problem with UT99, I'm trying to compile a mod, and I'm having troubles with the Mesh=LODMesh'' command, the error that pops up is 'bad expression in '=', what should I do, I'm at a loss here =( any help at all will be appreciated.

===Replication : Forcing client update for &quot;prone&quot; Pawn===

'''SuperApe:''' I have a Pawn class that is updated (Physics, Location, Rotation, AnimSequence &amp; Anim frame) on Clients only when the Player has a line of sight to it.  Since this Pawn is prone (not moving, not animating), there is no reason for the bNetDirty to update this Actor.  Is there a simple way to make sure this Pawn is properly updated '''before''' the Player sees it?

'''SuperApe:''' Is this question clear enough?  Anyone have a suggestion, solution or comment on this problem?

'''Graphik:''' You've not properly explained what you're trying to accomplish or how you're trying to do it.

In case I've mentally translated your unworkable description into something partway logical: How is your code going to guess when the Player is about to change his line of sight so as to 'properly update before the player sees it'?

'''EricBlade:''' I would guess off hand that actually doing all this checking for line of sights is probably more costly than just letting the regular relevance code do what it's supposed to do?

'''SuperApe:''' Thank you.  What I mean by updating before the player sees it, is to make a ''one-time'' forced update (from the default setting of a property, which the Client has automatically, to the setting this prone Pawn should have on the Server), perhaps at map start.  For example, my Pawn should be set to PHYS_None (because of a special state it is in), but the default is PHYS_Falling.  On the server this Physics special setting is known, on the Client it is not (until the Client machine gets an update from the Server).  So, as it is now, the Player on the Client turns a corner, sees the Pawn, the Pawn falls (PHYS_Falling), then after a moment, it updates the Pawn's location, rotation, and Physics, and the Pawn *snaps* back to where it should be.  My question is related to this example.  How can I force this Pawn to update the Physics setting in time to prevent it from falling when the Client Player sees it?  As of yet, I do not have a workable solution.  It appears to me to be a limitation of the Replication scheme.  But, I thought I bring the problem up here, in case anyone would like to help me find a solution.

'''Graphik:''' Your expanded description still leaves me guessing, but I recommend you use the ModifyPlayer function. [[Legacy:Mutator|Mutator]] features a description of the function as well as an example of its use.

'''SuperApe:''' My suspicion is that this is not something that Graphik can help me with. ''(No offense, Graphik)''  But I will try to elaborate one point that appears to have been missed.  Replication, as Unreal uses it by default, causes the above example situation automatically, where the Pawn as it exists on the Client gets an update to important non-default settings on properties such as Physics only after the Client Player has seen it.  Unreal Replication is able to handle elaborate maps because it does not replicate everything all the time, only the bare minimum that's needed, when it's needed, to ''simulate'' what's happening on the Server.  This example I've described above shows that scheme in action, but I am looking for a clever workaround to somehow force this Client Pawn to update either instantly (when the Client Player sees it) perhaps do something that will ensure the Client Pawn is already set to the proper (not the default) Physics setting before this line of sight occurs.  The goal would be to avoid the situation where the Client Players see this Pawn fall and then snap back to the proper location a moment later (depending on current netspeed conditions).  IOW, I have not coded some nifty line of sight stuff, this is just how Unreal Replication works now.  I'm looking for some kind of override, so the Client Pawn does not rely on it's default property setting.  I would consider whatever workaround works, and use it on other properties as well, such as Animation-related properties, etc.

'''EricBlade:''' bAlwaysRelevant ?

'''SuperApe:''' I thought about that.  It seemed like overkill for a prone Pawn, but at the moment that appears to be the only working idea I've run across.  I'm also not sure how well that property works, being switched on/off, which I would want to do if this Pawn is in it's special state, and when it leaves it and should act more like a normal Pawn on Clients.  Thanks for the idea. :)  Hopefully a more economical idea can be found as well.

'''EricBlade:''' Seems like months since I last looked at this page, but it should probably work pretty well - if you set it bAlwaysRelevant, and it's not doing anything, it shouldn't cause any major changes in net traffic, as it'll do it's replication stuff when the player connects, but then otherwise it isn't doing anything.  As far as I can tell, setting bAlwaysRelevant on and off works pretty well - I've seen several Land of the Dead maps that have used a Security Camera type thing, but had to install a volume that makes whatever enters it bAlwaysRelevant, so that you could monitor things in a remote room (pawns would not be relevant halfway across the map, so you couldn't see them on remote cameras)

'''EntropicLqd:''' I'm guessing you've solved this problem by now.  But, wouldn't it be possible to use the bAlwaysRelevant flag with an inventory object?  It seems like a really ugly hack work around to me ... just an off the wall idea.  It's probably crazy though. 

===Control point status dissapearing from hud.===

'''plugwash''': a friend of mine has made a domination map based on the hall of champions (original UT) it works fine singleplayer but in netplay the control point status usually dissapears from the hud on first death (i think at least one control point captured by someone is also a prerequisite to the dissapearance). Ive tried removing all actors that seem to be designed for that map and even exporting and re-importing into a new map but still the issue persists any ideas on what this could be or how to track it down?

===REPLICATING A VARIABLE===

I having a problem with replication. For the past 2 weeks all I have been doing is researching it and nothing can barely explain it. I understand some of it, or at least I think I do. No replication I make works, at all, in any cases. It is just getting to me too much, how it simply does not work.

Anyways I wrote this script. Remember, some coding in this may seem &quot;noobish&quot; but this is just practice for me you could say. What it does is when this item is added to your inventory, it takes the value of an array in another actor. The variable is called LastPlayed. This value is not replicated to the client. So what I'm trying to do here is (since I cant replicate a variable that exists in another actor I didnt make) is assign the value of LastPlayed to ClientIP and then replicate ClientIP over to the client where they process it.

Here is the class...

&lt;uscript&gt;//==============================================================================
class ClientAKA extends Inventory config(AKACheckerLog);

var config string ClientLP[6000];

Replication
{
	reliable if(ROLE==ROLE_Authority)
		ClientLP;
}

simulated function PostBeginPlay()
{
	local AKA a;
	local int i;

	log(&quot;Stage1&quot;);
	Super.PostBeginPlay();

	log(&quot;Stage2&quot;);
	foreach AllActors(Class'AKA', a)
		break;

	if(Level.NetMode == NM_DedicatedServer)
	{
		log(&quot;Stage3&quot;);
		for(i=0; i&lt;6000; i++)
		{
			ClientLP[i]=a.LastPlayed[i];
		}
	}
	LogAKA();
	SaveConfig();
}

simulated function LogAKA()
{
	local int i;

	log(&quot;Stage4&quot;);
	if(Level.NetMode != NM_DedicatedServer)
	{
		log(&quot;Stage5&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logging...&quot;);
		log(&quot;v*************************-AKA Checker-*************************v&quot;);
		for(i=0; i&lt;20000 &amp;&amp; ClientLP[i]!=&quot;&quot;; i++)   //log the aka log in their ut log file
		{
			log(&quot;LastPlayed[&quot;$i$&quot;]=&quot;$ClientLP[i]);
		}
		log(&quot;^*************************-AKA Checker-*************************^&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logged the AKA.ini to your UNREALTOURNAMENT.LOG in your UT system directory.&quot;);
	}
}&lt;/uscript&gt;

I cant see what is being doen wrong, ywt ClientIP simply wont replicate. I've tried several techneques and to replicate this variable NONE of them work. For weeks I've been working on this exact mod which is so exausting seeing as I have no more resources. And I also have several other mods that dont work souly because of replication. Can anyone help me?

'''Xian:''' Well, although I don't have experience with UE2, the same principles as in UE1 should apply. From what I seem to remember, arrays can't be replicated. The only way to do it is the nooby hack that seems to go like this:

&lt;uscript&gt;
class Test extends Whatever;

var string Testers[3];

replication
{
    reliable if (Role == ROLE_Authority)
        ClientStuff;
}

function ServerStuff ()
{
    local int i;

    Testers[0] = &quot;Me&quot;;
    Testers[1] = &quot;You&quot;;
    Testers[2] = &quot;Other&quot;;

    for (i = 0; i &lt; ArrayCount(Testers); ++ i)  
       ClientStuff(Testers[i],i);
}

simulated function ClientStuff (string Entry, int i)
{
    Testers[i] = Entry;
}&lt;/uscript&gt;

Also, as you have probably guessed, the class you are using to replicate things (Weapon, Info, Actor, Emitter etc.) has to exist on both server and client. You chose Inventory, which exists on both sides IF it was spawned on the server. Also, giving it to the player and adding it to the chain ensures the simulation of the class' functions (as well as setting it to SimulatedProxy which, iirc Inventories have them). I used ArrayCount to show you a nice way to get the number of elements in case you didn't know it :)

I know that hack sucks, but it is the only way to do it (from what I know). Or at least, to do it in UE1. Hope it helps.

===Change Direction of Weapon Spin===

'''UltraN00b:''' I'm creating a level for UT2004, in which the weapon bases rotate around the inside of a large cylinder.  While the weapons rotate around the cylinder, they angle of the weapon changes as well.  This looks great, except for the fact that they still rotate on their horisontal axis.  

Is there any way to change the direction of the weapon's spin while on the weapon pad?  Tilt the rotation so they still apear to rotate normaly, but at a different angle?

===Opening Classes===

'''Tgusagalpa:''' I'm starting a mutator that a Pawn recieves the weapon they are shot with.  Should I reference the gun they are shot with through Instigator.Weapon '''or''' Projectile properties? 

'''Xian:''' So if I got it straight... you shoot me with a SnowGun (yes I am original :P) and I'll receive it either when being shot, either after respawning, right ? (well for short you want to know how to &quot;save&quot; it, as you said, reference, the Attacker's weapon, correct ?).

It's even simpler than that. You use TakeDamage() and then do InstigatedBy.Weapon (or whatever parameter name it has since it can vary). Hmm from a quick glance at the source now, I see you can use the GameRules class to hook in the game ReduceDamage function (it uses the pointer GameRulesModifiers iirc). And you can do your thing there :)

===Crashing during garbage collection??===

'''EricBlade:''' I am getting reports of crashing on level change, from people who are running my custom [[Legacy:Land Of The Dead|Land of the Dead]] game type.  We are so far unable to find a condition that specifically triggers it, but after a period of time, typically ranging from an hour to two or three hours, and anywhere from 1 to 10 level changes, the server will crash on level change.  It appears to me that it is happening during Garbage Collection at the end of level, as the following from the log shows:
 Log: Collecting garbage
 Log: Purging garbage
 Critical: UObject::GetPathName

.. it crashes at this same point on nearly all of the crashes that i've been sent logs for.  What could I be doing that would cause this?

'''Xian:''' I'd have to see the source but my quickest guess would be an object still has an actor pointer that wasn't set to None and/or an Actor has an Object pointer which is not set to None on Destroyed() events. Generally speaking if it's &quot;in use&quot; it can't be deleted and it will create that problem.

'''EricBlade:''' Hm.  That's what I'd thought might be the problem, except that I don't have any code that references actors or objects in this, except in local variables, so i'm pretty confused as to how my code would be causing something like this.  A couple of people have told me that they have run the stock game for days without crashing, but we are getting incredibly regular crashes with mine in use.  .. almost every variable in here that's not local is a string, int, float, or bool .. i did just notice that i had a class variable set to a string, in default properties, but it looks like the engine handled converting that to the proper class.  Haven't got back with the server guy yet to try it.. :|

Here's a link to the code: http://pastebin.com/714417  

And here's a link to the most recent crashlog: http://pastebin.com/714329

'''Plugwash:''' If you really care about bandwidth shouldn't you set stuff up so you can monitor it at the IP level?

'''Nobody:''' I'd rather set it than monitor it. 

'''Plugwash:''' but monitoring it on a per client ip/port combination basis would allow you to tell for sure if your attempts to set it had worked correctly. 

===PSK?===

'''tgusagalpa:''' Is there any way to create a .psk file for uPaint, when exporting from maya, instead of having to ActorX?  I know on the PLE you cannot have ActorX, so how do you export, and get a .psk? 

===Adding a MESH NOTIFY===

'''SuperApe:''' I see in SkaarjPack_rc.SkaarjMeshes, there are the MESH definitions including the Animation NOTIFY declarations using #exec directives.  I'd like to add some NOTIFYs to this list.  For example, the Skaarjw Mesh animation sequence 'guncheck' should have the Sound'blade1s' play.  I'm trying to define a FUNCTION=PlayGunCheckSound from my own Skaarj subclass and having no luck using this command:

&lt;uscript&gt;#exec MESH NOTIFY MESH=Skaarjw SEQ=guncheck TIME=0.2 FUNCTION=PlayGunCheckSound&lt;/uscript&gt;

Without changing SkaarjPack_rc.SkaarjMeshes, is there any place I can append to this list of MESH NOTIFYs?  Where does SkaarjPack_rc.SkaarjMeshes get used/read?

Anyone have info on adding to the MESH NOTIFY list?

'''Xian:''' I am not sure if you have to redefine the mesh, anim and texture redefinitions by reimporting it into your own class, but it should, theoretically work without it if you did it right. I assume we are talking about UE1 here ?

'''SuperApe:''' Actually, we're talking about adding a Mesh Notify to an existing VertexMesh in UE2.

===Crouching with new model size.===

'''Stinky:''' I have made all the classes in the mod I’m working on larger then or smaller then the default ut model. Everything works accept the crouching. Does anyone know what code to replace to make it so the models don’t fall through the ground when you crouch a lot? Also when I crouch the model stays the same height but the eye height drops to the default for ut 2004, and also the model stays the same size but falls halfway through the ground so the top of the head is at the default height. If I crouch multiple times the model just falls through the ground. Any ideas? 

'''SuperApe:''' Crouching code, including eyeheight changes, is in Pawn and its subclasses.

'''Stinky:''' Well, I have edited the code in a class extending Pawn, When I crouch though, the eye height is correct for the model, but the model falls thought hte ground as if it were the standard UT 2004 heigh. Should i post a screen?

'''SuperApe:''' No need to post a screenie, we get it from your description of the problem.  So, you're extending Pawn.  Did you check the crouch code in Pawn's other subclasses?
 

===GroundSpeed PLEASE HELP!===

'''Stinky:''' I am writing a class system very similar to the RegularEngine but I can’t seem to get the GroundSpeed to change with the class. I then downloaded the RegularEngine and compiled it and realized that the GroundSpeed does not change correctly in the RegularEngine either (The sniper speed is supposed to increase to 550 but it doesn’t). Is there something else I need to do so the GroundSpeed changes with each class? Also to add on to my description, when I use the redemer secondary fire then come back into the player view the running speed does take effect. 

'''Stinky:''' Will someone please help.     I came up with a temp solution but it seems really wrong to do. I set a timer at the beginning of each spawn to adjust the ground speed for a few ticks.

'''SuperApe:''' You're right, that does sound wrong.  So, what you're saying is you're using the same Pawn class, but trying to adjust GroundSpeed?  And this can't be done with a Mutator using ModifyPlayer() or something?

'''Stinky:''' Yeah, the way im doing it now works, but it seems a little too complicated for what i think should be a simple task. I am working on a total conversion so a mutator wont do. Any ideas?

===When running a server is there a file that is viewable that contains all the actor events such as kills and who won/lost the match?===

'''Superflygizmo:''' I have been trying to find a way of logging who won or lost a match into a text file. I'm lost in this department and on the forums i have been on no-one has really given me some specifics on ways of getting around this. Basically i need this info to be written to a text file so that an outside program can see who won etc. People gave me hints on extending the console to do this but i have no idea where to start (total programming novice). But then i thought that if i ran a server on the same machine and had my game connect to it then the server must store this information somewhere as it has to share these results with all the other clients. Its a university project to create a non linear game and i decided to use the unreal engine.to get around loading cutscenes and different endings i decided that i could use a program called macromedia director to do all the level loading. As the maps must have multiple exits i thought that if i made a game type mod that when you reached exit 1  you ranked first in the level,exit two you ranked second and so forth. Then this outcome would be written to a text file that director could read and then director would interpret these results and know which level to load. I just dont really know which way to turn. Please help!!!

'''Sweavo:''' You're crazy if you think you can do this with no scripting!  But what you want to do is not too hard once you understand how to script.  Look in the wiki for getting started information.  You want to build a Mutator.  Mutator contains a method that is called at game end and you can extend this to write &quot;XYZ won!&quot; or whatever you like into the UT2004.log file.  It's a steep curve to get started in scripting, but once you get the hang of it, you might even throw Director away and do the whole thing in the engine.

'''Nobody:''' Read up on [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]] and SaveConfig(). You can write a mutator that creates and writes to its own ini file (which is all text) and create variables that are saved to that file at the end of the game. Then all you need to do is have your external program open that ini file for read. Its really pretty simple as far as scripting goes; just a matter of using the correct syntax @ class declaration and variable declaration. After that just set the varibles you created equal to the data you want to save in that ini file and use SaveConfig() at the game end event.&lt;br /&gt;Oh, you might also consider using ngstats and parsing the Unicode log it will save in the Logs folder in the ut dir. Might be easier just to script your own ini file, easier to parse.

'''Sweavo:''' Also: GameStats might be your friend

===KarmaBoostVolume===

'''craze:''' hey, I could never get this to work correctly, can someone write something up on how exactly to make it work?

'''craze:''' guess new questions go at teh top... heh

===Low gravity levels in UT99 the Right way ===

'''McNutcase:''' This seems blatantly obvious, but I can't find it: how does UT99 handle making levels low-gravity by default? I haven't been able to figure it out... I got approximately the right effect by setting bGravityZone to True in the [[Legacy:LevelInfo_(UT)|LevelInfo]] properties and halving the magnitude of the Z-gravity, but that's an egregious hack and will break in conjunction with the LowGrav mutator. There's obviously another way to do it, since that &quot;fix&quot; isn't active in DM-Morpheus, but I haven't been able to find it. What am I missing here?

'''Tarquin:''' I suspect Morpheus does it at the ZoneInfo level, since the indoor areas have normal gravity.

'''McNutcase:''' Looks like it might have to break, then... I'll go and look for at least the right official magnitude, so as to keep the feel consistent...

'''Ch3z:''' I don't know if this helps or not, but the code in Botpack.LowGrav is very simple. It expands Mutator, gets rid of all UtJumpboots and sets the ZoneGravity properties of all ZoneInfo in the map to vect(0,0,-200) in the CheckReplacement function. That's all it does. I was also thinking you might look into embedding a mutator into your map that unregisters the lowgrav mutator if in the chain?? A thought.

'''McNutcase:''' in that case, hacking the LevelInfo properties won't break with LowGrav... although I suspect I want the gravity a bit higher than 200, since the default is 950. Certainly 200 is a bit low. Now I just need to figure out how to deal with exiting a WaterZone via a WarpZone...

'''Evilmrfrank:''' Low gravity shouldn't be changed in the level info.  It should be changed in the zone info only.  You can change the gravity settings there to whatever you want it to be.

===Attaching karma actors to movers===

'''Blue Ion:''' The deal is as simple as the question. I want to attach a karma actor to a mover so when it is triggered  the karma actor would follow the mover and at the same time swing, be shot, and other fun stuff to do with karma actors.

The idea is to make an elevator that is held with chains that could swing and ultimately break when shot.

The KBSJoint should do the trick except that it won't work with anything that is either BSP geometry or an other karma actor, and during gameplay, when the karma is activated, the thing shoots of to the center of the world.

'''Foxpaw:''' It is possible that you are not setting up the KBSJoint correctly. It is intended to go between either a Karma simulated actor and another Karma simulated actor, or a Karma simulated actor and the world.

I believe that attaching to a mover will require a modest amount of coding. However, if you are going to have to custom code something it might not make sense to use Karma at all, and instead code your own elevator physics, since it is a fairly simple case.

Alternatively, you could get rid of the mover and make the whole thing work on Karma. That would also require some amount of scripting.

===Calling movement(moveforward etc) from within script===

'''Simul:''' Hi Im creating a script that reads in movement information from a java program on a remote computer and moves the player in unreal.  That is working fine, and now I have 3 values (X,Y,Z) in my script, however I cant for the life of me work out how to emulate a keyboard/mouse input to use the information (like moveForward).  At the moment I am able to use move() on xpawn however there has to be a less dodgy way to do this.  I can get the rotation of the player working fine, its just the movement.  

'''Xian:''' Hello! Unfortunately I don't know anything about UE 2, only UE 1, but I assume the best way (and possibly only way ?) is to modify the aBaseY variable in PlayerInput. One way would be changing the InputClass in Engine.PlayerController to your class extending PlayerInput and possibly adding hooking functions there (or simply do it easier by changing them directly in Engine.PlayerController). The reason I told you to use an Input class is that the input moments are best accessed in the PlayerInput ticking event, therefore you need to do it there. This was doing a quick skimming of the UT2kX code so it is not guaranteed to work, but may be a push in the right direction :)

===Overriding a native source function in script.===

'''Baz:''' Hi Im trying to override AONSWheeledCraft:: ProcessCarInput() in a subclass of ONSWheeledCraft. is this at all possible, or are all native functions final. Are native functions with the same name as script functions considered different because they dont have the same number?

'''Foxpaw:''' You can override UnrealScript functions declared as native, if they are not final. (Many are, but not all.) However, the function you have indicated does not have a corresponding UnrealScript function, so you cannot override it with UnrealScript. There is probrably an UnrealScript function that you can override to get the same result as you are trying to achieve.

'''Baz:''' oh well, my problem is that bIsInverted is set and checked in the native code, and if bIsInverted is true a vehicle wont reverse when its are upsidedown. Ive got a scorpian driving on the celing, but when you drive into a corner you cant drive out again.

'''Nobody:''' I don't know the code you are refering to, but can you intercept it when the user attempts reverse and check to see if bIsInverted=true and if so set vehicle's rotation 180º from current? If you do that in increments, maybe a for loop, then it might feel like it is some automatic feature of the vehicle, and not some funky hack of the game, like driving on the ceiling hehehehe just kiddin'. 

'''Xian:''' Loops is a bad idea. best way to smoothen rotation changes is using DeltaTime.

===Converting BSP to static mesh no longer evil?===

UTF8_REPLACEMENT9;''Tarquin:''' There used to be this: [[udn2:ConvertingBspBrushesIsSuboptimal]]. However, I was looking for this page just now, and I couldn't see it linked from ANY other page on the UDN. Does that mean that maybe it's ok to do it now? Maybe they've improved the way UnrealEd converts to static meshes?

'''Ragdoll:''' I dont know of any improvements in the BSP-&gt;Static Mesh conversion. It seems ok for basic shapes like cubes etc but from my experience for complex meshes it is better to use a external 3D modelling application. This page explains it quite well:http://angelmapper.com/tutorials/uedmeshes.htm

===Registering GameRules===

'''Tarquin:''' Everywhere I've sene examples of using a [[Legacy:GameRules|GameRules]] class, I've seen this sort of code used to register it:

&lt;uscript&gt;
  if ( Level.Game.GameRulesModifiers == None ) {
    Level.Game.GameRulesModifiers = myRules;
  } else {
    Level.Game.GameRulesModifiers.AddGameRules(myRules);
  }
&lt;/uscript&gt;

However, there's an AddGameModifier function in [[Legacy:GameInfo|GameInfo]] that handles the case where no game rules are in the linked list. So you can just do this:

&lt;uscript&gt;
  Level.Game.AddGameModifier(myRules);
&lt;/uscript&gt;

This seems simpler... or is there a reason it might not always work?

'''Nobody:''' I don't believe AddGameModifier was implemented until UT2004. That GameInfo link only goes to the UT2003 version of the class.

===Hud with mouse problems?===

Okay...  I have been trying to create a little user interface for my game.  Instead of the player looking around with the mouse, the player will have an overhead perspective and is able to interact with things via their mouse.  The problem is, I can't exactly make that work.  Here's what I've got so far.  A custom PlayerController with some game related variables but also a call to Player.GUIController to turn it on... like this.

&lt;uscript&gt;
class CustomPlayerController extends PlayerController;

var BaseGUIController HudController;

exec function MakeGUI()  //it's an exec function just to make things easier for testing purposes
{
   HudController = MQ_HudController(Player.GUIController);
   HudController.SetControllerStatus(true);
}
&lt;/uscript&gt;

MQ_HudController is a custom GUIController that I thought I would need to add custom functionality.  So, what that does is turns on the GUIController which activates mouse functionality.  Here's where things get hard for me.  I can't for the life of me figure out how the actual GUI pages and components for the menu's are 'activated' once the mouse is clicked on them.  I've looked through all relevant classes (from BaseGUIController to GUI, GUIComponent etc...)  Currently, I have no overhead perspective working because I wanted to get this completed first.  All I want for the player to be able to do right now is be able to click anywhere on the ground (with the mouse of course) and then have the pawn of the player move there.  Later I want to add other stuff, but I figure if I figure this out first, I can do the other stuff pretty fast.  Can anyone help me to get the mouse able to be clicked on the ground and have the pawn move there?  PS.  I don't really want like an invisible GUIPage or anything infront of the hud.. if that's possible.

'''Nobody:''' Sounds like a 2D curser in a 3D world. He's gonna get teased in school. =( I think I would be going at it in this fasion:&lt;br /&gt;    Make curser invisible.&lt;br /&gt;    Declare an object with a location in 3D space (and a mesh or a sprite),&lt;br /&gt;    and set it's x and y = to the curser's x and y keeping it's z.&lt;br /&gt;    Change z in response user input via their configured jump and crouch keys.&lt;br /&gt;    if this objects vector location is = to another objects vect location (within it's collision radius maybe) when the mouse is clicked, or possibly the object fire(...)'s or whatever, then dostuff().&lt;br /&gt;Maybe the lil guy will make friends in the 3D world now, hehehe. But this is like your the curser and it's in 3rd person view, why not make it firstperson view in fly mode? Then already have the navigation done, and you can use trace or watch for the other objects vector location and rotation to be where it would be right in front of you but not right in your face. My two cents. Fun Idea, I'd sure like to see it when it's done.

===Almost ready to launch mod, but a few questions ===

'''Kou''':  Okay, I'm about ready to release a demo of a mod I just made, but I (stupidly) designed the text in my windows based on pixels, and I'm running on 1280x1024 resolution.  Is there a simple way to snap everything into place or am I going to have to set it for each resolution each time?  This is an example of what I currently have...

&lt;uscript&gt;
       C.SetPos(550, 292);
       C.DrawColor.R = 255;
       C.DrawColor.G = 255;
       C.DrawColor.B = 255;
       C.DrawText( &quot;Error!&quot;, False );
&lt;/uscript&gt;

'''Foxpaw:''' The typical way to resolve this is to multiply by some value based on the resolution. Usually fractional numbers are used and they are multiplied by the resolution, but you can just as easily multiply by the resolution divided by 1280x1024.

IE:

&lt;uscript&gt;
local float XRes, YRes;

XRes = C.SizeX / 1280;
YRes = C.SizeY / 1024;

C.SetPos(550*XRes, 292*YRes);
&lt;/uscript&gt;

'''Kou:''' Thanks, that (kinda) fixed the problem.  I'm wondering how I may play different music in the Instant Action game configuration area rather than the generic UT2k4 menu music. 

===Warp Zones===

'''Jezinator:''' Right, erm sorry if this looks a bit wierd but I've never written like this before.  I have a problem with Warp Zones you see.  Im creating a fundamentally mind boggling map using warp zones, not loads of warp zones, just two pairs of them.  I have textured the sheet that defines the zone with AssaultFilmGrain becuase i couldn't find a transparent texture anywhere :) im using UT2K4 btw.  Anyways the problem is that there is an area of the map behind the warp zone and the geometry is showing through in a very wierd way whenever I play the map.  Its like the corridor behind the Zone (which has nothing to do with the zone itself)  Is overriding the corridor that the Zone links to.  The zone still works perfectly, but its just a glaring aesthetic problem.  I am aware that that was perhaps not the best explanation ever but its a wierd problem.  If there were some way of posting the map here.... Dunno, if anyone has any help, i would seriously appreciate it.  Also I have two other, complete maps which I would like to distribute and don't know how.    

'''evil_blue_dude:UTF8_REPLACEMENT9;''Rotate one of the zone portals 180 degress. If that doesnt work then rotate them both 180 degrees. (but be sure to try the first before trying the second)

'''Jezinator:''' Yes i did try that, even before I asked here, it doesn't help.  I can't figure out why that happened.

'''Foxpaw:''' I'm not sure if I'm understanding the problem correctly, but it sounds like you might want to try setting the walls of the corridor that has the warpzone info in it to fake backdrop.

'''MythOpus:''' The author probably hasn't been here for some time now but don't the WarpZoneInfos override the texture they have on the surface anyways?  Having that transparent texture could be throwing the WarpZoneInfo off and having it reveal BSP on the other side.

===Collision And caft===

'''FOD'''Hi im making a mod which is a subclass of decoration the only problem is that when i assign a static mesh to the class and play the level im finding all the wheeled craft are sinking into the meshes. I've got collision meshes on the objects and they work fine as just static meshs, but as soon as i use them in a script i find i can drive right through them? Im sure they were fine at one point, but my head so full of code im realy not sure anymore.lol.

'''MythOpus:'''By Wheeled Craft do you mean to imply you're using the karma system?  If so you will need to create Karam Collision Hulls.  Don't know if you already do have them or not though :S

'''FOD'''I think the collision hulls are set ok (if i choose View colision in unrealed the meshs all have pink outlines.) ive got all the settings in collision in the actors properties set to on. Should i be using the simplified collision hull karma/line or box. Its real odd as im using the same static meshs for things like vehicle lifts and the collision is fine there. When i say wheeled craft i mean the scorpion,helbender,hovertenk,artillery and the shock tank. They dont go right through the mesh...just sink up to about their wheel axle. Like being in quicksand? Im sure the answer is blindingly obvious but its winding me up to be getting these sort of problems after all the coding ive just done.For a test made script that just places an actor onto the level:-

&lt;uscript&gt; class MyActor extends Actor
	placeable;

defaultproperties
{
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'HumanoidHardware.Beams.jribbedcolumn01HA'
     DrawScale3D=(X=50.000000,Y=50.000000,Z=1.000000)     
     bCollideActors=True
     bBlockActors=True
     bAutoAlignToTerrain=True
     bBlockKarma=True

}&lt;/uscript&gt; 

Now if i try to drive over this in a wheeled craft...quicksand!

but if i simply just place a static mesh into the map next to it ..the static mesh one is solid and

can be driven over? im confused.

The collision is fine if you side swipe the mesh or hit it with a flying craft or even if i just drive directly at it.

Just did another test..used the same script as above but this time made it a subclass of 'mover' and the collision is ok.?! I suppose i could derive the mod from a mover rather than a decoration but i think there are certain network issues with the 'mover' class which may upset the way my mod works.What are the properties that mover have that make it more solid?

===ACTION_ShootTarget... what are the firing modes?===

'''Tomko:''' Trying to setup the above action, but the bot just doesnt want to fire at the SetViewTarget I've assigned. Through reading this udn page (http://udn.epicgames.com/Two/ScriptedSequenceActions#ShootTarget), it lists AssaultRifle Modes, but I can't get those working either. I have an ACTION_SetViewTarget above it, which points to another xPawn for him to shoot, but it's a no go. The other pawn is in view, in distance, etc... just can't figure out what I might be doing wrong.

Any assistance would be greatly appreciated, there doesn't seem to be a wealth of information on this action, anywhere!

p.s. I've also tried the ACTION_FireWeaponAt to no avail.

===Make bots/monsters ignore you?===

'''Missilemaster:''' I'm very new to coding; right now I'm finishing up a modified Raptor with a &quot;cloaking device&quot;, which puts an invisible skin on it. It works well, but, of course, bots and monsters can &quot;see&quot; it when it's cloaked. Besides map botpathing, I know basically nothing about bot AI. Does anyone know a relatively simple way to make computer opponents ignore this vehicle when it's cloaked (that is, when a variable is a certain value)?

'''Defx:''' I suggest taking a look at Invis Combo, there seems to be a function called SetInvisibility, hope this helps

===Console Commands / exec function doesn't work===

'''Jan:''' Which classes (UT99) can I use for adding new console commands? I used PlayerPawn but nothing happens if I typed in the command into the console. UT returns with &quot;unrecognized command&quot; message. I've tested it with a simple class like that:

&lt;uscript&gt;class something expands PlayerPawn

exec function LogStuff()
{
  log(&quot;log tah f****** stuff&quot;);
}&lt;/uscript&gt;

'''Xian:''' UScript: Engine.PlayerPawn, Engine.Console, Engine.Inventory, Engine.HUD (and subclasses obviously)

Native: (apart from the above) Engine.Player, Engine.SubSystem, Engine.Client, Engine.Engine, Engine.GameInfo, Engine.Input, Engine.Level (NOT ENGINE.LEVELINFO), and of course, all their subclasses...

It isn't as simple as subclassing PlayerPawn and that's it... you need to subclass a proper player controller subclass (namely something like TMale1 or TMale2 which are children of TournamentPlayer which is a child class of PlayerPawn) and then insert them in the game with a mutator by hooking Engine.Mutator.ModifyLogin()

'''MythOpus:''' Well I'm pretty sure PlayerPawn DOES work with exec functions but as you said, you DO have to get it into the game somehow.  If you created a class and put an exec function in it and thats it, its like... er... trying to use a coffee maker thats still in the car.  You have to take it out of the car, i.e. have the player take 'control' of the PlayerPawn, take the coffeemaker out of the box and use it, i.e. Call the exec function on that PlayerPawn.  If the player doesn't have control of the PlayerPawn when you call the exec function, then engine gives you the &quot;unrecognized command&quot; because it really doesn't know that command even exists. 

----

===Recent Changes &amp; Image Upload/Deletion===

'''Kartoshka:''' I noticed that the Recent Changes page doesn't show my username when uploading or deleting an image, only my IP address. My username ''does'' show up after a normal page edit though. Not a big deal, but maybe something to look at...:)

'''Mychaeel:''' It does show ''mine'' when I do anything &amp;ndash; support for that is built in.  I've noticed that I seem to be the only Unreal Wiki user whose user name is displayed when doing anything in the image uploader, though &amp;ndash; I wonder why that is.  Which URL do you use to access the Unreal Wiki?  (Perhaps it's a cookie-related issue.)

'''Kartoshka:''' I use wiki.beyondunreal.com. I tried www.unrealwiki.com, but this just redirected me to wiki.beyondunreal.com. I tried logging in after entering www.unrealwiki.com just to be sure, and the same thing happened. (no username, just IP on upload and deletion). I am even using a different computer with a different IP address than before, so it doesn't seem likely to be a problem on my end.

----

===Static Array Limit?===

'''MM:''' Is there a limit to the [length] of a static array? (In Unreal Engine 1) Such as &lt;uscript&gt;var string testtxt[1000000]
&lt;/uscript&gt;

'''MythOpus:'''  Yes I do believe there is a limit and its probably lower then UE 2.x.  I can't give you exact specifics but you can try different values for the length of an array and see if the compiler complains.  I'm not sure if it will but if it doesn't you should also try writing/reading to the last index of the array just to be sure.

'''Ambershee:''' If it's something that's going to be replicated, then the limit is horribly low. It's 9. I found that out the hard and horrible way.</text>
    </revision>
    <revision>
      <id>3557</id>
      <timestamp>2008-01-30T17:01:07Z</timestamp>
      <contributor>
        <ip>Aorta.ornl.gov</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Got a problem? Post your question here and we'll attempt to answer it. 

==Read Before Posting==

{{innerbox| A Wiki is not the ideal way to carry on long discussions. '''BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums] are recommended instead'''.

}}

===Before Posting===

The question that you plan on asking '''may have already be answered''', either here or elsewhere. Before posting, please:

* Scan this page
* [[Legacy:Search|Search]] the Wiki
* Search the [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums]

===When Posting===

When posting a question, please:

* Use correct [[Legacy:Wiki Markup|wiki markup]]
* Give your question a heading (level 3)
*''' Post your question above all other questions to avoid scrolling through older ones!'''

===After Posting===

After you have received an answer to your question, please:
* Write up the information somewhere on the site. This may involve refactoring the text from this page or a complete rewrite
* '''Remove the question and answer from this page'''
* Delete any images you uploaded to show the problem

If you see a question or discussion that has been idle for over three weeks, '''remove the question and answer.'''

==Questions==

===Expontiental Damage in a Lava Field===

I have been trying to write a script for exponiental lava damage following the inverse square law. Basically, a lavavolume that deals more damage to the player the closer it gets to the center of the lava. I've found everything I need except for a way to input the player's position. Is there any function that can call a player's x,y, and z coordinates?

===Problem Loading Maps===

'''SenorDoom:''' I'm trying to load a map from one computer into another and keep receiving this error.

History: ULinkerLoad&lt;&lt;FName &lt;- (LinkerLoad Package.LinkerLoad195 262305)) &lt;- FPoly&lt;&lt; &lt;- UPolys::Serialize &lt;- LoadObject &lt;- (Polys myLevel.Polys6081 262305==262305/1193606 111461 180953) &lt;- ULinkerLoad::Preload &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::Exec_Map &lt;- UEditorEngine::Exec &lt;- (MAP LOAD FILE=&quot;L:\royZach_map1.ut2&quot;) &lt;- UUnrealEdEngine::Exec &lt;- FileOpen &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- MessagePump &lt;- MainLoop

I've been unsuccesful finding any help with this at all.

'''Raven:''' There is an error in loading up a brush. Possible that it an error coming in from something else. Are you using any custom packages (code, static meshes, textures, ect)?

'''SenorDoom:''' No, I'm not using any custom pacakages, its all from prefabs.

'''Raven:''' Another thing to check is that verion of UT on the computer that you are moving to is the same as the one you are comming from. (i.e. both are patched the same)

===Editing Shaders ===

'''Hellborg:''' UT3, I would like to modify the standard postprocess (DOFAndBloomBlendPixelShader) used in Unreal Tournament 3. In the UT3 tech based Roboblitz I can simply edit the postprocess by directly editing the file DOFAndBloomBlendPixelShader.usf in the Engine/Shaders folder with notepad. I then simply remove the shadercache, run roboblitz, and the new shadercode is used. I can thereby implement cartoon shading in roboblitz. I tried the same with UT3, deleted the shadercashe (files RefShaderCache-PC-D3D-SM2.upk,RefShaderCache-PC-D3D-SM3.upk and RefShaderCache-PC-D3D-SM4.upk and edited DOFAndBloomBlendPixelShader.usf in notepad. However, the game gives a runtime error on startup even after the tiniest change in the shader script. I am sure,that the shader code is still fine - just changing a single constant produces this error. There is also no information given by the error message. Do I need to change certain configuration files to allow modified shader script, or is there a more general problem with my method in UT3? Or, is there a more elegant way to add a custom postprocess to the whole game scene? I asked this question in many formus already, but nobody seems to have a clue...

===Third Person View ===

'''Stick:''' UT99, I would like to use UT in third Person view, using behindview 1 works, but the crosshair is not there, and the camera is at a bad angle, i have used a mutator called 'Bullet time 3.00' it fixes this, but i dont like the rest of the things on that mutator, i would like to know how to do this without out.

===Polys Visible through walls &quot;In-Game&quot; ===

'''VENOM:''' UT99, I can &quot;see&quot; ALL my polys through walls, I have an open area map with a building in the middle, I can stand outside next to the wall and see the polycount (stat global) through the wall 900+!!, outside is about 300 polys, I can find nothing on this subject, and yes the wall is solid bsp, anyone?

===SmallNavigationPoint/Timer() ===

'''vitaloverdose'''Ive been updating my vehicle booster script and a lot of people have suggested using a navigation point for the parent class. Ive re-written the script using smallnavigation point as the parent but i cant get the timer function to fire. Is the the function available using small navigation point as a parent?   

===Scriptable Trigger===

'''Sopa de letras:''' I miss a scriptable trigger for UT1. I wish all triggering functions and conditions would be merged in one trigger :(. It's so time consuming to make chains of different triggers :(

===Weapons Slowing Down Player When Holding It===

'''Fey''':  I've been working for quite some time trying to figure out how to simulate weapons having weight.  The idea being that if you were holding a gun in your hand, it would slow you down by some arbitrary amount.  But if you changed that gun out for another one you'd speed back up again.  Over the past several days I've hit several dead ends in trying to do this.  Currently I'm thinking that I'm going to need to put a timer on somthing and then find a way to check if the characters are holding the gun, perhaps on the pawn that might be using the weapon.  I can't seem to find a good page explaing (this is my first mutator ever) how timers work, and what functions might close them.  I read on the inventory class page discription that timers are unmade in some functions.  If I try to put a timer on a pawn, will it get erased after the pawn dies, or some other event that I may not realize?  If so, I'll have to recrete the timer everytime the pawn spawns, I guess via ModifyPlayer().  

Is using a timer really the best way to do this?  I'm still trying to find a function on weapon or inventory that might trigger when a weapon is being readied or unreadied, but in the past few days I've not been able to find anything worked.  I've also not been able to find a pre-existing mutator code that makes somthing happen when the player is holding a weapon, so I've got nothing to experiment with.

'''MythOpus:'''  I suggest that instead of using the mutator to do the guts of what you're trying to do, use an [[Legacy:Interaction|Interaction]] instead.  You could do what you're proposing in the Tick function.

===Command Prompt/UCC Issue===

'''VerteX''': Command Prompt being strange

everytime i compile a code, it parsers, compiles, imports, then when it's done, it gives me warning 

Warning: Failed to load 'UberLinkGun.u': Can't find file 'UberLinkGun.u'

Warning: Failed loading package: Can't find file 'UberLinkGun.u'

Log: Analyzing...

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\DamTypeUberLinkGun.uc)

Log: Class: DamTypeUberLinkGun extends DamTypeRocket

Log: Imported: Class UberLinkGun.DamTypeUberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGun.uc)

Log: Class: UberLinkGun extends LinkGun

Log: Imported: Class UberLinkGun.UberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunAttach.uc)

Log: Class: UberLinkGunAttach extends LinkAttachment

Log: Imported: Class UberLinkGun.UberLinkGunAttach

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunFire.uc)

Log: Class: UberLinkGunFire extends LinkAltFire

Log: Imported: Class UberLinkGun.UberLinkGunFire

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunPickup.uc)

Log: Class: UberLinkGunPickup extends LinkGunPickup

Log: Imported: Class UberLinkGun.UberLinkGunPickup

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunProj.uc)

Log: Class: UberLinkGunProj extends RocketProj

Log: Imported: Class UberLinkGun.UberLinkGunProj

Log: Parsing UberLinkGunAttach

Log: Parsing DamTypeUberLinkGun

Log: Parsing UberLinkGun

Log: Parsing UberLinkGunPickup

Log: Parsing UberLinkGunProj

Log: Parsing UberLinkGunFire

Log: Compiling UberLinkGunAttach

Log: Compiling DamTypeUberLinkGun

Log: Compiling UberLinkGun

Log: Compiling UberLinkGunPickup

Log: Compiling UberLinkGunProj

Log: Compiling UberLinkGunFire

Log: Importing Defaults for UberLinkGunAttach

Log: Importing Defaults for DamTypeUberLinkGun

Log: Importing Defaults for UberLinkGun

Log: Importing Defaults for UberLinkGunPickup

Log: Importing Defaults for UberLinkGunProj

Log: Importing Defaults for UberLinkGunFire

Log: Success: Compiled 43 line(s), 9 statement(s).

Log: Save=205.184198

Log: Moving '\System\Save.tmp' to '\System\UberLinkGun.u'

Warning: Failed to load '\System\UberLinkGun': Can't find file '\System\UberLinkGun'

Warning: Failed loading package: Can't find file '\System\UberLinkGun'

Warning: Error loading \System\UberLinkGun !!!

Log: Success - 0 error(s), 1 warning(s)

Exit: Preparing to exit.

Log: Purging garbage

Log: Unbound to Core.dll

Log: Unbound to Editor.dll

Log: Unbound to Engine.dll

Exit: Editor shut down

Log: Unbound to Fire.dll

Log: Unbound to IpDrv.dll

Log: Unbound to UWeb.dll

Log: Unbound to XGame.dll

Log: Unbound to XInterface.dll

Log: Unbound to Onslaught.dll

Log: Garbage: objects: 73914-&gt;0; refs: 0

Exit: Object subsystem successfully closed.

Exit: Exiting.

Log: FileManager: Reading 0 GByte 112 MByte 940 KByte 709 Bytes from HD took 0.836996 seconds (0.570996 reading, 0.266000 seeking).

Log: FileManager: 0.149000 seconds spent with misc. duties

Uninitialized: Name subsystem shut down

Uninitialized: Allocation checking disabled

Uninitialized: Log file closed, 07/15/07 15:19:17

MV was what i was trying to compile...i have no idea what to do seeing as it used to work, but recently it started giving me that warning

===Forum Issues===

'''StarWeaver''': This probably really isn't the place for this but I'm hoping someone here can point me in the right direction. My forums.beyondunreal account (same name) is totally locked down (can't post, can't PM, don't exist in the user list). I've tried emailing the contact link and haven't gotten a response in about a week, and I don't have any idea who else to talk to. I don't really want to create a new user ID if I can help it. Thanks, and sorry for the inappropriate topic.

===Question about native classes===

'''Illiander''' I'm trying to make a UT2k4 vehicle that switches between a wheeled car-type, and a flyer.  Basic problem, when I try to extend ONSVehicle, and just copy in all of ONSChopperCraft, it doen't pick up on any of the movement inputs.  Same with ONSWheeledCraft.  But when I extend those classes it picks up on the inputs.  Am I doomed to failure in this, or is there some way for me to pick up on movement commands in UScript?

===Question===

'''vertex''' I have an assault level i am making for my family to use for fun. I thought (since i'm the only mapper), that'd i'd make a little sniping area with a non-solid brush over it with the outside texture matching the wall and the inside texture transparent. The problem is, when i test it, the defending bots (who appear by a weapon locker with sniper rifles) kill me everytime i go to my secret place. Is there a way around that, so that people and bots can't see me, but i can see them and shoot them.

===Questions about certain errors===

Jameso123 

I have had a problem with UnrealED 3 i got with UT 2004 whan i start the editor the part where the vieworts should be are just white all the other stuff is working, there just isnt any viewports

'''shadow21''' I've been having a problem with UT99, I'm trying to compile a mod, and I'm having troubles with the Mesh=LODMesh'' command, the error that pops up is 'bad expression in '=', what should I do, I'm at a loss here =( any help at all will be appreciated.

===Replication : Forcing client update for &quot;prone&quot; Pawn===

'''SuperApe:''' I have a Pawn class that is updated (Physics, Location, Rotation, AnimSequence &amp; Anim frame) on Clients only when the Player has a line of sight to it.  Since this Pawn is prone (not moving, not animating), there is no reason for the bNetDirty to update this Actor.  Is there a simple way to make sure this Pawn is properly updated '''before''' the Player sees it?

'''SuperApe:''' Is this question clear enough?  Anyone have a suggestion, solution or comment on this problem?

'''Graphik:''' You've not properly explained what you're trying to accomplish or how you're trying to do it.

In case I've mentally translated your unworkable description into something partway logical: How is your code going to guess when the Player is about to change his line of sight so as to 'properly update before the player sees it'?

'''EricBlade:''' I would guess off hand that actually doing all this checking for line of sights is probably more costly than just letting the regular relevance code do what it's supposed to do?

'''SuperApe:''' Thank you.  What I mean by updating before the player sees it, is to make a ''one-time'' forced update (from the default setting of a property, which the Client has automatically, to the setting this prone Pawn should have on the Server), perhaps at map start.  For example, my Pawn should be set to PHYS_None (because of a special state it is in), but the default is PHYS_Falling.  On the server this Physics special setting is known, on the Client it is not (until the Client machine gets an update from the Server).  So, as it is now, the Player on the Client turns a corner, sees the Pawn, the Pawn falls (PHYS_Falling), then after a moment, it updates the Pawn's location, rotation, and Physics, and the Pawn *snaps* back to where it should be.  My question is related to this example.  How can I force this Pawn to update the Physics setting in time to prevent it from falling when the Client Player sees it?  As of yet, I do not have a workable solution.  It appears to me to be a limitation of the Replication scheme.  But, I thought I bring the problem up here, in case anyone would like to help me find a solution.

'''Graphik:''' Your expanded description still leaves me guessing, but I recommend you use the ModifyPlayer function. [[Legacy:Mutator|Mutator]] features a description of the function as well as an example of its use.

'''SuperApe:''' My suspicion is that this is not something that Graphik can help me with. ''(No offense, Graphik)''  But I will try to elaborate one point that appears to have been missed.  Replication, as Unreal uses it by default, causes the above example situation automatically, where the Pawn as it exists on the Client gets an update to important non-default settings on properties such as Physics only after the Client Player has seen it.  Unreal Replication is able to handle elaborate maps because it does not replicate everything all the time, only the bare minimum that's needed, when it's needed, to ''simulate'' what's happening on the Server.  This example I've described above shows that scheme in action, but I am looking for a clever workaround to somehow force this Client Pawn to update either instantly (when the Client Player sees it) perhaps do something that will ensure the Client Pawn is already set to the proper (not the default) Physics setting before this line of sight occurs.  The goal would be to avoid the situation where the Client Players see this Pawn fall and then snap back to the proper location a moment later (depending on current netspeed conditions).  IOW, I have not coded some nifty line of sight stuff, this is just how Unreal Replication works now.  I'm looking for some kind of override, so the Client Pawn does not rely on it's default property setting.  I would consider whatever workaround works, and use it on other properties as well, such as Animation-related properties, etc.

'''EricBlade:''' bAlwaysRelevant ?

'''SuperApe:''' I thought about that.  It seemed like overkill for a prone Pawn, but at the moment that appears to be the only working idea I've run across.  I'm also not sure how well that property works, being switched on/off, which I would want to do if this Pawn is in it's special state, and when it leaves it and should act more like a normal Pawn on Clients.  Thanks for the idea. :)  Hopefully a more economical idea can be found as well.

'''EricBlade:''' Seems like months since I last looked at this page, but it should probably work pretty well - if you set it bAlwaysRelevant, and it's not doing anything, it shouldn't cause any major changes in net traffic, as it'll do it's replication stuff when the player connects, but then otherwise it isn't doing anything.  As far as I can tell, setting bAlwaysRelevant on and off works pretty well - I've seen several Land of the Dead maps that have used a Security Camera type thing, but had to install a volume that makes whatever enters it bAlwaysRelevant, so that you could monitor things in a remote room (pawns would not be relevant halfway across the map, so you couldn't see them on remote cameras)

'''EntropicLqd:''' I'm guessing you've solved this problem by now.  But, wouldn't it be possible to use the bAlwaysRelevant flag with an inventory object?  It seems like a really ugly hack work around to me ... just an off the wall idea.  It's probably crazy though. 

===Control point status dissapearing from hud.===

'''plugwash''': a friend of mine has made a domination map based on the hall of champions (original UT) it works fine singleplayer but in netplay the control point status usually dissapears from the hud on first death (i think at least one control point captured by someone is also a prerequisite to the dissapearance). Ive tried removing all actors that seem to be designed for that map and even exporting and re-importing into a new map but still the issue persists any ideas on what this could be or how to track it down?

===REPLICATING A VARIABLE===

I having a problem with replication. For the past 2 weeks all I have been doing is researching it and nothing can barely explain it. I understand some of it, or at least I think I do. No replication I make works, at all, in any cases. It is just getting to me too much, how it simply does not work.

Anyways I wrote this script. Remember, some coding in this may seem &quot;noobish&quot; but this is just practice for me you could say. What it does is when this item is added to your inventory, it takes the value of an array in another actor. The variable is called LastPlayed. This value is not replicated to the client. So what I'm trying to do here is (since I cant replicate a variable that exists in another actor I didnt make) is assign the value of LastPlayed to ClientIP and then replicate ClientIP over to the client where they process it.

Here is the class...

&lt;uscript&gt;//==============================================================================
class ClientAKA extends Inventory config(AKACheckerLog);

var config string ClientLP[6000];

Replication
{
	reliable if(ROLE==ROLE_Authority)
		ClientLP;
}

simulated function PostBeginPlay()
{
	local AKA a;
	local int i;

	log(&quot;Stage1&quot;);
	Super.PostBeginPlay();

	log(&quot;Stage2&quot;);
	foreach AllActors(Class'AKA', a)
		break;

	if(Level.NetMode == NM_DedicatedServer)
	{
		log(&quot;Stage3&quot;);
		for(i=0; i&lt;6000; i++)
		{
			ClientLP[i]=a.LastPlayed[i];
		}
	}
	LogAKA();
	SaveConfig();
}

simulated function LogAKA()
{
	local int i;

	log(&quot;Stage4&quot;);
	if(Level.NetMode != NM_DedicatedServer)
	{
		log(&quot;Stage5&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logging...&quot;);
		log(&quot;v*************************-AKA Checker-*************************v&quot;);
		for(i=0; i&lt;20000 &amp;&amp; ClientLP[i]!=&quot;&quot;; i++)   //log the aka log in their ut log file
		{
			log(&quot;LastPlayed[&quot;$i$&quot;]=&quot;$ClientLP[i]);
		}
		log(&quot;^*************************-AKA Checker-*************************^&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logged the AKA.ini to your UNREALTOURNAMENT.LOG in your UT system directory.&quot;);
	}
}&lt;/uscript&gt;

I cant see what is being doen wrong, ywt ClientIP simply wont replicate. I've tried several techneques and to replicate this variable NONE of them work. For weeks I've been working on this exact mod which is so exausting seeing as I have no more resources. And I also have several other mods that dont work souly because of replication. Can anyone help me?

'''Xian:''' Well, although I don't have experience with UE2, the same principles as in UE1 should apply. From what I seem to remember, arrays can't be replicated. The only way to do it is the nooby hack that seems to go like this:

&lt;uscript&gt;
class Test extends Whatever;

var string Testers[3];

replication
{
    reliable if (Role == ROLE_Authority)
        ClientStuff;
}

function ServerStuff ()
{
    local int i;

    Testers[0] = &quot;Me&quot;;
    Testers[1] = &quot;You&quot;;
    Testers[2] = &quot;Other&quot;;

    for (i = 0; i &lt; ArrayCount(Testers); ++ i)  
       ClientStuff(Testers[i],i);
}

simulated function ClientStuff (string Entry, int i)
{
    Testers[i] = Entry;
}&lt;/uscript&gt;

Also, as you have probably guessed, the class you are using to replicate things (Weapon, Info, Actor, Emitter etc.) has to exist on both server and client. You chose Inventory, which exists on both sides IF it was spawned on the server. Also, giving it to the player and adding it to the chain ensures the simulation of the class' functions (as well as setting it to SimulatedProxy which, iirc Inventories have them). I used ArrayCount to show you a nice way to get the number of elements in case you didn't know it :)

I know that hack sucks, but it is the only way to do it (from what I know). Or at least, to do it in UE1. Hope it helps.

===Change Direction of Weapon Spin===

'''UltraN00b:''' I'm creating a level for UT2004, in which the weapon bases rotate around the inside of a large cylinder.  While the weapons rotate around the cylinder, they angle of the weapon changes as well.  This looks great, except for the fact that they still rotate on their horisontal axis.  

Is there any way to change the direction of the weapon's spin while on the weapon pad?  Tilt the rotation so they still apear to rotate normaly, but at a different angle?

===Opening Classes===

'''Tgusagalpa:''' I'm starting a mutator that a Pawn recieves the weapon they are shot with.  Should I reference the gun they are shot with through Instigator.Weapon '''or''' Projectile properties? 

'''Xian:''' So if I got it straight... you shoot me with a SnowGun (yes I am original :P) and I'll receive it either when being shot, either after respawning, right ? (well for short you want to know how to &quot;save&quot; it, as you said, reference, the Attacker's weapon, correct ?).

It's even simpler than that. You use TakeDamage() and then do InstigatedBy.Weapon (or whatever parameter name it has since it can vary). Hmm from a quick glance at the source now, I see you can use the GameRules class to hook in the game ReduceDamage function (it uses the pointer GameRulesModifiers iirc). And you can do your thing there :)

===Crashing during garbage collection??===

'''EricBlade:''' I am getting reports of crashing on level change, from people who are running my custom [[Legacy:Land Of The Dead|Land of the Dead]] game type.  We are so far unable to find a condition that specifically triggers it, but after a period of time, typically ranging from an hour to two or three hours, and anywhere from 1 to 10 level changes, the server will crash on level change.  It appears to me that it is happening during Garbage Collection at the end of level, as the following from the log shows:
 Log: Collecting garbage
 Log: Purging garbage
 Critical: UObject::GetPathName

.. it crashes at this same point on nearly all of the crashes that i've been sent logs for.  What could I be doing that would cause this?

'''Xian:''' I'd have to see the source but my quickest guess would be an object still has an actor pointer that wasn't set to None and/or an Actor has an Object pointer which is not set to None on Destroyed() events. Generally speaking if it's &quot;in use&quot; it can't be deleted and it will create that problem.

'''EricBlade:''' Hm.  That's what I'd thought might be the problem, except that I don't have any code that references actors or objects in this, except in local variables, so i'm pretty confused as to how my code would be causing something like this.  A couple of people have told me that they have run the stock game for days without crashing, but we are getting incredibly regular crashes with mine in use.  .. almost every variable in here that's not local is a string, int, float, or bool .. i did just notice that i had a class variable set to a string, in default properties, but it looks like the engine handled converting that to the proper class.  Haven't got back with the server guy yet to try it.. :|

Here's a link to the code: http://pastebin.com/714417  

And here's a link to the most recent crashlog: http://pastebin.com/714329

'''Plugwash:''' If you really care about bandwidth shouldn't you set stuff up so you can monitor it at the IP level?

'''Nobody:''' I'd rather set it than monitor it. 

'''Plugwash:''' but monitoring it on a per client ip/port combination basis would allow you to tell for sure if your attempts to set it had worked correctly. 

===PSK?===

'''tgusagalpa:''' Is there any way to create a .psk file for uPaint, when exporting from maya, instead of having to ActorX?  I know on the PLE you cannot have ActorX, so how do you export, and get a .psk? 

===Adding a MESH NOTIFY===

'''SuperApe:''' I see in SkaarjPack_rc.SkaarjMeshes, there are the MESH definitions including the Animation NOTIFY declarations using #exec directives.  I'd like to add some NOTIFYs to this list.  For example, the Skaarjw Mesh animation sequence 'guncheck' should have the Sound'blade1s' play.  I'm trying to define a FUNCTION=PlayGunCheckSound from my own Skaarj subclass and having no luck using this command:

&lt;uscript&gt;#exec MESH NOTIFY MESH=Skaarjw SEQ=guncheck TIME=0.2 FUNCTION=PlayGunCheckSound&lt;/uscript&gt;

Without changing SkaarjPack_rc.SkaarjMeshes, is there any place I can append to this list of MESH NOTIFYs?  Where does SkaarjPack_rc.SkaarjMeshes get used/read?

Anyone have info on adding to the MESH NOTIFY list?

'''Xian:''' I am not sure if you have to redefine the mesh, anim and texture redefinitions by reimporting it into your own class, but it should, theoretically work without it if you did it right. I assume we are talking about UE1 here ?

'''SuperApe:''' Actually, we're talking about adding a Mesh Notify to an existing VertexMesh in UE2.

===Crouching with new model size.===

'''Stinky:''' I have made all the classes in the mod I’m working on larger then or smaller then the default ut model. Everything works accept the crouching. Does anyone know what code to replace to make it so the models don’t fall through the ground when you crouch a lot? Also when I crouch the model stays the same height but the eye height drops to the default for ut 2004, and also the model stays the same size but falls halfway through the ground so the top of the head is at the default height. If I crouch multiple times the model just falls through the ground. Any ideas? 

'''SuperApe:''' Crouching code, including eyeheight changes, is in Pawn and its subclasses.

'''Stinky:''' Well, I have edited the code in a class extending Pawn, When I crouch though, the eye height is correct for the model, but the model falls thought hte ground as if it were the standard UT 2004 heigh. Should i post a screen?

'''SuperApe:''' No need to post a screenie, we get it from your description of the problem.  So, you're extending Pawn.  Did you check the crouch code in Pawn's other subclasses?
 

===GroundSpeed PLEASE HELP!===

'''Stinky:''' I am writing a class system very similar to the RegularEngine but I can’t seem to get the GroundSpeed to change with the class. I then downloaded the RegularEngine and compiled it and realized that the GroundSpeed does not change correctly in the RegularEngine either (The sniper speed is supposed to increase to 550 but it doesn’t). Is there something else I need to do so the GroundSpeed changes with each class? Also to add on to my description, when I use the redemer secondary fire then come back into the player view the running speed does take effect. 

'''Stinky:''' Will someone please help.     I came up with a temp solution but it seems really wrong to do. I set a timer at the beginning of each spawn to adjust the ground speed for a few ticks.

'''SuperApe:''' You're right, that does sound wrong.  So, what you're saying is you're using the same Pawn class, but trying to adjust GroundSpeed?  And this can't be done with a Mutator using ModifyPlayer() or something?

'''Stinky:''' Yeah, the way im doing it now works, but it seems a little too complicated for what i think should be a simple task. I am working on a total conversion so a mutator wont do. Any ideas?

===When running a server is there a file that is viewable that contains all the actor events such as kills and who won/lost the match?===

'''Superflygizmo:''' I have been trying to find a way of logging who won or lost a match into a text file. I'm lost in this department and on the forums i have been on no-one has really given me some specifics on ways of getting around this. Basically i need this info to be written to a text file so that an outside program can see who won etc. People gave me hints on extending the console to do this but i have no idea where to start (total programming novice). But then i thought that if i ran a server on the same machine and had my game connect to it then the server must store this information somewhere as it has to share these results with all the other clients. Its a university project to create a non linear game and i decided to use the unreal engine.to get around loading cutscenes and different endings i decided that i could use a program called macromedia director to do all the level loading. As the maps must have multiple exits i thought that if i made a game type mod that when you reached exit 1  you ranked first in the level,exit two you ranked second and so forth. Then this outcome would be written to a text file that director could read and then director would interpret these results and know which level to load. I just dont really know which way to turn. Please help!!!

'''Sweavo:''' You're crazy if you think you can do this with no scripting!  But what you want to do is not too hard once you understand how to script.  Look in the wiki for getting started information.  You want to build a Mutator.  Mutator contains a method that is called at game end and you can extend this to write &quot;XYZ won!&quot; or whatever you like into the UT2004.log file.  It's a steep curve to get started in scripting, but once you get the hang of it, you might even throw Director away and do the whole thing in the engine.

'''Nobody:''' Read up on [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]] and SaveConfig(). You can write a mutator that creates and writes to its own ini file (which is all text) and create variables that are saved to that file at the end of the game. Then all you need to do is have your external program open that ini file for read. Its really pretty simple as far as scripting goes; just a matter of using the correct syntax @ class declaration and variable declaration. After that just set the varibles you created equal to the data you want to save in that ini file and use SaveConfig() at the game end event.&lt;br /&gt;Oh, you might also consider using ngstats and parsing the Unicode log it will save in the Logs folder in the ut dir. Might be easier just to script your own ini file, easier to parse.

'''Sweavo:''' Also: GameStats might be your friend

===KarmaBoostVolume===

'''craze:''' hey, I could never get this to work correctly, can someone write something up on how exactly to make it work?

'''craze:''' guess new questions go at teh top... heh

===Low gravity levels in UT99 the Right way ===

'''McNutcase:''' This seems blatantly obvious, but I can't find it: how does UT99 handle making levels low-gravity by default? I haven't been able to figure it out... I got approximately the right effect by setting bGravityZone to True in the [[Legacy:LevelInfo_(UT)|LevelInfo]] properties and halving the magnitude of the Z-gravity, but that's an egregious hack and will break in conjunction with the LowGrav mutator. There's obviously another way to do it, since that &quot;fix&quot; isn't active in DM-Morpheus, but I haven't been able to find it. What am I missing here?

'''Tarquin:''' I suspect Morpheus does it at the ZoneInfo level, since the indoor areas have normal gravity.

'''McNutcase:''' Looks like it might have to break, then... I'll go and look for at least the right official magnitude, so as to keep the feel consistent...

'''Ch3z:''' I don't know if this helps or not, but the code in Botpack.LowGrav is very simple. It expands Mutator, gets rid of all UtJumpboots and sets the ZoneGravity properties of all ZoneInfo in the map to vect(0,0,-200) in the CheckReplacement function. That's all it does. I was also thinking you might look into embedding a mutator into your map that unregisters the lowgrav mutator if in the chain?? A thought.

'''McNutcase:''' in that case, hacking the LevelInfo properties won't break with LowGrav... although I suspect I want the gravity a bit higher than 200, since the default is 950. Certainly 200 is a bit low. Now I just need to figure out how to deal with exiting a WaterZone via a WarpZone...

'''Evilmrfrank:''' Low gravity shouldn't be changed in the level info.  It should be changed in the zone info only.  You can change the gravity settings there to whatever you want it to be.

===Attaching karma actors to movers===

'''Blue Ion:''' The deal is as simple as the question. I want to attach a karma actor to a mover so when it is triggered  the karma actor would follow the mover and at the same time swing, be shot, and other fun stuff to do with karma actors.

The idea is to make an elevator that is held with chains that could swing and ultimately break when shot.

The KBSJoint should do the trick except that it won't work with anything that is either BSP geometry or an other karma actor, and during gameplay, when the karma is activated, the thing shoots of to the center of the world.

'''Foxpaw:''' It is possible that you are not setting up the KBSJoint correctly. It is intended to go between either a Karma simulated actor and another Karma simulated actor, or a Karma simulated actor and the world.

I believe that attaching to a mover will require a modest amount of coding. However, if you are going to have to custom code something it might not make sense to use Karma at all, and instead code your own elevator physics, since it is a fairly simple case.

Alternatively, you could get rid of the mover and make the whole thing work on Karma. That would also require some amount of scripting.

===Calling movement(moveforward etc) from within script===

'''Simul:''' Hi Im creating a script that reads in movement information from a java program on a remote computer and moves the player in unreal.  That is working fine, and now I have 3 values (X,Y,Z) in my script, however I cant for the life of me work out how to emulate a keyboard/mouse input to use the information (like moveForward).  At the moment I am able to use move() on xpawn however there has to be a less dodgy way to do this.  I can get the rotation of the player working fine, its just the movement.  

'''Xian:''' Hello! Unfortunately I don't know anything about UE 2, only UE 1, but I assume the best way (and possibly only way ?) is to modify the aBaseY variable in PlayerInput. One way would be changing the InputClass in Engine.PlayerController to your class extending PlayerInput and possibly adding hooking functions there (or simply do it easier by changing them directly in Engine.PlayerController). The reason I told you to use an Input class is that the input moments are best accessed in the PlayerInput ticking event, therefore you need to do it there. This was doing a quick skimming of the UT2kX code so it is not guaranteed to work, but may be a push in the right direction :)

===Overriding a native source function in script.===

'''Baz:''' Hi Im trying to override AONSWheeledCraft:: ProcessCarInput() in a subclass of ONSWheeledCraft. is this at all possible, or are all native functions final. Are native functions with the same name as script functions considered different because they dont have the same number?

'''Foxpaw:''' You can override UnrealScript functions declared as native, if they are not final. (Many are, but not all.) However, the function you have indicated does not have a corresponding UnrealScript function, so you cannot override it with UnrealScript. There is probrably an UnrealScript function that you can override to get the same result as you are trying to achieve.

'''Baz:''' oh well, my problem is that bIsInverted is set and checked in the native code, and if bIsInverted is true a vehicle wont reverse when its are upsidedown. Ive got a scorpian driving on the celing, but when you drive into a corner you cant drive out again.

'''Nobody:''' I don't know the code you are refering to, but can you intercept it when the user attempts reverse and check to see if bIsInverted=true and if so set vehicle's rotation 180º from current? If you do that in increments, maybe a for loop, then it might feel like it is some automatic feature of the vehicle, and not some funky hack of the game, like driving on the ceiling hehehehe just kiddin'. 

'''Xian:''' Loops is a bad idea. best way to smoothen rotation changes is using DeltaTime.

===Converting BSP to static mesh no longer evil?===

UTF8_REPLACEMENT9;''Tarquin:''' There used to be this: [[udn2:ConvertingBspBrushesIsSuboptimal]]. However, I was looking for this page just now, and I couldn't see it linked from ANY other page on the UDN. Does that mean that maybe it's ok to do it now? Maybe they've improved the way UnrealEd converts to static meshes?

'''Ragdoll:''' I dont know of any improvements in the BSP-&gt;Static Mesh conversion. It seems ok for basic shapes like cubes etc but from my experience for complex meshes it is better to use a external 3D modelling application. This page explains it quite well:http://angelmapper.com/tutorials/uedmeshes.htm

===Registering GameRules===

'''Tarquin:''' Everywhere I've sene examples of using a [[Legacy:GameRules|GameRules]] class, I've seen this sort of code used to register it:

&lt;uscript&gt;
  if ( Level.Game.GameRulesModifiers == None ) {
    Level.Game.GameRulesModifiers = myRules;
  } else {
    Level.Game.GameRulesModifiers.AddGameRules(myRules);
  }
&lt;/uscript&gt;

However, there's an AddGameModifier function in [[Legacy:GameInfo|GameInfo]] that handles the case where no game rules are in the linked list. So you can just do this:

&lt;uscript&gt;
  Level.Game.AddGameModifier(myRules);
&lt;/uscript&gt;

This seems simpler... or is there a reason it might not always work?

'''Nobody:''' I don't believe AddGameModifier was implemented until UT2004. That GameInfo link only goes to the UT2003 version of the class.

===Hud with mouse problems?===

Okay...  I have been trying to create a little user interface for my game.  Instead of the player looking around with the mouse, the player will have an overhead perspective and is able to interact with things via their mouse.  The problem is, I can't exactly make that work.  Here's what I've got so far.  A custom PlayerController with some game related variables but also a call to Player.GUIController to turn it on... like this.

&lt;uscript&gt;
class CustomPlayerController extends PlayerController;

var BaseGUIController HudController;

exec function MakeGUI()  //it's an exec function just to make things easier for testing purposes
{
   HudController = MQ_HudController(Player.GUIController);
   HudController.SetControllerStatus(true);
}
&lt;/uscript&gt;

MQ_HudController is a custom GUIController that I thought I would need to add custom functionality.  So, what that does is turns on the GUIController which activates mouse functionality.  Here's where things get hard for me.  I can't for the life of me figure out how the actual GUI pages and components for the menu's are 'activated' once the mouse is clicked on them.  I've looked through all relevant classes (from BaseGUIController to GUI, GUIComponent etc...)  Currently, I have no overhead perspective working because I wanted to get this completed first.  All I want for the player to be able to do right now is be able to click anywhere on the ground (with the mouse of course) and then have the pawn of the player move there.  Later I want to add other stuff, but I figure if I figure this out first, I can do the other stuff pretty fast.  Can anyone help me to get the mouse able to be clicked on the ground and have the pawn move there?  PS.  I don't really want like an invisible GUIPage or anything infront of the hud.. if that's possible.

'''Nobody:''' Sounds like a 2D curser in a 3D world. He's gonna get teased in school. =( I think I would be going at it in this fasion:&lt;br /&gt;    Make curser invisible.&lt;br /&gt;    Declare an object with a location in 3D space (and a mesh or a sprite),&lt;br /&gt;    and set it's x and y = to the curser's x and y keeping it's z.&lt;br /&gt;    Change z in response user input via their configured jump and crouch keys.&lt;br /&gt;    if this objects vector location is = to another objects vect location (within it's collision radius maybe) when the mouse is clicked, or possibly the object fire(...)'s or whatever, then dostuff().&lt;br /&gt;Maybe the lil guy will make friends in the 3D world now, hehehe. But this is like your the curser and it's in 3rd person view, why not make it firstperson view in fly mode? Then already have the navigation done, and you can use trace or watch for the other objects vector location and rotation to be where it would be right in front of you but not right in your face. My two cents. Fun Idea, I'd sure like to see it when it's done.

===Almost ready to launch mod, but a few questions ===

'''Kou''':  Okay, I'm about ready to release a demo of a mod I just made, but I (stupidly) designed the text in my windows based on pixels, and I'm running on 1280x1024 resolution.  Is there a simple way to snap everything into place or am I going to have to set it for each resolution each time?  This is an example of what I currently have...

&lt;uscript&gt;
       C.SetPos(550, 292);
       C.DrawColor.R = 255;
       C.DrawColor.G = 255;
       C.DrawColor.B = 255;
       C.DrawText( &quot;Error!&quot;, False );
&lt;/uscript&gt;

'''Foxpaw:''' The typical way to resolve this is to multiply by some value based on the resolution. Usually fractional numbers are used and they are multiplied by the resolution, but you can just as easily multiply by the resolution divided by 1280x1024.

IE:

&lt;uscript&gt;
local float XRes, YRes;

XRes = C.SizeX / 1280;
YRes = C.SizeY / 1024;

C.SetPos(550*XRes, 292*YRes);
&lt;/uscript&gt;

'''Kou:''' Thanks, that (kinda) fixed the problem.  I'm wondering how I may play different music in the Instant Action game configuration area rather than the generic UT2k4 menu music. 

===Warp Zones===

'''Jezinator:''' Right, erm sorry if this looks a bit wierd but I've never written like this before.  I have a problem with Warp Zones you see.  Im creating a fundamentally mind boggling map using warp zones, not loads of warp zones, just two pairs of them.  I have textured the sheet that defines the zone with AssaultFilmGrain becuase i couldn't find a transparent texture anywhere :) im using UT2K4 btw.  Anyways the problem is that there is an area of the map behind the warp zone and the geometry is showing through in a very wierd way whenever I play the map.  Its like the corridor behind the Zone (which has nothing to do with the zone itself)  Is overriding the corridor that the Zone links to.  The zone still works perfectly, but its just a glaring aesthetic problem.  I am aware that that was perhaps not the best explanation ever but its a wierd problem.  If there were some way of posting the map here.... Dunno, if anyone has any help, i would seriously appreciate it.  Also I have two other, complete maps which I would like to distribute and don't know how.    

'''evil_blue_dude:UTF8_REPLACEMENT9;''Rotate one of the zone portals 180 degress. If that doesnt work then rotate them both 180 degrees. (but be sure to try the first before trying the second)

'''Jezinator:''' Yes i did try that, even before I asked here, it doesn't help.  I can't figure out why that happened.

'''Foxpaw:''' I'm not sure if I'm understanding the problem correctly, but it sounds like you might want to try setting the walls of the corridor that has the warpzone info in it to fake backdrop.

'''MythOpus:''' The author probably hasn't been here for some time now but don't the WarpZoneInfos override the texture they have on the surface anyways?  Having that transparent texture could be throwing the WarpZoneInfo off and having it reveal BSP on the other side.

===Collision And caft===

'''FOD'''Hi im making a mod which is a subclass of decoration the only problem is that when i assign a static mesh to the class and play the level im finding all the wheeled craft are sinking into the meshes. I've got collision meshes on the objects and they work fine as just static meshs, but as soon as i use them in a script i find i can drive right through them? Im sure they were fine at one point, but my head so full of code im realy not sure anymore.lol.

'''MythOpus:'''By Wheeled Craft do you mean to imply you're using the karma system?  If so you will need to create Karam Collision Hulls.  Don't know if you already do have them or not though :S

'''FOD'''I think the collision hulls are set ok (if i choose View colision in unrealed the meshs all have pink outlines.) ive got all the settings in collision in the actors properties set to on. Should i be using the simplified collision hull karma/line or box. Its real odd as im using the same static meshs for things like vehicle lifts and the collision is fine there. When i say wheeled craft i mean the scorpion,helbender,hovertenk,artillery and the shock tank. They dont go right through the mesh...just sink up to about their wheel axle. Like being in quicksand? Im sure the answer is blindingly obvious but its winding me up to be getting these sort of problems after all the coding ive just done.For a test made script that just places an actor onto the level:-

&lt;uscript&gt; class MyActor extends Actor
	placeable;

defaultproperties
{
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'HumanoidHardware.Beams.jribbedcolumn01HA'
     DrawScale3D=(X=50.000000,Y=50.000000,Z=1.000000)     
     bCollideActors=True
     bBlockActors=True
     bAutoAlignToTerrain=True
     bBlockKarma=True

}&lt;/uscript&gt; 

Now if i try to drive over this in a wheeled craft...quicksand!

but if i simply just place a static mesh into the map next to it ..the static mesh one is solid and

can be driven over? im confused.

The collision is fine if you side swipe the mesh or hit it with a flying craft or even if i just drive directly at it.

Just did another test..used the same script as above but this time made it a subclass of 'mover' and the collision is ok.?! I suppose i could derive the mod from a mover rather than a decoration but i think there are certain network issues with the 'mover' class which may upset the way my mod works.What are the properties that mover have that make it more solid?

===ACTION_ShootTarget... what are the firing modes?===

'''Tomko:''' Trying to setup the above action, but the bot just doesnt want to fire at the SetViewTarget I've assigned. Through reading this udn page (http://udn.epicgames.com/Two/ScriptedSequenceActions#ShootTarget), it lists AssaultRifle Modes, but I can't get those working either. I have an ACTION_SetViewTarget above it, which points to another xPawn for him to shoot, but it's a no go. The other pawn is in view, in distance, etc... just can't figure out what I might be doing wrong.

Any assistance would be greatly appreciated, there doesn't seem to be a wealth of information on this action, anywhere!

p.s. I've also tried the ACTION_FireWeaponAt to no avail.

===Make bots/monsters ignore you?===

'''Missilemaster:''' I'm very new to coding; right now I'm finishing up a modified Raptor with a &quot;cloaking device&quot;, which puts an invisible skin on it. It works well, but, of course, bots and monsters can &quot;see&quot; it when it's cloaked. Besides map botpathing, I know basically nothing about bot AI. Does anyone know a relatively simple way to make computer opponents ignore this vehicle when it's cloaked (that is, when a variable is a certain value)?

'''Defx:''' I suggest taking a look at Invis Combo, there seems to be a function called SetInvisibility, hope this helps

===Console Commands / exec function doesn't work===

'''Jan:''' Which classes (UT99) can I use for adding new console commands? I used PlayerPawn but nothing happens if I typed in the command into the console. UT returns with &quot;unrecognized command&quot; message. I've tested it with a simple class like that:

&lt;uscript&gt;class something expands PlayerPawn

exec function LogStuff()
{
  log(&quot;log tah f****** stuff&quot;);
}&lt;/uscript&gt;

'''Xian:''' UScript: Engine.PlayerPawn, Engine.Console, Engine.Inventory, Engine.HUD (and subclasses obviously)

Native: (apart from the above) Engine.Player, Engine.SubSystem, Engine.Client, Engine.Engine, Engine.GameInfo, Engine.Input, Engine.Level (NOT ENGINE.LEVELINFO), and of course, all their subclasses...

It isn't as simple as subclassing PlayerPawn and that's it... you need to subclass a proper player controller subclass (namely something like TMale1 or TMale2 which are children of TournamentPlayer which is a child class of PlayerPawn) and then insert them in the game with a mutator by hooking Engine.Mutator.ModifyLogin()

'''MythOpus:''' Well I'm pretty sure PlayerPawn DOES work with exec functions but as you said, you DO have to get it into the game somehow.  If you created a class and put an exec function in it and thats it, its like... er... trying to use a coffee maker thats still in the car.  You have to take it out of the car, i.e. have the player take 'control' of the PlayerPawn, take the coffeemaker out of the box and use it, i.e. Call the exec function on that PlayerPawn.  If the player doesn't have control of the PlayerPawn when you call the exec function, then engine gives you the &quot;unrecognized command&quot; because it really doesn't know that command even exists. 

----

===Recent Changes &amp; Image Upload/Deletion===

'''Kartoshka:''' I noticed that the Recent Changes page doesn't show my username when uploading or deleting an image, only my IP address. My username ''does'' show up after a normal page edit though. Not a big deal, but maybe something to look at...:)

'''Mychaeel:''' It does show ''mine'' when I do anything &amp;ndash; support for that is built in.  I've noticed that I seem to be the only Unreal Wiki user whose user name is displayed when doing anything in the image uploader, though &amp;ndash; I wonder why that is.  Which URL do you use to access the Unreal Wiki?  (Perhaps it's a cookie-related issue.)

'''Kartoshka:''' I use wiki.beyondunreal.com. I tried www.unrealwiki.com, but this just redirected me to wiki.beyondunreal.com. I tried logging in after entering www.unrealwiki.com just to be sure, and the same thing happened. (no username, just IP on upload and deletion). I am even using a different computer with a different IP address than before, so it doesn't seem likely to be a problem on my end.

----

===Static Array Limit?===

'''MM:''' Is there a limit to the [length] of a static array? (In Unreal Engine 1) Such as &lt;uscript&gt;var string testtxt[1000000]
&lt;/uscript&gt;

'''MythOpus:'''  Yes I do believe there is a limit and its probably lower then UE 2.x.  I can't give you exact specifics but you can try different values for the length of an array and see if the compiler complains.  I'm not sure if it will but if it doesn't you should also try writing/reading to the last index of the array just to be sure.

'''Ambershee:''' If it's something that's going to be replicated, then the limit is horribly low. It's 9. I found that out the hard and horrible way.</text>
    </revision>
    <revision>
      <id>11700</id>
      <timestamp>2008-05-03T14:01:32Z</timestamp>
      <contributor>
        <username>Neo b</username>
        <id>411</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">Got a problem? Post your question here and we'll attempt to answer it. 

==Read Before Posting==

{{innerbox| A Wiki is not the ideal way to carry on long discussions. '''BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums] are recommended instead'''.

}}

===Before Posting===

The question that you plan on asking '''may have already be answered''', either here or elsewhere. Before posting, please:

* Scan this page
* [[Legacy:Search|Search]] the Wiki
* Search the [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums]

===When Posting===

When posting a question, please:

* Use correct [[Legacy:Wiki Markup|wiki markup]]
* Give your question a heading (level 3)
*''' Post your question above all other questions to avoid scrolling through older ones!'''

===After Posting===

After you have received an answer to your question, please:
* Write up the information somewhere on the site. This may involve refactoring the text from this page or a complete rewrite
* '''Remove the question and answer from this page'''
* Delete any images you uploaded to show the problem

If you see a question or discussion that has been idle for over three weeks, '''remove the question and answer.'''

==Questions==

===Expontiental Damage in a Lava Field===

I have been trying to write a script for exponiental lava damage following the inverse square law. Basically, a lavavolume that deals more damage to the player the closer it gets to the center of the lava. I've found everything I need except for a way to input the player's position. Is there any function that can call a player's x,y, and z coordinates?

'''MythOpus:''' Yes... and no.  There is a function in LevelInfo called GetLocalPlayerController.  It can be accessed using Level.GetLocalPlayerController.  This will return the clients player controller.  From there you simply need to get the location of the pawn.  This will work wonders if it'll be used offline.  The problems might start while online.  I'm not sure if it'll work properly without simulating or replication but you can always try.

===Problem Loading Maps===

'''SenorDoom:''' I'm trying to load a map from one computer into another and keep receiving this error.

History: ULinkerLoad&lt;&lt;FName &lt;- (LinkerLoad Package.LinkerLoad195 262305)) &lt;- FPoly&lt;&lt; &lt;- UPolys::Serialize &lt;- LoadObject &lt;- (Polys myLevel.Polys6081 262305==262305/1193606 111461 180953) &lt;- ULinkerLoad::Preload &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::Exec_Map &lt;- UEditorEngine::Exec &lt;- (MAP LOAD FILE=&quot;L:\royZach_map1.ut2&quot;) &lt;- UUnrealEdEngine::Exec &lt;- FileOpen &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- MessagePump &lt;- MainLoop

I've been unsuccesful finding any help with this at all.

'''Raven:''' There is an error in loading up a brush. Possible that it an error coming in from something else. Are you using any custom packages (code, static meshes, textures, ect)?

'''SenorDoom:''' No, I'm not using any custom pacakages, its all from prefabs.

'''Raven:''' Another thing to check is that verion of UT on the computer that you are moving to is the same as the one you are comming from. (i.e. both are patched the same)

===Editing Shaders ===

'''Hellborg:''' UT3, I would like to modify the standard postprocess (DOFAndBloomBlendPixelShader) used in Unreal Tournament 3. In the UT3 tech based Roboblitz I can simply edit the postprocess by directly editing the file DOFAndBloomBlendPixelShader.usf in the Engine/Shaders folder with notepad. I then simply remove the shadercache, run roboblitz, and the new shadercode is used. I can thereby implement cartoon shading in roboblitz. I tried the same with UT3, deleted the shadercashe (files RefShaderCache-PC-D3D-SM2.upk,RefShaderCache-PC-D3D-SM3.upk and RefShaderCache-PC-D3D-SM4.upk and edited DOFAndBloomBlendPixelShader.usf in notepad. However, the game gives a runtime error on startup even after the tiniest change in the shader script. I am sure,that the shader code is still fine - just changing a single constant produces this error. There is also no information given by the error message. Do I need to change certain configuration files to allow modified shader script, or is there a more general problem with my method in UT3? Or, is there a more elegant way to add a custom postprocess to the whole game scene? I asked this question in many formus already, but nobody seems to have a clue...

===Third Person View ===

'''Stick:''' UT99, I would like to use UT in third Person view, using behindview 1 works, but the crosshair is not there, and the camera is at a bad angle, i have used a mutator called 'Bullet time 3.00' it fixes this, but i dont like the rest of the things on that mutator, i would like to know how to do this without out.

===Polys Visible through walls &quot;In-Game&quot; ===

'''VENOM:''' UT99, I can &quot;see&quot; ALL my polys through walls, I have an open area map with a building in the middle, I can stand outside next to the wall and see the polycount (stat global) through the wall 900+!!, outside is about 300 polys, I can find nothing on this subject, and yes the wall is solid bsp, anyone?

===SmallNavigationPoint/Timer() ===

'''vitaloverdose'''Ive been updating my vehicle booster script and a lot of people have suggested using a navigation point for the parent class. Ive re-written the script using smallnavigation point as the parent but i cant get the timer function to fire. Is the the function available using small navigation point as a parent?   

===Scriptable Trigger===

'''Sopa de letras:''' I miss a scriptable trigger for UT1. I wish all triggering functions and conditions would be merged in one trigger :(. It's so time consuming to make chains of different triggers :(

===Weapons Slowing Down Player When Holding It===

'''Fey''':  I've been working for quite some time trying to figure out how to simulate weapons having weight.  The idea being that if you were holding a gun in your hand, it would slow you down by some arbitrary amount.  But if you changed that gun out for another one you'd speed back up again.  Over the past several days I've hit several dead ends in trying to do this.  Currently I'm thinking that I'm going to need to put a timer on somthing and then find a way to check if the characters are holding the gun, perhaps on the pawn that might be using the weapon.  I can't seem to find a good page explaing (this is my first mutator ever) how timers work, and what functions might close them.  I read on the inventory class page discription that timers are unmade in some functions.  If I try to put a timer on a pawn, will it get erased after the pawn dies, or some other event that I may not realize?  If so, I'll have to recrete the timer everytime the pawn spawns, I guess via ModifyPlayer().  

Is using a timer really the best way to do this?  I'm still trying to find a function on weapon or inventory that might trigger when a weapon is being readied or unreadied, but in the past few days I've not been able to find anything worked.  I've also not been able to find a pre-existing mutator code that makes somthing happen when the player is holding a weapon, so I've got nothing to experiment with.

'''MythOpus:'''  I suggest that instead of using the mutator to do the guts of what you're trying to do, use an [[Legacy:Interaction|Interaction]] instead.  You could do what you're proposing in the Tick function.

===Command Prompt/UCC Issue===

'''VerteX''': Command Prompt being strange

everytime i compile a code, it parsers, compiles, imports, then when it's done, it gives me warning 

Warning: Failed to load 'UberLinkGun.u': Can't find file 'UberLinkGun.u'

Warning: Failed loading package: Can't find file 'UberLinkGun.u'

Log: Analyzing...

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\DamTypeUberLinkGun.uc)

Log: Class: DamTypeUberLinkGun extends DamTypeRocket

Log: Imported: Class UberLinkGun.DamTypeUberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGun.uc)

Log: Class: UberLinkGun extends LinkGun

Log: Imported: Class UberLinkGun.UberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunAttach.uc)

Log: Class: UberLinkGunAttach extends LinkAttachment

Log: Imported: Class UberLinkGun.UberLinkGunAttach

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunFire.uc)

Log: Class: UberLinkGunFire extends LinkAltFire

Log: Imported: Class UberLinkGun.UberLinkGunFire

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunPickup.uc)

Log: Class: UberLinkGunPickup extends LinkGunPickup

Log: Imported: Class UberLinkGun.UberLinkGunPickup

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunProj.uc)

Log: Class: UberLinkGunProj extends RocketProj

Log: Imported: Class UberLinkGun.UberLinkGunProj

Log: Parsing UberLinkGunAttach

Log: Parsing DamTypeUberLinkGun

Log: Parsing UberLinkGun

Log: Parsing UberLinkGunPickup

Log: Parsing UberLinkGunProj

Log: Parsing UberLinkGunFire

Log: Compiling UberLinkGunAttach

Log: Compiling DamTypeUberLinkGun

Log: Compiling UberLinkGun

Log: Compiling UberLinkGunPickup

Log: Compiling UberLinkGunProj

Log: Compiling UberLinkGunFire

Log: Importing Defaults for UberLinkGunAttach

Log: Importing Defaults for DamTypeUberLinkGun

Log: Importing Defaults for UberLinkGun

Log: Importing Defaults for UberLinkGunPickup

Log: Importing Defaults for UberLinkGunProj

Log: Importing Defaults for UberLinkGunFire

Log: Success: Compiled 43 line(s), 9 statement(s).

Log: Save=205.184198

Log: Moving '\System\Save.tmp' to '\System\UberLinkGun.u'

Warning: Failed to load '\System\UberLinkGun': Can't find file '\System\UberLinkGun'

Warning: Failed loading package: Can't find file '\System\UberLinkGun'

Warning: Error loading \System\UberLinkGun !!!

Log: Success - 0 error(s), 1 warning(s)

Exit: Preparing to exit.

Log: Purging garbage

Log: Unbound to Core.dll

Log: Unbound to Editor.dll

Log: Unbound to Engine.dll

Exit: Editor shut down

Log: Unbound to Fire.dll

Log: Unbound to IpDrv.dll

Log: Unbound to UWeb.dll

Log: Unbound to XGame.dll

Log: Unbound to XInterface.dll

Log: Unbound to Onslaught.dll

Log: Garbage: objects: 73914-&gt;0; refs: 0

Exit: Object subsystem successfully closed.

Exit: Exiting.

Log: FileManager: Reading 0 GByte 112 MByte 940 KByte 709 Bytes from HD took 0.836996 seconds (0.570996 reading, 0.266000 seeking).

Log: FileManager: 0.149000 seconds spent with misc. duties

Uninitialized: Name subsystem shut down

Uninitialized: Allocation checking disabled

Uninitialized: Log file closed, 07/15/07 15:19:17

MV was what i was trying to compile...i have no idea what to do seeing as it used to work, but recently it started giving me that warning

===Forum Issues===

'''StarWeaver''': This probably really isn't the place for this but I'm hoping someone here can point me in the right direction. My forums.beyondunreal account (same name) is totally locked down (can't post, can't PM, don't exist in the user list). I've tried emailing the contact link and haven't gotten a response in about a week, and I don't have any idea who else to talk to. I don't really want to create a new user ID if I can help it. Thanks, and sorry for the inappropriate topic.

===Question about native classes===

'''Illiander''' I'm trying to make a UT2k4 vehicle that switches between a wheeled car-type, and a flyer.  Basic problem, when I try to extend ONSVehicle, and just copy in all of ONSChopperCraft, it doen't pick up on any of the movement inputs.  Same with ONSWheeledCraft.  But when I extend those classes it picks up on the inputs.  Am I doomed to failure in this, or is there some way for me to pick up on movement commands in UScript?

===Question===

'''vertex''' I have an assault level i am making for my family to use for fun. I thought (since i'm the only mapper), that'd i'd make a little sniping area with a non-solid brush over it with the outside texture matching the wall and the inside texture transparent. The problem is, when i test it, the defending bots (who appear by a weapon locker with sniper rifles) kill me everytime i go to my secret place. Is there a way around that, so that people and bots can't see me, but i can see them and shoot them.

===Questions about certain errors===

Jameso123 

I have had a problem with UnrealED 3 i got with UT 2004 whan i start the editor the part where the vieworts should be are just white all the other stuff is working, there just isnt any viewports

'''shadow21''' I've been having a problem with UT99, I'm trying to compile a mod, and I'm having troubles with the Mesh=LODMesh'' command, the error that pops up is 'bad expression in '=', what should I do, I'm at a loss here =( any help at all will be appreciated.

===Replication : Forcing client update for &quot;prone&quot; Pawn===

'''SuperApe:''' I have a Pawn class that is updated (Physics, Location, Rotation, AnimSequence &amp; Anim frame) on Clients only when the Player has a line of sight to it.  Since this Pawn is prone (not moving, not animating), there is no reason for the bNetDirty to update this Actor.  Is there a simple way to make sure this Pawn is properly updated '''before''' the Player sees it?

'''SuperApe:''' Is this question clear enough?  Anyone have a suggestion, solution or comment on this problem?

'''Graphik:''' You've not properly explained what you're trying to accomplish or how you're trying to do it.

In case I've mentally translated your unworkable description into something partway logical: How is your code going to guess when the Player is about to change his line of sight so as to 'properly update before the player sees it'?

'''EricBlade:''' I would guess off hand that actually doing all this checking for line of sights is probably more costly than just letting the regular relevance code do what it's supposed to do?

'''SuperApe:''' Thank you.  What I mean by updating before the player sees it, is to make a ''one-time'' forced update (from the default setting of a property, which the Client has automatically, to the setting this prone Pawn should have on the Server), perhaps at map start.  For example, my Pawn should be set to PHYS_None (because of a special state it is in), but the default is PHYS_Falling.  On the server this Physics special setting is known, on the Client it is not (until the Client machine gets an update from the Server).  So, as it is now, the Player on the Client turns a corner, sees the Pawn, the Pawn falls (PHYS_Falling), then after a moment, it updates the Pawn's location, rotation, and Physics, and the Pawn *snaps* back to where it should be.  My question is related to this example.  How can I force this Pawn to update the Physics setting in time to prevent it from falling when the Client Player sees it?  As of yet, I do not have a workable solution.  It appears to me to be a limitation of the Replication scheme.  But, I thought I bring the problem up here, in case anyone would like to help me find a solution.

'''Graphik:''' Your expanded description still leaves me guessing, but I recommend you use the ModifyPlayer function. [[Legacy:Mutator|Mutator]] features a description of the function as well as an example of its use.

'''SuperApe:''' My suspicion is that this is not something that Graphik can help me with. ''(No offense, Graphik)''  But I will try to elaborate one point that appears to have been missed.  Replication, as Unreal uses it by default, causes the above example situation automatically, where the Pawn as it exists on the Client gets an update to important non-default settings on properties such as Physics only after the Client Player has seen it.  Unreal Replication is able to handle elaborate maps because it does not replicate everything all the time, only the bare minimum that's needed, when it's needed, to ''simulate'' what's happening on the Server.  This example I've described above shows that scheme in action, but I am looking for a clever workaround to somehow force this Client Pawn to update either instantly (when the Client Player sees it) perhaps do something that will ensure the Client Pawn is already set to the proper (not the default) Physics setting before this line of sight occurs.  The goal would be to avoid the situation where the Client Players see this Pawn fall and then snap back to the proper location a moment later (depending on current netspeed conditions).  IOW, I have not coded some nifty line of sight stuff, this is just how Unreal Replication works now.  I'm looking for some kind of override, so the Client Pawn does not rely on it's default property setting.  I would consider whatever workaround works, and use it on other properties as well, such as Animation-related properties, etc.

'''EricBlade:''' bAlwaysRelevant ?

'''SuperApe:''' I thought about that.  It seemed like overkill for a prone Pawn, but at the moment that appears to be the only working idea I've run across.  I'm also not sure how well that property works, being switched on/off, which I would want to do if this Pawn is in it's special state, and when it leaves it and should act more like a normal Pawn on Clients.  Thanks for the idea. :)  Hopefully a more economical idea can be found as well.

'''EricBlade:''' Seems like months since I last looked at this page, but it should probably work pretty well - if you set it bAlwaysRelevant, and it's not doing anything, it shouldn't cause any major changes in net traffic, as it'll do it's replication stuff when the player connects, but then otherwise it isn't doing anything.  As far as I can tell, setting bAlwaysRelevant on and off works pretty well - I've seen several Land of the Dead maps that have used a Security Camera type thing, but had to install a volume that makes whatever enters it bAlwaysRelevant, so that you could monitor things in a remote room (pawns would not be relevant halfway across the map, so you couldn't see them on remote cameras)

'''EntropicLqd:''' I'm guessing you've solved this problem by now.  But, wouldn't it be possible to use the bAlwaysRelevant flag with an inventory object?  It seems like a really ugly hack work around to me ... just an off the wall idea.  It's probably crazy though. 

===Control point status dissapearing from hud.===

'''plugwash''': a friend of mine has made a domination map based on the hall of champions (original UT) it works fine singleplayer but in netplay the control point status usually dissapears from the hud on first death (i think at least one control point captured by someone is also a prerequisite to the dissapearance). Ive tried removing all actors that seem to be designed for that map and even exporting and re-importing into a new map but still the issue persists any ideas on what this could be or how to track it down?

===REPLICATING A VARIABLE===

I having a problem with replication. For the past 2 weeks all I have been doing is researching it and nothing can barely explain it. I understand some of it, or at least I think I do. No replication I make works, at all, in any cases. It is just getting to me too much, how it simply does not work.

Anyways I wrote this script. Remember, some coding in this may seem &quot;noobish&quot; but this is just practice for me you could say. What it does is when this item is added to your inventory, it takes the value of an array in another actor. The variable is called LastPlayed. This value is not replicated to the client. So what I'm trying to do here is (since I cant replicate a variable that exists in another actor I didnt make) is assign the value of LastPlayed to ClientIP and then replicate ClientIP over to the client where they process it.

Here is the class...

&lt;uscript&gt;//==============================================================================
class ClientAKA extends Inventory config(AKACheckerLog);

var config string ClientLP[6000];

Replication
{
	reliable if(ROLE==ROLE_Authority)
		ClientLP;
}

simulated function PostBeginPlay()
{
	local AKA a;
	local int i;

	log(&quot;Stage1&quot;);
	Super.PostBeginPlay();

	log(&quot;Stage2&quot;);
	foreach AllActors(Class'AKA', a)
		break;

	if(Level.NetMode == NM_DedicatedServer)
	{
		log(&quot;Stage3&quot;);
		for(i=0; i&lt;6000; i++)
		{
			ClientLP[i]=a.LastPlayed[i];
		}
	}
	LogAKA();
	SaveConfig();
}

simulated function LogAKA()
{
	local int i;

	log(&quot;Stage4&quot;);
	if(Level.NetMode != NM_DedicatedServer)
	{
		log(&quot;Stage5&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logging...&quot;);
		log(&quot;v*************************-AKA Checker-*************************v&quot;);
		for(i=0; i&lt;20000 &amp;&amp; ClientLP[i]!=&quot;&quot;; i++)   //log the aka log in their ut log file
		{
			log(&quot;LastPlayed[&quot;$i$&quot;]=&quot;$ClientLP[i]);
		}
		log(&quot;^*************************-AKA Checker-*************************^&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logged the AKA.ini to your UNREALTOURNAMENT.LOG in your UT system directory.&quot;);
	}
}&lt;/uscript&gt;

I cant see what is being doen wrong, ywt ClientIP simply wont replicate. I've tried several techneques and to replicate this variable NONE of them work. For weeks I've been working on this exact mod which is so exausting seeing as I have no more resources. And I also have several other mods that dont work souly because of replication. Can anyone help me?

'''Xian:''' Well, although I don't have experience with UE2, the same principles as in UE1 should apply. From what I seem to remember, arrays can't be replicated. The only way to do it is the nooby hack that seems to go like this:

&lt;uscript&gt;
class Test extends Whatever;

var string Testers[3];

replication
{
    reliable if (Role == ROLE_Authority)
        ClientStuff;
}

function ServerStuff ()
{
    local int i;

    Testers[0] = &quot;Me&quot;;
    Testers[1] = &quot;You&quot;;
    Testers[2] = &quot;Other&quot;;

    for (i = 0; i &lt; ArrayCount(Testers); ++ i)  
       ClientStuff(Testers[i],i);
}

simulated function ClientStuff (string Entry, int i)
{
    Testers[i] = Entry;
}&lt;/uscript&gt;

Also, as you have probably guessed, the class you are using to replicate things (Weapon, Info, Actor, Emitter etc.) has to exist on both server and client. You chose Inventory, which exists on both sides IF it was spawned on the server. Also, giving it to the player and adding it to the chain ensures the simulation of the class' functions (as well as setting it to SimulatedProxy which, iirc Inventories have them). I used ArrayCount to show you a nice way to get the number of elements in case you didn't know it :)

I know that hack sucks, but it is the only way to do it (from what I know). Or at least, to do it in UE1. Hope it helps.

===Change Direction of Weapon Spin===

'''UltraN00b:''' I'm creating a level for UT2004, in which the weapon bases rotate around the inside of a large cylinder.  While the weapons rotate around the cylinder, they angle of the weapon changes as well.  This looks great, except for the fact that they still rotate on their horisontal axis.  

Is there any way to change the direction of the weapon's spin while on the weapon pad?  Tilt the rotation so they still apear to rotate normaly, but at a different angle?

===Opening Classes===

'''Tgusagalpa:''' I'm starting a mutator that a Pawn recieves the weapon they are shot with.  Should I reference the gun they are shot with through Instigator.Weapon '''or''' Projectile properties? 

'''Xian:''' So if I got it straight... you shoot me with a SnowGun (yes I am original :P) and I'll receive it either when being shot, either after respawning, right ? (well for short you want to know how to &quot;save&quot; it, as you said, reference, the Attacker's weapon, correct ?).

It's even simpler than that. You use TakeDamage() and then do InstigatedBy.Weapon (or whatever parameter name it has since it can vary). Hmm from a quick glance at the source now, I see you can use the GameRules class to hook in the game ReduceDamage function (it uses the pointer GameRulesModifiers iirc). And you can do your thing there :)

===Crashing during garbage collection??===

'''EricBlade:''' I am getting reports of crashing on level change, from people who are running my custom [[Legacy:Land Of The Dead|Land of the Dead]] game type.  We are so far unable to find a condition that specifically triggers it, but after a period of time, typically ranging from an hour to two or three hours, and anywhere from 1 to 10 level changes, the server will crash on level change.  It appears to me that it is happening during Garbage Collection at the end of level, as the following from the log shows:
 Log: Collecting garbage
 Log: Purging garbage
 Critical: UObject::GetPathName

.. it crashes at this same point on nearly all of the crashes that i've been sent logs for.  What could I be doing that would cause this?

'''Xian:''' I'd have to see the source but my quickest guess would be an object still has an actor pointer that wasn't set to None and/or an Actor has an Object pointer which is not set to None on Destroyed() events. Generally speaking if it's &quot;in use&quot; it can't be deleted and it will create that problem.

'''EricBlade:''' Hm.  That's what I'd thought might be the problem, except that I don't have any code that references actors or objects in this, except in local variables, so i'm pretty confused as to how my code would be causing something like this.  A couple of people have told me that they have run the stock game for days without crashing, but we are getting incredibly regular crashes with mine in use.  .. almost every variable in here that's not local is a string, int, float, or bool .. i did just notice that i had a class variable set to a string, in default properties, but it looks like the engine handled converting that to the proper class.  Haven't got back with the server guy yet to try it.. :|

Here's a link to the code: http://pastebin.com/714417  

And here's a link to the most recent crashlog: http://pastebin.com/714329

'''Plugwash:''' If you really care about bandwidth shouldn't you set stuff up so you can monitor it at the IP level?

'''Nobody:''' I'd rather set it than monitor it. 

'''Plugwash:''' but monitoring it on a per client ip/port combination basis would allow you to tell for sure if your attempts to set it had worked correctly. 

===PSK?===

'''tgusagalpa:''' Is there any way to create a .psk file for uPaint, when exporting from maya, instead of having to ActorX?  I know on the PLE you cannot have ActorX, so how do you export, and get a .psk? 

===Adding a MESH NOTIFY===

'''SuperApe:''' I see in SkaarjPack_rc.SkaarjMeshes, there are the MESH definitions including the Animation NOTIFY declarations using #exec directives.  I'd like to add some NOTIFYs to this list.  For example, the Skaarjw Mesh animation sequence 'guncheck' should have the Sound'blade1s' play.  I'm trying to define a FUNCTION=PlayGunCheckSound from my own Skaarj subclass and having no luck using this command:

&lt;uscript&gt;#exec MESH NOTIFY MESH=Skaarjw SEQ=guncheck TIME=0.2 FUNCTION=PlayGunCheckSound&lt;/uscript&gt;

Without changing SkaarjPack_rc.SkaarjMeshes, is there any place I can append to this list of MESH NOTIFYs?  Where does SkaarjPack_rc.SkaarjMeshes get used/read?

Anyone have info on adding to the MESH NOTIFY list?

'''Xian:''' I am not sure if you have to redefine the mesh, anim and texture redefinitions by reimporting it into your own class, but it should, theoretically work without it if you did it right. I assume we are talking about UE1 here ?

'''SuperApe:''' Actually, we're talking about adding a Mesh Notify to an existing VertexMesh in UE2.

===Crouching with new model size.===

'''Stinky:''' I have made all the classes in the mod I’m working on larger then or smaller then the default ut model. Everything works accept the crouching. Does anyone know what code to replace to make it so the models don’t fall through the ground when you crouch a lot? Also when I crouch the model stays the same height but the eye height drops to the default for ut 2004, and also the model stays the same size but falls halfway through the ground so the top of the head is at the default height. If I crouch multiple times the model just falls through the ground. Any ideas? 

'''SuperApe:''' Crouching code, including eyeheight changes, is in Pawn and its subclasses.

'''Stinky:''' Well, I have edited the code in a class extending Pawn, When I crouch though, the eye height is correct for the model, but the model falls thought hte ground as if it were the standard UT 2004 heigh. Should i post a screen?

'''SuperApe:''' No need to post a screenie, we get it from your description of the problem.  So, you're extending Pawn.  Did you check the crouch code in Pawn's other subclasses?
 

===GroundSpeed PLEASE HELP!===

'''Stinky:''' I am writing a class system very similar to the RegularEngine but I can’t seem to get the GroundSpeed to change with the class. I then downloaded the RegularEngine and compiled it and realized that the GroundSpeed does not change correctly in the RegularEngine either (The sniper speed is supposed to increase to 550 but it doesn’t). Is there something else I need to do so the GroundSpeed changes with each class? Also to add on to my description, when I use the redemer secondary fire then come back into the player view the running speed does take effect. 

'''Stinky:''' Will someone please help.     I came up with a temp solution but it seems really wrong to do. I set a timer at the beginning of each spawn to adjust the ground speed for a few ticks.

'''SuperApe:''' You're right, that does sound wrong.  So, what you're saying is you're using the same Pawn class, but trying to adjust GroundSpeed?  And this can't be done with a Mutator using ModifyPlayer() or something?

'''Stinky:''' Yeah, the way im doing it now works, but it seems a little too complicated for what i think should be a simple task. I am working on a total conversion so a mutator wont do. Any ideas?

===When running a server is there a file that is viewable that contains all the actor events such as kills and who won/lost the match?===

'''Superflygizmo:''' I have been trying to find a way of logging who won or lost a match into a text file. I'm lost in this department and on the forums i have been on no-one has really given me some specifics on ways of getting around this. Basically i need this info to be written to a text file so that an outside program can see who won etc. People gave me hints on extending the console to do this but i have no idea where to start (total programming novice). But then i thought that if i ran a server on the same machine and had my game connect to it then the server must store this information somewhere as it has to share these results with all the other clients. Its a university project to create a non linear game and i decided to use the unreal engine.to get around loading cutscenes and different endings i decided that i could use a program called macromedia director to do all the level loading. As the maps must have multiple exits i thought that if i made a game type mod that when you reached exit 1  you ranked first in the level,exit two you ranked second and so forth. Then this outcome would be written to a text file that director could read and then director would interpret these results and know which level to load. I just dont really know which way to turn. Please help!!!

'''Sweavo:''' You're crazy if you think you can do this with no scripting!  But what you want to do is not too hard once you understand how to script.  Look in the wiki for getting started information.  You want to build a Mutator.  Mutator contains a method that is called at game end and you can extend this to write &quot;XYZ won!&quot; or whatever you like into the UT2004.log file.  It's a steep curve to get started in scripting, but once you get the hang of it, you might even throw Director away and do the whole thing in the engine.

'''Nobody:''' Read up on [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]] and SaveConfig(). You can write a mutator that creates and writes to its own ini file (which is all text) and create variables that are saved to that file at the end of the game. Then all you need to do is have your external program open that ini file for read. Its really pretty simple as far as scripting goes; just a matter of using the correct syntax @ class declaration and variable declaration. After that just set the varibles you created equal to the data you want to save in that ini file and use SaveConfig() at the game end event.&lt;br /&gt;Oh, you might also consider using ngstats and parsing the Unicode log it will save in the Logs folder in the ut dir. Might be easier just to script your own ini file, easier to parse.

'''Sweavo:''' Also: GameStats might be your friend

===KarmaBoostVolume===

'''craze:''' hey, I could never get this to work correctly, can someone write something up on how exactly to make it work?

'''craze:''' guess new questions go at teh top... heh

===Low gravity levels in UT99 the Right way ===

'''McNutcase:''' This seems blatantly obvious, but I can't find it: how does UT99 handle making levels low-gravity by default? I haven't been able to figure it out... I got approximately the right effect by setting bGravityZone to True in the [[Legacy:LevelInfo_(UT)|LevelInfo]] properties and halving the magnitude of the Z-gravity, but that's an egregious hack and will break in conjunction with the LowGrav mutator. There's obviously another way to do it, since that &quot;fix&quot; isn't active in DM-Morpheus, but I haven't been able to find it. What am I missing here?

'''Tarquin:''' I suspect Morpheus does it at the ZoneInfo level, since the indoor areas have normal gravity.

'''McNutcase:''' Looks like it might have to break, then... I'll go and look for at least the right official magnitude, so as to keep the feel consistent...

'''Ch3z:''' I don't know if this helps or not, but the code in Botpack.LowGrav is very simple. It expands Mutator, gets rid of all UtJumpboots and sets the ZoneGravity properties of all ZoneInfo in the map to vect(0,0,-200) in the CheckReplacement function. That's all it does. I was also thinking you might look into embedding a mutator into your map that unregisters the lowgrav mutator if in the chain?? A thought.

'''McNutcase:''' in that case, hacking the LevelInfo properties won't break with LowGrav... although I suspect I want the gravity a bit higher than 200, since the default is 950. Certainly 200 is a bit low. Now I just need to figure out how to deal with exiting a WaterZone via a WarpZone...

'''Evilmrfrank:''' Low gravity shouldn't be changed in the level info.  It should be changed in the zone info only.  You can change the gravity settings there to whatever you want it to be.

===Attaching karma actors to movers===

'''Blue Ion:''' The deal is as simple as the question. I want to attach a karma actor to a mover so when it is triggered  the karma actor would follow the mover and at the same time swing, be shot, and other fun stuff to do with karma actors.

The idea is to make an elevator that is held with chains that could swing and ultimately break when shot.

The KBSJoint should do the trick except that it won't work with anything that is either BSP geometry or an other karma actor, and during gameplay, when the karma is activated, the thing shoots of to the center of the world.

'''Foxpaw:''' It is possible that you are not setting up the KBSJoint correctly. It is intended to go between either a Karma simulated actor and another Karma simulated actor, or a Karma simulated actor and the world.

I believe that attaching to a mover will require a modest amount of coding. However, if you are going to have to custom code something it might not make sense to use Karma at all, and instead code your own elevator physics, since it is a fairly simple case.

Alternatively, you could get rid of the mover and make the whole thing work on Karma. That would also require some amount of scripting.

===Calling movement(moveforward etc) from within script===

'''Simul:''' Hi Im creating a script that reads in movement information from a java program on a remote computer and moves the player in unreal.  That is working fine, and now I have 3 values (X,Y,Z) in my script, however I cant for the life of me work out how to emulate a keyboard/mouse input to use the information (like moveForward).  At the moment I am able to use move() on xpawn however there has to be a less dodgy way to do this.  I can get the rotation of the player working fine, its just the movement.  

'''Xian:''' Hello! Unfortunately I don't know anything about UE 2, only UE 1, but I assume the best way (and possibly only way ?) is to modify the aBaseY variable in PlayerInput. One way would be changing the InputClass in Engine.PlayerController to your class extending PlayerInput and possibly adding hooking functions there (or simply do it easier by changing them directly in Engine.PlayerController). The reason I told you to use an Input class is that the input moments are best accessed in the PlayerInput ticking event, therefore you need to do it there. This was doing a quick skimming of the UT2kX code so it is not guaranteed to work, but may be a push in the right direction :)

===Overriding a native source function in script.===

'''Baz:''' Hi Im trying to override AONSWheeledCraft:: ProcessCarInput() in a subclass of ONSWheeledCraft. is this at all possible, or are all native functions final. Are native functions with the same name as script functions considered different because they dont have the same number?

'''Foxpaw:''' You can override UnrealScript functions declared as native, if they are not final. (Many are, but not all.) However, the function you have indicated does not have a corresponding UnrealScript function, so you cannot override it with UnrealScript. There is probrably an UnrealScript function that you can override to get the same result as you are trying to achieve.

'''Baz:''' oh well, my problem is that bIsInverted is set and checked in the native code, and if bIsInverted is true a vehicle wont reverse when its are upsidedown. Ive got a scorpian driving on the celing, but when you drive into a corner you cant drive out again.

'''Nobody:''' I don't know the code you are refering to, but can you intercept it when the user attempts reverse and check to see if bIsInverted=true and if so set vehicle's rotation 180º from current? If you do that in increments, maybe a for loop, then it might feel like it is some automatic feature of the vehicle, and not some funky hack of the game, like driving on the ceiling hehehehe just kiddin'. 

'''Xian:''' Loops is a bad idea. best way to smoothen rotation changes is using DeltaTime.

===Converting BSP to static mesh no longer evil?===

UTF8_REPLACEMENT9;''Tarquin:''' There used to be this: [[udn2:ConvertingBspBrushesIsSuboptimal]]. However, I was looking for this page just now, and I couldn't see it linked from ANY other page on the UDN. Does that mean that maybe it's ok to do it now? Maybe they've improved the way UnrealEd converts to static meshes?

'''Ragdoll:''' I dont know of any improvements in the BSP-&gt;Static Mesh conversion. It seems ok for basic shapes like cubes etc but from my experience for complex meshes it is better to use a external 3D modelling application. This page explains it quite well:http://angelmapper.com/tutorials/uedmeshes.htm

===Registering GameRules===

'''Tarquin:''' Everywhere I've sene examples of using a [[Legacy:GameRules|GameRules]] class, I've seen this sort of code used to register it:

&lt;uscript&gt;
  if ( Level.Game.GameRulesModifiers == None ) {
    Level.Game.GameRulesModifiers = myRules;
  } else {
    Level.Game.GameRulesModifiers.AddGameRules(myRules);
  }
&lt;/uscript&gt;

However, there's an AddGameModifier function in [[Legacy:GameInfo|GameInfo]] that handles the case where no game rules are in the linked list. So you can just do this:

&lt;uscript&gt;
  Level.Game.AddGameModifier(myRules);
&lt;/uscript&gt;

This seems simpler... or is there a reason it might not always work?

'''Nobody:''' I don't believe AddGameModifier was implemented until UT2004. That GameInfo link only goes to the UT2003 version of the class.

===Hud with mouse problems?===

Okay...  I have been trying to create a little user interface for my game.  Instead of the player looking around with the mouse, the player will have an overhead perspective and is able to interact with things via their mouse.  The problem is, I can't exactly make that work.  Here's what I've got so far.  A custom PlayerController with some game related variables but also a call to Player.GUIController to turn it on... like this.

&lt;uscript&gt;
class CustomPlayerController extends PlayerController;

var BaseGUIController HudController;

exec function MakeGUI()  //it's an exec function just to make things easier for testing purposes
{
   HudController = MQ_HudController(Player.GUIController);
   HudController.SetControllerStatus(true);
}
&lt;/uscript&gt;

MQ_HudController is a custom GUIController that I thought I would need to add custom functionality.  So, what that does is turns on the GUIController which activates mouse functionality.  Here's where things get hard for me.  I can't for the life of me figure out how the actual GUI pages and components for the menu's are 'activated' once the mouse is clicked on them.  I've looked through all relevant classes (from BaseGUIController to GUI, GUIComponent etc...)  Currently, I have no overhead perspective working because I wanted to get this completed first.  All I want for the player to be able to do right now is be able to click anywhere on the ground (with the mouse of course) and then have the pawn of the player move there.  Later I want to add other stuff, but I figure if I figure this out first, I can do the other stuff pretty fast.  Can anyone help me to get the mouse able to be clicked on the ground and have the pawn move there?  PS.  I don't really want like an invisible GUIPage or anything infront of the hud.. if that's possible.

'''Nobody:''' Sounds like a 2D curser in a 3D world. He's gonna get teased in school. =( I think I would be going at it in this fasion:&lt;br /&gt;    Make curser invisible.&lt;br /&gt;    Declare an object with a location in 3D space (and a mesh or a sprite),&lt;br /&gt;    and set it's x and y = to the curser's x and y keeping it's z.&lt;br /&gt;    Change z in response user input via their configured jump and crouch keys.&lt;br /&gt;    if this objects vector location is = to another objects vect location (within it's collision radius maybe) when the mouse is clicked, or possibly the object fire(...)'s or whatever, then dostuff().&lt;br /&gt;Maybe the lil guy will make friends in the 3D world now, hehehe. But this is like your the curser and it's in 3rd person view, why not make it firstperson view in fly mode? Then already have the navigation done, and you can use trace or watch for the other objects vector location and rotation to be where it would be right in front of you but not right in your face. My two cents. Fun Idea, I'd sure like to see it when it's done.

===Almost ready to launch mod, but a few questions ===

'''Kou''':  Okay, I'm about ready to release a demo of a mod I just made, but I (stupidly) designed the text in my windows based on pixels, and I'm running on 1280x1024 resolution.  Is there a simple way to snap everything into place or am I going to have to set it for each resolution each time?  This is an example of what I currently have...

&lt;uscript&gt;
       C.SetPos(550, 292);
       C.DrawColor.R = 255;
       C.DrawColor.G = 255;
       C.DrawColor.B = 255;
       C.DrawText( &quot;Error!&quot;, False );
&lt;/uscript&gt;

'''Foxpaw:''' The typical way to resolve this is to multiply by some value based on the resolution. Usually fractional numbers are used and they are multiplied by the resolution, but you can just as easily multiply by the resolution divided by 1280x1024.

IE:

&lt;uscript&gt;
local float XRes, YRes;

XRes = C.SizeX / 1280;
YRes = C.SizeY / 1024;

C.SetPos(550*XRes, 292*YRes);
&lt;/uscript&gt;

'''Kou:''' Thanks, that (kinda) fixed the problem.  I'm wondering how I may play different music in the Instant Action game configuration area rather than the generic UT2k4 menu music. 

===Warp Zones===

'''Jezinator:''' Right, erm sorry if this looks a bit wierd but I've never written like this before.  I have a problem with Warp Zones you see.  Im creating a fundamentally mind boggling map using warp zones, not loads of warp zones, just two pairs of them.  I have textured the sheet that defines the zone with AssaultFilmGrain becuase i couldn't find a transparent texture anywhere :) im using UT2K4 btw.  Anyways the problem is that there is an area of the map behind the warp zone and the geometry is showing through in a very wierd way whenever I play the map.  Its like the corridor behind the Zone (which has nothing to do with the zone itself)  Is overriding the corridor that the Zone links to.  The zone still works perfectly, but its just a glaring aesthetic problem.  I am aware that that was perhaps not the best explanation ever but its a wierd problem.  If there were some way of posting the map here.... Dunno, if anyone has any help, i would seriously appreciate it.  Also I have two other, complete maps which I would like to distribute and don't know how.    

'''evil_blue_dude:UTF8_REPLACEMENT9;''Rotate one of the zone portals 180 degress. If that doesnt work then rotate them both 180 degrees. (but be sure to try the first before trying the second)

'''Jezinator:''' Yes i did try that, even before I asked here, it doesn't help.  I can't figure out why that happened.

'''Foxpaw:''' I'm not sure if I'm understanding the problem correctly, but it sounds like you might want to try setting the walls of the corridor that has the warpzone info in it to fake backdrop.

'''MythOpus:''' The author probably hasn't been here for some time now but don't the WarpZoneInfos override the texture they have on the surface anyways?  Having that transparent texture could be throwing the WarpZoneInfo off and having it reveal BSP on the other side.

===Collision And caft===

'''FOD'''Hi im making a mod which is a subclass of decoration the only problem is that when i assign a static mesh to the class and play the level im finding all the wheeled craft are sinking into the meshes. I've got collision meshes on the objects and they work fine as just static meshs, but as soon as i use them in a script i find i can drive right through them? Im sure they were fine at one point, but my head so full of code im realy not sure anymore.lol.

'''MythOpus:'''By Wheeled Craft do you mean to imply you're using the karma system?  If so you will need to create Karam Collision Hulls.  Don't know if you already do have them or not though :S

'''FOD'''I think the collision hulls are set ok (if i choose View colision in unrealed the meshs all have pink outlines.) ive got all the settings in collision in the actors properties set to on. Should i be using the simplified collision hull karma/line or box. Its real odd as im using the same static meshs for things like vehicle lifts and the collision is fine there. When i say wheeled craft i mean the scorpion,helbender,hovertenk,artillery and the shock tank. They dont go right through the mesh...just sink up to about their wheel axle. Like being in quicksand? Im sure the answer is blindingly obvious but its winding me up to be getting these sort of problems after all the coding ive just done.For a test made script that just places an actor onto the level:-

&lt;uscript&gt; class MyActor extends Actor
	placeable;

defaultproperties
{
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'HumanoidHardware.Beams.jribbedcolumn01HA'
     DrawScale3D=(X=50.000000,Y=50.000000,Z=1.000000)     
     bCollideActors=True
     bBlockActors=True
     bAutoAlignToTerrain=True
     bBlockKarma=True

}&lt;/uscript&gt; 

Now if i try to drive over this in a wheeled craft...quicksand!

but if i simply just place a static mesh into the map next to it ..the static mesh one is solid and

can be driven over? im confused.

The collision is fine if you side swipe the mesh or hit it with a flying craft or even if i just drive directly at it.

Just did another test..used the same script as above but this time made it a subclass of 'mover' and the collision is ok.?! I suppose i could derive the mod from a mover rather than a decoration but i think there are certain network issues with the 'mover' class which may upset the way my mod works.What are the properties that mover have that make it more solid?

===ACTION_ShootTarget... what are the firing modes?===

'''Tomko:''' Trying to setup the above action, but the bot just doesnt want to fire at the SetViewTarget I've assigned. Through reading this udn page (http://udn.epicgames.com/Two/ScriptedSequenceActions#ShootTarget), it lists AssaultRifle Modes, but I can't get those working either. I have an ACTION_SetViewTarget above it, which points to another xPawn for him to shoot, but it's a no go. The other pawn is in view, in distance, etc... just can't figure out what I might be doing wrong.

Any assistance would be greatly appreciated, there doesn't seem to be a wealth of information on this action, anywhere!

p.s. I've also tried the ACTION_FireWeaponAt to no avail.

===Make bots/monsters ignore you?===

'''Missilemaster:''' I'm very new to coding; right now I'm finishing up a modified Raptor with a &quot;cloaking device&quot;, which puts an invisible skin on it. It works well, but, of course, bots and monsters can &quot;see&quot; it when it's cloaked. Besides map botpathing, I know basically nothing about bot AI. Does anyone know a relatively simple way to make computer opponents ignore this vehicle when it's cloaked (that is, when a variable is a certain value)?

'''Defx:''' I suggest taking a look at Invis Combo, there seems to be a function called SetInvisibility, hope this helps

===Console Commands / exec function doesn't work===

'''Jan:''' Which classes (UT99) can I use for adding new console commands? I used PlayerPawn but nothing happens if I typed in the command into the console. UT returns with &quot;unrecognized command&quot; message. I've tested it with a simple class like that:

&lt;uscript&gt;class something expands PlayerPawn

exec function LogStuff()
{
  log(&quot;log tah f****** stuff&quot;);
}&lt;/uscript&gt;

'''Xian:''' UScript: Engine.PlayerPawn, Engine.Console, Engine.Inventory, Engine.HUD (and subclasses obviously)

Native: (apart from the above) Engine.Player, Engine.SubSystem, Engine.Client, Engine.Engine, Engine.GameInfo, Engine.Input, Engine.Level (NOT ENGINE.LEVELINFO), and of course, all their subclasses...

It isn't as simple as subclassing PlayerPawn and that's it... you need to subclass a proper player controller subclass (namely something like TMale1 or TMale2 which are children of TournamentPlayer which is a child class of PlayerPawn) and then insert them in the game with a mutator by hooking Engine.Mutator.ModifyLogin()

'''MythOpus:''' Well I'm pretty sure PlayerPawn DOES work with exec functions but as you said, you DO have to get it into the game somehow.  If you created a class and put an exec function in it and thats it, its like... er... trying to use a coffee maker thats still in the car.  You have to take it out of the car, i.e. have the player take 'control' of the PlayerPawn, take the coffeemaker out of the box and use it, i.e. Call the exec function on that PlayerPawn.  If the player doesn't have control of the PlayerPawn when you call the exec function, then engine gives you the &quot;unrecognized command&quot; because it really doesn't know that command even exists. 

----

===Recent Changes &amp; Image Upload/Deletion===

'''Kartoshka:''' I noticed that the Recent Changes page doesn't show my username when uploading or deleting an image, only my IP address. My username ''does'' show up after a normal page edit though. Not a big deal, but maybe something to look at...:)

'''Mychaeel:''' It does show ''mine'' when I do anything &amp;ndash; support for that is built in.  I've noticed that I seem to be the only Unreal Wiki user whose user name is displayed when doing anything in the image uploader, though &amp;ndash; I wonder why that is.  Which URL do you use to access the Unreal Wiki?  (Perhaps it's a cookie-related issue.)

'''Kartoshka:''' I use wiki.beyondunreal.com. I tried www.unrealwiki.com, but this just redirected me to wiki.beyondunreal.com. I tried logging in after entering www.unrealwiki.com just to be sure, and the same thing happened. (no username, just IP on upload and deletion). I am even using a different computer with a different IP address than before, so it doesn't seem likely to be a problem on my end.

----

===Static Array Limit?===

'''MM:''' Is there a limit to the [length] of a static array? (In Unreal Engine 1) Such as &lt;uscript&gt;var string testtxt[1000000]
&lt;/uscript&gt;

'''MythOpus:'''  Yes I do believe there is a limit and its probably lower then UE 2.x.  I can't give you exact specifics but you can try different values for the length of an array and see if the compiler complains.  I'm not sure if it will but if it doesn't you should also try writing/reading to the last index of the array just to be sure.

'''Ambershee:''' If it's something that's going to be replicated, then the limit is horribly low. It's 9. I found that out the hard and horrible way.

==Projectile Options changing replication==

'''Neo_b:''' Hello, I wrote an item that changes nearby projectiles heading player's way acceleration in an opposite direction. Works fine in singleplayer, although It doesnt' work in multiplayer, presumably because of missing replication. I have no idea how to replicate it. Can anybody help me? I used foreach AllActors and if a projectile heads player on at least one axe, it its acceleration is changed to reversed velocity and rotation is also reversed by 180 degrees.</text>
    </revision>
    <revision>
      <id>11701</id>
      <timestamp>2008-05-03T14:02:09Z</timestamp>
      <contributor>
        <username>Neo b</username>
        <id>411</id>
      </contributor>
      <text xml:space="preserve">Got a problem? Post your question here and we'll attempt to answer it. 

==Read Before Posting==

{{innerbox| A Wiki is not the ideal way to carry on long discussions. '''BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums] are recommended instead'''.

}}

===Before Posting===

The question that you plan on asking '''may have already be answered''', either here or elsewhere. Before posting, please:

* Scan this page
* [[Legacy:Search|Search]] the Wiki
* Search the [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums]

===When Posting===

When posting a question, please:

* Use correct [[Legacy:Wiki Markup|wiki markup]]
* Give your question a heading (level 3)
*''' Post your question above all other questions to avoid scrolling through older ones!'''

===After Posting===

After you have received an answer to your question, please:
* Write up the information somewhere on the site. This may involve refactoring the text from this page or a complete rewrite
* '''Remove the question and answer from this page'''
* Delete any images you uploaded to show the problem

If you see a question or discussion that has been idle for over three weeks, '''remove the question and answer.'''

==Questions==

===Expontiental Damage in a Lava Field===

I have been trying to write a script for exponiental lava damage following the inverse square law. Basically, a lavavolume that deals more damage to the player the closer it gets to the center of the lava. I've found everything I need except for a way to input the player's position. Is there any function that can call a player's x,y, and z coordinates?

'''MythOpus:''' Yes... and no.  There is a function in LevelInfo called GetLocalPlayerController.  It can be accessed using Level.GetLocalPlayerController.  This will return the clients player controller.  From there you simply need to get the location of the pawn.  This will work wonders if it'll be used offline.  The problems might start while online.  I'm not sure if it'll work properly without simulating or replication but you can always try.

===Problem Loading Maps===

'''SenorDoom:''' I'm trying to load a map from one computer into another and keep receiving this error.

History: ULinkerLoad&lt;&lt;FName &lt;- (LinkerLoad Package.LinkerLoad195 262305)) &lt;- FPoly&lt;&lt; &lt;- UPolys::Serialize &lt;- LoadObject &lt;- (Polys myLevel.Polys6081 262305==262305/1193606 111461 180953) &lt;- ULinkerLoad::Preload &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::Exec_Map &lt;- UEditorEngine::Exec &lt;- (MAP LOAD FILE=&quot;L:\royZach_map1.ut2&quot;) &lt;- UUnrealEdEngine::Exec &lt;- FileOpen &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- MessagePump &lt;- MainLoop

I've been unsuccesful finding any help with this at all.

'''Raven:''' There is an error in loading up a brush. Possible that it an error coming in from something else. Are you using any custom packages (code, static meshes, textures, ect)?

'''SenorDoom:''' No, I'm not using any custom pacakages, its all from prefabs.

'''Raven:''' Another thing to check is that verion of UT on the computer that you are moving to is the same as the one you are comming from. (i.e. both are patched the same)

===Editing Shaders ===

'''Hellborg:''' UT3, I would like to modify the standard postprocess (DOFAndBloomBlendPixelShader) used in Unreal Tournament 3. In the UT3 tech based Roboblitz I can simply edit the postprocess by directly editing the file DOFAndBloomBlendPixelShader.usf in the Engine/Shaders folder with notepad. I then simply remove the shadercache, run roboblitz, and the new shadercode is used. I can thereby implement cartoon shading in roboblitz. I tried the same with UT3, deleted the shadercashe (files RefShaderCache-PC-D3D-SM2.upk,RefShaderCache-PC-D3D-SM3.upk and RefShaderCache-PC-D3D-SM4.upk and edited DOFAndBloomBlendPixelShader.usf in notepad. However, the game gives a runtime error on startup even after the tiniest change in the shader script. I am sure,that the shader code is still fine - just changing a single constant produces this error. There is also no information given by the error message. Do I need to change certain configuration files to allow modified shader script, or is there a more general problem with my method in UT3? Or, is there a more elegant way to add a custom postprocess to the whole game scene? I asked this question in many formus already, but nobody seems to have a clue...

===Third Person View ===

'''Stick:''' UT99, I would like to use UT in third Person view, using behindview 1 works, but the crosshair is not there, and the camera is at a bad angle, i have used a mutator called 'Bullet time 3.00' it fixes this, but i dont like the rest of the things on that mutator, i would like to know how to do this without out.

===Polys Visible through walls &quot;In-Game&quot; ===

'''VENOM:''' UT99, I can &quot;see&quot; ALL my polys through walls, I have an open area map with a building in the middle, I can stand outside next to the wall and see the polycount (stat global) through the wall 900+!!, outside is about 300 polys, I can find nothing on this subject, and yes the wall is solid bsp, anyone?

===SmallNavigationPoint/Timer() ===

'''vitaloverdose'''Ive been updating my vehicle booster script and a lot of people have suggested using a navigation point for the parent class. Ive re-written the script using smallnavigation point as the parent but i cant get the timer function to fire. Is the the function available using small navigation point as a parent?   

===Scriptable Trigger===

'''Sopa de letras:''' I miss a scriptable trigger for UT1. I wish all triggering functions and conditions would be merged in one trigger :(. It's so time consuming to make chains of different triggers :(

===Weapons Slowing Down Player When Holding It===

'''Fey''':  I've been working for quite some time trying to figure out how to simulate weapons having weight.  The idea being that if you were holding a gun in your hand, it would slow you down by some arbitrary amount.  But if you changed that gun out for another one you'd speed back up again.  Over the past several days I've hit several dead ends in trying to do this.  Currently I'm thinking that I'm going to need to put a timer on somthing and then find a way to check if the characters are holding the gun, perhaps on the pawn that might be using the weapon.  I can't seem to find a good page explaing (this is my first mutator ever) how timers work, and what functions might close them.  I read on the inventory class page discription that timers are unmade in some functions.  If I try to put a timer on a pawn, will it get erased after the pawn dies, or some other event that I may not realize?  If so, I'll have to recrete the timer everytime the pawn spawns, I guess via ModifyPlayer().  

Is using a timer really the best way to do this?  I'm still trying to find a function on weapon or inventory that might trigger when a weapon is being readied or unreadied, but in the past few days I've not been able to find anything worked.  I've also not been able to find a pre-existing mutator code that makes somthing happen when the player is holding a weapon, so I've got nothing to experiment with.

'''MythOpus:'''  I suggest that instead of using the mutator to do the guts of what you're trying to do, use an [[Legacy:Interaction|Interaction]] instead.  You could do what you're proposing in the Tick function.

===Command Prompt/UCC Issue===

'''VerteX''': Command Prompt being strange

everytime i compile a code, it parsers, compiles, imports, then when it's done, it gives me warning 

Warning: Failed to load 'UberLinkGun.u': Can't find file 'UberLinkGun.u'

Warning: Failed loading package: Can't find file 'UberLinkGun.u'

Log: Analyzing...

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\DamTypeUberLinkGun.uc)

Log: Class: DamTypeUberLinkGun extends DamTypeRocket

Log: Imported: Class UberLinkGun.DamTypeUberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGun.uc)

Log: Class: UberLinkGun extends LinkGun

Log: Imported: Class UberLinkGun.UberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunAttach.uc)

Log: Class: UberLinkGunAttach extends LinkAttachment

Log: Imported: Class UberLinkGun.UberLinkGunAttach

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunFire.uc)

Log: Class: UberLinkGunFire extends LinkAltFire

Log: Imported: Class UberLinkGun.UberLinkGunFire

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunPickup.uc)

Log: Class: UberLinkGunPickup extends LinkGunPickup

Log: Imported: Class UberLinkGun.UberLinkGunPickup

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunProj.uc)

Log: Class: UberLinkGunProj extends RocketProj

Log: Imported: Class UberLinkGun.UberLinkGunProj

Log: Parsing UberLinkGunAttach

Log: Parsing DamTypeUberLinkGun

Log: Parsing UberLinkGun

Log: Parsing UberLinkGunPickup

Log: Parsing UberLinkGunProj

Log: Parsing UberLinkGunFire

Log: Compiling UberLinkGunAttach

Log: Compiling DamTypeUberLinkGun

Log: Compiling UberLinkGun

Log: Compiling UberLinkGunPickup

Log: Compiling UberLinkGunProj

Log: Compiling UberLinkGunFire

Log: Importing Defaults for UberLinkGunAttach

Log: Importing Defaults for DamTypeUberLinkGun

Log: Importing Defaults for UberLinkGun

Log: Importing Defaults for UberLinkGunPickup

Log: Importing Defaults for UberLinkGunProj

Log: Importing Defaults for UberLinkGunFire

Log: Success: Compiled 43 line(s), 9 statement(s).

Log: Save=205.184198

Log: Moving '\System\Save.tmp' to '\System\UberLinkGun.u'

Warning: Failed to load '\System\UberLinkGun': Can't find file '\System\UberLinkGun'

Warning: Failed loading package: Can't find file '\System\UberLinkGun'

Warning: Error loading \System\UberLinkGun !!!

Log: Success - 0 error(s), 1 warning(s)

Exit: Preparing to exit.

Log: Purging garbage

Log: Unbound to Core.dll

Log: Unbound to Editor.dll

Log: Unbound to Engine.dll

Exit: Editor shut down

Log: Unbound to Fire.dll

Log: Unbound to IpDrv.dll

Log: Unbound to UWeb.dll

Log: Unbound to XGame.dll

Log: Unbound to XInterface.dll

Log: Unbound to Onslaught.dll

Log: Garbage: objects: 73914-&gt;0; refs: 0

Exit: Object subsystem successfully closed.

Exit: Exiting.

Log: FileManager: Reading 0 GByte 112 MByte 940 KByte 709 Bytes from HD took 0.836996 seconds (0.570996 reading, 0.266000 seeking).

Log: FileManager: 0.149000 seconds spent with misc. duties

Uninitialized: Name subsystem shut down

Uninitialized: Allocation checking disabled

Uninitialized: Log file closed, 07/15/07 15:19:17

MV was what i was trying to compile...i have no idea what to do seeing as it used to work, but recently it started giving me that warning

===Forum Issues===

'''StarWeaver''': This probably really isn't the place for this but I'm hoping someone here can point me in the right direction. My forums.beyondunreal account (same name) is totally locked down (can't post, can't PM, don't exist in the user list). I've tried emailing the contact link and haven't gotten a response in about a week, and I don't have any idea who else to talk to. I don't really want to create a new user ID if I can help it. Thanks, and sorry for the inappropriate topic.

===Question about native classes===

'''Illiander''' I'm trying to make a UT2k4 vehicle that switches between a wheeled car-type, and a flyer.  Basic problem, when I try to extend ONSVehicle, and just copy in all of ONSChopperCraft, it doen't pick up on any of the movement inputs.  Same with ONSWheeledCraft.  But when I extend those classes it picks up on the inputs.  Am I doomed to failure in this, or is there some way for me to pick up on movement commands in UScript?

===Question===

'''vertex''' I have an assault level i am making for my family to use for fun. I thought (since i'm the only mapper), that'd i'd make a little sniping area with a non-solid brush over it with the outside texture matching the wall and the inside texture transparent. The problem is, when i test it, the defending bots (who appear by a weapon locker with sniper rifles) kill me everytime i go to my secret place. Is there a way around that, so that people and bots can't see me, but i can see them and shoot them.

===Questions about certain errors===

Jameso123 

I have had a problem with UnrealED 3 i got with UT 2004 whan i start the editor the part where the vieworts should be are just white all the other stuff is working, there just isnt any viewports

'''shadow21''' I've been having a problem with UT99, I'm trying to compile a mod, and I'm having troubles with the Mesh=LODMesh'' command, the error that pops up is 'bad expression in '=', what should I do, I'm at a loss here =( any help at all will be appreciated.

===Replication : Forcing client update for &quot;prone&quot; Pawn===

'''SuperApe:''' I have a Pawn class that is updated (Physics, Location, Rotation, AnimSequence &amp; Anim frame) on Clients only when the Player has a line of sight to it.  Since this Pawn is prone (not moving, not animating), there is no reason for the bNetDirty to update this Actor.  Is there a simple way to make sure this Pawn is properly updated '''before''' the Player sees it?

'''SuperApe:''' Is this question clear enough?  Anyone have a suggestion, solution or comment on this problem?

'''Graphik:''' You've not properly explained what you're trying to accomplish or how you're trying to do it.

In case I've mentally translated your unworkable description into something partway logical: How is your code going to guess when the Player is about to change his line of sight so as to 'properly update before the player sees it'?

'''EricBlade:''' I would guess off hand that actually doing all this checking for line of sights is probably more costly than just letting the regular relevance code do what it's supposed to do?

'''SuperApe:''' Thank you.  What I mean by updating before the player sees it, is to make a ''one-time'' forced update (from the default setting of a property, which the Client has automatically, to the setting this prone Pawn should have on the Server), perhaps at map start.  For example, my Pawn should be set to PHYS_None (because of a special state it is in), but the default is PHYS_Falling.  On the server this Physics special setting is known, on the Client it is not (until the Client machine gets an update from the Server).  So, as it is now, the Player on the Client turns a corner, sees the Pawn, the Pawn falls (PHYS_Falling), then after a moment, it updates the Pawn's location, rotation, and Physics, and the Pawn *snaps* back to where it should be.  My question is related to this example.  How can I force this Pawn to update the Physics setting in time to prevent it from falling when the Client Player sees it?  As of yet, I do not have a workable solution.  It appears to me to be a limitation of the Replication scheme.  But, I thought I bring the problem up here, in case anyone would like to help me find a solution.

'''Graphik:''' Your expanded description still leaves me guessing, but I recommend you use the ModifyPlayer function. [[Legacy:Mutator|Mutator]] features a description of the function as well as an example of its use.

'''SuperApe:''' My suspicion is that this is not something that Graphik can help me with. ''(No offense, Graphik)''  But I will try to elaborate one point that appears to have been missed.  Replication, as Unreal uses it by default, causes the above example situation automatically, where the Pawn as it exists on the Client gets an update to important non-default settings on properties such as Physics only after the Client Player has seen it.  Unreal Replication is able to handle elaborate maps because it does not replicate everything all the time, only the bare minimum that's needed, when it's needed, to ''simulate'' what's happening on the Server.  This example I've described above shows that scheme in action, but I am looking for a clever workaround to somehow force this Client Pawn to update either instantly (when the Client Player sees it) perhaps do something that will ensure the Client Pawn is already set to the proper (not the default) Physics setting before this line of sight occurs.  The goal would be to avoid the situation where the Client Players see this Pawn fall and then snap back to the proper location a moment later (depending on current netspeed conditions).  IOW, I have not coded some nifty line of sight stuff, this is just how Unreal Replication works now.  I'm looking for some kind of override, so the Client Pawn does not rely on it's default property setting.  I would consider whatever workaround works, and use it on other properties as well, such as Animation-related properties, etc.

'''EricBlade:''' bAlwaysRelevant ?

'''SuperApe:''' I thought about that.  It seemed like overkill for a prone Pawn, but at the moment that appears to be the only working idea I've run across.  I'm also not sure how well that property works, being switched on/off, which I would want to do if this Pawn is in it's special state, and when it leaves it and should act more like a normal Pawn on Clients.  Thanks for the idea. :)  Hopefully a more economical idea can be found as well.

'''EricBlade:''' Seems like months since I last looked at this page, but it should probably work pretty well - if you set it bAlwaysRelevant, and it's not doing anything, it shouldn't cause any major changes in net traffic, as it'll do it's replication stuff when the player connects, but then otherwise it isn't doing anything.  As far as I can tell, setting bAlwaysRelevant on and off works pretty well - I've seen several Land of the Dead maps that have used a Security Camera type thing, but had to install a volume that makes whatever enters it bAlwaysRelevant, so that you could monitor things in a remote room (pawns would not be relevant halfway across the map, so you couldn't see them on remote cameras)

'''EntropicLqd:''' I'm guessing you've solved this problem by now.  But, wouldn't it be possible to use the bAlwaysRelevant flag with an inventory object?  It seems like a really ugly hack work around to me ... just an off the wall idea.  It's probably crazy though. 

===Control point status dissapearing from hud.===

'''plugwash''': a friend of mine has made a domination map based on the hall of champions (original UT) it works fine singleplayer but in netplay the control point status usually dissapears from the hud on first death (i think at least one control point captured by someone is also a prerequisite to the dissapearance). Ive tried removing all actors that seem to be designed for that map and even exporting and re-importing into a new map but still the issue persists any ideas on what this could be or how to track it down?

===REPLICATING A VARIABLE===

I having a problem with replication. For the past 2 weeks all I have been doing is researching it and nothing can barely explain it. I understand some of it, or at least I think I do. No replication I make works, at all, in any cases. It is just getting to me too much, how it simply does not work.

Anyways I wrote this script. Remember, some coding in this may seem &quot;noobish&quot; but this is just practice for me you could say. What it does is when this item is added to your inventory, it takes the value of an array in another actor. The variable is called LastPlayed. This value is not replicated to the client. So what I'm trying to do here is (since I cant replicate a variable that exists in another actor I didnt make) is assign the value of LastPlayed to ClientIP and then replicate ClientIP over to the client where they process it.

Here is the class...

&lt;uscript&gt;//==============================================================================
class ClientAKA extends Inventory config(AKACheckerLog);

var config string ClientLP[6000];

Replication
{
	reliable if(ROLE==ROLE_Authority)
		ClientLP;
}

simulated function PostBeginPlay()
{
	local AKA a;
	local int i;

	log(&quot;Stage1&quot;);
	Super.PostBeginPlay();

	log(&quot;Stage2&quot;);
	foreach AllActors(Class'AKA', a)
		break;

	if(Level.NetMode == NM_DedicatedServer)
	{
		log(&quot;Stage3&quot;);
		for(i=0; i&lt;6000; i++)
		{
			ClientLP[i]=a.LastPlayed[i];
		}
	}
	LogAKA();
	SaveConfig();
}

simulated function LogAKA()
{
	local int i;

	log(&quot;Stage4&quot;);
	if(Level.NetMode != NM_DedicatedServer)
	{
		log(&quot;Stage5&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logging...&quot;);
		log(&quot;v*************************-AKA Checker-*************************v&quot;);
		for(i=0; i&lt;20000 &amp;&amp; ClientLP[i]!=&quot;&quot;; i++)   //log the aka log in their ut log file
		{
			log(&quot;LastPlayed[&quot;$i$&quot;]=&quot;$ClientLP[i]);
		}
		log(&quot;^*************************-AKA Checker-*************************^&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logged the AKA.ini to your UNREALTOURNAMENT.LOG in your UT system directory.&quot;);
	}
}&lt;/uscript&gt;

I cant see what is being doen wrong, ywt ClientIP simply wont replicate. I've tried several techneques and to replicate this variable NONE of them work. For weeks I've been working on this exact mod which is so exausting seeing as I have no more resources. And I also have several other mods that dont work souly because of replication. Can anyone help me?

'''Xian:''' Well, although I don't have experience with UE2, the same principles as in UE1 should apply. From what I seem to remember, arrays can't be replicated. The only way to do it is the nooby hack that seems to go like this:

&lt;uscript&gt;
class Test extends Whatever;

var string Testers[3];

replication
{
    reliable if (Role == ROLE_Authority)
        ClientStuff;
}

function ServerStuff ()
{
    local int i;

    Testers[0] = &quot;Me&quot;;
    Testers[1] = &quot;You&quot;;
    Testers[2] = &quot;Other&quot;;

    for (i = 0; i &lt; ArrayCount(Testers); ++ i)  
       ClientStuff(Testers[i],i);
}

simulated function ClientStuff (string Entry, int i)
{
    Testers[i] = Entry;
}&lt;/uscript&gt;

Also, as you have probably guessed, the class you are using to replicate things (Weapon, Info, Actor, Emitter etc.) has to exist on both server and client. You chose Inventory, which exists on both sides IF it was spawned on the server. Also, giving it to the player and adding it to the chain ensures the simulation of the class' functions (as well as setting it to SimulatedProxy which, iirc Inventories have them). I used ArrayCount to show you a nice way to get the number of elements in case you didn't know it :)

I know that hack sucks, but it is the only way to do it (from what I know). Or at least, to do it in UE1. Hope it helps.

===Change Direction of Weapon Spin===

'''UltraN00b:''' I'm creating a level for UT2004, in which the weapon bases rotate around the inside of a large cylinder.  While the weapons rotate around the cylinder, they angle of the weapon changes as well.  This looks great, except for the fact that they still rotate on their horisontal axis.  

Is there any way to change the direction of the weapon's spin while on the weapon pad?  Tilt the rotation so they still apear to rotate normaly, but at a different angle?

===Opening Classes===

'''Tgusagalpa:''' I'm starting a mutator that a Pawn recieves the weapon they are shot with.  Should I reference the gun they are shot with through Instigator.Weapon '''or''' Projectile properties? 

'''Xian:''' So if I got it straight... you shoot me with a SnowGun (yes I am original :P) and I'll receive it either when being shot, either after respawning, right ? (well for short you want to know how to &quot;save&quot; it, as you said, reference, the Attacker's weapon, correct ?).

It's even simpler than that. You use TakeDamage() and then do InstigatedBy.Weapon (or whatever parameter name it has since it can vary). Hmm from a quick glance at the source now, I see you can use the GameRules class to hook in the game ReduceDamage function (it uses the pointer GameRulesModifiers iirc). And you can do your thing there :)

===Crashing during garbage collection??===

'''EricBlade:''' I am getting reports of crashing on level change, from people who are running my custom [[Legacy:Land Of The Dead|Land of the Dead]] game type.  We are so far unable to find a condition that specifically triggers it, but after a period of time, typically ranging from an hour to two or three hours, and anywhere from 1 to 10 level changes, the server will crash on level change.  It appears to me that it is happening during Garbage Collection at the end of level, as the following from the log shows:
 Log: Collecting garbage
 Log: Purging garbage
 Critical: UObject::GetPathName

.. it crashes at this same point on nearly all of the crashes that i've been sent logs for.  What could I be doing that would cause this?

'''Xian:''' I'd have to see the source but my quickest guess would be an object still has an actor pointer that wasn't set to None and/or an Actor has an Object pointer which is not set to None on Destroyed() events. Generally speaking if it's &quot;in use&quot; it can't be deleted and it will create that problem.

'''EricBlade:''' Hm.  That's what I'd thought might be the problem, except that I don't have any code that references actors or objects in this, except in local variables, so i'm pretty confused as to how my code would be causing something like this.  A couple of people have told me that they have run the stock game for days without crashing, but we are getting incredibly regular crashes with mine in use.  .. almost every variable in here that's not local is a string, int, float, or bool .. i did just notice that i had a class variable set to a string, in default properties, but it looks like the engine handled converting that to the proper class.  Haven't got back with the server guy yet to try it.. :|

Here's a link to the code: http://pastebin.com/714417  

And here's a link to the most recent crashlog: http://pastebin.com/714329

'''Plugwash:''' If you really care about bandwidth shouldn't you set stuff up so you can monitor it at the IP level?

'''Nobody:''' I'd rather set it than monitor it. 

'''Plugwash:''' but monitoring it on a per client ip/port combination basis would allow you to tell for sure if your attempts to set it had worked correctly. 

===PSK?===

'''tgusagalpa:''' Is there any way to create a .psk file for uPaint, when exporting from maya, instead of having to ActorX?  I know on the PLE you cannot have ActorX, so how do you export, and get a .psk? 

===Adding a MESH NOTIFY===

'''SuperApe:''' I see in SkaarjPack_rc.SkaarjMeshes, there are the MESH definitions including the Animation NOTIFY declarations using #exec directives.  I'd like to add some NOTIFYs to this list.  For example, the Skaarjw Mesh animation sequence 'guncheck' should have the Sound'blade1s' play.  I'm trying to define a FUNCTION=PlayGunCheckSound from my own Skaarj subclass and having no luck using this command:

&lt;uscript&gt;#exec MESH NOTIFY MESH=Skaarjw SEQ=guncheck TIME=0.2 FUNCTION=PlayGunCheckSound&lt;/uscript&gt;

Without changing SkaarjPack_rc.SkaarjMeshes, is there any place I can append to this list of MESH NOTIFYs?  Where does SkaarjPack_rc.SkaarjMeshes get used/read?

Anyone have info on adding to the MESH NOTIFY list?

'''Xian:''' I am not sure if you have to redefine the mesh, anim and texture redefinitions by reimporting it into your own class, but it should, theoretically work without it if you did it right. I assume we are talking about UE1 here ?

'''SuperApe:''' Actually, we're talking about adding a Mesh Notify to an existing VertexMesh in UE2.

===Crouching with new model size.===

'''Stinky:''' I have made all the classes in the mod I’m working on larger then or smaller then the default ut model. Everything works accept the crouching. Does anyone know what code to replace to make it so the models don’t fall through the ground when you crouch a lot? Also when I crouch the model stays the same height but the eye height drops to the default for ut 2004, and also the model stays the same size but falls halfway through the ground so the top of the head is at the default height. If I crouch multiple times the model just falls through the ground. Any ideas? 

'''SuperApe:''' Crouching code, including eyeheight changes, is in Pawn and its subclasses.

'''Stinky:''' Well, I have edited the code in a class extending Pawn, When I crouch though, the eye height is correct for the model, but the model falls thought hte ground as if it were the standard UT 2004 heigh. Should i post a screen?

'''SuperApe:''' No need to post a screenie, we get it from your description of the problem.  So, you're extending Pawn.  Did you check the crouch code in Pawn's other subclasses?
 

===GroundSpeed PLEASE HELP!===

'''Stinky:''' I am writing a class system very similar to the RegularEngine but I can’t seem to get the GroundSpeed to change with the class. I then downloaded the RegularEngine and compiled it and realized that the GroundSpeed does not change correctly in the RegularEngine either (The sniper speed is supposed to increase to 550 but it doesn’t). Is there something else I need to do so the GroundSpeed changes with each class? Also to add on to my description, when I use the redemer secondary fire then come back into the player view the running speed does take effect. 

'''Stinky:''' Will someone please help.     I came up with a temp solution but it seems really wrong to do. I set a timer at the beginning of each spawn to adjust the ground speed for a few ticks.

'''SuperApe:''' You're right, that does sound wrong.  So, what you're saying is you're using the same Pawn class, but trying to adjust GroundSpeed?  And this can't be done with a Mutator using ModifyPlayer() or something?

'''Stinky:''' Yeah, the way im doing it now works, but it seems a little too complicated for what i think should be a simple task. I am working on a total conversion so a mutator wont do. Any ideas?

===When running a server is there a file that is viewable that contains all the actor events such as kills and who won/lost the match?===

'''Superflygizmo:''' I have been trying to find a way of logging who won or lost a match into a text file. I'm lost in this department and on the forums i have been on no-one has really given me some specifics on ways of getting around this. Basically i need this info to be written to a text file so that an outside program can see who won etc. People gave me hints on extending the console to do this but i have no idea where to start (total programming novice). But then i thought that if i ran a server on the same machine and had my game connect to it then the server must store this information somewhere as it has to share these results with all the other clients. Its a university project to create a non linear game and i decided to use the unreal engine.to get around loading cutscenes and different endings i decided that i could use a program called macromedia director to do all the level loading. As the maps must have multiple exits i thought that if i made a game type mod that when you reached exit 1  you ranked first in the level,exit two you ranked second and so forth. Then this outcome would be written to a text file that director could read and then director would interpret these results and know which level to load. I just dont really know which way to turn. Please help!!!

'''Sweavo:''' You're crazy if you think you can do this with no scripting!  But what you want to do is not too hard once you understand how to script.  Look in the wiki for getting started information.  You want to build a Mutator.  Mutator contains a method that is called at game end and you can extend this to write &quot;XYZ won!&quot; or whatever you like into the UT2004.log file.  It's a steep curve to get started in scripting, but once you get the hang of it, you might even throw Director away and do the whole thing in the engine.

'''Nobody:''' Read up on [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]] and SaveConfig(). You can write a mutator that creates and writes to its own ini file (which is all text) and create variables that are saved to that file at the end of the game. Then all you need to do is have your external program open that ini file for read. Its really pretty simple as far as scripting goes; just a matter of using the correct syntax @ class declaration and variable declaration. After that just set the varibles you created equal to the data you want to save in that ini file and use SaveConfig() at the game end event.&lt;br /&gt;Oh, you might also consider using ngstats and parsing the Unicode log it will save in the Logs folder in the ut dir. Might be easier just to script your own ini file, easier to parse.

'''Sweavo:''' Also: GameStats might be your friend

===KarmaBoostVolume===

'''craze:''' hey, I could never get this to work correctly, can someone write something up on how exactly to make it work?

'''craze:''' guess new questions go at teh top... heh

===Low gravity levels in UT99 the Right way ===

'''McNutcase:''' This seems blatantly obvious, but I can't find it: how does UT99 handle making levels low-gravity by default? I haven't been able to figure it out... I got approximately the right effect by setting bGravityZone to True in the [[Legacy:LevelInfo_(UT)|LevelInfo]] properties and halving the magnitude of the Z-gravity, but that's an egregious hack and will break in conjunction with the LowGrav mutator. There's obviously another way to do it, since that &quot;fix&quot; isn't active in DM-Morpheus, but I haven't been able to find it. What am I missing here?

'''Tarquin:''' I suspect Morpheus does it at the ZoneInfo level, since the indoor areas have normal gravity.

'''McNutcase:''' Looks like it might have to break, then... I'll go and look for at least the right official magnitude, so as to keep the feel consistent...

'''Ch3z:''' I don't know if this helps or not, but the code in Botpack.LowGrav is very simple. It expands Mutator, gets rid of all UtJumpboots and sets the ZoneGravity properties of all ZoneInfo in the map to vect(0,0,-200) in the CheckReplacement function. That's all it does. I was also thinking you might look into embedding a mutator into your map that unregisters the lowgrav mutator if in the chain?? A thought.

'''McNutcase:''' in that case, hacking the LevelInfo properties won't break with LowGrav... although I suspect I want the gravity a bit higher than 200, since the default is 950. Certainly 200 is a bit low. Now I just need to figure out how to deal with exiting a WaterZone via a WarpZone...

'''Evilmrfrank:''' Low gravity shouldn't be changed in the level info.  It should be changed in the zone info only.  You can change the gravity settings there to whatever you want it to be.

===Attaching karma actors to movers===

'''Blue Ion:''' The deal is as simple as the question. I want to attach a karma actor to a mover so when it is triggered  the karma actor would follow the mover and at the same time swing, be shot, and other fun stuff to do with karma actors.

The idea is to make an elevator that is held with chains that could swing and ultimately break when shot.

The KBSJoint should do the trick except that it won't work with anything that is either BSP geometry or an other karma actor, and during gameplay, when the karma is activated, the thing shoots of to the center of the world.

'''Foxpaw:''' It is possible that you are not setting up the KBSJoint correctly. It is intended to go between either a Karma simulated actor and another Karma simulated actor, or a Karma simulated actor and the world.

I believe that attaching to a mover will require a modest amount of coding. However, if you are going to have to custom code something it might not make sense to use Karma at all, and instead code your own elevator physics, since it is a fairly simple case.

Alternatively, you could get rid of the mover and make the whole thing work on Karma. That would also require some amount of scripting.

===Calling movement(moveforward etc) from within script===

'''Simul:''' Hi Im creating a script that reads in movement information from a java program on a remote computer and moves the player in unreal.  That is working fine, and now I have 3 values (X,Y,Z) in my script, however I cant for the life of me work out how to emulate a keyboard/mouse input to use the information (like moveForward).  At the moment I am able to use move() on xpawn however there has to be a less dodgy way to do this.  I can get the rotation of the player working fine, its just the movement.  

'''Xian:''' Hello! Unfortunately I don't know anything about UE 2, only UE 1, but I assume the best way (and possibly only way ?) is to modify the aBaseY variable in PlayerInput. One way would be changing the InputClass in Engine.PlayerController to your class extending PlayerInput and possibly adding hooking functions there (or simply do it easier by changing them directly in Engine.PlayerController). The reason I told you to use an Input class is that the input moments are best accessed in the PlayerInput ticking event, therefore you need to do it there. This was doing a quick skimming of the UT2kX code so it is not guaranteed to work, but may be a push in the right direction :)

===Overriding a native source function in script.===

'''Baz:''' Hi Im trying to override AONSWheeledCraft:: ProcessCarInput() in a subclass of ONSWheeledCraft. is this at all possible, or are all native functions final. Are native functions with the same name as script functions considered different because they dont have the same number?

'''Foxpaw:''' You can override UnrealScript functions declared as native, if they are not final. (Many are, but not all.) However, the function you have indicated does not have a corresponding UnrealScript function, so you cannot override it with UnrealScript. There is probrably an UnrealScript function that you can override to get the same result as you are trying to achieve.

'''Baz:''' oh well, my problem is that bIsInverted is set and checked in the native code, and if bIsInverted is true a vehicle wont reverse when its are upsidedown. Ive got a scorpian driving on the celing, but when you drive into a corner you cant drive out again.

'''Nobody:''' I don't know the code you are refering to, but can you intercept it when the user attempts reverse and check to see if bIsInverted=true and if so set vehicle's rotation 180º from current? If you do that in increments, maybe a for loop, then it might feel like it is some automatic feature of the vehicle, and not some funky hack of the game, like driving on the ceiling hehehehe just kiddin'. 

'''Xian:''' Loops is a bad idea. best way to smoothen rotation changes is using DeltaTime.

===Converting BSP to static mesh no longer evil?===

UTF8_REPLACEMENT9;''Tarquin:''' There used to be this: [[udn2:ConvertingBspBrushesIsSuboptimal]]. However, I was looking for this page just now, and I couldn't see it linked from ANY other page on the UDN. Does that mean that maybe it's ok to do it now? Maybe they've improved the way UnrealEd converts to static meshes?

'''Ragdoll:''' I dont know of any improvements in the BSP-&gt;Static Mesh conversion. It seems ok for basic shapes like cubes etc but from my experience for complex meshes it is better to use a external 3D modelling application. This page explains it quite well:http://angelmapper.com/tutorials/uedmeshes.htm

===Registering GameRules===

'''Tarquin:''' Everywhere I've sene examples of using a [[Legacy:GameRules|GameRules]] class, I've seen this sort of code used to register it:

&lt;uscript&gt;
  if ( Level.Game.GameRulesModifiers == None ) {
    Level.Game.GameRulesModifiers = myRules;
  } else {
    Level.Game.GameRulesModifiers.AddGameRules(myRules);
  }
&lt;/uscript&gt;

However, there's an AddGameModifier function in [[Legacy:GameInfo|GameInfo]] that handles the case where no game rules are in the linked list. So you can just do this:

&lt;uscript&gt;
  Level.Game.AddGameModifier(myRules);
&lt;/uscript&gt;

This seems simpler... or is there a reason it might not always work?

'''Nobody:''' I don't believe AddGameModifier was implemented until UT2004. That GameInfo link only goes to the UT2003 version of the class.

===Hud with mouse problems?===

Okay...  I have been trying to create a little user interface for my game.  Instead of the player looking around with the mouse, the player will have an overhead perspective and is able to interact with things via their mouse.  The problem is, I can't exactly make that work.  Here's what I've got so far.  A custom PlayerController with some game related variables but also a call to Player.GUIController to turn it on... like this.

&lt;uscript&gt;
class CustomPlayerController extends PlayerController;

var BaseGUIController HudController;

exec function MakeGUI()  //it's an exec function just to make things easier for testing purposes
{
   HudController = MQ_HudController(Player.GUIController);
   HudController.SetControllerStatus(true);
}
&lt;/uscript&gt;

MQ_HudController is a custom GUIController that I thought I would need to add custom functionality.  So, what that does is turns on the GUIController which activates mouse functionality.  Here's where things get hard for me.  I can't for the life of me figure out how the actual GUI pages and components for the menu's are 'activated' once the mouse is clicked on them.  I've looked through all relevant classes (from BaseGUIController to GUI, GUIComponent etc...)  Currently, I have no overhead perspective working because I wanted to get this completed first.  All I want for the player to be able to do right now is be able to click anywhere on the ground (with the mouse of course) and then have the pawn of the player move there.  Later I want to add other stuff, but I figure if I figure this out first, I can do the other stuff pretty fast.  Can anyone help me to get the mouse able to be clicked on the ground and have the pawn move there?  PS.  I don't really want like an invisible GUIPage or anything infront of the hud.. if that's possible.

'''Nobody:''' Sounds like a 2D curser in a 3D world. He's gonna get teased in school. =( I think I would be going at it in this fasion:&lt;br /&gt;    Make curser invisible.&lt;br /&gt;    Declare an object with a location in 3D space (and a mesh or a sprite),&lt;br /&gt;    and set it's x and y = to the curser's x and y keeping it's z.&lt;br /&gt;    Change z in response user input via their configured jump and crouch keys.&lt;br /&gt;    if this objects vector location is = to another objects vect location (within it's collision radius maybe) when the mouse is clicked, or possibly the object fire(...)'s or whatever, then dostuff().&lt;br /&gt;Maybe the lil guy will make friends in the 3D world now, hehehe. But this is like your the curser and it's in 3rd person view, why not make it firstperson view in fly mode? Then already have the navigation done, and you can use trace or watch for the other objects vector location and rotation to be where it would be right in front of you but not right in your face. My two cents. Fun Idea, I'd sure like to see it when it's done.

===Almost ready to launch mod, but a few questions ===

'''Kou''':  Okay, I'm about ready to release a demo of a mod I just made, but I (stupidly) designed the text in my windows based on pixels, and I'm running on 1280x1024 resolution.  Is there a simple way to snap everything into place or am I going to have to set it for each resolution each time?  This is an example of what I currently have...

&lt;uscript&gt;
       C.SetPos(550, 292);
       C.DrawColor.R = 255;
       C.DrawColor.G = 255;
       C.DrawColor.B = 255;
       C.DrawText( &quot;Error!&quot;, False );
&lt;/uscript&gt;

'''Foxpaw:''' The typical way to resolve this is to multiply by some value based on the resolution. Usually fractional numbers are used and they are multiplied by the resolution, but you can just as easily multiply by the resolution divided by 1280x1024.

IE:

&lt;uscript&gt;
local float XRes, YRes;

XRes = C.SizeX / 1280;
YRes = C.SizeY / 1024;

C.SetPos(550*XRes, 292*YRes);
&lt;/uscript&gt;

'''Kou:''' Thanks, that (kinda) fixed the problem.  I'm wondering how I may play different music in the Instant Action game configuration area rather than the generic UT2k4 menu music. 

===Warp Zones===

'''Jezinator:''' Right, erm sorry if this looks a bit wierd but I've never written like this before.  I have a problem with Warp Zones you see.  Im creating a fundamentally mind boggling map using warp zones, not loads of warp zones, just two pairs of them.  I have textured the sheet that defines the zone with AssaultFilmGrain becuase i couldn't find a transparent texture anywhere :) im using UT2K4 btw.  Anyways the problem is that there is an area of the map behind the warp zone and the geometry is showing through in a very wierd way whenever I play the map.  Its like the corridor behind the Zone (which has nothing to do with the zone itself)  Is overriding the corridor that the Zone links to.  The zone still works perfectly, but its just a glaring aesthetic problem.  I am aware that that was perhaps not the best explanation ever but its a wierd problem.  If there were some way of posting the map here.... Dunno, if anyone has any help, i would seriously appreciate it.  Also I have two other, complete maps which I would like to distribute and don't know how.    

'''evil_blue_dude:UTF8_REPLACEMENT9;''Rotate one of the zone portals 180 degress. If that doesnt work then rotate them both 180 degrees. (but be sure to try the first before trying the second)

'''Jezinator:''' Yes i did try that, even before I asked here, it doesn't help.  I can't figure out why that happened.

'''Foxpaw:''' I'm not sure if I'm understanding the problem correctly, but it sounds like you might want to try setting the walls of the corridor that has the warpzone info in it to fake backdrop.

'''MythOpus:''' The author probably hasn't been here for some time now but don't the WarpZoneInfos override the texture they have on the surface anyways?  Having that transparent texture could be throwing the WarpZoneInfo off and having it reveal BSP on the other side.

===Collision And caft===

'''FOD'''Hi im making a mod which is a subclass of decoration the only problem is that when i assign a static mesh to the class and play the level im finding all the wheeled craft are sinking into the meshes. I've got collision meshes on the objects and they work fine as just static meshs, but as soon as i use them in a script i find i can drive right through them? Im sure they were fine at one point, but my head so full of code im realy not sure anymore.lol.

'''MythOpus:'''By Wheeled Craft do you mean to imply you're using the karma system?  If so you will need to create Karam Collision Hulls.  Don't know if you already do have them or not though :S

'''FOD'''I think the collision hulls are set ok (if i choose View colision in unrealed the meshs all have pink outlines.) ive got all the settings in collision in the actors properties set to on. Should i be using the simplified collision hull karma/line or box. Its real odd as im using the same static meshs for things like vehicle lifts and the collision is fine there. When i say wheeled craft i mean the scorpion,helbender,hovertenk,artillery and the shock tank. They dont go right through the mesh...just sink up to about their wheel axle. Like being in quicksand? Im sure the answer is blindingly obvious but its winding me up to be getting these sort of problems after all the coding ive just done.For a test made script that just places an actor onto the level:-

&lt;uscript&gt; class MyActor extends Actor
	placeable;

defaultproperties
{
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'HumanoidHardware.Beams.jribbedcolumn01HA'
     DrawScale3D=(X=50.000000,Y=50.000000,Z=1.000000)     
     bCollideActors=True
     bBlockActors=True
     bAutoAlignToTerrain=True
     bBlockKarma=True

}&lt;/uscript&gt; 

Now if i try to drive over this in a wheeled craft...quicksand!

but if i simply just place a static mesh into the map next to it ..the static mesh one is solid and

can be driven over? im confused.

The collision is fine if you side swipe the mesh or hit it with a flying craft or even if i just drive directly at it.

Just did another test..used the same script as above but this time made it a subclass of 'mover' and the collision is ok.?! I suppose i could derive the mod from a mover rather than a decoration but i think there are certain network issues with the 'mover' class which may upset the way my mod works.What are the properties that mover have that make it more solid?

===ACTION_ShootTarget... what are the firing modes?===

'''Tomko:''' Trying to setup the above action, but the bot just doesnt want to fire at the SetViewTarget I've assigned. Through reading this udn page (http://udn.epicgames.com/Two/ScriptedSequenceActions#ShootTarget), it lists AssaultRifle Modes, but I can't get those working either. I have an ACTION_SetViewTarget above it, which points to another xPawn for him to shoot, but it's a no go. The other pawn is in view, in distance, etc... just can't figure out what I might be doing wrong.

Any assistance would be greatly appreciated, there doesn't seem to be a wealth of information on this action, anywhere!

p.s. I've also tried the ACTION_FireWeaponAt to no avail.

===Make bots/monsters ignore you?===

'''Missilemaster:''' I'm very new to coding; right now I'm finishing up a modified Raptor with a &quot;cloaking device&quot;, which puts an invisible skin on it. It works well, but, of course, bots and monsters can &quot;see&quot; it when it's cloaked. Besides map botpathing, I know basically nothing about bot AI. Does anyone know a relatively simple way to make computer opponents ignore this vehicle when it's cloaked (that is, when a variable is a certain value)?

'''Defx:''' I suggest taking a look at Invis Combo, there seems to be a function called SetInvisibility, hope this helps

===Console Commands / exec function doesn't work===

'''Jan:''' Which classes (UT99) can I use for adding new console commands? I used PlayerPawn but nothing happens if I typed in the command into the console. UT returns with &quot;unrecognized command&quot; message. I've tested it with a simple class like that:

&lt;uscript&gt;class something expands PlayerPawn

exec function LogStuff()
{
  log(&quot;log tah f****** stuff&quot;);
}&lt;/uscript&gt;

'''Xian:''' UScript: Engine.PlayerPawn, Engine.Console, Engine.Inventory, Engine.HUD (and subclasses obviously)

Native: (apart from the above) Engine.Player, Engine.SubSystem, Engine.Client, Engine.Engine, Engine.GameInfo, Engine.Input, Engine.Level (NOT ENGINE.LEVELINFO), and of course, all their subclasses...

It isn't as simple as subclassing PlayerPawn and that's it... you need to subclass a proper player controller subclass (namely something like TMale1 or TMale2 which are children of TournamentPlayer which is a child class of PlayerPawn) and then insert them in the game with a mutator by hooking Engine.Mutator.ModifyLogin()

'''MythOpus:''' Well I'm pretty sure PlayerPawn DOES work with exec functions but as you said, you DO have to get it into the game somehow.  If you created a class and put an exec function in it and thats it, its like... er... trying to use a coffee maker thats still in the car.  You have to take it out of the car, i.e. have the player take 'control' of the PlayerPawn, take the coffeemaker out of the box and use it, i.e. Call the exec function on that PlayerPawn.  If the player doesn't have control of the PlayerPawn when you call the exec function, then engine gives you the &quot;unrecognized command&quot; because it really doesn't know that command even exists. 

----

===Recent Changes &amp; Image Upload/Deletion===

'''Kartoshka:''' I noticed that the Recent Changes page doesn't show my username when uploading or deleting an image, only my IP address. My username ''does'' show up after a normal page edit though. Not a big deal, but maybe something to look at...:)

'''Mychaeel:''' It does show ''mine'' when I do anything &amp;ndash; support for that is built in.  I've noticed that I seem to be the only Unreal Wiki user whose user name is displayed when doing anything in the image uploader, though &amp;ndash; I wonder why that is.  Which URL do you use to access the Unreal Wiki?  (Perhaps it's a cookie-related issue.)

'''Kartoshka:''' I use wiki.beyondunreal.com. I tried www.unrealwiki.com, but this just redirected me to wiki.beyondunreal.com. I tried logging in after entering www.unrealwiki.com just to be sure, and the same thing happened. (no username, just IP on upload and deletion). I am even using a different computer with a different IP address than before, so it doesn't seem likely to be a problem on my end.

----

===Static Array Limit?===

'''MM:''' Is there a limit to the [length] of a static array? (In Unreal Engine 1) Such as &lt;uscript&gt;var string testtxt[1000000]
&lt;/uscript&gt;

'''MythOpus:'''  Yes I do believe there is a limit and its probably lower then UE 2.x.  I can't give you exact specifics but you can try different values for the length of an array and see if the compiler complains.  I'm not sure if it will but if it doesn't you should also try writing/reading to the last index of the array just to be sure.

'''Ambershee:''' If it's something that's going to be replicated, then the limit is horribly low. It's 9. I found that out the hard and horrible way.

===Projectile Options changing replication===

'''Neo_b:''' Hello, I wrote an item that changes nearby projectiles heading player's way acceleration in an opposite direction. Works fine in singleplayer, although It doesnt' work in multiplayer, presumably because of missing replication. I have no idea how to replicate it. Can anybody help me? I used foreach AllActors and if a projectile heads player on at least one axe, it its acceleration is changed to reversed velocity and rotation is also reversed by 180 degrees.</text>
    </revision>
    <revision>
      <id>11702</id>
      <timestamp>2008-05-03T16:53:11Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>no new questions, please</comment>
      <text xml:space="preserve">{{ambox|type=notice|text=A Wiki is not the ideal way to carry on long discussions, BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development forums] are recommended instead.&lt;br/&gt;'''Please do not post new questions here.'''}}


__TOC__
==Questions==

===Expontiental Damage in a Lava Field===

I have been trying to write a script for exponiental lava damage following the inverse square law. Basically, a lavavolume that deals more damage to the player the closer it gets to the center of the lava. I've found everything I need except for a way to input the player's position. Is there any function that can call a player's x,y, and z coordinates?

'''MythOpus:''' Yes... and no.  There is a function in LevelInfo called GetLocalPlayerController.  It can be accessed using Level.GetLocalPlayerController.  This will return the clients player controller.  From there you simply need to get the location of the pawn.  This will work wonders if it'll be used offline.  The problems might start while online.  I'm not sure if it'll work properly without simulating or replication but you can always try.

===Problem Loading Maps===

'''SenorDoom:''' I'm trying to load a map from one computer into another and keep receiving this error.

History: ULinkerLoad&lt;&lt;FName &lt;- (LinkerLoad Package.LinkerLoad195 262305)) &lt;- FPoly&lt;&lt; &lt;- UPolys::Serialize &lt;- LoadObject &lt;- (Polys myLevel.Polys6081 262305==262305/1193606 111461 180953) &lt;- ULinkerLoad::Preload &lt;- PreLoadObjects &lt;- UObject::EndLoad &lt;- UObject::LoadPackage &lt;- UEditorEngine::Exec_Map &lt;- UEditorEngine::Exec &lt;- (MAP LOAD FILE=&quot;L:\royZach_map1.ut2&quot;) &lt;- UUnrealEdEngine::Exec &lt;- FileOpen &lt;- WEditorFrame::OnCommand &lt;- WWindow::WndProc &lt;- WWindow::StaticProc &lt;- MessagePump &lt;- MainLoop

I've been unsuccesful finding any help with this at all.

'''Raven:''' There is an error in loading up a brush. Possible that it an error coming in from something else. Are you using any custom packages (code, static meshes, textures, ect)?

'''SenorDoom:''' No, I'm not using any custom pacakages, its all from prefabs.

'''Raven:''' Another thing to check is that verion of UT on the computer that you are moving to is the same as the one you are comming from. (i.e. both are patched the same)

===Editing Shaders ===

'''Hellborg:''' UT3, I would like to modify the standard postprocess (DOFAndBloomBlendPixelShader) used in Unreal Tournament 3. In the UT3 tech based Roboblitz I can simply edit the postprocess by directly editing the file DOFAndBloomBlendPixelShader.usf in the Engine/Shaders folder with notepad. I then simply remove the shadercache, run roboblitz, and the new shadercode is used. I can thereby implement cartoon shading in roboblitz. I tried the same with UT3, deleted the shadercashe (files RefShaderCache-PC-D3D-SM2.upk,RefShaderCache-PC-D3D-SM3.upk and RefShaderCache-PC-D3D-SM4.upk and edited DOFAndBloomBlendPixelShader.usf in notepad. However, the game gives a runtime error on startup even after the tiniest change in the shader script. I am sure,that the shader code is still fine - just changing a single constant produces this error. There is also no information given by the error message. Do I need to change certain configuration files to allow modified shader script, or is there a more general problem with my method in UT3? Or, is there a more elegant way to add a custom postprocess to the whole game scene? I asked this question in many formus already, but nobody seems to have a clue...

===Third Person View ===

'''Stick:''' UT99, I would like to use UT in third Person view, using behindview 1 works, but the crosshair is not there, and the camera is at a bad angle, i have used a mutator called 'Bullet time 3.00' it fixes this, but i dont like the rest of the things on that mutator, i would like to know how to do this without out.

===Polys Visible through walls &quot;In-Game&quot; ===

'''VENOM:''' UT99, I can &quot;see&quot; ALL my polys through walls, I have an open area map with a building in the middle, I can stand outside next to the wall and see the polycount (stat global) through the wall 900+!!, outside is about 300 polys, I can find nothing on this subject, and yes the wall is solid bsp, anyone?

===SmallNavigationPoint/Timer() ===

'''vitaloverdose'''Ive been updating my vehicle booster script and a lot of people have suggested using a navigation point for the parent class. Ive re-written the script using smallnavigation point as the parent but i cant get the timer function to fire. Is the the function available using small navigation point as a parent?   

===Scriptable Trigger===

'''Sopa de letras:''' I miss a scriptable trigger for UT1. I wish all triggering functions and conditions would be merged in one trigger :(. It's so time consuming to make chains of different triggers :(

===Weapons Slowing Down Player When Holding It===

'''Fey''':  I've been working for quite some time trying to figure out how to simulate weapons having weight.  The idea being that if you were holding a gun in your hand, it would slow you down by some arbitrary amount.  But if you changed that gun out for another one you'd speed back up again.  Over the past several days I've hit several dead ends in trying to do this.  Currently I'm thinking that I'm going to need to put a timer on somthing and then find a way to check if the characters are holding the gun, perhaps on the pawn that might be using the weapon.  I can't seem to find a good page explaing (this is my first mutator ever) how timers work, and what functions might close them.  I read on the inventory class page discription that timers are unmade in some functions.  If I try to put a timer on a pawn, will it get erased after the pawn dies, or some other event that I may not realize?  If so, I'll have to recrete the timer everytime the pawn spawns, I guess via ModifyPlayer().  

Is using a timer really the best way to do this?  I'm still trying to find a function on weapon or inventory that might trigger when a weapon is being readied or unreadied, but in the past few days I've not been able to find anything worked.  I've also not been able to find a pre-existing mutator code that makes somthing happen when the player is holding a weapon, so I've got nothing to experiment with.

'''MythOpus:'''  I suggest that instead of using the mutator to do the guts of what you're trying to do, use an [[Legacy:Interaction|Interaction]] instead.  You could do what you're proposing in the Tick function.

===Command Prompt/UCC Issue===

'''VerteX''': Command Prompt being strange

everytime i compile a code, it parsers, compiles, imports, then when it's done, it gives me warning 

Warning: Failed to load 'UberLinkGun.u': Can't find file 'UberLinkGun.u'

Warning: Failed loading package: Can't find file 'UberLinkGun.u'

Log: Analyzing...

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\DamTypeUberLinkGun.uc)

Log: Class: DamTypeUberLinkGun extends DamTypeRocket

Log: Imported: Class UberLinkGun.DamTypeUberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGun.uc)

Log: Class: UberLinkGun extends LinkGun

Log: Imported: Class UberLinkGun.UberLinkGun

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunAttach.uc)

Log: Class: UberLinkGunAttach extends LinkAttachment

Log: Imported: Class UberLinkGun.UberLinkGunAttach

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunFire.uc)

Log: Class: UberLinkGunFire extends LinkAltFire

Log: Imported: Class UberLinkGun.UberLinkGunFire

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunPickup.uc)

Log: Class: UberLinkGunPickup extends LinkGunPickup

Log: Imported: Class UberLinkGun.UberLinkGunPickup

Log: FactoryCreateText: Class with ClassFactoryUC (0 1 UberLinkGun\Classes\UberLinkGunProj.uc)

Log: Class: UberLinkGunProj extends RocketProj

Log: Imported: Class UberLinkGun.UberLinkGunProj

Log: Parsing UberLinkGunAttach

Log: Parsing DamTypeUberLinkGun

Log: Parsing UberLinkGun

Log: Parsing UberLinkGunPickup

Log: Parsing UberLinkGunProj

Log: Parsing UberLinkGunFire

Log: Compiling UberLinkGunAttach

Log: Compiling DamTypeUberLinkGun

Log: Compiling UberLinkGun

Log: Compiling UberLinkGunPickup

Log: Compiling UberLinkGunProj

Log: Compiling UberLinkGunFire

Log: Importing Defaults for UberLinkGunAttach

Log: Importing Defaults for DamTypeUberLinkGun

Log: Importing Defaults for UberLinkGun

Log: Importing Defaults for UberLinkGunPickup

Log: Importing Defaults for UberLinkGunProj

Log: Importing Defaults for UberLinkGunFire

Log: Success: Compiled 43 line(s), 9 statement(s).

Log: Save=205.184198

Log: Moving '\System\Save.tmp' to '\System\UberLinkGun.u'

Warning: Failed to load '\System\UberLinkGun': Can't find file '\System\UberLinkGun'

Warning: Failed loading package: Can't find file '\System\UberLinkGun'

Warning: Error loading \System\UberLinkGun !!!

Log: Success - 0 error(s), 1 warning(s)

Exit: Preparing to exit.

Log: Purging garbage

Log: Unbound to Core.dll

Log: Unbound to Editor.dll

Log: Unbound to Engine.dll

Exit: Editor shut down

Log: Unbound to Fire.dll

Log: Unbound to IpDrv.dll

Log: Unbound to UWeb.dll

Log: Unbound to XGame.dll

Log: Unbound to XInterface.dll

Log: Unbound to Onslaught.dll

Log: Garbage: objects: 73914-&gt;0; refs: 0

Exit: Object subsystem successfully closed.

Exit: Exiting.

Log: FileManager: Reading 0 GByte 112 MByte 940 KByte 709 Bytes from HD took 0.836996 seconds (0.570996 reading, 0.266000 seeking).

Log: FileManager: 0.149000 seconds spent with misc. duties

Uninitialized: Name subsystem shut down

Uninitialized: Allocation checking disabled

Uninitialized: Log file closed, 07/15/07 15:19:17

MV was what i was trying to compile...i have no idea what to do seeing as it used to work, but recently it started giving me that warning

===Question about native classes===

'''Illiander''' I'm trying to make a UT2k4 vehicle that switches between a wheeled car-type, and a flyer.  Basic problem, when I try to extend ONSVehicle, and just copy in all of ONSChopperCraft, it doen't pick up on any of the movement inputs.  Same with ONSWheeledCraft.  But when I extend those classes it picks up on the inputs.  Am I doomed to failure in this, or is there some way for me to pick up on movement commands in UScript?

===Question===

'''vertex''' I have an assault level i am making for my family to use for fun. I thought (since i'm the only mapper), that'd i'd make a little sniping area with a non-solid brush over it with the outside texture matching the wall and the inside texture transparent. The problem is, when i test it, the defending bots (who appear by a weapon locker with sniper rifles) kill me everytime i go to my secret place. Is there a way around that, so that people and bots can't see me, but i can see them and shoot them.

===Questions about certain errors===

Jameso123 

I have had a problem with UnrealED 3 i got with UT 2004 whan i start the editor the part where the vieworts should be are just white all the other stuff is working, there just isnt any viewports

'''shadow21''' I've been having a problem with UT99, I'm trying to compile a mod, and I'm having troubles with the Mesh=LODMesh'' command, the error that pops up is 'bad expression in '=', what should I do, I'm at a loss here =( any help at all will be appreciated.

===Replication : Forcing client update for &quot;prone&quot; Pawn===

'''SuperApe:''' I have a Pawn class that is updated (Physics, Location, Rotation, AnimSequence &amp; Anim frame) on Clients only when the Player has a line of sight to it.  Since this Pawn is prone (not moving, not animating), there is no reason for the bNetDirty to update this Actor.  Is there a simple way to make sure this Pawn is properly updated '''before''' the Player sees it?

'''SuperApe:''' Is this question clear enough?  Anyone have a suggestion, solution or comment on this problem?

'''Graphik:''' You've not properly explained what you're trying to accomplish or how you're trying to do it.

In case I've mentally translated your unworkable description into something partway logical: How is your code going to guess when the Player is about to change his line of sight so as to 'properly update before the player sees it'?

'''EricBlade:''' I would guess off hand that actually doing all this checking for line of sights is probably more costly than just letting the regular relevance code do what it's supposed to do?

'''SuperApe:''' Thank you.  What I mean by updating before the player sees it, is to make a ''one-time'' forced update (from the default setting of a property, which the Client has automatically, to the setting this prone Pawn should have on the Server), perhaps at map start.  For example, my Pawn should be set to PHYS_None (because of a special state it is in), but the default is PHYS_Falling.  On the server this Physics special setting is known, on the Client it is not (until the Client machine gets an update from the Server).  So, as it is now, the Player on the Client turns a corner, sees the Pawn, the Pawn falls (PHYS_Falling), then after a moment, it updates the Pawn's location, rotation, and Physics, and the Pawn *snaps* back to where it should be.  My question is related to this example.  How can I force this Pawn to update the Physics setting in time to prevent it from falling when the Client Player sees it?  As of yet, I do not have a workable solution.  It appears to me to be a limitation of the Replication scheme.  But, I thought I bring the problem up here, in case anyone would like to help me find a solution.

'''Graphik:''' Your expanded description still leaves me guessing, but I recommend you use the ModifyPlayer function. [[Legacy:Mutator|Mutator]] features a description of the function as well as an example of its use.

'''SuperApe:''' My suspicion is that this is not something that Graphik can help me with. ''(No offense, Graphik)''  But I will try to elaborate one point that appears to have been missed.  Replication, as Unreal uses it by default, causes the above example situation automatically, where the Pawn as it exists on the Client gets an update to important non-default settings on properties such as Physics only after the Client Player has seen it.  Unreal Replication is able to handle elaborate maps because it does not replicate everything all the time, only the bare minimum that's needed, when it's needed, to ''simulate'' what's happening on the Server.  This example I've described above shows that scheme in action, but I am looking for a clever workaround to somehow force this Client Pawn to update either instantly (when the Client Player sees it) perhaps do something that will ensure the Client Pawn is already set to the proper (not the default) Physics setting before this line of sight occurs.  The goal would be to avoid the situation where the Client Players see this Pawn fall and then snap back to the proper location a moment later (depending on current netspeed conditions).  IOW, I have not coded some nifty line of sight stuff, this is just how Unreal Replication works now.  I'm looking for some kind of override, so the Client Pawn does not rely on it's default property setting.  I would consider whatever workaround works, and use it on other properties as well, such as Animation-related properties, etc.

'''EricBlade:''' bAlwaysRelevant ?

'''SuperApe:''' I thought about that.  It seemed like overkill for a prone Pawn, but at the moment that appears to be the only working idea I've run across.  I'm also not sure how well that property works, being switched on/off, which I would want to do if this Pawn is in it's special state, and when it leaves it and should act more like a normal Pawn on Clients.  Thanks for the idea. :)  Hopefully a more economical idea can be found as well.

'''EricBlade:''' Seems like months since I last looked at this page, but it should probably work pretty well - if you set it bAlwaysRelevant, and it's not doing anything, it shouldn't cause any major changes in net traffic, as it'll do it's replication stuff when the player connects, but then otherwise it isn't doing anything.  As far as I can tell, setting bAlwaysRelevant on and off works pretty well - I've seen several Land of the Dead maps that have used a Security Camera type thing, but had to install a volume that makes whatever enters it bAlwaysRelevant, so that you could monitor things in a remote room (pawns would not be relevant halfway across the map, so you couldn't see them on remote cameras)

'''EntropicLqd:''' I'm guessing you've solved this problem by now.  But, wouldn't it be possible to use the bAlwaysRelevant flag with an inventory object?  It seems like a really ugly hack work around to me ... just an off the wall idea.  It's probably crazy though. 

===Control point status dissapearing from hud.===

'''plugwash''': a friend of mine has made a domination map based on the hall of champions (original UT) it works fine singleplayer but in netplay the control point status usually dissapears from the hud on first death (i think at least one control point captured by someone is also a prerequisite to the dissapearance). Ive tried removing all actors that seem to be designed for that map and even exporting and re-importing into a new map but still the issue persists any ideas on what this could be or how to track it down?

===REPLICATING A VARIABLE===

I having a problem with replication. For the past 2 weeks all I have been doing is researching it and nothing can barely explain it. I understand some of it, or at least I think I do. No replication I make works, at all, in any cases. It is just getting to me too much, how it simply does not work.

Anyways I wrote this script. Remember, some coding in this may seem &quot;noobish&quot; but this is just practice for me you could say. What it does is when this item is added to your inventory, it takes the value of an array in another actor. The variable is called LastPlayed. This value is not replicated to the client. So what I'm trying to do here is (since I cant replicate a variable that exists in another actor I didnt make) is assign the value of LastPlayed to ClientIP and then replicate ClientIP over to the client where they process it.

Here is the class...

&lt;uscript&gt;//==============================================================================
class ClientAKA extends Inventory config(AKACheckerLog);

var config string ClientLP[6000];

Replication
{
	reliable if(ROLE==ROLE_Authority)
		ClientLP;
}

simulated function PostBeginPlay()
{
	local AKA a;
	local int i;

	log(&quot;Stage1&quot;);
	Super.PostBeginPlay();

	log(&quot;Stage2&quot;);
	foreach AllActors(Class'AKA', a)
		break;

	if(Level.NetMode == NM_DedicatedServer)
	{
		log(&quot;Stage3&quot;);
		for(i=0; i&lt;6000; i++)
		{
			ClientLP[i]=a.LastPlayed[i];
		}
	}
	LogAKA();
	SaveConfig();
}

simulated function LogAKA()
{
	local int i;

	log(&quot;Stage4&quot;);
	if(Level.NetMode != NM_DedicatedServer)
	{
		log(&quot;Stage5&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logging...&quot;);
		log(&quot;v*************************-AKA Checker-*************************v&quot;);
		for(i=0; i&lt;20000 &amp;&amp; ClientLP[i]!=&quot;&quot;; i++)   //log the aka log in their ut log file
		{
			log(&quot;LastPlayed[&quot;$i$&quot;]=&quot;$ClientLP[i]);
		}
		log(&quot;^*************************-AKA Checker-*************************^&quot;);
		PlayerPawn(Owner).ClientMessage(&quot;Logged the AKA.ini to your UNREALTOURNAMENT.LOG in your UT system directory.&quot;);
	}
}&lt;/uscript&gt;

I cant see what is being doen wrong, ywt ClientIP simply wont replicate. I've tried several techneques and to replicate this variable NONE of them work. For weeks I've been working on this exact mod which is so exausting seeing as I have no more resources. And I also have several other mods that dont work souly because of replication. Can anyone help me?

'''Xian:''' Well, although I don't have experience with UE2, the same principles as in UE1 should apply. From what I seem to remember, arrays can't be replicated. The only way to do it is the nooby hack that seems to go like this:

&lt;uscript&gt;
class Test extends Whatever;

var string Testers[3];

replication
{
    reliable if (Role == ROLE_Authority)
        ClientStuff;
}

function ServerStuff ()
{
    local int i;

    Testers[0] = &quot;Me&quot;;
    Testers[1] = &quot;You&quot;;
    Testers[2] = &quot;Other&quot;;

    for (i = 0; i &lt; ArrayCount(Testers); ++ i)  
       ClientStuff(Testers[i],i);
}

simulated function ClientStuff (string Entry, int i)
{
    Testers[i] = Entry;
}&lt;/uscript&gt;

Also, as you have probably guessed, the class you are using to replicate things (Weapon, Info, Actor, Emitter etc.) has to exist on both server and client. You chose Inventory, which exists on both sides IF it was spawned on the server. Also, giving it to the player and adding it to the chain ensures the simulation of the class' functions (as well as setting it to SimulatedProxy which, iirc Inventories have them). I used ArrayCount to show you a nice way to get the number of elements in case you didn't know it :)

I know that hack sucks, but it is the only way to do it (from what I know). Or at least, to do it in UE1. Hope it helps.

===Change Direction of Weapon Spin===

'''UltraN00b:''' I'm creating a level for UT2004, in which the weapon bases rotate around the inside of a large cylinder.  While the weapons rotate around the cylinder, they angle of the weapon changes as well.  This looks great, except for the fact that they still rotate on their horisontal axis.  

Is there any way to change the direction of the weapon's spin while on the weapon pad?  Tilt the rotation so they still apear to rotate normaly, but at a different angle?

===Opening Classes===

'''Tgusagalpa:''' I'm starting a mutator that a Pawn recieves the weapon they are shot with.  Should I reference the gun they are shot with through Instigator.Weapon '''or''' Projectile properties? 

'''Xian:''' So if I got it straight... you shoot me with a SnowGun (yes I am original :P) and I'll receive it either when being shot, either after respawning, right ? (well for short you want to know how to &quot;save&quot; it, as you said, reference, the Attacker's weapon, correct ?).

It's even simpler than that. You use TakeDamage() and then do InstigatedBy.Weapon (or whatever parameter name it has since it can vary). Hmm from a quick glance at the source now, I see you can use the GameRules class to hook in the game ReduceDamage function (it uses the pointer GameRulesModifiers iirc). And you can do your thing there :)

===Crashing during garbage collection??===

'''EricBlade:''' I am getting reports of crashing on level change, from people who are running my custom [[Legacy:Land Of The Dead|Land of the Dead]] game type.  We are so far unable to find a condition that specifically triggers it, but after a period of time, typically ranging from an hour to two or three hours, and anywhere from 1 to 10 level changes, the server will crash on level change.  It appears to me that it is happening during Garbage Collection at the end of level, as the following from the log shows:
 Log: Collecting garbage
 Log: Purging garbage
 Critical: UObject::GetPathName

.. it crashes at this same point on nearly all of the crashes that i've been sent logs for.  What could I be doing that would cause this?

'''Xian:''' I'd have to see the source but my quickest guess would be an object still has an actor pointer that wasn't set to None and/or an Actor has an Object pointer which is not set to None on Destroyed() events. Generally speaking if it's &quot;in use&quot; it can't be deleted and it will create that problem.

'''EricBlade:''' Hm.  That's what I'd thought might be the problem, except that I don't have any code that references actors or objects in this, except in local variables, so i'm pretty confused as to how my code would be causing something like this.  A couple of people have told me that they have run the stock game for days without crashing, but we are getting incredibly regular crashes with mine in use.  .. almost every variable in here that's not local is a string, int, float, or bool .. i did just notice that i had a class variable set to a string, in default properties, but it looks like the engine handled converting that to the proper class.  Haven't got back with the server guy yet to try it.. :|

Here's a link to the code: http://pastebin.com/714417  

And here's a link to the most recent crashlog: http://pastebin.com/714329

'''Plugwash:''' If you really care about bandwidth shouldn't you set stuff up so you can monitor it at the IP level?

'''Nobody:''' I'd rather set it than monitor it. 

'''Plugwash:''' but monitoring it on a per client ip/port combination basis would allow you to tell for sure if your attempts to set it had worked correctly. 

===PSK?===

'''tgusagalpa:''' Is there any way to create a .psk file for uPaint, when exporting from maya, instead of having to ActorX?  I know on the PLE you cannot have ActorX, so how do you export, and get a .psk? 

===Adding a MESH NOTIFY===

'''SuperApe:''' I see in SkaarjPack_rc.SkaarjMeshes, there are the MESH definitions including the Animation NOTIFY declarations using #exec directives.  I'd like to add some NOTIFYs to this list.  For example, the Skaarjw Mesh animation sequence 'guncheck' should have the Sound'blade1s' play.  I'm trying to define a FUNCTION=PlayGunCheckSound from my own Skaarj subclass and having no luck using this command:

&lt;uscript&gt;#exec MESH NOTIFY MESH=Skaarjw SEQ=guncheck TIME=0.2 FUNCTION=PlayGunCheckSound&lt;/uscript&gt;

Without changing SkaarjPack_rc.SkaarjMeshes, is there any place I can append to this list of MESH NOTIFYs?  Where does SkaarjPack_rc.SkaarjMeshes get used/read?

Anyone have info on adding to the MESH NOTIFY list?

'''Xian:''' I am not sure if you have to redefine the mesh, anim and texture redefinitions by reimporting it into your own class, but it should, theoretically work without it if you did it right. I assume we are talking about UE1 here ?

'''SuperApe:''' Actually, we're talking about adding a Mesh Notify to an existing VertexMesh in UE2.

===Crouching with new model size.===

'''Stinky:''' I have made all the classes in the mod I’m working on larger then or smaller then the default ut model. Everything works accept the crouching. Does anyone know what code to replace to make it so the models don’t fall through the ground when you crouch a lot? Also when I crouch the model stays the same height but the eye height drops to the default for ut 2004, and also the model stays the same size but falls halfway through the ground so the top of the head is at the default height. If I crouch multiple times the model just falls through the ground. Any ideas? 

'''SuperApe:''' Crouching code, including eyeheight changes, is in Pawn and its subclasses.

'''Stinky:''' Well, I have edited the code in a class extending Pawn, When I crouch though, the eye height is correct for the model, but the model falls thought hte ground as if it were the standard UT 2004 heigh. Should i post a screen?

'''SuperApe:''' No need to post a screenie, we get it from your description of the problem.  So, you're extending Pawn.  Did you check the crouch code in Pawn's other subclasses?
 

===GroundSpeed PLEASE HELP!===

'''Stinky:''' I am writing a class system very similar to the RegularEngine but I can’t seem to get the GroundSpeed to change with the class. I then downloaded the RegularEngine and compiled it and realized that the GroundSpeed does not change correctly in the RegularEngine either (The sniper speed is supposed to increase to 550 but it doesn’t). Is there something else I need to do so the GroundSpeed changes with each class? Also to add on to my description, when I use the redemer secondary fire then come back into the player view the running speed does take effect. 

'''Stinky:''' Will someone please help.     I came up with a temp solution but it seems really wrong to do. I set a timer at the beginning of each spawn to adjust the ground speed for a few ticks.

'''SuperApe:''' You're right, that does sound wrong.  So, what you're saying is you're using the same Pawn class, but trying to adjust GroundSpeed?  And this can't be done with a Mutator using ModifyPlayer() or something?

'''Stinky:''' Yeah, the way im doing it now works, but it seems a little too complicated for what i think should be a simple task. I am working on a total conversion so a mutator wont do. Any ideas?

===When running a server is there a file that is viewable that contains all the actor events such as kills and who won/lost the match?===

'''Superflygizmo:''' I have been trying to find a way of logging who won or lost a match into a text file. I'm lost in this department and on the forums i have been on no-one has really given me some specifics on ways of getting around this. Basically i need this info to be written to a text file so that an outside program can see who won etc. People gave me hints on extending the console to do this but i have no idea where to start (total programming novice). But then i thought that if i ran a server on the same machine and had my game connect to it then the server must store this information somewhere as it has to share these results with all the other clients. Its a university project to create a non linear game and i decided to use the unreal engine.to get around loading cutscenes and different endings i decided that i could use a program called macromedia director to do all the level loading. As the maps must have multiple exits i thought that if i made a game type mod that when you reached exit 1  you ranked first in the level,exit two you ranked second and so forth. Then this outcome would be written to a text file that director could read and then director would interpret these results and know which level to load. I just dont really know which way to turn. Please help!!!

'''Sweavo:''' You're crazy if you think you can do this with no scripting!  But what you want to do is not too hard once you understand how to script.  Look in the wiki for getting started information.  You want to build a Mutator.  Mutator contains a method that is called at game end and you can extend this to write &quot;XYZ won!&quot; or whatever you like into the UT2004.log file.  It's a steep curve to get started in scripting, but once you get the hang of it, you might even throw Director away and do the whole thing in the engine.

'''Nobody:''' Read up on [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]] and SaveConfig(). You can write a mutator that creates and writes to its own ini file (which is all text) and create variables that are saved to that file at the end of the game. Then all you need to do is have your external program open that ini file for read. Its really pretty simple as far as scripting goes; just a matter of using the correct syntax @ class declaration and variable declaration. After that just set the varibles you created equal to the data you want to save in that ini file and use SaveConfig() at the game end event.&lt;br /&gt;Oh, you might also consider using ngstats and parsing the Unicode log it will save in the Logs folder in the ut dir. Might be easier just to script your own ini file, easier to parse.

'''Sweavo:''' Also: GameStats might be your friend

===KarmaBoostVolume===

'''craze:''' hey, I could never get this to work correctly, can someone write something up on how exactly to make it work?

'''craze:''' guess new questions go at teh top... heh

===Low gravity levels in UT99 the Right way ===

'''McNutcase:''' This seems blatantly obvious, but I can't find it: how does UT99 handle making levels low-gravity by default? I haven't been able to figure it out... I got approximately the right effect by setting bGravityZone to True in the [[Legacy:LevelInfo_(UT)|LevelInfo]] properties and halving the magnitude of the Z-gravity, but that's an egregious hack and will break in conjunction with the LowGrav mutator. There's obviously another way to do it, since that &quot;fix&quot; isn't active in DM-Morpheus, but I haven't been able to find it. What am I missing here?

'''Tarquin:''' I suspect Morpheus does it at the ZoneInfo level, since the indoor areas have normal gravity.

'''McNutcase:''' Looks like it might have to break, then... I'll go and look for at least the right official magnitude, so as to keep the feel consistent...

'''Ch3z:''' I don't know if this helps or not, but the code in Botpack.LowGrav is very simple. It expands Mutator, gets rid of all UtJumpboots and sets the ZoneGravity properties of all ZoneInfo in the map to vect(0,0,-200) in the CheckReplacement function. That's all it does. I was also thinking you might look into embedding a mutator into your map that unregisters the lowgrav mutator if in the chain?? A thought.

'''McNutcase:''' in that case, hacking the LevelInfo properties won't break with LowGrav... although I suspect I want the gravity a bit higher than 200, since the default is 950. Certainly 200 is a bit low. Now I just need to figure out how to deal with exiting a WaterZone via a WarpZone...

'''Evilmrfrank:''' Low gravity shouldn't be changed in the level info.  It should be changed in the zone info only.  You can change the gravity settings there to whatever you want it to be.

===Attaching karma actors to movers===

'''Blue Ion:''' The deal is as simple as the question. I want to attach a karma actor to a mover so when it is triggered  the karma actor would follow the mover and at the same time swing, be shot, and other fun stuff to do with karma actors.

The idea is to make an elevator that is held with chains that could swing and ultimately break when shot.

The KBSJoint should do the trick except that it won't work with anything that is either BSP geometry or an other karma actor, and during gameplay, when the karma is activated, the thing shoots of to the center of the world.

'''Foxpaw:''' It is possible that you are not setting up the KBSJoint correctly. It is intended to go between either a Karma simulated actor and another Karma simulated actor, or a Karma simulated actor and the world.

I believe that attaching to a mover will require a modest amount of coding. However, if you are going to have to custom code something it might not make sense to use Karma at all, and instead code your own elevator physics, since it is a fairly simple case.

Alternatively, you could get rid of the mover and make the whole thing work on Karma. That would also require some amount of scripting.

===Calling movement(moveforward etc) from within script===

'''Simul:''' Hi Im creating a script that reads in movement information from a java program on a remote computer and moves the player in unreal.  That is working fine, and now I have 3 values (X,Y,Z) in my script, however I cant for the life of me work out how to emulate a keyboard/mouse input to use the information (like moveForward).  At the moment I am able to use move() on xpawn however there has to be a less dodgy way to do this.  I can get the rotation of the player working fine, its just the movement.  

'''Xian:''' Hello! Unfortunately I don't know anything about UE 2, only UE 1, but I assume the best way (and possibly only way ?) is to modify the aBaseY variable in PlayerInput. One way would be changing the InputClass in Engine.PlayerController to your class extending PlayerInput and possibly adding hooking functions there (or simply do it easier by changing them directly in Engine.PlayerController). The reason I told you to use an Input class is that the input moments are best accessed in the PlayerInput ticking event, therefore you need to do it there. This was doing a quick skimming of the UT2kX code so it is not guaranteed to work, but may be a push in the right direction :)

===Overriding a native source function in script.===

'''Baz:''' Hi Im trying to override AONSWheeledCraft:: ProcessCarInput() in a subclass of ONSWheeledCraft. is this at all possible, or are all native functions final. Are native functions with the same name as script functions considered different because they dont have the same number?

'''Foxpaw:''' You can override UnrealScript functions declared as native, if they are not final. (Many are, but not all.) However, the function you have indicated does not have a corresponding UnrealScript function, so you cannot override it with UnrealScript. There is probrably an UnrealScript function that you can override to get the same result as you are trying to achieve.

'''Baz:''' oh well, my problem is that bIsInverted is set and checked in the native code, and if bIsInverted is true a vehicle wont reverse when its are upsidedown. Ive got a scorpian driving on the celing, but when you drive into a corner you cant drive out again.

'''Nobody:''' I don't know the code you are refering to, but can you intercept it when the user attempts reverse and check to see if bIsInverted=true and if so set vehicle's rotation 180º from current? If you do that in increments, maybe a for loop, then it might feel like it is some automatic feature of the vehicle, and not some funky hack of the game, like driving on the ceiling hehehehe just kiddin'. 

'''Xian:''' Loops is a bad idea. best way to smoothen rotation changes is using DeltaTime.

===Converting BSP to static mesh no longer evil?===

UTF8_REPLACEMENT9;''Tarquin:''' There used to be this: [[udn2:ConvertingBspBrushesIsSuboptimal]]. However, I was looking for this page just now, and I couldn't see it linked from ANY other page on the UDN. Does that mean that maybe it's ok to do it now? Maybe they've improved the way UnrealEd converts to static meshes?

'''Ragdoll:''' I dont know of any improvements in the BSP-&gt;Static Mesh conversion. It seems ok for basic shapes like cubes etc but from my experience for complex meshes it is better to use a external 3D modelling application. This page explains it quite well:http://angelmapper.com/tutorials/uedmeshes.htm

===Registering GameRules===

'''Tarquin:''' Everywhere I've sene examples of using a [[Legacy:GameRules|GameRules]] class, I've seen this sort of code used to register it:

&lt;uscript&gt;
  if ( Level.Game.GameRulesModifiers == None ) {
    Level.Game.GameRulesModifiers = myRules;
  } else {
    Level.Game.GameRulesModifiers.AddGameRules(myRules);
  }
&lt;/uscript&gt;

However, there's an AddGameModifier function in [[Legacy:GameInfo|GameInfo]] that handles the case where no game rules are in the linked list. So you can just do this:

&lt;uscript&gt;
  Level.Game.AddGameModifier(myRules);
&lt;/uscript&gt;

This seems simpler... or is there a reason it might not always work?

'''Nobody:''' I don't believe AddGameModifier was implemented until UT2004. That GameInfo link only goes to the UT2003 version of the class.

===Hud with mouse problems?===

Okay...  I have been trying to create a little user interface for my game.  Instead of the player looking around with the mouse, the player will have an overhead perspective and is able to interact with things via their mouse.  The problem is, I can't exactly make that work.  Here's what I've got so far.  A custom PlayerController with some game related variables but also a call to Player.GUIController to turn it on... like this.

&lt;uscript&gt;
class CustomPlayerController extends PlayerController;

var BaseGUIController HudController;

exec function MakeGUI()  //it's an exec function just to make things easier for testing purposes
{
   HudController = MQ_HudController(Player.GUIController);
   HudController.SetControllerStatus(true);
}
&lt;/uscript&gt;

MQ_HudController is a custom GUIController that I thought I would need to add custom functionality.  So, what that does is turns on the GUIController which activates mouse functionality.  Here's where things get hard for me.  I can't for the life of me figure out how the actual GUI pages and components for the menu's are 'activated' once the mouse is clicked on them.  I've looked through all relevant classes (from BaseGUIController to GUI, GUIComponent etc...)  Currently, I have no overhead perspective working because I wanted to get this completed first.  All I want for the player to be able to do right now is be able to click anywhere on the ground (with the mouse of course) and then have the pawn of the player move there.  Later I want to add other stuff, but I figure if I figure this out first, I can do the other stuff pretty fast.  Can anyone help me to get the mouse able to be clicked on the ground and have the pawn move there?  PS.  I don't really want like an invisible GUIPage or anything infront of the hud.. if that's possible.

'''Nobody:''' Sounds like a 2D curser in a 3D world. He's gonna get teased in school. =( I think I would be going at it in this fasion:&lt;br /&gt;    Make curser invisible.&lt;br /&gt;    Declare an object with a location in 3D space (and a mesh or a sprite),&lt;br /&gt;    and set it's x and y = to the curser's x and y keeping it's z.&lt;br /&gt;    Change z in response user input via their configured jump and crouch keys.&lt;br /&gt;    if this objects vector location is = to another objects vect location (within it's collision radius maybe) when the mouse is clicked, or possibly the object fire(...)'s or whatever, then dostuff().&lt;br /&gt;Maybe the lil guy will make friends in the 3D world now, hehehe. But this is like your the curser and it's in 3rd person view, why not make it firstperson view in fly mode? Then already have the navigation done, and you can use trace or watch for the other objects vector location and rotation to be where it would be right in front of you but not right in your face. My two cents. Fun Idea, I'd sure like to see it when it's done.

===Almost ready to launch mod, but a few questions ===

'''Kou''':  Okay, I'm about ready to release a demo of a mod I just made, but I (stupidly) designed the text in my windows based on pixels, and I'm running on 1280x1024 resolution.  Is there a simple way to snap everything into place or am I going to have to set it for each resolution each time?  This is an example of what I currently have...

&lt;uscript&gt;
       C.SetPos(550, 292);
       C.DrawColor.R = 255;
       C.DrawColor.G = 255;
       C.DrawColor.B = 255;
       C.DrawText( &quot;Error!&quot;, False );
&lt;/uscript&gt;

'''Foxpaw:''' The typical way to resolve this is to multiply by some value based on the resolution. Usually fractional numbers are used and they are multiplied by the resolution, but you can just as easily multiply by the resolution divided by 1280x1024.

IE:

&lt;uscript&gt;
local float XRes, YRes;

XRes = C.SizeX / 1280;
YRes = C.SizeY / 1024;

C.SetPos(550*XRes, 292*YRes);
&lt;/uscript&gt;

'''Kou:''' Thanks, that (kinda) fixed the problem.  I'm wondering how I may play different music in the Instant Action game configuration area rather than the generic UT2k4 menu music. 

===Warp Zones===

'''Jezinator:''' Right, erm sorry if this looks a bit wierd but I've never written like this before.  I have a problem with Warp Zones you see.  Im creating a fundamentally mind boggling map using warp zones, not loads of warp zones, just two pairs of them.  I have textured the sheet that defines the zone with AssaultFilmGrain becuase i couldn't find a transparent texture anywhere :) im using UT2K4 btw.  Anyways the problem is that there is an area of the map behind the warp zone and the geometry is showing through in a very wierd way whenever I play the map.  Its like the corridor behind the Zone (which has nothing to do with the zone itself)  Is overriding the corridor that the Zone links to.  The zone still works perfectly, but its just a glaring aesthetic problem.  I am aware that that was perhaps not the best explanation ever but its a wierd problem.  If there were some way of posting the map here.... Dunno, if anyone has any help, i would seriously appreciate it.  Also I have two other, complete maps which I would like to distribute and don't know how.    

'''evil_blue_dude:UTF8_REPLACEMENT9;''Rotate one of the zone portals 180 degress. If that doesnt work then rotate them both 180 degrees. (but be sure to try the first before trying the second)

'''Jezinator:''' Yes i did try that, even before I asked here, it doesn't help.  I can't figure out why that happened.

'''Foxpaw:''' I'm not sure if I'm understanding the problem correctly, but it sounds like you might want to try setting the walls of the corridor that has the warpzone info in it to fake backdrop.

'''MythOpus:''' The author probably hasn't been here for some time now but don't the WarpZoneInfos override the texture they have on the surface anyways?  Having that transparent texture could be throwing the WarpZoneInfo off and having it reveal BSP on the other side.

===Collision And caft===

'''FOD'''Hi im making a mod which is a subclass of decoration the only problem is that when i assign a static mesh to the class and play the level im finding all the wheeled craft are sinking into the meshes. I've got collision meshes on the objects and they work fine as just static meshs, but as soon as i use them in a script i find i can drive right through them? Im sure they were fine at one point, but my head so full of code im realy not sure anymore.lol.

'''MythOpus:'''By Wheeled Craft do you mean to imply you're using the karma system?  If so you will need to create Karam Collision Hulls.  Don't know if you already do have them or not though :S

'''FOD'''I think the collision hulls are set ok (if i choose View colision in unrealed the meshs all have pink outlines.) ive got all the settings in collision in the actors properties set to on. Should i be using the simplified collision hull karma/line or box. Its real odd as im using the same static meshs for things like vehicle lifts and the collision is fine there. When i say wheeled craft i mean the scorpion,helbender,hovertenk,artillery and the shock tank. They dont go right through the mesh...just sink up to about their wheel axle. Like being in quicksand? Im sure the answer is blindingly obvious but its winding me up to be getting these sort of problems after all the coding ive just done.For a test made script that just places an actor onto the level:-

&lt;uscript&gt; class MyActor extends Actor
	placeable;

defaultproperties
{
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'HumanoidHardware.Beams.jribbedcolumn01HA'
     DrawScale3D=(X=50.000000,Y=50.000000,Z=1.000000)     
     bCollideActors=True
     bBlockActors=True
     bAutoAlignToTerrain=True
     bBlockKarma=True

}&lt;/uscript&gt; 

Now if i try to drive over this in a wheeled craft...quicksand!

but if i simply just place a static mesh into the map next to it ..the static mesh one is solid and

can be driven over? im confused.

The collision is fine if you side swipe the mesh or hit it with a flying craft or even if i just drive directly at it.

Just did another test..used the same script as above but this time made it a subclass of 'mover' and the collision is ok.?! I suppose i could derive the mod from a mover rather than a decoration but i think there are certain network issues with the 'mover' class which may upset the way my mod works.What are the properties that mover have that make it more solid?

===ACTION_ShootTarget... what are the firing modes?===

'''Tomko:''' Trying to setup the above action, but the bot just doesnt want to fire at the SetViewTarget I've assigned. Through reading this udn page (http://udn.epicgames.com/Two/ScriptedSequenceActions#ShootTarget), it lists AssaultRifle Modes, but I can't get those working either. I have an ACTION_SetViewTarget above it, which points to another xPawn for him to shoot, but it's a no go. The other pawn is in view, in distance, etc... just can't figure out what I might be doing wrong.

Any assistance would be greatly appreciated, there doesn't seem to be a wealth of information on this action, anywhere!

p.s. I've also tried the ACTION_FireWeaponAt to no avail.

===Make bots/monsters ignore you?===

'''Missilemaster:''' I'm very new to coding; right now I'm finishing up a modified Raptor with a &quot;cloaking device&quot;, which puts an invisible skin on it. It works well, but, of course, bots and monsters can &quot;see&quot; it when it's cloaked. Besides map botpathing, I know basically nothing about bot AI. Does anyone know a relatively simple way to make computer opponents ignore this vehicle when it's cloaked (that is, when a variable is a certain value)?

'''Defx:''' I suggest taking a look at Invis Combo, there seems to be a function called SetInvisibility, hope this helps

===Console Commands / exec function doesn't work===

'''Jan:''' Which classes (UT99) can I use for adding new console commands? I used PlayerPawn but nothing happens if I typed in the command into the console. UT returns with &quot;unrecognized command&quot; message. I've tested it with a simple class like that:

&lt;uscript&gt;class something expands PlayerPawn

exec function LogStuff()
{
  log(&quot;log tah f****** stuff&quot;);
}&lt;/uscript&gt;

'''Xian:''' UScript: Engine.PlayerPawn, Engine.Console, Engine.Inventory, Engine.HUD (and subclasses obviously)

Native: (apart from the above) Engine.Player, Engine.SubSystem, Engine.Client, Engine.Engine, Engine.GameInfo, Engine.Input, Engine.Level (NOT ENGINE.LEVELINFO), and of course, all their subclasses...

It isn't as simple as subclassing PlayerPawn and that's it... you need to subclass a proper player controller subclass (namely something like TMale1 or TMale2 which are children of TournamentPlayer which is a child class of PlayerPawn) and then insert them in the game with a mutator by hooking Engine.Mutator.ModifyLogin()

'''MythOpus:''' Well I'm pretty sure PlayerPawn DOES work with exec functions but as you said, you DO have to get it into the game somehow.  If you created a class and put an exec function in it and thats it, its like... er... trying to use a coffee maker thats still in the car.  You have to take it out of the car, i.e. have the player take 'control' of the PlayerPawn, take the coffeemaker out of the box and use it, i.e. Call the exec function on that PlayerPawn.  If the player doesn't have control of the PlayerPawn when you call the exec function, then engine gives you the &quot;unrecognized command&quot; because it really doesn't know that command even exists. 

----

===Recent Changes &amp; Image Upload/Deletion===

'''Kartoshka:''' I noticed that the Recent Changes page doesn't show my username when uploading or deleting an image, only my IP address. My username ''does'' show up after a normal page edit though. Not a big deal, but maybe something to look at...:)

'''Mychaeel:''' It does show ''mine'' when I do anything &amp;ndash; support for that is built in.  I've noticed that I seem to be the only Unreal Wiki user whose user name is displayed when doing anything in the image uploader, though &amp;ndash; I wonder why that is.  Which URL do you use to access the Unreal Wiki?  (Perhaps it's a cookie-related issue.)

'''Kartoshka:''' I use wiki.beyondunreal.com. I tried www.unrealwiki.com, but this just redirected me to wiki.beyondunreal.com. I tried logging in after entering www.unrealwiki.com just to be sure, and the same thing happened. (no username, just IP on upload and deletion). I am even using a different computer with a different IP address than before, so it doesn't seem likely to be a problem on my end.

----

===Static Array Limit?===

'''MM:''' Is there a limit to the [length] of a static array? (In Unreal Engine 1) Such as &lt;uscript&gt;var string testtxt[1000000]
&lt;/uscript&gt;

'''MythOpus:'''  Yes I do believe there is a limit and its probably lower then UE 2.x.  I can't give you exact specifics but you can try different values for the length of an array and see if the compiler complains.  I'm not sure if it will but if it doesn't you should also try writing/reading to the last index of the array just to be sure.

'''Ambershee:''' If it's something that's going to be replicated, then the limit is horribly low. It's 9. I found that out the hard and horrible way.

===Projectile Options changing replication===

'''Neo_b:''' Hello, I wrote an item that changes nearby projectiles heading player's way acceleration in an opposite direction. Works fine in singleplayer, although It doesnt' work in multiplayer, presumably because of missing replication. I have no idea how to replicate it. Can anybody help me? I used foreach AllActors and if a projectile heads player on at least one axe, it its acceleration is changed to reversed velocity and rotation is also reversed by 180 degrees.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Help, I Have Lost My Map</title>
    <id>1432</id>
    <revision>
      <id>3617</id>
      <timestamp>2004-05-29T22:47:05Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Preface==

{{innerbox| HELP!!! I have lost my map! NOOOOOOOOoooo...!!!!

}}

That is a possible statement that someone would say if they thought that they lost their map or whatever. After that statement, they might become mad, throwing stuff around or sad, bawlling like a little baby. This article is meant to tell the mapper what to do if they think that the map is lost.

==Initial shock==

When the mapper casually opens up the directory, and sees that it isn't there, they will have a drastic change in their emotion. Possible outcomes of it, like stated in the Preface, is that the person would become mad or sad. After that fiasco is over, the mapper should take ten deep breaths and then try to calm down, usually with a nice warm cup of tea or coffee.

==Thinking it Through==

After the mapper calms down, he/she should think about what they were doing on the computer lately, even what ''other'' people are doing. He/she should think about the following questions:

#What did I do majorly to the computer lately?
##Reformat?
##Disk Cleaning Utility?
##Cleaning Up?
#What did other people do?
#Did I mass delete stuff?
#Did I uninstall UT2003 temporarily, and then foolishly deleted the UT2003 Folder?
#Did I empty the recycle bin?
#Did I import something and forget to save it? (exceptions for mylevel package)

==Aftermath==

===Success===

If you found it, great. :)

===Failure===

Sorry that you lost your map. :(

==Feedback==

'''DeepQantas:''' My view: It's all good, since now you know what to do when you start over again. But please, do go on... ;)

'''Zxanphorian:''' O_o I didn't start over, I just thought that I lost it, but I found it.

'''Zxanphorian:''' I'm stopping for the night, can't think of other stuff to write. Could someone please write some questions for the Thinking it Through section? Also, I have to desperately write more stuff in the Success anf Failure sections.

'''Tarquin:''' Zxan, I think there's a FAQ question on this &amp;ndash; could you link from it please?

'''Foxpaw:''' This has somewhat similar content to [[Legacy:In Case Of Emergency|In Case Of Emergency]]. I also know that there's a page somewhere that discusses the autosaves, etc. as possible ways of restoring a map if it's lost.

'''Tarquin:''' [[Legacy:In Case Of Emergency|In Case Of Emergency]] is aimed at mods. I think the page that mentions autosaves is [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]] and [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]]. Can we merge the mapping / modding first aid pages, or are they too dissimilar?

'''Zxanphorian:''' You can merge the pages. The message are the same.

'''Dirk Fist:''' I backup my new maps to a CDR :D(location unkown O_o), once a week ;)(only CDR I found say's june 12-2003 :shocked:) and it does'nt have anything on it :stupid:

'''Zxanphorian:''' O_o

'''Neo Reloaded:''' What about if you open UnrealEd and open up a map that you're working 

on and it comes up as black space, e.g. nothing? :stupid:

'''Legal:''' Then you should have saved more often after starting work... ;)

'''Neo Reloaded:''' Ok, thanks, I'll try to do that more often because I tried to make a CTF-Coret remake and it didn't come up after i saved it O_o

'''Legal:''' Make backup copies as well, might help you. Seems something else might be wrong though, using WinME?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3618</id>
      <timestamp>2004-05-26T13:28:27Z</timestamp>
      <contributor>
        <ip>Neo Reloaded</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Preface==

{{innerbox| HELP!!! I have lost my map! NOOOOOOOOoooo...!!!!

}}

That is a possible statement that someone would say if they thought that they lost their map or whatever. After that statement, they might become mad, throwing stuff around or sad, bawlling like a little baby. This article is meant to tell the mapper what to do if they think that the map is lost.

==Initial shock==

When the mapper casually opens up the directory, and sees that it isn't there, they will have a drastic change in their emotion. Possible outcomes of it, like stated in the Preface, is that the person would become mad or sad. After that fiasco is over, the mapper should take ten deep breaths and then try to calm down, usually with a nice warm cup of tea or coffee.

==Thinking it Through==

After the mapper calms down, he/she should think about what they were doing on the computer lately, even what ''other'' people are doing. He/she should think about the following questions:

#What did I do majorly to the computer lately?
##Reformat?
##Disk Cleaning Utility?
##Cleaning Up?
#What did other people do?
#Did I mass delete stuff?
#Did I uninstall UT2003 temporarily, and then foolishly deleted the UT2003 Folder?
#Did I empty the recycle bin?
#Did I import something and forget to save it? (exceptions for mylevel package)

==Aftermath==

===Success===

If you found it, great. :)

===Failure===

Sorry that you lost your map. :(

==Feedback==

'''DeepQantas:''' My view: It's all good, since now you know what to do when you start over again. But please, do go on... ;)

'''Zxanphorian:''' O_o I didn't start over, I just thought that I lost it, but I found it.

'''Zxanphorian:''' I'm stopping for the night, can't think of other stuff to write. Could someone please write some questions for the Thinking it Through section? Also, I have to desperately write more stuff in the Success anf Failure sections.

'''Tarquin:''' Zxan, I think there's a FAQ question on this &amp;ndash; could you link from it please?

'''Foxpaw:''' This has somewhat similar content to [[Legacy:In Case Of Emergency|In Case Of Emergency]]. I also know that there's a page somewhere that discusses the autosaves, etc. as possible ways of restoring a map if it's lost.

'''Tarquin:''' [[Legacy:In Case Of Emergency|In Case Of Emergency]] is aimed at mods. I think the page that mentions autosaves is [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]] and [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]]. Can we merge the mapping / modding first aid pages, or are they too dissimilar?

'''Zxanphorian:''' You can merge the pages. The message are the same.

'''Dirk Fist:''' I backup my new maps to a CDR :D(location unkown O_o), once a week ;)(only CDR I found say's june 12-2003 :shocked:) and it does'nt have anything on it :stupid:

'''Zxanphorian:''' O_o

'''Neo Reloaded:''' What about if you open UnrealEd and open up a map that you're working 

on and it comes up as black space, e.g. nothing? :stupid:

'''Legal:''' Then you should have saved more often after starting work... ;)

'''Neo Reloaded:''' Ok, thanks, I'll try to do that more often because I tried to make a CTF-Coret remake and it didn't come up after i saved it O_o

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HeroStatue</title>
    <id>1383</id>
    <revision>
      <id>3503</id>
      <timestamp>2007-11-19T15:03:14Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Package: HeroStatue&lt;br /&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; HeroStatue&lt;br&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; HeroPlaque }}

The HeroStatue is a dynamic [[Legacy:Decoration|Decoration]] by [[Legacy:ElBundee|ElBundee]]. It shows the player who leads the match &amp;mdash; or the best player of a given team &amp;mdash; or any player in the match &amp;mdash; or a player on a given position in the scoreboard... You can define team skins for the statue and effects when the hero changes. Once the hero changes, the statue can play several animations &amp;mdash; wave, taunt, ... , too.

Additionally, there's a plaque which shows the name of the hero. Mappers may build their own plaque by using scripted textures, too...

This script initially was thought for the [[Legacy:Jailbreak|Jailbreak]] modification, but it can be used for any other gametype.

[http://downloads.utassault.net/?d=Maps/DeathMatch/&amp;f=DM-HeroStatue110.zip Download it here.]

'''Dark Pulse:''' Well that's pretty nifty... Imagine building a big Coliseum-type level, and having this thing in the center, waving and Thrusting as Bodies fly... heheheheheheheheheheh*burp*

----

[[:Category:Legacy Custom Class (UT)]] (package in fact)
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3504</id>
      <timestamp>2003-07-08T08:38:58Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Package: HeroStatue&lt;br /&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; HeroStatue&lt;br&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; HeroPlaque }}

The HeroStatue is a dynamic [[Legacy:Decoration|Decoration]] by [[Legacy:ElBundee|ElBundee]]. It shows the player who leads the match &amp;mdash; or the best player of a given team &amp;mdash; or any player in the match &amp;mdash; or a player on a given position in the scoreboard... You can define team skins for the statue and effects when the hero changes. Once the hero changes, the statue can play several animations &amp;mdash; wave, taunt, ... , too.

Additionally, there's a plaque which shows the name of the hero. Mappers may build their own plaque by using scripted textures, too...

This script initially was thought for the [[Legacy:Jailbreak|Jailbreak]] modification, but it can be used for any other gametype.

*[http://home.arcor.de/elbundee/downloads/DM-HeroStatue110.zip Download it here.]

'''Dark Pulse:''' Well that's pretty nifty... Imagine building a big Coliseum-type level, and having this thing in the center, waving and Thrusting as Bodies fly... heheheheheheheheheheh*burp*

----

[[:Category:Legacy Custom Class]] (package in fact)
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3505</id>
      <timestamp>2006-09-01T12:57:56Z</timestamp>
      <contributor>
        <ip>Torin</ip>
      </contributor>
      <comment>alternate download link</comment>
      <text xml:space="preserve">{{classbox|Package: HeroStatue&lt;br /&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; HeroStatue&lt;br&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; HeroPlaque }}

The HeroStatue is a dynamic [[Legacy:Decoration|Decoration]] by [[Legacy:ElBundee|ElBundee]]. It shows the player who leads the match &amp;mdash; or the best player of a given team &amp;mdash; or any player in the match &amp;mdash; or a player on a given position in the scoreboard... You can define team skins for the statue and effects when the hero changes. Once the hero changes, the statue can play several animations &amp;mdash; wave, taunt, ... , too.

Additionally, there's a plaque which shows the name of the hero. Mappers may build their own plaque by using scripted textures, too...

This script initially was thought for the [[Legacy:Jailbreak|Jailbreak]] modification, but it can be used for any other gametype.

*[http://home.arcor.de/elbundee/downloads/DM-HeroStatue110.zip Download it here.]
*[http://downloads.utassault.net/?d=Maps/DeathMatch/&amp;f=DM-HeroStatue110.zip Or here.]

'''Dark Pulse:''' Well that's pretty nifty... Imagine building a big Coliseum-type level, and having this thing in the center, waving and Thrusting as Bodies fly... heheheheheheheheheheh*burp*

----

[[:Category:Legacy Custom Class]] (package in fact)
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Herr General</title>
    <id>1451</id>
    <revision>
      <id>3650</id>
      <timestamp>2008-03-25T01:10:34Z</timestamp>
      <contributor>
        <ip>Herr General</ip>
      </contributor>
      <comment>Created the page.</comment>
      <text xml:space="preserve">Hey, my name is Herr General. I am an amateur mapper who spends most of his time creating crappy maps that really don't go anywhere and never get released, but I make them anyway. I constantly make maps, but never do anything with them. I copy and paste from official maps, mess around with meshes and textures, and basically have fun. I have only released two maps, and one of them quickly faded into the depths of obscurity. 

----

My recent map is quite small, but has barely got any comments or downloads on it. I have had tons of fun mapping, but I wonder about small things such as changing the clipping distance for the camera (65,536 UU) or importing transparent textures. I am fascinated with nighttime levels, and love creating them. I shall stop rambling now, so you can go do something useful. I will post a link to my map, but don't expect anything spectacular. Thanks for viewing this page, but don't expect updates very often.

As for my map, I have a thread over at the Epic Games forums. Here's the link. [http://utforums.epicgames.com/showthread.php?t=605217 Thread]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hidden Property</title>
    <id>1437</id>
    <revision>
      <id>3627</id>
      <timestamp>2004-06-01T03:18:38Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The term &quot;Hidden Property&quot; refers to those properties that have been marked in UScript as non-editable to the user. For information on changing this type of property, see the section in [[Legacy:Actor Properties Window|Actor Properties Window]] marked &quot;hidden variables&quot;.</text>
    </revision>
    <revision>
      <id>3628</id>
      <timestamp>2004-06-01T03:14:27Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The term &quot;Hidden Property&quot; refers to those properties that have been marked in UScript as non-editable to the user. To change a hidden property, follow these simple steps (and if you're a mapper don't you dare back out now, this is the easiest bit of coding you'll ever do)

# [[Legacy:Create A Subclass|Create a subclass]] of whatever class you want to change the property of. For example if you're trying to make a water volume that can move, you'll want to subclass [[Legacy:WaterVolume|WaterVolume]].
# Once you've succesfully compiled your subclass, type &lt;tt&gt;editdefault class=&quot;Your Class Name Here&quot;&lt;/tt&gt; at the [[Legacy:UnrealEd Console|UnrealEd Console]]. Don't forget the quotes around your class name.
# In the [[Legacy:Properties Sheet|Properties Sheet]] that pops up, there will be a tab (quite oddly) named &quot;None&quot;, open this up and you'll see a ''long'' list of properties, these are all the properites that are normally hidden when you try to edit an object's properties.
# Since you are editing the ''default'' values of the class, keep in mind that you need to make any changes ''before'' you add any instances of this class to your map.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hiding Actors</title>
    <id>1386</id>
    <revision>
      <id>3512</id>
      <timestamp>2005-08-31T20:18:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When you open an Epic map for the first time, you think &quot;sheesh! what's all that!&quot;. Maps are full of ''stuff'', even more so with the higher level of detail in [[Legacy:UT2004|UT2004]] maps.

So, to keep some shred of sanity, there are several ways in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] to hide parts of a map while you focus on a small piece of the action.

Generally, hiding actors in UnrealEd is a good idea because...
* it makes selecting smaller items easier
* on large maps it speeds up [[Legacy:Rebuild|rebuild]]ing if the &quot;Only visible actors&quot; option is checked
* it decreases danger of accidentally moving things
* it makes things look easier.

==Hiding by type ==

Under [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; View there's a list of types of things that can be hidden or shown.

For example, set the 3D viewport to show paths, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and '''W''' to hide static meshes. This gives a really clear overview of the [[Legacy:Botpath Network|botpath network]].

==Hiding specific objects ==

Use the actor visibility set of buttons in the [[Legacy:Toolbox|toolbox]] to hide or show actors currently selected.

[[Image:Legacy_interface.toolbox.visibility.gif|center|]]

# Show Selected Actors Only
# Hide Selected Actors
# Show All Actors
# Invert Selection
# Change Camera Move Speed

The first two buttons are very useful in combination with different methods of selecting actors. Try, for example:
* [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Select submenu commands
* using CTRL+ALT+drag to select an area of a map

==Groups ==

You can use the grouping thing to hide actors in your map. The grouping is not very widely used &amp;ndash; maybe because it brings in new stuff to learn. (It's also buggy in early versions of UnrealEd, or at least complex enough to seem unpredictable). However, I guarantee it is worth the pain; especially if you are working with a complex map with lot of actors in it.

Here are some guidelines on how to make grouping a bit easier:

* Precede the group names with a number and leave gaps in between so you can add groups later in the gaps. UnrealEd shows the group list in alphabetical order.
* Never let actors to belong in more than one group. Doing this makes things confusing. (And an actor's membership of groups is stored in a field with a limited length &amp;ndash; this is a source of buggy behaviour when this field's contents gets truncated.)
* Do not group actors by their class hierarchy (grouping pathnodes, brushes, etc) &amp;ndash; this would be useless since it is already available (see above). Instead group them by their location or use whichever seems to be more suitable. som examples might be:
** group by room, allows you to build the map one room at a time.
** group by function in the game, eg red base, blue base, etc
** group particular objects, eg all the lights that come from a particular type of source static mesh

You can hide all the actors in a group by uncchecking the box beside the group name. Alternatively, there's a toolbar button to select all actors in the currently selected group. You can then use the actor visibility set of buttons in the [[Legacy:Toolbox|toolbox]] (see above).

To see grouping in full action look at [http://furpile.com/cgi-bin/PreviewUTCMS?Pack=JB%2D12%2DCubes&amp;Name=JB%2D12%2DCubes&amp;Suff=unr JB-12-Cubes]. It has 12 cubes (what did You expect) and these can be build separately. This grouping speeded up the compilation a lot.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3513</id>
      <timestamp>2005-01-14T02:17:24Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">When you open an Epic map for the first time, you think &quot;sheesh! what's all that!&quot;. Maps are full of ''stuff'', even more so with the higher level of detail in [[Legacy:UT2003|UT2003]] maps.

So, to keep some shred of sanity, there are several ways in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] to hide parts of a map while you focus on a small piece of the action.

==Hiding by type ==

Under [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; View there's a list of types of things that can be hidden or shown.

For example, set the 3D viewport to show paths, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and '''W''' to hide static meshes. This gives a really clear overview of the [[Legacy:Botpath Network|botpath network]].

==Hiding specific objects ==

[[Image:Legacy_interface.toolbox.visibility.gif|center|]]

# Show Selected Actors Only
# Hide Selected Actors
# Show All Actors
# Invert Selection
# Change Camera Move Speed

Why should You hide actors on the editor?

* Makes selecting smaller items easier
* On large maps speeds up compiling if the &quot;Only visible actors&quot; is checked
* Decreases danger of accidentally moving things
* Makes things look easier

==Groups ==

You can use the grouping thing to hide actors in Your map. The grouping is not very widely used - maybe because it brings in new stuff to learn. (it's also buggy, or at least complex enough to seem unpredictable) However - I guarantee it is worth the pain; especially if You are working with a complex map with lot of actors in it.

Here are some guidelines on how to make grouping a bit easier:

* Precede the group names with a number and leave gaps in between so You can add groups later in the gaps. UnrealEd shows the group list in alphabetical order.
* Never let actors to belong in more than one group. Doing this makes things confusing.
* Do not group actors by their class hierarchy - this would be useless (grouping pathnodes, brushes, ...) Instead group them by their location or use whichever seems to be more suitable. I use grouping by location since this enables me to build the map one room at a time.

To see grouping in full action look at [http://furpile.com/cgi-bin/PreviewUTCMS?Pack=JB%2D12%2DCubes&amp;Name=JB%2D12%2DCubes&amp;Suff=unr JB-12-Cubes]. It has 12 cubes (what did You expect) and these can be build separately. This grouping speeded up the compilation a lot.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3514</id>
      <timestamp>2005-08-31T20:16:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">When you open an Epic map for the first time, you think &quot;sheesh! what's all that!&quot;. Maps are full of ''stuff'', even more so with the higher level of detail in [[Legacy:UT2004|UT2004]] maps.

So, to keep some shred of sanity, there are several ways in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] to hide parts of a map while you focus on a small piece of the action.

Generally, hiding actors in UnrealEd is a good idea because...
* it makes selecting smaller items easier
* on large maps it speeds up [[Legacy:Rebuild|rebuild]]ing if the &quot;Only visible actors&quot; option is checked
* it decreases danger of accidentally moving things
* it makes things look easier.

==Hiding by type ==

Under [[Legacy:Viewport Caption Context Menu|Viewport Caption Context Menu]] -&gt; View there's a list of types of things that can be hidden or shown.

For example, set the 3D viewport to show paths, hit '''Q''' to hide the [[Legacy:BSP|BSP]], and '''W''' to hide static meshes. This gives a really clear overview of the [[Legacy:Botpath Network|botpath network]].

==Hiding specific objects ==

Use the actor visibility set of buttons in the [[Legacy:Toolbox|toolbox]] to hide or show actors currently selected.

[[Image:Legacy_interface.toolbox.visibility.gif|center|]]

# Show Selected Actors Only
# Hide Selected Actors
# Show All Actors
# Invert Selection
# Change Camera Move Speed

The first two buttons are very useful in combination with different methods of selecting actors. Try, for example:
* [[Legacy:Viewport Context Menu|Viewport Context Menu]] -&gt; Select submenu commands
* using CTRL+ALT+drag to select an area of a map

==Groups ==

You can use the grouping thing to hide actors in your map. The grouping is not very widely used &amp;ndash; maybe because it brings in new stuff to learn. (It's also buggy in early versions of UnrealEd, or at least complex enough to seem unpredictable). However, I guarantee it is worth the pain; especially if you are working with a complex map with lot of actors in it.

Here are some guidelines on how to make grouping a bit easier:

* Precede the group names with a number and leave gaps in between so you can add groups later in the gaps. UnrealEd shows the group list in alphabetical order.
* Never let actors to belong in more than one group. Doing this makes things confusing. (And an actor's membership of groups is stored in a field with a limited length &amp;ndash; this is a source of buggy behaviour when this field's contents gets truncated.)
* Do not group actors by their class hierarchy (grouping pathnodes, brushes, etc) &amp;ndash; this would be useless since it is already available (see above). Instead group them by their location or use whichever seems to be more suitable. som examples might be:
** group by room, allows you to build the map one room at a time.
** group by function in the game, eg red base, blue base, etc
** group particular objects, eg all the lights that come from a particular type of source static mesh

You can hide all the actors in a group by uncchecking the box beside the group name. Alternatively, there's a toolbar button to select all actors in the currently selected group. You can then use the actor visibility set of buttons in the [[Legacy:Toolbox|toolbox]] (see above).

To see grouping in full action look at [http://furpile.com/cgi-bin/PreviewUTCMS?Pack=JB%2D12%2DCubes&amp;Name=JB%2D12%2DCubes&amp;Suff=unr JB-12-Cubes]. It has 12 cubes (what did You expect) and these can be build separately. This grouping speeded up the compilation a lot.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Highlander</title>
    <id>1399</id>
    <revision>
      <id>3543</id>
      <timestamp>2003-06-20T21:16:03Z</timestamp>
      <contributor>
        <ip>WebcacheH07a.cache.pol.co.uk</ip>
      </contributor>
      <comment>im a newb</comment>
      <text xml:space="preserve">'''Tarquin:''' Hi there. Welcome to the Wiki :D 

'''Highlander:''' Hullo, Nice lil resource u guys have got here.

'''ZxAnPhOrIaN:''' Welcome aboard! :) :tup:

'''AlexAC:''' Hello! im a bit of a newbie (ok Alot of a newb, and using ut2003) but i like the look of your grav pack

and umm, i suck and cant use it. What im doing:

copy the text from each box into a file (in the dir ut2003\GravityZoneInfo\classes) with the file name as x.uc where;

&quot;class x extends y&quot;

of course i added edit packages to ut2003.ini but when i run &quot;ucc.exe make&quot; i get the error;

&quot;Bad class definition 'GravityZoneInfo'/''/796/796

Can't find file '..\GravityZoneInfo\Classes\GravityZoneInfo.uc' for import

Parsing blackhole&quot;

is this me being stupid (yet again) or (hopefully!) something else, i have a sneaking suspusion i should be in unrealed...

====About Meh ====

This is where I blabber on about me.

====Contact Info ====
* Email: unfhighlander@hotmail.com / highlander@unreal-command.com
* ICQ: 30676914
* Can usually be found on: irc.bomb.net #unf #bombsquad or irc.quakenet.org #unrealcommand #unrealfortress

====Projects ====
* [[Legacy:Highlander/BallReturnVolume|Highlander/BallReturnVolume]] Volume that will Return the BR ball back to its base.
* Several (3) Badly Designed :) 3rd Party maps for Unreal Fortress
** UNF-CTF-Suicidal_Tendencies
** UNF-OF-DOME
** UNF-CTF-Hemaroids
* A multitude of un-finished Unreal Fortress maps dropped for various reasons :(
* numerous maps which tend to make the UT engine react badly :P (Spherical warpzones are fun)
* Several small map-related actors for use in above maps.
* Such as a little pack of actors that you can use for various &quot;gravity&quot; related fx [[Legacy:Highlander/Gravitypack|highlander/gravitypack]] In their poorly coded glory. (One of the first things i wrote in unrealscript with [[Legacy:Aphelion|aphelion]]'s help)
* Recent Map-Bitch^H^H^H^H^H^Hper for [http://www.unreal-command.com Unreal-Command]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3544</id>
      <timestamp>2002-11-24T16:34:17Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:''' Hi there. Welcome to the Wiki :D 

'''Highlander:''' Hullo, Nice lil resource u guys have got here.

'''ZxAnPhOrIaN:''' Welcome aboard! :) :tup:

====About Meh ====

This is where I blabber on about me.

====Contact Info ====
* Email: unfhighlander@hotmail.com / highlander@unreal-command.com
* ICQ: 30676914
* Can usually be found on: irc.bomb.net #unf #bombsquad or irc.quakenet.org #unrealcommand #unrealfortress

====Projects ====
* [[Legacy:Highlander/BallReturnVolume|Highlander/BallReturnVolume]] Volume that will Return the BR ball back to its base.
* Several (3) Badly Designed :) 3rd Party maps for Unreal Fortress
** UNF-CTF-Suicidal_Tendencies
** UNF-OF-DOME
** UNF-CTF-Hemaroids
* A multitude of un-finished Unreal Fortress maps dropped for various reasons :(
* numerous maps which tend to make the UT engine react badly :P (Spherical warpzones are fun)
* Several small map-related actors for use in above maps.
* Such as a little pack of actors that you can use for various &quot;gravity&quot; related fx [[Legacy:Highlander/Gravitypack|highlander/gravitypack]] In their poorly coded glory. (One of the first things i wrote in unrealscript with [[Legacy:Aphelion|aphelion]]'s help)
* Recent Map-Bitch^H^H^H^H^H^Hper for [http://www.unreal-command.com Unreal-Command]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Highlander/BallReturnVolume</title>
    <id>1401</id>
    <revision>
      <id>3547</id>
      <timestamp>2002-11-24T16:34:48Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class BallReturnVolume extends Volume;
//Written by Robin &quot;Highlander&quot; Murray Nov 24th 2002
//when the ball enters this volume it will be sent home
//if player carrys ball through volume no effect will be taken.
/*To add this functionality to already existing volume, extend actor instead and link the volume to this actor */
function touch (actor other)
	{
	if (other.IsA('xBombFlag'))
		{
		xBombFlag(Other).sendhome();
		
		}
	}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Highlander/Developer Journal</title>
    <id>1402</id>
    <revision>
      <id>3548</id>
      <timestamp>2003-08-05T09:49:06Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">Well I figured i should start one of these things sooner than later. If for no other reason than to keep my thoughts organised. Currently I am working on Unreal-Command as a mapper / coder. With the primary focus of my code being the integration of our gametype with the maps and other map-related actors.

===January 8th 2003===

First entry, well ive been working on Unreal-Command for a good few months now. Its an interesting project that seems to be butting heads against a few engine limitations already :). Foremost amongst them is the draw limit, the engine stops drawing about 60,000 units out (further at the corners of your vision). Ive found a few methods to cope with this.
* Dont make maps that big. Not really an option here :) but it may solve the problem for others.
* Have a central tall object that will block the region not drawn, eg: volcano / mountain 
* Stick to small rolling hills, This works pretty well as the sky is rendered over the area that is out of range.

The other hurdle Ive ran into was transfering data from one level into the next. Basicly as part of my work on Unreal-Command ive been working out the details in a system to have one map effect the next map. For example: The primary objective of one map could be to destroy a bridge, now depending on which team wins that bridge may or may not be there in the next map (which takes place at a later time.) I basicly settled on passing a single string across the level and parsing it at level start and level change so you can also define a branching &quot;campaign&quot; of maps to be played. 

Recently ive started work on a modular volume system to be used for defining Bases / objectives / control points or whatever else the mapper needs the objectives are also designed along a similar idea where the mapper adds what they want to happen when the objective is captured via editinline (exactly same way as emitter works). I have also been experimenting with some different ideas for the in-game interface i'm gonna see how they play out ive gotten a lot of feedback from the team so its time to start work on the second revision.

===January 21st 2003===

Had a good meeting between all the uscript programmers involved in unreal-command on the weekend. Got a lot of stuff worked out and things are progressing well. I tooks some time to do some preliminary work on a side project of mine. 

&lt;uscript&gt;
class blades extends actor;
//protoss style hand weapons.

//bleh just wanna see effect... 
function postbeginplay()
	{
	local xPawn ThePawn;
	foreach allactors(class'xPawn',ThePawn)
		{
		StartEffect (ThePawn);
		}
	}

function StartEffect ( xPawn P )
	{
	local coords BoneLoc;
	local vector elbow,hand;
	local Bladesfx MyBlade;
	BoneLoc=P.GetBoneCoords ('rfarm');
	elbow=Boneloc.Origin;
	BoneLoc=p.GetBoneCoords ('righthand');
	hand=BoneLoc.Origin;
	MyBlade=Spawn(class'bladesfx', P,, Hand,rotator(Elbow-Hand));
	p.AttachToBone(MyBlade,'righthand');
	}
&lt;/uscript&gt;

&lt;uscript&gt;
class bladesfx extends xEmitter;

defaultproperties
{
	mSizeRange[0]=20
	mSizeRange[1]=20
	mSpeedRange[0]=-160
	mSpeedRange[1]=-160
	Skins[0]=Texture'EmitterTextures.Flares.EFlareC2'
	mRegenRange[0]=32
	mRegenRange[1]=32
	Style=STY_Translucent
	mLifeRange[0]=0.25
	mLifeRange[1]=0.25
}
&lt;/uscript&gt;

Basicly.. It attaches a neat looking stream of particles to the right arm of every player in the game. Works pretty well. Need to make the stream feel more &quot;solid&quot; and perhaps make a better texture for the particles.

'''Eldhrin:''' Wow, this looks really cool. Unreal Command is good, but the Protoss-style blades thing is really, really good. I'm sure I'll change my mind about that when Unreal Command is playable, but I'm just continually surprised by what can be done... congratulations.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3549</id>
      <timestamp>2003-01-09T01:43:14Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well I figured i should start one of these things sooner than later. If for no other reason than to keep my thoughts organised. Currently I am working on Unreal-Command as a mapper / coder. With the primary focus of my code being the integration of our gametype with the maps and other map-related actors.

===January 8th 2003===

First entry, well ive been working on Unreal-Command for a good few months now. Its an interesting project that seems to be butting heads against a few engine limitations already :). Foremost amongst them is the draw limit, the engine stops drawing about 60,000 units out (further at the corners of your vision). Ive found a few methods to cope with this.
* Dont make maps that big. Not really an option here :) but it may solve the problem for others.
* Have a central tall object that will block the region not drawn, eg: volcano / mountain 
* Stick to small rolling hills, This works pretty well as the sky is rendered over the area that is out of range.

The other hurdle Ive ran into was transfering data from one level into the next. Basicly as part of my work on Unreal-Command ive been working out the details in a system to have one map effect the next map. For example: The primary objective of one map could be to destroy a bridge, now depending on which team wins that bridge may or may not be there in the next map (which takes place at a later time.) I basicly settled on passing a single string across the level and parsing it at level start and level change so you can also define a branching &quot;campaign&quot; of maps to be played. 

Recently ive started work on a modular volume system to be used for defining Bases / objectives / control points or whatever else the mapper needs the objectives are also designed along a similar idea where the mapper adds what they want to happen when the objective is captured via editinline (exactly same way as emitter works). I have also been experimenting with some different ideas for the in-game interface i'm gonna see how they play out ive gotten a lot of feedback from the team so its time to start work on the second revision.</text>
    </revision>
    <revision>
      <id>3550</id>
      <timestamp>2003-01-21T23:58:04Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Well I figured i should start one of these things sooner than later. If for no other reason than to keep my thoughts organised. Currently I am working on Unreal-Command as a mapper / coder. With the primary focus of my code being the integration of our gametype with the maps and other map-related actors.

===January 8th 2003===

First entry, well ive been working on Unreal-Command for a good few months now. Its an interesting project that seems to be butting heads against a few engine limitations already :). Foremost amongst them is the draw limit, the engine stops drawing about 60,000 units out (further at the corners of your vision). Ive found a few methods to cope with this.
* Dont make maps that big. Not really an option here :) but it may solve the problem for others.
* Have a central tall object that will block the region not drawn, eg: volcano / mountain 
* Stick to small rolling hills, This works pretty well as the sky is rendered over the area that is out of range.

The other hurdle Ive ran into was transfering data from one level into the next. Basicly as part of my work on Unreal-Command ive been working out the details in a system to have one map effect the next map. For example: The primary objective of one map could be to destroy a bridge, now depending on which team wins that bridge may or may not be there in the next map (which takes place at a later time.) I basicly settled on passing a single string across the level and parsing it at level start and level change so you can also define a branching &quot;campaign&quot; of maps to be played. 

Recently ive started work on a modular volume system to be used for defining Bases / objectives / control points or whatever else the mapper needs the objectives are also designed along a similar idea where the mapper adds what they want to happen when the objective is captured via editinline (exactly same way as emitter works). I have also been experimenting with some different ideas for the in-game interface i'm gonna see how they play out ive gotten a lot of feedback from the team so its time to start work on the second revision.

===January 21st 2003===

Had a good meeting between all the uscript programmers involved in unreal-command on the weekend. Got a lot of stuff worked out and things are progressing well. I tooks some time to do some preliminary work on a side project of mine. 

&lt;uscript&gt;
class blades extends actor;
//protoss style hand weapons.

//bleh just wanna see effect... 
function postbeginplay()
	{
	local xPawn ThePawn;
	foreach allactors(class'xPawn',ThePawn)
		{
		StartEffect (ThePawn);
		}
	}

function StartEffect ( xPawn P )
	{
	local coords BoneLoc;
	local vector elbow,hand;
	local Bladesfx MyBlade;
	BoneLoc=P.GetBoneCoords ('rfarm');
	elbow=Boneloc.Origin;
	BoneLoc=p.GetBoneCoords ('righthand');
	hand=BoneLoc.Origin;
	MyBlade=Spawn(class'bladesfx', P,, Hand,rotator(Elbow-Hand));
	p.AttachToBone(MyBlade,'righthand');
	}
&lt;/uscript&gt;

&lt;uscript&gt;
class bladesfx extends xEmitter;

defaultproperties
{
	mSizeRange[0]=20
	mSizeRange[1]=20
	mSpeedRange[0]=-160
	mSpeedRange[1]=-160
	Skins[0]=Texture'EmitterTextures.Flares.EFlareC2'
	mRegenRange[0]=32
	mRegenRange[1]=32
	Style=STY_Translucent
	mLifeRange[0]=0.25
	mLifeRange[1]=0.25
}
&lt;/uscript&gt;

Basicly.. It attaches a neat looking stream of particles to the right arm of every player in the game. Works pretty well. Need to make the stream feel more &quot;solid&quot; and perhaps make a better texture for the particles.

'''Eldhrin:''' Wow, this looks really cool. Unreal Command is good, but the Protoss-style blades thing is really, really good. I'm sure I'll change my mind about that when Unreal Command is playable, but I'm just continually surprised by what can be done... congratulations.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Highlander/Gravitypack</title>
    <id>1400</id>
    <revision>
      <id>3545</id>
      <timestamp>2003-07-20T10:41:47Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well Tarquin said to paste the code... So here it is in its n00b glory.

&lt;uscript&gt;
//Written by Robin Murray Nov 2001 (]Bs[Highlander)
//unfhighlander@hotmail.com
//for use in UNF-OF-dome
//Is a gravitational point source.
//ie: a point in space that effects all the pawns in its radius of effect (collision radius)

class blackhole extends effects;

var() float force; //multiplier that u can use to change the force exerted.
var vector me2target;
var bool bEnabled;
var pawn target;
var float temp;
var float temp2;

simulated function prebeginplay()
		{
		//disabled to start &lt;- fix me... ah well jus use timed trigger to disable it
		disable('tick');
		bEnabled = false;
		}

simulated function tick(float deltatime)
		{
		//log(&quot;in tick&quot;);
		foreach TouchingActors(class 'pawn',target){ //go through pawns
			//log(&quot;in foreach&quot;);
			if ((Target != None) &amp;&amp; (Target.Region.Zone != None)) {//if there is a target there...
			me2target=(self.Location-target.Location);
			me2target=Normal(me2target)*1500*DeltaTime;
			Target.SetPhysics(PHYS_Falling);
			Target.Velocity -=force*((Target.Region.Zone.ZoneGravity*DeltaTime)-me2target);	//change velocity
			}
		}//of foreach
		}

simulated function trigger(actor Other, pawn EventInstigator)//toggle it on or off
		{
		if (bEnabled)
			{
			disable('tick');
			benabled = false;
			log(&quot;blackhole disabled&quot;);
			}
			else
			{
			enable('tick');
			benabled = true;
			log(&quot;blackhole enabled&quot;);
			}
		
		}
&lt;/uscript&gt;

&lt;uscript&gt;
//Written by Robin Murray Nov 2001 (]Bs[Highlander)
//unfhighlander@hotmail.com
//for use in UNF-OF-dome
//Is a gravitational area that is not a zone.
class gravityactor extends effects;

var() float force; //multiplier that u can use to change the force exerted.
var() vector direction;
var bool bEnabled;
var pawn target;
var float temp;
var float temp2;

simulated function prebeginplay()
		{
		//disabled to start &lt;- fix me... ah well jus use timed trigger to disable it
		disable('tick');
		bEnabled = false;
		}
simulated function tick(float deltatime)
		{
		//log(&quot;in tick&quot;);
		foreach TouchingActors(class 'pawn',target){ //go through pawns
			//log(&quot;in foreach&quot;);
			if ((Target != None) &amp;&amp; (Target.Region.Zone != None)) {//if there is a target there...
			Target.SetPhysics(PHYS_Falling);
			Target.Velocity -=force*((Target.Region.Zone.ZoneGravity*DeltaTime)-direction);	//change velocity
			}
		}//of foreach
		}
simulated function trigger(actor Other, pawn EventInstigator)//toggle it on or off
		{
		if (bEnabled)
			{
			disable('tick');
			benabled = false;
			log(&quot;blackhole disabled&quot;);
			}
			else
			{
			enable('tick');
			benabled = true;
			log(&quot;blackhole enabled&quot;);
			}
		
		}
&lt;/uscript&gt;

&lt;uscript&gt;//=============================================================================
// GravityZoneInfo.
//=============================================================================
//Written By Robin Murray Nov 2001 (]Bs[Highlander)
// unfhighlander@hotmail.com
//For use in UNF-OF-dome
//Will toggle zone gravity and velocity between two sets of values on trigger
class GravityZoneInfo expands ZoneInfo;

var() vector NewZoneGrav;
var vector OldZoneGrav;
var() vector NewZoneVelocity;
var vector OldZoneVelocity;
function Trigger ( Actor Other, pawn EventInstigator )
{
	OldZoneGrav = ZoneGravity;
	ZoneGravity=NewZoneGrav;
	NewZoneGrav = OldZonegrav;
	OldZoneVelocity = ZoneVelocity;
	ZoneVelocity = NewZoneVelocity;
	NewZoneVelocity = OldZoneVelocity;	
}
&lt;/uscript&gt;

&lt;uscript&gt;
//Written by Robin Murray Nov 2001 (]Bs[Highlander)
//unfhighlander@hotmail.com
//for use in UNF-OF-dome
//is a whirlwind effect.

class whirlwind extends effects;
var() float force; //multiplier that u can use to change the force exerted.
var() int zcomponent; //move up or down?
var() bool bClockwise;
var vector me2target;
var vector tempvector;
var bool bEnabled;
var pawn target;
var float temp;
var float temp2;

simulated function prepare()
		{
		//disabled to start &lt;- fix me... ah well jus use timed trigger to disable it
		disable('tick');
		bEnabled = false;
		}

simulated function tick(float deltatime)
		{
		//log(&quot;in tick&quot;);
		foreach TouchingActors(class 'pawn',target){ //go through pawns
			//log(&quot;in foreach&quot;);
			if ((Target != None) &amp;&amp; (Target.Region.Zone != None)) {//if there is a target there...
			me2target=(self.Location-target.Location);
			//ok  now need to get vector at right angles to this 1...
			me2target.z = zcomponent; //up or down movement
			tempvector.x = 0;
			tempvector.y = 0;
			tempvector.z = 1; //going up
			if (bClockwise) {
			tempvector = me2target cross tempvector;
				}
				else
				{
				tempvector = tempvector cross me2target;
				}
			//now i have vector at right angles to vertical line in middle
			tempvector = tempvector + me2target;
			
			Target.SetPhysics(PHYS_Falling);
			Target.Velocity -=force*((Target.Region.Zone.ZoneGravity*DeltaTime)-tempvector);	//change velocity
			}
		}//of foreach
		}

simulated function trigger(actor Other, pawn EventInstigator)//toggle it on or off
		{
		if (bEnabled)
			{
			disable('tick');
			benabled = false;
			log(&quot;blackhole disabled&quot;);
			}
			else
			{
			enable('tick');
			benabled = true;
			log(&quot;blackhole enabled&quot;);
			}
		
		}
&lt;/uscript&gt;

'''Foxpaw:''' Did this work as you expected? I haven't been able to apply PHYS_Falling to something that is PHYS_Walking. It always just reverts instantly back to PHYS_Walking because it's touching the ground so it things it just landed. Maybe I'm just doing it wrong. Also, would you mind if I cleaned up the above a bit? There's some variables declared that don't get used at all, and some stray log statements and whatnot. It's your personal page though so it's up to you.</text>
    </revision>
    <revision>
      <id>3546</id>
      <timestamp>2002-08-19T22:43:46Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well Tarquin said to paste the code... So here it is in its n00b glory.

&lt;uscript&gt;
//Written by Robin Murray Nov 2001 (]Bs[Highlander)
//unfhighlander@hotmail.com
//for use in UNF-OF-dome
//Is a gravitational point source.
//ie: a point in space that effects all the pawns in its radius of effect (collision radius)

class blackhole extends effects;

var() float force; //multiplier that u can use to change the force exerted.
var vector me2target;
var bool bEnabled;
var pawn target;
var float temp;
var float temp2;

simulated function prebeginplay()
		{
		//disabled to start &lt;- fix me... ah well jus use timed trigger to disable it
		disable('tick');
		bEnabled = false;
		}

simulated function tick(float deltatime)
		{
		//log(&quot;in tick&quot;);
		foreach TouchingActors(class 'pawn',target){ //go through pawns
			//log(&quot;in foreach&quot;);
			if ((Target != None) &amp;&amp; (Target.Region.Zone != None)) {//if there is a target there...
			me2target=(self.Location-target.Location);
			me2target=Normal(me2target)*1500*DeltaTime;
			Target.SetPhysics(PHYS_Falling);
			Target.Velocity -=force*((Target.Region.Zone.ZoneGravity*DeltaTime)-me2target);	//change velocity
			}
		}//of foreach
		}

simulated function trigger(actor Other, pawn EventInstigator)//toggle it on or off
		{
		if (bEnabled)
			{
			disable('tick');
			benabled = false;
			log(&quot;blackhole disabled&quot;);
			}
			else
			{
			enable('tick');
			benabled = true;
			log(&quot;blackhole enabled&quot;);
			}
		
		}
&lt;/uscript&gt;

&lt;uscript&gt;
//Written by Robin Murray Nov 2001 (]Bs[Highlander)
//unfhighlander@hotmail.com
//for use in UNF-OF-dome
//Is a gravitational area that is not a zone.
class gravityactor extends effects;

var() float force; //multiplier that u can use to change the force exerted.
var() vector direction;
var bool bEnabled;
var pawn target;
var float temp;
var float temp2;

simulated function prebeginplay()
		{
		//disabled to start &lt;- fix me... ah well jus use timed trigger to disable it
		disable('tick');
		bEnabled = false;
		}
simulated function tick(float deltatime)
		{
		//log(&quot;in tick&quot;);
		foreach TouchingActors(class 'pawn',target){ //go through pawns
			//log(&quot;in foreach&quot;);
			if ((Target != None) &amp;&amp; (Target.Region.Zone != None)) {//if there is a target there...
			Target.SetPhysics(PHYS_Falling);
			Target.Velocity -=force*((Target.Region.Zone.ZoneGravity*DeltaTime)-direction);	//change velocity
			}
		}//of foreach
		}
simulated function trigger(actor Other, pawn EventInstigator)//toggle it on or off
		{
		if (bEnabled)
			{
			disable('tick');
			benabled = false;
			log(&quot;blackhole disabled&quot;);
			}
			else
			{
			enable('tick');
			benabled = true;
			log(&quot;blackhole enabled&quot;);
			}
		
		}
&lt;/uscript&gt;

&lt;uscript&gt;//=============================================================================
// GravityZoneInfo.
//=============================================================================
//Written By Robin Murray Nov 2001 (]Bs[Highlander)
// unfhighlander@hotmail.com
//For use in UNF-OF-dome
//Will toggle zone gravity and velocity between two sets of values on trigger
class GravityZoneInfo expands ZoneInfo;

var() vector NewZoneGrav;
var vector OldZoneGrav;
var() vector NewZoneVelocity;
var vector OldZoneVelocity;
function Trigger ( Actor Other, pawn EventInstigator )
{
	OldZoneGrav = ZoneGravity;
	ZoneGravity=NewZoneGrav;
	NewZoneGrav = OldZonegrav;
	OldZoneVelocity = ZoneVelocity;
	ZoneVelocity = NewZoneVelocity;
	NewZoneVelocity = OldZoneVelocity;	
}
&lt;/uscript&gt;

&lt;uscript&gt;
//Written by Robin Murray Nov 2001 (]Bs[Highlander)
//unfhighlander@hotmail.com
//for use in UNF-OF-dome
//is a whirlwind effect.

class whirlwind extends effects;

var() float force; //multiplier that u can use to change the force exerted.
var() int zcomponent; //move up or down?
var() bool bClockwise;
var vector me2target;
var vector tempvector;
var bool bEnabled;
var pawn target;
var float temp;
var float temp2;

simulated function prepare()
		{
		//disabled to start &lt;- fix me... ah well jus use timed trigger to disable it
		disable('tick');
		bEnabled = false;
		}

simulated function tick(float deltatime)
		{
		//log(&quot;in tick&quot;);
		foreach TouchingActors(class 'pawn',target){ //go through pawns
			//log(&quot;in foreach&quot;);
			if ((Target != None) &amp;&amp; (Target.Region.Zone != None)) {//if there is a target there...
			me2target=(self.Location-target.Location);
			//ok  now need to get vector at right angles to this 1...
			me2target.z = zcomponent; //up or down movement
			tempvector.x = 0;
			tempvector.y = 0;
			tempvector.z = 1; //going up
			if (bClockwise) {
			tempvector = me2target cross tempvector;
				}
				else
				{
				tempvector = tempvector cross me2target;
				}
			//now i have vector at right angles to vertical line in middle
			tempvector = tempvector + me2target;
			
			Target.SetPhysics(PHYS_Falling);
			Target.Velocity -=force*((Target.Region.Zone.ZoneGravity*DeltaTime)-tempvector);	//change velocity
			}
		}//of foreach
		}

simulated function trigger(actor Other, pawn EventInstigator)//toggle it on or off
		{
		if (bEnabled)
			{
			disable('tick');
			benabled = false;
			log(&quot;blackhole disabled&quot;);
			}
			else
			{
			enable('tick');
			benabled = true;
			log(&quot;blackhole enabled&quot;);
			}
		
		}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hit Prediction</title>
    <id>1412</id>
    <revision>
      <id>3574</id>
      <timestamp>2006-04-11T14:51:48Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an Open Source implementation of the Hit Prediction for UT2003, which is explained at [[Legacy:Lag Compensation|Lag Compensation]].

Feel free to use and improve the code for whatever you want, but if you modify it, please let us know about the modifications.

I don't offer a download here because I don't think that the implementation is polished and &quot;foolproof&quot; enough yet.

This example implementation will use a modified Instagib gametype with only one modified gun.

==Sourcecode ==

To make the source managable, I will post it in chunks and not in one whole, with a discussion for each chunk.

===The LocationTrail class ===

&lt;uscript&gt;
class LocationTrail extends Object;

var float TimeStamp;
var vector Location;
var Rotator Rotation;
var LocationTrail Next;
&lt;/uscript&gt;

Simply a class to hold a trail node.

===The Game Replication class ===

&lt;uscript&gt;
class PredictionReplicationInfo extends GameReplicationInfo;

var float PackageTimeStamp; // Constantly replicated to the client to TimeStamp shot packages for prediction

replication
{
	reliable if ( bNetDirty &amp;&amp; (Role == ROLE_Authority) )
		PackageTimeStamp;
}


function Tick( float DeltaTime)
{
	PackageTimeStamp = Level.TimeSeconds;

	Super.Tick(DeltaTime);
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' See [[Legacy:Lag Compensation|lag compensation]] for a discussion why it's neccessary to replicate the servertime constantly. It might be desirable to find a better solution though...

===The Player class ===

&lt;uscript&gt;
class PredictedPlayer extends xPlayer;

event PlayerTick( float DeltaTime )
{
	Super.PlayerTick(DeltaTime);
	
	// Increase PackageTimeStamp for smooth interpolated hit prediction
	PredictionReplicationInfo(GameReplicationInfo).PackageTimeStamp += DeltaTime;
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' This is simply because a client will usually run at a higher FPS, so prediction isn't limited to the ~50ms steps of the server (a client will predict movement between those 50ms steps).

===The Pawn class ===

&lt;uscript&gt;
class PredictedPawn extends xPawn;

var LocationTrail LocationTrail;  // The actual trail of locations
var vector SavedLocation;         // Used to restore location after timeshifting
var Rotator SavedRotation;
var float SavedTimeStamp;
var float MaxTrailSeconds;        // How many seconds should be stored in trails


event Tick( float DeltaTime )
{
	local LocationTrail Trail;

	Super.Tick(DeltaTime);
	
	// Store the new position and rotation in a LocationTrail
	Trail = new (none) class'LocationTrail';
	Trail.Next = LocationTrail;
	LocationTrail = Trail;
	
	LocationTrail.Location = Location;
	LocationTrail.Rotation = Rotation;
	// Using the timestamp which was saved at roundbegin and will be sent to the client
	LocationTrail.TimeStamp = PredictionReplicationInfo(Level.Game.GameReplicationInfo).PackageTimeStamp;
	
	// Free outdated LocationTrails
	for ( Trail=LocationTrail; Trail!=None; Trail=Trail.next )
	{
		if ( Level.TimeSeconds - Trail.TimeStamp &gt; MaxTrailSeconds )
		{
			Trail.Next = None;
			break;
		}
	}
}

defaultproperties
{
	MaxTrailSeconds=0.4;
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' I'm not sure if Tick() is the best place to store the trails. But it works and is pretty simple. It might be smarter to do this directly after playermovement though, but I couldn't find a place to hook this in (there probably is none, because actor movement is native).

I use PackageTimeStamp for the timestamp because I wasn't sure weither ServerTime gets modified during a tick. It probably doesn't, in this case it would make no difference to use Level.ServerTime instead.

===The Weapon class ===

We need to modify each weapon that is supposed to be unlagged, so we need a new weaponclass. Should we need a lot of unlagged weapons, it would make sense to create a new baseclass but for this example there will be only one gun (a modified EnhancedShockrifle).

&lt;uscript&gt;
class PredictedShockRifle extends SuperShockRifle;

replication
{
    // functions called by client on server
    reliable if( Role&lt;ROLE_Authority )
        ServerPredictedStartFire;
}


//// client only ////
simulated event ClientStartFire(int Mode)
{
    if (Pawn(Owner).Controller.IsInState('GameEnded'))
        return;
        
    if (Role &lt; ROLE_Authority)
    {
        if (StartFire(Mode))
        {
			ServerPredictedStartFire( Mode, PredictionReplicationInfo(PlayerController(Instigator.Controller).GameReplicationInfo).PackageTimeStamp );
        }
    }
    else
    {
        StartFire(Mode);
    }
}

//// server only ////
event ServerPredictedStartFire(byte Mode, float ClientTimeStamp)
{
    if ( (FireMode[Mode].NextFireTime &lt;= Level.TimeSeconds + FireMode[Mode].PreFireTime)
		&amp;&amp; StartFire(Mode) )
    {
        FireMode[Mode].ServerStartFireTime = Level.TimeSeconds;
	PredictedShockBeamFire(FireMode[Mode]).ClientStartFireTime = ClientTimeStamp; // Stupid hack but it works as long as we can trust the FireMode property. Clean code would check if this really is a PredictedShockBeamFire.
        FireMode[Mode].bServerDelayStartFire = false;
    }
    else
        FireMode[Mode].bServerDelayStartFire = true;
}


defaultproperties
{
	FireModeClass(0)=PredictedShockBeamFire;
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' I decided to create a new ServerStartFire function, so the timestamp can be transmitted. ClientStartFire is simply modified to call the new ServerStartFire.

===The WeaponFire class ===

This is a huge one, so I split it up in even smaller pieces.

&lt;uscript&gt;
class PredictedShockBeamFire extends SuperShockBeamFire;

// --- Prediction ---
var float ClientStartFireTime;	// This is the time the client actually started shooting

function DoTrace(Vector Start, Rotator Dir)
{
    local Vector X, End, HitLocation, HitNormal, RefNormal;
    local Actor Other;
    local int Damage;
    local bool bDoReflect;
    local int ReflectNum;

    ReflectNum = 0;
    while (true)
    {
        bDoReflect = false;
        X = Vector(Dir);
        End = Start + TraceRange * X;

		// *** HIT PREDICTION ***
		// Timeshift all pawns to make them match the clients reality (hopefully) before doing the trace
		if ( ClientStartFireTime &gt; 0 )
			TimeShiftPawns(ClientStartFireTime);

        Other = Trace(HitLocation, HitNormal, End, Start, true);

		// Revert all pawns to their original position
		if ( ClientStartFireTime &gt; 0 )
			UnShiftPawns();
			

        if ( Other != None &amp;&amp; (Other != Instigator || ReflectNum &gt; 0) )
        {
            if (bReflective &amp;&amp; Other.IsA('xPawn') &amp;&amp; xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25))
            {
                bDoReflect = true;
                HitNormal = Vect(0,0,0);
            }
            else if (!Other.bWorldGeometry)
            {
                Damage = (DamageMin + Rand(DamageMax - DamageMin)) * DamageAtten;
                Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType);
                HitNormal = Vect(0,0,0);
            }
            else if ( WeaponAttachment(Weapon.ThirdPersonActor) != None )
				WeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
        }
        else
        {
            HitLocation = End;
            HitNormal = Vect(0,0,0);
        }

		// Not here, we will do it clientside. :)
        // SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum);

        if (bDoReflect &amp;&amp; ++ReflectNum &lt; 4)
        {
            //Log(&quot;reflecting off&quot;@Other@Start@HitLocation);
            Start = HitLocation;
            Dir = Rotator(RefNormal); //Rotator( X - 2.0*RefNormal*(X dot RefNormal) );
        }
        else
        {
            break;
        }
    }
}
&lt;/uscript&gt;

The only important difference here is, that we timeshift all pawns before we do the hit detection trace. Thsi will get more clear later but it's really the most important thing and why we do all this in fact. This will do the hit detection in the timeframe the client saw when triggering the shot.

&lt;uscript&gt;
// Do the beameffect clientside
function DoClientTrace(Vector Start, Rotator Dir)
{
    local Vector X, End, HitLocation, HitNormal, RefNormal;
    local Actor Other;
    local bool bDoReflect;
    local int ReflectNum;

    ReflectNum = 0;
    while (true)
    {
        bDoReflect = false;
        X = Vector(Dir);
        End = Start + TraceRange * X;

        Other = Trace(HitLocation, HitNormal, End, Start, true);

        if ( Other != None &amp;&amp; (Other != Instigator || ReflectNum &gt; 0) )
        {
            if (bReflective &amp;&amp; Other.IsA('xPawn') &amp;&amp; xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25))
            {
                bDoReflect = true;
                HitNormal = Vect(0,0,0);
            }
            else if (!Other.bWorldGeometry)
            {
                HitNormal = Vect(0,0,0);
            }
        }
        else
        {
            HitLocation = End;
            HitNormal = Vect(0,0,0);
        }

        SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum);

        if (bDoReflect &amp;&amp; ++ReflectNum &lt; 4)
        {
            //Log(&quot;reflecting off&quot;@Other@Start@HitLocation);
            Start = HitLocation;
            Dir = Rotator(RefNormal); //Rotator( X - 2.0*RefNormal*(X dot RefNormal) );
        }
        else
        {
            break;
        }
    }
}

function DoClientFireEffect()
{                    
    local Vector StartTrace;
    local Rotator R, Aim;

    Instigator.MakeNoise(1.0);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Weapon.Owner.Location + Pawn(Weapon.Owner).EyePosition();
    Aim = AdjustAim(StartTrace, AimError);
	R = rotator(vector(Aim) + VRand()*FRand()*Spread);
    DoClientTrace(StartTrace, R);
}

event ModeDoFire()
{
	Super.ModeDoFire();
	
	// client
	if (Instigator.IsLocallyControlled())
	{
		DoClientFireEffect();
	}
}
&lt;/uscript&gt;

This will just render the shockbeam at the clientside. Not sure if it's the best way to do it, as it was just a quick hack to make it work.

&lt;uscript&gt;
// *** Hit Prediction Timeshifting Functions ***

function TimeShiftPawns(float TimeStamp)
{
	local Controller C;
	local PredictedPawn P;
	local LocationTrail CurrentTrail, LateTrail, OldTrail;
	local float interp;
	local vector LerpedLocation;
	local Rotator LerpedRotation;
	
	for ( C=Level.ControllerList; C!=None; C=C.NextController )
	{
		// Do not shift the attacker because she should already be where she was when she did the shot.
		if ( PredictedPawn(C.Pawn)!=None &amp;&amp; C.Pawn != Weapon.Owner )
			P = PredictedPawn(C.Pawn);
		else
			continue;
			
		LateTrail = None;
		OldTrail = None;
	
		// Find the sandwitching trail timestamps
		for ( CurrentTrail=P.LocationTrail; CurrentTrail!=None; CurrentTrail=CurrentTrail.Next )
		{
			if ( CurrentTrail.TimeStamp &gt; TimeStamp )
				LateTrail = CurrentTrail;
			else if ( OldTrail == None )
				OldTrail = CurrentTrail;
			else
				break;
		}
		
		if ( LateTrail != None &amp;&amp; OldTrail != None )
		{
			// Save original location
			P.SavedLocation = P.Location;
			P.SavedRotation = P.Rotation;
			P.SavedTimeStamp = Level.TimeSeconds;
		
			// Interpolate between closest trails and move pawn to this location
			// Find alpha value for interpolation based on timestamps
			interp = ( TimeStamp - OldTrail.TimeStamp ) / ( LateTrail.TimeStamp - OldTrail.TimeStamp ); 
			interp = FClamp( interp, 0, 1 );
			
			//Log(&quot;OldTimeStamp: &quot;$OldTrail.TimeStamp$&quot;, LateTimeStamp: &quot;$LateTrail.TimeStamp$&quot;, TimeStamp: &quot;$TimeStamp);
			//Log(&quot;Resulting Alpha: &quot;$interp); 
			
			LerpedLocation.X = Lerp( interp, OldTrail.Location.X, LateTrail.Location.X );
			LerpedLocation.Y = Lerp( interp, OldTrail.Location.Y, LateTrail.Location.Y );
			LerpedLocation.Z = Lerp( interp, OldTrail.Location.Z, LateTrail.Location.Z );
			
			//Log(&quot;OldLocation: &quot;$OldTrail.Location$&quot;, LateLocation: &quot;$LateTrail.Location$&quot;, LerpedLocation: &quot;$LerpedLocation);
			
			LerpedRotation.Pitch = Lerp( interp, OldTrail.Rotation.Pitch, LateTrail.Rotation.Pitch );
			LerpedRotation.Yaw = Lerp( interp, OldTrail.Rotation.Yaw, LateTrail.Rotation.Yaw );
			LerpedRotation.Roll = Lerp( interp, OldTrail.Rotation.Roll, LateTrail.Rotation.Roll );
			
			//Log(&quot;OldRotation: &quot;$OldTrail.Rotation$&quot;, LateRotation: &quot;$LateTrail.Rotation$&quot;, LerpedRotation: &quot;$LerpedRotation);
			
			P.SetLocation( LerpedLocation );
			P.SetRotation( LerpedRotation );
		}
		else if ( LateTrail != None )
		{
			// Save original location
			P.SavedLocation = P.Location;
			P.SavedRotation = P.Rotation;
			P.SavedTimeStamp = Level.TimeSeconds;
		
			// TimeStamp is out of reach, move pawn to latest trail
			P.SetLocation( LateTrail.Location );
			P.SetRotation( LateTrail.Rotation );
		}
	}
}

function UnShiftPawns()
{
	local Controller C;
	local PredictedPawn P;

	for ( C=Level.ControllerList; C!=None; C=C.NextController )
	{
		if ( PredictedPawn(C.Pawn)!=None &amp;&amp; C.Pawn != Weapon.Owner )
			P = PredictedPawn(C.Pawn);
		else
			continue;
	
		// Make sure that saved location is of this tick before moving
		if ( P.SavedTimeStamp == Level.TimeSeconds )
		{
			P.SetLocation( P.SavedLocation );
			P.SetRotation( P.SavedRotation );
		}
	}
}
&lt;/uscript&gt;

And last but not least the actual timeshifting functions (if more than one weapon is used, those should be moved to a new common base class if possible).

Finally you need a new Gametype or Mutator to replace the Pawn and PlayerController with out custom ones, use the new GameReplicationInfo class and make sure that only our Instagib rifle is used (a modified version of the Instagib mutator will do). I don't post this here because it's a rather common task.

===Discussion ===

'''Spark:''' That's it! I hope that those who actually use this code will actively help to improve the code, because a well working hit prediction could be quite important for mods trying to compete with the huge Counter-Strike (and for every other mod featuring hitscan weapons of course). It would be a pity if everyone would have to create this rather common functionality on his own, that's why I wrote this. Another cool thing would be a Mutator replacing all weapons with predicted counterparts that could be used for all basic gametypes. Maybe it would even be possible without subclassing Pawn and PlayerController, but I'm not sure.

Things that should be looked at and really need improvement are:
;Resetting the trails: If a player respawns or teleports, the trail should be resetted, otherwise the interpolation would move the pawn at a place he never visited. The chance that this leads to an accidental hit is basically null, that's why I didn't bother yet but it's certainly crack. :) Another thing is, that the trails should probably be cleaned after a pawn is destroyed (not sure if this is automatic).
;Rapid fire guns: Those guns in UT2003 only send StartFire and a StopFire signals, so with the above code, the ClientTimeStamp would also be replicated only once. This means that the ClientFireTime time has to be increased just like the ServerFireTime. This is not a problem (as long as you think of it), but it can lead to inaccuracies with flakey latency. How could this be solved? Maybe constantly replicate the current PackageTimeStamp to the server while shooting?
;Accuracy: The current code seems to be pretty accurate, in tests I could hit reliable with pings up to 400. But still there might be inaccuracies so this should constantly be reviewed and ultimately it would be great to have some usefull debug functions, for example to show the hitbox or a client trace which checks weither you should have hit and then compares this to what the server says. There might be countless other improvements, but I think this is good for a start.

'''capt.k:'''  I made a similar implementation for my UT mod.  Haven't extensively tested this, so I dunno if it's any better or worse than what you've got above, but it's pretty much the same except for a couple things:  I got around subclassing controller or pawn by using an inventory item which is given to each respawning player to manage each LocationTrail list.  LocationTrail is an Actor, so it can now be destroyed on command, and in its Destroyed() it destroys the next link as well &amp;ndash; the idea is that it insures that all LocationTrails are eventually removed.  If the inventory item is destroyed, it destroys the head of the Trail list, and the head destroys all the children.  I also had the LocationTrails only spawed via a timer at intervals of 0.02.  Mainly for the sake of uniformity and so we know how many LocationTrails may exist at any given time (and to be consistent w/ Neil Toronto's implementation); again, I dunno if it's any better or worse, but I figure since the position is interpolated anyway, it's an acceptable tradeoff.  Unfortunately, I wasn't astute enough to come up with a way to pass the client's timestamp to determine how far back to rewind position to, so instead I just used the player's ping.  hth.

'''Spoon:''' 

In &quot;PredictedPawn&quot;, on the client side, &quot;Level.Game.GameReplicationInfo&quot; is &quot;None&quot; So on the client side you get an &quot;access none&quot; errors. To get rid of the errors, I just wrapped the code block with an &quot;if( ROLE == ROLE_Authority)&quot; so the client can not run the code.

note: I remove the other problem I was having due to a error on my part and not an error related to this code.

'''Xian:''' Well the code looks nice but those while (True) loops would look scary to me if I'd be a processor :) Regardless, I was wondering why you're not using Engine.PlayerController.GameReplicationInfo instead of Engine.GameInfo.GameReplicationInfo since the first is replicated on both the Server and Client, and there'd be no need to divide between replication Roles.

'''Graphik:''' A little tip for you, Xian: you may want to check the revision history on a page before you reply to something said in 2003. :) Spoon hasn't been around for a while.

'''Xian:''' I do, but there are people still reading this. And I am just trying to post for them :)

I for one didn't move from UE1 and don't plan to until UE3 is out. So I am still reading UT related stuff. It doesn't mean that just cos UT2004 is out people will not read 2003 related stuff.

==Related Topics ==
* [[Legacy:Lag Compensation|Lag Compensation]]

[http://www.planetquake.com/code3arena/tutorials/tutorial41.shtml Unlagged Tutorial] (A hit prediction implementation for Quake 3 Arena)</text>
    </revision>
    <revision>
      <id>3575</id>
      <timestamp>2006-04-11T13:52:17Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an Open Source implementation of the Hit Prediction for UT2003, which is explained at [[Legacy:Lag Compensation|Lag Compensation]].

Feel free to use and improve the code for whatever you want, but if you modify it, please let us know about the modifications.

I don't offer a download here because I don't think that the implementation is polished and &quot;foolproof&quot; enough yet.

This example implementation will use a modified Instagib gametype with only one modified gun.

==Sourcecode ==

To make the source managable, I will post it in chunks and not in one whole, with a discussion for each chunk.

===The LocationTrail class ===

&lt;uscript&gt;
class LocationTrail extends Object;

var float TimeStamp;
var vector Location;
var Rotator Rotation;
var LocationTrail Next;
&lt;/uscript&gt;

Simply a class to hold a trail node.

===The Game Replication class ===

&lt;uscript&gt;
class PredictionReplicationInfo extends GameReplicationInfo;

var float PackageTimeStamp; // Constantly replicated to the client to TimeStamp shot packages for prediction

replication
{
	reliable if ( bNetDirty &amp;&amp; (Role == ROLE_Authority) )
		PackageTimeStamp;
}


function Tick( float DeltaTime)
{
	PackageTimeStamp = Level.TimeSeconds;

	Super.Tick(DeltaTime);
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' See [[Legacy:Lag Compensation|lag compensation]] for a discussion why it's neccessary to replicate the servertime constantly. It might be desirable to find a better solution though...

===The Player class ===

&lt;uscript&gt;
class PredictedPlayer extends xPlayer;

event PlayerTick( float DeltaTime )
{
	Super.PlayerTick(DeltaTime);
	
	// Increase PackageTimeStamp for smooth interpolated hit prediction
	PredictionReplicationInfo(GameReplicationInfo).PackageTimeStamp += DeltaTime;
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' This is simply because a client will usually run at a higher FPS, so prediction isn't limited to the ~50ms steps of the server (a client will predict movement between those 50ms steps).

===The Pawn class ===

&lt;uscript&gt;
class PredictedPawn extends xPawn;

var LocationTrail LocationTrail;  // The actual trail of locations
var vector SavedLocation;         // Used to restore location after timeshifting
var Rotator SavedRotation;
var float SavedTimeStamp;
var float MaxTrailSeconds;        // How many seconds should be stored in trails


event Tick( float DeltaTime )
{
	local LocationTrail Trail;

	Super.Tick(DeltaTime);
	
	// Store the new position and rotation in a LocationTrail
	Trail = new (none) class'LocationTrail';
	Trail.Next = LocationTrail;
	LocationTrail = Trail;
	
	LocationTrail.Location = Location;
	LocationTrail.Rotation = Rotation;
	// Using the timestamp which was saved at roundbegin and will be sent to the client
	LocationTrail.TimeStamp = PredictionReplicationInfo(Level.Game.GameReplicationInfo).PackageTimeStamp;
	
	// Free outdated LocationTrails
	for ( Trail=LocationTrail; Trail!=None; Trail=Trail.next )
	{
		if ( Level.TimeSeconds - Trail.TimeStamp &gt; MaxTrailSeconds )
		{
			Trail.Next = None;
			break;
		}
	}
}

defaultproperties
{
	MaxTrailSeconds=0.4;
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' I'm not sure if Tick() is the best place to store the trails. But it works and is pretty simple. It might be smarter to do this directly after playermovement though, but I couldn't find a place to hook this in (there probably is none, because actor movement is native).

I use PackageTimeStamp for the timestamp because I wasn't sure weither ServerTime gets modified during a tick. It probably doesn't, in this case it would make no difference to use Level.ServerTime instead.

===The Weapon class ===

We need to modify each weapon that is supposed to be unlagged, so we need a new weaponclass. Should we need a lot of unlagged weapons, it would make sense to create a new baseclass but for this example there will be only one gun (a modified EnhancedShockrifle).

&lt;uscript&gt;
class PredictedShockRifle extends SuperShockRifle;

replication
{
    // functions called by client on server
    reliable if( Role&lt;ROLE_Authority )
        ServerPredictedStartFire;
}


//// client only ////
simulated event ClientStartFire(int Mode)
{
    if (Pawn(Owner).Controller.IsInState('GameEnded'))
        return;
        
    if (Role &lt; ROLE_Authority)
    {
        if (StartFire(Mode))
        {
			ServerPredictedStartFire( Mode, PredictionReplicationInfo(PlayerController(Instigator.Controller).GameReplicationInfo).PackageTimeStamp );
        }
    }
    else
    {
        StartFire(Mode);
    }
}

//// server only ////
event ServerPredictedStartFire(byte Mode, float ClientTimeStamp)
{
    if ( (FireMode[Mode].NextFireTime &lt;= Level.TimeSeconds + FireMode[Mode].PreFireTime)
		&amp;&amp; StartFire(Mode) )
    {
        FireMode[Mode].ServerStartFireTime = Level.TimeSeconds;
	PredictedShockBeamFire(FireMode[Mode]).ClientStartFireTime = ClientTimeStamp; // Stupid hack but it works as long as we can trust the FireMode property. Clean code would check if this really is a PredictedShockBeamFire.
        FireMode[Mode].bServerDelayStartFire = false;
    }
    else
        FireMode[Mode].bServerDelayStartFire = true;
}


defaultproperties
{
	FireModeClass(0)=PredictedShockBeamFire;
}
&lt;/uscript&gt;

====Discussion ====

'''Spark:''' I decided to create a new ServerStartFire function, so the timestamp can be transmitted. ClientStartFire is simply modified to call the new ServerStartFire.

===The WeaponFire class ===

This is a huge one, so I split it up in even smaller pieces.

&lt;uscript&gt;
class PredictedShockBeamFire extends SuperShockBeamFire;

// --- Prediction ---
var float ClientStartFireTime;	// This is the time the client actually started shooting

function DoTrace(Vector Start, Rotator Dir)
{
    local Vector X, End, HitLocation, HitNormal, RefNormal;
    local Actor Other;
    local int Damage;
    local bool bDoReflect;
    local int ReflectNum;

    ReflectNum = 0;
    while (true)
    {
        bDoReflect = false;
        X = Vector(Dir);
        End = Start + TraceRange * X;

		// *** HIT PREDICTION ***
		// Timeshift all pawns to make them match the clients reality (hopefully) before doing the trace
		if ( ClientStartFireTime &gt; 0 )
			TimeShiftPawns(ClientStartFireTime);

        Other = Trace(HitLocation, HitNormal, End, Start, true);

		// Revert all pawns to their original position
		if ( ClientStartFireTime &gt; 0 )
			UnShiftPawns();
			

        if ( Other != None &amp;&amp; (Other != Instigator || ReflectNum &gt; 0) )
        {
            if (bReflective &amp;&amp; Other.IsA('xPawn') &amp;&amp; xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25))
            {
                bDoReflect = true;
                HitNormal = Vect(0,0,0);
            }
            else if (!Other.bWorldGeometry)
            {
                Damage = (DamageMin + Rand(DamageMax - DamageMin)) * DamageAtten;
                Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType);
                HitNormal = Vect(0,0,0);
            }
            else if ( WeaponAttachment(Weapon.ThirdPersonActor) != None )
				WeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
        }
        else
        {
            HitLocation = End;
            HitNormal = Vect(0,0,0);
        }

		// Not here, we will do it clientside. :)
        // SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum);

        if (bDoReflect &amp;&amp; ++ReflectNum &lt; 4)
        {
            //Log(&quot;reflecting off&quot;@Other@Start@HitLocation);
            Start = HitLocation;
            Dir = Rotator(RefNormal); //Rotator( X - 2.0*RefNormal*(X dot RefNormal) );
        }
        else
        {
            break;
        }
    }
}
&lt;/uscript&gt;

The only important difference here is, that we timeshift all pawns before we do the hit detection trace. Thsi will get more clear later but it's really the most important thing and why we do all this in fact. This will do the hit detection in the timeframe the client saw when triggering the shot.

&lt;uscript&gt;
// Do the beameffect clientside
function DoClientTrace(Vector Start, Rotator Dir)
{
    local Vector X, End, HitLocation, HitNormal, RefNormal;
    local Actor Other;
    local bool bDoReflect;
    local int ReflectNum;

    ReflectNum = 0;
    while (true)
    {
        bDoReflect = false;
        X = Vector(Dir);
        End = Start + TraceRange * X;

        Other = Trace(HitLocation, HitNormal, End, Start, true);

        if ( Other != None &amp;&amp; (Other != Instigator || ReflectNum &gt; 0) )
        {
            if (bReflective &amp;&amp; Other.IsA('xPawn') &amp;&amp; xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25))
            {
                bDoReflect = true;
                HitNormal = Vect(0,0,0);
            }
            else if (!Other.bWorldGeometry)
            {
                HitNormal = Vect(0,0,0);
            }
        }
        else
        {
            HitLocation = End;
            HitNormal = Vect(0,0,0);
        }

        SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum);

        if (bDoReflect &amp;&amp; ++ReflectNum &lt; 4)
        {
            //Log(&quot;reflecting off&quot;@Other@Start@HitLocation);
            Start = HitLocation;
            Dir = Rotator(RefNormal); //Rotator( X - 2.0*RefNormal*(X dot RefNormal) );
        }
        else
        {
            break;
        }
    }
}

function DoClientFireEffect()
{                    
    local Vector StartTrace;
    local Rotator R, Aim;

    Instigator.MakeNoise(1.0);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Weapon.Owner.Location + Pawn(Weapon.Owner).EyePosition();
    Aim = AdjustAim(StartTrace, AimError);
	R = rotator(vector(Aim) + VRand()*FRand()*Spread);
    DoClientTrace(StartTrace, R);
}

event ModeDoFire()
{
	Super.ModeDoFire();
	
	// client
	if (Instigator.IsLocallyControlled())
	{
		DoClientFireEffect();
	}
}
&lt;/uscript&gt;

This will just render the shockbeam at the clientside. Not sure if it's the best way to do it, as it was just a quick hack to make it work.

&lt;uscript&gt;
// *** Hit Prediction Timeshifting Functions ***

function TimeShiftPawns(float TimeStamp)
{
	local Controller C;
	local PredictedPawn P;
	local LocationTrail CurrentTrail, LateTrail, OldTrail;
	local float interp;
	local vector LerpedLocation;
	local Rotator LerpedRotation;
	
	for ( C=Level.ControllerList; C!=None; C=C.NextController )
	{
		// Do not shift the attacker because she should already be where she was when she did the shot.
		if ( PredictedPawn(C.Pawn)!=None &amp;&amp; C.Pawn != Weapon.Owner )
			P = PredictedPawn(C.Pawn);
		else
			continue;
			
		LateTrail = None;
		OldTrail = None;
	
		// Find the sandwitching trail timestamps
		for ( CurrentTrail=P.LocationTrail; CurrentTrail!=None; CurrentTrail=CurrentTrail.Next )
		{
			if ( CurrentTrail.TimeStamp &gt; TimeStamp )
				LateTrail = CurrentTrail;
			else if ( OldTrail == None )
				OldTrail = CurrentTrail;
			else
				break;
		}
		
		if ( LateTrail != None &amp;&amp; OldTrail != None )
		{
			// Save original location
			P.SavedLocation = P.Location;
			P.SavedRotation = P.Rotation;
			P.SavedTimeStamp = Level.TimeSeconds;
		
			// Interpolate between closest trails and move pawn to this location
			// Find alpha value for interpolation based on timestamps
			interp = ( TimeStamp - OldTrail.TimeStamp ) / ( LateTrail.TimeStamp - OldTrail.TimeStamp ); 
			interp = FClamp( interp, 0, 1 );
			
			//Log(&quot;OldTimeStamp: &quot;$OldTrail.TimeStamp$&quot;, LateTimeStamp: &quot;$LateTrail.TimeStamp$&quot;, TimeStamp: &quot;$TimeStamp);
			//Log(&quot;Resulting Alpha: &quot;$interp); 
			
			LerpedLocation.X = Lerp( interp, OldTrail.Location.X, LateTrail.Location.X );
			LerpedLocation.Y = Lerp( interp, OldTrail.Location.Y, LateTrail.Location.Y );
			LerpedLocation.Z = Lerp( interp, OldTrail.Location.Z, LateTrail.Location.Z );
			
			//Log(&quot;OldLocation: &quot;$OldTrail.Location$&quot;, LateLocation: &quot;$LateTrail.Location$&quot;, LerpedLocation: &quot;$LerpedLocation);
			
			LerpedRotation.Pitch = Lerp( interp, OldTrail.Rotation.Pitch, LateTrail.Rotation.Pitch );
			LerpedRotation.Yaw = Lerp( interp, OldTrail.Rotation.Yaw, LateTrail.Rotation.Yaw );
			LerpedRotation.Roll = Lerp( interp, OldTrail.Rotation.Roll, LateTrail.Rotation.Roll );
			
			//Log(&quot;OldRotation: &quot;$OldTrail.Rotation$&quot;, LateRotation: &quot;$LateTrail.Rotation$&quot;, LerpedRotation: &quot;$LerpedRotation);
			
			P.SetLocation( LerpedLocation );
			P.SetRotation( LerpedRotation );
		}
		else if ( LateTrail != None )
		{
			// Save original location
			P.SavedLocation = P.Location;
			P.SavedRotation = P.Rotation;
			P.SavedTimeStamp = Level.TimeSeconds;
		
			// TimeStamp is out of reach, move pawn to latest trail
			P.SetLocation( LateTrail.Location );
			P.SetRotation( LateTrail.Rotation );
		}
	}
}

function UnShiftPawns()
{
	local Controller C;
	local PredictedPawn P;

	for ( C=Level.ControllerList; C!=None; C=C.NextController )
	{
		if ( PredictedPawn(C.Pawn)!=None &amp;&amp; C.Pawn != Weapon.Owner )
			P = PredictedPawn(C.Pawn);
		else
			continue;
	
		// Make sure that saved location is of this tick before moving
		if ( P.SavedTimeStamp == Level.TimeSeconds )
		{
			P.SetLocation( P.SavedLocation );
			P.SetRotation( P.SavedRotation );
		}
	}
}
&lt;/uscript&gt;

And last but not least the actual timeshifting functions (if more than one weapon is used, those should be moved to a new common base class if possible).

Finally you need a new Gametype or Mutator to replace the Pawn and PlayerController with out custom ones, use the new GameReplicationInfo class and make sure that only our Instagib rifle is used (a modified version of the Instagib mutator will do). I don't post this here because it's a rather common task.

===Discussion ===

'''Spark:''' That's it! I hope that those who actually use this code will actively help to improve the code, because a well working hit prediction could be quite important for mods trying to compete with the huge Counter-Strike (and for every other mod featuring hitscan weapons of course). It would be a pity if everyone would have to create this rather common functionality on his own, that's why I wrote this. Another cool thing would be a Mutator replacing all weapons with predicted counterparts that could be used for all basic gametypes. Maybe it would even be possible without subclassing Pawn and PlayerController, but I'm not sure.

Things that should be looked at and really need improvement are:
;Resetting the trails: If a player respawns or teleports, the trail should be resetted, otherwise the interpolation would move the pawn at a place he never visited. The chance that this leads to an accidental hit is basically null, that's why I didn't bother yet but it's certainly crack. :) Another thing is, that the trails should probably be cleaned after a pawn is destroyed (not sure if this is automatic).
;Rapid fire guns: Those guns in UT2003 only send StartFire and a StopFire signals, so with the above code, the ClientTimeStamp would also be replicated only once. This means that the ClientFireTime time has to be increased just like the ServerFireTime. This is not a problem (as long as you think of it), but it can lead to inaccuracies with flakey latency. How could this be solved? Maybe constantly replicate the current PackageTimeStamp to the server while shooting?
;Accuracy: The current code seems to be pretty accurate, in tests I could hit reliable with pings up to 400. But still there might be inaccuracies so this should constantly be reviewed and ultimately it would be great to have some usefull debug functions, for example to show the hitbox or a client trace which checks weither you should have hit and then compares this to what the server says. There might be countless other improvements, but I think this is good for a start.

'''capt.k:'''  I made a similar implementation for my UT mod.  Haven't extensively tested this, so I dunno if it's any better or worse than what you've got above, but it's pretty much the same except for a couple things:  I got around subclassing controller or pawn by using an inventory item which is given to each respawning player to manage each LocationTrail list.  LocationTrail is an Actor, so it can now be destroyed on command, and in its Destroyed() it destroys the next link as well &amp;ndash; the idea is that it insures that all LocationTrails are eventually removed.  If the inventory item is destroyed, it destroys the head of the Trail list, and the head destroys all the children.  I also had the LocationTrails only spawed via a timer at intervals of 0.02.  Mainly for the sake of uniformity and so we know how many LocationTrails may exist at any given time (and to be consistent w/ Neil Toronto's implementation); again, I dunno if it's any better or worse, but I figure since the position is interpolated anyway, it's an acceptable tradeoff.  Unfortunately, I wasn't astute enough to come up with a way to pass the client's timestamp to determine how far back to rewind position to, so instead I just used the player's ping.  hth.

'''Spoon:''' 

In &quot;PredictedPawn&quot;, on the client side, &quot;Level.Game.GameReplicationInfo&quot; is &quot;None&quot; So on the client side you get an &quot;access none&quot; errors. To get rid of the errors, I just wrapped the code block with an &quot;if( ROLE == ROLE_Authority)&quot; so the client can not run the code.

note: I remove the other problem I was having due to a error on my part and not an error related to this code.

'''Xian:''' Well the code looks nice but those while (True) loops would look scary to me if I'd be a processor :) Regardless, I was wondering why you're not using Engine.PlayerController.GameReplicationInfo instead of Engine.GameInfo.GameReplicationInfo since the first is replicated on both the Server and Client, and there'd be no need to divide between replication Roles.

'''Graphik:''' A little tip for you, Xian: you may want to check the revision history on a page before you reply to something said in 2003. :) Spoon hasn't been around for a while.

==Related Topics ==
* [[Legacy:Lag Compensation|Lag Compensation]]

[http://www.planetquake.com/code3arena/tutorials/tutorial41.shtml Unlagged Tutorial] (A hit prediction implementation for Quake 3 Arena)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HitScanBlockingVolume</title>
    <id>28491</id>
    <revision>
      <id>40192</id>
      <timestamp>2009-11-17T10:56:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hitscan Weapons</title>
    <id>1450</id>
    <revision>
      <id>3648</id>
      <timestamp>2008-02-06T22:02:32Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Work in progress!'''

This page is currently being created by [[Legacy:Computergod666|computergod666]]. You are free to add helpful content in any way if you want.

==Before reading this tutorial==

This tutorial assumes that you have already read the first tutorial, [[Legacy:Basic Weapon Class|Basic weapon class]]. If you haven't, it provides an analysis of the Fire and AltFire functions, animation, sound, and firing projectiles using TournamentWeapon.

==Projectiles vs. Hitscans==

When I first started scripting, I assumed that the ProjectileClass default property specified the kind of projectile that was fired, and that this was true for every UT weapon. So when I looked at the ShockRifle code, I was surprised to find that the ProjectileClass was the same as the AltProjectileClass! Everyone knows that the shock beam is not the same as the plasma grenade, so I went looking for an equivalent for ages. I was additionally confused by the absence of a ProjectileFire call in the ShockRifle code.

The mystery was explained by the TraceFire function. The Shock Rifle primary fire is an instant-hit attack instead of a projectile. Basically, a hitscan calculates a line between the player or bot who fired the weapon, finds the first actor that is in the way, and does whatever is supposed to happen when you shoot someone with it. For the Shock Rifle, it spawns a ShockBeam effect to make it look like there's a laser beam between the target and the player, it deals damage to the target, and spawns a ring explosion effect wherever the beam hits.

==Analysis of a typical TournamentWeapon hitscan call==

In the TournamentWeapon class, the Fire and AltFire functions support firing either a hitscan attack or a projectile, depending on how the variable bInstantHit is set:

&lt;uscript&gt;function Fire( float Value )
{
 if ( (AmmoType == None) &amp;&amp; (AmmoName != None) )
 {
  // ammocheck
  GiveAmmo(Pawn(Owner));
 }
 if ( AmmoType.UseAmmo(1) )
 {
  GotoState('NormalFire');
  bPointing=True;
  bCanClientFire = true;
  ClientFire(Value);
  if ( bRapidFire || (FiringSpeed &gt; 0) )
   Pawn(Owner).PlayRecoil(FiringSpeed);
  if ( bInstantHit )
   TraceFire(0.0);
  else
   ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget);
 }
}&lt;/uscript&gt;

If bInstantHit is true, the Fire function will call the TraceFire() function. If it is false, it will attempt to fire the ProjectileClass. Let's focus on TraceFire for now.

TraceFire() takes a single argument, which specifies the accuracy of the attack. Lower numbers mean higher accuracy. The following is a sample of the TraceFire code:

&lt;uscript&gt;function TraceFire( float Accuracy )
{
 local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z;
 local Actor Other;

 //Make sure that bots hear the weapon firing.
 Owner.MakeNoise(Pawn(Owner).SoundDampening);

 //Get three vectors corresponding to the player's axes:
 // X points forward, Y points right, and Z points up.
 GetAxes(Pawn(Owner).ViewRotation,X,Y,Z);
 //Calculate the coordinates for the beginning and end of the trace.
 StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.Y * Y + FireOffset.Z * Z; 
 EndTrace = StartTrace + Accuracy * (FRand() - 0.5 )* Y * 1000
		+ Accuracy * (FRand() - 0.5 ) * Z * 1000 ;

 //Adjust aim for bots.
 AdjustedAim = pawn(Owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False);	
 EndTrace += (10000 * vector(AdjustedAim)); 

 //Do the actual tracing!
 Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace);
 ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z);
}&lt;/uscript&gt;

This function only does the tracing. Then, it calls ProcessTraceHit() to do damage and effects.

 WORK IN PROGRESS</text>
    </revision>
    <revision>
      <id>3649</id>
      <timestamp>2008-02-06T22:00:53Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Work in progress!'''

This page is currently being created by [[Legacy:Computergod666|computergod666]]. You are free to add helpful content in any way if you want.

==Before reading this tutorial==

This tutorial assumes that you have already read the first tutorial, [[Legacy:Basic Weapon Class|Basic weapon class]]. If you haven't, it provides an analysis of the Fire and AltFire functions, animation, sound, and firing projectiles using TournamentWeapon.

==Projectiles vs. Hitscans==

When I first started scripting, I assumed that the ProjectileClass default property specified the kind of projectile that was fired, and that this was true for every UT weapon. So when I looked at the ShockRifle code, I was surprised to find that the ProjectileClass was the same as the AltProjectileClass! Everyone knows that the shock beam is not the same as the plasma grenade, so I went looking for an equivalent for ages. I was additionally confused by the absence of a ProjectileFire call in the ShockRifle code.

The mystery was explained by the TraceFire function. The Shock Rifle primary fire is an instant-hit attack instead of a projectile. Basically, a hitscan calculates a line between the player or bot who fired the weapon, finds the first actor that is in the way, and does whatever is supposed to happen when you shoot someone with it. For the Shock Rifle, it spawns a ShockBeam effect to make it look like there's a laser beam between the target and the player, it deals damage to the target, and spawns a ring explosion effect wherever the beam hits.

==Analysis of a typical TournamentWeapon hitscan call==

In the TournamentWeapon class, the Fire and AltFire functions support firing either a hitscan attack or a projectile, depending on how the variable bInstantHit is set:

&lt;uscript&gt;function Fire( float Value )
{
 if ( (AmmoType == None) &amp;&amp; (AmmoName != None) )
 {
  // ammocheck
  GiveAmmo(Pawn(Owner));
 }
 if ( AmmoType.UseAmmo(1) )
 {
  GotoState('NormalFire');
  bPointing=True;
  bCanClientFire = true;
  ClientFire(Value);
  if ( bRapidFire || (FiringSpeed &gt; 0) )
   Pawn(Owner).PlayRecoil(FiringSpeed);
  if ( bInstantHit )
   TraceFire(0.0);
  else
   ProjectileFire(ProjectileClass, ProjectileSpeed, bWarnTarget);
 }
}&lt;/uscript&gt;

If bInstantHit is true, the Fire function will call the TraceFire() function. If it is false, it will attempt to fire the ProjectileClass. Let's focus on TraceFire for now.

TraceFire() takes a single argument, which specifies the accuracy of the attack. Lower numbers mean higher accuracy. The following is a sample of the TraceFire code:

&lt;uscript&gt;function TraceFire( float Accuracy )
{
 local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z;
 local Actor Other;

 //Make sure that bots hear the weapon firing.
 Owner.MakeNoise(Pawn(Owner).SoundDampening);

 //Get three vectors which face to the right, up, and straight ahead from the player.
 GetAxes(Pawn(Owner).ViewRotation,X,Y,Z);
 //Calculate the coordinates for the beginning and end of the trace.
 StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.Y * Y + FireOffset.Z * Z; 
 EndTrace = StartTrace + Accuracy * (FRand() - 0.5 )* Y * 1000
		+ Accuracy * (FRand() - 0.5 ) * Z * 1000 ;

 //Adjust aim for bots.
 AdjustedAim = pawn(Owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False);	
 EndTrace += (10000 * vector(AdjustedAim)); 

 //Do the actual tracing!
 Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace);
 ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z);
}&lt;/uscript&gt;

This function only does the tracing. Then, it calls ProcessTraceHit() to do damage and effects.

 WORK IN PROGRESS</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HitscanSplash</title>
    <id>1446</id>
    <revision>
      <id>3642</id>
      <timestamp>2007-07-23T00:30:04Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I was asked by players on a server I frequent to do some balancing to the ZenCodersWeapons2004 weapons pack when I discovered that the weapons in that pack had some really obscene damage values and it was causing issues with players only using those weapons on the server.

One of the requests that was made was to add splash damage to the (hitscan) primary fire mode on the Zen Benelli Shotgun. Since I have yet to see a weapon in UT with this implemented I thought it would be a good experiment to try on my own. I quickly found the [[Legacy:Weapon_Mutator_Tutorial|Weapon_Mutator_Tutorial]] where presumably one creates a Minigun weapon that causes splash damage, but found that it didn't work, or at least not well, for my own purposes.

I then went about adapting the InstantFire class from the ShockRifle and using the MinigunHE tutorial as a base to produce a weapon that actually worked for the most part. The most difficult issue I encountered in creating this weapon is that when playing on a dedicated server, the explosive hit-effects I had set up would not appear when (a) a direct hit against enemy player pawns was scored (b) while on a dedicated server.

Although I'd already given the weapon a beam-effect to make the exact positioning of the trace apparent to the player, I didn't think it was appropriate not to have a hit-effect, especially given that the weapon was being specifically made/altered for a dedicated server. After trying many different approaches and completely failing to get the hit-effects to work under the specified conditions (it should be noted that the Shock Rifle also does not display hit-effects under these conditions), I hacked up a workaround by utilizing the emitter from the Lightning Gun. Since the Lightning Gun emitter (NewLightningBolt) always displays a certain portion of the texture it uses (XEffects.LightningBoltT) at both the start and endpoints, I figured if I changed the emitter to utilize a texture with an &quot;explosive&quot; effect at the end I could get at least a nominal &quot;hit-effect&quot; to work when a player gets a dead-on hit on an enemy pawn while playing on a dedicated server. This wasn't an ideal solution but it does work. Someone who is more ambitious about this could probably try a similar approach and tweak the emitter to make a much nicer visual effect than I bothered with.

Here is the finished class for the HitScan portion of the weapon. If you'd like to edit or clean up this code, feel free to. It is provided as-is as a simple example of a working hitscan firemode with a splash damage effect; I'm sure someone who wanted to put more effort into it could get it working better.

&lt;uscript&gt;
//This class is based off of InstantFire, and is in effect a blending of both the Lightning Gun &amp; Shock Rifle's primary fire classes.

class BShotgunPrimaryFire extends InstantFire;

var() class&lt;xEmitter&gt; HitEmitterClass;
var(tweak) float offsetadj;
var() class&lt;ShotgunBeamEffect&gt; BeamEffectClass;
var() class&lt;Actor&gt; ExplosionClass;
var() class&lt;Projector&gt; ExplosionDecalClass;
var float DamageRadius;
var float SplashDamage;
var float ReloadAnimDelay;

simulated function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShotgunBeamEffect Beam;

    Super.SpawnBeamEffect( Start, Dir, HitLocation, HitNormal, ReflectNum);

    if (Weapon != None)
    {
        Beam = Weapon.Spawn(BeamEffectClass,,, Start, Dir);
        if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
            Beam.AimAt(HitLocation, HitNormal);
    }

    Explode( HitLocation, HitNormal );
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
    if ( Instigator.EffectIsRelevant(HitLocation,false) )

    {
        Spawn(ExplosionClass,,,HitLocation + HitNormal*16,rotator(HitNormal));
    }

    BlowUp(HitLocation);
}

function BlowUp(vector HitLocation)
{
    Weapon.HurtRadius(SplashDamage, DamageRadius, DamageType, Momentum, HitLocation ); //Splashdamage=55
}

function DoTrace(Vector Start, Rotator Dir)
{
    local Vector X,Y,Z, End, HitLocation, HitNormal, RefNormal;
    local Actor Other; //mainArcHitTarget;
    local int Damage;
    local bool bDoReflect;
    local xEmitter hitEmitter;
    local class&lt;Actor&gt; tmpHitEmitClass;
    local float tmpTraceRange;
    local vector arcEnd; //mainArcHit;
    local vector EffectOffset;
    local int ReflectNum;

    ReflectNum=0;

    if ( class'PlayerController'.Default.bSmallWeapons )
        EffectOffset = Weapon.SmallEffectOffset;
    else
        EffectOffset = Weapon.EffectOffset;

    Weapon.GetViewAxes(X, Y, Z);
    if ( Weapon.WeaponCentered() )
        arcEnd = (Instigator.Location +
            EffectOffset.Z * Z);
    else if ( Weapon.Hand == 0 )
    {
        if ( class'PlayerController'.Default.bSmallWeapons )
            arcEnd = (Instigator.Location +
                EffectOffset.X * X);
        else
            arcEnd = (Instigator.Location +
                EffectOffset.X * X
                - 0.5 * EffectOffset.Z * Z);
    }
    else
        arcEnd = (Instigator.Location +
            Instigator.CalcDrawOffset(Weapon) +
            EffectOffset.X * X +
            Weapon.Hand * EffectOffset.Y * Y +
            EffectOffset.Z * Z);

    tmpHitEmitClass = HitEmitterClass;
    tmpTraceRange = TraceRange;

    while (true)
    {
        bDoReflect = false;
        X = Vector(Dir);
        End = Start + TraceRange * X;

        Other = Trace(HitLocation, HitNormal, End, Start, true);

        if ( Other != None &amp;&amp; (Other != Instigator || ReflectNum &gt; 0) )
        {
            if (bReflective &amp;&amp; Other.IsA('xPawn') &amp;&amp; xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25))
            {
                bDoReflect = false;
                HitNormal = Vect(0,0,0);
            }
            else if (!Other.bWorldGeometry)
            {
                Damage = (DamageMin + Rand(DamageMax - DamageMin)) * DamageAtten;
                Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType); //Hit
                HitNormal = Vect(0,0,0);
            }
            else if ( WeaponAttachment(Weapon.ThirdPersonActor) != None )
				WeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
        }
        else
        {
            HitLocation = End;
            HitNormal = Vect(0,0,0);
        }
        
        SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum);

        if ( Weapon == None )
            return;
        hitEmitter = xEmitter(Weapon.Spawn(tmpHitEmitClass,,, arcEnd, Rotator(HitNormal)));
        if ( hitEmitter != None )
            hitEmitter.mSpawnVecA = HitLocation;
        if ( HitScanBlockingVolume(Other) != None )
            return;

        else
        {
            break;
        }
    }
}

//This function is not critical to the functioning of the splash damage on the hitscan weapon
function PlayFiring()
{
    Super.PlayFiring();
    
    if ( Weapon.AmmoAmount(0) &gt; 0 )
        Weapon.PlayOwnedSound(Sound'WeaponSounds.BReload9', SLOT_Misc,,,,1.1,false);

    if (Weapon.HasAnim(ReloadAnim))
    {
	   SetTimer(ReloadAnimDelay, false);
    }
}


//This function is not critical to the functioning of the splash damage on the hitscan weapon
function Timer()
{
	if (Weapon.ClientState == WS_ReadyToFire &amp;&amp; Instigator !=None &amp;&amp; UnrealPlayer(Weapon.Instigator.controller) != None)
	{
	    if (UnrealPlayer(Weapon.Instigator.controller) != None &amp;&amp; level.TimeSeconds - UnrealPlayer(Weapon.Instigator.controller).LastKillTime &lt; 1)
	    {
    		Weapon.PlayAnim(ReloadAnim, ReloadAnimRate, TweenTime);
    		ClientPlayForceFeedback(ReloadForce);
	    }
	}
}

defaultproperties
{
    AmmoClass=Class'BenelliAmmo'
    DamageType=Class'DamTypeShotgunShell'
    HitEmitterClass=class'NewShotgunBolt'
    FireSound=Sound'ZWeaponsSnd.m3-1'
    FireForce=&quot;NewSniperShot&quot;  // jdf

    BeamEffectClass=class'ShotgunBeamEffect' //Tracer beam created along the trace path
    ExplosionClass=class'ONSGrenadeExplosionEffect'
    ExplosionDecalClass=class'RocketMark'

    DamageMin=8
    DamageMax=10

    SplashDamage=55
    DamageRadius=192.000 //Values smaller than roughly 96 here may not be noticeable in game.

    AmmoPerFire=1
    TraceRange=10240
    Momentum=+30000.000
    FireRate=1.0
    FireAnimRate=1.25

    BotRefireRate=0.4
    AimError=850
    WarnTargetPct=+0.5

    ShakeOffsetMag=(X=-15.0,Y=0.0,Z=10.0)
    ShakeOffsetRate=(X=-4000.0,Y=0.0,Z=4000.0)
    ShakeOffsetTime=3.2
    ShakeRotMag=(X=0.5,Y=0.0,Z=0.0)
    ShakeRotRate=(X=-4000.0,Y=0.0,Z=0.0)
    ShakeRotTime=2
    
    ReloadAnimDelay=0.400000
    ReloadAnim=&quot;AltFire&quot;
    ReloadAnimRate=0.700000
}
&lt;/uscript&gt;

The primary fire class also references the following class, which is a modified ShockRifleBeam class. This class is responsible for creating the &quot;explosion&quot; effect visible where the primary fire trace hits. (Note that the explosion effect does not seem to spawn if the primary fire scores a hit on a pawn.)

&lt;uscript&gt;
class ShotgunBeamEffect extends ShockBeamEffect;

simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc)
{
    Spawn(class'RocketMark',,, EffectLoc, Rotator(-HitNormal));
    Spawn(class'ONSGrenadeExplosionEffect',,, EffectLoc, Rotator(-HitNormal));
    Spawn(class'RocketSmokeRing',,, EffectLoc, Rotator(HitNormal));
}

simulated function SpawnEffects()
{
    local xWeaponAttachment Attachment;

    if (Instigator != None)
    {
        if ( Instigator.IsFirstPerson() )
        {
            if ( (Instigator.Weapon != None) &amp;&amp; (Instigator.Weapon.Instigator == Instigator) )
                SetLocation(Instigator.Weapon.GetEffectStart());
            else
                SetLocation(Instigator.Location);
            Spawn(MuzFlashClass,,, Location);
        }
        else
        {
            Attachment = xPawn(Instigator).WeaponAttachment;
            if (Attachment != None &amp;&amp; (Level.TimeSeconds - Attachment.LastRenderTime) &lt; 1)
                SetLocation(Attachment.GetTipLocation());
            else
                SetLocation(Instigator.Location + Instigator.EyeHeight*Vect(0,0,1) + Normal(mSpawnVecA - Instigator.Location) * 25.0);
            Spawn(MuzFlash3Class);
        }
    }

    if ( EffectIsRelevant(mSpawnVecA + HitNormal*2,false) &amp;&amp; (HitNormal != Vect(0,0,0)) )
        SpawnImpactEffects(Rotator(HitNormal),mSpawnVecA + HitNormal*2);
}

defaultproperties
{
    RemoteRole=ROLE_SimulatedProxy
    bReplicateInstigator=true
    bReplicateMovement=false
    bNetTemporary=true
    LifeSpan=0.75
    NetPriority=3.0

    mParticleType=PT_Beam
    mStartParticles=1
    mAttenKa=0.1
    mSizeRange(0)=18.0 //24
    mSizeRange(1)=36.0 //48
    mRegenDist=150.0
    mLifeRange(0)=0.75
    mColorRange(0)=(B=0)
    mColorRange(1)=(B=0)
    mMaxParticles=3

    CoilClass=none
    MuzFlashClass=none
    MuzFlash3Class=none
    Texture=Texture'ShockBeamTex'
    Skins(0)=Texture'ShockBeamTex'
    Style=STY_Additive
    bUnlit=true
}
&lt;/uscript&gt;

-'Truncated for now. Going to think about how to link this together with the MinigunHE stuff, since the aim of my project here and the MinigunHE are very similar.'-

'''MythOpus:''' Doesn't the flak cannon and rocket launcher of splash damage?

'''Wail:''' I don't understand your question. The Flak Cannon and Rocket Launcher have splash damage, but neither of those weapons have hitscan firing modes (Enforcers/ARs, Shock primary, Minigun, Sniper/LtG). This code is intended to allow you to have an Area-of-Effect/Splash-Damage explosion at the point of impact of an instant-hit trace.

'''MythOpus:''' Thanks for clearing that up.  :)</text>
    </revision>
    <revision>
      <id>3643</id>
      <timestamp>2007-07-22T15:18:27Z</timestamp>
      <contributor>
        <ip>Wail</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I was asked by players on a server I frequent to do some balancing to the ZenCodersWeapons2004 weapons pack when I discovered that the weapons in that pack had some really obscene damage values and it was causing issues with players only using those weapons on the server.

One of the requests that was made was to add splash damage to the (hitscan) primary fire mode on the Zen Benelli Shotgun. Since I have yet to see a weapon in UT with this implemented I thought it would be a good experiment to try on my own. I quickly found the [[Legacy:Weapon_Mutator_Tutorial|Weapon_Mutator_Tutorial]] where presumably one creates a Minigun weapon that causes splash damage, but found that it didn't work, or at least not well, for my own purposes.

I then went about adapting the InstantFire class from the ShockRifle and using the MinigunHE tutorial as a base to produce a weapon that actually worked for the most part. The most difficult issue I encountered in creating this weapon is that when playing on a dedicated server, the explosive hit-effects I had set up would not appear when (a) a direct hit against enemy player pawns was scored (b) while on a dedicated server.

Although I'd already given the weapon a beam-effect to make the exact positioning of the trace apparent to the player, I didn't think it was appropriate not to have a hit-effect, especially given that the weapon was being specifically made/altered for a dedicated server. After trying many different approaches and completely failing to get the hit-effects to work under the specified conditions (it should be noted that the Shock Rifle also does not display hit-effects under these conditions), I hacked up a workaround by utilizing the emitter from the Lightning Gun. Since the Lightning Gun emitter (NewLightningBolt) always displays a certain portion of the texture it uses (XEffects.LightningBoltT) at both the start and endpoints, I figured if I changed the emitter to utilize a texture with an &quot;explosive&quot; effect at the end I could get at least a nominal &quot;hit-effect&quot; to work when a player gets a dead-on hit on an enemy pawn while playing on a dedicated server. This wasn't an ideal solution but it does work. Someone who is more ambitious about this could probably try a similar approach and tweak the emitter to make a much nicer visual effect than I bothered with.

Here is the finished class for the HitScan portion of the weapon. If you'd like to edit or clean up this code, feel free to. It is provided as-is as a simple example of a working hitscan firemode with a splash damage effect; I'm sure someone who wanted to put more effort into it could get it working better.

&lt;uscript&gt;
//This class is based off of InstantFire, and is in effect a blending of both the Lightning Gun &amp; Shock Rifle's primary fire classes.

class BShotgunPrimaryFire extends InstantFire;

var() class&lt;xEmitter&gt; HitEmitterClass;
var(tweak) float offsetadj;
var() class&lt;ShotgunBeamEffect&gt; BeamEffectClass;
var() class&lt;Actor&gt; ExplosionClass;
var() class&lt;Projector&gt; ExplosionDecalClass;
var float DamageRadius;
var float SplashDamage;
var float ReloadAnimDelay;

simulated function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShotgunBeamEffect Beam;

    Super.SpawnBeamEffect( Start, Dir, HitLocation, HitNormal, ReflectNum);

    if (Weapon != None)
    {
        Beam = Weapon.Spawn(BeamEffectClass,,, Start, Dir);
        if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
            Beam.AimAt(HitLocation, HitNormal);
    }

    Explode( HitLocation, HitNormal );
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
    if ( Instigator.EffectIsRelevant(HitLocation,false) )

    {
        Spawn(ExplosionClass,,,HitLocation + HitNormal*16,rotator(HitNormal));
    }

    BlowUp(HitLocation);
}

function BlowUp(vector HitLocation)
{
    Weapon.HurtRadius(SplashDamage, DamageRadius, DamageType, Momentum, HitLocation ); //Splashdamage=55
}

function DoTrace(Vector Start, Rotator Dir)
{
    local Vector X,Y,Z, End, HitLocation, HitNormal, RefNormal;
    local Actor Other; //mainArcHitTarget;
    local int Damage;
    local bool bDoReflect;
    local xEmitter hitEmitter;
    local class&lt;Actor&gt; tmpHitEmitClass;
    local float tmpTraceRange;
    local vector arcEnd; //mainArcHit;
    local vector EffectOffset;
    local int ReflectNum;

    ReflectNum=0;

    if ( class'PlayerController'.Default.bSmallWeapons )
        EffectOffset = Weapon.SmallEffectOffset;
    else
        EffectOffset = Weapon.EffectOffset;

    Weapon.GetViewAxes(X, Y, Z);
    if ( Weapon.WeaponCentered() )
        arcEnd = (Instigator.Location +
            EffectOffset.Z * Z);
    else if ( Weapon.Hand == 0 )
    {
        if ( class'PlayerController'.Default.bSmallWeapons )
            arcEnd = (Instigator.Location +
                EffectOffset.X * X);
        else
            arcEnd = (Instigator.Location +
                EffectOffset.X * X
                - 0.5 * EffectOffset.Z * Z);
    }
    else
        arcEnd = (Instigator.Location +
            Instigator.CalcDrawOffset(Weapon) +
            EffectOffset.X * X +
            Weapon.Hand * EffectOffset.Y * Y +
            EffectOffset.Z * Z);

    tmpHitEmitClass = HitEmitterClass;
    tmpTraceRange = TraceRange;

    while (true)
    {
        bDoReflect = false;
        X = Vector(Dir);
        End = Start + TraceRange * X;

        Other = Trace(HitLocation, HitNormal, End, Start, true);

        if ( Other != None &amp;&amp; (Other != Instigator || ReflectNum &gt; 0) )
        {
            if (bReflective &amp;&amp; Other.IsA('xPawn') &amp;&amp; xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25))
            {
                bDoReflect = false;
                HitNormal = Vect(0,0,0);
            }
            else if (!Other.bWorldGeometry)
            {
                Damage = (DamageMin + Rand(DamageMax - DamageMin)) * DamageAtten;
                Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType); //Hit
                HitNormal = Vect(0,0,0);
            }
            else if ( WeaponAttachment(Weapon.ThirdPersonActor) != None )
				WeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
        }
        else
        {
            HitLocation = End;
            HitNormal = Vect(0,0,0);
        }
        
        SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum);

        if ( Weapon == None )
            return;
        hitEmitter = xEmitter(Weapon.Spawn(tmpHitEmitClass,,, arcEnd, Rotator(HitNormal)));
        if ( hitEmitter != None )
            hitEmitter.mSpawnVecA = HitLocation;
        if ( HitScanBlockingVolume(Other) != None )
            return;

        else
        {
            break;
        }
    }
}

//This function is not critical to the functioning of the splash damage on the hitscan weapon
function PlayFiring()
{
    Super.PlayFiring();
    
    if ( Weapon.AmmoAmount(0) &gt; 0 )
        Weapon.PlayOwnedSound(Sound'WeaponSounds.BReload9', SLOT_Misc,,,,1.1,false);

    if (Weapon.HasAnim(ReloadAnim))
    {
	   SetTimer(ReloadAnimDelay, false);
    }
}


//This function is not critical to the functioning of the splash damage on the hitscan weapon
function Timer()
{
	if (Weapon.ClientState == WS_ReadyToFire &amp;&amp; Instigator !=None &amp;&amp; UnrealPlayer(Weapon.Instigator.controller) != None)
	{
	    if (UnrealPlayer(Weapon.Instigator.controller) != None &amp;&amp; level.TimeSeconds - UnrealPlayer(Weapon.Instigator.controller).LastKillTime &lt; 1)
	    {
    		Weapon.PlayAnim(ReloadAnim, ReloadAnimRate, TweenTime);
    		ClientPlayForceFeedback(ReloadForce);
	    }
	}
}

defaultproperties
{
    AmmoClass=Class'BenelliAmmo'
    DamageType=Class'DamTypeShotgunShell'
    HitEmitterClass=class'NewShotgunBolt'
    FireSound=Sound'ZWeaponsSnd.m3-1'
    FireForce=&quot;NewSniperShot&quot;  // jdf

    BeamEffectClass=class'ShotgunBeamEffect' //Tracer beam created along the trace path
    ExplosionClass=class'ONSGrenadeExplosionEffect'
    ExplosionDecalClass=class'RocketMark'

    DamageMin=8
    DamageMax=10

    SplashDamage=55
    DamageRadius=192.000 //Values smaller than roughly 96 here may not be noticeable in game.

    AmmoPerFire=1
    TraceRange=10240
    Momentum=+30000.000
    FireRate=1.0
    FireAnimRate=1.25

    BotRefireRate=0.4
    AimError=850
    WarnTargetPct=+0.5

    ShakeOffsetMag=(X=-15.0,Y=0.0,Z=10.0)
    ShakeOffsetRate=(X=-4000.0,Y=0.0,Z=4000.0)
    ShakeOffsetTime=3.2
    ShakeRotMag=(X=0.5,Y=0.0,Z=0.0)
    ShakeRotRate=(X=-4000.0,Y=0.0,Z=0.0)
    ShakeRotTime=2
    
    ReloadAnimDelay=0.400000
    ReloadAnim=&quot;AltFire&quot;
    ReloadAnimRate=0.700000
}
&lt;/uscript&gt;

The primary fire class also references the following class, which is a modified ShockRifleBeam class. This class is responsible for creating the &quot;explosion&quot; effect visible where the primary fire trace hits. (Note that the explosion effect does not seem to spawn if the primary fire scores a hit on a pawn.)

&lt;uscript&gt;
class ShotgunBeamEffect extends ShockBeamEffect;

simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc)
{
    Spawn(class'RocketMark',,, EffectLoc, Rotator(-HitNormal));
    Spawn(class'ONSGrenadeExplosionEffect',,, EffectLoc, Rotator(-HitNormal));
    Spawn(class'RocketSmokeRing',,, EffectLoc, Rotator(HitNormal));
}

simulated function SpawnEffects()
{
    local xWeaponAttachment Attachment;

    if (Instigator != None)
    {
        if ( Instigator.IsFirstPerson() )
        {
            if ( (Instigator.Weapon != None) &amp;&amp; (Instigator.Weapon.Instigator == Instigator) )
                SetLocation(Instigator.Weapon.GetEffectStart());
            else
                SetLocation(Instigator.Location);
            Spawn(MuzFlashClass,,, Location);
        }
        else
        {
            Attachment = xPawn(Instigator).WeaponAttachment;
            if (Attachment != None &amp;&amp; (Level.TimeSeconds - Attachment.LastRenderTime) &lt; 1)
                SetLocation(Attachment.GetTipLocation());
            else
                SetLocation(Instigator.Location + Instigator.EyeHeight*Vect(0,0,1) + Normal(mSpawnVecA - Instigator.Location) * 25.0);
            Spawn(MuzFlash3Class);
        }
    }

    if ( EffectIsRelevant(mSpawnVecA + HitNormal*2,false) &amp;&amp; (HitNormal != Vect(0,0,0)) )
        SpawnImpactEffects(Rotator(HitNormal),mSpawnVecA + HitNormal*2);
}

defaultproperties
{
    RemoteRole=ROLE_SimulatedProxy
    bReplicateInstigator=true
    bReplicateMovement=false
    bNetTemporary=true
    LifeSpan=0.75
    NetPriority=3.0

    mParticleType=PT_Beam
    mStartParticles=1
    mAttenKa=0.1
    mSizeRange(0)=18.0 //24
    mSizeRange(1)=36.0 //48
    mRegenDist=150.0
    mLifeRange(0)=0.75
    mColorRange(0)=(B=0)
    mColorRange(1)=(B=0)
    mMaxParticles=3

    CoilClass=none
    MuzFlashClass=none
    MuzFlash3Class=none
    Texture=Texture'ShockBeamTex'
    Skins(0)=Texture'ShockBeamTex'
    Style=STY_Additive
    bUnlit=true
}
&lt;/uscript&gt;

-'Truncated for now. Going to think about how to link this together with the MinigunHE stuff, since the aim of my project here and the MinigunHE are very similar.'-

'''MythOpus:''' Doesn't the flak cannon and rocket launcher of splash damage?

'''Wail:''' I don't understand your question. The Flak Cannon and Rocket Launcher have splash damage, but neither of those weapons have hitscan firing modes (Enforcers/ARs, Shock primary, Minigun, Sniper/LtG). This code is intended to allow you to have an Area-of-Effect/Splash-Damage explosion at the point of impact of an instant-hit trace.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HoldObjective</title>
    <id>1444</id>
    <revision>
      <id>3638</id>
      <timestamp>2007-07-08T01:58:34Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:ProximityObjective|ProximityObjective]] &gt;&gt; HoldObjective}}

==General==

The HoldObjective actor is used in the [[Legacy:Assault|Assault]] gametype.  General setup is the same as other objectives; However, to disable it, it must receive the event that matches its tag.  This usually occurs when a door or gate is opened.  This is done by setting the HoldObjective's MoverTag to the appropriate [[Legacy:Mover|mover]]'s tag then setting that [[Legacy:Mover|mover]]'s event to match the HoldObjective's tag.  The time it takes to complete the objective is determined by the [[Legacy:Mover|mover]]'s MoveTime.

If this setup is done properly, several things will occur when a player is in the collision radius of the HoldObjective actor.  Firstly, the appropriate mover will begin to move.  Second, the bars around the circle in front of the objective instructions at the top of the screen will begin to go away.  As this is happening, a siren alerts players that is being held.  When the [[Legacy:Mover|mover]] is done moving, the objective is complete.  At which point the HoldObjectives event is sent and the next [[Legacy:GameObjective|GameObjective]] in the list is enabled.

'''Note:''' The sound effects for the siren cannot be changed through the [[Legacy:Default Properties|Default Properties]] however, it can be changed by if you [[Legacy:Create A Subclass|create a subclass]] and override the appropriate function.

==Specific Properties==
*bLocationFx
*MoverTag

Associates a mover with the HoldObjective.  See above.

==Relevant Actors==
*See [[Legacy:GameObjective|GameObjective]]

==Discussion==</text>
    </revision>
    <revision>
      <id>3639</id>
      <timestamp>2007-06-26T07:13:32Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Response for Kirk.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:ProximityObjective|ProximityObjective]] &gt;&gt; HoldObjective}}

==General==

The HoldObjective actor is used in the [[Legacy:Assault|Assault]] gametype.  General setup is the same as other objectives; however, to disable it, it must receive the event that matches its tag.  This usually occurs when a door or gate is opened.  This is done by setting the HoldObjective's Properties&gt;HoldObjective&gt;MoverTag to the appropriate mover's tag, then setting that mover's event to match the HoldObjective's tag.  The time it takes to complete the objective is determined by the mover's movetime.

If this setup is done properly, several things will happen when a player is in the collision radius of the HoldObjective actor.  First, the appropriate mover will begin to move.  Second, the bars around the circle in front of the objective instructions at the top of the screen will begin to go away.  When none are left, the objective is complete.  Third, a siren will go off.  Fourth, when the objective is complete, its event will be sent out and the next objective will become active.

'''Kirk:''' I don't see anything in the Assault section that allows me to change the siren sound...

'''MythOpus:''' Thats because its hardcoded into the script.  Also, HoldObjective isn't strictly for Assault (its in UnrealGame.u...) so it wouldn't be in the Assault tab anyways.  The code sets the ambient sound to &quot;GameSounds.CTFAlarm&quot; and the only way to change this would be to subclass it and override the CheckPlayCriticalAlarm function which is defined in GameObjective class.  I'ved changed the description.

==Specific Properties==
*bLocationFx
*MoverTag

Associates a mover with the HoldObjective.  See above.

==Relevant Actors==
*See [[Legacy:GameObjective|GameObjective]]

==Discussion==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HoldSpot</title>
    <id>28477</id>
    <revision>
      <id>40178</id>
      <timestamp>2009-11-17T10:54:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Holes In Fluid Surfaces</title>
    <id>1435</id>
    <revision>
      <id>3623</id>
      <timestamp>2005-08-17T09:12:40Z</timestamp>
      <contributor>
        <ip>King Mango</ip>
      </contributor>
      <comment>Added info on xProc versus FSI</comment>
      <text xml:space="preserve">Putting &quot;holes&quot; in a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]

mkay, assuming u've already placed everything where it needs to be, this is probably the best method for carving holes in you FSI (fluidsurfaceinfo).  And this is of course only 1 of many ways to do this.  For the example i'm just using this quick example map 

[[Image:Legacy_fluidsurfacealpha1.jpeg|center|]]

 UED won't let me up the detail of the FSI atm, and i don't feel like restarting :p.  

In the top viewport, zoom in/out and pan so u get the FSI just about in the middle, but make sure you can see the whole FSI in the viewport. now hit &quot;Print Screen&quot; on the keyboard.  now open your 2d program of choice, and open your texture you'll be using for the water (assuming your using a custom texture, if not you can just make the alpha texture, then apply as an opacity mask later).  I'll be using photoshop 7.  Create a new layer and Ctrl + V (paste), which should paste in your top view that you took w/ the printscreen button.  Now carefully select the OUTLINE of the FSI. Then resize it so it's flush w/ the canvas 

[[Image:Legacy_fluidsurfacealpha2.jpeg|center|]]

Create a new layer, and paint the parts you want to be invisible PURE black, and the parts you want to be completely visible PURE white, and anything you want semi-visible, paint a shade of gray (darker = more transparent). Now make sure this is all on one layer, press ctrl + A (select all), and then Ctrl + C (copy). 

[[Image:Legacy_fluidsurfacealpha3.jpeg|center|]]

I made the 2nd ring partially visible w/ some noise to give it a slight variance in opacity, and the inner ring &amp; outside completely invisible. Now find the Channels tab/menu, and add Alpha Channel, then Ctrl + V (paste) it in there. Go back to the Layers tab/menu and delete all the extra layers except for the base texture, 

[[Image:Legacy_fluidsurfacealpha4.jpeg|center|]]

then save it out as dds (or other supported format w/ alpha channels), and make sure Alpha Channels are on when you save it out.  Then go back into UED, open texture browser, File / import, find the texture you saved, setup the packages etc. (use myLevel for package if you don't want to save a custom package), and check &quot;Alpha&quot;, and it should look something like this after you apply it: 

[[Image:Legacy_fluidsurfacealpha5.jpeg|center|]]

(also, make sure you have tiling set to 1 on the FSI).  Forgive me if I forgot or got anything wrong, this is my first tut, and I'm sure someone could &amp; has done a tutorial about this better than me, but hopefully this helped someone at least ;-)  feel free to edit/fix nething.

==comments==

those screenshots could be a bit smaller &amp;ndash; they take a very long time to load.

'''''WheatPuppet:''''' A question: wouldn't that cause a player moving close to the pool to cause the water to ripple, even though he appeared not to be interacting with the water?

'''''Mosquito:''''' not if you clap thingy the fluid surface, its kinda a late and I can't remember to well, but with terrains you can make the fluid surface collide with solid objects.

'''''JudasKing:''''' yes it does unfortunately, I also forgot to mention (even though it's probably assumed) that even though you can't see certain areas of the water that are invisible because of the opacity mask on it, it's still rendered, so i wouldn't recommend doing this if you have huge gaping areas that need to be invisible, because it will still eat up mem.  I don't think the clamping terrain would fix the problem of karma ripples, it clamps the vertices, which wouldn't do much good since the vertices are outside the ring.

'''''King Mango''''' Using a third party app to model a custom sheet mesh is the best way for complex shapes of water. Then set this to an xProc mesh

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3624</id>
      <timestamp>2004-05-12T00:47:17Z</timestamp>
      <contributor>
        <ip>H0080adc133f0.ne.client2.attbi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Putting &quot;holes&quot; in a [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]

mkay, assuming u've already placed everything where it needs to be, this is probably the best method for carving holes in you FSI (fluidsurfaceinfo).  And this is of course only 1 of many ways to do this.  For the example i'm just using this quick example map 

[[Image:Legacy_fluidsurfacealpha1.jpeg|center|]]

 UED won't let me up the detail of the FSI atm, and i don't feel like restarting :p.  

In the top viewport, zoom in/out and pan so u get the FSI just about in the middle, but make sure you can see the whole FSI in the viewport. now hit &quot;Print Screen&quot; on the keyboard.  now open your 2d program of choice, and open your texture you'll be using for the water (assuming your using a custom texture, if not you can just make the alpha texture, then apply as an opacity mask later).  I'll be using photoshop 7.  Create a new layer and Ctrl + V (paste), which should paste in your top view that you took w/ the printscreen button.  Now carefully select the OUTLINE of the FSI. Then resize it so it's flush w/ the canvas 

[[Image:Legacy_fluidsurfacealpha2.jpeg|center|]]

Create a new layer, and paint the parts you want to be invisible PURE black, and the parts you want to be completely visible PURE white, and anything you want semi-visible, paint a shade of gray (darker = more transparent). Now make sure this is all on one layer, press ctrl + A (select all), and then Ctrl + C (copy). 

[[Image:Legacy_fluidsurfacealpha3.jpeg|center|]]

I made the 2nd ring partially visible w/ some noise to give it a slight variance in opacity, and the inner ring &amp; outside completely invisible. Now find the Channels tab/menu, and add Alpha Channel, then Ctrl + V (paste) it in there. Go back to the Layers tab/menu and delete all the extra layers except for the base texture, 

[[Image:Legacy_fluidsurfacealpha4.jpeg|center|]]

then save it out as dds (or other supported format w/ alpha channels), and make sure Alpha Channels are on when you save it out.  Then go back into UED, open texture browser, File / import, find the texture you saved, setup the packages etc. (use myLevel for package if you don't want to save a custom package), and check &quot;Alpha&quot;, and it should look something like this after you apply it: 

[[Image:Legacy_fluidsurfacealpha5.jpeg|center|]]

(also, make sure you have tiling set to 1 on the FSI).  Forgive me if I forgot or got anything wrong, this is my first tut, and I'm sure someone could &amp; has done a tutorial about this better than me, but hopefully this helped someone at least ;-)  feel free to edit/fix nething.

==comments==

those screenshots could be a bit smaller &amp;ndash; they take a very long time to load.

'''''WheatPuppet:''''' A question: wouldn't that cause a player moving close to the pool to cause the water to ripple, even though he appeared not to be interacting with the water?

'''''Mosquito:''''' not if you clap thingy the fluid surface, its kinda a late and I can't remember to well, but with terrains you can make the fluid surface collide with solid objects.

'''''JudasKing:''''' yes it does unfortunately, I also forgot to mention (even though it's probably assumed) that even though you can't see certain areas of the water that are invisible because of the opacity mask on it, it's still rendered, so i wouldn't recommend doing this if you have huge gaping areas that need to be invisible, because it will still eat up mem.  I don't think the clamping terrain would fix the problem of karma ripples, it clamps the vertices, which wouldn't do much good since the vertices are outside the ring.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Home Page</title>
    <id>1396</id>
    <revision>
      <id>3535</id>
      <timestamp>2006-02-17T19:10:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>k</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>3536</id>
      <timestamp>2005-11-17T08:54:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>SuperApe's changes</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]

You might want to visit the IRC channel irc://irc.enterthegame.com#unrealwiki where some wikizens hang around.

==Contact ==

Questions about the site or problems? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Copyright ==

Basically, authors retain ownership.  Permissions are extended to Fair Use on the World Wide Web. Permission is granted to reference, or link to, content on this site. Do not copy content on this site unless within the bounds of Fair Use. More information is available on [[Legacy:Project Copyright|Project Copyright]].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

This Wiki is powered by [[UseMod:UseModWiki]], version 0.92, using the [[Legacy:Wookee|Wookee]] formatter.</text>
    </revision>
    <revision>
      <id>3537</id>
      <timestamp>2005-12-17T04:39:55Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>32361</id>
      <timestamp>2008-07-09T19:06:27Z</timestamp>
      <contributor>
        <username>Haarg</username>
        <id>1</id>
      </contributor>
      <minor/>
      <comment>minor change to test db issue</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.
}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>33524</id>
      <timestamp>2008-12-02T08:05:36Z</timestamp>
      <contributor>
        <username>Domc4Tacge</username>
        <id>1676</id>
      </contributor>
      <comment>tabocrelbo</comment>
      <text xml:space="preserve">eldron
Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.
}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>33529</id>
      <timestamp>2008-12-03T10:50:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Domc4Tacge|Domc4Tacge]] ([[User talk:Domc4Tacge|Talk]]); changed back to last version by [[User:Haarg|Haarg]]</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.
}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>34504</id>
      <timestamp>2009-06-19T21:25:10Z</timestamp>
      <contributor>
        <ip>83.244.147.78</ip>
      </contributor>
      <comment>/* Tutorials */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.
}}

cards, which werefourteen cards\'ideologically
&lt;a href=http://jiggmin.com/forum/member.php?u=5353&gt;flashlight forum&lt;/a&gt;of Greek gods, aproduction may wellof Milano, meaningthe deck was to[url=http://jiggmin.com/forum/member.php?u=5353]rechargeable flashlight[/url]for other artworksbirds, motifs thatspecific order of

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>34505</id>
      <timestamp>2009-06-19T21:42:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/83.244.147.78|83.244.147.78]] ([[User talk:83.244.147.78|Talk]]) to last version by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.
}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>34506</id>
      <timestamp>2009-06-19T23:18:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Protected &quot;[[Legacy:Home Page]]&quot;: High traffic page ([edit=autoconfirmed] (indefinite) [move=autoconfirmed] (indefinite))</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.
}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Home Page/Changes</title>
    <id>1381</id>
    <revision>
      <id>3499</id>
      <timestamp>2007-11-23T20:18:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>3500</id>
      <timestamp>2007-11-23T18:57:41Z</timestamp>
      <contributor>
        <ip>C-69-140-76-41.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[url=http://ca.geocities.com/hoyle248casino/qhsnv/cassino-do-chacrinha.htm]cassino do chacrinha[/url]</text>
    </revision>
    <revision>
      <id>35575</id>
      <timestamp>2009-11-03T08:20:14Z</timestamp>
      <contributor>
        <ip>122.49.210.50</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[http://www.superiorpapers.com:Custom written essays]] are usually provided as a content to share information to the end users.
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35576</id>
      <timestamp>2009-11-03T08:21:06Z</timestamp>
      <contributor>
        <ip>119.111.124.194</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[http://www.superiorpapers.com|Custom written essays]] are usually provided as a content to share information to the end users.
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35577</id>
      <timestamp>2009-11-03T08:22:00Z</timestamp>
      <contributor>
        <ip>119.111.124.194</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [http://www.superiorpapers.com|Custom written essays] are usually provided as a content to share information to the end users.
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35578</id>
      <timestamp>2009-11-03T08:23:11Z</timestamp>
      <contributor>
        <ip>122.49.210.50</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* Contents such as [http://www.superiorpapers.com|custom written essays] are usually provided to share information to the end users.
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35579</id>
      <timestamp>2009-11-03T08:23:47Z</timestamp>
      <contributor>
        <ip>122.49.210.50</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* Contents such as [http://www.superiorpapers.com/ | custom written essays] are usually provided to share information to the end users.
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35580</id>
      <timestamp>2009-11-03T08:24:14Z</timestamp>
      <contributor>
        <ip>122.49.210.50</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* Contents such as [http://www.superiorpapers.com/ custom written essays] are usually provided to share information to the end users.
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35581</id>
      <timestamp>2009-11-03T08:25:19Z</timestamp>
      <contributor>
        <ip>122.49.210.50</ip>
      </contributor>
      <comment>/* Unreal Topics */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35582</id>
      <timestamp>2009-11-03T08:26:59Z</timestamp>
      <contributor>
        <ip>119.111.124.194</ip>
      </contributor>
      <comment>/* Coding */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java. Contents on the other hand, such as [http://www.superiorpapers.com/ custom written essays] are usually provided to share information to the end users.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35583</id>
      <timestamp>2009-11-03T08:27:45Z</timestamp>
      <contributor>
        <ip>122.49.210.50</ip>
      </contributor>
      <comment>/* Coding */</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java. 
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35585</id>
      <timestamp>2009-11-04T10:11:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/122.49.210.50|122.49.210.50]] ([[User talk:122.49.210.50|Talk]]) to last revision by [[User:119.111.124.194|119.111.124.194]]</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java. Contents on the other hand, such as [http://www.superiorpapers.com/ custom written essays] are usually provided to share information to the end users.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
    <revision>
      <id>35586</id>
      <timestamp>2009-11-04T10:12:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverting all spammer edits</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. The Unreal Wiki is dedicated to gathering documentation on the Unreal Engine. Not only can you browse the large quantity of material already here, but anyone can add or edit information instantly &amp;ndash; no registration required. A [[:Category:Legacy Personal Page|large  community]] of mappers, coders and modelers helps in this effort. [[Legacy:New Contributors Quick Start|Find out how]].

Need help finding your way around?  Read [[Legacy:Using The Wiki|Using The Wiki]] to get started, or use the [[Legacy:Search|Search]] function.  Use the ''Quick Navigation'' menu at the top to navigate within a page. To find out more about how the site operates, see the [[Legacy:MetaTopics|MetaTopics]] page.

See [[Legacy:Recent Changes|Recent Changes]] for local news, and [[Legacy:Featured Pages|Featured Pages]] for a  rundown of what's new and cool.

{{innerbox|
'''Never use an offline reader to download the entire Unreal Wiki.  If you do, we will ban you instantly and permanently.'''  Offline readers put an insane stress on the web server because they follow each and every of the processing-intensive maintenance links on the Wiki that are used seldomly by real people.  Don't say you haven't been warned.

We're providing the entire Wiki content as a '''convenient single download on [[Legacy:Offline Wiki|Offline Wiki]]''' though.  It's smaller, zipped and downloads faster than what any offline reader could give you.  Of course you can also save individual pages using your web browser without problems.


}}

==Tutorials ==

The Unreal Wiki holds many tutorials on a variety of subjects. Here are some starting points:
* [[Legacy:Terminology|Terminology]] gives a glossary of Unreal terms. Refer to this if you come across an unknown Unreal term here or on other sites. Consider this the  Unreal Engine dictionary.
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; Start here if new to UnrealEd
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; Start here if new to scripting
* [[Legacy:Unreal Mapping FAQ|Unreal Mapping FAQ]]
* [[:Category:Legacy Tutorial|Search For All Tutorials]]

==Encyclop&amp;aelig;dia ==

===Mapping ===

These pages organize information on using UnrealEd to make maps into separate topic areas.

[[Legacy:Topics On Mapping|Topics on Mapping]] is the starting point for anything about map creation in Unreal. Here's a quick selection:
* [[Legacy:UnrealEd Interface|UnrealEd Interface]] &amp;ndash; Reference for windows, menus and widgets
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Texture Topics|Texture Topics]] &amp;ndash; Using and making them
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]] &amp;ndash; Triggers, sounds, music, things that react and change in maps
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Doors, lifts, brushes that move
* [[Legacy:Bot Support|Bot Support]]
* [[Legacy:Gametype|Gametype]] &amp;ndash; Specifics about mapping for gametypes and mods

===Coding ===

Covers how to write new code for the Unreal series of games.  For the most part, this is done in the custom scripting language UnrealScript, although it can also be done in other languages such as C++ or Java.
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; Unreal's scripting language
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:Native Coding|Native Coding]] &amp;ndash; Making DLL files for Unreal.
* [[Legacy:Class Tree|Class Tree]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Karma|Karma]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] and [[Legacy:AI Scripting|AI Scripting]] &amp;ndash; Monsters and NPCs

===Modeling ===

Links found in this section explain techniques used in modeling.  This entails modeling of players, weapons and static meshes as well as skinning and getting your model ingame.
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Unreal Topics ==
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:Open Source|Open Source]]
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Distribution|Distribution]] 
* [[Legacy:Third-Party Components|Third-Party Components]] &amp;ndash; Extra goodies to add to maps
* [[Legacy:Application|Application]] &amp;ndash; Stuff to make life with UnrealEd a little smoother
* [[Legacy:Troubleshooting|Troubleshooting]] &amp;ndash; Problems with UnrealEd itself and with maps
* [[Legacy:External Links|External Links]]

==Wiki Community ==
* [[Legacy:Mod Ideas|Mod Ideas]] &amp;ndash; the UT200X Mod braintank.
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; the UT/UT200X Map braintank.
* [[:Category:Legacy Journal|Journals]] &amp;ndash; Mappers and coders write about their learning curves.
* [[:Category:Legacy Rant|Rants]] &amp;ndash; Wikizens' views of the (Unreal Engine) world.
* [[:Category:Legacy Personal Page]]
* [[Legacy:Log In|Log in]]
* irc://irc.enterthegame.com#unrealwiki

==Contact ==

Questions comments about the site? E-mail a [[Legacy:Wiki Admin|Wiki Admin]] or visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum].

==Editing this Page==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Suggestions for edits to this page
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]] &amp;ndash; An editable copy of this page

----

See [[Legacy:Project Copyright|Project Copyright]] for copyright information.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Home Page/Discuss</title>
    <id>1380</id>
    <revision>
      <id>3497</id>
      <timestamp>2008-02-15T08:11:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">''This page is for dicsussion &amp; suggestions of what to put on the Home Page and how to organize it. Anything else &amp;ndash; go somewhere else: eg [[Legacy:Project Skins|Project Skins]], etc.''

==Navigation problems ==

Overall summary of comments so far: woolly distinction between Tutorials / Encyclopedia / whatever &amp;ndash; Unrealed beginners like to have a big sign that says &quot;tutorials here&quot;, apparently. (it comes from growing up with the STRAT menu in windoze, I suspect ;) ) 

Suggestions:
* How about splitting the home page into 'Tutorials Unreal Tournament 2003' and 'Tutorials Unreal Tournament', And under those headings specified links to pages with kind of tutorials like mapping, modeling, coding, whatever.. This would make it far easier for dummies like me where to search ;)  And it is also easier for people who write tutorials to put them in the right category.. At the moment the homepage is just a 'mess'.. lol..
* Split the Home page into &quot;Welcome Visitors&quot; (the default site page) and &quot;Contents Page&quot;.

===The monolithic indexes===

'''Tarquin:''' We seem to be getting more monolithic indexes:
* [[Legacy:Test-HomePage|Test-HomePage]]
* [[Legacy:Mapping Resources|Mapping Resources]]
* [[Legacy:Aedis/TableOfContentsMockup|Aedis/TableOfContentsMockup]]

I don't like any of these. They're too long to load and there is simply ''too much going on''. It's unrealistic to give people the ENTIRE content of the site on a single page. If someone wants to compile an Alphabetical index, then go ahead, that could be a good idea, but not for the [[Legacy:Home Page|Home Page]]

The current forward index is a two-tier system like this:
          Home Page
              |
   __________________________________________ .... &gt;
   |                |             |       |
 UnrealScript Architecture Lighting  Bot Support  etc

Many people complain about the Home page's organization. Is the above not clear from the way it's presented?

'''ZxAnPhOrIaN:''' I think that the home page's layout is just fine. I rarely use the homepage for mapping and coding links. I use the sidebar.

===Discussion and Comments section concerns===

'''ZxAnPhOrIaN:''' I have just realized that people put comments on the bottom of the page (below the category links), not in the comments section. Do they breeze through the pages and forget where the comments section is? It is starting to disturb me. It led me to believe that all discussion areas on the wiki should be removed.

'''CH3Z:''' ???

'''Mychaeel:''' Very simple:  Make the &quot;Comments&quot; area the last item on a page.  To start with, don't create one that's empty; let people who want to comment add it when it becomes necessary.

'''Tarquin:''' I prefer the category at the very bottom. Zxan, if you find people have put the comments bewlo the categories ... just move them back up :)

'''Mychaeel:''' With &quot;very bottom&quot; I mean &quot;just above the category list.&quot;  ZxAnPhOrIaN has a habit of wanting the &quot;discussion&quot; somewhere in the middle of the page.

'''ZxAnPhOrIaN:''' I don't put it in the middle of the page! :) On my personal page maybe, but not on other pages!

----

'''Mosquito:''' Please put a modelling section on the home page and on the sidebar.  Thanks

'''Mychaeel:''' Do it yourself &amp;ndash; that's what [[Legacy:Home Page/Changes|Home Page/Changes]] is for. &amp;ndash; As for the side bar the same goes, but be sure to also ''remove'' some of the existing links (in an educated fashion) as to keep the total length of the sidebar unchanged.

----

'''Abe:''' Hey, the sidebar of the wiki home page and every other page is fux0red.  It's at the very bottom after all this stuff.  Is anyone else seeing this?  BTW, this is my first edit, I hope that I haven't screwed up this page.  This is also a problem in the offline wiki...

'''Mychaeel:''' Actually, it's your browser not supporting the CSS that normally places the sidebar where it belongs: in the upper-left corner.  See [[Legacy:Wiki Sidebar/Discuss|Wiki Sidebar/Discuss]].

'''Tarquin:''' You can either change to a different skin in your sire preferences, or download Mozilla (it's free!)

'''GRAF!K:''' Download Mozilla at http://www.mozilla.org.

'''I noticed the HTML source for the sidebar is at the end of the document. If moved to the top, would this fix the problem?'''

'''Mychaeel:''' There's a point behind the source for the sidebar being at the bottom &amp;ndash; that it's loaded last as well, after the more important content &amp;ndash;, so putting it at the top of the source would defeat that purpose completely.

----

'''GRAF!K:''' I'm not sure about Offline Wiki being on the home as &quot;site news.&quot; Offline Wiki has been going for quite a while now, and it looks kind of odd as the '''only''' item in Site News. Perhaps we could just delete that and leave the anouncement under the boldface offline reader warning. I'll try something like that on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Changes]].

'''Mychaeel:''' You have a point.  I've removed the entire &quot;News&quot; section for now &amp;ndash; news only make sense if they're kept fresh.

'''GRAF!K:''' Thank you, Mychaeel. Sorry if I sounded rude. :-/

'''Tarquin:''' Good point. I only put the news section in for people who arrive from BU hosted site news. But now there's a link to [[Legacy:Featured Pages|Featured Pages]], which isn't locked, so anyone can post about new pages there.

----

'''Foxpaw:''' The styles stopped working all of a sudden at about.. the time of this message. :P A few minutes ago all styles on the wiki ceased to function. I don't know if it is just me, though.. did anyone else experience this or is something up with my browser?

'''Mychaeel:''' The forums don't work either, and neither do other hosted sites such as http://www.planetjailbreak.com.  That happened yesterday morning already.  It's not related specifically to the Unreal Wiki.

'''Foxpaw:''' Oh. It didn't appear to affect me until the time that I posted that message. Styles appear to be working again though now.

----

'''empty_other:''' A new &quot;editor&quot; here, so doesnt know where to start right now...But for the moment its only ONE thing i would have wanted on this Wiki. I noticed your name was UNREAL Wiki and not UnrealEd Wiki. And i come to think, what im looking for is some &quot;Unreal Universe&quot; history (for those not noticed: Mostly of the characters in UT99 have backgroundstories, many of them okey enough to get an idea about another outside universe, outside the tournament). Three pages who need to be made: General Timeline, Races and Famous/important characters. Just working on the idea now, but if anybody has a good reason i should not do it, say so...Or else, help me make it.

----

==Favicon==

'''Zxanphorian:''' I have made a favicon for the wiki. Here it is (you will have to convert it to an .ico file, btw): &lt;nowiki&gt;-[DELETED]-&lt;/nowiki&gt;

'''Pingz:''' Upload .PNGs ( jpg compression sucks ) at 48x48, 32x32, and 16x16.  You need the different sizes if you want them to look good on a windows machine.  I'll then convert them into a .png and .ico for use in Mozilla and IE.  Even then realize that favicons are buggy in IE... they don't always show up.

'''Zxanphorian:''' The favicons work for me in IE. The [http://www.howstuffworks.com HowStuffWorks] favicon is a black and white picture of a person's head opened with a world in it, for example. Sure, i will upload in PNG's at those resolutions. (You have to bookmark/favorite the page or put it in the links bar to see the favicon.) Also, the admins (tarq and mych) have to upload the icon for it to work.

'''Zxanphorian:''' Here they are (i included the master copy if you don't like the resizing) : [[Image:Legacy_faviconmaster.png|]] @inline@favicon48 @inline@favicon32 @inline@favicon16

'''Pingz:''' Ok i merged the 3 sizes into a single .ico file for windows which can be downloaded [http://www.pingz.com/files/wiki_favicon_48_32_16.ico here].  All that is needed is for an admin to upload the favicon.ico and favicon.png ( should be the 16x16 one ).

'''Mychaeel:''' Alright &amp;ndash; I've uploaded wiki_favicon_48_32_16.ico (as favicon.ico) and favicon16 (as favicon.png).  Please check whether it works as supposed.  Good work.  :-)

'''Pingz:''' Seems to work for both IE6 and Mozilla over here.

'''EntropicLqd:''' Seems OK for IE5.

'''Zxanphorian:''' Works in IE6. pingz, what is a good icon maker?
:'''GRAF1K:''' Visual Studio .NET and Visual Studio 6 have icon tools, but being a gamer rather than webapp developer, you probably don't have access to those. I dont know any others.

'''RDGDanClark:''' The Favicon is supposed to happen automatically, right? It's not showing up for me, I'm a Mozilla user. Maybe I'm missing something...

'''Zxanphorian (Not logged in):''' Well, you have to bookmark it first :)

'''Mosquito:''' CSS sheets seem to be busted across the board. :S

'''Wormbo:''' BeyondUnreal is having problems ATM.

'''CH3Z:''' I hope someone has all the wiki's graphics backed up. But how do you ever notice when someone overwrites one they shouldn't have, in time revert it before you overwrite the original with your next backup? Ayway, just bringing this up after noticing that someone had overwritten &quot;favicon&quot; on this page with that car pic. 

----

'''TroyEB:''' Here is a very good and complete UnrealScript doc page that should be linked http://unreal.student.utwente.nl/uncodex-ut2004/

'''Mychaeel:''' It is &amp;ndash; linked from [[Legacy:UnCodeX|UnCodeX]].

----

'''zugy:''' The search is looking really wierd...

[http://img61.imageshack.us/img61/3700/thatdoesntlookright3by.jpg]

Not sure what's causing it...I'm using IE 6.0 (and no, I don't feel like using firefox thank you very much :p) Windows XP SP2....

'''Tarquin:''' I see the same thing on Firefox. 

'''Mychaeel:''' Hmm. Guess I'll have to adapt the Google result page parser a bit.</text>
    </revision>
    <revision>
      <id>3498</id>
      <timestamp>2008-02-14T22:16:24Z</timestamp>
      <contributor>
        <ip>Fethican</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;

&lt;!&amp;ndash; saved from url=(0014)about:internet &amp;ndash;&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta name=&quot;generator&quot; content=&quot;Web Page Maker V2&quot;&gt;

&lt;/head&gt;

&lt;style type=&quot;text/css&quot;&gt;

/*----------Text Styles----------*/

.ws6 {font-size: 8px;}

.ws7 {font-size: 9.3px;}

.ws8 {font-size: 11px;}

.ws9 {font-size: 12px;}

.ws10 {font-size: 13px;}

.ws11 {font-size: 15px;}

.ws12 {font-size: 16px;}

.ws14 {font-size: 19px;}

.ws16 {font-size: 21px;}

.ws18 {font-size: 24px;}

.ws20 {font-size: 27px;}

.ws22 {font-size: 29px;}

.ws24 {font-size: 32px;}

.ws26 {font-size: 35px;}

.ws28 {font-size: 37px;}

.ws36 {font-size: 48px;}

.ws48 {font-size: 64px;}

.ws72 {font-size: 96px;}

.wpmd {font-size: 13px;font-family: 'Arial';font-style: normal;font-weight: normal;}

/*----------Para Styles----------*/

DIV,UL,OL /* Left */

{
 margin-top: 0px;
 margin-bottom: 0px;

}
&lt;/style&gt;

&lt;body background=&quot;http://img179.imageshack.us/img179/9726/bbbbbbbtm7.jpg&quot;&gt;

&lt;/body&gt;

&lt;/html&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HomeBase</title>
    <id>1384</id>
    <revision>
      <id>3506</id>
      <timestamp>2006-04-01T00:06:47Z</timestamp>
      <contributor>
        <ip>192.251.69.74</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; HomeBase (Package: Engine)}}

When a pawn is hurt or if its just really chicken it will seek its way to its HomeBase (preferably this is a place out of the way or a place where the pawn can get backup).

Works with [[Legacy:ScriptedPawn|ScriptedPawn]].  The Tag of this actor should be the same as the tag of the creatures who are to use it.

==Properties==

===Main===
; float Extend : How far the base extends from central point. Only places in line of sight from the HomeBase actor belong to the base.

===Hidden===
; vector LookDir : Direction to look while stopped. This is set to a vector of length 200 pointing in a direction corresponding to the HomeBase's rotation.

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]

==Discussion==

'''Tarquin:''' hmmmmm on second thoughts, if this &amp; PatrolPOint etc ONLY work with [[Legacy:ScriptedPawn|ScriptedPawn]] they're probably best on the same page.... darn.

'''Legal:''' I thought Homebase was necessary for bots in CTF/Assault... or at least working... Aren't they? I'm quite sure. Fill this page with info, please...

'''Foxpaw:''' This page has been neglected for a long time. Anyone know anything about these?

'''SuperApe:''' I'm slowly ''herding'' these pages together and linking them.  They are all part of the [[Legacy:ScriptedPawn|ScriptedPawn]] family of NavPoints that UT mappers used to help define the AI for NPCs and Bots.  In terms of organization, I do think they should be kept separate class pages, but they did need linkage.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3507</id>
      <timestamp>2003-10-29T03:46:01Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Neglected page!</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; HomeBase}}

Works with [[Legacy:ScriptedPawn|ScriptedPawn]].

Tarquin: hmmmmm on second thoughts, if this &amp; PatrolPOint etc ONLY work with [[Legacy:ScriptedPawn|ScriptedPawn]] they're probably best on the same page.... darn.

'''Legal:''' I thought Homebase was necessary for bots in CTF/Assault... or at least working... Aren't they? I'm quite sure. Fill this page with info, please...

'''Foxpaw:''' This page has been neglected for a long time. Anyone know anything about these?</text>
    </revision>
    <revision>
      <id>3508</id>
      <timestamp>2006-01-28T01:54:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; HomeBase (Package: Engine)}}

When a pawn is hurt or if its just really chicken it will seek its way to its HomeBase (prefably this is a place out of the way or a place where the pawn can get backup).

Works with [[Legacy:ScriptedPawn|ScriptedPawn]].  The Tag of this actor should be the same as the tag of the creatures who are to use it.

==Properties==

===Main===
; float Extend : How far the base extends from central point. Only places in line of sight from the HomeBase actor belong to the base.

===Hidden===
; vector LookDir : Direction to look while stopped. This is set to a vector of length 200 pointing in a direction corresponding to the HomeBase's rotation.

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]

==Discussion==

'''Tarquin:''' hmmmmm on second thoughts, if this &amp; PatrolPOint etc ONLY work with [[Legacy:ScriptedPawn|ScriptedPawn]] they're probably best on the same page.... darn.

'''Legal:''' I thought Homebase was necessary for bots in CTF/Assault... or at least working... Aren't they? I'm quite sure. Fill this page with info, please...

'''Foxpaw:''' This page has been neglected for a long time. Anyone know anything about these?

'''SuperApe:''' I'm slowly ''herding'' these pages together and linking them.  They are all part of the [[Legacy:ScriptedPawn|ScriptedPawn]] family of NavPoints that UT mappers used to help define the AI for NPCs and Bots.  In terms of organization, I do think they should be kept separate class pages, but they did need linkage.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44331</id>
      <timestamp>2011-03-06T13:39:59Z</timestamp>
      <contributor>
        <ip>62.87.242.164</ip>
      </contributor>
      <comment>Fixing the variable name (Not extend, but extent)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; HomeBase (Package: Engine)}}

When a pawn is hurt or if its just really chicken it will seek its way to its HomeBase (preferably this is a place out of the way or a place where the pawn can get backup).

Works with [[Legacy:ScriptedPawn|ScriptedPawn]].  The Tag of this actor should be the same as the tag of the creatures who are to use it.

==Properties==

===Main===
; float Extent : How far the base extends from central point. Only places in line of sight from the HomeBase actor belong to the base.

===Hidden===
; vector LookDir : Direction to look while stopped. This is set to a vector of length 200 pointing in a direction corresponding to the HomeBase's rotation.

==Related Topics==
* [[Legacy:ScriptedPawn|ScriptedPawn]]
** [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AmbushPoint|AmbushPoint]]

==Discussion==

'''Tarquin:''' hmmmmm on second thoughts, if this &amp; PatrolPOint etc ONLY work with [[Legacy:ScriptedPawn|ScriptedPawn]] they're probably best on the same page.... darn.

'''Legal:''' I thought Homebase was necessary for bots in CTF/Assault... or at least working... Aren't they? I'm quite sure. Fill this page with info, please...

'''Foxpaw:''' This page has been neglected for a long time. Anyone know anything about these?

'''SuperApe:''' I'm slowly ''herding'' these pages together and linking them.  They are all part of the [[Legacy:ScriptedPawn|ScriptedPawn]] family of NavPoints that UT mappers used to help define the AI for NPCs and Bots.  In terms of organization, I do think they should be kept separate class pages, but they did need linkage.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HomeNode</title>
    <id>1436</id>
    <revision>
      <id>3625</id>
      <timestamp>2004-10-17T06:52:30Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]] &gt;&gt; HomeNode (Package: FPSGame)}}

A HomeNode is a [[Legacy:PathNode|PathNode]] that is set up in a restricted area, such as someone's house, so that [[Legacy:Bystander|Bystander]]s milling about won't decide to walk into one of these houses.

==Functions ==
; function Trigger([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator) : When triggered, a [[Legacy:HomeNode|HomeNode]] toggles its bBlocked status.

==Related Topics ==
* [[Legacy:Bot Pathing|Bot Pathing]]
* [[Legacy:PersonController|PersonController]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3626</id>
      <timestamp>2004-05-28T02:21:15Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]] &gt;&gt; [[Legacy:HomeNode|HomeNode]]}}

A [[Legacy:HomeNode|HomeNode]] is a [[Legacy:PathNode|PathNode]] that is set up in a restricted area, such as someone's house, so that [[Legacy:Bystanders|Bystanders]] milling about won't decide to walk into one of these houses.

==Functions ==
; function Trigger([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator) : When triggered, a [[Legacy:HomeNode|HomeNode]] toggles its bBlocked status.

==Related Topics ==

[[Legacy:PersonController|PersonController]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HomePage</title>
    <id>1397</id>
    <revision>
      <id>3538</id>
      <timestamp>2004-11-04T09:34:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>restore</comment>
      <text xml:space="preserve">'''DON'T PANIC.'''

For everybody who accidentally ended up here via a bookmark:  The home page is now on [[Legacy:Home Page|Home Page]] (note the extra blank).  Please update your bookmarks, and don't forget your towel.

'''DON'T PANIC.'''

----

If you came here by means of a link somewhere, please be so kind to tell us the address of the page you came from here so we can ask the maintainer to change the link.

Please note that the canonical address for the Unreal Wiki home page is, has always been and will ever remain (as long as we're hosted here) http://wiki.beyondunreal.com.</text>
    </revision>
    <revision>
      <id>3539</id>
      <timestamp>2004-11-04T09:04:35Z</timestamp>
      <contributor>
        <ip>195.7.103.210</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache By O' Dirty CkH??|| Stop Fucking Hacking Plz ;) I've got a headache</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HoverPathNode</title>
    <id>1447</id>
    <revision>
      <id>3644</id>
      <timestamp>2007-07-27T14:44:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]]&gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PathNode|PathNode]] &gt;&gt; [[Legacy:RoadPathNode|RoadPathNode]] &gt;&gt; HoverPathNode (Package: Engine)}}

[[Image:Legacy_UT2004.S_RoadPath.png|right|HoverPathNode icon, same as RoadPathNode]]

A special pathnode for flying (think &quot;Raptor&quot;) and hovering (think &quot;Manta&quot;) vehicles. Unlike RoadPathNodes a HoverPathNode can be placed over water as well.

If you want a pathnode that can only be used by flying vehicles, but not by hovercrafts, use a [[Legacy:FlyingPathNode|FlyingPathNode]] instead.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How Firing Doesn't Work</title>
    <id>1422</id>
    <revision>
      <id>3598</id>
      <timestamp>2005-08-08T18:40:41Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page illustrates a flow of control that is executed when the player hits the fire button.  However, in practice this is NOT how weapon firing works!  For that, see [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]].

The 'decoy' chain goes like this:

* [[Legacy:PlayerController|PlayerController]].Fire

&lt;uscript&gt;
exec function Fire( optional float F )
{
    if ( Level.Pauser == PlayerReplicationInfo )
    {
        SetPause(false);
        return;
    }
    Pawn.Fire(F);
}
&lt;/uscript&gt;

Here is easy: if the level is not in pause mode, call the Pawn's Fire function.  If the level is paused and the person who paused it is the one who's firing, it unpauses the level but does not fire the weapon.

* [[Legacy:Pawn|Pawn]].Fire

&lt;uscript&gt;
function Fire( optional float F )
{
    if( Weapon!=None )
        Weapon.Fire(F);
}
&lt;/uscript&gt;

Again, piece of cake: if the pawn has a weapon, call the weapon Fire function.

* [[Legacy:Weapon|Weapon]].Fire

&lt;uscript&gt;
simulated function Fire(float F)
{
}
&lt;/uscript&gt;

There's no code here!  Normally you would expect to see the Fire method implemented in subclasses of Weapon.  But none of the weapon classes actually implement this!  At the time of writing, we don't believe this is used anywhere.  See [[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing A Weapon]] for a more likely story.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How To Make Elevators With Doors That Follow The Lift</title>
    <id>1439</id>
    <revision>
      <id>3631</id>
      <timestamp>2008-02-09T17:00:09Z</timestamp>
      <contributor>
        <ip>129.19.1.147</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''This is a work around for''''' ?[[Legacy:UT|UT]],?[[Legacy:UT2003|UT2003]],[[Legacy:UT2004|UT2004]],

By VitalOverdose

==The bHardAttach issue==

Anyone who's made a few maps must have tried to make an elevator... 

for those of you that haven't.. the doors are a bit of a problem.You can make the doors follow the elevator AND move apart to open. Once you have set the 'bHardAttach' in the default properties for the doors (to make them follow the lift) the X, Y and Z of the door becomes locked to that of the lift cab. In other words you cant make them move in any direction. 

==Solution==
;Its only the vector position of the pivot that cannot be altered..not its rotaion.
 

[[Image:Legacy_FOD_Elevatorcabtop.jpeg|right|]]

[[Image:Legacy_FOD_Elevatordoor.jpeg|right|make the elevator ROUND,make the doors CURVED.]]
 

The trick to this is to make your elevator from a cylinder and not the traditional 'box' shape.

Think of a revolving door, its X,Y,Z position never actually moves yet the mesh is moving. It works on the same principal as this method.

# Create a cylinder shape and hollow it out.
# Use the builder brush to Quarter a section of the cab to create the door shape
#* Alternative: use Tarquin's cylinder builder to create a hollow cylinder
# Position the builder brush/door shape to its closed position on the lift cab.
# In the top down view set the pivot to the center of the cab, then 'create new static mesh'.
# (package=mylevel,name=door)
#(You will end up with door meshes with a pivot way off from the actual mesh but don't worry).
# leave the builder brush in the door shape for the moment as we'll use it for setting the collision in a moment

Now go to the static mesh browser select 'mylevel' and with any luck you should now have your door mesh.

If you have troubles getting the pivot in the right place you may want to consider using a separate subtracted box (building room) elsewhere to create the mesh.

Add the door mesh back to the level and position the builder brush over it then right click on the brush and pick 'use brush as collision'. You can check if the collision has been set in the static mesh browser.

[[Image:Legacy_FOD_Elevatorcab1.jpeg|]] 

Use the remaining cylinder to create the lift cab.

Put the doors (movers)into a 'closed position' on the elevator before setting the pivot in the center of the elevator.  

Now add the doors as movers and hard attach them to the elevator. 

With the door pivot in the center of the round lift give the movers 2 keyframes for the open/closed action but ONLY use rotate to set the keyframes.
;Don't move the pivot from the center of the cab when setting the keyframes. 

And there you have it.....working elevator doors that follow the lift.

==Discussion==

'''Ragdoll:''' I have pivoting-outward (not sliding) doors attached to a cube-ish mover and they close and follow fine, but when the lift reaches its destination and triggers the door to open the doors fly back to the starting station. I know why this is happening-the key0  position that i set is back at the station and the door remembers that and goes back there rather than remain attached to the lift and open out at the 2nd station-but how can I fix this? Thanks in advance.

'''VitalOverdose''' Its probably down the the pivot moving as well as rotating. If you can design the doors so they can open without the pivot moving having to move at all (just rotate) then it should all work fine. Its like a door hinge, the center of a door hinge never actually changes location on a x,y,z, plane it just changes direction.

'''computergod666:''' So what about Attach Movers? I know they use SetBase() calls to attach things to them. Why doesn't that work? (Or does it? I've never tried to make an elevator with attached doors, but I'm scripting a Vehicle for UT and I want to know how to attach things like turrets to it.)

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3632</id>
      <timestamp>2007-11-21T19:33:04Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''This is a work around for''''' ?[[Legacy:UT|UT]],?[[Legacy:UT2003|UT2003]],[[Legacy:UT2004|UT2004]],

By VitalOverdose

==The bHardAttach issue==

Anyone who's made a few maps must have tried to make an elevator... 

for those of you that haven't.. the doors are a bit of a problem.You can make the doors follow the elevator AND move apart to open. Once you have set the 'bHardAttach' in the default properties for the doors (to make them follow the lift) the X, Y and Z of the door becomes locked to that of the lift cab. In other words you cant make them move in any direction. 

==Solution==
;Its only the vector position of the pivot that cannot be altered..not its rotaion.
 

[[Image:Legacy_FOD_Elevatorcabtop.jpeg|right|]]

[[Image:Legacy_FOD_Elevatordoor.jpeg|right|make the elevator ROUND,make the doors CURVED.]]
 

The trick to this is to make your elevator from a cylinder and not the traditional 'box' shape.

Think of a revolving door, its X,Y,Z position never actually moves yet the mesh is moving. It works on the same principal as this method.

# Create a cylinder shape and hollow it out.
# Use the builder brush to Quarter a section of the cab to create the door shape
#* Alternative: use Tarquin's cylinder builder to create a hollow cylinder
# Position the builder brush/door shape to its closed position on the lift cab.
# In the top down view set the pivot to the center of the cab, then 'create new static mesh'.
# (package=mylevel,name=door)
#(You will end up with door meshes with a pivot way off from the actual mesh but don't worry).
# leave the builder brush in the door shape for the moment as we'll use it for setting the collision in a moment

Now go to the static mesh browser select 'mylevel' and with any luck you should now have your door mesh.

If you have troubles getting the pivot in the right place you may want to consider using a separate subtracted box (building room) elsewhere to create the mesh.

Add the door mesh back to the level and position the builder brush over it then right click on the brush and pick 'use brush as collision'. You can check if the collision has been set in the static mesh browser.

[[Image:Legacy_FOD_Elevatorcab1.jpeg|]] 

Use the remaining cylinder to create the lift cab.

Put the doors (movers)into a 'closed position' on the elevator before setting the pivot in the center of the elevator.  

Now add the doors as movers and hard attach them to the elevator. 

With the door pivot in the center of the round lift give the movers 2 keyframes for the open/closed action but ONLY use rotate to set the keyframes.
;Don't move the pivot from the center of the cab when setting the keyframes. 

And there you have it.....working elevator doors that follow the lift.

==Discussion==

'''Ragdoll:''' I have pivoting-outward (not sliding) doors attached to a cube-ish mover and they close and follow fine, but when the lift reaches its destination and triggers the door to open the doors fly back to the starting station. I know why this is happening-the key0  position that i set is back at the station and the door remembers that and goes back there rather than remain attached to the lift and open out at the 2nd station-but how can I fix this? Thanks in advance.

'''VitalOverdose''' Its probably down the the pivot moving as well as rotating. If you can design the doors so they can open without the pivot moving having to move at all (just rotate) then it should all work fine. Its like a door hinge, the center of a door hinge never actually changes location on a x,y,z, plane it just changes direction.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How To Recruit A Programmer</title>
    <id>1416</id>
    <revision>
      <id>3583</id>
      <timestamp>2003-12-15T17:03:12Z</timestamp>
      <contributor>
        <ip>Tangerine27.demon.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''The original article was posted by James Walkoski in a [http://www.ataricommunity.com/forums/showthread.php?threadid=266017 forum thread] in Atari's UT2003 coding forum.''

}}

The absolute first thing that enters into a coder's head when they see a recruiting post is: &quot;Why should I work for this guy?&quot; It is not &quot;Wow, that is a cool idea&quot; or &quot;I wish there was a game like that I could play.&quot; Rather, &quot;Wow, that sounds like a lot of work.&quot;

Before someone who knows what they are doing is going to sign up you need to provide them with some very important information:

# How much influence will they have on the product based on what they want to work on, and what are the technology limitations? We can do anything on computers nowadays. The question is always whether or not it is a good idea.

# 


What skills do you have aside from &quot;designer&quot;? Anyone can have game ideas. If your only task for a project is to design it you had better have a design doc (five pages or less) written and available and we'd better not have to email you for it. (Like someone said above, inherently lazy and anyone who thinks they have an original idea worth protecting is so delusioned that we won't give them the time of day.)

Also, all sorts of other information need to be documented as well. Weapon sheets and descriptions, game and front end flowcharts, etc. Otherwise the programmers will be waiting on you for stuff and the last thing you want to do with their valuable time is squander it.



# What, exactly, have you done already?  If you have nothing or just some concept sketches don't bullshit us. We will know. In fact, before you go searching for programmers it would be a good idea to have placeholder packages made with temporary art that is named correctly. I could go on for a few pages about how important that stuff is to us. '''As far as your programmers will be concerned placeholder art is more important than the final art.'''

I know that may sound odd or confusing but just trust me on it.

==Examples ==

Ok, enough of the vague concepts of what to do here are some specific examples to help you out:
# Spell and grammar check your post. These kind of errors are easy to catch, but immediately discount you.

# [http://www.soma-studios.com Soma Studios] have a good example of what will interest a programmer. All of their information is cleanly laid out and freely available.  Their design doc is also very well written and concise: http://www.soma-studios.com/mark/mark_documents/cd_revolve.pdf (notice that the gameplay and features are at the start of the doc and the story is at the end)
# 


Flowcharts. They show organization and thought and will increase the workrate of your programmers. Here's an example of a frontend flowchart:

[[Image:Legacy_recruitment-programmer-flowchart.png|center|]]



==Related Topics==

* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Things you should think about ''before'' making a recruitment post.
* [[Legacy:Programmer Typology|Programmer Typology]] &amp;ndash; There are two different types of programmer.  Take your pick.

==Comments==

'''EntropicLqd:''' Heh &amp;ndash; not a bad idea for a page.  My very summarised thoughts on the topic are:
* The design doc needs to be as specific as possible.  I wouldn't put a limit on its length.  It does need to be as specific as possible.  I don't care how much stuff I have to read as long as I can get a good feel for the ''scope'' of what I'm being asked to build.  This in turn allows me to make a good judgement on whether I can commit to that amount of effort or not.
* In terms of front-end design, a bullet-pointed list of well described options is normally sufficient rather than the flow chart above.  If the front end has been split into pages already then a page schematic with a bulleted point description of the options on each of the pages is sufficient.

'''Mychaeel:''' As I personally find making the software design to be the most interesting and fun part of development, I prefer if somebody has a clear idea of what he/she wants to do and how to get there, but doesn't attempt to dictate my every step with an overly specific design document.

'''Chazums:''' Details, i like details. how far? how long? how high? Its more irritating to have to go and re-do do code because people weren't sure and say &quot;you decide&quot; amd then come back with a &quot;not like that tho..&quot;

'''Mychaeel:''' Bad luck on the designer's part then.  Not specifying something means they have to live with whatever the coder came up with.  One more reason I prefer taking part in creating a design document simply because it's all too easy to end up with ambiguities or subtle intra-design contradictions if the design is made by somebody who is not ''very'' closely acquainted with the code creation process.

'''Chazums:''' Indeed, although i think getting art guys to make any kind of solid descision is an art in itself :D

'''Dante:''' I remember when some members in the mod I'm working for went nuts as we planned to move on to UT2003. I was the only coder back then - and they &quot;suprised&quot; me with their ideas. Yes, it's actually cool to have aircrafts with transport capabilities - and yes, it's also nice to have bots to fly them around... But wait - ''who is going to code all those things'' again ? - ARGH! And, I don't want to hear that &quot;it's easy to code&quot; stuff from people who can only do copy&amp;paste coding, or less, anymore.

'''Foxpaw:''' I think it's good to have as specific a design document as possible. I do all of my own programming but I still make a design document for myself, and when I do I like to include everything possible, up to how exactly things will work. It doesn't include the actual syntax, but it will include all of the classes I expect to use and all of their variables that may be accessed by other classes.. I find this helps a lot to avoid running into a situation where you need to access a value in a class that you didn't think of and isn't easily procured.

'''Haral:''' As far as design documents go, I think the option I like the most so far is to make one out of a forum.  Make a post regarding every specific area of the design and be very, very detailed.  Think always of what the people implementing it will need to know.  Don't worry about being too limiting, because you just put in one disclaimer:  It's a forum.  If you have a thought, reply.  What you want is a complete design so that even if everything isn't the best, there's still something there.  You don't have to rely on anyone thinking things up later.  Then, as things go on, people can easily put in &quot;this sucks, we should change it.&quot;  Just edit the original post as solid decisions get made.  Don't expect your design to stay the same either, as unless it's exceedingly simple, it'll cripple the lasting value of your mod.

'''MikeY:''' Hi lads, just wondering what prog you made the flow diag. in? I want to make one of these, I find  it  hard in photoshop, but thats probably to do with the fact i suck at it :) Thx. 

'''Csimbi:''' Looks like a Visio drawing to me.

'''MythOpus:''' You could do it in word too :)

'''MikeY:''' Cheers, i installed visio, but i can't seem to get the connectors curved on the corners and i cant split the connecter, anyone can help?</text>
    </revision>
    <revision>
      <id>3584</id>
      <timestamp>2003-12-14T21:11:39Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''The original article was posted by James Walkoski in a [http://www.ataricommunity.com/forums/showthread.php?threadid=266017 forum thread] in Atari's UT2003 coding forum.''

}}

The absolute first thing that enters into a coder's head when they see a recruiting post is: &quot;Why should I work for this guy?&quot; It is not &quot;Wow, that is a cool idea&quot; or &quot;I wish there was a game like that I could play.&quot; Rather, &quot;Wow, that sounds like a lot of work.&quot;

Before someone who knows what they are doing is going to sign up you need to provide them with some very important information:

# How much influence will they have on the product based on what they want to work on, and what are the technology limitations? We can do anything on computers nowadays. The question is always whether or not it is a good idea.

# 


What skills do you have aside from &quot;designer&quot;? Anyone can have game ideas. If your only task for a project is to design it you had better have a design doc (five pages or less) written and available and we'd better not have to email you for it. (Like someone said above, inherently lazy and anyone who thinks they have an original idea worth protecting is so delusioned that we won't give them the time of day.)

Also, all sorts of other information need to be documented as well. Weapon sheets and descriptions, game and front end flowcharts, etc. Otherwise the programmers will be waiting on you for stuff and the last thing you want to do with their valuable time is squander it.



# What, exactly, have you done already?  If you have nothing or just some concept sketches don't bullshit us. We will know. In fact, before you go searching for programmers it would be a good idea to have placeholder packages made with temporary art that is named correctly. I could go on for a few pages about how important that stuff is to us. '''As far as your programmers will be concerned placeholder art is more important than the final art.'''

I know that may sound odd or confusing but just trust me on it.

==Examples ==

Ok, enough of the vague concepts of what to do here are some specific examples to help you out:
# Spell and grammar check your post. These kind of errors are easy to catch, but immediately discount you.

# [http://www.soma-studios.com Soma Studios] have a good example of what will interest a programmer. All of their information is cleanly laid out and freely available.  Their design doc is also very well written and concise: http://www.soma-studios.com/mark/mark_documents/cd_revolve.pdf (notice that the gameplay and features are at the start of the doc and the story is at the end)
# 


Flowcharts. They show organization and thought and will increase the workrate of your programmers. Here's an example of a frontend flowchart:

[[Image:Legacy_recruitment-programmer-flowchart.png|center|]]



==Related Topics==

* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Things you should think about ''before'' making a recruitment post.
* [[Legacy:Programmer Typology|Programmer Typology]] &amp;ndash; There are two different types of programmer.  Take your pick.

==Comments==

'''EntropicLqd:''' Heh &amp;ndash; not a bad idea for a page.  My very summarised thoughts on the topic are:
* The design doc needs to be as specific as possible.  I wouldn't put a limit on its length.  It does need to be as specific as possible.  I don't care how much stuff I have to read as long as I can get a good feel for the ''scope'' of what I'm being asked to build.  This in turn allows me to make a good judgement on whether I can commit to that amount of effort or not.
* In terms of front-end design, a bullet-pointed list of well described options is normally sufficient rather than the flow chart above.  If the front end has been split into pages already then a page schematic with a bulleted point description of the options on each of the pages is sufficient.

'''Mychaeel:''' As I personally find making the software design to be the most interesting and fun part of development, I prefer if somebody has a clear idea of what he/she wants to do and how to get there, but doesn't attempt to dictate my every step with an overly specific design document.

'''Chazums:''' Details, i like details. how far? how long? how high? Its more irritating to have to go and re-do do code because people weren't sure and say &quot;you decide&quot; amd then come back with a &quot;not like that tho..&quot;

'''Mychaeel:''' Bad luck on the designer's part then.  Not specifying something means they have to live with whatever the coder came up with.  One more reason I prefer taking part in creating a design document simply because it's all too easy to end up with ambiguities or subtle intra-design contradictions if the design is made by somebody who is not ''very'' closely acquainted with the code creation process.

'''Chazums:''' Indeed, although i think getting art guys to make any kind of solid descision is an art in itself :D

'''Dante:''' I remember when some members in the mod I'm working for went nuts as we planned to move on to UT2003. I was the only coder back then - and they &quot;suprised&quot; me with their ideas. Yes, it's actually cool to have aircrafts with transport capabilities - and yes, it's also nice to have bots to fly them around... But wait - ''who is going to code all those things'' again ? - ARGH! And, I don't want to hear that &quot;it's easy to code&quot; stuff from people who can only do copy&amp;paste coding, or less, anymore.

'''Foxpaw:''' I think it's good to have as specific a design document as possible. I do all of my own programming but I still make a design document for myself, and when I do I like to include everything possible, up to how exactly things will work. It doesn't include the actual syntax, but it will include all of the classes I expect to use and all of their variables that may be accessed by other classes.. I find this helps a lot to avoid running into a situation where you need to access a value in a class that you didn't think of and isn't easily procured.

'''Haral:''' As far as design documents go, I think the option I like the most so far is to make one out of a forum.  Make a post regarding every specific area of the design and be very, very detailed.  Think always of what the people implementing it will need to know.  Don't worry about being too limiting, because you just put in one disclaimer:  It's a forum.  If you have a thought, reply.  What you want is a complete design so that even if everything isn't the best, there's still something there.  You don't have to rely on anyone thinking things up later.  Then, as things go on, people can easily put in &quot;this sucks, we should change it.&quot;  Just edit the original post as solid decisions get made.  Don't expect your design to stay the same either, as unless it's exceedingly simple, it'll cripple the lasting value of your mod.

'''MikeY:''' Hi lads, just wondering what prog you made the flow diag. in? I want to make one of these, I find  it  hard in photoshop, but thats probably to do with the fact i suck at it :) Thx. 

'''Csimbi:''' Looks like a Visio drawing to me.

'''MythOpus:''' You could do it in word too :)</text>
    </revision>
    <revision>
      <id>40317</id>
      <timestamp>2009-12-07T00:06:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>formatting fixes</comment>
      <text xml:space="preserve">{{innerbox|1=''The original article was posted by James Walkoski in a [http://www.ataricommunity.com/forums/showthread.php?threadid=266017 forum thread] in Atari's UT2003 coding forum.''}}

The absolute first thing that enters into a coder's head when they see a recruiting post is: &quot;Why should I work for this guy?&quot; It is not &quot;Wow, that is a cool idea&quot; or &quot;I wish there was a game like that I could play.&quot; Rather, &quot;Wow, that sounds like a lot of work.&quot;

Before someone who knows what they are doing is going to sign up you need to provide them with some very important information:

# How much influence will they have on the product based on what they want to work on, and what are the technology limitations? We can do anything on computers nowadays. The question is always whether or not it is a good idea.
# What skills do you have aside from &quot;designer&quot;? Anyone can have game ideas. If your only task for a project is to design it you had better have a design doc (five pages or less) written and available and we'd better not have to email you for it. (Like someone said above, inherently lazy and anyone who thinks they have an original idea worth protecting is so delusioned that we won't give them the time of day.)&lt;br&gt;Also, all sorts of other information need to be documented as well. Weapon sheets and descriptions, game and front end flowcharts, etc. Otherwise the programmers will be waiting on you for stuff and the last thing you want to do with their valuable time is squander it.
# What, exactly, have you done already?  If you have nothing or just some concept sketches don't bullshit us. We will know. In fact, before you go searching for programmers it would be a good idea to have placeholder packages made with temporary art that is named correctly. I could go on for a few pages about how important that stuff is to us. '''As far as your programmers will be concerned placeholder art is more important than the final art.'''

I know that may sound odd or confusing but just trust me on it.

==Examples ==

Ok, enough of the vague concepts of what to do here are some specific examples to help you out:
# Spell and grammar check your post. These kind of errors are easy to catch, but immediately discount you.
# [http://www.soma-studios.com Soma Studios] have a good example of what will interest a programmer. All of their information is cleanly laid out and freely available.  Their design doc is also very well written and concise: http://www.soma-studios.com/mark/mark_documents/cd_revolve.pdf (notice that the gameplay and features are at the start of the doc and the story is at the end)
# Flowcharts. They show organization and thought and will increase the workrate of your programmers. Here's an example of a frontend flowchart:

[[Image:Legacy_recruitment-programmer-flowchart.png|center|]]



==Related Topics==

* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Things you should think about ''before'' making a recruitment post.
* [[Legacy:Programmer Typology|Programmer Typology]] &amp;ndash; There are two different types of programmer.  Take your pick.

==Comments==

'''EntropicLqd:''' Heh &amp;ndash; not a bad idea for a page.  My very summarised thoughts on the topic are:
* The design doc needs to be as specific as possible.  I wouldn't put a limit on its length.  It does need to be as specific as possible.  I don't care how much stuff I have to read as long as I can get a good feel for the ''scope'' of what I'm being asked to build.  This in turn allows me to make a good judgement on whether I can commit to that amount of effort or not.
* In terms of front-end design, a bullet-pointed list of well described options is normally sufficient rather than the flow chart above.  If the front end has been split into pages already then a page schematic with a bulleted point description of the options on each of the pages is sufficient.

'''Mychaeel:''' As I personally find making the software design to be the most interesting and fun part of development, I prefer if somebody has a clear idea of what he/she wants to do and how to get there, but doesn't attempt to dictate my every step with an overly specific design document.

'''Chazums:''' Details, i like details. how far? how long? how high? Its more irritating to have to go and re-do do code because people weren't sure and say &quot;you decide&quot; amd then come back with a &quot;not like that tho..&quot;

'''Mychaeel:''' Bad luck on the designer's part then.  Not specifying something means they have to live with whatever the coder came up with.  One more reason I prefer taking part in creating a design document simply because it's all too easy to end up with ambiguities or subtle intra-design contradictions if the design is made by somebody who is not ''very'' closely acquainted with the code creation process.

'''Chazums:''' Indeed, although i think getting art guys to make any kind of solid descision is an art in itself :D

'''Dante:''' I remember when some members in the mod I'm working for went nuts as we planned to move on to UT2003. I was the only coder back then - and they &quot;suprised&quot; me with their ideas. Yes, it's actually cool to have aircrafts with transport capabilities - and yes, it's also nice to have bots to fly them around... But wait - ''who is going to code all those things'' again ? - ARGH! And, I don't want to hear that &quot;it's easy to code&quot; stuff from people who can only do copy&amp;paste coding, or less, anymore.

'''Foxpaw:''' I think it's good to have as specific a design document as possible. I do all of my own programming but I still make a design document for myself, and when I do I like to include everything possible, up to how exactly things will work. It doesn't include the actual syntax, but it will include all of the classes I expect to use and all of their variables that may be accessed by other classes.. I find this helps a lot to avoid running into a situation where you need to access a value in a class that you didn't think of and isn't easily procured.

'''Haral:''' As far as design documents go, I think the option I like the most so far is to make one out of a forum.  Make a post regarding every specific area of the design and be very, very detailed.  Think always of what the people implementing it will need to know.  Don't worry about being too limiting, because you just put in one disclaimer:  It's a forum.  If you have a thought, reply.  What you want is a complete design so that even if everything isn't the best, there's still something there.  You don't have to rely on anyone thinking things up later.  Then, as things go on, people can easily put in &quot;this sucks, we should change it.&quot;  Just edit the original post as solid decisions get made.  Don't expect your design to stay the same either, as unless it's exceedingly simple, it'll cripple the lasting value of your mod.

'''MikeY:''' Hi lads, just wondering what prog you made the flow diag. in? I want to make one of these, I find  it  hard in photoshop, but thats probably to do with the fact i suck at it :) Thx. 

'''Csimbi:''' Looks like a Visio drawing to me.

'''MythOpus:''' You could do it in word too :)

'''MikeY:''' Cheers, i installed visio, but i can't seem to get the connectors curved on the corners and i cant split the connecter, anyone can help?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT Weapons Work</title>
    <id>1392</id>
    <revision>
      <id>3525</id>
      <timestamp>2006-04-07T08:00:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==Before we start==

It is advisable to have the script code of the classes mentioned opened in an editor of your choice while reading this to compare the descriptions here with the actual code.

==Contents==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firing A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Switching To Another Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Picking Up A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How Bots Choose A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Telling Bots How To Use A Weapon]]
* /Double Enforcers (?) &amp;ndash; How to make weapons like the UT [[Legacy:Enforcer|Enforcer]].

==Related Topics==
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:Game Event Flow|Game Event Flow]]

==Discussion==

'''Luggage''': Can someone explain how the return value of the RateSelf() function is... valued? The higher, the more likely is a bot to choose that weapon... but... how often is that function called? And how do bots respond to it? Hm, maybe I could just have a look at what the other guns give back, ahem. :)

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3526</id>
      <timestamp>2006-01-03T21:07:10Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Before we start==

It is advisable to have the script code of the classes mentioned opened in an editor of your choice while reading this to compare the descriptions here with the actual code.

==Contents==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firing A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Switching To Another Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Picking Up A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How Bots Choose A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Telling Bots How To Use A Weapon]]
* /Double Enforcers (?) &amp;ndash; How to make weapons like the UT [[Legacy:Enforcer|Enforcer]].

==Related Topics==
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:Game Event Flow|Game Event Flow]]

==Discussion==

'''Luggage''': Can someone explain how the return value of the RateSelf() function is... valued? The higher, the more likely is a bot to choose that weapon... but... how often is that function called? And how do bots respond to it? Hm, maybe I could just have a look at what the other guns give back, ahem. :)

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3527</id>
      <timestamp>2006-04-06T21:06:18Z</timestamp>
      <contributor>
        <ip>C213-100-34-42.swipnet.se</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Before we start==

It is advisable to have the script code of the classes mentioned opened in an editor of your choice while reading this to compare the descriptions here with the actual code.

==Contents==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firing A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Switching To Another Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Picking Up A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How Bots Choose A Weapon]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Telling Bots How To Use A Weapon]]
* /Double Enforcers (?) &amp;ndash; How to make weapons like the UT [[Legacy:Enforcer|Enforcer]].

==Related Topics==
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:Game Event Flow|Game Event Flow]]

==Discussion==

'''Luggage''': Can someone explain how the return value of the RateSelf() function is... valued? The higher, the more likely is a bot to choose that weapon... but... how often is that function called? And how do bots respond to it? Hm, maybe I could just have a look at what the other guns give back, ahem. :)

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT Weapons Work/Firing A Weapon</title>
    <id>1388</id>
    <revision>
      <id>3517</id>
      <timestamp>2002-12-25T17:04:48Z</timestamp>
      <contributor>
        <ip>HunterKiller</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This might seem pretty short, but there isn't that much to talk about here.

Basically we go through Engine.[[Legacy:Weapon (UT)|Weapon (UT)]] and Botpack.[[Legacy:TournamentWeapon|TournamentWeapon]] here and have a short look at Botpack.[[Legacy:UT_BioRifle|UT_BioRifle]]'s alt fire mode.

----

When a [[Legacy:PlayerPawn|PlayerPawn]] wants to fire his weapon he executes his Fire (or AltFire) function which in turn calls the [[Legacy:TournamentWeapon|TournamentWeapon]]'s (Alt)Fire function. This function might be overridden in subclasses of actual weapons, but often the default version is used.

==The Default Fire Function==

First the weapon checks, if it has ammo, then it tries to use one ammo unit. If successful it goes into 'NormalFire' state and (still in the Fire function) either traces the shot using TraceFire (for hitscan weapons) or spawns a projectile using ProjectileFire.

The Fire function also calls ClientFire which by default only executes when bCanClientFire is True. ClientFire is responsible for all the things only visible to the player actually owning the weapon, like screen flashes, playing the firing animation and calling the FireEffect function of the [[Legacy:TournamentPickup|TournamentPickup]] registered as the weapon's affector.

If ClientFire is not executed on a listen server or in singleplayer the weapon also goes into 'ClientFiring' state. (see below)

==The Default NormalFire State==

After the Fire function has finished code execution continues in the 'NormalFire' state. Well, it doesn't really &quot;continue&quot; because the state code only consists of &quot;Sleep(0.0);&quot; which actually does nothing.

The actual &quot;magic&quot; is in the ''empty'' Fire and AltFire functions, which prevent firing another shot while the firing animation isn't finished, and in the AnimEnd function which ends the 'NormalFire' state by calling Finish.

==The Finish Function==

''(someone please add how bForceFire works)''

The first interesting thing here is the check for bChangeWeapon. This variable is set when the player wants to change to another weapon. If this is the case the weapon goes to the 'DownWeapon' state. (see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Switching To Another Weapon]])

The next part applies only to [[Legacy:Bot (UT)|Bot (UT)]]s and checks if the weapon still has ammo and whether the bot still wants to shoot.

Now Finish checks whether the weapon still has ammo and the player still presses the (alt)fire button. If so the global (Alt)Fire function is called, if not the weapon goes into 'Idle' state.

==The 'Idle' State==

We are back where we started &amp;ndash; in the 'Idle' state. The weapon checks if it still has ammo. If not it switches to the best weapon available. If the player presses the (alt)fire button the cycle starts again, if not the weapon disables its AnimEnd function and plays its idle animation.

==Firing On A Network Client==

The client can't spawn projectiles or trace shots. Clients have to simulate the behavior of the weapon as good as possible, so the 'Client(Alt)Firing' state waits untill the firing animation is finished and checks whether the player still presses the (alt)fire button. If the player doesn't fire anymore the weapon plays its idle animation and goes into the null state (with &lt;code&gt;GotoState('');&lt;/code&gt;, the 'Idle' state is only used server-side).

The client code usually is completely different than the code used for the server-side behavior.

----

==Examples For Custom Firing Behavior==

===UT Bio Rifle===

The load-and-hold feature in the Bio Rifle's secondary firing mode is created by ignoring the AnimEnd function inside the 'AltFiring' state. Instead there is a check in the Tick function if the player still presses the altfire button. When the button is released the Bio Rifle goes into 'ShootLoad' state to fire its load.

When entering the 'ShootLoad' state a UT_BioGlob is fired and the corresponding animation is played. In this state AnimEnd is not ignored and executes the Finish function to end the firing sequence. (Don't get confused by the Timer function in this state, it isn't used.)

----

==Comments==

Please complain here if something isn't explained clearly enough.

'''HunterKiller:''' It's not a complain :) , Its a request. Can someone update this to UT2K3? I don't feel good enough to make the research and change (or make a new) firing a weapon page.

'''Wormbo:''' UT2k3 weapons work completely different, so it would be better to start a whole new page for that. Unfortunately I don't have the time to do all the research either. Somebody who made/makes a weapon mod could probably create the [[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]] page and subpages.

'''Eldhrin:''' I'm working with UT2K3 weapons quite a bit at the moment, so I might be able to start that off some time.

'''HunterKiller:''' Okay, I'm giving the first step. Please contribute to [[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]] :D</text>
    </revision>
    <revision>
      <id>3518</id>
      <timestamp>2002-12-16T15:31:19Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This might seem pretty short, but there isn't that much to talk about here.

Basically we go through Engine.[[Legacy:Weapon (UT)|Weapon (UT)]] and Botpack.[[Legacy:TournamentWeapon|TournamentWeapon]] here and have a short look at Botpack.[[Legacy:UT_BioRifle|UT_BioRifle]]'s alt fire mode.

----

When a [[Legacy:PlayerPawn|PlayerPawn]] wants to fire his weapon he executes his Fire (or AltFire) function which in turn calls the [[Legacy:TournamentWeapon|TournamentWeapon]]'s (Alt)Fire function. This function might be overridden in subclasses of actual weapons, but often the default version is used.

==The Default Fire Function==

First the weapon checks, if it has ammo, then it tries to use one ammo unit. If successful it goes into 'NormalFire' state and (still in the Fire function) either traces the shot using TraceFire (for hitscan weapons) or spawns a projectile using ProjectileFire.

The Fire function also calls ClientFire which by default only executes when bCanClientFire is True. ClientFire is responsible for all the things only visible to the player actually owning the weapon, like screen flashes, playing the firing animation and calling the FireEffect function of the [[Legacy:TournamentPickup|TournamentPickup]] registered as the weapon's affector.

If ClientFire is not executed on a listen server or in singleplayer the weapon also goes into 'ClientFiring' state. (see below)

==The Default NormalFire State==

After the Fire function has finished code execution continues in the 'NormalFire' state. Well, it doesn't really &quot;continue&quot; because the state code only consists of &quot;Sleep(0.0);&quot; which actually does nothing.

The actual &quot;magic&quot; is in the ''empty'' Fire and AltFire functions, which prevent firing another shot while the firing animation isn't finished, and in the AnimEnd function which ends the 'NormalFire' state by calling Finish.

==The Finish Function==

''(someone please add how bForceFire works)''

The first interesting thing here is the check for bChangeWeapon. This variable is set when the player wants to change to another weapon. If this is the case the weapon goes to the 'DownWeapon' state. (see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Switching To Another Weapon]])

The next part applies only to [[Legacy:Bot (UT)|Bot (UT)]]s and checks if the weapon still has ammo and whether the bot still wants to shoot.

Now Finish checks whether the weapon still has ammo and the player still presses the (alt)fire button. If so the global (Alt)Fire function is called, if not the weapon goes into 'Idle' state.

==The 'Idle' State==

We are back where we started &amp;ndash; in the 'Idle' state. The weapon checks if it still has ammo. If not it switches to the best weapon available. If the player presses the (alt)fire button the cycle starts again, if not the weapon disables its AnimEnd function and plays its idle animation.

==Firing On A Network Client==

The client can't spawn projectiles or trace shots. Clients have to simulate the behavior of the weapon as good as possible, so the 'Client(Alt)Firing' state waits untill the firing animation is finished and checks whether the player still presses the (alt)fire button. If the player doesn't fire anymore the weapon plays its idle animation and goes into the null state (with &lt;code&gt;GotoState('');&lt;/code&gt;, the 'Idle' state is only used server-side).

The client code usually is completely different than the code used for the server-side behavior.

----

==Examples For Custom Firing Behavior==

===UT Bio Rifle===

The load-and-hold feature in the Bio Rifle's secondary firing mode is created by ignoring the AnimEnd function inside the 'AltFiring' state. Instead there is a check in the Tick function if the player still presses the altfire button. When the button is released the Bio Rifle goes into 'ShootLoad' state to fire its load.

When entering the 'ShootLoad' state a UT_BioGlob is fired and the corresponding animation is played. In this state AnimEnd is not ignored and executes the Finish function to end the firing sequence. (Don't get confused by the Timer function in this state, it isn't used.)

----

==Comments==

Please complain here if something isn't explained clearly enough.

'''HunterKiller:''' It's not a complain :) , Its a request. Can someone update this to UT2K3? I don't feel good enough to make the research and change (or make a new) firing a weapon page.

'''Wormbo:''' UT2k3 weapons work completely different, so it would be better to start a whole new page for that. Unfortunately I don't have the time to do all the research either. Somebody who made/makes a weapon mod could probably create the [[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]] page and subpages.

'''Eldhrin:''' I'm working with UT2K3 weapons quite a bit at the moment, so I might be able to start that off some time.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT Weapons Work/Picking Up A Weapon</title>
    <id>1389</id>
    <revision>
      <id>3519</id>
      <timestamp>2002-07-19T13:00:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">For now just a list of function calls:

(let's see how inventive your browser is with multiple bullet lists... ;))
* [[Legacy:Inventory (UT)|Inventory (UT)]].Pickup.Touch
** [[Legacy:Inventory (UT)|Inventory (UT)]].Pickup.ValidTouch
*** [[Legacy:GameInfo (UT)|GameInfo (UT)]].PickupQuery
**** [[Legacy:Mutator|Mutator]].HandlePickupQuery &amp;rarr; recursively called for all mutators
**** [[Legacy:Inventory (UT)|Inventory (UT)]].HandlePickupQuery &amp;rarr; recursively called for the player's inventory items
** [[Legacy:Weapon (UT)|Weapon (UT)]].SpawnCopy
*** [[Legacy:Inventory (UT)|Inventory (UT)]].GiveTo
**** [[Legacy:TournamentWeapon|TournamentWeapon]].BecomeItem
**** [[Legacy:Pawn (UT)|Pawn (UT)]].AddInventory
**** (weapon goes to state 'Idle2')
*** [[Legacy:Weapon (UT)|Weapon (UT)]].GiveAmmo
*** [[Legacy:Weapon (UT)|Weapon (UT)]].SetSwitchPriority
*** [[Legacy:Weapon (UT)|Weapon (UT)]].WeaponSet (if player's bNeverSwitchOnPickup is False) &amp;rarr; compares player's weapon with this one and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Switching To Another Weapon|switches]] to this weapon if it's better

To be cleaned up...

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT Weapons Work/Switching To Another Weapon</title>
    <id>1390</id>
    <revision>
      <id>3520</id>
      <timestamp>2002-08-15T17:07:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Switching weapons consists of two parts
#putting down the old weapon
#bringing up the new weapon

==Putting Down The Old Weapon==

Weapon changes can origin from different functions, like [[Legacy:PlayerPawn|PlayerPawn]].SwitchWeapon, .GetWeapon, .Prev/.NextWeapon or [[Legacy:Pawn (UT)|Pawn (UT)]].SwitchToBestWeapon. All these functions have a common structure:
#The pawn's PendingWeapon property is set to the new weapon.
#If the pawn's Weapon and PendingWeapon are already the same switching is aborted and nothing happens.
#If the pawn doesn't currently have a selected Weapon, PendingWeapon is brought up. Otherwise the current weapon's PutDown function is called. This function can in some cases abort the weapon change by returning False. (e.g. SwitchWeapon function)

==Bringing Up The New Weapon==

This part of the weapon change starts with the [[Legacy:Pawn (UT)|Pawn (UT)]].ChangedWeapon function. This function acts differently depending on whether Weapon and PendingWeapon are the same or not:

When the pawn has no weapon selected and no weapon to switch to (Weapon == PendingWeapon == None) then the SwitchToBestWeapon function is called. Otherwise if Weapon and PendingWeapon are the same and in &lt;tt&gt;DownWeapon&lt;/tt&gt; state, the weapon's BringUp function is called.

When Weapon and PendingWeapon are different and PendingWeapon is None it will be set to Weapon. Then the pawn's PlayWeaponSwitch function is called to play an animation for changing the weapon. When the PendingWeapon's mass is greater than 20 and the pawn caries a decoration, the DropDecoration function is called. Afterwards Weapon is set to PendingWeapon.

Then (in all cases) the selected weapon's SetDefaultDisplayProperties function is called and the pawn's inventory receives a ChangedWeapon call. The ChangedWeapon function of each item should call the ChangedWeapon function of the next item in the pawn's inventory chain. In case Weapon and PendingWeapon were different the weapon's RaiseUp function is called.

ChangedWeapon always returns with PendingWeapon set to None.

(...)

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3521</id>
      <timestamp>2002-07-19T13:00:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Switching weapons consists of two parts
#putting down the old weapon
#bringing up the new weapon

==Putting Down The Old Weapon==

Weapon changes can origin from different functions, like [[Legacy:PlayerPawn|PlayerPawn]].SwitchWeapon, .GetWeapon, .Prev/.NextWeapon or [[Legacy:Pawn (UT)|Pawn (UT)]].SwitchToBestWeapon. All these functions have a common structure:
#The pawn's PendingWeapon property is set to the new weapon.
#If the pawn's Weapon and PendingWeapon are already the same switching is aborted and nothing happens.
#If the pawn doesn't currently have a selected Weapon, PendingWeapon is brought up. Otherwise the current weapon's PutDown function is called. This function can in some cases abort the weapon change by returning False. (e.g. SwitchWeapon function)

==Bringing Up The New Weapon==

This part of the weapon change starts with the [[Legacy:Pawn (UT)|Pawn (UT)]].WeaponChanged function.

(...)

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT2003 Weapons Work</title>
    <id>1409</id>
    <revision>
      <id>3566</id>
      <timestamp>2006-04-07T08:00:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==Introduction==

Here you will find (I hope so) all info about the so much changed UT2003 firing system.

==Contents==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firing A Weapon]]
** [[Legacy:Firing InstantFire Weapons|Firing InstantFire Weapons]]
** [[Legacy:Firing Projectile Weapons|Firing Projectile Weapons]]
* [[Legacy:Weapon Mutator Tutorial|UTute3: Making a Weapon Mutator]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Teaching Bots To Use Your Weapon]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3567</id>
      <timestamp>2004-10-06T07:55:25Z</timestamp>
      <contributor>
        <ip>222-152-45-131.adsl.ihug.co.nz</ip>
      </contributor>
      <minor/>
      <comment>Modified page to put related link into body</comment>
      <text xml:space="preserve">==Introduction==

Here you will find (I hope so) all info about the so much changed UT2003 firing system.

==Contents==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firing A Weapon]]
** [[Legacy:Firing InstantFire Weapons|Firing InstantFire Weapons]]
** [[Legacy:Firing Projectile Weapons|Firing Projectile Weapons]]
* [[Legacy:Weapon Mutator Tutorial|UTute3: Making a Weapon Mutator]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Teaching Bots To Use Your Weapon]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3568</id>
      <timestamp>2006-04-06T21:06:22Z</timestamp>
      <contributor>
        <ip>ContentTelepuerto1.racsa.co.cr</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Introduction==

Here you will find (I hope so) all info about the so much changed UT2003 firing system.

==Contents==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firing A Weapon]]
** [[Legacy:Firing InstantFire Weapons|Firing InstantFire Weapons]]
** [[Legacy:Firing Projectile Weapons|Firing Projectile Weapons]]
* [[Legacy:Weapon Mutator Tutorial|UTute3: Making a Weapon Mutator]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Teaching Bots To Use Your Weapon]]

----

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT2003 Weapons Work/Firing A Weapon</title>
    <id>1410</id>
    <revision>
      <id>3569</id>
      <timestamp>2005-08-10T00:11:56Z</timestamp>
      <contributor>
        <ip>61.68.243.127</ip>
      </contributor>
      <minor/>
      <comment>Link at top</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: Firing A Weapon

==Intro==

While it's relatively easy to make a custom weapon by taking an existing one and monkeying about with the parameters, it's much harder to figure out the chain of events that cause a weapon to get fired.  The reason for this is twofold: first, much of the actual flow of control is done natively, so is not visible to the person browsing the UnrealScript code; secondly, there is a visible chain of method calls which looks right, until the trail suddenly peters out.

Trystan did excellent work deciphering this in the case of projectile weapons.  Although not originally intended to show the general case, this diagram shows important steps missing from the visible UnrealScript code:

===Flow of control===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

'''Note:''' There's a small error above.  The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.  

See [[Legacy:How Firing Doesn'T Work|How Firing Doesn't Work]] for an explanation of the &quot;decoy&quot; chain of events.

The flow of control is picked up at the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] class found in the weapon's array of fire modes. 

[[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] is responsible for creating the visual effects and applying damage. There are two main weapon fire types:

* [[Legacy:ProjectileFire|ProjectileFire]] - [[Legacy:Firing Projectile Weapons|Firing Projectile weapons]]
* [[Legacy:InstantFire|InstantFire]] - [[Legacy:Firing InstantFire Weapons|Firing InstantFire weapons]]

We will go on with the instant fire weapons; So, click that link! :)

==Comments==

'''CDeath:''' This is my first Wiki post.  My appoligies for any improper formatting.

I have been looking at the engine.  I think I understand how the UT2K4 firing stuff works.  Natively, what happens is that the engine calls the native TickAuthoritiative() function for every actor.  For weapons, this native function is called AWeapon::TickAuthoritative().

AWeapon::TickAuthoritative() does several test to make sure that the weapon should be ticked, is owned by a pawn, and stuff like that.  If everything looks good, then the native AWeapon::eventWeaponTick() is called.  eventWeaponTick() calls the uScript [[Legacy:Weapon|Weapon]].WeaponTick() function.

Next, AWeapon::TickAuthoritative() loops through the weapon’s FireMode array (each FireMode is a [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] object) and depending on a lot of flags will call some of the following functions:
* UWeaponFire::ModeTick() (a native function)
* AWeapon::eventServerStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStartFire())
* AWeapon::eventServerStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStopFire())
* AWeapon::eventClientStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStartFire())
* AWeapon::eventClientStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStopFire())

The native UWeaponFire::ModeTick() function calls UWeaponFire::eventTimer() (which calls the uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].Timer() function).  Then based on a lot of flags it will call some of the following functions:
* UWeaponFire::eventModeTick() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeTick())
* UWeaponFire::eventModeDoFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeDoFire())
* UWeaponFire::eventModeHoldFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeHoldFire())

So for a weapon, it looks like the sequence is:
* Weapon.WeaponTick();
* Weapon.FireMode[0].Timer()
* Weapon.FireMode[0].ModeTick()
* Weapon.FireMode[0].ModeDoFire()/ModeHoldFire()
* Weapon.FireMode[1].Timer()
* Weapon.FireMode[1].ModeTick()
* Weapon.FireMode[1].ModeDoFire()/ModeHoldFire()
* Weapon.ServerStartFire()/ServerStopFire()
* Weapon.ClientStartFire()/ClientStopFire()

What exactly gets called depends upon all sorts of things like your Role, TimerInterval, NextTimerPop, TimeSeconds, bIsFiring, bInstantStop, bFireOnRelease, HoldTime, MaxHoldTime, NextFireTime…

'''Wormbo:''' Thanks for the insights. I'd like to add, that the native UWeaponFire class corresponds to the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] Unrealscript class and AWeapon corresponds to UnrealScript's [[Legacy:Weapon|Weapon]] class. It's kinda obvious, but just to prevent confusion... :)

'''CDeath:''' Good catch.  I changed AWeapon to Weapon.  Internally, the engine prepends most native objects with either an 'A' or a 'U'.  The 'A' means that the object descends from [[Legacy:Actor|Actor]].

'''Sweavo:''' refactored some, it still has a way to go, but that diagram was the Holy Grail for me, and I agree with other contributors it needs to be front and center!

'''Tarquin:''' If you want to do an editable version of the diagram, tree markup might be useful:

+ User fires weapon

++ this happens

+++ and then this

++ that happens too

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3570</id>
      <timestamp>2005-08-08T18:49:56Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Intro==

While it's relatively easy to make a custom weapon by taking an existing one and monkeying about with the parameters, it's much harder to figure out the chain of events that cause a weapon to get fired.  The reason for this is twofold: first, much of the actual flow of control is done natively, so is not visible to the person browsing the UnrealScript code; secondly, there is a visible chain of method calls which looks right, until the trail suddenly peters out.

Trystan did excellent work deciphering this in the case of projectile weapons.  Although not originally intended to show the general case, this diagram shows important steps missing from the visible UnrealScript code:

===Flow of control===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

'''Note:''' There's a small error above.  The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.  

See [[Legacy:How Firing Doesn'T Work|How Firing Doesn't Work]] for an explanation of the &quot;decoy&quot; chain of events.

The flow of control is picked up at the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] class found in the weapon's array of fire modes. 

[[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] is responsible for creating the visual effects and applying damage. There are two main weapon fire types:

* [[Legacy:ProjectileFire|ProjectileFire]] - [[Legacy:Firing Projectile Weapons|Firing Projectile weapons]]
* [[Legacy:InstantFire|InstantFire]] - [[Legacy:Firing InstantFire Weapons|Firing InstantFire weapons]]

We will go on with the instant fire weapons; So, click that link! :)

==Comments==

'''CDeath:''' This is my first Wiki post.  My appoligies for any improper formatting.

I have been looking at the engine.  I think I understand how the UT2K4 firing stuff works.  Natively, what happens is that the engine calls the native TickAuthoritiative() function for every actor.  For weapons, this native function is called AWeapon::TickAuthoritative().

AWeapon::TickAuthoritative() does several test to make sure that the weapon should be ticked, is owned by a pawn, and stuff like that.  If everything looks good, then the native AWeapon::eventWeaponTick() is called.  eventWeaponTick() calls the uScript [[Legacy:Weapon|Weapon]].WeaponTick() function.

Next, AWeapon::TickAuthoritative() loops through the weapon’s FireMode array (each FireMode is a [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] object) and depending on a lot of flags will call some of the following functions:
* UWeaponFire::ModeTick() (a native function)
* AWeapon::eventServerStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStartFire())
* AWeapon::eventServerStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStopFire())
* AWeapon::eventClientStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStartFire())
* AWeapon::eventClientStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStopFire())

The native UWeaponFire::ModeTick() function calls UWeaponFire::eventTimer() (which calls the uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].Timer() function).  Then based on a lot of flags it will call some of the following functions:
* UWeaponFire::eventModeTick() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeTick())
* UWeaponFire::eventModeDoFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeDoFire())
* UWeaponFire::eventModeHoldFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeHoldFire())

So for a weapon, it looks like the sequence is:
* Weapon.WeaponTick();
* Weapon.FireMode[0].Timer()
* Weapon.FireMode[0].ModeTick()
* Weapon.FireMode[0].ModeDoFire()/ModeHoldFire()
* Weapon.FireMode[1].Timer()
* Weapon.FireMode[1].ModeTick()
* Weapon.FireMode[1].ModeDoFire()/ModeHoldFire()
* Weapon.ServerStartFire()/ServerStopFire()
* Weapon.ClientStartFire()/ClientStopFire()

What exactly gets called depends upon all sorts of things like your Role, TimerInterval, NextTimerPop, TimeSeconds, bIsFiring, bInstantStop, bFireOnRelease, HoldTime, MaxHoldTime, NextFireTime…

'''Wormbo:''' Thanks for the insights. I'd like to add, that the native UWeaponFire class corresponds to the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] Unrealscript class and AWeapon corresponds to UnrealScript's [[Legacy:Weapon|Weapon]] class. It's kinda obvious, but just to prevent confusion... :)

'''CDeath:''' Good catch.  I changed AWeapon to Weapon.  Internally, the engine prepends most native objects with either an 'A' or a 'U'.  The 'A' means that the object descends from [[Legacy:Actor|Actor]].

'''Sweavo:''' refactored some, it still has a way to go, but that diagram was the Holy Grail for me, and I agree with other contributors it needs to be front and center!

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3571</id>
      <timestamp>2005-08-08T19:11:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Intro==

While it's relatively easy to make a custom weapon by taking an existing one and monkeying about with the parameters, it's much harder to figure out the chain of events that cause a weapon to get fired.  The reason for this is twofold: first, much of the actual flow of control is done natively, so is not visible to the person browsing the UnrealScript code; secondly, there is a visible chain of method calls which looks right, until the trail suddenly peters out.

Trystan did excellent work deciphering this in the case of projectile weapons.  Although not originally intended to show the general case, this diagram shows important steps missing from the visible UnrealScript code:

===Flow of control===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

'''Note:''' There's a small error above.  The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.  

See [[Legacy:How Firing Doesn'T Work|How Firing Doesn't Work]] for an explanation of the &quot;decoy&quot; chain of events.

The flow of control is picked up at the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] class found in the weapon's array of fire modes. 

[[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] is responsible for creating the visual effects and applying damage. There are two main weapon fire types:

* [[Legacy:ProjectileFire|ProjectileFire]] - [[Legacy:Firing Projectile Weapons|Firing Projectile weapons]]
* [[Legacy:InstantFire|InstantFire]] - [[Legacy:Firing InstantFire Weapons|Firing InstantFire weapons]]

We will go on with the instant fire weapons; So, click that link! :)

==Comments==

'''CDeath:''' This is my first Wiki post.  My appoligies for any improper formatting.

I have been looking at the engine.  I think I understand how the UT2K4 firing stuff works.  Natively, what happens is that the engine calls the native TickAuthoritiative() function for every actor.  For weapons, this native function is called AWeapon::TickAuthoritative().

AWeapon::TickAuthoritative() does several test to make sure that the weapon should be ticked, is owned by a pawn, and stuff like that.  If everything looks good, then the native AWeapon::eventWeaponTick() is called.  eventWeaponTick() calls the uScript [[Legacy:Weapon|Weapon]].WeaponTick() function.

Next, AWeapon::TickAuthoritative() loops through the weapon’s FireMode array (each FireMode is a [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] object) and depending on a lot of flags will call some of the following functions:
* UWeaponFire::ModeTick() (a native function)
* AWeapon::eventServerStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStartFire())
* AWeapon::eventServerStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStopFire())
* AWeapon::eventClientStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStartFire())
* AWeapon::eventClientStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStopFire())

The native UWeaponFire::ModeTick() function calls UWeaponFire::eventTimer() (which calls the uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].Timer() function).  Then based on a lot of flags it will call some of the following functions:
* UWeaponFire::eventModeTick() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeTick())
* UWeaponFire::eventModeDoFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeDoFire())
* UWeaponFire::eventModeHoldFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeHoldFire())

So for a weapon, it looks like the sequence is:
* Weapon.WeaponTick();
* Weapon.FireMode[0].Timer()
* Weapon.FireMode[0].ModeTick()
* Weapon.FireMode[0].ModeDoFire()/ModeHoldFire()
* Weapon.FireMode[1].Timer()
* Weapon.FireMode[1].ModeTick()
* Weapon.FireMode[1].ModeDoFire()/ModeHoldFire()
* Weapon.ServerStartFire()/ServerStopFire()
* Weapon.ClientStartFire()/ClientStopFire()

What exactly gets called depends upon all sorts of things like your Role, TimerInterval, NextTimerPop, TimeSeconds, bIsFiring, bInstantStop, bFireOnRelease, HoldTime, MaxHoldTime, NextFireTime…

'''Wormbo:''' Thanks for the insights. I'd like to add, that the native UWeaponFire class corresponds to the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] Unrealscript class and AWeapon corresponds to UnrealScript's [[Legacy:Weapon|Weapon]] class. It's kinda obvious, but just to prevent confusion... :)

'''CDeath:''' Good catch.  I changed AWeapon to Weapon.  Internally, the engine prepends most native objects with either an 'A' or a 'U'.  The 'A' means that the object descends from [[Legacy:Actor|Actor]].

'''Sweavo:''' refactored some, it still has a way to go, but that diagram was the Holy Grail for me, and I agree with other contributors it needs to be front and center!

'''Tarquin:''' If you want to do an editable version of the diagram, tree markup might be useful:

+ User fires weapon

++ this happens

+++ and then this

++ that happens too

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42575</id>
      <timestamp>2010-03-02T13:01:51Z</timestamp>
      <contributor>
        <username>Braina</username>
        <id>2100</id>
      </contributor>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: Firing A Weapon

==Intro==

While it's relatively easy to make a custom weapon by taking an existing one and monkeying about with the parameters, it's much harder to figure out the chain of events that cause a weapon to get fired.  The reason for this is twofold: first, much of the actual flow of control is done natively, so is not visible to the person browsing the UnrealScript code; secondly, there is a visible chain of method calls which looks right, until the trail suddenly peters out.

Trystan did excellent work deciphering this in the case of projectile weapons.  Although not originally intended to show the general case, this diagram shows important steps missing from the visible UnrealScript code:

===Flow of control===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

'''Note:''' There's a small error above.  The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.  

See [[Legacy:How Firing Doesn'T Work|How Firing Doesn't Work]] for an explanation of the &quot;decoy&quot; chain of events.

The flow of control is picked up at the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] class found in the weapon's array of fire modes. 

[[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] is responsible for creating the visual effects and applying damage. There are two main weapon fire types:

* [[Legacy:ProjectileFire|ProjectileFire]] - [[Legacy:Firing Projectile Weapons|Firing Projectile weapons]]
* [[Legacy:InstantFire|InstantFire]] - [[Legacy:Firing InstantFire Weapons|Firing InstantFire weapons]]

We will go on with the instant fire weapons; So, click that link! :)

==Comments==

'''CDeath:''' This is my first Wiki post.  My appoligies for any improper formatting.

I have been looking at the engine.  I think I understand how the UT2K4 firing stuff works.  Natively, what happens is that the engine calls the native TickAuthoritiative() function for every actor.  For weapons, this native function is called AWeapon::TickAuthoritative().

AWeapon::TickAuthoritative() does several test to make sure that the weapon should be ticked, is owned by a pawn, and stuff like that.  If everything looks good, then the native AWeapon::eventWeaponTick() is called.  eventWeaponTick() calls the uScript [[Legacy:Weapon|Weapon]].WeaponTick() function.

Next, AWeapon::TickAuthoritative() loops through the weapon’s FireMode array (each FireMode is a [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] object) and depending on a lot of flags will call some of the following functions:
* UWeaponFire::ModeTick() (a native function)
* AWeapon::eventServerStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStartFire())
* AWeapon::eventServerStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStopFire())
* AWeapon::eventClientStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStartFire())
* AWeapon::eventClientStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStopFire())

The native UWeaponFire::ModeTick() function calls UWeaponFire::eventTimer() (which calls the uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].Timer() function).  Then based on a lot of flags it will call some of the following functions:
* UWeaponFire::eventModeTick() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeTick())
* UWeaponFire::eventModeDoFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeDoFire())
* UWeaponFire::eventModeHoldFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeHoldFire())

So for a weapon, it looks like the sequence is:
* Weapon.WeaponTick();
* Weapon.FireMode[0].Timer()
* Weapon.FireMode[0].ModeTick()
* Weapon.FireMode[0].ModeDoFire()/ModeHoldFire()
* Weapon.FireMode[1].Timer()
* Weapon.FireMode[1].ModeTick()
* Weapon.FireMode[1].ModeDoFire()/ModeHoldFire()
* Weapon.ServerStartFire()/ServerStopFire()
* Weapon.ClientStartFire()/ClientStopFire()

What exactly gets called depends upon all sorts of things like your Role, TimerInterval, NextTimerPop, TimeSeconds, bIsFiring, bInstantStop, bFireOnRelease, HoldTime, MaxHoldTime, NextFireTime…

'''Wormbo:''' Thanks for the insights. I'd like to add, that the native UWeaponFire class corresponds to the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] Unrealscript class and AWeapon corresponds to UnrealScript's [[Legacy:Weapon|Weapon]] class. It's kinda obvious, but just to prevent confusion... :)

'''CDeath:''' Good catch.  I changed AWeapon to Weapon.  Internally, the engine prepends most native objects with either an 'A' or a 'U'.  The 'A' means that the object descends from [[Legacy:Actor|Actor]].

'''Sweavo:''' refactored some, it still has a way to go, but that diagram was the Holy Grail for me, and I agree with other contributors it needs to be front and center!

'''Tarquin:''' If you want to do an editable version of the diagram, tree markup might be useful:

+ User fires weapon

++ this happens

+++ and then this

++ that happens too

[[Category:Legacy Refactor Me|{{PAGENAME}}]]

For more details look [http://www.essaymill.com research paper topics]</text>
    </revision>
    <revision>
      <id>42577</id>
      <timestamp>2010-03-02T22:29:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Braina|Braina]] ([[User talk:Braina|Talk]]) to last revision by [[User:61.68.243.127|61.68.243.127]]</comment>
      <text xml:space="preserve">[[Legacy:How UT2003 Weapons Work|How UT2003 Weapons Work]]: Firing A Weapon

==Intro==

While it's relatively easy to make a custom weapon by taking an existing one and monkeying about with the parameters, it's much harder to figure out the chain of events that cause a weapon to get fired.  The reason for this is twofold: first, much of the actual flow of control is done natively, so is not visible to the person browsing the UnrealScript code; secondly, there is a visible chain of method calls which looks right, until the trail suddenly peters out.

Trystan did excellent work deciphering this in the case of projectile weapons.  Although not originally intended to show the general case, this diagram shows important steps missing from the visible UnrealScript code:

===Flow of control===

[[Image:Legacy_projectilefireflow.jpeg|center|Projectile Fire Flowchart]]

'''Note:''' There's a small error above.  The ProcessTouch function isn't called by the engine. Instead the engine calls the Touch function which calculates the exact hitlocation and calls ProcessTouch.

===In English===

The player hits the Fire button.  The engine then executes the alias attached to Fire.  The alias fire is set to Button bFire, and the exec command Fire().  Check [[Legacy:Binding Keys|aliases]] for more information on how this works but basically bFire is a boolean variable that is automatically set by the engine to true when the fire button is being held down, and false when the fire button is released.  The engine has a native event set such that when bFire is held down the Pawn.Weapons.WeaponFire.ModeDoFire() is called.  As well PlayerController.Fire() is called.  It's important to note that these are two distinctly separate chains of events.  

See [[Legacy:How Firing Doesn'T Work|How Firing Doesn't Work]] for an explanation of the &quot;decoy&quot; chain of events.

The flow of control is picked up at the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] class found in the weapon's array of fire modes. 

[[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] is responsible for creating the visual effects and applying damage. There are two main weapon fire types:

* [[Legacy:ProjectileFire|ProjectileFire]] - [[Legacy:Firing Projectile Weapons|Firing Projectile weapons]]
* [[Legacy:InstantFire|InstantFire]] - [[Legacy:Firing InstantFire Weapons|Firing InstantFire weapons]]

We will go on with the instant fire weapons; So, click that link! :)

==Comments==

'''CDeath:''' This is my first Wiki post.  My appoligies for any improper formatting.

I have been looking at the engine.  I think I understand how the UT2K4 firing stuff works.  Natively, what happens is that the engine calls the native TickAuthoritiative() function for every actor.  For weapons, this native function is called AWeapon::TickAuthoritative().

AWeapon::TickAuthoritative() does several test to make sure that the weapon should be ticked, is owned by a pawn, and stuff like that.  If everything looks good, then the native AWeapon::eventWeaponTick() is called.  eventWeaponTick() calls the uScript [[Legacy:Weapon|Weapon]].WeaponTick() function.

Next, AWeapon::TickAuthoritative() loops through the weapon’s FireMode array (each FireMode is a [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] object) and depending on a lot of flags will call some of the following functions:
* UWeaponFire::ModeTick() (a native function)
* AWeapon::eventServerStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStartFire())
* AWeapon::eventServerStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ServerStopFire())
* AWeapon::eventClientStartFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStartFire())
* AWeapon::eventClientStopFire() (calls uScript [[Legacy:Weapon|Weapon]].ClientStopFire())

The native UWeaponFire::ModeTick() function calls UWeaponFire::eventTimer() (which calls the uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].Timer() function).  Then based on a lot of flags it will call some of the following functions:
* UWeaponFire::eventModeTick() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeTick())
* UWeaponFire::eventModeDoFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeDoFire())
* UWeaponFire::eventModeHoldFire() (calls uScript [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].ModeHoldFire())

So for a weapon, it looks like the sequence is:
* Weapon.WeaponTick();
* Weapon.FireMode[0].Timer()
* Weapon.FireMode[0].ModeTick()
* Weapon.FireMode[0].ModeDoFire()/ModeHoldFire()
* Weapon.FireMode[1].Timer()
* Weapon.FireMode[1].ModeTick()
* Weapon.FireMode[1].ModeDoFire()/ModeHoldFire()
* Weapon.ServerStartFire()/ServerStopFire()
* Weapon.ClientStartFire()/ClientStopFire()

What exactly gets called depends upon all sorts of things like your Role, TimerInterval, NextTimerPop, TimeSeconds, bIsFiring, bInstantStop, bFireOnRelease, HoldTime, MaxHoldTime, NextFireTime…

'''Wormbo:''' Thanks for the insights. I'd like to add, that the native UWeaponFire class corresponds to the [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] Unrealscript class and AWeapon corresponds to UnrealScript's [[Legacy:Weapon|Weapon]] class. It's kinda obvious, but just to prevent confusion... :)

'''CDeath:''' Good catch.  I changed AWeapon to Weapon.  Internally, the engine prepends most native objects with either an 'A' or a 'U'.  The 'A' means that the object descends from [[Legacy:Actor|Actor]].

'''Sweavo:''' refactored some, it still has a way to go, but that diagram was the Holy Grail for me, and I agree with other contributors it needs to be front and center!

'''Tarquin:''' If you want to do an editable version of the diagram, tree markup might be useful:

+ User fires weapon

++ this happens

+++ and then this

++ that happens too

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:How UT2003 Weapons Work/Teaching Bots To Use Your Weapon</title>
    <id>1411</id>
    <revision>
      <id>3572</id>
      <timestamp>2005-05-01T17:49:40Z</timestamp>
      <contributor>
        <ip>JonAzz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

Bots don't understand the most obvious thing about your weapon.  I don't care if it's just another machinegun or yet another shotgun.  The truth is, it might as well be a stick of wood for all they care.  Fortunatly, the bot does know how to pull a trigger, so it can handle that.  Unfortunatly, it doesn't know what the trigger does or whether your superdoopershotgun is better than the wet noodle it can also choose from.  Even if it can make a choice, there's probably more than one way to use your weapon, assuming there's an alt-fire function. This all means we're going to have to do a little work to make the weapon bot-friendly.

First, in any function you've got to get a handle for a bot.  This is done like this:

&lt;uscript&gt;
local Bot B;

B = Bot(Instigator.Controller);
&lt;/uscript&gt;

And then running off and doing whatever we're going to do with it.  I'm using examples from my work on the [[Legacy:Mod_Ideas/Semigib_Onslaught|Mod_Ideas/Semigib_Onslaught]] mutator

==Bot variables==
; Pawn Enemy : The pawn the bot is hunting/fighting with (not used normally since Target is the real meat)
; Actor Target : Whatever the bot is shooting at
; bool bFire : 1 if the primary fire mode is selected
; bool bAltFire : 1 if the alt-fire mode is selected

==Weapon Functions==
; function float RangedAttackTime() : Time for the bot to wait between attacks.
; function bool RecommendRangedAttack() : Unknown, What is defined as &quot;Ranged&quot; in the UT engine? This is false by default, and ranged weapons don't seem to be bothered by this.
; function bool RecommendLongRangedAttack() : Unknown, What is defined as &quot;Long Ranged&quot; in the UT engine? This is false by default, and ranged weapons don't seem to be bothered by this.
; function bool FocusOnLeader(bool bLeaderFiring) : return true if the bot should focus on the leader of it's Squad.  The best example of this is the Link Gun.
; function bool SplashDamage() : return true if weapon effect has splash damage (if significant), used by bot to avoid hurting self.  It should be based on current firing Mode if active
; function bool RecommendSplashDamage() : return true if weapon should be fired to take advantage of splash damage.  For example, rockets should be fired at enemy feet
; function float GetDamageRadius() : return the damage radius of the splash damage.
; function float RefireRate() : Repeater weapons like minigun should be 0.99, other weapons based on likelihood of firing again right away
; function bool FireOnRelease() : tells AI that it needs to release the fire button for this weapon to do anything
; function byte BestMode() : choose between regular or alt-fire, 0 is regular, 1 is alt-fire.

Note: This is for the Instagib Linkgun.  The primary fire is only useful for other xPawns, and thus the secondary fire is chosen if the bot is targeting a xPawn.  Of course, the primary fire doesn't help teammates, so the check for teams had to be added as well

&lt;uscript&gt;
function byte BestMode()
{
	local bot B;

	B = Bot(Instigator.Controller);
	if (( B == None ) || ((xPawn(B.Target) != none) &amp;&amp; (xPawn(B.Target).PlayerReplicationInfo.Team != Instigator.Controller.Pawn.PlayerReplicationInfo.Team)))
		return 0;

	return 1;
}
&lt;/uscript&gt;
; function bool BotFire(bool bFinished, optional name FiringMode) : called by NPC firing weapon. Weapon chooses appropriate firing Mode to use (typically no change) bFinished should only be true if called from the Finished() function FiringMode can be passed in to specify a firing Mode (used by scripted sequences)
; simulated function float RateSelf() : need to figure out modified rating based on enemy/tactical situation. The range is -2 to 2, the higher the better.
; function float GetAIRating() : Returns the AI Rating for the weapon ranged from -2.0 to 2.0.  This is the real meat of the rating system.  It's what is used, along with a bot's personal opinion of the weapon (this is where the &quot;favorite weapon&quot; comes into play) comes into effect and is actually used when the bot trys to descide which weapon to bring up.

&lt;uscript&gt;
function float GetAIRating()
{

    local Bot B;

	B = Bot(Instigator.Controller);
	if (B == None)
		return AIRating;

    if ( (B.Enemy == None) &amp;&amp; (B.Target == none) &amp;&amp; (AmmoCharge[0] &gt;= FireMode[0].AmmoClass.default.AmmoAmount))
       return -2.0;

	if (xPawn(B.Target) != none)
	   return 2.0;

    if (Vehicle(B.Target) != none)
       return 1.2;

    if (VSize( Instigator.Location - B.Target.Location) &gt; LinkFire(FireMode[1]).TraceRange)
       return -2.0;

    return AIRating;
}
&lt;/uscript&gt;
; function float SuggestAttackStyle() : tells bot whether to charge or back off while using this weapon (negative = run away, positive = run towards)
; function float SuggestDefenseStyle() : tells bot whether to charge or back off while defending against this weapon (negative = run away, positive = run towards)
; function bool SplashJump() : return true if recommend jumping while firing to improve splash damage (by shooting at feet) true for R.L., for example
; function bool CanAttack(Actor Other) : return false if out of range, can't see target, etc. otherwise, if the bot can attack then return true.

In this case, I had to let the bot know that the link beam has a limited range.

&lt;uscript&gt;
function bool CanAttack(Actor Other)
{
    local bot B;

	B = Bot(Instigator.Controller);
    if (B == none)
       return true;

    if (( B.bAltFire == 1 ) &amp;&amp; ( VSize( Instigator.Location - Other.Location) &gt; LinkFire(FireMode[1]).TraceRange))
       return false;

    return true;
}
&lt;/uscript&gt;

==Comments==

'''Enigmatic:''' OK, I probably could use a etter name/location for this mess, but I think it's a pretty solid block of something at least

'''JonAzz:''' What signifigance does this function have in any of this? 

&lt;uscript&gt;
static function float GetRange()
{
	if (default.LifeSpan == 0.0)
		return 15000;
	else
		return (default.MaxSpeed * default.LifeSpan);
}
&lt;/uscript&gt;

this is from UT2004... I can't find a UT2004 version, but I am assuming they are similar...somewhat.</text>
    </revision>
    <revision>
      <id>3573</id>
      <timestamp>2004-05-03T19:07:17Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>Updated with examples</comment>
      <text xml:space="preserve">==Overview==

Bots don't understand the most obvious thing about your weapon.  I don't care if it's just another machinegun or yet another shotgun.  The truth is, it might as well be a stick of wood for all they care.  Fortunatly, the bot does know how to pull a trigger, so it can handle that.  Unfortunatly, it doesn't know what the trigger does or whether your superdoopershotgun is better than the wet noodle it can also choose from.  Even if it can make a choice, there's probably more than one way to use your weapon, assuming there's an alt-fire function. This all means we're going to have to do a little work to make the weapon bot-friendly.

First, in any function you've got to get a handle for a bot.  This is done like this:

&lt;uscript&gt;
local Bot B;

B = Bot(Instigator.Controller);
&lt;/uscript&gt;

And then running off and doing whatever we're going to do with it.  I'm using examples from my work on the [[Legacy:Mod_Ideas/Semigib_Onslaught|Mod_Ideas/Semigib_Onslaught]] mutator

==Bot variables==
; Pawn Enemy : The pawn the bot is hunting/fighting with (not used normally since Target is the real meat)
; Actor Target : Whatever the bot is shooting at
; bool bFire : 1 if the primary fire mode is selected
; bool bAltFire : 1 if the alt-fire mode is selected

==Weapon Functions==
; function float RangedAttackTime() : Time for the bot to wait between attacks.
; function bool RecommendRangedAttack() : Unknown, What is defined as &quot;Ranged&quot; in the UT engine? This is false by default, and ranged weapons don't seem to be bothered by this.
; function bool RecommendLongRangedAttack() : Unknown, What is defined as &quot;Long Ranged&quot; in the UT engine? This is false by default, and ranged weapons don't seem to be bothered by this.
; function bool FocusOnLeader(bool bLeaderFiring) : return true if the bot should focus on the leader of it's Squad.  The best example of this is the Link Gun.
; function bool SplashDamage() : return true if weapon effect has splash damage (if significant), used by bot to avoid hurting self.  It should be based on current firing Mode if active
; function bool RecommendSplashDamage() : return true if weapon should be fired to take advantage of splash damage.  For example, rockets should be fired at enemy feet
; function float GetDamageRadius() : return the damage radius of the splash damage.
; function float RefireRate() : Repeater weapons like minigun should be 0.99, other weapons based on likelihood of firing again right away
; function bool FireOnRelease() : tells AI that it needs to release the fire button for this weapon to do anything
; function byte BestMode() : choose between regular or alt-fire, 0 is regular, 1 is alt-fire.

Note: This is for the Instagib Linkgun.  The primary fire is only useful for other xPawns, and thus the secondary fire is chosen if the bot is targeting a xPawn.  Of course, the primary fire doesn't help teammates, so the check for teams had to be added as well

&lt;uscript&gt;
function byte BestMode()
{
	local bot B;

	B = Bot(Instigator.Controller);
	if (( B == None ) || ((xPawn(B.Target) != none) &amp;&amp; (xPawn(B.Target).PlayerReplicationInfo.Team != Instigator.Controller.Pawn.PlayerReplicationInfo.Team)))
		return 0;

	return 1;
}
&lt;/uscript&gt;
; function bool BotFire(bool bFinished, optional name FiringMode) : called by NPC firing weapon. Weapon chooses appropriate firing Mode to use (typically no change) bFinished should only be true if called from the Finished() function FiringMode can be passed in to specify a firing Mode (used by scripted sequences)
; simulated function float RateSelf() : need to figure out modified rating based on enemy/tactical situation. The range is -2 to 2, the higher the better.
; function float GetAIRating() : Returns the AI Rating for the weapon ranged from -2.0 to 2.0.  This is the real meat of the rating system.  It's what is used, along with a bot's personal opinion of the weapon (this is where the &quot;favorite weapon&quot; comes into play) comes into effect and is actually used when the bot trys to descide which weapon to bring up.

&lt;uscript&gt;
function float GetAIRating()
{

    local Bot B;

	B = Bot(Instigator.Controller);
	if (B == None)
		return AIRating;

    if ( (B.Enemy == None) &amp;&amp; (B.Target == none) &amp;&amp; (AmmoCharge[0] &gt;= FireMode[0].AmmoClass.default.AmmoAmount))
       return -2.0;

	if (xPawn(B.Target) != none)
	   return 2.0;

    if (Vehicle(B.Target) != none)
       return 1.2;

    if (VSize( Instigator.Location - B.Target.Location) &gt; LinkFire(FireMode[1]).TraceRange)
       return -2.0;

    return AIRating;
}
&lt;/uscript&gt;
; function float SuggestAttackStyle() : tells bot whether to charge or back off while using this weapon (negative = run away, positive = run towards)
; function float SuggestDefenseStyle() : tells bot whether to charge or back off while defending against this weapon (negative = run away, positive = run towards)
; function bool SplashJump() : return true if recommend jumping while firing to improve splash damage (by shooting at feet) true for R.L., for example
; function bool CanAttack(Actor Other) : return false if out of range, can't see target, etc. otherwise, if the bot can attack then return true.

In this case, I had to let the bot know that the link beam has a limited range.

&lt;uscript&gt;
function bool CanAttack(Actor Other)
{
    local bot B;

	B = Bot(Instigator.Controller);
    if (B == none)
       return true;

    if (( B.bAltFire == 1 ) &amp;&amp; ( VSize( Instigator.Location - Other.Location) &gt; LinkFire(FireMode[1]).TraceRange))
       return false;

    return true;
}
&lt;/uscript&gt;

==Comments==

'''Enigmatic:''' OK, I probably could use a etter name/location for this mess, but I think it's a pretty solid block of something at least</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hsoolien</title>
    <id>1421</id>
    <revision>
      <id>3596</id>
      <timestamp>2005-01-16T16:39:29Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Welcome.</comment>
      <text xml:space="preserve">I'm Russell &quot;Hsoolien Sgarm&quot; Ward

I've been part of the UTxx commmunity as a mapper for UT99 (CTF-Knot, CTF-Knot][ and DM-UC-Lunar, I think they are all on Unreal Playgorund) and a coder for UT2004 (once I realized I was not cut out to be a high poly mapper)

I am also admin at http://www.planetunreal.com/unrealcore which is temprarily foobared by a recent hack at PU and the fact that either one of us admins (myself or Rev) always seem to be having some sort of RL crisis. I'm a regular at the ina/atari UT200xboards.

My UScript like all my knowledge is about 90% Selt taught with the WIKI making up about 50% of the remaining 10%

----

Current projects of mine include:

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=378754 Random Vehicle Factory]

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=388329&amp;highlight Explosive/Destoyable Health]

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=397207 Health GoopGun]

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=441946 Onslaught Vehicle Plus]

[http://www.unrealcore.net/forums/viewtopic.php?t=710 Trans Redeemer]

[http://www.unrealcore.net/forums/viewtopic.php?t=714 Vehicle Ejector]

[http://www.ina-community.com/forums/showthread.php?s=6febd1c9f3af351e1d1f6ebe967945c2&amp;threadid=405455 vCTF Flag Control]

[http://www.ina-community.com/forums/showthread.php?s=6febd1c9f3af351e1d1f6ebe967945c2&amp;threadid=402861 HSO InstaGib]

==Guest Book==

'''EntropicLqd:''' Hi, Welcome to the Wiki, enjoy your stay.  Glad you've found the Wiki useful so far.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3597</id>
      <timestamp>2005-01-16T08:27:17Z</timestamp>
      <contributor>
        <ip>Hsoolien</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I'm Russell &quot;Hsoolien Sgarm&quot; Ward

I've been part of the UTxx commmunity as a mapper for UT99 (CTF-Knot, CTF-Knot][ and DM-UC-Lunar, I think they are all on Unreal Playgorund) and a coder for UT2004 (once I realized I was not cut out to be a high poly mapper)

I am also admin at http://www.planetunreal.com/unrealcore which is temprarily foobared by a recent hack at PU and the fact that either one of us admins (myself or Rev) always seem to be having some sort of RL crisis. I'm a regular at the ina/atari UT200xboards.

My UScript like all my knowledge is about 90% Selt taught with the WIKI making up about 50% of the remaining 10%

----

Current projects of mine include:

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=378754 Random Vehicle Factory]

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=388329&amp;highlight Explosive/Destoyable Health]

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=397207 Health GoopGun]

[http://www.ina-community.com/forums/showthread.php?s=5c9d64c143977cd3c384f472d19006e3&amp;threadid=441946 Onslaught Vehicle Plus]

[http://www.unrealcore.net/forums/viewtopic.php?t=710 Trans Redeemer]

[http://www.unrealcore.net/forums/viewtopic.php?t=714 Vehicle Ejector]

[http://www.ina-community.com/forums/showthread.php?s=6febd1c9f3af351e1d1f6ebe967945c2&amp;threadid=405455 vCTF Flag Control]

[http://www.ina-community.com/forums/showthread.php?s=6febd1c9f3af351e1d1f6ebe967945c2&amp;threadid=402861 HSO InstaGib]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudBBombingRun</title>
    <id>28667</id>
    <revision>
      <id>40523</id>
      <timestamp>2010-01-14T09:05:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudBCaptureTheFlag</title>
    <id>28871</id>
    <revision>
      <id>42798</id>
      <timestamp>2010-03-30T16:20:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudBDeathMatch</title>
    <id>28269</id>
    <revision>
      <id>39926</id>
      <timestamp>2009-11-14T18:04:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudBDoubleDomination</title>
    <id>28469</id>
    <revision>
      <id>40168</id>
      <timestamp>2009-11-17T10:49:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudBTeamDeathMatch</title>
    <id>1449</id>
    <revision>
      <id>3647</id>
      <timestamp>2007-12-24T06:17:42Z</timestamp>
      <contributor>
        <ip>C-67-180-168-181.hsd1.ca.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Default Hud for UT2003 TDM.

Use HudCTeamMatch for ut2004</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudBase</title>
    <id>1408</id>
    <revision>
      <id>3564</id>
      <timestamp>2004-11-16T18:01:47Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>HudCDeathMatch link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD|HUD]] &gt;&gt; HudBase (Package: xInterface)}}

The base class of all UT2003 and UT2004 HUDs.

==Properties==
; int TeamIndex (transient) : 
; ERenderStyle PassStyle (transient) : For debugging.
; HudLocalizedMessage LocalMessages[8] (transient) : All special [[Legacy:LocalMessage|LocalMessage]]s and text messages sent as 'CriticalEvent' are stored in a HudLocalizedMessage struct. Death messages and other &quot;non-special&quot; (bSpecial=False) [[Legacy:LocalMessage|LocalMessage]]s are not stored here.
; class&lt;[[Legacy:Actor|Actor]]&gt; VoteMenuClass : Hook for mod authors.
; [[Legacy:Material|Material]] TargetMaterial : A meterial used to mark a targetted object. Currently only used by the BR BallLauncher's secondary firing mode.
; bool bShowTargeting (transient) : Whether a target has been aquired.
; vector TargetingLocation (transient) : Where the target is.
; float TargetingSize (transient) : The target's size.
; string InstructionText : 
; string InstructionKeyText : 
; float InstructTextBorderX : 
; float InstructTextBorderY : 
; float InstrDelta : 
; float InstrRate : 
; string InstructionFontName (localized) : 
; font InstructionFontFont : 
; byte FontsPrecached : 
; bool DoCropping : 
; float CroppingAmount : 
; [[Legacy:Material|Material]] CroppingMaterial : 
; string LastWeaponName : 
; float WeaponDrawTimer : 
; color WeaponDrawColor : 
; bool bHideWeaponName (globalconfig) : Hides the name of the weapon the player just switched to.

==Structs==

===DigitSet===

A set of digits stored in one texture.
; [[Legacy:Material|Material]] DigitTexture : The texture containing the digits.
; IntBox TextureCoords[11] : The coordinates of the digits. 0-9, 11th element is negative sign. IntBox is one if the [[Legacy:Built-In Struct|Built-In Struct]].

===SpriteWidget===

Describes a single HUD element which can be drawn using the DrawSpriteWidget native function.
; [[Legacy:Material|Material]] WidgetTexture : The texture that contains the HUD element.
; ERenderStyle RenderStyle : The rendering style of this HUD element. (see [[Legacy:Actor/Enums|Actor/Enums]])
; IntBox TextureCoords : The position of the element in the specified material.
; float TextureScale : The scale that is applied to the texture, relative to a screen resolution of 640 x 480 pixels (that means: at that screen resolution a sprite with TextureScale=1.0 will be drawn one-to-one; at other screen resolutions it will be proportionally scaled up or down).
; EDrawPivot DrawPivot : Specifies the sprite's point of reference (see [[Legacy:Object|Object]]/Enums).  The given pixel position corresponds with this point on the sprite (for instance, its upper-right corner).
; float PosX &lt;br /&gt;float PosY : The relative screen location of the HUD element. Range from 0.0 to 1.0.
; int OffsetX &lt;br /&gt;int OffsetY : Extra offset of the texture part. This is scaled with the texture, so only in 640x480 and with a TextureScale of 1.0 one unit here corresponds to an actual pixel on the screen. If you want to move the widget to the right from the position given via PosX/Y by exactly the final width of the widget you would enter exactly that width for OffsetX.
; EScaleMode ScaleMode : From what direction the scale is applied (see EScaleMode enum below). The side that is cut off 1st. (Left for the ammo count and WeaponBar.)
; float Scale : This specifies, how much of the widget is visible. This is used together with ScaleMode and cuts off a part of the widget if set to values less than 1.0.
; color Tints[2] : The draw colors that should be used when this HUD element is drawn for the different teams. Team 0 is red in UT2003 and team 1 (also used in non-team games) is blue.

===NumericWidget===

Describes a HUD element which can be drawn using the DrawNumericWidget native function. Draws numbers on the screen. (uses a DigitSet)
; ERenderStyle RenderStyle : The rendering style of this HUD element. (see [[Legacy:Actor/Enums|Actor/Enums]])
; int MinDigitCount : This specifies the minimum width of the numeric widget, i.e. how much space is reserved for more digits.
; float TextureScale : The scale that is applied to the texture, works like for SpriteWidgets.
; EDrawPivot DrawPivot : (see [[Legacy:Object|Object]]/Enums) This point is used as &quot;Center&quot; of texture
; float PosX &lt;br /&gt;float PosY : The screen location of the HUD element. Range from 0.0 to 1.0
; int OffsetX &lt;br /&gt;

int OffsetY : Additional offset which is scaled with the widget.
; color Tints[2] : The draw colors that should be used when this HUD element is drawn for the different teams.
; int bPadWithZeroes : Whether leading zeroes should fill up the minimum width specified in MinDigitCount.
; int Value (transient) : The actual number that is put on the screen when the widget is drawn.

===HudLocalizedMessage===

Represents a [[Legacy:LocalMessage|LocalMessage]] that should be rendered on the HUD.

The following block of variables are set when the message is entered (Message being set indicates that a message is in the list).
; class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message : The message class.
; String StringMessage : A display string for string messages.
; int Switch : The message's switch value.
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI, RelatedPRI2 : The related PRIs.
; [[Legacy:Object|Object]] OptionalObject : An optional object for the message.
; float EndOfLife : The level time index when the messages should be removed.
; float LifeTime : How long the message should be displayed.

The following block of variables are cached on first render (StringFont being set indicates that they've been rendered).
; Font StringFont : 
; color DrawColor : 
; EDrawPivot DrawPivot : 
; [[Legacy:LocalMessage|LocalMessage]].EStackMode StackMode : The message's stack mode when displaying multiple messages that have the same PosX/Y. (see [[Legacy:LocalMessage|LocalMessage]] for the enum declaration)
; float PosX, PosY : Relative screen position of the message.
; float DX, DY : The actual size in pixels.
; bool Drawn : Whether the message was drawn this frame. (Used for managing stacked messages.)

==Enums==

===EScaleMode===
; SM_None : 
; SM_Up : 
; SM_Down : 
; SM_Left : 
; SM_Right : 

==Methods==

Almost all HUD functions are simulated, exceptions are mentioned below. However, since a HUD is always a client-side actor the simulated keywords don't seem to be neccessary here.

===Inherited From [[Legacy:Actor|Actor]]===

===Inherited From [[Legacy:HUD|HUD]]===
; DrawHud ([[Legacy:Canvas|Canvas]] C) : Calls the different HUD drawing stages in the following order: UpdateHud, DrawTargeting (if bShowTargetting), DrawHudPassA (with draw style STY_Alpha), DrawHudPassB (with draw style STY_Additive), DrawHudPassC (with draw style STY_Alpha again), DrawHudPassD (with draw style STY_None), DisplayLocalMessages and finally DrawWeaponName.

===Native Functions===
; DrawSpriteWidget ([[Legacy:Canvas|Canvas]] C, out SpriteWidget W) [simulated, final] : Draws the HUD element described by the SpriteWidget W.
; DrawNumericWidget ([[Legacy:Canvas|Canvas]] C, out NumericWidget W, out DigitSet D) [simulated, final] : Draws a number.

===Drawing Functions===

No draw code should be in derived HUDs' DrawHud function, they should instead override DrawHudPass[A-D] and call their base class' DrawHudPass[A-D]. This cuts down on render state changes.

'''Note:''' The DrawSpriteWidget() and DrawNumericWidget() functions will create a log warning when encountering a different draw style than the current drawing pass expects. If you need to use a different DrawStyle setting for the widget or really need to mix up DrawStyles you should use the alternate drawing pass, i.e. DrawHudPassD().
; UpdateHud ( ) : Updates the HUD right before it is rendered. You should use this to update your SpriteWidgets and NumericWidgets as well as other variables storing values for drawing the HUD.
; DrawHudPassA ([[Legacy:Canvas|Canvas]] C) : First drawing pass with STY_Alpha.
; DrawHudPassB ([[Legacy:Canvas|Canvas]] C) : Drawing pass with STY_Additive.
; DrawHudPassC ([[Legacy:Canvas|Canvas]] C) : Second drawing pass with STY_alpha.
; DrawHudPassD ([[Legacy:Canvas|Canvas]] C) : Alternate drawing pass.

===Other Functions===

==Known Subclasses==
* [[Legacy:HudBDeathMatch|HudBDeathMatch]] (for UT2003)
* [[Legacy:HudCDeathMatch|HudCDeathMatch]] (for UT2004)

==Related Topics==

* [[Legacy:Mod Authoring For UT2K3/HUD|Mod Authoring For UT2K3/HUD]] &amp;ndash; There is a lot of stuff on this page about properties that should probably be moved to here

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3565</id>
      <timestamp>2004-06-10T17:39:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>There is a lot of stuff on this page about properties that should probably be moved to here</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:HUD|HUD]] &gt;&gt; HudBase (Package: xInterface)}}

The base class of all UT2003 HUDs.

==Properties==
; int TeamIndex (transient) : 
; ERenderStyle PassStyle (transient) : For debugging.
; HudLocalizedMessage LocalMessages[8] (transient) : All special [[Legacy:LocalMessage|LocalMessage]]s and text messages sent as 'CriticalEvent' are stored in a HudLocalizedMessage struct. Death messages and other &quot;non-special&quot; (bSpecial=False) [[Legacy:LocalMessage|LocalMessage]]s are not stored here.
; class&lt;[[Legacy:Actor|Actor]]&gt; VoteMenuClass : Hook for mod authors.
; [[Legacy:Material|Material]] TargetMaterial : A meterial used to mark a targetted object. Currently only used by the BR BallLauncher's secondary firing mode.
; bool bShowTargeting (transient) : Whether a target has been aquired.
; vector TargetingLocation (transient) : Where the target is.
; float TargetingSize (transient) : The target's size.
; string InstructionText : 
; string InstructionKeyText : 
; float InstructTextBorderX : 
; float InstructTextBorderY : 
; float InstrDelta : 
; float InstrRate : 
; string InstructionFontName (localized) : 
; font InstructionFontFont : 
; byte FontsPrecached : 
; bool DoCropping : 
; float CroppingAmount : 
; [[Legacy:Material|Material]] CroppingMaterial : 
; string LastWeaponName : 
; float WeaponDrawTimer : 
; color WeaponDrawColor : 
; bool bHideWeaponName (globalconfig) : Hides the name of the weapon the player just switched to.

==Structs==

===DigitSet===

A set of digits stored in one texture.
; [[Legacy:Material|Material]] DigitTexture : The texture containing the digits.
; IntBox TextureCoords[11] : The coordinates of the digits. 0-9, 11th element is negative sign. IntBox is one if the [[Legacy:Built-In Struct|Built-In Struct]].

===SpriteWidget===

Describes a single HUD element which can be drawn using the DrawSpriteWidget native function.
; [[Legacy:Material|Material]] WidgetTexture : The texture that contains the HUD element.
; ERenderStyle RenderStyle : The rendering style of this HUD element. (see [[Legacy:Actor/Enums|Actor/Enums]])
; IntBox TextureCoords : The position of the element in the specified material.
; float TextureScale : The scale that is applied to the texture, relative to a screen resolution of 640 x 480 pixels (that means: at that screen resolution a sprite with TextureScale=1.0 will be drawn one-to-one; at other screen resolutions it will be proportionally scaled up or down).
; EDrawPivot DrawPivot : Specifies the sprite's point of reference (see [[Legacy:Object|Object]]/Enums).  The given pixel position corresponds with this point on the sprite (for instance, its upper-right corner).
; float PosX &lt;br /&gt;float PosY : The relative screen location of the HUD element. Range from 0.0 to 1.0.
; int OffsetX &lt;br /&gt;int OffsetY : Extra offset of the texture part. This is scaled with the texture, so only in 640x480 and with a TextureScale of 1.0 one unit here corresponds to an actual pixel on the screen. If you want to move the widget to the right from the position given via PosX/Y by exactly the final width of the widget you would enter exactly that width for OffsetX.
; EScaleMode ScaleMode : From what direction the scale is applied (see EScaleMode enum below). The side that is cut off 1st. (Left for the ammo count and WeaponBar.)
; float Scale : This specifies, how much of the widget is visible. This is used together with ScaleMode and cuts off a part of the widget if set to values less than 1.0.
; color Tints[2] : The draw colors that should be used when this HUD element is drawn for the different teams. Team 0 is red in UT2003 and team 1 (also used in non-team games) is blue.

===NumericWidget===

Describes a HUD element which can be drawn using the DrawNumericWidget native function. Draws numbers on the screen. (uses a DigitSet)
; ERenderStyle RenderStyle : The rendering style of this HUD element. (see [[Legacy:Actor/Enums|Actor/Enums]])
; int MinDigitCount : This specifies the minimum width of the numeric widget, i.e. how much space is reserved for more digits.
; float TextureScale : The scale that is applied to the texture, works like for SpriteWidgets.
; EDrawPivot DrawPivot : (see [[Legacy:Object|Object]]/Enums) This point is used as &quot;Center&quot; of texture
; float PosX &lt;br /&gt;float PosY : The screen location of the HUD element. Range from 0.0 to 1.0
; int OffsetX &lt;br /&gt;int OffsetY : Additional offset which is scaled with the widget.
; color Tints[2] : The draw colors that should be used when this HUD element is drawn for the different teams.
; int bPadWithZeroes : Whether leading zeroes should fill up the minimum width specified in MinDigitCount.
; int Value (transient) : The actual number that is put on the screen when the widget is drawn.

===HudLocalizedMessage===

Represents a [[Legacy:LocalMessage|LocalMessage]] that should be rendered on the HUD.

The following block of variables are set when the message is entered (Message being set indicates that a message is in the list).
; class&lt;[[Legacy:LocalMessage|LocalMessage]]&gt; Message : The message class.
; String StringMessage : A display string for string messages.
; int Switch : The message's switch value.
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI, RelatedPRI2 : The related PRIs.
; [[Legacy:Object|Object]] OptionalObject : An optional object for the message.
; float EndOfLife : The level time index when the messages should be removed.
; float LifeTime : How long the message should be displayed.

The following block of variables are cached on first render (StringFont being set indicates that they've been rendered).
; Font StringFont : 
; color DrawColor : 
; EDrawPivot DrawPivot : 
; [[Legacy:LocalMessage|LocalMessage]].EStackMode StackMode : The message's stack mode when displaying multiple messages that have the same PosX/Y. (see [[Legacy:LocalMessage|LocalMessage]] for the enum declaration)
; float PosX, PosY : Relative screen position of the message.
; float DX, DY : The actual size in pixels.
; bool Drawn : Whether the message was drawn this frame. (Used for managing stacked messages.)

==Enums==

===EScaleMode===
; SM_None : 
; SM_Up : 
; SM_Down : 
; SM_Left : 
; SM_Right : 

==Methods==

Almost all HUD functions are simulated, exceptions are mentioned below. However, since a HUD is always a client-side actor the simulated keywords don't seem to be neccessary here.

===Inherited From [[Legacy:Actor|Actor]]===

===Inherited From [[Legacy:HUD|HUD]]===
; DrawHud ([[Legacy:Canvas|Canvas]] C) : Calls the different HUD drawing stages in the following order: UpdateHud, DrawTargeting (if bShowTargetting), DrawHudPassA (with draw style STY_Alpha), DrawHudPassB (with draw style STY_Additive), DrawHudPassC (with draw style STY_Alpha again), DrawHudPassD (with draw style STY_None), DisplayLocalMessages and finally DrawWeaponName.

===Native Functions===
; DrawSpriteWidget ([[Legacy:Canvas|Canvas]] C, out SpriteWidget W) [simulated, final] : Draws the HUD element described by the SpriteWidget W.
; DrawNumericWidget ([[Legacy:Canvas|Canvas]] C, out NumericWidget W, out DigitSet D) [simulated, final] : Draws a number.

===Drawing Functions===

No draw code should be in derived HUDs' DrawHud function, they should instead override DrawHudPass[A-D] and call their base class' DrawHudPass[A-D]. This cuts down on render state changes.

'''Note:''' The DrawSpriteWidget() and DrawNumericWidget() functions will create a log warning when encountering a different draw style than the current drawing pass expects. If you need to use a different DrawStyle setting for the widget or really need to mix up DrawStyles you should use the alternate drawing pass, i.e. DrawHudPassD().
; UpdateHud ( ) : Updates the HUD right before it is rendered. You should use this to update your SpriteWidgets and NumericWidgets as well as other variables storing values for drawing the HUD.
; DrawHudPassA ([[Legacy:Canvas|Canvas]] C) : First drawing pass with STY_Alpha.
; DrawHudPassB ([[Legacy:Canvas|Canvas]] C) : Drawing pass with STY_Additive.
; DrawHudPassC ([[Legacy:Canvas|Canvas]] C) : Second drawing pass with STY_alpha.
; DrawHudPassD ([[Legacy:Canvas|Canvas]] C) : Alternate drawing pass.

===Other Functions===

==Known Subclasses==
* [[Legacy:HudBDeathMatch|HudBDeathMatch]]

==Related Topics==

* [[Legacy:Mod Authoring For UT2K3/HUD|Mod Authoring For UT2K3/HUD]] &amp;ndash; There is a lot of stuff on this page about properties that should probably be moved to here

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudCDeathMatch</title>
    <id>28539</id>
    <revision>
      <id>40240</id>
      <timestamp>2009-11-17T11:04:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HudOverlay</title>
    <id>1440</id>
    <revision>
      <id>3633</id>
      <timestamp>2005-12-18T03:01:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; HudOverlay (Package: Engine)}}

HudOverlays are used to display alternate information on the HUD.

Note that this is &lt;u&gt;not&lt;/u&gt; a subclass of [[Legacy:HUD|HUD]].  The functions defined in HUD are not readily available within this class.

==Functions==
; Render( [[Legacy:Canvas|Canvas]] C ) (simulated) : EMPTY (allows access to the Canvas' functions)
; Destroyed() (simulated) : If the Owner is a [[Legacy:HUD|HUD]], calls &lt;tt&gt;HUD(Owner).RemoveHudOverlay(self)&lt;/tt&gt; before it calls &lt;tt&gt;Super.Destroyed()&lt;/tt&gt;.

==Known Subclasses==
* [[Legacy:ScriptedHudOverlay|ScriptedHudOverlay]]

==Related Topics==
* [[Legacy:HUD|HUD]]
* [[Legacy:HUD Interactions|HUD Interactions]]
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]]

==Discussion==

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hugh</title>
    <id>1394</id>
    <revision>
      <id>3530</id>
      <timestamp>2002-09-18T12:22:28Z</timestamp>
      <contributor>
        <ip>Hugh</ip>
      </contributor>
      <comment>Corrected e-mail address and urls</comment>
      <text xml:space="preserve">===Hugh Macdonald===

Coder

Film-maker

====Email====

HughMacdonald@brokenpipefilms.com

====ICQ====

1822379

====Articles On Wiki====

[[Legacy:UMS|Unreal Movie Studio]] (and linked tutorials)

====Companies/groups====

[http://unframed.brokenpipefilms.com UnFramed Productions] - VFX, UT Machinima, UT Mod

[http://www.brokenpipefilms.com Broken Pipe Films] - Proper film stuff

====Unreal-related Projects====

[[Legacy:UMS|Unreal Movie Studio]] (tool) - co-creator

Arcadia (machinima) - co-producer

[http://unframed.brokenpipefilms.com/residentunreal/ Resident Unreal] (UT mod) - cutscene creator (and ex-coder)

[http://udn.epicgames.com Unreal Developer Network] - contributor

====Other stuff====

I'm in the process of porting my UMS tutorials across to UnrealWiki - these are getting quite out-of-date, so it anyone wants to update them, do feel free to.

====Messages====

'''Hugh:''' Thanks to [[Legacy:C0ry|C0ry]] for providing me with a great outline for my page! (and apologies for blatantly nicking it!)

'''Tarquin:'''  Hi &amp; welcome to the Unreal Wiki. :D

'''Hugh:''' Thanks - I hope I can be of help to the community!

'''Birelli:''' Yeah, nice layout, I think it won't last though, check out [[Legacy:Tarquin|Tarquin]]'s 2 pages of signings ;-)

'''Hugh:''' Oh well, never mind - at least it'll look nice at the top...

'''EntropicLqd:'''  Hey Hugh, any idea if the Epic and DE devs stop by the Wiki once in a while?  If so what do they think of it?  Your Unreal Movie Studio tutorials rock by the way.  Kept me amused for a few hours they did.

'''Hugh:''' No idea, I'm afraid - they're pretty busy getting the game finished at the moment...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3531</id>
      <timestamp>2002-08-06T06:25:05Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Hi Hugh.</comment>
      <text xml:space="preserve">===Hugh Macdonald===

Coder

Film-maker

====Email====

hugh@unframed.org

====ICQ====

1822379

====Articles On Wiki====

[[Legacy:UMS|Unreal Movie Studio]] (and linked tutorials)

====Companies/groups====

[http://www.unframed.org UnFramed Productions] - VFX, UT Machinima, UT Mod

[http://www.brokenpipefilms.com Broken Pipe Films] - Proper film stuff

====Unreal-related Projects====

[[Legacy:UMS|Unreal Movie Studio]] (tool) - co-creator

Arcadia (machinima) - co-producer

[http://www.unframed.org/residentunreal/ Resident Unreal] (UT mod) - cutscene creator (and ex-coder)

[http://udn.epicgames.com Unreal Developer Network] - contributor

====Other stuff====

I'm in the process of porting my UMS tutorials across to UnrealWiki - these are getting quite out-of-date, so it anyone wants to update them, do feel free to.

====Messages====

'''Hugh:''' Thanks to [[Legacy:C0ry|C0ry]] for providing me with a great outline for my page! (and apologies for blatantly nicking it!)

'''Tarquin:'''  Hi &amp; welcome to the Unreal Wiki. :D

'''Hugh:''' Thanks - I hope I can be of help to the community!

'''Birelli:''' Yeah, nice layout, I think it won't last though, check out [[Legacy:Tarquin|Tarquin]]'s 2 pages of signings ;-)

'''Hugh:''' Oh well, never mind - at least it'll look nice at the top...

'''EntropicLqd:'''  Hey Hugh, any idea if the Epic and DE devs stop by the Wiki once in a while?  If so what do they think of it?  Your Unreal Movie Studio tutorials rock by the way.  Kept me amused for a few hours they did.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HumanBotPlus</title>
    <id>28508</id>
    <revision>
      <id>40209</id>
      <timestamp>2009-11-17T11:00:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hunted Lesson 1</title>
    <id>1427</id>
    <revision>
      <id>3609</id>
      <timestamp>2007-12-24T00:58:43Z</timestamp>
      <contributor>
        <ip>C-67-180-168-181.hsd1.ca.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Hunted2003|Hunted2003]] tutorial, Lesson 1: The Custom GameType.

==Folders and files==

First of all, let's [[Legacy:Set Up Package Folders|Set Up Package Folders]] with the base name &quot;hunted&quot;.  Inside the classes folder, create 4 text files:

*HuntedGame.uc
*HuntPawn.uc
*HuntController.uc
*HUDhunted.uc

Let me explain these further:

;HuntedGame: this is the [[Legacy:Gametype|gametype]] such as '''Capture the Flag''', '''DeathMatch''', etc.
;HuntPawn: this is a [[Legacy:Pawn|pawn]].  A pawn is what you control, such as a '''Player''' a '''Vehicle''', etc.
;HuntController:  a [[Legacy:Controller|controller]] is what you use to control movement etc.  I like to think of it as your soul, in the way that it &quot;posseses&quot; different pawns.  When you enter a vehicle, the controller stops controlling the player pawn, and posseses the vehicle pawn.  When you get out of the vehicle, it posseses the player pawn.  A GUI controller takes over when you are accessing a menu.  This is probably not a thourough definition, but it works for me. ('' link to an overview page for these?'')
;HUDhunted:  this is the Heads Up Display [[Legacy:HUD|HUD]], right now we are going to just add a symbol or something to the TeamDeathMatch Hud so we can tell that our custom gametype works. 

Now lets edit the HuntedGame.uc file (my code is riddled with comments, so you can understand what I am doing.) :

&lt;uscript&gt;
/////////////////////////////////////////////////
/// Hunted Game
/// I chose to extend xTeamGame (Team Deathmatch)
/// because in essence The Hunted is a Team Deathmatch that ends
///  if the Hunted Dies, I may have to change and extend from another 
///// gametype later , but for now ill try this
///////////////////////////////////////////////

class HuntedGame extends xTeamGame;

defaultproperties
{
     //gametype name, will appear in in-game list
     GameName=&quot;The Hunted&quot;
     //we will use the regular pawn till we make some changes in our pawn  
     DefaultPlayerClassName=&quot;XGame.xPawn&quot;
     // and will use the regular controller till we make some changes in ours 
     PlayerControllerClassName=&quot;XGame.xPlayer&quot; 
     
     // I will leave this DM for now
     MapPrefix=&quot;DM&quot; 
     //here is our new HUD
     HUDType=&quot;hunted.HUDhunted&quot;  
     
}
&lt;/uscript&gt; 

hmm... not sure why everything in quotations shows up as comments, I need to learn how to fix that.

'''Daid303:''' It doesn't, the default sysntax highlight color for stuff in quotes is green, just as comments. If you open up a script in UnrealEd it also does that (I even set up Editplus to use the same colors as unrealed, I like those colors :) )

If you want to know where I got these default properties, look in the default properties of the source code for DeathMatch.  We essentially extended off of it as follows: [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; [[Legacy:XTeamGame|xTeamGame]] &gt;&gt; HuntedGame

==Step 2==

Now we are going to make changes in our HuntPawn and HuntController in another lesson. Right now, if we load up our custom game we wouldnt see any changes, so I am going to add something to the HUD to verify that our game works.  So lets edit HUDhunted.uc:

&lt;uscript&gt; 
//////////////////////////////////
/// HUDhunted
//// just going to add a symbol 
/// to make it unique to our gametype
////////////////////////////////////////

class HUDhunted extends HudBTeamDeathMatch;

//a variable to hold our logo
var texture logotex;

function DrawHud(Canvas c)
{
	local color tempColor;
	local byte tempstyle;

	tempColor = c.DrawColor;
	tempstyle = c.Style;

    super.DrawHud(c);

    c.DrawColor=WhiteColor;
   	c.Style=ERenderStyle.STY_Additive;

    DrawLogo(c);

    c.DrawColor = tempColor;//restore values
   	c.Style = tempstyle;
}

//a function to draw it
function DrawLogo(Canvas c)
{
	c.SetPos(193,44);   //193 pix to the right, and 44 downwards from the upperleft corner.
	c.DrawIcon(logotex,0.5);  //scale is 1
}

defaultproperties
{
// reference to the texture we want to draw on the hud
logotex=texture'HuntedTex.huntlogo'
}
&lt;/uscript&gt;

now some explaining:

*first I made a logo in photoshop.  I saved it as a 24bit targa file entitled &quot;huntlogo.tga&quot;.
*#I opened up UnrealEd, went to the [[Legacy:Texture Browser|texture browser]] and hit import
*#I selected my targa and saved it in a package called HuntedTex
*#I unchecked mipmaps and checked Alpha
*#I saved the package as HuntedTex.utx in the folder /UT2003/Textures

for more on importing textures, please check out

[[Legacy:Import_The_Texture|Import_The_Texture]]

here is the logo if you need it.  It is in gif format here, you may be able to import it without converting it to targa I dunno.

[[Image:Legacy_huntlogo.gif|center|huntlogo in .gif format]]

In the code we simply set a variable to hold the texture, then the function '''DrawLogo'''draws it on the specified position and at the set scale.  In the default properties we point it to our logo.  I learned this thru the powerpoint tutorials of J. Giles at SEGA500 Unreal scripting. If you want to learn how to make further changes to the HUD here is a link:

http://gamestudies.cdis.org/~jgiles/

BTW,   The '''super.DrawHud(c)''' command calls on the function DrawHud as it was written in the HudBTeamDeathMatch class, so we are just adding to it.  If you leave out this line it will only draw the logo we added.  I suggest you try this just to get an idea of how the super command works.

==GameType int file &quot;Hunted.int&quot;==

So now we want to see it in action.  But first, we have to make an [[Legacy:Int File|int file]] to reference our gametype.  Without this, it will not show up in the list of gametypes and we wont get to play it.

*make a text file called Hunted.int

it should read like so:

&lt;uscript&gt;
[Public]

Object=(Class=Class,MetaClass=Engine.GameInfo,Name=Hunted.HuntedGame,Description=&quot;DM|The Hunted|xinterface.Tab_IADeathMatch|xinterface.MapListDeathMatch|false&quot;)

[Hunted.HuntedGame]
GameName=&quot;The Hunted&quot;
&lt;/uscript&gt;

This should be pretty self explanitory.  Now save it and put it in the /UT2003/system directory

Now our gametype should show up in the gametype list.

But first we have to do a couple of things

We need to add some headers to our HuntPawn and HuntController classes, even though we wont get to them in this lesson.  They won't compile the way they are.

&lt;uscript&gt;
class HuntPawn extends xPawn;

defaultproperties
{
}
&lt;/uscript&gt;

&lt;uscript&gt;
class HuntController extends xPlayer;

defaultproperties
{
}
&lt;/uscript&gt;

==Compiling==

You now need to compile the mod. There are two ways to compile:
* '''[[Legacy:Ucc|Ucc]] Make''': see [[Legacy:Compiling With UCC|Compiling With UCC]]
* [[Legacy:UMake|UMake]]

'''Make sure you added your mod name in UT2004.ini under edit packages or the compiler will not look for you mod to compile.'''

==After compiling==

If all goes well,  the file &quot;hunted.u&quot; will appear in your system folder. If it doesn't open up UCC.LOG and search for errors, there are always a few like &quot;package hunted.u couldn't be found&quot; but that's good, because if UCC MAKE doesn't find it, it will try to compile it.

==Conclusion==

Now run the game and go to Instant Action.  The Hunted should be in your list of gametypes.  Start a map and there is our logo.  Its not much, but it verifies that our gametype works, and now we can bend it to our will, make it do our bidding.

==Things to do==
*#get the logo centered and alpha working 

==Comments==

'''Archnemesis:''' I had made an error in the HuntedGame.uc file.  A default property was listed as

PlayerControllerClassName=&quot;XGame.xController&quot;

when it should have been 

PlayerControllerClassName=&quot;XGame.xPlayer&quot;

'''Archnemesis:'''  If you have already done this tutorial, I have made some changes to the Hud
*#  The background of the logo needs to be black, not white, I will repost the image.
*#  The render style should be Additive, not Alpha, this way the black part will be transparent.
*#  I have moved changed the x coordinate to 193 so the logo will be better centered

These changes are noted in the HUD code.

I am going to plan my next lesson more carefully before I post it, I wrote this one while I was doing the actual coding, so it had these errors.  I will post the next couple of lessons in a week or so.  Paitience!

'''Daid303:''' I've added some text by the compiling, maybe there is a wiki page about compiling you could link to? I also changed the comment in the logo HUD because it isn't centerd. If you want to center you'll have to so something like this: (Canvas.ClipX - Tex.Width)/2, (Canvas.ClipY-Tex.Height)/2

'''Archnemesis:''' Thanks, I was thinking that on a different resolution, it probably wouldn't be centered, but I forgot to look into it.  I am going to work on the back linking before I post any other lessons.  I have been reading some of the wiki stuff and am going to revise this page to make it more wiki-friendly when I get a chance.  But first I'm off to Unreal University this weekend.</text>
    </revision>
    <revision>
      <id>3610</id>
      <timestamp>2003-11-08T13:28:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Hunted2003|Hunted2003]] tutorial, Lesson 1: The Custom GameType.

==Folders and files==

First of all, let's [[Legacy:Set Up Package Folders|Set Up Package Folders]] with the base name &quot;hunted&quot;.  Inside the classes folder, create 4 text files:

*HuntedGame.uc
*HuntPawn.uc
*HuntController.uc
*HUDhunted.uc

Let me explain these further:

;HuntedGame: this is the [[Legacy:Gametype|gametype]] such as '''Capture the Flag''', '''DeathMatch''', etc.
;HuntPawn: this is a [[Legacy:Pawn|pawn]].  A pawn is what you control, such as a '''Player''' a '''Vehicle''', etc.
;HuntController:  a [[Legacy:Controller|controller]] is what you use to control movement etc.  I like to think of it as your soul, in the way that it &quot;posseses&quot; different pawns.  When you enter a vehicle, the controller stops controlling the player pawn, and posseses the vehicle pawn.  When you get out of the vehicle, it posseses the player pawn.  A GUI controller takes over when you are accessing a menu.  This is probably not a thourough definition, but it works for me. ('' link to an overview page for these?'')
;HUDhunted:  this is the Heads Up Display [[Legacy:HUD|HUD]], right now we are going to just add a symbol or something to the TeamDeathMatch Hud so we can tell that our custom gametype works. 

Now lets edit the HuntedGame.uc file (my code is riddled with comments, so you can understand what I am doing.) :

&lt;uscript&gt;
/////////////////////////////////////////////////
/// Hunted Game
/// I chose to extend xTeamGame (Team Deathmatch)
/// because in essence The Hunted is a Team Deathmatch that ends
///  if the Hunted Dies, I may have to change and extend from another 
///// gametype later , but for now ill try this
///////////////////////////////////////////////

class HuntedGame extends xTeamGame;

defaultproperties
{
     //gametype name, will appear in in-game list
     GameName=&quot;The Hunted&quot;
     //we will use the regular pawn till we make some changes in our pawn  
     DefaultPlayerClassName=&quot;XGame.xPawn&quot;
     // and will use the regular controller till we make some changes in ours 
     PlayerControllerClassName=&quot;XGame.xPlayer&quot; 
     
     // I will leave this DM for now
     MapPrefix=&quot;DM&quot; 
     //here is our new HUD
     HUDType=&quot;hunted.HUDhunted&quot;  
     
}
&lt;/uscript&gt; 

hmm... not sure why everything in quotations shows up as comments, I need to learn how to fix that.

'''Daid303:''' It doesn't, the default sysntax highlight color for stuff in quotes is green, just as comments. If you open up a script in UnrealEd it also does that (I even set up Editplus to use the same colors as unrealed, I like those colors :) )

If you want to know where I got these default properties, look in the default properties of the source code for DeathMatch.  We essentially extended off of it as follows: [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; [[Legacy:XTeamGame|xTeamGame]] &gt;&gt; HuntedGame

==Step 2==

Now we are going to make changes in our HuntPawn and HuntController in another lesson. Right now, if we load up our custom game we wouldnt see any changes, so I am going to add something to the HUD to verify that our game works.  So lets edit HUDhunted.uc:

&lt;uscript&gt; 
//////////////////////////////////
/// HUDhunted
//// just going to add a symbol 
/// to make it unique to our gametype
////////////////////////////////////////

class HUDhunted extends HudBTeamDeathMatch;

//a variable to hold our logo
var texture logotex;

function DrawHud(Canvas c)
{
	local color tempColor;
	local byte tempstyle;

	tempColor = c.DrawColor;
	tempstyle = c.Style;

    super.DrawHud(c);

    c.DrawColor=WhiteColor;
   	c.Style=ERenderStyle.STY_Additive;

    DrawLogo(c);

    c.DrawColor = tempColor;//restore values
   	c.Style = tempstyle;
}

//a function to draw it
function DrawLogo(Canvas c)
{
	c.SetPos(193,44);   //193 pix to the right, and 44 downwards from the upperleft corner.
	c.DrawIcon(logotex,0.5);  //scale is 1
}

defaultproperties
{
// reference to the texture we want to draw on the hud
logotex=texture'HuntedTex.huntlogo'
}
&lt;/uscript&gt;

now some explaining:

*first I made a logo in photoshop.  I saved it as a 24bit targa file entitled &quot;huntlogo.tga&quot;.
*#I opened up UnrealEd, went to the [[Legacy:Texture Browser|texture browser]] and hit import
*#I selected my targa and saved it in a package called HuntedTex
*#I unchecked mipmaps and checked Alpha
*#I saved the package as HuntedTex.utx in the folder /UT2003/Textures

for more on importing textures, please check out

[[Legacy:Import_The_Texture|Import_The_Texture]]

here is the logo if you need it.  It is in gif format here, you may be able to import it without converting it to targa I dunno.

[[Image:Legacy_huntlogo.gif|center|huntlogo in .gif format]]

In the code we simply set a variable to hold the texture, then the function '''DrawLogo'''draws it on the specified position and at the set scale.  In the default properties we point it to our logo.  I learned this thru the powerpoint tutorials of J. Giles at SEGA500 Unreal scripting. If you want to learn how to make further changes to the HUD here is a link:

http://gamestudies.cdis.org/~jgiles/

BTW,   The '''super.DrawHud(c)''' command calls on the function DrawHud as it was written in the HudBTeamDeathMatch class, so we are just adding to it.  If you leave out this line it will only draw the logo we added.  I suggest you try this just to get an idea of how the super command works.

==GameType int file &quot;Hunted.int&quot;==

So now we want to see it in action.  But first, we have to make an [[Legacy:Int File|int file]] to reference our gametype.  Without this, it will not show up in the list of gametypes and we wont get to play it.

*make a text file called Hunted.int

it should read like so:

&lt;uscript&gt;
[Public]

Object=(Class=Class,MetaClass=Engine.GameInfo,Name=Hunted.HuntedGame,Description=&quot;DM|The Hunted|xinterface.Tab_IADeathMatch|xinterface.MapListDeathMatch|false&quot;)

[Hunted.HuntedGame]
GameName=&quot;The Hunted&quot;
&lt;/uscript&gt;

This should be pretty self explanitory.  Now save it and put it in the /UT2003/system directory

Now our gametype should show up in the gametype list.

But first we have to do a couple of things

We need to add some headers to our HuntPawn and HuntController classes, even though we wont get to them in this lesson.  They won't compile the way they are.

&lt;uscript&gt;
class HuntPawn extends xPawn;

defaultproperties
{
}
&lt;/uscript&gt;

&lt;uscript&gt;
class HuntController extends xPlayer;

defaultproperties
{
}
&lt;/uscript&gt;

==Compiling==

You now need to compile the mod. There are two ways to compile:
* '''[[Legacy:Ucc|Ucc]] Make''': see [[Legacy:Compiling With UCC|Compiling With UCC]]
* [[Legacy:UMake|UMake]]

==After compiling==

If all goes well,  the file &quot;hunted.u&quot; will appear in your system folder. If it doesn't open up UCC.LOG and search for errors, there are always a few like &quot;package hunted.u couldn't be found&quot; but that's good, because if UCC MAKE doesn't find it, it will try to compile it.

==Conclusion==

Now run the game and go to Instant Action.  The Hunted should be in your list of gametypes.  Start a map and there is our logo.  Its not much, but it verifies that our gametype works, and now we can bend it to our will, make it do our bidding.

==Things to do==
*#get the logo centered and alpha working 

==Comments==

'''Archnemesis:''' I had made an error in the HuntedGame.uc file.  A default property was listed as

PlayerControllerClassName=&quot;XGame.xController&quot;

when it should have been 

PlayerControllerClassName=&quot;XGame.xPlayer&quot;

'''Archnemesis:'''  If you have already done this tutorial, I have made some changes to the Hud
*#  The background of the logo needs to be black, not white, I will repost the image.
*#  The render style should be Additive, not Alpha, this way the black part will be transparent.
*#  I have moved changed the x coordinate to 193 so the logo will be better centered

These changes are noted in the HUD code.

I am going to plan my next lesson more carefully before I post it, I wrote this one while I was doing the actual coding, so it had these errors.  I will post the next couple of lessons in a week or so.  Paitience!

'''Daid303:''' I've added some text by the compiling, maybe there is a wiki page about compiling you could link to? I also changed the comment in the logo HUD because it isn't centerd. If you want to center you'll have to so something like this: (Canvas.ClipX - Tex.Width)/2, (Canvas.ClipY-Tex.Height)/2

'''Archnemesis:''' Thanks, I was thinking that on a different resolution, it probably wouldn't be centered, but I forgot to look into it.  I am going to work on the back linking before I post any other lessons.  I have been reading some of the wiki stuff and am going to revise this page to make it more wiki-friendly when I get a chance.  But first I'm off to Unreal University this weekend.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hunted Lesson 2</title>
    <id>1433</id>
    <revision>
      <id>3619</id>
      <timestamp>2006-09-19T15:19:19Z</timestamp>
      <contributor>
        <ip>Ppp22-194.lns2.syd7.internode.on.net</ip>
      </contributor>
      <minor/>
      <comment>*fixed typo, custom</comment>
      <text xml:space="preserve">[[Legacy:Hunted2003|Hunted2003]] tutorial, Lesson 2: Custom Models.

==Intro==

I initially wanted to start on the custom class selection menu first, but then I realized that I would need a custom model first, as we need pictures of each player to make our menu page.  So I will try to give a quick intro into making custom characters, or players.  This is not a totally crucial step in modding, and if you do not want to fool around with Photoshop or get into the graphic side of things you can skip this part  

==Step 1==

First I Figured out which models I wanted to skin and change into my custom Hunted models.

(note, I am only skinning existing models, not creating new models for this tutorial)

*President - Harlequin
*Sniper - Romulus
*Soilder - Wraith
*Medic - Satin
*Heavy Weapons - Frostbite

Then I opened the xplayersL1.upl  file located in the Unreal2003/system directory

This file contains all the info about each player in the game.  The game uses this file to decide how to display each model, what to name it, what static meshes to use, and what skins to put on the head and body.  We will not use this file in our final mod, as they won't be neccessary once we get our menus working.  However I like to use them to preview my models before I continue.

Take a look at the listings for our five characters.

&lt;uscript&gt;
Player=(DefaultName=&quot;Frostbite&quot;,Mesh=Jugg.JuggMaleA,species=xGame.SPECIES_Jugg,
BodySkin=PlayerSkins.JuggMaleABodyA,FaceSkin=PlayerSkins.JuggMaleAHeadB,
Portrait=PlayerPictures.cJuggMaleAB,Text=XPlayers.JuggMaleAB,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.RocketLauncher,Accuracy=-0.2,StrafingAbility=0.6,Tactics=0.5)

Player=(DefaultName=&quot;Wraith&quot;,Mesh=HumanMaleA.MercMaleA,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercMaleABodyA,FaceSkin=PlayerSkins.MercMaleAHeadA,
Portrait=PlayerPictures.cMercMaleAA,Text=XPlayers.MercMaleAA,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.RocketLauncher,bJumpy=1,Tactics=-0.2,Aggressiveness=+0.2,
Accuracy=-0.1,StrafingAbility=+0.5)

Player=(DefaultName=&quot;Romulus&quot;,Mesh=HumanMaleA.MercMaleB,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercMaleBBodyA,FaceSkin=PlayerSkins.MercMaleBHeadAFinal,
Portrait=PlayerPictures.cMercMaleBA,Text=XPlayers.MercMaleBA,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.FlakCannon,Aggressiveness=+0.25,Tactics=0.5,Accuracy=-0.3,StrafingAbility=+0.7)

Player=(DefaultName=&quot;Satin&quot;,Mesh=HumanFemaleA.MercFemaleB,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercFemaleBBodyA,FaceSkin=PlayerSkins.MercFemaleBHeadB,
Portrait=PlayerPictures.cMercFemaleBB,Text=XPlayers.MercFemaleBB,Sex=Female,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.ShockRifle,StrafingAbility=-0.5,Tactics=-0.3)

Player=(DefaultName=&quot;Harlequin&quot;,Mesh=HumanMaleA.NightMaleB,species=xGame.SPECIES_Night,
BodySkin=PlayerSkins.NightMaleBBodyFinalA,FaceSkin=PlayerSkins.NightMaleBHeadBFinal,
Portrait=PlayerPictures.cNightMaleBB,Text=XPlayers.NightMaleBB,Sex=Male,Accuracy=+0.3,StrafingAbility=+0.7)
&lt;/uscript&gt;

We need to make note of the BodySkin and FaceSkin entries for each one.

Then we must open the PlayerSkins.utx texture package in UnrealEd.  Select each one of these skins and export them.  Then you must open each one in PhotoShop and modify it.  I have saved examples of each texture I modified below:</text>
    </revision>
    <revision>
      <id>3620</id>
      <timestamp>2004-03-03T00:34:55Z</timestamp>
      <contributor>
        <ip>Gso57-96-225.triad.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Hunted2003|Hunted2003]] tutorial, Lesson 2: Custom Models.

==Intro==

I initially wanted to start on the custom class selection menu first, but then I realized that I would need a custome model first, as we need pictures of each player to make our menu page.  So I will try to give a quick intro into making custom characters, or players.  This is not a totally crucial step in modding, and if you do not want to fool around with Photoshop or get into the graphic side of things you can skip this part  

==Step 1==

First I Figured out which models I wanted to skin and change into my custom Hunted models.

(note, I am only skinning existing models, not creating new models for this tutorial)

*President - Harlequin
*Sniper - Romulus
*Soilder - Wraith
*Medic - Satin
*Heavy Weapons - Frostbite

Then I opened the xplayersL1.upl  file located in the Unreal2003/system directory

This file contains all the info about each player in the game.  The game uses this file to decide how to display each model, what to name it, what static meshes to use, and what skins to put on the head and body.  We will not use this file in our final mod, as they won't be neccessary once we get our menus working.  However I like to use them to preview my models before I continue.

Take a look at the listings for our five characters.

&lt;uscript&gt;
Player=(DefaultName=&quot;Frostbite&quot;,Mesh=Jugg.JuggMaleA,species=xGame.SPECIES_Jugg,
BodySkin=PlayerSkins.JuggMaleABodyA,FaceSkin=PlayerSkins.JuggMaleAHeadB,
Portrait=PlayerPictures.cJuggMaleAB,Text=XPlayers.JuggMaleAB,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.RocketLauncher,Accuracy=-0.2,StrafingAbility=0.6,Tactics=0.5)

Player=(DefaultName=&quot;Wraith&quot;,Mesh=HumanMaleA.MercMaleA,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercMaleABodyA,FaceSkin=PlayerSkins.MercMaleAHeadA,
Portrait=PlayerPictures.cMercMaleAA,Text=XPlayers.MercMaleAA,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.RocketLauncher,bJumpy=1,Tactics=-0.2,Aggressiveness=+0.2,
Accuracy=-0.1,StrafingAbility=+0.5)

Player=(DefaultName=&quot;Romulus&quot;,Mesh=HumanMaleA.MercMaleB,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercMaleBBodyA,FaceSkin=PlayerSkins.MercMaleBHeadAFinal,
Portrait=PlayerPictures.cMercMaleBA,Text=XPlayers.MercMaleBA,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.FlakCannon,Aggressiveness=+0.25,Tactics=0.5,Accuracy=-0.3,StrafingAbility=+0.7)

Player=(DefaultName=&quot;Satin&quot;,Mesh=HumanFemaleA.MercFemaleB,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercFemaleBBodyA,FaceSkin=PlayerSkins.MercFemaleBHeadB,
Portrait=PlayerPictures.cMercFemaleBB,Text=XPlayers.MercFemaleBB,Sex=Female,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.ShockRifle,StrafingAbility=-0.5,Tactics=-0.3)

Player=(DefaultName=&quot;Harlequin&quot;,Mesh=HumanMaleA.NightMaleB,species=xGame.SPECIES_Night,
BodySkin=PlayerSkins.NightMaleBBodyFinalA,FaceSkin=PlayerSkins.NightMaleBHeadBFinal,
Portrait=PlayerPictures.cNightMaleBB,Text=XPlayers.NightMaleBB,Sex=Male,Accuracy=+0.3,StrafingAbility=+0.7)
&lt;/uscript&gt;

Take a look at the listings for the models we have chosen.</text>
    </revision>
    <revision>
      <id>3621</id>
      <timestamp>2004-03-03T00:37:14Z</timestamp>
      <contributor>
        <ip>Gso57-96-225.triad.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Hunted2003|Hunted2003]] tutorial, Lesson 2: Custom Models.

==Intro==

I initially wanted to start on the custom class selection menu first, but then I realized that I would need a custome model first, as we need pictures of each player to make our menu page.  So I will try to give a quick intro into making custom characters, or players.  This is not a totally crucial step in modding, and if you do not want to fool around with Photoshop or get into the graphic side of things you can skip this part  

==Step 1==

First I Figured out which models I wanted to skin and change into my custom Hunted models.

(note, I am only skinning existing models, not creating new models for this tutorial)

*President - Harlequin
*Sniper - Romulus
*Soilder - Wraith
*Medic - Satin
*Heavy Weapons - Frostbite

Then I opened the xplayersL1.upl  file located in the Unreal2003/system directory

This file contains all the info about each player in the game.  The game uses this file to decide how to display each model, what to name it, what static meshes to use, and what skins to put on the head and body.  We will not use this file in our final mod, as they won't be neccessary once we get our menus working.  However I like to use them to preview my models before I continue.

Take a look at the listings for our five characters.

&lt;uscript&gt;
Player=(DefaultName=&quot;Frostbite&quot;,Mesh=Jugg.JuggMaleA,species=xGame.SPECIES_Jugg,
BodySkin=PlayerSkins.JuggMaleABodyA,FaceSkin=PlayerSkins.JuggMaleAHeadB,
Portrait=PlayerPictures.cJuggMaleAB,Text=XPlayers.JuggMaleAB,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.RocketLauncher,Accuracy=-0.2,StrafingAbility=0.6,Tactics=0.5)

Player=(DefaultName=&quot;Wraith&quot;,Mesh=HumanMaleA.MercMaleA,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercMaleABodyA,FaceSkin=PlayerSkins.MercMaleAHeadA,
Portrait=PlayerPictures.cMercMaleAA,Text=XPlayers.MercMaleAA,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.RocketLauncher,bJumpy=1,Tactics=-0.2,Aggressiveness=+0.2,
Accuracy=-0.1,StrafingAbility=+0.5)

Player=(DefaultName=&quot;Romulus&quot;,Mesh=HumanMaleA.MercMaleB,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercMaleBBodyA,FaceSkin=PlayerSkins.MercMaleBHeadAFinal,
Portrait=PlayerPictures.cMercMaleBA,Text=XPlayers.MercMaleBA,Sex=Male,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.FlakCannon,Aggressiveness=+0.25,Tactics=0.5,Accuracy=-0.3,StrafingAbility=+0.7)

Player=(DefaultName=&quot;Satin&quot;,Mesh=HumanFemaleA.MercFemaleB,species=xGame.SPECIES_Merc,
BodySkin=PlayerSkins.MercFemaleBBodyA,FaceSkin=PlayerSkins.MercFemaleBHeadB,
Portrait=PlayerPictures.cMercFemaleBB,Text=XPlayers.MercFemaleBB,Sex=Female,Menu=&quot;SP&quot;,
FavoriteWeapon=xWeapons.ShockRifle,StrafingAbility=-0.5,Tactics=-0.3)

Player=(DefaultName=&quot;Harlequin&quot;,Mesh=HumanMaleA.NightMaleB,species=xGame.SPECIES_Night,
BodySkin=PlayerSkins.NightMaleBBodyFinalA,FaceSkin=PlayerSkins.NightMaleBHeadBFinal,
Portrait=PlayerPictures.cNightMaleBB,Text=XPlayers.NightMaleBB,Sex=Male,Accuracy=+0.3,StrafingAbility=+0.7)
&lt;/uscript&gt;

We need to make note of the BodySkin and FaceSkin entries for each one.

Then we must open the PlayerSkins.utx texture package in UnrealEd.  Select each one of these skins and export them.  Then you must open each one in PhotoShop and modify it.  I have saved examples of each texture I modified below:</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hunted2003</title>
    <id>1426</id>
    <revision>
      <id>3607</id>
      <timestamp>2005-12-16T18:31:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>neat.  needs linkage.  added category tags.</comment>
      <text xml:space="preserve">====The Hunted 2003====

Before I get started I would like to re-emphasize that I am a beginner.  I have taken an Intro to C++ class which helps me to understand the foundation of UnrealScript, but the best way to learn UnrealScript is to dig thru it.  There may (and probably will) be better ways of doing some of what I am doing.  UnrealScript Gurus feel free to add comments.  I do not know much about replication, server client code, netcode, etc so what I am doing will only work on your end.  I have never programmed a gametype so I wont get into that too much either.  We will deal mostly with big graphical changes, menus, HUDs, player skins, big changes that you can see and hear etc.  I am still learning and may finish this mod later.  Enough about me...

I would also like to mention that some of this code is based heavily on the work or tutorials of others and is not my own.  In such cases I will try to reference the original author.  Upon request from the original author I will take it down.  I don't know the legality behind UnrealScript source code, especially when presented as tutorials, but as far as my own code goes: share the wealth!

Along these lines I would like to say that everybody knows that copying and pasting code is alot easier than typing it line for line, however you should study it, especially the comments, and understand how it works.  I admit that some of this code is beyond my full understanding but I am learning more about it everyday I work with it.  One final note: I recommend using WOTGreal as your compiler.  The debugger has actually taught me more about the rules of UnrealScript than any other source.  &quot;Let the Cartoons Begin!&quot;

====Lesson 1 : The Custom GameType====

First of all we are going to make our custom gametype.  We will go ahead and start off with a custom controller and a custom pawn.  I will change the camera view behind pawn, just so we know that our custom game type is in effect when we load it up

[[Legacy:Hunted Lesson 1|Hunted Lesson 1]]

[[Legacy:Hunted Lesson 2|Hunted Lesson 2]]

===To Do List===

1. Search existing tutorials so I don't repeat already posted steps

2. Look at this link closely and redo Lesson 1 [[Legacy:Guidelines On Tutorials|Guidelines on Tutorials]]

'''Tarquin:''' You could also look at whether this is going to fit into [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

'''Archnemesis:''' Yeah, I was thinking of linking to it under Making a class based mod, since this is essentially what I am doing.

==Discussion==

'''GRAF1K:''' Posting &lt;i&gt;code&lt;/i&gt; is fine. My bad.

'''SuperApe:''' Neat stuff.  Needs linkage.

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; See To Do section above.
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3608</id>
      <timestamp>2004-03-04T01:58:26Z</timestamp>
      <contributor>
        <ip>Gso57-96-225.triad.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====The Hunted 2003====

Before I get started I would like to re-emphasize that I am a beginner.  I have taken an Intro to C++ class which helps me to understand the foundation of UnrealScript, but the best way to learn UnrealScript is to dig thru it.  There may (and probably will) be better ways of doing some of what I am doing.  UnrealScript Gurus feel free to add comments.  I do not know much about replication, server client code, netcode, etc so what I am doing will only work on your end.  I have never programmed a gametype so I wont get into that too much either.  We will deal mostly with big graphical changes, menus, HUDs, player skins, big changes that you can see and hear etc.  I am still learning and may finish this mod later.  Enough about me...

I would also like to mention that some of this code is based heavily on the work or tutorials of others and is not my own.  In such cases I will try to reference the original author.  Upon request from the original author I will take it down.  I don't know the legality behind UnrealScript source code, especially when presented as tutorials, but as far as my own code goes: share the wealth!

Along these lines I would like to say that everybody knows that copying and pasting code is alot easier than typing it line for line, however you should study it, especially the comments, and understand how it works.  I admit that some of this code is beyond my full understanding but I am learning more about it everyday I work with it.  One final note: I recommend using WOTGreal as your compiler.  The debugger has actually taught me more about the rules of UnrealScript than any other source.  &quot;Let the Cartoons Begin!&quot;

====Lesson 1 : The Custom GameType====

First of all we are going to make our custom gametype.  We will go ahead and start off with a custom controller and a custom pawn.  I will change the camera view behind pawn, just so we know that our custom game type is in effect when we load it up

[[Legacy:Hunted Lesson 1|Hunted Lesson 1]]

[[Legacy:Hunted Lesson 2|Hunted Lesson 2]]

===To Do List===

1. Search existing tutorials so I don't repeat already posted steps

2. Look at this link closely and redo Lesson 1 [[Legacy:Guidelines On Tutorials|Guidelines on Tutorials]]

'''Tarquin:''' You could also look at whether this is going to fit into [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

'''Archnemesis:''' Yeah, I was thinking of linking to it under Making a class based mod, since this is essentially what I am doing.

===Comments===

'''GRAF1K:''' Posting &lt;i&gt;code&lt;/i&gt; is fine. My bad.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HunterKiller</title>
    <id>1395</id>
    <revision>
      <id>3532</id>
      <timestamp>2003-03-08T20:00:48Z</timestamp>
      <contributor>
        <ip>HunterKiller</ip>
      </contributor>
      <minor/>
      <comment>link to UScriptUML page</comment>
      <text xml:space="preserve">Newbie here. My experience with UScript is a simple AI scripting for bots (like dodging and wall jumping) in the MatrixUT MOD (Exile team). Now, with a bit more free time, I'm getting deeper in UT2K3 scripting. 

==Heavy Gear Forever==

After getting some experience making my old mecha MOD, I could join Cobalt-7, responsible for the Heavy Gear Forever MOD. 

[http://www.cobalt-7-corp.net/nuke/html/index.php Heavy Gear Forever site]

All my efforts are now focused on the project, and this will give some good wiki pages (at least I wish) :p

===[[Legacy:HunterKiller/UScriptUML|UScriptUML]]===

As Heavy Gear Forever is going to be a big project, we need some organization. And i think this tool will help me and a few other guys out there.

==Contact options==

luciano.bargmann@terra.com.br

ICQ UIN#: 3227253

AIM: lucianobargmann

MSN: lucianoluke@bol.com.br

----

'''Wormbo:''' Welcome to the Wiki. :) 

'''ZxAnPhOrIaN:''' Hello and welcome to the wiki! :) :tup: (seems like we all have the same welcome messages! ;))

'''Tarquin:''' Live long and prosparrrrrrrggggg

'''Trystan:''' Take me to your leader!  /me stumbles away.

'''Highlander:''' The wiki welcomes you! (Ignore Tarquin and Trystan they seem to have been hitting the liquor hard :P)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3533</id>
      <timestamp>2002-12-26T01:07:38Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Newbie here. My experience with UScript is a simple AI scripting for bots (like dodging and wall jumping) in the MatrixUT MOD (Exile team). Now, with a bit more free time, I'm getting deeper in UT2K3 scripting, as I'm starting a Macross/Robotech-like MOD. 

==My contributions==

[[Legacy:How UT2003 Weapons Work/Firing A Weapon|How UT2003 Weapons Work/Firing a Weapon]]

Got a whole day to organize stuff and try to make it understandable... :)

==Contact options==

luciano.bargmann@terra.com.br

ICQ UIN#: 3227253

AIM: lucianobargmann

MSN: lucianoluke@bol.com.br

----

'''Wormbo:''' Welcome to the Wiki. :) 

'''ZxAnPhOrIaN:''' Hello and welcome to the wiki! :) :tup: (seems like we all have the same welcome messages! ;))

'''Tarquin:''' Live long and prosparrrrrrrggggg

'''Trystan:''' Take me to your leader!  /me stumbles away.

'''Highlander:''' The wiki welcomes you! (Ignore Tarquin and Trystan they seem to have been hitting the liquor hard :P)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3534</id>
      <timestamp>2003-02-24T15:57:34Z</timestamp>
      <contributor>
        <ip>HunterKiller</ip>
      </contributor>
      <comment>Changed Project =]</comment>
      <text xml:space="preserve">Newbie here. My experience with UScript is a simple AI scripting for bots (like dodging and wall jumping) in the MatrixUT MOD (Exile team). Now, with a bit more free time, I'm getting deeper in UT2K3 scripting. 

==Heavy Gear Forever==

After getting some experience making my old mecha MOD, I could join Cobalt-7, responsible for the Heavy Gear Forever MOD. [http://www.cobalt-7-corp.net/nuke/html/index.php Heavy Gear Forever site]

All my efforts are now focused on the project, and this will give some good wiki pages (at least I wish) :p

==Contact options==

luciano.bargmann@terra.com.br

ICQ UIN#: 3227253

AIM: lucianobargmann

MSN: lucianoluke@bol.com.br

----

'''Wormbo:''' Welcome to the Wiki. :) 

'''ZxAnPhOrIaN:''' Hello and welcome to the wiki! :) :tup: (seems like we all have the same welcome messages! ;))

'''Tarquin:''' Live long and prosparrrrrrrggggg

'''Trystan:''' Take me to your leader!  /me stumbles away.

'''Highlander:''' The wiki welcomes you! (Ignore Tarquin and Trystan they seem to have been hitting the liquor hard :P)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HunterKiller/Developer Journal</title>
    <id>1414</id>
    <revision>
      <id>3578</id>
      <timestamp>2003-08-05T09:49:22Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">==[[Legacy:HunterKiller/UScriptUML|UScriptUML]]==

Take a look at the UScriptUML page for more datails on it;

Starting up; Designing interface and importing some basic components; Writing files for UML;

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3579</id>
      <timestamp>2003-03-08T19:56:14Z</timestamp>
      <contributor>
        <ip>HunterKiller</ip>
      </contributor>
      <comment>UScriptUML</comment>
      <text xml:space="preserve">==[[Legacy:HunterKiller/UScriptUML|UScriptUML]]==

Take a look at the UScriptUML page for more datails on it;

Starting up; Designing interface and importing some basic components; Writing files for UML;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:HunterKiller/UScriptUML</title>
    <id>1413</id>
    <revision>
      <id>3576</id>
      <timestamp>2005-03-08T14:39:28Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

After looking for something like this on the web without much success, I decided to do it by myself. My goal is make a program that imports UnrealScript code into [[Wikipedia:Unified Modeling Language]] (UML) diagrams (I use the free Poseidon for UML). I am using Visual Basic 6, as this is my strongest language.

==Features==

===Current===
* Import Packages and Classes listed in EditPackages

===To be developed===
* Import Properties
* Import Methods (functions)
* Import States
* Import DefaultProperties
* Design Relationship between classes

===Wishlist===
* A Ferrari 360 Spider :)

==Related links==

[http://www.gentleware.com Gentleware Poseidon for UML home page]

[http://www.visual-paradigm.com/vpuml.php Visual Paradigm for UML home page]

==Comments==

Anyone have a bit of web space to host my distribution files? Thanks in advance!

'''El Muerte:''' I was looking into this too (as plugin for [[Legacy:UnCodeX|UnCodeX]]). The XMI format is quite a big chunk of info to go through and it appears that each tool has it's own XMI like format. It's quite a mess. But most annoying would be that even though you can dump everything to a nice XMI file for tools to import, they will make a rendering mess of it because they expect the XMI file to contain positioning info too. Ofcourse this was over a year ago, maybe things have changed a bit.</text>
    </revision>
    <revision>
      <id>3577</id>
      <timestamp>2005-03-08T08:31:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

After looking for something like this on the web without much success, I decided to do it by myself. My goal is make a program that imports UnrealScript code into [[Wikipedia:Unified Modeling Language]] (UML) diagrams (I use the free Poseidon for UML). I am using Visual Basic 6, as this is my strongest language.

==Features==

===Current===
* Import Packages and Classes listed in EditPackages

===To be developed===
* Import Properties
* Import Methods (functions)
* Import States
* Import DefaultProperties
* Design Relationship between classes

===Wishlist===
* A Ferrari 360 Spider :)

==Related links==

[http://www.gentleware.com Gentleware Poseidon for UML home page]

[http://www.visual-paradigm.com/vpuml.php Visual Paradigm for UML home page]

==Comments==

Anyone have a bit of web space to host my distribution files? Thanks in advance!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Hyper</title>
    <id>1443</id>
    <revision>
      <id>3637</id>
      <timestamp>2007-03-21T09:38:29Z</timestamp>
      <contributor>
        <ip>Hyper</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Hyper''' or Hyper.nl is an Unreal player and member of the Unreal (1) community.

Hyper started as Deathmatch player in 1999 but the last years he spends more time with Unreal Coop. You can find info about his activities in the Unreal community at his website called [http://www.hyper.nl.tt &quot;Hyper.nl Unreal Services&quot;]. Hyper hosts multiple Unreal servers (Coop, Deathmatch, Crystal Castles). Besides the website and Unreal servers, he also has some other smaller projects about which can be read at his &quot;Lab&quot; page.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:I3DL2Listener</title>
    <id>28367</id>
    <revision>
      <id>40035</id>
      <timestamp>2009-11-15T07:55:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IAdvWebAdminSettings (UT3)</title>
    <id>1531</id>
    <revision>
      <id>3820</id>
      <timestamp>2008-03-08T16:22:19Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The WebAdmin.IAdvWebAdminSettings class provides a more powerful method for a [[Legacy:WebAdmin_(UT3)/Settings_Provider|settings provider]] than the default system. An IAdvWebAdminSettings implementor '''must''' subclass a [[Legacy:Settings (UT3)|Settings (UT3)]] class.

When the the IAdvWebAdminSettings interface is implemented the settings commands, as explained [[Legacy:WebAdmin_(UT3)/Settings_Provider|here]], will not be called. But the functions listed below will be called.

==Functions==

;function initSettings(WorldInfo worldinfo, DataStoreCache dscache): Called when the instance is created. The [[Legacy:DataStoreCache (UT3)|DataStoreCache (UT3)]] can be used to retrieve various information about gametypes, mutators, maps, and weapons.

;function cleanup(): Called when the instance is queued to be cleanup. It should be used to unset all actor references.

;function bool saveSettings(WebRequest request, WebAdminMessages messages): Called when the settings should be saved. Return true when the settings were saved. Use the messages instance for feedback to the user about incorrect values and what not.

;function renderSettings(WebResponse response, SettingsRenderer renderer, optional string substName = &quot;settings&quot;): Called to render the settings. This produce the HTML code for all settings this implementation should expose. You can use the given SettingsRenderer to perform standard rendering.

==Example implementation==

&lt;uscript&gt;
/**
 * Settings for the UTMutator_Arena
 *
 * Copyright 2008 Epic Games, Inc. All Rights Reserved
 *
 * @author  Michiel 'elmuerte' Hendriks
 */
class UTMutator_WeaponReplacementSettings extends Settings implements(IAdvWebAdminSettings);

`include(WebAdmin.uci)

struct WeaponData
{
	var class&lt;Weapon&gt; cls;
	var class ammoCls; // exact tyle is not relevant
	var UTUIDataProvider_Weapon data;
};

var array&lt;WeaponData&gt; weapons;

function initSettings(WorldInfo worldinfo, DataStoreCache dscache)
{
	local class&lt;Weapon&gt; weaponClass;
	local class ammoCls;

	local int i, idx;
	dscache.loadWeapons();
	for (i = 0; i &lt; dscache.weapons.Length; i++)
	{
		weaponClass = class&lt;Weapon&gt;(DynamicLoadObject(dscache.weapons[i].ClassName, class'class', true));
		ammocls = class(DynamicLoadObject(dscache.weapons[i].AmmoClassPath, class'class', true));
		if (weaponClass == none) continue;
		idx = weapons.length;
		weapons.length = idx+1;
		weapons[idx].cls = weaponClass;
		weapons[idx].ammoCls = ammoCls;
		weapons[idx].data = dscache.weapons[i];
	}
}

function cleanup()
{
	weapons.length = 0;
}

function bool saveSettings(WebRequest request, WebAdminMessages messages)
{
	local int i, idx;
	local string cls;
	local ReplacementInfo entry;

	class'UTMutator_WeaponReplacement'.default.WeaponsToReplace.Length = 0;
	class'UTMutator_WeaponReplacement'.default.AmmoToReplace.Length = 0;
	for (i = 0; i &lt; weapons.length; i++)
	{
		cls = request.GetVariable(&quot;weapon..&quot;$weapons[i].data.ClassName);
		if (Len(cls) == 0) continue;
		if (cls ~= weapons[i].data.ClassName) continue;
		for (idx = 0; idx &lt; weapons.Length; idx++)
		{
			if (weapons[idx].data.ClassName ~= cls) break;
		}
		if (idx == weapons.Length) continue;

		entry.OldClassName = weapons[i].cls.name;
		entry.NewClassPath = weapons[idx].data.ClassName;
		class'UTMutator_WeaponReplacement'.default.WeaponsToReplace.AddItem(entry);
		if (weapons[i].ammoCls != none)
		{
			entry.OldClassName = weapons[i].ammoCls.name;
			entry.NewClassPath = weapons[idx].data.AmmoClassPath;
			class'UTMutator_WeaponReplacement'.default.AmmoToReplace.AddItem(entry);
		}
	}

	class'UTMutator_WeaponReplacement'.static.StaticSaveConfig();
	return true;
}

function renderSettings(WebResponse response, SettingsRenderer renderer, optional string substName = &quot;settings&quot;)
{
	local string substvar, selectedValue, options;
	local int i, j, idx;

	for (i = 0; i &lt; weapons.Length; i++)
	{
		response.subst(&quot;setting.id&quot;, string(i));
		response.subst(&quot;setting.name&quot;, weapons[i].data.ClassName);
		response.subst(&quot;setting.formname&quot;, &quot;weapon..&quot;$weapons[i].data.ClassName);
		response.subst(&quot;setting.text&quot;, `HTMLEscape(weapons[i].data.FriendlyName));

		idx = class'UTMutator_WeaponReplacement'.default.WeaponsToReplace.find('OldClassName', weapons[i].cls.name);
		if (idx != INDEX_NONE)
		{
			selectedValue = class'UTMutator_WeaponReplacement'.default.WeaponsToReplace[idx].NewClassPath;
		}
		else {
			selectedValue = weapons[i].cls.GetPackageName()$&quot;.&quot;$weapons[i].cls.name;
		}
		options = &quot;&quot;;
 		for (j = 0; j &lt; weapons.Length; j++)
		{
			response.subst(&quot;setting.option.value&quot;, weapons[j].data.ClassName);
			response.subst(&quot;setting.option.text&quot;, `HTMLEscape(weapons[j].data.FriendlyName));
			if (weapons[j].data.ClassName ~= selectedValue)
			{
				response.subst(&quot;setting.option.selected&quot;, &quot;selected=\&quot;selected\&quot;&quot;);
			}
			else {
				response.subst(&quot;setting.option.selected&quot;, &quot;&quot;);
			}
			options $= response.LoadParsedUHTM(renderer.getPath() $ &quot;/&quot; $ renderer.getFilePrefix() $ &quot;option.inc&quot;);
		}
		response.subst(&quot;setting.options&quot;, options);
		response.subst(&quot;setting.html&quot;, response.LoadParsedUHTM(renderer.getPath() $ &quot;/&quot; $ renderer.getFilePrefix() $ &quot;select.inc&quot;));
		substvar $= response.LoadParsedUHTM(renderer.getPath() $ &quot;/&quot; $ renderer.getFilePrefix() $ &quot;entry.inc&quot;);
	}
	response.Subst(substName, substvar);
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IDE</title>
    <id>1500</id>
    <revision>
      <id>3759</id>
      <timestamp>2005-06-25T12:29:45Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An '''IDE''' (Integrated Development Environment) is an [[Legacy:Application|application]] that attempts to make the development process more fluid for the developer by integrating, or blurring the distinction among, tools that can perhaps best be thought of as implementing stages of the development process. See also [[Wikipedia:Integrated_development_environment]].

Contrast this with the all-but-lost [[Wikipedia:UNIX]] tradition of breaking things down into small, simple(?), purpose-built programs that can then be glued together by anything from pipes to shell scripts to awk to perl to... The UNIX tool tradition worked because in UNIX just about anything can be treated as a file, although it took [http://www.cs.bell-labs.com/plan9dist Plan9] for this to really reach its logical conclusion. In today's world of object-oriented programming coupled with a strongly functional flavor, as epitomized by modern C++, e.g. [http://www.boost.org Boost], [http://spirit.sourceforge.net Spirit], and [http://sourceforge.net/projects/loki-lib Loki], it's not clear that such a reductionistic approach is desirable. It's perhaps better to craft a flexible central repository for development artifacts (source code, intermediate representations, object code, debugging information, documentation, non-code assets such as images and sound...) and to provide multiple &quot;views&quot; for manipulating these objects in ways that recognize their interrelationships (editing source code invalidates object code and debugging information, for example). 

An IDE is an attempt to build such a system. In effect, using an IDE represents a commitment to two things: a style of development &amp;ndash; editing, building, debugging &amp;ndash; supported by the IDE, and a delivery context &amp;ndash; what you can deliver is dependent upon what the IDE can produce. It's not unreasonable to think of UnrealEd as an IDE for developing code and content for Unreal-Technology-based games.

==Related Topics==
*IDEs related to the [[Legacy:Unreal Engine|Unreal Engine]]:
** [[Legacy:UnrealEd|UnrealEd]]
** [[Legacy:WOTgreal|WOTgreal]]
** [[Legacy:UDE|UDE]]
** [[Legacy:Seppuku|Seppuku]] (in development)
* [[:Category:Legacy Application]]</text>
    </revision>
    <revision>
      <id>3760</id>
      <timestamp>2003-12-01T02:23:28Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Integrated Development Environment (Posted by Rune)

'''Dante:''' Ey, are you going to add some content here ? In this state this page deserves a DeleteMe...

'''Foxpaw:''' I seem to recall reading a page on the Wiki about IDEs, but it wasn't names IDE. Maybe a redirect would be more appropriate. Also, Rune, generally we don't include the names of who wrote what in the main body, but if you'd like to let people know who wrote it sometimes people put a comment at the bottom of the page (like these ones) and explain what they wrote and why.

'''HSDanClark:''' I'd like to see a paragraph or two explaining what an IDE is and what they're used for. I'll write it up myself after I'm done writing up my weapon tutorial if nobody beats me to it.

'''Psnively:''' Since I'm working on an IDE, I'll take a crack at it:

&quot;&lt;tt&gt;IDE&lt;/tt&gt;&quot; is an acronym for &quot;Integrated Development Environment.&quot; As the name implies, an IDE attempts to make the development process more fluid for the developer by integrating, or blurring the distinction among, tools that can perhaps best be thought of as implementing stages of the development process. Contrast this with the all-but-lost UNIX tradition of breaking things down into small, simple(?), purpose-built programs that can then be glued together by anything from pipes to shell scripts to awk to perl to... The UNIX tool tradition worked because in UNIX just about anything can be treated as a file, although it took [http://www.cs.bell-labs.com/plan9dist Plan9] for this to really reach its logical conclusion. In today's world of object-oriented programming coupled with a strongly functional flavor, as epitomized by modern C++, e.g. [http://www.boost.org Boost], [http://spirit.sourceforge.net Spirit], and [http://sourceforge.net/projects/loki-lib Loki], it's not clear that such a reductionistic approach is desirable. It's perhaps better to craft a flexible central repository for development artifacts (source code, intermediate representations, object code, debugging information, documentation, non-code assets such as images and sound...) and to provide multiple &quot;views&quot; for manipulating these objects in ways that recognize their interrelationships (editing source code invalidates object code and debugging information, for example). An IDE is an attempt to build such a system. In effect, using an IDE represents a commitment to two things: a style of development&amp;rarr;editing, building, debugging&amp;rarr;supported by the IDE, and a delivery context&amp;rarr;what you can deliver is dependent upon what the IDE can produce. It's not unreasonable to think of UnrealEd as an IDE for developing code and content for Unreal-Technology-based games.

This brings me to [http://seppuku.editthispage.com Seppuku]. Seppuku is also intended to be an IDE for developing code and content for Unreal-Technology-based games. The principal differences between Seppuku and UnrealEd are intended to be as follows:

# Seppuku will be available for platforms other than Win32.
# Seppuku will target multiple titles (Unreal, Unreal Tournament, Unreal 2, Unreal Tournament 2003, Deus Ex, Deus Ex: The Invisible War, America's Army, Raven Shield...) through a plug-in architecture.
# Seppuku doesn't exist; UnrealEd does. :-)

The Seppuku project had settled on the [http://sf.net/projects/whisper2 Whisper] application framework for Win32 and Mac OS/Carbon, largely due to its extremely good architecture and wrapper classes for [http://www.quesa.org Quesa], an open-source reimplementation of the Quickdraw 3D API. As of this writing, however, that decision seems questionable: Whisper remains incomplete even after (because of?) adoption by the Seppuku team and a raft of other interested developers; Quesa remains incomplete, particularly with respect to its general polygon mesh type, which had been identified as crucial to Seppuku. Finally, the Quickdraw 3D API in general is beginning to seem dated and relatively inflexible, e.g. it's not clear how it would be extended to support something as straightforward as procedural textures. By contrast, [http://www.coin3d.org Coin3D] is complete and cross-platform, including bindings for [http://www.trolltech.com Qt], which might not be the best framework in the world, but is complete and cross-platform. Coin3D is also essentially Open Inventor, a scene-graph API with tons of documentation, example code, and extensions available for it.

Regardless of that, Seppuku still expects to build its project-file format around [http://e4graph.com/e4graph e4Graph], which is a very nice API for persisting directed-graph-structured data such as you deal with in a scene-graph API. It's also extremely flexible, and coupled with the plug-in architecture, should serve well in terms of customizing entities that the project will have to store and manipulate.

Of course, other critical components of the project revolve around dealing with Unreal Technology package files and compiling UnrealScript-compatible code. Much of my actual development effort to date has revolved around getting the Unreal Tournament v432 Public Headers to compile in Codewarrior Pro 8.3, and in the early stages of exploring compiling something strongly resembling UnrealScript using the aforementioned Spirit parser-generator framework. The former should be considered in the late stages of development, and the latter in the nascent stages.

Finally, the project is looking for more developers&amp;rarr;especially any with current experience in any of the areas discussed, although general C++ and cross-platform talent would certainly be sufficient.

'''Foxpaw:''' Don't you think the name Seppuku might give people the wrong impression about your program's ease of use? :P</text>
    </revision>
    <revision>
      <id>3761</id>
      <timestamp>2004-06-20T16:43:04Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An '''IDE''' (Integrated Development Environment) is an [[Legacy:Application|application]] that attempts to make the development process more fluid for the developer by integrating, or blurring the distinction among, tools that can perhaps best be thought of as implementing stages of the development process. See also [[Wikipedia:Integrated_development_environment]].

Contrast this with the all-but-lost [[Wikipedia:UNIX]] tradition of breaking things down into small, simple(?), purpose-built programs that can then be glued together by anything from pipes to shell scripts to awk to perl to... The UNIX tool tradition worked because in UNIX just about anything can be treated as a file, although it took [http://www.cs.bell-labs.com/plan9dist Plan9] for this to really reach its logical conclusion. In today's world of object-oriented programming coupled with a strongly functional flavor, as epitomized by modern C++, e.g. [http://www.boost.org Boost], [http://spirit.sourceforge.net Spirit], and [http://sourceforge.net/projects/loki-lib Loki], it's not clear that such a reductionistic approach is desirable. It's perhaps better to craft a flexible central repository for development artifacts (source code, intermediate representations, object code, debugging information, documentation, non-code assets such as images and sound...) and to provide multiple &quot;views&quot; for manipulating these objects in ways that recognize their interrelationships (editing source code invalidates object code and debugging information, for example). 

An IDE is an attempt to build such a system. In effect, using an IDE represents a commitment to two things: a style of development &amp;ndash; editing, building, debugging &amp;ndash; supported by the IDE, and a delivery context &amp;ndash; what you can deliver is dependent upon what the IDE can produce. It's not unreasonable to think of UnrealEd as an IDE for developing code and content for Unreal-Technology-based games.

IDEs related to the [[Legacy:Unreal Engine|Unreal Engine]]:
* [[Legacy:UnrealEd|UnrealEd]]
* [[Legacy:WOTgreal|WOTgreal]]
* [[Legacy:UDE|UDE]]
* [[Legacy:Seppuku|Seppuku]] (in development)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:INI File</title>
    <id>1495</id>
    <revision>
      <id>3746</id>
      <timestamp>2008-03-25T19:09:30Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Unreal Engine|Unreal Engine]] based games make use of one or more INI files to hold configuration information for the classes used within the application running.

Some mods also use their own configuration file to avoid cluttering up the main program INI file and making their mod easier to install and uninstall.  You can learn more about how this is done by reading about [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]].

The INI file is broken into sections each with its own header.  Each section within the INI file corresponds to the configuration of a class.  The format of the section header is typically &lt;tt&gt;[package.classname]&lt;/tt&gt; but not always.

An example INI file section showning the ''initialisation style'' of each variable type is shown below.

&lt;uscript&gt;
[MyPackage.MyMutator]
IntegerValue=1
bBooleanValue=False
FloatValue=0.350000
ClassName=UMenu.UMenuModMenu

MyStaticStringArray[0]=string element 0
MyStaticStringArray[1]=string element 1
MyStaticStringArray[2]=string element 0

MyDynamicIntArray=0
MyDynamicIntArray=1
MyDynamicIntArray=2
MyDynamicIntArray=3

UWindowKey=IK_None
&lt;/uscript&gt;

The most important thing to note about the above example is the difference between the initialisation of the static and dynamic arrays.

When a static array is specified all elements in the array are saved to the INI file, even though they may be empty (or contain NULL values).  Also, the index of the element is stored with the value.

When a [[Legacy:Dynamic Array|dynamic array]] is specified then the element indexes are ommitted and the variable name of the dynamic array is used in multiple assignments.  The ''EditPackages=...'' lines in the UnrealTournament.ini file are a real life example of the initialisation of a dynamic array.

Although you can comment an INI file using the ''';''', '''#''' symbols or an apostraphy, all comments are lost as soon as the INI file is updated by a save of the configuration unless they are within a section (under a heading, see example) '''and''' have an '''=''' sign in them. You can use a few different ways to comment out lines. Note that I made up a section that is not related to any class, but it makes all comments with an '''=''' sign in them endure updates of the ini file. This will also work under any existing section.

&lt;uscript&gt;
[Comments]
rem=this is a test for comments.
&lt;/uscript&gt;

Note that &quot;rem=&quot;, &quot;comment=&quot;, &quot;DonkeyFeet=&quot;, will all work to start a comment line.

==Related Topics==
* [[Legacy:INT File|INT file]]
* [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]]
* [[Legacy:File Format|File format]]
* [[Legacy:Game Ini File|Game Ini File]]

==Discussion==</text>
    </revision>
    <revision>
      <id>3747</id>
      <timestamp>2006-04-02T17:20:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Unreal Engine|Unreal Engine]] based games make use of one or more INI files to hold configuration information for the classes used within the application running.

Some mods also use their own configuration file to avoid cluttering up the main program INI file and making their mod easier to install and uninstall.  You can learn more about how this is done by reading about [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]].

The INI file is broken into sections each with its own header.  Each section within the INI file corresponds to the configuration of a class.  The format of the section header is typically &lt;tt&gt;[package.classname]&lt;/tt&gt; but not always.

An example INI file section showning the ''initialisation style'' of each variable type is shown below.

&lt;uscript&gt;
[MyPackage.MyMutator]
IntegerValue=1
bBooleanValue=False
FloatValue=0.350000
ClassName=UMenu.UMenuModMenu

MyStaticStringArray[0]=string element 0
MyStaticStringArray[1]=string element 1
MyStaticStringArray[2]=string element 0

MyDynamicIntArray=0
MyDynamicIntArray=1
MyDynamicIntArray=2
MyDynamicIntArray=3

UWindowKey=IK_None
&lt;/uscript&gt;

The most important thing to note about the above example is the difference between the initialisation of the static and dynamic arrays.

When a static array is specified all elements in the array are saved to the INI file, even though they may be empty (or contain NULL values).  Also, the index of the element is stored with the value.

When a [[Legacy:Dynamic Array|dynamic array]] is specified then the element indexes are ommitted and the variable name of the dynamic array is used in multiple assignments.  The ''EditPackages=...'' lines in the UnrealTournament.ini file are a real life example of the initialisation of a dynamic array.

Although you can comment an INI file using the ''';''' symbol (or some others, see example) all comments are lost as soon as the INI file is updated by a save of the configuration unless they are within a section (under a heading, see example). You can use a few different ways to comment out lines. There may be more symbols that work, but here are a few. Note that I made up a section that is not related to any class, but it makes the comments endure updates of the ini file. This will also work under any existing section.

&lt;uscript&gt;
[Comments]
'this=is a test for comments.
#this=is a test for comments.
;this=is a test for comments.
rem=this is a test for comments.
&lt;/uscript&gt;

Also, note that any lines with the = sign in them are preserved, so &quot;rem=&quot;, &quot;comment=&quot;, &quot;DonkeyFeet=&quot;, will all work to start a comment line. It looks like from the syntax highlighting that the apostraphy is the intended rem symbol, but that's because it's also the start of a string.

==Related Topics==
* [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]]
* [[Legacy:File Format|File format]]
* [[Legacy:Game Ini File|Game Ini File]]

----

'''EntropicLqd:''' Well, that's all the information I wanted earlier this morning.  I'd forgotten about the comments being lost until I wrote this page though.  Bit of a bummer for what I wanted to do.</text>
    </revision>
    <revision>
      <id>3748</id>
      <timestamp>2007-01-07T13:35:38Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>removed comment at bottom of page (finally)</comment>
      <text xml:space="preserve">[[Legacy:Unreal Engine|Unreal Engine]] based games make use of one or more INI files to hold configuration information for the classes used within the application running.

Some mods also use their own configuration file to avoid cluttering up the main program INI file and making their mod easier to install and uninstall.  You can learn more about how this is done by reading about [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]].

The INI file is broken into sections each with its own header.  Each section within the INI file corresponds to the configuration of a class.  The format of the section header is typically &lt;tt&gt;[package.classname]&lt;/tt&gt; but not always.

An example INI file section showning the ''initialisation style'' of each variable type is shown below.

&lt;uscript&gt;
[MyPackage.MyMutator]
IntegerValue=1
bBooleanValue=False
FloatValue=0.350000
ClassName=UMenu.UMenuModMenu

MyStaticStringArray[0]=string element 0
MyStaticStringArray[1]=string element 1
MyStaticStringArray[2]=string element 0

MyDynamicIntArray=0
MyDynamicIntArray=1
MyDynamicIntArray=2
MyDynamicIntArray=3

UWindowKey=IK_None
&lt;/uscript&gt;

The most important thing to note about the above example is the difference between the initialisation of the static and dynamic arrays.

When a static array is specified all elements in the array are saved to the INI file, even though they may be empty (or contain NULL values).  Also, the index of the element is stored with the value.

When a [[Legacy:Dynamic Array|dynamic array]] is specified then the element indexes are ommitted and the variable name of the dynamic array is used in multiple assignments.  The ''EditPackages=...'' lines in the UnrealTournament.ini file are a real life example of the initialisation of a dynamic array.

Although you can comment an INI file using the ''';''', '''#''' symbols or an apostraphy, all comments are lost as soon as the INI file is updated by a save of the configuration unless they are within a section (under a heading, see example) '''and''' have an '''=''' sign in them. You can use a few different ways to comment out lines. Note that I made up a section that is not related to any class, but it makes all comments with an '''=''' sign in them endure updates of the ini file. This will also work under any existing section.

&lt;uscript&gt;
[Comments]
rem=this is a test for comments.
&lt;/uscript&gt;

Note that &quot;rem=&quot;, &quot;comment=&quot;, &quot;DonkeyFeet=&quot;, will all work to start a comment line.

==Related Topics==
* [[Legacy:Config Vars And .Ini Files|Config Vars And .Ini Files]]
* [[Legacy:File Format|File format]]
* [[Legacy:Game Ini File|Game Ini File]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:INT File</title>
    <id>1471</id>
    <revision>
      <id>3692</id>
      <timestamp>2008-03-26T14:30:12Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">INT files are one of the [[Legacy:Unreal Engine|Unreal Engine]]'s [[Legacy:File Format|file format]]s. These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition, they are used for language localization and that's the origin of the file extension .int for &quot;international&quot; as well.&lt;i&gt;(You can do so many things with .int files, we could make a tutorial just for them &amp;ndash; Wormbo)&lt;/i&gt; 

These (and all other [[Legacy:Localization|localization]] files like DET, ITT, FRT, etc.) look much like [[Legacy:INI File|INI file]]s. They consist of one or more sections which start with the section's name in brackets followed by Key=Value pairs.

==File Content ==

===Public Section ===

The &lt;code&gt;[Public]&lt;/code&gt; section can take two different keys, &lt;code&gt;Object&lt;/code&gt; and &lt;code&gt;Preferences&lt;/code&gt;. These can be used as often as needed.

====Object ====

General syntax:
 Object=(Name=''Package.ObjectName'',Class=''ObjectClass'',MetaClass=''Package.MetaClassName'',Description=&quot;''descriptive string''&quot;)

; Name : Arbitrary name; generally, must refer to an existing class.  (Though that's no engine requirement.  If you work with GetNextIntDesc to retrieve Object keys yourself, the Name argument can be anything.)

; Class : Class of the object described by this line.  In many cases, that's simply &lt;code&gt;Class&lt;/code&gt; if the Object line refers to a class.

; MetaClass : Common superclass of all objects described in Object lines that belong together; for mutators, that'd be &lt;code&gt;Engine.Mutator&lt;/code&gt;, for instance.  (This class name is used as GetNextIntDesc's first parameter.)

; Description : Arbitrary description (optional), also retrieved by GetNextIntDesc.

In [[Legacy:UT|UT]], Object entries are used to make the following items known to the game:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is &quot;Name,Description&quot;.
|-
|Game Type
|&lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;
|[[Legacy:TournamentGameInfo|TournamentGameInfo]] subclass
|Registers a game type to make it show up in the ''Game Type'' drop-down box when starting a game. Description is optional and specifies the game type's category.
|-
|Key Bindings
|&lt;code&gt;UTMenu.UTExtraKeyBindings&lt;/code&gt;
|[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] subclass
|Displays the extra key bindings defined in the given class's default properties in the standard key binder dialog.
|-
|Map List
|&lt;code&gt;Engine.MapList&lt;/code&gt;
|[[Legacy:MapList|MapList]] subclass
|Uses the maps in the given class's default properties as the default map list for this game type.
|-
|Mod Menu Item
|&lt;code&gt;UMenu.UMenuModMenuItem&lt;/code&gt;
|[[Legacy:UMenuModMenuItem|UMenuModMenuItem]] subclass
|Puts an item in the ''Mods'' menu. Description is optional and uses the structure &quot;Item Caption,Description&quot;.
|-
|Server Browser Tab
|&lt;code&gt;UTBrowser.UTBrowserServerListWindow&lt;/code&gt;
|[[Legacy:UTBrowserServerListWindow|UTBrowserServerListWindow]] subclass
|Displays a new tab in Unreal Tournament's built-in server browser.
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Not used in UT, but some custom weapon priority tools use it.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|Registers weapons that are a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. In UT only members of the Botpack package are displayed in the priority window, but some custom weapon priority tools can display all weapons.
|}

In [[Legacy:UT2003|UT2003]] the following Object entries are used:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is not used in the GUI, but is nevertheless specified for the default mutators.
|-
|Game Type
|&lt;code&gt;Engine.GameInfo&lt;/code&gt;
|[[Legacy:GameInfo|GameInfo]] subclass
|Registers a game type to make it show up in the Game Type drop-down box when starting a game. Description is important and takes the form &lt;nowiki&gt;&quot;A|B|C|D|E&quot;&lt;/nowiki&gt; with the following meanings:

* A = Prefix of the maps used by this game type
* B = Gametype's display name.
* C = a [[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]] subclass that - loads a class that allows mod author to change the tab for the game type options
* D = A [[Legacy:MapList|MapList]] class used to save the current map list selection.
* E = &quot;true&quot; for teamgames, &quot;false&quot; otherwise

|-
|Weapons
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon|Weapon]] subclass
|Registers weapons. The Description value is displayed as the weapon's description in the priority tab. You can use &quot;&lt;code&gt;{|

|}
&lt;/code&gt;&quot; to create line breaks in the description.
|}

[[Legacy:UT2004|UT2004]] has replaced the use of INT files for listing weapons, mutators, gametypes, vehicles, crosshairs, announcers and maps with a new cache library system, where class names and their cacheable properties are automatically exported to UCL (&quot;Unreal Cache Library&quot;) files when compiling those classes. It does use INT files for voicepacks, though:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Voicepack
|&lt;code&gt;XGame.xVoicePack&lt;/code&gt;
|[[Legacy:XVoicePack|xVoicePack]] subclass
|Registers a voicepack to make it show up in the character selection screen. Description is not specified.
|}

====Preferences ====

General syntax:
 Preferences=(Caption=&quot;''display name''&quot;,Parent=&quot;''display name of parent''&quot;,Class=''Package.ClassName'',Category=''variable group name'',Immediate=True)

This is used to create the options available in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.&lt;br /&gt;Either &lt;tt&gt;Class&lt;/tt&gt;, &lt;tt&gt;Category&lt;/tt&gt; and &lt;tt&gt;Immediate&lt;/tt&gt; are left out or &lt;tt&gt;Class&lt;/tt&gt; has to be a valid UnrealScript class and &lt;tt&gt;Category&lt;/tt&gt; should be a variable group used in that class. (see [[Legacy:Variable Syntax|Variable Syntax]])

===Localization Sections ===

Used to localize strings to different (natural) languages.  (also see [[Legacy:Localization|Localization]])

To create a class variable with different default values for different languages use this syntax in an UnrealScript class:

&lt;uscript&gt;
class aClassName extends aSuperClass;

var localized string Description;
var localized float SoundLength;

defaultproperties
{
     Description=&quot;An example class showing localization.&quot;
     SoundLength=2.750000
}
&lt;/uscript&gt;

This class is part of a package Example.u.

You can now create localized versions of this class by writing the corresponding localization files. This will be easier if you use UnrealEd to create the international (English) version of this file first. Open UnrealEd, load Example.u and type &quot;dumpint example&quot; at the [[Legacy:UnrealEd Console|console]]. UnrealEd created the file Example.int for you which contains all localizable variables ''that have been set in the defaultproperties''.

For this example the file will look like this:
 [aClassName]
 Description=An example class showing localization.
 SoundLength=2.750000

You can copy this file and change the extension to the desired language, e.g. DET. Now you can translate the strings and adjust the other variables to suit the new language:
 [aClassName]
 Description=Eine Beispielklasse, die Localization veranschaulicht.
 SoundLength=2.930000

Since the name of the new file is Example.det the values in it automatically become the default values of &lt;code&gt;aClassName&lt;/code&gt; when this language is selected.

'''Note:''' You can't use ''dumpint'' in UnrealEd due to a bug in the current UT2003 version. UnrealEd will crash if you try. Use: &lt;code&gt;ucc dumpint &lt;package(s)&gt; &lt;/code&gt; instead.

==UnrealScript Functions ==

===Available in all versions of the UnrealEngine===
; string GetNextInt (string ClassName, int Num) : Returns the &lt;code&gt;Class&lt;/code&gt; string from an Object entry for the MetaClass given by &lt;code&gt;ClassName&lt;/code&gt;.  &lt;code&gt;Num&lt;/code&gt; is an index, starting from 0 (zero), that specifies which (of multiple matching) entries to get.  The function returns an empty string if &lt;code&gt;Num&lt;/code&gt; exceeds the number of available matching entries.  '''Warning:''' &lt;code&gt;ClassName&lt;/code&gt; must refer to a valid, loaded class, or the game will crash.

; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextInt, but retrieves more detailed information about the Object entry, including the content of the &lt;code&gt;Description&lt;/code&gt; argument.

; string Localize (string SectionName, string KeyName, string PackageName) : Returns the localized string value of the item given by &lt;code&gt;KeyName&lt;/code&gt; in the section given by &lt;code&gt;SectionName&lt;/code&gt; for the package &lt;code&gt;PackageName&lt;/code&gt;.  Only rarely needed thanks to the [[Legacy:Localization|localized]] keyword in [[Legacy:Variable Syntax|variable declarations]] that automatically performs this lookup.  (Can be very handy for read-only configuration files though.)

===Available in UnrealEngine2===
; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [static] : Similar to &lt;tt&gt;GetNextInt()&lt;/tt&gt;, but returns all entries for the MetaClass in the Entries array. ''(Seems to work even though the '''out''' parameter modifier is missing?)''
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [static] : Similar to &lt;tt&gt;GetNextIntDesc()&lt;/tt&gt;, but returns all entries and their descriptions through the Entry and Description arrays.

===Localized versions===

; Known versions :
;* .DET - German
;* .EST - Spanish
;* .FRT - French
;* .INT - English
;* .ITT - Italian
;* .KOT - Korean
;* .JPT - Japanese

==Related Topics ==
* [[Legacy:Create An INT File|Create An INT File]]
* [[Legacy:File Format|File Format]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]]

==Discussion ==

'''JoeDark:''' Snagged the GameType part from the mailing list. I'm not sure exactly on the etiquette of such things, should I have asked DJPaul before posting it here (it was his post)? Or is it considered public domain? At any rate, I couldn't find any better place to put it. Also, did someone want to place the UT stuff on a seperate page or is all of this still relevent to UT2003?

'''Wormbo:''' I started a new table for UT2k3 INT stuff from what I found out from looking at the INT files and the code handling them.

'''DJPaul:''' JoeDark - it was my post, it is considered public domain (that sort of info), and you're more than welcome to quote anything usefull I say here.

'''SuperApe:''' What are all the known extentions for the files containing localized strings in other languages?  (.DET is German, What are the others?)

'''Jan:'''
* .DET - German
* .EST - Spanish
* .FRT - French
* .INT - English
* .ITT - Italian
* .KOT - Korean

But I don't know .SMT &amp; .TMT

'''Switch:`''' Guessing:
* .SMT - Simplified Mandarin
* .TMT - Traditional Mandarin

'''SuperApe:''' That's great.  Yeah, .KOT must be Korean.  There's several stock font textures of Korean characters.  I'm finding people to translate my .INT file so I can release it to foriegn language sites announcing or hosting my mutator.

'''Xian:''' Did any of you find any SMT or TMT file definitions or are you just guessing ?

'''SuperApe:''' Switch was guessing, but doing a little searching, it appears that the guess is likely correct.  EDIT: To confirm, it has been suggested that UT2003 patch files may include .SMT and .TMT files, so one with a knowledge of Simplified/Traditional Mandarin could take a look at those files and give a definitive answer.</text>
    </revision>
    <revision>
      <id>3693</id>
      <timestamp>2008-02-23T12:22:42Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>localizations</comment>
      <text xml:space="preserve">INT files are one of the [[Legacy:Unreal Engine|Unreal Engine]]'s [[Legacy:File Format|file format]]s. These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition, they are used for language localization and that's the origin of the file extension .int for &quot;international&quot; as well.&lt;i&gt;(You can do so many things with .int files, we could make a tutorial just for them &amp;ndash; Wormbo)&lt;/i&gt; 

These (and all other [[Legacy:Localization|localization]] files like DET, ITT, FRT, etc.) look much like [[Legacy:INI File|INI file]]s. They consist of one or more sections which start with the section's name in brackets followed by Key=Value pairs.

==File Content ==

===Public Section ===

The &lt;code&gt;[Public]&lt;/code&gt; section can take two different keys, &lt;code&gt;Object&lt;/code&gt; and &lt;code&gt;Preferences&lt;/code&gt;. These can be used as often as needed.

====Object ====

General syntax:
 Object=(Name=''Package.ObjectName'',Class=''ObjectClass'',MetaClass=''Package.MetaClassName'',Description=&quot;''descriptive string''&quot;)

; Name : Arbitrary name; generally, must refer to an existing class.  (Though that's no engine requirement.  If you work with GetNextIntDesc to retrieve Object keys yourself, the Name argument can be anything.)

; Class : Class of the object described by this line.  In many cases, that's simply &lt;code&gt;Class&lt;/code&gt; if the Object line refers to a class.

; MetaClass : Common superclass of all objects described in Object lines that belong together; for mutators, that'd be &lt;code&gt;Engine.Mutator&lt;/code&gt;, for instance.  (This class name is used as GetNextIntDesc's first parameter.)

; Description : Arbitrary description (optional), also retrieved by GetNextIntDesc.

In [[Legacy:UT|UT]], Object entries are used to make the following items known to the game:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is &quot;Name,Description&quot;.
|-
|Game Type
|&lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;
|[[Legacy:TournamentGameInfo|TournamentGameInfo]] subclass
|Registers a game type to make it show up in the ''Game Type'' drop-down box when starting a game. Description is optional and specifies the game type's category.
|-
|Key Bindings
|&lt;code&gt;UTMenu.UTExtraKeyBindings&lt;/code&gt;
|[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] subclass
|Displays the extra key bindings defined in the given class's default properties in the standard key binder dialog.
|-
|Map List
|&lt;code&gt;Engine.MapList&lt;/code&gt;
|[[Legacy:MapList|MapList]] subclass
|Uses the maps in the given class's default properties as the default map list for this game type.
|-
|Mod Menu Item
|&lt;code&gt;UMenu.UMenuModMenuItem&lt;/code&gt;
|[[Legacy:UMenuModMenuItem|UMenuModMenuItem]] subclass
|Puts an item in the ''Mods'' menu. Description is optional and uses the structure &quot;Item Caption,Description&quot;.
|-
|Server Browser Tab
|&lt;code&gt;UTBrowser.UTBrowserServerListWindow&lt;/code&gt;
|[[Legacy:UTBrowserServerListWindow|UTBrowserServerListWindow]] subclass
|Displays a new tab in Unreal Tournament's built-in server browser.
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Not used in UT, but some custom weapon priority tools use it.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|Registers weapons that are a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. In UT only members of the Botpack package are displayed in the priority window, but some custom weapon priority tools can display all weapons.
|}

In [[Legacy:UT2003|UT2003]] the following Object entries are used:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is not used in the GUI, but is nevertheless specified for the default mutators.
|-
|Game Type
|&lt;code&gt;Engine.GameInfo&lt;/code&gt;
|[[Legacy:GameInfo|GameInfo]] subclass
|Registers a game type to make it show up in the Game Type drop-down box when starting a game. Description is important and takes the form &lt;nowiki&gt;&quot;A|B|C|D|E&quot;&lt;/nowiki&gt; with the following meanings:

* A = Prefix of the maps used by this game type
* B = Gametype's display name.
* C = a [[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]] subclass that - loads a class that allows mod author to change the tab for the game type options
* D = A [[Legacy:MapList|MapList]] class used to save the current map list selection.
* E = &quot;true&quot; for teamgames, &quot;false&quot; otherwise

|-
|Weapons
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon|Weapon]] subclass
|Registers weapons. The Description value is displayed as the weapon's description in the priority tab. You can use &quot;&lt;code&gt;{|

|}
&lt;/code&gt;&quot; to create line breaks in the description.
|}

[[Legacy:UT2004|UT2004]] has replaced the use of INT files for listing weapons, mutators, gametypes, vehicles, crosshairs, announcers and maps with a new cache library system, where class names and their cacheable properties are automatically exported to UCL (&quot;Unreal Cache Library&quot;) files when compiling those classes. It does use INT files for voicepacks, though:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Voicepack
|&lt;code&gt;XGame.xVoicePack&lt;/code&gt;
|[[Legacy:XVoicePack|xVoicePack]] subclass
|Registers a voicepack to make it show up in the character selection screen. Description is not specified.
|}

====Preferences ====

General syntax:
 Preferences=(Caption=&quot;''display name''&quot;,Parent=&quot;''display name of parent''&quot;,Class=''Package.ClassName'',Category=''variable group name'',Immediate=True)

This is used to create the options available in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.&lt;br /&gt;Either &lt;tt&gt;Class&lt;/tt&gt;, &lt;tt&gt;Category&lt;/tt&gt; and &lt;tt&gt;Immediate&lt;/tt&gt; are left out or &lt;tt&gt;Class&lt;/tt&gt; has to be a valid UnrealScript class and &lt;tt&gt;Category&lt;/tt&gt; should be a variable group used in that class. (see [[Legacy:Variable Syntax|Variable Syntax]])

===Localization Sections ===

Used to localize strings to different (natural) languages.  (also see [[Legacy:Localization|Localization]])

To create a class variable with different default values for different languages use this syntax in an UnrealScript class:

&lt;uscript&gt;
class aClassName extends aSuperClass;

var localized string Description;
var localized float SoundLength;

defaultproperties
{
     Description=&quot;An example class showing localization.&quot;
     SoundLength=2.750000
}
&lt;/uscript&gt;

This class is part of a package Example.u.

You can now create localized versions of this class by writing the corresponding localization files. This will be easier if you use UnrealEd to create the international (English) version of this file first. Open UnrealEd, load Example.u and type &quot;dumpint example&quot; at the [[Legacy:UnrealEd Console|console]]. UnrealEd created the file Example.int for you which contains all localizable variables ''that have been set in the defaultproperties''.

For this example the file will look like this:
 [aClassName]
 Description=An example class showing localization.
 SoundLength=2.750000

You can copy this file and change the extension to the desired language, e.g. DET. Now you can translate the strings and adjust the other variables to suit the new language:
 [aClassName]
 Description=Eine Beispielklasse, die Localization veranschaulicht.
 SoundLength=2.930000

Since the name of the new file is Example.det the values in it automatically become the default values of &lt;code&gt;aClassName&lt;/code&gt; when this language is selected.

'''Note:''' You can't use ''dumpint'' in UnrealEd due to a bug in the current UT2003 version. UnrealEd will crash if you try. Use: &lt;code&gt;ucc dumpint &lt;package(s)&gt; &lt;/code&gt; instead.

==UnrealScript Functions ==

===Available in all versions of the UnrealEngine===
; string GetNextInt (string ClassName, int Num) : Returns the &lt;code&gt;Class&lt;/code&gt; string from an Object entry for the MetaClass given by &lt;code&gt;ClassName&lt;/code&gt;.  &lt;code&gt;Num&lt;/code&gt; is an index, starting from 0 (zero), that specifies which (of multiple matching) entries to get.  The function returns an empty string if &lt;code&gt;Num&lt;/code&gt; exceeds the number of available matching entries.  '''Warning:''' &lt;code&gt;ClassName&lt;/code&gt; must refer to a valid, loaded class, or the game will crash.

; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextInt, but retrieves more detailed information about the Object entry, including the content of the &lt;code&gt;Description&lt;/code&gt; argument.

; string Localize (string SectionName, string KeyName, string PackageName) : Returns the localized string value of the item given by &lt;code&gt;KeyName&lt;/code&gt; in the section given by &lt;code&gt;SectionName&lt;/code&gt; for the package &lt;code&gt;PackageName&lt;/code&gt;.  Only rarely needed thanks to the [[Legacy:Localization|localized]] keyword in [[Legacy:Variable Syntax|variable declarations]] that automatically performs this lookup.  (Can be very handy for read-only configuration files though.)

===Available in UnrealEngine2===
; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [static] : Similar to &lt;tt&gt;GetNextInt()&lt;/tt&gt;, but returns all entries for the MetaClass in the Entries array. ''(Seems to work even though the '''out''' parameter modifier is missing?)''
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [static] : Similar to &lt;tt&gt;GetNextIntDesc()&lt;/tt&gt;, but returns all entries and their descriptions through the Entry and Description arrays.

===Localized versions===

; Known versions :
;* .DET - German
;* .EST - Spanish
;* .FRT - French
;* .INT - English
;* .ITT - Italian
;* .KOT - Korean
;* .JPT - Japanese

==Related Topics ==

* [[Legacy:File Format|File Format]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]]

==Discussion ==

'''JoeDark:''' Snagged the GameType part from the mailing list. I'm not sure exactly on the etiquette of such things, should I have asked DJPaul before posting it here (it was his post)? Or is it considered public domain? At any rate, I couldn't find any better place to put it. Also, did someone want to place the UT stuff on a seperate page or is all of this still relevent to UT2003?

'''Wormbo:''' I started a new table for UT2k3 INT stuff from what I found out from looking at the INT files and the code handling them.

'''DJPaul:''' JoeDark - it was my post, it is considered public domain (that sort of info), and you're more than welcome to quote anything usefull I say here.

'''SuperApe:''' What are all the known extentions for the files containing localized strings in other languages?  (.DET is German, What are the others?)

'''Jan:'''
* .DET - German
* .EST - Spanish
* .FRT - French
* .INT - English
* .ITT - Italian
* .KOT - Korean

But I don't know .SMT &amp; .TMT

'''Switch:`''' Guessing:
* .SMT - Simplified Mandarin
* .TMT - Traditional Mandarin

'''SuperApe:''' That's great.  Yeah, .KOT must be Korean.  There's several stock font textures of Korean characters.  I'm finding people to translate my .INT file so I can release it to foriegn language sites announcing or hosting my mutator.

'''Xian:''' Did any of you find any SMT or TMT file definitions or are you just guessing ?</text>
    </revision>
    <revision>
      <id>3694</id>
      <timestamp>2008-03-18T20:19:12Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <comment>.SMT &amp; .TMT</comment>
      <text xml:space="preserve">INT files are one of the [[Legacy:Unreal Engine|Unreal Engine]]'s [[Legacy:File Format|file format]]s. These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition, they are used for language localization and that's the origin of the file extension .int for &quot;international&quot; as well.&lt;i&gt;(You can do so many things with .int files, we could make a tutorial just for them &amp;ndash; Wormbo)&lt;/i&gt; 

These (and all other [[Legacy:Localization|localization]] files like DET, ITT, FRT, etc.) look much like [[Legacy:INI File|INI file]]s. They consist of one or more sections which start with the section's name in brackets followed by Key=Value pairs.

==File Content ==

===Public Section ===

The &lt;code&gt;[Public]&lt;/code&gt; section can take two different keys, &lt;code&gt;Object&lt;/code&gt; and &lt;code&gt;Preferences&lt;/code&gt;. These can be used as often as needed.

====Object ====

General syntax:
 Object=(Name=''Package.ObjectName'',Class=''ObjectClass'',MetaClass=''Package.MetaClassName'',Description=&quot;''descriptive string''&quot;)

; Name : Arbitrary name; generally, must refer to an existing class.  (Though that's no engine requirement.  If you work with GetNextIntDesc to retrieve Object keys yourself, the Name argument can be anything.)

; Class : Class of the object described by this line.  In many cases, that's simply &lt;code&gt;Class&lt;/code&gt; if the Object line refers to a class.

; MetaClass : Common superclass of all objects described in Object lines that belong together; for mutators, that'd be &lt;code&gt;Engine.Mutator&lt;/code&gt;, for instance.  (This class name is used as GetNextIntDesc's first parameter.)

; Description : Arbitrary description (optional), also retrieved by GetNextIntDesc.

In [[Legacy:UT|UT]], Object entries are used to make the following items known to the game:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is &quot;Name,Description&quot;.
|-
|Game Type
|&lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;
|[[Legacy:TournamentGameInfo|TournamentGameInfo]] subclass
|Registers a game type to make it show up in the ''Game Type'' drop-down box when starting a game. Description is optional and specifies the game type's category.
|-
|Key Bindings
|&lt;code&gt;UTMenu.UTExtraKeyBindings&lt;/code&gt;
|[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] subclass
|Displays the extra key bindings defined in the given class's default properties in the standard key binder dialog.
|-
|Map List
|&lt;code&gt;Engine.MapList&lt;/code&gt;
|[[Legacy:MapList|MapList]] subclass
|Uses the maps in the given class's default properties as the default map list for this game type.
|-
|Mod Menu Item
|&lt;code&gt;UMenu.UMenuModMenuItem&lt;/code&gt;
|[[Legacy:UMenuModMenuItem|UMenuModMenuItem]] subclass
|Puts an item in the ''Mods'' menu. Description is optional and uses the structure &quot;Item Caption,Description&quot;.
|-
|Server Browser Tab
|&lt;code&gt;UTBrowser.UTBrowserServerListWindow&lt;/code&gt;
|[[Legacy:UTBrowserServerListWindow|UTBrowserServerListWindow]] subclass
|Displays a new tab in Unreal Tournament's built-in server browser.
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Not used in UT, but some custom weapon priority tools use it.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|Registers weapons that are a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. In UT only members of the Botpack package are displayed in the priority window, but some custom weapon priority tools can display all weapons.
|}

In [[Legacy:UT2003|UT2003]] the following Object entries are used:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is not used in the GUI, but is nevertheless specified for the default mutators.
|-
|Game Type
|&lt;code&gt;Engine.GameInfo&lt;/code&gt;
|[[Legacy:GameInfo|GameInfo]] subclass
|Registers a game type to make it show up in the Game Type drop-down box when starting a game. Description is important and takes the form &lt;nowiki&gt;&quot;A|B|C|D|E&quot;&lt;/nowiki&gt; with the following meanings:

* A = Prefix of the maps used by this game type
* B = Gametype's display name.
* C = a [[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]] subclass that - loads a class that allows mod author to change the tab for the game type options
* D = A [[Legacy:MapList|MapList]] class used to save the current map list selection.
* E = &quot;true&quot; for teamgames, &quot;false&quot; otherwise

|-
|Weapons
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon|Weapon]] subclass
|Registers weapons. The Description value is displayed as the weapon's description in the priority tab. You can use &quot;&lt;code&gt;{|

|}
&lt;/code&gt;&quot; to create line breaks in the description.
|}

[[Legacy:UT2004|UT2004]] has replaced the use of INT files for listing weapons, mutators, gametypes, vehicles, crosshairs, announcers and maps with a new cache library system, where class names and their cacheable properties are automatically exported to UCL (&quot;Unreal Cache Library&quot;) files when compiling those classes. It does use INT files for voicepacks, though:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Voicepack
|&lt;code&gt;XGame.xVoicePack&lt;/code&gt;
|[[Legacy:XVoicePack|xVoicePack]] subclass
|Registers a voicepack to make it show up in the character selection screen. Description is not specified.
|}

====Preferences ====

General syntax:
 Preferences=(Caption=&quot;''display name''&quot;,Parent=&quot;''display name of parent''&quot;,Class=''Package.ClassName'',Category=''variable group name'',Immediate=True)

This is used to create the options available in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.&lt;br /&gt;Either &lt;tt&gt;Class&lt;/tt&gt;, &lt;tt&gt;Category&lt;/tt&gt; and &lt;tt&gt;Immediate&lt;/tt&gt; are left out or &lt;tt&gt;Class&lt;/tt&gt; has to be a valid UnrealScript class and &lt;tt&gt;Category&lt;/tt&gt; should be a variable group used in that class. (see [[Legacy:Variable Syntax|Variable Syntax]])

===Localization Sections ===

Used to localize strings to different (natural) languages.  (also see [[Legacy:Localization|Localization]])

To create a class variable with different default values for different languages use this syntax in an UnrealScript class:

&lt;uscript&gt;
class aClassName extends aSuperClass;

var localized string Description;
var localized float SoundLength;

defaultproperties
{
     Description=&quot;An example class showing localization.&quot;
     SoundLength=2.750000
}
&lt;/uscript&gt;

This class is part of a package Example.u.

You can now create localized versions of this class by writing the corresponding localization files. This will be easier if you use UnrealEd to create the international (English) version of this file first. Open UnrealEd, load Example.u and type &quot;dumpint example&quot; at the [[Legacy:UnrealEd Console|console]]. UnrealEd created the file Example.int for you which contains all localizable variables ''that have been set in the defaultproperties''.

For this example the file will look like this:
 [aClassName]
 Description=An example class showing localization.
 SoundLength=2.750000

You can copy this file and change the extension to the desired language, e.g. DET. Now you can translate the strings and adjust the other variables to suit the new language:
 [aClassName]
 Description=Eine Beispielklasse, die Localization veranschaulicht.
 SoundLength=2.930000

Since the name of the new file is Example.det the values in it automatically become the default values of &lt;code&gt;aClassName&lt;/code&gt; when this language is selected.

'''Note:''' You can't use ''dumpint'' in UnrealEd due to a bug in the current UT2003 version. UnrealEd will crash if you try. Use: &lt;code&gt;ucc dumpint &lt;package(s)&gt; &lt;/code&gt; instead.

==UnrealScript Functions ==

===Available in all versions of the UnrealEngine===
; string GetNextInt (string ClassName, int Num) : Returns the &lt;code&gt;Class&lt;/code&gt; string from an Object entry for the MetaClass given by &lt;code&gt;ClassName&lt;/code&gt;.  &lt;code&gt;Num&lt;/code&gt; is an index, starting from 0 (zero), that specifies which (of multiple matching) entries to get.  The function returns an empty string if &lt;code&gt;Num&lt;/code&gt; exceeds the number of available matching entries.  '''Warning:''' &lt;code&gt;ClassName&lt;/code&gt; must refer to a valid, loaded class, or the game will crash.

; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextInt, but retrieves more detailed information about the Object entry, including the content of the &lt;code&gt;Description&lt;/code&gt; argument.

; string Localize (string SectionName, string KeyName, string PackageName) : Returns the localized string value of the item given by &lt;code&gt;KeyName&lt;/code&gt; in the section given by &lt;code&gt;SectionName&lt;/code&gt; for the package &lt;code&gt;PackageName&lt;/code&gt;.  Only rarely needed thanks to the [[Legacy:Localization|localized]] keyword in [[Legacy:Variable Syntax|variable declarations]] that automatically performs this lookup.  (Can be very handy for read-only configuration files though.)

===Available in UnrealEngine2===
; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [static] : Similar to &lt;tt&gt;GetNextInt()&lt;/tt&gt;, but returns all entries for the MetaClass in the Entries array. ''(Seems to work even though the '''out''' parameter modifier is missing?)''
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [static] : Similar to &lt;tt&gt;GetNextIntDesc()&lt;/tt&gt;, but returns all entries and their descriptions through the Entry and Description arrays.

===Localized versions===

; Known versions :
;* .DET - German
;* .EST - Spanish
;* .FRT - French
;* .INT - English
;* .ITT - Italian
;* .KOT - Korean
;* .JPT - Japanese

==Related Topics ==

* [[Legacy:File Format|File Format]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]]

==Discussion ==

'''JoeDark:''' Snagged the GameType part from the mailing list. I'm not sure exactly on the etiquette of such things, should I have asked DJPaul before posting it here (it was his post)? Or is it considered public domain? At any rate, I couldn't find any better place to put it. Also, did someone want to place the UT stuff on a seperate page or is all of this still relevent to UT2003?

'''Wormbo:''' I started a new table for UT2k3 INT stuff from what I found out from looking at the INT files and the code handling them.

'''DJPaul:''' JoeDark - it was my post, it is considered public domain (that sort of info), and you're more than welcome to quote anything usefull I say here.

'''SuperApe:''' What are all the known extentions for the files containing localized strings in other languages?  (.DET is German, What are the others?)

'''Jan:'''
* .DET - German
* .EST - Spanish
* .FRT - French
* .INT - English
* .ITT - Italian
* .KOT - Korean

But I don't know .SMT &amp; .TMT

'''Switch:`''' Guessing:
* .SMT - Simplified Mandarin
* .TMT - Traditional Mandarin

'''SuperApe:''' That's great.  Yeah, .KOT must be Korean.  There's several stock font textures of Korean characters.  I'm finding people to translate my .INT file so I can release it to foriegn language sites announcing or hosting my mutator.

'''Xian:''' Did any of you find any SMT or TMT file definitions or are you just guessing ?

'''SuperApe:''' Switch was guessing, but doing a little searching, it appears that the guess is likely correct.</text>
    </revision>
    <revision>
      <id>3695</id>
      <timestamp>2008-03-25T19:08:38Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">INT files are one of the [[Legacy:Unreal Engine|Unreal Engine]]'s [[Legacy:File Format|file format]]s. These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition, they are used for language localization and that's the origin of the file extension .int for &quot;international&quot; as well.&lt;i&gt;(You can do so many things with .int files, we could make a tutorial just for them &amp;ndash; Wormbo)&lt;/i&gt; 

These (and all other [[Legacy:Localization|localization]] files like DET, ITT, FRT, etc.) look much like [[Legacy:INI File|INI file]]s. They consist of one or more sections which start with the section's name in brackets followed by Key=Value pairs.

==File Content ==

===Public Section ===

The &lt;code&gt;[Public]&lt;/code&gt; section can take two different keys, &lt;code&gt;Object&lt;/code&gt; and &lt;code&gt;Preferences&lt;/code&gt;. These can be used as often as needed.

====Object ====

General syntax:
 Object=(Name=''Package.ObjectName'',Class=''ObjectClass'',MetaClass=''Package.MetaClassName'',Description=&quot;''descriptive string''&quot;)

; Name : Arbitrary name; generally, must refer to an existing class.  (Though that's no engine requirement.  If you work with GetNextIntDesc to retrieve Object keys yourself, the Name argument can be anything.)

; Class : Class of the object described by this line.  In many cases, that's simply &lt;code&gt;Class&lt;/code&gt; if the Object line refers to a class.

; MetaClass : Common superclass of all objects described in Object lines that belong together; for mutators, that'd be &lt;code&gt;Engine.Mutator&lt;/code&gt;, for instance.  (This class name is used as GetNextIntDesc's first parameter.)

; Description : Arbitrary description (optional), also retrieved by GetNextIntDesc.

In [[Legacy:UT|UT]], Object entries are used to make the following items known to the game:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is &quot;Name,Description&quot;.
|-
|Game Type
|&lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;
|[[Legacy:TournamentGameInfo|TournamentGameInfo]] subclass
|Registers a game type to make it show up in the ''Game Type'' drop-down box when starting a game. Description is optional and specifies the game type's category.
|-
|Key Bindings
|&lt;code&gt;UTMenu.UTExtraKeyBindings&lt;/code&gt;
|[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] subclass
|Displays the extra key bindings defined in the given class's default properties in the standard key binder dialog.
|-
|Map List
|&lt;code&gt;Engine.MapList&lt;/code&gt;
|[[Legacy:MapList|MapList]] subclass
|Uses the maps in the given class's default properties as the default map list for this game type.
|-
|Mod Menu Item
|&lt;code&gt;UMenu.UMenuModMenuItem&lt;/code&gt;
|[[Legacy:UMenuModMenuItem|UMenuModMenuItem]] subclass
|Puts an item in the ''Mods'' menu. Description is optional and uses the structure &quot;Item Caption,Description&quot;.
|-
|Server Browser Tab
|&lt;code&gt;UTBrowser.UTBrowserServerListWindow&lt;/code&gt;
|[[Legacy:UTBrowserServerListWindow|UTBrowserServerListWindow]] subclass
|Displays a new tab in Unreal Tournament's built-in server browser.
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Not used in UT, but some custom weapon priority tools use it.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|Registers weapons that are a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. In UT only members of the Botpack package are displayed in the priority window, but some custom weapon priority tools can display all weapons.
|}

In [[Legacy:UT2003|UT2003]] the following Object entries are used:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is not used in the GUI, but is nevertheless specified for the default mutators.
|-
|Game Type
|&lt;code&gt;Engine.GameInfo&lt;/code&gt;
|[[Legacy:GameInfo|GameInfo]] subclass
|Registers a game type to make it show up in the Game Type drop-down box when starting a game. Description is important and takes the form &lt;nowiki&gt;&quot;A|B|C|D|E&quot;&lt;/nowiki&gt; with the following meanings:

* A = Prefix of the maps used by this game type
* B = Gametype's display name.
* C = a [[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]] subclass that - loads a class that allows mod author to change the tab for the game type options
* D = A [[Legacy:MapList|MapList]] class used to save the current map list selection.
* E = &quot;true&quot; for teamgames, &quot;false&quot; otherwise

|-
|Weapons
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon|Weapon]] subclass
|Registers weapons. The Description value is displayed as the weapon's description in the priority tab. You can use &quot;&lt;code&gt;{|

|}
&lt;/code&gt;&quot; to create line breaks in the description.
|}

[[Legacy:UT2004|UT2004]] has replaced the use of INT files for listing weapons, mutators, gametypes, vehicles, crosshairs, announcers and maps with a new cache library system, where class names and their cacheable properties are automatically exported to UCL (&quot;Unreal Cache Library&quot;) files when compiling those classes. It does use INT files for voicepacks, though:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Voicepack
|&lt;code&gt;XGame.xVoicePack&lt;/code&gt;
|[[Legacy:XVoicePack|xVoicePack]] subclass
|Registers a voicepack to make it show up in the character selection screen. Description is not specified.
|}

====Preferences ====

General syntax:
 Preferences=(Caption=&quot;''display name''&quot;,Parent=&quot;''display name of parent''&quot;,Class=''Package.ClassName'',Category=''variable group name'',Immediate=True)

This is used to create the options available in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.&lt;br /&gt;Either &lt;tt&gt;Class&lt;/tt&gt;, &lt;tt&gt;Category&lt;/tt&gt; and &lt;tt&gt;Immediate&lt;/tt&gt; are left out or &lt;tt&gt;Class&lt;/tt&gt; has to be a valid UnrealScript class and &lt;tt&gt;Category&lt;/tt&gt; should be a variable group used in that class. (see [[Legacy:Variable Syntax|Variable Syntax]])

===Localization Sections ===

Used to localize strings to different (natural) languages.  (also see [[Legacy:Localization|Localization]])

To create a class variable with different default values for different languages use this syntax in an UnrealScript class:

&lt;uscript&gt;
class aClassName extends aSuperClass;

var localized string Description;
var localized float SoundLength;

defaultproperties
{
     Description=&quot;An example class showing localization.&quot;
     SoundLength=2.750000
}
&lt;/uscript&gt;

This class is part of a package Example.u.

You can now create localized versions of this class by writing the corresponding localization files. This will be easier if you use UnrealEd to create the international (English) version of this file first. Open UnrealEd, load Example.u and type &quot;dumpint example&quot; at the [[Legacy:UnrealEd Console|console]]. UnrealEd created the file Example.int for you which contains all localizable variables ''that have been set in the defaultproperties''.

For this example the file will look like this:
 [aClassName]
 Description=An example class showing localization.
 SoundLength=2.750000

You can copy this file and change the extension to the desired language, e.g. DET. Now you can translate the strings and adjust the other variables to suit the new language:
 [aClassName]
 Description=Eine Beispielklasse, die Localization veranschaulicht.
 SoundLength=2.930000

Since the name of the new file is Example.det the values in it automatically become the default values of &lt;code&gt;aClassName&lt;/code&gt; when this language is selected.

'''Note:''' You can't use ''dumpint'' in UnrealEd due to a bug in the current UT2003 version. UnrealEd will crash if you try. Use: &lt;code&gt;ucc dumpint &lt;package(s)&gt; &lt;/code&gt; instead.

==UnrealScript Functions ==

===Available in all versions of the UnrealEngine===
; string GetNextInt (string ClassName, int Num) : Returns the &lt;code&gt;Class&lt;/code&gt; string from an Object entry for the MetaClass given by &lt;code&gt;ClassName&lt;/code&gt;.  &lt;code&gt;Num&lt;/code&gt; is an index, starting from 0 (zero), that specifies which (of multiple matching) entries to get.  The function returns an empty string if &lt;code&gt;Num&lt;/code&gt; exceeds the number of available matching entries.  '''Warning:''' &lt;code&gt;ClassName&lt;/code&gt; must refer to a valid, loaded class, or the game will crash.

; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextInt, but retrieves more detailed information about the Object entry, including the content of the &lt;code&gt;Description&lt;/code&gt; argument.

; string Localize (string SectionName, string KeyName, string PackageName) : Returns the localized string value of the item given by &lt;code&gt;KeyName&lt;/code&gt; in the section given by &lt;code&gt;SectionName&lt;/code&gt; for the package &lt;code&gt;PackageName&lt;/code&gt;.  Only rarely needed thanks to the [[Legacy:Localization|localized]] keyword in [[Legacy:Variable Syntax|variable declarations]] that automatically performs this lookup.  (Can be very handy for read-only configuration files though.)

===Available in UnrealEngine2===
; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [static] : Similar to &lt;tt&gt;GetNextInt()&lt;/tt&gt;, but returns all entries for the MetaClass in the Entries array. ''(Seems to work even though the '''out''' parameter modifier is missing?)''
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [static] : Similar to &lt;tt&gt;GetNextIntDesc()&lt;/tt&gt;, but returns all entries and their descriptions through the Entry and Description arrays.

===Localized versions===

; Known versions :
;* .DET - German
;* .EST - Spanish
;* .FRT - French
;* .INT - English
;* .ITT - Italian
;* .KOT - Korean
;* .JPT - Japanese

==Related Topics ==
* [[Legacy:Create An INT File|Create An INT File]]
* [[Legacy:File Format|File Format]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]]

==Discussion ==

'''JoeDark:''' Snagged the GameType part from the mailing list. I'm not sure exactly on the etiquette of such things, should I have asked DJPaul before posting it here (it was his post)? Or is it considered public domain? At any rate, I couldn't find any better place to put it. Also, did someone want to place the UT stuff on a seperate page or is all of this still relevent to UT2003?

'''Wormbo:''' I started a new table for UT2k3 INT stuff from what I found out from looking at the INT files and the code handling them.

'''DJPaul:''' JoeDark - it was my post, it is considered public domain (that sort of info), and you're more than welcome to quote anything usefull I say here.

'''SuperApe:''' What are all the known extentions for the files containing localized strings in other languages?  (.DET is German, What are the others?)

'''Jan:'''
* .DET - German
* .EST - Spanish
* .FRT - French
* .INT - English
* .ITT - Italian
* .KOT - Korean

But I don't know .SMT &amp; .TMT

'''Switch:`''' Guessing:
* .SMT - Simplified Mandarin
* .TMT - Traditional Mandarin

'''SuperApe:''' That's great.  Yeah, .KOT must be Korean.  There's several stock font textures of Korean characters.  I'm finding people to translate my .INT file so I can release it to foriegn language sites announcing or hosting my mutator.

'''Xian:''' Did any of you find any SMT or TMT file definitions or are you just guessing ?

'''SuperApe:''' Switch was guessing, but doing a little searching, it appears that the guess is likely correct.</text>
    </revision>
    <revision>
      <id>44482</id>
      <timestamp>2011-06-10T08:44:45Z</timestamp>
      <contributor>
        <username>Bobbuz</username>
        <id>87</id>
      </contributor>
      <text xml:space="preserve">INT files are one of the [[Legacy:Unreal Engine|Unreal Engine]]'s [[Legacy:File Format|file format]]s. These files are used by the Unreal engine for reference.  Instead of searching all the packages made accessible to it to find the resources it's looking for, it simply reads the lists of resources contained in these files.  In addition, they are used for language localization and that's the origin of the file extension .int for &quot;international&quot; as well.&lt;i&gt;(You can do so many things with .int files, we could make a tutorial just for them &amp;ndash; Wormbo)&lt;/i&gt; 

These (and all other [[Legacy:Localization|localization]] files like DET, ITT, FRT, etc.) look much like [[Legacy:INI File|INI file]]s. They consist of one or more sections which start with the section's name in brackets followed by Key=Value pairs.

==File Content ==

===Public Section ===

The &lt;code&gt;[Public]&lt;/code&gt; section can take two different keys, &lt;code&gt;Object&lt;/code&gt; and &lt;code&gt;Preferences&lt;/code&gt;. These can be used as often as needed.

====Object ====

General syntax:
 Object=(Name=''Package.ObjectName'',Class=''ObjectClass'',MetaClass=''Package.MetaClassName'',Description=&quot;''descriptive string''&quot;)

; Name : Arbitrary name; generally, must refer to an existing class.  (Though that's no engine requirement.  If you work with GetNextIntDesc to retrieve Object keys yourself, the Name argument can be anything.)

; Class : Class of the object described by this line.  In many cases, that's simply &lt;code&gt;Class&lt;/code&gt; if the Object line refers to a class.

; MetaClass : Common superclass of all objects described in Object lines that belong together; for mutators, that'd be &lt;code&gt;Engine.Mutator&lt;/code&gt;, for instance.  (This class name is used as GetNextIntDesc's first parameter.)

; Description : Arbitrary description (optional), also retrieved by GetNextIntDesc.

In [[Legacy:UT|UT]], Object entries are used to make the following items known to the game:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is &quot;Name,Description&quot;.
|-
|Game Type
|&lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;
|[[Legacy:TournamentGameInfo|TournamentGameInfo]] subclass
|Registers a game type to make it show up in the ''Game Type'' drop-down box when starting a game. Description is optional and specifies the game type's category.
|-
|Key Bindings
|&lt;code&gt;UTMenu.UTExtraKeyBindings&lt;/code&gt;
|[[Legacy:UTExtraKeyBindings|UTExtraKeyBindings]] subclass
|Displays the extra key bindings defined in the given class's default properties in the standard key binder dialog.
|-
|Map List
|&lt;code&gt;Engine.MapList&lt;/code&gt;
|[[Legacy:MapList|MapList]] subclass
|Uses the maps in the given class's default properties as the default map list for this game type.
|-
|Mod Menu Item
|&lt;code&gt;UMenu.UMenuModMenuItem&lt;/code&gt;
|[[Legacy:UMenuModMenuItem|UMenuModMenuItem]] subclass
|Puts an item in the ''Mods'' menu. Description is optional and uses the structure &quot;Item Caption,Description&quot;.
|-
|Server Browser Tab
|&lt;code&gt;UTBrowser.UTBrowserServerListWindow&lt;/code&gt;
|[[Legacy:UTBrowserServerListWindow|UTBrowserServerListWindow]] subclass
|Displays a new tab in Unreal Tournament's built-in server browser.
|-
|Weapons (Unreal)
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon (UT)|Weapon (UT)]] subclass
|Registers weapons that are not a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. Not used in UT, but some custom weapon priority tools use it.
|-
|Weapons (Unreal Tournament)
|&lt;code&gt;Botpack.TournamentWeapon&lt;/code&gt;
|[[Legacy:TournamentWeapon|TournamentWeapon]] subclass
|Registers weapons that are a subclass of [[Legacy:TournamentWeapon|TournamentWeapon]]. In UT only members of the Botpack package are displayed in the priority window, but some custom weapon priority tools can display all weapons.
|}

In [[Legacy:UT2003|UT2003]] the following Object entries are used:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Mutator
|&lt;code&gt;Engine.Mutator&lt;/code&gt;
|[[Legacy:Mutator|Mutator]] subclass
|Registers a mutator to make it show up in the ''Mutators'' dialog box when starting a game. Description is not used in the GUI, but is nevertheless specified for the default mutators.
|-
|Game Type
|&lt;code&gt;Engine.GameInfo&lt;/code&gt;
|[[Legacy:GameInfo|GameInfo]] subclass
|Registers a game type to make it show up in the Game Type drop-down box when starting a game. Description is important and takes the form &lt;nowiki&gt;&quot;A|B|C|D|E&quot;&lt;/nowiki&gt; with the following meanings:

* A = Prefix of the maps used by this game type
* B = Gametype's display name.
* C = a [[Legacy:Tab_InstantActionBaseRules|Tab_InstantActionBaseRules]] subclass that - loads a class that allows mod author to change the tab for the game type options
* D = A [[Legacy:MapList|MapList]] class used to save the current map list selection.
* E = &quot;true&quot; for teamgames, &quot;false&quot; otherwise

|-
|Weapons
|&lt;code&gt;Engine.Weapon&lt;/code&gt;
|[[Legacy:Weapon|Weapon]] subclass
|Registers weapons. The Description value is displayed as the weapon's description in the priority tab. You can use &quot;&lt;code&gt;{|

|}
&lt;/code&gt;&quot; to create line breaks in the description.
|}

[[Legacy:UT2004|UT2004]] has replaced the use of INT files for listing weapons, mutators, gametypes, vehicles, crosshairs, announcers and maps with a new cache library system, where class names and their cacheable properties are automatically exported to UCL (&quot;Unreal Cache Library&quot;) files when compiling those classes. It does use INT files for voicepacks, though:

{|

|-
|'''Item'''
|'''MetaClass'''
|'''Name'''
|'''Explanation''' 
|-
|Voicepack
|&lt;code&gt;XGame.xVoicePack&lt;/code&gt;
|[[Legacy:XVoicePack|xVoicePack]] subclass
|Registers a voicepack to make it show up in the character selection screen. Description is not specified.
|}

====Preferences ====

General syntax:
 Preferences=(Caption=&quot;''display name''&quot;,Parent=&quot;''display name of parent''&quot;,Class=''Package.ClassName'',Category=''variable group name'',Immediate=True)

This is used to create the options available in the [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] window.&lt;br /&gt;Either &lt;tt&gt;Class&lt;/tt&gt;, &lt;tt&gt;Category&lt;/tt&gt; and &lt;tt&gt;Immediate&lt;/tt&gt; are left out or &lt;tt&gt;Class&lt;/tt&gt; has to be a valid UnrealScript class and &lt;tt&gt;Category&lt;/tt&gt; should be a variable group used in that class. (see [[Legacy:Variable Syntax|Variable Syntax]])

===Localization Sections ===

Used to localize strings to different (natural) languages.  (also see [[Legacy:Localization|Localization]])

To create a class variable with different default values for different languages use this syntax in an UnrealScript class:

&lt;uscript&gt;
class aClassName extends aSuperClass;

var localized string Description;
var localized float SoundLength;

defaultproperties
{
     Description=&quot;An example class showing localization.&quot;
     SoundLength=2.750000
}
&lt;/uscript&gt;

This class is part of a package Example.u.

You can now create localized versions of this class by writing the corresponding localization files. This will be easier if you use UnrealEd to create the international (English) version of this file first. Open UnrealEd, load Example.u and type &quot;dumpint example&quot; at the [[Legacy:UnrealEd Console|console]]. UnrealEd created the file Example.int for you which contains all localizable variables ''that have been set in the defaultproperties''.

For this example the file will look like this:
 [aClassName]
 Description=An example class showing localization.
 SoundLength=2.750000

You can copy this file and change the extension to the desired language, e.g. DET. Now you can translate the strings and adjust the other variables to suit the new language:
 [aClassName]
 Description=Eine Beispielklasse, die Localization veranschaulicht.
 SoundLength=2.930000

Since the name of the new file is Example.det the values in it automatically become the default values of &lt;code&gt;aClassName&lt;/code&gt; when this language is selected.

'''Note:''' You can't use ''dumpint'' in UnrealEd due to a bug in the current UT2003 version. UnrealEd will crash if you try. Use: &lt;code&gt;ucc dumpint &lt;package(s)&gt; &lt;/code&gt; instead.

==UnrealScript Functions ==

===Available in all versions of the UnrealEngine===
; string GetNextInt (string ClassName, int Num) : Returns the &lt;code&gt;Class&lt;/code&gt; string from an Object entry for the MetaClass given by &lt;code&gt;ClassName&lt;/code&gt;.  &lt;code&gt;Num&lt;/code&gt; is an index, starting from 0 (zero), that specifies which (of multiple matching) entries to get.  The function returns an empty string if &lt;code&gt;Num&lt;/code&gt; exceeds the number of available matching entries.  '''Warning:''' &lt;code&gt;ClassName&lt;/code&gt; must refer to a valid, loaded class, or the game will crash.

; GetNextIntDesc (string ClassName, int Num, out string Entry, out string Description) : Like GetNextInt, but retrieves more detailed information about the Object entry, including the content of the &lt;code&gt;Description&lt;/code&gt; argument.

; string Localize (string SectionName, string KeyName, string PackageName) : Returns the localized string value of the item given by &lt;code&gt;KeyName&lt;/code&gt; in the section given by &lt;code&gt;SectionName&lt;/code&gt; for the package &lt;code&gt;PackageName&lt;/code&gt;.  Only rarely needed thanks to the [[Legacy:Localization|localized]] keyword in [[Legacy:Variable Syntax|variable declarations]] that automatically performs this lookup.  (Can be very handy for read-only configuration files though.)

===Available in UnrealEngine2===
; GetAllInt (string MetaClass, array&lt;string&gt; Entries) [static] : Similar to &lt;tt&gt;GetNextInt()&lt;/tt&gt;, but returns all entries for the MetaClass in the Entries array. ''(Seems to work even though the '''out''' parameter modifier is missing?)''
; GetAllIntDesc (string MetaClass, out array&lt;string&gt; Entry, out array&lt;string&gt; Description) [static] : Similar to &lt;tt&gt;GetNextIntDesc()&lt;/tt&gt;, but returns all entries and their descriptions through the Entry and Description arrays.

===Localized versions===

; Known versions :
;* .DET - German
;* .EST - Spanish
;* .FRT - French
;* .INT - English
;* .ITT - Italian
;* .KOT - Korean
;* .TCT - Czech
;* .RUT - Russian

==Related Topics ==
* [[Legacy:Create An INT File|Create An INT File]]
* [[Legacy:File Format|File Format]]
* [[Legacy:Localization|Localization]]
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:DumpIntCommandlet|DumpIntCommandlet]]

==Discussion ==

'''JoeDark:''' Snagged the GameType part from the mailing list. I'm not sure exactly on the etiquette of such things, should I have asked DJPaul before posting it here (it was his post)? Or is it considered public domain? At any rate, I couldn't find any better place to put it. Also, did someone want to place the UT stuff on a seperate page or is all of this still relevent to UT2003?

'''Wormbo:''' I started a new table for UT2k3 INT stuff from what I found out from looking at the INT files and the code handling them.

'''DJPaul:''' JoeDark - it was my post, it is considered public domain (that sort of info), and you're more than welcome to quote anything usefull I say here.

'''SuperApe:''' What are all the known extentions for the files containing localized strings in other languages?  (.DET is German, What are the others?)

'''Jan:'''
* .DET - German
* .EST - Spanish
* .FRT - French
* .INT - English
* .ITT - Italian
* .KOT - Korean

But I don't know .SMT &amp; .TMT

'''Switch:`''' Guessing:
* .SMT - Simplified Mandarin
* .TMT - Traditional Mandarin

'''SuperApe:''' That's great.  Yeah, .KOT must be Korean.  There's several stock font textures of Korean characters.  I'm finding people to translate my .INT file so I can release it to foriegn language sites announcing or hosting my mutator.

'''Xian:''' Did any of you find any SMT or TMT file definitions or are you just guessing ?

'''SuperApe:''' Switch was guessing, but doing a little searching, it appears that the guess is likely correct.  EDIT: To confirm, it has been suggested that UT2003 patch files may include .SMT and .TMT files, so one with a knowledge of Simplified/Traditional Mandarin could take a look at those files and give a definitive answer.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:INsanity</title>
    <id>1523</id>
    <revision>
      <id>3808</id>
      <timestamp>2006-03-15T22:51:06Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">INsanity is a modified version of the Land of the Dead version of the [[Legacy:Invasion|Invasion]] [[Legacy:Gametype|gametype]].  It uses the standard Invasion maps.

==Description==

{{innerbox| Alongside the other players, you must hold out as long as possible against the waves of attacking zombies.

}}

==INsanity==

INsanity adds a lot more server control over the game.  The original Invasion game type relied upon the level designers to set limits for the number of attacking zombies.  In the INsanity type, the server operator may override the level defaults to either accommodate slower servers that can't handle running the AI for a large horde of zombies, or may increase the limits far beyond what the level designers had intended.  The test server has run anywhere from 1 zombie at a time, to a wave of over 100 to start on a level that was originally defined to have only a small handful of zombies.

Like the standard Invasion, you are out of the game after dying, until that wave has ended.  However, the server operator may define a number (or infinite) of respawns to allow between waves.  The game also adds the ability to limit the number of waves, similar to UT2k4's Invasion.

The INsanity game is also packaged with several other mods:

; Improved HUD chat/messaging system
; Improved Zombie AI
; Running Zombies
; Weapon modifiers
; JumpZ modifier
; Difficulty modifier

An INsanity game configured with all of the mods is quite INsane, INdeed.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Icculus</title>
    <id>1492</id>
    <revision>
      <id>3742</id>
      <timestamp>2003-04-20T22:54:28Z</timestamp>
      <contributor>
        <ip>62.21.194.xxx</ip>
      </contributor>
      <minor/>
      <comment>who ate my cookie</comment>
      <text xml:space="preserve">----

'''El Muerte TDS:''' Welcome to the UnrealWiki Icculus</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IceCreamYou</title>
    <id>1526</id>
    <revision>
      <id>3813</id>
      <timestamp>2008-01-03T16:03:00Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <minor/>
      <comment>website theme change</comment>
      <text xml:space="preserve">==About Me==

I'm a casual mapper who loves the Unreal series.  I like originality in maps, especially in gameplay.  I played UT, UT2004, and UT3; I like UT2004 and UT3 equally (except for the menu systems...) and will probably switch to mapping for UT3.  I am very active on the BUF mapping forum, and somewhat active on other sites.  Also, I am a map reviewer at [http://insite.beyondunreal.com/ Insite].

==My Website==

Visit http://www.IceCreamYou.com/ to see my maps, a huge tutorials section which aims to guide mappers from total newbie to expert, and an article I wrote on Level Design.  Everything on the site is for UT2004 and UT3.

As of January 3, 2008, the site has officially launched a new, much more aesthetic theme.

==CTF-LeftAlive==

My most recent map, [http://www.icecreamyou.com/CTF-LeftAlive.html CTF-LeftAlive], has been completed as of August 25, 2007.  Situated on an alien planet that was once a volcanic nightmare, this nighttime map is totally asymmetrical but extremely balanced.  The gameplay has received much praise, and the visuals have been applauded since the theme change to the alien planet.

==Future Projects==

I've discussed collaborating with ShredPrince on two different maps.  We're thinking about releasing a joint map pack with 2-4 maps.  I might also revive a collaborative project I had once planned with *|BILLY$CLINT|* but update it for UT3's Warfare gametype, and I'd like to contact DGUnreal again about getting him to contribute to a map pack.

Having said that, given the amount of free time I have, the possibility of much getting done is fairly small.  Certainly, at least one map will be produced from all this though. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3814</id>
      <timestamp>2007-09-17T07:56:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

I'm a casual mapper who loves the Unreal series.  I like originality in maps, especially in gameplay.  I prefer UT2004, but am waiting anxiously for UT3 and its editor.  I am very active on the BUF mapping forum, and somewhat active on other sites.  Also, I've recently become a map reviewer at [http://insite.beyondunreal.com/ Insite].

==My Website==

Visit http://www.IceCreamYou.com/ to see my maps, a huge tutorials section which aims to guide mappers from total newbie to expert, and an article I wrote on Level Design.

==Current Projects==

My most recent map, [http://www.icecreamyou.com/CTF-LeftAlive.htm CTF-LeftAlive], has been completed as of August 25, 2007.  Situated on an alien planet that was once a volcanic nightmare, this nighttime map is totally asymmetrical but extremely balanced.  The gameplay has received much praise, and the visuals have been applauded since the theme change to the alien planet.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IceSkaarj</title>
    <id>28415</id>
    <revision>
      <id>40087</id>
      <timestamp>2009-11-15T08:28:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IceTexture</title>
    <id>1464</id>
    <revision>
      <id>3675</id>
      <timestamp>2005-12-16T20:14:56Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; IceTexture (Package: Fire)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; IceTexture (Package: Fire)}}

Uses a texture as displacement for another texture. Both textures must have exactly the same dimensions to make this work.

Also see [http://unreal.epicgames.com/Fire/AnimatingTextures.htm#Ice Animated Real-Time Textures].

==Properties ==

===IceLayer Group ===
; byte Amplitude
; byte Frequency : Frequency and Amplitude act on the speed and size of the circular and wavy parts of a texture's movements.
; [[Legacy:Texture|Texture]] GlassTexture :  Interpreted as an 8-bit distortion vector field.
; bool MoveIce :  The MoveIce switch selects movement of either the GlassTexture or SourceTexture.
; PanningType PanningStyle :  
; [[Legacy:Texture|Texture]] SourceTexture :  
; TimingType TimeMethod :  
; byte HorizPanSpeed
; byte VertPanSpeed :  HorizPanSpeed and VertPanSpeed determine the movement in the Linear and WavyX/Y modes, with a zero-point of (128,128).

===Hidden ===
; int ForceRefresh :  
; int LocalSource :  
; float MasterCount :  
; [[Legacy:Texture|Texture]] OldGlassTex :  
; [[Legacy:Texture|Texture]] OldSourceTex :  
; int OldUDisplace :  
; int OldVDisplace :  
; float TickAccu :  
; float UDisplace :  
; float UPosition :  
; float VDisplace :  
; float VPosition :  

==Enums ==

===PanningType ===
; SLIDE_Linear : Move a texture with speed settings HorizPanSpeed and VertPanSpeed. 
; SLIDE_Circular : Circular movement using Frequency, around a radius equal to Amplitude.
; SLIDE_Gestation : Irregular movement using Frequency and Amplitude.
; SLIDE_WavyX : A wavy horizontal movement of Frequency and Amplitude.
; SLIDE_WavyY : A wavy vertical movement of Frequency and Amplitude.

===TimingType ===
; TIME_FrameRateSync : The default setting of TIME_FrameRateSync will not give framerate-independent animations, but is still a good choice if you need smoothness, since a once-per-frame update will ensure the texture moves a little bit every frame without big skips. 
; TIME_RealTimeScroll : By setting the TimeMethod parameter to TIME_RealTimeScroll, the animation speed you see in the editor matches the in-game speed exactly regardless of the frame rate; it will skip intermediate panning positions if necessary.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3676</id>
      <timestamp>2002-06-07T17:38:33Z</timestamp>
      <contributor>
        <ip>Dma</ip>
      </contributor>
      <minor/>
      <comment>More stuff</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; IceTexture}}

Uses a texture as displacement for another texture.

Both textures must have exactly the same dimensions to make this work.

'''Dma:'''  From http://unreal.epicgames.com/Fire/AnimatingTextures.htm#Ice:

==Properties ==
; Texture GlassTexture : Interpreted as an 8-bit distortion vector field.
; texture SourceTexture : 
; PanningType PanningStyle :
; TimingType TimeMethod :
; byte HorizPanSpeed :
; byte VertPanSpeed : HorizPanSpeed and VertPanSpeed determine the movement in the Linear and WavyX/Y modes, with a zero-point of (128,128). Frequency and Amplitude act on the speed and size of the circular and wavy parts of a texture's movements.
; byte Frequency :
; byte Amplitude :
; bool MoveIce : The MoveIce switch selects movement of either the GlassTexture or SourceTexture.

(The following are not available in the editor.)
; float MasterCount :
; float UDisplace :
; float VDisplace :
; float UPosition :
; float VPosition :
; float TickAccu :
; int OldUDisplace :
; int OldVDisplace :
; Texture OldGlassTex :
; Texture OldSourceTex :
; int LocalSource :
; int ForceRefresh :

====PanningType enum ====
; SLIDE_Linear : Move a texture with speed settings HorizPanSpeed and VertPanSpeed. 
; SLIDE_Circular : Circular movement using Frequency, around a radius equal to Amplitude.
; SLIDE_Gestation : Irregular movement using Frequency and Amplitude.
; SLIDE_WavyX : A wavy horizontal movement of Frequency and Amplitude.
; SLIDE_WavyY : A wavy vertical movement of Frequency and Amplitude.

====TimingType enum ====
; TIME_FrameRateSync : The default setting of TIME_FrameRateSync will not give framerate-independent animations, but is still a good choice if you need smoothness, since a once-per-frame update will ensure the texture moves a little bit every frame without big skips. 
; TIME_RealTimeScroll : By setting the TimeMethod parameter to TIME_RealTimeScroll, the animation speed you see in the editor matches the in-game speed exactly regardless of the frame rate; it will skip intermediate panning positions if necessary.</text>
    </revision>
    <revision>
      <id>3677</id>
      <timestamp>2003-05-23T07:30:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; [[Legacy:Bitmap|Bitmap]] &gt;&gt; [[Legacy:Texture (UT)|Texture (UT)]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; IceTexture (Package: Fire)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:RenderedMaterial|RenderedMaterial]] &gt;&gt; [[Legacy:BitmapMaterial|BitmapMaterial]] &gt;&gt; [[Legacy:Texture|Texture]] &gt;&gt; [[Legacy:FractalTexture|FractalTexture]] &gt;&gt; IceTexture (Package: Fire)}}

Uses a texture as displacement for another texture. Both textures must have exactly the same dimensions to make this work.

Also see [http://unreal.epicgames.com/Fire/AnimatingTextures.htm#Ice Animated Real-Time Textures].

==Properties ==

===IceLayer Group ===
; byte Amplitude
; byte Frequency : Frequency and Amplitude act on the speed and size of the circular and wavy parts of a texture's movements.
; [[Legacy:Texture|Texture]] GlassTexture :  Interpreted as an 8-bit distortion vector field.
; bool MoveIce :  The MoveIce switch selects movement of either the GlassTexture or SourceTexture.
; PanningType PanningStyle :  
; [[Legacy:Texture|Texture]] SourceTexture :  
; TimingType TimeMethod :  
; byte HorizPanSpeed
; byte VertPanSpeed :  HorizPanSpeed and VertPanSpeed determine the movement in the Linear and WavyX/Y modes, with a zero-point of (128,128).

===Hidden ===
; int ForceRefresh :  
; int LocalSource :  
; float MasterCount :  
; [[Legacy:Texture|Texture]] OldGlassTex :  
; [[Legacy:Texture|Texture]] OldSourceTex :  
; int OldUDisplace :  
; int OldVDisplace :  
; float TickAccu :  
; float UDisplace :  
; float UPosition :  
; float VDisplace :  
; float VPosition :  

==Enums ==

===PanningType ===
; SLIDE_Linear : Move a texture with speed settings HorizPanSpeed and VertPanSpeed. 
; SLIDE_Circular : Circular movement using Frequency, around a radius equal to Amplitude.
; SLIDE_Gestation : Irregular movement using Frequency and Amplitude.
; SLIDE_WavyX : A wavy horizontal movement of Frequency and Amplitude.
; SLIDE_WavyY : A wavy vertical movement of Frequency and Amplitude.

===TimingType ===
; TIME_FrameRateSync : The default setting of TIME_FrameRateSync will not give framerate-independent animations, but is still a good choice if you need smoothness, since a once-per-frame update will ensure the texture moves a little bit every frame without big skips. 
; TIME_RealTimeScroll : By setting the TimeMethod parameter to TIME_RealTimeScroll, the animation speed you see in the editor matches the in-game speed exactly regardless of the frame rate; it will skip intermediate panning positions if necessary.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Icedude</title>
    <id>1461</id>
    <revision>
      <id>3668</id>
      <timestamp>2002-12-12T16:23:53Z</timestamp>
      <contributor>
        <ip>Icedude</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me ===

I'm a mapper (not very good at it, but thats beside the point), part of Clan Destiny , and the Mapper of The Fraghouse Mod Team

===Comments &amp; Stuff ===

====Mappy Stuff ====

DM-FraghouseXMas

====Stuff ====

====Website of the moment ====

[http://fraghouse.beyondunreal.com The Fraghouse Mod Team]

====Coments about me ====

'''Tarquin:'''  aha! so it wasn't [[Legacy:EntropicLqd|EntropicLqd]]! Welcome to the wiki, Icedude.

: Not guilty your honor.  Welcome to the Wiki m8, I bet I'm worse at mapping than you :) - [[Legacy:EntropicLqd|EntropicLqd]]

Have fun here. :)  &amp;rarr;[[Legacy:BlAcK PlAgUe22|BlAcK PlAgUe22]]

'''Mychaeel:''' Welcome. &amp;ndash; Please only click &quot;This is a minor edit&quot; if you made a minor edit (e.g. fixed a typo, corrected a link, or something like that).  Don't use it if you add something of your own to a page.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3669</id>
      <timestamp>2002-11-30T13:05:35Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me ===

I'm a mapper (not very good at it, but thats beside the point), part of Clan Destiny and Clan GIR, and, uh, i cant think of anything else to write

===Comments &amp; Stuff ===

====Mappy Stuff ====

DM-Ghosties (working title) Topic in [http://forums.beyondunreal.com/showthread.php?threadid=118162 118162]

====Stuff ====

I cant remember my login stuff :(

'''Wormbo:''' You could ask tarquin or mych to look it up for you. Or just enter your user name and password on the preferences page again and remember your (new) user id and password this time. :)

====Website of the moment ====

[http://www.gta3forums.com GTA3Forums.com]

====Coments about me ====

'''Tarquin:'''  aha! so it wasn't [[Legacy:EntropicLqd|EntropicLqd]]! Welcome to the wiki, Icedude.

: Not guilty your honor.  Welcome to the Wiki m8, I bet I'm worse at mapping than you :) - [[Legacy:EntropicLqd|EntropicLqd]]

Have fun here. :)  &amp;rarr;[[Legacy:BlAcK PlAgUe22|BlAcK PlAgUe22]]

'''Mychaeel:''' Welcome. &amp;ndash; Please only click &quot;This is a minor edit&quot; if you made a minor edit (e.g. fixed a typo, corrected a link, or something like that).  Don't use it if you add something of your own to a page.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Idios</title>
    <id>1530</id>
    <revision>
      <id>3819</id>
      <timestamp>2008-02-18T13:11:04Z</timestamp>
      <contributor>
        <ip>Idios</ip>
      </contributor>
      <comment>Initial revision, more to be added later</comment>
      <text xml:space="preserve">==About Me==

I am a humble code monkey who likes to type.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:If</title>
    <id>1522</id>
    <revision>
      <id>3807</id>
      <timestamp>2006-06-20T17:47:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Flow Syntax]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Flow Syntax|Flow Syntax]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ike Bart</title>
    <id>1482</id>
    <revision>
      <id>3719</id>
      <timestamp>2004-02-11T22:28:51Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">My online name is Ike Bart, a shortening I made for my real name (which I don't want to reveal.)  I started playing Unreal Tournament back sometime in 2000 or 2001.  I don't remember when anymore.  My brother said that it was a birthday present.  I've worked on several maps for Unreal Tournament, most of which are deathmatch and all of which are amatuer looking.

==Other interests ==

Aside from Unreal Tournament, I'm an avid watcher of [http://www.mtv.com/onair/trl TRL].  In addition, I compose MOD files (similar to Unreal Tournament's UMX files) but haven't found any suitable place to host them.  I post under the same name at the [http://absolutetrl.net/forums/index.php?s= Absolute TRL Formus] and even have a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Countdown]] there.

One  more thing, I have been reading the [http://www.megatokyo.com/ Megatokyo] web comic since around February 10, 2003.  Since February 14, 2003, I have been caught up with Megatokyo. One other web comic that I have read is [http://strangecandy.keenspace.com/ Strange Candy].  There are two characters common to both Megatokyo and Strange Candy.

===MOD Files ===

Over at my [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MOD Music]] page, I will post information about my MOD music files.  As soon as I release my MODs over at ModArchive,  I'll provide a filename to search for to get my MODs.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fake_Albums]] contains a bunch of song titles that I created for a couple fake albums.

==Pages started ==
*[[Legacy:Devilfish|Devilfish]] 
** The very first page I've made.  For the UT ScriptedPawn. 

*[[Legacy:Squid|Squid]]
** Thanks to [[Legacy:Wormbo|Wormbo]] for adding to it.

*[[Legacy:TriggeredDeath|TriggeredDeath]]
** I did some research here, and discovered that triggering it doesn't work like I expected it to work.

*[[Legacy:Slith|Slith]]
** Those green slimy creatures that throw slime balls at you.

*[[Legacy:Cannon|Cannon]]
** The [[Legacy:Decoration (UT)|Decoration (UT)]] that doesn't seem to be fully functional in Unreal Tournament until you do something special near an activated cannon.

*[[Legacy:Rockslide|Rockslide]]
** I still don't know how this [[Legacy:Keypoint (UT)|Keypoint (UT)]] works.  I can create something similar with a [[Legacy:ThingFactory|ThingFactory]] and a couple of [[Legacy:SpawnPoint|SpawnPoint]]s.

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] -&gt; [[Legacy:Devilfish|Devilfish]]}}

==Planned future page edits ==
*[[Legacy:Titan|Titan]]
*[[Legacy:Tentacle|Tentacle]]
*[[Legacy:Gasbag|Gasbag]]
*[[Legacy:Fly|Fly]]

===Subpages ===
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Countdown]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MOD Music]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fake_Albums]]

==Guestbook/Comments ==

'''Ike Bart:''' Feel free to add anything here.  I'll add more sections to my page later.

'''Wormbo:''' Welcome to the Wiki and happy contributing. :) You don't need to add a &quot;last updated&quot; thingy to your page, the [[Legacy:Recent Changes|Recent Changes]] and this page's [http://wiki.beyondunreal.com/wiki?action=history&amp;id=Ike_Bart View other revisions] link give much more detailed information about the latest updates.

'''Ike Bart:''' Thanks for telling me. :D

'''Balu:''' Megatokyo is great! It is a must to have it read from the beginning :) - BTW: Know [http://www.modarchive.com/ ModArchive]?

'''Ike Bart:''' I know about ModArchive because I downloaded many songs from that place a few years ago.  Now, I'm into downloading MP3s from WinMX.  I'm not sure whether I want to submit my songs there right now.  I remember one rule saying never release your first MOD file.  Over there, they will only upload your song permanently to the archives if it is of &quot;good quality&quot; and follows other criteria.  I don't know if I am allowed to upload cover MODs of songs by popular recording artists or MODs featuring recognizable samples from songs by popular recording artists.  I have already completed one MOD called &quot;Forgot About Dray&quot; which is basicly an extended instrumental cover of Dr. Dre's &quot;Forgot About Dre&quot; featuring an actual sample of the intro bass and string loop.  

'''Ike Bart:''' If you want to hear it or ask about other MOD files by me, e-mail me at IkeBart@NOSPAM-neo.rr.com removing the &quot;NOSPAM-&quot; part.  To request a mod make sure the subject line has &quot;MOD Request:&quot; before the song you want, and specify in the body if you want the original MOD or an MP3 conversion of it.  Unless otherwise specified, I'll assume 44kHz 128KBps Stereo for all MP3 conversions.  To ask about my list of MOD files including works in progress, put &quot;MOD Query&quot; in the subject line.  If you want one of my works in progress, I will send what I have of it by MP3 in 22kHz 56KBps Stereo format.  I will try to get to all MOD requests and queries whenever I check my e-mail.  Just be warned that it could take more than a week to process your requests because I don't check my e-mail every day.

'''Ike Bart:''' My MOD music subpage is up already.  Check it out at [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MOD Music]].  So far, nothing has been released to the ModArchive yet but I hope to get around to it sometime this month.  In the mean time, you can just send me an e-mail asking for specific MODs or a list of my MODs according to the instructions above.

'''???:''' PWND!!!

'''Ike Bart:''' If you try to PWN me, I'll just revert back.  This is my page and I don't want people messing with anything other than the guestbook.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3720</id>
      <timestamp>2004-01-30T20:24:36Z</timestamp>
      <contributor>
        <ip>D198-53-187-224.abhsia.telus.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">My online name is Ikizzle Bartizzle, a shortening I made for my real name (which I don't want to reveal.)  I started playing Unreal Tournament back sometime in 2000 or 2001.  I don't remember when anymore.  My brother said that it was a birthday present.  I've worked on several maps for Unreal Tournament, most of which are deathmatch and all of which are amatuer looking.

==Other interests ==

Aside from Rollin' On Dubs, I'm an avid watcher of [http://www.mtv.com/onair/trl TRL].  In addition, I compose MOD files (similar to Unreal Tournament's UMX files) but haven't found any suitable place to host them.  I post under the same name at the [http://absolutetrl.net/forums/index.php?s= Absolute TRL Formus] and even have a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Countdown]] there.

One  more thing, I have been reading the [http://www.megatokyo.com/ Megatokyo] web comic since around February 10, 2003.  Since February 14, 2003, I have been caught up with Megatokyo. One other web comic that I have read is [http://strangecandy.keenspace.com/ Strange Candy].  There are two characters common to both Megatokyo and Strange Candy.

===MOD Files ===

Over at my [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MOD Music]] page, I will post information about my MOD music files.  As soon as I release my MODs over at ModArchive,  I'll provide a filename to search for to get my MODs.

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fake_Albums]] contains a bunch of song titles that I created for a couple fake albums.

==Pages started ==
*[[Legacy:Devilfish|Devilfish]] 
** The very first page I've made.  For the UT ScriptedPawn. 

*[[Legacy:Squid|Squid]]
** Thanks to [[Legacy:Wormbo|Wormbo]] for adding to it.

*[[Legacy:TriggeredDeath|TriggeredDeath]]
** I did some research here, and discovered that triggering it doesn't work like I expected it to work.

*[[Legacy:Slith|Slith]]
** Those green slimy creatures that throw slime balls at you.

*[[Legacy:Cannon|Cannon]]
** The [[Legacy:Decoration (UT)|Decoration (UT)]] that doesn't seem to be fully functional in Unreal Tournament until you do something special near an activated cannon.

*[[Legacy:Rockslide|Rockslide]]
** I still don't know how this [[Legacy:Keypoint (UT)|Keypoint (UT)]] works.  I can create something similar with a [[Legacy:ThingFactory|ThingFactory]] and a couple of [[Legacy:SpawnPoint|SpawnPoint]]s.

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] -&gt; [[Legacy:Devilfish|Devilfish]]}}

==Planned future page edits ==
*[[Legacy:Titan|Titan]]
*[[Legacy:Tentacle|Tentacle]]
*[[Legacy:Gasbag|Gasbag]]
*[[Legacy:Fly|Fly]]

===Subpages ===
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Countdown]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MOD Music]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fake_Albums]]

==Guestbook/Comments ==

'''Ike Bart:''' Feel free to add anything here.  I'll add more sections to my page later.

'''Wormbo:''' Welcome to the Wiki and happy contributing. :) You don't need to add a &quot;last updated&quot; thingy to your page, the [[Legacy:Recent Changes|Recent Changes]] and this page's [http://wiki.beyondunreal.com/wiki?action=history&amp;id=Ike_Bart View other revisions] link give much more detailed information about the latest updates.

'''Ike Bart:''' Thanks for telling me. :D

'''Balu:''' Megatokyo is great! It is a must to have it read from the beginning :) - BTW: Know [http://www.modarchive.com/ ModArchive]?

'''Ike Bart:''' I know about ModArchive because I downloaded many songs from that place a few years ago.  Now, I'm into downloading MP3s from WinMX.  I'm not sure whether I want to submit my songs there right now.  I remember one rule saying never release your first MOD file.  Over there, they will only upload your song permanently to the archives if it is of &quot;good quality&quot; and follows other criteria.  I don't know if I am allowed to upload cover MODs of songs by popular recording artists or MODs featuring recognizable samples from songs by popular recording artists.  I have already completed one MOD called &quot;Forgot About Dray&quot; which is basicly an extended instrumental cover of Dr. Dre's &quot;Forgot About Dre&quot; featuring an actual sample of the intro bass and string loop.  

'''Ike Bart:''' If you want to hear it or ask about other MOD files by me, e-mail me at IkeBart@NOSPAM-neo.rr.com removing the &quot;NOSPAM-&quot; part.  To request a mod make sure the subject line has &quot;MOD Request:&quot; before the song you want, and specify in the body if you want the original MOD or an MP3 conversion of it.  Unless otherwise specified, I'll assume 44kHz 128KBps Stereo for all MP3 conversions.  To ask about my list of MOD files including works in progress, put &quot;MOD Query&quot; in the subject line.  If you want one of my works in progress, I will send what I have of it by MP3 in 22kHz 56KBps Stereo format.  I will try to get to all MOD requests and queries whenever I check my e-mail.  Just be warned that it could take more than a week to process your requests because I don't check my e-mail every day.

'''Ike Bart:''' My MOD music subpage is up already.  Check it out at [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MOD Music]].  So far, nothing has been released to the ModArchive yet but I hope to get around to it sometime this month.  In the mean time, you can just send me an e-mail asking for specific MODs or a list of my MODs according to the instructions above.

PWND!!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ike Bart/Countdown</title>
    <id>1484</id>
    <revision>
      <id>3723</id>
      <timestamp>2004-03-08T06:33:05Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For those of you that don't know, I host a countdown over at the [http://absolutetrl.net/forums/index.php?s Absolute TRL Forums] in the [http://absolutetrl.net/forums/forumdisplay.php?s=&amp;forumid=8 Your Top Ten Forum].  My countdown thread can be found [http://absolutetrl.net/forums/showthread.php?s=&amp;threadid=7603 here].  The countdown is something I started way back on October 26, 2001.  This has absolutely nothing to do with Unreal Tournament.  It's just a personal thing.

==Countdown rules ==
# Only thirteen songs can make my countdown on any particular day.
# A day spent in the top ten is will be counted as a day on the countdown.
# Songs are allowed to spend up to thirty-five days on the countdown.  On day thirty-five, the song retires.
# Only the songs listed on my current playlist are eligible for making the countdown.
# When a song gets premiered, it is gets added to the current playlist.
# A song does not need a video to get premiered but a video is definately a plus.
# A song can have one of four statuses: '''Retired,''' '''Current,''' '''Obsolete,''' or '''Planned.'''
#; '''Retired''' :The song has reached day 35 and is no longer eligible to make my countdown.  It gets a spot in the Retired videos list.
#; '''Current''' :The song is currently eligible to make my countdown.
#; '''Obsolete''' :The song has been removed from my playlist and is no longer eligible to make my countdown.
#; '''Planned''' :The song is not yet eligible to make my countdown but will be once it is premiered.

===Retirement ===

With few exceptions, every song that reaches day 35 gets retired and added to the [http://absolutetrl.net/forums/showthread.php?s=&amp;threadid=19138 retired videos list].  The retired videos list is divided into waves (periods of twenty-seven days) starting at the first period with retirements.

Currently, there are 171 retired videos since my countdown started on 10-26-01.

====Dynasties ====

A dynasty is a series of songs where each successive video fills in the spot occupied by the last retired video. Each dynasty starts with one video and it keeps on going.  Currently, I recognize ten dynasties, seven of which contain current videos.  There are three more recent dynasties that I decided recognize.

Here are the dyansties that I currently recognize:

=====Alternative Techno Dynasty =====

This dynasty was started off by a comeback song from the Prodigy back on July 9, 2002.

# The Prodigy &quot;Baby's Got a Temper&quot;
# Paul Oakenfold f. Shifty Shellshock &quot;Starry Eyed Surprise&quot;
# Moby &quot;Extreme Ways&quot;
# Ravers on Dope &quot;Get High&quot;
# Ian Van Dahl &quot;Reason&quot;
# Cirrus &quot;Boomerang&quot; 
# DJ Sammy &quot;The Boys of Summer&quot; 
# Fischerspooner &quot;Emerge&quot;
# Paul Van Dyk &quot;Nothing But You&quot;
# Fischerspooner &quot;Sweetness&quot; (No relation to Jimmy Eat World &quot;Sweetness&quot; except for the song title.)
# Paul Van Dyk f. Vega 4 &quot;Time of Our Lives&quot; 
# The Chemical Brothers &quot;Get Yourself High&quot; (Current Song.)

=====Modern Rock/Rap Dynasty =====

This dynasty is no longer running because I didn't feel like keeping the last song.

# Sum 41 &quot;In Too Deep&quot;
# Jimmy Eat World &quot;The Middle&quot;
# Sum 41 &quot;Motivation&quot;
# System of a Down &quot;Toxicity&quot;
# Unwritten Law &quot;Seein' Red&quot;
# Eminem &quot;Without Me&quot;
# Jimmy Eat World &quot;Sweetness&quot;
# Eminem &quot;Cleaning out My Closet&quot; (Obsolete song.)

=====Dance Pop Dynasty =====

This dynasty was started by DJ Encore and includes a number of my favorite dance songs.  Almost all songs on this dynasty are easy for me to dance to.

# DJ Encore f. Engelina &quot;I See Right to You&quot;
# DJ Sammy f. Yanou and Do &quot;Heaven&quot;
# Dirty Vegas &quot;Days Go By&quot;
# Ian Van Dahl &quot;Will I?&quot;
# IIO &quot;Rapture&quot; (What is the correct way to spell their name?)
# Madonna &quot;Die Another Day&quot;
# Missy Elliott &quot;Work It&quot; (This is more hip-hop than the other but this song makes me want to dance.)
# Kate Ryan &quot;Desenchantee&quot;
# Lasgo &quot;Something&quot; 
# Who Da Funk &quot;Shiny Disco Balls&quot; 
# The Chemical Brothers f. the Flaming Lips &quot;The Golden Path&quot; 
# Kylie Minogue &quot;Slow&quot; (Current song.)

=====Hardcore Dynasty =====

Another obsolete dynasty started by Korn.  It is obsolete only because I couldn't find another song that followed the third song on this dyansty.

# Korn &quot;Here to Stay&quot;
# Deadsy &quot;The Key to Gramercy Park&quot;
# New Found Glory &quot;My Friends Over You&quot;

=====Female-Dominated Dynasty =====

The first two artists in this dynasty are male, the rest are female.  It can also be called the &quot;Answer the Phone&quot; dynasty.  In addition, this dynasty is as old as the countdown itself because the first song appeared on day one of my countdown.

# Sugar Ray &quot;Answer the Phone&quot;
# Outkast &quot;The Whole World&quot;
# Alanis Morissette &quot;Hands Clean&quot;
# Brandy &quot;Full Moon&quot;
# Kylie Minogue &quot;Love at First Sight&quot;
# Soluna &quot;For All Time&quot;
# Michelle Branch &quot;Goodbye to You&quot;
# Lamya &quot;Empires&quot;
# Paulina Rubio &quot;The One You Love&quot;
# Angie Martinez f/ Kelis &quot;Take You Home&quot; 
# Sugar Ray &quot;Mr. Bartender (It's So Easy)&quot; 
# Blink 182 &quot;Feeling This&quot; 
# The Crystal Method &quot;Born Too Slow&quot; (Current Song.)

=====&quot;First Date&quot; Dynasty =====

This dynasty gets its name from the song by Blink 182 that started it.  It mainly consists of rock songs with a few pop and techno songs in there.

# Blink 182 &quot;First Date&quot;
# Linkin Park &quot;Papercut&quot;
# Moby &quot;We Are All Made of Stars&quot;
# Linkin Park &quot;Points of Authority&quot; and &quot;PTS.OF.ATHRTY&quot; (A song and its remix off of ''Reanimation''.)
# Amy Studt &quot;Just a Little Girl&quot;
# Aimee Allen &quot;Revolution&quot;
# Finch &quot;Letters to You&quot;
# The Used &quot;The Taste of Ink&quot; 
# Evanescence f. Paul McCoy &quot;Bring Me to Life&quot; 
# Stacie Orrico &quot;Stuck&quot;
# The All-American Rejects &quot;The Last Song&quot; 
# Stacie Orrico &quot;(There's Gotta Be) More to Life&quot;
# Korn &quot;Right Now&quot; 
# The Offspring &quot;Hit That&quot; (Current Song.)

=====Osbourne Dynasty =====

This short-lasting dynasty ended when I decided I did not want to go through the trouble of keeping the last song on my countdown for 35 days.

# Ozzy Osbourne &quot;Dreamer&quot;
# Andrew W.K. &quot;Party Hard&quot;
# Andrew W.K. &quot;She Is Beautiful&quot;
# Weezer &quot;Keep Fishin'&quot; (Obsolete song.)

=====No Doubt Dynasty =====

This dyansty is named after one of the two bands that started it.  There are two times where I could go either way.

# No Doubt &quot;Hey Baby&quot;&lt;br /&gt;Blink 182 &quot;Stay Together for the Kids&quot;
# Hoobastank &quot;Crawling in the Dark&quot;
# Melanie C &quot;I Turn to You&quot;
# Res &quot;They Say Vision&quot;&lt;br /&gt;Toya &quot;No Matta What (Party All Night)&quot;
# Avril Lavigne &quot;Complicated&quot;
# Ashanti &quot;Happy&quot;
# No Doubt f. Lady Saw &quot;Underneath It All&quot;
# The Distillers &quot;The Young Crazed Peeling&quot;
# The Distillers &quot;City of Angels&quot;
# Korn &quot;Alone I Break&quot;
# Crazy Town &quot;Drowning&quot; 
# T.A.T.U. &quot;All the Things She Said&quot; 
# T.A.T.U. &quot;Not Gonna Get Us&quot; 
# Less Than Jake &quot;She's Gonna Break Soon&quot;
# 311 &quot;Creatures (For a While)&quot; 
# Outkast &quot;Hey Ya&quot; and &quot;The Way You Move&quot;
# Truimph the Insult Comic Dog &quot;I Keed&quot; (Current song.)

=====Good Charlotte Dynasty =====

This is one of two new dynasties I recognized on May 20, 2003.  It gets its name from the band whose first video started the dynasty.

# Good Charlotte &quot;Lifestyles of the Rich and Famous&quot;
# Bowling for Soup &quot;Girl all the Bad Guys Want&quot;
# Good Charlotte &quot;The Anthem&quot;
# System of a Down &quot;Boom!&quot; 
# Girls Aloud &quot;No Good Advice&quot; 
# Lillix &quot;What I Like About You&quot; 
# Lillix &quot;Tomorrow&quot; 
# Good Charlotte &quot;Hold On&quot; (Current song.)

=====&quot;Immortal&quot; Dynasty =====

The other new dyansty gets its name from the title of the first video in the dynasty.  This dyansty is immortal in name only and can become obsolete like any other dynasty.  It became obsolete because I wasn't fond of the song by Evanescence.

# Adema &quot;Immortal&quot;
# Sum 41 &quot;The Hell Song&quot;
# Marilyn Manson &quot;mOBSCENE&quot;
# Evanescence &quot;Going Under&quot; (Obsolete song.)

=====Aaliyah's Dynasty =====

This dyansty gets it's name from the late R&amp;B artist Aaliyah.  The first song in this dynasty is the only song by her to retire on my countdown.  There were three other songs by Aaliyah that were on my voting list, including one that was on the voting list for the first day of my countdown.

# Aaliyah &quot;Miss You&quot;
# Lillix &quot;It's About Time&quot;
# Michelle Branch &quot;Are You Happy Now?&quot;
# Korn &quot;Did My Time&quot; 
# Fountains of Wayne &quot;Stacy's Mom&quot;
# Missy Elliott &quot;Pass That Dutch&quot; 
# Katy Rose &quot;Overdrive&quot; (Current song.)

=====&quot;I'm With You&quot; Dynasty =====

This dynasty was started by Avril Lavigne's song &quot;I'm With You.&quot;  It contains mostly pop and pop-rock songs.

# Avril Lavigne &quot;I'm With You&quot;
# Daniel Bedingfield &quot;James Dean&quot;
# New Found Glory &quot;Understatement&quot;
# Dream f. Loon &quot;Crazy&quot;
# Skye Sweetnam &quot;Billy S&quot; 
# Mandy Moore &quot;Have a Little Faith in Me&quot; 
# Ladytron &quot;Blue Jeans&quot; 
# Blink 182 &quot;I Miss You&quot; (Current song.)

=====Praise Chorus Dyansty =====

This dynasty gets it's name from the song &quot;A Praise Chorus&quot; by Jimmy Eat World, the founder of this dynasty.  The day after the retirement of &quot;Why Not&quot; by Hilary Duff, I let another forum member take over my countdown and premiere any two songs he wanted. I liked one of them so much that I decided to let it run concurrently to the song by Kiley Dean that was originally chosen to replace &quot;Why Not.&quot;  If the line of songs descending from &quot;I'm Not the Girl&quot; goes into the fourth generation, I may consider making a new dynasty.

# Jimmy Eat World &quot;A Praise Chorus&quot;
# Hilary Duff &quot;Why Not?&quot;
# Kiley Dean &quot;Make Me a Song&quot;&lt;br /&gt;Rachel Farris &quot;I'm Not the Girl&quot;
# Hilary Duff &quot;So Yesterday&quot; &lt;br /&gt;Sarai &quot;Ladies&quot; (Part of the Rachel Farris branch.)
# Liz Phair &quot;Why Can't I&quot; (Current song of the Kiley Dean Branch.)&lt;br /&gt;Rose Falcon &quot;Up, Up, Up&quot; (Part of the Rachel Farris branch.)
# Evanescence &quot;My Immortal&quot; &lt;br /&gt;P.O.D. &quot;Will You&quot; (Current song of Rachel Farris Branch.)

==Related links ==
* [[Legacy:Ike Bart|Ike Bart]]
* [[:Category:Legacy Personal Page]]

----

'''Tarquin:''' Ike, this page seems to be off-topic. If this page is about Unreal in some way, please explain.

'''ZxAnPhOrIaN:''' Isn't the personal pages for personal stuff, not pertaining to the wiki?

'''Ike Bart:''' This is my personal page.  It has nothing to do with Unreal and neither does my [[Legacy:Ike Bart/MOD Music|Ike Bart/MOD Music]] page.  I don't feel like registering for a page on Geocities or any other free website at this time.  Besides, I don't know HTML that well.  It would be easier for me to keep this here.

'''Piglet:'''  It might be wise then to put a larger explanation at the top of the page in that case.  Or your going to get a lot of confused visitors (like me for example)

'''ZxAnPhOrIaN:''' O well... :rolleyes:

'''Ike Bart:''' So far, there hasn't been any songs from Front 242 or VNV Nation to make my countdown.  One reason is that I don't know of any videos for either band's most recent songs.  In the case of Front 242, I don't even know which of the songs off their latest album is the current single.  Such is the state of EBM and industrial electronic music in the USA.  As for country music, I don't listen to enough of it to become hooked on any recent country songs.</text>
    </revision>
    <revision>
      <id>3724</id>
      <timestamp>2003-09-12T05:28:12Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For those of you that don't know, I host a countdown over at the [http://absolutetrl.net/forums/index.php?s Absolute TRL Forums] in the [http://absolutetrl.net/forums/forumdisplay.php?s=&amp;forumid=8 Your Top Ten Forum].  My countdown thread can be found [http://absolutetrl.net/forums/showthread.php?s=&amp;threadid=7603 here].  The countdown is something I started way back on October 26, 2001.  This has absolutely nothing to do with Unreal Tournament.  It's just a personal thing.

==Countdown rules ==
# Only thirteen songs can make my countdown on any particular day.
# A day spent in the top ten is will be counted as a day on the countdown.
# Songs are allowed to spend up to thirty-five days on the countdown.  On day thirty-five, the song retires.
# Only the songs listed on my current playlist are eligible for making the countdown.
# When a song gets premiered, it is gets added to the current playlist.
# A song does not need a video to get premiered but a video is definately a plus.
# A song can have one of four statuses: '''Retired,''' '''Current,''' '''Obsolete,''' or '''Planned.'''
#; '''Retired''' :The song has reached day 35 and is no longer eligible to make my countdown.  It gets a spot in the Retired videos list.
#; '''Current''' :The song is currently eligible to make my countdown.
#; '''Obsolete''' :The song has been removed from my playlist and is no longer eligible to make my countdown.
#; '''Planned''' :The song is not yet eligible to make my countdown but will be once it is premiered.

===Retirement ===

With few exceptions, every song that reaches day 35 gets retired and added to the [http://absolutetrl.net/forums/showthread.php?s=&amp;threadid=19138 retired videos list].  The retired videos list is divided into waves (periods of twenty-seven days) starting at the first period with retirements.

Currently, there are 136 retired videos since my countdown started on 10-26-01.

====Dynasties ====

A dynasty is a series of songs where each successive video fills in the spot occupied by the last retired video. Each dynasty starts with one video and it keeps on going.  Currently, I recognize ten dynasties, seven of which contain current videos.  There are three more recent dynasties that I decided recognize.

Here are the dyansties that I currently recognize:

=====Alternative Techno Dynasty =====

This dynasty was started off by a comeback song from the Prodigy back on July 9, 2002.

# The Prodigy &quot;Baby's Got a Temper&quot;
# Paul Oakenfold f. Shifty Shellshock &quot;Starry Eyed Surprise&quot;
# Moby &quot;Extreme Ways&quot;
# Ravers on Dope &quot;Get High&quot;
# Ian Van Dahl &quot;Reason&quot;
# Cirrus &quot;Boomerang&quot; 
# DJ Sammy &quot;The Boys of Summer&quot; 
# Fischerspooner &quot;Emerge&quot;
# Paul Van Dyk &quot;Nothing But You&quot;
# Fischerspooner &quot;Sweetness&quot; (Current song. No relation to Jimmy Eat World &quot;Sweetness&quot; except for the song title.)

=====Modern Rock/Rap Dynasty =====

This dynasty is no longer running because I didn't feel like keeping the last song.

# Sum 41 &quot;In Too Deep&quot;
# Jimmy Eat World &quot;The Middle&quot;
# Sum 41 &quot;Motivation&quot;
# System of a Down &quot;Toxicity&quot;
# Unwritten Law &quot;Seein' Red&quot;
# Eminem &quot;Without Me&quot;
# Jimmy Eat World &quot;Sweetness&quot;
# Eminem &quot;Cleaning out My Closet&quot; (Obsolete song.)

=====Dance Pop Dynasty =====

This dynasty was started by DJ Encore and includes a number of my favorite dance songs.  Almost all songs on this dynasty are easy for me to dance to.

# DJ Encore f. Engelina &quot;I See Right to You&quot;
# DJ Sammy f. Yanou and Do &quot;Heaven&quot;
# Dirty Vegas &quot;Days Go By&quot;
# Ian Van Dahl &quot;Will I?&quot;
# IIO &quot;Rapture&quot; (What is the correct way to spell their name?)
# Madonna &quot;Die Another Day&quot;
# Missy Elliott &quot;Work It&quot; (This is more hip-hop than the other but this song makes me want to dance.)
# Kate Ryan &quot;Desenchantee&quot;
# Lasgo &quot;Something&quot; 
# Who Da Funk &quot;Shiny Disco Balls&quot; (Current song)

=====Hardcore Dynasty =====

Another obsolete dynasty started by Korn.  It is obsolete only because I couldn't find another song that followed the third song on this dyansty.

# Korn &quot;Here to Stay&quot;
# Deadsy &quot;The Key to Gramercy Park&quot;
# New Found Glory &quot;My Friends Over You&quot;

=====Female-Dominated Dynasty =====

The first two artists in this dynasty are male, the rest are female.  It can also be called the &quot;Answer the Phone&quot; dynasty.  In addition, this dynasty is as old as the countdown itself because the first song appeared on day one of my countdown.

# Sugar Ray &quot;Answer the Phone&quot;
# Outkast &quot;The Whole World&quot;
# Alanis Morissette &quot;Hands Clean&quot;
# Brandy &quot;Full Moon&quot;
# Kylie Minogue &quot;Love at First Sight&quot;
# Soluna &quot;For All Time&quot;
# Michelle Branch &quot;Goodbye to You&quot;
# Lamya &quot;Empires&quot;
# Paulina Rubio &quot;The One You Love&quot;
# Angie Martinez f/ Kelis &quot;Take You Home&quot; 
# Sugar Ray &quot;Mr. Bartender (It's So Easy)&quot; (Current song.)

=====&quot;First Date&quot; Dynasty =====

This dynasty gets its name from the song by Blink 182 that started it.  It mainly consists of rock songs with a few pop and techno songs in there.

# Blink 182 &quot;First Date&quot;
# Linkin Park &quot;Papercut&quot;
# Moby &quot;We Are All Made of Stars&quot;
# Linkin Park &quot;Points of Authority&quot; and &quot;PTS.OF.ATHRTY&quot; (A song and its remix off of ''Reanimation''.)
# Amy Studt &quot;Just a Little Girl&quot;
# Aimee Allen &quot;Revolution&quot;
# Finch &quot;Letters to You&quot;
# The Used &quot;The Taste of Ink&quot; 
# Evanescence f. Paul McCoy &quot;Bring Me to Life&quot; 
# Stacie Orrico &quot;Stuck&quot;
# The All-American Rejects &quot;The Last Song&quot; (Current Song)

=====Osbourne Dynasty =====

This short-lasting dynasty ended when I decided I did not want to go through the trouble of keeping the last song on my countdown for 35 days.

# Ozzy Osbourne &quot;Dreamer&quot;
# Andrew W.K. &quot;Party Hard&quot;
# Andrew W.K. &quot;She Is Beautiful&quot;
# Weezer &quot;Keep Fishin'&quot; (Obsolete song.)

=====No Doubt Dynasty =====

This dyansty is named after one of the two bands that started it.  There are two times where I could go either way.

# No Doubt &quot;Hey Baby&quot;&lt;br /&gt;Blink 182 &quot;Stay Together for the Kids&quot;
# Hoobastank &quot;Crawling in the Dark&quot;
# Melanie C &quot;I Turn to You&quot;
# Res &quot;They Say Vision&quot;&lt;br /&gt;Toya &quot;No Matta What (Party All Night)&quot;
# Avril Lavigne &quot;Complicated&quot;
# Ashanti &quot;Happy&quot;
# No Doubt f. Lady Saw &quot;Underneath It All&quot;
# The Distillers &quot;The Young Crazed Peeling&quot;
# The Distillers &quot;City of Angels&quot;
# Korn &quot;Alone I Break&quot;
# Crazy Town &quot;Drowning&quot; 
# T.A.T.U. &quot;All the Things She Said&quot; 
# T.A.T.U. &quot;Not Gonna Get Us&quot; 
# Less Than Jake &quot;She's Gonna Break Soon&quot;
# 311 &quot;Creatures (For a While)&quot; (Current song.)

=====Good Charlotte Dynasty =====

This is one of two new dynasties I recognized on May 20, 2003.  It gets its name from the band whose first video started the dynasty.

# Good Charlotte &quot;Lifestyles of the Rich and Famous&quot;
# Bowling for Soup &quot;Girl all the Bad Guys Want&quot;
# Good Charlotte &quot;The Anthem&quot;
# System of a Down &quot;Boom!&quot; 
# Girls Aloud &quot;No Good Advice&quot; (Current song.)

=====&quot;Immortal&quot; Dynasty =====

The other new dyansty gets its name from the title of the first video in the dynasty.  This dyansty is immortal in name only and can become obsolete like any other dynasty.

# Adema &quot;Immortal&quot;
# Sum 41 &quot;The Hell Song&quot;
# Marilyn Manson &quot;mOBSCENE&quot;
# Evanescence &quot;Going Under&quot; (Current song.)

=====Aaliyah's Dynasty =====

This dyansty gets it's name from the late R&amp;B artist Aaliyah.  The first song in this dynasty is the only song by her to retire on my countdown.  There were three other songs by Aaliyah that were on my voting list, including one that was on the voting list for the first day of my countdown.

# Aaliyah &quot;Miss You&quot;
# Lillix &quot;It's About Time&quot;
# Michelle Branch &quot;Are You Happy Now?&quot;
# Korn &quot;Did My Time&quot; (Current song.)

=====&quot;I'm With You&quot; Dynasty =====

This dynasty was started by Avril Lavigne's song &quot;I'm With You.&quot;  It contains mostly pop and pop-rock songs.

# Avril Lavigne &quot;I'm With You&quot;
# Daniel Bedingfield &quot;James Dean&quot;
# New Found Glory &quot;Understatement&quot;
# Dream f. Loon &quot;Crazy&quot;
# Skye Sweetnam &quot;Billy S&quot; (Current song)

=====Praise Chorus Dyansty =====

This dynasty gets it's name from the song &quot;A Praise Chorus&quot; by Jimmy Eat World, the founder of this dynasty.  The day after the retirement of &quot;Why Not&quot; by Hilary Duff, I let another forum member take over my countdown and premiere any two songs he wanted. I liked one of them so much that I decided to let it run concurrently to the song by Kiley Dean that was originally chosen to replace &quot;Why Not.&quot;  If the line of songs descending from &quot;I'm Not the Girl&quot; goes into the fourth generation, I may consider making a new dynasty.

# Jimmy Eat World &quot;A Praise Chorus&quot;
# Hilary Duff &quot;Why Not?&quot;
# Kiley Dean &quot;Make Me a Song&quot;&lt;br /&gt;Rachel Farris &quot;I'm Not the Girl&quot;
# Hilary Duff &quot;So Yesterday&quot; (Current song.)&lt;br /&gt;Sarai &quot;Ladies&quot; (Current song.  Part of the Rachel Farris branch.)

==Related links ==
* [[Legacy:Ike Bart|Ike Bart]]
* [[:Category:Legacy Personal Page]]

----

'''Tarquin:''' Ike, this page seems to be off-topic. If this page is about Unreal in some way, please explain.

'''ZxAnPhOrIaN:''' Isn't the personal pages for personal stuff, not pertaining to the wiki?

'''Ike Bart:''' This is my personal page.  It has nothing to do with Unreal and neither does my [[Legacy:Ike Bart/MOD Music|Ike Bart/MOD Music]] page.  I don't feel like registering for a page on Geocities or any other free website at this time.  Besides, I don't know HTML that well.  It would be easier for me to keep this here.

'''Piglet:'''  It might be wise then to put a larger explanation at the top of the page in that case.  Or your going to get a lot of confused visitors (like me for example)

'''ZxAnPhOrIaN:''' O well... :rolleyes:

'''Ike Bart:''' So far, there hasn't been any songs from Front 242 or VNV Nation to make my countdown.  One reason is that I don't know of any videos for either band's most recent songs.  In the case of Front 242, I don't even know which of the songs off their latest album is the current single.  Such is the state of EBM and industrial electronic music in the USA.  As for country music, I don't listen to enough of it to become hooked on any recent country songs.</text>
    </revision>
    <revision>
      <id>3725</id>
      <timestamp>2003-12-19T19:32:27Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">For those of you that don't know, I host a countdown over at the [http://absolutetrl.net/forums/index.php?s Absolute TRL Forums] in the [http://absolutetrl.net/forums/forumdisplay.php?s=&amp;forumid=8 Your Top Ten Forum].  My countdown thread can be found [http://absolutetrl.net/forums/showthread.php?s=&amp;threadid=7603 here].  The countdown is something I started way back on October 26, 2001.  This has absolutely nothing to do with Unreal Tournament.  It's just a personal thing.

==Countdown rules ==
# Only thirteen songs can make my countdown on any particular day.
# A day spent in the top ten is will be counted as a day on the countdown.
# Songs are allowed to spend up to thirty-five days on the countdown.  On day thirty-five, the song retires.
# Only the songs listed on my current playlist are eligible for making the countdown.
# When a song gets premiered, it is gets added to the current playlist.
# A song does not need a video to get premiered but a video is definately a plus.
# A song can have one of four statuses: '''Retired,''' '''Current,''' '''Obsolete,''' or '''Planned.'''
#; '''Retired''' :The song has reached day 35 and is no longer eligible to make my countdown.  It gets a spot in the Retired videos list.
#; '''Current''' :The song is currently eligible to make my countdown.
#; '''Obsolete''' :The song has been removed from my playlist and is no longer eligible to make my countdown.
#; '''Planned''' :The song is not yet eligible to make my countdown but will be once it is premiered.

===Retirement ===

With few exceptions, every song that reaches day 35 gets retired and added to the [http://absolutetrl.net/forums/showthread.php?s=&amp;threadid=19138 retired videos list].  The retired videos list is divided into waves (periods of twenty-seven days) starting at the first period with retirements.

Currently, there are 171 retired videos since my countdown started on 10-26-01.

====Dynasties ====

A dynasty is a series of songs where each successive video fills in the spot occupied by the last retired video. Each dynasty starts with one video and it keeps on going.  Currently, I recognize ten dynasties, seven of which contain current videos.  There are three more recent dynasties that I decided recognize.

Here are the dyansties that I currently recognize:

=====Alternative Techno Dynasty =====

This dynasty was started off by a comeback song from the Prodigy back on July 9, 2002.

# The Prodigy &quot;Baby's Got a Temper&quot;
# Paul Oakenfold f. Shifty Shellshock &quot;Starry Eyed Surprise&quot;
# Moby &quot;Extreme Ways&quot;
# Ravers on Dope &quot;Get High&quot;
# Ian Van Dahl &quot;Reason&quot;
# Cirrus &quot;Boomerang&quot; 
# DJ Sammy &quot;The Boys of Summer&quot; 
# Fischerspooner &quot;Emerge&quot;
# Paul Van Dyk &quot;Nothing But You&quot;
# Fischerspooner &quot;Sweetness&quot; (No relation to Jimmy Eat World &quot;Sweetness&quot; except for the song title.)
# Paul Van Dyk f. Vega 4 &quot;Time of Our Lives&quot; 
# The Chemical Brothers &quot;Get Yourself High&quot; (Current Song.)

=====Modern Rock/Rap Dynasty =====

This dynasty is no longer running because I didn't feel like keeping the last song.

# Sum 41 &quot;In Too Deep&quot;
# Jimmy Eat World &quot;The Middle&quot;
# Sum 41 &quot;Motivation&quot;
# System of a Down &quot;Toxicity&quot;
# Unwritten Law &quot;Seein' Red&quot;
# Eminem &quot;Without Me&quot;
# Jimmy Eat World &quot;Sweetness&quot;
# Eminem &quot;Cleaning out My Closet&quot; (Obsolete song.)

=====Dance Pop Dynasty =====

This dynasty was started by DJ Encore and includes a number of my favorite dance songs.  Almost all songs on this dynasty are easy for me to dance to.

# DJ Encore f. Engelina &quot;I See Right to You&quot;
# DJ Sammy f. Yanou and Do &quot;Heaven&quot;
# Dirty Vegas &quot;Days Go By&quot;
# Ian Van Dahl &quot;Will I?&quot;
# IIO &quot;Rapture&quot; (What is the correct way to spell their name?)
# Madonna &quot;Die Another Day&quot;
# Missy Elliott &quot;Work It&quot; (This is more hip-hop than the other but this song makes me want to dance.)
# Kate Ryan &quot;Desenchantee&quot;
# Lasgo &quot;Something&quot; 
# Who Da Funk &quot;Shiny Disco Balls&quot; 
# The Chemical Brothers f. the Flaming Lips &quot;The Golden Path&quot; 
# Kylie Minogue &quot;Slow&quot; (Current song.)

=====Hardcore Dynasty =====

Another obsolete dynasty started by Korn.  It is obsolete only because I couldn't find another song that followed the third song on this dyansty.

# Korn &quot;Here to Stay&quot;
# Deadsy &quot;The Key to Gramercy Park&quot;
# New Found Glory &quot;My Friends Over You&quot;

=====Female-Dominated Dynasty =====

The first two artists in this dynasty are male, the rest are female.  It can also be called the &quot;Answer the Phone&quot; dynasty.  In addition, this dynasty is as old as the countdown itself because the first song appeared on day one of my countdown.

# Sugar Ray &quot;Answer the Phone&quot;
# Outkast &quot;The Whole World&quot;
# Alanis Morissette &quot;Hands Clean&quot;
# Brandy &quot;Full Moon&quot;
# Kylie Minogue &quot;Love at First Sight&quot;
# Soluna &quot;For All Time&quot;
# Michelle Branch &quot;Goodbye to You&quot;
# Lamya &quot;Empires&quot;
# Paulina Rubio &quot;The One You Love&quot;
# Angie Martinez f/ Kelis &quot;Take You Home&quot; 
# Sugar Ray &quot;Mr. Bartender (It's So Easy)&quot; 
# Blink 182 &quot;Feeling This&quot; (Current Song.)

=====&quot;First Date&quot; Dynasty =====

This dynasty gets its name from the song by Blink 182 that started it.  It mainly consists of rock songs with a few pop and techno songs in there.

# Blink 182 &quot;First Date&quot;
# Linkin Park &quot;Papercut&quot;
# Moby &quot;We Are All Made of Stars&quot;
# Linkin Park &quot;Points of Authority&quot; and &quot;PTS.OF.ATHRTY&quot; (A song and its remix off of ''Reanimation''.)
# Amy Studt &quot;Just a Little Girl&quot;
# Aimee Allen &quot;Revolution&quot;
# Finch &quot;Letters to You&quot;
# The Used &quot;The Taste of Ink&quot; 
# Evanescence f. Paul McCoy &quot;Bring Me to Life&quot; 
# Stacie Orrico &quot;Stuck&quot;
# The All-American Rejects &quot;The Last Song&quot; 
# Stacie Orrico &quot;(There's Gotta Be) More to Life&quot;
# Korn &quot;Right Now&quot; (Current Song.)

=====Osbourne Dynasty =====

This short-lasting dynasty ended when I decided I did not want to go through the trouble of keeping the last song on my countdown for 35 days.

# Ozzy Osbourne &quot;Dreamer&quot;
# Andrew W.K. &quot;Party Hard&quot;
# Andrew W.K. &quot;She Is Beautiful&quot;
# Weezer &quot;Keep Fishin'&quot; (Obsolete song.)

=====No Doubt Dynasty =====

This dyansty is named after one of the two bands that started it.  There are two times where I could go either way.

# No Doubt &quot;Hey Baby&quot;&lt;br /&gt;Blink 182 &quot;Stay Together for the Kids&quot;
# Hoobastank &quot;Crawling in the Dark&quot;
# Melanie C &quot;I Turn to You&quot;
# Res &quot;They Say Vision&quot;&lt;br /&gt;Toya &quot;No Matta What (Party All Night)&quot;
# Avril Lavigne &quot;Complicated&quot;
# Ashanti &quot;Happy&quot;
# No Doubt f. Lady Saw &quot;Underneath It All&quot;
# The Distillers &quot;The Young Crazed Peeling&quot;
# The Distillers &quot;City of Angels&quot;
# Korn &quot;Alone I Break&quot;
# Crazy Town &quot;Drowning&quot; 
# T.A.T.U. &quot;All the Things She Said&quot; 
# T.A.T.U. &quot;Not Gonna Get Us&quot; 
# Less Than Jake &quot;She's Gonna Break Soon&quot;
# 311 &quot;Creatures (For a While)&quot; 
# Outkast &quot;Hey Ya&quot; and &quot;The Way You Move&quot;
# Truimph the Insult Comic Dog &quot;I Keed&quot; (Current song.)

=====Good Charlotte Dynasty =====

This is one of two new dynasties I recognized on May 20, 2003.  It gets its name from the band whose first video started the dynasty.

# Good Charlotte &quot;Lifestyles of the Rich and Famous&quot;
# Bowling for Soup &quot;Girl all the Bad Guys Want&quot;
# Good Charlotte &quot;The Anthem&quot;
# System of a Down &quot;Boom!&quot; 
# Girls Aloud &quot;No Good Advice&quot; 
# Lillix &quot;What I Like About You&quot; 
# Lillix &quot;Tomorrow&quot; (Current song.)

=====&quot;Immortal&quot; Dynasty =====

The other new dyansty gets its name from the title of the first video in the dynasty.  This dyansty is immortal in name only and can become obsolete like any other dynasty.  It became obsolete because I wasn't fond of the song by Evanescence.

# Adema &quot;Immortal&quot;
# Sum 41 &quot;The Hell Song&quot;
# Marilyn Manson &quot;mOBSCENE&quot;
# Evanescence &quot;Going Under&quot; (Obsolete song.)

=====Aaliyah's Dynasty =====

This dyansty gets it's name from the late R&amp;B artist Aaliyah.  The first song in this dynasty is the only song by her to retire on my countdown.  There were three other songs by Aaliyah that were on my voting list, including one that was on the voting list for the first day of my countdown.

# Aaliyah &quot;Miss You&quot;
# Lillix &quot;It's About Time&quot;
# Michelle Branch &quot;Are You Happy Now?&quot;
# Korn &quot;Did My Time&quot; 
# Fountains of Wayne &quot;Stacy's Mom&quot;
# Missy Elliott &quot;Pass That Dutch&quot; (Current song.)

=====&quot;I'm With You&quot; Dynasty =====

This dynasty was started by Avril Lavigne's song &quot;I'm With You.&quot;  It contains mostly pop and pop-rock songs.

# Avril Lavigne &quot;I'm With You&quot;
# Daniel Bedingfield &quot;James Dean&quot;
# New Found Glory &quot;Understatement&quot;
# Dream f. Loon &quot;Crazy&quot;
# Skye Sweetnam &quot;Billy S&quot; 
# Mandy Moore &quot;Have a Little Faith in Me&quot; 
# Ladytron &quot;Blue Jeans&quot; (Current song.)

=====Praise Chorus Dyansty =====

This dynasty gets it's name from the song &quot;A Praise Chorus&quot; by Jimmy Eat World, the founder of this dynasty.  The day after the retirement of &quot;Why Not&quot; by Hilary Duff, I let another forum member take over my countdown and premiere any two songs he wanted. I liked one of them so much that I decided to let it run concurrently to the song by Kiley Dean that was originally chosen to replace &quot;Why Not.&quot;  If the line of songs descending from &quot;I'm Not the Girl&quot; goes into the fourth generation, I may consider making a new dynasty.

# Jimmy Eat World &quot;A Praise Chorus&quot;
# Hilary Duff &quot;Why Not?&quot;
# Kiley Dean &quot;Make Me a Song&quot;&lt;br /&gt;Rachel Farris &quot;I'm Not the Girl&quot;
# Hilary Duff &quot;So Yesterday&quot; &lt;br /&gt;Sarai &quot;Ladies&quot; (Part of the Rachel Farris branch.)
# Liz Phair &quot;Why Can't I&quot; (Current song of the Kiley Dean Branch.)&lt;br /&gt;Rose Falcon &quot;Up, Up, Up&quot; (Part of the Rachel Farris branch.)
# ???&lt;br /&gt;P.O.D. &quot;Will You&quot; (Current song of Rachel Farris Branch.)

==Related links ==
* [[Legacy:Ike Bart|Ike Bart]]
* [[:Category:Legacy Personal Page]]

----

'''Tarquin:''' Ike, this page seems to be off-topic. If this page is about Unreal in some way, please explain.

'''ZxAnPhOrIaN:''' Isn't the personal pages for personal stuff, not pertaining to the wiki?

'''Ike Bart:''' This is my personal page.  It has nothing to do with Unreal and neither does my [[Legacy:Ike Bart/MOD Music|Ike Bart/MOD Music]] page.  I don't feel like registering for a page on Geocities or any other free website at this time.  Besides, I don't know HTML that well.  It would be easier for me to keep this here.

'''Piglet:'''  It might be wise then to put a larger explanation at the top of the page in that case.  Or your going to get a lot of confused visitors (like me for example)

'''ZxAnPhOrIaN:''' O well... :rolleyes:

'''Ike Bart:''' So far, there hasn't been any songs from Front 242 or VNV Nation to make my countdown.  One reason is that I don't know of any videos for either band's most recent songs.  In the case of Front 242, I don't even know which of the songs off their latest album is the current single.  Such is the state of EBM and industrial electronic music in the USA.  As for country music, I don't listen to enough of it to become hooked on any recent country songs.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ike Bart/Fake Albums</title>
    <id>1486</id>
    <revision>
      <id>3729</id>
      <timestamp>2003-10-11T04:11:05Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>added comment to explain what it's about</comment>
      <text xml:space="preserve">==Ike Bart's Fake Albums==

This is the page for my fake album tracklistings.  This has nothing to do with Unreal Tournament.  It's just another personal thing.  Some of these songs even have lyrics partially written for them.

===As Fake As It Gets===
# Hardcore Booty
# Sheezo Kyoot (She's So Cute)
# War on Clearchannel
# Sellout
# Dudes and Chicks
# Reckless Abandon (Blink 182 Cover)
# All I Know for Sure about George W. Bush Is that He Hates Saddam's Guts
# End of the Tunnel
# How Soon is Now? (The Smiths Cover)
# L33t W4rr10rz (Elite Warriors)
# Glowstick Rave Party
# I (short skit)
# Hell's DJ
# Flying Pigs
# Invisible
# The Album's Last Song
# Hidden track: The Corniest Love Song Ike Could Write

===The Sacred Gift of Life/Tribute to Breakdancing===
# Mystic
# End of the Tunnel
# Symphony of the Spheres
# Cold Hard Truth
# Pick Me Up
# Astral Portal
# Technopunk
# Vortex to the Darkside
# Tree Spirits
# Backyard S.E.T.I. Station
# Gamma Ray (not intended to be a tribute to the band with the same name)
# Elixir of Immortality
# Shockwave Pulsar
# Uranium 235
# Breakdancing the Night Away
# El Nacimiento (The Birth)
# If I Were President of the USA
# Ouija
# Vineyard
# Imprisioned in Poverty

===Single: End of the Tunnel===
# End of the Tunnel (Album Mix)
# End of the Tunnel (Ghost Train Remix)
# Old-School Radical
# 21st Century Celebrity
# End of the Tunnel (Bullet Train Remix)

===Single: If I Were President of the USA===
# If I Were President of the USA (Album Mix)
# If I Were President of the USA (Democrats vs Republicans Remix f. Mark Hoppus)
# If I Were President of the USA (Supreme Court Remix f. Good Charlotte)
# Virtual Real Estate
# Ackerman Monster

===Miscellaneous B-Sides===
* Goa Nightclub
* Spinach Salad
* Contrails at Dusk
* Castles in Ultima Online (became Virtual Real Estate)
* To the Core of Creation
* Ultrasonic Acid Frequencies (instrumental)

==Comments ==

'''Mosquito:''' WHAT?!

'''Ike Bart:''' Some of these fake albums were made for a game on the Absolute TRL forums called &quot;Fantasy Billboard.&quot;  Basically, every player in that game creates their own albums and sees how well they do on the make believe billboard.  There is also a show for singles with videos.  The way albums are sold in this game is by being voted for on an online site.</text>
    </revision>
    <revision>
      <id>3730</id>
      <timestamp>2003-10-02T12:24:16Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Ike Bart's Fake Albums==

This is the page for my fake album tracklistings.  This has nothing to do with Unreal Tournament.  It's just another personal thing.  Some of these songs even have lyrics partially written for them.

===As Fake As It Gets===
# Hardcore Booty
# Sheezo Kyoot (She's So Cute)
# War on Clearchannel
# Sellout
# Dudes and Chicks
# Reckless Abandon (Blink 182 Cover)
# All I Know for Sure about George W. Bush Is that He Hates Saddam's Guts
# End of the Tunnel
# How Soon is Now? (The Smiths Cover)
# L33t W4rr10rz (Elite Warriors)
# Glowstick Rave Party
# I (short skit)
# Hell's DJ
# Flying Pigs
# Invisible
# The Album's Last Song
# Hidden track: The Corniest Love Song Ike Could Write

===The Sacred Gift of Life/Tribute to Breakdancing===
# Mystic
# End of the Tunnel
# Symphony of the Spheres
# Cold Hard Truth
# Pick Me Up
# Astral Portal
# Technopunk
# Vortex to the Darkside
# Tree Spirits
# Backyard S.E.T.I. Station
# Gamma Ray (not intended to be a tribute to the band with the same name)
# Elixir of Immortality
# Shockwave Pulsar
# Uranium 235
# Breakdancing the Night Away
# El Nacimiento (The Birth)
# If I Were President of the USA
# Ouija
# Vineyard
# Imprisioned in Poverty

===Single: End of the Tunnel===
# End of the Tunnel (Album Mix)
# End of the Tunnel (Ghost Train Remix)
# Old-School Radical
# 21st Century Celebrity
# End of the Tunnel (Bullet Train Remix)

===Single: If I Were President of the USA===
# If I Were President of the USA (Album Mix)
# If I Were President of the USA (Democrats vs Republicans Remix f. Mark Hoppus)
# If I Were President of the USA (Supreme Court Remix f. Good Charlotte)
# Virtual Real Estate
# Ackerman Monster

===Miscellaneous B-Sides===
* Goa Nightclub
* Spinach Salad
* Contrails at Dusk
* Castles in Ultima Online (became Virtual Real Estate)
* To the Core of Creation
* Ultrasonic Acid Frequencies (instrumental)

'''Mosquito:''' WHAT?!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ike Bart/MOD Music</title>
    <id>1485</id>
    <revision>
      <id>3726</id>
      <timestamp>2004-02-11T23:03:19Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In my spare time aside from reading web comics, playing Unreal Tournament and watching TRL, I compose music with [http://www.modplug.com Modplug Tracker].  My favorite genre (as per [http://www.mp3.com MP3.com]) of music to listen to and compose is Electronic music.  The Electronic genre contains my favorite sub-genres Techno, Trance, Dance, Experimental and Game Soundtracks.  Did I mention that one of my favorite insturments is the Roland TB-303?  I also like listening to pop-punk bands like Blink 182 and Good Charlotte.  I'm also into microtonal music, music that uses tunings other than the standard 12-tone equal temperament.  One more thing, I really want to hear some good microtonal techno.  If I can't hear enough of it, I guess I'll have to compose it myself. :D

Down below is a partial list of my works.

==Completed songs ==

{|

|-
|Title
|Genre
|Length
|Comments
|-
|19-TET Experiments
|Microtonal Techno/Game Soundtrack
|6:13
|The vast majority of this song is composed in 19-tone equal temperament.  Actually, it isn't in perfect 19-TET, it is in an approximation of it using the fine and extra fine tone portamento commands.  This piece is divided into three parts and an intro.  The intro is a short piano melody played first in 12-TET and then in 19-TET.  The first part is a fast paced techno movement in 4/4 time.  The second part starts about half-way through the song and is a slower, more dramatic piece in 5/4 time.  The third part is an electric guitar arpeggiation with a synthetic bass accompaniment.
|-
|909 Time (Ike's 909 Beats)
|&quot;Drum and Bass&quot;
|1:33
|Just me messing around with TR-909 drum machine samples and Modplug's resonant filters
|-
|Chiptune
|n00b Chip
|4:15
|Being the second song I started on, this tune has a very weird choice of percussion. There isn't any bass, snare, or hi-hats here but there are samples of me making noises with my mouth such as clicks, pops and gas passing imitations.  When I was around 13 years old, I liked making noises with my mouth and called it &quot;Pop-Click-Toot&quot; music.
|-
|Forgot About Dray
|Hip-hop instrumental cover
|5:03
|This is my cover of Dr. Dre's &quot;Forgot About Dre&quot; sans the vocals.  I use some of my own chip samples in here to give variety to the extremely repetitive MIDI rendition from which this song was based.  It might be not pass the filter test due to copyright issues.
|-
|Trance-Metal-Punk-n'-Funk
|Experimental n00b tekno
|3:33
|My very first MOD.  I started on it in 1999.  The last time I edited the musical content was back in December of 2000.  I added some comments to make it release worthy in February 2003.  I wouldn't be surprised if this gets rejected by the ModArchive.
|-
|(U of Akron) Alma Mater
|Piano solo plus techno remix
|1:22
|This song starts out as a transcription of the Alma Mater sheet music arranged for piano.  The next part is a techno remix of the Alma Mater at 152 BPM.
|-
|Test of Chips
|Chip
|4:20
|The most professionally produced chip tune in my opinion. 
|-
|Tr@x0r d3m0
|Chip
|3:27
|Contains a version of Pachelbel's &quot;Canon in D&quot; and a bunch of cover tunes at the end.
|-
|Limp Bizkit's da Biscuit
|Dancey metal
|0:44
|A short piece featuring vocals from Ike Bart himself.  The second song in the Amatuesr Suite.
|-
|Shave and Haircut
|n00b tekno
|0:19
|This is the shortest complete song I have made.  Nothing much to it except for Ike Bart singing &quot;Shave and a haircut, two bits.&quot;  BTW, this is the first song in the Amatuer Suite and my least favorite of them all so far.
|-
|Ike's New Samples
|Techno
|4:11
|A song that includes a version of &quot;Joy to the World&quot; and includes a part in 6/8 time.  At the end, there are a bunch of microtonal experiments.
|-
|Linkin Park vs. DMX
|Hip-Hop
|0:40
|The third song in the Amatuer Suite. It features me talking about how Linkin Park shoud collaborate with DMX.  The piano melody of this song is based on piano melody of Linkin Park's &quot;In The End&quot; starting on E-flat, but flipped in relative interval structure from one note to the next.
|-
|Speedcore est Bogus
|Gabber
|0:53
|The fourth song in the Amatuer Suite.  The most hardcore song I've made to date. It features me yelling &quot;Bring on the SPEEDCORE!!!!!!!&quot; and &quot;This be BOGUS, man!&quot;  It starts out at 192 BPM and rises to 255 BPM, stays there for a while before going up to 320 BPM and slowing down for the end.
|-
|Soap Operas Suck
|Soundtrack
|0:32
|The fifth song in the Amatuer Suite. Weirdness...  BTW, I say &quot;Soap operas suck&quot; in this song. And so do reality shows...
|-
|Just Playing My Mini-Harp
|Acoustic
|0:24
|The sixth song in the Amatuer Suite.  This is just a solo of me playing some acoustic instrument consisting of a wooden soundboard and eleven strips of metal that look like rake tines or street sweeper blades.  The strips of metal are pressed downward by my fingers.  
|-
|Linkin Bizkit
|House/Techno/Synthpop
|4:08
|My most recent production and what I consider my best to date.  About half-way through, the second theme comes in
|-
|Speedcore est Bogus (Dean Remix)
|Gabber
|0:48
|A remix an online friend of mine named TC did of my tune &quot;Speedcore est Bogus&quot; using Howard Dean's Iowa Caucus speech, yeeeaaaagh and all.  It's pretty funny how I say &quot;This be BOGUS, man!&quot; after Dean's rant.
|}

==Works in Progress ==

{|

|-
|Title
|Genre
|Approximate Length
|Comments
|-
|Blazin' Techno
|Techno
|8:13
|This song blazes along at 160 BPM and has several semi-disjunct movements.  It includes a limited degree of microtonalism.  I think it will be my longest song to date when it is finished.  At the end, there is a rendition of the intro to Blink 182's &quot;Dammit.&quot;
|-
|Bass Kicker
|Bass heavy ambient techno
|1:14+
|This song is heavy on the bass, hence its name.  It is also the latest MOD I started
|-
|The Bad Touch
|Pop/Bloodhound Gang instrumental cover
|4:09
|An instrumental cover of one of my favorite songs. 
|-
|Eat S***e and Dye
|Hardcore
|???
|I don't know what to make of this yet. 
|-
|Linkin Bizkit (Part II)
|Glitchcore
|}

----

'''Related links:'''

[[Legacy:Ike Bart|Ike Bart]]

[[Legacy:Music|Music]]

'''Mythopus:''' Hey!  Where Can You Download Your Music??

'''Ike Bart:''' Currently, there isn't any place you can download my music.  Just go to the main page and read my second to last entry on how to request songs by me.  Until I get my MODs cleaned up for uploading, the only way to get my music at the moment is by e-mailing me.  I'll get to your request as soon as I see it, provided it has the right subject.</text>
    </revision>
    <revision>
      <id>3727</id>
      <timestamp>2003-09-08T02:01:06Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>Added some new songs</comment>
      <text xml:space="preserve">In my spare time aside from reading web comics, playing Unreal Tournament and watching TRL, I compose music with [http://www.modplug.com Modplug Tracker].  My favorite genre (as per [http://www.mp3.com MP3.com]) of music to listen to and compose is Electronic music.  The Electronic genre contains my favorite sub-genres Techno, Trance, Dance, Experimental and Game Soundtracks.  Did I mention that one of my favorite insturments is the Roland TB-303?  I also like listening to pop-punk bands like Blink 182 and Good Charlotte.  I'm also into microtonal music, music that uses tunings other than the standard 12-tone equal temperament.  One more thing, I really want to hear some good microtonal techno.  If I can't hear enough of it, I guess I'll have to compose it myself. :D

Down below is a partial list of my works.

==Completed songs ==

{|

|-
|Title
|Genre
|Length
|Comments
|-
|19-TET Experiments
|Microtonal Techno/Game Soundtrack
|6:13
|The vast majority of this song is composed in 19-tone equal temperament.  Actually, it isn't in perfect 19-TET, it is in an approximation of it using the fine and extra fine tone portamento commands.  This piece is divided into three parts and an intro.  The intro is a short piano melody played first in 12-TET and then in 19-TET.  The first part is a fast paced techno movement in 4/4 time.  The second part starts about half-way through the song and is a slower, more dramatic piece in 5/4 time.  The third part is an electric guitar arpeggiation with a synthetic bass accompaniment.
|-
|909 Time (Ike's 909 Beats)
|&quot;Drum and Bass&quot;
|1:33
|Just me messing around with TR-909 drum machine samples and Modplug's resonant filters
|-
|Chiptune
|n00b Chip
|4:15
|Being the second song I started on, this tune has a very weird choice of percussion. There isn't any bass, snare, or hi-hats here but there are samples of me making noises with my mouth such as clicks, pops and gas passing imitations.  When I was around 13 years old, I liked making noises with my mouth and called it &quot;Pop-Click-Toot&quot; music.
|-
|Forgot About Dray
|Hip-hop instrumental cover
|5:03
|This is my cover of Dr. Dre's &quot;Forgot About Dre&quot; sans the vocals.  I use some of my own chip samples in here to give variety to the extremely repetitive MIDI rendition from which this song was based.  It might be not pass the filter test due to copyright issues.
|-
|Trance-Metal-Punk-n'-Funk
|Experimental n00b tekno
|3:33
|My very first MOD.  I started on it in 1999.  The last time I edited the musical content was back in December of 2000.  I added some comments to make it release worthy in February 2003.  I wouldn't be surprised if this gets rejected by the ModArchive.
|-
|(U of Akron) Alma Mater
|Piano solo plus techno remix
|1:22
|This song starts out as a transcription of the Alma Mater sheet music arranged for piano.  The next part is a techno remix of the Alma Mater at 152 BPM.
|-
|Test of Chips
|Chip
|4:20
|The most professionally produced chip tune in my opinion. 
|-
|Tr@x0r d3m0
|Chip
|3:27
|Contains a version of Pachelbel's &quot;Canon in D&quot; and a bunch of cover tunes at the end.
|-
|Limp Bizkit's da Biscuit
|Dancey metal
|0:44
|A short piece featuring vocals from Ike Bart himself.
|-
|Shave and Haircut
|n00b tekno
|0:19
|This is the shortest complete song I have made.  Nothing much to it except for Ike Bart singing &quot;Shave and a haircut, two bits.&quot;
|-
|Ike's New Samples
|Techno
|4:11
|A song that includes a version of &quot;Joy to the World&quot; and includes a part in 6/8 time.  At the end, there are a bunch of microtonal experiments.
|}

==Works in Progress ==

{|

|-
|Title
|Genre
|Approximate Length
|Comments
|-
|Blazin' Techno
|Techno
|8:13
|This song blazes along at 160 BPM and has several semi-disjunct movements.  It includes a limited degree of microtonalism.  I think it will be my longest song to date when it is finished.  At the end, there is a rendition of the intro to Blink 182's &quot;Dammit.&quot;
|-
|Bass Kicker
|Bass heavy ambient techno
|1:14+
|This song is heavy on the bass, hence its name.  It is also the latest MOD I started
|}

----

'''Related links:'''

[[Legacy:Ike Bart|Ike Bart]]

[[Legacy:Music|Music]]

'''Mythopus:''' Hey!  Where Can You Download Your Music??

'''Ike Bart:''' Currently, there isn't any place you can download my music.  Just go to the main page and read my second to last entry on how to request songs by me.  Until I get my MODs cleaned up for uploading, the only way to get my music at the moment is by e-mailing me.  I'll get to your request as soon as I see it, provided it has the right subject.</text>
    </revision>
    <revision>
      <id>3728</id>
      <timestamp>2003-10-11T04:01:16Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In my spare time aside from reading web comics, playing Unreal Tournament and watching TRL, I compose music with [http://www.modplug.com Modplug Tracker].  My favorite genre (as per [http://www.mp3.com MP3.com]) of music to listen to and compose is Electronic music.  The Electronic genre contains my favorite sub-genres Techno, Trance, Dance, Experimental and Game Soundtracks.  Did I mention that one of my favorite insturments is the Roland TB-303?  I also like listening to pop-punk bands like Blink 182 and Good Charlotte.  I'm also into microtonal music, music that uses tunings other than the standard 12-tone equal temperament.  One more thing, I really want to hear some good microtonal techno.  If I can't hear enough of it, I guess I'll have to compose it myself. :D

Down below is a partial list of my works.

==Completed songs ==

{|

|-
|Title
|Genre
|Length
|Comments
|-
|19-TET Experiments
|Microtonal Techno/Game Soundtrack
|6:13
|The vast majority of this song is composed in 19-tone equal temperament.  Actually, it isn't in perfect 19-TET, it is in an approximation of it using the fine and extra fine tone portamento commands.  This piece is divided into three parts and an intro.  The intro is a short piano melody played first in 12-TET and then in 19-TET.  The first part is a fast paced techno movement in 4/4 time.  The second part starts about half-way through the song and is a slower, more dramatic piece in 5/4 time.  The third part is an electric guitar arpeggiation with a synthetic bass accompaniment.
|-
|909 Time (Ike's 909 Beats)
|&quot;Drum and Bass&quot;
|1:33
|Just me messing around with TR-909 drum machine samples and Modplug's resonant filters
|-
|Chiptune
|n00b Chip
|4:15
|Being the second song I started on, this tune has a very weird choice of percussion. There isn't any bass, snare, or hi-hats here but there are samples of me making noises with my mouth such as clicks, pops and gas passing imitations.  When I was around 13 years old, I liked making noises with my mouth and called it &quot;Pop-Click-Toot&quot; music.
|-
|Forgot About Dray
|Hip-hop instrumental cover
|5:03
|This is my cover of Dr. Dre's &quot;Forgot About Dre&quot; sans the vocals.  I use some of my own chip samples in here to give variety to the extremely repetitive MIDI rendition from which this song was based.  It might be not pass the filter test due to copyright issues.
|-
|Trance-Metal-Punk-n'-Funk
|Experimental n00b tekno
|3:33
|My very first MOD.  I started on it in 1999.  The last time I edited the musical content was back in December of 2000.  I added some comments to make it release worthy in February 2003.  I wouldn't be surprised if this gets rejected by the ModArchive.
|-
|(U of Akron) Alma Mater
|Piano solo plus techno remix
|1:22
|This song starts out as a transcription of the Alma Mater sheet music arranged for piano.  The next part is a techno remix of the Alma Mater at 152 BPM.
|-
|Test of Chips
|Chip
|4:20
|The most professionally produced chip tune in my opinion. 
|-
|Tr@x0r d3m0
|Chip
|3:27
|Contains a version of Pachelbel's &quot;Canon in D&quot; and a bunch of cover tunes at the end.
|-
|Limp Bizkit's da Biscuit
|Dancey metal
|0:44
|A short piece featuring vocals from Ike Bart himself.  The second song in the Amatuesr Suite.
|-
|Shave and Haircut
|n00b tekno
|0:19
|This is the shortest complete song I have made.  Nothing much to it except for Ike Bart singing &quot;Shave and a haircut, two bits.&quot;
|-
|Ike's New Samples
|Techno
|4:11
|A song that includes a version of &quot;Joy to the World&quot; and includes a part in 6/8 time.  At the end, there are a bunch of microtonal experiments.
|-
|Linkin Park vs. DMX
|Hip-Hop
|0:40
|The third song in the Amatuer Suite. It features me talking about how Linkin Park shoud collaborate with DMX.  The piano melody of this song is based on piano melody of Linkin Park's &quot;In The End&quot; starting on E-flat, but flipped in relative interval structure from one note to the next.
|}

==Works in Progress ==

{|

|-
|Title
|Genre
|Approximate Length
|Comments
|-
|Blazin' Techno
|Techno
|8:13
|This song blazes along at 160 BPM and has several semi-disjunct movements.  It includes a limited degree of microtonalism.  I think it will be my longest song to date when it is finished.  At the end, there is a rendition of the intro to Blink 182's &quot;Dammit.&quot;
|-
|Bass Kicker
|Bass heavy ambient techno
|1:14+
|This song is heavy on the bass, hence its name.  It is also the latest MOD I started
|-
|Speedcore est Bogus
|Gabber
|0:45 to 0:59
|The fourth song in the Amatuer Suite.  The most hardcore song I've made to date. It features me yelling &quot;Bring on the SPEEDCORE!!!!!!!&quot; and &quot;This be BOGUS, man!&quot; 
|-
|The Bad Touch
|Pop/Bloodhound Gang instrumental cover
|4:09
|An instrumental cover of one of my favorite songs. 
|}

----

'''Related links:'''

[[Legacy:Ike Bart|Ike Bart]]

[[Legacy:Music|Music]]

'''Mythopus:''' Hey!  Where Can You Download Your Music??

'''Ike Bart:''' Currently, there isn't any place you can download my music.  Just go to the main page and read my second to last entry on how to request songs by me.  Until I get my MODs cleaned up for uploading, the only way to get my music at the moment is by e-mailing me.  I'll get to your request as soon as I see it, provided it has the right subject.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Image Conversion</title>
    <id>1488</id>
    <revision>
      <id>3733</id>
      <timestamp>2004-05-14T01:08:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is another one of those &quot;because I needed it&quot; files.  It's not well written, it doesn't do much error checking or have many user options.  It's a very short program in C to convert files between different image formats, including dds ([[Legacy:DXT|DXT]] texture files).  It requires DevIL, which you can get from http://openil.sf.net/, and probably also from your Linux distribution if you are using Linux.

Compile it like this:
 gcc -o devilconvert -lIL -lILU devilconvert.c

and use it like this:
 devilconvert file1.ext file2.ext

DevIL's load and save functions autodetect file formats, so you can fairly easily convert a bmp or png to a dds, tga, or pcx for use with your mod.

I have it online at http://chshrcat.homelinux.net/devilconvert.c, but here it is in the Wiki as well:

&lt;uscript&gt;
#include &lt;IL/il.h&gt;
#include &lt;IL/ilu.h&gt;

int main(int argc, char *argv[]) {
	int i;
	if (argc != 3)
		exit(1);

	ilInit();
	iluInit();
	ilBindImage(1);

	ilLoadImage(argv[1]);
	i = ilGetError();
	if(i != IL_NO_ERROR) {
		printf(&quot;%s\n&quot;,iluErrorString(i));
		exit(1);
	}
		
	ilSaveImage(argv[2]);
	i = ilGetError();
	if(i != IL_NO_ERROR) {
		printf(&quot;%s\n&quot;,iluErrorString(i));
		exit(1);
	}
}
&lt;/uscript&gt;

Yes, this is crap code.  It is exactly good enough for what I need it to do ;-)

'''G-LiTe:''': [http://www.imagemagick.org/ ImageMagick] includes a commandline program called &quot;convert&quot; which (at the time of writing) supports 87 image formats. It's got lots of options, but unfortunatly cannot read or save DXT files. Just thought it was worth mentioning here, maybe someone in here can write a DXT thingy for it. I'm too lazy. ;) Most linux distributions include it or even have it installed by default.</text>
    </revision>
    <revision>
      <id>3734</id>
      <timestamp>2003-02-15T01:20:36Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is another one of those &quot;because I needed it&quot; files.  It's not well written, it doesn't do much error checking or have many user options.  It's a very short program in C to convert files between different image formats, including dds (DXT texture files).  It requires DevIL, which you can get from http://openil.sf.net/, and probably also from your Linux distribution if you are using Linux.

Compile it like this:
 gcc -o devilconvert -lIL -lILU devilconvert.c

and use it like this:
 devilconvert file1.ext file2.ext

DevIL's load and save functions autodetect file formats, so you can fairly easily convert a bmp or png to a dds, tga, or pcx for use with your mod.

I have it online at http://chshrcat.homelinux.net/devilconvert.c, but here it is in the Wiki as well:

&lt;uscript&gt;
#include &lt;IL/il.h&gt;
#include &lt;IL/ilu.h&gt;

int main(int argc, char *argv[]) {
	int i;
	if (argc != 3)
		exit(1);

	ilInit();
	iluInit();
	ilBindImage(1);

	ilLoadImage(argv[1]);
	i = ilGetError();
	if(i != IL_NO_ERROR) {
		printf(&quot;%s\n&quot;,iluErrorString(i));
		exit(1);
	}
		
	ilSaveImage(argv[2]);
	i = ilGetError();
	if(i != IL_NO_ERROR) {
		printf(&quot;%s\n&quot;,iluErrorString(i));
		exit(1);
	}
}
&lt;/uscript&gt;

Yes, this is crap code.  It is exactly good enough for what I need it to do ;-)</text>
    </revision>
    <revision>
      <id>3735</id>
      <timestamp>2003-04-06T13:16:41Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <comment>There's ImageMagick, you know</comment>
      <text xml:space="preserve">This is another one of those &quot;because I needed it&quot; files.  It's not well written, it doesn't do much error checking or have many user options.  It's a very short program in C to convert files between different image formats, including dds (DXT texture files).  It requires DevIL, which you can get from http://openil.sf.net/, and probably also from your Linux distribution if you are using Linux.

Compile it like this:
 gcc -o devilconvert -lIL -lILU devilconvert.c

and use it like this:
 devilconvert file1.ext file2.ext

DevIL's load and save functions autodetect file formats, so you can fairly easily convert a bmp or png to a dds, tga, or pcx for use with your mod.

I have it online at http://chshrcat.homelinux.net/devilconvert.c, but here it is in the Wiki as well:

&lt;uscript&gt;
#include &lt;IL/il.h&gt;
#include &lt;IL/ilu.h&gt;

int main(int argc, char *argv[]) {
	int i;
	if (argc != 3)
		exit(1);

	ilInit();
	iluInit();
	ilBindImage(1);

	ilLoadImage(argv[1]);
	i = ilGetError();
	if(i != IL_NO_ERROR) {
		printf(&quot;%s\n&quot;,iluErrorString(i));
		exit(1);
	}
		
	ilSaveImage(argv[2]);
	i = ilGetError();
	if(i != IL_NO_ERROR) {
		printf(&quot;%s\n&quot;,iluErrorString(i));
		exit(1);
	}
}
&lt;/uscript&gt;

Yes, this is crap code.  It is exactly good enough for what I need it to do ;-)

'''G-LiTe:''': [http://www.imagemagick.org/ ImageMagick] includes a commandline program called &quot;convert&quot; which (at the time of writing) supports 87 image formats. It's got lots of options, but unfortunatly cannot read or save DXT files. Just thought it was worth mentioning here, maybe someone in here can write a DXT thingy for it. I'm too lazy. ;) Most linux distributions include it or even have it installed by default.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ImageServer</title>
    <id>1465</id>
    <revision>
      <id>3678</id>
      <timestamp>2002-04-20T15:15:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:WebApplication|WebApplication]] &gt;&gt; ImageServer}}

Provides access to images (*.gif, *.jpg, *.jpeg and *.bmp) used in web pages created by a UT web server.

==Known subclasses ==
* [[Legacy:UTImageServer|UTImageServer]]</text>
    </revision>
    <revision>
      <id>3679</id>
      <timestamp>2002-04-19T23:55:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:WebApplication|WebApplication]] &gt;&gt; ImageServer}}

Provides access to images (*.gif, *.jpg, *.jpeg and *.bmp) used in web pages created by a UT web server.

By default it is set up as &lt;tt&gt;Application[1]&lt;/tt&gt; in the &lt;tt&gt;[UWeb.WebServer]&lt;/tt&gt; section of UnrealTournament.ini.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Images</title>
    <id>1476</id>
    <revision>
      <id>3705</id>
      <timestamp>2005-06-23T13:51:23Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Before you upload an image, please take note:

==Image tips==

===Avoid duplication===

Before you even make a screenshot, please take a look at [[:Category:Legacy Basic Procedure]]s and [[Legacy:UnrealEd Interface|UnrealEd Interface]]. There are plenty of images of various parts of UnrealEd, so you may be able to reuse those.

See also [[Legacy:Guidelines On Tutorials|Guidelines on Tutorials]].

===File Names===

Images are stored in a flat list, so it's important to give your image file a descriptive name.

; For tutorials: {name of tutorial page}-{description or number}

; Interface screenshots : interface-Ed3-{something descriptive}

(we're using dash (-) as a separator because:
* Mychaeel dislikes the use of dots to separate parts of a file name; they are, in his opinion, reserved for the file extension. (and fair enough :) )
* underscores look ugly, especially because they're disproportionally wide in most proportional fonts. They're also a pain to type because they're shifted.)

===File Sizes===

&quot;800x600&quot; Landscape.

===Rough style notes===

'''Tarquin:''' I'm slowly working on new screenies of the interface. rough notes for common style:

* font: Arial 16 plain

==Problems ==

===Ugly PNGs in IE===

Some [[Wikipedia:PNG]] images on the site are made with an [[Wikipedia:alpha channel]]. This is so they blend with different colour backgrounds. 

Unfortunately, IE does not support PNG alpha channels correctly. Instead of the page background colour, you'll see grey (or some other colour from your Windows appearance settings). So unless you change browsers, you'll get &quot;ugly but functional&quot;.

==Renaming (admin only) ==

'''Tarquin:''' I'm planning on hacking the wiki script to do regular search &amp; replace, so renaming images should be easier.

'''Mychaeel:''' Warning.  Abuse of such a feature has the potential to wreck the entire site if it's publicly available. &amp;ndash; We could also update the image uploader to enforce certain syntactical rules for image names.

'''Tarquin:''' I meant for admin-only: I'll tack it into the page-renaming utility, since it does a S&amp;R itself to update links.

'''Tarquin:''' If I rename image files via FTP access, will that upset anything?

'''Mychaeel:''' You should rename the previous versions in the &quot;deleted&quot; subdirectory accordingly too, or they'll be &quot;detached&quot; from the current version in the main image directory.  Otherwise, nothing bad can happen.

'''MythOpus:''' So seeing my ip/hostname on all the deleted pictures are normal :|

==Image Management==

'''EntropicLqd:''' Is there any way of viewing all of the images that have been uploaded to the web site?  I'll be needing to upload a bunch of images for the tutorials I'm going to be doing, but don't want to needlessly duplicate images if I don't have to.

'''Tarquin:''' The image uploader page lists them all. I can put up a 2nd version of that page that loads all the images too, as thumbnails, but it'll be  a long load. 

'''EntropicLqd:''' That's OK - I have a big pipe :).  It would be useful.  Unless you can think of another way of searching for images.

'''Tarquin:''' I have a cigar. I'll fiddle with the cgi, see if it's as simple as I hope it is

'''Tarquin:''' ok, try http://wiki.beyondunreal.com/cgi-bin/imageupload.cgi/wiki-ext/imageupload_thumb.htt

'''EntropicLqd:''' Thanks m8.  I'll give it a go when I get home (don't want to try it from here it might get the site blocked).  I assume that fairly long filenames are OK - it means I can prefix the images with the tutorial they relate to.

'''Tarquin:''' I think a lot of the ones that have generic-sounding names aren't very good, eg &quot;Texture Browser&quot; includes the actor browser in shot (which is irrelevant), and is a jpeg (bad quality; use gif for simple colours). There's one somewhere I made of the surface flags which I hope is generic enough: I positioed the window so the button that opens it would be in-shot too .. (neat or wot?). 

It seems we have a lot of dross:
* What the hell is the Nikon pic? ''it was a camera :rolleyes:, deleted''
* the spinning &quot;email&quot; logo? gah? it goes, IMO ''deleted''
* who is Picf0019 ? ''dunno, deleted''

'''Mychaeel:''' I agree about the generic names  (like &quot;Fig_A&quot;).  Some images should be deleted too since they're Wiki-unrelated.  Fortunately the image referrer check prevents that sort of abuse.

* http://wiki.beyondunreal.com/images/icesig &amp;ndash; forum signature image. ''deleted''
* http://wiki.beyondunreal.com/images/Picf0019 &amp;ndash; some private wedding picture. ''deleted (poor photographing skills btw. ;))''

If you want to replace a poor JPEG-encoded user interface screenshot by a better GIF or PNG one, use the image uploader's &quot;Replace image&quot; functionality.

It seems we have a lot of dross:
* loads of stuff that's too dark
* too big
* personal map screenshots: which ones are used in tutes, which ones are just &quot;here's a map I made&quot;? 

And the &quot;what the hell are these&quot; bucket:

:''(bucket is empty :))''

'''Mychaeel:''' Delete 'em.  And I'll add a note to the image uploader that remote linking isn't possible.

'''Mychaeel:''' Done.

'''Wormbo:''' Having the name of the user who uploaded (maybe also deleted) an image like on [[Legacy:Recent Changes|Recent Changes]] would be nice.

'''ZxAnPhOrIaN:''' Or a column in the image uploading area that says who uploaded the picture.

:'''Mychaeel:''' That'd mean I'd have to keep track of that in an extra database file.  Right now everything is saved in and by the file system.  We do have the IPs/hostnames of the people that uploaded those files though.
::'''ZxAnPhOrIaN:''' Ok

'''Wormbo:''' That's what I meant. Is there any reason why the pictures above shouldn't be deleted?

'''Tarquin:''' Nope. kill 'em!

'''Wormbo:''' Deleted the pics.

'''ZxAnPhOrIaN:''' Got rid of those red x's.

'''Mychaeel:''' The [http://wiki.beyondunreal.com/cgi-bin/imageupload.cgi/wiki-ext/imageupload.htt image uploader] got some enhancements &amp;ndash;
* Image URLs now contain a secured expiration timestamp; they expire five minutes after having been generated.  Linking to images in the wiki image database from anywhere outside the Unreal Wiki is ultimately futile since the links will be valid for no more than five minutes.
* For each image, the image uploader displays the names of the Unreal Wiki pages the image is used on.  Pages that are used nowhere are easy to spot (and ElMuerte and I spent some time removing them for now).

I'm also looking into a way to show image uploads on [[Legacy:Recent Changes|Recent Changes]] just like page edits.

'''MythOpus:'''Will linking within the wiki to images that are actually being used for the wiki purposes not allow the 5min expiration to affect the picture being linked too?

'''Mychaeel:''' The wiki image embedding markup (&lt;code&gt;@block@imagename&lt;/code&gt; etc.) automatically generates the required timestamp when the page is rendered.  Assuming a browser starts loading the images contained in a wiki page within five minutes of starting to load the page itself, all images will be displayed properly; but taking the image URL out of the rendered HTML will yield an address that'll expire shortly.

'''Tarquin:''' That sounds pretty neat! :)

'''Mychaeel:''' I hope it'll turn out useful :-) &amp;ndash; I've now also added logging of image uploads and deletions on [[Legacy:Recent Changes|Recent Changes]] (you might have noticed).  Known issue:  Even for wikizens who are logged in, it'll only display the host address instead of the name.  I'll look into that later.

'''Wormbo:''' It's not the host address of the user who modified the image, but the address of the user who views Recent Changes. BTW: I just reverted one and deleted two other images.

'''Graphik:''' Also, Mych, when I deleted a pic called NormaN (which was some stupid mug shot), it listed my host on RC not only as the one who deleted the image but also the uploader of the image. Do we (by &quot;we&quot; meaning the creator of the image and myself) concidentally have the same host, or is this a bug?

'''Wormbo:''' This is what I tried to say above. :) It's a bug.

'''Mychaeel:''' Bwaaah. What an idiotic bug. The IPs are logged correctly, they're just not displayed. I'll upload a fix later when BeyondUnreal has sorted out its FTP connectivity problems.

'''Mychaeel:''' Fixed it, and now it also displays the user name on [[Legacy:Recent Changes|Recent Changes]].

'''El Muerte:''' Mychaeel, how do you identify deleted images in the rclog? I'm updating the mozilla sidebar code to cope with the new image rclog hack.

'''Foxpaw:''' Is there a way to revert images? The &quot;changes&quot; link on recent changes lists previous revisions, and lets you view them, but does not seem to provide an easy way to revert other than saving the image to your harddrive and uploading it again.

'''Mychaeel:''' I'd say that's the way to go to revert images.  I could add extra functionality to allow users to directly revert to a previous revision, but I fear that doing so might open even more doors to easy abuse.

'''El Muerte:''' arg, ok, the &quot;delete&quot; feature in the changelog of an images doesn't delete the most recent image, but deletes them all. That wasn't very clear.

'''Mychaeel:''' Well, it ''does'' only delete the most recent image (the &quot;Current Revision&quot;).  What it doesn't do &amp;ndash; and what you expected, it seems &amp;ndash; is ''un''deleting the ''previous'' image revision.  Thinking of it, I could probably add a feature which reverts an image to a certain revision by moving the most recent revision to the trash and undeleting the selected older revision.

==Requests==

'''EntropicLqd:''' The two images I need right now are the &quot;static mesh browser&quot; button, and the &quot;add volume&quot; button.

'''Tarquin:''' They're already in. See [[Legacy:Add A Volume|Add a volume]] and [[Legacy:Static Mesh Browser|Static mesh browser]] :)

'''CH3Z:''' requested on [[Legacy:Wiki_Development|Wiki_Development]] Header: &quot;Game Logo Smileys&quot;

ut.png, ut2003.png, devastation.png and so on.

16x16- alpha-channelled-  without an antialiased edge. 

'''Tarquin:''' Um. I thought you said you'd do these? nm, I can do the UT &amp; UT2003 ones at least. Mych? Any idea for filenames?

'''CH3Z:''' I was afraid I might have taken the discussion down prematurely. I said I would make them when they were going to be gifs. But I don't have experience with png's. Those are the file names Mych asked for with different extensions now. I see you figured out that the full discussion is in revision 184 of [[Legacy:Wiki Development|Wiki Development]] and I saw your notes. Gotcha, I'll get a better feel for this.

'''Tarquin:''' I'm doing: U1, UT, UT2003, Devastation.</text>
    </revision>
    <revision>
      <id>3706</id>
      <timestamp>2005-06-23T12:39:38Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Before you upload an image, please take note:

==Image tips==

===Avoid duplication===

Before you even make a screenshot, please take a look at [[:Category:Legacy Basic Procedure]]s and [[Legacy:UnrealEd Interface|UnrealEd Interface]]. There are plenty of images of various parts of UnrealEd, so you may be able to reuse those.

See also [[Legacy:Guidelines On Tutorials|Guidelines on Tutorials]].

===File Names===

Images are stored in a flat list, so it's important to give your image file a descriptive name.

; For tutorials: {name of tutorial page}-{description or number}

; Interface screenshots : interface-Ed3-{something descriptive}

(we're using dash (-) as a separator because:
* Mychaeel dislikes the use of dots to separate parts of a file name; they are, in his opinion, reserved for the file extension. (and fair enough :) )
* underscores look ugly, especially because they're disproportionally wide in most proportional fonts. They're also a pain to type because they're shifted.)

===File Sizes===

&quot;800x600&quot; Landscape.

===Rough style notes===

'''Tarquin:''' I'm slowly working on new screenies of the interface. rough notes for common style:

* font: Arial 16 plain

==Problems ==

===Ugly PNGs in IE===

Some [[Wikipedia:PNG]] images on the site are made with an [[Wikipedia:alpha channel]]. This is so they blend with different colour backgrounds. 

Unfortunately, IE does not support PNG alpha channels correctly. Instead of the page background colour, you'll see grey (or some other colour from your Windows appearance settings). So unless you change browsers, you'll get &quot;ugly but functional&quot;.

==Renaming (admin only) ==

'''Tarquin:''' I'm planning on hacking the wiki script to do regular search &amp; replace, so renaming images should be easier.

'''Mychaeel:''' Warning.  Abuse of such a feature has the potential to wreck the entire site if it's publicly available. &amp;ndash; We could also update the image uploader to enforce certain syntactical rules for image names.

'''Tarquin:''' I meant for admin-only: I'll tack it into the page-renaming utility, since it does a S&amp;R itself to update links.

'''Tarquin:''' If I rename image files via FTP access, will that upset anything?

'''Mychaeel:''' You should rename the previous versions in the &quot;deleted&quot; subdirectory accordingly too, or they'll be &quot;detached&quot; from the current version in the main image directory.  Otherwise, nothing bad can happen.

'''MythOpus:''' So seeing my ip/hostname on all the deleted pictures are normal :|

==Image Management==

'''EntropicLqd:''' Is there any way of viewing all of the images that have been uploaded to the web site?  I'll be needing to upload a bunch of images for the tutorials I'm going to be doing, but don't want to needlessly duplicate images if I don't have to.

'''Tarquin:''' The image uploader page lists them all. I can put up a 2nd version of that page that loads all the images too, as thumbnails, but it'll be  a long load. 

'''EntropicLqd:''' That's OK - I have a big pipe :).  It would be useful.  Unless you can think of another way of searching for images.

'''Tarquin:''' I have a cigar. I'll fiddle with the cgi, see if it's as simple as I hope it is

'''Tarquin:''' ok, try http://wiki.beyondunreal.com/cgi-bin/imageupload.cgi/wiki-ext/imageupload_thumb.htt

'''EntropicLqd:''' Thanks m8.  I'll give it a go when I get home (don't want to try it from here it might get the site blocked).  I assume that fairly long filenames are OK - it means I can prefix the images with the tutorial they relate to.

'''Tarquin:''' I think a lot of the ones that have generic-sounding names aren't very good, eg &quot;Texture Browser&quot; includes the actor browser in shot (which is irrelevant), and is a jpeg (bad quality; use gif for simple colours). There's one somewhere I made of the surface flags which I hope is generic enough: I positioed the window so the button that opens it would be in-shot too .. (neat or wot?). 

It seems we have a lot of dross:
* What the hell is the Nikon pic? ''it was a camera :rolleyes:, deleted''
* the spinning &quot;email&quot; logo? gah? it goes, IMO ''deleted''
* who is Picf0019 ? ''dunno, deleted''

'''Mychaeel:''' I agree about the generic names  (like &quot;Fig_A&quot;).  Some images should be deleted too since they're Wiki-unrelated.  Fortunately the image referrer check prevents that sort of abuse.

* http://wiki.beyondunreal.com/images/icesig &amp;ndash; forum signature image. ''deleted''
* http://wiki.beyondunreal.com/images/Picf0019 &amp;ndash; some private wedding picture. ''deleted (poor photographing skills btw. ;))''

If you want to replace a poor JPEG-encoded user interface screenshot by a better GIF or PNG one, use the image uploader's &quot;Replace image&quot; functionality.

It seems we have a lot of dross:
* loads of stuff that's too dark
* too big
* personal map screenshots: which ones are used in tutes, which ones are just &quot;here's a map I made&quot;? 

And the &quot;what the hell are these&quot; bucket:

:''(bucket is empty :))''

'''Mychaeel:''' Delete 'em.  And I'll add a note to the image uploader that remote linking isn't possible.

'''Mychaeel:''' Done.

'''Wormbo:''' Having the name of the user who uploaded (maybe also deleted) an image like on [[Legacy:Recent Changes|Recent Changes]] would be nice.

'''ZxAnPhOrIaN:''' Or a column in the image uploading area that says who uploaded the picture.

:'''Mychaeel:''' That'd mean I'd have to keep track of that in an extra database file.  Right now everything is saved in and by the file system.  We do have the IPs/hostnames of the people that uploaded those files though.
::'''ZxAnPhOrIaN:''' Ok

'''Wormbo:''' That's what I meant. Is there any reason why the pictures above shouldn't be deleted?

'''Tarquin:''' Nope. kill 'em!

'''Wormbo:''' Deleted the pics.

'''ZxAnPhOrIaN:''' Got rid of those red x's.

'''Mychaeel:''' The [http://wiki.beyondunreal.com/cgi-bin/imageupload.cgi/wiki-ext/imageupload.htt image uploader] got some enhancements &amp;ndash;
* Image URLs now contain a secured expiration timestamp; they expire five minutes after having been generated.  Linking to images in the wiki image database from anywhere outside the Unreal Wiki is ultimately futile since the links will be valid for no more than five minutes.
* For each image, the image uploader displays the names of the Unreal Wiki pages the image is used on.  Pages that are used nowhere are easy to spot (and ElMuerte and I spent some time removing them for now).

I'm also looking into a way to show image uploads on [[Legacy:Recent Changes|Recent Changes]] just like page edits.

'''MythOpus:'''Will linking within the wiki to images that are actually being used for the wiki purposes not allow the 5min expiration to affect the picture being linked too?

'''Mychaeel:''' The wiki image embedding markup (&lt;code&gt;@block@imagename&lt;/code&gt; etc.) automatically generates the required timestamp when the page is rendered.  Assuming a browser starts loading the images contained in a wiki page within five minutes of starting to load the page itself, all images will be displayed properly; but taking the image URL out of the rendered HTML will yield an address that'll expire shortly.

'''Tarquin:''' That sounds pretty neat! :)

'''Mychaeel:''' I hope it'll turn out useful :-) &amp;ndash; I've now also added logging of image uploads and deletions on [[Legacy:Recent Changes|Recent Changes]] (you might have noticed).  Known issue:  Even for wikizens who are logged in, it'll only display the host address instead of the name.  I'll look into that later.

'''Wormbo:''' It's not the host address of the user who modified the image, but the address of the user who views Recent Changes. BTW: I just reverted one and deleted two other images.

'''Graphik:''' Also, Mych, when I deleted a pic called NormaN (which was some stupid mug shot), it listed my host on RC not only as the one who deleted the image but also the uploader of the image. Do we (by &quot;we&quot; meaning the creator of the image and myself) concidentally have the same host, or is this a bug?

'''Wormbo:''' This is what I tried to say above. :) It's a bug.

'''Mychaeel:''' Bwaaah. What an idiotic bug. The IPs are logged correctly, they're just not displayed. I'll upload a fix later when BeyondUnreal has sorted out its FTP connectivity problems.

'''Mychaeel:''' Fixed it, and now it also displays the user name on [[Legacy:Recent Changes|Recent Changes]].

'''El Muerte:''' Mychaeel, how do you identify deleted images in the rclog? I'm updating the mozilla sidebar code to cope with the new image rclog hack.

'''Foxpaw:''' Is there a way to revert images? The &quot;changes&quot; link on recent changes lists previous revisions, and lets you view them, but does not seem to provide an easy way to revert other than saving the image to your harddrive and uploading it again.

'''Mychaeel:''' I'd say that's the way to go to revert images.  I could add extra functionality to allow users to directly revert to a previous revision, but I fear that doing so might open even more doors to easy abuse.

'''El Muerte:''' arg, ok, the &quot;delete&quot; feature in the changelog of an images doesn't delete the most recent image, but deletes them all. That wasn't very clear.

==Requests==

'''EntropicLqd:''' The two images I need right now are the &quot;static mesh browser&quot; button, and the &quot;add volume&quot; button.

'''Tarquin:''' They're already in. See [[Legacy:Add A Volume|Add a volume]] and [[Legacy:Static Mesh Browser|Static mesh browser]] :)

'''CH3Z:''' requested on [[Legacy:Wiki_Development|Wiki_Development]] Header: &quot;Game Logo Smileys&quot;

ut.png, ut2003.png, devastation.png and so on.

16x16- alpha-channelled-  without an antialiased edge. 

'''Tarquin:''' Um. I thought you said you'd do these? nm, I can do the UT &amp; UT2003 ones at least. Mych? Any idea for filenames?

'''CH3Z:''' I was afraid I might have taken the discussion down prematurely. I said I would make them when they were going to be gifs. But I don't have experience with png's. Those are the file names Mych asked for with different extensions now. I see you figured out that the full discussion is in revision 184 of [[Legacy:Wiki Development|Wiki Development]] and I saw your notes. Gotcha, I'll get a better feel for this.

'''Tarquin:''' I'm doing: U1, UT, UT2003, Devastation.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ImitatoR</title>
    <id>1490</id>
    <revision>
      <id>3738</id>
      <timestamp>2003-03-10T21:42:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===INFORMATION===

====Object:====
; Alias : ImitatoR
; Name : Denis Ivanoff
; Organization : ZD Clan
; Position : Offensive player
; Location : xUSSR
; Occupation : Programmer
; Further : Game Designer

====Properties:====

C L A S S I F I E D

----

'''Wormbo:''' Welcome to the site. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3739</id>
      <timestamp>2003-03-10T21:25:02Z</timestamp>
      <contributor>
        <ip>ImitatoR</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===INFORMATION===

====Object:====
; Alias : ImitatoR
; Name : Denis Ivanoff
; Organization : ZD Clan
; Position : Offensive player
; Location : xUSSR
; Occupation : Programmer
; Further : Game Designer

====Properties:====

C L A S S I F I E D</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ImpactHammer</title>
    <id>1458</id>
    <revision>
      <id>3662</id>
      <timestamp>2002-08-30T02:59:09Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]] &gt;&gt; ImpactHammer}}

The ImpactHammer is one of the two weapons (the [[Legacy:Enforcer|Enforcer]] being the other) that a player is spawned with by default in UT. The ImpactHammer can be used either as a melee weapon or to perform [[Legacy:HammerJump|HammerJump]]s.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Import The Texture</title>
    <id>1473</id>
    <revision>
      <id>3698</id>
      <timestamp>2008-03-09T15:27:57Z</timestamp>
      <contributor>
        <ip>Ip2-22.eyrkonaeac12.dialup.ca.telus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Texture requirements ==

The texture file you are trying to import must satisfy certain requirements. These are:

===UT2003 and newer===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 2048x2048.
* saved in .pcx, .bmp, targa, [[Legacy:DXT|DXT]] or [[Legacy:UPaint|UPaint]] [[Legacy:File Format|file format]]
* 8-bit indexed color (256 color indexed) for PCX; 24-bit or 32-bit BMP, TGA or DDS

===UT===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 1024x1024.
* Using 8-bit color (256 color indexed) .pcx or .bmp format.

==Importing==

In the [[Legacy:Texture Browser|Texture Browser]], do [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Import. Find the directory containg your image file, then select it and click ''Open''. A window will appear asking for specifics on how to import the file:

[[Image:Legacy_interface.Ed3.textureimport.png|center|Import texture window]]

You'll need to supply the following details:

===Info===
; File : you can't edit this, it just tells you the file currently being processed. (I'm guessing this is useful when you import a batch of files)
; Package : the name of the [[Legacy:Package|package]] to import the texture into. If you give...
;* the name of an existing file, the texture will be added to that package. But [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]]!
;* the name &quot;MyLevel&quot;, the texture will be embedded in the current map. See [[Legacy:MyLevel|MyLevel]] for more on this.
;* something else, a new package will be created. You'll need to save it.
; Group : textures can be organized into groups within a package (eg &quot;Walls&quot;, &quot;Floors&quot;). This is just for convenience. Type the name of an existing group, or a new one.
; Name : just in case you want to change the name of the texture, you can do so with this option.
; LOD :

===Options===
;Masked : sets the texture to be masked (how?). see [[Legacy:Color Blending|Color Blending]].
;Alpha :
;Generate MipMaps : MipMaps are basically smaller versions of your textures. This is rendering method to not only increase FPS but to reduce pixel shimmering on the screen. If you have a large texture but it is only on a small area of the screen the texture can shimmer because the sampling of that texture isn't accurate enough to represent it on the pixels given to the texture. If you import large textures (1024 X 1024 and above) and don't generate mipmaps, you may see shimmering effects when you use the texture ingame. More info: [[Legacy:MipMap|MipMap]]
;Detail Hack? :

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* more on parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* more on [[Legacy:Texture Import And Export|Texture Import And Export]], including a '''troubleshooting''' checklist
* [[Legacy:Create A Material|Create A Material]]

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Tutorial]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; fill in the property details

==Discussion==

===UT===

'''Q.'''  What if you want to import a texture that came with the game?  ucc.exe can export the pcx files stored in the utx files, but should the original package name be used or MyLevel?  I've had to create mip maps for the texture to appear in the texture browser (for at least a few, possibly all, textures); however, some textures (eg at least one of skarrj.utx) won't save nor appear in the game, but (iirc) WILL appear in a t3d export...

Should ALL textures be imported into MyLevel embeding them into the map even if they appear in a default package (eg city.utx)?

As far as attribution is concerned, is there a texture comment field or something to mention that the bundled textures were used (or something to that effect)?

'''Tarquin:''' don't understand the question. Why import a texture already in a default package?

'''JTMILLER:''' i think he was asking if he should export the default textures and then reimport them into myLevel mabie for speed issues, dont worry mr Q. it loads them from the other packages just as fast.

'''amitakartok:''' Is there a way to use textures from both games (e.g. UT and UT2004) at the same time? I tried to export and convert UT2004 skybox textures so that I can use them in UT. However, the color depth-conversion makes them look washed out.

'''amitakartok:''' I found an alternative way: I'm just using UT2k4 textures with some others. DM-Morpheus3 with a Half-Life 2 skybox (!!!) is simply astonishing. (I even tried to import the Citadel for some spectacular backdrop, but it is the full model's texture :( ) Cloudy dusk sky and cityview from several kilometres (I read it is satellite view of Manhattan)... just try it and you'll see what I mean :D I'm currently trying to create an AS map with the same theme, but it is very-very alpha right now.

'''JeffMOD:''' I can't seem to be able to import into UED using mylevel. Is there any program bundled with windows XP that can do this properly? ( I don't think I could afford photoshop if i could find it.) '''PLEASE''' Help me! :(

'''JeffMOD:''' uh, never mind. I just had it at the wrong size. to all '''other''' people without photoshop, paint can work fine. (If it's a screenshot, open Picture editor and resize it first. :))
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3699</id>
      <timestamp>2008-02-07T20:44:26Z</timestamp>
      <contributor>
        <ip>Ip599363c1.rubicom.hu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Texture requirements ==

The texture file you are trying to import must satisfy certain requirements. These are:

===UT2003 and newer===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 2048x2048.
* saved in .pcx, .bmp, targa, [[Legacy:DXT|DXT]] or [[Legacy:UPaint|UPaint]] [[Legacy:File Format|file format]]
* 8-bit indexed color (256 color indexed) for PCX; 24-bit or 32-bit BMP, TGA or DDS

===UT===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 1024x1024.
* Using 8-bit color (256 color indexed) .pcx or .bmp format.

==Importing==

In the [[Legacy:Texture Browser|Texture Browser]], do [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Import. Find the directory containg your image file, then select it and click ''Open''. A window will appear asking for specifics on how to import the file:

[[Image:Legacy_interface.Ed3.textureimport.png|center|Import texture window]]

You'll need to supply the following details:

===Info===
; File : you can't edit this, it just tells you the file currently being processed. (I'm guessing this is useful when you import a batch of files)
; Package : the name of the [[Legacy:Package|package]] to import the texture into. If you give...
;* the name of an existing file, the texture will be added to that package. But [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]]!
;* the name &quot;MyLevel&quot;, the texture will be embedded in the current map. See [[Legacy:MyLevel|MyLevel]] for more on this.
;* something else, a new package will be created. You'll need to save it.
; Group : textures can be organized into groups within a package (eg &quot;Walls&quot;, &quot;Floors&quot;). This is just for convenience. Type the name of an existing group, or a new one.
; Name : just in case you want to change the name of the texture, you can do so with this option.
; LOD :

===Options===
;Masked : sets the texture to be masked (how?). see [[Legacy:Color Blending|Color Blending]].
;Alpha :
;Generate MipMaps : MipMaps are basically smaller versions of your textures. This is rendering method to not only increase FPS but to reduce pixel shimmering on the screen. If you have a large texture but it is only on a small area of the screen the texture can shimmer because the sampling of that texture isn't accurate enough to represent it on the pixels given to the texture. If you import large textures (1024 X 1024 and above) and don't generate mipmaps, you may see shimmering effects when you use the texture ingame. More info: [[Legacy:MipMap|MipMap]]
;Detail Hack? :

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* more on parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* more on [[Legacy:Texture Import And Export|Texture Import And Export]], including a '''troubleshooting''' checklist
* [[Legacy:Create A Material|Create A Material]]

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Tutorial]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; fill in the property details

==Discussion==

===UT===

'''Q.'''  What if you want to import a texture that came with the game?  ucc.exe can export the pcx files stored in the utx files, but should the original package name be used or MyLevel?  I've had to create mip maps for the texture to appear in the texture browser (for at least a few, possibly all, textures); however, some textures (eg at least one of skarrj.utx) won't save nor appear in the game, but (iirc) WILL appear in a t3d export...

Should ALL textures be imported into MyLevel embeding them into the map even if they appear in a default package (eg city.utx)?

As far as attribution is concerned, is there a texture comment field or something to mention that the bundled textures were used (or something to that effect)?

'''Tarquin:''' don't understand the question. Why import a texture already in a default package?

'''JTMILLER:''' i think he was asking if he should export the default textures and then reimport them into myLevel mabie for speed issues, dont worry mr Q. it loads them from the other packages just as fast.

'''amitakartok:''' Is there a way to use textures from both games (e.g. UT and UT2004) at the same time? I tried to export and convert UT2004 skybox textures so that I can use them in UT. However, the color depth-conversion makes them look washed out.

'''amitakartok:''' I found an alternative way: I'm just using UT2k4 textures with some others. DM-Morpheus3 with a Half-Life 2 skybox (!!!) is simply astonishing. (I even tried to import the Citadel for some spectacular backdrop, but it is the full model's texture :( ) Cloudy dusk sky and cityview from several kilometres (I read it is satellite view of Manhattan)... just try it and you'll see what I mean :D I'm currently trying to create an AS map with the same theme, but it is very-very alpha right now.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3700</id>
      <timestamp>2008-03-09T15:22:37Z</timestamp>
      <contributor>
        <ip>Ip2-22.eyrkonaeac12.dialup.ca.telus.com</ip>
      </contributor>
      <comment>* Added request for help</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Texture requirements ==

The texture file you are trying to import must satisfy certain requirements. These are:

===UT2003 and newer===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 2048x2048.
* saved in .pcx, .bmp, targa, [[Legacy:DXT|DXT]] or [[Legacy:UPaint|UPaint]] [[Legacy:File Format|file format]]
* 8-bit indexed color (256 color indexed) for PCX; 24-bit or 32-bit BMP, TGA or DDS

===UT===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 1024x1024.
* Using 8-bit color (256 color indexed) .pcx or .bmp format.

==Importing==

In the [[Legacy:Texture Browser|Texture Browser]], do [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Import. Find the directory containg your image file, then select it and click ''Open''. A window will appear asking for specifics on how to import the file:

[[Image:Legacy_interface.Ed3.textureimport.png|center|Import texture window]]

You'll need to supply the following details:

===Info===
; File : you can't edit this, it just tells you the file currently being processed. (I'm guessing this is useful when you import a batch of files)
; Package : the name of the [[Legacy:Package|package]] to import the texture into. If you give...
;* the name of an existing file, the texture will be added to that package. But [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]]!
;* the name &quot;MyLevel&quot;, the texture will be embedded in the current map. See [[Legacy:MyLevel|MyLevel]] for more on this.
;* something else, a new package will be created. You'll need to save it.
; Group : textures can be organized into groups within a package (eg &quot;Walls&quot;, &quot;Floors&quot;). This is just for convenience. Type the name of an existing group, or a new one.
; Name : just in case you want to change the name of the texture, you can do so with this option.
; LOD :

===Options===
;Masked : sets the texture to be masked (how?). see [[Legacy:Color Blending|Color Blending]].
;Alpha :
;Generate MipMaps : MipMaps are basically smaller versions of your textures. This is rendering method to not only increase FPS but to reduce pixel shimmering on the screen. If you have a large texture but it is only on a small area of the screen the texture can shimmer because the sampling of that texture isn't accurate enough to represent it on the pixels given to the texture. If you import large textures (1024 X 1024 and above) and don't generate mipmaps, you may see shimmering effects when you use the texture ingame. More info: [[Legacy:MipMap|MipMap]]
;Detail Hack? :

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* more on parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* more on [[Legacy:Texture Import And Export|Texture Import And Export]], including a '''troubleshooting''' checklist
* [[Legacy:Create A Material|Create A Material]]

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Tutorial]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; fill in the property details

==Discussion==

===UT===

'''Q.'''  What if you want to import a texture that came with the game?  ucc.exe can export the pcx files stored in the utx files, but should the original package name be used or MyLevel?  I've had to create mip maps for the texture to appear in the texture browser (for at least a few, possibly all, textures); however, some textures (eg at least one of skarrj.utx) won't save nor appear in the game, but (iirc) WILL appear in a t3d export...

Should ALL textures be imported into MyLevel embeding them into the map even if they appear in a default package (eg city.utx)?

As far as attribution is concerned, is there a texture comment field or something to mention that the bundled textures were used (or something to that effect)?

'''Tarquin:''' don't understand the question. Why import a texture already in a default package?

'''JTMILLER:''' i think he was asking if he should export the default textures and then reimport them into myLevel mabie for speed issues, dont worry mr Q. it loads them from the other packages just as fast.

'''amitakartok:''' Is there a way to use textures from both games (e.g. UT and UT2004) at the same time? I tried to export and convert UT2004 skybox textures so that I can use them in UT. However, the color depth-conversion makes them look washed out.

'''amitakartok:''' I found an alternative way: I'm just using UT2k4 textures with some others. DM-Morpheus3 with a Half-Life 2 skybox (!!!) is simply astonishing. (I even tried to import the Citadel for some spectacular backdrop, but it is the full model's texture :( ) Cloudy dusk sky and cityview from several kilometres (I read it is satellite view of Manhattan)... just try it and you'll see what I mean :D I'm currently trying to create an AS map with the same theme, but it is very-very alpha right now.

'''JeffMOD:''' I can't seem to be able to import into UED using mylevel. Is there any program bundled with windows XP that can do this properly? ( I don't think I could afford photoshop if i could find it.) '''PLEASE''' Help me! :(
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32395</id>
      <timestamp>2008-07-19T20:13:18Z</timestamp>
      <contributor>
        <username>Amitakartok</username>
        <id>997</id>
      </contributor>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

==Texture requirements ==

The texture file you are trying to import must satisfy certain requirements. These are:

===UT2003 and newer===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 2048x2048.
* saved in .pcx, .bmp, targa, [[Legacy:DXT|DXT]] or [[Legacy:UPaint|UPaint]] [[Legacy:File Format|file format]]
* 8-bit indexed color (256 color indexed) for PCX; 24-bit or 32-bit BMP, TGA or DDS

===UT===
* A power-of-two number of pixels across (64x128, 256x256, ...) up to 1024x1024.
* Using 8-bit color (256 color indexed) .pcx or .bmp format.

==Importing==

In the [[Legacy:Texture Browser|Texture Browser]], do [[Legacy:Texture Browser Menu|Texture Browser Menu]] -&gt; File -&gt; Import. Find the directory containg your image file, then select it and click ''Open''. A window will appear asking for specifics on how to import the file:

[[Image:Legacy_interface.Ed3.textureimport.png|center|Import texture window]]

You'll need to supply the following details:

===Info===
; File : you can't edit this, it just tells you the file currently being processed. (I'm guessing this is useful when you import a batch of files)
; Package : the name of the [[Legacy:Package|package]] to import the texture into. If you give...
;* the name of an existing file, the texture will be added to that package. But [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]]!
;* the name &quot;MyLevel&quot;, the texture will be embedded in the current map. See [[Legacy:MyLevel|MyLevel]] for more on this.
;* something else, a new package will be created. You'll need to save it.
; Group : textures can be organized into groups within a package (eg &quot;Walls&quot;, &quot;Floors&quot;). This is just for convenience. Type the name of an existing group, or a new one.
; Name : just in case you want to change the name of the texture, you can do so with this option.
; LOD :

===Options===
;Masked : sets the texture to be masked (how?). see [[Legacy:Color Blending|Color Blending]].
;Alpha :
;Generate MipMaps : MipMaps are basically smaller versions of your textures. This is rendering method to not only increase FPS but to reduce pixel shimmering on the screen. If you have a large texture but it is only on a small area of the screen the texture can shimmer because the sampling of that texture isn't accurate enough to represent it on the pixels given to the texture. If you import large textures (1024 X 1024 and above) and don't generate mipmaps, you may see shimmering effects when you use the texture ingame. More info: [[Legacy:MipMap|MipMap]]
;Detail Hack? :

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* more on parts of the [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* more on [[Legacy:Texture Import And Export|Texture Import And Export]], including a '''troubleshooting''' checklist
* [[Legacy:Create A Material|Create A Material]]

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Tutorial]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; fill in the property details

==Discussion==

===UT===

'''Q.'''  What if you want to import a texture that came with the game?  ucc.exe can export the pcx files stored in the utx files, but should the original package name be used or MyLevel?  I've had to create mip maps for the texture to appear in the texture browser (for at least a few, possibly all, textures); however, some textures (eg at least one of skarrj.utx) won't save nor appear in the game, but (iirc) WILL appear in a t3d export...

Should ALL textures be imported into MyLevel embeding them into the map even if they appear in a default package (eg city.utx)?

As far as attribution is concerned, is there a texture comment field or something to mention that the bundled textures were used (or something to that effect)?

'''Tarquin:''' don't understand the question. Why import a texture already in a default package?

'''JTMILLER:''' i think he was asking if he should export the default textures and then reimport them into myLevel mabie for speed issues, dont worry mr Q. it loads them from the other packages just as fast.

'''amitakartok:''' Is there a way to use textures from both games (e.g. UT and UT2004) at the same time? I tried to export and convert UT2004 skybox textures so that I can use them in UT. However, the color depth-conversion makes them look washed out. On the other hand, if I open UT packages with UEd 2, it will crash (maybe I'm not supposed to do that?)

'''amitakartok:''' I found an alternative way: I'm just using UT2k4 textures with some others. DM-Morpheus3 with a Half-Life 2 skybox (!!!) is simply astonishing. (Incidentally, both games use textures in TGA format...) Dark sky with a glowing red vortex at the top (the vortex was two separate files, but I used them as a translucent, rotating static mesh placed like cloud layer)... just try it and you'll see what I mean :D I'm currently trying to create an AS map with the same theme, but it is very-very alpha right now.

'''JeffMOD:''' I can't seem to be able to import into UED using mylevel. Is there any program bundled with windows XP that can do this properly? ( I don't think I could afford photoshop if i could find it.) '''PLEASE''' Help me! :(

'''JeffMOD:''' uh, never mind. I just had it at the wrong size. to all '''other''' people without photoshop, paint can work fine. (If it's a screenshot, open Picture editor and resize it first. :))
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Importing Milkshape Characters To UT2004</title>
    <id>1521</id>
    <revision>
      <id>3805</id>
      <timestamp>2008-02-15T01:32:03Z</timestamp>
      <contributor>
        <ip>Rrcs-67-53-182-134.west.biz.rr.com</ip>
      </contributor>
      <comment>*Major Update, more in depth descriptions of how to prepare the model for export.</comment>
      <text xml:space="preserve">A [[:Category:Legacy Tutorial |tutorial]] on importing characters from [[Legacy:MilkShape|MilkShape]] to [[Legacy:UT2004|UT2004]].

It is presumed that you have a character mesh in Milkshape at this point and only need to know how to import it into UT2004.

Go to UnrealEd, using the textures window, you should import your model textures. Unlike UT(99), you can have more than 4 textures assigned to each model. They do not need to be named using the same method as UT(99). Name them whatever you like, but be sure that each texture has a unique name.

In Milkshape, make sure the Textures on the Materials Tab have identical names to the textures you wish to use in UnrealEd. By doing this now, it will automatically apply the named textures to the model upon import.

All vertices must be assigned to bones on a skeleton before you can import anything, otherwise nothing will export.

If you wish to utilize a currently existing UT2003/2004 Skeleton, you can find the .PSK files necessary on one of the CDs the game came on. The benefits to this are that you will not need to create new animations for the character.

If you wish to use a custom made skeleton, you must create all of the animations yourself and import each animation separately. This will be covered more in depth later. 

Assuming you intend to use a currently existing skeleton, exporting is a simple affair. Go to FileExportUnreal/UT PSK/PSA. Export your model as &lt;ModelName&gt;.psk. The PSK model format controls the relationship between vertices and bones, as well as data pertaining to the shape of the model, and texture placement. In layman’s terms, what the model looks like.

On the other hand, if you intend to use a custom made skeleton, you would also need to export .psa versions of the model, as well. The .psa format controls animations for the model’s .psk file. Seeing as we are working with Milkshape, the best way to handle this would be to rotate the model 90° to the left. The reason for this is as follows: In Milkshape, the front of the model is on the +Z Axis, while in UnrealEd, the front is +X. By rotating it in Milkshape, it takes away one potential spot for errors to occur. You can rotate your model in UnrealEd, however there have been times where animations will not play correctly when translating from one program to the other. This shouldn’t be an issue when using an existing skeleton.

You will need to create animations for every action. Each .psa file should contain one animation, so it makes sense to name your .psa files in reference to what animations are contained.

In UnrealEd, you will select the Animations window to import characters and their animations. If you are using an existing skeleton, you will only need to import the .psk file, and reference which animation set will be used. Be sure to match the correct animation set to your skeleton.

If you are using a custom skeleton, you will need to create a new skeletal subsystem upon import (you will be prompted to do so, name it something unique and make it in its own file). You will import each animation and append each new one to the existing animations, not overwrite existing ones. You can name every animation through the menu on the right side of the window. Once it is all in place, save your information in UnrealEd. 

From this point on, it is now up to setting the model up as a character, which is explained elsewhere in the wiki. 

==How?!==

The solution is simple, so here it is in a nutshell:

In Milkshape, after making the [[Legacy:Mesh|mesh]] for your [[Legacy:Topics_On_Modeling | model]], and before [[Legacy:Animation | animating]] it for use in UnrealEd, you must first rotate your model 90 degrees to it's left

(-90 on the Y axis). Now that it's facing the right side of your screen, you can now animate each individual sequence, and save and export them as .psa files, while your mesh is to be saved as a .psk file. After this, it should become easier to transfer the info to UT2004. 

'''If you rotate your model in [[Legacy:UnrealEd|UnrealEd]] instead of Milkshape, that's where you open the door for problems.''' 

{{innerbox|Test my solution. If it works, spread the word, and eventually someone with more time and patience will make a comprehensive tutorial on here. Have fun. : )

~SpectreRose

}}

==Related Topics ==

* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

==Discussion ==

This is just a dump of the information provided by SpectreRose into a new tutorial page to get the information out here from the wiki page he posted it on. It still needs some help. Formatting, Links, Illistrations maybe. If this tutorial helps you, please help it. thx.

----

[[:Category:Legacy Tutorial]] | [[:Category:Legacy Modeling]] | [[:Category:Legacy To Do]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3806</id>
      <timestamp>2007-07-06T05:47:11Z</timestamp>
      <contributor>
        <ip>Adsl-69-209-116-106.dsl.klmzmi.ameritech.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A [[:Category:Legacy Tutorial |tutorial]] on importing characters from [[Legacy:MilkShape|MilkShape]] to [[Legacy:UT2004|UT2004]].

==No! Really?!==

Yeah, it's true. It works as I want it to now. I noticed that this site is kinda lacking on info about how to do this.

==How?!==

The solution is simple, so here it is in a nutshell:

In Milkshape, after making the [[Legacy:Mesh|mesh]] for your [[Legacy:Topics_On_Modeling | model]], and before [[Legacy:Animation | animating]] it for use in UnrealEd, you must first rotate your model 90 degrees to it's left

(-90 on the Y axis). Now that it's facing the right side of your screen, you can now animate each individual sequence, and save and export them as .psa files, while your mesh is to be saved as a .psk file. After this, it should become easier to transfer the info to UT2004. 

'''If you rotate your model in [[Legacy:UnrealEd|UnrealEd]] instead of Milkshape, that's where you open the door for problems.''' 

{{innerbox|Test my solution. If it works, spread the word, and eventually someone with more time and patience will make a comprehensive tutorial on here. Have fun. : )

~SpectreRose

}}

==Related Topics ==

* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

==Discussion ==

This is just a dump of the information provided by SpectreRose into a new tutorial page to get the information out here from the wiki page he posted it on. It still needs some help. Formatting, Links, Illistrations maybe. If this tutorial helps you, please help it. thx.

----

[[:Category:Legacy Tutorial]] | [[:Category:Legacy Modeling]] | [[:Category:Legacy To Do]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34039</id>
      <timestamp>2009-02-18T03:43:06Z</timestamp>
      <contributor>
        <ip>65.29.40.84</ip>
      </contributor>
      <comment>Corrected spelling and grammar.</comment>
      <text xml:space="preserve">A [[:Category:Legacy Tutorial |tutorial]] on importing characters from [[Legacy:MilkShape|MilkShape]] to [[Legacy:UT2004|UT2004]].

It is presumed that you have a character mesh in Milkshape at this point and you only need to know how to import it into UT2004.

Go to UnrealEd. Using the textures window, you should import your model textures. Unlike UT(99), you can have more than 4 textures assigned to each model. They do not need to be named using the same method as UT(99). Name them whatever you like, but be sure that each texture has a unique name.

In Milkshape, make sure the textures on the Materials Tab have identical names to the textures you wish to use in UnrealEd. By doing this now, it will automatically apply the named textures to the model upon import.

All vertices must be assigned to bones on a skeleton before you can import anything, otherwise nothing will export.

If you wish to utilize a currently existing UT2003/2004 Skeleton, you can find the .PSK files necessary on one of the CDs the game came on. The benefits to this are that you will not need to create new animations for the character.

If you wish to use a custom made skeleton, you must create all of the animations yourself and import each animation separately. This will be covered more in depth later. 

Assuming you intend to use a currently existing skeleton, exporting is a simple affair. Go to FileExportUnreal/UT PSK/PSA. Export your model as &lt;ModelName&gt;.psk. The PSK model format controls the relationship between vertices and bones, as well as data pertaining to the shape of the model, and texture placement. In layman’s terms, what the model looks like.

On the other hand, if you intend to use a custom made skeleton, you would also need to export .psa versions of the model as well. The .psa format controls animations for the model’s .psk file. Seeing as we are working with Milkshape, the best way to handle this would be to rotate the model 90° to the left. The reason for this is as follows: In Milkshape, the front of the model is on the +Z Axis, while in UnrealEd, the front is +X. By rotating it in Milkshape, it takes away one potential spot for errors to occur. You can rotate your model in UnrealEd, however there have been times where animations will not play correctly when translating from one program to the other. This shouldn’t be an issue when using an existing skeleton.

You will need to create animations for every action. Each .psa file should contain one animation, so it makes sense to name your .psa files in reference to what animations are contained.

In UnrealEd, you will select the Animations window to import characters and their animations. If you are using an existing skeleton, you will only need to import the .psk file, and reference which animation set will be used. Be sure to match the correct animation set to your skeleton.

If you are using a custom skeleton, you will need to create a new skeletal subsystem upon import (you will be prompted to do so, name it something unique and make it in its own file). You will import each animation and append each new one to the existing animations, not overwrite existing ones. You can name every animation through the menu on the right side of the window. Once it is all in place, save your information in UnrealEd. 

From this point on, it is now up to setting the model up as a character, which is explained elsewhere in the wiki. 

==How?!==

The solution is simple, so here it is in a nutshell:

In Milkshape, after making the [[Legacy:Mesh|mesh]] for your [[Legacy:Topics_On_Modeling | model]], and before [[Legacy:Animation | animating]] it for use in UnrealEd, you must first rotate your model 90 degrees to its left

(-90 on the Y axis). Now that it's facing the right side of your screen, you can now animate each individual sequence, and save and export them as .psa files, while your mesh is to be saved as a .psk file. After this, it should become easier to transfer the info to UT2004. 

'''If you rotate your model in [[Legacy:UnrealEd|UnrealEd]] instead of Milkshape, that's where you open the door for problems.''' 

{{innerbox|Test my solution. If it works, spread the word, and eventually someone with more time and patience will make a comprehensive tutorial on here. Have fun. : )

~SpectreRose

}}

==Related Topics ==

* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

==Discussion ==

This is just a dump of the information provided by SpectreRose into a new tutorial page to get the information out here from the wiki page he posted it on. It still needs some help. Formatting, Links, Illistrations maybe. If this tutorial helps you, please help it. thx.

----

[[:Category:Legacy Tutorial]] | [[:Category:Legacy Modeling]] | [[:Category:Legacy To Do]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Importing Models From Maya</title>
    <id>1524</id>
    <revision>
      <id>3809</id>
      <timestamp>2007-04-04T16:57:24Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Prerequisites==
* You should have [[Legacy:Maya|Maya]] PLE installed.  It can be found on the UT200x install disc.
* You should have the [[Legacy:UnEditor.Mll|UnEditor.mll]] Maya plugin installed and enabled as a Maya plugin.
* You should be familiar enough with Maya to have a polygonal model built and ready to import into [[Legacy:UnrealEd|UnrealEd]].
* You should be familiar enough with Maya to apply shaders, project texture alignment and manipulate polygon normals, edges and vertices.
* It may help to be familiar with other Maya tools related to modeling, including component selection tools, the various Polygon modeling tools, the Outliner, Multilister and UV Mapping tools.

==Tutorial==

This tutorial will demonstrate importing a polygonal model into Ued as a [[Legacy:Static Mesh|static mesh]] from Maya PLE.  This is not a polygonal modeling in Maya tutorial.  However, it does outline the important aspects of a Maya model ready for export to Ued.

===Your Model===
#Should be &quot;facing positive X&quot;.  Meaning, in Maya, the model's front side should be toward the positive end of the X-axis.  This will ensure a proper orientation in Ued.
#Should be near the origin.  Meaning, in Maya, the model's center should be on or near Maya's world origin, where all axis converge at zero.
#Should have its Center pivot placed in a reasonable place.  For example, a wheel would likely need the center pivot in the middle, while an hammer may need the center to be along the handle somewhere.  It depends on if this is meant to be used as a mover, how it should move, or how it should be normally placed as a static mesh object in UnrealEd.
#Should be one single object, not multiple objects placed together (unless you want them to be separate in UnrealEd). Use Polygon -&gt; Combine. Merge any extraneous faces, edges and vertices.
#Should have the normals facing the correct direction. Use Display -&gt; PolygonComponents -&gt; Normals to see which direction your polygonal faces are &quot;facing&quot;.
#Should have different materials (shaders) applied to the polygonal faces that are meant to have different materials textures applied in UnrealEd.  For example, you are making a car.  You chassis has a texture all its own, but you want to use a simple glass material for the windshield. In this case, in Maya, you'd apply one color (material, shader) to the chassis and another color for the windshield. It doesn't matter what color, it's just an indicator to UnrealEd that these are separate materials that you'll apply in UnrealEd.
#Should have its polygon texture alignment ready to go.  Use the tools found in EditPolygons -&gt; Texture -&gt; ... to apply various projection schemes (like cylindrical, planar or automatic) and adjust the scale and orientation of those projections, if applicable.

===Exporting from Maya to Ued===
#Select your model object. &lt;br /&gt;[[Image:Legacy_MayaImportTut0.jpeg|]]
#If your UnEditor.mll Maya plugin is installed and enabled, you should have a button tab available called, &quot;UnrealEdExport&quot;.  Click on that and click on the &quot;Static Mesh Export Window&quot; button.  If not already open, this will automatically launch Ued and put it in the background. &lt;br /&gt;[[Image:Legacy_MayaImportTut1.jpeg|]]
#The Static Mesh UT2Kx Export Window will pop up.  There are spaces to enter a package name, group name and model name.  If you've selected your model, the model name will default to the name as it appears in Maya. &lt;br /&gt;[[Image:Legacy_MayaImportTut2.jpeg|]]
#Select a Unreal package to export to, if you've already created one (and skip the next step).  If you haven't, select &quot;Create New Package&quot;.&lt;br /&gt;[[Image:Legacy_MayaImportTut3.jpeg|]]
#A small window will pop up to give you a chance to name the new package.  For example, to import your model as an embedded resource, enter &quot;myLevel&quot;. (please read the warnings about using the [[Legacy:MyLevel|myLevel]] package.) &lt;br /&gt;[[Image:Legacy_MayaImportTut4.jpeg|]]
#Enter a group name.  This is optional. &lt;br /&gt;[[Image:Legacy_MayaImportTut5.jpeg|]]
#Enter a static mesh name, unless you want to keep it the same name. &lt;br /&gt;[[Image:Legacy_MayaImportTut6.jpeg|]]
#You can choose to import the model based on the Relative position in Maya space, or based rigidly on the World space.  This refers to the position of the object's center in Maya and its location in Maya space with relation to the origin.
#Hit the Export button.
#You should see a confirmation that, &quot;Result: Export complete.&quot;

===In UnrealEd===
#Open the [[Legacy:Static Mesh Browser|Static Mesh Browser]].
#Find your package. Select myLevel if you chose to embed the resource. 
#You should see your static mesh model, now imported. 
#Assign the materials you'd like to use.  You'll find there will be one [[Legacy:Material|Material]] slot available for every material shader you assigned to the polygons of this model in Maya.  In our car example, there would be two material slots: one for the chassis and one for the windshield.  In this case, you'd simply assign your chassis texture to one slot and a simple glass material to the other.
#Don't forget to save either your [[Legacy:Package|package]] file or your map, if the static mesh you imported is embedded in MyLevel.

===Wrap up===

That's it.  From here you'll no doubt see things you'll want to change or alter.  Perhaps you found a polygon facing the wrong way and you need to reverse that normal, perhaps you'd like to assign more shaders to different polygons to make more material slots, perhaps you need to adjust the texture projections.

==Tips==
* Sometimes it's a good idea to delete the modeling History ''(using the Delete by Type selection under the Edit menu)'' on your object after the model is built, but before you begin to apply texture projections and shader assignments.  This is not necessary, but it helps to keep things cleaner and easy to find the aspects of your model that will need tweaking after the initial import.

==External Links==
* [http://www.tutorialized.com/tutorials/Maya/1 Alias/Wavefront Maya tutorials]
* [http://www.highend3d.com/maya/tutorials/ higend3d.com Maya tutorials]
* [http://www.learning-maya.com/index.php learning-maya.com Maya tutorials]
* [http://www.amazing3d.com/services/tutmaya.html amazing3d.com Maya tutorials]
* [http://www.tutorialfind.com/tutorials/3dsoftware/maya/ tutorialfind.com Maya tutorials]

==Related Topics==
* [[Legacy:UnEditor.Mll|UnEditor.mll]]
* [[Legacy:Maya|Maya]]
* [[Legacy:Introduction To Maya|Introduction to Maya]]
* [[Legacy:Maya FAQ|Maya FAQ]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Discussion==

'''SuperApe:''' Finished.  What do you think?

'''SuperApe:''' Please don't try to link to Maya tools or properties described in this tutorial.  Some terminology conflicts with Unreal terminology.  That will only serve to confuse the Ued mapper.

'''Tarquin:''' Good point, I wasn't sure about linking Pivot. But surely [[Legacy:MyLevel|MyLevel]] is the same everywhere? I linked the tools to suggest we might want to make pages for these.

'''SuperApe:''' Yes, [[Legacy:MyLevel|myLevel]] is strictly an Unreal convention, but in this case, it would be easily confused with a simple name selection (along with myModel &amp; myGroup), not the virutal package that it is.  That's why I explicitly note to see that page and read the warnings involved in its usage.  The Maya tools, windows, etc. really don't belong on this Unreal Wiki site, IMHO.  I have a lot of experience with Maya, so I can tell you with certanty, if you began to fill this wiki with Maya info, it would eventually overtake the amount of Unreal info.  Maya is an incredibly deep animation app and a simple link to other well-established Maya sites should suffice.  There are many sites out there to help those new to Maya and they've been doing it for years.  I think they'd do a much better job than anything made here, frankly.

'''Tgusagalpa:''' No offense, but 3DBuzz never explained how to get a .psk, so, could someone tell me how to get one, because I have a mesh in MayaPLE that is seriously wanting to b a .psk!

'''SuperApe:''' To get .psk (and .psa for animated meshes), you'll need to use [[Legacy:ActorX|ActorX]] instead.  Note, there is no ActorX plug-in for MayaPLE versions, only for retail versions of Maya.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3810</id>
      <timestamp>2006-05-20T18:57:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Prerequisites==
* You should have [[Legacy:Maya|Maya]] PLE installed.  It can be found on the UT200x install disc.
* You should have the [[Legacy:UnEditor.Mll|UnEditor.mll]] Maya plugin installed and enabled as a Maya plugin.
* You should be familiar enough with Maya to have a polygonal model built and ready to import into [[Legacy:UnrealEd|UnrealEd]].
* You should be familiar enough with Maya to apply shaders, project texture alignment and manipulate polygon normals, edges and vertices.
* It may help to be familiar with other Maya tools related to modeling, including component selection tools, the various Polygon modeling tools, the Outliner, Multilister and UV Mapping tools.

==Tutorial==

This tutorial will demonstrate importing a polygonal model into Ued as a [[Legacy:Static Mesh|static mesh]] from Maya PLE.  This is not a polygonal modeling in Maya tutorial.  However, it does outline the important aspects of a Maya model ready for export to Ued.

===Your Model===
#Should be &quot;facing positive X&quot;.  Meaning, in Maya, the model's front side should be toward the positive end of the X-axis.  This will ensure a proper orientation in Ued.
#Should be near the origin.  Meaning, in Maya, the model's center should be on or near Maya's world origin, where all axis converge at zero.
#Should have its Center pivot placed in a reasonable place.  For example, a wheel would likely need the center pivot in the middle, while an hammer may need the center to be along the handle somewhere.  It depends on if this is meant to be used as a mover, how it should move, or how it should be normally placed as a static mesh object in UnrealEd.
#Should be one single object, not multiple objects placed together (unless you want them to be separate in UnrealEd). Use Polygon -&gt; Combine. Merge any extraneous faces, edges and vertices.
#Should have the normals facing the correct direction. Use Display -&gt; PolygonComponents -&gt; Normals to see which direction your polygonal faces are &quot;facing&quot;.
#Should have different materials (shaders) applied to the polygonal faces that are meant to have different materials textures applied in UnrealEd.  For example, you are making a car.  You chassis has a texture all its own, but you want to use a simple glass material for the windshield. In this case, in Maya, you'd apply one color (material, shader) to the chassis and another color for the windshield. It doesn't matter what color, it's just an indicator to UnrealEd that these are separate materials that you'll apply in UnrealEd.
#Should have its polygon texture alignment ready to go.  Use the tools found in EditPolygons -&gt; Texture -&gt; ... to apply various projection schemes (like cylindrical, planar or automatic) and adjust the scale and orientation of those projections, if applicable.

===Exporting from Maya to Ued===
#Select your model object. &lt;br /&gt;[[Image:Legacy_MayaImportTut0.jpeg|]]
#If your UnEditor.mll Maya plugin is installed and enabled, you should have a button tab available called, &quot;UnrealEdExport&quot;.  Click on that and click on the &quot;Static Mesh Export Window&quot; button.  If not already open, this will automatically launch Ued and put it in the background. &lt;br /&gt;[[Image:Legacy_MayaImportTut1.jpeg|]]
#The Static Mesh UT2Kx Export Window will pop up.  There are spaces to enter a package name, group name and model name.  If you've selected your model, the model name will default to the name as it appears in Maya. &lt;br /&gt;[[Image:Legacy_MayaImportTut2.jpeg|]]
#Select a Unreal package to export to, if you've already created one (and skip the next step).  If you haven't, select &quot;Create New Package&quot;.&lt;br /&gt;[[Image:Legacy_MayaImportTut3.jpeg|]]
#A small window will pop up to give you a chance to name the new package.  For example, to import your model as an embedded resource, select enter &quot;myLevel&quot;. (please read the warnings about using the [[Legacy:MyLevel|myLevel]] package.) &lt;br /&gt;[[Image:Legacy_MayaImportTut4.jpeg|]]
#Enter a group name.  This is optional. &lt;br /&gt;[[Image:Legacy_MayaImportTut5.jpeg|]]
#Enter a static mesh name, unless you want to keep it the same name. &lt;br /&gt;[[Image:Legacy_MayaImportTut6.jpeg|]]
#You can choose to import the model based on the Relative position in Maya space, or based rigidly on the World space.  This refers to the position of the object's center in Maya and its location in Maya space with relation to the origin.
#Hit the Export button.
#You should see a confirmation that, &quot;Result: Export complete.&quot;

===In UnrealEd===
#Open the [[Legacy:Static Mesh Browser|Static Mesh Browser]].
#Find your package. Select myLevel if you chose to embed the resource. 
#You should see your static mesh model, now imported. 
#Assign the materials you'd like to use.  You'll find there will be one [[Legacy:Material|Material]] slot available for every material shader you assigned to the polygons of this model in Maya.  In our car example, there would be two material slots: one for the chassis and one for the windshield.  In this case, you'd simply assign your chassis texture to one slot and a simple glass material to the other.
#Don't forget to save either your [[Legacy:Package|package]] file or your map, if the static mesh you imported is embedded in MyLevel.

===Wrap up===

That's it.  From here you'll no doubt see things you'll want to change or alter.  Perhaps you found a polygon facing the wrong way and you need to reverse that normal, perhaps you'd like to assign more shaders to different polygons to make more material slots, perhaps you need to adjust the texture projections.

==Tips==
* Sometimes it's a good idea to delete the modeling History ''(using the Delete by Type selection under the Edit menu)'' on your object after the model is built, but before you begin to apply texture projections and shader assignments.  This is not necessary, but it helps to keep things cleaner and easy to find the aspects of your model that will need tweaking after the initial import.

==Related Topics==
* [[Legacy:UnEditor.Mll|UnEditor.mll]]
* [[Legacy:Maya|Maya]]
* [[Legacy:Introduction To Maya|Introduction to Maya]]
* [[Legacy:Maya FAQ|Maya FAQ]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Discussion==

'''SuperApe:''' Finished.  What do you think?

'''SuperApe:''' Please don't try to link to Maya tools or properties described in this tutorial.  Some terminology conflicts with Unreal terminology.  That will only serve to confuse the Ued mapper.

'''Tarquin:''' Good point, I wasn't sure about linking Pivot. But surely [[Legacy:MyLevel|MyLevel]] is the same everywhere? I linked the tools to suggest we might want to make pages for these.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3811</id>
      <timestamp>2006-06-03T01:43:22Z</timestamp>
      <contributor>
        <ip>24-196-12-83.dhcp.leds.al.charter.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Prerequisites==
* You should have [[Legacy:Maya|Maya]] PLE installed.  It can be found on the UT200x install disc.
* You should have the [[Legacy:UnEditor.Mll|UnEditor.mll]] Maya plugin installed and enabled as a Maya plugin.
* You should be familiar enough with Maya to have a polygonal model built and ready to import into [[Legacy:UnrealEd|UnrealEd]].
* You should be familiar enough with Maya to apply shaders, project texture alignment and manipulate polygon normals, edges and vertices.
* It may help to be familiar with other Maya tools related to modeling, including component selection tools, the various Polygon modeling tools, the Outliner, Multilister and UV Mapping tools.

==Tutorial==

This tutorial will demonstrate importing a polygonal model into Ued as a [[Legacy:Static Mesh|static mesh]] from Maya PLE.  This is not a polygonal modeling in Maya tutorial.  However, it does outline the important aspects of a Maya model ready for export to Ued.

===Your Model===
#Should be &quot;facing positive X&quot;.  Meaning, in Maya, the model's front side should be toward the positive end of the X-axis.  This will ensure a proper orientation in Ued.
#Should be near the origin.  Meaning, in Maya, the model's center should be on or near Maya's world origin, where all axis converge at zero.
#Should have its Center pivot placed in a reasonable place.  For example, a wheel would likely need the center pivot in the middle, while an hammer may need the center to be along the handle somewhere.  It depends on if this is meant to be used as a mover, how it should move, or how it should be normally placed as a static mesh object in UnrealEd.
#Should be one single object, not multiple objects placed together (unless you want them to be separate in UnrealEd). Use Polygon -&gt; Combine. Merge any extraneous faces, edges and vertices.
#Should have the normals facing the correct direction. Use Display -&gt; PolygonComponents -&gt; Normals to see which direction your polygonal faces are &quot;facing&quot;.
#Should have different materials (shaders) applied to the polygonal faces that are meant to have different materials textures applied in UnrealEd.  For example, you are making a car.  You chassis has a texture all its own, but you want to use a simple glass material for the windshield. In this case, in Maya, you'd apply one color (material, shader) to the chassis and another color for the windshield. It doesn't matter what color, it's just an indicator to UnrealEd that these are separate materials that you'll apply in UnrealEd.
#Should have its polygon texture alignment ready to go.  Use the tools found in EditPolygons -&gt; Texture -&gt; ... to apply various projection schemes (like cylindrical, planar or automatic) and adjust the scale and orientation of those projections, if applicable.

===Exporting from Maya to Ued===
#Select your model object. &lt;br /&gt;[[Image:Legacy_MayaImportTut0.jpeg|]]
#If your UnEditor.mll Maya plugin is installed and enabled, you should have a button tab available called, &quot;UnrealEdExport&quot;.  Click on that and click on the &quot;Static Mesh Export Window&quot; button.  If not already open, this will automatically launch Ued and put it in the background. &lt;br /&gt;[[Image:Legacy_MayaImportTut1.jpeg|]]
#The Static Mesh UT2Kx Export Window will pop up.  There are spaces to enter a package name, group name and model name.  If you've selected your model, the model name will default to the name as it appears in Maya. &lt;br /&gt;[[Image:Legacy_MayaImportTut2.jpeg|]]
#Select a Unreal package to export to, if you've already created one (and skip the next step).  If you haven't, select &quot;Create New Package&quot;.&lt;br /&gt;[[Image:Legacy_MayaImportTut3.jpeg|]]
#A small window will pop up to give you a chance to name the new package.  For example, to import your model as an embedded resource, enter &quot;myLevel&quot;. (please read the warnings about using the [[Legacy:MyLevel|myLevel]] package.) &lt;br /&gt;[[Image:Legacy_MayaImportTut4.jpeg|]]
#Enter a group name.  This is optional. &lt;br /&gt;[[Image:Legacy_MayaImportTut5.jpeg|]]
#Enter a static mesh name, unless you want to keep it the same name. &lt;br /&gt;[[Image:Legacy_MayaImportTut6.jpeg|]]
#You can choose to import the model based on the Relative position in Maya space, or based rigidly on the World space.  This refers to the position of the object's center in Maya and its location in Maya space with relation to the origin.
#Hit the Export button.
#You should see a confirmation that, &quot;Result: Export complete.&quot;

===In UnrealEd===
#Open the [[Legacy:Static Mesh Browser|Static Mesh Browser]].
#Find your package. Select myLevel if you chose to embed the resource. 
#You should see your static mesh model, now imported. 
#Assign the materials you'd like to use.  You'll find there will be one [[Legacy:Material|Material]] slot available for every material shader you assigned to the polygons of this model in Maya.  In our car example, there would be two material slots: one for the chassis and one for the windshield.  In this case, you'd simply assign your chassis texture to one slot and a simple glass material to the other.
#Don't forget to save either your [[Legacy:Package|package]] file or your map, if the static mesh you imported is embedded in MyLevel.

===Wrap up===

That's it.  From here you'll no doubt see things you'll want to change or alter.  Perhaps you found a polygon facing the wrong way and you need to reverse that normal, perhaps you'd like to assign more shaders to different polygons to make more material slots, perhaps you need to adjust the texture projections.

==Tips==
* Sometimes it's a good idea to delete the modeling History ''(using the Delete by Type selection under the Edit menu)'' on your object after the model is built, but before you begin to apply texture projections and shader assignments.  This is not necessary, but it helps to keep things cleaner and easy to find the aspects of your model that will need tweaking after the initial import.

==External Links==
* [http://www.tutorialized.com/tutorials/Maya/1 Alias/Wavefront Maya tutorials]
* [http://www.highend3d.com/maya/tutorials/ higend3d.com Maya tutorials]
* [http://www.learning-maya.com/index.php learning-maya.com Maya tutorials]
* [http://www.amazing3d.com/services/tutmaya.html amazing3d.com Maya tutorials]
* [http://www.tutorialfind.com/tutorials/3dsoftware/maya/ tutorialfind.com Maya tutorials]

==Related Topics==
* [[Legacy:UnEditor.Mll|UnEditor.mll]]
* [[Legacy:Maya|Maya]]
* [[Legacy:Introduction To Maya|Introduction to Maya]]
* [[Legacy:Maya FAQ|Maya FAQ]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]

==Discussion==

'''SuperApe:''' Finished.  What do you think?

'''SuperApe:''' Please don't try to link to Maya tools or properties described in this tutorial.  Some terminology conflicts with Unreal terminology.  That will only serve to confuse the Ued mapper.

'''Tarquin:''' Good point, I wasn't sure about linking Pivot. But surely [[Legacy:MyLevel|MyLevel]] is the same everywhere? I linked the tools to suggest we might want to make pages for these.

'''SuperApe:''' Yes, [[Legacy:MyLevel|myLevel]] is strictly an Unreal convention, but in this case, it would be easily confused with a simple name selection (along with myModel &amp; myGroup), not the virutal package that it is.  That's why I explicitly note to see that page and read the warnings involved in its usage.  The Maya tools, windows, etc. really don't belong on this Unreal Wiki site, IMHO.  I have a lot of experience with Maya, so I can tell you with certanty, if you began to fill this wiki with Maya info, it would eventually overtake the amount of Unreal info.  Maya is an incredibly deep animation app and a simple link to other well-established Maya sites should suffice.  There are many sites out there to help those new to Maya and they've been doing it for years.  I think they'd do a much better job than anything made here, frankly.

'''Tgusagalpa:''' No offense, but 3DBuzz never explained how to get a .psk, so, could someone tell me how to get one, because I have a mesh in MayaPLE that is seriously wanting to b a .psk!

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Importing Music</title>
    <id>1516</id>
    <revision>
      <id>3794</id>
      <timestamp>2006-07-25T12:43:17Z</timestamp>
      <contributor>
        <ip>The Alien</ip>
      </contributor>
      <comment>fixed link to tute. This page is pretty ancient and needs work :p</comment>
      <text xml:space="preserve">==Importing Music ==

This page will outline the procedure for getting music from various file formats on your hard drive into the [[Legacy:Music Browser|Music Browser]] in the editor, from where it can be used in your map.

===Differences between File Formats ===

First of all, you have to know which music format you've used so you can use the proper process to import it into your map. 

Before I start with the more complex stuff, I can tell you that ''CD audio'' files don't need to be imported into any Unreal package - they're read directly from the CD and played back while the game is playing.

To import ''music modules'', you need to make sure the MOD meets to the audio quality demands that I posted above. After this, it's easy: you need to open up the music browser in UEd, go to File &gt; Import... and select the MOD and hit open. After this, a popup appears, asking you for the package you want to import the MOD to. It's usually best to keep everything as it is and click OK to import the MOD. After this, don't forget to ''Save'' the imported music package. In the music browser, go to File &gt; Save as... and choose OK. This will create a umx package containing your custom MOD in the music folder. All music files are to be stored in the Music folder. See [[Legacy:Engine Directory Structure|Engine Directory Structure]] for more info.

The same rules are to be used when importing ''direct music'' files, like MID files.

If you want to import ''real audio'' files, like WAV, MP3 or AIFF, there's a problem: Unreal Engine games don't support this kind of format (except for Wheel of Time and the newer Unreal Engine games). I'll explain a little later how you can import music for games that use the newer Unreal Engine, like Unreal 2 &amp; UT2003. First how to import real audio files for older Unreal games, like Unreal, UT &amp; Deus Ex.

I've seen a lot of people asking for a way to import real audio files into a umx. And I've also noticed that a lot of them have imported the audio file as wav into MPT (ModPlug Tracker), but upon playback in the game, the track looped back after the first 30 seconds or so which was too soon, seeing their audio files were a lot longer. So after a bit experimentation, I (''The Alien'') have found a way to solve this problem, though I doubt that I'm the first one to find this out. Anyway, I've written a tute on it, which you can find [http://home.tiscali.nl/ariadohq/ta/tutes/wavtoumx.html here]. The trick to making the music play all the way to the end and &lt;i&gt;then&lt;/i&gt; loop back to the beginning is also included.

As I said before, the newer generation of the Unreal Engine supports real audio, but only when used in the ''Ogg Vorbis'' format. The pros about this format are that companies don't need to pay money to aquire an MP3 license and the high compression rate (almost as high or higher than that of MP3). It has been confirmed that the Unreal Engine galaxy sound system isn't used anymore. Furthermore, word is that the new sound system doesn't support music modules at all, but this isn't 100% certain. So it could even be possible that we won't even see the umx packages in UT2003 and U2...

Anyway, there are not many ogg converters available just yet. The only one I know of is the plugin for winamp, which you can get [http://www.winamp.com/plugins/detail.jhtml?componentId=67120 here]. You can use this to convert other real audio to ogg files and use them in your maps. As time passes, the ogg vorbis format will become more and more popular, so expect to see ogg converters for other audio players to become available. You can go to www.vorbis.com to find links and direct downloads of Ogg Vorbis software, as well as all the information you could possibly want on this type of music format.

==Related Topics ==
* [[Legacy:Music|Music]]
* [[Legacy:Assigning Music To Maps|Assigning Music To Maps]]

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy Tutorial]]

I hate to say it, but his link to his tute on making the song repeat in maps is missing. I'm trying to do this, but am having a hard time finding anything on this topic.

So I went looking, and I just found some good tutorials

first off to get set up:

http://www.planetdeusex.com/heliowalton/Tutorial-Mp3-to-Umx.htm

Be sure to get modplug player and tracker, or tracker won't play your stuff. Oh, and just get the song to .it format, don't put it in a map yet.

Now to get your music to loop in a map:

http://www.bulldozer.utjag.co.uk/WaveToUMX.htm but had to do it differently. Where it says 

# Now, just like you would select any text in a textarea, select all 3 chars from the Patern Speed and use &quot;CTRL C&quot; to copy it to clipboard.

# From the Patern Numbers, now select the next patern, being the Patern 1.

# Select again that same area, that this time is empty, be carefull to select the entire &quot;Effect&quot; area, and Use &quot;CTRL V&quot; to paste the chars you've copied earlier from patern 0. 

That didn't work for me. The song would only play once...

So I copied the entire section for both channels, instead of just the pattern speed, then went to pattern 1, and pasted it across both channels, so that they look identical to the first line in pattern 0. The song loops indefinitely now.

Before you do all that, though, in modplug tracker, you can take a wav file and enhance it a lot with tracker, go to general tab, and in effects, check bass expansion, surround, agc, and in resample put it to high quality. Now go to the bottom, and under effect plugins, click on select plugin... and under DirectX Media Audio Effets, check on ParamEq, click okay, then under Channels one and two (or more?) in the effect: box, change to FX1: ParamEq, and under effects plugin, over to the right, chose Dry mix. Then set it to loop by following the directions above...

{BL}Ticklemonster
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3795</id>
      <timestamp>2006-07-22T14:36:09Z</timestamp>
      <contributor>
        <ip>C-69-136-48-134.hsd1.ga.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Importing Music ==

This page will outline the procedure for getting music from various file formats on your hard drive into the [[Legacy:Music Browser|Music Browser]] in the editor, from where it can be used in your map.

===Differences between File Formats ===

First of all, you have to know which music format you've used so you can use the proper process to import it into your map. 

Before I start with the more complex stuff, I can tell you that ''CD audio'' files don't need to be imported into any Unreal package - they're read directly from the CD and played back while the game is playing.

To import ''music modules'', you need to make sure the MOD meets to the audio quality demands that I posted above. After this, it's easy: you need to open up the music browser in UEd, go to File &gt; Import... and select the MOD and hit open. After this, a popup appears, asking you for the package you want to import the MOD to. It's usually best to keep everything as it is and click OK to import the MOD. After this, don't forget to ''Save'' the imported music package. In the music browser, go to File &gt; Save as... and choose OK. This will create a umx package containing your custom MOD in the music folder. All music files are to be stored in the Music folder. See [[Legacy:Engine Directory Structure|Engine Directory Structure]] for more info.

The same rules are to be used when importing ''direct music'' files, like MID files.

If you want to import ''real audio'' files, like WAV, MP3 or AIFF, there's a problem: Unreal Engine games don't support this kind of format (except for Wheel of Time and the newer Unreal Engine games). I'll explain a little later how you can import music for games that use the newer Unreal Engine, like Unreal 2 &amp; UT2003. First how to import real audio files for older Unreal games, like Unreal, UT &amp; Deus Ex.

I've seen a lot of people asking for a way to import real audio files into a umx. And I've also noticed that a lot of them have imported the audio file as wav into MPT (ModPlug Tracker), but upon playback in the game, the track looped back after the first 30 seconds or so which was too soon, seeing their audio files were a lot longer. So after a bit experimentation, I (''The Alien'') have found a way to solve this problem, though I doubt that I'm the first one to find this out. Anyway, I've written a tute on it, which you can find [http://home.wanadoo.nl/ariadohq/tutes/wavtoumx.html here]. The trick to making the music play all the way to the end and &lt;i&gt;then&lt;/i&gt; loop back to the beginning is also included.

As I said before, the newer generation of the Unreal Engine supports real audio, but only when used in the ''Ogg Vorbis'' format. The pros about this format are that companies don't need to pay money to aquire an MP3 license and the high compression rate (almost as high or higher than that of MP3). It has been confirmed that the Unreal Engine galaxy sound system isn't used anymore. Furthermore, word is that the new sound system doesn't support music modules at all, but this isn't 100% certain. So it could even be possible that we won't even see the umx packages in UT2003 and U2...

Anyway, there are not many ogg converters available just yet. The only one I know of is the plugin for winamp, which you can get [http://www.winamp.com/plugins/detail.jhtml?componentId=67120 here]. You can use this to convert other real audio to ogg files and use them in your maps. As time passes, the ogg vorbis format will become more and more popular, so expect to see ogg converters for other audio players to become available. You can go to www.vorbis.com to find links and direct downloads of Ogg Vorbis software, as well as all the information you could possibly want on this type of music format.

==Related Topics ==
* [[Legacy:Music|Music]]
* [[Legacy:Assigning Music To Maps|Assigning Music To Maps]]

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy Tutorial]]

I hate to say it, but his link to his tute on making the song repeat in maps is missing. I'm trying to do this, but am having a hard time finding anything on this topic.

So I went looking, and I just found some good tutorials

first off to get set up:

http://www.planetdeusex.com/heliowalton/Tutorial-Mp3-to-Umx.htm

Be sure to get modplug player and tracker, or tracker won't play your stuff. Oh, and just get the song to .it format, don't put it in a map yet.

Now to get your music to loop in a map:

http://www.bulldozer.utjag.co.uk/WaveToUMX.htm but had to do it differently. Where it says 

# Now, just like you would select any text in a textarea, select all 3 chars from the Patern Speed and use &quot;CTRL C&quot; to copy it to clipboard.

# From the Patern Numbers, now select the next patern, being the Patern 1.

# Select again that same area, that this time is empty, be carefull to select the entire &quot;Effect&quot; area, and Use &quot;CTRL V&quot; to paste the chars you've copied earlier from patern 0. 

That didn't work for me. The song would only play once...

So I copied the entire section for both channels, instead of just the pattern speed, then went to pattern 1, and pasted it across both channels, so that they look identical to the first line in pattern 0. The song loops indefinitely now.

Before you do all that, though, in modplug tracker, you can take a wav file and enhance it a lot with tracker, go to general tab, and in effects, check bass expansion, surround, agc, and in resample put it to high quality. Now go to the bottom, and under effect plugins, click on select plugin... and under DirectX Media Audio Effets, check on ParamEq, click okay, then under Channels one and two (or more?) in the effect: box, change to FX1: ParamEq, and under effects plugin, over to the right, chose Dry mix. Then set it to loop by following the directions above...

{BL}Ticklemonster
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Importing Sounds</title>
    <id>1456</id>
    <revision>
      <id>3658</id>
      <timestamp>2007-06-02T07:47:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>can't be mentioned often enough, eh?</comment>
      <text xml:space="preserve">==Before you import the sound==

A short checklist of common problems:

; [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] : You have been warned!
; No spaces or other funny characters in the file or its directory tree : '''''UnrealEd will not import files with spaces in the directory or file name.''''' Move the file to a different directory, if necessary. (This is not a problem for #[[Legacy:Exec Directive|exec directive]]s though, as long as you enclose the file in double quotes.)
; No compression : The engine only accepts uncompressed wave files. '''No''' ADPCM! '''No''' MP3 wave! '''No''' ''&lt;insert other sound format&gt;''! Only plain old PCM wave audio files.
; No stereo : ...or other multi-channel formats. The engine can only handle mono files.
; Watch the format : The engine wants a standard sampling rate at 8 or 16 bit per sample. For [[Legacy:UT|UT]] you should stick to 11 or 22 kHz, newer games will definitely also handle 8, 16, 32, 44 and 48 kHz, but here you should find the lowest sampling rate that still sounds good. In most cases you will want to use 22 or 44 kHz at 16 bits/sample.

==Importing...==

So you have your PCM Mono wave file without any spaces in its file name or directory name and want to get it into the game. You have three options for importing now:
* via UnrealEd's [[Legacy:Sound Browser|sound browser]]
* via an [[Legacy:UnrealEd Console|UnrealEd console]] command #[[Legacy:Exec Directive|exec directive]] or
* via UCC BatchImport.

===...via UnrealEd (to .UAX or myLevel)===

[[Image:Legacy_interface-Ed3-soundbrowser-import.png|right|The sound import dialog box.]]
# Open the [[Legacy:Sound Browser|sound browser]].
# Click File -&gt; Import.
# Select your file(s) and click Open.
# A dialog box comes up for every file you selected asking you for the destination package, the group name and the sound name. Package and group name default to the currently selected package and group in the sound browser. Changes here will carry on to the next sound file's dialog box. The sound name defaults to the sound file name. Click 'OK' to import the sound. 'OK All' will import all sounds using their file names as their sound name into the package and group displayed in the dialog box. You can also 'Skip' over the current file and go to the next. 'Cancel' skips all remaining files.
# Your sound(s) should now show up in the sound browser. If you can't find them, chances are you did something wrong. Open the log window (&quot;ShowLog&quot; in the console) and check for errors. Also read over the first section of this page again to see whether you need to convert the sound file or rename/move it.

Remember to use your sound in your map if you imported it to [[Legacy:MyLevel|myLevel]] or save the sound package to a UAX file, otherwise the sound(s) will be lost when you close UnrealEd.

===...via console commands (to .U or via UnrealEd Console)===

The console command for importing sounds looks like this:
 '''AUDIO IMPORT FILE'''=''filename'' ['''NAME'''=''soundname''] ['''GROUP'''=''groupname''] ['''PACKAGE'''=''packagename'']

Mostly this command is used for importing sounds into a code package at compile time. In this case the Package parameter should be left out, otherwise the sound will only be imported to a temporary package that is not saved.

&lt;uscript&gt;
#exec AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot;
&lt;/uscript&gt;

You can also use the command (and some variations) in the [[Legacy:UnrealEd Console|UnrealEd Console]]:
*AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot; PACKAGE=&quot;TazerSounds&quot;
*NEW SOUND FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;
*NEW SoundFactory FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;

Don't forget to save the new or modified package afterwards.&lt;br /&gt;'''Note:''' A new package created this way might not immediately show up in the sound browser.

===...via UCC Editor.BatchImport===

You can use the BatchImport UCC commandlet to create a sound package without opening UnrealEd or compiling UnrealScript classes. See [[Legacy:BatchImportCommandlet|BatchImportCommandlet]] for details.

==Creating Looping Sounds (only UT) ==

Ever wondered why your imported sounds wouldn't loop properly? I did too, and I found this:

Taken from EpicGames' Audio Reference:

{{innerbox|
To create a looping sound effect in a .wav file, you need a sound editing program like SoundForge (http://www.sfoundry.com) which supports looping sound effects. In Sound Forge, follow these instructions:

# Run SoundForge.
# Load your .wav file (either 8-bit or 16-bit).
# Bring up the &quot;Special/Edit Sample...&quot; dialog.
# Click on the &quot;Sustaining&quot; choice (as opposed to &quot;One shot&quot;).
# Select &quot;File/Save As...&quot;.
# Make sure that the &quot;Save Sampler Information in file&quot; option is checked.
# Click on the &quot;Save button&quot;.


}}

So that means the Looping property is set in the sound file itself, and not in UnrealEd. Dunno what other Programs are able to do this...

'''Note:''' UT2003 and other UnrealEngine2 games do not require this kind of special treatment to make sounds loop properly.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3659</id>
      <timestamp>2007-06-02T04:53:49Z</timestamp>
      <contributor>
        <ip>Ip68-4-225-8.oc.oc.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Before you import the sound==

A short checklist of common problems:

; [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] : You have been warned!
; No spaces or other funny characters in the file or its directory tree : '''UnrealEd will not import files with spaces in the directory or file name'''. This is not a problem for #[[Legacy:Exec Directive|exec directive]]s though, as long as you enclose the file in double quotes. Move the file to a different directory, if necessary.
; No compression : The engine only accepts uncompressed wave files. '''No''' ADPCM! '''No''' MP3 wave! '''No''' ''&lt;insert other sound format&gt;''! Only plain old PCM wave audio files.
; No stereo : ...or other multi-channel formats. The engine can only handle mono files.
; Watch the format : The engine wants a standard sampling rate at 8 or 16 bit per sample. For [[Legacy:UT|UT]] you should stick to 11 or 22 kHz, newer games will definitely also handle 8, 16, 32, 44 and 48 kHz, but here you should find the lowest sampling rate that still sounds good. In most cases you will want to use 22 or 44 kHz at 16 bits/sample.

==Importing...==

===...via UnrealEd (to .UAX or myLevel)===

[[Image:Legacy_interface-Ed3-soundbrowser-import.png|right|The sound import dialog box.]]
# Open the [[Legacy:Sound Browser|sound browser]].
# Click File -&gt; Import.
# Select your file(s) and click Open.
# A dialog box comes up for every file you selected asking you for the destination package, the group name and the sound name. Package and group name default to the currently selected package and group in the sound browser. Changes here will carry on to the next sound file's dialog box. The sound name defaults to the sound file name. Click 'OK' to import the sound. 'OK All' will import all sounds using their file names as their sound name into the package and group displayed in the dialog box. You can also 'Skip' over the current file and go to the next. 'Cancel' skips all remaining files. NOTE: If the imported file has a space in its path, the import may not work.
# Your sound(s) should now show up in the sound browser. If you can't find them, chances are you did something wrong. Open the log window (&quot;ShowLog&quot; in the console) and check for errors. Also read over the first section of this page again to see whether you need to convert the sound file or rename/move it.

Remember to use your sound in your map if you imported it to [[Legacy:MyLevel|myLevel]] or save the sound package to a UAX file, otherwise the sound(s) will be lost when you close UnrealEd.

===...via console commands (to .U or via UnrealEd Console)===

The console command for importing sounds looks like this:
 '''AUDIO IMPORT FILE'''=''filename'' ['''NAME'''=''soundname''] ['''GROUP'''=''groupname''] ['''PACKAGE'''=''packagename'']

Mostly this command is used for importing sounds into a code package at compile time. In this case the Package parameter should be left out, otherwise the sound will only be imported to a temporary package that is not saved.

&lt;uscript&gt;
#exec AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot;
&lt;/uscript&gt;

You can also use the command (and some variations) in the [[Legacy:UnrealEd Console|UnrealEd Console]]:
*AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot; PACKAGE=&quot;TazerSounds&quot;
*NEW SOUND FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;
*NEW SoundFactory FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;

Don't forget to save the new or modified package afterwards.&lt;br /&gt;'''Note:''' A new package created this way might not immediately show up in the sound browser.

===...via UCC Editor.BatchImport===

You can use the BatchImport UCC commandlet to create a sound package without opening UnrealEd or compiling UnrealScript classes. See [[Legacy:BatchImportCommandlet|BatchImportCommandlet]] for details.

==Creating Looping Sounds (only UT) ==

Ever wondered why your imported sounds wouldn't loop properly? I did too, and I found this:

Taken from EpicGames' Audio Reference:

{{innerbox|
To create a looping sound effect in a .wav file, you need a sound editing program like SoundForge (http://www.sfoundry.com) which supports looping sound effects. In Sound Forge, follow these instructions:

# Run SoundForge.
# Load your .wav file (either 8-bit or 16-bit).
# Bring up the &quot;Special/Edit Sample...&quot; dialog.
# Click on the &quot;Sustaining&quot; choice (as opposed to &quot;One shot&quot;).
# Select &quot;File/Save As...&quot;.
# Make sure that the &quot;Save Sampler Information in file&quot; option is checked.
# Click on the &quot;Save button&quot;.


}}

So that means the Looping property is set in the sound file itself, and not in UnrealEd. Dunno what other Programs are able to do this...

'''Note:''' UT2003 and other UnrealEngine2 games do not require this kind of special treatment to make sounds loop properly.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34590</id>
      <timestamp>2009-07-27T22:00:21Z</timestamp>
      <contributor>
        <username>Claudius</username>
        <id>1891</id>
      </contributor>
      <comment>/* Creating Looping Sounds (only UT) */</comment>
      <text xml:space="preserve">==Before you import the sound==

A short checklist of common problems:

; [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] : You have been warned!
; No spaces or other funny characters in the file or its directory tree : '''''UnrealEd will not import files with spaces in the directory or file name.''''' Move the file to a different directory, if necessary. (This is not a problem for #[[Legacy:Exec Directive|exec directive]]s though, as long as you enclose the file in double quotes.)
; No compression : The engine only accepts uncompressed wave files. '''No''' ADPCM! '''No''' MP3 wave! '''No''' ''&lt;insert other sound format&gt;''! Only plain old PCM wave audio files.
; No stereo : ...or other multi-channel formats. The engine can only handle mono files.
; Watch the format : The engine wants a standard sampling rate at 8 or 16 bit per sample. For [[Legacy:UT|UT]] you should stick to 11 or 22 kHz, newer games will definitely also handle 8, 16, 32, 44 and 48 kHz, but here you should find the lowest sampling rate that still sounds good. In most cases you will want to use 22 or 44 kHz at 16 bits/sample.

==Importing...==

So you have your PCM Mono wave file without any spaces in its file name or directory name and want to get it into the game. You have three options for importing now:
* via UnrealEd's [[Legacy:Sound Browser|sound browser]]
* via an [[Legacy:UnrealEd Console|UnrealEd console]] command #[[Legacy:Exec Directive|exec directive]] or
* via UCC BatchImport.

===...via UnrealEd (to .UAX or myLevel)===

[[Image:Legacy_interface-Ed3-soundbrowser-import.png|right|The sound import dialog box.]]
# Open the [[Legacy:Sound Browser|sound browser]].
# Click File -&gt; Import.
# Select your file(s) and click Open.
# A dialog box comes up for every file you selected asking you for the destination package, the group name and the sound name. Package and group name default to the currently selected package and group in the sound browser. Changes here will carry on to the next sound file's dialog box. The sound name defaults to the sound file name. Click 'OK' to import the sound. 'OK All' will import all sounds using their file names as their sound name into the package and group displayed in the dialog box. You can also 'Skip' over the current file and go to the next. 'Cancel' skips all remaining files.
# Your sound(s) should now show up in the sound browser. If you can't find them, chances are you did something wrong. Open the log window (&quot;ShowLog&quot; in the console) and check for errors. Also read over the first section of this page again to see whether you need to convert the sound file or rename/move it.

Remember to use your sound in your map if you imported it to [[Legacy:MyLevel|myLevel]] or save the sound package to a UAX file, otherwise the sound(s) will be lost when you close UnrealEd.

===...via console commands (to .U or via UnrealEd Console)===

The console command for importing sounds looks like this:
 '''AUDIO IMPORT FILE'''=''filename'' ['''NAME'''=''soundname''] ['''GROUP'''=''groupname''] ['''PACKAGE'''=''packagename'']

Mostly this command is used for importing sounds into a code package at compile time. In this case the Package parameter should be left out, otherwise the sound will only be imported to a temporary package that is not saved.

&lt;uscript&gt;
#exec AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot;
&lt;/uscript&gt;

You can also use the command (and some variations) in the [[Legacy:UnrealEd Console|UnrealEd Console]]:
*AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot; PACKAGE=&quot;TazerSounds&quot;
*NEW SOUND FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;
*NEW SoundFactory FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;

Don't forget to save the new or modified package afterwards.&lt;br /&gt;'''Note:''' A new package created this way might not immediately show up in the sound browser.

===...via UCC Editor.BatchImport===

You can use the BatchImport UCC commandlet to create a sound package without opening UnrealEd or compiling UnrealScript classes. See [[Legacy:BatchImportCommandlet|BatchImportCommandlet]] for details.

==Creating Looping Sounds (only UT) ==

Ever wondered why your imported sounds wouldn't loop properly? I did too, and I found this:

Taken from EpicGames' Audio Reference:

{{innerbox|
To create a looping sound effect in a .wav file, you need a sound editing program like SoundForge (http://www.sfoundry.com) which supports looping sound effects. In Sound Forge, follow these instructions:

# Run SoundForge.
# Load your .wav file (either 8-bit or 16-bit).
# Bring up the &quot;Special/Edit Sample...&quot; dialog.
# Click on the &quot;Sustaining&quot; choice (as opposed to &quot;One shot&quot;).
# Select &quot;File/Save As...&quot;.
# Make sure that the &quot;Save Sampler Information in file&quot; option is checked.
# Click on the &quot;Save button&quot;.


}}

So that means the Looping property is set in the sound file itself, and not in UnrealEd. Dunno what other Programs are able to do this...

A free Alternative that can insert Loop Points in a Wave file, that is compatible with the editor is Wavosaur -&gt; [http://www.wavosaur.com/]. 

Modplug Tracker has also loop and sustain loop options for it's Wave samples that can be saved, but these are, to my knowledge, incompatible with the editor (needs more testing).

'''Note:''' UT2003 and other UnrealEngine2 games do not require this kind of special treatment to make sounds loop properly.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34591</id>
      <timestamp>2009-07-27T22:01:34Z</timestamp>
      <contributor>
        <username>Claudius</username>
        <id>1891</id>
      </contributor>
      <minor/>
      <comment>/* Creating Looping Sounds (only UT) */</comment>
      <text xml:space="preserve">==Before you import the sound==

A short checklist of common problems:

; [[Legacy:Do Not Alter Default Packages|Do Not Alter Default Packages]] : You have been warned!
; No spaces or other funny characters in the file or its directory tree : '''''UnrealEd will not import files with spaces in the directory or file name.''''' Move the file to a different directory, if necessary. (This is not a problem for #[[Legacy:Exec Directive|exec directive]]s though, as long as you enclose the file in double quotes.)
; No compression : The engine only accepts uncompressed wave files. '''No''' ADPCM! '''No''' MP3 wave! '''No''' ''&lt;insert other sound format&gt;''! Only plain old PCM wave audio files.
; No stereo : ...or other multi-channel formats. The engine can only handle mono files.
; Watch the format : The engine wants a standard sampling rate at 8 or 16 bit per sample. For [[Legacy:UT|UT]] you should stick to 11 or 22 kHz, newer games will definitely also handle 8, 16, 32, 44 and 48 kHz, but here you should find the lowest sampling rate that still sounds good. In most cases you will want to use 22 or 44 kHz at 16 bits/sample.

==Importing...==

So you have your PCM Mono wave file without any spaces in its file name or directory name and want to get it into the game. You have three options for importing now:
* via UnrealEd's [[Legacy:Sound Browser|sound browser]]
* via an [[Legacy:UnrealEd Console|UnrealEd console]] command #[[Legacy:Exec Directive|exec directive]] or
* via UCC BatchImport.

===...via UnrealEd (to .UAX or myLevel)===

[[Image:Legacy_interface-Ed3-soundbrowser-import.png|right|The sound import dialog box.]]
# Open the [[Legacy:Sound Browser|sound browser]].
# Click File -&gt; Import.
# Select your file(s) and click Open.
# A dialog box comes up for every file you selected asking you for the destination package, the group name and the sound name. Package and group name default to the currently selected package and group in the sound browser. Changes here will carry on to the next sound file's dialog box. The sound name defaults to the sound file name. Click 'OK' to import the sound. 'OK All' will import all sounds using their file names as their sound name into the package and group displayed in the dialog box. You can also 'Skip' over the current file and go to the next. 'Cancel' skips all remaining files.
# Your sound(s) should now show up in the sound browser. If you can't find them, chances are you did something wrong. Open the log window (&quot;ShowLog&quot; in the console) and check for errors. Also read over the first section of this page again to see whether you need to convert the sound file or rename/move it.

Remember to use your sound in your map if you imported it to [[Legacy:MyLevel|myLevel]] or save the sound package to a UAX file, otherwise the sound(s) will be lost when you close UnrealEd.

===...via console commands (to .U or via UnrealEd Console)===

The console command for importing sounds looks like this:
 '''AUDIO IMPORT FILE'''=''filename'' ['''NAME'''=''soundname''] ['''GROUP'''=''groupname''] ['''PACKAGE'''=''packagename'']

Mostly this command is used for importing sounds into a code package at compile time. In this case the Package parameter should be left out, otherwise the sound will only be imported to a temporary package that is not saved.

&lt;uscript&gt;
#exec AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot;
&lt;/uscript&gt;

You can also use the command (and some variations) in the [[Legacy:UnrealEd Console|UnrealEd Console]]:
*AUDIO IMPORT FILE=&quot;Sounds\Tazer\TSHOTA6.WAV&quot; NAME=&quot;TazerFire&quot; GROUP=&quot;ASMD&quot; PACKAGE=&quot;TazerSounds&quot;
*NEW SOUND FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;
*NEW SoundFactory FILE=Sounds\Tazer\TSHOTA6.WAV PACKAGE=MyLevel.ASMD NAME=TazerFire PACKAGE=&quot;TazerSounds&quot;

Don't forget to save the new or modified package afterwards.&lt;br /&gt;'''Note:''' A new package created this way might not immediately show up in the sound browser.

===...via UCC Editor.BatchImport===

You can use the BatchImport UCC commandlet to create a sound package without opening UnrealEd or compiling UnrealScript classes. See [[Legacy:BatchImportCommandlet|BatchImportCommandlet]] for details.

==Creating Looping Sounds (only UT) ==

Ever wondered why your imported sounds wouldn't loop properly? I did too, and I found this:

Taken from EpicGames' Audio Reference:

{{innerbox|
To create a looping sound effect in a .wav file, you need a sound editing program like SoundForge (http://www.sfoundry.com) which supports looping sound effects. In Sound Forge, follow these instructions:

# Run SoundForge.
# Load your .wav file (either 8-bit or 16-bit).
# Bring up the &quot;Special/Edit Sample...&quot; dialog.
# Click on the &quot;Sustaining&quot; choice (as opposed to &quot;One shot&quot;).
# Select &quot;File/Save As...&quot;.
# Make sure that the &quot;Save Sampler Information in file&quot; option is checked.
# Click on the &quot;Save button&quot;.


}}

So that means the Looping property is set in the sound file itself, and not in UnrealEd. Dunno what other Programs are able to do this...

A free Alternative that can insert Loop Points in a Wave file, that is compatible with the editor is Wavosaur -&gt; (http://www.wavosaur.com/). 

Modplug Tracker has also loop and sustain loop options for it's Wave samples that can be saved, but these are, to my knowledge, incompatible with the editor (needs more testing).

'''Note:''' UT2003 and other UnrealEngine2 games do not require this kind of special treatment to make sounds loop properly.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:In Case Of Emergency</title>
    <id>1496</id>
    <revision>
      <id>3749</id>
      <timestamp>2006-11-29T02:31:19Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <comment>*Added links</comment>
      <text xml:space="preserve">Harddisks crash, buildings catch fire, your girl-/boyfriend dumps you. These things happen to everybody, be prepared for it. You probably can't prevent these things (but hey, don't light candles in bed and be nice to your girlfriend), but with some sensible precautions your mod project need not die when they happen.

==Keeping Backups==

Of course this is all about backups. Always make sure you do regular backups of your work, but most important make sure you have at least one backup on a off-site location.

You have to do it regularly because you don't want to be set back a whole month. Often there is a solution available that gives you the ability to do incremental backups. This way you can keep smaller backups, but make sure you also do a complete backup once in a while because there's nothing more anoying that restoring tons of incremental backups.

===Version Control===

When your are working with a team you usually use a [[Legacy:Version Control|version control]] system. A nice side effect of this is that you will always have a backup of the work on a different location. Hint: Even if you are a sole developer a version control system is very useful.

There is just one thing people sometimes forget and that is that you only have the current files on all work stations. You don't have any control information or previous version. So also make sure you create backups of the the data on the version control server and ship it to a off-site location.

===Documentation===

This includes normal instructions, story, etc. You can keep your documentation in a CVS too, but this has a little downside that discussion about a document can't be included (it's not nice). A Wiki system might be the solution, it will also keep a record of changes, and some wiki systems can't backed-up just like a Version Control system since they use plain text files. 

===Discussion===

Forums are a nice place for discussions, but there's a major downside. It's hard to keep backups because you usually don't administer the system running the forum. Also most forums use a database, and databases are not really friendly when it comes to backing up. It lacks the posibility for incremental backups.

Mailing lists are very backup friendly, everybody receives a copy of the message and of course the mailing list server keeps an archive (usually).

==Shipping Backups==

There's not much use in creating backups and storing them at the same location as where the official data is. You have to ship your backups to an off-site location.

So once in a while burn your backups on a CD-ROM and and when you visit your parents stash them somewhere on their attic so they won't &quot;clean&quot; it up (near your old porn stash is usualy a good location).

==System Security==

An other very important thing is the security of your system. Even though you are developing something open source you want to have you workstations and backup/version control servers to be secure.

Before you know it somebody hacked his/her way into your system and could change/steal your developments. So visit the OS vendor's online update site at least weekly to check if security patches have been released. When a patch has been released it usually means that an exploit has been availble for a couple of days (with MS Windows often a couple of weeks). It's usualy best to turn on any automatic update features, or at least configure them to automatically download updates.

Another thing is to install a virus scanner on your MS Windows systems. And install or turn on the [[Wikipedia:firewall]] on your system. But even better than turning on a firewall is to disable all useless services running on your system. The Microsoft Windows NT product line (NT, 2000, XP, ...) come with a lot of useless services enabled. Usually you can disable most of them. If you don't know what a services does and you can't find much information about it just disable it and check if everything is still working as it should (the good old trial and error). See [http://www.tweakhound.com/xp/security/page_1.htm Securing Windows XP] and [http://www.tweakhound.com/xp/xptweaks/supertweaks6.htm Disabling Unnecessary Proceses]. for XP machines.

When you already have a backend network it's a good idea to install a secure router. A secure router can be very easy to install. All you need it an old PC (pentium will do fine) with two quality network interface cards (3com or intel NICs advised) and install [http://www.netbsd.org NetBSD] on that old machine. You don't need a state of the art machine for a simple router. NetBSD is a very secure operating system (hasn't had a remote root exploit in quite some years), it might take some time to get it installed correctly, but there's usualy enough information and support available. Because you have a router between the internet and your backend network your backend network will automatically be secure from external attacks because they first have to go through your router to reach your network.

It's better to use an old PC with NetBSD (or any other small UNIX like OS will do) than to use a hardware router. Simply because the cost of a PC router is pretty low, and you will have total freedom over it's features and settings.

==Links to Backup Solutions==
* [http://freshmeat.net/browse/19/ Freshmeat.net Archive section]

----

'''El Muerte TDS:''' with all these things breaking down ([http://forums.beyondunreal.com 1], [[Legacy:Mychaeel/Developer Journal|2]]) I think it's time the UWiki covered something about emergency protection. So please help to finish this document and add links to backup solutions, or subpages for more detailes on a custom solution.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3750</id>
      <timestamp>2005-12-18T00:53:33Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Harddisks crash, buildings catch fire, your girl-/boyfriend dumps you. These things happen to everybody, be prepared for it. You probably can't prevent these things (but hey, don't light candles in bed and be nice to your girlfriend), but with some sensible precautions your mod project need not die when they happen.

==Keeping Backups==

Of course this is all about backups. Always make sure you do regular backups of your work, but most important make sure you have at least one backup on a off-site location.

You have to do it regularly because you don't want to be set back a whole month. Often there is a solution available that gives you the ability to do incremental backups. This way you can keep smaller backups, but make sure you also do a complete backup once in a while because there's nothing more anoying that restoring tons of incremental backups.

===Version Control===

When your are working with a team you usually use a [[Legacy:Version Control|version control]] system. A nice side effect of this is that you will always have a backup of the work on a different location. Hint: Even if you are a sole developer a version control system is very useful.

There is just one thing people sometimes forget and that is that you only have the current files on all work stations. You don't have any control information or previous version. So also make sure you create backups of the the data on the version control server and ship it to a off-site location.

===Documentation===

This includes normal instructions, story, etc. You can keep your documentation in a CVS too, but this has a little downside that discussion about a document can't be included (it's not nice). A Wiki system might be the solution, it will also keep a record of changes, and some wiki systems can't backed-up just like a Version Control system since they use plain text files. 

===Discussion===

Forums are a nice place for discussions, but there's a major downside. It's hard to keep backups because you usually don't administer the system running the forum. Also most forums use a database, and databases are not really friendly when it comes to backing up. It lacks the posibility for incremental backups.

Mailing lists are very backup friendly, everybody receives a copy of the message and of course the mailing list server keeps an archive (usually).

==Shipping Backups==

There's not much use in creating backups and storing them at the same location as where the official data is. You have to ship your backups to an off-site location.

So once in a while burn your backups on a CD-ROM and and when you visit your parents stash them somewhere on their attic so they won't &quot;clean&quot; it up (near your old porn stash is usualy a good location).

==System Security==

An other very important thing is the security of your system. Even though you are developing something open source you want to have you workstations and backup/version control servers to be secure.

Before you know it somebody hacked his/her way into your system and could change/steal your developments. So visit the OS vendor's online update site at least weekly to check if security patches have been released. When a patch has been released it usually means that an exploit has been availble for a couple of days (with MS Windows often a couple of weeks). It's usualy best to turn on any automatic update features, or at least configure them to automatically download updates.

Another thing is to install a virus scanner on your MS Windows systems. And install or turn on the [[Wikipedia:firewall]] on your system. But even better than turning on a firewall is to disable all useless services running on your system. The Microsoft Windows NT product line (NT, 2000, XP, ...) come with a lot of useless services enabled. Usually you can disable most of them. If you don't know what a services does and you can't find much information about it just disable it and check if everything is still working as it should (the good old trial and error).

When you already have a backend network it's a good idea to install a secure router. A secure router can be very easy to install. All you need it an old PC (pentium will do fine) with two quality network interface cards (3com or intel NICs advised) and install [http://www.netbsd.org NetBSD] on that old machine. You don't need a state of the art machine for a simple router. NetBSD is a very secure operating system (hasn't had a remote root exploit in quite some years), it might take some time to get it installed correctly, but there's usualy enough information and support available. Because you have a router between the internet and your backend network your backend network will automatically be secure from external attacks because they first have to go through your router to reach your network.

It's better to use an old PC with NetBSD (or any other small UNIX like OS will do) than to use a hardware router. Simply because the cost of a PC router is pretty low, and you will have total freedom over it's features and settings.

==Links to Backup Solutions==
* [http://freshmeat.net/browse/19/ Freshmeat.net Archive section]

----

'''El Muerte TDS:''' with all these things breaking down ([http://forums.beyondunreal.com 1], [[Legacy:Mychaeel/Developer Journal|2]]) I think it's time the UWiki covered something about emergency protection. So please help to finish this document and add links to backup solutions, or subpages for more detailes on a custom solution.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inbox</title>
    <id>1452</id>
    <revision>
      <id>3651</id>
      <timestamp>2005-09-21T22:24:17Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a page for material that doesn't yet have a home. Add anything you like here, and seasoned contributors will at some point find it a home elsewhere in the Wiki. To get started, click the &quot;Edit text of this page&quot; link at the bottom of this page.

==Example ==

This is the body text. Here's a link to the [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] page.

New paragraph. Check the above link for info on giving yourself a username &amp; your own user page on the system. Below is a rule-off. Start new entries below &amp; follow this markup.

----

'''Mysterial:''' In UT2003, GameInfo and Mutator have a function GetServerDetails() that allows modmakers to add to the info displayed by the server browser in the bottom left window.

----

A problem some mods could have is that they want to modify all of a specific kind of object's properties, yet functions like [[Legacy:Mutator|Mutator]]'s IsRelevant() don't get called on them. This problem can be fixed with the code:

&lt;uscript&gt;
local Object O;

foreach AllObjects(class'object', O)
			if (ClassIsChildOf(Class(O), class'BaseClass'))
				class&lt;BaseClass&gt;(O).default.SomeVariable = SomeValue;
&lt;/uscript&gt;

This code needs only run once, and allows you to change the default properties of any class below some base class.

'''Foxpaw:''' You could do that with a lot less CPU usage by cutting out the middleman:

&lt;uscript&gt;
local Object O;

foreach AllObjects(class'BaseClass', O)
  class&lt;BaseClass&gt;(O).default.SomeVariable = SomeValue;
&lt;/uscript&gt;

'''Mysterial:''' That doesn't work; the iterator would return actual objects, not classes that you could cast like that. Plus, the point is to change the default value for all subclasses of the BaseClass, not BaseClass itself.

'''Foxpaw:''' I see you are right about the class casting. I'm not sure where my head was when I wrote that bit. This one would work - and subclasses of that class will still get the call from the iterator:

&lt;uscript&gt;
local BaseClass O;

foreach AllObjects(class'BaseClass', O)
  O.Class.default.SomeVariable = SomeValue;
&lt;/uscript&gt;

----

'''Mysterial:''' It seems as though Actor references don't get properly set to None in objects not subclassed from Actor. I had an Interaction that set a variable to one of the local pawn's inventory items, and if that pawn died the game would often crash because the variable wasn't None even though the inventory item no longer existed.

In addition, the game will randomly crash during garbage collection if an object that is no longer referenced (for example, a menu long closed) if that object contains an invalid Actor reference. The trademark of such a crash is a long list of (Some Object)-&gt;Serialize strings in the backtrace.

----

'''Foxpaw:''' This works, but is bad mojo. So don't do it. It's probrably unstable. If you have a wierd, really wierd bug, maybe it's caused by something like this. I did it by mistake before I realized that I was using something I hadn't declared in that class, but in a subclass of it.

Ph3AR! A hole in the time-space continuum:

&lt;uscript&gt;
class ImAClass extends Actor;

var Someotherclass Classtastic;

function Ihavefunctions()
{
  ClassTastic.AStruct.Avar = 3;
}
// Blah blah blah.

class ASubclass extends ImAClass;

struct StructDef
{
  var float AVar;
  var string AnotherVar;
}
// And then some...

class Someotherclass extends actor dependson(Asubclass);

var ASubclass.StructDef Astruct;
&lt;/uscript&gt;

Note that we are calling something that hasn't really been defined yet. An even easier way of causng mayhem:

&lt;uscript&gt;
class MyClass extends Actor;
var MySubClass Submarine;

class MySubClass extends MyClass;
&lt;/uscript&gt;

Suffice it to say, don't refer to subclasses of a class within that same class, or the UEd Goblin will eat your babies! Alternatively, this type of wanton class looping results in GPFs if you make a wrong move.

'''Wormbo:''' That second thing works reasonably well with the [[Legacy:Actor|Actor]] class and its Instigator variable which is a [[Legacy:Pawn|Pawn]] reference (subclass of Actor) or its Level variable which a [[Legacy:LevelInfo|LevelInfo]] reference (also a subclass of Actor).

'''Foxpaw:''' Well, yes, it works, it's just that it has a high risk of ceasing to work as a result of changes.. plus it's extremely poor OOP form, if you ask me.

----

'''Foxpaw:''' BSP that is extremely distant seems to not be drawn, or not be drawn properly. I made a cubic brush 2^18 units per side and the surfaces did not show up at all when I subtracted it. A brush 2^17 units per side showed up but had a HOM effect in the editor. Brushes of 2^16 units per side and smaller seem to work fine. This seems to work fine if the surfaces are fake backdrop, however.

'''Birelli:''' To the BSP drawing thing - I imagine that has something to do with textures. When each &quot;tiling&quot; of the texture becomes less than 1 pixel, for instance, the algorithm might start to break down. This wouldn't necessarily happen with fake backdrop because the backdrop isn't drawn the same way.

----

'''Foxpaw:''' I noticed that if you override a function in a subclass that has one or more variables declared as &quot;out&quot; variables, if you change the declaration in the subclass and leave out the &quot;out&quot; keyword, the compiler will accept the new version and that variable will not be treated as an &quot;out&quot; variable for that class and it's subclasses. I'm not sure if this works the other way around. (making a non-out variable an out variable.)

----

'''Foxpaw:''' If you destroy an actor within KImpact, UT2003 gives you a GPF. I believe this is because the list of all colliding actors is generated, then each collision isis evaluated. As a result, after the actor is destroyed other things that were colliding with that actor still want to collide with it an there's a null pointer being accessed within the native code. But that's just speculation on WHY it GPFs. The workaround appears to be setting a flag so the actor can destroy itself in Tick.

'''Mysterial:''' This is true of pretty much every Karma event. In addition, you shouldn't edit the Karma properties of an object in a Karma function, for similar reasons. I *think* there are checks for these kinds of things in UT2004, but I'd take the safe path and just flag things for processing elsewhere.

'''Foxpaw:''' I really hope they do include checks.. I'd really like to be able to destroy objects from within the KImpact event. If one of the ships in my mod hits something going at any kind of speed, it takes damage, which may result in destruction.. so I've had to delay all destruction due to damage to the next tick, which is a bit hackier than I like.

----

'''Foxpaw:''' Apparently, using a reference in the default properties to call an iterator gives an &quot;invalid code token&quot; at runtime. IE, class'Whatever'.default.Singleton.SomeFunction() is okay, but foreach class'Whatever'.default.Singleton.AllObjects( class'etc', etc ) gives the invalid code token. I found this interesting as both seem like function calls and you can use an iterator like that for references not stored in the default properties.

Also AllActors is amazingly slow. A Uscripted Dynamic array with all the same contents can be iterated through in roughly one quarter of the time.

----

From Mod Authoring/Introduction to Gametypes

==Update for UT2K4 :==

'''BigJohn:''' This seems to have changed a bit in Unreal Tournament 2004. In order to make a gametype mod and have it appear under the game list, we now need to have 4 values in our GameType's class' defaultproperties :

&lt;uscript&gt;
class MyGame extends DeathMatch;

defaultproperties
{
   GameName=&quot;My Game&quot;
   Acronym=&quot;MG&quot;
   MapPrefix=&quot;MG&quot;
   Description=&quot;A bloody fight to the death!!!.&quot;
}
&lt;/uscript&gt;

Also, there is no need for the Object line in the game's int file (But you do need the Preferences line!).

Your MyPackage.int should look like this:

&lt;uscript&gt;
[Public]
Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

[MyGame]
GameName=&quot;My Game&quot;
Description=&quot;A bloody fight to the death!!!.&quot;
&lt;/uscript&gt;

You can use the command 

ucc dumpint MyGame.u 

to create the [MyGame] section in the .int file.

UCC can generate a .ucl file from our package's .u file. This can be achieved by typing this command:

ucc exportcache MyGame.u MyGame.ucl

Once this is done, the only thing left is to have a map in the UT2004\Maps folder with the appropriate prefix, in the above case MG.

----

'''Tarquin:''' We can't edit these pages because they are by Epic. Please can we find another home for the above piece of text?

Co11: Also, for ut2004.. it seems that Deathmatchplus and TeamGamePlus are no longer functional. Try just Deathmatch and TeamGame.

'''Wormbo:''' As stated on [[Legacy:Mod Authoring|Mod Authoring]] this whole tutorial is only for [[Legacy:UT|UT]], not for newer engine versions. For anything else go to [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] or [[Legacy:Making Mods|Making Mods]].

[[:Category:Legacy To Do]] &amp;rarr; Move content to the correct pages.

----

'''Foxpaw:''' I noticed something interesting today, apparently function arguments in subclasses need not have the same names as their original declarations, as long as they are of the same type and in the same order. IE, the following is valid:

&lt;uscript&gt;
class A extends Object;

function F( float P )
{
  // Do Stuff.
}
&lt;/uscript&gt;

&lt;uscript&gt;
class B extends A;

function F( float Q )
{
  Super.F( Q );

  // Do some other stuff.
}
&lt;/uscript&gt;

Of questionable value, but it's possible. I noticed that some of Epic's code uses &quot;dt&quot; as the argument name for tick some places instead of &quot;Delta,&quot; so I tested it in my own code and it seems to work.

'''MythOpus:''' Yep :D  I caught on to that quite quickly.  It helps to give more descriptive names to arguments in your code, rather than using epics stuff.

'''Mychaeel:''' Indeed.  Usually, in any object-oriented language, only the function prototype &amp;ndash; i.e. the function name, its return type and its parameter types, but not the symbolic parameter names &amp;ndash; are relevant for resolving a function reference.  (In many languages which support function pre-declaration, it's even valid to leave the parameter names out: &lt;code&gt;void foo(float, int)&lt;/code&gt; is perfectly valid in C and C++.)

----

'''Blip2:''' I found this cool program for the text colours in UT this apparently causes problems with names but I have found it is useful with in-game coloured messages I would write happily write a paragraph or two about how to do this and where to get this program if I knew where to write it (any ideas?)

'''Graphik:''' Create a page for it.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3652</id>
      <timestamp>2005-09-21T21:15:19Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a page for material that doesn't yet have a home. Add anything you like here, and seasoned contributors will at some point find it a home elsewhere in the Wiki. To get started, click the &quot;Edit text of this page&quot; link at the bottom of this page.

==Example ==

This is the body text. Here's a link to the [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] page.

New paragraph. Check the above link for info on giving yourself a username &amp; your own user page on the system. Below is a rule-off. Start new entries below &amp; follow this markup.

----

'''Mysterial:''' In UT2003, GameInfo and Mutator have a function GetServerDetails() that allows modmakers to add to the info displayed by the server browser in the bottom left window.

----

A problem some mods could have is that they want to modify all of a specific kind of object's properties, yet functions like [[Legacy:Mutator|Mutator]]'s IsRelevant() don't get called on them. This problem can be fixed with the code:

&lt;uscript&gt;
local Object O;

foreach AllObjects(class'object', O)
			if (ClassIsChildOf(Class(O), class'BaseClass'))
				class&lt;BaseClass&gt;(O).default.SomeVariable = SomeValue;
&lt;/uscript&gt;

This code needs only run once, and allows you to change the default properties of any class below some base class.

'''Foxpaw:''' You could do that with a lot less CPU usage by cutting out the middleman:

&lt;uscript&gt;
local Object O;

foreach AllObjects(class'BaseClass', O)
  class&lt;BaseClass&gt;(O).default.SomeVariable = SomeValue;
&lt;/uscript&gt;

'''Mysterial:''' That doesn't work; the iterator would return actual objects, not classes that you could cast like that. Plus, the point is to change the default value for all subclasses of the BaseClass, not BaseClass itself.

'''Foxpaw:''' I see you are right about the class casting. I'm not sure where my head was when I wrote that bit. This one would work - and subclasses of that class will still get the call from the iterator:

&lt;uscript&gt;
local BaseClass O;

foreach AllObjects(class'BaseClass', O)
  O.Class.default.SomeVariable = SomeValue;
&lt;/uscript&gt;

----

'''Mysterial:''' It seems as though Actor references don't get properly set to None in objects not subclassed from Actor. I had an Interaction that set a variable to one of the local pawn's inventory items, and if that pawn died the game would often crash because the variable wasn't None even though the inventory item no longer existed.

In addition, the game will randomly crash during garbage collection if an object that is no longer referenced (for example, a menu long closed) if that object contains an invalid Actor reference. The trademark of such a crash is a long list of (Some Object)-&gt;Serialize strings in the backtrace.

----

'''Foxpaw:''' This works, but is bad mojo. So don't do it. It's probrably unstable. If you have a wierd, really wierd bug, maybe it's caused by something like this. I did it by mistake before I realized that I was using something I hadn't declared in that class, but in a subclass of it.

Ph3AR! A hole in the time-space continuum:

&lt;uscript&gt;
class ImAClass extends Actor;

var Someotherclass Classtastic;

function Ihavefunctions()
{
  ClassTastic.AStruct.Avar = 3;
}
// Blah blah blah.

class ASubclass extends ImAClass;

struct StructDef
{
  var float AVar;
  var string AnotherVar;
}
// And then some...

class Someotherclass extends actor dependson(Asubclass);

var ASubclass.StructDef Astruct;
&lt;/uscript&gt;

Note that we are calling something that hasn't really been defined yet. An even easier way of causng mayhem:

&lt;uscript&gt;
class MyClass extends Actor;
var MySubClass Submarine;

class MySubClass extends MyClass;
&lt;/uscript&gt;

Suffice it to say, don't refer to subclasses of a class within that same class, or the UEd Goblin will eat your babies! Alternatively, this type of wanton class looping results in GPFs if you make a wrong move.

'''Wormbo:''' That second thing works reasonably well with the [[Legacy:Actor|Actor]] class and its Instigator variable which is a [[Legacy:Pawn|Pawn]] reference (subclass of Actor) or its Level variable which a [[Legacy:LevelInfo|LevelInfo]] reference (also a subclass of Actor).

'''Foxpaw:''' Well, yes, it works, it's just that it has a high risk of ceasing to work as a result of changes.. plus it's extremely poor OOP form, if you ask me.

----

'''Foxpaw:''' BSP that is extremely distant seems to not be drawn, or not be drawn properly. I made a cubic brush 2^18 units per side and the surfaces did not show up at all when I subtracted it. A brush 2^17 units per side showed up but had a HOM effect in the editor. Brushes of 2^16 units per side and smaller seem to work fine. This seems to work fine if the surfaces are fake backdrop, however.

'''Birelli:''' To the BSP drawing thing - I imagine that has something to do with textures. When each &quot;tiling&quot; of the texture becomes less than 1 pixel, for instance, the algorithm might start to break down. This wouldn't necessarily happen with fake backdrop because the backdrop isn't drawn the same way.

----

'''Foxpaw:''' I noticed that if you override a function in a subclass that has one or more variables declared as &quot;out&quot; variables, if you change the declaration in the subclass and leave out the &quot;out&quot; keyword, the compiler will accept the new version and that variable will not be treated as an &quot;out&quot; variable for that class and it's subclasses. I'm not sure if this works the other way around. (making a non-out variable an out variable.)

----

'''Foxpaw:''' If you destroy an actor within KImpact, UT2003 gives you a GPF. I believe this is because the list of all colliding actors is generated, then each collision isis evaluated. As a result, after the actor is destroyed other things that were colliding with that actor still want to collide with it an there's a null pointer being accessed within the native code. But that's just speculation on WHY it GPFs. The workaround appears to be setting a flag so the actor can destroy itself in Tick.

'''Mysterial:''' This is true of pretty much every Karma event. In addition, you shouldn't edit the Karma properties of an object in a Karma function, for similar reasons. I *think* there are checks for these kinds of things in UT2004, but I'd take the safe path and just flag things for processing elsewhere.

'''Foxpaw:''' I really hope they do include checks.. I'd really like to be able to destroy objects from within the KImpact event. If one of the ships in my mod hits something going at any kind of speed, it takes damage, which may result in destruction.. so I've had to delay all destruction due to damage to the next tick, which is a bit hackier than I like.

----

'''Foxpaw:''' Apparently, using a reference in the default properties to call an iterator gives an &quot;invalid code token&quot; at runtime. IE, class'Whatever'.default.Singleton.SomeFunction() is okay, but foreach class'Whatever'.default.Singleton.AllObjects( class'etc', etc ) gives the invalid code token. I found this interesting as both seem like function calls and you can use an iterator like that for references not stored in the default properties.

Also AllActors is amazingly slow. A Uscripted Dynamic array with all the same contents can be iterated through in roughly one quarter of the time.

----

From Mod Authoring/Introduction to Gametypes

==Update for UT2K4 :==

'''BigJohn:''' This seems to have changed a bit in Unreal Tournament 2004. In order to make a gametype mod and have it appear under the game list, we now need to have 4 values in our GameType's class' defaultproperties :

&lt;uscript&gt;
class MyGame extends DeathMatch;

defaultproperties
{
   GameName=&quot;My Game&quot;
   Acronym=&quot;MG&quot;
   MapPrefix=&quot;MG&quot;
   Description=&quot;A bloody fight to the death!!!.&quot;
}
&lt;/uscript&gt;

Also, there is no need for the Object line in the game's int file (But you do need the Preferences line!).

Your MyPackage.int should look like this:

&lt;uscript&gt;
[Public]
Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

[MyGame]
GameName=&quot;My Game&quot;
Description=&quot;A bloody fight to the death!!!.&quot;
&lt;/uscript&gt;

You can use the command 

ucc dumpint MyGame.u 

to create the [MyGame] section in the .int file.

UCC can generate a .ucl file from our package's .u file. This can be achieved by typing this command:

ucc exportcache MyGame.u MyGame.ucl

Once this is done, the only thing left is to have a map in the UT2004\Maps folder with the appropriate prefix, in the above case MG.

----

'''Tarquin:''' We can't edit these pages because they are by Epic. Please can we find another home for the above piece of text?

Co11: Also, for ut2004.. it seems that Deathmatchplus and TeamGamePlus are no longer functional. Try just Deathmatch and TeamGame.

'''Wormbo:''' As stated on [[Legacy:Mod Authoring|Mod Authoring]] this whole tutorial is only for [[Legacy:UT|UT]], not for newer engine versions. For anything else go to [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] or [[Legacy:Making Mods|Making Mods]].

[[:Category:Legacy To Do]] &amp;rarr; Move content to the correct pages.

----

'''Foxpaw:''' I noticed something interesting today, apparently function arguments in subclasses need not have the same names as their original declarations, as long as they are of the same type and in the same order. IE, the following is valid:

&lt;uscript&gt;
class A extends Object;

function F( float P )
{
  // Do Stuff.
}
&lt;/uscript&gt;

&lt;uscript&gt;
class B extends A;

function F( float Q )
{
  Super.F( Q );

  // Do some other stuff.
}
&lt;/uscript&gt;

Of questionable value, but it's possible. I noticed that some of Epic's code uses &quot;dt&quot; as the argument name for tick some places instead of &quot;Delta,&quot; so I tested it in my own code and it seems to work.

'''MythOpus:''' Yep :D  I caught on to that quite quickly.  It helps to give more descriptive names to arguments in your code, rather than using epics stuff.

'''Mychaeel:''' Indeed.  Usually, in any object-oriented language, only the function prototype &amp;ndash; i.e. the function name, its return type and its parameter types, but not the symbolic parameter names &amp;ndash; are relevant for resolving a function reference.  (In many languages which support function pre-declaration, it's even valid to leave the parameter names out: &lt;code&gt;void foo(float, int)&lt;/code&gt; is perfectly valid in C and C++.)

----

'''Blip2:''' I found this cool program for the text colours in UT this apparently causes problems with names but I have found it is useful with in-game coloured messages I would write happily write a paragraph or two about how to do this and where to get this program if I knew where to write it (any ideas?)
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IndianPsycho</title>
    <id>1507</id>
    <revision>
      <id>3772</id>
      <timestamp>2004-04-10T08:05:21Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello there.

===Unreal Engine===

My current project is a port of ye olde game &quot;Wheel of Time&quot; to the 2K3/2K4 platform, in the form of [http://mod.maqn.com/ Legend of the Serilim]. I'm one of two coders on the project, though occasionally we get unofficial help from [[Legacy:Haral|Haral]].

My [[Legacy:IndianPsycho/Developer Journal|Developer Journal]] is about this project and nothing else.

----

'''IndianPsycho:''' I'm just trying to get used to this :)

'''EntropicLqd:''' Hi there.  Welcome to the Wiki.  Enjoy your stay.

'''Tarquin:''' Hi, welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3773</id>
      <timestamp>2004-04-10T02:05:52Z</timestamp>
      <contributor>
        <ip>IndianPsycho</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hello there.

===Unreal Engine===

My current project is a port of ye olde game &quot;Wheel of Time&quot; to the 2K3/2K4 platform, in the form of [http://mod.maqn.com/ Legend of the Serilim]. I'm one of two coders on the project, though occasionally we get unofficial help from [[Legacy:Haral|Haral]].

My [[Legacy:IndianPsycho/Developer Journal|Developer Journal]] is about this project and nothing else.

----

'''IndianPsycho:''' I'm just trying to get used to this :)

'''EntropicLqd:''' Hi there.  Welcome to the Wiki.  Enjoy your stay.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IndianPsycho/Developer Journal</title>
    <id>1508</id>
    <revision>
      <id>3774</id>
      <timestamp>2004-04-11T21:30:41Z</timestamp>
      <contributor>
        <ip>IndianPsycho</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| April 11th, 2004}}
: Game now installs the JoinTeamInteraction as soon as a player joins the game. It's more a hack than a fix, but whatever. Next up is forcing playermodels on a team basis. I've a feeling that this shouldn't be so hard. My feelings usually turn out to be completely wrong though.

: '''''Later that day'''''
: Well that wasn't so hard :D I've added the force playermodel/sounds/skins/whatever on a per-team basis. Since it didn't take that long I've changed it a bit so hypothetical modteams can customize alot of the playerclass related stuff. Currently it's all routed via my custom SpeciesType. Also customized the casting system so some weapon-effects change their look depending on your PlayerClass (on your SpeciesType, to be more precise).

{{classbox| April 10th, 2004}}
: I'm currently struggling with PlayerController.Player being None. When I call a Server -&gt; Client replicated function, which is supposed to install an Interaction, from my gametype's PostLogin() it throws a bunch of accessed nones at me. To make matters worse, it throws these accessed nones at me in the client log. I know Player is not replicated to the server, so I am confused as to why it is none. What's even more confusing is the fact that it is only none at certain moments; in PostLogin() or in general in any and all functions which are called right after the PlayerController is first spawned, such as PostBeginPlay() and RestartPlayer(). If I create an exec function which calls the ''same function'' as PostBeginPlay(), Player suddenly ''isn't'' None anymore!
: Others have suggested doing this via the Mutator way, but since I'm working on a Total Conversion this seems ''really'' silly to me. I ''have'' tried it (more out of boredom than out of any hope for success), however I run into the same problem. The way I did it was to keep a clientside bool var in my Playercontroller class which was true if the interaction needed to be installed and false if not. I then had the mutator's ModifyLogin (and when that didn't work the Mutator's ModifyPlayer) check for that var and if true call the Server -&gt; Client replicated function in my PlayerController class. Still no luck.
: Currently I've overidden RestartPlayer in my gameinfo, using basically the same method as with the mutator, only now without the mutator. Player is still none the first time it tries to install the interaction, however as soon as the player dies and then respawns (IE when RestartPlayer is called again) Player is not None anymore, it installs the interaction, sets the bool to false and everything is well and good. This is however unacceptable since the idea is that players should be able to join teams via this interaction, so I need this interaction to be installed ''as soon as a player joins the game''. Not as soon as a player has joined the game and then has suicided and respawned.

==Discussion==

'''GRAF1K:''' I may be speaking complete giberish, but:

&lt;uscript&gt;
// Instead of RestartPlayer, use this

event PlayerController Login( string Portal, string Options, out string Error )
{
    // Blah blah blah
}

// To avoid acessed nones, use
if ( PlayerController(Other) != None )
{
    // Blah blah blah
}
&lt;/uscript&gt;

Hope this helps. :)

'''IndianPsycho:''' That's what I originally used, except not Login, but PostLogin. The problem isn't that NewPlayer == None, rather NewPlayer.Player is none. :)</text>
    </revision>
    <revision>
      <id>3775</id>
      <timestamp>2004-04-10T04:01:20Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| April 10th, 2004}}
: I'm currently struggling with PlayerController.Player being None. When I call a Server -&gt; Client replicated function, which is supposed to install an Interaction, from my gametype's PostLogin() it throws a bunch of accessed nones at me. To make matters worse, it throws these accessed nones at me in the client log. I know Player is not replicated to the server, so I am confused as to why it is none. What's even more confusing is the fact that it is only none at certain moments; in PostLogin() or in general in any and all functions which are called right after the PlayerController is first spawned, such as PostBeginPlay() and RestartPlayer(). If I create an exec function which calls the ''same function'' as PostBeginPlay(), Player suddenly ''isn't'' None anymore!
: Others have suggested doing this via the Mutator way, but since I'm working on a Total Conversion this seems ''really'' silly to me. I ''have'' tried it (more out of boredom than out of any hope for success), however I run into the same problem. The way I did it was to keep a clientside bool var in my Playercontroller class which was true if the interaction needed to be installed and false if not. I then had the mutator's ModifyLogin (and when that didn't work the Mutator's ModifyPlayer) check for that var and if true call the Server -&gt; Client replicated function in my PlayerController class. Still no luck.
: Currently I've overidden RestartPlayer in my gameinfo, using basically the same method as with the mutator, only now without the mutator. Player is still none the first time it tries to install the interaction, however as soon as the player dies and then respawns (IE when RestartPlayer is called again) Player is not None anymore, it installs the interaction, sets the bool to false and everything is well and good. This is however unacceptable since the idea is that players should be able to join teams via this interaction, so I need this interaction to be installed ''as soon as a player joins the game''. Not as soon as a player has joined the game and then has suicided and respawned.

==Discussion==

'''GRAF1K:''' I may be speaking complete giberish, but:

&lt;uscript&gt;
// Instead of RestartPlayer, use this

event PlayerController Login( string Portal, string Options, out string Error )
{
    // Blah blah blah
}

// To avoid acessed nones, use
if ( PlayerController(Other) != None )
{
    // Blah blah blah
}
&lt;/uscript&gt;

Hope this helps. :)</text>
    </revision>
    <revision>
      <id>3776</id>
      <timestamp>2004-04-11T12:51:42Z</timestamp>
      <contributor>
        <ip>IndianPsycho</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| April 10th, 2004}}
: I'm currently struggling with PlayerController.Player being None. When I call a Server -&gt; Client replicated function, which is supposed to install an Interaction, from my gametype's PostLogin() it throws a bunch of accessed nones at me. To make matters worse, it throws these accessed nones at me in the client log. I know Player is not replicated to the server, so I am confused as to why it is none. What's even more confusing is the fact that it is only none at certain moments; in PostLogin() or in general in any and all functions which are called right after the PlayerController is first spawned, such as PostBeginPlay() and RestartPlayer(). If I create an exec function which calls the ''same function'' as PostBeginPlay(), Player suddenly ''isn't'' None anymore!
: Others have suggested doing this via the Mutator way, but since I'm working on a Total Conversion this seems ''really'' silly to me. I ''have'' tried it (more out of boredom than out of any hope for success), however I run into the same problem. The way I did it was to keep a clientside bool var in my Playercontroller class which was true if the interaction needed to be installed and false if not. I then had the mutator's ModifyLogin (and when that didn't work the Mutator's ModifyPlayer) check for that var and if true call the Server -&gt; Client replicated function in my PlayerController class. Still no luck.
: Currently I've overidden RestartPlayer in my gameinfo, using basically the same method as with the mutator, only now without the mutator. Player is still none the first time it tries to install the interaction, however as soon as the player dies and then respawns (IE when RestartPlayer is called again) Player is not None anymore, it installs the interaction, sets the bool to false and everything is well and good. This is however unacceptable since the idea is that players should be able to join teams via this interaction, so I need this interaction to be installed ''as soon as a player joins the game''. Not as soon as a player has joined the game and then has suicided and respawned.

{{classbox| April 11th, 2004}}
: Game now installs the JoinTeamInteraction as soon as a player joins the game. It's more a hack than a fix, but whatever. Next up is forcing playermodels on a team basis. I've a feeling that this shouldn't be so hard. My feelings usually turn out to be completely wrong though.

==Discussion==

'''GRAF1K:''' I may be speaking complete giberish, but:

&lt;uscript&gt;
// Instead of RestartPlayer, use this

event PlayerController Login( string Portal, string Options, out string Error )
{
    // Blah blah blah
}

// To avoid acessed nones, use
if ( PlayerController(Other) != None )
{
    // Blah blah blah
}
&lt;/uscript&gt;

Hope this helps. :)

'''IndianPsycho:''' That's what I originally used, except not Login, but PostLogin. The problem isn't that NewPlayer == None, rather NewPlayer.Player is none. :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Info</title>
    <id>1453</id>
    <revision>
      <id>3653</id>
      <timestamp>2006-04-06T22:21:13Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Info (Package: Engine)}}

Abstract base class of all information holding classes.

See [[Legacy:Info (UT)|Info (UT)]] for the UT version of this class.

==Properties ==

The Info class itself has no new properties, but it hides the following [[Legacy:Actor|Actor]] class property groups in the [[Legacy:Actor Properties|Actor Properties]] window: Movement, Collision, Lighting, LightColor, Karma and Force

Actor class properties are not replicated for Info subclasses unless they explicitely set &lt;code&gt;bSkipActorPropertyReplication&lt;/code&gt; to False again. Also the Info (sub)class properties are only replicated when they change. However, by default the Info class's &lt;code&gt;RemoteRole&lt;/code&gt; is set to ROLE_None, so replication is completely disabled.

==Methods ==
; FillPlayInfo ([[Legacy:PlayInfo|PlayInfo]] PlayInfo) [static] : 
; bool AcceptPlayInfoProperty (string PropertyName) : 

==Known Subclases ==

===Placeable Subclasses ===

Subclasses which are either placeable themselves or that have placeable subclasses.
* [[Legacy:CameraTextureClient|CameraTextureClient]]
* [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]
* [[Legacy:MessageTextureClient|MessageTextureClient]]
* [[Legacy:SceneManager|SceneManager]]
* [[Legacy:TerrainInfo|TerrainInfo]]
* [[Legacy:ZoneInfo|ZoneInfo]]

===Not-Placeable Subclasses ===
* [[Legacy:AccessControl|AccessControl]]
* [[Legacy:AnnounceAdrenaline|AnnounceAdrenaline]]
* [[Legacy:BroadcastHandler|BroadcastHandler]]
* [[Legacy:Combo|Combo]] &amp;ndash; adrenaline combos
* [[Legacy:FileLog|FileLog]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:GameRules|GameRules]]
* [[Legacy:GameStats|GameStats]]
* [[Legacy:InternetInfo|InternetInfo]]
* [[Legacy:LevelGameRules|LevelGameRules]]
* [[Legacy:LocalMessage|LocalMessage]]
* [[Legacy:MapList|MapList]]
* [[Legacy:MasterServerLink|MasterServerLink]]
* [[Legacy:Mutator|Mutator]]
* [[Legacy:PotentialClimbWatcher|PotentialClimbWatcher]]
* [[Legacy:ReplicationInfo|ReplicationInfo]]
* [[Legacy:RestingFormation|RestingFormation]]
* [[Legacy:SavedMove|SavedMove]]
* [[Legacy:ScoreBoard|ScoreBoard]]
* [[Legacy:Security|Security]]
* [[Legacy:TeamAI|TeamAI]]
* [[Legacy:UDamageTimer|UDamageTimer]]
* [[Legacy:VoicePack|VoicePack]]

===UT2004 Only===
* [[Legacy:AnnounceQueueManager|AnnounceQueueManager]]
* [[Legacy:AnnouncerVoice|AnnouncerVoice]]
** [[Legacy:ClassicAnnouncer|ClassicAnnouncer]]
** [[Legacy:FemaleAnnouncer|FemaleAnnouncer]]
** [[Legacy:MaleAnnouncer|MaleAnnouncer]]
** [[Legacy:SexyFemaleAnnouncer|SexyFemaleAnnouncer]]
** [[Legacy:UTClassicAnnouncer|UTClassicAnnouncer]]
* [[Legacy:ASCinematic_SceneManager|ASCinematic_SceneManager]]
* [[Legacy:MapListLoader|MapListLoader]]
** [[Legacy:DefaultMapListLoader|DefaultMapListLoader]]
* [[Legacy:MapListManagerBase|MapListManagerBase]]
** [[Legacy:MapListManager|MapListManager]]
* [[Legacy:ObjectiveProgressDisplay|ObjectiveProgressDisplay]]
* [[Legacy:PlayerChatManager|PlayerChatManager]]
* [[Legacy:UnrealPlayerChatManager|UnrealPlayerChatManager]]
* [[Legacy:PlayerSpawnManager|PlayerSpawnManager]]
* [[Legacy:PowerLink|PowerLink]]
* [[Legacy:SceneSubtitles|SceneSubtitles]]
* [[Legacy:VoiceChatRoom|VoiceChatRoom]]
** [[Legacy:UnrealChatRoom|UnrealChatRoom]]
*** [[Legacy:UnrealTeamChatRoom|UnrealTeamChatRoom]]
* [[Legacy:VolumeTimer|VolumeTimer]]
* [[Legacy:VotingHandler|VotingHandler]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3654</id>
      <timestamp>2006-04-06T21:06:46Z</timestamp>
      <contributor>
        <ip>Cdn-ce-chi-t2-05.area4.il.chicago.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Info (Package: Engine)}}

Abstract base class of all information holding classes.

See [[Legacy:Info (UT)|Info (UT)]] for the UT version of this class.

==Properties ==

The Info class itself has no new properties, but it hides the following [[Legacy:Actor|Actor]] class property groups in the [[Legacy:Actor Properties|Actor Properties]] window: Movement, Collision, Lighting, LightColor, Karma and Force

Actor class properties are not replicated for Info subclasses unless they explicitely set &lt;code&gt;bSkipActorPropertyReplication&lt;/code&gt; to False again. Also the Info (sub)class properties are only replicated when they change. However, by default the Info class's &lt;code&gt;RemoteRole&lt;/code&gt; is set to ROLE_None, so replication is completely disabled.

==Methods ==
; FillPlayInfo ([[Legacy:PlayInfo|PlayInfo]] PlayInfo) [static] : 
; bool AcceptPlayInfoProperty (string PropertyName) : 

==Known Subclases ==

===Placeable Subclasses ===

Subclasses which are either placeable themselves or that have placeable subclasses.
* [[Legacy:CameraTextureClient|CameraTextureClient]]
* [[Legacy:FluidSurfaceInfo|FluidSurfaceInfo]]
* [[Legacy:MessageTextureClient|MessageTextureClient]]
* [[Legacy:SceneManager|SceneManager]]
* [[Legacy:TerrainInfo|TerrainInfo]]
* [[Legacy:ZoneInfo|ZoneInfo]]

===Not-Placeable Subclasses ===
* [[Legacy:AccessControl|AccessControl]]
* [[Legacy:AnnounceAdrenaline|AnnounceAdrenaline]]
* [[Legacy:BroadcastHandler|BroadcastHandler]]
* [[Legacy:Combo|Combo]] &amp;ndash; adrenaline combos
* [[Legacy:FileLog|FileLog]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:GameRules|GameRules]]
* [[Legacy:GameStats|GameStats]]
* [[Legacy:InternetInfo|InternetInfo]]
* [[Legacy:LevelGameRules|LevelGameRules]]
* [[Legacy:LocalMessage|LocalMessage]]
* [[Legacy:MapList|MapList]]
* [[Legacy:MasterServerLink|MasterServerLink]]
* [[Legacy:Mutator|Mutator]]
* [[Legacy:PotentialClimbWatcher|PotentialClimbWatcher]]
* [[Legacy:ReplicationInfo|ReplicationInfo]]
* [[Legacy:RestingFormation|RestingFormation]]
* [[Legacy:SavedMove|SavedMove]]
* [[Legacy:ScoreBoard|ScoreBoard]]
* [[Legacy:Security|Security]]
* [[Legacy:TeamAI|TeamAI]]
* [[Legacy:UDamageTimer|UDamageTimer]]
* [[Legacy:VoicePack|VoicePack]]

===UT2004 Only===
* [[Legacy:AnnounceQueueManager|AnnounceQueueManager]]
* [[Legacy:AnnouncerVoice|AnnouncerVoice]]
** [[Legacy:ClassicAnnouncer|ClassicAnnouncer]]
** [[Legacy:FemaleAnnouncer|FemaleAnnouncer]]
** [[Legacy:MaleAnnouncer|MaleAnnouncer]]
** [[Legacy:SexyFemaleAnnouncer|SexyFemaleAnnouncer]]
** [[Legacy:UTClassicAnnouncer|UTClassicAnnouncer]]
* [[Legacy:ASCinematic_SceneManager|ASCinematic_SceneManager]]
* [[Legacy:MapListLoader|MapListLoader]]
** [[Legacy:DefaultMapListLoader|DefaultMapListLoader]]
* [[Legacy:MapListManagerBase|MapListManagerBase]]
** [[Legacy:MapListManager|MapListManager]]
* [[Legacy:ObjectiveProgressDisplay|ObjectiveProgressDisplay]]
* [[Legacy:PlayerChatManager|PlayerChatManager]]
* [[Legacy:UnrealPlayerChatManager|UnrealPlayerChatManager]]
* [[Legacy:PlayerSpawnManager|PlayerSpawnManager]]
* [[Legacy:PowerLink|PowerLink]]
* [[Legacy:SceneSubtitles|SceneSubtitles]]
* [[Legacy:VoiceChatRoom|VoiceChatRoom]]
** [[Legacy:UnrealChatRoom|UnrealChatRoom]]
*** [[Legacy:UnrealTeamChatRoom|UnrealTeamChatRoom]]
* [[Legacy:VolumeTimer|VolumeTimer]]
* [[Legacy:VotingHandler|VotingHandler]]

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Info (DX)</title>
    <id>28509</id>
    <revision>
      <id>40210</id>
      <timestamp>2009-11-17T11:00:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Info (UT)</title>
    <id>1480</id>
    <revision>
      <id>3715</id>
      <timestamp>2004-11-24T14:02:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>categorized as UT class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Info (Package: Engine)}}

This is the abstract base class for... uhh... everything that doesn't fit in anywhere else.  (Since by principle ''all'' classes &quot;hold information,&quot; there's not much more to say for it.)

The Info class doesn't declare new or override a parent class's properties or methods.

See [[Legacy:Info|Info]] for the UT2003 version of this class.

==Known subclasses ==
*[[Legacy:AssaultInfo|AssaultInfo]]
*[[Legacy:BotInfo|BotInfo]]
*[[Legacy:ChallengeBotInfo|ChallengeBotInfo]]
*[[Legacy:ClientScriptedTexture|ClientScriptedTexture]]
*[[Legacy:CodeMaster|CodeMaster]]
*[[Legacy:EndStats|EndStats]]
*[[Legacy:FontInfo|FontInfo]]
*[[Legacy:GameInfo (UT)|GameInfo (UT)]]
*[[Legacy:InternetInfo|InternetInfo]]
*[[Legacy:Ladder (UT)|Ladder (UT)]]
*[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
*[[Legacy:MapList|MapList]]
*[[Legacy:MeshActor|MeshActor]]
*[[Legacy:Mutator (UT)|Mutator (UT)]]
*[[Legacy:NewGameInterimObject|NewGameInterimObject]]
*[[Legacy:RatedMatchInfo|RatedMatchInfo]]
*[[Legacy:RatedTeamInfo|RatedTeamInfo]]
*[[Legacy:ReplicationInfo|ReplicationInfo]]
*[[Legacy:SavedMove|SavedMove]]
*[[Legacy:ScoreBoard|ScoreBoard]]
*[[Legacy:Screen|ScreenSlide]] ([[Legacy:Screen|Screen]])
*[[Legacy:SelectionDude|SelectionDude]]
*[[Legacy:ServerInfo|ServerInfo]]
*[[Legacy:StatLog|StatLog]]
*[[Legacy:TeamInfo (UT)|TeamInfo (UT)]]
*[[Legacy:TestInfo|TestInfo]]
*[[Legacy:VoicePack|VoicePack]]
*[[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]: defines a zone in a map.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3716</id>
      <timestamp>2004-06-22T11:08:12Z</timestamp>
      <contributor>
        <ip>64-216-188-204.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>&quot;Mutator&quot; should not link to a UT2003 class.</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Info}}

This is the abstract base class for... uhh... everything that doesn't fit in anywhere else.  (Since by principle ''all'' classes &quot;hold information,&quot; there's not much more to say for it.)

The Info class doesn't declare new or override a parent class's properties or methods.

See [[Legacy:Info|Info]] for the UT2003 version of this class.

==Known subclasses ==
*[[Legacy:AssaultInfo|AssaultInfo]]
*[[Legacy:BotInfo|BotInfo]]
*[[Legacy:ChallengeBotInfo|ChallengeBotInfo]]
*[[Legacy:ClientScriptedTexture|ClientScriptedTexture]]
*[[Legacy:CodeMaster|CodeMaster]]
*[[Legacy:EndStats|EndStats]]
*[[Legacy:FontInfo|FontInfo]]
*[[Legacy:GameInfo (UT)|GameInfo (UT)]]
*[[Legacy:InternetInfo|InternetInfo]]
*[[Legacy:Ladder (UT)|Ladder (UT)]]
*[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]
*[[Legacy:MapList|MapList]]
*[[Legacy:MeshActor|MeshActor]]
*[[Legacy:Mutator (UT)|Mutator (UT)]]
*[[Legacy:NewGameInterimObject|NewGameInterimObject]]
*[[Legacy:RatedMatchInfo|RatedMatchInfo]]
*[[Legacy:RatedTeamInfo|RatedTeamInfo]]
*[[Legacy:ReplicationInfo|ReplicationInfo]]
*[[Legacy:SavedMove|SavedMove]]
*[[Legacy:ScoreBoard|ScoreBoard]]
*[[Legacy:Screen|ScreenSlide]] ([[Legacy:Screen|Screen]])
*[[Legacy:SelectionDude|SelectionDude]]
*[[Legacy:ServerInfo|ServerInfo]]
*[[Legacy:StatLog|StatLog]]
*[[Legacy:TeamInfo (UT)|TeamInfo (UT)]]
*[[Legacy:TestInfo|TestInfo]]
*[[Legacy:VoicePack|VoicePack]]
*[[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]: defines a zone in a map.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Info Class Hierarchy (P2)</title>
    <id>1511</id>
    <revision>
      <id>3782</id>
      <timestamp>2007-08-07T18:58:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">This page is a list of [[Legacy:Actor|Actor]]s that extend from [[Legacy:Info|Info]] in [[Legacy:Postal 2|Postal 2]].

An ellipsis (...) indicates the class tree is expanded on the parent's class information page.

 [[Legacy:Info|Info]]
 +- [[Legacy:AccessControl|AccessControl]]
 +- [[Legacy:BroadcastHandler|BroadcastHandler]]
 +- [[Legacy:Chameleon|Chameleon]]
 +- [[Legacy:ChamelHead|ChamelHead]]
 +- [[Legacy:FileLog|FileLog]]
 +- [[Legacy:FontInfo|FontInfo]]
 +- [[Legacy:FPSDialog|FPSDialog]]
 |  +- [[Legacy:P2Dialog|P2Dialog]]
 |     +- DialogGeneric
 |        +- DialogFemale
 |           +- DialogFemaleCop
 |        +- DialogGary
 |        +- DialogMale
 |           +- DialogDude
 |           +- DialogHabib
 |              +- DialogFanatic
 |           +- DialogKrotchy
 |           +- DialogMaleCop
 |              +- DialogMaleMilitary
 |           +- DialogPriest
 |           +- DialogRedneck
 |           +- DialogRobber
 |           +- DialogVince
 +- [[Legacy:GameInfo|GameInfo]]
 |  +- [[Legacy:FPSGameInfo|FPSGameInfo]]
 |     +- [[Legacy:P2GameInfo|P2GameInfo]]
 |        +- [[Legacy:P2GameInfoMulti|P2GameInfoMulti]]
 |        |  +- [[Legacy:MPGameInfo|MPGameInfo]]
 |        |     +- [[Legacy:DeathMatch (P2)|DeathMatch (P2)]]
 |        |        +- [[Legacy:GrabBagGame|GrabBagGame]]
 |        |        |  +- [[Legacy:XGrabBag|xGrabBag]]
 |        |        +- [[Legacy:TeamGame (P2)|TeamGame (P2)]]
 |        |        |  +- [[Legacy:CTFGame (P2)|CTFGame (P2)]]
 |        |        |  |  +- [[Legacy:XCTFGame (P2)|xCTFGame (P2)]]
 |        |        |  +- [[Legacy:XTeamGame (P2)|xTeamGame (P2)]]
 |        |        +- [[Legacy:XDeathMatch (P2)|xDeathMatch (P2)]]
 |        +- [[Legacy:P2GameInfoSingle|P2GameInfoSingle]]
 |           +- [[Legacy:GameSinglePlayer|GameSinglePlayer]]
 |           +- GameSinglePlayerDemo
 +- [[Legacy:GameRules|GameRules]]
 +- [[Legacy:GameStats|GameStats]]
 |  +- [[Legacy:MPGameStats (P2)|MPGameStats (P2)]]
 +- [[Legacy:InternetInfo|InternetInfo]]
 |  +- &lt;i&gt;not expanded&lt;/i&gt;
 +- [[Legacy:LevelGameRules (P2)|LevelGameRules (P2)]]
 |  +- [[Legacy:LevelGamePlay|LevelGamePlay]]
 +- [[Legacy:LocalMessage|LocalMessage]]
 |  +- [[Legacy:GameMessage|GameMessage]]
 |  |  +- [[Legacy:GameMessagePlus|GameMessagePlus]]
 |  +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
 |     +- ...
 +- [[Legacy:MapList|MapList]]
 |  +- CTFMapList
 |  +- DMMapList
 |  +- GBMapList
 |  +- TDMMapList
 +- [[Legacy:MatchIntro|MatchIntro]]
 |  +- [[Legacy:TeamIntro|TeamIntro]]
 +- [[Legacy:Mutator|Mutator]]
 |  +- [[Legacy:DMMutator (P2)|DMMutator (P2)]]
 |  |  +- [[Legacy:XMutator (P2)|xMutator (P2)]]
 |  +- MutAlwaysGib
 |  +- MutCTFNoTouchReturns
 |  +- MutGBDoubleStrength
 |  +- MutInstaKill
 |  +- MutLowGrav
 |  +- MutNoCrack
 |  +- MutNoSavedHealth
 +- [[Legacy:PotentialClimbWatcher|PotentialClimbWatcher]]
 +- [[Legacy:ReplicationInfo|ReplicationInfo]]

This page is unfinished.

[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3783</id>
      <timestamp>2006-12-30T09:28:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is a list of [[Legacy:Actor|Actor]]s that extend from [[Legacy:Info|Info]] in [[Legacy:Postal 2|Postal 2]].

An ellipsis (...) indicates the class tree is expanded on the parent's class information page.

 [[Legacy:Info|Info]]
 +- [[Legacy:AccessControl|AccessControl]]
 +- [[Legacy:BroadcastHandler|BroadcastHandler]]
 +- [[Legacy:Chameleon|Chameleon]]
 +- [[Legacy:ChamelHead|ChamelHead]]
 +- [[Legacy:FileLog|FileLog]]
 +- [[Legacy:FontInfo|FontInfo]]
 +- [[Legacy:FPSDialog|FPSDialog]]
 |  +- [[Legacy:P2Dialog|P2Dialog]]
 |     +- DialogGeneric
 |        +- DialogFemale
 |           +- DialogFemaleCop
 |        +- DialogGary
 |        +- DialogMale
 |           +- DialogDude
 |           +- DialogHabib
 |              +- DialogFanatic
 |           +- DialogKrotchy
 |           +- DialogMaleCop
 |              +- DialogMaleMilitary
 |           +- DialogPriest
 |           +- DialogRedneck
 |           +- DialogRobber
 |           +- DialogVince
 +- [[Legacy:GameInfo|GameInfo]]
 |  +- [[Legacy:FPSGameInfo|FPSGameInfo]]
 |     +- [[Legacy:P2GameInfo|P2GameInfo]]
 |        +- [[Legacy:P2GameInfoMulti|P2GameInfoMulti]]
 |        |  +- [[Legacy:MPGameInfo|MPGameInfo]]
 |        |     +- [[Legacy:DeathMatch (P2)|DeathMatch (P2)]]
 |        |        +- [[Legacy:GrabBagGame|GrabBagGame]]
 |        |        |  +- [[Legacy:XGrabBag|xGrabBag]]
 |        |        +- [[Legacy:TeamGame (P2)|TeamGame (P2)]]
 |        |        |  +- [[Legacy:CTFGame (P2)|CTFGame (P2)]]
 |        |        |  |  +- [[Legacy:XCTFGame (P2)|xCTFGame (P2)]]
 |        |        |  +- [[Legacy:XTeamGame (P2)|xTeamGame (P2)]]
 |        |        +- [[Legacy:XDeathMatch (P2)|xDeathMatch (P2)]]
 |        +- [[Legacy:P2GameInfoSingle|P2GameInfoSingle]]
 |           +- [[Legacy:GameSinglePlayer|GameSinglePlayer]]
 |           +- GameSinglePlayerDemo
 +- [[Legacy:GameRules|GameRules]]
 +- [[Legacy:GameStats|GameStats]]
 |  +- [[Legacy:MPGameStats (P2)|MPGameStats (P2)]]
 +- [[Legacy:InternetInfo|InternetInfo]]
 |  +- &lt;i&gt;not expanded&lt;/i&gt;
 +- [[Legacy:LevelGameRules (P2)|LevelGameRules (P2)]]
 |  +- [[Legacy:LevelGamePlay|LevelGamePlay]]
 +- [[Legacy:LocalMessage|LocalMessage]]
 |  +- [[Legacy:GameMessage|GameMessage]]
 |  |  +- [[Legacy:GameMessagePlus|GameMessagePlus]]
 |  +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
 |     +- ...
 +- [[Legacy:MapList|MapList]]
 |  +- CTFMapList
 |  +- DMMapList
 |  +- GBMapList
 |  +- TDMMapList
 +- [[Legacy:MatchIntro|MatchIntro]]
 |  +- [[Legacy:TeamIntro|TeamIntro]]
 +- [[Legacy:Mutator|Mutator]]
 |  +- [[Legacy:DMMutator (P2)|DMMutator (P2)]]
 |  |  +- [[Legacy:XMutator (P2)|xMutator (P2)]]
 |  +- MutAlwaysGib
 |  +- MutCTFNoTouchReturns
 |  +- MutGBDoubleStrength
 |  +- MutInstaKill
 |  +- MutLowGrav
 |  +- MutNoCrack
 |  +- MutNoSavedHealth
 +- [[Legacy:PotentialClimbWatcher|PotentialClimbWatcher]]
 +- [[Legacy:ReplicationInfo|ReplicationInfo]]

This page is unfinished.

[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3784</id>
      <timestamp>2007-08-07T14:50:26Z</timestamp>
      <contributor>
        <ip>Echo474.server4you.de</ip>
      </contributor>
      <comment>*Info Class Hierarchy (P2)</comment>
      <text xml:space="preserve">This page is a list of [[Legacy:Actor|Actor]]s that extend from [[Legacy:Info|Info]] in [[Legacy:Postal 2|Postal 2]].

An ellipsis (...) indicates the class tree is expanded on the parent's class information page.

 [[Legacy:Info|Info]]
 +- [[Legacy:AccessControl|AccessControl]]
 +- [[Legacy:BroadcastHandler|BroadcastHandler]]
 +- [[Legacy:Chameleon|Chameleon]]
 +- [[Legacy:ChamelHead|ChamelHead]]
 +- [[Legacy:FileLog|FileLog]]
 +- [[Legacy:FontInfo|FontInfo]]
 +- [[Legacy:FPSDialog|FPSDialog]]
 |  +- [[Legacy:P2Dialog|P2Dialog]]
 |     +- DialogGeneric
 |        +- DialogFemale
 |           +- DialogFemaleCop
 |        +- DialogGary
 |        +- DialogMale
 |           +- DialogDude
 |           +- DialogHabib
 |              +- DialogFanatic
 |           +- DialogKrotchy
 |           +- DialogMaleCop
 |              +- DialogMaleMilitary
 |           +- DialogPriest
 |           +- DialogRedneck
 |           +- DialogRobber
 |           +- DialogVince
 +- [[Legacy:GameInfo|GameInfo]]
 |  +- [[Legacy:FPSGameInfo|FPSGameInfo]]
 |     +- [[Legacy:P2GameInfo|P2GameInfo]]
 |        +- [[Legacy:P2GameInfoMulti|P2GameInfoMulti]]
 |        |  +- [[Legacy:MPGameInfo|MPGameInfo]]
 |        |     +- [[Legacy:DeathMatch (P2)|DeathMatch (P2)]]
 |        |        +- [[Legacy:GrabBagGame|GrabBagGame]]
 |        |        |  +- [[Legacy:XGrabBag|xGrabBag]]
 |        |        +- [[Legacy:TeamGame (P2)|TeamGame (P2)]]
 |        |        |  +- [[Legacy:CTFGame (P2)|CTFGame (P2)]]
 |        |        |  |  +- [[Legacy:XCTFGame (P2)|xCTFGame (P2)]]
 |        |        |  +- [[Legacy:XTeamGame (P2)|xTeamGame (P2)]]
 |        |        +- [[Legacy:XDeathMatch (P2)|xDeathMatch (P2)]]
 |        +- [[Legacy:P2GameInfoSingle|P2GameInfoSingle]]
 |           +- [[Legacy:GameSinglePlayer|GameSinglePlayer]]
 |           +- GameSinglePlayerDemo
 +- [[Legacy:GameRules|GameRules]]
 +- [[Legacy:GameStats|GameStats]]
 |  +- [[Legacy:MPGameStats (P2)|MPGameStats (P2)]]
 +- [[Legacy:InternetInfo|InternetInfo]]
 |  +- &lt;i&gt;not expanded&lt;/i&gt;
 +- [[Legacy:LevelGameRules (P2)|LevelGameRules (P2)]]
 |  +- [[Legacy:LevelGamePlay|LevelGamePlay]]
 +- [[Legacy:LocalMessage|LocalMessage]]
 |  +- [[Legacy:GameMessage|GameMessage]]
 |  |  +- [[Legacy:GameMessagePlus|GameMessagePlus]]
 |  +- [[Legacy:LocalMessagePlus|LocalMessagePlus]]
 |     +- ...
 +- [[Legacy:MapList|MapList]]
 |  +- CTFMapList
 |  +- DMMapList
 |  +- GBMapList
 |  +- TDMMapList
 +- [[Legacy:MatchIntro|MatchIntro]]
 |  +- [[Legacy:TeamIntro|TeamIntro]]
 +- [[Legacy:Mutator|Mutator]]
 |  +- [[Legacy:DMMutator (P2)|DMMutator (P2)]]
 |  |  +- [[Legacy:XMutator (P2)|xMutator (P2)]]
 |  +- MutAlwaysGib
 |  +- MutCTFNoTouchReturns
 |  +- MutGBDoubleStrength
 |  +- MutInstaKill
 |  +- MutLowGrav
 |  +- MutNoCrack
 |  +- MutNoSavedHealth
 +- [[Legacy:PotentialClimbWatcher|PotentialClimbWatcher]]
 +- [[Legacy:ReplicationInfo|ReplicationInfo]]

This page is [http://www.humanwebmarketing.com/ web marketing]

unfinished.

[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Info Needed</title>
    <id>1494</id>
    <revision>
      <id>3745</id>
      <timestamp>2003-05-03T12:11:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What do you do when information is missing?

* try and find it elsewhere on the web. If you find something,
** invite the writer to contribute their knowledge to the wiki.
** write up the information yourself
* try and work it out. Eg, if you have a class, try the settings one by one and see what effect they have. 

possible [[Legacy:Wiki Tag|Wiki Tag]], I'm not sure...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inio</title>
    <id>1497</id>
    <revision>
      <id>3751</id>
      <timestamp>2003-12-27T16:14:00Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>so this is where I saw your name before</comment>
      <text xml:space="preserve">[[Image:Legacy_inio_logo.gif|]] , a wanna be UT mapper, played with UnrealEd in VirtualPC back when UT was popular.  He just recently acquired a PC for (almost) the sole purpose of creating Unreal Tournament 2003 content, and hopes to enter Make Something Unreal in the &quot;Best Map Using Original Content&quot; category.

inio's previous work in Unreal Tournament includes several big boxes to play with Unreal Script in*, and the rather fun, but unfortunately network-client-unfriendly [http://www.inio.org/resume/CTFPeachB2.zip CTF-Peach] ([http://www.inio.org/~inio/UT/peachshots.jpg?link screenshots]), which was never submitted to any map archives because of this issue.

&lt;font size=-1&gt;* including one rather cool Kicker that did motion compensation and kicked you onto a mover following an interpolation path around the top of the room.&lt;/font&gt;

See also: [[Legacy:Inio/Developer Journal|Inio/Developer Journal]]

----

'''inio:''' comments go here, if anyone feels like it.

'''MythOpus:''' Hey Inio, Welcome to the wiki ;) (So happy I'm the first to welcome you, i think :S) Anywayz, did you do work on another map based on Zelda ?

'''inio:''' No, but I've been repeatedly pressured by a friend to make AS-GerudoFortress.

'''Tarquin:''' Hi there. welcome to the wiki :)

'''Tarquin:''' isn't that a picture from the UDN on [[Legacy:Zoning|Zoning]]? Inio, do you have permission to use it here? 

'''inio:''' If you're referring to the 6-panel picture above, definitely not.  I can supply the layered photoshop file or original resolution sources if you want 'em :).

'''Tarquin:''' no, I believe you. It just looked familiar, that's all. The tree structure you made for the BSP page is really cool btw. :)

'''inio:''' I didn't make that for the BSP page, I made it for CS homework a few quarters ago :).  Just happened to remember I had it laying around still when I was reading that page.

'''EntropicLqd:''' Greetz.  I knew I'd seen your name somewhere before. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3752</id>
      <timestamp>2003-08-14T08:13:34Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Image:Legacy_inio_logo.gif|]] , a wanna be UT mapper, played with UnrealEd in VirtualPC back when UT was popular.  He just recently acquired a PC for (almost) the sole purpose of creating Unreal Tournament 2003 content, and hopes to enter Make Something Unreal in the &quot;Best Map Using Original Content&quot; category.

inio's previous work in Unreal Tournament includes several big boxes to play with Unreal Script in*, and the rather fun, but unfortunately network-client-unfriendly [http://www.inio.org/resume/CTFPeachB2.zip CTF-Peach] ([http://www.inio.org/~inio/peachshots.jpg?link screenshots]), which was never submitted to any map archives because of this issue.

&lt;font size=-1&gt;* including one rather cool Kicker that did motion compensation and kicked you onto a mover following an interpolation path around the top of the room.&lt;/font&gt;

See also: [[Legacy:Inio/Developer Journal|Inio/Developer Journal]]

----

'''inio:''' comments go here, if anyone feels like it.

'''MythOpus:''' Hey Inio, Welcome to the wiki ;) (So happy I'm the first to welcome you, i think :S) Anywayz, did you do work on another map based on Zelda ?

'''inio:''' No, but I've been repeatedly pressured by a friend to make AS-GerudoFortress.

'''Tarquin:''' Hi there. welcome to the wiki :)

'''Tarquin:''' isn't that a picture from the UDN on [[Legacy:Zoning|Zoning]]? Inio, do you have permission to use it here? 

'''inio:''' If you're referring to the 6-panel picture above, definitely not.  I can supply the layered photoshop file or original resolution sources if you want 'em :).

'''Tarquin:''' no, I believe you. It just looked familiar, that's all. The tree structure you made for the BSP page is really cool btw. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3753</id>
      <timestamp>2003-08-19T06:51:08Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <minor/>
      <comment>fixing screenshots link</comment>
      <text xml:space="preserve">[[Image:Legacy_inio_logo.gif|]] , a wanna be UT mapper, played with UnrealEd in VirtualPC back when UT was popular.  He just recently acquired a PC for (almost) the sole purpose of creating Unreal Tournament 2003 content, and hopes to enter Make Something Unreal in the &quot;Best Map Using Original Content&quot; category.

inio's previous work in Unreal Tournament includes several big boxes to play with Unreal Script in*, and the rather fun, but unfortunately network-client-unfriendly [http://www.inio.org/resume/CTFPeachB2.zip CTF-Peach] ([http://www.inio.org/~inio/UT/peachshots.jpg?link screenshots]), which was never submitted to any map archives because of this issue.

&lt;font size=-1&gt;* including one rather cool Kicker that did motion compensation and kicked you onto a mover following an interpolation path around the top of the room.&lt;/font&gt;

See also: [[Legacy:Inio/Developer Journal|Inio/Developer Journal]]

----

'''inio:''' comments go here, if anyone feels like it.

'''MythOpus:''' Hey Inio, Welcome to the wiki ;) (So happy I'm the first to welcome you, i think :S) Anywayz, did you do work on another map based on Zelda ?

'''inio:''' No, but I've been repeatedly pressured by a friend to make AS-GerudoFortress.

'''Tarquin:''' Hi there. welcome to the wiki :)

'''Tarquin:''' isn't that a picture from the UDN on [[Legacy:Zoning|Zoning]]? Inio, do you have permission to use it here? 

'''inio:''' If you're referring to the 6-panel picture above, definitely not.  I can supply the layered photoshop file or original resolution sources if you want 'em :).

'''Tarquin:''' no, I believe you. It just looked familiar, that's all. The tree structure you made for the BSP page is really cool btw. :)

'''inio:''' I didn't make that for the BSP page, I made it for CS homework a few quarters ago :).  Just happened to remember I had it laying around still when I was reading that page.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inio/Developer Journal</title>
    <id>1499</id>
    <revision>
      <id>3756</id>
      <timestamp>2005-01-11T15:20:56Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==7-22-03==

[http://forums.beyondunreal.com/showthread.php?p=1162551#post1162551 It's Alieeve]!

You'll have to make your own screenshots for now.  I'll write this up on the wiki and post some shots later week, once I have it working to my satisfaction.

Read more at [[Legacy:Sourced Player Shadows|Sourced Player Shadows]].

==7-21-03==

Spent most of today on a side track, but one that will probably make it into the map.  I think I have dynamic player shadows pretty much working.  It's a system of volumes and special lights.  When the player is inside one of the volumes, the most &quot;important&quot; of the special lights with the same tag as that volume will be the source of the player shadow.  If you have multiple intersecting volumes, then players can have multiple shadows.  Right now there's some serious bugs is managing the regular shadow (shows up when it shouldn't, sticks around after the special shadows have taken over, etc), but I'll probably get those worked out tomorrow.  Screen shots and a sample map soon.

==7-18-03==

The layout is coming together pretty good on paper.  The basement is the most dramatically changed from the original. One of the harder parts has been fitting the basement inside the castle while keeping the flag paths pretty much equal.  So far two of the outside-to-inside connections have been eliminated: bowser &gt; roof and waterfall &lt;&gt; basement.  They've been replaced with door to 2nd floor &lt;&gt; roof and a tunnel connecting one team's basement to the waterfall on the far side of the other castle.  The door connecting the basement to the moat area has also been swung around to the other side of the castle to make that path a little more dangerous.  In general I'm trying to encourage travel through the front door or at least the lobby (and then to the roof), as that path was way under-used when testing the UT version.

==7-14-03==

After doing some research on fair use, the goal for the MSU map is now not to look like Princess Peach's Castle from M64, but just to make people remember M64.  Here's some screenshots of the lobby so far:

[http://www.inio.org/~inio/m2k3/ut1.jpg]

The theme for the map is not trying to simulate somewhere &quot;real&quot;, but to present somewhere imaginary that's been made real, like movie-based theme park rides.  Because of this the lighting is entirely spotlights around the upper rim of the wall, and is going to get sources (that look like theatrical spotlights) once I get the map playable.  I also have a plumed column model that is going to go on either side of the stairway supporting the platform, but I need to texture it first.  

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3757</id>
      <timestamp>2005-01-11T15:02:37Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-scar.boom.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-rosacea.boom.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-product.boom.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-medicine.boom.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://acne-treatment.boom.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>3758</id>
      <timestamp>2005-01-11T15:18:43Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==7-22-03 ¶==

[http://forums.beyondunreal.com/showthread.php?p=1162551#post1162551 It's Alieeve]! ¶

You'll have to make your own screenshots for now.  I'll write this up on the wiki and post some shots later week, once I have it working to my satisfaction. ¶
 ¶

Read more at [[Legacy:Sourced Player Shadows|Sourced Player Shadows]]. ¶

==7-21-03 ¶==

Spent most of today on a side track, but one that will probably make it into the map.  I think I have dynamic player shadows pretty much working.  It's a system of volumes and special lights.  When the player is inside one of the volumes, the most &quot;important&quot; of the special lights with the same tag as that volume will be the source of the player shadow.  If you have multiple intersecting volumes, then players can have multiple shadows.  Right now there's some serious bugs is managing the regular shadow (shows up when it shouldn't, sticks around after the special shadows have taken over, etc), but I'll probably get those worked out tomorrow.  Screen shots and a sample map soon. ¶

==7-18-03 ¶==

The layout is coming together pretty good on paper.  The basement is the most dramatically changed from the original. One of the harder parts has been fitting the basement inside the castle while keeping the flag paths pretty much equal.  So far two of the outside-to-inside connections have been eliminated: bowser &gt; roof and waterfall &lt;&gt; basement.  They've been replaced with door to 2nd floor &lt;&gt; roof and a tunnel connecting one team's basement to the waterfall on the far side of the other castle.  The door connecting the basement to the moat area has also been swung around to the other side of the castle to make that path a little more dangerous.  In general I'm trying to encourage travel through the front door or at least the lobby (and then to the roof), as that path was way under-used when testing the UT version. ¶

==7-14-03 ¶==

After doing some research on fair use, the goal for the MSU map is now not to look like Princess Peach's Castle from M64, but just to make people remember M64.  Here's some screenshots of the lobby so far: ¶

[http://www.inio.org/~inio/m2k3/ut1.jpg] ¶

The theme for the map is not trying to simulate somewhere &quot;real&quot;, but to present somewhere imaginary that's been made real, like movie-based theme park rides.  Because of this the lighting is entirely spotlights around the upper rim of the wall, and is going to get sources (that look like theatrical spotlights) once I get the map playable.  I also have a plumed column model that is going to go on either side of the stairway supporting the platform, but I need to texture it first.   ¶
 ¶

-----¶-----
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InitialState</title>
    <id>1469</id>
    <revision>
      <id>3686</id>
      <timestamp>2005-12-17T20:59:12Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''Object -&gt; InitialState''' property of an [[Legacy:Actor|Actor]] sets the [[Legacy:State|state]] the actor will be in when the game begins. For many actors, including [[Legacy:Mover|Mover]]s and [[Legacy:Trigger|Trigger]]s, states are partitioned: the actor has no state-switching code and will therefore remain in whicever state it starts the game in.

This technique makes each state a different &quot;flavour&quot; of the actor. For example, the Mover class has states such as TriggerOpenTimed and BumpOpenTimed, which determine how the mover is activated.

==Related Topics==
* [[Legacy:Object|Object]]
* [[Legacy:State|State]]

==Discussion==

This page is meant to give a simple explanation of the Object -&gt; InitialState property, and an overview of states from a mapping rather than coding perspective: states as flavours of an actor rather than dynamic behaviour.

'''Tarquin:''' I think that's pretty much covered it. Any ideas on padding this out are welcome.

'''SuperApe:''' How is this page categorized?  Linkage ideas?  Added some Related Topics.

----</text>
    </revision>
    <revision>
      <id>3687</id>
      <timestamp>2002-06-05T08:42:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Object -&gt; InitialState''' property of an [[Legacy:Actor|Actor]] sets the state the actor will be in when the game begins. For many actors, including [[Legacy:Mover|Mover]]s and [[Legacy:Trigger|Trigger]]s, states are partitioned: the actor has no state-switching code and will therefore remain in whicever state it starts the game in.

This technique makes each state a different '&quot;flavour&quot; of the actor. For example, the Mover class has states such as TriggerOpenTimed and BumpOpenTimed, which determine how the mover is activated.

==Comments ==

This page is meant to give a simple explanation of the Object &gt;&gt; InitialState property, and an overview of states from a mapping rather than coding perspective: states as flavours of an actor rather than dynamic behaviour.

: I think that's pretty much covered it. Any ideas on padding this out are welcome  &amp;rarr;[[Legacy:Tarquin|Tarquin]]</text>
    </revision>
    <revision>
      <id>3688</id>
      <timestamp>2004-04-12T12:57:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''Object -&gt; InitialState''' property of an [[Legacy:Actor|Actor]] sets the [[Legacy:State|state]] the actor will be in when the game begins. For many actors, including [[Legacy:Mover|Mover]]s and [[Legacy:Trigger|Trigger]]s, states are partitioned: the actor has no state-switching code and will therefore remain in whicever state it starts the game in.

This technique makes each state a different &quot;flavour&quot; of the actor. For example, the Mover class has states such as TriggerOpenTimed and BumpOpenTimed, which determine how the mover is activated.

==Comments ==

This page is meant to give a simple explanation of the Object -&gt; InitialState property, and an overview of states from a mapping rather than coding perspective: states as flavours of an actor rather than dynamic behaviour.

: I think that's pretty much covered it. Any ideas on padding this out are welcome  &amp;rarr;[[Legacy:Tarquin|Tarquin]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inline Object</title>
    <id>1493</id>
    <revision>
      <id>3743</id>
      <timestamp>2003-07-02T06:35:57Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An '''Inline Object''' is an object which from the mapper's point of view appears to be entirely contained within another object. It's all UnrealEd Interface trickery of course: the contained object is stored in the map just like any other object, but it can only be accessed inside the [[Legacy:Actor Properties|Actor properties]] of the encclosing object.

The most common example is the [[Legacy:Emitter|Emitter]] class.

See also [[Legacy:Editinline|Editinline]].

[[Image:Legacy_interface-Ed3-propertywidgets-subobjectlist.png|center|The dynamic array of objects contained within Emitters. Click '''Add''' to add an item to the array.]]

[[Image:Legacy_interface-Ed3-propertywidgets-subobjectname.png|center|Names of the inline objects in the array appear in dark grey. Click the [+] to expand its properties.]]

==Related Topics==

* [[Legacy:Subobject|Subobject]] &amp;ndash; how to create inline objects in UnrealScript

----

'''Wormbo:''' Ok, let's see. Emitters is a [[Legacy:Dynamic Array|dynamic array]] and that MeshEmitter is an object saved in [[Legacy:MyLevel|myLevel]] and referenced in the Emitter array's first element. Maybe I'm too much of a coder to explain it for mappers... :rolleyes: The [[Legacy:Editinline|editinline]] keyword in the array's variable declaration is responsible for the dark gray area in the first picture, the line &quot;[+] MeshEmitter myLevel.Meshemitter0&quot; which represents the inline object itself.</text>
    </revision>
    <revision>
      <id>3744</id>
      <timestamp>2003-06-25T09:43:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An '''Inline Object''' is an object which from the mapper's point of view appears to be entirely contained within another object. It's all UnrealEd Interface trickery of course: the contained object is stored in the map just like any other object, but it can only be accessed inside the [[Legacy:Actor Properties|Actor properties]] of the encclosing object.

The most common example is the [[Legacy:Emitter|Emitter]] class.

See also [[Legacy:Editinline|Editinline]].

[[Image:Legacy_interface-Ed3-propertywidgets-subobjectlist.png|center|The dynamic array of objects contained within Emitters. Click '''Add''' to add an item to the array.]]

[[Image:Legacy_interface-Ed3-propertywidgets-subobjectname.png|center|Names of the inline objects in the array appear in dark grey. Click the [+] to expand its properties.]]

'''Wormbo:''' Ok, let's see. Emitters is a [[Legacy:Dynamic Array|dynamic array]] and that MeshEmitter is an object saved in [[Legacy:MyLevel|myLevel]] and referenced in the Emitter array's first element. Maybe I'm too much of a coder to explain it for mappers... :rolleyes: The [[Legacy:Editinline|editinline]] keyword in the array's variable declaration is responsible for the dark gray area in the first picture, the line &quot;[+] MeshEmitter myLevel.Meshemitter0&quot; which represents the inline object itself.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Input</title>
    <id>1515</id>
    <revision>
      <id>3792</id>
      <timestamp>2007-05-07T09:16:14Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <minor/>
      <comment>FindKeyName() code fix again</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; Input (Package: Engine)}}

This is the native Engine.Input class, which holds the aliases and keybinds configured in the User.ini file.

==Structure - as defined in C++==

&lt;uscript&gt;enum {ALIAS_MAX=40};

struct FAlias
{
	FName Alias;
	FString Command;
	FAlias() : Alias(), Command(E_NoInit) {}
};

class ENGINE_API UInput : public USubsystem
{
	static const TCHAR* StaticConfigName()
    {
            return TEXT(&quot;User&quot;);
    }

	DECLARE_CLASS(UInput,USubsystem,CLASS_Transient|CLASS_Config,Engine)

	// Variables.
	FAlias		  Aliases[ALIAS_MAX];
	FStringNoInit     Bindings[IK_MAX];
	UViewport*	  Viewport;

	// Constructors.
	UInput();
	void StaticConstructor();

	// UObject interface.
	void Serialize( FArchive&amp; Ar );

	// UInput interface.
	static void StaticInitInput();
	virtual void Init (UViewport* Viewport);
	virtual UBOOL Exec (const TCHAR* Cmd, FOutputDevice&amp; Ar);
	virtual UBOOL PreProcess (EInputKey iKey, EInputAction State, FLOAT Delta = 0.f);
	virtual UBOOL Process (FOutputDevice&amp; Ar, EInputKey iKey, EInputAction State, FLOAT Delta = 0.f);
	virtual void DirectAxis (EInputKey Key, FLOAT Length, FLOAT Delta);
	virtual void ReadInput (FLOAT DeltaSeconds, FOutputDevice&amp; Ar);
	virtual void ResetInput ();
	virtual const TCHAR* GetKeyName (EInputKey Key) const;
	virtual int FindKeyName (const TCHAR* KeyName, EInputKey&amp; iKey) const;

	// Accessors.
	void SetInputAction (EInputAction NewAction, FLOAT NewDelta = 0.f)
	{
            Action = NewAction;
            Delta = NewDelta;
    }

	EInputAction GetInputAction ()
	{
            return Action;
    }

	FLOAT GetInputDelta ()
	{
            return Delta;
    }

	BYTE KeyDown (int i)
	{
            return KeyDownTable[Clamp(i,0,IK_MAX-1)];
    }

protected:
	UEnum* InputKeys;
	EInputAction Action;
	FLOAT Delta;
	BYTE KeyDownTable[IK_MAX];
	virtual BYTE* FindButtonName (AActor* Actor, const TCHAR* ButtonName) const;
	virtual FLOAT* FindAxisName (AActor* Actor, const TCHAR* ButtonName) const;
	virtual void ExecInputCommands (const TCHAR* Cmd, FOutputDevice&amp; Ar);
};&lt;/uscript&gt;

==Hypothetical Code==

&lt;uscript&gt;
void UInput :: Init (UViewport* InViewport)
{
    guard(UInput::Init);

    Viewport = InViewport;
    debugf(NAME_Init, TEXT(&quot;Input system initialized for %s&quot;),Viewport-&gt;GetName());
    unguard;
}

const TCHAR* UInput :: GetKeyName (EInputKey Key) const
{
    guard(UInput::GetKeyName);

    FString KeyName;

    if ((Key &gt;= 0) &amp;&amp; (Key &lt; IK_MAX))
    {
        KeyName = *(FString*)EInputKey-&gt;Names(Key);
        return KeyName.Mid(3);
    }
    return TEXT(&quot;&quot;);

    unguard;
}

UBOOL UInput :: FindKeyName (const TCHAR* KeyName, EInputKey&amp; iKey) const
{
    guard(UInput::FindKeyName);

    INT i, j;
    FString Key;

    for (i = 0; i &lt; IK_MAX; ++ i)
    {
        Key = *(FString*)EInputKey-&gt;Names(i);
        Key = Key.Mid(3);        

        if (KeyName.Caps() == Key.Caps())
        {
            j = i;
            break;
        }
    }
    return j;

    unguard;
}

&lt;/uscript&gt;

==Variable Interpretation==

; UEnum* InputKeys;

&lt;uscript&gt;enum EInputKey
{
    IK_None,
    IK_LeftMouse,      // This is IK_Mouse on Mac
    IK_RightMouse,     // This is IK_AltMouse on Mac
    IK_Cancel,
    IK_MiddleMouse,    // This is IK_Unknown04 on Mac
    IK_Unknown05,
    IK_Unknown06,
    IK_Unknown07,
    IK_Backspace,
    IK_Tab,
    IK_Unknown0A,
    IK_Unknown0B,
    IK_Unknown0C,
    IK_Enter,
    IK_Unknown0E,
    IK_Unknown0F,
    IK_Shift,
    IK_Ctrl,
    IK_Alt,            // This is IK_Option on Mac
    IK_Pause,
    IK_CapsLock,
    IK_Unknown15,
    IK_Unknown16,
    IK_Unknown17,
    IK_Unknown18,
    IK_Unknown19,
    IK_Unknown1A,
    IK_Escape,
    IK_Unknown1C,
    IK_Unknown1D,
    IK_Unknown1E,
    IK_Unknown1F,
    IK_Space,
    IK_PageUp,
    IK_PageDown,
    IK_End,
    IK_Home,
    IK_Left,
    IK_Up,
    IK_Right,
    IK_Down,
    IK_Select,
    IK_Print,
    IK_Execute,
    IK_PrintScrn,
    IK_Insert,
    IK_Delete,
    IK_Help,
    IK_0,
    IK_1,
    IK_2,
    IK_3,
    IK_4,
    IK_5,
    IK_6,
    IK_7,
    IK_8,
    IK_9,
    IK_Unknown3A,
    IK_Unknown3B,
    IK_Unknown3C,
    IK_Unknown3D,
    IK_Unknown3E,
    IK_Unknown3F,
    IK_Unknown40,
    IK_A,
    IK_B,
    IK_C,
    IK_D,
    IK_E,
    IK_F,
    IK_G,
    IK_H,
    IK_I,
    IK_J,
    IK_K,
    IK_L,
    IK_M,
    IK_N,
    IK_O,
    IK_P,
    IK_Q,
    IK_R,
    IK_S,
    IK_T,
    IK_U,
    IK_V,
    IK_W,
    IK_X,
    IK_Y,
    IK_Z,
    IK_Unknown5B,      // This is the start menu key in every OS
    IK_Unknown5C,      // This is the start menu key in every OS (the one on the right)
    IK_Unknown5D,      // This is the MouseMenu in Windows (the one next to the right start menu key)
    IK_Unknown5E,
    IK_Unknown5F,
    IK_NumPad0,
    IK_NumPad1,
    IK_NumPad2,
    IK_NumPad3,
    IK_NumPad4,
    IK_NumPad5,
    IK_NumPad6,
    IK_NumPad7,
    IK_NumPad8,
    IK_NumPad9,
    IK_GreyStar,       // This is IK_NumPadStar on Mac
    IK_GreyPlus,       // This is IK_NumPadPlus on Mac
    IK_Separator,
    IK_GreyMinus,      // This is IK_NumPadMinus on Mac
    IK_NumPadPeriod,
    IK_GreySlash,      // This is IK_NumPadSlash on Mac
    IK_F1,
    IK_F2,
    IK_F3,
    IK_F4,
    IK_F5,
    IK_F6,
    IK_F7,
    IK_F8,
    IK_F9,
    IK_F10,
    IK_F11,
    IK_F12,
    IK_F13,
    IK_F14,
    IK_F15,
    IK_F16,
    IK_F17,
    IK_F18,
    IK_F19,
    IK_F20,
    IK_F21,
    IK_F22,
    IK_F23,
    IK_F24,
    IK_Unknown88,      // This is IK_NumPadEquals on Mac
    IK_Unknown89,      // This is IK_Command on Mac
    IK_Unknown8A,
    IK_Unknown8B,
    IK_Unknown8C,
    IK_Unknown8D,
    IK_Unknown8E,
    IK_Unknown8F,
    IK_NumLock,
    IK_ScrollLock,
    IK_Unknown92,
    IK_Unknown93,
    IK_Unknown94,
    IK_Unknown95,
    IK_Unknown96,
    IK_Unknown97,
    IK_Unknown98,
    IK_Unknown99,
    IK_Unknown9A,
    IK_Unknown9B,
    IK_Unknown9C,
    IK_Unknown9D,
    IK_Unknown9E,
    IK_Unknown9F,
    IK_LShift,
    IK_RShift,
    IK_LControl,
    IK_RControl,
    IK_UnknownA4,
    IK_UnknownA5,
    IK_UnknownA6,
    IK_UnknownA7,
    IK_UnknownA8,
    IK_UnknownA9,
    IK_UnknownAA,
    IK_UnknownAB,
    IK_UnknownAC,
    IK_UnknownAD,
    IK_UnknownAE,
    IK_UnknownAF,
    IK_UnknownB0,
    IK_UnknownB1,
    IK_UnknownB2,
    IK_UnknownB3,
    IK_UnknownB4,
    IK_UnknownB5,
    IK_UnknownB6,
    IK_UnknownB7,
    IK_UnknownB8,
    IK_UnknownB9,
    IK_Semicolon,
    IK_Equals,
    IK_Comma,
    IK_Minus,
    IK_Period,
    IK_Slash,
    IK_Tilde,
    IK_UnknownC1,
    IK_UnknownC2,
    IK_UnknownC3,
    IK_UnknownC4,
    IK_UnknownC5,
    IK_UnknownC6,
    IK_UnknownC7,
    IK_Joy1,
    IK_Joy2,
    IK_Joy3,
    IK_Joy4,
    IK_Joy5,
    IK_Joy6,
    IK_Joy7,
    IK_Joy8,
    IK_Joy9,
    IK_Joy10,
    IK_Joy11,
    IK_Joy12,
    IK_Joy13,
    IK_Joy14,
    IK_Joy15,
    IK_Joy16,
    IK_UnknownD8,
    IK_UnknownD9,
    IK_UnknownDA,
    IK_LeftBracket,
    IK_Backslash,
    IK_RightBracket,
    IK_SingleQuote,
    IK_UnknownDF,
    IK_JoyX,
    IK_JoyY,
    IK_JoyZ,
    IK_JoyR,
    IK_MouseX,
    IK_MouseY,
    IK_MouseZ,
    IK_MouseW,
    IK_JoyU,
    IK_JoyV,
    IK_UnknownEA,
    IK_UnknownEB,
    IK_MouseWheelUp,
    IK_MouseWheelDown,
    IK_UnknownEE,            // Typo: IK_Unknown10E
    IK_UnknownEF,            // Typo: UK_Unknown10F
    IK_JoyPovUp,
    IK_JoyPovDown,
    IK_JoyPovLeft,
    IK_JoyPovRight,
    IK_UnknownF4,
    IK_UnknownF5,
    IK_Attn,
    IK_CrSel,
    IK_ExSel,
    IK_ErEof,
    IK_Play,
    IK_Zoom,
    IK_NoName,
    IK_PA1,
    IK_OEMClear
};&lt;/uscript&gt;

'''Note:''' There is a typo IK_Unknown10E and another of UK_Unknown10F in the UScript and C++ versions of the EInput enum; The correct ones are IK_UnknownEE and IK_UnknownEF.

; EInputAction Action: 

&lt;uscript&gt;enum EInputAction
{
	IST_None,    // Not performing special input processing.
	IST_Press,   // Handling a keypress or button press.
	IST_Hold,    // Handling holding a key or button.
	IST_Release, // Handling a key or button release.
	IST_Axis,    // Handling analog axis movement.
};&lt;/uscript&gt;

; FLOAT Delta: possibly used for the Axis movement (?)
; BYTE KeyDownTable[IK_MAX]: monitors which keys are pressed

==Code Interpretation==

; StaticInitInput(): This most likely assembles the InputKeys, that is, convert the 255-arrayed string ''Bindings'' to the normal EInput version of itself we see in the INI.
; Init(): basic initialization function; assigns the viewport and writes the debug output... might call StaticInitInput()
; Exec(): handles native console commands; in this case, it might handle the INI commands such as Button, Toggle, keyname etc.
; DirectAxis(): controls the axis movement of &quot;special&quot; keys, such as the Mouse or Joystick axis
; ResetInput(): can be called from PlayerPawn.ResetKeyboard() (UT) or PlayerController.ResetKeyboard() (UT2k3 and UT2k4) 

Assuming the KeyDownTable[] is constantly monitored, the order might be this:

; PreProcess(): checks whether a key is pressed or not, similar to the Console handling of keys using IST_Press and IST_Release
; ReadInput(): hypothesized to be the Tick() equivalent of the Input which might constantly check which key is currently used, possibly even call PlayerPawn.PlayerInput() (UT); in UT2k3 and UT2k4 PlayerInput() is handled by PlayerTick() and is in a separate class
; Process(): possibly controls the exec-ing of console commands from each key in the INI if active in the KeyDownTable[] array

==Accessing The Input Configuration==

While it is possible to compile code that references class'Input' or Input objects, it's not possible to access properties of purely native classes directly in UnrealScript. (compiles fine, but crashes the game)

To work around this problem you first need a reference to an Input object. Under UT200x you can easily get such a reference with the following code:

&lt;uscript&gt;
local Input MyInput;

foreach AllObjects(class'Input', MyInput)
  break;
&lt;/uscript&gt;

The variable &lt;tt&gt;MyInput&lt;/tt&gt; will then contain the currently used Input object.

In UT there is no AllObjects iterator, so you have to resort to a little trick with the SetPropertyText() function:

&lt;uscript&gt;
var Input MyInput;

function GetInput()
{
  SetPropertyText(&quot;MyInput&quot;, &quot;Input'Input0'&quot;);
}
&lt;/uscript&gt;

The Input object should always have this name, so SetPropertyText() assigns it to the MyInput class variable. You could use this unter UT200x as well, but depending on whether the game was started with the &lt;tt&gt;-makenames-&lt;/tt&gt; parameter you have to use either &quot;Input'Input'&quot; (without) or &quot;Input'Input0'&quot; (with) to get the desired effect.

Either way you can now access the Input object with the GetPropertyText function:

&lt;uscript&gt;
// log the command bound to the left mouse button
log(MyInput.GetPropertyText(&quot;LeftMouse&quot;));
&lt;/uscript&gt;

Under UT2004 you can also access the Aliases array this way, but you will probably have to parse the array string first.

Beginning with UT2004 v3270 there's also an easier method of accessing aliases and keybinds using the [[Legacy:Security|Security]] class LocalPerform() function with a SecType of 100 and 101 respectively. See the [[Legacy:UnrealScript Source|UnrealScript Source]] of the XGame.[[Legacy:XPlayer|XPlayer]] class for an implementation example. It's a good idea to spawn a new Security actor there, because the custom Security actors of Anti TCC and probably also SafeGame won't allow others to access their LocalPerform() function.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3793</id>
      <timestamp>2004-10-21T18:27:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Subsystem|Subsystem]] &gt;&gt; Input (Package: Engine)}}

This is the native Engine.Input class, which holds the aliases and keybinds configured in the User.ini file.

==Hypothetical Properties==
; TAlias Aliases[40] (config) : 
; string ''Bindings[256]'' (config) : Actually this is no array in the User.ini file but 256 configurable variables with individual names like &quot;Alt&quot;, &quot;F6&quot;, &quot;MouseX&quot; (with is actually a movement axis, not a button), &quot;Unknown3C&quot;, etc. Just have a look at your User.ini for a complete list.

==Hypothetical Structs==

===TAlias===
; name Alias : The name of the alias. If an existing console command's name ins specified, this coneole command will be overridden by the alias.
; string Command : The command this alias executes. Commands in here are actual functions, no aliases!

==Accessing The Input Configuration==

While it is possible to compile code that references class'Input' or Input objects, it's not possible to access properties of purely native classes directly in UnrealScript. (compiles fine, but crashes the game)

To work around this problem you first need a reference to an Input object. Under UT200x you can easily get such a reference with the following code:

&lt;uscript&gt;
local Input MyInput;

foreach AllObjects(class'Input', MyInput)
  break;
&lt;/uscript&gt;

The variable &lt;tt&gt;MyInput&lt;/tt&gt; will then contain the currently used Input object.

In UT there is no AllObjects iterator, so you have to resort to a little trick with the SetPropertyText() function:

&lt;uscript&gt;
var Input MyInput;

function GetInput()
{
  SetPropertyText(&quot;MyInput&quot;, &quot;Input'Input0'&quot;);
}
&lt;/uscript&gt;

The Input object should always have this name, so SetPropertyText() assigns it to the MyInput class variable. You could use this unter UT200x as well, but depending on whether the game was started with the &lt;tt&gt;-makenames-&lt;/tt&gt; parameter you have to use either &quot;Input'Input'&quot; (without) or &quot;Input'Input0'&quot; (with) to get the desired effect.

Either way you can now access the Input object with the GetPropertyText function:

&lt;uscript&gt;
// log the command bound to the left mouse button
log(MyInput.GetPropertyText(&quot;LeftMouse&quot;));
&lt;/uscript&gt;

Under UT2004 you can also access the Aliases array this way, but you will probably have to parse the array string first.

Beginning with UT2004 v3270 there's also an easier method of accessing aliases and keybinds using the [[Legacy:Security|Security]] class LocalPerform() function with a SecType of 100 and 101 respectively. See the [[Legacy:UnrealScript Source|UnrealScript Source]] of the XGame.[[Legacy:XPlayer|XPlayer]] class for an implementation example. It's a good idea to spawn a new Security actor there, because the custom Security actors of Anti TCC and probably also SafeGame won't allow others to access their LocalPerform() function.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Input Keys</title>
    <id>1491</id>
    <revision>
      <id>3740</id>
      <timestamp>2007-05-07T15:15:48Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <minor/>
      <comment>another typo :o|</comment>
      <text xml:space="preserve">So its time to create a class that requires the user to press a key?  You've come to the right place.  I'll walk you through the steps here.

For [[Legacy:UT2003|UT2003]] and newer, see [[Legacy:Interaction|interaction]].

==Step 1:  Setting up the Key Binding==

This is the easiest step.  Start by creating a new class, something like ExtraWordBindings (please replace Word with something descriptive, thanks!) and make it look something like this:

&lt;uscript&gt;
Class ExtraWordBindings extends UTExtraKeyBindings;

defaultproperties
{
     SectionName=&quot;YourSection&quot; // Enter a descriptive section name here
     LabelList(0)=&quot;First Binding Caption&quot; // Something Descriptive, Please.
     LabelList(1)=&quot;Second Binding Caption&quot;
     AliasNames(0)=&quot;mutate Word&quot; // Change Word to something that describes the action this key will do
     AliasNames(1)=&quot;mutate Word&quot;
}
&lt;/uscript&gt;

Compile the script and create an entry in the [Public] section of your package's [[Legacy:Int File|int file]]:

Object=(Name=MyPackage.MyKeyBindingsClass,Class=Class,MetaClass=UTMenu.UTExtraKeyBindings)

Now you should have a working option in the &quot;Controls&quot; option panel.

==Step 2:  Creating the mutator to process your key input==

Okay now you can use one [[Legacy:Mutator|mutator]] to parse all your key bindings, or one mutator for each binding.  I like one mutator for each binding, because these mutators should be automatically added into the mutatorlist if the associated actor is present in the map.  DO NOT CREATE AN INT ENTRY FOR THESE MUTATORS!

They should look something like this. (Once again, PLEASE replace &quot;Word&quot; with something DESCRIPTIVE!)

&lt;uscript&gt;
class WordKeyMut extends Mutator;

function AddMutator(Mutator M)
{
	if ( M.IsA('WordKeyMut') ) // This mutator's name!
	{
		return; //only allow one mutator
	}
	Super.AddMutator(M);
}

function Mutate(string MutateString, PlayerPawn Sender)
{
	local YourClass Other; // YourClass will be the name of the class that we
                               // will create in the next step - the actual actor 
                               // that this mutator is processing key input for.

	if (MutateString ~= &quot;SomeString&quot;) // SomeString should be equal to an AliasName set in the class above,
                                          //without &quot;mutate&quot;.  i.e., if your AliasName was &quot;mutate Activate&quot;,
                                          //SomeString should be &quot;Activate&quot;
	{
		foreach AllActors(class'YourClass', Other)
		{
			if ( Other.IsA('YourClass') )
			{
				log(&quot;YourClass Detected&quot;);
				if ( Other.BooleanValue ) // Change BooleanValue to a descriptive variable name!
                                                          // It will be set in the class we will create in the next
                                                          // step, to see if the actor is actually in a state that
                                                          // it can be activated.
				{
					log(&quot;YourClass Active&quot;);
					Other.FunctionName( ); // Change FunctionName to something descriptive!
                                                               // It will be created in the next step as well,
                                                               // and it will contain everything we want to happen
                                                               //when the user presses a key.

				}
			}
		}

	}

	if ( NextMutator != None )
		NextMutator.Mutate(MutateString, Sender);
}
&lt;/uscript&gt;

==Step 3:  Creating your actor!==

Create your map actor as you otherwise would create any other map actor.  How to create them is beyond the scope of this article.  Once its created, you want to add the following near the beginning of the class:

&lt;uscript&gt;
function PreBeginPlay()
{
	Level.Game.BaseMutator.AddMutator(Spawn(class'Package.Mutator')); // Replace Package with your package name,
                                                                          // and Mutator with the name of the mutator
                                                                          // we created above.
	Super.PreBeginPlay();
}
&lt;/uscript&gt;

Right at the very beginning, define a boolean variable called whatever you replaced &quot;BooleanValue&quot; with in the class above.  You may also want another variable (as an Actor), to store who is allowed to actually activate the object.

Now you code a function with its name set to whatever you made &quot;FunctionName&quot;, which will be what you want to happen when a player activates the object.  You will also need to put in the code to set your boolean to true when someone is allowed to activate it.

Now you're set!  Below is an example of what I've done, to create a [[Legacy:Trigger|trigger]] that requires the user to activate it before use.

==My Working (we hope) Example!==

Here is the trigger class, it works like any other trigger:

&lt;uscript&gt;
//
// UseTrigger:  Almost identical to Trigger except requires user to press
// activate to spawn the event.
// By Nick Bowler (Draconx), http://www.deadjunkie.com/~draconx/
//
class UseTrigger extends Trigger;


//-----------------------------------------------------------------------------

var bool Activatable;
var Actor ActivatedBy;
var Actor OtherBkp;

//

function PreBeginPlay()
{
	Level.Game.BaseMutator.AddMutator(Spawn(class'Package.ActivateMut'));
	Super.PreBeginPlay();
}

//
// Called when something touches the trigger.
//
function Touch( actor Other )
{
	if (Other.IsA('PlayerPawn'))
	{
		log(&quot;UseTrigger Activated&quot;);
		OtherBkp = Other;
		Activatable = true;
	}
}

function UsePressed( )
{

	log(&quot;UseTrigger Used&quot;);
	Super.Touch( OtherBkp);

}

//
// When something untouches the trigger.
//
function UnTouch( actor Other )
{
	if (Other.IsA('PlayerPawn'))
	{
		log(&quot;UseTrigger Deactivated&quot;);
		Activatable = false;
	}
}

defaultproperties
{
	Activatable=false
}
&lt;/uscript&gt;

Here is the mutator which processes the key input:

&lt;uscript&gt;
//
// ActivateMut - Required for UseTrigger to function correctly.  Placing a
// UseTrigger in your map automatically adds this mutator, so it should not
// be added manually.
// By Nick Bowler (Draconx), http://www.deadjunkie.com/~draconx/
//
class ActivateMut extends Mutator;

function AddMutator(Mutator M)
{
	if ( M.IsA('ActivateMut') )
	{
		return; //only allow one mutator
	}
	Super.AddMutator(M);
}

function Mutate(string MutateString, PlayerPawn Sender)
{
	local UseTrigger Other;

	if (MutateString ~= &quot;activate&quot;)
	{
		foreach AllActors(class'UseTrigger', Other)
		{
			if ( Other.IsA('UseTrigger') )
			{
				log(&quot;UseTrigger Detected&quot;);
				if ( Other.Activatable )
				{
					log(&quot;UseTrigger Active&quot;);
					Other.UsePressed( );

				}
			}
		}

	}

	if ( NextMutator != None )
		NextMutator.Mutate(MutateString, Sender);
}
&lt;/uscript&gt;

And here is the class which adds to the keybindings:

&lt;uscript&gt;
class UseTriggerBindings extends UTExtraKeyBindings;

defaultproperties
{
     SectionName=&quot;Miscellaneous&quot;
     LabelList(0)=&quot;Activate&quot;
     AliasNames(0)=&quot;mutate activate&quot;
}
&lt;/uscript&gt;

And there you have it.  I hope you found this tutorial useful!

----

'''Foxpaw:''' This is a clever workaround, but wouldn't exec functions/input variables be more elegant and easier, too?

'''Wormbo:''' Exec functions can only be executed by the player who is the owner of the actor and I don't see how input variables would work in this case.

'''Foxpaw:''' Don't mutators have full access to exec functions and input variables for the local viewport?

'''Wormbo:''' No, mutators are serverside. They only have a Mutate function which is called by the PlayerController's exec function Mutate which in turn is always replicated to the server.

'''Foxpaw:''' Oh. I thought mutators were loaded on both the client and the server and followed the normal replication rules.

'''Wormbo:''' They follow replication rules, that's why they aren't replicated at all unless you change RemoteRole, bAlwaysRelevant, etc.

'''ToJo:''' Does anyone know if there is a simplier way to do this in UT 2003?

'''Foxpaw:''' An [[Legacy:Interaction|interaction]] should work.

'''Draconx:''' UT 2003 already has a UseTrigger, it works just like mine (unfortunately, the Activate key doesnt seem to appear in the normal key bindings screen, and must be set manually.

'''MythOpus:''' Are you refering to the Activate key for the UseTrigger?  That is set to the Use key which is by default 'U'...

'''Draconx:''' Yeah but the control doesnt appear on the controls screen ingame.  I used the rawkeybindings thing to change it on my own install.

'''Xian:''' Interesting concept. But this is buggy, as if we have 2 PlayerPawns activating 2 separate Triggers, we'd have both of them activatable. This in turn would make the foreach iterator execute even the trigger which the Player running the command isn't touching. i'd say this would be a better workaround:

&lt;uscript&gt;function Touch( actor Other )
{
	if (Other.IsA('PlayerPawn'))
	{
		log(&quot;UseTrigger Activated&quot;);
		PlayerPawn(Other).HitActor = Self;
		OtherBkp = Other;
		Activatable = true;
	}
}

function UnTouch( actor Other )
{
	if (Other.IsA('PlayerPawn'))
	{
		log(&quot;UseTrigger Deactivated&quot;);
		Activatable = false;
		PlayerPawn(Other).HitActor = None;
	}
}&lt;/uscript&gt;

... and...

&lt;uscript&gt;if (MutateString ~= &quot;activate&quot;)
	{
		if ((Sender.HitActor != None) &amp;&amp; Sender.HitActor.IsA('UseTrigger'))
		{
			log(&quot;UseTrigger Detected&quot;);
			if ( UseTrigger(Sender.HitActor).Activatable )
			{
				log(&quot;UseTrigger Active&quot;);
				UseTrigger(Sender.HitActor).UsePressed( );
			}
		}
	}&lt;/uscript&gt;

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3741</id>
      <timestamp>2005-01-14T03:29:07Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">So its time to create a class that requires the user to press a key?  You've come to the right place.  I'll walk you through the steps here.

For [[Legacy:UT2003|UT2003]] and newer, see [[Legacy:Interaction|interaction]].

==Step 1:  Setting up the Key Binding==

This is the easiest step.  Start by creating a new class, something like ExtraWordBindings (please replace Word with something descriptive, thanks!) and make it look something like this:

&lt;uscript&gt;
Class ExtraWordBindings extends UTExtraKeyBindings;

defaultproperties
{
     SectionName=&quot;YourSection&quot; // Enter a descriptive section name here
     LabelList(0)=&quot;First Binding Caption&quot; // Something Descriptive, Please.
     LabelList(1)=&quot;Second Binding Caption&quot;
     AliasNames(0)=&quot;mutate Word&quot; // Change Word to something that describes the action this key will do
     AliasNames(1)=&quot;mutate Word&quot;
}
&lt;/uscript&gt;

Compile the script and create an entry in the [Public] section of your package's [[Legacy:Int File|int file]]:

Object=(Name=MyPackage.MyKeyBindingsClass,Class=Class,MetaClass=UTMenu.UTExtraKeyBindings)

Now you should have a working option in the &quot;Controls&quot; option panel.

==Step 2:  Creating the mutator to process your key input==

Okay now you can use one [[Legacy:Mutator|mutator]] to parse all your key bindings, or one mutator for each binding.  I like one mutator for each binding, because these mutators should be automatically added into the mutatorlist if the associated actor is present in the map.  DO NOT CREATE AN INT ENTRY FOR THESE MUTATORS!

They should look something like this. (Once again, PLEASE replace &quot;Word&quot; with something DESCRIPTIVE!)

&lt;uscript&gt;
class WordKeyMut extends Mutator;

function AddMutator(Mutator M)
{
	if ( M.IsA('WordKeyMut') ) // This mutator's name!
	{
		return; //only allow one mutator
	}
	Super.AddMutator(M);
}

function Mutate(string MutateString, PlayerPawn Sender)
{
	local YourClass Other; // YourClass will be the name of the class that we
                               // will create in the next step - the actual actor 
                               // that this mutator is processing key input for.

	if (MutateString ~= &quot;SomeString&quot;) // SomeString should be equal to an AliasName set in the class above,
                                          //without &quot;mutate&quot;.  i.e., if your AliasName was &quot;mutate Activate&quot;,
                                          //SomeString should be &quot;Activate&quot;
	{
		foreach AllActors(class'YourClass', Other)
		{
			if ( Other.IsA('YourClass') )
			{
				log(&quot;YourClass Detected&quot;);
				if ( Other.BooleanValue ) // Change BooleanValue to a descriptive variable name!
                                                          // It will be set in the class we will create in the next
                                                          // step, to see if the actor is actually in a state that
                                                          // it can be activated.
				{
					log(&quot;YourClass Active&quot;);
					Other.FunctionName( ); // Change FunctionName to something descriptive!
                                                               // It will be created in the next step as well,
                                                               // and it will contain everything we want to happen
                                                               //when the user presses a key.

				}
			}
		}

	}

	if ( NextMutator != None )
		NextMutator.Mutate(MutateString, Sender);
}
&lt;/uscript&gt;

==Step 3:  Creating your actor!==

Create your map actor as you otherwise would create any other map actor.  How to create them is beyond the scope of this article.  Once its created, you want to add the following near the beginning of the class:

&lt;uscript&gt;
function PreBeginPlay()
{
	Level.Game.BaseMutator.AddMutator(Spawn(class'Package.Mutator')); // Replace Package with your package name,
                                                                          // and Mutator with the name of the mutator
                                                                          // we created above.
	Super.PreBeginPlay();
}
&lt;/uscript&gt;

Right at the very beginning, define a boolean variable called whatever you replaced &quot;BooleanValue&quot; with in the class above.  You may also want another variable (as an Actor), to store who is allowed to actually activate the object.

Now you code a function with its name set to whatever you made &quot;FunctionName&quot;, which will be what you want to happen when a player activates the object.  You will also need to put in the code to set your boolean to true when someone is allowed to activate it.

Now you're set!  Below is an example of what I've done, to create a [[Legacy:Trigger|trigger]] that requires the user to activate it before use.

==My Working (we hope) Example!==

Here is the trigger class, it works like any other trigger:

&lt;uscript&gt;
//
// UseTrigger:  Almost identical to Trigger except requires user to press
// activate to spawn the event.
// By Nick Bowler (Draconx), http://www.deadjunkie.com/~draconx/
//
class UseTrigger extends Trigger;


//-----------------------------------------------------------------------------

var bool Activatable;
var Actor ActivatedBy;
var Actor OtherBkp;

//

function PreBeginPlay()
{
	Level.Game.BaseMutator.AddMutator(Spawn(class'Package.ActivateMut'));
	Super.PreBeginPlay();
}

//
// Called when something touches the trigger.
//
function Touch( actor Other )
{
	if (Other.IsA('PlayerPawn'))
	{
		log(&quot;UseTrigger Activated&quot;);
		OtherBkp = Other;
		Activatable = true;
	}
}

function UsePressed( )
{

	log(&quot;UseTrigger Used&quot;);
	Super.Touch( OtherBkp);

}

//
// When something untouches the trigger.
//
function UnTouch( actor Other )
{
	if (Other.IsA('PlayerPawn'))
	{
		log(&quot;UseTrigger Deactivated&quot;);
		Activatable = false;
	}
}

defaultproperties
{
	Activatable=false
}
&lt;/uscript&gt;

Here is the mutator which processes the key input:

&lt;uscript&gt;
//
// ActivateMut - Required for UseTrigger to function correctly.  Placing a
// UseTrigger in your map automatically adds this mutator, so it should not
// be added manually.
// By Nick Bowler (Draconx), http://www.deadjunkie.com/~draconx/
//
class ActivateMut extends Mutator;

function AddMutator(Mutator M)
{
	if ( M.IsA('ActivateMut') )
	{
		return; //only allow one mutator
	}
	Super.AddMutator(M);
}

function Mutate(string MutateString, PlayerPawn Sender)
{
	local UseTrigger Other;

	if (MutateString ~= &quot;activate&quot;)
	{
		foreach AllActors(class'UseTrigger', Other)
		{
			if ( Other.IsA('UseTrigger') )
			{
				log(&quot;UseTrigger Detected&quot;);
				if ( Other.Activatable )
				{
					log(&quot;UseTrigger Active&quot;);
					Other.UsePressed( );

				}
			}
		}

	}

	if ( NextMutator != None )
		NextMutator.Mutate(MutateString, Sender);
}
&lt;/uscript&gt;

And here is the class which adds to the keybindings:

&lt;uscript&gt;
class UseTriggerBindings extends UTExtraKeyBindings;

defaultproperties
{
     SectionName=&quot;Miscellaneous&quot;
     LabelList(0)=&quot;Activate&quot;
     AliasNames(0)=&quot;mutate activate&quot;
}
&lt;/uscript&gt;

And there you have it.  I hope you found this tutorial useful!

----

'''Foxpaw:''' This is a clever workaround, but wouldn't exec functions/input variables be more elegant and easier, too?

'''Wormbo:''' Exec functions can only be executed by the player who is the owner of the actor and I don't see how input variables would work in this case.

'''Foxpaw:''' Don't mutators have full access to exec functions and input variables for the local viewport?

'''Wormbo:''' No, mutators are serverside. They only have a Mutate function which is called by the PlayerController's exec function Mutate which in turn is always replicated to the server.

'''Foxpaw:''' Oh. I thought mutators were loaded on both the client and the server and followed the normal replication rules.

'''Wormbo:''' They follow replication rules, that's why they aren't replicated at all unless you change RemoteRole, bAlwaysRelevant, etc.

'''ToJo:''' Does anyone know if there is a simplier way to do this in UT 2003?

'''Foxpaw:''' An [[Legacy:Interaction|interaction]] should work.

'''Draconx:''' UT 2003 already has a UseTrigger, it works just like mine (unfortunately, the Activate key doesnt seem to appear in the normal key bindings screen, and must be set manually.

'''MythOpus:''' Are you refering to the Activate key for the UseTrigger?  That is set to the Use key which is by default 'U'...

'''Draconx:''' Yeah but the control doesnt appear on the controls screen ingame.  I used the rawkeybindings thing to change it on my own install.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InputKeyMap</title>
    <id>1472</id>
    <revision>
      <id>3696</id>
      <timestamp>2006-07-10T01:06:19Z</timestamp>
      <contributor>
        <ip>Dyndsl-085-016-033-112.ewe-ip-backbone.de</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The following is a listing of the input key mapping used in [[Legacy:UT2003|UT2003]], and possibly in [[Legacy:UT|UT]] as well, although I haven't verified in UT1.  The purpose of this reference document is for those creating GUI menus or [[Legacy:Interaction|Interaction]]s, which are using raw byte key mappings.  For that purpose, the two most important columns are the &quot;Hex&quot; column, which is the value you'll need to trap for in your functions, and the &quot;Key Name&quot; column, which lists the corresponding key for that hex value.

I have no idea what the unknown keys are, but probably correspond to control codes, key combinations, etc.  If I ever get around to making a commandlet or something that will log the value of every keypress, I may update the unknown fields.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Dec'''
| style=&quot;text-align: center&quot; |'''Hex'''
| style=&quot;text-align: center&quot; |'''Enum Name'''
| style=&quot;text-align: center&quot; |'''Key Name'''
| style=&quot;text-align: center&quot; |'''Default Binding''' 
|-
|0
|0
|IK_None
|None
|
|-
|1
|1
|IK_LeftMouse
|LeftMouse
|Fire 
|-
|2
|2
|IK_RightMouse
|RightMouse
|AltFire 
|-
|3
|3
|IK_Cancel
|Cancel
|
|-
|4
|4
|IK_MiddleMouse
|MiddleMouse
|MoveForward 
|-
|5
|5
|IK_Unknown05
|Unknown05
|
|-
|6
|6
|IK_Unknown06
|Unknown06
|
|-
|7
|7
|IK_Unknown07
|Unknown07
|
|-
|8
|8
|IK_Backspace
|Backspace
|Jump 
|-
|9
|9
|IK_Tab
|Tab
|Type 
|-
|10
|A
|IK_Unknown0A
|Unknown0A
|
|-
|11
|B
|IK_Unknown0B
|Unknown0B
|
|-
|12
|C
|IK_Unknown0C
|Unknown0C
|
|-
|13
|D
|IK_Enter
|Enter
|InventoryActivate 
|-
|14
|E
|IK_Unknown0E
|Unknown0E
|
|-
|15
|F
|IK_Unknown0F
|Unknown0F
|
|-
|16
|10
|IK_Shift
|Shift
|Walking 
|-
|17
|11
|IK_Ctrl
|Ctrl
|Jump 
|-
|18
|12
|IK_Alt
|Alt
|
|-
|19
|13
|IK_Pause
|Pause
|Pause 
|-
|20
|14
|IK_CapsLock
|CapsLock
|LookToggle 
|-
|21
|15
|IK_Unknown15
|Unknown15
|
|-
|22
|16
|IK_Unknown16
|Unknown16
|
|-
|23
|17
|IK_Unknown17
|Unknown17
|
|-
|24
|18
|IK_Unknown18
|Unknown18
|
|-
|25
|19
|IK_Unknown19
|Unknown19
|
|-
|26
|1A
|IK_Unknown1A
|Unknown1A
|
|-
|27
|1B
|IK_Escape
|Escape
|ShowMenu 
|-
|28
|1C
|IK_Unknown1C
|Unknown1C
|
|-
|29
|1D
|IK_Unknown1D
|Unknown1D
|
|-
|30
|1E
|IK_Unknown1E
|Unknown1E
|
|-
|31
|1F
|IK_Unknown1F
|Unknown1F
|
|-
|32
|20
|IK_Space
|Space
|Jump 
|-
|33
|21
|IK_PageUp
|PageUp
|
|-
|34
|22
|IK_PageDown
|PageDown
|LookDown 
|-
|35
|23
|IK_End
|End
|CenterView &lt;code&gt;{|

|}
&lt;/code&gt;ACTOR ALIGN SNAPTOFLOOR ALIGN=1 
|-
|36
|24
|IK_Home
|Home
|
|-
|37
|25
|IK_Left
|Left
|StrafeLeft 
|-
|38
|26
|IK_Up
|Up
|MoveForward 
|-
|39
|27
|IK_Right
|Right
|StrafeRight 
|-
|40
|28
|IK_Down
|Down
|MoveBackward 
|-
|41
|29
|IK_Select
|Select 
|-
|42
|2A
|IK_Print
|Print 
|-
|43
|2B
|IK_Execute
|Execute 
|-
|44
|2C
|IK_PrintScrn
|PrintScrn 
|-
|45
|2D
|IK_Insert
|Insert 
|-
|46
|2E
|IK_Delete
|Delete
|LookUp 
|-
|47
|2F
|IK_Help
|Help 
|-
|48
|30
|IK_0
|0
|SwitchWeapon 0 
|-
|49
|31
|IK_1
|1
|SwitchWeapon 1 
|-
|50
|32
|IK_2
|2
|SwitchWeapon 2 
|-
|51
|33
|IK_3
|3
|SwitchWeapon 3 
|-
|52
|34
|IK_4
|4
|SwitchWeapon 4 
|-
|53
|35
|IK_5
|5
|SwitchWeapon 5 
|-
|54
|36
|IK_6
|6
|SwitchWeapon 6 
|-
|55
|37
|IK_7
|7
|SwitchWeapon 7 
|-
|56
|38
|IK_8
|8
|SwitchWeapon 8 
|-
|57
|39
|IK_9
|9
|SwitchWeapon 9 
|-
|58
|3A
|IK_Unknown3A
|Unknown3A 
|-
|59
|3B
|IK_Unknown3B
|Unknown3B 
|-
|60
|3C
|IK_Unknown3C
|Unknown3C 
|-
|61
|3D
|IK_Unknown3D
|Unknown3D 
|-
|62
|3E
|IK_Unknown3E
|Unknown3E 
|-
|63
|3F
|IK_Unknown3F
|Unknown3F 
|-
|64
|40
|IK_Unknown40
|Unknown40 
|-
|65
|41
|IK_A
|A
|StrafeLeft 
|-
|66
|42
|IK_B
|B 
|-
|67
|43
|IK_C
|C
|Duck 
|-
|68
|44
|IK_D
|D
|StrafeRight 
|-
|69
|45
|IK_E
|E
|SwitchToLastWeapon 
|-
|70
|46
|IK_F
|F 
|-
|71
|47
|IK_G
|G 
|-
|72
|48
|IK_H
|H 
|-
|73
|49
|IK_I
|I 
|-
|74
|4A
|IK_J
|J
|Taunt pthrust 
|-
|75
|4B
|IK_K
|K
|Taunt asssmack 
|-
|76
|4C
|IK_L
|L
|Taunt throatcut 
|-
|77
|4D
|IK_M
|M
|BasePath 0 
|-
|78
|4E
|IK_N
|N
|BasePath 1 
|-
|79
|4F
|IK_O
|O 
|-
|80
|50
|IK_P
|P 
|-
|81
|51
|IK_Q
|Q
|SwitchWeapon 10 
|-
|82
|52
|IK_R
|R
|TeamTalk 
|-
|83
|53
|IK_S
|S
|MoveBackward 
|-
|84
|54
|IK_T
|T
|Talk 
|-
|85
|55
|IK_U
|U
|Use 
|-
|86
|56
|IK_V
|V
|SpeechMenuToggle 
|-
|87
|57
|IK_W
|W
|MoveForward 
|-
|88
|58
|IK_X
|X
|ShowVoteMenu 
|-
|89
|59
|IK_Y
|Y
|writetolog 
|-
|90
|5A
|IK_Z
|Z
|Strafe 
|-
|91
|5B
|IK_Unknown5B
|Unknown5B 
|-
|92
|5C
|IK_Unknown5C
|Unknown5C 
|-
|93
|5D
|IK_Unknown5D
|Unknown5D 
|-
|94
|5E
|IK_Unknown5E
|Unknown5E 
|-
|95
|5F
|IK_Unknown5F
|Unknown5F 
|-
|96
|60
|IK_NumPad0
|NumPad0
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=0,roll=16384) 
|-
|97
|61
|IK_NumPad1
|NumPad1
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=32768,roll=-16384) 
|-
|98
|62
|IK_NumPad2
|NumPad2
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=16384,roll=32768) 
|-
|99
|63
|IK_NumPad3
|NumPad3
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=-16384,roll=0) 
|-
|100
|64
|IK_NumPad4
|NumPad4
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=16384,yaw=0,roll=16384) 
|-
|101
|65
|IK_NumPad5
|NumPad5
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=-16384,yaw=0,roll=16384) 
|-
|102
|66
|IK_NumPad6
|NumPad6
|set playercontroller bZeroRoll True &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=0,roll=0) 
|-
|103
|67
|IK_NumPad7
|NumPad7
|StrafeLeft 
|-
|104
|68
|IK_NumPad8
|NumPad8
|MoveForward 
|-
|105
|69
|IK_NumPad9
|NumPad9
|StrafeRight 
|-
|106
|6A
|IK_GreyStar
|GreyStar 
|-
|107
|6B
|IK_GreyPlus
|GreyPlus 
|-
|108
|6C
|IK_Separator
|Separator 
|-
|109
|6D
|IK_GreyMinus
|GreyMinus 
|-
|110
|6E
|IK_NumPadPeriod
|NumPadPeriod 
|-
|111
|6F
|IK_GreySlash
|GreySlash 
|-
|112
|70
|IK_F1
|F1
|ShowScores 
|-
|113
|71
|IK_F2
|F2
|ServerInfo 
|-
|114
|72
|IK_F3
|F3
|ShowStats 
|-
|115
|73
|IK_F4
|F4
|ToggleBehindView 
|-
|116
|74
|IK_F5
|F5
|ToggleFreeCam 
|-
|117
|75
|IK_F6
|F6
|Stat Net 
|-
|118
|76
|IK_F7
|F7
|ToggleFreeCamSwivel 
|-
|119
|77
|IK_F8
|F8
|NextStats 
|-
|120
|78
|IK_F9
|F9
|shot 
|-
|121
|79
|IK_F10
|F10
|Cancel 
|-
|122
|7A
|IK_F11
|F11
|MusicMenu 
|-
|123
|7B
|IK_F12
|F12 
|-
|124
|7C
|IK_F13
|F13 
|-
|125
|7D
|IK_F14
|F14 
|-
|126
|7E
|IK_F15
|F15 
|-
|127
|7F
|IK_F16
|F16 
|-
|128
|80
|IK_F17
|F17 
|-
|129
|81
|IK_F18
|F18 
|-
|130
|82
|IK_F19
|F19 
|-
|131
|83
|IK_F20
|F20 
|-
|132
|84
|IK_F21
|F21 
|-
|133
|85
|IK_F22
|F22 
|-
|134
|86
|IK_F23
|F23 
|-
|135
|87
|IK_F24
|F24 
|-
|136
|88
|IK_Unknown88
|Unknown88 
|-
|137
|89
|IK_Unknown89
|Unknown89 
|-
|138
|8A
|IK_Unknown8A
|Unknown8A 
|-
|139
|8B
|IK_Unknown8B
|Unknown8B 
|-
|140
|8C
|IK_Unknown8C
|Unknown8C 
|-
|141
|8D
|IK_Unknown8D
|Unknown8D 
|-
|142
|8E
|IK_Unknown8E
|Unknown8E 
|-
|143
|8F
|IK_Unknown8F
|Unknown8F 
|-
|144
|90
|IK_NumLock
|NumLock 
|-
|145
|91
|IK_ScrollLock
|ScrollLock 
|-
|146
|92
|IK_Unknown92
|Unknown92 
|-
|147
|93
|IK_Unknown93
|Unknown93 
|-
|148
|94
|IK_Unknown94
|Unknown94 
|-
|149
|95
|IK_Unknown95
|Unknown95 
|-
|150
|96
|IK_Unknown96
|Unknown96 
|-
|151
|97
|IK_Unknown97
|Unknown97 
|-
|152
|98
|IK_Unknown98
|Unknown98 
|-
|153
|99
|IK_Unknown99
|Unknown99 
|-
|154
|9A
|IK_Unknown9A
|Unknown9A 
|-
|155
|9B
|IK_Unknown9B
|Unknown9B 
|-
|156
|9C
|IK_Unknown9C
|Unknown9C 
|-
|157
|9D
|IK_Unknown9D
|Unknown9D 
|-
|158
|9E
|IK_Unknown9E
|Unknown9E 
|-
|159
|9F
|IK_Unknown9F
|Unknown9F 
|-
|160
|A0
|IK_LShift
|LShift 
|-
|161
|A1
|IK_RShift
|RShift 
|-
|162
|A2
|IK_LControl
|LControl 
|-
|163
|A3
|IK_RControl
|RControl 
|-
|164
|A4
|IK_UnknownA4
|UnknownA4 
|-
|165
|A5
|IK_UnknownA5
|UnknownA5 
|-
|166
|A6
|IK_UnknownA6
|UnknownA6 
|-
|167
|A7
|IK_UnknownA7
|UnknownA7 
|-
|168
|A8
|IK_UnknownA8
|UnknownA8 
|-
|169
|A9
|IK_UnknownA9
|UnknownA9 
|-
|170
|AA
|IK_UnknownAA
|UnknownAA 
|-
|171
|AB
|IK_UnknownAB
|UnknownAB 
|-
|172
|AC
|IK_UnknownAC
|UnknownAC 
|-
|173
|AD
|IK_UnknownAD
|UnknownAD 
|-
|174
|AE
|IK_UnknownAE
|UnknownAE 
|-
|175
|AF
|IK_UnknownAF
|UnknownAF 
|-
|176
|B0
|IK_UnknownB0
|UnknownB0 
|-
|177
|B1
|IK_UnknownB1
|Next Track 0x19
|-
|178
|B2
|IK_UnknownB2
|UnknownB2 
|-
|179
|B3
|IK_UnknownB3
|UnknownB3 
|-
|180
|B4
|IK_UnknownB4
|UnknownB4 
|-
|181
|B5
|IK_UnknownB5
|UnknownB5 
|-
|182
|B6
|IK_UnknownB6
|UnknownB6 
|-
|183
|B7
|IK_UnknownB7
|UnknownB7 
|-
|184
|B8
|IK_UnknownB8
|UnknownB8 
|-
|185
|B9
|IK_Unicode
|Unicode 
|-
|186
|BA
|IK_Semicolon
|Semicolon
|Taunt gesture_point 
|-
|187
|BB
|IK_Equals
|Equals
|GrowHUD 
|-
|188
|BC
|IK_Comma
|Comma
|StrafeLeft 
|-
|189
|BD
|IK_Minus
|Minus
|ShrinkHUD 
|-
|190
|BE
|IK_Period
|Period
|StrafeRight 
|-
|191
|BF
|IK_Slash
|Slash
|NextWeapon 
|-
|192
|C0
|IK_Tilde
|Tilde
|ConsoleToggle 
|-
|193
|C1
|IK_Mouse4
|Mouse4 
|-
|194
|C2
|IK_Mouse5
|Mouse5 
|-
|195
|C3
|IK_Mouse6
|Mouse6 
|-
|196
|C4
|IK_Mouse7
|Mouse7 
|-
|197
|C5
|IK_Mouse8
|Mouse8 
|-
|198
|C6
|IK_UnknownC6
|UnknownC6 
|-
|199
|C7
|IK_UnknownC7
|UnknownC7 
|-
|200
|C8
|IK_Joy1
|Joy1
|Fire 
|-
|201
|C9
|IK_Joy2
|Joy2
|Jump 
|-
|202
|CA
|IK_Joy3
|Joy3
|AltFire 
|-
|203
|CB
|IK_Joy4
|Joy4
|Duck 
|-
|204
|CC
|IK_Joy5
|Joy5
|NextWeapon 
|-
|205
|CD
|IK_Joy6
|Joy6
|SwitchWeapon 2 
|-
|206
|CE
|IK_Joy7
|Joy7
|SwitchWeapon 3 
|-
|207
|CF
|IK_Joy8
|Joy8
|SwitchWeapon 4 
|-
|208
|D0
|IK_Joy9
|Joy9
|SwitchWeapon 9 
|-
|209
|D1
|IK_Joy10
|Joy10
|SwitchWeapon 0 
|-
|210
|D2
|IK_Joy11
|Joy11
|InventoryPrevious 
|-
|211
|D3
|IK_Joy12
|Joy12
|InventoryActivate 
|-
|212
|D4
|IK_Joy13
|Joy13
|MoveForward 
|-
|213
|D5
|IK_Joy14
|Joy14
|StrafeRight 
|-
|214
|D6
|IK_Joy15
|Joy15
|MoveBackward 
|-
|215
|D7
|IK_Joy16
|Joy16
|StrafeLeft 
|-
|216
|D8
|IK_UnknownD8
|UnknownD8 
|-
|217
|D9
|IK_UnknownD9
|UnknownD9 
|-
|218
|DA
|IK_UnknownDA
|UnknownDA 
|-
|219
|DB
|IK_LeftBracket
|LeftBracket
|InventoryPrevious 
|-
|220
|DC
|IK_Backslash
|Backslash
|ThrowWeapon 
|-
|221
|DD
|IK_RightBracket
|RightBracket
|InventoryNext 
|-
|222
|DE
|IK_SingleQuote
|SingleQuote
|Strafe 
|-
|223
|DF
|IK_UnknownDF
|UnknownDF 
|-
|224
|E0
|IK_UnknownE0
|UnknownE0 
|-
|225
|E1
|IK_UnknownE1
|UnknownE1 
|-
|226
|E2
|IK_UnknownE2
|UnknownE2 
|-
|227
|E3
|IK_UnknownE3
|UnknownE3 
|-
|228
|E4
|IK_MouseX
|MouseX
|Count bXAxis &lt;code&gt;{|

|}
&lt;/code&gt; Axis aMouseX Speed=2.0 
|-
|229
|E5
|IK_MouseY
|MouseY
|Count bYAxis &lt;code&gt;{|

|}
&lt;/code&gt; Axis aMouseY Speed=2.0 
|-
|230
|E6
|IK_MouseZ
|MouseZ 
|-
|231
|E7
|IK_MouseW
|MouseW 
|-
|232
|E8
|IK_JoyU
|JoyU 
|-
|233
|E9
|IK_JoyV
|JoyV
|Axis aBaseX SpeedBase=2.0 DeadZone=0.4 
|-
|234
|EA
|IK_JoySlider1
|JoySlider1
|Axis aLookUp SpeedBase=2.0 DeadZone=0.4 
|-
|235
|EB
|IK_JoySlider2
|JoySlider2 
|-
|236
|EC
|IK_MouseWheelUp
|MouseWheelUp
|PrevWeapon 
|-
|237
|ED
|IK_MouseWheelDown
|MouseWheelDown
|NextWeapon 
|-
|238
|EE
|IK_Unknown10E
|Unknown10E 
|-
|239
|EF
|UK_Unknown10F
|Unknown10F 
|-
|240
|F0
|IK_JoyX
|JoyX
|Axis aStrafe SpeedBase=32768.0 DeadZone=0.4 
|-
|241
|F1
|IK_JoyY
|JoyY
|Axis aBaseY SpeedBase=32768.0 DeadZone=0.4 Invert=-1 
|-
|242
|F2
|IK_JoyZ
|JoyZ 
|-
|243
|F3
|IK_JoyR
|JoyR 
|-
|244
|F4
|IK_UnknownF4
|UnknownF4 
|-
|245
|F5
|IK_UnknownF5
|UnknownF5 
|-
|246
|F6
|IK_Attn
|Attn 
|-
|247
|F7
|IK_CrSel
|CrSel 
|-
|248
|F8
|IK_ExSel
|ExSel 
|-
|249
|F9
|IK_ErEof
|ErEof 
|-
|250
|FA
|IK_Play
|Play 
|-
|251
|FB
|IK_Zoom
|Zoom 
|-
|252
|FC
|IK_NoName
|NoName 
|-
|253
|FD
|IK_PA1
|PA1 
|-
|254
|FE
|IK_OEMClear
|OEMClear 
|-
|255
|FF
|IK_MAX 
|}

==Related Topics ==
* [[Legacy:Keypress Interactions|Keypress Interactions]]</text>
    </revision>
    <revision>
      <id>3697</id>
      <timestamp>2006-04-07T07:31:30Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The following is a listing of the input key mapping used in [[Legacy:UT2003|UT2003]], and possibly in [[Legacy:UT|UT]] as well, although I haven't verified in UT1.  The purpose of this reference document is for those creating GUI menus or [[Legacy:Interaction|Interaction]]s, which are using raw byte key mappings.  For that purpose, the two most important columns are the &quot;Hex&quot; column, which is the value you'll need to trap for in your functions, and the &quot;Key Name&quot; column, which lists the corresponding key for that hex value.

I have no idea what the unknown keys are, but probably correspond to control codes, key combinations, etc.  If I ever get around to making a commandlet or something that will log the value of every keypress, I may update the unknown fields.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Dec'''
| style=&quot;text-align: center&quot; |'''Hex'''
| style=&quot;text-align: center&quot; |'''Enum Name'''
| style=&quot;text-align: center&quot; |'''Key Name'''
| style=&quot;text-align: center&quot; |'''Default Binding''' 
|-
|0
|0
|IK_None
|None
|
|-
|1
|1
|IK_LeftMouse
|LeftMouse
|Fire 
|-
|2
|2
|IK_RightMouse
|RightMouse
|AltFire 
|-
|3
|3
|IK_Cancel
|Cancel
|
|-
|4
|4
|IK_MiddleMouse
|MiddleMouse
|MoveForward 
|-
|5
|5
|IK_Unknown05
|Unknown05
|
|-
|6
|6
|IK_Unknown06
|Unknown06
|
|-
|7
|7
|IK_Unknown07
|Unknown07
|
|-
|8
|8
|IK_Backspace
|Backspace
|Jump 
|-
|9
|9
|IK_Tab
|Tab
|Type 
|-
|10
|A
|IK_Unknown0A
|Unknown0A
|
|-
|11
|B
|IK_Unknown0B
|Unknown0B
|
|-
|12
|C
|IK_Unknown0C
|Unknown0C
|
|-
|13
|D
|IK_Enter
|Enter
|InventoryActivate 
|-
|14
|E
|IK_Unknown0E
|Unknown0E
|
|-
|15
|F
|IK_Unknown0F
|Unknown0F
|
|-
|16
|10
|IK_Shift
|Shift
|Walking 
|-
|17
|11
|IK_Ctrl
|Ctrl
|Jump 
|-
|18
|12
|IK_Alt
|Alt
|
|-
|19
|13
|IK_Pause
|Pause
|Pause 
|-
|20
|14
|IK_CapsLock
|CapsLock
|LookToggle 
|-
|21
|15
|IK_Unknown15
|Unknown15
|
|-
|22
|16
|IK_Unknown16
|Unknown16
|
|-
|23
|17
|IK_Unknown17
|Unknown17
|
|-
|24
|18
|IK_Unknown18
|Unknown18
|
|-
|25
|19
|IK_Unknown19
|Unknown19
|
|-
|26
|1A
|IK_Unknown1A
|Unknown1A
|
|-
|27
|1B
|IK_Escape
|Escape
|ShowMenu 
|-
|28
|1C
|IK_Unknown1C
|Unknown1C
|
|-
|29
|1D
|IK_Unknown1D
|Unknown1D
|
|-
|30
|1E
|IK_Unknown1E
|Unknown1E
|
|-
|31
|1F
|IK_Unknown1F
|Unknown1F
|
|-
|32
|20
|IK_Space
|Space
|Jump 
|-
|33
|21
|IK_PageUp
|PageUp
|
|-
|34
|22
|IK_PageDown
|PageDown
|LookDown 
|-
|35
|23
|IK_End
|End
|CenterView &lt;code&gt;{|

|}
&lt;/code&gt;ACTOR ALIGN SNAPTOFLOOR ALIGN=1 
|-
|36
|24
|IK_Home
|Home
|
|-
|37
|25
|IK_Left
|Left
|StrafeLeft 
|-
|38
|26
|IK_Up
|Up
|MoveForward 
|-
|39
|27
|IK_Right
|Right
|StrafeRight 
|-
|40
|28
|IK_Down
|Down
|MoveBackward 
|-
|41
|29
|IK_Select
|Select 
|-
|42
|2A
|IK_Print
|Print 
|-
|43
|2B
|IK_Execute
|Execute 
|-
|44
|2C
|IK_PrintScrn
|PrintScrn 
|-
|45
|2D
|IK_Insert
|Insert 
|-
|46
|2E
|IK_Delete
|Delete
|LookUp 
|-
|47
|2F
|IK_Help
|Help 
|-
|48
|30
|IK_0
|0
|SwitchWeapon 0 
|-
|49
|31
|IK_1
|1
|SwitchWeapon 1 
|-
|50
|32
|IK_2
|2
|SwitchWeapon 2 
|-
|51
|33
|IK_3
|3
|SwitchWeapon 3 
|-
|52
|34
|IK_4
|4
|SwitchWeapon 4 
|-
|53
|35
|IK_5
|5
|SwitchWeapon 5 
|-
|54
|36
|IK_6
|6
|SwitchWeapon 6 
|-
|55
|37
|IK_7
|7
|SwitchWeapon 7 
|-
|56
|38
|IK_8
|8
|SwitchWeapon 8 
|-
|57
|39
|IK_9
|9
|SwitchWeapon 9 
|-
|58
|3A
|IK_Unknown3A
|Unknown3A 
|-
|59
|3B
|IK_Unknown3B
|Unknown3B 
|-
|60
|3C
|IK_Unknown3C
|Unknown3C 
|-
|61
|3D
|IK_Unknown3D
|Unknown3D 
|-
|62
|3E
|IK_Unknown3E
|Unknown3E 
|-
|63
|3F
|IK_Unknown3F
|Unknown3F 
|-
|64
|40
|IK_Unknown40
|Unknown40 
|-
|65
|41
|IK_A
|A
|StrafeLeft 
|-
|66
|42
|IK_B
|B 
|-
|67
|43
|IK_C
|C
|Duck 
|-
|68
|44
|IK_D
|D
|StrafeRight 
|-
|69
|45
|IK_E
|E
|SwitchToLastWeapon 
|-
|70
|46
|IK_F
|F 
|-
|71
|47
|IK_G
|G 
|-
|72
|48
|IK_H
|H 
|-
|73
|49
|IK_I
|I 
|-
|74
|4A
|IK_J
|J
|Taunt pthrust 
|-
|75
|4B
|IK_K
|K
|Taunt asssmack 
|-
|76
|4C
|IK_L
|L
|Taunt throatcut 
|-
|77
|4D
|IK_M
|M
|BasePath 0 
|-
|78
|4E
|IK_N
|N
|BasePath 1 
|-
|79
|4F
|IK_O
|O 
|-
|80
|50
|IK_P
|P 
|-
|81
|51
|IK_Q
|Q
|SwitchWeapon 10 
|-
|82
|52
|IK_R
|R
|TeamTalk 
|-
|83
|53
|IK_S
|S
|MoveBackward 
|-
|84
|54
|IK_T
|T
|Talk 
|-
|85
|55
|IK_U
|U
|Use 
|-
|86
|56
|IK_V
|V
|SpeechMenuToggle 
|-
|87
|57
|IK_W
|W
|MoveForward 
|-
|88
|58
|IK_X
|X
|ShowVoteMenu 
|-
|89
|59
|IK_Y
|Y
|writetolog 
|-
|90
|5A
|IK_Z
|Z
|Strafe 
|-
|91
|5B
|IK_Unknown5B
|Unknown5B 
|-
|92
|5C
|IK_Unknown5C
|Unknown5C 
|-
|93
|5D
|IK_Unknown5D
|Unknown5D 
|-
|94
|5E
|IK_Unknown5E
|Unknown5E 
|-
|95
|5F
|IK_Unknown5F
|Unknown5F 
|-
|96
|60
|IK_NumPad0
|NumPad0
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=0,roll=16384) 
|-
|97
|61
|IK_NumPad1
|NumPad1
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=32768,roll=-16384) 
|-
|98
|62
|IK_NumPad2
|NumPad2
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=16384,roll=32768) 
|-
|99
|63
|IK_NumPad3
|NumPad3
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=-16384,roll=0) 
|-
|100
|64
|IK_NumPad4
|NumPad4
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=16384,yaw=0,roll=16384) 
|-
|101
|65
|IK_NumPad5
|NumPad5
|set playercontroller bZeroRoll False &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=-16384,yaw=0,roll=16384) 
|-
|102
|66
|IK_NumPad6
|NumPad6
|set playercontroller bZeroRoll True &lt;code&gt;{|

|}
&lt;/code&gt; set playercontroller rotation (pitch=0,yaw=0,roll=0) 
|-
|103
|67
|IK_NumPad7
|NumPad7
|StrafeLeft 
|-
|104
|68
|IK_NumPad8
|NumPad8
|MoveForward 
|-
|105
|69
|IK_NumPad9
|NumPad9
|StrafeRight 
|-
|106
|6A
|IK_GreyStar
|GreyStar 
|-
|107
|6B
|IK_GreyPlus
|GreyPlus 
|-
|108
|6C
|IK_Separator
|Separator 
|-
|109
|6D
|IK_GreyMinus
|GreyMinus 
|-
|110
|6E
|IK_NumPadPeriod
|NumPadPeriod 
|-
|111
|6F
|IK_GreySlash
|GreySlash 
|-
|112
|70
|IK_F1
|F1
|ShowScores 
|-
|113
|71
|IK_F2
|F2
|ServerInfo 
|-
|114
|72
|IK_F3
|F3
|ShowStats 
|-
|115
|73
|IK_F4
|F4
|ToggleBehindView 
|-
|116
|74
|IK_F5
|F5
|ToggleFreeCam 
|-
|117
|75
|IK_F6
|F6
|Stat Net 
|-
|118
|76
|IK_F7
|F7
|ToggleFreeCamSwivel 
|-
|119
|77
|IK_F8
|F8
|NextStats 
|-
|120
|78
|IK_F9
|F9
|shot 
|-
|121
|79
|IK_F10
|F10
|Cancel 
|-
|122
|7A
|IK_F11
|F11
|MusicMenu 
|-
|123
|7B
|IK_F12
|F12 
|-
|124
|7C
|IK_F13
|F13 
|-
|125
|7D
|IK_F14
|F14 
|-
|126
|7E
|IK_F15
|F15 
|-
|127
|7F
|IK_F16
|F16 
|-
|128
|80
|IK_F17
|F17 
|-
|129
|81
|IK_F18
|F18 
|-
|130
|82
|IK_F19
|F19 
|-
|131
|83
|IK_F20
|F20 
|-
|132
|84
|IK_F21
|F21 
|-
|133
|85
|IK_F22
|F22 
|-
|134
|86
|IK_F23
|F23 
|-
|135
|87
|IK_F24
|F24 
|-
|136
|88
|IK_Unknown88
|Unknown88 
|-
|137
|89
|IK_Unknown89
|Unknown89 
|-
|138
|8A
|IK_Unknown8A
|Unknown8A 
|-
|139
|8B
|IK_Unknown8B
|Unknown8B 
|-
|140
|8C
|IK_Unknown8C
|Unknown8C 
|-
|141
|8D
|IK_Unknown8D
|Unknown8D 
|-
|142
|8E
|IK_Unknown8E
|Unknown8E 
|-
|143
|8F
|IK_Unknown8F
|Unknown8F 
|-
|144
|90
|IK_NumLock
|NumLock 
|-
|145
|91
|IK_ScrollLock
|ScrollLock 
|-
|146
|92
|IK_Unknown92
|Unknown92 
|-
|147
|93
|IK_Unknown93
|Unknown93 
|-
|148
|94
|IK_Unknown94
|Unknown94 
|-
|149
|95
|IK_Unknown95
|Unknown95 
|-
|150
|96
|IK_Unknown96
|Unknown96 
|-
|151
|97
|IK_Unknown97
|Unknown97 
|-
|152
|98
|IK_Unknown98
|Unknown98 
|-
|153
|99
|IK_Unknown99
|Unknown99 
|-
|154
|9A
|IK_Unknown9A
|Unknown9A 
|-
|155
|9B
|IK_Unknown9B
|Unknown9B 
|-
|156
|9C
|IK_Unknown9C
|Unknown9C 
|-
|157
|9D
|IK_Unknown9D
|Unknown9D 
|-
|158
|9E
|IK_Unknown9E
|Unknown9E 
|-
|159
|9F
|IK_Unknown9F
|Unknown9F 
|-
|160
|A0
|IK_LShift
|LShift 
|-
|161
|A1
|IK_RShift
|RShift 
|-
|162
|A2
|IK_LControl
|LControl 
|-
|163
|A3
|IK_RControl
|RControl 
|-
|164
|A4
|IK_UnknownA4
|UnknownA4 
|-
|165
|A5
|IK_UnknownA5
|UnknownA5 
|-
|166
|A6
|IK_UnknownA6
|UnknownA6 
|-
|167
|A7
|IK_UnknownA7
|UnknownA7 
|-
|168
|A8
|IK_UnknownA8
|UnknownA8 
|-
|169
|A9
|IK_UnknownA9
|UnknownA9 
|-
|170
|AA
|IK_UnknownAA
|UnknownAA 
|-
|171
|AB
|IK_UnknownAB
|UnknownAB 
|-
|172
|AC
|IK_UnknownAC
|UnknownAC 
|-
|173
|AD
|IK_UnknownAD
|UnknownAD 
|-
|174
|AE
|IK_UnknownAE
|UnknownAE 
|-
|175
|AF
|IK_UnknownAF
|UnknownAF 
|-
|176
|B0
|IK_UnknownB0
|UnknownB0 
|-
|177
|B1
|IK_UnknownB1
|UnknownB1 
|-
|178
|B2
|IK_UnknownB2
|UnknownB2 
|-
|179
|B3
|IK_UnknownB3
|UnknownB3 
|-
|180
|B4
|IK_UnknownB4
|UnknownB4 
|-
|181
|B5
|IK_UnknownB5
|UnknownB5 
|-
|182
|B6
|IK_UnknownB6
|UnknownB6 
|-
|183
|B7
|IK_UnknownB7
|UnknownB7 
|-
|184
|B8
|IK_UnknownB8
|UnknownB8 
|-
|185
|B9
|IK_Unicode
|Unicode 
|-
|186
|BA
|IK_Semicolon
|Semicolon
|Taunt gesture_point 
|-
|187
|BB
|IK_Equals
|Equals
|GrowHUD 
|-
|188
|BC
|IK_Comma
|Comma
|StrafeLeft 
|-
|189
|BD
|IK_Minus
|Minus
|ShrinkHUD 
|-
|190
|BE
|IK_Period
|Period
|StrafeRight 
|-
|191
|BF
|IK_Slash
|Slash
|NextWeapon 
|-
|192
|C0
|IK_Tilde
|Tilde
|ConsoleToggle 
|-
|193
|C1
|IK_Mouse4
|Mouse4 
|-
|194
|C2
|IK_Mouse5
|Mouse5 
|-
|195
|C3
|IK_Mouse6
|Mouse6 
|-
|196
|C4
|IK_Mouse7
|Mouse7 
|-
|197
|C5
|IK_Mouse8
|Mouse8 
|-
|198
|C6
|IK_UnknownC6
|UnknownC6 
|-
|199
|C7
|IK_UnknownC7
|UnknownC7 
|-
|200
|C8
|IK_Joy1
|Joy1
|Fire 
|-
|201
|C9
|IK_Joy2
|Joy2
|Jump 
|-
|202
|CA
|IK_Joy3
|Joy3
|AltFire 
|-
|203
|CB
|IK_Joy4
|Joy4
|Duck 
|-
|204
|CC
|IK_Joy5
|Joy5
|NextWeapon 
|-
|205
|CD
|IK_Joy6
|Joy6
|SwitchWeapon 2 
|-
|206
|CE
|IK_Joy7
|Joy7
|SwitchWeapon 3 
|-
|207
|CF
|IK_Joy8
|Joy8
|SwitchWeapon 4 
|-
|208
|D0
|IK_Joy9
|Joy9
|SwitchWeapon 9 
|-
|209
|D1
|IK_Joy10
|Joy10
|SwitchWeapon 0 
|-
|210
|D2
|IK_Joy11
|Joy11
|InventoryPrevious 
|-
|211
|D3
|IK_Joy12
|Joy12
|InventoryActivate 
|-
|212
|D4
|IK_Joy13
|Joy13
|MoveForward 
|-
|213
|D5
|IK_Joy14
|Joy14
|StrafeRight 
|-
|214
|D6
|IK_Joy15
|Joy15
|MoveBackward 
|-
|215
|D7
|IK_Joy16
|Joy16
|StrafeLeft 
|-
|216
|D8
|IK_UnknownD8
|UnknownD8 
|-
|217
|D9
|IK_UnknownD9
|UnknownD9 
|-
|218
|DA
|IK_UnknownDA
|UnknownDA 
|-
|219
|DB
|IK_LeftBracket
|LeftBracket
|InventoryPrevious 
|-
|220
|DC
|IK_Backslash
|Backslash
|ThrowWeapon 
|-
|221
|DD
|IK_RightBracket
|RightBracket
|InventoryNext 
|-
|222
|DE
|IK_SingleQuote
|SingleQuote
|Strafe 
|-
|223
|DF
|IK_UnknownDF
|UnknownDF 
|-
|224
|E0
|IK_UnknownE0
|UnknownE0 
|-
|225
|E1
|IK_UnknownE1
|UnknownE1 
|-
|226
|E2
|IK_UnknownE2
|UnknownE2 
|-
|227
|E3
|IK_UnknownE3
|UnknownE3 
|-
|228
|E4
|IK_MouseX
|MouseX
|Count bXAxis &lt;code&gt;{|

|}
&lt;/code&gt; Axis aMouseX Speed=2.0 
|-
|229
|E5
|IK_MouseY
|MouseY
|Count bYAxis &lt;code&gt;{|

|}
&lt;/code&gt; Axis aMouseY Speed=2.0 
|-
|230
|E6
|IK_MouseZ
|MouseZ 
|-
|231
|E7
|IK_MouseW
|MouseW 
|-
|232
|E8
|IK_JoyU
|JoyU 
|-
|233
|E9
|IK_JoyV
|JoyV
|Axis aBaseX SpeedBase=2.0 DeadZone=0.4 
|-
|234
|EA
|IK_JoySlider1
|JoySlider1
|Axis aLookUp SpeedBase=2.0 DeadZone=0.4 
|-
|235
|EB
|IK_JoySlider2
|JoySlider2 
|-
|236
|EC
|IK_MouseWheelUp
|MouseWheelUp
|PrevWeapon 
|-
|237
|ED
|IK_MouseWheelDown
|MouseWheelDown
|NextWeapon 
|-
|238
|EE
|IK_Unknown10E
|Unknown10E 
|-
|239
|EF
|UK_Unknown10F
|Unknown10F 
|-
|240
|F0
|IK_JoyX
|JoyX
|Axis aStrafe SpeedBase=32768.0 DeadZone=0.4 
|-
|241
|F1
|IK_JoyY
|JoyY
|Axis aBaseY SpeedBase=32768.0 DeadZone=0.4 Invert=-1 
|-
|242
|F2
|IK_JoyZ
|JoyZ 
|-
|243
|F3
|IK_JoyR
|JoyR 
|-
|244
|F4
|IK_UnknownF4
|UnknownF4 
|-
|245
|F5
|IK_UnknownF5
|UnknownF5 
|-
|246
|F6
|IK_Attn
|Attn 
|-
|247
|F7
|IK_CrSel
|CrSel 
|-
|248
|F8
|IK_ExSel
|ExSel 
|-
|249
|F9
|IK_ErEof
|ErEof 
|-
|250
|FA
|IK_Play
|Play 
|-
|251
|FB
|IK_Zoom
|Zoom 
|-
|252
|FC
|IK_NoName
|NoName 
|-
|253
|FD
|IK_PA1
|PA1 
|-
|254
|FE
|IK_OEMClear
|OEMClear 
|-
|255
|FF
|IK_MAX 
|}

==Related Topics ==
* [[Legacy:Keypress Interactions|Keypress Interactions]]</text>
    </revision>
    <revision>
      <id>34001</id>
      <timestamp>2009-02-07T22:17:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed import errors</comment>
      <text xml:space="preserve">The following is a listing of the input key mapping used in [[Legacy:UT2003|UT2003]], and possibly in [[Legacy:UT|UT]] as well, although I haven't verified in UT1.  The purpose of this reference document is for those creating GUI menus or [[Legacy:Interaction|Interaction]]s, which are using raw byte key mappings.  For that purpose, the two most important columns are the &quot;Hex&quot; column, which is the value you'll need to trap for in your functions, and the &quot;Key Name&quot; column, which lists the corresponding key for that hex value.

I have no idea what the unknown keys are, but probably correspond to control codes, key combinations, etc.  If I ever get around to making a commandlet or something that will log the value of every keypress, I may update the unknown fields.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Dec'''
| style=&quot;text-align: center&quot; |'''Hex'''
| style=&quot;text-align: center&quot; |'''Enum Name'''
| style=&quot;text-align: center&quot; |'''Key Name'''
| style=&quot;text-align: center&quot; |'''Default Binding''' 
|-
|0
|0
|IK_None
|None
|
|-
|1
|1
|IK_LeftMouse
|LeftMouse
|Fire 
|-
|2
|2
|IK_RightMouse
|RightMouse
|AltFire 
|-
|3
|3
|IK_Cancel
|Cancel
|
|-
|4
|4
|IK_MiddleMouse
|MiddleMouse
|MoveForward 
|-
|5
|5
|IK_Unknown05
|Unknown05
|
|-
|6
|6
|IK_Unknown06
|Unknown06
|
|-
|7
|7
|IK_Unknown07
|Unknown07
|
|-
|8
|8
|IK_Backspace
|Backspace
|Jump 
|-
|9
|9
|IK_Tab
|Tab
|Type 
|-
|10
|A
|IK_Unknown0A
|Unknown0A
|
|-
|11
|B
|IK_Unknown0B
|Unknown0B
|
|-
|12
|C
|IK_Unknown0C
|Unknown0C
|
|-
|13
|D
|IK_Enter
|Enter
|InventoryActivate 
|-
|14
|E
|IK_Unknown0E
|Unknown0E
|
|-
|15
|F
|IK_Unknown0F
|Unknown0F
|
|-
|16
|10
|IK_Shift
|Shift
|Walking 
|-
|17
|11
|IK_Ctrl
|Ctrl
|Jump 
|-
|18
|12
|IK_Alt
|Alt
|
|-
|19
|13
|IK_Pause
|Pause
|Pause 
|-
|20
|14
|IK_CapsLock
|CapsLock
|LookToggle 
|-
|21
|15
|IK_Unknown15
|Unknown15
|
|-
|22
|16
|IK_Unknown16
|Unknown16
|
|-
|23
|17
|IK_Unknown17
|Unknown17
|
|-
|24
|18
|IK_Unknown18
|Unknown18
|
|-
|25
|19
|IK_Unknown19
|Unknown19
|
|-
|26
|1A
|IK_Unknown1A
|Unknown1A
|
|-
|27
|1B
|IK_Escape
|Escape
|ShowMenu 
|-
|28
|1C
|IK_Unknown1C
|Unknown1C
|
|-
|29
|1D
|IK_Unknown1D
|Unknown1D
|
|-
|30
|1E
|IK_Unknown1E
|Unknown1E
|
|-
|31
|1F
|IK_Unknown1F
|Unknown1F
|
|-
|32
|20
|IK_Space
|Space
|Jump 
|-
|33
|21
|IK_PageUp
|PageUp
|
|-
|34
|22
|IK_PageDown
|PageDown
|LookDown 
|-
|35
|23
|IK_End
|End
|CenterView &lt;nowiki&gt;|&lt;/nowiki&gt; ACTOR ALIGN SNAPTOFLOOR ALIGN=1 
|-
|36
|24
|IK_Home
|Home
|
|-
|37
|25
|IK_Left
|Left
|StrafeLeft 
|-
|38
|26
|IK_Up
|Up
|MoveForward 
|-
|39
|27
|IK_Right
|Right
|StrafeRight 
|-
|40
|28
|IK_Down
|Down
|MoveBackward 
|-
|41
|29
|IK_Select
|Select 
|-
|42
|2A
|IK_Print
|Print 
|-
|43
|2B
|IK_Execute
|Execute 
|-
|44
|2C
|IK_PrintScrn
|PrintScrn 
|-
|45
|2D
|IK_Insert
|Insert 
|-
|46
|2E
|IK_Delete
|Delete
|LookUp 
|-
|47
|2F
|IK_Help
|Help 
|-
|48
|30
|IK_0
|0
|SwitchWeapon 0 
|-
|49
|31
|IK_1
|1
|SwitchWeapon 1 
|-
|50
|32
|IK_2
|2
|SwitchWeapon 2 
|-
|51
|33
|IK_3
|3
|SwitchWeapon 3 
|-
|52
|34
|IK_4
|4
|SwitchWeapon 4 
|-
|53
|35
|IK_5
|5
|SwitchWeapon 5 
|-
|54
|36
|IK_6
|6
|SwitchWeapon 6 
|-
|55
|37
|IK_7
|7
|SwitchWeapon 7 
|-
|56
|38
|IK_8
|8
|SwitchWeapon 8 
|-
|57
|39
|IK_9
|9
|SwitchWeapon 9 
|-
|58
|3A
|IK_Unknown3A
|Unknown3A 
|-
|59
|3B
|IK_Unknown3B
|Unknown3B 
|-
|60
|3C
|IK_Unknown3C
|Unknown3C 
|-
|61
|3D
|IK_Unknown3D
|Unknown3D 
|-
|62
|3E
|IK_Unknown3E
|Unknown3E 
|-
|63
|3F
|IK_Unknown3F
|Unknown3F 
|-
|64
|40
|IK_Unknown40
|Unknown40 
|-
|65
|41
|IK_A
|A
|StrafeLeft 
|-
|66
|42
|IK_B
|B 
|-
|67
|43
|IK_C
|C
|Duck 
|-
|68
|44
|IK_D
|D
|StrafeRight 
|-
|69
|45
|IK_E
|E
|SwitchToLastWeapon 
|-
|70
|46
|IK_F
|F 
|-
|71
|47
|IK_G
|G 
|-
|72
|48
|IK_H
|H 
|-
|73
|49
|IK_I
|I 
|-
|74
|4A
|IK_J
|J
|Taunt pthrust 
|-
|75
|4B
|IK_K
|K
|Taunt asssmack 
|-
|76
|4C
|IK_L
|L
|Taunt throatcut 
|-
|77
|4D
|IK_M
|M
|BasePath 0 
|-
|78
|4E
|IK_N
|N
|BasePath 1 
|-
|79
|4F
|IK_O
|O 
|-
|80
|50
|IK_P
|P 
|-
|81
|51
|IK_Q
|Q
|SwitchWeapon 10 
|-
|82
|52
|IK_R
|R
|TeamTalk 
|-
|83
|53
|IK_S
|S
|MoveBackward 
|-
|84
|54
|IK_T
|T
|Talk 
|-
|85
|55
|IK_U
|U
|Use 
|-
|86
|56
|IK_V
|V
|SpeechMenuToggle 
|-
|87
|57
|IK_W
|W
|MoveForward 
|-
|88
|58
|IK_X
|X
|ShowVoteMenu 
|-
|89
|59
|IK_Y
|Y
|writetolog 
|-
|90
|5A
|IK_Z
|Z
|Strafe 
|-
|91
|5B
|IK_Unknown5B
|Unknown5B 
|-
|92
|5C
|IK_Unknown5C
|Unknown5C 
|-
|93
|5D
|IK_Unknown5D
|Unknown5D 
|-
|94
|5E
|IK_Unknown5E
|Unknown5E 
|-
|95
|5F
|IK_Unknown5F
|Unknown5F 
|-
|96
|60
|IK_NumPad0
|NumPad0
|set playercontroller bZeroRoll False &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=0,yaw=0,roll=16384) 
|-
|97
|61
|IK_NumPad1
|NumPad1
|set playercontroller bZeroRoll False &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=0,yaw=32768,roll=-16384) 
|-
|98
|62
|IK_NumPad2
|NumPad2
|set playercontroller bZeroRoll False &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=0,yaw=16384,roll=32768) 
|-
|99
|63
|IK_NumPad3
|NumPad3
|set playercontroller bZeroRoll False &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=0,yaw=-16384,roll=0) 
|-
|100
|64
|IK_NumPad4
|NumPad4
|set playercontroller bZeroRoll False &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=16384,yaw=0,roll=16384) 
|-
|101
|65
|IK_NumPad5
|NumPad5
|set playercontroller bZeroRoll False &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=-16384,yaw=0,roll=16384) 
|-
|102
|66
|IK_NumPad6
|NumPad6
|set playercontroller bZeroRoll True &lt;nowiki&gt;|&lt;/nowiki&gt; set playercontroller rotation (pitch=0,yaw=0,roll=0) 
|-
|103
|67
|IK_NumPad7
|NumPad7
|StrafeLeft 
|-
|104
|68
|IK_NumPad8
|NumPad8
|MoveForward 
|-
|105
|69
|IK_NumPad9
|NumPad9
|StrafeRight 
|-
|106
|6A
|IK_GreyStar
|GreyStar 
|-
|107
|6B
|IK_GreyPlus
|GreyPlus 
|-
|108
|6C
|IK_Separator
|Separator 
|-
|109
|6D
|IK_GreyMinus
|GreyMinus 
|-
|110
|6E
|IK_NumPadPeriod
|NumPadPeriod 
|-
|111
|6F
|IK_GreySlash
|GreySlash 
|-
|112
|70
|IK_F1
|F1
|ShowScores 
|-
|113
|71
|IK_F2
|F2
|ServerInfo 
|-
|114
|72
|IK_F3
|F3
|ShowStats 
|-
|115
|73
|IK_F4
|F4
|ToggleBehindView 
|-
|116
|74
|IK_F5
|F5
|ToggleFreeCam 
|-
|117
|75
|IK_F6
|F6
|Stat Net 
|-
|118
|76
|IK_F7
|F7
|ToggleFreeCamSwivel 
|-
|119
|77
|IK_F8
|F8
|NextStats 
|-
|120
|78
|IK_F9
|F9
|shot 
|-
|121
|79
|IK_F10
|F10
|Cancel 
|-
|122
|7A
|IK_F11
|F11
|MusicMenu 
|-
|123
|7B
|IK_F12
|F12 
|-
|124
|7C
|IK_F13
|F13 
|-
|125
|7D
|IK_F14
|F14 
|-
|126
|7E
|IK_F15
|F15 
|-
|127
|7F
|IK_F16
|F16 
|-
|128
|80
|IK_F17
|F17 
|-
|129
|81
|IK_F18
|F18 
|-
|130
|82
|IK_F19
|F19 
|-
|131
|83
|IK_F20
|F20 
|-
|132
|84
|IK_F21
|F21 
|-
|133
|85
|IK_F22
|F22 
|-
|134
|86
|IK_F23
|F23 
|-
|135
|87
|IK_F24
|F24 
|-
|136
|88
|IK_Unknown88
|Unknown88 
|-
|137
|89
|IK_Unknown89
|Unknown89 
|-
|138
|8A
|IK_Unknown8A
|Unknown8A 
|-
|139
|8B
|IK_Unknown8B
|Unknown8B 
|-
|140
|8C
|IK_Unknown8C
|Unknown8C 
|-
|141
|8D
|IK_Unknown8D
|Unknown8D 
|-
|142
|8E
|IK_Unknown8E
|Unknown8E 
|-
|143
|8F
|IK_Unknown8F
|Unknown8F 
|-
|144
|90
|IK_NumLock
|NumLock 
|-
|145
|91
|IK_ScrollLock
|ScrollLock 
|-
|146
|92
|IK_Unknown92
|Unknown92 
|-
|147
|93
|IK_Unknown93
|Unknown93 
|-
|148
|94
|IK_Unknown94
|Unknown94 
|-
|149
|95
|IK_Unknown95
|Unknown95 
|-
|150
|96
|IK_Unknown96
|Unknown96 
|-
|151
|97
|IK_Unknown97
|Unknown97 
|-
|152
|98
|IK_Unknown98
|Unknown98 
|-
|153
|99
|IK_Unknown99
|Unknown99 
|-
|154
|9A
|IK_Unknown9A
|Unknown9A 
|-
|155
|9B
|IK_Unknown9B
|Unknown9B 
|-
|156
|9C
|IK_Unknown9C
|Unknown9C 
|-
|157
|9D
|IK_Unknown9D
|Unknown9D 
|-
|158
|9E
|IK_Unknown9E
|Unknown9E 
|-
|159
|9F
|IK_Unknown9F
|Unknown9F 
|-
|160
|A0
|IK_LShift
|LShift 
|-
|161
|A1
|IK_RShift
|RShift 
|-
|162
|A2
|IK_LControl
|LControl 
|-
|163
|A3
|IK_RControl
|RControl 
|-
|164
|A4
|IK_UnknownA4
|UnknownA4 
|-
|165
|A5
|IK_UnknownA5
|UnknownA5 
|-
|166
|A6
|IK_UnknownA6
|UnknownA6 
|-
|167
|A7
|IK_UnknownA7
|UnknownA7 
|-
|168
|A8
|IK_UnknownA8
|UnknownA8 
|-
|169
|A9
|IK_UnknownA9
|UnknownA9 
|-
|170
|AA
|IK_UnknownAA
|UnknownAA 
|-
|171
|AB
|IK_UnknownAB
|UnknownAB 
|-
|172
|AC
|IK_UnknownAC
|UnknownAC 
|-
|173
|AD
|IK_UnknownAD
|UnknownAD 
|-
|174
|AE
|IK_UnknownAE
|UnknownAE 
|-
|175
|AF
|IK_UnknownAF
|UnknownAF 
|-
|176
|B0
|IK_UnknownB0
|UnknownB0 
|-
|177
|B1
|IK_UnknownB1
|Next Track 0x19
|-
|178
|B2
|IK_UnknownB2
|UnknownB2 
|-
|179
|B3
|IK_UnknownB3
|UnknownB3 
|-
|180
|B4
|IK_UnknownB4
|UnknownB4 
|-
|181
|B5
|IK_UnknownB5
|UnknownB5 
|-
|182
|B6
|IK_UnknownB6
|UnknownB6 
|-
|183
|B7
|IK_UnknownB7
|UnknownB7 
|-
|184
|B8
|IK_UnknownB8
|UnknownB8 
|-
|185
|B9
|IK_Unicode
|Unicode 
|-
|186
|BA
|IK_Semicolon
|Semicolon
|Taunt gesture_point 
|-
|187
|BB
|IK_Equals
|Equals
|GrowHUD 
|-
|188
|BC
|IK_Comma
|Comma
|StrafeLeft 
|-
|189
|BD
|IK_Minus
|Minus
|ShrinkHUD 
|-
|190
|BE
|IK_Period
|Period
|StrafeRight 
|-
|191
|BF
|IK_Slash
|Slash
|NextWeapon 
|-
|192
|C0
|IK_Tilde
|Tilde
|ConsoleToggle 
|-
|193
|C1
|IK_Mouse4
|Mouse4 
|-
|194
|C2
|IK_Mouse5
|Mouse5 
|-
|195
|C3
|IK_Mouse6
|Mouse6 
|-
|196
|C4
|IK_Mouse7
|Mouse7 
|-
|197
|C5
|IK_Mouse8
|Mouse8 
|-
|198
|C6
|IK_UnknownC6
|UnknownC6 
|-
|199
|C7
|IK_UnknownC7
|UnknownC7 
|-
|200
|C8
|IK_Joy1
|Joy1
|Fire 
|-
|201
|C9
|IK_Joy2
|Joy2
|Jump 
|-
|202
|CA
|IK_Joy3
|Joy3
|AltFire 
|-
|203
|CB
|IK_Joy4
|Joy4
|Duck 
|-
|204
|CC
|IK_Joy5
|Joy5
|NextWeapon 
|-
|205
|CD
|IK_Joy6
|Joy6
|SwitchWeapon 2 
|-
|206
|CE
|IK_Joy7
|Joy7
|SwitchWeapon 3 
|-
|207
|CF
|IK_Joy8
|Joy8
|SwitchWeapon 4 
|-
|208
|D0
|IK_Joy9
|Joy9
|SwitchWeapon 9 
|-
|209
|D1
|IK_Joy10
|Joy10
|SwitchWeapon 0 
|-
|210
|D2
|IK_Joy11
|Joy11
|InventoryPrevious 
|-
|211
|D3
|IK_Joy12
|Joy12
|InventoryActivate 
|-
|212
|D4
|IK_Joy13
|Joy13
|MoveForward 
|-
|213
|D5
|IK_Joy14
|Joy14
|StrafeRight 
|-
|214
|D6
|IK_Joy15
|Joy15
|MoveBackward 
|-
|215
|D7
|IK_Joy16
|Joy16
|StrafeLeft 
|-
|216
|D8
|IK_UnknownD8
|UnknownD8 
|-
|217
|D9
|IK_UnknownD9
|UnknownD9 
|-
|218
|DA
|IK_UnknownDA
|UnknownDA 
|-
|219
|DB
|IK_LeftBracket
|LeftBracket
|InventoryPrevious 
|-
|220
|DC
|IK_Backslash
|Backslash
|ThrowWeapon 
|-
|221
|DD
|IK_RightBracket
|RightBracket
|InventoryNext 
|-
|222
|DE
|IK_SingleQuote
|SingleQuote
|Strafe 
|-
|223
|DF
|IK_UnknownDF
|UnknownDF 
|-
|224
|E0
|IK_UnknownE0
|UnknownE0 
|-
|225
|E1
|IK_UnknownE1
|UnknownE1 
|-
|226
|E2
|IK_UnknownE2
|UnknownE2 
|-
|227
|E3
|IK_UnknownE3
|UnknownE3 
|-
|228
|E4
|IK_MouseX
|MouseX
|Count bXAxis &lt;nowiki&gt;|&lt;/nowiki&gt; Axis aMouseX Speed=2.0 
|-
|229
|E5
|IK_MouseY
|MouseY
|Count bYAxis &lt;nowiki&gt;|&lt;/nowiki&gt; Axis aMouseY Speed=2.0 
|-
|230
|E6
|IK_MouseZ
|MouseZ 
|-
|231
|E7
|IK_MouseW
|MouseW 
|-
|232
|E8
|IK_JoyU
|JoyU 
|-
|233
|E9
|IK_JoyV
|JoyV
|Axis aBaseX SpeedBase=2.0 DeadZone=0.4 
|-
|234
|EA
|IK_JoySlider1
|JoySlider1
|Axis aLookUp SpeedBase=2.0 DeadZone=0.4 
|-
|235
|EB
|IK_JoySlider2
|JoySlider2 
|-
|236
|EC
|IK_MouseWheelUp
|MouseWheelUp
|PrevWeapon 
|-
|237
|ED
|IK_MouseWheelDown
|MouseWheelDown
|NextWeapon 
|-
|238
|EE
|IK_Unknown10E
|Unknown10E 
|-
|239
|EF
|UK_Unknown10F
|Unknown10F 
|-
|240
|F0
|IK_JoyX
|JoyX
|Axis aStrafe SpeedBase=32768.0 DeadZone=0.4 
|-
|241
|F1
|IK_JoyY
|JoyY
|Axis aBaseY SpeedBase=32768.0 DeadZone=0.4 Invert=-1 
|-
|242
|F2
|IK_JoyZ
|JoyZ 
|-
|243
|F3
|IK_JoyR
|JoyR 
|-
|244
|F4
|IK_UnknownF4
|UnknownF4 
|-
|245
|F5
|IK_UnknownF5
|UnknownF5 
|-
|246
|F6
|IK_Attn
|Attn 
|-
|247
|F7
|IK_CrSel
|CrSel 
|-
|248
|F8
|IK_ExSel
|ExSel 
|-
|249
|F9
|IK_ErEof
|ErEof 
|-
|250
|FA
|IK_Play
|Play 
|-
|251
|FB
|IK_Zoom
|Zoom 
|-
|252
|FC
|IK_NoName
|NoName 
|-
|253
|FD
|IK_PA1
|PA1 
|-
|254
|FE
|IK_OEMClear
|OEMClear 
|-
|255
|FF
|IK_MAX 
|}

==Related Topics ==
* [[Legacy:Keypress Interactions|Keypress Interactions]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InsertLocalizedString</title>
    <id>1517</id>
    <revision>
      <id>3796</id>
      <timestamp>2007-04-10T11:13:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted once again and locked</comment>
      <text xml:space="preserve">==About==

This macro makes it easy to use localized strings. It will prompt for the localized name and the international value of the localized string, it will then find the place where to declare the localized string. For this you will have to add the following comment in your source file:

&lt;uscript&gt;
//!localization
&lt;/uscript&gt;

It will then declare the variable, find the defaultproperties block (create it if it doesn't exist) and add the value to the default properties. finally it will add the variable name to current location.

===Before===

''Note: the | below indicates the current cursor position'';

&lt;uscript&gt;
class MyClass extends Object

//!localization

function DoSomething()
{
  BroadcastMessage(|);
}
&lt;/uscript&gt;

===After===

&lt;uscript&gt;
class MyClass extends Object

//!localization
var localized string MyLocalisedString;

function DoSomething()
{
  BroadcastMessage(MyLocalisedString|);
}

defaultproperties
{
  MyLocalisedString=&quot;This is my localised string&quot;
}
&lt;/uscript&gt;

==Code==

&lt;uscript&gt;
//
//  InsertLocalizedString - version 1.0
//  by Michiel &quot;El Muerte&quot; Hendriks &lt;elmuerte@drunksnipers.com&gt;
//
// This macro makes it easy to use localized strings. It will prompt for the
// localized name and the international value of the localized string, it will
// then find the place where to declare the localized string. For this you
// will have to add the following comment in your source file:
//      //!localization
// It will then declare the variable, find the defaultproperties block (create
// it if it doesn't exist) and add the value to the default properties. finally
// it will add the variable name to current location.
//

program InsertLocalizedString
begin
    XPos, YPos := CursorXY();

    qres, stringName := InputQuery('Localized string', 'Enter the name of the localized string', '');
    if ((stringName = '') or (qres = false)) then exit;
    stringVal := InputBox('Localized string', 'Enter the international value', '');

    // find &quot;//!localization&quot; entry
    SetCursorXY(1, 1);
    while (CompareText(CurrentLine(), '//!localization') &lt;&gt; 0) do begin
        DoEditorCommand(ecDown);
        tx, ty := CursorXY();
        if (ty &gt;= LineCount()) then begin
            SetCursorXY(XPos, YPos);
            Beep();
            ShowMessage('Error: no //!localization line found');
            exit;
        end;
    end;
    DoEditorCommand(ecDown);
    DoEditorCommand(ecLineStart);

    bHasLocalizedString := false;
    if (CompareText(CurrentWord(), 'var') = 0) then begin
        DoEditorCommand(ecWordRight);
        if (CompareText(CurrentWord(), 'localized') = 0) then begin
            bHasLocalizedString := true;
            DoEditorCommand(ecLineStart);
        end;
    end;
    if (bHasLocalizedString = false) then begin
        DoEditorCommand(ecInsertLine);
        YPos := YPos+1;
        DoEditorCommand(ecAddString, 'var localized string ;');
        DoEditorCommand(ecLineStart);
    end;

    // find ';'
    while (true) do begin
        DoEditorCommand(ecSelWordRight);
        if (pos(';', SelText()) &gt; 0) then break;
        tx, ty := CursorXY();
        if (ty &gt;= LineCount()) then begin
            ShowMessage('Error: &quot;;&quot; not found');
            exit;
        end;
    end;
    DoEditorCommand(ecLeft);
    if (bHasLocalizedString) then DoEditorCommand(ecAddString, ', ');
    tx, ty := CursorXY();
    // insert a newline
    if (tx &gt;= 80) then begin
        DoEditorCommand(ecInsertLine);
        YPos := YPos+1;
        DoEditorCommand(ecDown);
        DoEditorCommand(ecLineStart);
        DoEditorCommand(ecTab);
    end;
    DoEditorCommand(ecAddString, stringName);

    //DoEditorCommand(ecInsertLine);
    //DoEditorCommand(ecAddString, 'var localized string '+stringName+';');

    // find defaultproperties
    while (CompareText(CurrentLine(), 'defaultproperties') &lt;&gt; 0) do begin
        DoEditorCommand(ecDown);
        tx, ty := CursorXY();
        if (ty &gt;= LineCount()) then begin
            DoEditorCommand(ecInsertLine);
            DoEditorCommand(ecDown);
            DoEditorCommand(ecAddString, 'defaultproperties');
            DoEditorCommand(ecLineBreak);
            DoEditorCommand(ecAddString, '{');
            DoEditorCommand(ecLineBreak);
            DoEditorCommand(ecAddString, '}');
            DoEditorCommand(ecUp);
            DoEditorCommand(ecUp);
            break;
        end;
    end;

    // move to end of defaultproperties block
    DoEditorCommand(ecDown);
    DoEditorCommand(ecLineStart);
    DoEditorCommand(ecMatchBracket);
    DoEditorCommand(ecInsertLine);
    DoEditorCommand(ecTab);
    DoEditorCommand(ecAddString, stringName+'=&quot;'+stringVal+'&quot;');

    // restore position
    SetCursorXY(XPos, YPos);
    DoEditorCommand(ecAddString, stringName);
end;
&lt;/uscript&gt;

&amp;rarr; ---
[[Category:Legacy WOTgreal Macro|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3797</id>
      <timestamp>2007-04-10T10:44:55Z</timestamp>
      <contributor>
        <ip>200.238.102.162</ip>
      </contributor>
      <comment>Unknown</comment>
      <text xml:space="preserve">&lt;a href=&quot; http://xhttp.net/rbk4/samsung-ringtones.html &quot;&gt; samsung ringtones &lt;/a&gt;

&lt;a href=&quot; http://xhttp.net/rbk4/alcatel-ringtones.html &quot;&gt; alcatel ringtones &lt;/a&gt;

&lt;a href=&quot; http://xhttp.net/rbk4/razr-ringtones.html &quot;&gt; razr ringtones &lt;/a&gt;</text>
    </revision>
    <revision>
      <id>3798</id>
      <timestamp>2007-04-10T10:52:56Z</timestamp>
      <contributor>
        <ip>61-91-191-8.static.asianet.co.th</ip>
      </contributor>
      <comment>Unknown</comment>
      <text xml:space="preserve">&lt;a href=&quot; http://xhttp.net/ort1/ambien.html &quot;&gt; Buy ambien &lt;/a&gt;&lt;a href=&quot; http://xhttp.net/ort1/xanax.html &quot;&gt; Buy xanax &lt;/a&gt;&lt;a href=&quot; http://xhttp.net/ort1/zoloft.html &quot;&gt; Buy zoloft &lt;/a&gt;

&lt;a href=&quot; http://xhttp.net/ort1/ultram.html &quot;&gt; Buy ultram &lt;/a&gt;&lt;a href=&quot; http://xhttp.net/ort1/meridia.html &quot;&gt; Buy meridia &lt;/a&gt;&lt;a href=&quot; http://xhttp.net/ort1/levitra.html &quot;&gt; Buy levitra &lt;/a&gt;&lt;a href=&quot; http://xhttp.net/ort1/cialis.html &quot;&gt; Buy cialis &lt;/a&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Insertion Sort</title>
    <id>1513</id>
    <revision>
      <id>3787</id>
      <timestamp>2007-07-10T18:07:23Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">Insertion Sort is an iterative sorting algorithm like Bubble Sort. While this algorithm generally is less efficient than [[Legacy:QuickSort|QuickSort]], the UnrealScript implementation on this page can greatly out-perform QuickSort in certain cases. For more information, see [[Wikipedia:Insertion Sort]].

==Advantages of Insertion Sort==
* Simple to implement
* Efficient on (quite) small data sets
* Efficient on data sets which are already substantially sorted
* Stable (i.e. does not change the order of already ordered elements)
* Does not suffer from poor &quot;worst case input&quot; performance
* Minimal memory requirements

==Algorithm==

Originally the Insertion Sort algorithm works like this:
# Start with the result being the first element of the input.
# Loop over the input array until it is empty, &quot;removing&quot; the first remaining (leftmost) element.
# Compare the removed element against the current result, starting from the highest (rightmost) element and working left towards the lowest element.
# If the removed input element is lower than the current result element, copy that value into the following element to make room for the new element below and repeat with the next lowest result element.
# Otherwise, the new element is in the correct location; save it in the cell left by copying the last examined result up and start again from (2) with the next input element.

However, with UnrealScript's dynamic arrays and their Remove() and Insert() methods the algorithm can be modified to this:
# Start with the result being the first element of the input.
# Loop over the input array until it is empty, remembering the first remaining (leftmost) element.
# Compare the removed element against the current result, starting from the highest (rightmost) element, and working left towards the lowest element.
# If the removed input element is higher than the current result element, the element's correct location is found; remove it from its original location, insert it at the new location and start again from (2) with the next input element.

For numeric arrays the last two steps can be optimized using [[Legacy:BinarySearch|BinarySearch]] to search the new location in the sorted part of the array if it's not already in the correct location.

==Code==

===Implementation for Dynamic Arrays of Strings===

This implementation only works for dynamic arrays. This particular example sorts all elements in &lt;code&gt;MyArray&lt;/code&gt; with an index between (including) the &lt;code&gt;LowerBound&lt;/code&gt; and the &lt;code&gt;UpperBound&lt;/code&gt;. Optionally it can sort the strings case-insensitively.

&lt;uscript&gt;
//== static InsertSortSArray ==================================================
/**
Sorts a string array using Insertion Sort.
Due to the dynamic array implementation this is considerably faster than
QuickSort on smaller arrays and especially on already sorted arrays.
*/
//=============================================================================

static final function InsertSortSArray(out array&lt;string&gt; MyArray, int LowerBound, int UpperBound, optional bool bCaseInsenstive)
{
  local int InsertIndex, RemovedIndex;
  
  if ( LowerBound &lt; UpperBound )
     for (RemovedIndex = LowerBound + 1; RemovedIndex &lt;= UpperBound; ++RemovedIndex) {
      InsertIndex = RemovedIndex;
      if ( !bCaseInsenstive ) {
        while (InsertIndex &gt; LowerBound &amp;&amp; MyArray[InsertIndex-1] &gt; MyArray[RemovedIndex])
          --InsertIndex;
      }
      else {
        while (InsertIndex &gt; LowerBound &amp;&amp; Caps(MyArray[InsertIndex-1]) &gt; Caps(MyArray[RemovedIndex]))
          --InsertIndex;
      }
      if ( RemovedIndex != InsertIndex ) {
        MyArray.Insert(InsertIndex, 1);
        MyArray[InsertIndex] = MyArray[RemovedIndex + 1];
        MyArray.Remove(RemovedIndex + 1, 1);
      }
    }
}
&lt;/uscript&gt;

'''Foxpaw:''' Are you sure that that's an optimization, Wormbo? By removing the temporary variable, you save an assignment, but you gain two addition operations.

'''Wormbo:''' In UnrealScript assignments are very expensive operations, especially if you're not dealing with string, but e.g. complex structs. In that case it's really an optimization.

===Optimized Implementation for Dynamic Arrays of Numeric Values===

This implementation's use of [[Legacy:BinarySearch|BinarySearch]] for finding the &lt;code&gt;InsertIndex&lt;/code&gt; of unsorted elements means a huge performance improvement over a linear search approach with large, unsorted arrays.

Also, because binary search requires less iterations for finding the &lt;code&gt;InsertIndex&lt;/code&gt;, this implementation of Insertion Sort can handle larger unsorted arrays than the string implementation above without causing a runaway loop crash.

An extreme example: It took about 80 seconds (!) to sort a test array with 100,000 random integer numbers, but it was sorted ''without crashing''. Sorting this huge sorted array again took only about 100 milliseconds.

You can use this implementation for any kind of dynamic array of comparable values.

&lt;uscript&gt;
//== static InsertSortIArray ==================================================
/**
Sorts an int array using optimized Insertion Sort.
This implementation outperforms QuickSort due to its use of dynamic arrays and
BinarySearch for unsorted elements.
*/
//=============================================================================

static final function InsertSortIArray(out array&lt;int&gt; MyArray, int LowerBound, int UpperBound)
{
  local int InsertIndex, RemovedIndex;
  local int High, Closest;
  
  if ( LowerBound &lt; UpperBound )
     for (RemovedIndex = LowerBound + 1; RemovedIndex &lt;= UpperBound; ++RemovedIndex) {
      if ( MyArray[RemovedIndex-1] &gt; MyArray[RemovedIndex] ) {
        // element is not in the correct place, find InsertIndex with BinarySearch
        InsertIndex = 0;
        High = RemovedIndex - 1;
        while (InsertIndex &lt;= High) {
          Closest = (InsertIndex + High) / 2;
          if ( MyArray[Closest] == MyArray[RemovedIndex] ) {
            InsertIndex = Closest;
            break;
          }
          if ( MyArray[Closest] &gt; MyArray[RemovedIndex] )
            High = Closest - 1;
          else if ( MyArray[Closest] &lt; MyArray[RemovedIndex] )
            InsertIndex = Closest + 1;
        }
        if ( InsertIndex &lt; RemovedIndex &amp;&amp; MyArray[InsertIndex] &lt; MyArray[RemovedIndex] )
          ++InsertIndex;
      }
      else
        InsertIndex = RemovedIndex;
      

      if ( RemovedIndex != InsertIndex ) {
        MyArray.Insert(InsertIndex, 1);
        MyArray[InsertIndex] = MyArray[RemovedIndex + 1];
        MyArray.Remove(RemovedIndex + 1, 1);
      }
    }
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:QuickSort|QuickSort]]
* [[Legacy:BinarySearch|BinarySearch]]
* [[Legacy:Open Source|Open Source]]

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3788</id>
      <timestamp>2007-07-10T16:39:22Z</timestamp>
      <contributor>
        <ip>C-71-197-81-201.hsd1.ca.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">wgXiuS &lt;a href=&quot;http://xhvmpdiupwzq.com/&quot;&gt;izjuunflzhwq&lt;/a&gt;, [URL=http://xeaedvtfloyq.com/]mvqvazqbecde[/URL], [LINK=http://ajwxrioabhst.com/]snbdqlrgxcpf[/LINK], http://dawlskpmqmdp.com/</text>
    </revision>
    <revision>
      <id>3789</id>
      <timestamp>2007-07-10T16:40:05Z</timestamp>
      <contributor>
        <ip>Catv184-034.lan-do.ne.jp</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">9fZaEj &lt;a href=&quot;http://dwokkmwevgij.com/&quot;&gt;xhulffjblyam&lt;/a&gt;, [URL=http://ouqeinhibimt.com/]vlpkmapurhjx[/URL], [LINK=http://iwdfmwrqbbtd.com/]zrklgupxjaic[/LINK], http://yrrmuxmwttpx.com/</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Instagib</title>
    <id>1519</id>
    <revision>
      <id>3802</id>
      <timestamp>2005-12-19T04:55:32Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:InstagibMutator|InstagibMutator]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InstagibCTF</title>
    <id>28901</id>
    <revision>
      <id>42831</id>
      <timestamp>2010-03-31T11:09:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InstagibMutator</title>
    <id>1520</id>
    <revision>
      <id>3803</id>
      <timestamp>2005-12-19T05:34:23Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>Comment</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:MutInstaGib|MutInstaGib]] &gt;&gt; [[Legacy:MutZoomInstaGib|MutZoomInstaGib]] &gt;&gt; InstagibMutator (Package: XGame)}}

This is a Mutator used for InstaGib games, where each player is equipped with a SuperShockRifle (and nothing else), which causes instant death and gibbing on target players.

==Properties==

===Hidden===
; bool bLowGrav :  
; float GravityZ :

==Related Topics==
* [[Legacy:InstaGib CTF|InstaGib CTF]]

==Discussion==

'''SuperApe:''' Thanks, Nick89.  Note that there's no need to link to self or to the parent classes (they're in the heirarchy box).  There should be a brief description of the class at the top.  There's no need to double-up on the hierarchy box if the UT2003 and UT2004 paths are the same. (most UT2004 classes are, just put it there if they're different).  Don't forget Category Tags.  :)

'''Nick89:''' No Problem, thanks for the tips, otherwise I'd be going around stuffing everything up ;)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3804</id>
      <timestamp>2005-12-19T05:26:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Notes on linking, class page markup. :)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:MutInstaGib|MutInstaGib]] &gt;&gt; [[Legacy:MutZoomInstaGib|MutZoomInstaGib]] &gt;&gt; InstagibMutator (Package: XGame)}}

This is a Mutator used for InstaGib games, where each player is equipped with a SuperShockRifle (and nothing else), which causes instant death and gibbing on target players.

==Properties==

===Hidden===
; bool bLowGrav :  
; float GravityZ :

==Related Topics==
* [[Legacy:InstaGib CTF|InstaGib CTF]]

==Discussion==

'''SuperApe:''' Thanks, Nick89.  Note that there's no need to link to self or to the parent classes (they're in the heirarchy box).  There should be a brief description of the class at the top.  There's no need to double-up on the hierarchy box if the UT2003 and UT2004 paths are the same. (most UT2004 classes are, just put it there if they're different).  Don't forget Category Tags.  :)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InstantFire</title>
    <id>1483</id>
    <revision>
      <id>3721</id>
      <timestamp>2006-04-12T22:39:40Z</timestamp>
      <contributor>
        <ip>84-45-226-149.no-dns-yet.enta.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt; InstantFire (Package: xWeapons)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:WeaponFire|WeaponFire]] &gt;&gt; InstantFire (Package: xWeapons)}}

==Properties ==
; int DamageMax :  
; int DamageMin :  
; class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType : The class of the damage type 
; float Momentum :

Momentum is a scaler that is applied to a vector.  It represents the force in which a strike hits.  Anything less than 50000 probably won't be very noticable unless you're playing in low gravity.  '''Warning:''' Always make sure you use a normal vector, not a directional vector.  You use a directional vector and the person will get killed from the force of impact from smashing into a wall.

Remember :MomentumTransfer for [[Legacy:Projectile|Projectile]]s is the same as Momentum for InstantFire classes.

A normal vector has the value range of -1.0 to 1.0.  A directional vector is relative to the origin of the world, and can easily have a range of +- 1000 or greater.  And yes, the Momentum variable is a float, but if you look at the TakeDamage function, the paramener that the X*Momentum feeds is a vector, not a float.  Momentum is used as a scalAr.A normal vector is one with a magnitude of 1.0 (that is, VSize(vector) = 1.0)

; float TraceRange :  The weapon maximum range

==Methods==
; float MaxRange ( ) : Returns the weapon range stored in TraceRange;

; DoFireEffect( ) : This function:
;* Makes your pawn do some noise; 
;* Set the start of the hit trace right in front of the eye;
;* Calls [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].AdjustAim, that calls a native function to adjust aim (maybe it helps your aiming, if auto aim is on)
;* Add Some random error to aim  
    
;* Calls DoTrace, passing the start of the hit trace and the rotation desired

; DoTrace (Vector Start, Rotator Dir) : This function tells where we hit, applyes damage and calls the creation of the visual effects for our shot:
;* This is a reflective weapon, so we will be on a reflection loop until we hit something not reflective or have reflected 3 times;
;* Defines the max range of our trace with:&lt;uscript&gt;
End = Start + TraceRange * X;
&lt;/uscript&gt;
;* Other is where we hit; The trace returns the HitLocation and the HitNormal vectors, used for spawning the effects in the hit place:&lt;uscript&gt;
Other = Trace(HitLocation, HitNormal, End, Start, true);
&lt;/uscript&gt;
;* Now, do some reflection tests. If we hit in something that should be hurt, apply the damage with:&lt;uscript&gt;
Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType);	
&lt;/uscript&gt;
;* Call SpawnBeamEffect, to create the visual effects for this shot.

==Known Subclasses==
* [[Legacy:AssaultFire|AssaultFire]]
* [[Legacy:MinigunFire|MinigunFire]]
** [[Legacy:MinigunAltFire|MinigunAltFire]]
* [[Legacy:ShockBeamFire|ShockBeamFire]]
** [[Legacy:SuperShockBeamFire|SuperShockBeamFire]]
* [[Legacy:SniperFire|SniperFire]]

==Comments==

----

[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy Class (UT2004)]]&lt;br /&gt;[[:Category:Legacy To Do]] - fill in subclass tree up to UT2004, class looks the same as ut2003 version.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3722</id>
      <timestamp>2006-04-07T08:00:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]] &gt;&gt; InstantFire (Package: xWeapons)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:WeaponFire|WeaponFire]] &gt;&gt; InstantFire (Package: xWeapons)}}

==Properties ==
; int DamageMax :  
; int DamageMin :  
; class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType : The class of the damage type 
; float Momentum : 
'''HunterKiller:''' I wish to know what is this... 

'''Gerco:''' I think it's to indicate how much a player is &quot;pushed back&quot; when hit by this weapon, no idea about the units though, must be some unit of 'force'.

'''Languard:''' Momentum is a scaler that is applied to a vector.  It represents the force in which a strike hits.  Anything less than 50000 probably won't be very noticable unless you're playing in low gravity.  '''Warning:''' Always make sure you use a normal vector, not a directional vector.  You use a directional vector and the person will get killed from the force of impact from smashing into a wall. Then again...that can be kinda fun ;).

'''MythOpus:''' Actually.... I had my weapon set to 10000 something like that and it shoots someone halfway across the map (Tested on Antalus)  Are you sure you haven't added an extra 0 to your count ;)

'''Wormbo:''' Then your vector didn't have the length 1. Rockets use MomentumTransfer=50000 for example. MomentumTransfer for [[Legacy:Projectile|Projectile]]s is the same as Momentum for InstantFire classes.

'''MythOpus:''' Oops.  Yes your right... I forgot a few zeros :(

'''Foxpaw:''' What does that mean, use a normal vector, and not a directional vector? I don't see the difference. Plus, it's a float, not a vector?

'''Languard:''' A normal vector has the value range of -1.0 to 1.0.  A directional vector is relative to the origin of the world, and can easily have a range of +- 1000 or greater.  And yes, the Momentum variable is a float, but if you look at the TakeDamage function, the paramener that the X*Momentum feeds is a vector, not a float.  Momentum is used as a scaler.

'''DemonThing:''' A normal vector is one with a magnitude of 1.0 (that is, VSize(vector) = 1.0).

'''Tarquin:''' Yup. And it's &quot;scalAr&quot;. This conversation needs cleaning up!



; float TraceRange :  The weapon maximum range

==Methods==
; float MaxRange ( ) : Returns the weapon range stored in TraceRange;

; DoFireEffect( ) : This function:
;* Makes your pawn do some noise; 
;* Set the start of the hit trace right in front of the eye;
;* Calls [[Legacy:WeaponFire (UT2003)|WeaponFire (UT2003)]].AdjustAim, that calls a native function to adjust aim (maybe it helps your aiming, if auto aim is on)
;* Add Some random error to aim : '''Hunterkiller''' I'm not sure, is it really ???&lt;uscript&gt;
R = rotator(vector(Aim) + VRand()*FRand()*Spread) 
&lt;/uscript&gt;    
;* Calls DoTrace, passing the start of the hit trace and the rotation desired

; DoTrace (Vector Start, Rotator Dir) : This function tells where we hit, applyes damage and calls the creation of the visual effects for our shot:
;* This is a reflective weapon, so we will be on a reflection loop until we hit something not reflective or have reflected 3 times;
;* Defines the max range of our trace with:&lt;uscript&gt;
End = Start + TraceRange * X;
&lt;/uscript&gt;
;* Other is where we hit; The trace returns the HitLocation and the HitNormal vectors, used for spawning the effects in the hit place:&lt;uscript&gt;
Other = Trace(HitLocation, HitNormal, End, Start, true);
&lt;/uscript&gt;
;* Now, do some reflection tests. If we hit in something that should be hurt, apply the damage with:&lt;uscript&gt;
Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType);	
&lt;/uscript&gt;
;* Call SpawnBeamEffect, to create the visual effects for this shot.

==Known Subclasses==
* [[Legacy:AssaultFire|AssaultFire]]
* [[Legacy:MinigunFire|MinigunFire]]
** [[Legacy:MinigunAltFire|MinigunAltFire]]
* [[Legacy:ShockBeamFire|ShockBeamFire]]
** [[Legacy:SuperShockBeamFire|SuperShockBeamFire]]
* [[Legacy:SniperFire|SniperFire]]

==Comments==

'''HunterKiller:''' Ok, thats it for this one :)

'''Wormbo:''' Try sticking to the layout of other class pages like [[Legacy:Material|Material]] or [[Legacy:HUD|HUD]]. You don't need to make an ASCII art subclasses tree if there aren't that many subclasses.

'''HunterKiller:''' Sure. I took a bad example :tup:

----

[[:Category:Legacy Class (UT2003)]]&lt;br /&gt;[[:Category:Legacy Class (UT2004)]]&lt;br /&gt;[[:Category:Legacy To Do]] - clean discussion and fill in subclass tree up to UT2004, class looks the same as ut2003 version.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InstantRockets</title>
    <id>1454</id>
    <revision>
      <id>3655</id>
      <timestamp>2003-05-27T09:53:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; InstantRockets (Package: Botpack)}}

This mutator forces all rocket launchers to fire instantly - no more loading up 6 rockets in one go, simply fire one at a time.

==Methods Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]==

Interestingly, the mutator sets the rocket launchers to instant fire from two different functions.  Beats me why though.

; bool AlwaysKeep ([[Legacy:Actor (UT)|Actor (UT)]] Other) : For every instance of [[Legacy:UT_Eightball|UT_Eightball]] encountered, the objects &lt;tt&gt;bAlwaysInstant&lt;/tt&gt; property is set to &lt;tt&gt;true&lt;/tt&gt;.

; bool CheckReplacement ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : For every instance of [[Legacy:UT_Eightball|UT_Eightball]] encountered, the objects &lt;tt&gt;bAlwaysInstant&lt;/tt&gt; property is set to &lt;tt&gt;true&lt;/tt&gt;.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3656</id>
      <timestamp>2002-04-10T18:27:38Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>For Wormbo</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; InstantRockets}}

This mutator forces all rocket launchers to fire instantly - no more loading up 6 rockets in one go, simply fire one at a time.

==Properties ==

None.

==Functions ==

Interestingly, the mutator sets the rocket launchers to instant fire from two different functions.  Beats me why though.

; function bool AlwaysKeep(Actor Other) : For every instance of [[Legacy:UT_Eightball|UT_Eightball]] encountered, the objects &lt;tt&gt;bAlwaysInstant&lt;/tt&gt; property is set to &lt;tt&gt;true&lt;/tt&gt;.

; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) : For every instance of [[Legacy:UT_Eightball|UT_Eightball]] encountered, the objects &lt;tt&gt;bAlwaysInstant&lt;/tt&gt; property is set to &lt;tt&gt;true&lt;/tt&gt;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InterWiki</title>
    <id>1457</id>
    <revision>
      <id>3660</id>
      <timestamp>2007-11-28T08:55:31Z</timestamp>
      <contributor>
        <ip>Cust143-50.dsl.versadsl.be</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">Interwiki is a special [[Legacy:Wiki Markup|Wiki Markup]] for creating links to other Wiki sites. (See [[MeatBall:InterWiki]] for more on this concept.) In general, links like this:
  &lt;nowiki&gt;[[SiteName:RemotePage]]&lt;/nowiki&gt;

Note that the prefixes are case-sensitive.

==Other Wikis==
; Wiki ''or'' PPR : Ward's Wiki: http://c2.com/cgi/wiki?
; MeatBall : http://www.usemod.com/cgi-bin/mb.pl?
; UseMod : http://www.usemod.com/cgi-bin/wiki.pl?
; BookShelved : http://bookshelved.org/cgi-bin/wiki.pl?
; JDN : http://www.planetjailbreak.com/jdn/
; Liandri : [http://liandri.beyondunreal.com/ Liandry Archives]

==Reference==
; Dictionary : http://www.dictionary.com/cgi-bin/dict.pl?term=
; Wikipedia : http://www.wikipedia.com/wiki/
; SourceForge : http://sourceforge.net/
; JargonFile : http://sunir.org/apps/meta.pl?wiki=JargonFile&amp;redirect=
; Chimeric : http://www.unrealscript.com/tutorials/

==UDN==

[[Legacy:Epic Games|Epic Games]]'s official reference site for the [[Legacy:Unreal Engine|Unreal Engine]].

; udn : http://udn.epicgames.com/Two/
; udntech : (obsolete) Tech area: http://udn.epicgames.com/pub/Technical/
; udncontent : (obsolete) Content area: http://udn.epicgames.com/pub/Content/

'''pingz''':  UDN has been restructured so there doesn't seem to be a distiction between the tech and content sections anymore.  They seem to be doing redirection for old articles, but who knows how long that will last and what about new ones?  Does the interwiki need to be updated?

'''Tarquin:''' Probably. What's the new url? I'll add an Interwiki prefix &quot;udn&quot; and we can replace them all in pages gradually.

'''Fyfe:''' The udn link doesn't get an icon like udntech or udncontent can this be fixed.

==BU forums==
; Thread : http://forums.beyondunreal.com/showthread.php?threadid=
; Posting : http://forums.beyondunreal.com/showthread.php?postid=*#post*

Other wikis are available, but not listed here for sake of clarity. Most of the list at [[MeatBall:InterMapTxt]] is in our local intermap file.

==Miscellaneous==

; editpage : /wiki?action=edit&amp;id=
; chongqed : http://spammers.chongqed.org/</text>
    </revision>
    <revision>
      <id>3661</id>
      <timestamp>2007-11-28T03:51:59Z</timestamp>
      <contributor>
        <ip>Mx-ll-58.147.0-228.tttmaxnet.com</ip>
      </contributor>
      <comment>http://nickiemillis.as.ro/text/upskirts.html</comment>
      <text xml:space="preserve">upskirts [URL=http://nickiemillis.as.ro/text/upskirts.html]upskirts[/URL] [url=http://nickiemillis.as.ro/text/upskirts.html]upskirts[/url] [url]http://nickiemillis.as.ro/text/upskirts.html[/url] upskirts [URL=http://nickiemillis.as.ro/text/upskirts.html]upskirts[/URL] [url=http://nickiemillis.as.ro/text/upskirts.html]upskirts[/url] [url]http://nickiemillis.as.ro/text/upskirts.html[/url]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Interaction</title>
    <id>1475</id>
    <revision>
      <id>3703</id>
      <timestamp>2007-08-05T04:37:46Z</timestamp>
      <contributor>
        <ip>Adsl-69-152-253-246.dsl.snantx.swbell.net</ip>
      </contributor>
      <comment>* add discusion entry</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; Interaction}}

Interactions are new to [[Legacy:UT2003|UT2003]], and can do a whole lot of stuff. They can perform PostRenders and PreRenders, Intercept key input, and intercept string messages. They can be viewed as a much more advanced replacement for UT's [[Legacy:HUD Mutator|HUD mutator]]s, but with lots of additional functionality. Interactions can use [[Legacy:State|state]]s like [[Legacy:Actor|Actor]]s after they have been initialized.

Interactions take on two forms, the Global Interaction and the Local Interaction.  The GI get to process data before the LI and get render time after the LI, so in essence the GI wraps the LI.

A [[Legacy:Dynamic Array|dynamic array]] of GIs is stored in the [[Legacy:InteractionMaster|InteractionMaster]] while each [[Legacy:Viewport|Viewport]] contains an array of LIs.

==Using Interactions ==

Depending on which method you wish to use to create an interaction, you need to read one of:
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]],
* [[Legacy:Creating An Interaction From A PlayerController|Creating An Interaction From A PlayerController]],
* [[Legacy:Creating An Interaction From A HUD|Creating An Interaction From A HUD]]

Have the mutator, but just want to know how to make an interaction? Choose a section relating to what you want to do: 

* [[Legacy:HUD Interactions|HUD Interactions]]
* [[Legacy:Keypress Interactions|Keypress Interactions]]
* [[Legacy:Message Interactions|Message Interactions]]

While you're at it, you may as well read [[Legacy:Problems_With_Interactions|Problems_With_Interactions]]. You'll probably need to sooner or later anyway.

==Properties ==
; bool bActive : Is this interaction getting input?
; bool bVisible : Is this interaction being displayed?
; bool bRequiresTick : Does this interaction require game TICK?
; bool bNativeEvents : This interaction requests native key events.

These entries get filled out upon creation.
; [[Legacy:Player|Player]] ViewportOwner : Pointer to the ViewPort that &quot;Owns&quot; this interaction or none if it's Global
; [[Legacy:InteractionMaster|InteractionMaster]] Master : Pointer to the Interaction Master

==Methods ==

All functions in the Interaction class (including native ones) are non-final.

=== Native Functions ==
; Initialize ( ) : Setup the state system and stack frame. Called automatically upon creation.
; bool ConsoleCommand (coerce string S) : Executes a console command. Returns false if the command could not be executed.

; vector WorldToScreen (vector Location, optional vector CameraLocation, optional rotator CameraRotation) : Converts a vector in the world. Returns the X/Y screen coordinates in to a viewport of a given vector in the world.
; vector ScreenToWorld(vector Location, optional vector CameraLocation, optional rotator CameraRotation) : The X/Y components of Location are set to screen X/Y. The return value is a normalized Vector that you trace along to hit something in the world.

===Other Functions ===
; Initialized ( ) : Called directly after an Interaction Object has been created and Initialized.  Should be subclassed.
; NotifyLevelChange ( ) : ''Build 2164 and later.'' Called upon level changed. Use this to remove the Interaction to prevent the &quot;Incompatible Game Files&quot; message. (In earlier builds this message was know and feared as &quot;Corrupted Connection detected&quot;.)
; Message (coerce string Msg, float MsgLife) : This event allows interactions to receive messages.
; bool KeyType (out EInputKey Key, optional string Unicode)
; bool KeyEvent (out EInputKey Key, out EInputAction Action, float Delta) : These two routines are the entry points for input.  They both return true if the data has been processed and should now be discarded. Both functions should be handled in a subclass of Interaction. The enums EInputKey and EInputAction are declared in the superclass.
; PreRender ([[Legacy:Canvas|Canvas]] Canvas) : Called right after the level is rendered but before the HUD, 1st person weapon, etc. are drawn.
; PostRender([[Legacy:Canvas|Canvas]] Canvas) : Called after the HUD is drawn.

; SetFocus ( ) : This function cases the Interaction to gain &quot;focus&quot; in the interaction system.  Global interactions's focus superceed locals.
; Tick (float DeltaTime) : By default, Interactions do not get ticked, but you can simply turn on bRequiresTick.
; NotifyMusicChange ( ) : ''Build 2164 and later.'' 

==Known Subclasses ==
* [[Legacy:Console|Console]]
* [[Legacy:BaseGUIController|BaseGUIController]]

==Discussion ==

'''DJPaul:''' As i've done in bold above, we need to be sure to specify the correct, and show differences, between [[Legacy:Interaction|Interaction]] and [[Legacy:Interactions|Interactions]].

'''Wormbo:''' I think this is pretty clear when looking at the class tree. You don't write '''Trigger'''(s), do you?

'''Balu:''' The first section tells me that [[Legacy:Interaction|Interaction]]s can do a lot of stuff and what they use,... But I still have no idea what they are used for or what they are.

'''Dyselon''' There's probably an easy answer to this, and I'm sure I'll feel stupid when I hear it, but what's the easy way to pass a value from a mutator to an interaction. Say there's a mutator that keeps track of the total number of foos that have been collected on a level, and I want to display that to the hud via an interaction... Where would I store that value, and how would I access it?

'''Mychaeel:''' You would keep a reference to your [[Legacy:Mutator|Mutator]] in the Interaction when you create it and then directly read those values from your Mutator object.

'''Melaneus:''' I don't think SetFocus() works. It looks like it ends up altering the local array of interactions it created instead of altering the real array of interactions that the player uses.

'''Fey:''' I agree with Balu.  Someone just recomeded I look here for help on how to do a mod I'm working on, but I don't really understand what these do.  From this page, Interactions look very limited, and not a bit helpful unless you want to update a HUD.  I'll keep working with them see if I can work it out.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3704</id>
      <timestamp>2005-08-25T15:22:43Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; Interaction}}

Interactions are new to [[Legacy:UT2003|UT2003]], and can do a whole lot of stuff. They can perform PostRenders and PreRenders, Intercept key input, and intercept string messages. They can be viewed as a much more advanced replacement for UT's [[Legacy:HUD Mutator|HUD mutator]]s, but with lots of additional functionality. Interactions can use [[Legacy:State|state]]s like [[Legacy:Actor|Actor]]s after they have been initialized.

Interactions take on two forms, the Global Interaction and the Local Interaction.  The GI get to process data before the LI and get render time after the LI, so in essence the GI wraps the LI.

A [[Legacy:Dynamic Array|dynamic array]] of GIs is stored in the [[Legacy:InteractionMaster|InteractionMaster]] while each [[Legacy:Viewport|Viewport]] contains an array of LIs.

==Using Interactions ==

Depending on which method you wish to use to create an interaction, you need to read one of:
* [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]],
* [[Legacy:Creating An Interaction From A PlayerController|Creating An Interaction From A PlayerController]],
* [[Legacy:Creating An Interaction From A HUD|Creating An Interaction From A HUD]]

Have the mutator, but just want to know how to make an interaction? Choose a section relating to what you want to do: 

* [[Legacy:HUD Interactions|HUD Interactions]]
* [[Legacy:Keypress Interactions|Keypress Interactions]]
* [[Legacy:Message Interactions|Message Interactions]]

While you're at it, you may as well read [[Legacy:Problems_With_Interactions|Problems_With_Interactions]]. You'll probably need to sooner or later anyway.

==Properties ==
; bool bActive : Is this interaction getting input?
; bool bVisible : Is this interaction being displayed?
; bool bRequiresTick : Does this interaction require game TICK?
; bool bNativeEvents : This interaction requests native key events.

These entries get filled out upon creation.
; [[Legacy:Player|Player]] ViewportOwner : Pointer to the ViewPort that &quot;Owns&quot; this interaction or none if it's Global
; [[Legacy:InteractionMaster|InteractionMaster]] Master : Pointer to the Interaction Master

==Methods ==

All functions in the Interaction class (including native ones) are non-final.

=== Native Functions ==
; Initialize ( ) : Setup the state system and stack frame. Called automatically upon creation.
; bool ConsoleCommand (coerce string S) : Executes a console command. Returns false if the command could not be executed.

; vector WorldToScreen (vector Location, optional vector CameraLocation, optional rotator CameraRotation) : Converts a vector in the world. Returns the X/Y screen coordinates in to a viewport of a given vector in the world.
; vector ScreenToWorld(vector Location, optional vector CameraLocation, optional rotator CameraRotation) : The X/Y components of Location are set to screen X/Y. The return value is a normalized Vector that you trace along to hit something in the world.

===Other Functions ===
; Initialized ( ) : Called directly after an Interaction Object has been created and Initialized.  Should be subclassed.
; NotifyLevelChange ( ) : ''Build 2164 and later.'' Called upon level changed. Use this to remove the Interaction to prevent the &quot;Incompatible Game Files&quot; message. (In earlier builds this message was know and feared as &quot;Corrupted Connection detected&quot;.)
; Message (coerce string Msg, float MsgLife) : This event allows interactions to receive messages.
; bool KeyType (out EInputKey Key, optional string Unicode)
; bool KeyEvent (out EInputKey Key, out EInputAction Action, float Delta) : These two routines are the entry points for input.  They both return true if the data has been processed and should now be discarded. Both functions should be handled in a subclass of Interaction. The enums EInputKey and EInputAction are declared in the superclass.
; PreRender ([[Legacy:Canvas|Canvas]] Canvas) : Called right after the level is rendered but before the HUD, 1st person weapon, etc. are drawn.
; PostRender([[Legacy:Canvas|Canvas]] Canvas) : Called after the HUD is drawn.

; SetFocus ( ) : This function cases the Interaction to gain &quot;focus&quot; in the interaction system.  Global interactions's focus superceed locals.
; Tick (float DeltaTime) : By default, Interactions do not get ticked, but you can simply turn on bRequiresTick.
; NotifyMusicChange ( ) : ''Build 2164 and later.'' 

==Known Subclasses ==
* [[Legacy:Console|Console]]
* [[Legacy:BaseGUIController|BaseGUIController]]

==Discussion ==

'''DJPaul:''' As i've done in bold above, we need to be sure to specify the correct, and show differences, between [[Legacy:Interaction|Interaction]] and [[Legacy:Interactions|Interactions]].

'''Wormbo:''' I think this is pretty clear when looking at the class tree. You don't write '''Trigger'''(s), do you?

'''Balu:''' The first section tells me that [[Legacy:Interaction|Interaction]]s can do a lot of stuff and what they use,... But I still have no idea what they are used for or what they are.

'''Dyselon''' There's probably an easy answer to this, and I'm sure I'll feel stupid when I hear it, but what's the easy way to pass a value from a mutator to an interaction. Say there's a mutator that keeps track of the total number of foos that have been collected on a level, and I want to display that to the hud via an interaction... Where would I store that value, and how would I access it?

'''Mychaeel:''' You would keep a reference to your [[Legacy:Mutator|Mutator]] in the Interaction when you create it and then directly read those values from your Mutator object.

'''Melaneus:''' I don't think SetFocus() works. It looks like it ends up altering the local array of interactions it created instead of altering the real array of interactions that the player uses.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InteractionMaster</title>
    <id>1479</id>
    <revision>
      <id>3712</id>
      <timestamp>2004-08-09T12:59:05Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; InteractionMaster}}

The InteractionMaster controls the entire [[Legacy:Interaction|Interaction]] system. Its job is to take input and Pre/PostRender call and route them to individual [[Legacy:Interaction|Interaction]]s and/or [[Legacy:Viewport|Viewport]]s.

The stubs here in script are for just the Global Interactions as those are the only Interactions the IM routes directly too. A new stub is created in order to limit the number of C++ to UnrealScript switches.

==Properties ==

The InteractionMaster's properties are declared as transient, i.e. they will not be included when a game is saved.
; Client Client : 
; [[Legacy:Interaction|Interaction]] BaseMenu (const) : Holds a pointer to the base menu system.
; [[Legacy:Interaction|Interaction]] Console (const) : Holds the special Interaction that acts as the [[Legacy:Console|Console]].
; array&lt;[[Legacy:Interaction|Interaction]]&gt; GlobalInteractions : Holds a listing of all global Interactions.
; bool bRequireRawJoystick : 

==Methods ==

===Native Function ===
; Travel (string URL) : Setup a travel to a new map.

===Events ===
; [[Legacy:Interaction|Interaction]] AddInteraction(string InteractionName, optional [[Legacy:Player|Player]] AttachTo) : Adds an interaction. The interaction will be added as global interaction when the AttachTo parameter is left empty or explicitely set to None.
; RemoveInteraction ([[Legacy:Interaction|Interaction]] RemoveMe) : Removes an Interaction.
; SetFocusTo ([[Legacy:Interaction|Interaction]] Inter, optional [[Legacy:Player|Player]] ViewportOwner) : This function will cause a window to adjust it's position in it's array so that it processes input first and displays last.

; bool Process_KeyType (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, out EInputKey Key, optional string Unicode)
; bool Process_KeyEvent (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, out EInputKey Key, out EInputAction Action, float Delta) : Calls the KeyType/KeyEvent function of each active interaction until one returns True. Returns whether the event was proccessed by one of the interactions.

; Process_PreRender (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, [[Legacy:Canvas|Canvas]] Canvas)
; Process_PostRender (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, [[Legacy:Canvas|Canvas]] Canvas) : Render functions only occure on local interactions.  The process the array in reverse order so that the objects that have focus are drawn last. Only visible interactions receive render calls.

; Process_Tick (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, float DeltaTime) : Calls the Tick function of all interactions that require to be ticked.

; Process_Message (coerce string Msg, float MsgLife, array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray) : The IM is responsible for sending Message events to all interactions.

; NotifyLevelChange (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray) : The IM is responsible for sending level change events to all interactions.

'''Melaneus:''' I don't think SetFocusTo() works. It looks like it ends up altering the local array of interactions it created instead of altering the real array of interactions that the player uses.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3713</id>
      <timestamp>2003-05-26T11:37:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; InteractionMaster}}

The InteractionMaster controls the entire [[Legacy:Interaction|Interaction]] system. It's job is to take input and Pre/PostRender call and route them to individual [[Legacy:Interaction|Interaction]]s and/or [[Legacy:Viewport|Viewport]]s.

The stubs here in script are for just the Global Interactions as those are the only Interactions the IM routes directly too.  A new stub is created in order to limit the number of C++ -&gt; Uscript switches.

==Properties ==

The InteractionMaster's properties are declared as transient, i.e. they will not be included when a game is saved.
; Client Client : 
; [[Legacy:Interaction|Interaction]] BaseMenu (const) : Holds a pointer to the base menu system.
; [[Legacy:Interaction|Interaction]] Console (const) : Holds the special Interaction that acts as the [[Legacy:Console|Console]].
; array&lt;[[Legacy:Interaction|Interaction]]&gt; GlobalInteractions : Holds a listing of all global Interactions.
; bool bRequireRawJoystick : 

==Methods ==

===Native Function ===
; Travel (string URL) : Setup a travel to a new map.

===Events ===
; [[Legacy:Interaction|Interaction]] AddInteraction(string InteractionName, optional [[Legacy:Player|Player]] AttachTo) : Adds an interaction. The interaction will be added as global interaction when the AttachTo parameter is left empty or explicitely set to None.
; RemoveInteraction ([[Legacy:Interaction|Interaction]] RemoveMe) : Removes an Interaction.
; SetFocusTo ([[Legacy:Interaction|Interaction]] Inter, optional [[Legacy:Player|Player]] ViewportOwner) : This function will cause a window to adjust it's position in it's array so that it processes input first and displays last.

; bool Process_KeyType (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, out EInputKey Key, optional string Unicode)
; bool Process_KeyEvent (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, out EInputKey Key, out EInputAction Action, float Delta) : Calls the KeyType/KeyEvent function of each active interaction until one returns True. Returns whether the event was proccessed by one of the interactions.

; Process_PreRender (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, [[Legacy:Canvas|Canvas]] Canvas)
; Process_PostRender (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, [[Legacy:Canvas|Canvas]] Canvas) : Render functions only occure on local interactions.  The process the array in reverse order so that the objects that have focus are drawn last. Only visible interactions receive render calls.

; Process_Tick (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, float DeltaTime) : Calls the Tick function of all interactions that require to be ticked.

; Process_Message (coerce string Msg, float MsgLife, array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray) : The IM is responsible for sending Message events to all interactions.

; NotifyLevelChange (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray) : The IM is responsible for sending level change events to all interactions.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3714</id>
      <timestamp>2003-08-28T07:18:03Z</timestamp>
      <contributor>
        <ip>Id-couerdalene4a-97.losaca.adelphia.net</ip>
      </contributor>
      <comment>Don't think SetFocusTo works</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Interactions|Interactions]] &gt;&gt; InteractionMaster}}

The InteractionMaster controls the entire [[Legacy:Interaction|Interaction]] system. It's job is to take input and Pre/PostRender call and route them to individual [[Legacy:Interaction|Interaction]]s and/or [[Legacy:Viewport|Viewport]]s.

The stubs here in script are for just the Global Interactions as those are the only Interactions the IM routes directly too.  A new stub is created in order to limit the number of C++ -&gt; Uscript switches.

==Properties ==

The InteractionMaster's properties are declared as transient, i.e. they will not be included when a game is saved.
; Client Client : 
; [[Legacy:Interaction|Interaction]] BaseMenu (const) : Holds a pointer to the base menu system.
; [[Legacy:Interaction|Interaction]] Console (const) : Holds the special Interaction that acts as the [[Legacy:Console|Console]].
; array&lt;[[Legacy:Interaction|Interaction]]&gt; GlobalInteractions : Holds a listing of all global Interactions.
; bool bRequireRawJoystick : 

==Methods ==

===Native Function ===
; Travel (string URL) : Setup a travel to a new map.

===Events ===
; [[Legacy:Interaction|Interaction]] AddInteraction(string InteractionName, optional [[Legacy:Player|Player]] AttachTo) : Adds an interaction. The interaction will be added as global interaction when the AttachTo parameter is left empty or explicitely set to None.
; RemoveInteraction ([[Legacy:Interaction|Interaction]] RemoveMe) : Removes an Interaction.
; SetFocusTo ([[Legacy:Interaction|Interaction]] Inter, optional [[Legacy:Player|Player]] ViewportOwner) : This function will cause a window to adjust it's position in it's array so that it processes input first and displays last.

; bool Process_KeyType (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, out EInputKey Key, optional string Unicode)
; bool Process_KeyEvent (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, out EInputKey Key, out EInputAction Action, float Delta) : Calls the KeyType/KeyEvent function of each active interaction until one returns True. Returns whether the event was proccessed by one of the interactions.

; Process_PreRender (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, [[Legacy:Canvas|Canvas]] Canvas)
; Process_PostRender (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, [[Legacy:Canvas|Canvas]] Canvas) : Render functions only occure on local interactions.  The process the array in reverse order so that the objects that have focus are drawn last. Only visible interactions receive render calls.

; Process_Tick (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray, float DeltaTime) : Calls the Tick function of all interactions that require to be ticked.

; Process_Message (coerce string Msg, float MsgLife, array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray) : The IM is responsible for sending Message events to all interactions.

; NotifyLevelChange (array&lt;[[Legacy:Interaction|Interaction]]&gt; InteractionArray) : The IM is responsible for sending level change events to all interactions.

'''Melaneus:''' I don't think SetFocusTo() works. It looks like it ends up altering the local array of interactions it created instead of altering the real array of interactions that the player uses.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Interactions</title>
    <id>1478</id>
    <revision>
      <id>3710</id>
      <timestamp>2004-12-01T09:06:11Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>Added link to InputKeyMap</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Interactions}}

This is an abstract class for the [[Legacy:Interaction|Interaction]] sub-system.  This sub-system is responsible for tunneling input and Pre/Post rendering time to individual [[Legacy:Viewport|Viewport]]s and [[Legacy:Interaction|Interaction]]s.

==Enums ==
; EInputAction : Input system states.
;;IST_None : Not performing special input processing.
;;IST_Press : Handling a keypress or button press.
;;IST_Hold : Handling holding a key or button.
;;IST_Release : Handling a key or button release.
;;IST_Axis : Handling analog axis movement.

; EInputKey : Input keys ([[Legacy:InputKeyMap|Alternate Layout]])
;| ||||^ '''Enum Items''' |
;|^'''00'''|	IK_None			|IK_LeftMouse	|IK_RightMouse	|IK_Cancel		|
;|^'''04'''|	IK_MiddleMouse	|IK_Unknown05	|IK_Unknown06	|IK_Unknown07	|
;|^'''08'''|	IK_Backspace	|IK_Tab         |IK_Unknown0A	|IK_Unknown0B	|
;|^'''0C'''|	IK_Unknown0C	|IK_Enter	    |IK_Unknown0E	|IK_Unknown0F	|
;|^'''10'''|	IK_Shift		|IK_Ctrl	    |IK_Alt			|IK_Pause       |
;|^'''14'''|	IK_CapsLock		|IK_Unknown15	|IK_Unknown16	|IK_Unknown17	|
;|^'''18'''|	IK_Unknown18	|IK_Unknown19	|IK_Unknown1A	|IK_Escape		|
;|^'''1C'''|	IK_Unknown1C	|IK_Unknown1D	|IK_Unknown1E	|IK_Unknown1F	|
;|^'''20'''|	IK_Space		|IK_PageUp      |IK_PageDown    |IK_End         |
;|^'''24'''|	IK_Home			|IK_Left        |IK_Up          |IK_Right       |
;|^'''28'''|	IK_Down			|IK_Select      |IK_Print       |IK_Execute     |
;|^'''2C'''|	IK_PrintScrn	|IK_Insert      |IK_Delete      |IK_Help		|
;|^'''30'''|	IK_0			|IK_1			|IK_2			|IK_3			|
;|^'''34'''|	IK_4			|IK_5			|IK_6			|IK_7			|
;|^'''38'''|	IK_8			|IK_9			|IK_Unknown3A	|IK_Unknown3B	|
;|^'''3C'''|	IK_Unknown3C	|IK_Unknown3D	|IK_Unknown3E	|IK_Unknown3F	|
;|^'''40'''|	IK_Unknown40	|IK_A			|IK_B			|IK_C			|
;|^'''44'''|	IK_D			|IK_E			|IK_F			|IK_G			|
;|^'''48'''|	IK_H			|IK_I			|IK_J			|IK_K			|
;|^'''4C'''|	IK_L			|IK_M			|IK_N			|IK_O			|
;|^'''50'''|	IK_P			|IK_Q			|IK_R			|IK_S			|
;|^'''54'''|	IK_T			|IK_U			|IK_V			|IK_W			|
;|^'''58'''|	IK_X			|IK_Y			|IK_Z			|IK_Unknown5B	|
;|^'''5C'''|	IK_Unknown5C	|IK_Unknown5D	|IK_Unknown5E	|IK_Unknown5F	|
;|^'''60'''|	IK_NumPad0		|IK_NumPad1     |IK_NumPad2     |IK_NumPad3     |
;|^'''64'''|	IK_NumPad4		|IK_NumPad5     |IK_NumPad6     |IK_NumPad7     |
;|^'''68'''|	IK_NumPad8		|IK_NumPad9     |IK_GreyStar    |IK_GreyPlus    |
;|^'''6C'''|	IK_Separator	|IK_GreyMinus	|IK_NumPadPeriod|IK_GreySlash   |
;|^'''70'''|	IK_F1			|IK_F2          |IK_F3          |IK_F4          |
;|^'''74'''|	IK_F5			|IK_F6          |IK_F7          |IK_F8          |
;|^'''78'''|	IK_F9           |IK_F10         |IK_F11         |IK_F12         |
;|^'''7C'''|	IK_F13			|IK_F14         |IK_F15         |IK_F16         |
;|^'''80'''|	IK_F17			|IK_F18         |IK_F19         |IK_F20         |
;|^'''84'''|	IK_F21			|IK_F22         |IK_F23         |IK_F24         |
;|^'''88'''|	IK_Unknown88	|IK_Unknown89	|IK_Unknown8A	|IK_Unknown8B	|
;|^'''8C'''|	IK_Unknown8C	|IK_Unknown8D	|IK_Unknown8E	|IK_Unknown8F	|
;|^'''90'''|	IK_NumLock		|IK_ScrollLock  |IK_Unknown92	|IK_Unknown93	|
;|^'''94'''|	IK_Unknown94	|IK_Unknown95	|IK_Unknown96	|IK_Unknown97	|
;|^'''98'''|	IK_Unknown98	|IK_Unknown99	|IK_Unknown9A	|IK_Unknown9B	|
;|^'''9C'''|	IK_Unknown9C	|IK_Unknown9D	|IK_Unknown9E	|IK_Unknown9F	|
;|^'''A0'''|	IK_LShift		|IK_RShift      |IK_LControl    |IK_RControl    |
;|^'''A4'''|	IK_UnknownA4	|IK_UnknownA5	|IK_UnknownA6	|IK_UnknownA7	|
;|^'''A8'''|	IK_UnknownA8	|IK_UnknownA9	|IK_UnknownAA	|IK_UnknownAB	|
;|^'''AC'''|	IK_UnknownAC	|IK_UnknownAD	|IK_UnknownAE	|IK_UnknownAF	|
;|^'''B0'''|	IK_UnknownB0	|IK_UnknownB1	|IK_UnknownB2	|IK_UnknownB3	|
;|^'''B4'''|	IK_UnknownB4	|IK_UnknownB5	|IK_UnknownB6	|IK_UnknownB7	|
;|^'''B8'''|	IK_UnknownB8	|IK_UnknownB9	|IK_Semicolon	|IK_Equals		|
;|^'''BC'''|	IK_Comma		|IK_Minus		|IK_Period		|IK_Slash		|
;|^'''C0'''|	IK_Tilde		|IK_UnknownC1	|IK_UnknownC2	|IK_UnknownC3	|
;|^'''C4'''|	IK_UnknownC4	|IK_UnknownC5	|IK_UnknownC6	|IK_UnknownC7	|
;|^'''C8'''|	IK_Joy1	        |IK_Joy2	    |IK_Joy3	    |IK_Joy4	    |
;|^'''CC'''|	IK_Joy5	        |IK_Joy6	    |IK_Joy7	    |IK_Joy8	    |
;|^'''D0'''|	IK_Joy9	        |IK_Joy10	    |IK_Joy11	    |IK_Joy12		|
;|^'''D4'''|	IK_Joy13		|IK_Joy14	    |IK_Joy15	    |IK_Joy16	    |
;|^'''D8'''|	IK_UnknownD8	|IK_UnknownD9	|IK_UnknownDA	|IK_LeftBracket	|
;|^'''DC'''|	IK_Backslash	|IK_RightBracket|IK_SingleQuote	|IK_UnknownDF	|
;|^'''E0'''|	IK_UnknownE0	|IK_UnknownE1	|IK_UnknownE2	|IK_UnknownE3	|
;|^'''E4'''|	IK_MouseX		|IK_MouseY		|IK_MouseZ		|IK_MouseW		|
;|^'''E8'''|	IK_JoyU			|IK_JoyV		|IK_JoySlider1	|IK_JoySlider2	|
;|^'''EC'''|	IK_MouseWheelUp |IK_MouseWheelDown|IK_Unknown10E|UK_Unknown10F  |
;|^'''F0'''|	IK_JoyX			|IK_JoyY		|IK_JoyZ		|IK_JoyR		|
;|^'''F4'''|	IK_UnknownF4	|IK_UnknownF5	|IK_Attn		|IK_CrSel		|
;|^'''F8'''|	IK_ExSel		|IK_ErEof		|IK_Play		|IK_Zoom		|
;|^'''FC'''|	IK_NoName		|IK_PA1			|IK_OEMClear
;: Note that UK_Unknown10F is no typo in this table, but in the class itself.

==Known Subclasses ==
* [[Legacy:Interaction|Interaction]]
* [[Legacy:InteractionMaster|InteractionMaster]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3711</id>
      <timestamp>2003-05-26T11:36:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Interactions}}

This is an abstract class for the [[Legacy:Interaction|Interaction]] sub-system.  This sub-system is responsible for tunneling input and Pre/Post rendering time to individual [[Legacy:Viewport|Viewport]]s and [[Legacy:Interaction|Interaction]]s.

==Enums ==
; EInputAction : Input system states.
;;IST_None : Not performing special input processing.
;;IST_Press : Handling a keypress or button press.
;;IST_Hold : Handling holding a key or button.
;;IST_Release : Handling a key or button release.
;;IST_Axis : Handling analog axis movement.

; EInputKey : Input keys.
;| ||||^ '''Enum Items''' |
;|^'''00'''|	IK_None			|IK_LeftMouse	|IK_RightMouse	|IK_Cancel		|
;|^'''04'''|	IK_MiddleMouse	|IK_Unknown05	|IK_Unknown06	|IK_Unknown07	|
;|^'''08'''|	IK_Backspace	|IK_Tab         |IK_Unknown0A	|IK_Unknown0B	|
;|^'''0C'''|	IK_Unknown0C	|IK_Enter	    |IK_Unknown0E	|IK_Unknown0F	|
;|^'''10'''|	IK_Shift		|IK_Ctrl	    |IK_Alt			|IK_Pause       |
;|^'''14'''|	IK_CapsLock		|IK_Unknown15	|IK_Unknown16	|IK_Unknown17	|
;|^'''18'''|	IK_Unknown18	|IK_Unknown19	|IK_Unknown1A	|IK_Escape		|
;|^'''1C'''|	IK_Unknown1C	|IK_Unknown1D	|IK_Unknown1E	|IK_Unknown1F	|
;|^'''20'''|	IK_Space		|IK_PageUp      |IK_PageDown    |IK_End         |
;|^'''24'''|	IK_Home			|IK_Left        |IK_Up          |IK_Right       |
;|^'''28'''|	IK_Down			|IK_Select      |IK_Print       |IK_Execute     |
;|^'''2C'''|	IK_PrintScrn	|IK_Insert      |IK_Delete      |IK_Help		|
;|^'''30'''|	IK_0			|IK_1			|IK_2			|IK_3			|
;|^'''34'''|	IK_4			|IK_5			|IK_6			|IK_7			|
;|^'''38'''|	IK_8			|IK_9			|IK_Unknown3A	|IK_Unknown3B	|
;|^'''3C'''|	IK_Unknown3C	|IK_Unknown3D	|IK_Unknown3E	|IK_Unknown3F	|
;|^'''40'''|	IK_Unknown40	|IK_A			|IK_B			|IK_C			|
;|^'''44'''|	IK_D			|IK_E			|IK_F			|IK_G			|
;|^'''48'''|	IK_H			|IK_I			|IK_J			|IK_K			|
;|^'''4C'''|	IK_L			|IK_M			|IK_N			|IK_O			|
;|^'''50'''|	IK_P			|IK_Q			|IK_R			|IK_S			|
;|^'''54'''|	IK_T			|IK_U			|IK_V			|IK_W			|
;|^'''58'''|	IK_X			|IK_Y			|IK_Z			|IK_Unknown5B	|
;|^'''5C'''|	IK_Unknown5C	|IK_Unknown5D	|IK_Unknown5E	|IK_Unknown5F	|
;|^'''60'''|	IK_NumPad0		|IK_NumPad1     |IK_NumPad2     |IK_NumPad3     |
;|^'''64'''|	IK_NumPad4		|IK_NumPad5     |IK_NumPad6     |IK_NumPad7     |
;|^'''68'''|	IK_NumPad8		|IK_NumPad9     |IK_GreyStar    |IK_GreyPlus    |
;|^'''6C'''|	IK_Separator	|IK_GreyMinus	|IK_NumPadPeriod|IK_GreySlash   |
;|^'''70'''|	IK_F1			|IK_F2          |IK_F3          |IK_F4          |
;|^'''74'''|	IK_F5			|IK_F6          |IK_F7          |IK_F8          |
;|^'''78'''|	IK_F9           |IK_F10         |IK_F11         |IK_F12         |
;|^'''7C'''|	IK_F13			|IK_F14         |IK_F15         |IK_F16         |
;|^'''80'''|	IK_F17			|IK_F18         |IK_F19         |IK_F20         |
;|^'''84'''|	IK_F21			|IK_F22         |IK_F23         |IK_F24         |
;|^'''88'''|	IK_Unknown88	|IK_Unknown89	|IK_Unknown8A	|IK_Unknown8B	|
;|^'''8C'''|	IK_Unknown8C	|IK_Unknown8D	|IK_Unknown8E	|IK_Unknown8F	|
;|^'''90'''|	IK_NumLock		|IK_ScrollLock  |IK_Unknown92	|IK_Unknown93	|
;|^'''94'''|	IK_Unknown94	|IK_Unknown95	|IK_Unknown96	|IK_Unknown97	|
;|^'''98'''|	IK_Unknown98	|IK_Unknown99	|IK_Unknown9A	|IK_Unknown9B	|
;|^'''9C'''|	IK_Unknown9C	|IK_Unknown9D	|IK_Unknown9E	|IK_Unknown9F	|
;|^'''A0'''|	IK_LShift		|IK_RShift      |IK_LControl    |IK_RControl    |
;|^'''A4'''|	IK_UnknownA4	|IK_UnknownA5	|IK_UnknownA6	|IK_UnknownA7	|
;|^'''A8'''|	IK_UnknownA8	|IK_UnknownA9	|IK_UnknownAA	|IK_UnknownAB	|
;|^'''AC'''|	IK_UnknownAC	|IK_UnknownAD	|IK_UnknownAE	|IK_UnknownAF	|
;|^'''B0'''|	IK_UnknownB0	|IK_UnknownB1	|IK_UnknownB2	|IK_UnknownB3	|
;|^'''B4'''|	IK_UnknownB4	|IK_UnknownB5	|IK_UnknownB6	|IK_UnknownB7	|
;|^'''B8'''|	IK_UnknownB8	|IK_UnknownB9	|IK_Semicolon	|IK_Equals		|
;|^'''BC'''|	IK_Comma		|IK_Minus		|IK_Period		|IK_Slash		|
;|^'''C0'''|	IK_Tilde		|IK_UnknownC1	|IK_UnknownC2	|IK_UnknownC3	|
;|^'''C4'''|	IK_UnknownC4	|IK_UnknownC5	|IK_UnknownC6	|IK_UnknownC7	|
;|^'''C8'''|	IK_Joy1	        |IK_Joy2	    |IK_Joy3	    |IK_Joy4	    |
;|^'''CC'''|	IK_Joy5	        |IK_Joy6	    |IK_Joy7	    |IK_Joy8	    |
;|^'''D0'''|	IK_Joy9	        |IK_Joy10	    |IK_Joy11	    |IK_Joy12		|
;|^'''D4'''|	IK_Joy13		|IK_Joy14	    |IK_Joy15	    |IK_Joy16	    |
;|^'''D8'''|	IK_UnknownD8	|IK_UnknownD9	|IK_UnknownDA	|IK_LeftBracket	|
;|^'''DC'''|	IK_Backslash	|IK_RightBracket|IK_SingleQuote	|IK_UnknownDF	|
;|^'''E0'''|	IK_UnknownE0	|IK_UnknownE1	|IK_UnknownE2	|IK_UnknownE3	|
;|^'''E4'''|	IK_MouseX		|IK_MouseY		|IK_MouseZ		|IK_MouseW		|
;|^'''E8'''|	IK_JoyU			|IK_JoyV		|IK_JoySlider1	|IK_JoySlider2	|
;|^'''EC'''|	IK_MouseWheelUp |IK_MouseWheelDown|IK_Unknown10E|UK_Unknown10F  |
;|^'''F0'''|	IK_JoyX			|IK_JoyY		|IK_JoyZ		|IK_JoyR		|
;|^'''F4'''|	IK_UnknownF4	|IK_UnknownF5	|IK_Attn		|IK_CrSel		|
;|^'''F8'''|	IK_ExSel		|IK_ErEof		|IK_Play		|IK_Zoom		|
;|^'''FC'''|	IK_NoName		|IK_PA1			|IK_OEMClear
;: Note that UK_Unknown10F is no typo in this table, but in the class itself.

==Known Subclasses ==
* [[Legacy:Interaction|Interaction]]
* [[Legacy:InteractionMaster|InteractionMaster]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Interactive GUI</title>
    <id>1514</id>
    <revision>
      <id>3790</id>
      <timestamp>2006-08-24T12:18:15Z</timestamp>
      <contributor>
        <ip>Utip439.ewi.utwente.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Interactive GUI Design Mode''' lets you rearrange and resize widgets within the game, then copy their properties to the clipboard to put into your scripts.

==Enabling GUI design mode==

The interactive GUI design mode must first be enabled in config files.

===UT2003===

Open the [[Legacy:Game Ini File|Game ini file]] and set the following property:

'''UT2003.ini:'''
  [XInterface.GUIController]
  bModAuthor=True

===UT2004===

In Unreal Tournament 2004 you'll need to edit the user.ini. Simply add the line &lt;code&gt;bModAuthor=True&lt;/code&gt; to the right sections, as listed below.

'''user.ini:'''

  [XInterface.GUIController]
  bModAuthor=True
 
  [GUI2K4.UT2K4GUIController]
  bModAuthor=True

==Activating GUI design mode in game==

Once in the game, press &lt;code&gt;Ctrl+Alt+D&lt;/code&gt; to enter the interactive GUI design mode.  In that mode, you can:

* Hold down &lt;code&gt;F1&lt;/code&gt; for a list of commands. The most common ones are mentioned below.
* &lt;code&gt;Ctrl+Click&lt;/code&gt; a control to select it.  Repeatedly &lt;code&gt;Ctrl+Click&lt;/code&gt; to select overlapping controls.
* Press &lt;code&gt;Shift&lt;/code&gt; to temporarily hide the selection rectangle.
* Press &lt;code&gt;Ctrl+ArrowUp&lt;/code&gt;, &lt;code&gt;Ctrl+ArrowLeft&lt;/code&gt;, &lt;code&gt;Ctrl+ArrowRight&lt;/code&gt; and &lt;code&gt;Ctrl+ArrowDown&lt;/code&gt; to move the selected control.
* Alternatively, hold &lt;code&gt;Ctrl+Alt&lt;/code&gt; with the control selected to move it with the mouse. You can also use &lt;code&gt;Ctrl+Alt+Any Arrow&lt;/code&gt; to move the control 5 pixels at a time.
* Press &lt;code&gt;Ctrl+GrayPlus&lt;/code&gt; and &lt;code&gt;Ctrl+GrayMinus&lt;/code&gt; to change the horizontal size of the selected control. &lt;br /&gt;Press &lt;code&gt;Ctrl+Plus&lt;/code&gt; and &lt;code&gt;Ctrl+Minus&lt;/code&gt; (on the alphanumeric keyboard) to change the vertical size of the selected control.

Add &lt;code&gt;Alt&lt;/code&gt; to the movement and sizing key combinations to move or size faster.

* Press Ctrl+C to copy the selected control's window metrics to the clipboard.  You can directly paste them into your control's inline object definition in the &lt;code&gt;defaultproperties&lt;/code&gt; section.

==Related Topics==
* [[Legacy:GUI Overview|GUI Overview]]
* [[Legacy:Making Mods|Making Mods]]</text>
    </revision>
    <revision>
      <id>3791</id>
      <timestamp>2006-08-24T12:11:39Z</timestamp>
      <contributor>
        <ip>C-68-60-77-17.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Interactive GUI Design Mode''' lets you rearrange and resize widgets within the game, then copy their properties to the clipboard to put into your scripts.

==Enabling GUI design mode==

The interactive GUI design mode must first be enabled in config files.

===UT2003===

Open the [[Legacy:Game Ini File|Game ini file]] and set the following property:

'''UT2003.ini:'''
  [XInterface.GUIController]
  bModAuthor=True

===UT2004===

In Unreal Tournament 2004 you'll need to edit the user.ini instead.  I found that I had to set both of the following to get this to work, be sure to place these lines at the BOTTOM of the User.ini.

'''user.ini:'''
  [XInterface.GUIController]
  bModAuthor=True

  [GUI2K4.UT2K4GUIController]
  bModAuthor=True

==Activating GUI design mode in game==

Once in the game, press &lt;code&gt;Ctrl+Alt+D&lt;/code&gt; to enter the interactive GUI design mode.  In that mode, you can:

* Hold down &lt;code&gt;F1&lt;/code&gt; for a list of commands. The most common ones are mentioned below.
* &lt;code&gt;Ctrl+Click&lt;/code&gt; a control to select it.  Repeatedly &lt;code&gt;Ctrl+Click&lt;/code&gt; to select overlapping controls.
* Press &lt;code&gt;Shift&lt;/code&gt; to temporarily hide the selection rectangle.
* Press &lt;code&gt;Ctrl+ArrowUp&lt;/code&gt;, &lt;code&gt;Ctrl+ArrowLeft&lt;/code&gt;, &lt;code&gt;Ctrl+ArrowRight&lt;/code&gt; and &lt;code&gt;Ctrl+ArrowDown&lt;/code&gt; to move the selected control.
* Alternatively, hold &lt;code&gt;Ctrl+Alt&lt;/code&gt; with the control selected to move it with the mouse. You can also use &lt;code&gt;Ctrl+Alt+Any Arrow&lt;/code&gt; to move the control 5 pixels at a time.
* Press &lt;code&gt;Ctrl+GrayPlus&lt;/code&gt; and &lt;code&gt;Ctrl+GrayMinus&lt;/code&gt; to change the horizontal size of the selected control. &lt;br /&gt;Press &lt;code&gt;Ctrl+Plus&lt;/code&gt; and &lt;code&gt;Ctrl+Minus&lt;/code&gt; (on the alphanumeric keyboard) to change the vertical size of the selected control.

Add &lt;code&gt;Alt&lt;/code&gt; to the movement and sizing key combinations to move or size faster.

* Press Ctrl+C to copy the selected control's window metrics to the clipboard.  You can directly paste them into your control's inline object definition in the &lt;code&gt;defaultproperties&lt;/code&gt; section.

==Related Topics==
* [[Legacy:GUI Overview|GUI Overview]]
* [[Legacy:Making Mods|Making Mods]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InterestPoint</title>
    <id>1512</id>
    <revision>
      <id>3785</id>
      <timestamp>2004-10-17T06:53:59Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; InterestPoint (Package: Postal2Game)}}

Marks the start of things, like a possible business interest, a sign to look at, or a chair to sit in.

==Properties==
; EActionType ActionType : What pawns do when they hit this point
; bool bAllowConsecutiveReturns : Doesn't matter if the same pawn uses this several times in a row
; bool bExcludes : Defaults to false so that only ConcernedClasses can use this. If true, excludes ConcernedClasses and allows all others
; class ConcernedBaseClass : Below this nothing is even considered allowed to use this point
; class ConcernedClasses : Actor class we're concerned about. Used to restrict or allow certain types of pawns
; float InterestLevel : how interesting this thing is
; Name InterestTag : Tag of interest actor, like a sign, or something at a store.
; Name LinkToTag : Tag of actor you will walk to when this interest is over
; ELinkType LinkType : What to do with the LinkActor
; int MaxAllowed : maximum number of pawns allowed to use this interest
; int TotalUsersLimit : how many successful users we can have before this is destroyed
; int WaitTimeMax : maximum time to sleep before you do the next action
; int WaitTimeMin : minimum time to sleep before you do the next action

==Enums==

===EActionType===

; IDT_StopAndWait : just stare in the direction you were already looking for a given amount of time
; IDT_LookAt : Look at the interest for a given time
; IDT_Laugh : Laugh at the interest
; IDT_Clap : Clap at the interest
; IDT_Smoke : (unused?) find a spot and start smoking
; IDT_AccostInterest : Person who touches the interest point yells at the interest
; IDT_InterestAccostsYou : Interest pawn yells at the person who touches this keypoint
; IDT_Puke : puke at the interest actor
; IDT_Dance : Dance in this spot
; IDT_PlayArcadeGame : Play the arcade game that is your interest actor
; IDT_KeyboardType : Type at this point that is your interest actor

===ELinkType===

; LT_WalkTo : Walk to our link
; LT_RunTo : Run to our link
; LT_WalkToIgnoreIPs : Walk to our link, but don't use it
; LT_RunToIgnoreIPs : Run to our link, but don't use it
; LT_ForceUse : Stay where we are and use the link now

==Related Topics==

----

[[:Category:Legacy Class (P2)]]&lt;br /&gt;[[Legacy:Keypoint Class Hierarchy (P2)|Keypoint Class Hierarchy (P2)]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3786</id>
      <timestamp>2004-06-14T21:51:05Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>interestpoint for postal 2.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; [[Legacy:InterestPoint|InterestPoint]]}}

Marks the start of things, like possible business interest, a sign to look at, or a chair to sit in.

==Properties==
; EActionType ActionType : What pawns do when they hit this point
; bool bAllowConsecutiveReturns : Doesn't matter if the same pawn uses this several times in a row
; bool bExcludes : Defaults to false so that only ConcernedClasses can use this. If true, excludes ConcernedClasses and allows all others
; class ConcernedBaseClass : Below this nothing is even considered allowed to use this point
; class ConcernedClasses : Actor class we're concerned about. Used to restrict or allow certain types of pawns
; float InterestLevel : how interesting this thing is
; Name InterestTag : Tag of interest actor, like a sign, or something at a store.
; Name LinkToTag : Tag of actor you will walk to when this interest is over
; ELinkType LinkType : What to do with the LinkActor
; int MaxAllowed : maximum number of pawns allowed to use this interest
; int TotalUsersLimit : how many successful users we can have before this is destroyed
; int WaitTimeMax : maximum time to sleep before you do the next action
; int WaitTimeMin : minimum time to sleep before you do the next action

==Enums==

===EActionType===

; IDT_StopAndWait : just stare in the direction you were already looking for a given amount of time
; IDT_LookAt : Look at the interest for a given time
; IDT_Laugh : Laugh at the interest
; IDT_Clap : Clap at the interest
; IDT_Smoke : (unused?) find a spot and start smoking
; IDT_AccostInterest : Person who touches the interest point yells at the interest
; IDT_InterestAccostsYou : Interest pawn yells at the person who touches this keypoint
; IDT_Puke : puke at the interest actor
; IDT_Dance : Dance in this spot
; IDT_PlayArcadeGame : Play the arcade game that is your interest actor
; IDT_KeyboardType : Type at this point that is your interest actor

===ELinkType===

; LT_WalkTo : Walk to our link
; LT_RunTo : Run to our link
; LT_WalkToIgnoreIPs : Walk to our link, but don't use it
; LT_RunToIgnoreIPs : Run to our link, but don't use it
; LT_ForceUse : Stay where we are and use the link now

==Related Topics==
* [[:Category:Legacy Class (P2)]]
* [[Legacy:Keypoint Class Hierarchy (P2)|Keypoint Class Hierarchy (P2)]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InterestVolume</title>
    <id>1510</id>
    <revision>
      <id>3780</id>
      <timestamp>2004-10-10T09:31:16Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] &gt;&gt; InterestVolume (Package: Postal2Game)}}

When the player is seen in an InterestVolume doing something, they'll respond with the given reaction.

Most single-player maps will have one of these set up across the telephone wires that can be walked on. While the dude is walking on the telephone wires bystanders will watch. If he falls off and passes through a the [[Legacy:InterestVolume|InterestVolume]] directly below the wires, the bystanders will then laugh at the dude falling off.

One of these is also placed in the bank just below the glass roof. If the dude makes a flashy entrance through the roof and bystanders see him they'll applaud him. The police, however, won't be too thrilled.

==Properties ==

===Main ===
; var() [[Legacy:FPSPawn|FPSPawn]].EPawnInitialState SightReaction : Type of reaction the dude gets from being in this volume.
; var() bool bActive : Whether or not the volume is active.

==Functions ==
; function Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator) : If triggered, bActive is toggled.

==Related Topics ==
* [[Legacy:P2Player|P2Player]]
* [[Legacy:PersonController|PersonController]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3781</id>
      <timestamp>2004-05-28T02:28:43Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] &gt;&gt; [[Legacy:InterestVolume|InterestVolume]]}}

When the player is seen in an InterestVolume doing something, they'll respond with the given reaction.

Most single-player maps will have one of these set up across the telephone wires that can be walked on. While the dude is walking on the telephone wires bystanders will watch. If he falls off and passes through a the [[Legacy:InterestVolume|InterestVolume]] directly below the wires, the bystanders will then laugh at the dude falling off.

One of these is also placed in the bank just below the glass roof. If the dude makes a flashy entrance through the roof and bystanders see him they'll applaud him. The police, however, won't be too thrilled.

==Properties ==

===Main ===
; var() [[Legacy:FPSPawn|FPSPawn]].EPawnInitialState SightReaction : Type of reaction the dude gets from being in this volume.
; var() bool bActive : Whether or not the volume is active.

==Functions ==
; function Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator) : If triggered, bActive is toggled.

==Related Topics ==
* [[Legacy:P2Player|P2Player]]
* [[Legacy:PersonController|PersonController]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Interface</title>
    <id>1528</id>
    <revision>
      <id>3817</id>
      <timestamp>2008-02-17T13:15:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The concept of interfaces is available in UnrealEngine 3 [[Legacy:UnrealScript|UnrealScript]] and also in some UnrealEngine 2 games.

==Syntax==

Interface definitions look a lot like [[Legacy:Class|class]] definitions:

 '''interface''' ''InterfaceName'' ['''extends''' ''ParentInterface''] {''modifiers''}

Generally, all class modifiers are also allowed for interfaces. In reality, only the following two modifiers make sense:

; DependsOn(''type names'') : One or more classes and/or interfaces (separated by comma) that need to be parsed before this interface, because types declared in there are used by this interface. This modifier can be used multiple times.&lt;br /&gt;(Parent interfaces need not be specified here because the compiler always parses parent classes first.)

; Native(''library name'') : Specified for interfaces that include native code.

Interfaces can define the following member types:

* [[Legacy:Constant|Constant]]s
* [[Legacy:Enum|Enum]]s
* [[Legacy:Struct|Struct]]s
* [[Legacy:Function|Function]]s
* [[Legacy:Delegate|Delegate]]s

Interfaces may not contain states, variable declarations or replication blocks. Note that while a defaultproperties block is allowed, it wouldn't make much sense due to the lack of variables. Functions and delegates should not have any modifiers or body. Native interfaces may contain native functions, though.

'''Note:''' It is possible, but not advisable, to include a function body for functions and delegates. Functions and delegates must be redefined in classes implementing the interface and it is ''not'' possible to reach the interface's implementation of the function through something like the ''super'' keyword.

==Usage==
* ''TODO''

==See Also==
* [[Legacy:Interface (UT3)|Interface (UT3)]] &amp;ndash; the UT3 interface base class
* [[Wikipedia:Interface (Java)]] &amp;ndash; Java interfaces (very similar to UnrealScript interfaces)

----

[[:Category:Legacy To Do]] &amp;ndash; explain usage
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Interface (UT3)</title>
    <id>1529</id>
    <revision>
      <id>3818</id>
      <timestamp>2008-02-17T13:22:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT3|UT3]] :: Interface (Package: Core)}}

The base class of all [[Legacy:Interface|interface]] classes in [[Legacy:UT3|UT3]]. This class has no new members and only serves as implicit parent class for all interfaces defined without an explicit parent interface.

Technically the class Interface extends [[Legacy:Object (UT3)|Object (UT3)]], but conceptually you should pretend it doesn't.

==Known Interfaces==
* [[Legacy:CustomPropertyItemHandler|CustomPropertyItemHandler]]
* [[Legacy:OnlineAccountInterface|OnlineAccountInterface]]
* [[Legacy:OnlineContentInterface|OnlineContentInterface]]
* [[Legacy:OnlineGameInterface|OnlineGameInterface]]
* [[Legacy:OnlineNewsInterface|OnlineNewsInterface]]
* [[Legacy:OnlinePlayerInterface|OnlinePlayerInterface]]
* [[Legacy:OnlinePlayerInterfaceEx|OnlinePlayerInterfaceEx]]
* [[Legacy:OnlineStatsInterface|OnlineStatsInterface]]
* [[Legacy:OnlineSystemInterface|OnlineSystemInterface]]
* [[Legacy:OnlineVoiceInterface|OnlineVoiceInterface]]
* [[Legacy:UIDataStoreSubscriber|UIDataStoreSubscriber]]
** [[Legacy:UIDataStorePublisher|UIDataStorePublisher]]
* [[Legacy:UIEventContainer|UIEventContainer]]
* [[Legacy:UIListElementCellProvider|UIListElementCellProvider]]
* [[Legacy:UIListElementProvider|UIListElementProvider]]
* [[Legacy:UISettingsClient|UISettingsClient]]
* [[Legacy:UIStringRenderer|UIStringRenderer]]
* [[Legacy:UIStyleResolver|UIStyleResolver]]

[[Category:Legacy Class (UT3)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InternetInfo</title>
    <id>1466</id>
    <revision>
      <id>3680</id>
      <timestamp>2002-04-20T09:40:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; InternetInfo}}

Parent class for Internet connection classes.

==Methods ==
; function string GetBeaconAddress (int i) :
; function string GetBeaconText (int i) :

==Known subclasses ==
* [[Legacy:InternetLink|InternetLink]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InternetLink</title>
    <id>1467</id>
    <revision>
      <id>3681</id>
      <timestamp>2007-08-23T10:13:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:InternetInfo|InternetInfo]] &gt;&gt; InternetLink (Package: IpDrv)}}

Parent class for Internet connection classes [[Legacy:TcpLink|TcpLink]] and [[Legacy:UdpLink|UdpLink]].

See [[Legacy:InternetLink (UT)|InternetLink (UT)]] for the [[Legacy:UT|UT]] version if this class.

==Enums==

===ELinkMode===

Specifies, how received data should be processed.
; MODE_Text : Data is plain text. The entire buffer should be received as a single string.
; MODE_Line : Data is plain text. The buffer should be split up into lines and each line should be received as a separate string.
; MODE_Binary : Data is binary. The data is received in chunks of up to 255 bytes as a byte array.

===EReceiveMode===
; RMODE_Manual : Received events will not be called. Use the &lt;tt&gt;IsDataPending()&lt;/tt&gt; method to check for new data and manually read the data using the appropriate &lt;tt&gt;Read*()&lt;/tt&gt; method.
; RMODE_Event : Every tick when new data has arrived the &lt;tt&gt;Received*()&lt;/tt&gt; event matching the link mode is called with the new data.

===ELineMode===

For line link mode this enum specifies the line separator. Supported separators are CRLF (&quot;\r\n&quot;), only LF (&quot;\n&quot;) and LFCR (&quot;\n\r&quot;).
; LMODE_auto : For sending the line separator is CRLF, for receiving the line separator is LF, optionally preceeded by CR.
; LMODE_DOS : Line separator is CRLF.
; LMODE_UNIX : Line separator is only LF.
; LMODE_MAC : Line separator is LFCR.

==Structs==

===IpAddr===

An IP address with port.
; int Addr : The IP address as integer.
; int Port : The port.

==Properties==
; ELinkMode LinkMode : Data receive mode. (Cannot be set in default properties.)
; pointer Socket (const) : Internal pointer to the native TCP socket.
; int Port (const) : Bound port, if any.
; pointer RemoteSocket (const) : Internal pointer to the native TCP remote socket if connected.
; pointer PrivateResolveInfo (private, native, const) :
; int DataPending (const) : Number of bytes pending.
; EReceiveMode ReceiveMode : Receive mode. (Cannot be set in default properties.)

==Methods ==

===Native Functions===
; bool IsDataPending() : Returns true if data is pending on the socket.
; bool ParseURL(coerce string URL, out string Addr, out int Port, out string LevelName, out string EntryName) : Parses an Unreal URL into its component elements. Returns false if the URL was invalid.
; Resolve(coerce string Domain) : Resolve a domain or dotted IP to an IpAddr struct without Port. This function returns immediately. The &lt;tt&gt;Resolved()&lt;/tt&gt; event will be called on success, otherwise &lt;tt&gt;ResolveFailed()&lt;/tt&gt; is called.
; int GetLastError() : Returns most recent winsock error.
; string IpAddrToString (IpAddr Arg) : Convert an IP address to a string.
; bool StringToIpAddr (string Str, out IpAddr Addr) : Convert a string to an IP
; string GameSpyValidate (string ValidationString) : Takes a challenge string and returns an encoded validation string.
; string GameSpyGameName() : 
; GetLocalIP(out IpAddr Arg) : Fills in the locally bound IP address.

===Events===
; Resolved(IpAddr Addr) : Called when domain resolution is successful. The IpAddr struct Addr contains the valid address.
; ResolveFailed() : Called when domain resolution fails.

==Known subclasses==
* [[Legacy:TcpLink|TcpLink]]
* [[Legacy:UdpLink|UdpLink]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3682</id>
      <timestamp>2004-06-10T04:48:02Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>Added detail for RMODE_Event.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:InternetInfo|InternetInfo]] &gt;&gt; InternetLink}}

Parent class for Internet connection classes [[Legacy:TcpLink|TcpLink]] and [[Legacy:UdpLink|UdpLink]].

==Properties ==
; ELinkMode LinkMode : Data receive mode. (Cannot be set in default properties.)
; const int Socket : 
; const int Port :
; const int RemoteSocket :
; private native const int PrivateResolveInfo :
; const int DataPending : number of bytes pending

'''El Muerte TDS:''' Broken, is always 0 (versions up to 2166)
; EReceiveMode ReceiveMode : Receive mode. (Cannot be set in default properties.)

====ELinkMode enum ====
; MODE_Text :
; MODE_Line :
; MODE_Binary :

====EReceiveMode enum ====
; RMODE_Manual : Received events will not be called. This means it is your responsibility to check the DataPending var and receive the data.
; RMODE_Event : The event 'ReceivedBinary' in will be called once per-tick when incoming data is pending.

====IPAddr struct ====
; int Addr :
; int Port :

==Methods ==

===Native functions ===
; native function bool IsDataPending ( ) : Returns true if data is pending on the socket.

'''El Muerte TDS:''' Broken, always returns false (versions up to 2166)
; native function bool ParseURL (coerce string URL, out string Addr, out int Port, out string LevelName, out string EntryName) : Parses an Unreal URL into its component elements. Returns false if the URL was invalid.
; native function Resolve (coerce string Domain) : Resolve a domain or dotted IP. Nonblocking operation. Triggers Resolved event if successful. Triggers ResolveFailed event if unsuccessful.
; native function int GetLastError ( ) : Returns most recent winsock error.
; native function string IpAddrToString (IpAddr Arg) : Convert an IP address to a string.
; native function bool StringToIpAddr (string Str, out IpAddr Addr) : Convert a string to an IP
; native function string Validate (string ValidationString, string GameName) : Validate: Takes a challenge string and returns an encoded validation string.
; native function GetLocalIP (out IpAddr Arg) :

===Events ===
; event Resolved (IpAddr Addr) : Called when domain resolution is successful. The IpAddr struct Addr contains the valid address.
; event ResolveFailed ( ) : Called when domain resolution fails.

==Known subclasses ==
* [[Legacy:TcpLink|TcpLink]]
* [[Legacy:UdpLink|UdpLink]]</text>
    </revision>
    <revision>
      <id>3683</id>
      <timestamp>2007-08-23T10:11:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:InternetInfo|InternetInfo]] &gt;&gt; InternetLink (Package: IpDrv)}}

Parent class for Internet connection classes [[Legacy:TcpLink|TcpLink]] and [[Legacy:UdpLink|UdpLink]].

See [[Legacy:InternetLink (UT)|InternetLink (UT)]] for the [[Legacy:UT|UT]] version if this class.

==Enums==

===ELinkMode===

Specifies, how received data should be processed.
; MODE_Text : Data is plain text. The entire buffer should be received as a single string.
; MODE_Line : Data is plain text. The buffer should be split up into lines and each line should be received as a separate string.
; MODE_Binary : Data is binary. The data is received in chunks of up to 255 bytes as a byte array.

===EReceiveMode===
; RMODE_Manual : Received events will not be called. Use the &lt;tt&gt;IsDataPending()&lt;/tt&gt; method to check for new data and manually read the data using the appropriate &lt;tt&gt;Read*()&lt;/tt&gt; method.
; RMODE_Event : Every tick when new data has arrived the &lt;tt&gt;Received*()&lt;/tt&gt; event matching the link mode is called with the new data.

===ELineMode===

For line link mode this enum specifies the line separator. Supported separators are CRLF (&quot;\r\n&quot;), only LF (&quot;\n&quot;) and LFCR (&quot;\n\r&quot;).
; LMODE_auto : For sending the line separator is CRLF, for receiving the line separator is LF, optionally preceeded by CR.
; LMODE_DOS : Line separator is CRLF.
; LMODE_UNIX : Line separator is only LF.
; LMODE_MAC : Line separator is LFCR.

==Structs==

===IpAddr===

An IP address with port.
; int Addr : The IP address as integer.
; int Port : The port.

==Properties==
; ELinkMode LinkMode : Data receive mode. (Cannot be set in default properties.)
; pointer Socket (const) : Internal pointer to the native TCP socket.
; int Port (const) : Bound port, if any.
; pointer RemoteSocket (const) : Internal pointer to the native TCP remote socket if connected.
; pointer PrivateResolveInfo (private, native, const) :
; int DataPending (const) : Number of bytes pending.
; EReceiveMode ReceiveMode : Receive mode. (Cannot be set in default properties.)

==Methods ==

===Native Functions===
; bool IsDataPending() : Returns true if data is pending on the socket.
; bool ParseURL(coerce string URL, out string Addr, out int Port, out string LevelName, out string EntryName) : Parses an Unreal URL into its component elements. Returns false if the URL was invalid.
; Resolve(coerce string Domain) : Resolve a domain or dotted IP to an IpAddr struct without Port. This function returns immediately. The &lt;tt&gt;Resolved()&lt;/tt&gt; event will be called on success, otherwise &lt;tt&gt;ResolveFailed()&lt;/tt&gt; is called.
; int GetLastError() : Returns most recent winsock error.
; string IpAddrToString (IpAddr Arg) : Convert an IP address to a string.
; bool StringToIpAddr (string Str, out IpAddr Addr) : Convert a string to an IP
; string Validate (string ValidationString, string GameName) : Validate: Takes a challenge string and returns an encoded validation string.
; GetLocalIP(out IpAddr Arg) : Fills in the locally bound IP address.

===Events===
; Resolved(IpAddr Addr) : Called when domain resolution is successful. The IpAddr struct Addr contains the valid address.
; ResolveFailed() : Called when domain resolution fails.

==Known subclasses==
* [[Legacy:TcpLink|TcpLink]]
* [[Legacy:UdpLink|UdpLink]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InternetLink (UT)</title>
    <id>1527</id>
    <revision>
      <id>3815</id>
      <timestamp>2008-02-07T20:49:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:InternetInfo|InternetInfo]] &gt;&gt; InternetLink}}

Parent class for Internet connection classes [[Legacy:TcpLink|TcpLink]] and [[Legacy:UdpLink|UdpLink]].

See [[Legacy:InternetLink|InternetLink]] for the [[Legacy:UT2004|UT2004]] version of this class.

==Properties ==
; ELinkMode LinkMode : Data receive mode. (Cannot be set in default properties.)
; const int Socket : 
; const int Port :
; const int RemoteSocket :
; private native const int PrivateResolveInfo :
; const int DataPending : number of bytes pending

'''El Muerte TDS:''' Broken, is always 0 (versions up to 2166)
; EReceiveMode ReceiveMode : Receive mode. (Cannot be set in default properties.)

====ELinkMode enum ====
; MODE_Text :
; MODE_Line :
; MODE_Binary :

====EReceiveMode enum ====
; RMODE_Manual : Received events will not be called. This means it is your responsibility to check the DataPending var and receive the data.
; RMODE_Event : The event 'ReceivedBinary' in will be called once per-tick when incoming data is pending.

====IPAddr struct ====
; int Addr :
; int Port :

==Methods ==

===Native functions ===
; bool IsDataPending ( ) : Returns true if data is pending on the socket.

'''El Muerte TDS:''' Broken, always returns false (versions up to 2166)
; bool ParseURL (coerce string URL, out string Addr, out int Port, out string LevelName, out string EntryName) : Parses an Unreal URL into its component elements. Returns false if the URL was invalid.
; Resolve (coerce string Domain) : Resolve a domain or dotted IP. Nonblocking operation. Triggers Resolved event if successful. Triggers ResolveFailed event if unsuccessful.
; int GetLastError ( ) : Returns most recent winsock error.
; string IpAddrToString (IpAddr Arg) : Convert an IP address to a string.
; bool StringToIpAddr (string Str, out IpAddr Addr) : Convert a string to an IP
; string Validate (string ValidationString, string GameName) : Validate: Takes a challenge string and returns an encoded validation string.
; GetLocalIP (out IpAddr Arg) :

===Events ===
; Resolved (IpAddr Addr) : Called when domain resolution is successful. The IpAddr struct Addr contains the valid address.
; ResolveFailed ( ) : Called when domain resolution fails.

==Known Subclasses==
* [[Legacy:TcpLink|TcpLink]]
* [[Legacy:UdpLink|UdpLink]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3816</id>
      <timestamp>2008-02-07T20:20:12Z</timestamp>
      <contributor>
        <ip>64-73-249-183.static-ip.telepacific.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">lulz gone</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Interpolated Path</title>
    <id>1455</id>
    <revision>
      <id>3657</id>
      <timestamp>2002-08-01T12:35:55Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Uses [[Legacy:InterpolationPoint|InterpolationPoint]]s.

See:
* [[Legacy:Making An Interpolation Path|Making an Interpolation Path]]
* [[Legacy:UMS/InterpolationTutorial|UMS/InterpolationTutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InterpolationPoint</title>
    <id>1470</id>
    <revision>
      <id>3689</id>
      <timestamp>2002-12-15T18:22:53Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; InterpolationPoint}}

[[Image:Legacy_InterpolationPoint.jpeg|left|]]

Interpolation is a way of getting a smooth path from a series of points. It is not the same as splining. A spline is a smoothed line that goes through all of the points in the path. This is commonly used for smooth paths, but not in Unreal. An interpolated curve doesn't actually touch the points at all. It is pulled towards the points, but without actually going through them. This is the way Unreal uses Interpolation Points. See [[Legacy:Making An Interpolation Path|Making an Interpolation Path]] for detailed instructions.

==Properties ==

; bEndOfPath : Set this property to true on the end Interpolation Point to specify the end of the path.
; bSkipNextPath :Far as I can see it is not used in the code at all - ignore.
; FovModifier : Modifies the [[Legacy:FOV|FOV]] of the view at this point in the path. This is relative to the current [[Legacy:FOV|FOV]]
; GameSpeedModifier : Modifies the speed of the entire game between the point it is changed and the next point, generally it is better to use RateModifier whenever possible, but if you do use this make sure to &lt;i&gt;reset this back to 1 at the last InterpolationPoint.&lt;/i&gt;
; Position : Indicates which position this InterpolationPoint is in for a given path. Starts at 0 with 127 max
; RateModifier : Modifies the rate at which the actor moving through the Interpolation path, well, moves. Again, this rate sort of &quot;blends&quot; between each point's rate and the rate of the next point.
; ScreenFlashFog :
; ScreenFlashScale :

==Comments ==

'''Tarquin:'''  hi. You have a user page here at [[Legacy:RFairey|RFairey]] BTW. :)

'''Birelli:''' Yeah, please do link it in :-). On the subject of this though, Interpolation Points can be used to move any actor at all along a set path. I seem to recall this somewhere in reference to a boat and also of course to the JBViepoint actor in Jailbreak death sequences. I'm not sure how that should be addressed in the page though.

[[Legacy:UMS/InterpolationTutorial|UMS/InterpolationTutorial]] has a big section on Interpolation &amp;ndash; some of that could be copied here

'''Birelli:''' I'm gonna start pulling stuff from Hugh's UMS tutorial and editing it to suit a general concept.

'''Birelli:''' Urm, sorry about the cross-editing Tarq, I was actually putting in a few property defs when you put in the whole list, but I got it straight I think.</text>
    </revision>
    <revision>
      <id>3690</id>
      <timestamp>2002-07-21T11:47:48Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; InterpolationPoint}}

@left@Interp

Interpolation is a way of getting a smooth path from a series of points. It is not the same as splining. A spline is a smoothed line that goes through all of the points in the path. This is commonly used for smooth paths, but not in Unreal. An interpolated curve doesn't actually touch the points at all. It is pulled towards the points, but without actually going through them. This is the way Unreal uses Interpolation Points.

==Properties ==

; bEndOfPath : Set this property to true on the end Interpolation Point to specify the end of the path.
; bSkipNextPath :Far as I can see it is not used in the code at all - ignore.
; FovModifier : Modifies the [[Legacy:FOV|FOV]] of the view at this point in the path. This is relative to the current [[Legacy:FOV|FOV]]
; GameSpeedModifier : Modifies the speed of the entire game between the point it is changed and the next point, generally it is better to use RateModifier whenever possible, but if you do use this make sure to &lt;i&gt;reset this back to 1 at the last InterpolationPoint.&lt;/i&gt;
; Position : Indicates which position this InterpolationPoint is in for a given path. Starts at 0 with 127 max
; RateModifier : Modifies the rate at which the actor moving through the Interpolation path, well, moves. Again, this rate sort of &quot;blends&quot; between each point's rate and the rate of the next point.
; ScreenFlashFog :
; ScreenFlashScale :

==Using Interpolation Points ==

See also [[Legacy:Making An Interpolation Path|Making an Interpolation Path]]

===Adding Interpolation Points to your map ===

# InterpolationPoints (hereafter called IP's) can be found under '''Keypoint &gt;&gt; InterpolationPoint''' in the [[Legacy:Actor Classes|Actor Classes]] Browser. The first thing to do is to add one to your level where you want the Interpolation path to start. IPs show a  directional arrow in UnrealEd, which defines (funnily enough) the direction that the actor on the path will be pointing. Set their direction with the [[Legacy:Brush Rotate|Brush Rotate]] tool or the Movement -&gt; Rotation property.

# In InterpolationPoint Properties -&gt; InterpolationPoint -&gt; Position, you should put the number that defines what point in the path this IP is at. This should start at 0, and I have been informed that the upper limit is 127 (thanks to TheMapper for that). 

# I think the best thing to do, is to first add the IP's to your level, in aproximately the right places. Then you can get the path set up correctly, before changing the speed. 

# Once you have got all your IP's in, there are two more that you have to put in. At the last point, you need to have two IP's. Then, put another one in the same position as the first, and give it the next Position after the last one. This is because IP paths actually loop, and the only way to get the path to go through a point is to put two IP's on top of each other. The reason the highest number IP is at the beginning of the path is because the actor following the path will start half way between the first and last IP's. 

===Setting the speed of the Interpolation Points===

# Once you have your path correct, you may want to play around with the speed. You will find that it looks a lot nicer if the speed does vary. Knowing when to vary the speed isn't something that I can teach you. 

# To change the speed, go to '''InterpolationPoint Properties -&gt; InterpolationPoint -&gt; RateModifier'''. Again, it is a matter of trial and error to find a series of values which you like. On each IP, the rate will be at that point, and it will change between the two points. If you want to change the rate very quickly, have two IPs very close to each other with different rate values.

# You can, if you want, change the speed of the game with the '''GameSpeedModifier''', but this works seperately from '''SetSpeed'''. If you do use '''GameSpeedModifier''', then make sure that it is reset back to 1 for the end of the IP path. 

----

* Note: Most of the content from this page is adapted from a tutorial for [[Legacy:UMS|UMS]] that [[Legacy:Hugh|Hugh]] wrote, and this section certainly isn't complete - the specifics of how to get an actor to actually follow the Interpolation path without using UMS I'm not clear on, maybe someone else could help out there &amp;ndash; ''Birelli''

==Comments ==

'''Tarquin:'''  hi. You have a user page here at [[Legacy:RFairey|RFairey]] BTW. :)

'''Birelli:''' Yeah, please do link it in :-). On the subject of this though, Interpolation Points can be used to move any actor at all along a set path. I seem to recall this somewhere in reference to a boat and also of course to the JBViepoint actor in Jailbreak death sequences. I'm not sure how that should be addressed in the page though.

[[Legacy:UMS/InterpolationTutorial|UMS/InterpolationTutorial]] has a big section on Interpolation &amp;ndash; some of that could be copied here

'''Birelli:''' I'm gonna start pulling stuff from Hugh's UMS tutorial and editing it to suit a general concept.

'''Birelli:''' Urm, sorry about the cross-editing Tarq, I was actually putting in a few property defs when you put in the whole list, but I got it straight I think.</text>
    </revision>
    <revision>
      <id>3691</id>
      <timestamp>2002-08-01T12:37:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>moving tute stuff</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; InterpolationPoint}}

@left@Interp

Interpolation is a way of getting a smooth path from a series of points. It is not the same as splining. A spline is a smoothed line that goes through all of the points in the path. This is commonly used for smooth paths, but not in Unreal. An interpolated curve doesn't actually touch the points at all. It is pulled towards the points, but without actually going through them. This is the way Unreal uses Interpolation Points. See [[Legacy:Making An Interpolation Path|Making an Interpolation Path]] for detailed instructions.

==Properties ==

; bEndOfPath : Set this property to true on the end Interpolation Point to specify the end of the path.
; bSkipNextPath :Far as I can see it is not used in the code at all - ignore.
; FovModifier : Modifies the [[Legacy:FOV|FOV]] of the view at this point in the path. This is relative to the current [[Legacy:FOV|FOV]]
; GameSpeedModifier : Modifies the speed of the entire game between the point it is changed and the next point, generally it is better to use RateModifier whenever possible, but if you do use this make sure to &lt;i&gt;reset this back to 1 at the last InterpolationPoint.&lt;/i&gt;
; Position : Indicates which position this InterpolationPoint is in for a given path. Starts at 0 with 127 max
; RateModifier : Modifies the rate at which the actor moving through the Interpolation path, well, moves. Again, this rate sort of &quot;blends&quot; between each point's rate and the rate of the next point.
; ScreenFlashFog :
; ScreenFlashScale :

==Comments ==

'''Tarquin:'''  hi. You have a user page here at [[Legacy:RFairey|RFairey]] BTW. :)

'''Birelli:''' Yeah, please do link it in :-). On the subject of this though, Interpolation Points can be used to move any actor at all along a set path. I seem to recall this somewhere in reference to a boat and also of course to the JBViepoint actor in Jailbreak death sequences. I'm not sure how that should be addressed in the page though.

[[Legacy:UMS/InterpolationTutorial|UMS/InterpolationTutorial]] has a big section on Interpolation &amp;ndash; some of that could be copied here

'''Birelli:''' I'm gonna start pulling stuff from Hugh's UMS tutorial and editing it to suit a general concept.

'''Birelli:''' Urm, sorry about the cross-editing Tarq, I was actually putting in a few property defs when you put in the whole list, but I got it straight I think.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Intersect</title>
    <id>1474</id>
    <revision>
      <id>3701</id>
      <timestamp>2005-03-11T19:56:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Brush Intersection''' is an operation which crops the [[Legacy:Red Builder Brush|red builder brush]] using current world geometry. There are two types, outlined in the following table. To perform them, select the toolbox button, the menu or use the keyboard shortcut. It doesn't matter what is currently selected, only the RBB can be cropped like this.

{|

|-
|Name
|Intersect
|Deintersect 
|-
|Keeps...
|parts of the RBB that are in solid space
|parts of the RBB that are in open space 
|-
|and discards...
|parts of the RBB that are in open space
|parts of the RBB that are in solid space 
|-
|[[Legacy:Toolbox|Toolbox]]
|4th group, middle-left
|4th group, middle-right
|-
|[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush ...
|-&gt; Intersect
|-&gt; Deintersect 
|-
|Keyboard
|CTRL-N
|CTRL-D
|}

It's important to remember that the black &quot;empty space&quot; is solid, and the actual map area is hollow (see [[Legacy:Unreal Geometry|Unreal Geometry]] and [[Legacy:CSG|CSG]]).

''next... basic uses...'''

===Rule one of Intersection ===

Don't use it.

* you don't need to intersect every new brush
* you don't need to intersect to get a &quot;clean&quot; join. Use the [[Legacy:Grid|grid]]. For that matter, overlaps are not terribly important.
* compound brushes made with intesection do not simplify geometry. They simplify ''your'' work as a mapper, but may confuse the BSP.

----

[[:Category:Legacy To Do]]

stuff to refactor:

The term '''brush intersection''' refers to an UnrealEd operation that crops the [[Legacy:Red Builder Brush|red builder brush]] using current world geometry. This is accessed either with two buttons in the [[Legacy:Toolbox|toolbox]] or from the &lt;i&gt;Brush&lt;/i&gt; menu. 

The ''Intersect'' command keeps only the volume of the RBB that is within solid space; conversely the ''Deintersect'' command keeps the volume that is in hollow space. (It's important to remember that the black &quot;empty space&quot; is solid, and the actual map area is hollow.)

These operations are two of the most useful basic shape manipulations available in UnrealEd, but they can be intimidating to the novice, and are easily confused. Experienced mappers employ these techniques constantly to achieve the desired shape in a brush. All exported brushes (pre-fabrications) must be intersected first, to retain the applied textures and reduce previous manipulative brush operations to a single, integrated geometry.

==Basic Procedure ==

It's not necessary to select the [[Legacy:Red Builder Brush|red builder brush]]. 

When the &quot;Intersect&quot; command is performed, either with the [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush or with the [[Legacy:Toolbox|toolbox]] button, all the parts of the Red Builder Brush that are enclosing actual world matter (or CSG Constructive Solid Geometry) are selected and configured to the exact dimensions of that geometry. This geometry can be quite complex (it can actually be a number of seperate, non-adjacent elements); and, this is the principal advantage of using the Brush Intersect method. This is now one brush; and you can perform a number of other brush operations on it. Note the 'pivot point' of the brush. By default, it will be located at the center of the brush, but it can be moved by merely right clicking another brush vertex. When the 'Snap to Grid' feature is enabled (it is suggested that this always be the case), the 'pivot point' snaps to the closest grid point. 

So, for instance, if you made a cube (256*256), added it to the world in a large open space, resized the cube to (512*512), and moved it around the original cube: You could then click intersect to make the brush only the size of the original cube.

Deintersect is obviously the exact opposite. Clicking Deintersect causes all the parts of the red brush that are sticking into existing material to go away. An example is if you made a (256*256*256) cube and subtracted it, Then resized the brush to (512*512*512) cube and moved it around the subtracted cube: You could click &quot;Deintersect&quot; and only the part of the red brush where the original cube was would be left.

==Further Techniques ==

===Compound Brushes ===

Often mappers will use essentially the same or (a similar) shape repeatedly when mapping. When you add semi-realistic objects to your levels, like, vehicles, furniture, archtectural decorations, and other detailed fixtures, it is easier to convert what is an amalgamation of number of adjacent primitives into one complex brush. You can then import and export simply, manipulate, and move the brush around with great ease. Also, the brush can be easily modified. &lt;br /&gt;

Create the brush in a large subtracted area, that is seperate and not interfering with level geometry. Make all the minor adjustments in dimensions, and configuration, and then texture in the optimal cool fashion. When you have this shape just the way you imagined it, right click on the ''CUBE'' [[Legacy:Brushbuilders|Brushbuilder]], and enter dimensions that are larger than the shape you just created, but, will fit easily within the subtracted space that you are working in. Position this [[Legacy:Red Builder Brush|red builder brush]] so that it bounds your original amalgamated shape, but, so that it does not merge or intersect it (or coincide on the same grid points). Also, it should not cross the boundary of the working space that this operation is enclosed within.&lt;br&gt;

Then, with a maniacal grin on your face, Select, &lt;i&gt;Brush -&gt; Intersect&lt;/i&gt;. 

===Merging ===

One thing that deintersection is good for is merging polygons on uncooperative brushes, such as those created by extruding a shape with the 2D Shape Editor.

Here's a little trick that might help when you're extruding a brush and the top and bottom are going to come out tesselated.
# Extrude that brush to a length that is LONGER than what you originally were going to create.
# Move the newly-shaped red builder brush into a wide open space in the void and subtract it.  Do NOT move, rotate, or scale the red builder brush after this point!
# Open the cylinder brushbuilder properties.  Put in a height that matches the height you wanted your extruded brush to have in the first place.  Put in a radius that is at least large enough to cover the length and width of the subtracted brush.  (Don't put in a radius so large that it to touches other unrelated geometry.)  Click on the &quot;Build&quot; button.
# Now deintersect the builder brush with the subtracted brush.

Now to explain what you just did and why you did it.  You made the subtracted brush too long so that the cylinder you deintersected it with wouldn't touch the ends, which were tesselated.  You made the cylinder the original height because this is the height you want your final brush to have.  You made the radius so large because you weren't going to change the 2D shape that you used to build the brush.

* There is an alternative way of doing this, with the [[Legacy:Merge Polygons|Merge Polygons]] command.

===De/intersect Caveat===


Having come from the Q3 editing world, I had some unconscious preconceptions about the innerworkings of UED2

In Q3 editing, the different facets of mapediting are relative to each other only in very microscopic ways. the map file that you work on in radiant has absolutely NO resemblance to the .BSP file that you play, let alone the bsp or vis compiling processes. once the BSP compile has created a couple of reference files for the VIS process, they have nothing more to do with each other. . . 

So the problem here was that my training led me to think that in UED, edit-level brush data had absolutely nothing to do with bsp data. Here i am with a completed and compiled mountain brush. i fit the BB to the brush. I thought by deleting the brush, it didn't matter that it was still in the BSP info . . . I figure i'm not editing the BSP, i'm editing brushes, and the brush isn't there. So when i deintersect, there's nothing there to get in the way.

wrong. I deleted the brush but the bsp data was still there affecting the deintersect as if it were a brush.

;Moral of the story : It's best to do all your de/intersecting while you're building. cuz it's a pain in the ass to follow the rest of this section.

'''&amp;ndash;Monsto'''


See also [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] to [[Legacy:CSG|CSG]] for the basics of brushes &amp; geometry.

====If you have existing geometry that you want to clean up via de/intersect:====

# Save As a different filename. You're now dealing with a 'working' file and your actual map won't be dorked if you mess up here.
# select only the brushes that matter. . . the one to be fixed, and the ones it will be fixed with.
# click &quot;show only selected actors.&quot; It's the open-eye button with the dotted red box on the [[Legacy:Toolbar|toolbar]]
# go into the [[Legacy:Build Window|Build Window]], check the option for &quot;rebuild only visible actors&quot; and [[Legacy:Build|build]]. all views will show only what you're working on.
# fit the [[Legacy:Red Builder Brush|red builder brush]] to the brush you wanna fix (get a button to do this from http://www.planetunreal.com/fordy/uedbuttons.htm )
# delete the brush to be fixed (don't change this brush '''AT ALL''' or you'll be doomed)
# [[Legacy:Build|build]] again . . . in all views you should see the [[Legacy:Red Builder Brush|red builder brush]] in the place of the brush to be fixed, and also the other brushes you're working on.
# de/intersect
# [[Legacy:Subtraction And Addition|add/subtract]] your brush.
# save.

Do that for each brush.

==Comments ==

Just a forum snipe from tarquin:

:Intersection and deintersecting are used far too often. Use the grid &amp; good choice of initial dimensions to line up brushes perfectly. Int &amp; DeInt are really (IMO) just tools for brush shaping, not for ensuring clean joins. It's in fact fine to overlap subtracts, or have additives poke into solid space.

'''Bean:''' It's overused to an extent. Less brushes in a level = less rendering work. It's a no-brainer that combining  two brushes who vertices touch will reduce the amount of work the engine has to do on vertex calculations. But, there is a tradeoff when making complex brushes. The two combined brushes may cut into bsp less than the complex brush, the brush may be too detailed to be rendered efficiently, etc... It's all a matter of trial and error by using the zone portal view to view the bsp node cuts and using &quot;stat fps&quot; to see what reduces the node count. A lot of beginning and ignorant mappers combine brushes because they hear that it improves performance, when it's not always the case. (end rant :)

'''Tarquin:'''  &quot;combining  two brushes who vertices touch will reduce the amount of work the engine has to do on vertex calculations.&quot; &amp;ndash; IIRC, the vertices will still be there. If you have 2 box brushes side by side, delete one and enlarge the other with [[Legacy:Vertex Editing|vertex editing]]. Or delete both and make a new one.

'''scumble:''' Just a thought, but what about [http://udn.epicgames.com/Two/IntroToUnrealEd#Making_Additional_BSP_Brushes this note] at UDN? It suggests always doing an intersection before subtracting.

'''Tarquin:''' Well if Epic says you should, I guess you should. :) I have seen plenty of Epic maps that overlap brushes though.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3702</id>
      <timestamp>2005-03-11T18:57:20Z</timestamp>
      <contributor>
        <ip>Scumble</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Brush Intersection''' is an operation which crops the [[Legacy:Red Builder Brush|red builder brush]] using current world geometry. There are two types, outlined in the following table. To perform them, select the toolbox button, the menu or use the keyboard shortcut. It doesn't matter what is currently selected, only the RBB can be cropped like this.

{|

|-
|Name
|Intersect
|Deintersect 
|-
|Keeps...
|parts of the RBB that are in solid space
|parts of the RBB that are in open space 
|-
|and discards...
|parts of the RBB that are in open space
|parts of the RBB that are in solid space 
|-
|[[Legacy:Toolbox|Toolbox]]
|4th group, middle-left
|4th group, middle-right
|-
|[[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush ...
|-&gt; Intersect
|-&gt; Deintersect 
|-
|Keyboard
|CTRL-N
|CTRL-D
|}

It's important to remember that the black &quot;empty space&quot; is solid, and the actual map area is hollow (see [[Legacy:Unreal Geometry|Unreal Geometry]] and [[Legacy:CSG|CSG]]).

''next... basic uses...'''

===Rule one of Intersection ===

Don't use it.

* you don't need to intersect every new brush
* you don't need to intersect to get a &quot;clean&quot; join. Use the [[Legacy:Grid|grid]]. For that matter, overlaps are not terribly important.
* compound brushes made with intesection do not simplify geometry. They simplify ''your'' work as a mapper, but may confuse the BSP.

----

[[:Category:Legacy To Do]]

stuff to refactor:

The term '''brush intersection''' refers to an UnrealEd operation that crops the [[Legacy:Red Builder Brush|red builder brush]] using current world geometry. This is accessed either with two buttons in the [[Legacy:Toolbox|toolbox]] or from the &lt;i&gt;Brush&lt;/i&gt; menu. 

The ''Intersect'' command keeps only the volume of the RBB that is within solid space; conversely the ''Deintersect'' command keeps the volume that is in hollow space. (It's important to remember that the black &quot;empty space&quot; is solid, and the actual map area is hollow.)

These operations are two of the most useful basic shape manipulations available in UnrealEd, but they can be intimidating to the novice, and are easily confused. Experienced mappers employ these techniques constantly to achieve the desired shape in a brush. All exported brushes (pre-fabrications) must be intersected first, to retain the applied textures and reduce previous manipulative brush operations to a single, integrated geometry.

==Basic Procedure ==

It's not necessary to select the [[Legacy:Red Builder Brush|red builder brush]]. 

When the &quot;Intersect&quot; command is performed, either with the [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; Brush or with the [[Legacy:Toolbox|toolbox]] button, all the parts of the Red Builder Brush that are enclosing actual world matter (or CSG Constructive Solid Geometry) are selected and configured to the exact dimensions of that geometry. This geometry can be quite complex (it can actually be a number of seperate, non-adjacent elements); and, this is the principal advantage of using the Brush Intersect method. This is now one brush; and you can perform a number of other brush operations on it. Note the 'pivot point' of the brush. By default, it will be located at the center of the brush, but it can be moved by merely right clicking another brush vertex. When the 'Snap to Grid' feature is enabled (it is suggested that this always be the case), the 'pivot point' snaps to the closest grid point. 

So, for instance, if you made a cube (256*256), added it to the world in a large open space, resized the cube to (512*512), and moved it around the original cube: You could then click intersect to make the brush only the size of the original cube.

Deintersect is obviously the exact opposite. Clicking Deintersect causes all the parts of the red brush that are sticking into existing material to go away. An example is if you made a (256*256*256) cube and subtracted it, Then resized the brush to (512*512*512) cube and moved it around the subtracted cube: You could click &quot;Deintersect&quot; and only the part of the red brush where the original cube was would be left.

==Further Techniques ==

===Compound Brushes ===

Often mappers will use essentially the same or (a similar) shape repeatedly when mapping. When you add semi-realistic objects to your levels, like, vehicles, furniture, archtectural decorations, and other detailed fixtures, it is easier to convert what is an amalgamation of number of adjacent primitives into one complex brush. You can then import and export simply, manipulate, and move the brush around with great ease. Also, the brush can be easily modified. &lt;br /&gt;

Create the brush in a large subtracted area, that is seperate and not interfering with level geometry. Make all the minor adjustments in dimensions, and configuration, and then texture in the optimal cool fashion. When you have this shape just the way you imagined it, right click on the ''CUBE'' [[Legacy:Brushbuilders|Brushbuilder]], and enter dimensions that are larger than the shape you just created, but, will fit easily within the subtracted space that you are working in. Position this [[Legacy:Red Builder Brush|red builder brush]] so that it bounds your original amalgamated shape, but, so that it does not merge or intersect it (or coincide on the same grid points). Also, it should not cross the boundary of the working space that this operation is enclosed within.&lt;br&gt;

Then, with a maniacal grin on your face, Select, &lt;i&gt;Brush -&gt; Intersect&lt;/i&gt;. 

===Merging ===

One thing that deintersection is good for is merging polygons on uncooperative brushes, such as those created by extruding a shape with the 2D Shape Editor.

Here's a little trick that might help when you're extruding a brush and the top and bottom are going to come out tesselated.
# Extrude that brush to a length that is LONGER than what you originally were going to create.
# Move the newly-shaped red builder brush into a wide open space in the void and subtract it.  Do NOT move, rotate, or scale the red builder brush after this point!
# Open the cylinder brushbuilder properties.  Put in a height that matches the height you wanted your extruded brush to have in the first place.  Put in a radius that is at least large enough to cover the length and width of the subtracted brush.  (Don't put in a radius so large that it to touches other unrelated geometry.)  Click on the &quot;Build&quot; button.
# Now deintersect the builder brush with the subtracted brush.

Now to explain what you just did and why you did it.  You made the subtracted brush too long so that the cylinder you deintersected it with wouldn't touch the ends, which were tesselated.  You made the cylinder the original height because this is the height you want your final brush to have.  You made the radius so large because you weren't going to change the 2D shape that you used to build the brush.

* There is an alternative way of doing this, with the [[Legacy:Merge Polygons|Merge Polygons]] command.

===De/intersect Caveat===


Having come from the Q3 editing world, I had some unconscious preconceptions about the innerworkings of UED2

In Q3 editing, the different facets of mapediting are relative to each other only in very microscopic ways. the map file that you work on in radiant has absolutely NO resemblance to the .BSP file that you play, let alone the bsp or vis compiling processes. once the BSP compile has created a couple of reference files for the VIS process, they have nothing more to do with each other. . . 

So the problem here was that my training led me to think that in UED, edit-level brush data had absolutely nothing to do with bsp data. Here i am with a completed and compiled mountain brush. i fit the BB to the brush. I thought by deleting the brush, it didn't matter that it was still in the BSP info . . . I figure i'm not editing the BSP, i'm editing brushes, and the brush isn't there. So when i deintersect, there's nothing there to get in the way.

wrong. I deleted the brush but the bsp data was still there affecting the deintersect as if it were a brush.

;Moral of the story : It's best to do all your de/intersecting while you're building. cuz it's a pain in the ass to follow the rest of this section.

'''&amp;ndash;Monsto'''


See also [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] to [[Legacy:CSG|CSG]] for the basics of brushes &amp; geometry.

====If you have existing geometry that you want to clean up via de/intersect:====

# Save As a different filename. You're now dealing with a 'working' file and your actual map won't be dorked if you mess up here.
# select only the brushes that matter. . . the one to be fixed, and the ones it will be fixed with.
# click &quot;show only selected actors.&quot; It's the open-eye button with the dotted red box on the [[Legacy:Toolbar|toolbar]]
# go into the [[Legacy:Build Window|Build Window]], check the option for &quot;rebuild only visible actors&quot; and [[Legacy:Build|build]]. all views will show only what you're working on.
# fit the [[Legacy:Red Builder Brush|red builder brush]] to the brush you wanna fix (get a button to do this from http://www.planetunreal.com/fordy/uedbuttons.htm )
# delete the brush to be fixed (don't change this brush '''AT ALL''' or you'll be doomed)
# [[Legacy:Build|build]] again . . . in all views you should see the [[Legacy:Red Builder Brush|red builder brush]] in the place of the brush to be fixed, and also the other brushes you're working on.
# de/intersect
# [[Legacy:Subtraction And Addition|add/subtract]] your brush.
# save.

Do that for each brush.

==Comments ==

Just a forum snipe from tarquin:

:Intersection and deintersecting are used far too often. Use the grid &amp; good choice of initial dimensions to line up brushes perfectly. Int &amp; DeInt are really (IMO) just tools for brush shaping, not for ensuring clean joins. It's in fact fine to overlap subtracts, or have additives poke into solid space.

'''Bean:''' It's overused to an extent. Less brushes in a level = less rendering work. It's a no-brainer that combining  two brushes who vertices touch will reduce the amount of work the engine has to do on vertex calculations. But, there is a tradeoff when making complex brushes. The two combined brushes may cut into bsp less than the complex brush, the brush may be too detailed to be rendered efficiently, etc... It's all a matter of trial and error by using the zone portal view to view the bsp node cuts and using &quot;stat fps&quot; to see what reduces the node count. A lot of beginning and ignorant mappers combine brushes because they hear that it improves performance, when it's not always the case. (end rant :)

'''Tarquin:'''  &quot;combining  two brushes who vertices touch will reduce the amount of work the engine has to do on vertex calculations.&quot; &amp;ndash; IIRC, the vertices will still be there. If you have 2 box brushes side by side, delete one and enlarge the other with [[Legacy:Vertex Editing|vertex editing]]. Or delete both and make a new one.

'''scumble:''' Just a thought, but what about [http://udn.epicgames.com/Two/IntroToUnrealEd#Making_Additional_BSP_Brushes this note] at UDN? It suggests always doing an intersection before subtracting.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Introduction To Game AI</title>
    <id>1463</id>
    <revision>
      <id>3673</id>
      <timestamp>2008-03-15T19:52:38Z</timestamp>
      <contributor>
        <ip>Chello213047059068.25.11.vie.surfer.at</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Preliminary Remarks==

The field of game AI has existed since the creation of the earliest video games in the 1970's. The field is evolving rapidly, setting new standards for computer hardware engineering and establishing benchmarks for future game industry production. In the past few years, sophisticated game AIs that are more entertaining than simple video game AIs of the past have emerged and dominated the market. As 3D rendering hardware improves and as the high-resolution quality of game graphics have become the ''de facto'' industry standard, game AI has increasingly become one of the critical factors determining a game's success. Programmers dedicated to just game AI are now an integral part of the core design group. 

Programming game AI is one of the most challenging enhancements that a game developer can engineer; at the annual Game Developer Conference an increasing number of presentations are concerned with AI techniques. The real-time performance requirements of computer game AI and the demand for humanlike interactions, appropriate animation sequences, and internal state simulations for populations of scripted agents have impressively demonstrated the potential of academic AI research and game AI technologies.

The commercial success of licensed '''game engines''' like Unreal Tournament have inspired an entire genre of First Person Shooter designs that have incorporated increasingly sophisticated and expert agent behaviors in their productions. The bots of Epic Games' Unreal Tournament are well known for their scalability and tactical excellence. See, also, [[Legacy:Bot Support|Bot Support]]

Hardware performance capabilities and constraints have been a persistent bottleneck to the creation of advanced game AI. Real-time graphics rendering has traditionally been a huge CPU hog, leaving insignificant time and memory for game AI (and collision detection). Some fundamental AI problems, such as pathfinding, can't be solved without adequate processor resources. 

==Techniques and Principles of Game AI Design==

Game industry observers expect that the next revolution in game AI will be learning and agent adaptation. Developers have been pursuing and researching learning techniques. To be believable, the AI in a game must simulate cognition, sense the environment realistically, and act convincingly within that context. In defining game AI, the programmer will have to code agent activity and behavior so that characters appear intelligent and respond realistically to perceived conditions and situations.

Ironically, the simplest AI techniques &amp;ndash; finite-state machines, decision trees, and production rule systems &amp;ndash; have been most successfully used by the game AI community.

The following is a listing of AI techniques that are relevant to present and future game AI:
* '''Expert Systems''' An expert system represents expertise within a knowledge database and performs automated reasoning in response to a series of queries.
* '''Finite-State Machines''' Simple, rule-based systems in which a finite number of &quot;states&quot; are connected in a directed graph by &quot;transitions&quot; between states. Finite-State Machines are the most used software AI in the computer game industry. They are easy to program, simple to understand, and easy to debug.
* '''Production Systems''' Comprised of a database of associated rules. Rules are conditional program statements with consequent actions that are performed if the specified conditions are satisfied.
* '''Decision Trees''' Data structute created by an algorithm that outputs an activity decision based on automatic selection from input data and a static node tree.
* '''Case-Based Reasoning''' Analysis of set of inputs and comparison to a database of possible situations and advisable behavioral outputs. 
* '''Genetic Algorithms''' Genetic Programming techniques attempt to imitate the dynamics of macro-evolution by performing directed selection and modification on associations of programs, sub-routines, and assemblages of parameters. 
* '''Neural Networks''' Class of machine learning techniques based on the architecture of interconnected neural components of a network. Operates through repeatedly adjusting internal numeric parameters with the goal of optimizing response to a wide variety of circumstances.
* '''Fuzzy Logic''' Utilizes numeric values to represent a degree of order in specified relationships or phenomena. The technique allows for more expressive reasoning and greater subtlety and richness than traditional Boolean or Bayesian inference.

The most successful game AIs have emerged when developers clearly identified the specific subproblems that game agents would be engaged in, and designed algorithms to optimize AI responses to those situations. Essentially, game AI programmers attempt to design agents that exhibit appropriate behaviors,...which appear to players as context-dependent expertise.

==Recommended Technical References==

===Books===

[http://www.charlesriver.com/titles/aigames.html AI Game Programming Wisdom], 

Edited by Steve Rabin, Copyright 2002, by Charles River Media, Inc., 672 pages, with accompanying Source Code CD, $69.95 in U.S.

===Research Papers===

[http://ai.eecs.umich.edu/people/laird/papers/AAAI-00.pdf Human-Level AI's Killer Application, Interactive Computer Games]

[http://ai.eecs.umich.edu/people/laird/papers/GDC99.pdf Developing an Artificial Intelligence Engine]

==External Links==

===Game AI===

[http://aigamedev.com/ Game AI for Developers] at AiGameDev.com

[http://www.aiwisdom.com/ Collection of Game AI References]

[http://www.gameai.com/ Game Artificial Intelligence]

[http://www.gdmag.com/ Game Developer Magazine]

[http://www.gamedev.net/ GameDev.net (Game Developer Site)]

[http://ai-depot.com/ AI Depot - Knowledge Resources &amp; Games Oriented Features]

===General AI===

[http://www.cs.berkeley.edu/~russell/ai.html AI on the Web, Massive Acedemic Links Site, UC Berkeley Computer Science Division]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Edited and marked up.</text>
    </revision>
    <revision>
      <id>3674</id>
      <timestamp>2005-11-17T02:40:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Preliminary Remarks==

The field of game AI has existed since the creation of the earliest video games in the 1970's. The field is evolving rapidly, setting new standards for computer hardware engineering and establishing benchmarks for future game industry production. In the past few years, sophisticated game AIs that are more entertaining than simple video game AIs of the past have emerged and dominated the market. As 3D rendering hardware improves and as the high-resolution quality of game graphics have become the ''de facto'' industry standard, game AI has increasingly become one of the critical factors determining a game's success. Programmers dedicated to just game AI are now an integral part of the core design group. 

Programming game AI is one of the most challenging enhancements that a game developer can engineer; at the annual Game Developer Conference an increasing number of presentations are concerned with AI techniques. The real-time performance requirements of computer game AI and the demand for humanlike interactions, appropriate animation sequences, and internal state simulations for populations of scripted agents have impressively demonstrated the potential of academic AI research and game AI technologies.

The commercial success of licensed '''game engines''' like Unreal Tournament have inspired an entire genre of First Person Shooter designs that have incorporated increasingly sophisticated and expert agent behaviors in their productions. The bots of Epic Games' Unreal Tournament are well known for their scalability and tactical excellence. See, also, [[Legacy:Bot Support|Bot Support]]

Hardware performance capabilities and constraints have been a persistent bottleneck to the creation of advanced game AI. Real-time graphics rendering has traditionally been a huge CPU hog, leaving insignificant time and memory for game AI (and collision detection). Some fundamental AI problems, such as pathfinding, can't be solved without adequate processor resources. 

==Techniques and Principles of Game AI Design==

Game industry observers expect that the next revolution in game AI will be learning and agent adaptation. Developers have been pursuing and researching learning techniques. To be believable, the AI in a game must simulate cognition, sense the environment realistically, and act convincingly within that context. In defining game AI, the programmer will have to code agent activity and behavior so that characters appear intelligent and respond realistically to perceived conditions and situations.

Ironically, the simplest AI techniques &amp;ndash; finite-state machines, decision trees, and production rule systems &amp;ndash; have been most successfully used by the game AI community.

The following is a listing of AI techniques that are relevant to present and future game AI:
* '''Expert Systems''' An expert system represents expertise within a knowledge database and performs automated reasoning in response to a series of queries.
* '''Finite-State Machines''' Simple, rule-based systems in which a finite number of &quot;states&quot; are connected in a directed graph by &quot;transitions&quot; between states. Finite-State Machines are the most used software AI in the computer game industry. They are easy to program, simple to understand, and easy to debug.
* '''Production Systems''' Comprised of a database of associated rules. Rules are conditional program statements with consequent actions that are performed if the specified conditions are satisfied.
* '''Decision Trees''' Data structute created by an algorithm that outputs an activity decision based on automatic selection from input data and a static node tree.
* '''Case-Based Reasoning''' Analysis of set of inputs and comparison to a database of possible situations and advisable behavioral outputs. 
* '''Genetic Algorithms''' Genetic Programming techniques attempt to imitate the dynamics of macro-evolution by performing directed selection and modification on associations of programs, sub-routines, and assemblages of parameters. 
* '''Neural Networks''' Class of machine learning techniques based on the architecture of interconnected neural components of a network. Operates through repeatedly adjusting internal numeric parameters with the goal of optimizing response to a wide variety of circumstances.
* '''Fuzzy Logic''' Utilizes numeric values to represent a degree of order in specified relationships or phenomena. The technique allows for more expressive reasoning and greater subtlety and richness than traditional Boolean or Bayesian inference.

The most successful game AIs have emerged when developers clearly identified the specific subproblems that game agents would be engaged in, and designed algorithms to optimize AI responses to those situations. Essentially, game AI programmers attempt to design agents that exhibit appropriate behaviors,...which appear to players as context-dependent expertise.

==Recommended Technical References==

===Books===

[http://www.charlesriver.com/titles/aigames.html AI Game Programming Wisdom], 

Edited by Steve Rabin, Copyright 2002, by Charles River Media, Inc., 672 pages, with accompanying Source Code CD, $69.95 in U.S.

===Research Papers===

[http://ai.eecs.umich.edu/people/laird/papers/AAAI-00.pdf Human-Level AI's Killer Application, Interactive Computer Games]

[http://ai.eecs.umich.edu/people/laird/papers/GDC99.pdf Developing an Artificial Intelligence Engine]

==External Links==

===Game AI===

[http://www.aiwisdom.com/ Collection of Game AI References]

[http://www.gameai.com/ Game Artificial Intelligence]

[http://www.gdmag.com/ Game Developer Magazine]

[http://www.gamedev.net/ GameDev.net (Game Developer Site)]

[http://ai-depot.com/ AI Depot - Knowledge Resources &amp; Games Oriented Features]

===General AI===

[http://www.cs.berkeley.edu/~russell/ai.html AI on the Web, Massive Acedemic Links Site, UC Berkeley Computer Science Division]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Edited and marked up.</text>
    </revision>
    <revision>
      <id>43186</id>
      <timestamp>2010-05-04T11:03:04Z</timestamp>
      <contributor>
        <username>Marie101</username>
        <id>2132</id>
      </contributor>
      <text xml:space="preserve">==Preliminary Remarks==

The field of game AI has existed since the creation of the earliest video games in the 1970's. The field is evolving rapidly, setting new standards for computer hardware engineering and establishing benchmarks for future game industry production. In the past few years, sophisticated game AIs that are more entertaining than simple video game AIs of the past have emerged and dominated the market. As 3D rendering hardware improves and as the high-resolution quality of game graphics have become the ''de facto'' industry standard, game AI has increasingly become one of the critical factors determining a game's success. Programmers dedicated to just game AI are now an integral part of the core design group. 

Programming game AI is one of the most challenging enhancements that a game developer can engineer; at the annual Game Developer Conference an increasing number of presentations are concerned with AI techniques. The real-time performance requirements of computer game AI and the demand for humanlike interactions, appropriate animation sequences, and internal state simulations for populations of scripted agents have impressively demonstrated the potential of academic AI research and game AI technologies.

The commercial success of licensed '''game engines''' like Unreal Tournament have inspired an entire genre of First Person Shooter designs that have incorporated increasingly sophisticated and expert agent behaviors in their productions. The bots of Epic Games' Unreal Tournament are well known for their scalability and tactical excellence. See, also, [[Legacy:Bot Support|Bot Support]]

Hardware performance capabilities and constraints have been a persistent bottleneck to the creation of advanced game AI. Real-time graphics rendering has traditionally been a huge CPU hog, leaving insignificant time and memory for game AI (and collision detection). Some fundamental AI problems, such as pathfinding, can't be solved without adequate processor resources. 

==Techniques and Principles of Game AI Design==

Game industry observers expect that the next revolution in game AI will be learning and agent adaptation. Developers have been pursuing and researching learning techniques. To be believable, the AI in a game must simulate cognition, sense the environment realistically, and act convincingly within that context. In defining game AI, the programmer will have to code agent activity and behavior so that characters appear intelligent and respond realistically to perceived conditions and situations.

Ironically, the simplest AI techniques &amp;ndash; finite-state machines, decision trees, and production rule systems &amp;ndash; have been most successfully used by the game AI community.

The following is a listing of AI techniques that are relevant to present and future game AI:
* '''Expert Systems''' An expert system represents expertise within a knowledge database and performs automated reasoning in response to a series of queries.
* '''Finite-State Machines''' Simple, rule-based systems in which a finite number of &quot;states&quot; are connected in a directed graph by &quot;transitions&quot; between states. Finite-State Machines are the most used software AI in the computer game industry. They are easy to program, simple to understand, and easy to debug.
* '''Production Systems''' Comprised of a database of associated rules. Rules are conditional program statements with consequent actions that are performed if the specified conditions are satisfied.
* '''Decision Trees''' Data structute created by an algorithm that outputs an activity decision based on automatic selection from input data and a static node tree.
* '''Case-Based Reasoning''' Analysis of set of inputs and comparison to a database of possible situations and advisable behavioral outputs. 
* '''Genetic Algorithms''' Genetic Programming techniques attempt to imitate the dynamics of macro-evolution by performing directed selection and modification on associations of programs, sub-routines, and assemblages of parameters. 
* '''Neural Networks''' Class of machine learning techniques based on the architecture of interconnected neural components of a network. Operates through repeatedly adjusting internal numeric parameters with the goal of optimizing response to a wide variety of circumstances.
* '''Fuzzy Logic''' Utilizes numeric values to represent a degree of order in specified relationships or phenomena. The technique allows for more expressive reasoning and greater subtlety and richness than traditional Boolean or Bayesian inference.

The most successful game AIs have emerged when developers clearly identified the specific subproblems that game agents would be engaged in, and designed algorithms to optimize AI responses to those situations. Essentially, game AI programmers attempt to design agents that exhibit appropriate behaviors,...which appear to players as context-dependent expertise.

==Recommended Technical References==

===Books===

[http://www.charlesriver.com/titles/aigames.html AI Game Programming Wisdom], 

Edited by Steve Rabin, Copyright 2002, by Charles River Media, Inc., 672 pages, with accompanying Source Code CD, $69.95 in U.S.

===Research Papers===

[http://ai.eecs.umich.edu/people/laird/papers/AAAI-00.pdf Human-Level AI's Killer Application, Interactive Computer Games]

[http://ai.eecs.umich.edu/people/laird/papers/GDC99.pdf Developing an Artificial Intelligence Engine]

==External Links==
do you need a change in mood when it comes to going to another place? are you tired of watching those the same old beach, scenery, and places? try this one and you will never regret it. and you will come over and over again. this may help you in your needs, try to see this link!! 

Related Link:

[http://www.greatoceanroadtours.com.au/sites/default.asp '''great ocean road trips''']


===Game AI===

[http://aigamedev.com/ Game AI for Developers] at AiGameDev.com

[http://www.aiwisdom.com/ Collection of Game AI References]

[http://www.gameai.com/ Game Artificial Intelligence]

[http://www.gdmag.com/ Game Developer Magazine]

[http://www.gamedev.net/ GameDev.net (Game Developer Site)]

[http://ai-depot.com/ AI Depot - Knowledge Resources &amp; Games Oriented Features]

===General AI===

[http://www.cs.berkeley.edu/~russell/ai.html AI on the Web, Massive Acedemic Links Site, UC Berkeley Computer Science Division]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Edited and marked up.</text>
    </revision>
    <revision>
      <id>43187</id>
      <timestamp>2010-05-04T12:38:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Marie101|Marie101]] ([[User talk:Marie101|Talk]]) to last revision by [[User:Chello213047059068.25.11.vie.surfer.at|Chello213047059068.25.11.vie.surfer.at]]</comment>
      <text xml:space="preserve">==Preliminary Remarks==

The field of game AI has existed since the creation of the earliest video games in the 1970's. The field is evolving rapidly, setting new standards for computer hardware engineering and establishing benchmarks for future game industry production. In the past few years, sophisticated game AIs that are more entertaining than simple video game AIs of the past have emerged and dominated the market. As 3D rendering hardware improves and as the high-resolution quality of game graphics have become the ''de facto'' industry standard, game AI has increasingly become one of the critical factors determining a game's success. Programmers dedicated to just game AI are now an integral part of the core design group. 

Programming game AI is one of the most challenging enhancements that a game developer can engineer; at the annual Game Developer Conference an increasing number of presentations are concerned with AI techniques. The real-time performance requirements of computer game AI and the demand for humanlike interactions, appropriate animation sequences, and internal state simulations for populations of scripted agents have impressively demonstrated the potential of academic AI research and game AI technologies.

The commercial success of licensed '''game engines''' like Unreal Tournament have inspired an entire genre of First Person Shooter designs that have incorporated increasingly sophisticated and expert agent behaviors in their productions. The bots of Epic Games' Unreal Tournament are well known for their scalability and tactical excellence. See, also, [[Legacy:Bot Support|Bot Support]]

Hardware performance capabilities and constraints have been a persistent bottleneck to the creation of advanced game AI. Real-time graphics rendering has traditionally been a huge CPU hog, leaving insignificant time and memory for game AI (and collision detection). Some fundamental AI problems, such as pathfinding, can't be solved without adequate processor resources. 

==Techniques and Principles of Game AI Design==

Game industry observers expect that the next revolution in game AI will be learning and agent adaptation. Developers have been pursuing and researching learning techniques. To be believable, the AI in a game must simulate cognition, sense the environment realistically, and act convincingly within that context. In defining game AI, the programmer will have to code agent activity and behavior so that characters appear intelligent and respond realistically to perceived conditions and situations.

Ironically, the simplest AI techniques &amp;ndash; finite-state machines, decision trees, and production rule systems &amp;ndash; have been most successfully used by the game AI community.

The following is a listing of AI techniques that are relevant to present and future game AI:
* '''Expert Systems''' An expert system represents expertise within a knowledge database and performs automated reasoning in response to a series of queries.
* '''Finite-State Machines''' Simple, rule-based systems in which a finite number of &quot;states&quot; are connected in a directed graph by &quot;transitions&quot; between states. Finite-State Machines are the most used software AI in the computer game industry. They are easy to program, simple to understand, and easy to debug.
* '''Production Systems''' Comprised of a database of associated rules. Rules are conditional program statements with consequent actions that are performed if the specified conditions are satisfied.
* '''Decision Trees''' Data structute created by an algorithm that outputs an activity decision based on automatic selection from input data and a static node tree.
* '''Case-Based Reasoning''' Analysis of set of inputs and comparison to a database of possible situations and advisable behavioral outputs. 
* '''Genetic Algorithms''' Genetic Programming techniques attempt to imitate the dynamics of macro-evolution by performing directed selection and modification on associations of programs, sub-routines, and assemblages of parameters. 
* '''Neural Networks''' Class of machine learning techniques based on the architecture of interconnected neural components of a network. Operates through repeatedly adjusting internal numeric parameters with the goal of optimizing response to a wide variety of circumstances.
* '''Fuzzy Logic''' Utilizes numeric values to represent a degree of order in specified relationships or phenomena. The technique allows for more expressive reasoning and greater subtlety and richness than traditional Boolean or Bayesian inference.

The most successful game AIs have emerged when developers clearly identified the specific subproblems that game agents would be engaged in, and designed algorithms to optimize AI responses to those situations. Essentially, game AI programmers attempt to design agents that exhibit appropriate behaviors,...which appear to players as context-dependent expertise.

==Recommended Technical References==

===Books===

[http://www.charlesriver.com/titles/aigames.html AI Game Programming Wisdom], 

Edited by Steve Rabin, Copyright 2002, by Charles River Media, Inc., 672 pages, with accompanying Source Code CD, $69.95 in U.S.

===Research Papers===

[http://ai.eecs.umich.edu/people/laird/papers/AAAI-00.pdf Human-Level AI's Killer Application, Interactive Computer Games]

[http://ai.eecs.umich.edu/people/laird/papers/GDC99.pdf Developing an Artificial Intelligence Engine]

==External Links==

===Game AI===

[http://aigamedev.com/ Game AI for Developers] at AiGameDev.com

[http://www.aiwisdom.com/ Collection of Game AI References]

[http://www.gameai.com/ Game Artificial Intelligence]

[http://www.gdmag.com/ Game Developer Magazine]

[http://www.gamedev.net/ GameDev.net (Game Developer Site)]

[http://ai-depot.com/ AI Depot - Knowledge Resources &amp; Games Oriented Features]

===General AI===

[http://www.cs.berkeley.edu/~russell/ai.html AI on the Web, Massive Acedemic Links Site, UC Berkeley Computer Science Division]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Edited and marked up.</text>
    </revision>
    <revision>
      <id>43747</id>
      <timestamp>2010-07-29T01:59:36Z</timestamp>
      <contributor>
        <username>Verlyn</username>
        <id>2173</id>
      </contributor>
      <text xml:space="preserve">==Preliminary Remarks==

The field of game AI has existed since the creation of the earliest video games in the 1970's. The field is evolving rapidly, setting new standards for computer hardware engineering and establishing benchmarks for future game industry production. In the past few years, sophisticated game AIs that are more entertaining than simple video game AIs of the past have emerged and dominated the market. As 3D rendering hardware improves and as the high-resolution quality of game graphics have become the ''de facto'' industry standard, game AI has increasingly become one of the critical factors determining a game's success. Programmers dedicated to just game AI are now an integral part of the core design group. 

Programming game AI is one of the most challenging enhancements that a game developer can engineer; at the annual Game Developer Conference an increasing number of presentations are concerned with AI techniques. The real-time performance requirements of computer game AI and the demand for humanlike interactions, appropriate animation sequences, and internal state simulations for populations of scripted agents have impressively demonstrated the potential of academic AI research and game AI technologies.

The commercial success of licensed '''game engines''' like Unreal Tournament have inspired an entire genre of First Person Shooter designs that have incorporated increasingly sophisticated and expert agent behaviors in their productions. The bots of Epic Games' Unreal Tournament are well known for their scalability and tactical excellence. See, also, [[Legacy:Bot Support|Bot Support]]

Hardware performance capabilities and constraints have been a persistent bottleneck to the creation of advanced game AI. Real-time graphics rendering has traditionally been a huge CPU hog, leaving insignificant time and memory for game AI (and collision detection). Some fundamental AI problems, such as pathfinding, can't be solved without adequate processor resources. 

==Techniques and Principles of Game AI Design==

Game industry observers expect that the next revolution in game AI will be learning and agent adaptation. Developers have been pursuing and researching learning techniques. To be believable, the AI in a game must simulate cognition, sense the environment realistically, and act convincingly within that context. In defining game AI, the programmer will have to code agent activity and behavior so that characters appear intelligent and respond realistically to perceived conditions and situations.

Ironically, the simplest AI techniques &amp;ndash; finite-state machines, decision trees, and production rule systems &amp;ndash; have been most successfully used by the game AI community.

The following is a listing of AI techniques that are relevant to present and future game AI:
* '''Expert Systems''' An expert system represents expertise within a knowledge database and performs automated reasoning in response to a series of queries.
* '''Finite-State Machines''' Simple, rule-based systems in which a finite number of &quot;states&quot; are connected in a directed graph by &quot;transitions&quot; between states. Finite-State Machines are the most used software AI in the computer game industry. They are easy to program, simple to understand, and easy to debug.
* '''Production Systems''' Comprised of a database of associated rules. Rules are conditional program statements with consequent actions that are performed if the specified conditions are satisfied.
* '''Decision Trees''' Data structute created by an algorithm that outputs an activity decision based on automatic selection from input data and a static node tree.
* '''Case-Based Reasoning''' Analysis of set of inputs and comparison to a database of possible situations and advisable behavioral outputs. 
* '''Genetic Algorithms''' Genetic Programming techniques attempt to imitate the dynamics of macro-evolution by performing directed selection and modification on associations of programs, sub-routines, and assemblages of parameters. 
* '''Neural Networks''' Class of machine learning techniques based on the architecture of interconnected neural components of a network. Operates through repeatedly adjusting internal numeric parameters with the goal of optimizing response to a wide variety of circumstances.
* '''Fuzzy Logic''' Utilizes numeric values to represent a degree of order in specified relationships or phenomena. The technique allows for more expressive reasoning and greater subtlety and richness than traditional Boolean or Bayesian inference.

The most successful game AIs have emerged when developers clearly identified the specific subproblems that game agents would be engaged in, and designed ==Related Links==

[http://www.cellulite.co.uk/ '''cellulite'''] algorithms to optimize AI responses to those situations. Essentially, game AI programmers attempt to design agents that exhibit appropriate behaviors,...which appear to players as context-dependent expertise.

==Recommended Technical References==

===Books===

[http://www.charlesriver.com/titles/aigames.html AI Game Programming Wisdom], 

Edited by Steve Rabin, Copyright 2002, by Charles River Media, Inc., 672 pages, with accompanying Source Code CD, $69.95 in U.S.

===Research Papers===

[http://ai.eecs.umich.edu/people/laird/papers/AAAI-00.pdf Human-Level AI's Killer Application, Interactive Computer Games]

[http://ai.eecs.umich.edu/people/laird/papers/GDC99.pdf Developing an Artificial Intelligence Engine]

==External Links==

===Game AI===

[http://aigamedev.com/ Game AI for Developers] at AiGameDev.com

[http://www.aiwisdom.com/ Collection of Game AI References]

[http://www.gameai.com/ Game Artificial Intelligence]

[http://www.gdmag.com/ Game Developer Magazine]

[http://www.gamedev.net/ GameDev.net (Game Developer Site)]

[http://ai-depot.com/ AI Depot - Knowledge Resources &amp; Games Oriented Features]

===General AI===

[http://www.cs.berkeley.edu/~russell/ai.html AI on the Web, Massive Acedemic Links Site, UC Berkeley Computer Science Division]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Edited and marked up.</text>
    </revision>
    <revision>
      <id>43750</id>
      <timestamp>2010-07-29T14:00:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Verlyn|Verlyn]] ([[User talk:Verlyn|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">==Preliminary Remarks==

The field of game AI has existed since the creation of the earliest video games in the 1970's. The field is evolving rapidly, setting new standards for computer hardware engineering and establishing benchmarks for future game industry production. In the past few years, sophisticated game AIs that are more entertaining than simple video game AIs of the past have emerged and dominated the market. As 3D rendering hardware improves and as the high-resolution quality of game graphics have become the ''de facto'' industry standard, game AI has increasingly become one of the critical factors determining a game's success. Programmers dedicated to just game AI are now an integral part of the core design group. 

Programming game AI is one of the most challenging enhancements that a game developer can engineer; at the annual Game Developer Conference an increasing number of presentations are concerned with AI techniques. The real-time performance requirements of computer game AI and the demand for humanlike interactions, appropriate animation sequences, and internal state simulations for populations of scripted agents have impressively demonstrated the potential of academic AI research and game AI technologies.

The commercial success of licensed '''game engines''' like Unreal Tournament have inspired an entire genre of First Person Shooter designs that have incorporated increasingly sophisticated and expert agent behaviors in their productions. The bots of Epic Games' Unreal Tournament are well known for their scalability and tactical excellence. See, also, [[Legacy:Bot Support|Bot Support]]

Hardware performance capabilities and constraints have been a persistent bottleneck to the creation of advanced game AI. Real-time graphics rendering has traditionally been a huge CPU hog, leaving insignificant time and memory for game AI (and collision detection). Some fundamental AI problems, such as pathfinding, can't be solved without adequate processor resources. 

==Techniques and Principles of Game AI Design==

Game industry observers expect that the next revolution in game AI will be learning and agent adaptation. Developers have been pursuing and researching learning techniques. To be believable, the AI in a game must simulate cognition, sense the environment realistically, and act convincingly within that context. In defining game AI, the programmer will have to code agent activity and behavior so that characters appear intelligent and respond realistically to perceived conditions and situations.

Ironically, the simplest AI techniques &amp;ndash; finite-state machines, decision trees, and production rule systems &amp;ndash; have been most successfully used by the game AI community.

The following is a listing of AI techniques that are relevant to present and future game AI:
* '''Expert Systems''' An expert system represents expertise within a knowledge database and performs automated reasoning in response to a series of queries.
* '''Finite-State Machines''' Simple, rule-based systems in which a finite number of &quot;states&quot; are connected in a directed graph by &quot;transitions&quot; between states. Finite-State Machines are the most used software AI in the computer game industry. They are easy to program, simple to understand, and easy to debug.
* '''Production Systems''' Comprised of a database of associated rules. Rules are conditional program statements with consequent actions that are performed if the specified conditions are satisfied.
* '''Decision Trees''' Data structute created by an algorithm that outputs an activity decision based on automatic selection from input data and a static node tree.
* '''Case-Based Reasoning''' Analysis of set of inputs and comparison to a database of possible situations and advisable behavioral outputs. 
* '''Genetic Algorithms''' Genetic Programming techniques attempt to imitate the dynamics of macro-evolution by performing directed selection and modification on associations of programs, sub-routines, and assemblages of parameters. 
* '''Neural Networks''' Class of machine learning techniques based on the architecture of interconnected neural components of a network. Operates through repeatedly adjusting internal numeric parameters with the goal of optimizing response to a wide variety of circumstances.
* '''Fuzzy Logic''' Utilizes numeric values to represent a degree of order in specified relationships or phenomena. The technique allows for more expressive reasoning and greater subtlety and richness than traditional Boolean or Bayesian inference.

The most successful game AIs have emerged when developers clearly identified the specific subproblems that game agents would be engaged in, and designed algorithms to optimize AI responses to those situations. Essentially, game AI programmers attempt to design agents that exhibit appropriate behaviors,...which appear to players as context-dependent expertise.

==Recommended Technical References==

===Books===

[http://www.charlesriver.com/titles/aigames.html AI Game Programming Wisdom], 

Edited by Steve Rabin, Copyright 2002, by Charles River Media, Inc., 672 pages, with accompanying Source Code CD, $69.95 in U.S.

===Research Papers===

[http://ai.eecs.umich.edu/people/laird/papers/AAAI-00.pdf Human-Level AI's Killer Application, Interactive Computer Games]

[http://ai.eecs.umich.edu/people/laird/papers/GDC99.pdf Developing an Artificial Intelligence Engine]

==External Links==

===Game AI===

[http://aigamedev.com/ Game AI for Developers] at AiGameDev.com

[http://www.aiwisdom.com/ Collection of Game AI References]

[http://www.gameai.com/ Game Artificial Intelligence]

[http://www.gdmag.com/ Game Developer Magazine]

[http://www.gamedev.net/ GameDev.net (Game Developer Site)]

[http://ai-depot.com/ AI Depot - Knowledge Resources &amp; Games Oriented Features]

===General AI===

[http://www.cs.berkeley.edu/~russell/ai.html AI on the Web, Massive Acedemic Links Site, UC Berkeley Computer Science Division]

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, NPCs, etc)
* [[Legacy:First Person Shooter AI Architecture|First Person Shooter AI Architecture]]

==Discussion==

'''SuperApe:''' Edited and marked up.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Introduction To Maya</title>
    <id>1477</id>
    <revision>
      <id>3707</id>
      <timestamp>2006-05-22T22:39:16Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

What you need too know to proceed to the next tutorial:

*Maya runs only on NT kernel OSes i.e. NT/2000/XP
** Minimum Configuration 
** Read Instant Maya Chapter 1 and 2.
** Using Maya: Essentials
***Parts Chapter 1,2,3,4 9(Attribute Editor, Channel Editor, Outliner)- Have a basic Understanding of these.

==External Links==
* [http://www.tutorialized.com/tutorials/Maya/1 Alias/Wavefront Maya tutorials]
* [http://www.highend3d.com/maya/tutorials/ higend3d.com Maya tutorials]
* [http://www.learning-maya.com/index.php learning-maya.com Maya tutorials]
* [http://www.amazing3d.com/services/tutmaya.html amazing3d.com Maya tutorials]
* [http://www.tutorialfind.com/tutorials/3dsoftware/maya/ tutorialfind.com Maya tutorials]

==Related Topics==
* [[Legacy:Maya|Maya]]
* [[Legacy:Maya FAQ|Maya FAQ]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]
* [[Legacy:UnEditor.Mll|UnEditor.mll]]
* [[Legacy:Animation|Animation]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]
* [[Legacy:Importing Models From Maya|Importing Models from Maya]]

----

==Diuscussion==

'''Wormbo:''' I wouldn't call a page &quot;Introduction&quot;, this could be an introduction to anything. How about renaming it to &quot;Introduction to Maya&quot; ?

'''Mychaeel:''' What about Maya/Introduction (since there's already [[Legacy:Maya|Maya]] and [[Legacy:Maya/Discuss|Maya/Discuss]])?

'''AlphaOne:''' Does it mean that I cannot make models for UT2k3 on win ME/95????

'''Tarquin:''' AFAIK, yup, you can't make [[Legacy:Static Mesh|Static mesh]]es under Win9x. :(

'''Mychaeel:''' Okay.  &quot;Maya/Introduction&quot; is it then for this page?

'''Bjorn:''' You can of course make models under Win9x with other 3D modelling programs like [[Legacy:MilkShape|MilkShape]] and [[Legacy:3D Studio Max|3D Studio Max]].

'''Tarquin:''' What's wrong with this page.... not much of an introduction! I have just installed maya, and I want to know: HOW do I get a mesh from Maya into UEd???

'''sandorski:''' Hehe, Tarquin. You are right. Leveldesigner had a real nice Tut, but it's down now. :( At any rate, goto http://sv3.3dbuzz.com/vbforum/uunr_onlc.php and sign up for the Free Static Mesh Design course. It gives some basics for both 3DMax and Maya that'll get you started.

'''Tarquin:''' Those are video tutes, right? Down a modem!? Anyway, it looks like whoever started off this page here has vanished. Any info would be appreciated.

'''sandorski:''' A Modem? Ok, I hear a. To get started(assuming MayaPLE 5/UT2k4) Install Maya and the Plugin which will be in the same directory. Open Maya and in the Help menu there will be a UT2004 Export entry, click on it and it'll open up in your web browser(from Local location). It contains a number of steps you need to do to get things setup properly. Once that is done a Tab should appear(may require Maya restart)above the work areas called &quot;UnrealEdExport&quot;, clicking on it will open up 4 buttons, the first button(looks like a doorway)is for Exporting Static Meshes, the second for Skeletal Meshes(I assume for character Models), third to Connect to UnrealEd(if you set Autoconnect in the Plugin setup you won't need that button), fourth disconnect rom UEd. 

Basics: If you have a Polygonal Mesh created, before Export you need to Triangulate it(Polygons/Triangulate). If your Mesh is made of more than 1 objects, but you want them as 1 object, Combine them(Polygons/Combine)(Triangulate before Combine). Once those are complete you can now Select your Mesh and open the Export Window(doorway). Enter Package name(&quot;mylevel&quot; recommended), Group Name(if you want aka optional), and the Name for your Mesh(whatever you want). Assuming you have your Map loaded in UEd, opening the &quot;mylevel&quot;(or name you choose) in the Static Mesh browser should now contain your Mesh.

That is a very Basic description of it. If you are new to Static Mesh making, MayaPLE comes with an excellent set of Tutorials that leads you through the making of some models, they helped me a lot and I was/am a total noob at it. 

'''Tarquin:''' Aha... I found the details in Maya help that's installed along with Maya. In your Maya folder: docs/en_US/html/UT2003/index.html

'''SuperApe:''' Reliable links added to help find tutorials on Maya.</text>
    </revision>
    <revision>
      <id>3708</id>
      <timestamp>2006-05-19T09:32:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>reply</comment>
      <text xml:space="preserve">===Introduction===

What you need too know to proceed to the next tutorial:-
*Maya runs only on NT kernel OSes i.e. NT/2000/XP
** Minimum Configuration 
** Read Instant Maya Chapter 1 and 2.
** Using Maya: Essentials
***Parts Chapter 1,2,3,4 9(Attribute Editor, Channel Editor, Outliner)- Have a basic Understanding of these.

----

==Diuscussion==

'''Wormbo:''' I wouldn't call a page &quot;Introduction&quot;, this could be an introduction to anything. How about renaming it to &quot;Introduction to Maya&quot; ?

'''Mychaeel:''' What about Maya/Introduction (since there's already [[Legacy:Maya|Maya]] and [[Legacy:Maya/Discuss|Maya/Discuss]])?

'''AlphaOne:''' Does it mean that I cannot make models for UT2k3 on win ME/95????

'''Tarquin:''' AFAIK, yup, you can't make [[Legacy:Static Mesh|Static mesh]]es under Win9x. :(

'''Mychaeel:''' Okay.  &quot;Maya/Introduction&quot; is it then for this page?

'''Bjorn:''' You can of course make models under Win9x with other 3D modelling programs like [[Legacy:MilkShape|MilkShape]] and [[Legacy:3D Studio Max|3D Studio Max]].

'''Tarquin:''' What's wrong with this page.... not much of an introduction! I have just installed maya, and I want to know: HOW do I get a mesh from Maya into UEd???

'''sandorski:''' Hehe, Tarquin. You are right. Leveldesigner had a real nice Tut, but it's down now. :( At any rate, goto http://sv3.3dbuzz.com/vbforum/uunr_onlc.php and sign up for the Free Static Mesh Design course. It gives some basics for both 3DMax and Maya that'll get you started.

'''Tarquin:''' Those are video tutes, right? Down a modem!? Anyway, it looks like whoever started off this page here has vanished. Any info would be appreciated.

'''sandorski:''' A Modem? Ok, I hear a. To get started(assuming MayaPLE 5/UT2k4) Install Maya and the Plugin which will be in the same directory. Open Maya and in the Help menu there will be a UT2004 Export entry, click on it and it'll open up in your web browser(from Local location). It contains a number of steps you need to do to get things setup properly. Once that is done a Tab should appear(may require Maya restart)above the work areas called &quot;UnrealEdExport&quot;, clicking on it will open up 4 buttons, the first button(looks like a doorway)is for Exporting Static Meshes, the second for Skeletal Meshes(I assume for character Models), third to Connect to UnrealEd(if you set Autoconnect in the Plugin setup you won't need that button), fourth disconnect rom UEd. 

Basics: If you have a Polygonal Mesh created, before Export you need to Triangulate it(Polygons/Triangulate). If your Mesh is made of more than 1 objects, but you want them as 1 object, Combine them(Polygons/Combine)(Triangulate before Combine). Once those are complete you can now Select your Mesh and open the Export Window(doorway). Enter Package name(&quot;mylevel&quot; recommended), Group Name(if you want aka optional), and the Name for your Mesh(whatever you want). Assuming you have your Map loaded in UEd, opening the &quot;mylevel&quot;(or name you choose) in the Static Mesh browser should now contain your Mesh.

That is a very Basic description of it. If you are new to Static Mesh making, MayaPLE comes with an excellent set of Tutorials that leads you through the making of some models, they helped me a lot and I was/am a total noob at it. 

'''Tarquin:''' Aha... I found the details in Maya help that's installed along with Maya. In your Maya folder: docs/en_US/html/UT2003/index.html</text>
    </revision>
    <revision>
      <id>3709</id>
      <timestamp>2006-05-19T09:33:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>reply &amp; link</comment>
      <text xml:space="preserve">==Introduction==

What you need too know to proceed to the next tutorial:

*Maya runs only on NT kernel OSes i.e. NT/2000/XP
** Minimum Configuration 
** Read Instant Maya Chapter 1 and 2.
** Using Maya: Essentials
***Parts Chapter 1,2,3,4 9(Attribute Editor, Channel Editor, Outliner)- Have a basic Understanding of these.

==Related Topics==

* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

----

==Diuscussion==

'''Wormbo:''' I wouldn't call a page &quot;Introduction&quot;, this could be an introduction to anything. How about renaming it to &quot;Introduction to Maya&quot; ?

'''Mychaeel:''' What about Maya/Introduction (since there's already [[Legacy:Maya|Maya]] and [[Legacy:Maya/Discuss|Maya/Discuss]])?

'''AlphaOne:''' Does it mean that I cannot make models for UT2k3 on win ME/95????

'''Tarquin:''' AFAIK, yup, you can't make [[Legacy:Static Mesh|Static mesh]]es under Win9x. :(

'''Mychaeel:''' Okay.  &quot;Maya/Introduction&quot; is it then for this page?

'''Bjorn:''' You can of course make models under Win9x with other 3D modelling programs like [[Legacy:MilkShape|MilkShape]] and [[Legacy:3D Studio Max|3D Studio Max]].

'''Tarquin:''' What's wrong with this page.... not much of an introduction! I have just installed maya, and I want to know: HOW do I get a mesh from Maya into UEd???

'''sandorski:''' Hehe, Tarquin. You are right. Leveldesigner had a real nice Tut, but it's down now. :( At any rate, goto http://sv3.3dbuzz.com/vbforum/uunr_onlc.php and sign up for the Free Static Mesh Design course. It gives some basics for both 3DMax and Maya that'll get you started.

'''Tarquin:''' Those are video tutes, right? Down a modem!? Anyway, it looks like whoever started off this page here has vanished. Any info would be appreciated.

'''sandorski:''' A Modem? Ok, I hear a. To get started(assuming MayaPLE 5/UT2k4) Install Maya and the Plugin which will be in the same directory. Open Maya and in the Help menu there will be a UT2004 Export entry, click on it and it'll open up in your web browser(from Local location). It contains a number of steps you need to do to get things setup properly. Once that is done a Tab should appear(may require Maya restart)above the work areas called &quot;UnrealEdExport&quot;, clicking on it will open up 4 buttons, the first button(looks like a doorway)is for Exporting Static Meshes, the second for Skeletal Meshes(I assume for character Models), third to Connect to UnrealEd(if you set Autoconnect in the Plugin setup you won't need that button), fourth disconnect rom UEd. 

Basics: If you have a Polygonal Mesh created, before Export you need to Triangulate it(Polygons/Triangulate). If your Mesh is made of more than 1 objects, but you want them as 1 object, Combine them(Polygons/Combine)(Triangulate before Combine). Once those are complete you can now Select your Mesh and open the Export Window(doorway). Enter Package name(&quot;mylevel&quot; recommended), Group Name(if you want aka optional), and the Name for your Mesh(whatever you want). Assuming you have your Map loaded in UEd, opening the &quot;mylevel&quot;(or name you choose) in the Static Mesh browser should now contain your Mesh.

That is a very Basic description of it. If you are new to Static Mesh making, MayaPLE comes with an excellent set of Tutorials that leads you through the making of some models, they helped me a lot and I was/am a total noob at it. 

'''Tarquin:''' Aha... I found the details in Maya help that's installed along with Maya. In your Maya folder: docs/en_US/html/UT2003/index.html</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Introduction To Replication</title>
    <id>1509</id>
    <revision>
      <id>3777</id>
      <timestamp>2008-03-25T19:53:54Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What is replication?==

Put simply, replication is a way of making best use of limited bandwidth in a network game. The [[Legacy:Replication|replication]] page has a more in-depth exposition of the concept &amp;ndash; but if you're completely new to it, it's likely you'll make a few false assumptions...

==The Myths of replication==

If you've read a few documents on replication and looked at the nuts and bolts of it &amp;ndash; the [[Legacy:UnrealScript|UnrealScript]] keywords and variables that are involved &amp;ndash; then there is a very good chance you've fallen into some commmon traps. 

# Having read basic replication docs, you might have imagined that clients did their own thing, more or less running a duplicate of the game and occasionally exchanging data to keep things tied together.  '''The truth is: Clients do mostly nothing.'''

# You might think that a function marked as &quot;simulated&quot; is made to run on clients when it runs on the server. Not so &amp;ndash; the &quot;simulated&quot; keyword doesn't mean that when something happens on the server, it also makes it happen on the client. '''The truth is: The server doesn't cause clients to simulate simulated functions.'''

# The &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. 

We'll be looking into these in more detail throughout the tutorials.

==Why you need it==

Why would you need replication anyway? The dedicated server has all information of all the clients (that's why the server is so called &quot;authority&quot;) regarding gameflow and making decisions (eg does the player has the correct key to open a door, if yes, issue the open-door-command on the door object) the server can decide everything by itself only. 

So when is replication (or simulation) really needed and is something you should take care of?

; When it's not already taking care of by the Epic code. : '''Example:''' I change the actor location by a server running code only, and the new actor position is automatically replicated by the Epic code (so this is more a negative example &amp;ndash; you dont need to handle replication in this case since Epic does it already for you).

; When it's something '''''visible''''' the client has to display/render. Imagine the player's computer just as a visual frontend, not more! : '''Example:''' I want to have some &quot;Weapon overheat function&quot;, so the temperature is somehow calulated and the rounds shot are taking into account. This is purely server side &amp;ndash; no calculation needed on the client. When overheated, I want the weapon to glow red. &quot;Red glow info&quot; is visible to the player and has to be replicated to the client (since Epic is not already doing it for me).

; When you want to minimize communication between the server and the client. : '''Example:''' A simple projectile moves in a straight line with a fixed velocity until it hits level geometry.  That's predictable movement, and there's no point in having the server send constant location updates to the clients; so I just set the starting location, direction and velocity of the projectile and let the client simulate the movement by itself from there on.  (Actually, virtually all of the game's projectiles are done that way, even those with more complicated movement trajectories such as the Flak secondary fire.)

So you have only to consider replication in the second and third case &amp;ndash; the second in order to display something on the clientside which is not already covered by the epic code (something new!), and the third to cleverly reduce network load. Generally &amp;ndash; if five percent of you code will handle with replication I would consider it much. 

==Multiple copies==

In a network game of UT, there are several machines involved. Simplifying a little, these are servers and clients. Each machine has it's own actors, and each actor exists on a particular machine.

This means that an actor such as a player is actually multiple actors, one on each machine. These multiple copies know that they correspond to one another. How they exchange information to make sure they keep in sync is the basic idea of replication.

However, client versions generally don't do much (First Myth). Furthermore, you the programmer don't really have access to the heart of replication. You can't say in UnrealScript: &quot;send this piece of information across the network now&quot;. 

Replication is rather like having a number of islands and some bottles to send messages between them. You tell the engine it should try to keep certain things in sync, and it will work the bottles and do its best &amp;ndash; but there are no guarantees. You don't know how many bottles there are or when they are sent out, or when they are received.

==The methods of replication==

So now you know that clients do nothing (First Myth), the question is: how do you actually make them do ''something''?

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;reliable if (Role == ROLE_Authority)&lt;/code&gt;, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



==Next Step==

The next tutorial is the [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]] actor.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]
* [[Legacy:Replication Examples|Replication Examples]]

==Planning==
*We should have examples of the following:
** actors that exist on the server only
** actors that exist on the server and clients
** actors that are spawned clientside only
** actors that are spawned on owning clients only

*We should also give examples of how to:
** call a function on the server from a client via function replication
** call a function on an owning client via function replication
** trigger function calls on clients with PostNetReceive()

==Discussion==

'''Tarquin:''' I would really like a basic tutorial on replication: maybe something like a Trigger actor that does something to all players when touched.

'''NickR:''' I wouldn't mind some small replication examples just showing one type replication related code. Like when the simulated key word should be used or if static functions can be called from either the client or server and run on either.

'''VitalOverdose''' I think the ONSMineProjectile is a very good example for replication.

'''Foxpaw:''' I'm not sure about tutorials, but those are (fairly) easily explained. Simulated functions run on actors with ROLE_SimulatedProxy or better. However, only if they are called from another simulated function. Entry points like Tick can be declared as simulated when you override them to facilitate this. A short example:

&lt;uscript&gt;
simulated function Tick( float Delta )
{
  Super.Tick( Delta );

  DoStuffOnServerOnly();
  DoStuffOnBoth();
}

// Called from a simulated function, but not simulated itself,
// the engine skips over this function on clients. (or rather,
// the non-authority version, which is usually the client)
function DoStuffOnServerOnly()
{
  DoStuffOnClient();
}

// A simulated function getting called from another simulated
// function. This gets called on both machines.
simulated function DoStuffOnBoth()
{
}

// Oops! This is a simulated function, but gets called from a
// non-simulated function, so although it COULD run on a client
// (because it's simulated) the code that calls it doesn't run
// on the client and so this won't ever get called.
simulated function DoStuffOnClient()
{
}
&lt;/uscript&gt;

Static functions on the other hand, have no relation to replication and are functions that exist outside the context of an object. Static functions can't get replicated, obviously, because they aren't associated with any particular instance of an object. They can access only default variables and stuff. See [[Legacy:Static Function|Static Function]] and [[Legacy:Simulated Function|Simulated Function]].

Also, feel free to refactor this somewhere or expand it into a full tutorial.. it's more a demonstration at the moment.

'''Tarquin:''' Thanks... but see, you've alreayd lost RepliN00bs with this: '' run on actors with ROLE_SimulatedProxy or better''.... how does Replication actually WORK? Should we imagine multiple facets of the same actor on different machines, or many actors on different machines that somehow correspond to each other?

'''Foxpaw:''' Well, they're different actors, but they have a unique identifier so they &quot;correspond&quot; to each other. An actors Role variable determines it's replication behaviour. ROLE_Authority is usually the one on the server, and it runs all functions, simulated or not. ROLE_SimulatedProxy is usually on the client, and runs only simulated functions. ROLE_DumbProxy runs no functions, but still replicates variables. ROLE_None replicates nothing.

'''Tarquin:''' I simply don't understand how to visualize what is going on with replication. I'm used to thinking of an actor as a script that is running. How do I think of a replicated actor? Two scripts in tandem? How? Take something like this:

&lt;uscript&gt;
replication
{
  reliable if (Role == ROLE_Authority)
    Foo, Bar;
}
&lt;/uscript&gt;

What is this an instruction to? When is this parsed? What does it cause to happen?

'''Mychaeel:''' The engine executes the condition in this statement at its own discretion.  It's not clearly specified ''when'' that happens; the documentation only says ''that'' it happens, and that it happens frequently.

Each machine in a network game for which an actor is &quot;relevant&quot; has a copy of that actor.  For simplicity, let's assume a single client here &amp;ndash; the server spawns the actor, and the server engine tells the client that there's a new actor around.  So we have two copies of the same actor:  One on the server, and one on the client.  The engines of both machines know that those two copies correspond to each other, but by itself that doesn't mean a lot &amp;ndash; specifically, it doesn't mean that the client copy is automatically kept in sync with the server copy.

Apart from that, nothing special happens.  The server copy runs its events and other code, and the client copy just sits there, doing nothing.  There are, however, several ways to ''make'' the client copy do something:

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; above, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



So, the server and client copies of the same actor are basically independent entities &amp;ndash; but you can use the techniques explained above to keep them in sync on both machines.

'''Tarquin:''' This is starting to make sense! When you say &quot;does nothing&quot; &amp;ndash; even if affected by other actors? If I have a player and a trigger, when the player touches the trigger, nothing happens on the client actors, only on the server?

2nd question: is there a way for the server actor to make something happen on the client actor?

'''Mychaeel:''' &quot;Nothing&quot; means &quot;nothing.&quot;  A server-side trigger will only trigger server-side; plus, only code within a simulated function or simulated state ''can'' (or from the engine's point of view: ''may'') be executed client-side at all (but it's a common misconception that making a function &quot;simulated&quot; will magically execute it client-side &amp;ndash; there's no such magic, unless that function happens to be an engine event ''and'' that event is caused client-side).

Virtually all interaction between actors happens purely server-side, with the client copy being hardly ever any more than just a visual representation of the server copy.

And actually most of what I wrote above is about how the server actor can make something happen on the client actor &amp;ndash; starting from &quot;There are, however&quot;...

'''Tarquin:''' Based on what I now know, I can identify two major newbie mistakes in understanding replication:
# the &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. Not sure if that makes sense, but I found out I've been completely misreading the meaning of that.
# clients do mostly nothing. Having read basic replication docs, I imagined that clients did their own thing, more or less running a duplicate of the game and occasionally echanging data to keep things tied together.

I made a simple map with a [[Legacy:Trigger|Trigger]] to test something for Jailbreak, and I ran it as a netgame. The Trigger actor, that's I'd set bHidden=False on, wasn't visible when I played. Am I right in thinking that the Trigger ''wasn't even there'' on the client?

Given this, could someone with knowlegde of replication conceive of a simple situation where an actor such as a Trigger or Keypoint class might require some replication, and I'll see if I can write a tutorial on it?

'''Mychaeel:''' Yes, you're right &amp;ndash; the Trigger wasn't even there on the clients.  (You have to set bNoDelete=True to prevent the engine from discarding it on clients after it was loaded with the map file; or bAlwaysRelevant=True to have the server replicate it to all clients again after the map was loaded.  But since a Trigger is only acting server-side anyway, neither of those options makes sense in this context.)

'''Tarquin:''' Do we have a reference page of events that can be used as simulated? Are they the ones markes as [event] on [[Legacy:Actor/Methods|Actor/Methods]]?

'''Mychaeel:''' The important difference between &quot;event function&quot; and &quot;normal function&quot; here is only that an event is automatically called by the engine.  Just think about it &amp;ndash; any function that's called directly by engine code qualifies, starting from PreBeginPlay over Tick and Timer to Destroyed... and any other, self-defined function doesn't (like MyOwnFunction or CanBeJailed).

'''Tarquin:''' How do you spawn an actor only on a client, or only on a particular client? Is this possible? I think the 3rd newbie mistake is supposing that the ways in which you can pass information from server to client are not as restricted as they are.

'''Mychaeel:''' To spawn an actor only on a (particular) client... just do so.  :-)  You can't directly initiate that from a server (as in &quot;server, tell client XY to spawn this actor&quot;); but you can spawn it directly from client-side code on that particular client.

'''Tarquin:''' For the first tutorial, I think I'll do a Volume that destroys incoming projectiles. It's fairly simple, but exposes some important concepts (I think... if I've got it right...). Work in progress: [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]]. And I'll be cleaning up this page too ....

'''Lilguy:''' Hey, I just added a bit, hope it's alright. since the &quot;myths&quot; section listed a bunch of facts, not myths, I changed it to &quot;some facts of replication.&quot; I also made a little list of examples we should make that would be helpful. Most of them could probably be copied and pasted from Epic's code, but we could make some simple examples of each one too.

'''Tarquin:''' Hmm... well, I like the title so I've put it back, but you are quite right, I wrote them as facts, which could be very confusing. I have rephrased the first two &amp;ndash; is that better?  I'm working on the first tutorial in the series. I think the 2nd one should involve the replication block with a replicated variable, somehow &amp;ndash; but I don't know what sort of example would be good. After that, I have no idea... :)

'''Lilguy:'''Heh, sorry 'bout that, I had actually kinda liked the title too. That'll do fine...&lt;br /&gt;Perhaps for the second example, there could be some sort of street light or something, with 2 alternate textures that randomly switch back and forth at random intervals. They would only do this if the light was in &quot;damaged mode&quot; which would be signaled by bDamaged, a reliably replicated variable. I guess maybe I should stop talking and start coding, lol.

'''Foxpaw:''' I have to disagree with the assertion that clients do mostly nothing. Clients handle physics just like the server. In UT2003, some actors are handled almost entirely client-side. (general projectiles, for instance, are handled almost entirely client side, with the exception being the actual application of damage.) An efficient replication system should have nearly everything handled client side, with only critical values replicated.

'''Lilguy:''' Yeah, I kind of agree there. SimulatedProxy actors are given an initial physical state, then they're only updated periodically to make sure everything matches up. And there are a lot of clientside only actors, such as almost all emitter effects, the hud, interactions, etc. Perhaps it could be ammended to say that clients are in charge of almost nothing, since the server is usually the ultimate authority on the state of actors that exist on the client and actors. It's really best to always think about this when you're coding, and keep in mind what code should be running on the server, and what should be running on the client, and to program it likewise.

'''Tarquin:''' I think the point is that clients will do nothing unless told to. Using &quot;SimulatedProxy&quot; is telling it. A &quot;client-side effect&quot; has to be MADE to be client-side.

'''Andreas:''' Catching up with replication - I would like to add some more basic ideas to replication? 

'''Tarquin:''' inserted at the top :) BTW, please review [[Legacy:Wiki Markup|Wiki markup]] :) 

'''Andreas:''' thanks for layouting - reading it the example 1 was not that clear - tried to clarify it a bit. Maybe the link

http://unreal.epicgames.com/Network.htm could be included - it helped me quite a bit.

'''Legal:''' Threadmode anyone? This page needs some cleaning up, perhaps a Refractor Me tag would be in order? Also, to add to the discussion, coders need to make sure as much as possible is done client side and with as little code as possible. Some mods which could have impressed requires so much bandwidth that few people get ping over 200.

'''Andreas:''' Im not a wikiexpert (due to limited sparetime I have) - but if it improves - sure - I agree. I disagree on doing everything clientside - the goal of writing a program using replication is to minimise networktraffic. So the server would be my first place (assuming it has enough cpu power) since 1. it has a complete view of the game-status and 2. epic did already implement &quot;clever&quot; methods to reduce the network load (by not updating clients with data they dont need anyways, since they cannot see the actor and so on) I would not want to reinvent. As a coder I would ask me what tasks have to be done (see weapon overheat example), and where I can split server/client in order to minimize communciation. There is no way around updating the client as far it considers visual informations - the client '''is''' the visual frontend - but upon everything else the coder is free to decide where to perform the tasks. 

'''Andreas:''' To add, replication (especially simulated functions running on the client) might be usefull when someone wants to give clients different views or play different sounds locally.

'''FatalOverdose:''' In the first few paragraphs you say 'The truth is: Clients do mostly nothing.' and then a little further down you have 'However, client versions generally don't do much (First Myth).'

. its a bit confusing 

'''Solid Snake:''' This was asked by Mychaeel a long time ago, so I've converted my post into a wiki page, found here [[Legacy:Solid_Snake/A_Study_Of_Replication|A Study Of Replication]]

'''Tarquin:''' I think a simple tutorial would be fixing the example on [[Legacy:Using LocalMessages|Using LocalMessages]] to broadcast the message so clients can see it. Can anyone help me by suggesting how it might be done?

'''Ransico:''' Something that has bothered me for a long time, is there is no info on how to get something to run properly on -only- the client... for example, I was stuck on how to get a custom LOD actor working. The issue I had, was that the tick and timer events would never get called on the client.

The fix turned out to be that the client was deleting the object soon after its creation on the client, no matter what combo of defaultproperty switches I used.

There may be a better way to do it, but I set bNoDelete=true and it solved my problem. The entire source can be found here - someone else may find it useful, it also tells you how to make something run on the client: [[Legacy:Ransico/LODMesh|Ransico/LODMesh]]

'''Vitaloverdose:''' The page is called 'introduction to replication' so it was the first document i read on the subject but it begins with &quot;If you've read a few documents on replication&quot;. Maybe the 'myths of replication' bit might be better off further into the page or as part of a summery as its not introducing the subject so much as reviewing it.Im sure the page is very helpfull for the reader with prior knowledge of the subject but could be very confusing/unhelpful to anyone looking into the issue for the first time as it is referrencing aspects of replication that havent been explained at this point. 

'''Kiff:''' I attempted making a tutorial for function calls using PostNetReceive. It might be a little cluttered, so feel free to make suggestions and/or corrections. [[Legacy:Kiff|Kiff]]

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Work to organize according to [[Legacy:Replication/Discussing|Replication/Discussing]].
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3778</id>
      <timestamp>2006-08-31T03:15:42Z</timestamp>
      <contributor>
        <ip>84-45-226-149.no-dns-yet.enta.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What is replication?==

Put simply, replication is a way of making best use of limited bandwidth in a network game. The [[Legacy:Replication|replication]] page has a more in-depth exposition of the concept &amp;ndash; but if you're completely new to it, it's likely you'll make a few false assumptions...

==The Myths of replication==

If you've read a few documents on replication and looked at the nuts and bolts of it &amp;ndash; the [[Legacy:UnrealScript|UnrealScript]] keywords and variables that are involved &amp;ndash; then there is a very good chance you've fallen into some commmon traps. 

# Having read basic replication docs, you might have imagined that clients did their own thing, more or less running a duplicate of the game and occasionally exchanging data to keep things tied together.  '''The truth is: Clients do mostly nothing.'''

# You might think that a function marked as &quot;simulated&quot; is made to run on clients when it runs on the server. Not so &amp;ndash; the &quot;simulated&quot; keyword doesn't mean that when something happens on the server, it also makes it happen on the client. '''The truth is: The server doesn't cause clients to simulate simulated functions.'''

# The &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. 

We'll be looking into these in more detail throughout the tutorials.

==Why you need it==

Why would you need replication anyway? The dedicated server has all information of all the clients (that's why the server is so called &quot;authority&quot;) regarding gameflow and making decisions (eg does the player has the correct key to open a door, if yes, issue the open-door-command on the door object) the server can decide everything by itself only. 

So when is replication (or simulation) really needed and is something you should take care of?

; When it's not already taking care of by the Epic code. : '''Example:''' I change the actor location by a server running code only, and the new actor position is automatically replicated by the Epic code (so this is more a negative example &amp;ndash; you dont need to handle replication in this case since Epic does it already for you).

; When it's something '''''visible''''' the client has to display/render. Imagine the player's computer just as a visual frontend, not more! : '''Example:''' I want to have some &quot;Weapon overheat function&quot;, so the temperature is somehow calulated and the rounds shot are taking into account. This is purely server side &amp;ndash; no calculation needed on the client. When overheated, I want the weapon to glow red. &quot;Red glow info&quot; is visible to the player and has to be replicated to the client (since Epic is not already doing it for me).

; When you want to minimize communication between the server and the client. : '''Example:''' A simple projectile moves in a straight line with a fixed velocity until it hits level geometry.  That's predictable movement, and there's no point in having the server send constant location updates to the clients; so I just set the starting location, direction and velocity of the projectile and let the client simulate the movement by itself from there on.  (Actually, virtually all of the game's projectiles are done that way, even those with more complicated movement trajectories such as the Flak secondary fire.)

So you have only to consider replication in the second and third case &amp;ndash; the second in order to display something on the clientside which is not already covered by the epic code (something new!), and the third to cleverly reduce network load. Generally &amp;ndash; if five percent of you code will handle with replication I would consider it much. 

==Multiple copies==

In a network game of UT, there are several machines involved. Simplifying a little, these are servers and clients. Each machine has it's own actors, and each actor exists on a particular machine.

This means that an actor such as a player is actually multiple actors, one on each machine. These multiple copies know that they correspond to one another. How they exchange information to make sure they keep in sync is the basic idea of replication.

However, client versions generally don't do much (First Myth). Furthermore, you the programmer don't really have access to the heart of replication. You can't say in UnrealScript: &quot;send this piece of information across the network now&quot;. 

Replication is rather like having a number of islands and some bottles to send messages between them. You tell the engine it should try to keep certain things in sync, and it will work the bottles and do its best &amp;ndash; but there are no guarantees. You don't know how many bottles there are or when they are sent out, or when they are received.

==The methods of replication==

So now you know that clients do nothing (First Myth), the question is: how do you actually make them do ''something''?

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;reliable if (Role == ROLE_Authority)&lt;/code&gt;, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



==Next Step==

The next tutorial is the [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]] actor.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]

==Planning==
*We should have examples of the following:
** actors that exist on the server only
** actors that exist on the server and clients
** actors that are spawned clientside only
** actors that are spawned on owning clients only

*We should also give examples of how to:
** call a function on the server from a client via function replication
** call a function on an owning client via function replication
** trigger function calls on clients with PostNetReceive()

==Discussion==

'''Tarquin:''' I would really like a basic tutorial on replication: maybe something like a Trigger actor that does something to all players when touched.

'''NickR:''' I wouldn't mind some small replication examples just showing one type replication related code. Like when the simulated key word should be used or if static functions can be called from either the client or server and run on either.

'''VitalOverdose''' I think the ONSMineProjectile is a very good example for replication.

'''Foxpaw:''' I'm not sure about tutorials, but those are (fairly) easily explained. Simulated functions run on actors with ROLE_SimulatedProxy or better. However, only if they are called from another simulated function. Entry points like Tick can be declared as simulated when you override them to facilitate this. A short example:

&lt;uscript&gt;
simulated function Tick( float Delta )
{
  Super.Tick( Delta );

  DoStuffOnServerOnly();
  DoStuffOnBoth();
}

// Called from a simulated function, but not simulated itself,
// the engine skips over this function on clients. (or rather,
// the non-authority version, which is usually the client)
function DoStuffOnServerOnly()
{
  DoStuffOnClient();
}

// A simulated function getting called from another simulated
// function. This gets called on both machines.
simulated function DoStuffOnBoth()
{
}

// Oops! This is a simulated function, but gets called from a
// non-simulated function, so although it COULD run on a client
// (because it's simulated) the code that calls it doesn't run
// on the client and so this won't ever get called.
simulated function DoStuffOnClient()
{
}
&lt;/uscript&gt;

Static functions on the other hand, have no relation to replication and are functions that exist outside the context of an object. Static functions can't get replicated, obviously, because they aren't associated with any particular instance of an object. They can access only default variables and stuff. See [[Legacy:Static Function|Static Function]] and [[Legacy:Simulated Function|Simulated Function]].

Also, feel free to refactor this somewhere or expand it into a full tutorial.. it's more a demonstration at the moment.

'''Tarquin:''' Thanks... but see, you've alreayd lost RepliN00bs with this: '' run on actors with ROLE_SimulatedProxy or better''.... how does Replication actually WORK? Should we imagine multiple facets of the same actor on different machines, or many actors on different machines that somehow correspond to each other?

'''Foxpaw:''' Well, they're different actors, but they have a unique identifier so they &quot;correspond&quot; to each other. An actors Role variable determines it's replication behaviour. ROLE_Authority is usually the one on the server, and it runs all functions, simulated or not. ROLE_SimulatedProxy is usually on the client, and runs only simulated functions. ROLE_DumbProxy runs no functions, but still replicates variables. ROLE_None replicates nothing.

'''Tarquin:''' I simply don't understand how to visualize what is going on with replication. I'm used to thinking of an actor as a script that is running. How do I think of a replicated actor? Two scripts in tandem? How? Take something like this:

&lt;uscript&gt;
replication
{
  reliable if (Role == ROLE_Authority)
    Foo, Bar;
}
&lt;/uscript&gt;

What is this an instruction to? When is this parsed? What does it cause to happen?

'''Mychaeel:''' The engine executes the condition in this statement at its own discretion.  It's not clearly specified ''when'' that happens; the documentation only says ''that'' it happens, and that it happens frequently.

Each machine in a network game for which an actor is &quot;relevant&quot; has a copy of that actor.  For simplicity, let's assume a single client here &amp;ndash; the server spawns the actor, and the server engine tells the client that there's a new actor around.  So we have two copies of the same actor:  One on the server, and one on the client.  The engines of both machines know that those two copies correspond to each other, but by itself that doesn't mean a lot &amp;ndash; specifically, it doesn't mean that the client copy is automatically kept in sync with the server copy.

Apart from that, nothing special happens.  The server copy runs its events and other code, and the client copy just sits there, doing nothing.  There are, however, several ways to ''make'' the client copy do something:

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; above, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



So, the server and client copies of the same actor are basically independent entities &amp;ndash; but you can use the techniques explained above to keep them in sync on both machines.

'''Tarquin:''' This is starting to make sense! When you say &quot;does nothing&quot; &amp;ndash; even if affected by other actors? If I have a player and a trigger, when the player touches the trigger, nothing happens on the client actors, only on the server?

2nd question: is there a way for the server actor to make something happen on the client actor?

'''Mychaeel:''' &quot;Nothing&quot; means &quot;nothing.&quot;  A server-side trigger will only trigger server-side; plus, only code within a simulated function or simulated state ''can'' (or from the engine's point of view: ''may'') be executed client-side at all (but it's a common misconception that making a function &quot;simulated&quot; will magically execute it client-side &amp;ndash; there's no such magic, unless that function happens to be an engine event ''and'' that event is caused client-side).

Virtually all interaction between actors happens purely server-side, with the client copy being hardly ever any more than just a visual representation of the server copy.

And actually most of what I wrote above is about how the server actor can make something happen on the client actor &amp;ndash; starting from &quot;There are, however&quot;...

'''Tarquin:''' Based on what I now know, I can identify two major newbie mistakes in understanding replication:
# the &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. Not sure if that makes sense, but I found out I've been completely misreading the meaning of that.
# clients do mostly nothing. Having read basic replication docs, I imagined that clients did their own thing, more or less running a duplicate of the game and occasionally echanging data to keep things tied together.

I made a simple map with a [[Legacy:Trigger|Trigger]] to test something for Jailbreak, and I ran it as a netgame. The Trigger actor, that's I'd set bHidden=False on, wasn't visible when I played. Am I right in thinking that the Trigger ''wasn't even there'' on the client?

Given this, could someone with knowlegde of replication conceive of a simple situation where an actor such as a Trigger or Keypoint class might require some replication, and I'll see if I can write a tutorial on it?

'''Mychaeel:''' Yes, you're right &amp;ndash; the Trigger wasn't even there on the clients.  (You have to set bNoDelete=True to prevent the engine from discarding it on clients after it was loaded with the map file; or bAlwaysRelevant=True to have the server replicate it to all clients again after the map was loaded.  But since a Trigger is only acting server-side anyway, neither of those options makes sense in this context.)

'''Tarquin:''' Do we have a reference page of events that can be used as simulated? Are they the ones markes as [event] on [[Legacy:Actor/Methods|Actor/Methods]]?

'''Mychaeel:''' The important difference between &quot;event function&quot; and &quot;normal function&quot; here is only that an event is automatically called by the engine.  Just think about it &amp;ndash; any function that's called directly by engine code qualifies, starting from PreBeginPlay over Tick and Timer to Destroyed... and any other, self-defined function doesn't (like MyOwnFunction or CanBeJailed).

'''Tarquin:''' How do you spawn an actor only on a client, or only on a particular client? Is this possible? I think the 3rd newbie mistake is supposing that the ways in which you can pass information from server to client are not as restricted as they are.

'''Mychaeel:''' To spawn an actor only on a (particular) client... just do so.  :-)  You can't directly initiate that from a server (as in &quot;server, tell client XY to spawn this actor&quot;); but you can spawn it directly from client-side code on that particular client.

'''Tarquin:''' For the first tutorial, I think I'll do a Volume that destroys incoming projectiles. It's fairly simple, but exposes some important concepts (I think... if I've got it right...). Work in progress: [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]]. And I'll be cleaning up this page too ....

'''Lilguy:''' Hey, I just added a bit, hope it's alright. since the &quot;myths&quot; section listed a bunch of facts, not myths, I changed it to &quot;some facts of replication.&quot; I also made a little list of examples we should make that would be helpful. Most of them could probably be copied and pasted from Epic's code, but we could make some simple examples of each one too.

'''Tarquin:''' Hmm... well, I like the title so I've put it back, but you are quite right, I wrote them as facts, which could be very confusing. I have rephrased the first two &amp;ndash; is that better?  I'm working on the first tutorial in the series. I think the 2nd one should involve the replication block with a replicated variable, somehow &amp;ndash; but I don't know what sort of example would be good. After that, I have no idea... :)

'''Lilguy:'''Heh, sorry 'bout that, I had actually kinda liked the title too. That'll do fine...&lt;br /&gt;Perhaps for the second example, there could be some sort of street light or something, with 2 alternate textures that randomly switch back and forth at random intervals. They would only do this if the light was in &quot;damaged mode&quot; which would be signaled by bDamaged, a reliably replicated variable. I guess maybe I should stop talking and start coding, lol.

'''Foxpaw:''' I have to disagree with the assertion that clients do mostly nothing. Clients handle physics just like the server. In UT2003, some actors are handled almost entirely client-side. (general projectiles, for instance, are handled almost entirely client side, with the exception being the actual application of damage.) An efficient replication system should have nearly everything handled client side, with only critical values replicated.

'''Lilguy:''' Yeah, I kind of agree there. SimulatedProxy actors are given an initial physical state, then they're only updated periodically to make sure everything matches up. And there are a lot of clientside only actors, such as almost all emitter effects, the hud, interactions, etc. Perhaps it could be ammended to say that clients are in charge of almost nothing, since the server is usually the ultimate authority on the state of actors that exist on the client and actors. It's really best to always think about this when you're coding, and keep in mind what code should be running on the server, and what should be running on the client, and to program it likewise.

'''Tarquin:''' I think the point is that clients will do nothing unless told to. Using &quot;SimulatedProxy&quot; is telling it. A &quot;client-side effect&quot; has to be MADE to be client-side.

'''Andreas:''' Catching up with replication - I would like to add some more basic ideas to replication? 

'''Tarquin:''' inserted at the top :) BTW, please review [[Legacy:Wiki Markup|Wiki markup]] :) 

'''Andreas:''' thanks for layouting - reading it the example 1 was not that clear - tried to clarify it a bit. Maybe the link

http://unreal.epicgames.com/Network.htm could be included - it helped me quite a bit.

'''Legal:''' Threadmode anyone? This page needs some cleaning up, perhaps a Refractor Me tag would be in order? Also, to add to the discussion, coders need to make sure as much as possible is done client side and with as little code as possible. Some mods which could have impressed requires so much bandwidth that few people get ping over 200.

'''Andreas:''' Im not a wikiexpert (due to limited sparetime I have) - but if it improves - sure - I agree. I disagree on doing everything clientside - the goal of writing a program using replication is to minimise networktraffic. So the server would be my first place (assuming it has enough cpu power) since 1. it has a complete view of the game-status and 2. epic did already implement &quot;clever&quot; methods to reduce the network load (by not updating clients with data they dont need anyways, since they cannot see the actor and so on) I would not want to reinvent. As a coder I would ask me what tasks have to be done (see weapon overheat example), and where I can split server/client in order to minimize communciation. There is no way around updating the client as far it considers visual informations - the client '''is''' the visual frontend - but upon everything else the coder is free to decide where to perform the tasks. 

'''Andreas:''' To add, replication (especially simulated functions running on the client) might be usefull when someone wants to give clients different views or play different sounds locally.

'''FatalOverdose:''' In the first few paragraphs you say 'The truth is: Clients do mostly nothing.' and then a little further down you have 'However, client versions generally don't do much (First Myth).'

. its a bit confusing 

'''Solid Snake:''' This was asked by Mychaeel a long time ago, so I've converted my post into a wiki page, found here [[Legacy:Solid_Snake/A_Study_Of_Replication|A Study Of Replication]]

'''Tarquin:''' I think a simple tutorial would be fixing the example on [[Legacy:Using LocalMessages|Using LocalMessages]] to broadcast the message so clients can see it. Can anyone help me by suggesting how it might be done?

'''Ransico:''' Something that has bothered me for a long time, is there is no info on how to get something to run properly on -only- the client... for example, I was stuck on how to get a custom LOD actor working. The issue I had, was that the tick and timer events would never get called on the client.

The fix turned out to be that the client was deleting the object soon after its creation on the client, no matter what combo of defaultproperty switches I used.

There may be a better way to do it, but I set bNoDelete=true and it solved my problem. The entire source can be found here - someone else may find it useful, it also tells you how to make something run on the client: [[Legacy:Ransico/LODMesh|Ransico/LODMesh]]

'''Vitaloverdose:''' The page is called 'introduction to replication' so it was the first document i read on the subject but it begins with &quot;If you've read a few documents on replication&quot;. Maybe the 'myths of replication' bit might be better off further into the page or as part of a summery as its not introducing the subject so much as reviewing it.Im sure the page is very helpfull for the reader with prior knowledge of the subject but could be very confusing/unhelpful to anyone looking into the issue for the first time as it is referrencing aspects of replication that havent been explained at this point. 

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Work to organize according to [[Legacy:Replication/Discussing|Replication/Discussing]].
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3779</id>
      <timestamp>2007-10-08T08:32:57Z</timestamp>
      <contributor>
        <ip>Kiff</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What is replication?==

Put simply, replication is a way of making best use of limited bandwidth in a network game. The [[Legacy:Replication|replication]] page has a more in-depth exposition of the concept &amp;ndash; but if you're completely new to it, it's likely you'll make a few false assumptions...

==The Myths of replication==

If you've read a few documents on replication and looked at the nuts and bolts of it &amp;ndash; the [[Legacy:UnrealScript|UnrealScript]] keywords and variables that are involved &amp;ndash; then there is a very good chance you've fallen into some commmon traps. 

# Having read basic replication docs, you might have imagined that clients did their own thing, more or less running a duplicate of the game and occasionally exchanging data to keep things tied together.  '''The truth is: Clients do mostly nothing.'''

# You might think that a function marked as &quot;simulated&quot; is made to run on clients when it runs on the server. Not so &amp;ndash; the &quot;simulated&quot; keyword doesn't mean that when something happens on the server, it also makes it happen on the client. '''The truth is: The server doesn't cause clients to simulate simulated functions.'''

# The &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. 

We'll be looking into these in more detail throughout the tutorials.

==Why you need it==

Why would you need replication anyway? The dedicated server has all information of all the clients (that's why the server is so called &quot;authority&quot;) regarding gameflow and making decisions (eg does the player has the correct key to open a door, if yes, issue the open-door-command on the door object) the server can decide everything by itself only. 

So when is replication (or simulation) really needed and is something you should take care of?

; When it's not already taking care of by the Epic code. : '''Example:''' I change the actor location by a server running code only, and the new actor position is automatically replicated by the Epic code (so this is more a negative example &amp;ndash; you dont need to handle replication in this case since Epic does it already for you).

; When it's something '''''visible''''' the client has to display/render. Imagine the player's computer just as a visual frontend, not more! : '''Example:''' I want to have some &quot;Weapon overheat function&quot;, so the temperature is somehow calulated and the rounds shot are taking into account. This is purely server side &amp;ndash; no calculation needed on the client. When overheated, I want the weapon to glow red. &quot;Red glow info&quot; is visible to the player and has to be replicated to the client (since Epic is not already doing it for me).

; When you want to minimize communication between the server and the client. : '''Example:''' A simple projectile moves in a straight line with a fixed velocity until it hits level geometry.  That's predictable movement, and there's no point in having the server send constant location updates to the clients; so I just set the starting location, direction and velocity of the projectile and let the client simulate the movement by itself from there on.  (Actually, virtually all of the game's projectiles are done that way, even those with more complicated movement trajectories such as the Flak secondary fire.)

So you have only to consider replication in the second and third case &amp;ndash; the second in order to display something on the clientside which is not already covered by the epic code (something new!), and the third to cleverly reduce network load. Generally &amp;ndash; if five percent of you code will handle with replication I would consider it much. 

==Multiple copies==

In a network game of UT, there are several machines involved. Simplifying a little, these are servers and clients. Each machine has it's own actors, and each actor exists on a particular machine.

This means that an actor such as a player is actually multiple actors, one on each machine. These multiple copies know that they correspond to one another. How they exchange information to make sure they keep in sync is the basic idea of replication.

However, client versions generally don't do much (First Myth). Furthermore, you the programmer don't really have access to the heart of replication. You can't say in UnrealScript: &quot;send this piece of information across the network now&quot;. 

Replication is rather like having a number of islands and some bottles to send messages between them. You tell the engine it should try to keep certain things in sync, and it will work the bottles and do its best &amp;ndash; but there are no guarantees. You don't know how many bottles there are or when they are sent out, or when they are received.

==The methods of replication==

So now you know that clients do nothing (First Myth), the question is: how do you actually make them do ''something''?

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;reliable if (Role == ROLE_Authority)&lt;/code&gt;, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



==Next Step==

The next tutorial is the [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]] actor.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]

==Planning==
*We should have examples of the following:
** actors that exist on the server only
** actors that exist on the server and clients
** actors that are spawned clientside only
** actors that are spawned on owning clients only

*We should also give examples of how to:
** call a function on the server from a client via function replication
** call a function on an owning client via function replication
** trigger function calls on clients with PostNetReceive()

==Discussion==

'''Tarquin:''' I would really like a basic tutorial on replication: maybe something like a Trigger actor that does something to all players when touched.

'''NickR:''' I wouldn't mind some small replication examples just showing one type replication related code. Like when the simulated key word should be used or if static functions can be called from either the client or server and run on either.

'''VitalOverdose''' I think the ONSMineProjectile is a very good example for replication.

'''Foxpaw:''' I'm not sure about tutorials, but those are (fairly) easily explained. Simulated functions run on actors with ROLE_SimulatedProxy or better. However, only if they are called from another simulated function. Entry points like Tick can be declared as simulated when you override them to facilitate this. A short example:

&lt;uscript&gt;
simulated function Tick( float Delta )
{
  Super.Tick( Delta );

  DoStuffOnServerOnly();
  DoStuffOnBoth();
}

// Called from a simulated function, but not simulated itself,
// the engine skips over this function on clients. (or rather,
// the non-authority version, which is usually the client)
function DoStuffOnServerOnly()
{
  DoStuffOnClient();
}

// A simulated function getting called from another simulated
// function. This gets called on both machines.
simulated function DoStuffOnBoth()
{
}

// Oops! This is a simulated function, but gets called from a
// non-simulated function, so although it COULD run on a client
// (because it's simulated) the code that calls it doesn't run
// on the client and so this won't ever get called.
simulated function DoStuffOnClient()
{
}
&lt;/uscript&gt;

Static functions on the other hand, have no relation to replication and are functions that exist outside the context of an object. Static functions can't get replicated, obviously, because they aren't associated with any particular instance of an object. They can access only default variables and stuff. See [[Legacy:Static Function|Static Function]] and [[Legacy:Simulated Function|Simulated Function]].

Also, feel free to refactor this somewhere or expand it into a full tutorial.. it's more a demonstration at the moment.

'''Tarquin:''' Thanks... but see, you've alreayd lost RepliN00bs with this: '' run on actors with ROLE_SimulatedProxy or better''.... how does Replication actually WORK? Should we imagine multiple facets of the same actor on different machines, or many actors on different machines that somehow correspond to each other?

'''Foxpaw:''' Well, they're different actors, but they have a unique identifier so they &quot;correspond&quot; to each other. An actors Role variable determines it's replication behaviour. ROLE_Authority is usually the one on the server, and it runs all functions, simulated or not. ROLE_SimulatedProxy is usually on the client, and runs only simulated functions. ROLE_DumbProxy runs no functions, but still replicates variables. ROLE_None replicates nothing.

'''Tarquin:''' I simply don't understand how to visualize what is going on with replication. I'm used to thinking of an actor as a script that is running. How do I think of a replicated actor? Two scripts in tandem? How? Take something like this:

&lt;uscript&gt;
replication
{
  reliable if (Role == ROLE_Authority)
    Foo, Bar;
}
&lt;/uscript&gt;

What is this an instruction to? When is this parsed? What does it cause to happen?

'''Mychaeel:''' The engine executes the condition in this statement at its own discretion.  It's not clearly specified ''when'' that happens; the documentation only says ''that'' it happens, and that it happens frequently.

Each machine in a network game for which an actor is &quot;relevant&quot; has a copy of that actor.  For simplicity, let's assume a single client here &amp;ndash; the server spawns the actor, and the server engine tells the client that there's a new actor around.  So we have two copies of the same actor:  One on the server, and one on the client.  The engines of both machines know that those two copies correspond to each other, but by itself that doesn't mean a lot &amp;ndash; specifically, it doesn't mean that the client copy is automatically kept in sync with the server copy.

Apart from that, nothing special happens.  The server copy runs its events and other code, and the client copy just sits there, doing nothing.  There are, however, several ways to ''make'' the client copy do something:

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; above, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



So, the server and client copies of the same actor are basically independent entities &amp;ndash; but you can use the techniques explained above to keep them in sync on both machines.

'''Tarquin:''' This is starting to make sense! When you say &quot;does nothing&quot; &amp;ndash; even if affected by other actors? If I have a player and a trigger, when the player touches the trigger, nothing happens on the client actors, only on the server?

2nd question: is there a way for the server actor to make something happen on the client actor?

'''Mychaeel:''' &quot;Nothing&quot; means &quot;nothing.&quot;  A server-side trigger will only trigger server-side; plus, only code within a simulated function or simulated state ''can'' (or from the engine's point of view: ''may'') be executed client-side at all (but it's a common misconception that making a function &quot;simulated&quot; will magically execute it client-side &amp;ndash; there's no such magic, unless that function happens to be an engine event ''and'' that event is caused client-side).

Virtually all interaction between actors happens purely server-side, with the client copy being hardly ever any more than just a visual representation of the server copy.

And actually most of what I wrote above is about how the server actor can make something happen on the client actor &amp;ndash; starting from &quot;There are, however&quot;...

'''Tarquin:''' Based on what I now know, I can identify two major newbie mistakes in understanding replication:
# the &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. Not sure if that makes sense, but I found out I've been completely misreading the meaning of that.
# clients do mostly nothing. Having read basic replication docs, I imagined that clients did their own thing, more or less running a duplicate of the game and occasionally echanging data to keep things tied together.

I made a simple map with a [[Legacy:Trigger|Trigger]] to test something for Jailbreak, and I ran it as a netgame. The Trigger actor, that's I'd set bHidden=False on, wasn't visible when I played. Am I right in thinking that the Trigger ''wasn't even there'' on the client?

Given this, could someone with knowlegde of replication conceive of a simple situation where an actor such as a Trigger or Keypoint class might require some replication, and I'll see if I can write a tutorial on it?

'''Mychaeel:''' Yes, you're right &amp;ndash; the Trigger wasn't even there on the clients.  (You have to set bNoDelete=True to prevent the engine from discarding it on clients after it was loaded with the map file; or bAlwaysRelevant=True to have the server replicate it to all clients again after the map was loaded.  But since a Trigger is only acting server-side anyway, neither of those options makes sense in this context.)

'''Tarquin:''' Do we have a reference page of events that can be used as simulated? Are they the ones markes as [event] on [[Legacy:Actor/Methods|Actor/Methods]]?

'''Mychaeel:''' The important difference between &quot;event function&quot; and &quot;normal function&quot; here is only that an event is automatically called by the engine.  Just think about it &amp;ndash; any function that's called directly by engine code qualifies, starting from PreBeginPlay over Tick and Timer to Destroyed... and any other, self-defined function doesn't (like MyOwnFunction or CanBeJailed).

'''Tarquin:''' How do you spawn an actor only on a client, or only on a particular client? Is this possible? I think the 3rd newbie mistake is supposing that the ways in which you can pass information from server to client are not as restricted as they are.

'''Mychaeel:''' To spawn an actor only on a (particular) client... just do so.  :-)  You can't directly initiate that from a server (as in &quot;server, tell client XY to spawn this actor&quot;); but you can spawn it directly from client-side code on that particular client.

'''Tarquin:''' For the first tutorial, I think I'll do a Volume that destroys incoming projectiles. It's fairly simple, but exposes some important concepts (I think... if I've got it right...). Work in progress: [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]]. And I'll be cleaning up this page too ....

'''Lilguy:''' Hey, I just added a bit, hope it's alright. since the &quot;myths&quot; section listed a bunch of facts, not myths, I changed it to &quot;some facts of replication.&quot; I also made a little list of examples we should make that would be helpful. Most of them could probably be copied and pasted from Epic's code, but we could make some simple examples of each one too.

'''Tarquin:''' Hmm... well, I like the title so I've put it back, but you are quite right, I wrote them as facts, which could be very confusing. I have rephrased the first two &amp;ndash; is that better?  I'm working on the first tutorial in the series. I think the 2nd one should involve the replication block with a replicated variable, somehow &amp;ndash; but I don't know what sort of example would be good. After that, I have no idea... :)

'''Lilguy:'''Heh, sorry 'bout that, I had actually kinda liked the title too. That'll do fine...&lt;br /&gt;Perhaps for the second example, there could be some sort of street light or something, with 2 alternate textures that randomly switch back and forth at random intervals. They would only do this if the light was in &quot;damaged mode&quot; which would be signaled by bDamaged, a reliably replicated variable. I guess maybe I should stop talking and start coding, lol.

'''Foxpaw:''' I have to disagree with the assertion that clients do mostly nothing. Clients handle physics just like the server. In UT2003, some actors are handled almost entirely client-side. (general projectiles, for instance, are handled almost entirely client side, with the exception being the actual application of damage.) An efficient replication system should have nearly everything handled client side, with only critical values replicated.

'''Lilguy:''' Yeah, I kind of agree there. SimulatedProxy actors are given an initial physical state, then they're only updated periodically to make sure everything matches up. And there are a lot of clientside only actors, such as almost all emitter effects, the hud, interactions, etc. Perhaps it could be ammended to say that clients are in charge of almost nothing, since the server is usually the ultimate authority on the state of actors that exist on the client and actors. It's really best to always think about this when you're coding, and keep in mind what code should be running on the server, and what should be running on the client, and to program it likewise.

'''Tarquin:''' I think the point is that clients will do nothing unless told to. Using &quot;SimulatedProxy&quot; is telling it. A &quot;client-side effect&quot; has to be MADE to be client-side.

'''Andreas:''' Catching up with replication - I would like to add some more basic ideas to replication? 

'''Tarquin:''' inserted at the top :) BTW, please review [[Legacy:Wiki Markup|Wiki markup]] :) 

'''Andreas:''' thanks for layouting - reading it the example 1 was not that clear - tried to clarify it a bit. Maybe the link

http://unreal.epicgames.com/Network.htm could be included - it helped me quite a bit.

'''Legal:''' Threadmode anyone? This page needs some cleaning up, perhaps a Refractor Me tag would be in order? Also, to add to the discussion, coders need to make sure as much as possible is done client side and with as little code as possible. Some mods which could have impressed requires so much bandwidth that few people get ping over 200.

'''Andreas:''' Im not a wikiexpert (due to limited sparetime I have) - but if it improves - sure - I agree. I disagree on doing everything clientside - the goal of writing a program using replication is to minimise networktraffic. So the server would be my first place (assuming it has enough cpu power) since 1. it has a complete view of the game-status and 2. epic did already implement &quot;clever&quot; methods to reduce the network load (by not updating clients with data they dont need anyways, since they cannot see the actor and so on) I would not want to reinvent. As a coder I would ask me what tasks have to be done (see weapon overheat example), and where I can split server/client in order to minimize communciation. There is no way around updating the client as far it considers visual informations - the client '''is''' the visual frontend - but upon everything else the coder is free to decide where to perform the tasks. 

'''Andreas:''' To add, replication (especially simulated functions running on the client) might be usefull when someone wants to give clients different views or play different sounds locally.

'''FatalOverdose:''' In the first few paragraphs you say 'The truth is: Clients do mostly nothing.' and then a little further down you have 'However, client versions generally don't do much (First Myth).'

. its a bit confusing 

'''Solid Snake:''' This was asked by Mychaeel a long time ago, so I've converted my post into a wiki page, found here [[Legacy:Solid_Snake/A_Study_Of_Replication|A Study Of Replication]]

'''Tarquin:''' I think a simple tutorial would be fixing the example on [[Legacy:Using LocalMessages|Using LocalMessages]] to broadcast the message so clients can see it. Can anyone help me by suggesting how it might be done?

'''Ransico:''' Something that has bothered me for a long time, is there is no info on how to get something to run properly on -only- the client... for example, I was stuck on how to get a custom LOD actor working. The issue I had, was that the tick and timer events would never get called on the client.

The fix turned out to be that the client was deleting the object soon after its creation on the client, no matter what combo of defaultproperty switches I used.

There may be a better way to do it, but I set bNoDelete=true and it solved my problem. The entire source can be found here - someone else may find it useful, it also tells you how to make something run on the client: [[Legacy:Ransico/LODMesh|Ransico/LODMesh]]

'''Vitaloverdose:''' The page is called 'introduction to replication' so it was the first document i read on the subject but it begins with &quot;If you've read a few documents on replication&quot;. Maybe the 'myths of replication' bit might be better off further into the page or as part of a summery as its not introducing the subject so much as reviewing it.Im sure the page is very helpfull for the reader with prior knowledge of the subject but could be very confusing/unhelpful to anyone looking into the issue for the first time as it is referrencing aspects of replication that havent been explained at this point. 

'''Kiff:''' I attempted making a tutorial for function calls using PostNetReceive. It might be a little cluttered, so feel free to make suggestions and/or corrections. [[Legacy:Kiff|Kiff]]

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Work to organize according to [[Legacy:Replication/Discussing|Replication/Discussing]].
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32380</id>
      <timestamp>2008-07-15T04:18:59Z</timestamp>
      <contributor>
        <username>XxDangerxX</username>
        <id>198</id>
      </contributor>
      <minor/>
      <comment>Changed &quot;taking&quot; to &quot;taken&quot;</comment>
      <text xml:space="preserve">==What is replication?==

Put simply, replication is a way of making best use of limited bandwidth in a network game. The [[Legacy:Replication|replication]] page has a more in-depth exposition of the concept &amp;ndash; but if you're completely new to it, it's likely you'll make a few false assumptions...

==The Myths of replication==

If you've read a few documents on replication and looked at the nuts and bolts of it &amp;ndash; the [[Legacy:UnrealScript|UnrealScript]] keywords and variables that are involved &amp;ndash; then there is a very good chance you've fallen into some commmon traps. 

# Having read basic replication docs, you might have imagined that clients did their own thing, more or less running a duplicate of the game and occasionally exchanging data to keep things tied together.  '''The truth is: Clients do mostly nothing.'''

# You might think that a function marked as &quot;simulated&quot; is made to run on clients when it runs on the server. Not so &amp;ndash; the &quot;simulated&quot; keyword doesn't mean that when something happens on the server, it also makes it happen on the client. '''The truth is: The server doesn't cause clients to simulate simulated functions.'''

# The &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. 

We'll be looking into these in more detail throughout the tutorials.

==Why you need it==

Why would you need replication anyway? The dedicated server has all information of all the clients (that's why the server is so called &quot;authority&quot;) regarding gameflow and making decisions (eg does the player has the correct key to open a door, if yes, issue the open-door-command on the door object) the server can decide everything by itself only. 

So when is replication (or simulation) really needed and is something you should take care of?

; When it's not already taken care of by the Epic code. : '''Example:''' I change the actor location by a server running code only, and the new actor position is automatically replicated by the Epic code (so this is more a negative example &amp;ndash; you dont need to handle replication in this case since Epic does it already for you).

; When it's something '''''visible''''' the client has to display/render. Imagine the player's computer just as a visual frontend, not more! : '''Example:''' I want to have some &quot;Weapon overheat function&quot;, so the temperature is somehow calulated and the rounds shot are taking into account. This is purely server side &amp;ndash; no calculation needed on the client. When overheated, I want the weapon to glow red. &quot;Red glow info&quot; is visible to the player and has to be replicated to the client (since Epic is not already doing it for me).

; When you want to minimize communication between the server and the client. : '''Example:''' A simple projectile moves in a straight line with a fixed velocity until it hits level geometry.  That's predictable movement, and there's no point in having the server send constant location updates to the clients; so I just set the starting location, direction and velocity of the projectile and let the client simulate the movement by itself from there on.  (Actually, virtually all of the game's projectiles are done that way, even those with more complicated movement trajectories such as the Flak secondary fire.)

So you have only to consider replication in the second and third case &amp;ndash; the second in order to display something on the clientside which is not already covered by the epic code (something new!), and the third to cleverly reduce network load. Generally &amp;ndash; if five percent of you code will handle with replication I would consider it much. 

==Multiple copies==

In a network game of UT, there are several machines involved. Simplifying a little, these are servers and clients. Each machine has it's own actors, and each actor exists on a particular machine.

This means that an actor such as a player is actually multiple actors, one on each machine. These multiple copies know that they correspond to one another. How they exchange information to make sure they keep in sync is the basic idea of replication.

However, client versions generally don't do much (First Myth). Furthermore, you the programmer don't really have access to the heart of replication. You can't say in UnrealScript: &quot;send this piece of information across the network now&quot;. 

Replication is rather like having a number of islands and some bottles to send messages between them. You tell the engine it should try to keep certain things in sync, and it will work the bottles and do its best &amp;ndash; but there are no guarantees. You don't know how many bottles there are or when they are sent out, or when they are received.

==The methods of replication==

So now you know that clients do nothing (First Myth), the question is: how do you actually make them do ''something''?

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;reliable if (Role == ROLE_Authority)&lt;/code&gt;, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



==Next Step==

The next tutorial is the [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]] actor.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]
* [[Legacy:Replication Examples|Replication Examples]]

==Planning==
*We should have examples of the following:
** actors that exist on the server only
** actors that exist on the server and clients
** actors that are spawned clientside only
** actors that are spawned on owning clients only

*We should also give examples of how to:
** call a function on the server from a client via function replication
** call a function on an owning client via function replication
** trigger function calls on clients with PostNetReceive()

==Discussion==

'''Tarquin:''' I would really like a basic tutorial on replication: maybe something like a Trigger actor that does something to all players when touched.

'''NickR:''' I wouldn't mind some small replication examples just showing one type replication related code. Like when the simulated key word should be used or if static functions can be called from either the client or server and run on either.

'''VitalOverdose''' I think the ONSMineProjectile is a very good example for replication.

'''Foxpaw:''' I'm not sure about tutorials, but those are (fairly) easily explained. Simulated functions run on actors with ROLE_SimulatedProxy or better. However, only if they are called from another simulated function. Entry points like Tick can be declared as simulated when you override them to facilitate this. A short example:

&lt;uscript&gt;
simulated function Tick( float Delta )
{
  Super.Tick( Delta );

  DoStuffOnServerOnly();
  DoStuffOnBoth();
}

// Called from a simulated function, but not simulated itself,
// the engine skips over this function on clients. (or rather,
// the non-authority version, which is usually the client)
function DoStuffOnServerOnly()
{
  DoStuffOnClient();
}

// A simulated function getting called from another simulated
// function. This gets called on both machines.
simulated function DoStuffOnBoth()
{
}

// Oops! This is a simulated function, but gets called from a
// non-simulated function, so although it COULD run on a client
// (because it's simulated) the code that calls it doesn't run
// on the client and so this won't ever get called.
simulated function DoStuffOnClient()
{
}
&lt;/uscript&gt;

Static functions on the other hand, have no relation to replication and are functions that exist outside the context of an object. Static functions can't get replicated, obviously, because they aren't associated with any particular instance of an object. They can access only default variables and stuff. See [[Legacy:Static Function|Static Function]] and [[Legacy:Simulated Function|Simulated Function]].

Also, feel free to refactor this somewhere or expand it into a full tutorial.. it's more a demonstration at the moment.

'''Tarquin:''' Thanks... but see, you've alreayd lost RepliN00bs with this: '' run on actors with ROLE_SimulatedProxy or better''.... how does Replication actually WORK? Should we imagine multiple facets of the same actor on different machines, or many actors on different machines that somehow correspond to each other?

'''Foxpaw:''' Well, they're different actors, but they have a unique identifier so they &quot;correspond&quot; to each other. An actors Role variable determines it's replication behaviour. ROLE_Authority is usually the one on the server, and it runs all functions, simulated or not. ROLE_SimulatedProxy is usually on the client, and runs only simulated functions. ROLE_DumbProxy runs no functions, but still replicates variables. ROLE_None replicates nothing.

'''Tarquin:''' I simply don't understand how to visualize what is going on with replication. I'm used to thinking of an actor as a script that is running. How do I think of a replicated actor? Two scripts in tandem? How? Take something like this:

&lt;uscript&gt;
replication
{
  reliable if (Role == ROLE_Authority)
    Foo, Bar;
}
&lt;/uscript&gt;

What is this an instruction to? When is this parsed? What does it cause to happen?

'''Mychaeel:''' The engine executes the condition in this statement at its own discretion.  It's not clearly specified ''when'' that happens; the documentation only says ''that'' it happens, and that it happens frequently.

Each machine in a network game for which an actor is &quot;relevant&quot; has a copy of that actor.  For simplicity, let's assume a single client here &amp;ndash; the server spawns the actor, and the server engine tells the client that there's a new actor around.  So we have two copies of the same actor:  One on the server, and one on the client.  The engines of both machines know that those two copies correspond to each other, but by itself that doesn't mean a lot &amp;ndash; specifically, it doesn't mean that the client copy is automatically kept in sync with the server copy.

Apart from that, nothing special happens.  The server copy runs its events and other code, and the client copy just sits there, doing nothing.  There are, however, several ways to ''make'' the client copy do something:

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; above, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



So, the server and client copies of the same actor are basically independent entities &amp;ndash; but you can use the techniques explained above to keep them in sync on both machines.

'''Tarquin:''' This is starting to make sense! When you say &quot;does nothing&quot; &amp;ndash; even if affected by other actors? If I have a player and a trigger, when the player touches the trigger, nothing happens on the client actors, only on the server?

2nd question: is there a way for the server actor to make something happen on the client actor?

'''Mychaeel:''' &quot;Nothing&quot; means &quot;nothing.&quot;  A server-side trigger will only trigger server-side; plus, only code within a simulated function or simulated state ''can'' (or from the engine's point of view: ''may'') be executed client-side at all (but it's a common misconception that making a function &quot;simulated&quot; will magically execute it client-side &amp;ndash; there's no such magic, unless that function happens to be an engine event ''and'' that event is caused client-side).

Virtually all interaction between actors happens purely server-side, with the client copy being hardly ever any more than just a visual representation of the server copy.

And actually most of what I wrote above is about how the server actor can make something happen on the client actor &amp;ndash; starting from &quot;There are, however&quot;...

'''Tarquin:''' Based on what I now know, I can identify two major newbie mistakes in understanding replication:
# the &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. Not sure if that makes sense, but I found out I've been completely misreading the meaning of that.
# clients do mostly nothing. Having read basic replication docs, I imagined that clients did their own thing, more or less running a duplicate of the game and occasionally echanging data to keep things tied together.

I made a simple map with a [[Legacy:Trigger|Trigger]] to test something for Jailbreak, and I ran it as a netgame. The Trigger actor, that's I'd set bHidden=False on, wasn't visible when I played. Am I right in thinking that the Trigger ''wasn't even there'' on the client?

Given this, could someone with knowlegde of replication conceive of a simple situation where an actor such as a Trigger or Keypoint class might require some replication, and I'll see if I can write a tutorial on it?

'''Mychaeel:''' Yes, you're right &amp;ndash; the Trigger wasn't even there on the clients.  (You have to set bNoDelete=True to prevent the engine from discarding it on clients after it was loaded with the map file; or bAlwaysRelevant=True to have the server replicate it to all clients again after the map was loaded.  But since a Trigger is only acting server-side anyway, neither of those options makes sense in this context.)

'''Tarquin:''' Do we have a reference page of events that can be used as simulated? Are they the ones markes as [event] on [[Legacy:Actor/Methods|Actor/Methods]]?

'''Mychaeel:''' The important difference between &quot;event function&quot; and &quot;normal function&quot; here is only that an event is automatically called by the engine.  Just think about it &amp;ndash; any function that's called directly by engine code qualifies, starting from PreBeginPlay over Tick and Timer to Destroyed... and any other, self-defined function doesn't (like MyOwnFunction or CanBeJailed).

'''Tarquin:''' How do you spawn an actor only on a client, or only on a particular client? Is this possible? I think the 3rd newbie mistake is supposing that the ways in which you can pass information from server to client are not as restricted as they are.

'''Mychaeel:''' To spawn an actor only on a (particular) client... just do so.  :-)  You can't directly initiate that from a server (as in &quot;server, tell client XY to spawn this actor&quot;); but you can spawn it directly from client-side code on that particular client.

'''Tarquin:''' For the first tutorial, I think I'll do a Volume that destroys incoming projectiles. It's fairly simple, but exposes some important concepts (I think... if I've got it right...). Work in progress: [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]]. And I'll be cleaning up this page too ....

'''Lilguy:''' Hey, I just added a bit, hope it's alright. since the &quot;myths&quot; section listed a bunch of facts, not myths, I changed it to &quot;some facts of replication.&quot; I also made a little list of examples we should make that would be helpful. Most of them could probably be copied and pasted from Epic's code, but we could make some simple examples of each one too.

'''Tarquin:''' Hmm... well, I like the title so I've put it back, but you are quite right, I wrote them as facts, which could be very confusing. I have rephrased the first two &amp;ndash; is that better?  I'm working on the first tutorial in the series. I think the 2nd one should involve the replication block with a replicated variable, somehow &amp;ndash; but I don't know what sort of example would be good. After that, I have no idea... :)

'''Lilguy:'''Heh, sorry 'bout that, I had actually kinda liked the title too. That'll do fine...&lt;br /&gt;Perhaps for the second example, there could be some sort of street light or something, with 2 alternate textures that randomly switch back and forth at random intervals. They would only do this if the light was in &quot;damaged mode&quot; which would be signaled by bDamaged, a reliably replicated variable. I guess maybe I should stop talking and start coding, lol.

'''Foxpaw:''' I have to disagree with the assertion that clients do mostly nothing. Clients handle physics just like the server. In UT2003, some actors are handled almost entirely client-side. (general projectiles, for instance, are handled almost entirely client side, with the exception being the actual application of damage.) An efficient replication system should have nearly everything handled client side, with only critical values replicated.

'''Lilguy:''' Yeah, I kind of agree there. SimulatedProxy actors are given an initial physical state, then they're only updated periodically to make sure everything matches up. And there are a lot of clientside only actors, such as almost all emitter effects, the hud, interactions, etc. Perhaps it could be ammended to say that clients are in charge of almost nothing, since the server is usually the ultimate authority on the state of actors that exist on the client and actors. It's really best to always think about this when you're coding, and keep in mind what code should be running on the server, and what should be running on the client, and to program it likewise.

'''Tarquin:''' I think the point is that clients will do nothing unless told to. Using &quot;SimulatedProxy&quot; is telling it. A &quot;client-side effect&quot; has to be MADE to be client-side.

'''Andreas:''' Catching up with replication - I would like to add some more basic ideas to replication? 

'''Tarquin:''' inserted at the top :) BTW, please review [[Legacy:Wiki Markup|Wiki markup]] :) 

'''Andreas:''' thanks for layouting - reading it the example 1 was not that clear - tried to clarify it a bit. Maybe the link

http://unreal.epicgames.com/Network.htm could be included - it helped me quite a bit.

'''Legal:''' Threadmode anyone? This page needs some cleaning up, perhaps a Refractor Me tag would be in order? Also, to add to the discussion, coders need to make sure as much as possible is done client side and with as little code as possible. Some mods which could have impressed requires so much bandwidth that few people get ping over 200.

'''Andreas:''' Im not a wikiexpert (due to limited sparetime I have) - but if it improves - sure - I agree. I disagree on doing everything clientside - the goal of writing a program using replication is to minimise networktraffic. So the server would be my first place (assuming it has enough cpu power) since 1. it has a complete view of the game-status and 2. epic did already implement &quot;clever&quot; methods to reduce the network load (by not updating clients with data they dont need anyways, since they cannot see the actor and so on) I would not want to reinvent. As a coder I would ask me what tasks have to be done (see weapon overheat example), and where I can split server/client in order to minimize communciation. There is no way around updating the client as far it considers visual informations - the client '''is''' the visual frontend - but upon everything else the coder is free to decide where to perform the tasks. 

'''Andreas:''' To add, replication (especially simulated functions running on the client) might be usefull when someone wants to give clients different views or play different sounds locally.

'''FatalOverdose:''' In the first few paragraphs you say 'The truth is: Clients do mostly nothing.' and then a little further down you have 'However, client versions generally don't do much (First Myth).'

. its a bit confusing 

'''Solid Snake:''' This was asked by Mychaeel a long time ago, so I've converted my post into a wiki page, found here [[Legacy:Solid_Snake/A_Study_Of_Replication|A Study Of Replication]]

'''Tarquin:''' I think a simple tutorial would be fixing the example on [[Legacy:Using LocalMessages|Using LocalMessages]] to broadcast the message so clients can see it. Can anyone help me by suggesting how it might be done?

'''Ransico:''' Something that has bothered me for a long time, is there is no info on how to get something to run properly on -only- the client... for example, I was stuck on how to get a custom LOD actor working. The issue I had, was that the tick and timer events would never get called on the client.

The fix turned out to be that the client was deleting the object soon after its creation on the client, no matter what combo of defaultproperty switches I used.

There may be a better way to do it, but I set bNoDelete=true and it solved my problem. The entire source can be found here - someone else may find it useful, it also tells you how to make something run on the client: [[Legacy:Ransico/LODMesh|Ransico/LODMesh]]

'''Vitaloverdose:''' The page is called 'introduction to replication' so it was the first document i read on the subject but it begins with &quot;If you've read a few documents on replication&quot;. Maybe the 'myths of replication' bit might be better off further into the page or as part of a summery as its not introducing the subject so much as reviewing it.Im sure the page is very helpfull for the reader with prior knowledge of the subject but could be very confusing/unhelpful to anyone looking into the issue for the first time as it is referrencing aspects of replication that havent been explained at this point. 

'''Kiff:''' I attempted making a tutorial for function calls using PostNetReceive. It might be a little cluttered, so feel free to make suggestions and/or corrections. [[Legacy:Kiff|Kiff]]

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Work to organize according to [[Legacy:Replication/Discussing|Replication/Discussing]].
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35375</id>
      <timestamp>2009-08-28T05:41:47Z</timestamp>
      <contributor>
        <ip>82.36.20.231</ip>
      </contributor>
      <comment>/* Why you need it */</comment>
      <text xml:space="preserve">==What is replication?==

Put simply, replication is a way of making best use of limited bandwidth in a network game. The [[Legacy:Replication|replication]] page has a more in-depth exposition of the concept &amp;ndash; but if you're completely new to it, it's likely you'll make a few false assumptions...

==The Myths of replication==

If you've read a few documents on replication and looked at the nuts and bolts of it &amp;ndash; the [[Legacy:UnrealScript|UnrealScript]] keywords and variables that are involved &amp;ndash; then there is a very good chance you've fallen into some commmon traps. 

# Having read basic replication docs, you might have imagined that clients did their own thing, more or less running a duplicate of the game and occasionally exchanging data to keep things tied together.  '''The truth is: Clients do mostly nothing.'''

# You might think that a function marked as &quot;simulated&quot; is made to run on clients when it runs on the server. Not so &amp;ndash; the &quot;simulated&quot; keyword doesn't mean that when something happens on the server, it also makes it happen on the client. '''The truth is: The server doesn't cause clients to simulate simulated functions.'''

# The &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. 

We'll be looking into these in more detail throughout the tutorials.

== [[File:Headline text]][[File:[[File:Example.jpg]][[File:[[File:Example.jpg]][[File:[[Media:Example.jpg]][[Media:[[Media:Example.ogg]]]]]]]]]] ==

==Multiple copies==

In a network game of UT, there are several machines involved. Simplifying a little, these are servers and clients. Each machine has it's own actors, and each actor exists on a particular machine.

This means that an actor such as a player is actually multiple actors, one on each machine. These multiple copies know that they correspond to one another. How they exchange information to make sure they keep in sync is the basic idea of replication.

However, client versions generally don't do much (First Myth). Furthermore, you the programmer don't really have access to the heart of replication. You can't say in UnrealScript: &quot;send this piece of information across the network now&quot;. 

Replication is rather like having a number of islands and some bottles to send messages between them. You tell the engine it should try to keep certain things in sync, and it will work the bottles and do its best &amp;ndash; but there are no guarantees. You don't know how many bottles there are or when they are sent out, or when they are received.

==The methods of replication==

So now you know that clients do nothing (First Myth), the question is: how do you actually make them do ''something''?

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;reliable if (Role == ROLE_Authority)&lt;/code&gt;, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



==Next Step==

The next tutorial is the [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]] actor.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]
* [[Legacy:Replication Examples|Replication Examples]]

==Planning==
*We should have examples of the following:
** actors that exist on the server only
** actors that exist on the server and clients
** actors that are spawned clientside only
** actors that are spawned on owning clients only

*We should also give examples of how to:
** call a function on the server from a client via function replication
** call a function on an owning client via function replication
** trigger function calls on clients with PostNetReceive()

==Discussion==

'''Tarquin:''' I would really like a basic tutorial on replication: maybe something like a Trigger actor that does something to all players when touched.

'''NickR:''' I wouldn't mind some small replication examples just showing one type replication related code. Like when the simulated key word should be used or if static functions can be called from either the client or server and run on either.

'''VitalOverdose''' I think the ONSMineProjectile is a very good example for replication.

'''Foxpaw:''' I'm not sure about tutorials, but those are (fairly) easily explained. Simulated functions run on actors with ROLE_SimulatedProxy or better. However, only if they are called from another simulated function. Entry points like Tick can be declared as simulated when you override them to facilitate this. A short example:

&lt;uscript&gt;
simulated function Tick( float Delta )
{
  Super.Tick( Delta );

  DoStuffOnServerOnly();
  DoStuffOnBoth();
}

// Called from a simulated function, but not simulated itself,
// the engine skips over this function on clients. (or rather,
// the non-authority version, which is usually the client)
function DoStuffOnServerOnly()
{
  DoStuffOnClient();
}

// A simulated function getting called from another simulated
// function. This gets called on both machines.
simulated function DoStuffOnBoth()
{
}

// Oops! This is a simulated function, but gets called from a
// non-simulated function, so although it COULD run on a client
// (because it's simulated) the code that calls it doesn't run
// on the client and so this won't ever get called.
simulated function DoStuffOnClient()
{
}
&lt;/uscript&gt;

Static functions on the other hand, have no relation to replication and are functions that exist outside the context of an object. Static functions can't get replicated, obviously, because they aren't associated with any particular instance of an object. They can access only default variables and stuff. See [[Legacy:Static Function|Static Function]] and [[Legacy:Simulated Function|Simulated Function]].

Also, feel free to refactor this somewhere or expand it into a full tutorial.. it's more a demonstration at the moment.

'''Tarquin:''' Thanks... but see, you've alreayd lost RepliN00bs with this: '' run on actors with ROLE_SimulatedProxy or better''.... how does Replication actually WORK? Should we imagine multiple facets of the same actor on different machines, or many actors on different machines that somehow correspond to each other?

'''Foxpaw:''' Well, they're different actors, but they have a unique identifier so they &quot;correspond&quot; to each other. An actors Role variable determines it's replication behaviour. ROLE_Authority is usually the one on the server, and it runs all functions, simulated or not. ROLE_SimulatedProxy is usually on the client, and runs only simulated functions. ROLE_DumbProxy runs no functions, but still replicates variables. ROLE_None replicates nothing.

'''Tarquin:''' I simply don't understand how to visualize what is going on with replication. I'm used to thinking of an actor as a script that is running. How do I think of a replicated actor? Two scripts in tandem? How? Take something like this:

&lt;uscript&gt;
replication
{
  reliable if (Role == ROLE_Authority)
    Foo, Bar;
}
&lt;/uscript&gt;

What is this an instruction to? When is this parsed? What does it cause to happen?

'''Mychaeel:''' The engine executes the condition in this statement at its own discretion.  It's not clearly specified ''when'' that happens; the documentation only says ''that'' it happens, and that it happens frequently.

Each machine in a network game for which an actor is &quot;relevant&quot; has a copy of that actor.  For simplicity, let's assume a single client here &amp;ndash; the server spawns the actor, and the server engine tells the client that there's a new actor around.  So we have two copies of the same actor:  One on the server, and one on the client.  The engines of both machines know that those two copies correspond to each other, but by itself that doesn't mean a lot &amp;ndash; specifically, it doesn't mean that the client copy is automatically kept in sync with the server copy.

Apart from that, nothing special happens.  The server copy runs its events and other code, and the client copy just sits there, doing nothing.  There are, however, several ways to ''make'' the client copy do something:

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; above, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



So, the server and client copies of the same actor are basically independent entities &amp;ndash; but you can use the techniques explained above to keep them in sync on both machines.

'''Tarquin:''' This is starting to make sense! When you say &quot;does nothing&quot; &amp;ndash; even if affected by other actors? If I have a player and a trigger, when the player touches the trigger, nothing happens on the client actors, only on the server?

2nd question: is there a way for the server actor to make something happen on the client actor?

'''Mychaeel:''' &quot;Nothing&quot; means &quot;nothing.&quot;  A server-side trigger will only trigger server-side; plus, only code within a simulated function or simulated state ''can'' (or from the engine's point of view: ''may'') be executed client-side at all (but it's a common misconception that making a function &quot;simulated&quot; will magically execute it client-side &amp;ndash; there's no such magic, unless that function happens to be an engine event ''and'' that event is caused client-side).

Virtually all interaction between actors happens purely server-side, with the client copy being hardly ever any more than just a visual representation of the server copy.

And actually most of what I wrote above is about how the server actor can make something happen on the client actor &amp;ndash; starting from &quot;There are, however&quot;...

'''Tarquin:''' Based on what I now know, I can identify two major newbie mistakes in understanding replication:
# the &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. Not sure if that makes sense, but I found out I've been completely misreading the meaning of that.
# clients do mostly nothing. Having read basic replication docs, I imagined that clients did their own thing, more or less running a duplicate of the game and occasionally echanging data to keep things tied together.

I made a simple map with a [[Legacy:Trigger|Trigger]] to test something for Jailbreak, and I ran it as a netgame. The Trigger actor, that's I'd set bHidden=False on, wasn't visible when I played. Am I right in thinking that the Trigger ''wasn't even there'' on the client?

Given this, could someone with knowlegde of replication conceive of a simple situation where an actor such as a Trigger or Keypoint class might require some replication, and I'll see if I can write a tutorial on it?

'''Mychaeel:''' Yes, you're right &amp;ndash; the Trigger wasn't even there on the clients.  (You have to set bNoDelete=True to prevent the engine from discarding it on clients after it was loaded with the map file; or bAlwaysRelevant=True to have the server replicate it to all clients again after the map was loaded.  But since a Trigger is only acting server-side anyway, neither of those options makes sense in this context.)

'''Tarquin:''' Do we have a reference page of events that can be used as simulated? Are they the ones markes as [event] on [[Legacy:Actor/Methods|Actor/Methods]]?

'''Mychaeel:''' The important difference between &quot;event function&quot; and &quot;normal function&quot; here is only that an event is automatically called by the engine.  Just think about it &amp;ndash; any function that's called directly by engine code qualifies, starting from PreBeginPlay over Tick and Timer to Destroyed... and any other, self-defined function doesn't (like MyOwnFunction or CanBeJailed).

'''Tarquin:''' How do you spawn an actor only on a client, or only on a particular client? Is this possible? I think the 3rd newbie mistake is supposing that the ways in which you can pass information from server to client are not as restricted as they are.

'''Mychaeel:''' To spawn an actor only on a (particular) client... just do so.  :-)  You can't directly initiate that from a server (as in &quot;server, tell client XY to spawn this actor&quot;); but you can spawn it directly from client-side code on that particular client.

'''Tarquin:''' For the first tutorial, I think I'll do a Volume that destroys incoming projectiles. It's fairly simple, but exposes some important concepts (I think... if I've got it right...). Work in progress: [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]]. And I'll be cleaning up this page too ....

'''Lilguy:''' Hey, I just added a bit, hope it's alright. since the &quot;myths&quot; section listed a bunch of facts, not myths, I changed it to &quot;some facts of replication.&quot; I also made a little list of examples we should make that would be helpful. Most of them could probably be copied and pasted from Epic's code, but we could make some simple examples of each one too.

'''Tarquin:''' Hmm... well, I like the title so I've put it back, but you are quite right, I wrote them as facts, which could be very confusing. I have rephrased the first two &amp;ndash; is that better?  I'm working on the first tutorial in the series. I think the 2nd one should involve the replication block with a replicated variable, somehow &amp;ndash; but I don't know what sort of example would be good. After that, I have no idea... :)

'''Lilguy:'''Heh, sorry 'bout that, I had actually kinda liked the title too. That'll do fine...&lt;br /&gt;Perhaps for the second example, there could be some sort of street light or something, with 2 alternate textures that randomly switch back and forth at random intervals. They would only do this if the light was in &quot;damaged mode&quot; which would be signaled by bDamaged, a reliably replicated variable. I guess maybe I should stop talking and start coding, lol.

'''Foxpaw:''' I have to disagree with the assertion that clients do mostly nothing. Clients handle physics just like the server. In UT2003, some actors are handled almost entirely client-side. (general projectiles, for instance, are handled almost entirely client side, with the exception being the actual application of damage.) An efficient replication system should have nearly everything handled client side, with only critical values replicated.

'''Lilguy:''' Yeah, I kind of agree there. SimulatedProxy actors are given an initial physical state, then they're only updated periodically to make sure everything matches up. And there are a lot of clientside only actors, such as almost all emitter effects, the hud, interactions, etc. Perhaps it could be ammended to say that clients are in charge of almost nothing, since the server is usually the ultimate authority on the state of actors that exist on the client and actors. It's really best to always think about this when you're coding, and keep in mind what code should be running on the server, and what should be running on the client, and to program it likewise.

'''Tarquin:''' I think the point is that clients will do nothing unless told to. Using &quot;SimulatedProxy&quot; is telling it. A &quot;client-side effect&quot; has to be MADE to be client-side.

'''Andreas:''' Catching up with replication - I would like to add some more basic ideas to replication? 

'''Tarquin:''' inserted at the top :) BTW, please review [[Legacy:Wiki Markup|Wiki markup]] :) 

'''Andreas:''' thanks for layouting - reading it the example 1 was not that clear - tried to clarify it a bit. Maybe the link

http://unreal.epicgames.com/Network.htm could be included - it helped me quite a bit.

'''Legal:''' Threadmode anyone? This page needs some cleaning up, perhaps a Refractor Me tag would be in order? Also, to add to the discussion, coders need to make sure as much as possible is done client side and with as little code as possible. Some mods which could have impressed requires so much bandwidth that few people get ping over 200.

'''Andreas:''' Im not a wikiexpert (due to limited sparetime I have) - but if it improves - sure - I agree. I disagree on doing everything clientside - the goal of writing a program using replication is to minimise networktraffic. So the server would be my first place (assuming it has enough cpu power) since 1. it has a complete view of the game-status and 2. epic did already implement &quot;clever&quot; methods to reduce the network load (by not updating clients with data they dont need anyways, since they cannot see the actor and so on) I would not want to reinvent. As a coder I would ask me what tasks have to be done (see weapon overheat example), and where I can split server/client in order to minimize communciation. There is no way around updating the client as far it considers visual informations - the client '''is''' the visual frontend - but upon everything else the coder is free to decide where to perform the tasks. 

'''Andreas:''' To add, replication (especially simulated functions running on the client) might be usefull when someone wants to give clients different views or play different sounds locally.

'''FatalOverdose:''' In the first few paragraphs you say 'The truth is: Clients do mostly nothing.' and then a little further down you have 'However, client versions generally don't do much (First Myth).'

. its a bit confusing 

'''Solid Snake:''' This was asked by Mychaeel a long time ago, so I've converted my post into a wiki page, found here [[Legacy:Solid_Snake/A_Study_Of_Replication|A Study Of Replication]]

'''Tarquin:''' I think a simple tutorial would be fixing the example on [[Legacy:Using LocalMessages|Using LocalMessages]] to broadcast the message so clients can see it. Can anyone help me by suggesting how it might be done?

'''Ransico:''' Something that has bothered me for a long time, is there is no info on how to get something to run properly on -only- the client... for example, I was stuck on how to get a custom LOD actor working. The issue I had, was that the tick and timer events would never get called on the client.

The fix turned out to be that the client was deleting the object soon after its creation on the client, no matter what combo of defaultproperty switches I used.

There may be a better way to do it, but I set bNoDelete=true and it solved my problem. The entire source can be found here - someone else may find it useful, it also tells you how to make something run on the client: [[Legacy:Ransico/LODMesh|Ransico/LODMesh]]

'''Vitaloverdose:''' The page is called 'introduction to replication' so it was the first document i read on the subject but it begins with &quot;If you've read a few documents on replication&quot;. Maybe the 'myths of replication' bit might be better off further into the page or as part of a summery as its not introducing the subject so much as reviewing it.Im sure the page is very helpfull for the reader with prior knowledge of the subject but could be very confusing/unhelpful to anyone looking into the issue for the first time as it is referrencing aspects of replication that havent been explained at this point. 

'''Kiff:''' I attempted making a tutorial for function calls using PostNetReceive. It might be a little cluttered, so feel free to make suggestions and/or corrections. [[Legacy:Kiff|Kiff]]

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Work to organize according to [[Legacy:Replication/Discussing|Replication/Discussing]].
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35376</id>
      <timestamp>2009-08-28T07:42:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/82.36.20.231|82.36.20.231]] ([[User talk:82.36.20.231|Talk]]) to last revision by [[User:XxDangerxX|XxDangerxX]]</comment>
      <text xml:space="preserve">==What is replication?==

Put simply, replication is a way of making best use of limited bandwidth in a network game. The [[Legacy:Replication|replication]] page has a more in-depth exposition of the concept &amp;ndash; but if you're completely new to it, it's likely you'll make a few false assumptions...

==The Myths of replication==

If you've read a few documents on replication and looked at the nuts and bolts of it &amp;ndash; the [[Legacy:UnrealScript|UnrealScript]] keywords and variables that are involved &amp;ndash; then there is a very good chance you've fallen into some commmon traps. 

# Having read basic replication docs, you might have imagined that clients did their own thing, more or less running a duplicate of the game and occasionally exchanging data to keep things tied together.  '''The truth is: Clients do mostly nothing.'''

# You might think that a function marked as &quot;simulated&quot; is made to run on clients when it runs on the server. Not so &amp;ndash; the &quot;simulated&quot; keyword doesn't mean that when something happens on the server, it also makes it happen on the client. '''The truth is: The server doesn't cause clients to simulate simulated functions.'''

# The &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. 

We'll be looking into these in more detail throughout the tutorials.

==Why you need it==

Why would you need replication anyway? The dedicated server has all information of all the clients (that's why the server is so called &quot;authority&quot;) regarding gameflow and making decisions (eg does the player has the correct key to open a door, if yes, issue the open-door-command on the door object) the server can decide everything by itself only. 

So when is replication (or simulation) really needed and is something you should take care of?

; When it's not already taken care of by the Epic code. : '''Example:''' I change the actor location by a server running code only, and the new actor position is automatically replicated by the Epic code (so this is more a negative example &amp;ndash; you dont need to handle replication in this case since Epic does it already for you).

; When it's something '''''visible''''' the client has to display/render. Imagine the player's computer just as a visual frontend, not more! : '''Example:''' I want to have some &quot;Weapon overheat function&quot;, so the temperature is somehow calulated and the rounds shot are taking into account. This is purely server side &amp;ndash; no calculation needed on the client. When overheated, I want the weapon to glow red. &quot;Red glow info&quot; is visible to the player and has to be replicated to the client (since Epic is not already doing it for me).

; When you want to minimize communication between the server and the client. : '''Example:''' A simple projectile moves in a straight line with a fixed velocity until it hits level geometry.  That's predictable movement, and there's no point in having the server send constant location updates to the clients; so I just set the starting location, direction and velocity of the projectile and let the client simulate the movement by itself from there on.  (Actually, virtually all of the game's projectiles are done that way, even those with more complicated movement trajectories such as the Flak secondary fire.)

So you have only to consider replication in the second and third case &amp;ndash; the second in order to display something on the clientside which is not already covered by the epic code (something new!), and the third to cleverly reduce network load. Generally &amp;ndash; if five percent of you code will handle with replication I would consider it much. 

==Multiple copies==

In a network game of UT, there are several machines involved. Simplifying a little, these are servers and clients. Each machine has it's own actors, and each actor exists on a particular machine.

This means that an actor such as a player is actually multiple actors, one on each machine. These multiple copies know that they correspond to one another. How they exchange information to make sure they keep in sync is the basic idea of replication.

However, client versions generally don't do much (First Myth). Furthermore, you the programmer don't really have access to the heart of replication. You can't say in UnrealScript: &quot;send this piece of information across the network now&quot;. 

Replication is rather like having a number of islands and some bottles to send messages between them. You tell the engine it should try to keep certain things in sync, and it will work the bottles and do its best &amp;ndash; but there are no guarantees. You don't know how many bottles there are or when they are sent out, or when they are received.

==The methods of replication==

So now you know that clients do nothing (First Myth), the question is: how do you actually make them do ''something''?

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;reliable if (Role == ROLE_Authority)&lt;/code&gt;, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



==Next Step==

The next tutorial is the [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]] actor.

==Related Topics==
* [[Legacy:Replication|Replication]]
* [[Legacy:Replication Block|Replication Block]]
* [[Legacy:Role|Role]] and RemoteRole, and [[Legacy:NetMode|NetMode]].
* [[Legacy:Netcode Idioms|Netcode Idioms]]
* [[Legacy:Replication Examples|Replication Examples]]

==Planning==
*We should have examples of the following:
** actors that exist on the server only
** actors that exist on the server and clients
** actors that are spawned clientside only
** actors that are spawned on owning clients only

*We should also give examples of how to:
** call a function on the server from a client via function replication
** call a function on an owning client via function replication
** trigger function calls on clients with PostNetReceive()

==Discussion==

'''Tarquin:''' I would really like a basic tutorial on replication: maybe something like a Trigger actor that does something to all players when touched.

'''NickR:''' I wouldn't mind some small replication examples just showing one type replication related code. Like when the simulated key word should be used or if static functions can be called from either the client or server and run on either.

'''VitalOverdose''' I think the ONSMineProjectile is a very good example for replication.

'''Foxpaw:''' I'm not sure about tutorials, but those are (fairly) easily explained. Simulated functions run on actors with ROLE_SimulatedProxy or better. However, only if they are called from another simulated function. Entry points like Tick can be declared as simulated when you override them to facilitate this. A short example:

&lt;uscript&gt;
simulated function Tick( float Delta )
{
  Super.Tick( Delta );

  DoStuffOnServerOnly();
  DoStuffOnBoth();
}

// Called from a simulated function, but not simulated itself,
// the engine skips over this function on clients. (or rather,
// the non-authority version, which is usually the client)
function DoStuffOnServerOnly()
{
  DoStuffOnClient();
}

// A simulated function getting called from another simulated
// function. This gets called on both machines.
simulated function DoStuffOnBoth()
{
}

// Oops! This is a simulated function, but gets called from a
// non-simulated function, so although it COULD run on a client
// (because it's simulated) the code that calls it doesn't run
// on the client and so this won't ever get called.
simulated function DoStuffOnClient()
{
}
&lt;/uscript&gt;

Static functions on the other hand, have no relation to replication and are functions that exist outside the context of an object. Static functions can't get replicated, obviously, because they aren't associated with any particular instance of an object. They can access only default variables and stuff. See [[Legacy:Static Function|Static Function]] and [[Legacy:Simulated Function|Simulated Function]].

Also, feel free to refactor this somewhere or expand it into a full tutorial.. it's more a demonstration at the moment.

'''Tarquin:''' Thanks... but see, you've alreayd lost RepliN00bs with this: '' run on actors with ROLE_SimulatedProxy or better''.... how does Replication actually WORK? Should we imagine multiple facets of the same actor on different machines, or many actors on different machines that somehow correspond to each other?

'''Foxpaw:''' Well, they're different actors, but they have a unique identifier so they &quot;correspond&quot; to each other. An actors Role variable determines it's replication behaviour. ROLE_Authority is usually the one on the server, and it runs all functions, simulated or not. ROLE_SimulatedProxy is usually on the client, and runs only simulated functions. ROLE_DumbProxy runs no functions, but still replicates variables. ROLE_None replicates nothing.

'''Tarquin:''' I simply don't understand how to visualize what is going on with replication. I'm used to thinking of an actor as a script that is running. How do I think of a replicated actor? Two scripts in tandem? How? Take something like this:

&lt;uscript&gt;
replication
{
  reliable if (Role == ROLE_Authority)
    Foo, Bar;
}
&lt;/uscript&gt;

What is this an instruction to? When is this parsed? What does it cause to happen?

'''Mychaeel:''' The engine executes the condition in this statement at its own discretion.  It's not clearly specified ''when'' that happens; the documentation only says ''that'' it happens, and that it happens frequently.

Each machine in a network game for which an actor is &quot;relevant&quot; has a copy of that actor.  For simplicity, let's assume a single client here &amp;ndash; the server spawns the actor, and the server engine tells the client that there's a new actor around.  So we have two copies of the same actor:  One on the server, and one on the client.  The engines of both machines know that those two copies correspond to each other, but by itself that doesn't mean a lot &amp;ndash; specifically, it doesn't mean that the client copy is automatically kept in sync with the server copy.

Apart from that, nothing special happens.  The server copy runs its events and other code, and the client copy just sits there, doing nothing.  There are, however, several ways to ''make'' the client copy do something:

; Replicate variable values.: 


When a variable value changes and has a replication statement such as &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; above, the engine checks &amp;ndash; at its own discretion, and subject to certain networking-related [[Legacy:Actor|Actor]] variables &amp;ndash; its replication condition (here: &lt;code&gt;Role == ROLE_Authority&lt;/code&gt;).  If a variable changes often, those checks happen frequently.

If the replication condition is fulfilled, the engine sends an update of that variable's value over the network to the other side (in our case: from the server to the client).  If the variable has a special meaning such as &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;Rotation&lt;/code&gt;, the client copy will change its appearance as soon as it receives the update.



; Mark event functions as &quot;simulated.&quot; : 


As mentioned above, the client copy normally won't execute any of its code on clients.

If you mark an event function as &quot;simulated,&quot; however, that tells the engine to call that event function client-side too (whenever the event happens, client-side).  Then the UnrealScript code which is executed client-side can affect the client copy of the actor directly (or call other non-event functions client-side if they have been marked as &quot;simulated&quot; too).



; Replicate function calls. : 


It's also possible to call a function on the server and have it execute on the one client who &quot;owns&quot; that actor (i.e. the client whose player is &amp;ndash; directly or indirectly &amp;ndash; the &lt;code&gt;Owner&lt;/code&gt; of that actor).

That happens asynchronously, meaning that &quot;calling the function on the server&quot; just makes the engine send a notification over the network to the affected client and return immediately without any feedback of whether and when the function was actually executed client-side; because of that, it's not possible to get return values from replicated functions.



So, the server and client copies of the same actor are basically independent entities &amp;ndash; but you can use the techniques explained above to keep them in sync on both machines.

'''Tarquin:''' This is starting to make sense! When you say &quot;does nothing&quot; &amp;ndash; even if affected by other actors? If I have a player and a trigger, when the player touches the trigger, nothing happens on the client actors, only on the server?

2nd question: is there a way for the server actor to make something happen on the client actor?

'''Mychaeel:''' &quot;Nothing&quot; means &quot;nothing.&quot;  A server-side trigger will only trigger server-side; plus, only code within a simulated function or simulated state ''can'' (or from the engine's point of view: ''may'') be executed client-side at all (but it's a common misconception that making a function &quot;simulated&quot; will magically execute it client-side &amp;ndash; there's no such magic, unless that function happens to be an engine event ''and'' that event is caused client-side).

Virtually all interaction between actors happens purely server-side, with the client copy being hardly ever any more than just a visual representation of the server copy.

And actually most of what I wrote above is about how the server actor can make something happen on the client actor &amp;ndash; starting from &quot;There are, however&quot;...

'''Tarquin:''' Based on what I now know, I can identify two major newbie mistakes in understanding replication:
# the &quot;reliable if&quot; statement doesn't state &quot;this variable is reliable&quot;, it's an ''instruction'' to try to replicate the variable... reliably. Not sure if that makes sense, but I found out I've been completely misreading the meaning of that.
# clients do mostly nothing. Having read basic replication docs, I imagined that clients did their own thing, more or less running a duplicate of the game and occasionally echanging data to keep things tied together.

I made a simple map with a [[Legacy:Trigger|Trigger]] to test something for Jailbreak, and I ran it as a netgame. The Trigger actor, that's I'd set bHidden=False on, wasn't visible when I played. Am I right in thinking that the Trigger ''wasn't even there'' on the client?

Given this, could someone with knowlegde of replication conceive of a simple situation where an actor such as a Trigger or Keypoint class might require some replication, and I'll see if I can write a tutorial on it?

'''Mychaeel:''' Yes, you're right &amp;ndash; the Trigger wasn't even there on the clients.  (You have to set bNoDelete=True to prevent the engine from discarding it on clients after it was loaded with the map file; or bAlwaysRelevant=True to have the server replicate it to all clients again after the map was loaded.  But since a Trigger is only acting server-side anyway, neither of those options makes sense in this context.)

'''Tarquin:''' Do we have a reference page of events that can be used as simulated? Are they the ones markes as [event] on [[Legacy:Actor/Methods|Actor/Methods]]?

'''Mychaeel:''' The important difference between &quot;event function&quot; and &quot;normal function&quot; here is only that an event is automatically called by the engine.  Just think about it &amp;ndash; any function that's called directly by engine code qualifies, starting from PreBeginPlay over Tick and Timer to Destroyed... and any other, self-defined function doesn't (like MyOwnFunction or CanBeJailed).

'''Tarquin:''' How do you spawn an actor only on a client, or only on a particular client? Is this possible? I think the 3rd newbie mistake is supposing that the ways in which you can pass information from server to client are not as restricted as they are.

'''Mychaeel:''' To spawn an actor only on a (particular) client... just do so.  :-)  You can't directly initiate that from a server (as in &quot;server, tell client XY to spawn this actor&quot;); but you can spawn it directly from client-side code on that particular client.

'''Tarquin:''' For the first tutorial, I think I'll do a Volume that destroys incoming projectiles. It's fairly simple, but exposes some important concepts (I think... if I've got it right...). Work in progress: [[Legacy:ProjectileDestroyerVolume|ProjectileDestroyerVolume]]. And I'll be cleaning up this page too ....

'''Lilguy:''' Hey, I just added a bit, hope it's alright. since the &quot;myths&quot; section listed a bunch of facts, not myths, I changed it to &quot;some facts of replication.&quot; I also made a little list of examples we should make that would be helpful. Most of them could probably be copied and pasted from Epic's code, but we could make some simple examples of each one too.

'''Tarquin:''' Hmm... well, I like the title so I've put it back, but you are quite right, I wrote them as facts, which could be very confusing. I have rephrased the first two &amp;ndash; is that better?  I'm working on the first tutorial in the series. I think the 2nd one should involve the replication block with a replicated variable, somehow &amp;ndash; but I don't know what sort of example would be good. After that, I have no idea... :)

'''Lilguy:'''Heh, sorry 'bout that, I had actually kinda liked the title too. That'll do fine...&lt;br /&gt;Perhaps for the second example, there could be some sort of street light or something, with 2 alternate textures that randomly switch back and forth at random intervals. They would only do this if the light was in &quot;damaged mode&quot; which would be signaled by bDamaged, a reliably replicated variable. I guess maybe I should stop talking and start coding, lol.

'''Foxpaw:''' I have to disagree with the assertion that clients do mostly nothing. Clients handle physics just like the server. In UT2003, some actors are handled almost entirely client-side. (general projectiles, for instance, are handled almost entirely client side, with the exception being the actual application of damage.) An efficient replication system should have nearly everything handled client side, with only critical values replicated.

'''Lilguy:''' Yeah, I kind of agree there. SimulatedProxy actors are given an initial physical state, then they're only updated periodically to make sure everything matches up. And there are a lot of clientside only actors, such as almost all emitter effects, the hud, interactions, etc. Perhaps it could be ammended to say that clients are in charge of almost nothing, since the server is usually the ultimate authority on the state of actors that exist on the client and actors. It's really best to always think about this when you're coding, and keep in mind what code should be running on the server, and what should be running on the client, and to program it likewise.

'''Tarquin:''' I think the point is that clients will do nothing unless told to. Using &quot;SimulatedProxy&quot; is telling it. A &quot;client-side effect&quot; has to be MADE to be client-side.

'''Andreas:''' Catching up with replication - I would like to add some more basic ideas to replication? 

'''Tarquin:''' inserted at the top :) BTW, please review [[Legacy:Wiki Markup|Wiki markup]] :) 

'''Andreas:''' thanks for layouting - reading it the example 1 was not that clear - tried to clarify it a bit. Maybe the link

http://unreal.epicgames.com/Network.htm could be included - it helped me quite a bit.

'''Legal:''' Threadmode anyone? This page needs some cleaning up, perhaps a Refractor Me tag would be in order? Also, to add to the discussion, coders need to make sure as much as possible is done client side and with as little code as possible. Some mods which could have impressed requires so much bandwidth that few people get ping over 200.

'''Andreas:''' Im not a wikiexpert (due to limited sparetime I have) - but if it improves - sure - I agree. I disagree on doing everything clientside - the goal of writing a program using replication is to minimise networktraffic. So the server would be my first place (assuming it has enough cpu power) since 1. it has a complete view of the game-status and 2. epic did already implement &quot;clever&quot; methods to reduce the network load (by not updating clients with data they dont need anyways, since they cannot see the actor and so on) I would not want to reinvent. As a coder I would ask me what tasks have to be done (see weapon overheat example), and where I can split server/client in order to minimize communciation. There is no way around updating the client as far it considers visual informations - the client '''is''' the visual frontend - but upon everything else the coder is free to decide where to perform the tasks. 

'''Andreas:''' To add, replication (especially simulated functions running on the client) might be usefull when someone wants to give clients different views or play different sounds locally.

'''FatalOverdose:''' In the first few paragraphs you say 'The truth is: Clients do mostly nothing.' and then a little further down you have 'However, client versions generally don't do much (First Myth).'

. its a bit confusing 

'''Solid Snake:''' This was asked by Mychaeel a long time ago, so I've converted my post into a wiki page, found here [[Legacy:Solid_Snake/A_Study_Of_Replication|A Study Of Replication]]

'''Tarquin:''' I think a simple tutorial would be fixing the example on [[Legacy:Using LocalMessages|Using LocalMessages]] to broadcast the message so clients can see it. Can anyone help me by suggesting how it might be done?

'''Ransico:''' Something that has bothered me for a long time, is there is no info on how to get something to run properly on -only- the client... for example, I was stuck on how to get a custom LOD actor working. The issue I had, was that the tick and timer events would never get called on the client.

The fix turned out to be that the client was deleting the object soon after its creation on the client, no matter what combo of defaultproperty switches I used.

There may be a better way to do it, but I set bNoDelete=true and it solved my problem. The entire source can be found here - someone else may find it useful, it also tells you how to make something run on the client: [[Legacy:Ransico/LODMesh|Ransico/LODMesh]]

'''Vitaloverdose:''' The page is called 'introduction to replication' so it was the first document i read on the subject but it begins with &quot;If you've read a few documents on replication&quot;. Maybe the 'myths of replication' bit might be better off further into the page or as part of a summery as its not introducing the subject so much as reviewing it.Im sure the page is very helpfull for the reader with prior knowledge of the subject but could be very confusing/unhelpful to anyone looking into the issue for the first time as it is referrencing aspects of replication that havent been explained at this point. 

'''Kiff:''' I attempted making a tutorial for function calls using PostNetReceive. It might be a little cluttered, so feel free to make suggestions and/or corrections. [[Legacy:Kiff|Kiff]]

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; Work to organize according to [[Legacy:Replication/Discussing|Replication/Discussing]].
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Invasion</title>
    <id>1518</id>
    <revision>
      <id>3799</id>
      <timestamp>2007-01-27T15:24:36Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Invasion is a team based gametype which comes standard with [[Legacy:UT2004|UT2004]] and with [[Legacy:UT2003|UT2003]] via bonus packs.  This [[Legacy:Gametype|gametype]] uses Deathmatch maps as its map list.

==Description==

{{innerbox| Alongside the other players, you must hold out as long as possible against the waves of attacking monsters.

}}

==Invasion Gameplay==

Invasion is a Team Game, but not in the conventional style.  Every player is on the same team (red) whose goal is to survive waves of attacking Monsters.  You are given a radar map to help you see the locations of your teammates and the Monsters.  The game starts with a small delay before Wave 1, so that your are able to obtain weapons.  After this period a 10 second countdown beigns, after which hostile Monsters will spawn at [[Legacy:PlayerStart|Player Starts]].  You must destroy these Monsters for a given length of time to complete the wave.  Then the 10 second countdown will begin for Wave 2.  Rinse and Repeat ;).

If you die during a wave, you are '''OUT''' for the remainder of that wave and you will have to scramble for weapons at the beginning of the next wave.  If at any stage All players are '''OUT''', the game is over and you have lost the match.  If at least one player survives each wave, after a configurable amount of waves (maximum and default 16), you will win the match.

Sounds easy? Not quite, as each wave is harder, introducing greater numbers of more difficult Monsters.

==Mods for Invasion==

Invasion in its raw form is much less popular than highly modified versions of the [[Legacy:Gametype|Gametype]].

Many UT2004 servers operate with one or more of the following modifications:
* [[Legacy:Instagib|Instagib]] [[Legacy:Mutator|Mutator]] (Standard UT2004)
* [http://mysterial.linuxgangster.org/UTRPG/ UT2004RPG] or Invasion RPG
* [http://fraghouse.beyondunreal.com/ut2004work.php Sharp Skins] by the Fraghouse Mod team
* [http://ut2004.gameamp.com/ut2004/viewUtcomp UTComp]
* Additional [[Legacy:Monster|Monsters]]
* [[Legacy:Weapon|Weapon]] Mods

Also worthy of mention is [http://fraghouse.beyondunreal.com/ut2004work.php Fraghouse Invasion], a complete rework of the invasion gametype by the Fraghouse mod Team. This Mod offers support for vehicles and a complete new set of weapons for your enjoyment.

==Invasion Class Details==

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; [[Legacy:XTeamGame|xTeamGame]] &gt;&gt; Invasion (Package: SkaarjPack)}}

This package (SkaarjPack.u) contains all classes relevant to the Invasion [[Legacy:Gametype|gametype]], the [[Legacy:Monster|Monsters]] in it, the weapon [[Legacy:DamageType|Damage Types]] and [[Legacy:Projectile|Projectiles]] they utilize, but excludes the [[Legacy:GUI|GUI]] classes.

==Structs==

===WaveInfo===

&lt;uscript&gt;
struct WaveInfo
{
	var() int	WaveMask;	// bit fields for which monsterclasses
	var() byte	WaveMaxMonsters;
	var() byte	WaveDuration;
	var() float	WaveDifficulty;
};
&lt;/uscript&gt;

==Properties==

===Magic Numbers===
; INVPROPNUM = 8 (const) : Used in InvasionPropText and InvasionDescTest.

===Main===
; WaveInfo Waves[16] (config) : ''TODO Add support for structs &amp; arrays to PlayInfo''

===Hidden===
; class&lt;[[Legacy:Monster|Monster]]&gt; MonsterClass[16] :
; class&lt;[[Legacy:Monster|Monster]]&gt; WaveMonsterClass[16] :
; class&lt;[[Legacy:Monster|Monster]]&gt; LastKilledMonsterClass :
; class&lt;[[Legacy:Monster|Monster]]&gt; FallbackMonster :
; float NextMonsterTime :
; float WaveEndTime :
; string WaveConfigMenu (config) :
; string FallbackMonsterClass :
; int InitialWave :
; int FinalWave :
; string InvasionPropText[INVPROPNUM] (localized) :
; string InvasionDescText[INVPROPNUM] (localized) :
; int NumMonsters :
; int MaxMonsters :
; int WaveNum :
; int WaveNumClasses :
; int WaveMonsters :
; int SecondBot :
; int WaveCountDown :
; bool bWaveInProgress :
; string InvasionBotNames[9] :
; sound NewRoundSound : ''OBSOLETE''
; sound InvasionEndSound[6] : ''OBSOLETE''
; name InvasionEnd[6] :

==Functions==
; PrecacheGameTextures( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) :
; PrecacheGameAnnouncements( [[Legacy:AnnouncerVoice|AnnouncerVoice]] V, bool bRewardSounds ) (static) :
; UpdateAnnouncements() (simulated) : EMPTY ''OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor''
; bool CanSpectate( [[Legacy:PlayerController|PlayerController]] Viewer, bool bOnlySpectator, Actor ViewTarget ) :
; OverrideInitialBots() : Sets &lt;tt&gt;InitialBots = Min(InitialBots,2)&lt;/tt&gt;.
; bool CheckEndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) :
; bool CheckMaxLives( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer ) : Checks if all other players are out
; ScoreKill( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other ) :
; NotifyKilled( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn ) :
; RestartPlayer( [[Legacy:Controller|Controller]] aPlayer ) : Unless &lt;tt&gt;aPlayer.PlayerReplicationInfo.bOutOfLives&lt;/tt&gt;, calls &lt;tt&gt;Super(GameInfo).RestartPlayer(aPlayer)&lt;/tt&gt;.
; [[Legacy:UnrealTeamInfo|UnrealTeamInfo]] GetBotTeam( optional int TeamBots ) : Returns Teams[0].
; byte PickTeam( byte num, [[Legacy:Controller|Controller]] C ) : Returns 0.
; Bot SpawnBot( optional string botName ) : Spawn and initialize a bot.
; int ReduceDamage( int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : 
; Killed( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : 
; AddMonster() :
; SetupWave() :
; SetupRandomWave() :
; PlayEndOfMatchMessage() :
; float RatePlayerStart( [[Legacy:NavigationPoint|NavigationPoint]] N, byte Team, [[Legacy:Controller|Controller]] Player ) : Rate whether player/monster should choose this NavigationPoint as its start.
; ReplenishWeapons( [[Legacy:Pawn|Pawn]] P ) :
; GetServerDetails( out ServerResponseLine ServerState ) : Adds Server Details, InitialWave and FinalWave for menu configuration.
; FillPlayInfo(PlayInfo PI) (static) : Sets up the configuration meny for Invasion, including InitialWave, FinalWave and Waves.

==Events==
; InitGame( string Options, out string Error ) : If no FallbackMonster, sets it to ElireKrall (see [[Legacy:Krall|Krall]]).  Sets &lt;tt&gt;MaxLives = 1&lt;/tt&gt;.  Sets &lt;tt&gt;bForceRespawn = true&lt;/tt&gt;.
; PreBeginPlay() : Sets &lt;tt&gt;WaveNum = InitialWave&lt;/tt&gt;.  Sets InvasionGameReplicationInfo and GameReplicationInfo properties.
; [[Legacy:PlayerController|PlayerController]] Login ( string Portal, string Options, out string Error ) :
; string GetDisplayText( string PropName ) (static) : Display label text for configuration menu.
; string GetDescriptionText(string PropName) (static) : Display description text for configuration menu.
; bool AcceptPlayInfoProperty(string PropertyName) (static) : 

==States==

===MatchInProgress===

====Functions====
; Timer() : While bWaveInProgress, handles Monster spawning.  Else, performs countdown and next wave setup.
; BeginState() : Sets &lt;tt&gt;WaveNum = InitialWave&lt;/tt&gt; and &lt;tt&gt;InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum&lt;/tt&gt;.

==Related Topics==
* [[Legacy:Monster|Monster]] &amp;ndash; Parent class for all Monsters in UT200x
** [[Legacy:MonsterController|MonsterController]] &amp;ndash; Controller class for Monsters
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Add Monsters to other gametypes
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For DM|Mapping for DM]]

==Discussion==

'''Nick89:''' 10 pages requesting! Not anymore ;) I thought i might help out :) Still very much a work in progress, feel free to rewrite everything ;)

'''SuperApe:''' Thanks.  You da man.  Yeah, I've probably been the one &quot;requesting&quot; this page in regards to Monsters, etc.  We really should have more [[Legacy:Gametype|Gametype]] pages for DM map games, but [[Legacy:LastManStanding|LastManStanding]] is actually a class name for the old UT GameInfo version.  Not sure what to do about that one.

'''Nick89:''' Nice edits :) Just a question, do you use some sort of program to parse these files and to create the API's that you put here? Or do you do it manually?

'''SuperApe:''' Manually.  I even do HTML manually. :D  But, I know I've seen mention of some kind of ''Wikifier'' somewhere around here. ([[Legacy:Class Wikifier|Class Wikifier]]) After a while, you just get to know the pages that need linking to, what words need &lt;nowiki&gt;[[&lt;/nowiki&gt;'s and such.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3800</id>
      <timestamp>2005-12-19T11:13:10Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Invasion is a team based gametype which comes standard with [[Legacy:UT2004|UT2004]].  This [[Legacy:Gametype|gametype]] uses Deathmatch maps as its map list.

==Description==

{{innerbox| Alongside the other players, you must hold out as long as possible against the waves of attacking monsters.

}}

==Invasion Gameplay==

Invasion is a Team Game, but not in the conventional style.  Every player is on the same team (red) whose goal is to survive waves of attacking Monsters.  You are given a radar map to help you see the locations of your teammates and the Monsters.  The game starts with a small delay before Wave 1, so that your are able to obtain weapons.  After this period a 10 second countdown beigns, after which hostile Monsters will spawn at [[Legacy:PlayerStart|Player Starts]].  You must destroy these Monsters for a given length of time to complete the wave.  Then the 10 second countdown will begin for Wave 2.  Rinse and Repeat ;).

If you die during a wave, you are '''OUT''' for the remainder of that wave and you will have to scramble for weapons at the beginning of the next wave.  If at any stage All players are '''OUT''', the game is over and you have lost the match.  If at least one player survives each wave, after a configurable amount of waves (maximum and default 16), you will win the match.

Sounds easy? Not quite, as each wave is harder, introducing greater numbers of more difficult Monsters.

==Mods for Invasion==

Invasion in its raw form is much less popular than highly modified versions of the [[Legacy:Gametype|Gametype]].

Many UT2004 servers operate with one or more of the following modifications:
* [[Legacy:Instagib|Instagib]] [[Legacy:Mutator|Mutator]] (Standard UT2004)
* [http://mysterial.linuxgangster.org/UTRPG/ UT2004RPG] or Invasion RPG
* [http://fraghouse.beyondunreal.com/ut2004work.php Sharp Skins] by the Fraghouse Mod team
* [http://ut2004.gameamp.com/ut2004/viewUtcomp UTComp]
* Additional [[Legacy:Monster|Monsters]]
* [[Legacy:Weapon|Weapon]] Mods

Also worthy of mention is [http://fraghouse.beyondunreal.com/ut2004work.php Fraghouse Invasion], a complete rework of the invasion gametype by the Fraghouse mod Team. This Mod offers support for vehicles and a complete new set of weapons for your enjoyment.

==Invasion Class Details==

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; [[Legacy:XTeamGame|xTeamGame]] &gt;&gt; Invasion (Package: SkaarjPack)}}

This package (SkaarjPack.u) contains all classes relevant to the Invasion [[Legacy:Gametype|gametype]], the [[Legacy:Monster|Monsters]] in it, the weapon [[Legacy:DamageType|Damage Types]] and [[Legacy:Projectile|Projectiles]] they utilize, but excludes the [[Legacy:GUI|GUI]] classes.

==Structs==

===WaveInfo===

&lt;uscript&gt;
struct WaveInfo
{
	var() int	WaveMask;	// bit fields for which monsterclasses
	var() byte	WaveMaxMonsters;
	var() byte	WaveDuration;
	var() float	WaveDifficulty;
};
&lt;/uscript&gt;

==Properties==

===Magic Numbers===
; INVPROPNUM = 8 (const) : Used in InvasionPropText and InvasionDescTest.

===Main===
; WaveInfo Waves[16] (config) : ''TODO Add support for structs &amp; arrays to PlayInfo''

===Hidden===
; class&lt;Monster&gt; MonsterClass[16] :
; class&lt;Monster&gt; WaveMonsterClass[16] :
; class&lt;Monster&gt; LastKilledMonsterClass :
; class&lt;Monster&gt; FallbackMonster :
; float NextMonsterTime :
; float WaveEndTime :
; string WaveConfigMenu (config) :
; string FallbackMonsterClass :
; int InitialWave :
; int FinalWave :
; string InvasionPropText[INVPROPNUM] (localized) :
; string InvasionDescText[INVPROPNUM] (localized) :
; int NumMonsters :
; int MaxMonsters :
; int WaveNum :
; int WaveNumClasses :
; int WaveMonsters :
; int SecondBot :
; int WaveCountDown :
; bool bWaveInProgress :
; string InvasionBotNames[9] :
; sound NewRoundSound : ''OBSOLETE''
; sound InvasionEndSound[6] : ''OBSOLETE''
; name InvasionEnd[6] :

==Functions==
; PrecacheGameTextures( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) :
; PrecacheGameAnnouncements( [[Legacy:AnnouncerVoice|AnnouncerVoice]] V, bool bRewardSounds ) (static) :
; UpdateAnnouncements() (simulated) : EMPTY ''OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor''
; bool CanSpectate( [[Legacy:PlayerController|PlayerController]] Viewer, bool bOnlySpectator, Actor ViewTarget ) :
; OverrideInitialBots() : Sets &lt;tt&gt;InitialBots = Min(InitialBots,2)&lt;/tt&gt;.
; bool CheckEndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) :
; bool CheckMaxLives( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer ) : Checks if all other players are out
; ScoreKill( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other ) :
; NotifyKilled( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn ) :
; RestartPlayer( [[Legacy:Controller|Controller]] aPlayer ) : Unless &lt;tt&gt;aPlayer.PlayerReplicationInfo.bOutOfLives&lt;/tt&gt;, calls &lt;tt&gt;Super(GameInfo).RestartPlayer(aPlayer)&lt;/tt&gt;.
; [[Legacy:UnrealTeamInfo|UnrealTeamInfo]] GetBotTeam( optional int TeamBots ) : Returns Teams[0].
; byte PickTeam( byte num, [[Legacy:Controller|Controller]] C ) : Returns 0.
; Bot SpawnBot( optional string botName ) : Spawn and initialize a bot.
; int ReduceDamage( int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : 
; Killed( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : 
; AddMonster() :
; SetupWave() :
; SetupRandomWave() :
; PlayEndOfMatchMessage() :
; float RatePlayerStart( [[Legacy:NavigationPoint|NavigationPoint]] N, byte Team, [[Legacy:Controller|Controller]] Player ) : Rate whether player/monster should choose this NavigationPoint as its start.
; ReplenishWeapons( [[Legacy:Pawn|Pawn]] P ) :
; GetServerDetails( out ServerResponseLine ServerState ) : Adds Server Details, InitialWave and FinalWave for menu configuration.
; FillPlayInfo(PlayInfo PI) (static) : Sets up the configuration meny for Invasion, including InitialWave, FinalWave and Waves.

==Events==
; InitGame( string Options, out string Error ) : If no FallbackMonster, sets it to ElireKrall (see [[Legacy:Krall|Krall]]).  Sets &lt;tt&gt;MaxLives = 1&lt;/tt&gt;.  Sets &lt;tt&gt;bForceRespawn = true&lt;/tt&gt;.
; PreBeginPlay() : Sets &lt;tt&gt;WaveNum = InitialWave&lt;/tt&gt;.  Sets InvasionGameReplicationInfo and GameReplicationInfo properties.
; [[Legacy:PlayerController|PlayerController]] Login ( string Portal, string Options, out string Error ) :
; string GetDisplayText( string PropName ) (static) : Display label text for configuration menu.
; string GetDescriptionText(string PropName) (static) : Display description text for configuration menu.
; bool AcceptPlayInfoProperty(string PropertyName) (static) : 

==States==

===MatchInProgress===

====Functions====
; Timer() : While bWaveInProgress, handles Monster spawning.  Else, performs countdown and next wave setup.
; BeginState() : Sets &lt;tt&gt;WaveNum = InitialWave&lt;/tt&gt; and &lt;tt&gt;InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum&lt;/tt&gt;.

==Related Topics==
* [[Legacy:Monster|Monster]] &amp;ndash; Parent class for all Monsters in UT2004
** [[Legacy:MonsterController|MonsterController]] &amp;ndash; Controller class for Monsters
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Add Monsters to other gametypes
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For DM|Mapping for DM]]

==Discussion==

'''Nick89:''' 10 pages requesting! Not anymore ;) I thought i might help out :) Still very much a work in progress, feel free to rewrite everything ;)

'''SuperApe:''' Thanks.  You da man.  Yeah, I've probably been the one &quot;requesting&quot; this page in regards to Monsters, etc.  We really should have more [[Legacy:Gametype|Gametype]] pages for DM map games, but [[Legacy:LastManStanding|LastManStanding]] is actually a class name for the old UT GameInfo version.  Not sure what to do about that one.

'''Nick89:''' Nice edits :) Just a question, do you use some sort of program to parse these files and to create the API's that you put here? Or do you do it manually?

'''SuperApe:''' Manually.  I even do HTML manually. :D  But, I know I've seen mention of some kind of ''Wikifier'' somewhere around here.  After a while, you just get to know the pages that need linking to, what words need &lt;nowiki&gt;[[&lt;/nowiki&gt;'s and such.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3801</id>
      <timestamp>2006-01-05T06:30:32Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Invasion is a team based gametype which comes standard with [[Legacy:UT2004|UT2004]].  This [[Legacy:Gametype|gametype]] uses Deathmatch maps as its map list.

==Description==

{{innerbox| Alongside the other players, you must hold out as long as possible against the waves of attacking monsters.

}}

==Invasion Gameplay==

Invasion is a Team Game, but not in the conventional style.  Every player is on the same team (red) whose goal is to survive waves of attacking Monsters.  You are given a radar map to help you see the locations of your teammates and the Monsters.  The game starts with a small delay before Wave 1, so that your are able to obtain weapons.  After this period a 10 second countdown beigns, after which hostile Monsters will spawn at [[Legacy:PlayerStart|Player Starts]].  You must destroy these Monsters for a given length of time to complete the wave.  Then the 10 second countdown will begin for Wave 2.  Rinse and Repeat ;).

If you die during a wave, you are '''OUT''' for the remainder of that wave and you will have to scramble for weapons at the beginning of the next wave.  If at any stage All players are '''OUT''', the game is over and you have lost the match.  If at least one player survives each wave, after a configurable amount of waves (maximum and default 16), you will win the match.

Sounds easy? Not quite, as each wave is harder, introducing greater numbers of more difficult Monsters.

==Mods for Invasion==

Invasion in its raw form is much less popular than highly modified versions of the [[Legacy:Gametype|Gametype]].

Many UT2004 servers operate with one or more of the following modifications:
* [[Legacy:Instagib|Instagib]] [[Legacy:Mutator|Mutator]] (Standard UT2004)
* [http://mysterial.linuxgangster.org/UTRPG/ UT2004RPG] or Invasion RPG
* [http://fraghouse.beyondunreal.com/ut2004work.php Sharp Skins] by the Fraghouse Mod team
* [http://ut2004.gameamp.com/ut2004/viewUtcomp UTComp]
* Additional [[Legacy:Monster|Monsters]]
* [[Legacy:Weapon|Weapon]] Mods

Also worthy of mention is [http://fraghouse.beyondunreal.com/ut2004work.php Fraghouse Invasion], a complete rework of the invasion gametype by the Fraghouse mod Team. This Mod offers support for vehicles and a complete new set of weapons for your enjoyment.

==Invasion Class Details==

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameInfo|GameInfo]] &gt;&gt; [[Legacy:DeathMatch|DeathMatch]] &gt;&gt; [[Legacy:TeamGame|TeamGame]] &gt;&gt; [[Legacy:XTeamGame|xTeamGame]] &gt;&gt; Invasion (Package: SkaarjPack)}}

This package (SkaarjPack.u) contains all classes relevant to the Invasion [[Legacy:Gametype|gametype]], the [[Legacy:Monster|Monsters]] in it, the weapon [[Legacy:DamageType|Damage Types]] and [[Legacy:Projectile|Projectiles]] they utilize, but excludes the [[Legacy:GUI|GUI]] classes.

==Structs==

===WaveInfo===

&lt;uscript&gt;
struct WaveInfo
{
	var() int	WaveMask;	// bit fields for which monsterclasses
	var() byte	WaveMaxMonsters;
	var() byte	WaveDuration;
	var() float	WaveDifficulty;
};
&lt;/uscript&gt;

==Properties==

===Magic Numbers===
; INVPROPNUM = 8 (const) : Used in InvasionPropText and InvasionDescTest.

===Main===
; WaveInfo Waves[16] (config) : ''TODO Add support for structs &amp; arrays to PlayInfo''

===Hidden===
; class&lt;[[Legacy:Monster|Monster]]&gt; MonsterClass[16] :
; class&lt;[[Legacy:Monster|Monster]]&gt; WaveMonsterClass[16] :
; class&lt;[[Legacy:Monster|Monster]]&gt; LastKilledMonsterClass :
; class&lt;[[Legacy:Monster|Monster]]&gt; FallbackMonster :
; float NextMonsterTime :
; float WaveEndTime :
; string WaveConfigMenu (config) :
; string FallbackMonsterClass :
; int InitialWave :
; int FinalWave :
; string InvasionPropText[INVPROPNUM] (localized) :
; string InvasionDescText[INVPROPNUM] (localized) :
; int NumMonsters :
; int MaxMonsters :
; int WaveNum :
; int WaveNumClasses :
; int WaveMonsters :
; int SecondBot :
; int WaveCountDown :
; bool bWaveInProgress :
; string InvasionBotNames[9] :
; sound NewRoundSound : ''OBSOLETE''
; sound InvasionEndSound[6] : ''OBSOLETE''
; name InvasionEnd[6] :

==Functions==
; PrecacheGameTextures( [[Legacy:LevelInfo|LevelInfo]] myLevel ) (static) :
; PrecacheGameAnnouncements( [[Legacy:AnnouncerVoice|AnnouncerVoice]] V, bool bRewardSounds ) (static) :
; UpdateAnnouncements() (simulated) : EMPTY ''OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor''
; bool CanSpectate( [[Legacy:PlayerController|PlayerController]] Viewer, bool bOnlySpectator, Actor ViewTarget ) :
; OverrideInitialBots() : Sets &lt;tt&gt;InitialBots = Min(InitialBots,2)&lt;/tt&gt;.
; bool CheckEndGame( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Winner, string Reason ) :
; bool CheckMaxLives( [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Scorer ) : Checks if all other players are out
; ScoreKill( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Other ) :
; NotifyKilled( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn ) :
; RestartPlayer( [[Legacy:Controller|Controller]] aPlayer ) : Unless &lt;tt&gt;aPlayer.PlayerReplicationInfo.bOutOfLives&lt;/tt&gt;, calls &lt;tt&gt;Super(GameInfo).RestartPlayer(aPlayer)&lt;/tt&gt;.
; [[Legacy:UnrealTeamInfo|UnrealTeamInfo]] GetBotTeam( optional int TeamBots ) : Returns Teams[0].
; byte PickTeam( byte num, [[Legacy:Controller|Controller]] C ) : Returns 0.
; Bot SpawnBot( optional string botName ) : Spawn and initialize a bot.
; int ReduceDamage( int Damage, [[Legacy:Pawn|Pawn]] injured, [[Legacy:Pawn|Pawn]] instigatedBy, vector HitLocation, out vector Momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : 
; Killed( [[Legacy:Controller|Controller]] Killer, [[Legacy:Controller|Controller]] Killed, [[Legacy:Pawn|Pawn]] KilledPawn, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : 
; AddMonster() :
; SetupWave() :
; SetupRandomWave() :
; PlayEndOfMatchMessage() :
; float RatePlayerStart( [[Legacy:NavigationPoint|NavigationPoint]] N, byte Team, [[Legacy:Controller|Controller]] Player ) : Rate whether player/monster should choose this NavigationPoint as its start.
; ReplenishWeapons( [[Legacy:Pawn|Pawn]] P ) :
; GetServerDetails( out ServerResponseLine ServerState ) : Adds Server Details, InitialWave and FinalWave for menu configuration.
; FillPlayInfo(PlayInfo PI) (static) : Sets up the configuration meny for Invasion, including InitialWave, FinalWave and Waves.

==Events==
; InitGame( string Options, out string Error ) : If no FallbackMonster, sets it to ElireKrall (see [[Legacy:Krall|Krall]]).  Sets &lt;tt&gt;MaxLives = 1&lt;/tt&gt;.  Sets &lt;tt&gt;bForceRespawn = true&lt;/tt&gt;.
; PreBeginPlay() : Sets &lt;tt&gt;WaveNum = InitialWave&lt;/tt&gt;.  Sets InvasionGameReplicationInfo and GameReplicationInfo properties.
; [[Legacy:PlayerController|PlayerController]] Login ( string Portal, string Options, out string Error ) :
; string GetDisplayText( string PropName ) (static) : Display label text for configuration menu.
; string GetDescriptionText(string PropName) (static) : Display description text for configuration menu.
; bool AcceptPlayInfoProperty(string PropertyName) (static) : 

==States==

===MatchInProgress===

====Functions====
; Timer() : While bWaveInProgress, handles Monster spawning.  Else, performs countdown and next wave setup.
; BeginState() : Sets &lt;tt&gt;WaveNum = InitialWave&lt;/tt&gt; and &lt;tt&gt;InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum&lt;/tt&gt;.

==Related Topics==
* [[Legacy:Monster|Monster]] &amp;ndash; Parent class for all Monsters in UT2004
** [[Legacy:MonsterController|MonsterController]] &amp;ndash; Controller class for Monsters
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Add Monsters to other gametypes
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For DM|Mapping for DM]]

==Discussion==

'''Nick89:''' 10 pages requesting! Not anymore ;) I thought i might help out :) Still very much a work in progress, feel free to rewrite everything ;)

'''SuperApe:''' Thanks.  You da man.  Yeah, I've probably been the one &quot;requesting&quot; this page in regards to Monsters, etc.  We really should have more [[Legacy:Gametype|Gametype]] pages for DM map games, but [[Legacy:LastManStanding|LastManStanding]] is actually a class name for the old UT GameInfo version.  Not sure what to do about that one.

'''Nick89:''' Nice edits :) Just a question, do you use some sort of program to parse these files and to create the API's that you put here? Or do you do it manually?

'''SuperApe:''' Manually.  I even do HTML manually. :D  But, I know I've seen mention of some kind of ''Wikifier'' somewhere around here. ([[Legacy:Class Wikifier|Class Wikifier]]) After a while, you just get to know the pages that need linking to, what words need &lt;nowiki&gt;[[&lt;/nowiki&gt;'s and such.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InvasionBot</title>
    <id>28317</id>
    <revision>
      <id>39984</id>
      <timestamp>2009-11-14T20:12:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inventory</title>
    <id>1459</id>
    <revision>
      <id>3663</id>
      <timestamp>2007-01-27T01:21:31Z</timestamp>
      <contributor>
        <ip>Eliot</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Inventory (Package: Engine)}}

Inventory is the abstract parent class of all actors that can be carried by [[Legacy:Pawn|Pawn]]s. In rough terms, this is things carried by players: weapons, ammo, and so on. But Inventory classes are also used for things that aren't visible: for instance, when a player has special ability (some sort of power-up) this can be represented by them carrying a piece of inventory which is responsible for making changes to the player (such as adding a visual effect or changing the HUD or changing the player's properties).

Each inventory class knows what pickup can spawn it (its PickupClass). When tossed out (using the DropFrom() function), inventory items replace themselves with an actor of their Pickup class.

All of a Pawn's Inventory actors are in a [[Legacy:Linked List|linked list]] which uses the [[Legacy:Actor/Properties|Actor]] -&gt; Inventory property. Inventory is automatically destroyed when the actor carrying in is destroyed, or the player carrying it dies.

==Properties==

===Main===
; bool bDrawingFirstPerson :  Determines if we're in 1st person.
; float BobDamping :  How much to damp view bob.
; IntBox IconCoords :  Coordinates of icon in IconMaterial.
; Material IconMaterial :  Where icon is located.
; string ItemName :  Localized name of item.

===Firstperson===
; vector PlayerViewOffset :  Offset from view center.  
; rotator PlayerViewPivot :  Additive rotation offset for tweaks.

===Hidden===
; class&lt;[[Legacy:InventoryAttachment|InventoryAttachment]]&gt; AttachmentClass :  
; bool bDisplayableInv :  Determines whether the item should be displayed in the HUD.  
; bool bTossedOut :  True if weapon or inventory was tossed out (so players can't cheat w/ weaponstay)  
; byte GroupOffset :  Position within inventory group. (used by prevweapon and nextweapon)                   
; class&lt;[[Legacy:Pickup|Pickup]]&gt; PickupClass :  What class of pickup is associated with this inventory item  
; Actor ThirdPersonActor :  Mesh to use in 3rd person view.

==Functions==
; AttachToPawn( [[Legacy:Pawn|Pawn]] P ) : Attach inventory item to pawn.
; updaterelative( int pitch, int yaw, int roll ) (exec) : For tweaking weapon positioning.  Pass in a new relativerotation, and use the weapon editactor properties sheet to modify the relativelocation
; DetachFromPawn( [[Legacy:Pawn|Pawn]] P ) : Detach inventory item from pawn.
; string GetHumanReadableName() (simulated) : Returns the name of the object.
; PickupFunction( [[Legacy:Pawn|Pawn]] Other) : Function called when the item is picked up.
; Weapon RecommendWeapon( out float rating ) (simulated) : Rate the inventory item as a weapon.
; TravelPostAccept() :
; Destroyed() : Called when the inventory item is to be destroyed for release of resources, etc.
; GiveTo( [[Legacy:Pawn|Pawn]] Other, optional [[Legacy:Pickup|Pickup]] Pickup ) : Give inventory item to another pawn.
; bool HandlePickupQuery( [[Legacy:Pickup|Pickup]] Item ) : Determines whether or not the item can be picked up based on other items in the pawn's inventory.
; Powerups SelectNext() : Select next inventory (powerup) item.
; DropFrom( vector StartLocation ) : Drop inventory item.
; Use( float Value ) : Use inventory item.
; [[Legacy:Weapon|Weapon]] WeaponChange( byte F, bool bSilent ) (simulated) : Find a weapon in inventory that has an Inventory Group matching F.
; [[Legacy:Weapon|Weapon]] PrevWeapon( [[Legacy:Weapon|Weapon]] CurrentChoice, [[Legacy:Weapon|Weapon]] CurrentWeapon ) (simulated) : Choose previous weapon.
; [[Legacy:Weapon|Weapon]] NextWeapon( [[Legacy:Weapon|Weapon]] CurrentChoice, [[Legacy:Weapon|Weapon]] CurrentWeapon ) (simulated) : Choose next weapon.
; [[Legacy:Armor|Armor]] PrioritizeArmor( int Damage, class&lt;DamageType&gt; DamageType, vector HitLocation ) : Return the best armor to use.
; OwnerEvent( name EventName ) : Used to inform inventory when owner event occurs (for example jumping or weapon change).
; SetOwnerDisplay() : Used to ask inventory if it needs to affect its owners display properties.
; string StaticItemName() (static) : Returns item name.

==Events==
; RenderOverlays( [[Legacy:Canvas|Canvas]] Canvas ) (simulated) : Render inventory icon, if necessary.  Most inventory items are not rendered, except weapons.
; TravelPreAccept() : Called after a travelling inventory item has been accepted into a level.  '''Unknown:''' Anyone want to elaborate?

==Known Subclasses==
 Inventory
  +- [[Legacy:Ammunition|Ammunition]] &gt;&gt;
  +- [[Legacy:KeyInventory|KeyInventory]]
  +- [[Legacy:Powerups|Powerups]]
  |   +- [[Legacy:Armor|Armor]]
  +- [[Legacy:Weapon|Weapon]] &gt;&gt;

==Related Topics==
* [[Legacy:Pickup|Pickup]]

==Discussion==

'''Tarquin:''' When a player dies, all [[Legacy:Inventory|Inventory]] actors he holds are destroyed. Any way to prevent this &amp;ndash; either have them dropped, or have them remain owned in the player's inventory?

'''Recondite''' I'd look in MutUDamageReward and UDamageRules for dropping them, don't know about the other being that easy.

'''SuperApe:''' Marked up functions and events.  Added Category tags, related topics and subclass tree.

'''Eliot:''' Fixed category class ther both was UT2003 :/.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3664</id>
      <timestamp>2005-11-22T19:18:11Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Inventory (Package: Engine)}}

Inventory is the abstract parent class of all actors that can be carried by [[Legacy:Pawn|Pawn]]s. In rough terms, this is things carried by players: weapons, ammo, and so on. But Inventory classes are also used for things that aren't visible: for instance, when a player has special ability (some sort of power-up) this can be represented by them carrying a piece of inventory which is responsible for making changes to the player (such as adding a visual effect or changing the HUD or changing the player's properties).

Each inventory class knows what pickup can spawn it (its PickupClass). When tossed out (using the DropFrom() function), inventory items replace themselves with an actor of their Pickup class.

All of a Pawn's Inventory actors are in a [[Legacy:Linked List|linked list]] which uses the [[Legacy:Actor/Properties|Actor]] -&gt; Inventory property. Inventory is automatically destroyed when the actor carrying in is destroyed, or the player carrying it dies.

==Properties==

===Main===
; bool bDrawingFirstPerson :  Determines if we're in 1st person.
; float BobDamping :  How much to damp view bob.
; IntBox IconCoords :  Coordinates of icon in IconMaterial.
; Material IconMaterial :  Where icon is located.
; string ItemName :  Localized name of item.

===Firstperson===
; vector PlayerViewOffset :  Offset from view center.  
; rotator PlayerViewPivot :  Additive rotation offset for tweaks.

===Hidden===
; class&lt;[[Legacy:InventoryAttachment|InventoryAttachment]]&gt; AttachmentClass :  
; bool bDisplayableInv :  Determines whether the item should be displayed in the HUD.  
; bool bTossedOut :  True if weapon or inventory was tossed out (so players can't cheat w/ weaponstay)  
; byte GroupOffset :  Position within inventory group. (used by prevweapon and nextweapon)                   
; class&lt;[[Legacy:Pickup|Pickup]]&gt; PickupClass :  What class of pickup is associated with this inventory item  
; Actor ThirdPersonActor :  Mesh to use in 3rd person view.

==Functions==
; AttachToPawn( [[Legacy:Pawn|Pawn]] P ) : Attach inventory item to pawn.
; updaterelative( int pitch, int yaw, int roll ) (exec) : For tweaking weapon positioning.  Pass in a new relativerotation, and use the weapon editactor properties sheet to modify the relativelocation
; DetachFromPawn( [[Legacy:Pawn|Pawn]] P ) : Detach inventory item from pawn.
; string GetHumanReadableName() (simulated) : Returns the name of the object.
; PickupFunction( [[Legacy:Pawn|Pawn]] Other) : Function called when the item is picked up.
; Weapon RecommendWeapon( out float rating ) (simulated) : Rate the inventory item as a weapon.
; TravelPostAccept() :
; Destroyed() : Called when the inventory item is to be destroyed for release of resources, etc.
; GiveTo( [[Legacy:Pawn|Pawn]] Other, optional [[Legacy:Pickup|Pickup]] Pickup ) : Give inventory item to another pawn.
; bool HandlePickupQuery( [[Legacy:Pickup|Pickup]] Item ) : Determines whether or not the item can be picked up based on other items in the pawn's inventory.
; Powerups SelectNext() : Select next inventory (powerup) item.
; DropFrom( vector StartLocation ) : Drop inventory item.
; Use( float Value ) : Use inventory item.
; [[Legacy:Weapon|Weapon]] WeaponChange( byte F, bool bSilent ) (simulated) : Find a weapon in inventory that has an Inventory Group matching F.
; [[Legacy:Weapon|Weapon]] PrevWeapon( [[Legacy:Weapon|Weapon]] CurrentChoice, [[Legacy:Weapon|Weapon]] CurrentWeapon ) (simulated) : Choose previous weapon.
; [[Legacy:Weapon|Weapon]] NextWeapon( [[Legacy:Weapon|Weapon]] CurrentChoice, [[Legacy:Weapon|Weapon]] CurrentWeapon ) (simulated) : Choose next weapon.
; [[Legacy:Armor|Armor]] PrioritizeArmor( int Damage, class&lt;DamageType&gt; DamageType, vector HitLocation ) : Return the best armor to use.
; OwnerEvent( name EventName ) : Used to inform inventory when owner event occurs (for example jumping or weapon change).
; SetOwnerDisplay() : Used to ask inventory if it needs to affect its owners display properties.
; string StaticItemName() (static) : Returns item name.

==Events==
; RenderOverlays( [[Legacy:Canvas|Canvas]] Canvas ) (simulated) : Render inventory icon, if necessary.  Most inventory items are not rendered, except weapons.
; TravelPreAccept() : Called after a travelling inventory item has been accepted into a level.  '''Unknown:''' Anyone want to elaborate?

==Known Subclasses==
 Inventory
  +- [[Legacy:Ammunition|Ammunition]] &gt;&gt;
  +- [[Legacy:KeyInventory|KeyInventory]]
  +- [[Legacy:Powerups|Powerups]]
  |   +- [[Legacy:Armor|Armor]]
  +- [[Legacy:Weapon|Weapon]] &gt;&gt;

==Related Topics==
* [[Legacy:Pickup|Pickup]]

==Discussion==

'''Tarquin:''' When a player dies, all [[Legacy:Inventory|Inventory]] actors he holds are destroyed. Any way to prevent this &amp;ndash; either have them dropped, or have them remain owned in the player's inventory?

'''Recondite''' I'd look in MutUDamageReward and UDamageRules for dropping them, don't know about the other being that easy.

'''SuperApe:''' Marked up functions and events.  Added Category tags, related topics and subclass tree.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inventory (DX)</title>
    <id>1501</id>
    <revision>
      <id>3762</id>
      <timestamp>2004-02-10T05:04:21Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; Inventory (Engine)}}

The inventory class, the parent class of all objects which can be

picked up and carried by actors.

== Changes from UT == 

* DX new property LandSound()

Other new properties:

&lt;uscript&gt;
var bool					bCanUseObjectBelt; // Can this object be placed on the object belt?
var texture					largeIcon;         // Larger-than-usual icon for the inventory window
var int						largeIconWidth;    // Width of graphic in texture
var int						largeIconHeight;   // Height of graphic in texture
var int						invSlotsX;         // Number of horizontal inv. slots this item takes
var int						invSlotsY;         // Number of vertical inv. slots this item takes
var travel int				invPosX;           // X position on the inventory window
var travel int				invPosY;           // Y position on the inventory window
var travel bool				bInObjectBelt;     // Is this object actually in the object belt?
var travel int				beltPos;           // Position on the object belt
var() localized String		description;       // Description
var localized String		beltDescription;   // Description used on the object belt
&lt;/uscript&gt;
* replication changed
* function PostBeginPlay() changed
* function CalcDrawOffset() not final in DX
* funciton BecomePickup() changed
* function BecomeItem() changed
* function DropFrom() changed
* DX new function PlayLandingSound()

State: pickup

* UT Touch() function changed to DX Frob()
* Landed() function changed
* DX hs no Timer() function, items remain in world forever
* funciton BeginState() changed

Not in state anymore
* new function UpdateInfo()
* new funciton TestMPBeltSpot
* whole mess of changed defaultproperties

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inventory (UT)</title>
    <id>1481</id>
    <revision>
      <id>3717</id>
      <timestamp>2004-01-18T13:02:07Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Inventory (Package: Engine)}}

Abstract parent class of all objects that can be picked up by players or other actors.

The corresponding class [[Legacy:Inventory|Inventory]] in UT2003 only represents objects in a player's inventory. UT2003 pickups have a seperate base class called [[Legacy:Pickup|Pickup]].

===UT inventory items ===

It's worth mentioning here that inventory items for Unreal Tournament can be tricky to locate in the class tree. This is because Unreal Tournament is built on top of the Unreal 1 engine.

* weapons in: Inventory &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]]
* ammo in: Inventory &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]]
* health in: Inventory &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]]
* other pickups in: Inventory &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]]

===Timer Events ===

If you need an inventory item to fire a timer after it has been created, make sure the timer is initialised after the call to Inventory.GiveTo().  Inventory.GiveTo() calls Inventory.BecomeItem() which turns the timer off.

==Properties ==

These are the comments from the class script, most probably need padding out a little.

; AutoSwitchPriority :  Autoswitch value, 0=never autoswitch.
; InventoryGroup :  The weapon/inventory set, 1-9 (0=none).
; bActivatable :  Whether item can be activated.
; bDisplayableInv :  Item displayed in HUD.
; bInstantRespawn :  Can be tagged so this item respawns instantly.
; bRotatingPickup :  Rotates when in pickup state.
; PickupMessage :  Human readable description when picked up.
; ItemName :  Human readable name of item
; ItemArticle :  Human readable article (e.g. &quot;a&quot;, &quot;an&quot;)
; RespawnTime :  Respawn after this time, 0 for instant.
; PlayerViewOffset :  Offset from view center.
; PlayerViewMesh :  Mesh to render.
; PlayerViewScale :  Mesh scale.
; BobDamping :  how much to damp view bob
; PickupViewMesh :  Mesh to render.
; PickupViewScale :  Mesh scale.
; ThirdPersonMesh :  Mesh to render.
; ThirdPersonScale :  Mesh scale.
; StatusIcon :  Icon used with ammo/charge/power count.
; ProtectionType1 :  Protects against DamageType (None if non-armor).
; ProtectionType2 :  Secondary protection type (None if non-armor).
; Charge :  Amount of armor or charge if not an armor (charge in time*10).
; ArmorAbsorption :  Percent of damage item absorbs 0-100.
; bIsAnArmor :  Item will protect player.
; AbsorptionPriority :  Which items absorb damage first (higher=first).
; NextArmor :  Temporary list created by Armors to prioritize damage absorption.
; MaxDesireability :  Maximum desireability this item will ever have.
; PickupSound, ActivateSound, DeActivateSound, RespawnSound : 
; Icon : 
; M_Activated : 
; M_Selected : 
; M_Deactivated : 
; PickupMessageClass : 
; ItemMessageClass : 

===MuzzleFlash ===
; bMuzzleFlashParticles : 
; bToggleSteadyFlash : 
; MuzzleFlashStyle : 
; MuzzleFlashMesh : 
; MuzzleFlashScale : 
; MuzzleFlashTexture : 

===Display ===

Inventory adds an extra property to the Display group:
;  bAmbientGlow : 

==Known Subclasses ==
* [[Legacy:LadderInventory|LadderInventory]]
* [[Legacy:Pickup (UT)|Pickup (UT)]]
* [[Legacy:TrapSpringer|TrapSpringer]]
* [[Legacy:Weapon (UT)|Weapon (UT)]]

* [[Legacy:EnhancedItems|MultiPickupPlus]] ([[Legacy:EnhancedItems|EnhancedItems]])
* [[Legacy:MultiItem|MultiItem]] (Chaos UT)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3718</id>
      <timestamp>2003-10-24T22:49:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Inventory (Package: Engine)}}

Abstract parent class of all objects that can be picked up by players or other actors.

The corresponding class [[Legacy:Inventory|Inventory]] in UT2003 only represents objects in a player's inventory. UT2003 pickups have a seperate base class called [[Legacy:Pickup|Pickup]].

===UT inventory items ===

It's worth mentioning here that inventory items for Unreal Tournament can be tricky to locate in the class tree. This is because Unreal Tournament is built on top of the Unreal 1 engine.

* weapons in: Inventory &gt;&gt; [[Legacy:Weapon (UT)|Weapon (UT)]] &gt;&gt; [[Legacy:TournamentWeapon|TournamentWeapon]]
* ammo in: Inventory &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]]
* health in: Inventory &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]]
* other pickups in: Inventory &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]]

==Properties ==

These are the comments from the class script, most probably need padding out a little.

; AutoSwitchPriority :  Autoswitch value, 0=never autoswitch.
; InventoryGroup :  The weapon/inventory set, 1-9 (0=none).
; bActivatable :  Whether item can be activated.
; bDisplayableInv :  Item displayed in HUD.
; bInstantRespawn :  Can be tagged so this item respawns instantly.
; bRotatingPickup :  Rotates when in pickup state.
; PickupMessage :  Human readable description when picked up.
; ItemName :  Human readable name of item
; ItemArticle :  Human readable article (e.g. &quot;a&quot;, &quot;an&quot;)
; RespawnTime :  Respawn after this time, 0 for instant.
; PlayerViewOffset :  Offset from view center.
; PlayerViewMesh :  Mesh to render.
; PlayerViewScale :  Mesh scale.
; BobDamping :  how much to damp view bob
; PickupViewMesh :  Mesh to render.
; PickupViewScale :  Mesh scale.
; ThirdPersonMesh :  Mesh to render.
; ThirdPersonScale :  Mesh scale.
; StatusIcon :  Icon used with ammo/charge/power count.
; ProtectionType1 :  Protects against DamageType (None if non-armor).
; ProtectionType2 :  Secondary protection type (None if non-armor).
; Charge :  Amount of armor or charge if not an armor (charge in time*10).
; ArmorAbsorption :  Percent of damage item absorbs 0-100.
; bIsAnArmor :  Item will protect player.
; AbsorptionPriority :  Which items absorb damage first (higher=first).
; NextArmor :  Temporary list created by Armors to prioritize damage absorption.
; MaxDesireability :  Maximum desireability this item will ever have.
; PickupSound, ActivateSound, DeActivateSound, RespawnSound : 
; Icon : 
; M_Activated : 
; M_Selected : 
; M_Deactivated : 
; PickupMessageClass : 
; ItemMessageClass : 

===MuzzleFlash ===
; bMuzzleFlashParticles : 
; bToggleSteadyFlash : 
; MuzzleFlashStyle : 
; MuzzleFlashMesh : 
; MuzzleFlashScale : 
; MuzzleFlashTexture : 

===Display ===

Inventory adds an extra property to the Display group:
;  bAmbientGlow : 

==Known Subclasses ==
* [[Legacy:LadderInventory|LadderInventory]]
* [[Legacy:Pickup (UT)|Pickup (UT)]]
* [[Legacy:TrapSpringer|TrapSpringer]]
* [[Legacy:Weapon (UT)|Weapon (UT)]]

* [[Legacy:EnhancedItems|MultiPickupPlus]] ([[Legacy:EnhancedItems|EnhancedItems]])
* [[Legacy:MultiItem|MultiItem]] (Chaos UT)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inventory Class Tree (DX)</title>
    <id>1502</id>
    <revision>
      <id>3763</id>
      <timestamp>2004-02-11T01:47:41Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve"> [[Legacy:Inventory (DX)|Inventory (DX)]]
 +&amp;ndash; [[Legacy:DataVaultImage (DX)|DataVaultImage (DX)]]
 |   +&amp;ndash; [[Legacy:Image01_GunFireSensor (DX)|Image01_GunFireSensor (DX)]]
 |   +&amp;ndash; [[Legacy:Image01_LibertyIsland (DX)|Image01_LibertyIsland (DX)]]
 |   +&amp;ndash; [[Legacy:Image01_TerroristCommander (DX)|Image01_TerroristCommander (DX)]]
 |   +&amp;ndash; [[Legacy:Image02_Ambrosia_Flyer (DX)|Image02_Ambrosia_Flyer (DX)]]
 |   +&amp;ndash; [[Legacy:Image02_BobPage_ManOfYear (DX)|Image02_BobPage_ManOfYear (DX)]]
 |   +&amp;ndash; [[Legacy:Image02_NYC_Warehouse (DX)|Image02_NYC_Warehouse (DX)]]
 |   +&amp;ndash; [[Legacy:Image03_747Diagram (DX)|Image03_747Diagram (DX)]]
 |   +&amp;ndash; [[Legacy:Image03_NYC_Airfield (DX)|Image03_NYC_Airfield (DX)]]
 |   +&amp;ndash; [[Legacy:Image03_WaltonSimons (DX)|Image03_WaltonSimons (DX)]]
 |   +&amp;ndash; [[Legacy:Image04_NSFHeadquarters (DX)|Image04_NSFHeadquarters (DX)]]
 |   +&amp;ndash; [[Legacy:Image04_UNATCONotice (DX)|Image04_UNATCONotice (DX)]]
 |   +&amp;ndash; [[Legacy:Image05_GreaselDisection (DX)|Image05_GreaselDisection (DX)]]
 |   +&amp;ndash; [[Legacy:Image05_NYC_MJ12Lab (DX)|Image05_NYC_MJ12Lab (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_Market (DX)|Image06_HK_Market (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_MJ12Helipad (DX)|Image06_HK_MJ12Helipad (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_MJ12Lab (DX)|Image06_HK_MJ12Lab (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_Versalife (DX)|Image06_HK_Versalife (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_WanChai (DX)|Image06_HK_WanChai (DX)]]
 |   +&amp;ndash; [[Legacy:Image08_JoeGreenMIBMJ12 (DX)|Image08_JoeGreenMIBMJ12 (DX)]]
 |   +&amp;ndash; [[Legacy:Image09_NYC_Ship_Bottom (DX)|Image09_NYC_Ship_Bottom (DX)]]
 |   +&amp;ndash; [[Legacy:Image09_NYC_Ship_Top (DX)|Image09_NYC_Ship_Top (DX)]]
 |   +&amp;ndash; [[Legacy:Image10_Paris_Catacombs (DX)|Image10_Paris_Catacombs (DX)]]
 |   +&amp;ndash; [[Legacy:Image10_Paris_CatacombsTunnels (DX)|Image10_Paris_CatacombsTunnels (DX)]]
 |   +&amp;ndash; [[Legacy:Image10_Paris_Metro (DX)|Image10_Paris_Metro (DX)]]
 |   +&amp;ndash; [[Legacy:Image11_Paris_Cathedral (DX)|Image11_Paris_Cathedral (DX)]]
 |   +&amp;ndash; [[Legacy:Image11_Paris_CathedralEntrance (DX)|Image11_Paris_CathedralEntrance (DX)]]
 |   +&amp;ndash; [[Legacy:Image12_Tiffany_HostagePic (DX)|Image12_Tiffany_HostagePic (DX)]]
 |   +&amp;ndash; [[Legacy:Image12_Vandenberg_Command (DX)|Image12_Vandenberg_Command (DX)]]
 |   +&amp;ndash; [[Legacy:Image12_Vandenberg_Sub (DX)|Image12_Vandenberg_Sub (DX)]]
 |   +&amp;ndash; [[Legacy:Image14_OceanLab (DX)|Image14_OceanLab (DX)]]
 |   +&amp;ndash; [[Legacy:Image14_Schematic (DX)|Image14_Schematic (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_Area51Bunker (DX)|Image15_Area51Bunker (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_Area51_Sector3 (DX)|Image15_Area51_Sector3 (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_Area51_Sector4 (DX)|Image15_Area51_Sector4 (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_BlueFusionDevice (DX)|Image15_BlueFusionDevice (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_GrayDisection (DX)|Image15_GrayDisection (DX)]]
 +&amp;ndash; [[Legacy:Pickup (DX)|Pickup (DX)]]
 |   +&amp;ndash; [[Legacy:Ammo (DX)|Ammo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DeusExAmmo (DX)|DeusExAmmo (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo10mm (DX)|Ammo10mm (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo20mm (DX)|Ammo20mm (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo3006 (DX)|Ammo3006 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo762mm (DX)|Ammo762mm (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoBattery (DX)|AmmoBattery (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoDart (DX)|AmmoDart (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:AmmoDartFlare (DX)|AmmoDartFlare (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:AmmoDartPoison (DX)|AmmoDartPoison (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoEMPGrenade (DX)|AmmoEMPGrenade (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoGasGrenade (DX)|AmmoGasGrenade (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoGraySpit (DX)|AmmoGraySpit (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoGreaselSpit (DX)|AmmoGreaselSpit (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoLAM (DX)|AmmoLAM (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoNanoVirusGrenade (DX)|AmmoNanoVirusGrenade (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoNapalm (DX)|AmmoNapalm (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoNone (DX)|AmmoNone (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoPepper (DX)|AmmoPepper (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoPlasma (DX)|AmmoPlasma (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoRocket (DX)|AmmoRocket (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:AmmoRocketWP (DX)|AmmoRocketWP (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoRocketMini (DX)|AmmoRocketMini (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoRocketRobot (DX)|AmmoRocketRobot (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoSabot (DX)|AmmoSabot (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoShell (DX)|AmmoShell (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoShuriken (DX)|AmmoShuriken (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExPickup (DX)|DeusExPickup (DX)]]
 |       +&amp;ndash; [[Legacy:AugmentationCannister (DX)|AugmentationCannister (DX)]]
 |       +&amp;ndash; [[Legacy:AugmentationUpgradeCannister (DX)|AugmentationUpgradeCannister (DX)]]
 |       +&amp;ndash; [[Legacy:Binoculars (DX)|Binoculars (DX)]]
 |       +&amp;ndash; [[Legacy:BioelectricCell (DX)|BioelectricCell (DX)]]
 |       +&amp;ndash; [[Legacy:Candybar (DX)|Candybar (DX)]]
 |       +&amp;ndash; [[Legacy:ChargedPickup (DX)|ChargedPickup (DX)]]
 |       |   +&amp;ndash; [[Legacy:AdaptiveArmor (DX)|AdaptiveArmor (DX)]]
 |       |   +&amp;ndash; [[Legacy:BallisticArmor (DX)|BallisticArmor (DX)]]
 |       |   +&amp;ndash; [[Legacy:HazMatSuit (DX)|HazMatSuit (DX)]]
 |       |   +&amp;ndash; [[Legacy:Rebreather (DX)|Rebreather (DX)]]
 |       |   +&amp;ndash; [[Legacy:TechGoggles (DX)|TechGoggles (DX)]]
 |       +&amp;ndash; [[Legacy:Cigarettes (DX)|Cigarettes (DX)]]
 |       +&amp;ndash; [[Legacy:Credits (DX)|Credits (DX)]]
 |       +&amp;ndash; [[Legacy:FireExtinguisher (DX)|FireExtinguisher (DX)]]
 |       +&amp;ndash; [[Legacy:Flare (DX)|Flare (DX)]]
 |       +&amp;ndash; [[Legacy:Liquor40oz (DX)|Liquor40oz (DX)]]
 |       +&amp;ndash; [[Legacy:LiquorBottle (DX)|LiquorBottle (DX)]]
 |       +&amp;ndash; [[Legacy:MedKit (DX)|MedKit (DX)]]
 |       +&amp;ndash; [[Legacy:NanoKey (DX)|NanoKey (DX)]]
 |       +&amp;ndash; [[Legacy:POVCorpse (DX)|POVCorpse (DX)]]
 |       +&amp;ndash; [[Legacy:SkilledTool (DX)|SkilledTool (DX)]]
 |       |   +&amp;ndash; [[Legacy:Lockpick (DX)|Lockpick (DX)]]
 |       |   +&amp;ndash; [[Legacy:Multitool (DX)|Multitool (DX)]]
 |       |   +&amp;ndash; [[Legacy:NanoKeyRing (DX)|NanoKeyRing (DX)]]
 |       +&amp;ndash; [[Legacy:Sodacan (DX)|Sodacan (DX)]]
 |       +&amp;ndash; [[Legacy:SoyFood (DX)|SoyFood (DX)]]
 |       +&amp;ndash; [[Legacy:VialAmbrosia (DX)|VialAmbrosia (DX)]]
 |       +&amp;ndash; [[Legacy:VialCrack (DX)|VialCrack (DX)]]
 |       +&amp;ndash; [[Legacy:WeaponMod (DX)|WeaponMod (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModAccuracy (DX)|WeaponModAccuracy (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModClip (DX)|WeaponModClip (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModLaser (DX)|WeaponModLaser (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModRange (DX)|WeaponModRange (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModRecoil (DX)|WeaponModRecoil (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModReload (DX)|WeaponModReload (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModScope (DX)|WeaponModScope (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModSilencer (DX)|WeaponModSilencer (DX)]]
 |       +&amp;ndash; [[Legacy:Windowtool (DX)|Windowtool (DX)]]
 |       +&amp;ndash; [[Legacy:WineBottle (DX)|WineBottle (DX)]]
 +&amp;ndash; [[Legacy:Weapon (DX)|Weapon (DX)]]
     +&amp;ndash; [[Legacy:DeusExWeapon (DX)|DeusExWeapon (DX)]]
         +&amp;ndash; [[Legacy:WeaponAssaultGun (DX)|WeaponAssaultGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponAssaultShotgun (DX)|WeaponAssaultShotgun (DX)]]
         +&amp;ndash; [[Legacy:WeaponBaton (DX)|WeaponBaton (DX)]]
         +&amp;ndash; [[Legacy:WeaponCombatKnife (DX)|WeaponCombatKnife (DX)]]
         +&amp;ndash; [[Legacy:WeaponCrowbar (DX)|WeaponCrowbar (DX)]]
         +&amp;ndash; [[Legacy:WeaponEMPGrenade (DX)|WeaponEMPGrenade (DX)]]
         +&amp;ndash; [[Legacy:WeaponFlamethrower (DX)|WeaponFlamethrower (DX)]]
         +&amp;ndash; [[Legacy:WeaponGasGrenade (DX)|WeaponGasGrenade (DX)]]
         +&amp;ndash; [[Legacy:WeaponGEPGun (DX)|WeaponGEPGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponHideAGun (DX)|WeaponHideAGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponLAM (DX)|WeaponLAM (DX)]]
         +&amp;ndash; [[Legacy:WeaponLAW (DX)|WeaponLAW (DX)]]
         +&amp;ndash; [[Legacy:WeaponMiniCrossbow (DX)|WeaponMiniCrossbow (DX)]]
         +&amp;ndash; [[Legacy:WeaponNanoSword (DX)|WeaponNanoSword (DX)]]
         +&amp;ndash; [[Legacy:WeaponNanoVirusGrenade (DX)|WeaponNanoVirusGrenade (DX)]]
         +&amp;ndash; [[Legacy:WeaponNPCMelee (DX)|WeaponNPCMelee (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponCatScratch (DX)|WeaponCatScratch (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponDogBite (DX)|WeaponDogBite (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponGraySwipe (DX)|WeaponGraySwipe (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponKarkianBite (DX)|WeaponKarkianBite (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponKarkianBump (DX)|WeaponKarkianBump (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponRatBite (DX)|WeaponRatBite (DX)]]
         +&amp;ndash; [[Legacy:WeaponNPCRanged (DX)|WeaponNPCRanged (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponGraySpit (DX)|WeaponGraySpit (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponGreaselSpit (DX)|WeaponGreaselSpit (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponMJ12Commando (DX)|WeaponMJ12Commando (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponMJ12Rocket (DX)|WeaponMJ12Rocket (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponRobotMachinegun (DX)|WeaponRobotMachinegun (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponRobotRocket (DX)|WeaponRobotRocket (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponSpiderBot (DX)|WeaponSpiderBot (DX)]]
         |       +&amp;ndash; [[Legacy:WeaponSpiderBot2 (DX)|WeaponSpiderBot2 (DX)]]
         +&amp;ndash; [[Legacy:WeaponPepperGun (DX)|WeaponPepperGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponPistol (DX)|WeaponPistol (DX)]]
         +&amp;ndash; [[Legacy:WeaponPlasmaRifle (DX)|WeaponPlasmaRifle (DX)]]
         +&amp;ndash; [[Legacy:WeaponProd (DX)|WeaponProd (DX)]]
         +&amp;ndash; [[Legacy:WeaponRifle (DX)|WeaponRifle (DX)]]
         +&amp;ndash; [[Legacy:WeaponSawedOffShotgun (DX)|WeaponSawedOffShotgun (DX)]]
         +&amp;ndash; [[Legacy:WeaponShuriken (DX)|WeaponShuriken (DX)]]
         +&amp;ndash; [[Legacy:WeaponStealthPistol (DX)|WeaponStealthPistol (DX)]]
         +&amp;ndash; [[Legacy:WeaponSword (DX)|WeaponSword (DX)]]

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3764</id>
      <timestamp>2004-02-11T01:44:29Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve"> [[Legacy:Inventory (DX)|Inventory (DX)]]
 +&amp;ndash; [[Legacy:DataVaultImage (DX)|DataVaultImage (DX)]]
 |   +&amp;ndash; [[Legacy:Image01_GunFireSensor (DX)|Image01_GunFireSensor (DX)]]
 |   +&amp;ndash; [[Legacy:Image01_LibertyIsland (DX)|Image01_LibertyIsland (DX)]]
 |   +&amp;ndash; [[Legacy:Image01_TerroristCommander (DX)|Image01_TerroristCommander (DX)]]
 |   +&amp;ndash; [[Legacy:Image02_Ambrosia_Flyer (DX)|Image02_Ambrosia_Flyer (DX)]]
 |   +&amp;ndash; [[Legacy:Image02_BobPage_ManOfYear (DX)|Image02_BobPage_ManOfYear (DX)]]
 |   +&amp;ndash; [[Legacy:Image02_NYC_Warehouse (DX)|Image02_NYC_Warehouse (DX)]]
 |   +&amp;ndash; [[Legacy:Image03_747Diagram (DX)|Image03_747Diagram (DX)]]
 |   +&amp;ndash; [[Legacy:Image03_NYC_Airfield (DX)|Image03_NYC_Airfield (DX)]]
 |   +&amp;ndash; [[Legacy:Image03_WaltonSimons (DX)|Image03_WaltonSimons (DX)]]
 |   +&amp;ndash; [[Legacy:Image04_NSFHeadquarters (DX)|Image04_NSFHeadquarters (DX)]]
 |   +&amp;ndash; [[Legacy:Image04_UNATCONotice (DX)|Image04_UNATCONotice (DX)]]
 |   +&amp;ndash; [[Legacy:Image05_GreaselDisection (DX)|Image05_GreaselDisection (DX)]]
 |   +&amp;ndash; [[Legacy:Image05_NYC_MJ12Lab (DX)|Image05_NYC_MJ12Lab (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_Market (DX)|Image06_HK_Market (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_MJ12Helipad (DX)|Image06_HK_MJ12Helipad (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_MJ12Lab (DX)|Image06_HK_MJ12Lab (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_Versalife (DX)|Image06_HK_Versalife (DX)]]
 |   +&amp;ndash; [[Legacy:Image06_HK_WanChai (DX)|Image06_HK_WanChai (DX)]]
 |   +&amp;ndash; [[Legacy:Image08_JoeGreenMIBMJ12 (DX)|Image08_JoeGreenMIBMJ12 (DX)]]
 |   +&amp;ndash; [[Legacy:Image09_NYC_Ship_Bottom (DX)|Image09_NYC_Ship_Bottom (DX)]]
 |   +&amp;ndash; [[Legacy:Image09_NYC_Ship_Top (DX)|Image09_NYC_Ship_Top (DX)]]
 |   +&amp;ndash; [[Legacy:Image10_Paris_Catacombs (DX)|Image10_Paris_Catacombs (DX)]]
 |   +&amp;ndash; [[Legacy:Image10_Paris_CatacombsTunnels (DX)|Image10_Paris_CatacombsTunnels (DX)]]
 |   +&amp;ndash; [[Legacy:Image10_Paris_Metro (DX)|Image10_Paris_Metro (DX)]]
 |   +&amp;ndash; [[Legacy:Image11_Paris_Cathedral (DX)|Image11_Paris_Cathedral (DX)]]
 |   +&amp;ndash; [[Legacy:Image11_Paris_CathedralEntrance (DX)|Image11_Paris_CathedralEntrance (DX)]]
 |   +&amp;ndash; [[Legacy:Image12_Tiffany_HostagePic (DX)|Image12_Tiffany_HostagePic (DX)]]
 |   +&amp;ndash; [[Legacy:Image12_Vandenberg_Command (DX)|Image12_Vandenberg_Command (DX)]]
 |   +&amp;ndash; [[Legacy:Image12_Vandenberg_Sub (DX)|Image12_Vandenberg_Sub (DX)]]
 |   +&amp;ndash; [[Legacy:Image14_OceanLab (DX)|Image14_OceanLab (DX)]]
 |   +&amp;ndash; [[Legacy:Image14_Schematic (DX)|Image14_Schematic (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_Area51Bunker (DX)|Image15_Area51Bunker (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_Area51_Sector3 (DX)|Image15_Area51_Sector3 (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_Area51_Sector4 (DX)|Image15_Area51_Sector4 (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_BlueFusionDevice (DX)|Image15_BlueFusionDevice (DX)]]
 |   +&amp;ndash; [[Legacy:Image15_GrayDisection (DX)|Image15_GrayDisection (DX)]]
 +&amp;ndash; [[Legacy:Pickup (DX)|Pickup (DX)]]
 |   +&amp;ndash; [[Legacy:Ammo (DX)|Ammo (DX)]]
 |   |   +&amp;ndash; [[Legacy:DeusExAmmo (DX)|DeusExAmmo (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo10mm (DX)|Ammo10mm (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo20mm (DX)|Ammo20mm (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo3006 (DX)|Ammo3006 (DX)]]
 |   |       +&amp;ndash; [[Legacy:Ammo762mm (DX)|Ammo762mm (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoBattery (DX)|AmmoBattery (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoDart (DX)|AmmoDart (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:AmmoDartFlare (DX)|AmmoDartFlare (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:AmmoDartPoison (DX)|AmmoDartPoison (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoEMPGrenade (DX)|AmmoEMPGrenade (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoGasGrenade (DX)|AmmoGasGrenade (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoGraySpit (DX)|AmmoGraySpit (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoGreaselSpit (DX)|AmmoGreaselSpit (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoLAM (DX)|AmmoLAM (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoNanoVirusGrenade (DX)|AmmoNanoVirusGrenade (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoNapalm (DX)|AmmoNapalm (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoNone (DX)|AmmoNone (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoPepper (DX)|AmmoPepper (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoPlasma (DX)|AmmoPlasma (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoRocket (DX)|AmmoRocket (DX)]]
 |   |       |   +&amp;ndash; [[Legacy:AmmoRocketWP (DX)|AmmoRocketWP (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoRocketMini (DX)|AmmoRocketMini (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoRocketRobot (DX)|AmmoRocketRobot (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoSabot (DX)|AmmoSabot (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoShell (DX)|AmmoShell (DX)]]
 |   |       +&amp;ndash; [[Legacy:AmmoShuriken (DX)|AmmoShuriken (DX)]]
 |   +&amp;ndash; [[Legacy:DeusExPickup (DX)|DeusExPickup (DX)]]
 |       +&amp;ndash; [[Legacy:AugmentationCannister (DX)|AugmentationCannister (DX)]]
 |       +&amp;ndash; [[Legacy:AugmentationUpgradeCannister (DX)|AugmentationUpgradeCannister (DX)]]
 |       +&amp;ndash; [[Legacy:Binoculars (DX)|Binoculars (DX)]]
 |       +&amp;ndash; [[Legacy:BioelectricCell (DX)|BioelectricCell (DX)]]
 |       +&amp;ndash; [[Legacy:Candybar (DX)|Candybar (DX)]]
 |       +&amp;ndash; [[Legacy:ChargedPickup (DX)|ChargedPickup (DX)]]
 |       |   +&amp;ndash; [[Legacy:AdaptiveArmor (DX)|AdaptiveArmor (DX)]]
 |       |   +&amp;ndash; [[Legacy:BallisticArmor (DX)|BallisticArmor (DX)]]
 |       |   +&amp;ndash; [[Legacy:HazMatSuit (DX)|HazMatSuit (DX)]]
 |       |   +&amp;ndash; [[Legacy:Rebreather (DX)|Rebreather (DX)]]
 |       |   +&amp;ndash; [[Legacy:TechGoggles (DX)|TechGoggles (DX)]]
 |       +&amp;ndash; [[Legacy:Cigarettes (DX)|Cigarettes (DX)]]
 |       +&amp;ndash; [[Legacy:Credits (DX)|Credits (DX)]]
 |       +&amp;ndash; [[Legacy:FireExtinguisher (DX)|FireExtinguisher (DX)]]
 |       +&amp;ndash; [[Legacy:Flare (DX)|Flare (DX)]]
 |       +&amp;ndash; [[Legacy:Liquor40oz (DX)|Liquor40oz (DX)]]
 |       +&amp;ndash; [[Legacy:LiquorBottle (DX)|LiquorBottle (DX)]]
 |       +&amp;ndash; [[Legacy:MedKit (DX)|MedKit (DX)]]
 |       +&amp;ndash; [[Legacy:NanoKey (DX)|NanoKey (DX)]]
 |       +&amp;ndash; [[Legacy:POVCorpse (DX)|POVCorpse (DX)]]
 |       +&amp;ndash; [[Legacy:SkilledTool (DX)|SkilledTool (DX)]]
 |       |   +&amp;ndash; [[Legacy:Lockpick (DX)|Lockpick (DX)]]
 |       |   +&amp;ndash; [[Legacy:Multitool (DX)|Multitool (DX)]]
 |       |   +&amp;ndash; [[Legacy:NanoKeyRing (DX)|NanoKeyRing (DX)]]
 |       +&amp;ndash; [[Legacy:Sodacan (DX)|Sodacan (DX)]]
 |       +&amp;ndash; [[Legacy:SoyFood (DX)|SoyFood (DX)]]
 |       +&amp;ndash; [[Legacy:VialAmbrosia (DX)|VialAmbrosia (DX)]]
 |       +&amp;ndash; [[Legacy:VialCrack (DX)|VialCrack (DX)]]
 |       +&amp;ndash; [[Legacy:WeaponMod (DX)|WeaponMod (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModAccuracy (DX)|WeaponModAccuracy (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModClip (DX)|WeaponModClip (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModLaser (DX)|WeaponModLaser (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModRange (DX)|WeaponModRange (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModRecoil (DX)|WeaponModRecoil (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModReload (DX)|WeaponModReload (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModScope (DX)|WeaponModScope (DX)]]
 |       |   +&amp;ndash; [[Legacy:WeaponModSilencer (DX)|WeaponModSilencer (DX)]]
 |       +&amp;ndash; [[Legacy:Windowtool (DX)|Windowtool (DX)]]
 |       +&amp;ndash; [[Legacy:WineBottle (DX)|WineBottle (DX)]]
 +&amp;ndash; [[Legacy:Weapon (DX)|Weapon (DX)]]
     +&amp;ndash; [[Legacy:DeusExWeapon (DX)|DeusExWeapon (DX)]]
         +&amp;ndash; [[Legacy:WeaponAssaultGun (DX)|WeaponAssaultGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponAssaultShotgun (DX)|WeaponAssaultShotgun (DX)]]
         +&amp;ndash; [[Legacy:WeaponBaton (DX)|WeaponBaton (DX)]]
         +&amp;ndash; [[Legacy:WeaponCombatKnife (DX)|WeaponCombatKnife (DX)]]
         +&amp;ndash; [[Legacy:WeaponCrowbar (DX)|WeaponCrowbar (DX)]]
         +&amp;ndash; [[Legacy:WeaponEMPGrenade (DX)|WeaponEMPGrenade (DX)]]
         +&amp;ndash; [[Legacy:WeaponFlamethrower (DX)|WeaponFlamethrower (DX)]]
         +&amp;ndash; [[Legacy:WeaponGasGrenade (DX)|WeaponGasGrenade (DX)]]
         +&amp;ndash; [[Legacy:WeaponGEPGun (DX)|WeaponGEPGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponHideAGun (DX)|WeaponHideAGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponLAM (DX)|WeaponLAM (DX)]]
         +&amp;ndash; [[Legacy:WeaponLAW (DX)|WeaponLAW (DX)]]
         +&amp;ndash; [[Legacy:WeaponMiniCrossbow (DX)|WeaponMiniCrossbow (DX)]]
         +&amp;ndash; [[Legacy:WeaponNanoSword (DX)|WeaponNanoSword (DX)]]
         +&amp;ndash; [[Legacy:WeaponNanoVirusGrenade (DX)|WeaponNanoVirusGrenade (DX)]]
         +&amp;ndash; [[Legacy:WeaponNPCMelee (DX)|WeaponNPCMelee (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponCatScratch (DX)|WeaponCatScratch (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponDogBite (DX)|WeaponDogBite (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponGraySwipe (DX)|WeaponGraySwipe (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponKarkianBite (DX)|WeaponKarkianBite (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponKarkianBump (DX)|WeaponKarkianBump (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponRatBite (DX)|WeaponRatBite (DX)]]
         +&amp;ndash; [[Legacy:WeaponNPCRanged (DX)|WeaponNPCRanged (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponGraySpit (DX)|WeaponGraySpit (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponGreaselSpit (DX)|WeaponGreaselSpit (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponMJ12Commando (DX)|WeaponMJ12Commando (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponMJ12Rocket (DX)|WeaponMJ12Rocket (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponRobotMachinegun (DX)|WeaponRobotMachinegun (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponRobotRocket (DX)|WeaponRobotRocket (DX)]]
         |   +&amp;ndash; [[Legacy:WeaponSpiderBot (DX)|WeaponSpiderBot (DX)]]
         |       +&amp;ndash; [[Legacy:WeaponSpiderBot2 (DX)|WeaponSpiderBot2 (DX)]]
         +&amp;ndash; [[Legacy:WeaponPepperGun (DX)|WeaponPepperGun (DX)]]
         +&amp;ndash; [[Legacy:WeaponPistol (DX)|WeaponPistol (DX)]]
         +&amp;ndash; [[Legacy:WeaponPlasmaRifle (DX)|WeaponPlasmaRifle (DX)]]
         +&amp;ndash; [[Legacy:WeaponProd (DX)|WeaponProd (DX)]]
         +&amp;ndash; [[Legacy:WeaponRifle (DX)|WeaponRifle (DX)]]
         +&amp;ndash; [[Legacy:WeaponSawedOffShotgun (DX)|WeaponSawedOffShotgun (DX)]]
         +&amp;ndash; [[Legacy:WeaponShuriken (DX)|WeaponShuriken (DX)]]
         +&amp;ndash; [[Legacy:WeaponStealthPistol (DX)|WeaponStealthPistol (DX)]]
         +&amp;ndash; [[Legacy:WeaponSword (DX)|WeaponSword (DX)]]</text>
    </revision>
    <revision>
      <id>39968</id>
      <timestamp>2009-11-14T18:43:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>delinked non-existing pages to cut down the number of wanted pages</comment>
      <text xml:space="preserve"> [[Legacy:Inventory (DX)|Inventory]]
 +- DataVaultImage
 |   +- Image01_GunFireSensor
 |   +- Image01_LibertyIsland
 |   +- Image01_TerroristCommander
 |   +- Image02_Ambrosia_Flyer
 |   +- Image02_BobPage_ManOfYear
 |   +- Image02_NYC_Warehouse
 |   +- Image03_747Diagram
 |   +- Image03_NYC_Airfield
 |   +- Image03_WaltonSimons
 |   +- Image04_NSFHeadquarters
 |   +- Image04_UNATCONotice
 |   +- Image05_GreaselDisection
 |   +- Image05_NYC_MJ12Lab
 |   +- Image06_HK_Market
 |   +- Image06_HK_MJ12Helipad
 |   +- Image06_HK_MJ12Lab
 |   +- Image06_HK_Versalife
 |   +- Image06_HK_WanChai
 |   +- Image08_JoeGreenMIBMJ12
 |   +- Image09_NYC_Ship_Bottom
 |   +- Image09_NYC_Ship_Top
 |   +- Image10_Paris_Catacombs
 |   +- Image10_Paris_CatacombsTunnels
 |   +- Image10_Paris_Metro
 |   +- Image11_Paris_Cathedral
 |   +- Image11_Paris_CathedralEntrance
 |   +- Image12_Tiffany_HostagePic
 |   +- Image12_Vandenberg_Command
 |   +- Image12_Vandenberg_Sub
 |   +- Image14_OceanLab
 |   +- Image14_Schematic
 |   +- Image15_Area51Bunker
 |   +- Image15_Area51_Sector3
 |   +- Image15_Area51_Sector4
 |   +- Image15_BlueFusionDevice
 |   +- Image15_GrayDisection
 +- Pickup
 |   +- [[Legacy:Ammo (DX)|Ammo]]
 |   |   +- DeusExAmmo
 |   |       +- Ammo10mm
 |   |       +- Ammo20mm
 |   |       +- Ammo3006
 |   |       +- Ammo762mm
 |   |       +- AmmoBattery
 |   |       +- AmmoDart
 |   |       |   +- AmmoDartFlare
 |   |       |   +- AmmoDartPoison
 |   |       +- AmmoEMPGrenade
 |   |       +- AmmoGasGrenade
 |   |       +- AmmoGraySpit
 |   |       +- AmmoGreaselSpit
 |   |       +- AmmoLAM
 |   |       +- AmmoNanoVirusGrenade
 |   |       +- AmmoNapalm
 |   |       +- AmmoNone
 |   |       +- AmmoPepper
 |   |       +- AmmoPlasma
 |   |       +- AmmoRocket
 |   |       |   +- AmmoRocketWP
 |   |       +- AmmoRocketMini
 |   |       +- AmmoRocketRobot
 |   |       +- AmmoSabot
 |   |       +- AmmoShell
 |   |       +- AmmoShuriken
 |   +- DeusExPickup
 |       +- AugmentationCannister
 |       +- AugmentationUpgradeCannister
 |       +- Binoculars
 |       +- BioelectricCell
 |       +- Candybar
 |       +- ChargedPickup
 |       |   +- AdaptiveArmor
 |       |   +- BallisticArmor
 |       |   +- HazMatSuit
 |       |   +- Rebreather
 |       |   +- TechGoggles
 |       +- Cigarettes
 |       +- Credits
 |       +- FireExtinguisher
 |       +- Flare
 |       +- Liquor40oz
 |       +- LiquorBottle
 |       +- MedKit
 |       +- NanoKey
 |       +- POVCorpse
 |       +- SkilledTool
 |       |   +- Lockpick
 |       |   +- Multitool
 |       |   +- NanoKeyRing
 |       +- Sodacan
 |       +- SoyFood
 |       +- VialAmbrosia
 |       +- VialCrack
 |       +- WeaponMod
 |       |   +- WeaponModAccuracy
 |       |   +- WeaponModClip
 |       |   +- WeaponModLaser
 |       |   +- WeaponModRange
 |       |   +- WeaponModRecoil
 |       |   +- WeaponModReload
 |       |   +- WeaponModScope
 |       |   +- WeaponModSilencer
 |       +- Windowtool
 |       +- WineBottle
 +- Weapon
     +- [[Legacy:DeusExWeapon (DX)|DeusExWeapon]]
         +- WeaponAssaultGun
         +- WeaponAssaultShotgun
         +- WeaponBaton
         +- WeaponCombatKnife
         +- WeaponCrowbar
         +- WeaponEMPGrenade
         +- WeaponFlamethrower
         +- WeaponGasGrenade
         +- WeaponGEPGun
         +- WeaponHideAGun
         +- WeaponLAM
         +- WeaponLAW
         +- WeaponMiniCrossbow
         +- WeaponNanoSword
         +- WeaponNanoVirusGrenade
         +- WeaponNPCMelee
         |   +- WeaponCatScratch
         |   +- WeaponDogBite
         |   +- WeaponGraySwipe
         |   +- WeaponKarkianBite
         |   +- WeaponKarkianBump
         |   +- WeaponRatBite
         +- WeaponNPCRanged
         |   +- WeaponGraySpit
         |   +- WeaponGreaselSpit
         |   +- WeaponMJ12Commando
         |   +- WeaponMJ12Rocket
         |   +- WeaponRobotMachinegun
         |   +- WeaponRobotRocket
         |   +- WeaponSpiderBot
         |       +- WeaponSpiderBot2
         +- WeaponPepperGun
         +- WeaponPistol
         +- WeaponPlasmaRifle
         +- WeaponProd
         +- WeaponRifle
         +- WeaponSawedOffShotgun
         +- WeaponShuriken
         +- WeaponStealthPistol
         +- WeaponSword

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Inventory Item Placement</title>
    <id>1487</id>
    <revision>
      <id>3731</id>
      <timestamp>2006-09-24T03:47:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Good point.</comment>
      <text xml:space="preserve">The placement of inventory items around your map can either aid or hinder gameplay.  Item positioning is crucial to the [[Legacy:Map Flow|Map Flow]].  Too much health and combat becomes a slow tortuous affair.  Too little and players will not be able to recover sufficiently from each fight to avoid getting killed in the next.  Similarly, a balance should be struck for all powerups, ammo, weapons and other items in order to support map flow and make the most of a map's layout.  The [[Legacy:Gametype|gametype]] your map is aimed at will influence the positioning of your items.

The following are not hard and fast rules, in fact, they should be ignored or contradicted from time to time for variety's sake.  They are just suggestions to consider while designing the level for best gameplay.

{{innerbox| '''CliffyB's Rule: Counter Desirability with Risk'''

 Put desirable things such as powerful weapons in a dangerous or exposed spot.  In DM that means in an exposed spot, such as an open space, a junction or a blind alley.  In team maps it means, in no-man's-land. (aka, ''Risk vs Reward'')

}}

==Game Objectives==

Placement of [[Legacy:GameObjective|GameObjective]]s is crucial.  The layout of the map is usually centered around the placement of these special items and this is where item placement should begin.  Some gametypes, namely Deathmatch, do not have a GameObjective actor to place.  Although, one could argue with confidence that [[Legacy:PlayerStart|PlayerStart]]s should be treated with the same importance as game objectives in those instances.  Capture the Flag FlagBases, Bombing Run BombSpawns and BombDeliveries, Double Domination DomPoints and Onslaught PowerNodes and PowerCores are all examples of Game Objectives.  First and foremost, the Game Objectives should be equal all sides of the match; equally accessible, equally attainable.

==Weapons==

When considering weapon placement, keep in mind how easy and quick it is to reach a weapon. While keeping in mind CliffyB's rule, remember that if one cannot find a weapon in a reasonable amount of time, one may get frustrated. If this is the case, often times a few will reach weapons and therefore dominate those that cannot.  Consider giving an equal distance from playerstart to weapon.  Also consider placing a good &quot;starter weapon&quot; near each player start, so that the respawning player is facing a weapon they can grab and immediately join the fray.

===Specific Weapon Suggestions===
; Assault Rifle : Usually you aren't going to put extra assault rifles in a map, people get dual assault rifles by killing other people.  But if you do place them, put them in an area where the player should've picked up another weapon already.
; Translocator : Although normally given to each player at map start, the translocator can be given via PickUpBase in gametypes that do not allow translocators or match configurations  that do not give them at map start.  Place these near player starts or areas where the translocator would be useful. (i.e., a large chasm or high ledge)
; Chainsaw (UT) : Cramped places that allow charging attacks.
; BioRifle : At the end of a tunnel or a main doorway.  Perhaps somewhere dark or confined.  Place it near a game objective or near a room that can be held.
; Shock Rifle : Best in open areas; corridors for combo shots.
; MiniGun : Near areas where heated combat and crossfire is likely.
; Link Gun : Try to put this near every power node in Onslaught because you need it to heal power nodes and vehicles.  This weapon is crucial for more than fighting in Onslaught and other gametypes that allow vehicles.
; Flak Cannon : Best in cramped or confined areas for more opportunities for bounce shots and splash damage. (Most memorable example of this: The crenulated 270-degree-curved hallway in UT's DM-Grinder &amp;rarr;StarWeaver)
; Rocket Launcher : Best in places with walls for splash damage, but uncramped and uncluttered to avoid accidental suicides.
; Lightning Gun and Sniper Rifle : Near places that are good for sniping.  But you should consider the differences between the two.  With Sniper Rifles, it is more difficult to locate the firer, and it fires faster than the lightning gun.  But the Lightning Gun does more damage and doesn't have that annoying fog.
; Redeemer : Due to it's high power and ability to be guided, put this in a hidden and or hard to reach place.
; Ion Painter : In a wide open area that can aim at a big open area.  The blast effect of this weapon is made to take out large or numberous opponents.

==Ammunition==

It's useful to consider the placement of ammunition independantly of the actual positioning of the weapon.  It is usually a good idea to place ammo for a weapon near the weapon placement itself, however having extra stashes of different ammo adds a good measure of variety.  If these stashes are particularly extensive, put them in hard to reach or hidden areas.

==Powerups==

Powerups give a player an extra boost of some kind.  These goodies should be positioned in such a way that when the player needs them most, they can find them available.  Keeping in mind ''Risk vs Reward'', place more powerful items in hard to reach or hidden places.

===Health===

Health can be difficult to place.  Place too much and players will not be vulnerable enough to score kills on each other.  Place too little and player will die too easily to enjoy the match.  Health is the commodity that keeps players alive, so it is the most critical of the powerups.

====MiniHealth====

Because these can give players more than 100 health (although in small doses), you can place these near PlayerStarts, espcially those near dangerous areas.  The small health boost encourages the mapper to place a multiple vials in clusters or rows along a path.

====Health Pack====

The general health powerup should be available to players who need it.  Place these on the outside of major battle areas, or places that players may want to otherwise retreat to.

====Keg O' Health====

This is a major powerup and should be reserved for those players who go the extra mile to find it.  It should either be in a dangerous area (open or prone to crossfire), an area that is dangerous to get to (on a small ledge over lava or the like) or hidden from view.

===Shield===

Shield powerups add an extra protection for players.  Think of this as a bonus, not as critical as health.  Give shield powerups to players who will need it to launch a dangerous attach or defend against the odds.

====Shield Pack====

The basic shield powerup gives enough shield to protect the player during a small encounter with the enemy.  Place these along paths that lead to heavy battle zones.

====Super Shield====

This is another major powerup, like the Keg O' Health.  This should be difficult or dangerous to get to or it should be out of plain sight.

===UDamage (Double Damage Amp)===

This is the third major powerup, giving the players an advantage in combat.  Place near areas of heated battle or crossfire so they have a chance to use them.  However, due to it's power, it should also be hard to reach and / or hidden.

===Adrenaline===

[[Legacy:Adrenaline|Adrenaline]] allows players to collect enough energy to perform a special adrenaline combo: a move that can give them a special power of their choosing for a short period of time.  This is a special power that should be given as a reward for finding a particularly dangerous space.  Place these in open spaces or where crossfire is common.  Place enough to allow each of the recommended number of players to perform a combo at least once in a typical match.

==Vehicle Factories==

Vehicles serve several purposes.  They are a source of increase mobility, even carrying multiple players at once.  They are also equipped with increased armor, weapons and ammo.  These plusses make vehicles highly desirable.  Place these Vehicle Factories in places that allow a respawning player to get back in the action quick.  Place them so players can enter a highly dangerous area well protected and equally matched to the danger.  Take into account the speed and mobility of the vehicle; do not place a slow-moving Tank or Leviathan so far away from the heat of battle that player will be frustrated.  Lightweight vehicles should likewise be used in areas where heavy combat is not as likely.

See also [[Legacy:Vehicle Gameplay|Vehicle Gameplay]].

==Gametype Specific Suggestions==

===Deathmatch and Team Deathmatch===

If your map is aimed at a low number of players having one or two large health packs on the level is better than having many smaller ones.  This adds points of control to the map that will concentrate combat and add tension to a map that otherwise wouldn't be there.  For fewer players high amounts of armour should also be avoided - place a small amount of armour away from the health.  By moving the armour away players will be forced to travel the level in its entirety allowing suprise attacks and a bit of hope for a player whose just been killed.

On larger deathmatch levels look for the rooms that can be easily held and then distribute health and armour away from those places.  Having a very small amount of health in this type of room is a good thing, but too much and you'll unbalance Team Deathmatch play.

===Capture the Flag===

The placement of health and armour around a CTF map is critical to achieving a good balance of attack and defense.  Too little health in and around the flag room and defenders will have a hard time keeping the flag inside the base.  Too much health and even the most co-ordinated attack will struggle.  As a general rule of thumb a single health pack per defending player should be sufficient.

Placing a small amount of health along the main routes between the two flags is a good idea.  However, ensure that it will cost the flag carrier some time to collect it.  The way the flag carrier can trade safety (in terms of the likelihood of getting killed) against speed of escape.  Any more than a tenth of a second is probably too much time wasted.

By the very nature of the game type, most of the health and armour will be located at either end of the map.  Depending on the structure of your map it may be better to adopt a more even spread of health throughout the level.

Always place armour away from the flag base.  It's generally better to favour attackers when placing armour but also ensure that it costs time to collect it.  The armour placement in Coret is a fine example of this.  Both the 100 armour and 50 armour require a player to go slightly out of their way to obtain them, and neither of them are that close to the flag and the defenders.

==Related Topics==
* [[Legacy:Map Flow|Map Flow]]
** [[Legacy:Placing PlayerStart|Placing PlayerStart]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Design|Map Design]]

==Discussion==

'''SuperApe:''' Merged in Weapon Placement info because they are really the same topic.  I don't see any reason to split them up other than to cause people to get lost while we duplicate a lot of info.  Added GameObjectives, Powerup specifics, filled in rest of weapon specifics, edited overview.  Encorporated with the [[Legacy:Topics On Mapping|Topics on Mapping]] family of pages.  Removed from Big Cleanup.  Feel free to add to the Gametype Specific Suggestions subtopic.

'''Bob_The_Beheader:''' This page should contain some info about how bots will interact with inventory items. I have linked to this page from the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] Tutorial.

'''SuperApe:''' Good point.  While definately not exclusive to bots, inventory items often carry AI &quot;inside&quot; to tell bots how to use, when to acquire, etc.  I'm not sure each item on this page needs that, as it was mostly aimed at inventory item placement as a multiplayer mapping aspect, but I can see how a section describing the bot AI relates to Inventory items, when they are desired, etc.  For example, the vehicle code that &quot;reserves&quot; the vehicle for a bot could be outlined.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3732</id>
      <timestamp>2006-09-23T19:47:24Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>Bot Interaction?</comment>
      <text xml:space="preserve">The placement of inventory items around your map can either aid or hinder gameplay.  Item positioning is crucial to the [[Legacy:Map Flow|Map Flow]].  Too much health and combat becomes a slow tortuous affair.  Too little and players will not be able to recover sufficiently from each fight to avoid getting killed in the next.  Similarly, a balance should be struck for all powerups, ammo, weapons and other items in order to support map flow and make the most of a map's layout.  The [[Legacy:Gametype|gametype]] your map is aimed at will influence the positioning of your items.

The following are not hard and fast rules, in fact, they should be ignored or contradicted from time to time for variety's sake.  They are just suggestions to consider while designing the level for best gameplay.

{{innerbox| '''CliffyB's Rule: Counter Desirability with Risk'''

 Put desirable things such as powerful weapons in a dangerous or exposed spot.  In DM that means in an exposed spot, such as an open space, a junction or a blind alley.  In team maps it means, in no-man's-land. (aka, ''Risk vs Reward'')

}}

==Game Objectives==

Placement of [[Legacy:GameObjective|GameObjective]]s is crucial.  The layout of the map is usually centered around the placement of these special items and this is where item placement should begin.  Some gametypes, namely Deathmatch, do not have a GameObjective actor to place.  Although, one could argue with confidence that [[Legacy:PlayerStart|PlayerStart]]s should be treated with the same importance as game objectives in those instances.  Capture the Flag FlagBases, Bombing Run BombSpawns and BombDeliveries, Double Domination DomPoints and Onslaught PowerNodes and PowerCores are all examples of Game Objectives.  First and foremost, the Game Objectives should be equal all sides of the match; equally accessible, equally attainable.

==Weapons==

When considering weapon placement, keep in mind how easy and quick it is to reach a weapon. While keeping in mind CliffyB's rule, remember that if one cannot find a weapon in a reasonable amount of time, one may get frustrated. If this is the case, often times a few will reach weapons and therefore dominate those that cannot.  Consider giving an equal distance from playerstart to weapon.  Also consider placing a good &quot;starter weapon&quot; near each player start, so that the respawning player is facing a weapon they can grab and immediately join the fray.

===Specific Weapon Suggestions===
; Assault Rifle : Usually you aren't going to put extra assault rifles in a map, people get dual assault rifles by killing other people.  But if you do place them, put them in an area where the player should've picked up another weapon already.
; Translocator : Although normally given to each player at map start, the translocator can be given via PickUpBase in gametypes that do not allow translocators or match configurations  that do not give them at map start.  Place these near player starts or areas where the translocator would be useful. (i.e., a large chasm or high ledge)
; Chainsaw (UT) : Cramped places that allow charging attacks.
; BioRifle : At the end of a tunnel or a main doorway.  Perhaps somewhere dark or confined.  Place it near a game objective or near a room that can be held.
; Shock Rifle : Best in open areas; corridors for combo shots.
; MiniGun : Near areas where heated combat and crossfire is likely.
; Link Gun : Try to put this near every power node in Onslaught because you need it to heal power nodes and vehicles.  This weapon is crucial for more than fighting in Onslaught and other gametypes that allow vehicles.
; Flak Cannon : Best in cramped or confined areas for more opportunities for bounce shots and splash damage. (Most memorable example of this: The crenulated 270-degree-curved hallway in UT's DM-Grinder &amp;rarr;StarWeaver)
; Rocket Launcher : Best in places with walls for splash damage, but uncramped and uncluttered to avoid accidental suicides.
; Lightning Gun and Sniper Rifle : Near places that are good for sniping.  But you should consider the differences between the two.  With Sniper Rifles, it is more difficult to locate the firer, and it fires faster than the lightning gun.  But the Lightning Gun does more damage and doesn't have that annoying fog.
; Redeemer : Due to it's high power and ability to be guided, put this in a hidden and or hard to reach place.
; Ion Painter : In a wide open area that can aim at a big open area.  The blast effect of this weapon is made to take out large or numberous opponents.

==Ammunition==

It's useful to consider the placement of ammunition independantly of the actual positioning of the weapon.  It is usually a good idea to place ammo for a weapon near the weapon placement itself, however having extra stashes of different ammo adds a good measure of variety.  If these stashes are particularly extensive, put them in hard to reach or hidden areas.

==Powerups==

Powerups give a player an extra boost of some kind.  These goodies should be positioned in such a way that when the player needs them most, they can find them available.  Keeping in mind ''Risk vs Reward'', place more powerful items in hard to reach or hidden places.

===Health===

Health can be difficult to place.  Place too much and players will not be vulnerable enough to score kills on each other.  Place too little and player will die too easily to enjoy the match.  Health is the commodity that keeps players alive, so it is the most critical of the powerups.

====MiniHealth====

Because these can give players more than 100 health (although in small doses), you can place these near PlayerStarts, espcially those near dangerous areas.  The small health boost encourages the mapper to place a multiple vials in clusters or rows along a path.

====Health Pack====

The general health powerup should be available to players who need it.  Place these on the outside of major battle areas, or places that players may want to otherwise retreat to.

====Keg O' Health====

This is a major powerup and should be reserved for those players who go the extra mile to find it.  It should either be in a dangerous area (open or prone to crossfire), an area that is dangerous to get to (on a small ledge over lava or the like) or hidden from view.

===Shield===

Shield powerups add an extra protection for players.  Think of this as a bonus, not as critical as health.  Give shield powerups to players who will need it to launch a dangerous attach or defend against the odds.

====Shield Pack====

The basic shield powerup gives enough shield to protect the player during a small encounter with the enemy.  Place these along paths that lead to heavy battle zones.

====Super Shield====

This is another major powerup, like the Keg O' Health.  This should be difficult or dangerous to get to or it should be out of plain sight.

===UDamage (Double Damage Amp)===

This is the third major powerup, giving the players an advantage in combat.  Place near areas of heated battle or crossfire so they have a chance to use them.  However, due to it's power, it should also be hard to reach and / or hidden.

===Adrenaline===

[[Legacy:Adrenaline|Adrenaline]] allows players to collect enough energy to perform a special adrenaline combo: a move that can give them a special power of their choosing for a short period of time.  This is a special power that should be given as a reward for finding a particularly dangerous space.  Place these in open spaces or where crossfire is common.  Place enough to allow each of the recommended number of players to perform a combo at least once in a typical match.

==Vehicle Factories==

Vehicles serve several purposes.  They are a source of increase mobility, even carrying multiple players at once.  They are also equipped with increased armor, weapons and ammo.  These plusses make vehicles highly desirable.  Place these Vehicle Factories in places that allow a respawning player to get back in the action quick.  Place them so players can enter a highly dangerous area well protected and equally matched to the danger.  Take into account the speed and mobility of the vehicle; do not place a slow-moving Tank or Leviathan so far away from the heat of battle that player will be frustrated.  Lightweight vehicles should likewise be used in areas where heavy combat is not as likely.

See also [[Legacy:Vehicle Gameplay|Vehicle Gameplay]].

==Gametype Specific Suggestions==

===Deathmatch and Team Deathmatch===

If your map is aimed at a low number of players having one or two large health packs on the level is better than having many smaller ones.  This adds points of control to the map that will concentrate combat and add tension to a map that otherwise wouldn't be there.  For fewer players high amounts of armour should also be avoided - place a small amount of armour away from the health.  By moving the armour away players will be forced to travel the level in its entirety allowing suprise attacks and a bit of hope for a player whose just been killed.

On larger deathmatch levels look for the rooms that can be easily held and then distribute health and armour away from those places.  Having a very small amount of health in this type of room is a good thing, but too much and you'll unbalance Team Deathmatch play.

===Capture the Flag===

The placement of health and armour around a CTF map is critical to achieving a good balance of attack and defense.  Too little health in and around the flag room and defenders will have a hard time keeping the flag inside the base.  Too much health and even the most co-ordinated attack will struggle.  As a general rule of thumb a single health pack per defending player should be sufficient.

Placing a small amount of health along the main routes between the two flags is a good idea.  However, ensure that it will cost the flag carrier some time to collect it.  The way the flag carrier can trade safety (in terms of the likelihood of getting killed) against speed of escape.  Any more than a tenth of a second is probably too much time wasted.

By the very nature of the game type, most of the health and armour will be located at either end of the map.  Depending on the structure of your map it may be better to adopt a more even spread of health throughout the level.

Always place armour away from the flag base.  It's generally better to favour attackers when placing armour but also ensure that it costs time to collect it.  The armour placement in Coret is a fine example of this.  Both the 100 armour and 50 armour require a player to go slightly out of their way to obtain them, and neither of them are that close to the flag and the defenders.

==Related Topics==
* [[Legacy:Map Flow|Map Flow]]
** [[Legacy:Placing PlayerStart|Placing PlayerStart]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Design|Map Design]]

==Discussion==

'''SuperApe:''' Merged in Weapon Placement info because they are really the same topic.  I don't see any reason to split them up other than to cause people to get lost while we duplicate a lot of info.  Added GameObjectives, Powerup specifics, filled in rest of weapon specifics, edited overview.  Encorporated with the [[Legacy:Topics On Mapping|Topics on Mapping]] family of pages.  Removed from Big Cleanup.  Feel free to add to the Gametype Specific Suggestions subtopic.

'''Bob_The_Beheader:''' This page should contain some info about how bots will interact with inventory items. I have linked to this page from the [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] Tutorial.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InventoryAttachment</title>
    <id>1489</id>
    <revision>
      <id>3736</id>
      <timestamp>2003-03-05T00:29:56Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:InventoryAttachment|InventoryAttachment]]}}

An InventoryAttachment is an actor that is attached to a pawn in third person view. In UT2003, this is only used for the weapons' attachments, which have their own subclass, [[Legacy:WeaponAttachment|WeaponAttachment]], for that purpose.

The only two properties of [[Legacy:InventoryAttachment|InventoryAttachment]] that are visible from the script source are:

; var bool bFastAttachmentReplication : If true, only a subset of the [[Legacy:Actor|Actor]] properties needed for basic attachments are replicated.

; function InitFor(Inventory I) : This sets the object's Instigator to the Instigator of the Inventory passed in.

'''Soldat:''' Love attachments... hate them too sometimes. Seems we could add a bit to this ^.^ i will look into it further. A few topics needing to be covered:

*Positioning/rotation of the weapon, and which bone it attaches to
*3rd person muzzle flashes
*Bullet hit effects (when you shoot dirt, it flies up!) It's handled here too
*Implementing attachment anims (3rd person reloading, etc)

anything else?

'''Mysterial:''' That stuff belongs in [[Legacy:WeaponAttachment|WeaponAttachment]], though, not here, since those functions exist only in [[Legacy:WeaponAttachment|WeaponAttachment]]

'''Soldat:''' aye... well, i guess one of us should get crackin' on that then =)

'''ZxAnPhOrIaN:''' What is a weapon attachment, anyway? Does it alter the firing speed, projectiles, etc? :confused:

'''Mysterial:''' Like stated above. It's the actor you see attached to the pawns in third person view. It doesn't have any impact on the item's use or effects at all - it's purely visual. Also, Soldat: if you want to do [[Legacy:WeaponAttachment|WeaponAttachment]], go right ahead, I wasn't planning on doing it, as I've only used it once and only a few aspects at that.

'''ZxAnPhOrIaN:''' Ahhhh... Eye candy... drool...</text>
    </revision>
    <revision>
      <id>3737</id>
      <timestamp>2003-03-04T20:56:43Z</timestamp>
      <contributor>
        <ip>Mysterial</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:InventoryAttachment|InventoryAttachment]]}}

An InventoryAttachment is an actor that is attached to a pawn in third person view. In UT2003, this is only used for the weapons' attachments, which have their own subclass, [[Legacy:WeaponAttachment|WeaponAttachment]], for that purpose.

The only two properties of [[Legacy:InventoryAttachment|InventoryAttachment]] that are visible from the script source are:

; var bool bFastAttachmentReplication : If true, only a subset of the [[Legacy:Actor|Actor]] properties needed for basic attachments are replicated.

; function InitFor(Inventory I) : This sets the object's Instigator to the Instigator of the Inventory passed in.

'''Soldat:''' Love attachments... hate them too sometimes. Seems we could add a bit to this ^.^ i will look into it further. A few topics needing to be covered:

*Positioning/rotation of the weapon, and which bone it attaches to
*3rd person muzzle flashes
*Bullet hit effects (when you shoot dirt, it flies up!) It's handled here too
*Implementing attachment anims (3rd person reloading, etc)

anything else?

'''Mysterial:''' That stuff belongs in [[Legacy:WeaponAttachment|WeaponAttachment]], though, not here, since those functions exist only in [[Legacy:WeaponAttachment|WeaponAttachment]]

'''Soldat:''' aye... well, i guess one of us should get crackin' on that then =)

'''ZxAnPhOrIaN:''' What is a weapon attachment, anyway? Does it alter the firing speed, projectiles, etc? :confused:

'''Mysterial:''' Like stated above. It's the actor you see attached to the pawns in third person view. It doesn't have any impact on the item's use or effects at all - it's purely visual. Also, Soldat: if you want to do [[Legacy:WeaponAttachment|WeaponAttachment]], go right ahead, I wasn't planning on doing it, as I've only used it once and only a few aspects at that.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:InventorySpot</title>
    <id>1468</id>
    <revision>
      <id>3684</id>
      <timestamp>2004-09-02T19:56:41Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; InventorySpot (Package: Engine)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:SmallNavigationPoint|SmallNavigationPoint]] &gt;&gt; InventorySpot (Package: Engine)}}

InventorySpots are automatically created by the editor for every [[Legacy:Inventory (UT)|Inventory (UT)]] item in UT or [[Legacy:Pickup|Pickup]]/[[Legacy:XPickUpBase|xPickUpBase]] in UT2003. They are invisible in the editor and in the game.

'''Important:''' Don't place these in your maps, UnrealEd will handle it for you.

==Properties (UT) ==
; [[Legacy:Inventory (UT)|Inventory (UT)]] markedItem : The item this InventorySpot was created for.

==Properties (UT2003) ==
; [[Legacy:Pickup|Pickup]] markedItem : The pickup this InventorySpot was created for.
; [[Legacy:XPickUpBase|xPickUpBase]] myPickupBase : The pickup base this InventorySpot was created for.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3685</id>
      <timestamp>2003-01-11T01:28:07Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <minor/>
      <comment>Fixed xPickUpBase link</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; InventorySpot (Package: Engine)}}
:

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:SmallNavigationPoint|SmallNavigationPoint]] &gt;&gt; InventorySpot (Package: Engine)}}

InventorySpots are automatically created by the editor for every [[Legacy:Inventory (UT)|Inventory (UT)]] item in UT or [[Legacy:Pickup|Pickup]]/[[Legacy:XPickUpBase|xPickUpBase]] in UT2003. They are invisible in the editor and in the game.

'''Important:''' Don't place these in your maps, UnrealEd will handle it for you.

==Properties (UT) ==
; [[Legacy:Inventory (UT)|Inventory (UT)]] markedItem : The item this InventorySpot was created for.

==Properties (UT2003) ==
; [[Legacy:Pickup|Pickup]] markedItem : The pickup this InventorySpot was created for.
; [[Legacy:XPickUpBase|xPickUpBase]] myPickupBase : The pickup base this InventorySpot was created for.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Invisibility</title>
    <id>28397</id>
    <revision>
      <id>40069</id>
      <timestamp>2009-11-15T08:24:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Invisible Collision Hull</title>
    <id>1460</id>
    <revision>
      <id>3665</id>
      <timestamp>2006-11-26T13:03:49Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Change link from Glass to Making Windows</comment>
      <text xml:space="preserve">An '''Invisible Collision Hull''' (ICH) is a type of [[Legacy:Semisolid|semisolid]] brush that is invisible. Its purpose is to block actors such as players and projectiles. ICHs were commonly used in pre-[[Legacy:UT2003|UT2003]] versions of the engine, but in [[Legacy:UnrealEd 3|UnrealEd 3]] they are superseded by the [[Legacy:BlockingVolume|BlockingVolume]]. 

To add one to a map:

# form the [[Legacy:Red Builder Brush|red builder brush]] into the required shape
# click the [[Legacy:Add Special|add special]] button in the [[Legacy:Toolbox|toolbox]]
# a pop-up window appears: select &quot;invisible collision hull&quot; from the ''Presets'' drop-down list
# click ''Add''

Technically, the ICH is a [[Legacy:Semisolid|semisolid]] brush, with all the polys flagged to be invisible. Note that invisible polys are only visible in an editor 3D viewport when [[Legacy:Realtime Preview|realtime preview]] is off, so if this is on, you won't see ICHs at all.

Invisible collision hulls can be used in combination with [[Legacy:Sheet|sheet]] brushes to make [[Legacy:Making Windows|glass]] and [[Legacy:Masked Texture|masked texture]]s such as grilles block players and projectiles. 

ICHs should not touch walls or zone boundaries, otherwise errors may occur, e.g. becoming non-solid.

Some mappers prefer alternative techniques:
* making a transparent [[Legacy:Solid|solid]] brush. This is prone to error and can lead to [[Legacy:BSP Hole|BSP hole]]s.
* using several [[Legacy:BlockAll|BlockAll]] actors. These simply provide an upright [[Legacy:Collision Cylinder|collision cylinder]], and they don't interfere with the [[Legacy:BSP|BSP]]. But for large areas they give awkward results: players can feel the row of cylinders is bumpy.

It's useful to use a particular texture for all of your ICH brushes; this way they are easier to see in the editor. Notably, ChrisToth's map DM-Axxon used the texture Botpack.Ammocount.AmmoCountBar for ICH polys. This is a plain green and makes them very easy to spot.

==Related Topics ==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Semisolid|Semisolid]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3666</id>
      <timestamp>2003-10-29T15:09:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>tidying a bit more</comment>
      <text xml:space="preserve">An '''Invisible Collision Hull''' (ICH) is a type of [[Legacy:Semisolid|semisolid]] brush that is invisible. Its purpose is to block actors such as players and projectiles. ICHs were commonly used in pre-[[Legacy:UT2003|UT2003]] versions of the engine, but in [[Legacy:UnrealEd 3|UnrealEd 3]] they are superseded by the [[Legacy:BlockingVolume|BlockingVolume]]. 

To add one to a map:

# form the [[Legacy:Red Builder Brush|red builder brush]] into the required shape
# click the [[Legacy:Add Special|add special]] button in the [[Legacy:Toolbox|toolbox]]
# a pop-up window appears: select &quot;invisible collision hull&quot; from the ''Presets'' drop-down list
# click ''Add''

Technically, the ICH is a [[Legacy:Semisolid|semisolid]] brush, with all the polys flagged to be invisible. Note that invisible polys are only visible in an editor 3D viewport when [[Legacy:Realtime Preview|realtime preview]] is off, so if this is on, you won't see ICHs at all.

Invisible collision hulls can be used in combination with [[Legacy:Sheet|sheet]] brushes to make [[Legacy:Glass|glass]] and [[Legacy:Masked Texture|masked texture]]s such as grilles block players and projectiles. 

Some mappers prefer alternative techniques:
* making a transparent [[Legacy:Solid|solid]] brush. This is prone to error and can lead to [[Legacy:BSP Hole|BSP hole]]s.
* using several [[Legacy:BlockAll|BlockAll]] actors. These simply provide an upright [[Legacy:Collision Cylinder|collision cylinder]], and they don't interfere with the [[Legacy:BSP|BSP]]. But for large areas they give awkward results: players can feel the row of cylinders is bumpy.

It's useful to use a particular texture for all of your ICH brushes; this way they are easier to see in the editor. Notably, ChrisToth's map DM-Axxon used the texture Botpack.Ammocount.AmmoCountBar for ICH polys. This is a plain green and makes them very easy to spot.

==Related Topics ==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Semisolid|Semisolid]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3667</id>
      <timestamp>2005-07-04T19:01:08Z</timestamp>
      <contributor>
        <ip>82-36-211-193.cable.ubr04.king.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">An '''Invisible Collision Hull''' (ICH) is a type of [[Legacy:Semisolid|semisolid]] brush that is invisible. Its purpose is to block actors such as players and projectiles. ICHs were commonly used in pre-[[Legacy:UT2003|UT2003]] versions of the engine, but in [[Legacy:UnrealEd 3|UnrealEd 3]] they are superseded by the [[Legacy:BlockingVolume|BlockingVolume]]. 

To add one to a map:

# form the [[Legacy:Red Builder Brush|red builder brush]] into the required shape
# click the [[Legacy:Add Special|add special]] button in the [[Legacy:Toolbox|toolbox]]
# a pop-up window appears: select &quot;invisible collision hull&quot; from the ''Presets'' drop-down list
# click ''Add''

Technically, the ICH is a [[Legacy:Semisolid|semisolid]] brush, with all the polys flagged to be invisible. Note that invisible polys are only visible in an editor 3D viewport when [[Legacy:Realtime Preview|realtime preview]] is off, so if this is on, you won't see ICHs at all.

Invisible collision hulls can be used in combination with [[Legacy:Sheet|sheet]] brushes to make [[Legacy:Glass|glass]] and [[Legacy:Masked Texture|masked texture]]s such as grilles block players and projectiles. 

ICHs should not touch walls or zone boundaries, otherwise errors may occur, e.g. becoming non-solid.

Some mappers prefer alternative techniques:
* making a transparent [[Legacy:Solid|solid]] brush. This is prone to error and can lead to [[Legacy:BSP Hole|BSP hole]]s.
* using several [[Legacy:BlockAll|BlockAll]] actors. These simply provide an upright [[Legacy:Collision Cylinder|collision cylinder]], and they don't interfere with the [[Legacy:BSP|BSP]]. But for large areas they give awkward results: players can feel the row of cylinders is bumpy.

It's useful to use a particular texture for all of your ICH brushes; this way they are easier to see in the editor. Notably, ChrisToth's map DM-Axxon used the texture Botpack.Ammocount.AmmoCountBar for ICH polys. This is a plain green and makes them very easy to spot.

==Related Topics ==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Semisolid|Semisolid]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IonCannon</title>
    <id>1498</id>
    <revision>
      <id>3754</id>
      <timestamp>2005-01-14T03:08:26Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; IonCannon (Package: XWeapons)}}

Satellite that floats in the air above a level and generates an ion blast when triggered by [[Legacy:PainterFire|PainterFire]].

All IonCannons in a map form a [[Legacy:Linked List|linked list]] with the first ion cannon's &lt;code&gt;bFirstCannon&lt;/code&gt; property set to &lt;code&gt;True&lt;/code&gt; and &lt;code&gt;nextCannon&lt;/code&gt; pointing to the next ion connon. This list is used by the Ion Painter gun to quickly find a cannon that can attack the specified location.

==Properties ==

===Main ===
; int Damage :  per wave  
; float DamageRadius :  of final wave  
; class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType :  
; Sound FireSound :  
; class&lt;[[Legacy:IonEffect|IonEffect]]&gt; IonEffectClass :  
; Vector MarkLocation :  
; float MaxAngle :  The maximum angle the cannon may deviate from pointing straight down when firing. The default value is 45, and this is a fine example of '''Digital Extremes not RTFM'''. UnrealScript trig [[Legacy:Global Function|Global Function]]s are in [[Wikipedia:Radian]]s, so 45 actually means about 7 degrees. Which is why default cannons won't fire very far from the spot beneath them. If you ''want'' 45 degrees, use 0.785.
; float MaxRange :  default 10,000
; float MinRange : default 1,000 
; float MomentumTransfer :  per wave  
; vector ShakeOffsetMag :  max view offset vertically  
; vector ShakeOffsetRate :  how fast to offset view vertically  
; float ShakeOffsetTime :  how much time to offset view  
; vector ShakeRotMag :  how far to rot view  
; vector ShakeRotRate :  how fast to rot view  
; float ShakeRotTime :  how much time to rot the instigator's view  

===Hidden ===
; Vector BeamDirection :  
; bool bFirstCannon :  
; Vector DamageLocation :  
; AvoidMarker Fear :  
; IonCannon nextCannon :  

==Triggerable?==

It's not possible to use a trigger or a zone to activate the Ion Cannon when a player encroaches the trigger radius. But it would be possible to create an &quot;IonCannonTrigger&quot; or a custom volume which upon triggering selects an ion cannon and makes it fire at a specified actor or the event instigator.

There is a custom class at [[Legacy:Anozireth/IonTrigger|Anozireth/IonTrigger]].  You can either tell it to fire at a specified target or simply at the player who triggered it.  You can set the minimum delay between firings, and you can set a maximum number of firings.  

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3755</id>
      <timestamp>2005-01-13T23:24:13Z</timestamp>
      <contributor>
        <ip>Lepam03.pamlico.k12.nc.us</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:IonEffect</title>
    <id>28537</id>
    <revision>
      <id>40238</id>
      <timestamp>2009-11-17T11:04:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ironblayde</title>
    <id>1503</id>
    <revision>
      <id>3765</id>
      <timestamp>2006-02-20T02:22:18Z</timestamp>
      <contributor>
        <ip>Ip68-99-17-45.om.om.cox.net</ip>
      </contributor>
      <comment>New map out</comment>
      <text xml:space="preserve">Greetings everyone. I just got into playing Unreal Tournament online in October 2003, and didn't discover the Wiki until February 2004, so I guess I'm kind of late to the party, but I've decided to try my hand in tinkering with the game we all love. I was surprised to find that there are still so many active players given that the game is something like five years old now!

==My Background ==

I've been into game development since 1993 or so, when I started playing with AppleSoft BASIC on our then-amazing Apple IIgs. I made the switch over to the PC world in 1995 or so, and learned what I could of game programming in DOS for the next four years. I still have 20-25 games written in QBasic sitting on my hard drive that I dust off and revisit once in awhile. I started working on the Win32 platform in 1999, using C, C++, and DirectX. I used to be a regular visitor to [http://www.gamedev.net GameDev.net] and wrote a number of tutorials for them, so it's possible that someone here might recognize me from there.

Since I've been programming for so long, modding UT is what originally caught my interest here, but I didn't have any ideas for what I'd like to change about the game, so I fired up UnrealEd one day to poke around a bit, and now I'm addicted to it. I might try some UnrealScript in the future, but for now I'm happily exploring the world of mapping.

==Latest News ==

'''19 February 2006:''' Wow, it's been an eternity since I visited this place. But I just fired up UnrealEd again on a whim not long ago, and whipped up a new map, [[Legacy:Ironblayde/CTF-Axia|CTF-Axia]]. You can download it from NaliCity [http://nalicity.beyondunreal.com/map_hub.php?mid=9024 here].

'''13 July 2004:''' [[Legacy:Ironblayde/CTF-Susurrous|CTF-Susurrous]] has been sitting idle on my hard drive for about three months now, but I finally got around to finishing it. The overall layout is the same as it was before, but I mixed up the architecture quite a bit, added trim everywhere it was missing, and replaced all the textures with new ones that I took from UT2004 and edited to fit my needs. It's nothing brilliant, but I think it came out fairly well.

'''26 April 2004:''' I'm now the newest member of the review team over at [http://nalicity.beyondunreal.com NaliCity]! I suppose it would be in bad taste to review all my own maps and give them perfect scores, but you'll be seeing my analyses of other people's efforts pretty regularly now. There's quite an impressive backlog of reviews that need to be written, so I'm sure it'll keep me busy.

'''18 April 2004:''' [[Legacy:Ironblayde/CTF-Stax|CTF-Stax]], a small CTF map originally designed by [[Legacy:CH3Z|CH3Z]] and fixed up with my help, is now available on NaliCity [http://nalicity.beyondunreal.com/map_hub.php?mid=7107 here]. If anyone cares to offer a brief review, we'd both appreciate it! Work on [[Legacy:Ironblayde/CTF-Susurrous|Susurrous Outpost]] is still progressing; I got a ton of useful feedback from Hourences on how to improve it, which has set the release back quite a bit, but the map should be much better for the added effort.

'''03 April 2004:''' I've reorganized this page so that my mapping and design info will be located on separate pages. My first map, CTF-Susurrous is in working order as of about 2:00 this morning. There are some kinks that need to be worked out, and I'd love to optimize things a bit, but it's fully playable. Check the [[Legacy:Ironblayde/CTF-Susurrous|Susurrous Outpost]] page for details and a screenshot or four.

==Content ==

Here you can take a look at all the maps I'm working on or have worked on for Unreal Tournament, and hopefully UT2004 if I ever get around to learning how to model static meshes. :)

===Unreal Tournament maps ===

*[[Legacy:Ironblayde/CTF-Axia|Ironblayde/CTF-Axia]] - Simple and straightforward, created in four days after an 18-month hiatus.
*[[Legacy:Ironblayde/CTF-Stax|Ironblayde/CTF-Stax]] - A small CTF map created with my buddy [[Legacy:CH3Z|CH3Z]].
*[[Legacy:Ironblayde/CTF-Susurrous|Ironblayde/CTF-Susurrous]] - My first real effort, a large CTF map for about 16 players.

----

'''EntropicLqd:'''Hi, Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello, welcome. Great post on the trig rant page!!! :D

'''CH3Z:''' Ahhh there he is! Welcome, buddy! Map is looking great! =)

'''CH3Z:''' (20April-o4) Iron, I was just thinking about how intense the environment must be getting as you develop CTF-Susurrous and I had an idea. I could have emailed you this but what the heck, someone might pop in here and bennefit from it. It must take quite awhile to build it. Here's what I was thinking. If you select all the actors in the section of the map you are working on and edit/copy them to clipboard, then go file/new and past that section in, you could develop it seperately and build more often quicker. Then when you get that area right, select all actors and copy and past it back into the rest of the map for only one rebuild of the whole thing. Hope it helps.

'''Ironblayde:''' Thanks for the suggestion Ch3z, but there's actually an easier way to do that. When I want to work on one section of the map in particular, I select the actors that make up that region of the map and create a new [[Legacy:Group Browser|group]] for them (so I can select them all simultaneously anytime in the future). Then with those things selected, I hit Show Selected Actors Only, and make sure the Only Rebuild Visible Actors box is checked on the Build Options dialog box. That way, whenever I hit the Build button, only the region of the map I've specified gets built, with no cumbersome copy/paste operations to worry about.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3766</id>
      <timestamp>2004-07-13T10:57:44Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greetings everyone. I just got into playing Unreal Tournament online in October 2003, and didn't discover the Wiki until February 2004, so I guess I'm kind of late to the party, but I've decided to try my hand in tinkering with the game we all love. I was surprised to find that there are still so many active players given that the game is something like five years old now!

==My Background ==

I've been into game development since 1993 or so, when I started playing with AppleSoft BASIC on our then-amazing Apple IIgs. I made the switch over to the PC world in 1995 or so, and learned what I could of game programming in DOS for the next four years. I still have 20-25 games written in QBasic sitting on my hard drive that I dust off and revisit once in awhile. I started working on the Win32 platform in 1999, using C, C++, and DirectX. I used to be a regular visitor to [http://www.gamedev.net GameDev.net] and wrote a number of tutorials for them, so it's possible that someone here might recognize me from there.

Since I've been programming for so long, modding UT is what originally caught my interest here, but I didn't have any ideas for what I'd like to change about the game, so I fired up UnrealEd one day to poke around a bit, and now I'm addicted to it. I might try some UnrealScript in the future, but for now I'm happily exploring the world of mapping.

==Latest News ==

'''13 July 2004:''' [[Legacy:Ironblayde/CTF-Susurrous|CTF-Susurrous]] has been sitting idle on my hard drive for about three months now, but I finally got around to finishing it. The overall layout is the same as it was before, but I mixed up the architecture quite a bit, added trim everywhere it was missing, and replaced all the textures with new ones that I took from UT2004 and edited to fit my needs. It's nothing brilliant, but I think it came out fairly well.

'''26 April 2004:''' I'm now the newest member of the review team over at [http://nalicity.beyondunreal.com NaliCity]! I suppose it would be in bad taste to review all my own maps and give them perfect scores, but you'll be seeing my analyses of other people's efforts pretty regularly now. There's quite an impressive backlog of reviews that need to be written, so I'm sure it'll keep me busy.

'''18 April 2004:''' [[Legacy:Ironblayde/CTF-Stax|CTF-Stax]], a small CTF map originally designed by [[Legacy:CH3Z|CH3Z]] and fixed up with my help, is now available on NaliCity [http://nalicity.beyondunreal.com/map_hub.php?mid=7107 here]. If anyone cares to offer a brief review, we'd both appreciate it! Work on [[Legacy:Ironblayde/CTF-Susurrous|Susurrous Outpost]] is still progressing; I got a ton of useful feedback from Hourences on how to improve it, which has set the release back quite a bit, but the map should be much better for the added effort.

'''03 April 2004:''' I've reorganized this page so that my mapping and design info will be located on separate pages. My first map, CTF-Susurrous is in working order as of about 2:00 this morning. There are some kinks that need to be worked out, and I'd love to optimize things a bit, but it's fully playable. Check the [[Legacy:Ironblayde/CTF-Susurrous|Susurrous Outpost]] page for details and a screenshot or four.

==Content ==

Here you can take a look at all the maps I'm working on or have worked on for Unreal Tournament, and hopefully UT2004 if I ever get around to learning how to model static meshes. :)

===Unreal Tournament maps ===

*[[Legacy:Ironblayde/CTF-Stax|Ironblayde/CTF-Stax]] - A small CTF map created with my buddy [[Legacy:CH3Z|CH3Z]].
*[[Legacy:Ironblayde/CTF-Susurrous|Ironblayde/CTF-Susurrous]] - My first real effort, a large CTF map for about 16 players.

----

'''EntropicLqd:'''Hi, Welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Hello, welcome. Great post on the trig rant page!!! :D

'''CH3Z:''' Ahhh there he is! Welcome, buddy! Map is looking great! =)

'''CH3Z:''' (20April-o4) Iron, I was just thinking about how intense the environment must be getting as you develop CTF-Susurrous and I had an idea. I could have emailed you this but what the heck, someone might pop in here and bennefit from it. It must take quite awhile to build it. Here's what I was thinking. If you select all the actors in the section of the map you are working on and edit/copy them to clipboard, then go file/new and past that section in, you could develop it seperately and build more often quicker. Then when you get that area right, select all actors and copy and past it back into the rest of the map for only one rebuild of the whole thing. Hope it helps.

'''Ironblayde:''' Thanks for the suggestion Ch3z, but there's actually an easier way to do that. When I want to work on one section of the map in particular, I select the actors that make up that region of the map and create a new [[Legacy:Group Browser|group]] for them (so I can select them all simultaneously anytime in the future). Then with those things selected, I hit Show Selected Actors Only, and make sure the Only Rebuild Visible Actors box is checked on the Build Options dialog box. That way, whenever I hit the Build button, only the region of the map I've specified gets built, with no cumbersome copy/paste operations to worry about.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ironblayde/CTF-Axia</title>
    <id>1506</id>
    <revision>
      <id>3771</id>
      <timestamp>2006-02-20T02:22:01Z</timestamp>
      <contributor>
        <ip>Ip68-99-17-45.om.om.cox.net</ip>
      </contributor>
      <comment>New page for a new map</comment>
      <text xml:space="preserve">I haven't touched UnrealEd in about a year and a half, but a few days ago I was suddenly overcome by the urge to mess with it again. I doubt I have the artistic ability to build something for UT2004, and so CTF-Axia was born. The visuals are nothing special, but I think it plays reasonably well. I'd say that overall, I'm pretty happy with the way it turned out. My previous maps both got some complaints about being too dark and having poor performance in some places; hopefully this release does better in both respects. Any comments are welcome, both positive and negative. Have fun, and thanks for playing.

[http://download.beyondunreal.com/fileworks.php/nalicity/utctf/ctf-axia.zip Download from BeyondUnreal]

===Screenshots ===

{|

|-
|http://www.ironblayde.com/images/maps/Axia01.jpg
|-
|http://www.ironblayde.com/images/maps/Axia02.jpg
|}

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ironblayde/CTF-Stax</title>
    <id>1505</id>
    <revision>
      <id>3769</id>
      <timestamp>2004-07-13T10:59:17Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Stax is a small CTF map for four to eight players. It was originally designed by [[Legacy:CH3Z|CH3Z]] as an InstaGib map, and while trying to provide helpful commentary on a message board, I suggested we collaborate on the map, and just two days later, CTF-Stax in its final form was born. I added weapons and pickups to it so that we could release it publicly without isolating the people who actually like taking more than one shot to kill their enemies. Although It's a simple layout (owing to its origins as an IG map), I think it's a lot of fun to play. Please leave us your comments if you try it out; we'd both like to know what could have been done better.

[http://download.beyondunreal.com/fileworks.php/nalicity/utctf/ctf-stax.zip Download from BeyondUnreal]

===Screenshots ===

{|

|-
|http://www.ironblayde.com/images/maps/Stax01.jpg
|-
|http://www.ironblayde.com/images/maps/Stax02.jpg
|-
|http://www.ironblayde.com/images/maps/Stax03.jpg
|-
|http://www.ironblayde.com/images/maps/Stax04.jpg
|-
|http://www.ironblayde.com/images/maps/Stax05.jpg
|}

'''Mosquito:''' way to dark!!

'''Ironblayde:''' Yeah, Ch3z said that some people might be bothered by the low light, but we both agreed to keep it as it is for atmosphere's sake at; I don't think the place would look quite right with too much light in it. Oh well, sorry you didn't enjoy it. I guess I just have a thing for dark maps. :D

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3770</id>
      <timestamp>2004-04-19T19:58:31Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Stax is a small CTF map for four to eight players. It was originally designed by [[Legacy:CH3Z|CH3Z]] as an InstaGib map, and while trying to provide helpful commentary on a message board, I suggested we collaborate on the map, and just two days later, CTF-Stax in its final form was born. I added weapons and pickups to it so that we could release it publicly without isolating the people who actually like taking more than one shot to kill their enemies. Although It's a simple layout (owing to its origins as an IG map), I think it's a lot of fun to play. You can download the map from NaliCity by clicking [http://nalicity.beyondunreal.com/map_hub.php?mid=7107 here]. Please leave us your comments if you try it out; we'd both like to know what could have been done better.

===Screenshots ===

{|

|-
|http://www.ironblayde.com/images/utshots/Stax01.jpg
|-
|http://www.ironblayde.com/images/utshots/Stax02.jpg
|-
|http://www.ironblayde.com/images/utshots/Stax03.jpg
|-
|http://www.ironblayde.com/images/utshots/Stax04.jpg
|-
|http://www.ironblayde.com/images/utshots/Stax05.jpg
|}

'''Mosquito:''' way to dark!!

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ironblayde/CTF-Susurrous</title>
    <id>1504</id>
    <revision>
      <id>3767</id>
      <timestamp>2004-07-13T10:53:03Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>CTF-Susurrous released</comment>
      <text xml:space="preserve">Though not my first release, this is actually my first map. I started it several months ago, but towards the end, I ran into a block and wasn't sure how to finish it. Thus it sat collecting dust until I finally decided to add the last few details and release it. Susurrous Outpost is a very large CTF map, good for 16 players, give or take a few. Its overall layout is somewhat similar to that of CTF-Noxion16, but considerably larger. It may take some time to learn the layout. You're definitely going to want your translocator handy.

There are some BSP issues I couldn't resolve, partly due to my inexperience when I constructed the vast majority of the geometry, and partly due to the simple fact that it's a very complex map &amp;ndash; more than 4,000 brushes. Also, the poly count gets into the 400-500 range in a couple of places, so old hardware will likely complain a bit. All in all, I think it's decent for what it is &amp;ndash; a first effort.

Special thanks to Hourences for offering a lot of useful feedback on an early version of this map.

[http://download.beyondunreal.com/fileworks.php/nalicity/utctf/ctf-susurrous.zip Download from BeyondUnreal]

===Screenshots ===

{|

|-
|http://www.ironblayde.com/images/maps/Susurrous01.jpg
|-
|http://www.ironblayde.com/images/maps/Susurrous02.jpg
|-
|http://www.ironblayde.com/images/maps/Susurrous03.jpg
|-
|http://www.ironblayde.com/images/maps/Susurrous04.jpg
|-
|http://www.ironblayde.com/images/maps/Susurrous05.jpg
|}

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3768</id>
      <timestamp>2004-04-05T18:23:42Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>Tagged for Category Screenshots</comment>
      <text xml:space="preserve">Susurrous Fortress is a large Capture the Flag map for 12-16 players. It's my first map for any game, unless you count a big 2048x2048x1024 room that I used to experiment in my first few days of learning UnrealEd. I know it's been said that you shouldn't release your first map, but I think this one is turning out decent, especially for a first effort. Besides, it's too bloody huge and represents too much work to be relegated to a lifetime in the Old Projects directory on my hard drive.

The basic layout is somewhat similar to CTF-Noxion16, one of my favorite retail maps for UT. There are two identical bases connected on three different levels outdoors. My map has turned out to be considerably larger, though, with a greater degree of interconnectivity between the levels of the bases, and more paths to take on each individual level. My goal when I started out was to make a CTF map that would provide flag carriers a lot of different choices as to how they attack the enemy base, and how they escape from it, and I think I've managed to pull that off. The bots seem to be doing very well, especially with translocators enabled. 

Right now the map is in playable, but not yet finalized, form. It needs some fixes, tweaks, and optimizations before I'm ready to release it publicly, and what I'd really love is if an experienced mapper or two would be willing to take a look at it and help me out with some suggestions. If you'd be interested, please leave a note here, or you can reach me via PM at the [http://forums.beyondunreal.com/private.php?do=newpm&amp;userid=40754 BeyondUnreal Forums]. I'll send you a cookie if you give me a hand. Thanks!

===Screenshots ===

{|

|-
|http://www.ironblayde.com/temp/susurrous01.jpg
|-
|http://www.ironblayde.com/temp/susurrous02.jpg
|-
|http://www.ironblayde.com/temp/susurrous03.jpg
|-
|http://www.ironblayde.com/temp/susurrous04.jpg
|}

[[Category:Legacy Screenshots|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ItemMessagePlus</title>
    <id>28543</id>
    <revision>
      <id>40244</id>
      <timestamp>2009-11-17T11:05:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Iterator</title>
    <id>1462</id>
    <revision>
      <id>3670</id>
      <timestamp>2007-06-09T07:51:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==The Actor List ==

All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (the &lt;code&gt;XLevel&lt;/code&gt; property of all actors). This list exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

Spawning an actor automatically adds it at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] (accessed via the &lt;code&gt;Level&lt;/code&gt; property of any actor) is always the first actor. Destroying an actor automatically removes it from the list.

UnrealScript's &lt;code&gt;ForEach&lt;/code&gt; command makes it easy to deal with large groups of actors, for example all of the actors in a level, or all of the actors within a certain distance of another actor. &lt;code&gt;ForEach&lt;/code&gt; works in conjunction with a special kind of function called ''iterator function'' whose purpose is to iterate through a list of actors. Most of these iterator functions use the native actor list, so sometimes it's faster to use &lt;code&gt;For&lt;/code&gt; to iterate through much smaller [[Legacy:Linked List|linked list]]s like the pawn list or one of the mutator lists.

==Syntax==

All iterator function use a similar syntax:

&lt;uscript&gt;
local aClassName aVariable;

foreach IteratorFunction(class'aClassName', aVariable, other parameters)
{
    // execute something here
}
&lt;/uscript&gt;

The variable used as the second parameter must declared to hold an instance of the class used as the first parameter. The class must be &lt;code&gt;class'Actor'&lt;/code&gt; or a subclass for all iterators except AllObjects and AllDataObjects which can use &lt;code&gt;class'Object'&lt;/code&gt; or any other [[Legacy:Object|Object]] subclass.

Iterators can also be called for other objects:

&lt;uscript&gt;
local aClassName aVariable;

foreach anotherObject.IteratorFunction(class'aClassName', aVariable, other parameters)
{
    // execute something here
}
&lt;/uscript&gt;

This syntax doesn't make sense for all iterator functions, though. It is useful when using an iterator function which returns objects based on the object it was called for (e.g. ZoneActors or ChildActors) or when you want to use an iterator that isn't available in your class. (e.g. DynamicActors from an [[Legacy:Interaction|Interaction]])

Note that the game will crash with the error &quot;Unknown code token 58&quot; when the &lt;code&gt;anotherObject&lt;/code&gt; variable is &lt;code&gt;None&lt;/code&gt;. Also the actor iterators should only be called in a game environment. They will cause problems (e.g. a crash with &quot;Unknown code token 31&quot;) when executed e.g. from [[Legacy:BrushBuilder|BrushBuilder]] code in the editor.

==Definitions ==

To make the iterator function descriptions easier to read, the following simplifications are used:
; A class is a subclass of the ''BaseClass'' : This means the class could be ''BaseClass'' itself or a direct or indirect subclass of ''BaseClass''. Basically this relation corresponds to the result of the [[Legacy:Global Function|global function]] &lt;code&gt;ClassIsChildOf(aClass, BaseClass)&lt;/code&gt;.
; Actor A is owned by actor B : This includes direct (&lt;code&gt;A.Owner == B&lt;/code&gt;) and indirect ownership, i.e. also &lt;code&gt;A.Owner.Owner == B&lt;/code&gt; or &lt;code&gt;A.Owner.Owner.Owner == B&lt;/code&gt; etc.
; An actor is (not) ''bHidden'' : short for: &quot;An actor's ''bHidden'' property is (not) set to &lt;code&gt;True&lt;/code&gt;&quot;

Even though the descriptions here (and the actual declarations in Object, Actor and other classes defining iterator functions) talk about class&lt;Object/Actor&gt; as the first parameter type and Object/Actor as the second parameter type, you can and should use subclass types. The actual type of the second parameter can be narrowed down at compile-time by specifying a class literal as the first parameter:

&lt;uscript&gt;
local class&lt;Info&gt; InfoClass;
local Info I;
local Actor A;

foreach DynamicActors(class'Info', I) {
  // compiles fine
  // loops through all Info actors
}

foreach DynamicActors(class'ReplicationInfo', I) {
  // compile-time error (type mismatch in second parameter)
  // even though Info actors would fit into the RI variable,
  // the compiler requires a perfect type match
}

InfoClass = class'ReplicationInfo';

foreach DynamicActors(InfoClass, I) {
  // compile-time error (type mismatch in second parameter)
  // InfoClass could be None, in which case the iterator would fall back
  // to class'Actor', which would not fit into a variable of type Info.
}

foreach DynamicActors(InfoClass, A) {
  // compiles fine
  // loops through all ReplicationInfo actors, but A needs to be typecasted
  // if you want to access any Info or ReplicationInfo properties or functions
}
&lt;/uscript&gt;

The descriptions here are for [[Legacy:UT2004|UT2004]]. They may not be accurate for other games. For example, ''AllDataObjects'' is specific to UT2004. [[Legacy:UT|UT]] doesn't have ''AllObjects'' or ''CollidingActors''. It does have ''VisibleCollidingActors'', though. The ''AllObjects'' iterator is available in [[Legacy:Deus Ex|Deus Ex]], even though it's an UnrealEngine 1 game like UT.

===Object ===
; AllObjects (class&lt;[[Legacy:Object|Object]]&gt; BaseClass, out [[Legacy:Object|Object]] Object) : Iterates through all objects existing in the game and returns those whose class is a subclass of the ''BaseClass''.&lt;br /&gt;'''Warning:''' By all means stay away from this iterator if you want to work with actors!

===Actor ===

; AllActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass''. If a ''MatchTag'' was specified, an actor is only returned if its ''Tag'' matches the specified value.&lt;br /&gt;'''Note:''' For some base classes like [[Legacy:NavigationPoint|NavigationPoint]], [[Legacy:Pawn (UT)|Pawn (UT)]], [[Legacy:Controller|Controller]] or [[Legacy:Vehicle|Vehicle]] there are [[Legacy:Linked List|linked list]]s (e.g. &lt;code&gt;Level.NavigationPointList&lt;/code&gt; or &lt;code&gt;Level.Game.VehicleList&lt;/code&gt;) which may be faster to iterate using a ''for'' loop than going through the entire actor list with ''ForEach AllActors''.

; DynamicActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass''. If a ''MatchTag'' was specified, an actor is only returned if its ''Tag'' matches the specified value.&lt;br /&gt;Internally the actor list is sorted so it starts with the static actors, followed by the non-static actors. The engine remembers the index of the first non-static actor, so this iterator can start right at that index and actually does not have to check the value of the ''bStatic'' property.

; ChildActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass'' and that are owned by the actor the iterator function is called on.

; BasedActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates over the actor's ''Attached'' array (i.e. all actors &quot;standing on&quot; this actor) and returns those actors whose class is a subclass of the ''BaseClass''.

; TouchingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out actor Actor) : Iterates over the actor's ''Touching'' array (i.e. all actors &quot;interpenetrating&quot; this actor) and returns those actors whose class is a subclass of the ''BaseClass''.

; TraceActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent) : Performs a trace from the start location to the end location, using the specified extent. Then iterates over the resulting list of actors hit by the trace and returns those whose class is a subclass of the ''BaseClass''.&lt;br /&gt;''HitLocation'' and ''HitNormal'' are set to the corresponding values for each of the actors returned. If no ''Start'' location is specified, this actor's location is used instead. If no ''Extent'' is specified, the zero vector is used.

; RadiusActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass'' and whose distance to the specified location is less than ''Radius'' + that actor's ''CollisionRadius''.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead.&lt;br /&gt;'''Note:''' The target actor's CollisionRadius is used regardless of its collision properties.

; VisibleActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc) : Iterates through all actors in the level and performs a FastTrace from the specified location to the those actors that are not ''bHidden'', whose class is a subclass of the ''BaseClass'' and whose distance to the specified location is less than ''Radius''. If that trace does not report any collision with world geometry, the actor is returned.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead. The ''Radius'' defaults to 0.0 and thus should always be specified, unless only actors in that exact location should be returned.

; VisibleCollidingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden) : Fetches a list of actors within the specified ''Radius'' around the specified location from the collision hash. Then iterates over the resulting list of actors and performs a FastTrace from the specified location to the those actors whose class is a subclass of the ''BaseClass'' and (if told to ''bIgnoreHidden'') that are not ''bHidden''. If that trace does not report any collision with world geometry, the actor is returned.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead.

; CollidingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc) : Fetches a list of actors within the specified ''Radius'' around the specified location from the collision hash. Then iterates over the resulting list of actors and returns those actors whose class is a subclass of the ''BaseClass''.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead.

=== ZoneInfo ==

; ZoneActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass'' and that are in the zone represented by the [[Legacy:ZoneInfo|ZoneInfo]] the iterator function was called on.

===GameInfo ===
; AllDataObjects (class objClass, out [[Legacy:Object|Object]] obj, string packageName) : Iterates through all objects existing in the game and returns those that are contained in the specified package and whose class is a subclass of the ''BaseClass''.&lt;br /&gt;'''Note:''' This iterator will not return any objects if the specified data package is not loaded.

===Performance Analysis===

''See [[Legacy:Code Optimization|Code Optimization]] for more specific information.''

Iterator functions can be divided into several performance classes:

; object list iterators :
* AllDataObjects
* AllObjects

These iterator functions walk over the entire object list and should be avoided if somehow possible.


; actor list iterators :
* AllActors
* ChildActors
* DynamicActors
* RadiusActors
* VisibleActors
* ZoneActors

These iterator functions walk over the level's actor list and are considerably faster than the previous performance class.

''DynamicActors'' skips the part of the list that contains only static actors, so it's faster than ''AllActors''. Whether it also outperforms the other iterator functions in this list depends on the situation. The others perform their checks in native code, which you'd have to implement thoise checks in UnrealScript if you wanted to use DynamicActors.

''VisibleActors'' should be used with care as it performes a ''FastTrace'' for every actor matching the other criterias. If you can rule out more actors with other checks, try using ''RadiusActors'' (or ''DynamicActors'' + radius check) + your additional checks + ''FastTrace'' instead.


; collision hash iterators :
* CollidingActors
* VisibleCollidingActors

These iterator functions fetch a list of actors from the collision hash instead of walking the actor list. This makes these iterators faster than their counterparts ''RadiusActors'' and ''VisibleActors'', as long as the radius stays small. The actual meaning for &quot;small&quot; may vary, but starting at around 2000UU you should think about switching to an actor list iterator.&lt;br /&gt;Even below that radius, ''VisibleCollidingActors'' should be used with care as it performes a FastTrace for every actor matching the other criterias. If you can rule out more actors with other checks, try using ''CollidingActors'' + your additional checks + ''FastTrace'' instead.


; special purpose iterators :
* BasedActors
* TouchingActors
* TraceActors

These iterator functions are very fast, since they walk over specific lists of actors. ''BasedActors'' and ''TouchingActors'' iterate over the ''Attached'' and ''Touching'' arrays respectively. ''TraceActors'' uses the result of a &quot;multi-hit trace&quot; as its actor list, i.e. it first does the tracing, then starts returning actors.


These performance categories are based on UT2004. There's no guarantee that they also apply to other UnrealEngine games. Especially ''BasedActors'' might have been implemented as actor list iterator in first generation engine games, since there's no ''Attached'' array.

==Usage ==

Iterating actors is one of the most important concepts to understand in UnrealScripting.  There are many times when this will be the only way for you to gain valid reference to other classes for use in your function, and as such, it is essential that you gain a very familiar understanding of the methods used in iterating.

AllActors is normally used with two parameters - the class, and a variable.  The variable parameter may be a global, local, or argument variable, and there are situations when it is good to use each one.  To use AllActors, first define a variable of the class you want to iterate.  Next, designate the variable that will host the reference to this class object.  Inside the brackets, specify what you want to happen each time an object of the specified class is found.  The iterator variable is always equal to the last object that was found matching that class, so if you want to get a valid reference to each object in the game of a particular type, you would need to somehow assign that object to yet another variable inside the iterator, before it continues on to the next object of that class.  

&lt;uscript&gt;
class MyMut extends Info;


function PostBeginPlay()
{
    local Pawn OnlyThisPawn;

    foreach AllActors(class'Pawn', OnlyThisPawn)
    {
        break;
    }
}
&lt;/uscript&gt;

This above code reads something like &quot;Look for all actors in the game that are of the class 'Pawn'.  When a Pawn is found is found, assign THAT Pawn to the variable OnlyThisPawn, then perform the statements within the next set of brackets. Once finished with those statements, look for the next actor of the class 'Pawn' and assign THAT pawn to the OnlyPawnVariable, overwriting the last value of the OnlyThisPawn variable.&quot;  But, there is only one statement there!  The break statement causes the foreach iterator to stop it's cycling through the Actors on the level.  (It will stop looking for other Actors to assign to OnlyThisPawn). This is an extremely useful way to get a valid reference to an instance of a particular class when there isn't aren't any other ways of attaching to this class.  In the example above, the iterator assigns the first actor of class'pawn' that it finds to the OnlyThisPawn variable, breaks out of the &quot;ForEach&quot; statement, and script execution continues through the rest of the function.  You may now use the OnlyThisPawn variable without receiving the &quot;Access None&quot; error in the logfile, as long as there are valid Pawns in the level when you perform this iterator.

Typically, however, a ForEach statement should be used to perform a particular action on multiple instances of a class, to be most efficient.  Avoid using extensive iterators in rapidly executing code (such as Tick), and instead try to place in situations where they are only executed once or at least rarely (PostBeginPlay, BeginState are good places).  You should also avoid using iterators for assigning object variables, instead trying less resource-expensive methods of gaining valid references.  For some ideas of how to do this, see [[Legacy:Traversing Classes|Traversing Classes]]

'''Wormbo:''' Iterating through all Pawns is a bad example. Avoid using &lt;code&gt;ForEach AllActors(class'Pawn', P)&lt;/code&gt; on the server.&lt;br /&gt;&lt;code&gt;For (P = Level.PawnList; P != None; P = P.NextPawn)&lt;/code&gt; does the same and is much more efficient. Always look for a [[Legacy:Linked List|linked list]] that contains the actors you want to access before using &lt;code&gt;ForEach AllActors(...)&lt;/code&gt;.

===Using Iterators From Objects ===

Ever have an Object and want to use an iterator but realized much to your frustration that they are all defined down in Actor?  Well boys and girls, this is actually very easily worked around as demonstrated by the following example:

&lt;uscript&gt;
class MyObj extends Object;

var Actor MyActorRef;

function SomeNiftyFunc()
{
    local Actor AnActor;

    foreach MyActorRef.AllActors( class'Actor', AnActor )
        break;
}
&lt;/uscript&gt;

Since iterators are just normal functions you can treat them as such and call them from any other Object that has a reference to them.  Just be sure that your Actor reference is valid before you attempt to call an iterator on it, otherwise all sorts of &quot;bad things&quot; can happen.

&lt;uscript&gt;
function SomeNiftyFunc()
{
    local Actor AnActor;

    if ( MyActorRef == NONE || MyActorRef.bDeleteMe )
        return;

    foreach MyActorRef.RadiusActors( class'Actor', AnActor, 500 )
        break;
}
&lt;/uscript&gt;

==Related Topics ==
* Tim Sweeney's reference: [[Legacy:UnrealScript Language Reference/Advanced Language Features|UnrealScript Language Reference/Advanced Language Features]]
* [[Legacy:Flow Syntax|Flow Syntax]]
* [[Legacy:Code Optimization|Code Optimization]] &amp;ndash; If your framerate drops considerably when using iterators.
* [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists In Unreal Tournament]] also has some info on execution speed of the various iterator functions

==Comments==

'''Foxpaw:''' Destroying actors in Iterators seems to cause some strangeness. The following code caused mysterioud GPFs for the longest time for me:

&lt;uscript&gt;
  foreach AllObjects( class'VehicularThing', Old )
    Old.Destroy();
&lt;/uscript&gt;

It wouldn't crash as soon as I executed it, but would go for about 8 cycles or so before crashing. I believe this may cause some kind of a memory leak or something, possibly due to the internal workings of the iterators. I stopped the GPFs by doing the following, and it hasn't caused a crash since:

&lt;uscript&gt;
  foreach AllObjects( class'VehicularThing', Old )
    MarkedMen[MarkedMen.Length] = Old;
    
  for (i=0;i&lt;MarkedMen.Length;i++)
    MarkedMen[i].Destroy();
&lt;/uscript&gt;

'''Daid303:''' The killall cheat never crashed for me... but it uses DynamicActors, why are you using AllObjects? (I can't think of any slower function)

&lt;USCRIPT&gt;exec function KillAll(class&lt;actor&gt; aClass)

{

	local Actor A;

	if ( ClassIsChildOf(aClass, class'AIController') )

	{

		Level.Game.KillBots(Level.Game.NumBots);

		return;

	}

	if ( ClassIsChildOf(aClass, class'Pawn') )

	{

		KillAllPawns(class&lt;Pawn&gt;(aClass));

		return;

	}

	ForEach DynamicActors(class 'Actor', A)

		if ( ClassIsChildOf(A.class, aClass) )

			A.Destroy();

}&lt;/USCRIPT&gt;

'''Foxpaw:''' It may only apply to AllObjects, since that one operates on non-actors as well, and the notion of an object having been destroyed in a previous iteration doesn't really apply for garbage collection, which is what it was designed for. I'm using AllObjects because it's being called from a non-actor class, and only actors can use the AllActors, DynamicActors, etc. iterators. As far as I can tell only AllObjects is valid for use in classes not derived from actor.

'''Wormbo:''' Avoid AllObjects when AllActors or DynamicActors gives you the same results. Also when UsingAllObjects, make sure the actor you try to Destroy() isn't already destroyed (i.e. bDeleteMe should not yet be True).

'''Foxpaw:''' Well, objects not derived from Actor can't use any iterators except AllObjects, so my options are limited. Plus, since it's in the GUI, I don't really have to worry much about framerate.

'''Dma:''' Actually, you can use any iterator even in a static function in a non-actor class by doing something like this:

&lt;uscript&gt;
static final function Test() {
   local PlayerController PC;
   foreach class'Object'.AllObjects(class'PlayerController', PC) {
      foreach PC.AllActors(...) {
         // ...
      }
      return;
   }
}
&lt;/uscript&gt;

'''EricBlade:''' Am I correct in my findings, that say you have a couple of actors in the world, A and B, and if you do a RadiusActors, or for that matter, any other Radius based iterator from A.location, if B.location is not within that radius, even if B collides within that radius, you will not find B in that iterator?  Example: Created a test map with a pane of glass, that was absolutely monstrously oversized from it's original dimensions, using DrawScale to make it somewhere around 20X it's original size.  I could hit it anywhere on it's plane with a hitscan weapon, and the glass would shatter.  However, hitting it with a projectile with a very small DamageRadius, no matter the amount of damage, would not cause the glass to shatter, unless it hit very near the middle.  (the shattering is done in TakeDamage() .. and logging from the Projectile showed that the VisibleCollidingActors() iterator used in Actor::HurtRadius() was not actually hitting the glass, unless it was originating from very near it's center location point.  I solved this problem by simply making projectiles do damage to what they collide with, before they do radius damage, but it seems like a pretty serious flaw for using a radius iterator for any purpose.

'''SuperApe:''' My suspicion is that RadiusActors is not collision based but works off of the object's center.  You're huge pane of glass probably has the center in the middle, while you may have shot farther away.  The note in the code mentions that RadiusActors is slow, like AllActors.  This leads me to believe that it's simply a check of AllActors for those who's Location is within the Radius of the actor in question.  IOW, something like&lt;uscript&gt;if ( VSize( Location - Actor.Location ) =&lt; Radius )&lt;/uscript&gt;.

'''EricBlade:''' Exactly.  Now, since that's fairly useless in a world where things take up more than one point of space, what can be done to properly get all actors that have a collision within the radius?  Do a CollidingActors, with a ludicrous max radius, and then do a trace from all found actors to the source, to see if they collide within the actual radius we want to affect?  Actually, that brings up the problem of what to do if you have a room full of garbage-can sized objects too.. obviously an explosion would affect all of them, within it's blast range, but using Visible check from A to B didn't find most of them.

'''SuperApe:''' Just a guess, but couldn't you use another object just to detect damage in that area, like a volume?

'''EricBlade:''' eh, when you can fix projectile explosions the right way, why use a hacky way? :D  Next question ..  what are requirements to get a hit on TouchingActors() ?  I've tried it with a couple different things, and have had results that were not at all useful.  First, with a projectile, I set it's collisionradius to the damageradius, and then tried to use TouchingActors() to handle the blowing up, but got nothing operated on.  Did the same with a Fire, and got nothing :(

'''SuperApe:''' (briefly) Do it however you want.  I just suggest that mappers can use the stock tools and methods available to get the job done.  I'm pretty sure there's more than one breaking glass tut on this site alone.  And IIRC, they do use different actors to detect the collision.

'''Wormbo:''' The best way to handle a really small explosion radius is to look for actors in a much larger radius such that any actor possibly touching the real radius is included. Then you only have to do a very simple distance check from the center of the explosion to the actor's collision cylinder. I came up with the following code for a remake of the Descent 2 Gauss Cannon: (this is an [[Legacy:InstantFire|InstantFire]] subclass)

&lt;uscript&gt;
function ExtendedHurtRadius(vector HitLocation, vector AimDir, Actor HitActor)
{
  local Actor Victims;
  local float damageScale, dist, damageAmount;
  local vector dir;
  
  DamageAmount = RandRange(DamageMin, DamageMax) * DamageAtten;
  foreach Weapon.VisibleCollidingActors(class'Actor', Victims, DamageRadius + 200, HitLocation) {
    // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
    if (Victims != self &amp;&amp; Victims.Role == ROLE_Authority &amp;&amp; !Victims.IsA('FluidSurfaceInfo')) {
      dist = DistToCylinder(Victims.Location - HitLocation, Victims.CollisionHeight, Victims.CollisionRadius);
      if ( dist &gt; DamageRadius )
        continue;
      dir = Normal(Victims.Location - HitLocation);
      if (Victims == HitActor)
        dir = Normal(dir + AimDir);
      damageScale = 1 - FMax(0, dist / DamageRadius);
      Victims.TakeDamage(damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, damageScale * Momentum * dir, DamageType);
      if (Vehicle(Victims) != None &amp;&amp; Vehicle(Victims).Health &gt; 0)
        Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation);
    }
  }
}

/**
Calculates a point's distance to a cylinder.
*/
static function float DistToCylinder(vector CenterDist, float HalfHeight, float Radius)
{
  CenterDist.X = VSize(vect(1,1,0) * CenterDist) - Radius;
  if (CenterDist.X &lt; 0)
    CenterDist.X = 0;
  
  CenterDist.Y = 0;
  
  if (CenterDist.Z &lt; 0)
    CenterDist.Z *= -1;
  
  CenterDist.Z -= HalfHeight;
  if (CenterDist.Z &lt; 0)
    CenterDist.Z = 0;
  
  return VSize(CenterDist);
}
&lt;/uscript&gt;

==Iterator Timing Comments==

'''Xian:''' I wanted to start a small discussion about the timing on these... as I was trying some experimental stuff on UE1 I tried timing it in UE2. This is the code and log (stripped of the boring stuff) from the map Flux2 with around 9-10 bots:

&lt;uscript&gt;function PostBeginPlay ()
{
    Test1();

    Test2();

    Test3();

    Test4();

    Test5();

    Test6();
}

function Test1 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actors, 50000, Location, False)
    {
        Test(Actors);
        Log(&quot;Execute 1&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 1&quot;);
    StopWatch(True);
}

function Test2 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actors, 50000, Location, True)
    {
        Test(Actors);
        Log(&quot;Execute 2&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 2&quot;);
    StopWatch(True);
}

function Test3 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach CollidingActors (Class 'Actor', Actors, 50000, Location)
    {
        Test(Actors);
        Log(&quot;Execute 3&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 3&quot;);
    StopWatch(True);
}

function Test4 ()
{
    local Actor Actor;
    local Actor Actors[512];
    local int i, j;

    -- i;
    StopWatch(False);

    foreach AllActors (Class 'Actor', Actor)
    {
        if (!Actor.bHidden &amp;&amp; !Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2)
        &amp;&amp; (Abs(VSize(Actor.Location - Location)) &lt;= 50000) &amp;&amp; FastTrace(Actor.Location,PlayerPawn.Location))
        {
            Actors[++ i] = Actor;
            Log(&quot;Save 4&quot;);
        }

        Log(&quot;Log 4&quot;);
    }

    ++ i;
    for (j = 0; j &lt; i; ++ j)
    {
        Test(Actors[j]);
        Log(&quot;Execute 4&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 4&quot;);
    StopWatch(True);
}

function Test5 ()
{
    local Actor Actor;
    local Actor Actors[512];
    local int i, j;

    -- i;
    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actor, 50000, Location, True)
    {
        if (!Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2))
        {
            Actors[++ i] = Actor;
            Log(&quot;Save 5&quot;);
        }

        Log(&quot;Log 5&quot;);
    }

    ++ i;
    for (j = 0; j &lt; i; ++ j)
    {
        Test(Actors[j]);
        Log(&quot;Execute 5&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 5&quot;);
    StopWatch(True);
}

function Test6 ()
{
    local Actor Actor;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actor, 50000, Location, True)
    {
        if (!Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2))
        {
            Test(Actor);
            Log(&quot;Execute 6&quot;);
        }

        Log(&quot;Log 6&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 6&quot;);
    StopWatch(True);
}

function Test (Actor Actor)
{
    Log(&quot;Test()&quot; @ Actor);
}&lt;/uscript&gt;

It was spawned near my Controller's location so the Location pointer should be equivalent to mine. Please ignore the ugly code... My code is usually cleaner, but this was just a test so bleh... This is the log (with the irrelevant info removed):

&lt;uscript&gt;
ScriptLog: 22.892699: FINISHED !!!!!!!!!!!! TEST 1
Log: Time=22.902054 ms

ScriptLog: 11.660470: FINISHED !!!!!!!!!!!! TEST 2
Log: Time=11.670268 ms

ScriptLog: 8.632781: FINISHED !!!!!!!!!!!! TEST 3
Log: Time=8.639348 ms

ScriptLog: 7.206910: FINISHED !!!!!!!!!!!! TEST 4
Log: Time=7.212730 ms

ScriptLog: 11.221647: FINISHED !!!!!!!!!!!! TEST 5
Log: Time=11.227758 ms

ScriptLog: 11.784850: FINISHED !!!!!!!!!!!! TEST 6
Log: Time=11.796611 ms
&lt;/uscript&gt;

To my suprise, AllActors was the fastest... the only one that came close was CollidingActors. I tried it with 9000 as Radius as well... The result was that CollidingActors and AllActors were fairly in the same range (with AllActors being faster). While I do know the power of code optimization (as you can see I REALLY filtered things out :) ), I am still surprised that the whole actor hash was faster than the colliding actor hash. I will be honest, this was at the beginning of the match, but still... I was always under the impression that VCL and CL are faster than the rest. Any comments/thoughts ?

'''Wormbo:''' Check out the descriptions above:&lt;br /&gt;VCA &amp;ndash; &quot;Usually this is much faster than &lt;code&gt;AllActors&lt;/code&gt; because it uses the collision hash instead of the much larger native actor list, but with a very high radius VisibleActors might be more efficient.&quot;&lt;br /&gt;CA &amp;ndash; &quot;This is slightly faster than RadiusActors with radii at least up to 2000UU and much faster than VisibleActors or VisibleCollidingActors due to the visibility check those iterators have to perform for each actor.&quot;

Generally the collision hash should only be used if you want to find actors with collision enabled and located within a small area. The Visible*Actors iterators always perform a FastTrace before transfering control back to the UnrealScript code inside the loop, so they must be considered a lot slower than a compareable CollidingActors or RadiusActors loop with additional filter mechanisms. And last but not least it depends on the class of actors your loop iterates over. The class always is the first thing checked, so it makes a huge difference if you iterate over class'Actor' or e.g. class'Projectile': The latter will ignore all those static mesh actors, pickups, players and so on, dramatically changing the number of actors that have to go through the full check.

And another thing: Try reordering the tests. When benchmarking my own code I often found that the first iteration of the first test took longer than later tests.

'''Xian:''' I did check the descs, however considering that all of them checked the same things, the small number of bots/projectiles a.s.o. was relatively small, I was still quite surprised on the result, considering AllActors has (basically) no checks since the others have radius, traces, hidden etc. I will try reordering them and perhaps, play for longer with a SetTimer() on the traces...

'''Wormbo:''' I rewrote the iterator descriptions for UT2004 and added a performance clasification. Someone should remove obsolete discussions from this page.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3671</id>
      <timestamp>2007-04-14T11:33:36Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>reply to Wormbo</comment>
      <text xml:space="preserve">==The Actor List ==

All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (the &lt;code&gt;XLevel&lt;/code&gt; property of all actors). This list exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

Spawning an actor automatically adds it at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] (accessed via the &lt;code&gt;Level&lt;/code&gt; property of any actor) is always the first actor. Destroying an actor automatically removes it from the list.

UnrealScript's &lt;code&gt;ForEach&lt;/code&gt; command makes it easy to deal with large groups of actors, for example all of the actors in a level, or all of the actors within a certain distance of another actor. &lt;code&gt;ForEach&lt;/code&gt; works in conjunction with a special kind of function called ''iterator function'' whose purpose is to iterate through a list of actors. Most of these iterator functions use the native actor list, so sometimes it's faster to use &lt;code&gt;For&lt;/code&gt; to iterate through much smaller [[Legacy:Linked List|linked list]]s like the pawn list or one of the mutator lists.

==Syntax==

All iterator function use a similar syntax:

&lt;uscript&gt;
local aClassName aVariable;

foreach IteratorFunction(class'aClassName', aVariable, other parameters)
{
    // execute something here
}
&lt;/uscript&gt;

The variable used as the second parameter must declared to hold an instance of the class used as the first parameter. The class must be &lt;code&gt;class'Actor'&lt;/code&gt; or a subclass for all iterators except AllObjects and AllDataObjects which can use &lt;code&gt;class'Object'&lt;/code&gt; or any other [[Legacy:Object|Object]] subclass.

Iterators can also be called for other objects:

&lt;uscript&gt;
local aClassName aVariable;

foreach anotherObject.IteratorFunction(class'aClassName', aVariable, other parameters)
{
    // execute something here
}
&lt;/uscript&gt;

This syntax doesn't make sense for all iterator functions, though. It is useful when using an iterator function which returns objects based on the object it was called for (e.g. ZoneActors or ChildActors) or when you want to use an iterator that isn't available in your class. (e.g. DynamicActors from an [[Legacy:Interaction|Interaction]])

Note that the game will crash with the error &quot;Unknown code token 58&quot; when the &lt;code&gt;anotherObject&lt;/code&gt; variable is &lt;code&gt;None&lt;/code&gt;. Also the actor iterators should only be called in a game environment. They will cause problems (e.g. a crash with &quot;Unknown code token 31&quot;) when executed e.g. from [[Legacy:BrushBuilder|BrushBuilder]] code in the editor.

==Definitions ==

===Object ===
; AllObjects (class&lt;[[Legacy:Object|Object]]&gt; BaseClass, out [[Legacy:Object|Object]] Object) : Included in Deus Ex and Unreal Engine versions later than UT. Iterates through all objects, including all loaded classes.

===Actor ===

; AllActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag) : Iterates through all actors of the specified BaseClass in the level. These will be assigned to the variable you specified as the second parameter. If you specify an optional MatchTag, only includes actors which have a &quot;Tag&quot; variable matching the tag you specified. This will go through every actor in the level and is thus somewhat slow (this is not noticeable however unless it is called multiple times in one frame), so use it sparingly. If a more class specific list exists, such as &lt;code&gt;Level.PawnList&lt;/code&gt; and &lt;code&gt;Level.NavigationPointList&lt;/code&gt;, use those instead.
; DynamicActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag) : Iterates through all the actors that have &lt;code&gt;bStatic=False&lt;/code&gt;.  Works only (apparently) in Unreal Engine versions later than UT (v436). This is supposed to be faster than &lt;code&gt;AllActors&lt;/code&gt; because it doesn't iterate through all the static actors.  Again, if you specify an optional MatchTag, the iteration will only include those dynamic actors in your game that have a &quot;Tag&quot; variable that equals your MatchTag.
; ChildActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors in the level which have their owner set to the class this is run on. This has the same speed hit as &lt;code&gt;AllActors&lt;/code&gt;.
; BasedActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors which are standing on the actor this is run on, i.e. all actors which have their &lt;code&gt;Base&lt;/code&gt; property set to this actor. This has the same speed hit as &lt;code&gt;AllActors&lt;/code&gt;.
; TouchingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out actor Actor) : Iterates through all actors which are touching (interpenetrating) this actor. This seems to be pretty fast.
; TraceActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent) : Iterates through all actors which touch a line traced from the Start point to the End point, using a box of collision extent Extent. On each iteration, HitLoc is set to the hit location, and HitNorm is set to an outward-pointing hit normal. This is as fast as any Trace.
; RadiusActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc) : Iterates through all actors within a specified radius of the specified location (or if no location is specified, this actor's location). This has the same speed hit as &lt;code&gt;AllActors&lt;/code&gt;.
; VisibleActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc) : Iterates through a list of all actors who are visible to the specified location (or if no location is specified, this actor's location). Here &quot;visible&quot; means &quot;a line can connect some part of an actor and this actor's center without passing through level geometry&quot;, not &quot;bHidden=False&quot;.  This has the same speed hit as &lt;code&gt;AllActors&lt;/code&gt;.
; VisibleCollidingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden) : Iterates through a list of all actors which are visible to the specified location (or if no location is specified, this actor's location) and have &lt;code&gt;bCollideActors=True&lt;/code&gt;. Here &quot;visible&quot; does not mean &quot;bHidden=False&quot;, but this can be changed through ''bIgnoreHidden''. (just a guess) The ''bIgnoreHidden'' parameter might not be available in earlier engine versions. (prior to UT v436 or Unreal v226) Usually this is much faster than &lt;code&gt;AllActors&lt;/code&gt; because it uses the collision hash instead of the much larger native actor list, but with a very high radius VisibleActors might be more efficient. 
; CollidingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc) : Iterates through all actors within the specified radius using the collision hash. (&lt;code&gt;bCollideActors=True&lt;/code&gt;) This is slightly faster than RadiusActors with radii at least up to 2000UU and much faster than VisibleActors or VisibleCollidingActors due to the visibility check those iterators have to perform for each actor.

=== ZoneInfo ==

; ZoneActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors of type BaseClass within the acting [[Legacy:ZoneInfo|ZoneInfo]]. Same speed hit as &lt;code&gt;AllActors&lt;/code&gt;.

===GameInfo ===
; AllDataObjects (class objClass, out [[Legacy:Object|Object]] obj, string packageName) : ''Uhm...''

==Usage ==

Iterating actors is one of the most important concepts to understand in UnrealScripting.  There are many times when this will be the only way for you to gain valid reference to other classes for use in your function, and as such, it is essential that you gain a very familiar understanding of the methods used in iterating.

AllActors is normally used with two parameters - the class, and a variable.  The variable parameter may be a global, local, or argument variable, and there are situations when it is good to use each one.  To use AllActors, first define a variable of the class you want to iterate.  Next, designate the variable that will host the reference to this class object.  Inside the brackets, specify what you want to happen each time an object of the specified class is found.  The iterator variable is always equal to the last object that was found matching that class, so if you want to get a valid reference to each object in the game of a particular type, you would need to somehow assign that object to yet another variable inside the iterator, before it continues on to the next object of that class.  

&lt;uscript&gt;
class MyMut extends Info;


function PostBeginPlay()
{
    local Pawn OnlyThisPawn;

    foreach AllActors(class'Pawn', OnlyThisPawn)
    {
        break;
    }
}
&lt;/uscript&gt;

This above code reads something like &quot;Look for all actors in the game that are of the class 'Pawn'.  When a Pawn is found is found, assign THAT Pawn to the variable OnlyThisPawn, then perform the statements within the next set of brackets. Once finished with those statements, look for the next actor of the class 'Pawn' and assign THAT pawn to the OnlyPawnVariable, overwriting the last value of the OnlyThisPawn variable.&quot;  But, there is only one statement there!  The break statement causes the foreach iterator to stop it's cycling through the Actors on the level.  (It will stop looking for other Actors to assign to OnlyThisPawn). This is an extremely useful way to get a valid reference to an instance of a particular class when there isn't aren't any other ways of attaching to this class.  In the example above, the iterator assigns the first actor of class'pawn' that it finds to the OnlyThisPawn variable, breaks out of the &quot;ForEach&quot; statement, and script execution continues through the rest of the function.  You may now use the OnlyThisPawn variable without receiving the &quot;Access None&quot; error in the logfile, as long as there are valid Pawns in the level when you perform this iterator.

Typically, however, a ForEach statement should be used to perform a particular action on multiple instances of a class, to be most efficient.  Avoid using extensive iterators in rapidly executing code (such as Tick), and instead try to place in situations where they are only executed once or at least rarely (PostBeginPlay, BeginState are good places).  You should also avoid using iterators for assigning object variables, instead trying less resource-expensive methods of gaining valid references.  For some ideas of how to do this, see [[Legacy:Traversing Classes|Traversing Classes]]

'''Wormbo:''' Iterating through all Pawns is a bad example. Avoid using &lt;code&gt;ForEach AllActors(class'Pawn', P)&lt;/code&gt; on the server.&lt;br /&gt;&lt;code&gt;For (P = Level.PawnList; P != None; P = P.NextPawn)&lt;/code&gt; does the same and is much more efficient. Always look for a [[Legacy:Linked List|linked list]] that contains the actors you want to access before using &lt;code&gt;ForEach AllActors(...)&lt;/code&gt;.

===Using Iterators From Objects ===

Ever have an Object and want to use an iterator but realized much to your frustration that they are all defined down in Actor?  Well boys and girls, this is actually very easily worked around as demonstrated by the following example:

&lt;uscript&gt;
class MyObj extends Object;

var Actor MyActorRef;

function SomeNiftyFunc()
{
    local Actor AnActor;

    foreach MyActorRef.AllActors( class'Actor', AnActor )
        break;
}
&lt;/uscript&gt;

Since iterators are just normal functions you can treat them as such and call them from any other Object that has a reference to them.  Just be sure that your Actor reference is valid before you attempt to call an iterator on it, otherwise all sorts of &quot;bad things&quot; can happen.

&lt;uscript&gt;
function SomeNiftyFunc()
{
    local Actor AnActor;

    if ( MyActorRef == NONE || MyActorRef.bDeleteMe )
        return;

    foreach MyActorRef.RadiusActors( class'Actor', AnActor, 500 )
        break;
}
&lt;/uscript&gt;

==Related Topics ==
* Tim Sweeney's reference: [[Legacy:UnrealScript Language Reference/Advanced Language Features|UnrealScript Language Reference/Advanced Language Features]]
* [[Legacy:Flow Syntax|Flow Syntax]]
* [[Legacy:Code Optimization|Code Optimization]] &amp;ndash; If your framerate drops considerably when using iterators.
* [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists In Unreal Tournament]] also has some info on execution speed of the various iterator functions

==Comments==

COuld we have more examples? I don't really understand 
 AllObjects (class&lt;[[Legacy:Object|Object]]&gt; BaseClass, out [[Legacy:Object|Object]] Object)

since the code I see looks like:
 foreach AllObjects(class'Actor', A) 

where is the BaseClass variable? Can I write

 foreach AllObjects(class'SomeClassOrOther', A)

'''Wormbo:''' Is the Syntax section enough to answer this question?

'''Tarquin:''' Yup. It's great! Thanks :D :D I've actually managed today to get iterators to work in Brushbuilder. I'll post about it when I've got it all worked out. 

'''Foxpaw:''' Destroying actors in Iterators seems to cause some strangeness. The following code caused mysterioud GPFs for the longest time for me:

&lt;uscript&gt;
  foreach AllObjects( class'VehicularThing', Old )
    Old.Destroy();
&lt;/uscript&gt;

It wouldn't crash as soon as I executed it, but would go for about 8 cycles or so before crashing. I believe this may cause some kind of a memory leak or something, possibly due to the internal workings of the iterators. I stopped the GPFs by doing the following, and it hasn't caused a crash since:

&lt;uscript&gt;
  foreach AllObjects( class'VehicularThing', Old )
    MarkedMen[MarkedMen.Length] = Old;
    
  for (i=0;i&lt;MarkedMen.Length;i++)
    MarkedMen[i].Destroy();
&lt;/uscript&gt;

'''Daid303:''' The killall cheat never crashed for me... but it uses DynamicActors, why are you using AllObjects? (I can't think of any slower function)

&lt;USCRIPT&gt;exec function KillAll(class&lt;actor&gt; aClass)

{

	local Actor A;

	if ( ClassIsChildOf(aClass, class'AIController') )

	{

		Level.Game.KillBots(Level.Game.NumBots);

		return;

	}

	if ( ClassIsChildOf(aClass, class'Pawn') )

	{

		KillAllPawns(class&lt;Pawn&gt;(aClass));

		return;

	}

	ForEach DynamicActors(class 'Actor', A)

		if ( ClassIsChildOf(A.class, aClass) )

			A.Destroy();

}&lt;/USCRIPT&gt;

'''Foxpaw:''' It may only apply to AllObjects, since that one operates on non-actors as well, and the notion of an object having been destroyed in a previous iteration doesn't really apply for garbage collection, which is what it was designed for. I'm using AllObjects because it's being called from a non-actor class, and only actors can use the AllActors, DynamicActors, etc. iterators. As far as I can tell only AllObjects is valid for use in classes not derived from actor.

'''Wormbo:''' Avoid AllObjects when AllActors or DynamicActors gives you the same results. Also when UsingAllObjects, make sure the actor you try to Destroy() isn't already destroyed (i.e. bDeleteMe should not yet be True).

'''Foxpaw:''' Well, objects not derived from Actor can't use any iterators except AllObjects, so my options are limited. Plus, since it's in the GUI, I don't really have to worry much about framerate.

'''Dma:''' Actually, you can use any iterator even in a static function in a non-actor class by doing something like this:

&lt;uscript&gt;
static final function Test() {
   local PlayerController PC;
   foreach class'Object'.AllObjects(class'PlayerController', PC) {
      foreach PC.AllActors(...) {
         // ...
      }
      return;
   }
}
&lt;/uscript&gt;

'''EricBlade:''' Am I correct in my findings, that say you have a couple of actors in the world, A and B, and if you do a RadiusActors, or for that matter, any other Radius based iterator from A.location, if B.location is not within that radius, even if B collides within that radius, you will not find B in that iterator?  Example: Created a test map with a pane of glass, that was absolutely monstrously oversized from it's original dimensions, using DrawScale to make it somewhere around 20X it's original size.  I could hit it anywhere on it's plane with a hitscan weapon, and the glass would shatter.  However, hitting it with a projectile with a very small DamageRadius, no matter the amount of damage, would not cause the glass to shatter, unless it hit very near the middle.  (the shattering is done in TakeDamage() .. and logging from the Projectile showed that the VisibleCollidingActors() iterator used in Actor::HurtRadius() was not actually hitting the glass, unless it was originating from very near it's center location point.  I solved this problem by simply making projectiles do damage to what they collide with, before they do radius damage, but it seems like a pretty serious flaw for using a radius iterator for any purpose.

'''SuperApe:''' My suspicion is that RadiusActors is not collision based but works off of the object's center.  You're huge pane of glass probably has the center in the middle, while you may have shot farther away.  The note in the code mentions that RadiusActors is slow, like AllActors.  This leads me to believe that it's simply a check of AllActors for those who's Location is within the Radius of the actor in question.  IOW, something like&lt;uscript&gt;if ( VSize( Location - Actor.Location ) =&lt; Radius )&lt;/uscript&gt;.

'''EricBlade:''' Exactly.  Now, since that's fairly useless in a world where things take up more than one point of space, what can be done to properly get all actors that have a collision within the radius?  Do a CollidingActors, with a ludicrous max radius, and then do a trace from all found actors to the source, to see if they collide within the actual radius we want to affect?  Actually, that brings up the problem of what to do if you have a room full of garbage-can sized objects too.. obviously an explosion would affect all of them, within it's blast range, but using Visible check from A to B didn't find most of them.

'''SuperApe:''' Just a guess, but couldn't you use another object just to detect damage in that area, like a volume?

'''EricBlade:''' eh, when you can fix projectile explosions the right way, why use a hacky way? :D  Next question ..  what are requirements to get a hit on TouchingActors() ?  I've tried it with a couple different things, and have had results that were not at all useful.  First, with a projectile, I set it's collisionradius to the damageradius, and then tried to use TouchingActors() to handle the blowing up, but got nothing operated on.  Did the same with a Fire, and got nothing :(

'''SuperApe:''' (briefly) Do it however you want.  I just suggest that mappers can use the stock tools and methods available to get the job done.  I'm pretty sure there's more than one breaking glass tut on this site alone.  And IIRC, they do use different actors to detect the collision.

'''Wormbo:''' The best way to handle a really small explosion radius is to look for actors in a much larger radius such that any actor possibly touching the real radius is included. Then you only have to do a very simple distance check from the center of the explosion to the actor's collision cylinder. I came up with the following code for a remake of the Descent 2 Gauss Cannon: (this is an [[Legacy:InstantFire|InstantFire]] subclass)

&lt;uscript&gt;
function ExtendedHurtRadius(vector HitLocation, vector AimDir, Actor HitActor)
{
  local Actor Victims;
  local float damageScale, dist, damageAmount;
  local vector dir;
  
  DamageAmount = RandRange(DamageMin, DamageMax) * DamageAtten;
  foreach Weapon.VisibleCollidingActors(class'Actor', Victims, DamageRadius + 200, HitLocation) {
    // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
    if (Victims != self &amp;&amp; Victims.Role == ROLE_Authority &amp;&amp; !Victims.IsA('FluidSurfaceInfo')) {
      dist = DistToCylinder(Victims.Location - HitLocation, Victims.CollisionHeight, Victims.CollisionRadius);
      if ( dist &gt; DamageRadius )
        continue;
      dir = Normal(Victims.Location - HitLocation);
      if (Victims == HitActor)
        dir = Normal(dir + AimDir);
      damageScale = 1 - FMax(0, dist / DamageRadius);
      Victims.TakeDamage(damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, damageScale * Momentum * dir, DamageType);
      if (Vehicle(Victims) != None &amp;&amp; Vehicle(Victims).Health &gt; 0)
        Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation);
    }
  }
}

/**
Calculates a point's distance to a cylinder.
*/
static function float DistToCylinder(vector CenterDist, float HalfHeight, float Radius)
{
  CenterDist.X = VSize(vect(1,1,0) * CenterDist) - Radius;
  if (CenterDist.X &lt; 0)
    CenterDist.X = 0;
  
  CenterDist.Y = 0;
  
  if (CenterDist.Z &lt; 0)
    CenterDist.Z *= -1;
  
  CenterDist.Z -= HalfHeight;
  if (CenterDist.Z &lt; 0)
    CenterDist.Z = 0;
  
  return VSize(CenterDist);
}
&lt;/uscript&gt;

==Iterator Timing Comments==

'''Xian:''' I wanted to start a small discussion about the timing on these... as I was trying some experimental stuff on UE1 I tried timing it in UE2. This is the code and log (stripped of the boring stuff) from the map Flux2 with around 9-10 bots:

&lt;uscript&gt;function PostBeginPlay ()
{
    Test1();

    Test2();

    Test3();

    Test4();

    Test5();

    Test6();
}

function Test1 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actors, 50000, Location, False)
    {
        Test(Actors);
        Log(&quot;Execute 1&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 1&quot;);
    StopWatch(True);
}

function Test2 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actors, 50000, Location, True)
    {
        Test(Actors);
        Log(&quot;Execute 2&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 2&quot;);
    StopWatch(True);
}

function Test3 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach CollidingActors (Class 'Actor', Actors, 50000, Location)
    {
        Test(Actors);
        Log(&quot;Execute 3&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 3&quot;);
    StopWatch(True);
}

function Test4 ()
{
    local Actor Actor;
    local Actor Actors[512];
    local int i, j;

    -- i;
    StopWatch(False);

    foreach AllActors (Class 'Actor', Actor)
    {
        if (!Actor.bHidden &amp;&amp; !Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2)
        &amp;&amp; (Abs(VSize(Actor.Location - Location)) &lt;= 50000) &amp;&amp; FastTrace(Actor.Location,PlayerPawn.Location))
        {
            Actors[++ i] = Actor;
            Log(&quot;Save 4&quot;);
        }

        Log(&quot;Log 4&quot;);
    }

    ++ i;
    for (j = 0; j &lt; i; ++ j)
    {
        Test(Actors[j]);
        Log(&quot;Execute 4&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 4&quot;);
    StopWatch(True);
}

function Test5 ()
{
    local Actor Actor;
    local Actor Actors[512];
    local int i, j;

    -- i;
    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actor, 50000, Location, True)
    {
        if (!Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2))
        {
            Actors[++ i] = Actor;
            Log(&quot;Save 5&quot;);
        }

        Log(&quot;Log 5&quot;);
    }

    ++ i;
    for (j = 0; j &lt; i; ++ j)
    {
        Test(Actors[j]);
        Log(&quot;Execute 5&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 5&quot;);
    StopWatch(True);
}

function Test6 ()
{
    local Actor Actor;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actor, 50000, Location, True)
    {
        if (!Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2))
        {
            Test(Actor);
            Log(&quot;Execute 6&quot;);
        }

        Log(&quot;Log 6&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 6&quot;);
    StopWatch(True);
}

function Test (Actor Actor)
{
    Log(&quot;Test()&quot; @ Actor);
}&lt;/uscript&gt;

It was spawned near my Controller's location so the Location pointer should be equivalent to mine. Please ignore the ugly code... My code is usually cleaner, but this was just a test so bleh... This is the log (with the irrelevant info removed):

&lt;uscript&gt;
ScriptLog: 22.892699: FINISHED !!!!!!!!!!!! TEST 1
Log: Time=22.902054 ms

ScriptLog: 11.660470: FINISHED !!!!!!!!!!!! TEST 2
Log: Time=11.670268 ms

ScriptLog: 8.632781: FINISHED !!!!!!!!!!!! TEST 3
Log: Time=8.639348 ms

ScriptLog: 7.206910: FINISHED !!!!!!!!!!!! TEST 4
Log: Time=7.212730 ms

ScriptLog: 11.221647: FINISHED !!!!!!!!!!!! TEST 5
Log: Time=11.227758 ms

ScriptLog: 11.784850: FINISHED !!!!!!!!!!!! TEST 6
Log: Time=11.796611 ms
&lt;/uscript&gt;

To my suprise, AllActors was the fastest... the only one that came close was CollidingActors. I tried it with 9000 as Radius as well... The result was that CollidingActors and AllActors were fairly in the same range (with AllActors being faster). While I do know the power of code optimization (as you can see I REALLY filtered things out :) ), I am still surprised that the whole actor hash was faster than the colliding actor hash. I will be honest, this was at the beginning of the match, but still... I was always under the impression that VCL and CL are faster than the rest. Any comments/thoughts ?

'''Wormbo:''' Check out the descriptions above:&lt;br /&gt;VCA &amp;ndash; &quot;Usually this is much faster than &lt;code&gt;AllActors&lt;/code&gt; because it uses the collision hash instead of the much larger native actor list, but with a very high radius VisibleActors might be more efficient.&quot;&lt;br /&gt;CA &amp;ndash; &quot;This is slightly faster than RadiusActors with radii at least up to 2000UU and much faster than VisibleActors or VisibleCollidingActors due to the visibility check those iterators have to perform for each actor.&quot;

Generally the collision hash should only be used if you want to find actors with collision enabled and located within a small area. The Visible*Actors iterators always perform a FastTrace before transfering control back to the UnrealScript code inside the loop, so they must be considered a lot slower than a compareable CollidingActors or RadiusActors loop with additional filter mechanisms. And last but not least it depends on the class of actors your loop iterates over. The class always is the first thing checked, so it makes a huge difference if you iterate over class'Actor' or e.g. class'Projectile': The latter will ignore all those static mesh actors, pickups, players and so on, dramatically changing the number of actors that have to go through the full check.

And another thing: Try reordering the tests. When benchmarking my own code I often found that the first iteration of the first test took longer than later tests.

'''Xian:''' I did check the descs, however considering that all of them checked the same things, the small number of bots/projectiles a.s.o. was relatively small, I was still quite surprised on the result, considering AllActors has (basically) no checks since the others have radius, traces, hidden etc. I will try reordering them and perhaps, play for longer with a SetTimer() on the traces...

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3672</id>
      <timestamp>2007-04-14T17:20:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>rewrote the iterator descriptions</comment>
      <text xml:space="preserve">==The Actor List ==

All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (the &lt;code&gt;XLevel&lt;/code&gt; property of all actors). This list exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

Spawning an actor automatically adds it at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] (accessed via the &lt;code&gt;Level&lt;/code&gt; property of any actor) is always the first actor. Destroying an actor automatically removes it from the list.

UnrealScript's &lt;code&gt;ForEach&lt;/code&gt; command makes it easy to deal with large groups of actors, for example all of the actors in a level, or all of the actors within a certain distance of another actor. &lt;code&gt;ForEach&lt;/code&gt; works in conjunction with a special kind of function called ''iterator function'' whose purpose is to iterate through a list of actors. Most of these iterator functions use the native actor list, so sometimes it's faster to use &lt;code&gt;For&lt;/code&gt; to iterate through much smaller [[Legacy:Linked List|linked list]]s like the pawn list or one of the mutator lists.

==Syntax==

All iterator function use a similar syntax:

&lt;uscript&gt;
local aClassName aVariable;

foreach IteratorFunction(class'aClassName', aVariable, other parameters)
{
    // execute something here
}
&lt;/uscript&gt;

The variable used as the second parameter must declared to hold an instance of the class used as the first parameter. The class must be &lt;code&gt;class'Actor'&lt;/code&gt; or a subclass for all iterators except AllObjects and AllDataObjects which can use &lt;code&gt;class'Object'&lt;/code&gt; or any other [[Legacy:Object|Object]] subclass.

Iterators can also be called for other objects:

&lt;uscript&gt;
local aClassName aVariable;

foreach anotherObject.IteratorFunction(class'aClassName', aVariable, other parameters)
{
    // execute something here
}
&lt;/uscript&gt;

This syntax doesn't make sense for all iterator functions, though. It is useful when using an iterator function which returns objects based on the object it was called for (e.g. ZoneActors or ChildActors) or when you want to use an iterator that isn't available in your class. (e.g. DynamicActors from an [[Legacy:Interaction|Interaction]])

Note that the game will crash with the error &quot;Unknown code token 58&quot; when the &lt;code&gt;anotherObject&lt;/code&gt; variable is &lt;code&gt;None&lt;/code&gt;. Also the actor iterators should only be called in a game environment. They will cause problems (e.g. a crash with &quot;Unknown code token 31&quot;) when executed e.g. from [[Legacy:BrushBuilder|BrushBuilder]] code in the editor.

==Definitions ==

To make the iterator function descriptions easier to read, the following simplifications are used:
; A class is a subclass of the ''BaseClass'' : This means the class could be ''BaseClass'' itself or a direct or indirect subclass of ''BaseClass''. Basically this relation corresponds to the result of the [[Legacy:Global Function|global function]] &lt;code&gt;ClassIsChildOf(aClass, BaseClass)&lt;/code&gt;.
; Actor A is owned by actor B : This includes direct (&lt;code&gt;A.Owner == B&lt;/code&gt;) and indirect ownership, i.e. also &lt;code&gt;A.Owner.Owner == B&lt;/code&gt; or &lt;code&gt;A.Owner.Owner.Owner == B&lt;/code&gt; etc.
; An actor is (not) ''bHidden'' : short for: &quot;An actor's ''bHidden'' property is (not) set to &lt;code&gt;True&lt;/code&gt;&quot;

The descriptions here are for [[Legacy:UT2004|UT2004]]. They may not be accurate for other games. For example, ''AllDataObjects'' is specific to UT2004. [[Legacy:UT|UT]] doesn't have ''AllObjects'' or ''CollidingActors''. It does have ''VisibleCollidingActors'', though. The ''AllObjects'' iterator is available in [[Legacy:Deus Ex|Deus Ex]], even though it's an UnrealEngine 1 game like UT.

===Object ===
; AllObjects (class&lt;[[Legacy:Object|Object]]&gt; BaseClass, out [[Legacy:Object|Object]] Object) : Iterates through all objects existing in the game and returns those whose class is a subclass of the ''BaseClass''.&lt;br /&gt;'''Warning:''' By all means stay away from this iterator if you want to work with actors!

===Actor ===

; AllActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass''. If a ''MatchTag'' was specified, an actor is only returned if its ''Tag'' matches the specified value.&lt;br /&gt;'''Note:''' For some base classes like [[Legacy:NavigationPoint|NavigationPoint]], [[Legacy:Pawn (UT)|Pawn (UT)]], [[Legacy:Controller|Controller]] or [[Legacy:Vehicle|Vehicle]] there are [[Legacy:Linked List|linked list]]s (e.g. &lt;code&gt;Level.NavigationPointList&lt;/code&gt; or &lt;code&gt;Level.Game.VehicleList&lt;/code&gt;) which may be faster to iterate using a ''for'' loop than going through the entire actor list with ''ForEach AllActors''.

; DynamicActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional name MatchTag) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass''. If a ''MatchTag'' was specified, an actor is only returned if its ''Tag'' matches the specified value.&lt;br /&gt;Internally the actor list is sorted so it starts with the static actors, followed by the non-static actors. The engine remembers the index of the first non-static actor, so this iterator can start right at that index and actually does not have to check the value of the ''bStatic'' property.

; ChildActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass'' and that are owned by the actor the iterator function is called on.

; BasedActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates over the actor's ''Attached'' array (i.e. all actors &quot;standing on&quot; this actor) and returns those actors whose class is a subclass of the ''BaseClass''.

; TouchingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out actor Actor) : Iterates over the actor's ''Touching'' array (i.e. all actors &quot;interpenetrating&quot; this actor) and returns those actors whose class is a subclass of the ''BaseClass''.

; TraceActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent) : Performs a trace from the start location to the end location, using the specified extent. Then iterates over the resulting list of actors hit by the trace and returns those whose class is a subclass of the ''BaseClass''.&lt;br /&gt;''HitLocation'' and ''HitNormal'' are set to the corresponding values for each of the actors returned. If no ''Start'' location is specified, this actor's location is used instead. If no ''Extent'' is specified, the zero vector is used.

; RadiusActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass'' and whose distance to the specified location is less than ''Radius'' + that actor's ''CollisionRadius''.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead.&lt;br /&gt;'''Note:''' The target actor's CollisionRadius is used regardless of its collision properties.

; VisibleActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, optional float Radius, optional vector Loc) : Iterates through all actors in the level and performs a FastTrace from the specified location to the those actors that are not ''bHidden'', whose class is a subclass of the ''BaseClass'' and whose distance to the specified location is less than ''Radius''. If that trace does not report any collision with world geometry, the actor is returned.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead. The ''Radius'' defaults to 0.0 and thus should always be specified, unless only actors in that exact location should be returned.

; VisibleCollidingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden) : Fetches a list of actors within the specified ''Radius'' around the specified location from the collision hash. Then iterates over the resulting list of actors and performs a FastTrace from the specified location to the those actors whose class is a subclass of the ''BaseClass'' and (if told to ''bIgnoreHidden'') that are not ''bHidden''. If that trace does not report any collision with world geometry, the actor is returned.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead.

; CollidingActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor, float Radius, optional vector Loc) : Fetches a list of actors within the specified ''Radius'' around the specified location from the collision hash. Then iterates over the resulting list of actors and returns those actors whose class is a subclass of the ''BaseClass''.&lt;br /&gt;If no location is specified, this actor's ''Location'' is used instead.

=== ZoneInfo ==

; ZoneActors (class&lt;[[Legacy:Actor|Actor]]&gt; BaseClass, out [[Legacy:Actor|Actor]] Actor) : Iterates through all actors in the level and returns those whose class is a subclass of the ''BaseClass'' and that are in the zone represented by the [[Legacy:ZoneInfo|ZoneInfo]] the iterator function was called on.

===GameInfo ===
; AllDataObjects (class objClass, out [[Legacy:Object|Object]] obj, string packageName) : Iterates through all objects existing in the game and returns those that are contained in the specified package and whose class is a subclass of the ''BaseClass''.&lt;br /&gt;'''Note:''' This iterator will not return any objects if the specified data package is not loaded.

===Performance Analysis===

''See [[Legacy:Code Optimization|Code Optimization]] for more specific information.''

Iterator functions can be divided into several performance classes:

; object list iterators :
* AllDataObjects
* AllObjects

These iterator functions walk over the entire object list and should be avoided if somehow possible.


; actor list iterators :
* AllActors
* ChildActors
* DynamicActors
* RadiusActors
* VisibleActors
* ZoneActors

These iterator functions walk over the level's actor list and are considerably faster than the previous performance class.

''DynamicActors'' skips the part of the list that contains only static actors, so it's faster than ''AllActors''. Whether it also outperforms the other iterator functions in this list depends on the situation. The others perform their checks in native code, which you'd have to implement thoise checks in UnrealScript if you wanted to use DynamicActors.

''VisibleActors'' should be used with care as it performes a ''FastTrace'' for every actor matching the other criterias. If you can rule out more actors with other checks, try using ''RadiusActors'' (or ''DynamicActors'' + radius check) + your additional checks + ''FastTrace'' instead.


; collision hash iterators :
* CollidingActors
* VisibleCollidingActors

These iterator functions fetch a list of actors from the collision hash instead of walking the actor list. This makes these iterators faster than their counterparts ''RadiusActors'' and ''VisibleActors'', as long as the radius stays small. The actual meaning for &quot;small&quot; may vary, but starting at around 2000UU you should think about switching to an actor list iterator.&lt;br /&gt;Even below that radius, ''VisibleCollidingActors'' should be used with care as it performes a FastTrace for every actor matching the other criterias. If you can rule out more actors with other checks, try using ''CollidingActors'' + your additional checks + ''FastTrace'' instead.


; special purpose iterators :
* BasedActors
* TouchingActors
* TraceActors

These iterator functions are very fast, since they walk over specific lists of actors. ''BasedActors'' and ''TouchingActors'' iterate over the ''Attached'' and ''Touching'' arrays respectively. ''TraceActors'' uses the result of a &quot;multi-hit trace&quot; as its actor list, i.e. it first does the tracing, then starts returning actors.


These performance categories are based on UT2004. There's no guarantee that they also apply to other UnrealEngine games. Especially ''BasedActors'' might have been implemented as actor list iterator in first generation engine games, since there's no ''Attached'' array.

==Usage ==

Iterating actors is one of the most important concepts to understand in UnrealScripting.  There are many times when this will be the only way for you to gain valid reference to other classes for use in your function, and as such, it is essential that you gain a very familiar understanding of the methods used in iterating.

AllActors is normally used with two parameters - the class, and a variable.  The variable parameter may be a global, local, or argument variable, and there are situations when it is good to use each one.  To use AllActors, first define a variable of the class you want to iterate.  Next, designate the variable that will host the reference to this class object.  Inside the brackets, specify what you want to happen each time an object of the specified class is found.  The iterator variable is always equal to the last object that was found matching that class, so if you want to get a valid reference to each object in the game of a particular type, you would need to somehow assign that object to yet another variable inside the iterator, before it continues on to the next object of that class.  

&lt;uscript&gt;
class MyMut extends Info;


function PostBeginPlay()
{
    local Pawn OnlyThisPawn;

    foreach AllActors(class'Pawn', OnlyThisPawn)
    {
        break;
    }
}
&lt;/uscript&gt;

This above code reads something like &quot;Look for all actors in the game that are of the class 'Pawn'.  When a Pawn is found is found, assign THAT Pawn to the variable OnlyThisPawn, then perform the statements within the next set of brackets. Once finished with those statements, look for the next actor of the class 'Pawn' and assign THAT pawn to the OnlyPawnVariable, overwriting the last value of the OnlyThisPawn variable.&quot;  But, there is only one statement there!  The break statement causes the foreach iterator to stop it's cycling through the Actors on the level.  (It will stop looking for other Actors to assign to OnlyThisPawn). This is an extremely useful way to get a valid reference to an instance of a particular class when there isn't aren't any other ways of attaching to this class.  In the example above, the iterator assigns the first actor of class'pawn' that it finds to the OnlyThisPawn variable, breaks out of the &quot;ForEach&quot; statement, and script execution continues through the rest of the function.  You may now use the OnlyThisPawn variable without receiving the &quot;Access None&quot; error in the logfile, as long as there are valid Pawns in the level when you perform this iterator.

Typically, however, a ForEach statement should be used to perform a particular action on multiple instances of a class, to be most efficient.  Avoid using extensive iterators in rapidly executing code (such as Tick), and instead try to place in situations where they are only executed once or at least rarely (PostBeginPlay, BeginState are good places).  You should also avoid using iterators for assigning object variables, instead trying less resource-expensive methods of gaining valid references.  For some ideas of how to do this, see [[Legacy:Traversing Classes|Traversing Classes]]

'''Wormbo:''' Iterating through all Pawns is a bad example. Avoid using &lt;code&gt;ForEach AllActors(class'Pawn', P)&lt;/code&gt; on the server.&lt;br /&gt;&lt;code&gt;For (P = Level.PawnList; P != None; P = P.NextPawn)&lt;/code&gt; does the same and is much more efficient. Always look for a [[Legacy:Linked List|linked list]] that contains the actors you want to access before using &lt;code&gt;ForEach AllActors(...)&lt;/code&gt;.

===Using Iterators From Objects ===

Ever have an Object and want to use an iterator but realized much to your frustration that they are all defined down in Actor?  Well boys and girls, this is actually very easily worked around as demonstrated by the following example:

&lt;uscript&gt;
class MyObj extends Object;

var Actor MyActorRef;

function SomeNiftyFunc()
{
    local Actor AnActor;

    foreach MyActorRef.AllActors( class'Actor', AnActor )
        break;
}
&lt;/uscript&gt;

Since iterators are just normal functions you can treat them as such and call them from any other Object that has a reference to them.  Just be sure that your Actor reference is valid before you attempt to call an iterator on it, otherwise all sorts of &quot;bad things&quot; can happen.

&lt;uscript&gt;
function SomeNiftyFunc()
{
    local Actor AnActor;

    if ( MyActorRef == NONE || MyActorRef.bDeleteMe )
        return;

    foreach MyActorRef.RadiusActors( class'Actor', AnActor, 500 )
        break;
}
&lt;/uscript&gt;

==Related Topics ==
* Tim Sweeney's reference: [[Legacy:UnrealScript Language Reference/Advanced Language Features|UnrealScript Language Reference/Advanced Language Features]]
* [[Legacy:Flow Syntax|Flow Syntax]]
* [[Legacy:Code Optimization|Code Optimization]] &amp;ndash; If your framerate drops considerably when using iterators.
* [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists In Unreal Tournament]] also has some info on execution speed of the various iterator functions

==Comments==

'''Foxpaw:''' Destroying actors in Iterators seems to cause some strangeness. The following code caused mysterioud GPFs for the longest time for me:

&lt;uscript&gt;
  foreach AllObjects( class'VehicularThing', Old )
    Old.Destroy();
&lt;/uscript&gt;

It wouldn't crash as soon as I executed it, but would go for about 8 cycles or so before crashing. I believe this may cause some kind of a memory leak or something, possibly due to the internal workings of the iterators. I stopped the GPFs by doing the following, and it hasn't caused a crash since:

&lt;uscript&gt;
  foreach AllObjects( class'VehicularThing', Old )
    MarkedMen[MarkedMen.Length] = Old;
    
  for (i=0;i&lt;MarkedMen.Length;i++)
    MarkedMen[i].Destroy();
&lt;/uscript&gt;

'''Daid303:''' The killall cheat never crashed for me... but it uses DynamicActors, why are you using AllObjects? (I can't think of any slower function)

&lt;USCRIPT&gt;exec function KillAll(class&lt;actor&gt; aClass)

{

	local Actor A;

	if ( ClassIsChildOf(aClass, class'AIController') )

	{

		Level.Game.KillBots(Level.Game.NumBots);

		return;

	}

	if ( ClassIsChildOf(aClass, class'Pawn') )

	{

		KillAllPawns(class&lt;Pawn&gt;(aClass));

		return;

	}

	ForEach DynamicActors(class 'Actor', A)

		if ( ClassIsChildOf(A.class, aClass) )

			A.Destroy();

}&lt;/USCRIPT&gt;

'''Foxpaw:''' It may only apply to AllObjects, since that one operates on non-actors as well, and the notion of an object having been destroyed in a previous iteration doesn't really apply for garbage collection, which is what it was designed for. I'm using AllObjects because it's being called from a non-actor class, and only actors can use the AllActors, DynamicActors, etc. iterators. As far as I can tell only AllObjects is valid for use in classes not derived from actor.

'''Wormbo:''' Avoid AllObjects when AllActors or DynamicActors gives you the same results. Also when UsingAllObjects, make sure the actor you try to Destroy() isn't already destroyed (i.e. bDeleteMe should not yet be True).

'''Foxpaw:''' Well, objects not derived from Actor can't use any iterators except AllObjects, so my options are limited. Plus, since it's in the GUI, I don't really have to worry much about framerate.

'''Dma:''' Actually, you can use any iterator even in a static function in a non-actor class by doing something like this:

&lt;uscript&gt;
static final function Test() {
   local PlayerController PC;
   foreach class'Object'.AllObjects(class'PlayerController', PC) {
      foreach PC.AllActors(...) {
         // ...
      }
      return;
   }
}
&lt;/uscript&gt;

'''EricBlade:''' Am I correct in my findings, that say you have a couple of actors in the world, A and B, and if you do a RadiusActors, or for that matter, any other Radius based iterator from A.location, if B.location is not within that radius, even if B collides within that radius, you will not find B in that iterator?  Example: Created a test map with a pane of glass, that was absolutely monstrously oversized from it's original dimensions, using DrawScale to make it somewhere around 20X it's original size.  I could hit it anywhere on it's plane with a hitscan weapon, and the glass would shatter.  However, hitting it with a projectile with a very small DamageRadius, no matter the amount of damage, would not cause the glass to shatter, unless it hit very near the middle.  (the shattering is done in TakeDamage() .. and logging from the Projectile showed that the VisibleCollidingActors() iterator used in Actor::HurtRadius() was not actually hitting the glass, unless it was originating from very near it's center location point.  I solved this problem by simply making projectiles do damage to what they collide with, before they do radius damage, but it seems like a pretty serious flaw for using a radius iterator for any purpose.

'''SuperApe:''' My suspicion is that RadiusActors is not collision based but works off of the object's center.  You're huge pane of glass probably has the center in the middle, while you may have shot farther away.  The note in the code mentions that RadiusActors is slow, like AllActors.  This leads me to believe that it's simply a check of AllActors for those who's Location is within the Radius of the actor in question.  IOW, something like&lt;uscript&gt;if ( VSize( Location - Actor.Location ) =&lt; Radius )&lt;/uscript&gt;.

'''EricBlade:''' Exactly.  Now, since that's fairly useless in a world where things take up more than one point of space, what can be done to properly get all actors that have a collision within the radius?  Do a CollidingActors, with a ludicrous max radius, and then do a trace from all found actors to the source, to see if they collide within the actual radius we want to affect?  Actually, that brings up the problem of what to do if you have a room full of garbage-can sized objects too.. obviously an explosion would affect all of them, within it's blast range, but using Visible check from A to B didn't find most of them.

'''SuperApe:''' Just a guess, but couldn't you use another object just to detect damage in that area, like a volume?

'''EricBlade:''' eh, when you can fix projectile explosions the right way, why use a hacky way? :D  Next question ..  what are requirements to get a hit on TouchingActors() ?  I've tried it with a couple different things, and have had results that were not at all useful.  First, with a projectile, I set it's collisionradius to the damageradius, and then tried to use TouchingActors() to handle the blowing up, but got nothing operated on.  Did the same with a Fire, and got nothing :(

'''SuperApe:''' (briefly) Do it however you want.  I just suggest that mappers can use the stock tools and methods available to get the job done.  I'm pretty sure there's more than one breaking glass tut on this site alone.  And IIRC, they do use different actors to detect the collision.

'''Wormbo:''' The best way to handle a really small explosion radius is to look for actors in a much larger radius such that any actor possibly touching the real radius is included. Then you only have to do a very simple distance check from the center of the explosion to the actor's collision cylinder. I came up with the following code for a remake of the Descent 2 Gauss Cannon: (this is an [[Legacy:InstantFire|InstantFire]] subclass)

&lt;uscript&gt;
function ExtendedHurtRadius(vector HitLocation, vector AimDir, Actor HitActor)
{
  local Actor Victims;
  local float damageScale, dist, damageAmount;
  local vector dir;
  
  DamageAmount = RandRange(DamageMin, DamageMax) * DamageAtten;
  foreach Weapon.VisibleCollidingActors(class'Actor', Victims, DamageRadius + 200, HitLocation) {
    // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
    if (Victims != self &amp;&amp; Victims.Role == ROLE_Authority &amp;&amp; !Victims.IsA('FluidSurfaceInfo')) {
      dist = DistToCylinder(Victims.Location - HitLocation, Victims.CollisionHeight, Victims.CollisionRadius);
      if ( dist &gt; DamageRadius )
        continue;
      dir = Normal(Victims.Location - HitLocation);
      if (Victims == HitActor)
        dir = Normal(dir + AimDir);
      damageScale = 1 - FMax(0, dist / DamageRadius);
      Victims.TakeDamage(damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, damageScale * Momentum * dir, DamageType);
      if (Vehicle(Victims) != None &amp;&amp; Vehicle(Victims).Health &gt; 0)
        Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation);
    }
  }
}

/**
Calculates a point's distance to a cylinder.
*/
static function float DistToCylinder(vector CenterDist, float HalfHeight, float Radius)
{
  CenterDist.X = VSize(vect(1,1,0) * CenterDist) - Radius;
  if (CenterDist.X &lt; 0)
    CenterDist.X = 0;
  
  CenterDist.Y = 0;
  
  if (CenterDist.Z &lt; 0)
    CenterDist.Z *= -1;
  
  CenterDist.Z -= HalfHeight;
  if (CenterDist.Z &lt; 0)
    CenterDist.Z = 0;
  
  return VSize(CenterDist);
}
&lt;/uscript&gt;

==Iterator Timing Comments==

'''Xian:''' I wanted to start a small discussion about the timing on these... as I was trying some experimental stuff on UE1 I tried timing it in UE2. This is the code and log (stripped of the boring stuff) from the map Flux2 with around 9-10 bots:

&lt;uscript&gt;function PostBeginPlay ()
{
    Test1();

    Test2();

    Test3();

    Test4();

    Test5();

    Test6();
}

function Test1 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actors, 50000, Location, False)
    {
        Test(Actors);
        Log(&quot;Execute 1&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 1&quot;);
    StopWatch(True);
}

function Test2 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actors, 50000, Location, True)
    {
        Test(Actors);
        Log(&quot;Execute 2&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 2&quot;);
    StopWatch(True);
}

function Test3 ()
{
    local Actor Actors;

    StopWatch(False);

    foreach CollidingActors (Class 'Actor', Actors, 50000, Location)
    {
        Test(Actors);
        Log(&quot;Execute 3&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 3&quot;);
    StopWatch(True);
}

function Test4 ()
{
    local Actor Actor;
    local Actor Actors[512];
    local int i, j;

    -- i;
    StopWatch(False);

    foreach AllActors (Class 'Actor', Actor)
    {
        if (!Actor.bHidden &amp;&amp; !Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2)
        &amp;&amp; (Abs(VSize(Actor.Location - Location)) &lt;= 50000) &amp;&amp; FastTrace(Actor.Location,PlayerPawn.Location))
        {
            Actors[++ i] = Actor;
            Log(&quot;Save 4&quot;);
        }

        Log(&quot;Log 4&quot;);
    }

    ++ i;
    for (j = 0; j &lt; i; ++ j)
    {
        Test(Actors[j]);
        Log(&quot;Execute 4&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 4&quot;);
    StopWatch(True);
}

function Test5 ()
{
    local Actor Actor;
    local Actor Actors[512];
    local int i, j;

    -- i;
    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actor, 50000, Location, True)
    {
        if (!Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2))
        {
            Actors[++ i] = Actor;
            Log(&quot;Save 5&quot;);
        }

        Log(&quot;Log 5&quot;);
    }

    ++ i;
    for (j = 0; j &lt; i; ++ j)
    {
        Test(Actors[j]);
        Log(&quot;Execute 5&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 5&quot;);
    StopWatch(True);
}

function Test6 ()
{
    local Actor Actor;

    StopWatch(False);

    foreach VisibleCollidingActors (Class 'Actor', Actor, 50000, Location, True)
    {
        if (!Actor.bStatic &amp;&amp; Actor.bCollideActors &amp;&amp; Actor.bCollideWorld
        &amp;&amp; (Actor.CollisionHeight &gt; 2) &amp;&amp; (Actor.CollisionRadius &gt; 2))
        {
            Test(Actor);
            Log(&quot;Execute 6&quot;);
        }

        Log(&quot;Log 6&quot;);
    }

    Log(&quot;FINISHED !!!!!!!!!!!! TEST 6&quot;);
    StopWatch(True);
}

function Test (Actor Actor)
{
    Log(&quot;Test()&quot; @ Actor);
}&lt;/uscript&gt;

It was spawned near my Controller's location so the Location pointer should be equivalent to mine. Please ignore the ugly code... My code is usually cleaner, but this was just a test so bleh... This is the log (with the irrelevant info removed):

&lt;uscript&gt;
ScriptLog: 22.892699: FINISHED !!!!!!!!!!!! TEST 1
Log: Time=22.902054 ms

ScriptLog: 11.660470: FINISHED !!!!!!!!!!!! TEST 2
Log: Time=11.670268 ms

ScriptLog: 8.632781: FINISHED !!!!!!!!!!!! TEST 3
Log: Time=8.639348 ms

ScriptLog: 7.206910: FINISHED !!!!!!!!!!!! TEST 4
Log: Time=7.212730 ms

ScriptLog: 11.221647: FINISHED !!!!!!!!!!!! TEST 5
Log: Time=11.227758 ms

ScriptLog: 11.784850: FINISHED !!!!!!!!!!!! TEST 6
Log: Time=11.796611 ms
&lt;/uscript&gt;

To my suprise, AllActors was the fastest... the only one that came close was CollidingActors. I tried it with 9000 as Radius as well... The result was that CollidingActors and AllActors were fairly in the same range (with AllActors being faster). While I do know the power of code optimization (as you can see I REALLY filtered things out :) ), I am still surprised that the whole actor hash was faster than the colliding actor hash. I will be honest, this was at the beginning of the match, but still... I was always under the impression that VCL and CL are faster than the rest. Any comments/thoughts ?

'''Wormbo:''' Check out the descriptions above:&lt;br /&gt;VCA &amp;ndash; &quot;Usually this is much faster than &lt;code&gt;AllActors&lt;/code&gt; because it uses the collision hash instead of the much larger native actor list, but with a very high radius VisibleActors might be more efficient.&quot;&lt;br /&gt;CA &amp;ndash; &quot;This is slightly faster than RadiusActors with radii at least up to 2000UU and much faster than VisibleActors or VisibleCollidingActors due to the visibility check those iterators have to perform for each actor.&quot;

Generally the collision hash should only be used if you want to find actors with collision enabled and located within a small area. The Visible*Actors iterators always perform a FastTrace before transfering control back to the UnrealScript code inside the loop, so they must be considered a lot slower than a compareable CollidingActors or RadiusActors loop with additional filter mechanisms. And last but not least it depends on the class of actors your loop iterates over. The class always is the first thing checked, so it makes a huge difference if you iterate over class'Actor' or e.g. class'Projectile': The latter will ignore all those static mesh actors, pickups, players and so on, dramatically changing the number of actors that have to go through the full check.

And another thing: Try reordering the tests. When benchmarking my own code I often found that the first iteration of the first test took longer than later tests.

'''Xian:''' I did check the descs, however considering that all of them checked the same things, the small number of bots/projectiles a.s.o. was relatively small, I was still quite surprised on the result, considering AllActors has (basically) no checks since the others have radius, traces, hidden etc. I will try reordering them and perhaps, play for longer with a SetTimer() on the traces...

'''Wormbo:''' I rewrote the iterator descriptions for UT2004 and added a performance clasification. Someone should remove obsolete discussions from this page.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:J3rky</title>
    <id>1557</id>
    <revision>
      <id>3876</id>
      <timestamp>2006-01-26T16:30:03Z</timestamp>
      <contributor>
        <ip>Bc180248.bendcable.com</ip>
      </contributor>
      <minor/>
      <comment>cleaned up after you answered question. Thanks =)</comment>
      <text xml:space="preserve">==Message Of The Day==

{{innerbox| '''''I am looking for experienced Unreal Engine programmers to extend my Orlando/Florida based team of software engineers. Strong knowledge in Unreal Script is a must, experience in C++ and Unreal native coding is a plus. I may be looking for one or two paid interns as well, so if you're interested, please drop me a line, including your resume and/or samples of your previous Unreal Engine related programming work!'''''

 '''''At this time, only US-citizens are considered.'''''

}}

==About Me==

===General Info===
*Author - Gerke 'j3rky' Preussner
*Homepage - [http://www.gerke-preussner.de http://www.gerke-preussner.de]
*Contact - unrealwiki@gerke-preussner.de

===Related Interests===
* UnrealScript &amp; Native Coding
* Level Editing &amp; Texture Creation

===Past Projects===
* [http://uttoolkit.gerke-preussner.de UTToolkit] (discontinued)
* [http://www.tactical-ops.de TacticalOps: Assault on Terror] (released 2002)

==Current Occupation==
* Technical Lead, Anteon Corp, Programming Unreal Engine based military training simulators

==Note To Self==
* ''PostRender()'' is called once when the level is rendered to precache everything. This happens before script objects are initialized and may lead to unexpected behaviour if code inside ''PostRender()'' depends on [[Legacy:Default_Properties|Default_Properties]] or other objects.
* Pawn animations won't show up if ''Acceleration'' is zero - just setting a ''Velocity'' is not sufficient.
* [[Legacy:PerObjectConfig|PerObjectConfig]] for native classes won't save the class name, only the object name.
* Strings inside structured config vars (see [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]]) should be quoted, otherwise the INI file parser may interprete the rest of the line as the string value.
* Unlike variables, functions cannot be multicasted from the server to all clients - they are replicated to the owner client only.
* Replicating functions with more than 3 parameters is very slow; use a struct instead.
* The y-axis indicator for the top-view in UED points into the wrong direction - up is negative ''y''.
* Don't forget to add the ServerPackages in the INI or else the actors won't be replicated to clients.
* Don't forget to add replication block even for nativereplication or else there won't be actor channels for replicated properties.

==Guestbook==
: '''Wormbo:''' Hi and welcome to the Wiki! :D
: '''Jan:''' Hi j3rky, nice to see here. ;) 
: '''j3rky:''' Hey guys... after using the Wiki for many months, i thought it might be the time to share some knowledge as well ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3877</id>
      <timestamp>2006-01-26T15:57:13Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <comment>reply to Ch3z</comment>
      <text xml:space="preserve">==About Me==

===General Info===
*Author - Gerke 'j3rky' Preussner
*Homepage - [http://www.gerke-preussner.de http://www.gerke-preussner.de]
*Contact - unrealwiki@gerke-preussner.de

===Related Interests===
* UnrealScript &amp; Native Coding
* Level Editing &amp; Texture Creation

===Past Projects===
* [http://uttoolkit.gerke-preussner.de UTToolkit] (discontinued)
* [http://www.tactical-ops.de TacticalOps: Assault on Terror] (released 2002)

==Note To Self==
* ''PostRender()'' is called once when the level is rendered to precache everything. This happens before script objects are initialized and may lead to unexpected behaviour if code inside ''PostRender()'' depends on [[Legacy:Default_Properties|Default_Properties]] or other objects.
* Pawn animations won't show up if ''Acceleration'' is zero - just setting a ''Velocity'' is not sufficient.
* [[Legacy:PerObjectConfig|PerObjectConfig]] for native classes won't save the class name, only the object name.
* Strings inside structured config vars (see [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]]) should be quoted, otherwise the INI file parser may interprete the rest of the line as the string value.
* Unlike variables, functions cannot be multicasted from the server to all clients - they are replicated to the owner client only.
* Replicating functions with more than 3 parameters is very slow; use a struct instead.
* The y-axis indicator for the top-view in UED points into the wrong direction - up is negative ''y''.
* Don't forget to add the ServerPackages in the INI or else the actors won't be replicated to clients.
* Don't forget to add replication block even for nativereplication or else there won't be actor channels for replicated properties.

==Guestbook==
: '''Wormbo:''' Hi and welcome to the Wiki! :D
: '''Jan:''' Hi j3rky, nice to see here. ;) 
: '''j3rky:''' Hey guys... after using the Wiki for many months, i thought it might be the time to share some knowledge as well ;)
: '''Ch3z:''' Hi there. I was just driving by and saw your light on, so I thought I would peek in your window. You know, just to be neighborly hehehe. I could easily be wrong (takes practice), but something looks funny to me in your notes to self. PostRender() takes place before some precaching? Seems like it makes more sense to precache things before you render them to me. &quot;Post&quot; being after and &quot;pre&quot; being before and all, I'm curious, where can i read about that? Is that after level geometry is rendered and before any level items are? Glad to have you here, j3rky. =)
: '''j3rky:''' Ch3z, the engine loads objects on demand. Therefore the first PostRender() will initiate the precaching of a lot of objects that haven't been loaded yet.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3878</id>
      <timestamp>2006-01-26T16:12:58Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <minor/>
      <comment>Job Opportunities!</comment>
      <text xml:space="preserve">==Message Of The Day==

{{innerbox| '''''I am looking for experienced Unreal Engine programmers to extend my Orlando/Florida based team of software engineers. Strong knowledge in Unreal Script is a must, experience in C++ and Unreal native coding is a plus. I may be looking for one or two paid interns as well, so if you're interested, please drop me a line, including your resume and/or samples of your previous Unreal Engine related programming work!'''''

 '''''At this time, only US-citizens are considered.'''''

}}

==About Me==

===General Info===
*Author - Gerke 'j3rky' Preussner
*Homepage - [http://www.gerke-preussner.de http://www.gerke-preussner.de]
*Contact - unrealwiki@gerke-preussner.de

===Related Interests===
* UnrealScript &amp; Native Coding
* Level Editing &amp; Texture Creation

===Past Projects===
* [http://uttoolkit.gerke-preussner.de UTToolkit] (discontinued)
* [http://www.tactical-ops.de TacticalOps: Assault on Terror] (released 2002)

==Current Occupation==
* Technical Lead, Anteon Corp, Programming Unreal Engine based military training simulators

==Note To Self==
* ''PostRender()'' is called once when the level is rendered to precache everything. This happens before script objects are initialized and may lead to unexpected behaviour if code inside ''PostRender()'' depends on [[Legacy:Default_Properties|Default_Properties]] or other objects.
* Pawn animations won't show up if ''Acceleration'' is zero - just setting a ''Velocity'' is not sufficient.
* [[Legacy:PerObjectConfig|PerObjectConfig]] for native classes won't save the class name, only the object name.
* Strings inside structured config vars (see [[Legacy:Config_Vars_And_.Ini_Files|Config_Vars_And_.Ini_Files]]) should be quoted, otherwise the INI file parser may interprete the rest of the line as the string value.
* Unlike variables, functions cannot be multicasted from the server to all clients - they are replicated to the owner client only.
* Replicating functions with more than 3 parameters is very slow; use a struct instead.
* The y-axis indicator for the top-view in UED points into the wrong direction - up is negative ''y''.
* Don't forget to add the ServerPackages in the INI or else the actors won't be replicated to clients.
* Don't forget to add replication block even for nativereplication or else there won't be actor channels for replicated properties.

==Guestbook==
: '''Wormbo:''' Hi and welcome to the Wiki! :D
: '''Jan:''' Hi j3rky, nice to see here. ;) 
: '''j3rky:''' Hey guys... after using the Wiki for many months, i thought it might be the time to share some knowledge as well ;)
: '''Ch3z:''' Hi there. I was just driving by and saw your light on, so I thought I would peek in your window. You know, just to be neighborly hehehe. I could easily be wrong (takes practice), but something looks funny to me in your notes to self. PostRender() takes place before some precaching? Seems like it makes more sense to precache things before you render them to me. &quot;Post&quot; being after and &quot;pre&quot; being before and all, I'm curious, where can i read about that? Is that after level geometry is rendered and before any level items are? Glad to have you here, j3rky. =)
: '''j3rky:''' Ch3z, the engine loads objects on demand. Therefore the first PostRender() will initiate the precaching of a lot of objects that haven't been loaded yet.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JEdit</title>
    <id>1552</id>
    <revision>
      <id>3864</id>
      <timestamp>2007-08-20T17:42:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">'''''jEdit''''' is a powerful open source(it's free) [[Legacy:Text Editor|text editor]], written in Java. Although it's still a text editor, it has many of the features of a full blown [[Legacy:IDE|IDE]]

==Features==
* Runs of Java JRE1.5
* Versions 4.2 and onwards feature built-in syntax highlighting support for UnrealScript
* Open an unlimited number of files
* Perform text searches with support for regular expressions
** Within a selection
** Within a Single file
** Within all opened files
** Within a Directory on your hard disk
*** Such as your UT/UT2003/UT2004 directory with a filter of *.uc
* Recent Files and Directories
* Function Browsing
* Error Parsing
* Difference Calculation (diffs)
* Collapse code blocks
* Markers, to mark important places in large code blocks
* Incredible plugin support with many:
** Visual Plugins
** Code Assist (Auto-complete) plugins
** Language Reference Plugins
** Compiler and Parser Plugins
* Extensive configuration options
* Auto Save and Backup functionality

==Picture==

[[Image:Legacy_nick89_jedit.jpeg|center|nick89 in his natural coding environment. He has 5 files opened but is viewing two of them at once!]]

==Useful Links==
* http://www.jedit.org
* http://plugins.jedit.org (plugins can be downloaded from within jEdit)
* http://community.jedit.org

==Discussion==

'''Nick89:''' I used jEdit before i started Unreal Script, i was pleasantly surprised when i discovered jEdit could handle my Syntax Highlighting needs for Unreal Script (as well as almost any other programming language or markup known to mankind). Great editor, i love it! :)

'''Bob_The_Beheader:'''It was definately written for linux. Seems to me like it dosn't really want to see directory structures with the drives being the root. It's written in Java, so go figure that the hell out... :). Anyways, I'm switching to using this as my default text editor instead of [[Legacy:ConTEXT|conTEXT]] because context has troule with line wrapping. One thing I don't like about this though is that it's 'save' toolbar is a pic of a pencil, not a disk. which makes no sense to me. Oh. Also, I can set up the file association for using this as the default editor for .txt files, but I still can't open a file out of Explorer.

'''Wormbo:''' You should use the following command for file associations:
 javaw.exe -jar &quot;path\to\jedit.jar&quot; -reuseview &amp;ndash; &quot;%1&quot;

The -reuseview switch makes it open the file in an existing jEdit window if there's already is a jEdit instance running. If it bothers you that it sometimes decides to open multiple instances if you open several files at the same time while jEdit isn't running, you can set up an &quot;edit server&quot; (a hidden instance of jEdit) to be run at Windows start.&lt;br /&gt;And no, it doesn't have any problems with drive letters being the root of the directory structures. It just has an awkward way to display them in the directory tree due to the way they are handled in Java.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3865</id>
      <timestamp>2007-08-20T12:12:00Z</timestamp>
      <contributor>
        <ip>Cap021-030.kcn.ne.jp</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hello, Your site is great. Regards, Valintino Guxxi</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jailbreak</title>
    <id>1534</id>
    <revision>
      <id>3824</id>
      <timestamp>2004-11-09T06:47:46Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Gametype for Unreal Tournament.  See the [http://www.planetjailbreak.com/press/ Jailbreak Press Center] for detailed information.

* Current public version: UT/320 ''a.k.a.'' Jailbreak III Gold (code revision: Service Pack 2) for Unreal Tournament
* Current public version: UT2003/102 and UT2004/102 ''a.k.a.'' Jailbreak 2003b and Jailbreak 2004b ''a.k.a.'' Jailbreak ECE (Service Pack 2) for Unreal Tournament 2003 and 2004 respectively

==Mapping for Jailbreak ==

The links below form the Jailbreak mapping guidelines and reference. These subpages are in the Wiki to be worked on by the Jailbreak mapping community. They are linked to from the PlanetJailbreak Mapping page.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mapping]] for Jailbreak
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Classes]] and events added by Jailbreak

==Web Links ==

*[http://www.planetjailbreak.com PlanetJailbreak], the official home of the Jailbreak mod.
*[http://www.planetjailbreak.com/press/ PlanetJailbreak Press Center], giving detailed information about Jailbreak past and future.</text>
    </revision>
    <revision>
      <id>3825</id>
      <timestamp>2004-10-01T13:50:06Z</timestamp>
      <contributor>
        <ip>RavuAlHemio</ip>
      </contributor>
      <comment>removed link to http://www.ut-jailbreak.de, since the site has been abandoned</comment>
      <text xml:space="preserve">Gametype for Unreal Tournament.  See the [http://www.planetjailbreak.com/press/ Jailbreak Press Center] for detailed information.

* Current public version: UT/320 ''a.k.a.'' Jailbreak III Gold (code revision: Service Pack 2) for Unreal Tournament
* Current public version: UT2003/101 and UT2004/101 ''a.k.a.'' Jailbreak 2003a and Jailbreak 2004a (Service Pack 1) for Unreal Tournament 2003 and 2004 respectively

==Mapping for Jailbreak ==

The links below form the Jailbreak mapping guidelines and reference. These subpages are in the Wiki to be worked on by the Jailbreak mapping community. They are linked to from the PlanetJailbreak Mapping page.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mapping]] for Jailbreak
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Classes]] and events added by Jailbreak

==Web Links ==

*[http://www.planetjailbreak.com PlanetJailbreak], the official home of Unreal Tournament Jailbreak.
*[http://www.planetjailbreak.com/press/ PlanetJailbreak Press Center], giving detailed information about Jailbreak past and future.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jailbreak/Classes</title>
    <id>1532</id>
    <revision>
      <id>3821</id>
      <timestamp>2003-12-22T16:42:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Classes ==

===JailZone ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; JailZone}}

This is a zone in which killed players of one team are kept in custody.

; JailedTeam : Team number of the team jailed in this zone (red = 0, blue = 1).

; ForceKillAfter : Number of seconds after which the fallback gibbing kicks in to kill off all surviving inmates.  Set this to a value that doesn't allow surviving players to linger around too long after your custom killing mechanism has finished its work.  (This property only affects custom death sequences.)

===JBArenaZone ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; JBArenaZone}}

; BattleTime : Arena battled is declared a tie after this time, and both players are sent back to jail.
; TriggerAfter : The first time you want an arena battle to be fought. The default is 3 minutes. The timer starts counting at the start of a game.
; TriggerSeconds : How often to start a fight. Default is two minutes. The timer seems to start counting at the START of an arena fight. If the timer is finished and no players are available to start an arena battle (or the former arena battle is not finished yet), the timer will simply restart. 
;: To summarize the two timer properties: the Arena tries to start a battle at time ( TriggerAfter + n * TriggerSeconds ), for n = 1,2,3...

; ArenaStart, ArenaWin, ArenaTie : Set event tags here to trigger things.
; SlaveZoneTag : Other zones (that mustn't be JBArenaZones themselves) with that ZoneTag are considered part of the arena.  (If they aren't and a player enters one of them &amp;ndash; a water zone in an arena for instance &amp;ndash; the other player is automatically declared winner.)

===JBPlayerStart ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PlayerStart|PlayerStart]] &gt;&gt; JBPlayerStart}}

Marks a respawn point for a player or bot in Jailbreak: either in the general playing area of the map or in jail.

; Team : Team number of the players or bots spawning at this place (red = 0, blue = 1).
; bJailedStart : Specifies whether this respawn point is for free or for jailed players.  Set this property to '''True''' for all JBPlayerStarts in jail.

===JBArenaStart ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PlayerStart|PlayerStart]] &gt;&gt; JBArenaStart}}

Start point for the Arena.

Both JBPlayerStarts MUST be in the main JBArenaZone to work, putting them in a SlaveZone (JBArenaZone with the SlaveZoneTag set) will not start an arena battle.

===JBViewpoint ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JBViewpoint}}

; DyingTeam : Team number of the team whose death is viewed through this JBViewpoint during the death sequence (red = 0, blue = 1).

; StaticCameraForDyingTeam : Used with death cams that move along an [[Legacy:Interpolated Path|interpolated path]] and specifies how the camera behaves when a player from the team that just died in jail is switched to it to view their own gibs flying.  If set to True (the default), the camera ''will not'' move along the interpolated path but stay where it was set by the mapper in UnrealEd.  If set to False, the death cam will start moving along the path when the player starts viewing through it.  For cinematic death sequences that somewhat want to synchronize the death cam movement with other events on the screen, it's advisable to leave StaticCameraForDyingTeam set to True.

'''Tarquin:''' Just summarizing the above to see if I get it:
* StaticCameraForDyingTeam  = True : winning team see a flyby. Dying team once dead see a static view from the position of the Viewpoint set in the map
* StaticCameraForDyingTeam  = False : winning team see a flyby. Dying team see the same flyby, starting at the same point, but delayed since they need time to be killed first. This may cause undesirable results if the flyby has been carefully synchronized with the death sequence.

'''Mychaeel:''' Exactly.

When a team is captured, the viewpoint of the winning team is set to that of the dying team's camera, so they may see with their own eyes the carnage they have inflicted. After the opposing team is dead, the winning team's viewpoint returns to normal as both teams respawn free.

A JBViewpoint actor can be easily attached to a [[Legacy:Mover|mover]] in order to create a cinematic flyby sequence (trigger the [[Legacy:Mover|mover]] using either the RedCaptured or the BlueCaptured event).  Another, more sophisticated (but actually no more difficult) way to create a moving death cam is creating an [[Legacy:Interpolated Path|interpolated path]] whose [[Legacy:Tag|Tag]] is either RedCaptured or BlueCaptured; the JBViewpoint will automatically start moving along this part when the death sequence starts.

'''Tarquin:''' does that mean a set of IPs whose Tag is BlueCaptured, or a set of IPs connected to a SpecialEvent whose Tag is BlueCaptured ?

'''Mychaeel:''' If there was a SpecialEvent involved, I'd have mentioned it.

'''Tarquin:''' sorry for the dumb question bonanza today. :D I had no way of knowing if &quot;interpolated path&quot; means &quot;a set of Int points +  SE&quot; or just &quot;a set of Int points&quot;, and going by what's currently on the intPath page the SE seemed to be an integral part of an IntPath. I'll refactor some of the above into the main JB mapping page.

'''Mychaeel:''' I didn't mean my reply to be offensive, it's just a matter of fact.

'''Tarquin:''' I bow down to the judgement of the public at large: maybe I ''have'' been crabby lately. :)

===TeamActivatedMechanism ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism}}

Abstract base class.

; bFlashing : 
; BotReleaseDelay : 
; ChargeDist :  //how close does the AI have to be to charge this jailreleasetrigger?
; Health : 
; IsJailReleaseMechanism : tells bots to consider this mechanism as a target when attempting to release their teammates. 
; LastRelease : 
; NearestPathNodeTag : 
; ReleaseActive : 
; Team : specifies the team that should use this, not the team that defends it. 

====TeamActivatedTrigger ====

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism &gt;&gt; TeamActivatedTrigger}}

It is important to note that a TeamActivatedTrigger has no automatic method of releasing prisoners: this must be set manually, by binding TeamActivatedTrigger : Events -&gt; Event to the Tag of the object that actually releases the team. 

These triggers can be used in a capacity other than that of a release mechanism. They could conceivable operate the door to a team's arsenal, a drawbridge, or a trap, for example.

====TeamActivatedDamageAtOnce====

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism &gt;&gt; TeamActivatedDamageAtOnce}}

Behaves like a TeamActivatedTrigger that is triggered by being damaged (shot at, for instance).  The damage must be inflicted at once (by a single shot).   Bots currently aren't capable of using this sort of TeamActivatedMechanism, so better don't use them for jail release mechanisms.

====TeamActivatedDamageBuildUp ====

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism &gt;&gt; TeamActivatedDamageBuildUp}}

Like a TeamActivatedDamageAtOnce, but allows damage to build up over time (multiple shots can build up the total damage needed to trigger this actor).  Bots currently aren't capable of using this sort of TeamActivatedMechanism, so better don't use them for jail release mechanisms.

==Events ==

===RedCaptured, BlueCaptured ===

BlueCaptured and RedCaptured events are sent out when a complete team has been imprisoned. These events can be used to set off a custom killing mechanism (falling rocks, collapsing walls, poisonous gas, trap doors... endless opportunities). If no mechanism is set off by these events the prisoners will simply be gibbed, but if a mechanism is set off, it must kill the prisoners for the death scene to end and the game to continue.

===RedCapturePending, BlueCapturePending ===

Fired when the death cam switches to the captured team's jail, a few seconds before RedCaptured or BlueCaptured is called.

===Restarted ===

Fired after the death sequence is completed, when the next round starts.

===Overtime ===

Fired when Sudden Death Overtime starts.  Use it to open a secret weapon closet with heavy-duty weapons, for instance, or to change the mood of your maps (search lights, helicopters, rising sun, or whatever).

===Arena Events ===

The JBArenaZone class has three custom events (see above).</text>
    </revision>
    <revision>
      <id>3822</id>
      <timestamp>2003-12-22T15:26:34Z</timestamp>
      <contributor>
        <ip>CoolDude</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Classes ==

===JailZone ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; JailZone}}

This is a zone in which killed players of one team are kept in custody.

; JailedTeam : Team number of the team jailed in this zone (red = 0, blue = 1).

; ForceKillAfter : Number of seconds after which the fallback gibbing kicks in to kill off all surviving inmates.  Set this to a value that doesn't allow surviving players to linger around too long after your custom killing mechanism has finished its work.  (This property only affects custom death sequences.)

===JBArenaZone ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; JBArenaZone}}

; BattleTime : Arena battled is declared a tie after this time, and both players are sent back to jail.
; TriggerAfter : The first time you want an arena battle to be fought. The default is 3 minutes. The timer starts counting at the start of a game.
; TriggerSeconds : How often to start a fight. Default is two minutes. The timer seems to start counting at the START of an arena fight. If the timer is finished and no players are available to start an arena battle (or the former arena battle is not finished yet), the timer will simply restart. 

; ArenaStart, ArenaWin, ArenaTie : Set event tags here to trigger things.
; SlaveZoneTag : Other zones (that mustn't be JBArenaZones themselves) with that ZoneTag are considered part of the arena.  (If they aren't and a player enters one of them &amp;ndash; a water zone in an arena for instance &amp;ndash; the other player is automatically declared winner.)

===JBPlayerStart ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PlayerStart|PlayerStart]] &gt;&gt; JBPlayerStart}}

Marks a respawn point for a player or bot in Jailbreak: either in the general playing area of the map or in jail.

; Team : Team number of the players or bots spawning at this place (red = 0, blue = 1).
; bJailedStart : Specifies whether this respawn point is for free or for jailed players.  Set this property to '''True''' for all JBPlayerStarts in jail.

===JBArenaStart ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:PlayerStart|PlayerStart]] &gt;&gt; JBArenaStart}}

Start point for the Arena.

Both JBPlayerStarts MUST be in the main JBArenaZone to work, putting them in a SlaveZone (JBArenaZone with the SlaveZoneTag set) will not start an arena battle.

===JBViewpoint ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JBViewpoint}}

; DyingTeam : Team number of the team whose death is viewed through this JBViewpoint during the death sequence (red = 0, blue = 1).

; StaticCameraForDyingTeam : Used with death cams that move along an [[Legacy:Interpolated Path|interpolated path]] and specifies how the camera behaves when a player from the team that just died in jail is switched to it to view their own gibs flying.  If set to True (the default), the camera ''will not'' move along the interpolated path but stay where it was set by the mapper in UnrealEd.  If set to False, the death cam will start moving along the path when the player starts viewing through it.  For cinematic death sequences that somewhat want to synchronize the death cam movement with other events on the screen, it's advisable to leave StaticCameraForDyingTeam set to True.

'''Tarquin:''' Just summarizing the above to see if I get it:
* StaticCameraForDyingTeam  = True : winning team see a flyby. Dying team once dead see a static view from the position of the Viewpoint set in the map
* StaticCameraForDyingTeam  = False : winning team see a flyby. Dying team see the same flyby, starting at the same point, but delayed since they need time to be killed first. This may cause undesirable results if the flyby has been carefully synchronized with the death sequence.

'''Mychaeel:''' Exactly.

When a team is captured, the viewpoint of the winning team is set to that of the dying team's camera, so they may see with their own eyes the carnage they have inflicted. After the opposing team is dead, the winning team's viewpoint returns to normal as both teams respawn free.

A JBViewpoint actor can be easily attached to a [[Legacy:Mover|mover]] in order to create a cinematic flyby sequence (trigger the [[Legacy:Mover|mover]] using either the RedCaptured or the BlueCaptured event).  Another, more sophisticated (but actually no more difficult) way to create a moving death cam is creating an [[Legacy:Interpolated Path|interpolated path]] whose [[Legacy:Tag|Tag]] is either RedCaptured or BlueCaptured; the JBViewpoint will automatically start moving along this part when the death sequence starts.

'''Tarquin:''' does that mean a set of IPs whose Tag is BlueCaptured, or a set of IPs connected to a SpecialEvent whose Tag is BlueCaptured ?

'''Mychaeel:''' If there was a SpecialEvent involved, I'd have mentioned it.

'''Tarquin:''' sorry for the dumb question bonanza today. :D I had no way of knowing if &quot;interpolated path&quot; means &quot;a set of Int points +  SE&quot; or just &quot;a set of Int points&quot;, and going by what's currently on the intPath page the SE seemed to be an integral part of an IntPath. I'll refactor some of the above into the main JB mapping page.

'''Mychaeel:''' I didn't mean my reply to be offensive, it's just a matter of fact.

'''Tarquin:''' I bow down to the judgement of the public at large: maybe I ''have'' been crabby lately. :)

===TeamActivatedMechanism ===

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism}}

Abstract base class.

; bFlashing : 
; BotReleaseDelay : 
; ChargeDist :  //how close does the AI have to be to charge this jailreleasetrigger?
; Health : 
; IsJailReleaseMechanism : tells bots to consider this mechanism as a target when attempting to release their teammates. 
; LastRelease : 
; NearestPathNodeTag : 
; ReleaseActive : 
; Team : specifies the team that should use this, not the team that defends it. 

====TeamActivatedTrigger ====

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism &gt;&gt; TeamActivatedTrigger}}

It is important to note that a TeamActivatedTrigger has no automatic method of releasing prisoners: this must be set manually, by binding TeamActivatedTrigger : Events -&gt; Event to the Tag of the object that actually releases the team. 

These triggers can be used in a capacity other than that of a release mechanism. They could conceivable operate the door to a team's arsenal, a drawbridge, or a trap, for example.

====TeamActivatedDamageAtOnce====

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism &gt;&gt; TeamActivatedDamageAtOnce}}

Behaves like a TeamActivatedTrigger that is triggered by being damaged (shot at, for instance).  The damage must be inflicted at once (by a single shot).   Bots currently aren't capable of using this sort of TeamActivatedMechanism, so better don't use them for jail release mechanisms.

====TeamActivatedDamageBuildUp ====

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; TeamActivatedMechanism &gt;&gt; TeamActivatedDamageBuildUp}}

Like a TeamActivatedDamageAtOnce, but allows damage to build up over time (multiple shots can build up the total damage needed to trigger this actor).  Bots currently aren't capable of using this sort of TeamActivatedMechanism, so better don't use them for jail release mechanisms.

==Events ==

===RedCaptured, BlueCaptured ===

BlueCaptured and RedCaptured events are sent out when a complete team has been imprisoned. These events can be used to set off a custom killing mechanism (falling rocks, collapsing walls, poisonous gas, trap doors... endless opportunities). If no mechanism is set off by these events the prisoners will simply be gibbed, but if a mechanism is set off, it must kill the prisoners for the death scene to end and the game to continue.

===RedCapturePending, BlueCapturePending ===

Fired when the death cam switches to the captured team's jail, a few seconds before RedCaptured or BlueCaptured is called.

===Restarted ===

Fired after the death sequence is completed, when the next round starts.

===Overtime ===

Fired when Sudden Death Overtime starts.  Use it to open a secret weapon closet with heavy-duty weapons, for instance, or to change the mood of your maps (search lights, helicopters, rising sun, or whatever).

===Arena Events ===

The JBArenaZone class has three custom events (see above).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jailbreak/Mapping</title>
    <id>1533</id>
    <revision>
      <id>3823</id>
      <timestamp>2002-08-01T13:23:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jaks</title>
    <id>1555</id>
    <revision>
      <id>3871</id>
      <timestamp>2004-02-05T22:03:25Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Dont expect much for the moment, I'm having to relearn alot of rusty skills with UED and the scripting engine.  I use to do alot of coding in UScript, but this time around I think Im gonna tackle map making.  I think I'm gonna jump in by modding my own home.  Would be useful to have a 3D renderer of my house so that I can test out color schemes, design the basement wall layouts, etc.  Probably do it in the UnrealEngineRuntime though so I can send it out to other friends for comments that do not own the game.  That should get me comfortable enough to start on the more advanced stuff later.  I intend to document what I learn as I go and help refine the tutorials/pages so that they better answer newbie questions and clear up confusion.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''&lt;u&gt;Watch List&lt;/u&gt;''' 
|-
|[[Spark/Developer_Journal
|RPG/Strategy Mod]] 
|-
|[[AlphaOne/AlphaCoop
|CoOp monster crawl]] 
|}

----

'''Jaks:''' Just getting settled in, expect more in the near future.

'''El Muerte TDS:''' Welcome to the Wiki. I'm expecting ;)

'''EntropicLqd:''' Welcome to the Wiki.  I hope you enjoy your stay :)

'''Zxanphorian:''' Hi and welcome to the wiki! :):tup:

'''Zxanphorian:''' Wow, the most uniform/small width segment of changes on the [[Legacy:Recent Changes|Recent Changes]]! :)

'''Jaks:''' Yeah, I'm beginning to get used to the Wiki ideals, gonna start using the Sandbox more often :)

'''Tarquin:''' Hi, welcome :)

'''Zxanphorian:''' Heh, you will get used to wiki-markup, dont worry. :) Also, the first thing you should do before contributing to the wiki is to finish the rought version of your personal page, to familliarize (sp?) yourself with wiki markup.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3872</id>
      <timestamp>2004-02-05T13:00:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Dont expect much for the moment, I'm having to relearn alot of rusty skills with UED and the scripting engine.  I use to do alot of coding in UScript, but this time around I think Im gonna tackle map making.  I think I'm gonna jump in by modding my own home.  Would be useful to have a 3D renderer of my house so that I can test out color schemes, design the basement wall layouts, etc.  Probably do it in the UnrealEngineRuntime though so I can send it out to other friends for comments that do not own the game.  That should get me comfortable enough to start on the more advanced stuff later.  I intend to document what I learn as I go and help refine the tutorials/pages so that they better answer newbie questions and clear up confusion.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''&lt;u&gt;Watch List&lt;/u&gt;''' 
|-
|[[Spark/Developer_Journal
|RPG/Strategy Mod]] 
|-
|[[AlphaOne/AlphaCoop
|CoOp monster crawl]] 
|}

----

'''Jaks:''' Just getting settled in, expect more in the near future.

'''El Muerte TDS:''' Welcome to the Wiki. I'm expecting ;)

'''EntropicLqd:''' Welcome to the Wiki.  I hope you enjoy your stay :)

'''Zxanphorian:''' Hi and welcome to the wiki! :):tup:

'''Zxanphorian:''' Wow, the most uniform/small width segment of changes on the [[Legacy:Recent Changes|Recent Changes]]! :)

'''Jaks:''' Yeah, I'm beginning to get used to the Wiki ideals, gonna start using the Sandbox more often :)

'''Tarquin:''' Hi, welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:James Kilton</title>
    <id>1554</id>
    <revision>
      <id>3869</id>
      <timestamp>2004-01-11T11:09:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===James Kilton===

----

Well, felt it was time for me to start up a Wiki page. So little to mention, so much time.

Wait, reverse that.

I guess the best thing to mention right now is that I am the lead Coder for Unreal Annihilation and am one of the few people working with an RTS view system.

Check us out: http://www.unrealannihilation.com

----

'''Corran:''' Hey James, welcome to the wiki.

'''Tarquin:''' Hello :) welcome to Unreal Wiki!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3870</id>
      <timestamp>2004-01-11T10:23:31Z</timestamp>
      <contributor>
        <ip>Corran</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===James Kilton===

----

Well, felt it was time for me to start up a Wiki page. So little to mention, so much time.

Wait, reverse that.

I guess the best thing to mention right now is that I am the lead Coder for Unreal Annihilation and am one of the few people working with an RTS view system.

Check us out: http://www.unrealannihilation.com

----

'''Corran:''' Hey James, welcome to the wiki.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jan</title>
    <id>28237</id>
    <revision>
      <id>39862</id>
      <timestamp>2009-11-14T11:35:27Z</timestamp>
      <contributor>
        <username>Jan</username>
        <id>1621</id>
      </contributor>
      <comment>moved [[Legacy:Jan]] to [[Jan]]</comment>
      <text xml:space="preserve">#REDIRECT [[Jan]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jarronis, The Vampiric Unicorn</title>
    <id>1549</id>
    <revision>
      <id>3858</id>
      <timestamp>2007-08-28T19:16:07Z</timestamp>
      <contributor>
        <ip>P54BD4ECF.dip.t-dialin.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

Hobby UScript-Coder, Oldsk00l-UT-Combat-Monster &amp; UT2003-N00b...

====Bloom====

Well, after playing some game-demos, i wondered if it is possible to implement a Bloom-Effect in UT. I thought  on using a scripted texture with drawportal, then filtering the bright parts of the rendered frame. 

Unfortunately, i discovered that the Canvas - Class is not capable to render a ScriptedTexture directly, so i had to use DrawActor with a rectangle mesh instead. 

My Results are quite good, but still needs some tweaks.

Because of the restrictions of the Drawportal - Routine of a scripted Texture, this Bloom-Effect is best used with Third-Person-View Gametypes(namely Chaos Duel).

See [[Legacy:Bloom|Bloom]]

===Current Coding Projects (wiki-related)===

See [[Legacy:Mod_Ideas/Chameleon|Mod_Ideas/Chameleon]]

====Progress====

I just figured out that it is much easier get texture names form the level than i thought. If you look in the definition of the trace function, you'll see one interresting thing:

&lt;uscript&gt;
native(277) final function Actor Trace
(
	out vector      HitLocation,
	out vector      HitNormal,
	vector          TraceEnd,
	optional vector TraceStart,
	optional bool   bTraceActors,
	optional vector Extent,
	optional out material Material
);
&lt;/uscript&gt;

The very last parameter allows to store the material from the actor, hit by the trace. This is pretty cool for the Chameleon-Mod. I've experimented with it, and it works great.

This, of course, is not all, because this has to be a kind of client-side effect to determine what wall we should trace. I think i could hack this into an interaction.  

So here is a Screenshot, showing an similiar effect like the one that is planned. In fact it is actually the chameleon effect, but still picking the texture from the ground.

&lt;img/ src=&quot;http://home.arcor.de/jarronis/ch1.jpg&quot;&gt;

He's to shy to show his face because this isn't camouflaged :P

Technically spoken: I still replaced only the first entry in the Skins-Array. 

Here is the code of the Mini-Mutator (seen in Action in the screenshot).

&lt;uscript&gt;
//==================================================
// ChameleonFX &lt;-J-VU
// This class changes skin of the assigned pawn, 
// according to the material of the ground
//==================================================

class ChameleonFX extends Actor;
var pawn AttachedTo;
var vector loc, norm, target;
var material Tmat;

event postbeginplay()
{
	Settimer(0.2,true);
}

event timer()
{
	if (AttachedTo != None)
	{
		AttachedTo.Trace(loc,norm,vect(0,0,-1)*256+attachedTo.location,attachedTo.location,true,,tmat);
		if (TMat!=None) AttachedTo.Skins[0]=Tmat;
	}
	else destroy();
}
&lt;/uscript&gt;

This class dynamically changes the pawn's skin. As you see, the trace is still constant, and &quot;scans&quot; the ground for his material. I'm going to code this into an (hopefully) complete client side Interaction-Class, so every player determines the direction for the trace for himself.

&lt;uscript&gt;
//=============================================================
// MutCham &lt; J-VU
// This mutator is responsible for spawning a ChameleonFX-Actor
// for each pawn that logs in.
//=============================================================

class MutCham extends Mutator;

function ModifyPlayer(Pawn Other)
{
	local ChameleonFX cfx;
	cfx = spawn(class'Chameleon.ChameleonFX',self);
	cfx.AttachedTo=Other;
	if ( NextMutator != None )
		NextMutator.ModifyPlayer(Other);
}

defaultproperties
{
	FriendlyName=&quot;Chameleon Arena&quot;
	Description=&quot;Chameleon&quot;
}
&lt;/uscript&gt;

Well, that is the Mutator...

This one was pretty easy, as you see.

After a long time of inactivity, i continued coding on this issue.

So here's the Code of the Interaction-Class Version:

&lt;uscript&gt;
//===========================================================
// ChamInter &lt;- J-VU
// This (hopefully) client-sided class is responsible for 
// detecting the proper texture for the Chameleon effect
// from the view of the player.
// A lot stuff is taken from the UnrealWiki - Documentations
// so do not wonder if there're 'common' things
//===========================================================

class ChamInter extends Interaction;

var GameReplicationInfo GRI;
var Font UsedFont;

event Initialized()
{
    log(&quot;Chameleon Interaction Initialized&quot;);
    foreach ViewportOwner.Actor.DynamicActors(class'GameReplicationInfo', GRI)
        If (GRI != None)
            Break;
}

event tick(float DeltaTime)
{
	local Pawn ChP, Selfpawn;
	local vector loc, norm, target;
	local material Tmat;
	if (ViewportOwner.Actor.Pawn == None) return;
	Selfpawn = ViewportOwner.Actor.Pawn;
	foreach ViewportOwner.Actor.DynamicActors(class'Pawn', ChP)
	{
		ViewportOwner.Actor.Trace(loc, norm, (normal(ChP.location-Selfpawn.location)*8192)+ChP.location,ChP.location,true,,tmat);
		if (TMat!=None) ChP.Skins[0]=Tmat;
		if (TMat!=None) ChP.Skins[1]=Tmat;
		
	}
		
}

simulated function PostRender( canvas Canvas )
{
	If (UsedFont == None) UsedFont = Font(DynamicLoadObject(&quot;UT2003Fonts.FontEurostile12&quot;, class'Font'));
	Canvas.Font = UsedFont;
	Canvas.FontScaleX = 1;
	Canvas.FontScaleY = 1;
	Canvas.SetPos(10,200);
	Canvas.drawcolor.r=200;
	Canvas.drawcolor.g=200;
	Canvas.drawcolor.b=255;
	Canvas.DrawText(&quot;Chameleon Activ&quot;);//debugging...
}

defaultproperties
{
	bActive=true
	bRequiresTick=true
	bvisible=true;
}
&lt;/uscript&gt;

You'll still need a mutator to spawn these interactions. This of course is a very basic version, so it hasn't any gameplay tweaks.

----

==Comments ==

'''CH3Z:''' Wow! I'm excited! This is for UT Classic then?

'''Jarronis, The Vampiric Unicorn''' I'm sorry, but this is still for UT2003. I haven't coded for UT Classic for awhile. But if picked up my UT Classic Installation form my HDD, i can go for it :)

'''Mosquito:''' I'm interested to know what you're going to do with the code once you finished.  It adds a whole new type of gameplay.  As I mentioned before, I wanted to do this in my HL mod and my UT2003 mod.  I'm a beginning scripter.

'''CH3Z:''' I just took a look at UT code and the very param that you mentioned, &quot;optional out material Material&quot; turns out to be the only line that is different in UT&gt;&gt;Actor/native(277) final function Actor Trace. The diff is that it's just not there in the UT engine like it is in UT2003. =( oh well.

'''Mr.Mitchell:''' For the old UT you can use a Decal to get a texture. Just spawn one and use the AttachDecal function to attach it to a surface. The attachDecal function returns the texture of the surface it is attached to.

'''Jarronis, The Vampiric Unicorn''' Cool! Thanks for this advice.

'''Ch3z:''' Looks like your having all kinds of fun Jarronis. =) I wanted to let you know that I added a page to the Wiki that you might find usefull. The [[Legacy:Testing Lab|Testing Lab]] might have been nice when you wanted to have someone test the Chameleon Mutator online.

I would love to see new models you make or any work you do. But remember I'm still only running UT. And yes, I still still wear army jackets around town from the surplus stores heheh I'm not dated, I'm just seasoned =P Keep havin' fun with the engine. 

'''Jarronis, The Vampiric Unicorn''' Oldsk00l-UT, hm? Well... i think there's a whole UT-Weapon-Arsenal haunting around on my HDD. If i dig it out, you probably have something to frag around with, but be prepared: As you might guess i have &quot;slight&quot; tendence to overkill weaponery (more BOOOOM for ya' money). There's even a complete War-Suite, including adaptiv Armor, Invisibility, LifeSens-Wallhack... ehm, okay... so much 'bout my Definition of &quot;Overkill&quot; :eek:

'''Foxpaw:''' A bloom effect, eh? What exact is a &quot;bloom effect.&quot; I did a search and found some pictures of something called a bloom effect but I'm not confident that what I found is the same thing that you have implemented.

'''Jarronis, The Vampiric Unicorn:''' Well, theoretical, bloom means halos around bright reflections. A similar effects is used Tron 2.0 for producing the glows. It also should blur bright surfaces in general. Well, admit, i'm still experimenting, and it is not quite easy to implement effects like this in UT. In the current state, the effect is quite subtil, and the screenshot isn't very good as demonstration. I'll put up some more.

'''SuperApe:''' I was intrigued by the Bloom page, which led me here.  It looks like the latest generation lighting effects seen in all the XBox360 launch titles. (Call of Duty2, Killzone, etc.)  The Bloom download link is broken unfortunately.  I came here in an attempt to find out more about what the BloomMesh was, and I see it says above it's a rectangular (plane?) mesh and what does the DreamTex look like?  It would be nice to see the latest version as a download.  I like the Cameleon-FX too. :)  Neat stuff.  It appears you have the Replication working, but I may be able to help.

'''A Lamer:''' I know this is a miserable and selfish thing to ask, but how hard would it be to make changes for it so it could fit the Unreal 2 runtime architecture. You know, that you can download from the actual site? I wouldn't be inquiring, honestly, but my father has a death-grip on my money and refuses to let me buy things. Hence no UT2003, etc. If it's too hard or complicated, you really don't need to bother, btw. I'd just like to know.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3859</id>
      <timestamp>2006-01-01T19:45:10Z</timestamp>
      <contributor>
        <ip>209.226.175.59</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;img/ src=&quot;http://home.arcor.de/jarronis/criticon.gif&quot;&gt;

===About Me===

Hobby UScript-Coder, Oldsk00l-UT-Combat-Monster &amp; UT2003-N00b...

===Yeah, I'm still alive===

Yes this is correct. Yes I did not forget the chameleon code. Unfortunately (for UnrealWiki), there also several other projects, which require me..., including some personal 'coding tasks'.

===Current Coding Projects (personal)===

====UC-ab278.01 &quot;Snipercorn&quot; :cool:====

Some kind of energy Crossbow with multiple ammo support, target acquisition... and all that stuff.

This one is also my first modelling project.

====UC-b384 &quot;Dragons Fury&quot;====

Napalm/Plasma Thrower. Nothing special, but the Fire Effect looks nice.

Almost finished. 

====Bloom====

Well, after playing some game-demos, i wondered if it is possible to implement a Bloom-Effect in UT. I thought  on using a scripted texture with drawportal, then filtering the bright parts of the rendered frame. 

Unfortunately, i discovered that the Canvas - Class is not capable to render a ScriptedTexture directly, so i had to use DrawActor with a rectangle mesh instead. 

My Results are quite good, but still needs some tweaks.

Because of the restrictions of the Drawportal - Routine of a scripted Texture, this Bloom-Effect is best used with Third-Person-View Gametypes(namely Chaos Duel).

See [[Legacy:Bloom|Bloom]]

===Current Coding Projects (wiki-related)===

See [[Legacy:Mod_Ideas/Chameleon|Mod_Ideas/Chameleon]]

====Progress====

I just figured out that it is much easier get texture names form the level than i thought. If you look in the definition of the trace function, you'll see one interresting thing:

&lt;uscript&gt;
native(277) final function Actor Trace
(
	out vector      HitLocation,
	out vector      HitNormal,
	vector          TraceEnd,
	optional vector TraceStart,
	optional bool   bTraceActors,
	optional vector Extent,
	optional out material Material
);
&lt;/uscript&gt;

The very last parameter allows to store the material from the actor, hit by the trace. This is pretty cool for the Chameleon-Mod. I've experimented with it, and it works great.

This, of course, is not all, because this has to be a kind of client-side effect to determine what wall we should trace. I think i could hack this into an interaction.  

So here is a Screenshot, showing an similiar effect like the one that is planned. In fact it is actually the chameleon effect, but still picking the texture from the ground.

&lt;img/ src=&quot;http://home.arcor.de/jarronis/ch1.jpg&quot;&gt;

He's to shy to show his face because this isn't camouflaged :P

Technically spoken: I still replaced only the first entry in the Skins-Array. 

Here is the code of the Mini-Mutator (seen in Action in the screenshot).

&lt;uscript&gt;
//==================================================
// ChameleonFX &lt;-J-VU
// This class changes skin of the assigned pawn, 
// according to the material of the ground
//==================================================

class ChameleonFX extends Actor;
var pawn AttachedTo;
var vector loc, norm, target;
var material Tmat;

event postbeginplay()
{
	Settimer(0.2,true);
}

event timer()
{
	if (AttachedTo != None)
	{
		AttachedTo.Trace(loc,norm,vect(0,0,-1)*256+attachedTo.location,attachedTo.location,true,,tmat);
		if (TMat!=None) AttachedTo.Skins[0]=Tmat;
	}
	else destroy();
}
&lt;/uscript&gt;

This class dynamically changes the pawn's skin. As you see, the trace is still constant, and &quot;scans&quot; the ground for his material. I'm going to code this into an (hopefully) complete client side Interaction-Class, so every player determines the direction for the trace for himself.

&lt;uscript&gt;
//=============================================================
// MutCham &lt; J-VU
// This mutator is responsible for spawning a ChameleonFX-Actor
// for each pawn that logs in.
//=============================================================

class MutCham extends Mutator;

function ModifyPlayer(Pawn Other)
{
	local ChameleonFX cfx;
	cfx = spawn(class'Chameleon.ChameleonFX',self);
	cfx.AttachedTo=Other;
	if ( NextMutator != None )
		NextMutator.ModifyPlayer(Other);
}

defaultproperties
{
	FriendlyName=&quot;Chameleon Arena&quot;
	Description=&quot;Chameleon&quot;
}
&lt;/uscript&gt;

Well, that is the Mutator...

This one was pretty easy, as you see.

After a long time of inactivity, i continued coding on this issue.

So here's the Code of the Interaction-Class Version:

&lt;uscript&gt;
//===========================================================
// ChamInter &lt;- J-VU
// This (hopefully) client-sided class is responsible for 
// detecting the proper texture for the Chameleon effect
// from the view of the player.
// A lot stuff is taken from the UnrealWiki - Documentations
// so do not wonder if there're 'common' things
//===========================================================

class ChamInter extends Interaction;

var GameReplicationInfo GRI;
var Font UsedFont;

event Initialized()
{
    log(&quot;Chameleon Interaction Initialized&quot;);
    foreach ViewportOwner.Actor.DynamicActors(class'GameReplicationInfo', GRI)
        If (GRI != None)
            Break;
}

event tick(float DeltaTime)
{
	local Pawn ChP, Selfpawn;
	local vector loc, norm, target;
	local material Tmat;
	if (ViewportOwner.Actor.Pawn == None) return;
	Selfpawn = ViewportOwner.Actor.Pawn;
	foreach ViewportOwner.Actor.DynamicActors(class'Pawn', ChP)
	{
		ViewportOwner.Actor.Trace(loc, norm, (normal(ChP.location-Selfpawn.location)*8192)+ChP.location,ChP.location,true,,tmat);
		if (TMat!=None) ChP.Skins[0]=Tmat;
		if (TMat!=None) ChP.Skins[1]=Tmat;
		
	}
		
}

simulated function PostRender( canvas Canvas )
{
	If (UsedFont == None) UsedFont = Font(DynamicLoadObject(&quot;UT2003Fonts.FontEurostile12&quot;, class'Font'));
	Canvas.Font = UsedFont;
	Canvas.FontScaleX = 1;
	Canvas.FontScaleY = 1;
	Canvas.SetPos(10,200);
	Canvas.drawcolor.r=200;
	Canvas.drawcolor.g=200;
	Canvas.drawcolor.b=255;
	Canvas.DrawText(&quot;Chameleon Activ&quot;);//debugging...
}

defaultproperties
{
	bActive=true
	bRequiresTick=true
	bvisible=true;
}
&lt;/uscript&gt;

You'll still need a mutator to spawn these interactions. This of course is a very basic version, so it hasn't any gameplay tweaks.

----

==Comments ==

'''CH3Z:''' Wow! I'm excited! This is for UT Classic then?

'''Jarronis, The Vampiric Unicorn''' I'm sorry, but this is still for UT2003. I haven't coded for UT Classic for awhile. But if picked up my UT Classic Installation form my HDD, i can go for it :)

'''Mosquito:''' I'm interested to know what you're going to do with the code once you finished.  It adds a whole new type of gameplay.  As I mentioned before, I wanted to do this in my HL mod and my UT2003 mod.  I'm a beginning scripter.

'''CH3Z:''' I just took a look at UT code and the very param that you mentioned, &quot;optional out material Material&quot; turns out to be the only line that is different in UT&gt;&gt;Actor/native(277) final function Actor Trace. The diff is that it's just not there in the UT engine like it is in UT2003. =( oh well.

'''Mr.Mitchell:''' For the old UT you can use a Decal to get a texture. Just spawn one and use the AttachDecal function to attach it to a surface. The attachDecal function returns the texture of the surface it is attached to.

'''Jarronis, The Vampiric Unicorn''' Cool! Thanks for this advice.

'''Ch3z:''' Looks like your having all kinds of fun Jarronis. =) I wanted to let you know that I added a page to the Wiki that you might find usefull. The [[Legacy:Testing Lab|Testing Lab]] might have been nice when you wanted to have someone test the Chameleon Mutator online.

I would love to see new models you make or any work you do. But remember I'm still only running UT. And yes, I still still wear army jackets around town from the surplus stores heheh I'm not dated, I'm just seasoned =P Keep havin' fun with the engine. 

'''Jarronis, The Vampiric Unicorn''' Oldsk00l-UT, hm? Well... i think there's a whole UT-Weapon-Arsenal haunting around on my HDD. If i dig it out, you probably have something to frag around with, but be prepared: As you might guess i have &quot;slight&quot; tendence to overkill weaponery (more BOOOOM for ya' money). There's even a complete War-Suite, including adaptiv Armor, Invisibility, LifeSens-Wallhack... ehm, okay... so much 'bout my Definition of &quot;Overkill&quot; :eek:

'''Foxpaw:''' A bloom effect, eh? What exact is a &quot;bloom effect.&quot; I did a search and found some pictures of something called a bloom effect but I'm not confident that what I found is the same thing that you have implemented.

'''Jarronis, The Vampiric Unicorn:''' Well, theoretical, bloom means halos around bright reflections. A similar effects is used Tron 2.0 for producing the glows. It also should blur bright surfaces in general. Well, admit, i'm still experimenting, and it is not quite easy to implement effects like this in UT. In the current state, the effect is quite subtil, and the screenshot isn't very good as demonstration. I'll put up some more.

'''SuperApe:''' I was intrigued by the Bloom page, which led me here.  It looks like the latest generation lighting effects seen in all the XBox360 launch titles. (Call of Duty2, Killzone, etc.)  The Bloom download link is broken unfortunately.  I came here in an attempt to find out more about what the BloomMesh was, and I see it says above it's a rectangular (plane?) mesh and what does the DreamTex look like?  It would be nice to see the latest version as a download.  I like the Cameleon-FX too. :)  Neat stuff.  It appears you have the Replication working, but I may be able to help.

'''A Lamer:''' I know this is a miserable and selfish thing to ask, but how hard would it be to make changes for it so it could fit the Unreal 2 runtime architecture. You know, that you can download from the actual site? I wouldn't be inquiring, honestly, but my father has a death-grip on my money and refuses to let me buy things. Hence no UT2003, etc. If it's too hard or complicated, you really don't need to bother, btw. I'd just like to know.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JarryHolis</title>
    <id>1561</id>
    <revision>
      <id>3885</id>
      <timestamp>2005-06-01T09:01:42Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello........

Just walking through the wiki to see what is to be found.

There are so many wikis out there with such a wide variety of topics to discuss.

Other interesting sites plus wikis to look for:

http://wikipedia.org ,

http://users.cjb.net/w100/ ,

http://www.emacswiki.org/ ,

http://wiki.org 

----

'''Tarquin:''' Hello. Welcome to Unreal Wiki :)</text>
    </revision>
    <revision>
      <id>3886</id>
      <timestamp>2005-06-01T07:14:53Z</timestamp>
      <contributor>
        <ip>JarryHolis</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello........

Just walking through the wiki to see what is to be found.

There are so many wiki's out there with such a wide variety of topics to discuss.

Other interesting sites plus wikis to look for:

http://wikipedia.org ,

http://users.cjb.net/w100/ ,

http://www.emacswiki.org/ ,

http://wiki.org</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jayaprabhakar</title>
    <id>1559</id>
    <revision>
      <id>3881</id>
      <timestamp>2005-04-25T07:31:25Z</timestamp>
      <contributor>
        <ip>Jayaprabhakar</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi friends,
 I am Jayaprabhakar. K, a final year student of College of Engineering, Guindy, Annay University.
 You can visit my home page at http://www.myjavaserver.com/~jayaprabhakar</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jb</title>
    <id>1538</id>
    <revision>
      <id>3832</id>
      <timestamp>2006-11-25T14:00:41Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">Chaotic Dreams Team Member

CUT Team Lead 

Lead Coder/Mapper for ChaosUT

==Projects for UT==

'''ChaosUT'''  

Popular mod that combined new weapons as well as started to branch out into other game types (KoTH). See: http://www.planetunreal.com/chaotic  I was a new member of the team 1.5 years ago. Started as a mapper with some skinning skills. Then was promoted to team lead and lead coder. Yikes!!!

==Plans for UT2k3==

'''ChaosUT2:Evolution''' 

The next gen of Chaos. Take the things that worked with CUT and improve or evolve them into something bigger, better more fun :)

==ChaosUT Post Mortem==

ChaosUT has had its share of success in the UT community. It did place in a few spots in the Make Something Unreal contest as well as being including on the GOYTE Unreal Tournament CD. But we also have had our share of problems as it was not such a smooth ride. Most of these comments comes from my experience being the team leader as well as a coder and mapper for the Chaotic Dreams team over the past 18 months. I just wanted to touch on some things that we could have done better and hope that other teams can learn and find ways to avoid some of issues that we suffered:

===Key Talent Leaving===

I am sure most teams that have been around for any amount of time will have to deal with this. With us it was a sever blow. Chaotic Dreams was a decent sized mod team coming off the Q2 versions (which was included on ID's Extremities CD). However the group wanted to work on both a UT version as well as a Q3 version. So the team sort of split into to areas with each &quot;team&quot; working on a Chaos version for that game. The UT version had a bit more support and we were able to get up to a GOTYE. However after that point some of the team decided that they needed a break. Our lead mapper just had a new addition to his family and wanted some much deserved R&amp;R. Our only texture artist also was pursuing other interest in her Real Life and no longer could help out. Our founder/modeler/skinner just graduated collage and took a job working on the Y-project so he had almost no time to help. And finally the only coder also needed time off as he wanted to get his MS degree. So that left the once popular mod literally dead in the water. They all did not leave at once which was a good thing. In fact I was brought in to replace the mapper as I had been a beta tester for them. Like wise we were able to find a few more people to help all taken from our beta test group. As you can imagine we were still learning how to make a mod as well as our skills had not developed to a level that was close to the original team. This meant a lot of work for us new guys. I know that this is a pipe dream but having extra people or people that can overlap and do more than one thing is a god send. I was able to learn how to map and code. We also had another team member that could map as well as model. So we could get by with out a dedicated mapper. Not every team can afford to have people get experience in other areas but it not only makes the team stronger but it give that person a chance to work in another area which for some is a nice change of pace. Also networking can help to replace talent. Getting your name/mod known can help produce leads and draw talent in. You never know when you may need more help.

It also would have been a lot easier had these key users documented a bit more of what they did. Us new guys were not given any guidance or direction. The original coder did have a chance to give me all of the code files so we could continue with the code but a lot of content had to be recreated from scratch. While that's not the worse case it only managed use to take more time to get to a point were we could move the mod forward.

I know that things change and it will be hard for a team to stay together. But make sure you have a back up plan in case any key member needs to stop working due to what ever reasons. And if that person has to leave try to get them to document as much as they can as it will save a lot of time and energy.  Also try to keep your core info some place where others can access it. You don't want one person to have all of the core data and if that person looses the data then the whole team may be in trouble.

===Beta Testing===

I like what Mychaeel said about beta testing and how that's a key component. At first we did not have a system to test our mod. So our beta testing consisted of a few of us playing the mod looking for any errors. While that's fine and dandy for some part it was not enough. It was my fault that we did not concentrate on it more.  There were some bugs that should have been caught but were not. Also that method is not very efficient. We have since refined our method to test for certain areas and have broken up the work to each beta tester. This allows us to not only cover more areas but also spend less time doing so. It also helps to have good testers. A few we had in the past did not document very well the &quot;when and where&quot; when a bug was found. So it was hard to reproduce and fix (I was probably the worst beta tester we had). The current group of guys has really done a good job of providing all of the details on how to create the bug so I can attempt to fix it vrs spending hours to reproduce it. I would like to see our beta testers grow a bit more so we can continue to refine our methods. Beta testing is one of the most important parts of the mod making process; don't over look it! 

===Coding===

Here is another thing that I should have know better. I thought some classes in assembly coding while I was in my graduate studies at school. I stressed to my students that's comments were essential. Yet I look back at the code I wrote and I hardly have any. What a hypocrite I am :( The original coder did not have time to comment his code and I was always working on it in a &quot;fire fight mode&quot; meaning I need to get the code working now. So I did not spend time looking over each and every line of his code. And with out comments I was lost in parts. I made assumptions and most of the time those were wrong. With the new code I did write I did comment it better. And no I don't mean every line needs to have comments. But looking at code with nothing commented is hard to do. It would have saved me a lot of time had we had some comments in our code. The new code we have written for the next version of Chaos is well committed and we will keep it that way. 

Also at one brief time there was two of us working on code. There was one case we both worked ended up working on the same thing and had over lapping code. The problem is we lost some of my work when he did the code and vise versa. If your sharing code you need to have good communication. I would prefer to have one person keep control of one part of the code that they are responsible and the other keeps track of a different set of code that is their responsibility. Other wise sharing code is a nightmare...

===Team Size===

Chaos never really had a dedicated leader or any set positions. For the most part we were just a bunch of people hanging out having fun. However as the team has grown a bit it gets a lot hard to keep things moving. You have a difference of opinion on all sorts of things as well as some confusion. We have since tried to make some general listings so we can delegate the work to the right group. I agree this sounds like common sense but that's something we did not do at first.

===Public news===

During the time we had transition from the &quot;old&quot; to the &quot;new&quot; team we had almost no news or other public showing. I think that really hurt us. I have seen some mods draw in a huge following with out releasing anything. They do this by many different means. Now while I don't want to change ChaosUT to mod that wants to be popular, I do want to keep the fans more in tune to what's going one. Once every 7 weeks, updates to the sites will not get that goal done. We have since re-did the interface to submit news to make it a bit easier for us to keep the public up to date. We also want to start posting more concept art and development work. We have seen a lot of other mod teams post renders of their ideas in various stated of development. We are not making Chaos for us, we are making it for you and we need to work on that last part better. 

I am sure some of the other teams out there have done all of these a lot better than what we did. And most of these are common sense. However I am sure we are not the only mod to suffer some of these setbacks and other issues. So I hope that we all can learn from our mistakes and make sure that we do not make the same mistakes next time. Thanks for your time, Jb

----

'''Mychaeel:''' Welcome to the Wiki.  :-)  Add yourself to the [[Legacy:Project Contributors|Project Contributors]] page, please.

'''ZxAnPhOrIaN:''' Hi Jb! :) :tup:

'''Tarquin:''' That's some great advice in your history of ChaosUT, Jb. I'm starting to wonder if your ideas from this page and [[Legacy:Mychaeel|Mychaeel]]'s could be made into a general page on [[Legacy:Mod Creation|Mod Creation]]. 

'''EntropicLqd:''' All good stuff there JB.  For all that it might have been painful, you chaps succeeded where a lot of teams would have simply folded up.  And ''Real Life'' is a right bugger as when the cards are called the &quot;game&quot; always loses.  I'd be interested in some more detail on your testing strategies .. good testers are damn hard to find.

'''Jb:''' I'd be happy to help in any way if you think a page like that is a good idea Tarquin, Just let me know what I can do to help.

'''EntropicLqd:''' Have a read of [[Legacy:Making Mods/Effective Testing|Making Mods/Effective Testing]] and change, comment, refactor at will.  It looks like [[Legacy:Making Mods|Making Mods]] might become a reality.  We shall see. 

'''Vajuras:''' This was a very entertaining read. Choas UT has definetly accomplished a lot of great feats. Good to see things are back on track!

'''LoQtUS:''' That sounds like an acurate account to me ;) Allthough i really dont think i was a god send. heh

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3833</id>
      <timestamp>2006-11-25T13:56:38Z</timestamp>
      <contributor>
        <ip>220.70.59.16</ip>
      </contributor>
      <text xml:space="preserve">Lowest prices.   &lt;a href=&quot; http://www.hotboards.com/plus/plus.mirage?who=badcredloans &quot;&gt;bad credit loan&lt;/a&gt; &lt;a href=&quot; http://www.hotboards.com/plus/plus.mirage?who=badcredloans &quot;&gt;bad credit loans&lt;/a&gt; &lt;a href=&quot; http://www.hotboards.com/plus/plus.mirage?who=badcredloans &quot;&gt;bad credit personal loan&lt;/a&gt; &lt;a href=&quot; http://www.hotboards.com/plus/plus.mirage?who=badcredloans &quot;&gt;bad credit personal loans&lt;/a&gt; &lt;a href=&quot; http://www.hotboards.com/plus/plus.mirage?who=freepvideo &quot;&gt;free porn video&lt;/a&gt; &lt;a href=&quot; http://www.hotboards.com/plus/plus.mirage?who=freepvideo &quot;&gt;free porn video clip&lt;/a&gt; [url=http://www.hotboards.com/plus/plus.mirage?who=badcredloans]bad credit loan[/url] [url=http://www.hotboards.com/plus/plus.mirage?who=badcredloans]bad credit loans[/url] [url=http://www.hotboards.com/plus/plus.mirage?who=badcredloans]bad credit personal loan[/url] [url=http://www.hotboards.com/plus/plus.mirage?who=badcredloans]bad credit personal loans[/url] [url=http://www.hotboards.com/plus/plus.mirage?who=freepvideo]free porn video[/url] [url=http://www.hotboards.com/plus/plus.mirage?who=freepvideo]free porn video clip[/url] Online Pharmacy !</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JeT</title>
    <id>1556</id>
    <revision>
      <id>3873</id>
      <timestamp>2004-05-08T20:03:23Z</timestamp>
      <contributor>
        <ip>JeT</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Projects:===

Unreal Demolition
:'''''Info Coming Soon'''''

====Code====

:'''''Info Coming Soon'''''

----

'''JeT:''' Comments go under here. ;)

'''Tarquin:''' Hi, welcome to the wiki :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Stunts are the bestest :)

'''Corran:''' Yup, we all love stuntsesss...

'''JeT:''' Heheh. I received my retail copy of UT2004 today, and I have already converted most of my stunt script into a mutator. (I ran the stunt script in the stunthq server, twas lots of fun.)

'''Daid303:''' Ey, JeT, you here? Everybody seems to strand here some day :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3874</id>
      <timestamp>2004-03-16T22:19:42Z</timestamp>
      <contributor>
        <ip>C26145.upc-c.chello.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Projects:===

:I run the HQ Network, and my latest project is the StuntHQ team. ( http://www.stunthq.com )
:I will be creating stunt mutators to make the ultimate stunting server. More info to come.

====Code====

:'''''Currently I have no code to show, but as I begin work on my StuntHQ mutator I can post snippets of certain things.'''''

----

'''JeT:''' Comments go under here. ;)

'''Tarquin:''' Hi, welcome to the wiki :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Stunts are the bestest :)

'''Corran:''' Yup, we all love stuntsesss...

'''JeT:''' Heheh. I received my retail copy of UT2004 today, and I have already converted most of my stunt script into a mutator. (I ran the stunt script in the stunthq server, twas lots of fun.)

'''Daid303:''' Ey, JeT, you here? Everybody seems to strand here some day :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3875</id>
      <timestamp>2004-03-17T03:07:52Z</timestamp>
      <contributor>
        <ip>JeT</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Projects:===

:I run the HQ Network, and my latest project is the StuntHQ team. ( http://www.stunthq.com )
:I have started work on Stunt HQ v1.0 - A basic stunting mutator that will jump start any stunting server. Tis basic atm, but lots to come...

====Code====

:'''''Currently I have no code to show, but as I begin work on my StuntHQ mutator I can post snippets of certain things.'''''

----

'''JeT:''' Comments go under here. ;)

'''Tarquin:''' Hi, welcome to the wiki :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Stunts are the bestest :)

'''Corran:''' Yup, we all love stuntsesss...

'''JeT:''' Heheh. I received my retail copy of UT2004 today, and I have already converted most of my stunt script into a mutator. (I ran the stunt script in the stunthq server, twas lots of fun.)

'''Daid303:''' Ey, JeT, you here? Everybody seems to strand here some day :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jeeptrash</title>
    <id>1542</id>
    <revision>
      <id>3842</id>
      <timestamp>2003-06-09T15:58:41Z</timestamp>
      <contributor>
        <ip>Jeeptrash</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi everybody. La La La.

'''EntropicLqd:''' Hello and welcome to the Wiki.  Enjoy your stay and feel free to add yourself to the [[Legacy:Project Contributors|Project Contributors]] page if you so wish (and haven't done so already). :)

----

blather:

'''Jeeptrash:''' I've been using the sunlight actor to simulate sunlight (!) coming thru bsp windows into my bsp map. The effect works and is nice but I get a weird effect: many but not all of the corners of the bsp facing one direction have a weird sunlight glow as if light was leaking under the walls. There are no actual holes, no hom... its on the lightmap. Moving the actual sunlight actor around or changing the angle hasn't helped any.

I'm also getting the problem where hardware brushes are overlit, but I can work around that with bSpecialLit.

Anyone have any exp or ideas?

'''Highlander:''' have you tried increasing the resolution of the lightmap on the effected BSP surfaces? (surface properties window) it will obviously harm performance of course.. not sure if it will be noticable. Other than that I dont have any other ideas. Unless antiportals effect light calculations?? in which case they may be of some help.

'''Jeeptrash:''' bumping up the lightmap res fixed a couple of the places, good call. One of the places it happened went away when I -lowered- the resolution (1 notch to 32... I tried all the way to 256 but the glow came back when I went past 32). Some of the places didn't change at all when I changed the res. As far as the performance hit, I dunno either yet. I doubt it will be too bad anyway, this is a fairly simple 1v1 kinda map. I'm gonna save out a version with and without the higher lightmap res and do some tests.

My next thing to try is moving the fake backdrop faces around and tweaking the rotation and settings on the sunlight actor itself. I'm also assuming that when I start zoning this map the glitches will at least only happen in the zone with the sunlight (I hope I hope). Does sunlight shine thru zone portals like regular lights?

(I'll move this offa here and onto the sunlight page after I've tried all the different tricks)

'''Highlander:''' I *think* sunlight crosses zones... infact im pretty sure it does. 

'''Jeeptrash:''' Yeah I kinda figured it would. I was hoping that maybe the zoning would CONFUSE THE GOBLIN and get rid of the glitches somehow.

'''Jeeptrash:'''Well after trying different solutions basically all day it looks like the best stopgap is:

1. try tweaking the lightmap resolution on the affected surface (try both higher and lower res, I had one glitch that went away when i raised it and a diff one went away when i lowered it)

2. If you can, cover the glitches with static mesh &quot;trim&quot; and leave'em.

3. for the rest that dont go away after #1, or arent hidden by #2, build a simple bsp shape (square or tri-prism) and place it in solid space about 16uu from the bad corner. Subtract it and move it up and down until it &quot;shades&quot; the glowing corner from the sunlight. Since it has no connection to the real map it will be off in its own zone and shouldnt ever really be visible to the renderer.

Will try the portals and antiportals next... 

====BMP files turning black and white when imported into UED 3.0 ====

'''Jeeptrash:'''I threw some screenshots into Photoshop 7 to crop and make into an animated level preview texture. When I saved them out and imported them into the texture browser 2 things happened: When I saved them, I was not allowed to choose 8-bit (and i dont know why I wanted 8-bit, I was just following the tutorial); the lowest was 12(?!); and when I imported them they appeared as grayscale images. The file themselves are not greyscale, when I open them up in any app the color is there, but when I import them into ued texture browser they go all film noir on me. ...  Animated preview texture came out nice tho :)... I'm obviously missing something about the bmp file format here, anybody know what I'm doing wrong?

'''AlphaOne:''' I'm not sure how it works, but if you use BMP files, you're supposed to save them as a colour index!? Does that help?

'''Jeeptrash''' Hmm so far it looks like UED talks about 8bit+alpha where photoshop says 32 bit (ie. R8+G8+B8+A8=32) or 24 (RGB but no [[Legacy:Alpha Channel|alpha channel]] saved). Im sure this junk is on the wiki somewhere, I gotta dredge it up and link it better...

'''Kerlin:''' You might have less headaches by saving them as PCXs through something like [[Legacy:Bright|bright]]. Dunno for sure, though. http://udn.epicgames.com/pub/Content/TextureSpecifications/bright181.zip

'''Jeeptrash:''' Thanks, I'm gonna stick that link on the tex import page.. actually looking at that url makes me think i need to go read http://udn.epicgames.com/pub/Content/TextureSpecifications and get clue that way.

'''Jeeptrash:''' Sounds like its a UED2 vs UED3 thing + a different nomenclature thing. I got it working, thanks, I still don't totally understand what bmp format is doing tho.. I'm originally a mac person and I didn't run into BMPs much- mostly Q3 on mac so photoshop -&gt; Targa -&gt; right into the pakfile...

'''Kerlin:''' Wow! I was actually able to help somebody with something. That makes me happy. :) That means I'm learning something.

'''Jeeptrash:''' Trippy ain't it! Ugh, I was wrong yet again, tho- according to that UDN page, UED is talking about pallettized textures which I didn't recognize cuz I never used em... I just forgot that Phootooshoop won't let you save directly into a palletized format from an rgb (or whatever u call a normal image) format; you gotta switch to a palettized format in Pshop and then save... and then you will have an option to save down to a shallower palette. That Bright program you linked to Kerlin is a little converter that can do that + other neat tricks, and do batches and previews.. looks useful.

moving this to the texture importage page - will delete this shortly

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3843</id>
      <timestamp>2002-12-27T21:50:18Z</timestamp>
      <contributor>
        <ip>Jeeptrash</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi everybody. La La La.

'''EntropicLqd:''' Hello and welcome to the Wiki.  Enjoy your stay and feel free to add yourself to the [[Legacy:Project Contributors|Project Contributors]] page if you so wish (and haven't done so already). :)

----

blather:

'''Jeeptrash:''' I've been using the sunlight actor to simulate sunlight (!) coming thru bsp windows into my bsp map. The effect works and is nice but I get a weird effect: many but not all of the corners of the bsp facing one direction have a weird sunlight glow as if light was leaking under the walls. There are no actual holes, no hom... its on the lightmap. Moving the actual sunlight actor around or changing the angle hasn't helped any.

I'm also getting the problem where hardware brushes are overlit, but I can work around that with bSpecialLit.

Anyone have any exp or ideas?

'''Highlander:''' have you tried increasing the resolution of the lightmap on the effected BSP surfaces? (surface properties window) it will obviously harm performance of course.. not sure if it will be noticable. Other than that I dont have any other ideas. Unless antiportals effect light calculations?? in which case they may be of some help.

'''Jeeptrash:''' bumping up the lightmap res fixed a couple of the places, good call. One of the places it happened went away when I -lowered- the resolution (1 notch to 32... I tried all the way to 256 but the glow came back when I went past 32). Some of the places didn't change at all when I changed the res. As far as the performance hit, I dunno either yet. I doubt it will be too bad anyway, this is a fairly simple 1v1 kinda map. I'm gonna save out a version with and without the higher lightmap res and do some tests.

My next thing to try is moving the fake backdrop faces around and tweaking the rotation and settings on the sunlight actor itself. I'm also assuming that when I start zoning this map the glitches will at least only happen in the zone with the sunlight (I hope I hope). Does sunlight shine thru zone portals like regular lights?

(I'll move this offa here and onto the sunlight page after I've tried all the different tricks)

'''Highlander:''' I *think* sunlight crosses zones... infact im pretty sure it does. 

'''Jeeptrash:''' Yeah I kinda figured it would. I was hoping that maybe the zoning would CONFUSE THE GOBLIN and get rid of the glitches somehow.

'''Jeeptrash:'''Well after trying different solutions basically all day it looks like the best stopgap is:

1. try tweaking the lightmap resolution on the affected surface (try both higher and lower res, I had one glitch that went away when i raised it and a diff one went away when i lowered it)

2. If you can, cover the glitches with static mesh &quot;trim&quot; and leave'em.

3. for the rest that dont go away after #1, or arent hidden by #2, build a simple bsp shape (square or tri-prism) and place it in solid space about 16uu from the bad corner. Subtract it and move it up and down until it &quot;shades&quot; the glowing corner from the sunlight. Since it has no connection to the real map it will be off in its own zone and shouldnt ever really be visible to the renderer.

Will try the portals and antiportals next... 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JeffMOD</title>
    <id>1567</id>
    <revision>
      <id>3898</id>
      <timestamp>2008-03-03T18:08:11Z</timestamp>
      <contributor>
        <ip>JeffMOD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">---Who'sit?&amp;rarr;

JeffMOD. That's me. by all means, I'm what most people would call a n00b... I've only been using UED for a year or so, but I'm working on a cool AS level. it currently has a TV screen with a Scripted Texture, a few BSP (I know, but don't yell at me, I have no modeling software and only Dial-up.) Static meshes. And that's just the stuff '''I''' made... from scratch. It's pretty cool so far, considering I have a low skill level. '''THANK U UNREALWIKI!''' Updates whenever.

&amp;rarr;Help!&amp;rarr;

If you know how to make players in 1st person view show on a scripted texture (eg, a TV or Football style bigscreen) please tell me! It only works in 3rd person for me!

I Thank you for your time and effort in advance. it is appeceated.

&amp;rarr;(UN)Known for:&amp;rarr;

Putting Unessisary capitals on Sentences,

Bad spelling,

An Indubitibley advanced Vocabulary,

and love of all things Half-life.

I also do my own voices in my levels with Soundforge 9.0. you almost can't tell it's a 13-year old saying them!

&amp;rarr;Comments&amp;rarr;</text>
    </revision>
    <revision>
      <id>3899</id>
      <timestamp>2008-03-03T16:41:57Z</timestamp>
      <contributor>
        <ip>JeffMOD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">---Who'sit?&amp;rarr;

JeffMOD. That's me. by all means, I'm what most people would call a n00b... I've only been using UED for a year or so, but I'm working on a cool AS level. it currently has a TV screen with a Scripted Texture, a few BSP (I know, but don't yell at me, I have no modeling software and only Dial-up.) Static meshes. And that's just the stuff '''I''' made... from scratch. It's pretty cool so far, considering I have a low skill level. '''THANK U UNREALWIKI!''' Updates whenever.

&amp;rarr;(UN)Known for:&amp;rarr;

Putting Unessisary capitals on Sentences,

Bad spelling,

An Indubitibley advanced Vocabulary,

and love of all things Half-life.

I also do my own voices in my levels with Soundforge 9.0. you almost can't tell it's a 13-year old saying them!

&amp;rarr;Comments&amp;rarr;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jerome-X</title>
    <id>1545</id>
    <revision>
      <id>3848</id>
      <timestamp>2003-04-29T21:40:57Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Infos ==

I'm a software developer and currently working on [[Legacy:UCEditor|UCEditor]].&lt;br /&gt;Hopefully I'll be able to contribute something to this wiki :)

===Contact ===

email: jerome-x (at) users (dot) sourceforge (dot) net

(sorry for the funny expression above. I'm just sick of nasty spammers)

icq: 50501471 (CET evenings. Sometimes. Rarely.)

==Comments ==

'''Wormbo:''' Welcome to the UnrealWiki. :) If you want you can add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''EntropicLqd:''' Hi, welcome to the wiki.  Enjoy your stay :)

'''Tarquin:''' Hello and welcome :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3849</id>
      <timestamp>2003-04-29T21:21:39Z</timestamp>
      <contributor>
        <ip>Jerome-X</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Infos ==

I'm a software developer and currently working on [[Legacy:UCEditor|UCEditor]].&lt;br /&gt;Hopefully I'll be able to contribute something to this wiki :)

===Contact ===

email: jerome-x (at) users (dot) sourceforge (dot) net

(sorry for the funny expression above. I'm just sick of nasty spammers)

icq: 50501471 (CET evenings. Sometimes. Rarely.)

==Comments ==

'''Wormbo:''' Welcome to the UnrealWiki. :) If you want you can add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''EntropicLqd:''' Hi, welcome to the wiki.  Enjoy your stay :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jerome-X/Developer Journal</title>
    <id>1551</id>
    <revision>
      <id>3862</id>
      <timestamp>2003-11-05T19:02:31Z</timestamp>
      <contributor>
        <ip>Solid Snake</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==UCEditor - The early stages (Part 1)==

===Inception (added 30.04.03)===

Don't worry with the terminology... I just didn't find a better term for this :)

I started [[Legacy:UCEditor|UCEditor]] mainly for two reasons: The lack of really good tools for UT, although there are one or two nice ones out there. But nothing really modular, scalable, open source and free. The second reason is that I simply want to get a grip on developing for [[Legacy:Eclipse|eclipse]], as I'm using eclipse at work :)

===Elaboration (added 30.04.03)===

This part was mainly to create a prototype that shows the capabilities of eclipse but also to find out what's needed to continue developing a solid, well designed and usable IDE for UT.

The prototype has been [http://sourceforge.net/project/showfiles.php?group_id=79274&amp;release_id=1555 released] and the situation is now as following:

The basic behaviour of the plugin (setting up a project, editing, launching/debugging, settings/preferences) are easy to set up and eclipse offers a lot of classes which can be used easily to get something up and runnin very quickly.

However everything that needs language specific stuff is a bit more difficult. The main issues here is that everything in eclipse that's not language-independend must be reimplemented. E.g. a content outline, code assist, hierarchical view etc. To fill these elements with life there need to be a parser that extracts all information from the UC class

files and creates objects with this information. These classes must be well designed.

The Java framework for eclipse has been developed as a separate feature which is a set of plugins. The so called JDT. Therefore we needs something like this as well. I decided to take the same approach as the JDT, but to prevent working on that for several years, this needs to be a lot slimmer. Fortunately UC is a bit simpler than Java, but also has some peculiarities, like states or properties, but no imports or classpaths, or no interfaces.

So the first steps will be to define a framework consisting of interfaces relating to a UC project structure. Elements in this domain must defined. This can be an interesting task.

That's it for now, once the design for the core framework is ready, I'll post some diagrams here :)

'''Solid Snake:''' Hey Jerome-X long time no see! How you been?

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3863</id>
      <timestamp>2003-08-05T09:49:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">==UCEditor - The early stages (Part 1)==

===Inception (added 30.04.03)===

Don't worry with the terminology... I just didn't find a better term for this :)

I started [[Legacy:UCEditor|UCEditor]] mainly for two reasons: The lack of really good tools for UT, although there are one or two nice ones out there. But nothing really modular, scalable, open source and free. The second reason is that I simply want to get a grip on developing for [[Legacy:Eclipse|eclipse]], as I'm using eclipse at work :)

===Elaboration (added 30.04.03)===

This part was mainly to create a prototype that shows the capabilities of eclipse but also to find out what's needed to continue developing a solid, well designed and usable IDE for UT.

The prototype has been [http://sourceforge.net/project/showfiles.php?group_id=79274&amp;release_id=1555 released] and the situation is now as following:

The basic behaviour of the plugin (setting up a project, editing, launching/debugging, settings/preferences) are easy to set up and eclipse offers a lot of classes which can be used easily to get something up and runnin very quickly.

However everything that needs language specific stuff is a bit more difficult. The main issues here is that everything in eclipse that's not language-independend must be reimplemented. E.g. a content outline, code assist, hierarchical view etc. To fill these elements with life there need to be a parser that extracts all information from the UC class

files and creates objects with this information. These classes must be well designed.

The Java framework for eclipse has been developed as a separate feature which is a set of plugins. The so called JDT. Therefore we needs something like this as well. I decided to take the same approach as the JDT, but to prevent working on that for several years, this needs to be a lot slimmer. Fortunately UC is a bit simpler than Java, but also has some peculiarities, like states or properties, but no imports or classpaths, or no interfaces.

So the first steps will be to define a framework consisting of interfaces relating to a UC project structure. Elements in this domain must defined. This can be an interesting task.

That's it for now, once the design for the core framework is ready, I'll post some diagrams here :)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jesco</title>
    <id>1535</id>
    <revision>
      <id>3826</id>
      <timestamp>2003-04-04T20:24:35Z</timestamp>
      <contributor>
        <ip>Jesco</ip>
      </contributor>
      <comment>blah</comment>
      <text xml:space="preserve">'''Jesco''', and yes, that's my real name. I don't really like this nick-name thingie. It may be ok for other people, but I happen to like my name! I'm Jesco, I was it when I was born and will it be 'til the day I die.

==Real Bio ==

Born in Hamburg/Germany in the year 1981 and continued to live there until summer 2001, when I suddenly decided to become a lawyer. Shortly after that decision I moved to Bonn/Germany and attented university there. Something I started regretting soon, not the move itself, but the law-studies. In early 2002 I moved back to Hamburg and switched my studies to physics and business administration; a somewhat strange, but interesting combination, for it keeps my mind busy on a very broad range, which I like!

As for hobbies, there's the usual stuff like movies, computers and the occasional party. But I also happen to read (and actually like) poems by Edgar Allan Poe, to build small models of ships (not computer models, real ones). 

I should also note that I come from a woman-only family, which ruins you for life in some aspects (as tarquin will agree) ;)

==Technical Bio ==

For some reasons, my genom doesn't contain any arts-related parts, or at least no good ones. I just can't make my hand do/draw the things I have in mind. It doesn't work, it will never work and it sucks. But that's life.

Due to this enorm lack of artistic talent, I was forced to concentrate more on technical issues, mostly programming. For the curious, I entertained myself using the following languages:
* Delphi/ObjectPascal
* C/C++
* HTML/CSS
* PHP/SQL
* ASP

That said, my knowledge of these tools differ greatly. While I happen to like PHP, I never really got friendly with ASP. C/C++ is also much less liked by me than ObjectPascal. At the moment, I'm mostly doing web/database-coding in PHP/SQL.

Despite my artistic inaptness, I did try my hand at modelling computer-models. I managed to do a few weapons and spaceships, but they never reached a quality I could really be satisfied with.

==Unreal Bio ==

Past Projects:
* Several ugly maps (Sept. 1999 - July 2000): http://nalicity.beyondunreal.com (DM-Obitus, I forgot the other names, they sucked anyways)
* UTX-Viewer (Sept. 2000 - April 2002): http://utx-viewer.sourceforge.net
* BeyondUnreal BonusPack (Oct. 2001 - Jan. 2002): http://cogworks.beyondunreal.com
* Technical Administrator for Modsquad (June 2002 - March 2003): http://modsquad.beyondunreal.com

Current Work:
* Nothing in particular. I'm doing the odd model (err, this should read: I try to do...), throw out this or that piece of code and try to chill a bit...

==Comments/Discussion ==

'''Tarquin''': hi Jesco, welcome to the Wiki :-)

'''Jesco''': Whoops, this thing is like a packet of chocolate... there's always something new to discover :o Nah, anyways, my first contribution was some kind of shameless self-pimpage... :D
:'''Tarquin''': hey that's cool. (if you can't pimp yourself, who can you pimp? ;) )

::'''Jesco''':: Interesting way to see it ;)

'''TechnoJF''': It's good to have you here, Jesco.  I altered the Project Contributors page so that your page shows up there.  Nothing much more to add, just thought you should know.
:'''Jesco''': Whohow, what did I say about chocolate... ;)&lt;br /&gt;
:'''OshadO''': what's all this I keep hearing about chocolate??:D
:'''Jesco''': Don't you like chocolate? How dare... ;-)
::'''Tarquin''': don't mind me, just fixing the markup :-) whitespace at the start of a line makes text look like the CODE tag. Indent with a : 
::'''OshadO''': who me?  I love chocolate.  That's why I asked.  Now hand it over or I'll delete this entire page.  BUHUAAA HUAAAA.

'''EntropicLqd:''' That's a great bio you've put together.  Berlin rocks - I went out there just before the wall came down (missed the actual event by a couple of months).  Was fantastic.  Didn't make any of the ''great outdoors'' unfortunately.
:'''Jesco''': I didn't like Berlin. Too many building places for my taste. Granted, these will go by, and I'm sure to have a look at the city then again :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3827</id>
      <timestamp>2002-11-23T01:11:50Z</timestamp>
      <contributor>
        <ip>Jesco</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Jesco''', and yes, that's my real name. I don't really like this nick-name thingie. It may be ok for other people, but I happen to like my name! I'm Jesco, I was it when I was born and will it be 'til the day I die.

==Real Bio ==

Born in Hamburg/Germany in the year 1981 and continued to live there until summer 2001, when I suddenly decided to become a lawyer. Shortly after that decision I moved to Bonn/Germany and attented university there. Something I started regretting soon, not the move itself, but the law-studies. In early 2002 I moved back to Hamburg and switched my studies to physics and business administration; a somewhat strange, but interesting combination, for it keeps my mind busy on a very broad range, which I like!

As for hobbies, there's the usual stuff like movies, computers and the occasional party. But I also happen to read (and actually like) poems by Edgar Allan Poe, to build small models of ships (not computer models, real ones). 

I should also note that I come from a woman-only family, which ruins you for life in some aspects (as tarquin will agree) ;)

==Technical Bio ==

For some reasons, my genom doesn't contain any arts-related parts, or at least no good ones. I just can't make my hand do/draw the things I have in mind. It doesn't work, it will never work and it sucks. But that's life.

Due to this enorm lack of artistic talent, I was forced to concentrate more on technical issues, mostly programming. For the curious, I entertained myself using the following languages:
* Delphi/ObjectPascal
* C/C++
* HTML/CSS
* PHP/SQL
* ASP

That said, my knowledge of these tools differ greatly. While I happen to like PHP, I never really got friendly with ASP. C/C++ is also much less liked by me than ObjectPascal. At the moment, I'm mostly doing web/database-coding in PHP/SQL.

Despite my artistic inaptness, I did try my hand at modelling computer-models. I managed to do a few weapons and spaceships, but they never reached a quality I could really be satisfied with.

==Unreal Bio ==

Past Projects:
* Several ugly maps (Sept. 1999 - July 2000): http://nalicity.beyondunreal.com (DM-Obitus, I forgot the other names, they sucked anyways)
* UTX-Viewer (Sept. 2000 - April 2002): http://utx-viewer.sourceforge.net
* BeyondUnreal BonusPack (Oct. 2001 - Jan. 2002): http://cogworks.beyondunreal.com

Current Work:
* Technical Administrator for Modsquad: http://www.planetunreal.com/modsquad and/or http://modsquad.beyondunreal.com

==Comments/Discussion ==

'''Tarquin''': hi Jesco, welcome to the Wiki :-)

'''Jesco''': Whoops, this thing is like a packet of chocolate... there's always something new to discover :o Nah, anyways, my first contribution was some kind of shameless self-pimpage... :D
:'''Tarquin''': hey that's cool. (if you can't pimp yourself, who can you pimp? ;) )

::'''Jesco''':: Interesting way to see it ;)

'''TechnoJF''': It's good to have you here, Jesco.  I altered the Project Contributors page so that your page shows up there.  Nothing much more to add, just thought you should know.
:'''Jesco''': Whohow, what did I say about chocolate... ;)&lt;br /&gt;
:'''OshadO''': what's all this I keep hearing about chocolate??:D
:'''Jesco''': Don't you like chocolate? How dare... ;-)
::'''Tarquin''': don't mind me, just fixing the markup :-) whitespace at the start of a line makes text look like the CODE tag. Indent with a : 
::'''OshadO''': who me?  I love chocolate.  That's why I asked.  Now hand it over or I'll delete this entire page.  BUHUAAA HUAAAA.

'''EntropicLqd:''' That's a great bio you've put together.  Berlin rocks - I went out there just before the wall came down (missed the actual event by a couple of months).  Was fantastic.  Didn't make any of the ''great outdoors'' unfortunately.
:'''Jesco''': I didn't like Berlin. Too many building places for my taste. Granted, these will go by, and I'm sure to have a look at the city then again :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jimboh</title>
    <id>1562</id>
    <revision>
      <id>3887</id>
      <timestamp>2006-03-01T01:59:17Z</timestamp>
      <contributor>
        <ip>Jimboh</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hmm...thanks for the warm welcome :)!

===About Me===

My name is James. I got started in the UT mod scene since mid 2003.

Back then I was working on a RTS total conversion project called Global Domination for UT 2003. Unfortunately, due to lack of time (and later, interest) this project was scrapped in early '04. If anyone is interested on how I did my mouse/overhead code, I'd be more than glad to share it, but most of my code is largely uncommented, so I probably won't be making a tutorial on this. After a hiatus of about a year (where I had to deal with college apps, and RL&amp;trade;) I've regained interest in modding and I'm currently working on implementing my [[Legacy:Jimboh/MMO_Idea|SyMMO Framework]] for UT2004.

===Contributions===
* [[Legacy:CRC32|CRC32]] - Improved code.
* [[Legacy:SHA1Hash|SHA1Hash]] - More improved code.
* [[Legacy:Jimboh/MMO_Idea|SyMMO Framework]] - My MMO idea
* Various comments - search &quot;Jimboh&quot;

==Guest Book==

'''EntropicLqd:''' Welcome.  We all start somewhere.  At least you don't have to worry about getting worse yet :)

'''SuperApe:''' Welcome, Jimboh. :)

'''Tarquin:''' Hi, welcome to Unreal Wiki :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3888</id>
      <timestamp>2006-01-31T07:29:51Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Just another noobie unrealscript coder :)

==Guest Book==

'''EntropicLqd:''' Welcome.  We all start somewhere.  At least you don't have to worry about getting worse yet :)

'''SuperApe:''' Welcome, Jimboh. :)

'''Tarquin:''' Hi, welcome to Unreal Wiki :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3889</id>
      <timestamp>2006-02-09T00:48:51Z</timestamp>
      <contributor>
        <ip>Jimboh</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hmm...thanks for the warm welcome :)!

===About Me===

My name is James. I got started in the UT mod scene since mid 2003.

Back then I was working on a RTS total conversion project called Global Domination for UT 2003. Unfortunately, due to lack of time (and later, interest) this project was scrapped in early '04. If anyone is interested on how I did my mouse/overhead code, I'd be more than glad to share it, but most of my code is largely uncommented, so I probably won't be making a tutorial on this. After a hiatus of about a year (where I had to deal with college apps, and RL&amp;trade;) I've regained interest in modding and I'm currently working on implementing my [[Legacy:Jimboh/MMO_Idea|SyMMO Framework]] for UT2004.

===Contributions===
* [[Legacy:CRC32|CRC32]] - Improved code.

==Guest Book==

'''EntropicLqd:''' Welcome.  We all start somewhere.  At least you don't have to worry about getting worse yet :)

'''SuperApe:''' Welcome, Jimboh. :)

'''Tarquin:''' Hi, welcome to Unreal Wiki :)
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jimboh/MMO Idea</title>
    <id>1563</id>
    <revision>
      <id>3890</id>
      <timestamp>2006-02-09T01:14:51Z</timestamp>
      <contributor>
        <ip>Jimboh</ip>
      </contributor>
      <comment>*New SyMMO framework</comment>
      <text xml:space="preserve">So, an MMO is short for Massively Multiplayer Online. As the name suggests, such a game would involve hundreds (perhaps thousands) of players in the same world. It also involves persistence of items and players. So players keep their items/skills even after they've logged off the game.

Due to UT200x's player cap of about 32 (or mabye 64) players, it is obvious that true MMO's are not possible. Therefore, I've devised a system to go around this limitation of the UT engine. The player can choose to &quot;teleport&quot; into a &quot;world&quot; (which is a server). Each world would therefore also have exits which then connects the players to other &quot;worlds&quot;. Persistence is actually saved on the client. Manual profile modification is prevented by an encrypted hash mechanism.

===SyMMO Framework===

Overview:

[[Image:Legacy_symmo_framework.png|]]

====Login====
: '''1)''' The client queries the encryption server for a list of &quot;trusted&quot; servers. This is handled through HTTP protocol, wherein the coordinates transmitted is in XML format.
: '''2)''' Client attempts to connect to the world server. The encrypted header is received through the Options parameter of GameInfo.PreLogin() event.
: '''3/4)''' The header is then sent through an HTTP request to the encryption server for decryption. The resulting XML page contains all the decrypted fields. If encryption server does not respond after 2 more requests, player is prompted to create a new profile.

====Saving====
: '''5/6)''' When the player chooses to save game, the world server first recalculates the SHA-1 hashcode for the new profile. It then sends an HTTP request to the encryption server to encrypt a new header. The resulting binary file is the result page. If encryption server does not respond after 2 more tries, the world server prompts the client to &quot;try again at a later time (Sucks for you)&quot;.
: '''7)''' Header is now saved on the client along with profile information (assuming that player profile is always synchronized with that of the world server's). Old profile data is overridden.

----

===Progress===

====2/08/2006====
: Scrapped proprietary network messaging protocol. SyMMO will be built ontop of El_Murte's LibHTTP library. Starting work on SHA-1 hasher.

====2/04/2006====
: Finished rudimentary network messaging protocol. Basically sits ontop of TCP and makes sure the data isn't corrupt.

====1/31/2006====
: Started work on initial logging in with master server. Acquired a small MySQL server to play with. Current Master server implementation still deciding (ie. PHP/ASP/Perl-CGI/Java). ''discuss?''

----

===Discussion===

''Comments? Ideas? Opinions?''

'''MythOpus:''' Have you managed to get proper profile data from the slave servers?  I have a concept much like the MMO ones however mine won't be exactly an MMO.

'''Sweavo:''' the master server is going to be pretty busy if it's needed every time any player anywhere moves server.  Might it be better to have a more peer-based approach where the server the player is joining contacts the server the player is leaving for the player data?  Servers would only accept player data from trusted peers.  The master server would contain the list of trusted servers, and maybe it would store the player data when the player quit (rather than moving from one server to next).  Also, if the master server stored the id of the server that was quit, you could force the player to rejoin the same server on re-connection.

'''Jimboh:''' Thanks Sweavo, thats a really good idea. I'll look into it :) @MythOpus, no, I'm still working out on the protocol to use between the servers (since theres the issue of security and whatnot).</text>
    </revision>
    <revision>
      <id>3891</id>
      <timestamp>2006-02-01T14:11:09Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>thoughts</comment>
      <text xml:space="preserve">So, an MMO is short for Massively Multiplayer Online. As the name suggests, such a game would involve hundreds (perhaps thousands) of players in the same world. It also involves persistence of items and players. So players keep their items/skills even after they've logged off the game.

Due to UT200x's player cap of about 32 (or mabye 64) players, it is obvious that true MMO's are not possible. Therefore, I've devised a system to go around this limitation of the UT engine. In my system, each player will first log onto a &quot;master server&quot; which keeps track of all player profiles. After which, the player can choose to &quot;teleport&quot; onto an &quot;area&quot; (which is a server). Each area would therefore also have exits which then connects the players to other &quot;areas&quot; of the world. In jumping from server to server the player profiles are queried from the master server by the individual &quot;area&quot; servers, thus retaining player persistence.

'''Note:''' This idea certainly isn't new. If you search &quot;MMO&quot; on the BuF, there are around 5-7 topics discussing such an implementation. My aim is trying to bring this idea into reality with a simple test case first.

===Somewhat Technical Mumbo-Jumbo===

Just a picture:

@inline@conf

===Progress===

====1/31/2006====
: Started work on initial logging in with master server. Acquired a small MySQL server to play with. Current Master server implementation still deciding (ie. PHP/ASP/Perl-CGI/Java). ''discuss?''

==Discussion==

''Comments? Ideas? Opinions?''

'''MythOpus:''' Have you managed to get proper profile data from the slave servers?  I have a concept much like the MMO ones however mine won't be exactly an MMO.

'''Sweavo:''' the master server is going to be pretty busy if it's needed every time any player anywhere moves server.  Might it be better to have a more peer-based approach where the server the player is joining contacts the server the player is leaving for the player data?  Servers would only accept player data from trusted peers.  The master server would contain the list of trusted servers, and maybe it would store the player data when the player quit (rather than moving from one server to next).  Also, if the master server stored the id of the server that was quit, you could force the player to rejoin the same server on re-connection.</text>
    </revision>
    <revision>
      <id>3892</id>
      <timestamp>2006-02-09T01:10:35Z</timestamp>
      <contributor>
        <ip>Jimboh</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">So, an MMO is short for Massively Multiplayer Online. As the name suggests, such a game would involve hundreds (perhaps thousands) of players in the same world. It also involves persistence of items and players. So players keep their items/skills even after they've logged off the game.

Due to UT200x's player cap of about 32 (or mabye 64) players, it is obvious that true MMO's are not possible. Therefore, I've devised a system to go around this limitation of the UT engine. The player can choose to &quot;teleport&quot; into a &quot;world&quot; (which is a server). Each world would therefore also have exits which then connects the players to other &quot;worlds&quot;. Persistence is actually saved on the client. Manual profile modification is prevented by an encrypted hash mechanism.

===Somewhat Technical Mumbo-Jumbo===

Overview:

[[Image:Legacy_symmo_framework.png|]]

====Login====
: '''1)''' The client queries the encryption server for a list of &quot;trusted&quot; servers. This is handled through HTTP protocol, wherein the coordinates transmitted is in XML format.
: '''2)''' Client attempts to connect to the world server. The encrypted header is received through the Options parameter of GameInfo.PreLogin() event.
: '''3/4)''' The header is then sent through an HTTP request to the encryption server for decryption. The resulting XML page contains all the decrypted fields. If encryption server does not respond after 2 more requests, player is prompted to create a new profile.

====Saving====
: '''5/6)''' When the player chooses to save game, the world server first recalculates the SHA-1 hashcode for the new profile. It then sends an HTTP request to the encryption server to encrypt a new header. The resulting binary file is the result page. If encryption server does not respond after 2 more tries, the world server prompts the client to &quot;try again at a later time (Sucks for you)&quot;.
: '''7)''' Header is now saved on the client along with profile information (assuming that player profile is always synchronized with that of the world server's). Old profile data is overridden.

----

===Progress===

====2/04/2006====
: Finished rudimentary network messaging protocol. Basically sits ontop of TCP and makes sure the data isn't corrupt.

====1/31/2006====
: Started work on initial logging in with master server. Acquired a small MySQL server to play with. Current Master server implementation still deciding (ie. PHP/ASP/Perl-CGI/Java). ''discuss?''

----

===Discussion===

''Comments? Ideas? Opinions?''

'''MythOpus:''' Have you managed to get proper profile data from the slave servers?  I have a concept much like the MMO ones however mine won't be exactly an MMO.

'''Sweavo:''' the master server is going to be pretty busy if it's needed every time any player anywhere moves server.  Might it be better to have a more peer-based approach where the server the player is joining contacts the server the player is leaving for the player data?  Servers would only accept player data from trusted peers.  The master server would contain the list of trusted servers, and maybe it would store the player data when the player quit (rather than moving from one server to next).  Also, if the master server stored the id of the server that was quit, you could force the player to rejoin the same server on re-connection.

'''Jimboh:''' Thanks Sweavo, thats a really good idea. I'll look into it :) @MythOpus, no, I'm still working out on the protocol to use between the servers (since theres the issue of security and whatnot).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JoeDark</title>
    <id>1540</id>
    <revision>
      <id>3837</id>
      <timestamp>2003-08-08T03:22:06Z</timestamp>
      <contributor>
        <ip>JoeDark</ip>
      </contributor>
      <comment>Updated my current project info</comment>
      <text xml:space="preserve">===Me, Me, Me! ===

Greets, my name is Matthew Shanker.  In the past I've worked on a few mods, most notably, I was the lead programmer for the Wheel of Time mod Shadowed Destiny.

===Current Projects ===

I'm excited about our new project so I decided I should post it here. Anyway, we have a website so I really don't have to say much here.

http://www.plasmaworks.com/vt/

===Discussion ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3838</id>
      <timestamp>2003-06-26T18:03:56Z</timestamp>
      <contributor>
        <ip>Haral</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Me, Me, Me! ===

Greets, my name is Matthew Shanker.  In the past I've worked on a few mods, most notably, I was the lead programmer for the Wheel of Time mod Shadowed Destiny.

===Current Projects ===

Designing our new mod... more info to come.

Here's a link to the ramblings in my [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]].

===Discussion ===

'''Haral:''' Hey Joe, how ya been?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3839</id>
      <timestamp>2003-07-08T21:02:59Z</timestamp>
      <contributor>
        <ip>JoeDark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Me, Me, Me! ===

Greets, my name is Matthew Shanker.  In the past I've worked on a few mods, most notably, I was the lead programmer for the Wheel of Time mod Shadowed Destiny.

===Current Projects ===

Designing our new mod... more info to come.

Here's a link to the ramblings in my [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]].

===Discussion ===

'''Haral:''' Hey Joe, how ya been?

'''JoeDark:''' Hey, how the hell have you been?? What have you been up to in the year since I've heard from you.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JoeDark/Developer Journal</title>
    <id>1550</id>
    <revision>
      <id>3860</id>
      <timestamp>2003-08-02T07:57:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Day 165 of 2003==

So I'm digging around the bot spawning code in the game types and it's pretty obfuscated. It seems to me that in name of &quot;proper object-oriented design&quot; that the code for UT2k3 is much for obscure and indirect than the UT stuff. Makes sifting through it a little more tedious. Don't get me wrong, they've cleaned up a lot of stuff, but I wonder if they haven't overcomplicated some things.

Anyway, so I was digging through the bot spawning code and noticed a little something that many of you have probably already seen. If you create a game and use the name CliffyB then all the bots that spawn will be named after the guys in Epic. And apparently The_Reaper bot gets set to bad ass. Not that interesting, but novel.

[[Image:Legacy_EpicNames.jpeg|]]

----

'''Mychaeel:''' I'd like to move that to [[Legacy:Developer Journals/JoeDark|Developer Journals/JoeDark]] if you don't mind.

'''Tarquin:''' This might be a good time to start switching over page names, as discussed on the DevJour page

'''Mychaeel:''' Your call.  I'm fine with either.  For the sake of consistency the existing developer journals should be moved to &quot;Author/Developer Journal&quot; though and a redirect from the original page should be established to that new page.

'''JoeDark:''' Indeed, I saw Tarquin's remark in the Journal page and decided to make it here. Though I don't honestly care if you want it moved somewhere else. Let me know what you guys decide.

'''Nytro:''' I suggest a &quot;Category Developer Journal&quot;.

'''Tarquin:''' Done

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3861</id>
      <timestamp>2003-08-02T05:20:44Z</timestamp>
      <contributor>
        <ip>Nytro</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Day 165 of 2003==

So I'm digging around the bot spawning code in the game types and it's pretty obfuscated. It seems to me that in name of &quot;proper object-oriented design&quot; that the code for UT2k3 is much for obscure and indirect than the UT stuff. Makes sifting through it a little more tedious. Don't get me wrong, they've cleaned up a lot of stuff, but I wonder if they haven't overcomplicated some things.

Anyway, so I was digging through the bot spawning code and noticed a little something that many of you have probably already seen. If you create a game and use the name CliffyB then all the bots that spawn will be named after the guys in Epic. And apparently The_Reaper bot gets set to bad ass. Not that interesting, but novel.

[[Image:Legacy_EpicNames.jpeg|]]

----

'''Mychaeel:''' I'd like to move that to [[Legacy:Developer Journals/JoeDark|Developer Journals/JoeDark]] if you don't mind.

'''Tarquin:''' This might be a good time to start switching over page names, as discussed on the DevJour page

'''Mychaeel:''' Your call.  I'm fine with either.  For the sake of consistency the existing developer journals should be moved to &quot;Author/Developer Journal&quot; though and a redirect from the original page should be established to that new page.

'''JoeDark:''' Indeed, I saw Tarquin's remark in the Journal page and decided to make it here. Though I don't honestly care if you want it moved somewhere else. Let me know what you guys decide.

'''Nytro:''' I suggest a [[:Category:Legacy Developer Journal]].
[[Category:Legacy Developer Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Joefish</title>
    <id>1560</id>
    <revision>
      <id>3882</id>
      <timestamp>2005-09-20T22:35:42Z</timestamp>
      <contributor>
        <ip>Joefish</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

Also known as Joe, but that username tends to be taken.

I am working on a simple level as a way of learning the Unreal tools ... it has turned into a simple mod because of a few things I wanted to try ... the wiki has quickly become my #1 resource and I'm grateful for it. I'm new to OOP and when I FINALLY figured out how to downcast an object reference ([[Legacy:Typecasting|Typecasting]]) I just about fell off my chair.

==Bobodinga 'MiniMod'==

Woohoo!  I finally finished the $%@*&amp; thing!  A single-player, 3rd-person, mini (1-level) mod.  Simple and quiet.  Run, jump, and solve a puzzle.

I would be grateful to anyone who takes the time to give it a spin.  Any feedback appreciated - here or email me at jp-at-groovetronix.com.

===Download Bobodinga from here: http://www.groovetronix.com/jp/bobo.===

'''update 6.27.05''' - OK I figured out how to (mostly) fix my static mesh lighting.  Culled some unnecessary edges and learned about Maya smoothing.  I fixed the seams between my wall sections by making the edge of each wall module perfectly mirror-symmetrical with its neighbor.  It's not enough to just line up verts!  There are still some minor glitches but it looks a lot cleaner.

'''update 9.20.05''' - looks like I have got a (paying) job (hooray!), so I'm afraid it will be quite some time before I bust out the sequel. Eventually, for sure.

[[Image:Legacy_joefish_bobo_plaza.jpeg|]] @inline@joefish_bobo_cutscene @inline@joefish_bobo_view

==Comments==

'''Tarquin:''' Hi. Welcome to the unreal wiki. :)

'''EntropicLqd:'''  Hello and welcome.  I'm glad you find the Wiki useful.

'''Joefish:'''  Thanks. :)

'''Graphik:''' I'm downloading now. :)

'''Graphik:''' Played a bit and got stuck down at off of the main platform near the edge. I'll try it again.

'''Joefish:''' Dang, up where the key / map sign is?  In terrain or just against the wall?  I'll fix it if I can find it.

'''Graphik:''' I played it through and found it rather enjoyable. The theme was bright and musical, and the puzzle wasn't easy nor was it so difficult that I felt like chucking my computer out of the window. Of course, it wasn't perfect. That's a given for a mod or anything else in life. And since you did say you'd like some constructive criticism, here's a mini-review:

'''The game was fun'''. I haven't enjoyed a good puzzle game since ZZT, but this one held my attention rather well.

'''Graphically, the mod was refreshingly and pleasantly themed''' but had some '''technical difficulties.''' The stairways and light-colored platforms were not shaded smoothly, and are probably in need of some polygonal tweaking. I'm not much of an expert in this area either, so I'm afraid I can't help you actually fix this. The sea surrounding the island appears to be having some difficulties as well. But I'm sure you already knew of these minor flaws.

The cutscenes were very cool and were definately highlights of the mod.

The game only '''one bug''' that I could decern: It is possible to get down to the bottommost level of the island prematurely by jumping. The problem with this is that at that point I had not unlocked the ability to use middle-mouse, so '''I was stuck and had to restart the level'''.

Also, a suggestion: ambient sounds! These would improve the atmosphere a lot.

All of these are relatively minor problems. The mod as a whole was '''enjoyable and worth downloading'''.

'''Joefish:''' Thanks Graphik.  Great points.  I need to figure out static mesh shading.  And I'll fix that bug.  Very glad you enjoyed it.

'''Graphik:''' I played through it again (takes 16x less time to complete when you know what to do :)) and noticed that it ''does'' have ambient sounds, I just had to turn my speakers up louder to hear it.

'''Foxpaw:''' I noticed a slight graphical glitch, on at least one of the blue domes, if you are up on the white ridge around the dome, and move the camera so you are looking down, you can see between the wall and the dome.

As far as the static mesh shading goes, there isn't much you can do about it. It's an artifact of the way that the lighting is done by your video card. This could be rectified by uploading it to the video card differently (with conjoined meshes being treated as one) but the Unreal Engine does not do this. One possible fix would be to make the walls unlit and use shadow projectors to give shading. This would degrade performance somewhat, however.

There's also a place where you can get &quot;crushed&quot; between two of the moving grey blocks, resulting in you getting &quot;teleported&quot; to the side of one of the blocks. I don't mean in the parts with the ones that come together, these two move perpindicular to each other.

I'm not sure if it's intentional, but if you left click twice quickly, the three small domes remain unchanged, but the large dome changes state. I didn't pay that much attention to the initial state of the domes so I don't know if that was required to solve the puzzle or not.

Also I don't really understand how the &quot;key&quot; thing worked. I couldn't get it to work, but then it just kind of happened accidentally. I won't list what I tried because I don't want to spoil the puzzle for anyone.

Err, thought I'd elaborate on what I said about the shading above - basically, the models are shaded according to light sources and the normals of the vertices. So, in order words, a vertex that's facing &quot;away&quot; from a light source is assumed to be on the far side of the object, and should not be lit by that light. This is how parts of one mesh &quot;block&quot; the light from being cast onto other parts of the mesh.

When you have two separate meshes, this does not occur. The side facing the light, which is in reality blocked from the light by another wall section, still gets lit because it would be far too much of a load on the video card to check to see if other meshes were blocking a light.

Actually, while writing that, I had an idea. Try making wall sections that don't have ends on them. IE, the two long flat sides should be connected at the top, but should be &quot;open&quot; at the ends. Then you wouldn't have those vertices getting lit despite being blocked, and it wouldn't be interpolating onto visible areas of the mesh. Of course, you would then have to create separate &quot;end pieces&quot; for your walls.

'''Joefish:''' Thanks for the feedback Foxpaw.  Sorry the puzzle worked by accident :/. The way the domes state-change is intentional, but probably needs more pointing-out within the level, so it doesn’t confuse.

The grey block crush / teleport-out is intentional – in fact it was a royal pain to set up! I made the movers 'ignore when encroach' to get them to push you around, but then you would get stuck inside them when they 'crush' you.  The teleport-out is my inelegant solution.

Sounds like I may be out of luck on mesh lighting.  I guess if I combined large parts of the walls / stairs into single meshes, that would fix lighting, at the cost of way more unique static mesh polys.  Something to experiment with anyway.  Re. your idea, in fact the wall sections already are &quot;open&quot; at the ends, with separate end pieces.  I think I experimented with closed / open walls and they looked pretty similar.

Graphik - glad you found the ambient sfx :), I should turn those up.

'''Joefish:'''  Graphik - I've been hunting like crazy for the spot where you can jump to that bottom area but I just can't find it - can you tell me approx where you jumped from?

'''Graphik:''' I just jumped the gate. You have to get a running start and jump at the right time.

'''Joefish:''' Got it, thanks G.  Fixed that and one other nasty stuck-inside-mesh bug I ran across.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3883</id>
      <timestamp>2005-06-17T15:51:23Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me==

Also known as Joe, but that username tends to be taken.

I am working on a simple level as a way of learning the Unreal tools ... it has turned into a simple mod because of a few things I wanted to try ... the wiki has quickly become my #1 resource and I'm grateful for it. I'm new to OOP and when I FINALLY figured out how to downcast an object reference ([[Legacy:Typecasting|Typecasting]]) I just about fell off my chair.

==Bobodinga 'MiniMod'==

Woohoo!  I finally finished the $%@*&amp; thing!  A single-player, 3rd-person, mini (1-level) mod.  Simple and quiet.  Run, jump, and solve a puzzle.

I would be grateful to anyone who takes the time to give it a spin.  Any feedback appreciated - here or email me at jp-at-groovetronix.com.

This is my first effort with the tools, hopefully no major SNAFU's (crossing fingers).

[[Image:Legacy_joefish_bobo_plaza.jpeg|]] @inline@joefish_bobo_cutscene @inline@joefish_bobo_view

===Download Bobodinga from here: http://www.groovetronix.com/jp/bobo.===

==Comments==

'''Tarquin:''' Hi. Welcome to the unreal wiki. :)

'''EntropicLqd:'''  Hello and welcome.  I'm glad you find the Wiki useful.

'''Joefish:'''  Thanks. :)

'''Graphik:''' I'm downloading now. :)

'''Graphik:''' Played a bit and got stuck down at off of the main platform near the edge. I'll try it again.

'''Joefish:''' Dang, up where the key / map sign is?  In terrain or just against the wall?  I'll fix it if I can find it.

'''Graphik:''' I played it through and found it rather enjoyable. The theme was bright and musical, and the puzzle wasn't easy nor was it so difficult that I felt like chucking my computer out of the window. Of course, it wasn't perfect. That's a given for a mod or anything else in life. And since you did say you'd like some constructive criticism, here's a mini-review:

'''The game was fun'''. I haven't enjoyed a good puzzle game since ZZT, but this one held my attention rather well.

'''Graphically, the mod was refreshingly and pleasantly themed''' but had some '''technical difficulties.''' The stairways and light-colored platforms were not shaded smoothly, and are probably in need of some polygonal tweaking. I'm not much of an expert in this area either, so I'm afraid I can't help you actually fix this. The sea surrounding the island appears to be having some difficulties as well. But I'm sure you already knew of these minor flaws.

The cutscenes were very cool and were definately highlights of the mod.

The game only '''one bug''' that I could decern: It is possible to get down to the bottommost level of the island prematurely by jumping. The problem with this is that at that point I had not unlocked the ability to use middle-mouse, so '''I was stuck and had to restart the level'''.

Also, a suggestion: ambient sounds! These would improve the atmosphere a lot.

All of these are relatively minor problems. The mod as a whole was '''enjoyable and worth downloading'''.

'''Joefish:''' Thanks Graphik.  Great points.  I need to figure out static mesh shading.  And I'll fix that bug.  Very glad you enjoyed it.

'''Graphik:''' I played through it again (takes 16x less time to complete when you know what to do :)) and noticed that it ''does'' have ambient sounds, I just had to turn my speakers up louder to hear it.

'''Foxpaw:''' I noticed a slight graphical glitch, on at least one of the blue domes, if you are up on the white ridge around the dome, and move the camera so you are looking down, you can see between the wall and the dome.

As far as the static mesh shading goes, there isn't much you can do about it. It's an artifact of the way that the lighting is done by your video card. This could be rectified by uploading it to the video card differently (with conjoined meshes being treated as one) but the Unreal Engine does not do this. One possible fix would be to make the walls unlit and use shadow projectors to give shading. This would degrade performance somewhat, however.

There's also a place where you can get &quot;crushed&quot; between two of the moving grey blocks, resulting in you getting &quot;teleported&quot; to the side of one of the blocks. I don't mean in the parts with the ones that come together, these two move perpindicular to each other.

I'm not sure if it's intentional, but if you left click twice quickly, the three small domes remain unchanged, but the large dome changes state. I didn't pay that much attention to the initial state of the domes so I don't know if that was required to solve the puzzle or not.

Also I don't really understand how the &quot;key&quot; thing worked. I couldn't get it to work, but then it just kind of happened accidentally. I won't list what I tried because I don't want to spoil the puzzle for anyone.

Err, thought I'd elaborate on what I said about the shading above - basically, the models are shaded according to light sources and the normals of the vertices. So, in order words, a vertex that's facing &quot;away&quot; from a light source is assumed to be on the far side of the object, and should not be lit by that light. This is how parts of one mesh &quot;block&quot; the light from being cast onto other parts of the mesh.

When you have two separate meshes, this does not occur. The side facing the light, which is in reality blocked from the light by another wall section, still gets lit because it would be far too much of a load on the video card to check to see if other meshes were blocking a light.

Actually, while writing that, I had an idea. Try making wall sections that don't have ends on them. IE, the two long flat sides should be connected at the top, but should be &quot;open&quot; at the ends. Then you wouldn't have those vertices getting lit despite being blocked, and it wouldn't be interpolating onto visible areas of the mesh. Of course, you would then have to create separate &quot;end pieces&quot; for your walls.

'''Joefish:''' Thanks for the feedback Foxpaw.  Sorry the puzzle worked by accident :/. The way the domes state-change is intentional, but probably needs more pointing-out within the level, so it doesn’t confuse.

The grey block crush / teleport-out is intentional – in fact it was a royal pain to set up! I made the movers 'ignore when encroach' to get them to push you around, but then you would get stuck inside them when they 'crush' you.  The teleport-out is my inelegant solution.

Sounds like I may be out of luck on mesh lighting.  I guess if I combined large parts of the walls / stairs into single meshes, that would fix lighting, at the cost of way more unique static mesh polys.  Something to experiment with anyway.  Re. your idea, in fact the wall sections already are &quot;open&quot; at the ends, with separate end pieces.  I think I experimented with closed / open walls and they looked pretty similar.

Graphik - glad you found the ambient sfx :), I should turn those up.

'''Joefish:'''  Graphik - I've been hunting like crazy for the spot where you can jump to that bottom area but I just can't find it - can you tell me approx where you jumped from?

'''Graphik:''' I just jumped the gate. You have to get a running start and jump at the right time.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3884</id>
      <timestamp>2005-06-27T15:18:37Z</timestamp>
      <contributor>
        <ip>Joefish</ip>
      </contributor>
      <comment>fixed bobodinga mesh lighting</comment>
      <text xml:space="preserve">==About Me==

Also known as Joe, but that username tends to be taken.

I am working on a simple level as a way of learning the Unreal tools ... it has turned into a simple mod because of a few things I wanted to try ... the wiki has quickly become my #1 resource and I'm grateful for it. I'm new to OOP and when I FINALLY figured out how to downcast an object reference ([[Legacy:Typecasting|Typecasting]]) I just about fell off my chair.

==Bobodinga 'MiniMod'==

Woohoo!  I finally finished the $%@*&amp; thing!  A single-player, 3rd-person, mini (1-level) mod.  Simple and quiet.  Run, jump, and solve a puzzle.

I would be grateful to anyone who takes the time to give it a spin.  Any feedback appreciated - here or email me at jp-at-groovetronix.com.

===Download Bobodinga from here: http://www.groovetronix.com/jp/bobo.===

'''update 6.27.05''' - OK I figured out how to (mostly) fix my static mesh lighting.  Culled some unnecessary edges and learned about Maya smoothing.  I fixed the seams between my wall sections by making the edge of each wall module perfectly mirror-symmetrical with its neighbor.  It's not enough to just line up verts!  There are still some minor glitches but it looks a lot cleaner.

[[Image:Legacy_joefish_bobo_plaza.jpeg|]] @inline@joefish_bobo_cutscene @inline@joefish_bobo_view

==Comments==

'''Tarquin:''' Hi. Welcome to the unreal wiki. :)

'''EntropicLqd:'''  Hello and welcome.  I'm glad you find the Wiki useful.

'''Joefish:'''  Thanks. :)

'''Graphik:''' I'm downloading now. :)

'''Graphik:''' Played a bit and got stuck down at off of the main platform near the edge. I'll try it again.

'''Joefish:''' Dang, up where the key / map sign is?  In terrain or just against the wall?  I'll fix it if I can find it.

'''Graphik:''' I played it through and found it rather enjoyable. The theme was bright and musical, and the puzzle wasn't easy nor was it so difficult that I felt like chucking my computer out of the window. Of course, it wasn't perfect. That's a given for a mod or anything else in life. And since you did say you'd like some constructive criticism, here's a mini-review:

'''The game was fun'''. I haven't enjoyed a good puzzle game since ZZT, but this one held my attention rather well.

'''Graphically, the mod was refreshingly and pleasantly themed''' but had some '''technical difficulties.''' The stairways and light-colored platforms were not shaded smoothly, and are probably in need of some polygonal tweaking. I'm not much of an expert in this area either, so I'm afraid I can't help you actually fix this. The sea surrounding the island appears to be having some difficulties as well. But I'm sure you already knew of these minor flaws.

The cutscenes were very cool and were definately highlights of the mod.

The game only '''one bug''' that I could decern: It is possible to get down to the bottommost level of the island prematurely by jumping. The problem with this is that at that point I had not unlocked the ability to use middle-mouse, so '''I was stuck and had to restart the level'''.

Also, a suggestion: ambient sounds! These would improve the atmosphere a lot.

All of these are relatively minor problems. The mod as a whole was '''enjoyable and worth downloading'''.

'''Joefish:''' Thanks Graphik.  Great points.  I need to figure out static mesh shading.  And I'll fix that bug.  Very glad you enjoyed it.

'''Graphik:''' I played through it again (takes 16x less time to complete when you know what to do :)) and noticed that it ''does'' have ambient sounds, I just had to turn my speakers up louder to hear it.

'''Foxpaw:''' I noticed a slight graphical glitch, on at least one of the blue domes, if you are up on the white ridge around the dome, and move the camera so you are looking down, you can see between the wall and the dome.

As far as the static mesh shading goes, there isn't much you can do about it. It's an artifact of the way that the lighting is done by your video card. This could be rectified by uploading it to the video card differently (with conjoined meshes being treated as one) but the Unreal Engine does not do this. One possible fix would be to make the walls unlit and use shadow projectors to give shading. This would degrade performance somewhat, however.

There's also a place where you can get &quot;crushed&quot; between two of the moving grey blocks, resulting in you getting &quot;teleported&quot; to the side of one of the blocks. I don't mean in the parts with the ones that come together, these two move perpindicular to each other.

I'm not sure if it's intentional, but if you left click twice quickly, the three small domes remain unchanged, but the large dome changes state. I didn't pay that much attention to the initial state of the domes so I don't know if that was required to solve the puzzle or not.

Also I don't really understand how the &quot;key&quot; thing worked. I couldn't get it to work, but then it just kind of happened accidentally. I won't list what I tried because I don't want to spoil the puzzle for anyone.

Err, thought I'd elaborate on what I said about the shading above - basically, the models are shaded according to light sources and the normals of the vertices. So, in order words, a vertex that's facing &quot;away&quot; from a light source is assumed to be on the far side of the object, and should not be lit by that light. This is how parts of one mesh &quot;block&quot; the light from being cast onto other parts of the mesh.

When you have two separate meshes, this does not occur. The side facing the light, which is in reality blocked from the light by another wall section, still gets lit because it would be far too much of a load on the video card to check to see if other meshes were blocking a light.

Actually, while writing that, I had an idea. Try making wall sections that don't have ends on them. IE, the two long flat sides should be connected at the top, but should be &quot;open&quot; at the ends. Then you wouldn't have those vertices getting lit despite being blocked, and it wouldn't be interpolating onto visible areas of the mesh. Of course, you would then have to create separate &quot;end pieces&quot; for your walls.

'''Joefish:''' Thanks for the feedback Foxpaw.  Sorry the puzzle worked by accident :/. The way the domes state-change is intentional, but probably needs more pointing-out within the level, so it doesn’t confuse.

The grey block crush / teleport-out is intentional – in fact it was a royal pain to set up! I made the movers 'ignore when encroach' to get them to push you around, but then you would get stuck inside them when they 'crush' you.  The teleport-out is my inelegant solution.

Sounds like I may be out of luck on mesh lighting.  I guess if I combined large parts of the walls / stairs into single meshes, that would fix lighting, at the cost of way more unique static mesh polys.  Something to experiment with anyway.  Re. your idea, in fact the wall sections already are &quot;open&quot; at the ends, with separate end pieces.  I think I experimented with closed / open walls and they looked pretty similar.

Graphik - glad you found the ambient sfx :), I should turn those up.

'''Joefish:'''  Graphik - I've been hunting like crazy for the spot where you can jump to that bottom area but I just can't find it - can you tell me approx where you jumped from?

'''Graphik:''' I just jumped the gate. You have to get a running start and jump at the right time.

'''Joefish:''' Got it, thanks G.  Fixed that and one other nasty stuck-inside-mesh bug I ran across.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Johnny Bazbar</title>
    <id>1539</id>
    <revision>
      <id>3834</id>
      <timestamp>2002-10-06T17:05:20Z</timestamp>
      <contributor>
        <ip>Johnny Bazbar</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greetings. No, it's not my real name :) Not even close. It's really a modification of the cartoon character &quot;Johnny Bravo&quot; (ho, momma!), with baz &amp; bar of course being completely over used so-called &quot;metasyntactic variables&quot; by hacking geek types. I used to use my real name on the web, but stopped doing anything like that because of SPAM. :|

&amp;rarr;Unreal Biography &amp;rarr;

I've been a fan of the Unreal series since I first heard about it long before Unreal 1 came out. I quickly started hacking things with Unreal 1. 

Long ago, I used to have a hosted site on PlanetUnreal called '''Naliwood Production Studios''', where I wrote a spectator camera system for the original Unreal called DeathWatch, and worked on early attempts at Unreal-based movie making, long before the term &quot;machinima&quot; came about. You can actually find some of it in the Web Archive (geez, I can't believe that was 4 years ago!):

http://web.archive.org/web/*/www.planetunreal.com/movies

I think UT2K3 is a fine game, but I bought more because I wanted access to the engine and tools, than the game itself. I'm really looking forward to Unreal 2. 

----

'''Wormbo:''' Welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:''' Hello &amp; welcome. :D

'''ZxAnPhOrIaN:''' Hi and Welcome to the wiki! :) :tup:

'''Johnny Bazbar''' - Thanks y'all! Pleased to be here, I'll try not to muck anything up :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3835</id>
      <timestamp>2002-10-06T16:20:08Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:''' Hello &amp; welcome. :D

'''ZxAnPhOrIaN:''' Hi and Welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3836</id>
      <timestamp>2002-10-06T17:02:12Z</timestamp>
      <contributor>
        <ip>Johnny Bazbar</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Greetings. No, it's not my real name :) Not even close. It's really a modification of the cartoon character &quot;Johnny Bravo&quot; (ho, momma!), with baz &amp; bar of course being completely over used so-called &quot;metasyntactic variables&quot; by hacking geek types. I used to use my real name on the web, but stopped doing anything like that because of SPAM. :|

&amp;rarr;Unreal Biography &amp;rarr;

I've been a fan of the Unreal series since I first heard about it long before Unreal 1 came out. I quickly started hacking things with Unreal 1. 

Long ago, I used to have a hosted site on PlanetUnreal called &quot;Naliwood Studios&quot;, where I wrote a spectator camera system for the original Unreal called DeathWatch, and worked on early attempts at Unreal-based movie making, long before the term &quot;machinima&quot; came about. 

You can actually find some of it in the Web Archive (geez, I can't believe that was 4 years ago!):

http://web.archive.org/web/*/www.planetunreal.com/movies

----

'''Wormbo:''' Welcome to the Wiki. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''Tarquin:''' Hello &amp; welcome. :D

'''ZxAnPhOrIaN:''' Hi and Welcome to the wiki! :) :tup:

'''Johnny Bazbar''' - Thanks y'all! Pleased to be here, I'll try not to muck anything up :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Joren</title>
    <id>1547</id>
    <revision>
      <id>3853</id>
      <timestamp>2003-03-03T13:19:50Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About ==

Hey, I'm Joren...maybe I'll expand this page later when I feel like it.  Contact me [mailto:Unreal_Wiki@joren.mailshell.com here]

==Projects ==

Ants - A mod for UT, I gave up on it a while ago and picked it up again recently.  We'll see...

Enhanced Link Gun - I haven't figured out where to put the thing yet, but it's an Enhanced Link Gun that allows teammates to link to each other no matter what weapon they are carrying.

==Wiki ==

I'm picky and therefore I'll edit stuff if it doesn't seem right.  I'm still a newbie at coding though, so I can make mistakes too.

----

'''Wormbo:''' Welcome to the Wiki. :) Have a nice stay.

'''EntropicLqd:''' Hello and welcome to the Wiki.

'''Tarquin:''' Hi there. Picky people are good to have on wikis! :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3854</id>
      <timestamp>2003-03-03T08:57:51Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>hi</comment>
      <text xml:space="preserve">==About ==

Hey, I'm Joren...maybe I'll expand this page later when I feel like it.  Contact me [mailto:Unreal_Wiki@joren.mailshell.com here]

==Projects ==

Ants - A mod for UT, I gave up on it a while ago and picked it up again recently.  We'll see...

Enhanced Link Gun - I haven't figured out where to put the thing yet, but it's an Enhanced Link Gun that allows teammates to link to each other no matter what weapon they are carrying.

==Wiki ==

I'm picky and therefore I'll edit stuff if it doesn't seem right.  I'm still a newbie at coding though, so I can make mistakes too.

----

'''Wormbo:''' Welcome to the Wiki. :) Have a nice stay.

'''EntropicLqd:''' Hello and welcome to the Wiki.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jrubzjeknf</title>
    <id>1565</id>
    <revision>
      <id>3894</id>
      <timestamp>2007-09-09T10:52:32Z</timestamp>
      <contributor>
        <ip>Jrubzjeknf</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About me==

'''Jrubzjeknf''', ingame '''Nova^''' and in real life: '''Robin van Olst'''.

I started coding for UT2004 in 2005, and I've been doing it ever since, though I only create things that will actually be used. I've always had the urge: if it's not used, it's useless. That's also why I don't create something solely for learning purposes - I prefer to create something useful that will teach me as well.

;Website : http://jrubzjeknf.thedubclan.com

;IRC channels : You usually hang around in:
; | '''QuakeNet''' |  #thedubclan #titanonslaught #vctf
; | '''EnterTheGame''' | #utjb, #jailbreak, #unrealscript

==About my nickname==

When you first saw my nickname, you probably thought along the line: he came up with that when he looked into his soup with letter vermicelli. Though there is a small story behind it:

When I was about 14-15 year old, I hang out a lot with three other guys, all having a name starting with the letter 'J'. So at some point, my sister said &quot;You should have a name with a J too!&quot;. 'J' was obviously the first letter, 'rub' was my slightly changed first name and 'zjeknf' to finish it, resulting in: Jrubzjeknf. This name was probably long forgotten if my email address wasn't spammed to death at that time. I had to make a new one, and used my sis' made up name for that. Since then, I've been using it a lot on forums, because no-one has used that name to register with before. :D

Nova^ I used even before that. Nothing special about it, just read it somewhere. The ^ is there to set my name apart from other Novas, which are unfortunately amazingly common.

As you may have already noticed, Jrubzjeknf is unique and (for new people) hard to write. Nova^ is basically the opposite, very common and easy to write. That's why I use both nicknames: Jrubzjeknf for forums and Nova^ ingame.

==Guestbook / Comments==

'''Jrubzjeknf:''' Need to add a couple of things, but that will happen over time. For now, welcome to my very own UnrealWiki page. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3895</id>
      <timestamp>2006-12-14T16:07:18Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''tgusagalpa:'''Hi, and welcome to the wiki!

'''Wormbo:''' Hi there! :)

'''Tarquin:''' Hey :)

'''Jrubzjeknf:''' I got a personal page? :shocked: Woohoo!! :D And thanks for the warm welcome!

'''Graphik:''' I'm sure you weren't planning on doing this on a regular basis, but please do not sprinkle obnoxious uppercase messages unceremoniously across people's personal pages. I suspect kindness is the only reason nothing was said. If there is some unusual circumstance under which you ''must'' do something unsightly to a page, please clean it up after the purpose in connection with it has been fulfilled.

Welcome to the Wiki.

'''Tarquin:''' Graphik, if you mean the massive MYCHAEEEEL page, then Jrub checked with me first &amp; I said it was ok :)

'''Graphik:''' Yes, that's fine. I was speaking about [[Legacy:Mychaeel|Mychaeel]], thus &quot;personal pages&quot; in my above edit.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3896</id>
      <timestamp>2007-09-05T09:50:38Z</timestamp>
      <contributor>
        <ip>Jrubzjeknf</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About me==

'''Jrubzjeknf''', ingame '''Nova^''' and in real life: '''Robin van Olst'''.

I started coding for UT2004 in 2005, and I've been doing it ever since, though I only create things that will actually be used. I've always had the urge: if it's not used, it's useless. That's also why I don't create something solely for learning purposes - I prefer to create something useful that will teach me as well.

;Website : http://jrubzjeknf.thedubclan.com

;Email : rrvanolst@hotmail.com

;IRC channels : You usually hang around in:
; | '''QuakeNet''' |  #thedubclan #titanonslaught #vctf
; | '''EnterTheGame''' | #utjb, #jailbreak, #unrealscript

==About my nickname==

When you first saw my nickname, you probably thought along the line: he came up with that when he looked into his soup with letter vermicelli. Though there is a small story behind it:

When I was about 14-15 year old, I hang out a lot with three other guys, all having a name starting with the letter 'J'. So at some point, my sister said &quot;You should have a name with a J too!&quot;. 'J' was obviously the first letter, 'rub' was my slightly changed first name and 'zjeknf' to finish it, resulting in: Jrubzjeknf. This name was probably long forgotten if my email address wasn't spammed to death at that time. I had to make a new one, and used my sis' made up name for that. Since then, I've been using it a lot on forums, because no-one has used that name to register with before. :D

Nova^ I used even before that. Nothing special about it, just read it somewhere. The ^ is there to set my name apart from other Novas, which are unfortunately amazingly common.

As you may have already noticed, Jrubzjeknf is unique and (for new people) hard to write. Nova^ is basically the opposite, very common and easy to write. That's why I use both nicknames: Jrubzjeknf for forums and Nova^ ingame.

==Guestbook / Comments==

'''Jrubzjeknf:''' Need to add a couple of things, but that will happen over time. For now, welcome to my very own UnrealWiki page. :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Julian Mehnle</title>
    <id>1564</id>
    <revision>
      <id>3893</id>
      <timestamp>2006-03-04T18:14:59Z</timestamp>
      <contributor>
        <ip>Julian Mehnle</ip>
      </contributor>
      <comment>created page</comment>
      <text xml:space="preserve">* E-mail address: julian@mehnle.net
* Homepage: http://www.mehnle.net

See [[Legacy:Moo|Moo]] for my involvement here.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JumpBoots</title>
    <id>28561</id>
    <revision>
      <id>40262</id>
      <timestamp>2009-11-17T11:09:40Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JumpDest</title>
    <id>1546</id>
    <revision>
      <id>3850</id>
      <timestamp>2004-04-07T16:17:53Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JumpDest}}

From the comments in the class source: &quot;Specifies positions that can be reached with greater than normal jump.  Forced paths will check for greater than normal jump capability.  Note that these have NO relation to JumpPads.&quot;

JumpDest's only subclass, [[Legacy:JumpSpot|JumpSpot]], seems to be what you should use for mapping.  At least for [[Legacy:UT2003|UT2003]], this class appears to just be used to establish code that is inherited by JumpSpot.

==Properties ==
; bool bForceDoubleJump : Tells bots to try to double-jump to reach this node, apparently when following a forced path. See [[Legacy:JumpSpot|JumpSpot]] for how to use. This property was added after the initial release of UT2003 AFAWK: it doesn't appear in some sources.

===Hidden===
; bool bOptionalJumpDest : 
; float CalculatedGravityZ[8] : 
; vector NeededJump[8] : 
; int NumUpstreamPaths : 
; ReachSpec UpstreamPaths[8] : 

==Functions ==
;  DoJump( Pawn Other ): 
; int GetPathIndex( ReachSpec Path ): 

==Events ==
; int SpecialCost( Pawn Other , ReachSpec Path ): 
; bool SuggestMovePreparation( Pawn Other ):

==Subclasses ==
* [[Legacy:JumpSpot|JumpSpot]]</text>
    </revision>
    <revision>
      <id>3851</id>
      <timestamp>2004-01-27T18:31:35Z</timestamp>
      <contributor>
        <ip>Smattbac</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JumpDest}}

From the comments in the class source: &quot;Specifies positions that can be reached with greater than normal jump.  Forced paths will check for greater than normal jump capability.  Note that these have NO relation to JumpPads.&quot;

JumpDest's only subclass, [[Legacy:JumpSpot|JumpSpot]], seems to be what you should use for mapping.  At least for [[Legacy:UT2003|UT2003]], this class appears to just be used to establish code that is inherited by JumpSpot.

==Properties ==
; bool bForceDoubleJump : hack for map fixing(?)
; bool bOptionalJumpDest : 
; float CalculatedGravityZ[8] : 
; vector NeededJump[8] : 
; int NumUpstreamPaths : 
; ReachSpec UpstreamPaths[8] : 

==Functions ==
;  DoJump( Pawn Other ): 
; int GetPathIndex( ReachSpec Path ): 

==Events ==
; int SpecialCost( Pawn Other , ReachSpec Path ): 
; bool SuggestMovePreparation( Pawn Other ):

==Subclasses ==
* [[Legacy:JumpSpot|JumpSpot]]</text>
    </revision>
    <revision>
      <id>3852</id>
      <timestamp>2004-04-07T15:11:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JumpDest}}

From the comments in the class source: &quot;Specifies positions that can be reached with greater than normal jump.  Forced paths will check for greater than normal jump capability.  Note that these have NO relation to JumpPads.&quot;

JumpDest's only subclass, [[Legacy:JumpSpot|JumpSpot]], seems to be what you should use for mapping.  At least for [[Legacy:UT2003|UT2003]], this class appears to just be used to establish code that is inherited by JumpSpot.

==Properties ==
; bool bForceDoubleJump : hack for map fixing. (?)

===Hidden===
; bool bOptionalJumpDest : 
; float CalculatedGravityZ[8] : 
; vector NeededJump[8] : 
; int NumUpstreamPaths : 
; ReachSpec UpstreamPaths[8] : 

==Functions ==
;  DoJump( Pawn Other ): 
; int GetPathIndex( ReachSpec Path ): 

==Events ==
; int SpecialCost( Pawn Other , ReachSpec Path ): 
; bool SuggestMovePreparation( Pawn Other ):

==Subclasses ==
* [[Legacy:JumpSpot|JumpSpot]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JumpMatch</title>
    <id>1536</id>
    <revision>
      <id>3828</id>
      <timestamp>2004-12-29T22:01:02Z</timestamp>
      <contributor>
        <ip>ACBE8A2B.ipt.aol.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; JumpMatch (Package: Botpack)}}

This mutator provides every player within the game the ability to jump extremely high.  This is a similar effect to that obtained when wearing jump boots, but does have slightly different behaviour.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
; PostBeginPlay ( ) : If this game is a subclass of [[Legacy:DeathMatchPlus|DeathMatchPlus]] then set the &lt;tt&gt;bJumpMatch&lt;/tt&gt; property to &lt;tt&gt;true&lt;/tt&gt;.&lt;br /&gt;The &lt;tt&gt;bJumpMatch&lt;/tt&gt; property is interrogated within the function &lt;tt&gt;[[Legacy:DeathMatchPlus|DeathMatchPlus]].PlayerJumpZScaling()&lt;/tt&gt;.  This function returns a Z scaling of 3 if the &lt;tt&gt;bJumpMatch&lt;/tt&gt; property if &lt;tt&gt;true&lt;/tt&gt;.&lt;br /&gt;The &lt;tt&gt;[[Legacy:Assault|Assault]].InitGame( string Options, out string Error )&lt;/tt&gt; function explicity sets the &lt;tt&gt;bJumpMatch&lt;/tt&gt; property to &lt;tt&gt;false&lt;/tt&gt;.

===Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]===
; bool CheckReplacement ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; every time an object of type [[Legacy:UT_JumpBoots|UT_JumpBoots]] is encountered.  This effectively removes all jump boots from the game.

----

[[Legacy:Jumpzone|Jumpzone]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3829</id>
      <timestamp>2003-05-27T09:51:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; JumpMatch (Package: Botpack)}}

This mutator provides every player within the game the ability to jump extremely high.  This is a similar effect to that obtained when wearing jump boots, but does have slightly different behaviour.

==Methods==

===Inherited From [[Legacy:Actor (UT)|Actor (UT)]]===
; PostBeginPlay ( ) : If this game is a subclass of [[Legacy:DeathMatchPlus|DeathMatchPlus]] then set the &lt;tt&gt;bJumpMatch&lt;/tt&gt; property to &lt;tt&gt;true&lt;/tt&gt;.&lt;br /&gt;The &lt;tt&gt;bJumpMatch&lt;/tt&gt; property is interrogated within the function &lt;tt&gt;[[Legacy:DeathMatchPlus|DeathMatchPlus]].PlayerJumpZScaling()&lt;/tt&gt;.  This function returns a Z scaling of 3 if the &lt;tt&gt;bJumpMatch&lt;/tt&gt; property if &lt;tt&gt;true&lt;/tt&gt;.&lt;br /&gt;The &lt;tt&gt;[[Legacy:Assault|Assault]].InitGame( string Options, out string Error )&lt;/tt&gt; function explicity sets the &lt;tt&gt;bJumpMatch&lt;/tt&gt; property to &lt;tt&gt;false&lt;/tt&gt;.

===Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]===
; bool CheckReplacement ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; every time an object of type [[Legacy:UT_JumpBoots|UT_JumpBoots]] is encountered.  This effectively removes all jump boots from the game.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JumpPad</title>
    <id>1543</id>
    <revision>
      <id>3844</id>
      <timestamp>2003-05-13T14:41:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JumpPad (Package: engine)}}

The JumpPad class is basically the same as the [[Legacy:UTJumpPad|UTJumpPad]]. The only difference between the two is that the JumpPad class lacks bot support and can't be placed directly in the Editor. Therefor, mappers generally want to use the [[Legacy:UTJumpPad|UTJumpPad]] class instead.

See [[Legacy:Kicker|Kicker]] for the corresponding actor in UT.

==Known Subclasses ==
* [[Legacy:UTJumpPad|UTJumpPad]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3845</id>
      <timestamp>2003-01-11T01:38:08Z</timestamp>
      <contributor>
        <ip>G-LiTe</ip>
      </contributor>
      <comment>Cleanup, removed discussion</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; JumpPad (Package: engine)}}

The JumpPad class is basically the same as the [[Legacy:UTJumpPad|UTJumpPad]]. The only difference between the two is that the JumpPad class lacks bot support and can't be placed directly in the Editor. Therefor, mappers generally want to use the [[Legacy:UTJumpPad|UTJumpPad]] class instead.

==Known Subclasses ==
* [[Legacy:UTJumpPad|UTJumpPad]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JumpSpot</title>
    <id>1537</id>
    <revision>
      <id>3830</id>
      <timestamp>2006-03-01T22:36:30Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; JumpSpot}}

''See also [[Legacy:JumpSpot (UT)|JumpSpot (UT)]]''

The JumpSpot actor seems to be used in UT2003 primarily as a ''destination'' for jumps which normal pathnode-to-pathnode navigation can't handle. This includes translocations if the &quot;jump&quot; is too far for the bot to jump normally. In UT2003 the bots seem to be quite intelligent about not performing jumps that will send them falling (probably to their deaths), and instead will translocate, if possible, or just ignore the special jump pathing if not.

==Properties ==
;bNeverImpactJump:When set to &lt;tt&gt;true&lt;/tt&gt;, bots will not attempt to use the [[Legacy:ShieldGun|ShieldGun]] to boost themselves to the JumpSpot
;bNoLowGrav:When &lt;tt&gt;true&lt;/tt&gt;, bots will not attempt the jump while in low-grav conditions
;bOnlyTranslocator:When &lt;tt&gt;true&lt;/tt&gt;, bots will only use the JumpSpot as a destination for translocating to, not for any other form of jump
;TranslocTargetTag:
;TranslocZOffset:I belive this is the z offset between where the JumpSpot is and where the bots should aim their translocator targets, use with caution and only if bots are missing their translocator throws.

'''Birelli:''' After reviewing Steve Polge's AI article (listing it below), I think the TranslocZOffset description was slightly off (and potentially quite destructive).

==Subclasses ==
* [[Legacy:GameObjective|GameObjective]]

==Notes for mapping ==

The best way to get bots to utilize JumpSpots in a map appears to be to set it as the destination of a ForcedPath property of another [[Legacy:NavigationPoint|NavigationPoint]] actor. That is to say, if you want to get bots to transloc/hammer jump/whatever, put a JumpSpot at the destination of the jump, and at the origination of the jump place a NavigationPoint with the properties &lt;tt&gt;NavigationPoint -&gt; ForcedPaths[]&lt;/tt&gt; set to as many different JumpSpots as you wish (up to four, actually).

To find the object name of the JumpSpot that is your destination point, expand &lt;tt&gt;Object&lt;/tt&gt; in the [[Legacy:Actor Properties Window|actor properties window]], and look at &lt;tt&gt;Name&lt;/tt&gt;. Whatever is there, copy it over into the ForcedPaths list of the source PathNode.

In regards to the properties, the bNoImpactJump and bNoLowGrav are useful if the gap to be jumped across has a low ceiling over it which would cause the bots to bounce off it and land short. There aren't that many cases where you would want to set these though, as in general you can just specify bOnlyTranslocator. The situation I can forsee would be jumping off a ledge where a low-grav or impact jump would bounce off a ceiling, but a normal jump wouldn't, and the distance is large enough that bots need the JumpSpot in order to make the jump.

Most distances that can be spanned by a normal (or double) jump can be pathed just by placing two [[Legacy:PathNode|PathNode]]s (or any NavigationPoint for that matter, but typically PathNodes) on either side of the span, and setting up the ForcedPaths to ensure that the PathNodes are connected.

==Double jump==

To make bots double jump to a spot, you need two actors: a JumpSpot and another path node of some sort.
* bots seem to start a double jump at the pathnode that leads to the JumpSpot, so you'll need to set it up carefully. If they are too far apart, they will perform the double jump but obviously not get to the desired spot
* set the JumpSpot's JumpDest -&gt; bForceDoubleJump to True 
* set one of the path node's NavigationPoint -&gt; ForcedPaths to point to the JumpSpot

==External Links==
* Steve Polge's AI for UT2003 mappers article (JumpSpot section): http://unreal.epicgames.com/ut2ai.htm

==Related Topics==
* [[Legacy:Bot Pathing|Bot Pathing]]

==Discussion==

'''Tarquin:''' I think I may have found a bug in this. If you chain several JumpSpot together, and one of them has bForceDoubleJump set to false,then bForceDoubleJump = true seems to have no effect on the earlier ones. Needs checking though

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3831</id>
      <timestamp>2005-11-02T00:22:30Z</timestamp>
      <contributor>
        <ip>Pool1418.cvx6-bradley.dialup.earthlink.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; JumpSpot}}

''See also [[Legacy:JumpSpot (UT)|JumpSpot (UT)]]''

The JumpSpot actor seems to be used in UT2003 primarily as a ''destination'' for jumps which normal pathnode-to-pathnode navigation can't handle. This includes translocations if the &quot;jump&quot; is too far for the bot to jump normally. In UT2003 the bots seem to be quite intelligent about not performing jumps that will send falling (probably to their deaths), and instead will translocate, if possible, or just ignore the special jump pathing if not.

==Properties ==
;bNeverImpactJump:When set to &lt;tt&gt;true&lt;/tt&gt;, bots will not attempt to use the [[Legacy:ShieldGun|ShieldGun]] to boost themselves to the JumpSpot
;bNoLowGrav:When &lt;tt&gt;true&lt;/tt&gt;, bots will not attempt the jump while in low-grav conditions
;bOnlyTranslocator:When &lt;tt&gt;true&lt;/tt&gt;, bots will only use the JumpSpot as a destination for translocating to, not for any other form of jump
;TranslocTargetTag:
;TranslocZOffset:I belive this is the z offset between where the JumpSpot is and where the bots should aim their translocator targets, use with caution and only if bots are missing their translocator throws.

'''Birelli:''' After reviewing Steve Polge's AI article (listing it below), I think the TranslocZOffset description was slightly off (and potentially quite destructive).

==Subclasses ==
* [[Legacy:GameObjective|GameObjective]]

==Notes for mapping ==

The best way to get bots to utilize JumpSpots in a map appears to be to set it as the destination of a ForcedPath property of another [[Legacy:NavigationPoint|NavigationPoint]] actor. That is to say, if you want to get bots to transloc/hammer jump/whatever, put a JumpSpot at the destination of the jump, and at the origination of the jump place a NavigationPoint with the properties &lt;tt&gt;NavigationPoint -&gt; ForcedPaths[]&lt;/tt&gt; set to as many different JumpSpots as you wish (up to four, actually).

To find the object name of the JumpSpot that is your destination point, expand &lt;tt&gt;Object&lt;/tt&gt; in the [[Legacy:Actor Properties Window|actor properties window]], and look at &lt;tt&gt;Name&lt;/tt&gt;. Whatever is there, copy it over into the ForcedPaths list of the source PathNode.

In regards to the properties, the bNoImpactJump and bNoLowGrav are useful if the gap to be jumped across has a low ceiling over it which would cause the bots to bounce off it and land short. There aren't that many cases where you would want to set these though, as in general you can just specify bOnlyTranslocator. The situation I can forsee would be jumping off a ledge where a low-grav or impact jump would bounce off a ceiling, but a normal jump wouldn't, and the distance is large enough that bots need the JumpSpot in order to make the jump.

Most distances that can be spanned by a normal (or double) jump can be pathed just by placing two [[Legacy:PathNode|PathNode]]s (or any NavigationPoint for that matter, but typically PathNodes) on either side of the span, and setting up the ForcedPaths to ensure that the PathNodes are connected.

==Double jump==

To make bots double jump to a spot, you need two actors: a JumpSpot and another path node of some sort.
* bots seem to start a double jump at the pathnode that leads to the JumpSpot, so you'll need to set it up carefully. If they are too far apart, they will perform the double jump but obviously not get to the desired spot
* set the JumpSpot's JumpDest -&gt; bForceDoubleJump to True 
* set one of the path node's NavigationPoint -&gt; ForcedPaths to point to the JumpSpot

==External Links==
* Steve Polge's AI for UT2003 mappers article (JumpSpot section): http://unreal.epicgames.com/ut2ai.htm

==Related Topics==
* [[Legacy:Bot Pathing|Bot Pathing]]

==Discussion==

'''Tarquin:''' I think I may have found a bug in this. If you chain several JumpSpot together, and one of them has bForceDoubleJump set to false,then bForceDoubleJump = true seems to have no effect on the earlier ones. Needs checking though

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JumpSpot (UT)</title>
    <id>1544</id>
    <revision>
      <id>3846</id>
      <timestamp>2003-09-21T15:12:36Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <comment>LiftCenter links now point to UT version</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] &gt;&gt; JumpSpot}}

'''Tarquin:'''  DM-Morpheus places the JS at the TOP of the jump &amp;ndash; where the bot should land. This is similar bahaviour to the use of [[Legacy:TranslocDest|TranslocDest]], and since both TD and JS are subclasses of  [[Legacy:LiftCenter (UT)|LiftCenter (UT)]], I'm inclined to say that what is written below is incorrect.

Also, on Morpheus the bots don't have boots: they jump plain, but travel far with the gravity. can JS be used in normal gravity to specify an accomplaishable jump? Stay tuned...

Then again, Morph uses LE - JS - LE for the top towers, where a bot has to go up. For jumps ''across'' gaps, Morph uses LE - [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] - LE. Hmmm.

A JumpSpot actor is used to tell the bots where to perform an impact hammer or anti-gravity (typically with the boots) jump. Place the actor where the bot should begin the jump and set bHammerJump to &lt;tt&gt;True&lt;/tt&gt; if you want the bots to use the impact hammer for the jump if boots are not available. Note that this should not be used for places like bots jumping a small gap or lip - if a player can make the jump normally (preferably with a bit of room to spare), then simply use [[Legacy:PathNode|PathNode]]s above/below or before/after the lip/gap.

'''EntropicLqd:'''  My understanding of jump spots is that they can be used to tell the bots about all jumps that they can make that could lead to a shortcut through the level, or ones which the normal AI can't figure out for itself, including impact hammer jumps and low-grav short cuts.  The AI will calculate some jumps, but not all possible ones (it seems to be distance based with the Z component having more significance.  I've always had most luck setting up jump spots that are short cuts through the level (or pathnoding kickers) as one way paths with the jumpspot pretty much next to its associated lift exit.  From the experimentation I've done bi-directional jumpspots required the jumpspot to be at the apex of the jump that is to be made.  However, I found the failure rate of this sort of path to be unnaceptable.  Oddly, the AI only requires that the lift-exits are travelled through, not the jumpspot.</text>
    </revision>
    <revision>
      <id>3847</id>
      <timestamp>2003-01-03T04:03:55Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:LiftCenter|LiftCenter]] &gt;&gt; JumpSpot}}

'''Tarquin:'''  DM-Morpheus places the JS at the TOP of the jump &amp;ndash; where the bot should land. This is similar bahaviour to the use of [[Legacy:TranslocDest|TranslocDest]], and since both TD and JS are subclasses of  [[Legacy:LiftCenter|LiftCenter]], I'm inclined to say that what is written below is incorrect.

Also, on Morpheus the bots don't have boots: they jump plain, but travel far with the gravity. can JS be used in normal gravity to specify an accomplaishable jump? Stay tuned...

Then again, Morph uses LE - JS - LE for the top towers, where a bot has to go up. For jumps ''across'' gaps, Morph uses LE - [[Legacy:LiftCenter|LiftCenter]] - LE. Hmmm.

A JumpSpot actor is used to tell the bots where to perform an impact hammer or anti-gravity (typically with the boots) jump. Place the actor where the bot should begin the jump and set bHammerJump to &lt;tt&gt;True&lt;/tt&gt; if you want the bots to use the impact hammer for the jump if boots are not available. Note that this should not be used for places like bots jumping a small gap or lip - if a player can make the jump normally (preferably with a bit of room to spare), then simply use [[Legacy:PathNode|PathNode]]s above/below or before/after the lip/gap.

'''EntropicLqd:'''  My understanding of jump spots is that they can be used to tell the bots about all jumps that they can make that could lead to a shortcut through the level, or ones which the normal AI can't figure out for itself, including impact hammer jumps and low-grav short cuts.  The AI will calculate some jumps, but not all possible ones (it seems to be distance based with the Z component having more significance.  I've always had most luck setting up jump spots that are short cuts through the level (or pathnoding kickers) as one way paths with the jumpspot pretty much next to its associated lift exit.  From the experimentation I've done bi-directional jumpspots required the jumpspot to be at the apex of the jump that is to be made.  However, I found the failure rate of this sort of path to be unnaceptable.  Oddly, the AI only requires that the lift-exits are travelled through, not the jumpspot.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jumper</title>
    <id>1553</id>
    <revision>
      <id>3866</id>
      <timestamp>2007-11-19T15:06:26Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Jumper (Package: UnrealShare)}}

Jumpers will trigger a [[Legacy:ScriptedPawn|ScriptedPawn]] to jump when it collides with the Jumper actor.

Possible uses could include making bots perform wall slides. :)!

==Properties ==

These are the properties and their default values:

; bOnceOnly = True/False : Determines whether the Jumper can be triggered more than once.
; JumpZ = Float : This is the height in [[Legacy:UU|UU]] the Pawn will Jump. Can be set higher than the Pawn's own maximum jump height (For UT bots this is 300 UU).
; LimitedToClass = Class : The [[Legacy:Actor|Actor]] [[Legacy:Class|Class]] that is affected by the Jumper. Should be a SubClass of [[Legacy:ScriptedPawn|ScriptedPawn]] and preferably something that jumps. (Usually not Slith or those weird squid things.) (''This doesn't actually appear to work'')

==Extending ==

Since the Class Selection (LimitedToClass) doesn't appear to work, I've had a go at making a new class of Jumper that affects bots in UT.

See [[Legacy:UT_Jumper|UT_Jumper]]

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3867</id>
      <timestamp>2003-12-09T06:09:52Z</timestamp>
      <contributor>
        <ip>SabbathCat</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Jumper }}

(Package: UnrealShare)

==Using Jumpers ==

Jumpers will trigger a [[Legacy:ScriptedPawn|ScriptedPawn]] to jump when it collides with the Jumper actor.

Possible uses could include making bots perform wall slides. :)!

==Properties ==

These are the properties and their default values:

; BOnceOnly = True/False : Determines whether the Jumper can be triggered more than once.
; JumpZ = Float : This is the height in UU the Pawn will Jump. Can be set higher than the Pawns own maximum jump height ( For UT bots this is 300uu).
; LimitedToClass = Class : The [[Legacy:Actor|Actor]] [[Legacy:Class|Class]] that is affected by the Jumper. Should be a SubClass of [[Legacy:ScriptedPawn|ScriptedPawn]] and preferably something that jumps. (Usually not Slith or those weird squid things.) (''This Doesn't actually appear to work'')

==Extending ==

Since the Class Selection (LimitedToClass) Doesn't appear to work, I've had a go at making a new class of Jumper that affects bots in UT.

See [[Legacy:UT_Jumper|UT_Jumper]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3868</id>
      <timestamp>2003-12-09T11:00:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Jumper (Package: UnrealShare)}}

Jumpers will trigger a [[Legacy:ScriptedPawn|ScriptedPawn]] to jump when it collides with the Jumper actor.

Possible uses could include making bots perform wall slides. :)!

==Properties ==

These are the properties and their default values:

; bOnceOnly = True/False : Determines whether the Jumper can be triggered more than once.
; JumpZ = Float : This is the height in [[Legacy:UU|UU]] the Pawn will Jump. Can be set higher than the Pawn's own maximum jump height (For UT bots this is 300 UU).
; LimitedToClass = Class : The [[Legacy:Actor|Actor]] [[Legacy:Class|Class]] that is affected by the Jumper. Should be a SubClass of [[Legacy:ScriptedPawn|ScriptedPawn]] and preferably something that jumps. (Usually not Slith or those weird squid things.) (''This doesn't actually appear to work'')

==Extending ==

Since the Class Selection (LimitedToClass) doesn't appear to work, I've had a go at making a new class of Jumper that affects bots in UT.

See [[Legacy:UT_Jumper|UT_Jumper]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Jumpzone</title>
    <id>1558</id>
    <revision>
      <id>3879</id>
      <timestamp>2007-11-19T15:07:26Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; JumpZone (custom)}}

Well basically, I was trying to find a way to let players jump higher, but not have to mess about with the grav and give too much aircontrol, so then i remembered a mutator called &quot;Jumpzone&quot;, it's a custom mutator (at least on the GOTY version of [[Legacy:UT|UT]]) so i grabbed the code from that mutator and slapped it into a new [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] class, Result!

Basically it gave every player a pair of boots that never ran out, which was basically what i had wanted.

I found a few other custom zones that claimed to do that sort of thing, but none worked, or they only worked if a player entered that zone from another, no good if you wanted the main area of the map to have this sort of thing

So i claim no credit for making this, i just put the code that was already there into a different actor class

==Script==

See [[Legacy:Create A Subclass|Create a subclass]] for instructions on using this in your map.

&lt;uscript&gt;
//=============================================================================
// JumpZone.
//=============================================================================
class JumpZone expands ZoneInfo;

function PostBeginPlay()
{
	Super.PostBeginPlay();
	if ( Level.Game.IsA('DeathMatchPlus') )
		DeathMatchPlus(Level.Game).bJumpMatch = true;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
	if ( Other.IsA('UT_JumpBoots') )
		return false;

	return true; 
}

&lt;/uscript&gt;

it works fine, quite useful as well, beside from the normal type uses, it can be a quick fix to turn a map built for translocator use, to a version that doesnt need a translocator, just by adding one zoneinfo, or converting a map that was designed for a low grav server, to be able to be used on a normal grav server.

Anyway, i hope you find this useful and that it saves you time, because...thats what the wiki is for :)

==Related Topics==
* [[Legacy:JumpMatch|JumpMatch]]
* [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]

==Discussion==

'''xX)(Xx:''' Just something simple, but i spent quite a long time trying to figure out how to do that kindof thing to my map, and the wiki had nothing! So maybe, someone else wanting the same sort of thing will find this here and it will help :)

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3880</id>
      <timestamp>2005-12-02T23:39:48Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; JumpZone (custom)}}

Well basically, I was trying to find a way to let players jump higher, but not have to mess about with the grav and give too much aircontrol, so then i remembered a mutator called &quot;Jumpzone&quot;, it's a custom mutator (at least on the GOTY version of [[Legacy:UT|UT]]) so i grabbed the code from that mutator and slapped it into a new [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] class, Result!

Basically it gave every player a pair of boots that never ran out, which was basically what i had wanted.

I found a few other custom zones that claimed to do that sort of thing, but none worked, or they only worked if a player entered that zone from another, no good if you wanted the main area of the map to have this sort of thing

So i claim no credit for making this, i just put the code that was already there into a different actor class

==Script==

See [[Legacy:Create A Subclass|Create a subclass]] for instructions on using this in your map.

&lt;uscript&gt;
//=============================================================================
// JumpZone.
//=============================================================================
class JumpZone expands ZoneInfo;

function PostBeginPlay()
{
	Super.PostBeginPlay();
	if ( Level.Game.IsA('DeathMatchPlus') )
		DeathMatchPlus(Level.Game).bJumpMatch = true;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
	if ( Other.IsA('UT_JumpBoots') )
		return false;

	return true; 
}

&lt;/uscript&gt;

it works fine, quite useful as well, beside from the normal type uses, it can be a quick fix to turn a map built for translocator use, to a version that doesnt need a translocator, just by adding one zoneinfo, or converting a map that was designed for a low grav server, to be able to be used on a normal grav server.

Anyway, i hope you find this useful and that it saves you time, because...thats what the wiki is for :)

==Related Topics==
* [[Legacy:JumpMatch|JumpMatch]]
* [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]

==Discussion==

'''xX)(Xx:''' Just something simple, but i spent quite a long time trying to figure out how to do that kindof thing to my map, and the wiki had nothing! So maybe, someone else wanting the same sort of thing will find this here and it will help :)

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:JustaAverageKid</title>
    <id>1541</id>
    <revision>
      <id>3840</id>
      <timestamp>2003-08-03T03:08:17Z</timestamp>
      <contributor>
        <ip>Niper</ip>
      </contributor>
      <comment>just fixing up my profile</comment>
      <text xml:space="preserve">==Everything..and all==

'''Email:''' cruelangelde@hotmail.com

'''AIM:''' FrozenTheory

'''MIRC:''' JaaK, [AA]Niper

'''Current Site:''' None

'''Specs:''' WinXP, 120 Gig HD, 512 Memory, 2.2 Ghz, GeForce4, and Cable Modem

'''Favorite Forums:''' My prime one is http://www.animeprophecy.net/ and sometimes http://forums.altimus-labs.com 

'''Favorite Games/Etc:''' Tactical Ops / Battlefield 1942

'''Something else here''' Maybe? something?...no?...ok..

'''Contributed to the Wiki:''' That [[Legacy:Blood Effects|blood effects]] tutorial

==JustaAverageKid, who the **** is that?==

I am now going by [AA]=Niper in all the IRCs I go to now, but I am in the channels #mentalmapping, and #aa2

===Can we leave?===

No! You must stay! Um...I'll give you money? No! WAIT!!

''Transmission Failed''

'''Tarquin:'''  hi &amp; welcome to the wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3841</id>
      <timestamp>2003-05-17T13:40:23Z</timestamp>
      <contributor>
        <ip>Pcp421257pcs.martnz01.ga.comcast.net</ip>
      </contributor>
      <comment>Updating my profile :)</comment>
      <text xml:space="preserve">==Everything..and all==

'''Email:''' cruelangelde@hotmail.com

'''AIM:''' FrozenTheory

'''MIRC:''' JaaK, =sMs=Niper

'''Current Site:''' None

'''Specs:''' WinXP, 120 Gig HD, 512 Memory, 2.2 Ghz, GeForce4, and Cable Modem

'''Favorite Forums:''' My prime one is http://www.animeprophecy.net/ and sometimes http://forums.altimus-labs.com 

'''Favorite Games/Etc:''' Tactical Ops

'''Something else here''' Maybe? something?...no?...ok..

'''Contributed to the Wiki:''' That [[Legacy:Blood Effects|blood effects]] tutorial

==JustaAverageKid, who the **** is that?==

I am now going by =sMs=Niper in all the IRCs I go to now, but I am in the channels #majestic12, #tacticalopsmapping, and #clansms

===Can we leave?===

No! You must stay! Um...I'll give you money? No! WAIT!!

''Transmission Failed''

'''Tarquin:'''  hi &amp; welcome to the wiki :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Juxtapose</title>
    <id>1566</id>
    <revision>
      <id>3897</id>
      <timestamp>2006-10-26T10:20:10Z</timestamp>
      <contributor>
        <ip>Juxtapose</ip>
      </contributor>
      <comment>Setting up my personal info</comment>
      <text xml:space="preserve">==Juxtapose==

I'm trying to do a project with AI in Unreal for my Machine Learning Class. This is my first attempt at doing anything with Unreal Code after playing UT since it came out. I've posted to the wiki a few times anonymously and I can't find them. If anyone knows what happened to my earlier edits I'd be much obliged to hear about it.

==Learning Onslaught==

Not much to say here. It's not working and internally still very screwed up.

The goal is to create an AI that learns from its actions based upon what happens shortly after the actions are taken. The game restricts the teams to five equally skilled bots. The Learning AI coordinates bot actions by prioritizing targets for squads. When the state of the game changes (a node gets build, one team loses e.g.) the game rewards or punishes the AI accordingly (before you ask, its with arbitrary values).

If anyone is further interested and acquainted with ML, I'm using Q-Learning so I don't need a model and calculating the state space across the status of individual nodes.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:K St TheJunior</title>
    <id>1572</id>
    <revision>
      <id>3909</id>
      <timestamp>2003-06-30T17:18:26Z</timestamp>
      <contributor>
        <ip>Tynan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">K_St_theJunior's New Mods Recruitment Page

(placed in the Inbox on Aug 2, 2002).

----

==K_St_theJunior's New Mods Recruitment Page ==

This is a page from K_St_theJunior (a slowly aging adult) for material that doesn't yet have a home, concerning some of my mod ideas. I'll start with my main two mod ideas of the moment, and seasoned contributors will at some point find the material a home elsewhere in the Wiki. 

==Suggestion 1 - A Ringworld-Inspired Mod for UT2003 ==

Hollywood has been talking for several years about possibly making a movie based on Larry Niven's mind-boggling &quot;Ringworld&quot; concept, but they never have gotten it all together. I think the UT mappers out there have a great opportunity to create a first-visualization of the &quot;Ringworld&quot; idea as a set of expansive 3D maps for UT2003 or even for the old UT. I'm imagining a great ring-shaped UT map which would be able to hold maybe 10 smaller location-maps within the circular interior side of the ring. I recently saw a great &quot;2001 Space Odyssey&quot; map that someone made which had two ring-shaped space stations within it for a CTF type game. The envisioned project would require a much bigger &quot;space station&quot; of a Ringworld-esque nature, rather like a mini-ringworld. I picture a gigantic map that incorporates 10 separate maps by 3 or 4 (or maybe by 10) different mappers, and it lets the player move quickly from one territorial map to the next as he travels along the inside of the ringworld. If someone could make a generic ringword map as a base and then use some coding talent, maybe it could even become a new gametype for UT where you can pre-select 10 of your favorite UT maps to be placed upon the inside rim of the mini-ringworld model that someone puts together. Here's a link to the [[Legacy:Ringworlds Visualization|Ringworlds Visualization]] page, not yet added. (By the way, my &quot;EarthWarrior&quot; skin might also fit in well with any mini-ringworld map-simulation's 3D adventures, since one of the characters in Niven's original novel was a heroic, ringworld-roaming adventurer named &quot;Seeker,&quot; and Niven has often maintained that he too is a big fan of the old &quot;pioneer s-f&quot; literature!)

'''Foxpaw:''' I had an idea the other day of how you could do this, but there is also a problem. The problem, which is probrably obvious to you - running one map is hard enough on the computer that's running it, let alone 10 at once! That's the only problem with it. Kind of. UT had support for a thing called a WarpZoneInfo which allowed players to travel from map to map by merely entering this special zone, which changed it's own appearance to mimic the next area. (essentially creating a seamless transition from one level to the next. Projectiles could even go through them!) In UT2003 it is not as powerful and can't go from level to level, however you could probrably do this slightly differently. Each server can only serve one level at a time. However, there is nothing stopping you from running 10 servers at a time on one machine and having the client switch servers through unrealscript when they walk into an appropriate area. There would be a slight delay as the server was switched, but it'd still work pretty good. (except for the CPU/RAM/bandwidth implications of running 10 servers on one machine)

==Suggestion 2 - A &quot;Colorful Warriors Mod&quot; for UT ==

I have just completed a umod SkinPack consisting of most of my &quot;Colorful Warriors&quot; skins (25 so far, v.2, with 4 never yet appearing at SkinCity), and it's already about 23 mb of stuff. It includes my GreenNali and WhiteNali skins, and even a &quot;GreenNaliGiants&quot; mutator that I've almost got right. If Atif Riaz (&quot;eagleAR&quot;) is able to finish fixing it for me, I'll be posting this through SkinCity as a gigantic SkinPack in just a couple more days. (If he can't get it fixed for me, I may have to request help on that aspect from other coders.) Anyway, I am visualizing the possibility of turning it into a mini-mod with the addition of my little mutator &amp;ndash; plus some flying vehicles, if someone volunteers to help! If some talented volunteer coder could assist me with the transformation, I'd like to also add one &quot;floating airboat&quot; model to it &amp;ndash; or better still, SEVERAL &quot;airboats&quot; of various sizes, ranging from small to larger. The smaller size would carry a player and maybe one bot aboard, visible in third-person view (via hotkey) with ChaosUT swords drawn and ready, or with ray-guns unholstered, letting them travel through the air, around any map, and attack from above whenever they come zooming down or jump off the airboat. The larger of the &quot;floating airboats&quot; (like big floating rafts or rowboats, but much more modern/futuristic in appearance) could hold maybe 5-10 players/bots aboard, all visible standing on the deck of the airboat with swords/ray-guns drawn and ready for action.

People seem to have a lot of fun using the Strangelove mutator to fly around, and the Quantum Fighter Jets mutator of Zencoder likewise, and they like the &quot;Mobile Forces&quot; idea of moving vehicles within UT. So I think this could be a lot of fun in a similar way, allowing fans to recreate the old &quot;pioneer s-f&quot; of the earliest s-f literature. If Zencoder or anyone else would be interested in working on this for me (as volunteer work, for free) and sharing the credit, please contact me and let me know. This will be a free-giveaway mod, and I'm poorer than dirt right now, so your only real payment would be in appreciation from me and other UT fans. But let me know if you could help! Anyone who submits a suitable-looking &quot;floating airboat&quot; mutator to me will be considered for inclusion within the future versions of the Colorful Warriors SkinPack/Mod, and I would be really happy to be able to include such flying vehicles within future versions of the umod. If you want some hints or pictures revealing more about what kind of appearance I'm aiming for in the desired airboats, I can send you that upon request.

Thanks in advance for any help that any coders or modelers out there might be able to provide.

----

'''Mychaeel:''' Hi K St TheJunior.  :-)  Welcome to the Wiki.  I noticed you added yourself to the [[Legacy:Project Contributors|Project Contributors]] list already.  I suggest you put your mod ideas on the [[Legacy:Mod Ideas|Mod Ideas]] page &amp;ndash; that's what it's for, after all.

'''K_St_theJunior:''' I'm just copying your format here &amp; don't have any idea what I'm doing in this effort at a response. Sorry, but I'm (don't tell) 51 and I haven't yet figured out how to add something to the [[Legacy:Mod Ideas|Mod Ideas]] page &amp;ndash; that's why I already sent these paragraphs initially to your &quot;Inbox&quot; page!! I was rather hoping that YOU GUYS would figure out how to put it in the right spot for me!! Thanks in advance for the help - I guess I must be reaching the &quot;doddering&quot; old stage or something.

'''Mychaeel:''' You can add stuff to the [[Legacy:Mod Ideas|Mod Ideas]] page the same way you added it to the [[Legacy:Inbox|Inbox]] &amp;ndash; just click &quot;Edit text of this page&quot; at the bottom of the page and insert your contribution wherever it fits.  For [[Legacy:Mod Ideas|Mod Ideas]] specifically, first create a link on [[Legacy:Mod Ideas|Mod Ideas]] to a ''subpage'' by prefixing the page name within the &lt;code&gt;[[Legacy:...|...]]&lt;/code&gt; with a slash (see [[Legacy:New Contributors Quick Start|New Contributors Quick Start]]), like &lt;code&gt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ringworld]]&lt;/code&gt;.  When you reload the edited [[Legacy:Mod Ideas|Mod Ideas]] page, you'll find the usual link with a trailing question mark that indicates a page that doesn't yet exist; click the question mark to create the page and enter text for it. &amp;ndash; In any case, don't worry that you break something.  Every old page revision is kept, and ''if'' something goes wrong editing a page, it's no big deal to restore the original content.  :-)

'''Mychaeel:''' This is completely up to you, of course, but don't you want to remove the content that has been moved to [[Legacy:Mod Ideas|Mod Ideas]] from your page?

'''Tarquin:''' Hello. Welcome to the wiki. :D

'''ZxAnPhOrIaN:''' Welcome aboard. ;) :tup:

'''K_St_theJunior:''' Thanks. I'm hoping I can entice some public-spirited or humanitarian coders and modelers in your modding community to help me with the labor end of my mod concepts. I'm a librarian, not a coder, so &quot;I need all the friends I can get,&quot; as Charlie Brown used to say! So far though, as of 12:31 a.m. on Saturday, Aug. 3, 2002, it looks like no one's even noticed the two new pages I added under &quot;Mod Ideas\New Gametypes\Ringworld&quot; and &quot;Mod Ideas\New Gametypes\ColorfulWarriors&quot;! Oh, well... maybe someone will add some thoughts to those pages by the end of the weekend... Anyway, thanks again for the welcome.

'''Tynan:''' Well, the Ringworld in the book was millions of kilometers accross and tens of thousands wide. You could do maps set on the ringworld, but you woudn't be going around the ring. Besides, have you ever played Halo? They directly copied the ringword idea and the entire game is set on a big spacering.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3910</id>
      <timestamp>2003-06-30T05:05:51Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">K_St_theJunior's New Mods Recruitment Page

(placed in the Inbox on Aug 2, 2002).

----

==K_St_theJunior's New Mods Recruitment Page ==

This is a page from K_St_theJunior (a slowly aging adult) for material that doesn't yet have a home, concerning some of my mod ideas. I'll start with my main two mod ideas of the moment, and seasoned contributors will at some point find the material a home elsewhere in the Wiki. 

==Suggestion 1 - A Ringworld-Inspired Mod for UT2003 ==

Hollywood has been talking for several years about possibly making a movie based on Larry Niven's mind-boggling &quot;Ringworld&quot; concept, but they never have gotten it all together. I think the UT mappers out there have a great opportunity to create a first-visualization of the &quot;Ringworld&quot; idea as a set of expansive 3D maps for UT2003 or even for the old UT. I'm imagining a great ring-shaped UT map which would be able to hold maybe 10 smaller location-maps within the circular interior side of the ring. I recently saw a great &quot;2001 Space Odyssey&quot; map that someone made which had two ring-shaped space stations within it for a CTF type game. The envisioned project would require a much bigger &quot;space station&quot; of a Ringworld-esque nature, rather like a mini-ringworld. I picture a gigantic map that incorporates 10 separate maps by 3 or 4 (or maybe by 10) different mappers, and it lets the player move quickly from one territorial map to the next as he travels along the inside of the ringworld. If someone could make a generic ringword map as a base and then use some coding talent, maybe it could even become a new gametype for UT where you can pre-select 10 of your favorite UT maps to be placed upon the inside rim of the mini-ringworld model that someone puts together. Here's a link to the [[Legacy:Ringworlds Visualization|Ringworlds Visualization]] page, not yet added. (By the way, my &quot;EarthWarrior&quot; skin might also fit in well with any mini-ringworld map-simulation's 3D adventures, since one of the characters in Niven's original novel was a heroic, ringworld-roaming adventurer named &quot;Seeker,&quot; and Niven has often maintained that he too is a big fan of the old &quot;pioneer s-f&quot; literature!)

'''Foxpaw:''' I had an idea the other day of how you could do this, but there is also a problem. The problem, which is probrably obvious to you - running one map is hard enough on the computer that's running it, let alone 10 at once! That's the only problem with it. Kind of. UT had support for a thing called a WarpZoneInfo which allowed players to travel from map to map by merely entering this special zone, which changed it's own appearance to mimic the next area. (essentially creating a seamless transition from one level to the next. Projectiles could even go through them!) In UT2003 it is not as powerful and can't go from level to level, however you could probrably do this slightly differently. Each server can only serve one level at a time. However, there is nothing stopping you from running 10 servers at a time on one machine and having the client switch servers through unrealscript when they walk into an appropriate area. There would be a slight delay as the server was switched, but it'd still work pretty good. (except for the CPU/RAM/bandwidth implications of running 10 servers on one machine)

==Suggestion 2 - A &quot;Colorful Warriors Mod&quot; for UT ==

I have just completed a umod SkinPack consisting of most of my &quot;Colorful Warriors&quot; skins (25 so far, v.2, with 4 never yet appearing at SkinCity), and it's already about 23 mb of stuff. It includes my GreenNali and WhiteNali skins, and even a &quot;GreenNaliGiants&quot; mutator that I've almost got right. If Atif Riaz (&quot;eagleAR&quot;) is able to finish fixing it for me, I'll be posting this through SkinCity as a gigantic SkinPack in just a couple more days. (If he can't get it fixed for me, I may have to request help on that aspect from other coders.) Anyway, I am visualizing the possibility of turning it into a mini-mod with the addition of my little mutator &amp;ndash; plus some flying vehicles, if someone volunteers to help! If some talented volunteer coder could assist me with the transformation, I'd like to also add one &quot;floating airboat&quot; model to it &amp;ndash; or better still, SEVERAL &quot;airboats&quot; of various sizes, ranging from small to larger. The smaller size would carry a player and maybe one bot aboard, visible in third-person view (via hotkey) with ChaosUT swords drawn and ready, or with ray-guns unholstered, letting them travel through the air, around any map, and attack from above whenever they come zooming down or jump off the airboat. The larger of the &quot;floating airboats&quot; (like big floating rafts or rowboats, but much more modern/futuristic in appearance) could hold maybe 5-10 players/bots aboard, all visible standing on the deck of the airboat with swords/ray-guns drawn and ready for action.

People seem to have a lot of fun using the Strangelove mutator to fly around, and the Quantum Fighter Jets mutator of Zencoder likewise, and they like the &quot;Mobile Forces&quot; idea of moving vehicles within UT. So I think this could be a lot of fun in a similar way, allowing fans to recreate the old &quot;pioneer s-f&quot; of the earliest s-f literature. If Zencoder or anyone else would be interested in working on this for me (as volunteer work, for free) and sharing the credit, please contact me and let me know. This will be a free-giveaway mod, and I'm poorer than dirt right now, so your only real payment would be in appreciation from me and other UT fans. But let me know if you could help! Anyone who submits a suitable-looking &quot;floating airboat&quot; mutator to me will be considered for inclusion within the future versions of the Colorful Warriors SkinPack/Mod, and I would be really happy to be able to include such flying vehicles within future versions of the umod. If you want some hints or pictures revealing more about what kind of appearance I'm aiming for in the desired airboats, I can send you that upon request.

Thanks in advance for any help that any coders or modelers out there might be able to provide.

----

'''Mychaeel:''' Hi K St TheJunior.  :-)  Welcome to the Wiki.  I noticed you added yourself to the [[Legacy:Project Contributors|Project Contributors]] list already.  I suggest you put your mod ideas on the [[Legacy:Mod Ideas|Mod Ideas]] page &amp;ndash; that's what it's for, after all.

'''K_St_theJunior:''' I'm just copying your format here &amp; don't have any idea what I'm doing in this effort at a response. Sorry, but I'm (don't tell) 51 and I haven't yet figured out how to add something to the [[Legacy:Mod Ideas|Mod Ideas]] page &amp;ndash; that's why I already sent these paragraphs initially to your &quot;Inbox&quot; page!! I was rather hoping that YOU GUYS would figure out how to put it in the right spot for me!! Thanks in advance for the help - I guess I must be reaching the &quot;doddering&quot; old stage or something.

'''Mychaeel:''' You can add stuff to the [[Legacy:Mod Ideas|Mod Ideas]] page the same way you added it to the [[Legacy:Inbox|Inbox]] &amp;ndash; just click &quot;Edit text of this page&quot; at the bottom of the page and insert your contribution wherever it fits.  For [[Legacy:Mod Ideas|Mod Ideas]] specifically, first create a link on [[Legacy:Mod Ideas|Mod Ideas]] to a ''subpage'' by prefixing the page name within the &lt;code&gt;[[Legacy:...|...]]&lt;/code&gt; with a slash (see [[Legacy:New Contributors Quick Start|New Contributors Quick Start]]), like &lt;code&gt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ringworld]]&lt;/code&gt;.  When you reload the edited [[Legacy:Mod Ideas|Mod Ideas]] page, you'll find the usual link with a trailing question mark that indicates a page that doesn't yet exist; click the question mark to create the page and enter text for it. &amp;ndash; In any case, don't worry that you break something.  Every old page revision is kept, and ''if'' something goes wrong editing a page, it's no big deal to restore the original content.  :-)

'''Mychaeel:''' This is completely up to you, of course, but don't you want to remove the content that has been moved to [[Legacy:Mod Ideas|Mod Ideas]] from your page?

'''Tarquin:''' Hello. Welcome to the wiki. :D

'''ZxAnPhOrIaN:''' Welcome aboard. ;) :tup:

'''K_St_theJunior:''' Thanks. I'm hoping I can entice some public-spirited or humanitarian coders and modelers in your modding community to help me with the labor end of my mod concepts. I'm a librarian, not a coder, so &quot;I need all the friends I can get,&quot; as Charlie Brown used to say! So far though, as of 12:31 a.m. on Saturday, Aug. 3, 2002, it looks like no one's even noticed the two new pages I added under &quot;Mod Ideas\New Gametypes\Ringworld&quot; and &quot;Mod Ideas\New Gametypes\ColorfulWarriors&quot;! Oh, well... maybe someone will add some thoughts to those pages by the end of the weekend... Anyway, thanks again for the welcome.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KActor</title>
    <id>1589</id>
    <revision>
      <id>3950</id>
      <timestamp>2005-04-09T03:20:20Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <comment>subclasses &amp; fixes</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; KActor}}

Use the KActor to make objects behave with [[Legacy:Karma|Karma]] real-world physics. KActors can be linked together with [[Legacy:KConstraint|KConstraint]] actors to form chains. To quote the script - ''Just a handy class to derive off to make physics objects.''

==Properties ==

===Main ===
; bool bOrientImpactEffect :  

; class&lt;[[Legacy:Actor|Actor]]&gt; ImpactEffect :  

; float ImpactInterval :  The frequency between inpact sounds

; array&lt;[[Legacy:Sound|Sound]]&gt; ImpactSounds :  List of sounds on actor impact. A random one will be played on an impact.

; float ImpactVolume :  Volume of the impact sounds

===Karma ===
; bool bKTakeShot :  

===Hidden ===
; float LastImpactTime :  Recorded time of the last impact

==Known Subclasses ==

 Engine.KActor
   +-Engine.[[Legacy:KConstraint|KConstraint]]
   |   +Engine.[[Legacy:KBSJoint|KBSJoint]]
   |   +Engine.[[Legacy:KCarWheelJoint|KCarWheelJoint]]
   |   +Engine.[[Legacy:KConeLimit|KConeLimit]]
   |   +Engine.[[Legacy:KHinge|KHinge]]
   +-Engine.[[Legacy:KTire|KTire]]
       +Vehicles.[[Legacy:BulldogTire|BulldogTire]]

==Related Topics ==
* [[Legacy:Karma|Karma]]
* [[Legacy:KActor Replication|KActor Replication]]:  Making KActors work better in multiplayer.
* [[Legacy:XTra_KrazzY/KActorSound|XTra_KrazzY/KActorSound]]:  Making KActors work realisticly with dynamic sounds.

----- -----
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3951</id>
      <timestamp>2004-07-17T12:34:06Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>[[Karma]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] }}

Use the KActor to make objects behave with [[Legacy:Karma|Karma]] real-world physics. KActors can be linked together with [[Legacy:KConstraint|KConstraint]] actors to form chains. To quote the script - ''Just a handy class to derive off to make physics objects.''

==Properties ==

===Main ===
; bool bOrientImpactEffect :  

; class&lt;[[Legacy:Actor|Actor]]&gt; ImpactEffect :  

; float ImpactInterval :  The frequency between inpact sounds

; array&lt;[[Legacy:Sound|Sound]]&gt; ImpactSounds :  List of sounds on actor impact. A random one will be played on an impact.

; float ImpactVolume :  Volume of the impact sounds

===Karma ===
; bool bKTakeShot :  

===Hidden ===
; float LastImpactTime :  Recorded time of the last impact

==Related Topics ==

8 [[Legacy:Karma|Karma]]
* [[Legacy:KActor Replication|KActor Replication]]:  Making KActors work better in multiplayer.
* [[Legacy:XTra_KrazzY/KActorSound|XTra_KrazzY/KActorSound]]:  Making KActors work realisticly with dynamic sounds.

----- -----
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KActor Replication</title>
    <id>1605</id>
    <revision>
      <id>3987</id>
      <timestamp>2007-11-19T15:10:21Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>made it into category journal (I'm doing this for Category Custom Class pages that are more works-in-progress with discussion rather than finished Classes.)</comment>
      <text xml:space="preserve">==How it works==

The code is based on the replication technique found in [[Legacy:KCar|KCar]]. Every tick, the server checks the location, linear and angular velocity of the actor, and if it differs much from when the last replication occured or if more time than MaxNetUpdateInterval has elapsed, the state of the actor on the server will be stored in a variable that is replicated to clients. On recieving the new state, the actor on the client will apply the new state to itself.

Note that RemoteRole is set to ROLE_SimulatedProxy, bNetNotify is set to true (so that PostNetReceive is called on the client) and the [[Legacy:KarmaParams|KarmaParams]] property bClientOnly is set to false (so Karma is simulated on the server as well as the client).

==The code==

&lt;uscript&gt;
class LawDogsKActor extends KActor
	placeable;

var() float MaxNetUpdateInterval;
var float NextNetUpdateTime;

var KRigidBodyState KState, KRepState;
var bool bNewKState;
var int StateCount, LastStateCount;

replication
{
	unreliable if(Role == ROLE_Authority)
		KRepState, StateCount;
}

function Tick(float Delta)
{
	PackState();
}

//Pack current state to be replicated
function PackState()
{
	local bool bChanged;

	if(!KIsAwake())
		return;

	KGetRigidBodyState(KState);

	bChanged = Level.TimeSeconds &gt; NextNetUpdateTime;
	bChanged = bChanged || VSize(KRBVecToVector(KState.Position) - KRBVecToVector(KRepState.Position)) &gt; 5;
	bChanged = bChanged || VSize(KRBVecToVector(KState.LinVel) - KRBVecToVector(KRepState.LinVel)) &gt; 1;
	bChanged = bChanged || VSize(KRBVecToVector(KState.AngVel) - KRBVecToVector(KRepState.AngVel)) &gt; 1;

	if(bChanged)
	{
		NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
		KRepState = KState;
		StateCount++;
	}
	else
		return;
}

//New state recieved.
simulated event PostNetReceive()
{
	if(StateCount == LastStateCount)
		return;
}

//Apply new state.
simulated event bool KUpdateState(out KRigidBodyState newState)
{
	//This should never get called on the server - but just in case!
	if(Role == ROLE_Authority || StateCount == LastStateCount)
		return false;
		
	//Apply received data as new position of actor.
	newState = KRepState;
	StateCount = LastStateCount;

	return true;
}

defaultproperties
{
	MaxNetUpdateInterval=0.5

	StaticMesh=StaticMesh'MiscPhysicsMeshes.Barrels.Barrel'

    Begin Object Class=KarmaParams Name=KarmaParams0
        KMass=0.5
        bHighDetailOnly=False
        bKAllowRotate=True
        KFriction=0.2
        KRestitution=0.5
        KImpactThreshold=1000.0
        bClientOnly=False
        Name=&quot;KarmaParams0&quot;
    End Object
	KParams=KarmaParams'KarmaParams0'

	RemoteRole=ROLE_SimulatedProxy
	bNetNotify=True
}&lt;/uscript&gt;

==Related Topics==
* [[Legacy:KActor|KActor]]

'''Foxpaw''': I think this page could be called something else.. KActor is just a class that you can use to make karma physics objects.. kind of like staticmeshactor. Any actor can have a static mesh, and any actor can use Karma physics.. so I think this should have a more general name seeing as this applies to more than just KActors.

'''Kaoh''': Yeah but the replication technique is special for karma actors. Its not needed for other actors, So I feel it applies.

'''Foxpaw:''' What I'm saying is, KActor is just a class that happens to use Karma physics. There are many karma actors that aren't KActors, so I think a more general name would be better.

'''UsAaR33:''' Just wondering.. what is the point of that PostNetReceive() event?

'''Foxpaw:''' Err.. hmm. I hate to pick holes in someone's work, but you're right. In fact, that code is going to produce slide-show-esque physics client side, (as the physics never actually simulate client side, they get reset to the most recent server version every time the physics is simulated) and err, yeah. It's not doing half the stuff that it looks like it should be doing. However, if it was tested on the same machine, (so no latency or bandwidth limits) it would APPEAR as though it was working perfectly.

Here's how I would have done it: (note that this code has not been tested or compiled in any way, I'm going on experience here. Some tweaks may be necessary. I also removed the &quot;threshold&quot; stuff, but you could put that back in if you really felt it was necessary.)

&lt;uscript&gt;
class ReplicatedKActor extends KActor placeable;

struct RepState
{
  var KRigidBodyState State;
  var byte	      Timestamp;
};

var bool     bUpdateState;
var byte     LastTimeStamp;
var RepState RepKState;

replication
{
  unreliable if(Role == ROLE_Authority)
    RepKState;
}

function Tick(float Delta)
{
  Super.Tick( Delta );
  
  PackState();
}

//Pack current state to be replicated
function PackState()
{
  local bool bChanged;
  local KRigidBodyState KState;

  if(!KIsAwake())
    return;

  KGetRigidBodyState(KState);
  if ( KState == RepKState.State )
    return;

  RepKState.State = KState;
  RepKState.TimeStamp++;
}

//New state recieved.
simulated event PostNetReceive()
{
  Super.PostNetRecieve();
  
  if ( RepKState.TimeStamp != LastTimeStamp )
  {
    LastTimeStamp = RepKState.TimeStamp;
    bUpdateState = true;
  }
}

//Apply new state.
simulated event bool KUpdateState(out KRigidBodyState newState)
{
  Super.KUpdateState( newState );
 
  if ( bUpdateState )
  {
    newState = KRepState;
    bUpdateState = false;
    return true;
  }

  return false;
}

defaultproperties
{
  StaticMesh=StaticMesh'MiscPhysicsMeshes.Barrels.Barrel'

  Begin Object Class=KarmaParams Name=KarmaParams0
    KMass=0.5
    bHighDetailOnly=False
    bKAllowRotate=True
    KFriction=0.2
    KRestitution=0.5
    KImpactThreshold=1000.0
    bClientOnly=False
    Name=&quot;KarmaParams0&quot;
  End Object
  KParams=KarmaParams'KarmaParams0'

  RemoteRole=ROLE_SimulatedProxy
  bNetNotify=True
}
&lt;/uscript&gt;

'''CIpen:'''  Well I don't mean to break anyone's hearts but KCar isn't a KActor.  KCar extends from KVehicle, and KVehicle extends from Vehicle.  Lastly, Vehicle extends from Pawn.

Even though it's not in KCar, I found this code that might help in SCar:

&lt;uscript&gt;
cpptext
{
#ifdef WITH_KARMA
	// Actor interface.
	virtual UBOOL Tick(FLOAT DeltaTime, enum ELevelTick TickType);
	virtual void PostNetReceive();

	// SVehicle interface.
	virtual void UpdateVehicle(FLOAT DeltaTime);

	// SCar interface.
	virtual void ProcessCarInput();
	virtual void ChangeGear(UBOOL bReverse);
	virtual void PackState();
#endif
}
&lt;/uscript&gt;

I find this interesting because I Have tried to make a rock that you could shoot and blow up(had health).

'''Solid Snake:''' This was written before SCar existed, aka UT2003. The above solution allowed for Karma to be replicated over the network thus allowing it to be used in network games for whatever reason you needed it for.

'''ShrapnelMagnet:''' I was hoping to replicate a simple box-like KActor in Unreal Tournament 2004. I'd like players to be able to roll boxes around in a little game, but I'm having trouble getting the KActor to replicate across the network. I see a lot of code here, but not being a big coder myself, I'm not sure what works or what doesn't. Any help would be appreciated, thanks.

'''EricBlade:''' Well, I have tested the above 2 sets of code, as well as the code from a package I found called &quot;GoodKarma&quot;.. the &quot;GoodKarma&quot; developer appears to have disappeared off the face of the planet about a year or so ago, along with the small handful of users who claimed they'd seen it work.  Not a bit of this seems to actually function, at least on engine build 2226.  As far as I can tell, when running as dedicated server, karma is completely not simulated on the server.  Using all three of the codes that I mentioned above, placing the modified kactor in a level, and using the following:

&lt;uscript&gt;
simulated function DoPush() {
	local vector StartTrace, EndTrace, HitLocation, HitNormal;
	local Actor hit;

	StartTrace = Location + EyePosition();
	EndTrace = StartTrace + 196 * vector(Controller.GetViewRotation());
	hit = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);

	Debug(self$&quot;: I hit a &quot;$hit);
	if(hit != None) {
		hit.KWake();
	   hit.KAddImpulse(34000 * (-hitnormal), location);
	   bumpfactor = 7; // we add several wait-ticks before next bump, so we aren't adding that to it too
	}
}
&lt;/uscript&gt;

results in my log file on the server saying that my Pawn hit the &quot;ball&quot;, accompanied by absolutely nothing.  Same thing works in single player, with any of those codes.  Logging the &quot;ball&quot;'s location property every tick, tells me that it's not moving anywhere, either.  If I shoot it, it starts moving on the client, but not on the server.

... and right after posting that, I had an apparently brilliant idea.  Setting bClientOnly = false in DefaultProps doesn't work, but it does work if done in PreBeginPlay().  This results in the physics being simulated completely seperately on both ends.   The code from the LawDogsKActor seems to get them following each other for the first tick or so, but very quickly you realise that the server has your KActor in a totally different place than the client put it.  Foxpaw's seems to lock the KActor in place on the server, while making the client simulate somewhat slowly.  The &quot;GoodKarma&quot; code has no effect over and above LawDogs.  

'''EricBlade:''' Well, I spent all night playing with this, and thought I'd put up what I have, and see if anyone had any further suggestions.  It's sort of a combination of all the code i've seen for dealing with this.. I was hoping to get something forgiveably accurate enough that I could do a little one-on-one soccer with, but unfortunatly, I don't think it's possible to get anywhere near that accurate.. but I will definitely take suggestions.  The following code does not have a horribly lagging simulation, but at reasonably decent speeds using my test-ball (the severed head mesh from Land of the Dead), a moment or two after kicking it, the ball will snap into the place the server simulated it at, which is usually fairly close to where it came to rest on the client, however it can sometimes be quite a bit away.  I also just now tested this on a test map that had about 6 of these on it.  Then with only 2.  Having more than one of these on a level causes absolute chaos, with the objects seemingly randomly warping about in the level.

&lt;uscript&gt;
class Ball extends Actor;

var float MaxNetUpdateInterval;
var float NextNetUpdateTime;
var float LastUpdateTime;

var KRigidBodyState KState;
var bool bChanged;

var int counter;


struct repinfo {
	var KRigidBodyState state;
	var float timestamp;
};

var repinfo KRepState;

replication
{
    unreliable if(Role == ROLE_Authority)
        KRepState, bChanged;
}

function Tick(float Delta)
{
	if(Role == ROLE_Authority) {
	    if(KIsAwake()) {
	        counter = 30;
	    } else {
	        if(counter &gt; 0) counter--;
	    }
    	PackState();
    }
}

function PackState()
{
    if(counter &lt; 1 &amp;&amp; !KIsAwake())
	    return;
    bChanged = false;
    KGetRigidBodyState(KState);

    if(VSize(KRBVecToVector(KState.Position) - KRBVecToVector(KRepState.state.Position)) &gt; 10) {
    	//log(self@&quot;Position Change&quot;);
        bChanged = true;
    }
    if(VSize(KRBVecToVector(KState.LinVel) - KRBVecToVector(KRepState.state.LinVel)) &gt; 10) {
        //log(self@&quot;LinVel Change&quot;);
    	bChanged = true;
    }
    if(VSize(KRBVecToVector(KState.AngVel) - KRBVecToVector(KRepState.state.AngVel)) &gt; 10) {
    	//log(self@&quot;AngVel&quot;);
        bChanged = true;
    }
    if(bChanged == false &amp;&amp; Level.TimeSeconds &gt; NextNetUpdateTime) {
    	//log(self@&quot;MaxNetUpdateInterval reached&quot;);
        bChanged = true;
    }
    if(bChanged == true) {
        KRepState.state = KState;
        NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
		KRepState.timestamp = Level.TimeSeconds;
	}

}

simulated event bool KUpdateState(out KRigidBodyState newState)
{
    if(Role == ROLE_Authority)
        return false;
    if(bChanged == false) return false;
    if(LastUpdateTime &gt; KRepState.timestamp) return false;
    newState = KRepState.state;
    LastUpdateTime = KRepState.timestamp;
	bChanged = false;
    return true;
}

simulated event PreBeginPlay() {
	KarmaParams(KParams).bClientOnly = false;
}


DefaultProperties
{
	MaxNetUpdateInterval=0.2
	bBlockZeroExtentTraces = true
	bBlockNonZeroExtentTraces = true
    //NetUpdateFrequency = 1
	//bUpdateSimulatedPosition=true
	//bGameRelevant=true
	bAlwaysRelevant=true
	bCollideWorld=true
	bNetNotify=true
	RemoteRole=ROLE_SimulatedProxy
	DrawScale=2.75
	Physics=PHYS_Karma
	Begin Object Class=KarmaParams Name=KParams0
		bHighDetailOnly			=	False
		bKNonSphericalInertia	=	False
		KActorGravScale			=	0.55
		KAngularDamping			=	0.2
		KBuoyancy				=	1.01
		KLinearDamping			=	0.2
		KMass					=	0.45
		KStartEnabled			=	False
		KFriction				=	0.40
		KRestitution			=	0.50
		KImpactThreshold		=	5
	End Object
	KParams=KarmaParams'KParams0'
	StaticMesh=StaticMesh'UZGMeshes.Body.Head'
	DrawType=DT_StaticMesh
//	 bNoDelete=True
	 bCollideActors=True
	 bBlockActors=True
	 bBlockPlayers=True
	 bProjTarget=True
	 bBlockKarma=True
}
&lt;/uscript&gt;

----

[[:Category:Legacy Refactor Me]]&lt;br /&gt;[[:Category:Legacy Journal]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; If this really is stuff unique to [[Legacy:Karma|Karma]] and [[Legacy:Replication|Replication]] then [[Legacy:Replication/Karma|Replication/Karma]], [[Legacy:Karma/Replication|Karma/Replication]] or [[Legacy:Karma Replication|Karma Replication]] might be a better location for this. Otherwise this should probably be folded into the grand topic of [[Legacy:Replication|Replication]]. See [[Legacy:Replication/Discussing|Replication/Discussing]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3988</id>
      <timestamp>2006-11-26T18:00:35Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==How it works==

The code is based on the replication technique found in [[Legacy:KCar|KCar]]. Every tick, the server checks the location, linear and angular velocity of the actor, and if it differs much from when the last replication occured or if more time than MaxNetUpdateInterval has elapsed, the state of the actor on the server will be stored in a variable that is replicated to clients. On recieving the new state, the actor on the client will apply the new state to itself.

Note that RemoteRole is set to ROLE_SimulatedProxy, bNetNotify is set to true (so that PostNetReceive is called on the client) and the [[Legacy:KarmaParams|KarmaParams]] property bClientOnly is set to false (so Karma is simulated on the server as well as the client).

==The code==

&lt;uscript&gt;
class LawDogsKActor extends KActor
	placeable;

var() float MaxNetUpdateInterval;
var float NextNetUpdateTime;

var KRigidBodyState KState, KRepState;
var bool bNewKState;
var int StateCount, LastStateCount;

replication
{
	unreliable if(Role == ROLE_Authority)
		KRepState, StateCount;
}

function Tick(float Delta)
{
	PackState();
}

//Pack current state to be replicated
function PackState()
{
	local bool bChanged;

	if(!KIsAwake())
		return;

	KGetRigidBodyState(KState);

	bChanged = Level.TimeSeconds &gt; NextNetUpdateTime;
	bChanged = bChanged || VSize(KRBVecToVector(KState.Position) - KRBVecToVector(KRepState.Position)) &gt; 5;
	bChanged = bChanged || VSize(KRBVecToVector(KState.LinVel) - KRBVecToVector(KRepState.LinVel)) &gt; 1;
	bChanged = bChanged || VSize(KRBVecToVector(KState.AngVel) - KRBVecToVector(KRepState.AngVel)) &gt; 1;

	if(bChanged)
	{
		NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
		KRepState = KState;
		StateCount++;
	}
	else
		return;
}

//New state recieved.
simulated event PostNetReceive()
{
	if(StateCount == LastStateCount)
		return;
}

//Apply new state.
simulated event bool KUpdateState(out KRigidBodyState newState)
{
	//This should never get called on the server - but just in case!
	if(Role == ROLE_Authority || StateCount == LastStateCount)
		return false;
		
	//Apply received data as new position of actor.
	newState = KRepState;
	StateCount = LastStateCount;

	return true;
}

defaultproperties
{
	MaxNetUpdateInterval=0.5

	StaticMesh=StaticMesh'MiscPhysicsMeshes.Barrels.Barrel'

    Begin Object Class=KarmaParams Name=KarmaParams0
        KMass=0.5
        bHighDetailOnly=False
        bKAllowRotate=True
        KFriction=0.2
        KRestitution=0.5
        KImpactThreshold=1000.0
        bClientOnly=False
        Name=&quot;KarmaParams0&quot;
    End Object
	KParams=KarmaParams'KarmaParams0'

	RemoteRole=ROLE_SimulatedProxy
	bNetNotify=True
}&lt;/uscript&gt;

==Related Topics==
* [[Legacy:KActor|KActor]]

'''Foxpaw''': I think this page could be called something else.. KActor is just a class that you can use to make karma physics objects.. kind of like staticmeshactor. Any actor can have a static mesh, and any actor can use Karma physics.. so I think this should have a more general name seeing as this applies to more than just KActors.

'''Kaoh''': Yeah but the replication technique is special for karma actors. Its not needed for other actors, So I feel it applies.

'''Foxpaw:''' What I'm saying is, KActor is just a class that happens to use Karma physics. There are many karma actors that aren't KActors, so I think a more general name would be better.

'''UsAaR33:''' Just wondering.. what is the point of that PostNetReceive() event?

'''Foxpaw:''' Err.. hmm. I hate to pick holes in someone's work, but you're right. In fact, that code is going to produce slide-show-esque physics client side, (as the physics never actually simulate client side, they get reset to the most recent server version every time the physics is simulated) and err, yeah. It's not doing half the stuff that it looks like it should be doing. However, if it was tested on the same machine, (so no latency or bandwidth limits) it would APPEAR as though it was working perfectly.

Here's how I would have done it: (note that this code has not been tested or compiled in any way, I'm going on experience here. Some tweaks may be necessary. I also removed the &quot;threshold&quot; stuff, but you could put that back in if you really felt it was necessary.)

&lt;uscript&gt;
class ReplicatedKActor extends KActor placeable;

struct RepState
{
  var KRigidBodyState State;
  var byte	      Timestamp;
};

var bool     bUpdateState;
var byte     LastTimeStamp;
var RepState RepKState;

replication
{
  unreliable if(Role == ROLE_Authority)
    RepKState;
}

function Tick(float Delta)
{
  Super.Tick( Delta );
  
  PackState();
}

//Pack current state to be replicated
function PackState()
{
  local bool bChanged;
  local KRigidBodyState KState;

  if(!KIsAwake())
    return;

  KGetRigidBodyState(KState);
  if ( KState == RepKState.State )
    return;

  RepKState.State = KState;
  RepKState.TimeStamp++;
}

//New state recieved.
simulated event PostNetReceive()
{
  Super.PostNetRecieve();
  
  if ( RepKState.TimeStamp != LastTimeStamp )
  {
    LastTimeStamp = RepKState.TimeStamp;
    bUpdateState = true;
  }
}

//Apply new state.
simulated event bool KUpdateState(out KRigidBodyState newState)
{
  Super.KUpdateState( newState );
 
  if ( bUpdateState )
  {
    newState = KRepState;
    bUpdateState = false;
    return true;
  }

  return false;
}

defaultproperties
{
  StaticMesh=StaticMesh'MiscPhysicsMeshes.Barrels.Barrel'

  Begin Object Class=KarmaParams Name=KarmaParams0
    KMass=0.5
    bHighDetailOnly=False
    bKAllowRotate=True
    KFriction=0.2
    KRestitution=0.5
    KImpactThreshold=1000.0
    bClientOnly=False
    Name=&quot;KarmaParams0&quot;
  End Object
  KParams=KarmaParams'KarmaParams0'

  RemoteRole=ROLE_SimulatedProxy
  bNetNotify=True
}
&lt;/uscript&gt;

'''CIpen:'''  Well I don't mean to break anyone's hearts but KCar isn't a KActor.  KCar extends from KVehicle, and KVehicle extends from Vehicle.  Lastly, Vehicle extends from Pawn.

Even though it's not in KCar, I found this code that might help in SCar:

&lt;uscript&gt;
cpptext
{
#ifdef WITH_KARMA
	// Actor interface.
	virtual UBOOL Tick(FLOAT DeltaTime, enum ELevelTick TickType);
	virtual void PostNetReceive();

	// SVehicle interface.
	virtual void UpdateVehicle(FLOAT DeltaTime);

	// SCar interface.
	virtual void ProcessCarInput();
	virtual void ChangeGear(UBOOL bReverse);
	virtual void PackState();
#endif
}
&lt;/uscript&gt;

I find this interesting because I Have tried to make a rock that you could shoot and blow up(had health).

'''Solid Snake:''' This was written before SCar existed, aka UT2003. The above solution allowed for Karma to be replicated over the network thus allowing it to be used in network games for whatever reason you needed it for.

'''ShrapnelMagnet:''' I was hoping to replicate a simple box-like KActor in Unreal Tournament 2004. I'd like players to be able to roll boxes around in a little game, but I'm having trouble getting the KActor to replicate across the network. I see a lot of code here, but not being a big coder myself, I'm not sure what works or what doesn't. Any help would be appreciated, thanks.

'''EricBlade:''' Well, I have tested the above 2 sets of code, as well as the code from a package I found called &quot;GoodKarma&quot;.. the &quot;GoodKarma&quot; developer appears to have disappeared off the face of the planet about a year or so ago, along with the small handful of users who claimed they'd seen it work.  Not a bit of this seems to actually function, at least on engine build 2226.  As far as I can tell, when running as dedicated server, karma is completely not simulated on the server.  Using all three of the codes that I mentioned above, placing the modified kactor in a level, and using the following:

&lt;uscript&gt;
simulated function DoPush() {
	local vector StartTrace, EndTrace, HitLocation, HitNormal;
	local Actor hit;

	StartTrace = Location + EyePosition();
	EndTrace = StartTrace + 196 * vector(Controller.GetViewRotation());
	hit = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);

	Debug(self$&quot;: I hit a &quot;$hit);
	if(hit != None) {
		hit.KWake();
	   hit.KAddImpulse(34000 * (-hitnormal), location);
	   bumpfactor = 7; // we add several wait-ticks before next bump, so we aren't adding that to it too
	}
}
&lt;/uscript&gt;

results in my log file on the server saying that my Pawn hit the &quot;ball&quot;, accompanied by absolutely nothing.  Same thing works in single player, with any of those codes.  Logging the &quot;ball&quot;'s location property every tick, tells me that it's not moving anywhere, either.  If I shoot it, it starts moving on the client, but not on the server.

... and right after posting that, I had an apparently brilliant idea.  Setting bClientOnly = false in DefaultProps doesn't work, but it does work if done in PreBeginPlay().  This results in the physics being simulated completely seperately on both ends.   The code from the LawDogsKActor seems to get them following each other for the first tick or so, but very quickly you realise that the server has your KActor in a totally different place than the client put it.  Foxpaw's seems to lock the KActor in place on the server, while making the client simulate somewhat slowly.  The &quot;GoodKarma&quot; code has no effect over and above LawDogs.  

'''EricBlade:''' Well, I spent all night playing with this, and thought I'd put up what I have, and see if anyone had any further suggestions.  It's sort of a combination of all the code i've seen for dealing with this.. I was hoping to get something forgiveably accurate enough that I could do a little one-on-one soccer with, but unfortunatly, I don't think it's possible to get anywhere near that accurate.. but I will definitely take suggestions.  The following code does not have a horribly lagging simulation, but at reasonably decent speeds using my test-ball (the severed head mesh from Land of the Dead), a moment or two after kicking it, the ball will snap into the place the server simulated it at, which is usually fairly close to where it came to rest on the client, however it can sometimes be quite a bit away.  I also just now tested this on a test map that had about 6 of these on it.  Then with only 2.  Having more than one of these on a level causes absolute chaos, with the objects seemingly randomly warping about in the level.

&lt;uscript&gt;
class Ball extends Actor;

var float MaxNetUpdateInterval;
var float NextNetUpdateTime;
var float LastUpdateTime;

var KRigidBodyState KState;
var bool bChanged;

var int counter;


struct repinfo {
	var KRigidBodyState state;
	var float timestamp;
};

var repinfo KRepState;

replication
{
    unreliable if(Role == ROLE_Authority)
        KRepState, bChanged;
}

function Tick(float Delta)
{
	if(Role == ROLE_Authority) {
	    if(KIsAwake()) {
	        counter = 30;
	    } else {
	        if(counter &gt; 0) counter--;
	    }
    	PackState();
    }
}

function PackState()
{
    if(counter &lt; 1 &amp;&amp; !KIsAwake())
	    return;
    bChanged = false;
    KGetRigidBodyState(KState);

    if(VSize(KRBVecToVector(KState.Position) - KRBVecToVector(KRepState.state.Position)) &gt; 10) {
    	//log(self@&quot;Position Change&quot;);
        bChanged = true;
    }
    if(VSize(KRBVecToVector(KState.LinVel) - KRBVecToVector(KRepState.state.LinVel)) &gt; 10) {
        //log(self@&quot;LinVel Change&quot;);
    	bChanged = true;
    }
    if(VSize(KRBVecToVector(KState.AngVel) - KRBVecToVector(KRepState.state.AngVel)) &gt; 10) {
    	//log(self@&quot;AngVel&quot;);
        bChanged = true;
    }
    if(bChanged == false &amp;&amp; Level.TimeSeconds &gt; NextNetUpdateTime) {
    	//log(self@&quot;MaxNetUpdateInterval reached&quot;);
        bChanged = true;
    }
    if(bChanged == true) {
        KRepState.state = KState;
        NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
		KRepState.timestamp = Level.TimeSeconds;
	}

}

simulated event bool KUpdateState(out KRigidBodyState newState)
{
    if(Role == ROLE_Authority)
        return false;
    if(bChanged == false) return false;
    if(LastUpdateTime &gt; KRepState.timestamp) return false;
    newState = KRepState.state;
    LastUpdateTime = KRepState.timestamp;
	bChanged = false;
    return true;
}

simulated event PreBeginPlay() {
	KarmaParams(KParams).bClientOnly = false;
}


DefaultProperties
{
	MaxNetUpdateInterval=0.2
	bBlockZeroExtentTraces = true
	bBlockNonZeroExtentTraces = true
    //NetUpdateFrequency = 1
	//bUpdateSimulatedPosition=true
	//bGameRelevant=true
	bAlwaysRelevant=true
	bCollideWorld=true
	bNetNotify=true
	RemoteRole=ROLE_SimulatedProxy
	DrawScale=2.75
	Physics=PHYS_Karma
	Begin Object Class=KarmaParams Name=KParams0
		bHighDetailOnly			=	False
		bKNonSphericalInertia	=	False
		KActorGravScale			=	0.55
		KAngularDamping			=	0.2
		KBuoyancy				=	1.01
		KLinearDamping			=	0.2
		KMass					=	0.45
		KStartEnabled			=	False
		KFriction				=	0.40
		KRestitution			=	0.50
		KImpactThreshold		=	5
	End Object
	KParams=KarmaParams'KParams0'
	StaticMesh=StaticMesh'UZGMeshes.Body.Head'
	DrawType=DT_StaticMesh
//	 bNoDelete=True
	 bCollideActors=True
	 bBlockActors=True
	 bBlockPlayers=True
	 bProjTarget=True
	 bBlockKarma=True
}
&lt;/uscript&gt;

----

[[:Category:Legacy Custom Class]] &lt;br /&gt;[[:Category:Legacy Tutorial]]&lt;br /&gt;[[:Category:Legacy Refactor Me]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; If this really is stuff unique to [[Legacy:Karma|Karma]] and [[Legacy:Replication|Replication]] then [[Legacy:Replication/Karma|Replication/Karma]], [[Legacy:Karma/Replication|Karma/Replication]] or [[Legacy:Karma Replication|Karma Replication]] might be a better location for this. Otherwise this should probably be folded into the grand topic of [[Legacy:Replication|Replication]]. See [[Legacy:Replication/Discussing|Replication/Discussing]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KBSJoint</title>
    <id>1591</id>
    <revision>
      <id>3955</id>
      <timestamp>2003-08-17T02:23:26Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Rewritten.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; [[Legacy:KBSJoint|KBSJoint]] }}

The KBSJoint is a type of [[Legacy:Karma|Karma]] constraint. Used in conjunction with actions using PHYS_Karma, Karma constraints can be used to make more realistic and more believable simulations. See the base [[Legacy:KConstraint|KConstraint]] page for more information on basic constraint properties and how to set them up.

The KBSJoint simulates a &quot;ball and socket&quot; style of joint. The two actors constrained by this actor will be able to pivot around the point determined by the location of this actor. More technically speaking, the actors constrained are not able to change their distance from this constraint or their facing relative to it, though they may rotate freely around the constraint actor.

This type of constraint has no special parameters to set and is pretty much &quot;plug and play.&quot; Follow the directions on the [[Legacy:KConstraint|KConstraint]] page to find how to set up a constraint between two actors, or between an actor and the world.</text>
    </revision>
    <revision>
      <id>3956</id>
      <timestamp>2003-03-26T01:05:23Z</timestamp>
      <contributor>
        <ip>Violator</ip>
      </contributor>
      <comment>KBSJoint class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; [[Legacy:KBSJoint|KBSJoint]] }}

Placable subclass of [[Legacy:KConstraint|KConstraint]]. Use this actor to join two Karma Actors (KActors) together to make a hinge. This allows you make funky swinging lights and stuff which will move when a force is applied (eg a rocket). 

==Additional Resources==

There's a good tutorial on building karma systems here -http://www.leveldesigner.com/index.php?action=doc&amp;ID=161</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KCar</title>
    <id>1583</id>
    <revision>
      <id>3937</id>
      <timestamp>2008-01-19T15:51:21Z</timestamp>
      <contributor>
        <ip>78-56-57-236.ip.zebra.lt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle (UT2003)|KVehicle]] &gt;&gt; KCar (Package: Vehicles)}}
:

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; KCar (Package: Vehicles)}}

A &quot;karma-based&quot; vehicle.

'''Note:''' This class is obsolete in UT2004. You should use an [[Legacy:SVehicle|SVehicle]] subclass instead.

==Properties==

===Editable===

*FrontTireClass (&lt;[[Legacy:KTire|KTire]]&gt;)
*RearTireClass (&lt;[[Legacy:KTire|KTire]]&gt;)
*WheelFrontAlong (const float)
*WheelFrontAcross (const float)
*WheelRearAlong (const float)
*WheelRearAcross (const float)
*WheelVert (const float)
*MaxSteerAngle (Float)
::(65535 = 360 deg)
*MaxBrakeTorque (Float)
::Braking torque applied to all four wheels. Positive only.
*TorqueSplit (Float)
::front/rear drive torque split. 1 is fully RWD, 0 is fully FWD. 0.5 is standard 4WD.

*SteerPropGap (Float)
*SteerTorque (Float)
*SteerSpeed (Float)

*SuspStiffness (Float)
*SuspDamping (Float)
*SuspHighLimit (Float)
*SuspLowLimit (Float)
*SuspRef (Float)

*TireRollFriction (Float)
*TireLateralFriction (Float)
*TireRollSlip (Float)
*TireLateralSlip (Float)
*TireMinSlip (Float)
*TireSlipRate (Float)
*TireSoftness (Float)
*TireAdhesion (Float)
*TireRestitution (Float)
*TireMass (Float)

*HandbrakeThresh (Float)
::Speed above which handbrake comes on =]
*TireHandbrakeSlip (Float)
::Additional lateral slip when handbrake engaged
*TireHandbrakeFriction (Float)
::Additional lateral friction when handbrake engaged

*ChassisMass (Float)

*StopThreshold (Float)
::Forward velocity under which brakes become drive.

*TorqueCurve (InterpCurve)
::Engine RPM in, Torque out.

*FlipTorque (Float);
*FlipTime (Float);

*MaxNetUpdateInterval (Float);

===Not editable===

*frontLeft ([[Legacy:KTire|KTire]])
*frontRight ([[Legacy:KTire|KTire]])
*rearLeft ([[Legacy:KTire|KTire]])
*rearRight ([[Legacy:KTire|KTire]])

Gear (int)
::1 is forward, -1 is backward. Currently symmetric power/torque curve
*WheelSpinSpeed (Float)
::Current (averaged) RPM of rear wheels
*ForwardVel (Float)
::Component of cars velocity in its forward direction.
*bIsInverted (Bool)
::Updated in Tick - indicates if car is not upright.
*IsDriving (Bool)
*FlipTimeLeft (Float)
*NextNetUpdateTime (Float)
::Next time we should force an update of vehicles state.
*OutputBrake (Bool)
::Replicated
*OutputTorque (Float)
::Replicated
*OutputHandbrakeOn (Bool)
::Replicated
*ChassisState (KRigidBodyState)
*CarState ([[Legacy:KCar/KCarState|KCar/KCarState]])
::This is replicated to the car, and processed to update all the parts.
*bNewCarState (Bool)
::Indicated there is new data processed, and chassis RBState should be updated.

==Functions==

*VehicleStateReceived()
::When new information is received, see if its new. If so, pass bits off the the wheels.
::Each part will then update its rigid body position via the KUpdateState event.
*KUpdateState() (Bool)
::This only update the chassis. The wheels update themselves.
*PackState()
::Pack current state of whole car into the state struct, to be sent to the client.
::Should only get called on the server.
*PostNetBeginPlay()
::Spawns tires and [[Legacy:KCarWheelJoint|KCarWheelJoint]]s (super is called also)
*Destroyed()
::Destroyes tires and wheeljoints (super is called also)
*KVehicleUpdateParams()
::Call this if you change any parameters (tire, suspension etc.) and they
::will be passed down to each wheel/joint.
*KApplyForce()
::Possibly apply force to flip car over.
*StartFlip(Pawn Pusher)
*Engine(float Throttle) (Float)
*ProcessCarInput()
*Tick(float Delta)
::Car Simulation

==Known subclasses==
* [[Legacy:Bulldog|Bulldog]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3938</id>
      <timestamp>2005-01-23T06:50:36Z</timestamp>
      <contributor>
        <ip>Odo324</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; KCar (Package: Vehicles)}}
:

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; KCar (Package: Vehicles)}}

A &quot;karma-based&quot; vehicle.

'''Note:''' This class is obsolete in UT2004. You should use an [[Legacy:SVehicle|SVehicle]] subclass instead.

==Properties==

===Editable===

*FrontTireClass (&lt;[[Legacy:KTire|KTire]]&gt;)
*RearTireClass (&lt;[[Legacy:KTire|KTire]]&gt;)
*WheelFrontAlong (const float)
*WheelFrontAcross (const float)
*WheelRearAlong (const float)
*WheelRearAcross (const float)
*WheelVert (const float)
*MaxSteerAngle (Float)
::(65535 = 360 deg)
*MaxBrakeTorque (Float)
::Braking torque applied to all four wheels. Positive only.
*TorqueSplit (Float)
::front/rear drive torque split. 1 is fully RWD, 0 is fully FWD. 0.5 is standard 4WD.

*SteerPropGap (Float)
*SteerTorque (Float)
*SteerSpeed (Float)

*SuspStiffness (Float)
*SuspDamping (Float)
*SuspHighLimit (Float)
*SuspLowLimit (Float)
*SuspRef (Float)

*TireRollFriction (Float)
*TireLateralFriction (Float)
*TireRollSlip (Float)
*TireLateralSlip (Float)
*TireMinSlip (Float)
*TireSlipRate (Float)
*TireSoftness (Float)
*TireAdhesion (Float)
*TireRestitution (Float)
*TireMass (Float)

*HandbrakeThresh (Float)
::Speed above which handbrake comes on =]
*TireHandbrakeSlip (Float)
::Additional lateral slip when handbrake engaged
*TireHandbrakeFriction (Float)
::Additional lateral friction when handbrake engaged

*ChassisMass (Float)

*StopThreshold (Float)
::Forward velocity under which brakes become drive.

*TorqueCurve (InterpCurve)
::Engine RPM in, Torque out.

*FlipTorque (Float);
*FlipTime (Float);

*MaxNetUpdateInterval (Float);

===Not editable===

*frontLeft ([[Legacy:KTire|KTire]])
*frontRight ([[Legacy:KTire|KTire]])
*rearLeft ([[Legacy:KTire|KTire]])
*rearRight ([[Legacy:KTire|KTire]])

Gear (int)
::1 is forward, -1 is backward. Currently symmetric power/torque curve
*WheelSpinSpeed (Float)
::Current (averaged) RPM of rear wheels
*ForwardVel (Float)
::Component of cars velocity in its forward direction.
*bIsInverted (Bool)
::Updated in Tick - indicates if car is not upright.
*IsDriving (Bool)
*FlipTimeLeft (Float)
*NextNetUpdateTime (Float)
::Next time we should force an update of vehicles state.
*OutputBrake (Bool)
::Replicated
*OutputTorque (Float)
::Replicated
*OutputHandbrakeOn (Bool)
::Replicated
*ChassisState (KRigidBodyState)
*CarState ([[Legacy:KCar/KCarState|KCar/KCarState]])
::This is replicated to the car, and processed to update all the parts.
*bNewCarState (Bool)
::Indicated there is new data processed, and chassis RBState should be updated.

==Functions==

*VehicleStateReceived()
::When new information is received, see if its new. If so, pass bits off the the wheels.
::Each part will then update its rigid body position via the KUpdateState event.
*KUpdateState() (Bool)
::This only update the chassis. The wheels update themselves.
*PackState()
::Pack current state of whole car into the state struct, to be sent to the client.
::Should only get called on the server.
*PostNetBeginPlay()
::Spawns tires and [[Legacy:KCarWheelJoint|KCarWheelJoint]]s (super is called also)
*Destroyed()
::Destroyes tires and wheeljoints (super is called also)
*KVehicleUpdateParams()
::Call this if you change any parameters (tire, suspension etc.) and they
::will be passed down to each wheel/joint.
*KApplyForce()
::Possibly apply force to flip car over.
*StartFlip(Pawn Pusher)
*Engine(float Throttle) (Float)
*ProcessCarInput()
*Tick(float Delta)
::Car Simulation

==Known subclasses==
* [[Legacy:Bulldog|Bulldog]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KCarWheelJoint</title>
    <id>1592</id>
    <revision>
      <id>3957</id>
      <timestamp>2005-01-11T15:31:26Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; [[Legacy:KCarWheelJoint|KCarWheelJoint]] }}

==Properties ==

===Main ===

This appears to be the axle joint used by the [[Legacy:Bulldog|Bulldog]] vehicle.

===Karmaconstraint ===
; bool bKSteeringLocked :  steering 'locked' in straight ahead direction  
; float KBraking :  torque applied to brake wheel  
; float KMaxSpeed :  max speed to try and reach using KMotorTorque (65535 = 1 rotation per second)  
; float KMaxSteerSpeed :  for steering controller (65535 = 1 rotation per second)  
; float KMaxSteerTorque :  for steering controller  
; float KMotorTorque :  torque applied to drive this wheel (can be negative)  
; float KProportionalGap :  for steering controller (65535 = 360 deg)  
; float KSteerAngle :  desired steering angle to achieve using controller (65535 = 360 deg)  
; float KSuspDamping :  
; float KSuspHighLimit :  
; float KSuspLowLimit :  
; float KSuspRef :  
; float KSuspStiffness :  

===Hidden ===
; float KWheelHeight :  height of wheel relative to suspension centre</text>
    </revision>
    <revision>
      <id>3958</id>
      <timestamp>2005-01-11T15:10:07Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-scar.boom.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-rosacea.boom.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-product.boom.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-medicine.boom.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://acne-treatment.boom.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KConeLimit</title>
    <id>1627</id>
    <revision>
      <id>4039</id>
      <timestamp>2006-04-06T22:21:45Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; KConeLimit}}

Cone limit joint class. The constraint specific behaviour is implemented in native code.

==Properties ==

===KarmaConstraint ===
; float KHalfAngle : Half angle limit for the cone joint.
; float KStiffness : Joint's stiffness.
; float KDamping : Joint's damping factor.

==Methods ==

This class doesn't have any methods.

==Events ==

This class doesn't have any events.

==Known subclasses ==

This class doesn't have any subclasses.

==Related Topics ==

* [[Legacy:Karma|Karma]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4040</id>
      <timestamp>2006-04-06T21:06:44Z</timestamp>
      <contributor>
        <ip>212.103.209.6</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; KConeLimit}}

Cone limit joint class. The constraint specific behaviour is implemented in native code.

==Properties ==

===KarmaConstraint ===
; float KHalfAngle : Half angle limit for the cone joint.
; float KStiffness : Joint's stiffness.
; float KDamping : Joint's damping factor.

==Methods ==

This class doesn't have any methods.

==Events ==

This class doesn't have any events.

==Known subclasses ==

This class doesn't have any subclasses.

==Related Topics ==

* [[Legacy:Karma|Karma]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43923</id>
      <timestamp>2010-08-29T22:44:34Z</timestamp>
      <contributor>
        <ip>88.234.250.1</ip>
      </contributor>
      <comment>/* Methods */</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; KConeLimit}}

Cone limit joint class. The constraint specific behaviour is implemented in native code.

==Properties ==

===KarmaConstraint ===
; float KHalfAngle : Half angle limit for the cone joint.
; float KStiffness : Joint's stiffness.
; float KDamping : Joint's damping factor.

==Methods ==

This class doesn't have any methods.
[http://www.yasamsacekimi.com]

==Events ==

This class doesn't have any events.

==Known subclasses ==

This class doesn't have any subclasses.

==Related Topics ==

* [[Legacy:Karma|Karma]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43924</id>
      <timestamp>2010-08-30T09:23:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>removed spam</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; KConeLimit}}

Cone limit joint class. The constraint specific behaviour is implemented in native code.

==Properties ==

===KarmaConstraint ===
; float KHalfAngle : Half angle limit for the cone joint.
; float KStiffness : Joint's stiffness.
; float KDamping : Joint's damping factor.

==Methods ==

This class doesn't have any methods.

==Events ==

This class doesn't have any events.

==Known subclasses ==

This class doesn't have any subclasses.

==Related Topics ==

* [[Legacy:Karma|Karma]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KConstraint</title>
    <id>1590</id>
    <revision>
      <id>3952</id>
      <timestamp>2005-12-03T00:20:36Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; KConstraint}}

KConstraints are a special type of [[Legacy:Karma|Karma]] object that can be used in conjunction with actions using PHYS_Karma to make more realistic and more believable simulations. They enforce a relationship between two actors, or between an actor and the world, as well as enforcing a relationship between themselves and the actors that they constrain.

KConstraints have a number of parameters, but are largely self-contained. Setting up a KConstraint generally involves setting as few as 1 parameter, in addition to setting the constraints location and rotation. In game, the constraint will automatically follow the things that it constrains, to keep the relationship between the actors the same.

==Quick Start==

The best way to learn about Karma constraints is to experiment. Place a couple of KActors and practice constraining them together different ways and with different parameters. To set up a constraint in the editor, simply place the constraint where you would like it, rotate it to the appropriate heading, and set KConstraintActor1 and KConstraintActor2 in the actor properties window. From there you can experiment without really worrying about breaking anything, or you can look at the individual constraint pages for a description of the parameters if experimentation is not your thing.

==Properties ==

===Karmaconstraint ===
; bool bKDisableCollision :  If true, collision between the joined [[Legacy:KActor|KActor]]s will be disabled as long as those actors are still constrained by this constraint. This is done natively and has no effect on the bKBlockKarma setting or the KEnableCollision/KDisableCollision functions.

; Actor KConstraintActor1 &amp; Actor KConstraintActor2 : These are references to the two actors that will be constrained by this constraint. The order makes no difference, with one exception: If you wish to constrain an actor to the world instead of to another actor, set KConstraintActor2 to None. If you set KConstraintActor1 to None, the constraint will have no effect. Other than constraining actors to the world, the order makes no difference.

; name KConstraintBone1 &amp; name KConstraintBone2 : These are the bones inside KConstraintActor1 and KConstraintActor2 (respectively) that you would like to constrain. If left blank, the location and rotation of the actor overall (the &quot;root&quot; location and rotation) is used.

; float KForceThreshold : If this value is not zero, the KForceExceed event will be called when the linear force between the actors constrained exceeds this threshold. The force is measured as the force attempting to pull the actors apart.. usually this would be used as the &quot;breaking point&quot; of a constraint. You will have to write your own subclass of the constraint you want to use in order to use this event, however.

===Hidden ===
; bool bKForceFrameUpdate : Constraints keep track of the things the constrain internally relative to themselves. The &quot;local reference frame&quot; pertains to this relative information. Setting this variable to true, either through script or through the &quot;set&quot; console command, will force the constraint to recalculate it's &quot;local reference frame&quot; based on it's location/rotation and the location/rotation of the actors it constraints, using world coordinates. This is generally left false, as the editor does this automatically whenever you change a variable in the constraint. It is not done automatically if you simply move the constraint, so you must change some variable (you can change it and then change it right back if you like) after moving or rotating the constraint to force it to update it's &quot;local reference frame.&quot; If you are going to spawn an actor in-game it is recommended you set this to true.
; int KConstraintData : This is an internal variable and should not be changed. It refers internally to the set of constraint datas that belong to this actor. (internal constraint data is not stored with the actor inside the Karma engine, so this points to the constraint data that this actor &quot;owns.&quot;)

====The Local Reference Frame====

These variables define the &quot;local reference frame&quot; described under bKForceFrameUpdate. If you do not want to use bKForceFrameUpdate you can set these manually through script. All values are in Karma units. Manually setting these can produce more complex simulation, but such simulation, while more complex, is far less realistic.
; vector KPos1 : Position of KConstraintActor1 relative to the constraint.
; vector KPriAxis1 : Primary axis on which this constraint acts on KConstraintActor1, if applicable.
; vector KSecAxis1 : Secondary axis on which this constraint acts on KConstraintActor1, if applicable.
; vector KPos2 : Position of KConstraintActor2 relative to the constraint.
; vector KPriAxis2 : Primary axis on which this constraint acts on KConstraintActor2, if applicable.
; vector KSecAxis2 : Secondary axis on which this constraint acts on KConstraintActor2, if applicable.

==Known Subclasses==
 Engine.KConstraint
   +- Engine.[[Legacy:KBSJoint|KBSJoint]]
   +- Engine.[[Legacy:KCarWheelJoint|KCarWheelJoint]]
   +- Engine.[[Legacy:KConeLimit|KConeLimit]]
   +- Engine.[[Legacy:KHinge|KHinge]]

==Related Topics==
* [[Legacy:Karma|Karma]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3953</id>
      <timestamp>2003-08-17T02:45:36Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Rewritten.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] }}

KConstraints are a special type of [[Legacy:Karma|Karma]] object that can be used in conjunction with actions using PHYS_Karma to make more realistic and more believable simulations. They enforce a relationship between two actors, or between an actor and the world, as well as enforcing a relationship between themselves and the actors that they constrain.

KConstraints have a number of parameters, but are largely self-contained. Setting up a KConstraint generally involves setting as few as 1 parameter, in addition to setting the constraints location and rotation. In game, the constraint will automatically follow the things that it constrains, to keep the relationship between the actors the same.

==Quick Start==

The best way to learn about Karma constraints is to experiment. Place a couple of KActors and practice constraining them together different ways and with different parameters. To set up a constraint in the editor, simply place the constraint where you would like it, rotate it to the appropriate heading, and set KConstraintActor1 and KConstraintActor2 in the actor properties window. From there you can experiment without really worrying about breaking anything, or you can look at the individual constraint pages for a description of the parameters if experimentation is not your thing.

==Properties ==

===Karmaconstraint ===
; bool bKDisableCollision :  If true, collision between the joined [[Legacy:KActor|KActor]]s will be disabled as long as those actors are still constrained by this constraint. This is done natively and has no effect on the bKBlockKarma setting or the KEnableCollision/KDisableCollision functions.

; Actor KConstraintActor1 &amp; Actor KConstraintActor2 : These are references to the two actors that will be constrained by this constraint. The order makes no difference, with one exception: If you wish to constrain an actor to the world instead of to another actor, set KConstraintActor2 to None. If you set KConstraintActor1 to None, the constraint will have no effect. Other than constraining actors to the world, the order makes no difference.

; name KConstraintBone1 &amp; name KConstraintBone2 : These are the bones inside KConstraintActor1 and KConstraintActor2 (respectively) that you would like to constrain. If left blank, the location and rotation of the actor overall (the &quot;root&quot; location and rotation) is used.

; float KForceThreshold : If this value is not zero, the KForceExceed event will be called when the linear force between the actors constrained exceeds this threshold. The force is measured as the force attempting to pull the actors apart.. usually this would be used as the &quot;breaking point&quot; of a constraint. You will have to write your own subclass of the constraint you want to use in order to use this event, however.

===Hidden ===
; bool bKForceFrameUpdate : Constraints keep track of the things the constrain internally relative to themselves. The &quot;local reference frame&quot; pertains to this relative information. Setting this variable to true, either through script or through the &quot;set&quot; console command, will force the constraint to recalculate it's &quot;local reference frame&quot; based on it's location/rotation and the location/rotation of the actors it constraints, using world coordinates. This is generally left false, as the editor does this automatically whenever you change a variable in the constraint. It is not done automatically if you simply move the constraint, so you must change some variable (you can change it and then change it right back if you like) after moving or rotating the constraint to force it to update it's &quot;local reference frame.&quot; If you are going to spawn an actor in-game it is recommended you set this to true.
; int KConstraintData : This is an internal variable and should not be changed. It refers internally to the set of constraint datas that belong to this actor. (internal constraint data is not stored with the actor inside the Karma engine, so this points to the constraint data that this actor &quot;owns.&quot;)

====The Local Reference Frame====

These variables define the &quot;local reference frame&quot; described under bKForceFrameUpdate. If you do not want to use bKForceFrameUpdate you can set these manually through script. All values are in Karma units. Manually setting these can produce more complex simulation, but such simulation, while more complex, is far less realistic.
; vector KPos1 : Position of KConstraintActor1 relative to the constraint.
; vector KPriAxis1 : Primary axis on which this constraint acts on KConstraintActor1, if applicable.
; vector KSecAxis1 : Secondary axis on which this constraint acts on KConstraintActor1, if applicable.
; vector KPos2 : Position of KConstraintActor2 relative to the constraint.
; vector KPriAxis2 : Primary axis on which this constraint acts on KConstraintActor2, if applicable.
; vector KSecAxis2 : Secondary axis on which this constraint acts on KConstraintActor2, if applicable.</text>
    </revision>
    <revision>
      <id>3954</id>
      <timestamp>2005-04-09T03:32:10Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <minor/>
      <comment>fix</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; KConstraint}}

KConstraints are a special type of [[Legacy:Karma|Karma]] object that can be used in conjunction with actions using PHYS_Karma to make more realistic and more believable simulations. They enforce a relationship between two actors, or between an actor and the world, as well as enforcing a relationship between themselves and the actors that they constrain.

KConstraints have a number of parameters, but are largely self-contained. Setting up a KConstraint generally involves setting as few as 1 parameter, in addition to setting the constraints location and rotation. In game, the constraint will automatically follow the things that it constrains, to keep the relationship between the actors the same.

==Quick Start==

The best way to learn about Karma constraints is to experiment. Place a couple of KActors and practice constraining them together different ways and with different parameters. To set up a constraint in the editor, simply place the constraint where you would like it, rotate it to the appropriate heading, and set KConstraintActor1 and KConstraintActor2 in the actor properties window. From there you can experiment without really worrying about breaking anything, or you can look at the individual constraint pages for a description of the parameters if experimentation is not your thing.

==Properties ==

===Karmaconstraint ===
; bool bKDisableCollision :  If true, collision between the joined [[Legacy:KActor|KActor]]s will be disabled as long as those actors are still constrained by this constraint. This is done natively and has no effect on the bKBlockKarma setting or the KEnableCollision/KDisableCollision functions.

; Actor KConstraintActor1 &amp; Actor KConstraintActor2 : These are references to the two actors that will be constrained by this constraint. The order makes no difference, with one exception: If you wish to constrain an actor to the world instead of to another actor, set KConstraintActor2 to None. If you set KConstraintActor1 to None, the constraint will have no effect. Other than constraining actors to the world, the order makes no difference.

; name KConstraintBone1 &amp; name KConstraintBone2 : These are the bones inside KConstraintActor1 and KConstraintActor2 (respectively) that you would like to constrain. If left blank, the location and rotation of the actor overall (the &quot;root&quot; location and rotation) is used.

; float KForceThreshold : If this value is not zero, the KForceExceed event will be called when the linear force between the actors constrained exceeds this threshold. The force is measured as the force attempting to pull the actors apart.. usually this would be used as the &quot;breaking point&quot; of a constraint. You will have to write your own subclass of the constraint you want to use in order to use this event, however.

===Hidden ===
; bool bKForceFrameUpdate : Constraints keep track of the things the constrain internally relative to themselves. The &quot;local reference frame&quot; pertains to this relative information. Setting this variable to true, either through script or through the &quot;set&quot; console command, will force the constraint to recalculate it's &quot;local reference frame&quot; based on it's location/rotation and the location/rotation of the actors it constraints, using world coordinates. This is generally left false, as the editor does this automatically whenever you change a variable in the constraint. It is not done automatically if you simply move the constraint, so you must change some variable (you can change it and then change it right back if you like) after moving or rotating the constraint to force it to update it's &quot;local reference frame.&quot; If you are going to spawn an actor in-game it is recommended you set this to true.
; int KConstraintData : This is an internal variable and should not be changed. It refers internally to the set of constraint datas that belong to this actor. (internal constraint data is not stored with the actor inside the Karma engine, so this points to the constraint data that this actor &quot;owns.&quot;)

====The Local Reference Frame====

These variables define the &quot;local reference frame&quot; described under bKForceFrameUpdate. If you do not want to use bKForceFrameUpdate you can set these manually through script. All values are in Karma units. Manually setting these can produce more complex simulation, but such simulation, while more complex, is far less realistic.
; vector KPos1 : Position of KConstraintActor1 relative to the constraint.
; vector KPriAxis1 : Primary axis on which this constraint acts on KConstraintActor1, if applicable.
; vector KSecAxis1 : Secondary axis on which this constraint acts on KConstraintActor1, if applicable.
; vector KPos2 : Position of KConstraintActor2 relative to the constraint.
; vector KPriAxis2 : Primary axis on which this constraint acts on KConstraintActor2, if applicable.
; vector KSecAxis2 : Secondary axis on which this constraint acts on KConstraintActor2, if applicable.

==Known Subclasses ==

 Engine.KConstraint
   +Engine.[[Legacy:KBSJoint|KBSJoint]]
   +Engine.[[Legacy:KCarWheelJoint|KCarWheelJoint]]
   +Engine.[[Legacy:KConeLimit|KConeLimit]]
   +Engine.[[Legacy:KHinge|KHinge]]

==Related Topics ==

* [[Legacy:Karma|Karma]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KFM</title>
    <id>1602</id>
    <revision>
      <id>3980</id>
      <timestamp>2006-07-04T21:35:58Z</timestamp>
      <contributor>
        <ip>KFM</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''No idea when this was from, but it was a long time ago''

Recently switched to UT Linux.

No UnrealEd available... Going through withdrawal..

''July 02, 2006.''

I guess it's back to old habits with me, today I opened up UnrealEd for the first time in years. And it crashed. I think I'm gonna tear up. [ Oh, by the way I got UT for Windows again. ] ;-)

''July 04, 2006.''

Started working on a map again. Forgot how to do a mover. Joy. I think I forgot everything. :\

----

'''EntropicLqd:''' Hi, welcome to the Wiki.

'''Tarquin:''' Hello, welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3981</id>
      <timestamp>2006-07-03T00:12:24Z</timestamp>
      <contributor>
        <ip>653298hfc33.tampabay.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Recently switched to UT Linux.

No UnrealEd available... Going through withdrawal..

'''July 02, 2006.'''

I guess it's back to old habits with me, today I opened up UnrealEd for the first time in years. And it crashed. I think I'm gonna tear up.

----

'''EntropicLqd:''' Hi, welcome to the Wiki.

'''Tarquin:''' Hello, welcome :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KHinge</title>
    <id>1593</id>
    <revision>
      <id>3959</id>
      <timestamp>2006-01-02T02:02:33Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; KHinge (Package: Engine)}}

The native, placeable Hinge joint class. 

==Properties==

===KarmaConstraint===
; float KDesiredAngle : 65535 = 360 degrees  
; float KAltDesiredAngle : 65535 = 360 degrees  
; float KDesiredAngVel : 65535 = 1 rotation per second  
; EHingeType  KHingeType :  
; float KMaxTorque :  
; float KProportionalGap : 65535 = 360 degrees  
; float KStiffness :  
; float KDamping :

===Hidden===
; bool KUseAltDesired : Will use KAltDesiredAngle. 
; float KCurrentAngle : 

==Enums==

===EHingeType===
; HT_Normal : Will spin freely around the given axis, KDesiredAngle.
; HT_Springy : The given spin axis is able to move, but will return to normal.
; HT_Motor : Will constantly spin around the given axis.
; HT_Controlled : Somewhere between HT_Springy and HT_Motor, where a constant spin is applied to an axis that is able to move.

==States==

===Default (auto)===

''In this state nothing will happen if this hinge is triggered or untriggered.''

Ignores Trigger, UnTrigger.

===ToggleMotor===

''In this state, Trigger will cause the hinge type to change to HT_Motor.  Another trigger will toggle it to HT_Controlled, and it will try and maintain its current angle.''

Ignores UnTrigger.

====Functions====
; Trigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : If &lt;tt&gt;KHingeType == HT_Motor&lt;/tt&gt;, sets &lt;tt&gt;KDesiredAngle = KCurrentAngle&lt;/tt&gt;, &lt;tt&gt;KUseAltDesired = False&lt;/tt&gt; and &lt;tt&gt;KHingeType = HT_Controlled&lt;/tt&gt;.  Otherwise sets &lt;tt&gt;KHingeType = HT_Motor&lt;/tt&gt;.  Calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt; and &lt;tt&gt;KConstraintActor1.KWake()&lt;/tt&gt;.
; '''''Begin''''' : Sets &lt;tt&gt;KHingeType = HT_Controlled&lt;/tt&gt; and &lt;tt&gt;KUseAltDesired = False&lt;/tt&gt;.  Calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt;.

===ControlMotor===

''In this state, Trigger will turn motor on.  Untrigger will turn toggle it to HT_Controlled, and it will try and maintain its current angle.''

====Functions====
; Trigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : if &lt;tt&gt;KHingeType != HT_Motor&lt;/tt&gt;, sets &lt;tt&gt;KHingeType = HT_Motor&lt;/tt&gt; and calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt; and &lt;tt&gt;KConstraintActor1.KWake()&lt;/tt&gt;.
; UnTrigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : if &lt;tt&gt;KHingeType == HT_Motor&lt;/tt&gt;, sets &lt;tt&gt;KDesiredAngle = KCurrentAngle&lt;/tt&gt;, &lt;tt&gt;KUseAltDesired = False&lt;/tt&gt; and &lt;tt&gt;KHingeType = HT_Controlled&lt;/tt&gt;, then calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt; and &lt;tt&gt;KConstraintActor1.KWake()&lt;/tt&gt;.
; '''''Begin''''' : Sets &lt;tt&gt;KHingeType = HT_Controlled&lt;/tt&gt; and &lt;tt&gt;KUseAltDesired = False&lt;/tt&gt;.  Calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt;.

===ToggleDesired===

''In this state a trigger will toggle the hinge between using KDesiredAngle and KAltDesiredAngle.  It will use whatever the current KHingeType is to achieve this, so this is only useful with HT_Controlled and HT_Springy.''

Ignores Untrigger.

====Functions====
; Trigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Toggles &lt;tt&gt;KUseAltDesired&lt;/tt&gt;.  Calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt; and &lt;tt&gt;KConstraintActor1.KWake()&lt;/tt&gt;.

===ControlDesired===

''In this state, trigger will cause the hinge to use KAltDesiredAngle, untrigger will caus it to use KAltDesiredAngle.''

====Functions====
; Trigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Sets &lt;tt&gt;KUseAltDesired = True&lt;/tt&gt; and calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt; and &lt;tt&gt;KConstraintActor1.KWake()&lt;/tt&gt;.
; UnTrigger( Actor Other, [[Legacy:Pawn|Pawn]] EventInstigator ) : Sets &lt;tt&gt;KUseAltDesired = False&lt;/tt&gt; and calls &lt;tt&gt;KUpdateConstraintParams()&lt;/tt&gt; and &lt;tt&gt;KConstraintActor1.KWake()&lt;/tt&gt;.

==Related Topics==
* [[Legacy:Karma|Karma]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3960</id>
      <timestamp>2003-03-26T01:18:38Z</timestamp>
      <contributor>
        <ip>Violator</ip>
      </contributor>
      <comment>KHinge</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:KConstraint|KConstraint]] &gt;&gt; [[Legacy:KHinge|KHinge]] }}

==Properties ==

===Main ===

===Karmaconstraint ===
; float KAltDesiredAngle :  65535 = 360 degrees  
; float KDamping :  
; float KDesiredAngle :  65535 = 360 degrees  
; float KDesiredAngVel :  65535 = 1 rotation per second  
; EHingeType  KHingeType :  
; float KMaxTorque :  
; float KProportionalGap :  65535 = 360 degrees  
; float KStiffness :  

===Hidden ===
; float KCurrentAngle :  
; bool KUseAltDesired :  

==Enums ==

===EHingeType ===
; HT_Normal : 
; HT_Springy : 
; HT_Motor : 
; HT_Controlled :</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KHoverTank</title>
    <id>1623</id>
    <revision>
      <id>4030</id>
      <timestamp>2007-11-19T15:13:16Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; KHoverTank}}

Adding extra wheels is pretty easy, useful for making tanks or hovercrafts. :] Also, Rear Steering with forward steering allows for some sharp turns and cool looking vehicle :]

&lt;uscript&gt;
//=============================================================================
// KHoverTank.
// Base class for 6-invisible wheeled 'hover' vehicles using Karma
// Assumes negative-X is forward, negative-Y is right
//=============================================================================
class KHoverTank extends KCar
	abstract;

var KTire		midLeft, midRight;
var (KHoverTank)	class&lt;KTire&gt;	MidTireClass;
// Wheel positions
var const float		WheelMidAlong;
var const float		WheelMidAcross;

replication
{
	// We replicate the Gear for brake-lights etc.
	unreliable if(Role == ROLE_Authority)
		CarState, Gear;

	reliable if(Role == ROLE_Authority)
		FlipTimeLeft;
}

// When new information is received, see if it's new. If so, pass bits off the wheels.
// Each part will then update its rigid body position via the KUpdateState event.
// JTODO: This is where clever unpacking would happen.
simulated event VehicleStateReceived()
{
	local vector ChassisY, SteerY, ChassisZ, calcPos, WheelY, lPos;
	local vector chassisPos, chassisLinVel, chassisAngVel, WheelLinVel, wPosRel;
	local Quat relQ, WheelQ;

	// Don't do anything if car isn't started up. 
	// Shouldn't need to worry about Front or Rear as it's done in Super.
	if( midLeft == None || midRight == None )
		return;

	Super.VehicleStateReceived()

	////////////////////////// MID LEFT //////////////////////////
	midLeft.KGetRigidBodyState(midLeft.ReceiveState);

	// Position
	lPos.X = WheelMidAlong;
	lPos.Y = WheelMidAcross;
	lPos.Z = CarState.WheelHeight[2];
	calcPos = chassisPos + QuatRotateVector(CarState.ChassisQuaternion, lPos);
	midLeft.ReceiveState.Position = KRBVecFromVector(calcPos);

	// Rotation
	wheelQ = midLeft.KGetRBQuaternion();
	WheelY = QuatRotateVector(wheelQ, vect(0, 1, 0));
	relQ = QuatFindBetween(WheelY, ChassisY);
	midLeft.ReceiveState.Quaternion = QuatProduct(relQ, wheelQ);
	
	// Velocity
	wPosRel = calcPos - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);
	WheelLinVel += CarState.WheelVertVel[2] * ChassisZ;
	midLeft.ReceiveState.LinVel = KRBVecFromVector(WheelLinVel);

	midLeft.bReceiveStateNew = true;

	////////////////////////// MID RIGHT //////////////////////////
	midRight.KGetRigidBodyState(midRight.ReceiveState);

	// Position
	lPos.X = WheelMidAlong;
	lPos.Y = WheelMidAcross;
	lPos.Z = CarState.WheelHeight[3];
	calcPos = chassisPos + QuatRotateVector(CarState.ChassisQuaternion, lPos);
	midRight.ReceiveState.Position = KRBVecFromVector(calcPos);

	// Rotation
	wheelQ = midRight.KGetRBQuaternion();
	WheelY = QuatRotateVector(wheelQ, vect(0, 1, 0));
	relQ = QuatFindBetween(WheelY, ChassisY);
	midRight.ReceiveState.Quaternion = QuatProduct(relQ, wheelQ);
	
	// Velocity
	wPosRel = calcPos - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);
	WheelLinVel += CarState.WheelVertVel[3] * ChassisZ;
	midRight.ReceiveState.LinVel = KRBVecFromVector(WheelLinVel);

	midRight.bReceiveStateNew = true;

	////// OTHER //////

	// Update control inputs
	Steering = CarState.ServerSteering;
	OutputTorque = CarState.ServerTorque;
	OutputBrake = CarState.ServerBrake;
	OutputHandbrakeOn = CarState.ServerHandbrakeOn;

	// Update flags

	CarState.bNewState = false;
	bNewCarState = true;

}

// Pack current state of whole car into the state struct, to be sent to the client.
// Should only get called on the server.
function PackState()
{
	local vector lPos, wPos, chassisPos, chassisLinVel, chassisAngVel, wPosRel, WheelLinVel;
	local vector ChassisX, ChassisZ, WheelY, oldPos, oldLinVel;
	local KRigidBodyState ChassisState, WheelState, TurrState;

	Super.PackState();


	////////////////////////// MID LEFT //////////////////////////
	midLeft.KGetRigidBodyState(WheelState);
	wPos = KRBVecToVector(WheelState.Position);
	lPos = QuatRotateVector(QuatInvert(CarState.ChassisQuaternion), wPos - chassisPos);
	CarState.WheelHeight[2] = lPos.Z;

	wPosRel = KRBVecToVector(WheelState.Position) - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);

	CarState.WheelVertVel[2] = 
		((WheelState.LinVel.X - WheelLinVel.X)* ChassisZ.X) + 
		((WheelState.LinVel.Y - WheelLinVel.Y)* ChassisZ.Y) + 
		((WheelState.LinVel.Z - WheelLinVel.Z)* ChassisZ.Z);

	WheelY = QuatRotateVector(WheelState.Quaternion, vect(0, 1, 0));

	////////////////////////// MID RIGHT //////////////////////////
	midRight.KGetRigidBodyState(WheelState);
	wPos = KRBVecToVector(WheelState.Position);
	lPos = QuatRotateVector(QuatInvert(CarState.ChassisQuaternion), wPos - chassisPos);
	CarState.WheelHeight[3] = lPos.Z;

	wPosRel = KRBVecToVector(WheelState.Position) - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);

	CarState.WheelVertVel[3] = 
		((WheelState.LinVel.X - WheelLinVel.X)* ChassisZ.X) + 
		((WheelState.LinVel.Y - WheelLinVel.Y)* ChassisZ.Y) + 
		((WheelState.LinVel.Z - WheelLinVel.Z)* ChassisZ.Z);



	WheelY = QuatRotateVector(WheelState.Quaternion, vect(0, 1, 0));

	// OTHER
	CarState.ServerSteering = Steering;
	CarState.ServerTorque = OutputTorque;
	CarState.ServerBrake = OutputBrake;
	CarState.ServerHandbrakeOn = OutputHandbrakeOn;

	// This flag lets the client know this data is new.
	CarState.bNewState = true;

}

simulated function PostNetBeginPlay()
{
	local vector RotX, RotY, RotZ, lPos;

    Super.PostNetBeginPlay();

    // Set up suspension graphics
    GetAxes(Rotation,RotX,RotY,RotZ);

	frontLeft.bHidden = True;  // Invisible wheels for hovercrafts
	frontRight.bHidden = True;  // Invisible wheels for hovercrafts
	rearLeft.bHidden = True;  // Invisible wheels for hovercrafts
	rearRight.bHidden = True;  // Invisible wheels for hovercrafts
    midLeft = spawn(MidTireClass, self,, Location + WheelMidAlong*RotX - WheelMidAcross*RotY + (256 /*WheelVert*/)*RotZ, Rotation);
    midLeft.SetDrawScale3D(vect(1, 1, 1));
	midLeft.bHidden = True; // Invisible wheels for hovercrafts

    midRight = spawn(MidTireClass, self,, Location + WheelMidAlong*RotX - WheelMidAcross*RotY + (256 /*WheelVert*/)*RotZ, Rotation);
    midRight.SetDrawScale3D(vect(1, -1, 1));
	midRight.bHidden = True; // Invisible wheels for hovercrafts

	lPos.X = WheelMidAlong;
	lPos.Y = -WheelMidAcross;
    midRight.WheelJoint = spawn(class'KCarWheelJoint', self);
    midRight.WheelJoint.KPos1 = lPos/50;
    midRight.WheelJoint.KPriAxis1 = vect(0, 0, 1);
    midRight.WheelJoint.KSecAxis1 = vect(0, 1, 0);
    midRight.WheelJoint.KConstraintActor1 = self;
    midRight.WheelJoint.KPos2 = vect(0, 0, 0);
    midRight.WheelJoint.KPriAxis2 = vect(0, 0, 1);
    midRight.WheelJoint.KSecAxis2 = vect(0, 1, 0);
    midRight.WheelJoint.KConstraintActor2 = midRight;
    midRight.WheelJoint.SetPhysics(PHYS_Karma);

	lPos.Y = WheelMidAcross;
    midLeft.WheelJoint = spawn(class'KCarWheelJoint', self);
    midLeft.WheelJoint.KPos1 = lPos/50;
    midLeft.WheelJoint.KPriAxis1 = vect(0, 0, 1);
    midLeft.WheelJoint.KSecAxis1 = vect(0, 1, 0);
    midLeft.WheelJoint.KConstraintActor1 = self;
    midLeft.WheelJoint.KPos2 = vect(0, 0, 0);
    midLeft.WheelJoint.KPriAxis2 = vect(0, 0, 1);
    midLeft.WheelJoint.KSecAxis2 = vect(0, 1, 0);
    midLeft.WheelJoint.KConstraintActor2 = midLeft;
    midLeft.WheelJoint.SetPhysics(PHYS_Karma);

	// Initially make sure parameters are synced with Karma
	KVehicleUpdateParams();

}

// Clean up wheels etc.
simulated event Destroyed()
{

	// Destroy joints holding wheels to car
	midLeft.WheelJoint.Destroy();
	midRight.WheelJoint.Destroy();

	// Destroy wheels themselves.
	midLeft.Destroy();
	midRight.Destroy();

	Super.Destroyed();

}

// Call this if you change any parameters (tire, suspension etc.) and they
// will be passed down to each wheel/joint.
simulated event KVehicleUpdateParams()
{

	Super.KVehicleUpdateParams();

    midLeft.WheelJoint.bKSteeringLocked = true;
    midRight.WheelJoint.bKSteeringLocked = true;

    // unlock rear wheels for steering
    rearLeft.WheelJoint.bKSteeringLocked = false;

    rearLeft.WheelJoint.KProportionalGap = SteerPropGap;
    rearLeft.WheelJoint.KMaxSteerTorque = SteerTorque;
    rearLeft.WheelJoint.KMaxSteerSpeed = SteerSpeed;

    // unlock rear wheels for steering
    rearRight.WheelJoint.bKSteeringLocked = false;
    rearRight.WheelJoint.KProportionalGap = SteerPropGap;
    rearRight.WheelJoint.KMaxSteerTorque = SteerTorque;
    rearRight.WheelJoint.KMaxSteerSpeed = SteerSpeed;

    midLeft.WheelJoint.KSuspHighLimit = SuspHighLimit;
    midLeft.WheelJoint.KSuspLowLimit = SuspLowLimit;
    midLeft.WheelJoint.KSuspStiffness = SuspStiffness;
    midLeft.WheelJoint.KSuspDamping = SuspDamping;

    midRight.WheelJoint.KSuspHighLimit = SuspHighLimit;
    midRight.WheelJoint.KSuspLowLimit = SuspLowLimit;
    midRight.WheelJoint.KSuspStiffness = SuspStiffness;
    midRight.WheelJoint.KSuspDamping = SuspDamping;

	// Sync parameters with Karma - even front and rear wheels… Just incase. :P
	frontLeft.WheelJoint.KUpdateConstraintParams();
	frontRight.WheelJoint.KUpdateConstraintParams();
	midLeft.WheelJoint.KUpdateConstraintParams();
	midRight.WheelJoint.KUpdateConstraintParams();
	rearLeft.WheelJoint.KUpdateConstraintParams();
	rearRight.WheelJoint.KUpdateConstraintParams();



    // Mass
    frontLeft.KSetMass(TireMass+2); // maybe increase front wheels mass to simulte engine weight??
    frontRight.KSetMass(TireMass+2); // maybe increase front wheels mass to simulte engine weight??
    midLeft.KSetMass(TireMass);
    midRight.KSetMass(TireMass);

    midLeft.RollFriction = TireRollFriction;
    midLeft.LateralFriction = TireLateralFriction;
    midLeft.RollSlip = TireRollSlip;
    midLeft.LateralSlip = TireLateralSlip;
    midLeft.MinSlip = TireMinSlip;
    midLeft.SlipRate = TireSlipRate;
    midLeft.Softness = TireSoftness;
    midLeft.Adhesion = TireAdhesion;
    midLeft.Restitution = TireRestitution;

    midRight.RollFriction = TireRollFriction;
    midRight.LateralFriction = TireLateralFriction;
    midRight.RollSlip = TireRollSlip;
    midRight.LateralSlip = TireLateralSlip;
    midRight.MinSlip = TireMinSlip;
    midRight.SlipRate = TireSlipRate;
    midRight.Softness = TireSoftness;
    midRight.Adhesion = TireAdhesion;
    midRight.Restitution = TireRestitution;

}

// Car Simulation
simulated function Tick(float Delta)
{
	local float tana, sFactor;

	Super.Tick(Delta);

    WheelSpinSpeed = (frontLeft.SpinSpeed 
			+ frontRight.SpinSpeed 
			+ rearLeft.SpinSpeed 
			+ midLeft.SpinSpeed 
			+ midRight.SpinSpeed 
			+ rearRight.SpinSpeed)/6;

    // Motor
	// MID .. make them wheel spin :]
    midLeft.WheelJoint.KMotorTorque = 0.5 * OutputTorque * TorqueSplit;
    midRight.WheelJoint.KMotorTorque = 0.5 * OutputTorque * TorqueSplit;

    // Braking

	if(OutputBrake)
	{
		midLeft.WheelJoint.KBraking = MaxBrakeTorque;
		midRight.WheelJoint.KBraking = MaxBrakeTorque;
	}
	else
	{
		midLeft.WheelJoint.KBraking = 0.0;
		midRight.WheelJoint.KBraking = 0.0;
	}

	// Steering
    tana = Tan(6.283/65536 * Steering * MaxSteerAngle);
    sFactor = 0.5 * tana * (2 * WheelFrontAcross) / Abs(WheelFrontAlong - WheelRearAlong);

    // Make rear wheel turn in opposite direction to turn properly: -65536/6.283 
    RearLeft.WheelJoint.KSteerAngle = -65536/6.283 * Atan(tana, (1-sFactor));
    RearRight.WheelJoint.KSteerAngle = -65536/6.283 * Atan(tana, (1+sFactor));

	// Handbrake
	if(OutputHandbrakeOn == true)
	{

		midLeft.LateralFriction = TireLateralFriction + TireHandbrakeFriction;
		midLeft.LateralSlip = TireLateralSlip + TireHandbrakeSlip;

		midRight.LateralFriction = TireLateralFriction + TireHandbrakeFriction;
		midRight.LateralSlip = TireLateralSlip + TireHandbrakeSlip;
	}
	else
	{
		midLeft.LateralFriction = TireLateralFriction;
		midLeft.LateralSlip = TireLateralSlip;

		midRight.LateralFriction = TireLateralFriction;
		midRight.LateralSlip = TireLateralSlip;
	}

}

defaultproperties
{
}
&lt;/uscript&gt;
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4031</id>
      <timestamp>2005-01-05T10:00:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; KHoverTank}}

Adding extra wheels is pretty easy, useful for making tanks or hovercrafts. :] Also, Rear Steering with forward steering allows for some sharp turns and cool looking vehicle :]

&lt;uscript&gt;
//=============================================================================
// KHoverTank.
// Base class for 6-invisible wheeled 'hover' vehicles using Karma
// Assumes negative-X is forward, negative-Y is right
//=============================================================================
class KHoverTank extends KCar
	abstract;

var KTire		midLeft, midRight;
var (KHoverTank)	class&lt;KTire&gt;	MidTireClass;
// Wheel positions
var const float		WheelMidAlong;
var const float		WheelMidAcross;

replication
{
	// We replicate the Gear for brake-lights etc.
	unreliable if(Role == ROLE_Authority)
		CarState, Gear;

	reliable if(Role == ROLE_Authority)
		FlipTimeLeft;
}

// When new information is received, see if it's new. If so, pass bits off the wheels.
// Each part will then update its rigid body position via the KUpdateState event.
// JTODO: This is where clever unpacking would happen.
simulated event VehicleStateReceived()
{
	local vector ChassisY, SteerY, ChassisZ, calcPos, WheelY, lPos;
	local vector chassisPos, chassisLinVel, chassisAngVel, WheelLinVel, wPosRel;
	local Quat relQ, WheelQ;

	// Don't do anything if car isn't started up. 
	// Shouldn't need to worry about Front or Rear as it's done in Super.
	if( midLeft == None || midRight == None )
		return;

	Super.VehicleStateReceived()

	////////////////////////// MID LEFT //////////////////////////
	midLeft.KGetRigidBodyState(midLeft.ReceiveState);

	// Position
	lPos.X = WheelMidAlong;
	lPos.Y = WheelMidAcross;
	lPos.Z = CarState.WheelHeight[2];
	calcPos = chassisPos + QuatRotateVector(CarState.ChassisQuaternion, lPos);
	midLeft.ReceiveState.Position = KRBVecFromVector(calcPos);

	// Rotation
	wheelQ = midLeft.KGetRBQuaternion();
	WheelY = QuatRotateVector(wheelQ, vect(0, 1, 0));
	relQ = QuatFindBetween(WheelY, ChassisY);
	midLeft.ReceiveState.Quaternion = QuatProduct(relQ, wheelQ);
	
	// Velocity
	wPosRel = calcPos - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);
	WheelLinVel += CarState.WheelVertVel[2] * ChassisZ;
	midLeft.ReceiveState.LinVel = KRBVecFromVector(WheelLinVel);

	midLeft.bReceiveStateNew = true;

	////////////////////////// MID RIGHT //////////////////////////
	midRight.KGetRigidBodyState(midRight.ReceiveState);

	// Position
	lPos.X = WheelMidAlong;
	lPos.Y = WheelMidAcross;
	lPos.Z = CarState.WheelHeight[3];
	calcPos = chassisPos + QuatRotateVector(CarState.ChassisQuaternion, lPos);
	midRight.ReceiveState.Position = KRBVecFromVector(calcPos);

	// Rotation
	wheelQ = midRight.KGetRBQuaternion();
	WheelY = QuatRotateVector(wheelQ, vect(0, 1, 0));
	relQ = QuatFindBetween(WheelY, ChassisY);
	midRight.ReceiveState.Quaternion = QuatProduct(relQ, wheelQ);
	
	// Velocity
	wPosRel = calcPos - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);
	WheelLinVel += CarState.WheelVertVel[3] * ChassisZ;
	midRight.ReceiveState.LinVel = KRBVecFromVector(WheelLinVel);

	midRight.bReceiveStateNew = true;

	////// OTHER //////

	// Update control inputs
	Steering = CarState.ServerSteering;
	OutputTorque = CarState.ServerTorque;
	OutputBrake = CarState.ServerBrake;
	OutputHandbrakeOn = CarState.ServerHandbrakeOn;

	// Update flags

	CarState.bNewState = false;
	bNewCarState = true;

}

// Pack current state of whole car into the state struct, to be sent to the client.
// Should only get called on the server.
function PackState()
{
	local vector lPos, wPos, chassisPos, chassisLinVel, chassisAngVel, wPosRel, WheelLinVel;
	local vector ChassisX, ChassisZ, WheelY, oldPos, oldLinVel;
	local KRigidBodyState ChassisState, WheelState, TurrState;

	Super.PackState();


	////////////////////////// MID LEFT //////////////////////////
	midLeft.KGetRigidBodyState(WheelState);
	wPos = KRBVecToVector(WheelState.Position);
	lPos = QuatRotateVector(QuatInvert(CarState.ChassisQuaternion), wPos - chassisPos);
	CarState.WheelHeight[2] = lPos.Z;

	wPosRel = KRBVecToVector(WheelState.Position) - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);

	CarState.WheelVertVel[2] = 
		((WheelState.LinVel.X - WheelLinVel.X)* ChassisZ.X) + 
		((WheelState.LinVel.Y - WheelLinVel.Y)* ChassisZ.Y) + 
		((WheelState.LinVel.Z - WheelLinVel.Z)* ChassisZ.Z);

	WheelY = QuatRotateVector(WheelState.Quaternion, vect(0, 1, 0));

	////////////////////////// MID RIGHT //////////////////////////
	midRight.KGetRigidBodyState(WheelState);
	wPos = KRBVecToVector(WheelState.Position);
	lPos = QuatRotateVector(QuatInvert(CarState.ChassisQuaternion), wPos - chassisPos);
	CarState.WheelHeight[3] = lPos.Z;

	wPosRel = KRBVecToVector(WheelState.Position) - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);

	CarState.WheelVertVel[3] = 
		((WheelState.LinVel.X - WheelLinVel.X)* ChassisZ.X) + 
		((WheelState.LinVel.Y - WheelLinVel.Y)* ChassisZ.Y) + 
		((WheelState.LinVel.Z - WheelLinVel.Z)* ChassisZ.Z);



	WheelY = QuatRotateVector(WheelState.Quaternion, vect(0, 1, 0));

	// OTHER
	CarState.ServerSteering = Steering;
	CarState.ServerTorque = OutputTorque;
	CarState.ServerBrake = OutputBrake;
	CarState.ServerHandbrakeOn = OutputHandbrakeOn;

	// This flag lets the client know this data is new.
	CarState.bNewState = true;

}

simulated function PostNetBeginPlay()
{
	local vector RotX, RotY, RotZ, lPos;

    Super.PostNetBeginPlay();

    // Set up suspension graphics
    GetAxes(Rotation,RotX,RotY,RotZ);

	frontLeft.bHidden = True;  // Invisible wheels for hovercrafts
	frontRight.bHidden = True;  // Invisible wheels for hovercrafts
	rearLeft.bHidden = True;  // Invisible wheels for hovercrafts
	rearRight.bHidden = True;  // Invisible wheels for hovercrafts
    midLeft = spawn(MidTireClass, self,, Location + WheelMidAlong*RotX - WheelMidAcross*RotY + (256 /*WheelVert*/)*RotZ, Rotation);
    midLeft.SetDrawScale3D(vect(1, 1, 1));
	midLeft.bHidden = True; // Invisible wheels for hovercrafts

    midRight = spawn(MidTireClass, self,, Location + WheelMidAlong*RotX - WheelMidAcross*RotY + (256 /*WheelVert*/)*RotZ, Rotation);
    midRight.SetDrawScale3D(vect(1, -1, 1));
	midRight.bHidden = True; // Invisible wheels for hovercrafts

	lPos.X = WheelMidAlong;
	lPos.Y = -WheelMidAcross;
    midRight.WheelJoint = spawn(class'KCarWheelJoint', self);
    midRight.WheelJoint.KPos1 = lPos/50;
    midRight.WheelJoint.KPriAxis1 = vect(0, 0, 1);
    midRight.WheelJoint.KSecAxis1 = vect(0, 1, 0);
    midRight.WheelJoint.KConstraintActor1 = self;
    midRight.WheelJoint.KPos2 = vect(0, 0, 0);
    midRight.WheelJoint.KPriAxis2 = vect(0, 0, 1);
    midRight.WheelJoint.KSecAxis2 = vect(0, 1, 0);
    midRight.WheelJoint.KConstraintActor2 = midRight;
    midRight.WheelJoint.SetPhysics(PHYS_Karma);

	lPos.Y = WheelMidAcross;
    midLeft.WheelJoint = spawn(class'KCarWheelJoint', self);
    midLeft.WheelJoint.KPos1 = lPos/50;
    midLeft.WheelJoint.KPriAxis1 = vect(0, 0, 1);
    midLeft.WheelJoint.KSecAxis1 = vect(0, 1, 0);
    midLeft.WheelJoint.KConstraintActor1 = self;
    midLeft.WheelJoint.KPos2 = vect(0, 0, 0);
    midLeft.WheelJoint.KPriAxis2 = vect(0, 0, 1);
    midLeft.WheelJoint.KSecAxis2 = vect(0, 1, 0);
    midLeft.WheelJoint.KConstraintActor2 = midLeft;
    midLeft.WheelJoint.SetPhysics(PHYS_Karma);

	// Initially make sure parameters are synced with Karma
	KVehicleUpdateParams();

}

// Clean up wheels etc.
simulated event Destroyed()
{

	// Destroy joints holding wheels to car
	midLeft.WheelJoint.Destroy();
	midRight.WheelJoint.Destroy();

	// Destroy wheels themselves.
	midLeft.Destroy();
	midRight.Destroy();

	Super.Destroyed();

}

// Call this if you change any parameters (tire, suspension etc.) and they
// will be passed down to each wheel/joint.
simulated event KVehicleUpdateParams()
{

	Super.KVehicleUpdateParams();

    midLeft.WheelJoint.bKSteeringLocked = true;
    midRight.WheelJoint.bKSteeringLocked = true;

    // unlock rear wheels for steering
    rearLeft.WheelJoint.bKSteeringLocked = false;

    rearLeft.WheelJoint.KProportionalGap = SteerPropGap;
    rearLeft.WheelJoint.KMaxSteerTorque = SteerTorque;
    rearLeft.WheelJoint.KMaxSteerSpeed = SteerSpeed;

    // unlock rear wheels for steering
    rearRight.WheelJoint.bKSteeringLocked = false;
    rearRight.WheelJoint.KProportionalGap = SteerPropGap;
    rearRight.WheelJoint.KMaxSteerTorque = SteerTorque;
    rearRight.WheelJoint.KMaxSteerSpeed = SteerSpeed;

    midLeft.WheelJoint.KSuspHighLimit = SuspHighLimit;
    midLeft.WheelJoint.KSuspLowLimit = SuspLowLimit;
    midLeft.WheelJoint.KSuspStiffness = SuspStiffness;
    midLeft.WheelJoint.KSuspDamping = SuspDamping;

    midRight.WheelJoint.KSuspHighLimit = SuspHighLimit;
    midRight.WheelJoint.KSuspLowLimit = SuspLowLimit;
    midRight.WheelJoint.KSuspStiffness = SuspStiffness;
    midRight.WheelJoint.KSuspDamping = SuspDamping;

	// Sync parameters with Karma - even front and rear wheels… Just incase. :P
	frontLeft.WheelJoint.KUpdateConstraintParams();
	frontRight.WheelJoint.KUpdateConstraintParams();
	midLeft.WheelJoint.KUpdateConstraintParams();
	midRight.WheelJoint.KUpdateConstraintParams();
	rearLeft.WheelJoint.KUpdateConstraintParams();
	rearRight.WheelJoint.KUpdateConstraintParams();



    // Mass
    frontLeft.KSetMass(TireMass+2); // maybe increase front wheels mass to simulte engine weight??
    frontRight.KSetMass(TireMass+2); // maybe increase front wheels mass to simulte engine weight??
    midLeft.KSetMass(TireMass);
    midRight.KSetMass(TireMass);

    midLeft.RollFriction = TireRollFriction;
    midLeft.LateralFriction = TireLateralFriction;
    midLeft.RollSlip = TireRollSlip;
    midLeft.LateralSlip = TireLateralSlip;
    midLeft.MinSlip = TireMinSlip;
    midLeft.SlipRate = TireSlipRate;
    midLeft.Softness = TireSoftness;
    midLeft.Adhesion = TireAdhesion;
    midLeft.Restitution = TireRestitution;

    midRight.RollFriction = TireRollFriction;
    midRight.LateralFriction = TireLateralFriction;
    midRight.RollSlip = TireRollSlip;
    midRight.LateralSlip = TireLateralSlip;
    midRight.MinSlip = TireMinSlip;
    midRight.SlipRate = TireSlipRate;
    midRight.Softness = TireSoftness;
    midRight.Adhesion = TireAdhesion;
    midRight.Restitution = TireRestitution;

}

// Car Simulation
simulated function Tick(float Delta)
{
	local float tana, sFactor;

	Super.Tick(Delta);

    WheelSpinSpeed = (frontLeft.SpinSpeed 
			+ frontRight.SpinSpeed 
			+ rearLeft.SpinSpeed 
			+ midLeft.SpinSpeed 
			+ midRight.SpinSpeed 
			+ rearRight.SpinSpeed)/6;

    // Motor
	// MID .. make them wheel spin :]
    midLeft.WheelJoint.KMotorTorque = 0.5 * OutputTorque * TorqueSplit;
    midRight.WheelJoint.KMotorTorque = 0.5 * OutputTorque * TorqueSplit;

    // Braking

	if(OutputBrake)
	{
		midLeft.WheelJoint.KBraking = MaxBrakeTorque;
		midRight.WheelJoint.KBraking = MaxBrakeTorque;
	}
	else
	{
		midLeft.WheelJoint.KBraking = 0.0;
		midRight.WheelJoint.KBraking = 0.0;
	}

	// Steering
    tana = Tan(6.283/65536 * Steering * MaxSteerAngle);
    sFactor = 0.5 * tana * (2 * WheelFrontAcross) / Abs(WheelFrontAlong - WheelRearAlong);

    // Make rear wheel turn in opposite direction to turn properly: -65536/6.283 
    RearLeft.WheelJoint.KSteerAngle = -65536/6.283 * Atan(tana, (1-sFactor));
    RearRight.WheelJoint.KSteerAngle = -65536/6.283 * Atan(tana, (1+sFactor));

	// Handbrake
	if(OutputHandbrakeOn == true)
	{

		midLeft.LateralFriction = TireLateralFriction + TireHandbrakeFriction;
		midLeft.LateralSlip = TireLateralSlip + TireHandbrakeSlip;

		midRight.LateralFriction = TireLateralFriction + TireHandbrakeFriction;
		midRight.LateralSlip = TireLateralSlip + TireHandbrakeSlip;
	}
	else
	{
		midLeft.LateralFriction = TireLateralFriction;
		midLeft.LateralSlip = TireLateralSlip;

		midRight.LateralFriction = TireLateralFriction;
		midRight.LateralSlip = TireLateralSlip;
	}

}

defaultproperties
{
}
&lt;/uscript&gt;
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4032</id>
      <timestamp>2007-11-19T15:10:59Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:KVehicle|KVehicle]] &gt;&gt; [[Legacy:KCar|KCar]] &gt;&gt; KHoverTank}}

Adding extra wheels is pretty easy, useful for making tanks or hovercrafts. :] Also, Rear Steering with forward steering allows for some sharp turns and cool looking vehicle :]

&lt;uscript&gt;
//=============================================================================
// KHoverTank.
// Base class for 6-invisible wheeled 'hover' vehicles using Karma
// Assumes negative-X is forward, negative-Y is right
//=============================================================================
class KHoverTank extends KCar
	abstract;

var KTire		midLeft, midRight;
var (KHoverTank)	class&lt;KTire&gt;	MidTireClass;
// Wheel positions
var const float		WheelMidAlong;
var const float		WheelMidAcross;

replication
{
	// We replicate the Gear for brake-lights etc.
	unreliable if(Role == ROLE_Authority)
		CarState, Gear;

	reliable if(Role == ROLE_Authority)
		FlipTimeLeft;
}

// When new information is received, see if it's new. If so, pass bits off the wheels.
// Each part will then update its rigid body position via the KUpdateState event.
// JTODO: This is where clever unpacking would happen.
simulated event VehicleStateReceived()
{
	local vector ChassisY, SteerY, ChassisZ, calcPos, WheelY, lPos;
	local vector chassisPos, chassisLinVel, chassisAngVel, WheelLinVel, wPosRel;
	local Quat relQ, WheelQ;

	// Don't do anything if car isn't started up. 
	// Shouldn't need to worry about Front or Rear as it's done in Super.
	if( midLeft == None || midRight == None )
		return;

	Super.VehicleStateReceived()

	////////////////////////// MID LEFT //////////////////////////
	midLeft.KGetRigidBodyState(midLeft.ReceiveState);

	// Position
	lPos.X = WheelMidAlong;
	lPos.Y = WheelMidAcross;
	lPos.Z = CarState.WheelHeight[2];
	calcPos = chassisPos + QuatRotateVector(CarState.ChassisQuaternion, lPos);
	midLeft.ReceiveState.Position = KRBVecFromVector(calcPos);

	// Rotation
	wheelQ = midLeft.KGetRBQuaternion();
	WheelY = QuatRotateVector(wheelQ, vect(0, 1, 0));
	relQ = QuatFindBetween(WheelY, ChassisY);
	midLeft.ReceiveState.Quaternion = QuatProduct(relQ, wheelQ);
	
	// Velocity
	wPosRel = calcPos - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);
	WheelLinVel += CarState.WheelVertVel[2] * ChassisZ;
	midLeft.ReceiveState.LinVel = KRBVecFromVector(WheelLinVel);

	midLeft.bReceiveStateNew = true;

	////////////////////////// MID RIGHT //////////////////////////
	midRight.KGetRigidBodyState(midRight.ReceiveState);

	// Position
	lPos.X = WheelMidAlong;
	lPos.Y = WheelMidAcross;
	lPos.Z = CarState.WheelHeight[3];
	calcPos = chassisPos + QuatRotateVector(CarState.ChassisQuaternion, lPos);
	midRight.ReceiveState.Position = KRBVecFromVector(calcPos);

	// Rotation
	wheelQ = midRight.KGetRBQuaternion();
	WheelY = QuatRotateVector(wheelQ, vect(0, 1, 0));
	relQ = QuatFindBetween(WheelY, ChassisY);
	midRight.ReceiveState.Quaternion = QuatProduct(relQ, wheelQ);
	
	// Velocity
	wPosRel = calcPos - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);
	WheelLinVel += CarState.WheelVertVel[3] * ChassisZ;
	midRight.ReceiveState.LinVel = KRBVecFromVector(WheelLinVel);

	midRight.bReceiveStateNew = true;

	////// OTHER //////

	// Update control inputs
	Steering = CarState.ServerSteering;
	OutputTorque = CarState.ServerTorque;
	OutputBrake = CarState.ServerBrake;
	OutputHandbrakeOn = CarState.ServerHandbrakeOn;

	// Update flags

	CarState.bNewState = false;
	bNewCarState = true;

}

// Pack current state of whole car into the state struct, to be sent to the client.
// Should only get called on the server.
function PackState()
{
	local vector lPos, wPos, chassisPos, chassisLinVel, chassisAngVel, wPosRel, WheelLinVel;
	local vector ChassisX, ChassisZ, WheelY, oldPos, oldLinVel;
	local KRigidBodyState ChassisState, WheelState, TurrState;

	Super.PackState();


	////////////////////////// MID LEFT //////////////////////////
	midLeft.KGetRigidBodyState(WheelState);
	wPos = KRBVecToVector(WheelState.Position);
	lPos = QuatRotateVector(QuatInvert(CarState.ChassisQuaternion), wPos - chassisPos);
	CarState.WheelHeight[2] = lPos.Z;

	wPosRel = KRBVecToVector(WheelState.Position) - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);

	CarState.WheelVertVel[2] = 
		((WheelState.LinVel.X - WheelLinVel.X)* ChassisZ.X) + 
		((WheelState.LinVel.Y - WheelLinVel.Y)* ChassisZ.Y) + 
		((WheelState.LinVel.Z - WheelLinVel.Z)* ChassisZ.Z);

	WheelY = QuatRotateVector(WheelState.Quaternion, vect(0, 1, 0));

	////////////////////////// MID RIGHT //////////////////////////
	midRight.KGetRigidBodyState(WheelState);
	wPos = KRBVecToVector(WheelState.Position);
	lPos = QuatRotateVector(QuatInvert(CarState.ChassisQuaternion), wPos - chassisPos);
	CarState.WheelHeight[3] = lPos.Z;

	wPosRel = KRBVecToVector(WheelState.Position) - chassisPos;
	WheelLinVel = chassisLinVel + (chassisAngVel Cross wPosRel);

	CarState.WheelVertVel[3] = 
		((WheelState.LinVel.X - WheelLinVel.X)* ChassisZ.X) + 
		((WheelState.LinVel.Y - WheelLinVel.Y)* ChassisZ.Y) + 
		((WheelState.LinVel.Z - WheelLinVel.Z)* ChassisZ.Z);



	WheelY = QuatRotateVector(WheelState.Quaternion, vect(0, 1, 0));

	// OTHER
	CarState.ServerSteering = Steering;
	CarState.ServerTorque = OutputTorque;
	CarState.ServerBrake = OutputBrake;
	CarState.ServerHandbrakeOn = OutputHandbrakeOn;

	// This flag lets the client know this data is new.
	CarState.bNewState = true;

}

simulated function PostNetBeginPlay()
{
	local vector RotX, RotY, RotZ, lPos;

    Super.PostNetBeginPlay();

    // Set up suspension graphics
    GetAxes(Rotation,RotX,RotY,RotZ);

	frontLeft.bHidden = True;  // Invisible wheels for hovercrafts
	frontRight.bHidden = True;  // Invisible wheels for hovercrafts
	rearLeft.bHidden = True;  // Invisible wheels for hovercrafts
	rearRight.bHidden = True;  // Invisible wheels for hovercrafts
    midLeft = spawn(MidTireClass, self,, Location + WheelMidAlong*RotX - WheelMidAcross*RotY + (256 /*WheelVert*/)*RotZ, Rotation);
    midLeft.SetDrawScale3D(vect(1, 1, 1));
	midLeft.bHidden = True; // Invisible wheels for hovercrafts

    midRight = spawn(MidTireClass, self,, Location + WheelMidAlong*RotX - WheelMidAcross*RotY + (256 /*WheelVert*/)*RotZ, Rotation);
    midRight.SetDrawScale3D(vect(1, -1, 1));
	midRight.bHidden = True; // Invisible wheels for hovercrafts

	lPos.X = WheelMidAlong;
	lPos.Y = -WheelMidAcross;
    midRight.WheelJoint = spawn(class'KCarWheelJoint', self);
    midRight.WheelJoint.KPos1 = lPos/50;
    midRight.WheelJoint.KPriAxis1 = vect(0, 0, 1);
    midRight.WheelJoint.KSecAxis1 = vect(0, 1, 0);
    midRight.WheelJoint.KConstraintActor1 = self;
    midRight.WheelJoint.KPos2 = vect(0, 0, 0);
    midRight.WheelJoint.KPriAxis2 = vect(0, 0, 1);
    midRight.WheelJoint.KSecAxis2 = vect(0, 1, 0);
    midRight.WheelJoint.KConstraintActor2 = midRight;
    midRight.WheelJoint.SetPhysics(PHYS_Karma);

	lPos.Y = WheelMidAcross;
    midLeft.WheelJoint = spawn(class'KCarWheelJoint', self);
    midLeft.WheelJoint.KPos1 = lPos/50;
    midLeft.WheelJoint.KPriAxis1 = vect(0, 0, 1);
    midLeft.WheelJoint.KSecAxis1 = vect(0, 1, 0);
    midLeft.WheelJoint.KConstraintActor1 = self;
    midLeft.WheelJoint.KPos2 = vect(0, 0, 0);
    midLeft.WheelJoint.KPriAxis2 = vect(0, 0, 1);
    midLeft.WheelJoint.KSecAxis2 = vect(0, 1, 0);
    midLeft.WheelJoint.KConstraintActor2 = midLeft;
    midLeft.WheelJoint.SetPhysics(PHYS_Karma);

	// Initially make sure parameters are synced with Karma
	KVehicleUpdateParams();

}

// Clean up wheels etc.
simulated event Destroyed()
{

	// Destroy joints holding wheels to car
	midLeft.WheelJoint.Destroy();
	midRight.WheelJoint.Destroy();

	// Destroy wheels themselves.
	midLeft.Destroy();
	midRight.Destroy();

	Super.Destroyed();

}

// Call this if you change any parameters (tire, suspension etc.) and they
// will be passed down to each wheel/joint.
simulated event KVehicleUpdateParams()
{

	Super.KVehicleUpdateParams();

    midLeft.WheelJoint.bKSteeringLocked = true;
    midRight.WheelJoint.bKSteeringLocked = true;

    // unlock rear wheels for steering
    rearLeft.WheelJoint.bKSteeringLocked = false;

    rearLeft.WheelJoint.KProportionalGap = SteerPropGap;
    rearLeft.WheelJoint.KMaxSteerTorque = SteerTorque;
    rearLeft.WheelJoint.KMaxSteerSpeed = SteerSpeed;

    // unlock rear wheels for steering
    rearRight.WheelJoint.bKSteeringLocked = false;
    rearRight.WheelJoint.KProportionalGap = SteerPropGap;
    rearRight.WheelJoint.KMaxSteerTorque = SteerTorque;
    rearRight.WheelJoint.KMaxSteerSpeed = SteerSpeed;

    midLeft.WheelJoint.KSuspHighLimit = SuspHighLimit;
    midLeft.WheelJoint.KSuspLowLimit = SuspLowLimit;
    midLeft.WheelJoint.KSuspStiffness = SuspStiffness;
    midLeft.WheelJoint.KSuspDamping = SuspDamping;

    midRight.WheelJoint.KSuspHighLimit = SuspHighLimit;
    midRight.WheelJoint.KSuspLowLimit = SuspLowLimit;
    midRight.WheelJoint.KSuspStiffness = SuspStiffness;
    midRight.WheelJoint.KSuspDamping = SuspDamping;

	// Sync parameters with Karma - even front and rear wheels… Just incase. :P
	frontLeft.WheelJoint.KUpdateConstraintParams();
	frontRight.WheelJoint.KUpdateConstraintParams();
	midLeft.WheelJoint.KUpdateConstraintParams();
	midRight.WheelJoint.KUpdateConstraintParams();
	rearLeft.WheelJoint.KUpdateConstraintParams();
	rearRight.WheelJoint.KUpdateConstraintParams();



    // Mass
    frontLeft.KSetMass(TireMass+2); // maybe increase front wheels mass to simulte engine weight??
    frontRight.KSetMass(TireMass+2); // maybe increase front wheels mass to simulte engine weight??
    midLeft.KSetMass(TireMass);
    midRight.KSetMass(TireMass);

    midLeft.RollFriction = TireRollFriction;
    midLeft.LateralFriction = TireLateralFriction;
    midLeft.RollSlip = TireRollSlip;
    midLeft.LateralSlip = TireLateralSlip;
    midLeft.MinSlip = TireMinSlip;
    midLeft.SlipRate = TireSlipRate;
    midLeft.Softness = TireSoftness;
    midLeft.Adhesion = TireAdhesion;
    midLeft.Restitution = TireRestitution;

    midRight.RollFriction = TireRollFriction;
    midRight.LateralFriction = TireLateralFriction;
    midRight.RollSlip = TireRollSlip;
    midRight.LateralSlip = TireLateralSlip;
    midRight.MinSlip = TireMinSlip;
    midRight.SlipRate = TireSlipRate;
    midRight.Softness = TireSoftness;
    midRight.Adhesion = TireAdhesion;
    midRight.Restitution = TireRestitution;

}

// Car Simulation
simulated function Tick(float Delta)
{
	local float tana, sFactor;

	Super.Tick(Delta);

    WheelSpinSpeed = (frontLeft.SpinSpeed 
			+ frontRight.SpinSpeed 
			+ rearLeft.SpinSpeed 
			+ midLeft.SpinSpeed 
			+ midRight.SpinSpeed 
			+ rearRight.SpinSpeed)/6;

    // Motor
	// MID .. make them wheel spin :]
    midLeft.WheelJoint.KMotorTorque = 0.5 * OutputTorque * TorqueSplit;
    midRight.WheelJoint.KMotorTorque = 0.5 * OutputTorque * TorqueSplit;

    // Braking

	if(OutputBrake)
	{
		midLeft.WheelJoint.KBraking = MaxBrakeTorque;
		midRight.WheelJoint.KBraking = MaxBrakeTorque;
	}
	else
	{
		midLeft.WheelJoint.KBraking = 0.0;
		midRight.WheelJoint.KBraking = 0.0;
	}

	// Steering
    tana = Tan(6.283/65536 * Steering * MaxSteerAngle);
    sFactor = 0.5 * tana * (2 * WheelFrontAcross) / Abs(WheelFrontAlong - WheelRearAlong);

    // Make rear wheel turn in opposite direction to turn properly: -65536/6.283 
    RearLeft.WheelJoint.KSteerAngle = -65536/6.283 * Atan(tana, (1-sFactor));
    RearRight.WheelJoint.KSteerAngle = -65536/6.283 * Atan(tana, (1+sFactor));

	// Handbrake
	if(OutputHandbrakeOn == true)
	{

		midLeft.LateralFriction = TireLateralFriction + TireHandbrakeFriction;
		midLeft.LateralSlip = TireLateralSlip + TireHandbrakeSlip;

		midRight.LateralFriction = TireLateralFriction + TireHandbrakeFriction;
		midRight.LateralSlip = TireLateralSlip + TireHandbrakeSlip;
	}
	else
	{
		midLeft.LateralFriction = TireLateralFriction;
		midLeft.LateralSlip = TireLateralSlip;

		midRight.LateralFriction = TireLateralFriction;
		midRight.LateralSlip = TireLateralSlip;
	}

}

defaultproperties
{
}
&lt;/uscript&gt;
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KRepulsor</title>
    <id>1609</id>
    <revision>
      <id>3997</id>
      <timestamp>2004-08-18T08:38:35Z</timestamp>
      <contributor>
        <ip>203-59-112-175.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] :: ... &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KRepulsor|KRepulsor]] }}

==Overview==

KRepulsor is the class UT2004 hovering vehicles use to force the vehicle to hover above ground.  Also, wheels in UT2004 are basically KRepulsors too, except they have a whole lot more parameters for applying a more realistic force to the main vehicle mesh.

KRepulsors are similar to constraints from UT2003 in that they are permanantly attached to object(s) and affect their location and rotation, by manipulating their physics parameters.

==Properties ==

===Main ===
; bool bEnableRepulsion :  Turns the repulsor on/off.
; bRepulsorInContact : Repulsor is currently contacting something.
; vector CheckDir :  This is the direction of the repulsor.  You could constantly set CheckDir each tick to aim relational to the rotation of your vehicle, but you should know that a non-vertical direction will force your vehicle along some sort of horizontal direction.  To make the vehicle more stable, you could use CheckDir={0,0,-1} and bKStayUpright=true (which is what the UnrealEngine2Runtime does).  Body-roll still works quite well and there should be no chance of the vehicle rolling over and going upside down.
; float CheckDist :  This is the repulsor trace distance in Unreal Units.
; float Softness :  Softness changes alot between 0-1, but can also go alot higher than 1.  This is like KStiffness combined with a bit of KDamping from UT2003 constraints.  When this is zero, it will be like KStiffness is very high so that the amount of flexibility &lt;CheckDir is very minimal (the amount of force applied is higher at lower % of Checkdir).  Also when zero, it would be like KDamping is very high (when the repulsor hits &lt;= CheckDir, it will not 'ricochet' off).  When Softness==1, KStiffness is lower (and often will not contain enough force to lift the object all the way up to CheckDir) and KDamping may also be lower (but KDamping will always be present to absorb up-force and stop the repulsor from endless 'bouncing' +/- CheckDir).
; float PenScale :  Looking at wheel PenScale, I assume this means the penetration scale or 'bounciness' of the Repulsor when bRepulsorInContact.  A value such as 100 will repel the object more than a value below 1 (which is the default).  If this value is 0, it will have 0 bounciness and the object wont be repelled.
; float	PenOffset :  Not sure about this one either, but I guess it would offset the point at which penetration occurs along the repulsor line in Unreal Units. 
; transient const pointer KContact :  Used internally for Karma stuff - DO NOT CHANGE!  But I guess you can if you want ;).

==Functions ==

none</text>
    </revision>
    <revision>
      <id>3998</id>
      <timestamp>2004-01-02T06:31:38Z</timestamp>
      <contributor>
        <ip>O-GL</ip>
      </contributor>
      <comment>*Added a bit to CheckDir and Softness</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] :: ... &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KRepulsor|KRepulsor]] }}

==Overview==

KRepulsor is apparantly the class UT2004 hovering vehicles use to force the vehicle to hover above ground.  

It is similar to constraints from UT2003 in that they are permanantly attached to object(s) and affect their location and rotation, by manipulating their physics parameters.

==Properties ==

===Main ===
; bool bEnableRepulsion :  Turns the repulsor on/off.
; vector CheckDir :  This is the direction of the repulsor.  You could constantly set CheckDir each tick to aim relational to the rotation of your vehicle, but you should know that a non-vertical direction will force your vehicle along some sort of horizontal direction.  To make the vehicle more stable, you could use CheckDir={0,0,-1} and bKStayUpright=true (which is what the UnrealEngine2Runtime does).  Body-roll still works quite well and there should be no chance of the vehicle rolling over and going upside down.
; float CheckDist :  This is the repulsor trace distance in Unreal Units.
; float PenScale :  To figure out.
; float Softness :  Softness changes alot between 0-1, but can also go alot higher than one.  This is like KStiffness combined with a bit of KDamping from UT2003 constraints.  When this is zero, it will be like KStiffness is very high so that the amount of flexibility &lt;CheckDir is very minimal (the amount of force applied is higher at lower % of Checkdir).  Also when zero, it would be like KDamping is very high (when the repulsor hits &lt;= CheckDir, it will not 'ricochet' off).  When Softness==1, KStiffness is lower (and often will not contain enough force to lift the object all the way up to CheckDir) and KDamping may also be lower (but KDamping will always be present to absorb up-force and stop the repulsor from 'bouncing').

===Hidden ===
; int KContact :  

==Functions ==

none</text>
    </revision>
    <revision>
      <id>3999</id>
      <timestamp>2004-08-18T08:13:17Z</timestamp>
      <contributor>
        <ip>203-59-112-175.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UnrealEngine2 Runtime|UnrealEngine2 Runtime]] :: ... &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KRepulsor|KRepulsor]] }}

==Overview==

KRepulsor is the class UT2004 hovering vehicles use to force the vehicle to hover above ground.  

It is similar to constraints from UT2003 in that they are permanantly attached to object(s) and affect their location and rotation, by manipulating their physics parameters.

==Properties ==

===Main ===
; bool bEnableRepulsion :  Turns the repulsor on/off.
; bRepulsorInContact : Repulsor is currently contacting something.
; vector CheckDir :  This is the direction of the repulsor.  You could constantly set CheckDir each tick to aim relational to the rotation of your vehicle, but you should know that a non-vertical direction will force your vehicle along some sort of horizontal direction.  To make the vehicle more stable, you could use CheckDir={0,0,-1} and bKStayUpright=true (which is what the UnrealEngine2Runtime does).  Body-roll still works quite well and there should be no chance of the vehicle rolling over and going upside down.
; float CheckDist :  This is the repulsor trace distance in Unreal Units.
; float PenScale :  Looking at wheel penscale, I assume this means the 'bounciness' of the Repulsor when bRepulsorInContact.  A value such as 100 will repel the object more than a value below 1 (which is the default).  If this value is 0, it will have 0 bounciness and the object should be repelled.
; float Softness :  Softness changes alot between 0-1, but can also go alot higher than 1.  This is like KStiffness combined with a bit of KDamping from UT2003 constraints.  When this is zero, it will be like KStiffness is very high so that the amount of flexibility &lt;CheckDir is very minimal (the amount of force applied is higher at lower % of Checkdir).  Also when zero, it would be like KDamping is very high (when the repulsor hits &lt;= CheckDir, it will not 'ricochet' off).  When Softness==1, KStiffness is lower (and often will not contain enough force to lift the object all the way up to CheckDir) and KDamping may also be lower (but KDamping will always be present to absorb up-force and stop the repulsor from 'bouncing').

===Hidden ===
; int KContact :  

==Functions ==

none</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KShip</title>
    <id>1587</id>
    <revision>
      <id>3945</id>
      <timestamp>2003-12-05T03:51:46Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well this is basically my code for a space ship, thanks a lot to Daid for lending me his replication code (which turned out to come from KCar but i thank him non the less, great guy he is :D)

I currently use a different, more client oriented replication system, but this one here is a lot better, i havent incorporated my ship to it yet because i have some other problems that come with it that i have to solve, but since the &quot;core&quot; ship here is simple, ill use the better replication for you guys :)

(Btw i deal with all the entering/leaving of the vehicle in a parent class, this is really irrelevant to physics and is easy to do, so i left it out just so there will be less and easier to read code)

&lt;uscript&gt;
var float			Roll, CThrust, TempThrust, OldThrust; 
// Throttle and Steering are already declared in KVehicle, so all we need is roll, CThrust, TempThrust, OldThrust will be explained soon
// BTW note that i use Throttle for Pitch alteration because it is already bound by other vehicles to the forward/backward key
// ok i have also incorporated a system that allows for various thrust managments, 
//if you simply want to move forward full speed only while you press the the thrust button, you would use TempThrust. 
//when you release the thrust button you though you should always set TempThrust to -1
// if you want to have a constant speed, assign it to CThrust, so every time you release the thrust button (the one that changes TempThrust) 
// you would automatically start going at that speed (good for stuff like dogifghting and matching speeds)
// and lastly i added an afterburner effect, ill include it here for you guys to see although it isnt hard to do.
// also what i did with it was that when you afterburn and you run out of energy, while you still hold the afterburn key
// you would keep going at your max possible speed, and once you release it you would start going at your constant wanted speed (CThrust)
// Thats why i have 2 vars, bAfterburn is for after burning (holding key and having enough E), bBurn is for only holding the afterburn key with no regard to its depletion
var bool			bAfterburn, bBurn; // note that you should set both of those to true when you want to afterburn
var() float			ForwardTrust, TurnRate, AfterBurnThrust; // This is basically how fast our ship turns/moves
var float			CurRoll, CurSteering, CurThrottle, UnitAccRate; // This is used for acceleration
// CThrust is used for ships that can assign a specific throttle value, like 75% of max speed or whatever...
// UnitAccRate is how much each value increases per second
var vector			ExtraForce, ExtraTorque; // Used for Karama forces pileup

// Ship replication vars and functions, thanks daid!
struct StructShipState
{
	var KRBVec				ChassisPosition;
	var Quat				ChassisQuaternion;
	var KRBVec				ChassisLinVel;
	var KRBVec				ChassisAngVel;

	var float				ServerSteering;
	var float				ServerThrottle;
	var float				ServerRoll;

	var bool				ServerbAfterburn;
	var bool				ServerbBurn;

	var bool				bNewState; // Set to true whenever a new state is received and should be processed
};

var KRigidBodyState		ChassisState;

var StructShipState		ShipState; // This is replicated to the ship, and processed to update all the parts.
var bool			bNewShipState; // Indicated there is new data processed, and chassis RBState should be updated.

var float			NextNetUpdateTime;	// Next time we should force an update of vehicles state.
var() float			MaxNetUpdateInterval;

var int AVar;//Just for replication, else the ShipState doesn't get replicated

Replication
{
	unreliable if(Role == ROLE_Authority)
		ShipState, AVar;
}

simulated event VehicleStateReceived()
{
	if(!ShipState.bNewState)
		return;

	// Get root chassis info
	ChassisState.Position = ShipState.ChassisPosition;
	ChassisState.Quaternion = ShipState.ChassisQuaternion;
	ChassisState.LinVel = ShipState.ChassisLinVel;
	ChassisState.AngVel = ShipState.ChassisAngVel;

	// Update control inputs
	Steering = ShipState.ServerSteering;
	Throttle = ShipState.ServerThrottle;
	Roll = ShipState.ServerRoll;

	// Afterburner
	bAfterburn = ShipState.ServerbAfterburn;
	bBurn = ShipState.ServerbBurn;

	// Update flags
	ShipState.bNewState = false;
	bNewShipState = true;
}

simulated event bool KUpdateState(out KRigidBodyState newState)
{
	// This should never get called on the server - but just in case!
	if(Role == ROLE_Authority || !bNewShipState)
		return false;

	// Apply received data as new position of ship chassis.
	newState = ChassisState;
	bNewShipState = false;

	return true;
}

function PackState()
{
	local vector chassisPos, chassisLinVel, chassisAngVel;
	local vector oldPos, oldLinVel;
	local KRigidBodyState ChassisState;

	// Get chassis state.
	KGetRigidBodyState(ChassisState);

	chassisPos = KRBVecToVector(ChassisState.Position);
	chassisLinVel = KRBVecToVector(ChassisState.LinVel);
	chassisAngVel = KRBVecToVector(ChassisState.AngVel);

	// Last position we sent
	oldPos = KRBVectoVector(ShipState.ChassisPosition);
	oldLinVel = KRBVectoVector(ShipState.ChassisLinVel);

	// See if state has changed enough, or enough time has passed, that we 
	// should send out another update by updating the state struct.
	if( !KIsAwake() )
	{
		return; // Never send updates if physics is at rest
	}

	if( VSize(oldPos - chassisPos) &gt; 5 ||
		VSize(oldLinVel - chassisLinVel) &gt; 1 ||
		Abs(ShipState.ServerThrottle - Throttle) &gt; 0.1 ||
		Abs(ShipState.ServerSteering - Steering) &gt; 0.1 ||
		Abs(ShipState.ServerRoll - Roll) &gt; 0.1 ||
		bAfterburn != ShipState.ServerbAfterburn ||
		bBurn != ShipState.ServerbBurn ||
		Level.TimeSeconds &gt; NextNetUpdateTime )
	{
		NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
	}
	else
	{
		return;
	}

	ShipState.ChassisPosition = ChassisState.Position;
	ShipState.ChassisQuaternion = ChassisState.Quaternion;
	ShipState.ChassisLinVel = ChassisState.LinVel;
	ShipState.ChassisAngVel = ChassisState.AngVel;

	// Player Input
	ShipState.ServerSteering = Steering;
	ShipState.ServerThrottle = Throttle;
	ShipState.ServerRoll = Roll;

	// AfterBurner
	ShipState.ServerbAfterburn = bAfterburn;
	ShipState.ServerbBurn = bBurn;

	// This flag lets the client know this data is new.
	ShipState.bNewState = true;
	//Make sure ShipState gets replicated
	AVar++;
	if (AVar &gt; 10)
		AVar=0;
}

simulated function Tick(float DeltaTime)
{
	Super.Tick(DeltaTime);
	if(!KIsAwake() &amp;&amp; Controller!=None)
		KWake();
	if(Role == ROLE_Authority &amp;&amp; Level.NetMode != NM_StandAlone)
		PackState();
	UpdateAcceleration(DeltaTime);
	UpdateExtraForce(DeltaTime);
}
simulated function UpdateAcceleration(float Delta)
{
	CurSteering = CurSteering + Steering * UnitAccRate * Delta;
	CurThrottle = CurThrottle + Throttle * UnitAccRate * Delta;
	CurRoll     = CurRoll     + Roll     * UnitAccRate * Delta;
	if(Steering==0)
		CurSteering=0;
	if(Throttle==0)
		CurThrottle=0;
	if(Roll==0)
		CurRoll=0;

	if(Abs(CurSteering)&gt;Abs(Steering))
		CurSteering=Steering;
	if(Abs(CurThrottle)&gt;Abs(Throttle))
		CurThrottle=Throttle;
	if(Abs(CurRoll)&gt;Abs(Roll))
		CurRoll=Roll;

	if(bAfterBurn)
	{
		ReduceAfterBurnEnergy(); // just made this up, put it here incase you have something like this
		if(GetAfterburnEnergy()&lt;=0) // Another fictional function...
		{
			bAfterBurn=False;
		}
		else
		{
			CThrust=AfterBurnThrust;
		}
	}
	if(bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=1)
	{
		CThrust=1;
	}
	else if(!bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=OldThrust)
	{
		CThrust=OldThrust;
	}

	if(TempThrust!=-1 &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-TempThrust)&lt;0.01)
			CurThrust=TempThrust;
		if(CurThrust&gt;TempThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4; 
			// I made linear acceleration 4 times slower than rotation, you can do whatever you want though
		else if(CurThrust&lt;TempThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4;
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 2.2; // Acceleration with afterburner a lot faster
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 2.2;
	}
}

simulated function UpdateExtraForce(float Delta)
{
	local vector worldForward, worldDown, worldLeft;

	worldForward = vect(1, 0, 0) &gt;&gt; Rotation;
	worldDown = vect(0, 0, -1) &gt;&gt; Rotation;
	worldLeft = vect(0, -1, 0) &gt;&gt; Rotation;

	ExtraForce = ExtraForce + worldForward * ForwardThrust * Delta * CurThrust; // Speed
	ExtraTorque = ExtraTorque + worldDown * TurnRate * Delta * CurSteering; // Yaw
	ExtraTorque = ExtraTorque + worldLeft * TurnRate * Delta * CurThrottle; // Pitch
	ExtraTorque = ExtraTorque + worldForward * TurnRate * Delta * -CurRoll; // Roll
}

simulated event KApplyForce(out vector Force, out vector Torque)
{
	// This actually does the applying of the piled up force
	Force = ExtraForce;
	Torque = ExtraTorque;
	ExtraForce = vect(0,0,0);
	ExtraTorque = vect(0,0,0);
}

DefaultProperties
{
     // Create Karma collision Params for ourselves, you can change whatever you want here
     Begin Object Class=KarmaParamsRBFull Name=KParams0
         KLinearDamping=2.000;
         KAngularDamping=2.000;
         KStartEnabled=True
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=False
         KFriction=1.600000
         KActorGravScale = 0.0;
	 KMass=2;
         Name=&quot;KParams0&quot;
     End Object
     KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0'

     // And just some other variables:
     TurnRate=8
     ForwardThrust=5000
     UnitAccRate=2.0
     AfterBurnThrust=1.20 // basically means that afterburner goes at 120% of regular maximum speed
}
&lt;/uscript&gt;

and that should be it, i hope i didnt miss anything...

'''Spark: ''' KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0' &lt;&amp;ndash; Is this supposed to be a trap? ;) Took me a while to figure out that my ship didn't fly because this wasn't set to KParams0 and thus wasn't enabled at all. :)

'''Sir_Brizz: ''' Zep, did you end up getting your Quaternion working for the indicator? I have a few ideas that work if you want to know what they are.

'''ProjectX:''' I'm a n00b to coding, but is it possible to take this code, and change it to create a &quot;hovering vehicles&quot; class, that basicly, wont go a certan height above ground, but, from high jumps, etc., go lower to the ground? I also saw that there was 3 types of thrust, is it possible to bind a key that will cycle through the flying types (for more precise flying, eg. for dog matches and realism)?

'''NickR:''' Does anyone have a working example of a flying vehicle?

'''Foxpaw:''' I do, but my mod is still quite a ways from release. The code above allegedly is working code for a flying vehicle, though I've never tested it.</text>
    </revision>
    <revision>
      <id>3946</id>
      <timestamp>2003-12-05T03:48:28Z</timestamp>
      <contributor>
        <ip>NickR</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Well this is basically my code for a space ship, thanks a lot to Daid for lending me his replication code (which turned out to come from KCar but i thank him non the less, great guy he is :D)

I currently use a different, more client oriented replication system, but this one here is a lot better, i havent incorporated my ship to it yet because i have some other problems that come with it that i have to solve, but since the &quot;core&quot; ship here is simple, ill use the better replication for you guys :)

(Btw i deal with all the entering/leaving of the vehicle in a parent class, this is really irrelevant to physics and is easy to do, so i left it out just so there will be less and easier to read code)

&lt;uscript&gt;
var float			Roll, CThrust, TempThrust, OldThrust; 
// Throttle and Steering are already declared in KVehicle, so all we need is roll, CThrust, TempThrust, OldThrust will be explained soon
// BTW note that i use Throttle for Pitch alteration because it is already bound by other vehicles to the forward/backward key
// ok i have also incorporated a system that allows for various thrust managments, 
//if you simply want to move forward full speed only while you press the the thrust button, you would use TempThrust. 
//when you release the thrust button you though you should always set TempThrust to -1
// if you want to have a constant speed, assign it to CThrust, so every time you release the thrust button (the one that changes TempThrust) 
// you would automatically start going at that speed (good for stuff like dogifghting and matching speeds)
// and lastly i added an afterburner effect, ill include it here for you guys to see although it isnt hard to do.
// also what i did with it was that when you afterburn and you run out of energy, while you still hold the afterburn key
// you would keep going at your max possible speed, and once you release it you would start going at your constant wanted speed (CThrust)
// Thats why i have 2 vars, bAfterburn is for after burning (holding key and having enough E), bBurn is for only holding the afterburn key with no regard to its depletion
var bool			bAfterburn, bBurn; // note that you should set both of those to true when you want to afterburn
var() float			ForwardTrust, TurnRate, AfterBurnThrust; // This is basically how fast our ship turns/moves
var float			CurRoll, CurSteering, CurThrottle, UnitAccRate; // This is used for acceleration
// CThrust is used for ships that can assign a specific throttle value, like 75% of max speed or whatever...
// UnitAccRate is how much each value increases per second
var vector			ExtraForce, ExtraTorque; // Used for Karama forces pileup

// Ship replication vars and functions, thanks daid!
struct StructShipState
{
	var KRBVec				ChassisPosition;
	var Quat				ChassisQuaternion;
	var KRBVec				ChassisLinVel;
	var KRBVec				ChassisAngVel;

	var float				ServerSteering;
	var float				ServerThrottle;
	var float				ServerRoll;

	var bool				ServerbAfterburn;
	var bool				ServerbBurn;

	var bool				bNewState; // Set to true whenever a new state is received and should be processed
};

var KRigidBodyState		ChassisState;

var StructShipState		ShipState; // This is replicated to the ship, and processed to update all the parts.
var bool			bNewShipState; // Indicated there is new data processed, and chassis RBState should be updated.

var float			NextNetUpdateTime;	// Next time we should force an update of vehicles state.
var() float			MaxNetUpdateInterval;

var int AVar;//Just for replication, else the ShipState doesn't get replicated

Replication
{
	unreliable if(Role == ROLE_Authority)
		ShipState, AVar;
}

simulated event VehicleStateReceived()
{
	if(!ShipState.bNewState)
		return;

	// Get root chassis info
	ChassisState.Position = ShipState.ChassisPosition;
	ChassisState.Quaternion = ShipState.ChassisQuaternion;
	ChassisState.LinVel = ShipState.ChassisLinVel;
	ChassisState.AngVel = ShipState.ChassisAngVel;

	// Update control inputs
	Steering = ShipState.ServerSteering;
	Throttle = ShipState.ServerThrottle;
	Roll = ShipState.ServerRoll;

	// Afterburner
	bAfterburn = ShipState.ServerbAfterburn;
	bBurn = ShipState.ServerbBurn;

	// Update flags
	ShipState.bNewState = false;
	bNewShipState = true;
}

simulated event bool KUpdateState(out KRigidBodyState newState)
{
	// This should never get called on the server - but just in case!
	if(Role == ROLE_Authority || !bNewShipState)
		return false;

	// Apply received data as new position of ship chassis.
	newState = ChassisState;
	bNewShipState = false;

	return true;
}

function PackState()
{
	local vector chassisPos, chassisLinVel, chassisAngVel;
	local vector oldPos, oldLinVel;
	local KRigidBodyState ChassisState;

	// Get chassis state.
	KGetRigidBodyState(ChassisState);

	chassisPos = KRBVecToVector(ChassisState.Position);
	chassisLinVel = KRBVecToVector(ChassisState.LinVel);
	chassisAngVel = KRBVecToVector(ChassisState.AngVel);

	// Last position we sent
	oldPos = KRBVectoVector(ShipState.ChassisPosition);
	oldLinVel = KRBVectoVector(ShipState.ChassisLinVel);

	// See if state has changed enough, or enough time has passed, that we 
	// should send out another update by updating the state struct.
	if( !KIsAwake() )
	{
		return; // Never send updates if physics is at rest
	}

	if( VSize(oldPos - chassisPos) &gt; 5 ||
		VSize(oldLinVel - chassisLinVel) &gt; 1 ||
		Abs(ShipState.ServerThrottle - Throttle) &gt; 0.1 ||
		Abs(ShipState.ServerSteering - Steering) &gt; 0.1 ||
		Abs(ShipState.ServerRoll - Roll) &gt; 0.1 ||
		bAfterburn != ShipState.ServerbAfterburn ||
		bBurn != ShipState.ServerbBurn ||
		Level.TimeSeconds &gt; NextNetUpdateTime )
	{
		NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
	}
	else
	{
		return;
	}

	ShipState.ChassisPosition = ChassisState.Position;
	ShipState.ChassisQuaternion = ChassisState.Quaternion;
	ShipState.ChassisLinVel = ChassisState.LinVel;
	ShipState.ChassisAngVel = ChassisState.AngVel;

	// Player Input
	ShipState.ServerSteering = Steering;
	ShipState.ServerThrottle = Throttle;
	ShipState.ServerRoll = Roll;

	// AfterBurner
	ShipState.ServerbAfterburn = bAfterburn;
	ShipState.ServerbBurn = bBurn;

	// This flag lets the client know this data is new.
	ShipState.bNewState = true;
	//Make sure ShipState gets replicated
	AVar++;
	if (AVar &gt; 10)
		AVar=0;
}

simulated function Tick(float DeltaTime)
{
	Super.Tick(DeltaTime);
	if(!KIsAwake() &amp;&amp; Controller!=None)
		KWake();
	if(Role == ROLE_Authority &amp;&amp; Level.NetMode != NM_StandAlone)
		PackState();
	UpdateAcceleration(DeltaTime);
	UpdateExtraForce(DeltaTime);
}
simulated function UpdateAcceleration(float Delta)
{
	CurSteering = CurSteering + Steering * UnitAccRate * Delta;
	CurThrottle = CurThrottle + Throttle * UnitAccRate * Delta;
	CurRoll     = CurRoll     + Roll     * UnitAccRate * Delta;
	if(Steering==0)
		CurSteering=0;
	if(Throttle==0)
		CurThrottle=0;
	if(Roll==0)
		CurRoll=0;

	if(Abs(CurSteering)&gt;Abs(Steering))
		CurSteering=Steering;
	if(Abs(CurThrottle)&gt;Abs(Throttle))
		CurThrottle=Throttle;
	if(Abs(CurRoll)&gt;Abs(Roll))
		CurRoll=Roll;

	if(bAfterBurn)
	{
		ReduceAfterBurnEnergy(); // just made this up, put it here incase you have something like this
		if(GetAfterburnEnergy()&lt;=0) // Another fictional function...
		{
			bAfterBurn=False;
		}
		else
		{
			CThrust=AfterBurnThrust;
		}
	}
	if(bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=1)
	{
		CThrust=1;
	}
	else if(!bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=OldThrust)
	{
		CThrust=OldThrust;
	}

	if(TempThrust!=-1 &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-TempThrust)&lt;0.01)
			CurThrust=TempThrust;
		if(CurThrust&gt;TempThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4; 
			// I made linear acceleration 4 times slower than rotation, you can do whatever you want though
		else if(CurThrust&lt;TempThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4;
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 2.2; // Acceleration with afterburner a lot faster
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 2.2;
	}
}

simulated function UpdateExtraForce(float Delta)
{
	local vector worldForward, worldDown, worldLeft;

	worldForward = vect(1, 0, 0) &gt;&gt; Rotation;
	worldDown = vect(0, 0, -1) &gt;&gt; Rotation;
	worldLeft = vect(0, -1, 0) &gt;&gt; Rotation;

	ExtraForce = ExtraForce + worldForward * ForwardThrust * Delta * CurThrust; // Speed
	ExtraTorque = ExtraTorque + worldDown * TurnRate * Delta * CurSteering; // Yaw
	ExtraTorque = ExtraTorque + worldLeft * TurnRate * Delta * CurThrottle; // Pitch
	ExtraTorque = ExtraTorque + worldForward * TurnRate * Delta * -CurRoll; // Roll
}

simulated event KApplyForce(out vector Force, out vector Torque)
{
	// This actually does the applying of the piled up force
	Force = ExtraForce;
	Torque = ExtraTorque;
	ExtraForce = vect(0,0,0);
	ExtraTorque = vect(0,0,0);
}

DefaultProperties
{
     // Create Karma collision Params for ourselves, you can change whatever you want here
     Begin Object Class=KarmaParamsRBFull Name=KParams0
         KLinearDamping=2.000;
         KAngularDamping=2.000;
         KStartEnabled=True
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=False
         KFriction=1.600000
         KActorGravScale = 0.0;
	 KMass=2;
         Name=&quot;KParams0&quot;
     End Object
     KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0'

     // And just some other variables:
     TurnRate=8
     ForwardThrust=5000
     UnitAccRate=2.0
     AfterBurnThrust=1.20 // basically means that afterburner goes at 120% of regular maximum speed
}
&lt;/uscript&gt;

and that should be it, i hope i didnt miss anything...

'''Spark: ''' KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0' &lt;&amp;ndash; Is this supposed to be a trap? ;) Took me a while to figure out that my ship didn't fly because this wasn't set to KParams0 and thus wasn't enabled at all. :)

'''Sir_Brizz: ''' Zep, did you end up getting your Quaternion working for the indicator? I have a few ideas that work if you want to know what they are.

'''ProjectX:''' I'm a n00b to coding, but is it possible to take this code, and change it to create a &quot;hovering vehicles&quot; class, that basicly, wont go a certan height above ground, but, from high jumps, etc., go lower to the ground? I also saw that there was 3 types of thrust, is it possible to bind a key that will cycle through the flying types (for more precise flying, eg. for dog matches and realism)?

'''NickR:''' Does anyone have a working example of a flying vehicle?</text>
    </revision>
    <revision>
      <id>42912</id>
      <timestamp>2010-04-17T03:41:19Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <text xml:space="preserve">Well this is basically my code for a space ship, thanks a lot to Daid for lending me his replication code (which turned out to come from KCar but i thank him non the less, great guy he is :D)

I currently use a different, more client oriented replication system, but this one here is a lot better, i havent incorporated my ship to it yet because i have some other problems that come with it that i have to solve, but since the &quot;core&quot; ship here is simple, ill use the better replication for you guys :)

(Btw i deal with all the entering/leaving of the vehicle in a parent class, this is really irrelevant to physics and is easy to do, so i left it out just so there will be less and easier to read code)

&lt;uscript&gt;
var float			Roll, CThrust, TempThrust, OldThrust; 
// Throttle and Steering are already declared in KVehicle, so all we need is roll, CThrust, TempThrust, OldThrust will be explained soon
// BTW note that i use Throttle for Pitch alteration because it is already bound by other vehicles to the forward/backward key
// ok i have also incorporated a system that allows for various thrust managments, 
//if you simply want to move forward full speed only while you press the the thrust button, you would use TempThrust. 
//when you release the thrust button you though you should always set TempThrust to -1
// if you want to have a constant speed, assign it to CThrust, so every time you release the thrust button (the one that changes TempThrust) 
// you would automatically start going at that speed (good for stuff like dogifghting and matching speeds)
// and lastly i added an afterburner effect, ill include it here for you guys to see although it isnt hard to do.
// also what i did with it was that when you afterburn and you run out of energy, while you still hold the afterburn key
// you would keep going at your max possible speed, and once you release it you would start going at your constant wanted speed (CThrust)
// Thats why i have 2 vars, bAfterburn is for after burning (holding key and having enough E), bBurn is for only holding the afterburn key with no regard to its depletion
var bool			bAfterburn, bBurn; // note that you should set both of those to true when you want to afterburn
var() float			ForwardTrust, TurnRate, AfterBurnThrust; // This is basically how fast our ship turns/moves
var float			CurRoll, CurSteering, CurThrottle, UnitAccRate; // This is used for acceleration
// CThrust is used for ships that can assign a specific throttle value, like 75% of max speed or whatever...
// UnitAccRate is how much each value increases per second
var vector			ExtraForce, ExtraTorque; // Used for Karama forces pileup

// Ship replication vars and functions, thanks daid!
struct StructShipState
{
	var KRBVec				ChassisPosition;
	var Quat				ChassisQuaternion;
	var KRBVec				ChassisLinVel;
	var KRBVec				ChassisAngVel;

	var float				ServerSteering;
	var float				ServerThrottle;
	var float				ServerRoll;

	var bool				ServerbAfterburn;
	var bool				ServerbBurn;

	var bool				bNewState; // Set to true whenever a new state is received and should be processed
};

var KRigidBodyState		ChassisState;

var StructShipState		ShipState; // This is replicated to the ship, and processed to update all the parts.
var bool			bNewShipState; // Indicated there is new data processed, and chassis RBState should be updated.

var float			NextNetUpdateTime;	// Next time we should force an update of vehicles state.
var() float			MaxNetUpdateInterval;

var int AVar;//Just for replication, else the ShipState doesn't get replicated

Replication
{
	unreliable if(Role == ROLE_Authority)
		ShipState, AVar;
}

simulated event VehicleStateReceived()
{
	if(!ShipState.bNewState)
		return;

	// Get root chassis info
	ChassisState.Position = ShipState.ChassisPosition;
	ChassisState.Quaternion = ShipState.ChassisQuaternion;
	ChassisState.LinVel = ShipState.ChassisLinVel;
	ChassisState.AngVel = ShipState.ChassisAngVel;

	// Update control inputs
	Steering = ShipState.ServerSteering;
	Throttle = ShipState.ServerThrottle;
	Roll = ShipState.ServerRoll;

	// Afterburner
	bAfterburn = ShipState.ServerbAfterburn;
	bBurn = ShipState.ServerbBurn;

	// Update flags
	ShipState.bNewState = false;
	bNewShipState = true;
}

simulated event bool KUpdateState(out KRigidBodyState newState)
{
	// This should never get called on the server - but just in case!
	if(Role == ROLE_Authority || !bNewShipState)
		return false;

	// Apply received data as new position of ship chassis.
	newState = ChassisState;
	bNewShipState = false;

	return true;
}

function PackState()
{
	local vector chassisPos, chassisLinVel, chassisAngVel;
	local vector oldPos, oldLinVel;
	local KRigidBodyState ChassisState;

	// Get chassis state.
	KGetRigidBodyState(ChassisState);

	chassisPos = KRBVecToVector(ChassisState.Position);
	chassisLinVel = KRBVecToVector(ChassisState.LinVel);
	chassisAngVel = KRBVecToVector(ChassisState.AngVel);

	// Last position we sent
	oldPos = KRBVectoVector(ShipState.ChassisPosition);
	oldLinVel = KRBVectoVector(ShipState.ChassisLinVel);

	// See if state has changed enough, or enough time has passed, that we 
	// should send out another update by updating the state struct.
	if( !KIsAwake() )
	{
		return; // Never send updates if physics is at rest
	}

	if( VSize(oldPos - chassisPos) &gt; 5 ||
		VSize(oldLinVel - chassisLinVel) &gt; 1 ||
		Abs(ShipState.ServerThrottle - Throttle) &gt; 0.1 ||
		Abs(ShipState.ServerSteering - Steering) &gt; 0.1 ||
		Abs(ShipState.ServerRoll - Roll) &gt; 0.1 ||
		bAfterburn != ShipState.ServerbAfterburn ||
		bBurn != ShipState.ServerbBurn ||
		Level.TimeSeconds &gt; NextNetUpdateTime )
	{
		NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
	}
	else
	{
		return;
	}

	ShipState.ChassisPosition = ChassisState.Position;
	ShipState.ChassisQuaternion = ChassisState.Quaternion;
	ShipState.ChassisLinVel = ChassisState.LinVel;
	ShipState.ChassisAngVel = ChassisState.AngVel;

	// Player Input
	ShipState.ServerSteering = Steering;
	ShipState.ServerThrottle = Throttle;
	ShipState.ServerRoll = Roll;

	// AfterBurner
	ShipState.ServerbAfterburn = bAfterburn;
	ShipState.ServerbBurn = bBurn;

	// This flag lets the client know this data is new.
	ShipState.bNewState = true;
	//Make sure ShipState gets replicated
	AVar++;
	if (AVar &gt; 10)
		AVar=0;
}

simulated function Tick(float DeltaTime)
{
	Super.Tick(DeltaTime);
	if(!KIsAwake() &amp;&amp; Controller!=None)
		KWake();
	if(Role == ROLE_Authority &amp;&amp; Level.NetMode != NM_StandAlone)
		PackState();
	UpdateAcceleration(DeltaTime);
	UpdateExtraForce(DeltaTime);
}
simulated function UpdateAcceleration(float Delta)
{
	CurSteering = CurSteering + Steering * UnitAccRate * Delta;
	CurThrottle = CurThrottle + Throttle * UnitAccRate * Delta;
	CurRoll     = CurRoll     + Roll     * UnitAccRate * Delta;
	if(Steering==0)
		CurSteering=0;
	if(Throttle==0)
		CurThrottle=0;
	if(Roll==0)
		CurRoll=0;

	if(Abs(CurSteering)&gt;Abs(Steering))
		CurSteering=Steering;
	if(Abs(CurThrottle)&gt;Abs(Throttle))
		CurThrottle=Throttle;
	if(Abs(CurRoll)&gt;Abs(Roll))
		CurRoll=Roll;

	if(bAfterBurn)
	{
		ReduceAfterBurnEnergy(); // just made this up, put it here incase you have something like this
		if(GetAfterburnEnergy()&lt;=0) // Another fictional function...
		{
			bAfterBurn=False;
		}
		else
		{
			CThrust=AfterBurnThrust;
		}
	}
	if(bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=1)
	{
		CThrust=1;
	}
	else if(!bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=OldThrust)
	{
		CThrust=OldThrust;
	}

	if(TempThrust!=-1 &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-TempThrust)&lt;0.01)
			CurThrust=TempThrust;
		if(CurThrust&gt;TempThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4; 
			// I made linear acceleration 4 times slower than rotation, you can do whatever you want though
		else if(CurThrust&lt;TempThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4;
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 2.2; // Acceleration with afterburner a lot faster
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 2.2;
	}
}

simulated function UpdateExtraForce(float Delta)
{
	local vector worldForward, worldDown, worldLeft;

	worldForward = vect(1, 0, 0) &gt;&gt; Rotation;
	worldDown = vect(0, 0, -1) &gt;&gt; Rotation;
	worldLeft = vect(0, -1, 0) &gt;&gt; Rotation;

	ExtraForce = ExtraForce + worldForward * ForwardThrust * Delta * CurThrust; // Speed
	ExtraTorque = ExtraTorque + worldDown * TurnRate * Delta * CurSteering; // Yaw
	ExtraTorque = ExtraTorque + worldLeft * TurnRate * Delta * CurThrottle; // Pitch
	ExtraTorque = ExtraTorque + worldForward * TurnRate * Delta * -CurRoll; // Roll
}

simulated event KApplyForce(out vector Force, out vector Torque)
{
	// This actually does the applying of the piled up force
	Force = ExtraForce;
	Torque = ExtraTorque;
	ExtraForce = vect(0,0,0);
	ExtraTorque = vect(0,0,0);
}

DefaultProperties
{
     // Create Karma collision Params for ourselves, you can change whatever you want here
     Begin Object Class=KarmaParamsRBFull Name=KParams0
         KLinearDamping=2.000;
         KAngularDamping=2.000;
         KStartEnabled=True
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=False
         KFriction=1.600000
         KActorGravScale = 0.0;
	 KMass=2;
         Name=&quot;KParams0&quot;
     End Object
     KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0'

     // And just some other variables:
     TurnRate=8
     ForwardThrust=5000
     UnitAccRate=2.0
     AfterBurnThrust=1.20 // basically means that afterburner goes at 120% of regular maximum speed
}
&lt;/uscript&gt;

and that should be it, i hope i didnt miss anything...

'''Spark: ''' KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0' &lt;&amp;ndash; Is this supposed to be a trap? ;) Took me a while to figure out that my ship didn't fly because this wasn't set to KParams0 and thus wasn't enabled at all. :)

'''Sir_Brizz: ''' Zep, did you end up getting your Quaternion working for the indicator? I have a few ideas that work if you want to know what they are.

'''ProjectX:''' I'm a n00b to coding, but is it possible to take this code, and change it to create a &quot;hovering vehicles&quot; class, that basicly, wont go a certan height above ground, but, from high jumps, etc., go lower to the ground? I also saw that there was 3 types of thrust, is it possible to bind a key that will cycle through the flying types (for more precise flying, eg. for dog matches and realism)?

'''NickR:''' Does anyone have a working example of a flying vehicle?

'''Foxpaw:''' I do, but my mod is still quite a ways from release. The code above allegedly is working code for a flying vehicle, though I've never tested it.

'''LiKeMiKeS:''' I've tried many times compiling this KShip script and have ended up with an error for the ShipState 'struct' &amp; 'var' references obscuring each other and haven't been able to figure out a clean fix so it will compile - without creating another unneeded var instance or reference. I'm still learning the nuances of uscript, so it's difficult to debug atm.</text>
    </revision>
    <revision>
      <id>42913</id>
      <timestamp>2010-04-17T15:32:10Z</timestamp>
      <contributor>
        <ip>99.236.204.143</ip>
      </contributor>
      <comment>Added an implmentation for KShip which should work out-of-the-box, and a sample vehicle (FlyingDog) based on it.</comment>
      <text xml:space="preserve">Well this is basically my code for a space ship, thanks a lot to Daid for lending me his replication code (which turned out to come from KCar but i thank him non the less, great guy he is :D)

I currently use a different, more client oriented replication system, but this one here is a lot better, i havent incorporated my ship to it yet because i have some other problems that come with it that i have to solve, but since the &quot;core&quot; ship here is simple, ill use the better replication for you guys :)

(Btw i deal with all the entering/leaving of the vehicle in a parent class, this is really irrelevant to physics and is easy to do, so i left it out just so there will be less and easier to read code)

&lt;uscript&gt;
var float			Roll, CThrust, TempThrust, OldThrust; 
// Throttle and Steering are already declared in KVehicle, so all we need is roll, CThrust, TempThrust, OldThrust will be explained soon
// BTW note that i use Throttle for Pitch alteration because it is already bound by other vehicles to the forward/backward key
// ok i have also incorporated a system that allows for various thrust managments, 
//if you simply want to move forward full speed only while you press the the thrust button, you would use TempThrust. 
//when you release the thrust button you though you should always set TempThrust to -1
// if you want to have a constant speed, assign it to CThrust, so every time you release the thrust button (the one that changes TempThrust) 
// you would automatically start going at that speed (good for stuff like dogifghting and matching speeds)
// and lastly i added an afterburner effect, ill include it here for you guys to see although it isnt hard to do.
// also what i did with it was that when you afterburn and you run out of energy, while you still hold the afterburn key
// you would keep going at your max possible speed, and once you release it you would start going at your constant wanted speed (CThrust)
// Thats why i have 2 vars, bAfterburn is for after burning (holding key and having enough E), bBurn is for only holding the afterburn key with no regard to its depletion
var bool			bAfterburn, bBurn; // note that you should set both of those to true when you want to afterburn
var() float			ForwardTrust, TurnRate, AfterBurnThrust; // This is basically how fast our ship turns/moves
var float			CurRoll, CurSteering, CurThrottle, UnitAccRate; // This is used for acceleration
// CThrust is used for ships that can assign a specific throttle value, like 75% of max speed or whatever...
// UnitAccRate is how much each value increases per second
var vector			ExtraForce, ExtraTorque; // Used for Karama forces pileup

// Ship replication vars and functions, thanks daid!
struct StructShipState
{
	var KRBVec				ChassisPosition;
	var Quat				ChassisQuaternion;
	var KRBVec				ChassisLinVel;
	var KRBVec				ChassisAngVel;

	var float				ServerSteering;
	var float				ServerThrottle;
	var float				ServerRoll;

	var bool				ServerbAfterburn;
	var bool				ServerbBurn;

	var bool				bNewState; // Set to true whenever a new state is received and should be processed
};

var KRigidBodyState		ChassisState;

var StructShipState		ShipState; // This is replicated to the ship, and processed to update all the parts.
var bool			bNewShipState; // Indicated there is new data processed, and chassis RBState should be updated.

var float			NextNetUpdateTime;	// Next time we should force an update of vehicles state.
var() float			MaxNetUpdateInterval;

var int AVar;//Just for replication, else the ShipState doesn't get replicated

Replication
{
	unreliable if(Role == ROLE_Authority)
		ShipState, AVar;
}

simulated event VehicleStateReceived()
{
	if(!ShipState.bNewState)
		return;

	// Get root chassis info
	ChassisState.Position = ShipState.ChassisPosition;
	ChassisState.Quaternion = ShipState.ChassisQuaternion;
	ChassisState.LinVel = ShipState.ChassisLinVel;
	ChassisState.AngVel = ShipState.ChassisAngVel;

	// Update control inputs
	Steering = ShipState.ServerSteering;
	Throttle = ShipState.ServerThrottle;
	Roll = ShipState.ServerRoll;

	// Afterburner
	bAfterburn = ShipState.ServerbAfterburn;
	bBurn = ShipState.ServerbBurn;

	// Update flags
	ShipState.bNewState = false;
	bNewShipState = true;
}

simulated event bool KUpdateState(out KRigidBodyState newState)
{
	// This should never get called on the server - but just in case!
	if(Role == ROLE_Authority || !bNewShipState)
		return false;

	// Apply received data as new position of ship chassis.
	newState = ChassisState;
	bNewShipState = false;

	return true;
}

function PackState()
{
	local vector chassisPos, chassisLinVel, chassisAngVel;
	local vector oldPos, oldLinVel;
	local KRigidBodyState ChassisState;

	// Get chassis state.
	KGetRigidBodyState(ChassisState);

	chassisPos = KRBVecToVector(ChassisState.Position);
	chassisLinVel = KRBVecToVector(ChassisState.LinVel);
	chassisAngVel = KRBVecToVector(ChassisState.AngVel);

	// Last position we sent
	oldPos = KRBVectoVector(ShipState.ChassisPosition);
	oldLinVel = KRBVectoVector(ShipState.ChassisLinVel);

	// See if state has changed enough, or enough time has passed, that we 
	// should send out another update by updating the state struct.
	if( !KIsAwake() )
	{
		return; // Never send updates if physics is at rest
	}

	if( VSize(oldPos - chassisPos) &gt; 5 ||
		VSize(oldLinVel - chassisLinVel) &gt; 1 ||
		Abs(ShipState.ServerThrottle - Throttle) &gt; 0.1 ||
		Abs(ShipState.ServerSteering - Steering) &gt; 0.1 ||
		Abs(ShipState.ServerRoll - Roll) &gt; 0.1 ||
		bAfterburn != ShipState.ServerbAfterburn ||
		bBurn != ShipState.ServerbBurn ||
		Level.TimeSeconds &gt; NextNetUpdateTime )
	{
		NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
	}
	else
	{
		return;
	}

	ShipState.ChassisPosition = ChassisState.Position;
	ShipState.ChassisQuaternion = ChassisState.Quaternion;
	ShipState.ChassisLinVel = ChassisState.LinVel;
	ShipState.ChassisAngVel = ChassisState.AngVel;

	// Player Input
	ShipState.ServerSteering = Steering;
	ShipState.ServerThrottle = Throttle;
	ShipState.ServerRoll = Roll;

	// AfterBurner
	ShipState.ServerbAfterburn = bAfterburn;
	ShipState.ServerbBurn = bBurn;

	// This flag lets the client know this data is new.
	ShipState.bNewState = true;
	//Make sure ShipState gets replicated
	AVar++;
	if (AVar &gt; 10)
		AVar=0;
}

simulated function Tick(float DeltaTime)
{
	Super.Tick(DeltaTime);
	if(!KIsAwake() &amp;&amp; Controller!=None)
		KWake();
	if(Role == ROLE_Authority &amp;&amp; Level.NetMode != NM_StandAlone)
		PackState();
	UpdateAcceleration(DeltaTime);
	UpdateExtraForce(DeltaTime);
}
simulated function UpdateAcceleration(float Delta)
{
	CurSteering = CurSteering + Steering * UnitAccRate * Delta;
	CurThrottle = CurThrottle + Throttle * UnitAccRate * Delta;
	CurRoll     = CurRoll     + Roll     * UnitAccRate * Delta;
	if(Steering==0)
		CurSteering=0;
	if(Throttle==0)
		CurThrottle=0;
	if(Roll==0)
		CurRoll=0;

	if(Abs(CurSteering)&gt;Abs(Steering))
		CurSteering=Steering;
	if(Abs(CurThrottle)&gt;Abs(Throttle))
		CurThrottle=Throttle;
	if(Abs(CurRoll)&gt;Abs(Roll))
		CurRoll=Roll;

	if(bAfterBurn)
	{
		ReduceAfterBurnEnergy(); // just made this up, put it here incase you have something like this
		if(GetAfterburnEnergy()&lt;=0) // Another fictional function...
		{
			bAfterBurn=False;
		}
		else
		{
			CThrust=AfterBurnThrust;
		}
	}
	if(bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=1)
	{
		CThrust=1;
	}
	else if(!bBurn &amp;&amp; !bAfterBurn &amp;&amp; CThrust!=OldThrust)
	{
		CThrust=OldThrust;
	}

	if(TempThrust!=-1 &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-TempThrust)&lt;0.01)
			CurThrust=TempThrust;
		if(CurThrust&gt;TempThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4; 
			// I made linear acceleration 4 times slower than rotation, you can do whatever you want though
		else if(CurThrust&lt;TempThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; !bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 4;
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 4;
	}
	else if(CurThrust!=CThrust &amp;&amp; bAfterBurn)
	{
		if(Abs(CurThrust-CThrust)&lt;0.01)
			CurThrust=CThrust;
		else if(CurThrust&gt;CThrust)
			CurThrust = CurThrust - UnitAccRate * Delta / 2.2; // Acceleration with afterburner a lot faster
		else if(CurThrust&lt;CThrust)
			CurThrust = CurThrust + UnitAccRate * Delta / 2.2;
	}
}

simulated function UpdateExtraForce(float Delta)
{
	local vector worldForward, worldDown, worldLeft;

	worldForward = vect(1, 0, 0) &gt;&gt; Rotation;
	worldDown = vect(0, 0, -1) &gt;&gt; Rotation;
	worldLeft = vect(0, -1, 0) &gt;&gt; Rotation;

	ExtraForce = ExtraForce + worldForward * ForwardThrust * Delta * CurThrust; // Speed
	ExtraTorque = ExtraTorque + worldDown * TurnRate * Delta * CurSteering; // Yaw
	ExtraTorque = ExtraTorque + worldLeft * TurnRate * Delta * CurThrottle; // Pitch
	ExtraTorque = ExtraTorque + worldForward * TurnRate * Delta * -CurRoll; // Roll
}

simulated event KApplyForce(out vector Force, out vector Torque)
{
	// This actually does the applying of the piled up force
	Force = ExtraForce;
	Torque = ExtraTorque;
	ExtraForce = vect(0,0,0);
	ExtraTorque = vect(0,0,0);
}

DefaultProperties
{
     // Create Karma collision Params for ourselves, you can change whatever you want here
     Begin Object Class=KarmaParamsRBFull Name=KParams0
         KLinearDamping=2.000;
         KAngularDamping=2.000;
         KStartEnabled=True
         bHighDetailOnly=False
         bClientOnly=False
         bKDoubleTickRate=False
         KFriction=1.600000
         KActorGravScale = 0.0;
	 KMass=2;
         Name=&quot;KParams0&quot;
     End Object
     KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0'

     // And just some other variables:
     TurnRate=8
     ForwardThrust=5000
     UnitAccRate=2.0
     AfterBurnThrust=1.20 // basically means that afterburner goes at 120% of regular maximum speed
}
&lt;/uscript&gt;

and that should be it, i hope i didnt miss anything...

'''Spark: ''' KParams=KarmaParamsRBFull'&lt;MyPackage&gt;.&lt;MyShipClass&gt;.KParams0' &lt;&amp;ndash; Is this supposed to be a trap? ;) Took me a while to figure out that my ship didn't fly because this wasn't set to KParams0 and thus wasn't enabled at all. :)

'''Sir_Brizz: ''' Zep, did you end up getting your Quaternion working for the indicator? I have a few ideas that work if you want to know what they are.

'''ProjectX:''' I'm a n00b to coding, but is it possible to take this code, and change it to create a &quot;hovering vehicles&quot; class, that basicly, wont go a certan height above ground, but, from high jumps, etc., go lower to the ground? I also saw that there was 3 types of thrust, is it possible to bind a key that will cycle through the flying types (for more precise flying, eg. for dog matches and realism)?

'''NickR:''' Does anyone have a working example of a flying vehicle?

'''Foxpaw:''' I do, but my mod is still quite a ways from release. The code above allegedly is working code for a flying vehicle, though I've never tested it.

'''LiKeMiKeS:''' I've tried many times compiling this KShip script and have ended up with an error for the ShipState 'struct' &amp; 'var' references obscuring each other and haven't been able to figure out a clean fix so it will compile - without creating another unneeded var instance or reference. I'm still learning the nuances of uscript, so it's difficult to debug atm.

'''Brold9999:''' I tried the above code long ago and it didn't seem to work. I have gotten a lot of questions on my mod, UT Space Battle, as to how I implemented the vehicles. I did not use a Karma or PhysX based approach but that is what most of the people who have asked me about this seem to be looking for. I have taken the code above and hammered away at it until it works. I ripped out many unnecessary sections (such as afterburner) which only cluttered the salient concepts of implementing a 6DOF vehicle. The new version should compile and work out-of-the-box and has (mostly) working netcode. Some tweaks are still necessary to make a vehicle suitable for a mod but this one does the basics that seem to trip most people up when they try to implement a 6DOF vehicle. KShip is the base 6DOF vehicle, FlyingDog is a butchered Bulldog which is based on KShip. Code follows:

&lt;uscript&gt;
class KShip extends KVehicle;

// Used for Karma forces pileup
// Add to these variables to apply force and torque to the ship.
var vector extraForce, extraTorque;

// Amount to increment/decrement shipSteering.roll for every click of the mouse wheel.
var float rollUnit;
// Desired rotation torque is reduced each tick. This factor controls how rapidly old inputs decay.
var float turnDecayTime;
// Amount of rotation torque to apply for a given amount of mouse movement.
var float turnSensitivity;
// Maximum amount of rotation torque that can be accumulated.
var float maximumTurnRate;
// Maximum linear thrust the ship can apply.
var float maximumThrust;

// Desired torque on the ship - relative to it's current rotation.
var rotator shipSteering;
// Desired linear thrust to apply to the ship - not relative to it's current rotation.
var vector shipThrust;

// Ship replication vars and functions, thanks daid!
struct StructShipState
{
  var KRBVec  ChassisPosition;
  var Quat    ChassisQuaternion;
  var KRBVec  ChassisLinVel;
  var KRBVec  ChassisAngVel;
 
  var rotator serverSteering;
  var vector  serverThrust;

  var bool    bNewState; // Set to true whenever a new state is received and should be processed
};
 
var KRigidBodyState ChassisState;
var StructShipState ShipState; // This is replicated to the ship, and processed to update all the parts.
var bool bNewShipState; // Indicated there is new data processed, and chassis RBState should be updated.
 
var float NextNetUpdateTime;  // Next time we should force an update of vehicles state.
var() float MaxNetUpdateInterval;
 
var int AVar;//Just for replication, else the ShipState doesn't get replicated

replication
{
  unreliable if(Role == ROLE_Authority)
    ShipState, AVar;
}
 
simulated event VehicleStateReceived()
{
  if(!ShipState.bNewState)
    return;
 
  // Get root chassis info
  ChassisState.Position = ShipState.ChassisPosition;
  ChassisState.Quaternion = ShipState.ChassisQuaternion;
  ChassisState.LinVel = ShipState.ChassisLinVel;
  ChassisState.AngVel = ShipState.ChassisAngVel;
 
  // Update control inputs
  shipSteering = ShipState.serverSteering;
  shipThrust = ShipState.serverThrust;
 
  // Update flags
  ShipState.bNewState = false;
  bNewShipState = true;
}
 
simulated event bool KUpdateState(out KRigidBodyState newState)
{
  // This should never get called on the server - but just in case!
  if(Role == ROLE_Authority || !bNewShipState)
    return false;
 
  // Apply received data as new position of ship chassis.
  newState = ChassisState;
  bNewShipState = false;
 
  return true;
}
 
function PackState()
{
  local vector chassisPos, chassisLinVel, chassisAngVel;
  local vector oldPos, oldLinVel;
  local KRigidBodyState localChassisState;
 
  // Get chassis state.
  KGetRigidBodyState(localChassisState);
 
  chassisPos = KRBVecToVector(localChassisState.Position);
  chassisLinVel = KRBVecToVector(localChassisState.LinVel);
  chassisAngVel = KRBVecToVector(localChassisState.AngVel);
 
  // Last position we sent
  oldPos = KRBVectoVector(ShipState.ChassisPosition);
  oldLinVel = KRBVectoVector(ShipState.ChassisLinVel);
 
  // See if state has changed enough, or enough time has passed, that we 
  // should send out another update by updating the state struct.
  if( !KIsAwake() )
  {
    return; // Never send updates if physics is at rest
  }
 
  if( VSize(oldPos - chassisPos) &gt; 5 ||
    VSize(oldLinVel - chassisLinVel) &gt; 1 ||
    abs(shipState.serverSteering.yaw - shipSteering.yaw) &gt; 0.1 ||
    abs(shipState.serverSteering.pitch - shipSteering.pitch) &gt; 0.1 ||
    abs(shipState.serverSteering.roll - shipSteering.roll) &gt; 0.1 ||
    VSize(shipState.serverThrust - shipThrust) &gt; 1 ||
    Level.TimeSeconds &gt; NextNetUpdateTime )
  {
    NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval;
  }
  else
  {
    return;
  }
 
  ShipState.ChassisPosition = localChassisState.Position;
  ShipState.ChassisQuaternion = localChassisState.Quaternion;
  ShipState.ChassisLinVel = localChassisState.LinVel;
  ShipState.ChassisAngVel = localChassisState.AngVel;
 
  shipState.serverSteering = shipSteering;
  shipState.serverThrust = shipThrust;
 
  // This flag lets the client know this data is new.
  ShipState.bNewState = true;
  //Make sure ShipState gets replicated
  AVar++;
  if (AVar &gt; 10)
    AVar=0;
}
 
simulated function setInitialState() {
  super.setInitialState();

  // don't disable my tick!
  enable('tick');
}


simulated event drivingStatusChanged() {
  super.drivingStatusChanged();

  // don't disable my tick!
  enable('tick');
}

function KDriverEnter(Pawn P) {
  super.KDriverEnter(p);
  
  if (PlayerController(controller) != none)
    controller.gotoState(landMovementState);
}

simulated function prevWeapon() {
  shipSteering.roll = fclamp(shipSteering.roll - (rollUnit * turnSensitivity), -maximumTurnRate, maximumTurnRate);
}

simulated function nextWeapon() {
  shipSteering.roll = fclamp(shipSteering.roll + (rollUnit * turnSensitivity), -maximumTurnRate, maximumTurnRate);
}

simulated function updateRocketAcceleration(float deltaTime, float yawChange, float pitchChange) {
  if (deltaTime &gt;= turnDecayTime)
    shipSteering = rot(0,0,0);
  else
    shipSteering *= (turnDecayTime-deltaTime) / turnDecayTime;
  
  // / 6000 because the aForward, etc. are 6000 by default when the appropriate button is pressed.
  shipThrust = (((vect(1,0,0) * PlayerController(Controller).aForward) + (vect(0,1,0) * PlayerController(Controller).aStrafe) + (vect(0,0,1) * PlayerController(Controller).aUp)) / 6000) &gt;&gt; rotation;
  if (vsize(shipThrust) &gt; 1)
    shipThrust = normal(shipThrust);

  shipSteering.yaw = fclamp(shipSteering.yaw - (yawChange * turnSensitivity), -maximumTurnRate, maximumTurnRate);
  shipSteering.pitch = fclamp(shipSteering.pitch + (pitchChange * turnSensitivity), -maximumTurnRate, maximumTurnRate);
}
  
simulated function tick(float delta)
{  super.tick(delta);

  if (controller == none) {
    shipThrust = vect(0,0,0);
    shipSteering = rot(0,0,0);
  }

  if(!KIsAwake() &amp;&amp; controller != none)
    KWake();
    
  if(Role == ROLE_Authority &amp;&amp; Level.NetMode != NM_StandAlone)
    PackState();

  updateExtraForce(delta);
}

simulated function updateExtraForce(float delta)
{
  local vector worldForward, worldDown, worldLeft;
 
  worldForward = vect(1, 0, 0) &gt;&gt; Rotation;
  worldDown = vect(0, 0, -1) &gt;&gt; Rotation;
  worldLeft = vect(0, -1, 0) &gt;&gt; Rotation;
 
  ExtraForce = ExtraForce + shipThrust * maximumThrust * delta; // Speed
  ExtraTorque = ExtraTorque + worldDown * shipSteering.yaw * delta; // Yaw
  ExtraTorque = ExtraTorque - worldLeft * -shipSteering.pitch * delta; // Pitch
  ExtraTorque = ExtraTorque + worldForward * -shipSteering.roll * delta; // Roll
}

simulated event KApplyForce(out vector Force, out vector Torque)
{
  // This actually does the applying of the piled up force
  Force = ExtraForce;
  Torque = ExtraTorque;
  ExtraForce = vect(0,0,0);
  ExtraTorque = vect(0,0,0);
}

DefaultProperties
{
  landMovementState=PlayerSpaceFlying

  rollUnit=1024
  
  turnDecayTime=0.5
  turnSensitivity=0.5
  maximumTurnRate=5000
  maximumThrust=2500
}
&lt;/uscript&gt;

&lt;uscript&gt;
class FlyingDog extends KShip placeable CacheExempt;

// triggers used to get into the FlyingDog
var const vector  FrontTriggerOffset;
var SVehicleTrigger  FLTrigger, FRTrigger;

// Maximum speed at which you can get in the vehicle.
var (FlyingDog) float TriggerSpeedThresh;
var bool      TriggerState; // true for on, false for off.

// Destroyed Buggy
var (FlyingDog) class&lt;Actor&gt;  DestroyedEffect;
var (FlyingDog) sound         DestroyedSound;

// Weapon
var       float FireCountdown;

var (FlyingDog) float   FireInterval;
var (FlyingDog) vector  weaponFireOffset;

simulated function PostNetBeginPlay()
{
  local vector RotX, RotY, RotZ;

  Super.PostNetBeginPlay();

  GetAxes(Rotation,RotX,RotY,RotZ);

  // Only have triggers on server
  if(Level.NetMode != NM_Client)
  {
    // Create triggers for gettting into the FlyingDog
    FLTrigger = spawn(class'SVehicleTrigger', self,, Location + FrontTriggerOffset.X * RotX + FrontTriggerOffset.Y * RotY + FrontTriggerOffset.Z * RotZ);
    FLTrigger.SetBase(self);
    FLTrigger.SetCollision(true, false, false);

    FRTrigger = spawn(class'SVehicleTrigger', self,, Location + FrontTriggerOffset.X * RotX - FrontTriggerOffset.Y * RotY + FrontTriggerOffset.Z * RotZ);
    FRTrigger.SetBase(self);
    FRTrigger.SetCollision(true, false, false);

    TriggerState = true;
  }

  // If this is not 'authority' version - don't destroy it if there is a problem.
  // The network should sort things out.
  if(Role != ROLE_Authority) {
    KarmaParams(KParams).bDestroyOnSimError = False;
  }
}

simulated event Destroyed()
{
  // Clean up random stuff attached to the car
  if(Level.NetMode != NM_Client)
  {
    FLTrigger.Destroy();
    FRTrigger.Destroy();
  }

  Super.Destroyed();

  // Trigger destroyed sound and effect
  if(Level.NetMode != NM_DedicatedServer)
  {
    spawn(DestroyedEffect, self, , Location );
    PlaySound(DestroyedSound);
  }
}

function KDriverEnter(Pawn p)
{
  Super.KDriverEnter(p);

  p.bHidden = True;
  ReceiveLocalizedMessage(class'Vehicles.BulldogMessage', 1);
}

function bool KDriverLeave(bool bForceLeave)
{
  local Pawn OldDriver;

  OldDriver = Driver;

  // If we succesfully got out of the car, make driver visible again.
  if( Super.KDriverLeave(bForceLeave) )
  {
    OldDriver.bHidden = false;
    AmbientSound = None;
    return true;
  }
  else
    return false;
}

function fireWeapons(bool bWasAltFire)
{
  local vector FireLocation;
  local PlayerController PC;
  
  // Client can't do firing
  if(Role != ROLE_Authority)
    return;

  FireLocation = Location + (weaponFireOffset &gt;&gt; Rotation);

  while(FireCountdown &lt;= 0)
  {
    if(!bWasAltFire)
    {
      spawn(class'PROJ_TurretSkaarjPlasma', self, , FireLocation, rotation);

      // Play firing noise
      PlaySound(Sound'ONSVehicleSounds-S.Laser02', SLOT_None,,,,, false);
      PC = PlayerController(Controller);
      if (PC != None &amp;&amp; PC.bEnableWeaponForceFeedback)
        PC.ClientPlayForceFeedback(&quot;RocketLauncherFire&quot;);
    }
    else
    {
      spawn(class'PROJ_SpaceFighter_Rocket', self, , FireLocation, rotator(vector(rotation) + Vrand() * 0.05));

      // Play firing noise
      PlaySound(Sound'AssaultSounds.HnShipFire01', SLOT_None,,,,, false);
      PC = PlayerController(Controller);
      if (PC != None &amp;&amp; PC.bEnableWeaponForceFeedback)
        PC.ClientPlayForceFeedback(&quot;RocketLauncherFire&quot;);
    }

    FireCountdown += FireInterval;
  }
}

// Fire a rocket (if we've had time to reload!)
function VehicleFire(bool bWasAltFire)
{
  Super.VehicleFire(bWasAltFire);

  if(FireCountdown &lt; 0)
  {
    FireCountdown = 0;
    fireWeapons(bWasAltFire);
  }
}

simulated function Tick(float Delta)
{
  Local float VMag;

  Super.Tick(Delta);

  // Weapons (run on server and replicated to client)
  if(Role == ROLE_Authority)
  {
    // Countdown to next shot
    FireCountdown -= Delta;

    // This is for sustained barrages.
    // Primary fire takes priority
    if(bVehicleIsFiring)
      fireWeapons(false);
    else if(bVehicleIsAltFiring)
      fireWeapons(true);
  }

  // Dont have triggers on network clients.
  if(Level.NetMode != NM_Client)
  {
    // If vehicle is moving, disable collision for trigger.
    VMag = VSize(Velocity);

    if(VMag &lt; TriggerSpeedThresh &amp;&amp; TriggerState == false)
    {
      FLTrigger.SetCollision(true, false, false);
      FRTrigger.SetCollision(true, false, false);
      TriggerState = true;
    }
    else if(VMag &gt; TriggerSpeedThresh &amp;&amp; TriggerState == true)
    {
      FLTrigger.SetCollision(false, false, false);
      FRTrigger.SetCollision(false, false, false);
      TriggerState = false;
    }
  }
}

// Really simple at the moment!
function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation,
            Vector momentum, class&lt;DamageType&gt; damageType)
{
  // Avoid damage healing the car!
  if(Damage &lt; 0)
    return;

  if(damageType == class'DamTypeSuperShockBeam')
    Health -= 100; // Instagib doesn't work on vehicles
  else
    Health -= 0.5 * Damage; // Weapons do less damage

  // The vehicle is dead!
  if(Health &lt;= 0)
  {
    if ( Controller != None )
    {
      if( Controller.bIsPlayer )
      {
        ClientKDriverLeave(PlayerController(Controller)); // Just to reset HUD etc.
        Controller.PawnDied(self); // This should unpossess the controller and let the player respawn
      }
      else
        Controller.Destroy();
    }

    Destroy(); // Destroy the vehicle itself (see Destroyed below)
  }

    //KAddImpulse(momentum, hitlocation);
}

// AI Related code
function Actor GetBestEntry(Pawn P)
{
  if ( VSize(P.Location - FLTrigger.Location) &lt; VSize(P.Location - FRTrigger.Location) )
    return FLTrigger;
  return FRTrigger;
}

defaultproperties
{
  DrawType=DT_StaticMesh
  StaticMesh=StaticMesh'BulldogMeshes.Simple.S_Chassis'

  Begin Object Class=KarmaParamsRBFull Name=KParams0
    KActorGravScale=0
    KInertiaTensor(0)=20
    KInertiaTensor(1)=0
    KInertiaTensor(2)=0
    KInertiaTensor(3)=30
    KInertiaTensor(4)=0
    KInertiaTensor(5)=48
    KCOMOffset=(X=0.8,Y=0.0,Z=-0.7)
    KStartEnabled=True
    KFriction=1.6
    KLinearDamping=1
    KAngularDamping=10
    bKNonSphericalInertia=False
    bHighDetailOnly=False
    bClientOnly=False
    bKDoubleTickRate=True
    Name=&quot;KParams0&quot;
  End Object
  KParams=KarmaParams'KParams0'

  DrawScale=0.4
  drawScale3D=(x=-1,y=1,z=1)

  DestroyedEffect=class'XEffects.RocketExplosion'
  DestroyedSound=sound'WeaponSounds.P1RocketLauncherAltFire'

  FrontTriggerOffset=(X=0,Y=165,Z=10)

  TriggerSpeedThresh=40

  // Weaponry
  FireInterval=0.1
  weaponFireOffset=(X=0,Y=0,Z=80)

  // Driver positions
  ExitPositions(0)=(X=0,Y=200,Z=100)
  ExitPositions(1)=(X=0,Y=-200,Z=100)
  ExitPositions(2)=(X=350,Y=0,Z=100)
  ExitPositions(3)=(X=-350,Y=0,Z=100)

  DrivePos=(X=-165,Y=0,Z=-100)

  Health=800
  HealthMax=800

  SoundRadius=255
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KTire</title>
    <id>1594</id>
    <revision>
      <id>3961</id>
      <timestamp>2006-01-04T00:37:05Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KTire|KTire]] (Package: Engine)}}

This native, abstract class is a tire for use with vehicles.

==Properties==

===Hidden ===
; float Adhesion :  'stickyness' in the normal dir  
; bool bReceiveStateNew :  
; bool bTireOnGround :  If this tire is currently in contact with something.  
; material GroundMaterial :  material that tyre is touching  
; ESurfaceTypes GroundSurfaceType :  surface type that the tyre is touching  
; float LateralFriction :  friction coeff. in sideways direction  
; float LateralSlip :  max first-order (force ~ vel) slip in sideways direction  
; float MinSlip :  minimum slip (both directions)  
; KRigidBodyState ReceiveState :  
; float Restitution :  'bouncyness' in the normal dir  
; float RollFriction :  friction coeff. in tyre direction  
; float RollSlip :  max first-order (force ~ vel) slip in tyre direction  
; float SlipRate :  amount of extra slip per unit velocity  
; float Softness :  'softness' in the normal dir  
; float SpinSpeed :  current speed (65535 = 1 rev/sec) of this wheel spinning about its axis  
; [[Legacy:KCarWheelJoint|KCarWheelJoint]] WheelJoint :  joint holding this wheel to chassis etc. 

==Functions==
; TakeDamage(int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, vector hitlocation, vector momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType) : EMTPY. By default, nothing happens if you shoot a tire.

==Events==
; bool KUpdateState( out [[Legacy:KRigidBodyState|KRigidBodyState]] newState ) : This even is for updating the state (position, velocity etc.) of the tire's karma body when we get new information from the network.

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Vehicles|Vehicles]]

==Discussion==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3962</id>
      <timestamp>2003-03-26T01:23:54Z</timestamp>
      <contributor>
        <ip>Violator</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KTire|KTire]] }}

==Properties ==

===Main ===

A tyre for use by vehicles. 

===Hidden ===
; float Adhesion :  'stickyness' in the normal dir  
; bool bReceiveStateNew :  
; bool bTireOnGround :  If this tire is currently in contact with something.  
; material GroundMaterial :  material that tyre is touching  
; ESurfaceTypes GroundSurfaceType :  surface type that the tyre is touching  
; float LateralFriction :  friction coeff. in sideways direction  
; float LateralSlip :  max first-order (force ~ vel) slip in sideways direction  
; float MinSlip :  minimum slip (both directions)  
; KRigidBodyState ReceiveState :  
; float Restitution :  'bouncyness' in the normal dir  
; float RollFriction :  friction coeff. in tyre direction  
; float RollSlip :  max first-order (force ~ vel) slip in tyre direction  
; float SlipRate :  amount of extra slip per unit velocity  
; float Softness :  'softness' in the normal dir  
; float SpinSpeed :  current speed (65535 = 1 rev/sec) of this wheel spinning about its axis  
; KCarWheelJoint WheelJoint :  joint holding this wheel to chassis etc.</text>
    </revision>
    <revision>
      <id>3963</id>
      <timestamp>2006-01-04T00:34:20Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KActor|KActor]] &gt;&gt; [[Legacy:KTire|KTire]] (Package: Engine)}}

A tire for use with vehicles.

==Properties==

===Hidden ===
; float Adhesion :  'stickyness' in the normal dir  
; bool bReceiveStateNew :  
; bool bTireOnGround :  If this tire is currently in contact with something.  
; material GroundMaterial :  material that tyre is touching  
; ESurfaceTypes GroundSurfaceType :  surface type that the tyre is touching  
; float LateralFriction :  friction coeff. in sideways direction  
; float LateralSlip :  max first-order (force ~ vel) slip in sideways direction  
; float MinSlip :  minimum slip (both directions)  
; KRigidBodyState ReceiveState :  
; float Restitution :  'bouncyness' in the normal dir  
; float RollFriction :  friction coeff. in tyre direction  
; float RollSlip :  max first-order (force ~ vel) slip in tyre direction  
; float SlipRate :  amount of extra slip per unit velocity  
; float Softness :  'softness' in the normal dir  
; float SpinSpeed :  current speed (65535 = 1 rev/sec) of this wheel spinning about its axis  
; [[Legacy:KCarWheelJoint|KCarWheelJoint]] WheelJoint :  joint holding this wheel to chassis etc. 

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Vehicles|Vehicles]]

==Discussion==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KVehicle</title>
    <id>1578</id>
    <revision>
      <id>3925</id>
      <timestamp>2006-01-17T19:51:22Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>minor formatting</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; KVehicle (Package: Engine)}}

The K in KVehicle stands for [[Legacy:Karma|Karma]], and this class is controlled by some native Karma functions. The KVehicle extends Vehicle, which extends Pawn, and so gets a lot of stuff from Pawn, like Health.

See [[Legacy:KVehicle (UT2003)|KVehicle (UT2003)]] for the UT2003 version of this class.

See [[Legacy:SVehicle|SVehicle]] for the base class of vehicles used in UT2004.

==Constants==
; FilterFrames = 5 : The length of the CameraHistory array. (see Other Properties below)

==Properties==

===KVehicle Group===
; bool bAutoDrive : If set to True, the steering is set to 1 and the Throttle to 0.4 when there is no driver
; class&lt;[[Legacy:Actor|Actor]]&gt; DestroyEffectClass : The class of the effect that is spawned when the vehicle is destroyed

===Other Properties===
; bool bHistoryWarmup : The history isn't filled
; bool bVehicleIsFiring : If is True then the driver wants to fire
; bool bVehicleIsAltFiring : If is True then the driver wants to altfire
; [[Legacy:Vector|vector]] CameraHistory[''FilterFrames''] : Keeps track of the last few camera look-at positions in order to smooth them in SpecialCalcView.
; int NextHistorySlot : The next slot that has to be filled with in the camera history

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed() (simulated) : Vehicle is destroyed, remove attached stuff, create effect, set factory vehicle count -1 (if any)

; TakeDamage( int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, [[Legacy:Vector|vector]] hitlocation, [[Legacy:Vector|vector]] momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType ) : Only calls super class implementation.

; Tick( float deltaSeconds ) (simulated) : Overridden with no code.

===Inherited From [[Legacy:Pawn|Pawn]]===
; bool SpecialCalcView( out [[Legacy:Actor|Actor]] ViewActor, out [[Legacy:Vector|vector]] CameraLocation, out [[Legacy:Rotator|rotator]] CameraRotation ) (simulated) : When bSpecialCalcView is True, this function is called to set the position of the camera. Uses &lt;code&gt;CameraHistory&lt;/code&gt; to smooth look-at position over a few frames.

===Inherited From [[Legacy:Vehicle|Vehicle]]===
; ClientKDriverEnter( [[Legacy:PlayerController|PlayerController]] PC ) (simulated, replicated to client) : Driver enters, called also on clients, mainly sets HUD
; ClientKDriverLeave( [[Legacy:PlayerController|PlayerController]] PC ) (simulated, replicated to client) : Driver leaves, called also on clients, mainly resets HUD
; KDriverEnter( [[Legacy:Pawn|Pawn]] P ) : Driver enters, sets the controller to the vehicle, and attaches the pawn to the car
; bool KDriverLeave( bool bForceLeave ) : Driver leaves, The driver exits at the 1st possible exit pos (not blocked) and the controller is attached to it.
; TryToDrive( [[Legacy:Pawn|Pawn]] P ) : Called when someone tries to get in

===New Functions===
; GraphData( string DataName, float DataValue ) (native, final) : &quot;Useful function for plotting data to real-time graph on screen.&quot;
; KVehicleUpdateParams() (simulated) : Used to update the vehicles Para on all the attached actors (like wheels)
; VehicleStateReceived() : An event, called when a new state is received, implemented in subclass : (comment says in VehicleState, but KVehicle doesn't have a VehicleState (Given that this is an event called from native code, and the superclass of KVehicle has nativereplication, it seems likely that VehicleState is a native struct.))

==Known Subclasses==
* [[Legacy:KCar|KCar]]
** [[Legacy:Bulldog|Bulldog]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3926</id>
      <timestamp>2005-08-03T08:30:07Z</timestamp>
      <contributor>
        <ip>Ymalaika</ip>
      </contributor>
      <minor/>
      <comment>Editing KVehicle minor spelling fix</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; KVehicle (Package: Engine)}}

The K in KVehicle stands for [[Legacy:Karma|Karma]], and this class is controlled by some native Karma functions. The KVehicle extends Vehicle, which extends Pawn, and so gets a lot of stuff from Pawn, like Health.

See [[Legacy:KVehicle (UT2003)|KVehicle (UT2003)]] for the UT2003 version of this class.

See [[Legacy:SVehicle|SVehicle]] for the base class of vehicles used in UT2004.

==Constants==
; FilterFrames = 5 : The length of the CameraHistory array. (see Other Properties below)

==Properties==

===KVehicle Group===
; bool bAutoDrive : If set to True, the steering is set to 1 and the Throttle to 0.4 when there is no driver
; class&lt;[[Legacy:Actor|Actor]]&gt; DestroyEffectClass : The class of the effect that is spawned when the vehicle is destroyed

===Other Properties===
; bool bHistoryWarmup : The history isn't filled
; bool bVehicleIsFiring : If is True then the driver wants to fire
; bool bVehicleIsAltFiring : If is True then the driver wants to altfire
; [[Legacy:Vector|vector]] CameraHistory[''FilterFrames''] : Keeps track of the last few camera look-at positions in order to smooth them in SpecialCalcView.
; int NextHistorySlot : The next slot that has to be filled with in the camera history

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) [simulated] : Vehicle is destroyed, remove attached stuff, create effect, set factory vehicle count -1 (if any)

; TakeDamage (int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, [[Legacy:Vector|vector]] hitlocation, [[Legacy:Vector|vector]] momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType) : Only calls super class implementation.

; Tick (float deltaSeconds) [simulated] : Overridden with no code.

===Inherited From [[Legacy:Pawn|Pawn]]===
; bool SpecialCalcView (out [[Legacy:Actor|Actor]] ViewActor, out [[Legacy:Vector|vector]] CameraLocation, out [[Legacy:Rotator|rotator]] CameraRotation) [simulated] : When bSpecialCalcView is True, this function is called to set the position of the camera. Uses &lt;code&gt;CameraHistory&lt;/code&gt; to smooth look-at position over a few frames.

===Inherited From [[Legacy:Vehicle|Vehicle]]===
; ClientKDriverEnter ([[Legacy:PlayerController|PlayerController]] PC) [simulated, replicated to client] : Driver enters, called also on clients, mainly sets HUD

; ClientKDriverLeave ([[Legacy:PlayerController|PlayerController]] PC) [simulated, replicated to client] : Driver leaves, called also on clients, mainly resets HUD

; KDriverEnter ([[Legacy:Pawn|Pawn]] P) : Driver enters, sets the controller to the vehicle, and attaches the pawn to the car

; bool KDriverLeave (bool bForceLeave) : Driver leaves, The driver exits at the 1st possible exit pos (not blocked) and the controller is attached to it.

; TryToDrive ([[Legacy:Pawn|Pawn]] P) : Called when someone tries to get in

===New Functions===
; GraphData (string DataName, float DataValue) [native, final] : &quot;Useful function for plotting data to real-time graph on screen.&quot;

; KVehicleUpdateParams ( ) [simulated] : Used to update the vehicles Para on all the attached actors (like wheels)

; VehicleStateReceived ( ) : An event, called when a new state is received, implemented in subclass : (comment says in VehicleState, but KVehicle doesn't have a VehicleState (Given that this is an event called from native code, and the superclass of KVehicle has nativereplication, it seems likely that VehicleState is a native struct.))

==Known Subclasses==
* [[Legacy:KCar|KCar]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3927</id>
      <timestamp>2005-11-20T02:51:51Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:Vehicle|Vehicle]] &gt;&gt; KVehicle (Package: Engine)}}

The K in KVehicle stands for [[Legacy:Karma|Karma]], and this class is controlled by some native Karma functions. The KVehicle extends Vehicle, which extends Pawn, and so gets a lot of stuff from Pawn, like Health.

See [[Legacy:KVehicle (UT2003)|KVehicle (UT2003)]] for the UT2003 version of this class.

See [[Legacy:SVehicle|SVehicle]] for the base class of vehicles used in UT2004.

==Constants==
; FilterFrames = 5 : The length of the CameraHistory array. (see Other Properties below)

==Properties==

===KVehicle Group===
; bool bAutoDrive : If set to True, the steering is set to 1 and the Throttle to 0.4 when there is no driver
; class&lt;[[Legacy:Actor|Actor]]&gt; DestroyEffectClass : The class of the effect that is spawned when the vehicle is destroyed

===Other Properties===
; bool bHistoryWarmup : The history isn't filled
; bool bVehicleIsFiring : If is True then the driver wants to fire
; bool bVehicleIsAltFiring : If is True then the driver wants to altfire
; [[Legacy:Vector|vector]] CameraHistory[''FilterFrames''] : Keeps track of the last few camera look-at positions in order to smooth them in SpecialCalcView.
; int NextHistorySlot : The next slot that has to be filled with in the camera history

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) [simulated] : Vehicle is destroyed, remove attached stuff, create effect, set factory vehicle count -1 (if any)

; TakeDamage (int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, [[Legacy:Vector|vector]] hitlocation, [[Legacy:Vector|vector]] momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType) : Only calls super class implementation.

; Tick (float deltaSeconds) [simulated] : Overridden with no code.

===Inherited From [[Legacy:Pawn|Pawn]]===
; bool SpecialCalcView (out [[Legacy:Actor|Actor]] ViewActor, out [[Legacy:Vector|vector]] CameraLocation, out [[Legacy:Rotator|rotator]] CameraRotation) [simulated] : When bSpecialCalcView is True, this function is called to set the position of the camera. Uses &lt;code&gt;CameraHistory&lt;/code&gt; to smooth look-at position over a few frames.

===Inherited From [[Legacy:Vehicle|Vehicle]]===
; ClientKDriverEnter ([[Legacy:PlayerController|PlayerController]] PC) [simulated, replicated to client] : Driver enters, called also on clients, mainly sets HUD

; ClientKDriverLeave ([[Legacy:PlayerController|PlayerController]] PC) [simulated, replicated to client] : Driver leaves, called also on clients, mainly resets HUD

; KDriverEnter ([[Legacy:Pawn|Pawn]] P) : Driver enters, sets the controller to the vehicle, and attaches the pawn to the car

; bool KDriverLeave (bool bForceLeave) : Driver leaves, The driver exits at the 1st possible exit pos (not blocked) and the controller is attached to it.

; TryToDrive ([[Legacy:Pawn|Pawn]] P) : Called when someone tries to get in

===New Functions===
; GraphData (string DataName, float DataValue) [native, final] : &quot;Useful function for plotting data to real-time graph on screen.&quot;

; KVehicleUpdateParams ( ) [simulated] : Used to update the vehicles Para on all the attached actors (like wheels)

; VehicleStateReceived ( ) : An event, called when a new state is received, implemented in subclass : (comment says in VehicleState, but KVehicle doesn't have a VehicleState (Given that this is an event called from native code, and the superclass of KVehicle has nativereplication, it seems likely that VehicleState is a native struct.))

==Known Subclasses==
* [[Legacy:KCar|KCar]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KVehicle (UT2003)</title>
    <id>1624</id>
    <revision>
      <id>4033</id>
      <timestamp>2005-01-23T06:51:50Z</timestamp>
      <contributor>
        <ip>Odo324</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; KVehicle (Package: Engine)}}

The K in KVehicle stands for [[Legacy:Karma|Karma]], and this class is controlled by some native Karma functions. The KVehicle extends Pawn, and so gets a lot of stuff from Pawn, like Health.

See [[Legacy:KVehicle|KVehicle]] for the UT2004 version of this class.

==Constants==
; FilterFrames = 5 : The length of the CameraHistory array. (see Other Properties below)

==Properties==

===KVehicle Group===
; bool bAutoDrive : If set to True, the steering is set to 1 and the Throttle to 0.4 when there is no driver
; class&lt;[[Legacy:Actor|Actor]]&gt; DestroyEffectClass : The class of the effect that is spawned when the vehicle is destroyed
; [[Legacy:Vector|vector]] DrivePos : The position of the driver when the vehicle is driven, relative to the vehicle
; [[Legacy:Rotator|rotator]] DriveRot : The rotation of the driver when the vehicle is driven, relative to the vehicle
; array&lt;[[Legacy:Vector|vector]]&gt; ExitPositions : The exit positions of the vehicle, relative to the vehicle
; float Steering : If the controller wants to steer, ranges from -1 to 1.
; float Throttle : If the controller wants to throttle, ranges from -1 to 1.

===Other Properties===
; bool bGetOut : If set to True, the driver wants to get out
; bool bHistoryWarmup : The history isn't filled
; bool bVehicleIsFiring : If is True then the driver wants to fire
; bool bVehicleIsAltFiring : If is True then the driver wants to altfire
; [[Legacy:Vector|vector]] CameraHistory[''FilterFrames''] : The histroy of the camera (someone find out what this does!)
; [[Legacy:Pawn|Pawn]] Driver : The actual pawn of the controller
; int NextHistorySlot : The next slot that has to be filled with in the camera history
; [[Legacy:KVehicleFactory|KVehicleFactory]] ParentFactory : The factory that created the vehicle

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) [simulated] : Vehicle is destroyed, remove attached stuff, create effect, set factory vehicle count -1 (if any)

; EncroachedBy ([[Legacy:Actor|Actor]] Other) : Overridden with no code so vehicle doesn't get telefragged.

; TakeDamage (int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, [[Legacy:Vector|vector]] hitlocation, [[Legacy:Vector|vector]] momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType) : A simple takedamage function, reduces health and destroyes the vehicle when Health is lower or equal then 0

; Tick (float deltaSeconds) [simulated] : If driver tries to get out, get him out.

===Inherited From [[Legacy:Pawn|Pawn]]===
; bool SpecialCalcView (out [[Legacy:Actor|Actor]] ViewActor, out [[Legacy:Vector|vector]] CameraLocation, out [[Legacy:Rotator|rotator]] CameraRotation) [simulated] : When bSpecialCalcView is True, this function is called to set the possition of the camera

===New Functions===
; ClientKDriverEnter ([[Legacy:PlayerController|PlayerController]] pc) [simulated, replicated to client] : Driver enters, called also on clients, mainly sets HUD

; ClientKDriverLeave ([[Legacy:PlayerController|PlayerController]] pc) [simulated, replicated to client] : Driver leaves, called also on clients, mainly resets HUD

; GraphData (string DataName, float DataValue) [native, final] : &quot;Useful function for plotting data to real-time graph on screen.&quot;

; KDriverEnter ([[Legacy:Pawn|Pawn]] p) : Driver enters, sets the controller to the vehicle, and attaches the pawn to the car

; bool KDriverLeave (bool bForceLeave) : Driver leaves, The driver exits at the 1st possible exit pos (not blocked) and the controller is attached to it.

; KVehicleUpdateParams ( ) [simulated] : Used to update the vehicles Para on all the attached actors (like wheels)

; TryToDrive ([[Legacy:Pawn|Pawn]] p) : Called when someone tries to get in

; VehicleCeaseFire (bool bWasAltFire) [replicated to server] : Called when the driver stops firing

; VehicleFire (bool bWasAltFire) [replicated to server] : Called when the driver starts firing

; VehicleStateReceived ( ) : An event, called when a new state is received, implemented in subclass : (comment says in VehicleState, but KVehicle doesn't have a VehicleState)

==Known Subclasses==
* [[Legacy:KCar|KCar]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4034</id>
      <timestamp>2005-01-07T11:42:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; KVehicle (Package: Engine)}}

The K in KVehicle stands for [[Legacy:Karma|Karma]], and this class is controlled by some native Karma functions. The KVehicle extends Pawn, and so gets a lot of stuff from Pawn, like Health.

See [[Legacy:KVehicle|KVehicle]] for the UT2004 version of this class.

==Constants==
; FilterFrames = 5 : The length of the CameraHistory array. (see Other Properties below)

==Properties==

===KVehicle Group===
; bool bAutoDrive : If set to True, the steering is set to 1 and the Throttle to 0.4 when there is no driver
; class&lt;[[Legacy:Actor|Actor]]&gt; DestroyEffectClass : The class of the effect that is spawned when the vehicle is destroyed
; [[Legacy:Vector|vector]] DrivePos : The position of the driver when the vehicle is driven, relative to the vehicle
; [[Legacy:Rotator|rotator]] DriveRot : The rotation of the driver when the vehicle is driven, relative to the vehicle
; array&lt;[[Legacy:Vector|vector]]&gt; ExitPositions : The exit positions of the vehicle, relative to the vehicle
; float Steering : If the controller wants to steer, ranges from -1 to 1.
; float Throttle : If the controller wants to throttle, ranges from -1 to 1.

===Other Properties===
; bool bGetOut : If set to True, the driver wants to get out
; bool bHistoryWarmup : The history isn't filled
; bool bVehicleIsFiring : If is True then the driver wants to fire
; bool bVehicleIsAltFiring : If is True then the driver wants to altfire
; [[Legacy:Vector|vector]] CameraHistory[''FilterFrames''] : The histroy of the camera (someone find out what this does!)
; [[Legacy:Pawn|Pawn]] Driver : The actual pawn of the controller
; int NextHistorySlot : The next slot that has to be filled with in the camera history
; [[Legacy:KVehicleFactory|KVehicleFactory]] ParentFactory : The factory that created the vehicle

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; Destroyed ( ) [simulated] : Vehicle is destroyed, remove attached stuff, create effect, set factory vehicle count -1 (if any)

; EncroachedBy ([[Legacy:Actor|Actor]] Other) : Overridden with no code so vehicle doesn't get telefragged.

; TakeDamage (int Damage, [[Legacy:Pawn|Pawn]] instigatedBy, [[Legacy:Vector|vector]] hitlocation, [[Legacy:Vector|vector]] momentum, class&lt;[[Legacy:DamageType|DamageType]]&gt; damageType) : A simple takedamage function, reduces health and destroyes the vehicle when Health is lower or equal then 0

; Tick (float deltaSeconds) [simulated] : If driver tries to get out, get him out.

===Inherited From [[Legacy:Pawn|Pawn]]===
; bool SpecialCalcView (out [[Legacy:Actor|Actor]] ViewActor, out [[Legacy:Vector|vector]] CameraLocation, out [[Legacy:Rotator|rotator]] CameraRotation) [simulated] : When bSpecialCalcView is True, this function is called to set the possition of the camera

===New Functions===
; ClientKDriverEnter ([[Legacy:PlayerController|PlayerController]] pc) [simulated, replicated to client] : Driver enters, called also on clients, mainly sets HUD

; ClientKDriverLeave ([[Legacy:PlayerController|PlayerController]] pc) [simulated, replicated to client] : Driver leaves, called also on clients, mainly resets HUD

; GraphData (string DataName, float DataValue) [native, final] : &quot;Useful function for plotting data to real-time graph on screen.&quot;

; KDriverEnter ([[Legacy:Pawn|Pawn]] p) : Driver enters, sets the controller to the vehicle, and attaches the pawn to the car

; bool KDriverLeave (bool bForceLeave) : Driver leaves, The driver exits at the 1st possible exit pos (not blocked) and the controller is attached to it.

; KVehicleUpdateParams ( ) [simulated] : Used to update the vehicles Para on all the attached actors (like wheels)

; TryToDrive ([[Legacy:Pawn|Pawn]] p) : Called when someone tries to get in

; VehicleCeaseFire (bool bWasAltFire) [replicated to server] : Called when the driver stops firing

; VehicleFire (bool bWasAltFire) [replicated to server] : Called when the driver starts firing

; VehicleStateReceived ( ) : An event, called when a new state is received, implemented in subclass : (comment says in VehicleState, but KVehicle doesn't have a VehicleState)

==Known Subclasses==
* [[Legacy:KCar|KCar]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:Cars|Cars]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KVehicleFactory</title>
    <id>1595</id>
    <revision>
      <id>3964</id>
      <timestamp>2005-12-03T00:36:24Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:SVehicleFactory|SVehicleFactory]] &gt;&gt; KVehicleFactory (Package: Engine)}}

Spawning point for [[Legacy:KVehicle|KVehicle]]s.  Can be activated by a [[Legacy:Trigger|Trigger]].  Set the Trigger's [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the KVehicleFactory.

See [[Legacy:KVehicleFactory (UT2003)|KVehicleFactory (UT2003)]] for the UT2003 version of this class.

==Properties==
; class&lt;[[Legacy:KVehicle|KVehicle]]&gt; KVehicleClass : The KVehicle class to spawn.

==Known Subclasses==
* [[Legacy:BulldogFactory|BulldogFactory]]

==Related Topics==
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3965</id>
      <timestamp>2003-03-26T01:39:36Z</timestamp>
      <contributor>
        <ip>Violator</ip>
      </contributor>
      <comment>KVehicleFactory</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: ... &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:KVehicleFactory|KVehicleFactory]] }}

Spawning point for [[Legacy:KVehicle|KVehicle]]s. Can be activated by a [[Legacy:Trigger|Trigger]]. Set the [[Legacy:Trigger|Trigger]]'s [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the KVehicleFactory.

==Properties ==

===Main ===
; int MaxVehicleCount :  Maximum number of vehicles allowed to be spawned
; class&lt;[[Legacy:KVehicle|KVehicle]]&gt; VehicleClass : The vehicle class to spawn (eg [[Legacy:Bulldog|Bulldog]]) 

===Hidden ===
; int VehicleCount :  Current number of vehicles spawned.

==Known Subclasses==

[[Legacy:BulldogFactory|BulldogFactory]]</text>
    </revision>
    <revision>
      <id>3966</id>
      <timestamp>2004-06-27T16:44:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:SVehicleFactory|SVehicleFactory]] &gt;&gt; KVehicleFactory (Package: Engine)}}

Spawning point for [[Legacy:KVehicle|KVehicle]]s. Can be activated by a [[Legacy:Trigger|Trigger]]. Set the [[Legacy:Trigger|Trigger]]'s [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the KVehicleFactory.

See [[Legacy:KVehicleFactory (UT2003)|KVehicleFactory (UT2003)]] for the UT2003 version of this class.

==Properties==
; class&lt;[[Legacy:KVehicle|KVehicle]]&gt; KVehicleClass : The vehicle class to spawn. (e.g. [[Legacy:Bulldog|Bulldog]]) 

==Known Subclasses==

[[Legacy:BulldogFactory|BulldogFactory]]

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KVehicleFactory (UT2003)</title>
    <id>1617</id>
    <revision>
      <id>4016</id>
      <timestamp>2005-12-03T00:38:32Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; KVehicleFactory}}

Spawning point for [[Legacy:KVehicle|KVehicle]]s. Can be activated by a [[Legacy:Trigger|Trigger]]. Set the Trigger's [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the KVehicleFactory.

See [[Legacy:KVehicleFactory|KVehicleFactory]] for the UT2004 version of this class.

==Properties==

===Main===
; int MaxVehicleCount :  Maximum number of vehicles allowed to be spawned
; class&lt;[[Legacy:KVehicle|KVehicle]]&gt; VehicleClass : The vehicle class to spawn (e.g. [[Legacy:Bulldog|Bulldog]]) 

===Hidden===
; int VehicleCount :  Current number of vehicles spawned.

==Known Subclasses==
* [[Legacy:BulldogFactory|BulldogFactory]]

==Related Topics==
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4017</id>
      <timestamp>2004-06-27T16:42:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; KVehicleFactory}}

Spawning point for [[Legacy:KVehicle|KVehicle]]s. Can be activated by a [[Legacy:Trigger|Trigger]]. Set the [[Legacy:Trigger|Trigger]]'s [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the KVehicleFactory.

See [[Legacy:KVehicleFactory|KVehicleFactory]] for the UT2004 version of this class.

==Properties==

===Main===
; int MaxVehicleCount :  Maximum number of vehicles allowed to be spawned
; class&lt;[[Legacy:KVehicle|KVehicle]]&gt; VehicleClass : The vehicle class to spawn (e.g. [[Legacy:Bulldog|Bulldog]]) 

===Hidden===
; int VehicleCount :  Current number of vehicles spawned.

==Known Subclasses==

[[Legacy:BulldogFactory|BulldogFactory]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KaRnAgE/Developer Journal</title>
    <id>1606</id>
    <revision>
      <id>3989</id>
      <timestamp>2003-08-05T09:49:56Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">* Making really really big rooms, don't do it. Walking virtual miles is a pain in the rear for any gamer.

* Add decoration, even if it's something lame. Bad decoration is better then no decoration.

* One of the most questions I get about making a map from people is what makes a map good, or how can I make my map better. This is always my answer to them.

1. General flow of the map. Does your map go anywhere, is there a theme to it? Can you access all the rooms w/ease?

2. Add diversity to your maps, don't add all the good weapons in one part and all the powerups in another, or something of that sort. Make everything a challenge to get, this way people have to work to get multi-kills.

3. Arch some of the ceilings in the rooms/hallways. don't connect room directly together, make some doors, elevators to spice up the game play.

==Working a good Map ==

If you been wanting to build maps like pro's you have to start small. You can't just expect to just jump into a really huge extravigant map thinking everyone in the world is gonna go nuts just playing it.

Make a map you enjoy playing your bots in 1 on 1 or 2 on 2. From there look at it and try and imagine other things that could make it better or that you'd like to see added to it, like SkyZones for example. Say you have this really outrageous 2 vs. 2 map, but you want to make it a bit bigger so more of your friends will play, but afraid to release it cause you might have your feelings hurt cause they say it sucks. 

Try and figure out what would make them say that? Are all the rooms blocks? are there any arches or doors or elevators that make the gamming better? What about running space? do you have enough room to dodge and roll and jump and run and et cetra with out riding a wall? do you have secret rooms that hold valuable game items? 

Adding all these things can make a simple 2 vs. 2 map extreamly cool. To be honest, my first map I thought was really really great, but after a while and insestent pestering of friends to play it, I saw it was rather lame. So i keep it to use as a reference anymore then play it. My Second map I think is quit better. I'm still working out the botpath bugs and trying to come up with a good skyzone, but It's got a good feel to the general play of it.

* I'm not a master mapper, yet, I know most of this info is common knowledge, but you'd be surprised how many times I get asked these questions.

KaRnAgE

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3990</id>
      <timestamp>2002-04-20T22:35:28Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* Making really really big rooms, don't do it. Walking virtual miles is a pain in the rear for any gamer.

* Add decoration, even if it's something lame. Bad decoration is better then no decoration.

* One of the most questions I get about making a map from people is what makes a map good, or how can I make my map better. This is always my answer to them.

1. General flow of the map. Does your map go anywhere, is there a theme to it? Can you access all the rooms w/ease?

2. Add diversity to your maps, don't add all the good weapons in one part and all the powerups in another, or something of that sort. Make everything a challenge to get, this way people have to work to get multi-kills.

3. Arch some of the ceilings in the rooms/hallways. don't connect room directly together, make some doors, elevators to spice up the game play.

* I'm not a master mapper, yet, I know most of this info is common knowledge, but you'd be surprised how many times I get asked these questions.

KaRnAgE</text>
    </revision>
    <revision>
      <id>3991</id>
      <timestamp>2002-04-24T20:36:25Z</timestamp>
      <contributor>
        <ip>KaRnAgE</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* Making really really big rooms, don't do it. Walking virtual miles is a pain in the rear for any gamer.

* Add decoration, even if it's something lame. Bad decoration is better then no decoration.

* One of the most questions I get about making a map from people is what makes a map good, or how can I make my map better. This is always my answer to them.

1. General flow of the map. Does your map go anywhere, is there a theme to it? Can you access all the rooms w/ease?

2. Add diversity to your maps, don't add all the good weapons in one part and all the powerups in another, or something of that sort. Make everything a challenge to get, this way people have to work to get multi-kills.

3. Arch some of the ceilings in the rooms/hallways. don't connect room directly together, make some doors, elevators to spice up the game play.

==Working a good Map ==

If you been wanting to build maps like pro's you have to start small. You can't just expect to just jump into a really huge extravigant map thinking everyone in the world is gonna go nuts just playing it.

Make a map you enjoy playing your bots in 1 on 1 or 2 on 2. From there look at it and try and imagine other things that could make it better or that you'd like to see added to it, like SkyZones for example. Say you have this really outrageous 2 vs. 2 map, but you want to make it a bit bigger so more of your friends will play, but afraid to release it cause you might have your feelings hurt cause they say it sucks. 

Try and figure out what would make them say that? Are all the rooms blocks? are there any arches or doors or elevators that make the gamming better? What about running space? do you have enough room to dodge and roll and jump and run and et cetra with out riding a wall? do you have secret rooms that hold valuable game items? 

Adding all these things can make a simple 2 vs. 2 map extreamly cool. To be honest, my first map I thought was really really great, but after a while and insestent pestering of friends to play it, I saw it was rather lame. So i keep it to use as a reference anymore then play it. My Second map I think is quit better. I'm still working out the botpath bugs and trying to come up with a good skyzone, but It's got a good feel to the general play of it.

* I'm not a master mapper, yet, I know most of this info is common knowledge, but you'd be surprised how many times I get asked these questions.

KaRnAgE</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kagato</title>
    <id>1607</id>
    <revision>
      <id>3992</id>
      <timestamp>2005-08-22T23:00:24Z</timestamp>
      <contributor>
        <ip>Cf7.adnap.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I got my hands on Unreal Tournament 2003 a while ago.

I can't wait to get started modding that sucker ;)

My current (non-Unreal) project is my webcomic: http://morningstar.keenspace.com

[[Image:Legacy_kagato_morningstar_banner.gif|]]

Simple mods &amp;ndash; I'll use these as a learning exercise:
* [[Legacy:Mod Ideas/Kinetic Rifle|Mod Ideas/Kinetic Rifle]]
* [[Legacy:Mod Ideas/Yog-Sothoth|Mod Ideas/Yog-Sothoth]]
* Collect the Tokens (a la Sonic the Hedgehog): see [[Legacy:Mod Ideas/Hoard|Mod Ideas/Hoard]]

Intermediate mods:
* [[Legacy:Mod Ideas/UnRealMyst|Mod Ideas/UnRealMyst]]
* [[Legacy:Mod Ideas/Mini Bulldogs|Mod Ideas/Mini Bulldogs]]

Advanced mods:
* [[Legacy:Mod Ideas/CarJack|Mod Ideas/CarJack]]
* Any complete puzzle map for [[Legacy:Mod Ideas/UnRealMyst|Mod Ideas/UnRealMyst]]

----

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Tarquin:''' Hi there :D

'''Kagato:''' Thanks for the welcome. I've added my initial thoughts to the [[Legacy:Mod Ideas|Mod Ideas]] page, as above; let me know what you think...

'''Sobiwan:''' Hello.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3993</id>
      <timestamp>2003-11-17T14:29:44Z</timestamp>
      <contributor>
        <ip>Kagato</ip>
      </contributor>
      <comment>Added a few more mod ideas... need to do some implementing sometime!</comment>
      <text xml:space="preserve">I got my hands on Unreal Tournament 2003 a while ago.

I can't wait to get started modding that sucker ;)

My current (non-Unreal) project is my webcomic: http://morningstar.keenspace.com

[[Image:Legacy_kagato_morningstar_banner.gif|]]

Simple mods &amp;ndash; I'll use these as a learning exercise:
* [[Legacy:Mod Ideas/Kinetic Rifle|Mod Ideas/Kinetic Rifle]]
* [[Legacy:Mod Ideas/Yog-Sothoth|Mod Ideas/Yog-Sothoth]]
* Collect the Tokens (a la Sonic the Hedgehog): see [[Legacy:Mod Ideas/Hoard|Mod Ideas/Hoard]]

Intermediate mods:
* [[Legacy:Mod Ideas/Mini Bulldogs|Mod Ideas/Mini Bulldogs]]

Advanced mods:
* [[Legacy:Mod Ideas/CarJack|Mod Ideas/CarJack]]

----

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Tarquin:''' Hi there :D

'''Kagato:''' Thanks for the welcome. I've added my initial thoughts to the [[Legacy:Mod Ideas|Mod Ideas]] page, as above; let me know what you think...

'''Sobiwan:''' Hello.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kamek</title>
    <id>1614</id>
    <revision>
      <id>4010</id>
      <timestamp>2004-11-09T16:13:22Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding [[Legacy:Postal 2|Postal 2]] related stuff for the assistance of modders working on projects for [[Legacy:Postal 2|Postal 2]].

I first became interested in [[Legacy:UnrealScript|UnrealScript]] after the release of [[Legacy:Postal 2|Postal 2]]. My first mod was KamekMod, a single-player alteration which added various new enhancements to single-player mode. When Share The Pain came out, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]] was next, as I wanted something like RuneQuake for Postal 2.

Since AirMail, I've coded other Postal 2 stuff such as [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/P2JailBreak]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PostalArena]], and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/King Of The Hill]]. Currently I am working on Version 3 of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]], an anti-cheat mod called [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]], and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]] which adds more characters to the Postal 2 deathmatch roster.

==Coding Projects (In Progress)==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]]3
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]]3

==Coding Projects (Complete)==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]] Plus
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KamekMod]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/King Of The Hill]]
* [[Legacy:P2JailBreak|P2JailBreak]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PostalArena]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SuperWeapons]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]] v1.49
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]]2

==Mapping Projects (Complete)==

===Abstract===

The name for the map came from the map's background music, a techno/club track by TaQ called Abstract Radical Mix. The map itself is fairly simple, yet preplexing. The level consists of eight small cube-shaped rooms, all linked to each other by smaller cube-shaped passageways. The edges of the map are linked to the other side with [[Legacy:WarpZoneInfo|WarpZones]]. In addition, there are holes in the floor and ceiling, which also are linked by WarpZones.

Each room has four rocket launcher pickups and eight grenade pickups. The result: sheer chaos.

The decision to include only the explosive weapons comes from the fact that trace weapons just don't work across WarpZones.

The map was more of an experiment than anything else, but I decided to upload it to my server anyway. It's like George W. Bush: you either love it or you hate it.

As of late October, I took this map out of the server list.

===All-American Market===

This stage was based on the Lucky Ganesh/Paradise Book Repository from the single player game. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00034.jpg?Link Screenshot]

===Arena of Evil===

The House of Chthon. Also known as e1m7 to Quake players.

The Arena of Evil was my first attempt at recreating the famed Quake map; a favorite for many players.

The result was a cube-shaped room with a lava pit. Unlike the real e1m7, several areas were left open, and the map itself had several minor problems, but was still a favorite for many Postal players. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00033.jpg?Link Screenshot]

===Arena of Evil DX===

I was never satisfied with the final result for Arena of Evil, and eventually decided to rebuild it. My first attempt was devoured by the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] after I tried to import an audio track for background music.

Weeks later, I gave it another try. I went for more of a &quot;hell&quot;-ish look. [[Legacy:Postal 2|Postal 2]] doesn't have many castle-ish textures or meshes and I didn't feel like hunting the web for a bunch of custom textures, so I made do with the Napalm Factory's textures. In the end, everything turned out better than I expected, though the map scale is a little large. [http://bastard.popexperiment.com/kamek/postal2/shots/aoedx.jpg?link Screenshot]

===Bomberman===

This map was based on the game Super Bomberman. The only weapon available for pickup was the Bomberman Bomb, which was essentially an instagib grenade with a Bomberman-style blast radius. It didn't catch on very well and was discontinued.

===Clinic Area===

Based on the Clinic Area in the single player mode. I made several changes to this map, including changing the time of day from day to night, adding additional street lights (this area looks dismal at night), and changing the default billboards to my own choices. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00037.jpg?link Screenshot]

===The Dark Place===

===Feeding Time===

===Kill Frenzy===

===Library===

===Nondescript Warehouse===

===Office Complex===

===RWS Office===

===RWS Office Plus Back Alley===

===School Daze===

===Sniper Training===

===Suburban Warfare===

===West Mall MP===

===Yet Another Rats Map===

==Related Topics==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DevJournal]]

==External Links==
* [http://bastard.popexperiment.com/kamek/postal2/ |Kamek's Postal 2 Maps and Mods]

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Welcome to the site :)

'''Kamek:''' Thanks :)

'''xX)(Xx:''' Nice! what game are the maps for? and is there anywhere to download them from?

'''Kamek:''' All the maps are for [[Legacy:Postal 2|Postal 2]] and can be found on my website. *adds a link* I'll have to get around to adding more map descriptions when I have time.

'''xX)(Xx:''' Dead Link to your site..after a bit of editing, i got it working, i fixed the link here, hope you dont mind. By the way, those maps are really nice, congrats! You ever thought of porting them to a diff game? ie. Original UT?

'''Kamek:''' Keep in mind that most of the maps I made were conversions from the single player version of Postal 2... most of the levels I &quot;made&quot; were originally made by one of the Postal Team, such as Bryan Dillow. I do have a few &quot;from scratch&quot; levels, though: Arena of Evil (and DX), The Dark Place, School Daze, Bomberman, and a couple others I haven't released yet.

I found that porting levels from one game to another is extremely difficult, especially when there are a lot of static meshes involved, and most of the single player conversions use a lot of static meshes. However, some of the &quot;from scratch&quot; levels could be conceivably ported with little hassle. While I have a copy of [[Legacy:UT2004|UT2004]], I'm not very good with it yet, either playing or level editing.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4011</id>
      <timestamp>2004-11-06T21:07:25Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding [[Legacy:Postal 2|Postal 2]] related stuff for the assistance of modders working on projects for [[Legacy:Postal 2|Postal 2]].

I first became interested in [[Legacy:UnrealScript|UnrealScript]] after the release of [[Legacy:Postal 2|Postal 2]]. My first mod was KamekMod, a single-player alteration which added various new enhancements to single-player mode. When Share The Pain came out, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]] was next, as I wanted something like RuneQuake for Postal 2.

Since AirMail, I've coded other Postal 2 stuff such as [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/P2JailBreak]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PostalArena]], and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/King Of The Hill]]. Currently I am working on Version 3 of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]], an anti-cheat mod called [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]], and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]] which adds more characters to the Postal 2 deathmatch roster.

==Coding Projects (In Progress)==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]]3
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SuperWeapons]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]]3

==Coding Projects (Complete)==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]] Plus
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KamekMod]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/King Of The Hill]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Nukes]]
* [[Legacy:P2JailBreak|P2JailBreak]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PostalArena]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]] v1.49
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]]2
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WeaponFix]]

==Mapping Projects (Complete)==

===Abstract===

The name for the map came from the map's background music, a techno/club track by TaQ called Abstract Radical Mix. The map itself is fairly simple, yet preplexing. The level consists of eight small cube-shaped rooms, all linked to each other by smaller cube-shaped passageways. The edges of the map are linked to the other side with [[Legacy:WarpZoneInfo|WarpZones]]. In addition, there are holes in the floor and ceiling, which also are linked by WarpZones.

Each room has four rocket launcher pickups and eight grenade pickups. The result: sheer chaos.

The decision to include only the explosive weapons comes from the fact that trace weapons just don't work across WarpZones.

The map was more of an experiment than anything else, but I decided to upload it to my server anyway. It's like George W. Bush: you either love it or you hate it.

As of late October, I took this map out of the server list.

===All-American Market===

This stage was based on the Lucky Ganesh/Paradise Book Repository from the single player game. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00034.jpg?Link Screenshot]

===Arena of Evil===

The House of Chthon. Also known as e1m7 to Quake players.

The Arena of Evil was my first attempt at recreating the famed Quake map; a favorite for many players.

The result was a cube-shaped room with a lava pit. Unlike the real e1m7, several areas were left open, and the map itself had several minor problems, but was still a favorite for many Postal players. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00033.jpg?Link Screenshot]

===Arena of Evil DX===

I was never satisfied with the final result for Arena of Evil, and eventually decided to rebuild it. My first attempt was devoured by the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] after I tried to import an audio track for background music.

Weeks later, I gave it another try. I went for more of a &quot;hell&quot;-ish look. [[Legacy:Postal 2|Postal 2]] doesn't have many castle-ish textures or meshes and I didn't feel like hunting the web for a bunch of custom textures, so I made do with the Napalm Factory's textures. In the end, everything turned out better than I expected, though the map scale is a little large. [http://bastard.popexperiment.com/kamek/postal2/shots/aoedx.jpg?link Screenshot]

===Bomberman===

===Clinic Area===

===The Dark Place===

===Feeding Time===

===Kill Frenzy===

===Library===

===Nondescript Warehouse===

===Office Complex===

===RWS Office===

===RWS Office Plus Back Alley===

===School Daze===

===Sniper Training===

===Suburban Warfare===

===West Mall MP===

===Yet Another Rats Map===

==Related Topics==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DevJournal]]

==External Links==
* [http://bastard.popexperiment.com/kamek/postal2/ |Kamek's Postal 2 Maps and Mods]

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Welcome to the site :)

'''Kamek:''' Thanks :)

'''xX)(Xx:''' Nice! what game are the maps for? and is there anywhere to download them from?

'''Kamek:''' All the maps are for [[Legacy:Postal 2|Postal 2]] and can be found on my website. *adds a link* I'll have to get around to adding more map descriptions when I have time.

'''xX)(Xx:''' Dead Link to your site..after a bit of editing, i got it working, i fixed the link here, hope you dont mind. By the way, those maps are really nice, congrats! You ever thought of porting them to a diff game? ie. Original UT?

'''Kamek:''' Keep in mind that most of the maps I made were conversions from the single player version of Postal 2... most of the levels I &quot;made&quot; were originally made by one of the Postal Team, such as Bryan Dillow. I do have a few &quot;from scratch&quot; levels, though: Arena of Evil (and DX), The Dark Place, School Daze, Bomberman, and a couple others I haven't released yet.

I found that porting levels from one game to another is extremely difficult, especially when there are a lot of static meshes involved, and most of the single player conversions use a lot of static meshes. However, some of the &quot;from scratch&quot; levels could be conceivably ported with little hassle. While I have a copy of [[Legacy:UT2004|UT2004]], I'm not very good with it yet, either playing or level editing.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4012</id>
      <timestamp>2004-11-09T15:00:03Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding [[Legacy:Postal 2|Postal 2]] related stuff for the assistance of modders working on projects for [[Legacy:Postal 2|Postal 2]].

I first became interested in [[Legacy:UnrealScript|UnrealScript]] after the release of [[Legacy:Postal 2|Postal 2]]. My first mod was KamekMod, a single-player alteration which added various new enhancements to single-player mode. When Share The Pain came out, [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]] was next, as I wanted something like RuneQuake for Postal 2.

Since AirMail, I've coded other Postal 2 stuff such as [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/P2JailBreak]], [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PostalArena]], and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/King Of The Hill]]. Currently I am working on Version 3 of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]], an anti-cheat mod called [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]], and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]] which adds more characters to the Postal 2 deathmatch roster.

==Coding Projects (In Progress)==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]]3
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]]3

==Coding Projects (Complete)==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirMail]] Plus
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KamekMod]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/King Of The Hill]]
* [[Legacy:P2JailBreak|P2JailBreak]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PostalArena]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SuperWeapons]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XAdmin]] v1.49
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XCharacters]]2

==Mapping Projects (Complete)==

===Abstract===

The name for the map came from the map's background music, a techno/club track by TaQ called Abstract Radical Mix. The map itself is fairly simple, yet preplexing. The level consists of eight small cube-shaped rooms, all linked to each other by smaller cube-shaped passageways. The edges of the map are linked to the other side with [[Legacy:WarpZoneInfo|WarpZones]]. In addition, there are holes in the floor and ceiling, which also are linked by WarpZones.

Each room has four rocket launcher pickups and eight grenade pickups. The result: sheer chaos.

The decision to include only the explosive weapons comes from the fact that trace weapons just don't work across WarpZones.

The map was more of an experiment than anything else, but I decided to upload it to my server anyway. It's like George W. Bush: you either love it or you hate it.

As of late October, I took this map out of the server list.

===All-American Market===

This stage was based on the Lucky Ganesh/Paradise Book Repository from the single player game. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00034.jpg?Link Screenshot]

===Arena of Evil===

The House of Chthon. Also known as e1m7 to Quake players.

The Arena of Evil was my first attempt at recreating the famed Quake map; a favorite for many players.

The result was a cube-shaped room with a lava pit. Unlike the real e1m7, several areas were left open, and the map itself had several minor problems, but was still a favorite for many Postal players. [http://bastard.popexperiment.com/kamek/postal2/shots/Shot00033.jpg?Link Screenshot]

===Arena of Evil DX===

I was never satisfied with the final result for Arena of Evil, and eventually decided to rebuild it. My first attempt was devoured by the [[Legacy:UnrealEd Goblin|UnrealEd Goblin]] after I tried to import an audio track for background music.

Weeks later, I gave it another try. I went for more of a &quot;hell&quot;-ish look. [[Legacy:Postal 2|Postal 2]] doesn't have many castle-ish textures or meshes and I didn't feel like hunting the web for a bunch of custom textures, so I made do with the Napalm Factory's textures. In the end, everything turned out better than I expected, though the map scale is a little large. [http://bastard.popexperiment.com/kamek/postal2/shots/aoedx.jpg?link Screenshot]

===Bomberman===

===Clinic Area===

===The Dark Place===

===Feeding Time===

===Kill Frenzy===

===Library===

===Nondescript Warehouse===

===Office Complex===

===RWS Office===

===RWS Office Plus Back Alley===

===School Daze===

===Sniper Training===

===Suburban Warfare===

===West Mall MP===

===Yet Another Rats Map===

==Related Topics==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DevJournal]]

==External Links==
* [http://bastard.popexperiment.com/kamek/postal2/ |Kamek's Postal 2 Maps and Mods]

==Guest Book==

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

'''Tarquin:''' Welcome to the site :)

'''Kamek:''' Thanks :)

'''xX)(Xx:''' Nice! what game are the maps for? and is there anywhere to download them from?

'''Kamek:''' All the maps are for [[Legacy:Postal 2|Postal 2]] and can be found on my website. *adds a link* I'll have to get around to adding more map descriptions when I have time.

'''xX)(Xx:''' Dead Link to your site..after a bit of editing, i got it working, i fixed the link here, hope you dont mind. By the way, those maps are really nice, congrats! You ever thought of porting them to a diff game? ie. Original UT?

'''Kamek:''' Keep in mind that most of the maps I made were conversions from the single player version of Postal 2... most of the levels I &quot;made&quot; were originally made by one of the Postal Team, such as Bryan Dillow. I do have a few &quot;from scratch&quot; levels, though: Arena of Evil (and DX), The Dark Place, School Daze, Bomberman, and a couple others I haven't released yet.

I found that porting levels from one game to another is extremely difficult, especially when there are a lot of static meshes involved, and most of the single player conversions use a lot of static meshes. However, some of the &quot;from scratch&quot; levels could be conceivably ported with little hassle. While I have a copy of [[Legacy:UT2004|UT2004]], I'm not very good with it yet, either playing or level editing.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kamek/DevJournal</title>
    <id>1616</id>
    <revision>
      <id>4014</id>
      <timestamp>2004-11-09T12:12:40Z</timestamp>
      <contributor>
        <ip>Sima.marmc.spear.navy.mil</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is a Developer's Journal for [[Legacy:Kamek|Kamek]]. Feel free to make your own comments on entries, just make a subsection under the entry for comments and add your thoughts. Do not alter other peoples' comments or the original entry. Thank you.

==November 9, 2004==

Note to self: look into Postal 2's menus, this might be the cause of our server crashes.

{{innerbox| Mysterial: It seems as though Actor references don't get properly set to None in objects not subclassed from Actor. I had an Interaction that set a variable to one of the local pawn's inventory items, and if that pawn died the game would often crash because the variable wasn't None even though the inventory item no longer existed.

}}

{{innerbox| In addition, the game will randomly crash during garbage collection if an object that is no longer referenced (for example, a menu long closed) if that object contains an invalid Actor reference. The trademark of such a crash is a long list of (Some Object)→Serialize strings in the backtrace.

}}

==November 3, 2004==

I canned Deck17 for [[Legacy:Postal 2|Postal 2]] and instead made a level called &quot;Yet Another Rats Map&quot;, a rats map similar to my bedroom.

Oh, and I voted for Bush.

==October 29, 2004==

Whoa. *dust off the cobwebs*

Since I last touched this page, there's been a lot of crap that I've done, such as finishing P2Jailbreak and coding some other mods, which can be found on my [[Legacy:Kamek|personal page]].

Today I decided to convert a [[Legacy:UT2004|UT2004]] map to [[Legacy:Postal 2|Postal 2]], so I decided on Deck 16's famed next-door neighbor, Deck 17. The brushes are done, now I'm copying all the static meshes. Not easy.

===At work===

Random Gravity mutator idea. The gravity would change at random intervals, one minute you might be moonwalking, the next minute you can hardly jump at all. Maybe some other effects too, like wind or something.

==June 10, 2004 ==

I'm a lazy bastard and don't update my journal as often as I should.

I did run into a few problems with [[Legacy:Postal 2|Postal 2]]. Apparently Postal 2's version of [[Legacy:ScriptedTexture|ScriptedTexture]] doesn't allow for the DrawPortal function. This pretty much shot down my plans for jail cameras for P2JailBreak. Instead I had to use something similar to [[Legacy:Mychaeel|Mychaeel]]'s [[Legacy:CameraSpot|CameraSpot]]. I created a new class called [[Legacy:ChangeViewTrigger|ChangeViewTrigger]] which can be linked to a volume or other trigger to change the player's viewpoint to another camera, player, etc.

I do have most of the glitches worked out for P2JailBreak. The only real major problem left is that players who kill MadCow-infected players don't receive the bonuses they're supposed to. MadCow Disease is the P2JailBreak version of the Llama Hunt, intended to punish players who reconnect to escape jail.

Ponderous-JB how has 6 of the [[Legacy:ChangeViewTrigger|ChangeViewTrigger]]s, 3 for each jail. One of them is linked up to the big-screen TV in the bedroom-turned-jail, which shows an outside view of the base you're locked up in. The other two show you a view of the current leader or one of your non-jailed teammates.

I have some major wiki work to do on the [[Legacy:Postal 2|Postal 2]] classes...

==June 6, 2004 ==

P2JailBreak is going smoothly. It's not as sophisticated as the newer UT2K3/2K4 versions of [[Legacy:Jailbreak|Jailbreak]] but it'll suffice for the Postal community.

I made Jailbreak maps out of Ponderous, Intifada, and Ghetto Sewer. Ponderous and Intifada are [[Legacy:SNATCH|SNATCH]] maps that come with Postal 2 and Ghetto Sewer is a custom [[Legacy:SNATCH|SNATCH]] map.

Renegade didn't do a very good job with Ghetto Sewer. On the outside the map rocks, but there are a lot of technical issues, such as zone leakage... and don't forget the fact that there isn't a single [[Legacy:PathNode|PathNode]] in the entire map...

==June 5, 2004 ==

Begun work on the [[Legacy:Postal 2|Postal 2]] version of [[Legacy:Jailbreak|Jailbreak]]. Please don't sue me [[Legacy:Mychaeel|Mychaeel]] :O

==June 1, 2004 ==

I made a post on the [http://web2.gopostal.com/cgi-bin/ib3/ikonboard.cgi RWS Message Board] inquiring about what mod I should make next for Postal 2. I have a few changes to make to [[Legacy:Postal 2/PostalArena|Postal 2/PostalArena]] before I release version 1.2, hopefully the last version I'll need to make.

I narrowed it down to the following.

* &lt;b&gt;JailBreak&lt;/b&gt;. I had a look at the [http://www.planetjailbreak.com JailBreak web site] and I think this would go over quite well for Postal 2. It should be fairly easy to code, but I'll probably dispense with all the extras that the UT version of JailBreak has, with the exception of Llama Hunting, because we all hate cheaters. ([[Legacy:Jailbreak|Jailbreak]])

* &lt;b&gt;Expert Snatch&lt;/b&gt;. This would be more suitable as a Snatch mutator that simply starts players off with the complete arsenal of weapons, 125 health, and a few goodies such as a crack pipe. I don't want to add a grappling hook because of the nature of some of the snatch levels. ([[Legacy:Mod_Ideas/ExpertCTF|Mod_Ideas/ExpertCTF]])

* &lt;b&gt;TurnCoat&lt;/b&gt;. This would work better as a timed [[Legacy:Postal 2/AirMail|Postal 2/AirMail]] powerup that, when activated, would disguise the user as a member of the enemy team. ([[Legacy:Mod_Ideas/TurnCoat|Mod_Ideas/TurnCoat]])

* &lt;b&gt;Ball Pool&lt;/b&gt;. [[Legacy:Mod_Ideas/UnrealBallPool|Mod_Ideas/UnrealBallPool]]

* &lt;b&gt;King of the Hill&lt;/b&gt;. [[Legacy:Mod_Ideas/KOTH|Mod_Ideas/KOTH]]

==Related Links ==
* [[Legacy:Postal 2/AirMail|Postal 2/AirMail]]
* [[Legacy:Postal 2/PostalArena|Postal 2/PostalArena]]

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4015</id>
      <timestamp>2004-11-03T19:26:06Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is a Developer's Journal for [[Legacy:Kamek|Kamek]]. Feel free to make your own comments on entries, just make a subsection under the entry for comments and add your thoughts. Do not alter other peoples' comments or the original entry. Thank you.

==November 3, 2004==

I canned Deck17 for [[Legacy:Postal 2|Postal 2]] and instead made a level called &quot;Yet Another Rats Map&quot;, a rats map similar to my bedroom.

Oh, and I voted for Bush.

==October 29, 2004==

Whoa. *dust off the cobwebs*

Since I last touched this page, there's been a lot of crap that I've done, such as finishing P2Jailbreak and coding some other mods, which can be found on my [[Legacy:Kamek|personal page]].

Today I decided to convert a [[Legacy:UT2004|UT2004]] map to [[Legacy:Postal 2|Postal 2]], so I decided on Deck 16's famed next-door neighbor, Deck 17. The brushes are done, now I'm copying all the static meshes. Not easy.

===At work===

Random Gravity mutator idea. The gravity would change at random intervals, one minute you might be moonwalking, the next minute you can hardly jump at all. Maybe some other effects too, like wind or something.

==June 10, 2004 ==

I'm a lazy bastard and don't update my journal as often as I should.

I did run into a few problems with [[Legacy:Postal 2|Postal 2]]. Apparently Postal 2's version of [[Legacy:ScriptedTexture|ScriptedTexture]] doesn't allow for the DrawPortal function. This pretty much shot down my plans for jail cameras for P2JailBreak. Instead I had to use something similar to [[Legacy:Mychaeel|Mychaeel]]'s [[Legacy:CameraSpot|CameraSpot]]. I created a new class called [[Legacy:ChangeViewTrigger|ChangeViewTrigger]] which can be linked to a volume or other trigger to change the player's viewpoint to another camera, player, etc.

I do have most of the glitches worked out for P2JailBreak. The only real major problem left is that players who kill MadCow-infected players don't receive the bonuses they're supposed to. MadCow Disease is the P2JailBreak version of the Llama Hunt, intended to punish players who reconnect to escape jail.

Ponderous-JB how has 6 of the [[Legacy:ChangeViewTrigger|ChangeViewTrigger]]s, 3 for each jail. One of them is linked up to the big-screen TV in the bedroom-turned-jail, which shows an outside view of the base you're locked up in. The other two show you a view of the current leader or one of your non-jailed teammates.

I have some major wiki work to do on the [[Legacy:Postal 2|Postal 2]] classes...

==June 6, 2004 ==

P2JailBreak is going smoothly. It's not as sophisticated as the newer UT2K3/2K4 versions of [[Legacy:Jailbreak|Jailbreak]] but it'll suffice for the Postal community.

I made Jailbreak maps out of Ponderous, Intifada, and Ghetto Sewer. Ponderous and Intifada are [[Legacy:SNATCH|SNATCH]] maps that come with Postal 2 and Ghetto Sewer is a custom [[Legacy:SNATCH|SNATCH]] map.

Renegade didn't do a very good job with Ghetto Sewer. On the outside the map rocks, but there are a lot of technical issues, such as zone leakage... and don't forget the fact that there isn't a single [[Legacy:PathNode|PathNode]] in the entire map...

==June 5, 2004 ==

Begun work on the [[Legacy:Postal 2|Postal 2]] version of [[Legacy:Jailbreak|Jailbreak]]. Please don't sue me [[Legacy:Mychaeel|Mychaeel]] :O

==June 1, 2004 ==

I made a post on the [http://web2.gopostal.com/cgi-bin/ib3/ikonboard.cgi RWS Message Board] inquiring about what mod I should make next for Postal 2. I have a few changes to make to [[Legacy:Postal 2/PostalArena|Postal 2/PostalArena]] before I release version 1.2, hopefully the last version I'll need to make.

I narrowed it down to the following.

* &lt;b&gt;JailBreak&lt;/b&gt;. I had a look at the [http://www.planetjailbreak.com JailBreak web site] and I think this would go over quite well for Postal 2. It should be fairly easy to code, but I'll probably dispense with all the extras that the UT version of JailBreak has, with the exception of Llama Hunting, because we all hate cheaters. ([[Legacy:Jailbreak|Jailbreak]])

* &lt;b&gt;Expert Snatch&lt;/b&gt;. This would be more suitable as a Snatch mutator that simply starts players off with the complete arsenal of weapons, 125 health, and a few goodies such as a crack pipe. I don't want to add a grappling hook because of the nature of some of the snatch levels. ([[Legacy:Mod_Ideas/ExpertCTF|Mod_Ideas/ExpertCTF]])

* &lt;b&gt;TurnCoat&lt;/b&gt;. This would work better as a timed [[Legacy:Postal 2/AirMail|Postal 2/AirMail]] powerup that, when activated, would disguise the user as a member of the enemy team. ([[Legacy:Mod_Ideas/TurnCoat|Mod_Ideas/TurnCoat]])

* &lt;b&gt;Ball Pool&lt;/b&gt;. [[Legacy:Mod_Ideas/UnrealBallPool|Mod_Ideas/UnrealBallPool]]

* &lt;b&gt;King of the Hill&lt;/b&gt;. [[Legacy:Mod_Ideas/KOTH|Mod_Ideas/KOTH]]

==Related Links ==
* [[Legacy:Postal 2/AirMail|Postal 2/AirMail]]
* [[Legacy:Postal 2/PostalArena|Postal 2/PostalArena]]

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma</title>
    <id>1574</id>
    <revision>
      <id>3914</id>
      <timestamp>2005-10-22T19:10:31Z</timestamp>
      <contributor>
        <ip>Ool-44c04f8e.dyn.optonline.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Karma''' is the new physics engine included in UnrealEngine2. It runs alongside the regular physics engine, which works essentially the same as the physics in the original UnrealEngine1.  In addition to '''Karma Rigid Body Simulation''', Karma supports a more complex form of simulation called '''[[Legacy:Karma Ragdoll|Karma Ragdoll]] Simulation'''.  Actors of both types interact with one another in the world but they have different uses in practice.

==Karma Rigid Body Simulation==

Karma Rigid Bodies are simply static meshes that are simulated using the Karma engine. Their mass distribution and inertia is determined in real-time, unless you specify otherwise in their Karma Properties. Note that you can only use Rigid Body simulation on static meshes. '''However,''' that does not mean that your actor must have DT_StaticMesh set. You can still run a Karma simulation on an actor with DT_Mesh or DT_Sprite or any other drawtype. In that instance, the appropriate drawtype will be ''displayed,'' but the ''physics'' will still be determined by the static mesh.

==Karma Ragdoll Simulation==

[[Legacy:Karma Ragdoll|Karma Ragdoll]] simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]] and animates it according to external forces and internal constraints.

==Karma Constraints==

Karma Constraints are Karma physics interactions between objects. They cause some physical phenomenon between two actors, or an actor and the world. This may be a point around which an actor may pivot but is otherwise fixed to the world, or a springy tether that limits the ability of two objects to move apart, or a myriad of other configurations. Note that the world is assumed to have infinite mass, while other objects will both experience any force that the constraint generates. You can use more than one constraint between the same two actors to create more complex activities. There are 4 main classes of constraint. This page provides only an overview and explanation of the various constraint classes, more information can be found on the individual class pages for those constraints:

===[[Legacy:KBSJoint|KBSJoint]]===

This is a &quot;ball and socket&quot; joint. Actors joined by this type of joint cannot change their distance from each other. They can be rotated by outside stimuli and will &quot;swing&quot; around the point at which they are fixed to the other actor. The point at which they are fixed is the point in the world where the KBSJoint is located. (I believe.)

===[[Legacy:KConeLimit|KConeLimit]]===

This is a special type of constraint because its location in the world does not mean anything.  Its function is to limit rotation angles of objects to KHalfAngle and to do so with specified KStiffness and KDamping. The angle you set will limit rotation of the affected KConstraintActors to 0.5*KHalfAngle in either direction of the starting orientation. The important thing to note is that this constraint limits angle movements from its starting orientation. In other words, when the level starts, the actors (or more accurately their coordinate system) can only increase rotation by 0.5*KHalfAngle or decrease rotation by 0.5*KHalfAngle. If this angle is exceeded, the KStiffness will return it to its limits. If you set the KStiffness very strong objects will be stopped dead (more or less) upon reaching the limit. A very light force will cause a &quot;springy&quot; return to the limits.

===[[Legacy:KHinge|KHinge]]===

This type of constraint allows rotation around one axis only, set by the orientation of the constraint itself. There are 4 types you can set this to, through the KHingeType parameter: HT_Normal, HT_Springy, HT_Motor, and HT_Controlled.

* HT_Normal has no special properties. It will allow the objects to spin freely around the axis of the constraint. 
* HT_Springy will apply a torsional force to return the object to a set orientation around the constraints axis.
* HT_Motor applies a constant torsional force to spin the second object around the first, or vice versa. 
* HT_Controlled is between an HT_Springy and HT_Motor - it attempts to achieve a certain angle through the use of a motorized hinge. These are similar in their aim but act somewhat differently.

===[[Legacy:KCarWheelJoint|KCarWheelJoint]]===

This is a special type of constraint, used for attaching wheels to cars. It combines several types of constraint into one. It saves on constraint usage and runs faster than using several separate constraints. It contains an &quot;HT_Springy&quot; style suspension, &quot;HT_Controlled&quot; style steering, and &quot;HT_Motor&quot; style drive system. You will need one for each wheel, though each wheel will not always have all three of these systems. If a wheel has no drive, the drive settings for that wheel can be left at the default, zero. If it has no steering you can leave the steering as it is if you'd like, but it is recommended that you toggle a special flag that indicates that the wheel is fixed and has no ability to steer. This will protect it from outside interference.

==Karma Actors Syntax and Variables==

All actors have a variable called '''KParams'''. This variable is a pointer to a class of type [[Legacy:KarmaParams|KarmaParams]] or one of its subclasses. To set up the Karma physics of an object, set up a KarmaParams class or a subclass of it and assign it to the KParams variable. You must also set the Movement -&gt; Physics to PHYS_Karma. The way that I do this is to put something like the following in the [[Legacy:Default Properties|default properties]] of the object. The specific variables for KarmaParams and it's subclasses can be found on their respective pages, indexed below. You can add or omit properties as required, obviously:

&lt;uscript&gt;
Physics=PHYS_Karma
Begin Object Class=KarmaParams Name=KParams0
  KMass=8
  KStartEnabled=True
  KFriction=1.5
  KLinearDamping=0
  KAngularDamping=0
  Name=&quot;KParams0&quot;
End Object
KParams=KarmaParams'KParams0'
&lt;/uscript&gt;

===Subclasses of KarmaParams===
 [[Legacy:KarmaParams|KarmaParams]]
      +- [[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]
      +- [[Legacy:KarmaParamsSkel|KarmaParamsSkel]]

==Karma Constraints Syntax and Variables==

Karma Constraints are spawned and treated as actors in all respects. A few variables must be set, however, in order for them to have any effect on the game world. These parameters are all you should need for setting up Karma constraints in the editor. If you would like to generate them in real-time or use them in other more exotic ways, please refer to the specific class pages for more detail on all of the settings.

; KConstraintActor1 : This is the first actor that this constraint should affect. It defaults to none. If KConstraintActor1==none, the constraint will have no effect or behave strangely when KConstraintActor2 != none ... therefore always set this variable first :D .

; KConstraintActor2 : This is the second actor that this constraint should affect. It defaults to none. If it is not set to an actor, the constraint will be enforced between KConstraintActor1 and the world &amp;ndash; i.e. the constraint will not move location (only rotation).  This is a better solution than attaching to a PHYS_None actor because sometimes such actors will cause a crash when attached to a constraint.

; KConstraintBone1 : If KConstraintActor1 has skeletal data associated with it, this is the name of the bone that the constraint should affect. This defaults to a blank name. If left blank, the bone closest to the constraint will be used.

; KConstraintBone2 : If KConstraintActor2 has skeletal data associated with it, this is the name of the bone that the constraint should affect. This defaults to a blank name. If left blank, the bone closest to the constraint will be used.

; bKDisableCollision : If this is set to true, the two actors joined by the constraint will not collide with each other. They will collide as per their normal collision settings with any other actor. Conversely, if this is set to false, the two actors will collide as they would with any other actor. This property defaults to true.

; KForceThreshold: This setting dictates the point at which the KForceExceed event should be triggered. This event is triggered on the &lt;B&gt;constraint&lt;/B&gt; when the linear force being applied to the constraint exceeds this value. No event is called on the actors involved; only the constraint itself receives the event. If set to 0, the event will never be triggered. This property defaults to 0.

; bKForceFrameUpdate: Forces the constraint to update its local reference frame the next time Karma is updated. (between the end of this tick and the start of the next) This is usually false for things created in the editor, because the editor calculates the local reference frame automatically whenever you change a value in the constraint. It is helpful, however, if the constraint is generated through script, as it automatically calculates the relative positions and angles of the karma actors involved, based on their positions at it's first Karma update. It is a constant variable, so it can only really be set in the default properties. (barring the use of SetPropertyText - behaviour in this scenario is unknown.)

===[[Legacy:KBSJoint|KBSJoint]]===

[[Legacy:KBSJoint|KBSJoint]] has no additional parameters to set.

===[[Legacy:KConeLimit|KConeLimit]]===
; KHalfAngle : This is the amount of rotation permitted by the limiter from the orientation of the limiter itself. This is set in Unreal units, not Karma units.

; KStiffness : The amount of force applied to stop an object that has exceeded it's limit. The greater this value is, the more force will be exerted to return the constraints' participants to the limit.

; KDamping : The amount of force that the limiter will absorb from an actor that has exceeded the limit. Without any damping, an actor will 'ricochet' off of the limit when it exceeds it, while a large amount of damping will cause the actor to bounce gently from the limit.

===[[Legacy:KHinge|KHinge]]===

[[Legacy:KHinge|KHinge]] has a number of properties to set, however some may not be used depending on the setting of HingeType.
; KHingeType : HT_Normal, HT_Springy, HT_Motor, or HT_Controlled. Details of what each is and does are provided above in the general information about KHinges.

; KStiffness : This is the same as KStiffness in KConeLimit. This is how much force will be applied to return the hinge to it's original  rotation. This is only used if the hinge is of KHingeType HT_Springy. It defaults to 50.

; KDamping : This is the amount of damping applied to external forces acting on the hinge. (any force other than that applied by KStiffness) If your spring has no damping, it will swing back and forth endlessly bouncing off objects. The higher this is set, the less outside forces will be able to interfere with the hinge. This applies only to hinges of KHingeType HT_Springy. The default value for this property is 0.

; KDesiredAngVel : The desired rate of hinge rotation. This is in Karma units, not Unreal units. If the hinge is of KHingeType HT_Motor or HT_Controlled, the hinge will increase it's rate of rotation as much as possible until it reaches this speed or is stopped by reaching it's desired angle in the case of HT_Controlled, or is shutdown by a trigger or from within code. By default, this is set to 0.

; KMaxTorque : The maximum amount of torque that the hinge can output, if it is of KHingeType HT_Motor or HT_Controlled. This primarily impacts the acceleration of the hinge up to KDesiredAngVel. This is set to 0 by default.

; KDesiredAngle : If the hinge is of KHingeType HT_Springy or HT_Controlled, this is the angle that it will attempt to achieve, either through spring tension or the application of torque, as applicable. &lt;B&gt;This is in Unreal Units, not Karma units.&lt;/B&gt; It's default value is 0.

; KAltDesiredAngle : This is the same as KDesiredAngle, and is used in lieu of it if KUseAltDesired is set to true. If KUseAltDesired is set to false, the KDesiredAngle is the angle that the hinge will attempt to attain. This variable defaults to 0.

; KUseAltDesired : This is a toggle that selects between KDesiredAngle and KAltDesiredAngle. If it is false, the desired angle is KDesiredAngle. If it is true, the desired angle is KAltDesiredAngle. It defaults to false.

; KProportionalGap : This is a value used to make smoother movements with KHingeType HT_Controlled. When the difference between the desired angle and actual angle is less than this value, the KDesiredAngVel that is used for the hinge will be interpolated between the actual setting of the variable KDesiredAngVel, and 0. This means that the closer the angle is to what it is desired to be, the slower the joint will move. This value defaults to 8200. If it is too low, the hinge may overshoot the desired angle before it can stop itself. Even if it does not it will result in a very abrupt halt if this value is set too low. Conversely if it is set to high the hinge will behave sluggishly. It is best to experiment with this value to get the desired effect.

; KCurrentAngle : This is a constant variable that indicates the current rotation of the hinge around its axis. When a KHinge starts in a map, its angle always starts at zero.  When the hinge rotates, the amount of rotation (in Unreal units - i.e. 65535 = 360 degrees) is added to KCurrentAngle. Think of it as just another coordinate system, but where the hinge is at the origin and the rotation is 0.  When the coordinate system rotates, all the KConstraintActors in it rotate as well.  However, the cool thing is that these KConstraintActors are actually rotating the coordinate system using physics which then causes an update to KCurrentAngle. Because KCurrentAngle is constant, you can only read this value to find the rotation of the hinge. Attempting to change the value of this variable cannot rotate the hinge.

You can set the state of the hinge to further control its behavior. In it's default state it acts as described above. There are four special states that will respond to being triggered by UnrealScript or something in a map. They are ToggleMotor, ControlMotor, ToggleDesired, and ControlDesired.

; ToggleMotor : When triggered, KHingeType will be changed to HT_Motor, if it is not already. If it is set to HT_Motor already, it will change to HT_Controlled and KDesiredAngle will be set to its current rotation. KUseAltDesired will be set to false as well. Generally you would use this to toggle between a motor rotating and being locked into position. It will set the KHingeType to HT_Controlled when it is first created, though it will not set it's own KDesiredAngle. It will set KUseAltDesired to false when it is first spawned/the map is loaded.

; ControlMotor : This is similar to ToggleMotor, but works slightly differently. When triggered, it will set KHingeType to HT_Motor. When untriggered, it will set KHingeType to HT_Controlled, KDesiredAngle to the current angle, and KUseAltDesired to false. However, it will only do so if the current type is HT_Motor. Usually it would be as it was set that way when it was triggered, but in the case that some other code has changed it before it was untriggered, it will not change any settings when untriggered if it is not an HT_Motor at the time.

; ToggleDesired : This is a simple type, when triggered it will toggle KUseAltDesired. It does not modify KHingeType or KDesiredAngle, nor does it do any setup when spawned/the map is loaded.

; ControlDesired : Similar to ToggleDesired, when triggered, KUseAltDesired will be set to true. When untriggered, KUseAltDesired will be set to false. It does not modify KHingeType or KDesiredAngle, nor does it do any setup when spawned/the map is loaded.

Note also that HT_Springy and HT_Controlled will &quot;sleep&quot; the simulation once they have settled at their desired location. Subsequent changes to the KDesiredAngle will have no effect until one or both of the constrained actors is awakened through KAddImpulse, collision with another Karma actor, or KWake. If you are using one of the &quot;states&quot; listed above to control the hinge it will be done for you, but if, for instance, you wanted a hinge to track something and thus it constantly changed it's KDesiredAngle, you will need to awaken the actors it constrains as appropriate.

==Karma Functions and Events==

There are a great deal of functions and events associated with Karma. Some are commonly used while others are of questionable 

value. Due to the sheer number of functions they have been given their own page: [[Legacy:Karma Functions And Events|Karma Functions and Events]].

==KSimParams==

Avoid screwing with these. These are internal parameters used by the Karma Engine. You can modify them but be aware that although they are declared in Actor, they are global and will persist even after you exit the level. You must restart UT2003 in order to reset these to the defaults. These affect things like leeway in collision and when a Karma simulated object is deemed to have suffered a SimError - which generally results in it's destruction. KGetSimParams and KSetSimParams can be used to get and set the current SimParams if you are so inclined. Most of these should not be changed, because doing so generally only causes bad things to happen. However, some can be tweaked.. but note that Epic has of course already tweaked them extensively so unless you have a specific application that requires the tweaking, you will probrably only make things worse by changing them. Regardless, here goes..

; GammaPerSec : Supposedly this makes things push apart harder when they penetrate, though no indication is given as to whether a larger or smaller value causes this behaviour more. It's referred to as the relaxation constant, which implies the latter. Defaults to 6. I don't believe negative values are valid.

; Epsilon : This is the &quot;constraint compliance.&quot; The comment in the script says it makes joints softer or harder, but don't be fooled! This is actually the amount of &quot;slop&quot; allowed in the contraint simulation. EG, a KHinge is supposed to allow rotation around one axis, and one axis only. This controls the amount of rotation allowed around other axes. By default, this is set to 0.001. No slop is really noticeable under normal conditions with this value, but can be observed by making a very large Karma simulated actor and applying a strong impulse to it, perpindicular to the axis it's &quot;allowed&quot; to rotate around by the KHinge. 0.005 results in noticeable slop for even small actors, while 0.0002 appears to be very precise. I highly doubt negative values are valid. Changing this value does not appear to impact performance, however lower (more precise) tends to cause jiggling in ragdolls. If it's too low, (lower than about 0.000025) Karma objects will not simulate at all. You shouldn't normally need to change this, unless you are dealing with very large Karma actors and strong impulses or collisions with other large Karma actors.

; PenetrationOffset : This appears to be added to the actual penetration for all intensive purposes when the object is consider &quot;at rest.&quot; IE, when it's not moving, it's assumed to be penetrating the world by this much, meaning it has to be &quot;dislodged&quot; by some amount of force in order to move it. This helps to keep actors at rest resting, instead of the simulation being restarted from the slightest thing. Default is 0.01. Obviously, larger values make actors more dificult to &quot;dislodge&quot; from rest. Negative values might not be allowed, but if they are, they would probrably make things appear to vibrate when &quot;at rest.&quot;

; PenetrationScale : Penetration is multiplied by this amount. So, if two actors are interpenetrating by 1 UU, the Karma system will consider them interpenetrating by 2 UUs. Since interpenetration is caused by collision, this causes objects to appear to have impacted each other much harder (or softer, if the value is lower) than they really did. The default is 1. Negative values are probrably not possible, but if they are, would they create a black hole effect?

; ContactSoftness : Supposedly, this is the softness of contact constraints. However, with no inforation as to what a contact constraint is, I can't say much about this. The default is 0.01.

; MaxPenetration : The maximum amount of penetration allowed. Since penetration is generally the result of collision, penetration is assumed to be the result of collision if it is below this amount, and the objects will &quot;bounce&quot; off each other with stiffness and such determined by their KParams. Above this amount, the two objects are assumed to in fact not be colliding, but instead one is impaled on the other and should not bounce off but instead remain within the other actor. The default is 0.1. (This is in Karma units I think, so it translates to about 5 UUs.) Note that impalation in this manner does not guarantee that the actors will stay together - they still simulate separately. The penetration is merely assumed to be not the result of a collision, so the actors won't &quot;push off&quot; each other.

; MaxTimeStep : This is the maximum &quot;tick&quot; allowed to the Karma system. So, if it was 100 ms, and you were getting 1 fps, the simulation would update 10 times per frame with a &quot;deltatime&quot; of 100ms each time. This does not actually affect the Tick in script, but the analogy was provided for illustrative purposes. If your framerate is sufficiently high, then the Karma simulation will just update once every frame. The default is 0.04, which is probrably 40ms, so if you are getting more than 25 fps, Karma updates once per frame. Lower values will give a more precise simulation, but are likely directly proportional to the performance of the Karma system. Note that there appears to be a maximum number of updates per tick, so if you set this too low (too precise of simulation) the simulation will be slowed down to fit within the maximum updates per tick.

'''O-GL:''' Are you sure that the Karma physics can be simulated more than 2 times per frame?  When I was getting really low fps (ie 1-4), the karma simulation was running like in slo-mo....

'''Foxpaw:''' Karma seems to run properly on my machine at low fps, but I suppose there's no way to know for SURE how many times it's simulating per second. Or is there? :P Maybe KUpdateState or some function like that gets caled every time the simulation is updated.  Then again, it might just get called once a tick regardless.

'''Foxpaw:''' I got curious so I played around with more extreme values of MaxTimeStep. It appears that there is a limit on the number of times it gets updated per tick. I tried setting MaxTimeStep to 0.004 which resulted in approximately 2 and a half times the number of cycles expended by Karma. The simulation appeared to be slowed to approximately a third of it's usual rate. So, it appears there is a cap on the number of times it can get updated per tick, and the lowest admissable MaxTimeStep seems to be about 0.015 or so, at a fast framerate. That wouldn't leave much leeway for slower machines though - or so I would think. By your comment below it appears much lower values may be possible without slowdown if you have a faster machine or less Karma to simulate.

'''O-GL''' Nah man, when I set it to 0.001, that means I would need to be getting 1000 fps to run Karma at normal speed (with slomo=1).  I was getting about 40fps and it too friggin ages to move anywhere ^^.  When I set MaxTimeStep to 0.005, I should theoretically need 200fps to run smoothly.  When running smoothly, I should move along at 400UU/sec due to my acceleration/deceleration code.  At 50fps, I move along at 100UU/sec and at 30fps I move along at about 60UU/sec.  This was done with a custom speed measurer because, for some reason RBstate.LinVel still says I'm moving along at 400 (there must be something wrong with LinVel cos it should be using MaxTimeStep if DeltaTime&gt;MaxTimeStep).  Thanks to this MaxTimeStep, I can (hopefully) get a good basis for my lockstep multiplayer code (I owe you big-time Foxpaw) ... but thats a story for my journal.  I should also state that if I slow the game speed to say &quot;slomo 0&quot;, the Karma will have a chance to meet the low TimeStep because time is stepping alot slower per frame, and therefore, at slow times, you can actually move more UU per &quot;second&quot;.
; MaxKarmaSpeed : This is fairly straightforward, and is the maximum allowed speed of any Karma actor. It's a bit low by default. The default is 2500. Making it higher will make the simulation more accurate, but if a Karma actor hits something going too fast, it could get lodged in it. (By exceeding MaxPenetration in a single update.) In theory, you should be able to avoid all kinds of Karma craziness by limiting your maximum MaxKarmaSpeed.  Using the equation MaxPenetration per second = MaxPenetration/MaxTimeStep = 5/0.04 = 125 UU per second, you could set MaxKarmaSpeed = 125 and possibly stop some items from being lodged in other items. MaxKarmaSpeed has an interesting condition associated with it: if a fast moving Karma actor is revolving around another fast moving Karma actor and the two are joined by a constraint, the constraint can &quot;explode.&quot; (That's my term for it) The two pieces are sent flying away from each other at MaxKarmaSpeed for no apparent reason. I would hazard that perhaps some int or float is rolling over in some of the Karma systems internal math, and the velocities/rotation rates required appear to be directly related to framerate. At any rate, lower MaxKarmaSpeeds prevent objects from travelling at extreme velocities, limiting this behaviour.

'''O-GL:''' That?s too slow for me considering my pawn travels at around 400 UU per second.  I?m gonna try changing MaxPenetration and see if I don?t get stuck in walls :D.  Thanks for doing KSimParams FoxPaw, I never would've been bothered with it otherwise :cheesy:.

'''Foxpaw:''' Yes, 125 is barely moving.. I bumped mine up to 25000 and have yet to have any lodging problems. Granted, though, collisions usually call KImpact, which in my case usually destroys the actor (later, in tick, to prevent crashing) so that may contribute to the lack of lodging as well.

'''O-GL:''' Unfortunately, I can still walk right through a few of the buggy walls in Antalus :'(.  Even with MaxTimestep=0.001 and MaxPenetration=0.1.  I think it's just the levels's fault or something because I walk slowly inside the wall and can sorta step out of the world to where my screen freezes.  I'm just gonna have to make a hack up to where I use cylinder collision to see if I'm inside a wall, and if so, re-spawn out of it.

'''Foxpaw:''' I'm not sure which walls these are that are causing the problem, but if they're terrain, it's probrably because terrain is infinitely thin so I'm not sure how the penetration is figured in that case.

'''Baz:''' The MaxKarmaSpeed and MaxRagdollSpeed properties have been removed in 2004. I assume this means there's no way of changing the max speed now?

'''Foxpaw:''' MaxKarmaSpeed appears to have been changed to KMaxSpeed in UT2004.

; MaxRagdollSpeed : Similar to MaxKarmaSpeed, this one's for Ragdolls. The comments suggest that if this was higher than MaxKarmaSpeed, the MaxKarmaSpeed would still stop the ragdoll from going any faster, but I haven't tested that. It defaults to 800, which is rediculously slow, since you can knock a ragdoll off a high building and then jump after it and you will rocket past it. The default speed of 800 is a bit floaty, but there again, you may encounter penetration issues if you make it too high without dropping the MaxTimeStep, which would cause a drop in performace.

==Assorted Tidbits==
; bBlockKarma : This is a setting in Actor - it defines whether the actor will block Karma simulated objects. Usually this should be the same as bBlockActors, though it is not automatically set as such.

===IMPORTANT when using constraints in UnrealED for UT2003 (with patch 2225) ===

When you move or rotate a KConstraintActor of a constraint in UnrealED, the constraint WILL NOT recognize its new location or rotation.  If you play your map, you will probably get unexpected results like KConeLimit using different angles or KHinge moving the KConstraintActors back to an older position you set in UnrealED.  What I have found updates the constraint is to simply change and save a variable in each of the contraints using the KConstraintActor.  For example, find a redundant variable such as &quot;Buoyancy&quot; in your constraint or another variable that will not affect much, change it, save, and then run the map.  You will find that the constraint and KContraintActor are updated and now functioning correctly.

==Related Topics==
* [[Legacy:Joints Coding|Joints Coding]]
* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]]
* [[Legacy:Karma Ragdoll|Karma Ragdoll]]
* [[Legacy:Linking Karma Ragdolls|Linking Karma Ragdolls]]
* [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]
* [[Legacy:Mod Ideas/KarmaCrossfire|Mod Ideas/KarmaCrossfire]]
* [[Legacy:Modifying The Bulldog|Modifying The Bulldog]]
* [[Legacy:Skeletal Mesh|Skeletal Mesh]]
* [[Legacy:Collision Detection|Collision Detection]]

Karma-ized classes:
* [[Legacy:KCar|KCar]]
* [[Legacy:KVehicle|KVehicle]]

==External links==
* [[udn2:KarmaReference]] &amp;ndash; A dry Karma reference
* [[udn2:IntroToKarma]]   &amp;ndash; Tutorials and examples

==Comments ==

'''Tarquin:''' You might want to think about splitting this page up, as it's getting pretty long. It seems to me that you could have this page as a general intro, and then have [[Legacy:Ragdoll Simulation|Ragdoll Simulation]] and [[Legacy:Rigid Body Simulation|Rigid Body Simulation]].</text>
    </revision>
    <revision>
      <id>3915</id>
      <timestamp>2005-07-05T02:57:23Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Not removed, only renamed.</comment>
      <text xml:space="preserve">'''Karma''' is the new physics engine included in UnrealEngine2. It runs alongside the regular physics engine, which works essentially the same as the physics in the original UnrealEngine1.  In addition to '''Karma Rigid Body Simulation''', Karma supports a more complex form of simulation called '''[[Legacy:Karma Ragdoll|Karma Ragdoll]] Simulation'''.  Actors of both types interact with one another in the world but they have different uses in practice.

==Karma Rigid Body Simulation==

Karma Rigid Bodies are simply static meshes that are simulated using the Karma engine. Their mass distribution and inertia is determined in real-time, unless you specify otherwise in their Karma Properties. Note that you can only use Rigid Body simulation on static meshes. '''However,''' that does not mean that your actor must have DT_StaticMesh set. You can still run a Karma simulation on an actor with DT_Mesh or DT_Sprite or any other drawtype. In that instance, the appropriate drawtype will be ''displayed,'' but the ''physics'' will still be determined by the static mesh.

==Karma Ragdoll Simulation==

[[Legacy:Karma Ragdoll|Karma Ragdoll]] simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]] and animates it according to external forces and internal constraints.

==Karma Constraints==

Karma Constraints are Karma physics interactions between objects. They cause some physical phenomenon between two actors, or an actor and the world. This may be a point around which an actor may pivot but is otherwise fixed to the world, or a springy tether that limits the ability of two objects to move apart, or a myriad of other configurations. Note that the world is assumed to have infinite mass, while other objects will both experience any force that the constraint generates. You can use more than one constraint between the same two actors to create more complex activities. There are 4 main classes of constraint. This page provides only an overview and explanation of the various constraint classes, more information can be found on the individual class pages for those constraints:

===[[Legacy:KBSJoint|KBSJoint]]===

This is a &quot;ball and socket&quot; joint. Actors joined by this type of joint cannot change their distance from each other. They can be rotated by outside stimuli and will &quot;swing&quot; around the point at which they are fixed to the other actor. The point at which they are fixed is the point in the world where the KBSJoint is located. (I believe.)

===[[Legacy:KConeLimit|KConeLimit]]===

This is a special type of constraint because its location in the world does not mean anything.  Its function is to limit rotation angles of objects to KHalfAngle and to do so with specified KStiffness and KDamping. The angle you set will limit rotation of the affected KConstraintActors to 0.5*KHalfAngle in either direction of the starting orientation. The important thing to note is that this constraint limits angle movements from its starting orientation. In other words, when the level starts, the actors (or more accurately their coordinate system) can only increase rotation by 0.5*KHalfAngle or decrease rotation by 0.5*KHalfAngle. If this angle is exceeded, the KStiffness will return it to its limits. If you set the KStiffness very strong objects will be stopped dead (more or less) upon reaching the limit. A very light force will cause a &quot;springy&quot; return to the limits.

===[[Legacy:KHinge|KHinge]]===

This type of constraint allows rotation around one axis only, set by the orientation of the constraint itself. There are 4 types you can set this to, through the KHingeType parameter: HT_Normal, HT_Springy, HT_Motor, and HT_Controlled.

* HT_Normal has no special properties. It will allow the objects to spin freely around the axis of the constraint. 
* HT_Springy will apply a torsional force to return the object to a set orientation around the constraints axis.
* HT_Motor applies a constant torsional force to spin the second object around the first, or vice versa. 
* HT_Controlled is between an HT_Springy and HT_Motor - it attempts to achieve a certain angle through the use of a motorized hinge. These are similar in their aim but act somewhat differently.

===[[Legacy:KCarWheelJoint|KCarWheelJoint]]===

This is a special type of constraint, used for attaching wheels to cars. It combines several types of constraint into one. It saves on constraint usage and runs faster than using several separate constraints. It contains an &quot;HT_Springy&quot; style suspension, &quot;HT_Controlled&quot; style steering, and &quot;HT_Motor&quot; style drive system. You will need one for each wheel, though each wheel will not always have all three of these systems. If a wheel has no drive, the drive settings for that wheel can be left at the default, zero. If it has no steering you can leave the steering as it is if you'd like, but it is recommended that you toggle a special flag that indicates that the wheel is fixed and has no ability to steer. This will protect it from outside interference.

==Karma Actors Syntax and Variables==

All actors have a variable called '''KParams'''. This variable is a pointer to a class of type [[Legacy:KarmaParams|KarmaParams]] or one of its subclasses. To set up the Karma physics of an object, set up a KarmaParams class or a subclass of it and assign it to the KParams variable. You must also set the Movement -&gt; Physics to PHYS_Karma. The way that I do this is to put something like the following in the [[Legacy:Default Properties|default properties]] of the object. The specific variables for KarmaParams and it's subclasses can be found on their respective pages, indexed below. You can add or omit properties as required, obviously:

&lt;uscript&gt;
Physics=PHYS_Karma
Begin Object Class=KarmaParams Name=KParams0
  KMass=8
  KStartEnabled=True
  KFriction=1.5
  KLinearDamping=0
  KAngularDamping=0
  Name=&quot;KParams0&quot;
End Object
KParams=KarmaParams'KParams0'
&lt;/uscript&gt;

===Subclasses of KarmaParams===
 [[Legacy:KarmaParams|KarmaParams]]
      +- [[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]
      +- [[Legacy:KarmaParamsSkel|KarmaParamsSkel]]

==Karma Constraints Syntax and Variables==

Karma Constraints are spawned and treated as actors in all respects. A few variables must be set, however, in order for them to have any effect on the game world. These parameters are all you should need for setting up Karma constraints in the editor. If you would like to generate them in real-time or use them in other more exotic ways, please refer to the specific class pages for more detail on all of the settings.

; KConstraintActor1 : This is the first actor that this constraint should affect. It defaults to none. If KConstraintActor1==none, the constraint will have no effect or behave strangely when KConstraintActor2 != none ... therefore always set this variable first :D .

; KConstraintActor2 : This is the second actor that this constraint should affect. It defaults to none. If it is not set to an actor, the constraint will be enforced between KConstraintActor1 and the world &amp;ndash; i.e. the constraint will not move location (only rotation).  This is a better solution than attaching to a PHYS_None actor because sometimes such actors will cause a crash when attached to a constraint.

; KConstraintBone1 : If KConstraintActor1 has skeletal data associated with it, this is the name of the bone that the constraint should affect. This defaults to a blank name. If left blank, the bone closest to the constraint will be used.

; KConstraintBone2 : If KConstraintActor2 has skeletal data associated with it, this is the name of the bone that the constraint should affect. This defaults to a blank name. If left blank, the bone closest to the constraint will be used.

; bKDisableCollision : If this is set to true, the two actors joined by the constraint will not collide with each other. They will collide as per their normal collision settings with any other actor. Conversely, if this is set to false, the two actors will collide as they would with any other actor. This property defaults to true.

; KForceThreshold: This setting dictates the point at which the KForceExceed event should be triggered. This event is triggered on the &lt;B&gt;constraint&lt;/B&gt; when the linear force being applied to the constraint exceeds this value. No event is called on the actors involved; only the constraint itself receives the event. If set to 0, the event will never be triggered. This property defaults to 0.

; bKForceFrameUpdate: Forces the constraint to update its local reference frame the next time Karma is updated. (between the end of this tick and the start of the next) This is usually false for things created in the editor, because the editor calculates the local reference frame automatically whenever you change a value in the constraint. It is helpful, however, if the constraint is generated through script, as it automatically calculates the relative positions and angles of the karma actors involved, based on their positions at it's first Karma update. It is a constant variable, so it can only really be set in the default properties. (barring the use of SetPropertyText - behaviour in this scenario is unknown.)

===[[Legacy:KBSJoint|KBSJoint]]===

[[Legacy:KBSJoint|KBSJoint]] has no additional parameters to set.

===[[Legacy:KConeLimit|KConeLimit]]===
; KHalfAngle : This is the amount of rotation permitted by the limiter from the orientation of the limiter itself. This is set in Unreal units, not Karma units.

; KStiffness : The amount of force applied to stop an object that has exceeded it's limit. The greater this value is, the more force will be exerted to return the constraints' participants to the limit.

; KDamping : The amount of force that the limiter will absorb from an actor that has exceeded the limit. Without any damping, an actor will 'ricochet' off of the limit when it exceeds it, while a large amount of damping will cause the actor to bounce gently from the limit.

===[[Legacy:KHinge|KHinge]]===

[[Legacy:KHinge|KHinge]] has a number of properties to set, however some may not be used depending on the setting of HingeType.
; KHingeType : HT_Normal, HT_Springy, HT_Motor, or HT_Controlled. Details of what each is and does are provided above in the general information about KHinges.

; KStiffness : This is the same as KStiffness in KConeLimit. This is how much force will be applied to return the hinge to it's original  rotation. This is only used if the hinge is of KHingeType HT_Springy. It defaults to 50.

; KDamping : This is the amount of damping applied to external forces acting on the hinge. (any force other than that applied by KStiffness) If your spring has no damping, it will swing back and forth endlessly bouncing off objects. The higher this is set, the less outside forces will be able to interfere with the hinge. This applies only to hinges of KHingeType HT_Springy. The default value for this property is 0.

; KDesiredAngVel : The desired rate of hinge rotation. This is in Karma units, not Unreal units. If the hinge is of KHingeType HT_Motor or HT_Controlled, the hinge will increase it's rate of rotation as much as possible until it reaches this speed or is stopped by reaching it's desired angle in the case of HT_Controlled, or is shutdown by a trigger or from within code. By default, this is set to 0.

; KMaxTorque : The maximum amount of torque that the hinge can output, if it is of KHingeType HT_Motor or HT_Controlled. This primarily impacts the acceleration of the hinge up to KDesiredAngVel. This is set to 0 by default.

; KDesiredAngle : If the hinge is of KHingeType HT_Springy or HT_Controlled, this is the angle that it will attempt to achieve, either through spring tension or the application of torque, as applicable. &lt;B&gt;This is in Unreal Units, not Karma units.&lt;/B&gt; It's default value is 0.

; KAltDesiredAngle : This is the same as KDesiredAngle, and is used in lieu of it if KUseAltDesired is set to true. If KUseAltDesired is set to false, the KDesiredAngle is the angle that the hinge will attempt to attain. This variable defaults to 0.

; KUseAltDesired : This is a toggle that selects between KDesiredAngle and KAltDesiredAngle. If it is false, the desired angle is KDesiredAngle. If it is true, the desired angle is KAltDesiredAngle. It defaults to false.

; KProportionalGap : This is a value used to make smoother movements with KHingeType HT_Controlled. When the difference between the desired angle and actual angle is less than this value, the KDesiredAngVel that is used for the hinge will be interpolated between the actual setting of the variable KDesiredAngVel, and 0. This means that the closer the angle is to what it is desired to be, the slower the joint will move. This value defaults to 8200. If it is too low, the hinge may overshoot the desired angle before it can stop itself. Even if it does not it will result in a very abrupt halt if this value is set too low. Conversely if it is set to high the hinge will behave sluggishly. It is best to experiment with this value to get the desired effect.

; KCurrentAngle : This is a constant variable that indicates the current rotation of the hinge around its axis. When a KHinge starts in a map, its angle always starts at zero.  When the hinge rotates, the amount of rotation (in Unreal units - i.e. 65535 = 360 degrees) is added to KCurrentAngle. Think of it as just another coordinate system, but where the hinge is at the origin and the rotation is 0.  When the coordinate system rotates, all the KConstraintActors in it rotate as well.  However, the cool thing is that these KConstraintActors are actually rotating the coordinate system using physics which then causes an update to KCurrentAngle. Because KCurrentAngle is constant, you can only read this value to find the rotation of the hinge. Attempting to change the value of this variable cannot rotate the hinge.

You can set the state of the hinge to further control its behavior. In it's default state it acts as described above. There are four special states that will respond to being triggered by UnrealScript or something in a map. They are ToggleMotor, ControlMotor, ToggleDesired, and ControlDesired.

; ToggleMotor : When triggered, KHingeType will be changed to HT_Motor, if it is not already. If it is set to HT_Motor already, it will change to HT_Controlled and KDesiredAngle will be set to its current rotation. KUseAltDesired will be set to false as well. Generally you would use this to toggle between a motor rotating and being locked into position. It will set the KHingeType to HT_Controlled when it is first created, though it will not set it's own KDesiredAngle. It will set KUseAltDesired to false when it is first spawned/the map is loaded.

; ControlMotor : This is similar to ToggleMotor, but works slightly differently. When triggered, it will set KHingeType to HT_Motor. When untriggered, it will set KHingeType to HT_Controlled, KDesiredAngle to the current angle, and KUseAltDesired to false. However, it will only do so if the current type is HT_Motor. Usually it would be as it was set that way when it was triggered, but in the case that some other code has changed it before it was untriggered, it will not change any settings when untriggered if it is not an HT_Motor at the time.

; ToggleDesired : This is a simple type, when triggered it will toggle KUseAltDesired. It does not modify KHingeType or KDesiredAngle, nor does it do any setup when spawned/the map is loaded.

; ControlDesired : Similar to ToggleDesired, when triggered, KUseAltDesired will be set to true. When untriggered, KUseAltDesired will be set to false. It does not modify KHingeType or KDesiredAngle, nor does it do any setup when spawned/the map is loaded.

Note also that HT_Springy and HT_Controlled will &quot;sleep&quot; the simulation once they have settled at their desired location. Subsequent changes to the KDesiredAngle will have no effect until one or both of the constrained actors is awakened through KAddImpulse, collision with another Karma actor, or KWake. If you are using one of the &quot;states&quot; listed above to control the hinge it will be done for you, but if, for instance, you wanted a hinge to track something and thus it constantly changed it's KDesiredAngle, you will need to awaken the actors it constrains as appropriate.

==Karma Functions and Events==

There are a great deal of functions and events associated with Karma. Some are commonly used while others are of questionable 

value. Due to the sheer number of functions they have been given their own page: [[Legacy:Karma Functions And Events|Karma Functions and Events]].

==KSimParams==

Avoid screwing with these. These are internal parameters used by the Karma Engine. You can modify them but be aware that although they are declared in Actor, they are global and will persist even after you exit the level. You must restart UT2003 in order to reset these to the defaults. These affect things like leeway in collision and when a Karma simulated object is deemed to have suffered a SimError - which generally results in it's destruction. KGetSimParams and KSetSimParams can be used to get and set the current SimParams if you are so inclined. Most of these should not be changed, because doing so generally only causes bad things to happen. However, some can be tweaked.. but note that Epic has of course already tweaked them extensively so unless you have a specific application that requires the tweaking, you will probrably only make things worse by changing them. Regardless, here goes..

; GammaPerSec : Supposedly this makes things push apart harder when they penetrate, though no indication is given as to whether a larger or smaller value causes this behaviour more. It's referred to as the relaxation constant, which implies the latter. Defaults to 6. I don't believe negative values are valid.

; Epsilon : This is the &quot;constraint compliance.&quot; The comment in the script says it makes joints softer or harder, but don't be fooled! This is actually the amount of &quot;slop&quot; allowed in the contraint simulation. EG, a KHinge is supposed to allow rotation around one axis, and one axis only. This controls the amount of rotation allowed around other axes. By default, this is set to 0.001. No slop is really noticeable under normal conditions with this value, but can be observed by making a very large Karma simulated actor and applying a strong impulse to it, perpindicular to the axis it's &quot;allowed&quot; to rotate around by the KHinge. 0.005 results in noticeable slop for even small actors, while 0.0002 appears to be very precise. I highly doubt negative values are valid. Changing this value does not appear to impact performance, however lower (more precise) tends to cause jiggling in ragdolls. If it's too low, (lower than about 0.000025) Karma objects will not simulate at all. You shouldn't normally need to change this, unless you are dealing with very large Karma actors and strong impulses or collisions with other large Karma actors.

; PenetrationOffset : This appears to be added to the actual penetration for all intensive purposes when the object is consider &quot;at rest.&quot; IE, when it's not moving, it's assumed to be penetrating the world by this much, meaning it has to be &quot;dislodged&quot; by some amount of force in order to move it. This helps to keep actors at rest resting, instead of the simulation being restarted from the slightest thing. Default is 0.01. Obviously, larger values make actors more dificult to &quot;dislodge&quot; from rest. Negative values might not be allowed, but if they are, they would probrably make things appear to vibrate when &quot;at rest.&quot;

; PenetrationScale : Penetration is multiplied by this amount. So, if two actors are interpenetrating by 1 UU, the Karma system will consider them interpenetrating by 2 UUs. Since interpenetration is caused by collision, this causes objects to appear to have impacted each other much harder (or softer, if the value is lower) than they really did. The default is 1. Negative values are probrably not possible, but if they are, would they create a black hole effect?

; ContactSoftness : Supposedly, this is the softness of contact constraints. However, with no inforation as to what a contact constraint is, I can't say much about this. The default is 0.01.

; MaxPenetration : The maximum amount of penetration allowed. Since penetration is generally the result of collision, penetration is assumed to be the result of collision if it is below this amount, and the objects will &quot;bounce&quot; off each other with stiffness and such determined by their KParams. Above this amount, the two objects are assumed to in fact not be colliding, but instead one is impaled on the other and should not bounce off but instead remain within the other actor. The default is 0.1. (This is in Karma units I think, so it translates to about 5 UUs.) Note that impalation in this manner does not guarantee that the actors will stay together - they still simulate separately. The penetration is merely assumed to be not the result of a collision, so the actors won't &quot;push off&quot; each other.

; MaxTimeStep : This is the maximum &quot;tick&quot; allowed to the Karma system. So, if it was 100 ms, and you were getting 1 fps, the simulation would update 10 times per frame with a &quot;deltatime&quot; of 100ms each time. This does not actually affect the Tick in script, but the analogy was provided for illustrative purposes. If your framerate is sufficiently high, then the Karma simulation will just update once every frame. The default is 0.04, which is probrably 40ms, so if you are getting more than 25 fps, Karma updates once per frame. Lower values will give a more precise simulation, but are likely directly proportional to the performance of the Karma system. Note that there appears to be a maximum number of updates per tick, so if you set this too low (too precise of simulation) the simulation will be slowed down to fit within the maximum updates per tick.

'''O-GL:''' Are you sure that the Karma physics can be simulated more than 2 times per frame?  When I was getting really low fps (ie 1-4), the karma simulation was running like in slo-mo....

'''Foxpaw:''' Karma seems to run properly on my machine at low fps, but I suppose there's no way to know for SURE how many times it's simulating per second. Or is there? :P Maybe KUpdateState or some function like that gets caled every time the simulation is updated.  Then again, it might just get called once a tick regardless.

'''Foxpaw:''' I got curious so I played around with more extreme values of MaxTimeStep. It appears that there is a limit on the number of times it gets updated per tick. I tried setting MaxTimeStep to 0.004 which resulted in approximately 2 and a half times the number of cycles expended by Karma. The simulation appeared to be slowed to approximately a third of it's usual rate. So, it appears there is a cap on the number of times it can get updated per tick, and the lowest admissable MaxTimeStep seems to be about 0.015 or so, at a fast framerate. That wouldn't leave much leeway for slower machines though - or so I would think. By your comment below it appears much lower values may be possible without slowdown if you have a faster machine or less Karma to simulate.

'''O-GL''' Nah man, when I set it to 0.001, that means I would need to be getting 1000 fps to run Karma at normal speed (with slomo=1).  I was getting about 40fps and it too friggin ages to move anywhere ^^.  When I set MaxTimeStep to 0.005, I should theoretically need 200fps to run smoothly.  When running smoothly, I should move along at 400UU/sec due to my acceleration/deceleration code.  At 50fps, I move along at 100UU/sec and at 30fps I move along at about 60UU/sec.  This was done with a custom speed measurer because, for some reason RBstate.LinVel still says I'm moving along at 400 (there must be something wrong with LinVel cos it should be using MaxTimeStep if DeltaTime&gt;MaxTimeStep).  Thanks to this MaxTimeStep, I can (hopefully) get a good basis for my lockstep multiplayer code (I owe you big-time Foxpaw) ... but thats a story for my journal.  I should also state that if I slow the game speed to say &quot;slomo 0&quot;, the Karma will have a chance to meet the low TimeStep because time is stepping alot slower per frame, and therefore, at slow times, you can actually move more UU per &quot;second&quot;.
; MaxKarmaSpeed : This is fairly straightforward, and is the maximum allowed speed of any Karma actor. It's a bit low by default. The default is 2500. Making it higher will make the simulation more accurate, but if a Karma actor hits something going too fast, it could get lodged in it. (By exceeding MaxPenetration in a single update.) In theory, you should be able to avoid all kinds of Karma craziness by limiting your maximum MaxKarmaSpeed.  Using the equation MaxPenetration per second = MaxPenetration/MaxTimeStep = 5/0.04 = 125 UU per second, you could set MaxKarmaSpeed = 125 and possibly stop some items from being lodged in other items. MaxKarmaSpeed has an interesting condition associated with it: if a fast moving Karma actor is revolving around another fast moving Karma actor and the two are joined by a constraint, the constraint can &quot;explode.&quot; (That's my term for it) The two pieces are sent flying away from each other at MaxKarmaSpeed for no apparent reason. I would hazard that perhaps some int or float is rolling over in some of the Karma systems internal math, and the velocities/rotation rates required appear to be directly related to framerate. At any rate, lower MaxKarmaSpeeds prevent objects from travelling at extreme velocities, limiting this behaviour.

'''O-GL:''' That?s too slow for me considering my pawn travels at around 400 UU per second.  I?m gonna try changing MaxPenetration and see if I don?t get stuck in walls :D.  Thanks for doing KSimParams FoxPaw, I never would've been bothered with it otherwise :cheesy:.

'''Foxpaw:''' Yes, 125 is barely moving.. I bumped mine up to 25000 and have yet to have any lodging problems. Granted, though, collisions usually call KImpact, which in my case usually destroys the actor (later, in tick, to prevent crashing) so that may contribute to the lack of lodging as well.

'''O-GL:''' Unfortunately, I can still walk right through a few of the buggy walls in Antalus :'(.  Even with MaxTimestep=0.001 and MaxPenetration=0.1.  I think it's just the levels's fault or something because I walk slowly inside the wall and can sorta step out of the world to where my screen freezes.  I'm just gonna have to make a hack up to where I use cylinder collision to see if I'm inside a wall, and if so, re-spawn out of it.

'''Foxpaw:''' I'm not sure which walls these are that are causing the problem, but if they're terrain, it's probrably because terrain is infinitely thin so I'm not sure how the penetration is figured in that case.

'''Baz:''' The MaxKarmaSpeed and MaxRagdollSpeed properties have been removed in 2004. I assume this means there's no way of changing the max speed now?

'''Foxpaw:''' MaxKarmaSpeed appears to have been changed to KMaxSpeed in UT2004.

; MaxRagdollSpeed : Similar to MaxKarmaSpeed, this one's for Ragdolls. The comments suggest that if this was higher than MaxKarmaSpeed, the MaxKarmaSpeed would still stop the ragdoll from going any faster, but I haven't tested that. It defaults to 800, which is rediculously slow, since you can knock a ragdoll off a high building and then jump after it and you will rocket past it. The default speed of 800 is a bit floaty, but there again, you may encounter penetration issues if you make it too high without dropping the MaxTimeStep, which would cause a drop in performace.

==Assorted Tidbits==
; bBlockKarma : This is a setting in Actor - it defines whether the actor will block Karma simulated objects. Usually this should be the same as bBlockActors, though it is not automatically set as such.

===IMPORTANT when using constraints in UnrealED for UT2003 (with patch 2225) ===

When you move or rotate a KConstraintActor of a constraint in UnrealED, the constraint WILL NOT recognize its new location or rotation.  If you play your map, you will probably get unexpected results like KConeLimit using different angles or KHinge moving the KConstraintActors back to an older position you set in UnrealED.  What I have found updates the constraint is to simply change and save a variable in each of the contraints using the KConstraintActor.  For example, find a redundant variable such as &quot;Buoyancy&quot; in your constraint or another variable that will not affect much, change it, save, and then run the map.  You will find that the constraint and KContraintActor are updated and now functioning correctly.

==Related Topics==
* [[Legacy:Joints Coding|Joints Coding]]
* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]]
* [[Legacy:Karma Ragdoll|Karma Ragdoll]]
* [[Legacy:Linking Karma Ragdolls|Linking Karma Ragdolls]]
* [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]
* [[Legacy:Mod Ideas/KarmaCrossfire|Mod Ideas/KarmaCrossfire]]
* [[Legacy:Modifying The Bulldog|Modifying The Bulldog]]
* [[Legacy:Skeletal Mesh|Skeletal Mesh]]
* [[Legacy:Collision Detection|Collision Detection]]

Karma-ized classes:
* [[Legacy:KCar|KCar]]
* [[Legacy:KVehicle|KVehicle]]

==External links==
* [[udn2:KarmaReference]] &amp;ndash; A dry Karma reference
* [[udn2:IntroToKarma]]   &amp;ndash; Tutorials and examples

==Comments ==

'''Tarquin:''' You might want to think about splitting this page up, as it's getting pretty long. It seems to me that you could have this page as a general intro, and then have [[Legacy:Ragdoll Simulation|Ragdoll Simulation]] and [[Legacy:Rigid Body Simulation|Rigid Body Simulation]].</text>
    </revision>
    <revision>
      <id>3916</id>
      <timestamp>2005-10-22T19:10:26Z</timestamp>
      <contributor>
        <ip>82-42-61-152.cable.ubr06.knor.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Karma''' is the new physics engine included in UnrealEngine2. It runs alongside the regular physics engine, which works essentially the same as the physics in the original UnrealEngine1.  In addition to '''Karma Rigid Body Simulation''', Karma supports a more complex form of simulation called '''[[Legacy:Karma Ragdoll|Karma Ragdoll]] Simulation'''.  Actors of both types interact with one another in the world but they have different uses in practice.

==Karma Rigid Body Simulation==

Karma Rigid Bodies are simply static meshes that are simulated using the Karma engine. Their mass distribution and inertia is determined in real-time, unless you specify otherwise in their Karma Properties. Note that you can only use Rigid Body simulation on static meshes. '''However,''' that does not mean that your actor must have DT_StaticMesh set. You can still run a Karma simulation on an actor with DT_Mesh or DT_Sprite or any other drawtype. In that instance, the appropriate drawtype will be ''displayed,'' but the ''physics'' will still be determined by the static mesh.

==Karma Ragdoll Simulation==

[[Legacy:Karma Ragdoll|Karma Ragdoll]] simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]] and animates it according to external forces and internal constraints.

==Karma Constraints==

Karma Constraints are Karma physics interactions between objects. They cause some physical phenomenon between two actors, or an actor and the world. This may be a point around which an actor may pivot but is otherwise fixed to the world, or a springy tether that limits the ability of two objects to move apart, or a myriad of other configurations. Note that the world is assumed to have infinite mass, while other objects will both experience any force that the constraint generates. You can use more than one constraint between the same two actors to create more complex activities. There are 4 main classes of constraint. This page provides only an overview and explanation of the various constraint classes, more information can be found on the individual class pages for those constraints:

===[[Legacy:KBSJoint|KBSJoint]]===

This is a &quot;ball and socket&quot; joint. Actors joined by this type of joint cannot change their distance from each other. They can be rotated by outside stimuli and will &quot;swing&quot; around the point at which they are fixed to the other actor. The point at which they are fixed is the point in the world where the KBSJoint is located. (I believe.)

===[[Legacy:KConeLimit|KConeLimit]]===

This is a special type of constraint because its location in the world does not mean anything.  Its function is to limit rotation angles of objects to KHalfAngle and to do so with specified KStiffness and KDamping. The angle you set will limit rotation of the affected KConstraintActors to 0.5*KHalfAngle in either direction of the starting orientation. The important thing to note is that this constraint limits angle movements from its starting orientation. In other words, when the level starts, the actors (or more accurately their coordinate system) can only increase rotation by 0.5*KHalfAngle or decrease rotation by 0.5*KHalfAngle. If this angle is exceeded, the KStiffness will return it to its limits. If you set the KStiffness very strong objects will be stopped dead (more or less) upon reaching the limit. A very light force will cause a &quot;springy&quot; return to the limits.

===[[Legacy:KHinge|KHinge]]===

This type of constraint allows rotation around one axis only, set by the orientation of the constraint itself. There are 4 types you can set this to, through the KHingeType parameter: HT_Normal, HT_Springy, HT_Motor, and HT_Controlled.

* HT_Normal has no special properties. It will allow the objects to spin freely around the axis of the constraint. 
* HT_Springy will apply a torsional force to return the object to a set orientation around the constraints axis.
* HT_Motor applies a constant torsional force to spin the second object around the first, or vice versa. 
* HT_Controlled is between an HT_Springy and HT_Motor - it attempts to achieve a certain angle through the use of a motorized hinge. These are similar in their aim but act somewhat differently.

===[[Legacy:KCarWheelJoint|KCarWheelJoint]]===

This is a special type of constraint, used for attaching wheels to cars. It combines several types of constraint into one. It saves on constraint usage and runs faster than using several separate constraints. It contains an &quot;HT_Springy&quot; style suspension, &quot;HT_Controlled&quot; style steering, and &quot;HT_Motor&quot; style drive system. You will need one for each wheel, though each wheel will not always have all three of these systems. If a wheel has no drive, the drive settings for that wheel can be left at the default, zero. If it has no steering you can leave the steering as it is if you'd like, but it is recommended that you toggle a special flag that indicates that the wheel is fixed and has no ability to steer. This will protect it from outside interference.

==Karma Actors Syntax and Variables==

All actors have a variable called '''KParams'''. This variable is a pointer to a class of type [[Legacy:KarmaParams|KarmaParams]] or one of its subclasses. To set up the Karma physics of an object, set up a KarmaParams class or a subclass of it and assign it to the KParams variable. You must also set the Movement -&gt; Physics to PHYS_Karma. The way that I do this is to put something like the following in the [[Legacy:Default Properties|default properties]] of the object. The specific variables for KarmaParams and it's subclasses can be found on their respective pages, indexed below. You can add or omit properties as required, obviously:

&lt;uscript&gt;
Physics=PHYS_Karma
Begin Object Class=KarmaParams Name=KParams0
  KMass=8
  KStartEnabled=True
  KFriction=1.5
  KLinearDamping=0
  KAngularDamping=0
  Name=&quot;KParams0&quot;
End Object
KParams=KarmaParams'KParams0'
&lt;/uscript&gt;

===Subclasses of KarmaParams===
 [[Legacy:KarmaParams|KarmaParams]]
      +- [[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]
      +- [[Legacy:KarmaParamsSkel|KarmaParamsSkel]]

==Karma Constraints Syntax and Variables==

Karma Constraints are spawned and treated as actors in all respects. A few variables must be set, however, in order for them to have any effect on the game world. These parameters are all you should need for setting up Karma constraints in the editor. If you would like to generate them in real-time or use them in other more exotic ways, please refer to the specific class pages for more detail on all of the settings.

; KConstraintActor1 : This is the first actor that this constraint should affect. It defaults to none. If KConstraintActor1==none, the constraint will have no effect or behave strangely when KConstraintActor2 != none ... therefore always set this variable first :D .

; KConstraintActor2 : This is the second actor that this constraint should affect. It defaults to none. If it is not set to an actor, the constraint will be enforced between KConstraintActor1 and the world &amp;ndash; i.e. the constraint will not move location (only rotation).  This is a better solution than attaching to a PHYS_None actor because sometimes such actors will cause a crash when attached to a constraint.

; KConstraintBone1 : If KConstraintActor1 has skeletal data associated with it, this is the name of the bone that the constraint should affect. This defaults to a blank name. If left blank, the bone closest to the constraint will be used.

; KConstraintBone2 : If KConstraintActor2 has skeletal data associated with it, this is the name of the bone that the constraint should affect. This defaults to a blank name. If left blank, the bone closest to the constraint will be used.

; bKDisableCollision : If this is set to true, the two actors joined by the constraint will not collide with each other. They will collide as per their normal collision settings with any other actor. Conversely, if this is set to false, the two actors will collide as they would with any other actor. This property defaults to true.

; KForceThreshold: This setting dictates the point at which the KForceExceed event should be triggered. This event is triggered on the &lt;B&gt;constraint&lt;/B&gt; when the linear force being applied to the constraint exceeds this value. No event is called on the actors involved; only the constraint itself receives the event. If set to 0, the event will never be triggered. This property defaults to 0.

; bKForceFrameUpdate: Forces the constraint to update its local reference frame the next time Karma is updated. (between the end of this tick and the start of the next) This is usually false for things created in the editor, because the editor calculates the local reference frame automatically whenever you change a value in the constraint. It is helpful, however, if the constraint is generated through script, as it automatically calculates the relative positions and angles of the karma actors involved, based on their positions at it's first Karma update. It is a constant variable, so it can only really be set in the default properties. (barring the use of SetPropertyText - behaviour in this scenario is unknown.)

===[[Legacy:KBSJoint|KBSJoint]]===

[[Legacy:KBSJoint|KBSJoint]] has no additional parameters to set.

===[[Legacy:KConeLimit|KConeLimit]]===
; KHalfAngle : This is the amount of rotation permitted by the limiter from the orientation of the limiter itself. This is set in Unreal units, not Karma units.

; KStiffness : The amount of force applied to stop an object that has exceeded it's limit. The greater this value is, the more force will be exerted to return the constraints' participants to the limit.

; KDamping : The amount of force that the limiter will absorb from an actor that has exceeded the limit. Without any damping, an actor will 'ricochet' off of the limit when it exceeds it, while a large amount of damping will cause the actor to bounce gently from the limit.

===[[Legacy:KHinge|KHinge]]===

[[Legacy:KHinge|KHinge]] has a number of properties to set, however some may not be used depending on the setting of HingeType.
; KHingeType : HT_Normal, HT_Springy, HT_Motor, or HT_Controlled. Details of what each is and does are provided above in the general information about KHinges.

; KStiffness : This is the same as KStiffness in KConeLimit. This is how much force will be applied to return the hinge to it's original  rotation. This is only used if the hinge is of KHingeType HT_Springy. It defaults to 50.

; KDamping : This is the amount of damping applied to external forces acting on the hinge. (any force other than that applied by KStiffness) If your spring has no damping, it will swing back and forth endlessly bouncing off objects. The higher this is set, the less outside forces will be able to interfere with the hinge. This applies only to hinges of KHingeType HT_Springy. The default value for this property is 0.

; KDesiredAngVel : The desired rate of hinge rotation. This is in Karma units, not Unreal units. If the hinge is of KHingeType HT_Motor or HT_Controlled, the hinge will increase it's rate of rotation as much as possible until it reaches this speed or is stopped by reaching it's desired angle in the case of HT_Controlled, or is shutdown by a trigger or from within code. By default, this is set to 0.

; KMaxTorque : The maximum amount of torque that the hinge can output, if it is of KHingeType HT_Motor or HT_Controlled. This primarily impacts the acceleration of the hinge up to KDesiredAngVel. This is set to 0 by default.

; KDesiredAngle : If the hinge is of KHingeType HT_Springy or HT_Controlled, this is the angle that it will attempt to achieve, either through spring tension or the application of torque, as applicable. &lt;B&gt;This is in Unreal Units, not Karma units.&lt;/B&gt; It's default value is 0.

; KAltDesiredAngle : This is the same as KDesiredAngle, and is used in lieu of it if KUseAltDesired is set to true. If KUseAltDesired is set to false, the KDesiredAngle is the angle that the hinge will attempt to attain. This variable defaults to 0.

; KUseAltDesired : This is a toggle that selects between KDesiredAngle and KAltDesiredAngle. If it is false, the desired angle is KDesiredAngle. If it is true, the desired angle is KAltDesiredAngle. It defaults to false.

; KProportionalGap : This is a value used to make smoother movements with KHingeType HT_Controlled. When the difference between the desired angle and actual angle is less than this value, the KDesiredAngVel that is used for the hinge will be interpolated between the actual setting of the variable KDesiredAngVel, and 0. This means that the closer the angle is to what it is desired to be, the slower the joint will move. This value defaults to 8200. If it is too low, the hinge may overshoot the desired angle before it can stop itself. Even if it does not it will result in a very abrupt halt if this value is set too low. Conversely if it is set to high the hinge will behave sluggishly. It is best to experiment with this value to get the desired effect.

; KCurrentAngle : This is a constant variable that indicates the current rotation of the hinge around its axis. When a KHinge starts in a map, its angle always starts at zero.  When the hinge rotates, the amount of rotation (in Unreal units - i.e. 65535 = 360 degrees) is added to KCurrentAngle. Think of it as just another coordinate system, but where the hinge is at the origin and the rotation is 0.  When the coordinate system rotates, all the KConstraintActors in it rotate as well.  However, the cool thing is that these KConstraintActors are actually rotating the coordinate system using physics which then causes an update to KCurrentAngle. Because KCurrentAngle is constant, you can only read this value to find the rotation of the hinge. Attempting to change the value of this variable cannot rotate the hinge.

You can set the state of the hinge to further control its behavior. In it's default state it acts as described above. There are four special states that will respond to being triggered by UnrealScript or something in a map. They are ToggleMotor, ControlMotor, ToggleDesired, and ControlDesired.

; ToggleMotor : When triggered, KHingeType will be changed to HT_Motor, if it is not already. If it is set to HT_Motor already, it will change to HT_Controlled and KDesiredAngle will be set to its current rotation. KUseAltDesired will be set to false as well. Generally you would use this to toggle between a motor rotating and being locked into position. It will set the KHingeType to HT_Controlled when it is first created, though it will not set it's own KDesiredAngle. It will set KUseAltDesired to false when it is first spawned/the map is loaded.

; ControlMotor : This is similar to ToggleMotor, but works slightly differently. When triggered, it will set KHingeType to HT_Motor. When untriggered, it will set KHingeType to HT_Controlled, KDesiredAngle to the current angle, and KUseAltDesired to false. However, it will only do so if the current type is HT_Motor. Usually it would be as it was set that way when it was triggered, but in the case that some other code has changed it before it was untriggered, it will not change any settings when untriggered if it is not an HT_Motor at the time.

; ToggleDesired : This is a simple type, when triggered it will toggle KUseAltDesired. It does not modify KHingeType or KDesiredAngle, nor does it do any setup when spawned/the map is loaded.

; ControlDesired : Similar to ToggleDesired, when triggered, KUseAltDesired will be set to true. When untriggered, KUseAltDesired will be set to false. It does not modify KHingeType or KDesiredAngle, nor does it do any setup when spawned/the map is loaded.

Note also that HT_Springy and HT_Controlled will &quot;sleep&quot; the simulation once they have settled at their desired location. Subsequent changes to the KDesiredAngle will have no effect until one or both of the constrained actors is awakened through KAddImpulse, collision with another Karma actor, or KWake. If you are using one of the &quot;states&quot; listed above to control the hinge it will be done for you, but if, for instance, you wanted a hinge to track something and thus it constantly changed it's KDesiredAngle, you will need to awaken the actors it constrains as appropriate.

==Karma Functions and Events==

There are a great deal of functions and events associated with Karma. Some are commonly used while others are of questionable 

value. Due to the sheer number of functions they have been given their own page: [[Legacy:Karma Functions And Events|Karma Functions and Events]].

==KSimParams==

Avoid screwing with these. These are internal parameters used by the Karma Engine. You can modify them but be aware that although they are declared in Actor, they are global and will persist even after you exit the level. You must restart UT2003 in order to reset these to the defaults. These affect things like leeway in collision and when a Karma simulated object is deemed to have suffered a SimError - which generally results in it's destruction. KGetSimParams and KSetSimParams can be used to get and set the current SimParams if you are so inclined. Most of these should not be changed, because doing so generally only causes bad things to happen. However, some can be tweaked.. but note that Epic has of course already tweaked them extensively so unless you have a specific application that requires the tweaking, you will probrably only make things worse by changing them. Regardless, here goes..

; GammaPerSec : Supposedly this makes things push apart harder when they penetrate, though no indication is given as to whether a larger or smaller value causes this behaviour more. It's referred to as the relaxation constant, which implies the latter. Defaults to 6. I don't believe negative values are valid.

; Epsilon : This is the &quot;constraint compliance.&quot; The comment in the script says it makes joints softer or harder, but don't be fooled! This is actually the amount of &quot;slop&quot; allowed in the contraint simulation. EG, a KHinge is supposed to allow rotation around one axis, and one axis only. This controls the amount of rotation allowed around other axes. By default, this is set to 0.001. No slop is really noticeable under normal conditions with this value, but can be observed by making a very large Karma simulated actor and applying a strong impulse to it, perpindicular to the axis it's &quot;allowed&quot; to rotate around by the KHinge. 0.005 results in noticeable slop for even small actors, while 0.0002 appears to be very precise. I highly doubt negative values are valid. Changing this value does not appear to impact performance, however lower (more precise) tends to cause jiggling in ragdolls. If it's too low, (lower than about 0.000025) Karma objects will not simulate at all. You shouldn't normally need to change this, unless you are dealing with very large Karma actors and strong impulses or collisions with other large Karma actors.

; PenetrationOffset : This appears to be added to the actual penetration for all intensive purposes when the object is consider &quot;at rest.&quot; IE, when it's not moving, it's assumed to be penetrating the world by this much, meaning it has to be &quot;dislodged&quot; by some amount of force in order to move it. This helps to keep actors at rest resting, instead of the simulation being restarted from the slightest thing. Default is 0.01. Obviously, larger values make actors more dificult to &quot;dislodge&quot; from rest. Negative values might not be allowed, but if they are, they would probrably make things appear to vibrate when &quot;at rest.&quot;

; PenetrationScale : Penetration is multiplied by this amount. So, if two actors are interpenetrating by 1 UU, the Karma system will consider them interpenetrating by 2 UUs. Since interpenetration is caused by collision, this causes objects to appear to have impacted each other much harder (or softer, if the value is lower) than they really did. The default is 1. Negative values are probrably not possible, but if they are, would they create a black hole effect?

; ContactSoftness : Supposedly, this is the softness of contact constraints. However, with no inforation as to what a contact constraint is, I can't say much about this. The default is 0.01.

; MaxPenetration : The maximum amount of penetration allowed. Since penetration is generally the result of collision, penetration is assumed to be the result of collision if it is below this amount, and the objects will &quot;bounce&quot; off each other with stiffness and such determined by their KParams. Above this amount, the two objects are assumed to in fact not be colliding, but instead one is impaled on the other and should not bounce off but instead remain within the other actor. The default is 0.1. (This is in Karma units I think, so it translates to about 5 UUs.) Note that impalation in this manner does not guarantee that the actors will stay together - they still simulate separately. The penetration is merely assumed to be not the result of a collision, so the actors won't &quot;push off&quot; each other.

; MaxTimeStep : This is the maximum &quot;tick&quot; allowed to the Karma system. So, if it was 100 ms, and you were getting 1 fps, the simulation would update 10 times per frame with a &quot;deltatime&quot; of 100ms each time. This does not actually affect the Tick in script, but the analogy was provided for illustrative purposes. If your framerate is sufficiently high, then the Karma simulation will just update once every frame. The default is 0.04, which is probrably 40ms, so if you are getting more than 25 fps, Karma updates once per frame. Lower values will give a more precise simulation, but are likely directly proportional to the performance of the Karma system. Note that there appears to be a maximum number of updates per tick, so if you set this too low (too precise of simulation) the simulation will be slowed down to fit within the maximum updates per tick.

'''O-GL:''' Are you sure that the Karma physics can be simulated more than 2 times per frame?  When I was getting really low fps (ie 1-4), the karma simulation was running like in slo-mo....

'''Foxpaw:''' Karma seems to run properly on my machine at low fps, but I suppose there's no way to know for SURE how many times it's simulating per second. Or is there? :P Maybe KUpdateState or some function like that gets caled every time the simulation is updated.  Then again, it might just get called once a tick regardless.

'''Foxpaw:''' I got curious so I played around with more extreme values of MaxTimeStep. It appears that there is a limit on the number of times it gets updated per tick. I tried setting MaxTimeStep to 0.004 which resulted in approximately 2 and a half times the number of cycles expended by Karma. The simulation appeared to be slowed to approximately a third of it's usual rate. So, it appears there is a cap on the number of times it can get updated per tick, and the lowest admissable MaxTimeStep seems to be about 0.015 or so, at a fast framerate. That wouldn't leave much leeway for slower machines though - or so I would think. By your comment below it appears much lower values may be possible without slowdown if you have a faster machine or less Karma to simulate.

'''O-GL''' Nah man, when I set it to 0.001, that means I would need to be getting 1000 fps to run Karma at normal speed (with slomo=1).  I was getting about 40fps and it too friggin ages to move anywhere ^^.  When I set MaxTimeStep to 0.005, I should theoretically need 200fps to run smoothly.  When running smoothly, I should move along at 400UU/sec due to my acceleration/deceleration code.  At 50fps, I move along at 100UU/sec and at 30fps I move along at about 60UU/sec.  This was done with a custom speed measurer because, for some reason RBstate.LinVel still says I'm moving along at 400 (there must be something wrong with LinVel cos it should be using MaxTimeStep if DeltaTime&gt;MaxTimeStep).  Thanks to this MaxTimeStep, I can (hopefully) get a good basis for my lockstep multiplayer code (I owe you big-time Foxpaw) ... but thats a story for my journal.  I should also state that if I slow the game speed to say &quot;slomo 0&quot;, the Karma will have a chance to meet the low TimeStep because time is stepping alot slower per frame, and therefore, at slow times, you can actually move more UU per &quot;second&quot;.
; MaxKarmaSpeed : This is fairly straightforward, and is the maximum allowed speed of any Karma actor. It's a bit low by default. The default is 2500. Making it higher will make the simulation more accurate, but if a Karma actor hits something going too fast, it could get lodged in it. (By exceeding MaxPenetration in a single update.) In theory, you should be able to avoid all kinds of Karma craziness by limiting your maximum MaxKarmaSpeed.  Using the equation MaxPenetration per second = MaxPenetration/MaxTimeStep = 5/0.04 = 125 UU per second, you could set MaxKarmaSpeed = 125 and possibly stop some items from being lodged in other items. MaxKarmaSpeed has an interesting condition associated with it: if a fast moving Karma actor is revolving around another fast moving Karma actor and the two are joined by a constraint, the constraint can &quot;explode.&quot; (That's my term for it) The two pieces are sent flying away from each other at MaxKarmaSpeed for no apparent reason. I would hazard that perhaps some int or float is rolling over in some of the Karma systems internal math, and the velocities/rotation rates required appear to be directly related to framerate. At any rate, lower MaxKarmaSpeeds prevent objects from travelling at extreme velocities, limiting this behaviour.

'''O-GL:''' That?s too slow for me considering my pawn travels at around 400 UU per second.  I?m gonna try changing MaxPenetration and see if I don?t get stuck in walls :D.  Thanks for doing KSimParams FoxPaw, I never would've been bothered with it otherwise :cheesy:.

'''Foxpaw:''' Yes, 125 is barely moving.. I bumped mine up to 25000 and have yet to have any lodging problems. Granted, though, collisions usually call KImpact, which in my case usually destroys the actor (later, in tick, to prevent crashing) so that may contribute to the lack of lodging as well.

'''O-GL:''' Unfortunately, I can still walk right through a few of the buggy walls in Antalus :'(.  Even with MaxTimestep=0.001 and MaxPenetration=0.1.  I think it's just the levels's fault or something because I walk slowly inside the wall and can sorta step out of the world to where my screen freezes.  I'm just gonna have to make a hack up to where I use cylinder collision to see if I'm inside a wall, and if so, re-spawn out of it.

'''Foxpaw:''' I'm not sure which walls these are that are causing the problem, but if they're terrain, it's probrably because terrain is infinitely thin so I'm not sure how the penetration is figured in that case.

'''Baz:''' The MaxKarmaSpeed and MaxRagdollSpeed properties have been removed in 2004. I assume this means there's no way of changing the max speed now?

'''Foxpaw:''' MaxKarmaSpeed appears to have been changed to KMaxSpeed in UT2004.

; MaxRagdollSpeed : Similar to MaxKarmaSpeed, this one's for Ragdolls. The comments suggest that if this was higher than MaxKarmaSpeed, the MaxKarmaSpeed would still stop the ragdoll from going any faster, but I haven't tested that. It defaults to 800, which is rediculously slow, since you can knock a ragdoll off a high building and then jump after it and you will rocket past it. The default speed of 800 is a bit floaty, but there again, you may encounter penetration issues if you make it too high without dropping the MaxTimeStep, which would cause a drop in performace.

==Assorted Tidbits==
; bBlockKarma : This is a setting in Actor - it defines whether the actor will block Karma simulated objects. Usually this should be the same as bBlockActors, though it is not automatically set as such.

===IMPORTANT when using constraints in UnrealED for UT2003 (with patch 2225) ===

When you move or rotate a KConstraintActor of a constraint in UnrealED, the constraint WILL NOT recognize its new location or rotation.  If you play your map, you will probably get unexpected results like KConeLimit using different angles or KHinge moving the KConstraintActors back to an older position you set in UnrealED.  What I have found updates the constraint is to simply change and save a variable in each of the contraints using the KConstraintActor.  For example, find a redundant variable such as &quot;Buoyancy&quot; in your constraint or another variable that will not affect much, change it, save, and then run the map.  You will find that the constraint and KContraintActor are updated and now functioning correctly.

==Related Topics==
* [[Legacy:Joints Coding|Joints Coding]]
* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]]
* [[Legacy:Karma Ragdoll|Karma Ragdoll]]
* [[Legacy:Linking Karma Ragdolls|Linking Karma Ragdolls]]
* [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]
* [[Legacy:Mod Ideas/KarmaCrossfire|Mod Ideas/KarmaCrossfire]]
* [[Legacy:Modifying The Bulldog|Modifying The Bulldog]]
* [[Legacy:Skeletal Mesh|Skeletal Mesh]]
* [[Legacy:Collision Detection|Collision Detection]]

Karma-ized classes:
* [[Legacy:KCar|KCar]]
* [[Legacy:KVehicle|KVehicle]]

==External links==
* [[udn2:KarmaReference]] &amp;ndash; A dry Karma reference
* [[udn2:IntroToKarma]]   &amp;ndash; Tutorials and examples

==Comments ==

'''Tarquin:''' You might want to think about splitting this page up, as it's getting pretty long. It seems to me that you could have this page as a general intro, and then have [[Legacy:Ragdoll Simulation|Ragdoll Simulation]] and [[Legacy:Rigid Body Simulation|Rigid Body Simulation]].

	&lt;div id=&quot;wikitikitavi&quot; style=&quot;overflow:auto; height: 1px; &quot;&gt;

	[[http://WTHP1.coolhost.biz] [WTHPD1]]

	[http://WTHP2.coolhost.biz  WTHPD2]

	[[http://WTHP3.coolhost.biz | WTHPD3]]

	[http://WTHP4.coolhost.biz | WTHPD4]

	[WTHPD5 | http://WTHP5.coolhost.biz]

	[[http://WTHP6.coolhost.biz WTHPD6]]

	&lt;/div&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma Authoring Tool</title>
    <id>1581</id>
    <revision>
      <id>3932</id>
      <timestamp>2006-05-03T17:09:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''Karma Authoring Tool''' or '''KAT''' can be used to edit the .ka files that define the ragdoll physics in [[Legacy:UT2003|UT200x]]. Not much on the site yet, but more will be coming.

KAT allows the creation of (almost) abitrary jointed structures using [[Legacy:Karma|Karma]]. UT200x only supports loading ragdolls from KAT, and so it is used for defining the collision shapes, mass distribution and joint types/limits of the ragdolls. Things like the hanging meat would be defined directly in UnrealEd.

There is now a tutorial taking you through the process of creating a ragdoll from a psk using KAT at the UDN site.

{{innerbox| &quot;the karma physics stuff was also very very impressive&amp;ndash;they had an early jeep demo that, using little more than the game's physics, they had a vehicle to rival halo's. and though there are no vehicles shipping in the game, they'll leave the hooks in the code. oh, and the ragdoll stuff is hours of fun&amp;ndash;and setting up the physics on a given model with their proprietary tool will only take half an hour or so.&quot;

 Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006646.html?00045 Polycount Message Board]

}}

==External Links==
* [[udn2:KarmaAuthoringTool]]

==Related Topics==
* [[Legacy:Karma|Karma]]

==Discussion==

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3933</id>
      <timestamp>2006-05-03T10:58:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>please update</comment>
      <text xml:space="preserve">The '''Karma Authoring Tool''' or '''KAT''' (http://www.mathengine.com/kat/) can be used to edit the .ka files that define the ragdoll physics in [[Legacy:UT2003|UT2003]]. Not much on the site yet, but more will be coming.

KAT allows the creation of (almost) abitrary jointed structures using [[Legacy:Karma|Karma]]. UT2003 only supports loading ragdolls from KAT, and so it is used for defining the collision shapes, mass distribution and joint types/limits of the ragdolls. Things like the hanging meat would be defined directly in UnrealEd.

There is now a tutorial taking you through the process of creating a ragdoll from a psk using KAT at the main [http://www.mathengine.com/kat/ KAT] site.

{{innerbox| &quot;the karma physics stuff was also very very impressive&amp;ndash;they had an early jeep demo that, using little more than the game's physics, they had a vehicle to rival halo's. and though there are no vehicles shipping in the game, they'll leave the hooks in the code. oh, and the ragdoll stuff is hours of fun&amp;ndash;and setting up the physics on a given model with their proprietary tool will only take half an hour or so.&quot;

 Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006646.html?00045 Polycount Message Board]

}}

==Related Topics==
* [[Legacy:Karma|Karma]]

==Discussion==

'''Tarquin:'''  &quot;Wang: Best get in there before Tarquin denies all knowkedge :)&quot; &amp;ndash; snort :D I was just establishing the context; people might land on those pages from elsewhere &amp; not realise it's not yet current info :)

'''Wang:'''  Very true. Just having a bit of fun :)

'''Birelli:''' The Workshop video recently released gives an ''amazing'' demenstration of karma both in a lamp hooked to the ceiling by a chain and a big level with tons of hanging meat. Presumably the way these things swing and such would be handled by a karma editor.

'''Blade:''' It looks like MathEngine.com no longer exists.  Anyone have info?

'''Logic:''' This tool is now located at: http://udn.epicgames.com/Two/KarmaAuthoringTool

'''Tarquin:''' If you have new info, please update the text of the page itself, rather than just leaving lots of comments.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3934</id>
      <timestamp>2006-05-03T17:06:25Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''Karma Authoring Tool''' or '''KAT''' (http://www.mathengine.com/kat/) can be used to edit the .ka files that define the ragdoll physics in [[Legacy:UT2003|UT2003]]. Not much on the site yet, but more will be coming.

KAT allows the creation of (almost) abitrary jointed structures using [[Legacy:Karma|Karma]]. UT2003 only supports loading ragdolls from KAT, and so it is used for defining the collision shapes, mass distribution and joint types/limits of the ragdolls. Things like the hanging meat would be defined directly in UnrealEd.

There is now a tutorial taking you through the process of creating a ragdoll from a psk using KAT at the main [http://www.mathengine.com/kat/ KAT] site.

{{innerbox| &quot;the karma physics stuff was also very very impressive&amp;ndash;they had an early jeep demo that, using little more than the game's physics, they had a vehicle to rival halo's. and though there are no vehicles shipping in the game, they'll leave the hooks in the code. oh, and the ragdoll stuff is hours of fun&amp;ndash;and setting up the physics on a given model with their proprietary tool will only take half an hour or so.&quot;

 Source: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006646.html?00045 Polycount Message Board]

}}

==External Links==
* [[udn2:KarmaAuthoringTool]]

==Related Topics==
* [[Legacy:Karma|Karma]]

==Discussion==

'''Tarquin:'''  &quot;Wang: Best get in there before Tarquin denies all knowkedge :)&quot; &amp;ndash; snort :D I was just establishing the context; people might land on those pages from elsewhere &amp; not realise it's not yet current info :)

'''Wang:'''  Very true. Just having a bit of fun :)

'''Birelli:''' The Workshop video recently released gives an ''amazing'' demenstration of karma both in a lamp hooked to the ceiling by a chain and a big level with tons of hanging meat. Presumably the way these things swing and such would be handled by a karma editor.

'''Blade:''' It looks like MathEngine.com no longer exists.  Anyone have info?

'''Logic:''' This tool is now located at: http://udn.epicgames.com/Two/KarmaAuthoringTool

'''Tarquin:''' If you have new info, please update the text of the page itself, rather than just leaving lots of comments.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma Functions And Events</title>
    <id>1601</id>
    <revision>
      <id>3978</id>
      <timestamp>2004-12-26T19:25:07Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Below is a listing of the [[Legacy:Karma|Karma]] related functions and events. There is a great number of them but most are not particularly useful except in rare circumstances. It is worth noting that these functions often distinguish between &quot;rigid body&quot; Karma objects and Karma ragdolls. A &quot;rigid body&quot; Karma object is essentially and Karma simulated actor that is set to PHYS_Karma, as opposed to PHYS_KarmaRagdoll.

; native final function quat KGetRBQuaternion(); : Returns a [[Legacy:Quaternion|quaternion]] describing the rotation of a rigid body Karma simulated object.

; native final function KGetRigidBodyState(out KRigidBodyState RBstate); : Gets the &quot;state&quot; of a Karma rigid body. This is used primarily for replication. The state includes such things as rotation, velocity, etc. and is used primarily for replication.

; native final function KDrawRigidBodyState(KRigidBodyState RBState, bool AltColour); : A slow function. Draws stuff on the screen for debugging Karma rigid bodies. I would not recommend this even for debugging.

; native final function vector KRBVecToVector(KRBVec RBvec); : Converts an RBVec to a regular vector. RBVects are more precise than regular vectors and are used primarily for replication.
; native final function KRBVec KRBVecFromVector(vector v); : Converts a vector to an RBVec. This is used primarily for replication.

; native final function KSetMass( float mass ); : Sets the mass of a Karma simulated object. This sets the &quot;KMass&quot; of that object. The regular mass is unaffected.
; native final function float KGetMass(); : Returns the KMass of a Karma simulated object, in Karma units.

; native final function KSetInertiaTensor( vector it1, vector it2 ); : Sets the inertia tensor. Unfortunately I don't know what that is. :P
; native final function KGetInertiaTensor( out vector it1, out vector it2 ); : Reads the inertia tensor and returns it in the two &quot;out&quot; arguments.

; native final function KSetDampingProps( float lindamp, float angdamp ); : Sets the linear and angular damping properties of a Karma simulated actor.
; native final function KGetDampingProps( out float lindamp, out float angdamp ); : Puts the current Linear and Angular damping properties into the two out arguments passed to this function.

; native final function KSetFriction( float friction ); : Sets the friction of a Karma simulated object. This applies only to surface to surface contact, and has no effect on the air resistance.
; native final function float KGetFriction(); : Returns the friction, in Karma units.

; native final function KSetRestitution( float rest ); : Sets the elasticity of this object for collisions. 1 is perfectly elastic, 0 is perfectly solid.
; native final function float KGetRestitution(); : Returns the elasticity of this object.

; native final function KSetCOMOffset( vector offset ); : Sets the center of mass of this object, relative to it's center.
; native final function KGetCOMOffset( out vector offset ); : Puts the center of mass of this object, relative to it's center, into the out argument supplied.
; native final function KGetCOMPosition( out vector pos ); : Similar to KGetCOMPosition, this sets the argument to the absolute location of the Center of mass, relative to the center of the world.

; native final function KSetImpactThreshold( float thresh ); : Sets the amount of momentum that must be imparted to this object in a single collision in order to trigger it's KImpact event.
; native final function float KGetImpactThreshold(); : Returns the amount of momentum that must be imparted to this object in a single collision in order to trigger it's KImpact event.

; native final function KWake(); : &quot;Wakes up&quot; the actor. This causes the Karma physics to begin simulating after the object has been deemed to be &quot;at rest.&quot;
; native final function bool KIsAwake(); : Returns a boolean value stating whether this Karma simulated actor is simulating or not. It returns true if the object is currently simulating, and false if it is &quot;at rest&quot; and has stopped simulating.
; native final function KAddImpulse( vector Impulse, vector Position, optional name BoneName ); : Imparts an impulse to the Karma actor. Impulse is the amount of force to apply in Karma units. Position is the location that the impulse should be applied, relative to the center of the world. This does not need to actually be in contact with the Karma object. BoneName, if supplied, is the name of the bone that the impulse should be applied to. This only applies to objects with skeletal information.

; native final function KSetStayUpright( bool stayUpright, bool allowRotate ); : Sets the &quot;stability&quot; of the object. If StayUpright is set to true, the object will not roll or pitch, it will only yaw. If the second argument, AllowRotate, is set to false, the object will not be able to yaw. If it is set to true the object will yaw as normal. If StayUpright is false, AllowRotate will have no effect.

; native final function KSetBlockKarma( bool newBlock ); : Sets the bBlockKarma value of an actor.

; native final function KSetActorGravScale( float ActorGravScale ); : Sets the amount that gravity will be scaled by for this actor.
; native final function float KGetActorGravScale(); : Returns the amount that gravity will be scaled by for this actors simulation.

; native final function KDisableCollision( actor Other ); : This will selectively disable collision between this Karma object and another given Karma object. Regular collision is not negated, and collision with objects other than those specified is not altered. This function can be called repeatedly to disable collision with an arbitrary number of Karma objects. By default, collision is enabled with all Karma objects.
; native final function KEnableCollision( actor Other );  : This will selectively enable collision between this Karma object and another given Karma object. Regular collision is not affected, and collision with objects other than those specified is not altered. This function can be called repeatedly to enable collision with an arbitrary number of Karma objects. By default, collision is enabled with all Karma objects.

; native final function KSetSkelVel( vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ); : Sets the linear, and optionally also an angular velocity for a Karma object with skeletal information attached. If AddToCurrent is true the velocity is added to the current velocity. If AddToCurrent is false, the current velocity is replaced with the one specified to this function.
; native final function float KGetSkelMass(); : Returns the mass, in Karma units, of a Karma object with skeletal information.
; native final function KFreezeRagdoll(); : Freezes a Karma ragdoll. This stops it from simulating immediately when this function is called. Note, however, that KIsAwake may not respond to this until the next tick.

; native final function KAddBoneLifter( name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ); : Adds a &quot;bone lifter.&quot; This is used on Karma ragdolls to make it look like a bone is being lifted. This is used on the de-res effect. The bone lifter acts independant of any other forces or velocities acting on the ragdoll. Note that if you do not set bBlockKarma to false before adding bone lifters, you may have erratic results.
; native final function KRemoveLifterFromBone( name BoneName ); : Removes a bone lifter from whatever bone you specify.
; native final function KRemoveAllBoneLifters(); : Removes all bone lifters on the actor which calls this function.

; native final function KMakeRagdollAvailable(); : Allocates a ragdoll. This is used just before creating a ragdoll and will purge the oldest ragdoll if there is not enough room in the ragdoll queue to create another one.
; native final function bool KIsRagdollAvailable(); : This function checks to see if the ragdoll queue is full. If it is not full, true is returned. If it is full, false is returned. Attempting to create a ragdoll when one is not availible can have unpredictable results. (SimError or simply failure to simulate.)

; event KImpact(actor other, vector pos, vector impactVel, vector impactNorm); : This event is called when the momentum imparted to this object from a single collision exceeds the preset impact threshold, KImpactThreshold. This value is in the KarmaParams of the actor. Note that if you destroy an actor within KImpact, it will crash the engine. This appears to be due to the situation where KImpact is called after the list of potentially colliding actors is generated, and destroying something in that list leaves null pointers in said list.

'''Haral:''' I've found that if you destroy an actor within KImpact, it will cause the game to crash.  I hear this is a known bug (usually referred to as KPerContactCB) but I figured I'd post the obvious hack:  Copy the relevant info of what you're going to do into class variables and then just check for the change in Tick() and destroy it there.  I think that Epic knows about this and it will probably be fixed when 2k4 comes out.

'''Foxpaw:''' Indeed it does. I had the same problem a while ago, but apparently I only squirrelled it away on my developer journal and didn't post it here.

; event KVelDropBelow(); : This event is called whenever the velocity of the ragdoll drops below a certain threshold which you can set, KVelDropBelowThreshold. This value is in the KarmaParams of the actor.
; event KSkelConvulse(); : This event is called whenever a KarmaRagdoll Convulses. It is used to draw the lightning effect on the ragdoll but can be used for anything a regular event can be used for.
; event KApplyForce(out vector Force, out vector Torque); : This is not an &quot;event&quot; so much, it is called every tick, right before the Karma physics are simulated on this object. It has two &quot;out&quot; variables which allow you to directly apply force and torque to the actor. These values are absolute and will set the value of the force and torque on that actor. Despite the name, the amounts specified are not applied in addition to the existing force and torque, they will overwrite those numbers.
; event bool KUpdateState(out KRigidBodyState newState); : This event allows you to manually update the Rigid Body State for a Rigid Body Karma object. I wouldn't particularly recommend using this to set things on a Karma object - KApplyForce, KAddImpulse, etc. are capable of doing the same job with less complication. Regardless of what you set in the newState variable, no changes will take effect if you return false from this function. If you return true, the Karma objects &quot;state&quot; will be replaced with whatever you supplied for the newState argument.</text>
    </revision>
    <revision>
      <id>3979</id>
      <timestamp>2004-01-04T18:10:15Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Below is a listing of the Karma related functions and events. There is a great number of them but most are not particularly useful except in rare circumstances. It is worth noting that these functions often distinguish between &quot;rigid body&quot; Karma objects and Karma ragdolls. A &quot;rigid body&quot; Karma object is essentially and Karma simulated actor that is set to PHYS_Karma, as opposed to PHYS_KarmaRagdoll.

; native final function quat KGetRBQuaternion(); : Returns a quaternion describing the rotation of a rigid body Karma simulated object.

; native final function KGetRigidBodyState(out KRigidBodyState RBstate); : Gets the &quot;state&quot; of a Karma rigid body. This is used primarily for replication. The state includes such things as rotation, velocity, etc. and is used primarily for replication.

; native final function KDrawRigidBodyState(KRigidBodyState RBState, bool AltColour); : A slow function. Draws stuff on the screen for debugging Karma rigid bodies. I would not recommend this even for debugging.

; native final function vector KRBVecToVector(KRBVec RBvec); : Converts an RBVec to a regular vector. RBVects are more precise than regular vectors and are used primarily for replication.
; native final function KRBVec KRBVecFromVector(vector v); : Converts a vector to an RBVec. This is used primarily for replication.

; native final function KSetMass( float mass ); : Sets the mass of a Karma simulated object. This sets the &quot;KMass&quot; of that object. The regular mass is unaffected.
; native final function float KGetMass(); : Returns the KMass of a Karma simulated object, in Karma units.

; native final function KSetInertiaTensor( vector it1, vector it2 ); : Sets the inertia tensor. Unfortunately I don't know what that is. :P
; native final function KGetInertiaTensor( out vector it1, out vector it2 ); : Reads the inertia tensor and returns it in the two &quot;out&quot; arguments.

; native final function KSetDampingProps( float lindamp, float angdamp ); : Sets the linear and angular damping properties of a Karma simulated actor.
; native final function KGetDampingProps( out float lindamp, out float angdamp ); : Puts the current Linear and Angular damping properties into the two out arguments passed to this function.

; native final function KSetFriction( float friction ); : Sets the friction of a Karma simulated object. This applies only to surface to surface contact, and has no effect on the air resistance.
; native final function float KGetFriction(); : Returns the friction, in Karma units.

; native final function KSetRestitution( float rest ); : Sets the elasticity of this object for collisions. 1 is perfectly elastic, 0 is perfectly solid.
; native final function float KGetRestitution(); : Returns the elasticity of this object.

; native final function KSetCOMOffset( vector offset ); : Sets the center of mass of this object, relative to it's center.
; native final function KGetCOMOffset( out vector offset ); : Puts the center of mass of this object, relative to it's center, into the out argument supplied.
; native final function KGetCOMPosition( out vector pos ); : Similar to KGetCOMPosition, this sets the argument to the absolute location of the Center of mass, relative to the center of the world.

; native final function KSetImpactThreshold( float thresh ); : Sets the amount of momentum that must be imparted to this object in a single collision in order to trigger it's KImpact event.
; native final function float KGetImpactThreshold(); : Returns the amount of momentum that must be imparted to this object in a single collision in order to trigger it's KImpact event.

; native final function KWake(); : &quot;Wakes up&quot; the actor. This causes the Karma physics to begin simulating after the object has been deemed to be &quot;at rest.&quot;
; native final function bool KIsAwake(); : Returns a boolean value stating whether this Karma simulated actor is simulating or not. It returns true if the object is currently simulating, and false if it is &quot;at rest&quot; and has stopped simulating.
; native final function KAddImpulse( vector Impulse, vector Position, optional name BoneName ); : Imparts an impulse to the Karma actor. Impulse is the amount of force to apply in Karma units. Position is the location that the impulse should be applied, relative to the center of the world. This does not need to actually be in contact with the Karma object. BoneName, if supplied, is the name of the bone that the impulse should be applied to. This only applies to objects with skeletal information.

; native final function KSetStayUpright( bool stayUpright, bool allowRotate ); : Sets the &quot;stability&quot; of the object. If StayUpright is set to true, the object will not roll or pitch, it will only yaw. If the second argument, AllowRotate, is set to false, the object will not be able to yaw. If it is set to true the object will yaw as normal. If StayUpright is false, AllowRotate will have no effect.

; native final function KSetBlockKarma( bool newBlock ); : Sets the bBlockKarma value of an actor.

; native final function KSetActorGravScale( float ActorGravScale ); : Sets the amount that gravity will be scaled by for this actor.
; native final function float KGetActorGravScale(); : Returns the amount that gravity will be scaled by for this actors simulation.

; native final function KDisableCollision( actor Other ); : This will selectively disable collision between this Karma object and another given Karma object. Regular collision is not negated, and collision with objects other than those specified is not altered. This function can be called repeatedly to disable collision with an arbitrary number of Karma objects. By default, collision is enabled with all Karma objects.
; native final function KEnableCollision( actor Other );  : This will selectively enable collision between this Karma object and another given Karma object. Regular collision is not affected, and collision with objects other than those specified is not altered. This function can be called repeatedly to enable collision with an arbitrary number of Karma objects. By default, collision is enabled with all Karma objects.

; native final function KSetSkelVel( vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ); : Sets the linear, and optionally also an angular velocity for a Karma object with skeletal information attached. If AddToCurrent is true the velocity is added to the current velocity. If AddToCurrent is false, the current velocity is replaced with the one specified to this function.
; native final function float KGetSkelMass(); : Returns the mass, in Karma units, of a Karma object with skeletal information.
; native final function KFreezeRagdoll(); : Freezes a Karma ragdoll. This stops it from simulating immediately when this function is called. Note, however, that KIsAwake may not respond to this until the next tick.

; native final function KAddBoneLifter( name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ); : Adds a &quot;bone lifter.&quot; This is used on Karma ragdolls to make it look like a bone is being lifted. This is used on the de-res effect. The bone lifter acts independant of any other forces or velocities acting on the ragdoll. Note that if you do not set bBlockKarma to false before adding bone lifters, you may have erratic results.
; native final function KRemoveLifterFromBone( name BoneName ); : Removes a bone lifter from whatever bone you specify.
; native final function KRemoveAllBoneLifters(); : Removes all bone lifters on the actor which calls this function.

; native final function KMakeRagdollAvailable(); : Allocates a ragdoll. This is used just before creating a ragdoll and will purge the oldest ragdoll if there is not enough room in the ragdoll queue to create another one.
; native final function bool KIsRagdollAvailable(); : This function checks to see if the ragdoll queue is full. If it is not full, true is returned. If it is full, false is returned. Attempting to create a ragdoll when one is not availible can have unpredictable results. (SimError or simply failure to simulate.)

; event KImpact(actor other, vector pos, vector impactVel, vector impactNorm); : This event is called when the momentum imparted to this object from a single collision exceeds the preset impact threshold, KImpactThreshold. This value is in the KarmaParams of the actor. Note that if you destroy an actor within KImpact, it will crash the engine. This appears to be due to the situation where KImpact is called after the list of potentially colliding actors is generated, and destroying something in that list leaves null pointers in said list.

'''Haral:''' I've found that if you destroy an actor within KImpact, it will cause the game to crash.  I hear this is a known bug (usually referred to as KPerContactCB) but I figured I'd post the obvious hack:  Copy the relevant info of what you're going to do into class variables and then just check for the change in Tick() and destroy it there.  I think that Epic knows about this and it will probably be fixed when 2k4 comes out.

'''Foxpaw:''' Indeed it does. I had the same problem a while ago, but apparently I only squirrelled it away on my developer journal and didn't post it here.

; event KVelDropBelow(); : This event is called whenever the velocity of the ragdoll drops below a certain threshold which you can set, KVelDropBelowThreshold. This value is in the KarmaParams of the actor.
; event KSkelConvulse(); : This event is called whenever a KarmaRagdoll Convulses. It is used to draw the lightning effect on the ragdoll but can be used for anything a regular event can be used for.
; event KApplyForce(out vector Force, out vector Torque); : This is not an &quot;event&quot; so much, it is called every tick, right before the Karma physics are simulated on this object. It has two &quot;out&quot; variables which allow you to directly apply force and torque to the actor. These values are absolute and will set the value of the force and torque on that actor. Despite the name, the amounts specified are not applied in addition to the existing force and torque, they will overwrite those numbers.
; event bool KUpdateState(out KRigidBodyState newState); : This event allows you to manually update the Rigid Body State for a Rigid Body Karma object. I wouldn't particularly recommend using this to set things on a Karma object - KApplyForce, KAddImpulse, etc. are capable of doing the same job with less complication. Regardless of what you set in the newState variable, no changes will take effect if you return false from this function. If you return true, the Karma objects &quot;state&quot; will be replaced with whatever you supplied for the newState argument.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma Injury System</title>
    <id>1629</id>
    <revision>
      <id>4043</id>
      <timestamp>2005-12-29T02:53:33Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4044</id>
      <timestamp>2005-05-28T10:28:20Z</timestamp>
      <contributor>
        <ip>Watdenku.demon.co.uk</ip>
      </contributor>
      <comment>moved again, so page shows up on search for &quot;ragdoll&quot;</comment>
      <text xml:space="preserve">Ok. Hopefully THIS is the last name-change... go to [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma Ragdoll</title>
    <id>1603</id>
    <revision>
      <id>3982</id>
      <timestamp>2005-12-29T02:47:04Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==What's a RagDoll?==

Oversimplified, a ragdoll is the object used when a player dies in UT2003 or UT2004. On screen it is characterised by its floppy movements which are dictated by world forces rather than by a specific animation sequence.  This is the part of the Karma engine that most players associate with the term &quot;Karma&quot;. 

More correctly, a ragdoll is an instance of [[Legacy:Actor|actor]] with [[Legacy:PhysicsType|PhysicsType]] set to PHYS_KarmaRagdoll.

In UnrealEngine2, a Karma &quot;ragdoll&quot; is essentially a number of [[Legacy:Static Mesh|static mesh]]es joined together by KBSJoints. (See [[Legacy:Karma|Karma]]]).  They are integrated into a single object and when set to the PHYS_KarmaRagdoll [[Legacy:PhysicsType|PhysicsType]] they will act as that cluster of meshes and constraints along with gravity and any external impulses. Note, however, that the renderer still renders this as a skeletal mesh, and uses the static mesh collision only for the Karma simulation. 

In UnrealEngine 2.5, skeletal meshes can have their own collision hulls, so their own collision is used for the simulation.

==Uses of a RagDoll==

By far the most common use is for the &quot;ragdoll deaths&quot; of UT2003 and UT2004.  When a [[Legacy:Pawn|pawn]] is killed, it is turned into a [[Legacy:Karma Ragdoll|Karma ragdoll]] version of the original pawn. It is still the same class, but its physics have changed drastically. The ragdoll then flops and slides around, dying in a relatively realistic manner. 

Karma RagDolls behave in all respects like static meshes joined by KBSJoints.  As far as we know, though their only use in the built-in classes is for ragdoll deaths, they could be used for other applications like a rope or some such thing.  It's likely but not tested that a Karma Ragdoll will simulate faster using less RAM and CPU time than will separate actors connected by Karma constraints. 

There has also been cool work done to try to create a [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]

==How It Works==

Karma Ragdoll simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]].  Usually this is the same skeleton as used for skeletal animation on that actor.  The skeleton information contains data about mass distribution, main joints in the body, and the limits of those joints: i.e. how far the joint can move before it breaks, and how much force is required to break it.

==Working With Ragdolls==

The ragdoll actor must have [[Legacy:Actor/Display|DrawType]] DT_Mesh and use a [[Legacy:Skeletal Mesh|skeletal mesh]] or it may not behave as expected.

Comments to the original write-up about ragdolls included the following:

{{innerbox|

'''EricISTS:''' The Karma Ragdoll explanation on this page needs an extreme overhaul.  Explaining RagDolls as a series of Static Meshes connected with KBSJoints, etc. may be okay at a foundational level but it does not even mention KAT or *.ka files / resources.  Were I reading this without any knowledge of Karma I'd probably try to make a ragdoll out of hand crafted 'gibs'!  Emphasis should be added to the creation of KarmaData as, without it, RagDolls are a relatively futile endeavor.

'''Foxpaw:''' That description is a description of how it operates at an engine level. [...] KAT is referenced in the Related Topics section. This page has a strong slant toward coding, and so does not directly deal with the creation of Karma assets. [[Legacy:Karma Ragdoll|Karma Ragdoll]] may be closer to what you are looking for.

}}

* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]] - KAT

==Discussion==

'''Guest:''' Found that the Karma page had much more information about ragdolls than Karma Ragdoll did, so this is my replacement offering.  This page's scope is to be useful to noob, modeler, mapper and coder.  It does not need to contain reference information as the wiki already has comprehensive reference material elsewhere.

'''SuperApe:''' There are a few [[Legacy:Ragdoll|Ragdoll]] pages.  Refactor?

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3983</id>
      <timestamp>2005-05-28T12:03:00Z</timestamp>
      <contributor>
        <ip>Watdenku.demon.co.uk</ip>
      </contributor>
      <comment>Included former comments from Karma page</comment>
      <text xml:space="preserve">==What's a ragdoll?==

Oversimplified, a ragdoll is the object used when a player dies in UT2003 or UT2004. On screen it is characterised by its floppy movements which are dictated by world forces rather than by a specific animation sequence.  This is the part of the Karma engine that most players associate with the term &quot;Karma&quot;. 

More correctly, a ragdoll is an instance of [[Legacy:Actor|actor]] with [[Legacy:PhysicsType|PhysicsType]] set to PHYS_KarmaRagdoll.

In UnrealEngine2, a Karma &quot;ragdoll&quot; is essentially a number of [[Legacy:Static Mesh|static mesh]]es joined together by KBSJoints. (See [[Legacy:Karma|Karma]]]).  They are integrated into a single object and when set to the PHYS_KarmaRagdoll [[Legacy:PhysicsType|PhysicsType]] they will act as that cluster of meshes and constraints along with gravity and any external impulses. Note, however, that the renderer still renders this as a skeletal mesh, and uses the static mesh collision only for the Karma simulation. 

In UnrealEngine 2.5, skeletal meshes can have their own collision hulls, so their own collision is used for the simulation.

==Uses of a ragdoll==

By far the most common use is for the &quot;ragdoll deaths&quot; of UT2003 and UT2004.  When a [[Legacy:Pawn|pawn]] is killed, it is turned into a [[Legacy:Karma Ragdoll|Karma ragdoll]] version of the original pawn. It is still the same class, but its physics have changed drastically. The ragdoll then flops and slides around, dying in a relatively realistic manner. 

[[Legacy:Karma Ragdoll|Karma ragdoll]]s behave in all respects like static meshes joined by KBSJoints.  As far as we know, though their only use in the built-in classes is for ragdoll deaths, they could be used for other applications like a rope or some such thing.  It's likely but not tested that a Karma Ragdoll will simulate faster using less RAM and CPU time than will separate actors connected by Karma constraints. 

There has also been cool work done to try to create a [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]

==How it works==

Karma Ragdoll simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]].  Usually this is the same skeleton as used for skeletal animation on that actor.  The skeleton information contains data about mass distribution, main joints in the body, and the limits of those joints: i.e. how far the joint can move before it breaks, and how much force is required to break it.

==Working With Ragdolls==

The ragdoll actor must have [[Legacy:Actor/Display|DrawType]] DT_Mesh and use a [[Legacy:Skeletal Mesh|skeletal mesh]] or it may not behave as expected.

Comments to the original write-up about ragdolls included the following:

{{innerbox|

'''EricISTS:''' The Karma Ragdoll explanation on this page needs an extreme overhaul.  Explaining RagDolls as a series of Static Meshes connected with KBSJoints, etc. may be okay at a foundational level but it does not even mention KAT or *.ka files / resources.  Were I reading this without any knowledge of Karma I'd probably try to make a ragdoll out of hand crafted 'gibs'!  Emphasis should be added to the creation of KarmaData as, without it, RagDolls are a relatively futile endeavor.

'''Foxpaw:''' That description is a description of how it operates at an engine level. [...] KAT is referenced in the Related Topics section. This page has a strong slant toward coding, and so does not directly deal with the creation of Karma assets. [[Legacy:Karma Ragdoll|Karma Ragdoll]] may be closer to what you are looking for.

}}

* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]] - KAT

==Comments==

'''Guest:''' Found that the Karma page had much more information about ragdolls than Karma Ragdoll did, so this is my replacement offering.  This page's scope is to be useful to noob, modeler, mapper and coder.  It does not need to contain reference information as the wiki already has comprehensive reference material elsewhere.</text>
    </revision>
    <revision>
      <id>3984</id>
      <timestamp>2005-12-29T02:43:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==What's a ragdoll?==

Oversimplified, a ragdoll is the object used when a player dies in UT2003 or UT2004. On screen it is characterised by its floppy movements which are dictated by world forces rather than by a specific animation sequence.  This is the part of the Karma engine that most players associate with the term &quot;Karma&quot;. 

More correctly, a ragdoll is an instance of [[Legacy:Actor|actor]] with [[Legacy:PhysicsType|PhysicsType]] set to PHYS_KarmaRagdoll.

In UnrealEngine2, a Karma &quot;ragdoll&quot; is essentially a number of [[Legacy:Static Mesh|static mesh]]es joined together by KBSJoints. (See [[Legacy:Karma|Karma]]]).  They are integrated into a single object and when set to the PHYS_KarmaRagdoll [[Legacy:PhysicsType|PhysicsType]] they will act as that cluster of meshes and constraints along with gravity and any external impulses. Note, however, that the renderer still renders this as a skeletal mesh, and uses the static mesh collision only for the Karma simulation. 

In UnrealEngine 2.5, skeletal meshes can have their own collision hulls, so their own collision is used for the simulation.

==Uses of a ragdoll==

By far the most common use is for the &quot;ragdoll deaths&quot; of UT2003 and UT2004.  When a [[Legacy:Pawn|pawn]] is killed, it is turned into a [[Legacy:Karma Ragdoll|Karma ragdoll]] version of the original pawn. It is still the same class, but its physics have changed drastically. The ragdoll then flops and slides around, dying in a relatively realistic manner. 

[[Legacy:Karma Ragdoll|Karma ragdoll]]s behave in all respects like static meshes joined by KBSJoints.  As far as we know, though their only use in the built-in classes is for ragdoll deaths, they could be used for other applications like a rope or some such thing.  It's likely but not tested that a Karma Ragdoll will simulate faster using less RAM and CPU time than will separate actors connected by Karma constraints. 

There has also been cool work done to try to create a [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]

==How it works==

Karma Ragdoll simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]].  Usually this is the same skeleton as used for skeletal animation on that actor.  The skeleton information contains data about mass distribution, main joints in the body, and the limits of those joints: i.e. how far the joint can move before it breaks, and how much force is required to break it.

==Working With Ragdolls==

The ragdoll actor must have [[Legacy:Actor/Display|DrawType]] DT_Mesh and use a [[Legacy:Skeletal Mesh|skeletal mesh]] or it may not behave as expected.

Comments to the original write-up about ragdolls included the following:

{{innerbox|

'''EricISTS:''' The Karma Ragdoll explanation on this page needs an extreme overhaul.  Explaining RagDolls as a series of Static Meshes connected with KBSJoints, etc. may be okay at a foundational level but it does not even mention KAT or *.ka files / resources.  Were I reading this without any knowledge of Karma I'd probably try to make a ragdoll out of hand crafted 'gibs'!  Emphasis should be added to the creation of KarmaData as, without it, RagDolls are a relatively futile endeavor.

'''Foxpaw:''' That description is a description of how it operates at an engine level. [...] KAT is referenced in the Related Topics section. This page has a strong slant toward coding, and so does not directly deal with the creation of Karma assets. [[Legacy:Karma Ragdoll|Karma Ragdoll]] may be closer to what you are looking for.

}}

* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]] - KAT

==Discussion==

'''Guest:''' Found that the Karma page had much more information about ragdolls than Karma Ragdoll did, so this is my replacement offering.  This page's scope is to be useful to noob, modeler, mapper and coder.  It does not need to contain reference information as the wiki already has comprehensive reference material elsewhere.</text>
    </revision>
    <revision>
      <id>34439</id>
      <timestamp>2009-05-25T10:24:00Z</timestamp>
      <contributor>
        <ip>81.170.41.161</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">==What's a RagDoll?==

Oversimplified, a ragdoll is the object used when a player dies in UT2003 or UT2004. On screen it is characterised by its floppy movements which are dictated by world forces rather than by a specific animation sequence.  This is the part of the Karma engine that most players associate with the term &quot;Karma&quot;. 

More correctly, a ragdoll is an instance of [[Legacy:Actor|actor]] with [[Legacy:PhysicsType|PhysicsType]] set to PHYS_KarmaRagdoll.

In UnrealEngine2, a Karma &quot;ragdoll&quot; is essentially a number of [[Legacy:Static Mesh|static mesh]]es joined together by KBSJoints. (See [[Legacy:Karma|Karma]]]).  They are integrated into a single object and when set to the PHYS_KarmaRagdoll [[Legacy:PhysicsType|PhysicsType]] they will act as that cluster of meshes and constraints along with gravity and any external impulses. Note, however, that the renderer still renders this as a skeletal mesh, and uses the static mesh collision only for the Karma simulation. 

In UnrealEngine 2.5, skeletal meshes can have their own collision hulls, so their own collision is used for the simulation.

==Uses of a RagDoll==

By far the most common use is for the &quot;ragdoll deaths&quot; of UT2003 and UT2004.  When a [[Legacy:Pawn|pawn]] is killed, it is turned into a [[Legacy:Karma Ragdoll|Karma ragdoll]] version of the original pawn. It is still the same class, but its physics have changed drastically. The ragdoll then flops and slides around, dying in a relatively realistic manner. 

Karma RagDolls behave in all respects like static meshes joined by KBSJoints.  As far as we know, though their only use in the built-in classes is for ragdoll deaths, they could be used for other applications like a rope or some such thing.  It's likely but not tested that a Karma Ragdoll will simulate faster using less RAM and CPU time than will separate actors connected by Karma constraints. 

There has also been cool work done to try to create a [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]

==How It Works==

Karma Ragdoll simulation uses the [[Legacy:Skeletal Mesh|skeleton]] defined for an [[Legacy:Actor|Actor]].  Usually this is the same skeleton as used for skeletal animation on that actor.  The skeleton information contains data about mass distribution, main joints in the body, and the limits of those joints: i.e. how far the joint can move before it breaks, and how much force is required to break it.

==Working With Ragdolls==

The ragdoll actor must have [[Legacy:Actor/Display|DrawType]] DT_Mesh and use a [[Legacy:Skeletal Mesh|skeletal mesh]] or it may not behave as expected.

Comments to the original write-up about ragdolls included the following:

{{innerbox|

'''EricISTS:''' The Karma Ragdoll explanation on this page needs an extreme overhaul.  Explaining RagDolls as a series of Static Meshes connected with KBSJoints, etc. may be okay at a foundational level but it does not even mention KAT or *.ka files / resources.  Were I reading this without any knowledge of Karma I'd probably try to make a ragdoll out of hand crafted 'gibs'!  Emphasis should be added to the creation of KarmaData as, without it, RagDolls are a relatively futile endeavor.

'''Foxpaw:''' That description is a description of how it operates at an engine level. [...] KAT is referenced in the Related Topics section. This page has a strong slant toward coding, and so does not directly deal with the creation of Karma assets. [[Legacy:Karma Ragdoll|Karma Ragdoll]] may be closer to what you are looking for.

}}

* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]] - KAT

==Discussion==

'''Guest:''' Found that the Karma page had much more information about ragdolls than Karma Ragdoll did, so this is my replacement offering.  This page's scope is to be useful to noob, modeler, mapper and coder.  It does not need to contain reference information as the wiki already has comprehensive reference material elsewhere.

'''SuperApe:''' There are a few [[Legacy:Ragdoll|Ragdoll]] pages.  Refactor?

'''detour187:''' Is there any way to add a ragdoll to a map?

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma Ragdoll Injury System</title>
    <id>1630</id>
    <revision>
      <id>4045</id>
      <timestamp>2006-09-14T09:22:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>heil revert</comment>
      <text xml:space="preserve">'''Note to reader:''' This page represents an incomplete ''investigation'' into switching players' pawns into and out of ragdoll mode.  Some considerable mileage was made but the implementation does not work in network play.

----

(Note: this text cut from [[Legacy:Karma Ragdoll|Karma Ragdoll]].  Karma Ragdoll should be definition and description.  All these ideas deserve their own page).

This is an idea first proposed on the Wiki by Soldat. Essentially, the idea is that when a player is damaged by a weapon, they will go into Karma Ragdoll mode for a brief period, depending on the severity of the hit, and then get back up. So, for instance, a hit from an assault rifle may merely cause you to stumble for a split second before regaining control while a direct hit from a rocket would send you through the air to end up as a heap on the ground, which (if still alive) would then attempt to crawl back up onto its feet. Soldat came up with the following function which will activate the Ragdoll Physics on a Pawn. It needs to be placed in a subclass of Pawn or called on the Pawn externally (it would require some modification to do that, but could be modified to work in a mutators' damage modification function):

&lt;uscript&gt;
exec function KarmaMe()
{
  local KarmaParamsSkel SkelParams;
  local String RagSkelName;

  RagSkelName = Species.static.GetRagSkelName(GetMeshName());
  KMakeRagdollAvailable();                                    // allocate a space for the incoming ragdoll

  skelParams = KarmaParamsSkel(KParams);                      // create a new skelParams object based off current KParams
  skelParams.KSkeleton = RagSkelName;                         // with our new ragdoll
  KParams = skelParams;                                       // and now, voila! KParams is the new skelParams

  KSetBlockKarma(true);                                       // without this line, I fall THROUGH the floor... gross

  SetPhysics(PHYS_KarmaRagdoll);                              // actually create the ragdoll
}
&lt;/uscript&gt;

While a neat system, and easy enough to get implemented mostly, it has run into a slight problem: neither Soldat nor myself (I am also trying to implement this, though slightly differently, for my mod) has been able to find a &quot;perfect&quot; way to get the player to get back up after becoming a ragdoll. I have merged our attempts into a single list and described why each did not work quite as planned:

====Removing the Actors Skeleton/Resetting the Karma Parameters, and changing Physics back to PHYS_Walking ====

&lt;uscript&gt;
exec function UnKarmaMe()
{
	KarmaParamsSkel(KParams).KSkeleton = &quot;&quot;;

	SetPhysics(PHYS_Walking);
}

exec function UnKarmaMe2()
{
	KParams = default.KParams;

	SetPhysics(PHYS_Walking);
}&lt;/uscript&gt;

Though in effect the same thing (Removing the Skeleton and Setting the Karma Parameters back to default) it was worth trying both. Neither had any effect. When the physics was set back to PHYS_Walking, the player fell through the floor and out of the world. This was later found to be a result of Karma Ragdoll simulation disabling the regular physics' collision in order to use its own. Setting bCollideWorld to true when you set the physics back to PHYS_Walking will prevent the player from falling through the floor, but it still won't get back up or do anything except look around and shoot. (Because its &quot;state&quot; hasn't changed in the Pawn class, it still thinks it's walking.) However, no animations will play and it will not move anywhere.

====Freezing the Ragdoll====

&lt;uscript&gt;
exec function UnKarmaMe3()
{
	KFreezeRagdoll();

	SetPhysics(PHYS_Walking);
}
&lt;/uscript&gt;

This was tried by Soldat and caused the ragdoll to freeze. Aside from not falling into the floor, this was no more successful than removing the skeleton.

====Spawn a New Pawn above the Ragdoll ====

Soldat's initial idea was to simply destroy the ragdoll and spawn a new pawn on top of where the ragdoll used to be. The problem with this, was that it would telefrag anyone the ragdoll fell under. Another problem was that it didn't have a cool animation to show the person getting back up. :P The telefragging was solved with a suggestion from Mysterial and expanded by CheshireCat to disable the collision on the new pawn until it was no longer touching anyone else, then reenable it. The only existing problem with this method is that there is no real smooth way of showing the player get back up. As I understand, this is the current method that Soldat is experimenting with.

===Animating a Ragdoll===

A short study revealed that merely setting the Physics to PHYS_KarmaRagdoll with cause serious problems with animation and will prevent any animations from being played, even if physics is reset to PHYS_Walking immediately after the call to change it to PHYS_KarmaRagdoll. In other words, the pawn does not have to spend any time being a ragdoll to cause this effect. I am still researching this find out a way to get animations to work after returning the physics to normal. Soldat (I believe) is using the last method detailed above (making a new pawn to replace the old one) and is trying to find a way to make it look like the new pawn is actually the old pawn getting up.

==Discussion==

'''Foxpaw:''' This page has been mainly refactored from [[Legacy:Words About Karma Ragdoll Deaths|Words About Karma Ragdoll Deaths]] along with some stuff I wrote myself. Credit for all of the ideas provided has been given to their respective authors, I believe. I hope I didn't leave anyone out. By the way, Soldat, I had an idea - you may be able to set the person to a crouching idle animation and tween to a standing animation, then, you could make it so when the player lands flat on the ground, it kicks up a dust cloud or something like that, that would obscure the jump from lying down to the crouching position. Let me know how that turns out if you try it, I'm going to continue working on a way to get the original pawn to move again.

'''Foxpaw:''' Eureka! I've gotten the thing to animate again after returning from ragdoll mode. It wipes out the current position and replaces it with the default but at least it doesn't require spawning a new pawn and moving over all of the health, etc. from it. All you have to do is change the mesh. So basically, call something like the following:

&lt;uscript&gt;
// Reenables animations after returning from Karma Ragdoll simulation. Requires a global
// variable SafeMesh, which is a mesh object which we can be guaranteed that this object
// is not. If we try to do this with the same mesh that we are it will not work, therefore,
// it is imperative that a player never be the mesh stored in safemesh. An alternative
// is to have two &quot;safe meshes&quot; and check to see if the players mesh == the first safemesh,
// if so use the second safemesh. Otherwise just use the first. This function assumes a
// safemesh that is guaranteed to never be what the player is set to.
function ReinitializeMesh()
{
  local Mesh OldMesh;

  OldMesh = Mesh;
  LinkMesh( SafeMesh );
  LinkMesh( OldMesh );

  return;
}
&lt;/uscript&gt;

I also noticed that you must be careful to not engage the ragdoll simulation for too short of a time. When ragdoll simulation first begins, your limbs are all concentrated in one spot and they spread out until they are in the correct position. This takes only a fraction of a second, though it may vary on different computers. If you try to use the karma injury system for something mild like a glancing blow that just moves you for a split second it will make you turn into a ball of limbs instead!

'''Foxpaw:''' I noticed a small problem, but it may be solveable by a bit of number fudging. The momentum imparted by various weapons varies immensely. Assault Rifle and Lightning gun are only 1, minigun is 1200, each flak shard is 10000, rockets are 50000, shock gun primary 60000, flak grenades 75000, and the shock combo in excess of 130000. The problem, here, of course, is if I set it up so that a rocket puts him down for 3 seconds, he's out like a light if he gets hit by a shock combo. If, however, it's set so that a shock combo merely keeps him out for 5 seconds, the minigun/AR/lightning gun do diddly squat. Aside from the fact that you have to wait a while for the target to recover, it's pretty fun. I did notice a couple of things though: A) your ragdoll assumes you were standing. Getting ragdolled while crouching does not produce the same effect. B) Ragdolls have a tendancy to &quot;fall through&quot; very thin surfaces. (IE A 'grate' over a pit of slime)  Though cool, the pawn gets stuck when it recovers. This occurs with my &quot;pawns&quot;, regular pawns may act differently.

'''Chema:''' Great! and... weird!!  I had been trying the UnKarma stuff for a few days.  I also got stuck by the animation.  Here is a full (I think) UnKarmaMe(), incluiding the double mesh link:

&lt;uscript&gt;
exec function UnKarmaMe()
{
	local Mesh OldMesh;

	SetPhysics(PHYS_Walking);	// Reset physics
	bCollideWorld = true;		// And world collision
								// (KActors use	KSetBlockKarma for that)
	SetCollision(true, true , true); // Block actors and players again

	OldMesh = Mesh;
	LinkMesh( SafeMesh );		// Global mesh, you will not see it
	LinkMesh( OldMesh );		// This puts your mesh back
}
&lt;/uscript&gt;

The doble mesh link is really weird, but works.  And it is dificult to find what to do whit all those native functions, wich we don't have an idea what really do.

Now, to fix the abrupt standing, we could try an immediate crouch, or better, I saw somewhere a function to initialize the mesh anim before spawn.

'''Foxpaw:''' My pawn comes up in the crouching position. It was as simple as adding PlayAnim( 'Crouch' ); after you relink the oldmesh. (I'm pretty sure that those parameters are optional. I use a wrapper for animation with my &quot;pawns,&quot; so my syntax is slightly different.)The real problem is not the starting animation, but how to get the starting animation to be something very close to what the ragdoll was using, I think. I have had ragdolls get their foot caught in tiles on the floor and not end up falling over, just kind of going limp - in that instance the standing is better. I've been experimenting the the dark magic of manual skeleton rotation - I have a hunch but I'm not quite sure how I'll go about it. If you could read the rotation of all of the bones, you could manually set them after relinking the mesh and then from there tween to an animation. However, obtaining the bones rotation is not as simple as calling the GetBoneRotation, as that only returns the rotation relative to where the current animation says that it should be. Bones seem to use a haphazard mix of absolute and relative locations and rotations, as well as even having their own internal coordinate system for each bone! For that reason it's a bit confusing. [[Legacy:Skeletal Mesh|Skeletal Mesh]] has a listing of skeletal animation functions and a short description of those that I have experimented with. Unforunately, I haven't played with all of the parameters of the functions. There's another interesting thing that should be considered, but maybe this is only a problem with the juggernaut skeleton that I'm using: The juggernaut skeleton has an overwhelming tendancy to fall to its knees, then fall flat to its face. This may be because of the limits on the bones though. It generally performs this if hit by a &quot;singular, direct&quot; type of attack, like a direct hit from rocket, shock rifle, etc. Multiple-hit type weapons like flak work fine, and if a rocket hits the ground nearby the results are believable. One more thing. My pawns don't have this problem because of the way that they are scripted, but the built in pawns suffer a set amount of impulse whenever they get hit as a ragdoll. It does not use the actual momentum of the gun, and I don't think it applies it to the actual bone hit either. The following is a slighly modified excerpt from the code I use (the code I use is in an else block and has an argument Bone instead of declaring it.)

&lt;uscript&gt;
  local float Dummy; // Just to satisfy an out argument.
  local name Bone;

  if ( Physics == PHYS_KarmaRagdoll )
  {
    Bone = GetClosestBone( HitLocation, Normal(Momentum), Dummy );
    KAddImpulse(momentum, hitlocation, Bone);
  }

  // If you wanted you could collapse this to take up less space you could also just do:
  local float Dummy; // Just to satisfy an out argument.

  if ( Physics == PHYS_KarmaRagdoll )
    KAddImpulse(momentum, hitlocation, GetClosestBone( HitLocation, Normal(Momentum), Dummy ));
&lt;/uscript&gt;

I have no idea why Digital Extremes used that RagSkelVel and SkelParams.KShotStrength nonsense. This looks way more ragdollish and much cooler as it allows for multiple sources of force to be acting in rapid succession. IE when you get nailed at close range with the flak cannon. (Of course you probrably wouldn't survive anyways but maybe if you had lots of shields and health)

'''Foxpaw:''' I got the getting up part a bit better. Your position on the ground is now recreated once the mesh is reset, but only on key bones. So now I'm a running dilapitated pile of crumpled up bones. :P I'll try to find an efficient way to tween out the dilapitatedness into normal movement.

'''Chema:''' Houston, I can get up... but can't crouch!  

Adding PlayAnim( 'Crouch' ); to UnKarmaMe doesn't work.  Actually, it works normally, but not when I'm Karmed: I stand up, but don't crouch.  If I call UnKarmaMe again, from console, then it works.  Simply put: I can't animate the mesh in the same call that UnKarmaMe, no matter if I put in a different function.  

Any idea whats wrong with me?  And with my code? (hehe). Are you doing anything special apart of the stuff in the previous UnKarmaMe()?  I'm setting my TestxPawn trough the URL (dm-gael?Game=Test.TestGame?Class=Test.TestxPawn), but there should be a scripted way to do it for a game.  An equivalent of the CheckReplacement of the Mutators? (Thanks for all your help!)

'''Foxpaw:''' It may be that the animation won't play on the same call. As you may have noticed, (maybe, it's kind of hard to see.) For a short time after becoming a ragdoll you are just a ball of concentrated body parts. It is possible that your ragdollness persists until the next tick. Or something. The 'personnell' on my mod are completely custom - I've written my own classes for everything below actor, because Pawns have lots of built in junk. :P It has an attached &quot;Mesh Controller&quot; which monitors animation, etc. and would play the idling animation the next opportunity it got... so if it cannot indeed be called from the same function it would try again the next tick. That may be why mine goes back to the idling animation while yours requires a second call. I believe that you can use checkreplacement in mutators to replace your xpawn with the one you have made.. I haven't tested it but I believe that you can because I think that checkreplacement is called from within spawn, before the controller would make its Possess call, which I believe does not occur until after the spawn has returned. I haven't tested that part out, the order that the controller stuff goes in because I just wrap the controller class, so I don't really use it for anything.

'''Foxpaw:''' I noticed another thing, but it might not be a big deal for your application. If you really clobber a ragdoll sometimes it will suffer a simerror as a result of its joints being spun so fast. This will, by default, result in it being destroyed - definately a bad thing if the player was merely injured! You can set bDestroyOnSimError in its KParams to prevent this, but it doesn't protect against everything. bKImportantRagdoll (maybe doesn't have a K, I don't remember for sure) might also be good because it prevents the ragdoll from being destroyed if the system runs low on memory and wants to make a new ragdoll. The simerror thing may not apply in your application, because generally that will only result from things such as flak to the head at point blank or similar events, which would kill the pawn anyway. It might also be worth investigating what effects mutators that affect the ragdolls will have. I'm not sure about Floaty Cadavers, but I know that Slow Motion Corpses works by slowing down the entire Karma Ragdoll simulation system. This would slow down injured players as well. I don't know if that's a problem or not, but it's worth checking out.

'''OBWANDO:''' I took a few hours fighting with this, and it wouldnt work at all in any way. Heres what I found... If you want to get the pawns to go back to their original animated mesh, you need to link with another VALID different mesh. If you try to link with a null or non-specified mesh, it will simply not link at all which then you will wind up linking the original named mesh and that does absolutely nothing. In the end heres what seemed to work for me:

In my pawn class (RBxPawn.uc):

&lt;uscript&gt;

var	(Global) mesh SafeMesh;

exec function KarmaMe()
{
  local KarmaParamsSkel SkelParams;
  local String RagSkelName;

  SafeMesh = Mesh;                                            // This is where I am getting the pawn's original mesh
  RagSkelName = Species.static.GetRagSkelName(GetMeshName());
  KMakeRagdollAvailable();                                    // allocate a space for the incoming ragdoll

  skelParams = KarmaParamsSkel(KParams);                      // create a new skelParams object based off current KParams
  skelParams.KSkeleton = RagSkelName;                         // with our new ragdoll
  KParams = skelParams;                                       // and now, voila! KParams is the new skelParams

  KSetBlockKarma(true);                                        // without this line, I fall THROUGH the floor... gross

  SetPhysics(PHYS_KarmaRagdoll);                              // actually create the ragdoll
}

exec function UnKarmaMe()
{
  KarmaParamsSkel(KParams).KSkeleton = &quot;&quot;;

  SetPhysics(PHYS_Walking);        // Reset physics
  bCollideWorld = true;            // And world collision
                                         // (KActors use KSetBlockKarma for that)
  SetCollision(true, true , true); // Block actors and players again

  LinkMesh( SkeletalMesh'Weapons.AssaultRifle_1st' );  // I am using a valid mesh which is not the same as the pawn's original mesh
                                   // You should probably use a precached mesh for performance reasons, the gun seemed good here
  LinkMesh( SafeMesh );	         // Link the pawn's original mesh and we're done!
}
&lt;/uscript&gt;

'''Foxpaw:''' I believe that is the same as what I wrote above. SafeMesh DOES need to be defined as a mesh, I guess I should have explicitly stated that. The OldMesh is the mesh that we want to return to and is read in the unkarmatize function on my &quot;livingthing&quot; class. (This is the &quot;livingthing&quot; equivalent of the unkarmame function.) I could have sworn we discussed the idea of using two safemeshes in case, for whatever reason, the pawn was using one of those meshes, I don't see that anywhere on this page though so maybe I just imagined it. :P Should we remove the failed attempts listed above or leave them so others can learn that those methods don't work and why the didn't work?

'''OBWANDO:''' I would say leave it in place, it shows the evolution of the learning curve to a final conclusion. You did mention (or i assumed) that there were 2 safemeshes, but I did not know that 1 had to be explicitly defined, and that was what threw me, and could others. I wouldn't have made it this far without everything being available to read.

'''Foxpaw:''' Okay. Both safemeshes would actually need to be defined, but you can usually get away with using just one, depending on the application. In this instance it's highly unlikely that a pawn would have a first person weapon mesh as their mesh so you could get away with the way you did it. 

'''Foxpaw:''' I've noticed one small issue but it's not that big of a deal. If you rotate bones using Unrealscript, the karma ragdoll is not rotated appropriately. The visual representation of it is, but the actual collision/simulation information remains unchanged. That's probrably not a big issue, I've been experimenting with rotating bones to have the player &quot;get back up&quot; from whatever position they ended up in. In this instance, the simulation can be slightly innaccurate if you are hit again while getting up.

'''Foxpaw:''' I almost forgot - there's a big problem with this code, but it might not be that hard to work around. There's a limit on the number of ragdolls that you can have in play at any time. I believe it may be per zone, however. The limit appears to be rather low, unfortunately, approximately 3 ragdolls per zone. If you had two carcasses and two injured players, one would be denied a ragdoll and would just stand still. You could work around this by using the IsRagdollAvailible, and if one is not the player could just play some other injury animation and be simulated using regular physics.

'''OBWANDO:''' I agree, I listed a piece of simple code to get the idea, but to prevent the problems from occuring here is a small snip that you could use as well to combat the problems of unavailability.

&lt;uscript&gt;
exec function KarmaMe()
{
  local KarmaParamsSkel SkelParams;
  local String RagSkelName;

  SafeMesh = Mesh;                                            // This is where I am getting the pawn's original mesh

  if( RagdollOverride != &quot;&quot;)                                  // Try to get the rag-doll setup.
  	RagSkelName = RagdollOverride;                        // If there is an override, use it first
  else if(Species != None)                                    // if not, use species.
  	RagSkelName = Species.static.GetRagSkelName( GetMeshName() );

  if( RagSkelName != &quot;&quot; )                                         // If we did find one, try to allocate the space.
  {
  	KMakeRagdollAvailable();                                  // allocate a space for the incoming ragdoll
  }
  	
  if( KIsRagdollAvailable() &amp;&amp; RagSkelName != &quot;&quot; )
  {  
    skelParams = KarmaParamsSkel(KParams);                    // create a new skelParams object based off current KParams
    skelParams.KSkeleton = RagSkelName;                       // with our new ragdoll
    KParams = skelParams;                                     // and now, voila! KParams is the new skelParams
  
    KSetBlockKarma(true);                                     // without this line, I fall THROUGH the floor... gross
  
    SetPhysics(PHYS_KarmaRagdoll);                            // actually create the ragdoll
  }
}
&lt;/uscript&gt;

'''OBWANDO:''' One thing I have noticed that that you can crash the client pretty easily if you try to do this in a dedicated network mode. On a local client there are no problems, but from what I have seen, a dedicated server will not allow the physics to change to ragdoll, so your client will show a ragdoll, but your server will still show the last known physics mode (like PHYS_Walking, or PHYS_Falling). Maybe we should look at starting a thread or page on network implementation.

'''Foxpaw:''' I don't understand what you mean by that.. how do you mean the server will &quot;show&quot; the last known physics mode, if it is a dedicated server? The server/client problem you are having is likely due to the KarmaMe function not being replicated.. or something like that. I haven't tested mine over network yet but it is set to be triggered when hit, if the imparted momentum is over a certain threshold. I am not sure how the autonomous proxy treats exec functions so the problem could be with that. If you want to ensure that the ragdolling is consistant on both client and server you could have a boolean variable that is replicated reliably from server to client, and a check in tick - if the variable is true and we are not in PHYS_KarmaRagdoll, then call the KarmaMe function, if the variable is false and we are in PHYS_KarmaRagdoll, then call the UnKarmaMe function. This, of course, would require those functions split into two pieces because you wouldn't want to call an exec function and have the cause the server to request that same function to be called on the client, which would then cause the server to request that same function to be called on the client again, etc. Enough talk! :P The implementation could be something like this: (I didn't actually compile and test this, there could be typos. It would also maybe need some tweaking to allow for running out of ragdolls. You could use a timer or whatever you want for unkarmame. I use a manually implemented timer in tick.)

&lt;uscript&gt;
var bool bIsRagdolling;
var float RagdollThreshold;

replication
{
  reliable if ( ROLE==ROLE_Authority )
    bIsRagdolling;
}

simulated function TakeDamage(int Damage, Pawn Instigator, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
  Super.TakeDamage(Damage, Instigator, HitLocation, Momentum, DamageType);
  if (Role == ROLE_Authority &amp;&amp; VSize(Momentum) &gt; RagdollThreshold)
    bIsRagdolling = true;
}

simulated function Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (Role &lt; ROLE_Authority)
    if (bIsRagdolling &amp;&amp; Physics != PHYS_KarmaRagdoll)
      KarmaMe();
    else if (!bIsRagdolling &amp;&amp; Physics == PHYS_KarmaRagdoll)
      UnKarmaMe();
}


simulated function KarmaMe()
{
  // Do your karmame stuff here.
}

simulated function UnKarmaMe()
{
  // Do your unkarmame stuff here.
}

&lt;/uscript&gt;

'''OBWANDO:''' Heres what I've seen. In most of the Epic code, you will see that they have the karma sequences set up so that the server's pawn doesnt actually get its physics set into KarmaRagdoll mode (Level.NetMode != NM_DedicatedServer). Only the client does. Now this may seem simple in theory, but the reality is that if you touch a floor surface, or its a bot (or a player) that jumps then the physics on the server will change and as a result the physics from the server will be replicated as part of the normal parent class replication to that physics mode. Thats where the problems begin since on the client you are in KarmaRagdoll, and the server replicates a PHYS_Walking, or whatever, but its not Ragdoll, so the client crashes since you cannot have a walking pawn that is in PHYS_KarmaRagdoll. This means you have to address the problem to prevent the client from getting the physics change unless you have restored the physics and mesh back and are ready for that PHYS mode.

'''Foxpaw:''' Ah, yes. The ragdolls aren't simulated on the server usually because that just wastes resources. They are &quot;torn off&quot; when they are created, so they cease to replicate. I think that the implementation I listed above should work.. I hope. I haven't tested that or played around with it, I don't really know all of the nuances of the pawn class since I don't use it for anything, but it seems logical.

'''Foxpaw:''' Apparently, the limit placed on ragdolls is optional. If you just remove the MakeRagdollAvailible part and the IsRagdollAvailible check, you can apparently make as many ragdolls as you want. Finally, my battlefields can have carcasses littered all around, instead of that stupid de-res thing. :P

'''PlaneGuy:''' I tried the MP ragdoll code above, but it still crashes. I was thinking if being ragdolled is a state, you can set the pawn to ignore any non-ragdoll/karma related action in that state. Thoughts?

'''OBWANDO:''' Here is the code I created that successfully works. I used a manual timer since the SetTimer was too flaky for me. The server first of all is the only one that will REALLY know what mode our client is supposed to be in. When we are ragdolling, we should probably prevent the bots from moving the ragdoll, or when we come back out, the client will show the pawn pretty far away from where it should have been. and most importantly, we need to make sure the client does not try to change the physics via update from the server.

&lt;uscript&gt;
var bool bKarma; // server paramater to client if you need to be set to karma mode
var bool bInKarma; // server parameter letting the client know to override any physics changes to karma.
var bool bTickMe; // my tick timer boolean
var bool bClKarma; // the client flag that lets us know that the client is indeed in karma mode. (remember Physics will be changed from replication)
var int	iTickTime; // a timer counter since SetTimer was too flaky to use over network.

replication
{
	reliable if (Role == ROLE_Authority )
		bKarma, bInKarma;
}

simulated event PostNetReceive()
{
	if ( PlayerReplicationInfo != None )
    {
		Setup(class'xUtil'.static.FindPlayerRecord(PlayerReplicationInfo.CharacterName));
		if ( AmbientGlow == 70 )
			AmbientGlow = Default.AmbientGlow;
        //bNetNotify = false;
    }

	if ( (bInKarma == false) &amp;&amp; (bKarma == false) &amp;&amp; (Physics == PHYS_KarmaRagdoll) ) UnKarmaMe(); // ok release karma mode go back to a pawn

}

simulated function Tick(float DeltaTime)
{
    if (Role == ROLE_Authority ) {
	if (bTickMe) {
		iTickTime--;
		if (iTickTime &lt; 1) {
			bTickMe = false;
			UnKarmaMe();
		}
	}
    }

    if ( (bInKarma &amp;&amp; !bTearOff) ) // if we're in karma, but not dead, prevent player induced motion from occuring.
    {
	Acceleration = vect(0,0,0);
	Velocity = vect(0,0,0);
    }
    if ( (Physics != PHYS_KarmaRagdoll) &amp;&amp; (bKarma == true) &amp;&amp; (bInKarma == false) ) KarmaMe(); //set the Ragdoll Mode

    if ( Level.NetMode == NM_DedicatedServer )
  		return;
  //****** ONLY LOCAL AND CLIENT STUFF BELOW HERE

    if ( (Physics != PHYS_KarmaRagdoll) &amp;&amp; (bClKarma == false) &amp;&amp; (bInKarma == true) ) KarmaMe(); //Seems replication isnt perfect, so lets make sure

    if ( Controller != None ) OldController = Controller;

    if ( (bInKarma == true) &amp;&amp; (bKarma == false) &amp;&amp; (Physics != PHYS_KarmaRagdoll) ) SetPhysics(PHYS_KarmaRagdoll); // Enforce Ragdoll on clients

    TickFX(DeltaTime);

    if ( bDeRes )
    {
        TickDeRes(DeltaTime);
    }
    // assume dead if bTearOff - for remote clients unfff unfff
    if ( bTearOff )
    {
        if ( !bPlayedDeath )
            PlayDying(HitDamageType, TakeHitLocation);
        return;
    }

}

simulated function UnKarmaMe()
{
	if (ROLE != Role_Authority) {
		
		KarmaParamsSkel(KParams).KSkeleton = &quot;&quot;;
		SetPhysics(PHYS_Falling);   // Reset physics
		bCollideWorld = true;       // And world collision
									// (KActors use KSetBlockKarma for that)
		SetCollision(true, true , true); // Block actors and players again
		
		LinkMesh( SkeletalMesh'Weapons.AssaultRifle_1st' );
		LinkMesh( SafeMesh );
		bClKarma = false;
	} 

	if ( Role == ROLE_Authority ) { //servers set the parameters

		bKarma = false;
		bInKarma = false;
	}
}
&lt;/uscript&gt;

In your KarmaMe() routine, add this to your karma code:

&lt;uscript&gt;
	if (ROLE == Role_Authority) 
	{
		bKarma = false;
		bInKarma = true;
	}
	if ( Level.NetMode != NM_DedicatedServer )
	}

... karma code etc...

	     SetPhysics(PHYS_KarmaRagdoll);
	     bClKarma = true; // dont forget to let its own client know its mesh should stay in karma mode.
	}
&lt;/uscript&gt;

Remember, you need to set the bClKarma on the client only, the server has no idea as to what that boolean parameter is.

So why check for unkarma in PostNetReceive? Simple, I need to check when it changes, and not every tick. Since normally you are not in karma, and you're karma flag is false when you are playing, no point tying up CPU cycles testing a scenario that can be predicted from the server.

When you are ready to invoke the karma mode, use this piece of code:

&lt;uscript&gt;
	if (Role == ROLE_Authority ) // we need to set the karma ragdoll time and flag true if applicable on server only
	{
		if ( (bKarma == false) &amp;&amp; (bInKarma == false) ) { // if you're already in karma mode, no need to do it agin.
			bKarma=true;
		}
		iTickTime = iTickTime + vSize(momentum)/30; // or whatever you want to use.
		bTickMe = true;
	}
&lt;/uscript&gt;

I use it in my TakeDamage function. 

One last thing, in you class add these to your defaultproperties:

&lt;uscript&gt;
defaultproperties
{
	bKarma = false
	bInKarma= false
	bAlwaysRelevant=True // should already be set if its a pawn
	bGameRelevant=True // i believe same here as above
	bTickMe = false
	iTickTime = 0
	bNetNotify=true // important 
	bClKarma = false
}
&lt;/uscript&gt;

Hopefully this will shed some light on the karna networking topic and get more mods looking and feeling realistic. I will add my code soon that will allow for you to successfully get your pawn back up correctly using bone lifters, and timing (notice I set the timer from the momentum parm in the takedamage function). I'm sure the code could be optimized and done in many ways, but it works, and its something to start from.

Good luck, and if you have any questions post em, or look for me on IRC... im usually around in #unrealwiki, #unrealed, or #unrealscript.

'''Foxpaw:''' I would not recommend using bone lifters for the &quot;getting back up&quot; portion.. bone lifters require collision to be disabled, effectively making the player invulnerable while recovering. It would also be kind of wierd looking. I think that tweening from the dead body position back to crouching animation would be better and is probrably quite possible.

'''Foxpaw:''' I got tweening back to animation to &quot;work.&quot; So far it doesn't look all that natural though. I have an idea how to make it more natural but I'd like to do so without any hacks.

'''Foxpaw:''' Improved the tweening.. making it faster makes the wierd nuances unnoticeable and bringing them back to the crouched position instead of standing helped as well. Now I only have one problem: the relinking of the mesh starts the person off in a standing position. This causes the person to tween from standing to crouching when they get up which looks a bit wierd. I know how I could probrably fix that but it's a hack, so I don't want to do it that way. Any ideas of how I could do this cleanly?

'''OBWANDO:''' Drop some code in here, lets take a look. I was playing with LinkSkelAnim( (anim), (mesh) ) instead of LinkMesh. Its a native as well, but from what I see in the actor.uc, it will start the mesh up in that animation.

'''Foxpaw:''' Unfortunately, since my class heirarchy is completely different, the function calls, etcetera will be different. I'll put the contents of the &quot;skeletoncontroller&quot; class here anyway, you can probrably see the idea. An explanation would probrably serve you better: When we return from ragdolling, before relinking the mesh we read the orientation of all of the main bones, using GetBoneCoords. The X axis of that coordinate system that it returns is a vector pointing along the length of the bone, thus giving us its rotation. I store this information, relink the meshes, then use SetBoneDirection to recreate the ragdoll's position after the relinking. The SetBoneDirection has an alpha parameter that allows us to define how much of that direction should be imposed and how much should be left to SetBoneRotation/the animations. By tweening the alpha from 1 to 0 always with the same directions, the body will go from its ragdolled position to the position dictated by its animation over the course of the time that it takes to tween the alpha. This can create wierd effects if you do it slowly, though, because of the bone heirarchy and all. If done quickly enough, however, it appears fairly smooth. The only problem with this setup is that it uses some fair network bandwidth, because for some reason setbonedirection is not simulated, even though SetBoneRotation is.

There are some functions that are not related to the ragdolling in here, and some interplay with a class &quot;UniversalThing&quot; and &quot;SkeletalMeshController,&quot; but you should be able to get the idea from this:

&lt;uscript&gt;
// The skeleton of a skeletal mesh.
class SkeletonController extends UniversalThing notplaceable;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

struct BoneData                                 // A stored bone structure, used for ragdoll recovery.
{
  var name      BoneName;                       // The name of this bone.
  var coords    BoneCoords;                     // The 'coordinates' of this bone.
  var rotator   Rotation;                       // The current added rotation of this bone.
};

struct TweenBoneDirection
{
  var name      BoneName;                       // The name of the bone.
  var rotator   Direction;                      // The direction of the bone.
  var float     TweenTime;                      // Time remaining to tween.
  var float     StartTweenTime;                 // How long to tween in total.
};

var Mesh                SafeMesh1, SafeMesh2;   // TODO: This is duplicated in the meshcontroller.

var array&lt;BoneData&gt;     Bones;
var array&lt;TweenBoneDirection&gt; BoneTweenData;    // Data for tweening of bone directions.

var array&lt;name&gt;         BoneNames;              // Important bones that will be retained through ragdoll recovery.
var array&lt;name&gt;         AimBones;               // Bones that take part in aiming.

var name                HeldBone;               // Bone that we use for holding things.
var name                ViewBone;               // Bone that the camera should view from.

var actor               Flesh;                  // Our &quot;flesh.&quot;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function postbeginplay()
{
  Super.postbeginplay();
}

simulated function Initialize()
{
  local int i;
  
  Flesh.AnimBlendParams(1, 1.0, 0.0, 0.2, AimBones[0]);

  for (i=0;i&lt;BoneNames.Length;i++)
    SetBoneRot( BoneNames[i], Rot(0,0,0) );
}

simulated function BoneData StoreBone( name BoneName )
{
  local BoneData NewBone;
  
  if ( Flesh == None ) return NewBone;

  NewBone.BoneName = BoneName;
  NewBone.BoneCoords = Flesh.GetBoneCoords( BoneName );
  
  return NewBone;
}

simulated function array&lt;BoneData&gt; StoreBoneData()
{
  local int i;
  local array&lt;BoneData&gt; BoneData;
  
  if ( Flesh == None ) return BoneData;

  for (i=0;i&lt;Default.BoneNames.Length;i++)
    BoneData[BoneData.Length] = StoreBone( Default.BoneNames[i] );
    
  return BoneData;
}


// Set me back up for animation after I've ragdolled.
simulated function SolidifyRagdoll()
{
  local array&lt;BoneData&gt; BoneData;
  
  if ( Flesh == None ) return;
  
  BoneData = StoreBoneData();
  
  if ( ( Flesh.Mesh == Default.SafeMesh1 || Default.SafeMesh1 == None ) &amp;&amp; ( Default.SafeMesh2 != None ) )
    Flesh.LinkMesh( Default.SafeMesh2 );
  else if ( Default.SafeMesh1 != None )
    Flesh.LinkMesh( Default.SafeMesh1 );
    
  if ( UniversalThing( Flesh ) != None )
    UniversalThing(Flesh).InitializeMesh();
  
  RecoverBoneData( BoneData );
}

simulated function RecoverBoneData( array&lt;BoneData&gt; BoneData )
{
  local int i;
  
  if ( Flesh == None ) return;

  for (i=0;i&lt;BoneData.Length;i++)
    RecoverBone( BoneData[i] );
}

simulated function RecoverBone( BoneData BoneData )
{
  if ( Flesh == None ) return;

  Flesh.SetBoneLocation( BoneData.BoneName, BoneData.BoneCoords.Origin );
  SetBoneDir( BoneData.BoneName, Rotator( BoneData.BoneCoords.XAxis ),0.25 );
}

simulated function TweakBoneRotation( name BoneName, out rotator Rot )
{
  if ( BoneName == HeldBone )
    Rot += Rot(16384,0,0);

  ///// Note: This function is best described as a &quot;hack.&quot; It allows a meshcontroller to
  ///// manually override bone directions by assigning a fixed direction to them. It will
  ///// not work properly on bones that take part in aiming, etc. It merely exists as a
  ///// method to retrofit existing models with bones in wierd orientations.
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function SetAim( rotator Aim )
{
  local int i;
 
  if ( Flesh == None ) return;

  // TODO: Hackriffic. Make the transormation matrix confusitroniness. Maybe make a &quot;skeleton&quot; class,
  // which would be owned by the Thing, that stores our current animation positions. Technically that
  // should go here so maybe the meshcontroller could be instantiated.
  Flesh.SetRotation( Aim );
  
  Aim -= Flesh.Rotation;

  for (i=0;i&lt;Default.AimBones.Length;i++)
  {
    Aim.Roll =  Aim.Yaw;
    Aim.Yaw  = -Aim.Pitch;
    Aim.Pitch = 0;
    SetBoneRot( Default.AimBones[i], Aim / Default.AimBones.Length );
  }
  
  return;
}

simulated function vector FindBoneLocation( name Bone, optional out vector Rot )
{
  local Coords Coords;
  
  if ( Flesh == None || Bone == '' ) return Vect(0,0,0);
  
  Coords = Flesh.GetBoneCoords( Bone );
  Rot = Coords.XAxis;
  return Coords.Origin;
}

simulated function rotator FindBoneRotation( name Bone )
{
  if ( Flesh == None || Bone == '' ) return Rot(0,0,0);

  return Flesh.GetBoneRotation( Bone );
}

// TODO: This function name is misleading.
simulated function vector FindHeldLocation( optional out vector Rot )
{
  if ( Flesh == None || Default.HeldBone == '' ) return Vect(0,0,0);

  return FindBoneLocation( Default.HeldBone, Rot );
}

// TODO: This function name is misleading.
simulated function vector FindHeldRotation( optional out vector Loc )
{
  if ( Flesh == None || Default.HeldBone == '' ) return Vect(0,0,0);

  Loc = FindBoneLocation( Default.HeldBone );
  return Vector( FindBoneRotation( Default.HeldBone ) );
}

simulated function SetBoneRot( name BoneName, rotator Rot )
{
  if ( Flesh == None ) return;
  TweakBoneRotation( BoneName, Rot );
  Flesh.SetBoneRotation( BoneName, Rot );
}

function SetBoneDir( name BoneName, rotator Dir, optional float TweenTime )
{
  local TweenBoneDirection NewTween;
  
  if ( Flesh == None ) return;

  if ( TweenTime != 0 )
  {
    NewTween.BoneName = BoneName;
    NewTween.Direction = Dir;
    NewTween.TweenTime = TweenTime;
    NewTween.StartTweenTime = TweenTime;
    BoneTweenData[BoneTweenData.Length] = NewTween;
  }
  
  Flesh.SetBoneDirection( BoneName, Dir,,1 );
}

function bool TweenBone( out TweenBoneDirection BoneData, float Delta )
{
  local bool Result;
  Result = false;
  
  if ( Flesh == None ) return Result;

  BoneData.TweenTime -= Delta;
  if ( BoneData.TweenTime &lt; 0 )
  {
    BoneData.TweenTime = 0;
    Result = true;
  }

  Flesh.SetBoneDirection( BoneData.BoneName, BoneData.Direction,,BoneData.TweenTime/BoneData.StartTweenTime );
  
  return Result;
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function Tick( float Delta )
{
  local int i;
  
  for (i=0;i&lt;BoneTweenData.Length;i++)
    if ( TweenBone( BoneTweenData[i], Delta ) )
      BoneTweenData.Remove(i,1);
    
  Super.Tick( Delta );
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

defaultproperties
{
  Bonenames(0)=Spine
  Bonenames(1)=Head
  Bonenames(2)=LShoulder
  Bonenames(3)=RShoulder
  Bonenames(4)=LThigh
  Bonenames(5)=RThigh
  Bonenames(6)=LFARM
  Bonenames(7)=RFARM
  Bonenames(8)=RightHand
  Bonenames(9)=LFoot
  Bonenames(10)=RFoot
  Bonenames(11)=Bone_Weapon
  
  AimBones(0)=Spine
    
  HeldBone=Bone_Weapon
  ViewBone=Head

  SafeMesh1=Mesh'Jugg.JuggMaleA'
  SafeMesh2=Mesh'Jugg.JuggFemaleA'
}
&lt;/uscript&gt;

'''AlphaOne:''' Could I ask anyone to please taker their time to post a '''complete''' solution(s) here because I'm having a hard time putting your code together. It would be REALLY nice if it was downloadable...(I like being spoon fed)

'''Foxpaw:''' Unfortunately, because all of the people working on this have different applications it's kind of hard to package one solution.. however, I suspect that a mutator could be made of this (I think theres a modifydamage function or something that could cause the karmatizing and an array of pointers to pawns and their respective karma-ing specific values could possibly be stored there. Unfortunately, since my application is highly different, I can't really be the one to do this. Most of the snippets I've provided here are fairly general, but the last one is highly specific and wouldn't work without extensive modification.

'''Plane Guy:''' RAGDOLL POSTULATION OUT OF NOWHERE. My mod involves grabbing a player pawn and dragging him around. Thing is, with the ragdoll I have to attach to a bone and karma yank the doll around BUT the server has no ragdoll (else it crashes). Would it be plausible to karma impulse the &quot;standing&quot; player pawn on the server and get karma-based dragging client-side? Does the flippity-floppity nature of ragdolls require I act on it directly with Karma, or will the client recognize the server has moved the doll and flail its limbs accordingly?

'''Foxpaw:''' Hmm, I'm pretty sure that it's possible to have an actor using PHYS_KarmaRagdoll on the server.. though I don't know how well xPawns handle that. Anyways, Karma ragdolls don't replicate very well, so it would probrably be best to do the bone attach to whatever they're getting dragged behind and have the dragging completely client side. (And have whatever is dragging them get replicated)

'''Plane Guy:''' Hmmmm. Well I had it working on client-side only, but when the dragging stops, the pawn reappears where it was first ragdolled. Would I have to replicate that movement BACK to the server (server is NOT the man, oh noes)? Wouldn't I have to, once replicated to the server, replicate it back to the other clients? Gee, this is getting complicated.

'''Foxpaw:''' I recall someone else having a similar issue. This seems to be a behaviour of the xPawn class, though I can't say that with 100% certainty. xPawns store movements and then go off of their saved movement - this reduces apparent lag in network games. However, it also means that if you move a Pawn by a means other than the Pawn was intended to move, the stored movements don't get updated. I'm not sure if there's an easy way around that or not, since I haven't really looked at the network stuff for Pawn.

'''Dirk Fist:''' I have'nt done much with 2k3, But could'nt the ''Actor&gt;NavigationPoint&gt;SmallNavigationPoint&gt;Teleporter '' accept() function, be modified for setting an actors location?

'''Plane Guy:''' I don't know if it matters, but I'm in 2K4 now. Perhaps a &quot;ragdoll location&quot; variable, and have the server actor.move() to it while ragdolled. It'd be choppy though, though since the server is going to update the client with its old location.

The other idea I had was to karma impluse the same on all clients - replicate the impulse vector - and actor.move() only on the server. Everyone'd get a slightly different karma show, but I don't think they'd notice.

'''OlympusMons:''' Ok guys just an idea. I was thinking after reading this, I know it need a [[:Category:Legacy Refactor Me]] Please! Anyways I was thinking maybe you could subclass svehicle or ONSvehicle or one of those and since those are pawns, which use skeletal anims and karma, maybe you could make the player use a pawn and hope in then when you get KO'd you hope out of the vehicle, play KO stuff, then hop back in. Just an idea anyways Im not really skilled at uscript, yet hehe, so i'm not going to attempt this, yet hehe. Well feel free to give me what for if I dunno what Im talking about.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4046</id>
      <timestamp>2006-02-02T12:18:17Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>save the next person having to read the whole thing to find it's not a simple recipe.</comment>
      <text xml:space="preserve">'''Note to reader:''' This page represents an incomplete ''investigation'' into switching players' pawns into and out of ragdoll mode.  Some considerable mileage was made but the implementation does not work in network play.

----

(Note: this text cut from [[Legacy:Karma Ragdoll|Karma Ragdoll]].  Karma Ragdoll should be definition and description.  All these ideas deserve their own page).

This is an idea first proposed on the Wiki by Soldat. Essentially, the idea is that when a player is damaged by a weapon, they will go into Karma Ragdoll mode for a brief period, depending on the severity of the hit, and then get back up. So, for instance, a hit from an assault rifle may merely cause you to stumble for a split second before regaining control while a direct hit from a rocket would send you through the air to end up as a heap on the ground, which (if still alive) would then attempt to crawl back up onto its feet. Soldat came up with the following function which will activate the Ragdoll Physics on a Pawn. It needs to be placed in a subclass of Pawn or called on the Pawn externally (it would require some modification to do that, but could be modified to work in a mutators' damage modification function):

&lt;uscript&gt;
exec function KarmaMe()
{
  local KarmaParamsSkel SkelParams;
  local String RagSkelName;

  RagSkelName = Species.static.GetRagSkelName(GetMeshName());
  KMakeRagdollAvailable();                                    // allocate a space for the incoming ragdoll

  skelParams = KarmaParamsSkel(KParams);                      // create a new skelParams object based off current KParams
  skelParams.KSkeleton = RagSkelName;                         // with our new ragdoll
  KParams = skelParams;                                       // and now, voila! KParams is the new skelParams

  KSetBlockKarma(true);                                       // without this line, I fall THROUGH the floor... gross

  SetPhysics(PHYS_KarmaRagdoll);                              // actually create the ragdoll
}
&lt;/uscript&gt;

While a neat system, and easy enough to get implemented mostly, it has run into a slight problem: neither Soldat nor myself (I am also trying to implement this, though slightly differently, for my mod) has been able to find a &quot;perfect&quot; way to get the player to get back up after becoming a ragdoll. I have merged our attempts into a single list and described why each did not work quite as planned:

====Removing the Actors Skeleton/Resetting the Karma Parameters, and changing Physics back to PHYS_Walking ====

&lt;uscript&gt;
exec function UnKarmaMe()
{
	KarmaParamsSkel(KParams).KSkeleton = &quot;&quot;;

	SetPhysics(PHYS_Walking);
}

exec function UnKarmaMe2()
{
	KParams = default.KParams;

	SetPhysics(PHYS_Walking);
}&lt;/uscript&gt;

Though in effect the same thing (Removing the Skeleton and Setting the Karma Parameters back to default) it was worth trying both. Neither had any effect. When the physics was set back to PHYS_Walking, the player fell through the floor and out of the world. This was later found to be a result of Karma Ragdoll simulation disabling the regular physics' collision in order to use its own. Setting bCollideWorld to true when you set the physics back to PHYS_Walking will prevent the player from falling through the floor, but it still won't get back up or do anything except look around and shoot. (Because its &quot;state&quot; hasn't changed in the Pawn class, it still thinks it's walking.) However, no animations will play and it will not move anywhere.

====Freezing the Ragdoll====

&lt;uscript&gt;
exec function UnKarmaMe3()
{
	KFreezeRagdoll();

	SetPhysics(PHYS_Walking);
}
&lt;/uscript&gt;

This was tried by Soldat and caused the ragdoll to freeze. Aside from not falling into the floor, this was no more successful than removing the skeleton.

====Spawn a New Pawn above the Ragdoll ====

Soldat's initial idea was to simply destroy the ragdoll and spawn a new pawn on top of where the ragdoll used to be. The problem with this, was that it would telefrag anyone the ragdoll fell under. Another problem was that it didn't have a cool animation to show the person getting back up. :P The telefragging was solved with a suggestion from Mysterial and expanded by CheshireCat to disable the collision on the new pawn until it was no longer touching anyone else, then reenable it. The only existing problem with this method is that there is no real smooth way of showing the player get back up. As I understand, this is the current method that Soldat is experimenting with.

===Animating a Ragdoll===

A short study revealed that merely setting the Physics to PHYS_KarmaRagdoll with cause serious problems with animation and will prevent any animations from being played, even if physics is reset to PHYS_Walking immediately after the call to change it to PHYS_KarmaRagdoll. In other words, the pawn does not have to spend any time being a ragdoll to cause this effect. I am still researching this find out a way to get animations to work after returning the physics to normal. Soldat (I believe) is using the last method detailed above (making a new pawn to replace the old one) and is trying to find a way to make it look like the new pawn is actually the old pawn getting up.

==Discussion==

'''Foxpaw:''' This page has been mainly refactored from [[Legacy:Words About Karma Ragdoll Deaths|Words About Karma Ragdoll Deaths]] along with some stuff I wrote myself. Credit for all of the ideas provided has been given to their respective authors, I believe. I hope I didn't leave anyone out. By the way, Soldat, I had an idea - you may be able to set the person to a crouching idle animation and tween to a standing animation, then, you could make it so when the player lands flat on the ground, it kicks up a dust cloud or something like that, that would obscure the jump from lying down to the crouching position. Let me know how that turns out if you try it, I'm going to continue working on a way to get the original pawn to move again.

'''Foxpaw:''' Eureka! I've gotten the thing to animate again after returning from ragdoll mode. It wipes out the current position and replaces it with the default but at least it doesn't require spawning a new pawn and moving over all of the health, etc. from it. All you have to do is change the mesh. So basically, call something like the following:

&lt;uscript&gt;
// Reenables animations after returning from Karma Ragdoll simulation. Requires a global
// variable SafeMesh, which is a mesh object which we can be guaranteed that this object
// is not. If we try to do this with the same mesh that we are it will not work, therefore,
// it is imperative that a player never be the mesh stored in safemesh. An alternative
// is to have two &quot;safe meshes&quot; and check to see if the players mesh == the first safemesh,
// if so use the second safemesh. Otherwise just use the first. This function assumes a
// safemesh that is guaranteed to never be what the player is set to.
function ReinitializeMesh()
{
  local Mesh OldMesh;

  OldMesh = Mesh;
  LinkMesh( SafeMesh );
  LinkMesh( OldMesh );

  return;
}
&lt;/uscript&gt;

I also noticed that you must be careful to not engage the ragdoll simulation for too short of a time. When ragdoll simulation first begins, your limbs are all concentrated in one spot and they spread out until they are in the correct position. This takes only a fraction of a second, though it may vary on different computers. If you try to use the karma injury system for something mild like a glancing blow that just moves you for a split second it will make you turn into a ball of limbs instead!

'''Foxpaw:''' I noticed a small problem, but it may be solveable by a bit of number fudging. The momentum imparted by various weapons varies immensely. Assault Rifle and Lightning gun are only 1, minigun is 1200, each flak shard is 10000, rockets are 50000, shock gun primary 60000, flak grenades 75000, and the shock combo in excess of 130000. The problem, here, of course, is if I set it up so that a rocket puts him down for 3 seconds, he's out like a light if he gets hit by a shock combo. If, however, it's set so that a shock combo merely keeps him out for 5 seconds, the minigun/AR/lightning gun do diddly squat. Aside from the fact that you have to wait a while for the target to recover, it's pretty fun. I did notice a couple of things though: A) your ragdoll assumes you were standing. Getting ragdolled while crouching does not produce the same effect. B) Ragdolls have a tendancy to &quot;fall through&quot; very thin surfaces. (IE A 'grate' over a pit of slime)  Though cool, the pawn gets stuck when it recovers. This occurs with my &quot;pawns&quot;, regular pawns may act differently.

'''Chema:''' Great! and... weird!!  I had been trying the UnKarma stuff for a few days.  I also got stuck by the animation.  Here is a full (I think) UnKarmaMe(), incluiding the double mesh link:

&lt;uscript&gt;
exec function UnKarmaMe()
{
	local Mesh OldMesh;

	SetPhysics(PHYS_Walking);	// Reset physics
	bCollideWorld = true;		// And world collision
								// (KActors use	KSetBlockKarma for that)
	SetCollision(true, true , true); // Block actors and players again

	OldMesh = Mesh;
	LinkMesh( SafeMesh );		// Global mesh, you will not see it
	LinkMesh( OldMesh );		// This puts your mesh back
}
&lt;/uscript&gt;

The doble mesh link is really weird, but works.  And it is dificult to find what to do whit all those native functions, wich we don't have an idea what really do.

Now, to fix the abrupt standing, we could try an immediate crouch, or better, I saw somewhere a function to initialize the mesh anim before spawn.

'''Foxpaw:''' My pawn comes up in the crouching position. It was as simple as adding PlayAnim( 'Crouch' ); after you relink the oldmesh. (I'm pretty sure that those parameters are optional. I use a wrapper for animation with my &quot;pawns,&quot; so my syntax is slightly different.)The real problem is not the starting animation, but how to get the starting animation to be something very close to what the ragdoll was using, I think. I have had ragdolls get their foot caught in tiles on the floor and not end up falling over, just kind of going limp - in that instance the standing is better. I've been experimenting the the dark magic of manual skeleton rotation - I have a hunch but I'm not quite sure how I'll go about it. If you could read the rotation of all of the bones, you could manually set them after relinking the mesh and then from there tween to an animation. However, obtaining the bones rotation is not as simple as calling the GetBoneRotation, as that only returns the rotation relative to where the current animation says that it should be. Bones seem to use a haphazard mix of absolute and relative locations and rotations, as well as even having their own internal coordinate system for each bone! For that reason it's a bit confusing. [[Legacy:Skeletal Mesh|Skeletal Mesh]] has a listing of skeletal animation functions and a short description of those that I have experimented with. Unforunately, I haven't played with all of the parameters of the functions. There's another interesting thing that should be considered, but maybe this is only a problem with the juggernaut skeleton that I'm using: The juggernaut skeleton has an overwhelming tendancy to fall to its knees, then fall flat to its face. This may be because of the limits on the bones though. It generally performs this if hit by a &quot;singular, direct&quot; type of attack, like a direct hit from rocket, shock rifle, etc. Multiple-hit type weapons like flak work fine, and if a rocket hits the ground nearby the results are believable. One more thing. My pawns don't have this problem because of the way that they are scripted, but the built in pawns suffer a set amount of impulse whenever they get hit as a ragdoll. It does not use the actual momentum of the gun, and I don't think it applies it to the actual bone hit either. The following is a slighly modified excerpt from the code I use (the code I use is in an else block and has an argument Bone instead of declaring it.)

&lt;uscript&gt;
  local float Dummy; // Just to satisfy an out argument.
  local name Bone;

  if ( Physics == PHYS_KarmaRagdoll )
  {
    Bone = GetClosestBone( HitLocation, Normal(Momentum), Dummy );
    KAddImpulse(momentum, hitlocation, Bone);
  }

  // If you wanted you could collapse this to take up less space you could also just do:
  local float Dummy; // Just to satisfy an out argument.

  if ( Physics == PHYS_KarmaRagdoll )
    KAddImpulse(momentum, hitlocation, GetClosestBone( HitLocation, Normal(Momentum), Dummy ));
&lt;/uscript&gt;

I have no idea why Digital Extremes used that RagSkelVel and SkelParams.KShotStrength nonsense. This looks way more ragdollish and much cooler as it allows for multiple sources of force to be acting in rapid succession. IE when you get nailed at close range with the flak cannon. (Of course you probrably wouldn't survive anyways but maybe if you had lots of shields and health)

'''Foxpaw:''' I got the getting up part a bit better. Your position on the ground is now recreated once the mesh is reset, but only on key bones. So now I'm a running dilapitated pile of crumpled up bones. :P I'll try to find an efficient way to tween out the dilapitatedness into normal movement.

'''Chema:''' Houston, I can get up... but can't crouch!  

Adding PlayAnim( 'Crouch' ); to UnKarmaMe doesn't work.  Actually, it works normally, but not when I'm Karmed: I stand up, but don't crouch.  If I call UnKarmaMe again, from console, then it works.  Simply put: I can't animate the mesh in the same call that UnKarmaMe, no matter if I put in a different function.  

Any idea whats wrong with me?  And with my code? (hehe). Are you doing anything special apart of the stuff in the previous UnKarmaMe()?  I'm setting my TestxPawn trough the URL (dm-gael?Game=Test.TestGame?Class=Test.TestxPawn), but there should be a scripted way to do it for a game.  An equivalent of the CheckReplacement of the Mutators? (Thanks for all your help!)

'''Foxpaw:''' It may be that the animation won't play on the same call. As you may have noticed, (maybe, it's kind of hard to see.) For a short time after becoming a ragdoll you are just a ball of concentrated body parts. It is possible that your ragdollness persists until the next tick. Or something. The 'personnell' on my mod are completely custom - I've written my own classes for everything below actor, because Pawns have lots of built in junk. :P It has an attached &quot;Mesh Controller&quot; which monitors animation, etc. and would play the idling animation the next opportunity it got... so if it cannot indeed be called from the same function it would try again the next tick. That may be why mine goes back to the idling animation while yours requires a second call. I believe that you can use checkreplacement in mutators to replace your xpawn with the one you have made.. I haven't tested it but I believe that you can because I think that checkreplacement is called from within spawn, before the controller would make its Possess call, which I believe does not occur until after the spawn has returned. I haven't tested that part out, the order that the controller stuff goes in because I just wrap the controller class, so I don't really use it for anything.

'''Foxpaw:''' I noticed another thing, but it might not be a big deal for your application. If you really clobber a ragdoll sometimes it will suffer a simerror as a result of its joints being spun so fast. This will, by default, result in it being destroyed - definately a bad thing if the player was merely injured! You can set bDestroyOnSimError in its KParams to prevent this, but it doesn't protect against everything. bKImportantRagdoll (maybe doesn't have a K, I don't remember for sure) might also be good because it prevents the ragdoll from being destroyed if the system runs low on memory and wants to make a new ragdoll. The simerror thing may not apply in your application, because generally that will only result from things such as flak to the head at point blank or similar events, which would kill the pawn anyway. It might also be worth investigating what effects mutators that affect the ragdolls will have. I'm not sure about Floaty Cadavers, but I know that Slow Motion Corpses works by slowing down the entire Karma Ragdoll simulation system. This would slow down injured players as well. I don't know if that's a problem or not, but it's worth checking out.

'''OBWANDO:''' I took a few hours fighting with this, and it wouldnt work at all in any way. Heres what I found... If you want to get the pawns to go back to their original animated mesh, you need to link with another VALID different mesh. If you try to link with a null or non-specified mesh, it will simply not link at all which then you will wind up linking the original named mesh and that does absolutely nothing. In the end heres what seemed to work for me:

In my pawn class (RBxPawn.uc):

&lt;uscript&gt;

var	(Global) mesh SafeMesh;

exec function KarmaMe()
{
  local KarmaParamsSkel SkelParams;
  local String RagSkelName;

  SafeMesh = Mesh;                                            // This is where I am getting the pawn's original mesh
  RagSkelName = Species.static.GetRagSkelName(GetMeshName());
  KMakeRagdollAvailable();                                    // allocate a space for the incoming ragdoll

  skelParams = KarmaParamsSkel(KParams);                      // create a new skelParams object based off current KParams
  skelParams.KSkeleton = RagSkelName;                         // with our new ragdoll
  KParams = skelParams;                                       // and now, voila! KParams is the new skelParams

  KSetBlockKarma(true);                                        // without this line, I fall THROUGH the floor... gross

  SetPhysics(PHYS_KarmaRagdoll);                              // actually create the ragdoll
}

exec function UnKarmaMe()
{
  KarmaParamsSkel(KParams).KSkeleton = &quot;&quot;;

  SetPhysics(PHYS_Walking);        // Reset physics
  bCollideWorld = true;            // And world collision
                                         // (KActors use KSetBlockKarma for that)
  SetCollision(true, true , true); // Block actors and players again

  LinkMesh( SkeletalMesh'Weapons.AssaultRifle_1st' );  // I am using a valid mesh which is not the same as the pawn's original mesh
                                   // You should probably use a precached mesh for performance reasons, the gun seemed good here
  LinkMesh( SafeMesh );	         // Link the pawn's original mesh and we're done!
}
&lt;/uscript&gt;

'''Foxpaw:''' I believe that is the same as what I wrote above. SafeMesh DOES need to be defined as a mesh, I guess I should have explicitly stated that. The OldMesh is the mesh that we want to return to and is read in the unkarmatize function on my &quot;livingthing&quot; class. (This is the &quot;livingthing&quot; equivalent of the unkarmame function.) I could have sworn we discussed the idea of using two safemeshes in case, for whatever reason, the pawn was using one of those meshes, I don't see that anywhere on this page though so maybe I just imagined it. :P Should we remove the failed attempts listed above or leave them so others can learn that those methods don't work and why the didn't work?

'''OBWANDO:''' I would say leave it in place, it shows the evolution of the learning curve to a final conclusion. You did mention (or i assumed) that there were 2 safemeshes, but I did not know that 1 had to be explicitly defined, and that was what threw me, and could others. I wouldn't have made it this far without everything being available to read.

'''Foxpaw:''' Okay. Both safemeshes would actually need to be defined, but you can usually get away with using just one, depending on the application. In this instance it's highly unlikely that a pawn would have a first person weapon mesh as their mesh so you could get away with the way you did it. 

'''Foxpaw:''' I've noticed one small issue but it's not that big of a deal. If you rotate bones using Unrealscript, the karma ragdoll is not rotated appropriately. The visual representation of it is, but the actual collision/simulation information remains unchanged. That's probrably not a big issue, I've been experimenting with rotating bones to have the player &quot;get back up&quot; from whatever position they ended up in. In this instance, the simulation can be slightly innaccurate if you are hit again while getting up.

'''Foxpaw:''' I almost forgot - there's a big problem with this code, but it might not be that hard to work around. There's a limit on the number of ragdolls that you can have in play at any time. I believe it may be per zone, however. The limit appears to be rather low, unfortunately, approximately 3 ragdolls per zone. If you had two carcasses and two injured players, one would be denied a ragdoll and would just stand still. You could work around this by using the IsRagdollAvailible, and if one is not the player could just play some other injury animation and be simulated using regular physics.

'''OBWANDO:''' I agree, I listed a piece of simple code to get the idea, but to prevent the problems from occuring here is a small snip that you could use as well to combat the problems of unavailability.

&lt;uscript&gt;
exec function KarmaMe()
{
  local KarmaParamsSkel SkelParams;
  local String RagSkelName;

  SafeMesh = Mesh;                                            // This is where I am getting the pawn's original mesh

  if( RagdollOverride != &quot;&quot;)                                  // Try to get the rag-doll setup.
  	RagSkelName = RagdollOverride;                        // If there is an override, use it first
  else if(Species != None)                                    // if not, use species.
  	RagSkelName = Species.static.GetRagSkelName( GetMeshName() );

  if( RagSkelName != &quot;&quot; )                                         // If we did find one, try to allocate the space.
  {
  	KMakeRagdollAvailable();                                  // allocate a space for the incoming ragdoll
  }
  	
  if( KIsRagdollAvailable() &amp;&amp; RagSkelName != &quot;&quot; )
  {  
    skelParams = KarmaParamsSkel(KParams);                    // create a new skelParams object based off current KParams
    skelParams.KSkeleton = RagSkelName;                       // with our new ragdoll
    KParams = skelParams;                                     // and now, voila! KParams is the new skelParams
  
    KSetBlockKarma(true);                                     // without this line, I fall THROUGH the floor... gross
  
    SetPhysics(PHYS_KarmaRagdoll);                            // actually create the ragdoll
  }
}
&lt;/uscript&gt;

'''OBWANDO:''' One thing I have noticed that that you can crash the client pretty easily if you try to do this in a dedicated network mode. On a local client there are no problems, but from what I have seen, a dedicated server will not allow the physics to change to ragdoll, so your client will show a ragdoll, but your server will still show the last known physics mode (like PHYS_Walking, or PHYS_Falling). Maybe we should look at starting a thread or page on network implementation.

'''Foxpaw:''' I don't understand what you mean by that.. how do you mean the server will &quot;show&quot; the last known physics mode, if it is a dedicated server? The server/client problem you are having is likely due to the KarmaMe function not being replicated.. or something like that. I haven't tested mine over network yet but it is set to be triggered when hit, if the imparted momentum is over a certain threshold. I am not sure how the autonomous proxy treats exec functions so the problem could be with that. If you want to ensure that the ragdolling is consistant on both client and server you could have a boolean variable that is replicated reliably from server to client, and a check in tick - if the variable is true and we are not in PHYS_KarmaRagdoll, then call the KarmaMe function, if the variable is false and we are in PHYS_KarmaRagdoll, then call the UnKarmaMe function. This, of course, would require those functions split into two pieces because you wouldn't want to call an exec function and have the cause the server to request that same function to be called on the client, which would then cause the server to request that same function to be called on the client again, etc. Enough talk! :P The implementation could be something like this: (I didn't actually compile and test this, there could be typos. It would also maybe need some tweaking to allow for running out of ragdolls. You could use a timer or whatever you want for unkarmame. I use a manually implemented timer in tick.)

&lt;uscript&gt;
var bool bIsRagdolling;
var float RagdollThreshold;

replication
{
  reliable if ( ROLE==ROLE_Authority )
    bIsRagdolling;
}

simulated function TakeDamage(int Damage, Pawn Instigator, Vector HitLocation, Vector Momentum, class&lt;DamageType&gt; DamageType)
{
  Super.TakeDamage(Damage, Instigator, HitLocation, Momentum, DamageType);
  if (Role == ROLE_Authority &amp;&amp; VSize(Momentum) &gt; RagdollThreshold)
    bIsRagdolling = true;
}

simulated function Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (Role &lt; ROLE_Authority)
    if (bIsRagdolling &amp;&amp; Physics != PHYS_KarmaRagdoll)
      KarmaMe();
    else if (!bIsRagdolling &amp;&amp; Physics == PHYS_KarmaRagdoll)
      UnKarmaMe();
}


simulated function KarmaMe()
{
  // Do your karmame stuff here.
}

simulated function UnKarmaMe()
{
  // Do your unkarmame stuff here.
}

&lt;/uscript&gt;

'''OBWANDO:''' Heres what I've seen. In most of the Epic code, you will see that they have the karma sequences set up so that the server's pawn doesnt actually get its physics set into KarmaRagdoll mode (Level.NetMode != NM_DedicatedServer). Only the client does. Now this may seem simple in theory, but the reality is that if you touch a floor surface, or its a bot (or a player) that jumps then the physics on the server will change and as a result the physics from the server will be replicated as part of the normal parent class replication to that physics mode. Thats where the problems begin since on the client you are in KarmaRagdoll, and the server replicates a PHYS_Walking, or whatever, but its not Ragdoll, so the client crashes since you cannot have a walking pawn that is in PHYS_KarmaRagdoll. This means you have to address the problem to prevent the client from getting the physics change unless you have restored the physics and mesh back and are ready for that PHYS mode.

'''Foxpaw:''' Ah, yes. The ragdolls aren't simulated on the server usually because that just wastes resources. They are &quot;torn off&quot; when they are created, so they cease to replicate. I think that the implementation I listed above should work.. I hope. I haven't tested that or played around with it, I don't really know all of the nuances of the pawn class since I don't use it for anything, but it seems logical.

'''Foxpaw:''' Apparently, the limit placed on ragdolls is optional. If you just remove the MakeRagdollAvailible part and the IsRagdollAvailible check, you can apparently make as many ragdolls as you want. Finally, my battlefields can have carcasses littered all around, instead of that stupid de-res thing. :P

'''PlaneGuy:''' I tried the MP ragdoll code above, but it still crashes. I was thinking if being ragdolled is a state, you can set the pawn to ignore any non-ragdoll/karma related action in that state. Thoughts?

'''OBWANDO:''' Here is the code I created that successfully works. I used a manual timer since the SetTimer was too flaky for me. The server first of all is the only one that will REALLY know what mode our client is supposed to be in. When we are ragdolling, we should probably prevent the bots from moving the ragdoll, or when we come back out, the client will show the pawn pretty far away from where it should have been. and most importantly, we need to make sure the client does not try to change the physics via update from the server.

&lt;uscript&gt;
var bool bKarma; // server paramater to client if you need to be set to karma mode
var bool bInKarma; // server parameter letting the client know to override any physics changes to karma.
var bool bTickMe; // my tick timer boolean
var bool bClKarma; // the client flag that lets us know that the client is indeed in karma mode. (remember Physics will be changed from replication)
var int	iTickTime; // a timer counter since SetTimer was too flaky to use over network.

replication
{
	reliable if (Role == ROLE_Authority )
		bKarma, bInKarma;
}

simulated event PostNetReceive()
{
	if ( PlayerReplicationInfo != None )
    {
		Setup(class'xUtil'.static.FindPlayerRecord(PlayerReplicationInfo.CharacterName));
		if ( AmbientGlow == 70 )
			AmbientGlow = Default.AmbientGlow;
        //bNetNotify = false;
    }

	if ( (bInKarma == false) &amp;&amp; (bKarma == false) &amp;&amp; (Physics == PHYS_KarmaRagdoll) ) UnKarmaMe(); // ok release karma mode go back to a pawn

}

simulated function Tick(float DeltaTime)
{
    if (Role == ROLE_Authority ) {
	if (bTickMe) {
		iTickTime--;
		if (iTickTime &lt; 1) {
			bTickMe = false;
			UnKarmaMe();
		}
	}
    }

    if ( (bInKarma &amp;&amp; !bTearOff) ) // if we're in karma, but not dead, prevent player induced motion from occuring.
    {
	Acceleration = vect(0,0,0);
	Velocity = vect(0,0,0);
    }
    if ( (Physics != PHYS_KarmaRagdoll) &amp;&amp; (bKarma == true) &amp;&amp; (bInKarma == false) ) KarmaMe(); //set the Ragdoll Mode

    if ( Level.NetMode == NM_DedicatedServer )
  		return;
  //****** ONLY LOCAL AND CLIENT STUFF BELOW HERE

    if ( (Physics != PHYS_KarmaRagdoll) &amp;&amp; (bClKarma == false) &amp;&amp; (bInKarma == true) ) KarmaMe(); //Seems replication isnt perfect, so lets make sure

    if ( Controller != None ) OldController = Controller;

    if ( (bInKarma == true) &amp;&amp; (bKarma == false) &amp;&amp; (Physics != PHYS_KarmaRagdoll) ) SetPhysics(PHYS_KarmaRagdoll); // Enforce Ragdoll on clients

    TickFX(DeltaTime);

    if ( bDeRes )
    {
        TickDeRes(DeltaTime);
    }
    // assume dead if bTearOff - for remote clients unfff unfff
    if ( bTearOff )
    {
        if ( !bPlayedDeath )
            PlayDying(HitDamageType, TakeHitLocation);
        return;
    }

}

simulated function UnKarmaMe()
{
	if (ROLE != Role_Authority) {
		
		KarmaParamsSkel(KParams).KSkeleton = &quot;&quot;;
		SetPhysics(PHYS_Falling);   // Reset physics
		bCollideWorld = true;       // And world collision
									// (KActors use KSetBlockKarma for that)
		SetCollision(true, true , true); // Block actors and players again
		
		LinkMesh( SkeletalMesh'Weapons.AssaultRifle_1st' );
		LinkMesh( SafeMesh );
		bClKarma = false;
	} 

	if ( Role == ROLE_Authority ) { //servers set the parameters

		bKarma = false;
		bInKarma = false;
	}
}
&lt;/uscript&gt;

In your KarmaMe() routine, add this to your karma code:

&lt;uscript&gt;
	if (ROLE == Role_Authority) 
	{
		bKarma = false;
		bInKarma = true;
	}
	if ( Level.NetMode != NM_DedicatedServer )
	}

... karma code etc...

	     SetPhysics(PHYS_KarmaRagdoll);
	     bClKarma = true; // dont forget to let its own client know its mesh should stay in karma mode.
	}
&lt;/uscript&gt;

Remember, you need to set the bClKarma on the client only, the server has no idea as to what that boolean parameter is.

So why check for unkarma in PostNetReceive? Simple, I need to check when it changes, and not every tick. Since normally you are not in karma, and you're karma flag is false when you are playing, no point tying up CPU cycles testing a scenario that can be predicted from the server.

When you are ready to invoke the karma mode, use this piece of code:

&lt;uscript&gt;
	if (Role == ROLE_Authority ) // we need to set the karma ragdoll time and flag true if applicable on server only
	{
		if ( (bKarma == false) &amp;&amp; (bInKarma == false) ) { // if you're already in karma mode, no need to do it agin.
			bKarma=true;
		}
		iTickTime = iTickTime + vSize(momentum)/30; // or whatever you want to use.
		bTickMe = true;
	}
&lt;/uscript&gt;

I use it in my TakeDamage function. 

One last thing, in you class add these to your defaultproperties:

&lt;uscript&gt;
defaultproperties
{
	bKarma = false
	bInKarma= false
	bAlwaysRelevant=True // should already be set if its a pawn
	bGameRelevant=True // i believe same here as above
	bTickMe = false
	iTickTime = 0
	bNetNotify=true // important 
	bClKarma = false
}
&lt;/uscript&gt;

Hopefully this will shed some light on the karna networking topic and get more mods looking and feeling realistic. I will add my code soon that will allow for you to successfully get your pawn back up correctly using bone lifters, and timing (notice I set the timer from the momentum parm in the takedamage function). I'm sure the code could be optimized and done in many ways, but it works, and its something to start from.

Good luck, and if you have any questions post em, or look for me on IRC... im usually around in #unrealwiki, #unrealed, or #unrealscript.

'''Foxpaw:''' I would not recommend using bone lifters for the &quot;getting back up&quot; portion.. bone lifters require collision to be disabled, effectively making the player invulnerable while recovering. It would also be kind of wierd looking. I think that tweening from the dead body position back to crouching animation would be better and is probrably quite possible.

'''Foxpaw:''' I got tweening back to animation to &quot;work.&quot; So far it doesn't look all that natural though. I have an idea how to make it more natural but I'd like to do so without any hacks.

'''Foxpaw:''' Improved the tweening.. making it faster makes the wierd nuances unnoticeable and bringing them back to the crouched position instead of standing helped as well. Now I only have one problem: the relinking of the mesh starts the person off in a standing position. This causes the person to tween from standing to crouching when they get up which looks a bit wierd. I know how I could probrably fix that but it's a hack, so I don't want to do it that way. Any ideas of how I could do this cleanly?

'''OBWANDO:''' Drop some code in here, lets take a look. I was playing with LinkSkelAnim( (anim), (mesh) ) instead of LinkMesh. Its a native as well, but from what I see in the actor.uc, it will start the mesh up in that animation.

'''Foxpaw:''' Unfortunately, since my class heirarchy is completely different, the function calls, etcetera will be different. I'll put the contents of the &quot;skeletoncontroller&quot; class here anyway, you can probrably see the idea. An explanation would probrably serve you better: When we return from ragdolling, before relinking the mesh we read the orientation of all of the main bones, using GetBoneCoords. The X axis of that coordinate system that it returns is a vector pointing along the length of the bone, thus giving us its rotation. I store this information, relink the meshes, then use SetBoneDirection to recreate the ragdoll's position after the relinking. The SetBoneDirection has an alpha parameter that allows us to define how much of that direction should be imposed and how much should be left to SetBoneRotation/the animations. By tweening the alpha from 1 to 0 always with the same directions, the body will go from its ragdolled position to the position dictated by its animation over the course of the time that it takes to tween the alpha. This can create wierd effects if you do it slowly, though, because of the bone heirarchy and all. If done quickly enough, however, it appears fairly smooth. The only problem with this setup is that it uses some fair network bandwidth, because for some reason setbonedirection is not simulated, even though SetBoneRotation is.

There are some functions that are not related to the ragdolling in here, and some interplay with a class &quot;UniversalThing&quot; and &quot;SkeletalMeshController,&quot; but you should be able to get the idea from this:

&lt;uscript&gt;
// The skeleton of a skeletal mesh.
class SkeletonController extends UniversalThing notplaceable;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

struct BoneData                                 // A stored bone structure, used for ragdoll recovery.
{
  var name      BoneName;                       // The name of this bone.
  var coords    BoneCoords;                     // The 'coordinates' of this bone.
  var rotator   Rotation;                       // The current added rotation of this bone.
};

struct TweenBoneDirection
{
  var name      BoneName;                       // The name of the bone.
  var rotator   Direction;                      // The direction of the bone.
  var float     TweenTime;                      // Time remaining to tween.
  var float     StartTweenTime;                 // How long to tween in total.
};

var Mesh                SafeMesh1, SafeMesh2;   // TODO: This is duplicated in the meshcontroller.

var array&lt;BoneData&gt;     Bones;
var array&lt;TweenBoneDirection&gt; BoneTweenData;    // Data for tweening of bone directions.

var array&lt;name&gt;         BoneNames;              // Important bones that will be retained through ragdoll recovery.
var array&lt;name&gt;         AimBones;               // Bones that take part in aiming.

var name                HeldBone;               // Bone that we use for holding things.
var name                ViewBone;               // Bone that the camera should view from.

var actor               Flesh;                  // Our &quot;flesh.&quot;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function postbeginplay()
{
  Super.postbeginplay();
}

simulated function Initialize()
{
  local int i;
  
  Flesh.AnimBlendParams(1, 1.0, 0.0, 0.2, AimBones[0]);

  for (i=0;i&lt;BoneNames.Length;i++)
    SetBoneRot( BoneNames[i], Rot(0,0,0) );
}

simulated function BoneData StoreBone( name BoneName )
{
  local BoneData NewBone;
  
  if ( Flesh == None ) return NewBone;

  NewBone.BoneName = BoneName;
  NewBone.BoneCoords = Flesh.GetBoneCoords( BoneName );
  
  return NewBone;
}

simulated function array&lt;BoneData&gt; StoreBoneData()
{
  local int i;
  local array&lt;BoneData&gt; BoneData;
  
  if ( Flesh == None ) return BoneData;

  for (i=0;i&lt;Default.BoneNames.Length;i++)
    BoneData[BoneData.Length] = StoreBone( Default.BoneNames[i] );
    
  return BoneData;
}


// Set me back up for animation after I've ragdolled.
simulated function SolidifyRagdoll()
{
  local array&lt;BoneData&gt; BoneData;
  
  if ( Flesh == None ) return;
  
  BoneData = StoreBoneData();
  
  if ( ( Flesh.Mesh == Default.SafeMesh1 || Default.SafeMesh1 == None ) &amp;&amp; ( Default.SafeMesh2 != None ) )
    Flesh.LinkMesh( Default.SafeMesh2 );
  else if ( Default.SafeMesh1 != None )
    Flesh.LinkMesh( Default.SafeMesh1 );
    
  if ( UniversalThing( Flesh ) != None )
    UniversalThing(Flesh).InitializeMesh();
  
  RecoverBoneData( BoneData );
}

simulated function RecoverBoneData( array&lt;BoneData&gt; BoneData )
{
  local int i;
  
  if ( Flesh == None ) return;

  for (i=0;i&lt;BoneData.Length;i++)
    RecoverBone( BoneData[i] );
}

simulated function RecoverBone( BoneData BoneData )
{
  if ( Flesh == None ) return;

  Flesh.SetBoneLocation( BoneData.BoneName, BoneData.BoneCoords.Origin );
  SetBoneDir( BoneData.BoneName, Rotator( BoneData.BoneCoords.XAxis ),0.25 );
}

simulated function TweakBoneRotation( name BoneName, out rotator Rot )
{
  if ( BoneName == HeldBone )
    Rot += Rot(16384,0,0);

  ///// Note: This function is best described as a &quot;hack.&quot; It allows a meshcontroller to
  ///// manually override bone directions by assigning a fixed direction to them. It will
  ///// not work properly on bones that take part in aiming, etc. It merely exists as a
  ///// method to retrofit existing models with bones in wierd orientations.
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function SetAim( rotator Aim )
{
  local int i;
 
  if ( Flesh == None ) return;

  // TODO: Hackriffic. Make the transormation matrix confusitroniness. Maybe make a &quot;skeleton&quot; class,
  // which would be owned by the Thing, that stores our current animation positions. Technically that
  // should go here so maybe the meshcontroller could be instantiated.
  Flesh.SetRotation( Aim );
  
  Aim -= Flesh.Rotation;

  for (i=0;i&lt;Default.AimBones.Length;i++)
  {
    Aim.Roll =  Aim.Yaw;
    Aim.Yaw  = -Aim.Pitch;
    Aim.Pitch = 0;
    SetBoneRot( Default.AimBones[i], Aim / Default.AimBones.Length );
  }
  
  return;
}

simulated function vector FindBoneLocation( name Bone, optional out vector Rot )
{
  local Coords Coords;
  
  if ( Flesh == None || Bone == '' ) return Vect(0,0,0);
  
  Coords = Flesh.GetBoneCoords( Bone );
  Rot = Coords.XAxis;
  return Coords.Origin;
}

simulated function rotator FindBoneRotation( name Bone )
{
  if ( Flesh == None || Bone == '' ) return Rot(0,0,0);

  return Flesh.GetBoneRotation( Bone );
}

// TODO: This function name is misleading.
simulated function vector FindHeldLocation( optional out vector Rot )
{
  if ( Flesh == None || Default.HeldBone == '' ) return Vect(0,0,0);

  return FindBoneLocation( Default.HeldBone, Rot );
}

// TODO: This function name is misleading.
simulated function vector FindHeldRotation( optional out vector Loc )
{
  if ( Flesh == None || Default.HeldBone == '' ) return Vect(0,0,0);

  Loc = FindBoneLocation( Default.HeldBone );
  return Vector( FindBoneRotation( Default.HeldBone ) );
}

simulated function SetBoneRot( name BoneName, rotator Rot )
{
  if ( Flesh == None ) return;
  TweakBoneRotation( BoneName, Rot );
  Flesh.SetBoneRotation( BoneName, Rot );
}

function SetBoneDir( name BoneName, rotator Dir, optional float TweenTime )
{
  local TweenBoneDirection NewTween;
  
  if ( Flesh == None ) return;

  if ( TweenTime != 0 )
  {
    NewTween.BoneName = BoneName;
    NewTween.Direction = Dir;
    NewTween.TweenTime = TweenTime;
    NewTween.StartTweenTime = TweenTime;
    BoneTweenData[BoneTweenData.Length] = NewTween;
  }
  
  Flesh.SetBoneDirection( BoneName, Dir,,1 );
}

function bool TweenBone( out TweenBoneDirection BoneData, float Delta )
{
  local bool Result;
  Result = false;
  
  if ( Flesh == None ) return Result;

  BoneData.TweenTime -= Delta;
  if ( BoneData.TweenTime &lt; 0 )
  {
    BoneData.TweenTime = 0;
    Result = true;
  }

  Flesh.SetBoneDirection( BoneData.BoneName, BoneData.Direction,,BoneData.TweenTime/BoneData.StartTweenTime );
  
  return Result;
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function Tick( float Delta )
{
  local int i;
  
  for (i=0;i&lt;BoneTweenData.Length;i++)
    if ( TweenBone( BoneTweenData[i], Delta ) )
      BoneTweenData.Remove(i,1);
    
  Super.Tick( Delta );
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

defaultproperties
{
  Bonenames(0)=Spine
  Bonenames(1)=Head
  Bonenames(2)=LShoulder
  Bonenames(3)=RShoulder
  Bonenames(4)=LThigh
  Bonenames(5)=RThigh
  Bonenames(6)=LFARM
  Bonenames(7)=RFARM
  Bonenames(8)=RightHand
  Bonenames(9)=LFoot
  Bonenames(10)=RFoot
  Bonenames(11)=Bone_Weapon
  
  AimBones(0)=Spine
    
  HeldBone=Bone_Weapon
  ViewBone=Head

  SafeMesh1=Mesh'Jugg.JuggMaleA'
  SafeMesh2=Mesh'Jugg.JuggFemaleA'
}
&lt;/uscript&gt;

'''AlphaOne:''' Could I ask anyone to please taker their time to post a '''complete''' solution(s) here because I'm having a hard time putting your code together. It would be REALLY nice if it was downloadable...(I like being spoon fed)

'''Foxpaw:''' Unfortunately, because all of the people working on this have different applications it's kind of hard to package one solution.. however, I suspect that a mutator could be made of this (I think theres a modifydamage function or something that could cause the karmatizing and an array of pointers to pawns and their respective karma-ing specific values could possibly be stored there. Unfortunately, since my application is highly different, I can't really be the one to do this. Most of the snippets I've provided here are fairly general, but the last one is highly specific and wouldn't work without extensive modification.

'''Plane Guy:''' RAGDOLL POSTULATION OUT OF NOWHERE. My mod involves grabbing a player pawn and dragging him around. Thing is, with the ragdoll I have to attach to a bone and karma yank the doll around BUT the server has no ragdoll (else it crashes). Would it be plausible to karma impulse the &quot;standing&quot; player pawn on the server and get karma-based dragging client-side? Does the flippity-floppity nature of ragdolls require I act on it directly with Karma, or will the client recognize the server has moved the doll and flail its limbs accordingly?

'''Foxpaw:''' Hmm, I'm pretty sure that it's possible to have an actor using PHYS_KarmaRagdoll on the server.. though I don't know how well xPawns handle that. Anyways, Karma ragdolls don't replicate very well, so it would probrably be best to do the bone attach to whatever they're getting dragged behind and have the dragging completely client side. (And have whatever is dragging them get replicated)

'''Plane Guy:''' Hmmmm. Well I had it working on client-side only, but when the dragging stops, the pawn reappears where it was first ragdolled. Would I have to replicate that movement BACK to the server (server is NOT the man, oh noes)? Wouldn't I have to, once replicated to the server, replicate it back to the other clients? Gee, this is getting complicated.

'''Foxpaw:''' I recall someone else having a similar issue. This seems to be a behaviour of the xPawn class, though I can't say that with 100% certainty. xPawns store movements and then go off of their saved movement - this reduces apparent lag in network games. However, it also means that if you move a Pawn by a means other than the Pawn was intended to move, the stored movements don't get updated. I'm not sure if there's an easy way around that or not, since I haven't really looked at the network stuff for Pawn.

'''Dirk Fist:''' I have'nt done much with 2k3, But could'nt the ''Actor&gt;NavigationPoint&gt;SmallNavigationPoint&gt;Teleporter '' accept() function, be modified for setting an actors location?

'''Plane Guy:''' I don't know if it matters, but I'm in 2K4 now. Perhaps a &quot;ragdoll location&quot; variable, and have the server actor.move() to it while ragdolled. It'd be choppy though, though since the server is going to update the client with its old location.

The other idea I had was to karma impluse the same on all clients - replicate the impulse vector - and actor.move() only on the server. Everyone'd get a slightly different karma show, but I don't think they'd notice.

'''OlympusMons:''' Ok guys just an idea. I was thinking after reading this, I know it need a [[:Category:Legacy Refactor Me]] Please! Anyways I was thinking maybe you could subclass svehicle or ONSvehicle or one of those and since those are pawns, which use skeletal anims and karma, maybe you could make the player use a pawn and hope in then when you get KO'd you hope out of the vehicle, play KO stuff, then hop back in. Just an idea anyways Im not really skilled at uscript, yet hehe, so i'm not going to attempt this, yet hehe. Well feel free to give me what for if I dunno what Im talking about.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4047</id>
      <timestamp>2006-09-13T19:28:07Z</timestamp>
      <contributor>
        <ip>Alt230.neoplus.adsl.tpnet.pl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">heil hitler</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karma Ragdoll/Discuss</title>
    <id>1604</id>
    <revision>
      <id>3985</id>
      <timestamp>2008-02-08T08:24:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">'''inio:'''

The [[Legacy:Karma Ragdoll|Karma Ragdoll]] page seemed a little technical to be appropriate for this, but I had to share...

This happened by accident (this is a static state):

[http://www.inio.org/~inio/m2k3/ragdoll.jpg]

Now what's the chance of a ragdoll getting stuck like that?

(btw, I was testing to see if I had solved the ragdoll-getting-sholder-stuck-inside-stairway problem on this little test map, the stairway is just out of frame on the right.

----

'''OBWANDO:''' I did the same with my code, (looked wild) It seemed that the bot was about to jump and I lit a rocket under it, and I have a karma hold for 3 seconds while i debug and that pose was the same. I'm going to look at the animations that are chosen and try to use that effect in my mod (and for a fatality :))

'''AlphaOne:''' This happens so many times to me its not even funny. Plus, sometimes the characters get stretched a lot (ex: when they get shot with flak cannon)

'''Foxpaw:''' That stretching occurs regardless I believe. When you first go into Karma Ragdoll simulation all of your &quot;body parts&quot; get placed in a big clump at your Location, then they collide with each other and fly outward. I don't know if the actual weapons impact makes a difference to this effect, but it might.</text>
    </revision>
    <revision>
      <id>3986</id>
      <timestamp>2008-02-08T02:52:08Z</timestamp>
      <contributor>
        <ip>Cpe-75-80-151-39.san.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">why joo half 2 revert?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KarmaInjurySystem</title>
    <id>1628</id>
    <revision>
      <id>4041</id>
      <timestamp>2005-12-29T02:53:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Karma Ragdoll Injury System|Karma Ragdoll Injury System]]
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4042</id>
      <timestamp>2005-05-28T10:11:17Z</timestamp>
      <contributor>
        <ip>Watdenku.demon.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Renamed to [[Legacy:Karma Injury System|Karma Injury System]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KarmaParams</title>
    <id>1598</id>
    <revision>
      <id>3971</id>
      <timestamp>2006-12-18T05:45:10Z</timestamp>
      <contributor>
        <ip>24-113-89-91.wavecable.com</ip>
      </contributor>
      <comment>*Fixed KMass definition as per UDN definition.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; KarmaParams}}

This is the base class of [[Legacy:Karma|Karma]] parameters. It subclasses [[Legacy:KarmaParamsCollision|KarmaParamsCollision]]. Although technically [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] could be considered to be the base class of Karma parameters, it leaves out many important parts of Karma simulation and is essentially useful only for ragdolls, which have their own built-in KarmaParams.

==General Settings==

These values apply to any Karma simulated actor using KarmaParams or one of it's subclasses as it's KarmaParams. Ragdolls are usually set up using [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] but if set up using these KarmaParams these values will overwrite the defaults set in the skeletal information file.
; KMass : Density of the Object for Karma physics. This is not absolute mass! Rather, the ratio of mesh volume to mass. In this way, you can have two totally different meshes, but have them be the same density and so have appropriately proportional masses. Non-karma physics use absolute values for anything having to do with their 'mass'. For example, the mass of a Bulldog tire is 0.5, and the mass of the Bulldog chassis is 8. If you compare this to the default mass of an actor (100) you can see that the values for mass within Karma physics are much smaller.
; KLinearDamping : This is the amount of friction that the actor will experience to oppose any change in location. The default for this value is 0.2. The Bulldog has this set to 0. Note that this is in addition to any friction from other surfaces it touches. This value is merely the ambient resistance. It could be wind resistance, or resistance from an object that it is conceptually in contact with but technically are not in contact within the physics engine. For instance, the wheels of the bulldog are conceptually attached to the axles, but do not actually touch them within the physics engine.
; KAngularDamping : This is the amount of resistance that the actor will experience to oppose any change in rotation. The default is 0.2. The Bulldog has this set to 0. Similar to KLinearDamping, this is the ambient resistance to rotation. It can be used for wind resistance or for resistance from something that it conceptually is in contact with but does not actually touch within the physics engine. Note that this is not the same as inertial resistance from attempting to rotate an unbalanced object.
; KFriction : This is the amount of friction this object will experience and exert on other objects it comes into physical contact with. 0 is frictionless, while a value of 1 will exert a lot of friction on objects it contacts. The default is 0.
; KActorGravScale : This is how much gravity affects this object. It is used primarily to create special effects and also to give a different impression to an object. For instance, a large, heavy object may have this set higher to make it &quot;feel&quot; heavier, without it's mass actually being higher. This can make it easier to move while being equally difficult to take off the ground. 0 means gravity has no effect on this actor. 1 is normal gravity, as specified by the zone/physics volume. Higher or lesser values, obviously, are the appropriate factor of the gravity as specified by the zone/physics volume. Negative values are possible and will cause the object to gravitate in the opposite direction by the factor specified. The default value is 1, for normal gravity.
; KBuoyancy: Similar to KActorGravScale, this is the amount that being in a WaterVolume affects the KActorGravScale. If it is 0, the object will fall through water as if it were falling through empty air. If it is 1, the buoyancy will exactly cancel the gravity. This will cause the object to be suspended in place in the water, unless it was already falling when it entered the water in which case it will retain it's current velocity and generally coast to a stop. Values of KBuoyancy greater than 1 will make the object float in the direction opposite the gravity, with higher values causing more acceleration in the direction. I believe that this can be negative, but I have not tested it. I also believe that this is independant of gravity, IE 1 negates the gravity regardless of KActorGravScale, however, I have not tested it for values of KActorGravScale other than 1. The default for this value is 0.
; KRestitution : This is how &quot;springy&quot; the object is. 0 is extremely solid, 1 is completely elastic. This is best to experiment with to get the desired effect as it is somewhat complex to calculate the ideal setting. The default is 0.
; KImpactThreshold : If the actor is impacted by another Karma object at a velocity greater than this setting, an event will be triggered in the Unrealscript for that object. The default value for this setting is 100000. Note that the velocity is in Karma units, and, like mass, is not the same scale as the regular physics engine. : The event that is triggered is as follows: &lt;uscript&gt;event KImpact(actor other, vector pos, vector impactVel, vector impactNorm)&lt;/uscript&gt; Other is the object that impacted this actor. Pos is the position of the impact. ImpactVel is the velocity of the impact, and ImpactNorm is the normal vector of the impact. (I believe that it is the normalized negative impactVel.) 
; KStartEnabled : If this is set to true, the object will begin simulating as soon as it is created. If it is set to false, the object will lie dormant and will not simulate until it is interacted with by another Karma actor through collision, or if it is shot by a weapon. This value defaults to false. 
; KStartLinVel : A vector describing the initial velocity of this actor when it is spawned/the level is loaded. It defaults to (0,0,0).
; KStartAngVel : A vector describing the initial angular velocity, or rotation rate, of this actor when it is spawned/the level is loaded. It defaults to (0,0,0).
; bKNonSphericalInertia : Describes how mass distribution should be calculated. If it is false the object is assumed to have it's mass distributed spherically. This will cause it to rotate quite freely. If it is set to true, the inertia will be calculated based on the shape of the static mesh used to display the object. The object is assumed to be uniformly dense for this purpose. Center of mass is also calculated automatically based on this information. If you want to override either of these values you must use the subclass [[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]. This value defaults to false, so spherical inertia is used by default.
; KStayUpright : If this is set to true, the actor will remain upright. This means that it will not be permitted to roll or pitch, it may only yaw. If KAllowRotate is also false, it may not yaw either. If it is false, the object may rotate freely, within the limits set by any constraints attached to it. The default for this value is false. 
; KAllowRotate : If KStayUpright is set to true, and this value is set to true, the actor may pivot on it's Z axis. (yaw) If KStayUpright is set to true and this is set to false, the object may not rotate at all. If KStayUpright is set to false this setting has no effect. This setting defaults to false. 
; KAng3 / KTriList / KLastVel : Simply put - do not touch these. They are used internally by the Karma engine and are set as constant. Even if you found a way to change them you would probrably crash the game by doing so. KLastVel can be read if you have a use for it, I am fairly certain that it stores the objects velocity last tick for acceleration calculations. The other two values are integers and I do not have any idea what they measure.
; bDoSafetime : If true, do extra checks to avoid object passing through world. May cause collision bugs in SVehicles with CollisionSpheres.

====Rigid Body Specific Settings====

These values apply only to Karma Rigid Bodies. They have no effect on Karma Ragdolls.
; bHighDetailOnly : If this variable is set to true, this actor will only be simulated if the physics detail is set to PDL_High. If this variable is set to false, Karma physics will be used as long as the physics is PHYS_Karma. If this variable is set to true and the physics detail is not PDL_High, this object will use normal physics only. Karma Ragdolls will always simulate, regardless of the physics detail or this setting. By default, this value is &quot;1,&quot; which, since it is a boolean, I believe will be interpreted as true at compile-time.
; bClientOnly : If this variable is set to true, the actor will simulate client-side and will not have it's simulation information replicated constantly. For obvious reasons, this should only be used for benign objects that will not collide with anything, or, like swinging meat on the roof, will not move enough to make an appreciable difference in collision. It can also be used for objects which will not be collided with, such a cieling fan that is high up out of reach. Karma ragdolls will always act as if this was set to true, as their motion is not replicated. By default, this variable is set to &quot;1,&quot; which I believe is interpreted as true at compile-time.
; bKDoubleTickRate : If this is set to true, the object will be simulated twice as frequently as objects who have this set to false. Note that on rare occasions, objects with bKDoubleTickRate set to true may not collide with objects that have it set to false. However, this will occur only if the double-ticked actor clears the regular-ticked actor befor the regular actors next tick. This value defaults to false.
; bDestroyOnSimError : If this is set to true, the actor will be destroyed if a simulation error occurs. This generally only happens if for whatever reason a Karma object is spawned deep within BSP geometry, though theoretically it can occur under different circumstances. This is usually true on servers and false on clients. If a client has a simerror and the server does not, the server will fix the Karma simulated object when it is next replicated. If the server sufferes a simerror it will replicate the destruction of the object even if the clients have bDestroyOnSimError set to false. This value defaults to true.</text>
    </revision>
    <revision>
      <id>3972</id>
      <timestamp>2006-10-28T16:18:46Z</timestamp>
      <contributor>
        <ip>Dial-3123.wroclaw.dialog.net.pl</ip>
      </contributor>
      <comment>bDoSafetime</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; KarmaParams}}

This is the base class of [[Legacy:Karma|Karma]] parameters. It subclasses [[Legacy:KarmaParamsCollision|KarmaParamsCollision]]. Although technically [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] could be considered to be the base class of Karma parameters, it leaves out many important parts of Karma simulation and is essentially useful only for ragdolls, which have their own built-in KarmaParams.

==General Settings==

These values apply to any Karma simulated actor using KarmaParams or one of it's subclasses as it's KarmaParams. Ragdolls are usually set up using [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] but if set up using these KarmaParams these values will overwrite the defaults set in the skeletal information file.
; KMass : Mass of the Object for Karma physics. This is scaled differently than the mass for non-Karma physics - for example, the mass of a Bulldog tire is 0.5, and the mass of the Bulldog chassis is 8. If you compare this to the default mass of an actor (100) you can see that the values for mass within Karma physics are much smaller.
; KLinearDamping : This is the amount of friction that the actor will experience to oppose any change in location. The default for this value is 0.2. The Bulldog has this set to 0. Note that this is in addition to any friction from other surfaces it touches. This value is merely the ambient resistance. It could be wind resistance, or resistance from an object that it is conceptually in contact with but technically are not in contact within the physics engine. For instance, the wheels of the bulldog are conceptually attached to the axles, but do not actually touch them within the physics engine.
; KAngularDamping : This is the amount of resistance that the actor will experience to oppose any change in rotation. The default is 0.2. The Bulldog has this set to 0. Similar to KLinearDamping, this is the ambient resistance to rotation. It can be used for wind resistance or for resistance from something that it conceptually is in contact with but does not actually touch within the physics engine. Note that this is not the same as inertial resistance from attempting to rotate an unbalanced object.
; KFriction : This is the amount of friction this object will experience and exert on other objects it comes into physical contact with. 0 is frictionless, while a value of 1 will exert a lot of friction on objects it contacts. The default is 0.
; KActorGravScale : This is how much gravity affects this object. It is used primarily to create special effects and also to give a different impression to an object. For instance, a large, heavy object may have this set higher to make it &quot;feel&quot; heavier, without it's mass actually being higher. This can make it easier to move while being equally difficult to take off the ground. 0 means gravity has no effect on this actor. 1 is normal gravity, as specified by the zone/physics volume. Higher or lesser values, obviously, are the appropriate factor of the gravity as specified by the zone/physics volume. Negative values are possible and will cause the object to gravitate in the opposite direction by the factor specified. The default value is 1, for normal gravity.
; KBuoyancy: Similar to KActorGravScale, this is the amount that being in a WaterVolume affects the KActorGravScale. If it is 0, the object will fall through water as if it were falling through empty air. If it is 1, the buoyancy will exactly cancel the gravity. This will cause the object to be suspended in place in the water, unless it was already falling when it entered the water in which case it will retain it's current velocity and generally coast to a stop. Values of KBuoyancy greater than 1 will make the object float in the direction opposite the gravity, with higher values causing more acceleration in the direction. I believe that this can be negative, but I have not tested it. I also believe that this is independant of gravity, IE 1 negates the gravity regardless of KActorGravScale, however, I have not tested it for values of KActorGravScale other than 1. The default for this value is 0.
; KRestitution : This is how &quot;springy&quot; the object is. 0 is extremely solid, 1 is completely elastic. This is best to experiment with to get the desired effect as it is somewhat complex to calculate the ideal setting. The default is 0.
; KImpactThreshold : If the actor is impacted by another Karma object at a velocity greater than this setting, an event will be triggered in the Unrealscript for that object. The default value for this setting is 100000. Note that the velocity is in Karma units, and, like mass, is not the same scale as the regular physics engine. : The event that is triggered is as follows: &lt;uscript&gt;event KImpact(actor other, vector pos, vector impactVel, vector impactNorm)&lt;/uscript&gt; Other is the object that impacted this actor. Pos is the position of the impact. ImpactVel is the velocity of the impact, and ImpactNorm is the normal vector of the impact. (I believe that it is the normalized negative impactVel.) 
; KStartEnabled : If this is set to true, the object will begin simulating as soon as it is created. If it is set to false, the object will lie dormant and will not simulate until it is interacted with by another Karma actor through collision, or if it is shot by a weapon. This value defaults to false. 
; KStartLinVel : A vector describing the initial velocity of this actor when it is spawned/the level is loaded. It defaults to (0,0,0).
; KStartAngVel : A vector describing the initial angular velocity, or rotation rate, of this actor when it is spawned/the level is loaded. It defaults to (0,0,0).
; bKNonSphericalInertia : Describes how mass distribution should be calculated. If it is false the object is assumed to have it's mass distributed spherically. This will cause it to rotate quite freely. If it is set to true, the inertia will be calculated based on the shape of the static mesh used to display the object. The object is assumed to be uniformly dense for this purpose. Center of mass is also calculated automatically based on this information. If you want to override either of these values you must use the subclass [[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]. This value defaults to false, so spherical inertia is used by default.
; KStayUpright : If this is set to true, the actor will remain upright. This means that it will not be permitted to roll or pitch, it may only yaw. If KAllowRotate is also false, it may not yaw either. If it is false, the object may rotate freely, within the limits set by any constraints attached to it. The default for this value is false. 
; KAllowRotate : If KStayUpright is set to true, and this value is set to true, the actor may pivot on it's Z axis. (yaw) If KStayUpright is set to true and this is set to false, the object may not rotate at all. If KStayUpright is set to false this setting has no effect. This setting defaults to false. 
; KAng3 / KTriList / KLastVel : Simply put - do not touch these. They are used internally by the Karma engine and are set as constant. Even if you found a way to change them you would probrably crash the game by doing so. KLastVel can be read if you have a use for it, I am fairly certain that it stores the objects velocity last tick for acceleration calculations. The other two values are integers and I do not have any idea what they measure.
; bDoSafetime : If true, do extra checks to avoid object passing through world. May cause collision bugs in SVehicles with CollisionSpheres.

====Rigid Body Specific Settings====

These values apply only to Karma Rigid Bodies. They have no effect on Karma Ragdolls.
; bHighDetailOnly : If this variable is set to true, this actor will only be simulated if the physics detail is set to PDL_High. If this variable is set to false, Karma physics will be used as long as the physics is PHYS_Karma. If this variable is set to true and the physics detail is not PDL_High, this object will use normal physics only. Karma Ragdolls will always simulate, regardless of the physics detail or this setting. By default, this value is &quot;1,&quot; which, since it is a boolean, I believe will be interpreted as true at compile-time.
; bClientOnly : If this variable is set to true, the actor will simulate client-side and will not have it's simulation information replicated constantly. For obvious reasons, this should only be used for benign objects that will not collide with anything, or, like swinging meat on the roof, will not move enough to make an appreciable difference in collision. It can also be used for objects which will not be collided with, such a cieling fan that is high up out of reach. Karma ragdolls will always act as if this was set to true, as their motion is not replicated. By default, this variable is set to &quot;1,&quot; which I believe is interpreted as true at compile-time.
; bKDoubleTickRate : If this is set to true, the object will be simulated twice as frequently as objects who have this set to false. Note that on rare occasions, objects with bKDoubleTickRate set to true may not collide with objects that have it set to false. However, this will occur only if the double-ticked actor clears the regular-ticked actor befor the regular actors next tick. This value defaults to false.
; bDestroyOnSimError : If this is set to true, the actor will be destroyed if a simulation error occurs. This generally only happens if for whatever reason a Karma object is spawned deep within BSP geometry, though theoretically it can occur under different circumstances. This is usually true on servers and false on clients. If a client has a simerror and the server does not, the server will fix the Karma simulated object when it is next replicated. If the server sufferes a simerror it will replicate the destruction of the object even if the clients have bDestroyOnSimError set to false. This value defaults to true.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KarmaParamsCollision</title>
    <id>1638</id>
    <revision>
      <id>4062</id>
      <timestamp>2006-11-09T19:59:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; KarmaParamsCollision (Package: Engine)}}

The base class for [[Legacy:Karma|Karma]] objects.  Contains basic properties for use by the Karma Engine.  [[Legacy:KarmaParams|KarmaParams]] extends this class and has more useful properties.  Karma Actor uses this object for properties. '''Note:''' All properties are in Karma scale.

==Properties==

===Main===
;float KFriction : The amount of friction applied.  0 is no friction (though the object will still stop moving), and 1 is 100% friction.
;float KRestitution : How much the object will bounce.  0 is no bounce, 1 will bounce upwards with the force the object hit the ground.
;float KImpactThreshold : How much force is needed to call the KImapct event.

===Hidden===
;const bool bContactingLevel : Is true if 

===Contact Region===

Describes the contact with the world ([[Legacy:BSP|BSP]] and [[Legacy:StaticMesh|StaticMesh]]es.  All these properties are const, meaning they can't be modified with [[Legacy:UnrealScript|UnrealScript]].  The native function CalcContactRegion() updates these values.
;const vector ContactRegionCenter : 
;const vector ContactRegion Normal : 
;const float ContactRegionRadius : 
;const float ContactRegionNormalForce : 

===Default Properties===

The default is a sphere with 1 mass and radius.

&lt;uscript&gt;
KScale=1.000000
KScale3D=(X=1.000000,Y=1.000000,Z=1.000000)
KImpactThreshold=1000000.000000
&lt;/uscript&gt;

==Methods==
; CalcContactRegion() [native] : This native function will only update the contact region properties if bContactingLevel is true.

==Known subclasses==

KarmaParamsCollision isn't a very useful class by itself.  Karma Actors get most of their functionality from subclasses.

* [[Legacy:KarmaParams|KarmaParams]]
** [[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]
** [[Legacy:KarmaParamsSkel|KarmaParamsSkel]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4063</id>
      <timestamp>2006-11-09T15:48:49Z</timestamp>
      <contributor>
        <ip>208-40-182-138.pti.edu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; KarmaParamsCollision (Package: Engine)}}

The base class for [[Legacy:Karma|Karma]] objects.  Contains basic properties for use by the Karma Engine.  [[Legacy:KarmaParams|KarmaParams]] extends this class and has more useful properties.  Karma Actor uses this object for properties. '''Note:''' All properties are in Karma scale.

==Properties==

===Main===
;float KFriction : The amount of friction applied.  0 is no friction (though the object will still stop moving), and 1 is 100% friction.
;float KRestitution : How much the object will bounce.  0 is no bounce, 1 will bounce upwards with the force the object hit the ground.
;float KImpactThreshold : How mush force is needed to call the KImapct event.

===Hidden===
;const bool bContactingLevel : Is true if 

===Contact Region===

Describes the contact with the world ([[Legacy:BSP|BSP]] and [[Legacy:StaticMesh|StaticMesh]]es.  All these properties are const, meaning they can't be modified with [[Legacy:UnrealScript|UnrealScript]].  The native function CalcContactRegion() updates these values.
;const vector ContactRegionCenter : 
;const vector ContactRegion Normal : 
;const float ContactRegionRadius : 
;const float ContactRegionNormalForce : 

;native function CalcContactRegion() : This native function will only update the above contact properties if bContactingLevel is true.

===Default Properties===

The default is a sphere with 1 mass and radius.

&lt;uscript&gt;
:KScale=1.000000
:KScale3D=(X=1.000000,Y=1.000000,Z=1.000000)
:KImpactThreshold=1000000.000000
&lt;/uscript&gt;

==Class Hierarchy==

KarmaParamsCollision isn't a very useful class by itself.  Karma Actors get most of their functionality from subclasses.

KarmaParamsCollision
:+-[[Legacy:KarmaParams|KarmaParams]]
:  +-[[Legacy:KarmaParamsRBFull|KarmaParamsRBFull]]
:  +-[[Legacy:KarmaParamsSkel|KarmaParamsSkel]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KarmaParamsRBFull</title>
    <id>1599</id>
    <revision>
      <id>3973</id>
      <timestamp>2004-07-29T20:30:56Z</timestamp>
      <contributor>
        <ip>203-59-88-53.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; [[Legacy:KarmaParams|KarmaParams]] &gt;&gt; KarmaParamsRBFull}}

This is a more advanced, but otherwise functionally identical version of KarmaParams. It allows control over the center of mass and its inertial properties. It adds the following variables:

; KInertiaTensor : The mass distribution of the actor. There are 6 values for this representing a matrix.  Only the values across the main diagonal seem to do anything (making it a diagonal matrix). That is, elements 0, 3, and 5:&lt;uscript&gt;// (0 1 2)
// (1 3 4)
// (2 4 5)&lt;/uscript&gt; I'm pretty sure that setting them specifies how difficult it is to rotate the object. &lt;uscript&gt;KInertiaTensor(0)=1.8  // how difficult it is to roll the object
KInertiaTensor(1)=0
KInertiaTensor(2)=0
KInertiaTensor(3)=1.8    // how difficult it is to pitch the object
KInertiaTensor(4)=0
KInertiaTensor(5)=1.8   // how difficult it is to yaw the object&lt;/uscript&gt;
; KCOMOffset : The center of mass offset. This is a vector indicating the location of the center of mass of this actor, relative to it's geographical center. It defaults to 0,0,0.</text>
    </revision>
    <revision>
      <id>3974</id>
      <timestamp>2003-05-13T08:26:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; [[Legacy:KarmaParams|KarmaParams]] &gt;&gt; KarmaParamsRBFull}}

This is a more advanced, but otherwise functionally identical version of KarmaParams. It allows control over the center of mass and its inertial properties. It adds the following variables:

; KInertiaTensor : The mass distribution of the actor. I don't fully understand what the values for this mean, but I am interested to find out. Please don't hesitate to fill this in if you know more about the inertia tensor setting than I do.
; KCOMOffset : The center of mass offset. This is a vector indicating the location of the center of mass of this actor, relative to it's geographical center. It defaults to 0,0,0.</text>
    </revision>
    <revision>
      <id>3975</id>
      <timestamp>2004-07-29T20:19:48Z</timestamp>
      <contributor>
        <ip>203-59-88-53.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; [[Legacy:KarmaParams|KarmaParams]] &gt;&gt; KarmaParamsRBFull}}

This is a more advanced, but otherwise functionally identical version of KarmaParams. It allows control over the center of mass and its inertial properties. It adds the following variables:

; KInertiaTensor : The mass distribution of the actor. There are 6 values for this representing a matrix.  Only the values across the main diagonal seem to do anything (making it a diagonal matrix). 

That is, elements 0, 3, and 5:

// (0 1 2)

// (1 3 4)

// (2 4 5) 

I'm pretty sure that setting them specifies how difficult it is to rotate the object.        

KInertiaTensor(0)=1.8  // how difficult it is to roll the object

KInertiaTensor(1)=0

KInertiaTensor(2)=0

KInertiaTensor(3)=1.8    // how difficult it is to pitch the object

KInertiaTensor(4)=0

KInertiaTensor(5)=1.8   // how difficult it is to yaw the object
; KCOMOffset : The center of mass offset. This is a vector indicating the location of the center of mass of this actor, relative to it's geographical center. It defaults to 0,0,0.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KarmaParamsSkel</title>
    <id>1600</id>
    <revision>
      <id>3976</id>
      <timestamp>2005-12-29T02:45:48Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; [[Legacy:KarmaParams|KarmaParams]] &gt;&gt; KarmaParamsSkel}}

The Karma physics parameter specific to skeletons.  This is a native subclass used for [[Legacy:Karma|Karma]] ragdoll physics.

'''Note:''' All parameters are in Karma scale.

==Properties==

===Main===
; string KSkeleton : Karma Asset to use for this skeleton.  This is the textual name of the skeleton asset to use with this actor.
; bool bKDoConvulsions : Whether to convulse and spasm.
; bool bRubbery :
; range KConvulseSpacing : Time between convulsions.

===Hidden===
; vector KShotStart (transient) : When the skeletal physics starts up, we check this line against the skeleton, and apply an impulse with magnitude KShotStrength if we hit a bone.  This has to be deferred  because ragdoll-startup is.
; vector KShotEnd (transient) : 
; float KShotStrength (transient) : 
; bool bKImportantRagdoll (transient) : This indicates this ragdoll will not be recycled during KMakeRagdollAvailable

==Related Topics==
* [[Legacy:Karma|Karma]]
* [[Legacy:Ragdoll|Ragdoll]]
* [[Legacy:Karma Ragdoll|Karma Ragdoll]]

==Discussion==

'''Unknown (author):''' I believe you must use the #exec directive to import the skeleton if it is not been previously imported into another package, but I haven't tested it too thoroughly.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3977</id>
      <timestamp>2003-05-13T08:26:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] &gt;&gt; [[Legacy:KarmaParams|KarmaParams]] &gt;&gt; KarmaParamsSkel}}

This is a subclass used for [[Legacy:Karma|Karma]] ragdoll physics. It has only one additional variable:

; KSkeleton : This is the textual name of the skeleton asset to use with this actor. I believe you must use the #exec directive to import the skeleton if it is not been previously imported into another package, but I haven't tested it too thoroughly.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Karp</title>
    <id>1596</id>
    <revision>
      <id>3967</id>
      <timestamp>2003-04-19T18:22:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===This is not empty===

It is actually filled now, don't ask me why or if this content has any meaning.&lt;br /&gt;The main thing is, it's here now and we should be happy with that

'''Tarquin:''' hi Karp :D

'''EntropicLqd:''' Hello Karp, welcome to the Wiki.

'''Karp:''' And what a warm welcome this is ;)

'''Original9:''' Hello Karpy-poo :P

'''Tarquin:''' How goes the wiki installation? Is it going to be private, read-only, or public? let me know, I'll put it in our [[Legacy:InterWiki|InterWiki]].

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3968</id>
      <timestamp>2003-04-19T18:09:04Z</timestamp>
      <contributor>
        <ip>Original9</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===This is not empty===

It is actually filled now, don't ask me why or if this content has any meaning.&lt;br /&gt;The main thing is, it's here now and we should be happy with that

'''Tarquin:''' hi Karp :D

'''EntropicLqd:''' Hello Karp, welcome to the Wiki.

'''Karp:''' And what a warm welcome this is ;)

'''Original9:''' Hello Karpy-poo :P

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kartoshka</title>
    <id>1635</id>
    <revision>
      <id>4055</id>
      <timestamp>2006-07-18T06:51:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">I first discovered UT in 2001 and played it all the time. After while I lost interest in playing against bots (I had AOL dial-up, and could never connect to online games) and shelved the game for a few years. Sometime in 2005 I regained interest when I discovered that you could *gasp* modify the game. Then in August I packed my bags for a year-long exchange trip to Latvia (where I am now). Unfortunately, I've had to put UT on hold again, because I haven't had any place to install it...:/ I have been working with C++ and Java a bit this year, keeping my mind fresh for college, where I'll study computer science. I can't wait for UT2007...it looks like it's going to rule all games yet produced :D I'm guessing I'll have to buy a new computer to be able to play it though...

----

'''Tarquin:''' Hi. It looks like you lost most of the markup page when you edited it...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4056</id>
      <timestamp>2006-07-18T04:50:19Z</timestamp>
      <contributor>
        <ip>218.150.32.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.areaseo.com'&gt;pagerank main&lt;/a&gt; : [http://www.areaseo.com improve pagerank default] - [HTTP://www.areaseo.com improve pagerank default] : [PageRank 11|http://www.areaseo.com] - [PageRank 11|HTTP://www.areaseo.com] : http://www.areaseo.com/improvepr/ : [[http://www.areaseo.com google rank 20]] : [[http://www.areaseo.com | pagerank 5]] : &quot;online pr16&quot; http://www.areaseo.com : [http://www.areaseo.com|google pr] &lt;/u&gt;I first discovered UT in 2001 and played it all the time. After while I lost interest in playing against bots (I had AOL dial-up, and could never connect to online games) and shelved the game for a few years. Sometime in 2005 I regained interest when I discovered that you could *gasp* modify the game. Then in August I packed my bags for a year-long exchange trip to Latvia (where I am now). Unfortunately, I've had to put UT on hold again, because I haven't had any place to install it...:/ I have been working with C++ and Java a bit this year, keeping my mind fresh for college, where I'll study computer science. I can't wait for UT2007...it looks like it's going to rule all games yet produced :D I'm guessing I'll have to buy a new computer to be able to play it though...

----

'''Tarquin:''' Hi. It looks like you lost most of the markup page when you edited it...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4057</id>
      <timestamp>2006-07-18T04:53:53Z</timestamp>
      <contributor>
        <ip>211.104.243.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.dirare.com'&gt;yellow pages main&lt;/a&gt; : [http://www.dirare.com business yellowpages] - [HTTP://www.dirare.com business yellowpages] : [international directory|http://www.dirare.com] - [international directory|HTTP://www.dirare.com] : http://www.dirare.com/India/ : [[http://www.dirare.com companies of the world]] : [[http://www.dirare.com | YP national]] : &quot;global directory&quot; http://www.dirare.com : [http://www.dirare.com|online directory] &lt;/u&gt;&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... Thanks!!! Links: &lt;a href='http://www.areaseo.com'&gt;pagerank main&lt;/a&gt; : [http://www.areaseo.com improve pagerank default] - [HTTP://www.areaseo.com improve pagerank default] : [PageRank 11|http://www.areaseo.com] - [PageRank 11|HTTP://www.areaseo.com] : http://www.areaseo.com/improvepr/ : [[http://www.areaseo.com google rank 20]] : [[http://www.areaseo.com | pagerank 5]] : &quot;online pr16&quot; http://www.areaseo.com : [http://www.areaseo.com|google pr] &lt;/u&gt;I first discovered UT in 2001 and played it all the time. After while I lost interest in playing against bots (I had AOL dial-up, and could never connect to online games) and shelved the game for a few years. Sometime in 2005 I regained interest when I discovered that you could *gasp* modify the game. Then in August I packed my bags for a year-long exchange trip to Latvia (where I am now). Unfortunately, I've had to put UT on hold again, because I haven't had any place to install it...:/ I have been working with C++ and Java a bit this year, keeping my mind fresh for college, where I'll study computer science. I can't wait for UT2007...it looks like it's going to rule all games yet produced :D I'm guessing I'll have to buy a new computer to be able to play it though...

----

'''Tarquin:''' Hi. It looks like you lost most of the markup page when you edited it...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kawachan</title>
    <id>1612</id>
    <revision>
      <id>4005</id>
      <timestamp>2004-05-26T18:07:52Z</timestamp>
      <contributor>
        <ip>Kawachan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

I'm Kyoufu Kawa, Kawachan to the friends, I'm a 320 years old tentacle demon and really like game engines that are easily modded.

I made a name in the Romhacking scene by writing EliteMap (a Pok&amp;eacute;mon map editor) and various little tools to go along with it.

I'm also rumored to be a sexaholic.

As for contributions to this site, I noticed the [[Legacy:Class Tree Listing (DX)|class tree]] is rather empty, page wise.

[[Image:Legacy_DeusExNoodleBanner.jpeg|center|My mod's banner. Thanks to the Trasher for the little logo. You won't believe how easy the text effect is.]]

'''May 19th 2004''' Trashy said UT was dirt cheap nowadays. Bought it. It rocks. Verily.

===My Stuff===

====My mod====

Working on it. Got some screenshots at the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Noodles]] project page.

====Deus Ex wardrobe system====

&lt;uscript&gt;
//Put THIS line between &quot;event TravelPostAccept&quot; and JC's class definition.

var travel int PlayerCostume;

exec function SwitchCostumes(int NewCostume) //Yes, it's also a cheat.
{
     PlayerCostume = NewCostume;
     if (PlayerCostume &gt; 1)     //Your maximum here
     {
          ClientMessage(&quot;PlayerCostume can't be higher than 1. Falling back to 0.&quot;);
          PlayerCostume = 0;
     }

     switch(PlayerCostume)
     {
          case 0:     //Standard coat and armor
               Mesh = LodMesh'DeusExCharacters.GM_Trench';
               MultiSkins[1] = Texture'DeusExCharacters.Skins.JCDentonTex2';
               MultiSkins[2] = Texture'DeusExCharacters.Skins.JCDentonTex3';
               MultiSkins[3] = Texture'DeusExCharacters.Skins.JCDentonTex0';
               MultiSkins[4] = Texture'DeusExCharacters.Skins.JCDentonTex1';
               MultiSkins[5] = Texture'DeusExCharacters.Skins.JCDentonTex2';
               break;
          case 1: //MiB disguise
               Mesh = LodMesh'DeusExCharacters.GM_Suit';
               MultiSkins[1] = Texture'DeusExCharacters.Skins.PantsTex5';
               MultiSkins[2] = Texture'DeusExCharacters.Skins.JCDentonTex0';
               MultiSkins[3] = Texture'DeusExCharacters.Skins.MIBTex1';
               MultiSkins[4] = Texture'DeusExCharacters.Skins.MIBTex1';
               MultiSkins[5] = Texture'DeusExCharacters.Skins.FramesTex2';
               MultiSkins[6] = Texture'DeusExCharacters.Skins.LensesTex3';
               MultiSkins[7] = Texture'DeusExItems.Skins.PinkMaskTex';
               break;
     }
}
&lt;/uscript&gt;

For the Carcass, I'd use something like &lt;code&gt;MultiSkins[0] = Player.MultiSkins[0];&lt;/code&gt;, copying mesh and multiskins from the player object (JCDenton).

===My Problems===
* Getting UnrealEd 2 to run with Deus Ex. Any ideas?

===Other things from Kawachan===
* [http://helmetedrodent.kickassgamers.com My site, the Helmeted Rodent]
* [http://www.cafeshops.com/cp/store.aspx?s=EliteMap,HelmetRodent My webshop] (surely somebody on the Wiki has a credit card?)

===Todo===
* Help Xhiris with the [[Legacy:Class Tree Listing (DX)|Deus Ex class tree]].
* Make some joke UT screenshots. Got some very stupid ideas.

==Comments==

'''Tarquin:''' hi, welcome to the wiki :)

'''Kawachan:''' Thank you. I was already expecting this.

'''Ailure:''' I must get Deus Ex now... &gt;_&gt; at least show us some screenshots when you can. ^_^

'''Kawachan:''' I will as soon as I rebuild my map. In UED2!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4006</id>
      <timestamp>2004-05-21T12:26:28Z</timestamp>
      <contributor>
        <ip>H103n3c1o912.bredband.skanova.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

I'm Kyoufu Kawa, Kawachan to the friends, I'm a 320 years old tentacle demon and really like game engines that are easily modded.

I made a name in the Romhacking scene by writing EliteMap (a Pok&amp;eacute;mon map editor) and various little tools to go along with it.

I'm also rumored to be a sexaholic.

As for contributions to this site, I noticed the [[Legacy:Class Tree Listing (DX)|class tree]] is rather empty, page wise.

[[Image:Legacy_DeusExNoodleBanner.jpeg|center|My mod's banner. Thanks to the Trasher for the little logo. You won't believe how easy the text effect is.]]

'''May 19th 2004''' Trashy said UT was dirt cheap nowadays. Bought it. It rocks. Verily.

===My Stuff===

====Deus Ex wardrobe system====

&lt;uscript&gt;
//Put THIS line between &quot;event TravelPostAccept&quot; and JC's class definition.

var travel int PlayerCostume;

exec function SwitchCostumes(int NewCostume) //Yes, it's also a cheat.
{
     PlayerCostume = NewCostume;
     if (PlayerCostume &gt; 1)     //Your maximum here
     {
          ClientMessage(&quot;PlayerCostume can't be higher than 1. Falling back to 0.&quot;);
          PlayerCostume = 0;
     }

     switch(PlayerCostume)
     {
          case 0:     //Standard coat and armor
               Mesh = LodMesh'DeusExCharacters.GM_Trench';
               MultiSkins[1] = Texture'DeusExCharacters.Skins.JCDentonTex2';
               MultiSkins[2] = Texture'DeusExCharacters.Skins.JCDentonTex3';
               MultiSkins[3] = Texture'DeusExCharacters.Skins.JCDentonTex0';
               MultiSkins[4] = Texture'DeusExCharacters.Skins.JCDentonTex1';
               MultiSkins[5] = Texture'DeusExCharacters.Skins.JCDentonTex2';
               break;
          case 1: //MiB disguise
               Mesh = LodMesh'DeusExCharacters.GM_Suit';
               MultiSkins[1] = Texture'DeusExCharacters.Skins.PantsTex5';
               MultiSkins[2] = Texture'DeusExCharacters.Skins.JCDentonTex0';
               MultiSkins[3] = Texture'DeusExCharacters.Skins.MIBTex1';
               MultiSkins[4] = Texture'DeusExCharacters.Skins.MIBTex1';
               MultiSkins[5] = Texture'DeusExCharacters.Skins.FramesTex2';
               MultiSkins[6] = Texture'DeusExCharacters.Skins.LensesTex3';
               MultiSkins[7] = Texture'DeusExItems.Skins.PinkMaskTex';
               break;
     }
}
&lt;/uscript&gt;

For the Carcass, I'd use something like &lt;code&gt;MultiSkins[0] = Player.MultiSkins[0];&lt;/code&gt;, copying mesh and multiskins from the player object (JCDenton).

===My Problems===
* Getting UnrealEd 2 to run with Deus Ex. Any ideas?

===Other things from Kawachan===
* [http://helmetedrodent.kickassgamers.com My site, the Helmeted Rodent]
* [http://www.cafeshops.com/cp/store.aspx?s=EliteMap,HelmetRodent My webshop] (surely somebody on the Wiki has a credit card?)

===Todo===
* Help Xhiris with the [[Legacy:Class Tree Listing (DX)|Deus Ex class tree]].
* Make some joke UT screenshots. Got some very stupid ideas.

==Comments==

'''Tarquin:''' hi, welcome to the wiki :)

'''Kawachan:''' Thank you. I was already expecting this.

'''Ailure:''' I must get Deus ex now... &gt;_&gt; at least show use some screenshots when you can. ^_^

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4007</id>
      <timestamp>2004-05-21T12:28:03Z</timestamp>
      <contributor>
        <ip>Kawachan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

I'm Kyoufu Kawa, Kawachan to the friends, I'm a 320 years old tentacle demon and really like game engines that are easily modded.

I made a name in the Romhacking scene by writing EliteMap (a Pok&amp;eacute;mon map editor) and various little tools to go along with it.

I'm also rumored to be a sexaholic.

As for contributions to this site, I noticed the [[Legacy:Class Tree Listing (DX)|class tree]] is rather empty, page wise.

[[Image:Legacy_DeusExNoodleBanner.jpeg|center|My mod's banner. Thanks to the Trasher for the little logo. You won't believe how easy the text effect is.]]

'''May 19th 2004''' Trashy said UT was dirt cheap nowadays. Bought it. It rocks. Verily.

===My Stuff===

====Deus Ex wardrobe system====

&lt;uscript&gt;
//Put THIS line between &quot;event TravelPostAccept&quot; and JC's class definition.

var travel int PlayerCostume;

exec function SwitchCostumes(int NewCostume) //Yes, it's also a cheat.
{
     PlayerCostume = NewCostume;
     if (PlayerCostume &gt; 1)     //Your maximum here
     {
          ClientMessage(&quot;PlayerCostume can't be higher than 1. Falling back to 0.&quot;);
          PlayerCostume = 0;
     }

     switch(PlayerCostume)
     {
          case 0:     //Standard coat and armor
               Mesh = LodMesh'DeusExCharacters.GM_Trench';
               MultiSkins[1] = Texture'DeusExCharacters.Skins.JCDentonTex2';
               MultiSkins[2] = Texture'DeusExCharacters.Skins.JCDentonTex3';
               MultiSkins[3] = Texture'DeusExCharacters.Skins.JCDentonTex0';
               MultiSkins[4] = Texture'DeusExCharacters.Skins.JCDentonTex1';
               MultiSkins[5] = Texture'DeusExCharacters.Skins.JCDentonTex2';
               break;
          case 1: //MiB disguise
               Mesh = LodMesh'DeusExCharacters.GM_Suit';
               MultiSkins[1] = Texture'DeusExCharacters.Skins.PantsTex5';
               MultiSkins[2] = Texture'DeusExCharacters.Skins.JCDentonTex0';
               MultiSkins[3] = Texture'DeusExCharacters.Skins.MIBTex1';
               MultiSkins[4] = Texture'DeusExCharacters.Skins.MIBTex1';
               MultiSkins[5] = Texture'DeusExCharacters.Skins.FramesTex2';
               MultiSkins[6] = Texture'DeusExCharacters.Skins.LensesTex3';
               MultiSkins[7] = Texture'DeusExItems.Skins.PinkMaskTex';
               break;
     }
}
&lt;/uscript&gt;

For the Carcass, I'd use something like &lt;code&gt;MultiSkins[0] = Player.MultiSkins[0];&lt;/code&gt;, copying mesh and multiskins from the player object (JCDenton).

===My Problems===
* Getting UnrealEd 2 to run with Deus Ex. Any ideas?

===Other things from Kawachan===
* [http://helmetedrodent.kickassgamers.com My site, the Helmeted Rodent]
* [http://www.cafeshops.com/cp/store.aspx?s=EliteMap,HelmetRodent My webshop] (surely somebody on the Wiki has a credit card?)

===Todo===
* Help Xhiris with the [[Legacy:Class Tree Listing (DX)|Deus Ex class tree]].
* Make some joke UT screenshots. Got some very stupid ideas.

==Comments==

'''Tarquin:''' hi, welcome to the wiki :)

'''Kawachan:''' Thank you. I was already expecting this.

'''Ailure:''' I must get Deus Ex now... &gt;_&gt; at least show us some screenshots when you can. ^_^

'''Kawachan:''' I will as soon as I rebuild my map. In UED2!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kawachan/Noodles</title>
    <id>1613</id>
    <revision>
      <id>4008</id>
      <timestamp>2004-05-29T17:12:40Z</timestamp>
      <contributor>
        <ip>Kawachan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Story===

''TODO'': Fill this.

==Characters==

===Good guys===

'''T.J. &quot;Hiryuu&quot; Chastain''': Hero of the game and just the man for the job, more or less. Since the real Hiryuu really likes Ranma 1/2, his character is also cursed. Yawn worthy but that's life for ya. He wears an EliteMap shirt much like the one I'm wearing right now and can dress up for specific missions.

'''Rick &quot;Trasher&quot; Trimble''': One of the resistance leaders and resident Aussie. He's the one dishing out the missions but mostly just lounges around, watching hentai on TV. He wears a bright green jacket and -another- EliteMap shirt (he designed it after all).

'''Kyoufu Kawa''': Resident tentacle demon, provider of entertainment for the resistance and general off-color bastard. Is actually no higher in command than Trasher, just seems to be. Wears a Chinese shirt and leather jacket but that doesn't matter 'cuz he's off-color anyway.

===Bad guys===

'''Sebastian De La Hoya''': The man behind the noodle conspiracy. Rich, smart, and not to be fucked with. Short black hair, buisness fair. short, stocky, and fit.

'''Michael Crane''': Runs an underground Ramen ring. Not a friendly, or paticuarly handsome gentleman. Looks quite brutish.

'''The Anti-Rodent''': A strange entity, seems to be the exact opposite to Kawa. As such, expect the fur to fly when the two meet.

''Kawa'': Why would Anti be listed under &quot;bad guys&quot; anyway? I'm evil, so he must be good!

'''Outsider''': This figure works outside of all the groups, fiddling with them all equally.

===Common Enemies===

'''Clones''': Genetic Multiplications of a past antagonist called Ninja AE, who generally was indecipherable. Weak alone, but you never find them alone...

===Groups===

'''The Organisation''': For truth, justice, and stir-fry, this intrepid, if somewhat amateur, group work to end the government's somewhat bizarre noodle conspiracy, and bring them back to being safe, legal foodstuffs. Unfortunately, they likely have more on the menu... (in the form of illegalising all other foods!)

''Kawa'': How would one neutralize the psi-powers of noodles anyway?

''kins'': eating them raw.

''Kawa'': Ah. Crunchy.

==Tech changes==
* The wardrobe system on my own page.
* Various small changes
* The Ranma-ripoff &quot;Jusenkyo System&quot; I built. Combines VERY well with the wardrobe.

==Screenshots==

[[Image:Legacy_noodles_base_wip.jpeg|center|The Base, the one that was eaten by UED1. It's being rebuilt now and will improve over time. Yes, that's a GameCube.]]

New, mucho improved screeny coming soon, cuz what's the use of a couch and Cube without a TV? And I've been improving on my lighting a bit.

[[Image:Legacy_noodles_intro_rain.jpeg|center|Intro shot. Trashy suggested parodying Matrix Revolutions and thanks to Slick's PercipitationGenerator, it actually rains!]]</text>
    </revision>
    <revision>
      <id>4009</id>
      <timestamp>2004-05-29T16:01:29Z</timestamp>
      <contributor>
        <ip>Kawachan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Story===

''TODO'': Fill this.

==Characters==

===Good guys===

'''T.J. &quot;Hiryuu&quot; Chastain''': Hero of the game and just the man for the job, more or less. Since the real Hiryuu really likes Ranma 1/2, his character is also cursed. Yawn worthy but that's life for ya. He wears an EliteMap shirt much like the one I'm wearing right now and can dress up for specific missions.

'''Rick &quot;Trasher&quot; Trimble''': One of the resistance leaders and resident Aussie. He's the one dishing out the missions but mostly just lounges around, watching hentai on TV. He wears a bright green jacket and -another- EliteMap shirt (he designed it after all).

'''Kyoufu Kawa''': Resident tentacle demon, provider of entertainment for the resistance and general off-color bastard. Is actually no higher in command than Trasher, just seems to be. Wears a Chinese shirt and leather jacket but that doesn't matter 'cuz he's off-color anyway.

===Bad guys===

'''Sebastian De La Hoya''': The man behind the noodle conspiracy. Rich, smart, and not to be fucked with. Short black hair, buisness fair. short, stocky, and fit.

'''Michael Crane''': Runs an underground Ramen ring. Not a friendly, or paticuarly handsome gentleman. Looks quite brutish.

'''The Anti-Rodent''': A strange entity, seems to be the exact opposite to Kawa. As such, expect the fur to fly when the two meet.

''Kawa'': Why would Anti be listed under &quot;bad guys&quot; anyway? I'm evil, so he must be good!

'''Outsider''': This figure works outside of all the groups, fiddling with them all equally.

===Common Enemies===

'''Clones''': Genetic Multiplications of a past antagonist called Ninja AE, who generally was indecipherable. Weak alone, but you never find them alone...

===Groups===

'''The Organisation''': For truth, justice, and stir-fry, this intrepid, if somewhat amateur, group work to end the government's somewhat bizarre noodle conspiracy, and bring them back to being safe, legal foodstuffs. Unfortunately, they likely have more on the menu... (in the form of illegalising all other foods!)

''Kawa'': How would one neutralize the psi-powers of noodles anyway?

''kins'': eating them raw.

''Kawa'': Ah. Crunchy.

===Tech changes===
* The wardrobe system on my own page.
* Various small changes
* The Ranma-ripoff &quot;Jusenkyo System&quot; I built. Combines VERY well with the wardrobe.

===Screenshots===

[[Image:Legacy_noodles_base_wip.jpeg|center|The Base, the one that was eaten by UED1. It's being rebuilt now and will improve over time. Yes, that's a GameCube.]]

New, mucho improved screeny coming soon, cuz what's the use of a couch and Cube without a TV? And I've been improving on my lighting a bit.

[[Image:Legacy_noodles_intro_rain.jpeg|center|Intro shot. Trashy suggested parodying Matrix Revolutions and thanks to Slick's PercipitationGenerator, it actually rains!]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kea</title>
    <id>1634</id>
    <revision>
      <id>4053</id>
      <timestamp>2006-04-16T16:45:03Z</timestamp>
      <contributor>
        <ip>Kea</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About me===

This is my first lame Unreal Wiki page.

===Projects I take part in===
# A coder in The Chosen One &amp;ndash; a singleplayer mod for UT99.
# Team leader, coder and mapper of [http://keaukraine.narod.ru SP2D] &amp;ndash; singleplayer mod for UT99 in 2D.
# [[Legacy:UsableScreen|UsableScreen]] &amp;ndash; actors to create usable screens like in Doom3/Quake4 games.

==Guestbook==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4054</id>
      <timestamp>2006-04-15T17:20:59Z</timestamp>
      <contributor>
        <ip>Kea</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About me===

This is my first lame Unreal Wiki page.

===Projects I take part in===
# A coder in The Chosen One &amp;ndash; a singleplayer mod for UT99.
# Team leader, coder and mapper of [http://keaukraine.narod.ru/other/us.html SP2D] &amp;ndash; singleplayer mod for UT99 in 2D.
# [[Legacy:UsableScreen|UsableScreen]] &amp;ndash; actors to create usable screens like in Doom3/Quake4 games.

==Guestbook==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keeping Brushes Snapped To The Grid</title>
    <id>1621</id>
    <revision>
      <id>4025</id>
      <timestamp>2006-10-02T12:14:14Z</timestamp>
      <contributor>
        <ip>U1-81.iti.lt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">World of boxes is not the most interesting map. So we want to add more shapes, and that involves more complicated [[Legacy:BSP|BSP]]'s. So we rotate them, add or subtract in different ways, to make creative enviroinment we want. For example, some begginer mapper created a room by adding polygonal brush and subtracted rotated rectangular brush for entrance:

[[Image:Legacy_brushalignbad.jpeg|]]

That may work just fine as long as he does not have any other geometry around. But in more complicated map there '''must''' be more geometry around, and when he starts adding it, he will found that lots of brushes starts overlaping each other (yes, i saw maps like that):

[[Image:Legacy_BrushAlignBad2.jpeg|]]

As we all know, [[Legacy:UnrealEd Goblin|UED goblin]] doesn't like that. In worst cases UED may even crash when [[Legacy:Rebuild|rebuilding]] BSP, but lucky ones will only get some random [[Legacy:BSP Hole|BSP hole]]s (i know, random is fun :D).

Actually, sollution is simple, as long as you keep '''ALL''' vertexes of '''ALL''' brushes [[Legacy:Snap To Grid|snapped to grid]]. Compare these pictures with previous ones:

[[Image:Legacy_brushaligngood.jpeg|]] @inline@BrushAlignGood2

If you align all brushes like that, without them intersecting each other, you can almost forget about [[Legacy:BSP Hole|BSP hole]]s. If you still get holes anyway, make sure all sides of brushes are planar. Also, you will soon find that it is much easier to add more BSP around well aligned brushes and to texture it.

Few notes on how to do that easily:
* You can select several vertices at once in rectangular area (in [[Legacy:Vertex Editing|vertex editing]] mode [[Image:Legacy_button.mode.vertex.gif|]]), by holding ''Ctrl+Alt+Left Mouse Button''.
* Right click on one of selected vertices to align all of them to grid.
* When you need to move already aligned vertices (in vertex editing mode), always do that with ''Ctrl'' '''OR''' ''Ctrl+Shift'' to keep them snaping to grid.

Thats all. Its hard to fix already big map with brush-jungle in it, but it is easy to make everything right from begining.

==Discussion==

'''Olympus Mons:''' Awsome stuff this should be a tooltip for unreal ed. I didnt know this.

'''Nercury:''' I was right when i thought that someone does not know this :D

'''Nercury:''' Keeping brushes on grid mainly helps because that ensures that all sides of brush are planar... (i guess). Can anyone confirm this? I just wrote this from my own experience, because making maps this way never caused any holes in it. BTW, all sides of antiportals also MUST be planar, so aligning vertices to grid helps here too.

'''Nercury:''' Ok, i have spend some time trying to create BSP hole, i used two intersecting brushes. I was unable to create any hole with not planar cube faces (geometry was very simple though), but i was very succesfull as soon as i turned off [[Legacy:Snap To Grid|Snap To Grid]] feature. So my conclusion is: align, align, and align.

'''StarWeaver:''' In generic mode (camera mode? whatever the editor starts in), right clicking a vertex of any selected brush or set of selected brushes will both set the pivot to that vertex and snap that vertex to the nearest grid point (dragging along the entire selection). It's really helpful when I import a builder brush or insert a prefab and it decides to place it at some random off-grid or on-some-other-grid location.

Also, I don't understand that note about making sure to hold control while vertex editing. I *HAVE* to hold down control when moving *ANYTHING* in the editor regardless of grid settings, unless I'm missing something?

'''Nercury:''' I guess yes, unless your Unreal Editor works well... If you notice, that vertexes do not snap to grid when moving them, just hold ctrl :)

==Related Topics==

[[Legacy:Vertex Editing|Vertex Editing]]

[[Legacy:Snap To Grid|Snap To Grid]]

[[Legacy:Building With CSG|Building With CSG]]

[[Legacy:BSP Hole|BSP hole]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4026</id>
      <timestamp>2006-09-07T19:40:13Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <comment>Comment: More snapping; ctrl??</comment>
      <text xml:space="preserve">World of boxes is not the most interesting map. So we want to add more shapes, and that involves more complicated [[Legacy:BSP|BSP]]'s. So we rotate them, add or subtract in different ways, to make creative enviroinment we want. For example, some begginer mapper created a room by adding polygonal brush and subtracted rotated rectangular brush for entrance:

[[Image:Legacy_brushalignbad.jpeg|]]

That may work just fine as long as he does not have any other geometry around. But in more complicated map there '''must''' be more geometry around, and when he starts adding it, he will found that lots of brushes starts overlaping each other (yes, i saw maps like that):

[[Image:Legacy_BrushAlignBad2.jpeg|]]

As we all know, [[Legacy:UnrealEd Goblin|UED goblin]] doesn't like that. In worst cases UED may even crash when [[Legacy:Rebuild|rebuilding]] BSP, but lucky ones will only get some random [[Legacy:BSP Hole|BSP hole]]s (i know, random is fun :D).

Actually, sollution is simple, as long as you keep '''ALL''' vertexes of '''ALL''' brushes [[Legacy:Snap To Grid|snapped to grid]]. Compare these pictures with previous ones:

[[Image:Legacy_brushaligngood.jpeg|]] @inline@BrushAlignGood2

If you align all brushes like that, without them intersecting each other, you can almost forget about [[Legacy:BSP Hole|BSP hole]]s. If you still get holes anyway, make sure all sides of brushes are planar. Also, you will soon find that it is much easier to add more BSP around well aligned brushes and to texture it.

Few notes on how to do that easily:
* You can select several vertices at once in rectangular area (in [[Legacy:Vertex Editing|vertex editing]] mode [[Image:Legacy_button.mode.vertex.gif|]]), by holding ''Ctrl+Alt+Left Mouse Button''.
* Right click on one of selected vertices to align all of them to grid.
* When you need to move already aligned vertices, always do that with ''Ctrl'' '''OR''' ''Ctrl+Shift'' to keep them snaping to grid.

Thats all. Its hard to fix already big map with brush-jungle in it, but it is easy to make everything right from begining.

==Discussion==

'''Olympus Mons:''' Awsome stuff this should be a tooltip for unreal ed. I didnt know this.

'''Nercury:''' I was right when i thought that someone does not know this :D

'''Nercury:''' Keeping brushes on grid mainly helps because that ensures that all sides of brush are planar... (i guess). Can anyone confirm this? I just wrote this from my own experience, because making maps this way never caused any holes in it. BTW, all sides of antiportals also MUST be planar, so aligning vertices to grid helps here too.

'''Nercury:''' Ok, i have spend some time trying to create BSP hole, i used two intersecting brushes. I was unable to create any hole with not planar cube faces (geometry was very simple though), but i was very succesfull as soon as i turned off [[Legacy:Snap To Grid|Snap To Grid]] feature. So my conclusion is: align, align, and align.

'''StarWeaver:''' In generic mode (camera mode? whatever the editor starts in), right clicking a vertex of any selected brush or set of selected brushes will both set the pivot to that vertex and snap that vertex to the nearest grid point (dragging along the entire selection). It's really helpful when I import a builder brush or insert a prefab and it decides to place it at some random off-grid or on-some-other-grid location.

Also, I don't understand that note about making sure to hold control while vertex editing. I *HAVE* to hold down control when moving *ANYTHING* in the editor regardless of grid settings, unless I'm missing something?

==Related Topics==

[[Legacy:Vertex Editing|Vertex Editing]]

[[Legacy:Snap To Grid|Snap To Grid]]

[[Legacy:Building With CSG|Building With CSG]]

[[Legacy:BSP Hole|BSP hole]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4027</id>
      <timestamp>2006-10-02T12:12:56Z</timestamp>
      <contributor>
        <ip>U1-81.iti.lt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">World of boxes is not the most interesting map. So we want to add more shapes, and that involves more complicated [[Legacy:BSP|BSP]]'s. So we rotate them, add or subtract in different ways, to make creative enviroinment we want. For example, some begginer mapper created a room by adding polygonal brush and subtracted rotated rectangular brush for entrance:

[[Image:Legacy_brushalignbad.jpeg|]]

That may work just fine as long as he does not have any other geometry around. But in more complicated map there '''must''' be more geometry around, and when he starts adding it, he will found that lots of brushes starts overlaping each other (yes, i saw maps like that):

[[Image:Legacy_BrushAlignBad2.jpeg|]]

As we all know, [[Legacy:UnrealEd Goblin|UED goblin]] doesn't like that. In worst cases UED may even crash when [[Legacy:Rebuild|rebuilding]] BSP, but lucky ones will only get some random [[Legacy:BSP Hole|BSP hole]]s (i know, random is fun :D).

Actually, sollution is simple, as long as you keep '''ALL''' vertexes of '''ALL''' brushes [[Legacy:Snap To Grid|snapped to grid]]. Compare these pictures with previous ones:

[[Image:Legacy_brushaligngood.jpeg|]] @inline@BrushAlignGood2

If you align all brushes like that, without them intersecting each other, you can almost forget about [[Legacy:BSP Hole|BSP hole]]s. If you still get holes anyway, make sure all sides of brushes are planar. Also, you will soon find that it is much easier to add more BSP around well aligned brushes and to texture it.

Few notes on how to do that easily:
* You can select several vertices at once in rectangular area (in [[Legacy:Vertex Editing|vertex editing]] mode [[Image:Legacy_button.mode.vertex.gif|]]), by holding ''Ctrl+Alt+Left Mouse Button''.
* Right click on one of selected vertices to align all of them to grid.
* When you need to move already aligned vertices, always do that with ''Ctrl'' '''OR''' ''Ctrl+Shift'' to keep them snaping to grid.

Thats all. Its hard to fix already big map with brush-jungle in it, but it is easy to make everything right from begining.

==Discussion==

'''Olympus Mons:''' Awsome stuff this should be a tooltip for unreal ed. I didnt know this.

'''Nercury:''' I was right when i thought that someone does not know this :D

'''Nercury:''' Keeping brushes on grid mainly helps because that ensures that all sides of brush are planar... (i guess). Can anyone confirm this? I just wrote this from my own experience, because making maps this way never caused any holes in it. BTW, all sides of antiportals also MUST be planar, so aligning vertices to grid helps here too.

'''Nercury:''' Ok, i have spend some time trying to create BSP hole, i used two intersecting brushes. I was unable to create any hole with not planar cube faces (geometry was very simple though), but i was very succesfull as soon as i turned off [[Legacy:Snap To Grid|Snap To Grid]] feature. So my conclusion is: align, align, and align.

'''StarWeaver:''' In generic mode (camera mode? whatever the editor starts in), right clicking a vertex of any selected brush or set of selected brushes will both set the pivot to that vertex and snap that vertex to the nearest grid point (dragging along the entire selection). It's really helpful when I import a builder brush or insert a prefab and it decides to place it at some random off-grid or on-some-other-grid location.

Also, I don't understand that note about making sure to hold control while vertex editing. I *HAVE* to hold down control when moving *ANYTHING* in the editor regardless of grid settings, unless I'm missing something?

'''Nercury:''' I guess yes, unless your Unreal Editor works well... If you notice, that vertexes do not snap to grid when moving them, just hold ctrl :)

==Related Topics==

[[Legacy:Vertex Editing|Vertex Editing]]

[[Legacy:Snap To Grid|Snap To Grid]]

[[Legacy:Building With CSG|Building With CSG]]

[[Legacy:BSP Hole|BSP hole]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43773</id>
      <timestamp>2010-08-01T13:43:43Z</timestamp>
      <contributor>
        <username>WGH</username>
        <id>676</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">World of boxes is not the most interesting map. So we want to add more shapes, and that involves more complicated [[Legacy:BSP|BSP]]'s. So we rotate them, add or subtract in different ways, to make creative enviroinment we want. For example, some begginer mapper created a room by adding polygonal brush and subtracted rotated rectangular brush for entrance:

[[Image:Legacy_brushalignbad.jpeg|Legacy_brushalignbad.jpeg]]

That may work just fine as long as he does not have any other geometry around. But in more complicated map there '''must''' be more geometry around, and when he starts adding it, he will found that lots of brushes starts overlaping each other (yes, i saw maps like that):

[[Image:Legacy_BrushAlignBad2.jpeg|Legacy_BrushAlignBad2.jpeg]]

As we all know, [[Legacy:UnrealEd Goblin|UED goblin]] doesn't like that. In worst cases UED may even crash when [[Legacy:Rebuild|rebuilding]] BSP, but lucky ones will only get some random [[Legacy:BSP Hole|BSP hole]]s (i know, random is fun :D).

Actually, sollution is simple, as long as you keep '''ALL''' vertexes of '''ALL''' brushes [[Legacy:Snap To Grid|snapped to grid]]. Compare these pictures with previous ones:

[[Image:Legacy_brushaligngood.jpeg|Legacy_brushaligngood.jpeg]] @inline@BrushAlignGood2

If you align all brushes like that, without them intersecting each other, you can almost forget about [[Legacy:BSP Hole|BSP hole]]s. If you still get holes anyway, make sure all sides of brushes are planar. Also, you will soon find that it is much easier to add more BSP around well aligned brushes and to texture it.

Few notes on how to do that easily:
* You can select several vertices at once in rectangular area (in [[Legacy:Vertex Editing|vertex editing]] mode [[Image:Legacy_button.mode.vertex.gif|Legacy_button.mode.vertex.gif]]), by holding ''Ctrl+Alt+Left Mouse Button''.
* Right click on one of selected vertices to align all of them to grid.
* When you need to move already aligned vertices (in vertex editing mode), always do that with ''Ctrl'' '''OR''' ''Ctrl+Shift'' to keep them snaping to grid.

Thats all. Its hard to fix already big map with brush-jungle in it, but it is easy to make everything right from begining.

==Discussion==

'''Olympus Mons:''' Awsome stuff this should be a tooltip for unreal ed. I didnt know this.

'''Nercury:''' I was right when i thought that someone does not know this :D

'''Nercury:''' Keeping brushes on grid mainly helps because that ensures that all sides of brush are planar... (i guess). Can anyone confirm this? I just wrote this from my own experience, because making maps this way never caused any holes in it. BTW, all sides of antiportals also MUST be planar, so aligning vertices to grid helps here too.

'''Nercury:''' Ok, i have spend some time trying to create BSP hole, i used two intersecting brushes. I was unable to create any hole with not planar cube faces (geometry was very simple though), but i was very succesfull as soon as i turned off [[Legacy:Snap To Grid|Snap To Grid]] feature. So my conclusion is: align, align, and align.

'''StarWeaver:''' In generic mode (camera mode? whatever the editor starts in), right clicking a vertex of any selected brush or set of selected brushes will both set the pivot to that vertex and snap that vertex to the nearest grid point (dragging along the entire selection). It's really helpful when I import a builder brush or insert a prefab and it decides to place it at some random off-grid or on-some-other-grid location.

Also, I don't understand that note about making sure to hold control while vertex editing. I *HAVE* to hold down control when moving *ANYTHING* in the editor regardless of grid settings, unless I'm missing something?

'''Nercury:''' I guess yes, unless your Unreal Editor works well... If you notice, that vertexes do not snap to grid when moving them, just hold ctrl :)

==Related Topics==

[[Legacy:Vertex Editing|Vertex Editing]]

[[Legacy:Snap To Grid|Snap To Grid]]

[[Legacy:Building With CSG|Building With CSG]]

[[Legacy:BSP Hole|BSP hole]]

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kepstin</title>
    <id>1622</id>
    <revision>
      <id>4028</id>
      <timestamp>2005-01-04T19:43:50Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>[[Category Personal Page]], obviously</comment>
      <text xml:space="preserve">'''Draconx:''' Welcome to the wiki!

'''Mosquito:''' ....? The page is slightly lacking in the content department. Cheers to Kepstin though!

'''Tarquin:''' Hello and welcome!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4029</id>
      <timestamp>2005-01-04T10:45:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Draconx:''' Welcome to the wiki!

'''Mosquito:''' ....? The page is slightly lacking in the content department. Cheers to Kepstin though!

'''Tarquin:''' Hello and welcome!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kerlin</title>
    <id>1586</id>
    <revision>
      <id>3943</id>
      <timestamp>2003-07-24T15:34:58Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Email me [http://www.kerlinsoftworks.com/about/contact.htm here]

My site: [http://www.kerlinsoftworks.com Kerlin Softworks]

===Projects===

All standalone apps. Non-UT projects.

[http://www.kerlinsoftworks.com/software/eleblend.htm Eleblend] texture blending for terrains

[http://www.kerlinsoftworks.com/software/ripplerain.htm Ripple Rain] animated rain billboards

[http://www.kerlinsoftworks.com/software/gradientthief.htm Gradient Thief] steals colors from existing images

[http://www.kerlinsoftworks.com/software/utsa.htm UT2003 Screenshot Assistant] batch image processing/resizing/gamma correction

[http://www.kerlinsoftworks.com/ut2k3/scanut/viewmap.php UT2003 PGAMA (pretty good attempt at map analysis)] online map analyzer; beta

[http://www.kerlinsoftworks.com/downloads/index.htm Gradient Thief (Unreal Script Enhanced)] This patch for UIU generates ColorScale() data for those pesky emitters

===UT2003 Projects===

[http://www.kerlinsoftworks.com/ut2k3/falseprophet Team False Prophet] 

===Journal===

====June 17, 2003====

Working on the basics of a mutator. Against recommendations, I've kept EACTFGame which extends CTFGame. I want to see concrete results of why I shouldn't extend CTFGame instead of &quot;you just shouldn't do that.&quot; At this stage, the preceding is a little ambiguous because, to put it bluntly, I don't know what the hell I'm doing. 

Some good news: I was able to successfully view the actor with editactor class=EACTFGame so that was nice. I simply used spawn() to create the new class in the PostBeginPlay of my mutator. My new class is there based upon the log entries firing off in PreBeginPlay. 

Some bad news: The ScoreFlag never ever happens, though. Next up is the fact that, at game start, I get &quot;plaaay!&quot; and then a second later or so &quot;plaaay!&quot;. Looks like I'm starting to get my concrete reasons for '''&quot;you just shouldn't do that&quot;''' which is fine. I'm dealing with people who have been where I'm at and they're trying to help but knowing that I shouldn't do something versus knowing the details of '''why''' as well as the effects is where I'll learn. Besides, if someone asks me someday, I don't want to say that they shouldn't do something without being able to back up what I say.

Anyway, to top things off I'm getting loads of AccessedNones, various AI errors, NothingToDo's for bots, and a whole lot more in my log. I made sure I have None checking before working with various objects but that sure as hell isn't cleaning up anything else. Now I'm not saying these guys aren't right. I'm sure they are, but I have to get burnt to learn it.

I do want to try one more thing, though, (optimistic aren't I?) :) and that's instead of spawning the class, just declaring it from within my mutator. That likely won't work either and although I could be +3 days ahead of where I'm at, I want to educate myself about UnrealScript not just make a mutator.

Conclusion: [[Legacy:Mychaeel|Mychaeel]] is right. I am wrong. I never thought otherwise but I wanted to see the meltdown myself...besides I'm too wet behind the ears to understand everything the guy is saying at this point. 

====June 18, 2003====

At the suggestion of Foxpaw and Sir Brizz, I'm using [[Legacy:GameRules|GameRules]] for my mutator and it's working oh so smoooth. Man I wish I was +3 days ahead. ;)

====June 19, 2003====

Man am I having a hard time figuring out what I can and can not safely subclass. I just saw mention on the help desk from [[Legacy:Foxpaw|Foxpaw]] that you ''can'' subclass [[Legacy:GameInfo|GameInfo]] but to do so successfully you need to subclass a bunch of other stuff.

I'm trying to get access to ScoreObjective just so I can see what kinds of stuff go in and out of it and if it's a viable alternative to subclassing CTFGame to figure out when a flag has been captured. As well, hopefully it can tell me when someone scores in Bombing Run.

Added it to the GameInfo page in hopes that someone might fill in the details so at least I know I'm dealing with the correct function. :)

The wiki here is one beautiful resource but as I start to dig in on my mutator, there's a lot that isn't there. 

Long term, I'll probably have to go with a Timer based polling approach to check the game state since I'm having so many issues with subclassing. It seems lazy, though, and I'm stubborn about learning the proper way to subclass some of the more complicated classes because I know I'll need to do it if I want to get into the really cool stuff. I'm not even really working on the '''real''' stuff yet. :/

====June 20, 2003====

Took a break from UnrealScript and am putting the finishing touches on a simple game balance tool. Don't know if it will work or not. The server and database are complete. It's tracking 88 different tags in a ut2 file as well as their frequency. Unfortunately, I can't go beyond xWeaponBase and figure out the actual weapon on the base so I'm kludging it a bit and saying that if there's ammo available for a weapon, then the weapon exists. The client is nearly complete; just needs some more robust error handling.

I've got it so people can put their own maps into the system for comparison. I figure that's the best way to handle it since the reporting will be in flux for...well, ever. They enter the info on the website, local client downloads and does the counts, raw counts are uploaded to the server. Queueing and basic reporting are all there.

I'm hoping to find interesting details about some of the better maps by running them through the utility. It's all online but isn't ready for primetime yet. So far, it's just some of the simple stuff and I need to bounce off some formulas with someone to really make it useful.

So far, in my initial testing I'm finding that 4 of the 6 Deathmatch maps have a &quot;Damage Health Index&quot; of between 10 and 15. That is, for every one point of health on a level there are 15 points of damage waiting for you in the form of ammo and so on.

Still a lot of work to do, though:
* make sure when I'm seeing x FlakAmmo that in UED there really are x flakammos. 
* filter out tags that have no valuable information. 
* get the compare two maps feature written; that's on hold until I get a solid version of the mapinfo page
* run all of the epic/de/ownage maps through it and look for interesting info
* use epic as a baseline for &quot;rating&quot; a map (in the loosest sense of the word)
* need to add &quot;segments&quot; for ownage, beyondunreal 7+ rating, unrealplayground 70+ rating, and epic; won't be hard...just needs to be done

Then again, I might just be making junk. Only the end result will show for certain.

====June 21, 2003====

Ohhhh yeeeaah! Some of the reporting is coming together. Here's Epic:

http://www.kerlinsoftworks.com/ut2k3/epic.html

====June 25, 2003====

Beta is up! [http://www.kerlinsoftworks.com/ut2k3/scanut/viewmap.php UT2003 PGAMA (pretty good attempt at map analysis)]

Comments and critical analysis are more than welcome. Fire away.

====July 8, 2003====

Having a lot more luck with creating the False Prophet Deathmatch game type than trying to create a mutator that knows about all games. It's been one hell of a learning experience. Still trying to get the false prophet to have an ambient light attached and get some emitter fx floating out of him so that he's an obvious target. Word on the wiki is that attaching to bones may not always work so I'm gonna follow Foxpaw's rec and see if I can attach it to the feet as is done in ComboSpeed. File that under &quot;Why didn't I think of that?&quot;

I playtested it a bit and was surprised to learn that it '''wasn't fun''' because it's too hard to find the enemy prophet. I decided to rip out the HUD from the Mutant game type and use it. The directional radar approach works much better and helps in defending your own prophet and finding the enemy. I think I'll leave the top and bottom messages in, though. Top message=enemy, Bottom message=friend. Top message might say &quot;God wants you to kill BotoxBot&quot; (since Botox is the enemy prophet) while the bottom message might say &quot;Defend Malcolm&quot; (your team's prophet).

I'm anxious to get home and test out some of the SquadAI I've been working on. In AssignSquadResponsibility, I'm telling a bot what to do based upon whether or not he's the prophet. 

&lt;uscript&gt;
        B.bJumpy = true;
        B.BaseAgressiveness = 0.0;
        B.CombatStyle = 1.0;
&lt;/uscript&gt;

If he's not, there's a 50/50 chance he'll try to defend the prophet or go after the other prophet via B.FindBestPathToward.

I'm totally unsure as to whether:
# a TeamAI component is needed
# I need to &quot;attach&quot; an Objective to the enemy prophet somehow
# B.FindBestPathToward will be a good solution/work at all

Fun factor has definitely improved but what I really need is that feeling of bot intelligence. AI is going to be very important. I want the adrenaline pumping when you see a swarm of bots coming at you, you're totally unarmed, and your team is duking it out while you're evading plasma fire.

====July 11, 2003====

As it turns out my bots weren't doing what I thought they were. It was an anomaly.

In fact, after I added AI for my bots, the whole thing went to hell with a quickness. Major disappointment. :( 

I find myself spinning in circles trying to determine how I should go about fixing the issue. A [[Legacy:GameObjective|GameObjective]] object is needed but it's a hack. What, I set the Location of the Objective passed upon the location of the prophet? Naah..too kludgy and that will definitely cause problems, I think.

How about [[Legacy:GameObject|GameObject]] and make the prophet hold it via SetHolder? That seems like the best solution but I'm not sure how I go about implementing it. When a player dies, I must move the game object to someone else or I'm afraid the bots will just stand around.

I've got some important information for the HUD radar in a ProphetGameReplicationInfo class and the current prophet is kept track of based upon PRI. Maybe I can just make sure the object gets a SetHolder call every n seconds. Hope that doesn't screw up the AI. 

Of course, when someone's a prophet I'm concerned about them not acting defensive/evasive. I most likely don't want them to Hunt. 

A lot of UnrealScript you can feel your way through but this AI stuff is REALLY in need of a good write up. Pieces of it are here on the wiki but some sample code would sure make a difference.

====July 13, 2003====

Well, looks like I might have started on a solution as far as AI.

In ProphetTeamAI I have a timer fire off every second. If there's an enemy or friendly prophet, the swaud's information about prophets is updated.

Now: Things are working really good...if you're not paying too much attention.

My problem now is that...hehe...the enemy is TOO aggressive. They'll run for weapons at the start but once they know about a prophet, it's blood lust aggressive rather than using distance weapons. I think my propblem is in ProphetSquadAI's CheckSquadObjectives:

&lt;uscript&gt;
return ( TryToIntercept(B, EnemyProphet.Pawn, EnemyProphet.Region.Zone) );
&lt;/uscript&gt;

I want them to find and kill the prophet but if they happen to spawn near a prophet, they don't go for weapons. Instead they just make a b line for the prophet. Once they arrive, they will stand right on top of him and unload...not very smart.

Defenders will sit on top of you and eventually back you into a corner if you are the prophet, as well.

I've temporarily abandoned putting the emitter on my prophet. I copied some mutant code and can get some stuff going there but I'm more focused on game play right now. Game play, game play, game play.

Things are looking up, though!

Once completed, I think I'll post the source code on the wiki. I'm waaaay too green to write a tutorial but I think if I put it up there with &quot;and this line is doing this&quot; some of the wiser folks here will correct me. An everybody wins sort of contribution: new folks learn from an example line by line and I can learn where I could have done something better.

====July 15th, 2003====

I gave it my best. I have to walk away, now. If I don't, I'll never finish. I'm 80% proud of it and 20% frustrated by what I can't figure out. [http://www.kerlinsoftworks.com/ut2k3/falseprophet False Prophets v100] has shipped.

====July 18th, 2003====

So I've ripped out all of the AI so I can step through it piece by piece. It's easier to debug a few lines in a function rather than trying to debug an entire &quot;code complete&quot; :) Team and SquadAI all at once.

Guess what? Found a bug in my AI. Not a little spider, more like a Flying Madagascar Hissing Cockroach. In my ProphetTeamAI I was looping through all squads and setting the Enemy and FriendlyProphet. I wrongly assumed that a particular instance of ProphetTeamAI would only see SquadAIs that it had created. Not the case: that loop would see ''all'' squads regardless of team. The effects of this bug are astronomical. Just massive. The fix was simple. 

&lt;uscript&gt;
if ( Team.TeamIndex = S.Team.TeamIndex ) {
    // Now it's safe to set the enemy and friendly prpohet
}
&lt;/uscript&gt;

Now I just have to figure out why teams do not fight until a first kill. There isn't anything other than logging of params in my AI code, right now. And they all end with an appropriate call to Super.

====July 22nd, 2003====

Oh how far False Prophets has come in the past few days. After getting poked in the eye with a sharp stick by the guys over at ModSquad, I realized I desperately needed polish for this to look good and play well.

From above? Team's weren't fighting because I forgot to return Super if there wasn't a prophet. Amatuer.

Polish and options. Neophosis said something about a longer shelf life for mods with a decent set of configs. Why it never occurred to me is still a mystery.

New options and a new config screen to go with it. Just need to figure out how to get my mod to actually use the configs set by the user. Shouldn't be hard. I'm sure it's here in the wiki. Anyways, here's some of the new stuff:

* Prophet gets periodic UDamage (10 secs), checkbox
* Prophet gets periodic health (10 health every 7 seconds), checkbox
* Prophet gets invisibility after being prophet for a very long time (after 3 mins), checkbox
* Use domination scoring (longevity = more points), checkbox
* Longevity bonus (10 sec udamage, 15 sec udamage, 20 sec udamage for various longevity &quot;levels&quot;), checkbox
* Prophet lights, checkbox
* Screen messages (&quot;You are chosen!&quot;, &quot;Your God Is Dead!&quot;, &quot;Destroy the False Prophet!&quot;, etc), checkbox
* Audio voiceovers (&quot;You are chosen!&quot;, &quot;Your God Is Dead!&quot;, &quot;Destroy the False Prophet!&quot;, etc), checkbox

To do:

* Prophet spawns redeemer explosion on death (looking in RedeemerWarhead but not having much luck)
* Curse combo (enemy team gradual health/speed decrease for 15 seconds; only the prophet can do this combo)
* Blessing combo (friendly team health/speed increase for 15 seconds; only the prophet can do this combo)
* Eye of God combo (pipedream at this point)

I don't think I want to over do it on configs. Letting users set too much (eg, ## health per ## seconds) sounds like a recipe for disaster. Just a la carte style rules.

====July 24th, 2003====

Big project at work. Won't have time to check the wiki for a few weeks. Development of False Prophets continues, however. :)

===Guestbook===

====Thanks for the welcome, guys!====

'''Wormbo:''' Hi and welcome to the Wiki. :) You can add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you like.

'''EntropicLqd:'''  Hello and welcome.  I hope you enjoy your stay at the Wiki.

'''Trystan:''' He comes bearing gifts. =)  Welcome home. =)

'''Trystan:''' What would I have to pay to get a copy of that &quot;Access Restricted, Lethal Force is Authorized&quot; graphic on a size suitable for printing on 8.5&quot; x 11&quot; and in greyscale?  Ah, hell, screw grayscale, we've got a color printer up front.  That sign would be awesome to put on our IT office door here. =)

'''Kerlin:''' I gotta 1200x1200 alternate version (same basic look but dirt is a bit different) I'll put up. :)

'''Trystan:''' I had the same problem with the links downloading.  Do something like this http://kerlinsoftworks.com/accessrestricted.jpg?a

'''Balu:''' me 2, me 2 - but a white background would be nice ;) (WTF am I still guest?!?)

'''Tarquin:''' Hi there. Belated welcome! :)

'''Kerlin:''' Heya, Tarquin. 

'''Foxpaw:''' Hey Kerlin, I didn't notice you were writing down the problems you were having with false prophets down here but I had a couple of ideas. For the prophet FX, you may be able to attach it to a better bone than the feet. I don't know about the head, but I know that the bone &quot;spine&quot; works for me, and it's pretty central. That might make it easier to see the prophet FX. When I recommended the feet, I mostly just meant to test it on a location that you knew worked to see if it was the bones or the code that sets it up to the bone. I don't know what the bone reference for the head is, but, like I said, &quot;spine&quot; seems to work and is centrally located. Depending on what the emitter looks like that might work well.

As for the AI, you may be able to control the AIs using AIScripts. AIScripts are meant to be placed in maps to tell bots about a certain &quot;trick&quot; they can do on the map, you may be able to exploit them to have your prophet run away and have other people cover the prophet. I haven't played with AIScripts yet, I just wrote my own pawn and controller classes from scratch because I didn't like the built in ones. :P Since you will almost definately want to retain the existing pawns, you could try the AIScripts. Unfortunately I don't know much about them so I couldn't really explain how to use them.

'''Foxpaw:''' I put up a list on [[Legacy:Bone Names|Bone Names]] of known bone names that you can reference through unrealscript. I haven't had much luck with the head bone, but you might be able to get it to work.

'''Kerlin:''' Thanks Fox. Sorry been lazy about updating the wiki. Been trying to hack through this code. See above journal. :) I will be certain to try your suggestion. Thanks again.

'''MythOpus:''' Hey Kerlin.  I downloaded your Team False Prophet mod and I haven't been able to get it to work. It runs just like a normal deathmatch time game.

'''Foxpaw:''' I left a note about this issue on the [[Legacy:Mod Ideas/False Prophets|Mod Ideas/False Prophets]] page. This is caused by a typo in the .int file that was apparently left in accidentally.

'''Kerlin:''' Sorry to hear you had problems, MythOpus. Unless you've got a sick sense of humor, wait until the next version. It's really just that ugly of a mod. Seriously. Major problems. Barely fun. Just bad, bad news...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3944</id>
      <timestamp>2003-07-23T02:18:12Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Email me [http://www.kerlinsoftworks.com/about/contact.htm here]

My site: [http://www.kerlinsoftworks.com Kerlin Softworks]

===Projects===

All standalone apps. Non-UT projects.

[http://www.kerlinsoftworks.com/software/eleblend.htm Eleblend] texture blending for terrains

[http://www.kerlinsoftworks.com/software/ripplerain.htm Ripple Rain] animated rain billboards

[http://www.kerlinsoftworks.com/software/gradientthief.htm Gradient Thief] steals colors from existing images

[http://www.kerlinsoftworks.com/software/utsa.htm UT2003 Screenshot Assistant] batch image processing/resizing/gamma correction

[http://www.kerlinsoftworks.com/ut2k3/scanut/viewmap.php UT2003 PGAMA (pretty good attempt at map analysis)] online map analyzer; beta

[http://www.kerlinsoftworks.com/downloads/index.htm Gradient Thief (Unreal Script Enhanced)] This patch for UIU generates ColorScale() data for those pesky emitters

===UT2003 Projects===

[http://www.kerlinsoftworks.com/ut2k3/falseprophet Team False Prophet] 

===Journal===

====June 17, 2003====

Working on the basics of a mutator. Against recommendations, I've kept EACTFGame which extends CTFGame. I want to see concrete results of why I shouldn't extend CTFGame instead of &quot;you just shouldn't do that.&quot; At this stage, the preceding is a little ambiguous because, to put it bluntly, I don't know what the hell I'm doing. 

Some good news: I was able to successfully view the actor with editactor class=EACTFGame so that was nice. I simply used spawn() to create the new class in the PostBeginPlay of my mutator. My new class is there based upon the log entries firing off in PreBeginPlay. 

Some bad news: The ScoreFlag never ever happens, though. Next up is the fact that, at game start, I get &quot;plaaay!&quot; and then a second later or so &quot;plaaay!&quot;. Looks like I'm starting to get my concrete reasons for '''&quot;you just shouldn't do that&quot;''' which is fine. I'm dealing with people who have been where I'm at and they're trying to help but knowing that I shouldn't do something versus knowing the details of '''why''' as well as the effects is where I'll learn. Besides, if someone asks me someday, I don't want to say that they shouldn't do something without being able to back up what I say.

Anyway, to top things off I'm getting loads of AccessedNones, various AI errors, NothingToDo's for bots, and a whole lot more in my log. I made sure I have None checking before working with various objects but that sure as hell isn't cleaning up anything else. Now I'm not saying these guys aren't right. I'm sure they are, but I have to get burnt to learn it.

I do want to try one more thing, though, (optimistic aren't I?) :) and that's instead of spawning the class, just declaring it from within my mutator. That likely won't work either and although I could be +3 days ahead of where I'm at, I want to educate myself about UnrealScript not just make a mutator.

Conclusion: [[Legacy:Mychaeel|Mychaeel]] is right. I am wrong. I never thought otherwise but I wanted to see the meltdown myself...besides I'm too wet behind the ears to understand everything the guy is saying at this point. 

====June 18, 2003====

At the suggestion of Foxpaw and Sir Brizz, I'm using [[Legacy:GameRules|GameRules]] for my mutator and it's working oh so smoooth. Man I wish I was +3 days ahead. ;)

====June 19, 2003====

Man am I having a hard time figuring out what I can and can not safely subclass. I just saw mention on the help desk from [[Legacy:Foxpaw|Foxpaw]] that you ''can'' subclass [[Legacy:GameInfo|GameInfo]] but to do so successfully you need to subclass a bunch of other stuff.

I'm trying to get access to ScoreObjective just so I can see what kinds of stuff go in and out of it and if it's a viable alternative to subclassing CTFGame to figure out when a flag has been captured. As well, hopefully it can tell me when someone scores in Bombing Run.

Added it to the GameInfo page in hopes that someone might fill in the details so at least I know I'm dealing with the correct function. :)

The wiki here is one beautiful resource but as I start to dig in on my mutator, there's a lot that isn't there. 

Long term, I'll probably have to go with a Timer based polling approach to check the game state since I'm having so many issues with subclassing. It seems lazy, though, and I'm stubborn about learning the proper way to subclass some of the more complicated classes because I know I'll need to do it if I want to get into the really cool stuff. I'm not even really working on the '''real''' stuff yet. :/

====June 20, 2003====

Took a break from UnrealScript and am putting the finishing touches on a simple game balance tool. Don't know if it will work or not. The server and database are complete. It's tracking 88 different tags in a ut2 file as well as their frequency. Unfortunately, I can't go beyond xWeaponBase and figure out the actual weapon on the base so I'm kludging it a bit and saying that if there's ammo available for a weapon, then the weapon exists. The client is nearly complete; just needs some more robust error handling.

I've got it so people can put their own maps into the system for comparison. I figure that's the best way to handle it since the reporting will be in flux for...well, ever. They enter the info on the website, local client downloads and does the counts, raw counts are uploaded to the server. Queueing and basic reporting are all there.

I'm hoping to find interesting details about some of the better maps by running them through the utility. It's all online but isn't ready for primetime yet. So far, it's just some of the simple stuff and I need to bounce off some formulas with someone to really make it useful.

So far, in my initial testing I'm finding that 4 of the 6 Deathmatch maps have a &quot;Damage Health Index&quot; of between 10 and 15. That is, for every one point of health on a level there are 15 points of damage waiting for you in the form of ammo and so on.

Still a lot of work to do, though:
* make sure when I'm seeing x FlakAmmo that in UED there really are x flakammos. 
* filter out tags that have no valuable information. 
* get the compare two maps feature written; that's on hold until I get a solid version of the mapinfo page
* run all of the epic/de/ownage maps through it and look for interesting info
* use epic as a baseline for &quot;rating&quot; a map (in the loosest sense of the word)
* need to add &quot;segments&quot; for ownage, beyondunreal 7+ rating, unrealplayground 70+ rating, and epic; won't be hard...just needs to be done

Then again, I might just be making junk. Only the end result will show for certain.

====June 21, 2003====

Ohhhh yeeeaah! Some of the reporting is coming together. Here's Epic:

http://www.kerlinsoftworks.com/ut2k3/epic.html

====June 25, 2003====

Beta is up! [http://www.kerlinsoftworks.com/ut2k3/scanut/viewmap.php UT2003 PGAMA (pretty good attempt at map analysis)]

Comments and critical analysis are more than welcome. Fire away.

====July 8, 2003====

Having a lot more luck with creating the False Prophet Deathmatch game type than trying to create a mutator that knows about all games. It's been one hell of a learning experience. Still trying to get the false prophet to have an ambient light attached and get some emitter fx floating out of him so that he's an obvious target. Word on the wiki is that attaching to bones may not always work so I'm gonna follow Foxpaw's rec and see if I can attach it to the feet as is done in ComboSpeed. File that under &quot;Why didn't I think of that?&quot;

I playtested it a bit and was surprised to learn that it '''wasn't fun''' because it's too hard to find the enemy prophet. I decided to rip out the HUD from the Mutant game type and use it. The directional radar approach works much better and helps in defending your own prophet and finding the enemy. I think I'll leave the top and bottom messages in, though. Top message=enemy, Bottom message=friend. Top message might say &quot;God wants you to kill BotoxBot&quot; (since Botox is the enemy prophet) while the bottom message might say &quot;Defend Malcolm&quot; (your team's prophet).

I'm anxious to get home and test out some of the SquadAI I've been working on. In AssignSquadResponsibility, I'm telling a bot what to do based upon whether or not he's the prophet. 

&lt;uscript&gt;
        B.bJumpy = true;
        B.BaseAgressiveness = 0.0;
        B.CombatStyle = 1.0;
&lt;/uscript&gt;

If he's not, there's a 50/50 chance he'll try to defend the prophet or go after the other prophet via B.FindBestPathToward.

I'm totally unsure as to whether:
# a TeamAI component is needed
# I need to &quot;attach&quot; an Objective to the enemy prophet somehow
# B.FindBestPathToward will be a good solution/work at all

Fun factor has definitely improved but what I really need is that feeling of bot intelligence. AI is going to be very important. I want the adrenaline pumping when you see a swarm of bots coming at you, you're totally unarmed, and your team is duking it out while you're evading plasma fire.

====July 11, 2003====

As it turns out my bots weren't doing what I thought they were. It was an anomaly.

In fact, after I added AI for my bots, the whole thing went to hell with a quickness. Major disappointment. :( 

I find myself spinning in circles trying to determine how I should go about fixing the issue. A [[Legacy:GameObjective|GameObjective]] object is needed but it's a hack. What, I set the Location of the Objective passed upon the location of the prophet? Naah..too kludgy and that will definitely cause problems, I think.

How about [[Legacy:GameObject|GameObject]] and make the prophet hold it via SetHolder? That seems like the best solution but I'm not sure how I go about implementing it. When a player dies, I must move the game object to someone else or I'm afraid the bots will just stand around.

I've got some important information for the HUD radar in a ProphetGameReplicationInfo class and the current prophet is kept track of based upon PRI. Maybe I can just make sure the object gets a SetHolder call every n seconds. Hope that doesn't screw up the AI. 

Of course, when someone's a prophet I'm concerned about them not acting defensive/evasive. I most likely don't want them to Hunt. 

A lot of UnrealScript you can feel your way through but this AI stuff is REALLY in need of a good write up. Pieces of it are here on the wiki but some sample code would sure make a difference.

====July 13, 2003====

Well, looks like I might have started on a solution as far as AI.

In ProphetTeamAI I have a timer fire off every second. If there's an enemy or friendly prophet, the swaud's information about prophets is updated.

Now: Things are working really good...if you're not paying too much attention.

My problem now is that...hehe...the enemy is TOO aggressive. They'll run for weapons at the start but once they know about a prophet, it's blood lust aggressive rather than using distance weapons. I think my propblem is in ProphetSquadAI's CheckSquadObjectives:

&lt;uscript&gt;
return ( TryToIntercept(B, EnemyProphet.Pawn, EnemyProphet.Region.Zone) );
&lt;/uscript&gt;

I want them to find and kill the prophet but if they happen to spawn near a prophet, they don't go for weapons. Instead they just make a b line for the prophet. Once they arrive, they will stand right on top of him and unload...not very smart.

Defenders will sit on top of you and eventually back you into a corner if you are the prophet, as well.

I've temporarily abandoned putting the emitter on my prophet. I copied some mutant code and can get some stuff going there but I'm more focused on game play right now. Game play, game play, game play.

Things are looking up, though!

Once completed, I think I'll post the source code on the wiki. I'm waaaay too green to write a tutorial but I think if I put it up there with &quot;and this line is doing this&quot; some of the wiser folks here will correct me. An everybody wins sort of contribution: new folks learn from an example line by line and I can learn where I could have done something better.

====July 15th, 2003====

I gave it my best. I have to walk away, now. If I don't, I'll never finish. I'm 80% proud of it and 20% frustrated by what I can't figure out. [http://www.kerlinsoftworks.com/ut2k3/falseprophet False Prophets v100] has shipped.

====July 18th, 2003====

So I've ripped out all of the AI so I can step through it piece by piece. It's easier to debug a few lines in a function rather than trying to debug an entire &quot;code complete&quot; :) Team and SquadAI all at once.

Guess what? Found a bug in my AI. Not a little spider, more like a Flying Madagascar Hissing Cockroach. In my ProphetTeamAI I was looping through all squads and setting the Enemy and FriendlyProphet. I wrongly assumed that a particular instance of ProphetTeamAI would only see SquadAIs that it had created. Not the case: that loop would see ''all'' squads regardless of team. The effects of this bug are astronomical. Just massive. The fix was simple. 

&lt;uscript&gt;
if ( Team.TeamIndex = S.Team.TeamIndex ) {
    // Now it's safe to set the enemy and friendly prpohet
}
&lt;/uscript&gt;

Now I just have to figure out why teams do not fight until a first kill. There isn't anything other than logging of params in my AI code, right now. And they all end with an appropriate call to Super.

====July 22nd, 2003====

Oh how far False Prophets has come in the past few days. After getting poked in the eye with a sharp stick by the guys over at ModSquad, I realized I desperately needed polish for this to look good and play well.

From above? Team's weren't fighting because I forgot to return Super if there wasn't a prophet. Amatuer.

Polish and options. Neophosis said something about a longer shelf life for mods with a decent set of configs. Why it never occurred to me is still a mystery.

New options and a new config screen to go with it. Just need to figure out how to get my mod to actually use the configs set by the user. Shouldn't be hard. I'm sure it's here in the wiki. Anyways, here's some of the new stuff:

* Prophet gets periodic UDamage (10 secs), checkbox
* Prophet gets periodic health (10 health every 7 seconds), checkbox
* Prophet gets invisibility after being prophet for a very long time (after 3 mins), checkbox
* Use domination scoring (longevity = more points), checkbox
* Longevity bonus (10 sec udamage, 15 sec udamage, 20 sec udamage for various longevity &quot;levels&quot;), checkbox
* Prophet lights, checkbox
* Screen messages (&quot;You are chosen!&quot;, &quot;Your God Is Dead!&quot;, &quot;Destroy the False Prophet!&quot;, etc), checkbox
* Audio voiceovers (&quot;You are chosen!&quot;, &quot;Your God Is Dead!&quot;, &quot;Destroy the False Prophet!&quot;, etc), checkbox

To do:

* Prophet spawns redeemer explosion on death (looking in RedeemerWarhead but not having much luck)
* Curse combo (enemy team gradual health/speed decrease for 15 seconds; only the prophet can do this combo)
* Blessing combo (friendly team health/speed increase for 15 seconds; only the prophet can do this combo)
* Eye of God combo (pipedream at this point)

I don't think I want to over do it on configs. Letting users set too much (eg, ## health per ## seconds) sounds like a recipe for disaster. Just a la carte style rules.

===Guestbook===

====Thanks for the welcome, guys!====

'''Wormbo:''' Hi and welcome to the Wiki. :) You can add yourself to the [[Legacy:Project Contributors|Project Contributors]] list if you like.

'''EntropicLqd:'''  Hello and welcome.  I hope you enjoy your stay at the Wiki.

'''Trystan:''' He comes bearing gifts. =)  Welcome home. =)

'''Trystan:''' What would I have to pay to get a copy of that &quot;Access Restricted, Lethal Force is Authorized&quot; graphic on a size suitable for printing on 8.5&quot; x 11&quot; and in greyscale?  Ah, hell, screw grayscale, we've got a color printer up front.  That sign would be awesome to put on our IT office door here. =)

'''Kerlin:''' I gotta 1200x1200 alternate version (same basic look but dirt is a bit different) I'll put up. :)

'''Trystan:''' I had the same problem with the links downloading.  Do something like this http://kerlinsoftworks.com/accessrestricted.jpg?a

'''Balu:''' me 2, me 2 - but a white background would be nice ;) (WTF am I still guest?!?)

'''Tarquin:''' Hi there. Belated welcome! :)

'''Kerlin:''' Heya, Tarquin. 

'''Foxpaw:''' Hey Kerlin, I didn't notice you were writing down the problems you were having with false prophets down here but I had a couple of ideas. For the prophet FX, you may be able to attach it to a better bone than the feet. I don't know about the head, but I know that the bone &quot;spine&quot; works for me, and it's pretty central. That might make it easier to see the prophet FX. When I recommended the feet, I mostly just meant to test it on a location that you knew worked to see if it was the bones or the code that sets it up to the bone. I don't know what the bone reference for the head is, but, like I said, &quot;spine&quot; seems to work and is centrally located. Depending on what the emitter looks like that might work well.

As for the AI, you may be able to control the AIs using AIScripts. AIScripts are meant to be placed in maps to tell bots about a certain &quot;trick&quot; they can do on the map, you may be able to exploit them to have your prophet run away and have other people cover the prophet. I haven't played with AIScripts yet, I just wrote my own pawn and controller classes from scratch because I didn't like the built in ones. :P Since you will almost definately want to retain the existing pawns, you could try the AIScripts. Unfortunately I don't know much about them so I couldn't really explain how to use them.

'''Foxpaw:''' I put up a list on [[Legacy:Bone Names|Bone Names]] of known bone names that you can reference through unrealscript. I haven't had much luck with the head bone, but you might be able to get it to work.

'''Kerlin:''' Thanks Fox. Sorry been lazy about updating the wiki. Been trying to hack through this code. See above journal. :) I will be certain to try your suggestion. Thanks again.

'''MythOpus:''' Hey Kerlin.  I downloaded your Team False Prophet mod and I haven't been able to get it to work. It runs just like a normal deathmatch time game.

'''Foxpaw:''' I left a note about this issue on the [[Legacy:Mod Ideas/False Prophets|Mod Ideas/False Prophets]] page. This is caused by a typo in the .int file that was apparently left in accidentally.

'''Kerlin:''' Sorry to hear you had problems, MythOpus. Unless you've got a sick sense of humor, wait until the next version. It's really just that ugly of a mod. Seriously. Major problems. Barely fun. Just bad, bad news...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KevlarSuit</title>
    <id>1611</id>
    <revision>
      <id>4004</id>
      <timestamp>2004-02-23T19:34:20Z</timestamp>
      <contributor>
        <ip>Du-069-0683.access.clara.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The kevlar suit was used in Unreal. It 'worked with your armour' to provide you added protection. It isn't actually useable in Unreal Tournament as far as I know (not without modifications anyway) and it will be automatically be replaced by the thy pads.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KevlarX</title>
    <id>1597</id>
    <revision>
      <id>3969</id>
      <timestamp>2003-05-13T09:57:00Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me ==

I'm a Wiki leech at the moment, one day I will contribute. (Hopefully :P)

My modding / coding experience goes back to the 'days of quake' .. When modding ment using batch files and dos EDIT to turn a rocket launcher into a dog launcher.

I suck up the knowledge here, and return nothing.

One day, when i'm not so busy coding i'll throw some more things (hopefully useful) up here. (I'm sure _that_ hasnt been said before)

Anyway, hello all!

----

'''GRAF!K:''' Hi. :tup:

'''Tarquin:''' Hello :) welcome to the site.</text>
    </revision>
    <revision>
      <id>3970</id>
      <timestamp>2003-05-13T09:02:28Z</timestamp>
      <contributor>
        <ip>KevlarX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About Me ==

I'm a Wiki leech at the moment, one day I will contribute. (Hopefully :P)

My modding / coding experience goes back to the 'days of quake' .. When modding ment using batch files and dos EDIT to turn a rocket launcher into a dog launcher.

I suck up the knowledge here, and return nothing.

One day, when i'm not so busy coding i'll throw some more things (hopefully useful) up here. (I'm sure _that_ hasnt been said before)

Anyway, hello all!

----

'''GRAF!K:''' Hi. :tup:</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KeyInventory</title>
    <id>1632</id>
    <revision>
      <id>4049</id>
      <timestamp>2005-12-03T00:50:14Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; KeyInventory (Package: UnrealGame)}}

This is the inventory item that will unlock (disable) [[Legacy:LockedObjective|LockedObjective]]s when a player touches it.

==Properties==

This property is hidden.
; [[Legacy:KeyPickup|KeyPickup]] MyPickup : The [[Legacy:Pickup|Pickup]] that spawned this KeyInventory.

==Functions==
; UnLock( [[Legacy:LockedObjective|LockedObjective]] O ) : Disables the objective.
; Destroyed() : Sets &lt;tt&gt;MyPickup&lt;/tt&gt; to state &lt;tt&gt;Pickup&lt;/tt&gt;.

==Related Topics==
* [[Legacy:LockedObjective|LockedObjective]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4050</id>
      <timestamp>2005-11-22T19:10:43Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| :: [[Legacy:UT2004|UT2004]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory|Inventory]] &gt;&gt; KeyInventory (Package: UnrealGame)}}

This is the inventory item that will unlock (disable) [[Legacy:LockedObjective|LockedObjective]]s when a player touches it.

==Properties==

This property is hidden.
; [[Legacy:KeyPickup|KeyPickup]] MyPickup : The [[Legacy:Pickup|Pickup]] that spawned this KeyInventory.

==Functions==
; UnLock( [[Legacy:LockedObjective|LockedObjective]] O ) : Disables the objective.
; Destroyed() : Sets &lt;tt&gt;MyPickup&lt;/tt&gt; to state &lt;tt&gt;Pickup&lt;/tt&gt;.

==Related Topics==
* [[Legacy:LockedObjective|LockedObjective]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KeyPickup</title>
    <id>1631</id>
    <revision>
      <id>4048</id>
      <timestamp>2005-11-22T18:30:23Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; KeyPickup (Package: UngrealGame)}}

This spawns a [[Legacy:KeyInventory|KeyInventory]] actor, which is used to unlock [[Legacy:LockedObjective|LockedObjective]]s.

For state behavoir of this item refer to the parent class [[Legacy:Pickup|Pickup]].

==Functions==
; [[Legacy:Inventory|Inventory]] SpawnCopy( [[Legacy:Pawn|Pawn]] Other ) : Calls &lt;tt&gt;Super.SpawnCopy&lt;/tt&gt;.  Also copies the Tag to KeyInventory.Tag and stores &lt;tt&gt;self&lt;/tt&gt; in KeyInventory.MyPickup.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keyboard Shortcuts</title>
    <id>1568</id>
    <revision>
      <id>3900</id>
      <timestamp>2008-03-18T05:14:18Z</timestamp>
      <contributor>
        <ip>129.110.193.11</ip>
      </contributor>
      <comment>*Added some viewport shortcuts.  Is there a reason these were left out.</comment>
      <text xml:space="preserve">Related pages:
* [[Legacy:Selecting Surfaces|Selecting Surfaces]] for more detail on surface shorcuts
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

===Mouse Click Shortcuts ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;A&lt;/code&gt; + mouse click
|Add actor there. 
|-
|&lt;code&gt;L&lt;/code&gt; + mouse click
|Add light there. 
|}

===Shortcut Keys ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;Delete&lt;/code&gt;
|Delete selected actors
|-
|&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;
|Slow, medium, and fast movement speed.
|-
|&lt;code&gt;F1&lt;/code&gt;
|Help
|-
|&lt;code&gt;F4&lt;/code&gt;
|Actor properties
|-
|&lt;code&gt;F5&lt;/code&gt;
|Surface properties
|-
|&lt;code&gt;F6&lt;/code&gt;
|Level properties
|-
|&lt;code&gt;F7&lt;/code&gt;
|Compile changed scripts
|-
|&lt;code&gt;F8&lt;/code&gt;
|Rebuilder
|-
|&lt;code&gt;B&lt;/code&gt;
|Toggle brush visibility in the current viewport
|-
|&lt;code&gt;E&lt;/code&gt;
|Toggle event lines in the current viewport (Does this do anything?)
|-
|&lt;code&gt;F&lt;/code&gt;
|Toggle fog visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;H&lt;/code&gt;
|Toggle actor visibility in the current viewport
|-
|&lt;code&gt;K&lt;/code&gt;
|Toggle backdrop visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;O&lt;/code&gt;
|Toggle volume visibility in the current viewport
|-
|&lt;code&gt;P&lt;/code&gt;
|Toggle player controls or realtime update of the viewport
|-
|&lt;code&gt;S&lt;/code&gt;
|Toggle selection highlight in the current viewport
|-
|&lt;code&gt;T&lt;/code&gt;
|Toggle terrain visiblity in the current viewport
|-
|&lt;code&gt;W&lt;/code&gt;
|Toggle static mesh visibility in the current viewport
|-
|&lt;code&gt;Shift-A&lt;/code&gt;
|Select all actors
|-
|&lt;code&gt;Shift-B&lt;/code&gt;
|Select all surfaces belonging to the selected surfaces' brushes
|-
|&lt;code&gt;Shift-C&lt;/code&gt;
|Select adjacent coplanar polygons
|-
|&lt;code&gt;Shift-D&lt;/code&gt;
|Duplicate selected actors
|-
|&lt;code&gt;Shift-F&lt;/code&gt;
|Select adjacent floors
|-
|&lt;code&gt;Shift-G&lt;/code&gt;
|Select surfaces belonging to the selected surfaces' groups
|-
|&lt;code&gt;Shift-I&lt;/code&gt;
|Select surfaces with items matching the selected surfaces' items
|-
|&lt;code&gt;Shift-J&lt;/code&gt;
|Select all adjacent surfaces (flood-fill)
|-
|&lt;code&gt;Shift-L&lt;/code&gt;
|Look ahead in the current viewport (no pitch or roll)
|-
|&lt;code&gt;Shift-M&lt;/code&gt;
|Memorize selected surfaces
|-
|&lt;code&gt;Shift-N&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Shift-O&lt;/code&gt;
|Select surfaces from intersection of selected surfaces and memory
|-
|&lt;code&gt;Shift-P&lt;/code&gt;
|Select all surfaces
|-
|&lt;code&gt;Shift-Q&lt;/code&gt;
|Reverse the set of selected surfaces
|-
|&lt;code&gt;Shift-R&lt;/code&gt;
|Recall memorized surface selection
|-
|&lt;code&gt;Shift-T&lt;/code&gt;
|Select all surfaces which use the current texture
|-
|&lt;code&gt;Shift-U&lt;/code&gt;
|Select union of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-W&lt;/code&gt;
|Select adjacent wall surfaces (flood-fill)
|-
|&lt;code&gt;Shift-X&lt;/code&gt;
|Select exclusive or of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-Y&lt;/code&gt;
|Select adjacent slanted surfaces
|-
|&lt;code&gt;Shift-Z&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Ctrl-A&lt;/code&gt;
|Add brush to world
|-
|&lt;code&gt;Ctrl-B&lt;/code&gt;
|Load brush
|-
|&lt;code&gt;Ctrl-C&lt;/code&gt;
|Copy
|-
|&lt;code&gt;Ctrl-D&lt;/code&gt;
|Deintersect brush with world
|-
|&lt;code&gt;Ctrl-E&lt;/code&gt;
|Save as
|-
|&lt;code&gt;Ctrl-L&lt;/code&gt;
|Save level
|-
|&lt;code&gt;Ctrl-O&lt;/code&gt;
|Load level
|-
|&lt;code&gt;Ctrl-P&lt;/code&gt;
|Play level
|-
|&lt;code&gt;Ctrl-N&lt;/code&gt;
|[[Legacy:Intersect|Intersect]] brush with world
|-
|&lt;code&gt;Ctrl-R&lt;/code&gt;
|Redo
|-
|&lt;code&gt;Ctrl-S&lt;/code&gt;
|Subtract brush from world
|-
|&lt;code&gt;Ctrl-V&lt;/code&gt;
|Paste
|-
|&lt;code&gt;Ctrl-W&lt;/code&gt;
|Duplicate
|-
|&lt;code&gt;Ctrl-X&lt;/code&gt;
|Cut
|-
|&lt;code&gt;Ctrl-Z&lt;/code&gt;
|Undo
|}

----

'''Mychaeel:'''  This list is highly redundant with [[Legacy:Selecting Surfaces|Selecting Surfaces]].  Before I bother to reorganize it to make it clearer, any objections to simply deleting the duplicate stuff?

'''Tarquin:'''  I can see reasons in favour or both options... :)

'''Mychaeel:'''  I think adding a link from [[Legacy:Selecting Surfaces|Selecting Surfaces]] to here is the best option &amp;ndash; the list can still be printed or viewed as a whole and no information coherence is lost.  The problem with content duplication (which is a Bad Thing, according to your own words) is that duplicated content tends to become inconsistent.

'''Tarquin:'''  urg... no, that wasn't me, that was my evil twin!!! Yeah, I'd say keep this complete list for reference, and [[Legacy:Selecting Surfaces|Selecting Surfaces]] as a reference for surface manipulation, and extra detail should go there. 

'''neilthecellist:''' Any possibility of including all the shortcuts? Forgive me if there is already page that includes mouse '''''and''''' keyboard shortcuts.

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3901</id>
      <timestamp>2007-12-29T17:14:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>same here, reat toturials and/or post in forums</comment>
      <text xml:space="preserve">Related pages:
* [[Legacy:Selecting Surfaces|Selecting Surfaces]] for more detail on surface shorcuts
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

===Mouse Click Shortcuts ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;A&lt;/code&gt; + mouse click
|Add actor there. 
|-
|&lt;code&gt;L&lt;/code&gt; + mouse click
|Add light there. 
|}

===Shortcut Keys ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;Delete&lt;/code&gt;
|Delete selected actors
|-
|&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;
|Slow, medium, and fast movement speed.
|-
|&lt;code&gt;F1&lt;/code&gt;
|Help
|-
|&lt;code&gt;F4&lt;/code&gt;
|Actor properties
|-
|&lt;code&gt;F5&lt;/code&gt;
|Surface properties
|-
|&lt;code&gt;F6&lt;/code&gt;
|Level properties
|-
|&lt;code&gt;F7&lt;/code&gt;
|Compile changed scripts
|-
|&lt;code&gt;F8&lt;/code&gt;
|Rebuilder
|-
|&lt;code&gt;B&lt;/code&gt;
|Toggle brush visibility in the current viewport
|-
|&lt;code&gt;H&lt;/code&gt;
|Toggle actor visibility in the current viewport
|-
|&lt;code&gt;P&lt;/code&gt;
|Toggle player controls or realtime update of the viewport
|-
|&lt;code&gt;Shift-A&lt;/code&gt;
|Select all actors
|-
|&lt;code&gt;Shift-B&lt;/code&gt;
|Select all surfaces belonging to the selected surfaces' brushes
|-
|&lt;code&gt;Shift-C&lt;/code&gt;
|Select adjacent coplanar polygons
|-
|&lt;code&gt;Shift-D&lt;/code&gt;
|Duplicate selected actors
|-
|&lt;code&gt;Shift-F&lt;/code&gt;
|Select adjacent floors
|-
|&lt;code&gt;Shift-G&lt;/code&gt;
|Select surfaces belonging to the selected surfaces' groups
|-
|&lt;code&gt;Shift-I&lt;/code&gt;
|Select surfaces with items matching the selected surfaces' items
|-
|&lt;code&gt;Shift-J&lt;/code&gt;
|Select all adjacent surfaces (flood-fill)
|-
|&lt;code&gt;Shift-L&lt;/code&gt;
|Look ahead in the current viewport (no pitch or roll)
|-
|&lt;code&gt;Shift-M&lt;/code&gt;
|Memorize selected surfaces
|-
|&lt;code&gt;Shift-N&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Shift-O&lt;/code&gt;
|Select surfaces from intersection of selected surfaces and memory
|-
|&lt;code&gt;Shift-P&lt;/code&gt;
|Select all surfaces
|-
|&lt;code&gt;Shift-Q&lt;/code&gt;
|Reverse the set of selected surfaces
|-
|&lt;code&gt;Shift-R&lt;/code&gt;
|Recall memorized surface selection
|-
|&lt;code&gt;Shift-T&lt;/code&gt;
|Select all surfaces which use the current texture
|-
|&lt;code&gt;Shift-U&lt;/code&gt;
|Select union of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-W&lt;/code&gt;
|Select adjacent wall surfaces (flood-fill)
|-
|&lt;code&gt;Shift-X&lt;/code&gt;
|Select exclusive or of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-Y&lt;/code&gt;
|Select adjacent slanted surfaces
|-
|&lt;code&gt;Shift-Z&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Ctrl-A&lt;/code&gt;
|Add brush to world
|-
|&lt;code&gt;Ctrl-B&lt;/code&gt;
|Load brush
|-
|&lt;code&gt;Ctrl-C&lt;/code&gt;
|Copy
|-
|&lt;code&gt;Ctrl-D&lt;/code&gt;
|Deintersect brush with world
|-
|&lt;code&gt;Ctrl-E&lt;/code&gt;
|Save as
|-
|&lt;code&gt;Ctrl-L&lt;/code&gt;
|Save level
|-
|&lt;code&gt;Ctrl-O&lt;/code&gt;
|Load level
|-
|&lt;code&gt;Ctrl-P&lt;/code&gt;
|Play level
|-
|&lt;code&gt;Ctrl-N&lt;/code&gt;
|[[Legacy:Intersect|Intersect]] brush with world
|-
|&lt;code&gt;Ctrl-R&lt;/code&gt;
|Redo
|-
|&lt;code&gt;Ctrl-S&lt;/code&gt;
|Subtract brush from world
|-
|&lt;code&gt;Ctrl-V&lt;/code&gt;
|Paste
|-
|&lt;code&gt;Ctrl-W&lt;/code&gt;
|Duplicate
|-
|&lt;code&gt;Ctrl-X&lt;/code&gt;
|Cut
|-
|&lt;code&gt;Ctrl-Z&lt;/code&gt;
|Undo
|}

----

'''Mychaeel:'''  This list is highly redundant with [[Legacy:Selecting Surfaces|Selecting Surfaces]].  Before I bother to reorganize it to make it clearer, any objections to simply deleting the duplicate stuff?

'''Tarquin:'''  I can see reasons in favour or both options... :)

'''Mychaeel:'''  I think adding a link from [[Legacy:Selecting Surfaces|Selecting Surfaces]] to here is the best option &amp;ndash; the list can still be printed or viewed as a whole and no information coherence is lost.  The problem with content duplication (which is a Bad Thing, according to your own words) is that duplicated content tends to become inconsistent.

'''Tarquin:'''  urg... no, that wasn't me, that was my evil twin!!! Yeah, I'd say keep this complete list for reference, and [[Legacy:Selecting Surfaces|Selecting Surfaces]] as a reference for surface manipulation, and extra detail should go there. 

'''neilthecellist:''' Any possibility of including all the shortcuts? Forgive me if there is already page that includes mouse '''''and''''' keyboard shortcuts.

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43432</id>
      <timestamp>2010-06-10T05:15:27Z</timestamp>
      <contributor>
        <ip>96.48.246.28</ip>
      </contributor>
      <comment>/* Mouse Click Shortcuts */</comment>
      <text xml:space="preserve">Related pages:
* [[Legacy:Selecting Surfaces|Selecting Surfaces]] for more detail on surface shorcuts
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

===Mouse Click Shortcuts ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;A&lt;/code&gt; + mouse click
|Add actor there. 
|-
|&lt;code&gt;L&lt;/code&gt; + mouse click
|Add light there. 
|-
|&lt;code&gt;Alt&lt;/code&gt; + mouse drag item
|Duplicate item
|}

===Shortcut Keys ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;Delete&lt;/code&gt;
|Delete selected actors
|-
|&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;
|Slow, medium, and fast movement speed.
|-
|&lt;code&gt;F1&lt;/code&gt;
|Help
|-
|&lt;code&gt;F4&lt;/code&gt;
|Actor properties
|-
|&lt;code&gt;F5&lt;/code&gt;
|Surface properties
|-
|&lt;code&gt;F6&lt;/code&gt;
|Level properties
|-
|&lt;code&gt;F7&lt;/code&gt;
|Compile changed scripts
|-
|&lt;code&gt;F8&lt;/code&gt;
|Rebuilder
|-
|&lt;code&gt;B&lt;/code&gt;
|Toggle brush visibility in the current viewport
|-
|&lt;code&gt;E&lt;/code&gt;
|Toggle event lines in the current viewport (Does this do anything?)
|-
|&lt;code&gt;F&lt;/code&gt;
|Toggle fog visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;H&lt;/code&gt;
|Toggle actor visibility in the current viewport
|-
|&lt;code&gt;K&lt;/code&gt;
|Toggle backdrop visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;O&lt;/code&gt;
|Toggle volume visibility in the current viewport
|-
|&lt;code&gt;P&lt;/code&gt;
|Toggle player controls or realtime update of the viewport
|-
|&lt;code&gt;S&lt;/code&gt;
|Toggle selection highlight in the current viewport
|-
|&lt;code&gt;T&lt;/code&gt;
|Toggle terrain visiblity in the current viewport
|-
|&lt;code&gt;W&lt;/code&gt;
|Toggle static mesh visibility in the current viewport
|-
|&lt;code&gt;Shift-A&lt;/code&gt;
|Select all actors
|-
|&lt;code&gt;Shift-B&lt;/code&gt;
|Select all surfaces belonging to the selected surfaces' brushes
|-
|&lt;code&gt;Shift-C&lt;/code&gt;
|Select adjacent coplanar polygons
|-
|&lt;code&gt;Shift-D&lt;/code&gt;
|Duplicate selected actors
|-
|&lt;code&gt;Shift-F&lt;/code&gt;
|Select adjacent floors
|-
|&lt;code&gt;Shift-G&lt;/code&gt;
|Select surfaces belonging to the selected surfaces' groups
|-
|&lt;code&gt;Shift-I&lt;/code&gt;
|Select surfaces with items matching the selected surfaces' items
|-
|&lt;code&gt;Shift-J&lt;/code&gt;
|Select all adjacent surfaces (flood-fill)
|-
|&lt;code&gt;Shift-L&lt;/code&gt;
|Look ahead in the current viewport (no pitch or roll)
|-
|&lt;code&gt;Shift-M&lt;/code&gt;
|Memorize selected surfaces
|-
|&lt;code&gt;Shift-N&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Shift-O&lt;/code&gt;
|Select surfaces from intersection of selected surfaces and memory
|-
|&lt;code&gt;Shift-P&lt;/code&gt;
|Select all surfaces
|-
|&lt;code&gt;Shift-Q&lt;/code&gt;
|Reverse the set of selected surfaces
|-
|&lt;code&gt;Shift-R&lt;/code&gt;
|Recall memorized surface selection
|-
|&lt;code&gt;Shift-T&lt;/code&gt;
|Select all surfaces which use the current texture
|-
|&lt;code&gt;Shift-U&lt;/code&gt;
|Select union of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-W&lt;/code&gt;
|Select adjacent wall surfaces (flood-fill)
|-
|&lt;code&gt;Shift-X&lt;/code&gt;
|Select exclusive or of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-Y&lt;/code&gt;
|Select adjacent slanted surfaces
|-
|&lt;code&gt;Shift-Z&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Ctrl-A&lt;/code&gt;
|Add brush to world
|-
|&lt;code&gt;Ctrl-B&lt;/code&gt;
|Load brush
|-
|&lt;code&gt;Ctrl-C&lt;/code&gt;
|Copy
|-
|&lt;code&gt;Ctrl-D&lt;/code&gt;
|Deintersect brush with world
|-
|&lt;code&gt;Ctrl-E&lt;/code&gt;
|Save as
|-
|&lt;code&gt;Ctrl-L&lt;/code&gt;
|Save level
|-
|&lt;code&gt;Ctrl-O&lt;/code&gt;
|Load level
|-
|&lt;code&gt;Ctrl-P&lt;/code&gt;
|Play level
|-
|&lt;code&gt;Ctrl-N&lt;/code&gt;
|[[Legacy:Intersect|Intersect]] brush with world
|-
|&lt;code&gt;Ctrl-R&lt;/code&gt;
|Redo
|-
|&lt;code&gt;Ctrl-S&lt;/code&gt;
|Subtract brush from world
|-
|&lt;code&gt;Ctrl-V&lt;/code&gt;
|Paste
|-
|&lt;code&gt;Ctrl-W&lt;/code&gt;
|Duplicate
|-
|&lt;code&gt;Ctrl-X&lt;/code&gt;
|Cut
|-
|&lt;code&gt;Ctrl-Z&lt;/code&gt;
|Undo
|}

----

'''Mychaeel:'''  This list is highly redundant with [[Legacy:Selecting Surfaces|Selecting Surfaces]].  Before I bother to reorganize it to make it clearer, any objections to simply deleting the duplicate stuff?

'''Tarquin:'''  I can see reasons in favour or both options... :)

'''Mychaeel:'''  I think adding a link from [[Legacy:Selecting Surfaces|Selecting Surfaces]] to here is the best option &amp;ndash; the list can still be printed or viewed as a whole and no information coherence is lost.  The problem with content duplication (which is a Bad Thing, according to your own words) is that duplicated content tends to become inconsistent.

'''Tarquin:'''  urg... no, that wasn't me, that was my evil twin!!! Yeah, I'd say keep this complete list for reference, and [[Legacy:Selecting Surfaces|Selecting Surfaces]] as a reference for surface manipulation, and extra detail should go there. 

'''neilthecellist:''' Any possibility of including all the shortcuts? Forgive me if there is already page that includes mouse '''''and''''' keyboard shortcuts.

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43433</id>
      <timestamp>2010-06-10T05:16:55Z</timestamp>
      <contributor>
        <ip>96.48.246.28</ip>
      </contributor>
      <comment>/* Mouse Click Shortcuts */</comment>
      <text xml:space="preserve">Related pages:
* [[Legacy:Selecting Surfaces|Selecting Surfaces]] for more detail on surface shorcuts
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

===Mouse Click Shortcuts ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;A&lt;/code&gt; + mouse click
|Add actor there. 
|-
|&lt;code&gt;L&lt;/code&gt; + mouse click
|Add light there. 
|-
|&lt;code&gt;Alt&lt;/code&gt; + mouse drag item
|Duplicate item.
|-
|&lt;code&gt;Shift&lt;/code&gt; + click on BSP surface
|Apply material.
|}

===Shortcut Keys ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;Delete&lt;/code&gt;
|Delete selected actors
|-
|&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;
|Slow, medium, and fast movement speed.
|-
|&lt;code&gt;F1&lt;/code&gt;
|Help
|-
|&lt;code&gt;F4&lt;/code&gt;
|Actor properties
|-
|&lt;code&gt;F5&lt;/code&gt;
|Surface properties
|-
|&lt;code&gt;F6&lt;/code&gt;
|Level properties
|-
|&lt;code&gt;F7&lt;/code&gt;
|Compile changed scripts
|-
|&lt;code&gt;F8&lt;/code&gt;
|Rebuilder
|-
|&lt;code&gt;B&lt;/code&gt;
|Toggle brush visibility in the current viewport
|-
|&lt;code&gt;E&lt;/code&gt;
|Toggle event lines in the current viewport (Does this do anything?)
|-
|&lt;code&gt;F&lt;/code&gt;
|Toggle fog visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;H&lt;/code&gt;
|Toggle actor visibility in the current viewport
|-
|&lt;code&gt;K&lt;/code&gt;
|Toggle backdrop visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;O&lt;/code&gt;
|Toggle volume visibility in the current viewport
|-
|&lt;code&gt;P&lt;/code&gt;
|Toggle player controls or realtime update of the viewport
|-
|&lt;code&gt;S&lt;/code&gt;
|Toggle selection highlight in the current viewport
|-
|&lt;code&gt;T&lt;/code&gt;
|Toggle terrain visiblity in the current viewport
|-
|&lt;code&gt;W&lt;/code&gt;
|Toggle static mesh visibility in the current viewport
|-
|&lt;code&gt;Shift-A&lt;/code&gt;
|Select all actors
|-
|&lt;code&gt;Shift-B&lt;/code&gt;
|Select all surfaces belonging to the selected surfaces' brushes
|-
|&lt;code&gt;Shift-C&lt;/code&gt;
|Select adjacent coplanar polygons
|-
|&lt;code&gt;Shift-D&lt;/code&gt;
|Duplicate selected actors
|-
|&lt;code&gt;Shift-F&lt;/code&gt;
|Select adjacent floors
|-
|&lt;code&gt;Shift-G&lt;/code&gt;
|Select surfaces belonging to the selected surfaces' groups
|-
|&lt;code&gt;Shift-I&lt;/code&gt;
|Select surfaces with items matching the selected surfaces' items
|-
|&lt;code&gt;Shift-J&lt;/code&gt;
|Select all adjacent surfaces (flood-fill)
|-
|&lt;code&gt;Shift-L&lt;/code&gt;
|Look ahead in the current viewport (no pitch or roll)
|-
|&lt;code&gt;Shift-M&lt;/code&gt;
|Memorize selected surfaces
|-
|&lt;code&gt;Shift-N&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Shift-O&lt;/code&gt;
|Select surfaces from intersection of selected surfaces and memory
|-
|&lt;code&gt;Shift-P&lt;/code&gt;
|Select all surfaces
|-
|&lt;code&gt;Shift-Q&lt;/code&gt;
|Reverse the set of selected surfaces
|-
|&lt;code&gt;Shift-R&lt;/code&gt;
|Recall memorized surface selection
|-
|&lt;code&gt;Shift-T&lt;/code&gt;
|Select all surfaces which use the current texture
|-
|&lt;code&gt;Shift-U&lt;/code&gt;
|Select union of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-W&lt;/code&gt;
|Select adjacent wall surfaces (flood-fill)
|-
|&lt;code&gt;Shift-X&lt;/code&gt;
|Select exclusive or of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-Y&lt;/code&gt;
|Select adjacent slanted surfaces
|-
|&lt;code&gt;Shift-Z&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Ctrl-A&lt;/code&gt;
|Add brush to world
|-
|&lt;code&gt;Ctrl-B&lt;/code&gt;
|Load brush
|-
|&lt;code&gt;Ctrl-C&lt;/code&gt;
|Copy
|-
|&lt;code&gt;Ctrl-D&lt;/code&gt;
|Deintersect brush with world
|-
|&lt;code&gt;Ctrl-E&lt;/code&gt;
|Save as
|-
|&lt;code&gt;Ctrl-L&lt;/code&gt;
|Save level
|-
|&lt;code&gt;Ctrl-O&lt;/code&gt;
|Load level
|-
|&lt;code&gt;Ctrl-P&lt;/code&gt;
|Play level
|-
|&lt;code&gt;Ctrl-N&lt;/code&gt;
|[[Legacy:Intersect|Intersect]] brush with world
|-
|&lt;code&gt;Ctrl-R&lt;/code&gt;
|Redo
|-
|&lt;code&gt;Ctrl-S&lt;/code&gt;
|Subtract brush from world
|-
|&lt;code&gt;Ctrl-V&lt;/code&gt;
|Paste
|-
|&lt;code&gt;Ctrl-W&lt;/code&gt;
|Duplicate
|-
|&lt;code&gt;Ctrl-X&lt;/code&gt;
|Cut
|-
|&lt;code&gt;Ctrl-Z&lt;/code&gt;
|Undo
|}

----

'''Mychaeel:'''  This list is highly redundant with [[Legacy:Selecting Surfaces|Selecting Surfaces]].  Before I bother to reorganize it to make it clearer, any objections to simply deleting the duplicate stuff?

'''Tarquin:'''  I can see reasons in favour or both options... :)

'''Mychaeel:'''  I think adding a link from [[Legacy:Selecting Surfaces|Selecting Surfaces]] to here is the best option &amp;ndash; the list can still be printed or viewed as a whole and no information coherence is lost.  The problem with content duplication (which is a Bad Thing, according to your own words) is that duplicated content tends to become inconsistent.

'''Tarquin:'''  urg... no, that wasn't me, that was my evil twin!!! Yeah, I'd say keep this complete list for reference, and [[Legacy:Selecting Surfaces|Selecting Surfaces]] as a reference for surface manipulation, and extra detail should go there. 

'''neilthecellist:''' Any possibility of including all the shortcuts? Forgive me if there is already page that includes mouse '''''and''''' keyboard shortcuts.

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43434</id>
      <timestamp>2010-06-10T05:19:07Z</timestamp>
      <contributor>
        <ip>96.48.246.28</ip>
      </contributor>
      <comment>/* Shortcut Keys */</comment>
      <text xml:space="preserve">Related pages:
* [[Legacy:Selecting Surfaces|Selecting Surfaces]] for more detail on surface shorcuts
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

===Mouse Click Shortcuts ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;A&lt;/code&gt; + mouse click
|Add actor there. 
|-
|&lt;code&gt;L&lt;/code&gt; + mouse click
|Add light there. 
|-
|&lt;code&gt;Alt&lt;/code&gt; + mouse drag item
|Duplicate item.
|-
|&lt;code&gt;Shift&lt;/code&gt; + click on BSP surface
|Apply material.
|}

===Shortcut Keys ===

{|

|-
|'''Shortcut'''
|'''Description''' 
|-
|&lt;code&gt;Delete&lt;/code&gt;
|Delete selected actors
|-
|&lt;code&gt;Home&lt;/code&gt;
|Go to selected actor
|-
|&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;
|Slow, medium, and fast movement speed.
|-
|&lt;code&gt;F1&lt;/code&gt;
|Help
|-
|&lt;code&gt;F4&lt;/code&gt;
|Actor properties
|-
|&lt;code&gt;F5&lt;/code&gt;
|Surface properties
|-
|&lt;code&gt;F6&lt;/code&gt;
|Level properties
|-
|&lt;code&gt;F7&lt;/code&gt;
|Compile changed scripts
|-
|&lt;code&gt;F8&lt;/code&gt;
|Rebuilder
|-
|&lt;code&gt;B&lt;/code&gt;
|Toggle brush visibility in the current viewport
|-
|&lt;code&gt;E&lt;/code&gt;
|Toggle event lines in the current viewport (Does this do anything?)
|-
|&lt;code&gt;F&lt;/code&gt;
|Toggle fog visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;H&lt;/code&gt;
|Toggle actor visibility in the current viewport
|-
|&lt;code&gt;K&lt;/code&gt;
|Toggle backdrop visibility in the current viewport (Does this do anything?)
|-
|&lt;code&gt;O&lt;/code&gt;
|Toggle volume visibility in the current viewport
|-
|&lt;code&gt;P&lt;/code&gt;
|Toggle player controls or realtime update of the viewport
|-
|&lt;code&gt;S&lt;/code&gt;
|Toggle selection highlight in the current viewport
|-
|&lt;code&gt;T&lt;/code&gt;
|Toggle terrain visiblity in the current viewport
|-
|&lt;code&gt;W&lt;/code&gt;
|Toggle static mesh visibility in the current viewport
|-
|&lt;code&gt;Shift-A&lt;/code&gt;
|Select all actors
|-
|&lt;code&gt;Shift-B&lt;/code&gt;
|Select all surfaces belonging to the selected surfaces' brushes
|-
|&lt;code&gt;Shift-C&lt;/code&gt;
|Select adjacent coplanar polygons
|-
|&lt;code&gt;Shift-D&lt;/code&gt;
|Duplicate selected actors
|-
|&lt;code&gt;Shift-F&lt;/code&gt;
|Select adjacent floors
|-
|&lt;code&gt;Shift-G&lt;/code&gt;
|Select surfaces belonging to the selected surfaces' groups
|-
|&lt;code&gt;Shift-I&lt;/code&gt;
|Select surfaces with items matching the selected surfaces' items
|-
|&lt;code&gt;Shift-J&lt;/code&gt;
|Select all adjacent surfaces (flood-fill)
|-
|&lt;code&gt;Shift-L&lt;/code&gt;
|Look ahead in the current viewport (no pitch or roll)
|-
|&lt;code&gt;Shift-M&lt;/code&gt;
|Memorize selected surfaces
|-
|&lt;code&gt;Shift-N&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Shift-O&lt;/code&gt;
|Select surfaces from intersection of selected surfaces and memory
|-
|&lt;code&gt;Shift-P&lt;/code&gt;
|Select all surfaces
|-
|&lt;code&gt;Shift-Q&lt;/code&gt;
|Reverse the set of selected surfaces
|-
|&lt;code&gt;Shift-R&lt;/code&gt;
|Recall memorized surface selection
|-
|&lt;code&gt;Shift-T&lt;/code&gt;
|Select all surfaces which use the current texture
|-
|&lt;code&gt;Shift-U&lt;/code&gt;
|Select union of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-W&lt;/code&gt;
|Select adjacent wall surfaces (flood-fill)
|-
|&lt;code&gt;Shift-X&lt;/code&gt;
|Select exclusive or of selected surfaces and memorized surfaces
|-
|&lt;code&gt;Shift-Y&lt;/code&gt;
|Select adjacent slanted surfaces
|-
|&lt;code&gt;Shift-Z&lt;/code&gt;
|Select none
|-
|&lt;code&gt;Ctrl-A&lt;/code&gt;
|Add brush to world
|-
|&lt;code&gt;Ctrl-B&lt;/code&gt;
|Load brush
|-
|&lt;code&gt;Ctrl-C&lt;/code&gt;
|Copy
|-
|&lt;code&gt;Ctrl-D&lt;/code&gt;
|Deintersect brush with world
|-
|&lt;code&gt;Ctrl-E&lt;/code&gt;
|Save as
|-
|&lt;code&gt;Ctrl-L&lt;/code&gt;
|Save level
|-
|&lt;code&gt;Ctrl-O&lt;/code&gt;
|Load level
|-
|&lt;code&gt;Ctrl-P&lt;/code&gt;
|Play level
|-
|&lt;code&gt;Ctrl-N&lt;/code&gt;
|[[Legacy:Intersect|Intersect]] brush with world
|-
|&lt;code&gt;Ctrl-R&lt;/code&gt;
|Redo
|-
|&lt;code&gt;Ctrl-S&lt;/code&gt;
|Subtract brush from world
|-
|&lt;code&gt;Ctrl-V&lt;/code&gt;
|Paste
|-
|&lt;code&gt;Ctrl-W&lt;/code&gt;
|Duplicate
|-
|&lt;code&gt;Ctrl-X&lt;/code&gt;
|Cut
|-
|&lt;code&gt;Ctrl-Z&lt;/code&gt;
|Undo
|}

----

'''Mychaeel:'''  This list is highly redundant with [[Legacy:Selecting Surfaces|Selecting Surfaces]].  Before I bother to reorganize it to make it clearer, any objections to simply deleting the duplicate stuff?

'''Tarquin:'''  I can see reasons in favour or both options... :)

'''Mychaeel:'''  I think adding a link from [[Legacy:Selecting Surfaces|Selecting Surfaces]] to here is the best option &amp;ndash; the list can still be printed or viewed as a whole and no information coherence is lost.  The problem with content duplication (which is a Bad Thing, according to your own words) is that duplicated content tends to become inconsistent.

'''Tarquin:'''  urg... no, that wasn't me, that was my evil twin!!! Yeah, I'd say keep this complete list for reference, and [[Legacy:Selecting Surfaces|Selecting Surfaces]] as a reference for surface manipulation, and extra detail should go there. 

'''neilthecellist:''' Any possibility of including all the shortcuts? Forgive me if there is already page that includes mouse '''''and''''' keyboard shortcuts.

==Related Topics ==
* [[Legacy:Binding Editor Commands|Binding Editor Commands]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keyframe</title>
    <id>1569</id>
    <revision>
      <id>3902</id>
      <timestamp>2007-04-22T09:35:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>sure, byte can have values 0-255, but internally movers only store 24 keysframes</comment>
      <text xml:space="preserve">==Definition==

A '''keyframe''' is a stored position and orientation for a [[Legacy:Mover|mover]]. When  a mover moves, it travels between keyframes. These are set in UnrealEd.

==A Note About UnrealEngine Versions==

The UnrealEngine, and therefore [[Legacy:Mover|Mover]] functionality, has changed over the years.  To determine which generation of the UnrealEngine you should be concerned with, here is a brief listing of UnrealEngines and their respective games:

* '''UnrealEngine1'''
** [[Legacy:Unreal 1|Unreal 1]]
** [[Legacy:Unreal Tournament|Unreal Tournament]]
** [[Legacy:Deus Ex|Deus Ex]]
* '''UnrealEngine2'''
** [[Legacy:UT2003|UT2003]]
** [[Legacy:Unreal 2|Unreal 2]]
** [[Legacy:UT2004|UT2004]]

See [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] for a more detailed list.

==Setting Keyframes==

Before you get to this point you should already have a [[Legacy:Mover|mover]] created.  If you have no idea how to do that than head on over to the [[Legacy:Create A Mover|Create A Mover]] page and read over that section first.

First generation [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] allow you to have up to 8 Keyframes, or 8 different positions for your [[Legacy:Mover|mover]] to be in. 

===The First 8 Keyframes===

The first 8 keyframes can be conveniently set via the [[Legacy:Actor Context Menu|Actor Context Menu]].

* First make sure you mover is in initial position you'd like it to start at.  

* Now right-click on the mover and in the context menu do: Movers -&gt; Key 1 

(this is the [[Legacy:Brush Context Menu|Brush Context Menu]] in first-generation, since the mover is a brush, and the [[Legacy:Actor Context Menu|Actor Context Menu]] in later generations since the mover is a [[Legacy:Static Mesh|static mesh]], but it really makes no difference here.)

* The mover is now in its ''key 1'' (which is actually the second keyframe&amp;ndash;a bit confusing, I know&amp;ndash;since we start on ''key 0'') position. At the moment this position is, by default, identical to ''key 0''.  Move the mover to its intended second position.  See below for some examples of what position to give the mover for ''key 1''.

* Now do a test. Right click and go back to ''key 0'' ([[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; ''Movers'' -&gt; ''Key 0'').  It should move back to its original position.  Right click and go to ''key 1'' and it should move back into position you set for it.  You have a working mover!

===Beyond 8 Keyframes===

Second generation [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] allow you to have up to 24 Keyframes, or 24 different positions for your [[Legacy:Mover|mover]] to be in.  

Beyond 8 keyframes, the [[Legacy:Actor Context Menu|Actor Context Menu]] can no longer be used.  Instead, select the desired Keyframe via the ''KeyNum'' property in the Mover's [[Legacy:Actor Properties Window|Actor Properties Window]].  This technique will work with keyframes 0 through 8 also, but the [[Legacy:Actor Context Menu|Actor Context Menu]] is generally deemed to be more efficient.

==General Things to Keep in Mind==

The ''Mover'' -&gt; ''NumKeys'' property must be set to the number of keys the mover will use; the default value is 2.

Moving or rotating keyframe 0 affects all the keyframes in the same way. For example, if you make your lift mover go up 256 units for keyframe 1, and then decide to move it to another spot in your map, put it back into keyframe 0 and move it. Keyframe 1 will still be directly above keyframe 0.

==Examples ==

; Simple swinging door : Say we're doing a simple swinging door.  So you add the door as a mover in its closed position.  At this point it is already set to keyframe 0.  Now right-click and set it to keyframe 1.  Then rotate the mover in its open position.
; Simple sliding door : See [[Legacy:Making Doors|Making Doors]].
; Rotating and swinging doors : This tutorial will show you how to make [[Legacy:Rotating And Swinging Doors|Rotating and Swinging Doors]] as I know how to make them.
; Constantly revolving movers : ''Not sure how easy this is to do with keyframes, but i found that it was fairly easy to just lock the revolving part to a second mover which does the 'moving' - see [[Legacy:Compound Movers|Compound Movers]]

==Next Step ==

You've told your mover ''how'' it should move, now you need to tell it ''when'' it should move. Move on to part 3: [[Legacy:Activating A Mover|Activating a mover]].

===Questions and Problems===

==2-4 Keyframe Movers==

(Please explain how to create a mover with 3 or 4 keyframes, after the 2nd it is hard to know what to do to get another frame, thats what's bugging me now, and prolly others aswell. Right now i can only make simple 2 keyframe movers, if i click frame 2 after frame 1 it moves to frame 0 and it stops recording frames. I've tried everything, and asked many....)

you need to make sure you have set ''Mover''-&gt;''numKeys'' to the number of frames you want to have. As long as ''numKeys'' is equal to or greater than 'Keynum', then there should be no trouble creating new keyframes.

==Related Topics ==
* [[Legacy:Mover|Mover]] &amp;ndash; Full list of what all the mover properties mean
* [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Covers steps prior to this tutorial
* [[Legacy:Making Lifts|Making Lifts]] &amp;ndash; Covers elements common to lifts, including mover &quot;states&quot;
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Lists all articles on movers.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3903</id>
      <timestamp>2007-04-22T08:23:37Z</timestamp>
      <contributor>
        <ip>Lorexvath</ip>
      </contributor>
      <comment>*Answered Question, Added to 'Constantly Revolving mover'</comment>
      <text xml:space="preserve">==Definition==

A '''keyframe''' is a stored position and orientation for a [[Legacy:Mover|mover]]. When  a mover moves, it travels between keyframes. These are set in UnrealEd.

==A Note About UnrealEngine Versions==

The UnrealEngine, and therefore [[Legacy:Mover|Mover]] functionality, has changed over the years.  To determine which generation of the UnrealEngine you should be concerned with, here is a brief listing of UnrealEngines and their respective games:

* '''UnrealEngine1'''
** [[Legacy:Unreal 1|Unreal 1]]
** [[Legacy:Unreal Tournament|Unreal Tournament]]
** [[Legacy:Deus Ex|Deus Ex]]
* '''UnrealEngine2'''
** [[Legacy:UT2003|UT2003]]
** [[Legacy:Unreal 2|Unreal 2]]
** [[Legacy:UT2004|UT2004]]

See [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] for a more detailed list.

==Setting Keyframes==

Before you get to this point you should already have a [[Legacy:Mover|mover]] created.  If you have no idea how to do that than head on over to the [[Legacy:Create A Mover|Create A Mover]] page and read over that section first.

First generation [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] allow you to have up to 8 Keyframes, or 8 different positions for your [[Legacy:Mover|mover]] to be in. 

===The First 8 Keyframes===

The first 8 keyframes can be conveniently set via the [[Legacy:Actor Context Menu|Actor Context Menu]].

* First make sure you mover is in initial position you'd like it to start at.  

* Now right-click on the mover and in the context menu do: Movers -&gt; Key 1 

(this is the [[Legacy:Brush Context Menu|Brush Context Menu]] in first-generation, since the mover is a brush, and the [[Legacy:Actor Context Menu|Actor Context Menu]] in later generations since the mover is a [[Legacy:Static Mesh|static mesh]], but it really makes no difference here.)

* The mover is now in its ''key 1'' (which is actually the second keyframe&amp;ndash;a bit confusing, I know&amp;ndash;since we start on ''key 0'') position. At the moment this position is, by default, identical to ''key 0''.  Move the mover to its intended second position.  See below for some examples of what position to give the mover for ''key 1''.

* Now do a test. Right click and go back to ''key 0'' ([[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; ''Movers'' -&gt; ''Key 0'').  It should move back to its original position.  Right click and go to ''key 1'' and it should move back into position you set for it.  You have a working mover!

===Beyond 8 Keyframes===

Second generation [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] allow you to have up to 256 Keyframes, or 256 different positions for your [[Legacy:Mover|mover]] to be in.  

Beyond 8 keyframes, the [[Legacy:Actor Context Menu|Actor Context Menu]] can no longer be used.  Instead, select the desired Keyframe via the ''KeyNum'' property in the Mover's [[Legacy:Actor Properties Window|Actor Properties Window]].  This technique will work with keyframes 0 through 8 also, but the [[Legacy:Actor Context Menu|Actor Context Menu]] is generally deemed to be more efficient.

==General Things to Keep in Mind==

The ''Mover'' -&gt; ''NumKeys'' property must be set to the number of keys the mover will use; the default value is 2.

Moving or rotating keyframe 0 affects all the keyframes in the same way. For example, if you make your lift mover go up 256 units for keyframe 1, and then decide to move it to another spot in your map, put it back into keyframe 0 and move it. Keyframe 1 will still be directly above keyframe 0.

==Examples ==

; Simple swinging door : Say we're doing a simple swinging door.  So you add the door as a mover in its closed position.  At this point it is already set to keyframe 0.  Now right-click and set it to keyframe 1.  Then rotate the mover in its open position.
; Simple sliding door : See [[Legacy:Making Doors|Making Doors]].
; Rotating and swinging doors : This tutorial will show you how to make [[Legacy:Rotating And Swinging Doors|Rotating and Swinging Doors]] as I know how to make them.
; Constantly revolving movers : ''Not sure how easy this is to do with keyframes, but i found that it was fairly easy to just lock the revolving part to a second mover which does the 'moving' - see [[Legacy:Compound Movers|Compound Movers]]

==Next Step ==

You've told your mover ''how'' it should move, now you need to tell it ''when'' it should move. Move on to part 3: [[Legacy:Activating A Mover|Activating a mover]].

===Questions and Problems===

==2-4 Keyframe Movers==

(Please explain how to create a mover with 3 or 4 keyframes, after the 2nd it is hard to know what to do to get another frame, thats what's bugging me now, and prolly others aswell. Right now i can only make simple 2 keyframe movers, if i click frame 2 after frame 1 it moves to frame 0 and it stops recording frames. I've tried everything, and asked many....)

you need to make sure you have set ''Mover''-&gt;''numKeys'' to the number of frames you want to have. As long as ''numKeys'' is equal to or greater than 'Keynum', then there should be no trouble creating new keyframes.

==Related Topics ==
* [[Legacy:Mover|Mover]] &amp;ndash; Full list of what all the mover properties mean
* [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Covers steps prior to this tutorial
* [[Legacy:Making Lifts|Making Lifts]] &amp;ndash; Covers elements common to lifts, including mover &quot;states&quot;
* [[Legacy:Mover Topics|Mover Topics]] &amp;ndash; Lists all articles on movers.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keypoint</title>
    <id>1570</id>
    <revision>
      <id>3904</id>
      <timestamp>2005-12-17T21:52:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Keypoint (Package: Engine)}}

Abstract parent class for invisible actors which mark important locations in a map.  This class doesn't declare any new properties or methods.

==Known Subclasses==
 Engine.Keypoint
  +- Engine.[[Legacy:AIScript|AIScript]]
  |   +- Gameplay.[[Legacy:ScriptedSequence|ScriptedSequence]]
  |       +- Gameplay.[[Legacy:ScriptedTrigger|ScriptedTrigger]]
  |       +- UnrealGame.[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
  |       +- Vehicles.[[Legacy:BulldogTrigger|BulldogTrigger]]
  +- Engine.[[Legacy:AmbientSound|AmbientSound]]
  +- Engine.[[Legacy:ClipMarker|ClipMarker]]
  +- Engine.[[Legacy:DecorationList|DecorationList]]
  +- Engine.[[Legacy:InterpolationPoint|InterpolationPoint]]
  +- Engine.[[Legacy:LookTarget|LookTarget]]
  +- Engine.[[Legacy:PolyMarker|PolyMarker]]
  +- Gameplay.[[Legacy:SpectatorCam|SpectatorCam]]
  +- UT2k4Assault.[[Legacy:InfoPod|InfoPod]]
  +- XGame.[[Legacy:AttractCamera|AttractCamera]]
  +- XWeapons.[[Legacy:TransbeaconTeleporter|TransbeaconTeleporter]]

==Related Topics==
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
** [[Legacy:Strategic Bots|Strategic Bots]]
* [[Legacy:Sounds|Sounds]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3905</id>
      <timestamp>2005-04-09T02:57:52Z</timestamp>
      <contributor>
        <ip>J3rky</ip>
      </contributor>
      <comment>overhaul &amp; completion</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; Keypoint}}

Abstract base class for invisible actors which mark things in a map.

==Properties ==

This class doesn't have any properties.

==Methods ==

This class doesn't have any methods.

==Events ==

This class doesn't have any events.

==Known subclasses ==

 Engine.Keypoint
   +-Engine.[[Legacy:AIScript|AIScript]]
   |     +-Gameplay.[[Legacy:ScriptedSequence|ScriptedSequence]]
   |           +-Gameplay.[[Legacy:ScriptedTrigger|ScriptedTrigger]]
   |           +-UnrealGame.[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
   |           +-Vehicles.[[Legacy:BulldogTrigger|BulldogTrigger]]
   |-Engine.[[Legacy:AmbientSound|AmbientSound]]
   |-Engine.[[Legacy:ClipMarker|ClipMarker]]
   |-Engine.[[Legacy:DecorationList|DecorationList]]
   |-Engine.[[Legacy:InterpolationPoint|InterpolationPoint]]
   |-Engine.[[Legacy:LookTarget|LookTarget]]
   |-Engine.[[Legacy:PolyMarker|PolyMarker]]
   |-Gameplay.[[Legacy:SpectatorCam|SpectatorCam]]
   |-XGame.[[Legacy:AttractCamera|AttractCamera]]
   |-XWeapons.[[Legacy:TransbeaconTeleporter|TransbeaconTeleporter]]
   |-UT2k4Assault.[[Legacy:InfoPod|InfoPod]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3906</id>
      <timestamp>2005-04-09T08:44:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; Keypoint (Package: Engine)}}

Abstract base class for invisible actors which mark things in a map. This class doesn't declare any new properties or methods.

==Known Subclasses==
 Engine.Keypoint
  +- Engine.[[Legacy:AIScript|AIScript]]
  |   +- Gameplay.[[Legacy:ScriptedSequence|ScriptedSequence]]
  |       +- Gameplay.[[Legacy:ScriptedTrigger|ScriptedTrigger]]
  |       +- UnrealGame.[[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]
  |       +- Vehicles.[[Legacy:BulldogTrigger|BulldogTrigger]]
  +- Engine.[[Legacy:AmbientSound|AmbientSound]]
  +- Engine.[[Legacy:ClipMarker|ClipMarker]]
  +- Engine.[[Legacy:DecorationList|DecorationList]]
  +- Engine.[[Legacy:InterpolationPoint|InterpolationPoint]]
  +- Engine.[[Legacy:LookTarget|LookTarget]]
  +- Engine.[[Legacy:PolyMarker|PolyMarker]]
  +- Gameplay.[[Legacy:SpectatorCam|SpectatorCam]]
  +- UT2k4Assault.[[Legacy:InfoPod|InfoPod]]
  +- XGame.[[Legacy:AttractCamera|AttractCamera]]
  +- XWeapons.[[Legacy:TransbeaconTeleporter|TransbeaconTeleporter]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keypoint (UT)</title>
    <id>1585</id>
    <revision>
      <id>3940</id>
      <timestamp>2006-02-03T01:12:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Keypoint (Package: Engine)}}

Keypoint is an abstract class. It is the parent of all classes that cause something to happen or have some effect at a particular point in the world.

==Properties ==

None (beyond those inherited from [[Legacy:Actor (UT)|Actor (UT)]], of course).

Keypoints have [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bStatic = true by default, which makes it impossible to move them by any means during the game, for instance by [[Legacy:AttachMover|attaching]] them to a [[Legacy:Mover (UT)|Mover (UT)]] (moving them in UnrealEd works fine, of course).

Roughly, Keypoint child classes are blocking actors, sounds, interpolation path points, and special actors that are only useful in single-player maps.

==Known subclasses ==
* [[Legacy:AmbientSound (UT)|AmbientSound (UT)]]
* [[Legacy:BlockAll|BlockAll]]
* [[Legacy:BlockMonsters|BlockMonsters]]
* [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:ClipMarker|ClipMarker]]
* [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]
* [[Legacy:Earthquake|Earthquake]]
* [[Legacy:GuardPoint|GuardPoint]]
* [[Legacy:HoldSpot|HoldSpot]]
* [[Legacy:InterpolationPoint|InterpolationPoint]]
* [[Legacy:LocationID|LocationID]]
* [[Legacy:MakeNaliFriendly|MakeNaliFriendly]]
* [[Legacy:ObjectPath|ObjectPath]]
* [[Legacy:OEMEnd|OEMEnd]]
* [[Legacy:PathPoint|PathPoint]]
* [[Legacy:Rockslide|Rockslide]]
* [[Legacy:SpectatorCam|SpectatorCam]]
* [[Legacy:ThingFactory|ThingFactory]]
** [[Legacy:CreatureFactory|CreatureFactory]]
* [[Legacy:ThrowStuff|ThrowStuff]]
* [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]
* [[Legacy:WayBeacon|WayBeacon]] 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3941</id>
      <timestamp>2003-10-11T20:26:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; Keypoint}}

Keypoint is an abstract class. It is the parent of all classes that cause something to happen or have some effect at a particular point in the world.

==Properties ==

None (beyond those inherited from [[Legacy:Actor|Actor]], of course).

Keypoints have [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bStatic = true by default, which makes it impossible to move them by any means during the game, for instance by [[Legacy:AttachMover|attaching]] them to a [[Legacy:Mover|Mover]] (moving them in UnrealEd works fine, of course).

Roughly, Keypoint child classes are blocking actors, sounds, interpolation path points, and special actors that are only useful in single-player maps.

==Known subclasses ==
* [[Legacy:AmbientSound (UT)|AmbientSound (UT)]]
* [[Legacy:BlockAll|BlockAll]]
* [[Legacy:BlockMonsters|BlockMonsters]]
* [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:ClipMarker|ClipMarker]]
* [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]
* [[Legacy:Earthquake|Earthquake]]
* [[Legacy:Guardpoint|Guardpoint]]
* [[Legacy:HoldSpot|HoldSpot]]
* [[Legacy:InterpolationPoint|InterpolationPoint]]
* [[Legacy:LocationID|LocationID]]
* [[Legacy:MakeNaliFriendly|MakeNaliFriendly]]
* [[Legacy:ObjectPath|ObjectPath]]
* [[Legacy:OEMEnd|OEMEnd]]
* [[Legacy:PathPoint|PathPoint]]
* [[Legacy:Rockslide|Rockslide]]
* [[Legacy:SpectatorCam|SpectatorCam]]
* [[Legacy:ThingFactory|ThingFactory]]
* [[Legacy:ThrowStuff|ThrowStuff]]
* [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]
* [[Legacy:WayBeacon|WayBeacon]]</text>
    </revision>
    <revision>
      <id>3942</id>
      <timestamp>2003-10-12T10:47:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Keypoint (Package: Engine)}}

Keypoint is an abstract class. It is the parent of all classes that cause something to happen or have some effect at a particular point in the world.

==Properties ==

None (beyond those inherited from [[Legacy:Actor (UT)|Actor (UT)]], of course).

Keypoints have [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bStatic = true by default, which makes it impossible to move them by any means during the game, for instance by [[Legacy:AttachMover|attaching]] them to a [[Legacy:Mover (UT)|Mover (UT)]] (moving them in UnrealEd works fine, of course).

Roughly, Keypoint child classes are blocking actors, sounds, interpolation path points, and special actors that are only useful in single-player maps.

==Known subclasses ==
* [[Legacy:AmbientSound (UT)|AmbientSound (UT)]]
* [[Legacy:BlockAll|BlockAll]]
* [[Legacy:BlockMonsters|BlockMonsters]]
* [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:ClipMarker|ClipMarker]]
* [[Legacy:DynamicAmbientSound|DynamicAmbientSound]]
* [[Legacy:Earthquake|Earthquake]]
* [[Legacy:Guardpoint|Guardpoint]]
* [[Legacy:HoldSpot|HoldSpot]]
* [[Legacy:InterpolationPoint|InterpolationPoint]]
* [[Legacy:LocationID|LocationID]]
* [[Legacy:MakeNaliFriendly|MakeNaliFriendly]]
* [[Legacy:ObjectPath|ObjectPath]]
* [[Legacy:OEMEnd|OEMEnd]]
* [[Legacy:PathPoint|PathPoint]]
* [[Legacy:Rockslide|Rockslide]]
* [[Legacy:SpectatorCam|SpectatorCam]]
* [[Legacy:ThingFactory|ThingFactory]]
* [[Legacy:ThrowStuff|ThrowStuff]]
* [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]
* [[Legacy:WayBeacon|WayBeacon]] 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keypoint Class Hierarchy (P2)</title>
    <id>1615</id>
    <revision>
      <id>4013</id>
      <timestamp>2004-05-29T00:19:40Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is a list of [[Legacy:Actor|Actor]]s that extend from [[Legacy:Keypoint|Keypoint]] in [[Legacy:Postal 2|Postal 2]].

 [[Legacy:Keypoint|Keypoint]]
 +- [[Legacy:DoorBufferPoint|DoorBufferPoint]]
 +- [[Legacy:WayBeacon|WayBeacon]]
 +- [[Legacy:AIScript|AIScript]]
 |  +- [[Legacy:ScriptedSequence (P2)|ScriptedSequence (P2)]]
 |     +- [[Legacy:FPSScriptedSequence|FPSScriptedSequence]]
 |     |  +- [[Legacy:P2ScriptedSequence|P2ScriptedSequence]]
 |     +- [[Legacy:MpScriptedSequence|MpScriptedSequence]]
 |     +- [[Legacy:ScriptedTrigger (P2)|ScriptedTrigger (P2)]]
 +- [[Legacy:AmbientSound|AmbientSound]]
 +- [[Legacy:ClipMarker|ClipMarker]]
 +- [[Legacy:DecorationList|DecorationList]]
 +- [[Legacy:EmitterTalkMP|EmitterTalkMP]]
 |  +- [[Legacy:FireEmitterTalk|FireEmitterTalk]]
 +- [[Legacy:InterestPoint|InterestPoint]]
 |  +- [[Legacy:QPoint|QPoint]]
 |  |  +- [[Legacy:QStartPoint|QStartPoint]]
 |  +- [[Legacy:StorePoint|StorePoint]]
 +- [[Legacy:InterpolationPoint|InterpolationPoint]]
 +- [[Legacy:LookTarget|LookTarget]]
 +- [[Legacy:LoopPoint|LoopPoint]]
 +- [[Legacy:MapPoint|MapPoint]]
 +- [[Legacy:OperateMePoint|OperateMePoint]]
 |  +- [[Legacy:CashRegPoint|CashRegPoint]]
 +- [[Legacy:PolyMarker|PolyMarker]]
 +- [[Legacy:QPathPoint|QPathPoint]]
 +- [[Legacy:StandHerePoint|StandHerePoint]]
 |  +- [[Legacy:BuyerStandPoint|BuyerStandPoint]]
 +- [[Legacy:StolenPoint|StolenPoint]]
 +- [[Legacy:Telemarketer|Telemarketer]]
 +- [[Legacy:TimedMarker|TimedMarker]]
    +- AnimalAttackMarker
    +- AuthorityOrderMarker
    |  +- BadGuyYellMarker
    +- BlipMarker
    |  +- DeadBodyMarker
    |  |  +- DeadDudeMarker
    |  |  +- DeadHeadMarker
    |  +- DesiredThingMarker
    |  |  +- CatnipMarker
    |  |  +- DonutMarker
    |  |  +- MoneyMarker
    |  |  +- OtherFoodMarker
    |  +- ParadeMarker
    +- BulletHitMarker
    +- DeadCatHitGuyMarker
    +- ExplosionMarker
    +- FunnyThingMarker
    +- GunfireMarker
    +- HeadExplodeMarker
    +- PanicMarker
    +- PawnBeatenMarker
    |  +- MeleeHitNothingMarker
    |     +- KickHitNothingMarker
    +- PawnShotMarker
    +- PropBreakMarker

[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Keypress Interactions</title>
    <id>1582</id>
    <revision>
      <id>3935</id>
      <timestamp>2005-09-27T18:37:36Z</timestamp>
      <contributor>
        <ip>Ip70-179-118-253.dc.dc.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">KeyPress Interactions are pretty neat in my opinion. You can intercept on what type of press it is (Press, Hold, Release), or even pick up on axis movement.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]] for this.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

A simple interaction:

&lt;uscript&gt;
Class MyInteraction extends Interaction;

Function Initialize()
{
    Log(&quot;Interaction Initialized&quot;);
}
&lt;/uscript&gt;

Dont forget to add

&lt;uscript&gt;
bActive=True
&lt;/uscript&gt;

Under defaultproperties (else this interaction wont do anything).

Now to see what is going on with these keypresses, add the following function under your initialize function.

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{
	if (Action == IST_Press)
		ViewportOwner.Actor.ClientMessage(&quot;Key PRESSED:&quot; @ Key);
	if (Action == IST_Release)
		ViewportOwner.Actor.ClientMessage(&quot;Key RELEASED:&quot; @ Key);
	if (Action == IST_Hold)
		ViewportOwner.Actor.ClientMessage(&quot;Key HELD:&quot; @ Key);
	if (Action == IST_Axis)
		ViewportOwner.Actor.ClientMessage(&quot;Key AXIS:&quot; @ Key);

	return false;
}
&lt;/uscript&gt;

This will make a small white message appear in the chat box in the bottom left of your screen telling you what you did, and which key you pressed. The keys are represented as numbers (try using Chr(Key) to convert them into letters and numbers. Remember keys like &quot;Home&quot; wont display properly like this), though you can use the ones listed in &lt;code&gt;Engine.Interactions&lt;/code&gt; to match on a key that has been pressed.

Note the &lt;code&gt;Return False;&lt;/code&gt;. If you return &quot;True&quot; in this function, the [[Legacy:InteractionMaster|InteractionMaster]] will cease to iterate through the interactions, it will stop at yours.

Another function, KeyType, can be used to build up a string from what keys have been pushed, as is demonstrated in &lt;code&gt;Engine.Console&lt;/code&gt;. I think that is all there is to it.

&lt;uscript&gt;
function bool KeyType( EInputKey Key, optional string Unicode )
{
	if (bIgnoreKeys)		
		return true;

	if( Key&gt;=0x20 )
	{
		if( Unicode != &quot;&quot; )
			TypedStr = TypedStr $ Unicode;
		else
			TypedStr = TypedStr $ Chr(Key);
           return( true );
	}
}
&lt;/uscript&gt;

Now that you can see which does what, lets look at a practical use for it. I will be modifying ICU (which was created in the [[Legacy:HUD Interactions|HUD Interactions]] page) to highlight enemys when you push Page Up, and Friendlys when you push Page Down.

I added this for the keypress function:

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{
	if ((Action == IST_Press) &amp;&amp; (Key == IK_PageUp))
		bDrawEnemy = True;
	if ((Action == IST_Release) &amp;&amp; (Key == IK_PageUp))
		bDrawEnemy = False;

	if ((Action == IST_Press) &amp;&amp; (Key == IK_PageDown))
		bDrawFriendly = True;
	if ((Action == IST_Release) &amp;&amp; (Key == IK_PageDown))
		bDrawFriendly = False;

	return false;
}
&lt;/uscript&gt;

That, quite basically, sets bDrawEnemy to TRUE when PageUp is pressed, and to FALSE when it is released. The same for bDrawFriendly.

I have added a couple of extra lines to the PostRender function to account for this, and only draw the right people:

&lt;uscript&gt;
simulated function PostRender( canvas Canvas )
{
	local Pawn P;
	local vector CameraLocation, dir, ScreenLocation;
	local rotator CameraRotation;
	local float dist, draw_scale;

	If ((bDrawEnemy) || (bDrawFriendly)) //if none are true, dont do anything. Saves processing.
		{
		foreach ViewportOwner.Actor.DynamicActors(class'Pawn', P)
			{
			if (ViewportOwner.Actor.Pawn == None || P == None)
				Return;
	
			//A trace to tell if you can see this thing
			If ((Canvas.Viewport.Actor.FastTrace(P.Location, ViewportOwner.Actor.Pawn.Location)) &amp;&amp; (P != ViewportOwner.Actor.Pawn) &amp;&amp; (P.PlayerReplicationInfo != None) &amp;&amp; (P.Health &gt; 0))
				{
				//Convert 3d location to 2d for display on the Canvas
				ScreenLocation = WorldToScreen(P.location);
				Canvas.GetCameraLocation(CameraLocation, CameraRotation);
				dir = P.Location - CameraLocation;
				dist = VSize(dir); //Distance between me and them			
				
				if (dir dot vector(CameraRotation) &gt; 0)
					{
					draw_scale = 512 / dist; //Calculate the drawscale, 512 is the &quot;1:1&quot; distance.
					//Set drawing params
					Canvas.SetPos(ScreenLocation.X - (32 * draw_scale), ScreenLocation.Y - (32 * draw_scale));
					Canvas.Style = 3;
					Canvas.SetDrawColor(255,255,255);
					if (bDrawEnemy) //If PageUp is depressed (bDrawEnemy is true), see if the pawn is an enemy, if so, draw him!
						if ((P.PlayerReplicationInfo.Team.TeamIndex != ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex) || (!GRI.bTeamGame))
							Canvas.DrawIcon(texture'red', draw_scale);
					if (bDrawFriendly) //If PageDown is depressed (bDrawFriendly is true), see if the pawn is an friendly, if so, draw him!
						if (P.PlayerReplicationInfo.Team.TeamIndex == ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex)
							Canvas.DrawIcon(texture'green', draw_scale);
					}
				}
			}
		}
}
&lt;/uscript&gt;

I must also make sure

&lt;uscript&gt;
bVisible=True
&lt;/uscript&gt;

Is in defaultproperties, else any render functions will be ignored.

Now I have a mutator that highlights my enemys in red when I push PageUp, and people on my team in green when I push PageDown. Neat, huh?

Checkout [[Legacy:InputKeyMap | Input Key Mapping]] for a full table of input keys, and their corresponding values.

----

With a little work, I figured out how to use these with the GUIUserKeyBinding class, to allow the user to select the keys used by the Interaction.

This part is in RadarInteraction.uc:

&lt;uscript&gt;
var int LastKey
var int Zooming;
var float ZoomDelta

// KeyEvent will detect keyup and keydown events for any keys bound to our
// zoom feature, and act accordingly
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{

	local string tmp;

// if the zoom key that is currently being held is released, end the zoom
	if(Action == IST_Release &amp;&amp; Zooming !=0 &amp;&amp; Key == LastKey)
	{
		LastKey=-1;
		Zooming=0;
		return True;
// a key has been pressed
	} else if (Action == IST_Press) {
// big ugliness here, we use console commands to get the name of the numeric
// key, and then the alias bound to that keyname
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
// if it's one of our two aliases (which don't actually exist), set the zoom
// direction, save the key that started the zoom, and eat the event
		if (tmp == &quot;tdzoomin&quot;)
		{
			LastKey = Key;
			Zooming = -1;
			return True;
		} else if (tmp ~= &quot;tdzoomout&quot;) {
			LastKey = Key;
			zooming = 1;
			return True;
		}
	}
// this event doesn't matter to us, so we pass it on for further processing
	return False;
}
&lt;/uscript&gt;

and this is from TacticalDisplayKeyBinding:

&lt;uscript&gt;
// Custom Key Bindings
class TacticalDisplayKeyBinding extends GUIUserKeyBinding;

defaultproperties
{
	KeyData(0)=(Alias=&quot;&quot;,KeyLabel=&quot;Tactical Display Controls&quot;,bIsSection=True)
	KeyData(1)=(alias=&quot;tdzoomin&quot;,KeyLabel=&quot;Zoom In&quot;,bIsSection=False)
	KeyData(2)=(alias=&quot;tdzoomout&quot;,KeyLabel=&quot;Zoom Out&quot;,bIsSection=False)
}
&lt;/uscript&gt;

The GUIUserKeyBinding allows the user to bind the keys aliases in the &quot;Controls&quot; tab of their settings.  When they press a key, the interaction checks to see if it is bound to one of the two aliases, and takes action.  This is adapted from the same code that the Controls tab uses to load the user's keybindings.

----

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''DJPaul:''' Not for me - once again, brilliantly written.  Cheers.

'''Claw:''' Hmm, this is excellently written. And now I finally realize what WorldToScreen() means. :rolleyes:

'''CheshireCat:''' Here's another KeyEvent example, that allows the user to select the keys used.  Any questions?

'''Mysterial:''' Why would you want to do all that key binding stuff in KeyEvent() (in the last example)? Why not just use an exec function instead?

'''Mychaeel:''' Because exec functions only work in certain classes, and you might not want to create those classes.  (It's a good idea not to replace game-relevant classes like xPlayer unless you absolutely have to for very good reasons ''other'' than doing things that could just as well be done less invasively, like what's described above.)

'''Mysterial:''' Ah, I was under the impression that Interactions were such a class. Obviously not ;)

Is there a list anywhere of classes in which exec functions work?

'''Mychaeel:''' Since you can register any amount of [[Legacy:Interaction|Interaction]] objects simultaneously (instead of having to replace an existing one by yours), they're safe and neat for modding.  (Though Joe Wilcox says that they weren't meant to be used for that.) &amp;ndash; I don't think there's a list of places where &quot;exec function&quot;s work.  Sounds like an idea for a new page though.

'''Tarquin:''' exec function the same as [[Legacy:Exec Directive|exec directive]]?

'''Mychaeel:''' No.  See [[Legacy:Function Syntax|Function Syntax]].

'''Nuleo:''' Has anyone figured out a better way to use the GUIUserKeyBindings without using exec commands just to get the key names?  In my interaction I was originally using this method 

    if ((Action == IST_Press) &amp;&amp; (Key == IK_PageUp))
         //Do something

But when I changed to this method (with a class extending GUIUserKeyBindings)

    tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
    tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
    // if it's one of our two aliases (which don't actually exist), set the zoom
    // direction, save the key that started the zoom, and eat the event
    if (tmp == &quot;tdzoomin&quot;)
         //Do something

I noticed a reduce in game speed and the sound was chopping up a bit.

'''Ceej:''' I've just been experimenting with this. For new game types, one place to install a keypress interaction seems to be in the InitInputSystem() event of your PlayerController subclass. For example:

&lt;uscript&gt;
event InitInputSystem()
{
	super.InitInputSystem();
	Player.interactionMaster.AddInteraction(&quot;MyPackage.MyKeyInteraction&quot;, Player);
}
&lt;/uscript&gt;

'''Foxpaw:''' Is it just me, or do interactions not pick up on joystick axes? Mine picks up my mouse axis movement, and joystick buttons, and joystick axes can be bound to stuff using preferences (so they appear to be being picked up by the game) but my interaction doesn't report any input when I move the joystick.

'''Newbie:''' How do I get keypress events for an actor in UT1?

'''Meowcat:''' @nuelo, I have not found a better way to locate the key yet, but you can use the initialize event to do a search for the key that you want, then save it for comparison.  I have used this for an interaction and it works ok except that you cannot change it midgame

'''Conzar:''' You can also add the interaction to a new GameInfo object (ut2004) here.

&lt;uscript&gt;
event PostLogin(PlayerController NewPlayer){
   super.PostLogin(NewPlayer);
   NewPlayer.Player.interactionMaster.AddInteraction(&quot;pkg.class&quot;,NewPlayer.Player);

}
&lt;/uscript&gt;

'''Wormbo:''' Your idea will only work in single player and on a listen server. Clients in network games won't see the interaction, though.

'''Kungfu Hampster:'''  Is there a way to use an interaction to change the input of a key?  For example, changing the right mouse button to be the use key?

'''Foxpaw:''' Yes. Depending on what exactly you're planning, you may be able to get any actor to do that.

You could have a keypress interaction return true on right mouse button, (to prevent the regular right mouse button event from propogating) and also make it manually activate the &quot;Use&quot; function. (I think that it is in Pawn on Controller or something.)

There's also a more direct approach which I'm hesitant to recommend, though it shouldn't have any problems unless maybe the game crashes. You can manually change the keybinds from any actor using set and get on the console. EG: (I've substituted Q for rightmouse, but I think &quot;RightMouse&quot; is the correct name for that input.)

&lt;uscript&gt;
  function ChangeRMB()
  {
    if ( Backup == &quot;&quot; )
      Backup = ConsoleCommand( &quot;Get Input Q&quot; );
    ConsoleCommand( &quot;Set Input Q Use&quot; );
  }

  function ChangeRMBBack()
  {
    ConsoleCommand( &quot;Set Input Q &quot;$Backup );
    Backup = &quot;&quot;;
  }

  function Destroyed()
  {
    ChangeRMBBack();  // Very important to make sure the keybind gets reset if the game is exited!

    Super.Destroyed();
  }
&lt;/uscript&gt;

'''MythOpus:''' I think this would also be useful for things other than Mutators... like on special secret areas in maps where you need a pass to get in...  ?  Is it possible to intercept keys without using mutators or interactions?

'''Kungfu Hampster:''' I don't think so.  There might be a way to grab the inputs from the playercontroller class, but using an interaction is really the best way to grab keypresses in my opinion.

'''Mindcry:''' I did some quick testing with stopwatch and found that: 

&lt;uscript&gt;tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key));&lt;/uscript&gt;

is about 3.3x faster than the

&lt;uscript&gt;   tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
   tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);&lt;/uscript&gt;

found in base UT2004 code and several examples throughout this wiki.</text>
    </revision>
    <revision>
      <id>3936</id>
      <timestamp>2005-03-29T05:09:24Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>' ; '</comment>
      <text xml:space="preserve">KeyPress Interactions are pretty neat in my opinion. You can intercept on what type of press it is (Press, Hold, Release), or even pick up on axis movement.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]] for this.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

A simple interaction:

&lt;uscript&gt;
Class MyInteraction extends Interaction;

Function Initialize()
{
    Log(&quot;Interaction Initialized&quot;);
}
&lt;/uscript&gt;

Dont forget to add

&lt;uscript&gt;
bActive=True
&lt;/uscript&gt;

Under defaultproperties (else this interaction wont do anything).

Now to see what is going on with these keypresses, add the following function under your initialize function.

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{
	if (Action == IST_Press)
		ViewportOwner.Actor.ClientMessage(&quot;Key PRESSED:&quot; @ Key);
	if (Action == IST_Release)
		ViewportOwner.Actor.ClientMessage(&quot;Key RELEASED:&quot; @ Key);
	if (Action == IST_Hold)
		ViewportOwner.Actor.ClientMessage(&quot;Key HELD:&quot; @ Key);
	if (Action == IST_Axis)
		ViewportOwner.Actor.ClientMessage(&quot;Key AXIS:&quot; @ Key);

	return false;
}
&lt;/uscript&gt;

This will make a small white message appear in the chat box in the bottom left of your screen telling you what you did, and which key you pressed. The keys are represented as numbers (try using Chr(Key) to convert them into letters and numbers. Remember keys like &quot;Home&quot; wont display properly like this), though you can use the ones listed in &lt;code&gt;Engine.Interactions&lt;/code&gt; to match on a key that has been pressed.

Note the &lt;code&gt;Return False;&lt;/code&gt;. If you return &quot;True&quot; in this function, the [[Legacy:InteractionMaster|InteractionMaster]] will cease to iterate through the interactions, it will stop at yours.

Another function, KeyType, can be used to build up a string from what keys have been pushed, as is demonstrated in &lt;code&gt;Engine.Console&lt;/code&gt;. I think that is all there is to it.

&lt;uscript&gt;
function bool KeyType( EInputKey Key, optional string Unicode )
{
	if (bIgnoreKeys)		
		return true;

	if( Key&gt;=0x20 )
	{
		if( Unicode != &quot;&quot; )
			TypedStr = TypedStr $ Unicode;
		else
			TypedStr = TypedStr $ Chr(Key);
           return( true );
	}
}
&lt;/uscript&gt;

Now that you can see which does what, lets look at a practical use for it. I will be modifying ICU (which was created in the [[Legacy:HUD Interactions|HUD Interactions]] page) to highlight enemys when you push Page Up, and Friendlys when you push Page Down.

I added this for the keypress function:

&lt;uscript&gt;
function bool KeyEvent(EInputKey Key, EInputAction Action, FLOAT Delta )
{
	if ((Action == IST_Press) &amp;&amp; (Key == IK_PageUp))
		bDrawEnemy = True;
	if ((Action == IST_Release) &amp;&amp; (Key == IK_PageUp))
		bDrawEnemy = False;

	if ((Action == IST_Press) &amp;&amp; (Key == IK_PageDown))
		bDrawFriendly = True;
	if ((Action == IST_Release) &amp;&amp; (Key == IK_PageDown))
		bDrawFriendly = False;

	return false;
}
&lt;/uscript&gt;

That, quite basically, sets bDrawEnemy to TRUE when PageUp is pressed, and to FALSE when it is released. The same for bDrawFriendly.

I have added a couple of extra lines to the PostRender function to account for this, and only draw the right people:

&lt;uscript&gt;
simulated function PostRender( canvas Canvas )
{
	local Pawn P;
	local vector CameraLocation, dir, ScreenLocation;
	local rotator CameraRotation;
	local float dist, draw_scale;

	If ((bDrawEnemy) || (bDrawFriendly)) //if none are true, dont do anything. Saves processing.
		{
		foreach ViewportOwner.Actor.DynamicActors(class'Pawn', P)
			{
			if (ViewportOwner.Actor.Pawn == None || P == None)
				Return;
	
			//A trace to tell if you can see this thing
			If ((Canvas.Viewport.Actor.FastTrace(P.Location, ViewportOwner.Actor.Pawn.Location)) &amp;&amp; (P != ViewportOwner.Actor.Pawn) &amp;&amp; (P.PlayerReplicationInfo != None) &amp;&amp; (P.Health &gt; 0))
				{
				//Convert 3d location to 2d for display on the Canvas
				ScreenLocation = WorldToScreen(P.location);
				Canvas.GetCameraLocation(CameraLocation, CameraRotation);
				dir = P.Location - CameraLocation;
				dist = VSize(dir); //Distance between me and them			
				
				if (dir dot vector(CameraRotation) &gt; 0)
					{
					draw_scale = 512 / dist; //Calculate the drawscale, 512 is the &quot;1:1&quot; distance.
					//Set drawing params
					Canvas.SetPos(ScreenLocation.X - (32 * draw_scale), ScreenLocation.Y - (32 * draw_scale));
					Canvas.Style = 3;
					Canvas.SetDrawColor(255,255,255);
					if (bDrawEnemy) //If PageUp is depressed (bDrawEnemy is true), see if the pawn is an enemy, if so, draw him!
						if ((P.PlayerReplicationInfo.Team.TeamIndex != ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex) || (!GRI.bTeamGame))
							Canvas.DrawIcon(texture'red', draw_scale);
					if (bDrawFriendly) //If PageDown is depressed (bDrawFriendly is true), see if the pawn is an friendly, if so, draw him!
						if (P.PlayerReplicationInfo.Team.TeamIndex == ViewportOwner.Actor.Pawn.PlayerReplicationInfo.Team.TeamIndex)
							Canvas.DrawIcon(texture'green', draw_scale);
					}
				}
			}
		}
}
&lt;/uscript&gt;

I must also make sure

&lt;uscript&gt;
bVisible=True
&lt;/uscript&gt;

Is in defaultproperties, else any render functions will be ignored.

Now I have a mutator that highlights my enemys in red when I push PageUp, and people on my team in green when I push PageDown. Neat, huh?

Checkout [[Legacy:InputKeyMap | Input Key Mapping]] for a full table of input keys, and their corresponding values.

----

With a little work, I figured out how to use these with the GUIUserKeyBinding class, to allow the user to select the keys used by the Interaction.

This part is in RadarInteraction.uc:

&lt;uscript&gt;
var int LastKey
var int Zooming;
var float ZoomDelta

// KeyEvent will detect keyup and keydown events for any keys bound to our
// zoom feature, and act accordingly
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{

	local string tmp;

// if the zoom key that is currently being held is released, end the zoom
	if(Action == IST_Release &amp;&amp; Zooming !=0 &amp;&amp; Key == LastKey)
	{
		LastKey=-1;
		Zooming=0;
		return True;
// a key has been pressed
	} else if (Action == IST_Press) {
// big ugliness here, we use console commands to get the name of the numeric
// key, and then the alias bound to that keyname
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
		tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
// if it's one of our two aliases (which don't actually exist), set the zoom
// direction, save the key that started the zoom, and eat the event
		if (tmp == &quot;tdzoomin&quot;)
		{
			LastKey = Key;
			Zooming = -1;
			return True;
		} else if (tmp ~= &quot;tdzoomout&quot;) {
			LastKey = Key;
			zooming = 1;
			return True;
		}
	}
// this event doesn't matter to us, so we pass it on for further processing
	return False;
}
&lt;/uscript&gt;

and this is from TacticalDisplayKeyBinding:

&lt;uscript&gt;
// Custom Key Bindings
class TacticalDisplayKeyBinding extends GUIUserKeyBinding;

defaultproperties
{
	KeyData(0)=(Alias=&quot;&quot;,KeyLabel=&quot;Tactical Display Controls&quot;,bIsSection=True)
	KeyData(1)=(alias=&quot;tdzoomin&quot;,KeyLabel=&quot;Zoom In&quot;,bIsSection=False)
	KeyData(2)=(alias=&quot;tdzoomout&quot;,KeyLabel=&quot;Zoom Out&quot;,bIsSection=False)
}
&lt;/uscript&gt;

The GUIUserKeyBinding allows the user to bind the keys aliases in the &quot;Controls&quot; tab of their settings.  When they press a key, the interaction checks to see if it is bound to one of the two aliases, and takes action.  This is adapted from the same code that the Controls tab uses to load the user's keybindings.

----

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''DJPaul:''' Not for me - once again, brilliantly written.  Cheers.

'''Claw:''' Hmm, this is excellently written. And now I finally realize what WorldToScreen() means. :rolleyes:

'''CheshireCat:''' Here's another KeyEvent example, that allows the user to select the keys used.  Any questions?

'''Mysterial:''' Why would you want to do all that key binding stuff in KeyEvent() (in the last example)? Why not just use an exec function instead?

'''Mychaeel:''' Because exec functions only work in certain classes, and you might not want to create those classes.  (It's a good idea not to replace game-relevant classes like xPlayer unless you absolutely have to for very good reasons ''other'' than doing things that could just as well be done less invasively, like what's described above.)

'''Mysterial:''' Ah, I was under the impression that Interactions were such a class. Obviously not ;)

Is there a list anywhere of classes in which exec functions work?

'''Mychaeel:''' Since you can register any amount of [[Legacy:Interaction|Interaction]] objects simultaneously (instead of having to replace an existing one by yours), they're safe and neat for modding.  (Though Joe Wilcox says that they weren't meant to be used for that.) &amp;ndash; I don't think there's a list of places where &quot;exec function&quot;s work.  Sounds like an idea for a new page though.

'''Tarquin:''' exec function the same as [[Legacy:Exec Directive|exec directive]]?

'''Mychaeel:''' No.  See [[Legacy:Function Syntax|Function Syntax]].

'''Nuleo:''' Has anyone figured out a better way to use the GUIUserKeyBindings without using exec commands just to get the key names?  In my interaction I was originally using this method 

    if ((Action == IST_Press) &amp;&amp; (Key == IK_PageUp))
         //Do something

But when I changed to this method (with a class extending GUIUserKeyBindings)

    tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYNAME&quot;@Key);
    tmp = ViewportOwner.Actor.ConsoleCommand(&quot;KEYBINDING&quot;@tmp);
    // if it's one of our two aliases (which don't actually exist), set the zoom
    // direction, save the key that started the zoom, and eat the event
    if (tmp == &quot;tdzoomin&quot;)
         //Do something

I noticed a reduce in game speed and the sound was chopping up a bit.

'''Ceej:''' I've just been experimenting with this. For new game types, one place to install a keypress interaction seems to be in the InitInputSystem() event of your PlayerController subclass. For example:

&lt;uscript&gt;
event InitInputSystem()
{
	super.InitInputSystem();
	Player.interactionMaster.AddInteraction(&quot;MyPackage.MyKeyInteraction&quot;, Player);
}
&lt;/uscript&gt;

'''Foxpaw:''' Is it just me, or do interactions not pick up on joystick axes? Mine picks up my mouse axis movement, and joystick buttons, and joystick axes can be bound to stuff using preferences (so they appear to be being picked up by the game) but my interaction doesn't report any input when I move the joystick.

'''Newbie:''' How do I get keypress events for an actor in UT1?

'''Meowcat:''' @nuelo, I have not found a better way to locate the key yet, but you can use the initialize event to do a search for the key that you want, then save it for comparison.  I have used this for an interaction and it works ok except that you cannot change it midgame

'''Conzar:''' You can also add the interaction to a new GameInfo object (ut2004) here.

&lt;uscript&gt;
event PostLogin(PlayerController NewPlayer){
   super.PostLogin(NewPlayer);
   NewPlayer.Player.interactionMaster.AddInteraction(&quot;pkg.class&quot;,NewPlayer.Player);

}
&lt;/uscript&gt;

'''Wormbo:''' Your idea will only work in single player and on a listen server. Clients in network games won't see the interaction, though.

'''Kungfu Hampster:'''  Is there a way to use an interaction to change the input of a key?  For example, changing the right mouse button to be the use key?

'''Foxpaw:''' Yes. Depending on what exactly you're planning, you may be able to get any actor to do that.

You could have a keypress interaction return true on right mouse button, (to prevent the regular right mouse button event from propogating) and also make it manually activate the &quot;Use&quot; function. (I think that it is in Pawn on Controller or something.)

There's also a more direct approach which I'm hesitant to recommend, though it shouldn't have any problems unless maybe the game crashes. You can manually change the keybinds from any actor using set and get on the console. EG: (I've substituted Q for rightmouse, but I think &quot;RightMouse&quot; is the correct name for that input.)

&lt;uscript&gt;
  function ChangeRMB()
  {
    if ( Backup == &quot;&quot; )
      Backup = ConsoleCommand( &quot;Get Input Q&quot; );
    ConsoleCommand( &quot;Set Input Q Use&quot; );
  }

  function ChangeRMBBack()
  {
    ConsoleCommand( &quot;Set Input Q &quot;$Backup );
    Backup = &quot;&quot;;
  }

  function Destroyed()
  {
    ChangeRMBBack();  // Very important to make sure the keybind gets reset if the game is exited!

    Super.Destroyed();
  }
&lt;/uscript&gt;

'''MythOpus:''' I think this would also be useful for things other than Mutators... like on special secret areas in maps where you need a pass to get in...  ?  Is it possible to intercept keys without using mutators or interactions?

'''Kungfu Hampster:''' I don't think so.  There might be a way to grab the inputs from the playercontroller class, but using an interaction is really the best way to grab keypresses in my opinion.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kicker</title>
    <id>1571</id>
    <revision>
      <id>3907</id>
      <timestamp>2007-11-19T15:11:25Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Kicker (Package: Botpack)}}

Kickers are used to construct map elements like jump pads. It basically adds a certain amount of velocity to the kicked actor. Which actors are kicked can be defined in the properties. A Kicker sends out its [[Legacy:Event|Event]] when its touched, too.

See [[Legacy:XKicker|xKicker]] for the UT2003 version of this class or [[Legacy:UTJumpPad|UTJumpPad]] for another UT2003 actor that kicks up players.

==Using Kickers ==

The maximum velocity a player usually has while running is 300 (''I think it was... &lt;- please verify''). Use this for orientation when setting up the kicker.

Besides slingshotting players to different locations, there is another unique thing that Kickers can be set up to do.  If a mapper sets up a Kicker so that it has a null KickVelocity, and then he sets bKillVelocity to true, he will create a Kicker that will halt the motion of a flying or falling player.  This can be used for such things as allowing players to fall great distances without dying when they land, or to catch a player as he flies or falls so that his motion can be controlled with more precision.

''Add other Tips &amp; Tricks here!''

Recommended sound: UnrealI.Pickups.BootJmp. To obtain a sound with a normal kickers, set it to trigger a [[Legacy:SpecialEvent|SpecialEvent]] actor. See the Extending below for a fix.

* [[Legacy:Pathing Kickers|Pathing Kickers]] has more on using kickers

==Properties ==

These are the properties and their default values:

; KickVelocity = (X=0; Y=0; Z=0) :  The additional amount of velocity the pawn will get.  If you find that you can't get a player ''kicked'' to the location you want then you are probably hitting the ''terminal velocity'' of the [[Legacy:ZoneInfo|zone]].  You can get around this by either increasing the zone's terminal velocity or adding another kicker with a large collision radius to give players the extra boost they need.
; KickedClasses = Pawn : Defines the actor classes which are kicked (including their subclasses). In most cases, this will be &quot;[[Legacy:Pawn (UT)|Pawn (UT)]]&quot;, &quot;[[Legacy:PlayerPawn|PlayerPawn]]&quot; or &quot;[[Legacy:Bot (UT)|Bot (UT)]]&quot;.
; bKillVelocity = False : If set to true, the initial velocity of the pawn when the kicker is touched will be eliminated. This means the kicker will not add to the players velocity but set it to the KickVelocity.  This must be set to true for completely consistent results from a kicker.
; bRandomize = False : If set to true, the kicker will not add the exact KickVelocity to the pawns velocity. The KickVelocity will be modified by the formula: &lt;br /&gt;NewKickVelocity = VSize(KickVelocity) * Normal(KickVelocity + 0.5 * VSize(KickVelocity) * VRand()) &lt;br /&gt;This is a vector of the same length of the original KickVelocity but pointing in a direction which may differ up to 30 degree from the original direction.

http://home.arcor.de/elbundee/images/Kicker.jpg

==Extending ==

TriggeredKicker toggles when triggered between normal and dormant states. When touched it plays a sound as well as kicking actors. No more mucking around with a SpecialEvent.  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

Notes:
* bInitiallyActive seems to have no effect :(
* I have no idea if this works in network games

&lt;uscript&gt;
//=============================================================================
// TriggeredKicker.
//=============================================================================
class TriggeredKicker extends Kicker;

var() bool bInitiallyActive ;
var() sound Sound ;

function PostBeginPlay() {
	if( !bInitiallyActive )
		gotostate('Dormant');
}

function Trigger( Actor Other, Pawn EventInstigator ) {
	gotostate('Dormant');
}

function Touch(  actor Other ) { 
	Super.Touch( Other );
	PlaySound( Sound );
}

state Dormant {
	ignores Touch, PostTouch;

	function Trigger( Actor Other, Pawn EventInstigator ) {
		gotostate('');
	}
}
&lt;/uscript&gt;

===Discussion ===

'''SabbathCat:''' The Triggered kicker can be triggered off, and it does seem to go to the dormant state when logged, but maybe something higher up the class tree isn't letting it become untouchable. It can definitely be triggered off though, so if someone wanted a quick fix, they could set up another normal trigger with bOnceOnly to true and have it's radius covering the entire map, to trigger all the kickers off initially. :)

Someone who knows more needs to take a look at it. 

'''Tarquin:''' It's because I used &quot;ignores&quot; instead of an empty function, I suspect. Try changing it :)

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3908</id>
      <timestamp>2004-01-03T13:06:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>expands -&gt; extends</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; Kicker (Package: Botpack)}}

Kickers are used to construct map elements like jump pads. It basically adds a certain amount of velocity to the kicked actor. Which actors are kicked can be defined in the properties. A Kicker sends out its [[Legacy:Event|Event]] when its touched, too.

See [[Legacy:XKicker|xKicker]] for the UT2003 version of this class or [[Legacy:UTJumpPad|UTJumpPad]] for another UT2003 actor that kicks up players.

==Using Kickers ==

The maximum velocity a player usually has while running is 300 (''I think it was... &lt;- please verify''). Use this for orientation when setting up the kicker.

Besides slingshotting players to different locations, there is another unique thing that Kickers can be set up to do.  If a mapper sets up a Kicker so that it has a null KickVelocity, and then he sets bKillVelocity to true, he will create a Kicker that will halt the motion of a flying or falling player.  This can be used for such things as allowing players to fall great distances without dying when they land, or to catch a player as he flies or falls so that his motion can be controlled with more precision.

''Add other Tips &amp; Tricks here!''

Recommended sound: UnrealI.Pickups.BootJmp. To obtain a sound with a normal kickers, set it to trigger a [[Legacy:SpecialEvent|SpecialEvent]] actor. See the Extending below for a fix.

* [[Legacy:Pathing Kickers|Pathing Kickers]] has more on using kickers

==Properties ==

These are the properties and their default values:

; KickVelocity = (X=0; Y=0; Z=0) :  The additional amount of velocity the pawn will get.  If you find that you can't get a player ''kicked'' to the location you want then you are probably hitting the ''terminal velocity'' of the [[Legacy:ZoneInfo|zone]].  You can get around this by either increasing the zone's terminal velocity or adding another kicker with a large collision radius to give players the extra boost they need.
; KickedClasses = Pawn : Defines the actor classes which are kicked (including their subclasses). In most cases, this will be &quot;[[Legacy:Pawn (UT)|Pawn (UT)]]&quot;, &quot;[[Legacy:PlayerPawn|PlayerPawn]]&quot; or &quot;[[Legacy:Bot (UT)|Bot (UT)]]&quot;.
; bKillVelocity = False : If set to true, the initial velocity of the pawn when the kicker is touched will be eliminated. This means the kicker will not add to the players velocity but set it to the KickVelocity.  This must be set to true for completely consistent results from a kicker.
; bRandomize = False : If set to true, the kicker will not add the exact KickVelocity to the pawns velocity. The KickVelocity will be modified by the formula: &lt;br /&gt;NewKickVelocity = VSize(KickVelocity) * Normal(KickVelocity + 0.5 * VSize(KickVelocity) * VRand()) &lt;br /&gt;This is a vector of the same length of the original KickVelocity but pointing in a direction which may differ up to 30 degree from the original direction.

http://home.arcor.de/elbundee/images/Kicker.jpg

==Extending ==

TriggeredKicker toggles when triggered between normal and dormant states. When touched it plays a sound as well as kicking actors. No more mucking around with a SpecialEvent.  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

Notes:
* bInitiallyActive seems to have no effect :(
* I have no idea if this works in network games

&lt;uscript&gt;
//=============================================================================
// TriggeredKicker.
//=============================================================================
class TriggeredKicker extends Kicker;

var() bool bInitiallyActive ;
var() sound Sound ;

function PostBeginPlay() {
	if( !bInitiallyActive )
		gotostate('Dormant');
}

function Trigger( Actor Other, Pawn EventInstigator ) {
	gotostate('Dormant');
}

function Touch(  actor Other ) { 
	Super.Touch( Other );
	PlaySound( Sound );
}

state Dormant {
	ignores Touch, PostTouch;

	function Trigger( Actor Other, Pawn EventInstigator ) {
		gotostate('');
	}
}
&lt;/uscript&gt;

===Discussion ===

'''SabbathCat:''' The Triggered kicker can be triggered off, and it does seem to go to the dormant state when logged, but maybe something higher up the class tree isn't letting it become untouchable. It can definitely be triggered off though, so if someone wanted a quick fix, they could set up another normal trigger with bOnceOnly to true and have it's radius covering the entire map, to trigger all the kickers off initially. :)

Someone who knows more needs to take a look at it. 

'''Tarquin:''' It's because I used &quot;ignores&quot; instead of an empty function, I suspect. Try changing it :)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kiff</title>
    <id>1640</id>
    <revision>
      <id>4066</id>
      <timestamp>2007-10-06T20:06:42Z</timestamp>
      <contributor>
        <ip>Kiff</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Under Construction...==

===Replication Example: The ESTransport's compartment. ===

I'm still pretty new to unreal coding (and modding), but I think I finally understand replication well enough to accomplish what I needed to do here and pass on what I've learned.  That said, I'm still learning so please give feedback.

I have a custom transport vehicle (thanks to showNOmercy for the model) that has an &quot;animated&quot; storage compartment.  The compartment is a box that can be lowered and then open its door.  Currently the animation is done purely in code.  This isn't the best way, but I opted to take this aproach since I simply wanted to know how to do this and I also didn't want to bug the modeler with creating the animations.  What does this have to do with replication? Keep reading...

==Animating the compartment==

The compartment's animation sequence is broken into six (0 - 5) parts or &quot;states&quot; in code (not unreal script states). 

* 0: Fully closed state: The box is in its up position and the door is closed
* 1: Lowering: The box is going from its up position to its low position. The door is still closed.
* 2: Low position, opening the door.
* 3: Low position, door is fully opened. This is a stopping point for the animation.
* 4: Low position, closing the door
* 5: Raising: The door has been closed and now the box is returning to its up position.

If this sounds complicated it's really not.  Don't worry too much about all of the states.  Just keep in mind that the box can be open, closed or in a transition from one to the other.

Here is an ingame [http://s63.photobucket.com/albums/h131/kiff&amp;ndash;/?action=view&amp;current=EsTRanspo-1.flv video]

A struct is used to represent the current state and for replicating it when it has changed

&lt;uscript&gt;
struct BoxState
{
	var float 	DoorRotation;
	var float 	BoxHeight;
	var int		Mode;
};&lt;/uscript&gt;

Keep in mind that we want the client and server to animate their own copies of the compartment. The struct &quot;CurrentBoxState&quot; could just be set as reliable, but then the server would be doing all of the animating and would spam all of the small incremental position updates over the network.

==Triggering the animation==

The driver opens or closes the compartment by right-clicking. If the door is currently open, then clicking again will start closing it.  Also, if the door is in motion, clicking will cause it to reverse and &quot;go back&quot;.

The driver's right-click causes &quot;VehicleFire&quot; to get called &lt;u&gt;on the server&lt;/u&gt; with bWasAltFire set to true.  Now the code will check the current state and change it accordingly:

&lt;uscript&gt;
function VehicleFire(bool bWasAltFire)
{
	if (!bWasAltFire)
		return;

	// to initiate opening the box, we must be &quot;parked&quot;
	if (0 == CurrentBoxState.Mode)
		if (VSize(Velocity) &gt; 1.5)
		{	 
			if (PlayerController(Controller) != None)
				PlayerController(Controller).ClientPlaySound(CantOpenDoorSound);

			return;
		}
		
	switch(CurrentBoxState.Mode)
	{
		case 0:	CurrentBoxState.Mode = 1;
				PlaySound(LowerBoxSound,,2.5*TransientSoundVolume);
				Enable('Tick');
				break;

		case 1:	CurrentBoxState.Mode = 5;
				break;

		case 2:	CurrentBoxState.Mode = 4;
				break;

		case 3:	CurrentBoxState.Mode = 4;
				PlaySound(OpenDoorSound,,3*TransientSoundVolume,,,0.5);
				Enable('Tick');
				break;

		case 4:	CurrentBoxState.Mode = 2;
				break;

		case 5:	CurrentBoxState.Mode = 1;
				break;

	}

	NewBoxState = CurrentBoxState;
	NewBoxState.Mode  = CurrentBoxState.Mode; // struct replication quirk
	BoxUpdateTime = Level.TimeSeconds;
	NetUpdateTime = Level.TimeSeconds - 1;
	
}
&lt;/uscript&gt;

The last four lines are where replication comes into play.  When the state changes on the server, it &quot;tells&quot; the clients by changing the replicated variables NewBoxState and BoxUpdateTime.  BoxUpdateTime is used as a counter of sorts to inform the client when it happened and gives the client a way to know that it's a new event. The very last line is a commonly used method to tell the server to start replicating as soon as possible, but note that NetUpdateTime is not a variable defined in my code.

'''Kiff:''' I think that &quot;BoxUpdateTime&quot; might need to be added to the struct to make sure it arrives at the same time.

'''Kiff:''' Now that I think about it, I don't even think the update time is needed. It was needed for an older method I was using, but I'm pretty sure that now just the state (.Mode) can just be checked for a change. 

Here is the replication block:

&lt;uscript&gt;
replication
{
    reliable if (Role == ROLE_Authority)
        BoxUpdateTime, NewBoxState;
}&lt;/uscript&gt;

When a client receives new values for replicated variables (and bNetNotify=True) the PostNetReceive event is fired.

&lt;uscript&gt;
simulated event PostNetReceive()
{
	if(BoxUpdateTime &gt; LastBoxUpdateTime)
	{
		LastBoxUpdateTime = BoxUpdateTime;
		CurrentBoxState =  NewBoxState;
		Enable('Tick');
	}
}
&lt;/uscript&gt;

If the variable BoxUpdateTime is newer (greater) than the last one we saved (with LastBoxUpdateTime),  we then know the NewBoxState struct has fresh data.  Now we can update our local CurrentBoxState with the newly replicated NewBoxState and then start the animation.

Now we're able to use PostNetReceive as a remote function call.  Unlike replicated functions that only reach a single (owner) client, this will reach all clients.  Any number of function calls can be carried out this way as long as we have unique replicated variables to inspect for each one.

To wrap things up, here's the function that does the &quot;animation&quot;.  It takes a time delta as an arguement when called from the Tick event. 

&lt;uscript&gt;
simulated function UpdateBoxPosition(float DT)
{
	local vector disp;
	local rotator doorRot;

	switch(CurrentBoxState.Mode)
	{
		case 0:	Disable('Tick'); // nothing moves in this state
				break;

		case 1:	CurrentBoxState.BoxHeight -= BoxMoveRate * DT;
				if (CurrentBoxState.BoxHeight &lt; LoweredBoxHeight)
				{
					CurrentBoxState.BoxHeight = LoweredBoxHeight;
					CurrentBoxState.Mode = 2;
					PlaySound(OpenDoorSound,,3*TransientSoundVolume,,,0.5);
				}
				break;

		case 2:	CurrentBoxState.DoorRotation -= DoorRotRate * DT;
				if (CurrentBoxState.DoorRotation &lt;= LoweredDoorRot)
				{
					CurrentBoxState.DoorRotation = LoweredDoorRot;
					CurrentBoxState.Mode = 3;
				}
				break;

		case 3:	Disable('Tick'); // this is a &quot;stopped&quot; state 
				break;

		case 4:	CurrentBoxState.DoorRotation += DoorRotRate * DT;
				if (CurrentBoxState.DoorRotation &gt;= 0)
				{
					CurrentBoxState.DoorRotation = 0;
					CurrentBoxState.Mode = 5;
					PlaySound(LowerBoxSound,,2.5*TransientSoundVolume);
				}
				break;

		case 5:	CurrentBoxState.BoxHeight += BoxMoveRate * DT;
				if (CurrentBoxState.BoxHeight &gt;= 0.0)
				{
					CurrentBoxState.BoxHeight = 0.0;
					CurrentBoxState.Mode = 0;
				}
	}

	if (0 == CurrentBoxState.Mode)
		SetPhysics(PHYS_Karma); // we can resume normal driving now
	else
	    SetPhysics(PHYS_None); // temporary hack to &quot;park&quot; the vehicle

	disp.Z = CurrentBoxState.BoxHeight;
	SetBoneLocation('LiftForks', disp,1.0);
	SetBoneLocation('StorageBox', disp,1.0);
	SetBoneLocation('StorageBox_Door', disp,1.0);
	doorRot.Pitch = CurrentBoxState.DoorRotation;
	SetBoneRotation('StorageBox_Door', doorRot,0, 1.0);

}
&lt;/uscript&gt;
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KillerMessagePlus</title>
    <id>28631</id>
    <revision>
      <id>40487</id>
      <timestamp>2010-01-14T08:57:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Killing Floor</title>
    <id>1637</id>
    <revision>
      <id>4060</id>
      <timestamp>2007-12-25T11:24:25Z</timestamp>
      <contributor>
        <ip>81-234-147-33-o925.telia.com</ip>
      </contributor>
      <comment>it's a stub, but fkin let it be one, for now</comment>
      <text xml:space="preserve">'''Killing Floor is a Total Conversion''' of the [[Legacy:Unreal Tournament 2004|Unreal Tournament 2004]] game, first released in 2005 as a demo, and full version, later that year. The mod acquired popularity after appearing in several game magazines.

==Gametypes==

===Survival===

Killing Floor's Gameplay is a lot different than the ones of UT2004, closest to the [[Legacy:UT2004|Invasion]] gametype, but still far off. Designed around [[Legacy:Cooperative Gameplay|co-op]] (Cooperative) play, it puts people against an infected city of millions of people, primarily based in the [[Legacy:United Kingdom|United Kingdom]]. With weapons ranging from pistols to explosives, there are hundreds of strategies to come up with and use, all having their ups and downs. However, what is collectively for all strategies, is to try and cover as much of the map as possible, and to not get cornered.

The way the game works, enemies spawn in certain places of the map, and from there, they try to hunt you down. Once the action starts, it is important to arrange your group and not to just run around shooting. With Killing Floor's unique design, you can barricade yourself, mow the monsters down, or just sit back and snipe them out.

The objective is to survive as long as possible against continual &quot;waves&quot; of undead enemies. The number of enemies in a given wave is a calculation of various variables, and the number you must defeat before the round ends is displayed on the [[Legacy:HUD|HUD]]. Upon defeating the required number of foes, the wave will end, and shortly thereafter the next will begin, bringing more difficult foes.

In order to fight off these increasingly challenging enemies, you and your fire-team must accrue &quot;points&quot; by killing zombies. The number of points you gain per kill depends on the difficulty of the enemy.

Points accrued by players can then be spent at the Merchant's. There is at least one in each Survival map.

===Story===

Very little is known about this gametype so far, but in the 2.5 patch announcement on 9 Oct, 2007, its Author [[Legacy:Alex Quick|Alex Quick]] wrote:
: ''Yes, an entirely new gametype has been created. Ok , not *entirely* new. But it opens Killing Floor up abit for mappers. Essentially, it's a sandbox game-mode where there is no combat countdown, no spawning zombies, and where mappers can add objectives for players to follow. Also added are options for various gameplay controls like deciding whether players start with any equipment or not, and the scaling and removal of actors based on game difficulty. All of this is being engineered for online coop play.

''

==Weapons==

With a range of fifteen weapons, from the Dual 9mm to the Winchester, and with the balance put into the game, it covers the whole spectra of weak to simply incomparable. These weapons will be sure to pack a punch as well as keep you alive.

These are the '''9 mms''', '''Dual 9 mms''', '''Knife''', '''Lead Pipe''', '''Axe''', '''Shotgun''', '''Winchester''', '''Handcannon''', '''Hunting Shotgun''', '''Bullpup''', '''Crossbow''', '''L.A.W''', '''Flamethrower''' and the '''Frag Grenade'''.

==External Links==
*[http://www.killingfloor.freedomsnet.net Killing Floor official website]
*[http://www.killingfloor.freedomsnet.net/wiki/?page=Killing_Floor Killing Floor Wiki]
**[http://www.killingfloor.freedomsnet.net/wiki/?page=Killing_Floor KFWiki article on the subject]
*[http://mrkadish.proboards40.com/index.cgi Forums]
*[http://www.moddb.com/mods/3828/killing-floor Moddb profile]</text>
    </revision>
    <revision>
      <id>4061</id>
      <timestamp>2007-07-08T01:13:53Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Delete Me]]
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Killing Without Gibbing</title>
    <id>1610</id>
    <revision>
      <id>4000</id>
      <timestamp>2008-03-25T19:46:34Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0] [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.
* [[Legacy:Trigger Systems|Trigger Systems]] a complete overview of various trigger systems.

==Discussion==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

'''SabbathCat'''  Is there a way to adapt it so that if the instigator is falling, to tell if he/she was pushed? One advantage that falling volumes have over a trigger is that they will award a frag to the player who pushed another over the edge, and also broadcast a third kill message as opposed to the normal two suicide messages. 

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4001</id>
      <timestamp>2004-04-30T07:38:04Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0 [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.

==Comments==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4002</id>
      <timestamp>2005-03-24T22:37:02Z</timestamp>
      <contributor>
        <ip>Colc-cache-1.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0 [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.

==Comments==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

'''SabbathCat'''  Is there a way to adapt it so that if the instigator is falling, to tell if he/she was pushed? One advantage that falling volumes have over a trigger is that they will award a frag to the player who pushed another over the edge, and also broadcast a third kill message as opposed to the normal two suicide messages. 

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4003</id>
      <timestamp>2008-03-25T19:46:15Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0 [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.
* [[Legacy:Trigger Systems|Trigger Systems]] a complete overview of various trigger systems.

==Discussion==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

'''SabbathCat'''  Is there a way to adapt it so that if the instigator is falling, to tell if he/she was pushed? One advantage that falling volumes have over a trigger is that they will award a frag to the player who pushed another over the edge, and also broadcast a third kill message as opposed to the normal two suicide messages. 

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33780</id>
      <timestamp>2008-12-24T01:25:26Z</timestamp>
      <contributor>
        <username>Skary</username>
        <id>1685</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0] [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.
* [[Legacy:Trigger Systems|Trigger Systems]] a complete overview of various trigger systems.

==Discussion==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

'''SabbathCat'''  Is there a way to adapt it so that if the instigator is falling, to tell if he/she was pushed? One advantage that falling volumes have over a trigger is that they will award a frag to the player who pushed another over the edge, and also broadcast a third kill message as opposed to the normal two suicide messages. 

'''Skary=&lt;||&gt;=''' I am going to be using this to kill players when they fall into a tube and hit a spinning fan(adapted from the spinning door tutorial). But i started thinking about making some extravagant death traps. when a player steps on a square that i have placed on the floor and marked with a trigger, I would like a wall of spikes to come out of the wall, and push the player to the other side of the tube, and hit this scripted trigger where they will be crushed. and since the scripted trigger cannot activate itself, it can be placed anywhere without worry of being triggered without stepping on that square. That being said, how would i trigger the mover before the scripted trigger at the end of the tube?

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33788</id>
      <timestamp>2008-12-25T06:17:16Z</timestamp>
      <contributor>
        <username>Skary</username>
        <id>1685</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0] [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.
* [[Legacy:Trigger Systems|Trigger Systems]] a complete overview of various trigger systems.

==Discussion==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

'''SabbathCat'''  Is there a way to adapt it so that if the instigator is falling, to tell if he/she was pushed? One advantage that falling volumes have over a trigger is that they will award a frag to the player who pushed another over the edge, and also broadcast a third kill message as opposed to the normal two suicide messages. 

'''Skary=&lt;||&gt;=''' I am going to be using this to kill players when they fall into a tube and hit a spinning fan(adapted from the spinning door tutorial). But i started thinking about making some extravagant death traps. when a player steps on a square that i have placed on the floor and marked with a trigger, I would like a wall of spikes to come out of the wall, and push the player to the other side of the tube, and hit this scripted trigger where they will be crushed. and since the scripted trigger cannot activate itself, it can be placed anywhere without worry of being triggered without stepping on that square. That being said, how would i trigger the mover before the scripted trigger at the end of the tube?

***PROBLEM SOLVED***

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33789</id>
      <timestamp>2008-12-25T06:17:41Z</timestamp>
      <contributor>
        <username>Skary</username>
        <id>1685</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">&lt;b&gt;How to kill pawns without gibbing them, i.e. instead of using a physicsvolume.&lt;/b&gt;

----

First add a normal [[Legacy:Trigger|Trigger]] to your map. Set the Event -&gt; Event = &quot;KillMePlease&quot;.

Turn on radii view to see the trigger radius of the trigger. If you need to kill in a very wide radius (for instance when pawn fall to their doom), change the Collision -&gt; CollisionRadius. With radii view you can easely see how far it reaches. What's better when a really large aera has to be covered is putting in multiple triggers with a smaller radius.

We need a [[Legacy:ScriptedTrigger|ScriptedTrigger]] (Keypoint -&gt; AIScript -&gt; ScriptedSequence -&gt; ScriptedTrigger). 

We add three different actions in its properties under AIScript.

*[0] [[Legacy:ACTION_WaitForEvent|ACTION_WaitForEvent]] -&gt; &quot;KillMePlease&quot; (Same as the trigger's event)
*[1] [[Legacy:ACTION_KillInstigator|ACTION_KillInstigator]]. Set its [[Legacy:DamageType|DamageType]] too.
*[2] [[Legacy:ACTION_GotoAction|ACTION_GotoAction]] [0] (so it works more than once)

And that's all there is too it. Everytime someone activates the trigger it will kill the pawn that did it. Great for some nice ragdoll-falls-through-and-over-beams deads.

&lt;i&gt;Mr. SlackPants.&lt;/i&gt;

==Related Topics==
* [[Legacy:ScriptedAction|ScriptedAction]] has a full list of actions.
* [[Legacy:Trigger Systems|Trigger Systems]] a complete overview of various trigger systems.

==Discussion==

'''MythOpus:''' Should we combine this with scripted trigger or something about the scripted actions?

'''Tarquin:''' I'm actually pondering going the other way and moving Slick's tutorial out from the ScriptedSeq page into a page of its own. :D Let's see what other people think :) One thing I'm fairly sure of: we need to write an [[Legacy:Add An Action|Add an action]] basic procedure page. &lt;- [[:Category:Legacy To Do]]

'''Enos Shenk:''' I looked and looked on how to do this for a map and found it here. God bless the wiki.

'''SabbathCat'''  Is there a way to adapt it so that if the instigator is falling, to tell if he/she was pushed? One advantage that falling volumes have over a trigger is that they will award a frag to the player who pushed another over the edge, and also broadcast a third kill message as opposed to the normal two suicide messages. 

'''Skary=&lt;||&gt;=''' I am going to be using this to kill players when they fall into a tube and hit a spinning fan(adapted from the spinning door tutorial). But i started thinking about making some extravagant death traps. when a player steps on a square that i have placed on the floor and marked with a trigger, I would like a wall of spikes to come out of the wall, and push the player to the other side of the tube, and hit this scripted trigger where they will be crushed. and since the scripted trigger cannot activate itself, it can be placed anywhere without worry of being triggered without stepping on that square. That being said, how would i trigger the mover before the scripted trigger at the end of the tube?

***PROBLEM SOLVED

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KillingField</title>
    <id>1576</id>
    <revision>
      <id>3920</id>
      <timestamp>2003-05-23T19:16:21Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; KillingField (Package: Botpack)}}

This zone does nothing.  It is used by the following AI functions in the [[Legacy:Assault|Assault]] game type class to affect the behaviour of the bots.

For examples of it s use see AS-Mazon and AS-Overlord.

==Methods==
; bool FindSpecialAttractionFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : 
; bool NeverStakeOut ([[Legacy:Bot (UT)|Bot (UT)]] Other) : As far as I can tell from an exceptionally cursory examination of the function it ensures the bots don't stand around and admire the scenery.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3921</id>
      <timestamp>2002-04-10T20:19:50Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; KillingField}}

This zone does nothing.  It is used by the following AI functions in the [[Legacy:Assault|Assault]] game type class to affect the behaviour of the bots.
* function bool FindSpecialAttractionFor(Bot aBot)
* function bool NeverStakeOut(bot Other)

As far as I can tell from an exceptionally cursory examination of the function it ensures the bots don't stand around and admire the scenery.

For examples of it's use see [[Legacy:AS-Mazon|AS-Mazon]] and [[Legacy:AS-Overlord|AS-Overlord]].</text>
    </revision>
    <revision>
      <id>3922</id>
      <timestamp>2003-05-23T17:01:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; KillingField (Package: Botpack)}}

This zone does nothing.  It is used by the following AI functions in the [[Legacy:Assault|Assault]] game type class to affect the behaviour of the bots.

For examples of it's use see AS-Mazon and AS-Overlord.

==Methods==
; bool FindSpecialAttractionFor ([[Legacy:Bot (UT)|Bot (UT)]] aBot) : 
; bool NeverStakeOut ([[Legacy:Bot (UT)|Bot (UT)]] Other) : As far as I can tell from an exceptionally cursory examination of the function it ensures the bots don't stand around and admire the scenery.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KillingSpreeMessage</title>
    <id>28643</id>
    <revision>
      <id>40499</id>
      <timestamp>2010-01-14T08:59:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Killmaster</title>
    <id>1580</id>
    <revision>
      <id>3930</id>
      <timestamp>2002-09-12T19:11:01Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''EntropicLqd:'''  Welcome to the Wiki Killmaster.  Feel free to add yourself to the list of [[Legacy:Project_Contributors|Project_Contributors]].

'''Tarquin:''' Hello &amp; welcome. :D

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:</text>
    </revision>
    <revision>
      <id>3931</id>
      <timestamp>2002-09-12T12:23:35Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''EntropicLqd:'''  Welcome to the Wiki Killmaster.  Feel free to add yourself to the list of [[Legacy:Project_Contributors|Project_Contributors]].

'''Tarquin:''' Hello &amp; welcome. :D</text>
    </revision>
  </page>
  <page>
    <title>Legacy:King Mango</title>
    <id>1608</id>
    <revision>
      <id>3994</id>
      <timestamp>2005-12-15T01:58:10Z</timestamp>
      <contributor>
        <ip>King Mango</ip>
      </contributor>
      <minor/>
      <comment>page comment</comment>
      <text xml:space="preserve">Hi!

==Discussion==

'''SabbathCat:''' Yo Mango, you got a home at last. Good to see ya. Looking forward to more AS ramblings soon. :)

'''SuperApe:''' /waves hello.

'''King Mango''' hi!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3995</id>
      <timestamp>2003-12-04T10:03:53Z</timestamp>
      <contributor>
        <ip>C-67-164-229-39.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I always wanted to have some place to put up stuff for UT, so in the near future expect to find more.

[[Legacy:AssaultInfo|AssaultInfo]]</text>
    </revision>
    <revision>
      <id>3996</id>
      <timestamp>2005-11-18T20:27:23Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">I always wanted to have some place to put up stuff for UT, so in the near future expect to find more.

I have written a bit on this page,[[Legacy:FortStandard|FortStandard]] and some of it should be organized or moved.

==Discussion==

'''SabbathCat:''' Yo Mango, you got a home at last. Good to see ya. Looking forward to more AS ramblings soon. :)

'''SuperApe:''' /waves hello.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kirin</title>
    <id>1584</id>
    <revision>
      <id>3939</id>
      <timestamp>2003-05-01T04:51:23Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <comment>Restore</comment>
      <text xml:space="preserve">Hi. I'm Kirin. I make skins for games and enjoy doing so. I also do some modelling and learning some UC by looking at code.

&lt;uscript&gt;class adobePhotoshop extends myEgo&lt;/uscript&gt;

See ... you can tell I forgot to take my pills when I was typing this. Anyway, I was referred by [[Legacy:DJPaul|DJPaul]] in an IRC session and that's how I ended up here. :)

I'm a junky in photoshop, and I write stuff as well, usually poetry and misc. notes. Sometimes, I'll use some compiling scripts (because I'm too lazy to open the [[Legacy:UnrealEd|UnrealEd]] texture browser for texture compiling). Please be aware that I can be rather psychotic and unusual depending the time of day and what I'm listening to. Generally, if I'm listening to [http://www.enyamusic.com Enya], you can gaurantee that I'm in a good and stable mood today. I also have an unusual passion for ninjas. One reason being is that they are cool and when I mean by cool I mean totally sweet.

I manage a website with some artwork and stuff that is done by my friend and I: http://www.saphiria.net

Along with managing a website, I also write skin reviews for polycount: http://www.polycount.com

Currently, I'm working with the [http://www.planetunreal.com/chaotic ChaoticDreams] team on their next upcoming installment to ChaosUT ... ChaosUT2: Evolution. I make misc. objects and stuff for them. 

I guess I should put more stuff about myself here... but for now ... here's something I'm working on:

&lt;center&gt;&lt;img src=&quot;http://www.planetquake.com/polycount/cottages/saphiria/i/wild-child/avril-face6.jpg&quot;&gt;&lt;/center&gt;

She is that evil skater girl person on MTV. She drives me batty sometimes. I guess why she's anything but ordinary. :/

'''DJPaul:''' Yeah, truely puntastic: i'm Losing my Grip and am nearly going to kill you.  I'd ask someone to hold me back, but that's a little Too Much To Ask, no? ;)

Here is my work station:

&lt;center&gt;&lt;img src=&quot;http://www.planetquake.com/polycount/cottages/saphiria/i/desktop/w3rk-station1.jpg&quot;&gt;&lt;/center&gt;

It's a bit cramped but I can manage. As long I have a set of Enya's music, my sanity can be set strait and [http://www.avril-lavigne.com evil-skater-girl-person-with-black-noose] on the right of my monitor will not do psychological harm to my work environment. On a side note, I really love Enya's music. It's very relaxing and calms my mind. Some tracks are even uplifting like &quot;Only If&quot; and &quot;Anywhere Is&quot; while others are haunting like &quot;Tempus Vernum&quot; and &quot;Pax Deorum&quot;.

Other things that I also enjoy doing is riding my bike in the rain (I feel more refreshed than riding in dry land) and painting. I like splatting acrylics on objects and doing weird stuff to it. Notice on my previous image that there's a painting on the side of my case. I did that, but I'm not done with it. I'm actually thinking of getting a bucket of turpentine and starting over on it with something different.

Anyway ... I think that's it about me. I'll add more when I'm bored.

Feel free to contact me:

email: kirin at polycount dot com &lt;br /&gt;ICQ: 8104583 &lt;br /&gt;AIM: KirinRiotCrash &lt;br /&gt;MSN: kirinsensei@hotmail.com &lt;br /&gt;Y!M: kirinsensei

----

'''Wormbo:''' Welcome to the Wiki, Kirin. :)

'''EntropicLqd:''' Welcome to the Wiki.  Enjoy your stay :)

'''DJPaul:''' Avril Lavigne, gimp; my second favourite artist next to Kid Rock.  I am trying to get to the 27/03/03 tour (see http://www.wayahead.com/sjmmaj/event.asp?artist=avril+lavigne&amp;e|promoter=372&amp;filler1=gigsandtours) - anyone interested in accompyaning me?

'''Eldhrin:''' Enya == wonderful

'''Kirin:''' I'd love to go, but that's in London Ontario Canada ... I can't make that. :( ... I'll have to wait until she's a bit closer in the NC area while she tours. Right now, I just started rigging Avril. I'm going to start animating her tomorrow. Can't wait to see what I can come up with in Character Studio. :D Eldhrin, I have just about all of Enya's albums. All I'm missing are some B-Sides and Singles.

'''Ike Bart:''' Did I mention that Avril Lavigne is one of my current favorite artists?  I'm so glad that she's doing well with her current video on [http://www.mtv.com/trl TRL]. ;-)

'''DJPaul:''' No, monkey; that's London, England.  The '''original''' London.  Guess that's even further though, heh.

'''Kirin:''' Oh bugger! That's WAY too far! I thought you meant Canada since Avril is Canadian. Personally, I think Avril would live up to her punk image if she was a little bit like the new Sum 41 with a harder note and an optional parental advisor sticker attached to it. (or maybe a little bit of the old Sum 41 ... who knows) Her latest single though ... reminds me of travelling with strangers. The lyrics anyways. :o

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kirk</title>
    <id>1575</id>
    <revision>
      <id>3917</id>
      <timestamp>2007-12-16T10:20:21Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Story===

Hello... My name is Kirk.

Unreal and its many mods are still my deathmatch style games of choice. I started to fork around in the innards of Unreal ages ago, because modding is fun (been modding Total Annihilation, Uru, Supreme Commander... even Quake in a dark grey past XD). My track record of mods isn't really impressive, it basically amounts to some random mapstuff and mutators, and a server actor hack for U2XMP. I do have years of Java experience, general programming experience and more uninteresting stuff like that.

So, uh, hi :)

This wiki is awesome.

===Projects===
* XMPLiveBot/XMPLoveBot
** Hack of XMPReporter that allowed people in IRC to talk back into the game.
* Fruitcake
** Never got anywhere. The idea was funny but I'm not a fully equipped modeler. Specifically, UV unwrapping and texture painting. Meh :P
* Random Assault Racing map :P

===Contact Information===

'''Email:''' kirk@kirkwarez.com

'''Site:''' http://www.kirkwarez.com (not a warez site...)

'''MSN:''' bjwouda@hotmail.com

'''ICQ:''' 71235033

'''AIM:''' YunaRaider

===Comments===

'''MythOpus:''' Welcome to The Wiki :D

'''Kirk:''' Thanks :D

'''Tarquin:''' Hi. What's the screenshot of the apple model for?

'''Kirk:''' It's a little project I'm working on. Mostly it's learning to mod.</text>
    </revision>
    <revision>
      <id>3918</id>
      <timestamp>2005-03-31T08:29:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Story===

Hello... My name is Kirk.

I love to play Unreal, and its many mods. I started to fork around in the innards of Unreal after a while, because modding is fun (been modding Total Annihilation for quite a while now, and Uru now too). I've only really made the most basic of mutators, the famous Vampire for example, and a server actor hack for U2XMP. I have not much experience with UT2004 yet, but the Wiki is proving to be an enormous help. With it I'm making a little mod dealing with quite a few things, to see how things go.

I do have a few years of Java experience, general programming experience and more uninteresting stuff like that.

So, uh, hi :)

===Projects===

[http://games.kirkwarez.com/kirkwarez/fruitcake/betterapple.jpg?grah Fruitcake]

===Contact Information===

'''Email:''' kirk@kirkwarez.com

'''Site:''' http://www.kirkwarez.com (not a warez site, don't worry :P)

'''MSN:''' bjwouda@hotmail.com

'''ICQ:''' 71235033

'''AIM:''' YunaRaider

===Comments===

'''MythOpus:''' Welcome to The Wiki :D

'''Kirk:''' Thanks :D

'''Tarquin:''' Hi. What's the screenshot of the apple model for?</text>
    </revision>
    <revision>
      <id>3919</id>
      <timestamp>2007-12-14T09:54:39Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>Update, cause it was aaa-old</comment>
      <text xml:space="preserve">===Story===

Hello... My name is Kirk.

Unreal and its many mods are still my deathmatch style games of choice. I started to fork around in the innards of Unreal ages ago, because modding is fun (been modding Total Annihilation, Uru, Supreme Commander... even Quake in a dark grey past XD). My track record of mods isn't really impressive, it basically amounts to some random mapstuff and mutators, and a server actor hack for U2XMP. I do have years of Java experience, general programming experience and more uninteresting stuff like that.

So, uh, hi :)

This wiki is awesome.

===Projects===
* Fruitcake
** Never got anywhere. The idea was funny but I'm not a fully equipped modeler. Specifically, UV unwrapping and texture painting. Meh :P
* Random Assault Racing map :P

===Contact Information===

'''Email:''' kirk@kirkwarez.com

'''Site:''' http://www.kirkwarez.com (not a warez site...)

'''MSN:''' bjwouda@hotmail.com

'''ICQ:''' 71235033

'''AIM:''' YunaRaider

===Comments===

'''MythOpus:''' Welcome to The Wiki :D

'''Kirk:''' Thanks :D

'''Tarquin:''' Hi. What's the screenshot of the apple model for?

'''Kirk:''' It's a little project I'm working on. Mostly it's learning to mod.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kismet</title>
    <id>1639</id>
    <revision>
      <id>4064</id>
      <timestamp>2007-03-25T11:15:40Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Kismet is the Visual Coding Software included in Unreal Editor 4. It greatly enchances in-editor coding that was available in previous Unreal Editors.

==Basic Concept==

The basic concept is similar to previous UEd's Scripted Triggers but hugely more complicated and you dont need huge numbers of actors to follow multiple sequences of code!

The visual aspect has a flowchart style where individual components can be linked together in various ways.

==Componenets==

===Main Components and Types===

===Colour Coding===

==Features==

===Advantages===

===Disadvantages===</text>
    </revision>
    <revision>
      <id>4065</id>
      <timestamp>2007-02-28T13:56:28Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Kismet is the Visual Coding Software included in Unreal Editor 4. It greatly enchances in-editor coding that was available in previous Unreal Editors.

==Basic Concept==

The basic concept is similar to previous UEd's Scripted Triggers but hugely more complicated and you dont need huge numbers of actors to follow multiple sequences of code!

The visual aspect has a flowchart style where individual components can be linked together in various ways.

==Componenets==

===Main Components and Types===

===Colour Coding===

==Features==

===Advantages===

===Disadvantages===

'''Blip2:''' I'll add content for this tonight, just getting the initial layout - this browser sucks :/ text is off the page.</text>
    </revision>
    <revision>
      <id>40366</id>
      <timestamp>2010-01-02T05:08:08Z</timestamp>
      <contributor>
        <username>Unrealomega</username>
        <id>2074</id>
      </contributor>
      <text xml:space="preserve">{{expand}}

Kismet is the Visual Coding Software included in Unreal Editor 4. It greatly enhances in-editor coding that was available in previous Unreal Editors.

==Basic Concept==

The basic concept is similar to previous UEd's Scripted Triggers but hugely more complicated and you do not need huge numbers of actors to follow multiple sequences of code!

The visual aspect has a flowchart style where individual components can be linked together in various ways.

==Components==

===Main Components and Types===

===Color Coding===

==Features==

===Advantages===

===Disadvantages===</text>
    </revision>
    <revision>
      <id>40368</id>
      <timestamp>2010-01-02T11:34:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added legacy page info box</comment>
      <text xml:space="preserve">{{legacy page|new=[[Kismet]]}}

Kismet is the Visual Coding Software included in Unreal Editor 4. It greatly enhances in-editor coding that was available in previous Unreal Editors.

==Basic Concept==

The basic concept is similar to previous UEd's Scripted Triggers but hugely more complicated and you do not need huge numbers of actors to follow multiple sequences of code!

The visual aspect has a flowchart style where individual components can be linked together in various ways.

==Components==

===Main Components and Types===

===Color Coding===

==Features==

===Advantages===

===Disadvantages===</text>
    </revision>
    <revision>
      <id>42883</id>
      <timestamp>2010-04-11T06:48:15Z</timestamp>
      <contributor>
        <username>Creativecoding</username>
        <id>2122</id>
      </contributor>
      <comment>/* Disadvantages */</comment>
      <text xml:space="preserve">{{legacy page|new=[[Kismet]]}}

Kismet is the Visual Coding Software included in Unreal Editor 4. It greatly enhances in-editor coding that was available in previous Unreal Editors.

==Basic Concept==

The basic concept is similar to previous UEd's Scripted Triggers but hugely more complicated and you do not need huge numbers of actors to follow multiple sequences of code!

The visual aspect has a flowchart style where individual components can be linked together in various ways.

==Components==

===Main Components and Types===

===Color Coding===

==Features==

===Advantages===

===Disadvantages===

When using the Kismet, you are unable to actually edit the code. You would have to save your work and then edit your code later in a text-based editor such as notepad.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KittenJuicer</title>
    <id>1633</id>
    <revision>
      <id>4051</id>
      <timestamp>2006-01-01T09:22:53Z</timestamp>
      <contributor>
        <ip>KittenJuicer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Ooh KittenJuicer's personal page

===Interesting things===

Well, being relatively new to the wiki, here's some wiki information about wikiness.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4052</id>
      <timestamp>2006-01-01T09:21:41Z</timestamp>
      <contributor>
        <ip>KittenJuicer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">

Ooh KittenJuicer's personal page

Interesting things:
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kohan</title>
    <id>1636</id>
    <revision>
      <id>4058</id>
      <timestamp>2006-06-02T04:12:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>hi :-)</comment>
      <text xml:space="preserve">It's just me.  In fact, I want others to add to this page to define me, as one's self-vision can be very different than the vision of those around them.

Oh, and I like UnrealScripting :D.

==Comments==

'''Wormbo:''' Hi, welcome to the Wiki! :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4059</id>
      <timestamp>2006-06-01T23:17:34Z</timestamp>
      <contributor>
        <ip>Kohan</ip>
      </contributor>
      <comment>It's me.</comment>
      <text xml:space="preserve">It's just me.  In fact, I want others to add to this page to define me, as one's self-vision can be very different than the vision of those around them.

Oh, and I like UnrealScripting :D.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Konma</title>
    <id>1588</id>
    <revision>
      <id>3947</id>
      <timestamp>2003-05-13T14:44:38Z</timestamp>
      <contributor>
        <ip>Konma</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">===About me ===

U want to know something about me? Ok, i am just coding a little bit.

I starded with Unreal Tournement, but i have not done any great usefull things. All my work of that time is lost :(

but as soon as ut2003 was released i began to work on a mod. A big project, but uptill now i could solve almost every problem alone, or with a little bit help by wiki or the beyondunreal coding forum. So special thanks to all who helped me.

===Projects ===

At the moment i am only working at one Project: Global Warzone.

Check the [http://www.globalwarzone.net GWZ-Site] for further information.

===Everything else ===

Any questions? Konma@gmx.de

----

As soon i will find some time i will write something more interesting here. I know, reading this is wasted time ;)

----

'''EntropcLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3948</id>
      <timestamp>2003-01-13T11:04:21Z</timestamp>
      <contributor>
        <ip>Konma</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About me ===

U want to know something about me? Ok, i am just coding a little bit.

I starded with Unreal Tournement, but i have not done any great usefull things. All my work of this time is lost :(

but as soon as ut2003 was released i began to work on a mod. A big project, but uptill now i could solve almost every problem alone, or with a little bit help by wiki or the beyondunreal coding forum. So special thanks to all who helped me.

===Projects ===

At the moment i am only working at one Project: Global Warzone.

Check the [http://www.globalwarzone.net GWZ-Site] for further informations.

===Everything else ===

Any questions? Konma@gmx.de

----

As soon i will find some time i will write something more interesting here. I know, reading this is wasted time ;)</text>
    </revision>
    <revision>
      <id>3949</id>
      <timestamp>2003-01-13T11:32:56Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>hi</comment>
      <text xml:space="preserve">===About me ===

U want to know something about me? Ok, i am just coding a little bit.

I starded with Unreal Tournement, but i have not done any great usefull things. All my work of this time is lost :(

but as soon as ut2003 was released i began to work on a mod. A big project, but uptill now i could solve almost every problem alone, or with a little bit help by wiki or the beyondunreal coding forum. So special thanks to all who helped me.

===Projects ===

At the moment i am only working at one Project: Global Warzone.

Check the [http://www.globalwarzone.net GWZ-Site] for further informations.

===Everything else ===

Any questions? Konma@gmx.de

----

As soon i will find some time i will write something more interesting here. I know, reading this is wasted time ;)

----

'''EntropcLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KouIzanagi</title>
    <id>1625</id>
    <revision>
      <id>4035</id>
      <timestamp>2005-02-03T20:22:17Z</timestamp>
      <contributor>
        <ip>KouIzanagi</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Who is Kou Izanagi?===

It's not like it really matters, but the name Kou Izanagi (Kou for short) is really just a bunch of random stuff I just threw together when I was trying to come up with a creative name for Deus Ex.  Gradually, the name has become a symbol for me for some reason.  I've been working with Unreal Script (mainly Deus Ex's variant) for about a year, but I hadn't been serious with it until around three months ago.  I am currently working on a modification right now, but I don't really have much to go on, so that's why I am here at UnrealWiki.  I'm hoping that the more seasoned scripters could lend me a hand with the bugs, problems, and the replication.  Also, art tends to be a strong suit of mine, but I cannot model a organic being for anything, so I am going to need to contact someone to do several of the things in the mod.  Hmm... maybe I should point out that I'm an undisciplined mapper who's afraid of public opinion?  Nahhhh....

==='''''Why should I care?'''''===

I don't know.  Why are you reading this?  If you don't have a reason, you must be bored, so there is no reason for you to care.

----

'''Tarquin:''' Hi there! You'll find a lot of other wiki users will read your profile, we like to find out about who has set up a user page &amp; welcome them to the community :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

----

[[Legacy:KouIzanagi/Mod Journal|KouIzanagi/Mod Journal]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4036</id>
      <timestamp>2005-02-02T09:30:12Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">===Who is Kou Izanagi?===

It's not like it really matters, but the name Kou Izanagi (Kou for short) is really just a bunch of random stuff I just threw together when I was trying to come up with a creative name for Deus Ex.  Gradually, the name has become a symbol for me for some reason.  I've been working with Unreal Script (mainly Deus Ex's variant) for about a year, but I hadn't been serious with it until around three months ago.  I am currently working on a modification right now, but I don't really have much to go on, so that's why I am here at UnrealWiki.  I'm hoping that the more seasoned scripters could lend me a hand with the bugs, problems, and the replication.  Also, art tends to be a strong suit of mine, but I cannot model a organic being for anything, so I am going to need to contact someone to do several of the things in the mod.  Hmm... maybe I should point out that I'm an undisciplined mapper who's afraid of public opinion?  Nahhhh....

==='''''Why should I care?'''''===

I don't know.  Why are you reading this?  If you don't have a reason, you must be bored, so there is no reason for you to care.

----

'''Tarquin:''' Hi there! You'll find a lot of other wiki users will read your profile, we like to find out about who has set up a user page &amp; welcome them to the community :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)</text>
    </revision>
    <revision>
      <id>4037</id>
      <timestamp>2005-02-03T18:42:27Z</timestamp>
      <contributor>
        <ip>KouIzanagi</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Who is Kou Izanagi?===

It's not like it really matters, but the name Kou Izanagi (Kou for short) is really just a bunch of random stuff I just threw together when I was trying to come up with a creative name for Deus Ex.  Gradually, the name has become a symbol for me for some reason.  I've been working with Unreal Script (mainly Deus Ex's variant) for about a year, but I hadn't been serious with it until around three months ago.  I am currently working on a modification right now, but I don't really have much to go on, so that's why I am here at UnrealWiki.  I'm hoping that the more seasoned scripters could lend me a hand with the bugs, problems, and the replication.  Also, art tends to be a strong suit of mine, but I cannot model a organic being for anything, so I am going to need to contact someone to do several of the things in the mod.  Hmm... maybe I should point out that I'm an undisciplined mapper who's afraid of public opinion?  Nahhhh....

==='''''Why should I care?'''''===

I don't know.  Why are you reading this?  If you don't have a reason, you must be bored, so there is no reason for you to care.

----

'''Tarquin:''' Hi there! You'll find a lot of other wiki users will read your profile, we like to find out about who has set up a user page &amp; welcome them to the community :)

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here :)

----

[[Legacy:Mod Journal|Mod Journal]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:KouIzanagi/Mod Journal</title>
    <id>1626</id>
    <revision>
      <id>4038</id>
      <timestamp>2005-02-03T19:36:52Z</timestamp>
      <contributor>
        <ip>KouIzanagi</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=The Life of a Self-Taught Scripter=

==About Me==

===How I Got Here===

====The Very Beginning====

Before I start writing about my Modification, I'd like to begin with a paragraph or two about me and how I taught myself UnrealScript.

It began when a friend of mine brought over a new game that he found.  Its name was &quot;Deus Ex.&quot;  At first, we were more interested in playing some sort of game that wasn't as interesting in retrospect.  Later on, we started playing it and we easily became addicted.  I worked up the money to buy the game and then began playing on my own.  I was amazed&amp;ndash;it even came with its own Editor!  I had never seen anything like it, so I immediately freaked out and closed the program for a week due to frustration.  Fortunately, I went back to the editor and learned a lot of neat things.  I was addicted.  Over the course of about three months, I had developed ten or so beta maps, one of them which became a DXMP hit later on.  

====How I Began Scripting ====

That wasn't enough for me... There was only so much one could do with what came with the game.  I needed to make some stuff on my own.  I began playing around with the scripts and properties in the editor (eventually finding out how much of a pain it was to lose a 300-line class when the editor crashed).  By another four months, I was able to completely modify every single editable class with no problems.  I created over fifteen modifications for Deus Ex, but only released two of them.

====Where Did UT2004 Come From?====

Yet again, I needed more.  There was a game coming out fairly soon called &quot;Unreal Tournament 2003.&quot;  I heard that the previews looked good for it, so of course I wanted it.  However, I did some more research and found out that its predecessor, Unreal Tournament, was based on the '''same''' engine as Deus Ex!  I was very enthusiastic, so I went out and I bought the original.  I learned that there was a good deal of difference between the editor and how the classes and script were laid out.  I learned it nonetheless.

Christmas came... I got Unreal Tournament 2003!  However, there was a problem, as our graphics card could not handle it.  I was utterly disappointed.  In about eight months after Christmas, we got a new computer that could actually run it (Kinda sad since we were able to buy anything up to $50,000 and not need to worry about finances at that time).  I was ecstatic and I installed it right away.  The game looked so great; I had never seen a ragdoll death before then, so I kept jumping into the pit at DM-Gael.  I was once again confronted with a problem:  The Editor was so messed up compared to the other versions of it.  Everything was littered with obfuscation.

The next milestone is on the month of February 2004.  Unreal Tournament 2004 was released.  I rushed out and bought it the first day it was out, and I think I got the first copy.  After playing through the game and all of the new maps, I was convinced that I needed to get used to this new editor.  So, I moved on and learned it.

Now, it's February 2005.  It's been a long journey for me, and now it's time to get working on my first mod for UT2k4.

==About the Mod==

===What is the Mod about?===

Well, my friends and I have always been fans of Final Fantasy.  I've always wanted to bring in some of the aspects of Final Fantasy into Unreal Tournament 2004, but until now, I haven't had the ability to do so.  So you can basically say that the mod is based on several characteristics of Unreal Tournament 2004 and a lot of aspects from Final Fantasy.  I'm planning to bring in things like the job system, magic system, item system, and level-building.  So far, I have made a lot of progress.  We'll see if I can get this accomplished.

===The Features===

The RPG UT2004 Modification is a very ambitious one, especially for a new mod-maker.  However, with maybe some help from the veteran scripters and several model-designers, I can complete the mod without being scarred for life.
* Job System with nine original Jobs and an unlockable Job that requires getting over 25,000 XP in a single game
* Magic System with several different varieties of magic
* Customization System which allows a selection of a Job, an Element, and et cetera
* Item System that allows players to run around and collect weaponry and other items

===What I Have Accomplished===

So far, I have been able to successfully add the ability of a character to become knocked out when their HP hits zero.  I have also successfully created several of the magic effects for the White Magic.  Here's an example of a Magic Spell.

[[Image:Legacy_SWPShotWiki.jpeg|center|Shockwave Pulsar]]

===Why I Need Help===

Okay, this is where I ask people to chip in a little bit.  This is not a personal mod for me, I just want to see it happen.  To do that, I need to head the project and get it started.  All I want you talented people out there to do is any of the following:
* Help create models for summons and items
* Help design magic spell effects using Emitters/xEmitters
* Assist with the other little things

I hope that's not asking too much, but I can't design models for the life of me and I'm having difficulty juggling school, this Mod, and the Indianapolis Side By Side Orchestra.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Krall</title>
    <id>1577</id>
    <revision>
      <id>3923</id>
      <timestamp>2006-02-11T17:27:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Krall}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; [[Legacy:Monster|Monster]] &gt;&gt; Krall (Package: SkaarjPack)}}

[[Image:Legacy_scriptedpawn.krall.jpeg|center|''A standard Krall on the left, and a Krall Elite on the right.  When standing in place, a Krall appears almost as tall as a Skaarj Warrior.  However, a Krall seems noticably shorter when walking or running.'']]

The Krall are a slave race of the Skaarj, and have been integrated into their society as a lower class of soldier.  Though a Krall will always follow the orders of a Skaarj, they have their own ways of rebelling, such as by sleeping or playing dice when they are supposed to be on duty.

All Krall come armed with a staff weapon with three vertical blades on one end.  The weapon is long enough to be considered a staff, but top-heavy enough to act as a mace when necessary.  This weapon is also capable of launching energy bolts from the bladed end, so it will also server as a ranged weapon.  In general, most Krall are slow but agile.  This is predominantly due to their frail legs, which can be lost in battle quite easily.

Krall Elite are high-ranking Krall that can be identified by their white skin and blue accents.  They are more agile and demonstrate a much greater skill in battle.  They also carry a staff weapon that shoots faster and more powerful energy bolts.

[http://www.planetunreal.com/teamvortex/help/data/docs/krall.html Alternative (ONP) story]

==Properties==
; StrikeDamage, PoundDamage, ThrowDamage : These variables determine the amount of damage that the Krall's melee attacks do.  StrikeDamage refers to when the Krall does a horizontal swat with the bladed end of its staff.  PoundDamage refers to when the Krall does a vertical hammering motion with the staff in both hands.  ThrowDamage refers to when the Krall picks its target up with the blades of its staff and throws it backward.  (ThrowDamage only applies if bSpearToss is True.)
; bSpearToss : This determines if the Krall is capable of throwing a target in melee range with its staff.  If applicable, damage from the throw is determined by the ThrowDamage variable.
; bDicePlayer : This variable can be used to make a Krall play dice with other Krall in its team.  Obviously, a group of Krall in the middle of a dice game will be very distracted, and they are unlikely to even notice an approaching player.  To make use of this feature, have all Krall in the team arranged in a circle, and set this variable to True for each one of them.  Make sure that one of the team is identified as the Team Leader, so that he will produce a pair of dice for the team to play with.
; bSleeping : This variable can be used to make a Krall be asleep when a player encounters it.  Obviously, a sleeping Krall will be very unalert, and may not even wake up when a player approaches.  To make use of this feature, set this variable to True in the Krall's properties, and the Krall will go to sleep.  Then the AnimSequence variable in the Krall's Display properties can be set to Sleep1, Sleep2, or Sleep3, to make the Krall sleep in a predefined bodily position. 
; MinDuckTime : This variable determines at least how long a Krall will stay behind cover when it ducks to avoid getting hit by incoming projectiles.

==Known Subclasses==
 Krall
   +- EliteKrall
   +- LesserKrall (UT only)

==Related Topics==
* [[Legacy:Monster Support|Monster Support]]
* [[Legacy:Invasion|Invasion]] (UT2004 gametype)

==Discussion==

'''UsAaR33''': Are you sure that sleep2 and sleep3 can be used with standard krall? Reading the code, I see that bsleeping causes sleep1 to animate...

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3924</id>
      <timestamp>2004-05-20T01:21:37Z</timestamp>
      <contributor>
        <ip>64-216-188-176.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Category Class (UT)&quot; reference</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Krall&lt;br /&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Krall &gt;&gt; KrallElite}}

&lt;br&gt;

[[Image:Legacy_scriptedpawn.krall.jpeg|center|&lt;i&gt;A standard Krall on the left, and a Krall Elite on the right.  When standing in place, a Krall appears almost as tall as a Skaarj Warrior.  However, a Krall seems noticably shorter when walking or running.&lt;/i&gt;]]

&lt;br&gt;

The Krall are a slave race of the Skaarj, and have been integrated into their society as a lower class of soldier.  Though a Krall will always follow the orders of a Skaarj, they have their own ways of rebelling, such as by sleeping or playing dice when they are supposed to be on duty.

&lt;br&gt;

All Krall come armed with a staff weapon with three vertical blades on one end.  The weapon is long enough to be considered a staff, but top-heavy enough to act as a mace when necessary.  This weapon is also capable of launching energy bolts from the bladed end, so it will also server as a ranged weapon.  In general, most Krall are slow but agile.  This is predominantly due to their frail legs, which can be lost in battle quite easily.

&lt;br&gt;

Krall Elite are high-ranking Krall that can be identified by their white skin and blue accents.  They are more agile and demonstrate a much greater skill in battle.  They also carry a staff weapon that shoots faster and more powerful energy bolts.

[http://www.planetunreal.com/teamvortex/help/data/docs/krall.html Alternative (ONP) story]

===Properties ===

For mappers, Krall have many new variables to work with.  Aside from their editable sounds, Krall are capable of being scripted in many ways.

; StrikeDamage, PoundDamage, ThrowDamage : These variables determine the amount of damage that the Krall's melee attacks do.  StrikeDamage refers to when the Krall does a horizontal swat with the bladed end of its staff.  PoundDamage refers to when the Krall does a vertical hammering motion with the staff in both hands.  ThrowDamage refers to when the Krall picks its target up with the blades of its staff and throws it backward.  (ThrowDamage only applies if bSpearToss is True.)
; bSpearToss : This determines if the Krall is capable of throwing a target in melee range with its staff.  If applicable, damage from the throw is determined by the ThrowDamage variable.
; bDicePlayer : This variable can be used to make a Krall play dice with other Krall in its team.  Obviously, a group of Krall in the middle of a dice game will be very distracted, and they are unlikely to even notice an approaching player.  To make use of this feature, have all Krall in the team arranged in a circle, and set this variable to True for each one of them.  Make sure that one of the team is identified as the Team Leader, so that he will produce a pair of dice for the team to play with.
; bSleeping : This variable can be used to make a Krall be asleep when a player encounters it.  Obviously, a sleeping Krall will be very unalert, and may not even wake up when a player approaches.  To make use of this feature, set this variable to True in the Krall's properties, and the Krall will go to sleep.  Then the AnimSequence variable in the Krall's Display properties can be set to Sleep1, Sleep2, or Sleep3, to make the Krall sleep in a predefined bodily position. 
; MinDuckTime : This variable determines at least how long a Krall will stay behind cover when it ducks to avoid getting hit by incoming projectiles.

----

'''UsAaR33''': Are you sure that sleep2 and sleep3 can be used with standard krall? Reading the code, I see that bsleeping causes sleep1 to animate...

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Krash</title>
    <id>1579</id>
    <revision>
      <id>3928</id>
      <timestamp>2003-03-03T13:22:35Z</timestamp>
      <contributor>
        <ip>Piglet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Info==

I'm a coder for [http://www.infiltrationcommand.com/ USkaarj].

My ICQ# is 159925813

==Discussion==

Hi everyone :D

[[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; Welcome to the Wiki. :)

'''Tarquin:'''  Hi &amp; welcome aboard.

'''ZxAnPhOrIaN:'''  Hey!

'''Dante:''' Yo Krash !

'''Mosquito:'''Hello!

'''Piglet:'''At the risk of cliche, Hi!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3929</id>
      <timestamp>2003-03-02T06:48:51Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Info==

I'm a coder for [http://www.infiltrationcommand.com/ USkaarj].

My ICQ# is 159925813

==Discussion==

Hi everyone :D

[[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; Welcome to the Wiki. :)

'''Tarquin:'''  Hi &amp; welcome aboard.

'''ZxAnPhOrIaN:'''  Hey!

'''Dante:''' Yo Krash !

'''Mosquito:'''Hello!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kuhal</title>
    <id>1573</id>
    <revision>
      <id>3911</id>
      <timestamp>2003-09-10T21:23:29Z</timestamp>
      <contributor>
        <ip>Kuhal</ip>
      </contributor>
      <minor/>
      <comment>Updates for me</comment>
      <text xml:space="preserve">==A bit about me... ==

My nick is borrowed from the much loved and highly absorbing works of fiction written by '''Julian May'''.  

If you like Fantasy and love Science Fiction and want a perfect example of the merging of these genres into a cohesive and transfixing series, read these books!
* ''The Many Coloured Land''
* ''The Golden Torc''
* ''The Non-Born King''
* ''The Adversary''

I identify with '''''Kuhal Earthshaker''''' because he was always second best in what he did (ugh like me).  

He lost a loved one and overcame terrible hardship to survive a very difficult time in his world.  

However throughout all of the disasters and hardship, Kuhal remained true to his ideals and was always honourable and noble.  

This is an ideal I aspire to hence my adoption of the name Kuhal :)  

If you read the books, this &quot;spoiler&quot; won't matter at all as he is not the focal character at all...

==Kuhal on Family ==

My family is my most important achievement and my most important duty/love/activity.  

I have two children; my son born in January 2000 and my daughter born August 2001.  

We live in Auckland, New Zealand which has a sub-tropical climate (although that's hard to picture right now).  

We are famous for our scenery (Lord of the Rings fame most recently), rugby, America's Cup, complaining about Australians who keep beating us in sports, and UnrealTournament :)

The only wish I have is that there were more hours in a day so that I could spend more than 1 hour a night on my hobbies.  

After the children are asleep and the chores are done, there is precious little time to spend coding/playing/spamming and so on.  

Oh well, maybe in the next reality :)

==Kuhal on Games ==
* game = fun
* fun = good
* game = good

I'll play anything once and most things several times (until I beat you perhaps :) ).  

I'm into many types of games as well as game formats.  

It comes from many a rainy day playing Monopoly with my brothers and parents as I was growing up.  

I was playing Chess at 4 and beating Mum at 5 (or so I am told...).  

I was taught many card games as I was growing up as well as pool, darts (and other pub-related games).  

I play hockey (that's Field Hockey to those in the USA) and Squash.  At school I captained the Squash and Chess teams and vice captained the hockey team... 

Why? Mainly because I'm pretty good and putting my point across and leadership comes naturally :)

These days I play online games and very little else.  Why? Because my children are my masters :)

===Computer Games ===

I play:
* '''UnrealTournament''' - (of course) - I have a little server set up for our gaming clan but truthfully, it's there as my test bed for deploying my mods...muahaha
* '''WanCatan''' - its a network version of 'Settlers of Catan' which is a fantastic board game by Klaus Teuber  visit Mayfair Games at http://www.coolgames.com/ to learn more - incidentally, Klaus Teuber was the creator of Monopoly as well!
* '''Chess''' - visit http://itsyourmove.com - many online http games there for when I'm at work behind the pesky firewall
* '''BroodWars''' - I used to be a big online player but I haven't played in ages and ages - no times for a 4 hour marathon game these days...RTS's take a back seat to turnbased or action games where I can leave and come back a few minutes later

===Board Games ===

I play:
* '''The Settlers of Catan''' - &quot;Cities and Knights&quot; which is an extension of the original incorporating more combative rules for those that like the extra challenge
* '''Risk''' - Haven't played in ages.  Rather a basic game but good fun in a group of fanatics
* '''Diplomacy''' - I love this game but no time to play and nobody to play with.  Pure strategy, guile and negotiation skills.  No luck at all
* '''Cards''' - Various games like &quot;500&quot;, &quot;Euchre&quot;, &quot;Black Lady&quot; ...

==Kuhal on Programming ==
* programming = fun
* game = fun
* programming = game

(false) Logic aside (hehe) programming to me is another type of game.  

The rules are the language syntax.  

The skill is in your ability to create new solutions.  

As with games, experience allows for better success rates.  

The best game to play is one where it is you vs yourself, trying for a personal best each time you play.  

This is what programming is for me.  

It's also my livlihood but that's secondary.

===Predominant Languages ===

These are some of the languages I've needed to use to earn a living over the years
* Java/J2EE
* Visual Basic (various forms)
* [[Legacy:UnrealScript|UnrealScript]]
* LISP
* Various Unix Shells
* PHP
* MySql (and SQl in general really)

===Languages of interest ===

Additionally I've touched on these languages for varying lengths of time for aspects of projects or just for interests sake.

* Perl
* C/C++

===Mod Pages ===

[[Legacy:Mod Ideas/Balanced CTF|Mod Ideas/Balanced CTF]]

===Programming related interests ===

Some programming related interests of mine.  

Unfortunately I've never had time to follow any of them up farther than reading some theories and programming techniques.
* Artificial Intelligence (AI)
* DirectX
* Game Theory (related to AI)

==Kuhal on &quot;the things that make me MAD&quot; ==

MY pet hates are:
* Unfairness
** in games like UT when one team is stpacked with top talent and nobody agrees to swap
** in life when children (especially but not exclusively) are hurt by evil people
** whenever someone (ab)uses their power to hurt others - grrrr

* Abuse
** verbal abuse of any sort I dislike - especially online

* Keyboards - they are so slow.  I want neural implants to allow faster human/PC interaction!

* Almond flavoured stuff (but I like eating almonds - especially chocolate coated ones!)
** agar - That stuff is just nasty!
** fondant icing - (spelling?) - that stuff that's on wedding cakes...yech

===Current Projects ===

-September 2003-

I've been inactive for a long time as I lost interest in UT due to the local servers all going into disrepair.  Fortunately things are better now and I can enjoy playing some more.  I was los tin the land of Warcraft 3 editing for a few months there and as much fun as it was coming to terms with yet another scripting language, you don't get as much satisfaction in WC3 scripting as in UT scripting :)

I'm currently adding to SemiAdmin for UT which is a mod started by [[Legacy:DarkByte|DarkByte]] and [[Legacy:Evolution|Evolution]].

==Chalkboard ==

'''Tarquin:''' Hello Kuhal. Welcome to the Unreal Wiki. That's an impressive amount of work you've put into [[Legacy:UltraEdit|UltraEdit]]!

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki! :) :tup:

'''Kuhal:''' Err, thanks :)  I chose the topic because I like UltraEdit but also I wanted to learn the ropes as it were.  I tried to keep the look and feel as close to the standards I've been impressed with throughout the Wiki...

'''Tarquin:''' Your request for peer review kind of got snowed under heavy Site Navigation discussion... Wiki peer review is a bit odd at first, especially if you're coming from forums where people tend to post comments straight away. On a wiki, the tendency is that complete silence in reaction to something usually means that people like it. (or they don't get it yet and are waiting to see what it grows into). It takes some getting used to. I have the funny feeling that [[Legacy:Application|Application]] isn't the only page that gives a list of script editors to use with UnrealScript... I'm not sure, but it might be an idea to track that down &amp; put a link to [[Legacy:UltraEdit|UltraEdit]] there too. It's nice to hear standards impress! I regularly reel from how disorganized this place is ... :D

'''EntropicLqd:''' Hi Kuhal - I came across those Julian May books many years ago - a storming set of stories.  O yeah - a very belated welcome to the Wiki.  Maybe I should add a section on vi :)

'''Kuhal:''' Thanks EntropicLqd and yeah the stories are cool.  vi..lmao...Can you imagine modding unrealscript in vi exclusively? OUCH!

'''Tarquin:''' It's been said so many times... but here goes for one more...

http://www.userfriendly.org/cartoons/archives/99may/uf000621.gif

'''Kuhal:''' ROFL.  It might be old but I haven't seen it before!  That's funny...especially cos everyone knows that punch tape is the most hard core editor on the market!  Especially if you punch it with a compass during biology class... )

'''Highlander:''' Hey! I use gVim (version of VI for windows) to do my uscript. Has some nice unrealscript highlighting.

'''Kuhal:''' O...M...G!!!!!! I never thought I would see the day :)  I use [[Legacy:UltraEdit|UltraEdit]].  I know the minimum vi command necessary to cope with the small amount of unix scripting I have to do from time to time...  

'''EntropicLqd:'''  lol - that's a great cartoon.  vi is OK once you've gone through the extreme trauma of having to work with it.

'''Tarquin:''' When I was doing my maths degree, they tried to get us to learn vi to program in Fortran 77. I rebelled, and spend 2 weeks solid learning to program TinyMUSH instead. Great fun, wreaked havoc on my sleep pattern. Still that's what 1st year is for... :D (the department were dragged kicking and screaming into the 20th century and switched to ''Mathematica'' the year after.)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3912</id>
      <timestamp>2002-08-26T21:21:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=A bit about me... =

My nick is borrowed from the much loved and highly absorbing works of fiction written by '''Julian May'''.  

If you like Fantasy and love Science Fiction and want a perfect example of the merging of these genres into a cohesive and transfixing series, read these books!
* ''The Many Coloured Land''
* ''The Golden Torc''
* ''The Non-Born King''
* ''The Adversary''

I identify with '''''Kuhal Earthshaker''''' because he was always second best in what he did (ugh like me).  

He lost a loved one and overcame terrible hardship to survive a very difficult time in his world.  

However throughout all of the disasters and hardship, Kuhal remained true to his ideals and was always honourable and noble.  

This is an ideal I aspire to hence my adoption of the name Kuhal :)  

If you read the books, this &quot;spoiler&quot; won't matter at all as he is not the focal character at all...

==Kuhal on Family ==

My family is my most important achievement and my most important duty/love/activity.  

I have two children; my son born in January 2000 and my daughter born August 2001.  

We live in Auckland, New Zealand which has a sub-tropical climate (although that's hard to picture right now).  

We are famous for our scenery (Lord of the Rings fame most recently), rugby, America's Cup, complaining about Australians who keep beating us in sports, and UnrealTournament :)

The only wish I have is that there were more hours in a day so that I could spend more than 1 hour a night on my hobbies.  

After the children are asleep and the chores are done, there is precious little time to spend coding/playing/spamming and so on.  

Oh well, maybe in the next reality :)

==Kuhal on Games ==
* game = fun
* fun = good
* game = good

I'll play anything once and most things several times (until I beat you perhaps :) ).  

I'm into many types of games as well as game formats.  

It comes from many a rainy day playing Monopoly with my brothers and parents as I was growing up.  

I was playing Chess at 4 and beating Mum at 5 (or so I am told...).  

I was taught many card games as I was growing up as well as pool, darts (and other pub-related games).  

I play hockey (that's Field Hockey to those in the USA) and Squash.  At school I captained the Squash and Chess teams and vice captained the hockey team... 

Why? Mainly because I'm pretty good and putting my point across and leadership comes naturally :)

These days I play online games and very little else.  Why? Because my children are my masters :)

===Computer Games ===

I play:
* '''UnrealTournament''' - (of course) - I have a little server set up for our gaming clan but truthfully, it's there as my test bed for deploying my mods...muahaha
* '''WanCatan''' - its a network version of 'Settlers of Catan' which is a fantastic board game by Klaus Teuber  visit Mayfair Games at http://www.coolgames.com/ to learn more - incidentally, Klaus Teuber was the creator of Monopoly as well!
* '''Chess''' - visit http://itsyourmove.com - many online http games there for when I'm at work behind the pesky firewall
* '''BroodWars''' - I used to be a big online player but I haven't played in ages and ages - no times for a 4 hour marathon game these days...RTS's take a back seat to turnbased or action games where I can leave and come back a few minutes later

===Board Games ===

I play:
* '''The Settlers of Catan''' - &quot;Cities and Knights&quot; which is an extension of the original incorporating more combative rules for those that like the extra challenge
* '''Risk''' - Haven't played in ages.  Rather a basic game but good fun in a group of fanatics
* '''Diplomacy''' - I love this game but no time to play and nobody to play with.  Pure strategy, guile and negotiation skills.  No luck at all
* '''Cards''' - Various games like &quot;500&quot;, &quot;Euchre&quot;, &quot;Black Lady&quot; ...

==Kuhal on Programming ==
* programming = fun
* game = fun
* programming = game

(false) Logic aside (hehe) programming to me is another type of game.  

The rules are the language syntax.  

The skill is in your ability to create new solutions.  

As with games, experience allows for better success rates.  

The best game to play is one where it is you vs yourself, trying for a personal best each time you play.  

This is what programming is for me.  

It's also my livlihood but that's secondary.

===Predominant Languages ===

These are some of the languages I've needed to use to earn a living over the years
* Java/J2EE
* Visual Basic (various forms)
* [[Legacy:UnrealScript|UnrealScript]]
* LISP
* Various Unix Shells

===Languages of interest ===

Additionally I've touched on these languages for varying lengths of time for aspects of projects or just for interests sake.
* PHP
* MySql (and SQl in general really)
* Perl
* C/C++

===Programming related interests ===

Some programming related interests of mine.  

Unfortunately I've never had time to follow any of them up farther than reading some theories and programming techniques.
* Artificial Intelligence (AI)
* DirectX
* Game Theory (related to AI)

==Kuhal on &quot;the things that make me MAD&quot; ==

MY pet hates are:
* Unfairness
** in games like UT when one team is stacked with top talent and nobody agrees to swap
** in life when children (especially but not exclusively) are hurt by evil people
** whenever someone (ab)uses their power to hurt others - grrrr

* Abuse
** verbal abuse of any sort I dislike - especially online

* Keyboards - they are so slow.  I want neural implants to allow faster human/PC interaction!

* Almond flavoured stuff (but I like eating almonds - especially chocolate coated ones!)
** agar - That stuff is just nasty!
** fondant icing - (spelling?) - that stuff that's on wedding cakes...yech

=Chalkboard =

'''Tarquin:''' Hello Kuhal. Welcome to the Unreal Wiki. That's an impressive amount of work you've put into [[Legacy:UltraEdit|UltraEdit]]!

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki! :) :tup:

'''Kuhal:''' Err, thanks :)  I chose the topic because I like UltraEdit but also I wanted to learn the ropes as it were.  I tried to keep the look and feel as close to the standards I've been impressed with throughout the Wiki...

'''Tarquin:''' Your request for peer review kind of got snowed under heavy Site Navigation discussion... Wiki peer review is a bit odd at first, especially if you're coming from forums where people tend to post comments straight away. On a wiki, the tendency is that complete silence in reaction to something usually means that people like it. (or they don't get it yet and are waiting to see what it grows into). It takes some getting used to. I have the funny feeling that [[Legacy:Application|Application]] isn't the only page that gives a list of script editors to use with UnrealScript... I'm not sure, but it might be an idea to track that down &amp; put a link to [[Legacy:UltraEdit|UltraEdit]] there too. It's nice to hear standards impress! I regularly reel from how disorganized this place is ... :D

'''EntropicLqd:''' Hi Kuhal - I came across those Julian May books many years ago - a storming set of stories.  O yeah - a very belated welcome to the Wiki.  Maybe I should add a section on vi :)

'''Kuhal:''' Thanks EntropicLqd and yeah the stories are cool.  vi..lmao...Can you imagine modding unrealscript in vi exclusively? OUCH!

'''Tarquin:''' It's been said so many times... but here goes for one more...

http://www.userfriendly.org/cartoons/archives/99may/uf000621.gif

'''Kuhal:''' ROFL.  It might be old but I haven't seen it before!  That's funny...especially cos everyone knows that punch tape is the most hard core editor on the market!  Especially if you punch it with a compass during biology class... )

'''Highlander:''' Hey! I use gVim (version of VI for windows) to do my uscript. Has some nice unrealscript highlighting.

'''Kuhal:''' O...M...G!!!!!! I never thought I would see the day :)  I use [[Legacy:UltraEdit|UltraEdit]].  I know the minimum vi command necessary to cope with the small amount of unix scripting I have to do from time to time...  

'''EntropicLqd:'''  lol - that's a great cartoon.  vi is OK once you've gone through the extreme trauma of having to work with it.

'''Tarquin:''' When I was doing my maths degree, they tried to get us to learn vi to program in Fortran 77. I rebelled, and spend 2 weeks solid learning to program TinyMUSH instead. Great fun, wreaked havoc on my sleep pattern. Still that's what 1st year is for... :D (the department were dragged kicking and screaming into the 20th century and switched to ''Mathematica'' the year after.)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>3913</id>
      <timestamp>2002-09-05T22:47:43Z</timestamp>
      <contributor>
        <ip>Kuhal</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=A bit about me... =

My nick is borrowed from the much loved and highly absorbing works of fiction written by '''Julian May'''.  

If you like Fantasy and love Science Fiction and want a perfect example of the merging of these genres into a cohesive and transfixing series, read these books!
* ''The Many Coloured Land''
* ''The Golden Torc''
* ''The Non-Born King''
* ''The Adversary''

I identify with '''''Kuhal Earthshaker''''' because he was always second best in what he did (ugh like me).  

He lost a loved one and overcame terrible hardship to survive a very difficult time in his world.  

However throughout all of the disasters and hardship, Kuhal remained true to his ideals and was always honourable and noble.  

This is an ideal I aspire to hence my adoption of the name Kuhal :)  

If you read the books, this &quot;spoiler&quot; won't matter at all as he is not the focal character at all...

==Kuhal on Family ==

My family is my most important achievement and my most important duty/love/activity.  

I have two children; my son born in January 2000 and my daughter born August 2001.  

We live in Auckland, New Zealand which has a sub-tropical climate (although that's hard to picture right now).  

We are famous for our scenery (Lord of the Rings fame most recently), rugby, America's Cup, complaining about Australians who keep beating us in sports, and UnrealTournament :)

The only wish I have is that there were more hours in a day so that I could spend more than 1 hour a night on my hobbies.  

After the children are asleep and the chores are done, there is precious little time to spend coding/playing/spamming and so on.  

Oh well, maybe in the next reality :)

==Kuhal on Games ==
* game = fun
* fun = good
* game = good

I'll play anything once and most things several times (until I beat you perhaps :) ).  

I'm into many types of games as well as game formats.  

It comes from many a rainy day playing Monopoly with my brothers and parents as I was growing up.  

I was playing Chess at 4 and beating Mum at 5 (or so I am told...).  

I was taught many card games as I was growing up as well as pool, darts (and other pub-related games).  

I play hockey (that's Field Hockey to those in the USA) and Squash.  At school I captained the Squash and Chess teams and vice captained the hockey team... 

Why? Mainly because I'm pretty good and putting my point across and leadership comes naturally :)

These days I play online games and very little else.  Why? Because my children are my masters :)

===Computer Games ===

I play:
* '''UnrealTournament''' - (of course) - I have a little server set up for our gaming clan but truthfully, it's there as my test bed for deploying my mods...muahaha
* '''WanCatan''' - its a network version of 'Settlers of Catan' which is a fantastic board game by Klaus Teuber  visit Mayfair Games at http://www.coolgames.com/ to learn more - incidentally, Klaus Teuber was the creator of Monopoly as well!
* '''Chess''' - visit http://itsyourmove.com - many online http games there for when I'm at work behind the pesky firewall
* '''BroodWars''' - I used to be a big online player but I haven't played in ages and ages - no times for a 4 hour marathon game these days...RTS's take a back seat to turnbased or action games where I can leave and come back a few minutes later

===Board Games ===

I play:
* '''The Settlers of Catan''' - &quot;Cities and Knights&quot; which is an extension of the original incorporating more combative rules for those that like the extra challenge
* '''Risk''' - Haven't played in ages.  Rather a basic game but good fun in a group of fanatics
* '''Diplomacy''' - I love this game but no time to play and nobody to play with.  Pure strategy, guile and negotiation skills.  No luck at all
* '''Cards''' - Various games like &quot;500&quot;, &quot;Euchre&quot;, &quot;Black Lady&quot; ...

==Kuhal on Programming ==
* programming = fun
* game = fun
* programming = game

(false) Logic aside (hehe) programming to me is another type of game.  

The rules are the language syntax.  

The skill is in your ability to create new solutions.  

As with games, experience allows for better success rates.  

The best game to play is one where it is you vs yourself, trying for a personal best each time you play.  

This is what programming is for me.  

It's also my livlihood but that's secondary.

===Predominant Languages ===

These are some of the languages I've needed to use to earn a living over the years
* Java/J2EE
* Visual Basic (various forms)
* [[Legacy:UnrealScript|UnrealScript]]
* LISP
* Various Unix Shells

===Languages of interest ===

Additionally I've touched on these languages for varying lengths of time for aspects of projects or just for interests sake.
* PHP
* MySql (and SQl in general really)
* Perl
* C/C++

===Mod Pages ===

[[Legacy:Mod Ideas/Balanced CTF|Mod Ideas/Balanced CTF]]

===Programming related interests ===

Some programming related interests of mine.  

Unfortunately I've never had time to follow any of them up farther than reading some theories and programming techniques.
* Artificial Intelligence (AI)
* DirectX
* Game Theory (related to AI)

==Kuhal on &quot;the things that make me MAD&quot; ==

MY pet hates are:
* Unfairness
** in games like UT when one team is stacked with top talent and nobody agrees to swap
** in life when children (especially but not exclusively) are hurt by evil people
** whenever someone (ab)uses their power to hurt others - grrrr

* Abuse
** verbal abuse of any sort I dislike - especially online

* Keyboards - they are so slow.  I want neural implants to allow faster human/PC interaction!

* Almond flavoured stuff (but I like eating almonds - especially chocolate coated ones!)
** agar - That stuff is just nasty!
** fondant icing - (spelling?) - that stuff that's on wedding cakes...yech

=Chalkboard =

'''Tarquin:''' Hello Kuhal. Welcome to the Unreal Wiki. That's an impressive amount of work you've put into [[Legacy:UltraEdit|UltraEdit]]!

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki! :) :tup:

'''Kuhal:''' Err, thanks :)  I chose the topic because I like UltraEdit but also I wanted to learn the ropes as it were.  I tried to keep the look and feel as close to the standards I've been impressed with throughout the Wiki...

'''Tarquin:''' Your request for peer review kind of got snowed under heavy Site Navigation discussion... Wiki peer review is a bit odd at first, especially if you're coming from forums where people tend to post comments straight away. On a wiki, the tendency is that complete silence in reaction to something usually means that people like it. (or they don't get it yet and are waiting to see what it grows into). It takes some getting used to. I have the funny feeling that [[Legacy:Application|Application]] isn't the only page that gives a list of script editors to use with UnrealScript... I'm not sure, but it might be an idea to track that down &amp; put a link to [[Legacy:UltraEdit|UltraEdit]] there too. It's nice to hear standards impress! I regularly reel from how disorganized this place is ... :D

'''EntropicLqd:''' Hi Kuhal - I came across those Julian May books many years ago - a storming set of stories.  O yeah - a very belated welcome to the Wiki.  Maybe I should add a section on vi :)

'''Kuhal:''' Thanks EntropicLqd and yeah the stories are cool.  vi..lmao...Can you imagine modding unrealscript in vi exclusively? OUCH!

'''Tarquin:''' It's been said so many times... but here goes for one more...

http://www.userfriendly.org/cartoons/archives/99may/uf000621.gif

'''Kuhal:''' ROFL.  It might be old but I haven't seen it before!  That's funny...especially cos everyone knows that punch tape is the most hard core editor on the market!  Especially if you punch it with a compass during biology class... )

'''Highlander:''' Hey! I use gVim (version of VI for windows) to do my uscript. Has some nice unrealscript highlighting.

'''Kuhal:''' O...M...G!!!!!! I never thought I would see the day :)  I use [[Legacy:UltraEdit|UltraEdit]].  I know the minimum vi command necessary to cope with the small amount of unix scripting I have to do from time to time...  

'''EntropicLqd:'''  lol - that's a great cartoon.  vi is OK once you've gone through the extreme trauma of having to work with it.

'''Tarquin:''' When I was doing my maths degree, they tried to get us to learn vi to program in Fortran 77. I rebelled, and spend 2 weeks solid learning to program TinyMUSH instead. Great fun, wreaked havoc on my sleep pattern. Still that's what 1st year is for... :D (the department were dragged kicking and screaming into the 20th century and switched to ''Mathematica'' the year after.)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kungfu Hampster</title>
    <id>1618</id>
    <revision>
      <id>4018</id>
      <timestamp>2005-01-07T19:19:09Z</timestamp>
      <contributor>
        <ip>Kungfu Hampster</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey y'all.  This is kungfu Hampster.  Yes, it's misspelled on purpose.  When I fist made the name I spelled it wrong and it'sjust kinda stuck.

Kinda new to scripting.  Been only doing it for a few months now.  I'll be making a developer's journal as soon as I can.

Hope u guys can give me some love and support!

Fa shizzle,

KungFu Hampster

'''Foxpaw:''' Howdy. Hrm. I don't have much to say, but I thought I'd point out that you don't need hard line breaks in wiki markup - the lines will wrap automatically. Since paragraphs are automatically separated by the parser, it's interpreting each line as a different paragraph, which is why your text looks &quot;double spaced.&quot;

'''Graphik:''' Nice to see someone from OT. :)

'''Kungfu Hampster:''' damn you text wrapping.... You are a cruel and fickel mistress....

So, I'm about to set up my journal...call me an idiot...but then help me figure out how to set my my subpage!

'''Tarquin:''' hi there! To make a subpage, just do this: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Subpage]] (edit to see markup)

'''Kungfu Hampster:''' Ah.  You just place the markup at the bottom of your page.  Gotcha.

'''Graphik:''' Look at the markup I used to show that the above comment was from you, KFH.

'''Wormbo:''' Welcome to the Wiki. I've renamed the page for you, so it's actually a subpage of this one. &lt;code&gt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]&lt;/code&gt; already was the correct markup. ;)

'''Kungfu Hampster:''' Thanks ;)

----

'''Kungfu Hampster:''' Just wrote a basic tut on how to use capture volumes to track player position.  Check it out at [[Legacy:CaptureVolume|captureVolume]]

----

[[Legacy:Kungfu Hampster/Developer Journal|Kungfu Hampster/Developer Journal]]</text>
    </revision>
    <revision>
      <id>4019</id>
      <timestamp>2004-11-22T17:29:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey y'all.  This is kungfu Hampster.  Yes, it's misspelled on purpose.  When I fist made the name I spelled it wrong and it'sjust kinda stuck.

Kinda new to scripting.  Been only doing it for a few months now.  I'll be making a developer's journal as soon as I can.

Hope u guys can give me some love and support!

Fa shizzle,

KungFu Hampster

'''Foxpaw:''' Howdy. Hrm. I don't have much to say, but I thought I'd point out that you don't need hard line breaks in wiki markup - the lines will wrap automatically. Since paragraphs are automatically separated by the parser, it's interpreting each line as a different paragraph, which is why your text looks &quot;double spaced.&quot;

'''Graphik:''' Nice to see someone from OT. :)

'''Kungfu Hampster:''' damn you text wrapping.... You are a cruel and fickel mistress....

So, I'm about to set up my journal...call me an idiot...but then help me figure out how to set my my subpage!

'''Tarquin:''' hi there! To make a subpage, just do this: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Subpage]] (edit to see markup)

'''Kungfu Hampster:''' Ah.  You just place the markup at the bottom of your page.  Gotcha.

'''Graphik:''' Look at the markup I used to show that the above comment was from you, KFH.

'''Wormbo:''' Welcome to the Wiki. I've renamed the page for you, so it's actually a subpage of this one. &lt;code&gt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]&lt;/code&gt; already was the correct markup. ;)

----

'''Kungfu Hampster:''' Just wrote a basic tut on how to use capture volumes to track player position.  Check it out at [[Legacy:CaptureVolume|captureVolume]]

----

[[:Category:Legacy Personal Page]]

[[Legacy:Kungfu Hampster/Developer Journal|Kungfu Hampster/Developer Journal]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4020</id>
      <timestamp>2004-11-30T22:16:56Z</timestamp>
      <contributor>
        <ip>Kungfu Hampster</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hey y'all.  This is kungfu Hampster.  Yes, it's misspelled on purpose.  When I fist made the name I spelled it wrong and it'sjust kinda stuck.

Kinda new to scripting.  Been only doing it for a few months now.  I'll be making a developer's journal as soon as I can.

Hope u guys can give me some love and support!

Fa shizzle,

KungFu Hampster

'''Foxpaw:''' Howdy. Hrm. I don't have much to say, but I thought I'd point out that you don't need hard line breaks in wiki markup - the lines will wrap automatically. Since paragraphs are automatically separated by the parser, it's interpreting each line as a different paragraph, which is why your text looks &quot;double spaced.&quot;

'''Graphik:''' Nice to see someone from OT. :)

'''Kungfu Hampster:''' damn you text wrapping.... You are a cruel and fickel mistress....

So, I'm about to set up my journal...call me an idiot...but then help me figure out how to set my my subpage!

'''Tarquin:''' hi there! To make a subpage, just do this: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Subpage]] (edit to see markup)

'''Kungfu Hampster:''' Ah.  You just place the markup at the bottom of your page.  Gotcha.

'''Graphik:''' Look at the markup I used to show that the above comment was from you, KFH.

'''Wormbo:''' Welcome to the Wiki. I've renamed the page for you, so it's actually a subpage of this one. &lt;code&gt;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal]]&lt;/code&gt; already was the correct markup. ;)

----

'''Kungfu Hampster:''' Just wrote a basic tut on how to use capture volumes to track player position.  Check it out at [[Legacy:CaptureVolume|captureVolume]]

----

[[Legacy:Kungfu Hampster/Developer Journal|Kungfu Hampster/Developer Journal]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kungfu Hampster/Developer Journal</title>
    <id>1620</id>
    <revision>
      <id>4023</id>
      <timestamp>2008-02-14T23:31:02Z</timestamp>
      <contributor>
        <ip>69-11-86-35.msjw.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">===Kungfu Hampster Developer Journal===

====Man with Keyboard Prints on forehead====

Okay, so I'm going to use this page as a way to list the issues I come up wiht every day working with unrealscript.  I will post code upon request, but I'm not going to post huge blocks of code.  Well, maybe I will...no harm in lending a helping had to y'all! ;)

{{innerbox|It should go as a given, but if you use any of my code, please give me some kinda credit!  Also, feel free to add comments but please don't edit my journal text unless you feel like adding a helpful link!

}}

*A brief overview of what I'm trying ta do:
**Use a HUD [[Legacy:Interaction|interaction]] to create an interface that will limit user control to the mouse and still allow interactivity
**Create my own radar map outside of Onslaught's
**Develop interactivity with BSPs and Static Meshes within my environment with the mouse
**Track player movement and be able to output information and images and such

====11/22/04====

The Onslaught map is working fine for now.  I'm going to have to develop some kind of code outside of it in order to separate out mod from looking too much like UT.  The only think making it look like UT for now is the cursor. I know there's a way to create a [[Legacy:Textrotator|textrotator]], but I haven't looked into it too much yet.  The volumes and capturepoints are working fine, althought I have noticed a small problem, something that happened earlier in the process.

When you use custom scripts in your levels to make volume, capture points, whatever, the level you're working on becomes linked to those scripts.  So, for example, if you decide to do revisions on a compiled file, or change the name of a group of classes, the level will not open.  It will give you a bad name index or something similar.  The linked compiled package you loaded in muse be in the system folder period.  I have not found a way at the present time to remove this link other than placing backups of the compiled files back where they belong.

I have also come across a strange error that occurs about every two weeks or so.  After a few revisions and compilations, I will develop a type mismatch in my [[Legacy:Interaction|interaction]] class.  I'm not sure where this is coming from, but I've found the only way to deal with this is to find an older version of the code and re-write it. (That how I consistently come across the bad name index I stated above!)

&lt;uscript line&gt;
event Initialized()
{


	if((pOwner == none) &amp;&amp; (myPlayer(ViewportOwner.Actor) != none))
		pOwner = myPlayer(ViewportOwner.Actor);

}
&lt;/uscript&gt;

Always in the Initialization part of the interaction class.  Still trying to figure out this one.

Also, I'm having a weird error pop up from my level editors.  They'll create a texture package with a level, bring it over to me and when I get it, sometimes a certain texture will dissapear or go missing.  I've even gone so far as to open the exact same package (same time and everything in details via windows), checked that the texture was there, ported is over via a network, worked with it for a while....then boom!  The texture is gone fter about two or three saves.  Hmmm....maybe I wasn't wrong about those corrupt texture packs...

Final issue I'm trying to iron out is how to make a  HUD interaction visible and invisible.  The problem we're running into is using a manitee sequence in the level. Since I'm using a hud interaction, the textures on the hud aren't disappearing when you roll over the trigger point.  I've tried using the variable of bHideHud to control whether the HUD is  or is not diplayed, but it dosen't seem to have worked so far.

====Tip of the day====

If you're having a variable of none appearing all over your log, make sure you set a clause before the script executes!  Something like...

&lt;uscript&gt;
    if (cv != none)
       {
          ...your code here
       }
&lt;/uscript&gt;

----

====11/30/04====

     I had some inital problems getting things running today, but eventually I found out that it was becuase I had commented piece of code out.  

That's what happens when u get sick an ddon't touch your code for almost a week!  My main issue today was getting the [[Legacy:HUD|HUD]] to disappear during a Manitee sequence, something we had problems with becuase I was using an [[Legacy:Interaction|interaction]].  

The solution was not so obvious, but turns out to be very simple.  In the interaction class, add this bit of code to your initalized()

&lt;uscript&gt;
	if (pOwner.bViewingMatineeCinematic == true)
	{
	   pOwner.myHud.bHideHud = true;
    }

    if (pOwner.myHUD.bHideHUD != true)
    {

    	DrawHud();
    	DrawCursor();
    }
&lt;/uscript&gt;

pOwner is a variable of my custom class which extends [[Legacy:XPlayer|xPlayer]].  With this small bit o' code, the interaction will respons to the hidehud command.  My next order of buisness to creating splash screens as well as working on the interactivity of the mod.  

The spash screen s look pretty straighforeward.  Gettign them to work within the mod in it's own directory structiure might be a little difficult.  All the files I see out there have you replacing the text in the [[Legacy:2004.Ini|2004.ini]] or [[Legacy:User.Ini|User.ini]]...or even replacing the actual files from the install.  That's not going to work in my opinion.  I need this mod to sit on top of the engine and that's that!

The major problem we're having at this time is recording realtime movies using the engine.  I have seen fan films that have been done using demorec to make a file, then render it out to an avi.  The problem is that when I do that, the [[Legacy:Interaction|interaction]] dissapears!  (Figures it woul be the opposite problem I had before)  There must be something that the [[Legacy:Demorec|demorec]] function is calling that hides certain parts of the hud.  

Looking at normal game renderings and other fan films, the gun arm tends to dissapear when recorded.  So, there's got to be a way to make this visible.  As for recording the mouse cursor I made, that might be impossible.  I'm going to give myself until tomorrow to figure it out.

====Tip o' the day====

Before you even start writing code, sit down and write out the class names you're going to use.  While it's fun to just start digging in ode, not establishing your class names will really bite you in the end.

----

====12/02/04====

Started looking into interactivity.  I have to figure out whether it's even possible to change the textures on the BSP's on the fly.  I blieve there is some way to do it, since i have experiemented with a [[Legacy:Materialtrigger|materialtrigger]] and have found that it works fairly smoothly.
*Tricky stuff
**Getting the trigger to work with a keypress
**Tracking player movment and view position
**Selecting which part of the BSP is being accessed.

Tracking player position shouldn't be too hard since I'm already doing that with the volumes and the capture points.  Linking the triggers is goig to be a pin, since I might need four of them for each room and i have to be able to access them separately.  I'm considering implementing soem kind of menu system with the right mouse button that will be room specific.  So, you go in a room, right click and you get options for the floor, walls, ect...

=====Later That day=====

I've tried building my own materialTrigger but don't seem to be having any luck so far.  I figured that if I could somehow link the enteredvolume() unction to the material trigger, just like you do with a regular trigger.  By doing this I could track where the player is and activate triggers depending on their location.  I might get stuck using regular triggers at this point, but I think that might really slow the ocmputer down...

====Tip o' the day====

If you get a bad name index and you've been working with custom volumes, trigers, ect...it's probably becuase you removed or deleted the .u &amp; .ucl file from the System folder.  Maps for some reason develop a dependence to these files, even if the items wihtin the level have been deleted.  Always keep this in mind, so don't start placing these things in your evel unless the design of your map is close to being finished.

----

====12/3/04====

Still working on gettign those textures to change.  I'm trying to find an appropriate way to link the triggers to a keypress without having to walk up to it and press the use button (i'm using the usetrigger right now).  I wrote a custom usetrigger and am trying to mess with that, but I can't seem to find any way to limit whether the player can access it or not.  I've tried using the volume trick I used to track player position, but that dosen't seem to be working either.

I think the code to control it should probably go in here:

&lt;uscript&gt;
function Touch( Actor Other )
{
	if ( Pawn(Other) != None )
	{
	    // Send a string message to the toucher.
	    if( Message != &quot;&quot; )

		if ( AIController(Pawn(Other).Controller) != None)
			UsedBy(Pawn(Other));
	}
}
&lt;/uscript&gt;

I'm trying to use a boolean to start, something simple.  I'll keep you posted.

====Tip o' the day====

This is kinda silly, but learn the windows hotkeys cause they really make stuff simpler.  Especially stuff that works with the windows key.  Win + D minimizes everything, Win + E opens a windows explorer and Win + R will open the Run utility from the start menu.

----

====12/6/04====

I was able to map the use function to the right mouse button by using a keypress interaction and putting in pOwner.Use() where pOwner is derived from xPlayer.  It's nice to have the use function mapped, but I need to try to figure out a way to control the triggers depending on the orientation of the player.  I know there's a trigger that fires depending on whether a person is looking at it, but after one fire is destroys itself (i think...)  

The tracking volume trick dosen't seem to be working, so I decided a simpler route would be to place all the triggers in the room and make teir radius the size of the room or however big I need, then turn the triggers on or off depending on where the playeris facing.  Still I can see a problem with this becuase the walls are coming up empty whenever I use the worldToScreen command.

Right now my path of action is:  useKey =&gt; UseTrigger =&gt; Material Switch

I just need to figure out how to turn the use key on and off by player orientation...or by cursor position...

====Tip o' the day====

WOTgreal and UDE are your best friends.  In my opinion, the only way to edit unrealscript.  If you're not using them already, you're really limiting the speed in which you can accomplish things.

----

====12/15/04====

I'm going to have to step away from UT for a while.  I've got some other things to take care of...mainly moving out to San Francisco!  I'll post my developments when they happen ;)

=====Tip o' the day=====

Use the dfault properties as much as possible.  If you have a lot of variables which have the same number, set a default prop equaling a variable hat u place where the numbers went.  Then, you can adjust all your values in one place!  Very helpful when doing HUD mods...

----

'''Foogod:''' So you're comin' over to the ol' SF bay area, huh?  Cool to see a local (or soon to be local) fellow!  We'll have to get together or something.. :)

'''KungFu Hampster:''' Man...a new city and I already got a stalker.  What're the odds? ;)  I'm actually moving there to go to grad school at the San Fran Academy of Art.  My current school just ain't cuttin it.  So, I get to stay in school a few years, work on computer stuff, and go deeper in debt.  Horray for me!

----

====12/20/04====

Found some time to poke around the engine.  I'm working on making custom menus right now.  Best resource I've found so far was at http://udn.epicgames.com/Two/RuntimeExampleRestrictedMenu.  Also try looking at [[Legacy:Daemonica/Previous Problems|Daemonica/Previous Problems]] and [[Legacy:GUIPage|GUIPage]].  I'm going to try to put soem music in there too.

I tried using the UModWizard a few days ago and found it to be good and bad.  For one thing, I can't figure out how to stick a shortcut on the desktop when the mod installs.  I know there's a way ta do this becuase Red Orchestra did it.  Also, I'm finding that the program dosen't seem to install certain components correctly.  I'm not sure if this is because of the fact that I'm using my own directory or what, but it's kind of annoying.  Right now the best way I've found is to use the installer, then futz with it till it works.  Not the best solution, right?  Is anyone has any advice on how to make the UModWizard work correctly, please help me out ;)

I'm also having a hell of a problem getting my interaction to work correctly.  I keep gettign these weird class mismatch errors in my interaction class.  If you know anything about interactions, please go to the [[Legacy:Help Desk|Help Desk]] and look at my code ta help me out!

I've also found an issue with a lot of the examples I'm looking at.  Many of them have been written for UT2003 or earlier...and since there were significant changes to the UT interface (namley the edition of UT2K4 GUI's) I'm finding a lot of errors and crap.  So, I gotta work through that and hope I can get something to work.  Many of my midgame menus are definetly not working, but I'm trying to piece through the Unreal2Runtime to use as an example of what I should be doing....

----

====12/22/04====

I was able to get a main menu class to get up and running form my mod hierarchy.  I'm still working on the midgame menu though.  I suspect that I'm not putting it in the .ini's correctly, but everything looks solid right now.  There's also the issue of getting all the bots to stop spawing in my map, since this is to be a single player immersive kinda project.  Also, I really gotta get uMod working.  We'll just have ta see what I can do...

Batch files are the bane of my existance.  Also the joy.  They really piss me off when they don't work but when they do I don't mind people looking at me from across the room.  Makes me feel like a hot shot programmer. *pushes up glasses*  He he!

----

====12/27/04====

Hope you had a happy holiday.  I'm going full force today on making the menu sysytem work as well as the installer.  Over t Atari Forums, Ron Presterback (I believe that's how u spell his name) reccomeded I check out some of the test code that was included with the UT2004 disc when shipped.  THey start with My...and are called stuff like MyTestPanel and such.  I'm going to check them out today as well as trying to tear apart the pieces of UT2Runtime to stt when I can find.  It seems that the runtime uses some kind of tab system...but I think it's still organized the same way...

====Later That Day...====

The midgamemenu class turns out to be a class called UT2K4PlayerLoginMenu.u.  CHanging that in the ini fixed the problem ;)

----

====12/29/04====

Still working on the GUI.  THe GUI for 2003 and 2004 are very different, so this is presenting some problems when I look at web sites with people's examples and such.  The interactive GUI designer has been helpful, but exporting the items still presents problems when it comes to deleting stuff.  It would be nice to be able to put in my own fonts of my own colors for these items, but it dosen't seem to be a possibility.  I'll just have to see if I can figure something out.

The backgrounds and the startup icon were easy to do.  I'm getting soem weird stretching in the background however, which I believe is resolution dependent.  Since the computer I'm using to do this is kinda crummy, I have to keep the rez fairly low.  The result are black bars across the sides of my screen.  I'm tried stretching the image out but it dosen't seem to solve the problem.  Looking the the UT files I noticed they declared their backgrounds differently than me...

&lt;uscript&gt;
defaultproperties
{
	bDebugging=True
	OnOpen=InternalOnOpen
	OnCanClose=CanClose
	OnKeyEvent=MyKeyEvent
    OnReopen=MainReopened

	Begin Object Class=BackgroundImage Name=PageBackground
		Image=material'2K4Menus.Controls.mmbgnd'
		ImageStyle=ISTY_Scaled
		ImageRenderStyle=MSTY_Alpha
        X1=0
        Y1=0
        X2=1024
        Y2=768
	End Object
&lt;/uscript&gt;

Trying to use this method proved to be pretty stinky.  My own method was simpler...

&lt;uscript&gt;
   Background=Texture'rscGUI.background2'  //  mmbgnd


   WinWidth=1.000000
   WinHeight=0.807813
   WinLeft=0.000000
   WinTop=55.980499
&lt;/uscript&gt;

I think this is the &quot;old&quot; method of doing it.  But seeing as how I can't get the new one to work...:(

======Tip o' The Day======

If u want a custom startup logo for you mod, title the logo the same title as your mod, followed by logo...For example, if my mod as titled &quot;TestMod&quot; my logo would be: TestModLogo.bmp.  Make sure your bmp as 256 colors too, or else it won't work.

----

====1/3/05====

Happy new year!

Spending more time working on the menus.  It seems to me that the buttons timeselves are defined through the sty_* classes.  The grapics are are defined themselves through code.  Like, when you say what the text it, it automatically spaces itself .  In the packaged texture files there are these little 64x64 ticks which are the rollovers, down states, and all that crap.  I'm goignt o try making some of my own in photoshop and see what happens...

I had a problem previously where bots would just spawn randomly, even if I specified it was an sp game.  The way I found around this is to extend my main DM class from Deathmatch instead of XDeathmatch.  Why does this work?  I HAVE NO IDEA!  But it works nontheless!  Horray!

----

====1/4/05====

I feel like the project is very close to completion.  However, I'm having a problem with dissapearing textures again.  Here's a copy of a post I put on Atari Forums....

{{innerbox|I will try forcing the whole package to save next time, but for now I found a temporary fix, but it's pretty sloppy.

}}

{{innerbox|I have my own Mod folder with it's own texture/map/staticmesh/ect. folders. So, the texture pack has been residing in there. I took the texture pack (after the shader and two textures had dissapeared again), placed the textures and shader back in, saved it within my mod folder, then placed an exact duplicate in the UT2004/Textures folder.

}}

{{innerbox|For some reason, now that I did this, the map works and the textures always show up in the map. (For now!)

}}

{{innerbox|I've had my maps develop &quot;dependencies&quot; like this in the past. When I was creating a custom hud, I scripted a custom volume as a test, then tried to remove that class from the folder. I kept getting bad name indexes until I placed the class back in. Even thought an instance of the custom volume didn't even exist anywhere on the map and the written class had no variables or functions in it, the dependency was still there. 

}}

{{innerbox|I can't help but think this texture error could be the same type of thing, although I do think it's weird that it always deletes the same two textures and shader!

}}

Like I said above, these dependencies I've found to be the most annoying part of Unreal.  I'm not sure why it happens and a lot of the time there's nothing u can do about it.  Grrr.....c'mon Epic!

Other than that, the menus are looking good and the installer for the most part seems to be working okay.  We'll just have to see when I try putting it on other people's machines!

----

====1/7/05====

The installer is working fairly well now.  I did havesoem problems on machines that had the installer put in previously, I think because of residual stuff left over from previous attempts.  The load screens were easily inserted as well.  The midgamemenus seem to be working fine as well.  Helpers have been changed...now i just have to put the popups back in and place them in the latest version of the map.  Then, it's on to optimization!

====Tip of the day====

Make sure that when you save your texture packages, you force the loading of the entire package before you save!  If you on't textures will begin to mysteriously dissapear!  There's a white button in the [[Legacy:Texture_browser|texture_browser]] of [[Legacy:UnrealEd|UnrealEd]] that does this.

----

====1/10/05====

For soem reason, after i placed everything in the installer, the fading icons have stopped working.  I think this might be due to me changing the class of the customDM to Deathmatch as opposed to xDeathmatch.  However, I don't know what I'm goignt o do about the bots if I switch it back to xDeathmatch, so I might have to find another way around that.

What I really suspect is it has something to do with the tick equasion I wrote.

&lt;uscript&gt;
event Tick(float DeltaTime)
{
       if (cv != none)
        {
	CheckMousePosition(cv);

//-------------------------------------------------------
//checking the glow and doing the fade...

    checkGlowVariable(cv);
      }

    if (fadeout == true)
    {
          if (Delay &gt; 0.0)
           {
                    Delay = FMax(0.0, Delay - DeltaTime);
                  return;
            }


          Fade = FMin(255, Fade + SpeedFade * DeltaTime);
          if (fade &gt;= 255)
                   {
                   fade = 255;
                    }
     }

}
&lt;/uscript&gt;

I think the problem might lie here.  I placed in some logs within this function just to see if I could get some kind of huge output, but nothing came out.  I'm going to start by looking back through my old backups to the fading icons that worked and see if I can piece through what went wrong.

Leaving for San Fran on Saturday!

On a side note, those of you who know about the [http://www.marzerium.com/MarZer/DWeather/ MarZer's DWeather] project, I have agreed that after I finish up this an get settled in Cali that I'm gooing to get started on helping him to finalize that project.  

----

====1/12/05====

My menu classes are giving me a headache.

For some reason, my fades, which I worked so long on, are not working on my new finalized level, nor are they working when I put the menu classes in.  I'm going to go through the classes and try to find out why, but I think the menuclasses are blocking the PRI from being assigned.  The log I keep getting back says that the PRI is failing to be assigned, ususally being set to none.

Also, the problem I was having before about the interaction and player classes not being valid to eachother has reared it's ugly head again.  I thought I had finally figured out why I got this error, but I'm just not sure anymore.  I'll just have to keep moving things around until I figure it out.

----

====7/23/05====

Back from the dead, eh?

About to get started working with this project again.  I'll keep u posted...

'''MythOpus:''' About the textures mysteriously disapearing, you should always just load the entire texture package on startup :D</text>
    </revision>
    <revision>
      <id>4024</id>
      <timestamp>2008-02-14T22:22:13Z</timestamp>
      <contributor>
        <ip>Fethican</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;

&lt;!&amp;ndash; saved from url=(0014)about:internet &amp;ndash;&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta name=&quot;generator&quot; content=&quot;Web Page Maker V2&quot;&gt;

&lt;/head&gt;

&lt;style type=&quot;text/css&quot;&gt;

/*----------Text Styles----------*/

.ws6 {font-size: 8px;}

.ws7 {font-size: 9.3px;}

.ws8 {font-size: 11px;}

.ws9 {font-size: 12px;}

.ws10 {font-size: 13px;}

.ws11 {font-size: 15px;}

.ws12 {font-size: 16px;}

.ws14 {font-size: 19px;}

.ws16 {font-size: 21px;}

.ws18 {font-size: 24px;}

.ws20 {font-size: 27px;}

.ws22 {font-size: 29px;}

.ws24 {font-size: 32px;}

.ws26 {font-size: 35px;}

.ws28 {font-size: 37px;}

.ws36 {font-size: 48px;}

.ws48 {font-size: 64px;}

.ws72 {font-size: 96px;}

.wpmd {font-size: 13px;font-family: 'Arial';font-style: normal;font-weight: normal;}

/*----------Para Styles----------*/

DIV,UL,OL /* Left */

{
 margin-top: 0px;
 margin-bottom: 0px;

}
&lt;/style&gt;

&lt;body background=&quot;http://img179.imageshack.us/img179/9726/bbbbbbbtm7.jpg&quot;&gt;

&lt;/body&gt;

&lt;/html&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Kungfu Hampster/Subpage</title>
    <id>1619</id>
    <revision>
      <id>4021</id>
      <timestamp>2004-11-01T20:39:05Z</timestamp>
      <contributor>
        <ip>Kungfu Hampster</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries please, but feel free to add comments.''

}}</text>
    </revision>
    <revision>
      <id>4022</id>
      <timestamp>2004-11-01T20:38:00Z</timestamp>
      <contributor>
        <ip>Kungfu Hampster</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">

This will be where I'm putting my journal.  Should be up in the coming week...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:L0cky</title>
    <id>1650</id>
    <revision>
      <id>4084</id>
      <timestamp>2002-12-20T22:04:16Z</timestamp>
      <contributor>
        <ip>Jeeptrash</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''EntropicLqd:''' Hi, and welcome to the Wiki.  Please feel free to add yourself to the [[Legacy:Project Contributors|Project Contributors]] page should you so wish.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

'''Jeeptrash''' Heya fellow new-ish wikiing person!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4085</id>
      <timestamp>2002-12-20T11:14:02Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''EntropicLqd:''' Hi, and welcome to the Wiki.  Please feel free to add yourself to the [[Legacy:Project Contributors|Project Contributors]] page should you so wish.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4086</id>
      <timestamp>2002-12-20T21:37:11Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''EntropicLqd:''' Hi, and welcome to the Wiki.  Please feel free to add yourself to the [[Legacy:Project Contributors|Project Contributors]] page should you so wish.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LINC</title>
    <id>1690</id>
    <revision>
      <id>4177</id>
      <timestamp>2003-02-02T00:18:01Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Hi there! ===

Ah well... let's see what WIKI has to offer...

Hope i won't mess things up... :rolleyes:

==Me ==

Bet you don't even wanna now ;)

===Obligatory Guestbook ===

Feel free to post... or not =D

'''Wormbo:''' Hi and welcome to the Wiki. :) Don't worry about messing things up, they can be repaired quite easily.

'''Piglet:''' Anyway, if youve got this page setup you shouldnt have any problems messing things up :P

'''EntropicLqd:''' Hi, welcome to the Wiki.  Have fun.

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki and if you need mapping tips, ask me, or anyone on the BUF forums! :) :tup:

===EOF ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4178</id>
      <timestamp>2003-02-02T00:12:14Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>welcome</comment>
      <text xml:space="preserve">===Hi there! ===

Ah well... let's see what WIKI has to offer...

Hope i won't mess things up... :rolleyes:

==Me ==

Bet you don't even wanna now ;)

===Obligatory Guestbook ===

Feel free to post... or not =D

'''Wormbo:''' Hi and welcome to the Wiki. :) Don't worry about messing things up, they can be repaired quite easily.

'''Piglet:''' Anyway, if youve got this page setup you shouldnt have any problems messing things up :P

'''EntropicLqd:''' Hi, welcome to the Wiki.  Have fun.

===EOF ===

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LOD Cheat</title>
    <id>1727</id>
    <revision>
      <id>4253</id>
      <timestamp>2004-01-29T04:01:33Z</timestamp>
      <contributor>
        <ip>DeepQantas</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Level of Detail Cheat with [[Legacy:UT2003|UT2003]]'s [[Legacy:SkyBox|SkyBox]]es... Fancy name, eh, but what does it do?

==Example==

Right. So here's what a big city map could look like. (If you forgot to actually add detail)

[[Image:Legacy_lodcheat1.jpeg|]]

Now, let's see what our city would look like... Oh my gosh! Look at that. The n00b has made some completely ridiculous [[Legacy:Zone|zone]]s in there!

[[Image:Legacy_lodcheat2.jpeg|]]

Well, the green zone isn't in fact just any zone. It's the SkyBox. And it surrounds the blue zone because the blue zone has fog in it that cuts off the view at 2000 units.

==Explanation==

That scene you see up there, was build by slapping some random blocks in a fairly large room. Then, I duplicated the whole room and moved the second one 5000 UUs below the original. I then used [[Legacy:Inio|inio]]'s [[Legacy:ScaledSkyZone|ScaledSkyZone]] which I found at [[Legacy:MultiSkyBox|MultiSkyBox]] discussion, so that the Sky would move exactly as the player does, thus creating an illusion that the skyzone is the same playing area that surrounds the player.

In order to properly hide the transition between the two zones, the actual playing zone fades to black at 2000 units. Since the sky zone consists of black textures, none will be any wiser. And just so that the buildings could actually be seen from far away, I added a bit of blue [[Legacy:Fog|fog]] into the sky zone.

==So what's the whole point?==

Now, I'm not sure how much of use this will be, but I think that when used properly, it will save a lot of FPS. You see, the buildings in the sky zone are supposed to be very low detail. They don't need any detail because they're quite far away. But since we basically only see 2000 units far, we can add lots and lots of static meshes into the real world zone... all [[Legacy:Static Mesh|static mesh]]es that are too far away, simply aren't rendered.

===Bit of thoughts===

The buildings in the sky zone are currently normal geometry with a black texture. I'm thinking static meshes would do the trick better. Also, I'm thinking that instead of simple black textures, I should add nice shiny yellow windows on the textures. Since the textures are unlit, the black parts stay black, but the windows would shine nicely even from further away.

Hm. Apart from probably being more efficient buildings in the SkyBox, static meshes would have another strength. If the SkyBox view goes inside one of those buildings, you can see right out of it. If the buildings are geometry, the whole sky view gets borked.

The Sky view lags a bit. If you go near a buildings corner, and move so that you see the corner and the sky at the same time, you can see the corners of the underlying sky building image. Basically this means that you probably should trim your buildings with static meshes so they're a bit fatter than their low detail counterparts.

I stand corrected: Since SkyBoxes can see into other SkyBoxes, real sky with stars and clouds and all beyond the cityscape is possible.

The ScaledSkyZone is not the same one as in the iono's zip file anymore. I actually didn't bother trying to set its location just right, so I changed its code so it'd think its starting location is (0,0,-5120). In fact, it would be better all around if someone just made a new SkyZoneInfo that has an Offset attribute to begin with. I certainly tried, but there must've been something in the properties I missed. It just refused to move.

==Light In The Dark (almost)==

I tried to enhance the visual aspects of the map by adding yellow windows into the SkyBox with an unlit texture. The picture on the left shows how cool it looked.

However, I immediately realized its greatest flaw. The bright windows would pop in and out of sight as they player moved or even turned his view. See that black wall the crosshair is pointing at on the second picture? That wall, too, should have those bright yellow windows.

[[Image:Legacy_lodcheat3.jpeg|]] @inline@lodcheat4

I had initially thought of making static meshes that would show similarly unlit bright windows. However, it hadn't occured to me that the fog would make them completely black, too, dependless of their lighting or brightness. After this disappointment, I tried experimenting a bit.

First, I set the fog to start at the same distance as it ended. Result was the image on the left. The polygons did turn black at the correct distance, but they still obscure the view to the SkyBox. I then tried setting the starting distance to 8000 - way past the ending distance - and lo, the polygons would simply cut off at the ending distance.

[[Image:Legacy_lodcheat5.jpeg|]] @inline@lodcheat6

While interesting, I'm not sure if I can find a practical use for this. The actual playing area and the skybox would have to be visually near identical. Furthermore, we lose that fog effect that softens the transition between the real world and the SkyBox.

Maybe if you have a really vast map, you could make the details disappear at such distance that no one would notice. But that would put us back to square one. Not being able to have lots of detail in the actual playing area.

===Conclusion===

I suppose I'll have to stick to using silhouettes and fog outlining in the SkyBox. I'm out of thoughts when it comes to adding bright spots in there. Suggestions are very welcome.

----

'''DeepQantas:''' Ok, go ahead. Rip it apart. Oh, and if some vet could check the format of Wiki Markup on this page...?

'''Tarquin:'''Interesting stuff. I've just added a few links. It might be an idea to create a page for the [[Legacy:ScaledSkyZone|ScaledSkyZone]] script if inio's ok with that then you could add your version there if you like.

'''Switch:''' The custom SkyZoneInfo actor may refuse to move if it has bStatic=True in default properties. bStatic is not visible in unrealed's default properties dialog - use 'set myclassname bstatic false' command to change it, then recompile and save the package/map (or use something like wotgreal for programming).

'''DeepQantas:''' Added a bit of experimentation notes about those bright windows. Didn't try the custom SkyZone thingie, yet, Switch. Next I think I should actually add those detailed static meshes and see if this thing really helps the performance.</text>
    </revision>
    <revision>
      <id>4254</id>
      <timestamp>2004-01-23T11:07:10Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>use bStatic=false</comment>
      <text xml:space="preserve">Level of Detail Cheat with [[Legacy:UT2003|UT2003]]'s [[Legacy:SkyBox|SkyBox]]es... Fancy name, eh, but what does it do?

==Example==

Right. So here's what a big city map could look like. (If you forgot to actually add detail)

[[Image:Legacy_lodcheat1.jpeg|]]

Now, let's see what our city would look like... Oh my gosh! Look at that. The n00b has made some completely ridiculous [[Legacy:Zone|zone]]s in there!

[[Image:Legacy_lodcheat2.jpeg|]]

Well, the green zone isn't in fact just any zone. It's the SkyBox. And it surrounds the blue zone because the blue zone has fog in it that cuts off the view at 2000 units.

==Explanation==

That scene you see up there, was build by slapping some random blocks in a fairly large room. Then, I duplicated the whole room and moved the second one 5000 UUs below the original. I then used [[Legacy:Inio|inio]]'s [[Legacy:ScaledSkyZone|ScaledSkyZone]] which I found at [[Legacy:MultiSkyBox|MultiSkyBox]] discussion, so that the Sky would move exactly as the player does, thus creating an illusion that the skyzone is the same playing area that surrounds the player.

In order to properly hide the transition between the two zones, the actual playing zone fades to black at 2000 units. Since the sky zone consists of black textures, none will be any wiser. And just so that the buildings could actually be seen from far away, I added a bit of blue [[Legacy:Fog|fog]] into the sky zone.

==So what's the whole point?==

Now, I'm not sure how much of use this will be, but I think that when used properly, it will save a lot of FPS. You see, the buildings in the sky zone are supposed to be very low detail. They don't need any detail because they're quite far away. But since we basically only see 2000 units far, we can add lots and lots of static meshes into the real world zone... all [[Legacy:Static Mesh|static mesh]]es that are too far away, simply aren't rendered.

===Bit of thoughts===

The buildings in the sky zone are currently normal geometry with a black texture. I'm thinking static meshes would do the trick better. Also, I'm thinking that instead of simple black textures, I should add nice shiny yellow windows on the textures. Since the textures are unlit, the black parts stay black, but the windows would shine nicely even from further away.

Hm. Apart from probably being more efficient buildings in the SkyBox, static meshes would have another strength. If the SkyBox view goes inside one of those buildings, you can see right out of it. If the buildings are geometry, the whole sky view gets borked.

The Sky view lags a bit. If you go near a buildings corner, and move so that you see the corner and the sky at the same time, you can see the corners of the underlying sky building image. Basically this means that you probably should trim your buildings with static meshes so they're a bit fatter than their low detail counterparts.

The SkyBox suffers from one severe problem... It moves with the player, so basically it doesn't give you the illusion of sky like normal SkyBoxes do. I'll probably just have to widen the area and add a scrolling clouds overhead, but that feels almost like having no SkyBox at all. Or... since the fog kinda seems a theme here, some sort of gradual color from bottom to top might do the trick.

The ScaledSkyZone is not the same one as in the iono's zip file anymore. I actually didn't bother trying to set its location just right, so I changed its code so it'd think its starting location is (0,0,-5120). In fact, it would be better all around if someone just made a new SkyZoneInfo that has an Offset attribute to begin with. I certainly tried, but there must've been something in the properties I missed. It just refused to move.

----

'''DeepQantas:''' Ok, go ahead. Rip it apart. Oh, and if some vet could check the format of Wiki Markup on this page...?

'''Tarquin:'''Interesting stuff. I've just added a few links. It might be an idea to create a page for the [[Legacy:ScaledSkyZone|ScaledSkyZone]] script if inio's ok with that then you could add your version there if you like.

'''Switch:''' The custom SkyZoneInfo actor may refuse to move if it has bStatic=True in default properties. bStatic is not visible in unrealed's default properties dialog - use 'set myclassname bstatic false' command to change it, then recompile and save the package/map (or use something like wotgreal for programming).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LWO File</title>
    <id>1699</id>
    <revision>
      <id>4197</id>
      <timestamp>2005-01-14T03:29:58Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">This file extension is for models from the [[Legacy:LightWave|LightWave]] 3D package.  LWO [[Legacy:File Format|file format]] can be directly imported into the [[Legacy:Static Mesh Browser|static mesh browser]] to make [[Legacy:Static Mesh|static mesh]]es in the [[Legacy:UT2003|UT2003]] version of [[Legacy:UnrealEd|UnrealEd]].  This feature was added by [http://www.digitalextremes.com Digital Extremes] and is not necessarily available in other Unreal Engine games, even those using the same generation of the engine (e.g., [[Legacy:Unreal 2|Unreal 2]]).  To use Lightwave with such games, you may wish to obtain the [http://members.bellatlantic.net/~mbristol/index.html Unreal export plugins] from Michael Bristol.</text>
    </revision>
    <revision>
      <id>4198</id>
      <timestamp>2005-01-13T23:53:47Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ladder</title>
    <id>1643</id>
    <revision>
      <id>4070</id>
      <timestamp>2007-07-27T13:58:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:SmallNavigationPoint|SmallNavigationPoint]] &gt;&gt; Ladder (Package: Engine)}}

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:SmallNavigationPoint|SmallNavigationPoint]] &gt;&gt; Ladder &gt;&gt; AutoLadder (Package: Engine)}}

[[Image:Legacy_UT2004.S_Ladder.png|right|Ladder icon]]

The Ladder actor is a placeable navigation point marking the bottom and the top of a [[Legacy:LadderVolume|LadderVolume]] so the AI knows how to use the ladder. The AutoLadder is the automatically-placed version for LadderVolumes with ''bAutoPath'' set to ''false''. Usually you can let the editor place AutoLadders. Only if you are not happy with the automatically placed ladder markers you should place the Ladder actors manually.

See [[Legacy:Ladder (UT)|Ladder (UT)]] for the Unreal Tournament class describing a single player ladder.

==Related Topics==
* [[Legacy:Add A Ladder|Add A Ladder]] &amp;ndash; how to add ladders to a map

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ladder (UT)</title>
    <id>1759</id>
    <revision>
      <id>4316</id>
      <timestamp>2007-07-27T13:38:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>renamed page from Ladder</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; Ladder (Package: Botpack)}}

This is the main class for all related Ladder classes. Each ladder class contains information necessary for that particular Ladder in the game.

See [[Legacy:Ladder|Ladder]] for the UT200x ladder navigation point.

==Known subclasses ==
*[[Legacy:LadderAS|LadderAS]]
*[[Legacy:LadderChal|LadderChal]]
*[[Legacy:LadderCTF|LadderCTF]]
*[[Legacy:LadderCTFDemo|LadderCTFDemo]]
*[[Legacy:LadderDM|LadderDM]]
*[[Legacy:LadderDMDemo|LadderDMDemo]]
*[[Legacy:LadderDOM|LadderDOM]]
*[[Legacy:LadderDOMDemo|LadderDOMDemo]]

==Question ==

Is there a way to create your own ladders for UT? I was able to create all the necessary Information Classes (a subclass from this Ladder class being one of em), but I have NO idea how I can start this custom ladder in the game :(

If you know how, please post it here ;)

==Answer ==

I did manage to create my own ladder and run it in the game, but doing so is ''far'' from easy. Aside from creating subclasses of all five main ladders, you must also create a RatedMatchInfo for each game (and RatedTeamInfos for any new teams you wish to use). And that's just the easy part.

UT was never intended for expansion in this way, and the ladders activated by the UWindow menus appear to be set by the UT C++ code. Thus these menus (including the enemy browsers) must all be subclassed, with references to generic ladder variables replaced by hard-coded class references. It's easy for references to slip through the net and revert the whole lot to the standard UT ladder, with hideous results.

Once this is done, you have to get UT's menus to launch new ladders into the right menu system. Where this becomes a pain in the ass is that the &quot;Start Unreal Tournament&quot; and &quot;Resume Saved Tournament&quot; functions are called as gametypes on Entry.unr - whose UnrealScript calls on functions in the UT Console.

Yes, you heard right. To start a new ladder from the menus, I had to extend the UT console and launch the game with a different UnrealTournament.ini file that was set to use my console instead of the normal one (ini files can be switched on the command line). Once this was done, I set the console to use a different root menu system that provided only Game and Options menus (to prevent console conflicts). This Game menu was reduced to provide only the most basic of commands.

Anyway, that's my way of doing it. Once all references to the internal variable &quot;Ladder&quot; were replaced by hard-coded ladder classes (extending LadderInventory was not necessary), I had a fully functional ladder that required just one .u file to work.

It was hard, especially with me not being an experienced UScripter. I don't want to sound too discouraging, but you have to be very comfortable with this kind of thing and you have to be very persistent in order to get a new ladder working. Really, you have to wonder if it's worth all the effort. It was a challenge for me and I persevered. Thankfully I got it working - leaving me ultimately with a ladder in which my housemates got to play custom maps against teams of Cows and Nali!

If you want to know more, drop me a line at hellscrag@hotmail.com - I can send you my ladder if you fancy playing it. However, I urge you to think twice before trying this.

Tojo39:  Any clue if this could be done in UT2003??</text>
    </revision>
    <revision>
      <id>4317</id>
      <timestamp>2004-06-22T08:11:10Z</timestamp>
      <contributor>
        <ip>195.243.94.xxx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; Ladder}}

This is the main class for all related Ladder classes.

Each ladder class contains information necessary for that particular Ladder in the game.

==Known subclasses ==
*[[Legacy:LadderAS|LadderAS]]
*[[Legacy:LadderChal|LadderChal]]
*[[Legacy:LadderCTF|LadderCTF]]
*[[Legacy:LadderCTFDemo|LadderCTFDemo]]
*[[Legacy:LadderDM|LadderDM]]
*[[Legacy:LadderDMDemo|LadderDMDemo]]
*[[Legacy:LadderDOM|LadderDOM]]
*[[Legacy:LadderDOMDemo|LadderDOMDemo]]

==Question ==

Is there a way to create your own ladders for UT? I was able to create all the necessary Information Classes (a subclass from this Ladder class being one of em), but I have NO idea how I can start this custom ladder in the game :(

If you know how, please post it here ;)

==Answer ==

I did manage to create my own ladder and run it in the game, but doing so is ''far'' from easy. Aside from creating subclasses of all five main ladders, you must also create a RatedMatchInfo for each game (and RatedTeamInfos for any new teams you wish to use). And that's just the easy part.

UT was never intended for expansion in this way, and the ladders activated by the UWindow menus appear to be set by the UT C++ code. Thus these menus (including the enemy browsers) must all be subclassed, with references to generic ladder variables replaced by hard-coded class references. It's easy for references to slip through the net and revert the whole lot to the standard UT ladder, with hideous results.

Once this is done, you have to get UT's menus to launch new ladders into the right menu system. Where this becomes a pain in the ass is that the &quot;Start Unreal Tournament&quot; and &quot;Resume Saved Tournament&quot; functions are called as gametypes on Entry.unr - whose UnrealScript calls on functions in the UT Console.

Yes, you heard right. To start a new ladder from the menus, I had to extend the UT console and launch the game with a different UnrealTournament.ini file that was set to use my console instead of the normal one (ini files can be switched on the command line). Once this was done, I set the console to use a different root menu system that provided only Game and Options menus (to prevent console conflicts). This Game menu was reduced to provide only the most basic of commands.

Anyway, that's my way of doing it. Once all references to the internal variable &quot;Ladder&quot; were replaced by hard-coded ladder classes (extending LadderInventory was not necessary), I had a fully functional ladder that required just one .u file to work.

It was hard, especially with me not being an experienced UScripter. I don't want to sound too discouraging, but you have to be very comfortable with this kind of thing and you have to be very persistent in order to get a new ladder working. Really, you have to wonder if it's worth all the effort. It was a challenge for me and I persevered. Thankfully I got it working - leaving me ultimately with a ladder in which my housemates got to play custom maps against teams of Cows and Nali!

If you want to know more, drop me a line at hellscrag@hotmail.com - I can send you my ladder if you fancy playing it. However, I urge you to think twice before trying this.

Tojo39:  Any clue if this could be done in UT2003??</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Ladder1.46</title>
    <id>1695</id>
    <revision>
      <id>4187</id>
      <timestamp>2003-02-18T06:13:31Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

===Classes ===
* [[Legacy:LadderQuery|LadderQuery]] - xWebQueryHandler subclass.  Handles connections to webadmin for the Ladder mod.
* [[Legacy:ProfileConfigSet|ProfileConfigSet]] - based on [[Legacy:GameConfigSet|GameConfigSet]].  Primitive database system.
* [[Legacy:WebConnectionPlus|WebConnectionPlus]] - specialized [[Legacy:WebConnection|WebConnection]] subclass that can keep Query() connection open for a longer period of time
* [[Legacy:LadderGameRules|LadderGameRules]] - [[Legacy:GameRules|GameRules]] subclass that handles all notifications from the [[Legacy:GameInfo|GameInfo]]
* [[Legacy:LadderProfiles|LadderProfiles]] - ServerActor that keeps track of loaded and stored profile information.  Manages multiple [[Legacy:ProfileConfigSet|ProfileConfigSet]] objects.
* [[Legacy:Session|Session]] - Customized implementation of El_Muerte's [[Legacy:Sessions|Sessions tutorial]]
* [[Legacy:SessionMaster|SessionMaster]] - Manager for all [[Legacy:Session|Session]] objects.
* [[Legacy:ProfileImporter|ProfileImporter]] - [[Legacy:TcpLink|TcpLink]] subclass responsible for importing .txt profiles stored on remote webservers.
* [[Legacy:ProfileExporter|ProfileExporter]] - Handles exporting profile information into condensed .txt format for placement on a webserver.
* [[Legacy:LadderPrivs|LadderPrivs]] - Custom privilege set for Ladder

For more information about Ladder, see the Ladder homepage - http://www.organized-evolution.com/Ladder
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderGameRules</title>
    <id>1692</id>
    <revision>
      <id>4181</id>
      <timestamp>2003-03-19T23:29:27Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>Updating to 1.5</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameRules|GameRules]] &gt;&gt; LadderGameRules ([[Legacy:Ladder1.46|Ladder1.46]])}}

&lt;uscript line&gt;
//-----------------------------------------------------------
// Ladder.LadderGameRules
//
// Class responsible for maintenance of all profiles
//
// Handles all interface between game &amp; profiles
// Handles all interaction from webadmin interface &amp; adminmenu interface
//-----------------------------------------------------------

class LadderGameRules extends GameRules
	config;

const LOGNAME	= 'LadderGameRules';

// Handles all ServerActors with PlayInfo
var ConfigMaster				SAManager;

// Server was shut down before game was finished
var config bool					bDirtyStart;

// Profiles
struct Profile
{
	var string 					ProfileName;	// Name of Profile
	var bool 					bActive;		// This profile is currently in use
	var bool					bReload;		// This profile was the last profile to be used
};

// Profile Storage
var protected config array&lt;Profile&gt; 	Profiles;
var protected config int				NumRemainingMatches;

// Profile Usage Variables
var array&lt;ProfileConfigSet&gt; 	LadderProfiles;
var ProfileConfigSet 			CurrentProfile;			// Currently Active Profile
var 		StringArray 		AllLadderProfiles;		// Only used for sorting in switch profiles by name
var 		StringArray			ProfileMaps;			// Holds maplist for switching server to new profile
var 		string 				ProfileMutators;		// Holds mutator string for switch server to new profile
var			array&lt;string&gt;		ProfileActors;
var 		bool				bWaitingToSwitch;		// Waiting for end of match to switch server to new profile
var			int					Index;					// Index of currently active profile

var string 						LadderProfileClass;
var string						DefaultProfileName;
var class&lt;ProfileConfigSet&gt;		ProfileClass;

struct CommandLineParam { var string ParamName; var string Value; };
var array&lt;CommandLineParam&gt; CommandLineOptions;

// Localization
var localized string ShutdownWhileTemporary;
var localized string ShutdownWhilePermanent;
var localized string ShutdownWhileWaiting;
var localized string ShutdownRemainingMatches;
var localized string ShutdownResumingTemporary;
var localized string ShutdownResumingPermanent;
var localized string ShutdownTrackingCorrupted;

var localized string EndOfGame;
var localized string EndofGameIntercepting;
var localized string EndofGameNoRemainingMatches;
var localized string OverridingURL;

// Error Messages
var localized string BadProfileClass;
var localized string CannotRemoveActive;
var localized string PreviousProfileRemoved;

// Warning Messages
var localized string EmptyMaplist;
var localized string InvalidMaplist;
var localized string CancellingProfile;
var localized string BadIndex;

// Turns out there is a bug with the 2166 (and probably earlier) version
// of the MatchEnded state of DeathMatch:
// Once Level.TimeSeconds &gt; EndTime + RestartWait, MatchEnded.Timer() begins
// calling RestartGame().  This results in RestartGame (and thus GameRules.HandleRestartGame())
// getting called multiple times.
var bool						bRestartCalled;

//function bool AddTextParam(string ParamName, optional string DefaultValue, optional bool bAddIfNotExists)
//{
//	local int i;
//	local TextParam TmpT;

//	for (
//}

function bool AddBoolParam(string ParamName, optional bool DefaultValue, optional bool bAddIfNotExists);
function bool AddSelectParam(string ParamName, array&lt;string&gt; VarOptions, optional bool bAddIfNotExists);

event Tick(float DeltaTime)
{
	if (Level != None &amp;&amp; Level.NextURL != &quot;&quot;)
	{
		bDirtyStart = False;
		SaveConfig();
		Disable('Tick');
	}
}

event PreBeginPlay()
{
	ProfileClass = class&lt;ProfileConfigSet&gt;(DynamicLoadObject(LadderProfileClass, class'Class'));
	if (ProfileClass == None)
	{
		log(BadProfileClass@&quot;'&quot;$LadderProfileClass$&quot;'&quot;,LOGNAME);
		Destroy();
		return;
	}

// Initialize String Arrays
	AllLadderProfiles = new(None) class'SortedStringArray';
	ProfileMaps = new(None) class'StringArray';
	InitializeProfileArray();

	Super.PreBeginPlay();
}

event PostBeginPlay()
{
	local int i, j, Matches;

	i = 0 - 1;
	j = 0 - 1;

	if (Level.Game.BaseMutator != None &amp;&amp; ConfigMaster(Level.Game.BaseMutator.NextMutator) != None)
		SAManager = ConfigMaster(Level.Game.BaseMutator.NextMutator);
	Super.PostBeginPlay();

	if (bDirtyStart)
	{
		i = FindPreviousProfile();
		j = FindActiveProfile();
		Matches = NumRemainingMatches;
		if (i &gt;= 0) // Found a previous profile
		{
			if (j &gt;= 0)  // Found an active profile
			{
				if ( Matches &gt; 0 )  // Temporary profile was active
				{
					log(ShutdownWhileTemporary@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;,LOGNAME);
					log(ShutdownRemainingMatches$&quot;:&quot;@NumRemainingMatches$&quot;.&quot;@ShutdownResumingTemporary,LOGNAME);
					ApplyProfile( j, Matches );
				}

				else
				{
					log(ShutdownWhileTemporary@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;,LOGNAME);
					log(ShutdownRemainingMatches$&quot;:&quot;@NumRemainingMatches$&quot;.&quot;@ShutdownResumingPermanent@&quot;'&quot;$Profiles[i].ProfileName$&quot;'.&quot;,LOGNAME);
					ApplyProfile( i, 0);
				}

			}
			else
			{
				log(ShutdownWhileWaiting,LOGNAME);	// Shutdown while waiting to apply temporary profile - cancel
				if ( Matches &gt; 0 )
				{
					ResetTrackingValues();
					ApplyProfile(i,Matches);
				}
				else
				{
					ResetTrackingValues();
					ApplyProfile(i,0);
				}
			}
		}
		else if (j &gt;= 0) // no reload, but found active profile
		{
			log(ShutdownWhilePermanent@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;@ShutdownResumingPermanent@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;,LOGNAME);
			ApplyProfile( j, 0 );
		}

		else if (Matches &gt; 0)	// no reload, no active
		{
			NumRemainingMatches = 0;
			SaveConfig();
		}
	}
	else
	{
		bDirtyStart = True;
		SaveConfig();
	}
}

// Game has ended - even if we want to handle restart, cannot simply
// return True, or GameRulesModifiers later in the list do not recieve
// HandleRestartGame() calls
function bool HandleRestartGame()
{
	local int i;
	local bool bHandleRestart;	// True if we are handling restart

	if (bDirtyStart)
	{
		bDirtyStart = False;
		SaveConfig();
	}

	if (!Level.Game.bChangeLevels || Level.Game.bAlreadyChanged)
		return Super.HandleRestartGame();

	if (bRestartCalled)
		return Super.HandleRestartGame();

	else bRestartCalled = True;

	if ( bWaitingToSwitch )
	{
		i = FindPreviousProfile();
		if (i &gt;= 0)
		{
			log(EndOfGame,LOGNAME);
			log(EndofGameIntercepting@&quot;'&quot;$Profiles[i].ProfileName$&quot;'.&quot;,LOGNAME);
			ApplyProfile(i,NumRemainingMatches);
			bHandleRestart = True;
		}
	}

	else if ( NumRemainingMatches &gt; 0)
	{
		if (NumRemainingMatches == 1)
		{
		// Time to switch server to previous profile
			i = FindPreviousProfile();
			if (i &gt;= 0)
			{
				log(EndOfGame,LOGNAME);
				log(EndOfGameNoRemainingMatches,LOGNAME);
				log(EndOfGameIntercepting@&quot;'&quot;$Profiles[i].ProfileName$&quot;'.&quot;,LOGNAME);
				ApplyProfile(i,0);
				bHandleRestart = true;
			}
			else
			{
				log(EndOfGame,LOGNAME);
				log(PreviousProfileRemoved,LOGNAME);
			}
		}

		if ( !bHandleRestart )
		{
			NumRemainingMatches--;
			SaveConfig();
		}
	}

	// Returns true if either one is true
	return (Super.HandleRestartGame() || bHandleRestart);
}

//#########################################
// Profile Management
//

// Applies selected profile immediately
function ApplyProfile(coerce int NewProfileIndex, int NumberOfMatches)
{
	local int idx,i,j;
	local ProfileConfigSet TempPCS;
	local array&lt;string&gt; TempArr;
	local string GameType,ShortName,FirstMap,Tmp,TmpV;

	idx = ActivateProfile(NewProfileIndex, NumberOfMatches &gt; 0);

	if (idx &lt; 0)
	{
		Warn(CancellingProfile@&quot;'&quot;$Profiles[NewProfileIndex].ProfileName$&quot;'&quot;@&quot;(&quot;$BadIndex$&quot;)&quot;);
		if (ActivateProfile(Index) &lt; 0)
			ResetTrackingValues();

		return;
	}

	TempPCS = LadderProfiles[idx];
	class'Ladder.CommandLineParams'.default.bRejectPlayInfo = True;
	TempPCS.StartEdit();
	GameType = string(TempPCS.GetGameClass());

// Set the maplist
	ProfileMaps.Reset();
	TempArr = TempPCS.GetUsedMaps();
	if (TempArr.Length == 0)
	{
		Warn(CancellingProfile@&quot;'&quot;$Profiles[idx].ProfileName$&quot;'&quot;@&quot;(&quot;$EmptyMaplist$&quot;)&quot;);
		if (Index == idx) DeactivateProfile(Index);

		else if (ActivateProfile(Index, False) &lt; 0)
			ResetTrackingValues();

		TempPCS.EndEdit(False);
		return;
	}

	NumRemainingMatches = NumberOfMatches;
	for (i=0;i&lt;TempArr.Length;i++)
		ProfileMaps.Add(string(i),TempArr[i]);

	FirstMap = ProfileMaps.getTag(0);
	UpdateDefaultMaps(GameType,ProfileMaps);
//log(&quot;TempPCS:&quot;$TempPCS@&quot;ConfigManager:&quot;$SAManager,'ApplyProfile');
// Set the mutators
	ProfileMutators = &quot;&quot;;
	ProfileMutators = UpdateMutatorString(TempPCS);

// Set the server actors
	ProfileActors = TempPCS.GetUsedServerActors();
	TempArr = SAManager.GetAllManagedActors();
	for (i = 0; i &lt; TempArr.Length; i++)
	{
		Tmp = Left(TempArr[i],InStr(TempArr[i],&quot;,&quot;));
		for (j = 0; j &lt; ProfileActors.Length; j++)
		{
			if (Tmp ~= ProfileActors[j])
				break;

		}

		if (j &lt; ProfileActors.Length)
			EnableManagedActor(Tmp);

		else DisableManagedActor(Tmp);
	}

// Set the PlayInfo
	for (i=0;i&lt;TempPCS.Count();i++)
	{
		Tmp = TempPCS.GetProfileParamName(i);
		TmpV = TempPCS.GetProfileParam(i);
		ShortName = GetItemName(Tmp);

	// If this parameter was specified at the URL,
	// make sure to replace it, otherwise the URL value will
	// override the profile value
		if (HasURLOption(ShortName))
		{
			log(OverridingURL@ShortName$&quot;.&quot;,LOGNAME);
			UpdateURL(ShortName, TmpV, false);
		}

		else if (!TempPCS.SetNamedParam(Tmp, TmpV))
		{
			for (j = 0; j &lt; CommandLineOptions.Length; j++)
			{
				if (Tmp ~= CommandLineOptions[j].ParamName &amp;&amp; TmpV != &quot;&quot;)
					UpdateURL(ShortName, TmpV, false);
			}
		}
	}

	TempPCS.SavePI();
	TempPCS.EndEdit(False);
	if (bDirtyStart)
	{
		bDirtyStart = False;
		SaveConfig();
	}

	Level.ServerTravel(FirstMap$&quot;?Game=&quot;$GameType$&quot;?Mutator=&quot;$ProfileMutators, False);
}

// Applies selected profile at the end of the current match
function bool WaitApplyProfile(coerce int NewProfileIndex, int NumberOfMatches)
{
	local int i;
	local int CurrentActive;

	CurrentActive = FindActiveProfile();
// Check to make sure we aren't attempting to switch to the currently active profile
	if ( NewProfileIndex == CurrentActive)
		return false;

// Clean up any other profiles that were supposed to be reloaded
	i = FindPreviousProfile();
	if (i &gt;= 0) Profiles[i].bReload = False;
	if (CurrentActive &gt;= 0) Profiles[CurrentActive].bActive = False;
	Profiles[NewProfileIndex].bReload = True;
	bWaitingToSwitch = True;
	NumRemainingMatches = NumberOfMatches;
	SaveConfig();
	return true;
}

// Add new profile
function ProfileConfigSet AddProfile(string PCSName, optional string GameType)
{
	local Profile TempP;
	local int i, NumProfiles;

	NumProfiles = Profiles.Length;
	for (i = 0; i &lt; NumProfiles; i++)
		if (Profiles[i].ProfileName ~= PCSName)
			return None;

	TempP.ProfileName = PCSName;
	Profiles[Profiles.Length] = TempP;

	LoadProfile(TempP,GameType);
	SaveConfig();

	return LadderProfiles[NumProfiles];
}

// Copy profile - NewProfileName must be unique
function bool CopyProfile(int SourceProfileIndex, string NewProfileName)
{
	local ProfileConfigSet PCS;

	if (SourceProfileIndex &lt; 0 || SourceProfileIndex &gt;= Profiles.Length)
		return false;

	if (LadderProfiles[SourceProfileIndex] == None)
		return false;

	PCS = AddProfile(NewProfileName);
	if (PCS != None)
	{
		LadderProfiles[SourceProfileIndex].StartEdit();
		PCS.StartEdit();
		PCS.ReplaceWith(LadderProfiles[SourceProfileIndex]);
		PCS.EndEdit(True);
		LadderProfiles[SourceProfileIndex].EndEdit(False);
		return true;
	}
	return false;
}

// Remove profile
function bool RemoveProfile(int idx)
{
	local ProfileConfigSet LastPCS;
	local int LastIDX;

	if (idx &lt; 0 || idx &gt;= LadderProfiles.Length)
		return false;

	if (Profiles[idx].bActive)
	{
		log(CannotRemoveActive,LOGNAME);
		return false;
	}

	LastIDX = LadderProfiles.Length - 1;
	LastPCS = LadderProfiles[LastIDX];
	LastPCS.StartEdit();
	if (idx &lt; LastIDX)
	{
		Profiles[idx] = Profiles[LastIDX];

		LadderProfiles[idx].StartEdit();
		LadderProfiles[idx].ReplaceWith(LastPCS);
		LadderProfiles[idx].EndEdit(True);

		AllLadderProfiles.Remove(AllLadderProfiles.FindItemId(string(idx)));
		AllLadderProfiles.Add(string(idx),Profiles[LastIDX].ProfileName);
	}

	LastPCS.Wipe();
	LastPCS.EndEdit(True);
	Profiles.Remove(LastIDX,1);
	LadderProfiles.Remove(LastIDX,1);
	AllLadderProfiles.Remove(AllLadderProfiles.FindItemId(string(LastIDX)));
	SaveConfig();
	return true;
}

// Returns index of currently active profile
function int FindActiveProfile()
{
	local int i;

	if (Index &lt; -1)
	{
		for (i=0;i&lt;Profiles.Length;i++)
			if (Profiles[i].bActive)
				Index = i;

		if (Index &lt; -1) Index++;
	}

	return Index;
}

// Returns index of previously active profile
function int FindPreviousProfile()
{
	local int i;

	for (i=0;i&lt;Profiles.Length;i++)
		if (Profiles[i].bReload)
			return i;

	return -1;
}

//#####################################################
// Profile Interface
//

// Returns an array of map names that in the maplist for this profile
function array&lt;string&gt; GetProfileMaps(optional string CurrentProfileItem)
{
	local int j;
	local ProfileConfigSet PCS;
	local array&lt;string&gt; TempMaps;

	if (CurrentProfileItem != &quot;&quot;)
	{
		j = int(CurrentProfileItem);
		PCS = LadderProfiles[j];
	}

	if (PCS == None &amp;&amp; CurrentProfile!=None)
		PCS = CurrentProfile;

	if (PCS != None)
		TempMaps = PCS.GetUsedMaps();

	return TempMaps;
}

// Returns an array of class names for mutators that this profile will use in the game
function array&lt;string&gt; GetProfileMutators(optional string CurrentProfileItem)
{
	local int j;
	local ProfileConfigSet PCS;
	local array&lt;string&gt; TempString;

	if (CurrentProfileItem != &quot;&quot;)
	{
		j = int(CurrentProfileItem);
		PCS = LadderProfiles[j];
	}

	if (PCS == None &amp;&amp; CurrentProfile != None)
		PCS = CurrentProfile;

	// Query profile for mutators to display
	if (PCS != none)
		TempString = PCS.GetUsedMutators();

	return TempString;
}

function array&lt;string&gt; GetProfileServerActors(optional string CurrentProfileItem)
{
	local int j;
	local ProfileConfigSet PCS;
	local array&lt;string&gt; Temp;

	if (CurrentProfileItem != &quot;&quot;)
	{
		j = int(CurrentProfileItem);
		PCS = LadderProfiles[j];
	}

	if (PCS == None &amp;&amp; CurrentProfile != None)
		PCS = CurrentProfile;

	if (PCS != None)
		Temp = PCS.GetUsedServerActors();

	return Temp;
}

//#####################################################
// Protected helper functions
//

// Clears LadderProfiles array and loads each stored (Profiles array)
// profile to the LadderProfiles array
protected function InitializeProfileArray()
{
	local int i;

	LadderProfiles.Length = 0;

// Load all profiles immediately
	for (i = 0; i &lt; Profiles.Length; i++)
		LoadProfile(Profiles[i]);
}

// Adds a profile to the LadderProfiles array &amp; initializes the profile
protected function LoadProfile(Profile NewProfile, optional string GameType)
{
	local int i;

	i = LadderProfiles.Length;
	LadderProfiles.Length = LadderProfiles.Length + 1;

	LadderProfiles[i] = new(None,&quot;Profile&quot;$string(i)) ProfileClass;

	if (LadderProfiles[i].GetGameClass() != None)
	{
		LadderProfiles[i].StartEdit();
		LadderProfiles[i].Wipe();
		LadderProfiles[i].EndEdit(True);
	}

	if (GameType == &quot;&quot;) LadderProfiles[i].Init(Level);
	else LadderProfiles[i].Init(Level,GameType);

	AllLadderProfiles.Add(string(i), NewProfile.ProfileName);
}

protected function int ActivateProfile(coerce int ProfileId, optional bool bStoreLast)
{
	local int i,j;

	if (ProfileId &lt; 0 || ProfileId &gt;= Profiles.Length)
		return -1;

	i = FindActiveProfile();

	if (i == ProfileId) return ProfileId;
	j = 0 - 1;

	if (i &gt;= 0) j = DeactivateProfile(i);
	if (j &gt;= 0)
	{
		if (bStoreLast) Profiles[j].bReload = True;
		else Profiles[j].bReload = False;
	}

	Profiles[ProfileId].bActive = True;
	Profiles[ProfileId].bReload = False;
	SaveConfig();
	return ProfileId;
}

protected function int DeactivateProfile(coerce int j)
{
	if (j &lt; 0 || j &gt; Profiles.Length)
		return -1;

	Profiles[j].bActive = False;
	Index = default.Index;
	return j;
}

// Copied from UTServerAdmin - Applies the profile's maplist to the server's maplist
function UpdateDefaultMaps(String GameType, StringArray Maps)
{
	local class&lt;GameInfo&gt; GameClass;
	local MapList List;
	local int i;

	if (Maps == None)
	{
		Warn(InvalidMaplist);
		return;
	}
	GameClass = class&lt;GameInfo&gt;(DynamicLoadObject(GameType, class'Class'));
	if (GameClass != None &amp;&amp; GameClass.Default.MapListType != &quot;&quot;)
	{
		List = Level.Game.GetMapList(GameClass.Default.MapListType);
		if (List != None)
		{
			List.Maps.Length = 0;
			for (i=0; i&lt;Maps.Count(); i++)
				List.Maps[i] = Maps.GetTag(i);

			List.MapNum = 0;
			List.SaveConfig();
			List.Destroy();
		}
	}
}

function EnableManagedActor(string ActorName)
{
	local int i;
	local string S;
	local class&lt;AutoLoader&gt; A;
	local array&lt;string&gt; Arr;

	if (SAManager == None) return;

	for (i = 0; i &lt; SAManager.LoaderClasses.Length; i++)
	{
		A = SAManager.LoaderClasses[i].AutoLoaderClass;
		if (A == None) continue;

		Arr = A.static.GetManagedActors();
		while (Arr.Length &gt; 0)
		{
			S = class'wUtils103.wArray'.static.ShiftS(Arr);
			if (ActorName ~= Left(S, InStr(S,&quot;,&quot;)))
			{
				A.static.EnableLoader(ActorName);
				return;
			}
		}
	}
}

function DisableManagedActor(string ActorName)
{
	local int i;
	local string S;
	local class&lt;AutoLoader&gt; A;
	local array&lt;string&gt; Arr;

	if (SAManager == None) return;

	for (i = 0; i &lt; SAManager.LoaderClasses.Length; i++)
	{
		A = SAManager.LoaderClasses[i].AutoLoaderClass;
		if (A == None) continue;

		Arr = A.static.GetManagedActors();
		while (Arr.Length &gt; 0)
		{
			S = class'wUtils103.wArray'.static.ShiftS(Arr);
			if (ActorName ~= Left(S, InStr(S,&quot;,&quot;)))
			{
				A.static.DisableLoader(ActorName);
				return;
			}
		}
	}
}

// Replaces the ?mutator= command line parameter with this profile's configured mutators
function string UpdateMutatorString(ProfileConfigSet PCS)
{
	local array&lt;string&gt; Mutators;
	local string MutatorString;

	if (PCS == None)
		return &quot;&quot;;

	Mutators = PCS.GetUsedMutators();
	MutatorString = class'wUtils103.wArray'.static.Join(Mutators,&quot;,&quot;,True);
	return MutatorString;
}

// Copied from UTServerAdmin and modified
final function bool HasURLOption(string ParamName)
{
	local string Param, Value;
	local int i;

	Param = ParamName;
	while (true)
	{
		i = Instr(Param, &quot;.&quot;);
		if (i &lt; 0)
			break;

		Param = Mid(Param, i+1);
	}

	Value = Level.GetUrlOption(Param);
	return Value != &quot;&quot;;
}

protected function ResetTrackingValues()
{
	local int i;
	for (i=0;i&lt;Profiles.Length;i++)
	{
		Profiles[i].bActive = False;
		Profiles[i].bReload = False;
	}

	NumRemainingMatches = 0;
	SaveConfig();
}

function int GetRemainingMatches()
{
	return NumRemainingMatches;
}

defaultproperties
{
	Index=-2
    LadderProfileClass=&quot;Ladder.ProfileConfigSet&quot;
    ShutdownWhileTemporary=&quot;Server was shutdown with active temporary profile&quot;
    ShutdownWhilePermanent=&quot;Server was shutdown with active profile&quot;
    ShutdownWhileWaiting=&quot;Server was shutdown while waiting to apply a profile. Now applying new profile.&quot;
    ShutdownRemainingMatches=&quot;Number of matches remaining for this profile&quot;
    ShutdownResumingTemporary=&quot;Reactivating temporary profile with remaining number of matches.&quot;
    ShutdownResumingPermanent=&quot;Reactivating standard profile&quot;
    ShutdownTrackingCorrupted=&quot;Profile tracking was corrupted.  Resetting profile tracking values.&quot;
    EndOfGame=&quot;END OF GAME DETECTED.&quot;
    EndofGameIntercepting=&quot;Intercepting map change &amp; activating profile&quot;
    EndofGameNoRemainingMatches=&quot;Profile match limit reached. Reactivating previous profile.&quot;
    OverridingURL=&quot;Overriding command line value for parameter&quot;
    BadProfileClass=&quot;Bad Profile Class&quot;
    CannotRemoveActive=&quot;Removal of active profile not allowed! Please switch server to a different profile, then try again.&quot;
    PreviousProfileRemoved=&quot;Attempted to return server to previous profile, but no previous profile was found.  Leaving server set to current profile.&quot;
    BadIndex=&quot;Invalid profile index&quot;
    CancellingProfile=&quot;Cancelling activation of profile&quot;
    EmptyMaplist=&quot;Profile maplist is empty&quot;
    InvalidMaplist=&quot;Attempting to load profile with invalid maplist!&quot;
	CommandLineOptions(0)=(ParamName=&quot;CommandLineParams.AdminUserName&quot;,Value=&quot;&quot;)
	CommandLineOptions(1)=(ParamName=&quot;CommandLineParams.AdminPassword&quot;,Value=&quot;&quot;)
	CommandLineOptions(2)=(ParamName=&quot;CommandLineParams.GameRules&quot;,Value=&quot;&quot;)
	CommandLineOptions(3)=(ParamName=&quot;CommandLineParams.DemoRec&quot;,Value=&quot;&quot;)
	CommandLineOptions(4)=(ParamName=&quot;CommandLineParams.bAutoNumBots&quot;,Value=&quot;&quot;)
	CommandLineOptions(5)=(ParamName=&quot;CommandLineParams.QuickStart&quot;,Value=&quot;&quot;)
	CommandLineOptions(6)=(ParamName=&quot;CommandLineParams.RedTeamAI&quot;,Value=&quot;UnrealGame.TeamAI&quot;)
	CommandLineOptions(7)=(ParamName=&quot;CommandLineParams.BlueTeamAI&quot;,Value=&quot;UnrealGame.TeamAI&quot;)
	CommandLineOptions(8)=(ParamName=&quot;CommandLineParams.RedTeamSymbol&quot;,Value=&quot;&quot;)
	CommandLineOptions(9)=(ParamName=&quot;CommandLineParams.BlueTeamSymbol&quot;,Value=&quot;&quot;)
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>4182</id>
      <timestamp>2003-02-18T04:03:02Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameRules|GameRules]] &gt;&gt; LadderGameRules ([[Legacy:Ladder1.46|Ladder1.46]])}}

&lt;uscript line&gt;
//-----------------------------------------------------------
// Ladder.LadderGameRules
//
// Class responsible for maintenance of all profiles
//
// Handles all interface between game &amp; profiles
// Handles all interaction from webadmin interface &amp; adminmenu interface
//-----------------------------------------------------------

class LadderGameRules extends GameRules
	config;

const LOGNAME	= 'LadderGameRules';

// Handles all ServerActors with PlayInfo
var ConfigMaster				SAManager;

// Server was shut down before game was finished
var config bool					bDirtyStart;

// Profiles
struct Profile
{
	var string 					ProfileName;	// Name of Profile
	var bool 					bActive;		// This profile is currently in use
	var bool					bReload;		// This profile was the last profile to be used
};

// Profile Storage
var protected config array&lt;Profile&gt; 	Profiles;
var protected config int				NumRemainingMatches;

// Profile Usage Variables
var array&lt;ProfileConfigSet&gt; 	LadderProfiles;
var ProfileConfigSet 			CurrentProfile;			// Currently Active Profile
var 		StringArray 		AllLadderProfiles;		// Only used for sorting in switch profiles by name
var 		StringArray			ProfileMaps;			// Holds maplist for switching server to new profile
var 		string 				ProfileMutators;		// Holds mutator string for switch server to new profile
var			array&lt;string&gt;		ProfileActors;
var 		bool				bWaitingToSwitch;		// Waiting for end of match to switch server to new profile
var			int					Index;					// Index of currently active profile

var string 						LadderProfileClass;
var string						DefaultProfileName;
var class&lt;ProfileConfigSet&gt;		ProfileClass;

// Localization
var localized string ShutdownWhileTemporary;
var localized string ShutdownWhilePermanent;
var localized string ShutdownWhileWaiting;
var localized string ShutdownRemainingMatches;
var localized string ShutdownResumingTemporary;
var localized string ShutdownResumingPermanent;
var localized string ShutdownTrackingCorrupted;

var localized string EndOfGame;
var localized string EndofGameIntercepting;
var localized string EndofGameNoRemainingMatches;
var localized string OverridingURL;

// Error Messages
var localized string BadProfileClass;
var localized string CannotRemoveActive;
var localized string PreviousProfileRemoved;

// Warning Messages
var localized string EmptyMaplist;
var localized string InvalidMaplist;
var localized string CancellingProfile;
var localized string BadIndex;

// Turns out there is a bug with the 2166 (and probably earlier) version
// of the MatchEnded state of DeathMatch:
// Once Level.TimeSeconds &gt; EndTime + RestartWait, MatchEnded.Timer() begins
// calling RestartGame().  This results in RestartGame (and thus GameRules.HandleRestartGame())
// getting called multiple times.
var bool						bRestartCalled;

event Tick(float DeltaTime)
{
	if (Level != None &amp;&amp; Level.NextURL != &quot;&quot;)
	{
		bDirtyStart = False;
		SaveConfig();
		Disable('Tick');
	}
}

event PreBeginPlay()
{
	ProfileClass = class&lt;ProfileConfigSet&gt;(DynamicLoadObject(LadderProfileClass, class'Class'));
	if (ProfileClass == None)
	{
		log(BadProfileClass@&quot;'&quot;$LadderProfileClass$&quot;'&quot;);
		Destroy();
		return;
	}

// Initialize String Arrays
	AllLadderProfiles = new(None) class'SortedStringArray';
	ProfileMaps = new(None) class'StringArray';
	InitializeProfileArray();

	Super.PreBeginPlay();
}

event PostBeginPlay()
{
	local int i, j, Matches;

	i = 0 - 1;
	j = 0 - 1;

	if (Level.Game.BaseMutator != None &amp;&amp; ConfigMaster(Level.Game.BaseMutator.NextMutator) != None)
		SAManager = ConfigMaster(Level.Game.BaseMutator.NextMutator);
	Super.PostBeginPlay();

	if (bDirtyStart)
	{
		i = FindPreviousProfile();
		j = FindActiveProfile();
		Matches = NumRemainingMatches;
		if (i &gt;= 0) // Found a previous profile
		{
			if (j &gt;= 0)  // Found an active profile
			{
				if ( Matches &gt; 0 )  // Temporary profile was active
				{
					log(ShutdownWhileTemporary@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;,LOGNAME);
					log(ShutdownRemainingMatches$&quot;:&quot;@NumRemainingMatches$&quot;.&quot;@ShutdownResumingTemporary,LOGNAME);
					ApplyProfile( j, Matches );
				}

				else
				{
					log(ShutdownWhileTemporary@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;,LOGNAME);
					log(ShutdownRemainingMatches$&quot;:&quot;@NumRemainingMatches$&quot;.&quot;@ShutdownResumingPermanent@&quot;'&quot;$Profiles[i].ProfileName$&quot;'.&quot;,LOGNAME);
					ApplyProfile( i, 0);
				}

			}
			else
			{
				log(ShutdownWhileWaiting,LOGNAME);	// Shutdown while waiting to apply temporary profile - cancel
				if ( Matches &gt; 0 )
				{
					ResetTrackingValues();
					ApplyProfile(i,Matches);
				}
				else
				{
					ResetTrackingValues();
					ApplyProfile(i,0);
				}
			}
		}
		else if (j &gt;= 0) // no reload, but found active profile
		{
			log(ShutdownWhilePermanent@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;@ShutdownResumingPermanent@&quot;'&quot;$Profiles[j].ProfileName$&quot;'.&quot;,LOGNAME);
			ApplyProfile( j, 0 );
		}

		else if (Matches &gt; 0)	// no reload, no active
		{
			NumRemainingMatches = 0;
			SaveConfig();
		}
	}
	else
	{
		bDirtyStart = True;
		SaveConfig();
	}
}

// Game has ended - even if we want to handle restart, cannot simply
// return True, or GameRulesModifiers later in the list do not recieve
// HandleRestartGame() calls
function bool HandleRestartGame()
{
	local int i;
	local bool bHandleRestart;	// True if we are handling restart

	if (bDirtyStart)
	{
		bDirtyStart = False;
		SaveConfig();
	}

	if (!Level.Game.bChangeLevels || Level.Game.bAlreadyChanged)
		return Super.HandleRestartGame();

	if (bRestartCalled)
		return Super.HandleRestartGame();

	else bRestartCalled = True;

	if ( bWaitingToSwitch )
	{
		i = FindPreviousProfile();
		if (i &gt;= 0)
		{
			log(EndOfGame,LOGNAME);
			log(EndofGameIntercepting@&quot;'&quot;$Profiles[i].ProfileName$&quot;'.&quot;,LOGNAME);
			ApplyProfile(i,NumRemainingMatches);
			bHandleRestart = True;
		}
	}

	else if ( NumRemainingMatches &gt; 0)
	{
		if (NumRemainingMatches == 1)
		{
		// Time to switch server to previous profile
			i = FindPreviousProfile();
			if (i &gt;= 0)
			{
				log(EndOfGame,LOGNAME);
				log(EndOfGameNoRemainingMatches,LOGNAME);
				log(EndOfGameIntercepting@&quot;'&quot;$Profiles[i].ProfileName$&quot;'.&quot;,LOGNAME);
				ApplyProfile(i,0);
				bHandleRestart = true;
			}
			else
			{
				log(EndOfGame,LOGNAME);
				log(PreviousProfileRemoved,LOGNAME);
			}
		}

		if ( !bHandleRestart )
		{
			NumRemainingMatches--;
			SaveConfig();
		}
	}

	// Returns true if either one is true
	return (Super.HandleRestartGame() || bHandleRestart);
}

// Applies selected profile immediately
function ApplyProfile(coerce int NewProfileIndex, int NumberOfMatches)
{
	local int idx,i,j;
	local ProfileConfigSet TempPCS;
	local array&lt;string&gt; TempArr;
	local string GameType,ShortName,FirstMap,Tmp,TmpV;

	idx = ActivateProfile(NewProfileIndex, NumberOfMatches &gt; 0);

	if (idx &lt; 0)
	{
		Warn(CancellingProfile@&quot;'&quot;$Profiles[NewProfileIndex].ProfileName$&quot;'&quot;@&quot;(&quot;$BadIndex$&quot;)&quot;);
		if (ActivateProfile(Index) &lt; 0)
			ResetTrackingValues();

		return;
	}

	TempPCS = LadderProfiles[idx];
	TempPCS.StartEdit();
	GameType = string(TempPCS.GetGameClass());

// Set the maplist
	ProfileMaps.Reset();
	TempArr = TempPCS.GetUsedMaps();
	if (TempArr.Length == 0)
	{
		Warn(CancellingProfile@&quot;'&quot;$Profiles[idx].ProfileName$&quot;'&quot;@&quot;(&quot;$EmptyMaplist$&quot;)&quot;);
		if (Index == idx) DeactivateProfile(Index);

		else if (ActivateProfile(Index, False) &lt; 0)
			ResetTrackingValues();

		TempPCS.EndEdit(False);
		return;
	}

	NumRemainingMatches = NumberOfMatches;
	for (i=0;i&lt;TempArr.Length;i++)
		ProfileMaps.Add(string(i),TempArr[i]);

	FirstMap = ProfileMaps.getTag(0);
	UpdateDefaultMaps(GameType,ProfileMaps);
//log(&quot;TempPCS:&quot;$TempPCS@&quot;ConfigManager:&quot;$SAManager,'ApplyProfile');
// Set the mutators
	ProfileMutators = &quot;&quot;;
	ProfileMutators = UpdateMutatorString(TempPCS);

// Set the server actors
	ProfileActors = TempPCS.GetUsedServerActors();
	TempArr = SAManager.GetAllManagedActors();
	for (i = 0; i &lt; TempArr.Length; i++)
	{
		Tmp = Left(TempArr[i],InStr(TempArr[i],&quot;,&quot;));
		for (j = 0; j &lt; ProfileActors.Length; j++)
		{
			if (Tmp ~= ProfileActors[j])
				break;

		}

		if (j &lt; ProfileActors.Length)
			EnableManagedActor(Tmp);

		else DisableManagedActor(Tmp);
	}

// Set the PlayInfo
	for (i=0;i&lt;TempPCS.Count();i++)
	{
		Tmp = TempPCS.GetProfileParamName(i);
		TmpV = TempPCS.GetProfileParam(i);
		ShortName = GetItemName(Tmp);

	// If this parameter was specified at the URL,
	// make sure to replace it, otherwise the URL value will
	// override the profile value
		if (HasURLOption(ShortName))
		{
			log(OverridingURL@ShortName$&quot;.&quot;,'Apply Profile');
			UpdateURL(ShortName, TmpV, false);
		}

		TempPCS.SetNamedParam(Tmp,TmpV);
	}

	TempPCS.SavePI();
	TempPCS.EndEdit(False);
	if (bDirtyStart)
	{
		bDirtyStart = False;
		SaveConfig();
	}

	Level.ServerTravel(FirstMap$&quot;?Game=&quot;$GameType$&quot;?Mutator=&quot;$ProfileMutators, False);
}

// Applies selected profile at the end of the current match
function bool WaitApplyProfile(coerce int NewProfileIndex, int NumberOfMatches)
{
	local int i;
	local int CurrentActive;

	CurrentActive = FindActiveProfile();
// Check to make sure we aren't attempting to switch to the currently active profile
	if ( NewProfileIndex == CurrentActive)
		return false;

// Clean up any other profiles that were supposed to be reloaded
	i = FindPreviousProfile();
	if (i &gt;= 0) Profiles[i].bReload = False;
	if (CurrentActive &gt;= 0) Profiles[CurrentActive].bActive = False;
	Profiles[NewProfileIndex].bReload = True;
	bWaitingToSwitch = True;
	NumRemainingMatches = NumberOfMatches;
	SaveConfig();
	return true;
}

// Add new profile
function ProfileConfigSet AddProfile(string PCSName, optional string GameType)
{
	local Profile TempP;
	local int i, NumProfiles;

	NumProfiles = Profiles.Length;
	for (i = 0; i &lt; NumProfiles; i++)
		if (Profiles[i].ProfileName ~= PCSName)
			return None;

	TempP.ProfileName = PCSName;
	Profiles[Profiles.Length] = TempP;

	LoadProfile(TempP,GameType);
	SaveConfig();

	return LadderProfiles[NumProfiles];
}

// Copy profile - NewProfileName must be unique
function bool CopyProfile(int SourceProfileIndex, string NewProfileName)
{
	local ProfileConfigSet PCS;

	if (SourceProfileIndex &lt; 0 || SourceProfileIndex &gt;= Profiles.Length)
		return false;

	if (LadderProfiles[SourceProfileIndex] == None)
		return false;

	PCS = AddProfile(NewProfileName);
	if (PCS != None)
	{
		LadderProfiles[SourceProfileIndex].StartEdit();
		PCS.StartEdit();
		PCS.ReplaceWith(LadderProfiles[SourceProfileIndex]);
		PCS.EndEdit(True);
		LadderProfiles[SourceProfileIndex].EndEdit(False);
		return true;
	}
	return false;
}

// Remove profile
function bool RemoveProfile(int idx)
{
	local ProfileConfigSet LastPCS;
	local int LastIDX;

	if (idx &lt; 0 || idx &gt;= LadderProfiles.Length)
		return false;

	if (Profiles[idx].bActive)
	{
		log(CannotRemoveActive,LOGNAME);
		return false;
	}

	LastIDX = LadderProfiles.Length - 1;
	LastPCS = LadderProfiles[LastIDX];
	LastPCS.StartEdit();
	if (idx &lt; LastIDX)
	{
		Profiles[idx] = Profiles[LastIDX];

		LadderProfiles[idx].StartEdit();
		LadderProfiles[idx].ReplaceWith(LastPCS);
		LadderProfiles[idx].EndEdit(True);

		AllLadderProfiles.Remove(AllLadderProfiles.FindItemId(string(idx)));
		AllLadderProfiles.Add(string(idx),Profiles[LastIDX].ProfileName);
	}

	LastPCS.Wipe();
	LastPCS.EndEdit(True);
	Profiles.Remove(LastIDX,1);
	LadderProfiles.Remove(LastIDX,1);
	AllLadderProfiles.Remove(AllLadderProfiles.FindItemId(string(LastIDX)));
	SaveConfig();
	return true;
}

// Returns index of currently active profile
function int FindActiveProfile()
{
	local int i;

	if (Index &lt; -1)
	{
		for (i=0;i&lt;Profiles.Length;i++)
			if (Profiles[i].bActive)
				Index = i;

		if (Index &lt; -1) Index++;
	}

	return Index;
}

// Returns index of previously active profile
function int FindPreviousProfile()
{
	local int i;

	for (i=0;i&lt;Profiles.Length;i++)
		if (Profiles[i].bReload)
			return i;

	return -1;
}

//#####################################################
// Protected helper functions
//

// Clears LadderProfiles array and loads each stored (Profiles array)
// profile to the LadderProfiles array
protected function InitializeProfileArray()
{
	local int i;

	LadderProfiles.Length = 0;

// Load all profiles immediately
	for (i = 0; i &lt; Profiles.Length; i++)
		LoadProfile(Profiles[i]);
}

// Adds a profile to the LadderProfiles array &amp; initializes the profile
protected function LoadProfile(Profile NewProfile, optional string GameType)
{
	local int i;

	i = LadderProfiles.Length;
	LadderProfiles.Length = LadderProfiles.Length + 1;

	LadderProfiles[i] = new(None,&quot;Profile&quot;$string(i)) ProfileClass;

	if (LadderProfiles[i].GetGameClass() != None)
	{
		LadderProfiles[i].StartEdit();
		LadderProfiles[i].Wipe();
		LadderProfiles[i].EndEdit(True);
	}

	if (GameType == &quot;&quot;) LadderProfiles[i].Init(Level);
	else LadderProfiles[i].Init(Level,GameType);

	AllLadderProfiles.Add(string(i), NewProfile.ProfileName);
}

protected function int ActivateProfile(coerce int ProfileId, optional bool bStoreLast)
{
	local int i,j;

	if (ProfileId &lt; 0 || ProfileId &gt;= Profiles.Length)
		return -1;

	i = FindActiveProfile();

	if (i == ProfileId) return ProfileId;
	j = 0 - 1;

	if (i &gt;= 0) j = DeactivateProfile(i);
	if (j &gt;= 0)
	{
		if (bStoreLast) Profiles[j].bReload = True;
		else Profiles[j].bReload = False;
	}

	Profiles[ProfileId].bActive = True;
	Profiles[ProfileId].bReload = False;
	SaveConfig();
	return ProfileId;
}

protected function int DeactivateProfile(coerce int j)
{
	if (j &lt; 0 || j &gt; Profiles.Length)
		return -1;

	Profiles[j].bActive = False;
	Index = default.Index;
	return j;
}

// Copied from UTServerAdmin - Applies the profile's maplist to the server's maplist
function UpdateDefaultMaps(String GameType, StringArray Maps)
{
	local class&lt;GameInfo&gt; GameClass;
	local MapList List;
	local int i;

	if (Maps == None)
	{
		Warn(InvalidMaplist);
		return;
	}
	GameClass = class&lt;GameInfo&gt;(DynamicLoadObject(GameType, class'Class'));
	if (GameClass != None &amp;&amp; GameClass.Default.MapListType != &quot;&quot;)
	{
		List = Level.Game.GetMapList(GameClass.Default.MapListType);
		if (List != None)
		{
			List.Maps.Length = 0;
			for (i=0; i&lt;Maps.Count(); i++)
				List.Maps[i] = Maps.GetTag(i);

			List.MapNum = 0;
			List.SaveConfig();
			List.Destroy();
		}
	}
}

function EnableManagedActor(string ActorName)
{
	local int i;
	local string S;
	local class&lt;AutoLoader&gt; A;
	local array&lt;string&gt; Arr;

	if (SAManager == None) return;

	for (i = 0; i &lt; SAManager.LoaderClasses.Length; i++)
	{
		A = SAManager.LoaderClasses[i].AutoLoaderClass;
		if (A == None) continue;

		Arr = A.static.GetManagedActors();
		while (Arr.Length &gt; 0)
		{
			S = class'wUtils103.wArray'.static.ShiftS(Arr);
			if (ActorName ~= Left(S, InStr(S,&quot;,&quot;)))
			{
				A.static.EnableLoader(ActorName);
				return;
			}
		}
	}
}

function DisableManagedActor(string ActorName)
{
	local int i;
	local string S;
	local class&lt;AutoLoader&gt; A;
	local array&lt;string&gt; Arr;

	if (SAManager == None) return;

	for (i = 0; i &lt; SAManager.LoaderClasses.Length; i++)
	{
		A = SAManager.LoaderClasses[i].AutoLoaderClass;
		if (A == None) continue;

		Arr = A.static.GetManagedActors();
		while (Arr.Length &gt; 0)
		{
			S = class'wUtils103.wArray'.static.ShiftS(Arr);
			if (ActorName ~= Left(S, InStr(S,&quot;,&quot;)))
			{
				A.static.DisableLoader(ActorName);
				return;
			}
		}
	}
}

// Replaces the ?mutator= command line parameter with this profile's configured mutators
function string UpdateMutatorString(ProfileConfigSet PCS)
{
	local array&lt;string&gt; Mutators;
	local string MutatorString;

	if (PCS == None)
		return &quot;&quot;;

	Mutators = PCS.GetUsedMutators();
	MutatorString = class'wUtils103.wArray'.static.Join(Mutators,&quot;,&quot;,True);
	return MutatorString;
}

// Copied from UTServerAdmin and modified
final function bool HasURLOption(string ParamName)
{
	local string Param, Value;
	local int i;

	Param = ParamName;
	while (true)
	{
		i = Instr(Param, &quot;.&quot;);
		if (i &lt; 0)
			break;

		Param = Mid(Param, i+1);
	}

	Value = Level.GetUrlOption(Param);
	return Value != &quot;&quot;;
}

protected function ResetTrackingValues()
{
	local int i;
	for (i=0;i&lt;Profiles.Length;i++)
	{
		Profiles[i].bActive = False;
		Profiles[i].bReload = False;
	}

	NumRemainingMatches = 0;
	SaveConfig();
}

function int GetRemainingMatches()
{
	return NumRemainingMatches;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderInfo</title>
    <id>28555</id>
    <revision>
      <id>40256</id>
      <timestamp>2009-11-17T11:08:55Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderInventory</title>
    <id>1726</id>
    <revision>
      <id>4251</id>
      <timestamp>2005-12-01T02:30:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; LadderInventory}}

&lt;uscript&gt;
class LadderInventory extends Inventory;

// Game
var travel int			Slot;					// Savegame slot.

// Ladder
var travel int			TournamentDifficulty;
var travel int			PendingChange;			// Pending Change 
												// 0 = None  1 = DM
												// 2 = CTF   3 = DOM
												// 4 = AS
var travel int			PendingRank;
var travel int			PendingPosition;
var travel int			LastMatchType;
var travel Class&lt;Ladder&gt; CurrentLadder;

// Deathmatch
var travel int			DMRank;						// Rank in the ladder.
var travel int			DMPosition;					// Position in the ladder.

// Capture the Flag
var travel int			CTFRank;
var travel int			CTFPosition;

// Domination
var travel int			DOMRank;
var travel int			DOMPosition;

// Assault
var travel int			ASRank;
var travel int			ASPosition;

// Challenge
var travel int			ChalRank;
var travel int			ChalPosition;

// TeamInfo
var travel class&lt;RatedTeamInfo&gt; Team;

var travel int			Face;
var travel string		Sex;

var travel string		SkillText;
		
function Reset()
{
	TournamentDifficulty = 0;
	PendingChange = 0;
	PendingRank = 0;
	PendingPosition = 0;
	LastMatchType = 0;
	CurrentLadder = None;
	DMRank = 0;
	DMPosition = 0;
	CTFRank = 0;
	CTFPosition = 0;
	DOMRank = 0;
	DOMPosition = 0;
	ASRank = 0;
	ASPosition = 0;
	ChalRank = 0;
	ChalPosition = 0;
	Face = 0;
	Sex = &quot;&quot;;
}

function TravelPostAccept()
{
	if (DeathMatchPlus(Level.Game) != None)
	{
		Log(&quot;LadderInventory: Calling InitRatedGame&quot;);
		DeathMatchPlus(Level.Game).InitRatedGame(Self, PlayerPawn(Owner));
	}
}

function GiveTo( Pawn Other )
{
	Log(Self$&quot; giveto &quot;$Other);
	Super.GiveTo( Other );
}

function Destroyed()
{
	Log(&quot;Something destroyed a LadderInventory!&quot;);
	Super.Destroyed();
}

defaultproperties
{
    TournamentDifficulty=1
    bHidden=True
}
&lt;/uscript&gt;

----

[[:Category:Legacy Class (UT)]]

[[:Category:Legacy To Do]] &amp;ndash; Wikify and markup
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4252</id>
      <timestamp>2003-12-04T22:09:53Z</timestamp>
      <contributor>
        <ip>Csimbi</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; LadderInventory}}

&lt;uscript&gt;
class LadderInventory extends Inventory;

// Game
var travel int			Slot;					// Savegame slot.

// Ladder
var travel int			TournamentDifficulty;
var travel int			PendingChange;			// Pending Change 
												// 0 = None  1 = DM
												// 2 = CTF   3 = DOM
												// 4 = AS
var travel int			PendingRank;
var travel int			PendingPosition;
var travel int			LastMatchType;
var travel Class&lt;Ladder&gt; CurrentLadder;

// Deathmatch
var travel int			DMRank;						// Rank in the ladder.
var travel int			DMPosition;					// Position in the ladder.

// Capture the Flag
var travel int			CTFRank;
var travel int			CTFPosition;

// Domination
var travel int			DOMRank;
var travel int			DOMPosition;

// Assault
var travel int			ASRank;
var travel int			ASPosition;

// Challenge
var travel int			ChalRank;
var travel int			ChalPosition;

// TeamInfo
var travel class&lt;RatedTeamInfo&gt; Team;

var travel int			Face;
var travel string		Sex;

var travel string		SkillText;
		
function Reset()
{
	TournamentDifficulty = 0;
	PendingChange = 0;
	PendingRank = 0;
	PendingPosition = 0;
	LastMatchType = 0;
	CurrentLadder = None;
	DMRank = 0;
	DMPosition = 0;
	CTFRank = 0;
	CTFPosition = 0;
	DOMRank = 0;
	DOMPosition = 0;
	ASRank = 0;
	ASPosition = 0;
	ChalRank = 0;
	ChalPosition = 0;
	Face = 0;
	Sex = &quot;&quot;;
}

function TravelPostAccept()
{
	if (DeathMatchPlus(Level.Game) != None)
	{
		Log(&quot;LadderInventory: Calling InitRatedGame&quot;);
		DeathMatchPlus(Level.Game).InitRatedGame(Self, PlayerPawn(Owner));
	}
}

function GiveTo( Pawn Other )
{
	Log(Self$&quot; giveto &quot;$Other);
	Super.GiveTo( Other );
}

function Destroyed()
{
	Log(&quot;Something destroyed a LadderInventory!&quot;);
	Super.Destroyed();
}

defaultproperties
{
    TournamentDifficulty=1
    bHidden=True
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderPrivs</title>
    <id>1693</id>
    <revision>
      <id>4183</id>
      <timestamp>2005-12-03T02:54:40Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:XPrivilegeBase|xPrivilegeBase]] &gt;&gt; LadderPrivs ([[Legacy:Ladder1.46|Ladder1.46]])}}

&lt;uscript line&gt;
//-----------------------------------------------------------
// Ladder.LadderPrivs
// Loads custom privilege data into server
//-----------------------------------------------------------
class LadderPrivs extends xPrivilegeBase;

/*

Lv - View currently loaded ladder
Ls - Switch and apply ladder profile
Le - Edit settings for profile (maps, mutators)
Lm - Manage ladder profiles - add, delete, change game rules

*/

defaultproperties
{
     LoadMsg=&quot;Ladder Privileges Loaded&quot;
     MainPrivs=&quot;L&quot;
     SubPrivs=&quot;Lv|Ls|Le|Lm&quot;
     Tags(0)=&quot;Ladder&quot;
     Tags(1)=&quot;View Profile&quot;
     Tags(2)=&quot;Switch Profile&quot;
     Tags(3)=&quot;Edit Profile&quot;
     Tags(4)=&quot;Manage Profile&quot;
}
&lt;/uscript&gt;

----

[[:Category:Legacy To Do]] &amp;ndash; Is this is custom class?  Add appropriate Category Class tag.  Fill in a description.  Give this page some meaning.  Link to and from appropriate pages.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4184</id>
      <timestamp>2003-02-18T04:03:41Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:XPrivilegeBase|xPrivilegeBase]] &gt;&gt; LadderPrivs ([[Legacy:Ladder1.46|Ladder1.46]])}}

&lt;uscript line&gt;
//-----------------------------------------------------------
// Ladder.LadderPrivs
// Loads custom privilege data into server
//-----------------------------------------------------------
class LadderPrivs extends xPrivilegeBase;

/*

Lv - View currently loaded ladder
Ls - Switch and apply ladder profile
Le - Edit settings for profile (maps, mutators)
Lm - Manage ladder profiles - add, delete, change game rules

*/

defaultproperties
{
     LoadMsg=&quot;Ladder Privileges Loaded&quot;
     MainPrivs=&quot;L&quot;
     SubPrivs=&quot;Lv|Ls|Le|Lm&quot;
     Tags(0)=&quot;Ladder&quot;
     Tags(1)=&quot;View Profile&quot;
     Tags(2)=&quot;Switch Profile&quot;
     Tags(3)=&quot;Edit Profile&quot;
     Tags(4)=&quot;Manage Profile&quot;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderProfiles</title>
    <id>1694</id>
    <revision>
      <id>4185</id>
      <timestamp>2003-03-19T23:30:27Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>Updating to 1.5</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LadderProfiles ( [[Legacy:Ladder1.46|Ladder1.46]] )}}

&lt;uscript line&gt;
//-----------------------------------------------------------
// Ladder.LadderProfiles
//
// Serveractor responsible for placing LadderGameRules into the
// GameRulesModifier linked list
//
// Also serves to clearly give admins indication of what version
// of Ladder is installed on the server
//-----------------------------------------------------------
class LadderProfiles extends Info config;

var const float VER;
const LOGNAME = 'LadderProfiles';

var localized string LPPropsDisplayText;
var localized string DisabledText;

var string 	LogLine[6];
var int 	LogWidth;

var bool				bEnableProfileControl;
var config string		DefaultProfileName;
var config string		LadderProfileClass;

function PreBeginPlay()
{
	local GameRules GR;
	local MutLadderMenu LadderMenu;
	local string StatusText;
	local class&lt;AutoLoader&gt;	LoaderClass;
	local int i;

	LoaderClass = class&lt;AutoLoader&gt;(DynamicLoadObject(&quot;LadderLoader.LadderLoader&quot;,class'Class',True));
	if (LoaderClass != None &amp;&amp; !LoaderClass.static.MatchesVersion(VER,True,&quot;http://www.organized-evolution.com/Ladder/&quot;))
	{
		Destroy();
		return;
	}

	bEnableProfileControl = default.bEnableProfileControl;

	class'LadderGameRules'.default.DefaultProfileName = DefaultProfileName;
	if (!bEnableProfileControl)
	{
		for (i = 0; i &lt; class'LadderGameRules'.default.Profiles.Length; i++)
			if (class'LadderGameRules'.default.Profiles[i].bActive)
				class'LadderGameRules'.default.Profiles[i].bActive = False;

		class'LadderGameRules'.static.StaticSaveConfig();
		StatusText = DisabledText;
	}

	else
	{
		for (GR=Level.Game.GameRulesModifiers;GR!=None;GR=GR.NextGameRules)
		{
			if (LadderGameRules(GR) != None)
			{
				LadderGameRules(GR).SetOwner(Self);
				LadderGameRules(GR).LadderProfileClass = LadderProfileClass;
				LadderGameRules(GR).DefaultProfileName = DefaultProfileName;
				break;
			}
		}

		if (GR == None)
		{
			GR = Spawn(class'LadderGameRules',Self);
			if (Level.Game.GameRulesModifiers != None)
				Level.Game.GameRulesModifiers.AddGameRules(GR);
			else Level.Game.GameRulesModifiers = GR;
		}

		LadderMenu = Spawn(class'Ladder.MutLadderMenu', Self);
		if (LadderMenu != None)
			Level.Game.BaseMutator.AddMutator(LadderMenu);
		else log(&quot;Error spawning MutLadderMenu!&quot;,LOGNAME);
	}

	LogLine[1] = &quot;Ladder v&quot;$VER@StatusText;
	LogLine[2] = &quot;Server Profile Management System&quot;;
	LogLine[3] = &quot;by Organized Evolution&quot;;
	LogLine[4] = &quot;http://www.organized-evolution.com/Ladder/&quot;;

	BannerLog();
}

function BannerLog()
{
	local int 		i;
	local string 	TestString, BorderString;
	local string	Prefix, Suffix;

	for (i = 0; i &lt; ArrayCount(LogLine); i++)
		if ( Len(LogLine[i]) &gt; LogWidth )
			LogWidth = Len(LogLine[i]);

	LogWidth = LogWidth + 6;  // Account for the [] on each side
	for (BorderString = &quot;&quot;; Len(BorderString) &lt; LogWidth; BorderString = BorderString $ &quot;~&quot;);
	log(&quot;&quot;,LOGNAME);
	log(BorderString,LOGNAME);

	for (i = 0; i &lt; ArrayCount(LogLine); i++)
	{
		Prefix = &quot;[] &quot;; Suffix = &quot; []&quot;;
		TestString = Prefix $ LogLine[i] $ Suffix;

		while ( Len(TestString) &lt; LogWidth)
		{
			Prefix = Prefix $ &quot; &quot;;
			if (LogWidth - Len(TestString) &gt; 1)
				Suffix = &quot; &quot; $ Suffix;

			TestString = Prefix $ LogLine[i] $ Suffix;
		}

		log(TestString,LOGNAME);
	}

	log(BorderString,LOGNAME);
	log(&quot;&quot;,LOGNAME);
}

static function FillPlayInfo(PlayInfo PI)
{
	Super.FillPlayInfo(PI);

	PI.AddSetting(&quot;Server&quot;, &quot;DefaultProfileName&quot;, default.LPPropsDisplayText, 1, 10, &quot;Text&quot;, &quot;32&quot;);
}


defaultproperties
{
	VER=1.5
	LadderProfileClass=&quot;Ladder.ProfileConfigSet&quot;
	DisabledText=&quot;( Disabled )&quot;
	LPPropsDisplayText=&quot;Default Profile Name&quot;
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>4186</id>
      <timestamp>2003-02-18T04:04:08Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LadderProfiles ( [[Legacy:Ladder1.46|Ladder1.46]] )}}

&lt;uscript line&gt;
//-----------------------------------------------------------
// Ladder.LadderProfiles
//
// Serveractor responsible for placing LadderGameRules into the
// GameRulesModifier linked list
//
// Also serves to clearly give admins indication of what version
// of Ladder is installed on the server
//-----------------------------------------------------------
class LadderProfiles extends Info config;

var const float VER;
const LOGNAME = 'LadderProfiles';

var localized string LPPropsDisplayText;
var localized string DisabledText;

var string 	LogLine[6];
var int 	LogWidth;

var bool				bEnableProfileControl;
var config string		DefaultProfileName;
var config string		LadderProfileClass;

function PreBeginPlay()
{
	local GameRules GR;
	local string StatusText;
	local class&lt;AutoLoader&gt;	LoaderClass;
	local int i;

	LoaderClass = class&lt;AutoLoader&gt;(DynamicLoadObject(&quot;LadderLoader.LadderLoader&quot;,class'Class',True));
	if (LoaderClass != None &amp;&amp; !LoaderClass.static.MatchesVersion(VER,True,&quot;http://www.organized-evolution.com/Ladder/&quot;))
	{
		Destroy();
		return;
	}

	bEnableProfileControl = default.bEnableProfileControl;

	class'LadderGameRules'.default.DefaultProfileName = DefaultProfileName;
	if (!bEnableProfileControl)
	{
		for (i = 0; i &lt; class'LadderGameRules'.default.Profiles.Length; i++)
			if (class'LadderGameRules'.default.Profiles[i].bActive)
				class'LadderGameRules'.default.Profiles[i].bActive = False;

		class'LadderGameRules'.static.StaticSaveConfig();
		StatusText = DisabledText;
	}

	else
	{
		for (GR=Level.Game.GameRulesModifiers;GR!=None;GR=GR.NextGameRules)
		{
			if (LadderGameRules(GR) != None)
			{
				LadderGameRules(GR).SetOwner(Self);
				LadderGameRules(GR).LadderProfileClass = LadderProfileClass;
				LadderGameRules(GR).DefaultProfileName = DefaultProfileName;
				break;
			}
		}

		if (GR == None)
		{
			GR = Spawn(class'LadderGameRules',Self);
			if (Level.Game.GameRulesModifiers != None)
				Level.Game.GameRulesModifiers.AddGameRules(GR);
			else Level.Game.GameRulesModifiers = GR;
		}
	}

	LogLine[1] = &quot;Ladder v&quot;$VER@StatusText;
	LogLine[2] = &quot;Server Profile Management System&quot;;
	LogLine[3] = &quot;by Organized Evolution&quot;;
	LogLine[4] = &quot;http://www.organized-evolution.com/Ladder/&quot;;

	BannerLog();
}

function BannerLog()
{
	local int 		i;
	local string 	TestString, BorderString;
	local string	Prefix, Suffix;

	for (i = 0; i &lt; ArrayCount(LogLine); i++)
		if ( Len(LogLine[i]) &gt; LogWidth )
			LogWidth = Len(LogLine[i]);

	LogWidth = LogWidth + 6;  // Account for the [] on each side
	for (BorderString = &quot;&quot;; Len(BorderString) &lt; LogWidth; BorderString = BorderString $ &quot;~&quot;);
	log(&quot;&quot;,LOGNAME);
	log(BorderString,LOGNAME);

	for (i = 0; i &lt; ArrayCount(LogLine); i++)
	{
		Prefix = &quot;[] &quot;; Suffix = &quot; []&quot;;
		TestString = Prefix $ LogLine[i] $ Suffix;

		while ( Len(TestString) &lt; LogWidth)
		{
			Prefix = Prefix $ &quot; &quot;;
			if (LogWidth - Len(TestString) &gt; 1)
				Suffix = &quot; &quot; $ Suffix;

			TestString = Prefix $ LogLine[i] $ Suffix;
		}

		log(TestString,LOGNAME);
	}

	log(BorderString,LOGNAME);
	log(&quot;&quot;,LOGNAME);
}

static function FillPlayInfo(PlayInfo PI)
{
	Super.FillPlayInfo(PI);

	PI.AddSetting(&quot;Server&quot;, &quot;DefaultProfileName&quot;, default.LPPropsDisplayText, 1, 10, &quot;Text&quot;, &quot;32&quot;);
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderQuery</title>
    <id>1691</id>
    <revision>
      <id>4179</id>
      <timestamp>2003-03-19T23:31:22Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <comment>Updating for 1.5</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:XAdminBase|XAdminBase]] &gt;&gt; [[Legacy:XWebQueryHandler|xWebQueryHandler]] &gt;&gt; LadderQuery ([[Legacy:Ladder1.46|Ladder1.46]])}}

&lt;uscript line&gt;
//-----------------------------------------------------------
//  Ladder.LadderQuery
//  QueryHandler for webadmin interface
//-----------------------------------------------------------
class LadderQuery extends xWebQueryHandler
	DependsOn(ProfileConfigSet)
	config(System);

const LOGNAME		= 'LadderQuery';
const EPICNUMBER    = 85;

var LadderGameRules LadderRules;

// Profile Tracking Variables
var SessionMaster 			SMaster;
var ConfigMaster			ConfigM;
var string 					EpicPackages[EPICNUMBER];

// Active Profile Variables
var StringArray 		ProfileMaps;
var ProfileExporter		ExportMaster;
var ProfileConfigSet 	CurrentProfile;
var StringArray 		ProfileMutators;

var string				DefaultProfileName;

// Physical page that will be served
var config string		MasterPage;	// This is main html page for Ladder
var config string		SubFrame;	// Manage sub-frame
var config string		SubFrameMenu;	// Sub-menu (GameType, Mutators, Maps, PlayInfo, Review)
var config string		SubFrameContent;


// Include Files
var config string		IncludeTable;
var config string		IncludeSection;
var config string		IncludeRows;
var config string		IncludeCaptionButton;
var config string		IncludeMapSelect;
var config string		IncludeProfileName;
var config string		IncludeGameType;
var config string		IncludeCheckBox;
var config string		IncludeSwitch;

// Virtual paths that will be requested from clients
var config string 		ProfileViewURI;
var config string 		ProfileEditURI;
var config string 		ProfileMenuURI;
var config string 		ProfileSwitchURI;
var config string		ProfileManageURI;

var config string		SubFrameURI;	// accessed through manage link - linked to SubFrame page
var config string		SubFrameMenuURI;
var config string 		SubMapsURI;
var config string 		SubSavedURI;
var config string 		SubRulesURI;
var config string 		SubReviewURI;
var config string 		SubGametypeURI;
var config string 		SubMutatorsURI;
var config string		SubImportURI;
var config string		SubExportURI;

// Localized Page Help texts
var localized string 	HelpViewProfile;
var localized string 	HelpEditProfile;
var localized string 	HelpSwitchProfile;
var localized string 	HelpManageProfile;
var localized string 	HelpImportProfile;
var localized string 	HelpExportProfile;
// Subpage help text
var localized string	HelpGameType;
var localized string	HelpMutators;
var localized string	HelpMaps;
var localized string	HelpPlayInfo;
var localized string	HelpReview;

// Localized Menu Link Text
var localized string 	LinkEditProfile;
var localized string 	LinkViewProfile;
var localized string 	LinkSwitchProfile;
var localized string 	LinkManageProfile;
var localized string 	LinkImportProfile;
var localized string 	LinkExportProfile;

// for AddProfilePage/ManageProfilePage
var localized string 	TableTitle[9];
var localized string 	PageCaption[9];
var localized string 	ProfileButtonName[9];
var localized string 	ProfileButtonValue[9];

// Section Headers &amp; Text
var localized string	MapText;
var localized string	ErrorText;
var localized string	MutatorText;
var localized string 	RequiredText;
var localized string	AvailableText;
var localized string	UnlimitedText;
var localized string	FollowingMaps;
var localized string	AreAssignedText;
var localized string	AreAvailableText;
var localized string	FollowingMutators;
var localized string	CommandLineOptionsTitle;

// Button Values
var localized string 	ButtonLoadProfile;			// Label for &quot;switch immediately&quot; button
var localized string	ButtonDeleteProfile;
var localized string	ButtonPreviewProfile;		// Label for previewing remote profile button
var localized string	ButtonApplyImportProfile;
var localized string	ButtonApplyExportProfile;
var localized string	ButtonApplyProfileChanges;

// Input form labels
var localized string	LabelCopyProfile;
var localized string	LabelDeleteProfile;
var localized string	LabelImportProfile;
var localized string	LabelExportProfile;
var localized string	LabelAddProfile;
var localized string	LabelSelectActions;
var localized string	LabelTextboxActions;

var localized string	LabelPlayInfo;
var localized string	LabelGeneralProfile;
var localized string	LabelGameType;
var localized string	LabelProfileName;
var localized string	LabelAccessControl;
var localized string	LabelChooseAction;
var localized string	LabelManagement;
var localized string	LabelInputDescription;

var localized string 	LabelMaxMaps;
var localized string 	LabelNumberGames;
var localized string	LabelCheckAllMap;
var localized string	LabelRequiredMaps;
var localized string	LabelUncheckAllMap;
var localized string 	LabelChangeMaplist;
var localized string	LabelCheckAllMutator;
var localized string	LabelRequiredMutators;
var localized string	LabelNumberMatchesLeft;
var localized string	LabelUncheckAllMutator;
var localized string	LabelDelayProfileChange;
var localized string	LabelApplyImportProfile;
var localized string	LabelApplyExportProfile;
var localized string	LabelModifyProfile;

// Success Messages
var localized string	SuccessText;
var localized string	SuccessDeleteProfile;
var localized string	SuccessExportProfile;
var localized string	SuccessImportProfile;
var localized string	SuccessImportProfileTitle;
var localized string	SuccessCopyProfile;
var localized string	SuccessSwitchProfile;

// Profile Errors
var localized string	ErrorLoadingPlayInfoText[5];
var localized string	ErrorGameRulesNotFound;
var localized string	ErrorGameClassText;
var localized string	ErrorGameClassTitle;
var localized string	ErrorAccessControlText;
var localized string	ErrorAccessControlTitle;
var localized string 	ErrorSameProfileName;
var localized string	ErrorRemoteMutator;
var localized string	ErrorRemoteServerActor;
var localized string	ErrorSavingProfile;
var localized string	ErrorDeletingProfile;
var localized string	ErrorExportingProfile;
var localized string	ErrorNoProfilesExist;
var localized string	ErrorCopyFrom;
var localized string	ErrorCopyNoName;
var localized string	ErrorExcludeMapNotFound;
var localized string	ErrorIncludeMapNotFound;
var localized string	ErrorReplacingWebConnection;
var localized string	ImportClassSpawnError;
var localized string	ImportProfileFailText;
var localized string	ImportProfileFailTitle;

// Import errors
var localized string	ErrorBind;
var localized string	ErrorBadURL;
var localized string	ErrorServer;
var localized string	ErrorResolve;
var localized string	ErrorProfile;
var localized string	ErrorTimeout;
var localized string	ErrorNotFound;
var localized string	ErrorForbidden;
var localized string	ErrorBadRequest;
var localized string	ErrorUnauthorized;

function bool Init()
{
	local GameRules GR;

	for (GR=Level.Game.GameRulesModifiers;GR!=None;GR=GR.NextGameRules)
		if (LadderGameRules(GR) != None)
			LadderRules = LadderGameRules(GR);

	if (LadderRules == None)
	{
		Cleanup();
		return false;
	}

	if (ConfigM == None &amp;&amp; ConfigMaster(Level.Game.BaseMutator.NextMutator) != None)
		ConfigM = ConfigMaster(Level.Game.BaseMutator.NextMutator);

	GetCurrentConfigSet();
	ExportMaster 			= new class'ProfileExporter';
	DefaultProfileName 		= LadderRules.DefaultProfileName;

	SMaster 				= new(None) class'SessionMaster';
	ProfileMaps 			= new(None) class'SortedStringArray';
	ProfileMutators 		= new(None) class'SortedStringArray';

	Assert(Level.Game.AccessControl != None);
	return true;
}

//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// Session Manipulation Functions
//

// Load profile information into session object
function CreateSessionInfo(coerce int ProfileIndex, string SID, optional bool bIncludeNonActive, optional bool bSave, optional bool bQuiet)
{
    local int 										i;
    local Session 									CurS;
    local string 									TempStr;
    local array&lt;string&gt; 							TempArr;
    local ProfileConfigSet 							TempPCS;
    local array&lt;ProfileConfigSet.ProfileMutator&gt; 	AllPCSMutators;
    local array&lt;ProfileConfigSet.ProfileMap&gt; 		AllPCSMaps;
    local array&lt;ProfileConfigSet.ProfileSA&gt; AllPCSServerActors;

    if (SID == &quot;&quot;)
        return;

    CurS = SMaster.getSession(SID,true);
	TempPCS = LadderRules.LadderProfiles[ProfileIndex];
	TempPCS.StartEdit();

// General profile information
    CurS.setValue(&quot;ProfileIndex&quot;, string(ProfileIndex), true);
	CurS.setValue(&quot;ProfileName&quot;,LadderRules.Profiles[ProfileIndex].ProfileName,true);
	CurS.setValue(&quot;GameType&quot;, string(TempPCS.GetGameClass()), True);
	CurS.setValue(&quot;ACClass&quot;, TempPCS.GetAccessControl(), True);
	CurS.setValue(&quot;MaxMaps&quot;, string(TempPCS.GetMaxMaps()), True);

	AllPCSMutators = TempPCS.GetProfileMutators();
	AllPCSMaps = TempPCS.GetProfileMaps();
	AllPCSServerActors = TempPCS.GetProfileServerActors();

    TempArr = LadderRules.GetProfileMutators(string(ProfileIndex));
    TempStr = class'wUtils103.wArray'.static.Join(TempArr,&quot;,&quot;);

// Load profile mutator information
    CurS.ClearMutators();
	for (i=0;i&lt;AllPCSMutators.Length;i++)
	   if (AllPCSMutators[i].bRequired || (InStr(TempStr,AllPCSMutators[i].MutatorName)!=-1) || bIncludeNonActive)
	       CurS.setMutator(AllPCSMutators[i].MutatorName,True,AllPCSMutators[i].bRequired);

    TempArr = LadderRules.GetProfileMaps(string(ProfileIndex));
    TempStr = class'wUtils103.wArray'.static.Join(TempArr,&quot;,&quot;);

// Load profile map information
    CurS.ClearMaps();
	for (i=0;i&lt;AllPCSMaps.Length;i++)
	   if (AllPCSMaps[i].bRequired || (InStr(TempStr,AllPCSMaps[i].MapName)!=-1) || bIncludeNonActive)
    	   CurS.setMap(AllPCSMaps[i].MapName,AllPCSMaps[i].MapListOrder,True,AllPCSMaps[i].bRequired);

	TempArr = LadderRules.GetProfileServerActors(string(ProfileIndex));
	TempStr = class'wUtils103.wArray'.static.Join(TempArr,&quot;,&quot;);

// Load ServerActor info
	CurS.ClearServerActors();
	for (i=0;i&lt;AllPCSServerActors.Length;i++)
		if (AllPCSServerActors[i].bRequired || InStr(TempStr,AllPCSServerActors[i].ActorClass)!=-1 || bIncludeNonActive)
			CurS.setServerActor(AllPCSServerActors[i].ActorClass, True, AllPCSServerActors[i].bRequired);

// Load profile PlayInfo data
	for (i=0;i&lt;TempPCS.Count();i++)
        CurS.setValue(TempPCS.GetProfileParamName(i),TempPCS.GetProfileParam(i),True);

    TempPCS.EndEdit(bSave,bQuiet);
}

// Initialize session data for recently imported profile
function ProfileConfigSet CreateImportSessionInfo(Session CurS)
{
	local int						i;
	local string 					TempStr, Tmp;
	local PlayInfo					TempPI;
	local ProfileConfigSet 			TempPCS;

	local class&lt;Mutator&gt;			MutClass;
	local class&lt;GameInfo&gt; 			GIClass;
	local class&lt;AccessControl&gt; 		ACClass;
	local class&lt;Info&gt;				ServerActorClass;
	local array&lt;class&lt;Info&gt; &gt;		SAClass;
	local array&lt;class&lt;Mutator&gt; &gt; 	MClass;

	TempPCS = LadderRules.AddProfile(CurS.getValue(&quot;ProfileName&quot;),CurS.getValue(&quot;GameType&quot;));
	if (TempPCS.StartEdit())
	{
		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None) return None;

		TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None) return None;

		TempPI = new(None) class'PlayInfo';

// Mutators
		for (i=0;i&lt;CurS.getMutatorLength();i++)
		{
			TempStr = CurS.getMutator(i);
			MutClass = class&lt;Mutator&gt;(DynamicLoadObject(TempStr, class'Class'));
			if (MutClass != None)
			{
				MClass[MClass.Length] = MutClass;
				TempPCS.AddProfileMutator(TempStr,CurS.MutRequired(TempStr));
			}

			else log(ErrorRemoteMutator@TempStr,LOGNAME);
		}

		for (i=0;i&lt;CurS.getSALength();i++)
		{
			TempStr = CurS.getServerActor(i);
			ServerActorClass = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (ServerActorClass != None)
			{
				SAClass[SAClass.Length] = ServerActorClass;
				TempPCS.AddProfileServerActor(TempStr,CurS.SARequired(TempStr));
			}
			else log(ErrorRemoteServerActor@TempStr,LOGNAME);
		}

		LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);

// Maps
		for (i=0;i&lt;CurS.getMapLength();i++)
		{
			TempStr = CurS.getMap(i);
			TempPCS.AddProfileMap(TempStr,CurS.MapRequired(TempStr));
		}

// PlayInfo
		for (i=0;i&lt;TempPI.Settings.Length;i++)
		{
			TempStr = &quot;&quot;; Tmp=&quot;&quot;;
			if (CurS.getIdValue(i,TempStr,Tmp) == -1)
				break;
			if ( !SettingIsAllowed(TempPI.Settings[i].SecLevel) ) continue;
			if (!TempPCS.SetProfileNamedParam(TempPI.Settings[i].SettingName, CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value)))
				TempPCS.SetProfileParam(TempPCS.Count(),TempPI.Settings[i].SettingName,CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value));
		}

		TempPCS.EndEdit(True);
		return TempPCS;
	}

	else log(ErrorServer,LOGNAME);

	return None;
}

// Clear session data and optionally create new session object
function string ResetSessionID(Session CurS, optional bool bDestroySession)
{
	local string OldSID;

	if (bDestroySession) SMaster.destroySession(CurS);
	else CurS.ResetSession();

	CurS = SMaster.getSession(OldSID,true);
	return CurS.GetHash();
}


////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
// Profile manipulation methods
//

function int LoadThisPlayInfo(PlayInfo PI, class&lt;GameInfo&gt; ThisGameInfo, class&lt;AccessControl&gt; ThisAccessControl, array&lt;class&lt;Mutator&gt; &gt; ThisMutator, array&lt;class&lt;Info&gt; &gt; ThisServerActor)
{
	local int i;
	local class&lt;Mutator&gt; M;

	if (PI == None)
		return 0;
	PI.Clear();

	if (ThisGameInfo == None)
		return 1;

	if (ThisAccessControl == None)
		return 2;

	if (ThisMutator.Length &gt; 0)
		for (i=0;i&lt;ThisMutator.Length;i++)
			if (ThisMutator[i] == None)
				return 3;

	if (ThisServerActor.Length &gt; 0)
		for (i=0;i&lt;ThisServerActor.Length;i++)
			if (ThisServerActor[i] == None)
				return 4;

	ThisGameInfo.static.FillPlayInfo(PI);
	PI.PopClass();

	if (ThisGameInfo.default.MutatorClass != &quot;&quot;)
	{
		M = class&lt;Mutator&gt;(DynamicLoadObject(ThisGameInfo.default.MutatorClass,class'Class'));
		if (M != None)
			M.static.FillPlayInfo(PI);
	}

	ThisAccessControl.static.FillPlayInfo(PI);
	PI.PopClass();

	for (i = 0; i &lt; ThisMutator.Length; i++)
	{
		ThisMutator[i].static.FillPlayInfo(PI);
		PI.PopClass();
	}

	for (i = 0; i &lt; ThisServerActor.Length; i++)
	{
		ThisServerActor[i].static.FillPlayInfo(PI);
		PI.PopClass();
	}

	class'CommandLineParams'.static.FillPlayInfo(PI);
	PI.PopClass();

	return -1;
}

function ProfileConfigSet GetCurrentConfigSet()
{
	local int i;

	if (CurrentProfile == None)
	{
		i = LadderRules.FindActiveProfile();
		if (i &gt;= 0)	CurrentProfile = LadderRules.LadderProfiles[i];
	}

	return CurrentProfile;
}

function int GetCurrentConfigIndex()
{
	local int i;

	if (CurrentProfile != None)
		for (i = 0;i &lt; LadderRules.LadderProfiles.Length;i++)
			if (LadderRules.LadderProfiles[i] == CurrentProfile)
				return i;

	return LadderRules.FindActiveProfile();
}

// Returns an array of class names for mutators that this profile will use in the game
function array&lt;string&gt; LoadActiveProfileMutators(optional string CurrentProfileItem)
{
	return LadderRules.GetProfileMutators(CurrentProfileItem);
}

function array&lt;string&gt; LoadActiveProfileServerActors(optional string CurrentProfileItem)
{
	return LadderRules.GetProfileServerActors(CurrentProfileItem);
}

// Returns an array of map names that in the maplist for this profile
function array&lt;string&gt; LoadActiveProfileMaps(optional string CurrentProfileItem)
{
	return LadderRules.GetProfileServerActors(CurrentProfileItem);
}
/*
function CreateFullMutatorList(out StringArray Mutators, out StringArray GroupsOnly)
{
	local StringArray Grouped;
	local int i,j,z;
	local string GrpName;
	local string thisgroup, nextgroup;

// This class provides a specialized sorting function
// since mutators may be grouped - mutators in the same groups
// are not allowed to be selected togther

	Grouped = new(None) class'SortedStringArray';

// Create array sorted on GroupName...this allows to flag
// the mutator for a different .inc file
	for (i = 0; i &lt; Mutators.Count(); i++)
	{
		j = int(Mutators.GetItem(i));

// If the mutator author forgot to configure a group name for the mutator
		if (AllMutators[j].GroupName == &quot;&quot;)
			GrpName = &quot;Z&quot; $ string (z++);
		else GrpName = AllMutators[j].GroupName;

		Grouped.Add(string(j),GrpName $ &quot;.&quot; $ AllMutators[j].FriendlyName);
	}

// Move all grouped mutators to GroupsOnly StringArray for sorting by friendly name
	for (i=0;i&lt;Grouped.Count();i++)
	{
		thisgroup = AllMutators[int(Grouped.GetItem(i))].GroupName;
		nextgroup = &quot;&quot;;

		if (thisgroup==&quot;&quot;)
			continue;
		if (i+1&lt;Grouped.Count())
			nextgroup = AllMutators[int(Grouped.GetItem(i+1))].GroupName;

		if (thisgroup ~= nextgroup)
		{
			j=i;
			while(nextgroup~=thisgroup &amp;&amp; j&lt;Grouped.Count())
			{
				GroupsOnly.MoveFromId(Grouped, Grouped.FindItemId(Grouped.GetItem(j)));
				thisgroup = nextgroup;
				if (j+1==Grouped.Count())
					nextgroup=&quot;&quot;;
				else nextgroup = AllMutators[int(Grouped.GetItem(j+1))].GroupName;
			}
			if (j&lt;Grouped.Count())
				GroupsOnly.MoveFromId(Grouped,Grouped.FindItemId(Grouped.GetItem(j)));
			i=-1;
		}
	}

// Move all non-grouped mutators back to Mutators array
// for re-sorting by Friendly Name
	Mutators.Reset();
	for (i=0;i&lt;Grouped.Count();i++)
	{
		j=int(Grouped.GetItem(i));
		Mutators.Add(string(j),AllMutators[j].FriendlyName);
	}
	Grouped.Reset();
}
*/
//****************************************************************
//****************************************************************
// Helper functions
//
//****************************************************************
//**************************
// HTML Generation
//*************************

// Creates a listing of PlayInfo data
// Pass &quot;defaults_row&quot; in the 'IncludeFile' param to add the
// input form objects to the output

function string GeneratePlayInfoRows(WebRequest Req, WebResponse Res, string IncludeFile)
{
	local int i,j,k,z;
	local string 	TempStr, Data, Op, SID,
					TempRow, HeadingRow, PlayInfoRows;

	local Session 		CurS;
	local PlayInfo 		TempPI;
	local StringArray 	Info, InfoC, InfoS, InfoT;

	local array&lt;string&gt; 		Options;
	local class&lt;Mutator&gt; 		TempMut;
	local class&lt;Info&gt;			TempSA;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.GetSession(SID);

	TempStr = CurS.getValue(&quot;GameType&quot;);
	if (TempStr != &quot;&quot;)
		GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
	if (GIClass == None)
	{
		ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
		return &quot;&quot;;
	}

	TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
	if (TempStr != &quot;&quot;)
		ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
	if (ACClass == None)
	{
		ShowMessage(Res,ErrorAccessControlTitle,ErrorAccessControlText);
		return &quot;&quot;;
	}

	for (i=0;i&lt;CurS.GetMutatorLength();i++)
	{
		TempStr = CurS.getMutator(i);
		if (TempStr != &quot;&quot;)
		{
			TempMut = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (TempMut != None)
				MClass[MClass.Length] = TempMut;
		}
	}

	for (i=0;i&lt;CurS.getSALength();i++)
	{
		TempStr = CurS.getServerActor(i);
		if (TempStr != &quot;&quot;)
		{
			TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (TempSA != None)
				SAClass[SAClass.Length] = TempSA;
		}
	}

	// Initialize and fill PlayInfo
	TempPI = new(None) class'PlayInfo';
	LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);

	for (i=0;i&lt;TempPI.Settings.Length;i++)
		if (CurS.HasData(TempPI.Settings[i].SettingName))
			TempPI.StoreSetting(i, CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value));

	InfoC = new(None) class'SortedStringArray';	// Checkboxes
	InfoS = new(None) class'SortedStringArray';	// Selects
	InfoT = new(None) class'SortedStringArray';	// Textboxes
	Info  = new(None) class'SortedStringArray';	// Contains each unique ClassFrom value

	// Want to allow admin to input values for each setting
	if (IncludeFile ~= &quot;defaults_row&quot;)
	{
		for (i=0;i&lt;TempPI.Settings.Length;i++)
		{
			if (TempPI.Settings[i].RenderType~=&quot;Text&quot;)
			{
				// Hack for MOTD sorting
				if (Left(TempPI.Settings[i].SettingName,Len(TempPI.Settings[i].SettingName) - 1) ~= &quot;GameReplicationInfo.MOTDLine&quot;)
					InfoT.Add(string(i), TempPI.Settings[i].SettingName);
				else InfoT.Add(string(i),TempPI.Settings[i].DisplayName);
			}

			else if (TempPI.Settings[i].RenderType~=&quot;Check&quot;)
				InfoC.Add(string(i),TempPI.Settings[i].DisplayName);

			else if (TempPI.Settings[i].RenderType~=&quot;Select&quot;)
				InfoS.Add(string(i),TempPI.Settings[i].DisplayName);

			for (j=0;j&lt;Info.Count();j++)
				if (Info.GetTag(j) ~= string(TempPI.Settings[i].ClassFrom))
					break;

			if (j == Info.Count())
				Info.Add(string(i), string(TempPI.Settings[i].ClassFrom));
		}

		for (k=0;k&lt;Info.Count();k++)
		{
			TempRow = &quot;&quot;; HeadingRow = &quot;&quot;;
			Res.Subst(&quot;RowContent&quot;, &quot;&lt;td class=ttext colspan=\&quot;3\&quot;&gt;&quot;$Info.GetTag(k)$&quot;&lt;/td&gt;&quot;);
			HeadingRow = WebInclude(RowLeft);

			for (i=0;i&lt;InfoC.Count();i++)
			{
				TempStr = &quot;&quot;;
				j=int(InfoC.GetItem(i));
				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				Res.Subst(&quot;Content&quot;, Checkbox(TempPI.Settings[j].SettingName, TempPI.Settings[j].Value ~= &quot;True&quot;, TempPI.Settings[j].Data != &quot;&quot;));
				TempStr = WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class=location title=\&quot;Required Security Level\&quot;&gt;&quot;$TempPI.Settings[j].SecLevel$&quot;&lt;/span&gt;&quot;);
				TempStr += WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class='location'&gt;&quot;$HtmlEncode(TempPI.Settings[j].DisplayName)$&quot;&lt;/span&gt;&quot;);
				Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft) $ TempStr);
				TempRow += WebInclude(RowLeft);
			}

			for (i=0;i&lt;InfoT.Count();i++)
			{
				TempStr = &quot;&quot;;
				j = int(InfoT.GetItem(i));
				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				Data = &quot;8&quot;;
				if (TempPI.Settings[j].Data != &quot;&quot;)
				{
					Data = TempPI.Settings[j].Data;
					Divide(TempPI.Settings[j].Data, &quot;;&quot;, Data, Op);
					TempPI.SplitStringToArray(Options, Op, &quot;:&quot;);
				}

				Op = &quot;&quot;;
				if (Options.Length &gt; 1)
					Op = &quot; (&quot;$Options[0]$&quot; - &quot;$Options[1]$&quot;)&quot;;

				Res.Subst(&quot;Content&quot;, Textbox(TempPI.Settings[j].SettingName, Data, 3 * int(Data), TempPI.Settings[j].Value) $ Op);
				TempStr = WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class=location title=\&quot;Required Security Level\&quot;&gt;&quot;$TempPI.Settings[j].SecLevel$&quot;&lt;/span&gt;&quot;);
				TempStr += WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class='location'&gt;&quot;$HtmlEncode(TempPI.Settings[j].DisplayName)$&quot;&lt;/span&gt;&quot;);
				Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft) $ TempStr);
				TempRow += WebInclude(RowLeft);
			}

			for (i=0;i&lt;InfoS.Count();i++)
			{
				Data = &quot;&quot;; TempStr = &quot;&quot;;
				j=int(InfoS.GetItem(i));
				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;
				// Build a set of options from PID.Data
				TempPI.SplitStringToArray(Options, TempPI.Settings[j].Data, &quot;;&quot;);
				for (z = 0; (z+1)&lt;Options.Length; z += 2)
				{
					Data += (&quot;&lt;option value='&quot;$Options[z]$&quot;'&quot;);
					If (TempPI.Settings[j].Value == Options[z])
						Data @= &quot;selected&quot;;
					Data += (&quot;&gt;&quot;$HtmlEncode(Options[z+1])$&quot;&lt;/option&gt;&quot;);
				}

				Res.Subst(&quot;Content&quot;, Select(TempPI.Settings[j].SettingName, Data));
				TempStr = WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class=location title=\&quot;Required Security Level\&quot;&gt;&quot;$TempPI.Settings[j].SecLevel$&quot;&lt;/span&gt;&quot;);
				TempStr += WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class='location'&gt;&quot;$HtmlEncode(TempPI.Settings[j].DisplayName)$&quot;&lt;/span&gt;&quot;);
				Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft) $ TempStr);
				TempRow += WebInclude(RowLeft);
			}

			if (TempRow!=&quot;&quot;)
				PlayInfoRows += (HeadingRow$TempRow);
		}
	}
	else	// Displaying values only
	{
		for (i=0;i&lt;TempPI.Settings.Length;i++)
		{
			if (Left(TempPI.Settings[i].SettingName,Len(TempPI.Settings[i].SettingName) - 1) ~= &quot;GameReplicationInfo.MOTDLine&quot;)
				InfoS.Add(string(i), TempPI.Settings[i].SettingName);
			else InfoS.Add(string(i),TempPI.Settings[i].DisplayName);

			for (j=0;j&lt;Info.Count();j++)
				if (Info.GetTag(j) ~= string(TempPI.Settings[i].ClassFrom))
					break;
			if (j == Info.Count())
				Info.Add(string(i), string(TempPI.Settings[i].ClassFrom));
		}

		for (k=0;k&lt;Info.Count();k++)
		{
			TempRow = &quot;&quot;;
			HeadingRow = &quot;&lt;tr&gt;&lt;td class=ttext colspan=\&quot;2\&quot;&gt;&quot;$Info.GetTag(k)$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
			for (i=0;i&lt;InfoS.Count();i++)
			{
				j=int(InfoS.GetItem(i));
				Data = &quot;&quot;;

				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				Res.Subst(&quot;SettingName&quot;, HtmlEncode(TempPI.Settings[j].DisplayName));

				if (TempPI.Settings[j].Value ~= &quot;true&quot;)
					Data = &quot;True&quot;;

				else if (TempPI.Settings[j].Value ~= &quot;false&quot;)
					Data = &quot;False&quot;;

				else
				{
					if (TempPI.Settings[j].RenderType ~= &quot;Select&quot;)
					{
						class'wUtils103.wString'.static.Split2(TempPI.Settings[j].Data, &quot;;&quot;, Options);
						for (z=0;(z+1)&lt;Options.Length;z+=2)
						{
							if (TempPI.Settings[j].Value == Options[z])
							{
								Data = Options[z+1];
								break;
							}
						}
					}
					else Data = TempPI.Settings[j].Value;
				}

				Res.Subst(&quot;SettingData&quot;, HtmlEncode(Data));
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);
				TempRow += WebInclude(IncludeFile);
			}

			if (TempRow!=&quot;&quot;)
				PlayInfoRows += (HeadingRow$TempRow);
		}
	}
	return PlayInfoRows;
}

// Creates the drop-down box containing profiles names
function String GenerateSwitchProfileOptions(optional string CurrentProfileItem)
{
	local int i;
	local string SelectedStr, OptionStr;

	if (LadderRules.AllLadderProfiles.Count() == 0)
		return &quot;&lt;option value=\&quot;\&quot;&gt;***&quot;@NoneText@&quot;***&lt;/option&gt;&quot;;

	for (i=0; i &lt; LadderRules.AllLadderProfiles.Count(); i++)
	{
	// This item was the item passed in by CurrentProfileItem, so make it active
		if (CurrentProfileItem ~= LadderRules.AllLadderProfiles.GetItem(i))
			SelectedStr = &quot; selected&quot;;
		else SelectedStr = &quot;&quot;;

		OptionStr = OptionStr$&quot;&lt;option value=\&quot;&quot;$LadderRules.AllLadderProfiles.GetItem(i)$&quot;\&quot;&quot;$SelectedStr$&quot;&gt;&quot;$LadderRules.AllLadderProfiles.GetTag(i)@&quot;&lt;/option&gt;&quot;;
	}
	return OptionStr;
}

function bool SettingIsAllowed(byte SettingSecLevel)
{
	return SettingSecLevel &lt;= CurAdmin.MaxSecLevel();
}

// Handles generation of the double map select boxes (Exclude &amp; Include)
function String CreateMapListSelect(array&lt;ProfileConfigSet.ProfileMap&gt; AllPCSMaps, StringArray MapList, StringArray MovedMaps)
{
	local int i,j;
	local String ResponseStr, SelectedStr, Tmp;

	if (MapList.Count() == 0)
		return &quot;&lt;option value=\&quot;\&quot;&gt;***&quot;@NoneText@&quot;***&lt;/option&gt;&quot;;

	for (i = 0; i&lt;MapList.Count(); i++)
	{
	// Index for map within AllPCSMaps
		j = int(MapList.GetItem(i));

		Tmp = AllPCSMaps[j].MapName;
		SelectedStr = &quot;&quot;;
		if (MovedMaps != None &amp;&amp; MovedMaps.FindItemId(string(j)) &gt;= 0)
			SelectedStr = &quot; selected&quot;;
		ResponseStr = ResponseStr$&quot;&lt;option value=\&quot;&quot;$Tmp$&quot;\&quot;&quot;$SelectedStr$&quot;&gt;&quot;$Tmp$&quot;&lt;/option&gt;&quot;;
	}

	return ResponseStr;
}

//**********************
// Import / Export
//**********************

// Handles spacing for textboxes on export page
function int GetLongestURL()
{
	local int i, Current, Largest;

	for (i = 0; i &lt; ExportMaster.Zips.Length; i++)
	{
		Current = Len(ExportMaster.Zips[i].ZipURL);
		if (Current &gt; Largest)
			Largest = Current;
	}

	return Largest + 1;
}

// Handles filling in zip-location textboxes on export page
function string GetLocation(string Package)
{
	local int i;

	// Check if we're dealing with a map or a mutator
	i = InStr(Package, &quot;.&quot;);

	// Dealing with a mutator - remove class name
	if (i != -1)
		Package = Left(Package, i);

	return ExportMaster.FindZipLocation(Package);
}

// Handles saving zip file locations from export page
function SetLocation(string Package, string NewLocation)
{
	local int i;

	// Check if we're dealing with a map or a mutator
	i = InStr(Package, &quot;.&quot;);

	// Dealing with a mutator - remove class name
	if (i != -1)
		Package = Left(Package, i);

	if (NewLocation == &quot;&quot;)
		ExportMaster.DeleteZipLocation(Package);
	else ExportMaster.AddZipLocation(Package, NewLocation);
}

// Utility function to remove strings from profile names before
// creating .txt for exported profile
function string RemoveStr(string Source,string mask)
{
	local int i;
	local string left,right;

	i = InStr(Source,mask);
	while (i != -1)
	{
		Divide(Source,mask,left,right);
		Source = Left$Right;
		i = InStr(Source,Mask);
	}

	return Source;
}

// Prevents entering a zip file location for any package
// that is already included with the game
function bool EpicPackage(string Package)
{
	local int i;

	// Check if we're dealing with a map or a mutator
	i = InStr(Package, &quot;.&quot;);

	// Dealing with a mutator - remove class name
	if (i != -1)
		Package = Left(Package, i);

	for (i = 0;i &lt; EPICNUMBER; i++)
		if (Package ~= EpicPackages[i])
			return true;
	return false;
}

function CheckSettingValue(string SettingData, out string NewValue)
{
	local string sMaxLength, sMinMax, sMin, sMax;
	local int iMaxLength, iMin, iMax, iValue;
	local float fMin, fMax, fValue;
	local bool bFloat;

	if (SettingData == &quot;&quot;)
		return;

// This setting has no valid min/max (it is a password setting or something)
	if (InStr(SettingData,&quot;;&quot;) &lt; 0 )
	{
		// Allow only up to three times the configured max length
		iMaxLength = 3 * int(SettingData);
		if (Len(NewValue) &gt; iMaxLength)
			NewValue = Left(NewValue,iMaxLength);
		return;
	}

	Divide(SettingData,&quot;;&quot;,sMaxLength,sMinMax);	// Split the Max Length &amp; MinMax Info
	Divide(sMinMax,&quot;:&quot;,sMin,sMax);				// Split the Min &amp; Max info for casting
	iMaxLength = int(sMaxLength);
	if ( InStr(sMin,&quot;.&quot;) &gt;= 0 || InStr(sMax,&quot;.&quot;) &gt;= 0)	// Are we dealing with floating point numbers?
	{
		bFloat = True;
		fMin = float(sMin);
		fMax = float(sMax);
	}

	else
	{
		iMin = int(sMin);
		iMax = int(sMax);
	}

	// First check for length
	if (Len(NewValue) &gt; iMaxLength)
		NewValue = Left(NewValue,iMaxLength);

	if (bFloat)
	{
		fValue = float(NewValue);
		fValue = FClamp(fValue,fMin,fMax);
		NewValue = string(fValue);
	}
	else
	{
		iValue = int(NewValue);
		iValue = Clamp(iValue,iMin,iMax);
		NewValue = string(iValue);
	}
}
//*****************************************************************************
//*****************************************************************************
// Query Methods
//
//

// Passes the SessionID variable to all pages in this query action
// if SessionID is not present in WebRequest, generates one
// (Helpful when dealing with frames)
function bool PreQuery(WebRequest Req, WebResponse Res)
{
	local string SID;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	if (SID == &quot;&quot;)
	{
		SID = SMaster.getSession(&quot;xxxxx&quot;,true).GetHash();
		Req.AddVariable(&quot;SessionID&quot;, SID);
	}
	Res.Subst(&quot;SessionID&quot;, SID);
	return true;
}

function bool Query(WebRequest Request, WebResponse Response)
{
	switch (Mid(Request.URI, 1))
	{
	case DefaultPage: 		if (!MapIsChanging()) QueryLadderFrame(Request, Response);		return true;
	case ProfileMenuURI:	if (!MapIsChanging()) QueryLadderMenu(Request, Response);		return true;
	case ProfileViewURI:	if (!MapIsChanging()) QueryLadderView(Request, Response);		return true;
	case ProfileEditURI: 	if (!MapIsChanging()) QueryLadderEdit(Request, Response);		return true;
	case ProfileSwitchURI:	if (!MapIsChanging()) QueryLadderSwitch(Request, Response);		return true;
	case ProfileManageURI:	if (!MapIsChanging()) QueryLadderManage(Request, Response);		return true;

// Management subframes
	case SubFrameURI: 		if (!MapIsChanging()) QuerySubFrame(Request, Response);			return true;
	case SubFrameMenuURI: 	if (!MapIsChanging()) QuerySubMenu(Request, Response);			return true;
	case SubGametypeURI:	if (!MapIsChanging()) QuerySubGameType(Request, Response);		return true;
	case SubMapsURI:		if (!MapIsChanging()) QuerySubMaps(Request, Response);			return true;
	case SubMutatorsURI:	if (!MapIsChanging()) QuerySubMutators(Request, Response);		return true;
	case SubRulesURI:		if (!MapIsChanging()) QuerySubRules(Request, Response);			return true;
	case SubReviewURI:		if (!MapIsChanging()) QuerySubReview(Request, Response);		return true;
	case SubSavedURI:		if (!MapIsChanging()) QuerySubSaved(Request, Response);			return true;
	case SubImportURI: 		if (!MapIsChanging()) QuerySubImport(Request, Response);		return true;
	case SubExportURI: 		if (!MapIsChanging()) QuerySubExport(Request, Response);		return true;
	}
// This query is looking for a page from another query handler
// or the map is changing
	return false;
}

function QueryLadderFrame(WebRequest Req, WebResponse Res)
{
	local String Page;
	local string SID;

// if no page specified, use the default
	Page = Req.GetVariable(&quot;Page&quot;, ProfileViewURI);
	SID = Req.GetVariable(&quot;SessionID&quot;);

// Tell the menu page which page we're viewing (with the ?Page=),
// so that it can highlight the appropriate link
	Res.Subst(&quot;IndexURI&quot;,ProfileMenuURI$&quot;?Page=&quot;$Page$&quot;?SessionID=&quot;$SID);

// Load the main page into the frameset
	Res.Subst(&quot;MainURI&quot;, Page$&quot;?SessionID=&quot;$SID);

	ShowFrame(Res, DefaultPage);
}

function QuerySubFrame(WebRequest Req, WebResponse Res)
{
	local string Page, SID, TempStr, Action;
	local Session CurS;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID, true);

	Action = Req.GetVariable(&quot;Actions&quot;,&quot;Add&quot;);

	if (Action ~= &quot;Modify&quot;)
	{
		TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);
		if (TempStr != &quot;&quot;) CreateSessionInfo(TempStr,SID,True);
	}

	else if (Action ~= &quot;Add&quot;)
	{
		TempStr = Req.GetVariable(&quot;TextInput&quot;);
		if (TempStr != &quot;&quot;) CurS.setValue(&quot;ProfileName&quot;,TempStr,True);
	}

// if no page specified, use the default
	Page = Req.GetVariable(&quot;Page&quot;, SubGameTypeURI);
	CurS.setValue(&quot;CurrentPage&quot;, Page, True);

// Tell the SubMenu page which page we're viewing, so that it can highlight
// the appropriate link
	Res.Subst(&quot;SubMenuURI&quot;, SubFrameMenuURI$&quot;?SessionID=&quot;$SID);

// Load the main page into the frameset
	Res.Subst(&quot;SubMainURI&quot;, Page$&quot;?SessionID=&quot;$SID);
	ShowFrame(Res, SubFrame);
}

function QueryLadderMenu(WebRequest Req, WebResponse Res)
{
	local string SID;

	SID = Req.GetVariable(&quot;SessionID&quot;);
/*
If ?SessionID= is appended to the link, PreQuery() will not generate
a new Session when this link is queried
*/
	// Set URIs
	if (CanPerform(&quot;Lv&quot;))
		Res.Subst(&quot;ViewProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileViewURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkViewProfile$&quot;&lt;/a&gt;&lt;br /&gt;&quot;);

	if (CanPerform(&quot;Le&quot;))
		Res.Subst(&quot;EditProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileEditURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkEditProfile$&quot;&lt;/a&gt;&lt;br&gt;&quot;);

	if (CanPerform(&quot;Ls&quot;))
		Res.Subst(&quot;SwitchProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileSwitchURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkSwitchProfile$&quot;&lt;/a&gt;&lt;br&gt;&quot;);

	if (CanPerform(&quot;Lm&quot;))
		Res.Subst(&quot;ManageProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileManageURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkManageProfile$&quot;&lt;/a&gt;&lt;br&gt;&quot;);

	ShowPage(Res, ProfileMenuURI);
}

function QuerySubMenu(WebRequest Req, WebResponse Res)
{
// Highlight the current page
	local string Highlighted, Background, SID;
	local string GameLink, MutatorLink, MapLink, RuleLink, ReviewLink;
	local string GameSpan, MutatorSpan, MapSpan, RuleSpan, ReviewSpan;

	local string Page;
	local Session CurS;

	if (CanPerform(&quot;Lm&quot;))
	{
		Highlighted = &quot;&lt;span class=\&quot;blue\&quot;&gt;&quot;;
		Background = &quot;&lt;span class=\&quot;red\&quot;&gt;&quot;;
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, true);

		// We are managing an existing profile
		if (CurS.HasData(&quot;ProfileIndex&quot;))
	    	Res.Subst(&quot;Section&quot;, LabelModifyProfile);

		else Res.Subst(&quot;Section&quot;, LabelAddProfile);

		Page = CurS.getValue(&quot;CurrentPage&quot;,SubGametypeURI);

	// Including ?SessionID= in link prevents PreQuery() from generating a new Session
		GameLink = 		&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubGametypeURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		MutatorLink = 	&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubMutatorsURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		MapLink = 		&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubMapsURI$		&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		RuleLink = 		&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubRulesURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		ReviewLink = 	&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubReviewURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;

	// Initially set all spans to the background color
		GameSpan 	= Background;
		MutatorSpan = Background;
		MapSpan 	= Background;
		RuleSpan 	= Background;
		ReviewSpan 	= Background;

		// Then set the appropriate span to the highlighted color
		Res.Subst(&quot;SubTitle&quot;, CurS.GetValue(&quot;ProfileName&quot;));
		switch (Page)
		{
			case SubGametypeURI:
				Curs.SetValue(&quot;ButtonName&quot;,		ProfileButtonName[1],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[1],true);

				Res.Subst(&quot;PageHelp&quot;, HelpGameType);
				GameSpan = Highlighted; break;

			case SubMutatorsURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[2],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[2],true);

				Res.Subst(&quot;PageHelp&quot;, HelpMutators);
				MutatorSpan = Highlighted; break;

			case SubMapsURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[3],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[3],true);

				Res.Subst(&quot;PageHelp&quot;, HelpMaps);
				Mapspan = Highlighted; break;

			case SubRulesURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[4],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[4],true);

				Res.Subst(&quot;PageHelp&quot;, HelpPlayInfo);
				RuleSpan = Highlighted; break;

			case SubReviewURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[5],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[5],true);

				Res.Subst(&quot;PageHelp&quot;, HelpReview);
				ReviewSpan = Highlighted; break;
		}

		GameLink 	= GameLink 		$ GameSpan 		$ TableTitle[1]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		MutatorLink = MutatorLink 	$ MutatorSpan 	$ TableTitle[2]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		MapLink 	= MapLink 		$ MapSpan 		$ TableTitle[3]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		RuleLink 	= RuleLink 		$ RuleSpan 		$ TableTitle[4]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		ReviewLink 	= ReviewLink 	$ ReviewSpan 	$ TableTitle[5]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;

		Res.Subst(&quot;GameTypeLink&quot;, 	GameLink);
		Res.Subst(&quot;MutatorsLink&quot;, 	MutatorLink);
		Res.Subst(&quot;MapsLink&quot;, 		MapLink);
		Res.Subst(&quot;RulesLink&quot;, 		RuleLink);
		Res.Subst(&quot;ReviewLink&quot;, 	ReviewLink);

		ShowPage(Res, SubFrameMenu);
	}

	else AccessDenied(Res);
}

function QueryLadderView(WebRequest Req, WebResponse Res)
{
	local int i,j;
	local Session 	CurS;
	local string	SID,
					TempStr,
					ViewRows,
					NewProfile,
					NewGameType;

	local StringArray 			Mutators, GroupsOnly, ServerActors;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local class&lt;Mutator&gt;		TempMut;
	local class&lt;Info&gt;			TempSA;


	if (CanPerform(&quot;Lv&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID,true);

		if (CanPerform(&quot;Ls&quot;))
		{

			if (Req.GetVariable(&quot;SetProfileName&quot;,&quot;&quot;)!=&quot;&quot;) // We would like to view a different profile
				TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);

			If (TempStr == &quot;&quot;)	// Not selecting a new profile to view
			{
			// First, see if the current session is holding a profile
				NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);
				if (NewProfile == &quot;&quot;)
				{
				// See if a profile is currently loaded
					j = GetCurrentConfigIndex();
					if (j!=-1)		// Found an active profile - this profile should be selected
						NewProfile = string(j);
				}
			}

			if (TempStr!=&quot;&quot;)
				NewProfile = TempStr;

			Res.Subst(&quot;ButtonName&quot;, &quot;SetProfileName&quot;);
			Res.Subst(&quot;ButtonValue&quot;, ButtonLoadProfile);
			Res.Subst(&quot;PageCaption&quot;, &quot;&lt;select class=mini name='ProfileNameSelect'&gt;&quot;$GenerateSwitchProfileOptions(NewProfile)$&quot;&lt;/select&gt;&quot;);
		}

	// If admin doesn't have switch privileges, check for current profile
		if (NewProfile == &quot;&quot;)
		{
			NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);
			if (NewProfile == &quot;&quot;)
			{
				j = GetCurrentConfigIndex();
				if (j != -1)
					NewProfile = string(j);
			}
		}

		if (NewProfile != &quot;&quot; &amp;&amp; LadderRules.AllLadderProfiles.Count() &gt; 0)
		{
			CurS.setValue(&quot;ProfileIndex&quot;, NewProfile, True);
            CreateSessionInfo(NewProfile,SID);
			NewGameType = CurS.getValue(&quot;GameType&quot;);

			if (NewGameType != &quot;&quot;)
				GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(NewGameType,class'Class'));
			if (GIClass==None)
			{
				ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
				return;
			}

			TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
			if (TempStr != &quot;&quot;)
				ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (ACClass == None)
			{
				ShowMessage(Res,ErrorAccessControlTitle,ErrorAccessControlText);
				return;
			}

			Mutators = new(None) class'SortedStringArray';
			GroupsOnly = new(None) class'SortedStringArray';
			ServerActors = new(None) class'SortedStringArray';
		// Mutator Section
			for (i=0;i&lt;CurS.getMutatorLength();i++)
			{
			    TempStr = CurS.getMutator(i);
                for (j=0;j&lt;AllMutators.Length;j++)
				{
					if (TempStr ~= AllMutators[j].ClassName)
					{
						TempMut = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
						if (TempMut != None)
							Mutators.Add(string(j), AllMutators[j].FriendlyName);
					}
				}
			}

			for (i=0;i&lt;CurS.getSALength();i++)
			{
				TempStr = CurS.GetServerActor(i);
				for (j=0;j&lt;ConfigM.ManagedActors.Length;j++)
				{
					if (TempStr ~= string(ConfigM.ManagedActors[j].SAClass))
					{
						TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
						if (TempSA != None)
							ServerActors.Add(string(j),ConfigM.ManagedActors[j].SAName);
					}
				}
			}

			Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
			ViewRows = ViewRows$WebInclude(IncludeSection);

			for (i = 0; i&lt;ServerActors.Count(); i++)
			{
				j = int(ServerActors.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, ServerActors.GetTag(i));
				if (CurS.SARequired(string(ConfigM.ManagedActors[j].SAClass)))
					Res.Subst(&quot;SettingData&quot;, RequiredText);
				else Res.Subst(&quot;SettingData&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
				ViewRows = ViewRows $ WebInclude(IncludeRows);
			}
			ViewRows = ViewRows $ &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;;
			for (i = 0; i&lt;Mutators.Count(); i++)
			{
				j = int(Mutators.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, AllMutators[j].FriendlyName);
				if (CurS.MutRequired(AllMutators[j].ClassName))
					Res.Subst(&quot;SettingData&quot;, RequiredText);
				else Res.Subst(&quot;SettingData&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
				ViewRows = ViewRows$WebInclude(IncludeRows);
			}

			Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
			ViewRows = ViewRows$WebInclude(IncludeSection);

			Res.Subst(&quot;SettingName&quot;, LabelMaxMaps);
			TempStr = CurS.getValue(&quot;MaxMaps&quot;);
			if (TempStr == &quot;0&quot;)
				TempStr = UnlimitedText;
			Res.Subst(&quot;SettingData&quot;, TempStr);
			Res.Subst(&quot;Extra&quot;, &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;);
			ViewRows = ViewRows$WebInclude(IncludeRows);
			for (i=0;i&lt;CurS.getMapLength();i++)
			{
                TempStr = CurS.getMap(i);
                Res.Subst(&quot;SettingName&quot;, TempStr);
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);
				if (CurS.MapRequired(TempStr))
					Res.Subst(&quot;SettingData&quot;, RequiredText);
				else Res.Subst(&quot;SettingData&quot;, &quot;&amp;nbsp;&amp;nbsp&quot;);

				ViewRows = ViewRows$WebInclude(IncludeRows);
			}

			Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
			ViewRows = ViewRows $ WebInclude(IncludeSection);
			ViewRows = ViewRows $ &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot; $ GeneratePlayInfoRows(Req, Res, IncludeRows);
		}

	// We have no profile currently active
		else
		{
			Res.Subst(&quot;SettingName&quot;, PageCaption[0]);
			ViewRows = ViewRows $ WebInclude(IncludeRows);
		}

		TempStr = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; TempStr == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			TempStr = TempStr @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;TableRows&quot;, ViewRows);
		Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeCaptionButton)$WebInclude(IncludeTable));
		Res.Subst(&quot;Section&quot;, LinkViewProfile);
		Res.Subst(&quot;SubTitle&quot;, TempStr);
		Res.Subst(&quot;PageHelp&quot;, HelpViewProfile);
		Res.Subst(&quot;PostAction&quot;, ProfileViewURI$&quot;?SessionID=&quot;$SID);

		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

function QueryLadderEdit(WebRequest Req, WebResponse Res)
{
	local Session CurS;
	local bool 	bAllMuts;
	local int 	i,j,k,z,
				id,
				Count,
				MoveCount;

	local string	SID,
					EditRows,
					TempStr, Tmp, NewProfile, NewGameType,
					lastgroup, thisgroup, nextgroup, EmptyRow;

	local ProfileConfigSet 		TempPCS;
	local array&lt;string&gt; 		TempMutes;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;ProfileConfigSet.ProfileMap&gt; 		AllPCSMaps;
	local array&lt;ProfileConfigSet.ProfileMutator&gt; 	AllPCSMutators;
	local array&lt;ProfileConfigSet.ProfileSA&gt;			AllPCSServerActors;
	local StringArray
				Mutators, GroupsOnly, Required, ServerActors, ReqSA,
				RequiredMaps, IncludeMaps, ExcludeMaps, MovedMaps;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID,true);
	if (CanPerform(&quot;Le&quot;))
	{
		if (CanPerform(&quot;Ls&quot;))
		{
			if (Req.GetVariable(&quot;SetProfileName&quot;,&quot;&quot;)!=&quot;&quot;) // We would like to view a different profile
				TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);

			If (TempStr == &quot;&quot;)	// Not selecting a new profile to view
			{
			// First, see if the current session is holding a profile
				NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);

				if (NewProfile == &quot;&quot;)
				{
				// See if a profile is currently loaded
					j = GetCurrentConfigIndex();
					if (j!=-1)		// Found an active profile - this profile should be selected
						NewProfile = string(j);
				}

			}

			if (TempStr!=&quot;&quot;)
				NewProfile = TempStr;

			Res.Subst(&quot;ButtonName&quot;, &quot;SetProfileName&quot;);
			Res.Subst(&quot;ButtonValue&quot;, ButtonLoadProfile);
			Res.Subst(&quot;PageCaption&quot;, &quot;&lt;select class=mini name='ProfileNameSelect'&gt;&quot;$GenerateSwitchProfileOptions(NewProfile)$&quot;&lt;/select&gt;&quot;);
		}
		CurS.setValue(&quot;CurrentPage&quot;, ProfileEditURI, true);
		CurS.setValue(&quot;ButtonName&quot;, &quot;ApplyProfileChanges&quot;,true);
		CurS.setValue(&quot;ButtonValue&quot;, ButtonApplyProfileChanges, true);

// If admin doesn't have switch privileges, check for current profile
		if (NewProfile == &quot;&quot;)
		{
			NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);
			if (NewProfile == &quot;&quot;)
			{
				j = GetCurrentConfigIndex();
				if (j != -1)
					NewProfile = string(j);
			}
		}

		CurS.setValue(&quot;ProfileIndex&quot;, NewProfile, True);
		if (NewProfile != &quot;&quot; &amp;&amp; LadderRules.AllLadderProfiles.Count() &gt; 0)
		{
			ProfileMaps.Reset();
			Required = new(None) 		class'SortedStringArray';
			ReqSA	= new(None)			class'SortedStringArray';
			Mutators = new(None) 		class'SortedStringArray';
			MovedMaps = new(None) 		class'SortedStringArray';
			GroupsOnly = new(None) 		class'SortedStringArray';
			ServerActors = new(None)	class'SortedStringArray';
			IncludeMaps = new(None) 	class'SortedStringArray';
			ExcludeMaps = new(None) 	class'SortedStringArray';
			RequiredMaps = new(None) 	class'SortedStringArray';

            CreateSessionInfo(NewProfile,SID);
			TempPCS = LadderRules.LadderProfiles[int(NewProfile)];
			TempPCS.StartEdit();

			NewGameType = CurS.getValue(&quot;GameType&quot;);
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(NewGameType,class'Class'));
			if (GIClass==None)
			{
				ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
				return;
			}

			TempStr = CurS.getValue(&quot;ACClass&quot;, Level.Game.AccessControlClass);
			if (TempStr != &quot;&quot;)
				ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
			AllPCSMutators = TempPCS.GetProfileMutators();
			AllPCSMaps = TempPCS.GetProfileMaps();
			AllPCSServerActors = TempPCS.GetProfileServerActors();

	// Load Exclude Maps
			for (i=0;i&lt;AllPCSMaps.Length;i++)
			{
				ProfileMaps.Add(string(i), AllPCSMaps[i].MapName);
				if (AllPCSMaps[i].bRequired)
				{
					RequiredMaps.Add(string(i),string(AllPCSMaps[i].MapListOrder));
					IncludeMaps.Add(string(i),string(AllPCSMaps[i].MapListOrder));
				}

				else ExcludeMaps.Add(string(i),string(AllPCSMaps[i].MapListOrder));
			}

			for (i=0;i&lt;CurS.GetMapLength();i++)
			{
				j = ExcludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(CurS.getMap(i))));
				if (j &gt;= 0) IncludeMaps.MoveFromId(ExcludeMaps, j);
			}

			if (Req.GetVariable(&quot;ApplyProfileChanges&quot;,&quot;&quot;)!=&quot;&quot;)
			{
				for (i=0;i&lt;AllPCSMutators.Length;i++)
					for (j=0;j&lt;AllMutators.Length;j++)
						if (AllPCSMutators[i].MutatorName ~= AllMutators[j].ClassName)
							Mutators.Add(string(j),AllPCSMutators[i].MutatorName);

				for (i=0;i&lt;Mutators.Count();i++)
				{
					if ((Req.GetVariable(Mutators.GetTag(i),&quot;&quot;)!=&quot;&quot;)||(Req.GetVariable(AllMutators[int(Mutators.GetItem(i))].GroupName)~=Mutators.GetTag(i)))
						TempPCS.AddMutator(Mutators.GetTag(i));
					else TempPCS.DelMutator(Mutators.GetTag(i));
				}

				for (i=0;i&lt;AllPCSServerActors.Length;i++)
				{
					if (Req.GetVariable(AllPCSServerActors[i].ActorClass,&quot;&quot;) != &quot;&quot;)
						TempPCS.AddServerActor(AllPCSServerActors[i].ActorClass);
					else TempPCS.DelServerActor(AllPCSServerActors[i].ActorClass);
				}

				for (i=0;i&lt;AllPCSMaps.Length;i++)
				{
					if (AllPCSMaps[i].bRequired) TempPCS.AddMap(AllPCSMaps[i].MapName,int(RequiredMaps.GetTag(RequiredMaps.FindItemId(string(i)))));
					else if (IncludeMaps.FindItemId(string(i)) &gt;= 0) TempPCS.AddMap(AllPCSMaps[i].MapName,int(IncludeMaps.GetTag(IncludeMaps.FindItemId(string(i)))));
					else TempPCS.RemoveMap(AllPCSMaps[i].MapName);
				}

                CreateSessionInfo(NewProfile,SID,false,true);
			}
			else if (Req.GetVariable(&quot;AddMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				Count = Req.GetVariableCount(&quot;ExcludeMapsSelect&quot;);
				for (i=0; i&lt;Count; i++)
				{
					if (IncludeMaps.Count() &gt;= TempPCS.MaxMaps &amp;&amp; TempPCS.MaxMaps &gt; 0)
						break;
					if (ExcludeMaps.Count() &gt; 0)
					{
						id = IncludeMaps.MoveFromId(ExcludeMaps, ExcludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;ExcludeMapsSelect&quot;, i)))));
						if (id &gt;= 0)
						{
							TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(id))].MapName,int(IncludeMaps.getTag(id)));
							MovedMaps.CopyFromId(IncludeMaps, id);
						}
						else
							Log(ErrorExcludeMapNotFound@Req.GetVariableNumber(&quot;ExcludeMapsSelect&quot;, i),LOGNAME);
					}
				}
				for (i=0;i&lt;IncludeMaps.Count();i++)
					TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(i))].MapName,i);

                CreateSessionInfo(NewProfile,SID,false,true,True);
			}

			else if (Req.GetVariable(&quot;DelMap&quot;, &quot;&quot;) != &quot;&quot; &amp;&amp; Req.GetVariableCount(&quot;IncludeMapsSelect&quot;) &gt; 0)
			{
				Count = Req.GetVariableCount(&quot;IncludeMapsSelect&quot;);
				for (i=0; i&lt;Count; i++)
				{
					if (RequiredMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i)))) &lt; 0)
					{
						if (IncludeMaps.Count() &gt; 0)
						{
							id = ExcludeMaps.MoveFromId(IncludeMaps, IncludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i)))));
							if (id &gt;= 0)
							{
								TempPCS.RemoveMap(AllPCSMaps[int(ExcludeMaps.GetItem(id))].MapName);
								MovedMaps.CopyFromId(ExcludeMaps, id);
							}
							else
								Log(ErrorIncludeMapNotFound@Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i),LOGNAME);
						}
					}
				}
                CreateSessionInfo(NewProfile,SID,false,true,True);
			}
			else if (Req.GetVariable(&quot;AddAllMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				while (ExcludeMaps.Count() &gt; 0 &amp;&amp; (IncludeMaps.Count() &lt; TempPCS.MaxMaps || TempPCS.MaxMaps == 0) )
				{
					id = IncludeMaps.MoveFromId(ExcludeMaps, ExcludeMaps.Count()-1);
					if (id &gt;= 0)
					{
						TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(id))].MapName,int(IncludeMaps.getTag(id)));
						MovedMaps.CopyFromId(IncludeMaps, id);
					}
				}
				for (i=0;i&lt;IncludeMaps.Count();i++)
					TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(i))].MapName,i);
               CreateSessionInfo(NewProfile,SID,false,true,True);
			}
			else if (Req.GetVariable(&quot;DelAllMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				i = IncludeMaps.Count();
				while (i &gt; 0 &amp;&amp; IncludeMaps.Count() &gt; RequiredMaps.Count())
				{
					if (RequiredMaps.FindItemId(IncludeMaps.GetItem(i-1)) &lt; 0)
					{
						id =  ExcludeMaps.MoveFromId(IncludeMaps, i-1);
						if (id &gt;= 0)
						{
							TempPCS.RemoveMap(AllPCSMaps[int(ExcludeMaps.GetItem(id))].MapName);
							MovedMaps.CopyFromId(ExcludeMaps, id);
						}
					}
					i--;
				}
                CreateSessionInfo(NewProfile,SID,false,true,True);
			}
			else if (Req.GetVariable(&quot;MoveMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				MoveCount = int(Abs(float(Req.GetVariable(&quot;MoveMapCount&quot;))));
				if (MoveCount != 0)
				{
					Count = Req.GetVariableCount(&quot;IncludeMapsSelect&quot;);

					// 1) Create a sorted MovedMaps list
					for (i = 0; i&lt;Count; i++)
						MovedMaps.CopyFromId(IncludeMaps, IncludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i)))));

					if (Req.GetVariable(&quot;MoveMap&quot;) ~= &quot;Down&quot;)
					{
						// 2) Browse from Last to 0 until all maps are moved by count
						//    but stop moving them if hitting bottom
						for (i = IncludeMaps.Count()-1; i &gt;= 0; i--)
							if (MovedMaps.FindItemId(IncludeMaps.GetItem(i)) &gt;= 0)
								IncludeMaps.ShiftStrict(i, MoveCount);
					}
					else
					{
						MoveCount = -MoveCount;
						for (i = 0; i&lt;IncludeMaps.Count(); i++)
							if (MovedMaps.FindItemId(IncludeMaps.GetItem(i)) &gt;= 0)
								IncludeMaps.ShiftStrict(i, MoveCount);
					}
				}

				for (i=0;i&lt;IncludeMaps.Count();i++)
					TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(i))].MapName,i);

                CreateSessionInfo(NewProfile,SID,false,true,True);
			}

			if (TempPCS.CanEdit())
				TempPCS.StartEdit();
// Mutator Section
			Mutators.Reset();
	// Set active ServerActors
			TempMutes = LoadActiveProfileServerActors(NewProfile);
			TempStr = class'wUtils103.wArray'.static.Join(TempMutes,&quot;,&quot;);

			bAllMuts = TempMutes.Length == ConfigM.ManagedActors.Length;

			for (i=0;i&lt;AllPCSServerActors.Length;i++)
			{
				for (j = 0; j &lt; ConfigM.ManagedActors.Length; j++)
				{
					if (AllPCSServerActors[i].ActorClass ~= string(ConfigM.ManagedActors[j].SAClass))
					{
						if (AllPCSServerActors[i].bRequired)
							ReqSA.Add(string(j), ConfigM.ManagedActors[j].SAName);
						else ServerActors.Add(string(j),ConfigM.ManagedActors[j].SAName);
						break;
					}
				}
			}
			TempMutes = LoadActiveProfileMutators(NewProfile);
			TempStr = class'wUtils103.wArray'.static.Join(TempMutes,&quot;,&quot;);
		// Set Available Mutators for this profile
			bAllMuts = bAllMuts &amp;&amp; AllPCSMutators.Length == AllMutators.Length;
			for (i=0;i&lt;AllPCSMutators.Length;i++)
			{
				for (j=0;j&lt;AllMutators.Length;j++)
				{
					if (AllMutators[j].ClassName ~= AllPCSMutators[i].MutatorName)
					{
						if (AllPCSMutators[i].bRequired)
							Required.Add(string(j),AllMutators[j].FriendlyName);
						else
						{
					// Don't add available mutator if it belongs in the same group as a required mutator
							for (k=0;k&lt;Required.Count();k++)
								if (AllMutators[int(Required.GetItem(k))].GroupName ~= AllMutators[j].GroupName)
									break;
							if (k==Required.Count())
								Mutators.Add(string(j),AllPCSMutators[i].MutatorName);
						}
						break;
					}
				}
			}
// BEGIN OUTPUT ////////////////////////////////////////////
/*
	TempMutes is an array of active mutators, including required ones
	AllPCSMutators is a ProfileMutator array, which includes a required flag

	Need to generate a regular mutator selection list, but list all required
	first, followed by the list of all other mutators which are available
*/
// MAPS
			Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
			Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
			EmptyRow = &quot;&lt;tr&gt;&quot; $ WebInclude(CellColSpan) $ &quot;&lt;/tr&gt;&quot;;

			Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
			TempStr = string(TempPCS.GetMaxMaps());
			if (TempStr == &quot;0&quot;) TempStr = &quot;Unlimited&quot;;
			Res.Subst(&quot;SpecialInstructions&quot;, LabelMaxMaps$&quot;:&quot;@TempStr);
			EditRows += WebInclude(IncludeSection);

			j = RequiredMaps.Count();
			if (j &gt; 0)
			{
				EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ RequiredText @ MapText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ FollowingMaps@AreAssignedText $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
				i=0;
				while (i&lt;j)
				{
					Res.Subst(&quot;SettingName&quot;, AllPCSMaps[int(RequiredMaps.GetItem(i++))].MapName);
					Res.Subst(&quot;SettingData&quot;, StringIf(i &lt; j, AllPCSMaps[int(RequiredMaps.GetItem(i++))].MapName, &quot;&quot;));

					Res.Subst(&quot;Extra&quot;, &quot;&quot;);
					EditRows += WebInclude(IncludeRows);
				}
			}

			EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ AvailableText@MapText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ LabelChangeMaplist $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;

			Res.Subst(&quot;ExcludeMapsOptions&quot;, CreateMapListSelect(AllPCSMaps, ExcludeMaps,MovedMaps));
			Res.Subst(&quot;IncludeMapsOptions&quot;, CreateMapListSelect(AllPCSMaps, IncludeMaps,MovedMaps));
			Res.Subst(&quot;SpanContent&quot;, WebInclude(IncludeMapSelect));
			Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
			EditRows += WebInclude(RowLeft);

// MUTATORS
			CreateFullMutatorList(Mutators,GroupsOnly);
			Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
			EditRows += WebInclude(IncludeSection);

			if (ReqSA.Count() &gt; 0 || Required.Count() &gt; 0)
				EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ RequiredText@MutatorText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ FollowingMutators@AreAssignedText $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
// Include ServerActors first
			for (i=0;i&lt;ReqSA.Count();i++)
			{
				j = int(ReqSA.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, ReqSA.GetTag(i));
				Res.Subst(&quot;SettingData&quot;, ConfigM.ManagedActors[j].SADescription);
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);

				EditRows += WebInclude(IncludeRows);
			}

			for (i=0;i&lt;Required.Count();i++)
			{
				j=int(Required.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, AllMutators[j].FriendlyName);
				Res.Subst(&quot;SettingData&quot;, AllMutators[j].Description);
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);

				EditRows += WebInclude(IncludeRows);
			}

			EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ AvailableText@MutatorText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ FollowingMutators@AreAvailableText $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
			for (i=0;i&lt;GroupsOnly.Count();i++)
			{
				j=int(GroupsOnly.GetItem(i));
				if (AllMutators[j].GroupName==&quot;&quot;)
					thisgroup=&quot;Z&quot;$string(z++);
				else thisgroup = AllMutators[j].GroupName;
				if ( (i + 1) == GroupsOnly.Count())
					nextgroup = &quot;&quot;;
				else
				{
				// Assign nextgroup to the next mutators group
					k = int(GroupsOnly.GetItem(i + 1));
					if (AllMutators[k].GroupName==&quot;&quot;)
						nextgroup=&quot;Z&quot;$string(z);
					else nextgroup = AllMutators[k].GroupName;
				}

				Res.Subst(&quot;GroupName&quot;, thisgroup);
				Res.Subst(&quot;MutatorClass&quot;, AllMutators[j].ClassName);
				Res.Subst(&quot;MutatorName&quot;, AllMutators[j].FriendlyName);
				Res.Subst(&quot;MutatorDesc&quot;, AllMutators[j].Description);

				if ((lastgroup != thisgroup) &amp;&amp; (thisgroup == nextgroup)) // and the next mut is in the same group as this one
				{
					Res.Subst(&quot;Checked&quot;, &quot; checked&quot;);
					EditRows += WebInclude(&quot;current_mutators_group&quot;);
				}

				Res.Subst(&quot;Checked&quot;, StringIf(CurS.HasMutator(AllMutators[j].ClassName), &quot; checked&quot;, &quot;&quot;));
				EditRows += WebInclude(&quot;current_mutators_group_row&quot;);

				lastgroup=thisgroup;
			}
// Add ServerActors first
			for (i = 0; i &lt; ServerActors.Count(); i++)
			{
				TempStr = &quot;&quot;;
				j = int(ServerActors.GetItem(i));

				Res.Subst(&quot;Content&quot;, Checkbox(string(ConfigM.ManagedActors[j].SAClass), CurS.HasServerActor(string(ConfigM.ManagedActors[j].SAClass))) $ &quot;&amp;nbsp;&quot; $ ServerActors.GetTag(i));
				TempStr = WebInclude(NowrapLeft);
				Res.Subst(&quot;Content&quot;, ConfigM.ManagedActors[j].SADescription);
				Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));
				EditRows += WebInclude(RowLeft);
			}

			for (i = 0; i&lt;Mutators.Count(); i++)
			{
				TempStr = &quot;&quot;;
				j = int(Mutators.GetItem(i));

				Res.Subst(&quot;Content&quot;, Checkbox(AllMutators[j].ClassName,CurS.HasMutator(AllMutators[j].ClassName)) $ &quot;&amp;nbsp;&quot; $ AllMutators[j].FriendlyName);
				TempStr += WebInclude(NowrapLeft);
				Res.Subst(&quot;Content&quot;, AllMutators[j].Description);
				Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));
				EditRows += WebInclude(RowLeft);
			}
			TempPCS.EndEdit(False);
		}
	// We have no profile currently active
		else
		{
			Res.Subst(&quot;SettingName&quot;, PageCaption[0]);
			EditRows += WebInclude(IncludeRows);
		}
		Res.Subst(&quot;TableRows&quot;, EditRows);
		TempStr = &quot;&quot;;
		TempStr = WebInclude(IncludeCaptionButton)$Tmp$WebInclude(IncludeTable);

		if (NewProfile != &quot;&quot;)
		{
			Res.Subst(&quot;ButtonName&quot;, curS.getValue(&quot;ButtonName&quot;,&quot;ApplyProfileChanges&quot;));
			Res.Subst(&quot;ButtonValue&quot;, ButtonApplyProfileChanges);
			Res.Subst(&quot;PageCaption&quot;, &quot;&quot;);
			TempStr += WebInclude(IncludeCaptionButton);
		}

		Tmp = CurS.getValue(&quot;ProfileName&quot;,PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;LadderTable&quot;, 	TempStr);
		Res.Subst(&quot;Section&quot;,	 	LinkEditProfile);
		Res.Subst(&quot;SubTitle&quot;, 		Tmp);
		Res.Subst(&quot;PageHelp&quot;, 		HelpEditProfile);
		Res.Subst(&quot;PostAction&quot;, 	ProfileEditURI$&quot;?SessionID=&quot;$SID);
		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

function QueryLadderSwitch(WebRequest Req, WebResponse Res)
{
	local int 		j, NumMatches;
	local bool		bDelayChange, bSwitching;
	local Session 	CurS;
	local string 	SID,
					TempStr, Tmp,
					Checked;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID,true);

	if (CanPerform(&quot;Ls&quot;))
	{
		TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);
		Tmp = Req.GetVariable(&quot;SetNewProfile&quot;, &quot;&quot;);
		if (Tmp != &quot;&quot;)
		{
			if (TempStr != &quot;&quot;)
			{
				NumMatches = int(Req.GetVariable(&quot;NumMatches&quot;, &quot;0&quot;));
				bDelayChange = Req.GetVariable(&quot;DelaySwitch&quot;,&quot;&quot;) != &quot;&quot;;
				if (bDelayChange)
				{
					if (LadderRules.WaitApplyProfile(TempStr, NumMatches))
					{
						CurS.setValue(&quot;ProfileIndex&quot;, TempStr, True);
						bSwitching = True;
					}
				}
				else
				{
				// We would like to switch immediately
					LadderRules.ApplyProfile(TempStr, NumMatches);
					MapIsChanging();
					return;
				}
			}
			else StatusError(Res, ErrorNoProfilesExist);
		}

		else if (LadderRules.Profiles.Length &gt; 0)
		{
			j = GetCurrentConfigIndex();
			if (j &gt;= 0) TempStr = string(j);
		}

		bDelayChange = Req.GetVariable(&quot;DelaySwitch&quot;,&quot;&quot;) != &quot;&quot; || LadderRules.bWaitingToSwitch;
		if (bDelayChange)
			Checked = &quot; checked&quot;;
		else Checked = &quot;&quot;;

		Res.Subst(&quot;ProfileSelect&quot;, 		GenerateSwitchProfileOptions(TempStr));
		Res.Subst(&quot;NumberGamesText&quot;, 	LabelNumberGames);
		Res.Subst(&quot;TextName&quot;, 			&quot;NumMatches&quot;);
		Res.Subst(&quot;TextValue&quot;, 			string(NumMatches));
		Res.Subst(&quot;TextSize&quot;, 			&quot;3&quot;);
		Res.Subst(&quot;TextLength&quot;, 		&quot;3&quot;);
		Res.Subst(&quot;SwitchButtonName&quot;, 	&quot;SetNewProfile&quot;);
		Res.Subst(&quot;SwitchButtonValue&quot;, 	ButtonLoadProfile);
		Res.Subst(&quot;DelayCheckName&quot;, 	&quot;DelaySwitch&quot;);
		Res.Subst(&quot;Checked&quot;, 			Checked);
		Res.Subst(&quot;DelayCheckLabel&quot;, 	LabelDelayProfileChange);

		if (Tmp != &quot;&quot; &amp;&amp; bSwitching)
			StatusOK(Res, SuccessSwitchProfile);

		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeSwitch));
		Res.Subst(&quot;Section&quot;, 		LinkSwitchProfile);
		Res.Subst(&quot;SubTitle&quot;, 		Tmp);
		Res.Subst(&quot;PageHelp&quot;, 		HelpSwitchProfile);
		Res.Subst(&quot;PostAction&quot;, 	ProfileSwitchURI$&quot;?SessionID=&quot;$SID);

		ShowPage(Res, MasterPage);
	}
	else AccessDenied(Res);
}

function QuerySubImport(WebRequest Req, WebResponse Res)
{
	local string 					SID;
	local Session 					CurS;
	local ProfileConfigSet 			TempPCS;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID,true);
	if (CanPerform(&quot;Lm&quot;))
	{
	// We've gotten our profile - want to integrate it into the server now
		if (Req.GetVariable(&quot;ImportRemoteProfile&quot;,&quot;&quot;) != &quot;&quot;)
		{
			TempPCS = CreateImportSessionInfo(CurS);
			if (TempPCS == None)
			{
				ShowMessage(Res, ImportProfileFailTitle, ImportProfileFailText);
				return;
			}
			ShowMessage(Res, SuccessImportProfileTitle, SuccessImportProfile);
			return;
		}
	}

	else AccessDenied(Res);
}

function RemoteImport(ProfileImporter ProfileConn)
{
	local int i,j;
	local Session 	CurS;
	local string 	Tmp, TempStr,
					ImportRows,
					PackageLink,
					NewGameType, CustomGameLocation,
					NewAccessType, CustomAccessLocation,
					ImportProfileHTML,
					MapLocation, MutatorLocation, MutatorName;
	local StringArray ImportMaps, ImportMutators;

	local WebRequest 		Req;
	local WebResponse 		Res;

	Req = ProfileConn.QueryRequest;
	Res = ProfileConn.QueryResponse;

	if (Res == None)
	{
		ShowMessage(Res, ErrorText, ErrorTimeout);
		return;
	}

	switch (ProfileConn.ImportResult)
	{
	case IMPORT_BadURL: 		ShowMessage(Res,ErrorText,ErrorBadURL); 		CleanupQuery();	return;
	case IMPORT_ResolveError: 	ShowMessage(Res,ErrorText,ErrorResolve); 		CleanupQuery();	return;
	case IMPORT_BindError:		ShowMessage(Res,ErrorText,ErrorBind); 			CleanupQuery();	return;
	case IMPORT_TimeOut:		ShowMessage(Res,ErrorText,ErrorTimeout);		CleanupQuery();	return;
	case IMPORT_ServerError:	ShowMessage(Res,ErrorText,ErrorServer); 		CleanupQuery();	return;
	case IMPORT_BadRequest:		ShowMessage(Res,ErrorText,ErrorBadRequest); 	CleanupQuery();	return;
	case IMPORT_Unauthorized:	ShowMessage(Res,ErrorText,ErrorUnauthorized);	CleanupQuery();	return;
	case IMPORT_Forbidden:		ShowMessage(Res,ErrorText,ErrorForbidden);		CleanupQuery();	return;
	case IMPORT_NotFound:		ShowMessage(Res,ErrorText,ErrorNotFound); 		CleanupQuery();	return;
	case IMPORT_InvalidProfile:	ShowMessage(Res,ErrorText,ErrorProfile);		CleanupQuery();	return;
	}

	CurS = ProfileConn.ImportS;
	ImportMaps = new(None) class'SortedStringArray';
	ImportMutators = new(None) class'SortedStringArray';

// General Profile Info
	Res.Subst(&quot;SectionName&quot;, LabelGeneralProfile);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);

	Res.Subst(&quot;SettingName&quot;, LabelProfileName);
	Res.Subst(&quot;SettingData&quot;, CurS.getValue(&quot;ProfileName&quot;));
	Res.Subst(&quot;Extra&quot;,&quot;&quot;);
	ImportRows += WebInclude(IncludeRows);

// Profile Gametype Class
	NewGameType = CurS.getValue(&quot;GameType&quot;);
	CustomGameLocation = CurS.getValue(&quot;CustomGameLoc&quot;);

	if (CustomGameLocation != &quot;&quot;)
		PackageLink = &quot;&lt;a href=\&quot;&quot;$CustomGameLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$CurS.getValue(&quot;GameName&quot;)$&quot;&lt;/a&gt;&quot;;
	else PackageLink = CurS.getValue(&quot;GameName&quot;);

	Res.Subst(&quot;SettingName&quot;, LabelGameType);
	Res.Subst(&quot;SettingData&quot;, PackageLink);
	Res.Subst(&quot;Extra&quot;,&quot;&quot;);
	ImportRows += WebInclude(IncludeRows);

// Profile access control class
	NewAccessType = CurS.getValue(&quot;ACClass&quot;);
	CustomAccessLocation = CurS.getValue(&quot;CustomACLoc&quot;);

	if (CustomAccessLocation != &quot;&quot;)
		PackageLink = &quot;&lt;a href=\&quot;&quot;$CustomAccessLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$NewAccessType$&quot;&lt;/a&gt;&quot;;
	else PackageLink = NewAccessType;

	Res.Subst(&quot;SettingName&quot;, LabelAccessControl);
	Res.Subst(&quot;SettingData&quot;, PackageLink);
	Res.Subst(&quot;Extra&quot;,&quot;&quot;);
	ImportRows += WebInclude(IncludeRows);

// Map Information

	Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);

	for (i = 0; i &lt; CurS.getMapLength(); i++)
		ImportMaps.Add(string(i), string(CurS.MapOrder(i)));

	for (i = 0; i &lt; ImportMaps.Count(); i++)
	{
		TempStr = CurS.getMap( int(ImportMaps.getItem(i)) );
		MapLocation = ProfileConn.FindRemoteZipLocation(TempStr,ProfileConn.ProfileServerAddress $ ProfileConn.RemoteProfilePath);
		if (MapLocation != &quot;&quot;) PackageLink = &quot;&lt;a href=\&quot;&quot;$MapLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$TempStr$&quot;&lt;/a&gt;&quot;;
		else PackageLink = TempStr;

		if (CurS.MapRequired( TempStr ))
			TempStr = &quot;&lt;font color=\&quot;red\&quot;&gt;&quot;$RequiredText$&quot;&lt;/font&gt;&quot;;
		else TempStr = AvailableText;

		Res.Subst(&quot;SettingName&quot;, TempStr);
		Res.Subst(&quot;SettingData&quot;, PackageLink);
		Res.Subst(&quot;Extra&quot;, &quot;&quot;);
		ImportRows = ImportRows $ WebInclude(IncludeRows);
	}

// Mutator Information
	Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);

	for (i = 0; i &lt; CurS.getMutatorLength(); i++)
		ImportMutators.Add(string(i), CurS.getMutator(i));

	for (i = 0; i &lt; ImportMutators.Count(); i++)
	{
		TempStr = CurS.getMutator( int(ImportMutators.getItem(i)) );
		for (j=0;j&lt;CurS.getDataLength();j++)
		{
			CurS.getIDValue(j,MutatorName,Tmp);
			if (Tmp ~= TempStr) break;
		}

		MutatorLocation = ProfileConn.FindRemoteZipLocation(TempStr,ProfileConn.ProfileServerAddress $ ProfileConn.RemoteProfilePath);
		PackageLink = StringIf(MutatorLocation != &quot;&quot;, &quot;&lt;a href=\&quot;&quot;$MutatorLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$MutatorName$&quot;&lt;/a&gt;&quot;, MutatorName);
		TempStr = Stringif(CurS.MutRequired(TempStr), &quot;&lt;font color=\&quot;red\&quot;&gt;&quot;$RequiredText$&quot;&lt;/font&gt;&quot;, AvailableText);

		Res.Subst(&quot;SettingName&quot;, TempStr);
		Res.Subst(&quot;SettingData&quot;, PackageLink);
		Res.Subst(&quot;Extra&quot;, &quot;&quot;);
		ImportRows += WebInclude(IncludeRows);
	}

// PlayInfo Information
	Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);
	ImportRows = ImportRows $&quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;$ GeneratePlayInfoRows(Req,Res,IncludeRows);

// Build Subst's
	Res.Subst(&quot;ButtonName&quot;, &quot;ImportRemoteProfile&quot;);
	Res.Subst(&quot;ButtonValue&quot;, ButtonApplyImportProfile);
	Res.Subst(&quot;PageCaption&quot;, LabelApplyImportProfile);
	ImportProfileHTML = WebInclude(IncludeCaptionButton);

	Res.Subst(&quot;TableRows&quot;, ImportRows);
	Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeTable) $ ImportProfileHTML);

	Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
	if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
		Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

	Res.Subst(&quot;Section&quot;, LinkImportProfile);
	Res.Subst(&quot;SubTitle&quot;, Tmp);
	Res.Subst(&quot;PageHelp&quot;, HelpImportProfile);
	Res.Subst(&quot;PostAction&quot;, SubImportURI$&quot;?SessionID=&quot;$CurS.getHash());
	ShowPage(Res, MasterPage);
	CleanupQuery();
}

function QuerySubExport(WebRequest Req, WebResponse Res)
{
	local int i,j;
	local PlayInfo 	TempPI;
	local FileLog 	EProfile;
	local Session 	CurS;
	local string 	SID, Logname,
					TempStr, Tmp,
					dataname, datavalue,
					ProfileIndex, NewGameType,
					ExportRows, Location;

	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local class&lt;Mutator&gt;		TempMut;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local class&lt;Info&gt;			TempSA;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;
	local StringArray Mutators,GroupsOnly;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID,true);
		ProfileIndex = Req.GetVariable(&quot;ProfileNameSelect&quot;, CurS.getValue(&quot;ProfileIndex&quot;));

        CreateSessionInfo(ProfileIndex,SID,True);
		Logname = CurS.getValue(&quot;Logname&quot;,Req.GetVariable(&quot;TextInput&quot;));
		if (Logname == &quot;&quot;)
			Logname = CurS.getValue(&quot;ProfileName&quot;);

		CurS.setValue(&quot;Logname&quot;,Logname,True);
		for (i=0;i&lt;CurS.getMutatorLength();i++)
		{
			TempStr = CurS.getMutator(i);
			if (EpicPackage(TempStr))
				continue;
			if (Req.GetVariable(&quot;Save&quot;$TempStr,&quot;&quot;) != &quot;&quot;)
				SetLocation(TempStr,Req.GetVariable(TempStr));
		}

		for (i=0;i&lt;CurS.getMapLength();i++)
		{
			TempStr = CurS.getMap(i);
			if (EpicPackage(TempStr))
				continue;
			if (Req.GetVariable(&quot;Save&quot;$TempStr,&quot;&quot;) != &quot;&quot;)
				SetLocation(TempStr,Req.GetVariable(TempStr));
		}

		NewGameType = CurS.getValue(&quot;GameType&quot;);
		if (NewGameType != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(NewGameType,class'Class'));
		if (GIClass==None)
		{
			ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;, Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowMessage(Res,ErrorAccessControlTitle,ErrorAccessControlText);
			return;
		}

		if (Req.GetVariable(&quot;Export&quot;,&quot;&quot;)!=&quot;&quot;)
		{
		// Write file locations to .ini
			EProfile = Level.Spawn(class'FileLog');
			if (EProfile == None)
			{
				ShowMessage(Res, ErrorText, ErrorExportingProfile);
				return;
			}

			EProfile.OpenLog(RemoveStr(CurS.getValue(&quot;Logname&quot;),&quot; &quot;));
			EProfile.Logf(&quot;Profile:&quot;$CurS.getValue(&quot;ProfileName&quot;)$Chr(21)$CurS.getValue(&quot;GameType&quot;)$Chr(21)$CurS.getValue(&quot;MaxMaps&quot;)$Chr(21)$GIClass.default.GameName$Chr(21)$string(ACClass));

			for (i=0;i&lt;CurS.getMapLength();i++)
			{
				TempStr = CurS.getMap(i);

				if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
					Location = Chr(21) $ Req.GetVariable(TempStr);
				else Location = &quot;&quot;;

				EProfile.Logf(&quot;Map:&quot;$TempStr$Chr(21)$CurS.MapOrder(i)$Chr(21)$CurS.MapRequired(TempStr)$Location);
			}

			for (i=0;i&lt;CurS.getSALength();i++)
			{
				TempStr = CurS.getServerActor(i);
				for (j=0;j&lt;ConfigM.ManagedActors.Length;j++)
					if (string(ConfigM.ManagedActors[j].SAClass) ~= TempStr)
						DataName = ConfigM.ManagedActors[j].SAName;

				if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
					Location = Chr(21) $ Req.GetVariable(TempStr);
				else Location = &quot;&quot;;

				EProfile.Logf(&quot;Mutator:&quot;$DataName$Chr(21)$TempStr$Chr(21)$CurS.SARequired(TempStr)$Location);
			}

			for (i=0;i&lt;CurS.getMutatorLength();i++)
			{
				TempStr = CurS.getMutator(i);
				for (j=0;j&lt;AllMutators.Length;j++)
					if (AllMutators[j].ClassName == TempStr)
						DataName = AllMutators[j].FriendlyName;

				if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
					Location = Chr(21) $ Req.GetVariable(TempStr);
				else Location = &quot;&quot;;

				EProfile.Logf(&quot;Mutator:&quot;$DataName$Chr(21)$TempStr$Chr(21)$CurS.MutRequired(TempStr)$Location);
			}

			i=0;
			j=0;
			while (i&lt;CurS.getDataLength())
			{
				CurS.getIdValue(i,dataname,datavalue);
				if (InStr(dataname,&quot;.&quot;) != -1)
					EProfile.Logf(&quot;Data:&quot;$DataName$Chr(21)$DataValue);
				i++;
			}
			EProfile.Destroy();
			ShowMessage(Res, SuccessText, SuccessExportProfile$RemoveStr(LogName,&quot; &quot;)$&quot;.txt&quot;);
			return;
		}


	// Mutator Section
		Mutators = new(None) class'SortedStringArray';
		GroupsOnly = new(None) class'SortedStringArray';
		for (i=0;i&lt;CurS.getMutatorLength();i++)
		{
		    TempStr = CurS.getMutator(i);
            for (j=0;j&lt;AllMutators.Length;j++)
				if (TempStr ~= AllMutators[j].ClassName)
					Mutators.Add(string(j), AllMutators[j].FriendlyName);
			TempMut = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (TempMut != None)
				MClass[MClass.Length] = TempMut;
		}

		Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
		Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
		ExportRows += WebInclude(IncludeSection);

		for (i = 0; i&lt;Mutators.Count(); i++)
		{
			j = int(Mutators.GetItem(i));

			Res.Subst(&quot;SettingName&quot;, AllMutators[j].FriendlyName);
			if (EpicPackage(AllMutators[j].ClassName))
				Res.Subst(&quot;SettingData&quot;, &quot;&quot;);
			else Res.Subst(&quot;SettingData&quot;, Textbox(AllMutators[j].ClassName,Min(Max(GetLongestURL(),16),64),128,GetLocation(AllMutators[j].ClassName)) $ &quot;&amp;nbsp;&amp;nbsp;&quot; $ SubmitButton(&quot;Save&quot;$AllMutators[j].ClassName,ProfileButtonName[0]));

			Res.Subst(&quot;Extra&quot;, &quot;&quot;);
			ExportRows += WebInclude(IncludeRows);
		}

		for (i=0;i&lt;CurS.getSALength();i++)
		{
			TempStr = CurS.getServerActor(i);
			if (TempStr != &quot;&quot;)
			{
				TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'class'));
				if (TempSA != None)
					SAClass[SAClass.Length] = TempSA;
			}
		}

		TempPI = new(None) class'PlayInfo';
		LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);

		Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
		Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
		ExportRows += WebInclude(IncludeSection);

		Res.Subst(&quot;SettingName&quot;, LabelMaxMaps);
		TempStr = CurS.getValue(&quot;MaxMaps&quot;);
		if (TempStr == &quot;0&quot;)
			TempStr = UnlimitedText;
		Res.Subst(&quot;SettingData&quot;, TempStr);
		Res.Subst(&quot;Extra&quot;, &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;);
		ExportRows += WebInclude(IncludeRows);

// Map Section
		for (i=0;i&lt;CurS.getMapLength();i++)
		{
            TempStr = CurS.getMap(i);
            Res.Subst(&quot;SettingName&quot;, TempStr);
			Res.Subst(&quot;Extra&quot;, &quot;&quot;);
			if (EpicPackage(TempStr))
				Res.Subst(&quot;SettingData&quot;, &quot;&quot;);
			else Res.Subst(&quot;SettingData&quot;, Textbox(TempStr,Min(Max(GetLongestURL(),16),64),128,GetLocation(TempStr)) $ &quot;&amp;nbsp;&amp;nbsp;&quot; $ SubmitButton(&quot;Save&quot;$TempStr,ProfileButtonName[0]));

			ExportRows += WebInclude(IncludeRows);
		}

// PlayInfo section
		Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
		Res.Subst(&quot;SpecialInstructions&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		ExportRows += WebInclude(IncludeSection);
		ExportRows += (&quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot; $ GeneratePlayInfoRows(Req, Res, IncludeRows));
		ExportRows += (&quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&quot;$LabelApplyExportProfile$&quot;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&quot;$SubmitButton(&quot;Export&quot;,ButtonApplyExportProfile)$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);

		Res.Subst(&quot;TableRows&quot;, ExportRows);
		Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeTable));

		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;Section&quot;, LinkExportProfile);
		Res.Subst(&quot;PageHelp&quot;, HelpExportProfile);
		Res.Subst(&quot;SubTitle&quot;, Tmp);
		Res.Subst(&quot;PostAction&quot;, SubExportURI$&quot;?SessionID=&quot;$SID);
		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

//****************************************************************
//****************************************************************
// Query subpages for Add &amp; Manage Modules
//
//

// Page 0
function QueryLadderManage(WebRequest Req, WebResponse Res)
{
	local string 	HeaderRows, ManagementRows,
					TempStr, Tmp, SID;
	local bool		bAdd, bModify, bCopy, bDelete, bImport, bExport;
	local Session 	CurS;
	local ProfileImporter ProfileConn;

	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, True);

		// Submit button was pressed
		if (Req.GetVariable(ProfileButtonName[0], &quot;&quot;) != &quot;&quot;)
		{
			switch (Req.GetVariable(&quot;Actions&quot;,&quot;&quot;))
			{
				case &quot;Add&quot;:
					bAdd = True;
					QuerySubFrame(Req, Res);
					break;

				case &quot;Modify&quot;:
					bModify = True;
					TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;);
					if (TempStr == &quot;&quot;)
					{
						StatusError(Res, ErrorNoProfilesExist);
						break;
					}
					QuerySubFrame(Req, Res);
					return;

				case &quot;Copy&quot;:
					bCopy = True;
					Tmp = Req.GetVariable(&quot;ProfileNameSelect&quot;);
					if (Tmp == &quot;&quot;)
						StatusError(Res, ErrorNoProfilesExist);

					TempStr = Req.GetVariable(&quot;TextInput&quot;);
					if (TempStr == &quot;&quot;)
					{
						StatusError(Res, ErrorCopyNoName);
						break;
					}

					if (LadderRules.CopyProfile(int(Tmp),TempStr))
						StatusOK(Res,SuccessCopyProfile);
					else StatusError(Res, ErrorCopyFrom);
					break;

				case &quot;Delete&quot;:
					bDelete = True;
					TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;);
					if (TempStr != &quot;&quot;)
					{
						if (LadderRules.RemoveProfile(int(TempStr)))
							StatusOK(Res, SuccessDeleteProfile);
						else StatusError(Res, ErrorDeletingProfile);
					}
					else StatusError(Res, ErrorNoProfilesExist);
					break;

				case &quot;Import&quot;:
					bImport = True;
					TempStr = Req.GetVariable(&quot;TextInput&quot;,&quot;&quot;);
					if (!(Left(TempStr,7) ~= &quot;http://&quot;))
					{
						StatusError(Res, ErrorBadURL);
						break;
					}

				// Spawn class to handle network interaction to receive remote profile
					ProfileConn = Level.Spawn(Class'ProfileImporter');
					If (ProfileConn == None)
					{
						ShowMessage(Res, ErrorText, ImportClassSpawnError);
						return;
					}

				// Assign local connection objects to importer class
					ProfileConn.QueryPage = Self;
					ProfileConn.QueryRequest = Req;
					ProfileConn.QueryResponse = Res;

				// Setting bDelayCleanup prevents the connection from being closed
				// when QueryProfileImport() returns to Query()
				// Set this prior to initializing connection, to ensure correct behavior
					Res.Connection.bDelayCleanup = True;

				// Initialize connection to foreign host, pass Importer class a Session
				// object to allow it to build a profile config set.
					ProfileConn.Connect(TempStr, CurS);
					return;

				case &quot;Export&quot;:
					bExport = True;
					TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);
					if (TempStr == &quot;&quot;)
					{
						StatusError(Res, ErrorNoProfilesExist);
						break;
					}
					QuerySubExport(Req,Res);
					return;

				default:
					bModify = True;
			}
		}

	// Output code -
	// TODO: move to .inc file
		HeaderRows = &quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$LabelChooseAction$&quot;&lt;/td&gt;&lt;td nowrap&gt;&quot;$LabelInputDescription$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
	    ManagementRows += (&quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$RadioButton(&quot;Actions&quot;, &quot;Add&quot;, bAdd)$LabelAddProfile$&quot;&lt;br&gt;&quot;);
		ManagementRows += (RadioButton(&quot;Actions&quot;, &quot;Modify&quot;, bModify)$LabelModifyProfile$&quot;&lt;/td&gt;&quot;);
		ManagementRows += (&quot;&lt;td&gt;&lt;select class=mini name='ProfileNameSelect'&gt;&quot;$GenerateSwitchProfileOptions(TempStr)$&quot;&lt;/select&gt;&amp;nbsp;&quot;$LabelSelectActions$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);
		ManagementRows += (&quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$RadioButton(&quot;Actions&quot;, &quot;Copy&quot;, bCopy)$LabelCopyProfile$&quot;&lt;br&gt;&quot;);
		ManagementRows += (RadioButton(&quot;Actions&quot;, &quot;Delete&quot;, bDelete)$LabelDeleteProfile$&quot;&lt;/td&gt;&quot;);
		ManagementRows += (&quot;&lt;td nowrap&gt;&quot;$Textbox(&quot;TextInput&quot;,64,128)$&quot;&amp;nbsp;&quot;$LabelTextboxActions$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);
		ManagementRows += (&quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$RadioButton(&quot;Actions&quot;, &quot;Import&quot;, bImport)$LabelImportProfile$&quot;&lt;br&gt;&quot;);
		ManagementRows += (RadioButton(&quot;Actions&quot;, &quot;Export&quot;, bExport)$LabelExportProfile$&quot;&lt;/td&gt;&quot;);
		ManagementRows += (&quot;&lt;td&gt;&quot;$SubmitButton(ProfileButtonName[0],ProfileButtonValue[0])$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);

		Res.Subst(&quot;TableTitle&quot;, TableTitle[0]);
		Res.Subst(&quot;HeaderRow&quot;, HeaderRows);
		Res.Subst(&quot;TableRows&quot;,ManagementRows);

		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp @= (LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches()));

		Res.Subst(&quot;Section&quot;, LabelManagement);
		Res.Subst(&quot;PageHelp&quot;, HelpManageProfile);
		Res.Subst(&quot;SubTitle&quot;, Tmp);
		Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeTable));
		Res.Subst(&quot;PostAction&quot;, ProfileManageURI);
		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

// Page 1
function QuerySubGameType(WebRequest Req, WebResponse Res)
{
	local int i;
	local string DataName, DataValue, SID, NewName, OldName;
	local string GameTypeRows, OldGameType, CommandLineRows;
	local string GameTypeTable, CommandLineTable, ApplyTable;
	local Session CurS;
	local LadderProfiles LadderMaster;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, true);

        if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
    	{
    		NewName = Req.GetVariable(&quot;NewProfile&quot;,DefaultProfileName);
    		OldName = CurS.getValue(&quot;ProfileName&quot;);
    		if ((OldName != &quot;&quot; &amp;&amp; !(OldName ~= NewName)) || OldName == &quot;&quot;)
    		{
	    		for (i=0;i&lt;LadderRules.Profiles.Length;i++)
	    		{
	    			if (NewName ~= LadderRules.Profiles[i].ProfileName)
	    			{
	    				StatusError(Res, ErrorSameProfileName);
	    				NewName = DefaultProfileName;
	    				break;
	    			}
	    		}
	    	}
			CurS.setValue(&quot;ProfileName&quot;, NewName, true);
			CurS.setValue(&quot;GameType&quot;, Req.GetVariable(&quot;NewGameType&quot;), True, OldGameType);
			if (!(OldGameType ~= CurS.getValue(&quot;GameType&quot;)))
			{
				CurS.ClearMaps();
			// Reset all stored PlayInfo information
				for (i=0;i&lt;CurS.getDataLength();i++)
				{
					CurS.getIDValue(i,DataName,DataValue);
					if (InStr(DataName, &quot;.&quot;) != -1)
					{
						CurS.delValue(DataName);
						i--;
					}
				}
			}
		}

		Res.Subst(&quot;NewProfileName&quot;, CurS.getValue(&quot;ProfileName&quot;, DefaultProfileName));
		GameTypeRows = WebInclude(IncludeProfileName);

		for (i=0;i&lt;AGameType.Count();i++)
		{
			Res.Subst(&quot;GameTypeClass&quot;, 	AGameType.GetItem(i));
			Res.Subst(&quot;GameTypeName&quot;, 	AGameType.GetTag(i));
			Res.Subst(&quot;Selected&quot;, 		StringIf(CurS.getValue(&quot;GameType&quot;) ~= AGameType.GetItem(i), &quot; checked&quot;, &quot;&quot;));
			GameTypeRows += WebInclude(IncludeGameType);
		}

	// Fill in caption table values
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;, PageCaption[1]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[1]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[1]));

  		Res.Subst(&quot;TableRows&quot;, 		GameTypeRows);
		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.GetValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 2
function QuerySubMutators(WebRequest Req, WebResponse Res)
{
	local int i,j;
	local bool 		bAllMuts,
					bClearMuts,
					bChecked;
	local string 	MutatorRows,
					SID, TempStr;

	local Session CurS;
	local StringArray Mutators, ServerActors;
	local class&lt;Mutator&gt; MutClass;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, true);

		if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
		{
			bAllMuts = Req.GetVariable(&quot;AllowAllMutators&quot;)!=&quot;&quot;;
			bClearMuts = Req.GetVariable(&quot;ClearAllMutators&quot;)!=&quot;&quot;;
//			CurS.ClearMutators();

			for (i=0;i&lt;ConfigM.ManagedActors.Length;i++)
			{
				TempStr = string(ConfigM.ManagedActors[i].SAClass);
				if (bAllMuts || (!bClearMuts &amp;&amp; Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;))
					CurS.setServerActor(TempStr, True, CurS.SARequired(TempStr));
				else CurS.delServerActor(TempStr);
			}

			for (i=0;i&lt;AllMutators.Length;i++)
			{
				if (bAllMuts || (!bClearMuts &amp;&amp; (Req.GetVariable(AllMutators[i].ClassName,&quot;&quot;)!=&quot;&quot; || Req.GetVariable(AllMutators[i].GroupName)~=AllMutators[i].ClassName)))
					CurS.setMutator(AllMutators[i].ClassName,true,CurS.MutRequired(AllMutators[i].ClassName));
				else if (Req.GetVariable(AllMutators[i].GroupName) ~= &quot;None&quot;)
					CurS.setMutator(AllMutators[i].GroupName,true);
				else
				{
					CurS.delMutator(AllMutators[i].ClassName);
					CurS.delMutator(AllMutators[i].GroupName);
				}
			}
		}

		Mutators = new(None) class'SortedStringArray';
		ServerActors = new(None) class'SortedStringArray';
//		GroupsOnly = new(None) class'SortedStringArray';
		for (i = 0; i&lt;AllMutators.Length; i++)
		{
			MutClass = class&lt;Mutator&gt;(DynamicLoadObject(AllMutators[i].ClassName, class'Class'));
			if (MutClass != None)
				Mutators.Add(string(i),AllMutators[i].FriendlyName);
		}

		for (i=0;i&lt;ConfigM.ManagedActors.Length;i++)
			if (ConfigM.ManagedActors[i].SAClass != None)
				ServerActors.Add(string(i),ConfigM.ManagedActors[i].SAName);

// Uncomment this to allow mutators to be grouped according to MutatorGroup
/*
		CreateFullMutatorList(Mutators,GroupsOnly);

		for (i=0;i&lt;CurS.GetMutatorLength();i++)
		{
			k = 0-1;
			for (j=0;j&lt;AllMutators.Length;j++)
				if (CurS.GetMutator(i) ~= AllMutators[j].ClassName)
					break;
			if (j&lt;AllMutators.Length) k = GroupsOnly.FindItemId(string(j));
			if (k &gt;= 0)
			{
				for (z=0;z&lt;TempA.Length;z++)
				{
					if (TempA[z] ~= AllMutators[j].GroupName)
					{
						bAllMuts = True;
						break;
					}
				}

				if (!bAllMuts) TempA[TempA.Length] = AllMutators[j].GroupName;
			}
			if (bAllMuts)
       			break;
		}

		lastgroup = &quot;&quot;;
		thisgroup = &quot;&quot;;
		nextgroup = &quot;&quot;;
		MutatorRows=&quot;&quot;;

		for (i=0;i&lt;GroupsOnly.Count();i++)
		{
			j=int(GroupsOnly.GetItem(i));
			if (AllMutators[j].GroupName==&quot;&quot;)
				thisgroup=&quot;Z&quot;$string(z++);
			else thisgroup = AllMutators[j].GroupName;
			if ( (i + 1) == GroupsOnly.Count())
				nextgroup = &quot;&quot;;
			else
			{
			// Assign nextgroup to the next mutators group
				k = int(GroupsOnly.GetItem(i + 1));
				if (AllMutators[k].GroupName==&quot;&quot;)
					nextgroup=&quot;Z&quot;$string(z);
				else nextgroup = AllMutators[k].GroupName;
			}

			Res.Subst(&quot;GroupName&quot;, thisgroup);
			Res.Subst(&quot;MutatorClass&quot;, AllMutators[j].ClassName);
			Res.Subst(&quot;MutatorName&quot;, AllMutators[j].FriendlyName);
			Res.Subst(&quot;MutatorDesc&quot;, AllMutators[j].Description);

			if ((lastgroup != thisgroup) &amp;&amp; (thisgroup == nextgroup)) // and the next mut is in the same group as this one
			{
				if (bAllMuts||CurS.HasMutator(thisgroup)) Res.Subst(&quot;Checked&quot;, &quot;checked&quot;);
				MutatorRows = MutatorRows$WebInclude(&quot;current_mutators_group&quot;);
			}
			else
			{
				if (CurS.HasMutator(AllMutators[j].ClassName) &amp;&amp; !bAllMuts) Res.Subst(&quot;Checked&quot;, &quot;checked&quot;); else Res.Subst(&quot;Checked&quot;, &quot;&quot;);
				MutatorRows = MutatorRows$WebInclude(&quot;current_mutators_group_row&quot;);
			}

			lastgroup=thisgroup;
		}
*/
		bAllMuts = True;
		for (i = 0; i&lt;ServerActors.Count(); i++)
		{
			TempStr = &quot;&quot;; bChecked = False;
			j = int(ServerActors.GetItem(i));

			if (CurS.HasServerActor(string(ConfigM.ManagedActors[j].SAClass)))
				bChecked = True;
			else if (bAllMuts) bAllMuts = False;

			Res.Subst(&quot;Content&quot;, Checkbox(string(ConfigM.ManagedActors[j].SAClass),bChecked) $ &quot;&amp;nbsp;&quot; $ ServerActors.GetTag(i));
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, ConfigM.ManagedActors[j].SADescription);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));

			MutatorRows += WebInclude(RowLeft);
		}

		for (i = 0; i&lt;Mutators.Count(); i++)
		{
			TempStr = &quot;&quot;; bChecked = False;
			j = int(Mutators.GetItem(i));

			if (CurS.HasMutator(AllMutators[j].ClassName))
				bChecked = True;
			else if (bAllMuts) bAllMuts = False;

			Res.Subst(&quot;Content&quot;, CheckBox(AllMutators[j].ClassName, bChecked) $ &quot;&amp;nbsp;&quot; $ AllMutators[j].FriendlyName);
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, AllMutators[j].Description);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));

			MutatorRows += WebInclude(RowLeft);
		}

		if (bAllMuts)
			Res.Subst(&quot;Content&quot;, Checkbox(&quot;ClearAllMutators&quot;, False)@LabelUncheckAllMutator);
		else
			Res.Subst(&quot;Content&quot;, Checkbox(&quot;AllowAllMutators&quot;, False)@LabelCheckAllMutator);
		Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
		Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
		MutatorRows += WebInclude(RowLeft);

		Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft));
		MutatorRows += WebInclude(RowLeft);

		Res.Subst(&quot;TableRows&quot;, MutatorRows);
	// Fill in caption table values
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;, PageCaption[2]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[2]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[2]));

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.GetValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page3
function QuerySubMaps(WebRequest Req, WebResponse Res)
{
	local int i;
	local string 	SID,
					MapRows,
					TempStr, Temp,
					CheckString;
	local bool 		bAllMaps,
					bClearMaps,
					bChecked;

	local Session CurS;
	local StringArray SortedMaps;
	local array&lt;string&gt; TempMaps;
	local class&lt;GameInfo&gt; GIClass;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID);

		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}
		// Build a string array of maps valid for this gametype.
		GIClass.static.LoadMapList(GIClass.default.MapPrefix, TempMaps);

		if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
		{
			bAllMaps = Req.GetVariable(&quot;AllowAllMaps&quot;,&quot;&quot;)!=&quot;&quot;;
			bClearMaps = Req.GetVariable(&quot;ClearAllMaps&quot;,&quot;&quot;)!=&quot;&quot;;

			for (i=0;i&lt;TempMaps.Length;i++)
				if (bAllMaps || (!bClearMaps &amp;&amp; Req.GetVariable(TempMaps[i])!=&quot;&quot;))
					CurS.setMap(TempMaps[i],0,True,CurS.MapRequired(TempMaps[i]));
				else CurS.delMap(TempMaps[i]);
		}
		// Add the map name array to a sorted string array for sorting
		SortedMaps = new(None) class'SortedStringArray';
		for(i=0;i&lt;TempMaps.Length;i++)
			SortedMaps.Add(string(i),TempMaps[i]);

		bAllMaps = True;
		// Now build the map rows
		for (i=0;i&lt;SortedMaps.Count();i++)
		{
			Temp = &quot;&quot;; bChecked = False;
			TempStr = SortedMaps.GetTag(i);
			if (CurS.HasMap(TempStr))
				bChecked = True;
			else if (bAllMaps) bAllMaps = False;

			Res.Subst(&quot;Content&quot;, Checkbox(TempStr, bChecked) $ &quot;&amp;nbsp;&quot; $ TempStr);
			Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft));
		// Build string for javascript function
			if (CheckString!=&quot;&quot;)
				CheckString += &quot;','&quot;;
			CheckString += TempStr;

			MapRows += WebInclude(RowLeft);
		}

	// Fill Javascript substs
		Res.Subst(&quot;JavaScripts&quot;,&quot;&lt;script language=\&quot;JavaScript\&quot; type=\&quot;text/JavaScript\&quot;&gt;function MM_findObj(n,d){var p,i,x;if(!d)d=document;if((p=n.indexOf(\&quot;?\&quot;))&gt;0&amp;&amp;parent.frames.length){d=parent.frames[n.substring(p+1)].document;n=n.substring(0,p);}if(!(x=d[n])&amp;&amp;d.all)x=d.all[n];for(i=0;!x&amp;&amp;i&lt;d.forms.length;i++)x=d.forms[i][n];for(i=0;!x&amp;&amp;d.layers&amp;&amp;i&lt;d.layers.length;i++)x=MM_findObj(n,d.layers[i].document);if(!x&amp;&amp;d.getElementById)x=d.getElementById(n);return x;}function CheckMaps(){var maps=CheckMaps.arguments;var MapChecked=false;for(var i=0;i&lt;maps.length;i++){var myObj=MM_findObj(maps[i]);if(myObj.checked==true){MapChecked=true}}if(MapChecked==false){alert('You must check at least one map to continue!')}document.MM_returnValue=(MapChecked);}&lt;/script&gt;&quot;);
		Res.Subst(&quot;JCheck&quot;,&quot; onClick=\&quot;CheckMaps('AllowAllMaps','&quot;$CheckString$&quot;');return document.MM_returnValue\&quot;&quot;);
		Res.Subst(&quot;Checked&quot;,&quot;&quot;);

		if (bAllMaps)
			Res.Subst(&quot;Content&quot;, Checkbox(&quot;ClearAllMaps&quot;, False) @ LabelUncheckAllMap);
		else Res.Subst(&quot;Content&quot;, Checkbox(&quot;AllowAllMaps&quot;, False) @ LabelCheckAllMap);

		Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
		Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
		MapRows += WebInclude(RowLeft);

		Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft));
		MapRows += WebInclude(RowLeft);

		// Set ladder_caption_table subst's
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;,PageCaption[3]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[3]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[3]));

		Res.Subst(&quot;TableRows&quot;, MapRows);

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.getValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 4
function QuerySubRules(WebRequest Req, WebResponse Res)
{
	local int i;
	local string 	TempStr,
					SID;
	local Session 	CurS;
	local PlayInfo 	TempPI;
	local class&lt;Mutator&gt; 		TempClass;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local class&lt;Info&gt;			TempSA;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;

	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.GetSession(SID);

		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;, Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowFramedMessage(Res,ErrorAccessControlText,True);
			return;
		}

		if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
		{
			for (i=0;i&lt;CurS.GetMutatorLength();i++)
			{
				TempStr = CurS.getMutator(i);
				if (TempStr != &quot;&quot;)
				{
					TempClass = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
					if (TempClass != None)
						MClass[MClass.Length] = TempClass;
				}
			}

			TempPI = new(None) class'PlayInfo';
			for (i=0;i&lt;CurS.getSALength(); i++)
			{
				TempStr = CurS.getServerActor(i);
				if (TempStr != &quot;&quot;)
				{
					TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
					if (TempSA != None)
						SAClass[SAClass.Length] = TempSA;
				}
			}

			LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);
			for (i=0;i&lt;TempPI.Settings.Length;i++)
			{
				if (!SettingIsAllowed(TempPI.Settings[i].SecLevel)) continue;
				TempStr = Req.GetVariable(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value);

				if (TempPI.Settings[i].RenderType == &quot;Text&quot;)
					CheckSettingValue(TempPI.Settings[i].Data, TempStr);

				CurS.setValue(TempPI.Settings[i].SettingName,TempStr,true);
			}
		}

		Res.Subst(&quot;TableRows&quot;,		GeneratePlayInfoRows(Req, Res, &quot;defaults_row&quot;));

		// Set ladder_caption_table subst's
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;,PageCaption[4]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[4]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[4]));

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.getValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 5
function QuerySubReview(WebRequest Req, WebResponse Res)
{
	local int i,j,k,z;
	local string 	SID,
					TempStr, TempSA,
					ReviewRows,
					thisgroup, lastgroup, nextgroup;

	local Session CurS;
	local StringArray Mutators, GroupsOnly;
	local class&lt;Mutator&gt; 		TempClass;
	local class&lt;Info&gt;			TempSAClass;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;

	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID);

		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowFramedMessage(Res,ErrorAccessControlText,True);
			return;
		}

		Mutators = new(None) class'SortedStringArray';
		GroupsOnly = new(None) class'SortedStringArray';
		for (i = 0; i&lt;AllMutators.Length; i++)
		{
			if (CurS.HasMutator(AllMutators[i].ClassName)||CurS.HasMutator(AllMutators[i].GroupName))
			{
				TempClass = class&lt;Mutator&gt;(DynamicLoadObject(AllMutators[i].ClassName, class'Class'));
				if (TempClass != None)
				{
					MClass[MClass.Length] = TempClass;
					Mutators.Add(string(i),AllMutators[i].FriendlyName);
				}
			}
		}

		CreateFullMutatorList(Mutators,GroupsOnly);
		lastgroup = &quot;&quot;; thisgroup = &quot;&quot;; nextgroup = &quot;&quot;;

		Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
		Res.Subst(&quot;SpecialInstructions&quot;, LabelRequiredMutators);
		ReviewRows += WebInclude(IncludeSection);

		for (i=0;i&lt;GroupsOnly.Count();i++)
		{
			j=int(GroupsOnly.GetItem(i));

			if (AllMutators[j].GroupName==&quot;&quot;)
				thisgroup=&quot;Z&quot;$string(z++);
			else thisgroup = AllMutators[j].GroupName;

			if ( (i + 1) == GroupsOnly.Count())
				nextgroup = &quot;&quot;;
			else
			{
			// Assign nextgroup to the next mutators group
				k = int(GroupsOnly.GetItem(i + 1));
				if (AllMutators[k].GroupName==&quot;&quot;)
					nextgroup=&quot;Z&quot;$string(z);
				else nextgroup = AllMutators[k].GroupName;
			}

			Res.Subst(&quot;GroupName&quot;, thisgroup);
			Res.Subst(&quot;MutatorClass&quot;, AllMutators[j].ClassName);
			Res.Subst(&quot;MutatorName&quot;, AllMutators[j].FriendlyName);
			Res.Subst(&quot;MutatorDesc&quot;, AllMutators[j].Description);

			if ((lastgroup != thisgroup) &amp;&amp; (thisgroup == nextgroup)) // and the next mut is in the same group as this one
			{
                Res.Subst(&quot;Checked&quot;, &quot; checked&quot;);
				ReviewRows += WebInclude(&quot;current_mutators_group&quot;);
			}

			Res.Subst(&quot;Checked&quot;, StringIf(CurS.MutRequired(AllMutators[j].ClassName), &quot; checked&quot;, &quot;&quot;));
			ReviewRows += WebInclude(&quot;current_mutators_group_row&quot;);

			lastgroup=thisgroup;
		}

		for (i = 0; i&lt;Mutators.Count(); i++)
		{
			TempStr = &quot;&quot;;
			j = int(Mutators.GetItem(i));

			Res.Subst(&quot;Content&quot;, CheckBox(AllMutators[j].ClassName, CurS.MutRequired(AllMutators[j].ClassName)) $ &quot;&amp;nbsp;&quot; $ AllMutators[j].FriendlyName);
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, AllMutators[j].Description);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));

			ReviewRows += WebInclude(RowLeft);
		}

		Mutators.Reset();
		for (i = 0; i &lt; ConfigM.ManagedActors.Length; i++)
		{
			TempSA = string(ConfigM.ManagedActors[i].SAClass);
			if (CurS.HasServerActor(TempSA))
			{
				TempSAClass = class&lt;Info&gt;(DynamicLoadObject(TempSA,class'Class'));
				if (TempSAClass != None)
					Mutators.Add(string(i),ConfigM.ManagedActors[i].SAName);
			}
		}
		lastgroup = &quot;&quot;;
		Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
		Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
		lastgroup = WebInclude(RowLeft);
		ReviewRows += lastgroup;

		for (i=0;i&lt;Mutators.Count();i++)
		{
			TempStr = &quot;&quot;;
			j = int(Mutators.GetItem(i));

			Res.Subst(&quot;Content&quot;, Checkbox(string(ConfigM.ManagedActors[j].SAClass), CurS.SARequired(string(ConfigM.ManagedActors[j].SAClass))) $ &quot;&amp;nbsp;&quot; $ Mutators.GetTag(i));
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, ConfigM.ManagedActors[j].SADescription);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));
			ReviewRows += WebInclude(RowLeft);
		}

		Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
		Res.Subst(&quot;SpecialInstructions&quot;, LabelRequiredMaps);
		ReviewRows += WebInclude(IncludeSection);

		Res.Subst(&quot;SettingName&quot;, LabelMaxMaps);
		Res.Subst(&quot;SettingData&quot;, Textbox(&quot;MaxMaps&quot;, 3, 3, CurS.getValue(&quot;MaxMaps&quot;,&quot;3&quot;)));
		Res.Subst(&quot;Extra&quot;, lastgroup);
		ReviewRows += WebInclude(IncludeRows);
		for (i=0;i&lt;CurS.GetMapLength();i++)
		{
			Res.Subst(&quot;SettingName&quot;, CurS.getMap(i));
			Res.Subst(&quot;Extra&quot;, &quot;&quot;);
			Res.Subst(&quot;SettingData&quot;, Checkbox(CurS.getMap(i), CurS.MapRequired(CurS.getMap(i))));

			ReviewRows += WebInclude(IncludeRows);
		}

		Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
		Res.Subst(&quot;SpecialInstructions&quot;, LabelPlayInfo);
		Res.Subst(&quot;Extra&quot;, lastgroup);
		ReviewRows += WebInclude(IncludeSection);

		ReviewRows += (lastgroup $ GeneratePlayInfoRows(Req, Res, IncludeRows));
		Res.Subst(&quot;TableRows&quot;, ReviewRows);

	// Set ladder_caption_table subst's
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;,PageCaption[5]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[5]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[5]));

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	SubSavedURI$&quot;?SessionID=&quot;$SID);
		Res.Subst(&quot;NewTarget&quot;,		&quot; target=\&quot;_parent\&quot;&quot;);
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 6
function QuerySubSaved(WebRequest Req, WebResponse Res)
{
	local int i,k, x;
	local string 	SID,
					tmp, tmp1,
					TempStr;
	local Session 				CurS;
	local PlayInfo 				TempPI;
	local ProfileConfigSet 		TempPCS;
	local array&lt;string&gt; 		TempArr;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;

	local class&lt;Mutator&gt; 		MutClass;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local class&lt;Info&gt;			TempSA;


	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID);
	if (CanPerform(&quot;Lm&quot;))
	{
		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowFramedMessage(Res,ErrorAccessControlText,True);
			return;
		}
		TempPI = new(None) class'PlayInfo';

		// We are managing an existing profile
		if (CurS.hasData(&quot;ProfileIndex&quot;))
        {
            k = int(CurS.getValue(&quot;ProfileIndex&quot;));
            TempPCS = LadderRules.LadderProfiles[k];
            if (LadderRules.Profiles[k].ProfileName != CurS.getValue(&quot;ProfileName&quot;))
			{
				LadderRules.Profiles[k].ProfileName = CurS.getValue(&quot;ProfileName&quot;);
				LadderRules.AllLadderProfiles.Remove(LadderRules.AllLadderProfiles.FindItemId(string(k)));
				LadderRules.AllLadderProfiles.Add(string(k),LadderRules.Profiles[k].ProfileName);
				LadderRules.SaveConfig();
			}

			if (TempPCS.StartEdit())
			{
				TempPCS.SetGameType(CurS.getValue(&quot;GameType&quot;));
				TempPCS.EndEdit(False);
			}
        }

		else TempPCS = LadderRules.AddProfile(CurS.getValue(&quot;ProfileName&quot;), CurS.getValue(&quot;GameType&quot;));

        if (TempPCS.StartEdit())
		{
			for (i=0;i&lt;AllMutators.Length;i++)
			{
				MutClass = class&lt;Mutator&gt;(DynamicLoadObject(AllMutators[i].ClassName,class'Class'));
				if (MutClass != None)
				{
					if ((Req.GetVariable(AllMutators[i].ClassName,&quot;&quot;)!=&quot;&quot;)||(Req.GetVariable(AllMutators[i].GroupName,&quot;&quot;)~=AllMutators[i].ClassName))
						CurS.setMutator(AllMutators[i].ClassName,true,true);
					else CurS.setMutator(AllMutators[i].ClassName,false);

					if (CurS.HasMutator(AllMutators[i].ClassName))
					{
						MClass[MClass.Length] = MutClass;
						TempPCS.AddProfileMutator(AllMutators[i].ClassName,CurS.MutRequired(AllMutators[i].ClassName));
					}
					else TempPCS.DelProfileMutator(AllMutators[i].ClassName);
				}
			}

			for (i=0;i&lt;ConfigM.ManagedActors.Length;i++)
			{
				TempSA = ConfigM.ManagedActors[i].SAClass;
				if (TempSA != None)
				{
					TempStr = string(ConfigM.ManagedActors[i].SAClass);
					if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
						CurS.setServerActor(TempStr, True, True);
					else CurS.setServerActor(TempStr, False);

					if (CurS.HasServerActor(TempStr))
					{
						SAClass[SAClass.Length] = TempSA;
						TempPCS.AddProfileServerActor(TempStr,CurS.SARequired(TempStr));
					}
					else TempPCS.DelProfileServerActor(TempStr);
				}
			}

			x = LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);
			if (x &gt;= 0)
			{
				ShowFramedMessage(Res, ErrorLoadingPlayInfoText[x],True);
				return;
			}
			CurS.setValue(&quot;MaxMaps&quot;,Req.GetVariable(&quot;MaxMaps&quot;),true);
			TempPCS.MaxMaps = int(CurS.getValue(&quot;MaxMaps&quot;));

			GIClass.static.LoadMapList(GIClass.default.MapPrefix, TempArr);
			for (i=0;i&lt;TempArr.Length;i++)
			{
				if (Req.GetVariable(TempArr[i],&quot;&quot;)!=&quot;&quot;)
					CurS.setMap(TempArr[i],0,true,true);
				else CurS.setMap(TempArr[i],0,false,false);

				if (CurS.HasMap(TempArr[i]))
					TempPCS.AddProfileMap(TempArr[i], CurS.MapRequired(TempArr[i]));
				else TempPCS.DelProfileMap(TempArr[i]);
			}

			for (i=0;i&lt;TempPI.Settings.Length;i++)
			{
				if (TempPI.Settings[i].SecLevel &gt; CurAdmin.MaxSecLevel()) continue;
				tmp = &quot;&quot;; tmp1=&quot;&quot;;
				if (CurS.getIdValue(i,tmp,tmp1) == -1)
					break;
				if (!TempPCS.SetProfileNamedParam(TempPI.Settings[i].SettingName, CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value)))
					TempPCS.SetProfileParam(TempPCS.Count(),TempPI.Settings[i].SettingName,CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value));
			}

			TempPCS.EndEdit(true);
		}

		else
		{
			StatusError(Res,ErrorSavingProfile);
			QuerySubReview(Req, Res);
			return;
		}
		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());
		Res.Subst(&quot;SubTitle&quot;, Tmp);
		ShowMessage(Res, TableTitle[6], PageCaption[6]);
		return;
	}

	else AccessDenied(Res);
}

defaultproperties
{
     EpicPackages(0)=&quot;BR-Anubis&quot;
     EpicPackages(1)=&quot;BR-Bifrost&quot;
     EpicPackages(2)=&quot;BR-Disclosure&quot;
     EpicPackages(3)=&quot;BR-IceFields&quot;
     EpicPackages(4)=&quot;BR-Skyline&quot;
     EpicPackages(5)=&quot;BR-Slaughterhouse&quot;
     EpicPackages(6)=&quot;BR-TwinTombs&quot;
     EpicPackages(7)=&quot;CTF-Chrome&quot;
     EpicPackages(8)=&quot;CTF-Citadel&quot;
     EpicPackages(9)=&quot;CTF-December&quot;
     EpicPackages(10)=&quot;CTF-Face3&quot;
     EpicPackages(11)=&quot;CTF-Geothermal&quot;
     EpicPackages(12)=&quot;CTF-Lostfaith&quot;
     EpicPackages(13)=&quot;CTF-Magma&quot;
     EpicPackages(14)=&quot;CTF-Maul&quot;
     EpicPackages(15)=&quot;CTF-Orbital2&quot;
     EpicPackages(16)=&quot;DM-Antalus&quot;
     EpicPackages(17)=&quot;DM-Asbestos&quot;
     EpicPackages(18)=&quot;DM-Compressed&quot;
     EpicPackages(19)=&quot;DM-Curse3&quot;
     EpicPackages(20)=&quot;DM-Flux2&quot;
     EpicPackages(21)=&quot;DM-Gael&quot;
     EpicPackages(22)=&quot;DM-Inferno&quot;
     EpicPackages(23)=&quot;DM-Insidious&quot;
     EpicPackages(24)=&quot;DM-Leviathan&quot;
     EpicPackages(25)=&quot;DM-Oceanic&quot;
     EpicPackages(26)=&quot;DM-Phobos2&quot;
     EpicPackages(27)=&quot;DM-Plunge&quot;
     EpicPackages(28)=&quot;DM-Serpentine&quot;
     EpicPackages(29)=&quot;DM-TokaraForest&quot;
     EpicPackages(30)=&quot;DM-TrainingDay&quot;
     EpicPackages(31)=&quot;DOM-Core&quot;
     EpicPackages(32)=&quot;DOM-OutRigger&quot;
     EpicPackages(33)=&quot;DOM-Ruination&quot;
     EpicPackages(34)=&quot;DOM-ScorchedEarth&quot;
     EpicPackages(35)=&quot;DOM-SepukkuGorge&quot;
     EpicPackages(36)=&quot;DOM-Suntemple&quot;
     EpicPackages(37)=&quot;Entry&quot;
     EpicPackages(38)=&quot;NvidiaLogo&quot;
     EpicPackages(39)=&quot;TUT-BR&quot;
     EpicPackages(40)=&quot;TUT-CTF&quot;
     EpicPackages(41)=&quot;TUT-DM&quot;
     EpicPackages(42)=&quot;TUT-DOM&quot;
     EpicPackages(43)=&quot;UT2-intro&quot;
     EpicPackages(44)=&quot;VehicleDemo&quot;
     EpicPackages(45)=&quot;endgame&quot;
     EpicPackages(46)=&quot;Core&quot;
     EpicPackages(47)=&quot;Editor&quot;
     EpicPackages(48)=&quot;Engine&quot;
     EpicPackages(49)=&quot;Fire&quot;
     EpicPackages(50)=&quot;GamePlay&quot;
     EpicPackages(51)=&quot;IpDrv&quot;
     EpicPackages(52)=&quot;UWeb&quot;
     EpicPackages(53)=&quot;UnrealEd&quot;
     EpicPackages(54)=&quot;UnrealGame&quot;
     EpicPackages(55)=&quot;Vehicles&quot;
     EpicPackages(56)=&quot;XAdmin&quot;
     EpicPackages(57)=&quot;XEffects&quot;
     EpicPackages(58)=&quot;XGame&quot;
     EpicPackages(59)=&quot;XGame_rc&quot;
     EpicPackages(60)=&quot;XInterface&quot;
     EpicPackages(61)=&quot;XPickups&quot;
     EpicPackages(62)=&quot;XPickups_rc&quot;
     EpicPackages(63)=&quot;XWeapons&quot;
     EpicPackages(64)=&quot;XWeapons_rc&quot;
     EpicPackages(65)=&quot;XWebAdmin&quot;
     EpicPackages(66)=&quot;BR-DE-ElecFields&quot;
     EpicPackages(67)=&quot;CTF-DE-ElecFields&quot;
     EpicPackages(68)=&quot;CTF-DE-LavaGiant2&quot;
     EpicPackages(69)=&quot;DM-DE-Grendelkeep&quot;
     EpicPackages(70)=&quot;DM-DE-Ironic&quot;
     EpicPackages(71)=&quot;DM-DE-Osiris2&quot;
     EpicPackages(72)=&quot;BR-Canyon&quot;
     EpicPackages(73)=&quot;CTF-Avaris&quot;
     EpicPackages(74)=&quot;DM-1on1-Crash&quot;
     EpicPackages(75)=&quot;DM-1on1-Mixer&quot;
     EpicPackages(76)=&quot;DM-Icetomb&quot;
     EpicPackages(77)=&quot;DM-Injector&quot;
     EpicPackages(78)=&quot;DM-IronDeity&quot;
     EpicPackages(79)=&quot;DM-Rustatorium&quot;
     EpicPackages(80)=&quot;DOM-Junkyard&quot;
     EpicPackages(81)=&quot;SkaarjPack&quot;
     EpicPackages(82)=&quot;SkaarjPack_rc&quot;
     EpicPackages(83)=&quot;BonusPack&quot;
     EpicPackages(84)=&quot;OGGPlayer&quot;
     MasterPage=&quot;ladder&quot;
     SubFrame=&quot;ladder_frame&quot;
     SubFrameMenu=&quot;ladder_frame1&quot;
     SubFrameContent=&quot;ladder_frame2&quot;
     IncludeTable=&quot;ladder_table&quot;
     IncludeSection=&quot;ladder_section&quot;
     IncludeRows=&quot;ladder_rows&quot;
     IncludeCaptionButton=&quot;ladder_caption&quot;
     IncludeMapSelect=&quot;ladder_mapselect&quot;
     IncludeProfileName=&quot;ladder_name&quot;
     IncludeGameType=&quot;ladder_gametype&quot;
     IncludeCheckBox=&quot;ladder_checkrow&quot;
     IncludeSwitch=&quot;ladder_switch&quot;
     ProfileViewURI=&quot;ladder_view&quot;
     ProfileEditURI=&quot;ladder_edit&quot;
     ProfileMenuURI=&quot;ladder_menu&quot;
     ProfileSwitchURI=&quot;ladder_switch&quot;
     ProfileManageURI=&quot;ladder_manage&quot;
     SubFrameURI=&quot;profile_management&quot;
     SubFrameMenuURI=&quot;management_menu&quot;
     SubMapsURI=&quot;ladder_maps&quot;
     SubSavedURI=&quot;ladder_save&quot;
     SubRulesURI=&quot;ladder_rules&quot;
     SubReviewURI=&quot;ladder_review&quot;
     SubGametypeURI=&quot;management_game_type&quot;
     SubMutatorsURI=&quot;ladder_mutators&quot;
     SubImportURI=&quot;profile_import&quot;
     SubExportURI=&quot;profile_export&quot;
     LinkEditProfile=&quot;Edit Profiles&quot;
     LinkViewProfile=&quot;View Profiles&quot;
     LinkSwitchProfile=&quot;Switch Profiles&quot;
     LinkManageProfile=&quot;Manage Profiles&quot;
     LinkImportProfile=&quot;Import Profile&quot;
     LinkExportProfile=&quot;Export Profile&quot;
     TableTitle(0)=&quot;Profile Management Portal&quot;
     TableTitle(1)=&quot;Profile GameType&quot;
     TableTitle(2)=&quot;Profile Mutators&quot;
     TableTitle(3)=&quot;Profile Maps&quot;
     TableTitle(4)=&quot;Profile Settings&quot;
     TableTitle(5)=&quot;Review Profile&quot;
     TableTitle(6)=&quot;Profile Saved&quot;
     PageCaption(0)=&quot;No Profile Loaded&quot;
     PageCaption(1)=&quot;Select the gametype that will be associated with this profile.&quot;
     PageCaption(2)=&quot;Select the mutators that will be available in this profile.&quot;
     PageCaption(3)=&quot;Select the maps that will be available in this profile.&quot;
     PageCaption(4)=&quot;Select the settings that will be associated with this profile.&quot;
     PageCaption(5)=&quot;Review all settings for accuracy before saving to file.&quot;
     PageCaption(6)=&quot;Settings were saved successfully!&quot;
     ProfileButtonName(0)=&quot;Save Location&quot;
     ProfileButtonName(1)=&quot;GameType&quot;
     ProfileButtonName(2)=&quot;Mutators&quot;
     ProfileButtonName(3)=&quot;Maps&quot;
     ProfileButtonName(4)=&quot;Rules&quot;
     ProfileButtonName(5)=&quot;Review&quot;
     ProfileButtonName(6)=&quot;Saved&quot;
     ProfileButtonValue(0)=&quot;Proceed&quot;
     ProfileButtonValue(1)=&quot;Set GameType&quot;
     ProfileButtonValue(2)=&quot;Set Mutators&quot;
     ProfileButtonValue(3)=&quot;Set Maps&quot;
     ProfileButtonValue(4)=&quot;Set Rules&quot;
     ProfileButtonValue(5)=&quot;Save Profile&quot;
     ProfileButtonValue(6)=&quot;Profile Saved&quot;
     MapText=&quot;Maps&quot;
     ErrorText=&quot;Error&quot;
     MutatorText=&quot;Mutators&quot;
     RequiredText=&quot;Required&quot;
     AvailableText=&quot;Available&quot;
     UnlimitedText=&quot;Unlimited&quot;
     FollowingMaps=&quot;The following maps&quot;
     AreAssignedText=&quot;are assigned to this profile and cannot be removed.&quot;
     AreAvailableText=&quot;may be added to this profile.&quot;
     FollowingMutators=&quot;The following mutators&quot;
     CommandLineOptionsTitle=&quot;Command Line Options&quot;
     ButtonLoadProfile=&quot;Load Profile&quot;
     ButtonDeleteProfile=&quot;Delete Profile&quot;
     ButtonPreviewProfile=&quot;Load Profile&quot;
     ButtonApplyImportProfile=&quot;Import Profile&quot;
     ButtonApplyExportProfile=&quot;Export Profile&quot;
     ButtonApplyProfileChanges=&quot;Apply Profile Changes&quot;
     LabelCopyProfile=&quot;Copy Profile&quot;
     LabelDeleteProfile=&quot;Delete Profile&quot;
     LabelImportProfile=&quot;Import Profile&quot;
     LabelExportProfile=&quot;Export Profile&quot;
     LabelAddProfile=&quot;Add Profile&quot;
     LabelSelectActions=&quot;(Copy, Modify, Delete, Export)&quot;
     LabelTextboxActions=&quot;(Add, Copy, Import)&quot;
     LabelPlayInfo=&quot;Profile Game Parameters&quot;
     LabelGeneralProfile=&quot;General Profile Information&quot;
     LabelGameType=&quot;Profile Game Type&quot;
     LabelProfileName=&quot;Profile Name&quot;
     LabelAccessControl=&quot;Profile Access Control&quot;
     LabelChooseAction=&quot;Choose action to perform:&quot;
     LabelManagement=&quot;Profile Management&quot;
     LabelInputDescription=&quot;Actions which require input from this field are listed on the right.&quot;
     LabelMaxMaps=&quot;Maximum maps allowed in this profile's maplist&quot;
     LabelNumberGames=&quot;Number of matches (0 = unlimited)&quot;
     LabelCheckAllMap=&quot;Select all maps&quot;
     LabelRequiredMaps=&quot;Check each map that will be required (non-removable) for this profile.&quot;
     LabelUncheckAllMap=&quot;Deselect all maps&quot;
     LabelChangeMaplist=&quot;Changes to the maplist are saved immediately.&quot;
     LabelCheckAllMutator=&quot;Select all mutators&quot;
     LabelRequiredMutators=&quot;Check each mutator that will be required (non-removable) for this profile.&quot;
     LabelNumberMatchesLeft=&quot;Matches Remaining:&quot;
     LabelUncheckAllMutator=&quot;Deselect all mutators&quot;
     LabelDelayProfileChange=&quot;Check to delay applying profile until end of current match.&quot;
     LabelApplyImportProfile=&quot;Click Apply Import to make this profile available in your server's list of profiles.&quot;
     LabelApplyExportProfile=&quot;Click Apply Export to save this profile to a .txt file.&quot;
     LabelModifyProfile=&quot;Modify Profile&quot;
     SuccessText=&quot;Success&quot;
     SuccessDeleteProfile=&quot;Profile successfully deleted!  It will no longer appear in your list of available profiles.&quot;
     SuccessExportProfile=&quot;Profile exported successfully!  Exported profile has been saved to the server's System folder as &quot;
     SuccessImportProfile=&quot;Profile imported successfully! The remote profile will now appear in your list of available profiles.&quot;
     SuccessImportProfileTitle=&quot;Import Successful!&quot;
     SuccessCopyProfile=&quot;Profile copied successfully! Copied profile will now be available in your list of available profiles.&quot;
     SuccessSwitchProfile=&quot;Profile successfully applied! Changes take effect at the end of the current match.&quot;
     ErrorLoadingPlayInfoText(0)=&quot;Error while loading playinfo.  LoadThisPlayInfo() received bad playinfo object!&quot;
     ErrorLoadingPlayInfoText(1)=&quot;Error while loading playinfo.  LoadThisPlayInfo() could not load incoming game class!&quot;
     ErrorLoadingPlayInfoText(2)=&quot;Error while loading playinfo.  LoadThisPlayInfo() could not load associated access control!&quot;
     ErrorLoadingPlayInfoText(3)=&quot;Error while loading playinfo.  LoadThisPlayInfo() had exception while loading mutators!&quot;
     ErrorLoadingPlayInfoText(4)=&quot;Error while loading playinfo.  LoadThisPlayInfo() had exception while loading server actors!&quot;
     ErrorGameClassText=&quot;No gametype was selected, or the files required by this gametype do not exist on this server.&quot;
     ErrorGameClassTitle=&quot;Invalid GameType&quot;
     ErrorAccessControlText=&quot;Exception while loading access control.  Please double check the AccessControlClass= line of the [Engine.GameInfo] section of your server's .ini file.&quot;
     ErrorAccessControlTitle=&quot;Invalid Access Control&quot;
     ErrorSameProfileName=&quot;Another profile already exists with that name. Please select a different name!&quot;
     ErrorRemoteMutator=&quot;Error loading mutator from remote profile. Could not find mutator package:&quot;
     ErrorRemoteServerActor=&quot;Error loading ServerActor from remote profile.  Could not find ServerActor package:&quot;
     ErrorSavingProfile=&quot;Exception while saving new profile! Please resubmit save request.&quot;
     ErrorDeletingProfile=&quot;Error deleting profile!  Please check server log for details.&quot;
     ErrorExportingProfile=&quot;Error exporting profile! Export class could not be spawned!&quot;
     ErrorNoProfilesExist=&quot;No profiles exist! Could not perform selected action!&quot;
     ErrorCopyFrom=&quot;Error copying profile.  No Profile Found!&quot;
     ErrorCopyNoName=&quot;You must specify a unique name for the new profile!&quot;
     ErrorExcludeMapNotFound=&quot;Error! Exclude map not found:&quot;
     ErrorIncludeMapNotFound=&quot;Error! Include map not found:&quot;
     ErrorReplacingWebConnection=&quot;Exception replacing WebServer.AcceptClass! (Very bad) Please send an email to Evolution containing your server's ini and log files.&quot;
     ImportClassSpawnError=&quot;Exception occured spawning connection class.  Please try again!&quot;
     ImportProfileFailText=&quot;Error while importing profile.  Please ensure you have all the files necessary to load this remote profile.&quot;
     ImportProfileFailTitle=&quot;Import Failed!&quot;
     ErrorBind=&quot;Failed to bind port! Please try again!&quot;
     ErrorBadURL=&quot;URL must start with 'http://' !&quot;
     ErrorServer=&quot;Unspecified error while importing profile!&quot;
     ErrorResolve=&quot;URL could not be resolved!&quot;
     ErrorProfile=&quot;Attempted to import a file that does not contain a profile!&quot;
     ErrorTimeout=&quot;Timed out while waiting for response from foreign host!&quot;
     ErrorNotFound=&quot;Profile does not exist on remote server!&quot;
     ErrorForbidden=&quot;Remote profile could not be imported: Forbidden&quot;
     ErrorBadRequest=&quot;Request could not be processed by remote server!&quot;
     ErrorUnauthorized=&quot;Remote profile could not be imported: Unauthorized&quot;
     DefaultPage=&quot;ladder_main&quot;
     Title=&quot;Ladder&quot;
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>4180</id>
      <timestamp>2003-02-18T04:01:42Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>Changed Ladder link to Ladder1.46</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:XAdminBase|XAdminBase]] &gt;&gt; [[Legacy:XWebQueryHandler|xWebQueryHandler]] &gt;&gt; LadderQuery ([[Legacy:Ladder1.46|Ladder1.46]])}}

&lt;uscript line&gt;
//-----------------------------------------------------------
//  Ladder.LadderQuery
//  QueryHandler for webadmin interface
//-----------------------------------------------------------
class LadderQuery extends xWebQueryHandler
	DependsOn(ProfileConfigSet)
	config(System);

const LOGNAME		= 'LadderQuery';

var LadderGameRules LadderRules;

// Profile Tracking Variables
var SessionMaster 			SMaster;
var ConfigMaster			ConfigM;
var string 					EpicPackages[66];

// Active Profile Variables
var StringArray 		ProfileMaps;
var ProfileExporter		ExportMaster;
var ProfileConfigSet 	CurrentProfile;
var StringArray 		ProfileMutators;

var string				DefaultProfileName;

// Physical page that will be served
var config string		MasterPage;	// This is main html page for Ladder
var config string		SubFrame;	// Manage sub-frame
var config string		SubFrameMenu;	// Sub-menu (GameType, Mutators, Maps, PlayInfo, Review)
var config string		SubFrameContent;


// Include Files
var config string		IncludeTable;
var config string		IncludeSection;
var config string		IncludeRows;
var config string		IncludeCaptionButton;
var config string		IncludeMapSelect;
var config string		IncludeProfileName;
var config string		IncludeGameType;
var config string		IncludeCheckBox;
var config string		IncludeSwitch;

// Virtual paths that will be requested from clients
var config string 		ProfileViewURI;
var config string 		ProfileEditURI;
var config string 		ProfileMenuURI;
var config string 		ProfileSwitchURI;
var config string		ProfileManageURI;

var config string		SubFrameURI;	// accessed through manage link - linked to SubFrame page
var config string		SubFrameMenuURI;
var config string 		SubMapsURI;
var config string 		SubSavedURI;
var config string 		SubRulesURI;
var config string 		SubReviewURI;
var config string 		SubGametypeURI;
var config string 		SubMutatorsURI;
var config string		SubImportURI;
var config string		SubExportURI;

// Localized Page Help texts
var localized string 	HelpViewProfile;
var localized string 	HelpEditProfile;
var localized string 	HelpSwitchProfile;
var localized string 	HelpManageProfile;
var localized string 	HelpImportProfile;
var localized string 	HelpExportProfile;
// Subpage help text
var localized string	HelpGameType;
var localized string	HelpMutators;
var localized string	HelpMaps;
var localized string	HelpPlayInfo;
var localized string	HelpReview;

// Localized Menu Link Text
var localized string 	LinkEditProfile;
var localized string 	LinkViewProfile;
var localized string 	LinkSwitchProfile;
var localized string 	LinkManageProfile;
var localized string 	LinkImportProfile;
var localized string 	LinkExportProfile;

// for AddProfilePage/ManageProfilePage
var localized string 	TableTitle[9];
var localized string 	PageCaption[9];
var localized string 	ProfileButtonName[9];
var localized string 	ProfileButtonValue[9];

// Section Headers &amp; Text
var localized string	MapText;
var localized string	ErrorText;
var localized string	MutatorText;
var localized string 	RequiredText;
var localized string	AvailableText;
var localized string	UnlimitedText;
var localized string	FollowingMaps;
var localized string	AreAssignedText;
var localized string	AreAvailableText;
var localized string	FollowingMutators;

// Button Values
var localized string 	ButtonLoadProfile;			// Label for &quot;switch immediately&quot; button
var localized string	ButtonDeleteProfile;
var localized string	ButtonPreviewProfile;		// Label for previewing remote profile button
var localized string	ButtonApplyImportProfile;
var localized string	ButtonApplyExportProfile;
var localized string	ButtonApplyProfileChanges;

// Input form labels
var localized string	LabelCopyProfile;
var localized string	LabelDeleteProfile;
var localized string	LabelImportProfile;
var localized string	LabelExportProfile;
var localized string	LabelAddProfile;
var localized string	LabelSelectActions;
var localized string	LabelTextboxActions;

var localized string	LabelPlayInfo;
var localized string	LabelGeneralProfile;
var localized string	LabelGameType;
var localized string	LabelProfileName;
var localized string	LabelAccessControl;
var localized string	LabelChooseAction;
var localized string	LabelManagement;
var localized string	LabelInputDescription;

var localized string 	LabelMaxMaps;
var localized string 	LabelNumberGames;
var localized string	LabelCheckAllMap;
var localized string	LabelRequiredMaps;
var localized string	LabelUncheckAllMap;
var localized string 	LabelChangeMaplist;
var localized string	LabelCheckAllMutator;
var localized string	LabelRequiredMutators;
var localized string	LabelNumberMatchesLeft;
var localized string	LabelUncheckAllMutator;
var localized string	LabelDelayProfileChange;
var localized string	LabelApplyImportProfile;
var localized string	LabelApplyExportProfile;
var localized string	LabelModifyProfile;

// Success Messages
var localized string	SuccessText;
var localized string	SuccessDeleteProfile;
var localized string	SuccessExportProfile;
var localized string	SuccessImportProfile;
var localized string	SuccessImportProfileTitle;
var localized string	SuccessCopyProfile;
var localized string	SuccessSwitchProfile;

// Profile Errors
var localized string	ErrorLoadingPlayInfoText[5];
var localized string	ErrorGameRulesNotFound;
var localized string	ErrorGameClassText;
var localized string	ErrorGameClassTitle;
var localized string	ErrorAccessControlText;
var localized string	ErrorAccessControlTitle;
var localized string 	ErrorSameProfileName;
var localized string	ErrorRemoteMutator;
var localized string	ErrorRemoteServerActor;
var localized string	ErrorSavingProfile;
var localized string	ErrorDeletingProfile;
var localized string	ErrorExportingProfile;
var localized string	ErrorNoProfilesExist;
var localized string	ErrorCopyFrom;
var localized string	ErrorCopyNoName;
var localized string	ErrorExcludeMapNotFound;
var localized string	ErrorIncludeMapNotFound;
var localized string	ErrorReplacingWebConnection;
var localized string	ImportClassSpawnError;
var localized string	ImportProfileFailText;
var localized string	ImportProfileFailTitle;

// Import errors
var localized string	ErrorBind;
var localized string	ErrorBadURL;
var localized string	ErrorServer;
var localized string	ErrorResolve;
var localized string	ErrorProfile;
var localized string	ErrorTimeout;
var localized string	ErrorNotFound;
var localized string	ErrorForbidden;
var localized string	ErrorBadRequest;
var localized string	ErrorUnauthorized;

function bool Init()
{
	local GameRules GR;

	for (GR=Level.Game.GameRulesModifiers;GR!=None;GR=GR.NextGameRules)
		if (LadderGameRules(GR) != None)
			LadderRules = LadderGameRules(GR);

	if (LadderRules == None)
	{
		Cleanup();
		return false;
	}

	if (ConfigM == None &amp;&amp; ConfigMaster(Level.Game.BaseMutator.NextMutator) != None)
		ConfigM = ConfigMaster(Level.Game.BaseMutator.NextMutator);

	GetCurrentConfigSet();
	WebServer.AcceptClass 	= class'WebConnectionPlus';
	ExportMaster 			= new class'ProfileExporter';
	DefaultProfileName 		= LadderRules.DefaultProfileName;

	SMaster 				= new(None) class'SessionMaster';
	ProfileMaps 			= new(None) class'SortedStringArray';
	ProfileMutators 		= new(None) class'SortedStringArray';

	return true;
}

//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// Session Manipulation Functions
//

// Load profile information into session object
function CreateSessionInfo(coerce int ProfileIndex, string SID, optional bool bIncludeNonActive, optional bool bSave, optional bool bQuiet)
{
    local int 										i;
    local Session 									CurS;
    local string 									TempStr;
    local array&lt;string&gt; 							TempArr;
    local ProfileConfigSet 							TempPCS;
    local array&lt;ProfileConfigSet.ProfileMutator&gt; 	AllPCSMutators;
    local array&lt;ProfileConfigSet.ProfileMap&gt; 		AllPCSMaps;
    local array&lt;ProfileConfigSet.ProfileSA&gt; AllPCSServerActors;

    if (SID == &quot;&quot;)
        return;

    CurS = SMaster.getSession(SID,true);
	TempPCS = LadderRules.LadderProfiles[ProfileIndex];
	TempPCS.StartEdit();

// General profile information
    CurS.setValue(&quot;ProfileIndex&quot;, string(ProfileIndex), true);
	CurS.setValue(&quot;ProfileName&quot;,LadderRules.Profiles[ProfileIndex].ProfileName,true);
	CurS.setValue(&quot;GameType&quot;, string(TempPCS.GetGameClass()), True);
	CurS.setValue(&quot;ACClass&quot;, TempPCS.GetAccessControl(), True);
	CurS.setValue(&quot;MaxMaps&quot;, string(TempPCS.GetMaxMaps()), True);

	AllPCSMutators = TempPCS.GetProfileMutators();
	AllPCSMaps = TempPCS.GetProfileMaps();
	AllPCSServerActors = TempPCS.GetProfileServerActors();

    TempArr = LoadActiveProfileMutators(string(ProfileIndex));
    TempStr = class'wUtils103.wArray'.static.Join(TempArr,&quot;,&quot;);

// Load profile mutator information
    CurS.ClearMutators();
	for (i=0;i&lt;AllPCSMutators.Length;i++)
	   if (AllPCSMutators[i].bRequired || (InStr(TempStr,AllPCSMutators[i].MutatorName)!=-1) || bIncludeNonActive)
	       CurS.setMutator(AllPCSMutators[i].MutatorName,True,AllPCSMutators[i].bRequired);

    TempArr = LoadActiveProfileMaps(string(ProfileIndex));
    TempStr = class'wUtils103.wArray'.static.Join(TempArr,&quot;,&quot;);

// Load profile map information
    CurS.ClearMaps();
	for (i=0;i&lt;AllPCSMaps.Length;i++)
	   if (AllPCSMaps[i].bRequired || (InStr(TempStr,AllPCSMaps[i].MapName)!=-1) || bIncludeNonActive)
    	   CurS.setMap(AllPCSMaps[i].MapName,AllPCSMaps[i].MapListOrder,True,AllPCSMaps[i].bRequired);

	TempArr = LoadActiveProfileServerActors(string(ProfileIndex));
	TempStr = class'wUtils103.wArray'.static.Join(TempArr,&quot;,&quot;);

// Load ServerActor info
	CurS.ClearServerActors();
	for (i=0;i&lt;AllPCSServerActors.Length;i++)
		if (AllPCSServerActors[i].bRequired || InStr(TempStr,AllPCSServerActors[i].ActorClass)!=-1 || bIncludeNonActive)
			CurS.setServerActor(AllPCSServerActors[i].ActorClass, True, AllPCSServerActors[i].bRequired);

// Load profile PlayInfo data
	for (i=0;i&lt;TempPCS.Count();i++)
        CurS.setValue(TempPCS.GetProfileParamName(i),TempPCS.GetProfileParam(i),True);

    TempPCS.EndEdit(bSave,bQuiet);
}

// Initialize session data for recently imported profile
function ProfileConfigSet CreateImportSessionInfo(Session CurS)
{
	local int						i;
	local string 					TempStr, Tmp;
	local PlayInfo					TempPI;
	local ProfileConfigSet 			TempPCS;

	local class&lt;Mutator&gt;			MutClass;
	local class&lt;GameInfo&gt; 			GIClass;
	local class&lt;AccessControl&gt; 		ACClass;
	local class&lt;Info&gt;				ServerActorClass;
	local array&lt;class&lt;Info&gt; &gt;		SAClass;
	local array&lt;class&lt;Mutator&gt; &gt; 	MClass;

	TempPCS = LadderRules.AddProfile(CurS.getValue(&quot;ProfileName&quot;),CurS.getValue(&quot;GameType&quot;));
	if (TempPCS.StartEdit())
	{
		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None) return None;

		TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None) return None;

		TempPI = new(None) class'PlayInfo';

// Mutators
		for (i=0;i&lt;CurS.getMutatorLength();i++)
		{
			TempStr = CurS.getMutator(i);
			MutClass = class&lt;Mutator&gt;(DynamicLoadObject(TempStr, class'Class'));
			if (MutClass != None)
			{
				MClass[MClass.Length] = MutClass;
				TempPCS.AddProfileMutator(TempStr,CurS.MutRequired(TempStr));
			}

			else log(ErrorRemoteMutator@TempStr,LOGNAME);
		}

		for (i=0;i&lt;CurS.getSALength();i++)
		{
			TempStr = CurS.getServerActor(i);
			ServerActorClass = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (ServerActorClass != None)
			{
				SAClass[SAClass.Length] = ServerActorClass;
				TempPCS.AddProfileServerActor(TempStr,CurS.SARequired(TempStr));
			}
			else log(ErrorRemoteServerActor@TempStr,LOGNAME);
		}

		LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);

// Maps
		for (i=0;i&lt;CurS.getMapLength();i++)
		{
			TempStr = CurS.getMap(i);
			TempPCS.AddProfileMap(TempStr,CurS.MapRequired(TempStr));
		}

// PlayInfo
		for (i=0;i&lt;TempPI.Settings.Length;i++)
		{
			TempStr = &quot;&quot;; Tmp=&quot;&quot;;
			if (CurS.getIdValue(i,TempStr,Tmp) == -1)
				break;
			if ( !SettingIsAllowed(TempPI.Settings[i].SecLevel) ) continue;
			if (!TempPCS.SetProfileNamedParam(TempPI.Settings[i].SettingName, CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value)))
				TempPCS.SetProfileParam(TempPCS.Count(),TempPI.Settings[i].SettingName,CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value));
		}

		TempPCS.EndEdit(True);
		return TempPCS;
	}

	else log(ErrorServer,LOGNAME);

	return None;
}

// Clear session data and optionally create new session object
function string ResetSessionID(Session CurS, optional bool bDestroySession)
{
	local string OldSID;

	if (bDestroySession) SMaster.destroySession(CurS);
	else CurS.ResetSession();

	CurS = SMaster.getSession(OldSID,true);
	return CurS.GetHash();
}


////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
// Profile manipulation methods
//

function int LoadThisPlayInfo(PlayInfo PI, class&lt;GameInfo&gt; ThisGameInfo, class&lt;AccessControl&gt; ThisAccessControl, array&lt;class&lt;Mutator&gt; &gt; ThisMutator, array&lt;class&lt;Info&gt; &gt; ThisServerActor)
{
	local int i;
	local class&lt;Mutator&gt; M;

	if (PI == None)
		return 0;
	PI.Clear();

	if (ThisGameInfo == None)
		return 1;

	if (ThisAccessControl == None)
		return 2;

	if (ThisMutator.Length &gt; 0)
		for (i=0;i&lt;ThisMutator.Length;i++)
			if (ThisMutator[i] == None)
				return 3;

	if (ThisServerActor.Length &gt; 0)
		for (i=0;i&lt;ThisServerActor.Length;i++)
			if (ThisServerActor[i] == None)
				return 4;

	ThisGameInfo.static.FillPlayInfo(PI);
	PI.PopClass();

	if (ThisGameInfo.default.MutatorClass != &quot;&quot;)
	{
		M = class&lt;Mutator&gt;(DynamicLoadObject(ThisGameInfo.default.MutatorClass,class'Class'));
		if (M != None)
			M.static.FillPlayInfo(PI);
	}

	ThisAccessControl.static.FillPlayInfo(PI);
	PI.PopClass();

	for (i = 0; i &lt; ThisMutator.Length; i++)
	{
		ThisMutator[i].static.FillPlayInfo(PI);
		PI.PopClass();
	}

	for (i = 0; i &lt; ThisServerActor.Length; i++)
	{
		ThisServerActor[i].static.FillPlayInfo(PI);
		PI.PopClass();
	}
	return -1;
}

function ProfileConfigSet GetCurrentConfigSet()
{
	local int i;

	if (CurrentProfile == None)
	{
		i = LadderRules.FindActiveProfile();
		if (i &gt;= 0)	CurrentProfile = LadderRules.LadderProfiles[i];
	}

	return CurrentProfile;
}

function int GetCurrentConfigIndex()
{
	local int i;

	if (CurrentProfile != None)
		for (i = 0;i &lt; LadderRules.LadderProfiles.Length;i++)
			if (LadderRules.LadderProfiles[i] == CurrentProfile)
				return i;

	return LadderRules.FindActiveProfile();
}

// Returns an array of class names for mutators that this profile will use in the game
function array&lt;string&gt; LoadActiveProfileMutators(optional string CurrentProfileItem)
{
	local int j;
	local ProfileConfigSet PCS;
	local array&lt;string&gt; TempString;

	if (CurrentProfileItem != &quot;&quot;)
	{
		j = int(CurrentProfileItem);
		if (j!=-1)
			PCS = LadderRules.LadderProfiles[j];
	}

	if (PCS == None &amp;&amp; CurrentProfile != None)
		PCS = CurrentProfile;

	// Query profile for mutators to display
	if (PCS != none)
		TempString = PCS.GetUsedMutators();

	return TempString;
}

function array&lt;string&gt; LoadActiveProfileServerActors(optional string CurrentProfileItem)
{
	local int j;
	local ProfileConfigSet PCS;
	local array&lt;string&gt; Temp;

	if (CurrentProfileItem != &quot;&quot;)
	{
		j = int(CurrentProfileItem);
		if (j != -1) PCS = LadderRules.LadderProfiles[j];
	}

	if (PCS == None &amp;&amp; CurrentProfile != None)
		PCS = CurrentProfile;

	if (PCS != None)
		Temp = PCS.GetUsedServerActors();

	return Temp;
}

// Returns an array of map names that in the maplist for this profile
function array&lt;string&gt; LoadActiveProfileMaps(optional string CurrentProfileItem)
{
	local int j;
	local ProfileConfigSet PCS;
	local array&lt;string&gt; TempMaps;

	if (CurrentProfileItem != &quot;&quot;)
	{
		j = int(CurrentProfileItem);
		if (j!=-1) PCS = LadderRules.LadderProfiles[j];
	}

	else if (CurrentProfile!=None)
		PCS = CurrentProfile;

	if (PCS != None) TempMaps = PCS.GetUsedMaps();

	return TempMaps;
}
/*
function CreateFullMutatorList(out StringArray Mutators, out StringArray GroupsOnly)
{
	local StringArray Grouped;
	local int i,j,z;
	local string GrpName;
	local string thisgroup, nextgroup;

// This class provides a specialized sorting function
// since mutators may be grouped - mutators in the same groups
// are not allowed to be selected togther

	Grouped = new(None) class'SortedStringArray';

// Create array sorted on GroupName...this allows to flag
// the mutator for a different .inc file
	for (i = 0; i &lt; Mutators.Count(); i++)
	{
		j = int(Mutators.GetItem(i));

// If the mutator author forgot to configure a group name for the mutator
		if (AllMutators[j].GroupName == &quot;&quot;)
			GrpName = &quot;Z&quot; $ string (z++);
		else GrpName = AllMutators[j].GroupName;

		Grouped.Add(string(j),GrpName $ &quot;.&quot; $ AllMutators[j].FriendlyName);
	}

// Move all grouped mutators to GroupsOnly StringArray for sorting by friendly name
	for (i=0;i&lt;Grouped.Count();i++)
	{
		thisgroup = AllMutators[int(Grouped.GetItem(i))].GroupName;
		nextgroup = &quot;&quot;;

		if (thisgroup==&quot;&quot;)
			continue;
		if (i+1&lt;Grouped.Count())
			nextgroup = AllMutators[int(Grouped.GetItem(i+1))].GroupName;

		if (thisgroup ~= nextgroup)
		{
			j=i;
			while(nextgroup~=thisgroup &amp;&amp; j&lt;Grouped.Count())
			{
				GroupsOnly.MoveFromId(Grouped, Grouped.FindItemId(Grouped.GetItem(j)));
				thisgroup = nextgroup;
				if (j+1==Grouped.Count())
					nextgroup=&quot;&quot;;
				else nextgroup = AllMutators[int(Grouped.GetItem(j+1))].GroupName;
			}
			if (j&lt;Grouped.Count())
				GroupsOnly.MoveFromId(Grouped,Grouped.FindItemId(Grouped.GetItem(j)));
			i=-1;
		}
	}

// Move all non-grouped mutators back to Mutators array
// for re-sorting by Friendly Name
	Mutators.Reset();
	for (i=0;i&lt;Grouped.Count();i++)
	{
		j=int(Grouped.GetItem(i));
		Mutators.Add(string(j),AllMutators[j].FriendlyName);
	}
	Grouped.Reset();
}
*/
//****************************************************************
//****************************************************************
// Helper functions
//
//****************************************************************
//**************************
// HTML Generation
//*************************

// Creates a listing of PlayInfo data
// Pass &quot;defaults_row&quot; in the 'IncludeFile' param to add the
// input form objects to the output

function string GeneratePlayInfoRows(WebRequest Req, WebResponse Res, string IncludeFile)
{
	local int i,j,k,z;
	local string 	TempStr, Data, Op, SID,
					TempRow, HeadingRow, PlayInfoRows;

	local Session 		CurS;
	local PlayInfo 		TempPI;
	local StringArray 	Info, InfoC, InfoS, InfoT;

	local array&lt;string&gt; 		Options;
	local class&lt;Mutator&gt; 		TempMut;
	local class&lt;Info&gt;			TempSA;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.GetSession(SID);

	TempStr = CurS.getValue(&quot;GameType&quot;);
	if (TempStr != &quot;&quot;)
		GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
	if (GIClass == None)
	{
		ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
		return &quot;&quot;;
	}

	TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
	if (TempStr != &quot;&quot;)
		ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
	if (ACClass == None)
	{
		ShowMessage(Res,ErrorAccessControlTitle,ErrorAccessControlText);
		return &quot;&quot;;
	}

	for (i=0;i&lt;CurS.GetMutatorLength();i++)
	{
		TempStr = CurS.getMutator(i);
		if (TempStr != &quot;&quot;)
		{
			TempMut = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (TempMut != None)
				MClass[MClass.Length] = TempMut;
		}
	}

	for (i=0;i&lt;CurS.getSALength();i++)
	{
		TempStr = CurS.getServerActor(i);
		if (TempStr != &quot;&quot;)
		{
			TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (TempSA != None)
				SAClass[SAClass.Length] = TempSA;
		}
	}

	// Initialize and fill PlayInfo
	TempPI = new(None) class'PlayInfo';
	LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);

	for (i=0;i&lt;TempPI.Settings.Length;i++)
		if (CurS.HasData(TempPI.Settings[i].SettingName))
			TempPI.StoreSetting(i, CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value));

	InfoC = new(None) class'SortedStringArray';	// Checkboxes
	InfoS = new(None) class'SortedStringArray';	// Selects
	InfoT = new(None) class'SortedStringArray';	// Textboxes
	Info  = new(None) class'SortedStringArray';	// Contains each unique ClassFrom value

	// Want to allow admin to input values for each setting
	if (IncludeFile ~= &quot;defaults_row&quot;)
	{
		for (i=0;i&lt;TempPI.Settings.Length;i++)
		{
			if (TempPI.Settings[i].RenderType~=&quot;Text&quot;)
			{
				// Hack for MOTD sorting
				if (Left(TempPI.Settings[i].SettingName,Len(TempPI.Settings[i].SettingName) - 1) ~= &quot;GameReplicationInfo.MOTDLine&quot;)
					InfoT.Add(string(i), TempPI.Settings[i].SettingName);
				else InfoT.Add(string(i),TempPI.Settings[i].DisplayName);
			}

			else if (TempPI.Settings[i].RenderType~=&quot;Check&quot;)
				InfoC.Add(string(i),TempPI.Settings[i].DisplayName);

			else if (TempPI.Settings[i].RenderType~=&quot;Select&quot;)
				InfoS.Add(string(i),TempPI.Settings[i].DisplayName);

			for (j=0;j&lt;Info.Count();j++)
				if (Info.GetTag(j) ~= string(TempPI.Settings[i].ClassFrom))
					break;

			if (j == Info.Count())
				Info.Add(string(i), string(TempPI.Settings[i].ClassFrom));
		}

		for (k=0;k&lt;Info.Count();k++)
		{
			TempRow = &quot;&quot;; HeadingRow = &quot;&quot;;
			Res.Subst(&quot;RowContent&quot;, &quot;&lt;td class=ttext colspan=\&quot;3\&quot;&gt;&quot;$Info.GetTag(k)$&quot;&lt;/td&gt;&quot;);
			HeadingRow = WebInclude(RowLeft);

			for (i=0;i&lt;InfoC.Count();i++)
			{
				TempStr = &quot;&quot;;
				j=int(InfoC.GetItem(i));
				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				Res.Subst(&quot;Content&quot;, Checkbox(TempPI.Settings[j].SettingName, TempPI.Settings[j].Value ~= &quot;True&quot;, TempPI.Settings[j].Data != &quot;&quot;));
				TempStr = WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class=location title=\&quot;Required Security Level\&quot;&gt;&quot;$TempPI.Settings[j].SecLevel$&quot;&lt;/span&gt;&quot;);
				TempStr += WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class='location'&gt;&quot;$HtmlEncode(TempPI.Settings[j].DisplayName)$&quot;&lt;/span&gt;&quot;);
				Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft) $ TempStr);
				TempRow += WebInclude(RowLeft);
			}

			for (i=0;i&lt;InfoT.Count();i++)
			{
				TempStr = &quot;&quot;;
				j = int(InfoT.GetItem(i));
				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				Data = &quot;8&quot;;
				if (TempPI.Settings[j].Data != &quot;&quot;)
				{
					Data = TempPI.Settings[j].Data;
					Divide(TempPI.Settings[j].Data, &quot;;&quot;, Data, Op);
					TempPI.SplitStringToArray(Options, Op, &quot;:&quot;);
				}

				Op = &quot;&quot;;
				if (Options.Length &gt; 1)
					Op = &quot; (&quot;$Options[0]$&quot; - &quot;$Options[1]$&quot;)&quot;;

				Res.Subst(&quot;Content&quot;, Textbox(TempPI.Settings[j].SettingName, Data, Data, TempPI.Settings[j].Value) $ Op);
				TempStr = WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class=location title=\&quot;Required Security Level\&quot;&gt;&quot;$TempPI.Settings[j].SecLevel$&quot;&lt;/span&gt;&quot;);
				TempStr += WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class='location'&gt;&quot;$HtmlEncode(TempPI.Settings[j].DisplayName)$&quot;&lt;/span&gt;&quot;);
				Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft) $ TempStr);
				TempRow += WebInclude(RowLeft);
			}

			for (i=0;i&lt;InfoS.Count();i++)
			{
				Data = &quot;&quot;; TempStr = &quot;&quot;;
				j=int(InfoS.GetItem(i));
				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				// Build a set of options from PID.Data
				TempPI.SplitStringToArray(Options, TempPI.Settings[j].Data, &quot;;&quot;);
				for (j = 0; (j+1)&lt;Options.Length; j += 2)
				{
					Data += (&quot;&lt;option value='&quot;$Options[j]$&quot;'&quot;);
					If (TempPI.Settings[j].Value == Options[j])
						Data @= &quot;selected&quot;;
					Data += (&quot;&gt;&quot;$HtmlEncode(Options[j+1])$&quot;&lt;/option&gt;&quot;);
				}

				Res.Subst(&quot;Content&quot;, Select(TempPI.Settings[j].SettingName, Data));
				TempStr = WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class=location title=\&quot;Required Security Level\&quot;&gt;&quot;$TempPI.Settings[j].SecLevel$&quot;&lt;/span&gt;&quot;);
				TempStr += WebInclude(CellLeft);

				Res.Subst(&quot;Content&quot;, &quot;&lt;span class='location'&gt;&quot;$HtmlEncode(TempPI.Settings[j].DisplayName)$&quot;&lt;/span&gt;&quot;);
				Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft) $ TempStr);
				TempRow += WebInclude(RowLeft);
			}

			if (TempRow!=&quot;&quot;)
				PlayInfoRows += (HeadingRow$TempRow);
		}
	}
	else	// Displaying values only
	{
		for (i=0;i&lt;TempPI.Settings.Length;i++)
		{
			if (Left(TempPI.Settings[i].SettingName,Len(TempPI.Settings[i].SettingName) - 1) ~= &quot;GameReplicationInfo.MOTDLine&quot;)
				InfoS.Add(string(i), TempPI.Settings[i].SettingName);
			else InfoS.Add(string(i),TempPI.Settings[i].DisplayName);

			for (j=0;j&lt;Info.Count();j++)
				if (Info.GetTag(j) ~= string(TempPI.Settings[i].ClassFrom))
					break;
			if (j == Info.Count())
				Info.Add(string(i), string(TempPI.Settings[i].ClassFrom));
		}

		for (k=0;k&lt;Info.Count();k++)
		{
			TempRow = &quot;&quot;;
			HeadingRow = &quot;&lt;tr&gt;&lt;td class=ttext colspan=\&quot;2\&quot;&gt;&quot;$Info.GetTag(k)$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
			for (i=0;i&lt;InfoS.Count();i++)
			{
				j=int(InfoS.GetItem(i));
				Data = &quot;&quot;;

				if (!SettingIsAllowed(TempPI.Settings[j].SecLevel) || (string(TempPI.Settings[j].ClassFrom)!=Info.GetTag(k)))
					continue;

				Res.Subst(&quot;SettingName&quot;, HtmlEncode(TempPI.Settings[j].DisplayName));

				if (TempPI.Settings[j].Value ~= &quot;true&quot;)
					Data = &quot;True&quot;;

				else if (TempPI.Settings[j].Value ~= &quot;false&quot;)
					Data = &quot;False&quot;;

				else
				{
					if (TempPI.Settings[j].RenderType ~= &quot;Select&quot;)
					{
						class'wUtils103.wString'.static.Split2(TempPI.Settings[j].Data, &quot;;&quot;, Options);
						for (z=0;(z+1)&lt;Options.Length;z+=2)
						{
							if (TempPI.Settings[j].Value == Options[z])
							{
								Data = Options[z+1];
								break;
							}
						}
					}
					else Data = TempPI.Settings[j].Value;
				}

				Res.Subst(&quot;SettingData&quot;, HtmlEncode(Data));
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);
				TempRow += WebInclude(IncludeFile);
			}

			if (TempRow!=&quot;&quot;)
				PlayInfoRows += (HeadingRow$TempRow);
		}
	}
//log(&quot;Finished Building Playinfo Rows&quot;);
	return PlayInfoRows;
}

// Creates the drop-down box containing profiles names
function String GenerateSwitchProfileOptions(optional string CurrentProfileItem)
{
	local int i;
	local string SelectedStr, OptionStr;

	if (LadderRules.AllLadderProfiles.Count() == 0)
		return &quot;&lt;option value=\&quot;\&quot;&gt;***&quot;@NoneText@&quot;***&lt;/option&gt;&quot;;

	for (i=0; i &lt; LadderRules.AllLadderProfiles.Count(); i++)
	{
	// This item was the item passed in by CurrentProfileItem, so make it active
		if (CurrentProfileItem ~= LadderRules.AllLadderProfiles.GetItem(i))
			SelectedStr = &quot; selected&quot;;
		else SelectedStr = &quot;&quot;;

		OptionStr = OptionStr$&quot;&lt;option value=\&quot;&quot;$LadderRules.AllLadderProfiles.GetItem(i)$&quot;\&quot;&quot;$SelectedStr$&quot;&gt;&quot;$LadderRules.AllLadderProfiles.GetTag(i)@&quot;&lt;/option&gt;&quot;;
	}
	return OptionStr;
}

function bool SettingIsAllowed(byte SettingSecLevel)
{
	return SettingSecLevel &lt;= CurAdmin.MaxSecLevel();
}

// Handles generation of the double map select boxes (Exclude &amp; Include)
function String CreateMapListSelect(array&lt;ProfileConfigSet.ProfileMap&gt; AllPCSMaps, StringArray MapList, StringArray MovedMaps)
{
	local int i,j;
	local String ResponseStr, SelectedStr, Tmp;

	if (MapList.Count() == 0)
		return &quot;&lt;option value=\&quot;\&quot;&gt;***&quot;@NoneText@&quot;***&lt;/option&gt;&quot;;

	for (i = 0; i&lt;MapList.Count(); i++)
	{
	// Index for map within AllPCSMaps
		j = int(MapList.GetItem(i));

		Tmp = AllPCSMaps[j].MapName;
		SelectedStr = &quot;&quot;;
		if (MovedMaps != None &amp;&amp; MovedMaps.FindItemId(string(j)) &gt;= 0)
			SelectedStr = &quot; selected&quot;;
		ResponseStr = ResponseStr$&quot;&lt;option value=\&quot;&quot;$Tmp$&quot;\&quot;&quot;$SelectedStr$&quot;&gt;&quot;$Tmp$&quot;&lt;/option&gt;&quot;;
	}

	return ResponseStr;
}

//**********************
// Import / Export
//**********************

// Handles spacing for textboxes on export page
function int GetLongestURL()
{
	local int i, Current, Largest;

	for (i = 0; i &lt; ExportMaster.Zips.Length; i++)
	{
		Current = Len(ExportMaster.Zips[i].ZipURL);
		if (Current &gt; Largest)
			Largest = Current;
	}

	return Largest + 1;
}

// Handles filling in zip-location textboxes on export page
function string GetLocation(string Package)
{
	local int i;

	// Check if we're dealing with a map or a mutator
	i = InStr(Package, &quot;.&quot;);

	// Dealing with a mutator - remove class name
	if (i != -1)
		Package = Left(Package, i);

	return ExportMaster.FindZipLocation(Package);
}

// Handles saving zip file locations from export page
function SetLocation(string Package, string NewLocation)
{
	local int i;

	// Check if we're dealing with a map or a mutator
	i = InStr(Package, &quot;.&quot;);

	// Dealing with a mutator - remove class name
	if (i != -1)
		Package = Left(Package, i);

	if (NewLocation == &quot;&quot;)
		ExportMaster.DeleteZipLocation(Package);
	else ExportMaster.AddZipLocation(Package, NewLocation);
}

// Utility function to remove strings from profile names before
// creating .txt for exported profile
function string RemoveStr(string Source,string mask)
{
	local int i;
	local string left,right;

	i = InStr(Source,mask);
	while (i != -1)
	{
		Divide(Source,mask,left,right);
		Source = Left$Right;
		i = InStr(Source,Mask);
	}

	return Source;
}

// Prevents entering a zip file location for any package
// that is already included with the game
function bool EpicPackage(string Package)
{
	local int i;

	// Check if we're dealing with a map or a mutator
	i = InStr(Package, &quot;.&quot;);

	// Dealing with a mutator - remove class name
	if (i != -1)
		Package = Left(Package, i);

	for (i = 0;i &lt; 66; i++)
		if (Package ~= EpicPackages[i])
			return true;
	return false;
}

// Cleans up browser connections left open while waiting
// for a profile to be imported
function ForceCleanup(WebConnectionPlus Connection)
{
	Connection.bNoCleanup = False;
	Connection.Cleanup();
}

function CheckSettingValue(string SettingData, out string NewValue)
{
	local string sMaxLength, sMinMax, sMin, sMax;
	local int iMaxLength, iMin, iMax, iValue;
	local float fMin, fMax, fValue;
	local bool bFloat;

	if (SettingData == &quot;&quot;)
		return;

// This setting has no valid min/max (it is a password setting or something)
	if (InStr(SettingData,&quot;;&quot;) &lt; 0 )
	{
		iMaxLength = int(SettingData);
		if (Len(NewValue) &gt; iMaxLength)
			NewValue = Left(NewValue,iMaxLength);
		return;
	}

	Divide(SettingData,&quot;;&quot;,sMaxLength,sMinMax);	// Split the Max Length &amp; MinMax Info
	Divide(sMinMax,&quot;:&quot;,sMin,sMax);				// Split the Min &amp; Max info for casting
	iMaxLength = int(sMaxLength);
	if ( InStr(sMin,&quot;.&quot;) &gt;= 0 || InStr(sMax,&quot;.&quot;) &gt;= 0)	// Are we dealing with floating point numbers?
	{
		bFloat = True;
		fMin = float(sMin);
		fMax = float(sMax);
	}

	else
	{
		iMin = int(sMin);
		iMax = int(sMax);
	}

	// First check for length
	if (Len(NewValue) &gt; iMaxLength)
		NewValue = Left(NewValue,iMaxLength);

	if (bFloat)
	{
		fValue = float(NewValue);
		fValue = FClamp(fValue,fMin,fMax);
		NewValue = string(fValue);
	}
	else
	{
		iValue = int(NewValue);
		iValue = Clamp(iValue,iMin,iMax);
		NewValue = string(iValue);
	}
}
//*****************************************************************************
//*****************************************************************************
// Query Methods
//
//

// Passes the SessionID variable to all pages in this query action
// if SessionID is not present in WebRequest, generates one
// (Helpful when dealing with frames)
function bool PreQuery(WebRequest Req, WebResponse Res)
{
	local string SID;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	if (SID == &quot;&quot;)
	{
		SID = SMaster.getSession(&quot;xxxxx&quot;,true).GetHash();
		Req.AddVariable(&quot;SessionID&quot;, SID);
	}
	Res.Subst(&quot;SessionID&quot;, SID);
	return true;
}

function bool Query(WebRequest Request, WebResponse Response)
{
	switch (Mid(Request.URI, 1))
	{
	case DefaultPage: 		if (!MapIsChanging()) QueryLadderFrame(Request, Response);		return true;
	case ProfileMenuURI:	if (!MapIsChanging()) QueryLadderMenu(Request, Response);		return true;
	case ProfileViewURI:	if (!MapIsChanging()) QueryLadderView(Request, Response);		return true;
	case ProfileEditURI: 	if (!MapIsChanging()) QueryLadderEdit(Request, Response);		return true;
	case ProfileSwitchURI:	if (!MapIsChanging()) QueryLadderSwitch(Request, Response);		return true;
	case ProfileManageURI:	if (!MapIsChanging()) QueryLadderManage(Request, Response);		return true;

// Management subframes
	case SubFrameURI: 		if (!MapIsChanging()) QuerySubFrame(Request, Response);			return true;
	case SubFrameMenuURI: 	if (!MapIsChanging()) QuerySubMenu(Request, Response);			return true;
	case SubGametypeURI:	if (!MapIsChanging()) QuerySubGameType(Request, Response);		return true;
	case SubMapsURI:		if (!MapIsChanging()) QuerySubMaps(Request, Response);			return true;
	case SubMutatorsURI:	if (!MapIsChanging()) QuerySubMutators(Request, Response);		return true;
	case SubRulesURI:		if (!MapIsChanging()) QuerySubRules(Request, Response);			return true;
	case SubReviewURI:		if (!MapIsChanging()) QuerySubReview(Request, Response);		return true;
	case SubSavedURI:		if (!MapIsChanging()) QuerySubSaved(Request, Response);			return true;
	case SubImportURI: 		if (!MapIsChanging()) QuerySubImport(Request, Response);		return true;
	case SubExportURI: 		if (!MapIsChanging()) QuerySubExport(Request, Response);		return true;
	}
// This query is looking for a page from another query handler
// or the map is changing
	return false;
}

function QueryLadderFrame(WebRequest Req, WebResponse Res)
{
	local String Page;
	local string SID;

// if no page specified, use the default
	Page = Req.GetVariable(&quot;Page&quot;, ProfileViewURI);
	SID = Req.GetVariable(&quot;SessionID&quot;);

// Tell the menu page which page we're viewing (with the ?Page=),
// so that it can highlight the appropriate link
	Res.Subst(&quot;IndexURI&quot;,ProfileMenuURI$&quot;?Page=&quot;$Page$&quot;?SessionID=&quot;$SID);

// Load the main page into the frameset
	Res.Subst(&quot;MainURI&quot;, Page$&quot;?SessionID=&quot;$SID);

	ShowFrame(Res, DefaultPage);
}

function QuerySubFrame(WebRequest Req, WebResponse Res)
{
	local string Page, SID, TempStr, Action;
	local Session CurS;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID, true);

	Action = Req.GetVariable(&quot;Actions&quot;,&quot;Add&quot;);

	if (Action ~= &quot;Modify&quot;)
	{
		TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);
		if (TempStr != &quot;&quot;) CreateSessionInfo(TempStr,SID,True);
	}

	else if (Action ~= &quot;Add&quot;)
	{
		TempStr = Req.GetVariable(&quot;TextInput&quot;);
		if (TempStr != &quot;&quot;) CurS.setValue(&quot;ProfileName&quot;,TempStr,True);
	}

// if no page specified, use the default
	Page = Req.GetVariable(&quot;Page&quot;, SubGameTypeURI);
	CurS.setValue(&quot;CurrentPage&quot;, Page, True);

// Tell the SubMenu page which page we're viewing, so that it can highlight
// the appropriate link
	Res.Subst(&quot;SubMenuURI&quot;, SubFrameMenuURI$&quot;?SessionID=&quot;$SID);

// Load the main page into the frameset
	Res.Subst(&quot;SubMainURI&quot;, Page$&quot;?SessionID=&quot;$SID);
	ShowFrame(Res, SubFrame);
}

function QueryLadderMenu(WebRequest Req, WebResponse Res)
{
	local string SID;

	SID = Req.GetVariable(&quot;SessionID&quot;);
/*
If ?SessionID= is appended to the link, PreQuery() will not generate
a new Session when this link is queried
*/
	// Set URIs
	if (CanPerform(&quot;Lv&quot;))
		Res.Subst(&quot;ViewProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileViewURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkViewProfile$&quot;&lt;/a&gt;&lt;br /&gt;&quot;);

	if (CanPerform(&quot;Le&quot;))
		Res.Subst(&quot;EditProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileEditURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkEditProfile$&quot;&lt;/a&gt;&lt;br&gt;&quot;);

	if (CanPerform(&quot;Ls&quot;))
		Res.Subst(&quot;SwitchProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileSwitchURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkSwitchProfile$&quot;&lt;/a&gt;&lt;br&gt;&quot;);

	if (CanPerform(&quot;Lm&quot;))
		Res.Subst(&quot;ManageProfiles&quot;, &quot;&lt;a href=\&quot;&quot;$ProfileManageURI$&quot;\&quot; target=\&quot;main\&quot;&gt;&quot;$LinkManageProfile$&quot;&lt;/a&gt;&lt;br&gt;&quot;);

	ShowPage(Res, ProfileMenuURI);
}

function QuerySubMenu(WebRequest Req, WebResponse Res)
{
// Highlight the current page
	local string Highlighted, Background, SID;
	local string GameLink, MutatorLink, MapLink, RuleLink, ReviewLink;
	local string GameSpan, MutatorSpan, MapSpan, RuleSpan, ReviewSpan;

	local string Page;
	local Session CurS;

	if (CanPerform(&quot;Lm&quot;))
	{
		Highlighted = &quot;&lt;span class=\&quot;blue\&quot;&gt;&quot;;
		Background = &quot;&lt;span class=\&quot;red\&quot;&gt;&quot;;
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, true);

		// We are managing an existing profile
		if (CurS.HasData(&quot;ProfileIndex&quot;))
	    	Res.Subst(&quot;Section&quot;, LabelModifyProfile);

		else Res.Subst(&quot;Section&quot;, LabelAddProfile);

		Page = CurS.getValue(&quot;CurrentPage&quot;,SubGametypeURI);

	// Including ?SessionID= in link prevents PreQuery() from generating a new Session
		GameLink = 		&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubGametypeURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		MutatorLink = 	&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubMutatorsURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		MapLink = 		&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubMapsURI$		&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		RuleLink = 		&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubRulesURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;
		ReviewLink = 	&quot;&lt;a href=\&quot;&quot;$SubFrameURI$&quot;?SessionID=&quot;$SID$&quot;?Page=&quot;$SubReviewURI$	&quot;\&quot; target=\&quot;_parent\&quot;&gt;&quot;;

	// Initially set all spans to the background color
		GameSpan 	= Background;
		MutatorSpan = Background;
		MapSpan 	= Background;
		RuleSpan 	= Background;
		ReviewSpan 	= Background;

		// Then set the appropriate span to the highlighted color
		Res.Subst(&quot;SubTitle&quot;, CurS.GetValue(&quot;ProfileName&quot;));
		switch (Page)
		{
			case SubGametypeURI:
				Curs.SetValue(&quot;ButtonName&quot;,		ProfileButtonName[1],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[1],true);

				Res.Subst(&quot;PageHelp&quot;, HelpGameType);
				GameSpan = Highlighted; break;

			case SubMutatorsURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[2],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[2],true);

				Res.Subst(&quot;PageHelp&quot;, HelpMutators);
				MutatorSpan = Highlighted; break;

			case SubMapsURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[3],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[3],true);

				Res.Subst(&quot;PageHelp&quot;, HelpMaps);
				Mapspan = Highlighted; break;

			case SubRulesURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[4],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[4],true);

				Res.Subst(&quot;PageHelp&quot;, HelpPlayInfo);
				RuleSpan = Highlighted; break;

			case SubReviewURI:
				Curs.SetValue(&quot;ButtonName&quot;, 	ProfileButtonName[5],true);
				Curs.SetValue(&quot;ButtonValue&quot;, 	ProfileButtonValue[5],true);

				Res.Subst(&quot;PageHelp&quot;, HelpReview);
				ReviewSpan = Highlighted; break;
		}

		GameLink 	= GameLink 		$ GameSpan 		$ TableTitle[1]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		MutatorLink = MutatorLink 	$ MutatorSpan 	$ TableTitle[2]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		MapLink 	= MapLink 		$ MapSpan 		$ TableTitle[3]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		RuleLink 	= RuleLink 		$ RuleSpan 		$ TableTitle[4]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;
		ReviewLink 	= ReviewLink 	$ ReviewSpan 	$ TableTitle[5]$&quot;&lt;/span&gt;&lt;/a&gt;&quot;;

		Res.Subst(&quot;GameTypeLink&quot;, 	GameLink);
		Res.Subst(&quot;MutatorsLink&quot;, 	MutatorLink);
		Res.Subst(&quot;MapsLink&quot;, 		MapLink);
		Res.Subst(&quot;RulesLink&quot;, 		RuleLink);
		Res.Subst(&quot;ReviewLink&quot;, 	ReviewLink);

		ShowPage(Res, SubFrameMenu);
	}

	else AccessDenied(Res);
}

function QueryLadderView(WebRequest Req, WebResponse Res)
{
	local int i,j;
	local Session 	CurS;
	local string	SID,
					TempStr,
					ViewRows,
					NewProfile,
					NewGameType;

	local StringArray 			Mutators, GroupsOnly, ServerActors;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local class&lt;Mutator&gt;		TempMut;
	local class&lt;Info&gt;			TempSA;


	if (CanPerform(&quot;Lv&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID,true);

		if (CanPerform(&quot;Ls&quot;))
		{

			if (Req.GetVariable(&quot;SetProfileName&quot;,&quot;&quot;)!=&quot;&quot;) // We would like to view a different profile
				TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);

			If (TempStr == &quot;&quot;)	// Not selecting a new profile to view
			{
			// First, see if the current session is holding a profile
				NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);
				if (NewProfile == &quot;&quot;)
				{
				// See if a profile is currently loaded
					j = GetCurrentConfigIndex();
					if (j!=-1)		// Found an active profile - this profile should be selected
						NewProfile = string(j);
				}
			}

			if (TempStr!=&quot;&quot;)
				NewProfile = TempStr;

			Res.Subst(&quot;ButtonName&quot;, &quot;SetProfileName&quot;);
			Res.Subst(&quot;ButtonValue&quot;, ButtonLoadProfile);
			Res.Subst(&quot;PageCaption&quot;, &quot;&lt;select class=mini name='ProfileNameSelect'&gt;&quot;$GenerateSwitchProfileOptions(NewProfile)$&quot;&lt;/select&gt;&quot;);
		}

	// If admin doesn't have switch privileges, check for current profile
		if (NewProfile == &quot;&quot;)
		{
			NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);
			if (NewProfile == &quot;&quot;)
			{
				j = GetCurrentConfigIndex();
				if (j != -1)
					NewProfile = string(j);
			}
		}

		if (NewProfile != &quot;&quot; &amp;&amp; LadderRules.AllLadderProfiles.Count() &gt; 0)
		{
			CurS.setValue(&quot;ProfileIndex&quot;, NewProfile, True);
            CreateSessionInfo(NewProfile,SID);
			NewGameType = CurS.getValue(&quot;GameType&quot;);

			if (NewGameType != &quot;&quot;)
				GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(NewGameType,class'Class'));
			if (GIClass==None)
			{
				ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
				return;
			}

			TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
			if (TempStr != &quot;&quot;)
				ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (ACClass == None)
			{
				ShowMessage(Res,ErrorAccessControlTitle,ErrorAccessControlText);
				return;
			}

			Mutators = new(None) class'SortedStringArray';
			GroupsOnly = new(None) class'SortedStringArray';
			ServerActors = new(None) class'SortedStringArray';
		// Mutator Section
			for (i=0;i&lt;CurS.getMutatorLength();i++)
			{
			    TempStr = CurS.getMutator(i);
                for (j=0;j&lt;AllMutators.Length;j++)
				{
					if (TempStr ~= AllMutators[j].ClassName)
					{
						TempMut = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
						if (TempMut != None)
							Mutators.Add(string(j), AllMutators[j].FriendlyName);
					}
				}
			}

			for (i=0;i&lt;CurS.getSALength();i++)
			{
				TempStr = CurS.GetServerActor(i);
				for (j=0;j&lt;ConfigM.ManagedActors.Length;j++)
				{
					if (TempStr ~= string(ConfigM.ManagedActors[j].SAClass))
					{
						TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
						if (TempSA != None)
							ServerActors.Add(string(j),ConfigM.ManagedActors[j].SAName);
					}
				}
			}

			Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
			ViewRows = ViewRows$WebInclude(IncludeSection);

			for (i = 0; i&lt;ServerActors.Count(); i++)
			{
				j = int(ServerActors.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, ServerActors.GetTag(i));
				if (CurS.SARequired(string(ConfigM.ManagedActors[j].SAClass)))
					Res.Subst(&quot;SettingData&quot;, RequiredText);
				else Res.Subst(&quot;SettingData&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
				ViewRows = ViewRows $ WebInclude(IncludeRows);
			}
			ViewRows = ViewRows $ &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;;
			for (i = 0; i&lt;Mutators.Count(); i++)
			{
				j = int(Mutators.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, AllMutators[j].FriendlyName);
				if (CurS.MutRequired(AllMutators[j].ClassName))
					Res.Subst(&quot;SettingData&quot;, RequiredText);
				else Res.Subst(&quot;SettingData&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
				ViewRows = ViewRows$WebInclude(IncludeRows);
			}

			Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
			ViewRows = ViewRows$WebInclude(IncludeSection);

			Res.Subst(&quot;SettingName&quot;, LabelMaxMaps);
			TempStr = CurS.getValue(&quot;MaxMaps&quot;);
			if (TempStr == &quot;0&quot;)
				TempStr = UnlimitedText;
			Res.Subst(&quot;SettingData&quot;, TempStr);
			Res.Subst(&quot;Extra&quot;, &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;);
			ViewRows = ViewRows$WebInclude(IncludeRows);
			for (i=0;i&lt;CurS.getMapLength();i++)
			{
                TempStr = CurS.getMap(i);
                Res.Subst(&quot;SettingName&quot;, TempStr);
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);
				if (CurS.MapRequired(TempStr))
					Res.Subst(&quot;SettingData&quot;, RequiredText);
				else Res.Subst(&quot;SettingData&quot;, &quot;&amp;nbsp;&amp;nbsp&quot;);

				ViewRows = ViewRows$WebInclude(IncludeRows);// configme
			}

			Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
			ViewRows = ViewRows $ WebInclude(IncludeSection);// configme
			ViewRows = ViewRows $ &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot; $ GeneratePlayInfoRows(Req, Res, IncludeRows);
		}

	// We have no profile currently active
		else
		{
			Res.Subst(&quot;SettingName&quot;, PageCaption[0]);
			ViewRows = ViewRows $ WebInclude(IncludeRows);
		}

		TempStr = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; TempStr == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			TempStr = TempStr @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;TableRows&quot;, ViewRows);// configme
		Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeCaptionButton)$WebInclude(IncludeTable));
		Res.Subst(&quot;Section&quot;, LinkViewProfile);
		Res.Subst(&quot;SubTitle&quot;, TempStr);
		Res.Subst(&quot;PageHelp&quot;, HelpViewProfile);
		Res.Subst(&quot;PostAction&quot;, ProfileViewURI$&quot;?SessionID=&quot;$SID);

		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

function QueryLadderEdit(WebRequest Req, WebResponse Res)
{
	local Session CurS;
	local bool 	bAllMuts;
	local int 	i,j,k,z,
				id,
				Count,
				MoveCount;

	local string	SID,
					EditRows,
					TempStr, Tmp, NewProfile, NewGameType,
					lastgroup, thisgroup, nextgroup, EmptyRow;

	local ProfileConfigSet 		TempPCS;
	local array&lt;string&gt; 		TempMutes;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;ProfileConfigSet.ProfileMap&gt; 		AllPCSMaps;
	local array&lt;ProfileConfigSet.ProfileMutator&gt; 	AllPCSMutators;
	local array&lt;ProfileConfigSet.ProfileSA&gt;			AllPCSServerActors;
	local StringArray
				Mutators, GroupsOnly, Required, ServerActors, ReqSA,
				RequiredMaps, IncludeMaps, ExcludeMaps, MovedMaps;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID,true);
	if (CanPerform(&quot;Le&quot;))
	{
		if (CanPerform(&quot;Ls&quot;))
		{
			if (Req.GetVariable(&quot;SetProfileName&quot;,&quot;&quot;)!=&quot;&quot;) // We would like to view a different profile
				TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);

			If (TempStr == &quot;&quot;)	// Not selecting a new profile to view
			{
			// First, see if the current session is holding a profile
				NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);

				if (NewProfile == &quot;&quot;)
				{
				// See if a profile is currently loaded
					j = GetCurrentConfigIndex();
					if (j!=-1)		// Found an active profile - this profile should be selected
						NewProfile = string(j);
				}

			}

			if (TempStr!=&quot;&quot;)
				NewProfile = TempStr;

			Res.Subst(&quot;ButtonName&quot;, &quot;SetProfileName&quot;);
			Res.Subst(&quot;ButtonValue&quot;, ButtonLoadProfile);
			Res.Subst(&quot;PageCaption&quot;, &quot;&lt;select class=mini name='ProfileNameSelect'&gt;&quot;$GenerateSwitchProfileOptions(NewProfile)$&quot;&lt;/select&gt;&quot;);
		}
		CurS.setValue(&quot;CurrentPage&quot;, ProfileEditURI, true);
		CurS.setValue(&quot;ButtonName&quot;, &quot;ApplyProfileChanges&quot;,true);
		CurS.setValue(&quot;ButtonValue&quot;, ButtonApplyProfileChanges, true);

// If admin doesn't have switch privileges, check for current profile
		if (NewProfile == &quot;&quot;)
		{
			NewProfile = CurS.getValue(&quot;ProfileIndex&quot;);
			if (NewProfile == &quot;&quot;)
			{
				j = GetCurrentConfigIndex();
				if (j != -1)
					NewProfile = string(j);
			}
		}

		CurS.setValue(&quot;ProfileIndex&quot;, NewProfile, True);
		if (NewProfile != &quot;&quot; &amp;&amp; LadderRules.AllLadderProfiles.Count() &gt; 0)
		{
			ProfileMaps.Reset();
			Required = new(None) 		class'SortedStringArray';
			ReqSA	= new(None)			class'SortedStringArray';
			Mutators = new(None) 		class'SortedStringArray';
			MovedMaps = new(None) 		class'SortedStringArray';
			GroupsOnly = new(None) 		class'SortedStringArray';
			ServerActors = new(None)	class'SortedStringArray';
			IncludeMaps = new(None) 	class'SortedStringArray';
			ExcludeMaps = new(None) 	class'SortedStringArray';
			RequiredMaps = new(None) 	class'SortedStringArray';

            CreateSessionInfo(NewProfile,SID);
			TempPCS = LadderRules.LadderProfiles[int(NewProfile)];
			TempPCS.StartEdit();

			NewGameType = CurS.getValue(&quot;GameType&quot;);
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(NewGameType,class'Class'));
			if (GIClass==None)
			{
				ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
				return;
			}

			TempStr = CurS.getValue(&quot;ACClass&quot;, Level.Game.AccessControlClass);
			if (TempStr != &quot;&quot;)
				ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
			AllPCSMutators = TempPCS.GetProfileMutators();
			AllPCSMaps = TempPCS.GetProfileMaps();
			AllPCSServerActors = TempPCS.GetProfileServerActors();

	// Load Exclude Maps
			for (i=0;i&lt;AllPCSMaps.Length;i++)
			{
				ProfileMaps.Add(string(i), AllPCSMaps[i].MapName);
				if (AllPCSMaps[i].bRequired)
				{
					RequiredMaps.Add(string(i),string(AllPCSMaps[i].MapListOrder));
					IncludeMaps.Add(string(i),string(AllPCSMaps[i].MapListOrder));
				}

				else ExcludeMaps.Add(string(i),string(AllPCSMaps[i].MapListOrder));
			}

			for (i=0;i&lt;CurS.GetMapLength();i++)
			{
				j = ExcludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(CurS.getMap(i))));
				if (j &gt;= 0) IncludeMaps.MoveFromId(ExcludeMaps, j);
			}

			if (Req.GetVariable(&quot;ApplyProfileChanges&quot;,&quot;&quot;)!=&quot;&quot;)
			{
				for (i=0;i&lt;AllPCSMutators.Length;i++)
					for (j=0;j&lt;AllMutators.Length;j++)
						if (AllPCSMutators[i].MutatorName ~= AllMutators[j].ClassName)
							Mutators.Add(string(j),AllPCSMutators[i].MutatorName);

				for (i=0;i&lt;Mutators.Count();i++)
				{
					if ((Req.GetVariable(Mutators.GetTag(i),&quot;&quot;)!=&quot;&quot;)||(Req.GetVariable(AllMutators[int(Mutators.GetItem(i))].GroupName)~=Mutators.GetTag(i)))
						TempPCS.AddMutator(Mutators.GetTag(i));
					else TempPCS.DelMutator(Mutators.GetTag(i));
				}

				for (i=0;i&lt;AllPCSServerActors.Length;i++)
				{
					if (Req.GetVariable(AllPCSServerActors[i].ActorClass,&quot;&quot;) != &quot;&quot;)
						TempPCS.AddServerActor(AllPCSServerActors[i].ActorClass);
					else TempPCS.DelServerActor(AllPCSServerActors[i].ActorClass);
				}

				for (i=0;i&lt;AllPCSMaps.Length;i++)
				{
					if (AllPCSMaps[i].bRequired) TempPCS.AddMap(AllPCSMaps[i].MapName,int(RequiredMaps.GetTag(RequiredMaps.FindItemId(string(i)))));
					else if (IncludeMaps.FindItemId(string(i)) &gt;= 0) TempPCS.AddMap(AllPCSMaps[i].MapName,int(IncludeMaps.GetTag(IncludeMaps.FindItemId(string(i)))));
					else TempPCS.RemoveMap(AllPCSMaps[i].MapName);
				}

                CreateSessionInfo(NewProfile,SID,false,true);
			}
			else if (Req.GetVariable(&quot;AddMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				Count = Req.GetVariableCount(&quot;ExcludeMapsSelect&quot;);
				for (i=0; i&lt;Count; i++)
				{
					if (IncludeMaps.Count() &gt;= TempPCS.MaxMaps &amp;&amp; TempPCS.MaxMaps &gt; 0)
						break;
					if (ExcludeMaps.Count() &gt; 0)
					{
						id = IncludeMaps.MoveFromId(ExcludeMaps, ExcludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;ExcludeMapsSelect&quot;, i)))));
						if (id &gt;= 0)
						{
							TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(id))].MapName,int(IncludeMaps.getTag(id)));
							MovedMaps.CopyFromId(IncludeMaps, id);
						}
						else
							Log(ErrorExcludeMapNotFound@Req.GetVariableNumber(&quot;ExcludeMapsSelect&quot;, i));
					}
				}
				for (i=0;i&lt;IncludeMaps.Count();i++)
					TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(i))].MapName,i);

                CreateSessionInfo(NewProfile,SID,false,true,True);
			}

			else if (Req.GetVariable(&quot;DelMap&quot;, &quot;&quot;) != &quot;&quot; &amp;&amp; Req.GetVariableCount(&quot;IncludeMapsSelect&quot;) &gt; 0)
			{
				Count = Req.GetVariableCount(&quot;IncludeMapsSelect&quot;);
				for (i=0; i&lt;Count; i++)
				{
					if (RequiredMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i)))) &lt; 0)
					{
						if (IncludeMaps.Count() &gt; 0)
						{
							id = ExcludeMaps.MoveFromId(IncludeMaps, IncludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i)))));
							if (id &gt;= 0)
							{
								TempPCS.RemoveMap(AllPCSMaps[int(ExcludeMaps.GetItem(id))].MapName);
								MovedMaps.CopyFromId(ExcludeMaps, id);
							}
							else
								Log(ErrorIncludeMapNotFound@Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i));
						}
					}
				}
                CreateSessionInfo(NewProfile,SID,false,true,True);
			}
			else if (Req.GetVariable(&quot;AddAllMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				while (ExcludeMaps.Count() &gt; 0 &amp;&amp; (IncludeMaps.Count() &lt; TempPCS.MaxMaps || TempPCS.MaxMaps == 0) )
				{
					id = IncludeMaps.MoveFromId(ExcludeMaps, ExcludeMaps.Count()-1);
					if (id &gt;= 0)
					{
						TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(id))].MapName,int(IncludeMaps.getTag(id)));
						MovedMaps.CopyFromId(IncludeMaps, id);
					}
				}
				for (i=0;i&lt;IncludeMaps.Count();i++)
					TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(i))].MapName,i);
               CreateSessionInfo(NewProfile,SID,false,true,True);
			}
			else if (Req.GetVariable(&quot;DelAllMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				i = IncludeMaps.Count();
				while (i &gt; 0 &amp;&amp; IncludeMaps.Count() &gt; RequiredMaps.Count())
				{
					if (RequiredMaps.FindItemId(IncludeMaps.GetItem(i-1)) &lt; 0)
					{
						id =  ExcludeMaps.MoveFromId(IncludeMaps, i-1);
						if (id &gt;= 0)
						{
							TempPCS.RemoveMap(AllPCSMaps[int(ExcludeMaps.GetItem(id))].MapName);
							MovedMaps.CopyFromId(ExcludeMaps, id);
						}
					}
					i--;
				}
                CreateSessionInfo(NewProfile,SID,false,true,True);
			}
			else if (Req.GetVariable(&quot;MoveMap&quot;, &quot;&quot;) != &quot;&quot;)
			{
				MoveCount = int(Abs(float(Req.GetVariable(&quot;MoveMapCount&quot;))));
				if (MoveCount != 0)
				{
					Count = Req.GetVariableCount(&quot;IncludeMapsSelect&quot;);

					// 1) Create a sorted MovedMaps list
					for (i = 0; i&lt;Count; i++)
						MovedMaps.CopyFromId(IncludeMaps, IncludeMaps.FindItemId(ProfileMaps.GetItem(ProfileMaps.FindTagId(Req.GetVariableNumber(&quot;IncludeMapsSelect&quot;, i)))));

					if (Req.GetVariable(&quot;MoveMap&quot;) ~= &quot;Down&quot;)
					{
						// 2) Browse from Last to 0 until all maps are moved by count
						//    but stop moving them if hitting bottom
						for (i = IncludeMaps.Count()-1; i &gt;= 0; i--)
							if (MovedMaps.FindItemId(IncludeMaps.GetItem(i)) &gt;= 0)
								IncludeMaps.ShiftStrict(i, MoveCount);
					}
					else
					{
						MoveCount = -MoveCount;
						for (i = 0; i&lt;IncludeMaps.Count(); i++)
							if (MovedMaps.FindItemId(IncludeMaps.GetItem(i)) &gt;= 0)
								IncludeMaps.ShiftStrict(i, MoveCount);
					}
				}

				for (i=0;i&lt;IncludeMaps.Count();i++)
					TempPCS.AddMap(AllPCSMaps[int(IncludeMaps.getItem(i))].MapName,i);

                CreateSessionInfo(NewProfile,SID,false,true,True);
			}

			if (TempPCS.CanEdit())
				TempPCS.StartEdit();
// Mutator Section
			Mutators.Reset();
	// Set active ServerActors
			TempMutes = LoadActiveProfileServerActors(NewProfile);
			TempStr = class'wUtils103.wArray'.static.Join(TempMutes,&quot;,&quot;);

			bAllMuts = TempMutes.Length == ConfigM.ManagedActors.Length;

			for (i=0;i&lt;AllPCSServerActors.Length;i++)
			{
				for (j = 0; j &lt; ConfigM.ManagedActors.Length; j++)
				{
					if (AllPCSServerActors[i].ActorClass ~= string(ConfigM.ManagedActors[j].SAClass))
					{
						if (AllPCSServerActors[i].bRequired)
							ReqSA.Add(string(j), ConfigM.ManagedActors[j].SAName);
						else ServerActors.Add(string(j),ConfigM.ManagedActors[j].SAName);
						break;
					}
				}
			}
			TempMutes = LoadActiveProfileMutators(NewProfile);
			TempStr = class'wUtils103.wArray'.static.Join(TempMutes,&quot;,&quot;);
		// Set Available Mutators for this profile
			bAllMuts = bAllMuts &amp;&amp; AllPCSMutators.Length == AllMutators.Length;
			for (i=0;i&lt;AllPCSMutators.Length;i++)
			{
				for (j=0;j&lt;AllMutators.Length;j++)
				{
					if (AllMutators[j].ClassName ~= AllPCSMutators[i].MutatorName)
					{
						if (AllPCSMutators[i].bRequired)
							Required.Add(string(j),AllMutators[j].FriendlyName);
						else
						{
					// Don't add available mutator if it belongs in the same group as a required mutator
							for (k=0;k&lt;Required.Count();k++)
								if (AllMutators[int(Required.GetItem(k))].GroupName ~= AllMutators[j].GroupName)
									break;
							if (k==Required.Count())
								Mutators.Add(string(j),AllPCSMutators[i].MutatorName);
						}
						break;
					}
				}
			}
// BEGIN OUTPUT ////////////////////////////////////////////
/*
	TempMutes is an array of active mutators, including required ones
	AllPCSMutators is a ProfileMutator array, which includes a required flag

	Need to generate a regular mutator selection list, but list all required
	first, followed by the list of all other mutators which are available
*/
// MAPS
			Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
			Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
			EmptyRow = &quot;&lt;tr&gt;&quot; $ WebInclude(CellColSpan) $ &quot;&lt;/tr&gt;&quot;;

			Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
			TempStr = string(TempPCS.GetMaxMaps());
			if (TempStr == &quot;0&quot;) TempStr = &quot;Unlimited&quot;;
			Res.Subst(&quot;SpecialInstructions&quot;, LabelMaxMaps$&quot;:&quot;@TempStr);
			EditRows += WebInclude(IncludeSection);

			j = RequiredMaps.Count();
			if (j &gt; 0)
			{
				EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ RequiredText @ MapText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ FollowingMaps@AreAssignedText $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
				i=0;
				while (i&lt;j)
				{
					Res.Subst(&quot;SettingName&quot;, AllPCSMaps[int(RequiredMaps.GetItem(i++))].MapName);
					Res.Subst(&quot;SettingData&quot;, StringIf(i &lt; j, AllPCSMaps[int(RequiredMaps.GetItem(i++))].MapName, &quot;&quot;));

					Res.Subst(&quot;Extra&quot;, &quot;&quot;);
					EditRows += WebInclude(IncludeRows);
				}
			}

			EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ AvailableText@MapText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ LabelChangeMaplist $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;

			Res.Subst(&quot;ExcludeMapsOptions&quot;, CreateMapListSelect(AllPCSMaps, ExcludeMaps,MovedMaps));
			Res.Subst(&quot;IncludeMapsOptions&quot;, CreateMapListSelect(AllPCSMaps, IncludeMaps,MovedMaps));
			Res.Subst(&quot;SpanContent&quot;, WebInclude(IncludeMapSelect));
			Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
			EditRows += WebInclude(RowLeft);

// MUTATORS
			CreateFullMutatorList(Mutators,GroupsOnly);
			Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
			Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
			EditRows += WebInclude(IncludeSection);

			if (ReqSA.Count() &gt; 0 || Required.Count() &gt; 0)
				EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ RequiredText@MutatorText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ FollowingMutators@AreAssignedText $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
// Include ServerActors first
			for (i=0;i&lt;ReqSA.Count();i++)
			{
				j = int(ReqSA.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, ReqSA.GetTag(i));
				Res.Subst(&quot;SettingData&quot;, ConfigM.ManagedActors[j].SADescription);
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);

				EditRows += WebInclude(IncludeRows);
			}

			for (i=0;i&lt;Required.Count();i++)
			{
				j=int(Required.GetItem(i));
				Res.Subst(&quot;SettingName&quot;, AllMutators[j].FriendlyName);
				Res.Subst(&quot;SettingData&quot;, AllMutators[j].Description);
				Res.Subst(&quot;Extra&quot;, &quot;&quot;);

				EditRows += WebInclude(IncludeRows);
			}

			EditRows = EditRows $ EmptyRow $ &quot;&lt;tr&gt;&lt;td class=ttext&gt;&quot; $ AvailableText@MutatorText $ &quot;&lt;/td&gt;&lt;td class=ttext&gt;&quot; $ FollowingMutators@AreAvailableText $ &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
			for (i=0;i&lt;GroupsOnly.Count();i++)
			{
				j=int(GroupsOnly.GetItem(i));
				if (AllMutators[j].GroupName==&quot;&quot;)
					thisgroup=&quot;Z&quot;$string(z++);
				else thisgroup = AllMutators[j].GroupName;
				if ( (i + 1) == GroupsOnly.Count())
					nextgroup = &quot;&quot;;
				else
				{
				// Assign nextgroup to the next mutators group
					k = int(GroupsOnly.GetItem(i + 1));
					if (AllMutators[k].GroupName==&quot;&quot;)
						nextgroup=&quot;Z&quot;$string(z);
					else nextgroup = AllMutators[k].GroupName;
				}

				Res.Subst(&quot;GroupName&quot;, thisgroup);
				Res.Subst(&quot;MutatorClass&quot;, AllMutators[j].ClassName);
				Res.Subst(&quot;MutatorName&quot;, AllMutators[j].FriendlyName);
				Res.Subst(&quot;MutatorDesc&quot;, AllMutators[j].Description);

				if ((lastgroup != thisgroup) &amp;&amp; (thisgroup == nextgroup)) // and the next mut is in the same group as this one
				{
					Res.Subst(&quot;Checked&quot;, &quot; checked&quot;);
					EditRows += WebInclude(&quot;current_mutators_group&quot;);
				}

				Res.Subst(&quot;Checked&quot;, StringIf(CurS.HasMutator(AllMutators[j].ClassName), &quot; checked&quot;, &quot;&quot;));
				EditRows += WebInclude(&quot;current_mutators_group_row&quot;);

				lastgroup=thisgroup;
			}
// Add ServerActors first
			for (i = 0; i &lt; ServerActors.Count(); i++)
			{
				TempStr = &quot;&quot;;
				j = int(ServerActors.GetItem(i));

				Res.Subst(&quot;Content&quot;, Checkbox(string(ConfigM.ManagedActors[j].SAClass), CurS.HasServerActor(string(ConfigM.ManagedActors[j].SAClass))) $ &quot;&amp;nbsp;&quot; $ ServerActors.GetTag(i));
				TempStr = WebInclude(NowrapLeft);
				Res.Subst(&quot;Content&quot;, ConfigM.ManagedActors[j].SADescription);
				Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));
				EditRows += WebInclude(RowLeft);
			}

			for (i = 0; i&lt;Mutators.Count(); i++)
			{
				TempStr = &quot;&quot;;
				j = int(Mutators.GetItem(i));

				Res.Subst(&quot;Content&quot;, Checkbox(AllMutators[j].ClassName,CurS.HasMutator(AllMutators[j].ClassName)) $ &quot;&amp;nbsp;&quot; $ AllMutators[j].FriendlyName);
				TempStr += WebInclude(NowrapLeft);
				Res.Subst(&quot;Content&quot;, AllMutators[j].Description);
				Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));
				EditRows += WebInclude(RowLeft);
			}
			TempPCS.EndEdit(False);
		}
	// We have no profile currently active
		else
		{
			Res.Subst(&quot;SettingName&quot;, PageCaption[0]);
			EditRows += WebInclude(IncludeRows);
		}
		Res.Subst(&quot;TableRows&quot;, EditRows);
		TempStr = &quot;&quot;;
		TempStr = WebInclude(IncludeCaptionButton)$Tmp$WebInclude(IncludeTable);

		if (NewProfile != &quot;&quot;)
		{
			Res.Subst(&quot;ButtonName&quot;, curS.getValue(&quot;ButtonName&quot;,&quot;ApplyProfileChanges&quot;));
			Res.Subst(&quot;ButtonValue&quot;, ButtonApplyProfileChanges);
			Res.Subst(&quot;PageCaption&quot;, &quot;&quot;);
			TempStr += WebInclude(IncludeCaptionButton);
		}

		Tmp = CurS.getValue(&quot;ProfileName&quot;,PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;LadderTable&quot;, 	TempStr);
		Res.Subst(&quot;Section&quot;,	 	LinkEditProfile);
		Res.Subst(&quot;SubTitle&quot;, 		Tmp);
		Res.Subst(&quot;PageHelp&quot;, 		HelpEditProfile);
		Res.Subst(&quot;PostAction&quot;, 	ProfileEditURI$&quot;?SessionID=&quot;$SID);
		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

function QueryLadderSwitch(WebRequest Req, WebResponse Res)
{
	local int 		j, NumMatches;
	local bool		bDelayChange, bSwitching;
	local Session 	CurS;
	local string 	SID,
					TempStr, Tmp,
					Checked;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID,true);

	if (CanPerform(&quot;Ls&quot;))
	{
		TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);
		Tmp = Req.GetVariable(&quot;SetNewProfile&quot;, &quot;&quot;);
		if (Tmp != &quot;&quot;)
		{
			if (TempStr != &quot;&quot;)
			{
				NumMatches = int(Req.GetVariable(&quot;NumMatches&quot;, &quot;0&quot;));
				bDelayChange = Req.GetVariable(&quot;DelaySwitch&quot;,&quot;&quot;) != &quot;&quot;;
				if (bDelayChange)
				{
					if (LadderRules.WaitApplyProfile(TempStr, NumMatches))
					{
						CurS.setValue(&quot;ProfileIndex&quot;, TempStr, True);
						bSwitching = True;
					}
				}
				else
				{
				// We would like to switch immediately
					LadderRules.ApplyProfile(TempStr, NumMatches);
					MapIsChanging();
					return;
				}
			}
			else StatusError(Res, ErrorNoProfilesExist);
		}

		else if (LadderRules.Profiles.Length &gt; 0)
		{
			j = GetCurrentConfigIndex();
			if (j &gt;= 0) TempStr = string(j);
		}

		bDelayChange = Req.GetVariable(&quot;DelaySwitch&quot;,&quot;&quot;) != &quot;&quot; || LadderRules.bWaitingToSwitch;
		if (bDelayChange)
			Checked = &quot; checked&quot;;
		else Checked = &quot;&quot;;

		Res.Subst(&quot;ProfileSelect&quot;, 		GenerateSwitchProfileOptions(TempStr));
		Res.Subst(&quot;NumberGamesText&quot;, 	LabelNumberGames);
		Res.Subst(&quot;TextName&quot;, 			&quot;NumMatches&quot;);
		Res.Subst(&quot;TextValue&quot;, 			string(NumMatches));
		Res.Subst(&quot;TextSize&quot;, 			&quot;3&quot;);
		Res.Subst(&quot;TextLength&quot;, 		&quot;3&quot;);
		Res.Subst(&quot;SwitchButtonName&quot;, 	&quot;SetNewProfile&quot;);
		Res.Subst(&quot;SwitchButtonValue&quot;, 	ButtonLoadProfile);
		Res.Subst(&quot;DelayCheckName&quot;, 	&quot;DelaySwitch&quot;);
		Res.Subst(&quot;Checked&quot;, 			Checked);
		Res.Subst(&quot;DelayCheckLabel&quot;, 	LabelDelayProfileChange);

		if (Tmp != &quot;&quot; &amp;&amp; bSwitching)
			StatusOK(Res, SuccessSwitchProfile);

		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeSwitch));
		Res.Subst(&quot;Section&quot;, 		LinkSwitchProfile);
		Res.Subst(&quot;SubTitle&quot;, 		Tmp);
		Res.Subst(&quot;PageHelp&quot;, 		HelpSwitchProfile);
		Res.Subst(&quot;PostAction&quot;, 	ProfileSwitchURI$&quot;?SessionID=&quot;$SID);

		ShowPage(Res, MasterPage);
	}
	else AccessDenied(Res);
}

function QuerySubImport(WebRequest Req, WebResponse Res)
{
	local string 					SID;
	local Session 					CurS;
	local ProfileConfigSet 			TempPCS;

	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID,true);
	if (CanPerform(&quot;Lm&quot;))
	{
	// We've gotten our profile - want to integrate it into the server now
		if (Req.GetVariable(&quot;ImportRemoteProfile&quot;,&quot;&quot;) != &quot;&quot;)
		{
			TempPCS = CreateImportSessionInfo(CurS);
			if (TempPCS == None)
			{
				ShowMessage(Res, ImportProfileFailTitle, ImportProfileFailText);
				return;
			}
			ShowMessage(Res, SuccessImportProfileTitle, SuccessImportProfile);
			return;
		}
	}

	else AccessDenied(Res);
}

function RemoteImport(ProfileImporter ProfileConn)
{
	local int i,j;
	local Session 	CurS;
	local string 	Tmp, TempStr,
					ImportRows,
					PackageLink,
					NewGameType, CustomGameLocation,
					NewAccessType, CustomAccessLocation,
					ImportProfileHTML,
					MapLocation, MutatorLocation, MutatorName;
	local StringArray ImportMaps, ImportMutators;

	local WebRequest 		Req;
	local WebResponse 		Res;
	local WebConnectionPlus WebConn;

	Req = ProfileConn.QueryRequest;
	Res = ProfileConn.QueryResponse;

	if (Res == None)
	{
		ShowMessage(Res, ErrorText, ErrorTimeout);
		return;
	}

	if (WebConnectionPlus(Res.Connection) != None)
		WebConn = WebConnectionPlus(Res.Connection);

	if (WebConn == None)
	{
		log(ErrorReplacingWebConnection,LOGNAME);
		return;
	}

	switch (ProfileConn.ImportResult)
	{
	case IMPORT_BadURL: 		ShowMessage(Res,ErrorText,ErrorBadURL); 		ForceCleanup(WebConn);	return;
	case IMPORT_ResolveError: 	ShowMessage(Res,ErrorText,ErrorResolve); 		ForceCleanup(WebConn);	return;
	case IMPORT_BindError:		ShowMessage(Res,ErrorText,ErrorBind); 			ForceCleanup(WebConn);	return;
	case IMPORT_TimeOut:		ShowMessage(Res,ErrorText,ErrorTimeout);		ForceCleanup(WebConn);	return;
	case IMPORT_ServerError:	ShowMessage(Res,ErrorText,ErrorServer); 		ForceCleanup(WebConn);	return;
	case IMPORT_BadRequest:		ShowMessage(Res,ErrorText,ErrorBadRequest); 	ForceCleanup(WebConn);	return;
	case IMPORT_Unauthorized:	ShowMessage(Res,ErrorText,ErrorUnauthorized);	ForceCleanup(WebConn);	return;
	case IMPORT_Forbidden:		ShowMessage(Res,ErrorText,ErrorForbidden);		ForceCleanup(WebConn);	return;
	case IMPORT_NotFound:		ShowMessage(Res,ErrorText,ErrorNotFound); 		ForceCleanup(WebConn);	return;
	case IMPORT_InvalidProfile:	ShowMessage(Res,ErrorText,ErrorProfile);		ForceCleanup(WebConn);	return;
	}

	CurS = ProfileConn.ImportS;
	ImportMaps = new(None) class'SortedStringArray';
	ImportMutators = new(None) class'SortedStringArray';

// General Profile Info
	Res.Subst(&quot;SectionName&quot;, LabelGeneralProfile);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);

	Res.Subst(&quot;SettingName&quot;, LabelProfileName);
	Res.Subst(&quot;SettingData&quot;, CurS.getValue(&quot;ProfileName&quot;));
	Res.Subst(&quot;Extra&quot;,&quot;&quot;);
	ImportRows += WebInclude(IncludeRows);

// Profile Gametype Class
	NewGameType = CurS.getValue(&quot;GameType&quot;);
	CustomGameLocation = CurS.getValue(&quot;CustomGameLoc&quot;);

	if (CustomGameLocation != &quot;&quot;)
		PackageLink = &quot;&lt;a href=\&quot;&quot;$CustomGameLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$CurS.getValue(&quot;GameName&quot;)$&quot;&lt;/a&gt;&quot;;
	else PackageLink = CurS.getValue(&quot;GameName&quot;);

	Res.Subst(&quot;SettingName&quot;, LabelGameType);
	Res.Subst(&quot;SettingData&quot;, PackageLink);
	Res.Subst(&quot;Extra&quot;,&quot;&quot;);
	ImportRows += WebInclude(IncludeRows);

// Profile access control class
	NewAccessType = CurS.getValue(&quot;ACClass&quot;);
	CustomAccessLocation = CurS.getValue(&quot;CustomACLoc&quot;);

	if (CustomAccessLocation != &quot;&quot;)
		PackageLink = &quot;&lt;a href=\&quot;&quot;$CustomAccessLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$NewAccessType$&quot;&lt;/a&gt;&quot;;
	else PackageLink = NewAccessType;

	Res.Subst(&quot;SettingName&quot;, LabelAccessControl);
	Res.Subst(&quot;SettingData&quot;, PackageLink);
	Res.Subst(&quot;Extra&quot;,&quot;&quot;);
	ImportRows += WebInclude(IncludeRows);

// Map Information

	Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);

	for (i = 0; i &lt; CurS.getMapLength(); i++)
		ImportMaps.Add(string(i), string(CurS.MapOrder(i)));

	for (i = 0; i &lt; ImportMaps.Count(); i++)
	{
		TempStr = CurS.getMap( int(ImportMaps.getItem(i)) );
		MapLocation = ProfileConn.FindRemoteZipLocation(TempStr,ProfileConn.ProfileServerAddress $ ProfileConn.RemoteProfilePath);
		if (MapLocation != &quot;&quot;) PackageLink = &quot;&lt;a href=\&quot;&quot;$MapLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$TempStr$&quot;&lt;/a&gt;&quot;;
		else PackageLink = TempStr;

		if (CurS.MapRequired( TempStr ))
			TempStr = &quot;&lt;font color=\&quot;red\&quot;&gt;&quot;$RequiredText$&quot;&lt;/font&gt;&quot;;
		else TempStr = AvailableText;

		Res.Subst(&quot;SettingName&quot;, TempStr);
		Res.Subst(&quot;SettingData&quot;, PackageLink);
		Res.Subst(&quot;Extra&quot;, &quot;&quot;);
		ImportRows = ImportRows $ WebInclude(IncludeRows);
	}

// Mutator Information
	Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);

	for (i = 0; i &lt; CurS.getMutatorLength(); i++)
		ImportMutators.Add(string(i), CurS.getMutator(i));

	for (i = 0; i &lt; ImportMutators.Count(); i++)
	{
		TempStr = CurS.getMutator( int(ImportMutators.getItem(i)) );
		for (j=0;j&lt;CurS.getDataLength();j++)
		{
			CurS.getIDValue(j,MutatorName,Tmp);
			if (Tmp ~= TempStr) break;
		}

		MutatorLocation = ProfileConn.FindRemoteZipLocation(TempStr,ProfileConn.ProfileServerAddress $ ProfileConn.RemoteProfilePath);
		PackageLink = StringIf(MutatorLocation != &quot;&quot;, &quot;&lt;a href=\&quot;&quot;$MutatorLocation$&quot;\&quot; target=\&quot;_blank\&quot;&gt;&quot;$MutatorName$&quot;&lt;/a&gt;&quot;, MutatorName);
		TempStr = Stringif(CurS.MutRequired(TempStr), &quot;&lt;font color=\&quot;red\&quot;&gt;&quot;$RequiredText$&quot;&lt;/font&gt;&quot;, AvailableText);

		Res.Subst(&quot;SettingName&quot;, TempStr);
		Res.Subst(&quot;SettingData&quot;, PackageLink);
		Res.Subst(&quot;Extra&quot;, &quot;&quot;);
		ImportRows += WebInclude(IncludeRows);
	}

// PlayInfo Information
	Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
	Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
	ImportRows += WebInclude(IncludeSection);
	ImportRows = ImportRows $&quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;$ GeneratePlayInfoRows(Req,Res,IncludeRows);

// Build Subst's
	Res.Subst(&quot;ButtonName&quot;, &quot;ImportRemoteProfile&quot;);
	Res.Subst(&quot;ButtonValue&quot;, ButtonApplyImportProfile);
	Res.Subst(&quot;PageCaption&quot;, LabelApplyImportProfile);
	ImportProfileHTML = WebInclude(IncludeCaptionButton);

	Res.Subst(&quot;TableRows&quot;, ImportRows);
	Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeTable) $ ImportProfileHTML);

	Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
	if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
		Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

	Res.Subst(&quot;Section&quot;, LinkImportProfile);
	Res.Subst(&quot;SubTitle&quot;, Tmp);
	Res.Subst(&quot;PageHelp&quot;, HelpImportProfile);
	Res.Subst(&quot;PostAction&quot;, SubImportURI$&quot;?SessionID=&quot;$CurS.getHash());
	ShowPage(Res, MasterPage);
	ForceCleanup(WebConn);
}

function QuerySubExport(WebRequest Req, WebResponse Res)
{
	local int i,j;
	local PlayInfo 	TempPI;
	local FileLog 	EProfile;
	local Session 	CurS;
	local string 	SID, Logname,
					TempStr, Tmp,
					dataname, datavalue,
					ProfileIndex, NewGameType,
					ExportRows, Location;

	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local class&lt;Mutator&gt;		TempMut;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local class&lt;Info&gt;			TempSA;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;
	local StringArray Mutators,GroupsOnly;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID,true);
		ProfileIndex = Req.GetVariable(&quot;ProfileNameSelect&quot;, CurS.getValue(&quot;ProfileIndex&quot;));

        CreateSessionInfo(ProfileIndex,SID,True);
		Logname = CurS.getValue(&quot;Logname&quot;,Req.GetVariable(&quot;TextInput&quot;));
		if (Logname == &quot;&quot;)
			Logname = CurS.getValue(&quot;ProfileName&quot;);

		CurS.setValue(&quot;Logname&quot;,Logname,True);
		for (i=0;i&lt;CurS.getMutatorLength();i++)
		{
			TempStr = CurS.getMutator(i);
			if (EpicPackage(TempStr))
				continue;
			if (Req.GetVariable(&quot;Save&quot;$TempStr,&quot;&quot;) != &quot;&quot;)
				SetLocation(TempStr,Req.GetVariable(TempStr));
		}

		for (i=0;i&lt;CurS.getMapLength();i++)
		{
			TempStr = CurS.getMap(i);
			if (EpicPackage(TempStr))
				continue;
			if (Req.GetVariable(&quot;Save&quot;$TempStr,&quot;&quot;) != &quot;&quot;)
				SetLocation(TempStr,Req.GetVariable(TempStr));
		}

		NewGameType = CurS.getValue(&quot;GameType&quot;);
		if (NewGameType != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(NewGameType,class'Class'));
		if (GIClass==None)
		{
			ShowMessage(Res,ErrorGameClassTitle,ErrorGameClassText);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;, Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowMessage(Res,ErrorAccessControlTitle,ErrorAccessControlText);
			return;
		}

		if (Req.GetVariable(&quot;Export&quot;,&quot;&quot;)!=&quot;&quot;)
		{
		// Write file locations to .ini
			EProfile = Level.Spawn(class'FileLog');
			if (EProfile == None)
			{
				ShowMessage(Res, ErrorText, ErrorExportingProfile);
				return;
			}

			EProfile.OpenLog(RemoveStr(CurS.getValue(&quot;Logname&quot;),&quot; &quot;));
			EProfile.Logf(&quot;Profile:&quot;$CurS.getValue(&quot;ProfileName&quot;)$Chr(21)$CurS.getValue(&quot;GameType&quot;)$Chr(21)$CurS.getValue(&quot;MaxMaps&quot;)$Chr(21)$GIClass.default.GameName$Chr(21)$string(ACClass));

			for (i=0;i&lt;CurS.getMapLength();i++)
			{
				TempStr = CurS.getMap(i);

				if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
					Location = Chr(21) $ Req.GetVariable(TempStr);
				else Location = &quot;&quot;;

				EProfile.Logf(&quot;Map:&quot;$TempStr$Chr(21)$CurS.MapOrder(i)$Chr(21)$CurS.MapRequired(TempStr)$Location);
			}

			for (i=0;i&lt;CurS.getSALength();i++)
			{
				TempStr = CurS.getServerActor(i);
				for (j=0;j&lt;ConfigM.ManagedActors.Length;j++)
					if (string(ConfigM.ManagedActors[j].SAClass) ~= TempStr)
						DataName = ConfigM.ManagedActors[j].SAName;

				if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
					Location = Chr(21) $ Req.GetVariable(TempStr);
				else Location = &quot;&quot;;

				EProfile.Logf(&quot;Mutator:&quot;$DataName$Chr(21)$TempStr$Chr(21)$CurS.SARequired(TempStr)$Location);
			}

			for (i=0;i&lt;CurS.getMutatorLength();i++)
			{
				TempStr = CurS.getMutator(i);
				for (j=0;j&lt;AllMutators.Length;j++)
					if (AllMutators[j].ClassName == TempStr)
						DataName = AllMutators[j].FriendlyName;

				if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
					Location = Chr(21) $ Req.GetVariable(TempStr);
				else Location = &quot;&quot;;

				EProfile.Logf(&quot;Mutator:&quot;$DataName$Chr(21)$TempStr$Chr(21)$CurS.MutRequired(TempStr)$Location);
			}

			i=0;
			j=0;
			while (i&lt;CurS.getDataLength())
			{
				CurS.getIdValue(i,dataname,datavalue);
				if (InStr(dataname,&quot;.&quot;) != -1)
					EProfile.Logf(&quot;Data:&quot;$DataName$Chr(21)$DataValue);
				i++;
			}
			EProfile.Destroy();
			ShowMessage(Res, SuccessText, SuccessExportProfile$RemoveStr(LogName,&quot; &quot;)$&quot;.txt&quot;);
			return;
		}


	// Mutator Section
		Mutators = new(None) class'SortedStringArray';
		GroupsOnly = new(None) class'SortedStringArray';
		for (i=0;i&lt;CurS.getMutatorLength();i++)
		{
		    TempStr = CurS.getMutator(i);
            for (j=0;j&lt;AllMutators.Length;j++)
				if (TempStr ~= AllMutators[j].ClassName)
					Mutators.Add(string(j), AllMutators[j].FriendlyName);
			TempMut = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
			if (TempMut != None)
				MClass[MClass.Length] = TempMut;
		}

		Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
		Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
		ExportRows += WebInclude(IncludeSection);

		for (i = 0; i&lt;Mutators.Count(); i++)
		{
			j = int(Mutators.GetItem(i));

			Res.Subst(&quot;SettingName&quot;, AllMutators[j].FriendlyName);
			if (EpicPackage(AllMutators[j].ClassName))
				Res.Subst(&quot;SettingData&quot;, &quot;&quot;);
			else Res.Subst(&quot;SettingData&quot;, Textbox(AllMutators[j].ClassName,Min(GetLongestURL(),64),128,GetLocation(AllMutators[j].ClassName)) $ &quot;&amp;nbsp;&amp;nbsp;&quot; $ SubmitButton(&quot;Save&quot;$AllMutators[j].ClassName,ProfileButtonName[0]));

			Res.Subst(&quot;Extra&quot;, &quot;&quot;);
			ExportRows += WebInclude(IncludeRows);
		}

		for (i=0;i&lt;CurS.getSALength();i++)
		{
			TempStr = CurS.getServerActor(i);
			if (TempStr != &quot;&quot;)
			{
				TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'class'));
				if (TempSA != None)
					SAClass[SAClass.Length] = TempSA;
			}
		}

		TempPI = new(None) class'PlayInfo';
		LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);

		Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
		Res.Subst(&quot;SpecialInstructions&quot;, &quot;&quot;);
		ExportRows += WebInclude(IncludeSection);

		Res.Subst(&quot;SettingName&quot;, LabelMaxMaps);
		TempStr = CurS.getValue(&quot;MaxMaps&quot;);
		if (TempStr == &quot;0&quot;)
			TempStr = UnlimitedText;
		Res.Subst(&quot;SettingData&quot;, TempStr);
		Res.Subst(&quot;Extra&quot;, &quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot;);
		ExportRows += WebInclude(IncludeRows);

// Map Section
		for (i=0;i&lt;CurS.getMapLength();i++)
		{
            TempStr = CurS.getMap(i);
            Res.Subst(&quot;SettingName&quot;, TempStr);
			Res.Subst(&quot;Extra&quot;, &quot;&quot;);
			if (EpicPackage(TempStr))
				Res.Subst(&quot;SettingData&quot;, &quot;&quot;);
			else Res.Subst(&quot;SettingData&quot;, Textbox(TempStr,Min(GetLongestURL(),64),128,GetLocation(TempStr)) $ &quot;&amp;nbsp;&amp;nbsp;&quot; $ SubmitButton(&quot;Save&quot;$TempStr,ProfileButtonName[0]));

			ExportRows += WebInclude(IncludeRows);
		}

// PlayInfo section
		Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
		Res.Subst(&quot;SpecialInstructions&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		ExportRows += WebInclude(IncludeSection);
		ExportRows += (&quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&quot; $ GeneratePlayInfoRows(Req, Res, IncludeRows));
		ExportRows += (&quot;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&quot;$LabelApplyExportProfile$&quot;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=\&quot;2\&quot;&gt;&quot;$SubmitButton(&quot;Export&quot;,ButtonApplyExportProfile)$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);

		Res.Subst(&quot;TableRows&quot;, ExportRows);
		Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeTable));

		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());

		Res.Subst(&quot;Section&quot;, LinkExportProfile);
		Res.Subst(&quot;PageHelp&quot;, HelpExportProfile);
		Res.Subst(&quot;SubTitle&quot;, Tmp);
		Res.Subst(&quot;PostAction&quot;, SubExportURI$&quot;?SessionID=&quot;$SID);
		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

//****************************************************************
//****************************************************************
// Query subpages for Add &amp; Manage Modules
//
//

// Page 0
function QueryLadderManage(WebRequest Req, WebResponse Res)
{
	local string 	HeaderRows, ManagementRows,
					TempStr, Tmp, SID;
	local bool		bAdd, bModify, bCopy, bDelete, bImport, bExport;
	local Session 	CurS;
	local ProfileImporter ProfileConn;

	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, True);

		// Submit button was pressed
		if (Req.GetVariable(ProfileButtonName[0], &quot;&quot;) != &quot;&quot;)
		{
			switch (Req.GetVariable(&quot;Actions&quot;,&quot;&quot;))
			{
				case &quot;Add&quot;:
					bAdd = True;
					QuerySubFrame(Req, Res);
					break;

				case &quot;Modify&quot;:
					bModify = True;
					TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;);
					if (TempStr == &quot;&quot;)
					{
						StatusError(Res, ErrorNoProfilesExist);
						break;
					}
					QuerySubFrame(Req, Res);
					return;

				case &quot;Copy&quot;:
					bCopy = True;
					Tmp = Req.GetVariable(&quot;ProfileNameSelect&quot;);
					if (Tmp == &quot;&quot;)
						StatusError(Res, ErrorNoProfilesExist);

					TempStr = Req.GetVariable(&quot;TextInput&quot;);
					if (TempStr == &quot;&quot;)
					{
						StatusError(Res, ErrorCopyNoName);
						break;
					}

					if (LadderRules.CopyProfile(int(Tmp),TempStr))
						StatusOK(Res,SuccessCopyProfile);
					else StatusError(Res, ErrorCopyFrom);
					break;

				case &quot;Delete&quot;:
					bDelete = True;
					TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;);
					if (TempStr != &quot;&quot;)
					{
						if (LadderRules.RemoveProfile(int(TempStr)))
							StatusOK(Res, SuccessDeleteProfile);
						else StatusError(Res, ErrorDeletingProfile);
					}
					else StatusError(Res, ErrorNoProfilesExist);
					break;

				case &quot;Import&quot;:
					bImport = True;
					TempStr = Req.GetVariable(&quot;TextInput&quot;,&quot;&quot;);
					if (!(Left(TempStr,7) ~= &quot;http://&quot;))
					{
						StatusError(Res, ErrorBadURL);
						break;
					}

				// Spawn class to handle network interaction to receive remote profile
					ProfileConn = Level.Spawn(Class'ProfileImporter');
					If (ProfileConn == None)
					{
						ShowMessage(Res, ErrorText, ImportClassSpawnError);
						return;
					}

				// Assign local connection objects to importer class
					ProfileConn.QueryPage = Self;
					ProfileConn.QueryRequest = Req;
					ProfileConn.QueryResponse = Res;

				// Setting bNoCleanup prevents the connection from being closed
				// when QueryProfileImport() returns to Query()

				// Set this prior to initializing connection, to ensure correct behavior
					if ( WebConnectionPlus(Res.Connection) != None)
						WebConnectionPlus(Res.Connection).bNoCleanup = True;
					else
					{
						StatusError(Res, ErrorReplacingWebConnection);
						break;
					}
				// Initialize connection to foreign host, pass Importer class a Session
				// object to allow it to build a profile config set.
					ProfileConn.Connect(TempStr, CurS);
					return;

				case &quot;Export&quot;:
					bExport = True;
					TempStr = Req.GetVariable(&quot;ProfileNameSelect&quot;, &quot;&quot;);
					if (TempStr == &quot;&quot;)
					{
						StatusError(Res, ErrorNoProfilesExist);
						break;
					}
					QuerySubExport(Req,Res);
					return;

				default:
					bModify = True;
			}
		}

	// Output code
		HeaderRows = &quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$LabelChooseAction$&quot;&lt;/td&gt;&lt;td nowrap&gt;&quot;$LabelInputDescription$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
	    ManagementRows += (&quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$RadioButton(&quot;Actions&quot;, &quot;Add&quot;, bAdd)$LabelAddProfile$&quot;&lt;br&gt;&quot;);
		ManagementRows += (RadioButton(&quot;Actions&quot;, &quot;Modify&quot;, bModify)$LabelModifyProfile$&quot;&lt;/td&gt;&quot;);
		ManagementRows += (&quot;&lt;td&gt;&lt;select class=mini name='ProfileNameSelect'&gt;&quot;$GenerateSwitchProfileOptions(TempStr)$&quot;&lt;/select&gt;&amp;nbsp;&quot;$LabelSelectActions$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);
		ManagementRows += (&quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$RadioButton(&quot;Actions&quot;, &quot;Copy&quot;, bCopy)$LabelCopyProfile$&quot;&lt;br&gt;&quot;);
		ManagementRows += (RadioButton(&quot;Actions&quot;, &quot;Delete&quot;, bDelete)$LabelDeleteProfile$&quot;&lt;/td&gt;&quot;);
		ManagementRows += (&quot;&lt;td nowrap&gt;&quot;$Textbox(&quot;TextInput&quot;,64,128)$&quot;&amp;nbsp;&quot;$LabelTextboxActions$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);
		ManagementRows += (&quot;&lt;tr&gt;&lt;td nowrap&gt;&quot;$RadioButton(&quot;Actions&quot;, &quot;Import&quot;, bImport)$LabelImportProfile$&quot;&lt;br&gt;&quot;);
		ManagementRows += (RadioButton(&quot;Actions&quot;, &quot;Export&quot;, bExport)$LabelExportProfile$&quot;&lt;/td&gt;&quot;);
		ManagementRows += (&quot;&lt;td&gt;&quot;$SubmitButton(ProfileButtonName[0],ProfileButtonValue[0])$&quot;&lt;/td&gt;&lt;/tr&gt;&quot;);

		Res.Subst(&quot;TableTitle&quot;, TableTitle[0]);
		Res.Subst(&quot;HeaderRow&quot;, HeaderRows);
		Res.Subst(&quot;TableRows&quot;,ManagementRows);

		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp @= (LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches()));

		Res.Subst(&quot;Section&quot;, LabelManagement);
		Res.Subst(&quot;PageHelp&quot;, HelpManageProfile);
		Res.Subst(&quot;SubTitle&quot;, Tmp);
		Res.Subst(&quot;LadderTable&quot;, WebInclude(IncludeTable));
		Res.Subst(&quot;PostAction&quot;, ProfileManageURI);
		ShowPage(Res, MasterPage);
	}

	else AccessDenied(Res);
}

// Page 1
function QuerySubGameType(WebRequest Req, WebResponse Res)
{
	local int i;
	local string DataName, DataValue, SID, NewName, OldName;
	local string GameTypeRows, OldGameType;
	local Session CurS;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, true);

        if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
    	{
    		NewName = Req.GetVariable(&quot;NewProfile&quot;,DefaultProfileName);
    		OldName = CurS.getValue(&quot;ProfileName&quot;);
    		if ((OldName != &quot;&quot; &amp;&amp; !(OldName ~= NewName)) || OldName == &quot;&quot;)
    		{
	    		for (i=0;i&lt;LadderRules.Profiles.Length;i++)
	    		{
	    			if (NewName ~= LadderRules.Profiles[i].ProfileName)
	    			{
	    				StatusError(Res, ErrorSameProfileName);
	    				NewName = DefaultProfileName;
	    				break;
	    			}
	    		}
	    	}
			CurS.setValue(&quot;ProfileName&quot;, NewName, true);
			CurS.setValue(&quot;GameType&quot;, Req.GetVariable(&quot;NewGameType&quot;), True, OldGameType);
			if (!(OldGameType ~= CurS.getValue(&quot;GameType&quot;)))
			{
				CurS.ClearMaps();
			// Reset all stored PlayInfo information
				for (i=0;i&lt;CurS.getDataLength();i++)
				{
					CurS.getIDValue(i,DataName,DataValue);
					if (InStr(DataName, &quot;.&quot;) != -1)
					{
						CurS.delValue(DataName);
						i--;
					}
				}
			}
		}

		Res.Subst(&quot;NewProfileName&quot;, CurS.getValue(&quot;ProfileName&quot;, DefaultProfileName));
		GameTypeRows=WebInclude(IncludeProfileName);

		for (i=0;i&lt;AGameType.Count();i++)
		{
			Res.Subst(&quot;GameTypeClass&quot;, 	AGameType.GetItem(i));
			Res.Subst(&quot;GameTypeName&quot;, 	AGameType.GetTag(i));
			Res.Subst(&quot;Selected&quot;, StringIf(CurS.getValue(&quot;GameType&quot;) ~= AGameType.GetItem(i), &quot; checked&quot;, &quot;&quot;));
			GameTypeRows += WebInclude(IncludeGameType);
		}

	// Fill in caption table values
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;, PageCaption[1]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[1]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[1]));

  		Res.Subst(&quot;TableRows&quot;, 		GameTypeRows);
		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.GetValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 2
function QuerySubMutators(WebRequest Req, WebResponse Res)
{
	local int i,j;
	local bool 		bAllMuts,
					bClearMuts,
					bChecked;
	local string 	MutatorRows,
					SID, TempStr;

	local Session CurS;
	local StringArray Mutators, ServerActors;
	local class&lt;Mutator&gt; MutClass;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID, true);

		if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
		{
			bAllMuts = Req.GetVariable(&quot;AllowAllMutators&quot;)!=&quot;&quot;;
			bClearMuts = Req.GetVariable(&quot;ClearAllMutators&quot;)!=&quot;&quot;;
//			CurS.ClearMutators();

			for (i=0;i&lt;ConfigM.ManagedActors.Length;i++)
			{
				TempStr = string(ConfigM.ManagedActors[i].SAClass);
				if (bAllMuts || (!bClearMuts &amp;&amp; Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;))
					CurS.setServerActor(TempStr, True, CurS.SARequired(TempStr));
				else CurS.delServerActor(TempStr);
			}

			for (i=0;i&lt;AllMutators.Length;i++)
			{
				if (bAllMuts || (!bClearMuts &amp;&amp; (Req.GetVariable(AllMutators[i].ClassName,&quot;&quot;)!=&quot;&quot; || Req.GetVariable(AllMutators[i].GroupName)~=AllMutators[i].ClassName)))
					CurS.setMutator(AllMutators[i].ClassName,true,CurS.MutRequired(AllMutators[i].ClassName));
				else if (Req.GetVariable(AllMutators[i].GroupName) ~= &quot;None&quot;)
					CurS.setMutator(AllMutators[i].GroupName,true);
				else
				{
					CurS.delMutator(AllMutators[i].ClassName);
					CurS.delMutator(AllMutators[i].GroupName);
				}
			}
		}

		Mutators = new(None) class'SortedStringArray';
		ServerActors = new(None) class'SortedStringArray';
//		GroupsOnly = new(None) class'SortedStringArray';
		for (i = 0; i&lt;AllMutators.Length; i++)
		{
			MutClass = class&lt;Mutator&gt;(DynamicLoadObject(AllMutators[i].ClassName, class'Class'));
			if (MutClass != None)
				Mutators.Add(string(i),AllMutators[i].FriendlyName);
		}

		for (i=0;i&lt;ConfigM.ManagedActors.Length;i++)
			if (ConfigM.ManagedActors[i].SAClass != None)
				ServerActors.Add(string(i),ConfigM.ManagedActors[i].SAName);

// Uncomment this to allow mutators to be grouped according to MutatorGroup
/*
		CreateFullMutatorList(Mutators,GroupsOnly);

		for (i=0;i&lt;CurS.GetMutatorLength();i++)
		{
			k = 0-1;
			for (j=0;j&lt;AllMutators.Length;j++)
				if (CurS.GetMutator(i) ~= AllMutators[j].ClassName)
					break;
			if (j&lt;AllMutators.Length) k = GroupsOnly.FindItemId(string(j));
			if (k &gt;= 0)
			{
				for (z=0;z&lt;TempA.Length;z++)
				{
					if (TempA[z] ~= AllMutators[j].GroupName)
					{
						bAllMuts = True;
						break;
					}
				}

				if (!bAllMuts) TempA[TempA.Length] = AllMutators[j].GroupName;
			}
			if (bAllMuts)
       			break;
		}

		lastgroup = &quot;&quot;;
		thisgroup = &quot;&quot;;
		nextgroup = &quot;&quot;;
		MutatorRows=&quot;&quot;;

		for (i=0;i&lt;GroupsOnly.Count();i++)
		{
			j=int(GroupsOnly.GetItem(i));
			if (AllMutators[j].GroupName==&quot;&quot;)
				thisgroup=&quot;Z&quot;$string(z++);
			else thisgroup = AllMutators[j].GroupName;
			if ( (i + 1) == GroupsOnly.Count())
				nextgroup = &quot;&quot;;
			else
			{
			// Assign nextgroup to the next mutators group
				k = int(GroupsOnly.GetItem(i + 1));
				if (AllMutators[k].GroupName==&quot;&quot;)
					nextgroup=&quot;Z&quot;$string(z);
				else nextgroup = AllMutators[k].GroupName;
			}

			Res.Subst(&quot;GroupName&quot;, thisgroup);
			Res.Subst(&quot;MutatorClass&quot;, AllMutators[j].ClassName);
			Res.Subst(&quot;MutatorName&quot;, AllMutators[j].FriendlyName);
			Res.Subst(&quot;MutatorDesc&quot;, AllMutators[j].Description);

			if ((lastgroup != thisgroup) &amp;&amp; (thisgroup == nextgroup)) // and the next mut is in the same group as this one
			{
				if (bAllMuts||CurS.HasMutator(thisgroup)) Res.Subst(&quot;Checked&quot;, &quot;checked&quot;);
				MutatorRows = MutatorRows$WebInclude(&quot;current_mutators_group&quot;);
			}
			else
			{
				if (CurS.HasMutator(AllMutators[j].ClassName) &amp;&amp; !bAllMuts) Res.Subst(&quot;Checked&quot;, &quot;checked&quot;); else Res.Subst(&quot;Checked&quot;, &quot;&quot;);
				MutatorRows = MutatorRows$WebInclude(&quot;current_mutators_group_row&quot;);
			}

			lastgroup=thisgroup;
		}
*/
		bAllMuts = True;
		for (i = 0; i&lt;ServerActors.Count(); i++)
		{
			TempStr = &quot;&quot;; bChecked = False;
			j = int(ServerActors.GetItem(i));

			if (CurS.HasServerActor(string(ConfigM.ManagedActors[j].SAClass)))
				bChecked = True;
			else if (bAllMuts) bAllMuts = False;

			Res.Subst(&quot;Content&quot;, Checkbox(string(ConfigM.ManagedActors[j].SAClass),bChecked) $ &quot;&amp;nbsp;&quot; $ ServerActors.GetTag(i));
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, ConfigM.ManagedActors[j].SADescription);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));

			MutatorRows += WebInclude(RowLeft);
		}

		for (i = 0; i&lt;Mutators.Count(); i++)
		{
			TempStr = &quot;&quot;; bChecked = False;
			j = int(Mutators.GetItem(i));

			if (CurS.HasMutator(AllMutators[j].ClassName))
				bChecked = True;
			else if (bAllMuts) bAllMuts = False;

			Res.Subst(&quot;Content&quot;, CheckBox(AllMutators[j].ClassName, bChecked) $ &quot;&amp;nbsp;&quot; $ AllMutators[j].FriendlyName);
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, AllMutators[j].Description);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));

			MutatorRows += WebInclude(RowLeft);
		}

		if (bAllMuts)
			Res.Subst(&quot;Content&quot;, Checkbox(&quot;ClearAllMutators&quot;, False)@LabelUncheckAllMutator);
		else
			Res.Subst(&quot;Content&quot;, Checkbox(&quot;AllowAllMutators&quot;, False)@LabelCheckAllMutator);
		Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
		Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
		MutatorRows += WebInclude(RowLeft);

		Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft));
		MutatorRows += WebInclude(RowLeft);

		Res.Subst(&quot;TableRows&quot;, MutatorRows);
	// Fill in caption table values
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;, PageCaption[2]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[2]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[2]));

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.GetValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page3
function QuerySubMaps(WebRequest Req, WebResponse Res)
{
	local int i;
	local string 	SID,
					MapRows,
					TempStr, Temp,
					CheckString;
	local bool 		bAllMaps,
					bClearMaps,
					bChecked;

	local Session CurS;
	local StringArray SortedMaps;
	local array&lt;string&gt; TempMaps;
	local class&lt;GameInfo&gt; GIClass;


	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID);

		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}
		// Build a string array of maps valid for this gametype.
		GIClass.static.LoadMapList(GIClass.default.MapPrefix, TempMaps);

		if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
		{
			bAllMaps = Req.GetVariable(&quot;AllowAllMaps&quot;,&quot;&quot;)!=&quot;&quot;;
			bClearMaps = Req.GetVariable(&quot;ClearAllMaps&quot;,&quot;&quot;)!=&quot;&quot;;

			for (i=0;i&lt;TempMaps.Length;i++)
				if (bAllMaps || (!bClearMaps &amp;&amp; Req.GetVariable(TempMaps[i])!=&quot;&quot;))
					CurS.setMap(TempMaps[i],0,True,CurS.MapRequired(TempMaps[i]));
				else CurS.delMap(TempMaps[i]);
		}
		// Add the map name array to a sorted string array for sorting
		SortedMaps = new(None) class'SortedStringArray';
		for(i=0;i&lt;TempMaps.Length;i++)
			SortedMaps.Add(string(i),TempMaps[i]);

		bAllMaps = True;
		// Now build the map rows
		for (i=0;i&lt;SortedMaps.Count();i++)
		{
			Temp = &quot;&quot;; bChecked = False;
			TempStr = SortedMaps.GetTag(i);
			if (CurS.HasMap(TempStr))
				bChecked = True;
			else if (bAllMaps) bAllMaps = False;

			Res.Subst(&quot;Content&quot;, Checkbox(TempStr, bChecked) $ &quot;&amp;nbsp;&quot; $ TempStr);
			Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft));
		// Build string for javascript function
			if (CheckString!=&quot;&quot;)
				CheckString += &quot;','&quot;;
			CheckString += TempStr;

			MapRows += WebInclude(RowLeft);
		}

	// Fill Javascript substs
		Res.Subst(&quot;JavaScripts&quot;,&quot;&lt;script language=\&quot;JavaScript\&quot; type=\&quot;text/JavaScript\&quot;&gt;function MM_findObj(n,d){var p,i,x;if(!d)d=document;if((p=n.indexOf(\&quot;?\&quot;))&gt;0&amp;&amp;parent.frames.length){d=parent.frames[n.substring(p+1)].document;n=n.substring(0,p);}if(!(x=d[n])&amp;&amp;d.all)x=d.all[n];for(i=0;!x&amp;&amp;i&lt;d.forms.length;i++)x=d.forms[i][n];for(i=0;!x&amp;&amp;d.layers&amp;&amp;i&lt;d.layers.length;i++)x=MM_findObj(n,d.layers[i].document);if(!x&amp;&amp;d.getElementById)x=d.getElementById(n);return x;}function CheckMaps(){var maps=CheckMaps.arguments;var MapChecked=false;for(var i=0;i&lt;maps.length;i++){var myObj=MM_findObj(maps[i]);if(myObj.checked==true){MapChecked=true}}if(MapChecked==false){alert('You must check at least one map to continue!')}document.MM_returnValue=(MapChecked);}&lt;/script&gt;&quot;);
		Res.Subst(&quot;JCheck&quot;,&quot; onClick=\&quot;CheckMaps('AllowAllMaps','&quot;$CheckString$&quot;');return document.MM_returnValue\&quot;&quot;);
		Res.Subst(&quot;Checked&quot;,&quot;&quot;);

		if (bAllMaps)
			Res.Subst(&quot;Content&quot;, Checkbox(&quot;ClearAllMaps&quot;, False) @ LabelUncheckAllMap);
		else Res.Subst(&quot;Content&quot;, Checkbox(&quot;AllowAllMaps&quot;, False) @ LabelCheckAllMap);

		Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
		Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
		MapRows += WebInclude(RowLeft);

		Res.Subst(&quot;RowContent&quot;, WebInclude(CellLeft));
		MapRows += WebInclude(RowLeft);

		// Set ladder_caption_table subst's
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;,PageCaption[3]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[3]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[3]));

		Res.Subst(&quot;TableRows&quot;, MapRows);

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.getValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 4
function QuerySubRules(WebRequest Req, WebResponse Res)
{
	local int i;
	local string 	TempStr,
					SID;
	local Session 	CurS;
	local PlayInfo 	TempPI;
	local class&lt;Mutator&gt; 		TempClass;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local class&lt;Info&gt;			TempSA;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;

	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.GetSession(SID);

		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;, Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowFramedMessage(Res,ErrorAccessControlText,True);
			return;
		}

		if (Req.GetVariable(CurS.getValue(&quot;ButtonName&quot;,&quot;&quot;),&quot;&quot;)!=&quot;&quot;)
		{
			for (i=0;i&lt;CurS.GetMutatorLength();i++)
			{
				TempStr = CurS.getMutator(i);
				if (TempStr != &quot;&quot;)
				{
					TempClass = class&lt;Mutator&gt;(DynamicLoadObject(TempStr,class'Class'));
					if (TempClass != None)
						MClass[MClass.Length] = TempClass;
				}
			}

			TempPI = new(None) class'PlayInfo';
			for (i=0;i&lt;CurS.getSALength(); i++)
			{
				TempStr = CurS.getServerActor(i);
				if (TempStr != &quot;&quot;)
				{
					TempSA = class&lt;Info&gt;(DynamicLoadObject(TempStr,class'Class'));
					if (TempSA != None)
						SAClass[SAClass.Length] = TempSA;
				}
			}

			LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);
			for (i=0;i&lt;TempPI.Settings.Length;i++)
			{
				if (!SettingIsAllowed(TempPI.Settings[i].SecLevel)) continue;
				TempStr = Req.GetVariable(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value);

				if (TempPI.Settings[i].RenderType == &quot;Text&quot;)
					CheckSettingValue(TempPI.Settings[i].Data, TempStr);

				CurS.setValue(TempPI.Settings[i].SettingName,TempStr,true);
			}
		}

		Res.Subst(&quot;TableRows&quot;,		GeneratePlayInfoRows(Req, Res, &quot;defaults_row&quot;));

		// Set ladder_caption_table subst's
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;,PageCaption[4]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[4]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[4]));

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	CurS.getValue(&quot;CurrentPage&quot;));
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 5
function QuerySubReview(WebRequest Req, WebResponse Res)
{
	local int i,j,k,z;
	local string 	SID,
					TempStr, TempSA,
					ReviewRows,
					thisgroup, lastgroup, nextgroup;

	local Session CurS;
	local StringArray Mutators, GroupsOnly;
	local class&lt;Mutator&gt; 		TempClass;
	local class&lt;Info&gt;			TempSAClass;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;

	if (CanPerform(&quot;Lm&quot;))
	{
		SID = Req.GetVariable(&quot;SessionID&quot;);
		CurS = SMaster.getSession(SID);

		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowFramedMessage(Res,ErrorAccessControlText,True);
			return;
		}

		Mutators = new(None) class'SortedStringArray';
		GroupsOnly = new(None) class'SortedStringArray';
		for (i = 0; i&lt;AllMutators.Length; i++)
		{
			if (CurS.HasMutator(AllMutators[i].ClassName)||CurS.HasMutator(AllMutators[i].GroupName))
			{
				TempClass = class&lt;Mutator&gt;(DynamicLoadObject(AllMutators[i].ClassName, class'Class'));
				if (TempClass != None)
				{
					MClass[MClass.Length] = TempClass;
					Mutators.Add(string(i),AllMutators[i].FriendlyName);
				}
			}
		}

		CreateFullMutatorList(Mutators,GroupsOnly);
		lastgroup = &quot;&quot;; thisgroup = &quot;&quot;; nextgroup = &quot;&quot;;

		Res.Subst(&quot;SectionName&quot;, TableTitle[2]);
		Res.Subst(&quot;SpecialInstructions&quot;, LabelRequiredMutators);
		ReviewRows += WebInclude(IncludeSection);

		for (i=0;i&lt;GroupsOnly.Count();i++)
		{
			j=int(GroupsOnly.GetItem(i));

			if (AllMutators[j].GroupName==&quot;&quot;)
				thisgroup=&quot;Z&quot;$string(z++);
			else thisgroup = AllMutators[j].GroupName;

			if ( (i + 1) == GroupsOnly.Count())
				nextgroup = &quot;&quot;;
			else
			{
			// Assign nextgroup to the next mutators group
				k = int(GroupsOnly.GetItem(i + 1));
				if (AllMutators[k].GroupName==&quot;&quot;)
					nextgroup=&quot;Z&quot;$string(z);
				else nextgroup = AllMutators[k].GroupName;
			}

			Res.Subst(&quot;GroupName&quot;, thisgroup);
			Res.Subst(&quot;MutatorClass&quot;, AllMutators[j].ClassName);
			Res.Subst(&quot;MutatorName&quot;, AllMutators[j].FriendlyName);
			Res.Subst(&quot;MutatorDesc&quot;, AllMutators[j].Description);

			if ((lastgroup != thisgroup) &amp;&amp; (thisgroup == nextgroup)) // and the next mut is in the same group as this one
			{
                Res.Subst(&quot;Checked&quot;, &quot; checked&quot;);
				ReviewRows += WebInclude(&quot;current_mutators_group&quot;);
			}

			Res.Subst(&quot;Checked&quot;, StringIf(CurS.MutRequired(AllMutators[j].ClassName), &quot; checked&quot;, &quot;&quot;));
			ReviewRows += WebInclude(&quot;current_mutators_group_row&quot;);

			lastgroup=thisgroup;
		}

		for (i = 0; i&lt;Mutators.Count(); i++)
		{
			TempStr = &quot;&quot;;
			j = int(Mutators.GetItem(i));

			Res.Subst(&quot;Content&quot;, CheckBox(AllMutators[j].ClassName, CurS.MutRequired(AllMutators[j].ClassName)) $ &quot;&amp;nbsp;&quot; $ AllMutators[j].FriendlyName);
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, AllMutators[j].Description);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));

			ReviewRows += WebInclude(RowLeft);
		}

		Mutators.Reset();
		for (i = 0; i &lt; ConfigM.ManagedActors.Length; i++)
		{
			TempSA = string(ConfigM.ManagedActors[i].SAClass);
			if (CurS.HasServerActor(TempSA))
			{
				TempSAClass = class&lt;Info&gt;(DynamicLoadObject(TempSA,class'Class'));
				if (TempSAClass != None)
					Mutators.Add(string(i),ConfigM.ManagedActors[i].SAName);
			}
		}
		lastgroup = &quot;&quot;;
		Res.Subst(&quot;SpanLength&quot;, &quot;2&quot;);
		Res.Subst(&quot;SpanContent&quot;, &quot;&amp;nbsp;&amp;nbsp;&quot;);
		Res.Subst(&quot;RowContent&quot;, WebInclude(CellColSpan));
		lastgroup = WebInclude(RowLeft);
		ReviewRows += lastgroup;

		for (i=0;i&lt;Mutators.Count();i++)
		{
			TempStr = &quot;&quot;;
			j = int(Mutators.GetItem(i));

			Res.Subst(&quot;Content&quot;, Checkbox(string(ConfigM.ManagedActors[j].SAClass), CurS.SARequired(string(ConfigM.ManagedActors[j].SAClass))) $ &quot;&amp;nbsp;&quot; $ Mutators.GetTag(i));
			TempStr = WebInclude(NowrapLeft);
			Res.Subst(&quot;Content&quot;, ConfigM.ManagedActors[j].SADescription);
			Res.Subst(&quot;RowContent&quot;, TempStr $ WebInclude(CellLeft));
			ReviewRows += WebInclude(RowLeft);
		}

		Res.Subst(&quot;SectionName&quot;, TableTitle[3]);
		Res.Subst(&quot;SpecialInstructions&quot;, LabelRequiredMaps);
		ReviewRows += WebInclude(IncludeSection);

		Res.Subst(&quot;SettingName&quot;, LabelMaxMaps);
		Res.Subst(&quot;SettingData&quot;, Textbox(&quot;MaxMaps&quot;, 3, 3, CurS.getValue(&quot;MaxMaps&quot;,&quot;3&quot;)));
		Res.Subst(&quot;Extra&quot;, lastgroup);
		ReviewRows += WebInclude(IncludeRows);
		for (i=0;i&lt;CurS.GetMapLength();i++)
		{
			Res.Subst(&quot;SettingName&quot;, CurS.getMap(i));
			Res.Subst(&quot;Extra&quot;, &quot;&quot;);
			Res.Subst(&quot;SettingData&quot;, Checkbox(CurS.getMap(i), CurS.MapRequired(CurS.getMap(i))));

			ReviewRows += WebInclude(IncludeRows);
		}

		Res.Subst(&quot;SectionName&quot;, TableTitle[4]);
		Res.Subst(&quot;SpecialInstructions&quot;, LabelPlayInfo);
		Res.Subst(&quot;Extra&quot;, lastgroup);
		ReviewRows += WebInclude(IncludeSection);

		ReviewRows += (lastgroup $ GeneratePlayInfoRows(Req, Res, IncludeRows));
		Res.Subst(&quot;TableRows&quot;, ReviewRows);

	// Set ladder_caption_table subst's
		Res.Subst(&quot;PageCaption&quot;, 	CurS.getValue(&quot;PageCaption&quot;,PageCaption[5]));
		Res.Subst(&quot;ButtonName&quot;, 	CurS.getValue(&quot;ButtonName&quot;, ProfileButtonName[5]));
		Res.Subst(&quot;ButtonValue&quot;, 	CurS.getValue(&quot;ButtonValue&quot;, ProfileButtonValue[5]));

		Res.Subst(&quot;LadderTable&quot;, 	WebInclude(IncludeTable)$WebInclude(IncludeCaptionButton));
		Res.Subst(&quot;PostAction&quot;, 	SubSavedURI$&quot;?SessionID=&quot;$SID);
		Res.Subst(&quot;NewTarget&quot;,		&quot; target=\&quot;_parent\&quot;&quot;);
		ShowPage(Res, SubFrameContent);
	}

	else AccessDenied(Res);
}

// Page 6
function QuerySubSaved(WebRequest Req, WebResponse Res)
{
	local int i,k, x;
	local string 	SID,
					tmp, tmp1,
					TempStr;
	local Session 				CurS;
	local PlayInfo 				TempPI;
	local ProfileConfigSet 		TempPCS;
	local array&lt;string&gt; 		TempArr;
	local array&lt;class&lt;Mutator&gt; &gt; MClass;
	local array&lt;class&lt;Info&gt; &gt;	SAClass;

	local class&lt;Mutator&gt; 		MutClass;
	local class&lt;GameInfo&gt; 		GIClass;
	local class&lt;AccessControl&gt; 	ACClass;
	local class&lt;Info&gt;			TempSA;


	SID = Req.GetVariable(&quot;SessionID&quot;);
	CurS = SMaster.getSession(SID);
	if (CanPerform(&quot;Lm&quot;))
	{
		TempStr = CurS.getValue(&quot;GameType&quot;);
		if (TempStr != &quot;&quot;)
			GIClass = class&lt;GameInfo&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (GIClass == None)
		{
			ShowFramedMessage(Res,ErrorGameClassText,True);
			return;
		}

		TempStr = CurS.getValue(&quot;ACClass&quot;,Level.Game.AccessControlClass);
		if (TempStr != &quot;&quot;)
			ACClass = class&lt;AccessControl&gt;(DynamicLoadObject(TempStr,class'Class'));
		if (ACClass == None)
		{
			ShowFramedMessage(Res,ErrorAccessControlText,True);
			return;
		}
		TempPI = new(None) class'PlayInfo';

		// We are managing an existing profile
		if (CurS.hasData(&quot;ProfileIndex&quot;))
        {
            k = int(CurS.getValue(&quot;ProfileIndex&quot;));
            TempPCS = LadderRules.LadderProfiles[k];
            if (LadderRules.Profiles[k].ProfileName != CurS.getValue(&quot;ProfileName&quot;))
			{
				LadderRules.Profiles[k].ProfileName = CurS.getValue(&quot;ProfileName&quot;);
				LadderRules.AllLadderProfiles.Remove(LadderRules.AllLadderProfiles.FindItemId(string(k)));
				LadderRules.AllLadderProfiles.Add(string(k),LadderRules.Profiles[k].ProfileName);
				LadderRules.SaveConfig();
			}

			if (TempPCS.StartEdit())
			{
				TempPCS.SetGameType(CurS.getValue(&quot;GameType&quot;));
				TempPCS.EndEdit(False);
			}
        }

		else TempPCS = LadderRules.AddProfile(CurS.getValue(&quot;ProfileName&quot;), CurS.getValue(&quot;GameType&quot;));

        if (TempPCS.StartEdit())
		{
			for (i=0;i&lt;AllMutators.Length;i++)
			{
				MutClass = class&lt;Mutator&gt;(DynamicLoadObject(AllMutators[i].ClassName,class'Class'));
				if (MutClass != None)
				{
					if ((Req.GetVariable(AllMutators[i].ClassName,&quot;&quot;)!=&quot;&quot;)||(Req.GetVariable(AllMutators[i].GroupName,&quot;&quot;)~=AllMutators[i].ClassName))
						CurS.setMutator(AllMutators[i].ClassName,true,true);
					else CurS.setMutator(AllMutators[i].ClassName,false);

					if (CurS.HasMutator(AllMutators[i].ClassName))
					{
						MClass[MClass.Length] = MutClass;
						TempPCS.AddProfileMutator(AllMutators[i].ClassName,CurS.MutRequired(AllMutators[i].ClassName));
					}
					else TempPCS.DelProfileMutator(AllMutators[i].ClassName);
				}
			}

			for (i=0;i&lt;ConfigM.ManagedActors.Length;i++)
			{
				TempSA = ConfigM.ManagedActors[i].SAClass;
				if (TempSA != None)
				{
					TempStr = string(ConfigM.ManagedActors[i].SAClass);
					if (Req.GetVariable(TempStr,&quot;&quot;) != &quot;&quot;)
						CurS.setServerActor(TempStr, True, True);
					else CurS.setServerActor(TempStr, False);

					if (CurS.HasServerActor(TempStr))
					{
						SAClass[SAClass.Length] = TempSA;
						TempPCS.AddProfileServerActor(TempStr,CurS.SARequired(TempStr));
					}
					else TempPCS.DelProfileServerActor(TempStr);
				}
			}

			x = LoadThisPlayInfo(TempPI, GIClass, ACClass, MClass, SAClass);
			if (x &gt;= 0)
			{
				ShowFramedMessage(Res, ErrorLoadingPlayInfoText[x],True);
				return;
			}
			CurS.setValue(&quot;MaxMaps&quot;,Req.GetVariable(&quot;MaxMaps&quot;),true);
			TempPCS.MaxMaps = int(CurS.getValue(&quot;MaxMaps&quot;));

			GIClass.static.LoadMapList(GIClass.default.MapPrefix, TempArr);
			for (i=0;i&lt;TempArr.Length;i++)
			{
				if (Req.GetVariable(TempArr[i],&quot;&quot;)!=&quot;&quot;)
					CurS.setMap(TempArr[i],0,true,true);
				else CurS.setMap(TempArr[i],0,false,false);

				if (CurS.HasMap(TempArr[i]))
					TempPCS.AddProfileMap(TempArr[i], CurS.MapRequired(TempArr[i]));
				else TempPCS.DelProfileMap(TempArr[i]);
			}

			for (i=0;i&lt;TempPI.Settings.Length;i++)
			{
				if (TempPI.Settings[i].SecLevel &gt; CurAdmin.MaxSecLevel()) continue;
				tmp = &quot;&quot;; tmp1=&quot;&quot;;
				if (CurS.getIdValue(i,tmp,tmp1) == -1)
					break;
				if (!TempPCS.SetProfileNamedParam(TempPI.Settings[i].SettingName, CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value)))
					TempPCS.SetProfileParam(TempPCS.Count(),TempPI.Settings[i].SettingName,CurS.getValue(TempPI.Settings[i].SettingName,TempPI.Settings[i].Value));
			}

			TempPCS.EndEdit(true);
		}

		else
		{
			StatusError(Res,ErrorSavingProfile);
			QuerySubReview(Req, Res);
			return;
		}
		Tmp = CurS.getValue(&quot;ProfileName&quot;, PageCaption[0]);
		if (LadderRules.GetRemainingMatches() &gt; 0 &amp;&amp; Tmp == LadderRules.Profiles[GetCurrentConfigIndex()].ProfileName)
			Tmp = Tmp @ LabelNumberMatchesLeft @ string(LadderRules.GetRemainingMatches());
		Res.Subst(&quot;SubTitle&quot;, Tmp);
		ShowMessage(Res, TableTitle[6], PageCaption[6]);
		return;
	}

	else AccessDenied(Res);
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderTransition</title>
    <id>28448</id>
    <revision>
      <id>40145</id>
      <timestamp>2009-11-17T10:08:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LadderVolume</title>
    <id>1673</id>
    <revision>
      <id>4137</id>
      <timestamp>2005-11-30T19:32:56Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] &gt;&gt; LadderVolume (Package: Engine)}}

The ladder volume is a volume that allows vertical travel by a player pawn.

==Related Topics==
* [[Legacy:Add A Ladder|Add A Ladder]]

==Discussion==

'''Chip:''' LadderVolumes don't function inside other PhysicsVolumes (save the DefaultPhysicsVolume, of course) unless you set the Priority property of the LadderVolume higher than that of the Physics Volume containing it (this per the [[udn2:VolumesTutorial|UDN Volumes tute]] &amp; pointed out to me by Doctor7, thankyouverymuch, mea culpa).

'''OMGTTFS''' Can you give a link to the UDN volumes tute.  Much appreciated.

'''Balu:''' done. :-)

'''Mosquito:''' When using laddervolumes, give alittle slack at the top, so you can grab it from above

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4138</id>
      <timestamp>2003-02-12T08:54:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] &gt;&gt; LadderVolume (Package: Engine)}}

Right, the ladder volume is basicly, you create a cube, aproximately the size of where your ladder is and you place it there, setting it to be a ladder volume so whenever someone runsinto the ladder they climb up it, but it is known to have some problems when people try to climb down, anyone up to coding a better laddervolume?

'''Chip:''' LadderVolumes don't function inside other PhysicsVolumes (save the DefaultPhysicsVolume, of course) unless you set the Priority property of the LadderVolume higher than that of the Physics Volume containing it (this per the [[udn2:VolumesTutorial|UDN Volumes tute]] &amp; pointed out to me by Doctor7, thankyouverymuch, mea culpa).

'''OMGTTFS''' Can you give a link to the UDN volumes tute.  Much appreciated.

'''Balu:''' done. :-)</text>
    </revision>
    <revision>
      <id>4139</id>
      <timestamp>2003-02-13T07:46:48Z</timestamp>
      <contributor>
        <ip>Mosquiro</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; [[Legacy:PhysicsVolume|PhysicsVolume]] &gt;&gt; LadderVolume (Package: Engine)}}

Right, the ladder volume is basicly, you create a cube, aproximately the size of where your ladder is and you place it there, setting it to be a ladder volume so whenever someone runsinto the ladder they climb up it, but it is known to have some problems when people try to climb down, anyone up to coding a better laddervolume?

'''Chip:''' LadderVolumes don't function inside other PhysicsVolumes (save the DefaultPhysicsVolume, of course) unless you set the Priority property of the LadderVolume higher than that of the Physics Volume containing it (this per the [[udn2:VolumesTutorial|UDN Volumes tute]] &amp; pointed out to me by Doctor7, thankyouverymuch, mea culpa).

'''OMGTTFS''' Can you give a link to the UDN volumes tute.  Much appreciated.

'''Balu:''' done. :-)

'''Mosquito:''' When using laddervolumes, give alittle slack at the top, so you can grab it from above</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lag Compensation</title>
    <id>1687</id>
    <revision>
      <id>4170</id>
      <timestamp>2004-08-03T12:21:17Z</timestamp>
      <contributor>
        <ip>ACBAAF3C.ipt.aol.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General ==

With the term &quot;lag compensation&quot;, I refer to everything that is in the code to make players suffer less from the effects of lag. For example every modern first person shooter has some kind of movement prediction build in. Without movement prediction, we couldn't move instantly but every move would be delayed by a few milliseconds which would change the gameplay a lot (and not to the better).

Even though our movement still lags behind on the server for a small amount, at least we don't feel affected by the lag when moving.

==Hit Prediction ==

===Introduction ===

One important area in which we still feel the lag is aiming. When shooting projectile weapons, our projectile starts a bit delayed (and not instantly like our movement) and when shooting hitscan weapons, we have to predict the movement of our target and aim a bit ahead of it, praying that it doesn't change direction before the shot registers. The problem simply is, that it takes a while for the shot to travel to the server and then it will compare your shot information (do the trace) to the new timeframe and not the timeframe you actually did the shot in. This has a pretty heavy impact on gameplay and is the number one reason why a low latency is so important for games like Unreal Tournament. 

===Clientside Hit Detection ===

One attempt to solve this is the well known ZeroPing (can't find the real link right now, anyone?). In a nutshell, ZeroPing simply does all the hitscan hit detection on the client side and then tells the server what it hit. Obviously this completely breaks the paradigm of not giving any deciding power to the client. Even if you take away the threats of cheating, the question remains weither the client can be trusted, considering that the client's representation of other actors in the game does NOT have to match their actual positions. The client will simulate the movement of the other actor until it got a new update about their position and movement, so at the client, the target actor will actually move in a straight line, until it is &quot;warped&quot; to it's new and correct position with the next update. Without ZeroPing, there would hardly be any chance to hit those targets, if you don't even know where they really are at the moment. With ZeroPing, it doesn't matter if the prediction is completely wrong, you can still hit what you see, not what is real on the server. But this actively limits the maneuvering possibilities of the target. To summarize, while I believe that ZeroPing works great to allow people on very high latencies to play and have some fun with each other, I don't think that it's the right thing to do in general. Please correct me if I'm wrong with anything about ZeroPing or client side hit detection in general.

===Introducing Serverside Hit Prediction ===

Besides of ZeroPing, there is another approach and this one is actually tried and tested by large mainstream games like Counter-Strike. To make it short, the server simply stores a trail of timeframes (including the position of each actor) for a short time. Whenever a client shoots, the server will move all actors back to the timeframe of the client when it actually fired the shot. This allows a client to practically shoot at what it sees IF (and this is the important point) the client shows all actors at a position matching the positions on the server of the same timeframe. 

===Implementation ===

In detail, the implementation will work like this: 
* The server needs to store a trail for each moving and shootable actor. Each trail has to contain a timestamp, a location and a rotation of this actor. This is the simple part.
* When a client shoots, the server needs to know when exactly the client fired this shot (servertime). Currently I do it like this: The server replicated ServerTimeStamp (a float) to the client. To make this more accurate, the client increases this TimeStamp every tick by the time that has passed. Obviously the ServerTimeStamp always lags behind on the client, just as much as ever other information from the server lags behind (like actor positions).

'''Question''': Is there a way to get the same result without replicating a float value each time? Or do you think this is acceptable for the case?

To send the timestamp to the server, I simply use a modified fire function which includes the current ServerTimeStamp as a parameter.
* When the server does the actual hitscan, it moves all actors to a timestamp which most closely matches the timestamp at which the shot was actually fired. Because clients usually run at higher FPS than the server, interpolation can be used to get even more precision.
* Finally, it is important to render beam and impact effects immediately on the client and not spawn them on the server first, otherwise it would still &quot;feel&quot; as if you would have to lead, even though you don't.

There is one problem with machineguns in UT2003. Unlike UT, those guns don't call the replicated fire function with each bullet anymore, but only for startfire and stopfire. This is obviously a good thing because it doesn't limit the firerate to FPS or lag anymore, but a bad thing for us, as we don't know the exact time of each shot (as latency can fluctuate a lot). One possibility would be to simply ignore the inaccuracies, another possibility would be to replicate the ServerTimeStamp from the client to the server constantly, at least while a gun is fired. This might be the most accurate way and even usefull for other things, but I'm not sure how much of a hit this would be for bandwidth usage. Comments?

===Disadvantages ===

Obviously you can't simply make lag disappear, so every kind of lag compensation is a tradeoff. The drawbacks of movement prediction for example are, that a lagging player might seem to &quot;warp&quot; for other players when the prediction was wrong and has to be corrected. If the server was wrong with prediction, it will even allow a certain amount of error and correct the position on the server instead of correcting the client, so it can seem that other players are warping a bit for you, even if your connection is perfectly fast. This is a drawback that is commonly accepted because the alternative would be horrible and a tiny bit of warping really isn't significant anymore, especially when playing against other people with decent pings.

The major disadvantage of hit prediction is, that you can be shot, even though you think you are safe. For example if you take cover behind a wall and a split second later the server tells you that you are hit. This can be quite irritating, but it happens rarely if at all and even less when playing against other people with good pings.

Additionally, just like movement prediction only allows a certain amount of error, hit prediction could only compensate for a certain amount of time. This amount could be reduced if high ping bastards are too much of an annoyance. A value of 200ms should still be fine for most players and shouldn't feel too bad.

==See Also ==

[[Legacy:Hit Prediction|Hit Prediction]] ([[Legacy:Open Source|Open Source]] example implementation for [[Legacy:UT2003|UT2003]])

==Discussion ==

'''Spark:''' Phew... Well, this is my first contribution to the Wiki, hopefully it's interesting to anyone. I'm really really tired now so I can only hope that I didn't make too much mistakes at the end. :) If I made anything wrong with the layout, formating or names, please tell (and excuse) me. I'm thinking of splitting this into several pages, at least one dedicated page to hit prediction, but I wanted to do my &quot;Hello Wiki World&quot; on one page at first.

I also have a working implementation (an Instagib gametype) here that I would like to wikify so it can be looked at, learned from and hopefully be improved (tests went really well though). But I will think about how to do that after some sleep. :)

As a final note, I know that hit prediction is a very controversial topic and to be honest, I'm a bit tired of pointless arguments about weither it should be included in a game or not. I will leave it up to other people to create a mutator for UT2003 from this (or not) and then convince people to actually use it (or not). So this is mainly targeted to mod developers looking to &quot;unlag&quot; their mod, especially those which feature mostly hitscan weapons (like most realistic mods and Instagib).

'''Dante:''' Sounds interesting. But you're increasing server load very much. Take 3 guys firing with mguns, and for every trace you take all pawns and move them to the correct location for a given timestamp. You could decrease from all pawns to pawns within a given angular difference ( aiming from shooter to angle of ( enemy.location - location ) ).

'''Spark:''' That's a good idea, but even if the pawn is out of this radius it might not be out of the radius after timeshifting. Just allowing a large radius wouldn't be enough because an actor could also be &quot;rocketed&quot; behind the instigator (in close combat) or something like that. So an algorithm would need to be found that covers all eventualities and still is faster then doing the actual timeshifting. :) Maybe the &quot;relevent actors&quot; functionality can be used for this? I.e. only timeshift those actors which are relevant to the instigator. This would at least cover those actors which are completely out of reach and sight.

The Quake 3 &quot;unlagged&quot; implementation does also do the timeshifting for each and every player though and I'm not aware of any performance problems (that does not mean that it shouldn't be improved if possible of course).

'''Dirk Fist:''' I'm on dial up in a rural area the lowest ping I've ever had was 300(400 is avg). Your tracking idea sounds like a great idea you should realise however that most of the people that NEED lag compensation are going to have pings in excess of 200 (assuming 10 samples per second with 10 samples per actor would give a max lag of 1000), Also you will need to track everything that moves which could stop a projectile. If it was'nt for ZP on (UT) I would not be able to play.  Its important to note in the above discussion that ALL PLAYERS AIM BASED ON CLIENT SIDE information. 

http://zeroping.home.att.net/

'''xX)(Xx:''' Zeroping weapons cannot hit the fortstandards in Assault maps, meaning, AS maps must be played with non ZP weapons, or ZP Assault players can only play maps that set it so you walk into the fortstandard rather than shoot it</text>
    </revision>
    <revision>
      <id>4171</id>
      <timestamp>2004-02-29T05:52:18Z</timestamp>
      <contributor>
        <ip>Dirk Fist</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General ==

With the term &quot;lag compensation&quot;, I refer to everything that is in the code to make players suffer less from the effects of lag. For example every modern first person shooter has some kind of movement prediction build in. Without movement prediction, we couldn't move instantly but every move would be delayed by a few milliseconds which would change the gameplay a lot (and not to the better).

Even though our movement still lags behind on the server for a small amount, at least we don't feel affected by the lag when moving.

==Hit Prediction ==

===Introduction ===

One important area in which we still feel the lag is aiming. When shooting projectile weapons, our projectile starts a bit delayed (and not instantly like our movement) and when shooting hitscan weapons, we have to predict the movement of our target and aim a bit ahead of it, praying that it doesn't change direction before the shot registers. The problem simply is, that it takes a while for the shot to travel to the server and then it will compare your shot information (do the trace) to the new timeframe and not the timeframe you actually did the shot in. This has a pretty heavy impact on gameplay and is the number one reason why a low latency is so important for games like Unreal Tournament. 

===Clientside Hit Detection ===

One attempt to solve this is the well known ZeroPing (can't find the real link right now, anyone?). In a nutshell, ZeroPing simply does all the hitscan hit detection on the client side and then tells the server what it hit. Obviously this completely breaks the paradigm of not giving any deciding power to the client. Even if you take away the threats of cheating, the question remains weither the client can be trusted, considering that the client's representation of other actors in the game does NOT have to match their actual positions. The client will simulate the movement of the other actor until it got a new update about their position and movement, so at the client, the target actor will actually move in a straight line, until it is &quot;warped&quot; to it's new and correct position with the next update. Without ZeroPing, there would hardly be any chance to hit those targets, if you don't even know where they really are at the moment. With ZeroPing, it doesn't matter if the prediction is completely wrong, you can still hit what you see, not what is real on the server. But this actively limits the maneuvering possibilities of the target. To summarize, while I believe that ZeroPing works great to allow people on very high latencies to play and have some fun with each other, I don't think that it's the right thing to do in general. Please correct me if I'm wrong with anything about ZeroPing or client side hit detection in general.

===Introducing Serverside Hit Prediction ===

Besides of ZeroPing, there is another approach and this one is actually tried and tested by large mainstream games like Counter-Strike. To make it short, the server simply stores a trail of timeframes (including the position of each actor) for a short time. Whenever a client shoots, the server will move all actors back to the timeframe of the client when it actually fired the shot. This allows a client to practically shoot at what it sees IF (and this is the important point) the client shows all actors at a position matching the positions on the server of the same timeframe. 

===Implementation ===

In detail, the implementation will work like this: 
* The server needs to store a trail for each moving and shootable actor. Each trail has to contain a timestamp, a location and a rotation of this actor. This is the simple part.
* When a client shoots, the server needs to know when exactly the client fired this shot (servertime). Currently I do it like this: The server replicated ServerTimeStamp (a float) to the client. To make this more accurate, the client increases this TimeStamp every tick by the time that has passed. Obviously the ServerTimeStamp always lags behind on the client, just as much as ever other information from the server lags behind (like actor positions).

'''Question''': Is there a way to get the same result without replicating a float value each time? Or do you think this is acceptable for the case?

To send the timestamp to the server, I simply use a modified fire function which includes the current ServerTimeStamp as a parameter.
* When the server does the actual hitscan, it moves all actors to a timestamp which most closely matches the timestamp at which the shot was actually fired. Because clients usually run at higher FPS than the server, interpolation can be used to get even more precision.
* Finally, it is important to render beam and impact effects immediately on the client and not spawn them on the server first, otherwise it would still &quot;feel&quot; as if you would have to lead, even though you don't.

There is one problem with machineguns in UT2003. Unlike UT, those guns don't call the replicated fire function with each bullet anymore, but only for startfire and stopfire. This is obviously a good thing because it doesn't limit the firerate to FPS or lag anymore, but a bad thing for us, as we don't know the exact time of each shot (as latency can fluctuate a lot). One possibility would be to simply ignore the inaccuracies, another possibility would be to replicate the ServerTimeStamp from the client to the server constantly, at least while a gun is fired. This might be the most accurate way and even usefull for other things, but I'm not sure how much of a hit this would be for bandwidth usage. Comments?

===Disadvantages ===

Obviously you can't simply make lag disappear, so every kind of lag compensation is a tradeoff. The drawbacks of movement prediction for example are, that a lagging player might seem to &quot;warp&quot; for other players when the prediction was wrong and has to be corrected. If the server was wrong with prediction, it will even allow a certain amount of error and correct the position on the server instead of correcting the client, so it can seem that other players are warping a bit for you, even if your connection is perfectly fast. This is a drawback that is commonly accepted because the alternative would be horrible and a tiny bit of warping really isn't significant anymore, especially when playing against other people with decent pings.

The major disadvantage of hit prediction is, that you can be shot, even though you think you are safe. For example if you take cover behind a wall and a split second later the server tells you that you are hit. This can be quite irritating, but it happens rarely if at all and even less when playing against other people with good pings.

Additionally, just like movement prediction only allows a certain amount of error, hit prediction could only compensate for a certain amount of time. This amount could be reduced if high ping bastards are too much of an annoyance. A value of 200ms should still be fine for most players and shouldn't feel too bad.

==See Also ==

[[Legacy:Hit Prediction|Hit Prediction]] ([[Legacy:Open Source|Open Source]] example implementation for [[Legacy:UT2003|UT2003]])

==Discussion ==

'''Spark:''' Phew... Well, this is my first contribution to the Wiki, hopefully it's interesting to anyone. I'm really really tired now so I can only hope that I didn't make too much mistakes at the end. :) If I made anything wrong with the layout, formating or names, please tell (and excuse) me. I'm thinking of splitting this into several pages, at least one dedicated page to hit prediction, but I wanted to do my &quot;Hello Wiki World&quot; on one page at first.

I also have a working implementation (an Instagib gametype) here that I would like to wikify so it can be looked at, learned from and hopefully be improved (tests went really well though). But I will think about how to do that after some sleep. :)

As a final note, I know that hit prediction is a very controversial topic and to be honest, I'm a bit tired of pointless arguments about weither it should be included in a game or not. I will leave it up to other people to create a mutator for UT2003 from this (or not) and then convince people to actually use it (or not). So this is mainly targeted to mod developers looking to &quot;unlag&quot; their mod, especially those which feature mostly hitscan weapons (like most realistic mods and Instagib).

'''Dante:''' Sounds interesting. But you're increasing server load very much. Take 3 guys firing with mguns, and for every trace you take all pawns and move them to the correct location for a given timestamp. You could decrease from all pawns to pawns within a given angular difference ( aiming from shooter to angle of ( enemy.location - location ) ).

'''Spark:''' That's a good idea, but even if the pawn is out of this radius it might not be out of the radius after timeshifting. Just allowing a large radius wouldn't be enough because an actor could also be &quot;rocketed&quot; behind the instigator (in close combat) or something like that. So an algorithm would need to be found that covers all eventualities and still is faster then doing the actual timeshifting. :) Maybe the &quot;relevent actors&quot; functionality can be used for this? I.e. only timeshift those actors which are relevant to the instigator. This would at least cover those actors which are completely out of reach and sight.

The Quake 3 &quot;unlagged&quot; implementation does also do the timeshifting for each and every player though and I'm not aware of any performance problems (that does not mean that it shouldn't be improved if possible of course).

'''Dirk Fist:''' I'm on dial up in a rural area the lowest ping I've ever had was 300(400 is avg). Your tracking idea sounds like a great idea you should realise however that most of the people that NEED lag compensation are going to have pings in excess of 200 (assuming 10 samples per second with 10 samples per actor would give a max lag of 1000), Also you will need to track everything that moves which could stop a projectile. If it was'nt for ZP on (UT) I would not be able to play.  Its important to note in the above discussion that ALL PLAYERS AIM BASED ON CLIENT SIDE information. 

http://zeroping.home.att.net/</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lalo</title>
    <id>1659</id>
    <revision>
      <id>4105</id>
      <timestamp>2004-05-16T10:52:30Z</timestamp>
      <contributor>
        <ip>Immortius</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Lalo is an [[Legacy:Open Source|open source]] freak (even tough he prefers the term Free Software) and wiki-addict, and honestly doesn't care a lot for UT but is completely addicted to [[Legacy:ThieveryUT|ThieveryUT]] as of late. Findable at http://www.laranja.org/ or mailto:lalo@laranja.org or jabber:lalo@laranja.org

'''Tarquin:''' Hello Lalo. Welcome to the Unreal Wiki :)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki :) :tup:

'''Mortal Monkey:''' Hello fellow taffer! You wouldn't by any chance be known as immortius on the Thievery forums, would you?

'''Immortius:''' Nope, I'm definately Immortius. Lalo is someone else.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4106</id>
      <timestamp>2003-07-31T00:12:30Z</timestamp>
      <contributor>
        <ip>Mortal Monkey</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Lalo is an [[Legacy:Open Source|open source]] freak (even tough he prefers the term Free Software) and wiki-addict, and honestly doesn't care a lot for UT but is completely addicted to [[Legacy:ThieveryUT|ThieveryUT]] as of late. Findable at http://www.laranja.org/ or mailto:lalo@laranja.org or jabber:lalo@laranja.org

'''Tarquin:''' Hello Lalo. Welcome to the Unreal Wiki :)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki :) :tup:

'''Mortal Monkey:''' Hello fellow taffer! You wouldn't by any chance be known as immortius on the Thievery forums, would you?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32838</id>
      <timestamp>2008-07-29T01:11:46Z</timestamp>
      <contributor>
        <username>Lalo</username>
        <id>1058</id>
      </contributor>
      <comment>just removing all links to my old domain that is now a search spam link farm :-(</comment>
      <text xml:space="preserve">Lalo is an [[Legacy:Open Source|open source]] freak (even tough he prefers the term Free Software) and wiki-addict, and honestly doesn't care a lot for UT but is completely addicted to [[Legacy:ThieveryUT|ThieveryUT]] as of late. Findable at http://lalomartins.info/ or (email/jabber/gtalk/msn) lalo dot martins at gmail.

'''Tarquin:''' Hello Lalo. Welcome to the Unreal Wiki :)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki :) :tup:

'''Mortal Monkey:''' Hello fellow taffer! You wouldn't by any chance be known as immortius on the Thievery forums, would you?

'''Immortius:''' Nope, I'm definately Immortius. Lalo is someone else.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LambController</title>
    <id>28378</id>
    <revision>
      <id>40047</id>
      <timestamp>2009-11-15T08:05:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Land Of The Dead</title>
    <id>1749</id>
    <revision>
      <id>4295</id>
      <timestamp>2006-11-28T18:49:26Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Linked to Unreal Engine Versions/2</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|[http://www.brainboxgames.com/ Brainbox Games] 
|-
|'''''Publisher'''''
|[http://www.groovegames.com/ Groove Games] 
|-
|'''''Release Date'''''
|October 2005 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Xbox 
|-
|'''''Official Web Site'''''
|http://www.landofthedeadgame.com/ 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/157814/150000/fileinfo/Land-of-the-Dead-Demo FilePlanet Mirror] 
|-
|'''''Latest Patch'''''
|Version '''1.1''' &amp;ndash; November 2005&lt;br /&gt;[http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/2
|Unreal Engine 2.0]] Build 2226
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 3]] 
|}

==Description==

'''Land of the Dead''' is a first-person shooter, developed by Brainbox Games and published by Groove Games, in October 2005.

It is loosely based on a license for the Land of the Dead movie.

==System Requirements==
; Operating System : Windows XP

; CPU : 700MHz

; Memory : 64MB

; Hard Disk Space : 1GB

; Audio System : Windows&amp;reg; compatible sound card

; Video System : 3-D Video, 32MB+, 64mb+ to run editor

; Multiplayer : Internet (TCP/IP) and LAN (TCP/IP) play supported. Internet play requires a 33.6 Kbps or faster modem

==Downloads==

===Patches/Updates===
* [http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 

==Useful Information==

LOTD:RTFG is extended by the Bink video player extensions, and also seems to support some sort of Unreal version of Java Interface classes.

New native functions:

; Actor CopyMaterialsToSkins : Copies all default materials for a Static or Skeletal Mesh to the Skins[] override array of the Actor
; Actor FilterStateDirty : Unknown
; PlayerController LeaveVoiceChat : Unknown - possibly XBox voice related
; PlayerController ChanveVoiceChatter(int IPAddr, int Handle, bool Add) : Unknown - possibly XBox voice related
; BinkVideoPlayer Bink_Play(string filename) : Play specified video
; BinkVideoPlayer Bink_Scale(float scale) : Scale video (1.0 = normal)
; BinkVideoPlayer Bink_Stop : Stop all bink player instances
; BinkVideoPlayer Bink_Is_Playing : returns true if bink is playing, false if not
; Profiler Load(int v) : Load profile? from slot? v
; Profiler Save : Save profile
; Profiler SetValue(string vk, string vv) : Set key/value pair for profile
; Profiler GetValue(string v) : Return string value given key 'v'
; Profiler NewProfile(string v) : Create new profile with name 'v'
; Profiler DeleteProfile(int v) : Delete profile from slot? 'v'
; Profiler GetProfileCount : Loads all profiles, refreshes list, returns count of total profiles
; Profiler GetProfileByName(string v) : Returns profile slot? named by 'v'
; Profiler GetProfileName(int v) : Returns string containing profile name, given slot 'v' (note: call GetProfileCount first)
; Profiler GetCurrentProfileName : returns currently loaded profile, or &quot;&quot; if not loaded
; Profiler IsValidProfile : Not documented? Not sure if this is called in Uscript to return wether we have a valid profile, or what
; Profiler GetTotalCheckpoints : &quot;Returns total number of checkpoints in profile&quot;, whatever that means.
; Profiler GetChecpoint(int v) : &quot;Returns name of checkpoint at index v&quot;, whatever that means

[[Legacy:Land Of The Dead/Actor|Land of the Dead/Actor]] reference

[[Legacy:Land Of The Dead/NavigationPoint|Land of the Dead/NavigationPoint]] reference

==Known Issues==

* A patch to V1.1 was released in November, 2005, and includes a fair amount of updates, as well as support for custom content, and Brain Box's version of UnrealEd.  The Editor seems mostly unchanged, except it reads *.dz files for maps, instead of *.uz files.
* The IPDRV.HttpDownload module is utterly broken, on the client end.  HTTPDownload is apparently not available for this game, unless someone can come up with a unique way of fixing it.
* When a player stands on a static mesh, that is higher than a few UU above the zombies, and is lower than another level of accessible geometry, the AI gets extremely confused, and causes a fair amount of lag.  This is normally not an issue with developer shipped levels, which rarely have more than 4 or 5 enemies at a time, but is an issue for a lot of custom created content.  Some of the modifications for the game have attempted to alleviate this by changing the AI, and some have lessened it, but none have been exceptionally successful at eliminating the lag.
* Mover classes, and all their subs, suffer from the fact that the KeyRot and KeyPos variables are not replicated, which will create all sorts of weird issues online.  A few people at http://www.undeadgames.com/ have offered fixes in their forum.
* DestructableMover classes suffer from an issue where they are not removed from the world after they suffer enough damage to destruct them.  This causes splash damage, such as something doing damage using the RadiusActors [[Legacy:Iterator|iterator]] to call TakeDamage() in all nearby actors, to cause the mover to replay it's destruction animation, even though it has already been destructed.  There are two easy ways to fix this in a subclass: From TakeDamage() either call Destroy() when the mover has taken fatal damage, or have TakeDamage() not call the super if the DamageCapacity &lt;= 0.
* Sometimes on a multiplayer game, the zombies will go to negative health, and their bodies will explode when you hit them again.  This is apparently due to a rumored engine bug that causes function calls to mysteriously stop executing when they call something that inherits but doesn't define a particular function.  In this case, it's &quot;PreventDamage()&quot; in the gametypes.  So, I recommend if you do any gametyping, you add a PreventDamage() function, and just point it to the super.  It may just help.

==Interfaces in LotD==

As mentioned above, LotD seems to have support for Interface classes.  These appear to act somewhat like their similarly named Java counterparts, and are especially useful for implementing several different behaviours, such as an add-on class that is Smashable, Burnable, and Movable.

The following interfaces are defined in LotD:

; HudDrawable : HudDrawable gives any program that implements a drawToHud(Canvas, float, float) function, the ability to register with a player's HUD (player.myHUD.register(self) according to the comments)and get called for drawing.
; SaveHandler : SaveHandler is only in a few objects, and gives them the ability to have a PreSave() and PostSave() function for when it's time to save.
; VideoNotification : VideoNotification is apparently used in PlayerController to handle when to pause the game when video begins and unpause when video ends
; EventDispatcher
; MessageDispatcher : EventDispatcher and MessageDispatcher are supposedly implemented in the ObjectiveManager code, but there don't seem to be matching interface classes
; Smashable : Smashable is implemented by DOTZDestructableMesh, DOTZDoor, and all subs of WoodenDoor.

==Related Topics==
* [[Legacy:Unreal Engine Versions/2|Unreal Engine Versions/2]]

==Discussion==

[[Category:Legacy Game|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4296</id>
      <timestamp>2006-11-28T03:41:36Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>Following the new standard?</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|[http://www.brainboxgames.com/ Brainbox Games] 
|-
|'''''Publisher'''''
|[http://www.groovegames.com/ Groove Games] 
|-
|'''''Release Date'''''
|October 2005 
|-
|'''''Supported Platform(s)'''''
|Windows\\ 
|}

X-Box |

{|

|-
|'''''Official Web Site'''''
|http://www.landofthedeadgame.com/ 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/157814/150000/fileinfo/Land-of-the-Dead-Demo FilePlanet Mirror] 
|-
|'''''Latest Patch'''''
|Version '''1.1''' &amp;ndash; November 2005&lt;br /&gt;[http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions
|Unreal Engine 2.0]] Build 2226
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 3]] 
|}

==Description==

'''Land of the Dead''' is a first-person shooter, developed by Brainbox Games and published by Groove Games, in October 2005.

It is loosely based on a license for the Land of the Dead movie.

===Other Games in the Series===

==System Requirements==
; Operating System : Windows XP

; CPU : 700MHz

; Memory : 64MB

; Hard Disk Space : 1GB

; Audio System : Windows&amp;reg; compatible sound card

; Video System : 3-D Video, 32MB+, 64mb+ to run editor

; Multiplayer : Internet (TCP/IP) and LAN (TCP/IP) play supported. Internet play requires a 33.6 Kbps or faster modem

==Downloads==

===Patches/Updates===
* [http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 

==Useful Information==

LOTD:RTFG is extended by the Bink video player extensions, and also seems to support some sort of Unreal version of Java Interface classes.

New native functions:

; Actor CopyMaterialsToSkins : Copies all default materials for a Static or Skeletal Mesh to the Skins[] override array of the Actor
; Actor FilterStateDirty : Unknown
; PlayerController LeaveVoiceChat : Unknown - possibly XBox voice related
; PlayerController ChanveVoiceChatter(int IPAddr, int Handle, bool Add) : Unknown - possibly XBox voice related
; BinkVideoPlayer Bink_Play(string filename) : Play specified video
; BinkVideoPlayer Bink_Scale(float scale) : Scale video (1.0 = normal)
; BinkVideoPlayer Bink_Stop : Stop all bink player instances
; BinkVideoPlayer Bink_Is_Playing : returns true if bink is playing, false if not
; Profiler Load(int v) : Load profile? from slot? v
; Profiler Save : Save profile
; Profiler SetValue(string vk, string vv) : Set key/value pair for profile
; Profiler GetValue(string v) : Return string value given key 'v'
; Profiler NewProfile(string v) : Create new profile with name 'v'
; Profiler DeleteProfile(int v) : Delete profile from slot? 'v'
; Profiler GetProfileCount : Loads all profiles, refreshes list, returns count of total profiles
; Profiler GetProfileByName(string v) : Returns profile slot? named by 'v'
; Profiler GetProfileName(int v) : Returns string containing profile name, given slot 'v' (note: call GetProfileCount first)
; Profiler GetCurrentProfileName : returns currently loaded profile, or &quot;&quot; if not loaded
; Profiler IsValidProfile : Not documented? Not sure if this is called in Uscript to return wether we have a valid profile, or what
; Profiler GetTotalCheckpoints : &quot;Returns total number of checkpoints in profile&quot;, whatever that means.
; Profiler GetChecpoint(int v) : &quot;Returns name of checkpoint at index v&quot;, whatever that means

[[Legacy:Land Of The Dead/Actor|Land of the Dead/Actor]] reference

[[Legacy:Land Of The Dead/NavigationPoint|Land of the Dead/NavigationPoint]] reference

==Known Issues==

* A patch to V1.1 was released in November, 2005, and includes a fair amount of updates, as well as support for custom content, and Brain Box's version of UnrealEd.  The Editor seems mostly unchanged, except it reads *.dz files for maps, instead of *.uz files.
* The IPDRV.HttpDownload module is utterly broken, on the client end.  HTTPDownload is apparently not available for this game, unless someone can come up with a unique way of fixing it.
* When a player stands on a static mesh, that is higher than a few UU above the zombies, and is lower than another level of accessible geometry, the AI gets extremely confused, and causes a fair amount of lag.  This is normally not an issue with developer shipped levels, which rarely have more than 4 or 5 enemies at a time, but is an issue for a lot of custom created content.  Some of the modifications for the game have attempted to alleviate this by changing the AI, and some have lessened it, but none have been exceptionally successful at eliminating the lag.
* Mover classes, and all their subs, suffer from the fact that the KeyRot and KeyPos variables are not replicated, which will create all sorts of weird issues online.  A few people at http://www.undeadgames.com/ have offered fixes in their forum.
* DestructableMover classes suffer from an issue where they are not removed from the world after they suffer enough damage to destruct them.  This causes splash damage, such as something doing damage using the RadiusActors [[Legacy:Iterator|iterator]] to call TakeDamage() in all nearby actors, to cause the mover to replay it's destruction animation, even though it has already been destructed.  There are two easy ways to fix this in a subclass: From TakeDamage() either call Destroy() when the mover has taken fatal damage, or have TakeDamage() not call the super if the DamageCapacity &lt;= 0.
* Sometimes on a multiplayer game, the zombies will go to negative health, and their bodies will explode when you hit them again.  This is apparently due to a rumored engine bug that causes function calls to mysteriously stop executing when they call something that inherits but doesn't define a particular function.  In this case, it's &quot;PreventDamage()&quot; in the gametypes.  So, I recommend if you do any gametyping, you add a PreventDamage() function, and just point it to the super.  It may just help.

==Interfaces in LotD==

As mentioned above, LotD seems to have support for Interface classes.  These appear to act somewhat like their similarly named Java counterparts, and are especially useful for implementing several different behaviours, such as an add-on class that is Smashable, Burnable, and Movable.

The following interfaces are defined in LotD:

; HudDrawable : HudDrawable gives any program that implements a drawToHud(Canvas, float, float) function, the ability to register with a player's HUD (player.myHUD.register(self) according to the comments)and get called for drawing.
; SaveHandler : SaveHandler is only in a few objects, and gives them the ability to have a PreSave() and PostSave() function for when it's time to save.
; VideoNotification : VideoNotification is apparently used in PlayerController to handle when to pause the game when video begins and unpause when video ends
; EventDispatcher
; MessageDispatcher : EventDispatcher and MessageDispatcher are supposedly implemented in the ObjectiveManager code, but there don't seem to be matching interface classes
; Smashable : Smashable is implemented by DOTZDestructableMesh, DOTZDoor, and all subs of WoodenDoor.

==Related Topics==
* [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] &amp;ndash; The different Unreal Engine builds.

==Discussion==

[[Category:Legacy Game|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44151</id>
      <timestamp>2010-12-03T01:00:36Z</timestamp>
      <contributor>
        <ip>68.41.163.10</ip>
      </contributor>
      <comment>/* Useful Information */ Added some information regarding playing this game on Vista, and supposedly windows 7. I'll create an account if you guys need me to correct anything :)</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|[http://www.brainboxgames.com/ Brainbox Games] 
|-
|'''''Publisher'''''
|[http://www.groovegames.com/ Groove Games] 
|-
|'''''Release Date'''''
|October 2005 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Xbox 
|-
|'''''Official Web Site'''''
|http://www.landofthedeadgame.com/ 
|-
|'''''Demo'''''
|[http://www.fileplanet.com/157814/150000/fileinfo/Land-of-the-Dead-Demo FilePlanet Mirror] 
|-
|'''''Latest Patch'''''
|Version '''1.1''' &amp;ndash; November 2005&lt;br /&gt;[http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/2
|Unreal Engine 2.0]] Build 2226
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 3]] 
|}

==Description==

'''Land of the Dead''' is a first-person shooter, developed by Brainbox Games and published by Groove Games, in October 2005.

It is loosely based on a license for the Land of the Dead movie.

==System Requirements==
; Operating System : Windows XP

; CPU : 700MHz

; Memory : 64MB

; Hard Disk Space : 1GB

; Audio System : Windows&amp;reg; compatible sound card

; Video System : 3-D Video, 32MB+, 64mb+ to run editor

; Multiplayer : Internet (TCP/IP) and LAN (TCP/IP) play supported. Internet play requires a 33.6 Kbps or faster modem

==Downloads==

===Patches/Updates===
* [http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 

==Useful Information==

LOTD:RTFG is extended by the Bink video player extensions, and also seems to support some sort of Unreal version of Java Interface classes.

New native functions:

; Actor CopyMaterialsToSkins : Copies all default materials for a Static or Skeletal Mesh to the Skins[] override array of the Actor
; Actor FilterStateDirty : Unknown
; PlayerController LeaveVoiceChat : Unknown - possibly XBox voice related
; PlayerController ChanveVoiceChatter(int IPAddr, int Handle, bool Add) : Unknown - possibly XBox voice related
; BinkVideoPlayer Bink_Play(string filename) : Play specified video
; BinkVideoPlayer Bink_Scale(float scale) : Scale video (1.0 = normal)
; BinkVideoPlayer Bink_Stop : Stop all bink player instances
; BinkVideoPlayer Bink_Is_Playing : returns true if bink is playing, false if not
; Profiler Load(int v) : Load profile? from slot? v
; Profiler Save : Save profile
; Profiler SetValue(string vk, string vv) : Set key/value pair for profile
; Profiler GetValue(string v) : Return string value given key 'v'
; Profiler NewProfile(string v) : Create new profile with name 'v'
; Profiler DeleteProfile(int v) : Delete profile from slot? 'v'
; Profiler GetProfileCount : Loads all profiles, refreshes list, returns count of total profiles
; Profiler GetProfileByName(string v) : Returns profile slot? named by 'v'
; Profiler GetProfileName(int v) : Returns string containing profile name, given slot 'v' (note: call GetProfileCount first)
; Profiler GetCurrentProfileName : returns currently loaded profile, or &quot;&quot; if not loaded
; Profiler IsValidProfile : Not documented? Not sure if this is called in Uscript to return wether we have a valid profile, or what
; Profiler GetTotalCheckpoints : &quot;Returns total number of checkpoints in profile&quot;, whatever that means.
; Profiler GetChecpoint(int v) : &quot;Returns name of checkpoint at index v&quot;, whatever that means

[[Legacy:Land Of The Dead/Actor|Land of the Dead/Actor]] reference

[[Legacy:Land Of The Dead/NavigationPoint|Land of the Dead/NavigationPoint]] reference

----

* If being played on Windows Vista (or 7?), save files are ''not'' stored in the default \Land of the Dead\Saves folder. Windows Vista introduced a safety feature that disallows programs run by a standard user (rather than run as administrator) write access to the Program Files folder. That being said, any modifications or new files will be stored in a remote folder for '''your''' windows user account. Said folder can be found at '''C:\Users\''[Username]''\AppData\Local\VirtualStore\Program Files'''. Past that, it will mirror your Program Files folder with any directories that contain modified files. So navigating into '''.\Groove Games\Land Of The Dead\System''', you will most likely see a few *.ini files that were created due to you changing settings. Navigating a directory up, then into the Saves folder, you will see all of your save directories, with the information stored within.

==Known Issues==

* A patch to V1.1 was released in November, 2005, and includes a fair amount of updates, as well as support for custom content, and Brain Box's version of UnrealEd.  The Editor seems mostly unchanged, except it reads *.dz files for maps, instead of *.uz files.
* The IPDRV.HttpDownload module is utterly broken, on the client end.  HTTPDownload is apparently not available for this game, unless someone can come up with a unique way of fixing it.
* When a player stands on a static mesh, that is higher than a few UU above the zombies, and is lower than another level of accessible geometry, the AI gets extremely confused, and causes a fair amount of lag.  This is normally not an issue with developer shipped levels, which rarely have more than 4 or 5 enemies at a time, but is an issue for a lot of custom created content.  Some of the modifications for the game have attempted to alleviate this by changing the AI, and some have lessened it, but none have been exceptionally successful at eliminating the lag.
* Mover classes, and all their subs, suffer from the fact that the KeyRot and KeyPos variables are not replicated, which will create all sorts of weird issues online.  A few people at http://www.undeadgames.com/ have offered fixes in their forum.
* DestructableMover classes suffer from an issue where they are not removed from the world after they suffer enough damage to destruct them.  This causes splash damage, such as something doing damage using the RadiusActors [[Legacy:Iterator|iterator]] to call TakeDamage() in all nearby actors, to cause the mover to replay it's destruction animation, even though it has already been destructed.  There are two easy ways to fix this in a subclass: From TakeDamage() either call Destroy() when the mover has taken fatal damage, or have TakeDamage() not call the super if the DamageCapacity &lt;= 0.
* Sometimes on a multiplayer game, the zombies will go to negative health, and their bodies will explode when you hit them again.  This is apparently due to a rumored engine bug that causes function calls to mysteriously stop executing when they call something that inherits but doesn't define a particular function.  In this case, it's &quot;PreventDamage()&quot; in the gametypes.  So, I recommend if you do any gametyping, you add a PreventDamage() function, and just point it to the super.  It may just help.

==Interfaces in LotD==

As mentioned above, LotD seems to have support for Interface classes.  These appear to act somewhat like their similarly named Java counterparts, and are especially useful for implementing several different behaviours, such as an add-on class that is Smashable, Burnable, and Movable.

The following interfaces are defined in LotD:

; HudDrawable : HudDrawable gives any program that implements a drawToHud(Canvas, float, float) function, the ability to register with a player's HUD (player.myHUD.register(self) according to the comments)and get called for drawing.
; SaveHandler : SaveHandler is only in a few objects, and gives them the ability to have a PreSave() and PostSave() function for when it's time to save.
; VideoNotification : VideoNotification is apparently used in PlayerController to handle when to pause the game when video begins and unpause when video ends
; EventDispatcher
; MessageDispatcher : EventDispatcher and MessageDispatcher are supposedly implemented in the ObjectiveManager code, but there don't seem to be matching interface classes
; Smashable : Smashable is implemented by DOTZDestructableMesh, DOTZDoor, and all subs of WoodenDoor.

==Related Topics==
* [[Legacy:Unreal Engine Versions/2|Unreal Engine Versions/2]]

==Discussion==

[[Category:Legacy Game|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44152</id>
      <timestamp>2010-12-03T22:55:36Z</timestamp>
      <contributor>
        <ip>68.41.163.10</ip>
      </contributor>
      <comment>Changed official website link to a version at archive.org, since the original link here is essentially dead.</comment>
      <text xml:space="preserve">{|

|-
|'''''Developer(s)'''''
|[http://www.brainboxgames.com/ Brainbox Games] 
|-
|'''''Publisher'''''
|[http://www.groovegames.com/ Groove Games] 
|-
|'''''Release Date'''''
|October 2005 
|-
|'''''Supported Platform(s)'''''
|Windows&lt;br /&gt;Xbox 
|-
|'''''Official Web Site'''''
|[http://web.archive.org/web/20080712214931/www.landofthedeadgame.com/index2.php http://www.landofthedeadgame.com/ (Archive)]
|-
|'''''Demo'''''
|[http://www.fileplanet.com/157814/150000/fileinfo/Land-of-the-Dead-Demo FilePlanet Mirror] 
|-
|'''''Latest Patch'''''
|Version '''1.1''' &amp;ndash; November 2005&lt;br /&gt;[http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 
|-
|'''''Unreal Engine Version'''''
|[[Unreal Engine Versions/2
|Unreal Engine 2.0]] Build 2226
|-
|'''''UnrealEd Version'''''
|[[UnrealEd Versions
|UnrealEd 3]] 
|}

==Description==

'''Land of the Dead''' is a first-person shooter, developed by Brainbox Games and published by Groove Games, in October 2005.

It is loosely based on a license for the Land of the Dead movie.

==System Requirements==
; Operating System : Windows XP

; CPU : 700MHz

; Memory : 64MB

; Hard Disk Space : 1GB

; Audio System : Windows&amp;reg; compatible sound card

; Video System : 3-D Video, 32MB+, 64mb+ to run editor

; Multiplayer : Internet (TCP/IP) and LAN (TCP/IP) play supported. Internet play requires a 33.6 Kbps or faster modem

==Downloads==

===Patches/Updates===
* [http://www.groovegames.com/Games/LandOfTheDead/downloads/LOTD_Patch_v1.1.zip Windows] 

==Useful Information==

LOTD:RTFG is extended by the Bink video player extensions, and also seems to support some sort of Unreal version of Java Interface classes.

New native functions:

; Actor CopyMaterialsToSkins : Copies all default materials for a Static or Skeletal Mesh to the Skins[] override array of the Actor
; Actor FilterStateDirty : Unknown
; PlayerController LeaveVoiceChat : Unknown - possibly XBox voice related
; PlayerController ChanveVoiceChatter(int IPAddr, int Handle, bool Add) : Unknown - possibly XBox voice related
; BinkVideoPlayer Bink_Play(string filename) : Play specified video
; BinkVideoPlayer Bink_Scale(float scale) : Scale video (1.0 = normal)
; BinkVideoPlayer Bink_Stop : Stop all bink player instances
; BinkVideoPlayer Bink_Is_Playing : returns true if bink is playing, false if not
; Profiler Load(int v) : Load profile? from slot? v
; Profiler Save : Save profile
; Profiler SetValue(string vk, string vv) : Set key/value pair for profile
; Profiler GetValue(string v) : Return string value given key 'v'
; Profiler NewProfile(string v) : Create new profile with name 'v'
; Profiler DeleteProfile(int v) : Delete profile from slot? 'v'
; Profiler GetProfileCount : Loads all profiles, refreshes list, returns count of total profiles
; Profiler GetProfileByName(string v) : Returns profile slot? named by 'v'
; Profiler GetProfileName(int v) : Returns string containing profile name, given slot 'v' (note: call GetProfileCount first)
; Profiler GetCurrentProfileName : returns currently loaded profile, or &quot;&quot; if not loaded
; Profiler IsValidProfile : Not documented? Not sure if this is called in Uscript to return wether we have a valid profile, or what
; Profiler GetTotalCheckpoints : &quot;Returns total number of checkpoints in profile&quot;, whatever that means.
; Profiler GetChecpoint(int v) : &quot;Returns name of checkpoint at index v&quot;, whatever that means

[[Legacy:Land Of The Dead/Actor|Land of the Dead/Actor]] reference

[[Legacy:Land Of The Dead/NavigationPoint|Land of the Dead/NavigationPoint]] reference

----

* If being played on Windows Vista (or 7?), save files are ''not'' stored in the default \Land of the Dead\Saves folder. Windows Vista introduced a safety feature that disallows programs run by a standard user (rather than run as administrator) write access to the Program Files folder. That being said, any modifications or new files will be stored in a remote folder for '''your''' windows user account. Said folder can be found at '''C:\Users\''[Username]''\AppData\Local\VirtualStore\Program Files'''. Past that, it will mirror your Program Files folder with any directories that contain modified files. So navigating into '''.\Groove Games\Land Of The Dead\System''', you will most likely see a few *.ini files that were created due to you changing settings. Navigating a directory up, then into the Saves folder, you will see all of your save directories, with the information stored within.

==Known Issues==

* A patch to V1.1 was released in November, 2005, and includes a fair amount of updates, as well as support for custom content, and Brain Box's version of UnrealEd.  The Editor seems mostly unchanged, except it reads *.dz files for maps, instead of *.uz files.
* The IPDRV.HttpDownload module is utterly broken, on the client end.  HTTPDownload is apparently not available for this game, unless someone can come up with a unique way of fixing it.
* When a player stands on a static mesh, that is higher than a few UU above the zombies, and is lower than another level of accessible geometry, the AI gets extremely confused, and causes a fair amount of lag.  This is normally not an issue with developer shipped levels, which rarely have more than 4 or 5 enemies at a time, but is an issue for a lot of custom created content.  Some of the modifications for the game have attempted to alleviate this by changing the AI, and some have lessened it, but none have been exceptionally successful at eliminating the lag.
* Mover classes, and all their subs, suffer from the fact that the KeyRot and KeyPos variables are not replicated, which will create all sorts of weird issues online.  A few people at http://www.undeadgames.com/ have offered fixes in their forum.
* DestructableMover classes suffer from an issue where they are not removed from the world after they suffer enough damage to destruct them.  This causes splash damage, such as something doing damage using the RadiusActors [[Legacy:Iterator|iterator]] to call TakeDamage() in all nearby actors, to cause the mover to replay it's destruction animation, even though it has already been destructed.  There are two easy ways to fix this in a subclass: From TakeDamage() either call Destroy() when the mover has taken fatal damage, or have TakeDamage() not call the super if the DamageCapacity &lt;= 0.
* Sometimes on a multiplayer game, the zombies will go to negative health, and their bodies will explode when you hit them again.  This is apparently due to a rumored engine bug that causes function calls to mysteriously stop executing when they call something that inherits but doesn't define a particular function.  In this case, it's &quot;PreventDamage()&quot; in the gametypes.  So, I recommend if you do any gametyping, you add a PreventDamage() function, and just point it to the super.  It may just help.

==Interfaces in LotD==

As mentioned above, LotD seems to have support for Interface classes.  These appear to act somewhat like their similarly named Java counterparts, and are especially useful for implementing several different behaviours, such as an add-on class that is Smashable, Burnable, and Movable.

The following interfaces are defined in LotD:

; HudDrawable : HudDrawable gives any program that implements a drawToHud(Canvas, float, float) function, the ability to register with a player's HUD (player.myHUD.register(self) according to the comments)and get called for drawing.
; SaveHandler : SaveHandler is only in a few objects, and gives them the ability to have a PreSave() and PostSave() function for when it's time to save.
; VideoNotification : VideoNotification is apparently used in PlayerController to handle when to pause the game when video begins and unpause when video ends
; EventDispatcher
; MessageDispatcher : EventDispatcher and MessageDispatcher are supposedly implemented in the ObjectiveManager code, but there don't seem to be matching interface classes
; Smashable : Smashable is implemented by DOTZDestructableMesh, DOTZDoor, and all subs of WoodenDoor.

==Related Topics==
* [[Legacy:Unreal Engine Versions/2|Unreal Engine Versions/2]]

==Discussion==

[[Category:Legacy Game|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Land Of The Dead/Actor</title>
    <id>1752</id>
    <revision>
      <id>4301</id>
      <timestamp>2007-02-20T10:06:12Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>lots of changes to incorporate my expanded knowledge of things since i wrote it</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Land Of The Dead|Land of the Dead]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]}}

==Constants==
; MAXSTEPHEIGHT = 35.0 : Maximum step height walkable by Pawns

; MINFLOORZ = 0.7 : Minimum Z value for floor normal. Anything that's less, isn't a walkable floor. (0.7 corresponds to about 45 degree angle for floor)

==Properties==
; vector Acceleration : Actor's movement acceleration

; ActorRenderDataPtr ActorRenderData : 

; array&lt;Actor&gt; Attached : Array of actors attached to this actor.

; name AttachmentBone : Name of bone to which actor is attached 

; bool bAlwaysRelevant : When true, this Actor will be Always relevant for network.

; bool bAlwaysTick : Update even when players-only is turned on.

; bool bAlwaysZeroBoneOffset : If true, offset always zero when attached to skeletalmesh.

; bool bAnimByOwner : Animation dictated by owner.

; Actor Base : Actor we're standing on, or attached to with SetBase

; bool bCanBeDamaged : Can take damage. (this doesn't seem to be used much, a lot of actors implement their own Can Damage functions)

; bool bClientAnim : Don't replicate any animations - animation done client-side.

; bool bClientDemoNetFunc : True if we're client-side demo recording and this call originated from the remote.

; bool bClientDemoRecording : True if we are currently recording a client-side demo.

; bool bCompressedPosition : Used by networking code to flag compressed position replication.

; bool bDeleteMe : This is set true for items that have had Destroy() called, but are not completely destroyed yet. 

; bool bDemoOwner : Demo recording driver owns this actor.

; bool bDemoRecording : True we are currently demo recording.

; bool bDestroyInPainVolume : Destroy this actor if it enters a pain volume.

; bool bDisturbFluidSurface : Cause ripples when in contact with FluidSurface.

; bool bEdSnap : Should snap to grid in UnrealEd.

; bool bHurtEntry : This is a hack to keep HurtRadius from being reentrant, Epic probably should've used singular here, but I'm guessing singular didn't exist when they wrote that code.

; bool bIgnoreOutOfWorld : Don't destroy if enters zone zero.

; bool bInterpolating : Performing interpolating.

; bool bJustTeleported : Used by engine physics - not valid for scripts.

; bool bLightChanged : Set by the Editor to determine if this actor's lighting properties have been changed (for Build Changed Lighting) 

; bool bNetDirty : Set true when any replicated variable is set in Unrealscript, mostly used in Replication block conditions

; bool bNetInitial : True for the initial network update.

; bool bNetInitialRotation : Should replicate initial rotation.

; bool bNetNotify : The actor wishes to be notified of replication events. The actor gets the simulated function PostNetReceive() called whenever replication occurs, e.g. in Ammunition whenever AmmoAmount gets changed.

; bool bNetOwner : Player owns this actor. (Used mainly in replication blocks)

; bool bNetRelevant : Actor is currently relevant. Only valid server side, only when replicating variables.

; bool bNetTemporary : Tear-off simulation in network play.

; bool bNoRepMesh : Don't replicate mesh.

; bool bObsolete : Actor is obsolete - warn level designers to remove it.

; bool bOnlyAffectPawns : Optimisation - only test ovelap against pawns. Used for influences etc.

; bool bOnlyDirtyReplication : If true, only replicate actor if &lt;code&gt;bNetDirty&lt;/code&gt; is true - useful if no C++ changed attributes (such as physics)&lt;br /&gt;

; bool bOnlyDrawIfAttached : Don't draw this actor if not attached (useful for net clients where attached actors and their bases' replication may not be synched).

; bool bOnlyOwnerSee : Only owner can see this actor.

; bool bOnlyRelevantToOwner : This actor is only relevant to its owner.

; bool bOrientOnSlope : When landing, orient base on slope of floor.

; bool bOwnerNoSee : Everything but the owner can see this actor.

; bool bPathTemp : Internal/path building.

; bool bPendingDelete : Set when actor is about to be deleted (since endstate and other functions called during deletion process before &lt;code&gt;bDeleteMe&lt;/code&gt; is set).

; bool bRepClientDemo : True if remote client is recording demo.

; bool bReplicateAnimations : Should replicate SimAnim.

; bool bReplicateInstigator : Replicate instigator to client (used by bNetTemporary projectiles).

; bool bReplicateMovement : If true, replicate movement/location related properties.

; model Brush : Brush if &lt;code&gt;DrawType=DT_Brush&lt;/code&gt;.

; bool bScriptInitialized : Set to prevent re-initializing of actors spawned during level startup

; bool bSelected : Selected in UnrealEd.

; bool bShowOctreeNodes : 

; bool bSkipActorPropertyReplication : If true, don't replicate actor class variables for this actor.

; bool bTearOff : If true, this actor is no longer replicated to new clients, and is &quot;torn off&quot; (becomes a &lt;code&gt;ROLE_Authority&lt;/code&gt;) on clients to which it was being replicated.

; bool bTempEditor : 

; bool bTicked : Actor has been updated.

; bool bTimerLoop : Timer loops (else is one-shot).

; bool bTrailerAllowRotation : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and want independent rotation control.

; bool bTrailerPrePivot : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and true, offset from owner by &lt;code&gt;PrePivot&lt;/code&gt;.

; bool bTrailerSameRotation : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and true, have same rotation as owner.

; bool bTravel : Actor is capable of travelling among servers.

; bool bUpdateSimulatedPosition : f true, update velocity/location after initialization for simulated proxies.

; bool bWasSNFiltered : Mainly for debugging - the way this actor was inserted into Octree.

; bool bWorldGeometry : Collision and Physics treats this actor as world geometry.

; Matrix CachedLocalToWorld : 

; vector CachedLocation : 

; Rotator CachedRotation : 

; int CollisionTag : 

; vector ColLocation : Actor's old location one move ago. Only for debugging.

; actor Deleted : Next actor in just-deleted chain.

; Matrix HardRelMatrix : Transform of actor in base's ref frame. Doesn't change after SetBase.

; Pawn Instigator : Pawn responsible for damage caused by this actor.

; Inventory Inventory : Inventory chain.

; int JoinedTag : 

; int KStepTag : 

; float LastRenderTime : Last time this actor was rendered.

; float LatentFloat : Internal latent function use.

; array&lt;int&gt; Leaves : BSP leaves this actor is in.

; LevelInfo Level : Level this actor is on.

; LightRenderDataPtr LightRenderData : 

; MeshInstance MeshInstance : Mesh instance.

; class&lt;LocalMessage&gt; MessageClass : 

; array&lt;timerStruct&gt; MultiTimers : Used internally by the Land of the Dead SetMultiTimer() native function

; float NetPriority : Higher priorities means update it more frequently.

; int NetTag : 

; float NetUpdateFrequency : How many net updates per seconds.

; float NetUpdateTime : Time of last update

; Box OctreeBox : Actor bounding box cached when added to Octree. Internal use only.

; vector OctreeBoxCenter : 

; vector OctreeBoxRadii : 

; array&lt;int&gt; OctreeNodes : Array of nodes of the octree Actor is currently in. Internal use only.

; Actor Owner : Owner actor, usually set in Spawn()

; Actor PendingTouch : Actor touched during move which wants to add an effect after the movement completes.

; PhysicsVolume PhysicsVolume : physics volume this actor is currently in.

; array&lt;ProjectorRenderInfoPtr&gt; Projectors : Projected textures on this actor.

; PointRegion Region : Region this actor is in.

; vector RelativeLocation : Location relative to base/bone (valid if base exists).

; rotator RelativeRotation : Rotation relative to base/bone (valid if base exists)

; ENetRole RemoteRole : Default [[Legacy:Replication|Replication]] role

; int RenderRevision : 

; Material RepSkin : Replicated skin, covers all material slots, as far as I can tell

; ENetRole Role : Net Role used in [[Legacy:Replication|Replication]]

; AnimRep SimAnim : Only replicated if &lt;code&gt;bReplicateAnimations&lt;/code&gt; is true

; EFilterState StaticFilterState : 

; StaticMeshInstance StaticMeshInstance : Contains per-instance static mesh data, like static lighting data.

; array&lt;StaticMeshProjectorRenderInfoPtr&gt; StaticMeshProjectors : 

; array&lt;BatchReference&gt; StaticSectionBatches : 

; float TimerCounter : Counts up until it reaches TimerRate.

; float TimerRate : Timer event, 0=no timer.

; array&lt;Actor&gt; Touching : List of touching actors.

; Level XLevel : Level object.

===Actionable===
; string ActionableMessage : A message to display to a player when near the object

; int iActionablePriority : Priority if near several Actionable objects

; int iActionableRadius : Radius to be Actionable within

===Advanced===
; bool bCanTeleport : This actor can be teleported. This property must be True for Teleporters to notice the actor.

; bool bCollideWhenPlacing : The actor will collide with world geometry when placed.

; bool bDirectional : Whether the editor should display an arrow to show the actor's current rotation. This has no effect in the game.

; bool bEdShouldSnap : Snap to grid in the editor.

; bool bGameRelevant : Mutators will not receive CheckReplacement and AlwaysKeep calls for the actor if this property is True.

; bool bHidden : Specifies, whether the actor is invisible in the game. This property has no effect in the editor.

; bool bHiddenEd : The actor is hidden in the editor. This has no effect in the game.

; bool bHiddenEdGroup : The actor is hidden in the Group Browser. This has no effect in the editor viewports or in the game.

; bool bHighDetail : The actor only shows up in high or super high detail mode.

; bool bLockLocation : Prevent the actor from being moved in the editor.

; bool bMovable : Actor can be moved.

; bool bNoDelete : Specifies, that the actor can't be spawned or destroyed during the game.

; bool bShouldBaseAtStartup : The actor tries to find another actor for its Base at level startup if its Physics property is set to either PHYS_None or PHYS_Rotating.

; bool bStasis : In standalone (i.e. single player, e.g. Instant Action) games this actor should be turned off if it's not in a recently rendered zone. It will only be turned off when its Physics mode is PHYS_None or PHYS_Rotating.

; bool bSuperHighDetail : The actor only shows up in super high detail mode.

; float LifeSpan : Specifies how long the actor will exist. This value is constantly decreased and the actor will be destroyed when it reaches 0. In this case the actor's Expired method is executed. An initial LifeSpan of 0 or explicitely setting the LifeSpan to 0 from UnrealScript disables the actor's &quot;destruction timer&quot;. Setting it to a value greater 0 from UnrealScript enables it and the Actor will be destroyed after that time unless LifeSpan is set to 0 again before it expired.

===BreakNetPlay===
; bool bStatic : Does not move or change over time. Don't let L.D.s change this - screws up net play.

===Collision===
; bool bAutoAlignToTerrain : Auto-align to terrain in the editor.

; bool bBlockActors : Blocks other nonplayer actors.

; bool bBlockKarma : Block actors being simulated with Karma.

; bool bBlockNonZeroExtentTraces : Block non-zero extent actors/traces.

; bool bBlockPlayers : The comment for this says &quot;OBSOLETE - no longer used&quot;, but it seems to be quite required if you want something to block player movement.  Anyone have ideas?

; bool bBlockZeroExtentTraces : Block zero extent actors/traces, such as normal bullet fire, and any regular Trace() calls

; bool bCollideActors : Collides with other actors.

; bool bCollideWorld : Collides with the world.

; bool bPathColliding : This actor should collide (if &lt;code&gt;bWorldGeometry &amp;&amp; bBlockActors&lt;/code&gt; is true) during path building (ignored if &lt;code&gt;bStatic&lt;/code&gt; is true, as actor will always collide during path building).

; bool bProjTarget : [[Legacy:Projectile|Projectile]]s will Explode() when touching an actor with bProjTarget = True

; bool bUseCylinderCollision : Force axis aligned cylinder collision (useful for static mesh pickups, etc.).

; float CollisionHeight : Half-height cyllinder.

; float CollisionRadius : Radius of collision cyllinder.

===Display===
; byte AmbientGlow : Ambient brightness, or 255=pulsing.  

'''EricBlade:''' Pulsing?  Anyone ever see that?

; ConvexVolume AntiPortal : Convex volume used for DT_AntiPortal.

; bool bAcceptsProjectors : Projectors can project onto this actor.

; bool bDisableSorting : Manual override for translucent material sorting.

; bool bShadowCast : Used in the editor to determine if this actor should be considered when drawing shadows

; bool bStaticLighting : Uses raytraced lighting.

; bool bUnlit : Lights don't affect actor, it will be displayed at it's full brightness.

; bool bUseDynamicLights : If true, Dynamic lights will shine on this actor

; bool bUseLightingFromBase : Use Unlit/AmbientGlow from Base.

; float CullDistance : 0=no distance cull, &lt; 0 only drawn at distance &gt; 0 cull at distance.

; float DrawScale : Scaling factor, 1.0=normal size.

; vector DrawScale3D : Scaling vector, &lt;code&gt;(1.0,1.0,1.0)&lt;/code&gt;=normal size. Use negative numbers to mirror the actor along the axis that is negative. NOTE: In most actors, DrawScale3D is NOT replicated, so it's pretty much useless in net play!

; EDrawType DrawType : Internal enum representing what type of thing to display here, Mesh, StaticMesh, etc

; name ForcedVisibilityZoneTag : Makes the visibility code treat the actor as if it was in the zone with the given tag.

; float LODBias : 

; byte MaxLights : Limit to hardware lights active on this primitive.

; mesh Mesh : Mesh if &lt;code&gt;DrawType=DT_Mesh&lt;/code&gt;.

; vector PrePivot : Offset from box center for drawing.

; float ScaleGlow : Similar to AmbientGlow, not quite sure how it differs

; array&lt;Material&gt; Skins : Multiple skin support - not replicated. Overrides the default materials of a mesh or static mesh

; StaticMesh StaticMesh : StaticMesh if &lt;code&gt;DrawType=DT_StaticMesh&lt;/code&gt;

; ERenderStyle Style : Style for rendering sprites, meshes.

; Material Texture : Sprite texture. If &lt;code&gt;DrawType=DT_Sprite&lt;/code&gt;

===Events===
; bool bHasHandlers : If this is set, TriggerEx() will be called to handle events, to deal with LOTD's custom multi-event system

; name Event : The event this actor causes.

; array&lt;EventHandlerMapping&gt; EventBindings : Used to create a list of Events that this actor will respond to, used in conjunction with bHasHandlers

; name Tag : Actor's tag name.

===Force===
; float ForceRadius : Radius that forces are applied to Emitters that have Forces enabled

; float ForceScale : Scale to apply to forces

; EForceType ForceType : Type of force to apply to particles that are force enabled

===Karma===
; [[Legacy:KarmaParamsCollision|KarmaParamsCollision]] KParams : Parameters for Karma Collision/Dynamics.

===LightColor===
; float LightBrightness : Brightness of light this actor is to emit

; byte LightHue : Hue for light this actor is to emit

; byte LightSaturation : Saturation for light this actor is to emit

===Lighting===
; bool bActorShadows : Light casts actor shadows.

; bool bCorona : Light uses Skin[0] as a corona.

; bool bDynamicLight : This light is dynamic.

; bool bLightingVisibility : Calculate lighting visibility for this actor with line checks.

; bool bSpecialLit : Only affects special-lit surfaces.

; byte LightCone : Used with LT_SpotLight effect to determine the size of the spot cone

; ELightEffect LightEffect : 

; byte LightPeriod : Used with some of the dynamic LightEffects

; byte LightPhase : Used with some of the dynamic LightEffects

; float LightRadius : Radius for lights to affect, note this has nothing to do with Unreal units, or any other known direct measurement.

; ELightType LightType : 

===Movement===
; name AttachTag : Attach this actor's movement to the mover with the specified Tag set - note that LOTD suffers from an apparent engine bug that makes this a real bear to get working in netplay.

; bool bBounce : Bounces when hits ground fast.

; bool bFixedRotationDir : Fixed direction of rotation.

; bool bHardAttach : Uses 'hard' attachment code. &lt;code&gt;bBlockActor&lt;/code&gt; and &lt;code&gt;bBlockPlayer&lt;/code&gt; must also be false.&lt;br /&gt;&lt;br /&gt;This actor cannot then move relative to base (setlocation etc.).&lt;br /&gt;

; bool bIgnoreEncroachers : Ignore collisions between movers and this actor.

; bool bRotateToDesired : Rotate to DesiredRotation.

; float Buoyancy : Water buoyancy.

; rotator DesiredRotation : Physics will smoothly rotate actor to this rotation if &lt;code&gt;bRotateToDesired&lt;/code&gt;.

; vector Location : Actor's location; use SetLocation() to set.

; float Mass : Mass of this actor.

; EPhysics Physics : The type of Physics in use for this actor

; rotator Rotation : Actor's rotation

; rotator RotationRate : Change in rotation per second.

; vector Velocity : Actor's velocity

===Object===
; int DebugFlags : 

; name Group : The Group this actor is in within the Editor

; name InitialState : Initial code state to start in

===Sound===
; sound AmbientSound : Ambient sound effect.

; bool bFullVolume : Whether to apply ambient attenuation.

; ESoundOcclusion SoundOcclusion : Sound occlusion approach.

; byte SoundPitch : Sound pitch shift, 64.0=none.

; float SoundRadius : Radius of ambient sound. (It will be audible out to SoundRadius * 100 UU from this actor)

; byte SoundVolume : Volume of ambient sound.

; float TransientSoundRadius : Default sound radius for regular sounds (can be overridden in playsound).

; float TransientSoundVolume : Default sound volume for regular sounds (can be overridden in playsound).

==Enums==

===EDetailMode===

; DM_Low : Low detail mode
; DM_High : High detail mode
; DM_SuperHigh : Super High detail mode

===EDoubleClickDir===

Double click move direction.&lt;br /&gt;&lt;br /&gt;Used to remember the dodging state of a player. This will be reset to DCLICK_None when the player lands.&lt;br /&gt;These are not used in LOTD.

&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;DCLICK_None&lt;/dt&gt;&lt;dd&gt;No dodging move started.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DCLICK_Active&lt;/dt&gt;&lt;dd&gt;In dodging move.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DCLICK_Done&lt;/dt&gt;&lt;dd&gt;Dodging move done.&lt;/dd&gt;

; DCLICK_None :
; DCLICK_Left :
; DCLICK_Right :
; DCLICK_Forward :
; DCLICK_Back :
; DCLICK_Active :
; DCLICK_Done :

===EDrawType===

The DrawType enumneration sets how the actor displays. Some of these options work with another property to set what is displayed.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;DT_None&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;The actor isn't displayed at all. &lt;code&gt;bHidden&lt;/code&gt; instead in most cases because it will allow the actor to still show up in UnrealEd.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_Sprite&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Display a sprite with the material set in the Texture property.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_Mesh&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Display the mesh set in the Mesh property.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_Brush&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Only for Brush classes.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_RopeSprite&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_VerticalSprite&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_Terraform&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_SpriteAnimOnce&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Like DT_Sprite, but plays an animated texture's animation at a speed that plays the animation exactly once during the LifeSpan of the actor. &lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_StaticMesh&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Display the static mesh set in the StaticMesh property.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_DrawType&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_Particle&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Used by particle effect actors (Emitter, xEmitter, xWeatherEffect) and xProcMeshes.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_AntiPortal&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Used for Antiportals.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_FluidSurface&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Used by FluidSurfaceInfos. See Fluid Surfaces.&lt;/dd&gt;

; DT_None :
; DT_Sprite :
; DT_Mesh :
; DT_Brush :
; DT_RopeSprite :
; DT_VerticalSprite :
; DT_Terraform :
; DT_SpriteAnimOnce :
; DT_StaticMesh :
; DT_DrawType :
; DT_Particle :
; DT_AntiPortal :
; DT_FluidSurface :

===EFilterState===

; FS_Maybe :
; FS_Yes :
; FS_No :

===EForceType===

; FT_None : Actor does not apply forces
; FT_DragAlong : Actor drags particles with it, if the particle emitter is set to use Forces

===eKillZType===

; KILLZ_None : Actor killZ will be killed with no damage type

; KILLZ_Lava : Actor killZ will be killed with Lava damage type

; KILLZ_Suicide : Actor KillZ will be killed with Suicide damage type

===ELightEffect===

Spatial light effect to use.

; LE_None :
; LE_TorchWaver :
; LE_FireWaver :
; LE_WateryShimmer :
; LE_Searchlight :
; LE_SlowWave :
; LE_FastWave :
; LE_CloudCast :
; LE_StaticSpot :
; LE_Shock :
; LE_Disco :
; LE_Warp :
; LE_Spotlight :
; LE_NonIncidence :
; LE_Shell :
; LE_OmniBumpMap :
; LE_Interference :
; LE_Cylinder :
; LE_Rotor :
; LE_Sunlight :
; LE_QuadraticNonIncidence :

===ELightType===

Light modulation.

; LT_None :
; LT_Steady :
; LT_Pulse :
; LT_Blink :
; LT_Flicker :
; LT_Strobe :
; LT_BackdropLight :
; LT_SubtlePulse :
; LT_TexturePaletteOnce :
; LT_TexturePaletteLoop :
; LT_FadeOut :

===EMusicTransition===

Music transitions.

; MTRAN_None :
; MTRAN_Instant :
; MTRAN_Segue :
; MTRAN_Fade :
; MTRAN_FastFade :
; MTRAN_SlowFade :

===ENetRole===

Net variables.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;ROLE_None&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;This means that none of the actor's attributes will not be replicated at all. Examples for this kind of actors are the GameInfo, Mutators and GameRules as well as some explosion effects and decals in UT. Note that Actor's with this role can still be instantiated on network game clients if spawned from the right function. For example if an Actor with &lt;code&gt;ROLE_None&lt;/code&gt; is instantiated from a &lt;code&gt;simulated event PostBeginPlay()&lt;/code&gt; function it will be created on both the server and the client as this function is invoked on both. However the server-side Actor and the client-side Actor are two completely independant entities. This means that destroying the actor on the server will not destroy the actor on the client (and vice-versa).&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_DumbProxy&lt;/dt&gt;&lt;dd&gt;The actor is replicated, but can't execute any functions on the remote side. It will update when variables are replicated to it but will not attempt to interpolate.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_SimulatedProxy&lt;/dt&gt;&lt;dd&gt;The actor is replicated and may execute simulated functions and simulated state code on the remote side. Often this kind of actor simulates its behavior based on initially replicated properties without (much) further &quot;help&quot; from the server.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_AutonomousProxy&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;Autonomous proxies come with some more magic built-in. They are basically simulated proxies, but may execute simulated and non-simulated functions on the client owning/controlling this actor (only on that client!).&lt;br /&gt;In UT only PlayerPawns are autonomous proxies, in UT2003 only PlayerControllers are. Every other client sees them as a regular simulated proxy. Player-controlled actors, such as the guided redeemer missile (GuidedWarshell in UT or RedeemerWarhead in UT2003) are autonomous proxies on the controlling player's client, too.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_Authority&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;All functions can be executed. This role is only allowed on the machine the actor was spawned on. All actors on the server or in standalone games have &lt;code&gt;Role== ROLE_Authority&lt;/code&gt;. Never manually set the &lt;code&gt;RemoteRole&lt;/code&gt; on the authorative version of an actor or the &lt;code&gt;Role&lt;/code&gt; on a replicated version of the actor to this value.&lt;br /&gt;&lt;/dd&gt;

; ROLE_None :
; ROLE_DumbProxy :
; ROLE_SimulatedProxy :
; ROLE_AutonomousProxy :
; ROLE_Authority :

===EPhysics===

Actor's PhysicsType is set in the Physics property. Use the &lt;code&gt;SetPhysics() method to change.&lt;/code&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;PHYS_CinMotion&lt;/dt&gt;&lt;dd&gt;(new in UT2003)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Falling&lt;/dt&gt;&lt;dd&gt;Automatically applies the gravity of the current zone.  Pawn-set acceleration in the Z direction is ignored.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Flying&lt;/dt&gt;&lt;dd&gt;The Pawn or Actor can move independantly from gravity. Velocity on the Z axis is ignored.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Hovering&lt;/dt&gt;&lt;dd&gt;This is is a fun Physics type. When you an actors physics to &lt;code&gt;PHYS_Hovering&lt;/code&gt;, it, er, hovers a few UU off the ground. If you do this to an xPawn, for example, it will act kind of like a hovercraft. Friction is reduced (so you slide around, and slide down ramps), and if you go at speed up an incline you can do some massive jumps.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Interpolating&lt;/dt&gt;&lt;dd&gt;Used in conjunction with &lt;code&gt;bInterpolating&lt;/code&gt; in Actor.  Seems to also use the &lt;code&gt;PhysRate&lt;/code&gt; and &lt;code&gt;PhysAlpha&lt;/code&gt; parameters. Seems to be a leftover from the pre-Matinee days.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Karma&lt;/dt&gt;&lt;dd&gt;Signals an Actor is to be effected by the Karma engine.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_KarmaRagDoll&lt;/dt&gt;&lt;dd&gt;This is used for dead pawns.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Ladder&lt;/dt&gt;&lt;dd&gt;Applies to an Actor when they are climbing a ladder. &lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_MovingBrush&lt;/dt&gt;&lt;dd&gt;Used for Movers&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_None&lt;/dt&gt;&lt;dd&gt;No native physics code is applied.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Projectile&lt;/dt&gt;&lt;dd&gt;Uses velocities on all 3 axes but DOES NOT use the current Zone's ZoneGravity and ZoneFluidFriction members to adjust velocity. This means that actors with a velocity are not affected by gravity or friction. Actors with this physics setting do not have any freedom of movement.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Rolling&lt;/dt&gt;&lt;dd&gt;(removed in UT2003)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_RootMotion&lt;/dt&gt;&lt;dd&gt;(new in UT2003)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Rotating&lt;/dt&gt;&lt;dd&gt;Only rotation changes.  Location doesn't change.  If &lt;code&gt;bRotateToDesired&lt;/code&gt; is false, then the Actor rotates according to &lt;code&gt;RotationRate&lt;/code&gt;.  If &lt;code&gt;bRotateToDesired&lt;/code&gt; is true, then the Actor rotates to the rotation specified by &lt;code&gt;DesiredRotation&lt;/code&gt; at the speed specified by &lt;code&gt;RotationRate&lt;/code&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Spider&lt;/dt&gt;&lt;dd&gt;Similar to &lt;code&gt;PHYS_Walking&lt;/code&gt; except it applies to an Actor against any surface, not just a &quot;ground&quot; surface. An Actor in &lt;code&gt;PHYS_Spider&lt;/code&gt; will move against a horizontal or vertical surface just like in &lt;code&gt;PHYS_Walking&lt;/code&gt;. When the end of the surface is reached the Pawn will be set to &lt;code&gt;PHYS_Falling&lt;/code&gt;. &lt;code&gt;PHYS_Spider&lt;/code&gt; only works on one plane, it will not allow a Pawn to move across perpendicular walls.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Swimming&lt;/dt&gt;&lt;dd&gt;Similar to &lt;code&gt;PHYS_Flying&lt;/code&gt;, but also take the zone's FluidFriction into account.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Trailer&lt;/dt&gt;&lt;dd&gt;Used to set an Actor to follow its Owner. An Actor set this way has no physics of its own, (*including collision) and simply follow their Owner around. NOTE: There are two settings in the Actor class which can specify the actions of a &lt;code&gt;PHYS_Trailer&lt;/code&gt;. First is &lt;code&gt;bTrailerPrePivot&lt;/code&gt;, which, when set to True, causes the Actor in &lt;code&gt;PHYS_Trailer&lt;/code&gt; to be positioned away from its Owner by the vector value set in &lt;code&gt;PrePivot&lt;/code&gt;. If not set or left at 0, the Actor in &lt;code&gt;PHYS_Trailer&lt;/code&gt; will have the same location as its Owner. Secondly, there is &lt;code&gt;bTrailerSameRotation&lt;/code&gt;, which causes the Actor in &lt;code&gt;PHYS_Trailer&lt;/code&gt; to have the same Rotation as its Owner no matter where it is.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Walking&lt;/dt&gt;&lt;dd&gt;Native physics code for Pawn class only. Applies all the things that make a pawn move around on the ground. Must have a Base set, without a Base to walk on, this turns to &lt;code&gt;PHYS_Falling&lt;/code&gt;.&lt;/dd&gt;

; PHYS_None :
; PHYS_Walking :
; PHYS_Falling :
; PHYS_Swimming :
; PHYS_Flying :
; PHYS_Rotating :
; PHYS_Projectile :
; PHYS_Interpolating :
; PHYS_MovingBrush :
; PHYS_Spider :
; PHYS_Trailer :
; PHYS_Ladder :
; PHYS_RootMotion :
; PHYS_Karma :
; PHYS_KarmaRagDoll :
; PHYS_Pawn :

===ERenderStyle===

Style for rendering sprites, meshes.

; STY_None : 
; STY_Normal :
; STY_Masked :
; STY_Translucent :
; STY_Modulated :
; STY_Alpha :
; STY_Additive :
; STY_Subtractive :
; STY_Particle :
; STY_AlphaZ :

===ESoundOcclusion===

Sound occlusion

; OCCLUSION_Default :
; OCCLUSION_None : Objects between this Actor and Player do not affect sound
; OCCLUSION_BSP : BSP between this Actor and Player affects sounds
; OCCLUSION_StaticMeshes : StaticMeshes between Actor and Player affects sounds

===ESoundSlot===

; SLOT_None : Generic sound slot, any sound played in this slot should play, even if sound is already playing. All other slots are one sound at a time.
; SLOT_Misc : Misc. sounds
; SLOT_Pain : Pain sounds
; SLOT_Interact : Interaction with the world sounds
; SLOT_Ambient : Ambient Noise
; SLOT_Talk : Talking
; SLOT_Interface : User Interface sounds

===ETravelType===

Travelling from server to server.

; TRAVEL_Absolute : Travel to absolute URL
; TRAVEL_Partial : Partial travel (carry name, reset server) ?
; TRAVEL_Relative : Relative URL

==Structures==

===ActorRenderDataPtr===

; int Ptr : 

===AnimRep===

Animation replication (can be used to replicate channel 0 anims for dumb proxies)

; byte AnimFrame : 

; byte AnimRate : note that with compression, max replicated animrate is 4.0

; name AnimSequence : 

; bool bAnimLoop : 

; byte TweenRate : note that with compression, max replicated tweentime is 4 seconds

===BatchReference===

; int BatchIndex : 

; int ElementIndex : 

===EventHandlerMapping===

====Actor====
; Name EventName : 

; Name HandledBy : 

===KRBVec===

; float X : 

; float Y : 

; float Z : 

===KRigidBodyState===

; KRBVec AngVel : 

; KRBVec LinVel : 

; KRBVec Position : 

; Quat Quaternion : 

===LightRenderDataPtr===

; int Ptr : 

===PointRegion===

Identifies a unique convex volume in the world.

; int iLeaf : Bsp leaf.

; zoneinfo Zone : Zone

; byte ZoneNumber : Zone Number.

===ProjectorRenderInfoPtr===

Hack to to fool C++ header generation...

; int Ptr : 

===StaticMeshProjectorRenderInfoPtr===

; int Ptr : 

===timerStruct===

; byte bLooping : 
; int slotID : 
; float TimerCounter : 
; float TimerRate : 

==Functions==
;  AllActors(class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ): Avoid using &lt;code&gt;AllActors()&lt;/code&gt; too often as it iterates through the whole actor list and is therefore slow.

;  AnimBlendParams(int Stage, optional float BlendAlpha, optional float InTime, optional float OutTime, optional name BoneName, optional bool bGlobalPose ): 

;  AnimBlendToAlpha(int Stage, float TargetAlpha, float TimeInterval ): 

; bool AnimIsInGroup(int Channel, name GroupName ): 

; bool AttachToBone(actor Attachment, name BoneName ): Attach the specified Attachment actor to the specified BoneName bone of this Actor

;  AutonomousPhysics(float DeltaSeconds ): 

;  BasedActors(class&lt;actor&gt; BaseClass, out actor Actor ): Returns all actors based on the current actor (slow, like AllActors)

;  BecomeViewTarget( ): Called by PlayerController when this actor becomes its ViewTarget.

;  BoneRefresh( ): You want to call this when bringing a Skeletal actor into the world to avoid it going into it's refpose for no obvious reason.

; bool CanSplash( ): 

;  ChildActors(class&lt;actor&gt; BaseClass, out actor Actor ): ChildActors() returns all actors owned by this actor.  Slow like AllActors()

;  Clock(out float time ): This is called at the beginning of a section of code to be timed. The variable time does not need to be initialized. Call Unclock() with the same variable you passed to Clock() to get the timer results

;  CollidingActors(class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ): CollidingActors() returns colliding (&lt;code&gt;bCollideActors==true&lt;/code&gt;) actors within a certain radius.

; string ConsoleCommand(string Command ): Execute a console command in the context of the current level and game engine.

;  CopyMaterialsToSkins( ): Native function unique to LOTD, copies the default Materials into the Skins[] override array

;  DebugClock( ): 

;  DebugUnclock( ): 

; bool Destroy( ): Destroy this actor. Returns true if destroyed, false if indestructable.&lt;br /&gt;

; bool DetachFromBone(actor Attachment ):  Remove the specified Actor, from whatever it is attached to.  It is presumed that it would be attached to THIS actor, but that is apparently not a requirement.

;  DisplayDebug(Canvas Canvas, out float YL, out float YPos ): List important actor variable on canvas.  HUD will call DisplayDebug() on the current ViewTarget when the ShowDebug exec is used.

;  DoActionableAction(Controller InstigatingController ): Called whenever a player presses the Action button within this actor's ActionableRadius

;  DrawDebugLine(vector LineStart, vector LineEnd, byte R, byte G, byte B ): SLOW! Use for debugging only!

;  DynamicActors(class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ): DynamicActors() only iterates through the non-static actors on the list (still relatively slow, but much better than AllActors).  This should be used in most cases and replaces AllActors in many situations

; bool EffectIsRelevant(vector SpawnLocation, bool bForceDedicated ): This should be called by effects to see if they should play.  The original game doesn't use it much at all, but you probably should.

;  EnableChannelNotify(int Channel, int Switch ): 

;  Error(coerce string S ): Handle an error and kill this one actor.

; bool FastTrace(vector          TraceEnd,     optional vector TraceStart ): Similar to trace, this one returns true if it hits the world geometry, false if it is not long enough. It will pass right through anything that is not set as world geometry.

;  FilterStateDirty( ): 

;  FinishAnim(optional int Channel ): Latent function that will return when all Animation (or within the specified Channel) is completed

;  FinishInterpolation( ): 

; bool ForceFeedbackSupported(optional bool Enable ): Without parameters this will return the state of Force Feedback support, with a True parameter, it will enable Force Feedback

;  FreezeAnimAt(float Time, optional int Channel ): Hold an animation on the specified channel at the specified time frame.

; string GetActionableMessage(Controller InstigatingController ): Called in any object when a Player is within it's ActionableRadius to determine what to print on the Player's screen to notify them that they can use the object for something

; int GetActionablePriority(Controller InstigatingController ): Called in any object when a Player is within it's ActionableRadius to determine what Actor's GetActionableMessage and DoActionableAction functions should be called by the player, if there are multiple Actionable items involved.  Set to -1 to make this Actor non actionable

;  GetAnimParams(int Channel, out name OutSeqName, out float OutAnimFrame, out float OutAnimRate ): Returns information about the currently playing Animation

; coords GetBoneCoords(name BoneName ): Returns the coords of the BoneName bone.

; rotator GetBoneRotation(name BoneName, optional int Space ): Returns the rotation of the BoneName bone

; bool GetCacheEntry(int Num, out string GUID, out string Filename ): Give this a number, and it will return you the GUID and Filename of that entry in the Cache.  It may be possible to build some kind of Cache manager thing, but I have no idea why.

; vector GetCollisionExtent( ): This returns a collision Extent that could be used with Trace, that will give you the size of this actor as the extent, based on CollisionRadius and CollisionHeight

; String GetDebugName( ): 

; String GetHumanReadableName( ): Returns the human readable string representation of an object.

; String GetItemName(string FullName ): 

; string GetLocalString(optional int Switch,     optional PlayerReplicationInfo RelatedPRI_1,     optional PlayerReplicationInfo RelatedPRI_2 ): Get localized message string associated with this actor.

; string GetMapName(string NameEnding, string MapName, int Dir ): 

; string GetMeshName( ): 

; string GetNextInt(string ClassName, int Num ): 

;  GetNextIntDesc(string ClassName, int Num, out string Entry, out string Description ): Read from the INT files available

;  GetNextSkin(string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ): 

; int GetNotifyChannel( ): 

; plane GetRenderBoundingSphere( ): 

; vector GetRootLocation( ): 

; vector GetRootLocationDelta( ): 

; rotator GetRootRotation( ): 

; rotator GetRootRotationDelta( ): 

; float GetSoundDuration(sound Sound ): Returns the duration in seconds of a sound

; string GetURLMap( ): 

; bool HasAnim(name Sequence ): Returns true if this actor has an animation with the named Sequence 

;  HurtRadius(float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation ): Hurt locally authoritative actors within the radius.

; bool IsAnimating(optional int Channel ): returns true if the specified channel is playing an animation

; bool IsInPain( ): Return True if this actor is inside a Pain volume

; bool IsInVolume(Volume aVolume ): Returns true if the actor is in the specified volume

; bool IsTweening(int Channel ): Presumably returns True if the Actor is Tweening on the particular animation channel

;  KAddBoneLifter(name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ): Note you MUST turn collision off (&lt;code&gt;KSetBlockKarma&lt;/code&gt;) before using bone lifters.

;  KAddImpulse(vector Impulse, vector Position, optional name BoneName ): A position of (0,0,0) applies impulse at COM (ie no angular component).

;  KDisableCollision(actor Other ): Turn off Karma collision for this actor to the specified other actor

;  KDrawRigidBodyState(KRigidBodyState RBState, bool AltColour ): SLOW! Use for debugging only!

;  KEnableCollision(actor Other ): Turns on Karma collision for this actor to the specified other actor

;  KFreezeRagdoll( ): Halt a Karma Ragdoll

; float KGetActorGravScale( ): Returns the KParams.KGravScale

;  KGetCOMOffset(out vector offset ): Get the offset of actor's Center of Mass

;  KGetCOMPosition(out vector pos ): Get actual position of actors Center of Mass in world space

;  KGetDampingProps(out float lindamp, out float angdamp ): Return the Linear damping and Angular damping
; float KGetFriction( ): Return the Karma Friction
; float KGetImpactThreshold( ): Return Karma ImpactThreshold
;  KGetInertiaTensor(out vector it1, out vector it2 ):  Return Karma Inertia Tensor
; float KGetMass( ): Return Karma Mass
; quat KGetRBQuaternion( ): 
; float KGetRestitution( ): Return Karma Restitution (bounciness)
;  KGetRigidBodyState(out KRigidBodyState RBstate ): Return Karma Rigid Body State
; float KGetSkelMass( ): Return Karma SKeletal Mass (where is this set?)
; bool KIsAwake( ): Returns true if we are currently simulating
; bool KIsRagdollAvailable( ): Returns true if there is a ragdoll available (what are these conditions?)
;  KMakeRagdollAvailable( ): Make a Ragdoll available (explain?)
; KRBVec KRBVecFromVector(vector v ): 
; vector KRBVecToVector(KRBVec RBvec ): 
;  KRemoveAllBoneLifters( ): 
;  KRemoveLifterFromBone(name BoneName ): 
;  KSetActorGravScale(float ActorGravScale ): Set Karma Gravity Scale
;  KSetBlockKarma(bool newBlock ): Set to Block karma objects
;  KSetCOMOffset(vector offset ): Set offset of Center of Mass
;  KSetDampingProps(float lindamp, float angdamp ): Set Linear and Angular karma damping
;  KSetFriction(float friction ): Set Karma Friction
;  KSetImpactThreshold(float thresh ): Set Karma ImpactThreshold
;  KSetInertiaTensor(vector it1, vector it2 ): set Karma Inertia Tensor
;  KSetMass(float mass ): Set Karma Mass
;  KSetRestitution(float rest ): Set Karma Restitution (bounciness)
;  KSetSkelVel(vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ): Set Karma SKeletalVelocity
;  KSetStayUpright(bool stayUpright, bool allowRotate ): Set Karma StayUpright properties
;  KSetStayUprightParams(float stiffness, float damping ): 
;  KWake( ): Start Karma simulating

;  LinkMesh(mesh NewMesh, optional bool bKeepAnim ): Link to a new Mesh, optionally keeping the existing Animations or using the new Mesh's animations

;  LinkSkelAnim(MeshAnimation Anim, optional mesh NewMesh ): Link new Animations, optionally replacing the Mesh (LOTD implements multiple Animation packages per Mesh, there are better functions for dealing with this

;  LockRootMotion(int Lock ): 

;  LoopAnim(name Sequence, optional float Rate, optional float TweenTime, optional int Channel ): 

;  MakeNoise(float Loudness ): Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message). (Loudness seems to be 1.0 in most places, is that the max?)

;  MatchStarting( ): Called when gameplay actually starts.

; bool Move(vector Delta ): Move this actor, and everything attached to it, by Delta vector.

; bool MoveCacheEntry(string GUID, optional string NewFilename ): Cache management function

; bool MoveSmooth(vector Delta ): Like Move(), but will attempt to continue moving by sliding along a wall or up a slight incline/stairs, etc

; bool NearSpot(vector Spot ): NearSpot() returns true is spot is within collision cylinder.

;  Notify( ): 

;  OnlyAffectPawns(bool B ): 

;  PlayAnim(name Sequence, optional float Rate, optional float TweenTime, optional int Channel ): 

; bool PlayerCanSeeMe( ): PlayerCanSeeMe returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location.  Note that if you want to use this with an actor that is normally bHidden, you will need to set bHidden=False, and set DrawType=DT_NONE.

;  PlayFeedbackEffect(String EffectName ): Play a Force Feedback effect

; int PlayMusic(string Song, float FadeInTime ): Only used for level music - will be stopped when level changes&lt;br /&gt;

;  PlayOwnedSound(sound               Sound,     optional ESoundSlot Slot,     optional float      Volume,     optional bool       bNoOverride,     optional float      Radius,     optional float      Pitch,     optional bool       Attenuate ): Play a sound effect, but don't propagate to a remote owner (he is playing the sound clientside)

;  PlaySound(sound               Sound,     optional ESoundSlot Slot,     optional float      Volume,     optional bool       bNoOverride,     optional float      Radius,     optional float      Pitch,     optional bool       Attenuate ): Play a sound effect.

;  PlayTeleportEffect(bool bOut, bool bSound ): Called when this actor passes through a Teleporter

;  RadiusActors(class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ): RadiusActors() returns all actors within a give radius.  Slow like AllActors().  Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible (not bHidden) and in the collision hash (&lt;code&gt;bCollideActors&lt;/code&gt; is true)

;  RenderOverlays(Canvas Canvas ): Called by player's hud to request drawing of actor specific overlays onto canvas

;  ReplaceText(out string Text, string Replace, string With ): Replace string Replace with string With, in string Text, returning result in passed string Text

;  Reset( ): Reset actor to initial state - used when restarting level without reloading.

;  SetAnimFrame(float Time, optional int Channel, optional int UnitFlag ): Move to a specific frame of animation, on a specific channel.  If UnitFlag == 0 (default), then Time refers to a percentage of time (0.0 to 1.0). If UnitFlag == 1, then Time refers to a specific Frame number.

;  SetBase(actor NewBase, optional vector NewFloor ): Set the actor's Base (for attached movement). NewFloor is only valid for Pawns, and is used to set the Floor that they would be walking on if they were PHYS_Walking or PHYS_Spidering.

;  SetBoneDirection(name BoneName, rotator BoneTurn, optional vector BoneTrans, optional float Alpha, optional int Space ): 

;  SetBoneLocation(name BoneName, optional vector BoneTrans, optional float Alpha ): 

;  SetBoneRotation(name BoneName, optional rotator BoneTurn, optional int Space, optional float Alpha ): 

;  SetBoneScale(int Slot, optional float BoneScale, optional name BoneName ): Adjust the size of a particular bone.  This is used to implement destructable limbs and the Big Head mutator.

;  SetCollision(optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ): Adjust collision paramters

; bool SetCollisionSize(float NewRadius, float NewHeight ): Adjust actor's collisionradius and height

;  SetDefaultDisplayProperties( ): Reset this actor's Style, bUnlit, and Texture settings to the actor's default.

;  SetDisplayProperties(ERenderStyle NewStyle, Material NewTexture, bool bLighting ): Set the display properties of an actor. 

;  SetDrawScale(float NewScale ): Adjust the DrawScale of the Actor, 1.0 = normal

;  SetDrawScale3D(vector NewScale3D ): Adjust the DrawScale3D, (1.0,1.0,1.0) = normal, use negative numbers to mirror

;  SetDrawType(EDrawType NewDrawType ): Change the actor's DrawType

;  SetGRI(GameReplicationInfo GRI ): 

; bool SetLocation(vector NewLocation ): This function sets the location of the actor it is called on. It will not work on actors with &lt;code&gt;PHYS_Karma&lt;/code&gt; or &lt;code&gt;PHYS_KarmaRagdoll&lt;/code&gt;. If the actor cannot occupy the new location because it is colliding with an actor that can block it, it will be placed at the nearest valid location. Note that because Terrain has no &quot;volume&quot; and is just a bent up sheet, the actor may not be moved in this manner when it penetrates terrain.

;  SetMultiTimer(int slotID, float NewTimerRate, bool bLoop ): Native function apparently specific to LOTD, specifies that this actor's MultiTimer(slotID) function will be called.  Very similar to Timer, but easy to use for multiple things in one actor.

;  SetOwner(actor NewOwner ): Set this Actor's Owner property

;  SetPhysics(EPhysics newPhysics ): Changes this Actor's physics type, takes effect on the NEXT tick.

; bool SetRelativeLocation(vector NewLocation ): Sets the location relative to this actor's base

; bool SetRelativeRotation(rotator NewRotation ): Sets the rotation relative to the actor's base.

; bool SetRotation(rotator NewRotation ): This function sets the rotation of the actor it is called on. It will not work on actors with &lt;code&gt;PHYS_Karma&lt;/code&gt; or &lt;code&gt;PHYS_KarmaRagdoll&lt;/code&gt;.

;  SetStaticMesh(StaticMesh NewStaticMesh ): Set a new StaticMesh to replace this actor's original setting.

;  SetTimer(float NewTimerRate, bool bLoop ): Causes &lt;code&gt;Timer()&lt;/code&gt; events every &lt;code&gt;NewTimerRate&lt;/code&gt; seconds. If &lt;code&gt;bLoop&lt;/code&gt; is true, causes &lt;code&gt;Timer()&lt;/code&gt; events every &lt;code&gt;NewTimerRate&lt;/code&gt; seconds. Otherwise, causes &lt;code&gt;Timer()&lt;/code&gt; to be called once in &lt;code&gt;NewTimerRate&lt;/code&gt; seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer.

; bool ShouldBeHidden( ): Check if class has HideDropDown specifier

;  Sleep(float Seconds ): Waits for the specified amount of time before returning.&lt;br /&gt;

; actor Spawn(class&lt;actor&gt;      SpawnClass,     optional actor    SpawnOwner,     optional name     SpawnTag,     optional vector   SpawnLocation,     optional rotator  SpawnRotation ): Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). &lt;br /&gt;&lt;br /&gt;Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). &lt;br /&gt;

;  StartInterpolation( ): When this function is called, the actor will start moving along an interpolation path beginning at Dest

;  StopAllMusic(float FadeOutTime ): Fade all music out

;  StopAnimating(optional bool ClearAllButBase ): Halt animation playing for this actor

;  StopFeedbackEffect(optional String EffectName ): Pass no parameter or &quot;&quot; to stop all.

;  StopMusic(int SongHandle, float FadeOutTime ): Stop a particular songhandle (returned by PlayMusic)

; vector SuggestFallVelocity(vector Destination, vector Start, float MaxZ, float MaxXYSpeed ): 

; bool TouchingActor(Actor A ): Returns true if Actor A is touching this Actor

;  TouchingActors(class&lt;actor&gt; BaseClass, out actor Actor ): Returns all actors touching the current actor (fast).

; Actor Trace(out vector      HitLocation,     out vector      HitNormal,     vector          TraceEnd,     optional vector TraceStart,     optional bool   bTraceActors,     optional vector Extent,     optional out material Material ): This traces a path to find what it collides with first. The line will be traced starting at &lt;code&gt;TraceStart&lt;/code&gt; and ending at &lt;code&gt;TraceEnd&lt;/code&gt;.&lt;br /&gt;If &lt;code&gt;bTraceActors&lt;/code&gt; is true, actors will be considered for the tracing, otherwise only pieces of the world (terrain, staticmeshactors, BSP) will be considered for collision.&lt;br /&gt;When the trace hits something, &lt;code&gt;HitLocation&lt;/code&gt; and &lt;code&gt;HitNormal&lt;/code&gt; will be set to contain the location and normal of the impact. If specified, the material of the surface hit can also be returned. If an &lt;code&gt;Extent&lt;/code&gt; is specified, you can have the trace have &quot;width.&quot; It will have a box of the size specified as a vector (corner to corner) as the &quot;thickness&quot; of the trace. &lt;br /&gt;&lt;br /&gt;Note that traces are not very fast, so should be avoided or kept to a minimum where possible. &lt;br /&gt;

;  TraceActors(class&lt;actor&gt; BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ): Return all actors along a traced line.  Reasonably fast (like any trace)

;  TweenAnim(name Sequence, float Time, optional int Channel ): 

;  UnClock(out float time ): This is called at the end of a section of code to be timed passing in the same time variable supplied to Clock.

;  UntriggerEvent(Name EventName, Actor Other, Pawn EventInstigator ): 

;  UpdatePrecacheMaterials( ): Used to add new materials to the Precache specified in Level. Not quite sure why we'd want to do this after the game starts, as that's when the Precaching happens.

;  UpdatePrecacheStaticMeshes( ):  See UpdatePrecacheMaterials

;  VisibleActors(class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc ): Returns all visible (not &lt;code&gt;bHidden&lt;/code&gt;) actors within a radius for which a trace from &lt;code&gt;Loc&lt;/code&gt; (which defaults to caller's &lt;code&gt;Location&lt;/code&gt;) to that actor's &lt;code&gt;Location&lt;/code&gt; does not hit the world.&lt;br /&gt;

;  VisibleCollidingActors(class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden ): Returns all colliding (&lt;code&gt;bCollideActors==true&lt;/code&gt;) actors within a certain radius for which a trace from &lt;code&gt;Loc&lt;/code&gt; (which defaults to caller's Location) to that actor's Location does not hit the world.&lt;br /&gt;

;  WaitForNotification(optional float TimeoutInSeconds ): Latent function returns after specified time, or when a Notify() is called

==Events==
;  AnimEnd(int Channel ): Notification that the current animation has ended. Allows an object to wait for animation completion before proceeding with other activities.

;  Attach(Actor Other ): Called when this actor is attached to actor Other

;  BaseChange( ): Called when this actor's Base is changed

;  BeginEvent( ): 

;  BeginPlay( ): Called at the beginning of play

;  BroadcastLocalizedMessage(class&lt;LocalMessage&gt; MessageClass, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ): Broadcast a localized message to all players.&lt;br /&gt;&lt;br /&gt;Most message deal with 0 to 2 related PRIs.&lt;br /&gt;

;  Bump(Actor Other ): Called when actor Other bumps this actor

;  DemoPlaySound(sound               Sound,     optional ESoundSlot Slot,     optional float      Volume,     optional bool       bNoOverride,     optional float      Radius,     optional float      Pitch,     optional bool       Attenuate ): 

;  Destroyed( ): Called after this actor's Destroy() function is called

;  Detach(Actor Other ): Called when this actor is detached from Other

;  EncroachedBy(actor Other ): Called when Other is encroaching our collision zone

; bool EncroachingOn(actor Other ): Called when we are encoraching on Other's collision zone

;  EndedRotation( ): Called when rotation completes

;  EndEvent( ): 

;  Falling( ): Called when we are falling. Ahhh!!!!!

;  FellOutOfWorld(eKillZType KillType ): Sets physics to none and destroys the actor.

;  FinishedInterpolation( ): The implementation in actor only sets &lt;code&gt;bInterpolating&lt;/code&gt; to false.

;  GainedChild(Actor Other ): Called when a child actor is spawned

;  HitWall(vector HitNormal, actor HitWall ): Called when this actor hits a wall

;  KApplyForce(out vector Force, out vector Torque ): Event called just before sim to allow user to apply Karma forces

;  KilledBy(pawn EventInstigator ): Called when this Actor is killed (only appears to be useful for pawns..)

;  KImpact(actor other, vector pos, vector impactVel, vector impactNorm ): Event called when Karmic actor hits with impact velocity over &lt;code&gt;KImpactThreshold&lt;/code&gt;.

;  KSkelConvulse( ): Event called when a ragdoll convulses (see [[Legacy:KarmaParamsSkel|KarmaParamsSkel]])

; bool KUpdateState(out KRigidBodyState newState ): This is called from inside C++ physKarma at the appropriate time to update state of Karma rigid body.&lt;br /&gt;

;  KVelDropBelow( ): Event called when karma actor's velocity drops below &lt;code&gt;KVelDropBelowThreshold&lt;/code&gt;

;  Landed(vector HitNormal ): Called when we hit the ground

;  LostChild(Actor Other ): Called when another actor with this actor as its owner is destroyed.

;  MultiTimer(int slotID ): Called as a result of the SetMultiTimer() function

;  PhysicsVolumeChange(PhysicsVolume NewVolume ): Called when this actor enters a new Physics Volume

;  PostBeginPlay( ): Called immediately after gameplay begins.

;  PostLinearLoad( ): 

;  PostLoad( ): Called when a saved game is loaded, to allow actors to fix up anything they might need.

;  PostNetBeginPlay( ): Called after PostBeginPlay.  On a net client, PostNetBeginPlay() is called after replicated variables have been initialized to their replicated values

;  PostNetReceive( ): If &lt;code&gt;bNetNotify&lt;/code&gt; is True, this event is called when the actor receives an update to any variable through replication.

;  PostTeleport(Teleporter OutTeleporter ): function called after this Actor has passed through a Teleporter

;  PostTouch(Actor Other ): Called for PendingTouch actor after physics completes

;  PreBeginPlay( ): Called immediately before gameplay begins.

; bool PreTeleport(Teleporter InTeleporter ): function called before this Actor is going to pass through a Teleporter

;  RenderTexture(ScriptedTexture Tex ): 

;  SetInitialState( ): Called after PostBeginPlay.

; Actor SpecialHandling(Pawn Other ): 

;  TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class&lt;DamageType&gt; DamageType ): Called by anything that wishes to cause this actor Damage

;  Tick(float DeltaTime ): 

;  Timer( ): Called from setting the SetTimer() function

;  TornOff( ): Networking - called on client when actor is torn off (&lt;code&gt;bTearOff==true&lt;/code&gt;)

;  Touch(Actor Other ): Called when we are touching Actor Other

;  TravelPostAccept( ): Called when carried into a new level, after AcceptInventory.

;  TravelPreAccept( ): Called when carried onto a new level, before AcceptInventory.

;  Trigger(Actor Other, Pawn EventInstigator ): Called when this Actor's &quot;Tag&quot; event is triggered

;  TriggerEvent(Name eventName, Actor sender, Pawn instigator ): Call this to trigger an event

;  TriggerEx(Actor sender, Pawn instigator, Name handler ): Called when an Event that this actor handles is called, if bHasHandlers is set

;  UnTouch(Actor Other ): Called when this actor is no logner touching Other 

;  UnTrigger(Actor Other, Pawn EventInstigator ): 

;  UsedBy(Pawn user ): Called if this Actor was touching a Pawn who pressed Use (not used in LOTD in favor of the Actionable system)

;  ZoneChange(ZoneInfo NewZone ): Called when this actor changes zones</text>
    </revision>
    <revision>
      <id>4302</id>
      <timestamp>2006-06-23T00:35:06Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Land Of The Dead|Land of the Dead]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]]}}

==Constants==
; MAXSTEPHEIGHT = 35.0 : Maximum step height walkable by Pawns

; MINFLOORZ = 0.7 : Minimum Z value for floor normal. Anything that's less, isn't a walkable floor. (0.7 corresponds to about 45 degree angle for floor)

==Properties==
; vector Acceleration : Actor's movement acceleration

; ActorRenderDataPtr ActorRenderData : 

; array&lt;Actor&gt; Attached : Array of actors attached to this actor.

; name AttachmentBone : Name of bone to which actor is attached (if attached to center of base.

; bool bAlwaysRelevant : When true, this Actor will Always relevant for network.

; bool bAlwaysTick : Update even when players-only is turned on.

; bool bAlwaysZeroBoneOffset : If true, offset always zero when attached to skeletalmesh.

; bool bAnimByOwner : Animation dictated by owner.

; Actor Base : Actor we're standing on.

; bool bCanBeDamaged : Can take damage. (this doesn't seem to be used much, a lot of actors implement their own Can Damage functions)

; bool bClientAnim : Don't replicate any animations - animation done client-side.

; bool bClientDemoNetFunc : True if we're client-side demo recording and this call originated from the remote.

; bool bClientDemoRecording : True we are currently recording a client-side demo.

; bool bCompressedPosition : Used by networking code to flag compressed position replication.

; bool bDeleteMe : About to be deleted.

; bool bDemoOwner : Demo recording driver owns this actor.

; bool bDemoRecording : True we are currently demo recording.

; bool bDestroyInPainVolume : Destroy this actor if it enters a pain volume.

; bool bDisturbFluidSurface : Cause ripples when in contact with FluidSurface.

; bool bEdSnap : Should snap to grid in UnrealEd.

; bool bHurtEntry : Keep HurtRadius from being reentrant,

; bool bIgnoreOutOfWorld : Don't destroy if enters zone zero.

; bool bInterpolating : Performing interpolating.

; bool bJustTeleported : Used by engine physics - not valid for scripts.

; bool bLightChanged : Recalculate this light's lighting now.

; bool bNetDirty : Set when any attribute is assigned a value in unrealscript,

; bool bNetInitial : True for the initial network update.

; bool bNetInitialRotation : Should replicate initial rotation.

; bool bNetNotify : The actor wishes to be notified of replication events. The actor gets the simulated function PostNetReceive() called whenever replication occurs, e.g. in Ammunition whenever AmmoAmount gets changed.

; bool bNetOwner : Player owns this actor. (Used mainly in replication blocks)

; bool bNetRelevant : Actor is currently relevant. Only valid server side, only when replicating variables.

; bool bNetTemporary : Tear-off simulation in network play.

; bool bNoRepMesh : Don't replicate mesh.

; bool bObsolete : Actor is obsolete - warn level designers to remove it.

; bool bOnlyAffectPawns : Optimisation - only test ovelap against pawns. Used for influences etc.

; bool bOnlyDirtyReplication : If true, only replicate actor if &lt;code&gt;bNetDirty&lt;/code&gt; is true - useful if no C++ changed attributes (such as physics)&lt;br /&gt;

; bool bOnlyDrawIfAttached : Don't draw this actor if not attached (useful for net clients where attached actors and their bases' replication may not be synched).

; bool bOnlyOwnerSee : Only owner can see this actor.

; bool bOnlyRelevantToOwner : This actor is only relevant to its owner.

; bool bOrientOnSlope : When landing, orient base on slope of floor.

; bool bOwnerNoSee : Everything but the owner can see this actor.

; bool bPathTemp : Internal/path building.

; bool bPendingDelete : Set when actor is about to be deleted (since endstate and other functions called during deletion process before &lt;code&gt;bDeleteMe&lt;/code&gt; is set).

; bool bRepClientDemo : True if remote client is recording demo.

; bool bReplicateAnimations : Should replicate SimAnim.

; bool bReplicateInstigator : Replicate instigator to client (used by bNetTemporary projectiles).

; bool bReplicateMovement : If true, replicate movement/location related properties.

; model Brush : Brush if &lt;code&gt;DrawType=DT_Brush&lt;/code&gt;.

; bool bScriptInitialized : Set to prevent re-initializing of actors spawned during level startup

; bool bSelected : Selected in UnrealEd.

; bool bShowOctreeNodes : 

; bool bSkipActorPropertyReplication : If true, don't replicate actor class variables for this actor.

; bool bTearOff : If true, this actor is no longer replicated to new clients, and is &quot;torn off&quot; (becomes a &lt;code&gt;ROLE_Authority&lt;/code&gt;) on clients to which it was being replicated.

; bool bTempEditor : 

; bool bTicked : Actor has been updated.

; bool bTimerLoop : Timer loops (else is one-shot).

; bool bTrailerAllowRotation : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and want independent rotation control.

; bool bTrailerPrePivot : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and true, offset from owner by &lt;code&gt;PrePivot&lt;/code&gt;.

; bool bTrailerSameRotation : If &lt;code&gt;PHYS_Trailer&lt;/code&gt; and true, have same rotation as owner.

; bool bTravel : Actor is capable of travelling among servers.

; bool bUpdateSimulatedPosition : f true, update velocity/location after initialization for simulated proxies.

; bool bWasSNFiltered : Mainly for debugging - the way this actor was inserted into Octree.

; bool bWorldGeometry : Collision and Physics treats this actor as world geometry.

; Matrix CachedLocalToWorld : 

; vector CachedLocation : 

; Rotator CachedRotation : 

; int CollisionTag : 

; vector ColLocation : Actor's old location one move ago. Only for debugging.

; actor Deleted : Next actor in just-deleted chain.

; Matrix HardRelMatrix : Transform of actor in base's ref frame. Doesn't change after SetBase.

; Pawn Instigator : Pawn responsible for damage caused by this actor.

; Inventory Inventory : Inventory chain.

; int JoinedTag : 

; int KStepTag : 

; float LastRenderTime : Last time this actor was rendered.

; float LatentFloat : Internal latent function use.

; array&lt;int&gt; Leaves : BSP leaves this actor is in.

; LevelInfo Level : Level this actor is on.

; LightRenderDataPtr LightRenderData : 

; MeshInstance MeshInstance : Mesh instance.

; class&lt;LocalMessage&gt; MessageClass : 

; array&lt;timerStruct&gt; MultiTimers : 

; float NetPriority : Higher priorities means update it more frequently.

; int NetTag : 

; float NetUpdateFrequency : How many net updates per seconds.

; float NetUpdateTime : Time of last update

; Box OctreeBox : Actor bounding box cached when added to Octree. Internal use only.

; vector OctreeBoxCenter : 

; vector OctreeBoxRadii : 

; array&lt;int&gt; OctreeNodes : Array of nodes of the octree Actor is currently in. Internal use only.

; Actor Owner : Owner actor.

; Actor PendingTouch : Actor touched during move which wants to add an effect after the movement completes.

; PhysicsVolume PhysicsVolume : physics volume this actor is currently in.

; array&lt;ProjectorRenderInfoPtr&gt; Projectors : Projected textures on this actor.

; PointRegion Region : Region this actor is in.

; vector RelativeLocation : Location relative to base/bone (valid if base exists).

; rotator RelativeRotation : Rotation relative to base/bone (valid if base exists)

; ENetRole RemoteRole : 

; int RenderRevision : 

; Material RepSkin : Replicated skin (sets Skins[0] if not none)

; ENetRole Role : 

; AnimRep SimAnim : Only replicated if &lt;code&gt;bReplicateAnimations&lt;/code&gt; is true

; EFilterState StaticFilterState : 

; StaticMeshInstance StaticMeshInstance : Contains per-instance static mesh data, like static lighting data.

; array&lt;StaticMeshProjectorRenderInfoPtr&gt; StaticMeshProjectors : 

; array&lt;BatchReference&gt; StaticSectionBatches : 

; float TimerCounter : Counts up until it reaches TimerRate.

; float TimerRate : Timer event, 0=no timer.

; array&lt;Actor&gt; Touching : List of touching actors.

; Level XLevel : Level object.

===Actionable===
; string ActionableMessage : A message to display to a player when near the object

; int iActionablePriority : Priority if near several Actionable objects

; int iActionableRadius : Radius to be Actionable within

===Advanced===
; bool bCanTeleport : This actor can be teleported. This property must be True for Teleporters to notice the actor.

; bool bCollideWhenPlacing : The actor will collide with world geometry when placed.

; bool bDirectional : Whether the editor should display an arrow to show the actor's current rotation. This has no effect in the game.

; bool bEdShouldSnap : Snap to grid in the editor.

; bool bGameRelevant : Mutators will not receive CheckReplacement and AlwaysKeep calls for the actor if this property is True.

; bool bHidden : Specifies, whether the actor is invisible in the game. This property has no effect in the editor.

; bool bHiddenEd : The actor is hidden in the editor. This has no effect in the game.

; bool bHiddenEdGroup : The actor is hidden in the Group Browser. This has no effect in the editor viewports or in the game.

; bool bHighDetail : The actor only shows up in high or super high detail mode.

; bool bLockLocation : Prevent the actor from being moved in the editor.

; bool bMovable : Actor can be moved.

; bool bNoDelete : Specifies, that the actor can't be spawned or destroyed during the game.

; bool bShouldBaseAtStartup : The actor tries to find another actor for its Base at level startup if its Physics property is set to either PHYS_None or PHYS_Rotating.

; bool bStasis : In standalone (i.e. single player, e.g. Instant Action) games this actor should be turned off if it's not in a recently rendered zone. It will only be turned off when its Physics mode is PHYS_None or PHYS_Rotating.

; bool bSuperHighDetail : The actor only shows up in super high detail mode.

; float LifeSpan : Specifies how long the actor will exist. This value is constantly decreased and the actor will be destroyed when it reaches 0. In this case the actor's Expired method is executed. An initial LifeSpan of 0 or explicitely setting the LifeSpan to 0 from UnrealScript disables the actor's &quot;destruction timer&quot;. Setting it to a value greater 0 from UnrealScript enables it and the Actor will be destroyed after that time unless LifeSpan is set to 0 again before it expired.

===BreakNetPlay===
; bool bStatic : Does not move or change over time. Don't let L.D.s change this - screws up net play.

===Collision===
; bool bAutoAlignToTerrain : Auto-align to terrain in the editor.

; bool bBlockActors : Blocks other nonplayer actors.

; bool bBlockKarma : Block actors being simulated with Karma.

; bool bBlockNonZeroExtentTraces : Block non-zero extent actors/traces.

; bool bBlockPlayers : The comment for this says &quot;OBSOLETE - no longer used&quot;, but it seems to be quite required if you want something to block player movement.  Anyone have ideas?

; bool bBlockZeroExtentTraces : Block zero extent actors/traces.

; bool bCollideActors : Collides with other actors.

; bool bCollideWorld : Collides with the world.

; bool bPathColliding : This actor should collide (if &lt;code&gt;bWorldGeometry &amp;&amp; bBlockActors&lt;/code&gt; is true) during path building (ignored if &lt;code&gt;bStatic&lt;/code&gt; is true, as actor will always collide during path building).

; bool bProjTarget : Projectiles should potentially target this actor.

; bool bUseCylinderCollision : Force axis aligned cylinder collision (useful for static mesh pickups, etc.).

; float CollisionHeight : Half-height cyllinder.

; float CollisionRadius : Radius of collision cyllinder.

===Display===
; byte AmbientGlow : Ambient brightness, or 255=pulsing.  

'''EricBlade:''' Pulsing?  Anyone ever see that?

; ConvexVolume AntiPortal : Convex volume used for DT_AntiPortal.

; bool bAcceptsProjectors : Projectors can project onto this actor.

; bool bDisableSorting : Manual override for translucent material sorting.

; bool bShadowCast : Casts static shadows.

; bool bStaticLighting : Uses raytraced lighting.

; bool bUnlit : Lights don't affect actor.

; bool bUseDynamicLights : If true, Dynamic lights will shine on this actor

; bool bUseLightingFromBase : Use Unlit/AmbientGlow from Base.

; float CullDistance : 0=no distance cull, &lt; 0 only drawn at distance &gt; 0 cull at distance.

; float DrawScale : Scaling factor, 1.0=normal size.

; vector DrawScale3D : Scaling vector, &lt;code&gt;(1.0,1.0,1.0)&lt;/code&gt;=normal size. Use negative numbers to mirror the actor along the axis that is negative

; EDrawType DrawType : 

; name ForcedVisibilityZoneTag : Makes the visibility code treat the actor as if it was in the zone with the given tag.

; float LODBias : 

; byte MaxLights : Limit to hardware lights active on this primitive.

; mesh Mesh : Mesh if &lt;code&gt;DrawType=DT_Mesh&lt;/code&gt;.

; vector PrePivot : Offset from box center for drawing.

; float ScaleGlow : 

; array&lt;Material&gt; Skins : Multiple skin support - not replicated. Overrides the default materials of a mesh or static mesh

; StaticMesh StaticMesh : StaticMesh if &lt;code&gt;DrawType=DT_StaticMesh&lt;/code&gt;

; ERenderStyle Style : Style for rendering sprites, meshes.

; Material Texture : Sprite texture. If &lt;code&gt;DrawType=DT_Sprite&lt;/code&gt;

===Events===
; bool bHasHandlers : 

; name Event : The event this actor causes.

; array&lt;EventHandlerMapping&gt; EventBindings : 

; name Tag : Actor's tag name.

===Force===
; float ForceRadius : Radius that forces are applied to Emitters that have Forces enabled

; float ForceScale : Scale to apply to forces

; EForceType ForceType : Type of force to apply to particles that are force enabled

===Karma===
; KarmaParamsCollision KParams : Parameters for Karma Collision/Dynamics.

===LightColor===
; float LightBrightness : Brightness of light this actor is to emit

; byte LightHue : Hue for light this actor is to emit

; byte LightSaturation : Saturation for light this actor is to emit

===Lighting===
; bool bActorShadows : Light casts actor shadows.

; bool bCorona : Light uses Skin as a corona.

; bool bDynamicLight : This light is dynamic.

; bool bLightingVisibility : Calculate lighting visibility for this actor with line checks.

; bool bSpecialLit : Only affects special-lit surfaces.

; byte LightCone : 

; ELightEffect LightEffect : 

; byte LightPeriod : 

; byte LightPhase : 

; float LightRadius : Radius for lights to affect, note this has nothing to do with Unreal units, or any other known direct measurement.

; ELightType LightType : 

===Movement===
; name AttachTag : Attach this actor's movement to the mover with the specified Tag set

; bool bBounce : Bounces when hits ground fast.

; bool bFixedRotationDir : Fixed direction of rotation.

; bool bHardAttach : Uses 'hard' attachment code. &lt;code&gt;bBlockActor&lt;/code&gt; and &lt;code&gt;bBlockPlayer&lt;/code&gt; must also be false.&lt;br /&gt;&lt;br /&gt;This actor cannot then move relative to base (setlocation etc.).&lt;br /&gt;

; bool bIgnoreEncroachers : Ignore collisions between movers and this actor.

; bool bRotateToDesired : Rotate to DesiredRotation.

; float Buoyancy : Water buoyancy.

; rotator DesiredRotation : Physics will smoothly rotate actor to this rotation if &lt;code&gt;bRotateToDesired&lt;/code&gt;.

; vector Location : Actor's location; use Move to set.

; float Mass : Mass of this actor.

; EPhysics Physics : 

; rotator Rotation : Actor's rotation

; rotator RotationRate : Change in rotation per second.

; vector Velocity : Actor's velocity

===Object===
; int DebugFlags : 

; name Group : 

; name InitialState : Initial code state to start in

===Sound===
; sound AmbientSound : Ambient sound effect.

; bool bFullVolume : Whether to apply ambient attenuation.

; ESoundOcclusion SoundOcclusion : Sound occlusion approach.

; byte SoundPitch : Sound pitch shift, 64.0=none.

; float SoundRadius : Radius of ambient sound.

; byte SoundVolume : Volume of ambient sound.

; float TransientSoundRadius : Default sound radius for regular sounds (can be overridden in playsound).

; float TransientSoundVolume : Default sound volume for regular sounds (can be overridden in playsound).

==Enums==

===EDetailMode===

; DM_Low : Low detail mode
; DM_High : High detail mode
; DM_SuperHigh : Super High detail mode

===EDoubleClickDir===

Double click move direction.&lt;br /&gt;&lt;br /&gt;Used to remember the dodging state of a player. This will be reset to DCLICK_None when the player lands.&lt;br /&gt;These are not used in LOTD.

&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;DCLICK_None&lt;/dt&gt;&lt;dd&gt;No dodging move started.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DCLICK_Active&lt;/dt&gt;&lt;dd&gt;In dodging move.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DCLICK_Done&lt;/dt&gt;&lt;dd&gt;Dodging move done.&lt;/dd&gt;

; DCLICK_None :
; DCLICK_Left :
; DCLICK_Right :
; DCLICK_Forward :
; DCLICK_Back :
; DCLICK_Active :
; DCLICK_Done :

===EDrawType===

The DrawType enumneration sets how the actor displays. Some of these options work with another property to set what is displayed.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;DT_None&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;The actor isn't displayed at all. &lt;code&gt;bHidden&lt;/code&gt; instead in most cases because it will allow the actor to still show up in UnrealEd.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_Sprite&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Display a sprite with the material set in the Texture property.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_Mesh&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Display the mesh set in the Mesh property.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_Brush&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Only for Brush classes.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_RopeSprite&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_VerticalSprite&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_Terraform&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_SpriteAnimOnce&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Like DT_Sprite, but plays an animated texture's animation at a speed that plays the animation exactly once during the LifeSpan of the actor. &lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_StaticMesh&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Display the static mesh set in the StaticMesh property.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_DrawType&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;DT_Particle&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Used by particle effect actors (Emitter, xEmitter, xWeatherEffect) and xProcMeshes.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_AntiPortal&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Used for Antiportals.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;DT_FluidSurface&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Used by FluidSurfaceInfos. See Fluid Surfaces.&lt;/dd&gt;

; DT_None :
; DT_Sprite :
; DT_Mesh :
; DT_Brush :
; DT_RopeSprite :
; DT_VerticalSprite :
; DT_Terraform :
; DT_SpriteAnimOnce :
; DT_StaticMesh :
; DT_DrawType :
; DT_Particle :
; DT_AntiPortal :
; DT_FluidSurface :

===EFilterState===

; FS_Maybe :
; FS_Yes :
; FS_No :

===EForceType===

; FT_None : Actor does not apply forces
; FT_DragAlong : Actor drags particles with it, if the particle emitter is set to use Forces

===eKillZType===

; KILLZ_None : Actor killZ will be killed with no damage type

; KILLZ_Lava : Actor killZ will be killed with Lava damage type

; KILLZ_Suicide : Actor KillZ will be killed with Suicide damage type

===ELightEffect===

Spatial light effect to use.

; LE_None :
; LE_TorchWaver :
; LE_FireWaver :
; LE_WateryShimmer :
; LE_Searchlight :
; LE_SlowWave :
; LE_FastWave :
; LE_CloudCast :
; LE_StaticSpot :
; LE_Shock :
; LE_Disco :
; LE_Warp :
; LE_Spotlight :
; LE_NonIncidence :
; LE_Shell :
; LE_OmniBumpMap :
; LE_Interference :
; LE_Cylinder :
; LE_Rotor :
; LE_Sunlight :
; LE_QuadraticNonIncidence :

===ELightType===

Light modulation.

; LT_None :
; LT_Steady :
; LT_Pulse :
; LT_Blink :
; LT_Flicker :
; LT_Strobe :
; LT_BackdropLight :
; LT_SubtlePulse :
; LT_TexturePaletteOnce :
; LT_TexturePaletteLoop :
; LT_FadeOut :

===EMusicTransition===

Music transitions.

; MTRAN_None :
; MTRAN_Instant :
; MTRAN_Segue :
; MTRAN_Fade :
; MTRAN_FastFade :
; MTRAN_SlowFade :

===ENetRole===

Net variables.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;ROLE_None&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;This means that none of the actor's attributes will not be replicated at all. Examples for this kind of actors are the GameInfo, Mutators and GameRules as well as some explosion effects and decals in UT. Note that Actor's with this role can still be instantiated on network game clients if spawned from the right function. For example if an Actor with &lt;code&gt;ROLE_None&lt;/code&gt; is instantiated from a &lt;code&gt;simulated event PostBeginPlay()&lt;/code&gt; function it will be created on both the server and the client as this function is invoked on both. However the server-side Actor and the client-side Actor are two completely independant entities. This means that destroying the actor on the server will not destroy the actor on the client (and vice-versa).&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_DumbProxy&lt;/dt&gt;&lt;dd&gt;The actor is replicated, but can't execute any functions on the remote side. It will update when variables are replicated to it but will not attempt to interpolate.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_SimulatedProxy&lt;/dt&gt;&lt;dd&gt;The actor is replicated and may execute simulated functions and simulated state code on the remote side. Often this kind of actor simulates its behavior based on initially replicated properties without (much) further &quot;help&quot; from the server.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_AutonomousProxy&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;Autonomous proxies come with some more magic built-in. They are basically simulated proxies, but may execute simulated and non-simulated functions on the client owning/controlling this actor (only on that client!).&lt;br /&gt;In UT only PlayerPawns are autonomous proxies, in UT2003 only PlayerControllers are. Every other client sees them as a regular simulated proxy. Player-controlled actors, such as the guided redeemer missile (GuidedWarshell in UT or RedeemerWarhead in UT2003) are autonomous proxies on the controlling player's client, too.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;ROLE_Authority&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;All functions can be executed. This role is only allowed on the machine the actor was spawned on. All actors on the server or in standalone games have &lt;code&gt;Role== ROLE_Authority&lt;/code&gt;. Never manually set the &lt;code&gt;RemoteRole&lt;/code&gt; on the authorative version of an actor or the &lt;code&gt;Role&lt;/code&gt; on a replicated version of the actor to this value.&lt;br /&gt;&lt;/dd&gt;

; ROLE_None :
; ROLE_DumbProxy :
; ROLE_SimulatedProxy :
; ROLE_AutonomousProxy :
; ROLE_Authority :

===EPhysics===

Actor's PhysicsType is set in the Physics property. Use the &lt;code&gt;SetPhysics() method to change.&lt;/code&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;PHYS_CinMotion&lt;/dt&gt;&lt;dd&gt;(new in UT2003)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Falling&lt;/dt&gt;&lt;dd&gt;Automatically applies the gravity of the current zone.  Pawn-set acceleration in the Z direction is ignored.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Flying&lt;/dt&gt;&lt;dd&gt;The Pawn or Actor can move independantly from gravity. Velocity on the Z axis is ignored.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Hovering&lt;/dt&gt;&lt;dd&gt;This is is a fun Physics type. When you an actors physics to &lt;code&gt;PHYS_Hovering&lt;/code&gt;, it, er, hovers a few UU off the ground. If you do this to an xPawn, for example, it will act kind of like a hovercraft. Friction is reduced (so you slide around, and slide down ramps), and if you go at speed up an incline you can do some massive jumps.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Interpolating&lt;/dt&gt;&lt;dd&gt;Used in conjunction with &lt;code&gt;bInterpolating&lt;/code&gt; in Actor.  Seems to also use the &lt;code&gt;PhysRate&lt;/code&gt; and &lt;code&gt;PhysAlpha&lt;/code&gt; parameters. Seems to be a leftover from the pre-Matinee days.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Karma&lt;/dt&gt;&lt;dd&gt;Signals an Actor is to be effected by the Karma engine.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_KarmaRagDoll&lt;/dt&gt;&lt;dd&gt;This is used for dead pawns.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Ladder&lt;/dt&gt;&lt;dd&gt;Applies to an Actor when they are climbing a ladder. &lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_MovingBrush&lt;/dt&gt;&lt;dd&gt;Used for Movers&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_None&lt;/dt&gt;&lt;dd&gt;No native physics code is applied.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Projectile&lt;/dt&gt;&lt;dd&gt;Uses velocities on all 3 axes but DOES NOT use the current Zone's ZoneGravity and ZoneFluidFriction members to adjust velocity. This means that actors with a velocity are not affected by gravity or friction. Actors with this physics setting do not have any freedom of movement.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Rolling&lt;/dt&gt;&lt;dd&gt;(removed in UT2003)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_RootMotion&lt;/dt&gt;&lt;dd&gt;(new in UT2003)&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Rotating&lt;/dt&gt;&lt;dd&gt;Only rotation changes.  Location doesn't change.  If &lt;code&gt;bRotateToDesired&lt;/code&gt; is false, then the Actor rotates according to &lt;code&gt;RotationRate&lt;/code&gt;.  If &lt;code&gt;bRotateToDesired&lt;/code&gt; is true, then the Actor rotates to the rotation specified by &lt;code&gt;DesiredRotation&lt;/code&gt; at the speed specified by &lt;code&gt;RotationRate&lt;/code&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Spider&lt;/dt&gt;&lt;dd&gt;Similar to &lt;code&gt;PHYS_Walking&lt;/code&gt; except it applies to an Actor against any surface, not just a &quot;ground&quot; surface. An Actor in &lt;code&gt;PHYS_Spider&lt;/code&gt; will move against a horizontal or vertical surface just like in &lt;code&gt;PHYS_Walking&lt;/code&gt;. When the end of the surface is reached the Pawn will be set to &lt;code&gt;PHYS_Falling&lt;/code&gt;. &lt;code&gt;PHYS_Spider&lt;/code&gt; only works on one plane, it will not allow a Pawn to move across perpendicular walls.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Swimming&lt;/dt&gt;&lt;dd&gt;Similar to &lt;code&gt;PHYS_Flying&lt;/code&gt;, but also take the zone's FluidFriction into account.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Trailer&lt;/dt&gt;&lt;dd&gt;Used to set an Actor to follow its Owner. An Actor set this way has no physics of its own, (*including collision) and simply follow their Owner around. NOTE: There are two settings in the Actor class which can specify the actions of a &lt;code&gt;PHYS_Trailer&lt;/code&gt;. First is &lt;code&gt;bTrailerPrePivot&lt;/code&gt;, which, when set to True, causes the Actor in &lt;code&gt;PHYS_Trailer&lt;/code&gt; to be positioned away from its Owner by the vector value set in &lt;code&gt;PrePivot&lt;/code&gt;. If not set or left at 0, the Actor in &lt;code&gt;PHYS_Trailer&lt;/code&gt; will have the same location as its Owner. Secondly, there is &lt;code&gt;bTrailerSameRotation&lt;/code&gt;, which causes the Actor in &lt;code&gt;PHYS_Trailer&lt;/code&gt; to have the same Rotation as its Owner no matter where it is.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PHYS_Walking&lt;/dt&gt;&lt;dd&gt;Native physics code for Pawn class only. Applies all the things that make a pawn move around on the ground. Must have a Base set, without a Base to walk on, this turns to &lt;code&gt;PHYS_Falling&lt;/code&gt;.&lt;/dd&gt;

; PHYS_None :
; PHYS_Walking :
; PHYS_Falling :
; PHYS_Swimming :
; PHYS_Flying :
; PHYS_Rotating :
; PHYS_Projectile :
; PHYS_Interpolating :
; PHYS_MovingBrush :
; PHYS_Spider :
; PHYS_Trailer :
; PHYS_Ladder :
; PHYS_RootMotion :
; PHYS_Karma :
; PHYS_KarmaRagDoll :
; PHYS_Pawn :

===ERenderStyle===

Style for rendering sprites, meshes.

; STY_None : 
; STY_Normal :
; STY_Masked :
; STY_Translucent :
; STY_Modulated :
; STY_Alpha :
; STY_Additive :
; STY_Subtractive :
; STY_Particle :
; STY_AlphaZ :

===ESoundOcclusion===

Sound occlusion

; OCCLUSION_Default :
; OCCLUSION_None : Objects between this Actor and Player do not affect sound
; OCCLUSION_BSP : BSP between this Actor and Player affects sounds
; OCCLUSION_StaticMeshes : StaticMeshes between Actor and Player affects sounds

===ESoundSlot===

; SLOT_None :
; SLOT_Misc :
; SLOT_Pain :
; SLOT_Interact :
; SLOT_Ambient :
; SLOT_Talk :
; SLOT_Interface :

===ETravelType===

Travelling from server to server.

; TRAVEL_Absolute : Travel to absolute URL
; TRAVEL_Partial : Partial travel (carry name, reset server) ?
; TRAVEL_Relative : Relative URL

==Structures==

===ActorRenderDataPtr===

; int Ptr : 

===AnimRep===

Animation replication (can be used to replicate channel 0 anims for dumb proxies)

; byte AnimFrame : 

; byte AnimRate : note that with compression, max replicated animrate is 4.0

; name AnimSequence : 

; bool bAnimLoop : 

; byte TweenRate : note that with compression, max replicated tweentime is 4 seconds

===BatchReference===

; int BatchIndex : 

; int ElementIndex : 

===EventHandlerMapping===

====Actor====
; Name EventName : 

; Name HandledBy : 

===KRBVec===

; float X : 

; float Y : 

; float Z : 

===KRigidBodyState===

; KRBVec AngVel : 

; KRBVec LinVel : 

; KRBVec Position : 

; Quat Quaternion : 

===LightRenderDataPtr===

; int Ptr : 

===PointRegion===

Identifies a unique convex volume in the world.

; int iLeaf : Bsp leaf.

; zoneinfo Zone : Zone

; byte ZoneNumber : Zone Number.

===ProjectorRenderInfoPtr===

Hack to to fool C++ header generation...

; int Ptr : 

===StaticMeshProjectorRenderInfoPtr===

; int Ptr : 

===timerStruct===

; byte bLooping : 
; int slotID : 
; float TimerCounter : 
; float TimerRate : 

==Functions==
;  AllActors(class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ): Avoid using &lt;code&gt;AllActors()&lt;/code&gt; too often as it iterates through the whole actor list and is therefore slow.

;  AnimBlendParams(int Stage, optional float BlendAlpha, optional float InTime, optional float OutTime, optional name BoneName, optional bool bGlobalPose ): 

;  AnimBlendToAlpha(int Stage, float TargetAlpha, float TimeInterval ): 

; bool AnimIsInGroup(int Channel, name GroupName ): 

; bool AttachToBone(actor Attachment, name BoneName ): Attach the specified Attachment actor to the specified BoneName bone of this Actor

;  AutonomousPhysics(float DeltaSeconds ): 

;  BasedActors(class&lt;actor&gt; BaseClass, out actor Actor ): Returns all actors based on the current actor (slow, like AllActors)

;  BecomeViewTarget( ): Called by PlayerController when this actor becomes its ViewTarget.

;  BoneRefresh( ): You want to call this when bringing a Skeletal actor into the world to avoid it going into it's refpose for no obvious reason.

; bool CanSplash( ): 

;  ChildActors(class&lt;actor&gt; BaseClass, out actor Actor ): ChildActors() returns all actors owned by this actor.  Slow like AllActors()

;  Clock(out float time ): This is called at the beginning of a section of code to be timed. The variable time does not need to be initialized.

;  CollidingActors(class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ): CollidingActors() returns colliding (&lt;code&gt;bCollideActors==true&lt;/code&gt;) actors within a certain radius.

; string ConsoleCommand(string Command ): Execute a console command in the context of the current level and game engine.

;  CopyMaterialsToSkins( ): Native function unique to LOTD, copies the default Materials into the Skins[] override array

;  DebugClock( ): 

;  DebugUnclock( ): 

; bool Destroy( ): Destroy this actor. Returns true if destroyed, false if indestructable.&lt;br /&gt;

; bool DetachFromBone(actor Attachment ):  Remove the specified Actor, from whatever it is attached to.  It is presumed that it would be attached to THIS actor, but that is apparently not a requirement.

;  DisplayDebug(Canvas Canvas, out float YL, out float YPos ): List important actor variable on canvas.  HUD will call DisplayDebug() on the current ViewTarget when the ShowDebug exec is used.

;  DoActionableAction(Controller InstigatingController ): Called whenever a player presses the Action button within this actor's ActionableRadius

;  DrawDebugLine(vector LineStart, vector LineEnd, byte R, byte G, byte B ): SLOW! Use for debugging only!

;  DynamicActors(class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ): DynamicActors() only iterates through the non-static actors on the list (still relatively slow, but much better than AllActors).  This should be used in most cases and replaces AllActors in many situations

; bool EffectIsRelevant(vector SpawnLocation, bool bForceDedicated ): 

;  EnableChannelNotify(int Channel, int Switch ): 

;  Error(coerce string S ): Handle an error and kill this one actor.

; bool FastTrace(vector          TraceEnd,     optional vector TraceStart ): Similar to trace, this one returns true if it hits the world geometry, false if it is not long enough. It will pass right through anything that is not set as world geometry.

;  FilterStateDirty( ): 

;  FinishAnim(optional int Channel ): 

;  FinishInterpolation( ): 

; bool ForceFeedbackSupported(optional bool Enable ): Without parameters this will return the state of Force Feedback support, with a True parameter, it will enable Force Feedback

;  FreezeAnimAt(float Time, optional int Channel ): Hold an animation on the specified channel at the specified time frame.

; string GetActionableMessage(Controller InstigatingController ): Called in any object when a Player is within it's ActionableRadius to determine what to print on the Player's screen to notify them that they can use the object for something

; int GetActionablePriority(Controller InstigatingController ): Called in any object when a Player is within it's ActionableRadius to determine what Actor's GetActionableMessage and DoActionableAction functions should be called by the player, if there are multiple Actionable items involved.  Set to -1 to make this Actor non actionable

;  GetAnimParams(int Channel, out name OutSeqName, out float OutAnimFrame, out float OutAnimRate ): 

; coords GetBoneCoords(name BoneName ): Returns the coords of the BoneName bone.

; rotator GetBoneRotation(name BoneName, optional int Space ): Returns the rotation of the BoneName bone

; bool GetCacheEntry(int Num, out string GUID, out string Filename ): 

; vector GetCollisionExtent( ): 

; String GetDebugName( ): 

; String GetHumanReadableName( ): Returns the human readable string representation of an object.

; String GetItemName(string FullName ): 

; string GetLocalString(optional int Switch,     optional PlayerReplicationInfo RelatedPRI_1,     optional PlayerReplicationInfo RelatedPRI_2 ): Get localized message string associated with this actor.

; string GetMapName(string NameEnding, string MapName, int Dir ): 

; string GetMeshName( ): 

; string GetNextInt(string ClassName, int Num ): 

;  GetNextIntDesc(string ClassName, int Num, out string Entry, out string Description ): Read from the INT files available

;  GetNextSkin(string Prefix, string CurrentSkin, int Dir, out string SkinName, out string SkinDesc ): 

; int GetNotifyChannel( ): 

; plane GetRenderBoundingSphere( ): 

; vector GetRootLocation( ): 

; vector GetRootLocationDelta( ): 

; rotator GetRootRotation( ): 

; rotator GetRootRotationDelta( ): 

; float GetSoundDuration(sound Sound ): Returns the duration in seconds of a sound

; string GetURLMap( ): 

; bool HasAnim(name Sequence ): Returns true if this actor has an animation with the named Sequence 

;  HurtRadius(float DamageAmount, float DamageRadius, class&lt;DamageType&gt; DamageType, float Momentum, vector HitLocation ): Hurt locally authoritative actors within the radius.

; bool IsAnimating(optional int Channel ): returns true if the specified channel is playing an animation

; bool IsInPain( ): 

; bool IsInVolume(Volume aVolume ): Returns true if the actor is in the specified volume

; bool IsTweening(int Channel ): 

;  KAddBoneLifter(name BoneName, InterpCurve LiftVel, float LateralFriction, InterpCurve Softness ): Note you MUST turn collision off (&lt;code&gt;KSetBlockKarma&lt;/code&gt;) before using bone lifters.

;  KAddImpulse(vector Impulse, vector Position, optional name BoneName ): A position of (0,0,0) applies impulse at COM (ie no angular component).

;  KDisableCollision(actor Other ): Turn off Karma collision for this actor to the specified other actor

;  KDrawRigidBodyState(KRigidBodyState RBState, bool AltColour ): SLOW! Use for debugging only!

;  KEnableCollision(actor Other ): Turns on Karma collision for this actor to the specified other actor

;  KFreezeRagdoll( ): Halt a Karma Ragdoll

; float KGetActorGravScale( ): Returns the KParams.KGravScale

;  KGetCOMOffset(out vector offset ): 

;  KGetCOMPosition(out vector pos ): Get actual position of actors COM in world space

;  KGetDampingProps(out float lindamp, out float angdamp ): 
; float KGetFriction( ): 
; float KGetImpactThreshold( ): 
;  KGetInertiaTensor(out vector it1, out vector it2 ): 
; float KGetMass( ): 
; quat KGetRBQuaternion( ): 
; float KGetRestitution( ): 
;  KGetRigidBodyState(out KRigidBodyState RBstate ): 
; float KGetSkelMass( ): 
; bool KIsAwake( ): 
; bool KIsRagdollAvailable( ): 
;  KMakeRagdollAvailable( ): 
; KRBVec KRBVecFromVector(vector v ): 
; vector KRBVecToVector(KRBVec RBvec ): 
;  KRemoveAllBoneLifters( ): Used for only allowing a fixed maximum number of ragdolls in action.

;  KRemoveLifterFromBone(name BoneName ): 
;  KSetActorGravScale(float ActorGravScale ): 
;  KSetBlockKarma(bool newBlock ): 
;  KSetCOMOffset(vector offset ): 
;  KSetDampingProps(float lindamp, float angdamp ): 
;  KSetFriction(float friction ): 
;  KSetImpactThreshold(float thresh ): 
;  KSetInertiaTensor(vector it1, vector it2 ): 
;  KSetMass(float mass ): 
;  KSetRestitution(float rest ): 
;  KSetSkelVel(vector Velocity, optional vector AngVelocity, optional bool AddToCurrent ): 
;  KSetStayUpright(bool stayUpright, bool allowRotate ): 
;  KSetStayUprightParams(float stiffness, float damping ): 
;  KWake( ): 

;  LinkMesh(mesh NewMesh, optional bool bKeepAnim ): Link to a new Mesh, optionally keeping the existing Animations or using the new Mesh's animations

;  LinkSkelAnim(MeshAnimation Anim, optional mesh NewMesh ): Link new Animations, optionally replacing the Mesh (LOTD implements multiple Animation packages per Mesh, there are better functions for dealing with this

;  LockRootMotion(int Lock ): 

;  LoopAnim(name Sequence, optional float Rate, optional float TweenTime, optional int Channel ): 

;  MakeNoise(float Loudness ): Inform other creatures that you've made a noise they might hear (they are sent a HearNoise message).

;  MatchStarting( ): Called when gameplay actually starts.

; bool Move(vector Delta ): 

; bool MoveCacheEntry(string GUID, optional string NewFilename ): 

; bool MoveSmooth(vector Delta ): 

; bool NearSpot(vector Spot ): NearSpot() returns true is spot is within collision cylinder.

;  Notify( ): 

;  OnlyAffectPawns(bool B ): 

;  PlayAnim(name Sequence, optional float Rate, optional float TweenTime, optional int Channel ): 

; bool PlayerCanSeeMe( ): PlayerCanSeeMe returns true if any player (server) or the local player (standalone or client) has a line of sight to actor's location.

;  PlayFeedbackEffect(String EffectName ): Play a Force Feedback effect

; int PlayMusic(string Song, float FadeInTime ): Only used for level music - will be stopped when level changes&lt;br /&gt;

;  PlayOwnedSound(sound               Sound,     optional ESoundSlot Slot,     optional float      Volume,     optional bool       bNoOverride,     optional float      Radius,     optional float      Pitch,     optional bool       Attenuate ): Play a sound effect, but don't propagate to a remote owner (he is playing the sound clientside)

;  PlaySound(sound               Sound,     optional ESoundSlot Slot,     optional float      Volume,     optional bool       bNoOverride,     optional float      Radius,     optional float      Pitch,     optional bool       Attenuate ): Play a sound effect.

;  PlayTeleportEffect(bool bOut, bool bSound ): 

;  RadiusActors(class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ): RadiusActors() returns all actors within a give radius.  Slow like AllActors().  Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible (not bHidden) and in the collision hash (&lt;code&gt;bCollideActors&lt;/code&gt; is true)

;  RenderOverlays(Canvas Canvas ): Called by player's hud to request drawing of actor specific overlays onto canvas

;  ReplaceText(out string Text, string Replace, string With ): Replace string Replace with string With, in string Text, returning result in passed string Text

;  Reset( ): Reset actor to initial state - used when restarting level without reloading.

;  SetAnimFrame(float Time, optional int Channel, optional int UnitFlag ): Move to a specific frame of animation

;  SetBase(actor NewBase, optional vector NewFloor ): Set the actor's Base (for attached movement)

;  SetBoneDirection(name BoneName, rotator BoneTurn, optional vector BoneTrans, optional float Alpha, optional int Space ): 

;  SetBoneLocation(name BoneName, optional vector BoneTrans, optional float Alpha ): 

;  SetBoneRotation(name BoneName, optional rotator BoneTurn, optional int Space, optional float Alpha ): 

;  SetBoneScale(int Slot, optional float BoneScale, optional name BoneName ): 

;  SetCollision(optional bool NewColActors, optional bool NewBlockActors, optional bool NewBlockPlayers ): 

; bool SetCollisionSize(float NewRadius, float NewHeight ): 

;  SetDefaultDisplayProperties( ): 

;  SetDisplayProperties(ERenderStyle NewStyle, Material NewTexture, bool bLighting ): Set the display properties of an actor. 

;  SetDrawScale(float NewScale ): Adjust the DrawScale of the Actor, 1.0 = normal

;  SetDrawScale3D(vector NewScale3D ): Adjust the DrawScale3D, (1.0,1.0,1.0) = normal, use negative numbers to mirror

;  SetDrawType(EDrawType NewDrawType ): 

;  SetGRI(GameReplicationInfo GRI ): 

; bool SetLocation(vector NewLocation ): This function sets the location of the actor it is called on. It will not work on actors with &lt;code&gt;PHYS_Karma&lt;/code&gt; or &lt;code&gt;PHYS_KarmaRagdoll&lt;/code&gt;. If the actor cannot occupy the new location because it is colliding with an actor that can block it, it will be placed at the nearest valid location. Note that because Terrain has no &quot;volume&quot; and is just a bent up sheet, the actor may not be moved in this manner when it penetrates terrain.

;  SetMultiTimer(int slotID, float NewTimerRate, bool bLoop ): Native function apparently specific to LOTD, specifies that this actor's MultiTimer(slotID) function will be called.  Very similar to Timer, but easy to use for multiple things in one actor.

;  SetOwner(actor NewOwner ): Set this Actor's Owner property

;  SetPhysics(EPhysics newPhysics ): Changes this Actor's physics type, takes effect on the NEXT tick.

; bool SetRelativeLocation(vector NewLocation ): Sets the location relative to this actor's base

; bool SetRelativeRotation(rotator NewRotation ): Sets the rotation relative to the actor's base.

; bool SetRotation(rotator NewRotation ): This function sets the rotation of the actor it is called on. It will not work on actors with &lt;code&gt;PHYS_Karma&lt;/code&gt; or &lt;code&gt;PHYS_KarmaRagdoll&lt;/code&gt;.

;  SetStaticMesh(StaticMesh NewStaticMesh ): Set a new StaticMesh to replace this actor's original setting.

;  SetTimer(float NewTimerRate, bool bLoop ): Causes &lt;code&gt;Timer()&lt;/code&gt; events every &lt;code&gt;NewTimerRate&lt;/code&gt; seconds. If &lt;code&gt;bLoop&lt;/code&gt; is true, causes &lt;code&gt;Timer()&lt;/code&gt; events every &lt;code&gt;NewTimerRate&lt;/code&gt; seconds. Otherwise, causes &lt;code&gt;Timer()&lt;/code&gt; to be called once in &lt;code&gt;NewTimerRate&lt;/code&gt; seconds. &lt;code&gt;SetTimer(0.0, False);&lt;/code&gt; stops the timer.

; bool ShouldBeHidden( ): Check if class has HideDropDown specifier

;  Sleep(float Seconds ): Waits for the specified amount of time before returning.&lt;br /&gt;

; actor Spawn(class&lt;actor&gt;      SpawnClass,     optional actor    SpawnOwner,     optional name     SpawnTag,     optional vector   SpawnLocation,     optional rotator  SpawnRotation ): Spawn an actor. Returns an actor of the specified class, not of class Actor (this is hardcoded in the compiler). &lt;br /&gt;&lt;br /&gt;Returns None if the actor could not be spawned (either the actor wouldn't fit in the specified location, or the actor list is full). &lt;br /&gt;

;  StartInterpolation( ): When this function is called, the actor will start moving along an interpolation path beginning at Dest

;  StopAllMusic(float FadeOutTime ): 

;  StopAnimating(optional bool ClearAllButBase ): 

;  StopFeedbackEffect(optional String EffectName ): Pass no parameter or &quot;&quot; to stop all.

;  StopMusic(int SongHandle, float FadeOutTime ): 

; vector SuggestFallVelocity(vector Destination, vector Start, float MaxZ, float MaxXYSpeed ): 

; bool TouchingActor(Actor A ): Returns true if Actor A is touching this Actor

;  TouchingActors(class&lt;actor&gt; BaseClass, out actor Actor ): Returns all actors touching the current actor (fast).

; Actor Trace(out vector      HitLocation,     out vector      HitNormal,     vector          TraceEnd,     optional vector TraceStart,     optional bool   bTraceActors,     optional vector Extent,     optional out material Material ): This traces a path to find what it collides with first. The line will be traced starting at &lt;code&gt;TraceStart&lt;/code&gt; and ending at &lt;code&gt;TraceEnd&lt;/code&gt;.&lt;br /&gt;If &lt;code&gt;bTraceActors&lt;/code&gt; is true, actors will be considered for the tracing, otherwise only pieces of the world (terrain, staticmeshactors, BSP) will be considered for collision.&lt;br /&gt;When the trace hits something, &lt;code&gt;HitLocation&lt;/code&gt; and &lt;code&gt;HitNormal&lt;/code&gt; will be set to contain the location and normal of the impact. If specified, the material of the surface hit can also be returned. If an &lt;code&gt;Extent&lt;/code&gt; is specified, you can have the trace have &quot;width.&quot; It will have a box of the size specified as a vector (corner to corner) as the &quot;thickness&quot; of the trace. &lt;br /&gt;&lt;br /&gt;Note that traces are not very fast, so should be avoided or kept to a minimum where possible. &lt;br /&gt;

;  TraceActors(class&lt;actor&gt; BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ): Return all actors along a traced line.  Reasonably fast (like any trace)

;  TweenAnim(name Sequence, float Time, optional int Channel ): 

;  UnClock(out float time ): This is called at the end of a section of code to be timed passing in the same time variable supplied to Clock.

;  UntriggerEvent(Name EventName, Actor Other, Pawn EventInstigator ): 

;  UpdatePrecacheMaterials( ): 

;  UpdatePrecacheStaticMeshes( ): 

;  VisibleActors(class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc ): Returns all visible (not &lt;code&gt;bHidden&lt;/code&gt;) actors within a radius for which a trace from &lt;code&gt;Loc&lt;/code&gt; (which defaults to caller's &lt;code&gt;Location&lt;/code&gt;) to that actor's &lt;code&gt;Location&lt;/code&gt; does not hit the world.&lt;br /&gt;

;  VisibleCollidingActors(class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden ): Returns all colliding (&lt;code&gt;bCollideActors==true&lt;/code&gt;) actors within a certain radius for which a trace from &lt;code&gt;Loc&lt;/code&gt; (which defaults to caller's Location) to that actor's Location does not hit the world.&lt;br /&gt;

;  WaitForNotification(optional float TimeoutInSeconds ): 

==Events==
;  AnimEnd(int Channel ): Notification that the current animation has ended. Allows an object to wait for animation completion before proceeding with other activities.

;  Attach(Actor Other ): Called when this actor is attached to actor Other

;  BaseChange( ): Called when this actor's Base is changed

;  BeginEvent( ): 

;  BeginPlay( ): Called at the beginning of play

;  BroadcastLocalizedMessage(class&lt;LocalMessage&gt; MessageClass, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ): Broadcast a localized message to all players.&lt;br /&gt;&lt;br /&gt;Most message deal with 0 to 2 related PRIs.&lt;br /&gt;

;  Bump(Actor Other ): Called when actor Other bumps this actor

;  DemoPlaySound(sound               Sound,     optional ESoundSlot Slot,     optional float      Volume,     optional bool       bNoOverride,     optional float      Radius,     optional float      Pitch,     optional bool       Attenuate ): 

;  Destroyed( ): Called after this actor's Destroy() function is called

;  Detach(Actor Other ): Called when this actor is detached from Other

;  EncroachedBy(actor Other ): Called when Other is encroaching our collision zone

; bool EncroachingOn(actor Other ): Called when we are encoraching on Other's collision zone

;  EndedRotation( ): Called when rotation completes

;  EndEvent( ): 

;  Falling( ): Called when we are falling. Ahhh!!!!!

;  FellOutOfWorld(eKillZType KillType ): Sets physics to none and destroys the actor.

;  FinishedInterpolation( ): The implementation in actor only sets &lt;code&gt;bInterpolating&lt;/code&gt; to false.

;  GainedChild(Actor Other ): Called when a child actor is spawned

;  HitWall(vector HitNormal, actor HitWall ): Called when this actor hits a wall

;  KApplyForce(out vector Force, out vector Torque ): Event called just before sim to allow user to apply Karma forces

;  KilledBy(pawn EventInstigator ): Called when this Actor is killed (only appears to be useful for pawns..)

;  KImpact(actor other, vector pos, vector impactVel, vector impactNorm ): Event called when Karmic actor hits with impact velocity over &lt;code&gt;KImpactThreshold&lt;/code&gt;.

;  KSkelConvulse( ): Event called when a ragdoll convulses (see KarmaParamsSkel)

; bool KUpdateState(out KRigidBodyState newState ): This is called from inside C++ physKarma at the appropriate time to update state of Karma rigid body.&lt;br /&gt;

;  KVelDropBelow( ): Event called when karma actor's velocity drops below &lt;code&gt;KVelDropBelowThreshold&lt;/code&gt;

;  Landed(vector HitNormal ): Called when we hit the ground

;  LostChild(Actor Other ): Called when another actor with this actor as its owner is destroyed.

;  MultiTimer(int slotID ): Called from the SetMultiTimer() function

;  PhysicsVolumeChange(PhysicsVolume NewVolume ): Called when this actor enters a new Physics Volume

;  PostBeginPlay( ): Called immediately after gameplay begins.

;  PostLinearLoad( ): 

;  PostLoad( ): Called when a saved game is loaded, to allow actors to fix up anything they might need.

;  PostNetBeginPlay( ): Called after PostBeginPlay.  On a net client, PostNetBeginPlay() is spawned after replicated variables have been initialized to their replicated values

;  PostNetReceive( ): If &lt;code&gt;bNetNotify&lt;/code&gt; is True, this event is called when the actor receives an update to any variable through replication.

;  PostTeleport(Teleporter OutTeleporter ): 

;  PostTouch(Actor Other ): Called for PendingTouch actor after physics completes

;  PreBeginPlay( ): Called immediately before gameplay begins.

; bool PreTeleport(Teleporter InTeleporter ): 

;  RenderTexture(ScriptedTexture Tex ): 

;  SetInitialState( ): Called after PostBeginPlay.

; Actor SpecialHandling(Pawn Other ): 

;  TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class&lt;DamageType&gt; DamageType ): Called by anything that wishes to cause this actor Damage

;  Tick(float DeltaTime ): 

;  Timer( ): Called from setting the SetTimer() function

;  TornOff( ): Networking - called on client when actor is torn off (&lt;code&gt;bTearOff==true&lt;/code&gt;)

;  Touch(Actor Other ): Called when we are touching Actor Other

;  TravelPostAccept( ): Called when carried into a new level, after AcceptInventory.

;  TravelPreAccept( ): Called when carried onto a new level, before AcceptInventory.

;  Trigger(Actor Other, Pawn EventInstigator ): 

;  TriggerEvent(Name eventName, Actor sender, Pawn instigator ): 

;  TriggerEx(Actor sender, Pawn instigator, Name handler ): 

;  UnTouch(Actor Other ): Called when this actor is no logner touching Other 

;  UnTrigger(Actor Other, Pawn EventInstigator ): 

;  UsedBy(Pawn user ): Called if this Actor was touching a Pawn who pressed Use (not used in LOTD in favor of the Actionable system)

;  ZoneChange(ZoneInfo NewZone ): Called when this actor changes zones</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Land Of The Dead/NavigationPoint</title>
    <id>1753</id>
    <revision>
      <id>4303</id>
      <timestamp>2006-11-22T05:06:59Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Land Of The Dead|Land of the Dead]] :: [[Legacy:Land Of The Dead/Object|Land of the Dead/Object]] &gt;&gt; [[Legacy:Land Of The Dead/Actor|Land of the Dead/Actor]] &gt;&gt; [[Legacy:Land Of The Dead/NavigationPoint|Land of the Dead/NavigationPoint]]}}

==Properties==
; bool bAutoBuilt : 
; bool bDestinationOnly : 
; bool bEndPoint : 
; int bestPathWeight : 
; bool bForceNoStrafing : 
; bool bMustBeReachable : 
; bool bNoAutoConnect : 
; bool bNotBased : 
; bool bPathsChanged : 
; bool bSourceOnly : 
; bool bSpecialForced : 
; bool bSpecialMove : 
; bool bTransientEndPoint : 
; int cost : 
; int FearCost : 
; Pickup InventoryCache : 
; float InventoryDist : 
; NavigationPoint nextNavigationPoint : 
; NavigationPoint nextOrdered : 
; array&lt;ReachSpec&gt; PathList : 
; NavigationPoint previousPath : 
; NavigationPoint prevOrdered : 
; bool taken : 
; int TransientCost : 
; int visitedWeight : 

===NavigationPoint===
; bool bAlwaysUseStrafing : 
; bool bBlocked : 
; bool bNeverUseStrafing : 
; bool bOneWayPath : 
; bool bPropagatesSound : 
; int ExtraCost : 
; name ForcedPaths[4] : 

; array&lt;NavigationPoint&gt; IgnoredList : The IgnoredList is a dynamic array of NavigationPoints that will be ignored when building.  This is an extension apparently added to this particular build of the engine.  it is unlike ProscribedPath, in that when doing a &quot;Rebuild Paths&quot; from the editor, no lines will be made from this point to the other points listed in this array, and that there is a theoretically infinite number of Nav Points that you can ignore.

; name ProscribedPaths[4] : 

==Functions==
;  MoverClosed( ): 
;  MoverOpened( ): 
;  PostBeginPlay( ): 
; bool ProceedWithMove(Pawn Other ): 

==Events==
; bool Accept(actor Incoming, actor Source ): 
; float DetourWeight(Pawn Other,float PathWeight ): 
; int SpecialCost(Pawn Seeker, ReachSpec Path ): 
; bool SuggestMovePreparation(Pawn Other ):</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Land Of The Dead/Object</title>
    <id>1754</id>
    <revision>
      <id>4304</id>
      <timestamp>2006-11-22T05:17:28Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Land of the Dead's [[Legacy:Object|Object]] class appears to be identical to the Runtime, which is identical to UT2003, except for the following:

; String functions Split() and Divide() are not included
; Debug function StopWatch() is not included
; Console functions IsOnConsole() and IsSoaking() not included</text>
    </revision>
    <revision>
      <id>4305</id>
      <timestamp>2006-11-22T05:08:27Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Land of the Dead's [[Legacy:Object|Object]] class appears to be identical to UT2003.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LandMine</title>
    <id>1642</id>
    <revision>
      <id>4069</id>
      <timestamp>2006-05-30T19:30:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; LandMine (Package: XGame)}}

A land mine. Blows up players who touch it and chucks their bodies into the air.

A good example for LandMine usage is the UT2004 map CTF-Grassyknoll.

==Properties==
; vector ChuckVelocity : This velocity will be added to the player touching the LandMine.
; class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType : The DamageType used to kill the player. Grassyknoll uses 'Fell' here to get the &quot;X left a small crater&quot; message, just with a slightly different meaning... ;)
; class&lt;[[Legacy:Emitter|Emitter]]&gt; BlowupEffect : An emitter effect that will be spawned at the bottom of the touching player's collision cylinder, i.e. between the feet.
; [[Legacy:Sound|Sound]] BlowupSound : The sound to play when blowing up the player.

==Related Topics==
* [[Legacy:Landmines (UT)|Landmines (UT)]] &amp;ndash; a tutorial for creating land mines in the original UT

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Landmine</title>
    <id>1751</id>
    <revision>
      <id>4300</id>
      <timestamp>2006-05-30T19:30:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[LandMine]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:LandMine|LandMine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Landmines (UT)</title>
    <id>1750</id>
    <revision>
      <id>4297</id>
      <timestamp>2006-05-30T21:08:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

This is a quick and dirty tutorial on how to create basic Landmines in UT, which explode when you 'step' on them.

For the Landmine you'll need to add several new actors to your level. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:ExplosionChain|ExplosionChain]]: This is going to take care of the visual aspect of the Landmine.
* [[Legacy:SpecialEvent|SpecialEvent]]: This will damage the player.
* [[Legacy:Trigger|Trigger]]: This will activate the Landmine.

==Let's get to work ==

===ExplosionChain ===

I added one ExplosionChain to my level.

Once placed in the level, open their properties and make sure these settings are as stated.

*EplosionChain1
**Effects:
***bOnlyTriggerable: True
**Events:
***Tag: Landmine
**Explosionchain:
***Damage: 100.0000000 (you might also remove or decrease this, because the SpecialEvent will also inflict damage).
***DelayTime: 0.10000000
***MomentumTransfer: 100000.000000
***Size: 4

===SpecialEvent ===

I also added one SpecialEvent to my level with these properties.

*SpecialEvent1
**Events:
***Tag: Landmine
**Object:
***InitialState: DamageInstigator (or KillInstigator if you want to kill the player).
**SpecialEvent:
***Damage: 80

===Trigger ===

One Trigger is needed to make this Landmine work. Add it to your level at the position where your Landmine is supposed to be. Also make sure that the ExplosionChain is very close to the Trigger. It doesn't matter where the SpecialEvent is though.

Open the Trigger's properties and verify these settings.

*Trigger1
**Collision:
***CollisionHeight: 16 (*)
***CollisionRadius: 32 (*)
**Events:
***Event: Landmine
**Trigger:
***bTriggerOnceOnly: True

&lt;i&gt;(*): Make sure these settings are rather small. I used 16 and 32, but you might wanna make it even smaller. Landmines are usually not that big. Use the Actor's Radii View to see the actual radius.&lt;/i&gt;

===For more Realism: an extra Mover ===

Also for more 'realism' you can carve out a rough piece out of the floor (so it looks blown up) and add in a Mover. Then have this Mover's keyframe 1 to somewhere outside the level. Some other properties to take care of are 

*Events
**Tag: Landmine
*Mover:
** bTriggerOnlyOnce: True
** bUseTriggered: True
** MoverEncroachType: IgnoreWhenEncroach
** MoveTime: 0.0000
** StayOpenTime: 0.0000 (equals: stays open infinitely)
*Object
** InitialState: TriggerOpenedTimed

==Conclusion ==

You're basically done :) Boot your level and be carefull where you walk ;).

==Notes ==

I did not take care of any sound related effect in this tutorial. The sound effect (Landmine exploding) can simply be added by adding another SpecialEvent with a InitialState set to PlaySoundEffect. Then giving it the same tag as the other SpecialEvent will trigger this one as well. Perhaps you can also do it with [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]s.

The ExplosionChain can only be fired once. See the [[Legacy:ExplosionChain|ExplosionChain]] class page for a custom script which allows the explosion to be repeatable.

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] topic page
* [[Legacy:LandMine|LandMine]] &amp;ndash; the corresponding UT2004 actor

===Discussion===

'''Tarquin:'''  Cool tute, G.o.a.T. :D I've put in some backlinks on the class pages.

'''the G.o.a.T:''' Tnx :) I'm planning on adding some others as well, but I'm still working them out a bit. Stay tuned. ;)

'''VitalOverdose:''' I dont see anything on replication anywhere. Does any of this this work online?

'''UArch:''' take a look at the actors used, triggers, specialevents and an explosion chain, very commonly used actors..be kinda pointless if they didnt work online, half the maps ever made would possibly be broken!

'''SuperApe:''' It should be noted that this tutorial is for UT, as UT2004 (3?) has Triggers -&gt; [[Legacy:LandMine|LandMine]].

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4298</id>
      <timestamp>2006-05-30T16:38:40Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

This is a quick and dirty tutorial on how to create basic Landmines in UT, which explode when you 'step' on them.

For the Landmine you'll need to add several new actors to your level. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:ExplosionChain|ExplosionChain]]: This is going to take care of the visual aspect of the Landmine.
* [[Legacy:SpecialEvent|SpecialEvent]]: This will damage the player.
* [[Legacy:Trigger|Trigger]]: This will activate the Landmine.

==Let's get to work ==

===ExplosionChain ===

I added one ExplosionChain to my level.

Once placed in the level, open their properties and make sure these settings are as stated.

*EplosionChain1
**Effects:
***bOnlyTriggerable: True
**Events:
***Tag: Landmine
**Explosionchain:
***Damage: 100.0000000 (you might also remove or decrease this, because the SpecialEvent will also inflict damage).
***DelayTime: 0.10000000
***MomentumTransfer: 100000.000000
***Size: 4

===SpecialEvent ===

I also added one SpecialEvent to my level with these properties.

*SpecialEvent1
**Events:
***Tag: Landmine
**Object:
***InitialState: DamageInstigator (or KillInstigator if you want to kill the player).
**SpecialEvent:
***Damage: 80

===Trigger ===

One Trigger is needed to make this Landmine work. Add it to your level at the position where your Landmine is supposed to be. Also make sure that the ExplosionChain is very close to the Trigger. It doesn't matter where the SpecialEvent is though.

Open the Trigger's properties and verify these settings.

*Trigger1
**Collision:
***CollisionHeight: 16 (*)
***CollisionRadius: 32 (*)
**Events:
***Event: Landmine
**Trigger:
***bTriggerOnceOnly: True

&lt;i&gt;(*): Make sure these settings are rather small. I used 16 and 32, but you might wanna make it even smaller. Landmines are usually not that big. Use the Actor's Radii View to see the actual radius.&lt;/i&gt;

===For more Realism: an extra Mover ===

Also for more 'realism' you can carve out a rough piece out of the floor (so it looks blown up) and add in a Mover. Then have this Mover's keyframe 1 to somewhere outside the level. Some other properties to take care of are 

*Events
**Tag: Landmine
*Mover:
** bTriggerOnlyOnce: True
** bUseTriggered: True
** MoverEncroachType: IgnoreWhenEncroach
** MoveTime: 0.0000
** StayOpenTime: 0.0000 (equals: stays open infinitely)
*Object
** InitialState: TriggerOpenedTimed

==Conclusion ==

You're basically done :) Boot your level and be carefull where you walk ;).

==Notes ==

I did not take care of any sound related effect in this tutorial. The sound effect (Landmine exploding) can simply be added by adding another SpecialEvent with a InitialState set to PlaySoundEffect. Then giving it the same tag as the other SpecialEvent will trigger this one as well. Perhaps you can also do it with [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]s.

The ExplosionChain can only be fired once. See the [[Legacy:ExplosionChain|ExplosionChain]] class page for a custom script which allows the explosion to be repeatable.

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] topic page

===Discussion===

'''Tarquin:'''  Cool tute, G.o.a.T. :D I've put in some backlinks on the class pages.

'''the G.o.a.T:''' Tnx :) I'm planning on adding some others as well, but I'm still working them out a bit. Stay tuned. ;)

'''VitalOverdose:''' I dont see anything on replication anywhere. Does any of this this work online?

'''UArch:''' take a look at the actors used, triggers, specialevents and an explosion chain, very commonly used actors..be kinda pointless if they didnt work online, half the maps ever made would possibly be broken!

'''SuperApe:''' It should be noted that this tutorial is for UT, as UT2004 (3?) has Triggers -&gt; Landmine.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4299</id>
      <timestamp>2006-05-30T19:31:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>added link to UT2004 LandMine actor</comment>
      <text xml:space="preserve">==Introduction ==

This is a quick and dirty tutorial on how to create basic Landmines in UT, which explode when you 'step' on them.

For the Landmine you'll need to add several new actors to your level. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:ExplosionChain|ExplosionChain]]: This is going to take care of the visual aspect of the Landmine.
* [[Legacy:SpecialEvent|SpecialEvent]]: This will damage the player.
* [[Legacy:Trigger|Trigger]]: This will activate the Landmine.

==Let's get to work ==

===ExplosionChain ===

I added one ExplosionChain to my level.

Once placed in the level, open their properties and make sure these settings are as stated.

*EplosionChain1
**Effects:
***bOnlyTriggerable: True
**Events:
***Tag: Landmine
**Explosionchain:
***Damage: 100.0000000 (you might also remove or decrease this, because the SpecialEvent will also inflict damage).
***DelayTime: 0.10000000
***MomentumTransfer: 100000.000000
***Size: 4

===SpecialEvent ===

I also added one SpecialEvent to my level with these properties.

*SpecialEvent1
**Events:
***Tag: Landmine
**Object:
***InitialState: DamageInstigator (or KillInstigator if you want to kill the player).
**SpecialEvent:
***Damage: 80

===Trigger ===

One Trigger is needed to make this Landmine work. Add it to your level at the position where your Landmine is supposed to be. Also make sure that the ExplosionChain is very close to the Trigger. It doesn't matter where the SpecialEvent is though.

Open the Trigger's properties and verify these settings.

*Trigger1
**Collision:
***CollisionHeight: 16 (*)
***CollisionRadius: 32 (*)
**Events:
***Event: Landmine
**Trigger:
***bTriggerOnceOnly: True

&lt;i&gt;(*): Make sure these settings are rather small. I used 16 and 32, but you might wanna make it even smaller. Landmines are usually not that big. Use the Actor's Radii View to see the actual radius.&lt;/i&gt;

===For more Realism: an extra Mover ===

Also for more 'realism' you can carve out a rough piece out of the floor (so it looks blown up) and add in a Mover. Then have this Mover's keyframe 1 to somewhere outside the level. Some other properties to take care of are 

*Events
**Tag: Landmine
*Mover:
** bTriggerOnlyOnce: True
** bUseTriggered: True
** MoverEncroachType: IgnoreWhenEncroach
** MoveTime: 0.0000
** StayOpenTime: 0.0000 (equals: stays open infinitely)
*Object
** InitialState: TriggerOpenedTimed

==Conclusion ==

You're basically done :) Boot your level and be carefull where you walk ;).

==Notes ==

I did not take care of any sound related effect in this tutorial. The sound effect (Landmine exploding) can simply be added by adding another SpecialEvent with a InitialState set to PlaySoundEffect. Then giving it the same tag as the other SpecialEvent will trigger this one as well. Perhaps you can also do it with [[Legacy:TriggeredAmbientSound|TriggeredAmbientSound]]s.

The ExplosionChain can only be fired once. See the [[Legacy:ExplosionChain|ExplosionChain]] class page for a custom script which allows the explosion to be repeatable.

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] topic page
* [[Legacy:LandMine|LandMine]] &amp;ndash; the corresponding UT2004 actor

===Discussion===

'''Tarquin:'''  Cool tute, G.o.a.T. :D I've put in some backlinks on the class pages.

'''the G.o.a.T:''' Tnx :) I'm planning on adding some others as well, but I'm still working them out a bit. Stay tuned. ;)

'''VitalOverdose:''' I dont see anything on replication anywhere. Does any of this this work online?

'''UArch:''' take a look at the actors used, triggers, specialevents and an explosion chain, very commonly used actors..be kinda pointless if they didnt work online, half the maps ever made would possibly be broken!

'''SuperApe:''' It should be noted that this tutorial is for UT, as UT2004 (3?) has Triggers -&gt; Landmine.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Languard</title>
    <id>1722</id>
    <revision>
      <id>4242</id>
      <timestamp>2005-08-15T02:36:39Z</timestamp>
      <contributor>
        <ip>Zugy</ip>
      </contributor>
      <comment>comment</comment>
      <text xml:space="preserve">----

'''Languard''' aka Rick Fleming

'''Age:''' 29

'''Occupation:''' Programmer for the Kansas Army National Guard

Well, I love gaming. Some day I'll fullfill that mythical dream of making games for a living, but until then I just plan on having fun coding :D  I'm rather new to UT2003 (only had it for about 2 months as of Sep 5th) so my mind is still in the 'holy heck there's a lot to learn here' shock stage, but hopfully after the shock stage is over I'll be able to help out the community.

And I finally have UT2004.  Seesh is it going to take awhile to get back into modding.  Two year breaks suck :p

'''Ex-Projects:'''
* [http://www.thesoulkeeper.com SoulKeeper] A third-person melee combat TC for UT2004.  Check it out!

'''MythOpus:''' Hey... Welcome to The Wiki:) Enjoy Your Stay!

'''Languard:''' So far I'm loving it.  Renews my faith that there is such a thing as non-destructive cooperation on net :cheesy:

'''MythOpus:''' LoL.  Ya this works great :)  There's the occasional page delete but it's all good :cheesy:

'''zugy:''' Welcome back. Fortunately the gap between UT2k3 and 2k4 isn't so bad (or so I hear, I started with 2k4...)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4243</id>
      <timestamp>2005-08-14T23:58:10Z</timestamp>
      <contributor>
        <ip>Languard</ip>
      </contributor>
      <comment>Editing personal information</comment>
      <text xml:space="preserve">----

'''Languard''' aka Rick Fleming

'''Age:''' 29

'''Occupation:''' Programmer for the Kansas Army National Guard

Well, I love gaming. Some day I'll fullfill that mythical dream of making games for a living, but until then I just plan on having fun coding :D  I'm rather new to UT2003 (only had it for about 2 months as of Sep 5th) so my mind is still in the 'holy heck there's a lot to learn here' shock stage, but hopfully after the shock stage is over I'll be able to help out the community.

And I finally have UT2004.  Seesh is it going to take awhile to get back into modding.  Two year breaks suck :p

'''Ex-Projects:'''
* [http://www.thesoulkeeper.com SoulKeeper] A third-person melee combat TC for UT2004.  Check it out!

'''MythOpus:''' Hey... Welcome to The Wiki:) Enjoy Your Stay!

'''Languard:''' So far I'm loving it.  Renews my faith that there is such a thing as non-destructive cooperation on net :cheesy:

'''MythOpus:''' LoL.  Ya this works great :)  There's the occasional page delete but it's all good :cheesy:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Laser Trip Bomb</title>
    <id>1668</id>
    <revision>
      <id>4124</id>
      <timestamp>2007-08-07T14:25:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==What Is A Laser Trip Bomb? ==

This is basically a laser that is projected across a hallway and explodes when you cross it.

==How Do I Make One? ==

===Mover template ===

Make a small cyclinder brush which covers across the hallway, a radius of 8 is good. Rotate it sideways so it is across the hallway. Then press the &quot;Add special brush&quot; icon  and make a masked decoration but make it a non solid.

: the [[Legacy:VolumetricBuilder|VolumetricBuilder]] would make a nice laser effect and would look more 3D

Now the brush is done open up the texture browser and find texture pack uttech3 and use the laser texture.

===Mover ===

Okay thats the look of the laser now we have to make it a [[Legacy:Mover|mover]], because it should disappear when you trigger it. [[Legacy:Create A Mover|Create a mover]] from the template. Delete the template (or move it away somewhere else) and re[[Legacy:Build|build]].

Now we have to set up the laser mover:
* Events -&gt; Tag = laser
* Dynamiclightmover: Set it if you want the laser to look good.
* Triggeronceonly: Set it so it only blows up once
* MoverEncroachType: Another just in case, set to ignore, because if the player hits the mover it will reset, not a good looking idea 
* MoveTime: The trip wire lasers should disappear exactly when its triggered, so set move time to 0
* [[Legacy:InitialState|InitialState]] : Set to TriggerOpenTimed

Set its [[Legacy:Keyframe|keyframe]] 1 out of the map: this is so it disappears when activated.

===SpecialEvent ===

Set up a [[Legacy:SpecialEvent|SpecialEvent]] as follows. Further options (such as death messages) are explained on the page for that actor.

* Events -&gt; Tag = laser
* If you want the player to die immediately set intitalstate to Killinstigator, but if you want a specified amount of damage, set it to damage instigator.
* Damage: Thats a fair amount, and you can always leave a die message if you want. 

===Adding explosion  ===

Add an Actor &gt;&gt; Effects &gt;&gt; [[Legacy:ExplosionChain|ExplosionChain]]. Add it on the wall or something so it looks like the bomb are on the wall. 

* Onlytriggerable: True
* Tag: laser
* Size: Might wanna increase the explosion a bit, set it to 4 instead of 1, and set delay time to 0.1

You could also add more explosion chains, it looks a bit tame with only 1 ingame, I suggest add 1 on each site and set explosion size to 4

===Triggers ===

Now add a few triggers to cover the length of the laser and set their Event to &quot;laser&quot; and triggerable only once = true
 

==Comments ==

'''Wormbo:''' This could also be coded as a [[Legacy:Projectile (UT)|Projectile (UT)]] subclass for the bomb and an [[Legacy:Effects (UT)|Effects (UT)]] subclass for the laser which works like the Pulsegun beam. Either the laser effect parts trigger the bomb in their Touch function or the bomb actor uses Trace or ForEach TraceActors(...) to check whether something goes through the laser beam.

'''Tarquin:''' Yeah, I've always figured there's a lot that could be done with Pulsegun-style beams.

'''Darkwarrior:''' Does anyone know how you would make something like this as a weapon? Or even if it can be done? (e.g. The tripmines in Half-life)

'''Daid303:''' Look for weaponsfactory (UT mod) it has a trip mine, and a good one too.

'''Darkwarrior:''' Yes, I've seen the tripmine in that mod but there are two problems. It isnt a weapon and it doesnt explode. If i knew more about Uscript then that wouldnt be a problem, but I know stuff all so it is a problem.

'''Zygar:''' I'm going to make a trip mine once I've learned uscript.

'''Darkwarrior:''' And I bet it will never get finished, just like all the supposedly awesome maps you keep telling me about.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4125</id>
      <timestamp>2005-01-11T15:28:06Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==What Is A Laser Trip Bomb? ==

This is basically a laser that is projected across a hallway and explodes when you cross it.

==How Do I Make One? ==

===Mover template ===

Make a small cyclinder brush which covers across the hallway, a radius of 8 is good. Rotate it sideways so it is across the hallway. Then press the &quot;Add special brush&quot; icon  and make a masked decoration but make it a non solid.

: the [[Legacy:VolumetricBuilder|VolumetricBuilder]] would make a nice laser effect and would look more 3D

Now the brush is done open up the texture browser and find texture pack uttech3 and use the laser texture.

===Mover ===

Okay thats the look of the laser now we have to make it a [[Legacy:Mover|mover]], because it should disappear when you trigger it. [[Legacy:Create A Mover|Create a mover]] from the template. Delete the template (or move it away somewhere else) and re[[Legacy:Build|build]].

Now we have to set up the laser mover:
* Events -&gt; Tag = laser
* Dynamiclightmover: Set it if you want the laser to look good.
* Triggeronceonly: Set it so it only blows up once
* MoverEncroachType: Another just in case, set to ignore, because if the player hits the mover it will reset, not a good looking idea 
* MoveTime: The trip wire lasers should disappear exactly when its triggered, so set move time to 0
* [[Legacy:InitialState|InitialState]] : Set to TriggerOpenTimed

Set its [[Legacy:Keyframe|keyframe]] 1 out of the map: this is so it disappears when activated.

===SpecialEvent ===

Set up a [[Legacy:SpecialEvent|SpecialEvent]] as follows. Further options (such as death messages) are explained on the page for that actor.

* Events -&gt; Tag = laser
* If you want the player to die immediately set intitalstate to Killinstigator, but if you want a specified amount of damage, set it to damage instigator.
* Damage: Thats a fair amount, and you can always leave a die message if you want. 

===Adding explosion  ===

Add an Actor &gt;&gt; Effects &gt;&gt; [[Legacy:ExplosionChain|ExplosionChain]]. Add it on the wall or something so it looks like the bomb are on the wall. 

* Onlytriggerable: True
* Tag: laser
* Size: Might wanna increase the explosion a bit, set it to 4 instead of 1, and set delay time to 0.1

You could also add more explosion chains, it looks a bit tame with only 1 ingame, I suggest add 1 on each site and set explosion size to 4

===Triggers ===

Now add a few triggers to cover the length of the laser and set their Event to &quot;laser&quot; and triggerable only once = true
 

==Comments ==

'''Wormbo:''' This could also be coded as a [[Legacy:Projectile (UT)|Projectile (UT)]] subclass for the bomb and an [[Legacy:Effects (UT)|Effects (UT)]] subclass for the laser which works like the Pulsegun beam. Either the laser effect parts trigger the bomb in their Touch function or the bomb actor uses Trace or ForEach TraceActors(...) to check whether something goes through the laser beam.

'''Tarquin:''' Yeah, I've always figured there's a lot that could be done with Pulsegun-style beams.

'''Darkwarrior:''' Does anyone know how you would make something like this as a weapon? Or even if it can be done? (e.g. The tripmines in Half-life)

'''Daid303:''' Look for weaponsfactory (UT mod) it has a trip mine, and a good one too.

'''Darkwarrior:''' Yes, I've seen the tripmine in that mod but there are two problems. It isnt a weapon and it doesnt explode. If i knew more about Uscript then that wouldnt be a problem, but I know stuff all so it is a problem.

'''Zygar:''' I'm going to make a trip mine once I've learned uscript.

'''Darkwarrior:''' And I bet it will never get finished, just like all the supposedly awesome maps you keep telling me about.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4126</id>
      <timestamp>2007-08-07T14:22:59Z</timestamp>
      <contributor>
        <ip>Arkady.indymedia.org</ip>
      </contributor>
      <comment>*Laser Trip Bobm</comment>
      <text xml:space="preserve">==What Is A Laser Trip Bomb? ==

This is basically a laser that is projected across a hallway and explodes when you cross it.

==How Do I Make One? ==

===Mover template ===

Make a small cyclinder brush which covers across the hallway, a radius of 8 is good. Rotate it sideways so it is across the hallway. Then press the &quot;Add special brush&quot; icon  and make a masked decoration but make it a non solid.

: the [[Legacy:VolumetricBuilder|VolumetricBuilder]] would make a nice laser effect and would look more 3D

Now the brush is done open up the [http://www.bestessaytips.com/ best essay tips] texture browser and find texture pack uttech3 and use the laser texture.

===Mover ===

Okay thats the look of the laser now we have to make it a [[Legacy:Mover|mover]], because it should disappear when you trigger it. [[Legacy:Create A Mover|Create a mover]] from the template. Delete the template (or move it away somewhere else) and re[[Legacy:Build|build]].

Now we have to set up the laser mover:
* Events -&gt; Tag = laser
* Dynamiclightmover: Set it if you want the laser to look good.
* Triggeronceonly: Set it so it only blows up once
* MoverEncroachType: Another just in case, set to ignore, because if the player hits the mover it will reset, not a good looking idea 
* MoveTime: The trip wire lasers should disappear exactly when its triggered, so set move time to 0
* [[Legacy:InitialState|InitialState]] : Set to TriggerOpenTimed

Set its [[Legacy:Keyframe|keyframe]] 1 out of the map: this is so it disappears when activated.

===SpecialEvent ===

Set up a [[Legacy:SpecialEvent|SpecialEvent]] as follows. Further options (such as death messages) are explained on the page for that actor.

* Events -&gt; Tag = laser
* If you want the player to die immediately set intitalstate to Killinstigator, but if you want a specified amount of damage, set it to damage instigator.
* Damage: Thats a fair amount, and you can always leave a die message if you want. 

===Adding explosion  ===

Add an Actor &gt;&gt; Effects &gt;&gt; [[Legacy:ExplosionChain|ExplosionChain]]. Add it on the wall or something so it looks like the bomb are on the wall. 

* Onlytriggerable: True
* Tag: laser
* Size: Might wanna increase the explosion a bit, set it to 4 instead of 1, and set delay time to 0.1

You could also add more explosion chains, it looks a bit tame with only 1 ingame, I suggest add 1 on each site and set explosion size to 4

===Triggers ===

Now add a few triggers to cover the length of the laser and set their Event to &quot;laser&quot; and triggerable only once = true
 

==Comments ==

'''Wormbo:''' This could also be coded as a [[Legacy:Projectile (UT)|Projectile (UT)]] subclass for the bomb and an [[Legacy:Effects (UT)|Effects (UT)]] subclass for the laser which works like the Pulsegun beam. Either the laser effect parts trigger the bomb in their Touch function or the bomb actor uses Trace or ForEach TraceActors(...) to check whether something goes through the laser beam.

'''Tarquin:''' Yeah, I've always figured there's a lot that could be done with Pulsegun-style beams.

'''Darkwarrior:''' Does anyone know how you would make something like this as a weapon? Or even if it can be done? (e.g. The tripmines in Half-life)

'''Daid303:''' Look for weaponsfactory (UT mod) it has a trip mine, and a good one too.

'''Darkwarrior:''' Yes, I've seen the tripmine in that mod but there are two problems. It isnt a weapon and it doesnt explode. If i knew more about Uscript then that wouldnt be a problem, but I know stuff all so it is a problem.

'''Zygar:''' I'm going to make a trip mine once I've learned uscript.

'''Darkwarrior:''' And I bet it will never get finished, just like all the supposedly awesome maps you keep telling me about.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43318</id>
      <timestamp>2010-05-21T17:03:43Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve">==What Is A Laser Trip Bomb? ==

This is basically a laser that is projected across a hallway and [http://www.bestessaytips.com best essay tips] explodes when you cross it.

==How Do I Make One? ==

===Mover template ===

Make a small cyclinder brush which covers across the hallway, a radius of 8 is good. Rotate it sideways so it is across the hallway. Then press the &quot;Add special brush&quot; icon  and make a masked decoration but make it a non solid.

: the [[Legacy:VolumetricBuilder|VolumetricBuilder]] would make a nice laser effect and would look more 3D

Now the brush is done open up the texture browser and find texture pack uttech3 and use the laser texture.

===Mover ===

Okay thats the look of the laser now we have to make it a [[Legacy:Mover|mover]], because it should disappear when you trigger it. [[Legacy:Create A Mover|Create a mover]] from the template. Delete the template (or move it away somewhere else) and re[[Legacy:Build|build]].

Now we have to set up the laser mover:
* Events -&gt; Tag = laser
* Dynamiclightmover: Set it if you want the laser to look good.
* Triggeronceonly: Set it so it only blows up once
* MoverEncroachType: Another just in case, set to ignore, because if the player hits the mover it will reset, not a good looking idea 
* MoveTime: The trip wire lasers should disappear exactly when its triggered, so set move time to 0
* [[Legacy:InitialState|InitialState]] : Set to TriggerOpenTimed

Set its [[Legacy:Keyframe|keyframe]] 1 out of the map: this is so it disappears when activated.

===SpecialEvent ===

Set up a [[Legacy:SpecialEvent|SpecialEvent]] as follows. Further options (such as death messages) are explained on the page for that actor.

* Events -&gt; Tag = laser
* If you want the player to die immediately set intitalstate to Killinstigator, but if you want a specified amount of damage, set it to damage instigator.
* Damage: Thats a fair amount, and you can always leave a die message if you want. 

===Adding explosion  ===

Add an Actor &gt;&gt; Effects &gt;&gt; [[Legacy:ExplosionChain|ExplosionChain]]. Add it on the wall or something so it looks like the bomb are on the wall. 

* Onlytriggerable: True
* Tag: laser
* Size: Might wanna increase the explosion a bit, set it to 4 instead of 1, and set delay time to 0.1

You could also add more explosion chains, it looks a bit tame with only 1 ingame, I suggest add 1 on each site and set explosion size to 4

===Triggers ===

Now add a few triggers to cover the length of the laser and set their Event to &quot;laser&quot; and triggerable only once = true
 

==Comments ==

'''Wormbo:''' This could also be coded as a [[Legacy:Projectile (UT)|Projectile (UT)]] subclass for the bomb and an [[Legacy:Effects (UT)|Effects (UT)]] subclass for the laser which works like the Pulsegun beam. Either the laser effect parts trigger the bomb in their Touch function or the bomb actor uses Trace or ForEach TraceActors(...) to check whether something goes through the laser beam.

'''Tarquin:''' Yeah, I've always figured there's a lot that could be done with Pulsegun-style beams.

'''Darkwarrior:''' Does anyone know how you would make something like this as a weapon? Or even if it can be done? (e.g. The tripmines in Half-life)

'''Daid303:''' Look for weaponsfactory (UT mod) it has a trip mine, and a good one too.

'''Darkwarrior:''' Yes, I've seen the tripmine in that mod but there are two problems. It isnt a weapon and it doesnt explode. If i knew more about Uscript then that wouldnt be a problem, but I know stuff all so it is a problem.

'''Zygar:''' I'm going to make a trip mine once I've learned uscript.

'''Darkwarrior:''' And I bet it will never get finished, just like all the supposedly awesome maps you keep telling me about.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43332</id>
      <timestamp>2010-05-22T04:23:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">==What Is A Laser Trip Bomb? ==

This is basically a laser that is projected across a hallway and explodes when you cross it.

==How Do I Make One? ==

===Mover template ===

Make a small cyclinder brush which covers across the hallway, a radius of 8 is good. Rotate it sideways so it is across the hallway. Then press the &quot;Add special brush&quot; icon  and make a masked decoration but make it a non solid.

: the [[Legacy:VolumetricBuilder|VolumetricBuilder]] would make a nice laser effect and would look more 3D

Now the brush is done open up the texture browser and find texture pack uttech3 and use the laser texture.

===Mover ===

Okay thats the look of the laser now we have to make it a [[Legacy:Mover|mover]], because it should disappear when you trigger it. [[Legacy:Create A Mover|Create a mover]] from the template. Delete the template (or move it away somewhere else) and re[[Legacy:Build|build]].

Now we have to set up the laser mover:
* Events -&gt; Tag = laser
* Dynamiclightmover: Set it if you want the laser to look good.
* Triggeronceonly: Set it so it only blows up once
* MoverEncroachType: Another just in case, set to ignore, because if the player hits the mover it will reset, not a good looking idea 
* MoveTime: The trip wire lasers should disappear exactly when its triggered, so set move time to 0
* [[Legacy:InitialState|InitialState]] : Set to TriggerOpenTimed

Set its [[Legacy:Keyframe|keyframe]] 1 out of the map: this is so it disappears when activated.

===SpecialEvent ===

Set up a [[Legacy:SpecialEvent|SpecialEvent]] as follows. Further options (such as death messages) are explained on the page for that actor.

* Events -&gt; Tag = laser
* If you want the player to die immediately set intitalstate to Killinstigator, but if you want a specified amount of damage, set it to damage instigator.
* Damage: Thats a fair amount, and you can always leave a die message if you want. 

===Adding explosion  ===

Add an Actor &gt;&gt; Effects &gt;&gt; [[Legacy:ExplosionChain|ExplosionChain]]. Add it on the wall or something so it looks like the bomb are on the wall. 

* Onlytriggerable: True
* Tag: laser
* Size: Might wanna increase the explosion a bit, set it to 4 instead of 1, and set delay time to 0.1

You could also add more explosion chains, it looks a bit tame with only 1 ingame, I suggest add 1 on each site and set explosion size to 4

===Triggers ===

Now add a few triggers to cover the length of the laser and set their Event to &quot;laser&quot; and triggerable only once = true
 

==Comments ==

'''Wormbo:''' This could also be coded as a [[Legacy:Projectile (UT)|Projectile (UT)]] subclass for the bomb and an [[Legacy:Effects (UT)|Effects (UT)]] subclass for the laser which works like the Pulsegun beam. Either the laser effect parts trigger the bomb in their Touch function or the bomb actor uses Trace or ForEach TraceActors(...) to check whether something goes through the laser beam.

'''Tarquin:''' Yeah, I've always figured there's a lot that could be done with Pulsegun-style beams.

'''Darkwarrior:''' Does anyone know how you would make something like this as a weapon? Or even if it can be done? (e.g. The tripmines in Half-life)

'''Daid303:''' Look for weaponsfactory (UT mod) it has a trip mine, and a good one too.

'''Darkwarrior:''' Yes, I've seen the tripmine in that mod but there are two problems. It isnt a weapon and it doesnt explode. If i knew more about Uscript then that wouldnt be a problem, but I know stuff all so it is a problem.

'''Zygar:''' I'm going to make a trip mine once I've learned uscript.

'''Darkwarrior:''' And I bet it will never get finished, just like all the supposedly awesome maps you keep telling me about.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LastManStanding</title>
    <id>1670</id>
    <revision>
      <id>4129</id>
      <timestamp>2005-12-29T02:22:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>commentary removed</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; LastManStanding (Package: BotPack)}}

Last Man Standing is a gametype in which players attempt to survive instead of kill.  The players start with a number of lives instead of a fraglimit and attempt to be the last one left with at least one life.

See also [[Legacy:XLastManStandingGame|xLastManStandingGame]] for the GameInfo class for UT2004.

==Properties==
; string AltStartupMessage (localized) : Displayed for players who entered the game after 15% of the total possible frags in the game have been made. Those players will join as spectators.
; bool bHighDetailGhosts (config) : &quot;Ghosts&quot; are players that have no more lives left. If this is set to true, ghosts don't become invisible like regular spectators. ''(Gotta test this...)''
; int Lives : Amount of lives each player has at the start of the match. Set to 10 if FragLimit isn't set, otherwise set to FragLimit.
; [[Legacy:PlayerPawn|PlayerPawn]] LocalPlayer : The local PlayerPawn.
; int TotalKills : Total number of kills already made in this match.
; int NumGhosts : Number of players without any lives left.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4130</id>
      <timestamp>2003-03-20T08:06:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; LastManStanding (Package: BotPack)}}

Last Man Standing...well, if you don't know what the game type is, you've spend WAY too much time in UnrealEd and not enough in UT :P

Last Man Standing is a gametype in which players attempt to survive instead of kill.  The players start with a number of lives instead of a fraglimit and attempt to be the last one left with at least one life.

==Properties ==
; string AltStartupMessage (localized) : Displayed for players who entered the game after 15% of the total possible frags in the game have been made. Those players will join as spectators.
; bool bHighDetailGhosts (config) : &quot;Ghosts&quot; are players that have no more lives left. If this is set to true, ghosts don't become invisible like regular spectators. ''(Gotta test this...)''
; int Lives : Amount of lives each player has at the start of the match. Set to 10 if FragLimit isn't set, otherwise set to FragLimit.
; [[Legacy:PlayerPawn|PlayerPawn]] LocalPlayer : The local PlayerPawn.
; int TotalKills : Total number of kills already made in this match.
; int NumGhosts : Number of players without any lives left.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4131</id>
      <timestamp>2005-12-16T23:45:25Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:GameInfo (UT)|GameInfo (UT)]] &gt;&gt; [[Legacy:TournamentGameInfo|TournamentGameInfo]] &gt;&gt; [[Legacy:DeathMatchPlus|DeathMatchPlus]] &gt;&gt; LastManStanding (Package: BotPack)}}

Last Man Standing...well, if you don't know what the game type is, you've spend WAY too much time in UnrealEd and not enough in UT :P

Last Man Standing is a gametype in which players attempt to survive instead of kill.  The players start with a number of lives instead of a fraglimit and attempt to be the last one left with at least one life.

See also [[Legacy:XLastManStandingGame|xLastManStandingGame]] for the GameInfo class for UT2004.

==Properties==
; string AltStartupMessage (localized) : Displayed for players who entered the game after 15% of the total possible frags in the game have been made. Those players will join as spectators.
; bool bHighDetailGhosts (config) : &quot;Ghosts&quot; are players that have no more lives left. If this is set to true, ghosts don't become invisible like regular spectators. ''(Gotta test this...)''
; int Lives : Amount of lives each player has at the start of the match. Set to 10 if FragLimit isn't set, otherwise set to FragLimit.
; [[Legacy:PlayerPawn|PlayerPawn]] LocalPlayer : The local PlayerPawn.
; int TotalKills : Total number of kills already made in this match.
; int NumGhosts : Number of players without any lives left.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Latent Function</title>
    <id>1672</id>
    <revision>
      <id>4135</id>
      <timestamp>2006-03-13T10:51:13Z</timestamp>
      <contributor>
        <ip>P54B6FE4D.dip.t-dialin.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Latent functions''' are special functions which are expected to take some time for execution, not because they use the processor heavily, but because they contain intentional slow-downs (for example if they have to wait for a certain in-game event to occur before they can continue)

Latent functions can only be used in [[Legacy:State|state]] code (i.e. in labels outside of functions within states. See [[Legacy:ScriptedPawn|ScriptedPawn]]'s script for excellent examples), which is not contained in an [[Legacy:Iterator|Iterator]] (ForEach) loop. They will cause script execution within the state to pause until some condition is met. All other functions and states in other classes will continue to execute normally.

Technical mojo from [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]]:

{{innerbox|  Functions which require game-time to pass are called &quot;latent functions&quot;. Some examples of latent functions include &quot;Sleep&quot;, &quot;FinishAnim&quot;, and &quot;MoveTo&quot;. Latent functions in UnrealScript may only be called from code within a state, not from code within a function.

}}

{{innerbox| While an actor is executing a latent function, that actor's state execution doesn't continue until the latent function completes. However, other actors, or the VM, may call functions within the actor. The net result is that all UnrealScript functions can be called at any time, even while latent functions are pending.

}}

and also

{{innerbox| It is important to note that in Unreal, because the user can save the game at any time, the state of all actors, including their script execution state, can be saved at any time where all actors are at their lowest possible stack level. This persistence requirement is the reason behind the limitation that latent functions may only be called from state code: state code executes at the lowest possible stack level, and thus can be serialized easily. Function code may exist at any stack level, and could have (for example) C++ native functions below it on the stack, which is clearly not a situation which one could save on disk and later restore.

}}

Latent functions require some time to be executed. Typical examples are ''Sleep'' which waits for the specified amount of time before returning and ''FinishAnim'' which returns when the current animation has finished.

Latent functions can only be called from state code or from other latent functions. Latent functions have to be native. 

While you cannot define new latent functions, it is possible to pull a similar effect:

&lt;uscript&gt;
While (!SomeConditionIsMet()) //Pause until this function returns true
  Sleep(0.0);
&lt;/uscript&gt;

==Lists ==
* [[Legacy:Actor (UT)/Functions|Actor (UT)/Functions]]
* [[Legacy:Pawn (UT)/Movement|Pawn (UT)/Movement]]
* [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Function Syntax|Function Syntax]]

----

'''Tarquin:''' Needs some more info. Is there documentation for the actual functions such as Sleep()?

'''Wormbo:''' In UT2003 there are only three classes with a few latent functions ([[Legacy:Actor|Actor]], [[Legacy:Controller|Controller]] and [[Legacy:AIController|AIController]]), so we could as well list and describe them here. Unreal and UT have only two classes with latent functions ([[Legacy:Actor (UT)|Actor (UT)]] and [[Legacy:Pawn (UT)|Pawn (UT)]]).</text>
    </revision>
    <revision>
      <id>4136</id>
      <timestamp>2006-03-09T10:27:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>latent functions are not allowed inside foreach loops in state code</comment>
      <text xml:space="preserve">'''Latent functions''' are special native functions that can only be used in [[Legacy:State|state]] code (i.e. in labels outside of functions within states. See [[Legacy:ScriptedPawn|ScriptedPawn]]'s script for excellent examples), which is not contained in an [[Legacy:Iterator|Iterator]] (ForEach) loop. They will cause script execution within the state to pause until some condition is met. All other functions and states in other classes will continue to execute normally.

Technical mojo from [[Legacy:UnrealScript Language Reference|UnrealScript Language Reference]]:

{{innerbox|  Functions which require game-time to pass are called &quot;latent functions&quot;. Some examples of latent functions include &quot;Sleep&quot;, &quot;FinishAnim&quot;, and &quot;MoveTo&quot;. Latent functions in UnrealScript may only be called from code within a state, not from code within a function.

}}

{{innerbox| While an actor is executing a latent function, that actor's state execution doesn't continue until the latent function completes. However, other actors, or the VM, may call functions within the actor. The net result is that all UnrealScript functions can be called at any time, even while latent functions are pending.

}}

and also

{{innerbox| It is important to note that in Unreal, because the user can save the game at any time, the state of all actors, including their script execution state, can be saved at any time where all actors are at their lowest possible stack level. This persistence requirement is the reason behind the limitation that latent functions may only be called from state code: state code executes at the lowest possible stack level, and thus can be serialized easily. Function code may exist at any stack level, and could have (for example) C++ native functions below it on the stack, which is clearly not a situation which one could save on disk and later restore.

}}

Latent functions require some time to be executed. Typical examples are ''Sleep'' which waits for the specified amount of time before returning and ''FinishAnim'' which returns when the current animation has finished.

Latent functions can only be called from state code or from other latent functions. Latent functions have to be native. 

While you cannot define new latent functions, it is possible to pull a similar effect:

&lt;uscript&gt;
While (!SomeConditionIsMet()) //Pause until this function returns true
  Sleep(0.0);
&lt;/uscript&gt;

==Lists ==
* [[Legacy:Actor (UT)/Functions|Actor (UT)/Functions]]
* [[Legacy:Pawn (UT)/Movement|Pawn (UT)/Movement]]
* [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]

==Related Topics ==
* [[Legacy:UnrealScript|UnrealScript]]
** [[Legacy:Function Syntax|Function Syntax]]

----

'''Tarquin:''' Needs some more info. Is there documentation for the actual functions such as Sleep()?

'''Wormbo:''' In UT2003 there are only three classes with a few latent functions ([[Legacy:Actor|Actor]], [[Legacy:Controller|Controller]] and [[Legacy:AIController|AIController]]), so we could as well list and describe them here. Unreal and UT have only two classes with latent functions ([[Legacy:Actor (UT)|Actor (UT)]] and [[Legacy:Pawn (UT)|Pawn (UT)]]).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Launch A Local Netgame</title>
    <id>1732</id>
    <revision>
      <id>4263</id>
      <timestamp>2007-11-29T22:55:07Z</timestamp>
      <contributor>
        <ip>124-168-174-192.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] page.

# Start a '''Dedicated Server'''. Two ways to do this:
#* from within the game by checking the &quot;dedicated server&quot; checkbox
#* using the &lt;code&gt;ucc server&lt;/code&gt; command &amp;ndash; the latter is usually more convenient if you're frequently starting a test server. See [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]] for more on this.

# If you are running Windows 9x/ME, you'll need to tell the operating system that it should run the server with a higher priority than normal, or the client will take all the processor resources and will leave none for the server.  (Users of Windows NT/2000/XP don't need to do the following; their operating system handles processor resources more gracefully.)
# * Download the [http://www.planetunreal.com/pipeline/tutorials/priority.zip Priority] command line tool.
# * In a DOS window, enter &lt;code&gt;priority -title ucc&lt;/code&gt;.  This increases the server process's execution priority.

# Start the game client (ie, run UT2004 again) and connect to 127.0.0.1 (or &quot;localhost&quot;, whichever you like better).

==Related Topics==
* [[Legacy:Debugging Techniques|Debugging Techniques]]
* [[Legacy:Replication|Replication]]
* [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]

==Discussion==

'''SuperApe:''' You can also simply go through the UT200x menu and select Host A Game -&gt; DedicatedServer.  Then, launch UT200x again and select Join A Game -&gt; Your machine (or using [[Legacy:Console Commands|Console Commands]], &quot;map 127.0.0.1&quot;).  Does this cause a lot of overhead on the Server?

'''Switch`:''' Server will be affected by resource-hungry apps (ie client, wotgreal, anything) running on the same or higher priority. Put server on high priority to avoid that. If your hardware is good enough to run a server and your mods arent buggy server will use only a small part of the cpu. When starting another client put the currently running ones on low priority temporarily to speed up loading significantly.

'''HunterKiller:''' Have you noticed that UT2004 is not allowing to be launched multiple times? At least from the same folder, running on Windows XP, whenever I try to start another copy, the running game gets focus. I am trying to test a listen server. 

'''SuperApe:''' Right.  ''ListenServer'' means your local machine wants to both be a server and a client machine.  It won't allow multiple sessions.  That's why this Basic Procedure talks about running it as a '''DedicatedServer''', which means it will only act as a server.  At that time, you can run a client session on the same machine.

'''Wormbo:''' Some things need to be tested on a listen server as well, because having a local player on the server can cause problems that don't appear in standalone or client/server games.

'''SuperApe:''' Point well taken.  So in that case, HK would have to run his ListenServer with more than one machine to test, correct?

'''OlympusMons:''' Dunno if this would work but if you dont have a lan or internet server handy perhaps you could try running a copy from 2 different user profiles.

'''XxDangerxX:''' Is there a way to do this on UT99? I wouldn't want to have to buy an old laptop for $200 just to test a mod in a network game. :(

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4264</id>
      <timestamp>2006-09-13T11:31:41Z</timestamp>
      <contributor>
        <ip>122.053.dsl.pth.iprimus.net.au</ip>
      </contributor>
      <comment>reply/comment hehe</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] page.

# Start a '''Dedicated Server'''. Two ways to do this:
#* from within the game by checking the &quot;dedicated server&quot; checkbox
#* using the &lt;code&gt;ucc server&lt;/code&gt; command &amp;ndash; the latter is usually more convenient if you're frequently starting a test server. See [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]] for more on this.

# If you are running Windows 9x/ME, you'll need to tell the operating system that it should run the server with a higher priority than normal, or the client will take all the processor resources and will leave none for the server.  (Users of Windows NT/2000/XP don't need to do the following; their operating system handles processor resources more gracefully.)
# * Download the [http://www.planetunreal.com/pipeline/tutorials/priority.zip Priority] command line tool.
# * In a DOS window, enter &lt;code&gt;priority -title ucc&lt;/code&gt;.  This increases the server process's execution priority.

# Start the game client (ie, run UT2004 again) and connect to 127.0.0.1 (or &quot;localhost&quot;, whichever you like better).

==Related Topics==
* [[Legacy:Debugging Techniques|Debugging Techniques]]
* [[Legacy:Replication|Replication]]
* [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]

==Discussion==

'''SuperApe:''' You can also simply go through the UT200x menu and select Host A Game -&gt; DedicatedServer.  Then, launch UT200x again and select Join A Game -&gt; Your machine (or using [[Legacy:Console Commands|Console Commands]], &quot;map 127.0.0.1&quot;).  Does this cause a lot of overhead on the Server?

'''Switch`:''' Server will be affected by resource-hungry apps (ie client, wotgreal, anything) running on the same or higher priority. Put server on high priority to avoid that. If your hardware is good enough to run a server and your mods arent buggy server will use only a small part of the cpu. When starting another client put the currently running ones on low priority temporarily to speed up loading significantly.

'''HunterKiller:''' Have you noticed that UT2004 is not allowing to be launched multiple times? At least from the same folder, running on Windows XP, whenever I try to start another copy, the running game gets focus. I am trying to test a listen server. 

'''SuperApe:''' Right.  ''ListenServer'' means your local machine wants to both be a server and a client machine.  It won't allow multiple sessions.  That's why this Basic Procedure talks about running it as a '''DedicatedServer''', which means it will only act as a server.  At that time, you can run a client session on the same machine.

'''Wormbo:''' Some things need to be tested on a listen server as well, because having a local player on the server can cause problems that don't appear in standalone or client/server games.

'''SuperApe:''' Point well taken.  So in that case, HK would have to run his ListenServer with more than one machine to test, correct?

'''OlympusMons:''' Dunno if this would work but if you dont have a lan or internet server handy perhaps you could try running a copy from 2 different user profiles.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4265</id>
      <timestamp>2007-11-29T22:54:39Z</timestamp>
      <contributor>
        <ip>124-168-174-192.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a [[:Category:Legacy Basic Procedure]] page.

# Start a '''Dedicated Server'''. Two ways to do this:
#* from within the game by checking the &quot;dedicated server&quot; checkbox
#* using the &lt;code&gt;ucc server&lt;/code&gt; command &amp;ndash; the latter is usually more convenient if you're frequently starting a test server. See [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]] for more on this.

# If you are running Windows 9x/ME, you'll need to tell the operating system that it should run the server with a higher priority than normal, or the client will take all the processor resources and will leave none for the server.  (Users of Windows NT/2000/XP don't need to do the following; their operating system handles processor resources more gracefully.)
# * Download the [http://www.planetunreal.com/pipeline/tutorials/priority.zip Priority] command line tool.
# * In a DOS window, enter &lt;code&gt;priority -title ucc&lt;/code&gt;.  This increases the server process's execution priority.

# Start the game client (ie, run UT2004 again) and connect to 127.0.0.1 (or &quot;localhost&quot;, whichever you like better).

==Related Topics==
* [[Legacy:Debugging Techniques|Debugging Techniques]]
* [[Legacy:Replication|Replication]]
* [[Legacy:Running A Dedicated Server With UCC|Running A Dedicated Server With UCC]]

==Discussion==

'''SuperApe:''' You can also simply go through the UT200x menu and select Host A Game -&gt; DedicatedServer.  Then, launch UT200x again and select Join A Game -&gt; Your machine (or using [[Legacy:Console Commands|Console Commands]], &quot;map 127.0.0.1&quot;).  Does this cause a lot of overhead on the Server?

'''Switch`:''' Server will be affected by resource-hungry apps (ie client, wotgreal, anything) running on the same or higher priority. Put server on high priority to avoid that. If your hardware is good enough to run a server and your mods arent buggy server will use only a small part of the cpu. When starting another client put the currently running ones on low priority temporarily to speed up loading significantly.

'''HunterKiller:''' Have you noticed that UT2004 is not allowing to be launched multiple times? At least from the same folder, running on Windows XP, whenever I try to start another copy, the running game gets focus. I am trying to test a listen server. 

'''SuperApe:''' Right.  ''ListenServer'' means your local machine wants to both be a server and a client machine.  It won't allow multiple sessions.  That's why this Basic Procedure talks about running it as a '''DedicatedServer''', which means it will only act as a server.  At that time, you can run a client session on the same machine.

'''Wormbo:''' Some things need to be tested on a listen server as well, because having a local player on the server can cause problems that don't appear in standalone or client/server games.

'''SuperApe:''' Point well taken.  So in that case, HK would have to run his ListenServer with more than one machine to test, correct?

'''OlympusMons:''' Dunno if this would work but if you dont have a lan or internet server handy perhaps you could try running a copy from 2 different user profiles.

'''XxDangerxX:''' Is there a way to do this on UT99? I wouldn't want to have to buy an old laptop for $200 just to test a mod in a network game. ;)

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LavaVolume</title>
    <id>28328</id>
    <revision>
      <id>39995</id>
      <timestamp>2009-11-14T20:14:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LavaZone</title>
    <id>1644</id>
    <revision>
      <id>4071</id>
      <timestamp>2003-05-27T08:24:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; LavaZone (Package: UnrealShare)}}

A LavaZone actor, when placed into a sealed zone (see [[Legacy:Zoning|zoning]]), fills the zone with lava. The actor has things like the splash sound that entering the lava makes all built in.

The LavaZone actor doesn't provide any additional script, the same effect could be achieved by a normal ZoneInfo actor when changing its properties to the correct values.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4072</id>
      <timestamp>2002-01-29T13:40:55Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; LavaZone}}

A LavaZone [[Legacy:ZoneInfo|ZoneInfo]] actor, when placed into a sealed zone (see [[Legacy:Zoning|zoning]]), fills the zone with lava. The actor has things like the splash sound that entering the lava makes all built in.

===Default properties ===

The LavaZone actor doesn't provide any additional script, the same effect could be achieved by a normal ZoneInfo actor using these properties:

''DamagePerSec'' = 40&lt;br /&gt;

''DamageType'' = Burned&lt;br&gt;

''EntrySound'' = Sound'UnrealShare.Generic.LavaEn'&lt;br&gt;

''ExitSound'' = Sound'UnrealShare.Generic.LavaEx'&lt;br&gt;

''EntryActor'' = Class'UnrealShare.FlameExplosion'&lt;br&gt;

''ExitActor'' = Class'UnrealShare.FlameExplosion'&lt;br&gt;

''bWaterZone'' = True&lt;br&gt;

''bPainZone'' = True&lt;br&gt;

''bDestructive'' = True&lt;br&gt;

''bNoInventory'' = True&lt;br&gt;

''ViewFog'' = (X=0.585938,Y=0.195313,Z=0.078125)&lt;br&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lazarus</title>
    <id>1702</id>
    <revision>
      <id>4204</id>
      <timestamp>2003-05-10T23:40:06Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Unreal Wiki.

'''CH3Z:''' =)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4205</id>
      <timestamp>2003-05-10T21:23:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Unreal Wiki.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LazyDave</title>
    <id>1685</id>
    <revision>
      <id>4166</id>
      <timestamp>2002-12-18T22:20:10Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;b&gt;_tprintf(_T(&quot;Hello, Wiki!\n&quot;));&lt;/b&gt;

====Overview ====

New to Unreal as of UT2k3, currently leeching off the collective knowledge of the community.  Can't map worth a damn and MSPaint is my texture editor of choice.  By day I'm a win32 &quot;Software Engineer&quot; and lately, most nights are spent exploring the depths of this thing we call Unreal.

====Projects ====

Since I'm still in the exciting exploration phase, I'm currently writing mutators just for a better understanding of the underlying system.  If I stumble upon something that I'm not embarrased of I'll share it, but don't expect anything soon.  Have a few more ambitious mutator and game type ideas, but at this point in the learning curve they're little more than a design doc full of questions.  &quot;Is it even possible to do this?&quot;

----

'''Wormbo:''' Welcome to the Wiki. :)

'''Tarquin:''' Hello &amp; welcome. Feel free to update our &quot;introduction to Unrealscript&quot; areas if they're not clear enough for beginners :)

'''EntropicLqd:''' Welcome to the Wiki.  Have fun :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4167</id>
      <timestamp>2002-12-18T20:37:22Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>welcome</comment>
      <text xml:space="preserve">&lt;b&gt;_tprintf(_T(&quot;Hello, Wiki!\n&quot;));&lt;/b&gt;

====Overview ====

New to Unreal as of UT2k3, currently leeching off the collective knowledge of the community.  Can't map worth a damn and MSPaint is my texture editor of choice.  By day I'm a win32 &quot;Software Engineer&quot; and lately, most nights are spent exploring the depths of this thing we call Unreal.

====Projects ====

Since I'm still in the exciting exploration phase, I'm currently writing mutators just for a better understanding of the underlying system.  If I stumble upon something that I'm not embarrased of I'll share it, but don't expect anything soon.  Have a few more ambitious mutator and game type ideas, but at this point in the learning curve they're little more than a design doc full of questions.  &quot;Is it even possible to do this?&quot;

----

'''Wormbo:''' Welcome to the Wiki. :)

'''Tarquin:''' Hello &amp; welcome. Feel free to update our &quot;introduction to Unrealscript&quot; areas if they're not clear enough for beginners :)

'''EntropicLqd:''' Welcome to the Wiki.  Have fun :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Learn The Tools</title>
    <id>1724</id>
    <revision>
      <id>4246</id>
      <timestamp>2008-02-05T14:48:46Z</timestamp>
      <contributor>
        <ip>Bioslimer</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Learn The Tools==

Part 2 of the [[Legacy:Create A Room|Create a Room]] tutorial

This tutorial uses a hands-on approach. We won't be telling you 6 different methods for placing an object in a scene, or give you lengthy technical explanations. You'll do one exercise, then the next, and maybe further down there'll be another exercise which incorporates some of one and some of the other, and before you know it you're doing it! :) As this is intended to be a beginner's tutorial, we will assume you know nothing, we will try to use language a 10 year old can understand, and we are not afraid to repeat ourselves. Also note that we are not afraid to say things a second time. This document is intended to represent the current build, and should be updated accordingly.

There's 200 [[Legacy:Create A Room|Create a Room]] tutorials out there but how many take you just a step further? This one does.

----

OK, if you've already done the previous tutorial, let's get rid of that just to make you do it all over again.

Do File -&gt; New

===Add a Builder Brush ===

Left click on the Cube Builder icon in the top left corner of your Brush Builders pallete

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

The [[Legacy:Red Builder Brush|Red Builder Brush]] appears in your scene at the default size of 256 Unreal Units ([[Legacy:UU|UU]]). See [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].

In the Perspective window right drag around till you can see your brush.

[[Image:Legacy_AddSub1.jpeg|center|The Red Builder Brush, like the 2D circle which represents where you can potentially paint a round 2D shape in Photoshop, represents where you can potentially create a 3D shape in Unreal: also known as a Brush for some reason.]]

===Translate ===

You got your 3 gray windows; Top, Front and Side orthogonal viewports. In the Front window, hold the Ctrl key and left drag anywhere in the window. Your Builder Brush should turn a bright red indicating that it is selected and you can drag it around in the window. Move it up a bit. Now click in the Perspective window. The window should update and your Builder Brush snaps upwards.

===Auto Update ===

Click the little joystick icon in the top left corner of the Perspective window, which is confusingly identical to the Play Map! button. Now in the Side window Ctrl drag your Builder Brush around a bit. You should now see immediate feedback in the Perspective window. You can turn Auto Update on in the other windows if you like. Drag it around a bit in the Top window. Note how each time you select a new window the border turns white indicating it is selected. If you have a slower computer or a mind bogglingly complex scene, you can turn Auto Update off. If you close the file and open it back up again, your settings are lost, you'll have to turn it back on again.

===Scale ===

Click on the scale button just below the camera icon in the top left of your toolbox: [[Image:Legacy_button.mode.scale.gif|]] (If you hold your mouse over it, it should say Actor Scaling). It becomes highlighted and your cursor changes to a midievil cross. Hold the Ctrl key and left drag slowly left and right in one of the orthogonal Viewports the Red Builder Brush scales in one axis. Now Ctrl right drag. It scales in a different axis. Do the same in the two other orthogonal views. Note how each window shares one scaling axes with one window and one axis with the other. I won't elaborate on which window does what axis. Just play around a bit till you get a feel for the scaling thing. If you accidentally scale in the wrong direction, just hit Ctrl Z to undo. You can hold both mouse buttons at the same time and scale two axis at once.

===Rotate ===

Just to the right of the Actor Scaling button, click the Actor Rotate button. [[Image:Legacy_button.mode.rotate.gif|]] Ctrl left drag in any of the viewports and your Builder Brush will rotate in 1 axis relative to the window view. Ctrl right drag and it rotates in a second axis. With it rotated a bit off from 90 degrees, go back to the scale button and try scaling. Note how it flattens out relative to the camera view, not the object itself, so now instead of a cube, we have like a rhomboid shaped object.

===Where's the Cursor? ===

OK, so now you got your Brush rotated and scaled and you want to move it around a bit like before, so you remember how to do that, right? You just Ctrl left drag in one of the windows and... OOPS!  We're still in rotate mode!  Must be the button undernerneath Actor Scaling with the T in it, right? Sorry, if you hold your mouse over the button, it says that's for moving textures. You can hold your mouse over every button on the interface and there's not a move tool to be found. ?????? Well, in their magnanimous effort to do everything different, Epic has cleverly disguised the traditional cursor button that everybody in the world is familiar with as a camera. Go figure.

[[Image:Legacy_button.mode.camera.gif|]]

Click the camera button now to return you to normal operation.

===Reset ===

Now go back and left click on your Cube Builder button like you're going to build a new cube. Does it create a new cube? Surprise! No, it resets the Builder Brush. Remember we haven't actually created anything yet, we're only playing with the Builder Brush here.

===Add a Cube ===

OK let's Add a Space. If you've already done the [[Legacy:Create A Room|Create a Room]] tutorial, by now you should know how to [[Legacy:Subtract A Space|Subtract a Space]], so you should pretty much intuitively know where to find the Add a Space button, right? But just in case, since this is a beginner's tutorial, let me refresh your memory.

[[Image:Legacy_AddSub5.jpeg|]]

OK so you got your Builder Brush and you click Add and you should see the default texture appear. Whoops! nothing happened. Click it again. Nope. Click it a little harder and longer. Sorry. Oh that's right, I bet you forgot to Build All like in the Create a Room tutorial, right? Just to be different, this time instead of clicking on the Build All button, go to the menu bar at the very top and select Build -&gt; Build all. Still no cube. Maybe we forgot to enter the proper size dimensions, so right click on the Cube Builder button and let's enter some new values of 512, 512 and 512. Click the Build button and close the window and... HEY! What's that blue thing? The Builder brush obviously made something so why isn't it showing up in the scene? Not only that but if you carefully click on the edge of the blue box to select it, then hold the Ctrl key and left drag, you will see that it separates from another one underneath and maybe yet another depending on how many times you clicked the Add button. So where's our cube? You remember in the previous tutorial Create a Room, we had you Subtract a Space before anything else? That is because this is the fundamental building block of everything you can place in the visible Unreal world.

'''''You can not add solid geometry into your Map unless you first place it into a Subtracted Space.'''''

In much the same way that in the real world you can't put a human into space without being in some type of container, in the Unreal world everything must be in a container, or Subtracted Space to be visible. Nuff said?

===No, Add a Cube, really ===

And you know what? If you just take the 512 Builder Brush you just made and subtract it out around your added space you ain't gonna get nothin buddy. Sorry to mislead you. We're just going to have to go back and do it all over again. So therefore...

Do File -&gt; New

Subtract a Large Space - Right click on the Cube Builder button and ensure that the values are set to 512 and click Build. Click on the Subtract button..

Now enter new values of 256, click Build and close the window.

Click on the Add button. Voila! That wasn't so hard now, was it?

===Build All? ===

At this point we're just about at the point where we were in the previous Create a Room tutorial, only now we've got a room with an added space in it and we're just about ready to play our Map, right? So let's click the Build All button. (The one at the top that looks like a cube with a lightbulb next to it, remember? Sorry folks, this is a beginner's tutorial.) And BANG! everything suddenly disappears in the Perspective window. What happened to our room? I'm not leading you on another wild goose chase am I? Actually yes and no. At the top of the Perspective window is some buttons which look like various cubes. If you hold your mouse over them you can see that they represent different methods of rendering the viewport such as Wireframe, etc. About the 4th one over, click on the one that says Textured. Now you can see that your room is indeed still there. When we clicked the Build All button, we just rendered the scene and forgot to add a light first. If you go a couple buttons over and switch back to Dynamic Light, you will notice that you can't see the grid lines through the cube any longer. We have just created a pitch black room.

And of course you realize if we added a light now and clicked Build all, then went to play our map, you would get an error if we didn't add a PlayerStart first. The game needs to know where to spawn a player into the scene. So go ahead and add those now as we're going to continue the tutorial from here.. You might want to switch over from Dynamic Light back to Textured for a moment so you can see what you're doing as there is currently no light in the scene.

===One More Time! ===

So to reiterrate:

You pretty much have to do all the steps in the Create a Room tutorial;
# Subtract a Space
# Add a Light
# Add a Playerstart

before you can play your map in the Unreal game.

===Change the Texture ===

OK so you should have a 512 subtracted room with a 256 added cube in it. It might be kind of hard to distinguish the added space because it has the same texture as the subtracted space, so let's change the texture to a contrasting color. First left click one of the surfaces of your added cube. It should turn a blueish color indicating it's selected. Now open the Texture Browser - Click on the button in the top toolbar that looks like a Landscape Painting. The Texture Browser opens. 

Now in the Texture Browser window. Go to File -&gt; Open. You should be taken to Unreal's default texture folder with a list of Texture Packages. Let's open Alleria Terrain. Select any of the textures which appear on the list and it should be immediately applied to the selected surface of your cube. Select a different surface and click on a different texture. BANG there it is. Simple, huh? Now hold the Ctrl key and click on multiple surfaces to group select. If you accidentaly clicked one you didn't want simply Ctrl click a second time to deselect it.

Let's say we want to apply textures to all the walls but not the floor and ceiling. First select one surface. Now press Shift B and all the surfaces become selected.. Now hold Ctrl and deselect the floor and ceiling. Click on a new Texture and there you are. Easy!

===Importing Your Own Textures ===

OK enough using the same textures everybody else is using. Let's jump straight into creating our own, shall we?

Open your favorite graphics app, Photoshop, Painter, whatever as long as you can save a .tga file.

We'll create a new file. Enter a size of 256 X 256.

Note: Texture files must be in multiples of 2;

2 X 2

4 X 4

8, 16, 32, 64, 128, 256, 512, 1024

Make a quick pattern. Don't go getting all creative on me, just do something quick and dirty like a gradient or something and save it as a 24 bit .tga. You don't have to save it in the Unreal folder, however I have found it makes things a lot easier if you create a Temp folder in the same directory as your UT2003 folder like this: C:\Unreal Projects. It just simplifies things for me to have a folder one level up from Unreal to store all my source and temp files. Now let's go back to Unreal and in the Texture Browser window, Do File-&gt; Import and locate your .tga texture. When you go Open, an Import Texture dialog box appears. Under Package, you can name it anything you like but I highly recommend distinguishing it as a texture package like this: myFilenameTex. Although there are different types of packages in Unreal, the application is sometimes unable to distinguish between different packages if they share the same name which can cause major, and I mean MAJOR problems. You'll go to open your file and all your textures will be gone for good. No joke. So develop a descriptive naming convention for your Packages from the start and you will avoid SERIOUS problems. eg.; myFilenameTex, myFilenameMesh, myFilenameAnims. Under Package name is Group name. This can be blank since we're just working with the one texture for now. Group is for when you have like 40 different Wall textures and 20 ceiling textures and you need a way to keep them all organized. That can be more useful later on. Don't even worry about it for now. Leave the texture name as it is and click OK and there should be your new texture in the texture browser

===Save yer Package ===

OK so we got a new package with a grand total of 1 texture in it. Let's save our new package for later use. In the Texture Browser window Do File -&gt; Save. We are taken to the default Texture folder inside the UT2003 folder, and that's exactly where we will save our Package. You understand the difference there? You can save your source textures anywhere you like but you should save your texture Package in UT2003\Textures. Got it? Ok so now that we got it in there go ahead and apply your new texture to your added cube and apply one of the Alleria Terrain textures to all the surfaces of your room (Subtracted Space). (Hint - Use Shift B to select all.) To get back to Alleria Terrain click on the white dialog that's currently says the name of your texture package. A drop down menu appears with a list of the default Texture Packages and any others you may have opened during this session. 

===Resizing a Space. ===

Ok so if you haven't added your Light and Playerstart yet, please do so now and bring it up to par, Build All, everything. We're going to continue on from there. You should have a 512 room with a 256 cube inside. Select your added cube. Note if it turns bright red you haven't selected the added space, you've selected the Red Builder Brush. To separate the brush from the cube Ctrl drag anywhere out in open space in one of the viewports and the Builder brush should automatically become selected. Drag it off to the side somewhere to get it out of the way. Note how added spaces are blue and subtracted spaces are brown. Click on the edge of your blue added space to select it. It should turn bright blue. Now go click on your Scale button and resize it. Note how you can see the updates in the orthogonal views but in the Perspective view there's like 2 boxes now. This is just to save processing power. You won't actually see your changes until you Build All

===Get On With It! ===

OK, so you made a room. So what? Now you should be familiar enough with the basic tools in Unreal to explore the WIKI further and make some sense out of some of the more advanced pages. I'm gonna cut you loose now. The Unreal world is yours to explore. :) 

Now that you've got the basics, you might want to check out [[Legacy:Mapping_Lessons/Functional_Map|Mapping_Lessons/Functional_Map]] . It is identical to this tutorial but is written in the shorter, more concise WIKI style. You might want to compare it to familiarize yourself with the basic, shorthand style of other pages you will find throught the WIKI.

----

==Where To Go Next ==

From here you might want to check out a few of the tutorials featured in the sequence of [[Legacy:Mapping Lessons|Mapping Lessons]]. 
# [[Legacy:Place A Pickup|Place a Pickup]] - Adding Weapons to your Map 
# [[Legacy:Creating A Terrain|Creating a Terrain]] 
# [[Legacy:Adding Sunlight|Adding Sunlight]] 
# [[Legacy:Building A SkyBox|Building A SkyBox]] 

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

----

'''Musicalglass:''' When I first came to the WIKI a few years back, I had a difficult time with many of the topics on this page. Now that I finally understand it, I hope I have made it easier for others to understand as well.  :) Kudos go to Buzz at: http://www.3dbuzz.com for his extremely understandable free video tutorials. Thanks Buzz!

'''GRAF1K:''' The Unreal Wiki (note not all caps &amp;ndash; see the logo) is always in need of refactoring, more info, and everything else. Thanks. :-):tup:

'''Bioslimer:''' i used the same site as musicalglass did, and i wanted to say thanks. :tup:
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4247</id>
      <timestamp>2003-11-17T13:02:13Z</timestamp>
      <contributor>
        <ip>Musicalglass</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Learn The Tools==

Part 2 of the [[Legacy:Create A Room|Create a Room]] tutorial

This tutorial uses a hands-on approach. We won't be telling you 6 different methods for placing an object in a scene, or give you lengthy technical explanations. You'll do one exercise, then the next, and maybe further down there'll be another exercise which incorporates some of one and some of the other, and before you know it you're doing it! :) As this is intended to be a beginner's tutorial, we will assume you know nothing, we will try to use language a 10 year old can understand, and we are not afraid to repeat ourselves. Also note that we are not afraid to say things a second time. This document is intended to represent the current build, and should be updated accordingly.

There's 200 [[Legacy:Create A Room|Create a Room]] tutorials out there but how many take you just a step further? This one does.

----

OK, if you've already done the previous tutorial, let's get rid of that just to make you do it all over again.

Do File -&gt; New

===Add a Builder Brush ===

Left click on the Cube Builder icon in the top left corner of your Brush Builders pallete

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

The [[Legacy:Red Builder Brush|Red Builder Brush]] appears in your scene at the default size of 256 Unreal Units ([[Legacy:UU|UU]]). See [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].

In the Perspective window right drag around till you can see your brush.

[[Image:Legacy_AddSub1.jpeg|center|The Red Builder Brush, like the 2D circle which represents where you can potentially paint a round 2D shape in Photoshop, represents where you can potentially create a 3D shape in Unreal: also known as a Brush for some reason.]]

===Translate ===

You got your 3 gray windows; Top, Front and Side orthogonal viewports. In the Front window, hold the Ctrl key and left drag anywhere in the window. Your Builder Brush should turn a bright red indicating that it is selected and you can drag it around in the window. Move it up a bit. Now click in the Perspective window. The window should update and your Builder Brush snaps upwards.

===Auto Update ===

Click the little joystick icon in the top left corner of the Perspective window, which is confusingly identical to the Play Map! button. Now in the Side window Ctrl drag your Builder Brush around a bit. You should now see immediate feedback in the Perspective window. You can turn Auto Update on in the other windows if you like. Drag it around a bit in the Top window. Note how each time you select a new window the border turns white indicating it is selected. If you have a slower computer or a mind bogglingly complex scene, you can turn Auto Update off. If you close the file and open it back up again, your settings are lost, you'll have to turn it back on again.

===Scale ===

Click on the scale button just below the camera icon in the top left of your toolbox: [[Image:Legacy_button.mode.scale.gif|]] (If you hold your mouse over it, it should say Actor Scaling). It becomes highlighted and your cursor changes to a midievil cross. Hold the Ctrl key and left drag slowly left and right in one of the orthogonal Viewports the Red Builder Brush scales in one axis. Now Ctrl right drag. It scales in a different axis. Do the same in the two other orthogonal views. Note how each window shares one scaling axes with one window and one axis with the other. I won't elaborate on which window does what axis. Just play around a bit till you get a feel for the scaling thing. If you accidentally scale in the wrong direction, just hit Ctrl Z to undo. You can hold both mouse buttons at the same time and scale two axis at once.

===Rotate ===

Just to the right of the Actor Scaling button, click the Actor Rotate button. [[Image:Legacy_button.mode.rotate.gif|]] Ctrl left drag in any of the viewports and your Builder Brush will rotate in 1 axis relative to the window view. Ctrl right drag and it rotates in a second axis. With it rotated a bit off from 90 degrees, go back to the scale button and try scaling. Note how it flattens out relative to the camera view, not the object itself, so now instead of a cube, we have like a rhomboid shaped object.

===Where's the Cursor? ===

OK, so now you got your Brush rotated and scaled and you want to move it around a bit like before, so you remember how to do that, right? You just Ctrl left drag in one of the windows and... OOPS!  We're still in rotate mode!  Must be the button undernerneath Actor Scaling with the T in it, right? Sorry, if you hold your mouse over the button, it says that's for moving textures. You can hold your mouse over every button on the interface and there's not a move tool to be found. ?????? Well, in their magnanimous effort to do everything different, Epic has cleverly disguised the traditional cursor button that everybody in the world is familiar with as a camera. Go figure.

[[Image:Legacy_button.mode.camera.gif|]]

Click the camera button now to return you to normal operation.

===Reset ===

Now go back and left click on your Cube Builder button like you're going to build a new cube. Does it create a new cube? Surprise! No, it resets the Builder Brush. Remember we haven't actually created anything yet, we're only playing with the Builder Brush here.

===Add a Cube ===

OK let's Add a Space. If you've already done the [[Legacy:Create A Room|Create a Room]] tutorial, by now you should know how to [[Legacy:Subtract A Space|Subtract a Space]], so you should pretty much intuitively know where to find the Add a Space button, right? But just in case, since this is a beginner's tutorial, let me refresh your memory.

[[Image:Legacy_AddSub5.jpeg|]]

OK so you got your Builder Brush and you click Add and you should see the default texture appear. Whoops! nothing happened. Click it again. Nope. Click it a little harder and longer. Sorry. Oh that's right, I bet you forgot to Build All like in the Create a Room tutorial, right? Just to be different, this time instead of clicking on the Build All button, go to the menu bar at the very top and select Build -&gt; Build all. Still no cube. Maybe we forgot to enter the proper size dimensions, so right click on the Cube Builder button and let's enter some new values of 512, 512 and 512. Click the Build button and close the window and... HEY! What's that blue thing? The Builder brush obviously made something so why isn't it showing up in the scene? Not only that but if you carefully click on the edge of the blue box to select it, then hold the Ctrl key and left drag, you will see that it separates from another one underneath and maybe yet another depending on how many times you clicked the Add button. So where's our cube? You remember in the previous tutorial Create a Room, we had you Subtract a Space before anything else? That is because this is the fundamental building block of everything you can place in the visible Unreal world.

'''''You can not add solid geometry into your Map unless you first place it into a Subtracted Space.'''''

In much the same way that in the real world you can't put a human into space without being in some type of container, in the Unreal world everything must be in a container, or Subtracted Space to be visible. Nuff said?

===No, Add a Cube, really ===

And you know what? If you just take the 512 Builder Brush you just made and subtract it out around your added space you ain't gonna get nothin buddy. Sorry to mislead you. We're just going to have to go back and do it all over again. So therefore...

Do File -&gt; New

Subtract a Large Space - Right click on the Cube Builder button and ensure that the values are set to 512 and click Build. Click on the Subtract button..

Now enter new values of 256, click Build and close the window.

Click on the Add button. Voila! That wasn't so hard now, was it?

===Build All? ===

At this point we're just about at the point where we were in the previous Create a Room tutorial, only now we've got a room with an added space in it and we're just about ready to play our Map, right? So let's click the Build All button. (The one at the top that looks like a cube with a lightbulb next to it, remember? Sorry folks, this is a beginner's tutorial.) And BANG! everything suddenly disappears in the Perspective window. What happened to our room? I'm not leading you on another wild goose chase am I? Actually yes and no. At the top of the Perspective window is some buttons which look like various cubes. If you hold your mouse over them you can see that they represent different methods of rendering the viewport such as Wireframe, etc. About the 4th one over, click on the one that says Textured. Now you can see that your room is indeed still there. When we clicked the Build All button, we just rendered the scene and forgot to add a light first. If you go a couple buttons over and switch back to Dynamic Light, you will notice that you can't see the grid lines through the cube any longer. We have just created a pitch black room.

And of course you realize if we added a light now and clicked Build all, then went to play our map, you would get an error if we didn't add a PlayerStart first. The game needs to know where to spawn a player into the scene. So go ahead and add those now as we're going to continue the tutorial from here.. You might want to switch over from Dynamic Light back to Textured for a moment so you can see what you're doing as there is currently no light in the scene.

===One More Time! ===

So to reiterrate:

You pretty much have to do all the steps in the Create a Room tutorial;
# Subtract a Space
# Add a Light
# Add a Playerstart

before you can play your map in the Unreal game.

===Change the Texture ===

OK so you should have a 512 subtracted room with a 256 added cube in it. It might be kind of hard to distinguish the added space because it has the same texture as the subtracted space, so let's change the texture to a contrasting color. First left click one of the surfaces of your added cube. It should turn a blueish color indicating it's selected. Now open the Texture Browser - Click on the button in the top toolbar that looks like a Landscape Painting. The Texture Browser opens. 

Now in the Texture Browser window. Go to File -&gt; Open. You should be taken to Unreal's default texture folder with a list of Texture Packages. Let's open Alleria Terrain. Select any of the textures which appear on the list and it should be immediately applied to the selected surface of your cube. Select a different surface and click on a different texture. BANG there it is. Simple, huh? Now hold the Ctrl key and click on multiple surfaces to group select. If you accidentaly clicked one you didn't want simply Ctrl click a second time to deselect it.

Let's say we want to apply textures to all the walls but not the floor and ceiling. First select one surface. Now press Shift B and all the surfaces become selected.. Now hold Ctrl and deselect the floor and ceiling. Click on a new Texture and there you are. Easy!

===Importing Your Own Textures ===

OK enough using the same textures everybody else is using. Let's jump straight into creating our own, shall we?

Open your favorite graphics app, Photoshop, Painter, whatever as long as you can save a .tga file.

We'll create a new file. Enter a size of 256 X 256.

Note: Texture files must be in multiples of 2;

2 X 2

4 X 4

8, 16, 32, 64, 128, 256, 512, 1024

Make a quick pattern. Don't go getting all creative on me, just do something quick and dirty like a gradient or something and save it as a 24 bit .tga. You don't have to save it in the Unreal folder, however I have found it makes things a lot easier if you create a Temp folder in the same directory as your UT2003 folder like this: C:\Unreal Projects. It just simplifies things for me to have a folder one level up from Unreal to store all my source and temp files. Now let's go back to Unreal and in the Texture Browser window, Do File-&gt; Import and locate your .tga texture. When you go Open, an Import Texture dialog box appears. Under Package, you can name it anything you like but I highly recommend distinguishing it as a texture package like this: myFilenameTex. Although there are different types of packages in Unreal, the application is sometimes unable to distinguish between different packages if they share the same name which can cause major, and I mean MAJOR problems. You'll go to open your file and all your textures will be gone for good. No joke. So develop a descriptive naming convention for your Packages from the start and you will avoid SERIOUS problems. eg.; myFilenameTex, myFilenameMesh, myFilenameAnims. Under Package name is Group name. This can be blank since we're just working with the one texture for now. Group is for when you have like 40 different Wall textures and 20 ceiling textures and you need a way to keep them all organized. That can be more useful later on. Don't even worry about it for now. Leave the texture name as it is and click OK and there should be your new texture in the texture browser

===Save yer Package ===

OK so we got a new package with a grand total of 1 texture in it. Let's save our new package for later use. In the Texture Browser window Do File -&gt; Save. We are taken to the default Texture folder inside the UT2003 folder, and that's exactly where we will save our Package. You understand the difference there? You can save your source textures anywhere you like but you should save your texture Package in UT2003\Textures. Got it? Ok so now that we got it in there go ahead and apply your new texture to your added cube and apply one of the Alleria Terrain textures to all the surfaces of your room (Subtracted Space). (Hint - Use Shift B to select all.) To get back to Alleria Terrain click on the white dialog that's currently says the name of your texture package. A drop down menu appears with a list of the default Texture Packages and any others you may have opened during this session. 

===Resizing a Space. ===

Ok so if you haven't added your Light and Playerstart yet, please do so now and bring it up to par, Build All, everything. We're going to continue on from there. You should have a 512 room with a 256 cube inside. Select your added cube. Note if it turns bright red you haven't selected the added space, you've selected the Red Builder Brush. To separate the brush from the cube Ctrl drag anywhere out in open space in one of the viewports and the Builder brush should automatically become selected. Drag it off to the side somewhere to get it out of the way. Note how added spaces are blue and subtracted spaces are brown. Click on the edge of your blue added space to select it. It should turn bright blue. Now go click on your Scale button and resize it. Note how you can see the updates in the orthogonal views but in the Perspective view there's like 2 boxes now. This is just to save processing power. You won't actually see your changes until you Build All

===Get On With It! ===

OK, so you made a room. So what? Now you should be familiar enough with the basic tools in Unreal to explore the WIKI further and make some sense out of some of the more advanced pages. I'm gonna cut you loose now. The Unreal world is yours to explore. :) 

Now that you've got the basics, you might want to check out [[Legacy:Mapping_Lessons/Functional_Map|Mapping_Lessons/Functional_Map]] . It is identical to this tutorial but is written in the shorter, more concise WIKI style. You might want to compare it to familiarize yourself with the basic, shorthand style of other pages you will find throught the WIKI.

----

==Where To Go Next ==

From here you might want to check out a few of the tutorials featured in the sequence of [[Legacy:Mapping Lessons|Mapping Lessons]]. 
# [[Legacy:Place A Pickup|Place a Pickup]] - Adding Weapons to your Map 
# [[Legacy:Creating A Terrain|Creating a Terrain]] 
# [[Legacy:Adding Sunlight|Adding Sunlight]] 
# [[Legacy:Building A SkyBox|Building A SkyBox]] 

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

----

'''Musicalglass:''' When I first came to the WIKI a few years back, I had a difficult time with many of the topics on this page. Now that I finally understand it, I hope I have made it easier for others to understand as well.  :) Kudos go to Buzz at: http://www.3dbuzz.com for his extremely understandable free video tutorials. Thanks Buzz!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4248</id>
      <timestamp>2003-11-18T00:48:32Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Learn The Tools==

Part 2 of the [[Legacy:Create A Room|Create a Room]] tutorial

This tutorial uses a hands-on approach. We won't be telling you 6 different methods for placing an object in a scene, or give you lengthy technical explanations. You'll do one exercise, then the next, and maybe further down there'll be another exercise which incorporates some of one and some of the other, and before you know it you're doing it! :) As this is intended to be a beginner's tutorial, we will assume you know nothing, we will try to use language a 10 year old can understand, and we are not afraid to repeat ourselves. Also note that we are not afraid to say things a second time. This document is intended to represent the current build, and should be updated accordingly.

There's 200 [[Legacy:Create A Room|Create a Room]] tutorials out there but how many take you just a step further? This one does.

----

OK, if you've already done the previous tutorial, let's get rid of that just to make you do it all over again.

Do File -&gt; New

===Add a Builder Brush ===

Left click on the Cube Builder icon in the top left corner of your Brush Builders pallete

[[Image:Legacy_interface.toolbox.defbuilders.gif|]]

The [[Legacy:Red Builder Brush|Red Builder Brush]] appears in your scene at the default size of 256 Unreal Units ([[Legacy:UU|UU]]). See [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].

In the Perspective window right drag around till you can see your brush.

[[Image:Legacy_AddSub1.jpeg|center|The Red Builder Brush, like the 2D circle which represents where you can potentially paint a round 2D shape in Photoshop, represents where you can potentially create a 3D shape in Unreal: also known as a Brush for some reason.]]

===Translate ===

You got your 3 gray windows; Top, Front and Side orthogonal viewports. In the Front window, hold the Ctrl key and left drag anywhere in the window. Your Builder Brush should turn a bright red indicating that it is selected and you can drag it around in the window. Move it up a bit. Now click in the Perspective window. The window should update and your Builder Brush snaps upwards.

===Auto Update ===

Click the little joystick icon in the top left corner of the Perspective window, which is confusingly identical to the Play Map! button. Now in the Side window Ctrl drag your Builder Brush around a bit. You should now see immediate feedback in the Perspective window. You can turn Auto Update on in the other windows if you like. Drag it around a bit in the Top window. Note how each time you select a new window the border turns white indicating it is selected. If you have a slower computer or a mind bogglingly complex scene, you can turn Auto Update off. If you close the file and open it back up again, your settings are lost, you'll have to turn it back on again.

===Scale ===

Click on the scale button just below the camera icon in the top left of your toolbox: [[Image:Legacy_button.mode.scale.gif|]] (If you hold your mouse over it, it should say Actor Scaling). It becomes highlighted and your cursor changes to a midievil cross. Hold the Ctrl key and left drag slowly left and right in one of the orthogonal Viewports the Red Builder Brush scales in one axis. Now Ctrl right drag. It scales in a different axis. Do the same in the two other orthogonal views. Note how each window shares one scaling axes with one window and one axis with the other. I won't elaborate on which window does what axis. Just play around a bit till you get a feel for the scaling thing. If you accidentally scale in the wrong direction, just hit Ctrl Z to undo. You can hold both mouse buttons at the same time and scale two axis at once.

===Rotate ===

Just to the right of the Actor Scaling button, click the Actor Rotate button. [[Image:Legacy_button.mode.rotate.gif|]] Ctrl left drag in any of the viewports and your Builder Brush will rotate in 1 axis relative to the window view. Ctrl right drag and it rotates in a second axis. With it rotated a bit off from 90 degrees, go back to the scale button and try scaling. Note how it flattens out relative to the camera view, not the object itself, so now instead of a cube, we have like a rhomboid shaped object.

===Where's the Cursor? ===

OK, so now you got your Brush rotated and scaled and you want to move it around a bit like before, so you remember how to do that, right? You just Ctrl left drag in one of the windows and... OOPS!  We're still in rotate mode!  Must be the button undernerneath Actor Scaling with the T in it, right? Sorry, if you hold your mouse over the button, it says that's for moving textures. You can hold your mouse over every button on the interface and there's not a move tool to be found. ?????? Well, in their magnanimous effort to do everything different, Epic has cleverly disguised the traditional cursor button that everybody in the world is familiar with as a camera. Go figure.

[[Image:Legacy_button.mode.camera.gif|]]

Click the camera button now to return you to normal operation.

===Reset ===

Now go back and left click on your Cube Builder button like you're going to build a new cube. Does it create a new cube? Surprise! No, it resets the Builder Brush. Remember we haven't actually created anything yet, we're only playing with the Builder Brush here.

===Add a Cube ===

OK let's Add a Space. If you've already done the [[Legacy:Create A Room|Create a Room]] tutorial, by now you should know how to [[Legacy:Subtract A Space|Subtract a Space]], so you should pretty much intuitively know where to find the Add a Space button, right? But just in case, since this is a beginner's tutorial, let me refresh your memory.

[[Image:Legacy_AddSub5.jpeg|]]

OK so you got your Builder Brush and you click Add and you should see the default texture appear. Whoops! nothing happened. Click it again. Nope. Click it a little harder and longer. Sorry. Oh that's right, I bet you forgot to Build All like in the Create a Room tutorial, right? Just to be different, this time instead of clicking on the Build All button, go to the menu bar at the very top and select Build -&gt; Build all. Still no cube. Maybe we forgot to enter the proper size dimensions, so right click on the Cube Builder button and let's enter some new values of 512, 512 and 512. Click the Build button and close the window and... HEY! What's that blue thing? The Builder brush obviously made something so why isn't it showing up in the scene? Not only that but if you carefully click on the edge of the blue box to select it, then hold the Ctrl key and left drag, you will see that it separates from another one underneath and maybe yet another depending on how many times you clicked the Add button. So where's our cube? You remember in the previous tutorial Create a Room, we had you Subtract a Space before anything else? That is because this is the fundamental building block of everything you can place in the visible Unreal world.

'''''You can not add solid geometry into your Map unless you first place it into a Subtracted Space.'''''

In much the same way that in the real world you can't put a human into space without being in some type of container, in the Unreal world everything must be in a container, or Subtracted Space to be visible. Nuff said?

===No, Add a Cube, really ===

And you know what? If you just take the 512 Builder Brush you just made and subtract it out around your added space you ain't gonna get nothin buddy. Sorry to mislead you. We're just going to have to go back and do it all over again. So therefore...

Do File -&gt; New

Subtract a Large Space - Right click on the Cube Builder button and ensure that the values are set to 512 and click Build. Click on the Subtract button..

Now enter new values of 256, click Build and close the window.

Click on the Add button. Voila! That wasn't so hard now, was it?

===Build All? ===

At this point we're just about at the point where we were in the previous Create a Room tutorial, only now we've got a room with an added space in it and we're just about ready to play our Map, right? So let's click the Build All button. (The one at the top that looks like a cube with a lightbulb next to it, remember? Sorry folks, this is a beginner's tutorial.) And BANG! everything suddenly disappears in the Perspective window. What happened to our room? I'm not leading you on another wild goose chase am I? Actually yes and no. At the top of the Perspective window is some buttons which look like various cubes. If you hold your mouse over them you can see that they represent different methods of rendering the viewport such as Wireframe, etc. About the 4th one over, click on the one that says Textured. Now you can see that your room is indeed still there. When we clicked the Build All button, we just rendered the scene and forgot to add a light first. If you go a couple buttons over and switch back to Dynamic Light, you will notice that you can't see the grid lines through the cube any longer. We have just created a pitch black room.

And of course you realize if we added a light now and clicked Build all, then went to play our map, you would get an error if we didn't add a PlayerStart first. The game needs to know where to spawn a player into the scene. So go ahead and add those now as we're going to continue the tutorial from here.. You might want to switch over from Dynamic Light back to Textured for a moment so you can see what you're doing as there is currently no light in the scene.

===One More Time! ===

So to reiterrate:

You pretty much have to do all the steps in the Create a Room tutorial;
# Subtract a Space
# Add a Light
# Add a Playerstart

before you can play your map in the Unreal game.

===Change the Texture ===

OK so you should have a 512 subtracted room with a 256 added cube in it. It might be kind of hard to distinguish the added space because it has the same texture as the subtracted space, so let's change the texture to a contrasting color. First left click one of the surfaces of your added cube. It should turn a blueish color indicating it's selected. Now open the Texture Browser - Click on the button in the top toolbar that looks like a Landscape Painting. The Texture Browser opens. 

Now in the Texture Browser window. Go to File -&gt; Open. You should be taken to Unreal's default texture folder with a list of Texture Packages. Let's open Alleria Terrain. Select any of the textures which appear on the list and it should be immediately applied to the selected surface of your cube. Select a different surface and click on a different texture. BANG there it is. Simple, huh? Now hold the Ctrl key and click on multiple surfaces to group select. If you accidentaly clicked one you didn't want simply Ctrl click a second time to deselect it.

Let's say we want to apply textures to all the walls but not the floor and ceiling. First select one surface. Now press Shift B and all the surfaces become selected.. Now hold Ctrl and deselect the floor and ceiling. Click on a new Texture and there you are. Easy!

===Importing Your Own Textures ===

OK enough using the same textures everybody else is using. Let's jump straight into creating our own, shall we?

Open your favorite graphics app, Photoshop, Painter, whatever as long as you can save a .tga file.

We'll create a new file. Enter a size of 256 X 256.

Note: Texture files must be in multiples of 2;

2 X 2

4 X 4

8, 16, 32, 64, 128, 256, 512, 1024

Make a quick pattern. Don't go getting all creative on me, just do something quick and dirty like a gradient or something and save it as a 24 bit .tga. You don't have to save it in the Unreal folder, however I have found it makes things a lot easier if you create a Temp folder in the same directory as your UT2003 folder like this: C:\Unreal Projects. It just simplifies things for me to have a folder one level up from Unreal to store all my source and temp files. Now let's go back to Unreal and in the Texture Browser window, Do File-&gt; Import and locate your .tga texture. When you go Open, an Import Texture dialog box appears. Under Package, you can name it anything you like but I highly recommend distinguishing it as a texture package like this: myFilenameTex. Although there are different types of packages in Unreal, the application is sometimes unable to distinguish between different packages if they share the same name which can cause major, and I mean MAJOR problems. You'll go to open your file and all your textures will be gone for good. No joke. So develop a descriptive naming convention for your Packages from the start and you will avoid SERIOUS problems. eg.; myFilenameTex, myFilenameMesh, myFilenameAnims. Under Package name is Group name. This can be blank since we're just working with the one texture for now. Group is for when you have like 40 different Wall textures and 20 ceiling textures and you need a way to keep them all organized. That can be more useful later on. Don't even worry about it for now. Leave the texture name as it is and click OK and there should be your new texture in the texture browser

===Save yer Package ===

OK so we got a new package with a grand total of 1 texture in it. Let's save our new package for later use. In the Texture Browser window Do File -&gt; Save. We are taken to the default Texture folder inside the UT2003 folder, and that's exactly where we will save our Package. You understand the difference there? You can save your source textures anywhere you like but you should save your texture Package in UT2003\Textures. Got it? Ok so now that we got it in there go ahead and apply your new texture to your added cube and apply one of the Alleria Terrain textures to all the surfaces of your room (Subtracted Space). (Hint - Use Shift B to select all.) To get back to Alleria Terrain click on the white dialog that's currently says the name of your texture package. A drop down menu appears with a list of the default Texture Packages and any others you may have opened during this session. 

===Resizing a Space. ===

Ok so if you haven't added your Light and Playerstart yet, please do so now and bring it up to par, Build All, everything. We're going to continue on from there. You should have a 512 room with a 256 cube inside. Select your added cube. Note if it turns bright red you haven't selected the added space, you've selected the Red Builder Brush. To separate the brush from the cube Ctrl drag anywhere out in open space in one of the viewports and the Builder brush should automatically become selected. Drag it off to the side somewhere to get it out of the way. Note how added spaces are blue and subtracted spaces are brown. Click on the edge of your blue added space to select it. It should turn bright blue. Now go click on your Scale button and resize it. Note how you can see the updates in the orthogonal views but in the Perspective view there's like 2 boxes now. This is just to save processing power. You won't actually see your changes until you Build All

===Get On With It! ===

OK, so you made a room. So what? Now you should be familiar enough with the basic tools in Unreal to explore the WIKI further and make some sense out of some of the more advanced pages. I'm gonna cut you loose now. The Unreal world is yours to explore. :) 

Now that you've got the basics, you might want to check out [[Legacy:Mapping_Lessons/Functional_Map|Mapping_Lessons/Functional_Map]] . It is identical to this tutorial but is written in the shorter, more concise WIKI style. You might want to compare it to familiarize yourself with the basic, shorthand style of other pages you will find throught the WIKI.

----

==Where To Go Next ==

From here you might want to check out a few of the tutorials featured in the sequence of [[Legacy:Mapping Lessons|Mapping Lessons]]. 
# [[Legacy:Place A Pickup|Place a Pickup]] - Adding Weapons to your Map 
# [[Legacy:Creating A Terrain|Creating a Terrain]] 
# [[Legacy:Adding Sunlight|Adding Sunlight]] 
# [[Legacy:Building A SkyBox|Building A SkyBox]] 

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

----

'''Musicalglass:''' When I first came to the WIKI a few years back, I had a difficult time with many of the topics on this page. Now that I finally understand it, I hope I have made it easier for others to understand as well.  :) Kudos go to Buzz at: http://www.3dbuzz.com for his extremely understandable free video tutorials. Thanks Buzz!

'''GRAF1K:''' The Unreal Wiki (note not all caps &amp;ndash; see the logo) is always in need of refactoring, more info, and everything else. Thanks. :-):tup:
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LedZep</title>
    <id>1676</id>
    <revision>
      <id>4145</id>
      <timestamp>2003-04-27T06:04:21Z</timestamp>
      <contributor>
        <ip>12-236-2-199.client.attbi.com</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">===LedZep ===

Well not much to say about me...

Coding is my hobby. UnrealScript is probably my best script, i also do some C++ and VB, but I dont take coding too seriously.

I haven't released a lot of things, although i made a pretty big variety of personal projects just for myself because i enjoy coding.

The only things that I did release are BCC and BCC2k3, both are the same mutator for the two different games (UT and UT2003), if you are interested you can find the review of BCC [http://modsquad.beyondunreal.com/review.php?id=74 here] and of BCC2k3 [http://modsquad.beyondunreal.com/review.php?id=106 here].

I also coded a lot for the UTron project (which i wonder if it ever will get released) i dont mind that much though, as long as i had fun doing it, and the team was full of the nicest people i ever met in the modding community. visit [http://www.utron.org UTron.org] if you are interested in this mod, the site might be down though, we aren't the best organizers out there, especially when it comes to websites.

===Comments ===

(WARNING, very empty :D)

'''ZxAnPhOrIaN:''' Hey and welcome to the wiki! :) :tup: (please add yourself to the project contributers page!)

'''LedZep:''' Thanks and will do ;)

'''RegularX:'''  *waves*

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4146</id>
      <timestamp>2003-02-10T15:06:50Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===LedZep ===

Well not much to say about me...

I just code... UnrealScript is probably my best script, i also do some C++ and VB, but coding is just a hobby.

I havent released a lot of things, although i made a pretty big variety of personal projects just for myself because i enjoy coding.

I code (if you call &quot;doing nothing&quot; code) for the UTron team, we should be releasing soon.

I also made the BotChatCommand (weird name) mutator, you use it to give more elaborate orders to bots in UT.

check out the [http://www.UTron.org UTron site] and [http://modsquad.beyondunreal.com/review.php?id=74 BCC2.0's Review on Modsquad]

ok, when im on the computer, other than code i visit the [http://forums.beyondunreal.com/ BeyondUnreal forums] (especially the coding forum there) and the [http://el-muerte.student.utwente.nl/lba/forum/?s=bc83d1fb6b2206de95b0fbf7df9fb63f MBN forums] (an LBA fan site), and i also play Civilization from time to time, thats about all i do on the computer i guess...

===Comments ===

(warning very empty :D)

'''ZxAnPhOrIaN:''' Hey and welcome to the wiki! :) :tup: (please add yourself to the project contributers page!)

'''LedZep:''' Thanks and will do ;)

'''RegularX:'''  *waves*

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4147</id>
      <timestamp>2003-03-04T04:41:45Z</timestamp>
      <contributor>
        <ip>12-236-2-199.client.attbi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===LedZep ===

Well not much to say about me...

Coding is my hobby. UnrealScript is probably my best script, i also do some C++ and VB, but I dont take coding too seriously.

I haven't released a lot of things, although i made a pretty big variety of personal projects just for myself because i enjoy coding.

The only things that I did release are BCC and BCC2k3, both are the same mutator for the two different games (UT and UT2003), if you are interested you can find the review of BCC [http://modsquad.beyondunreal.com/review.php?id=74 here] and of BCC2k3 [http://modsquad.beyondunreal.com/review.php?id=106 here].

I also coded a lot for the UTron project (which i wonder if it ever will get released) i dont mind that much though, as long as i had fun doing it, and the team was full of the nicest people i ever met in the modding community. visit [http://www.utron.org UTron.org] if you are interested in this mod, the site might be down though, we aren't the best organizers out there, especially when it comes to websites.

Thats basically it, if you want to be my friend go read the communist manifesto, if you dont then dont, i'll still like you even if you are a jerk. :)

===Comments ===

(warning very empty :D)

'''ZxAnPhOrIaN:''' Hey and welcome to the wiki! :) :tup: (please add yourself to the project contributers page!)

'''LedZep:''' Thanks and will do ;)

'''RegularX:'''  *waves*

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Left-Handed Coordinate System</title>
    <id>1689</id>
    <revision>
      <id>4175</id>
      <timestamp>2003-05-01T08:08:44Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A three-dimensional coordinate system in which the axes do not satisfy the right-hand rule.  

See: 

* [http://mathworld.wolfram.com/Left-HandedCoordinateSystem.html MathWorld]
* [[Wikipedia:Handedness]]</text>
    </revision>
    <revision>
      <id>4176</id>
      <timestamp>2003-01-27T07:54:05Z</timestamp>
      <contributor>
        <ip>Pingz</ip>
      </contributor>
      <comment>delete me!</comment>
      <text xml:space="preserve">A three-dimensional coordinate system in which the axes do not satisfy the right-hand rule.  

See external link: [http://mathworld.wolfram.com/Left-HandedCoordinateSystem.html MathWorld]

DELETE ME! ... Actor_(UT)/Movement no longer uses this page!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LegalAssassin</title>
    <id>1662</id>
    <revision>
      <id>4110</id>
      <timestamp>2007-01-23T20:15:09Z</timestamp>
      <contributor>
        <ip>213-67-168-11-o984.telia.com</ip>
      </contributor>
      <comment>Been a while! Update for future reference</comment>
      <text xml:space="preserve">{{innerbox| '''They say that revolutionaries are not like normal people. But what then, may I ask, is the price for immortality?'''

 Anthony Byrne's ''&quot;Meeting Che Guevara and the Man from Maybury Hill&quot;'' by Igloo Films (2002)

}}

==Projects ==
* Lying on the couch watching TV
* School, the never ending project
* Researching WW2 - British weapons is the main thing at the moment

==Skills of Importance to Game Design ==

====Basic ====
* History, most ages (expert knowledge on WW2)
* Geography/Geology (intermediate)
* Using search engines (some people aren't capable of this, it seems)
* Creation of realistic enviroments/Reproduction of reality/Scale modelling
* You name it

====Computers/Game Design ====
* Unreal Ed 2.0 and 3.0 (expert/intermediate knowledge respectively)
* Modelling (Fully compatible with Milkshape)
* Unwrapping (LithUnwrap, simple stuff)
* Skinning (skilled to intermediate)
* Creating Textures (mostly from photos)
* Beta testing
* Sound Creation (Basic knowledge, can do advanced things using luck)
* Web design (HTML coding, some CSS, intermediate)

==Past team positions ==
* Beta testing - [http://www.planetjailbreak.com JailBreak]
* Level Design - [http://www.rps.net Night's Edge mod]
* Level Design/Beta testing/Historian - [http://www.planetunreal.com/thirdreich The Third Reich] - '''''BAD TEAM'''''
* Unknown (perhaps betatesting?) - [http://www.planetunreal.com/airfight AirfightUT]
* Modelling/Web design (spruced up the graphics) - [http://www.projectkorps.com Project Korps]
* Modelling - [http://www.carpathiancrosses.com Carpathian Crosses]

==Rants and rages ==

[[Legacy:LegalAssassin/Bonus Material|LegalAssassin/Bonus Material]]

[[Legacy:LegalAssassin/Epic Rage|LegalAssassin/Epic Rage]]

[[Legacy:LegalAssassin/How Not To Sell A Game|LegalAssassin/How not to sell a game]]

===Other crap ===

==Comments (put comments here) ==

'''Mosquito:''' I didn't know you worked on night's edge, I downloaded it last week. Pretty good for the time is was created.

'''Legal:''' Yup, the concept was ok, but due to lack of advertising it died. That the 1.0 server crashed once the third player got online didn't help either...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4111</id>
      <timestamp>2006-04-07T08:03:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{innerbox| '''They say that revolutionaries are not like normal people. But what then, may I ask, is the price for immortality?'''

 Anthony Byrne's ''&quot;Meeting Che Guevara and the Man from Maybury Hill&quot;'' by Igloo Films (2002)

}}

==Projects ==
* School, the never ending project
* Project Korps (BIGOT) - Modeller, Satellite dude, Unwrapping (BIGOT until nearing release, but I'm doing something useful at least)
* Researching WW2 - Operation Jubilee, the Dieppe Raid, is main focus at the moment

==Skills of Importance to Game Design ==

====Basic ====
* History, most ages (expert knowledge on WW2)
* Geography/Geology (intermediate)
* Using search engines (some people aren't capable of this, it seems)
* Creation of realistic enviroments/Reproduction of reality/Scale modelling
* You name it

====Computers/Game Design ====
* Unreal Ed 2.0 and 3.0 (expert/intermediate knowledge respectively)
* Modelling (Fully compatible with Milkshape)
* Unwrapping (LithUnwrap, simple stuff)
* Skinning (skilled to intermediate)
* Creating Textures (mostly from photos)
* Beta testing
* Sound Creation (Basic knowledge, can do advanced things using luck)
* Web design (HTML until further notice, intermediate)

==Latest stuff ==

'''10th August, 2004:''' I just saw TTR recruiting, good luck. Among the positions was, quote, &quot;a historical advisor. This person must have a strong passion &amp; knowledge of WW2 and the equipement available at that time. You'll overlook much of the produced content &amp; advise the team where to make changes or improvements&quot;. Sounds like a job for me!

Oh wait, I did that, but back then it was useless and anyone else on the team could do it. In fact, it appears it hasn't been needed at all, looking at the few screenshots released the past five months. Of course, the quality is what you'd expect, RTCW did things the same way and looks about the same.

I'm ready to retake the position, in spite of the treatment I and others have recieved. I have a condition, however, I wont work for free. 500 dollars per week feels like a fair amount of money. And I think the team can spare it, seeing how they are planning on going commercial as soon as anyone will pay them. Dream on.

Other news is I'm trying to make a map based on the layout of french castles, and so far I think I've managed to come up with a good compromise bet

ween different castle styles. My main source of inspiration, however, is Bonaguille, a wonderful castle located in southern France. This will '''not''' be a realistic map, however, if anyone would think that. We'll see what happens to it in time, I guess.

==Past mod team positions ==
* Beta testing - [http://www.planetjailbreak.com JailBreak]
* Level Design - [http://www.rps.net Night's Edge mod]
* Level Design/Beta testing/Historian - [http://www.planetunreal.com/thirdreich The Third Reich] - '''''BAD TEAM'''''
* Unknown (perhaps betatesting?) - [http://www.planetunreal.com/airfight AirfightUT]

==Rants and rages ==

[[Legacy:LegalAssassin/Bonus Material|LegalAssassin/Bonus Material]]

[[Legacy:LegalAssassin/Epic Rage|LegalAssassin/Epic Rage]]

[[Legacy:LegalAssassin/How Not To Sell A Game|LegalAssassin/How not to sell a game]]

===Other crap ===

==Comments (put comments here) ==

'''Mosquito:''' I didn't know you worked on night's edge, I downloaded it last week. Pretty good for the time is was created.

'''Legal:''' Yup, the concept was ok, but due to lack of advertising it died. That the 1.0 server crashed once the third player got online didn't help either...

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LegalAssassin/Architecture</title>
    <id>1679</id>
    <revision>
      <id>4152</id>
      <timestamp>2004-03-19T22:58:23Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>Added another picture (damn horribly formatted though</comment>
      <text xml:space="preserve">==Introduction==

I will try to add as much as possible to this page in order to help anyone who'd find it interesting, hopefully the mapping community will find it useful. I hope this will help mappers making more realistic maps, even the unrealistic ones. What I mean by that is that in order for things to look and feel good, things have to be somewhat done according to the real world with logic principles baked into them. Of course, this is not something you can always follow, but for example, if one stone in an arch collapses, a lot more will fall down with it. Also, I hope this will be useful for creating alien architecture and creating a culture which makes the map feel more involving.

A lot of what will be listed here is the way you produce a great movie, in example, Star Wars or Lord of the Rings. Although the later might not be completely the work of the movie people, the costumes, weapons, settings and so on was only described and sometimes illustrated. Although you'll always need a solid base for a map, it's the details that makes your world come to life. Also, this page will remind you that a lot of what's already in the world would make perfect maps, or part of perfect maps. In example, we have gothic, incan, roman, medieval architecture, not to mention the wonderful natural features such as huge caves, oddly shaped cliffs, valleys carved out of the mountain by water and so on. Let's begin.

==Culture==

'''What does/did the people who built it belive in?'''

The first part we should have a look at is culture. Culture is based on the people, who, in turn, are based upon natural conditions. Where there's much rain, you'll usually have a God for rain and one for sun. There's usually some God of fertility in all ancient religions, or at least some form of symbol. In more modern communities, such as christian, muslim and jewish along with the other one-God religions, you are more likely to find perhaps a saint or a special place such as an altar or a church. This is why you should make up a basic idea of how the people who shaped the landscape/built the site thought. Of course, you can use an already existing idea of how things work, such as the Nali (inca/buddist cross) or the Liandri Corp (cost-efficient and very low security, dirty - unless you're making their designed arenas or where higher-ranking people lives).

'''To say it simple, this is where you pick who would live there.'''

===Symbols===

[[Image:Legacy_141.gif|left|A symbol]]

The culture also makes a change on if there are symbols and what they mean. Modern style maps should probably contain warnings or commercial ads on the walls, while an inca-inspired temple would probably have some pictures of Gods and some inscriptions. A good idea is to detirmine then what these Gods look like or what they represent, or what corps or companies would put up commercials in that spot. DOM-Condemned (UT) is a good example of this, Arturo's grafitti on the walls, old torn ads and so on. You wouldn't find commercial ads for &quot;Fat Albert's stripping bimbos - free weed every other hour&quot; next to a big corp's central office, would you?

'''Does your people have any special symbols typical for them/usual among them. Any Gods perhaps?'''

==Architecture==

[[Image:Legacy_la_archi_02.jpeg|right|Flying Buttress (Gothic church)]]

'''What fits your population and era?'''

This is something VERY important. You pick a style of architechture and stick to it. Maybe you can combine a few types, making the location look like it's been used for several centuries. This would be a good idea for any mappers making &quot;realistic maps&quot; based in southern Europe, as you're likely to find houses from the 20th century with the foundations dating 2000 BC. This is also part of culture - How does your population treat ruins? Will they preserve them by not doing anything to them or will they have built new houses on top of the old houses?

===Style===

Pick your style/era(s) and go to [[Legacy:Www.Google.Com|www.google.com]]. Do a picture search for what you don't know, in example, how doorways look. Are fancy decorations common? Is the top of it curved, flat, flat with an arch above etc. You've now got the base for how you could do it. Of course, if you're doing something which isn't supposed to look real you wont have to worry about sticking to what you've found, however you still should decide on one or a few styles BEFORE starting the map. A lot of potentially great maps looks like something you could make with coloured paper shreds.

===Technique===

So, how did they build it? And with what tools and materials? A ruined brickwall and a claywall doesn't collapse in the same way, for example. Look at the architecture you've picked and think of what materials your population might have access to and how advanced their tools are. Also, look carefully at how things were done, in example how the bricks in a wall are placed or what's under the floor. A classic thing to do when creating ruined stuff is to make things more 3D than they have to be. In example, a floortile missing or a few bricks. This is not realistic most of the time, but it's a nice effect which breaks the Wolfenstein 3D feeling.

Anything that can/have collapsed and fallen down should be looked at a bit extra. In example, what happens when one rock is removed from an arch+ how many of the other rocks stays? Same goes for rooves, what holds them up? Far too often they seem unaffected by gravity. Straw rooves which are kept in position by themselves, tiles flying, or perhaps just too heavy for the walls to bear.

TO BE CONTINUED</text>
    </revision>
    <revision>
      <id>4153</id>
      <timestamp>2004-03-19T19:07:20Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>And some more...</comment>
      <text xml:space="preserve">==Introduction==

I will try to add as much as possible to this page in order to help anyone who'd find it interesting, hopefully the mapping community will find it useful. I hope this will help mappers making more realistic maps, even the unrealistic ones. What I mean by that is that in order for things to look and feel good, things have to be somewhat done according to the real world with logic principles baked into them. Of course, this is not something you can always follow, but for example, if one stone in an arch collapses, a lot more will fall down with it. Also, I hope this will be useful for creating alien architecture and creating a culture which makes the map feel more involving.

A lot of what will be listed here is the way you produce a great movie, in example, Star Wars or Lord of the Rings. Although the later might not be completely the work of the movie people, the costumes, weapons, settings and so on was only described and sometimes illustrated. Although you'll always need a solid base for a map, it's the details that makes your world come to life. Also, this page will remind you that a lot of what's already in the world would make perfect maps, or part of perfect maps. In example, we have gothic, incan, roman, medieval architecture, not to mention the wonderful natural features such as huge caves, oddly shaped cliffs, valleys carved out of the mountain by water and so on. Let's begin.

==Culture==

'''What does/did the people who built it belive in?'''

The first part we should have a look at is culture. Culture is based on the people, who, in turn, are based upon natural conditions. Where there's much rain, you'll usually have a God for rain and one for sun. There's usually some God of fertility in all ancient religions, or at least some form of symbol. In more modern communities, such as christian, muslim and jewish along with the other one-God religions, you are more likely to find perhaps a saint or a special place such as an altar or a church. This is why you should make up a basic idea of how the people who shaped the landscape/built the site thought. Of course, you can use an already existing idea of how things work, such as the Nali (inca/buddist cross) or the Liandri Corp (cost-efficient and very low security, dirty - unless you're making their designed arenas or where higher-ranking people lives).

'''To say it simple, this is where you pick who would live there.'''

===Symbols===

[[Image:Legacy_141.gif|left|A symbol]]

The culture also makes a change on if there are symbols and what they mean. Modern style maps should probably contain warnings or commercial ads on the walls, while an inca-inspired temple would probably have some pictures of Gods and some inscriptions. A good idea is to detirmine then what these Gods look like or what they represent, or what corps or companies would put up commercials in that spot. DOM-Condemned (UT) is a good example of this, Arturo's grafitti on the walls, old torn ads and so on. You wouldn't find commercial ads for &quot;Fat Albert's stripping bimbos - free weed every other hour&quot; next to a big corp's central office, would you?

'''Does your people have any special symbols typical for them/usual among them. Any Gods perhaps?'''

==Architecture==

'''What fits your population and era?'''

This is something VERY important. You pick a style of architechture and stick to it. Maybe you can combine a few types, making the location look like it's been used for several centuries. This would be a good idea for any mappers making &quot;realistic maps&quot; based in southern Europe, as you're likely to find houses from the 20th century with the foundations dating 2000 BC. This is also part of culture - How does your population treat ruins? Will they preserve them by not doing anything to them or will they have built new houses on top of the old houses?

===Style===

Pick your style/era(s) and go to [[Legacy:Www.Google.Com|www.google.com]]. Do a picture search for what you don't know, in example, how doorways look. Are fancy decorations common? Is the top of it curved, flat, flat with an arch above etc. You've now got the base for how you could do it. Of course, if you're doing something which isn't supposed to look real you wont have to worry about sticking to what you've found, however you still should decide on one or a few styles BEFORE starting the map. A lot of potentially great maps looks like something you could make with coloured paper shreds.

===Technique===

So, how did they build it? And with what tools and materials? A ruined brickwall and a claywall doesn't collapse in the same way, for example. Look at the architecture you've picked and think of what materials your population might have access to and how advanced their tools are. Also, look carefully at how things were done, in example how the bricks in a wall are placed or what's under the floor. A classic thing to do when creating ruined stuff is to make things more 3D than they have to be. In example, a floortile missing or a few bricks. This is not realistic most of the time, but it's a nice effect which breaks the Wolfenstein 3D feeling.

Anything that can/have collapsed and fallen down should be looked at a bit extra. In example, what happens when one rock is removed from an arch+ how many of the other rocks stays? Same goes for rooves, what holds them up? Far too often they seem unaffected by gravity. Straw rooves which are kept in position by themselves, tiles flying, or perhaps just too heavy for the walls to bear.

TO BE CONTINUED</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LegalAssassin/Bonus Material</title>
    <id>1678</id>
    <revision>
      <id>4150</id>
      <timestamp>2004-05-09T19:06:13Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Although I think a lot of people enjoy the bonus material on the UT2003 CD, I belive Epic could have sent me a box of gravel instead. UED3 takes the prize. Sure, UED2 was buggy, but it was predictable. It felt more like an old friend to me than a simple application. UED3 is completely random and will probably cause more hearts to stop than [input any serial killer here].

I can't create .ase files with any program, so no special collision for my SM's. If it crashes, which you can be sure it'll do before you've had time to get started properly, you have to reboot in order to start UED again. Needless to say, rebooting every 15 minutes is mildly amusing. Could we PLEASE get an UED that works with the most common OS's with UT2004?

That being AT LEAST WinME and later.

Seeing how the reason I bought UT2003 was to mod the game rather than play it (the game itself wasn't much of a hit in my house) I'd expect at least a few of the applications included to work on a pretty average comp.
* UPaint is completely impossible to work with long enough to create a skin, seeing how it'll corrupt your files when you're half-way.
* UED3 crashes every 10-15 minutes, my record uptime was 29 minutes. Also, when it crashes I have to reboot.
* I still haven't had much reason to use KAT as...
* Maya doesn't work at all unless you have Windows 2000 or later. Of course, before you realize that's the problem, you have to go through the most complicated set of forms I've seen for something meant to be free. After one hour of this procedure, I think I should be payed to go on. Never the less, I work my way forward and get the damn key needed to start, only to see Maya detect I have Win ME which is too old. Having been working for 15 minutes on a mailbomb, destination AliasWavefront, I give up and will later be found dressed in pyjamas on a big grass field screaming &quot;WHAT DO YOU WANT FROM ME?!&quot;.

So, I try getting a pirate version of 3DS Max 4. Having struggled for a week trying to get it to work, I give up. I manage to get version 5 and try getting that to work. Having given up a week later, I recieve version 6, supposed to be cracked and working. Smiling like a cat who found your Prozac I try to install. I get an error message not even UED has given me: &quot;Can not install - You need Internet Explorer version 6 or later&quot;. Confused, I manage to find IE6 on Microsoft's site after hours of searching. I install, and when I reopen the install I see a button cleverly hidden among the others: &quot;Install Internet Explorer 6&quot;. Oh well, there's no need to get angry over that, now I can finally install!

After 10 minutes of frantic testing how to work around the next error message, I give up - &quot;Error: You need Windows NT4, 2000, XP or later in order to install 3DS Max&quot;. WAAAAAAAAAAAAGGGGGHHHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DIE EVIL HUMANS!

So, what did I get out of this easteregg adventure courtesy Epic? At least I can see the Wiki sidebar thanks to MSIE6...

UT2004 better be cheap or have bonus material compatible with any standard comp, or I'm going to demand a refund - Epic, fear my wrath!

==Comments ==

'''''AlphaOne:''''' Sorry to hear of those things but I don't believe that anyone cares enough to help you. Best suggestion is : Get win2k.

'''MythOpus:''' The solution to UED 3 is more RAM :)

'''EntropicLqd:''' The most impassioned rants are always the best ones.  I can heartily reccomend an upgrade to XP though.  I had Me for a couple of years and although I got it stable it always felt like it was on the edge of dying.  As loathe as I was to upgrade to XP-Pro - I haev to concede that they've done an outstanding job this time around.  Support for anything other than the NT based OS's isn't likely.

'''Tarquin:''' I have high hopes for [[Legacy:Seppuku|Seppuku]] :)

'''Legal:''' XP costs money, so I guess I'll either have to keep crashing, quit modding or warez it... Ah well, I just had to get this out of my head, pisses me off that I can't do anything with UED3 despite that I could do anything with UED2... If only it'd be less random crashes so I could learn what to do in order to not have it crash :(

I just hope that Epic will make sure their stuff on the UT2004 CD works on average comps too, or I'll have to spend at least two weeks making backups and reinstalling, putting the settings right etc.

'''Mosquito:''' It wont, trust me, you NEED xp, it's really alot better then that ME crap your using.

'''Tarquin:''' Win2000 will be ok too.

'''RegularX:''' Dude, if you're using Windows ME - THAT is your problem right there.  ME is a dog even in Windows-centric circles.  It doesn't matter how good people make their software, ME can find a way to crash.  If you absolutely can't afford XP, I'd almost recommend reverting to Windows 98 somehow - every account I've ever heard is that it's 100x more reliable than ME was.

'''GRAF1K:''' Agreed. ME blows. Hard.

Just a suggestion: I installed XP, then not long after decided it sucked. Good old Win2KX Pro is what I'm on now.</text>
    </revision>
    <revision>
      <id>4151</id>
      <timestamp>2004-03-11T17:01:08Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>ME is a dog</comment>
      <text xml:space="preserve">Although I think a lot of people enjoy the bonus material on the UT2003 CD, I belive Epic could have sent me a box of gravel instead. UED3 takes the prize. Sure, UED2 was buggy, but it was predictable. It felt more like an old friend to me than a simple application. UED3 is completely random and will probably cause more hearts to stop than [input any serial killer here].

I can't create .ase files with any program, so no special collision for my SM's. If it crashes, which you can be sure it'll do before you've had time to get started properly, you have to reboot in order to start UED again. Needless to say, rebooting every 15 minutes is mildly amusing. Could we PLEASE get an UED that works with the most common OS's with UT2004?

That being AT LEAST WinME and later.

Seeing how the reason I bought UT2003 was to mod the game rather than play it (the game itself wasn't much of a hit in my house) I'd expect at least a few of the applications included to work on a pretty average comp.
* UPaint is completely impossible to work with long enough to create a skin, seeing how it'll corrupt your files when you're half-way.
* UED3 crashes every 10-15 minutes, my record uptime was 29 minutes. Also, when it crashes I have to reboot.
* I still haven't had much reason to use KAT as...
* Maya doesn't work at all unless you have Windows 2000 or later. Of course, before you realize that's the problem, you have to go through the most complicated set of forms I've seen for something meant to be free. After one hour of this procedure, I think I should be payed to go on. Never the less, I work my way forward and get the damn key needed to start, only to see Maya detect I have Win ME which is too old. Having been working for 15 minutes on a mailbomb, destination AliasWavefront, I give up and will later be found dressed in pyjamas on a big grass field screaming &quot;WHAT DO YOU WANT FROM ME?!&quot;.

So, I try getting a pirate version of 3DS Max 4. Having struggled for a week trying to get it to work, I give up. I manage to get version 5 and try getting that to work. Having given up a week later, I recieve version 6, supposed to be cracked and working. Smiling like a cat who found your Prozac I try to install. I get an error message not even UED has given me: &quot;Can not install - You need Internet Explorer version 6 or later&quot;. Confused, I manage to find IE6 on Microsoft's site after hours of searching. I install, and when I reopen the install I see a button cleverly hidden among the others: &quot;Install Internet Explorer 6&quot;. Oh well, there's no need to get angry over that, now I can finally install!

After 10 minutes of frantic testing how to work around the next error message, I give up - &quot;Error: You need Windows NT4, 2000, XP or later in order to install 3DS Max&quot;. WAAAAAAAAAAAAGGGGGHHHHHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DIE EVIL HUMANS!

So, what did I get out of this easteregg adventure courtesy Epic? At least I can see the Wiki sidebar thanks to MSIE6...

UT2004 better be cheap or have bonus material compatible with any standard comp, or I'm going to demand a refund - Epic, fear my wrath!

==Comments ==

'''''AlphaOne:''''' Sorry to hear of those things but I don't believe that anyone cares enough to help you. Best suggestion is : Get win2k.

'''MythOpus:''' The solution to UED 3 is more RAM :)

'''EntropicLqd:''' The most impassioned rants are always the best ones.  I can heartily reccomend an upgrade to XP though.  I had Me for a couple of years and although I got it stable it always felt like it was on the edge of dying.  As loathe as I was to upgrade to XP-Pro - I haev to concede that they've done an outstanding job this time around.  Support for anything other than the NT based OS's isn't likely.

'''Tarquin:''' I have high hopes for [[Legacy:Seppuku|Seppuku]] :)

'''Legal:''' XP costs money, so I guess I'll either have to keep crashing, quit modding or warez it... Ah well, I just had to get this out of my head, pisses me off that I can't do anything with UED3 despite that I could do anything with UED2... If only it'd be less random crashes so I could learn what to do in order to not have it crash :(

I just hope that Epic will make sure their stuff on the UT2004 CD works on average comps too, or I'll have to spend at least two weeks making backups and reinstalling, putting the settings right etc.

'''Mosquito:''' It wont, trust me, you NEED xp, it's really alot better then that ME crap your using.

'''Tarquin:''' Win2000 will be ok too.

'''RegularX:''' Dude, if you're using Windows ME - THAT is your problem right there.  ME is a dog even in Windows-centric circles.  It doesn't matter how good people make their software, ME can find a way to crash.  If you absolutely can't afford XP, I'd almost recommend reverting to Windows 98 somehow - every account I've ever heard is that it's 100x more reliable than ME was.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LegalAssassin/Developer Journal</title>
    <id>1677</id>
    <revision>
      <id>4148</id>
      <timestamp>2004-05-24T22:12:08Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>Wow, over a year!</comment>
      <text xml:space="preserve">==LegalAssassin's random work/work in progress/will be done ==

===Info ===

This is were I'll put something I have done, or will do, let alone doing. Updates will be random but something might be of interest, and it'll show up on the recent updates page, so... ah, to hell with it, here it is :)

==Work ==

====20 Nov 2002 ====

Working on a map for TTR (which still wont download properly) and on some gothic stuff for 2k3. I'm using Shane_Church.utx for everything, even static meshes. (Pic below)

[[Image:Legacy_stair.gif|]]

====21 Nov 2002 ====

Just threw something togheter for [Mod_ideas/Killingspree] joke :p

(Drag-and-drop, no remote linking sUx0rz)

http://www.geocities.com/aqqt/rubberduck.gif

====10 Dec 2002 ====

Just watched the Nobel awards. Jimmy Carter is smart, unlike other US presidents...

This is a german WW2 rocketplane, well, at least it did blow up quite often :p

[[Image:Legacy_legalwork_me163.gif|]]

====5 Jan 2003 ====

All fingers intact, though I did manage to light 40 rockets at once, IN MY HAND. Lucky me, they were small, so I dropped 'em and ran like hell, rockets flying around me. No danger, but it was fun to see the old people's reaction :) As always, I get bored, and as always I map when I'm bored. So, I decided to throw a quick beach toghether for TTR. Of course, I started making the terrain behind and now I have actually covered quite a big area. So, next addition will be a town.

Now, I wanted to keep the terrain detail high on the beach, as you wont see that far. However, further inland it'll have to be low-poly, as you see far, over many fields and, of course, the town. So, the terrain brushes got ''very'' messy, but my goal's completed. Here's a quick pic of how messy:

[[Image:Legacy_legalwork_terra_step1.gif|]]

====13 Jan 2003 ====

So, I've dropped out of school. Otherwise, everything's normal :)

You have to see The Two Towers, it's schweet! Only wish I could make the same stuff in UT2003 ;)

Also, I joined the PaintBall: 2003 modteam, less-than-working website: http://www.unrealfans.com/hunter/pb2003/

Basically, AFAIK, it's Paintball. Yes, pretty much it. Here's a Wiki exclusive:

[[Image:Legacy_legalwork_marker.gif|]]

It's a pump-action marker! (Gun, heatens, :rolleyes: )

====29 Jan 2003 ====

With the world going to war, I'm sitting in my basement and realize that you CAN NOT MAKE A FECKEN TERRAIN WITHOUT 40 UED CRASHES :pissed: Wonder if I can get some nukes :p

So, back to the good ol' UEd2... Not as nice, but it works ;)

I'm helping a guy out making a map, and he really sucks at mapping. He hasn't read the tutorials properly and he's got everything out of place. I e, tries making movers going from 2 to 0 to 1, a door. I've explained everything twice, still wont do it. Yes, it was properly explained, but he's impatient. All brushes are out of grid, dimensions like 45, 86, 100, 53 and 394 are standard. How do I tell him to slow down, read the tut's and learn the BASIC basics, the things that is in the start of the first tut?

===15 Feb 2003 ===

Been helping guys out with small stuff lately, like one item to be skinned, showing how to do complex triggers and movers etc, been working out great really. I'm applying to help Chaos UT out with mapping, I liked the UT release and consider meself insane enough to get something Chaotic together :)

My dad's 50th birthday is up today (after I've slept) and we'll have at least 30 guests dropping in, so, not much UED tomorrow ;)

Also, I'm trying to stop the Iraq-shit in any way I can, at least for now, though it's not much, at least I do something :)

Screens of the CUT-map comming up soon :D

===24 May 2004 ===

Holy shit, there's a LOT of crap on this page! Ah well, can't be bothered to clean up now, here's a sample of one of the things I did 

for TTR. It's a map of bunker positions, types and other stuff at a certain dam in Hürtgenwald. This is just one sample of the reference I supplied for mappers, combined with topographic maps showing basic heightlines and both old and new photos, the plan was that it would be possible to create a very nice copy of reality. I guess we all know how that worked out by now :roll:

[[Image:Legacy_legalwork_ttrwork_mapref.gif|center|Sample]]

==Comments ==
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4149</id>
      <timestamp>2003-08-05T09:50:10Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">==LegalAssassin's random work/work in progress/will be done ==

===Info ===

This is were I'll put something I have done, or will do, let alone doing. Updates will be random but something might be of interest, and it'll show up on the recent updates page, so... ah, to hell with it, here it is :)

==Work ==

====20 Nov 2002 ====

Working on a map for TTR (which still wont download properly) and on some gothic stuff for 2k3. I'm using Shane_Church.utx for everything, even static meshes. (Pic below)

[[Image:Legacy_stair.gif|]]

====21 Nov 2002 ====

Just threw something togheter for [Mod_ideas/Killingspree] joke :p

(Drag-and-drop, no remote linking sUx0rz)

http://www.geocities.com/aqqt/rubberduck.gif

====10 Dec 2002 ====

Just watched the Nobel awards. Jimmy Carter is smart, unlike other US presidents...

This is a german WW2 rocketplane, well, at least it did blow up quite often :p

[[Image:Legacy_legalwork_me163.gif|]]

====5 Jan 2003 ====

All fingers intact, though I did manage to light 40 rockets at once, IN MY HAND. Lucky me, they were small, so I dropped 'em and ran like hell, rockets flying around me. No danger, but it was fun to see the old people's reaction :) As always, I get bored, and as always I map when I'm bored. So, I decided to throw a quick beach toghether for TTR. Of course, I started making the terrain behind and now I have actually covered quite a big area. So, next addition will be a town.

Now, I wanted to keep the terrain detail high on the beach, as you wont see that far. However, further inland it'll have to be low-poly, as you see far, over many fields and, of course, the town. So, the terrain brushes got ''very'' messy, but my goal's completed. Here's a quick pic of how messy:

[[Image:Legacy_legalwork_terra_step1.gif|]]

====13 Jan 2003 ====

So, I've dropped out of school. Otherwise, everything's normal :)

You have to see The Two Towers, it's schweet! Only wish I could make the same stuff in UT2003 ;)

Also, I joined the PaintBall: 2003 modteam, less-than-working website: http://www.unrealfans.com/hunter/pb2003/

Basically, AFAIK, it's Paintball. Yes, pretty much it. Here's a Wiki exclusive:

[[Image:Legacy_legalwork_marker.gif|]]

It's a pump-action marker! (Gun, heatens, :rolleyes: )

====29 Jan 2003 ====

With the world going to war, I'm sitting in my basement and realize that you CAN NOT MAKE A FECKEN TERRAIN WITHOUT 40 UED CRASHES :pissed: Wonder if I can get some nukes :p

So, back to the good ol' UEd2... Not as nice, but it works ;)

I'm helping a guy out making a map, and he really sucks at mapping. He hasn't read the tutorials properly and he's got everything out of place. I e, tries making movers going from 2 to 0 to 1, a door. I've explained everything twice, still wont do it. Yes, it was properly explained, but he's impatient. All brushes are out of grid, dimensions like 45, 86, 100, 53 and 394 are standard. How do I tell him to slow down, read the tut's and learn the BASIC basics, the things that is in the start of the first tut?

===15 Feb 2003 ===

Been helping guys out with small stuff lately, like one item to be skinned, showing how to do complex triggers and movers etc, been working out great really. I'm applying to help Chaos UT out with mapping, I liked the UT release and consider meself insane enough to get something Chaotic together :)

My dad's 50th birthday is up today (after I've slept) and we'll have at least 30 guests dropping in, so, not much UED tomorrow ;)

Also, I'm trying to stop the Iraq-shit in any way I can, at least for now, though it's not much, at least I do something :)

Screens of the CUT-map comming up soon :D

==Comment ==

'''Legal:''' Where should I subgroup this?

'''ZxAnPhOrIaN:''' The [[Legacy:Developer Journals|Developer Journals]] page. ;)

'''ZxAnPhOrIaN:''' Also, those static meshes look like the stairways near the damage amp in the orignal UT's DM-Gothic!

'''Legal:''' Dammit! And I thought I was original :( It's for my 2k3 Gothic SM pack ;) I think I'll do that (grouping)

'''ZxAnPhOrIaN:''' And what is ttr

'''Legal:''' www.planetunreal.com/thirdreich - click it!

I like to keep it mysterious, yeah o_O

----

'''ZxAnPhOrIaN:''' Don't you know how to create terrain with the terrain tool?

'''Legal:''' Yes, I do, but with the stability of UED3 on WinME... you get it :pissed: ;)

'''Mosquito:'''You plan do anything with that terrain? if you want you could rip Lest we forget for BSP, I'm not gonna stop you, you could have a great Day map out in afew days if you just rip my Brushes.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LegalAssassin/Epic Rage</title>
    <id>1680</id>
    <revision>
      <id>4154</id>
      <timestamp>2004-06-02T18:33:53Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is an all-out rage on Epic's (and other developers of UnrealTournament 2003-2004) and I'm taking no prisoners. You have been warned.

''Please do not change anything above the Comments paragraph''

==File structure ==

===Duplicated objects and/or packages ===

How could they possibly do it worse? Putting everything in one file would actually make things look tidied up!

First of all, we have the texture/static mesh packages. Who started adding duplicated packages in the first place? I'm talking about the X_ and AW packs, which are copies of the original packs and then contain an additional 2-3 new objects. What's the point in duplicating the package at all? It would be easier and more efficient to REPLACE any broken objects and then add new stuff to a *_2.utx package.

The argument that there were three studios working on it doesn't work, not when mod developers scattered across the world are doing a better job.

'''Fix:''' Repair broken packages and make *_2 packs with additional objects.

===Mini packages ===

Packages with less than 4 objects in them could have been merged with eachother (simular objects). Example: Put all alien textures in A

lienMisc.utx and all generic space textures in Gen_Space.utx. This the way it was (mostly at least) in UT. Yes, there were mini packages in UT as well, and they were equally annoying. However, they weren't all over the Textures directory!

'''Fix:''' Merge packages of simular content. ''Exception: *_2 packages''

===Categories in packages ===

Or the lack of them. Though quite a few packs are decent, most of them have NULL (0, zero) categories. Until you manage to learn all the meshes' names you'll have scrolled through each pack at least 50 times. This is '''NOT''' one of them &quot;happy mapping&quot;-factors, if anyone thought so.

Another part of this is the quite well managed packages which seem to have been done right only to find the Misc category filled with things which could have been added to category Deco to give the impression of order. Now I have to scroll through big rocks, pieces of terrain, arches and plants f different sorts only to find the door I was looking for.

'''Fix:''' Add all the basic categories such as Deco, Wall, Floor, Base etc and sort objects accordingly.

===Naming of packages ===

How am I suspected to find snow textures which in UT were simply enough in GenEarth.utx or maybe another package (if a special was needed) when they are spread across five packages, none of them named anything logic like Ground.utx or Snow.utx. Sure, often you find the package names logic, but the ones named after the map are awful for easy finding. Unless I know ArboreaTerrain.utx was the right one (I'm probably wrong again), I'll spend time opening desert/tropic packages before finding snow.

'''Fix:''' Logic, self-describing, package names. ''Note: In UT2004 you'd have to redo almost every package and split packages for reorginizing''

==UED stability ==

''Under Windows ME''

===UED 2 vs UED 3 ===

How can you manage to break something so completely without doing anything to fix it? UED 2 did crash often if you didn't know what you were doing, that's all true. UED 3, however, crashes at purely random times and situations. In example, selecting surfaces works most of the time, but every now and then it kills UED. Using Ctrl+Alt select doesn't seem to work at all.

It worked, why did it have to be broken? When most developers finally spend time releasing working versions of their tools, Epic is going back in time and breaks compatibility.

'''Fix:''' None, just '''don't break it'''!

===Exporting content - Brush to .obj file ===

Was any time put on checking if this worked? Ok, UED 2 had the broken Save Brush and Open Brush, but at least there was a working alternative. There was never any useable file format you could export to, but then again, it wasn't in the list either. With UED3 being changed in so many ways, would it really have been so hard checking if it worked?

The only clue I have to the exporter's broken-ness is that what I'm trying to export isn't triangulated. This makes the whole idea of exporting brushes for any other format than .t3d seem like a useless &quot;feature&quot; in the first place.

'''Fix:''' Make sure exporters can perform the basic task of exporting.

That's it for now, next time I'm pissed off I'll write a little something about stability.

''What sparked this rant/rage was UED crashing before even opening''

----

==Comments ==

'''EntropicLqd:''' I hear you man.  It was this sort of thing that sparked [[Legacy:The Curse Of Static Meshes|The Curse of Static Meshes]].  And you've not even mentioned the fact that a large number of the meshes and textures used within each of the levels are actually contained within the level's ''MyLevel'' package.  Meaning that you also need to memorise a list of the levels that shipped with UT2004 just in case you want them.

You've have thought that Epic (or one of their associated developers) would have written a small commandlet that replaced one package reference with another to allow textures, meshes, and whatnot to be moved between packages relatively easily.

Count me in on this bit of fist waving.

'''Tarquin:''' The overall fix is: 1: use version management such as CVS, 2: better communication between developers

'''Legal:''' Exactly! Using a CVS and actually cooperating with other studios would have made it look less amaturistic. I wouldn't be happy releasing anything in that state. I just hope they learned something with this and wont do the same thing with Unreal Engine 3, I can't even estimate the filesize of that!

'''RegularX:''' Aw, I was hoping for more rage from the title ;)  ... but I agree. I haven't had enough experience with the textures to comment, but the mesh packaging is atrocious.

'''LegalAssassin:''' Belive me, it was more of a raging rant when I wrote the first draft. I made it a bit more constructive to make it somewhat credible... Part two of this will most likely be up soon, as my entire computer is freaking out at the moment.

'''Tarquin:''' can we mention MESHES THAT ARE OFF GRID?

'''Legal:''' I thought that was the point of [[Legacy:The Curse Of Static Meshes|The Curse of Static Meshes]]... ;) And to be honest, to me that is not a huge problem in relation to stability or finding things at all.

'''WheatPuppet:''' That's why I don't play with the map editor very often, it makes me angry. I feel your pain.
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4155</id>
      <timestamp>2004-05-30T19:32:44Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>Export my ass please</comment>
      <text xml:space="preserve">This is an all-out rage on Epic's (and other developers of UnrealTournament 2003-2004) and I'm taking no prisoners. You have been warned.

''Please do not change anything above the Comments paragraph''

==File structure ==

===Duplicated objects and/or packages ===

How could they possibly do it worse? Putting everything in one file would actually make things look tidied up!

First of all, we have the texture/static mesh packages. Who started adding duplicated packages in the first place? I'm talking about the X_ and AW packs, which are copies of the original packs and then contain an additional 2-3 new objects. What's the point in duplicating the package at all? It would be easier and more efficient to REPLACE any broken objects and then add new stuff to a *_2.utx package.

The argument that there were three studios working on it doesn't work, not when mod developers scattered across the world are doing a better job.

'''Fix:''' Repair broken packages and make *_2 packs with additional objects.

===Mini packages ===

Packages with less than 4 objects in them could have been merged with eachother (simular objects). Example: Put all alien textures in A

lienMisc.utx and all generic space textures in Gen_Space.utx. This the way it was (mostly at least) in UT. Yes, there were mini packages in UT as well, and they were equally annoying. However, they weren't all over the Textures directory!

'''Fix:''' Merge packages of simular content. ''Exception: *_2 packages''

===Categories in packages ===

Or the lack of them. Though quite a few packs are decent, most of them have NULL (0, zero) categories. Until you manage to learn all the meshes' names you'll have scrolled through each pack at least 50 times. This is '''NOT''' one of them &quot;happy mapping&quot;-factors, if anyone thought so.

Another part of this is the quite well managed packages which seem to have been done right only to find the Misc category filled with things which could have been added to category Deco to give the impression of order. Now I have to scroll through big rocks, pieces of terrain, arches and plants f different sorts only to find the door I was looking for.

'''Fix:''' Add all the basic categories such as Deco, Wall, Floor, Base etc and sort objects accordingly.

===Naming of packages ===

How am I suspected to find snow textures which in UT were simply enough in GenEarth.utx or maybe another package (if a special was needed) when they are spread across five packages, none of them named anything logic like Ground.utx or Snow.utx. Sure, often you find the package names logic, but the ones named after the map are awful for easy finding. Unless I know ArboreaTerrain.utx was the right one (I'm probably wrong again), I'll spend time opening desert/tropic packages before finding snow.

'''Fix:''' Logic, self-describing, package names. ''Note: In UT2004 you'd have to redo almost every package and split packages for reorginizing''

==UED stability ==

''Under Windows ME''

===UED 2 vs UED 3 ===

How can you manage to break something so completely without doing anything to fix it? UED 2 did crash often if you didn't know what you were doing, that's all true. UED 3, however, crashes at purely random times and situations. In example, selecting surfaces works most of the time, but every now and then it kills UED. Using Ctrl+Alt select doesn't seem to work at all.

It worked, why did it have to be broken? When most developers finally spend time releasing working versions of their tools, Epic is going back in time and breaks compatibility.

'''Fix:''' None, just '''don't break it'''!

===Exporting content - Brush to .obj file ===

Was any time put on checking if this worked? Ok, UED 2 had the broken Save Brush and Open Brush, but at least there was a working alternative. There was never any useable file format you could export to, but then again, it wasn't in the list either. With UED3 being changed in so many ways, would it really have been so hard checking if it worked?

The only clue I have to the exporter's broken-ness is that what I'm trying to export isn't triangulated. This makes the whole idea of exporting brushes for any other format than .t3d seem like a useless &quot;feature&quot; in the first place.

'''Fix:''' Make sure exporters can perform the basic task of exporting.

That's it for now, next time I'm pissed off I'll write a little something about stability.

''What sparked this rant/rage was UED crashing before even opening''

----

==Comments ==

'''EntropicLqd:''' I hear you man.  It was this sort of thing that sparked [[Legacy:The Curse Of Static Meshes|The Curse of Static Meshes]].  And you've not even mentioned the fact that a large number of the meshes and textures used within each of the levels are actually contained within the level's ''MyLevel'' package.  Meaning that you also need to memorise a list of the levels that shipped with UT2004 just in case you want them.

You've have thought that Epic (or one of their associated developers) would have written a small commandlet that replaced one package reference with another to allow textures, meshes, and whatnot to be moved between packages relatively easily.

Count me in on this bit of fist waving.

'''Tarquin:''' The overall fix is: 1: use version management such as CVS, 2: better communication between developers

'''Legal:''' Exactly! Using a CVS and actually cooperating with other studios would have made it look less amaturistic. I wouldn't be happy releasing anything in that state. I just hope they learned something with this and wont do the same thing with Unreal Engine 3, I can't even estimate the filesize of that!

'''RegularX:''' Aw, I was hoping for more rage from the title ;)  ... but I agree. I haven't had enough experience with the textures to comment, but the mesh packaging is atrocious.

'''LegalAssassin:''' Belive me, it was more of a raging rant when I wrote the first draft. I made it a bit more constructive to make it somewhat credible... Part two of this will most likely be up soon, as my entire computer is freaking out at the moment.

'''Tarquin:''' can we mention MESHES THAT ARE OFF GRID?

'''Legal:''' I thought that was the point of [[Legacy:The Curse Of Static Meshes|The Curse of Static Meshes]]... ;) And to be honest, to me that is not a huge problem in relation to stability or finding things at all.
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LegalAssassin/How Not To Sell A Game</title>
    <id>1681</id>
    <revision>
      <id>4156</id>
      <timestamp>2007-04-26T21:52:49Z</timestamp>
      <contributor>
        <ip>C-71-62-137-31.hsd1.va.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Eidos have just set the example (again). I belive they managed to do everything wrong, at least as far as I'm concerned, when selling Thief 3: Deadly Shadows.

===Release dates ===

This is a shameful behaviour which lack all reason. When the game went gold a month before the US release date there's absolutely no reason to release it yet '''another''' month later in Europe. I can't see this as anything anyone could defend. Shame on thee, Eidos!

===Release dates 2 ===

To have more than two weeks between release dates across the world is undefendable and has been since the late 1950's. Especially so when the original release date was a month later than the date for gold status. To have 10 different release dates for Europe wasn't very intellegent either.

===Demo ===

A demo should always be released before the game, in terms of marketing. Games which have done so (UT series, Call of Duty, Half-Life, Medal of Honor, and so many more) have also recieved a lot more attention than games releasing the demo after the full game (Mafia, Hidden &amp; Dangerous 2, GTA3 PC versions, Unreal 2 and more...). The demo quite clearly serves as a buildup in the hype, and as such does more for the game than a gigantic commercial campaign.

===Demo 2 ===

The demo doesn't have to be perfect, a few bugs wont be noticed in the little time you play the demo. However, it's important to make sure the demo's .exe file isn't broken. I belive the Thief 3 demo is the first demo which has a broken t3game.exe, as in, all I get is an error message when I open it.

When the demo is heavier than 400 mb this is worse than anything.

===Editor ===

I doubt anyone could claim releasing an editor decreases sales. Especially when an editor is available for the basic game engine (Unreal Engine 2), this is odd. Bad move there.

===Marketing ===

Three Flash-ads isn't enough to sell a game.

===Conclusion ===

I see absolutely no reason to buy this game. The demo doesn't work, the release date is horribly planned, there's no editor and I've seen virtually no real marketing done, aside from three different Flash-ads on a few sites. I have absolutely no idea of what the game contains or if it's good, aside from some few reviews and the two earlier Thief games.

There's no reason to pay other than moral values and wanting to see Thief 4, however, even these reasons are somewhat uncertain. Eidos has clearly proved this game's not interesting and I wont be happy to see Thief 4 being sold in the same horrible way Thief 3 is being sold. I think I'll go warez it now and if I like it and can be bothered to buy a legal copy, I might just pay for it.

===Comments ===

'''EntropicLqd:''' No editor, no sale.  I may never use it but I like to know it is there just in case I feel the urge.  The multiple release dates is just indicative of Edios penny pinching I would guess.  They've probably gone for the cheapest publisher they can find in each country.  Even though I was looking forward to the game I still wouldn't warez it though.  It's morally indefensible.

'''T1:''' Eidos sucks. This reminds me of another game they totally messed up. Deus Ex: Invisible War. I was cheated when I bought that game.

Hey heres a whole list of reasons DX:IW sucked.

1. It was only about 2 hours worth of gameplay

2. Unified ammo

3. The AI sucked

4. On &quot;Realistic&quot; mode it takes 3 shots to the head with a pistol to kill someone

5. They took out the skills system

6. It ran really really slow

7. They made their own lighting system that was really unoptimized

8. They claim that the characters can have different facial expressions, but all I can ever see is that all the characters look like they're about to shit their pants.

9. Boringly predictable storyline.

10. No editor

11. Crashes like crazy

12. has a bug where it sometimes claims that my store-bought disc is a warez copy

13. Wierd screen flashes every time I move the mouse.

14. General stupidity (like when you're walking a certain direction and the compass says &quot;north&quot; then you reach a loading point and it switches to &quot;south&quot;)

15. A lot of ingame books and datacubes mention &quot;Red Greasels&quot; and the augmented baboons, both of which are enemies that never actually made into the game.

16. All the previews told us we could be able to kill any important character to change the storyline, but most of the important characters are behind magic bullet proof glass or in &quot;No weapon zones&quot; where your weapons don't work and if you do manage to trick the engine into letting your weapons work via a bug I found, you can't harm them, they just go oof and not take damage.

17. A whole bunch of other reasons I'll remember later.

'''Legal:''' Exactly! They are doing the same thing again, at least as far as marketing is concerned. I'm now downloading the game, as there's no demo working. If it's good I'll buy it, I've already got an order for it. If it's bad I'll simply cancel the order.

'''TurkeyFromHell''': Best. Game. Ever.

==Update ==

Right, I got the warez version and after a few hours of trying I still couldn't run the game. I went to check the official site for information about what might be causing the error, and found nothing at all. I couldn't even find the system requirements! I did manage to find the message boards, however.

A sticky thread named requirements, finally! I checked it out and found that Eidos had yet again found a way to be lamer than any other company in the business.

&quot;Windows NT/2000/XP supported&quot;

I'm happy I didn't pay for this bullshit. As there was no mention of the OS required where I ordered the game I never thought of it. Also, only some special graphic cards are supported, with big gaps in the line. For all what I care, '''Eidos can go fuck themselves'''. I'm soon upgrading anyway, but I'm sure as hell not paying for Thief 3 when I actually run it. Eidos doesn't deserve the dirt under my shoes.

'''Foxpaw:''' I'm somewhat surprised that you'd be surprised to have difficulty running a warez version. Most warezed versions of games (to my knowledge) are somewhat sketchy as to how well they work.

Also I don't quite understand the bit about NT/2000/XP. Why is that lame? If it's because they aren't supporting older operating systems, you may be writing a similar page about Epic soon. Word on UnrealEngine 3 is that they're ditching support for older systems, and it will only operate on a 64 bit system with a 256MB video card minimum. I have to agree to an extent with dropping legacy support in some ways. Legacy support can really cause performance to suffer - you should see half the crap they put in computer hardware these days in a desparate bid to make old concepts &quot;less bad.&quot; The insanity!

But I digress. I don't think it's fair to come down on a company for discarding legacy support. XP has been around for a while. It is itself going to be replaced soon-ish by Windows Longhorn. Discarding legacy support makes code faster, more readable, less buggy, and it can be produced more quickly too - there are less &quot;special cases&quot; to deal with. Also legacy support sometimes requires that you keep old architechtures which are severely outdated. *cough cough* layered architecture *cough*

Of course, I could be totally off base and maybe your comment referred to something else. Regardless, I maintain that warezed software rarely works properly, if at all. I've had my own experiences with warezed software trying to find stuff that seems to have vanished off the face of the Earth and software stores can't even find it in their databases. (like Pax Imperia 2)

'''Legal:''' The warez version of games nowadays are working perfectly in single player modes, for good and for bad. This would have worked perfectly, and I'm glad I tried it as it was the only way to verify it wasn't just the demo that was crap. It was the whole game.

I know that the Unreal 3 engine might be purely 64 bit. I'm almost sure of it, even. I don't mind this at all, I hope it'll happen as soon as possible, maybe I wont have to upgrade my 32 bit system.

However, I do not find it acceptable to see a game based on the Unreal engine forcing people into buying a new OS. There's absolutely no chance for me to pay for both the new OS and the game, just to play the game. Considering how only about 60% of the GFX cards (Geforce 3 and later) are supported makes things worse. Did they actually plan on ''selling'' this game?

Judging by their forum the game was tested by a bunch of 14-year olds, or nobody cared to listen to the testers having trouble. Instead of fixing what was wrong they must have put the hardware on the &quot;Cards not supported&quot;-list.

I see no reason to think of ION Storm nor Eidos as serious, considering how serious their latest releases have been.

I do not doubt it's a good game. But I do doubt cutting half the community off wasn't needed to make it so good.

'''Foxpaw:''' Hmm. I had forgotten that it was Unreal Engine. In that case I'm curious why they have such poor support for a variety of systems. Unless, like with Deus Ex 2, they made their own renderer.

'''Legal:''' Yes, the entire lighting system is said to be amazing, unlike the basic engine... I still can't imagine this excuses the behaviour of Eidos and ION Storm. In a year I would consider it ok, but this is far too early. I have more confidence in mod teams than in the developers of Thief 3 after all this... If this is what will happen to Windows games, I might as well go to Linux straight away. I've had no bad experience with it so far apart from games and other applications being impossible to run.

Seing how almost all developers are now cutting half it's customer base off, I can't see how they'll keep this up. But if it's the way things will be in the next few years I might as well stick to something stable and free, despite that I can't run what I want on it. It's no difference any more.

'''T1:''' Argh EDIT CONLICT. ok fixing now. The lighting system was still over hyped.

'''T1:''' They used the renderer from DX2. That horribly inefficient one I was talking about. BTW Harvey Smith left Ion storm and there have been claims by some that Warren Spector did too, but Eidos denies the last part. Not what's really happening at Ion Storm Austin. I heard Harvey Smith will form his own company. Eidos owns most of Ion Storm anyway. The earlier Theif games and DX were before Daikatana (which caused Eidos to close down Ion Storm Dallas and buy about half of Ion Storm Austin.). Ion Storm should've sticked with the standard renderer and maybe Karma instead of Havok. I think what happened was that Eidos was pushing for Ion to release DX2 too early, it was obviously rushed so it could be released before christmas. No support for Win98? How is that possible?!?!?! It's the same engine as DX2, and that ran on my PC... Of course I had it on the lowest detail level and the bloom lighting doesnt work, I had to turn it off. They've had 2 patches and neither of them fix any of the bugs I actually care about. And the first &quot;patch&quot; was simply a few tweaks to the ini files. They should've included those *with* the game.

continuing the list about why I hate DX2:

17. How has weapon technology gone backwards where I can no longer have a grenade that if you get close to a wall I can attach to the wall to *also* work as a proximity mine???? (I killed my self this way, thinking it could attach to the wall.)

18. How is a little robot dog with a shotgun supposed to make me more intimidated then the hulking military bots from DX1?

19. The main character just looks retarded and sounds like 12-year-old (BOTH with the male *AND* female choises.)

20. Boring anticlimatic endings. All 4 were horrid. (they promised us 5, but the 5th was really just a retarded little &quot;dance party secret ending&quot;.)

21. Havok ragdolls constantly get their arms and legs stuck in ceilings and floors.

22. How did Havok make the game enjoyable? it didnt. Honestly I prefered DX1's physics. True, it may not have been realistic in some ways, but I'm pretty sure that in real life if you drop a fire extinguiser on someone's head from a story up they'll be hurt. This was true in DX but not in DX2.

23. It has a bug where it sometimes claims that my DX2 cd is a warez copy when I legally wasted my money on it.

24. I have to pray at every single loading screen for it not to say &quot;could not authenticate original disc in time&quot; (Yah, they check if you have a warez disc at *every* loading screen, now what's the point of that????)

25. Loading takes forever.

26. It takes AI about 4 seconds to notice they've been shot, at which point, they're probobly already dead.

27. Unified ammo sucks. I run out of ammo for my pistol. Ok lets switch to the shotgun. Wait. That's out of ammo TOO. I have no melee weapons. I'm surrounded by enemy troops. And to make it worse, they're placed in a position where the only way I can possibly sneak by them is by using a cloaking augmentation, which I don't have....

28. Small levels. Smaller than the distance between each loading point in Half-Life.

29. Why did they change all references to &quot;nanotechnological augmentation&quot; (augs) to &quot;biomodification&quot; (biomods)??

30. Why did they change the cool blue color of all the augmentation cannisters to that ugly purple???

31. How can an electronic device called a &quot;multitool&quot; lockpick a door by shooting some kind of yellow lightning at it???? (in DX1 the multitool was used to hack electronic devices, and there was a separate lockpick for non-electronic locks.)

32. The music sucked and was extremely repetitive.

33. I'll think of more reasons later.

hmmmm... maybe I should make this into a rant of my own?

'''EntropicLqd:''' In terms of ditching old technology - it's simply a judgement call based on (presumably) the number of people that are likely to buy the game having the technology to run it.  Not supporting an older OS or graphics card is good sense if you are paying for the support and development of the product.  It not only removes a considerable support overhead as well, but also saves on the development/test/QA sections of the development.  You have the right to be irritated about it (I don't care I have the appropriate OS/Hardware) - but at some point supporting old hardware becomes nonsensical.  Admittedly they are dropping a chunk of the market but half of it?  One would guess not.  I hate them more for fouling up what could have been a great game.  I played the demo and it put me off almost instantly (to the point where I never even bothered finishing the demo).

'''Foxpaw:''' I wholeheartedly agree with your comment about physics systems. I thought they were cool at first, but they're slow, glitchy, and don't really add anything to the gameplay. It's purely an eye-candy thing, but I think the cycles to it could be better devoted to other eye-candy tasks. And, the amount of eye-candy added is minimal - compare a ragdoll death in UT2003 (not sure if skeletal animation deaths were included in UT2004) to the skeletal animation version - they are very similar, but the skeletal animation one is a bit more believable because physics system ragdolls pretty much always look like wire-fighting from cheesy kung fu movies.

'''BobClown:''' I agree with Legal, the warez &quot;market&quot; is working well, these days...  if, of course, you know where to look.  :)  As far as support for &quot;outdated&quot; operating systems goes, support for Windows 98/ME ends June 30, 2006 (http://support.microsoft.com/default.aspx?scid=fh;[LN];LifeAn1), and I would hope that developers would choose to stick with that.  Granted, there are some odds and ends when porting between operating systems, but, for the most part, windows code is pretty portable with itself, especially when using directx api.  Though I think the original rant was about how the website (http://www.dxinvisiblewar.com/) doesn't show system requirements.

'''El Muerte:''' The windows quircks are the issue, not directx. Microsoft often changes little things that have a major impact on the program. This requires you to include an additional OS in the whole testing cycle. That adding an extra OS is a lot of work. When looking for what OS to support you just have to take a look at OS people would use that have the minimum system requirements (hardare only). For example it's impossible to use Win95 or Win98fe when you have an AMD Athlon. And using Win98se or WinME with a newer CPU, like Pentium 4 or Athlon XP\Athlon 64, is just simply a waste of resources.

'''Legal:''' When I bought this computer three years ago it came with Windows ME. It's got a Pentium 4 processor anyway, as Win XP wasn't even available yet. I haven't reinstalled Windows once, and I wont do so just because developers wont make their games work with my OS. If they don't want my moneyt, fine, I'll just warez it once I finally do have to upgrade. At least I hope I wont have to upgrade before the current games are off the market.

I wouldn't be surprised if Epic and other developers are in fact getting their software for free as long as they neglect support for older OS's. Let's face it, make something only work with the latest OS makes people more likely to upgrade. Judging by the official XP map pack and latest patch which destroys UED, Epic has since Unreal grown less and less interested in widening their community, but rather making people stick to their specs so they wont have to do such horrible things as testing their stuff on more than three machines.

'''Dragonmaw:''' I've only played Deus Ex 2's demo, but I can already tell you I hate it.  It's too linear for my tastes.  In the orginal you could go wandering around the city.  In the new one, it tells you exactly where to go and when to go.  It takes the exploration fun out of the game.

I've also played Thief 3 on the Xbox, and it purrs.  It not only purrs, it's one of the best games I have played in a long, long time.  The control scheme was nice, the AI was adequate, nothing like Far Cry, but the gameplay was immersive and expansive.  My kind of game.

I don't know about the PC version though.

'''Genetik:''' I see no reason to hate developers over not supporting Win98. Recently on BuF someone was having difficulties with UT2004, and the screenie they provided showed they were running Win98. They were heartily laughed at. ''Of course''. It's 6-year-old software, and there's no reason anyone should continue to be bothered by it's flaws/lack of functionality anymore. Same goes for Me, which was certainly the buggiest and most annoying peice of crap that ever wasted HD space, even for it's release date. I'm not (I reapeat NOT) going to delay release of any software of mine because it doesn't support Win 3.1, 98, or any other outdated OS.

'''Mosquito:''' Windows 2000 and XP are so vastly superior to 98/ME its foolish to continue to support them. Unless you want a legacy machine, theres no excuse for using them.

'''dataangel''': The OS ranting is, frankly, stupid. Nobody supports Windows95 anymore. Lo and behold, that's starting to happen to Windows98. You make it sound like Eidos/Ion is committing some unheard of attrocity. WinME is pretty much just 98 with DOS stripped off. It endured a very short life &amp;ndash; it's market share is 'tiny'. If I was publishing a game I'd do the same &amp;ndash; I don't want tons of support calls from 98 users running unstable systems. The card ranting is stupid too. Geforce3+ cards are the only ones supported because they're the only ones PHYSICALLY capable of handling the rendering &amp;ndash; even if they coded the most efficient shadowing system in the world, Geforce2 era cards simply don't have the necessary instructions to support real time shadows. The only workaround is an emulator, which would be horribly slow no matter how you worked it. Yes, Eidos/Ion screwed up tons with DX2 and Thief3, but here they did not, and because of your disappointment you're just looking to point out any fault you can, even if it means making them up. That or you're ignorant of the differences between modern Windows OSs and video cards and those of the past.

'''MythOpus:''' Saying things are stupid, is stupididy itself.:P

'''Legal:''' Most of the original rant of mine was actually what I thought before I ordered the game. Lack of motivation and a huge amount of homework made me ignore it the time. When I found out that the demo wasn't working I began actually writing it all down, of course with the utter lazyness of the Thief 3 developers to even test the game. Statements by people working there saying &quot;it might work on some laptops, but we didn't think about testing them&quot; and basing assumptions on wether it'll run or not on speculation isn't what I'd call professional. They have a budget, they actually get payed, hence they should make sure to test it on all the basic configurations of systems users may try to run it on.

Furthermore, things such as not marketing it better than any 12-year old could and listing cards that can't be used on the '''forums''' and not the '''site''' gives me the impression of ION Storm and Eidos not giving a shit wheter I buy it or not. Which, as anyone might guess, is what the title of this page is based on.

To release games such as Doom 3, Thief 3, and other new similar at a time where a large part of the market is using Geforce 4 MX cards, Windows 98SE/ME and the other things in the great list of what you can't do, I find the very idea of not creating fallback systems ignorant. It's quite obvious that people will be more likely to pirate a single player game without any multiplayer support or editor than building their own Geforce FX.

I really find your fanboy approach to my rant interesting, not to say amusing. Did you even read the arguments at the top? All of what's listed are the very most basic demands from the public and companies who care about selling their game. Again, the basic rant (that's all of what's above the &quot;Comments&quot; section) is completely related to the title and reason for this page.

Perhaps, instead of going berzerk on what I think, you could write up a long list of the things that were made right? I have no doubt it's a great game, but I find the reasoning of developers nowadays to be that of a large corporation we call &quot;Microsoft&quot;. &quot;Buy the hard/software we use or it's your own fault you can't play our games&quot;.

As many things Epic has done wrong with the Unreal 2 Engine, they '''did do''' one thing right, where other companies fail. They created a high profile graphics engine first, then added one or sometimes even '''two or three''' levels of fallbacks. This gave them the market of both Linux, Mac and those who still finds UT1 fun enough not to upgrade.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4157</id>
      <timestamp>2004-08-21T11:46:20Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Eidos have just set the example (again). I belive they managed to do everything wrong, at least as far as I'm concerned, when selling Thief 3: Deadly Shadows.

===Release dates ===

This is a shameful behaviour which lack all reason. When the game went gold a month before the US release date there's absolutely no reason to release it yet '''another''' month later in Europe. I can't see this as anything anyone could defend. Shame on thee, Eidos!

===Release dates 2 ===

To have more than two weeks between release dates across the world is undefendable and has been since the late 1950's. Especially so when the original release date was a month later than the date for gold status. To have 10 different release dates for Europe wasn't very intellegent either.

===Demo ===

A demo should always be released before the game, in terms of marketing. Games which have done so (UT series, Call of Duty, Half-Life, Medal of Honor, and so many more) have also recieved a lot more attention than games releasing the demo after the full game (Mafia, Hidden &amp; Dangerous 2, GTA3 PC versions, Unreal 2 and more...). The demo quite clearly serves as a buildup in the hype, and as such does more for the game than a gigantic commercial campaign.

===Demo 2 ===

The demo doesn't have to be perfect, a few bugs wont be noticed in the little time you play the demo. However, it's important to make sure the demo's .exe file isn't broken. I belive the Thief 3 demo is the first demo which has a broken t3game.exe, as in, all I get is an error message when I open it.

When the demo is heavier than 400 mb this is worse than anything.

===Editor ===

I doubt anyone could claim releasing an editor decreases sales. Especially when an editor is available for the basic game engine (Unreal Engine 2), this is odd. Bad move there.

===Marketing ===

Three Flash-ads isn't enough to sell a game.

===Conclusion ===

I see absolutely no reason to buy this game. The demo doesn't work, the release date is horribly planned, there's no editor and I've seen virtually no real marketing done, aside from three different Flash-ads on a few sites. I have absolutely no idea of what the game contains or if it's good, aside from some few reviews and the two earlier Thief games.

There's no reason to pay other than moral values and wanting to see Thief 4, however, even these reasons are somewhat uncertain. Eidos has clearly proved this game's not interesting and I wont be happy to see Thief 4 being sold in the same horrible way Thief 3 is being sold. I think I'll go warez it now and if I like it and can be bothered to buy a legal copy, I might just pay for it.

===Comments ===

'''EntropicLqd:''' No editor, no sale.  I may never use it but I like to know it is there just in case I feel the urge.  The multiple release dates is just indicative of Edios penny pinching I would guess.  They've probably gone for the cheapest publisher they can find in each country.  Even though I was looking forward to the game I still wouldn't warez it though.  It's morally indefensible.

'''T1:''' Eidos sucks. This reminds me of another game they totally messed up. Deus Ex: Invisible War. I was cheated when I bought that game.

Hey heres a whole list of reasons DX:IW sucked.

1. It was only about 2 hours worth of gameplay

2. Unified ammo

3. The AI sucked

4. On &quot;Realistic&quot; mode it takes 3 shots to the head with a pistol to kill someone

5. They took out the skills system

6. It ran really really slow

7. They made their own lighting system that was really unoptimized

8. They claim that the characters can have different facial expressions, but all I can ever see is that all the characters look like they're about to shit their pants.

9. Boringly predictable storyline.

10. No editor

11. Crashes like crazy

12. has a bug where it sometimes claims that my store-bought disc is a warez copy

13. Wierd screen flashes every time I move the mouse.

14. General stupidity (like when you're walking a certain direction and the compass says &quot;north&quot; then you reach a loading point and it switches to &quot;south&quot;)

15. A lot of ingame books and datacubes mention &quot;Red Greasels&quot; and the augmented baboons, both of which are enemies that never actually made into the game.

16. All the previews told us we could be able to kill any important character to change the storyline, but most of the important characters are behind magic bullet proof glass or in &quot;No weapon zones&quot; where your weapons don't work and if you do manage to trick the engine into letting your weapons work via a bug I found, you can't harm them, they just go oof and not take damage.

17. A whole bunch of other reasons I'll remember later.

'''Legal:''' Exactly! They are doing the same thing again, at least as far as marketing is concerned. I'm now downloading the game, as there's no demo working. If it's good I'll buy it, I've already got an order for it. If it's bad I'll simply cancel the order.

==Update ==

Right, I got the warez version and after a few hours of trying I still couldn't run the game. I went to check the official site for information about what might be causing the error, and found nothing at all. I couldn't even find the system requirements! I did manage to find the message boards, however.

A sticky thread named requirements, finally! I checked it out and found that Eidos had yet again found a way to be lamer than any other company in the business.

&quot;Windows NT/2000/XP supported&quot;

I'm happy I didn't pay for this bullshit. As there was no mention of the OS required where I ordered the game I never thought of it. Also, only some special graphic cards are supported, with big gaps in the line. For all what I care, '''Eidos can go fuck themselves'''. I'm soon upgrading anyway, but I'm sure as hell not paying for Thief 3 when I actually run it. Eidos doesn't deserve the dirt under my shoes.

'''Foxpaw:''' I'm somewhat surprised that you'd be surprised to have difficulty running a warez version. Most warezed versions of games (to my knowledge) are somewhat sketchy as to how well they work.

Also I don't quite understand the bit about NT/2000/XP. Why is that lame? If it's because they aren't supporting older operating systems, you may be writing a similar page about Epic soon. Word on UnrealEngine 3 is that they're ditching support for older systems, and it will only operate on a 64 bit system with a 256MB video card minimum. I have to agree to an extent with dropping legacy support in some ways. Legacy support can really cause performance to suffer - you should see half the crap they put in computer hardware these days in a desparate bid to make old concepts &quot;less bad.&quot; The insanity!

But I digress. I don't think it's fair to come down on a company for discarding legacy support. XP has been around for a while. It is itself going to be replaced soon-ish by Windows Longhorn. Discarding legacy support makes code faster, more readable, less buggy, and it can be produced more quickly too - there are less &quot;special cases&quot; to deal with. Also legacy support sometimes requires that you keep old architechtures which are severely outdated. *cough cough* layered architecture *cough*

Of course, I could be totally off base and maybe your comment referred to something else. Regardless, I maintain that warezed software rarely works properly, if at all. I've had my own experiences with warezed software trying to find stuff that seems to have vanished off the face of the Earth and software stores can't even find it in their databases. (like Pax Imperia 2)

'''Legal:''' The warez version of games nowadays are working perfectly in single player modes, for good and for bad. This would have worked perfectly, and I'm glad I tried it as it was the only way to verify it wasn't just the demo that was crap. It was the whole game.

I know that the Unreal 3 engine might be purely 64 bit. I'm almost sure of it, even. I don't mind this at all, I hope it'll happen as soon as possible, maybe I wont have to upgrade my 32 bit system.

However, I do not find it acceptable to see a game based on the Unreal engine forcing people into buying a new OS. There's absolutely no chance for me to pay for both the new OS and the game, just to play the game. Considering how only about 60% of the GFX cards (Geforce 3 and later) are supported makes things worse. Did they actually plan on ''selling'' this game?

Judging by their forum the game was tested by a bunch of 14-year olds, or nobody cared to listen to the testers having trouble. Instead of fixing what was wrong they must have put the hardware on the &quot;Cards not supported&quot;-list.

I see no reason to think of ION Storm nor Eidos as serious, considering how serious their latest releases have been.

I do not doubt it's a good game. But I do doubt cutting half the community off wasn't needed to make it so good.

'''Foxpaw:''' Hmm. I had forgotten that it was Unreal Engine. In that case I'm curious why they have such poor support for a variety of systems. Unless, like with Deus Ex 2, they made their own renderer.

'''Legal:''' Yes, the entire lighting system is said to be amazing, unlike the basic engine... I still can't imagine this excuses the behaviour of Eidos and ION Storm. In a year I would consider it ok, but this is far too early. I have more confidence in mod teams than in the developers of Thief 3 after all this... If this is what will happen to Windows games, I might as well go to Linux straight away. I've had no bad experience with it so far apart from games and other applications being impossible to run.

Seing how almost all developers are now cutting half it's customer base off, I can't see how they'll keep this up. But if it's the way things will be in the next few years I might as well stick to something stable and free, despite that I can't run what I want on it. It's no difference any more.

'''T1:''' Argh EDIT CONLICT. ok fixing now. The lighting system was still over hyped.

'''T1:''' They used the renderer from DX2. That horribly inefficient one I was talking about. BTW Harvey Smith left Ion storm and there have been claims by some that Warren Spector did too, but Eidos denies the last part. Not what's really happening at Ion Storm Austin. I heard Harvey Smith will form his own company. Eidos owns most of Ion Storm anyway. The earlier Theif games and DX were before Daikatana (which caused Eidos to close down Ion Storm Dallas and buy about half of Ion Storm Austin.). Ion Storm should've sticked with the standard renderer and maybe Karma instead of Havok. I think what happened was that Eidos was pushing for Ion to release DX2 too early, it was obviously rushed so it could be released before christmas. No support for Win98? How is that possible?!?!?! It's the same engine as DX2, and that ran on my PC... Of course I had it on the lowest detail level and the bloom lighting doesnt work, I had to turn it off. They've had 2 patches and neither of them fix any of the bugs I actually care about. And the first &quot;patch&quot; was simply a few tweaks to the ini files. They should've included those *with* the game.

continuing the list about why I hate DX2:

17. How has weapon technology gone backwards where I can no longer have a grenade that if you get close to a wall I can attach to the wall to *also* work as a proximity mine???? (I killed my self this way, thinking it could attach to the wall.)

18. How is a little robot dog with a shotgun supposed to make me more intimidated then the hulking military bots from DX1?

19. The main character just looks retarded and sounds like 12-year-old (BOTH with the male *AND* female choises.)

20. Boring anticlimatic endings. All 4 were horrid. (they promised us 5, but the 5th was really just a retarded little &quot;dance party secret ending&quot;.)

21. Havok ragdolls constantly get their arms and legs stuck in ceilings and floors.

22. How did Havok make the game enjoyable? it didnt. Honestly I prefered DX1's physics. True, it may not have been realistic in some ways, but I'm pretty sure that in real life if you drop a fire extinguiser on someone's head from a story up they'll be hurt. This was true in DX but not in DX2.

23. It has a bug where it sometimes claims that my DX2 cd is a warez copy when I legally wasted my money on it.

24. I have to pray at every single loading screen for it not to say &quot;could not authenticate original disc in time&quot; (Yah, they check if you have a warez disc at *every* loading screen, now what's the point of that????)

25. Loading takes forever.

26. It takes AI about 4 seconds to notice they've been shot, at which point, they're probobly already dead.

27. Unified ammo sucks. I run out of ammo for my pistol. Ok lets switch to the shotgun. Wait. That's out of ammo TOO. I have no melee weapons. I'm surrounded by enemy troops. And to make it worse, they're placed in a position where the only way I can possibly sneak by them is by using a cloaking augmentation, which I don't have....

28. Small levels. Smaller than the distance between each loading point in Half-Life.

29. Why did they change all references to &quot;nanotechnological augmentation&quot; (augs) to &quot;biomodification&quot; (biomods)??

30. Why did they change the cool blue color of all the augmentation cannisters to that ugly purple???

31. How can an electronic device called a &quot;multitool&quot; lockpick a door by shooting some kind of yellow lightning at it???? (in DX1 the multitool was used to hack electronic devices, and there was a separate lockpick for non-electronic locks.)

32. The music sucked and was extremely repetitive.

33. I'll think of more reasons later.

hmmmm... maybe I should make this into a rant of my own?

'''EntropicLqd:''' In terms of ditching old technology - it's simply a judgement call based on (presumably) the number of people that are likely to buy the game having the technology to run it.  Not supporting an older OS or graphics card is good sense if you are paying for the support and development of the product.  It not only removes a considerable support overhead as well, but also saves on the development/test/QA sections of the development.  You have the right to be irritated about it (I don't care I have the appropriate OS/Hardware) - but at some point supporting old hardware becomes nonsensical.  Admittedly they are dropping a chunk of the market but half of it?  One would guess not.  I hate them more for fouling up what could have been a great game.  I played the demo and it put me off almost instantly (to the point where I never even bothered finishing the demo).

'''Foxpaw:''' I wholeheartedly agree with your comment about physics systems. I thought they were cool at first, but they're slow, glitchy, and don't really add anything to the gameplay. It's purely an eye-candy thing, but I think the cycles to it could be better devoted to other eye-candy tasks. And, the amount of eye-candy added is minimal - compare a ragdoll death in UT2003 (not sure if skeletal animation deaths were included in UT2004) to the skeletal animation version - they are very similar, but the skeletal animation one is a bit more believable because physics system ragdolls pretty much always look like wire-fighting from cheesy kung fu movies.

'''BobClown:''' I agree with Legal, the warez &quot;market&quot; is working well, these days...  if, of course, you know where to look.  :)  As far as support for &quot;outdated&quot; operating systems goes, support for Windows 98/ME ends June 30, 2006 (http://support.microsoft.com/default.aspx?scid=fh;[LN];LifeAn1), and I would hope that developers would choose to stick with that.  Granted, there are some odds and ends when porting between operating systems, but, for the most part, windows code is pretty portable with itself, especially when using directx api.  Though I think the original rant was about how the website (http://www.dxinvisiblewar.com/) doesn't show system requirements.

'''El Muerte:''' The windows quircks are the issue, not directx. Microsoft often changes little things that have a major impact on the program. This requires you to include an additional OS in the whole testing cycle. That adding an extra OS is a lot of work. When looking for what OS to support you just have to take a look at OS people would use that have the minimum system requirements (hardare only). For example it's impossible to use Win95 or Win98fe when you have an AMD Athlon. And using Win98se or WinME with a newer CPU, like Pentium 4 or Athlon XP\Athlon 64, is just simply a waste of resources.

'''Legal:''' When I bought this computer three years ago it came with Windows ME. It's got a Pentium 4 processor anyway, as Win XP wasn't even available yet. I haven't reinstalled Windows once, and I wont do so just because developers wont make their games work with my OS. If they don't want my moneyt, fine, I'll just warez it once I finally do have to upgrade. At least I hope I wont have to upgrade before the current games are off the market.

I wouldn't be surprised if Epic and other developers are in fact getting their software for free as long as they neglect support for older OS's. Let's face it, make something only work with the latest OS makes people more likely to upgrade. Judging by the official XP map pack and latest patch which destroys UED, Epic has since Unreal grown less and less interested in widening their community, but rather making people stick to their specs so they wont have to do such horrible things as testing their stuff on more than three machines.

'''Dragonmaw:''' I've only played Deus Ex 2's demo, but I can already tell you I hate it.  It's too linear for my tastes.  In the orginal you could go wandering around the city.  In the new one, it tells you exactly where to go and when to go.  It takes the exploration fun out of the game.

I've also played Thief 3 on the Xbox, and it purrs.  It not only purrs, it's one of the best games I have played in a long, long time.  The control scheme was nice, the AI was adequate, nothing like Far Cry, but the gameplay was immersive and expansive.  My kind of game.

I don't know about the PC version though.

'''Genetik:''' I see no reason to hate developers over not supporting Win98. Recently on BuF someone was having difficulties with UT2004, and the screenie they provided showed they were running Win98. They were heartily laughed at. ''Of course''. It's 6-year-old software, and there's no reason anyone should continue to be bothered by it's flaws/lack of functionality anymore. Same goes for Me, which was certainly the buggiest and most annoying peice of crap that ever wasted HD space, even for it's release date. I'm not (I reapeat NOT) going to delay release of any software of mine because it doesn't support Win 3.1, 98, or any other outdated OS.

'''Mosquito:''' Windows 2000 and XP are so vastly superior to 98/ME its foolish to continue to support them. Unless you want a legacy machine, theres no excuse for using them.

'''dataangel''': The OS ranting is, frankly, stupid. Nobody supports Windows95 anymore. Lo and behold, that's starting to happen to Windows98. You make it sound like Eidos/Ion is committing some unheard of attrocity. WinME is pretty much just 98 with DOS stripped off. It endured a very short life &amp;ndash; it's market share is 'tiny'. If I was publishing a game I'd do the same &amp;ndash; I don't want tons of support calls from 98 users running unstable systems. The card ranting is stupid too. Geforce3+ cards are the only ones supported because they're the only ones PHYSICALLY capable of handling the rendering &amp;ndash; even if they coded the most efficient shadowing system in the world, Geforce2 era cards simply don't have the necessary instructions to support real time shadows. The only workaround is an emulator, which would be horribly slow no matter how you worked it. Yes, Eidos/Ion screwed up tons with DX2 and Thief3, but here they did not, and because of your disappointment you're just looking to point out any fault you can, even if it means making them up. That or you're ignorant of the differences between modern Windows OSs and video cards and those of the past.

'''MythOpus:''' Saying things are stupid, is stupididy itself.:P

'''Legal:''' Most of the original rant of mine was actually what I thought before I ordered the game. Lack of motivation and a huge amount of homework made me ignore it the time. When I found out that the demo wasn't working I began actually writing it all down, of course with the utter lazyness of the Thief 3 developers to even test the game. Statements by people working there saying &quot;it might work on some laptops, but we didn't think about testing them&quot; and basing assumptions on wether it'll run or not on speculation isn't what I'd call professional. They have a budget, they actually get payed, hence they should make sure to test it on all the basic configurations of systems users may try to run it on.

Furthermore, things such as not marketing it better than any 12-year old could and listing cards that can't be used on the '''forums''' and not the '''site''' gives me the impression of ION Storm and Eidos not giving a shit wheter I buy it or not. Which, as anyone might guess, is what the title of this page is based on.

To release games such as Doom 3, Thief 3, and other new similar at a time where a large part of the market is using Geforce 4 MX cards, Windows 98SE/ME and the other things in the great list of what you can't do, I find the very idea of not creating fallback systems ignorant. It's quite obvious that people will be more likely to pirate a single player game without any multiplayer support or editor than building their own Geforce FX.

I really find your fanboy approach to my rant interesting, not to say amusing. Did you even read the arguments at the top? All of what's listed are the very most basic demands from the public and companies who care about selling their game. Again, the basic rant (that's all of what's above the &quot;Comments&quot; section) is completely related to the title and reason for this page.

Perhaps, instead of going berzerk on what I think, you could write up a long list of the things that were made right? I have no doubt it's a great game, but I find the reasoning of developers nowadays to be that of a large corporation we call &quot;Microsoft&quot;. &quot;Buy the hard/software we use or it's your own fault you can't play our games&quot;.

As many things Epic has done wrong with the Unreal 2 Engine, they '''did do''' one thing right, where other companies fail. They created a high profile graphics engine first, then added one or sometimes even '''two or three''' levels of fallbacks. This gave them the market of both Linux, Mac and those who still finds UT1 fun enough not to upgrade.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4158</id>
      <timestamp>2007-04-26T21:51:51Z</timestamp>
      <contributor>
        <ip>C-71-62-137-31.hsd1.va.comcast.net</ip>
      </contributor>
      <comment>&lt;3</comment>
      <text xml:space="preserve">Eidos have just set the example (again). I belive they managed to do everything wrong, at least as far as I'm concerned, when selling Thief 3: Deadly Shadows.

===Release dates ===

This is a shameful behaviour which lack all reason. When the game went gold a month before the US release date there's absolutely no reason to release it yet '''another''' month later in Europe. I can't see this as anything anyone could defend. Shame on thee, Eidos!

===Release dates 2 ===

To have more than two weeks between release dates across the world is undefendable and has been since the late 1950's. Especially so when the original release date was a month later than the date for gold status. To have 10 different release dates for Europe wasn't very intellegent either.

===Demo ===

A demo should always be released before the game, in terms of marketing. Games which have done so (UT series, Call of Duty, Half-Life, Medal of Honor, and so many more) have also recieved a lot more attention than games releasing the demo after the full game (Mafia, Hidden &amp; Dangerous 2, GTA3 PC versions, Unreal 2 and more...). The demo quite clearly serves as a buildup in the hype, and as such does more for the game than a gigantic commercial campaign.

===Demo 2 ===

The demo doesn't have to be perfect, a few bugs wont be noticed in the little time you play the demo. However, it's important to make sure the demo's .exe file isn't broken. I belive the Thief 3 demo is the first demo which has a broken t3game.exe, as in, all I get is an error message when I open it.

When the demo is heavier than 400 mb this is worse than anything.

===Editor ===

I doubt anyone could claim releasing an editor decreases sales. Especially when an editor is available for the basic game engine (Unreal Engine 2), this is odd. Bad move there.

===Marketing ===

Three Flash-ads isn't enough to sell a game.

===Conclusion ===

I see absolutely no reason to buy this game. The demo doesn't work, the release date is horribly planned, there's no editor and I've seen virtually no real marketing done, aside from three different Flash-ads on a few sites. I have absolutely no idea of what the game contains or if it's good, aside from some few reviews and the two earlier Thief games.

There's no reason to pay other than moral values and wanting to see Thief 4, however, even these reasons are somewhat uncertain. Eidos has clearly proved this game's not interesting and I wont be happy to see Thief 4 being sold in the same horrible way Thief 3 is being sold. I think I'll go warez it now and if I like it and can be bothered to buy a legal copy, I might just pay for it.

===Comments ===

'''EntropicLqd:''' No editor, no sale.  I may never use it but I like to know it is there just in case I feel the urge.  The multiple release dates is just indicative of Edios penny pinching I would guess.  They've probably gone for the cheapest publisher they can find in each country.  Even though I was looking forward to the game I still wouldn't warez it though.  It's morally indefensible.

'''T1:''' Eidos sucks. This reminds me of another game they totally messed up. Deus Ex: Invisible War. I was cheated when I bought that game.

Hey heres a whole list of reasons DX:IW sucked.

1. It was only about 2 hours worth of gameplay

2. Unified ammo

3. The AI sucked

4. On &quot;Realistic&quot; mode it takes 3 shots to the head with a pistol to kill someone

5. They took out the skills system

6. It ran really really slow

7. They made their own lighting system that was really unoptimized

8. They claim that the characters can have different facial expressions, but all I can ever see is that all the characters look like they're about to shit their pants.

9. Boringly predictable storyline.

10. No editor

11. Crashes like crazy

12. has a bug where it sometimes claims that my store-bought disc is a warez copy

13. Wierd screen flashes every time I move the mouse.

14. General stupidity (like when you're walking a certain direction and the compass says &quot;north&quot; then you reach a loading point and it switches to &quot;south&quot;)

15. A lot of ingame books and datacubes mention &quot;Red Greasels&quot; and the augmented baboons, both of which are enemies that never actually made into the game.

16. All the previews told us we could be able to kill any important character to change the storyline, but most of the important characters are behind magic bullet proof glass or in &quot;No weapon zones&quot; where your weapons don't work and if you do manage to trick the engine into letting your weapons work via a bug I found, you can't harm them, they just go oof and not take damage.

17. A whole bunch of other reasons I'll remember later.

'''Legal:''' Exactly! They are doing the same thing again, at least as far as marketing is concerned. I'm now downloading the game, as there's no demo working. If it's good I'll buy it, I've already got an order for it. If it's bad I'll simply cancel the order.

==Update ==

Right, I got the warez version and after a few hours of trying I still couldn't run the game. I went to check the official site for information about what might be causing the error, and found nothing at all. I couldn't even find the system requirements! I did manage to find the message boards, however.

A sticky thread named requirements, finally! I checked it out and found that Eidos had yet again found a way to be lamer than any other company in the business.

&quot;Windows NT/2000/XP supported&quot;

I'm happy I didn't pay for this bullshit. As there was no mention of the OS required where I ordered the game I never thought of it. Also, only some special graphic cards are supported, with big gaps in the line. For all what I care, '''Eidos can go fuck themselves'''. I'm soon upgrading anyway, but I'm sure as hell not paying for Thief 3 when I actually run it. Eidos doesn't deserve the dirt under my shoes.

'''Foxpaw:''' I'm somewhat surprised that you'd be surprised to have difficulty running a warez version. Most warezed versions of games (to my knowledge) are somewhat sketchy as to how well they work.

Also I don't quite understand the bit about NT/2000/XP. Why is that lame? If it's because they aren't supporting older operating systems, you may be writing a similar page about Epic soon. Word on UnrealEngine 3 is that they're ditching support for older systems, and it will only operate on a 64 bit system with a 256MB video card minimum. I have to agree to an extent with dropping legacy support in some ways. Legacy support can really cause performance to suffer - you should see half the crap they put in computer hardware these days in a desparate bid to make old concepts &quot;less bad.&quot; The insanity!

But I digress. I don't think it's fair to come down on a company for discarding legacy support. XP has been around for a while. It is itself going to be replaced soon-ish by Windows Longhorn. Discarding legacy support makes code faster, more readable, less buggy, and it can be produced more quickly too - there are less &quot;special cases&quot; to deal with. Also legacy support sometimes requires that you keep old architechtures which are severely outdated. *cough cough* layered architecture *cough*

Of course, I could be totally off base and maybe your comment referred to something else. Regardless, I maintain that warezed software rarely works properly, if at all. I've had my own experiences with warezed software trying to find stuff that seems to have vanished off the face of the Earth and software stores can't even find it in their databases. (like Pax Imperia 2)

'''Legal:''' The warez version of games nowadays are working perfectly in single player modes, for good and for bad. This would have worked perfectly, and I'm glad I tried it as it was the only way to verify it wasn't just the demo that was crap. It was the whole game.

I know that the Unreal 3 engine might be purely 64 bit. I'm almost sure of it, even. I don't mind this at all, I hope it'll happen as soon as possible, maybe I wont have to upgrade my 32 bit system.

However, I do not find it acceptable to see a game based on the Unreal engine forcing people into buying a new OS. There's absolutely no chance for me to pay for both the new OS and the game, just to play the game. Considering how only about 60% of the GFX cards (Geforce 3 and later) are supported makes things worse. Did they actually plan on ''selling'' this game?

Judging by their forum the game was tested by a bunch of 14-year olds, or nobody cared to listen to the testers having trouble. Instead of fixing what was wrong they must have put the hardware on the &quot;Cards not supported&quot;-list.

I see no reason to think of ION Storm nor Eidos as serious, considering how serious their latest releases have been.

I do not doubt it's a good game. But I do doubt cutting half the community off wasn't needed to make it so good.

'''Foxpaw:''' Hmm. I had forgotten that it was Unreal Engine. In that case I'm curious why they have such poor support for a variety of systems. Unless, like with Deus Ex 2, they made their own renderer.

'''Legal:''' Yes, the entire lighting system is said to be amazing, unlike the basic engine... I still can't imagine this excuses the behaviour of Eidos and ION Storm. In a year I would consider it ok, but this is far too early. I have more confidence in mod teams than in the developers of Thief 3 after all this... If this is what will happen to Windows games, I might as well go to Linux straight away. I've had no bad experience with it so far apart from games and other applications being impossible to run.

Seing how almost all developers are now cutting half it's customer base off, I can't see how they'll keep this up. But if it's the way things will be in the next few years I might as well stick to something stable and free, despite that I can't run what I want on it. It's no difference any more.

'''T1:''' Argh EDIT CONLICT. ok fixing now. The lighting system was still over hyped.

'''T1:''' They used the renderer from DX2. That horribly inefficient one I was talking about. BTW Harvey Smith left Ion storm and there have been claims by some that Warren Spector did too, but Eidos denies the last part. Not what's really happening at Ion Storm Austin. I heard Harvey Smith will form his own company. Eidos owns most of Ion Storm anyway. The earlier Theif games and DX were before Daikatana (which caused Eidos to close down Ion Storm Dallas and buy about half of Ion Storm Austin.). Ion Storm should've sticked with the standard renderer and maybe Karma instead of Havok. I think what happened was that Eidos was pushing for Ion to release DX2 too early, it was obviously rushed so it could be released before christmas. No support for Win98? How is that possible?!?!?! It's the same engine as DX2, and that ran on my PC... Of course I had it on the lowest detail level and the bloom lighting doesnt work, I had to turn it off. They've had 2 patches and neither of them fix any of the bugs I actually care about. And the first &quot;patch&quot; was simply a few tweaks to the ini files. They should've included those *with* the game.

continuing the list about why I hate DX2:

17. How has weapon technology gone backwards where I can no longer have a grenade that if you get close to a wall I can attach to the wall to *also* work as a proximity mine???? (I killed my self this way, thinking it could attach to the wall.)

18. How is a little robot dog with a shotgun supposed to make me more intimidated then the hulking military bots from DX1?

19. The main character just looks retarded and sounds like 12-year-old (BOTH with the male *AND* female choises.)

20. Boring anticlimatic endings. All 4 were horrid. (they promised us 5, but the 5th was really just a retarded little &quot;dance party secret ending&quot;.)

21. Havok ragdolls constantly get their arms and legs stuck in ceilings and floors.

22. How did Havok make the game enjoyable? it didnt. Honestly I prefered DX1's physics. True, it may not have been realistic in some ways, but I'm pretty sure that in real life if you drop a fire extinguiser on someone's head from a story up they'll be hurt. This was true in DX but not in DX2.

23. It has a bug where it sometimes claims that my DX2 cd is a warez copy when I legally wasted my money on it.

24. I have to pray at every single loading screen for it not to say &quot;could not authenticate original disc in time&quot; (Yah, they check if you have a warez disc at *every* loading screen, now what's the point of that????)

25. Loading takes forever.

26. It takes AI about 4 seconds to notice they've been shot, at which point, they're probobly already dead.

27. Unified ammo sucks. I run out of ammo for my pistol. Ok lets switch to the shotgun. Wait. That's out of ammo TOO. I have no melee weapons. I'm surrounded by enemy troops. And to make it worse, they're placed in a position where the only way I can possibly sneak by them is by using a cloaking augmentation, which I don't have....

28. Small levels. Smaller than the distance between each loading point in Half-Life.

29. Why did they change all references to &quot;nanotechnological augmentation&quot; (augs) to &quot;biomodification&quot; (biomods)??

30. Why did they change the cool blue color of all the augmentation cannisters to that ugly purple???

31. How can an electronic device called a &quot;multitool&quot; lockpick a door by shooting some kind of yellow lightning at it???? (in DX1 the multitool was used to hack electronic devices, and there was a separate lockpick for non-electronic locks.)

32. The music sucked and was extremely repetitive.

33. I'll think of more reasons later.

hmmmm... maybe I should make this into a rant of my own?

'''EntropicLqd:''' In terms of ditching old technology - it's simply a judgement call based on (presumably) the number of people that are likely to buy the game having the technology to run it.  Not supporting an older OS or graphics card is good sense if you are paying for the support and development of the product.  It not only removes a considerable support overhead as well, but also saves on the development/test/QA sections of the development.  You have the right to be irritated about it (I don't care I have the appropriate OS/Hardware) - but at some point supporting old hardware becomes nonsensical.  Admittedly they are dropping a chunk of the market but half of it?  One would guess not.  I hate them more for fouling up what could have been a great game.  I played the demo and it put me off almost instantly (to the point where I never even bothered finishing the demo).

'''Foxpaw:''' I wholeheartedly agree with your comment about physics systems. I thought they were cool at first, but they're slow, glitchy, and don't really add anything to the gameplay. It's purely an eye-candy thing, but I think the cycles to it could be better devoted to other eye-candy tasks. And, the amount of eye-candy added is minimal - compare a ragdoll death in UT2003 (not sure if skeletal animation deaths were included in UT2004) to the skeletal animation version - they are very similar, but the skeletal animation one is a bit more believable because physics system ragdolls pretty much always look like wire-fighting from cheesy kung fu movies.

'''BobClown:''' I agree with Legal, the warez &quot;market&quot; is working well, these days...  if, of course, you know where to look.  :)  As far as support for &quot;outdated&quot; operating systems goes, support for Windows 98/ME ends June 30, 2006 (http://support.microsoft.com/default.aspx?scid=fh;[LN];LifeAn1), and I would hope that developers would choose to stick with that.  Granted, there are some odds and ends when porting between operating systems, but, for the most part, windows code is pretty portable with itself, especially when using directx api.  Though I think the original rant was about how the website (http://www.dxinvisiblewar.com/) doesn't show system requirements.

'''El Muerte:''' The windows quircks are the issue, not directx. Microsoft often changes little things that have a major impact on the program. This requires you to include an additional OS in the whole testing cycle. That adding an extra OS is a lot of work. When looking for what OS to support you just have to take a look at OS people would use that have the minimum system requirements (hardare only). For example it's impossible to use Win95 or Win98fe when you have an AMD Athlon. And using Win98se or WinME with a newer CPU, like Pentium 4 or Athlon XP\Athlon 64, is just simply a waste of resources.

'''Legal:''' When I bought this computer three years ago it came with Windows ME. It's got a Pentium 4 processor anyway, as Win XP wasn't even available yet. I haven't reinstalled Windows once, and I wont do so just because developers wont make their games work with my OS. If they don't want my moneyt, fine, I'll just warez it once I finally do have to upgrade. At least I hope I wont have to upgrade before the current games are off the market.

I wouldn't be surprised if Epic and other developers are in fact getting their software for free as long as they neglect support for older OS's. Let's face it, make something only work with the latest OS makes people more likely to upgrade. Judging by the official XP map pack and latest patch which destroys UED, Epic has since Unreal grown less and less interested in widening their community, but rather making people stick to their specs so they wont have to do such horrible things as testing their stuff on more than three machines.

'''Dragonmaw:''' I've only played Deus Ex 2's demo, but I can already tell you I hate it.  It's too linear for my tastes.  In the orginal you could go wandering around the city.  In the new one, it tells you exactly where to go and when to go.  It takes the exploration fun out of the game.

I've also played Thief 3 on the Xbox, and it purrs.  It not only purrs, it's one of the best games I have played in a long, long time.  The control scheme was nice, the AI was adequate, nothing like Far Cry, but the gameplay was immersive and expansive.  My kind of game.

I don't know about the PC version though.

'''Genetik:''' I see no reason to hate developers over not supporting Win98. Recently on BuF someone was having difficulties with UT2004, and the screenie they provided showed they were running Win98. They were heartily laughed at. ''Of course''. It's 6-year-old software, and there's no reason anyone should continue to be bothered by it's flaws/lack of functionality anymore. Same goes for Me, which was certainly the buggiest and most annoying peice of crap that ever wasted HD space, even for it's release date. I'm not (I reapeat NOT) going to delay release of any software of mine because it doesn't support Win 3.1, 98, or any other outdated OS.

'''Mosquito:''' Windows 2000 and XP are so vastly superior to 98/ME its foolish to continue to support them. Unless you want a legacy machine, theres no excuse for using them.

'''dataangel''': The OS ranting is, frankly, stupid. Nobody supports Windows95 anymore. Lo and behold, that's starting to happen to Windows98. You make it sound like Eidos/Ion is committing some unheard of attrocity. WinME is pretty much just 98 with DOS stripped off. It endured a very short life &amp;ndash; it's market share is 'tiny'. If I was publishing a game I'd do the same &amp;ndash; I don't want tons of support calls from 98 users running unstable systems. The card ranting is stupid too. Geforce3+ cards are the only ones supported because they're the only ones PHYSICALLY capable of handling the rendering &amp;ndash; even if they coded the most efficient shadowing system in the world, Geforce2 era cards simply don't have the necessary instructions to support real time shadows. The only workaround is an emulator, which would be horribly slow no matter how you worked it. Yes, Eidos/Ion screwed up tons with DX2 and Thief3, but here they did not, and because of your disappointment you're just looking to point out any fault you can, even if it means making them up. That or you're ignorant of the differences between modern Windows OSs and video cards and those of the past.

'''MythOpus:''' Saying things are stupid, is stupididy itself.:P

'''Legal:''' Most of the original rant of mine was actually what I thought before I ordered the game. Lack of motivation and a huge amount of homework made me ignore it the time. When I found out that the demo wasn't working I began actually writing it all down, of course with the utter lazyness of the Thief 3 developers to even test the game. Statements by people working there saying &quot;it might work on some laptops, but we didn't think about testing them&quot; and basing assumptions on wether it'll run or not on speculation isn't what I'd call professional. They have a budget, they actually get payed, hence they should make sure to test it on all the basic configurations of systems users may try to run it on.

Furthermore, things such as not marketing it better than any 12-year old could and listing cards that can't be used on the '''forums''' and not the '''site''' gives me the impression of ION Storm and Eidos not giving a shit wheter I buy it or not. Which, as anyone might guess, is what the title of this page is based on.

To release games such as Doom 3, Thief 3, and other new similar at a time where a large part of the market is using Geforce 4 MX cards, Windows 98SE/ME and the other things in the great list of what you can't do, I find the very idea of not creating fallback systems ignorant. It's quite obvious that people will be more likely to pirate a single player game without any multiplayer support or editor than building their own Geforce FX.

I really find your fanboy approach to my rant interesting, not to say amusing. Did you even read the arguments at the top? All of what's listed are the very most basic demands from the public and companies who care about selling their game. Again, the basic rant (that's all of what's above the &quot;Comments&quot; section) is completely related to the title and reason for this page.

Perhaps, instead of going berzerk on what I think, you could write up a long list of the things that were made right? I have no doubt it's a great game, but I find the reasoning of developers nowadays to be that of a large corporation we call &quot;Microsoft&quot;. &quot;Buy the hard/software we use or it's your own fault you can't play our games&quot;.

As many things Epic has done wrong with the Unreal 2 Engine, they '''did do''' one thing right, where other companies fail. They created a high profile graphics engine first, then added one or sometimes even '''two or three''' levels of fallbacks. This gave them the market of both Linux, Mac and those who still finds UT1 fun enough not to upgrade.

'''TurkeyFromHell''': Dude.... Theif 3 is the fcking best game ever xD

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lens Flare</title>
    <id>1645</id>
    <revision>
      <id>4073</id>
      <timestamp>2007-03-03T00:30:48Z</timestamp>
      <contributor>
        <ip>GG-Xtreme</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''lens flare''' is a visual effect assembled of several circles/hexagons that &amp;ndash; when the person is moving &amp;ndash; move opposite of the light source and don't stay on one spot. So they move in the direction that the person is moving. The color of lens flares is generally related to the color of the light. A lens flare is a result of compound lens systems used in cameras and other optical devices, and so some consideration should be given to their use - lens flares do not occur on light sources viewed with the naked eye. Also, lens flares can make it harder to see, so be careful that their use does not adversely impact gameplay.

The textures that are displayed around light sources, but stick at the place where the light is are [[Legacy:Corona|corona]]s. For some reason they're frequently erroneously called &quot;lens flare&quot; as well.

[[Image:Legacy_corona.gif|center|]]

==Lens Flare in the Unreal Engine==

No support for lens flares is built in to the Unreal Engine, but lens flares can be created using UnrealScript. This should be possible with any version of the Unreal Engine, though the specific Unrealscript code required will vary. Lens flares can be created two ways - by drawing them directly onto the screen using the [[Legacy:Canvas|Canvas]], or by creating non-colliding actors in the world. Using actors allows you to make better use of hardware graphics acceleration, though drawing to the [[Legacy:Canvas|Canvas]] will require marginally less memory. Drawing to the [[Legacy:Canvas|Canvas]] may also produce slightly better results, as actors may be clipped by nearby meshes. Both solutions should have negligible impact on performance. With either solution, Unrealscript will be needed to compute the correct positions for the lens flares.

==Making Lens Flares ==

Here's the code I used for a proof of concept I threw together a short while back.  References can be found in the comments.

The idea is that a light source is creating a glare against the &quot;lens&quot; through which we are viewing the world &amp;ndash; in this case the canvas.  The flare effect is then created by drawing a series of coronas along a vector on the canvas which passes through both the light source and the center of the screen.

&lt;uscript&gt;
//-----------------------------------------------------------
// FlareInteraction.
// Adds 1337 lens flares for lights w/ coronas.
// (c) 2002 jasonyu
//-----------------------------------------------------------
class FlareInteraction extends Interaction;

#exec OBJ LOAD FILE=Textures\FlareTextures.utx PACKAGE=LensFlare

var Actor PlayerOwner;
const HLSMAX = 240;
const RGBMAX = 255;


event Initialized()
{
	PlayerOwner = ViewportOwner.Actor;
	log(&quot;Lensflare interaction initialized.&quot;);
}

// adapted from:
// http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html
final simulated function float HueToRGB(float n1, float n2, float hue)
{
	if ( hue &lt; 0 ) hue += HLSMAX;
	if ( hue &gt; HLSMAX ) hue -= HLSMAX;

	/* return r,g, or b value from this tridrant */
	if ( hue &lt; (HLSMAX/6) )
		return ( n1 + (((n2-n1)*hue + (HLSMAX/12))/(HLSMAX/6)) );
	if ( hue &lt; (HLSMAX/2) )
		return n2;
	if ( hue &lt; ((HLSMAX*2)/3) )
		return ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue) + (HLSMAX/12))/(HLSMAX/6)) );
	else
		return n1;
}


final simulated function Color hls2rgb(byte hue, byte lum, byte sat)
{
	local Color C;
	local float Magic1, Magic2;
	local int R,G,B;

	if ( sat==0)
	{     /* achromatic case */
		C.R = (lum*RGBMAX) / HLSMAX;
		C.G = C.R;
		C.B = C.R;
	}
	else
	{       /* chromatic case */
		/* set up magic numbers */
		if (lum &lt;= (HLSMAX/2))
			Magic2 = (lum*(HLSMAX+sat)+(HLSMAX/2)) / HLSMAX;
		else
			Magic2 = lum+sat - ((lum*sat)+(HLSMAX/2)) / HLSMAX;

		Magic1 = 2*lum - Magic2;

		/* get RGB, change units from HLSMAX to RGBMAX */
		R = (HueToRGB(Magic1, Magic2, hue+(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		G = (HueToRGB(Magic1, Magic2, hue)
				* RGBMAX + (HLSMAX/2)) / HLSMAX;

		B = (HueToRGB(Magic1, Magic2, hue-(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
	}

	C.R = R;
	C.G = G;
	C.B = B;
	C.A = 255;
	return C;
}



// adapted from:
// http://www.gamedev.net/reference/articles/article813.asp
simulated function PostRender( canvas Canvas )
{
	local Light Other;
	local float Dist;
	local Vector X,Y,Z, Dir;

	local Vector V, C, L;
	local float Length;
	local float ScaleX, ScaleY;


	if ( ViewportOwner.Actor.Pawn != None ) PlayerOwner = ViewportOwner.Actor.Pawn;
	else PlayerOwner = ViewportOwner.Actor;

	if ( PlayerOwner != None )
	{
		ScaleX = Canvas.SizeX / 640.0;
		ScaleY = Canvas.SizeY / 480.0;

		C.X = Canvas.ClipX/2;
		C.Y = Canvas.ClipY/2;
		GetAxes(PlayerOwner.Rotation, X,Y,Z);
		ForEach PlayerOwner.RadiusActors(class'Light', Other, 2000)
		{
			Dir = Other.Location - PlayerOwner.Location;
			Dist = VSize(Dir);
			Dir = Dir/Dist;
			
			// find an appropriate light source (bright, in FOV)
			if ( (Dir Dot X) &gt; 0.7 &amp;&amp; Other.bCorona &amp;&amp;
				(
				(PlayerOwner.IsA('Pawn') &amp;&amp;  Pawn(PlayerOwner).LineOfSightTo(Other) ) ||
				(PlayerOwner.IsA('Controller') &amp;&amp; Controller(PlayerOwner).LineOfSightTo(Other) )
				) &amp;&amp;
				Other.LightRadius &gt;= 64 &amp;&amp; Other.DrawScale &gt; 0.2 )
			{
				//Convert 3d location to 2d for display on the Canvas
				L = WorldToScreen(Other.location);

				V.X = L.X - C.X;
				V.Y = L.Y - C.Y;
				Length = VSize(V);
				V = Normal(V);

				Canvas.Style = PlayerOwner.ERenderStyle.STY_Additive;

				// tint the corona textures to match the hue of the light
				Canvas.DrawColor = hls2rgb(Other.LightHue, 15, 75);

				// place flares along directional vector
				Canvas.SetPos( (V.X*Length*1.2)-32*ScaleX+C.X, (V.Y*Length*1.2)-32*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare3', 64*ScaleX,64*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length)-32*ScaleX+C.X, (V.Y*Length)-32*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare1', 64*ScaleX,64*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*0.66)-64*ScaleX+C.X, (V.Y*Length*0.66)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare1', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*0.33)-64*ScaleX+C.X, (V.Y*Length*0.33)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare0', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*0.125)-64*ScaleX+C.X, (V.Y*Length*0.125)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare2', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*-0.21)-64*ScaleX+C.X, (V.Y*Length*-0.21)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare3', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*-0.30)-32*ScaleX+C.X, (V.Y*Length*-0.30)-32*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare4', 64*ScaleX,64*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*-0.5)-90*ScaleX+C.X, (V.Y*Length*-0.5)-90*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare4', 180*ScaleX,180*ScaleY,0.0, 0.0, 128, 128);
			}
		}
	}
}

defaultproperties
{
   bVisible=true
   bActive=true
}
&lt;/uscript&gt;

A compiled .u with textures and activating mutator may be located at http://www.boilingpoint.com/~jasonyu/ut/LensFlare.zip

Enjoy.

'''capt.'''

==Links==

http://www.wildtangent.com/developer/howtos/LensFlareHowTo/ - Explanation of how to calculate positions for lens flare effects.

http://www.blackpawn.com/texts/lensflare/default.html - Information on creating good textures for use with lens flares.

[http://www.cambridgeincolour.com/tutorials/lens-flare.html Understanding Lens Flare] - Background on what causes lens flare and techniques to reduce it in photography.

----

'''Ghost3021:''' Wow! Lets combine this with realtime SquirrelZ's realtimeshadows.... :D 

'''Wormbo:''' Lense flares only appear when you use an optical device like a camera, that's why they are called ''lense'' flares. You will never see them with bare eyes, so why combine them with realistic real-time shadows? Both work independantly and that's a good thing, actually.

'''GG-Xtreme:''' It doesn't seem to come with the textures, and it doesn't use a default texture package. Does anyone have a download to LensFlares.utx?</text>
    </revision>
    <revision>
      <id>4074</id>
      <timestamp>2005-05-02T17:51:15Z</timestamp>
      <contributor>
        <ip>Alpha.wwwcache.cam.ac.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''lens flare''' is a visual effect assembled of several circles/hexagons that &amp;ndash; when the person is moving &amp;ndash; move opposite of the light source and don't stay on one spot. So they move in the direction that the person is moving. The color of lens flares is generally related to the color of the light. A lens flare is a result of compound lens systems used in cameras and other optical devices, and so some consideration should be given to their use - lens flares do not occur on light sources viewed with the naked eye. Also, lens flares can make it harder to see, so be careful that their use does not adversely impact gameplay.

The textures that are displayed around light sources, but stick at the place where the light is are [[Legacy:Corona|corona]]s. For some reason they're frequently erroneously called &quot;lens flare&quot; as well.

[[Image:Legacy_corona.gif|center|]]

==Lens Flare in the Unreal Engine==

No support for lens flares is built in to the Unreal Engine, but lens flares can be created using UnrealScript. This should be possible with any version of the Unreal Engine, though the specific Unrealscript code required will vary. Lens flares can be created two ways - by drawing them directly onto the screen using the [[Legacy:Canvas|Canvas]], or by creating non-colliding actors in the world. Using actors allows you to make better use of hardware graphics acceleration, though drawing to the [[Legacy:Canvas|Canvas]] will require marginally less memory. Drawing to the [[Legacy:Canvas|Canvas]] may also produce slightly better results, as actors may be clipped by nearby meshes. Both solutions should have negligible impact on performance. With either solution, Unrealscript will be needed to compute the correct positions for the lens flares.

==Making Lens Flares ==

Here's the code I used for a proof of concept I threw together a short while back.  References can be found in the comments.

The idea is that a light source is creating a glare against the &quot;lens&quot; through which we are viewing the world &amp;ndash; in this case the canvas.  The flare effect is then created by drawing a series of coronas along a vector on the canvas which passes through both the light source and the center of the screen.

&lt;uscript&gt;
//-----------------------------------------------------------
// FlareInteraction.
// Adds 1337 lens flares for lights w/ coronas.
// (c) 2002 jasonyu
//-----------------------------------------------------------
class FlareInteraction extends Interaction;

#exec OBJ LOAD FILE=Textures\FlareTextures.utx PACKAGE=LensFlare

var Actor PlayerOwner;
const HLSMAX = 240;
const RGBMAX = 255;


event Initialized()
{
	PlayerOwner = ViewportOwner.Actor;
	log(&quot;Lensflare interaction initialized.&quot;);
}

// adapted from:
// http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html
final simulated function float HueToRGB(float n1, float n2, float hue)
{
	if ( hue &lt; 0 ) hue += HLSMAX;
	if ( hue &gt; HLSMAX ) hue -= HLSMAX;

	/* return r,g, or b value from this tridrant */
	if ( hue &lt; (HLSMAX/6) )
		return ( n1 + (((n2-n1)*hue + (HLSMAX/12))/(HLSMAX/6)) );
	if ( hue &lt; (HLSMAX/2) )
		return n2;
	if ( hue &lt; ((HLSMAX*2)/3) )
		return ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue) + (HLSMAX/12))/(HLSMAX/6)) );
	else
		return n1;
}


final simulated function Color hls2rgb(byte hue, byte lum, byte sat)
{
	local Color C;
	local float Magic1, Magic2;
	local int R,G,B;

	if ( sat==0)
	{     /* achromatic case */
		C.R = (lum*RGBMAX) / HLSMAX;
		C.G = C.R;
		C.B = C.R;
	}
	else
	{       /* chromatic case */
		/* set up magic numbers */
		if (lum &lt;= (HLSMAX/2))
			Magic2 = (lum*(HLSMAX+sat)+(HLSMAX/2)) / HLSMAX;
		else
			Magic2 = lum+sat - ((lum*sat)+(HLSMAX/2)) / HLSMAX;

		Magic1 = 2*lum - Magic2;

		/* get RGB, change units from HLSMAX to RGBMAX */
		R = (HueToRGB(Magic1, Magic2, hue+(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
		G = (HueToRGB(Magic1, Magic2, hue)
				* RGBMAX + (HLSMAX/2)) / HLSMAX;

		B = (HueToRGB(Magic1, Magic2, hue-(HLSMAX/3))
				* RGBMAX + (HLSMAX/2)) / HLSMAX;
	}

	C.R = R;
	C.G = G;
	C.B = B;
	C.A = 255;
	return C;
}



// adapted from:
// http://www.gamedev.net/reference/articles/article813.asp
simulated function PostRender( canvas Canvas )
{
	local Light Other;
	local float Dist;
	local Vector X,Y,Z, Dir;

	local Vector V, C, L;
	local float Length;
	local float ScaleX, ScaleY;


	if ( ViewportOwner.Actor.Pawn != None ) PlayerOwner = ViewportOwner.Actor.Pawn;
	else PlayerOwner = ViewportOwner.Actor;

	if ( PlayerOwner != None )
	{
		ScaleX = Canvas.SizeX / 640.0;
		ScaleY = Canvas.SizeY / 480.0;

		C.X = Canvas.ClipX/2;
		C.Y = Canvas.ClipY/2;
		GetAxes(PlayerOwner.Rotation, X,Y,Z);
		ForEach PlayerOwner.RadiusActors(class'Light', Other, 2000)
		{
			Dir = Other.Location - PlayerOwner.Location;
			Dist = VSize(Dir);
			Dir = Dir/Dist;
			
			// find an appropriate light source (bright, in FOV)
			if ( (Dir Dot X) &gt; 0.7 &amp;&amp; Other.bCorona &amp;&amp;
				(
				(PlayerOwner.IsA('Pawn') &amp;&amp;  Pawn(PlayerOwner).LineOfSightTo(Other) ) ||
				(PlayerOwner.IsA('Controller') &amp;&amp; Controller(PlayerOwner).LineOfSightTo(Other) )
				) &amp;&amp;
				Other.LightRadius &gt;= 64 &amp;&amp; Other.DrawScale &gt; 0.2 )
			{
				//Convert 3d location to 2d for display on the Canvas
				L = WorldToScreen(Other.location);

				V.X = L.X - C.X;
				V.Y = L.Y - C.Y;
				Length = VSize(V);
				V = Normal(V);

				Canvas.Style = PlayerOwner.ERenderStyle.STY_Additive;

				// tint the corona textures to match the hue of the light
				Canvas.DrawColor = hls2rgb(Other.LightHue, 15, 75);

				// place flares along directional vector
				Canvas.SetPos( (V.X*Length*1.2)-32*ScaleX+C.X, (V.Y*Length*1.2)-32*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare3', 64*ScaleX,64*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length)-32*ScaleX+C.X, (V.Y*Length)-32*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare1', 64*ScaleX,64*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*0.66)-64*ScaleX+C.X, (V.Y*Length*0.66)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare1', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*0.33)-64*ScaleX+C.X, (V.Y*Length*0.33)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare0', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*0.125)-64*ScaleX+C.X, (V.Y*Length*0.125)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare2', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*-0.21)-64*ScaleX+C.X, (V.Y*Length*-0.21)-64*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare3', 128*ScaleX,128*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*-0.30)-32*ScaleX+C.X, (V.Y*Length*-0.30)-32*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare4', 64*ScaleX,64*ScaleY,0.0, 0.0, 128, 128);

				Canvas.SetPos( (V.X*Length*-0.5)-90*ScaleX+C.X, (V.Y*Length*-0.5)-90*ScaleY+C.Y );
				Canvas.DrawTile(Texture'LensFlare4', 180*ScaleX,180*ScaleY,0.0, 0.0, 128, 128);
			}
		}
	}
}

defaultproperties
{
   bVisible=true
   bActive=true
}
&lt;/uscript&gt;

A compiled .u with textures and activating mutator may be located at http://www.boilingpoint.com/~jasonyu/ut/LensFlare.zip

Enjoy.

'''capt.'''

==Links==

http://www.wildtangent.com/developer/howtos/LensFlareHowTo/ - Explanation of how to calculate positions for lens flare effects.

http://www.blackpawn.com/texts/lensflare/default.html - Information on creating good textures for use with lens flares.

[http://www.cambridgeincolour.com/tutorials/lens-flare.html Understanding Lens Flare] - Background on what causes lens flare and techniques to reduce it in photography.

----

'''Ghost3021:''' Wow! Lets combine this with realtime SquirrelZ's realtimeshadows.... :D 

'''Wormbo:''' Lense flares only appear when you use an optical device like a camera, that's why they are called ''lense'' flares. You will never see them with bare eyes, so why combine them with realistic real-time shadows? Both work independantly and that's a good thing, actually.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LesserOpenUnrealModLicense</title>
    <id>1730</id>
    <revision>
      <id>4259</id>
      <timestamp>2006-04-06T22:23:43Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">Please read the introduction of the [[Legacy:OpenUnrealModLicense|Open Unreal Mod License]] first.

This license is almost the same with one important exception: This license grants everybody to re-use your work. Their work does not have to be released as free software.

All other rules still apply, thus modifications of your code should still be released as free software.

==The license==

You have to include a copy of this license with your mod.

        Lesser Open Unreal Mod License 
        Version 1.1, September 2005
        
        0. Definitions
        &quot;Program&quot;       the work, either in binary or source form, that has a notice 
                        attached to it stating that it has been released under this 
                        license it by the copyright holder.
        &quot;Modification&quot;  a derivate of the Program or any other work based on the Program
        &quot;Linking&quot;       using parts of the Program, or using parts of any other work, 
                        thus creating a direct dependency between two Programs.
        &quot;You&quot;           the licensee
        &quot;Runtime Environment&quot;
                        the virtual machine or operating system required to run the 
                        Program, as released by the Publisher or Creator of said
                        runtime environment. This includes any extentions or updates
                        for the runtime environment released by the Publisher or 
                        Creator.
        
        1. License
        Herewith everybody is granted permission to copy and distribute verbatim copies 
        of this document. The only restriction lies on changing the content, with the 
        exception to translation of this license.
        
        This license applies to the Program that has been released under this license. 
        The license only applies to copying, distribution and modification of the 
        Program. Execution or output of the Program are not covered by this license, 
        however the right for additional limitations on the use (that do not cover 
        copying, distribution or modification) is granted to the copyright holder.
        This license is only valid when all terms in this license comply with the 
        licenses of the dependecies of the Program. This includes the license of the
        possible required runtime environment.
        
        2. Copying and distribution
        You are granted to copy or distribute verbatim copies of the Program, on any 
        medium, or in any format as you see fit. You are not limited to charging a fee 
        for the physical act of transferring the copy, nor are you limited to provide 
        warranty for the Program in return of a fee. Unless this is prohibited by the
        license of the Runtime Environment.
        
        Any distribution of the program should be accompanied with a verbatim copy of 
        this license.
        
        3. Modification
        You are allowed to modify the Program, or portions of it, therefore making it a 
        derivate of the Program. You are allowed to distribute your Modifications under 
        the following conditions:
                - You must clearly state that it is a modification of the Program
                - The original copyright notice must be kept intact
                - The modified files must contain notices of the changes made to it
                - The Modification must be released under the same license as the Program
                - Distribution happens in compliance with section 2
        
        4. Source
        The original source of the Program or Modification must be freely available on 
        request.
        
        5. Linking        
        The license grants exclusive right to link with any non-free part of the 
        Runtime Environment, as provided by the publisher or creator of said Runtime 
        Environment. 
        Using addapted portions of source code available in the runtime environment 
        in the Program is only allowed under the following terms:
                - the addapted code is clearly marked to originate from the runtime
                  environment, quoting the original copyright.
                - the following notice is added to the top of the file:
                  &quot;This file contains portions of code from the runtime environment.&quot;
        
        6. NON WARRANTY
        THIS SOFTWARE DOES NOT COME WITH A WARRANTY OF ANY KIND, UNLESS NOTED OTHERWISE 
        BY THE COPYRIGHT HOLDER OR WARRANTY PROVIDER. THE ENTIRE RISK OF THE PERFORMANCE 
        AND QUALITY OF THE PROGRAM LIES WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 
        YOU WILL ASSUME ALL COSTS FOR REQUIRED REPAIR OR CORRECTION.

==How to use==

When you want to release your mod under this license you have to include the above license with your mod and add the following to every source file:

    &lt;name of the program&gt;
    Copyright (C) &lt;year(s) of completion&gt; &lt;name of author&gt;
    
    This program is free software; you can redistribute and/or modify 
    it under the terms of the Lesser Open Unreal Mod License version 1.1.

'''Important note'''

If you release your whole mod under this license it will also cover all other assets like maps, meshes, etc. If you do not want this you can dual license your mod (e.g. use this license for the code and a non-free license for maps).

==FAQ==

===Why should I ''not'' use this license but the [[Legacy:OpenUnrealModLicense|UOML]]?===

This license permits others from using your work in their non-free software. They could profit from your work without you getting anything in return.

==Other versions==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.0]] - deprecated
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.1]] - current

==Related pages==

* [[Legacy:OpenUnrealModLicense|OpenUnrealModLicense]] - Similar license, this one allows linking with non-free work
* [[Legacy:Open Source|Open Source]]

==Discussion==

'''El Muerte:''' removed the first paragraf of section 5, thus permitting to link with everything.

'''Snake.PLiSKiN:''' Has any one really read the EULA?  (Open the file \UT200x\System\'''License.int''' in windows notepad) And read section &quot;'''11. Editor and End user Mods.'''&quot;, Im pretty sure it is a violation for any mod to have any type of copyrighted material.  I really think that someone should contact epic and get a statement on this matter. Because I think epic didnt want for people to sue one another because one mod used some of the work in another mod. Everything that does not require having a license of the Unreal Engine, can be easily decompiled, if a mod author didnt like that, they need to purchase a license.  If you want to really copyright your work, you need to pay for the right to do so is how I take it after reading the EULA.

'''El Muerte:''' read this: [[Legacy:Mod Copyright|Mod Copyright]], it explains it all.</text>
    </revision>
    <revision>
      <id>4260</id>
      <timestamp>2006-04-06T21:06:38Z</timestamp>
      <contributor>
        <ip>211-45-98-114.nexg.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">Please read the introduction of the [[Legacy:OpenUnrealModLicense|Open Unreal Mod License]] first.

This license is almost the same with one important exception: This license grants everybody to re-use your work. Their work does not have to be released as free software.

All other rules still apply, thus modifications of your code should still be released as free software.

==The license==

You have to include a copy of this license with your mod.

        Lesser Open Unreal Mod License 
        Version 1.1, September 2005
        
        0. Definitions
        &quot;Program&quot;       the work, either in binary or source form, that has a notice 
                        attached to it stating that it has been released under this 
                        license it by the copyright holder.
        &quot;Modification&quot;  a derivate of the Program or any other work based on the Program
        &quot;Linking&quot;       using parts of the Program, or using parts of any other work, 
                        thus creating a direct dependency between two Programs.
        &quot;You&quot;           the licensee
        &quot;Runtime Environment&quot;
                        the virtual machine or operating system required to run the 
                        Program, as released by the Publisher or Creator of said
                        runtime environment. This includes any extentions or updates
                        for the runtime environment released by the Publisher or 
                        Creator.
        
        1. License
        Herewith everybody is granted permission to copy and distribute verbatim copies 
        of this document. The only restriction lies on changing the content, with the 
        exception to translation of this license.
        
        This license applies to the Program that has been released under this license. 
        The license only applies to copying, distribution and modification of the 
        Program. Execution or output of the Program are not covered by this license, 
        however the right for additional limitations on the use (that do not cover 
        copying, distribution or modification) is granted to the copyright holder.
        This license is only valid when all terms in this license comply with the 
        licenses of the dependecies of the Program. This includes the license of the
        possible required runtime environment.
        
        2. Copying and distribution
        You are granted to copy or distribute verbatim copies of the Program, on any 
        medium, or in any format as you see fit. You are not limited to charging a fee 
        for the physical act of transferring the copy, nor are you limited to provide 
        warranty for the Program in return of a fee. Unless this is prohibited by the
        license of the Runtime Environment.
        
        Any distribution of the program should be accompanied with a verbatim copy of 
        this license.
        
        3. Modification
        You are allowed to modify the Program, or portions of it, therefore making it a 
        derivate of the Program. You are allowed to distribute your Modifications under 
        the following conditions:
                - You must clearly state that it is a modification of the Program
                - The original copyright notice must be kept intact
                - The modified files must contain notices of the changes made to it
                - The Modification must be released under the same license as the Program
                - Distribution happens in compliance with section 2
        
        4. Source
        The original source of the Program or Modification must be freely available on 
        request.
        
        5. Linking        
        The license grants exclusive right to link with any non-free part of the 
        Runtime Environment, as provided by the publisher or creator of said Runtime 
        Environment. 
        Using addapted portions of source code available in the runtime environment 
        in the Program is only allowed under the following terms:
                - the addapted code is clearly marked to originate from the runtime
                  environment, quoting the original copyright.
                - the following notice is added to the top of the file:
                  &quot;This file contains portions of code from the runtime environment.&quot;
        
        6. NON WARRANTY
        THIS SOFTWARE DOES NOT COME WITH A WARRANTY OF ANY KIND, UNLESS NOTED OTHERWISE 
        BY THE COPYRIGHT HOLDER OR WARRANTY PROVIDER. THE ENTIRE RISK OF THE PERFORMANCE 
        AND QUALITY OF THE PROGRAM LIES WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 
        YOU WILL ASSUME ALL COSTS FOR REQUIRED REPAIR OR CORRECTION.

==How to use==

When you want to release your mod under this license you have to include the above license with your mod and add the following to every source file:

    &lt;name of the program&gt;
    Copyright (C) &lt;year(s) of completion&gt; &lt;name of author&gt;
    
    This program is free software; you can redistribute and/or modify 
    it under the terms of the Lesser Open Unreal Mod License version 1.1.

'''Important note'''

If you release your whole mod under this license it will also cover all other assets like maps, meshes, etc. If you do not want this you can dual license your mod (e.g. use this license for the code and a non-free license for maps).

==FAQ==

===Why should I ''not'' use this license but the [[Legacy:OpenUnrealModLicense|UOML]]?===

This license permits others from using your work in their non-free software. They could profit from your work without you getting anything in return.

==Other versions==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.0]] - deprecated
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.1]] - current

==Related pages==

* [[Legacy:OpenUnrealModLicense|OpenUnrealModLicense]] - Similar license, this one allows linking with non-free work
* [[Legacy:Open Source|Open Source]]

==Discussion==

'''El Muerte:''' removed the first paragraf of section 5, thus permitting to link with everything.

'''Snake.PLiSKiN:''' Has any one really read the EULA?  (Open the file \UT200x\System\'''License.int''' in windows notepad) And read section &quot;'''11. Editor and End user Mods.'''&quot;, Im pretty sure it is a violation for any mod to have any type of copyrighted material.  I really think that someone should contact epic and get a statement on this matter. Because I think epic didnt want for people to sue one another because one mod used some of the work in another mod. Everything that does not require having a license of the Unreal Engine, can be easily decompiled, if a mod author didnt like that, they need to purchase a license.  If you want to really copyright your work, you need to pay for the right to do so is how I take it after reading the EULA.

'''El Muerte:''' read this: [[Legacy:Mod Copyright|Mod Copyright]], it explains it all.

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
    <revision>
      <id>35432</id>
      <timestamp>2009-09-20T11:24:25Z</timestamp>
      <contributor>
        <username>WGH</username>
        <id>676</id>
      </contributor>
      <minor/>
      <comment>/* Why should I not use this license but the UOML? */  UOML -&gt; OUML :)</comment>
      <text xml:space="preserve">Please read the introduction of the [[Legacy:OpenUnrealModLicense|Open Unreal Mod License]] first.

This license is almost the same with one important exception: This license grants everybody to re-use your work. Their work does not have to be released as free software.

All other rules still apply, thus modifications of your code should still be released as free software.

==The license==

You have to include a copy of this license with your mod.

        Lesser Open Unreal Mod License 
        Version 1.1, September 2005
        
        0. Definitions
        &quot;Program&quot;       the work, either in binary or source form, that has a notice 
                        attached to it stating that it has been released under this 
                        license it by the copyright holder.
        &quot;Modification&quot;  a derivate of the Program or any other work based on the Program
        &quot;Linking&quot;       using parts of the Program, or using parts of any other work, 
                        thus creating a direct dependency between two Programs.
        &quot;You&quot;           the licensee
        &quot;Runtime Environment&quot;
                        the virtual machine or operating system required to run the 
                        Program, as released by the Publisher or Creator of said
                        runtime environment. This includes any extentions or updates
                        for the runtime environment released by the Publisher or 
                        Creator.
        
        1. License
        Herewith everybody is granted permission to copy and distribute verbatim copies 
        of this document. The only restriction lies on changing the content, with the 
        exception to translation of this license.
        
        This license applies to the Program that has been released under this license. 
        The license only applies to copying, distribution and modification of the 
        Program. Execution or output of the Program are not covered by this license, 
        however the right for additional limitations on the use (that do not cover 
        copying, distribution or modification) is granted to the copyright holder.
        This license is only valid when all terms in this license comply with the 
        licenses of the dependecies of the Program. This includes the license of the
        possible required runtime environment.
        
        2. Copying and distribution
        You are granted to copy or distribute verbatim copies of the Program, on any 
        medium, or in any format as you see fit. You are not limited to charging a fee 
        for the physical act of transferring the copy, nor are you limited to provide 
        warranty for the Program in return of a fee. Unless this is prohibited by the
        license of the Runtime Environment.
        
        Any distribution of the program should be accompanied with a verbatim copy of 
        this license.
        
        3. Modification
        You are allowed to modify the Program, or portions of it, therefore making it a 
        derivate of the Program. You are allowed to distribute your Modifications under 
        the following conditions:
                - You must clearly state that it is a modification of the Program
                - The original copyright notice must be kept intact
                - The modified files must contain notices of the changes made to it
                - The Modification must be released under the same license as the Program
                - Distribution happens in compliance with section 2
        
        4. Source
        The original source of the Program or Modification must be freely available on 
        request.
        
        5. Linking        
        The license grants exclusive right to link with any non-free part of the 
        Runtime Environment, as provided by the publisher or creator of said Runtime 
        Environment. 
        Using addapted portions of source code available in the runtime environment 
        in the Program is only allowed under the following terms:
                - the addapted code is clearly marked to originate from the runtime
                  environment, quoting the original copyright.
                - the following notice is added to the top of the file:
                  &quot;This file contains portions of code from the runtime environment.&quot;
        
        6. NON WARRANTY
        THIS SOFTWARE DOES NOT COME WITH A WARRANTY OF ANY KIND, UNLESS NOTED OTHERWISE 
        BY THE COPYRIGHT HOLDER OR WARRANTY PROVIDER. THE ENTIRE RISK OF THE PERFORMANCE 
        AND QUALITY OF THE PROGRAM LIES WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 
        YOU WILL ASSUME ALL COSTS FOR REQUIRED REPAIR OR CORRECTION.

==How to use==

When you want to release your mod under this license you have to include the above license with your mod and add the following to every source file:

    &lt;name of the program&gt;
    Copyright (C) &lt;year(s) of completion&gt; &lt;name of author&gt;
    
    This program is free software; you can redistribute and/or modify 
    it under the terms of the Lesser Open Unreal Mod License version 1.1.

'''Important note'''

If you release your whole mod under this license it will also cover all other assets like maps, meshes, etc. If you do not want this you can dual license your mod (e.g. use this license for the code and a non-free license for maps).

==FAQ==

===Why should I ''not'' use this license but the [[Legacy:OpenUnrealModLicense|OUML]]?===

This license permits others from using your work in their non-free software. They could profit from your work without you getting anything in return.

==Other versions==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.0]] - deprecated
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.1]] - current

==Related pages==

* [[Legacy:OpenUnrealModLicense|OpenUnrealModLicense]] - Similar license, this one allows linking with non-free work
* [[Legacy:Open Source|Open Source]]

==Discussion==

'''El Muerte:''' removed the first paragraf of section 5, thus permitting to link with everything.

'''Snake.PLiSKiN:''' Has any one really read the EULA?  (Open the file \UT200x\System\'''License.int''' in windows notepad) And read section &quot;'''11. Editor and End user Mods.'''&quot;, Im pretty sure it is a violation for any mod to have any type of copyrighted material.  I really think that someone should contact epic and get a statement on this matter. Because I think epic didnt want for people to sue one another because one mod used some of the work in another mod. Everything that does not require having a license of the Unreal Engine, can be easily decompiled, if a mod author didnt like that, they need to purchase a license.  If you want to really copyright your work, you need to pay for the right to do so is how I take it after reading the EULA.

'''El Muerte:''' read this: [[Legacy:Mod Copyright|Mod Copyright]], it explains it all.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LesserOpenUnrealModLicense/Version 1.0</title>
    <id>1746</id>
    <revision>
      <id>4290</id>
      <timestamp>2005-09-07T11:04:46Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Version 1.0 (deprecated)==

        Lesser Open Unreal Mod License 
        Version 1, March 2004
        
        0. Definitions
        &quot;Program&quot;       the work, either in binary or source form, that has a notice 
                        attached to it stating that it has been released under this 
                        license it by the copyright holder.
        &quot;Modification&quot;  a derivate of the Program or any other work based on the Program
        &quot;Linking&quot;       using parts of the Program, or using parts of any other work, 
                        thus creating a direct dependency
        &quot;You&quot;           the licensee
        &quot;Runtime Environment&quot;
                        the virtual machine or operating system required to run the 
                        Program, as released by the Publisher or Creator of said
                        runtime environment. This includes any extentions or updates
                        for the runtime environment released by the Publisher or 
                        Creator.
        
        1. License
        Herewith everybody is granted permission to copy and distribute verbatim copies 
        of this document. The only restriction lies on changing the content, with the 
        exception to translation of this license.
        
        This license applies to the Program that has been released under this license. 
        The license only applies to copying, distribution and modification of the 
        Program. Execution or output of the Program are not covered by this license, 
        however the right for additional limitations on the use (that do not cover 
        copying, distribution or modification) is granted to the copyright holder.
        This license is only valid when all terms in this license comply with the 
        licenses of the dependecies of the Program. This includes the license of the
        possible required runtime environment.
        
        2. Copying and distribution
        You are granted to copy or distribute verbatim copies of the Program, on any 
        medium, or in any format as you see fit. You are not limited to charging a fee 
        for the physical act of transferring the copy, nor are you limited to provide 
        warranty for the Program in return of a fee. Unless this is prohibited by the
        license of the Runtime Environment.
        
        Any distribution of the program should be accompanied with a verbatim copy of 
        this license.
        
        3. Modification
        You are allowed to modify the Program, or portions of it, therefore making it a 
        derivate of the Program. You are allowed to distribute your modifications under 
        the following conditions:
                - You must clearly state that it is a modification or derivate of the 
                  Program
                - The original copyright notice must be kept intact
                - The modified files must contain notices of the changes made to it
                - The Modification must be released under the same license as the Program
                - Distribution happens in compliance with section 2
        
        4. Source
        The original source of the Program or Modification must be freely available on 
        request.
        
        5. Linking        
        The license grants exclusive right to link with any part of the Runtime 
        Environment, as provided by the publisher or creator of said Runtime 
        Environment. 
        Reusing pieces of source code available in the runtime environment in the 
        Program is only allowed under the following terms:
                - the &quot;borrowed&quot; code is clearly marked to originate from the runtime
                  environment, quoting the original copyright.
                - the following notice is added to the top of the file:
                  &quot;This file contains portions of code from the runtime environment.&quot;
        
        The right to &quot;port&quot; the Program to another runtime environment is reserved for 
        the copyright holder.
        
        6. NON WARRANTY
        THIS SOFTWARE DOES NOT COME WITH A WARRANTY OF ANY KIND, UNLESS NOTED OTHERWISE 
        BY THE COPYRIGHT HOLDER OR WARRANTY PROVIDER. THE ENTIRE RISK OF THE PERFORMANCE 
        AND QUALITY OF THE PROGRAM LIES WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 
        YOU WILL ASSUME ALL COSTS FOR REQUIRED REPAIR OR CORRECTION.

==Notice==

This is an older version of this license and only available here for archive perposes. You are adviced to use the most recent version of [[Legacy:LesserOpenUnrealModLicense|this]] license.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LesserOpenUnrealModLicense/Version 1.1</title>
    <id>1747</id>
    <revision>
      <id>4291</id>
      <timestamp>2005-09-07T11:01:50Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Version 1.1 (current)==

        Lesser Open Unreal Mod License 
        Version 1.1, September 2005
        
        0. Definitions
        &quot;Program&quot;       the work, either in binary or source form, that has a notice 
                        attached to it stating that it has been released under this 
                        license it by the copyright holder.
        &quot;Modification&quot;  a derivate of the Program or any other work based on the Program
        &quot;Linking&quot;       using parts of the Program, or using parts of any other work, 
                        thus creating a direct dependency between two Programs.
        &quot;You&quot;           the licensee
        &quot;Runtime Environment&quot;
                        the virtual machine or operating system required to run the 
                        Program, as released by the Publisher or Creator of said
                        runtime environment. This includes any extentions or updates
                        for the runtime environment released by the Publisher or 
                        Creator.
        
        1. License
        Herewith everybody is granted permission to copy and distribute verbatim copies 
        of this document. The only restriction lies on changing the content, with the 
        exception to translation of this license.
        
        This license applies to the Program that has been released under this license. 
        The license only applies to copying, distribution and modification of the 
        Program. Execution or output of the Program are not covered by this license, 
        however the right for additional limitations on the use (that do not cover 
        copying, distribution or modification) is granted to the copyright holder.
        This license is only valid when all terms in this license comply with the 
        licenses of the dependecies of the Program. This includes the license of the
        possible required runtime environment.
        
        2. Copying and distribution
        You are granted to copy or distribute verbatim copies of the Program, on any 
        medium, or in any format as you see fit. You are not limited to charging a fee 
        for the physical act of transferring the copy, nor are you limited to provide 
        warranty for the Program in return of a fee. Unless this is prohibited by the
        license of the Runtime Environment.
        
        Any distribution of the program should be accompanied with a verbatim copy of 
        this license.
        
        3. Modification
        You are allowed to modify the Program, or portions of it, therefore making it a 
        derivate of the Program. You are allowed to distribute your Modifications under 
        the following conditions:
                - You must clearly state that it is a modification of the Program
                - The original copyright notice must be kept intact
                - The modified files must contain notices of the changes made to it
                - The Modification must be released under the same license as the Program
                - Distribution happens in compliance with section 2
        
        4. Source
        The original source of the Program or Modification must be freely available on 
        request.
        
        5. Linking        
        The license grants exclusive right to link with any non-free part of the 
        Runtime Environment, as provided by the publisher or creator of said Runtime 
        Environment. 
        Using addapted portions of source code available in the runtime environment 
        in the Program is only allowed under the following terms:
                - the addapted code is clearly marked to originate from the runtime
                  environment, quoting the original copyright.
                - the following notice is added to the top of the file:
                  &quot;This file contains portions of code from the runtime environment.&quot;
        
        6. NON WARRANTY
        THIS SOFTWARE DOES NOT COME WITH A WARRANTY OF ANY KIND, UNLESS NOTED OTHERWISE 
        BY THE COPYRIGHT HOLDER OR WARRANTY PROVIDER. THE ENTIRE RISK OF THE PERFORMANCE 
        AND QUALITY OF THE PROGRAM LIES WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 
        YOU WILL ASSUME ALL COSTS FOR REQUIRED REPAIR OR CORRECTION.

==Differences with version 1.0==

There is one major difference between this version and [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Version 1.0]] and that is that this version does ''not'' contain the clause
        The right to &quot;port&quot; the Program to another runtime environment is reserved for 
        the copyright holder.

This clause was meaningless. Creating a port of the program is equal to creating a derivate. Creating a derivate of the program was already allowed. Therefor this clause has been removed from the license.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Level Properties</title>
    <id>1647</id>
    <revision>
      <id>4078</id>
      <timestamp>2005-07-19T07:19:08Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This window looks exactly like the [[Legacy:Actor Properties Window|Actor Properties window]], and holds properties for the level as a whole. Open it in one of the following ways:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.

It's in fact the properties for an actor of the class [[Legacy:LevelInfo|LevelInfo]], which added automatically but UnrealEd to a new map, but made invisible. AFAIK, the only property group that's relevant is LevelInfo.

The Audio section is also useful for adding music to a level - ''Birelli''

==Properties ==
:&lt;i&gt;Note: [[Legacy:LevelInfo|LevelInfo]] covers this in more depth. I suggest we keep on this page just the essentials that pammers will need.  ''Tarquin''  &lt;/i&gt;

:&lt;i&gt;Yeah. [[Legacy:LevelInfo|LevelInfo]] is the page for docers.  ;-)  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

===Stuff for the UT browser ===
; Title : Name of the map.
; Author : Who built it.
; IdealPlayerCount : Ideal number of players for this level, as a string, eg &quot;6-8&quot;
; Texture Screenshot : A preview of the map. (see [[Legacy:Level Screenshot|Level Screenshot]])

===Game ===

; DefaultGameType : 
[[Legacy:Gametype|Gametype]] you want to have your map played with in the format &quot;Package.ClassName&quot; e.g. xGame.[[Legacy:XCTFGame|xCTFGame]] for CTF maps. This is essential for a number of gametypes to work correctly. Valid values are found in the [[Legacy:Actor Browser|Actor browser]] under [[Legacy:GameInfo (UT)|GameInfo (UT)]]. Here's a list of the built-ins:
* DM : XGame.xDeathMatch
* TDM : XGame.xTeamgame
* CTF : XGame.xCTFGame
* vCTF : XGame.xVehicleCTFGame
* BR : XGame.xBombingRun
* DOM : XGame.xDoubleDom
* ONS : Onslaught.ONSOnslaughtGame
* AS : UT2k4Assault.ASGameInfo 




===Surrogate ZoneInfo ===

LevelInfo can set properties  for any zones that don't have their own [[Legacy:ZoneInfo|ZoneInfo]] actor.

Eg
*  [[Legacy:Zonelight|Zonelight]] 
* gravity
* etc

==Trivia ==
* You can in fact look at the properties of [[Legacy:LevelInfo|LevelInfo]] in the [[Legacy:Actor Properties Window|Actor Properties window]], by selecting the LevelInfo0 object in the [[Legacy:Actor Search|Actor Search]] window.
* If you for some reason want to see the [[Legacy:LevelInfo|LevelInfo]] actor in your map, set  [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bHiddenEd = false.

----

[[:Category:Legacy To Do]]:
* Add all properties relevant for mappers (with explanation).

'''Tarquin:'''  I've made myself a textPad macro which takes a block of &quot;var()&quot; lines and turns them into a block of wiki &quot;;:&quot;. I'll run LevelInfo's script through it next time I have UEd open. (which reminds me... [[Legacy:UnDox Revisited|UnDox Revisited]]...)

'''Tarquin:'''  Doh. all the props are on [[Legacy:LevelInfo|LevelInfo]].

'''Mychaeel:'''  I know, but if that's sufficient then this page is obsolete and we should delete it.  Or [[Legacy:LevelInfo|LevelInfo]] should remain the reference for docers (see above) and this page should get a bit more comprehensive for mappers' needs.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4079</id>
      <timestamp>2005-01-14T02:52:53Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">This window looks exactly like the [[Legacy:Actor Properties Window|Actor Properties window]], and holds properties for the level as a whole. Open it in one of the following ways:
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.

It's in fact the properties for an actor of the class [[Legacy:LevelInfo|LevelInfo]], which added automatically but UnrealEd to a new map, but made invisible. AFAIK, the only property group that's relevant is LevelInfo.

The Audio section is also useful for adding music to a level - ''Birelli''

==Properties ==
:&lt;i&gt;Note: [[Legacy:LevelInfo|LevelInfo]] covers this in more depth. I suggest we keep on this page just the essentials that pammers will need.  ''Tarquin''  &lt;/i&gt;

:&lt;i&gt;Yeah. [[Legacy:LevelInfo|LevelInfo]] is the page for docers.  ;-)  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

===Stuff for the UT browser ===
; Title : Name of the map.
; Author : Who built it.
; IdealPlayerCount : Ideal number of players for this level, as a string, eg &quot;6-8&quot;
; Texture Screenshot : A preview of the map. (see [[Legacy:Level Screenshot|Level Screenshot]])

===Game ===

; DefaultGameType : [[Legacy:Gametype|Game type]] you want to have your map played with. Used by the &quot;[[Legacy:Playtest|playtest]]&quot; button in the [[Legacy:Toolbar|toolbar]] and when your map is started by double-clicking it in Explorer. Valid values are found in the [[Legacy:Actor Browser|Actor browser]] under [[Legacy:GameInfo (UT)|GameInfo (UT)]]. Commonly used values are [[Legacy:AS|Assault]], [[Legacy:CTF|CTFGame]], [[Legacy:DM|DeathMatchPlus]], [[Legacy:DOM|Domination]] and [[Legacy:Jailbreak|Jailbreak]].

===Surrogate ZoneInfo ===

LevelInfo can set properties  for any zones that don't have their own [[Legacy:ZoneInfo|ZoneInfo]] actor.

Eg
*  [[Legacy:Zonelight|Zonelight]] 
* gravity
* etc

==Trivia ==
* You can in fact look at the properties of [[Legacy:LevelInfo|LevelInfo]] in the [[Legacy:Actor Properties Window|Actor Properties window]], by selecting the LevelInfo0 object in the [[Legacy:Actor Search|Actor Search]] window.
* If you for some reason want to see the [[Legacy:LevelInfo|LevelInfo]] actor in your map, set  [[Legacy:Actor (UT)/Advanced|Advanced]] -&gt; bHiddenEd = false.

----

[[:Category:Legacy To Do]]:
* Add all properties relevant for mappers (with explanation).

'''Tarquin:'''  I've made myself a textPad macro which takes a block of &quot;var()&quot; lines and turns them into a block of wiki &quot;;:&quot;. I'll run LevelInfo's script through it next time I have UEd open. (which reminds me... [[Legacy:UnDox Revisited|UnDox Revisited]]...)

'''Tarquin:'''  Doh. all the props are on [[Legacy:LevelInfo|LevelInfo]].

'''Mychaeel:'''  I know, but if that's sufficient then this page is obsolete and we should delete it.  Or [[Legacy:LevelInfo|LevelInfo]] should remain the reference for docers (see above) and this page should get a bit more comprehensive for mappers' needs.

[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Level Screenshot</title>
    <id>1745</id>
    <revision>
      <id>4287</id>
      <timestamp>2007-06-02T12:18:10Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <minor/>
      <comment>Fix link text</comment>
      <text xml:space="preserve">A screenshot is just that: a saved picture taken from the monitor display. It also means the pictures you see in the game when you're choosing a map: screenshots of the map that are embedded in the map.

You might be looking for:
* [[Legacy:Making Screenshots|Making Screenshots]] &amp;ndash; taking shots of the game; recommendations on how to clean up, present, etc. 
* taking shots of [[Legacy:UnrealEd|UnrealEd]] &amp;ndash; insert brain (hit '''PrtSc''' like in the rest of Windows and paste into your favourite [[Legacy:Graphics Application|graphics application]])
* [[Legacy:Screenshot (UT)|Screenshot (UT)]] &amp;ndash; adding a screenshot to a UT map

The rest of this page is for [[Legacy:UT2003|UT200x]].

==Screenshots in UT200x ==

To add a screenshot to a UT200x map:

===Make individual screenshots===
# Take your [[Legacy:Making Screenshots|screenshots]] &amp; clean them up. Resize them to 512x256 pixels.
# [[Legacy:Import The Texture|Import The Texture]]s:
#* Package: [[Legacy:MyLevel|MyLevel]]
#* Group: (you can leave this blank)
#* Name: (anything you like; it's easiest if the screenshots are numbered for a material sequence)
#* Uncheck Generate Mipmaps
# Apply texture compression: Do [[Legacy:Material Context Menu|Material Context Menu]] -&gt; Compress -&gt; DXT1
# Avoid ugliness at lower texture levels: Do [[Legacy:Material Context Menu|Material Context Menu]] -&gt; Properties, and then expand Textures and set LODSet to LODSet_Interface

===Make a sequence===

Now your screenshots are in, you need a [[Legacy:MaterialSequence|MaterialSequence]] that will display them in sequence and fade between them.

The SequenceItems array of materials will look like this:

+ (Show Shot1)

++  Material=Shot1

++ MSA_ShowMaterial

+ (Fade Shot1 to Shot2)

++ Material=Shot2

++ MSA_FadeToMaterial

+ (Show Shot2)

++ Material=Shot2

++ MSA_ShowMaterial

+ (Fade Shot2 to Shot3)

++ Material=Shot3

++ MSA_FadeToMaterial

+ (Show Shot3)

++ Material=Shot3

++ MSA_ShowMaterial

+ (Fade back to Shot1)

++ Material=Shot1

++ MSA_FadeToMaterial

To make this, do the following:

# Create a new material:
#* Package: [[Legacy:MyLevel|MyLevel]]
#* Group: (same group as the screenshots)
#* Name: (anything)
#* Class: Raw Material
#* MaterialClass: Class'Engine.[[Legacy:MaterialSequence|MaterialSequence]]'
# In the [[Legacy:MaterialSequence|MaterialSequence]] properties do the following:
#*Click SequenceItems -&gt; Add
#*Minimize the properties window and select your first screenshot from the texture browser
#*Go back to properties and click SequenceItems -&gt; [0] -&gt; Material -&gt; Use
#*Set the time to 1.5
#*Add another Material under SequencedItems. This time, use your second screenshot, 1.0 for Time, and MSA_FadeToMaterial for Action. This is the transition to the second shot.
#*Add another SequencedItem just like the first except with your second screenshot again.
#*Continue adding 2 SequencedItems for each of your following screenshots.
#*Once you have all of your screenshots set, add one final SequencedItem. Use you first screenshot, 1.0 for Time, and MSA_FadeToMaterial for Action.
#*Finally, set FallbackMaterial to your first screenshot.
#Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; [[Legacy:Level Properties|Level Properties]]
# [[Legacy:Set The Resource Property|Set The Resource Property]] LevelSummary -&gt; Screenshot to the new [[Legacy:MaterialSequence|MaterialSequence]].
#Save your level and be sure '''not''' to save the [[Legacy:MyLevel|MyLevel]] package. Just leave it and everything will work.

==Related Topics ==
* [[Legacy:MyLevel|MyLevel]] pseudopackage
* [[Legacy:MaterialSequence|MaterialSequence]] class

----

'''MadNad''' Shouldn't this title be Level Shots ?

'''MythOpus Nods In Agreement''' It Should Yes :)

'''Tarquin:''' interesting idea. Any further opinions?

'''Wormbo:''' It's a preview image of the map, which is a screenshot of the map in most cases. How about a redirect from [[Legacy:Level Shots|Level Shots]] to this page?

'''SuperApe:''' ''I'd name it Level Screenshots, as it's named in Ued.  Isn't it?''  Anyway, I've noticed in UT2004, that the game is saving a cache of info from the maps in your Maps/ directory.  If you bring new version of your custom map into Maps/, the game will not recognize new level info, most noticably the Level Screenshot.  To get around this, remove your custom map from Maps/, run UT2004, browse your available maps, exit UT2004, and move the new copy of your map into Maps/.  I hope that a) makes sense and b) is helpful. :)

'''Evolution:''' Or just run 'ucc exportcache MyMap.ut2' after closing UnrealEd, if you've changed the screenshot (note: in the next patch, UnrealEd will automatically perform this step whenever you save the map :))

'''SirKline:''' Another way is to delete the mymap.ucl file in the system directory. Then you'll see the shot. 

'''Splenge:''' I can't seem to import an image to the textures. i have followed all the instructions and when I press OK the texture browser window comes up with all the textures that are open. Does anyone have any ideas? the type of fil I am using is a bmp and i have resized it to 256x256.

'''Tarquin:''' Check the list on [[Legacy:Import The Texture|Import The Texture]]. What's the colour depth?

'''MythOpus:''' Also, if you try to import a texture and it doesn't work. take a look at the UnrealEd log.

'''Splenge:''' I should really be putting this on the UT page but i've still got a BIG problem. The only way i can put a screenshot into the textures is by putting it into the textures file. the problem is when i load up the test run it says error and then a message about init or something.

'''Tarquin:''' um ... what were you trying to do? Do you mean &quot;MyLevel&quot; didn't work?

'''Otter:''' Completely different question: perhaps I'm wrote, but I could have sworn there was a way to use a camera in game to create a realtime animated texture. Say, for example, a security camera that relays a 256 x 256 image to a screen located elewhere.  Where can I find info on this?

'''Wormbo:''' That's done using a [[Legacy:ScriptedTexture|ScriptedTexture]], but will only work in UT200x with the D3D renderer.

'''Off-Kilter:''' I'm with SuperApe that this should be called Level Screenshot or Level Screenshots. I found this page searching for 'screenshot'.

'''Graphik:''' Renamed.

'''LionsPhil:''' It's worth noting that, although the desired texture resolution may be 512x256, it isn't displayed to that aspect ratio (2.0), but instead to something more akin to 1.5, meaning that you want to crop to, say, 512x384 (or use something like The GIMP's crop tool to do the calculations for you ;) ), and then do a non-aspect-ratio-preserving scale down to 512x256.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4288</id>
      <timestamp>2005-07-02T20:02:14Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>renamed</comment>
      <text xml:space="preserve">A screenshot is just that: a saved picture taken from the monitor display. It also means the pictures you see in the game when you're choosing a map: screenshots of the map that are embedded in the map.

You might be looking for:
* [[Legacy:Making Screenshots|Making Screenshots]] &amp;ndash; taking shots of the game; recommendations on how to clean up, present, etc. 
* taking shots of [[Legacy:UnrealEd|UnrealEd]] &amp;ndash; insert brain (hit '''PrtSc''' like in the rest of Windows and paste into your favourite [[Legacy:Graphics Application|graphics application]])
* [[Legacy:Screenshot (UT)|Screenshot (UT)]] &amp;ndash; adding a screenshot to a UT map

The rest of this page is for [[Legacy:UT2003|UT2003]].

==Screenshots in UT2003 ==

To add a screenshot to a UT2003 map:

===Make individual screenshots===
# Take your [[Legacy:Making Screenshots|Making Screenshots]]s &amp; clean them up. Resize them to 512x256 pixels.
# [[Legacy:Import The Texture|Import The Texture]]s:
#* Package: [[Legacy:MyLevel|MyLevel]]
#* Group: (you can leave this blank)
#* Name: (anything you like; it's easiest if the screenshots are numbered for a material sequence)
#* Uncheck Generate Mipmaps
# Apply texture compression: Do [[Legacy:Material Context Menu|Material Context Menu]] -&gt; Compress -&gt; DXT1
# Avoid ugliness at lower texture levels: Do [[Legacy:Material Context Menu|Material Context Menu]] -&gt; Properties, and then expand Textures and set LODSet to LODSet_Interface

===Make a sequence===

Now your screenshots are in, you need a [[Legacy:MaterialSequence|MaterialSequence]] that will display them in sequence and fade between them.

The SequenceItems array of materials will look like this:

+ (Show Shot1)

++  Material=Shot1

++ MSA_ShowMaterial

+ (Fade Shot1 to Shot2)

++ Material=Shot2

++ MSA_FadeToMaterial

+ (Show Shot2)

++ Material=Shot2

++ MSA_ShowMaterial

+ (Fade Shot2 to Shot3)

++ Material=Shot3

++ MSA_FadeToMaterial

+ (Show Shot3)

++ Material=Shot3

++ MSA_ShowMaterial

+ (Fade back to Shot1)

++ Material=Shot1

++ MSA_FadeToMaterial

To make this, do the following:

# Create a new material:
#* Package: [[Legacy:MyLevel|MyLevel]]
#* Group: (same group as the screenshots)
#* Name: (anything)
#* Class: Raw Material
#* MaterialClass: Class'Engine.[[Legacy:MaterialSequence|MaterialSequence]]'
# In the [[Legacy:MaterialSequence|MaterialSequence]] properties do the following:
#*Click SequenceItems -&gt; Add
#*Minimize the properties window and select your first screenshot from the texture browser
#*Go back to properties and click SequenceItems -&gt; [0] -&gt; Material -&gt; Use
#*Set the time to 1.5
#*Add another Material under SequencedItems. This time, use your second screenshot, 1.0 for Time, and MSA_FadeToMaterial for Action. This is the transition to the second shot.
#*Add another SequencedItem just like the first except with your second screenshot again.
#*Continue adding 2 SequencedItems for each of your following screenshots.
#*Once you have all of your screenshots set, add one final SequencedItem. Use you first screenshot, 1.0 for Time, and MSA_FadeToMaterial for Action.
#*Finally, set FallbackMaterial to your first screenshot.
#Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; [[Legacy:Level Properties|Level Properties]]
# [[Legacy:Set The Resource Property|Set The Resource Property]] LevelSummary -&gt; Screenshot to the new [[Legacy:MaterialSequence|MaterialSequence]].
#Save your level and be sure '''not''' to save the [[Legacy:MyLevel|MyLevel]] package. Just leave it and everything will work.

==Related Topics ==
* [[Legacy:MyLevel|MyLevel]] pseudopackage
* [[Legacy:MaterialSequence|MaterialSequence]] class

----

'''MadNad''' Shouldn't this title be Level Shots ?

'''MythOpus Nods In Agreement''' It Should Yes :)

'''Tarquin:''' interesting idea. Any further opinions?

'''Wormbo:''' It's a preview image of the map, which is a screenshot of the map in most cases. How about a redirect from [[Legacy:Level Shots|Level Shots]] to this page?

'''SuperApe:''' ''I'd name it Level Screenshots, as it's named in Ued.  Isn't it?''  Anyway, I've noticed in UT2004, that the game is saving a cache of info from the maps in your Maps/ directory.  If you bring new version of your custom map into Maps/, the game will not recognize new level info, most noticably the Level Screenshot.  To get around this, remove your custom map from Maps/, run UT2004, browse your available maps, exit UT2004, and move the new copy of your map into Maps/.  I hope that a) makes sense and b) is helpful. :)

'''Evolution:''' Or just run 'ucc exportcache MyMap.ut2' after closing UnrealEd, if you've changed the screenshot (note: in the next patch, UnrealEd will automatically perform this step whenever you save the map :))

'''SirKline:''' Another way is to delete the mymap.ucl file in the system directory. Then you'll see the shot. 

'''Splenge:''' I can't seem to import an image to the textures. i have followed all the instructions and when I press OK the texture browser window comes up with all the textures that are open. Does anyone have any ideas? the type of fil I am using is a bmp and i have resized it to 256x256.

'''Tarquin:''' Check the list on [[Legacy:Import The Texture|Import The Texture]]. What's the colour depth?

'''MythOpus:''' Also, if you try to import a texture and it doesn't work. take a look at the UnrealEd log.

'''Splenge:''' I should really be putting this on the UT page but i've still got a BIG problem. The only way i can put a screenshot into the textures is by putting it into the textures file. the problem is when i load up the test run it says error and then a message about init or something.

'''Tarquin:''' um ... what were you trying to do? Do you mean &quot;MyLevel&quot; didn't work?

'''Otter:''' Completely different question: perhaps I'm wrote, but I could have sworn there was a way to use a camera in game to create a realtime animated texture. Say, for example, a security camera that relays a 256 x 256 image to a screen located elewhere.  Where can I find info on this?

'''Wormbo:''' That's done using a [[Legacy:ScriptedTexture|ScriptedTexture]], but will only work in UT200x with the D3D renderer.

'''Off-Kilter:''' I'm with SuperApe that this should be called Level Screenshot or Level Screenshots. I found this page searching for 'screenshot'.

'''Graphik:''' Renamed.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4289</id>
      <timestamp>2006-05-26T13:01:39Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A screenshot is just that: a saved picture taken from the monitor display. It also means the pictures you see in the game when you're choosing a map: screenshots of the map that are embedded in the map.

You might be looking for:
* [[Legacy:Making Screenshots|Making Screenshots]] &amp;ndash; taking shots of the game; recommendations on how to clean up, present, etc. 
* taking shots of [[Legacy:UnrealEd|UnrealEd]] &amp;ndash; insert brain (hit '''PrtSc''' like in the rest of Windows and paste into your favourite [[Legacy:Graphics Application|graphics application]])
* [[Legacy:Screenshot (UT)|Screenshot (UT)]] &amp;ndash; adding a screenshot to a UT map

The rest of this page is for [[Legacy:UT2003|UT200x]].

==Screenshots in UT200x ==

To add a screenshot to a UT200x map:

===Make individual screenshots===
# Take your [[Legacy:Making Screenshots|Making Screenshots]]s &amp; clean them up. Resize them to 512x256 pixels.
# [[Legacy:Import The Texture|Import The Texture]]s:
#* Package: [[Legacy:MyLevel|MyLevel]]
#* Group: (you can leave this blank)
#* Name: (anything you like; it's easiest if the screenshots are numbered for a material sequence)
#* Uncheck Generate Mipmaps
# Apply texture compression: Do [[Legacy:Material Context Menu|Material Context Menu]] -&gt; Compress -&gt; DXT1
# Avoid ugliness at lower texture levels: Do [[Legacy:Material Context Menu|Material Context Menu]] -&gt; Properties, and then expand Textures and set LODSet to LODSet_Interface

===Make a sequence===

Now your screenshots are in, you need a [[Legacy:MaterialSequence|MaterialSequence]] that will display them in sequence and fade between them.

The SequenceItems array of materials will look like this:

+ (Show Shot1)

++  Material=Shot1

++ MSA_ShowMaterial

+ (Fade Shot1 to Shot2)

++ Material=Shot2

++ MSA_FadeToMaterial

+ (Show Shot2)

++ Material=Shot2

++ MSA_ShowMaterial

+ (Fade Shot2 to Shot3)

++ Material=Shot3

++ MSA_FadeToMaterial

+ (Show Shot3)

++ Material=Shot3

++ MSA_ShowMaterial

+ (Fade back to Shot1)

++ Material=Shot1

++ MSA_FadeToMaterial

To make this, do the following:

# Create a new material:
#* Package: [[Legacy:MyLevel|MyLevel]]
#* Group: (same group as the screenshots)
#* Name: (anything)
#* Class: Raw Material
#* MaterialClass: Class'Engine.[[Legacy:MaterialSequence|MaterialSequence]]'
# In the [[Legacy:MaterialSequence|MaterialSequence]] properties do the following:
#*Click SequenceItems -&gt; Add
#*Minimize the properties window and select your first screenshot from the texture browser
#*Go back to properties and click SequenceItems -&gt; [0] -&gt; Material -&gt; Use
#*Set the time to 1.5
#*Add another Material under SequencedItems. This time, use your second screenshot, 1.0 for Time, and MSA_FadeToMaterial for Action. This is the transition to the second shot.
#*Add another SequencedItem just like the first except with your second screenshot again.
#*Continue adding 2 SequencedItems for each of your following screenshots.
#*Once you have all of your screenshots set, add one final SequencedItem. Use you first screenshot, 1.0 for Time, and MSA_FadeToMaterial for Action.
#*Finally, set FallbackMaterial to your first screenshot.
#Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; [[Legacy:Level Properties|Level Properties]]
# [[Legacy:Set The Resource Property|Set The Resource Property]] LevelSummary -&gt; Screenshot to the new [[Legacy:MaterialSequence|MaterialSequence]].
#Save your level and be sure '''not''' to save the [[Legacy:MyLevel|MyLevel]] package. Just leave it and everything will work.

==Related Topics ==
* [[Legacy:MyLevel|MyLevel]] pseudopackage
* [[Legacy:MaterialSequence|MaterialSequence]] class

----

'''MadNad''' Shouldn't this title be Level Shots ?

'''MythOpus Nods In Agreement''' It Should Yes :)

'''Tarquin:''' interesting idea. Any further opinions?

'''Wormbo:''' It's a preview image of the map, which is a screenshot of the map in most cases. How about a redirect from [[Legacy:Level Shots|Level Shots]] to this page?

'''SuperApe:''' ''I'd name it Level Screenshots, as it's named in Ued.  Isn't it?''  Anyway, I've noticed in UT2004, that the game is saving a cache of info from the maps in your Maps/ directory.  If you bring new version of your custom map into Maps/, the game will not recognize new level info, most noticably the Level Screenshot.  To get around this, remove your custom map from Maps/, run UT2004, browse your available maps, exit UT2004, and move the new copy of your map into Maps/.  I hope that a) makes sense and b) is helpful. :)

'''Evolution:''' Or just run 'ucc exportcache MyMap.ut2' after closing UnrealEd, if you've changed the screenshot (note: in the next patch, UnrealEd will automatically perform this step whenever you save the map :))

'''SirKline:''' Another way is to delete the mymap.ucl file in the system directory. Then you'll see the shot. 

'''Splenge:''' I can't seem to import an image to the textures. i have followed all the instructions and when I press OK the texture browser window comes up with all the textures that are open. Does anyone have any ideas? the type of fil I am using is a bmp and i have resized it to 256x256.

'''Tarquin:''' Check the list on [[Legacy:Import The Texture|Import The Texture]]. What's the colour depth?

'''MythOpus:''' Also, if you try to import a texture and it doesn't work. take a look at the UnrealEd log.

'''Splenge:''' I should really be putting this on the UT page but i've still got a BIG problem. The only way i can put a screenshot into the textures is by putting it into the textures file. the problem is when i load up the test run it says error and then a message about init or something.

'''Tarquin:''' um ... what were you trying to do? Do you mean &quot;MyLevel&quot; didn't work?

'''Otter:''' Completely different question: perhaps I'm wrote, but I could have sworn there was a way to use a camera in game to create a realtime animated texture. Say, for example, a security camera that relays a 256 x 256 image to a screen located elewhere.  Where can I find info on this?

'''Wormbo:''' That's done using a [[Legacy:ScriptedTexture|ScriptedTexture]], but will only work in UT200x with the D3D renderer.

'''Off-Kilter:''' I'm with SuperApe that this should be called Level Screenshot or Level Screenshots. I found this page searching for 'screenshot'.

'''Graphik:''' Renamed.

'''LionsPhil:''' It's worth noting that, although the desired texture resolution may be 512x256, it isn't displayed to that aspect ratio (2.0), but instead to something more akin to 1.5, meaning that you want to crop to, say, 512x384 (or use something like The GIMP's crop tool to do the calculations for you ;) ), and then do a non-aspect-ratio-preserving scale down to 512x256.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LevelGameRules</title>
    <id>1697</id>
    <revision>
      <id>4191</id>
      <timestamp>2005-11-21T18:39:43Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LevelGameRules (Package: Engine)}}

This class can be extended and then placed in a map so that mappers can control variables in the GameType for that map.

To use this actor in your map in UT2003 [[Legacy:Create A Subclass|create a subclass]] of LevelGameRules, add some code to UpdateGame() and [[Legacy:Add An Actor|add an actor]] of this new subclass somewhere in your map.

In UT2004 v3236 and above you can place this actor in a map to automatically add certain mutators to the game when running the map.

==Properties==
; array&lt; class&lt;[[Legacy:Mutator|Mutator]]&gt; &gt; MapMutator : Only UT2004 v3236 and above. Specifies a list of mutator classes that should be active when the map is played.

==Methods==
; UpdateGame ([[Legacy:GameInfo|GameInfo]] G) :
;; In UT2003 and UT2004 before v3236 : Called from [[Legacy:DeathMatch|DeathMatch]].InitGame() ''before'' any other InitGame() code is executed. When subclassed this allowes mappers to modify any property of the GameInfo, but keep in mind that there is no base mutator yet, so all actors spawned from here must have &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; set in their default properties or they will destroy themselves immediately after logging an Accessed None warning.
;; In UT2004 v3236 and above: Called from [[Legacy:DeathMatch|DeathMatch]].InitGame() ''after'' the [[Legacy:Mutator|Mutator]]s and [[Legacy:GameRules|GameRules]] have been initialized. This adds all mutator classes specified in the MapMutator list unless they are already active. This makes [[Legacy:Writing And Using An Embedded Mutator|writing and using an embedded mutator]] much easier because you only have to [[Legacy:Add An Actor|add an Actor]] &gt;&gt; Info &gt;&gt; LevelGameRules and set its MapMutator property instead of having to add self-registration code to your mutator class.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4192</id>
      <timestamp>2003-12-13T13:29:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LevelGameRules (Package: Engine)}}

This class can be extended and then placed in a map so that mappers can control variables in the GameType for that map.

To use this actor in your map [[Legacy:Create A Subclass|create a subclass]] of LevelGameRules, add some code to UpdateGame() and [[Legacy:Add An Actor|add an actor]] of this new subclass somewhere in your map.

==Methods==
; UpdateGame ([[Legacy:GameInfo|GameInfo]] G) : Called from [[Legacy:DeathMatch|DeathMatch]].InitGame() before any other InitGame() code is executed. This allowes mappers to modify any property of the GameInfo, but keep in mind that there is no base mutator yet, so all actors spawned from here must have &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; set in their default properties.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4193</id>
      <timestamp>2004-06-16T15:56:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>neat additions in UT2004 v3236...</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LevelGameRules (Package: Engine)}}

This class can be extended and then placed in a map so that mappers can control variables in the GameType for that map.

To use this actor in your map in UT2003 [[Legacy:Create A Subclass|create a subclass]] of LevelGameRules, add some code to UpdateGame() and [[Legacy:Add An Actor|add an actor]] of this new subclass somewhere in your map.

In UT2004 v3236 and above you can place this actor in a map to automatically add certain mutators to the game when running the map.

==Properties==
; array&lt; class&lt;[[Legacy:Mutator|Mutator]]&gt; &gt; MapMutator : Only UT2004 v3236 and above. Specifies a list of mutator classes that should be active when the map is played.

==Methods==
; UpdateGame ([[Legacy:GameInfo|GameInfo]] G) :
;; In UT2003 and UT2004 before v3236 : Called from [[Legacy:DeathMatch|DeathMatch]].InitGame() ''before'' any other InitGame() code is executed. When subclassed this allowes mappers to modify any property of the GameInfo, but keep in mind that there is no base mutator yet, so all actors spawned from here must have &lt;tt&gt;bGameRelevant=True&lt;/tt&gt; set in their default properties or they will destroy themselves immediately after logging an Accessed None warning.
;; In UT2004 v3236 and above: Called from [[Legacy:DeathMatch|DeathMatch]].InitGame() ''after'' the [[Legacy:Mutator|Mutator]]s and [[Legacy:GameRules|GameRules]] have been initialized. This adds all mutator classes specified in the MapMutator list unless they are already active. This makes [[Legacy:Writing And Using An Embedded Mutator|writing and using an embedded mutator]] much easier because you only have to [[Legacy:Add An Actor|add an Actor]] &gt;&gt; Info &gt;&gt; LevelGameRules and set its MapMutator property instead of having to add self-registration code to your mutator class.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LevelInfo</title>
    <id>1646</id>
    <revision>
      <id>4075</id>
      <timestamp>2007-05-04T19:45:22Z</timestamp>
      <contributor>
        <ip>CPE001346f35721-CM00122574ae50.cpe.net.cable.rogers.com</ip>
      </contributor>
      <minor/>
      <comment>*changed &quot;by with the Level pointer&quot; to &quot;by the Level pointer&quot; near the top of the page</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo|ZoneInfo]].

UnrealEd will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo (UT)|LevelInfo (UT)]] for the UT version of this class.

==Properties==

===Audio Group===
; float MusicVolumeOverride : 
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; string Song : Filename (without extension) of the song played in this level. This song should be an [[Legacy:OGG File|OGG file]] in {[[Legacy:Base Directory|Base Directory]]}\Music.

===Camouflage Group===

These are used by the Camouflage combo in the Epic Bonuspack.
; [[Legacy:StaticMesh|StaticMesh]] IndoorCamouflageMesh : Static mesh used when player doesn't stand on terrain.
; float IndoorMeshDrawscale : Drawscale for the IndoorMeshDrawscale.
; [[Legacy:StaticMesh|StaticMesh]] OutdoorCamouflageMesh : Static mesh used when player stands on terrain.
; float OutdoorMeshDrawscale : Drawscale for the OutdoorCamouflageMesh.

===Karma Group===
; bool bKStaticFriction : Better rag-doll/ground friction model, but more CPU.
; float KarmaGravScale (initial value replicated) : Allows you to make ragdolls use lower friction than normal.
; float KarmaTimeScale (initial value replicated) : Karma physics timestep scaling.
; int MaxRagdolls : Maximum number of simultaneous rag-dolls.
; float RagdollTimeScale (initial value replicated) : Ragdoll physics timestep scaling. This is applied on top of KarmaTimeScale.

===LevelInfo Group===
; bool bKNoInit : Start '''NO''' Karma for this level. Only use this for an [[Legacy:Entry Level|Entry level]].
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; float Brightness : 
; vector CameraLocationDynamic
; vector CameraLocationFront
; vector CameraLocationSide
; vector CameraLocationTop
; rotator CameraRotationDynamic : Used for saving the [[Legacy:UnrealEd Viewport|UnrealEd viewport]] camera positions.
; string DefaultGameType : Class name of the default gametype for this level, in the format &quot;Package.ClassName&quot; e.g. xGame.[[Legacy:XCTFGame|xCTFGame]] for CTF maps. See [[Legacy:DeathMatch|DeathMatch]] subclasses for valid classes. 
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for [[Legacy:Localization|localization]]s.
; EPhysicsDetailLevel PhysicsDetailLevel (config) : 
; string PreCacheGame : Class name of the [[Legacy:GameInfo|GameInfo]] class used for precaching if no DefaultGameType was specified.
; float TimeDilation (replicated when changed) :  
; StallZ : Limits the height of flying [[Legacy:Vehicles|vehicles]]. Once you reach this limit the vehicle is pushed back down to safer altitudes. Shows as a blue line in side-view orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s.

===LevelSummary Group===

This group is mostly about what appears on the map selection screen in the game.

; string Author : Who built it. This is displayed on the the map selection screen.
; string DecoTextName : Name of the map for loading a description from the XMaps [[Legacy:INT File|INT file]].  This method was required before the first patches, but not anymore - instead, use the Description property.
; string Description : A description for the level. This is displayed on the the map selection screen.
; bool HideFromMenus : Don't show in any map list.
; int IdealPlayerCountMax, int IdealPlayerCountMin : Ideal number of players for this level.  If the option to match playercount to recommended is enabled (instant action), the game will pick the average of these numbers to add bots.
; [[Legacy:Material|Material]] Screenshot : Preview screenshot(s) of this level.  This is displayed on the the map selection screen. See [[Legacy:Level Screenshot|Level Screenshot]].
; string Title (localized) : Name of this level. This is displayed on the scoreboard.

===SinglePlayer Group===
; int SinglePlayerTeamSize : 

===Config Properties===
; bool bCapFramerate (globalconfig) : Frame rate is capped in net play if True, else the number of ServerMove updates is limited.
; bool bLowSoundDetail : 
; bool bNeverPrecache : 
; bool bShouldPreload (globalconfig) : If true, preload all skins. (only set true if &gt; 512 MB of system memory)
; float DecalStayScale : 0 to 2 &amp;ndash; affects decal stay time
; EPhysicsDetailLevel PhysicsDetailLevel (visible in the LevelInfo group) : 

===Hidden===
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive. ''(What does &quot;well below&quot; mean in this case?)''
; bool bBegunPlay : Whether gameplay has begun.
; bool bClassicView : FOV at least 90, eyeheight up, small weapons
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors.
; bool bHasPathNodes : 
; bool bLevelChange : 
; bool bNextItems : 
; bool bPathsRebuilt : True if path network is valid. See also [[Legacy:Build|Build]].
; bool bPlayersOnly : Only update players. See [[Legacy:Console Commands|console commands]] (PLAYERSONLY).

; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; [[Legacy:Controller|Controller]] ControllerList (const) : 
; int Day (transient) : 
; int DayOfWeek (transient) : 
; float DefaultGravity (replicated when changed) : 
; [[Legacy:Texture|Texture]] DefaultTexture : 
; EDetailMode DetailMode (const) : Client detail mode.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo|GameInfo]] Game : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI (transient) : 
; int Hour (transient) : 
; int HubStackLevel : 
; [[Legacy:Texture|Texture]] LargeVertex : 
; int LastTaunt[2] : 'Global' last taunts used.
; ELevelAction LevelAction (transient) : 
; [[Legacy:PlayerController|PlayerController]] LocalPlayerController : 
; int Millisecond (transient) : 
; string MinNetVersion : Minimum engine version that is net compatible.
; int Minute (transient) : 
; int Month (transient) : 
; float MoveRepSize : 
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : 
; ENetMode NetMode : The network mode of this level: server, client etc. See [[Legacy:NetMode|NetMode]].
; float NextSwitchCountdown : 
; string NextURL : 
; [[Legacy:ObjectPool|ObjectPool]] ObjectPool (transient) : 
; float PauseDelay : time at which to start pause
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Pauser (replicated when changed) : If paused, PRI of person pausing the game.
; array&lt;[[Legacy:Material|Material]]&gt; PrecacheMaterials (transient) : 
; array&lt;[[Legacy:StaticMesh|StaticMesh]]&gt; PrecacheStaticMeshes (transient) : 
; [[Legacy:PlayerController|PlayerController]] ReplicationViewer (const) : 
; [[Legacy:Actor|Actor]] ReplicationViewTarget (const) : 
; int Second (transient) : 
; [[Legacy:LevelSummary|LevelSummary]] Summary : 
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved.
; [[Legacy:Texture|Texture]] WhiteSquareTexture : 
; [[Legacy:Texture|Texture]] WireframeTexture : 
; int Year (transient) : 

==Enums==

===ELevelAction===

; LEVACT_None :
; LEVACT_Loading :
; LEVACT_Saving :
; LEVACT_Connecting :
; LEVACT_Precachin :

===ENetMode===

Also see [[Legacy:NetMode|NetMode]].
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Clien : Client only, no local server.

===EPhysicsDetailLevel===

; PDL_Low :
; PDL_Medium :
; PDL_Hig :

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; PostBeginPlay ( ) [simulated] : Limits the DecalStayScale to values between 0.0 and 2.0.
; PreBeginPlay ( ) [simulated] : Initializes the level's [[Legacy:ObjectPool|ObjectPool]].
; Reset ( ) : Performs garbage collection of objects. (not done during gameplay)

===Native Functions===
; DetailChange (EDetailMode NewDetailMode) [simulated] : Switches the world detail mode.
; string GetAddressURL ( ) [simulated] : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL ( ) [simulated] : Return the URL of this level on the local machine.
; bool IsDemoBuild ( ) [simulated] : Returns whether this version of UT2003 is a demo build.
; bool IsEntry ( ) [simulated] : Returns whether this is the [[Legacy:Entry Level|entry level]].

===Other Functions===
; AddPrecacheMaterial ([[Legacy:Material|Material]] mat) [simulated] : Adds a material to the PrecacheMaterials array.
; AddPrecacheStaticMesh ([[Legacy:StaticMesh|StaticMesh]] stat) [simulated] : Adds a static mesh to the PrecacheStaticMeshes array.
; class&lt;[[Legacy:GameInfo|GameInfo]]&gt; GetGameClass ( ) [simulated] : Returns this game's [[Legacy:GameInfo|GameInfo]] class.
; [[Legacy:PlayerController|PlayerController]] GetLocalPlayerController ( ) [simulated] : Returns the local [[Legacy:PlayerController|PlayerController]]. See also [[Legacy:Netcode Idioms|Netcode Idioms]].
; ThisIsNeverExecuted ( ) : Well, this is never executed. ;) This function only contains a reference to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] class to make sure it is loaded.

==Events ==
; FillPrecacheMaterialsArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameTextures function. Also calls all actors' UpdatePrecacheMaterials function.
; FillPrecacheStaticMeshesArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameStaticMeshes function. Also calls all actors' UpdatePrecacheStaticMeshes function.
; ServerTravel (string URL, bool bItems) : Jump the server to a new level.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4076</id>
      <timestamp>2006-04-06T21:06:41Z</timestamp>
      <contributor>
        <ip>CDN-CE-CHLM-T2-06.chelmsfdrdc2.ma.boston.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo|ZoneInfo]].

UnrealEd will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by with the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo (UT)|LevelInfo (UT)]] for the UT version of this class.

==Properties==

===Audio Group===
; float MusicVolumeOverride : 
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; string Song : Filename (without extension) of the song played in this level. This song should be an [[Legacy:OGG File|OGG file]] in {[[Legacy:Base Directory|Base Directory]]}\Music.

===Camouflage Group===

These are used by the Camouflage combo in the Epic Bonuspack.
; [[Legacy:StaticMesh|StaticMesh]] IndoorCamouflageMesh : Static mesh used when player doesn't stand on terrain.
; float IndoorMeshDrawscale : Drawscale for the IndoorMeshDrawscale.
; [[Legacy:StaticMesh|StaticMesh]] OutdoorCamouflageMesh : Static mesh used when player stands on terrain.
; float OutdoorMeshDrawscale : Drawscale for the OutdoorCamouflageMesh.

===Karma Group===
; bool bKStaticFriction : Better rag-doll/ground friction model, but more CPU.
; float KarmaGravScale (initial value replicated) : Allows you to make ragdolls use lower friction than normal.
; float KarmaTimeScale (initial value replicated) : Karma physics timestep scaling.
; int MaxRagdolls : Maximum number of simultaneous rag-dolls.
; float RagdollTimeScale (initial value replicated) : Ragdoll physics timestep scaling. This is applied on top of KarmaTimeScale.

===LevelInfo Group===
; bool bKNoInit : Start '''NO''' Karma for this level. Only use this for an [[Legacy:Entry Level|Entry level]].
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; float Brightness : 
; vector CameraLocationDynamic
; vector CameraLocationFront
; vector CameraLocationSide
; vector CameraLocationTop
; rotator CameraRotationDynamic : Used for saving the [[Legacy:UnrealEd Viewport|UnrealEd viewport]] camera positions.
; string DefaultGameType : Class name of the default gametype for this level, in the format &quot;Package.ClassName&quot; e.g. xGame.[[Legacy:XCTFGame|xCTFGame]] for CTF maps. See [[Legacy:DeathMatch|DeathMatch]] subclasses for valid classes. 
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for [[Legacy:Localization|localization]]s.
; EPhysicsDetailLevel PhysicsDetailLevel (config) : 
; string PreCacheGame : Class name of the [[Legacy:GameInfo|GameInfo]] class used for precaching if no DefaultGameType was specified.
; float TimeDilation (replicated when changed) :  
; StallZ : Limits the height of flying [[Legacy:Vehicles|vehicles]]. Once you reach this limit the vehicle is pushed back down to safer altitudes. Shows as a blue line in side-view orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s.

===LevelSummary Group===

This group is mostly about what appears on the map selection screen in the game.

; string Author : Who built it. This is displayed on the the map selection screen.
; string DecoTextName : Name of the map for loading a description from the XMaps [[Legacy:INT File|INT file]].  This method was required before the first patches, but not anymore - instead, use the Description property.
; string Description : A description for the level. This is displayed on the the map selection screen.
; bool HideFromMenus : Don't show in any map list.
; int IdealPlayerCountMax, int IdealPlayerCountMin : Ideal number of players for this level.  If the option to match playercount to recommended is enabled (instant action), the game will pick the average of these numbers to add bots.
; [[Legacy:Material|Material]] Screenshot : Preview screenshot(s) of this level.  This is displayed on the the map selection screen. See [[Legacy:Level Screenshot|Level Screenshot]].
; string Title (localized) : Name of this level. This is displayed on the scoreboard.

===SinglePlayer Group===
; int SinglePlayerTeamSize : 

===Config Properties===
; bool bCapFramerate (globalconfig) : Frame rate is capped in net play if True, else the number of ServerMove updates is limited.
; bool bLowSoundDetail : 
; bool bNeverPrecache : 
; bool bShouldPreload (globalconfig) : If true, preload all skins. (only set true if &gt; 512 MB of system memory)
; float DecalStayScale : 0 to 2 &amp;ndash; affects decal stay time
; EPhysicsDetailLevel PhysicsDetailLevel (visible in the LevelInfo group) : 

===Hidden===
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive. ''(What does &quot;well below&quot; mean in this case?)''
; bool bBegunPlay : Whether gameplay has begun.
; bool bClassicView : FOV at least 90, eyeheight up, small weapons
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors.
; bool bHasPathNodes : 
; bool bLevelChange : 
; bool bNextItems : 
; bool bPathsRebuilt : True if path network is valid. See also [[Legacy:Build|Build]].
; bool bPlayersOnly : Only update players. See [[Legacy:Console Commands|console commands]] (PLAYERSONLY).

; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; [[Legacy:Controller|Controller]] ControllerList (const) : 
; int Day (transient) : 
; int DayOfWeek (transient) : 
; float DefaultGravity (replicated when changed) : 
; [[Legacy:Texture|Texture]] DefaultTexture : 
; EDetailMode DetailMode (const) : Client detail mode.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo|GameInfo]] Game : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI (transient) : 
; int Hour (transient) : 
; int HubStackLevel : 
; [[Legacy:Texture|Texture]] LargeVertex : 
; int LastTaunt[2] : 'Global' last taunts used.
; ELevelAction LevelAction (transient) : 
; [[Legacy:PlayerController|PlayerController]] LocalPlayerController : 
; int Millisecond (transient) : 
; string MinNetVersion : Minimum engine version that is net compatible.
; int Minute (transient) : 
; int Month (transient) : 
; float MoveRepSize : 
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : 
; ENetMode NetMode : The network mode of this level: server, client etc. See [[Legacy:NetMode|NetMode]].
; float NextSwitchCountdown : 
; string NextURL : 
; [[Legacy:ObjectPool|ObjectPool]] ObjectPool (transient) : 
; float PauseDelay : time at which to start pause
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Pauser (replicated when changed) : If paused, PRI of person pausing the game.
; array&lt;[[Legacy:Material|Material]]&gt; PrecacheMaterials (transient) : 
; array&lt;[[Legacy:StaticMesh|StaticMesh]]&gt; PrecacheStaticMeshes (transient) : 
; [[Legacy:PlayerController|PlayerController]] ReplicationViewer (const) : 
; [[Legacy:Actor|Actor]] ReplicationViewTarget (const) : 
; int Second (transient) : 
; [[Legacy:LevelSummary|LevelSummary]] Summary : 
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved.
; [[Legacy:Texture|Texture]] WhiteSquareTexture : 
; [[Legacy:Texture|Texture]] WireframeTexture : 
; int Year (transient) : 

==Enums==

===ELevelAction===

; LEVACT_None :
; LEVACT_Loading :
; LEVACT_Saving :
; LEVACT_Connecting :
; LEVACT_Precachin :

===ENetMode===

Also see [[Legacy:NetMode|NetMode]].
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Clien : Client only, no local server.

===EPhysicsDetailLevel===

; PDL_Low :
; PDL_Medium :
; PDL_Hig :

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; PostBeginPlay ( ) [simulated] : Limits the DecalStayScale to values between 0.0 and 2.0.
; PreBeginPlay ( ) [simulated] : Initializes the level's [[Legacy:ObjectPool|ObjectPool]].
; Reset ( ) : Performs garbage collection of objects. (not done during gameplay)

===Native Functions===
; DetailChange (EDetailMode NewDetailMode) [simulated] : Switches the world detail mode.
; string GetAddressURL ( ) [simulated] : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL ( ) [simulated] : Return the URL of this level on the local machine.
; bool IsDemoBuild ( ) [simulated] : Returns whether this version of UT2003 is a demo build.
; bool IsEntry ( ) [simulated] : Returns whether this is the [[Legacy:Entry Level|entry level]].

===Other Functions===
; AddPrecacheMaterial ([[Legacy:Material|Material]] mat) [simulated] : Adds a material to the PrecacheMaterials array.
; AddPrecacheStaticMesh ([[Legacy:StaticMesh|StaticMesh]] stat) [simulated] : Adds a static mesh to the PrecacheStaticMeshes array.
; class&lt;[[Legacy:GameInfo|GameInfo]]&gt; GetGameClass ( ) [simulated] : Returns this game's [[Legacy:GameInfo|GameInfo]] class.
; [[Legacy:PlayerController|PlayerController]] GetLocalPlayerController ( ) [simulated] : Returns the local [[Legacy:PlayerController|PlayerController]]. See also [[Legacy:Netcode Idioms|Netcode Idioms]].
; ThisIsNeverExecuted ( ) : Well, this is never executed. ;) This function only contains a reference to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] class to make sure it is loaded.

==Events ==
; FillPrecacheMaterialsArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameTextures function. Also calls all actors' UpdatePrecacheMaterials function.
; FillPrecacheStaticMeshesArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameStaticMeshes function. Also calls all actors' UpdatePrecacheStaticMeshes function.
; ServerTravel (string URL, bool bItems) : Jump the server to a new level.

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4077</id>
      <timestamp>2006-04-06T22:23:15Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo|ZoneInfo]].

UnrealEd will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by with the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo (UT)|LevelInfo (UT)]] for the UT version of this class.

==Properties==

===Audio Group===
; float MusicVolumeOverride : 
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; string Song : Filename (without extension) of the song played in this level. This song should be an [[Legacy:OGG File|OGG file]] in {[[Legacy:Base Directory|Base Directory]]}\Music.

===Camouflage Group===

These are used by the Camouflage combo in the Epic Bonuspack.
; [[Legacy:StaticMesh|StaticMesh]] IndoorCamouflageMesh : Static mesh used when player doesn't stand on terrain.
; float IndoorMeshDrawscale : Drawscale for the IndoorMeshDrawscale.
; [[Legacy:StaticMesh|StaticMesh]] OutdoorCamouflageMesh : Static mesh used when player stands on terrain.
; float OutdoorMeshDrawscale : Drawscale for the OutdoorCamouflageMesh.

===Karma Group===
; bool bKStaticFriction : Better rag-doll/ground friction model, but more CPU.
; float KarmaGravScale (initial value replicated) : Allows you to make ragdolls use lower friction than normal.
; float KarmaTimeScale (initial value replicated) : Karma physics timestep scaling.
; int MaxRagdolls : Maximum number of simultaneous rag-dolls.
; float RagdollTimeScale (initial value replicated) : Ragdoll physics timestep scaling. This is applied on top of KarmaTimeScale.

===LevelInfo Group===
; bool bKNoInit : Start '''NO''' Karma for this level. Only use this for an [[Legacy:Entry Level|Entry level]].
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; float Brightness : 
; vector CameraLocationDynamic
; vector CameraLocationFront
; vector CameraLocationSide
; vector CameraLocationTop
; rotator CameraRotationDynamic : Used for saving the [[Legacy:UnrealEd Viewport|UnrealEd viewport]] camera positions.
; string DefaultGameType : Class name of the default gametype for this level, in the format &quot;Package.ClassName&quot; e.g. xGame.[[Legacy:XCTFGame|xCTFGame]] for CTF maps. See [[Legacy:DeathMatch|DeathMatch]] subclasses for valid classes. 
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for [[Legacy:Localization|localization]]s.
; EPhysicsDetailLevel PhysicsDetailLevel (config) : 
; string PreCacheGame : Class name of the [[Legacy:GameInfo|GameInfo]] class used for precaching if no DefaultGameType was specified.
; float TimeDilation (replicated when changed) :  
; StallZ : Limits the height of flying [[Legacy:Vehicles|vehicles]]. Once you reach this limit the vehicle is pushed back down to safer altitudes. Shows as a blue line in side-view orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s.

===LevelSummary Group===

This group is mostly about what appears on the map selection screen in the game.

; string Author : Who built it. This is displayed on the the map selection screen.
; string DecoTextName : Name of the map for loading a description from the XMaps [[Legacy:INT File|INT file]].  This method was required before the first patches, but not anymore - instead, use the Description property.
; string Description : A description for the level. This is displayed on the the map selection screen.
; bool HideFromMenus : Don't show in any map list.
; int IdealPlayerCountMax, int IdealPlayerCountMin : Ideal number of players for this level.  If the option to match playercount to recommended is enabled (instant action), the game will pick the average of these numbers to add bots.
; [[Legacy:Material|Material]] Screenshot : Preview screenshot(s) of this level.  This is displayed on the the map selection screen. See [[Legacy:Level Screenshot|Level Screenshot]].
; string Title (localized) : Name of this level. This is displayed on the scoreboard.

===SinglePlayer Group===
; int SinglePlayerTeamSize : 

===Config Properties===
; bool bCapFramerate (globalconfig) : Frame rate is capped in net play if True, else the number of ServerMove updates is limited.
; bool bLowSoundDetail : 
; bool bNeverPrecache : 
; bool bShouldPreload (globalconfig) : If true, preload all skins. (only set true if &gt; 512 MB of system memory)
; float DecalStayScale : 0 to 2 &amp;ndash; affects decal stay time
; EPhysicsDetailLevel PhysicsDetailLevel (visible in the LevelInfo group) : 

===Hidden===
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive. ''(What does &quot;well below&quot; mean in this case?)''
; bool bBegunPlay : Whether gameplay has begun.
; bool bClassicView : FOV at least 90, eyeheight up, small weapons
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors.
; bool bHasPathNodes : 
; bool bLevelChange : 
; bool bNextItems : 
; bool bPathsRebuilt : True if path network is valid. See also [[Legacy:Build|Build]].
; bool bPlayersOnly : Only update players. See [[Legacy:Console Commands|console commands]] (PLAYERSONLY).

; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; [[Legacy:Controller|Controller]] ControllerList (const) : 
; int Day (transient) : 
; int DayOfWeek (transient) : 
; float DefaultGravity (replicated when changed) : 
; [[Legacy:Texture|Texture]] DefaultTexture : 
; EDetailMode DetailMode (const) : Client detail mode.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo|GameInfo]] Game : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI (transient) : 
; int Hour (transient) : 
; int HubStackLevel : 
; [[Legacy:Texture|Texture]] LargeVertex : 
; int LastTaunt[2] : 'Global' last taunts used.
; ELevelAction LevelAction (transient) : 
; [[Legacy:PlayerController|PlayerController]] LocalPlayerController : 
; int Millisecond (transient) : 
; string MinNetVersion : Minimum engine version that is net compatible.
; int Minute (transient) : 
; int Month (transient) : 
; float MoveRepSize : 
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : 
; ENetMode NetMode : The network mode of this level: server, client etc. See [[Legacy:NetMode|NetMode]].
; float NextSwitchCountdown : 
; string NextURL : 
; [[Legacy:ObjectPool|ObjectPool]] ObjectPool (transient) : 
; float PauseDelay : time at which to start pause
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Pauser (replicated when changed) : If paused, PRI of person pausing the game.
; array&lt;[[Legacy:Material|Material]]&gt; PrecacheMaterials (transient) : 
; array&lt;[[Legacy:StaticMesh|StaticMesh]]&gt; PrecacheStaticMeshes (transient) : 
; [[Legacy:PlayerController|PlayerController]] ReplicationViewer (const) : 
; [[Legacy:Actor|Actor]] ReplicationViewTarget (const) : 
; int Second (transient) : 
; [[Legacy:LevelSummary|LevelSummary]] Summary : 
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved.
; [[Legacy:Texture|Texture]] WhiteSquareTexture : 
; [[Legacy:Texture|Texture]] WireframeTexture : 
; int Year (transient) : 

==Enums==

===ELevelAction===

; LEVACT_None :
; LEVACT_Loading :
; LEVACT_Saving :
; LEVACT_Connecting :
; LEVACT_Precachin :

===ENetMode===

Also see [[Legacy:NetMode|NetMode]].
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Clien : Client only, no local server.

===EPhysicsDetailLevel===

; PDL_Low :
; PDL_Medium :
; PDL_Hig :

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; PostBeginPlay ( ) [simulated] : Limits the DecalStayScale to values between 0.0 and 2.0.
; PreBeginPlay ( ) [simulated] : Initializes the level's [[Legacy:ObjectPool|ObjectPool]].
; Reset ( ) : Performs garbage collection of objects. (not done during gameplay)

===Native Functions===
; DetailChange (EDetailMode NewDetailMode) [simulated] : Switches the world detail mode.
; string GetAddressURL ( ) [simulated] : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL ( ) [simulated] : Return the URL of this level on the local machine.
; bool IsDemoBuild ( ) [simulated] : Returns whether this version of UT2003 is a demo build.
; bool IsEntry ( ) [simulated] : Returns whether this is the [[Legacy:Entry Level|entry level]].

===Other Functions===
; AddPrecacheMaterial ([[Legacy:Material|Material]] mat) [simulated] : Adds a material to the PrecacheMaterials array.
; AddPrecacheStaticMesh ([[Legacy:StaticMesh|StaticMesh]] stat) [simulated] : Adds a static mesh to the PrecacheStaticMeshes array.
; class&lt;[[Legacy:GameInfo|GameInfo]]&gt; GetGameClass ( ) [simulated] : Returns this game's [[Legacy:GameInfo|GameInfo]] class.
; [[Legacy:PlayerController|PlayerController]] GetLocalPlayerController ( ) [simulated] : Returns the local [[Legacy:PlayerController|PlayerController]]. See also [[Legacy:Netcode Idioms|Netcode Idioms]].
; ThisIsNeverExecuted ( ) : Well, this is never executed. ;) This function only contains a reference to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] class to make sure it is loaded.

==Events ==
; FillPrecacheMaterialsArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameTextures function. Also calls all actors' UpdatePrecacheMaterials function.
; FillPrecacheStaticMeshesArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameStaticMeshes function. Also calls all actors' UpdatePrecacheStaticMeshes function.
; ServerTravel (string URL, bool bItems) : Jump the server to a new level.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34660</id>
      <timestamp>2009-08-13T22:27:01Z</timestamp>
      <contributor>
        <ip>212.27.60.48</ip>
      </contributor>
      <comment>/* ENetMode */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo|ZoneInfo]].

UnrealEd will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo (UT)|LevelInfo (UT)]] for the UT version of this class.

==Properties==

===Audio Group===
; float MusicVolumeOverride : 
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; string Song : Filename (without extension) of the song played in this level. This song should be an [[Legacy:OGG File|OGG file]] in {[[Legacy:Base Directory|Base Directory]]}\Music.

===Camouflage Group===

These are used by the Camouflage combo in the Epic Bonuspack.
; [[Legacy:StaticMesh|StaticMesh]] IndoorCamouflageMesh : Static mesh used when player doesn't stand on terrain.
; float IndoorMeshDrawscale : Drawscale for the IndoorMeshDrawscale.
; [[Legacy:StaticMesh|StaticMesh]] OutdoorCamouflageMesh : Static mesh used when player stands on terrain.
; float OutdoorMeshDrawscale : Drawscale for the OutdoorCamouflageMesh.

===Karma Group===
; bool bKStaticFriction : Better rag-doll/ground friction model, but more CPU.
; float KarmaGravScale (initial value replicated) : Allows you to make ragdolls use lower friction than normal.
; float KarmaTimeScale (initial value replicated) : Karma physics timestep scaling.
; int MaxRagdolls : Maximum number of simultaneous rag-dolls.
; float RagdollTimeScale (initial value replicated) : Ragdoll physics timestep scaling. This is applied on top of KarmaTimeScale.

===LevelInfo Group===
; bool bKNoInit : Start '''NO''' Karma for this level. Only use this for an [[Legacy:Entry Level|Entry level]].
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; float Brightness : 
; vector CameraLocationDynamic
; vector CameraLocationFront
; vector CameraLocationSide
; vector CameraLocationTop
; rotator CameraRotationDynamic : Used for saving the [[Legacy:UnrealEd Viewport|UnrealEd viewport]] camera positions.
; string DefaultGameType : Class name of the default gametype for this level, in the format &quot;Package.ClassName&quot; e.g. xGame.[[Legacy:XCTFGame|xCTFGame]] for CTF maps. See [[Legacy:DeathMatch|DeathMatch]] subclasses for valid classes. 
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for [[Legacy:Localization|localization]]s.
; EPhysicsDetailLevel PhysicsDetailLevel (config) : 
; string PreCacheGame : Class name of the [[Legacy:GameInfo|GameInfo]] class used for precaching if no DefaultGameType was specified.
; float TimeDilation (replicated when changed) :  
; StallZ : Limits the height of flying [[Legacy:Vehicles|vehicles]]. Once you reach this limit the vehicle is pushed back down to safer altitudes. Shows as a blue line in side-view orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s.

===LevelSummary Group===

This group is mostly about what appears on the map selection screen in the game.

; string Author : Who built it. This is displayed on the the map selection screen.
; string DecoTextName : Name of the map for loading a description from the XMaps [[Legacy:INT File|INT file]].  This method was required before the first patches, but not anymore - instead, use the Description property.
; string Description : A description for the level. This is displayed on the the map selection screen.
; bool HideFromMenus : Don't show in any map list.
; int IdealPlayerCountMax, int IdealPlayerCountMin : Ideal number of players for this level.  If the option to match playercount to recommended is enabled (instant action), the game will pick the average of these numbers to add bots.
; [[Legacy:Material|Material]] Screenshot : Preview screenshot(s) of this level.  This is displayed on the the map selection screen. See [[Legacy:Level Screenshot|Level Screenshot]].
; string Title (localized) : Name of this level. This is displayed on the scoreboard.

===SinglePlayer Group===
; int SinglePlayerTeamSize : 

===Config Properties===
; bool bCapFramerate (globalconfig) : Frame rate is capped in net play if True, else the number of ServerMove updates is limited.
; bool bLowSoundDetail : 
; bool bNeverPrecache : 
; bool bShouldPreload (globalconfig) : If true, preload all skins. (only set true if &gt; 512 MB of system memory)
; float DecalStayScale : 0 to 2 &amp;ndash; affects decal stay time
; EPhysicsDetailLevel PhysicsDetailLevel (visible in the LevelInfo group) : 

===Hidden===
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive. ''(What does &quot;well below&quot; mean in this case?)''
; bool bBegunPlay : Whether gameplay has begun.
; bool bClassicView : FOV at least 90, eyeheight up, small weapons
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors.
; bool bHasPathNodes : 
; bool bLevelChange : 
; bool bNextItems : 
; bool bPathsRebuilt : True if path network is valid. See also [[Legacy:Build|Build]].
; bool bPlayersOnly : Only update players. See [[Legacy:Console Commands|console commands]] (PLAYERSONLY).

; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; [[Legacy:Controller|Controller]] ControllerList (const) : 
; int Day (transient) : 
; int DayOfWeek (transient) : 
; float DefaultGravity (replicated when changed) : 
; [[Legacy:Texture|Texture]] DefaultTexture : 
; EDetailMode DetailMode (const) : Client detail mode.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo|GameInfo]] Game : 
; [[Legacy:GameReplicationInfo|GameReplicationInfo]] GRI (transient) : 
; int Hour (transient) : 
; int HubStackLevel : 
; [[Legacy:Texture|Texture]] LargeVertex : 
; int LastTaunt[2] : 'Global' last taunts used.
; ELevelAction LevelAction (transient) : 
; [[Legacy:PlayerController|PlayerController]] LocalPlayerController : 
; int Millisecond (transient) : 
; string MinNetVersion : Minimum engine version that is net compatible.
; int Minute (transient) : 
; int Month (transient) : 
; float MoveRepSize : 
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : 
; ENetMode NetMode : The network mode of this level: server, client etc. See [[Legacy:NetMode|NetMode]].
; float NextSwitchCountdown : 
; string NextURL : 
; [[Legacy:ObjectPool|ObjectPool]] ObjectPool (transient) : 
; float PauseDelay : time at which to start pause
; [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] Pauser (replicated when changed) : If paused, PRI of person pausing the game.
; array&lt;[[Legacy:Material|Material]]&gt; PrecacheMaterials (transient) : 
; array&lt;[[Legacy:StaticMesh|StaticMesh]]&gt; PrecacheStaticMeshes (transient) : 
; [[Legacy:PlayerController|PlayerController]] ReplicationViewer (const) : 
; [[Legacy:Actor|Actor]] ReplicationViewTarget (const) : 
; int Second (transient) : 
; [[Legacy:LevelSummary|LevelSummary]] Summary : 
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved.
; [[Legacy:Texture|Texture]] WhiteSquareTexture : 
; [[Legacy:Texture|Texture]] WireframeTexture : 
; int Year (transient) : 

==Enums==

===ELevelAction===

; LEVACT_None :
; LEVACT_Loading :
; LEVACT_Saving :
; LEVACT_Connecting :
; LEVACT_Precachin :

===ENetMode===

Also see [[Legacy:NetMode|NetMode]].
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Client : Client only, no local server.

===EPhysicsDetailLevel===

; PDL_Low :
; PDL_Medium :
; PDL_Hig :

==Methods==

===Inherited From [[Legacy:Actor|Actor]]===
; PostBeginPlay ( ) [simulated] : Limits the DecalStayScale to values between 0.0 and 2.0.
; PreBeginPlay ( ) [simulated] : Initializes the level's [[Legacy:ObjectPool|ObjectPool]].
; Reset ( ) : Performs garbage collection of objects. (not done during gameplay)

===Native Functions===
; DetailChange (EDetailMode NewDetailMode) [simulated] : Switches the world detail mode.
; string GetAddressURL ( ) [simulated] : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL ( ) [simulated] : Return the URL of this level on the local machine.
; bool IsDemoBuild ( ) [simulated] : Returns whether this version of UT2003 is a demo build.
; bool IsEntry ( ) [simulated] : Returns whether this is the [[Legacy:Entry Level|entry level]].

===Other Functions===
; AddPrecacheMaterial ([[Legacy:Material|Material]] mat) [simulated] : Adds a material to the PrecacheMaterials array.
; AddPrecacheStaticMesh ([[Legacy:StaticMesh|StaticMesh]] stat) [simulated] : Adds a static mesh to the PrecacheStaticMeshes array.
; class&lt;[[Legacy:GameInfo|GameInfo]]&gt; GetGameClass ( ) [simulated] : Returns this game's [[Legacy:GameInfo|GameInfo]] class.
; [[Legacy:PlayerController|PlayerController]] GetLocalPlayerController ( ) [simulated] : Returns the local [[Legacy:PlayerController|PlayerController]]. See also [[Legacy:Netcode Idioms|Netcode Idioms]].
; ThisIsNeverExecuted ( ) : Well, this is never executed. ;) This function only contains a reference to the [[Legacy:DefaultPhysicsVolume|DefaultPhysicsVolume]] class to make sure it is loaded.

==Events ==
; FillPrecacheMaterialsArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameTextures function. Also calls all actors' UpdatePrecacheMaterials function.
; FillPrecacheStaticMeshesArray ( ) [simulated] : Tries to find the current game's [[Legacy:GameInfo|GameInfo]] class, using GRI.GameClass, DefaultGameType and PreCacheGame in that order and calls its static PreCacheGameStaticMeshes function. Also calls all actors' UpdatePrecacheStaticMeshes function.
; ServerTravel (string URL, bool bItems) : Jump the server to a new level.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LevelInfo (DX)</title>
    <id>1728</id>
    <revision>
      <id>4255</id>
      <timestamp>2004-02-10T05:03:15Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Info (DX)|Info (DX)]] &gt;&gt; [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]] &gt;&gt; LevelInfo (Engine)}}

LevelInfo contains information about the current level. There should be one per level and it should be actor 0. UnrealEd creates each level's LevelInfo automatically so you should never have to place one manually.

The ZoneInfo properties in the LevelInfo are used to define the properties of all zones which don't themselves have ZoneInfo.

* UT has nativereplication on the class
* UT property VisibleGroups()
* UT property bLowRes()
* DX property EventManager()
* DX event ServerTravel() changed
* DX new function InitEventManager()

==Open Questions==
* What's &quot;FOV&quot;?

==Properties==
; EventManager EventManager : Deus Ex event manager (STM)
; NavigationPoint NavigationPointList : Navigation point list - chained using nextNavigationPoint
; ENetMode NetMode : Net mode enum
; Pawn PawnList : * Pawn list - chained using nextPawn
; SpawnNotify SpawnNotify : Spawn  notification list

===Audio===
; byte CdTrack : Default CD track for level.
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; music Song : default song for level.
; byte SongSection : Default song order for level.

===_Actor Performance Management===
; int AIProfile[8] : Temp statistics
; float AvgAITime : Moving average of actor time

===_Current Time===
; int Day : day of month
; int DayOfWeek : day of week
; int Hour : hour
; int Millisecond : millisecond
; int Minute : minute
; int Month : month
; int Second : second
; float TimeSeconds : Time in seconds since level began play.
; int Year : year

===_Flags Affecting the Level===
; bool bAggressiveLOD : frame rate is well below DesiredFrameRate, so make LOD more aggressive
; bool bAllowFOV : allow FOV [?]
; bool bBegunPlay : Whether gameplay has begun.
; bool bDropDetail : frame rate is below DesiredFrameRate, so drop high detail actors
; bool bHighDetailMode : Client high-detail mode.
; bool bHumansOnly : Only allow &quot;human&quot; player pawns in this level
; bool bLonePlayer : // No multiplayer coordination, i.e. for entranceways.
; bool bNoCheating : no cheating [?]
; bool bPlayersOnly : Only update players.
; bool bStartup : Starting gameplay.

===_Gameplay Rules===
; class&lt;gameinfo&gt; DefaultGameType : Default game type [?]
; GameInfo Game : Game info [?]

===_Level Text Info===
; string Author : Who built the level?
; string IdealPlayerCount : Ideal number of players for this level. I.E.: 6-8
; string LevelEnterText : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for localizations.
; string Pauser : if paused, name of person pausing the game.
; int RecommendedEnemies : number of enemy bots recommended (used by rated games)
; int RecommendedTeammates : number of friendly bots recommended (used by rated games)
; levelsummary Summary : Level summary
; string Title : Level's title

===_Misc Info===
; float Brightness : Brightness level ?]
; texture DefaultTexture : Default texture [?]
; int HubStackLevel : Hub stack level [?]
; ELevelAction LevelAction : What's the level doing right now?
; texture Screenshot : Screenshot texture [?]

===_Networking===
; string ComputerName : Machine's name according to the OS.
; string EngineVersion : Engine version.
; string MinNetVersion : Min engine version that is net compatible.

===_Physics Control===
; bool bCheckWalkSurfaces : enable texture-specific physics code for Pawns.

===_Renderer Management===
; bool bNeverPrecache : Never precache?

===_Server Related===
; bool bNextItems : Next items? [?]
; float NextSwitchCountdown : Next switch countdown [?]
; string NextURL : Next URL [?]

===_Time Passage===
; float TimeDilation : normallty 1 - scales real time passage.

==Enums==

===ELevelAction===

A level action (what the level is doing)

; LEVACT_None : Level isn't doing anything
; LEVACT_Loading : Level is loading
; LEVACT_Saving : Level is saving
; LEVACT_Connecting : Level is connecting
; LEVACT_Precaching : Level is precaching

===ENetMode===

The network mode of a game.

; NM_Standalone : Standalone game
; NM_DedicatedServer : Dedicated sever, no local client
; NM_ListenServer : Listen server
; NM_Client : Client only, no local server

==Functions==
; string GetAddressURL( ): return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL( ): Return the URL of this level on the local machine.
;  InitEventManager( ): Deus Ex - Initialize the Event Manager (STM)
;  PreBeginPlay( ): 

==Events==
;  ServerTravel( string URL , bool bItems ): Jump the server to a new level.

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4256</id>
      <timestamp>2004-02-10T04:49:03Z</timestamp>
      <contributor>
        <ip>Xhiris</ip>
      </contributor>
      <comment>Described enums.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:DX|DX]] :: [[Legacy:Object (DX)|Object (DX)]] &gt;&gt; [[Legacy:Actor (DX)|Actor (DX)]] &gt;&gt; [[Legacy:Info (DX)|Info (DX)]] &gt;&gt; [[Legacy:ZoneInfo (DX)|ZoneInfo (DX)]] &gt;&gt; [[Legacy:LevelInfo (DX)|LevelInfo (DX)]]}}

LevelInfo contains information about the current level. There should be one per level and it should be actor 0. UnrealEd creates each level's LevelInfo automatically so you should never have to place one manually.

The ZoneInfo properties in the LevelInfo are used to define the properties of all zones which don't themselves have ZoneInfo.

==Open Questions==
* What's &quot;FOV&quot;?

==Properties==
; EventManager EventManager : Deus Ex event manager (STM)
; NavigationPoint NavigationPointList : Navigation point list - chained using nextNavigationPoint
; ENetMode NetMode : Net mode enum
; Pawn PawnList : * Pawn list - chained using nextPawn
; SpawnNotify SpawnNotify : Spawn  notification list

===Audio===
; byte CdTrack : Default CD track for level.
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; music Song : default song for level.
; byte SongSection : Default song order for level.

===_Actor Performance Management===
; int AIProfile[8] : Temp statistics
; float AvgAITime : Moving average of actor time

===_Current Time===
; int Day : day of month
; int DayOfWeek : day of week
; int Hour : hour
; int Millisecond : millisecond
; int Minute : minute
; int Month : month
; int Second : second
; float TimeSeconds : Time in seconds since level began play.
; int Year : year

===_Flags Affecting the Level===
; bool bAggressiveLOD : frame rate is well below DesiredFrameRate, so make LOD more aggressive
; bool bAllowFOV : allow FOV [?]
; bool bBegunPlay : Whether gameplay has begun.
; bool bDropDetail : frame rate is below DesiredFrameRate, so drop high detail actors
; bool bHighDetailMode : Client high-detail mode.
; bool bHumansOnly : Only allow &quot;human&quot; player pawns in this level
; bool bLonePlayer : // No multiplayer coordination, i.e. for entranceways.
; bool bNoCheating : no cheating [?]
; bool bPlayersOnly : Only update players.
; bool bStartup : Starting gameplay.

===_Gameplay Rules===
; class&lt;gameinfo&gt; DefaultGameType : Default game type [?]
; GameInfo Game : Game info [?]

===_Level Text Info===
; string Author : Who built the level?
; string IdealPlayerCount : Ideal number of players for this level. I.E.: 6-8
; string LevelEnterText : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for localizations.
; string Pauser : if paused, name of person pausing the game.
; int RecommendedEnemies : number of enemy bots recommended (used by rated games)
; int RecommendedTeammates : number of friendly bots recommended (used by rated games)
; levelsummary Summary : Level summary
; string Title : Level's title

===_Misc Info===
; float Brightness : Brightness level ?]
; texture DefaultTexture : Default texture [?]
; int HubStackLevel : Hub stack level [?]
; ELevelAction LevelAction : What's the level doing right now?
; texture Screenshot : Screenshot texture [?]

===_Networking===
; string ComputerName : Machine's name according to the OS.
; string EngineVersion : Engine version.
; string MinNetVersion : Min engine version that is net compatible.

===_Physics Control===
; bool bCheckWalkSurfaces : enable texture-specific physics code for Pawns.

===_Renderer Management===
; bool bNeverPrecache : Never precache?

===_Server Related===
; bool bNextItems : Next items? [?]
; float NextSwitchCountdown : Next switch countdown [?]
; string NextURL : Next URL [?]

===_Time Passage===
; float TimeDilation : normallty 1 - scales real time passage.

==Enums==

===ELevelAction===

A level action (what the level is doing)

; LEVACT_None : Level isn't doing anything
; LEVACT_Loading : Level is loading
; LEVACT_Saving : Level is saving
; LEVACT_Connecting : Level is connecting
; LEVACT_Precaching : Level is precaching

===ENetMode===

The network mode of a game.

; NM_Standalone : Standalone game
; NM_DedicatedServer : Dedicated sever, no local client
; NM_ListenServer : Listen server
; NM_Client : Client only, no local server

==Functions==
; string GetAddressURL( ): return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL( ): Return the URL of this level on the local machine.
;  InitEventManager( ): Deus Ex - Initialize the Event Manager (STM)
;  PreBeginPlay( ): 

==Events==
;  ServerTravel( string URL , bool bItems ): Jump the server to a new level.

[[Category:Legacy Class (DX)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LevelInfo (UT)</title>
    <id>1704</id>
    <revision>
      <id>4207</id>
      <timestamp>2006-01-09T17:14:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]].

Unrealed will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by with the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo|LevelInfo]] for the UT2003 version of this class.

==Properties==

===LevelInfo===
; string Author : Who built it.
; bool bCheckWalkSurfaces : Enable texture-specific physics code for Pawns. &lt;&amp;ndash; or would if that code had been implented.
; bool bHumansOnly : Only allow &quot;human&quot; player [[Legacy:Pawn|pawn]]s in this level
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; bool bNeverPrecache :
; float Brightness :
; class&lt;[[Legacy:GameInfo (UT)|GameInfo (UT)]]&gt; DefaultGameType : GameInfo to use if ?game= is not in the URL when opening this map.
; string IdealPlayerCount (localized) : Ideal number of players for this level, e.g. 6-8 players.
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for localizations.
; int RecommendedEnemies : Number of enemy bots recommended (used by rated games)
; int RecommendedTeammates : Number of friendly bots recommended (used by rated games)
; [[Legacy:Texture (UT)|Texture (UT)]] Screenshot : A preview of the map. (see [[Legacy:Level Screenshot|Level Screenshot]])
; float TimeDilation : Normally 1 &amp;ndash; scales real time passage. (This is replicated to network clients.)
; string Title (localized): Name of the map.

===Audio===
; byte CdTrack (const) : Default CD track for level. Don't bother with this.
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; Music Song (const) : Default song for level.
; byte SongSection (const) : Default song order for level. ''I haven't tried this, but DigSh.umx has an unusual squence order, with like three songs in one, with sequences 0, 1, and 2 corresponding to plain, action, suspense; so maybe this setting is for the &quot;start pattern&quot;. &amp;ndash;[[Legacy:TwelveBaud|TwelveBaud]]''

===other properties===
; int AIProfile[8] : TEMP statistics
; float AvgAITime : moving average of Actor time
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive
; bool bAllowFOV : (This is replicated to network clients.)
; bool bBegunPlay : Whether gameplay has begun.
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors
; bool bHighDetailMode : Client high-detail mode.
; bool bLowRes (config) : optimize for low resolution (e.g. TV)
; bool bNextItems : If inventory should be carried by players to the next level (used in co-op and SinglePlayer)
; bool bNoCheating : (This is replicated to network clients.)
; bool bPlayersOnly : Only update players.
; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; int Day (transient) : Current date, day of month.
; int DayOfWeek (transient) : Current date, day of week.
; [[Legacy:Texture (UT)|Texture (UT)]] DefaultTexture : This texture will be used if a certain texture can't be loaded.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo (UT)|GameInfo (UT)]] Game : Reference to the [[Legacy:GameInfo (UT)|GameInfo (UT)]]. Not valid on network clients.
; int Hour (transient) : Current time, hour.
; int HubStackLevel :
; ELevelAction LevelAction (transient) : What &quot;Action&quot; the Level is under going.  Used by Console.DrawLevelAction() to print those nice &quot;Loading&quot;, &quot;Saving&quot;, &quot;CONNECTING&quot; and &quot;PRECACHING&quot; messages that we all love so much.
; int Millisecond (transient) : Current time, millisecond.
; string MinNetVersion : Min engine version that is net compatible.
; int Minute (transient) : Current time, minute.
; int Month (transient) : Current date, month.
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : Beginning of the NavigationPoint List.
; ENetMode NetMode : Tells if this is a standalone game, a dedicated server, a listen server, or a Client in a net game.
; string NextURL : The next map the server will go.
; float NextSwitchCountdown : Amount of time until we go to NextURL (if it is set).
; string Pauser : If paused, name of person pausing the game. (This is replicated to network clients.)
; [[Legacy:Pawn (UT)|Pawn (UT)]] PawnList (const) : Beginning of the Pawn List.
; int Second (transient) : Current time, second.
; [[Legacy:SpawnNotify|SpawnNotify]] SpawnNotify : Beginning of the SpawnNotification List.
; [[Legacy:LevelSummary|LevelSummary]] Summary : LevelSummary is a special object saved in the level, which can by Dynamically Loaded to give the wonderful map summary in the Start Practice Session window.
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved
; int Year : Current date, year.

==Enums==

===ENetMode===
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Client : Client only, no local server.

===ELevelAction===
; LEVACT_None : Just playin' the game.
; LEVACT_Loading : Loading another/this level.
; LEVACT_Saving : Saving the Game (generally Single Player only)
; LEVACT_Connecting : Connecting to a Server.
; LEVACT_Precaching : Precaching the Level.

==Methods==
; string GetAddressURL() (native, simulated) : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL() (native, simulated) : Return the URL of this level on the local machine.
; ServerTravel( string URL, bool bItems ) : Jump the server to a new level.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4208</id>
      <timestamp>2003-05-13T16:59:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]].

Unrealed will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by with the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo|LevelInfo]] for the UT2003 version of this class.

==Properties==

===LevelInfo===
; string Author : Who built it.
; bool bCheckWalkSurfaces : Enable texture-specific physics code for Pawns. &lt;&amp;ndash; or would if that code had been implented.
; bool bHumansOnly : Only allow &quot;human&quot; player [[Legacy:Pawn|pawn]]s in this level
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; bool bNeverPrecache :
; float Brightness :
; class&lt;[[Legacy:GameInfo (UT)|GameInfo (UT)]]&gt; DefaultGameType : GameInfo to use if ?game= is not in the URL when opening this map.
; string IdealPlayerCount (localized) : Ideal number of players for this level, e.g. 6-8 players.
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for localizations.
; int RecommendedEnemies : Number of enemy bots recommended (used by rated games)
; int RecommendedTeammates : Number of friendly bots recommended (used by rated games)
; [[Legacy:Texture (UT)|Texture (UT)]] Screenshot : A preview of the map. (see [[Legacy:Level Screenshot|Level Screenshot]])
; float TimeDilation : Normally 1 &amp;ndash; scales real time passage. (This is replicated to network clients.)
; string Title (localized): Name of the map.

===Audio===
; byte CdTrack (const) : Default CD track for level. Don't bother with this.
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; Music Song (const) : Default song for level.
; byte SongSection (const) : Default song order for level.

===other properties===
; int AIProfile[8] : TEMP statistics
; float AvgAITime : moving average of Actor time
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive
; bool bAllowFOV : (This is replicated to network clients.)
; bool bBegunPlay : Whether gameplay has begun.
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors
; bool bHighDetailMode : Client high-detail mode.
; bool bLowRes (config) : optimize for low resolution (e.g. TV)
; bool bNextItems : If inventory should be carried by players to the next level (used in co-op and SinglePlayer)
; bool bNoCheating : (This is replicated to network clients.)
; bool bPlayersOnly : Only update players.
; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; int Day (transient) : Current date, day of month.
; int DayOfWeek (transient) : Current date, day of week.
; [[Legacy:Texture (UT)|Texture (UT)]] DefaultTexture : This texture will be used if a certain texture can't be loaded.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo (UT)|GameInfo (UT)]] Game : Reference to the [[Legacy:GameInfo (UT)|GameInfo (UT)]]. Not valid on network clients.
; int Hour (transient) : Current time, hour.
; int HubStackLevel :
; ELevelAction LevelAction (transient) : What &quot;Action&quot; the Level is under going.  Used by Console.DrawLevelAction() to print those nice &quot;Loading&quot;, &quot;Saving&quot;, &quot;CONNECTING&quot; and &quot;PRECACHING&quot; messages that we all love so much.
; int Millisecond (transient) : Current time, millisecond.
; string MinNetVersion : Min engine version that is net compatible.
; int Minute (transient) : Current time, minute.
; int Month (transient) : Current date, month.
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : Beginning of the NavigationPoint List.
; ENetMode NetMode : Tells if this is a standalone game, a dedicated server, a listen server, or a Client in a net game.
; string NextURL : The next map the server will go.
; float NextSwitchCountdown : Amount of time until we go to NextURL (if it is set).
; string Pauser : If paused, name of person pausing the game. (This is replicated to network clients.)
; [[Legacy:Pawn (UT)|Pawn (UT)]] PawnList (const) : Beginning of the Pawn List.
; int Second (transient) : Current time, second.
; [[Legacy:SpawnNotify|SpawnNotify]] SpawnNotify : Beginning of the SpawnNotification List.
; [[Legacy:LevelSummary|LevelSummary]] Summary : LevelSummary is a special object saved in the level, which can by Dynamically Loaded to give the wonderful map summary in the Start Practice Session window.
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved
; int Year : Current date, year.

==Enums==

===ENetMode===
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Client : Client only, no local server.

===ELevelAction===
; LEVACT_None : Just playin' the game.
; LEVACT_Loading : Loading another/this level.
; LEVACT_Saving : Saving the Game (generally Single Player only)
; LEVACT_Connecting : Connecting to a Server.
; LEVACT_Precaching : Precaching the Level.

==Methods==
; string GetAddressURL ( ) (native, simulated) : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL ( ) (native, simulated) : Return the URL of this level on the local machine.
; ServerTravel(string URL, bool bItems) : Jump the server to a new level.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4209</id>
      <timestamp>2004-03-22T22:15:20Z</timestamp>
      <contributor>
        <ip>TwelveBaud</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] &gt;&gt; LevelInfo (Package: Engine)}}

LevelInfo holds:
* information about the map (default gamemode, author, music, etc).
* information about the zones in the map that don't have a [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]].

Unrealed will automatically place a LevelInfo when you create a new map. It's located at the origin (0,0,0), but its Advanced -&gt; bHiddenEd flag is set so you can't see it.

The properties of the LevelInfo can be accessed
* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Level Properties
* by pressing the F6 key.
* In script by with the Level pointer in any actor.

More details here: [[Legacy:Level Properties|Level Properties]]

See [[Legacy:LevelInfo|LevelInfo]] for the UT2003 version of this class.

==Properties==

===LevelInfo===
; string Author : Who built it.
; bool bCheckWalkSurfaces : Enable texture-specific physics code for Pawns. &lt;&amp;ndash; or would if that code had been implented.
; bool bHumansOnly : Only allow &quot;human&quot; player [[Legacy:Pawn|pawn]]s in this level
; bool bLonePlayer : No multiplayer coordination, i.e. for entranceways.
; bool bNeverPrecache :
; float Brightness :
; class&lt;[[Legacy:GameInfo (UT)|GameInfo (UT)]]&gt; DefaultGameType : GameInfo to use if ?game= is not in the URL when opening this map.
; string IdealPlayerCount (localized) : Ideal number of players for this level, e.g. 6-8 players.
; string LevelEnterText (localized) : Message to tell players when they enter.
; string LocalizedPkg : Package to look in for localizations.
; int RecommendedEnemies : Number of enemy bots recommended (used by rated games)
; int RecommendedTeammates : Number of friendly bots recommended (used by rated games)
; [[Legacy:Texture (UT)|Texture (UT)]] Screenshot : A preview of the map. (see [[Legacy:Level Screenshot|Level Screenshot]])
; float TimeDilation : Normally 1 &amp;ndash; scales real time passage. (This is replicated to network clients.)
; string Title (localized): Name of the map.

===Audio===
; byte CdTrack (const) : Default CD track for level. Don't bother with this.
; float PlayerDoppler : Player doppler shift, 0=none, 1=full.
; Music Song (const) : Default song for level.
; byte SongSection (const) : Default song order for level. ''I haven't tried this, but DigSh.umx has an unusual squence order, with like three songs in one, with sequences 0, 1, and 2 corresponding to plain, action, suspense; so maybe this setting is for the &quot;start pattern&quot;. &amp;ndash;[[Legacy:TwelveBaud|TwelveBaud]]''

===other properties===
; int AIProfile[8] : TEMP statistics
; float AvgAITime : moving average of Actor time
; bool bAggressiveLOD : Frame rate is well below DesiredFrameRate, so make LOD more aggressive
; bool bAllowFOV : (This is replicated to network clients.)
; bool bBegunPlay : Whether gameplay has begun.
; bool bDropDetail : Frame rate is below DesiredFrameRate, so drop high detail actors
; bool bHighDetailMode : Client high-detail mode.
; bool bLowRes (config) : optimize for low resolution (e.g. TV)
; bool bNextItems : If inventory should be carried by players to the next level (used in co-op and SinglePlayer)
; bool bNoCheating : (This is replicated to network clients.)
; bool bPlayersOnly : Only update players.
; bool bStartup : Starting gameplay.
; string ComputerName : Machine's name according to the OS.
; int Day (transient) : Current date, day of month.
; int DayOfWeek (transient) : Current date, day of week.
; [[Legacy:Texture (UT)|Texture (UT)]] DefaultTexture : This texture will be used if a certain texture can't be loaded.
; string EngineVersion : Engine version.
; [[Legacy:GameInfo (UT)|GameInfo (UT)]] Game : Reference to the [[Legacy:GameInfo (UT)|GameInfo (UT)]]. Not valid on network clients.
; int Hour (transient) : Current time, hour.
; int HubStackLevel :
; ELevelAction LevelAction (transient) : What &quot;Action&quot; the Level is under going.  Used by Console.DrawLevelAction() to print those nice &quot;Loading&quot;, &quot;Saving&quot;, &quot;CONNECTING&quot; and &quot;PRECACHING&quot; messages that we all love so much.
; int Millisecond (transient) : Current time, millisecond.
; string MinNetVersion : Min engine version that is net compatible.
; int Minute (transient) : Current time, minute.
; int Month (transient) : Current date, month.
; [[Legacy:NavigationPoint|NavigationPoint]] NavigationPointList (const) : Beginning of the NavigationPoint List.
; ENetMode NetMode : Tells if this is a standalone game, a dedicated server, a listen server, or a Client in a net game.
; string NextURL : The next map the server will go.
; float NextSwitchCountdown : Amount of time until we go to NextURL (if it is set).
; string Pauser : If paused, name of person pausing the game. (This is replicated to network clients.)
; [[Legacy:Pawn (UT)|Pawn (UT)]] PawnList (const) : Beginning of the Pawn List.
; int Second (transient) : Current time, second.
; [[Legacy:SpawnNotify|SpawnNotify]] SpawnNotify : Beginning of the SpawnNotification List.
; [[Legacy:LevelSummary|LevelSummary]] Summary : LevelSummary is a special object saved in the level, which can by Dynamically Loaded to give the wonderful map summary in the Start Practice Session window.
; float TimeSeconds : Time in seconds since level began play.
; string VisibleGroups : List of the group names which were checked when the level was last saved
; int Year : Current date, year.

==Enums==

===ENetMode===
; NM_Standalone : Standalone game.
; NM_DedicatedServer : Dedicated server, no local client.
; NM_ListenServer : Listen server.
; NM_Client : Client only, no local server.

===ELevelAction===
; LEVACT_None : Just playin' the game.
; LEVACT_Loading : Loading another/this level.
; LEVACT_Saving : Saving the Game (generally Single Player only)
; LEVACT_Connecting : Connecting to a Server.
; LEVACT_Precaching : Precaching the Level.

==Methods==
; string GetAddressURL ( ) (native, simulated) : Return the URL of this level, which may possibly exist on a remote machine.
; string GetLocalURL ( ) (native, simulated) : Return the URL of this level on the local machine.
; ServerTravel(string URL, bool bItems) : Jump the server to a new level.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LevelSummary</title>
    <id>1658</id>
    <revision>
      <id>4103</id>
      <timestamp>2003-05-13T16:25:57Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; LevelSummary (Package: Engine)}}

LevelSummary contains the summary properties from the [[Legacy:LevelInfo|LevelInfo]] actor.

Designed for fast loading.

See [[Legacy:LevelSummary (UT)|LevelSummary (UT)]] for the UT version of this class.

==Properties ==

===LevelSummary===
; String Author : 
; string DecoTextName : 
; String Description : 
; bool HideFromMenus : 
; int IdealPlayerCountMax : 
; int IdealPlayerCountMin : 
; string LevelEnterText (localized) : 
; [[Legacy:Material|Material]] Screenshot : 
; string Title (localized) : 

===SinglePlayer===
; int SinglePlayerTeamSize : 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4104</id>
      <timestamp>2003-05-13T16:21:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; LevelSummary (Package: Engine)}}

LevelSummary contains the summary properties from the [[Legacy:LevelInfo|LevelInfo]] actor.

Designed for fast loading.

See [[Legacy:LevelSummary (UT)|LevelSummary (UT)]] for the UT version of this class.

==Properties ==

''brb to add these back in''

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LevelSummary (UT)</title>
    <id>1703</id>
    <revision>
      <id>4206</id>
      <timestamp>2003-05-13T16:26:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object|Object]] &gt;&gt; LevelSummary (Package: Engine)}}

LevelSummary contains the summary properties from the [[Legacy:LevelInfo (UT)|LevelInfo (UT)]] actor.

Designed for fast loading.

See [[Legacy:LevelSummary|LevelSummary]] for the UT2003 version of this class.

==Properties ==
; string Title (localized) : 
; string Author :
; string IdealPlayerCount (localized) :
; int RecommendedEnemies :
; int RecommendedTeammates :
; string LevelEnterText (localized) :

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LiKeMiKeS</title>
    <id>1755</id>
    <revision>
      <id>4306</id>
      <timestamp>2007-12-19T04:19:18Z</timestamp>
      <contributor>
        <ip>LiKeMiKeS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===LiKeMiKeS Here,===

----

====I'm currently working on some special effects:====

[[Image:Legacy_Button_Trouble.jpeg|left|]]

[[Image:Legacy_My_Button_Trouble.jpeg|left|Click &gt;&gt; to view.]]

Which require the use of the texture blending features of UED 3, I seem to be at a loss - as I cannot find any related content reguarding the config buttons not showing up or disappearing after trying to use them.

My only conclusion would be that I may need to update or reinstall my VB libraries, I'm using XP Pro on an Intel cpu.

 '''Any suggestions would be appreciated!'''

Thnx in advance! :P

OK! I was using larger than normal 'Fonts' in my current XP theme, so I returned them to normal and that fixed it!

====New Effect: '''''Security Mirror:'''''====

[[Image:Legacy_My_Security_Mirror.jpeg|left|]]

[[Image:Legacy_Security_Mirror.jpeg|left|Click &gt;&gt; to view.]]

So far its only being used by the local machine, without server code so it doesn't create any lag for other players - but then they also don't see your reflection - only their's.

It's my 'Security Mirror', which is on a curved surface - and currently only shows players in 'behindview' mode since the engine doesn't draw the player model locally while in FP mode. I have managed to get the image to display correctly, I just haven't replaced the images here yet.

 '''The only shapes I'm using so far are from spheres:'''
 '''1) half/quarter..for a corner'''
 '''2) quarter.......a hallway'''
 '''3) half..........&amp; a ceiling'''

I also have plans to use other shapes like the shield on the shield gun for a wide area effect.

Since these mirrors can be scoped in on to view activity in otherwise hidden areas from the player they can be aware of other players in that area that they wouldn't normally be able to see.

I'm going to use my effect for a number other uses like, realistic crystals, glassware, and other optical effects.

====Custom Gravity Problem:====

At the moment I'm having trouble with altering the direction of 'gravity' volumes being used on a rotating Space Station Map I've been doing.
 Any suggestions would be helpful!

----

'''MythOpus:''' Just thought I'd mention that the Wiki page system is case-sensitive so when you login as &quot;Likemikes&quot;, clicking on your username won't bring you to this page.  To solve that, you'll need to either switch user pages or start logging in as &quot;LiKeMiKeS&quot;

'''LiKeMiKeS:''' Oops! when I have more time I'll fix that! I usually use a link anyway, but yeah other ppl would have to do a search to find my page!

Thnx! I just changed my username in the preferences and that worked!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4307</id>
      <timestamp>2007-11-03T12:53:31Z</timestamp>
      <contributor>
        <ip>207-47-205-177.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">===LiKeMiKeS here,===

====I'm currently working on some special effects:====

Which require the use of the texture blending features of UED 3, I seem to be at a loss - as I cannot find any related content reguarding the config buttons not showing up or disappearing after trying to use them.

My only conclusion would be that I may need to update or reinstall my VB libraries, I'm using XP Pro on an Intel cpu.

 Any suggestions would be appreciated!

Thnx in advance! :P

LM

'''MythOpus:''' Just thought I'd mention that the Wiki page system is case-sensitive so when you login as &quot;Likemikes&quot;, clicking on your username won't bring you to this page.  To solve that, you'll need to either switch user pages or start logging in as &quot;LiKeMiKeS&quot;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4308</id>
      <timestamp>2007-12-19T04:11:08Z</timestamp>
      <contributor>
        <ip>Likemikes</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===LiKeMiKeS Here,===

----

====I'm currently working on some special effects:====

[[Image:Legacy_Button_Trouble.jpeg|left|]]

[[Image:Legacy_My_Button_Trouble.jpeg|left|Click &gt;&gt; to view.]]

Which require the use of the texture blending features of UED 3, I seem to be at a loss - as I cannot find any related content reguarding the config buttons not showing up or disappearing after trying to use them.

My only conclusion would be that I may need to update or reinstall my VB libraries, I'm using XP Pro on an Intel cpu.

 '''Any suggestions would be appreciated!'''

Thnx in advance! :P

OK! I was using larger than normal 'Fonts' in my current XP theme, so I returned them to normal and that fixed it!

====New Effect: '''''Security Mirror:'''''====

[[Image:Legacy_My_Security_Mirror.jpeg|left|]]

[[Image:Legacy_Security_Mirror.jpeg|left|Click &gt;&gt; to view.]]

So far its only being used by the local machine, without server code so it doesn't create any lag for other players - but then they also don't see your reflection - only their's.

It's my 'Security Mirror', which is on a curved surface - and currently only shows players in 'behindview' mode since the engine doesn't draw the player model locally while in FP mode. I have managed to get the image to display correctly, I just haven't replaced the images here yet.

 '''The only shapes I'm using so far are from spheres:'''
 '''1) half/quarter..for a corner'''
 '''2) quarter.......a hallway'''
 '''3) half..........&amp; a ceiling'''

I also have plans to use other shapes like the shield on the shield gun for a wide area effect.

Since these mirrors can be scoped in on to view activity in otherwise hidden areas from the player they can be aware of other players in that area that they wouldn't normally be able to see.

I'm going to use my effect for a number other uses like, realistic crystals, glassware, and other optical effects.

====Custom Gravity Problem:====

At the moment I'm having trouble with altering the direction of 'gravity' volumes being used on a rotating Space Station Map I've been doing.
 Any suggestions would be helpful!

----

'''MythOpus:''' Just thought I'd mention that the Wiki page system is case-sensitive so when you login as &quot;Likemikes&quot;, clicking on your username won't bring you to this page.  To solve that, you'll need to either switch user pages or start logging in as &quot;LiKeMiKeS&quot;

'''LiKeMiKeS:''' Oops! when I have more time I'll fix that! I usually use a link anyway, but yeah other ppl would have to do a search to find my page! Thnx!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34413</id>
      <timestamp>2009-05-20T01:11:47Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <minor/>
      <comment>/* New Effect: Security Mirror: */</comment>
      <text xml:space="preserve">===LiKeMiKeS Here,===

----

====I'm currently working on some special effects:====

[[Image:Legacy_Button_Trouble.jpeg|left|]]

[[Image:Legacy_My_Button_Trouble.jpeg|left|Click &gt;&gt; to view.]]

Which require the use of the texture blending features of UED 3, I seem to be at a loss - as I cannot find any related content reguarding the config buttons not showing up or disappearing after trying to use them.

My only conclusion would be that I may need to update or reinstall my VB libraries, I'm using XP Pro on an Intel cpu.

 '''Any suggestions would be appreciated!'''

Thnx in advance! :P

OK! I was using larger than normal 'Fonts' in my current XP theme, so I returned them to normal and that fixed it!

====New Effect: '''''Security Mirror:'''''====

[[Image:Legacy_My_Security_Mirror.jpeg|left|]]

[[Image:Legacy_Security_Mirror.jpeg|left|Click &gt;&gt; to view.]]

So far its only being used by the local machine, without server code so it doesn't create any lag for other players - but then they also don't see your reflection - only their's.

It's my 'Security Mirror', which is on a curved surface - and currently only shows players in 'behindview' mode since the engine doesn't draw the player model locally while in FP mode(still working on a mixed 3rd/1st person view to show player model). I have managed to get the image to display correctly, I just haven't replaced the images here yet.

 '''The only shapes I'm using so far are from spheres:'''
 '''1) half/quarter..for a corner floor/ceiling'''
 '''2) quarter.......for a hallway ceiling/wall corner'''
 '''3) half..........&amp; a ceiling'''

I also have plans to use other shapes like the shield on the shield gun for a focused viewable area effect, to zoom into say down a hallway from an odd angle.

Since these mirrors can be scoped in on to view activity in otherwise hidden areas from the player, they can be aware of other players in that area that they wouldn't normally be able to see.

I'm going to use my effect for a number other uses like, realistic crystals, glassware, and other simulated frame buffer optical effects.

====Custom Gravity Problem:====

At the moment I'm having trouble with altering the direction of 'gravity' volumes being used on a rotating Space Station Map I've been doing.
 Any suggestions would be helpful!

----

'''MythOpus:''' Just thought I'd mention that the Wiki page system is case-sensitive so when you login as &quot;Likemikes&quot;, clicking on your username won't bring you to this page.  To solve that, you'll need to either switch user pages or start logging in as &quot;LiKeMiKeS&quot;

'''LiKeMiKeS:''' Oops! when I have more time I'll fix that! I usually use a link anyway, but yeah other ppl would have to do a search to find my page!

Thnx! I just changed my username in the preferences and that worked!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34414</id>
      <timestamp>2009-05-20T01:14:24Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <comment>/* I'm currently working on some special effects: */</comment>
      <text xml:space="preserve">===LiKeMiKeS Here,===

----

====I'm currently working on some special effects:====

[[Image:Legacy_Button_Trouble.jpeg|left|]]

[[Image:Legacy_My_Button_Trouble.jpeg|left|Click &gt;&gt; to view.]]


Which require the use of the texture blending features of UED 3, I seem to be at a loss - as I cannot find any related content reguarding the config buttons not showing up or disappearing after trying to use them.


My only conclusion would be that I may need to update or reinstall my VB libraries, I'm using XP Pro on an Intel cpu.


 '''Any suggestions would be appreciated!'''

Thnx in advance! :P

OK! I was using larger than normal 'Fonts' in my current XP theme, so I returned them to normal and that fixed it!

====New Effect: '''''Security Mirror:'''''====

[[Image:Legacy_My_Security_Mirror.jpeg|left|]]

[[Image:Legacy_Security_Mirror.jpeg|left|Click &gt;&gt; to view.]]

So far its only being used by the local machine, without server code so it doesn't create any lag for other players - but then they also don't see your reflection - only their's.

It's my 'Security Mirror', which is on a curved surface - and currently only shows players in 'behindview' mode since the engine doesn't draw the player model locally while in FP mode(still working on a mixed 3rd/1st person view to show player model). I have managed to get the image to display correctly, I just haven't replaced the images here yet.

 '''The only shapes I'm using so far are from spheres:'''
 '''1) half/quarter..for a corner floor/ceiling'''
 '''2) quarter.......for a hallway ceiling/wall corner'''
 '''3) half..........&amp; a ceiling'''

I also have plans to use other shapes like the shield on the shield gun for a focused viewable area effect, to zoom into say down a hallway from an odd angle.

Since these mirrors can be scoped in on to view activity in otherwise hidden areas from the player, they can be aware of other players in that area that they wouldn't normally be able to see.

I'm going to use my effect for a number other uses like, realistic crystals, glassware, and other simulated frame buffer optical effects.

====Custom Gravity Problem:====

At the moment I'm having trouble with altering the direction of 'gravity' volumes being used on a rotating Space Station Map I've been doing.
 Any suggestions would be helpful!

----

'''MythOpus:''' Just thought I'd mention that the Wiki page system is case-sensitive so when you login as &quot;Likemikes&quot;, clicking on your username won't bring you to this page.  To solve that, you'll need to either switch user pages or start logging in as &quot;LiKeMiKeS&quot;

'''LiKeMiKeS:''' Oops! when I have more time I'll fix that! I usually use a link anyway, but yeah other ppl would have to do a search to find my page!

Thnx! I just changed my username in the preferences and that worked!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Liandri Archives</title>
    <id>1758</id>
    <revision>
      <id>4314</id>
      <timestamp>2007-08-06T18:44:14Z</timestamp>
      <contributor>
        <ip>Hal</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Visit [http://liandri.beyondunreal.com/ The Liandri Archives] for more information.

The Liandri Archives project is a wiki hosted by BeyondUnreal (much like this one) with a focus on everything having to do with the Unreal series.  Specifically, the Liandri Archives is about the actual Unreal games:

{|

|-
|'''Unreal Games'''
|-
|Unreal
|-
|Unreal - Return to Na Pali
|-
|Unreal 2: The Awakening
|-
|'''Unreal Tournament Games'''
|-
|Unreal Tournament
|-
|Unreal Tournament 2003
|-
|Unreal Tournament 2004
|-
|Unreal Tournament 3
|-
|'''Unreal Championship Games'''
|-
|Unreal Championship
|-
|Unreal Championship 2
|}

==Discusssion==

'''IceCreamYou:''' I figured this page should be created at some point.  I suppose the Liandri Archives wiki was needed, but it seems to me that it overlaps with this one quite a lot.

'''MythOpus:''' I don't really a see a point on having that wiki either and I don't see why it should be advertised here.  Just my two cents.

'''Wormbo:''' UnrealWiki is for developers, Liandri Archives are for players. The UnrealWiki didn't want player stuff before, so now we have a place to send them to.

'''Hal''' For the record, we did talk about it in the IRC channel (Mychaeel and tarquin were there, I think, and maybe a few others) before we began work on Liandri Archives. We all agreed that they would target different audiences. Liandri Archives will always stick to the Unreal series games from a players perspective. We even went to great lengths in choosing the name so that it would neither contain the name Unreal or Wiki. Why should it be advertised here? It needn't be, but we do appreciate the exposure. BeyondUnreal proudly hosts unrealwiki and we've made an additional effort to promote it via the network bar at the top of our front page. Additionally, we will link to unrealwiki in the appropriate spots on Liandri Archives. Hopefully, this will be mutually beneficial! :-)</text>
    </revision>
    <revision>
      <id>4315</id>
      <timestamp>2007-07-21T07:22:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Visit [http://liandri.beyondunreal.com/ The Liandri Archives] for more information.

The Liandri Archives project is a wiki hosted by BeyondUnreal (much like this one) with a focus on everything having to do with the Unreal series.  Specifically, the Liandri Archives is about the actual Unreal games:

{|

|-
|'''Unreal Games'''
|-
|Unreal
|-
|Unreal - Return to Na Pali
|-
|Unreal 2: The Awakening
|-
|'''Unreal Tournament Games'''
|-
|Unreal Tournament
|-
|Unreal Tournament 2003
|-
|Unreal Tournament 2004
|-
|Unreal Tournament 3
|-
|'''Unreal Championship Games'''
|-
|Unreal Championship
|-
|Unreal Championship 2
|}

==Discusssion==

'''IceCreamYou:''' I figured this page should be created at some point.  I suppose the Liandri Archives wiki was needed, but it seems to me that it overlaps with this one quite a lot.

'''MythOpus:''' I don't really a see a point on having that wiki either and I don't see why it should be advertised here.  Just my two cents.

'''Wormbo:''' UnrealWiki is for developers, Liandri Archives are for players. The UnrealWiki didn't want player stuff before, so now we have a place to send them to.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP</title>
    <id>1712</id>
    <revision>
      <id>4224</id>
      <timestamp>2007-11-19T15:13:54Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[http://ut2004.elmuerte.com/LibHTTP3 LibHTTP] is a general purpose code package for UnrealEngine2 (developed by [[Legacy:El Muerte|El Muerte]]). It makes it easier to perform HTTP requests to retrieve data stored on webservers. It takes into account most of the aspects that come into the picture when doing correct HTTP requests.

LibHTTP has the following features
* Support for HTTP version 1.0 and 1.1
* Support for GET/POST/HEAD/TRACE request methods
* Normal and accelerated transfer modes (accelerated mode creates a performance hit)
* Response and Request Header managent
* Cookie management
* Authentication supports (both Basic and Digest methods are supported)
* Support for HTTP proxies
* Gracefull handling of connection timeouts
* Automatic decoding of chunked data
* Automatically follows redirections (creates a redirection history)
* Support for multipart/form-data POST data (prefered form)

Version 2, 3 and 4 have been released under the [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]].

Version 1 was relesed under the Lesser GPL.

The documentation on the UnrealWiki has been changed to reflect Version 2.

==Classes==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCache]] - experimental cache manager
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCacheObject]] - cache document, created by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCache]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCookies]] - Cookie management class
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpLink]] - the actual TCP Link to retrieve the data (dummy class)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpResolveCache]] - hostname resolve cache
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] - HTTP client for retreiving data from webservers
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpUtil]] - static miscelaneous functions
* [[Legacy:NewsFeed|NewsFeed]] - a RSS\RDF Parser

''Note:'' the class documentation on the wiki is not up to date for version 4 yet.

==Examples==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Example]] - a simple example on how to use this package.
* [http://ut2004.elmuerte.com/ServerExt ServerExt] - the MutRSS packages uses this library to fetch it's data

==Releases==
* '''[http://ut2004.elmuerte.com/files/LibHTTP4.zip version 401]'''

* [http://ut2004.elmuerte.com/files/LibHTTP3_5.zip version 350] (UT2004)
* [http://ut2004.elmuerte.com/files/LibHTTP3.zip version 300] (UT2004)
* [http://ut2004.elmuerte.com/files/LibHTTP2.zip version 200] (UT2004)
* [http://ut2004.elmuerte.com/files/LibHTTP2x3.zip version 200] (UT2003)
* [http://www.drunksnipers.com/files/ut2003/LibHTTPv100.zip version 100] (UT2003)

The bleeding edge is always available from my [[Legacy:CVS|CVS]] repository.

; CVS Root for anonymous access : &lt;nowiki&gt;:pserver:anonymous@el-muerte.student.utwente.nl:/usr/local/cvsroot/UT2004&lt;/nowiki&gt; &lt;br /&gt;module name: LibHTTP&lt;br /&gt;tag: v400

===Custom builds \ subclassing HttpSock===

You are allowed to create custom builds of this package (read the license for requirements of custom builds). If you create a custom build you should use a different name for the package so it can be distinguished from the original released (e.g. &lt;code&gt;LibHTTP_MyBuild&lt;/code&gt;). Don't use my current scheme of &lt;code&gt;LibHTTP''version number''&lt;/code&gt;.

Also if you are creating a custom build you might want to checkout the code from the CVS (note, leave the tag field empty), so you'll start of with the latest changes.

When you do a custom build (and in the future subclass) make sure you set a value for the EXTENTION variable. This variable is used in the UserAgent string. So instead of
  LibHTTP/400 (UnrealEngine2; build 3323; http://wiki.beyondunreal.com/wiki/LibHTTP )

You will get
  LibHTTP/040 (UnrealEngine2; build 3323; http://wiki.beyondunreal.com/wiki/LibHTTP ; MyExtention )

===Version 3 release notes===

This version isn't a drop-in replacement for version 2. Although the changes you have to make might be minimal.

* Improved easy of use: get(), post(), head()
* Support for multipart/form-data POST data
* Two different transfer modes: Normal and Fast (tries to download as much data as allowed within a single tick)
* Support for proxy authentication, you get the best performance by setting the right user/pass in the beginning. Otherwise the code using this library will have to do additional processing when the proxy user and pass are not accepted.
* Better support for various authentication methods
* Support for digest authentication (more secure HTTP authentication). When digest is used instead of basic the client has to make 2 requests. With the first request the server will send information needed to construct the response. Basic authentication doesn't have this issue.
* Cookie storage class will automatically be created when bProcCookies or bSendCookies is set to true (and the cookies hasn't been set)

===Version 3.5 release notes===
* All delegates contains a HttpSock Sender argument
* New function string randString(optional int length, optional coerce string prefix)
* MultiPart divider string is now more unique (prevents potential issues with the content data)
* Empty multipart items are never added
* Made more support functions public
* New utility function string timestampToString(int timestamp, optional string Timezone, optional string format) that will convert a UNIX timestamp to a string (RFC 1123, RFC 1036, RFC 2822, ANSI C asctime formats supported)
* Fixed potentional issues with timestamps and cookies

===Version 4 release notes===
*  Various small bugfixes
* Redone the redirection processing, now with better support for each redirection type
* New variable HttpSock.bRfcCompliantRedirect, set this to false for the old, and bad, redirection handling on 301/302 headers (e.g. transform POST into GET)
* Moved DNS caching to a global object, multiple HttpSock classes now use the same cache data
* Added automatic retrying when authentication data is provided in the url, the prefered method for using authenticated locations is to provide the username and password in the url or set them in the currenturl after the OnRequireAuthorization() was received. Can be disabled by setting HttpSock.bAutoAuthenticate to false
* HttpSock.ClearRequestData() will now automatically clear authentication information
* NewsFeed properly reads CDATA
* NewsFeed description fields are truncated to 512 bytes (because of a bug in the engine). Set NewsFeed.bSizeBugFix to false to disable it.
* URL parsing is now done by HttpUtil and stores it in a new xURL struct, all old references to storage of the location and host have been changed to xURL.
* Fixed a couple of bugs in cookie handler, the first cookie was never properly unset
* Fixed a bug where the last line of data may not be properly added to the result array
* Moved the HttpTest class to a UsUnit test suite
* Fixed HttpSock.GetReturnHeader()
* Added a new class HttpCache that manages cached requests, this is somewhat experimental
* Usernames and passwords on the URL are now properly decoded before they're used.

==Discussion==

'''MythOpus:'''El Muerte, how reliable would LipHTTP be for downloading/saving LOTS of information at a given time?

'''El Muerte:''' define lots? LibHTTP is reliable as in, it downloads all the data and stores each line into the result array. So, it's more of an issue how reliable a dynamic array is. And there might be an issue with string length (e.g. &gt;4k strings) but I guess you'll have to test that yourself. Anyway, there is a delegate in HttpSock that'll allow you do process the result data before it's stored in the array (see &lt;tt&gt;OnResponseBody&lt;/tt&gt;).

'''MythOpus:''' Well, I did do a few tests and found that it doesn't handle my blog very well lol.  I am thinking about starting a new project that will require all players to get lots of data from the server.  This data might include usernames and passwords, game stats, current game status, as well as journal entries, poems, stories and, if I can get it to download it properly, pictures.  Most players would have to download a good portion of this data when they first connect to the server.  At that point they would probably have to login.

'''El Muerte:''' Pictures? You are aware that you can't do much with binary data right?

'''MythOpus:''' Well, I was just thinking that perhaps I could make a picture system.  A player could 'draw' a picture in the game and save it and it would save the picture data to a server and when the player wanted to look at it, it would call up that data later and organize it and then display it.  A serious of number to show pixel location/color etc.

'''MythOpus:''' I've been messing around a bit with the NewsFeed class and I can't see to figure out how to get the actual content in the RSS out and display it in something like a text field.

'''El Muerte:''' check out the code of MutRSS ( [http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2004/ServerExtClientB/Classes/RSSFeedRecord.uc?rev=1.3 1] and [http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2004/ServerExt/Classes/MutRSS.uc?rev=1.27 2] )

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4225</id>
      <timestamp>2006-01-29T08:22:46Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[http://ut2004.elmuerte.com/LibHTTP3 LibHTTP] is a general purpose code package for UnrealEngine2 (developed by [[Legacy:El Muerte|El Muerte]]). It makes it easier to perform HTTP requests to retrieve data stored on webservers. It takes into account most of the aspects that come into the picture when doing correct HTTP requests.

LibHTTP has the following features
* Support for HTTP version 1.0 and 1.1
* Support for GET/POST/HEAD/TRACE request methods
* Normal and accelerated transfer modes (accelerated mode creates a performance hit)
* Response and Request Header managent
* Cookie management
* Authentication supports (both Basic and Digest methods are supported)
* Support for HTTP proxies
* Gracefull handling of connection timeouts
* Automatic decoding of chunked data
* Automatically follows redirections (creates a redirection history)
* Support for multipart/form-data POST data (prefered form)

Version 2, 3 and 4 have been released under the [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]].

Version 1 was relesed under the Lesser GPL.

The documentation on the UnrealWiki has been changed to reflect Version 2.

==Classes==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCache]] - experimental cache manager
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCacheObject]] - cache document, created by [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCache]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpCookies]] - Cookie management class
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpLink]] - the actual TCP Link to retrieve the data (dummy class)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpResolveCache]] - hostname resolve cache
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] - HTTP client for retreiving data from webservers
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpUtil]] - static miscelaneous functions
* [[Legacy:NewsFeed|NewsFeed]] - a RSS\RDF Parser

''Note:'' the class documentation on the wiki is not up to date for version 4 yet.

==Examples==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Example]] - a simple example on how to use this package.
* [http://ut2004.elmuerte.com/ServerExt ServerExt] - the MutRSS packages uses this library to fetch it's data

==Releases==
* '''[http://ut2004.elmuerte.com/files/LibHTTP4.zip version 401]'''

* [http://ut2004.elmuerte.com/files/LibHTTP3_5.zip version 350] (UT2004)
* [http://ut2004.elmuerte.com/files/LibHTTP3.zip version 300] (UT2004)
* [http://ut2004.elmuerte.com/files/LibHTTP2.zip version 200] (UT2004)
* [http://ut2004.elmuerte.com/files/LibHTTP2x3.zip version 200] (UT2003)
* [http://www.drunksnipers.com/files/ut2003/LibHTTPv100.zip version 100] (UT2003)

The bleeding edge is always available from my [[Legacy:CVS|CVS]] repository.

; CVS Root for anonymous access : &lt;nowiki&gt;:pserver:anonymous@el-muerte.student.utwente.nl:/usr/local/cvsroot/UT2004&lt;/nowiki&gt; &lt;br /&gt;module name: LibHTTP&lt;br /&gt;tag: v400

===Custom builds \ subclassing HttpSock===

You are allowed to create custom builds of this package (read the license for requirements of custom builds). If you create a custom build you should use a different name for the package so it can be distinguished from the original released (e.g. &lt;code&gt;LibHTTP_MyBuild&lt;/code&gt;). Don't use my current scheme of &lt;code&gt;LibHTTP''version number''&lt;/code&gt;.

Also if you are creating a custom build you might want to checkout the code from the CVS (note, leave the tag field empty), so you'll start of with the latest changes.

When you do a custom build (and in the future subclass) make sure you set a value for the EXTENTION variable. This variable is used in the UserAgent string. So instead of
  LibHTTP/400 (UnrealEngine2; build 3323; http://wiki.beyondunreal.com/wiki/LibHTTP )

You will get
  LibHTTP/040 (UnrealEngine2; build 3323; http://wiki.beyondunreal.com/wiki/LibHTTP ; MyExtention )

===Version 3 release notes===

This version isn't a drop-in replacement for version 2. Although the changes you have to make might be minimal.

* Improved easy of use: get(), post(), head()
* Support for multipart/form-data POST data
* Two different transfer modes: Normal and Fast (tries to download as much data as allowed within a single tick)
* Support for proxy authentication, you get the best performance by setting the right user/pass in the beginning. Otherwise the code using this library will have to do additional processing when the proxy user and pass are not accepted.
* Better support for various authentication methods
* Support for digest authentication (more secure HTTP authentication). When digest is used instead of basic the client has to make 2 requests. With the first request the server will send information needed to construct the response. Basic authentication doesn't have this issue.
* Cookie storage class will automatically be created when bProcCookies or bSendCookies is set to true (and the cookies hasn't been set)

===Version 3.5 release notes===
* All delegates contains a HttpSock Sender argument
* New function string randString(optional int length, optional coerce string prefix)
* MultiPart divider string is now more unique (prevents potential issues with the content data)
* Empty multipart items are never added
* Made more support functions public
* New utility function string timestampToString(int timestamp, optional string Timezone, optional string format) that will convert a UNIX timestamp to a string (RFC 1123, RFC 1036, RFC 2822, ANSI C asctime formats supported)
* Fixed potentional issues with timestamps and cookies

===Version 4 release notes===
*  Various small bugfixes
* Redone the redirection processing, now with better support for each redirection type
* New variable HttpSock.bRfcCompliantRedirect, set this to false for the old, and bad, redirection handling on 301/302 headers (e.g. transform POST into GET)
* Moved DNS caching to a global object, multiple HttpSock classes now use the same cache data
* Added automatic retrying when authentication data is provided in the url, the prefered method for using authenticated locations is to provide the username and password in the url or set them in the currenturl after the OnRequireAuthorization() was received. Can be disabled by setting HttpSock.bAutoAuthenticate to false
* HttpSock.ClearRequestData() will now automatically clear authentication information
* NewsFeed properly reads CDATA
* NewsFeed description fields are truncated to 512 bytes (because of a bug in the engine). Set NewsFeed.bSizeBugFix to false to disable it.
* URL parsing is now done by HttpUtil and stores it in a new xURL struct, all old references to storage of the location and host have been changed to xURL.
* Fixed a couple of bugs in cookie handler, the first cookie was never properly unset
* Fixed a bug where the last line of data may not be properly added to the result array
* Moved the HttpTest class to a UsUnit test suite
* Fixed HttpSock.GetReturnHeader()
* Added a new class HttpCache that manages cached requests, this is somewhat experimental
* Usernames and passwords on the URL are now properly decoded before they're used.

==Discussion==

'''MythOpus:'''El Muerte, how reliable would LipHTTP be for downloading/saving LOTS of information at a given time?

'''El Muerte:''' define lots? LibHTTP is reliable as in, it downloads all the data and stores each line into the result array. So, it's more of an issue how reliable a dynamic array is. And there might be an issue with string length (e.g. &gt;4k strings) but I guess you'll have to test that yourself. Anyway, there is a delegate in HttpSock that'll allow you do process the result data before it's stored in the array (see &lt;tt&gt;OnResponseBody&lt;/tt&gt;).

'''MythOpus:''' Well, I did do a few tests and found that it doesn't handle my blog very well lol.  I am thinking about starting a new project that will require all players to get lots of data from the server.  This data might include usernames and passwords, game stats, current game status, as well as journal entries, poems, stories and, if I can get it to download it properly, pictures.  Most players would have to download a good portion of this data when they first connect to the server.  At that point they would probably have to login.

'''El Muerte:''' Pictures? You are aware that you can't do much with binary data right?

'''MythOpus:''' Well, I was just thinking that perhaps I could make a picture system.  A player could 'draw' a picture in the game and save it and it would save the picture data to a server and when the player wanted to look at it, it would call up that data later and organize it and then display it.  A serious of number to show pixel location/color etc.

'''MythOpus:''' I've been messing around a bit with the NewsFeed class and I can't see to figure out how to get the actual content in the RSS out and display it in something like a text field.

'''El Muerte:''' check out the code of MutRSS ( [http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2004/ServerExtClientB/Classes/RSSFeedRecord.uc?rev=1.3 1] and [http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2004/ServerExt/Classes/MutRSS.uc?rev=1.27 2] )

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/Example</title>
    <id>1718</id>
    <revision>
      <id>4235</id>
      <timestamp>2006-01-07T10:10:13Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">First make sure you set up the environment correctly. Make sure LibHTTP4 is in the EditPackages list and above your package.

This example will explain the most basic usage of [[Legacy:LibHTTP|LibHTTP]]. The example class will simply request a document from the internet and save it to a file.

&lt;uscript line&gt;
class MyLibHTTPExample extends Info;

event PostBeginPlay()
{
  local HttpSock socket;
  socket = spawn(class'HttpSock');
  socket.OnComplete = MyOnComplete;
  socket.ClearRequestData();
  socket.get(&quot;http://wiki.beyondunreal.com/wiki/LibHTTP&quot;);
}

function MyOnComplete(HttpSock Sender)
{
  local FileLog flog;
  local int i;
  flog = spawn(class'FileLog');
  flog.OpenLog(&quot;MyLibHTTPExample&quot;, &quot;html&quot;, true);
  for (i = 0; i &lt; Sender.ReturnData.length; i++)
    flog.Logf(Sender.ReturnData[i]);
  flog.Destroy();
}
&lt;/uscript&gt;

On line #6 we create the main class. The [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] class is the main class of LibHTTP and in most cases the only class you will need to address. On line #7 we set the &lt;tt&gt;OnComplete&lt;/tt&gt; delegate. This delegate is called when the HTTP request was completed. This doesn't mean the HTTP request was succesful (e.g. returned a HTTP response code 200), it just means that LibHTTP was able to perform a successful request and retrieve data from the request location. Next we call the function &lt;tt&gt;ClearRequestData()&lt;/tt&gt; (line #8). Although there is actually no need to call this function in this example, it is quite important in the future. &lt;tt&gt;ClearRequestData()&lt;/tt&gt; will clean up all the data from the previous request. So in case of subsequent requests using the same HttpSock class you should call this function before doing a request, otherwise you might send data to the server you don't want (for example a username and password).

The last function called in the &lt;tt&gt;PostBeginPlay()&lt;/tt&gt; is &lt;tt&gt;get(...)&lt;/tt&gt;. Calling this function will start the HTTP request (using a GET request, which is the most common). The &lt;tt&gt;get(...)&lt;/tt&gt; function accepts the complete URL to the document you want to retrieve. The URL '''must''' be properly encoded or else the request might fail. The URL is used AS IS, so if it's not properly encoded the webserver might not respond correctly. If you don't know if the URL is properly encoded you can also enter that URL is your webbrowser, most webbrowsers will automatically convert the URL to be properly encoded.

After the &lt;tt&gt;get(...)&lt;/tt&gt; is might take a while before the request is done. However, a lot of things can go wrong. If something goes wrong in the preparation of the request the &lt;tt&gt;get(...)&lt;/tt&gt; will return false (also the &lt;tt&gt;OnError&lt;/tt&gt; delegate is called). It could also happen that the webserver isn't reachable (either a connection timeout or the hostname won't resolve), check the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] for more information about this. In this example we assume everything works out.

When the HTTP request is complete, and the whole document has been downloaded, the &lt;tt&gt;OnComplete&lt;/tt&gt; delegate is called. In this case it will call our &lt;tt&gt;MyOnComplete&lt;/tt&gt; function (line #12). The HttpSock class contains a lot of variables you can access, most important are &lt;tt&gt;ReturnData&lt;/tt&gt; and &lt;tt&gt;LastStatus&lt;/tt&gt;. The &lt;tt&gt;LastStatus&lt;/tt&gt; variable will contain the HTTP response code send by the server. This should have the value 200, if it doesn't have the value 200 it means that there was something wrong with the requested data (for example a value of 404 means the file wasn't found, and 500 means the webserver is broken in some way). The &lt;tt&gt;ReturnData&lt;/tt&gt; variable contains the complete body of the requested document, this is usually what you are interested in. In our example we simply save all the data in the &lt;tt&gt;ReturnData&lt;/tt&gt; to a log file. Every entry in the &lt;tt&gt;ReturnData&lt;/tt&gt; array is a single line without the newline characters.

LibHTTP contains a lot of features and functionality, be sure to check out the documentation of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] to check how other things can be done.</text>
    </revision>
    <revision>
      <id>45078</id>
      <timestamp>2012-03-25T13:16:23Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">First make sure you set up the environment correctly. Make sure LibHTTP4 is in the EditPackages list and above your package.

This example will explain the most basic usage of [[Legacy:LibHTTP|LibHTTP]]. The example class will simply request a document from the internet and save it to a file.

&lt;uscript line&gt;
class MyLibHTTPExample extends Info;

event PostBeginPlay()
{
  local HttpSock socket;
  socket = spawn(class'HttpSock');
  socket.OnComplete = MyOnComplete;
  socket.ClearRequestData();
  // The URL has to be complete for example: you must specify the http:// part.
  socket.get(&quot;http://wiki.beyondunreal.com/wiki/LibHTTP&quot;);
}

function MyOnComplete(HttpSock Sender)
{
  local FileLog flog;
  local int i;
  flog = spawn(class'FileLog');
  flog.OpenLog(&quot;MyLibHTTPExample&quot;, &quot;html&quot;, true);
  // Log each retrieved line.
  for (i = 0; i &lt; Sender.ReturnData.length; i++)
    flog.Logf(Sender.ReturnData[i]);
  flog.Destroy();
}
&lt;/uscript&gt;

On line #6 we create the main class. The [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] class is the main class of LibHTTP and in most cases the only class you will need to address. On line #7 we set the &lt;tt&gt;OnComplete&lt;/tt&gt; delegate. This delegate is called when the HTTP request was completed. This doesn't mean the HTTP request was successful (e.g. returned a HTTP response code 200), it just means that LibHTTP was able to perform a successful request and retrieve data from the request location. Next we call the function &lt;tt&gt;ClearRequestData()&lt;/tt&gt; (line #8). Although there is actually no need to call this function in this example, it is quite important in the future. &lt;tt&gt;ClearRequestData()&lt;/tt&gt; will clean up all the data from the previous request. So in case of subsequent requests using the same HttpSock class you should call this function before doing a request, otherwise you might send data to the server you don't want (for example a username and password).

The last function called in the &lt;tt&gt;PostBeginPlay()&lt;/tt&gt; is &lt;tt&gt;get(...)&lt;/tt&gt;. Calling this function will start the HTTP request (using a GET request, which is the most common). The &lt;tt&gt;get(...)&lt;/tt&gt; function accepts the complete URL to the document you want to retrieve. The URL '''must''' be properly encoded or else the request might fail. The URL is used AS IS, so if it's not properly encoded the webserver might not respond correctly. If you don't know if the URL is properly encoded you can also enter that URL is your webbrowser, most webbrowsers will automatically convert the URL to be properly encoded.

After the &lt;tt&gt;get(...)&lt;/tt&gt; it might take a while before the request is done. However, a lot of things can go wrong. If something goes wrong in the preparation of the request the &lt;tt&gt;get(...)&lt;/tt&gt; will return false (also the &lt;tt&gt;OnError&lt;/tt&gt; delegate is called). It could also happen that the webserver isn't reachable (either a connection timeout or the hostname won't resolve), check the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] for more information about this. In this example we assume everything works out.

When the HTTP request is complete, and the whole document has been downloaded, the &lt;tt&gt;OnComplete&lt;/tt&gt; delegate is called. In this case it will call our &lt;tt&gt;MyOnComplete&lt;/tt&gt; function (line #12). The HttpSock class contains a lot of variables you can access, most important are &lt;tt&gt;ReturnData&lt;/tt&gt; and &lt;tt&gt;LastStatus&lt;/tt&gt;. The &lt;tt&gt;LastStatus&lt;/tt&gt; variable will contain the HTTP response code send by the server. This should have the value 200, if it doesn't have the value 200 it means that there was something wrong with the requested data (for example a value of 404 means the file wasn't found, and 500 means the webserver is broken in some way). The &lt;tt&gt;ReturnData&lt;/tt&gt; variable contains the complete body of the requested document, this is usually what you are interested in. In our example we simply save all the data in the &lt;tt&gt;ReturnData&lt;/tt&gt; to a log file. Every entry in the &lt;tt&gt;ReturnData&lt;/tt&gt; array is a single line without the newline characters.

LibHTTP contains a lot of features and functionality, be sure to check out the documentation of [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] to check how other things can be done.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpCache</title>
    <id>1719</id>
    <revision>
      <id>4236</id>
      <timestamp>2007-11-19T15:14:38Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:HttpCache|HttpCache]]}}

Disk\Memory cache for [[Legacy:LibHTTP|LibHTTP]], it will handle caching of data. To use it simply create a HttpCache object and use it's get() request to get updated documents. Don't use a [[Legacy:HttpSock|HttpSock]] instance for this.

When using this class it will perform a specially constructed get request when it's needed, it will try to satisfy the caching headers returned by the server. Ihis class is only usefull if you know the remote server returns correct cachable data. By default most dynamic pages (ASP, PHP, Perl, CGI) will return non-cachable pages.

==Properties==
; array&lt;CacheInfoRecord&gt; CacheList :  cache list, each entry is an URL 

; array&lt;HttpCacheObject&gt; CacheObjectList :  the spawned cache objects 

; class&lt;HttpCacheObject&gt; HttpCacheObjectClass :   

; class&lt;HttpSock&gt; HttpSockClass :   

; array&lt;CacheRequest&gt; Requests :  running requests 

===Options===
; int iCacheLimit :  maximum cache size (entries?) 

==Enums==

===ECacheFailError===

Reasons for a failure

; CF_None :
; CF_BadRequest :
; CF_AuthRequired :
; CF_Timeout :
; CF_ResolveFailed :
; CF_Busy :
; CF_Unknown :

===EDataOrigin===

Hints where the data came from

; DO_Unknown :
; DO_Cache :
; DO_Initial :
; DO_Refresh :

==Structures==

===CacheInfoRecord===

records of the cached entries 

; int colidx :  index in the CacheObjectList, volatile 

; int DataSize :  last datazie 

; int Hash :  hash used for record info 

; int LastUpdate :  last update 

; HttpUtil.xURL URL :  the request URL 

===CacheRequest===

; int idx : 
; HttpSock Socket : 

==Delegates==
;  OnComplete(HttpCache Sender, HttpCacheObject Data, EDataOrigin origin ): Will be called when the operation was completed successfully.

; int OnCreateSock(HttpCache Sender, HttpSock Socket ): Will be called after the HttpSock instance has been created. Use it to set certain variables and delegates for the HttpSock. &lt;br /&gt;Note: You shouldn't set any delegates in the sccket, most will be overwritten anyway.

;  OnError(HttpCache Sender, string ErrorMessage, optional string Param1, optional string Param2 ): Will be called in case of an internal error.

;  OnFail(HttpCache Sender, int idx, ECacheFailError reason ): failed to complete the request, will be called when everything fails

==Functions==
;  CacheCleanup( ): Clean up the cache

; int createHash(string URL ):  return the hash of the URL 

;  DownloadComplete(HttpSock Sender ): 
;  DownloadError(HttpSock Sender, string ErrorMessage, optional string Param1, optional string Param2 ): 
;  DownloadTimeout(HttpSock Sender ): 
; int findCacheRecord(int hash ):  find an idx using a hash 

; int get(string location ): Performs a get request. Returns the ID of the request. This Id can be used in to retrieve the URL in the future

; HttpCacheObject getCacheObject(int idx ):  get\create a CacheObject 

; bool getURLbyId(int id, out string URL ): Returns the URL for a certain ID. Result will be false when the ID is no longer valid.

; bool isCached(string location ): Returns true when the location is cached

;  ResolveFailed(HttpSock Sender, string hostname ): 

==Events==
;  PreBeginPlay( ): 

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4237</id>
      <timestamp>2006-01-09T18:58:45Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:HttpCache|HttpCache]]}}

Disk\Memory cache for [[Legacy:LibHTTP|LibHTTP]], it will handle caching of data. To use it simply create a HttpCache object and use it's get() request to get updated documents. Don't use a [[Legacy:HttpSock|HttpSock]] instance for this.

When using this class it will perform a specially constructed get request when it's needed, it will try to satisfy the caching headers returned by the server. Ihis class is only usefull if you know the remote server returns correct cachable data. By default most dynamic pages (ASP, PHP, Perl, CGI) will return non-cachable pages.

==Properties==
; array&lt;CacheInfoRecord&gt; CacheList :  cache list, each entry is an URL 

; array&lt;HttpCacheObject&gt; CacheObjectList :  the spawned cache objects 

; class&lt;HttpCacheObject&gt; HttpCacheObjectClass :   

; class&lt;HttpSock&gt; HttpSockClass :   

; array&lt;CacheRequest&gt; Requests :  running requests 

===Options===
; int iCacheLimit :  maximum cache size (entries?) 

==Enums==

===ECacheFailError===

Reasons for a failure

; CF_None :
; CF_BadRequest :
; CF_AuthRequired :
; CF_Timeout :
; CF_ResolveFailed :
; CF_Busy :
; CF_Unknown :

===EDataOrigin===

Hints where the data came from

; DO_Unknown :
; DO_Cache :
; DO_Initial :
; DO_Refresh :

==Structures==

===CacheInfoRecord===

records of the cached entries 

; int colidx :  index in the CacheObjectList, volatile 

; int DataSize :  last datazie 

; int Hash :  hash used for record info 

; int LastUpdate :  last update 

; HttpUtil.xURL URL :  the request URL 

===CacheRequest===

; int idx : 
; HttpSock Socket : 

==Delegates==
;  OnComplete(HttpCache Sender, HttpCacheObject Data, EDataOrigin origin ): Will be called when the operation was completed successfully.

; int OnCreateSock(HttpCache Sender, HttpSock Socket ): Will be called after the HttpSock instance has been created. Use it to set certain variables and delegates for the HttpSock. &lt;br /&gt;Note: You shouldn't set any delegates in the sccket, most will be overwritten anyway.

;  OnError(HttpCache Sender, string ErrorMessage, optional string Param1, optional string Param2 ): Will be called in case of an internal error.

;  OnFail(HttpCache Sender, int idx, ECacheFailError reason ): failed to complete the request, will be called when everything fails

==Functions==
;  CacheCleanup( ): Clean up the cache

; int createHash(string URL ):  return the hash of the URL 

;  DownloadComplete(HttpSock Sender ): 
;  DownloadError(HttpSock Sender, string ErrorMessage, optional string Param1, optional string Param2 ): 
;  DownloadTimeout(HttpSock Sender ): 
; int findCacheRecord(int hash ):  find an idx using a hash 

; int get(string location ): Performs a get request. Returns the ID of the request. This Id can be used in to retrieve the URL in the future

; HttpCacheObject getCacheObject(int idx ):  get\create a CacheObject 

; bool getURLbyId(int id, out string URL ): Returns the URL for a certain ID. Result will be false when the ID is no longer valid.

; bool isCached(string location ): Returns true when the location is cached

;  ResolveFailed(HttpSock Sender, string hostname ): 

==Events==
;  PreBeginPlay( ): 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpCacheObject</title>
    <id>1720</id>
    <revision>
      <id>4238</id>
      <timestamp>2007-11-19T15:14:44Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpCacheObject|HttpCacheObject]]}}

Physical storage of the cached data.

==Properties==
; bool bBusy : this object is currently being refreshed

; string ContentType : the content mime type

; array&lt;string&gt; Data : the content body

; int ExpiresOn : timestamp this content expires, if provided by the server

; int LastModification : last modification timestamp

; string URL : the request URL

==Functions==
; int GetSize( ): 

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4239</id>
      <timestamp>2006-01-09T19:01:13Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpCacheObject|HttpCacheObject]]}}

Physical storage of the cached data.

==Properties==
; bool bBusy : this object is currently being refreshed

; string ContentType : the content mime type

; array&lt;string&gt; Data : the content body

; int ExpiresOn : timestamp this content expires, if provided by the server

; int LastModification : last modification timestamp

; string URL : the request URL

==Functions==
; int GetSize( ): 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpCookies</title>
    <id>1717</id>
    <revision>
      <id>4233</id>
      <timestamp>2007-11-19T15:14:48Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpCookies|HttpCookies]]}}

Cookie management system. Part of [[Legacy:LibHTTP|LibHTTP]].

==Properties==
; array&lt;HTTPCookie&gt; CookieData :  the cookie data 

; int iVerbose :  log verbosity 

; HttpUtil Utils :  out utility belt 

==Structures==

===HTTPCookie===

cookie entry 

; string domain :  available to domain 

; int expires :  exprises timestamp 

; string name :  the cookie name 

; string path :  path in the domain 

; string value :  the current value 

==Functions==
;  AddCookie(string cname, string value, int CurrentTimeStamp, optional int expires, optional string domain, optional string path ): Add or overwrite a new cookie&lt;br /&gt;If value is empty the cookie will be deleted&lt;br /&gt;If expires is in the past the cookie will be deleted

; string EscapeQuotes(string in ): 

; string GetCookie(string cname, string domain, string path, optional string defvalue ): Return the value of a cookie

; string GetCookieString(string Domain, string Path, int CurrentTimeStamp ): Create a cookie string. TimeStamp should be the real current timestamp (not GMT corrected)

;  Logf(coerce string message, optional int level, optional coerce string Param1, optional coerce string Param2 ): 
; bool ParseCookieData(string data, string rDomain, string rPath, optional int CurrentTimeStamp, optional bool bAdd, optional int TZoffset ): Parse a string to a cookie&lt;br /&gt;rDomain and rPath are use to check if the cookie domain/path are valid&lt;br /&gt;CurrentTimeStamp is required for adding&lt;br /&gt;if bAdd is true add it to the list&lt;br /&gt;returns true when the string is a valid cookie

; string UnescapeQuotes(string in ): 

==Events==
;  Created( ): 

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4234</id>
      <timestamp>2006-01-09T18:56:01Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpCookies|HttpCookies]]}}

Cookie management system. Part of [[Legacy:LibHTTP|LibHTTP]].

==Properties==
; array&lt;HTTPCookie&gt; CookieData :  the cookie data 

; int iVerbose :  log verbosity 

; HttpUtil Utils :  out utility belt 

==Structures==

===HTTPCookie===

cookie entry 

; string domain :  available to domain 

; int expires :  exprises timestamp 

; string name :  the cookie name 

; string path :  path in the domain 

; string value :  the current value 

==Functions==
;  AddCookie(string cname, string value, int CurrentTimeStamp, optional int expires, optional string domain, optional string path ): Add or overwrite a new cookie&lt;br /&gt;If value is empty the cookie will be deleted&lt;br /&gt;If expires is in the past the cookie will be deleted

; string EscapeQuotes(string in ): 

; string GetCookie(string cname, string domain, string path, optional string defvalue ): Return the value of a cookie

; string GetCookieString(string Domain, string Path, int CurrentTimeStamp ): Create a cookie string. TimeStamp should be the real current timestamp (not GMT corrected)

;  Logf(coerce string message, optional int level, optional coerce string Param1, optional coerce string Param2 ): 
; bool ParseCookieData(string data, string rDomain, string rPath, optional int CurrentTimeStamp, optional bool bAdd, optional int TZoffset ): Parse a string to a cookie&lt;br /&gt;rDomain and rPath are use to check if the cookie domain/path are valid&lt;br /&gt;CurrentTimeStamp is required for adding&lt;br /&gt;if bAdd is true add it to the list&lt;br /&gt;returns true when the string is a valid cookie

; string UnescapeQuotes(string in ): 

==Events==
;  Created( ): 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpLink</title>
    <id>1716</id>
    <revision>
      <id>4231</id>
      <timestamp>2007-11-19T15:14:52Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:InternetInfo|InternetInfo]] &gt;&gt; [[Legacy:InternetLink|InternetLink]] &gt;&gt; [[Legacy:TcpLink|TcpLink]] &gt;&gt; [[Legacy:LibHTTP/HttpLink|HttpLink]]}}

The actual internet link of the HttpSock object. Because connection timeouts can't be handled properly from within the TCPLink this object is used internally.

==Properties==
; [[Legacy:LibHTTP/HttpSock|HttpSock]] HttpSock : the owning HttpSock

==Functions==
;  FastTransfer( ): will be called when ReceiveMode is RMODE_Manual (e.g. TM_Fast)
;  setSocket(HttpSock Sock ): set the socket component
;  Shutdown( ): call this to destroy the socket

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4232</id>
      <timestamp>2006-01-09T18:55:47Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:InternetInfo|InternetInfo]] &gt;&gt; [[Legacy:InternetLink|InternetLink]] &gt;&gt; [[Legacy:TcpLink|TcpLink]] &gt;&gt; [[Legacy:LibHTTP/HttpLink|HttpLink]]}}

The actual internet link of the HttpSock object. Because connection timeouts can't be handled properly from within the TCPLink this object is used internally.

==Properties==
; [[Legacy:LibHTTP/HttpSock|HttpSock]] HttpSock : the owning HttpSock

==Functions==
;  FastTransfer( ): will be called when ReceiveMode is RMODE_Manual (e.g. TM_Fast)
;  setSocket(HttpSock Sock ): set the socket component
;  Shutdown( ): call this to destroy the socket

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpResolveCache</title>
    <id>1721</id>
    <revision>
      <id>4240</id>
      <timestamp>2007-11-19T15:14:56Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpResolveCache|HttpResolveCache]]}}

Object that holds cached resolves. this is used by multiple [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] instances

==Properties==
; array&lt;ResolveCacheEntry&gt; ResolveCache : Resolve cache, already resolved hostnames are not looked up. You have to keep the actor alive in order to use this feature

==Structures==

===ResolveCacheEntry===

resolve chache entry to speed up subsequent request

; InternetLink.IpAddr Address : the address information

; string Hostname : the hostname

==Functions==
;  AddCacheEntry(string hostname, InternetLink.IpAddr Address ): add an entry

; bool ResolveAddress(string hostname, out InternetLink.IpAddr Address ): lookup a resolved address

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4241</id>
      <timestamp>2006-01-09T19:02:28Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpResolveCache|HttpResolveCache]]}}

Object that holds cached resolves. this is used by multiple [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HttpSock]] instances

==Properties==
; array&lt;ResolveCacheEntry&gt; ResolveCache : Resolve cache, already resolved hostnames are not looked up. You have to keep the actor alive in order to use this feature

==Structures==

===ResolveCacheEntry===

resolve chache entry to speed up subsequent request

; InternetLink.IpAddr Address : the address information

; string Hostname : the hostname

==Functions==
;  AddCacheEntry(string hostname, InternetLink.IpAddr Address ): add an entry

; bool ResolveAddress(string hostname, out InternetLink.IpAddr Address ): lookup a resolved address

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpSock</title>
    <id>1715</id>
    <revision>
      <id>4229</id>
      <timestamp>2007-11-19T15:15:02Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:HttpSock|HttpSock]]}}

Base of [[Legacy:LibHTTP|LibHTTP]] this implements the main network methods for connecting

to a webserver and retreiving data from it. Binary data is not supported.

==Constants==
; BUFFERSIZE = 2048 : the output buffer size

; HTTP_CONNECT = &quot;CONNECT&quot; : 
; HTTP_DELETE = &quot;DELETE&quot; : 
; HTTP_GET = &quot;GET&quot; : 
; HTTP_HEAD = &quot;HEAD&quot; : 
; HTTP_OPTIONS = &quot;OPTIONS&quot; : 
; HTTP_POST = &quot;POST&quot; : 
; HTTP_PUT = &quot;PUT&quot; : 
; HTTP_TRACE = &quot;TRACE&quot; : 

; VERSION = 401 : LibHTTP version number

==Properties==
; array&lt;string&gt; authBasicLookup : Base64 encoding lookup table

; bool bAuthTrap : true if an authentication retry should happen

; bool bIsChunked : true if the data is chunked (e.g. Transfer-Encoding: chunked )

; int BoundPort : the port we are connected to 

; bool bTempProxyOverride :  will be set to true in case of a ... 

; bool bTimeout :  true in case of a connection timeout 

; bool bUseTempProxy :  if true use the TempProxy 

; int chunkedCounter :  bytes left in the chunk 

; HTTPCookies Cookies :  the cookie data instance 

; string CRLF :  constant CR LF 

; int CurRedir :  current number of redirections 

; HTTPState curState :  The current state of the socket 

; string EXTENTION : If you make a custom build of this package, or subclass this class then please change the following constant to countain your &quot;extention&quot; name. This will be used in the UserAgent string. (Change it in the defaultproperties)

; bool FollowingRedir :  true if a redirection should be followed 

; class&lt;HttpCookies&gt; HttpCookieClass :  Cookie class to use (if it has not been set) 

; HttpLink HttpLink :  handle to the HttpLink 

; class&lt;HttpLink&gt; HttpLinkClass :  the link class to use 

; string HTTPVER :  The HTTP version to use. Either 1.0 or 1.1 are supported. 

; string inBuffer :  i/o buffers 

; int LastStatus :  The last returned HTTP status code 

; InternetLink.IpAddr LocalLink :  local link address 

; string MultiPartBoundary :  Multipart boundary string, used to split fields 

; string outBuffer :  i/o buffers 

; bool procHeader :  true if headers are being processed 

; array&lt;string&gt; RequestData :  the request data 

; float RequestDuration :  duration of the last request 

; array&lt;string&gt; RequestHeaders :  the request headers 

; array&lt;RequestHistoryEntry&gt; RequestHistory :  history with requests for a single request, will contain more then one entry when redirections are followed 

; string RequestMethod :  the request method 

; HttpResolveCache ResolveCache :  cache object with hostname resolves 

; string ResolveHostname :  the hostname being resolved, used to add to the resolve cache 

; array&lt;string&gt; ReturnData :  the return data 

; array&lt;string&gt; ReturnHeaders :  the return headers 

; float StartRequestTime : start of the request, will be set after the connection was opened and before the actual request will be send

; HttpUtil.xURL TempProxy :  temporary proxy configuration 

; int TZoffset :  Timezone Offset, dynamically calculated from the server's time 

; HttpUtil Utils :  utility class, used to speed up lookups (optimization) 

===Authentication===
; array&lt;GameInfo.KeyValuePair&gt; AuthInfo :  authentication information 

; EAuthMethod AuthMethod :  Authentication method to use when &lt;code&gt;sUsername&lt;/code&gt; is set. This will automatically be set when a &lt;code&gt;WWW-Authenticate&lt;/code&gt; header is received 

; bool bAutoAuthenticate :  If username and password have been set automatically retry the request to authenticate. Note: this can only be done in a second try because the authentication method is required. 

===Options===
; bool bFollowRedirect :  when set to false it won't follow redirects 

; bool bProcCookies :  Process incoming cookies, defaults to true 

; bool bRfcCompliantRedirect : responding to HTTP redirect headers is RFC compliant, otherwise it will behave much like some other HTTP clients behave. This means that in case of a 301/302 it will set the request method from POST to GET. This is not the way it should happen according to the standard.

; bool bSendCookies :  Send cookie data when available, defaults to true 

; float fConnectTimout : connection timeout, if the connection couldn't be established within this time limit it will abort the connection and call &lt;code&gt;OnTimeout()&lt;/code&gt;

; int iMaxRedir :  Maximum redirections to follow 

; int iVerbose : log verbosity, you probably want to leave this 0. check the [[Legacy:HttpUtil|HttpUtil]] class for various log levels.

===Proxy===
; bool bUseProxy : Use a proxy server, this is (and the other proxy settins) a client setting. It's meant for clients to be set when they need to use a proxy.

; int iProxyPort :  The proxy port 

; array&lt;GameInfo.KeyValuePair&gt; ProxyAuthInfo :  authentication information 

; EAuthMethod ProxyAuthMethod :  Authentication method to use when &lt;code&gt;sUsername&lt;/code&gt; is set. This will automatically be set when a &lt;code&gt;Proxy-Authorisation&lt;/code&gt; header is received 

; string sProxyHost :  The hostname of the proxy 

; string sProxyPass :  proxy authentication information 

; string sProxyUser :  proxy authentication information 

===URL===
; HttpUtil.xURL CurrentURL :  the URL struct for the current request 

; string DefaultAccept :  the default value for the Accept header, we only support &quot;text/*&quot; 

; int iLocalPort :  the local port, leave zero to use a random port (adviced) 

===XferMode===
; int iMaxBytesPerTick :  maximum number of bytes to download in a single tick 

; int iMaxIterationsPerTick : Maximum iterations per tick in fast transfer mode. This defines the number of download retries (when nothing was received) the code may perform within a single tick. Because the data pending variable is only updated each tick it will remain true until the transfer function returns even tho there is no data pending.

; ETransferMode TransferMode :  Transfer mode to use during downloads 

==Enums==

===EAuthMethod===

Possible authentication methods, Basic used Base64 encoding to encode the username and password. Digest is more secure.

; AM_None :
; AM_Unknown :
; AM_Basic :
; AM_Digest :

===ETransferMode===

Method used to download the data. &lt;code&gt;TM_Fast&lt;/code&gt; will try to read as much as possible in a single tick, this will have an impact on the game performance during the download. Only use this mode when it's time critical. Use the variables &lt;code&gt;iMaxBytesPerTick&lt;/code&gt; and &lt;code&gt;iMaxIterationsPerTick&lt;/code&gt; to tweak this transfer mode.

; TM_Normal :
; TM_Fast :

===HTTPState===

; HTTPState_Resolving :
; HTTPState_Connecting :
; HTTPState_SendingRequest :
; HTTPState_WaitingForResponse :
; HTTPState_ReceivingData :
; HTTPState_Closed :

==Structures==

===RequestHistoryEntry===

; string Hostname :  server hostname 

; int HTTPresponse :  the HTTP response code received 

; string Location :  location, can include GET data 

; string Method :  method used in the request 

; HttpUtil.xURL URL :  the request URL

==Delegates==
; bool OnComplete(HttpSock Sender ): Will be called when the operation was completed successfully. &lt;br /&gt;It won't be called when an time out occured.

; bool OnConnectError(HttpSock Sender ): Called when Open() fails

; bool OnConnectionTimeout(HttpSock Sender ): called when the connection has timed out (e.g. open() failed after a set time)

; bool OnError(HttpSock Sender, string ErrorMessage, optional string Param1, optional string Param2 ): Will be called in case of an internal error.

;  OnFollowRedirect(HttpSock Sender, HttpUtil.xURL NewLocation ): Called before the redirection is followed, return false to prevernt following the redirection

;  OnPreConnect(HttpSock Sender ): Called before the connection is established.

;  OnRequestBody(HttpSock Sender ): Will be called when the request body has to be send. Do note that you are required to set the &lt;code&gt;Content-Length&lt;/code&gt; header to the total size of the content being send. If you use this delegate to send the request body manually you will have to set the Content-Length header yourself.

; bool OnRequireAuthorization(HttpSock Sender, EAuthMethod method, array&lt;GameInfo.KeyValuePair&gt; info ): Will be called when authorization is required for the current location. &lt;br /&gt;This will be called directly after receiving the WWW-Authenticate header. So it's best not to stall this call. It's just a notification.

; int OnRequireProxyAuthorization(HttpSock Sender, EAuthMethod method, array&lt;GameInfo.KeyValuePair&gt; info ): Will be called when authorization is required for the current proxy. &lt;br /&gt;This will be called directly after receiving the Proxy-Authenticate header. So it's best not to stall this call. It's just a notification.

;  OnResolved(HttpSock Sender, string hostname, InternetLink.IpAddr Addr ): Will be called when the host name is resolved. &lt;br /&gt;Return true to continue, or false to abort.

; string OnResolveFailed(HttpSock Sender, string hostname ):  Called when the resolved failed, hostname is the hostname that could not be resolved 

; string OnResponseBody(HttpSock Sender, string line ): Will be called for every response line received (only the body). Return false to stop the default behavior of storing the response body. Use this delegate if you need to have live updates of the content and can not wait until the request is complete.

; string OnReturnCode(HttpSock Sender, int ReturnCode, string ReturnMessage, string HttpVer ): Will be called when the return code has been received; This is the first function called after the request has been send.

; bool OnSendRequestHeaders(HttpSock Sender ): This delegate will be send right before the headers are send to the webserver. If you want to change the headers you should do it here. &lt;br /&gt;Warning: becarefull not to change or unset automatically generated headers that are important for this request (like authentication or request body headers)

==Functions==
; bool Abort( ): Abort the current request, if possible

; bool AddHeader(string hname, coerce string value, optional bool bNoReplace ): Add a header, case insensitive. Set bNoReplace to false to not overwrite the old header. Returns true when the header has been set.

; bool CachedResolve(coerce string hostname, optional bool bDontConnect ):  lookup a chached resolve and connect if found 

; bool clearFormData( ): This will clear the POST data. Use this before calling &lt;code&gt;setFormData&lt;/code&gt;

;  ClearRequestData(optional bool bDontClearAuth ): This function will clear the previous request data. You may want to use this when you do a new request with the same socket. Previous set headers won't be unset automatically.

;  Closed( ):  connection closed, check for a required redirection 

;  CloseSocket( ):  destroy the current socket, should only be called in case of a timeout 

; bool CreateSocket( ):  create the socket, if required 

; int DataSize(array&lt;string&gt; data ): Return the actual data size of a string array, it appends sizeof(CRLF) for each line. This is used for sending the RequestData.

; string genAuthorization(EAuthMethod method, string Username, string Password, array&lt;GameInfo.KeyValuePair&gt; Info ): generate the authentication data, depending on the method it will be either a Basic or Digest response

; string genBasicAuthorization(string Username, string Password ): Generated a basic authentication response

; string genDigestAuthorization(string Username, string Password, array&lt;GameInfo.KeyValuePair&gt; Info ):  generate the Digest authorization data string 

; bool get(string location ): This will perform a simple HTTP GET request. This will be the most commonly used function to retrieve a document from a webserver. The location is just like the location you would use in your webbrowser.

; string getHTTPversion( ):  return thr current HTTP version setting 

; string GetRequestHeader(string hname, optional coerce string def ): Returns the value of the requested header, or default if not found

; string GetReturnHeader(string hname, optional coerce string def ): Returns the value of the returned header, or default if not found

; int getTZoffset( ): Return the timezone offset

; string GetValue(string key, array&lt;GameInfo.KeyValuePair&gt; Info, optional coerce string def ): Returns the value of a &lt;code&gt;KeyValuePair&lt;/code&gt;

; bool head(string location ): perform a HTTP HEAD request. This will only return the headers. Use this this if you only want to check the file info on the server and not the whole body.

; bool HttpRequest(string location, string Method ): Start the HTTP request. Location can be a fully qualified url, or just the location on the configured server. &lt;br /&gt;This is an internal function called by the &lt;code&gt;get()&lt;/code&gt;, &lt;code&gt;head()&lt;/code&gt; and &lt;code&gt;post()&lt;/code&gt; functions. If you want to support additional HTTP requests you should subclass this class.

; bool httrace(string location ): perform a HTTP TRACE request. This will simply cause the webserver to return the request it received. It's only usefull for debugging.

;  InternalResolved(InternetLink.IpAddr Addr , optional bool bDontCache ):  hostname has been resolved 

; bool IsAuthMethodSupported(EAuthMethod method ):  return if the authentication method is supported 

; bool IsSupportedMethod( ):  Returns true when the request method is supported 

;  Logf(coerce string message, optional int level, optional coerce string Param1, optional coerce string Param2 ):  manage logging 

; int now( ): Returns the current timestamp. Warning this is not a valid UNIX timestamp because the timezone is unknown (e.g. timestamps are always GMT)

; bool OpenConnection( ):  start the download 

;  Opened( ):  will be called from HttpLink 

; bool post(string location, optional string PostData ): This will perform a simple HTTP POST request. If the PostData is not empty it will overwrite the current post data and set the content type to &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;.

; bool postex(string location, optional array&lt;string&gt; PostData ): Perform a HTTP POST request using an array containing the postdata. if the array length &gt; 0 it will overwrite the current post data. It will send the post data AS IS and doesn't set the content-type. &lt;br /&gt;You might want to use the &lt;code&gt;post();&lt;/code&gt; function together with &lt;code&gt;setFormData();&lt;/code&gt;, that method is easier to use.

;  ProccessWWWAuthenticate(string HeaderData, bool bProxyAuth ): Process the header data of a WWW-Authenticate or Proxy-Authorization header

;  ProcHeaders( ): Will be called by ProcInput after all headers have been received

;  ProcInput(string inline ): Process the input

; string randString(optional int size, optional coerce string prefix ): Generates a random string. The size defaults to 16. Prefix isn't included with the size;

;  ReceivedText(string Line ):  called from HttpLink 

; bool RemoveHeader(string hname ): Remove a header, case insensitive. Returns true when the header is deleted

;  ResolveFailed( ):  will be called from HttpLink when the resolve failed 

;  SendData(string data, optional bool bFlush ): Send data buffered &lt;br /&gt;if bFlush it will flush all remaining data (should be used for the last call)

; bool setFormData(string field, coerce string data, optional string contentType, optional string contentEncoding ): Simple form of &lt;code&gt;setFormDataEx&lt;/code&gt; when the data is only one line

; bool setFormDataEx(string field, array&lt;string&gt; data, optional string contentType, optional string contentEncoding ): Add form data (used for &lt;code&gt;multipart/form-data&lt;/code&gt; instead of &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;). This method makes it easier to add form-data. It doesn't clear the previous data, it will just append it. Form Data gives you more control over the actual data send. Also you don't have to escape the data. &lt;br /&gt;It will also force the content type to &lt;code&gt;multipart/form-data&lt;/code&gt;.

; bool setHTTPversion(optional string newver ):  Set the HTTP version, if empty the default will be used. Returns true when the version has been updated 

; bool ShouldFollowRedirect(int retc, string method ): returns true when a redirect should be followed, also updates headers for the next request.

; EAuthMethod StrToAuthMethod(coerce string method ):  string to EAuthMethod 

;  Timer( ):  timer is used for the conenection timeout. 

; string UserAgent( ):  Returns the useragent string we use 

==Events==
;  Destroyed( ):  clean up as much as possible 

;  PreBeginPlay( ):  initialize some variables 

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4230</id>
      <timestamp>2006-01-09T18:55:20Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:HttpSock|HttpSock]]}}

Base of [[Legacy:LibHTTP|LibHTTP]] this implements the main network methods for connecting

to a webserver and retreiving data from it. Binary data is not supported.

==Constants==
; BUFFERSIZE = 2048 : the output buffer size

; HTTP_CONNECT = &quot;CONNECT&quot; : 
; HTTP_DELETE = &quot;DELETE&quot; : 
; HTTP_GET = &quot;GET&quot; : 
; HTTP_HEAD = &quot;HEAD&quot; : 
; HTTP_OPTIONS = &quot;OPTIONS&quot; : 
; HTTP_POST = &quot;POST&quot; : 
; HTTP_PUT = &quot;PUT&quot; : 
; HTTP_TRACE = &quot;TRACE&quot; : 

; VERSION = 401 : LibHTTP version number

==Properties==
; array&lt;string&gt; authBasicLookup : Base64 encoding lookup table

; bool bAuthTrap : true if an authentication retry should happen

; bool bIsChunked : true if the data is chunked (e.g. Transfer-Encoding: chunked )

; int BoundPort : the port we are connected to 

; bool bTempProxyOverride :  will be set to true in case of a ... 

; bool bTimeout :  true in case of a connection timeout 

; bool bUseTempProxy :  if true use the TempProxy 

; int chunkedCounter :  bytes left in the chunk 

; HTTPCookies Cookies :  the cookie data instance 

; string CRLF :  constant CR LF 

; int CurRedir :  current number of redirections 

; HTTPState curState :  The current state of the socket 

; string EXTENTION : If you make a custom build of this package, or subclass this class then please change the following constant to countain your &quot;extention&quot; name. This will be used in the UserAgent string. (Change it in the defaultproperties)

; bool FollowingRedir :  true if a redirection should be followed 

; class&lt;HttpCookies&gt; HttpCookieClass :  Cookie class to use (if it has not been set) 

; HttpLink HttpLink :  handle to the HttpLink 

; class&lt;HttpLink&gt; HttpLinkClass :  the link class to use 

; string HTTPVER :  The HTTP version to use. Either 1.0 or 1.1 are supported. 

; string inBuffer :  i/o buffers 

; int LastStatus :  The last returned HTTP status code 

; InternetLink.IpAddr LocalLink :  local link address 

; string MultiPartBoundary :  Multipart boundary string, used to split fields 

; string outBuffer :  i/o buffers 

; bool procHeader :  true if headers are being processed 

; array&lt;string&gt; RequestData :  the request data 

; float RequestDuration :  duration of the last request 

; array&lt;string&gt; RequestHeaders :  the request headers 

; array&lt;RequestHistoryEntry&gt; RequestHistory :  history with requests for a single request, will contain more then one entry when redirections are followed 

; string RequestMethod :  the request method 

; HttpResolveCache ResolveCache :  cache object with hostname resolves 

; string ResolveHostname :  the hostname being resolved, used to add to the resolve cache 

; array&lt;string&gt; ReturnData :  the return data 

; array&lt;string&gt; ReturnHeaders :  the return headers 

; float StartRequestTime : start of the request, will be set after the connection was opened and before the actual request will be send

; HttpUtil.xURL TempProxy :  temporary proxy configuration 

; int TZoffset :  Timezone Offset, dynamically calculated from the server's time 

; HttpUtil Utils :  utility class, used to speed up lookups (optimization) 

===Authentication===
; array&lt;GameInfo.KeyValuePair&gt; AuthInfo :  authentication information 

; EAuthMethod AuthMethod :  Authentication method to use when &lt;code&gt;sUsername&lt;/code&gt; is set. This will automatically be set when a &lt;code&gt;WWW-Authenticate&lt;/code&gt; header is received 

; bool bAutoAuthenticate :  If username and password have been set automatically retry the request to authenticate. Note: this can only be done in a second try because the authentication method is required. 

===Options===
; bool bFollowRedirect :  when set to false it won't follow redirects 

; bool bProcCookies :  Process incoming cookies, defaults to true 

; bool bRfcCompliantRedirect : responding to HTTP redirect headers is RFC compliant, otherwise it will behave much like some other HTTP clients behave. This means that in case of a 301/302 it will set the request method from POST to GET. This is not the way it should happen according to the standard.

; bool bSendCookies :  Send cookie data when available, defaults to true 

; float fConnectTimout : connection timeout, if the connection couldn't be established within this time limit it will abort the connection and call &lt;code&gt;OnTimeout()&lt;/code&gt;

; int iMaxRedir :  Maximum redirections to follow 

; int iVerbose : log verbosity, you probably want to leave this 0. check the [[Legacy:HttpUtil|HttpUtil]] class for various log levels.

===Proxy===
; bool bUseProxy : Use a proxy server, this is (and the other proxy settins) a client setting. It's meant for clients to be set when they need to use a proxy.

; int iProxyPort :  The proxy port 

; array&lt;GameInfo.KeyValuePair&gt; ProxyAuthInfo :  authentication information 

; EAuthMethod ProxyAuthMethod :  Authentication method to use when &lt;code&gt;sUsername&lt;/code&gt; is set. This will automatically be set when a &lt;code&gt;Proxy-Authorisation&lt;/code&gt; header is received 

; string sProxyHost :  The hostname of the proxy 

; string sProxyPass :  proxy authentication information 

; string sProxyUser :  proxy authentication information 

===URL===
; HttpUtil.xURL CurrentURL :  the URL struct for the current request 

; string DefaultAccept :  the default value for the Accept header, we only support &quot;text/*&quot; 

; int iLocalPort :  the local port, leave zero to use a random port (adviced) 

===XferMode===
; int iMaxBytesPerTick :  maximum number of bytes to download in a single tick 

; int iMaxIterationsPerTick : Maximum iterations per tick in fast transfer mode. This defines the number of download retries (when nothing was received) the code may perform within a single tick. Because the data pending variable is only updated each tick it will remain true until the transfer function returns even tho there is no data pending.

; ETransferMode TransferMode :  Transfer mode to use during downloads 

==Enums==

===EAuthMethod===

Possible authentication methods, Basic used Base64 encoding to encode the username and password. Digest is more secure.

; AM_None :
; AM_Unknown :
; AM_Basic :
; AM_Digest :

===ETransferMode===

Method used to download the data. &lt;code&gt;TM_Fast&lt;/code&gt; will try to read as much as possible in a single tick, this will have an impact on the game performance during the download. Only use this mode when it's time critical. Use the variables &lt;code&gt;iMaxBytesPerTick&lt;/code&gt; and &lt;code&gt;iMaxIterationsPerTick&lt;/code&gt; to tweak this transfer mode.

; TM_Normal :
; TM_Fast :

===HTTPState===

; HTTPState_Resolving :
; HTTPState_Connecting :
; HTTPState_SendingRequest :
; HTTPState_WaitingForResponse :
; HTTPState_ReceivingData :
; HTTPState_Closed :

==Structures==

===RequestHistoryEntry===

; string Hostname :  server hostname 

; int HTTPresponse :  the HTTP response code received 

; string Location :  location, can include GET data 

; string Method :  method used in the request 

; HttpUtil.xURL URL :  the request URL

==Delegates==
; bool OnComplete(HttpSock Sender ): Will be called when the operation was completed successfully. &lt;br /&gt;It won't be called when an time out occured.

; bool OnConnectError(HttpSock Sender ): Called when Open() fails

; bool OnConnectionTimeout(HttpSock Sender ): called when the connection has timed out (e.g. open() failed after a set time)

; bool OnError(HttpSock Sender, string ErrorMessage, optional string Param1, optional string Param2 ): Will be called in case of an internal error.

;  OnFollowRedirect(HttpSock Sender, HttpUtil.xURL NewLocation ): Called before the redirection is followed, return false to prevernt following the redirection

;  OnPreConnect(HttpSock Sender ): Called before the connection is established.

;  OnRequestBody(HttpSock Sender ): Will be called when the request body has to be send. Do note that you are required to set the &lt;code&gt;Content-Length&lt;/code&gt; header to the total size of the content being send. If you use this delegate to send the request body manually you will have to set the Content-Length header yourself.

; bool OnRequireAuthorization(HttpSock Sender, EAuthMethod method, array&lt;GameInfo.KeyValuePair&gt; info ): Will be called when authorization is required for the current location. &lt;br /&gt;This will be called directly after receiving the WWW-Authenticate header. So it's best not to stall this call. It's just a notification.

; int OnRequireProxyAuthorization(HttpSock Sender, EAuthMethod method, array&lt;GameInfo.KeyValuePair&gt; info ): Will be called when authorization is required for the current proxy. &lt;br /&gt;This will be called directly after receiving the Proxy-Authenticate header. So it's best not to stall this call. It's just a notification.

;  OnResolved(HttpSock Sender, string hostname, InternetLink.IpAddr Addr ): Will be called when the host name is resolved. &lt;br /&gt;Return true to continue, or false to abort.

; string OnResolveFailed(HttpSock Sender, string hostname ):  Called when the resolved failed, hostname is the hostname that could not be resolved 

; string OnResponseBody(HttpSock Sender, string line ): Will be called for every response line received (only the body). Return false to stop the default behavior of storing the response body. Use this delegate if you need to have live updates of the content and can not wait until the request is complete.

; string OnReturnCode(HttpSock Sender, int ReturnCode, string ReturnMessage, string HttpVer ): Will be called when the return code has been received; This is the first function called after the request has been send.

; bool OnSendRequestHeaders(HttpSock Sender ): This delegate will be send right before the headers are send to the webserver. If you want to change the headers you should do it here. &lt;br /&gt;Warning: becarefull not to change or unset automatically generated headers that are important for this request (like authentication or request body headers)

==Functions==
; bool Abort( ): Abort the current request, if possible

; bool AddHeader(string hname, coerce string value, optional bool bNoReplace ): Add a header, case insensitive. Set bNoReplace to false to not overwrite the old header. Returns true when the header has been set.

; bool CachedResolve(coerce string hostname, optional bool bDontConnect ):  lookup a chached resolve and connect if found 

; bool clearFormData( ): This will clear the POST data. Use this before calling &lt;code&gt;setFormData&lt;/code&gt;

;  ClearRequestData(optional bool bDontClearAuth ): This function will clear the previous request data. You may want to use this when you do a new request with the same socket. Previous set headers won't be unset automatically.

;  Closed( ):  connection closed, check for a required redirection 

;  CloseSocket( ):  destroy the current socket, should only be called in case of a timeout 

; bool CreateSocket( ):  create the socket, if required 

; int DataSize(array&lt;string&gt; data ): Return the actual data size of a string array, it appends sizeof(CRLF) for each line. This is used for sending the RequestData.

; string genAuthorization(EAuthMethod method, string Username, string Password, array&lt;GameInfo.KeyValuePair&gt; Info ): generate the authentication data, depending on the method it will be either a Basic or Digest response

; string genBasicAuthorization(string Username, string Password ): Generated a basic authentication response

; string genDigestAuthorization(string Username, string Password, array&lt;GameInfo.KeyValuePair&gt; Info ):  generate the Digest authorization data string 

; bool get(string location ): This will perform a simple HTTP GET request. This will be the most commonly used function to retrieve a document from a webserver. The location is just like the location you would use in your webbrowser.

; string getHTTPversion( ):  return thr current HTTP version setting 

; string GetRequestHeader(string hname, optional coerce string def ): Returns the value of the requested header, or default if not found

; string GetReturnHeader(string hname, optional coerce string def ): Returns the value of the returned header, or default if not found

; int getTZoffset( ): Return the timezone offset

; string GetValue(string key, array&lt;GameInfo.KeyValuePair&gt; Info, optional coerce string def ): Returns the value of a &lt;code&gt;KeyValuePair&lt;/code&gt;

; bool head(string location ): perform a HTTP HEAD request. This will only return the headers. Use this this if you only want to check the file info on the server and not the whole body.

; bool HttpRequest(string location, string Method ): Start the HTTP request. Location can be a fully qualified url, or just the location on the configured server. &lt;br /&gt;This is an internal function called by the &lt;code&gt;get()&lt;/code&gt;, &lt;code&gt;head()&lt;/code&gt; and &lt;code&gt;post()&lt;/code&gt; functions. If you want to support additional HTTP requests you should subclass this class.

; bool httrace(string location ): perform a HTTP TRACE request. This will simply cause the webserver to return the request it received. It's only usefull for debugging.

;  InternalResolved(InternetLink.IpAddr Addr , optional bool bDontCache ):  hostname has been resolved 

; bool IsAuthMethodSupported(EAuthMethod method ):  return if the authentication method is supported 

; bool IsSupportedMethod( ):  Returns true when the request method is supported 

;  Logf(coerce string message, optional int level, optional coerce string Param1, optional coerce string Param2 ):  manage logging 

; int now( ): Returns the current timestamp. Warning this is not a valid UNIX timestamp because the timezone is unknown (e.g. timestamps are always GMT)

; bool OpenConnection( ):  start the download 

;  Opened( ):  will be called from HttpLink 

; bool post(string location, optional string PostData ): This will perform a simple HTTP POST request. If the PostData is not empty it will overwrite the current post data and set the content type to &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;.

; bool postex(string location, optional array&lt;string&gt; PostData ): Perform a HTTP POST request using an array containing the postdata. if the array length &gt; 0 it will overwrite the current post data. It will send the post data AS IS and doesn't set the content-type. &lt;br /&gt;You might want to use the &lt;code&gt;post();&lt;/code&gt; function together with &lt;code&gt;setFormData();&lt;/code&gt;, that method is easier to use.

;  ProccessWWWAuthenticate(string HeaderData, bool bProxyAuth ): Process the header data of a WWW-Authenticate or Proxy-Authorization header

;  ProcHeaders( ): Will be called by ProcInput after all headers have been received

;  ProcInput(string inline ): Process the input

; string randString(optional int size, optional coerce string prefix ): Generates a random string. The size defaults to 16. Prefix isn't included with the size;

;  ReceivedText(string Line ):  called from HttpLink 

; bool RemoveHeader(string hname ): Remove a header, case insensitive. Returns true when the header is deleted

;  ResolveFailed( ):  will be called from HttpLink when the resolve failed 

;  SendData(string data, optional bool bFlush ): Send data buffered &lt;br /&gt;if bFlush it will flush all remaining data (should be used for the last call)

; bool setFormData(string field, coerce string data, optional string contentType, optional string contentEncoding ): Simple form of &lt;code&gt;setFormDataEx&lt;/code&gt; when the data is only one line

; bool setFormDataEx(string field, array&lt;string&gt; data, optional string contentType, optional string contentEncoding ): Add form data (used for &lt;code&gt;multipart/form-data&lt;/code&gt; instead of &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;). This method makes it easier to add form-data. It doesn't clear the previous data, it will just append it. Form Data gives you more control over the actual data send. Also you don't have to escape the data. &lt;br /&gt;It will also force the content type to &lt;code&gt;multipart/form-data&lt;/code&gt;.

; bool setHTTPversion(optional string newver ):  Set the HTTP version, if empty the default will be used. Returns true when the version has been updated 

; bool ShouldFollowRedirect(int retc, string method ): returns true when a redirect should be followed, also updates headers for the next request.

; EAuthMethod StrToAuthMethod(coerce string method ):  string to EAuthMethod 

;  Timer( ):  timer is used for the conenection timeout. 

; string UserAgent( ):  Returns the useragent string we use 

==Events==
;  Destroyed( ):  clean up as much as possible 

;  PreBeginPlay( ):  initialize some variables 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/HttpUtil</title>
    <id>1714</id>
    <revision>
      <id>4227</id>
      <timestamp>2007-11-19T15:15:06Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpUtil|HttpUtil]]}}

Miscelaneous static functions. Part of [[Legacy:LibHTTP|LibHTTP]].

Contains various algorithms, under which [[Legacy:Base64|Base64]] encoding and [[Legacy:MD5|MD5]] hash generation. [[Legacy:MD5|MD5]] code by Petr Jelinek.

==Constants==
; TOKEN_HASH = &quot;#&quot; :  URL delimiter 

; TOKEN_PATH = &quot;/&quot; :  URL delimiter 

; TOKEN_PORT = &lt;nowiki&gt;&quot;:&quot;&lt;/nowiki&gt; :  URL delimiter 

; TOKEN_PROTOCOL = &lt;nowiki&gt;&quot;://&quot;&lt;/nowiki&gt; :  URL delimiter; to seperate protocol from the rest 

; TOKEN_QUERY = &quot;?&quot; :  URL delimiter 

; TOKEN_USER = &quot;@&quot; :  URL delimiter 

; TOKEN_USERPASS = &lt;nowiki&gt;&quot;:&quot;&lt;/nowiki&gt; :  URL delimiter; to seperate the user and pass from the url 

; URL_ESCAPE = &quot;%&quot; :  URL escape token 

==Properties==
; string DayNamesLong[7] :  names of the days, 0 = sunday 

; string DayNamesShort[7] :  names of the days, 0 = sunday 

; int LOGDATA : 
; int LOGERR : 
; int LOGINFO : 
; int LOGWARN : 
; string MonthNames[13] :  month names to use for date string generation 

; int MonthOffsetLeap[13] :  days offsets for each month

; int MonthOffset[13] :  days offsets for each month

==Structures==

===DateTime===

; int day : 
; int hour : 
; int minute : 
; int month : 
; int second : 
; int weekday : 
; int year : 

===MD5_CTX===

MD5 context 

; array&lt;byte&gt; buffer :  input buffer 

; array&lt;int&gt; count :  number of bits, modulo 2^64 (lsb first) 

; array&lt;int&gt; state :  state (ABCD) 

===xURL===

a better URL structure that contains all elements 

; string hash :  the part after the #, without the leading # 

; string hostname :  the hostname 

; string location :  the location field, all from the hostname up to the query or hash string, includes leading / 

; string password :  possible password that was in the url 

; int port :  the port number specified in the URL 

; string protocol : protocol used, like &lt;nowiki&gt;http://, https://, ftp://. But without the '://'&lt;/nowiki&gt; part. (ignore the space between the two slashes, it's required because of a bug in UE2) 

; string query :  the part after the ?, without the leading ? 

; string username :  username that was provided in the URL 

==Functions==
; int AdvSplit(string input, string delim, out array&lt;string&gt; elm, optional string quoteChar ): Split a string with quotes, quotes may appear anywhere in the string, escape the quote char with a \ to use a literal.&lt;br /&gt;Qoutes are removed from the result, and escaped quotes are used as normal quotes.

; array&lt;string&gt; Base64Decode(array&lt;string&gt; indata ): Decode a base64 encoded string

; array&lt;string&gt; Base64Encode(array&lt;string&gt; indata, out array&lt;string&gt; B64Lookup ): base64 encode an input array

;  Base64EncodeLookupTable(out array&lt;string&gt; LookupTable ): Generate the base 64 encode lookup table

; string basename(string filename ):  get the base filename 

; int daysInYear(int year ):  returns the number of days in a year 

; string DecToHex(int dec, int size ):  convert a decimal to hexadecimal notation 

; string dirname(string filename ):  get the dirname of a filename, with traling slash 

; int getPortByProtocol(string protocol ):  return the default port based on the protocol 

; int HexToDec(string hexcode ):  convert a hexadecimal number to the integer counterpart 

; string HTTPResponseCode(int code ):  return the description of a HTTP response code

; bool isLeapYear(int year ):  returns if year is a leap year 

; int leapsThruEndOf(int y ): 

;  Logf(name Comp, coerce string message, optional int level, optional coerce string Param1, optional coerce string Param2 ):  Write a log entry 

;  MD5Decode(out array&lt;int&gt; output, array&lt;byte&gt; input, int len ): 
;  MD5Encode(out array&lt;byte&gt; output, array&lt;int&gt; input, int len ): 
;  MD5Final(out array&lt;byte&gt; digest, out MD5_CTX context ):  finalize the MD5 context 

;  MD5Init(out MD5_CTX context ):  initialize the MD5 context 

;  MD5Move(string src, int srcindex, out array&lt;byte&gt; buffer, int bufindex, int len ): 
; string MD5String(string str ):  return the MD5 of the input string 

; string MD5StringArray(array&lt;string&gt; stra, optional string Concat ): Return the MD5 of the input string array. Concat is added after each line.

;  MD5Transform(out array&lt;int&gt; Buf, array&lt;byte&gt; block ): 
;  MD5Update(out MD5_CTX Context, string Data, int inputLen ):  update MD5 context 

; bool parseUrl(string inURL, out xURL outURL ):  parses the inURL to an xURL structure, return true when succesful 

; string RawUrlDecode(string instring, optional bool bIgnorePlus ): This will decode URL encoded elements. If bIgnorePlus is set to true '+' will not be changed to a space

; string RawUrlEncode(string instring ): Encode special characters, you should not use this function, it's slow and not secure, so try to avoid it. &lt;br /&gt;This is replace the following characters: &quot;;&quot;, &quot;/&quot;, &quot;?&quot;, &quot;:&quot;, &quot;@&quot;, &quot;&amp;&quot;, &quot;=&quot;, &quot;+&quot;, &quot;,&quot;, &quot;$&quot; and &quot; &quot;

;  ReplaceChar(out string instring, string from, string to ): replace part of a string

; int ROTATE_LEFT(int x, int n ): 
; int stringToTimestamp(string datestring, optional int TZoffset ): Parse a string to a timestamp

The date string is formatted as: Wdy, DD-Mon-YYYY HH:MM:SS GMT&lt;br /&gt;TZoffset is the local offset to GMT

; int timestamp(int year, int mon, int day, int hour, int min, int sec ): Create a UNIX timestamp. &lt;br /&gt;Warning: Assumes info is passed in GMT. So make sure you correct the timezone if you are going to send a timestamp generated with this function to an other server.

; DateTime timestampToDatetime(int timestamp ):  converts a timestamp to a DateTime record 

; string timestampToString(int timestamp, optional string Timezone, optional string format ): convert a timestamp into a string. &lt;br /&gt;Format can be one of the following strings: &lt;br /&gt;&quot;822&quot;, &quot;1123&quot; : RFC 822, updated by RFC 1123 (default), timezone is the TZ CODE &lt;br /&gt;&quot;850&quot;, &quot;1036&quot; : RFC 850, obsoleted by RFC 1036, timezone is the TZ CODE  &lt;br /&gt;&quot;2822&quot; : RFC 2822, timezone is a +0000 like string &lt;br /&gt;&quot;asctime&quot;: ANSI C's asctime() format, timezone is an integer that will increment the hour

; string Trim(coerce string S ):  Trim leading and trailing spaces 

; float TZtoOffset(string TZ ): Converts a timezone code to an offset.

; string xURLtoLocation(xURL inURL, optional bool bIncludePassword ):  convert a xURL to a location string, just the location+query+hash 

; string xURLtoString(xURL inURL, optional bool bIncludePassword ):  converts a xURL to a string. bIncludePassword defaults to false 

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4228</id>
      <timestamp>2006-01-09T18:55:07Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:HttpUtil|HttpUtil]]}}

Miscelaneous static functions. Part of [[Legacy:LibHTTP|LibHTTP]].

Contains various algorithms, under which [[Legacy:Base64|Base64]] encoding and [[Legacy:MD5|MD5]] hash generation. [[Legacy:MD5|MD5]] code by Petr Jelinek.

==Constants==
; TOKEN_HASH = &quot;#&quot; :  URL delimiter 

; TOKEN_PATH = &quot;/&quot; :  URL delimiter 

; TOKEN_PORT = &lt;nowiki&gt;&quot;:&quot;&lt;/nowiki&gt; :  URL delimiter 

; TOKEN_PROTOCOL = &lt;nowiki&gt;&quot;://&quot;&lt;/nowiki&gt; :  URL delimiter; to seperate protocol from the rest 

; TOKEN_QUERY = &quot;?&quot; :  URL delimiter 

; TOKEN_USER = &quot;@&quot; :  URL delimiter 

; TOKEN_USERPASS = &lt;nowiki&gt;&quot;:&quot;&lt;/nowiki&gt; :  URL delimiter; to seperate the user and pass from the url 

; URL_ESCAPE = &quot;%&quot; :  URL escape token 

==Properties==
; string DayNamesLong[7] :  names of the days, 0 = sunday 

; string DayNamesShort[7] :  names of the days, 0 = sunday 

; int LOGDATA : 
; int LOGERR : 
; int LOGINFO : 
; int LOGWARN : 
; string MonthNames[13] :  month names to use for date string generation 

; int MonthOffsetLeap[13] :  days offsets for each month

; int MonthOffset[13] :  days offsets for each month

==Structures==

===DateTime===

; int day : 
; int hour : 
; int minute : 
; int month : 
; int second : 
; int weekday : 
; int year : 

===MD5_CTX===

MD5 context 

; array&lt;byte&gt; buffer :  input buffer 

; array&lt;int&gt; count :  number of bits, modulo 2^64 (lsb first) 

; array&lt;int&gt; state :  state (ABCD) 

===xURL===

a better URL structure that contains all elements 

; string hash :  the part after the #, without the leading # 

; string hostname :  the hostname 

; string location :  the location field, all from the hostname up to the query or hash string, includes leading / 

; string password :  possible password that was in the url 

; int port :  the port number specified in the URL 

; string protocol : protocol used, like &lt;nowiki&gt;http://, https://, ftp://. But without the '://'&lt;/nowiki&gt; part. (ignore the space between the two slashes, it's required because of a bug in UE2) 

; string query :  the part after the ?, without the leading ? 

; string username :  username that was provided in the URL 

==Functions==
; int AdvSplit(string input, string delim, out array&lt;string&gt; elm, optional string quoteChar ): Split a string with quotes, quotes may appear anywhere in the string, escape the quote char with a \ to use a literal.&lt;br /&gt;Qoutes are removed from the result, and escaped quotes are used as normal quotes.

; array&lt;string&gt; Base64Decode(array&lt;string&gt; indata ): Decode a base64 encoded string

; array&lt;string&gt; Base64Encode(array&lt;string&gt; indata, out array&lt;string&gt; B64Lookup ): base64 encode an input array

;  Base64EncodeLookupTable(out array&lt;string&gt; LookupTable ): Generate the base 64 encode lookup table

; string basename(string filename ):  get the base filename 

; int daysInYear(int year ):  returns the number of days in a year 

; string DecToHex(int dec, int size ):  convert a decimal to hexadecimal notation 

; string dirname(string filename ):  get the dirname of a filename, with traling slash 

; int getPortByProtocol(string protocol ):  return the default port based on the protocol 

; int HexToDec(string hexcode ):  convert a hexadecimal number to the integer counterpart 

; string HTTPResponseCode(int code ):  return the description of a HTTP response code

; bool isLeapYear(int year ):  returns if year is a leap year 

; int leapsThruEndOf(int y ): 

;  Logf(name Comp, coerce string message, optional int level, optional coerce string Param1, optional coerce string Param2 ):  Write a log entry 

;  MD5Decode(out array&lt;int&gt; output, array&lt;byte&gt; input, int len ): 
;  MD5Encode(out array&lt;byte&gt; output, array&lt;int&gt; input, int len ): 
;  MD5Final(out array&lt;byte&gt; digest, out MD5_CTX context ):  finalize the MD5 context 

;  MD5Init(out MD5_CTX context ):  initialize the MD5 context 

;  MD5Move(string src, int srcindex, out array&lt;byte&gt; buffer, int bufindex, int len ): 
; string MD5String(string str ):  return the MD5 of the input string 

; string MD5StringArray(array&lt;string&gt; stra, optional string Concat ): Return the MD5 of the input string array. Concat is added after each line.

;  MD5Transform(out array&lt;int&gt; Buf, array&lt;byte&gt; block ): 
;  MD5Update(out MD5_CTX Context, string Data, int inputLen ):  update MD5 context 

; bool parseUrl(string inURL, out xURL outURL ):  parses the inURL to an xURL structure, return true when succesful 

; string RawUrlDecode(string instring, optional bool bIgnorePlus ): This will decode URL encoded elements. If bIgnorePlus is set to true '+' will not be changed to a space

; string RawUrlEncode(string instring ): Encode special characters, you should not use this function, it's slow and not secure, so try to avoid it. &lt;br /&gt;This is replace the following characters: &quot;;&quot;, &quot;/&quot;, &quot;?&quot;, &quot;:&quot;, &quot;@&quot;, &quot;&amp;&quot;, &quot;=&quot;, &quot;+&quot;, &quot;,&quot;, &quot;$&quot; and &quot; &quot;

;  ReplaceChar(out string instring, string from, string to ): replace part of a string

; int ROTATE_LEFT(int x, int n ): 
; int stringToTimestamp(string datestring, optional int TZoffset ): Parse a string to a timestamp

The date string is formatted as: Wdy, DD-Mon-YYYY HH:MM:SS GMT&lt;br /&gt;TZoffset is the local offset to GMT

; int timestamp(int year, int mon, int day, int hour, int min, int sec ): Create a UNIX timestamp. &lt;br /&gt;Warning: Assumes info is passed in GMT. So make sure you correct the timezone if you are going to send a timestamp generated with this function to an other server.

; DateTime timestampToDatetime(int timestamp ):  converts a timestamp to a DateTime record 

; string timestampToString(int timestamp, optional string Timezone, optional string format ): convert a timestamp into a string. &lt;br /&gt;Format can be one of the following strings: &lt;br /&gt;&quot;822&quot;, &quot;1123&quot; : RFC 822, updated by RFC 1123 (default), timezone is the TZ CODE &lt;br /&gt;&quot;850&quot;, &quot;1036&quot; : RFC 850, obsoleted by RFC 1036, timezone is the TZ CODE  &lt;br /&gt;&quot;2822&quot; : RFC 2822, timezone is a +0000 like string &lt;br /&gt;&quot;asctime&quot;: ANSI C's asctime() format, timezone is an integer that will increment the hour

; string Trim(coerce string S ):  Trim leading and trailing spaces 

; float TZtoOffset(string TZ ): Converts a timezone code to an offset.

; string xURLtoLocation(xURL inURL, optional bool bIncludePassword ):  convert a xURL to a location string, just the location+query+hash 

; string xURLtoString(xURL inURL, optional bool bIncludePassword ):  converts a xURL to a string. bIncludePassword defaults to false 

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LibHTTP/NewsFeed</title>
    <id>1713</id>
    <revision>
      <id>4226</id>
      <timestamp>2003-07-31T08:36:05Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class mutNewsFeed extends mutator;

var HttpSock hs;
var NewsFeed nf;

event prebeginplay()
{
	hs = spawn(class'LibHTTP.HttpSock');
	hs.OnComplete = DownloadCompleted;
	hs.OnError = DownloadError;
	nf = new class'LibHTTP.NewsFeed';
	Log(&quot;------ NewsFeed loaded --------&quot;);
}

function Mutate(string MutateString, PlayerController Sender)
{
	local array&lt;string&gt; mut;
	Super.Mutate(MutateString, Sender);
	Split(MutateString, &quot; &quot;, mut);
	if (mut[0] ~= &quot;rdf&quot;)
	{
		if (mut[1] ~= &quot;fetch&quot;)
		{
			if (Caps(nf.Source) != Caps(mut[2]))
			{
				nf.Source = mut[2];
				hs.HttpRequest(nf.Source);
				Level.Game.BroadcastHandler.BroadcastText(none, Sender, &quot;RDF&gt; Retreiving news ...&quot;);
			}
			else Log(&quot;RDF&gt; News from&quot;@nf.ChannelTitle@&quot;available&quot;);
		}
		else {
			if (int(mut[1]) &lt; nf.Entries.length)
				Level.Game.BroadcastHandler.BroadcastText(none, Sender, &quot;NEWS&gt;&quot;@nf.ChannelTitle@&quot; - &quot;@nf.Entries[int(mut[1])].Title);
				else Level.Game.BroadcastHandler.BroadcastText(none, Sender, &quot;RDF&gt; Only&quot;@nf.Entries.length@&quot;news items available&quot;);
		}
	}
}

function DownloadCompleted()
{
	if (hs.LastStatus == 200)
	{
		nf.LastUpdate = hs.now();
		nf.ParseRDFData(hs.ReturnData);
		if (nf.Entries.length &gt; 0) Level.Game.BroadcastHandler.Broadcast(self, &quot;RDF&gt; News from&quot;@nf.ChannelTitle@&quot;available&quot;);
	}
}

function OnError(string ErrorMessage, optional string Param1, optional string Param2)
{
	Level.Game.BroadcastHandler.Broadcast(self, &quot;RDF&gt; Download error:&quot;@ErrorMessage@Param1@Param2);
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LiftCenter</title>
    <id>1648</id>
    <revision>
      <id>4080</id>
      <timestamp>2005-12-18T01:13:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; LiftCenter}}

This actor allows AI players (bots) to know where the center of a lift (elevator) is.  In conjunction with [[Legacy:LiftExit|LiftExit]], this allows bots to know how to ride a particular lift.

See [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] for the UT version of this class.

==Properties==

===LiftCenter Group===
; name LiftTag : Match this property with the LiftTag of the corresponding [[Legacy:LiftExit|LiftExit]]s.
; name LiftTrigger : The [[Legacy:Tag|Tag]] of a [[Legacy:Trigger|Trigger]].

===Hidden===
; [[Legacy:Mover|Mover]] MyLift : The Mover that this LiftCenter is associated with.  This is what the bot will wait for at a LiftExit and ride to another LiftExit.
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : Set to the first [[Legacy:Trigger|Trigger]] with a [[Legacy:Tag|Tag]] matching LiftTrigger.
; float MaxDist2D : 
; vector LiftOffset : Starting vector between MyLift location and LiftCenter location.

==Functions==
; PostBeginPlay() : Finds RecommendedTrigger.
; Actor SpecialHandling( [[Legacy:Pawn|Pawn]] Other ) : SpecialHandling is called by the navigation code when the next path has been found.  It gives that path an opportunity to modify the result based on any special considerations.  Here, we check if the mover needs to be triggered
; bool SuggestMovePreparation( [[Legacy:Pawn|Pawn]] Other ) : Check if mover is positioned to allow Pawn to get on.
; bool ProceedWithMove( [[Legacy:Pawn|Pawn]] Other ) : See if mover is at appropriate location/keyframe.  Check distance directly, make sure it's close.  If mover is not operating, get bot to start it.

==Related Topics==
* [[Legacy:LiftExit|LiftExit]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Trigger Systems|Trigger Systems]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4081</id>
      <timestamp>2003-05-27T10:33:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; LiftCenter}}

See [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] for the UT version of this class.

==Properties==

===LiftCenter Group===
; name LiftTag : Match this property with the LiftTag of the corresponding [[Legacy:LiftExit|LiftExit]]s.
; name LiftTrigger : The [[Legacy:Tag|Tag]] of a [[Legacy:Trigger|Trigger]].

===Hidden===
; [[Legacy:Mover|Mover]] MyLift : 
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : Set to the first [[Legacy:Trigger|Trigger]] with a [[Legacy:Tag|Tag]] matching LiftTrigger.
; float MaxDist2D : 
; vector LiftOffset : Starting vector between MyLift location and LiftCenter location.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LiftCenter (UT)</title>
    <id>1700</id>
    <revision>
      <id>4199</id>
      <timestamp>2006-09-12T21:25:17Z</timestamp>
      <contributor>
        <ip>192.251.69.13</ip>
      </contributor>
      <comment>UT only. In UT200x, JumpSpot is a subclass of NavigationPoint-&gt;JumpDest</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; LiftCenter}}

A LiftCenter actor tells AI agents (bots, etc) where to go while riding a lift.

For the UT200x version of this actor, see [[Legacy:LiftCenter|LiftCenter]].

==Properties==

===LiftCenter Group===
; name LiftTag : Ties this to other lift pathnodes.
; name LiftTrigger : Indicates to AI which Trigger actor will activate this Lift.
; vector MaxZDiffAdd : Added threshold for Z difference between pawn and lift, for lifts which are at the end of a ramp or stairs. 
; vector MaxDist2D : 

===Hidden===
; float LastTriggerTime : 
; vector LiftOffset :
; [[Legacy:Trigger|Trigger]] RecommendedTrigger  :

==Known Subclasses==

These are used in a similar fashion with [[Legacy:LiftExit (UT)|LiftExit (UT)]] to create different types of path.
* [[Legacy:JumpSpot (UT)|JumpSpot (UT)]]
* [[Legacy:PainPath|PainPath]]
* [[Legacy:TranslocDest|TranslocDest]]

==Related Topics==
* [[Legacy:LiftExit (UT)|LiftExit (UT)]] - The companion actor to this.
* [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use
* [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] for a summary of pathnode classes
* [[Legacy:Bot Pathing|Bot Pathing]] for further path network topics

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4200</id>
      <timestamp>2006-09-12T19:11:31Z</timestamp>
      <contributor>
        <ip>Lnd10eusosrv52.lnd.ops.eu.uu.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; LiftCenter}}

A LiftCenter actor tells the bots where to go to before riding a lift or after riding a lift. See also:
* [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use
* [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] for a summary of pathnode classes
* [[Legacy:Bot Pathing|Bot Pathing]] for further pathnoding topics

==Properties==

===LiftCenter Group===
; name LiftTag : Ties this to other lift pathnodes.
; name LiftTrigger : 
; vector MaxZDiffAdd : Added threshold for Z difference between pawn and lift, for lifts which are at the end of a ramp or stairs.
; vector MaxDist2D :

===Hidden===
; float LastTriggerTime : 
; vector LiftOffset :
; [[Legacy:Trigger|Trigger]] RecommendedTrigger  :

==Known Subclasses ==

These are used in a similar fashion with [[Legacy:LiftExit (UT)|LiftExit (UT)]] to create different types of path.
* [[Legacy:JumpSpot|JumpSpot]]
* [[Legacy:PainPath|PainPath]]
* [[Legacy:TranslocDest|TranslocDest]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4201</id>
      <timestamp>2006-09-12T21:23:24Z</timestamp>
      <contributor>
        <ip>192.251.69.13</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; LiftCenter}}

A LiftCenter actor tells AI agents (bots, etc) where to go while riding a lift.

==Properties==

===LiftCenter Group===
; name LiftTag : Ties this to other lift pathnodes.
; name LiftTrigger : Indicates to AI which Trigger actor will activate this Lift.
; vector MaxZDiffAdd : Added threshold for Z difference between pawn and lift, for lifts which are at the end of a ramp or stairs. ''(UT only?)''
; vector MaxDist2D : ''(UT only?)''

===Hidden===
; float LastTriggerTime : 
; vector LiftOffset :
; [[Legacy:Trigger|Trigger]] RecommendedTrigger  :

==Known Subclasses (UT)==

These are used in a similar fashion with [[Legacy:LiftExit (UT)|LiftExit (UT)]] to create different types of path.
* [[Legacy:JumpSpot (UT)|JumpSpot (UT)]] ''(UT only. In UT200x, JumpSpot is a subclass of NavigationPoint-&gt;JumpDest)''
* [[Legacy:PainPath|PainPath]]
* [[Legacy:TranslocDest|TranslocDest]]

==Related Topics==
* [[Legacy:LiftExit|LiftExit]]
* [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use
* [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] for a summary of pathnode classes
* [[Legacy:Bot Pathing|Bot Pathing]] for further path network topics

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LiftExit</title>
    <id>1649</id>
    <revision>
      <id>4082</id>
      <timestamp>2005-12-28T19:30:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Related Topics</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; LiftExit (Package: Engine)}}

A LiftExit actor tells the bots where to go to before riding a lift or after riding a lift. It works together with a [[Legacy:LiftCenter|LiftCenter]] actor. See [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use.

See [[Legacy:LiftExit (UT)|LiftExit (UT)]] for the UT version of this class.

==Properties==

===Main===
; name LiftTag : Set this to match a [[Legacy:LiftCenter|LiftCenter]] actor's LiftTag to associate.
; byte SuggestedKeyFrame : This should be set to match the [[Legacy:Mover|Mover]]'s corresponding keyframe. Failing to set this value can cause issues with bot navigation.

===Main (UT2004 Only)===
; bool bLiftJumpExit : Set this up in the same way as normal LiftExits by placing the LiftExit where you want a bot to jump to, then set bLiftJumpExit under the LiftJump heading to True. Finish by setting the normal properties of the LiftExit. A good example map is DM-DE-Grendelkeep.
; bool bNoDoubleJump :

===Hidden===
; [[Legacy:Mover|Mover]] MyLift : 
; byte KeyFrame : 

==Related Topics==
* [[Legacy:LiftCenter|LiftCenter]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing Lifts|Pathing Lifts]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4083</id>
      <timestamp>2004-05-19T07:53:37Z</timestamp>
      <contributor>
        <ip>Cache2-brhm.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; LiftExit (Package: Engine)}}

A LiftExit actor tells the bots where to go to before riding a lift or after riding a lift. It works together with a [[Legacy:LiftCenter|LiftCenter]] actor. See [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use.

See [[Legacy:LiftExit (UT)|LiftExit (UT)]] for the UT version of this class.

==Properties ==

===LiftExit Group===
; name LiftTag : Set this to match a [[Legacy:LiftCenter|LiftCenter]] actor's LiftTag to associate.
; byte SuggestedKeyFrame : This should be set to match the [[Legacy:Mover|Mover]]'s corresponding keyframe. Failing to set this value can cause issues with bot navigation.

===Hidden===
; [[Legacy:Mover|Mover]] MyLift : 
; byte KeyFrame : 

===LiftJump (UT2004)===
; bool bLiftJumpExit : Set this up in the same way as normal LiftExits by placing the LiftExit where you want a bot to jump to, then set bLiftJumpExit under the LiftJump heading to True. Finish by setting the normal properties of the LiftExit. A good example map is DM-DE-Grendelkeep.
; bool bNoDoubleJump :

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LiftExit (UT)</title>
    <id>1711</id>
    <revision>
      <id>4222</id>
      <timestamp>2004-03-30T05:32:54Z</timestamp>
      <contributor>
        <ip>Ironblayde</ip>
      </contributor>
      <comment>Added LiftTrigger description</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; LiftExit (Package: Engine)}}

A LiftExit actor tells the bots where to go to before riding a lift or after riding a lift. It works together with a [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] actor. See [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use.

See [[Legacy:LiftExit|LiftExit]] for the UT2003 version of this class.

==Properties ==

===LiftExit Group===
; LiftTag : Set this to match a [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] actor's LiftTag to associate
; LiftTrigger : For lifts using the TriggerOpenTimed state, set this to match the [[Legacy:Tag|Tag]] of the [[Legacy:Trigger|Trigger]] the bot needs to trip in order to activate the lift.

===Hidden===
; [[Legacy:Mover (UT)|Mover (UT)]] MyLift : 
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : 
; float LastTriggerTime : 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4223</id>
      <timestamp>2003-05-27T10:29:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; LiftExit (Package: Engine)}}

A LiftExit actor tells the bots where to go to before riding a lift or after riding a lift. It works together with a [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] actor. See [[Legacy:Pathing Lifts|Pathing Lifts]] for full details on how to use.

See [[Legacy:LiftExit|LiftExit]] for the UT2003 version of this class.

==Properties ==

===LiftExit Group===
; LiftTag : Set this to match a [[Legacy:LiftCenter (UT)|LiftCenter (UT)]] actor's LiftTag to associate
; LiftTrigger : 

===Hidden===
; [[Legacy:Mover (UT)|Mover (UT)]] MyLift : 
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : 
; float LastTriggerTime : 

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lifts Vs Jumppads</title>
    <id>1688</id>
    <revision>
      <id>4172</id>
      <timestamp>2003-06-18T12:04:35Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Certainly some people add lifts and jumppads to their levels for aesthetic reasons and for [[Legacy:Z-Axis|Z-Axis]] gameplay. Their differences are great, however, as far as level balancing, continuity and gameplay. 

==Jumppads==

Jumppads are almost always (generalizations are bad) faster than lifts. A player can not easily elude a pursuer since a jumppad simply modifies the players location and has little effect on breaking up continuity of pursuit. There's a slight break in the action as each player modifies their aim.

If not pursuing directly behind the player, hitting a player using a jumppad can be extremely difficult if the player isn't familiar with the level.

Jumppads have greater mobility and flexability that lifts. If you see a person below you when jumped from a jumppad, you can kill him, but when you are on the lift, your line of fire may be blocked by the lift that you are standing on, depending on it's size and shape.

==Lifts ==

Lifts are generally slower. Even a fast moving lift usually doesn't offer the same throughput as a jumppad. Lifts can, however, be better for escaping from an enemy who is in pursuit. The likliness of successful evasion tends to be a proportional to the lift speed and it's exposure. For example, an elevator shaft style lift protects the player from his pursuer whereas a lift in an open area makes the lift a dangerous commitment.

Special care should be taken with lifts on CTF levels. If a flagcarrier takes a lift and the pursuer can't get on and exit the lift in a reasonable amount of time, the flagcarrier's whereabouts may be unknown if, at the lift exit, there are multiple exits. The defender doesn't know whether or not the flagcarrier went right or left in such a case. In addition, depending on the speed and length of the lift, the flag carrier may end up with a tremendous lead on any persons in pursuit. This can apply to other gametypes as well, but primarily to CTF and Bombing Run.

Of greater danger for exposed lifts is that an attacker knows his target's movement is constrained to the lift and at what speed the lift is moving. This increases the likeliness of the attacker hitting his target, particularly with non-tracefire weapons. This is a good tactic in DM-Serpentine when you defeat Malcolm. When you see the lift go up, and you are in the central area, you can easily lob a flak grenade at him for an easy frag.

A contained lift, however, can offer temporary protection to players within it. 

Lastly, lift jumps (hitting jump at the peak of a lift's vertical movement) can allow a player to launch themselves high into the air. This is due to a quirk in the physics code and will not work for [[Legacy:Karma|Karma]]-based objects. While the lift goes up the player has great velocity. However, when walking, a player is &quot;stuck&quot; to the floor. This is easily observed in low gravity as your footsteps are not slowed. When the lift stops, the player who is &quot;glued&quot; to it stops suddenly with the lift, instead of being launched off of it as would happen in real life. By jumping at the last second or, even worse, by hammer jumping at the last second, you separate yourself from the lift and are not stopped by it when it stops. Thus you continue with the same upward velocity until gravity pulls you down. On a fast-moving lift, you can really go flying, which can catapult a player into an area they would not normally be able to reach on foot, or allow a player to land directly behind their opponent. It can also be used to make a speedy escape.

==Curving Lifts==

Sometimes you might want a lift that follows a curved pattern. This cannot be done using regular movers. However, an ambitious person (other than me :P) could fairly easily write a script for a new type of mover that would follow interpolation points. This may or may not work for UT, but for UT2003 it shouldn't be too difficult. Eventually I'll probrably write this class myself, but for the time being I'll just post the idea here and hope someone else writes it.

==Addendum==

What hasn't been explored much is the idea of a contained lift where, after a player enters, he takes a slow ride. Perhaps along his route, he'll collect some small health packs. Meanwhile, the attacker can run, dodge forward, or translocate to the lift destination before the player arrives. It might make for interesting choices during the heat of battle, especially in CTF or BR.

The balancing comes in at the speed at which the pursuer arrives at the lifts destination and what obstacles (eg, geometry?, painzones?, no ammo pickups along the way?) he faced.

==Related Topics==
* [[Legacy:Map Flow|Map Flow]]</text>
    </revision>
    <revision>
      <id>4173</id>
      <timestamp>2003-06-17T16:51:10Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Certainly some people add lifts and jumppads to their levels for aesthetic reasons and for [[Legacy:Z-Axis|Z-Axis]] gameplay. Their differences are great, however, as far as level balancing, continuity and gameplay. 

==Jumppads==

Jumppads are almost always (generalizations are bad) faster than lifts. A player can not easily elude a pursuer since a jumppad simply modifies the players location and has little effect on breaking up continuity of pursuit. There's a slight break in the action as each player modifies their aim.

If not pursuing directly behind the player, hitting a player using a jumppad can be extremely difficult if the player isn't familiar with the level.

Jumppads have greater mobility and flexability that lifts. If you see a person below you when jumped from a jumppad, you can kill him, but when you are on the lift, you only have 180 3D degrees that you can shoot.

==Lifts ==

Lifts are most likely slower. Even a fast moving lift doesn't offer the same throughput as a jumppad. Lifts can help a player elude an enemy. The likliness of successful evasion tends to be a proportional to the lift speed and it's exposure. For example, an elevator shaft style lift protects the player from his pursuer whereas a lift in an open area makes the lift a dangerous commitment.

Special care should be taken with lifts on CTF levels. If a flagcarrier takes a lift and the pursuer can't get on and exit the lift in a reasonable amount of time, the flagcarrier's whereabouts may be unknown if, at the lift exit, there are multiple exits. The defender doesn't know whether or not the flagcarrier went right or left in such a case.

Of greater danger for exposed lifts is that an attacker knows his target's movement is constrained to the lift and at what speed the lift is moving. This increases the likeliness of the attacker hitting his target, particularly with non-instagib weapons. This is a good tactic in that level when you defeat Malcolm. When you see the lift go up, and you are in the middle thing, you can easily lob a flak grenade at him for an easy frag.

A contained lift, though, offers temporary protection to players in DM. 

'''Wormbo:''' Don't forget lift jumps!

Lastly, lift jumps (hitting jump at the peak of a lift's vertical movement) can give a flagcarrier or player an additional option for escape, as seen in the flag room of UT2k3's CTF-Face3. It can also startle an persuer (spelling? (the wiki needs a spell check feature)) by jumping off a lift and landing in back of them for a kill, example DM-Antalus.

'''ZxAnPhOrIaN:''' I wish that movers can have curves! (can you make a mover go through interpolation points?)

==Addendum==

What hasn't been explored much is the idea of a contained lift where, after a player enters, he takes a slow ride. Perhaps along his route, he'll collect some small health packs. Meanwhile, the attacker can run, dodge forward, or translocate to the lift destination before the player arrives. It might make for interesting choices during the heat of battle, especially in CTF or BR.

The balancing comes in at the speed at which the pursuer arrives at the lifts destination and what obstacles (eg, geometry?, painzones?, no ammo pickups along the way?) he faced.

==Related Topics==
* [[Legacy:Map Flow|Map Flow]]</text>
    </revision>
    <revision>
      <id>4174</id>
      <timestamp>2003-06-18T10:20:07Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Interpolation Point Lifts and assorted refactoring and additions.</comment>
      <text xml:space="preserve">Certainly some people add lifts and jumppads to their levels for aesthetic reasons and for [[Legacy:Z-Axis|Z-Axis]] gameplay. Their differences are great, however, as far as level balancing, continuity and gameplay. 

==Jumppads==

Jumppads are almost always (generalizations are bad) faster than lifts. A player can not easily elude a pursuer since a jumppad simply modifies the players location and has little effect on breaking up continuity of pursuit. There's a slight break in the action as each player modifies their aim.

If not pursuing directly behind the player, hitting a player using a jumppad can be extremely difficult if the player isn't familiar with the level.

Jumppads have greater mobility and flexability that lifts. If you see a person below you when jumped from a jumppad, you can kill him, but when you are on the lift, your line of fire may be blocked by the lift that you are standing on, depending on it's size and shape.

==Lifts ==

Lifts are generally slower. Even a fast moving lift usually doesn't offer the same throughput as a jumppad. Lifts can, however, be better for escaping from an enemy who is in pursuit. The likliness of successful evasion tends to be a proportional to the lift speed and it's exposure. For example, an elevator shaft style lift protects the player from his pursuer whereas a lift in an open area makes the lift a dangerous commitment.

Special care should be taken with lifts on CTF levels. If a flagcarrier takes a lift and the pursuer can't get on and exit the lift in a reasonable amount of time, the flagcarrier's whereabouts may be unknown if, at the lift exit, there are multiple exits. The defender doesn't know whether or not the flagcarrier went right or left in such a case. In addition, depending on the speed and length of the lift, the flag carrier may end up with a tremendous lead on any persons in pursuit. This can apply to other gametypes as well, but primarily to CTF and Bombing Run.

Of greater danger for exposed lifts is that an attacker knows his target's movement is constrained to the lift and at what speed the lift is moving. This increases the likeliness of the attacker hitting his target, particularly with non-tracefire weapons. This is a good tactic in that level when you defeat Malcolm. When you see the lift go up, and you are in the middle thing, you can easily lob a flak grenade at him for an easy frag.

A contained lift, however, can offer temporary protection to players within it. 

Lastly, lift jumps (hitting jump at the peak of a lift's vertical movement) can allow a player to launch themselves high into the air. This is due to a quirk in the physics code and will not work for [[Legacy:Karma|Karma]]-based objects. While the lift goes up the player has great velocity. However, when walking, a player is &quot;stuck&quot; to the floor. This is easily observed in low gravity as your footsteps are not slowed. When the lift stops, the player who is &quot;glued&quot; to it stops suddenly with the lift, instead of being launched off of it as would happen in real life. By jumping at the last second or, even worse, by hammer jumping at the last second, you separate yourself from the lift and are not stopped by it when it stops. Thus you continue with the same upward velocity until gravity pulls you down. On a fast-moving lift, you can really go flying, which can catapult a player into an area they would not normally be able to reach on foot, or allow a player to land directly behind their opponent. It can also be used to make a speedy escape.

==Curving Lifts==

Sometimes you might want a lift that follows a curved pattern. This cannot be done using regular movers. However, an ambitious person (other than me :P) could fairly easily write a script for a new type of mover that would follow interpolation points. This may or may not work for UT, but for UT2003 it shouldn't be too difficult. Eventually I'll probrably write this class myself, but for the time being I'll just post the idea here and hope someone else writes it.

==Addendum==

What hasn't been explored much is the idea of a contained lift where, after a player enters, he takes a slow ride. Perhaps along his route, he'll collect some small health packs. Meanwhile, the attacker can run, dodge forward, or translocate to the lift destination before the player arrives. It might make for interesting choices during the heat of battle, especially in CTF or BR.

The balancing comes in at the speed at which the pursuer arrives at the lifts destination and what obstacles (eg, geometry?, painzones?, no ammo pickups along the way?) he faced.

==Related Topics==
* [[Legacy:Map Flow|Map Flow]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Light</title>
    <id>1696</id>
    <revision>
      <id>4188</id>
      <timestamp>2006-04-07T08:02:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Light (Package: Engine)}}

This native actor emits light during a [[Legacy:Build|Build]] Lighting operation to create Lightmaps.  It is the parent class for all light objects, although any Actor has lighting attributes.  See also [[Legacy:Actor/Lighting|Actor/Lighting]].

==Properties==

===Corona===

There properties are available for editing.
; float CoronaRotation :  
; float CoronaRotationOffset :  
; float MaxCoronaSize :  
; float MinCoronaSize :  
; bool UseOwnFinalBlend :  

==Known Subclasses==
 Light
   +- [[Legacy:ONSHeadlightCorona|ONSHeadlightCorona]]
   |   +- [[Legacy:ONSBrakelightCorona|ONSBrakelightCorona]]
   +- [[Legacy:Spotlight|Spotlight]]
   +- [[Legacy:Sunlight|Sunlight]]
   +- [[Legacy:TriggerLight|TriggerLight]]
       +- [[Legacy:XDomAlert|xDomAlert]]

==Related Topics==
* [[Legacy:Corona|Corona]]
* [[Legacy:Colors|Colors]]
* [[Legacy:Lighting|Lighting]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4189</id>
      <timestamp>2005-12-29T03:18:44Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Light (Package: Engine)}}

This native actor emits light during a [[Legacy:Build|Build]] Lighting operation to create Lightmaps.  It is the parent class for all light objects, although any Actor has lighting attributes.  See also [[Legacy:Actor/Lighting|Actor/Lighting]].

==Properties==

===Corona===

There properties are available for editing.
; float CoronaRotation :  
; float CoronaRotationOffset :  
; float MaxCoronaSize :  
; float MinCoronaSize :  
; bool UseOwnFinalBlend :  

==Known Subclasses==
 Light
   +- [[Legacy:ONSHeadlightCorona|ONSHeadlightCorona]]
   |   +- [[Legacy:ONSBrakelightCorona|ONSBrakelightCorona]]
   +- [[Legacy:Spotlight|Spotlight]]
   +- [[Legacy:Sunlight|Sunlight]]
   +- [[Legacy:TriggerLight|TriggerLight]]
       +- [[Legacy:XDomAlert|xDomAlert]]

==Related Topics==
* [[Legacy:Corona|Corona]]
* [[Legacy:Colors|Colors]]
* [[Legacy:Lighting|Lighting]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4190</id>
      <timestamp>2006-04-06T21:06:27Z</timestamp>
      <contributor>
        <ip>C925082b.rjo.virtua.com.br</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Light (Package: Engine)}}

This native actor emits light during a [[Legacy:Build|Build]] Lighting operation to create Lightmaps.  It is the parent class for all light objects, although any Actor has lighting attributes.  See also [[Legacy:Actor/Lighting|Actor/Lighting]].

==Properties==

===Corona===

There properties are available for editing.
; float CoronaRotation :  
; float CoronaRotationOffset :  
; float MaxCoronaSize :  
; float MinCoronaSize :  
; bool UseOwnFinalBlend :  

==Known Subclasses==
 Light
   +- [[Legacy:ONSHeadlightCorona|ONSHeadlightCorona]]
   |   +- [[Legacy:ONSBrakelightCorona|ONSBrakelightCorona]]
   +- [[Legacy:Spotlight|Spotlight]]
   +- [[Legacy:Sunlight|Sunlight]]
   +- [[Legacy:TriggerLight|TriggerLight]]
       +- [[Legacy:XDomAlert|xDomAlert]]

==Related Topics==
* [[Legacy:Corona|Corona]]
* [[Legacy:Colors|Colors]]
* [[Legacy:Lighting|Lighting]]

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy Class Tree]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Light (UT)</title>
    <id>1683</id>
    <revision>
      <id>4161</id>
      <timestamp>2005-12-02T23:49:11Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; Light}}

This is the specification for the Light class. For a general overview of how to light a map, see [[Legacy:Lighting|Lighting]].

The Light class doesn't add any properties or script, it's in effect just a holding class with the properties required to emit light preset and an icon to display in the editor.

All actors have the light-casting properties, under the Lighting and LightColor sections (see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for a full list), and thus any actor can be made to cast a light in a map. What follows is a summary of other properties relevant to casting light.

;Advanced -&gt; bDirectional: Spotlights set this automatically, but if you make a normal light into a spotlight by setting LightType (check), you'll need to set this manually. An actor with this set to ''true'' displays an arrow when selected and allows you to set the actor's rotation in UnrealEd. It's only a variable for the editor.

;Display -&gt; DrawScale: Sets the size of the icon in the editor and of [[Legacy:Corona|corona]]s in the game. It's useful to set this to a larger number for lights whose icons you want to see when zoomed out in orthogonal view. Unfortunately, it makes coronas have teeny tiny icons in the editor, which is a pain.

;Display -&gt; Skin: The texture used for the corona and TexturePaletteOnce/Loop effect. 

===SubClasses===

Some of these classes are merely holders of default properties, eg [[Legacy:Spotlight|Spotlight]]. Other such as [[Legacy:TriggerLight|TriggerLight]] add functionality.

''I imagine a lot of these don't warrant a page to themselves''
* [[Legacy:ChargeLight|ChargeLight]]
* [[Legacy:DistanceLightning|DistanceLightning]]
* [[Legacy:FlashLightBeam|FlashLightBeam]]
* [[Legacy:OverHeatLight|OverHeatLight]]
* [[Legacy:QueenTeleportLight|QueenTeleportLight]] (Freddie Mercury has left the building, perhaps?)
* [[Legacy:SightLight|SightLight]]
* [[Legacy:Spotlight|Spotlight]]
* [[Legacy:TorchFlame|TorchFlame]]
* [[Legacy:TriggerLight|TriggerLight]] appears in both Engine and one in UnrealShare classes
* TriggerLightRad (No code, no changes to default properties.)
* [[Legacy:WeaponLight|WeaponLight]]

==Related Topics==
* [[Legacy:Lighting|Lighting]] &amp;ndash; The hub for all things light
* [[Legacy:Light|Light]] &amp;ndash; The UT200x version class

==Comments==

'''Sobiwan:''' The class is '''light''', not '''lighting'''.  This page is partially duplicated at [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], whose info should probably be merged here to make it consistent.

'''Tarquin:''' No, because those are properties of the Actor class. This page is a convenience to the mapper.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4162</id>
      <timestamp>2003-10-30T19:29:44Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <comment>light / lighting class?</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; Light}}

This is the specification for the Light class. For a general overview of how to light a map, see [[Legacy:Lighting|Lighting]].

The Light class doesn't add any properties or script, it's in effect just a holding class with the properties required to emit light preset and an icon to display in the editor.

All actors have the light-casting properties, under the Lighting and LightColor sections (see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for a full list), and thus any actor can be made to cast a light in a map. What follows is a summary of other properties relevant to casting light.

;Advanced -&gt; bDirectional: Spotlights set this automatically, but if you make a normal light into a spotlight by setting LightType (check), you'll need to set this manually. An actor with this set to ''true'' displays an arrow when selected and allows you to set the actor's rotation in UnrealEd. It's only a variable for the editor.

;Display -&gt; DrawScale: Sets the size of the icon in the editor and of [[Legacy:Corona|corona]]s in the game. It's useful to set this to a larger number for lights whose icons you want to see when zoomed out in orthogonal view. Unfortunately, it makes coronas have teeny tiny icons in the editor, which is a pain.

;Display -&gt; Skin: The texture used for the corona and TexturePaletteOnce/Loop effect. 

===SubClasses===

Some of these classes are merely holders of default properties, eg [[Legacy:Spotlight|Spotlight]]. Other such as [[Legacy:TriggerLight|TriggerLight]] add functionality.

''I imagine a lot of these don't warrant a page to themselves''
* [[Legacy:ChargeLight|ChargeLight]]
* [[Legacy:DistanceLightning|DistanceLightning]]
* [[Legacy:FlashLightBeam|FlashLightBeam]]
* [[Legacy:OverHeatLight|OverHeatLight]]
* [[Legacy:QueenTeleportLight|QueenTeleportLight]] (Freddie Mercury has left the building, perhaps?)
* [[Legacy:SightLight|SightLight]]
* [[Legacy:Spotlight|Spotlight]]
* [[Legacy:TorchFlame|TorchFlame]]
* [[Legacy:TriggerLight|TriggerLight]] appears in both Engine and one in UnrealShare classes
* TriggerLightRad 
* [[Legacy:WeaponLight|WeaponLight]]

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all things light

==Comments==

'''Sobiwan:''' The class is '''light''', not '''lighting'''.  This page is partially duplicated at [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], whose info should probably be merged here to make it consistent.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4163</id>
      <timestamp>2004-02-26T21:04:22Z</timestamp>
      <contributor>
        <ip>Ip68-110-238-32.dc.dc.cox.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; Light}}

This is the specification for the Light class. For a general overview of how to light a map, see [[Legacy:Lighting|Lighting]].

The Light class doesn't add any properties or script, it's in effect just a holding class with the properties required to emit light preset and an icon to display in the editor.

All actors have the light-casting properties, under the Lighting and LightColor sections (see [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] for a full list), and thus any actor can be made to cast a light in a map. What follows is a summary of other properties relevant to casting light.

;Advanced -&gt; bDirectional: Spotlights set this automatically, but if you make a normal light into a spotlight by setting LightType (check), you'll need to set this manually. An actor with this set to ''true'' displays an arrow when selected and allows you to set the actor's rotation in UnrealEd. It's only a variable for the editor.

;Display -&gt; DrawScale: Sets the size of the icon in the editor and of [[Legacy:Corona|corona]]s in the game. It's useful to set this to a larger number for lights whose icons you want to see when zoomed out in orthogonal view. Unfortunately, it makes coronas have teeny tiny icons in the editor, which is a pain.

;Display -&gt; Skin: The texture used for the corona and TexturePaletteOnce/Loop effect. 

===SubClasses===

Some of these classes are merely holders of default properties, eg [[Legacy:Spotlight|Spotlight]]. Other such as [[Legacy:TriggerLight|TriggerLight]] add functionality.

''I imagine a lot of these don't warrant a page to themselves''
* [[Legacy:ChargeLight|ChargeLight]]
* [[Legacy:DistanceLightning|DistanceLightning]]
* [[Legacy:FlashLightBeam|FlashLightBeam]]
* [[Legacy:OverHeatLight|OverHeatLight]]
* [[Legacy:QueenTeleportLight|QueenTeleportLight]] (Freddie Mercury has left the building, perhaps?)
* [[Legacy:SightLight|SightLight]]
* [[Legacy:Spotlight|Spotlight]]
* [[Legacy:TorchFlame|TorchFlame]]
* [[Legacy:TriggerLight|TriggerLight]] appears in both Engine and one in UnrealShare classes
* TriggerLightRad (No code, no changes to default properties.)
* [[Legacy:WeaponLight|WeaponLight]]

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all things light

==Comments==

'''Sobiwan:''' The class is '''light''', not '''lighting'''.  This page is partially duplicated at [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], whose info should probably be merged here to make it consistent.

'''Tarquin:''' No, because those are properties of the Actor class. This page is a convenience to the mapper.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Light Effects</title>
    <id>1725</id>
    <revision>
      <id>4249</id>
      <timestamp>2007-08-25T02:24:10Z</timestamp>
      <contributor>
        <ip>Eliot</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:''' page duplication with [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; sort of. How much has changed form UT to UT2003?

'''Foxpaw:''' Most, but not all, of these still work for dynamic lights. Static lights - basically none of them work right anymore, due to the fact that lightmaps are pregenerated and can't be animated through the use of lighteffects anymore.

'''Tarquin:''' Ok. So do we need one page for UT, one for Ut2003, or will one page do for both? How about I move the list &amp; images from [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to here?

'''Foxpaw:''' I think that's a good idea. One could also add the lighteffect &quot;QuadraticNonIncidence.&quot; I'm not sure what it does but it seems similar to NonIncidence.

'''UArchitect:''' made a few adjustments, hope nobody minds :P

'''T1:''' Of course nobody minds, that's the beauty of the wiki.

'''OlympusMons:''' I was wondering if these actually worked in ut2k3 or 2k4. Im sure Ive tried and they didnt work so maybe there should be two different pages if it doesnt apply to all versions of the engine. Ok so I added the rest of the light effects and types. Unfortunatly I have no clue what they do I just thought it would be handy to have them here.

'''Prograham:''' I think this page should be split into two.  One for UT2K3 and earlier, one for UT2K4, because none of these LightType Properties work anymore in 2K4.  It just makes sense to me to make a new page for something if the engine changes it.:tup:PS- I would make a new page right now but I'm new to editing the wiki so instead I'm just going to leave really long paragraphs for now j/k.

This is what is done now(I am cutting and pasting from http://forums.beyondunreal.com/archive/index.php/t-141250.html)-&gt; Dynamic lighting is disabled in the current Engine build. The only thing remotely dynamic you can do is use TriggerLights. I sure there's a way to constantly trigger them and get your blinking effect, but usually they turn on/off when a player touches their trigger. In Blitz's map BR-Warzone (http://www.unrealplayground.com/maps.php?mapid=3324) he has TriggerLights to make the flash of guns in the distance, but I'm not sure how he did it. I think he coded them since the map is full of scripted stuff he wrote.

'''T1:''' Try looking into using projectors, maybe. Hourences uses projectors for the lightning effect on ONS-Dinora IIRC.

==LightType Properties ==

&lt;nowiki&gt;***NOTE: LightTypes will only work when bStatic is False!***&lt;/nowiki&gt; 

; LT_None : No lighting. Why you should use this for lights is beyond me!
; LT_Steady : Normal light. Probably the one you'll use most often.
; LT_Pulse : Pulses the light on and off. Imagine playing with the light dimmer switch.
; LT_Blink : simlar to flicker, light is on but flickers off every so often a more subtle flicker, sometimes works sometimes doesnt..not sure whats up with that.
; LT_Flicker : Good for broken down factory-type areas. Flickers on/off, as if the light ws broken. does not work with Coronas.
; LT_Strobe : Flashes light on... off... on... off... Whee! Headaches! Not really suitable for gameplay...
; LT_BackdropLight : Possibly used in SkyBoxes, but I dunno. No effects observed.
; LT_SubtlePulse : I find this to be good with Green Lighting against Slime pits. Just barely noticeable, but it's there. Pickups are lit in this way.
; LT_TexturePaletteOnce : The light colour will cycle once through the texture palette selected for Skin.
; LT_TexturePaletteLoop : As TexturePaletteOnce but loops. The value of LightPeriod sets the speed. 
; LT_FadeOut :

==LightEffect Properties ==

; LE_None : Standard light.
; LE_TorchWaver : Subtle fire effect, as though it was a torch.
; LE_FireWaver : Normal fire effect, as though it was an actual fire.
; LE_WaterShimmer : Set lighting to this underwater for interesting results.
; LE_SearchLight : A rotating light. Not much to this.
; LE_SlowWave : This'ld be good for a light just above water, methinks. Sends out slow waves of light.
; LE_FastWave : Sends out fast waves of light.
; LE_CloudCast : ??? No apparent effects.
; LE_StaticSpot : same as spotlight as far as i can tell.
; LE_Shock : Like LT_Strobe, only faster.
; LE_Disco : Random &quot;disco&quot; lights, the type of lighting you see in n00b maps.
; LE_Warp : ??? No apparent effects.
; LE_Spotlight : One spot of light. Remember to rotate the light actor to get this where you want it.
; LE_NonIncidence : same as le_none but does not take surface normals into account, generally makes light look brighter, useful for lighting curved bsp surfaces as the surface normals wont create a flatshaded look
; LE_Shell : Gives a &quot;The Ring&quot; effect, only lights up the edge of the radius.
; LE_OmnibumpMap : Yikes. No apparent effects.
; LE_Interference : Like SlowWave/FastWave mixed together, except differs according to the textures.
; LE_Cylinder : It's a cylinder of light instead of a sphere.
; LE_Rotor : As if a fan was in the way between the light and the surface. - the effect is a little wrong actually :P but it does an ok job, most people dont notice :P.
; LE_Sunlight : Used in the sunlight class. From what I can tell its a huge directional cylinder.
; LE_QuadraticNonIncidence : 

'''2k4'''
; LE_Negative :

==Changing The Effect ==

LightPeriod = changes the speed of the light.

LightPhase = Which frame of animation the light's on.

NOTE : Remember all light effects will significantly decrease performance on your map! Use sparingly! 

==LightEffects in UT2004==

djdanlib &amp;rarr; I will register at some point... This is what LightEffects do in UT2004's UnrealEd. Only a few are non-working. However, the current version of the engine doesn't allow these to animate in-game unless the Light is Non-Static. They do at least project static light patterns. Setting a light as dynamic effectively disables the light.

; LE_None : Normal, obviously
; LE_TorchWaver : Obsolete
; LE_FireWaver : Obsolete
; LE_WateryShimmer : Obsolete
; LE_Searchlight : Supported
; LE_SlowWave : Supported
; LE_FastWave : Supported
; LE_CloudCast : Obsolete
; LE_StaticSpot : Supported
; LE_Shock : Supported
; LE_Disco : Supported
; LE_Warp : Supported
; LE_Spotlight : Supported
; LE_NonIncidence : Supported
; LE_Shell : Supported
; LE_OmniBumpMap : Supported
; LE_Interference : Supported
; LE_Cylinder : Supported
; LE_Rotor : Supported
; LE_Negative : Supported
; LE_Sunlight : Supported
; LE_QuadraticNonIncidence : Supported

'''[DoW]MeepZero:'' I noticed that the light effect properties when rebuilt come up with an obsolete light effect error in my verson of Ued (UT2k4 v3355).  Im guessing this is what you were talking about with them not being functional anymore up top there.  The light type properties only function if the light is set as a dynamic light.  Is there any way to get those lighteffects to work, or can they be simulated in some way?

'''UArch''' i noticed the description for nonincidence was incorrect, it does not pass through walls...its basically the same as le_none but it doesnt take the surface normals into account when lighting bsp

'''Tester''' I think Spotlight is a dynamic light, whereas StaticSpot isn't. I did a quick search over the net to find out what LE_Negative is. That light effect seems to be a negative light, instead of casting light it &quot;subtracts&quot; light.

'''Wormbo:''' The &quot;dynamicness&quot; of a light depends exclusively on the value of bDynamicLight. There's absolutely no difference between SpotLight and StaticSpot, at least not in UT2004.

----

[[:Category:Legacy To Do]] &amp;ndash; [[:Category:Legacy Refactor Me]] into [[Legacy:Actor/Lighting|Actor/Lighting]] or a similar page or really clean this up
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4250</id>
      <timestamp>2007-08-22T07:03:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:''' page duplication with [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; sort of. How much has changed form UT to UT2003?

'''Foxpaw:''' Most, but not all, of these still work for dynamic lights. Static lights - basically none of them work right anymore, due to the fact that lightmaps are pregenerated and can't be animated through the use of lighteffects anymore.

'''Tarquin:''' Ok. So do we need one page for UT, one for Ut2003, or will one page do for both? How about I move the list &amp; images from [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to here?

'''Foxpaw:''' I think that's a good idea. One could also add the lighteffect &quot;QuadraticNonIncidence.&quot; I'm not sure what it does but it seems similar to NonIncidence.

'''UArchitect:''' made a few adjustments, hope nobody minds :P

'''T1:''' Of course nobody minds, that's the beauty of the wiki.

'''OlympusMons:''' I was wondering if these actually worked in ut2k3 or 2k4. Im sure Ive tried and they didnt work so maybe there should be two different pages if it doesnt apply to all versions of the engine. Ok so I added the rest of the light effects and types. Unfortunatly I have no clue what they do I just thought it would be handy to have them here.

'''Prograham:''' I think this page should be split into two.  One for UT2K3 and earlier, one for UT2K4, because none of these LightType Properties work anymore in 2K4.  It just makes sense to me to make a new page for something if the engine changes it.:tup:PS- I would make a new page right now but I'm new to editing the wiki so instead I'm just going to leave really long paragraphs for now j/k.

This is what is done now(I am cutting and pasting from http://forums.beyondunreal.com/archive/index.php/t-141250.html)-&gt; Dynamic lighting is disabled in the current Engine build. The only thing remotely dynamic you can do is use TriggerLights. I sure there's a way to constantly trigger them and get your blinking effect, but usually they turn on/off when a player touches their trigger. In Blitz's map BR-Warzone (http://www.unrealplayground.com/maps.php?mapid=3324) he has TriggerLights to make the flash of guns in the distance, but I'm not sure how he did it. I think he coded them since the map is full of scripted stuff he wrote.

'''T1:''' Try looking into using projectors, maybe. Hourences uses projectors for the lightning effect on ONS-Dinora IIRC.

==LightType Properties ==

&lt;nowiki&gt;***NOTE: These LightType Properties are no longer functional in UT2K4***&lt;/nowiki&gt; 

; LT_None : No lighting. Why you should use this for lights is beyond me!
; LT_Steady : Normal light. Probably the one you'll use most often.
; LT_Pulse : Pulses the light on and off. Imagine playing with the light dimmer switch.
; LT_Blink : simlar to flicker, light is on but flickers off every so often a more subtle flicker, sometimes works sometimes doesnt..not sure whats up with that.
; LT_Flicker : Good for broken down factory-type areas. Flickers on/off, as if the light ws broken. does not work with Coronas.
; LT_Strobe : Flashes light on... off... on... off... Whee! Headaches! Not really suitable for gameplay...
; LT_BackdropLight : Possibly used in SkyBoxes, but I dunno. No effects observed.
; LT_SubtlePulse : I find this to be good with Green Lighting against Slime pits. Just barely noticeable, but it's there. Pickups are lit in this way.
; LT_TexturePaletteOnce : The light colour will cycle once through the texture palette selected for Skin.
; LT_TexturePaletteLoop : As TexturePaletteOnce but loops. The value of LightPeriod sets the speed. 
; LT_FadeOut :

==LightEffect Properties ==

; LE_None : Standard light.
; LE_TorchWaver : Subtle fire effect, as though it was a torch.
; LE_FireWaver : Normal fire effect, as though it was an actual fire.
; LE_WaterShimmer : Set lighting to this underwater for interesting results.
; LE_SearchLight : A rotating light. Not much to this.
; LE_SlowWave : This'ld be good for a light just above water, methinks. Sends out slow waves of light.
; LE_FastWave : Sends out fast waves of light.
; LE_CloudCast : ??? No apparent effects.
; LE_StaticSpot : same as spotlight as far as i can tell.
; LE_Shock : Like LT_Strobe, only faster.
; LE_Disco : Random &quot;disco&quot; lights, the type of lighting you see in n00b maps.
; LE_Warp : ??? No apparent effects.
; LE_Spotlight : One spot of light. Remember to rotate the light actor to get this where you want it.
; LE_NonIncidence : same as le_none but does not take surface normals into account, generally makes light look brighter, useful for lighting curved bsp surfaces as the surface normals wont create a flatshaded look
; LE_Shell : Gives a &quot;The Ring&quot; effect, only lights up the edge of the radius.
; LE_OmnibumpMap : Yikes. No apparent effects.
; LE_Interference : Like SlowWave/FastWave mixed together, except differs according to the textures.
; LE_Cylinder : It's a cylinder of light instead of a sphere.
; LE_Rotor : As if a fan was in the way between the light and the surface. - the effect is a little wrong actually :P but it does an ok job, most people dont notice :P.
; LE_Sunlight : Used in the sunlight class. From what I can tell its a huge directional cylinder.
; LE_QuadraticNonIncidence : 

'''2k4'''
; LE_Negative :

==Changing The Effect ==

LightPeriod = changes the speed of the light.

LightPhase = Which frame of animation the light's on.

NOTE : Remember all light effects will significantly decrease performance on your map! Use sparingly! 

==LightEffects in UT2004==

djdanlib &amp;rarr; I will register at some point... This is what LightEffects do in UT2004's UnrealEd. Only a few are non-working. However, the current version of the engine doesn't allow these to animate in-game. They do at least project static light patterns. Setting a light as dynamic effectively disables the light.

; LE_None : Normal, obviously
; LE_TorchWaver : Obsolete
; LE_FireWaver : Obsolete
; LE_WateryShimmer : Obsolete
; LE_Searchlight : Supported
; LE_SlowWave : Supported
; LE_FastWave : Supported
; LE_CloudCast : Obsolete
; LE_StaticSpot : Supported
; LE_Shock : Supported
; LE_Disco : Supported
; LE_Warp : Supported
; LE_Spotlight : Supported
; LE_NonIncidence : Supported
; LE_Shell : Supported
; LE_OmniBumpMap : Supported
; LE_Interference : Supported
; LE_Cylinder : Supported
; LE_Rotor : Supported
; LE_Negative : Supported
; LE_Sunlight : Supported
; LE_QuadraticNonIncidence : Supported

'''[DoW]MeepZero:'' I noticed that the light effect properties when rebuilt come up with an obsolete light effect error in my verson of Ued (UT2k4 v3355).  Im guessing this is what you were talking about with them not being functional anymore up top there.  The light type properties only function if the light is set as a dynamic light.  Is there any way to get those lighteffects to work, or can they be simulated in some way?

'''UArch''' i noticed the description for nonincidence was incorrect, it does not pass through walls...its basically the same as le_none but it doesnt take the surface normals into account when lighting bsp

'''Tester''' I think Spotlight is a dynamic light, whereas StaticSpot isn't. I did a quick search over the net to find out what LE_Negative is. That light effect seems to be a negative light, instead of casting light it &quot;subtracts&quot; light.

'''Wormbo:''' The &quot;dynamicness&quot; of a light depends exclusively on the value of bDynamicLight. There's absolutely no difference between SpotLight and StaticSpot, at least not in UT2004.

----

[[:Category:Legacy To Do]] &amp;ndash; [[:Category:Legacy Refactor Me]] into [[Legacy:Actor/Lighting|Actor/Lighting]] or a similar page or really clean this up
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34406</id>
      <timestamp>2009-05-12T15:00:53Z</timestamp>
      <contributor>
        <username>Seditious</username>
        <id>1838</id>
      </contributor>
      <comment>/* LightEffects in UT2004 */</comment>
      <text xml:space="preserve">'''Tarquin:''' page duplication with [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; sort of. How much has changed form UT to UT2003?

'''Foxpaw:''' Most, but not all, of these still work for dynamic lights. Static lights - basically none of them work right anymore, due to the fact that lightmaps are pregenerated and can't be animated through the use of lighteffects anymore.

'''Tarquin:''' Ok. So do we need one page for UT, one for Ut2003, or will one page do for both? How about I move the list &amp; images from [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to here?

'''Foxpaw:''' I think that's a good idea. One could also add the lighteffect &quot;QuadraticNonIncidence.&quot; I'm not sure what it does but it seems similar to NonIncidence.

'''UArchitect:''' made a few adjustments, hope nobody minds :P

'''T1:''' Of course nobody minds, that's the beauty of the wiki.

'''OlympusMons:''' I was wondering if these actually worked in ut2k3 or 2k4. Im sure Ive tried and they didnt work so maybe there should be two different pages if it doesnt apply to all versions of the engine. Ok so I added the rest of the light effects and types. Unfortunatly I have no clue what they do I just thought it would be handy to have them here.

'''Prograham:''' I think this page should be split into two.  One for UT2K3 and earlier, one for UT2K4, because none of these LightType Properties work anymore in 2K4.  It just makes sense to me to make a new page for something if the engine changes it.:tup:PS- I would make a new page right now but I'm new to editing the wiki so instead I'm just going to leave really long paragraphs for now j/k.

This is what is done now(I am cutting and pasting from http://forums.beyondunreal.com/archive/index.php/t-141250.html)-&gt; Dynamic lighting is disabled in the current Engine build. The only thing remotely dynamic you can do is use TriggerLights. I sure there's a way to constantly trigger them and get your blinking effect, but usually they turn on/off when a player touches their trigger. In Blitz's map BR-Warzone (http://www.unrealplayground.com/maps.php?mapid=3324) he has TriggerLights to make the flash of guns in the distance, but I'm not sure how he did it. I think he coded them since the map is full of scripted stuff he wrote.

'''T1:''' Try looking into using projectors, maybe. Hourences uses projectors for the lightning effect on ONS-Dinora IIRC.

==LightType Properties ==

&lt;nowiki&gt;***NOTE: LightTypes will only work when bStatic is False!***&lt;/nowiki&gt; 

; LT_None : No lighting. Why you should use this for lights is beyond me!
; LT_Steady : Normal light. Probably the one you'll use most often.
; LT_Pulse : Pulses the light on and off. Imagine playing with the light dimmer switch.
; LT_Blink : simlar to flicker, light is on but flickers off every so often a more subtle flicker, sometimes works sometimes doesnt..not sure whats up with that.
; LT_Flicker : Good for broken down factory-type areas. Flickers on/off, as if the light ws broken. does not work with Coronas.
; LT_Strobe : Flashes light on... off... on... off... Whee! Headaches! Not really suitable for gameplay...
; LT_BackdropLight : Possibly used in SkyBoxes, but I dunno. No effects observed.
; LT_SubtlePulse : I find this to be good with Green Lighting against Slime pits. Just barely noticeable, but it's there. Pickups are lit in this way.
; LT_TexturePaletteOnce : The light colour will cycle once through the texture palette selected for Skin.
; LT_TexturePaletteLoop : As TexturePaletteOnce but loops. The value of LightPeriod sets the speed. 
; LT_FadeOut :

==LightEffect Properties ==

; LE_None : Standard light.
; LE_TorchWaver : Subtle fire effect, as though it was a torch.
; LE_FireWaver : Normal fire effect, as though it was an actual fire.
; LE_WaterShimmer : Set lighting to this underwater for interesting results.
; LE_SearchLight : A rotating light. Not much to this.
; LE_SlowWave : This'ld be good for a light just above water, methinks. Sends out slow waves of light.
; LE_FastWave : Sends out fast waves of light.
; LE_CloudCast : ??? No apparent effects.
; LE_StaticSpot : same as spotlight as far as i can tell.
; LE_Shock : Like LT_Strobe, only faster.
; LE_Disco : Random &quot;disco&quot; lights, the type of lighting you see in n00b maps.
; LE_Warp : ??? No apparent effects.
; LE_Spotlight : One spot of light. Remember to rotate the light actor to get this where you want it.
; LE_NonIncidence : same as le_none but does not take surface normals into account, generally makes light look brighter, useful for lighting curved bsp surfaces as the surface normals wont create a flatshaded look
; LE_Shell : Gives a &quot;The Ring&quot; effect, only lights up the edge of the radius.
; LE_OmnibumpMap : Yikes. No apparent effects.
; LE_Interference : Like SlowWave/FastWave mixed together, except differs according to the textures.
; LE_Cylinder : It's a cylinder of light instead of a sphere.
; LE_Rotor : As if a fan was in the way between the light and the surface. - the effect is a little wrong actually :P but it does an ok job, most people dont notice :P.
; LE_Sunlight : Used in the sunlight class. From what I can tell its a huge directional cylinder.
; LE_QuadraticNonIncidence : 

'''2k4'''
; LE_Negative :

==Changing The Effect ==

LightPeriod = changes the speed of the light.

LightPhase = Which frame of animation the light's on.

NOTE : Remember all light effects will significantly decrease performance on your map! Use sparingly! 

==LightEffects in UT2004==

djdanlib &amp;rarr; I will register at some point... This is what LightEffects do in UT2004's UnrealEd. Only a few are non-working. However, the current version of the engine doesn't allow these to animate in-game unless the Light is Non-Static. They do at least project static light patterns. Setting a light as dynamic effectively disables the light.

; LE_None : Normal, obviously
; LE_TorchWaver : Obsolete
; LE_FireWaver : Obsolete
; LE_WateryShimmer : Obsolete
; LE_Searchlight : Supported
; LE_SlowWave : Supported
; LE_FastWave : Supported
; LE_CloudCast : Obsolete
; LE_StaticSpot : Supported
; LE_Shock : Supported
; LE_Disco : Supported
; LE_Warp : Supported
; LE_Spotlight : Supported
; LE_NonIncidence : Supported
; LE_Shell : Supported
; LE_OmniBumpMap : Supported
; LE_Interference : Supported
; LE_Cylinder : Supported
; LE_Rotor : Supported
; LE_Negative : Supported
; LE_Sunlight : Supported
; LE_QuadraticNonIncidence : Supported

'''[DoW]MeepZero:'' I noticed that the light effect properties when rebuilt come up with an obsolete light effect error in my verson of Ued (UT2k4 v3355).  Im guessing this is what you were talking about with them not being functional anymore up top there.  The light type properties only function if the light is set as a dynamic light.  Is there any way to get those lighteffects to work, or can they be simulated in some way?

'''UArch''' i noticed the description for nonincidence was incorrect, it does not pass through walls...its basically the same as le_none but it doesnt take the surface normals into account when lighting bsp

'''Tester''' I think Spotlight is a dynamic light, whereas StaticSpot isn't. I did a quick search over the net to find out what LE_Negative is. That light effect seems to be a negative light, instead of casting light it &quot;subtracts&quot; light.

'''Wormbo:''' The &quot;dynamicness&quot; of a light depends exclusively on the value of bDynamicLight. There's absolutely no difference between SpotLight and StaticSpot, at least not in UT2004.

'''seditious:''' I noticed the Postal Babes mutator made color-cycling dynamic lights so I looked into the code... it's simply changing the value of LightHue each Tick(). Based on that (directly on, hopefully with L7's permission), I'm thinking about brute-forcing the LightType effects into a subclass of Light. The obvious problems so far include not being able to get palettes from textures without some fancy code and probably not at all, and of course the performance. I had already subclassed LinkBeamEffect to make it stay put like a decoration even in network games, just by overriding the default properties. When I pasted L7's dynamic light code into the otherwise empty script, the green muzzle glow on nearby walls and floor was changing colors, woohoo! So I have only to create a set of patterns and give them enum names or something, and maybe create a few more variables for brightness, phase, frequency, amplitude, etc... but since these pages suggest certain effects already work with the right properties, is this a waste of time? I'm still a total n00b :) Gonna go play with bStatic for a few.

----

[[:Category:Legacy To Do]] &amp;ndash; [[:Category:Legacy Refactor Me]] into [[Legacy:Actor/Lighting|Actor/Lighting]] or a similar page or really clean this up
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34407</id>
      <timestamp>2009-05-12T15:41:01Z</timestamp>
      <contributor>
        <username>Seditious</username>
        <id>1838</id>
      </contributor>
      <comment>/* LightEffects in UT2004 */</comment>
      <text xml:space="preserve">'''Tarquin:''' page duplication with [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] &amp;ndash; sort of. How much has changed form UT to UT2003?

'''Foxpaw:''' Most, but not all, of these still work for dynamic lights. Static lights - basically none of them work right anymore, due to the fact that lightmaps are pregenerated and can't be animated through the use of lighteffects anymore.

'''Tarquin:''' Ok. So do we need one page for UT, one for Ut2003, or will one page do for both? How about I move the list &amp; images from [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to here?

'''Foxpaw:''' I think that's a good idea. One could also add the lighteffect &quot;QuadraticNonIncidence.&quot; I'm not sure what it does but it seems similar to NonIncidence.

'''UArchitect:''' made a few adjustments, hope nobody minds :P

'''T1:''' Of course nobody minds, that's the beauty of the wiki.

'''OlympusMons:''' I was wondering if these actually worked in ut2k3 or 2k4. Im sure Ive tried and they didnt work so maybe there should be two different pages if it doesnt apply to all versions of the engine. Ok so I added the rest of the light effects and types. Unfortunatly I have no clue what they do I just thought it would be handy to have them here.

'''Prograham:''' I think this page should be split into two.  One for UT2K3 and earlier, one for UT2K4, because none of these LightType Properties work anymore in 2K4.  It just makes sense to me to make a new page for something if the engine changes it.:tup:PS- I would make a new page right now but I'm new to editing the wiki so instead I'm just going to leave really long paragraphs for now j/k.

This is what is done now(I am cutting and pasting from http://forums.beyondunreal.com/archive/index.php/t-141250.html)-&gt; Dynamic lighting is disabled in the current Engine build. The only thing remotely dynamic you can do is use TriggerLights. I sure there's a way to constantly trigger them and get your blinking effect, but usually they turn on/off when a player touches their trigger. In Blitz's map BR-Warzone (http://www.unrealplayground.com/maps.php?mapid=3324) he has TriggerLights to make the flash of guns in the distance, but I'm not sure how he did it. I think he coded them since the map is full of scripted stuff he wrote.

'''T1:''' Try looking into using projectors, maybe. Hourences uses projectors for the lightning effect on ONS-Dinora IIRC.

==LightType Properties ==

&lt;nowiki&gt;***NOTE: LightTypes will only work when bStatic is False!***&lt;/nowiki&gt; 

; LT_None : No lighting. Why you should use this for lights is beyond me!
; LT_Steady : Normal light. Probably the one you'll use most often.
; LT_Pulse : Pulses the light on and off. Imagine playing with the light dimmer switch.
; LT_Blink : simlar to flicker, light is on but flickers off every so often a more subtle flicker, sometimes works sometimes doesnt..not sure whats up with that.
; LT_Flicker : Good for broken down factory-type areas. Flickers on/off, as if the light ws broken. does not work with Coronas.
; LT_Strobe : Flashes light on... off... on... off... Whee! Headaches! Not really suitable for gameplay...
; LT_BackdropLight : Possibly used in SkyBoxes, but I dunno. No effects observed.
; LT_SubtlePulse : I find this to be good with Green Lighting against Slime pits. Just barely noticeable, but it's there. Pickups are lit in this way.
; LT_TexturePaletteOnce : The light colour will cycle once through the texture palette selected for Skin.
; LT_TexturePaletteLoop : As TexturePaletteOnce but loops. The value of LightPeriod sets the speed. 
; LT_FadeOut :

==LightEffect Properties ==

; LE_None : Standard light.
; LE_TorchWaver : Subtle fire effect, as though it was a torch.
; LE_FireWaver : Normal fire effect, as though it was an actual fire.
; LE_WaterShimmer : Set lighting to this underwater for interesting results.
; LE_SearchLight : A rotating light. Not much to this.
; LE_SlowWave : This'ld be good for a light just above water, methinks. Sends out slow waves of light.
; LE_FastWave : Sends out fast waves of light.
; LE_CloudCast : ??? No apparent effects.
; LE_StaticSpot : same as spotlight as far as i can tell.
; LE_Shock : Like LT_Strobe, only faster.
; LE_Disco : Random &quot;disco&quot; lights, the type of lighting you see in n00b maps.
; LE_Warp : ??? No apparent effects.
; LE_Spotlight : One spot of light. Remember to rotate the light actor to get this where you want it.
; LE_NonIncidence : same as le_none but does not take surface normals into account, generally makes light look brighter, useful for lighting curved bsp surfaces as the surface normals wont create a flatshaded look
; LE_Shell : Gives a &quot;The Ring&quot; effect, only lights up the edge of the radius.
; LE_OmnibumpMap : Yikes. No apparent effects.
; LE_Interference : Like SlowWave/FastWave mixed together, except differs according to the textures.
; LE_Cylinder : It's a cylinder of light instead of a sphere.
; LE_Rotor : As if a fan was in the way between the light and the surface. - the effect is a little wrong actually :P but it does an ok job, most people dont notice :P.
; LE_Sunlight : Used in the sunlight class. From what I can tell its a huge directional cylinder.
; LE_QuadraticNonIncidence : 

'''2k4'''
; LE_Negative :

==Changing The Effect ==

LightPeriod = changes the speed of the light.

LightPhase = Which frame of animation the light's on.

NOTE : Remember all light effects will significantly decrease performance on your map! Use sparingly! 

==LightEffects in UT2004==

djdanlib &amp;rarr; I will register at some point... This is what LightEffects do in UT2004's UnrealEd. Only a few are non-working. However, the current version of the engine doesn't allow these to animate in-game unless the Light is Non-Static. They do at least project static light patterns. Setting a light as dynamic effectively disables the light.

; LE_None : Normal, obviously
; LE_TorchWaver : Obsolete
; LE_FireWaver : Obsolete
; LE_WateryShimmer : Obsolete
; LE_Searchlight : Supported
; LE_SlowWave : Supported
; LE_FastWave : Supported
; LE_CloudCast : Obsolete
; LE_StaticSpot : Supported
; LE_Shock : Supported
; LE_Disco : Supported
; LE_Warp : Supported
; LE_Spotlight : Supported
; LE_NonIncidence : Supported
; LE_Shell : Supported
; LE_OmniBumpMap : Supported
; LE_Interference : Supported
; LE_Cylinder : Supported
; LE_Rotor : Supported
; LE_Negative : Supported
; LE_Sunlight : Supported
; LE_QuadraticNonIncidence : Supported

'''[DoW]MeepZero:'' I noticed that the light effect properties when rebuilt come up with an obsolete light effect error in my verson of Ued (UT2k4 v3355).  Im guessing this is what you were talking about with them not being functional anymore up top there.  The light type properties only function if the light is set as a dynamic light.  Is there any way to get those lighteffects to work, or can they be simulated in some way?

'''UArch''' i noticed the description for nonincidence was incorrect, it does not pass through walls...its basically the same as le_none but it doesnt take the surface normals into account when lighting bsp

'''Tester''' I think Spotlight is a dynamic light, whereas StaticSpot isn't. I did a quick search over the net to find out what LE_Negative is. That light effect seems to be a negative light, instead of casting light it &quot;subtracts&quot; light.

'''Wormbo:''' The &quot;dynamicness&quot; of a light depends exclusively on the value of bDynamicLight. There's absolutely no difference between SpotLight and StaticSpot, at least not in UT2004.

'''seditious:''' I noticed the Postal Babes mutator made color-cycling dynamic lights so I looked into the code... it's simply changing the value of LightHue each Tick(). Based on that (directly on, hopefully with L7's permission), I'm thinking about brute-forcing the LightType effects into a subclass of Light. The obvious problems so far include not being able to get palettes from textures without some fancy code and probably not at all, and of course the performance. I had already subclassed LinkBeamEffect to make it stay put like a decoration even in network games, just by overriding the default properties. When I pasted L7's dynamic light code into the otherwise empty script, the green muzzle glow on nearby walls and floor was changing colors, woohoo! So I have only to create a set of patterns and give them enum names or something, and maybe create a few more variables for brightness, phase, frequency, amplitude, etc... but since these pages suggest certain effects already work with the right properties, is this a waste of time? I'm still a total n00b :) Gonna go play with bStatic for a few. ADDED: OK, it's that simple. I subclassed Light, only making the default property bStatic=false and now the LightTypes (LT_*) work as promised. Well, also bDynamicLight has to be true so I'm going to add that to the defaults... Anyway I'll probably still do this just for the sake of total flexibility (maybe even radius!). And no matter what I did, LightEffects (LE_*) didn't animate. No big deal.

----

[[:Category:Legacy To Do]] &amp;ndash; [[:Category:Legacy Refactor Me]] into [[Legacy:Actor/Lighting|Actor/Lighting]] or a similar page or really clean this up
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightbox</title>
    <id>1651</id>
    <revision>
      <id>4087</id>
      <timestamp>2005-01-14T03:30:24Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Decoration|Decoration]] &gt;&gt; Lightbox (Package: Botpack)}}

things to mention:

what is does.

the annoying way it's not quite horizontal: how much to rotate it by to rectify this.

how much to scale it by to fit popular light textures.

recommended value of ScaleGlow.

* change the size with DrawScale
* the proportions (a little) with Fatness.
* Adjust ScaleGlow for the brightness effect

(see [[Legacy:Actor (UT)/Display|Actor (UT)/Display]] for more info on these properties)

==Alternatives ==
; [[Legacy:LightCone|LightCone]] decoration class : Not as nice for general use but sometimes handy.

; Non-Solid Brush : '''Bean:''' Sometimes, if i need a large lightbox, but the mesh one won't work with what I need, i just use a non-solid cube brush. Then, I vertex edit the bottommost (or topmost if the light box with come from bottom source) side outwards to be the shape of a lightbox. Then, i use the texture in the FractalFX package called &quot;Horizon50&quot; for the lightbox texture. Also, making the surfaces unlit makes it look more like a lightbox.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4088</id>
      <timestamp>2005-01-13T23:55:11Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lighting</title>
    <id>1652</id>
    <revision>
      <id>4089</id>
      <timestamp>2005-10-29T18:16:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">This is the hub page for anything about lighting in maps. 

In technical terms, lighting is fairly simple: place many [[Legacy:Light|Light]] actors in the map, [[Legacy:Rebuild|rebuild]] and the map is lit. Good lighting is an essential part of a map's atmosphere.

===Classes:===

* [[Legacy:Light|Light]]
* [[Legacy:Sunlight|Sunlight]]
* [[Legacy:Projector|Projector]]s
* [[Legacy:Actor/Lighting|Actor/Lighting]], in every actor
* [[Legacy:Vertex Lighting|Vertex lighting]]
* [[Legacy:Light Effects|Light Effects]]

(UT stuff follows, needs updating &amp; sorting)

==Technical==
*The [[Legacy:Light (UT)|Light (UT)]], [[Legacy:Light|Light]] actor and its subclasses
*Light properties are set at the actor level under [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], [[Legacy:Actor/Lighting|Actor/Lighting]] .

===Static Lighting===
* [[Legacy:Lighting Basics|Lighting Basics]]
* Examples of [[Legacy:Colors|Colors]]
* Using [[Legacy:Zonelight|Zonelight]] to provide ambient light to a whole unzoned level or a zoned subsection of a level.
* [[Legacy:Shadows|Shadows]]
* using [[Legacy:Special Lit|special lit]] &amp; unlit surfaces
* the lightbox decoration. Have DrawScale settings to make it line up perfectly to the more popular light textures.
* [[Legacy:Lightmap Errors|Lightmap Errors]]

===Dynamic Lighting===

Obviously there'll be crossover from [[Legacy:Dynamics|dynamics]] here.
* triggered lights
* worth mentioning here (and under sound too) the cunning trick of using TriggerLight to make triggered sounds that use a looped sound.
* dynamic lights
* Scripted Light Shows
* the [[Legacy:TriggerLight|TriggerLight]] class spec
* [[Legacy:Movable Lights|Movable Lights]] &amp;ndash; How to make a light movable! By: ZxAnPhOrIaN

===Lighting Effects===
* [[Legacy:Bloom|Bloom]] &amp;ndash; lunticular halos in UT2004.
* How to create (true and fake) [[Legacy:Fog|fog]]
* A [[Legacy:Corona|Corona]] is a texture that looks like a flare and is applied at the light source.  Its size is always the same relative to the screen.  The effect often mistakenly called a &quot;[[Legacy:Lens Flare|Lens Flare]]&quot;.
* palette loop modulation 
* modulated light

===Tutorials===
* [[Legacy:Place A Light|Place A Light]]
* [[Legacy:Lighting Strategies|Lighting strategies]]

* [[Legacy:Building A SkyBox|Building A SkyBox]]
* [[Legacy:Adding Sunlight|Adding Sunlight]]

==Related Topics==
* [[Legacy:Mouse Control|Mouse control]]s for moving lights in 3D viewport is the same as [[Legacy:Brush|brush]]
* [http://www.planetunreal.com/lode/lighting/lighting.html Lode's All About Lighting Tutorial] covers everything in one page.

==Comments==

''Feel free to reorganize things, suggest new topics to cover and start new pages.''

'''Sobiwan:''' We have [[Legacy:Topics On Mapping|Topics on Mapping]] and [[Legacy:Topics On Materials|Topics on Materials]] as hubs, so either:
# this page should become [[Legacy:Topics On Lighting|Topics on Lighting]]
# those page names should be truncated 
# they should all be renamed to something different such as ''topicname Hub''.

I vote for #1.

'''odo324:''' Umm...
# Neh. Add that as a sub-title if you want, but the current title makes perfect sense. “Light” will give you the actor, while “Lighting” will give you a list info on “unreal engine lighting” in general.
# Dear Lord I hope not! Truncated names incur confusion. Complete words are easier to remember. Some people prefer to simply type the page’s name in the address bar, instead of mindlessly navigating through multiple pages.
# I ‘would’ agree, if was a series of articles (such as: [[Legacy:How_UT2003_Weapons_Work|How_UT2003_Weapons_Work]]), but it’s not. Further more, individual pages may have multiple places it could belong to. Adding some kind of suffix-title would be impossible for all circumstances. Regardless, it’s best to keep things simple anyway.

Do we need a “''How to''” page about creating hubs (like this one) for the Unreal Wiki?

'''Tarquin:''' See [[Legacy:Guidelines On Page Creation|Guidelines On Page Creation]]. 

'''OlympusMons:''' I think [[Legacy:Lighting Topics|Lighting Topics]] would be a good name for this, since tarquin suggested changing the [[Legacy:Topics On Materials|Topics on Materials]] page to [[Legacy:Material Topics|Material Topics]]. 

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]&lt;br /&gt;[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]\\
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4090</id>
      <timestamp>2005-10-22T20:11:29Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <minor/>
      <comment>*revert</comment>
      <text xml:space="preserve">This is the hub page for anything about lighting in maps. 

In technical terms, lighting is fairly simple: place many [[Legacy:Light|Light]] actors in the map, [[Legacy:Rebuild|rebuild]] and the map is lit. Good lighting is an essential part of a map's atmosphere.

===Classes:===

* [[Legacy:Light|Light]]
* [[Legacy:Sunlight|Sunlight]]
* [[Legacy:Projector|Projector]]s
* [[Legacy:Actor/Lighting|Actor/Lighting]], in every actor
* [[Legacy:Vertex Lighting|Vertex lighting]]
* [[Legacy:Light Effects|Light Effects]]

(UT stuff follows, needs updating &amp; sorting)

==Technical==
*The [[Legacy:Light (UT)|Light (UT)]], [[Legacy:Light|Light]] actor and its subclasses
*Light properties are set at the actor level under [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], [[Legacy:Actor/Lighting|Actor/Lighting]] .

===Static Lighting===
* [[Legacy:Lighting Basics|Lighting Basics]]
* Examples of [[Legacy:Colors|Colors]]
* Using [[Legacy:Zonelight|Zonelight]] to provide ambient light to a whole unzoned level or a zoned subsection of a level.
* [[Legacy:Shadows|Shadows]]
* using [[Legacy:Special Lit|special lit]] &amp; unlit surfaces
* the lightbox decoration. Have DrawScale settings to make it line up perfectly to the more popular light textures.
* [[Legacy:Lightmap Errors|Lightmap Errors]]

===Dynamic Lighting===

Obviously there'll be crossover from [[Legacy:Dynamics|dynamics]] here.
* triggered lights
* worth mentioning here (and under sound too) the cunning trick of using TriggerLight to make triggered sounds that use a looped sound.
* dynamic lights
* Scripted Light Shows
* the [[Legacy:TriggerLight|TriggerLight]] class spec
* [[Legacy:Movable Lights|Movable Lights]] &amp;ndash; How to make a light movable! By: ZxAnPhOrIaN

===Lighting Effects===
* [[Legacy:Bloom|Bloom]] &amp;ndash; lunticular halos in UT2004.
* How to create (true and fake) [[Legacy:Fog|fog]]
* A [[Legacy:Corona|Corona]] is a texture that looks like a flare and is applied at the light source.  Its size is always the same relative to the screen.  The effect often mistakenly called a &quot;[[Legacy:Lens Flare|Lens Flare]]&quot;.
* palette loop modulation 
* modulated light

===Tutorials===
* [[Legacy:Place A Light|Place A Light]]
* [[Legacy:Lighting Strategies|Lighting strategies]]

* [[Legacy:Building A SkyBox|Building A SkyBox]]
* [[Legacy:Adding Sunlight|Adding Sunlight]]

==Related Topics==
* [[Legacy:Mouse Control|Mouse control]]s for moving lights in 3D viewport is the same as [[Legacy:Brush|brush]]
* [http://www.planetunreal.com/lode/lighting/lighting.html Lode's All About Lighting Tutorial] covers everything in one page.

==Comments==

''Feel free to reorganize things, suggest new topics to cover and start new pages.''

'''Sobiwan:''' We have [[Legacy:Topics On Mapping|Topics on Mapping]] and [[Legacy:Topics On Materials|Topics on Materials]] as hubs, so either:
# this page should become [[Legacy:Topics On Lighting|Topics on Lighting]]
# those page names should be truncated 
# they should all be renamed to something different such as ''topicname Hub''.

I vote for #1.

'''odo324:''' Umm...
# Neh. Add that as a sub-title if you want, but the current title makes perfect sense. “Light” will give you the actor, while “Lighting” will give you a list info on “unreal engine lighting” in general.
# Dear Lord I hope not! Truncated names incur confusion. Complete words are easier to remember. Some people prefer to simply type the page’s name in the address bar, instead of mindlessly navigating through multiple pages.
# I ‘would’ agree, if was a series of articles (such as: [[Legacy:How_UT2003_Weapons_Work|How_UT2003_Weapons_Work]]), but it’s not. Further more, individual pages may have multiple places it could belong to. Adding some kind of suffix-title would be impossible for all circumstances. Regardless, it’s best to keep things simple anyway.

Do we need a “''How to''” page about creating hubs (like this one) for the Unreal Wiki?

'''Tarquin:''' See [[Legacy:Guidelines On Page Creation|Guidelines On Page Creation]]. 

'''OlympusMons:''' I think [[Legacy:Lighting Topics|Lighting Topics]] would be a good name for this, since tarquin suggested changing the [[Legacy:Topics On Materials|Topics on Materials]] page to [[Legacy:Material Topics|Material Topics]]. 

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]&lt;br /&gt;[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]\\
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4091</id>
      <timestamp>2005-10-29T17:56:19Z</timestamp>
      <contributor>
        <ip>Host81-155-216-175.range81-155.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the hub page for anything about lighting in maps. 

In technical terms, lighting is fairly simple: place many [[Legacy:Light|Light]] actors in the map, [[Legacy:Rebuild|rebuild]] and the map is lit. Good lighting is an essential part of a map's atmosphere.

===Classes:===

* [[Legacy:Light|Light]]
* [[Legacy:Sunlight|Sunlight]]
* [[Legacy:Projector|Projector]]s
* [[Legacy:Actor/Lighting|Actor/Lighting]], in every actor
* [[Legacy:Vertex Lighting|Vertex lighting]]
* [[Legacy:Light Effects|Light Effects]]

(UT stuff follows, needs updating &amp; sorting)

==Technical==
*The [[Legacy:Light (UT)|Light (UT)]], [[Legacy:Light|Light]] actor and its subclasses
*Light properties are set at the actor level under [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], [[Legacy:Actor/Lighting|Actor/Lighting]] .

===Static Lighting===
* [[Legacy:Lighting Basics|Lighting Basics]]
* Examples of [[Legacy:Colors|Colors]]
* Using [[Legacy:Zonelight|Zonelight]] to provide ambient light to a whole unzoned level or a zoned subsection of a level.
* [[Legacy:Shadows|Shadows]]
* using [[Legacy:Special Lit|special lit]] &amp; unlit surfaces
* the lightbox decoration. Have DrawScale settings to make it line up perfectly to the more popular light textures.
* [[Legacy:Lightmap Errors|Lightmap Errors]]

===Dynamic Lighting===

Obviously there'll be crossover from [[Legacy:Dynamics|dynamics]] here.
* triggered lights
* worth mentioning here (and under sound too) the cunning trick of using TriggerLight to make triggered sounds that use a looped sound.
* dynamic lights
* Scripted Light Shows
* the [[Legacy:TriggerLight|TriggerLight]] class spec
* [[Legacy:Movable Lights|Movable Lights]] &amp;ndash; How to make a light movable! By: ZxAnPhOrIaN

===Lighting Effects===
* [[Legacy:Bloom|Bloom]] &amp;ndash; lunticular halos in UT2004.
* How to create (true and fake) [[Legacy:Fog|fog]]
* A [[Legacy:Corona|Corona]] is a texture that looks like a flare and is applied at the light source.  Its size is always the same relative to the screen.  The effect often mistakenly called a &quot;[[Legacy:Lens Flare|Lens Flare]]&quot;.
* palette loop modulation 
* modulated light

===Tutorials===
* [[Legacy:Place A Light|Place A Light]]
* [[Legacy:Lighting Strategies|Lighting strategies]]

* [[Legacy:Building A SkyBox|Building A SkyBox]]
* [[Legacy:Adding Sunlight|Adding Sunlight]]

==Related Topics==
* [[Legacy:Mouse Control|Mouse control]]s for moving lights in 3D viewport is the same as [[Legacy:Brush|brush]]
* [http://www.planetunreal.com/lode/lighting/lighting.html Lode's All About Lighting Tutorial] covers everything in one page.

==Comments==

''Feel free to reorganize things, suggest new topics to cover and start new pages.''

'''Sobiwan:''' We have [[Legacy:Topics On Mapping|Topics on Mapping]] and [[Legacy:Topics On Materials|Topics on Materials]] as hubs, so either:
# this page should become [[Legacy:Topics On Lighting|Topics on Lighting]]
# those page names should be truncated 
# they should all be renamed to something different such as ''topicname Hub''.

I vote for #1.

'''odo324:''' Umm...
# Neh. Add that as a sub-title if you want, but the current title makes perfect sense. “Light” will give you the actor, while “Lighting” will give you a list info on “unreal engine lighting” in general.
# Dear Lord I hope not! Truncated names incur confusion. Complete words are easier to remember. Some people prefer to simply type the page’s name in the address bar, instead of mindlessly navigating through multiple pages.
# I ‘would’ agree, if was a series of articles (such as: [[Legacy:How_UT2003_Weapons_Work|How_UT2003_Weapons_Work]]), but it’s not. Further more, individual pages may have multiple places it could belong to. Adding some kind of suffix-title would be impossible for all circumstances. Regardless, it’s best to keep things simple anyway.

Do we need a “''How to''” page about creating hubs (like this one) for the Unreal Wiki?

'''Tarquin:''' See [[Legacy:Guidelines On Page Creation|Guidelines On Page Creation]]. 

'''OlympusMons:''' I think roasted willy's[[Legacy:Lighting Topics|Lighting Topics]] would be a good name for this, since tarquin suggested changing the [[Legacy:Topics On Materials|Topics on Materials]] page to [[Legacy:Material Topics|Material Topics]]. 

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]&lt;br /&gt;[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]\\
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44338</id>
      <timestamp>2011-03-11T20:17:18Z</timestamp>
      <contributor>
        <ip>83.248.144.179</ip>
      </contributor>
      <comment>/* Related Topics */  404</comment>
      <text xml:space="preserve">This is the hub page for anything about lighting in maps. 

In technical terms, lighting is fairly simple: place many [[Legacy:Light|Light]] actors in the map, [[Legacy:Rebuild|rebuild]] and the map is lit. Good lighting is an essential part of a map's atmosphere.

===Classes:===

* [[Legacy:Light|Light]]
* [[Legacy:Sunlight|Sunlight]]
* [[Legacy:Projector|Projector]]s
* [[Legacy:Actor/Lighting|Actor/Lighting]], in every actor
* [[Legacy:Vertex Lighting|Vertex lighting]]
* [[Legacy:Light Effects|Light Effects]]

(UT stuff follows, needs updating &amp; sorting)

==Technical==
*The [[Legacy:Light (UT)|Light (UT)]], [[Legacy:Light|Light]] actor and its subclasses
*Light properties are set at the actor level under [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]], [[Legacy:Actor/Lighting|Actor/Lighting]] .

===Static Lighting===
* [[Legacy:Lighting Basics|Lighting Basics]]
* Examples of [[Legacy:Colors|Colors]]
* Using [[Legacy:Zonelight|Zonelight]] to provide ambient light to a whole unzoned level or a zoned subsection of a level.
* [[Legacy:Shadows|Shadows]]
* using [[Legacy:Special Lit|special lit]] &amp; unlit surfaces
* the lightbox decoration. Have DrawScale settings to make it line up perfectly to the more popular light textures.
* [[Legacy:Lightmap Errors|Lightmap Errors]]

===Dynamic Lighting===

Obviously there'll be crossover from [[Legacy:Dynamics|dynamics]] here.
* triggered lights
* worth mentioning here (and under sound too) the cunning trick of using TriggerLight to make triggered sounds that use a looped sound.
* dynamic lights
* Scripted Light Shows
* the [[Legacy:TriggerLight|TriggerLight]] class spec
* [[Legacy:Movable Lights|Movable Lights]] &amp;ndash; How to make a light movable! By: ZxAnPhOrIaN

===Lighting Effects===
* [[Legacy:Bloom|Bloom]] &amp;ndash; lunticular halos in UT2004.
* How to create (true and fake) [[Legacy:Fog|fog]]
* A [[Legacy:Corona|Corona]] is a texture that looks like a flare and is applied at the light source.  Its size is always the same relative to the screen.  The effect often mistakenly called a &quot;[[Legacy:Lens Flare|Lens Flare]]&quot;.
* palette loop modulation 
* modulated light

===Tutorials===
* [[Legacy:Place A Light|Place A Light]]
* [[Legacy:Lighting Strategies|Lighting strategies]]

* [[Legacy:Building A SkyBox|Building A SkyBox]]
* [[Legacy:Adding Sunlight|Adding Sunlight]]

==Related Topics==
* [[Legacy:Mouse Control|Mouse control]]s for moving lights in 3D viewport is the same as [[Legacy:Brush|brush]]

==Comments==

''Feel free to reorganize things, suggest new topics to cover and start new pages.''

'''Sobiwan:''' We have [[Legacy:Topics On Mapping|Topics on Mapping]] and [[Legacy:Topics On Materials|Topics on Materials]] as hubs, so either:
# this page should become [[Legacy:Topics On Lighting|Topics on Lighting]]
# those page names should be truncated 
# they should all be renamed to something different such as ''topicname Hub''.

I vote for #1.

'''odo324:''' Umm...
# Neh. Add that as a sub-title if you want, but the current title makes perfect sense. “Light” will give you the actor, while “Lighting” will give you a list info on “unreal engine lighting” in general.
# Dear Lord I hope not! Truncated names incur confusion. Complete words are easier to remember. Some people prefer to simply type the page’s name in the address bar, instead of mindlessly navigating through multiple pages.
# I ‘would’ agree, if was a series of articles (such as: [[Legacy:How_UT2003_Weapons_Work|How_UT2003_Weapons_Work]]), but it’s not. Further more, individual pages may have multiple places it could belong to. Adding some kind of suffix-title would be impossible for all circumstances. Regardless, it’s best to keep things simple anyway.

Do we need a “''How to''” page about creating hubs (like this one) for the Unreal Wiki?

'''Tarquin:''' See [[Legacy:Guidelines On Page Creation|Guidelines On Page Creation]]. 

'''OlympusMons:''' I think [[Legacy:Lighting Topics|Lighting Topics]] would be a good name for this, since tarquin suggested changing the [[Legacy:Topics On Materials|Topics on Materials]] page to [[Legacy:Material Topics|Material Topics]]. 

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]]&lt;br /&gt;[[:Category:Legacy Class (UT)]]&lt;br /&gt;[[:Category:Legacy Class (UT2003)]]\\
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lighting Basics</title>
    <id>1664</id>
    <revision>
      <id>4113</id>
      <timestamp>2006-05-20T05:04:40Z</timestamp>
      <contributor>
        <ip>Pool-71-105-113-177.lsanca.dsl-w.verizon.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Adding light to a level is one of the key steps of creating a beautiful and complete map. Lighting shouldn't be used solely to provide light to your work, but to create atmosphere, enhance textures, and complement textures. 

==Let There Be Light!==

To add a light to your map do one of the following:
* Right-click the surface you want the light to appear on, and select [[Legacy:Surface Context Menu|Surface Context Menu]] -&gt; Add Light here.
* Hold down the '''L''' key and left-click in a 3D Viewport.

===Positioning Lights===

Once you have lights in a map you can duplicate them the same as any other actor.  You can move the light easlily with Control + left mouse in the 2D viewports.  It can also be moved in the 3D viewport, but the [[Legacy:Mouse Control|mouse control]] is a little more involved.

===Approximate Versus Exact Light===

Although lighting will appear to show while inserting lights into a map, the light is approximate should you change its properties or move it.  To get a correct render of the lights, re[[Legacy:Build|build]] your map: click on the little 'lightBulb' icon in the UnrealEd [[Legacy:Toolbar|toolbar]].

==Changing Light Properties==

The procedure for changing a lights' property is:

# Right-click the light and go to the [[Legacy:Actor Properties Window|Actor Properties Window]]
# Expand the property
# Drag the slider with the mouse or enter a number

==Essential Properties==

Summary here:

{|

|-
|'''Property
|'''Description
|'''Location
|'''UT
|'''UT2k3
|-
|Radius
|Changes the spherical area size the light can affect. The default light radius is 64 and is usually either too big or too small.
|Lighting -&gt; LightRadius
|*
|*
|-
|Color &amp; Brightness
|Sets the light brightness, [[colors
|color]] and ''depth'' or ''richness'' the color.  By clicking the ''Color'' button in the upper right corner of the key, a color can be selected visually.
|LightColor -&gt; LightBrightness, LightHue, LightSaturation
|*
|*
|-
|[[Legacy:Corona|Corona]]
|Used to show a corona from the light source. Not to be mistaken for a [[Legacy:Lens Flare|Lens Flare]].
|Lighting -&gt; bCorona
|*
|*
|-
|[[Legacy:Fog|Fog]]
|Depth of vision per map or [[Legacy:Zone|zone]]
|Lighting -&gt; VolumeBright,VolumeFog,VolumeRadius
|*
|-
|-
|Special Lit
|Allows a light to affect only certain surfaces. See [[Legacy:Special Lit|special lit]] for more.
|Lighting -&gt; SpecialLit
|*
|*
|-
|Light Types
|shapes and movement
|Lighting -&gt; LightType
|*
|[[Legacy:Projector|projector]]
|-
|Light Effects
|Modulates brightness
|Lighting -&gt; LightEffect
|*
|[[Legacy:Projector|projector]]
|-
|Light phase
|Sets start of cycle for light animation.  Used with LightEffects and LightTypes.
|Lighting -&gt; bLightPhase
|*
|?
|-
|Cycled colors
|Texture palette effect
|location
|*
|?
|-
|Movable
|Allows light to be movable when attached to a [[Legacy:Mover|mover]]
|Advanced -&gt; bMovable
|*
|*
|}

Fool around with different values to achieve the look you desire.  See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to see all the property details that can be changed. 

===Things to write about (in here?) ===
*Light types(cylinder)
*Using in addition to fog

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for everything on lighting
* Creating light animations
* Creating textures for cycled colors
* [[Legacy:Light Effects|Light Effects]]

----

==Comments==

'''ViKTiM:''' I have found that a lot of lights with a colour saturation of 0 screw your frame rate considerably, USE THEM SPARINGLY!!

'''Tarquin:''' Great :D  Should we link [[Legacy:Actor/Lighting|Actor/Lighting]] too?

'''Sobiwan:''' I dunno; I dont use UT2k3.  :(

'''Shuriken:''' Half updated table for 2k3... don't do much lighting though, so don't know it all.</text>
    </revision>
    <revision>
      <id>4114</id>
      <timestamp>2003-10-31T21:38:01Z</timestamp>
      <contributor>
        <ip>Shuriken</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding light to a level is one of the key steps of creating a beautiful and complete map. Lighting shouldn't be used soley to provide light to your work, but to create atmosphere, enhance textures, and complement textures. 

==Let There Be Light!==

To add a light to your map do one of the following:
* Right-click the surface you want the light to appear on, and select [[Legacy:Surface Context Menu|Surface Context Menu]] -&gt; Add Light here.
* Hold down the '''L''' key and left-click in a 3D Viewport.

===Positioning Lights===

Once you have lights in a map you can duplicate them the same as any other actor.  You can move the light easlily with Control + left mouse in the 2D viewports.  It can also be moved in the 3D viewport, but the [[Legacy:Mouse Control|mouse control]] is a little more involved.

===Approximate Versus Exact Light===

Although lighting will appear to show while inserting lights into a map, the light is approximate should you change its properties or move it.  To get a correct render of the lights, re[[Legacy:Build|build]] your map: click on the little 'lightBulb' icon in the UnrealEd [[Legacy:Toolbar|toolbar]].

==Changing Light Properties==

The procedure for changing a lights' property is:

# Right-click the light and go to the [[Legacy:Actor Properties Window|Actor Properties Window]]
# Expand the property
# Drag the slider with the mouse or enter a number

==Essential Properties==

Summary here:

{|

|-
|'''Property
|'''Description
|'''Location
|'''UT
|'''UT2k3
|-
|Radius
|Changes the spherical area size the light can affect. The default light radius is 64 and is usually either too big or too small.
|Lighting -&gt; LightRadius
|*
|*
|-
|Color &amp; Brightness
|Sets the light brightness, [[colors
|color]] and ''depth'' or ''richness'' the color.  By clicking the ''Color'' button in the upper right corner of the key, a color can be selected visually.
|LightColor -&gt; LightBrightness, LightHue, LightSaturation
|*
|*
|-
|[[Legacy:Corona|Corona]]
|Used to show a corona from the light source. Not to be mistaken for a [[Legacy:Lens Flare|Lens Flare]].
|Lighting -&gt; bCorona
|*
|*
|-
|[[Legacy:Fog|Fog]]
|Depth of vision per map or [[Legacy:Zone|zone]]
|Lighting -&gt; VolumeBright,VolumeFog,VolumeRadius
|*
|-
|-
|Special Lit
|Allows a light to affect only certain surfaces. See [[Legacy:Special Lit|special lit]] for more.
|Lighting -&gt; SpecialLit
|*
|*
|-
|Light Types
|shapes and movement
|Lighting -&gt; LightType
|*
|[[Legacy:Projector|projector]]
|-
|Light Effects
|Modulates brightness
|Lighting -&gt; LightEffect
|*
|[[Legacy:Projector|projector]]
|-
|Light phase
|Sets start of cycle for light animation.  Used with LightEffects and LightTypes.
|Lighting -&gt; bLightPhase
|*
|?
|-
|Cycled colors
|Texture palette effect
|location
|*
|?
|-
|Movable
|Allows light to be movable when attached to a [[Legacy:Mover|mover]]
|Advanced -&gt; bMovable
|*
|*
|}

Fool around with different values to achieve the look you desire.  See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to see all the property details that can be changed. 

===Things to write about (in here?) ===
*Light types(cylinder)
*Light Effects (torchwaver)
*Using in addition to fog

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for everything on lighting
* Creating light animations
* Creating textures for cycled colors

----

==Comments==

'''ViKTiM:''' I have found that a lot of lights with a colour saturation of 0 screw your frame rate considerably, USE THEM SPARINGLY!!

'''Tarquin:''' Great :D  Should we link [[Legacy:Actor/Lighting|Actor/Lighting]] too?

'''Sobiwan:''' I dunno; I dont use UT2k3.  :(

'''Shuriken:''' Half updated table for 2k3... don't do much lighting though, so don't know it all.</text>
    </revision>
    <revision>
      <id>4115</id>
      <timestamp>2003-11-28T21:54:00Z</timestamp>
      <contributor>
        <ip>Danbo Daxter</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Adding light to a level is one of the key steps of creating a beautiful and complete map. Lighting shouldn't be used soley to provide light to your work, but to create atmosphere, enhance textures, and complement textures. 

==Let There Be Light!==

To add a light to your map do one of the following:
* Right-click the surface you want the light to appear on, and select [[Legacy:Surface Context Menu|Surface Context Menu]] -&gt; Add Light here.
* Hold down the '''L''' key and left-click in a 3D Viewport.

===Positioning Lights===

Once you have lights in a map you can duplicate them the same as any other actor.  You can move the light easlily with Control + left mouse in the 2D viewports.  It can also be moved in the 3D viewport, but the [[Legacy:Mouse Control|mouse control]] is a little more involved.

===Approximate Versus Exact Light===

Although lighting will appear to show while inserting lights into a map, the light is approximate should you change its properties or move it.  To get a correct render of the lights, re[[Legacy:Build|build]] your map: click on the little 'lightBulb' icon in the UnrealEd [[Legacy:Toolbar|toolbar]].

==Changing Light Properties==

The procedure for changing a lights' property is:

# Right-click the light and go to the [[Legacy:Actor Properties Window|Actor Properties Window]]
# Expand the property
# Drag the slider with the mouse or enter a number

==Essential Properties==

Summary here:

{|

|-
|'''Property
|'''Description
|'''Location
|'''UT
|'''UT2k3
|-
|Radius
|Changes the spherical area size the light can affect. The default light radius is 64 and is usually either too big or too small.
|Lighting -&gt; LightRadius
|*
|*
|-
|Color &amp; Brightness
|Sets the light brightness, [[colors
|color]] and ''depth'' or ''richness'' the color.  By clicking the ''Color'' button in the upper right corner of the key, a color can be selected visually.
|LightColor -&gt; LightBrightness, LightHue, LightSaturation
|*
|*
|-
|[[Legacy:Corona|Corona]]
|Used to show a corona from the light source. Not to be mistaken for a [[Legacy:Lens Flare|Lens Flare]].
|Lighting -&gt; bCorona
|*
|*
|-
|[[Legacy:Fog|Fog]]
|Depth of vision per map or [[Legacy:Zone|zone]]
|Lighting -&gt; VolumeBright,VolumeFog,VolumeRadius
|*
|-
|-
|Special Lit
|Allows a light to affect only certain surfaces. See [[Legacy:Special Lit|special lit]] for more.
|Lighting -&gt; SpecialLit
|*
|*
|-
|Light Types
|shapes and movement
|Lighting -&gt; LightType
|*
|[[Legacy:Projector|projector]]
|-
|Light Effects
|Modulates brightness
|Lighting -&gt; LightEffect
|*
|[[Legacy:Projector|projector]]
|-
|Light phase
|Sets start of cycle for light animation.  Used with LightEffects and LightTypes.
|Lighting -&gt; bLightPhase
|*
|?
|-
|Cycled colors
|Texture palette effect
|location
|*
|?
|-
|Movable
|Allows light to be movable when attached to a [[Legacy:Mover|mover]]
|Advanced -&gt; bMovable
|*
|*
|}

Fool around with different values to achieve the look you desire.  See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to see all the property details that can be changed. 

===Things to write about (in here?) ===
*Light types(cylinder)
*Using in addition to fog

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for everything on lighting
* Creating light animations
* Creating textures for cycled colors
* [[Legacy:Light Effects|Light Effects]]

----

==Comments==

'''ViKTiM:''' I have found that a lot of lights with a colour saturation of 0 screw your frame rate considerably, USE THEM SPARINGLY!!

'''Tarquin:''' Great :D  Should we link [[Legacy:Actor/Lighting|Actor/Lighting]] too?

'''Sobiwan:''' I dunno; I dont use UT2k3.  :(

'''Shuriken:''' Half updated table for 2k3... don't do much lighting though, so don't know it all.</text>
    </revision>
    <revision>
      <id>42671</id>
      <timestamp>2010-03-18T22:06:59Z</timestamp>
      <contributor>
        <ip>190.178.4.167</ip>
      </contributor>
      <comment>/* Essential Properties */</comment>
      <text xml:space="preserve">Adding light to a level is one of the key steps of creating a beautiful and complete map. Lighting shouldn't be used solely to provide light to your work, but to create atmosphere, enhance textures, and complement textures. 

==Let There Be Light!==

To add a light to your map do one of the following:
* Right-click the surface you want the light to appear on, and select [[Legacy:Surface Context Menu|Surface Context Menu]] -&gt; Add Light here.
* Hold down the '''L''' key and left-click in a 3D Viewport.

===Positioning Lights===

Once you have lights in a map you can duplicate them the same as any other actor.  You can move the light easlily with Control + left mouse in the 2D viewports.  It can also be moved in the 3D viewport, but the [[Legacy:Mouse Control|mouse control]] is a little more involved.

===Approximate Versus Exact Light===

Although lighting will appear to show while inserting lights into a map, the light is approximate should you change its properties or move it.  To get a correct render of the lights, re[[Legacy:Build|build]] your map: click on the little 'lightBulb' icon in the UnrealEd [[Legacy:Toolbar|toolbar]].

==Changing Light Properties==

The procedure for changing a lights' property is:

# Right-click the light and go to the [[Legacy:Actor Properties Window|Actor Properties Window]]
# Expand the property
# Drag the slider with the mouse or enter a number

==Essential Properties==

Summary here:

{|

|-
|'''Property
|'''Description
|'''Location
|'''UT
|'''UT2k3
|-
|Radius
|Changes the spherical area size the light can affect. The default light radius is 64 and is usually either too big or too small.
|Lighting -&gt; LightRadius
|*
|*
|-
|Color &amp; Brightness
|Sets the light brightness, [[colors|color]] and ''depth'' or ''richness'' the color.  By clicking the ''Color'' button in the upper right corner of the key, a color can be selected visually.
|LightColor -&gt; LightBrightness, LightHue, LightSaturation
|*
|*
|-
|[[Legacy:Corona|Corona]]
|Used to show a corona from the light source. Not to be mistaken for a [[Legacy:Lens Flare|Lens Flare]].
|Lighting -&gt; bCorona
|*
|*
|-
|[[Legacy:Fog|Fog]]
|Depth of vision per map or [[Legacy:Zone|zone]]
|Lighting -&gt; VolumeBright,VolumeFog,VolumeRadius
|*
|-
|-
|Special Lit
|Allows a light to affect only certain surfaces. See [[Legacy:Special Lit|special lit]] for more.
|Lighting -&gt; SpecialLit
|*
|*
|-
|Light Types
|shapes and movement
|Lighting -&gt; LightType
|*
|[[Legacy:Projector|projector]]
|-
|Light Effects
|Modulates brightness
|Lighting -&gt; LightEffect
|*
|[[Legacy:Projector|projector]]
|-
|Light phase
|Sets start of cycle for light animation.  Used with LightEffects and LightTypes.
|Lighting -&gt; bLightPhase
|*
|?
|-
|Cycled colors
|Texture palette effect
|location
|*
|?
|-
|Movable
|Allows light to be movable when attached to a [[Legacy:Mover|mover]]
|Advanced -&gt; bMovable
|*
|*
|}

Fool around with different values to achieve the look you desire.  See [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]] to see all the property details that can be changed. 

===Things to write about (in here?) ===
*Light types(cylinder)
*Using in addition to fog

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for everything on lighting
* Creating light animations
* Creating textures for cycled colors
* [[Legacy:Light Effects|Light Effects]]

----

==Comments==

'''ViKTiM:''' I have found that a lot of lights with a colour saturation of 0 screw your frame rate considerably, USE THEM SPARINGLY!!

'''Tarquin:''' Great :D  Should we link [[Legacy:Actor/Lighting|Actor/Lighting]] too?

'''Sobiwan:''' I dunno; I dont use UT2k3.  :(

'''Shuriken:''' Half updated table for 2k3... don't do much lighting though, so don't know it all.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lighting Strategies</title>
    <id>1723</id>
    <revision>
      <id>4244</id>
      <timestamp>2007-01-08T10:31:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">So you want to be hailed for great [[Legacy:Lighting|lighting]] in your map?  You have to understand how real light works and what tools are available in Unreal to emulate it.

''This page describes techniques for UnrealEngine 1 games. UnrealEngine 2 and above may provide better solutions for some problems described here.''

==Understanding How Light Works==

Since Unreal lights do not follow real light physics, its lighting can easily look fake.  However, there are a variety of Unreal lights that can make lighting look real.  It is first helpful to understand how real light works.

* parallel light rays, such as [[Legacy:Sunlight|sunlight]], create hard edged shadows
* refracted light rays due to overcast skies or [[Legacy:Fog|fog]] create soft edged shadows
* light fades exponentially in air (it gets darker as it distance from the source increases)
* light generally scatters in all directions
* light bounces off surfaces
* light is absorbed by surfaces
* light carries a surface's color 
* light sources have a distinct color temperature
* light sources have a small but bright ''hotspot'' 

==The Primary Light Types ==

As you master lighting with Unreal, you will find the majority of your light combinations will be only two.  All lights will be affected by the minor tools:
* radius
* [[Legacy:Colors|colors]] 
* brightness 

[[Image:Legacy_light.steady.gif|left|Light Type: Steady, Light Type: None]]

The steady light with no effect has a quick falloff to the unbra shadow.  Since only a small portion of the radius is lit (what we call a hotspot) and a large portion is in shadow, it is a good type to use for 'atmosphere' or 'mood' because it will highlight a specific area while coloring everything around it with just enough light to make it visible, yet dark enough to be threatening.

{|

|}

[[Image:Legacy_light.nonincidence.gif|left|Light Type: Steady, Light Effect: Non-Incidence]]

The opposite of the steady/none light is the steady, non-incidence light.  It emphasizes the hotspot by spreading it out over a wide area then quickly falling off into the shadow umbra.  It is a good choice to light a large area smoothly without making things to light or dark.

[[Image:Legacy_light.cylinder.gif|left|Light Steady Light Effect: Cylinder]]

The cylinder is worth mentioning because it is primarily used when even floor lighting is desired, especially on [[Legacy:Terrain|terrain]] in [[Legacy:UT|UT]].  However, UT2003 uses a better method with the [[Legacy:Sunlight|Sunlight]] actor.

==Faking realistic light==

By considering real light characterstics, the following technique demonstrates how to closely mimic real lighting in Unreal.  

{|

|}

[[Image:Legacy_real.light1.jpeg|left|
This light is used as the hotspot.  It is not showing the torch graphic because its texture been changed to a [[Legacy:Corona|corona]] to imitate a flare.
* Radius: 8 (very small)
* Brightness: 255 (100%)
* Light Effect: Steady.  This light type fades to shadow starting almost at the center of the light source, which is why we cranked the brightness.  The small radius allows us to emphasize the hotspot.
]]

{|

|}

[[Image:Legacy_real.light2.jpeg|left|
This is our ''falloff'' light that scatters around.  
* Radius: 12 (small)
* Brightness: 96 (40%)
* Light Effect: Non-incidence.  This light type fades light very slowly then quickly fades to shadow at the edge of the light radius.  It is a good type to use when you want to light up an area smoothly but not overexpose surfaces.
]]

{|

|}

[[Image:Legacy_real.light3.jpeg|left|
This is our ''bounce'' light near the closest surface that reflects the light back onto the scene.  If this were a different colored wall, the dominate hue of that exture could be used on this light.  
* Radius: 24 (medium small)
* Brightness: 72 (33%)
* Light Effect: Non-incidence.  Same reasons. 
]]

{|

|}

====Things to Note====
* It takes a minimum of 2 lights (hotspot and falloff) to look good
* Bounced light isnt necessary, but adds to the realism effect
* One bounce light may be used if multiple lights in an concentrated area are used.  

===Fully lit lights on Gradient Shadowed Textures===

If you want a magnitude of light fixtures flush with a gradiantly shadowed surface surface, there is a few problems that need to be solved:
* Adding each light fixture into the surface as a solid creates BSP cuts
* Adding each light fixture 1 pixel from the surface as a nonsolid is tedious.  
* Each light fixture must have its own light actor and there is a limit (around 1000) that Unreal is limited to.
* Each light actor will light in a spherical or cylindrical radius, limiting your light fixture shapes and/or lighting undesired areas.

All of these issues can be solved.

{|

|}

[[Image:Legacy_unlit.light.mask.on.surface1.jpeg|left|]]


The surface fades from light to shadow nicely, but the rectangular light fixtures in shadow are darkening too. If we were to add a light for each fixture, we would run out of lights to use very quickly.


{|

|}

[[Image:Legacy_unlit.light.mask.on.surface2.jpeg|left|]]


* Add a [[Legacy:Nonsolid|nonsolid]] sheet 1 [[Legacy:Grid|grid]] unit away from the (blue) trim brush
* Make the sheet the same height or width as the the trim

(Remember that newer engine versions provide nifty features like [[Legacy:Shader|Shader]]s with self-illumination texture and mask that work a lot better than additional sheets in cases like this.)


{|

|}

[[Image:Legacy_unlit.light.mask.on.surface3.jpeg|left|]]


# The trim brush uses a texture that has the light fixture drawn in so it will appear flush (top arrow).
# The sheet brush uses a texture that only has the light fixture and the rest is masked (bottom arrow). This will allow the underlying texture to show through.


{|

|}

[[Image:Legacy_unlit.light.mask.on.surface4.jpeg|left|]]


* The sheet surface is set to both to mask and unlit.  This allows the lighting on the sheet to be full bright (keeping the lights bright) and the trim behind the mask to show the gradient of light to shadow.
* Only one light was used instead of one for each light fixture.


{|

|}

===Lights in a Dirty World===

When light is in an area of where minute particles are floating the air, we can see the light hitting those particles, resulting in a light beam.  3D engines dont account for air particles (yet), so they fake it.  In Unreal, they are called [[Legacy:Lightbox|lightbox]]es.  

Most mappers mix lightboxes with lights without beams.  By mixing the two types, it suggests that particles reside in a confined space. In reality, you would have all light sources in a given area show a beam at differnet intensities because of the particles floating in that area.  

Rather than make multiple itensity levels for various light sources, you can encompass all light sources with [[Legacy:Fog|fog]], placing light boxes inside the area and let the fog's density level suggest the particle boundary.

===Sky Light===

This is the easiest method for creating nice shadows.  Creating a skybox and sticking a grated (or glass criss-crossed with some sort of grating) window works with just about any (indoor) theme.  Once you've constructed the beams and grate architecture, stick a light behind them on the skybox surface.  Change its brightness, radius and light type and the beams will cast shadows onto your walls and floor.

===Wall Lights===

About the only thing I can think of for creating shadows in this sense is to make a corridor with pillars or supports running down it.  Put lights in between each pillar with high brightness and low radii.  Rebuild, and watch as each light spills out from the pillar and there is a shadowy area between the lights.

===Spotlights===

===Hard shadows===

===Cylindrical lighting===
* When it can be useful

==Conclusion==

To create shadows just about anywhere, just use high brightness, low radius lights.  They'll light a small area, making a sharp contrast between that light and the darker areas around it.  Just make sure that you allow enough light for gameplay purposes instead of focusing on atmosphere alone.  Darkness may be cool in single-player maps, but in multiplayer maps, it's best to give the players some light.

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all things light related
* You may find [[Legacy:Lighting Basics|Lighting Basics]] helpful
* Learn how to avoid [[Legacy:Lightmap Errors|lightmap errors]]

==Comments==

'''Sobiwan:''' I'm opening another can of worms.  :)

'''Tarquin:''' Seems like a good idea :)

'''Sobiwan:''' I read somewhere that you weren't good at lighting.  If that's true, we're gunna change all that!  :)

'''Tarquin:''' My problem is that the hotspot light never looks quite right - it always lights up things around the light fitting or even behind it, that shouldn't be. Nice terminology, by the way &amp;ndash; &quot;hotspot&quot;, etc. Makes it easier to absorb. Plus I find lighting so tedious and slow &amp;ndash; make tiny change, rebuild lighting... it still sucks, make tiny change, rebuild....etc

'''Sobiwan:''' Have you tried [[Legacy:Special Lit|special lit]] to control where light goes?

'''Sobiwan:''' merged &quot;Shadows&quot; here.

'''Ironblayde:''' Gah! There's a maximum on the number of light actors you can use? Can anyone confirm what this is, exactly, and whether there are any sneaky workaround aside from the one mentioned above? I'm going to be ''way'' over 1,000 at the rate I'm going on my map (UT, UnrealEd 2). :shocked: I know I've seen some maps over 1,000 before. CTF-LocustWind has 1,384, for example. Can anyone shed some light on this problem? (groan!)

More: This morning I decided to try an experiment, so I opened LocustWind and added 1,500 more lights to it. It took a long time to build, but build it did, and when I loaded it up in UT, sure enough, there were all kinds of colored spots that weren't there before, and dozens of coronas floating in midair. The final count was nearly 3,000 lights. What does this mean for the supposed light limit mentioned in this document? What's supposed to happen when you reach that maximum? Will UnrealEd pop up some kind of error message or something? It certainly seems to me that if a limit does exist, it's considerably higher than the estimate given on this page.

'''SuicideMissions{CLR}:''' It seems like that number (1000) is wrong. After all *any* actor can emit light by setting its properties under Lighting and LightColor. The only way that there could be a limit on lights is if there was a limit on instances of Actor. What *is* limited though, is the amount of resolution available for making light/shadow shapes on surfaces.

Sigh. Lighting is soooooooooo tedioius and really does not look very good. *IF ONLY EPIC WOULD MAKE A LIGHT PAINTER TOOL!!!* Imagine being able to paint light directly on your 3D suraces! They already made a terrain painting tool. Technically, I think a light painting tool would be easier to program than a terrain painter. Basically, it would just modify the lightmap in real time and you could select from a round brush, square brush, and maybe a couple more complex brushes (like a &quot;rough&quot; brush for painting surfaces that are rough). This would be so much less tedious than using light actors, and the results would be far closer to what the artist imagines.... just like Fine Painters!

'''MythOpus:''' The problem (if you did not use any light actors at all in your map) is that no actors in the level would be lit.  They would all be dark black unless the particular actor was set to unlit.  Using this light painting tool with lights would cause yet another problem.  They would light both bsp and actors, but that lighting might collide with the light you've created with the painting tool.  I guess it would be great if you could edit the light more efficiently though.  For example, telling exactly where the light beams can/can not go and how far the light can go before it gives absolutely no light off (i.e. stop a light beam in it's tracks in one area and not in another :D)  I think the lighting system is a lot worse now compared to that of Unreal Tournaments lighting system though.  With UT, I found there was a lot less light bleeding.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4245</id>
      <timestamp>2007-01-08T09:34:23Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>removed question.  Not so hard if you thought about it</comment>
      <text xml:space="preserve">So you want to be hailed for great [[Legacy:Lighting|lighting]] in your map?  You have to understand how real light works and what tools are available in Unreal to emulate it.

==Understanding How Light Works==

Since Unreal lights do not follow real light physics, its lighting can easily look fake.  However, there are a variety of Unreal lights that can make lighting look real.  It is first helpful to understand how real light works.

* parallel light rays, such as [[Legacy:Sunlight|sunlight]], create hard edged shadows
* refracted light rays due to overcast skies or [[Legacy:Fog|fog]] create soft edged shadows
* light fades exponentially in air (it gets darker as it distance from the source increases)
* light generally scatters in all directions
* light bounces off surfaces
* light is absorbed by surfaces
* light carries a surface's color 
* light sources have a distinct color temperature
* light sources have a small but bright ''hotspot'' 

==The Primary Light Types ==

As you master lighting with Unreal, you will find the majority of your light combinations will be only two.  All lights will be affected by the minor tools:
* radius
* [[Legacy:Colors|colors]] 
* brightness 

[[Image:Legacy_light.steady.gif|left|Light Type: Steady, Light Type: None]]

The steady light with no effect has a quick falloff to the unbra shadow.  Since only a small portion of the radius is lit (what we call a hotspot) and a large portion is in shadow, it is a good type to use for 'atmosphere' or 'mood' because it will highlight a specific area while coloring everything around it with just enough light to make it visible, yet dark enough to be threatening.

{|

|}

[[Image:Legacy_light.nonincidence.gif|left|Light Type: Steady, Light Effect: Non-Incidence]]

The opposite of the steady/none light is the steady, non-incidence light.  It emphasizes the hotspot by spreading it out over a wide area then quickly falling off into the shadow umbra.  It is a good choice to light a large area smoothly without making things to light or dark.

[[Image:Legacy_light.cylinder.gif|left|Light Steady Light Effect: Cylinder]]

The cylinder is worth mentioning because it is primarily used when even floor lighting is desired, especially on [[Legacy:Terrain|terrain]] in [[Legacy:UT|UT]].  However, UT2003 uses a better method with the [[Legacy:Sunlight|Sunlight]] actor.

==Faking realistic light==

By considering real light characterstics, the following technique demonstrates how to closely mimic real lighting in Unreal.  

{|

|}

[[Image:Legacy_real.light1.jpeg|left|
This light is used as the hotspot.  It is not showing the torch graphic because its texture been changed to a [[Legacy:Corona|corona]] to imitate a flare.
* Radius: 8 (very small)
* Brightness: 255 (100%)
* Light Effect: Steady.  This light type fades to shadow starting almost at the center of the light source, which is why we cranked the brightness.  The small radius allows us to emphasize the hotspot.
]]

{|

|}

[[Image:Legacy_real.light2.jpeg|left|
This is our ''falloff'' light that scatters around.  
* Radius: 12 (small)
* Brightness: 96 (40%)
* Light Effect: Non-incidence.  This light type fades light very slowly then quickly fades to shadow at the edge of the light radius.  It is a good type to use when you want to light up an area smoothly but not overexpose surfaces.
]]

{|

|}

[[Image:Legacy_real.light3.jpeg|left|
This is our ''bounce'' light near the closest surface that reflects the light back onto the scene.  If this were a different colored wall, the dominate hue of that exture could be used on this light.  
* Radius: 24 (medium small)
* Brightness: 72 (33%)
* Light Effect: Non-incidence.  Same reasons. 
]]

{|

|}

====Things to Note====
* It takes a minimum of 2 lights (hotspot and falloff) to look good
* Bounced light isnt necessary, but adds to the realism effect
* One bounce light may be used if multiple lights in an concentrated area are used.  

===Fully lit lights on Gradient Shadowed Textures===

If you want a magnitude of light fixtures flush with a gradiantly shadowed surface surface, there is a few problems that need to be solved:
* Adding each light fixture into the surface as a solid creates BSP cuts
* Adding each light fixture 1 pixel from the surface as a nonsolid is tedious.  
* Each light fixture must have its own light actor and there is a limit (around 1000) that Unreal is limited to.
* Each light actor will light in a spherical or cylindrical radius, limiting your light fixture shapes and/or lighting undesired areas.

All of these issues can be solved.

{|

|}

[[Image:Legacy_unlit.light.mask.on.surface1.jpeg|left|]]


The surface fades from light to shadow nicely, but the rectangular light fixtures in shadow are darkening too. If we were to add a light for each fixture, we would run out of lights to use very quickly.


{|

|}

[[Image:Legacy_unlit.light.mask.on.surface2.jpeg|left|]]


* Add a [[Legacy:Nonsolid|nonsolid]] sheet 1 [[Legacy:Grid|grid]] unit away from the (blue) trim brush
* Make the sheet the same height or width as the the trim


{|

|}

[[Image:Legacy_unlit.light.mask.on.surface3.jpeg|left|]]


# The trim brush uses a texture that has the light fixture drawn in so it will appear flush (top arrow).
# The sheet brush uses a texture that only has the light fixture and the rest is masked (bottom arrow). This will allow the underlying texture to show through.


{|

|}

[[Image:Legacy_unlit.light.mask.on.surface4.jpeg|left|]]


* The sheet surface is set to both to mask and unlit.  This allows the lighting on the sheet to be full bright (keeping the lights bright) and the trim behind the mask to show the gradient of light to shadow.
* Only one light was used instead of one for each light fixture.


{|

|}

===Lights in a Dirty World===

When light is in an area of where minute particles are floating the air, we can see the light hitting those particles, resulting in a light beam.  3D engines dont account for air particles (yet), so they fake it.  In Unreal, they are called [[Legacy:Lightbox|lightbox]]es.  

Most mappers mix lightboxes with lights without beams.  By mixing the two types, it suggests that particles reside in a confined space. In reality, you would have all light sources in a given area show a beam at differnet intensities because of the particles floating in that area.  

Rather than make multiple itensity levels for various light sources, you can encompass all light sources with [[Legacy:Fog|fog]], placing light boxes inside the area and let the fog's density level suggest the particle boundary.

===Sky Light===

This is the easiest method for creating nice shadows.  Creating a skybox and sticking a grated (or glass criss-crossed with some sort of grating) window works with just about any (indoor) theme.  Once you've constructed the beams and grate architecture, stick a light behind them on the skybox surface.  Change its brightness, radius and light type and the beams will cast shadows onto your walls and floor.

===Wall Lights===

About the only thing I can think of for creating shadows in this sense is to make a corridor with pillars or supports running down it.  Put lights in between each pillar with high brightness and low radii.  Rebuild, and watch as each light spills out from the pillar and there is a shadowy area between the lights.

===Spotlights===

===Hard shadows===

===Cylindrical lighting===
* When it can be useful

==Conclusion==

To create shadows just about anywhere, just use high brightness, low radius lights.  They'll light a small area, making a sharp contrast between that light and the darker areas around it.  Just make sure that you allow enough light for gameplay purposes instead of focusing on atmosphere alone.  Darkness may be cool in single-player maps, but in multiplayer maps, it's best to give the players some light.

==Related Topics==
* [[Legacy:Lighting|Lighting]] is the hub for all things light related
* You may find [[Legacy:Lighting Basics|Lighting Basics]] helpful
* Learn how to avoid [[Legacy:Lightmap Errors|lightmap errors]]

==Comments==

'''Sobiwan:''' I'm opening another can of worms.  :)

'''Tarquin:''' Seems like a good idea :)

'''Sobiwan:''' I read somewhere that you weren't good at lighting.  If that's true, we're gunna change all that!  :)

'''Tarquin:''' My problem is that the hotspot light never looks quite right - it always lights up things around the light fitting or even behind it, that shouldn't be. Nice terminology, by the way &amp;ndash; &quot;hotspot&quot;, etc. Makes it easier to absorb. Plus I find lighting so tedious and slow &amp;ndash; make tiny change, rebuild lighting... it still sucks, make tiny change, rebuild....etc

'''Sobiwan:''' Have you tried [[Legacy:Special Lit|special lit]] to control where light goes?

'''Sobiwan:''' merged &quot;Shadows&quot; here.

'''Ironblayde:''' Gah! There's a maximum on the number of light actors you can use? Can anyone confirm what this is, exactly, and whether there are any sneaky workaround aside from the one mentioned above? I'm going to be ''way'' over 1,000 at the rate I'm going on my map (UT, UnrealEd 2). :shocked: I know I've seen some maps over 1,000 before. CTF-LocustWind has 1,384, for example. Can anyone shed some light on this problem? (groan!)

More: This morning I decided to try an experiment, so I opened LocustWind and added 1,500 more lights to it. It took a long time to build, but build it did, and when I loaded it up in UT, sure enough, there were all kinds of colored spots that weren't there before, and dozens of coronas floating in midair. The final count was nearly 3,000 lights. What does this mean for the supposed light limit mentioned in this document? What's supposed to happen when you reach that maximum? Will UnrealEd pop up some kind of error message or something? It certainly seems to me that if a limit does exist, it's considerably higher than the estimate given on this page.

'''SuicideMissions{CLR}:''' It seems like that number (1000) is wrong. After all *any* actor can emit light by setting its properties under Lighting and LightColor. The only way that there could be a limit on lights is if there was a limit on instances of Actor. What *is* limited though, is the amount of resolution available for making light/shadow shapes on surfaces.

Sigh. Lighting is soooooooooo tedioius and really does not look very good. *IF ONLY EPIC WOULD MAKE A LIGHT PAINTER TOOL!!!* Imagine being able to paint light directly on your 3D suraces! They already made a terrain painting tool. Technically, I think a light painting tool would be easier to program than a terrain painter. Basically, it would just modify the lightmap in real time and you could select from a round brush, square brush, and maybe a couple more complex brushes (like a &quot;rough&quot; brush for painting surfaces that are rough). This would be so much less tedious than using light actors, and the results would be far closer to what the artist imagines.... just like Fine Painters!

'''MythOpus:''' The problem (if you did not use any light actors at all in your map) is that no actors in the level would be lit.  They would all be dark black unless the particular actor was set to unlit.  Using this light painting tool with lights would cause yet another problem.  They would light both bsp and actors, but that lighting might collide with the light you've created with the painting tool.  I guess it would be great if you could edit the light more efficiently though.  For example, telling exactly where the light beams can/can not go and how far the light can go before it gives absolutely no light off (i.e. stop a light beam in it's tracks in one area and not in another :D)  I think the lighting system is a lot worse now compared to that of Unreal Tournaments lighting system though.  With UT, I found there was a lot less light bleeding.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightmap Errors</title>
    <id>1671</id>
    <revision>
      <id>4132</id>
      <timestamp>2007-08-08T10:45:45Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]]
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

[http://img69.imageshack.us/img69/3786/error27ex.jpg]

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4133</id>
      <timestamp>2006-04-16T07:25:40Z</timestamp>
      <contributor>
        <ip>Virgo47</ip>
      </contributor>
      <minor/>
      <comment>*added self-explanatory picture</comment>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]] 
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

[http://img69.imageshack.us/img69/3786/error27ex.jpg]

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4134</id>
      <timestamp>2007-08-08T10:37:14Z</timestamp>
      <contributor>
        <ip>Dsl081-053-019.sfo1.dsl.speakeasy.net</ip>
      </contributor>
      <comment>*Lightmap Errors</comment>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]] [http://besttermpaper.com/ term paper] 
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

[http://img69.imageshack.us/img69/3786/error27ex.jpg]

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33420</id>
      <timestamp>2008-11-26T02:08:40Z</timestamp>
      <contributor>
        <username>Rejecht</username>
        <id>1657</id>
      </contributor>
      <comment>/* Unlit Surfaces */</comment>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]]
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Black Surfaces==

You notice that one surface of subtractive space becomes black--that is, the surface DOES NOT become Unlit (bright).

It has been observed that a Zone Portal sheet was involved with this issue.  The offending Zone Portal sheet was observed to be perpendicular to the side of the subtracted space(s) affected, where the Y location was close to that of the affected subtractive brush, and the X location was the same.  The Zone Portal sheet in question had a Z location higher in space.

The solution was to displace the Zone Portal sheet by as a little as one unreal unit (UU) on the X position.  The lighting error could then consistently be reproduced by moving the Zone Portal sheet back to its original X position.

Moving Zone Portal sheets is perhaps the easiest solution, if applicable, rather than affecting the architecture of the map, or having the engine render two sides of a surface, for instance.

'''rejecht:''' Can anyone verify that this solves this issue with their problem maps?  I'll see if I can add a picture example.

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

[http://img69.imageshack.us/img69/3786/error27ex.jpg]

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43324</id>
      <timestamp>2010-05-21T17:04:20Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the [http://www.besttermpaper.com term paper] map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]]
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Black Surfaces==

You notice that one surface of subtractive space becomes black--that is, the surface DOES NOT become Unlit (bright).

It has been observed that a Zone Portal sheet was involved with this issue.  The offending Zone Portal sheet was observed to be perpendicular to the side of the subtracted space(s) affected, where the Y location was close to that of the affected subtractive brush, and the X location was the same.  The Zone Portal sheet in question had a Z location higher in space.

The solution was to displace the Zone Portal sheet by as a little as one unreal unit (UU) on the X position.  The lighting error could then consistently be reproduced by moving the Zone Portal sheet back to its original X position.

Moving Zone Portal sheets is perhaps the easiest solution, if applicable, rather than affecting the architecture of the map, or having the engine render two sides of a surface, for instance.

'''rejecht:''' Can anyone verify that this solves this issue with their problem maps?  I'll see if I can add a picture example.

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

[http://img69.imageshack.us/img69/3786/error27ex.jpg]

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43325</id>
      <timestamp>2010-05-21T17:08:34Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <comment>/* Linux Lightmap Errors */</comment>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the [http://www.besttermpaper.com term paper] map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]]
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Black Surfaces==

You notice that one surface of subtractive space becomes black--that is, the surface DOES NOT become Unlit (bright).

It has been observed that a Zone Portal sheet was involved with this issue.  The offending Zone Portal sheet was observed to be perpendicular to the side of the subtracted space(s) affected, where the Y location was close to that of the affected subtractive brush, and the X location was the same.  The Zone Portal sheet in question had a Z location higher in space.

The solution was to displace the Zone Portal sheet by as a little as one unreal unit (UU) on the X position.  The lighting error could then consistently be reproduced by moving the Zone Portal sheet back to its original X position.

Moving Zone Portal sheets is perhaps the easiest solution, if applicable, rather than affecting the architecture of the map, or having the engine render two sides of a surface, for instance.

'''rejecht:''' Can anyone verify that this solves this issue with their problem maps?  I'll see if I can add a picture example.

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43338</id>
      <timestamp>2010-05-22T04:23:51Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:Rejecht|Rejecht]]</comment>
      <text xml:space="preserve">==Zebra Stripes==

On occasion, the lighting compiler will do some funky math and make the lightmaps too small for the face they are being applied to. The effect is a rather ugly &quot;zebra stripe&quot; effect on surfaces as the lightmap repeats itself many times over the face of the object. 

There are a few ways to fix this so that you don't have to re[[Legacy:Build|build]] the map.

===ZoneInfo===
# put a [[Legacy:ZoneInfo|ZoneInfo]] in the area in question 
# increase the zone's ambient lighting
# Rebuild the geometry and lighting
# If you didn't want ambient lighting there, you can always
#* remove the [[Legacy:ZoneInfo|ZoneInfo]]
#* set its Zone lighting to zero

===Manually move geometry===
# vertex edit the points of the surface to one position
#* Re-aligns the texture and clears the lighting. 
#* Doesn't work as often
#* tends to be hard to implement in large or complex areas.

===Other Tricks===
* Restart UnrealED and rebuild the lighting
* Turn off the 3D viewport and rebuild lighting

===Avoid the problem===
* wait on lighting an area until you are nearly done with the architecture
* if you want to see the lighting before you finish
*# save a copy of the map to some other name
*# apply lighting.

Reduce your test lighting time by adding the lights to a single group in the [[Legacy:Group Browser|group browser]].

==Unlit Surfaces==

===Whole Zone(s)===

If you have any ZoneInfo actors with '''bClearToFogColor''' set to ''true'', and then rebuild the lightning, all the surfaces in the affected zone(s) will be unlit, not in the sense that the surface is fully bright but that the surface won't have any light on it at all. To remedy the situation, set '''bClearToFogColor''' to ''false'', rebuild the lighting, then go back and change the affected zones back to normal.

===Random Surfaces===

There are some occasions when one (or few adjacent coplanar) surfaces got unlit randomly and there is no proper way how to fix it. You can move brushes sometimes, recreate it, but when nothing helps (or you don't want to move brushes), simply check screwed surfaces as Two Sided. That workes in most cases (after rebuild of course).

==Black Surfaces==

You notice that one surface of subtractive space becomes black--that is, the surface DOES NOT become Unlit (bright).

It has been observed that a Zone Portal sheet was involved with this issue.  The offending Zone Portal sheet was observed to be perpendicular to the side of the subtracted space(s) affected, where the Y location was close to that of the affected subtractive brush, and the X location was the same.  The Zone Portal sheet in question had a Z location higher in space.

The solution was to displace the Zone Portal sheet by as a little as one unreal unit (UU) on the X position.  The lighting error could then consistently be reproduced by moving the Zone Portal sheet back to its original X position.

Moving Zone Portal sheets is perhaps the easiest solution, if applicable, rather than affecting the architecture of the map, or having the engine render two sides of a surface, for instance.

'''rejecht:''' Can anyone verify that this solves this issue with their problem maps?  I'll see if I can add a picture example.

==Linux Lightmap Errors==

Linux is minor gaming platform, so you can omit this when you considering lightmap issues. Problem relates to RGB8 lightmap. Ugly bright partial circles appears in certain distance from light sources and thay look really bad. There is NO problem on Windows client thou and no problem when using DXT3 either (DXT1 is not recommanded elsewhere). Still it appears that RGB8 is best in quality and with compression (that is used in case of lightmaps) is also smaller than DXT3. Problem was discovered on both nVidia and ATI cards, so it looks like it is not related to card, but to some lightmap processing in Linux client (valid for 3369).

Here's the picture from Linux client (map DM-Getherto):

[http://img69.imageshack.us/img69/3786/error27ex.jpg]

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightmapper</title>
    <id>1701</id>
    <revision>
      <id>4202</id>
      <timestamp>2003-05-04T18:51:05Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>hmm.</comment>
      <text xml:space="preserve">I think any mapper need this device. At least us who can't use Maya, can't find Lightwave and think 3DSM is too exreme. Like me.

==The Plan ==

Basically, it should be able to do this:
* Import .3ds, .dxf (...) models.
* Import the skinmap for the model.
* Put up at least one light at any (well, &quot;any&quot;) distance (uu (and meters?)).
* Export a .tga file with the shadows on a transparant background, for easy copy/paste.

====Other stuff that would be good ====
*Auto-unwrapping.
*Put the shadow on the done skin.
*A bunch of options.
*Anything else needed, apart from a healty dose of bugs and crashes.

==Intrested? ==

Code away! Let us know if you do!

==Comments ==

'''Mychaeel:''' I'd expect it is ''extremely'' unlikely that some programmer will come by and code this thing for you &amp;ndash; especially given the fact that it would be highly redundant to existing software, and much less than trivial to code.  I suggest you post that thought in a forum, not here.</text>
    </revision>
    <revision>
      <id>4203</id>
      <timestamp>2003-05-04T17:59:37Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>Damn I need this!</comment>
      <text xml:space="preserve">I think any mapper need this device. At least us who can't use Maya, can't find Lightwave and think 3DSM is too exreme. Like me.

==The Plan ==

Basically, it should be able to do this:
* Import .3ds, .dxf (...) models.
* Import the skinmap for the model.
* Put up at least one light at any (well, &quot;any&quot;) distance (uu (and meters?)).
* Export a .tga file with the shadows on a transparant background, for easy copy/paste.

====Other stuff that would be good ====
*Auto-unwrapping.
*Put the shadow on the done skin.
*A bunch of options.
*Anything else needed, apart from a healty dose of bugs and crashes.

==Intrested? ==

Code away! Let us know if you do!

==Comments ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightning Storm</title>
    <id>1665</id>
    <revision>
      <id>4116</id>
      <timestamp>2003-05-25T09:51:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==Introduction ==

Since I'm working on a level which has a Lightning Storm in it, I thought I might as well add a tutorial about it here ;)

The first basic setup came from 'Master Builder', one of the best mappers I know. Though he doesn't often release a level :/

The basic idea is quite easy, but adding the final touches and configuring it all 'just' right, can take a bit of time. But don't worry, I'll tell you exactly how I did it in my level.

For the Lightning Storm you'll need to add several new actors to your level. Depending on how 'real' you want it to be, you may discard a few of these actors. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:StochasticTrigger|StochasticTrigger]]: These are the start of it all and will control the whole Storm.
* [[Legacy:TriggerLight|TriggerLight]]: These are going to be used to add visible Lightning to the level.
* [[Legacy:SpecialEvent|SpecialEvent]]: Will be used to play sounds which all players hear.
* [[Legacy:Dispatcher|Dispatcher]]: Will trigger a chain of events (for example: lightning-sound, followed by visual lightning, followed by another sound,...).

==Let's get to work ==

===TriggerLights ===

Add a TriggerLight in your skybox, where you want the lightning to originate from. Also add one or more TriggerLights in the actual level. These should be put in at such a position that they are at the 'same' position as the one in the skybox. In my own level I added two TriggerLights (one right under the other), because it's a rather large outside area and only one TriggerLight didn't quite gave the desired Lightning flashes.

Once placed in the level, open their properties and make sure these settings are as stated.

* Lightcolor:
** LightBrightness: 128-254
** LightHue: 0
** LightSaturation: 255
* Lighting:
** LightEffect: LE_Cylinder
** LightRadius: 254
* Object:
** InitialState: TriggerToggle
* Triggerlight:
** bDelayFullOn: False
** bInitiallyOn: False
** ChangeTime: 0.00000000
** RemainOnTime: 0.50000000

Also give all TriggerLights the same tag (for example: Lightning :)).

=== SpecialEvents ====

I added 7 SpecialEvents to my level. All of them have InitialState set to PlayersPlaySoundEffect. Below you can find exactly how I configured all of these SpecialEvents. But the bottom line is that 4 of them will have LightningSounds and the 3 final ones will have ThunderSounds.

&lt;i&gt;Note:&lt;/i&gt; The naming I used for the Tag's aren't the best ones :(

* SpecialEvent 1:
** Events:
*** Tag: Thunder0
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn2a'
* SpecialEvent 2:
** Events:
*** Tag: Thunder1
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn3a'
* SpecialEvent 3:
** Events:
*** Tag: Thunder2
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn4a'
* SpecialEvent 4:
** Events:
*** Tag: Thunder3
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn1a'

* SpecialEvent 5:
** Events:
*** Tag: Atmos_Thunder1 &lt;i&gt;(see why my naming ain't the best ;))&lt;/i&gt;
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thund1'
* SpecialEvent 6:
** Events:
*** Tag: Atmos_Thunder2
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thunder'
* SpecialEvent 7:
** Events:
*** Tag: Atmos_Thunder3
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thunder4'

===Dispatchers ===

I added 4 Dispatchers to my level.

* Dispatcher1:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
*** OutEvents:
**** [0]: Thunder0
** Events:
*** Tag: atmosphere0
* Dispatcher2:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
*** OutEvents:
**** [0]: Thunder2
**** [1]: Thunder1
** Events:
*** Tag: atmosphere1
* Dispatcher3:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
**** [2]: 0.0000000
*** OutEvents:
**** [0]: Lightning
**** [1]: Lightning
**** [2]: Thunder2
** Events:
*** Tag: atmosphere2
* Dispatcher4:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
**** [2]: 0.0000000
**** [3]: 0.0000000
**** [4]: 0.0000000
**** [5]: 0.0000000
*** OutEvents:
**** [0]: Lightning
**** [1]: Lightning
**** [2]: Thunder3
**** [3]: Lightning
**** [4]: Lightning
**** [5]: Thunder3
** Events:
*** Tag: atmosphere3

===StochasticTriggers ===

Now to put it all in motion :D

In my level, I used two StochasticTriggers. The first one is the one causing the LightningSounds and Lightning, while the second one causes a more general rumbling in the background (ThunderSounds with lower volumes). You are free to combine these two StochasticTriggers into one if you want to ;)

Anyway, so add two StochasticTriggers to your level. They can be anywhere in the level.

Make sure both StochasticTriggers have AlwaysActive as [[Legacy:InitialState|InitialState]]!

* StochasticTrigger1 (Thunder)
** Events: &lt;i&gt;(here go the SpecialEvents with Thundersounds)&lt;/i&gt;
*** [0]: Atmos_Thunder1
*** [1]: Atmos_Thunder2
*** [2]: Atmos_Thunder3
** maxRecheckTime: 10.0000000
** minRecheckTime: 2.0000000
** triggerProbability: 5.0000000
* StochasticTrigger2 (Lightning)
** Events: &lt;i&gt;(here go the Dispatchers for the Lightning Effects)&lt;/i&gt;
*** [0]: atmosphere0
*** [1]: atmosphere1
*** [2]: atmosphere2
*** [3]: atmosphere3
** maxRecheckTime: 30.0000000
** minRecheckTime: 5.0000000
** triggerProbability: 5.0000000

==Conclusion ==

You're basically done :) Boot your level and enjoy a rather scary Lightning Storm.

This is just how I did the lightning in my level. You are free to experiment with it, adding more Dispatchers (for more diverse LightningEffects), changing LightningSounds and ThunderSounds,...

==Notes ==

I did notice that with all these SpecialEvents etc, the Voice Taunts from UT sometimes get cut off :/ Probably this is caused by UT not having enough channels for sound or so. I don't know.

==Comments ==

Place your comments on this tutorial here :).

:''The sound problem is caused by the ClientPlaySound method used in the PlayersPlaySoundEffect state of the SpecialEvents. This overrides the taunting sounds which are played through the same method.&lt;br /&gt;Maybe another kind of triggerable sound effect could solve this problem? &amp;ndash; [[Legacy:Wormbo|Wormbo]]''
::''Ah, but what other triggerable (and working) sound effect actors are there? I tried sumtin called TriggeredAmbientSound, but it doesn't seem to work :( &amp;ndash; [[Legacy:The G.O.A.T|the G.o.a.T]]''
: Look at [[Legacy:Triggering Sounds|Triggering Sounds]], that explains the various methods.  &amp;ndash; ''Tarquin'' 
::''The TriggeredAmbientSounds seem to work, but I don't see a way to implement this storm with those. Because the SpecialEvents Initialstate makes sure all players hear the sound, while this one is only in the actor's radius. Guess the SpecialEvents have to stay then ;) &amp;ndash; [[Legacy:The G.O.A.T|the G.o.a.T]]''
: I guess the easy way to solve this would be to make the TriggeredAmbientSound's radius enclose your entire map. &amp;ndash; ''[[Legacy:2D.Cube|2D.Cube]]''

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4117</id>
      <timestamp>2002-07-21T12:52:03Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>Category Tutorial</comment>
      <text xml:space="preserve">==Introduction ==

Since I'm working on a level which has a Lightning Storm in it, I thought I might as well add a tutorial about it here ;)

The first basic setup came from 'Master Builder', one of the best mappers I know. Though he doesn't often release a level :/

The basic idea is quite easy, but adding the final touches and configuring it all 'just' right, can take a bit of time. But don't worry, I'll tell you exactly how I did it in my level.

For the Lightning Storm you'll need to add several new actors to your level. Depending on how 'real' you want it to be, you may discard a few of these actors. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:StochasticTrigger|StochasticTrigger]]: These are the start of it all and will control the whole Storm.
* [[Legacy:TriggerLight|TriggerLight]]: These are going to be used to add visible Lightning to the level.
* [[Legacy:SpecialEvent|SpecialEvent]]: Will be used to play sounds which all players hear.
* [[Legacy:Dispatcher|Dispatcher]]: Will trigger a chain of events (for example: lightning-sound, followed by visual lightning, followed by another sound,...).

==Let's get to work ==

===TriggerLights ===

Add a TriggerLight in your skybox, where you want the lightning to originate from. Also add one or more TriggerLights in the actual level. These should be put in at such a position that they are at the 'same' position as the one in the skybox. In my own level I added two TriggerLights (one right under the other), because it's a rather large outside area and only one TriggerLight didn't quite gave the desired Lightning flashes.

Once placed in the level, open their properties and make sure these settings are as stated.

* Lightcolor:
** LightBrightness: 128-254
** LightHue: 0
** LightSaturation: 255
* Lighting:
** LightEffect: LE_Cylinder
** LightRadius: 254
* Object:
** InitialState: TriggerToggle
* Triggerlight:
** bDelayFullOn: False
** bInitiallyOn: False
** ChangeTime: 0.00000000
** RemainOnTime: 0.50000000

Also give all TriggerLights the same tag (for example: Lightning :)).

=== SpecialEvents ====

I added 7 SpecialEvents to my level. All of them have InitialState set to PlayersPlaySoundEffect. Below you can find exactly how I configured all of these SpecialEvents. But the bottom line is that 4 of them will have LightningSounds and the 3 final ones will have ThunderSounds.

&lt;i&gt;Note:&lt;/i&gt; The naming I used for the Tag's aren't the best ones :(

* SpecialEvent 1:
** Events:
*** Tag: Thunder0
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn2a'
* SpecialEvent 2:
** Events:
*** Tag: Thunder1
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn3a'
* SpecialEvent 3:
** Events:
*** Tag: Thunder2
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn4a'
* SpecialEvent 4:
** Events:
*** Tag: Thunder3
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn1a'

* SpecialEvent 5:
** Events:
*** Tag: Atmos_Thunder1 &lt;i&gt;(see why my naming ain't the best ;))&lt;/i&gt;
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thund1'
* SpecialEvent 6:
** Events:
*** Tag: Atmos_Thunder2
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thunder'
* SpecialEvent 7:
** Events:
*** Tag: Atmos_Thunder3
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thunder4'

===Dispatchers ===

I added 4 Dispatchers to my level.

* Dispatcher1:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
*** OutEvents:
**** [0]: Thunder0
** Events:
*** Tag: atmosphere0
* Dispatcher2:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
*** OutEvents:
**** [0]: Thunder2
**** [1]: Thunder1
** Events:
*** Tag: atmosphere1
* Dispatcher3:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
**** [2]: 0.0000000
*** OutEvents:
**** [0]: Lightning
**** [1]: Lightning
**** [2]: Thunder2
** Events:
*** Tag: atmosphere2
* Dispatcher4:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
**** [2]: 0.0000000
**** [3]: 0.0000000
**** [4]: 0.0000000
**** [5]: 0.0000000
*** OutEvents:
**** [0]: Lightning
**** [1]: Lightning
**** [2]: Thunder3
**** [3]: Lightning
**** [4]: Lightning
**** [5]: Thunder3
** Events:
*** Tag: atmosphere3

===StochasticTriggers ===

Now to put it all in motion :D

In my level, I used two StochasticTriggers. The first one is the one causing the LightningSounds and Lightning, while the second one causes a more general rumbling in the background (ThunderSounds with lower volumes). You are free to combine these two StochasticTriggers into one if you want to ;)

Anyway, so add two StochasticTriggers to your level. They can be anywhere in the level.

Make sure both StochasticTriggers have AlwaysActive as [[Legacy:InitialState|InitialState]]!

* StochasticTrigger1 (Thunder)
** Events: &lt;i&gt;(here go the SpecialEvents with Thundersounds)&lt;/i&gt;
*** [0]: Atmos_Thunder1
*** [1]: Atmos_Thunder2
*** [2]: Atmos_Thunder3
** maxRecheckTime: 10.0000000
** minRecheckTime: 2.0000000
** triggerProbability: 5.0000000
* StochasticTrigger2 (Lightning)
** Events: &lt;i&gt;(here go the Dispatchers for the Lightning Effects)&lt;/i&gt;
*** [0]: atmosphere0
*** [1]: atmosphere1
*** [2]: atmosphere2
*** [3]: atmosphere3
** maxRecheckTime: 30.0000000
** minRecheckTime: 5.0000000
** triggerProbability: 5.0000000

==Conclusion ==

You're basically done :) Boot your level and enjoy a rather scary Lightning Storm.

This is just how I did the lightning in my level. You are free to experiment with it, adding more Dispatchers (for more diverse LightningEffects), changing LightningSounds and ThunderSounds,...

==Notes ==

I did notice that with all these SpecialEvents etc, the Voice Taunts from UT sometimes get cut off :/ Probably this is caused by UT not having enough channels for sound or so. I don't know.

==Comments ==

Place your comments on this tutorial here :).

:''The sound problem is caused by the ClientPlaySound method used in the PlayersPlaySoundEffect state of the SpecialEvents. This overrides the taunting sounds which are played through the same method.&lt;br /&gt;Maybe another kind of triggerable sound effect could solve this problem? &amp;ndash; [[Legacy:Wormbo|Wormbo]]''
::''Ah, but what other triggerable (and working) sound effect actors are there? I tried sumtin called TriggeredAmbientSound, but it doesn't seem to work :( &amp;ndash; [[Legacy:The G.O.A.T|the G.o.a.T]]''
: Look at [[Legacy:Triggering Sounds|Triggering Sounds]], that explains the various methods.  &amp;ndash; ''Tarquin'' 
::''The TriggeredAmbientSounds seem to work, but I don't see a way to implement this storm with those. Because the SpecialEvents Initialstate makes sure all players hear the sound, while this one is only in the actor's radius. Guess the SpecialEvents have to stay then ;) &amp;ndash; [[Legacy:The G.O.A.T|the G.o.a.T]]''

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] topic page
* [[:Category:Legacy Tutorial]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4118</id>
      <timestamp>2002-08-28T03:15:14Z</timestamp>
      <contributor>
        <ip>2D.Cube</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

Since I'm working on a level which has a Lightning Storm in it, I thought I might as well add a tutorial about it here ;)

The first basic setup came from 'Master Builder', one of the best mappers I know. Though he doesn't often release a level :/

The basic idea is quite easy, but adding the final touches and configuring it all 'just' right, can take a bit of time. But don't worry, I'll tell you exactly how I did it in my level.

For the Lightning Storm you'll need to add several new actors to your level. Depending on how 'real' you want it to be, you may discard a few of these actors. I'm assuming you know the basics of all of these actors &amp;ndash; you may want to browse the class spec pages before you start.

* [[Legacy:StochasticTrigger|StochasticTrigger]]: These are the start of it all and will control the whole Storm.
* [[Legacy:TriggerLight|TriggerLight]]: These are going to be used to add visible Lightning to the level.
* [[Legacy:SpecialEvent|SpecialEvent]]: Will be used to play sounds which all players hear.
* [[Legacy:Dispatcher|Dispatcher]]: Will trigger a chain of events (for example: lightning-sound, followed by visual lightning, followed by another sound,...).

==Let's get to work ==

===TriggerLights ===

Add a TriggerLight in your skybox, where you want the lightning to originate from. Also add one or more TriggerLights in the actual level. These should be put in at such a position that they are at the 'same' position as the one in the skybox. In my own level I added two TriggerLights (one right under the other), because it's a rather large outside area and only one TriggerLight didn't quite gave the desired Lightning flashes.

Once placed in the level, open their properties and make sure these settings are as stated.

* Lightcolor:
** LightBrightness: 128-254
** LightHue: 0
** LightSaturation: 255
* Lighting:
** LightEffect: LE_Cylinder
** LightRadius: 254
* Object:
** InitialState: TriggerToggle
* Triggerlight:
** bDelayFullOn: False
** bInitiallyOn: False
** ChangeTime: 0.00000000
** RemainOnTime: 0.50000000

Also give all TriggerLights the same tag (for example: Lightning :)).

=== SpecialEvents ====

I added 7 SpecialEvents to my level. All of them have InitialState set to PlayersPlaySoundEffect. Below you can find exactly how I configured all of these SpecialEvents. But the bottom line is that 4 of them will have LightningSounds and the 3 final ones will have ThunderSounds.

&lt;i&gt;Note:&lt;/i&gt; The naming I used for the Tag's aren't the best ones :(

* SpecialEvent 1:
** Events:
*** Tag: Thunder0
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn2a'
* SpecialEvent 2:
** Events:
*** Tag: Thunder1
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn3a'
* SpecialEvent 3:
** Events:
*** Tag: Thunder2
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn4a'
* SpecialEvent 4:
** Events:
*** Tag: Thunder3
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.lightn1a'

* SpecialEvent 5:
** Events:
*** Tag: Atmos_Thunder1 &lt;i&gt;(see why my naming ain't the best ;))&lt;/i&gt;
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thund1'
* SpecialEvent 6:
** Events:
*** Tag: Atmos_Thunder2
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thunder'
* SpecialEvent 7:
** Events:
*** Tag: Atmos_Thunder3
** SpecialEvent:
*** Sound: Sound'AmbOutside.OneShot.thunder4'

===Dispatchers ===

I added 4 Dispatchers to my level.

* Dispatcher1:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
*** OutEvents:
**** [0]: Thunder0
** Events:
*** Tag: atmosphere0
* Dispatcher2:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
*** OutEvents:
**** [0]: Thunder2
**** [1]: Thunder1
** Events:
*** Tag: atmosphere1
* Dispatcher3:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
**** [2]: 0.0000000
*** OutEvents:
**** [0]: Lightning
**** [1]: Lightning
**** [2]: Thunder2
** Events:
*** Tag: atmosphere2
* Dispatcher4:
** Dispatcher:
*** OutDelays:
**** [0]: 0.0000000
**** [1]: 0.0000000
**** [2]: 0.0000000
**** [3]: 0.0000000
**** [4]: 0.0000000
**** [5]: 0.0000000
*** OutEvents:
**** [0]: Lightning
**** [1]: Lightning
**** [2]: Thunder3
**** [3]: Lightning
**** [4]: Lightning
**** [5]: Thunder3
** Events:
*** Tag: atmosphere3

===StochasticTriggers ===

Now to put it all in motion :D

In my level, I used two StochasticTriggers. The first one is the one causing the LightningSounds and Lightning, while the second one causes a more general rumbling in the background (ThunderSounds with lower volumes). You are free to combine these two StochasticTriggers into one if you want to ;)

Anyway, so add two StochasticTriggers to your level. They can be anywhere in the level.

Make sure both StochasticTriggers have AlwaysActive as [[Legacy:InitialState|InitialState]]!

* StochasticTrigger1 (Thunder)
** Events: &lt;i&gt;(here go the SpecialEvents with Thundersounds)&lt;/i&gt;
*** [0]: Atmos_Thunder1
*** [1]: Atmos_Thunder2
*** [2]: Atmos_Thunder3
** maxRecheckTime: 10.0000000
** minRecheckTime: 2.0000000
** triggerProbability: 5.0000000
* StochasticTrigger2 (Lightning)
** Events: &lt;i&gt;(here go the Dispatchers for the Lightning Effects)&lt;/i&gt;
*** [0]: atmosphere0
*** [1]: atmosphere1
*** [2]: atmosphere2
*** [3]: atmosphere3
** maxRecheckTime: 30.0000000
** minRecheckTime: 5.0000000
** triggerProbability: 5.0000000

==Conclusion ==

You're basically done :) Boot your level and enjoy a rather scary Lightning Storm.

This is just how I did the lightning in my level. You are free to experiment with it, adding more Dispatchers (for more diverse LightningEffects), changing LightningSounds and ThunderSounds,...

==Notes ==

I did notice that with all these SpecialEvents etc, the Voice Taunts from UT sometimes get cut off :/ Probably this is caused by UT not having enough channels for sound or so. I don't know.

==Comments ==

Place your comments on this tutorial here :).

:''The sound problem is caused by the ClientPlaySound method used in the PlayersPlaySoundEffect state of the SpecialEvents. This overrides the taunting sounds which are played through the same method.&lt;br /&gt;Maybe another kind of triggerable sound effect could solve this problem? &amp;ndash; [[Legacy:Wormbo|Wormbo]]''
::''Ah, but what other triggerable (and working) sound effect actors are there? I tried sumtin called TriggeredAmbientSound, but it doesn't seem to work :( &amp;ndash; [[Legacy:The G.O.A.T|the G.o.a.T]]''
: Look at [[Legacy:Triggering Sounds|Triggering Sounds]], that explains the various methods.  &amp;ndash; ''Tarquin'' 
::''The TriggeredAmbientSounds seem to work, but I don't see a way to implement this storm with those. Because the SpecialEvents Initialstate makes sure all players hear the sound, while this one is only in the actor's radius. Guess the SpecialEvents have to stay then ;) &amp;ndash; [[Legacy:The G.O.A.T|the G.o.a.T]]''
: I guess the easy way to solve this would be to make the TriggeredAmbientSound's radius enclose your entire map. &amp;ndash; ''[[Legacy:2D.Cube|2D.Cube]]''

==Related Topics ==
* [[Legacy:Dynamics|Dynamics]] topic page
* [[:Category:Legacy Tutorial]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightwave</title>
    <id>1705</id>
    <revision>
      <id>4210</id>
      <timestamp>2007-09-14T06:43:38Z</timestamp>
      <contributor>
        <ip>74-37-79-15.dsl1.ekgv.ca.frontiernet.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

===Author's Note===

Everything I have said about the comparison between Lightwave and MAX is my experience only.  I have used Lightwave for most of my young adult life and I have very little experience in MAX.  My comparisons may sound biased and if anyone sees something that isn't true (IE not my opinion) then please, post a comment in the comments section and I will try to fix it.

'''Lightwave''' is a professional [[Legacy:Topics On Modeling|modeling]] and animating [[Legacy:Application|application]] designed by [http://www.newtek.com/ Newtek]

Lightwave comes with 2 programs, Lightwave Modeler which is devoted to modeling, and Lightwave Layout which is devoted to animating.  Most people might think this is a little inconvenient, but having 2 distinct programs for each job, means that the programs are more specialized.  You don't see animating tools in the modeling program, because the modeling program is jammed with tools for modeling.  Unlike MAX which displays the tools for both jobs in the same window, with lightwave, you can focus on a particular aspect without the interference of buttons from other areas..  As far as I can tell, Lightwave displays more buttons for functions that MAX does.  Then again, and someone can correct me if I'm wrong, I don't know much about MAX. :)

[[Image:Legacy_lightwave.jpeg|center|4 viewports: Right, Perspective, Front, Top]]

Lightwave has 4 viewports that allow you to view your model from 7 different angles.  Each viewport can be set to anyone of these angles.  It '''is''' possible to set all viewports to the same angle, such as the front view, but why would you want to do that? Lightwave comes packaged with a ton of useful modeling, and animating tools, however, there are many more tools from 3rd party developers that can be bought or downloaded.  Newtek also has plugins that can be purchased.

So, MAX is cool too, why should I look at Lightwave?  Well, here's a quote from Newtek's site:

{{innerbox|Unreal Tournament 2003 has a huge 3D object library that comes with UnrealEd: Unreal Tournament2003’s level editor. Many of these objects have been made at Digital Extremes using LightWave&amp;copy;.

}}

You can do anything you want with Lightwave that you can do with MAX and in some cases, it's easier.  Lightwave supports  exporting your models to 3DS which is the format that the 3ds2unr utility uses.  And, UnrealEd also supports the Lightwave object format as well.  See the external link below to see how to get your Lightwave models into UnrealED.

The features list for Lightwave is way too big, so I've provided a link directly to their features page.  On this page you will see that different aspects of Lightwave are divided into sections.  Lightwave allows for fine control through the use of graphs.  Using these graphs you can plot information depending on which tool you're using.  Many tools for animating, and possibly modeling, or rendering [I'm not sure about the last 2 though] allow for the use of these such graphs.  You can also see from this list, that graphs are not the only tools that have features listed.  [http://www.newtek.com/products/lightwave/product/feature_list.html Lightwave Features]

==Tutorials==

*[[Legacy:Lightwave/Lightwave Layout|Lightwave Modeler Visual Layout]] &amp;ndash; Explains the different areas where the tools reside ''Work in Progress''
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UV Mapping|UV Mapping]] &amp;ndash; UV Mapping in Lightwave is a breeze! ''Work in Progress''

==External Reference==
*[http://www.newtek.com/solutions/3danimation.html What is Lightwave] Basically a page describing the selling points of Lightwave.
*[http://www.newtek.com/solutions/gamedev.html Lightwave Game Development] Lightwave comes with tools for developing today's games.
*[http://www.newtek.com/products/lightwave/brochure/games.html Newtek's Game Development Brochure] Another site explaining Lightwave's capabilities for game design.
*[http://www.lightwave3d.com/tutorials/modeling/UT2003/ Using Lightwave with UnrealEd] Tutorial on how to make your &lt;tt&gt;.LWO&lt;/tt&gt; models into static meshes.

==3rd Party Tools==
*[[Legacy:Lwo2psk|lwo2psk]] - convert lightwave-models &amp; -animations to psk- &amp; psa-files

==Discussion==

'''Mosquito:''' It sounds like Lightwave could be a big player in the world of game modeling applications.  Although I haven't used it that way yet, in my research, I've learned a lot about it's hidden abilities.  Expect to see some actual tutorials here soon.  I'm an intermediate in the program.

'''Vailias:''' Love Lightwave. Do all my modeling in it so far. BTW Edited the link to be &quot;Lightwave Modeler Visual Layout&quot; since &quot;Lightwave Layout&quot; is the Animation side of the program set. ;) Just to keep those with some LW experience from getting confused.

'''Ntmy:''' Added my tool as a 3rd party tool hope this is ok

'''Clintonman:'''  Very nice. This tool works with Lightwave 9 beta. Here is another import/export for lightwave, but only the import seems to work properly.  Choose the &quot;LW7.0 compatible Plugins&quot; link to get them.

http://www.troggpond.com/lwtools/index.html

'''Kazashi:''' I've been using that set of LW import/export plugins for a couple of years now, once you learn its nuances exporting works pretty well. There are a couple of minor issues, however the source code is available for anyone with C++ skills. Available [http://www.troggpond.com/lwtools/src/LoadMD3_src.zip here]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics on Modeling]]

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4211</id>
      <timestamp>2007-09-08T22:22:41Z</timestamp>
      <contributor>
        <ip>UNUSED.imc-ua.net</ip>
      </contributor>
      <text xml:space="preserve">Nice...

[URL=http://suzuki-samaria.bmwmomentun.cn/ford-bend-housing-authority.htm#] ford bend housing authority [/URL]

&lt;a href=&quot; http://suzuki-samaria.bmwmomentun.cn/ford-bend-housing-authority.htm &quot;&gt; ford bend housing authority &lt;/a&gt;

http://suzuki-samaria.bmwmomentun.cn/ford-bend-housing-authority.htm ford bend housing authority

[URL=http://www.bmwmomentun.cn/use97-pontiac-sunfire-used-engines.htm#] use97 pontiac sunfire used engines [/URL]

&lt;a href=&quot; http://www.bmwmomentun.cn/use97-pontiac-sunfire-used-engines.htm &quot;&gt; use97 pontiac sunfire used engines &lt;/a&gt;

http://www.bmwmomentun.cn/use97-pontiac-sunfire-used-engines.htm use97 pontiac sunfire used engines

[URL=http://suzuki-samaria.bmwmomentun.cn/die-cast-car-accessory.htm#] die cast car accessory [/URL]

&lt;a href=&quot; http:%</text>
    </revision>
    <revision>
      <id>4212</id>
      <timestamp>2007-09-09T05:31:01Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>z revert</comment>
      <text xml:space="preserve">==Overview==

===Author's Note===

Everything I have said about the comparison between Lightwave and MAX is my experience only.  I have used Lightwave for most of my young adult life and I have very little experience in MAX.  My comparisons may sound biased and if anyone sees something that isn't true (IE not my opinion) then please, post a comment in the comments section and I will try to fix it.

'''Lightwave''' is a professional [[Legacy:Topics On Modeling|modelling]] and animating [[Legacy:Application|application]] designed by [http://www.newtek.com/ Newtek]

Lightwave comes with 2 programs, Lightwave Modeler which is devoted to modelling, and Lightwave Layout which is devoted to animating.  Most people might think this is a little inconvenient, but having 2 distinct programs for each job, means that the programs are more specialized.  You don't see animating tools in the modelling program, because the modelling program is jammed with tools for modelling.  Unlike MAX which displays the tools for both jobs in the same window, withlightwave, you can focus on a particular aspect without the interference of buttons from other areas..  As far as I can tell, Lightwave displays more buttons for functions that MAX does.  Then again, and someone can correct me if I'm wrong, I don't know much about MAX. :)

[[Image:Legacy_lightwave.jpeg|center|4 viewports: Right, Perspective, Front, Top]]

Lightwave has 4 viewports that allow you to view your model from 7 different angles.  Each viewport can be set to anyone of these angles.  It '''is''' possible to set all viewports to the same angle, such as the front view, but why would you want to do that? Lightwave comes packaged with a ton of useful modelling, and animating tools, however, there are many more tools from 3rd party developers that can be bought or downloaded.  Newtek also has plugins that can be purchased.

So, MAX is cool too, why should I look at Lightwave?  Well, here's a quote from Newtek's site:

{{innerbox|Unreal Tournament 2003 has a huge 3D object library that comes with UnrealEd: Unreal Tournament2003’s level editor. Many of these objects have been made at Digital Extremes using LightWave&amp;copy;.

}}

You can do anything you want with Lightwave that you can do with MAX and in some cases, it's easier.  Lightwave supports  exporting your models to 3DS which is the format that the 3ds2unr utility uses.  And, UnrealEd also supports the Lightwave object format as well.  See the external link below to see how to get your Lightwave models into UnrealED.

The features list for Lightwave is way too big, so I've provided a link directly to their features page.  On this page you will see that different aspects of Lightwave are divided into sections.  Lightwave allows for fine control through the use of graphs.  Using these graphs you can plot information depending on which tool you're using.  Many tools for animating, and possibly modelling, or rendering [I'm not sure about the last 2 though] allow for the use of these such graphs.  You can also see from this list, that graphs are not the only tools that have features listed.  [http://www.newtek.com/products/lightwave/product/feature_list.html Lightwave Features]

==Tutorials==

*[[Legacy:Lightwave/Lightwave Layout|Lightwave Modeler Visual Layout]] &amp;ndash; Explains the different areas where the tools reside ''Work in Progress''
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UV Mapping|UV Mapping]] &amp;ndash; UV Mapping in Lightwave is a breeze! ''Work in Progress''

==External Reference==
*[http://www.newtek.com/solutions/3danimation.html What is Lightwave] Basically a page describing the selling points of Lightwave.
*[http://www.newtek.com/solutions/gamedev.html Lightwave Game Development] Lightwave comes with tools for developing today's games.
*[http://www.newtek.com/products/lightwave/brochure/games.html Newtek's Game Development Brochure] Another site explaining Lightwave's capabilities for game design.
*[http://www.lightwave3d.com/tutorials/modeling/UT2003/ Using Lightwave with UnrealEd] Tutorial on how to make your &lt;tt&gt;.LWO&lt;/tt&gt; models into static meshes.

==3rd Party Tools==
*[[Legacy:Lwo2psk|lwo2psk]] - convert lightwave-models &amp; -animations to psk- &amp; psa-files

==Discussion==

'''Mosquito:''' It sounds like Lightwave could be a big player in the world of game modelling applications.  Although I haven't used it that way yet, in my research, I've learned a lot about it's hidden abilities.  Expect to see some actual tutorials here soon.  I'm an intermediate in the program.

'''Vailias:''' Love Lightwave. Do all my modeling in it so far. BTW Edited the link to be &quot;Lightwave Modeler Visual Layout&quot; since &quot;Lightwave Layout&quot; is the Animation side of the program set. ;) Just to keep those with some LW experience from getting confused.

'''Ntmy:''' Added my tool as a 3rd party tool hope this is ok

'''Clintonman:'''  Very nice. This tool works with Lightwave 9 beta. Here is another import/export for lightwave, but only the import seems to work properly.  Choose the &quot;LW7.0 compatible Plugins&quot; link to get them.

http://www.troggpond.com/lwtools/index.html

'''Kazashi:''' I've been using that set of LW import/export plugins for a couple of years now, once you learn its nuances exporting works pretty well. There are a couple of minor issues, however the source code is available for anyone with C++ skills. Available [http://www.troggpond.com/lwtools/src/LoadMD3_src.zip here]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics on Modeling]]

[[Category:Legacy Modeling|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightwave/Create Tools</title>
    <id>1707</id>
    <revision>
      <id>4215</id>
      <timestamp>2007-08-08T15:42:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">===Overview===

''Work in Progress''

This Article describes all the buttons in the Create Tooltab.  All explanations are to 'the best of my knowledge'.  I don't claim to be a Lightwave Guru 

but I do know what some of the buttons do.

===The Object Tools===

The object tools give you the option to create predefined primitives.  Use these together to make the model more complete.  You can use the mouse to create any of these primitives, or if you prefer a much more fine control, you may press 'N' to bring up the object measurement perameters.

[[Image:Legacy_Lightwave-CreateObjects.jpeg|center|]]

; Box : Creates a normal box.  The box can be 2D as well so that you just get the 4 points on 1 side.  Creating a box is the most simple thing you can do in Lightwave.

; Ball : Creates either a 3D ball, or a 2D circle.  Press 'N' to control sides and segments.  The more of each, the more 'round' it will look.

; Disc : The disc tool creates a cylinder.  Again, use 'N' to control sides, and segments.  The more segments you have on a disc, the more you can bend it.

; Cone : Creates a cone.  Has a base that is the same as the disc, but tapers the top to a point.

; Capsule : Not sure what this one does, chances are you'll never need it.

; Platoric Solid : Not too sure of the explanation for this one, but it allows you to create several different types of objects.
;| Tetrahedron, Cube, Octahedron, Cubeoctahedron, Icosehedron, Dodecahedron, and Icosidodecahedron.

; Super Quadric : Not sure about this one.

; Gemstone Tool : You can create gemstones with it.  They have a tapered end like a pyramid on one side and a diamond like look at the other.,

; Gear : Allows you to create a gear with set dimensions and teeth.

[[Image:Legacy_Lightwave-CreateElements.jpeg|center|]]</text>
    </revision>
    <revision>
      <id>4216</id>
      <timestamp>2007-08-08T14:06:16Z</timestamp>
      <contributor>
        <ip>Ip-68-178-248-3.ip.secureserver.net</ip>
      </contributor>
      <comment>*Lightwave/Create Tools</comment>
      <text xml:space="preserve">===Overview===

''Work in Progress''

This Article describes all the buttons in the Create Tooltab.  All explanations are to 'the best of my knowledge'.  I don't claim to be a Lightwave Guru 

but I do know what some of the buttons do.

===The Object Tools===

The object tools give you the option to create predefined primitives.  Use these together to make the model more complete.  You can use the mouse to create any of these primitives, or if you prefer a much more fine control, you may press 'N' to bring up the object measurement perameters.

[[Image:Legacy_Lightwave-CreateObjects.jpeg|center|]]

; Box : Creates a normal box.  The box can be [http://www.writersclub.net/ forum for writers] 2D as well so that you just get the 4 points on 1 side.  Creating a box is the most simple thing you can do in Lightwave.

; Ball : Creates either a 3D ball, or a 2D circle.  Press 'N' to control sides and segments.  The more of each, the more 'round' it will look.

; Disc : The disc tool creates a cylinder.  Again, use 'N' to control sides, and segments.  The more segments you have on a disc, the more you can bend it.

; Cone : Creates a cone.  Has a base that is the same as the disc, but tapers the top to a point.

; Capsule : Not sure what this one does, chances are you'll never need it.

; Platoric Solid : Not too sure of the explanation for this one, but it allows you to create several different types of objects.
;| Tetrahedron, Cube, Octahedron, Cubeoctahedron, Icosehedron, Dodecahedron, and Icosidodecahedron.

; Super Quadric : Not sure about this one.

; Gemstone Tool : You can create gemstones with it.  They have a tapered end like a pyramid on one side and a diamond like look at the other.,

; Gear : Allows you to create a gear with set dimensions and teeth.

[[Image:Legacy_Lightwave-CreateElements.jpeg|center|]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightwave/Exporting 3DS</title>
    <id>1710</id>
    <revision>
      <id>4220</id>
      <timestamp>2005-12-02T23:14:44Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Lightwave ships with a 3ds Exporter. 

To find it select the &quot;construct&quot; tab, then open the &quot;additional&quot; Dropdown under the &quot;utility&quot; Heading.

[[Image:Legacy_LW_AdditionalPlugins.jpeg|center|]]

It should be the first available export plugin. Selecting it brings up this dialog box:

[[Image:Legacy_LW_3ds_Export_Options.jpeg|center|The Export Options Dialog Box]]

'''Capture UV Map Check Box:''' does just that. Captures the Object's UV map(s). One thing of note is that the UV data is only available for export if at least one surface referances that map. (see the [[Legacy:Lightwave/Surface Editor|Lightwave/Surface Editor]] section for more information directly regarding that.)

'''Apply Rotation Check Box:''' Alters the object's rotation upon export. This is necessarry since each 3d modeling application has its own coordinant system, and up vector. The default value orients the object correctly in 3ds max. '''Apply Custom Rotation''' allows you to specify the angular offset.

'''TIP:''' If going to maya from Lightwave, use 3ds format, and turn off the rotation settings, just besure to use a z-up world in maya (set in your perferances). The object will be oriented properly. 

'''Scale Object:''' Scales the object by the typed in factor. 

'''Note:''' When traveling from program to program you will find that scale seems to jump about alot. The reason is Default units. Lightwave defaults to meters. So a human is 2 units tall. If you transfer to Max that human will be 2 Units tall (as far as I know max is still unspecified units). In maya it will be 2 CM tall. This is a serious issue since your human in the Unreal Universe needs to be about 96 units(unreal units) tall (the reason maya to UT modeling uses CM as a default unit). So to get a properly scaled model(for UT) into another program you need to scale by a factor of about 50 (48 works too). 

'''Final Caveat:''' Lightwave's UV maps will not (normally) transfer properly useing this plugin. The reason is a limitation of the 3ds format not supporting discontinuous uv coordinants. The solution is to &quot;break&quot; your object before You export it. The default hotkey for that is ctrl+u. It separates each polygon into its own entity (ie they dont share points). This makes the smoothing go away, but the UV coords will transfer. FYI Max does this automatically when exporting to 3ds format also, it simply recombines the verticies when loading its own formats, so most max users don't notice the differance.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4221</id>
      <timestamp>2004-06-09T09:33:12Z</timestamp>
      <contributor>
        <ip>Vailias</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Lightwave ships with a 3ds Exporter. 

To find it select the &quot;construct&quot; tab, then open the &quot;additional&quot; Dropdown under the &quot;utility&quot; Heading.

[[Image:Legacy_LW_AdditionalPlugins.jpeg|center|]]

It should be the first available export plugin. Selecting it brings up this dialog box:

[[Image:Legacy_LW_3ds_Export_Options.jpeg|center|The Export Options Dialog Box]]

'''Capture UV Map Check Box:''' does just that. Captures the Object's UV map(s). One thing of note is that the UV data is only available for export if at least one surface referances that map. (see the [[Legacy:Lightwave/Surface Editor|Lightwave/Surface Editor]] section for more information directly regarding that.)

'''Apply Rotation Check Box:''' Alters the object's rotation upon export. This is necessarry since each 3d modeling application has its own coordinant system, and up vector. The default value orients the object correctly in 3ds max. '''Apply Custom Rotation''' allows you to specify the angular offset.

'''TIP:''' If going to maya from Lightwave, use 3ds format, and turn off the rotation settings, just besure to use a z-up world in maya (set in your perferances). The object will be oriented properly. 

'''Scale Object:''' Scales the object by the typed in factor. 

'''Note:''' When traveling from program to program you will find that scale seems to jump about alot. The reason is Default units. Lightwave defaults to meters. So a human is 2 units tall. If you transfer to Max that human will be 2 Units tall (as far as I know max is still unspecified units). In maya it will be 2 CM tall. This is a serious issue since your human in the Unreal Universe needs to be about 96 units(unreal units) tall (the reason maya to UT modeling uses CM as a default unit). So to get a properly scaled model(for UT) into another program you need to scale by a factor of about 50 (48 works too). 

'''Final Caveat:''' Lightwave's UV maps will not (normally) transfer properly useing this plugin. The reason is a limitation of the 3ds format not supporting discontinuous uv coordinants. The solution is to &quot;break&quot; your object before You export it. The default hotkey for that is ctrl+u. It separates each polygon into its own entity (ie they dont share points). This makes the smoothing go away, but the UV coords will transfer. FYI Max does this automatically when exporting to 3ds format also, it simply recombines the verticies when loading its own formats, so most max users don't notice the differance.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightwave/Importing 3DS</title>
    <id>1709</id>
    <revision>
      <id>4219</id>
      <timestamp>2004-06-09T08:51:24Z</timestamp>
      <contributor>
        <ip>Vailias</ip>
      </contributor>
      <comment>Lightwave Non Native File Format Import Process</comment>
      <text xml:space="preserve">As of lightwave 7.0 (perhaps earlier) the 3ds import Plugin Autoloads and is part of the open object dialog. 

Simply switch the dropdown filetype menu from &quot;objects&quot; to &quot;All Files&quot; and then select the object you wish to open. 

This goes for all object formats that Lightwave supports.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightwave/Lightwave Layout</title>
    <id>1706</id>
    <revision>
      <id>4213</id>
      <timestamp>2005-01-14T02:26:25Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">==Lightwave Modeler Interface==

At first glance, the organization of Modeler, [Like MAX], can be a little confusing.  There are several different areas.  Some of them stay the same and some change when a different tool section is accessed (see below).

===The Menus and Editors===

These are the buttons located in the very top left corner of the modeller.  They allow you to access file information, modeler preferences, and the various advanced editors that comes with Lightwave.

[[Image:Legacy_Lightwave-FileButtons.jpeg|center|]]

; File : Contains commands for saving, loading, and importing exporting files.  Commands useful to you, besides the save and load, are the import/export commands.  Lightwave is capable of importing and exporting 3ds files.  3ds is the format used most when transferring between modelling programs and Unreal.  More information about the different options in the file menu will be available in a page called [[Legacy:Lightwave/Menus|Lightwave/Menus]]
;| [[Legacy:Lightwave/Importing 3DS|Lightwave/Importing 3DS]]
;| [[Legacy:Lightwave/Exporting 3DS|Lightwave/Exporting 3DS]]

; Modeler : Contains commands that allow you to change the modeler.  These include options to change the color, the config files, and other such options.  It also allows you to add and edit plugins.  A more descriptive page will be made for this menu item.  [[Legacy:Lightwave/Menus|Lightwave/Menus]]

; Surface Editor : The surface editor allows you to change your surfaces, which are the textures that you apply to your model.  It has advanced tools to change the different aspects of your textures, such as color, transparency, reflection, and bump mapping to name a few.  The surface editor will be fully explained [To the best of my knowledge] here: [[Legacy:Lightwave/Surface Editor|Lightwave/Surface Editor]] but not yet. :)

; Image Editor : The image editor controls all the images you have imported into your sessions.  These images are usually images that you have attached to your model's surfaces.  Using the image editor you can control several different aspects of the image such as frame rate for animated images, and brightness/contrast for all images.  All tools will be described here: [[Legacy:Lightwave/Image Editor|Lightwave/Image Editor]] but not yet. :)

; Presets : The presets button allows you to view all the preset textures available in the texture directory.  Simply choose what texture group you want, and it will show you all the textures in that group.  Using the surface editor, you can then double click on a texture in the presets, and apply it to a surface in the surface editor.

===The Tool Sections===

The Lightwave Modeler tools are divided into 7 sections.  These sections are shown in the picture below.  When you click on a tab, the list of buttons for that section appear on the left.  The buttons at the bottom, are not section specific.  Because there are so many buttons in each section, each will have it's own page describing the function of each button.

[[Image:Legacy_Lightwave-Layout.jpeg|center|]]

; Create : [[Legacy:Lightwave/Create Tools|Lightwave/Create Tools]]
;| The create section is used to actually make your designs.  It contains buttons for basic shapes, such as the box and ball.  Using these 'primitives' together, you can create a bigger, and more complete model.

; Modify : [[Legacy:Lightwave/Modify Tools|Lightwave/Modify Tools]]
;| This section has tools that allow you to 'modify' your model.  Some examples are move, rotate, and size (or scale).  Using these tools allows you to change the way your model looks without adding more primitives. 

; Multiply : [[Legacy:Lightwave/Multiply Tools|Lightwave/Multiply Tools]]
;| Multiply contains tools to multiply vertexes and faces.  There are several different ways to do this from mirroring, which creates an exact copy, to bevel and extruding.  Each tool multiplies vertexes and faces in a different way.

; Construct : [[Legacy:Lightwave/Construct Tools|Lightwave/Construct Tools]]
;| The tools in section section allow you to perform specialized actions to add or remove polygons.  Such examples are triple, which makes every selected polygon into a 3 vertex polygon.  This is useful for game editting because models need to be constructed from 3 vertex polygons.  Another tool is subdivide which doesn't change the look of the model, but adds polygons to a polygon to allow better form.

; Detail : [[Legacy:Lightwave/Detail Tools|Lightwave/Detail Tools]]
;| The Detail section allows you to control apsects of detail.  This is where you control polygon surface information to attach skinning groups, and other tools for changing vertexes and skelegons.

; Map : [[Legacy:Lightwave/Map Tools|Lightwave/Map Tools]]
;| Contains tools for working with UV maps, weight maps, vertex color maps, and other such things.  My knowledge of this section is almost non-existent so the explanation of this section won't come till later.

; Display : [[Legacy:Lightwave/Display Tools|Lightwave/Display Tools]]
;| The section has tools that control the display of Modeler.  There are tools to allow you to change how you look at your model, tools that allow you to change the viewports in many ways, including their arrangement. [You can have just 2 viewports, for example].  The object visibility tools are here as well, they allow you to hide and unhide areas of your model.

===The Model Paging Buttons===

These buttons deal with viewing your different models.  Each one of these buttons allows you to either view different parts of your model, or view different files that you have loaded.

[[Image:Legacy_Lightwave-FileChooser.jpeg|]] This button allows you to switch between different files that have been loaded.  When a different file is loaded, all the models for that file are put into the pages.

[[Image:Legacy_Lightwave-ModelPages.jpeg|]] The blue arrow buttons allow you to flip through the pages.  Each page can hold 10 objects.  The tile that is fully yellow, is the selected model.  If only the bottom is selected, that means you will see that model in the background.  You will not see points or polygon information.  It appears as a black wireframe.

[[Image:Legacy_Lightwave-PagingExample.jpeg|center|The main model is shown with face and wireframe information, the second model is shown only as a black wireframe.]]

You may select more then 1 model by holding shift and clicking.  The same goes with the bottom selections.  Any tile that has a small triangle at the top, has information in it, even if it's just one vertex.

'''Vailias:''' Also the number keys (NOT numpad numbers) allow you direct access to the layers. Shift+number = Makes layer visible and editable In addition to any current layers. Alt+number puts that layer in background (wireframe). Shift+Alt+number adds background (uneditable wireframe) layers.
 

===Viewport Controls===

The next area that we're going to look at is the veiwport control buttons.  These are the buttons located above each viewport, and they allow for some easy customization.

[[Image:Legacy_Lightwave-ViewportButtons.jpeg|center|]]

; Viewport Angle : The first button is a combo box and display the different angles for which you can view your models.  There are 9 options to choose from, and the options that display your model in a 2D view, show the planes that the graph uses in that view.

; Viewport Render Style : The button with just a down arrow is the Render Style list.  This list [Also a combo box] contains the different rendering options.  Some options show just the wireframe, others show the polygons, and others show the model with the surface information applied.  In order to understand each one, you should try them out yourself and use whichever one you prefer the best.  Some of them, though, are better for certain situations.

; Pan, Rotate, and Zoom : These buttons should be self explanatory.  They allow you to change the view of the camera.  You can move it with the pan button, and zoom in and out with the zoom button.  The rotate button only works on the perspective Angle.  These button don't actually change your model, they just change the view.

===Bottom Toolbar===

The bottom toolbar contains tools for different selection methods, cut/copy/paste tools, and others.

[[Image:Legacy_Lightwave-BottomToolbar.jpeg|center|]]

The Points button allows you to select just points (vertices).  The Polygons button allows you to select faces.  The volume modes allow you to make a 3d volume, and then selects points or polygons lying inside or outside that volume.  (There are two volume modes, one which counts things that lie on the border as being &quot;inside&quot;, and one which counts them as &quot;outside&quot;.)

The modes drop down determines the point at which certain actions (such as rotating, bending, and stretching) happen; for example, &quot;Action Center: Origin&quot; will always rotate around the coodinate (0,0,0), while &quot;Action Center: Pivot&quot; will always rotate around the current layer's pivot point.

Then you have your copy/paste buttons.  These buttons work on the currently selected points or polygons.  They function the same as any other program uses them.  The &quot;more&quot; drop down contains any buttons that don't have room to display.

The buttons on the far right determine what type of vertex map you are working with at the moment (and thus, control the type of maps that are being listed in the drop-down box to their right).  In order, the buttons are: '''W'''eight, UV '''T'''exture, '''M'''orph, and in the most recent versions of the program, Vertex '''C'''olor and Point '''S'''elections as well.

==Related Topics==
* [[Legacy:Lightwave|Lightwave Main]]

==Comments==

'''Mosquito:''' Please don't create any of the pages for the empty links on this page.  I'm not sure if I actually want those pages yet.

'''Vailias:''' Oops. Didn't read this far before adding the 3ds import/export pages. The Export one could be rather helpfully though. There are a few Potholes in that operation that need to be pointed out.

'''Gregor:''' I'd suggest renaming this page to &quot;Lightwave/Lightwave Interface&quot; or &quot;UI&quot; or some such.  &quot;Lightwave Layout&quot; means something very specific to Lightwave users.  This page isn't very clear on which version of the program it refers to ... the interface gets tweaked a bit with each new version.  Finally, the spelling is &quot;Modeler&quot;, not &quot;Modeller&quot;, so I have fixed that in a few places.

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4214</id>
      <timestamp>2005-01-14T00:30:32Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lightwave/UV Mapping</title>
    <id>1708</id>
    <revision>
      <id>4217</id>
      <timestamp>2005-07-30T01:47:47Z</timestamp>
      <contributor>
        <ip>Fat Marrow</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

UV mapping is the process of applying a texture to an object. When creating static meshes for Unreal Tournament levels, UV maps are usually created (using the Map-&gt;New UV Map option) for one of two purposes:

===Applying materials or skins to an object===

A surface with the name of an existing Unreal Tournament material (such as the concrete texture 'bas02ha' from the Humanoid Architecture texture set, for example) is applied to various polygons in the object, and the texture scaling is adjusted by selecting particular parameters in the 'Make UV' property box, or by manually stretching the polygons in a UV view, for example, until the texture has the correct proportion and scaling. In this case polygons may overlap in the UV space/view, or may extend outside the unit UV coordinate space.

Alternatively, the UV map may be created such that there are no overlapping polygons in the UV space (for example using the atlas projection of the 'Make UV' tool in Lightwave 8+), so that a 'skin' texture can be created and overlaid over the object. If the object is a human head, for example, the skin could be a hand-drawing of the eyes, mouth, nose, hair, which would be overlaid over the relevant parts of the object by careful manipulation of the UV mapping.

Both types of mapping may be used within the same UV map, with the skinning approach used for one surface type, and the material stretching/alignment used for other surface types, for example.

Global surface mapping properties can be set in the surface properties of a surface, but the Unreal Tournament editor ignores these in favour of explicitly defined UV maps (it uses the first-defined UV map?).

The tutorial below explains how to create a simple skin for an object in the Lightwave modeller program.

===Creating a light map for an object===

A mapping of polygons to the UV space is chosen (usually via the atlas 'Make UV' option in Lightwave 8+) such that there are no overlapping polygons in the UV space, and all of the polygons are spaced uniformly within the unit (0,0,1,1) UV space. The UV mapping is independent of, and usually additional to, any UV maps which map on existing materials or skins. The light map UV map exists to allow light maps to be created by [[Legacy:Rendering Lightmaps In Lightwave|Rendering lightmaps in Lightwave]] and then applying the rendered lightmaps to static meshes within the Unreal Tournament editor. Light maps are normally overlaid on static meshes using the [[Legacy:UV2Texture|UV2Texture]] display property; light map UV maps must normally be given the name 'UV2' (hence the name 'UV2Texture' and for reasons relating to compatibility with 3D Max).

Often, an object is defined in Lightwave with both a material/skin texture mapping UV map (called, say, 'UV1') and a lightmap UV (called 'UV2', as discussed further in [[Legacy:UV2Texture|UV2Texture]]), so that fine texture detail can be provided without requiring a correspondingly high resolution for the lightmap.

==UV skinning tutorial==

''Work in Progress''

UV Mapping in Lightwave is a breeze thanks to the additions to Lightwave 7.0.  The mapping tool tab contains most of the tools you'll need for all your UV mapping needs.  In this tutorial, I'm using Photoshop however because Lightwave supports many different image formats, you can really use any image editor, even Windows Paint.

===Prerequisites===

* Lightwave 7.0 (or greater)
* A Lightwave model (download mine)
* Image Editor (Photoshop Recommended)

==Model Preparation==

For this tutorial, I will be using a simple premade object.  You can download this object here if you wish.  In this tutorial, we will be using the [[Legacy:Lightwave/Image Editor|Image Editor]] and the [[Legacy:Lightwave/Surface Editor|Surface Editor]] a lot so you may want to familiarize yourself with them.  The buttons to access them are at the top left, however, by pressing CTRL+F3 you can get the surface editor and CTRL+F4 gives you the image editor.

The first thing we want to do is create the templates for our model.  The templates give us an area where we can tell where the face begins and ends.  It is a 2 dimensional image of the wireframe underneath the face.

===Grouping the Polygons===

''Coming Soon...''

After you've read this section, you should see something similar to this:

[[Image:Legacy_LW-UVMapping-Mine.jpeg|center|]]

Although you can literally jam every polygon onto the UV Map it's sloppy and I don't recommend it.  I'm going to create a UV map for every side.  Since we're looking at this model from the top, I've color coded the different sides accordingly.

{|

|-
|Top and Bottom Side Panels
|Z Axis
|Blue
|-
|Left and Right Side Panels
|X Axis
|Green
|}

===Disconnecting the Groups===

Now the next thing we need to do, is separate these sections from the model.  We need to do this so that we can line all of the faces up right.  I'll explain why later.

The best way to do this is to open up the polygon statistics window using the 'W' key.  Scroll down to ''Surface''.  It should be the 3rd item from the bottom. Select Side_Side_Panels, and press the + sign.  This should select all the polygons in that group.  Now just quickly press 'X' then press 'V'.  This cut's the selected polygons from the model and pastes them back in but it also disconnects them from the rest of the model, which is what we want.  Do this for the Top/Bottom_Side_Panels group as well.

Now we're ready to make our template.

==Making the Template==

Now that we have the model divided into sections, and those sections disconnected from the rest of the model, we can now safely create our templates.  In the top left viewport, click on the 'View Angle' button and scroll down to 'UV Texture'.

So what you want to do is select one of your groups, again you can use the polygon statistic window for this.  Select the Side_Side_Panels group.  Now click on the Map tool tab at the top, and then click on ''New UV Map''.  A dialog appears similar to the one below.

[[Image:Legacy_LW-UVMapping-NewMap.jpeg|center|]]

Because the right and left sides of our model are on the X axis, let's name this map XAxis_Map.  And make sure that the X Axis button is press.  If you choose either of the other buttons, it will render the mesh differently.  Although you can still move and resize the mesh, setting it to X now, will eliminate most of the hassle.  Now click ok.

You should now see the selected polygons in the top left viewport.  Since Lightwave tries to cover the entire area with the polygons, you'll see that they are quite out of shape:

[[Image:Legacy_LW-UVMapping-NewMap2.jpeg|center|]]

This is really easy to fix using simple mesh modify tools.  First, go to the Modify tool tab and select the 'Stretch' tool (h).  Then click and drag in the top left viewport until the mesh looks similar to your model.  We do this so that it's easy to see how big the polygon faces are when we're coloring over the template.

[[Image:Legacy_LW-UVMapping-NewMap3.jpeg|center|]]

It looks a litte better, but there's still something wrong.  The top portion is begin overlapped by the bottom portion.  We can't leave it like this because the texture on the top portion will be messed up so we have to move it.  At the bottom, press the 'Polygons' selection tool.  Deselect all the lower portion polygons and leave the top ones selected.  Then using the move tool (t), move the selection up so that it doesn't touch the lower section at all:

[[Image:Legacy_LW-UVMapping-NewMap4.jpeg|center|]]

There.  This should create a perfect template we can use to draw a texture.  Next we'll copy this, and paste it into our image editor (Photoshop).

==Creating the Texture==

Now, to copy this into Photoshop, we're going to use the Print Screen button.  It should be located near the top right corner of your keyboard.  Press it once and it should copy everything you see onto the clipboard.

Now open Photoshop (or whatever image editor your using).  In Photoshop, you must create a new document, so do that now.  Photoshop automatically detects the size of the image on the clipboard and sets the dimensions for you.  Press CTRL+V to paste the image.

Now there are several ways to go about getting what we want, and what we want is the smal grid in the top left layout view.  It has our templates right there.  You can either select it with the select tool (M) or move it to the top left corner and adjust the dimensions of the image.  The easiest way is to select it, then copy it using CTRL+C.

Now, create a new image, again Photoshop puts the dimensions in for the clipboard item.  Paste it in using CTRL+V.  Ok you now should have a template that looks exactly like the grid in Lightwave.  Using thise template you can create a texture.  Anything inside the mesh line is what is going to appear on that part of the mesh.

Since this is just a tutorial, let's do some quick drawing:

[[Image:Legacy_LW-UVMapping-Texture1.jpeg|center|]]

It doesn't matter if you go over the lines, only what is inside the lines is going to appear on the model.  And since I want to get this done and I'm lazy, I'm only going to paint the top portion of the mine.  Ok so now you need to save this image as any of the formats listed below:

====Supported Image Formats====

{|

|-
|BMP
|Bitmap
|-
|JPG/JPEG
|JPEG
|-
|PSD
|Photoshop PSD
|-
|TGA
|Targa
|}

''More coming...''

I like Bitmap because it is very portable between programs.  So save it as something like XAxis_Panel.bmp.

==Applying the Texture==

Now we're ready to put the texture onto our mesh.  Let's go back into Lightwave now.  Click on the surface editor button or press CTRL+F3.  On the left side, you should see the list of your groups.  Select the Side_Side_Panels.  Now making sure that you're in the basic tab, click on the ''Texture'' button beside the color.  The Texture button is the button with a little T.

This is the texture window.  For projection choose UV, for UV Map choose XAxis_Sides, and for Image choose 'Load Image', and choose the image you just saved.  Now go to the top left viewport, and change the angle to 'Perspective', and change the render type to 'Texture'.  You should now see your texture applied to the right and left sides of the model!

[[Image:Legacy_LW-UVMapping-AppliedTexture.jpeg|center|]]

This is all good but we still need to texture our top/bottom sides.  Since we've already got everything setup, this should be a breeze.  Using the Polygon Statistics (W), select the Top/Bottom_Side_Panels group.  Make sure nothing else is selected and click the 'New UV Map' button.

Call this one 'ZAxis_Map' and set it's axis to Z.  Press ok and you should see your selected faces in the top left viewport.  Now to make things really easy, click on the render options button (the one wiith just a down arrow) and choose the image you just saved.

Scale your model using the modify tools until it fits the template.  If you want find control, use the 'Drag' tool (CTRL+T).  This allows you to move the points into perfect positions.  Now you'll notice that even though the model is lined up, it still doesn't show on the model.

Go back into the surface editor, and choose your Top/Bottom_Side_Panels group.  Click the texture button next to color.  Same thing as last time; Set Projection to UV, set UV Map to ZAxis_Map, and set image to your image.  Press 'Use Texture', close the surface editor and all the sides of your model should now have the texture.

==Discussion==

'''Amen:''' Wouldn't lightwave's anchor UV Map type do this quicker?

'''Mosquito[L5]:''' Possibly... You have to remember that I'm not as good as some people, and this is what I know.  If you have a suggestion that would be better, by all means, create a tutorial for it.

'''Fat Marrow:'''This is a bit of a placeholder revision &amp;ndash; I'm hoping to add more (possibly to other pages) about rendering lightmaps in Lightwave and related topics (learnt the hard way).

==Related Topics==

* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Lightwave|Lightwave]]

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4218</id>
      <timestamp>2003-09-19T15:16:36Z</timestamp>
      <contributor>
        <ip>24.70.95.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

''Work in Progress''

UV mapping is the process of applying a skin to a model.  UV Mapping in Lightwave is a breeze thanks to the additions to Lightwave 7.0.  The mapping tool tab contains most of the tools you'll need for all your UV mapping needs.  In this tutorial, I'm using Photoshop however because Lightwave supports many different image formats, you can really use any image editor, even Windows Paint.

===Prerequisites===

* Lightwave 7.0 (or greater)
* A Lightwave model (download mine)
* Image Editor (Photoshop Recommended)

==Model Preparation==

For this tutorial, I will be using a simple premade object.  You can download this object here if you wish.  In this tutorial, we will be using the [[Legacy:Lightwave/Image Editor|Image Editor]] and the [[Legacy:Lightwave/Surface Editor|Surface Editor]] a lot so you may want to familiarize yourself with them.  The buttons to access them are at the top left, however, by pressing CTRL+F3 you can get the surface editor and CTRL+F4 gives you the image editor.

The first thing we want to do is create the templates for our model.  The templates give us an area where we can tell where the face begins and ends.  It is a 2 dimensional image of the wireframe underneath the face.

===Grouping the Polygons===

''Coming Soon...''

After you've read this section, you should see something similar to this:

[[Image:Legacy_LW-UVMapping-Mine.jpeg|center|]]

Although you can literally jam every polygon onto the UV Map it's sloppy and I don't recommend it.  I'm going to create a UV map for every side.  Since we're looking at this model from the top, I've color coded the different sides accordingly.

{|

|-
|Top and Bottom Side Panels
|Z Axis
|Blue
|-
|Left and Right Side Panels
|X Axis
|Green
|}

===Disconnecting the Groups===

Now the next thing we need to do, is separate these sections from the model.  We need to do this so that we can line all of the faces up right.  I'll explain why later.

The best way to do this is to open up the polygon statistics window using the 'W' key.  Scroll down to ''Surface''.  It should be the 3rd item from the bottom. Select Side_Side_Panels, and press the + sign.  This should select all the polygons in that group.  Now just quickly press 'X' then press 'V'.  This cut's the selected polygons from the model and pastes them back in but it also disconnects them from the rest of the model, which is what we want.  Do this for the Top/Bottom_Side_Panels group as well.

Now we're ready to make our template.

==Making the Template==

Now that we have the model divided into sections, and those sections disconnected from the rest of the model, we can now safely create our templates.  In the top left viewport, click on the 'View Angle' button and scroll down to 'UV Texture'.

So what you want to do is select one of your groups, again you can use the polygon statistic window for this.  Select the Side_Side_Panels group.  Now click on the Map tool tab at the top, and then click on ''New UV Map''.  A dialog appears similar to the one below.

[[Image:Legacy_LW-UVMapping-NewMap.jpeg|center|]]

Because the right and left sides of our model are on the X axis, let's name this map XAxis_Map.  And make sure that the X Axis button is press.  If you choose either of the other buttons, it will render the mesh differently.  Although you can still move and resize the mesh, setting it to X now, will eliminate most of the hassle.  Now click ok.

You should now see the selected polygons in the top left viewport.  Since Lightwave tries to cover the entire area with the polygons, you'll see that they are quite out of shape:

[[Image:Legacy_LW-UVMapping-NewMap2.jpeg|center|]]

This is really easy to fix using simple mesh modify tools.  First, go to the Modify tool tab and select the 'Stretch' tool (h).  Then click and drag in the top left viewport until the mesh looks similar to your model.  We do this so that it's easy to see how big the polygon faces are when we're coloring over the template.

[[Image:Legacy_LW-UVMapping-NewMap3.jpeg|center|]]

It looks a litte better, but there's still something wrong.  The top portion is begin overlapped by the bottom portion.  We can't leave it like this because the texture on the top portion will be messed up so we have to move it.  At the bottom, press the 'Polygons' selection tool.  Deselect all the lower portion polygons and leave the top ones selected.  Then using the move tool (t), move the selection up so that it doesn't touch the lower section at all:

[[Image:Legacy_LW-UVMapping-NewMap4.jpeg|center|]]

There.  This should create a perfect template we can use to draw a texture.  Next we'll copy this, and paste it into our image editor (Photoshop).

==Creating the Texture==

Now, to copy this into Photoshop, we're going to use the Print Screen button.  It should be located near the top right corner of your keyboard.  Press it once and it should copy everything you see onto the clipboard.

Now open Photoshop (or whatever image editor your using).  In Photoshop, you must create a new document, so do that now.  Photoshop automatically detects the size of the image on the clipboard and sets the dimensions for you.  Press CTRL+V to paste the image.

Now there are several ways to go about getting what we want, and what we want is the smal grid in the top left layout view.  It has our templates right there.  You can either select it with the select tool (M) or move it to the top left corner and adjust the dimensions of the image.  The easiest way is to select it, then copy it using CTRL+C.

Now, create a new image, again Photoshop puts the dimensions in for the clipboard item.  Paste it in using CTRL+V.  Ok you now should have a template that looks exactly like the grid in Lightwave.  Using thise template you can create a texture.  Anything inside the mesh line is what is going to appear on that part of the mesh.

Since this is just a tutorial, let's do some quick drawing:

[[Image:Legacy_LW-UVMapping-Texture1.jpeg|center|]]

It doesn't matter if you go over the lines, only what is inside the lines is going to appear on the model.  And since I want to get this done and I'm lazy, I'm only going to paint the top portion of the mine.  Ok so now you need to save this image as any of the formats listed below:

====Supported Image Formats====

{|

|-
|BMP
|Bitmap
|-
|JPG/JPEG
|JPEG
|-
|PSD
|Photoshop PSD
|-
|TGA
|Targa
|}

''More coming...''

I like Bitmap because it is very portable between programs.  So save it as something like XAxis_Panel.bmp.

==Applying the Texture==

Now we're ready to put the texture onto our mesh.  Let's go back into Lightwave now.  Click on the surface editor button or press CTRL+F3.  On the left side, you should see the list of your groups.  Select the Side_Side_Panels.  Now making sure that you're in the basic tab, click on the ''Texture'' button beside the color.  The Texture button is the button with a little T.

This is the texture window.  For projection choose UV, for UV Map choose XAxis_Sides, and for Image choose 'Load Image', and choose the image you just saved.  Now go to the top left viewport, and change the angle to 'Perspective', and change the render type to 'Texture'.  You should now see your texture applied to the right and left sides of the model!

[[Image:Legacy_LW-UVMapping-AppliedTexture.jpeg|center|]]

This is all good but we still need to texture our top/bottom sides.  Since we've already got everything setup, this should be a breeze.  Using the Polygon Statistics (W), select the Top/Bottom_Side_Panels group.  Make sure nothing else is selected and click the 'New UV Map' button.

Call this one 'ZAxis_Map' and set it's axis to Z.  Press ok and you should see your selected faces in the top left viewport.  Now to make things really easy, click on the render options button (the one wiith just a down arrow) and choose the image you just saved.

Scale your model using the modify tools until it fits the template.  If you want find control, use the 'Drag' tool (CTRL+T).  This allows you to move the points into perfect positions.  Now you'll notice that even though the model is lined up, it still doesn't show on the model.

Go back into the surface editor, and choose your Top/Bottom_Side_Panels group.  Click the texture button next to color.  Same thing as last time; Set Projection to UV, set UV Map to ZAxis_Map, and set image to your image.  Press 'Use Texture', close the surface editor and all the sides of your model should now have the texture.

==Discussion==

'''Amen:''' Wouldn't lightwave's anchor UV Map type do this quicker?

'''Mosquito[L5]:''' Possibly... You have to remember that I'm not as good as some people, and this is what I know.  If you have a suggestion that would be better, by all means, create a tutorial for it.

==Related Topics==

* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Lightwave|Lightwave]]

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lilguy</title>
    <id>1731</id>
    <revision>
      <id>4261</id>
      <timestamp>2004-12-11T13:40:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi, I started this page at 3:22 AM on May 16th 2004. &lt;br /&gt;I'd like to contribute to this community by logging my progress as I develop an Unreal tournament 2004 mod called Apprehension.&lt;br /&gt;If you don't recognize my name, I created the Healthbot mutator for 2003/2004 (2004 version coming soon) and I participate fairly regularly in the ut2004 mailing list.&lt;br /&gt;I look forward to helping out around here.&lt;br /&gt;Lilguy

===Contact Info===

====email====

email: try lilguy[at]planetunreal.com

====Instant messenger====

icq: 11933301

aim: aaronflippo

msn: aaronflippo@hotmail.com

yahoo: aaronflippo

===News===

'''''Sunday, June 13th, 2004'''''

Making some progress on [http://www.planetunreal.com/apprehension Apprehension], but I'm trying to recruit one or two good programmers, as well as a 3D artist or two...One thing my mod really lacks right now is a good website, so I don't think that's helping much...It's kinda funny, reading all these things about recruiting mod teams and how the leader has to have experience or nobody will want to join...Well, I'm just about finished with my B.S. in Comp. Sci (C, C++, Java, Python, etc, etc, etc), I've modding various games since Jedi Knight was the cool thing in town (anyone remember the Phantom Menace TC?) and I think our mod structure is fairly well-organized. We have all of our files on a subversion repository (like CVS) which maintains a todo list for everyone, we have a fairly complete design doc, and yet nobody but me is getting anything done...Why you ask? I dunno, because it's the lazy days of summer, I guess...

Anyway, I thought this might be a good oppourtunity to ask if anyone is interested in helping a really-cool concept and half-finished mod become a really cool finished game. :)

In other news, I finally downloaded the firefox browser, and the whole problem with the text editing box expanding itself to the right has finally gone away now that I'm not using i.e. I really miss my google and yahoo toolbars though...

'''''Thursday, June 17th, 2004'''''

I'm going to start a developer journal here: [[Legacy:Lilguy/Developer Journal|Lilguy/Developer Journal]] for my healthbot mutator and apprehension mod. 

'''''Friday, December 10th, 2004'''''

Well, as I noted in my developer journal, I've accepted a job offer from Raven software, so as of January 5th, I won't be able to work on mods any more :(

I'm busy with finals and Christmas right now, but before my final departure, I plan on organizing my Apprehension mod as I hand leadership off to the other programmer, Parallax. I fully expect the mod to be released sometime mid-year in 2005, and I think it's going to make some waves. I also plan on fixing up and releasing one final version of the Healthbot mutator.

In conclusion &amp;ndash; if anyone's wondering: yes, modding really ''does'' pay off in the long run :)

===Chattering===

----

'''Tarquin:''' Line break:&lt;br /&gt;and you need a return in source too.

A return in source without the \\ makes a new paragraph. Welcome to the wiki :D

'''Lilguy:''' thanks! I knew it must be something simple.... Hey Tarquin, you're doing a great job with this site, I hope I can assist&lt;br /&gt;One suggestion I have is to create icons for the various games (ut, ut2003, ut2004) and add the functionality to tag a page with what game(s) it applies to, then show the icon next to the page in the search/categories pages Or even better, put the option in the search so you can filter gametypes. I know it would mean a massive revision, but one of the only complaints I hear about the site is a lack of organization.

'''Tarquin:''' Thanks :) We have icons for the different games, you'll see them on class pages. However, we don't have a distinctive one for UT2004 yet :( Your search idea has been suggested before, but it would involve too much work on the server, I think. I think what we need to do is work on improving the forward index pages (the &quot;topic&quot; pages), and perhaps adding more categories to tag pages. We have &quot;Category Mapping&quot;, but that could be split into &quot;Category Mapping (UT)&quot; and so on. Worth suggesting on the Category discussion page, wherever it is... 

'''Lilguy:''' Ok, I see those icons now...I guess what I had in mind was to put the icons on the actual links, either in the category pages etc...I could see how that could mean more work for the server, but I think it'd be worth it for the added structure...Also, for a lot of classes etc. it's appropriate to have an icon for 2003 and 2004. Is it possible to have more than one icon/category for a page?

I'll bring this over to the discussion page...

'''EntropicLqd:''' I just realised what was missing.  It's a belated Hi, welcome to the Wiki.  I hope you enjoy your stay here :).  Keep up the good work you've been doing on here.  It's been interesting stuff.

'''Lilguy:''' Hey thanks, it's always nice to get an encouraging word once in awhile!

'''Tarquin:''' Hey, that's fantastic news about the job with Raven! Congratulations! :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4262</id>
      <timestamp>2004-12-10T23:46:32Z</timestamp>
      <contributor>
        <ip>Royal30.cs.wisc.edu</ip>
      </contributor>
      <comment>Probably my final post here.</comment>
      <text xml:space="preserve">Hi, I started this page at 3:22 AM on May 16th 2004. &lt;br /&gt;I'd like to contribute to this community by logging my progress as I develop an Unreal tournament 2004 mod called Apprehension.&lt;br /&gt;If you don't recognize my name, I created the Healthbot mutator for 2003/2004 (2004 version coming soon) and I participate fairly regularly in the ut2004 mailing list.&lt;br /&gt;I look forward to helping out around here.&lt;br /&gt;Lilguy

===Contact Info===

====email====

email: try lilguy[at]planetunreal.com

====Instant messenger====

icq: 11933301

aim: aaronflippo

msn: aaronflippo@hotmail.com

yahoo: aaronflippo

===News===

'''''Sunday, June 13th, 2004'''''

Making some progress on [http://www.planetunreal.com/apprehension Apprehension], but I'm trying to recruit one or two good programmers, as well as a 3D artist or two...One thing my mod really lacks right now is a good website, so I don't think that's helping much...It's kinda funny, reading all these things about recruiting mod teams and how the leader has to have experience or nobody will want to join...Well, I'm just about finished with my B.S. in Comp. Sci (C, C++, Java, Python, etc, etc, etc), I've modding various games since Jedi Knight was the cool thing in town (anyone remember the Phantom Menace TC?) and I think our mod structure is fairly well-organized. We have all of our files on a subversion repository (like CVS) which maintains a todo list for everyone, we have a fairly complete design doc, and yet nobody but me is getting anything done...Why you ask? I dunno, because it's the lazy days of summer, I guess...

Anyway, I thought this might be a good oppourtunity to ask if anyone is interested in helping a really-cool concept and half-finished mod become a really cool finished game. :)

In other news, I finally downloaded the firefox browser, and the whole problem with the text editing box expanding itself to the right has finally gone away now that I'm not using i.e. I really miss my google and yahoo toolbars though...

'''''Thursday, June 17th, 2004'''''

I'm going to start a developer journal here: [[Legacy:Lilguy/Developer Journal|Lilguy/Developer Journal]] for my healthbot mutator and apprehension mod. 

'''''Friday, December 10th, 2004'''''

Well, as I noted in my developer journal, I've accepted a job offer from Raven software, so as of January 5th, I won't be able to work on mods any more :(

I'm busy with finals and Christmas right now, but before my final departure, I plan on organizing my Apprehension mod as I hand leadership off to the other programmer, Parallax. I fully expect the mod to be released sometime mid-year in 2005, and I think it's going to make some waves. I also plan on fixing up and releasing one final version of the Healthbot mutator.

In conclusion &amp;ndash; if anyone's wondering: yes, modding really ''does'' pay off in the long run :)

===Chattering===

----

'''Tarquin:''' Line break:&lt;br /&gt;and you need a return in source too.

A return in source without the \\ makes a new paragraph. Welcome to the wiki :D

'''Lilguy:''' thanks! I knew it must be something simple.... Hey Tarquin, you're doing a great job with this site, I hope I can assist&lt;br /&gt;One suggestion I have is to create icons for the various games (ut, ut2003, ut2004) and add the functionality to tag a page with what game(s) it applies to, then show the icon next to the page in the search/categories pages Or even better, put the option in the search so you can filter gametypes. I know it would mean a massive revision, but one of the only complaints I hear about the site is a lack of organization.

'''Tarquin:''' Thanks :) We have icons for the different games, you'll see them on class pages. However, we don't have a distinctive one for UT2004 yet :( Your search idea has been suggested before, but it would involve too much work on the server, I think. I think what we need to do is work on improving the forward index pages (the &quot;topic&quot; pages), and perhaps adding more categories to tag pages. We have &quot;Category Mapping&quot;, but that could be split into &quot;Category Mapping (UT)&quot; and so on. Worth suggesting on the Category discussion page, wherever it is... 

'''Lilguy:''' Ok, I see those icons now...I guess what I had in mind was to put the icons on the actual links, either in the category pages etc...I could see how that could mean more work for the server, but I think it'd be worth it for the added structure...Also, for a lot of classes etc. it's appropriate to have an icon for 2003 and 2004. Is it possible to have more than one icon/category for a page?

I'll bring this over to the discussion page...

'''EntropicLqd:''' I just realised what was missing.  It's a belated Hi, welcome to the Wiki.  I hope you enjoy your stay here :).  Keep up the good work you've been doing on here.  It's been interesting stuff.

'''Lilguy:''' Hey thanks, it's always nice to get an encouraging word once in awhile!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lilguy/Developer Journal</title>
    <id>1734</id>
    <revision>
      <id>4268</id>
      <timestamp>2006-04-06T22:22:40Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">Page created Thursday June 17th, 2004

This page contains my development journal and some random thoughts about the projects I'm working on. Primarily, the UT2004 mod Apprehension.

[http://www.planetunreal.com/apprehension Apprehension homepage on PlanetUnreal]

{{classbox| June 18th, 2004.            ''' &quot;The Introduction&quot;  '''}}

Well, here goes. We've been developing Apprehension about a year now. Not a whole lot to show for it considering that timeframe, but it's slowly moving forward. I really believe the concept of the game is worth completing, even if not in time for some contest :)

I like to call Apprehension a realtime strategy game from a first person perspective. Yes, I've heard of ''Savage'' and ''C&amp;C Red Alert'', and yes I've played ''Natural Selection'', and I know we're not the ''first'' ones to make a game with this idea. Many people don't believe me, however, when I tell them that we came up with this concept before we even heard of any of those other games. Apprehension was born as an idea between a good friend and me, to combine our love of realtime strategy games like ''Starcraft'' and ''Empire Earth'' with the intense action of ''Unreal Tournament'' and ''Half-life.'' To pull this off sucessfully would not be easy. You can't allow the same level of resources and upgrade management as ''Empire Earth'' while expecting players to participate in gunfights at the same time, and you can't allow the crazy intense action of ''Unreal Tournament'' while expecting players to organize armies of units. There must be a perfect balance somewhere, and our goal is to find it, creating a gameplay experience that stands out in a genre that's quickly becoming crowded.

To this end, we quickly made several important design decisions.&lt;br /&gt;First, the strategy end of the game must be simplified. Upgrades and research are not a central part of the game; there may be a few upgrades available, but for the most part you just build a base or a resource collector and be done with it.&lt;br /&gt;Secondly, the interface must be simplified. I borrowed Maya's mouse interface for our menu system, so you click a button to bring up a menu, drag the mouse over the option you want on a dial, release the mouse button, and the nearest object is selected. This is essentially one button press and release that gives you access to every type of building and unit in the game. Slick.&lt;br /&gt;Thirdly, teamplay is to become a major emphasis. We don't like the idea of a class system, and we don't like the idea of a &quot;commander&quot; sitting somewhere telling everyone else what to do. In Apprehension country, everyone is spawned with the equal right to survive and succeed. Small teams are encouraged (and maybe even required) and Apprehension includes severall interface improvements to make the all-essential teamwork easier. Of course, UT2004's introduction of voice chat has really helped with that too Thanks Epic!&lt;br /&gt;Lastly, we want to feature AI controlled droids that can carry out many tasks. They might not be the primary fighters, but will play an important role in the strategy aspect of the game.

I've learned a lot by starting this project. This isn't the first mod I've worked on, but it's the first one I've led. I've discovered that:&lt;br /&gt;(1) it's really hard to find help.&lt;br /&gt;(2) when you find help, it's really hard to find ''good'' help. Some people don't mind trying their hand at game dev. but most of them don't see it as career.&lt;br /&gt;(3) when you find good help, it's really hard to convince that person to stay and keep helping.

And so, the current state of the game is that we have a very detailed plan (although maybe not documented quite as well as it should be) and a ''lot'' of code. I'm fairly adept at 3D modeling, but I decided awhile back that my time is best spent programming, and we'll add the pretty details later. We've got a big to-do list with some fairly detailed instructions, and not a lot of time on our hands these days. I'm trying to find the time to redevelop our website and design doc, in hopes of attracting a few good programmers, level designers, and artists, but no leads yet. In the end it's worth it to me to keep developing this game, even if it takes another year to finish, but it'd be nice if we could get something released this summer.

On the upside, I got a really good idea from my younger brother tonight. Not necessarily totally original, but cool nonetheless. Instead of giving players 10-15 different weapons, we could give them maybe 3: a multi-purpose nano tool (used for construction and repair) a melee weapon (which is a knife with poisonous needles on the handle) and the third weapon would be totally configurable. You'd be given a certain number of &quot;weapon points&quot; to work with. Then you'd be given a choice of primary and secondary attachments each costing a certain number of points, and a number of extra points to increase various attributes like firing rate, ammo capacity, scope zoom, etc. So someone could build something that had a sniper rifle for primary fire, and the scope would be the secondary attachment. Or you could have a weaker machine gun for primary fire, and a rapid fire missile launcher on the secondary. You could configure your weapon in the preferences before the game, or build it on the fly. You'd also be able to store a number of presets, and quickly switch between them at weapon stations in the game. This should make the class-based shooter people happy, and also serve to simplify the action since there won't be 10 weapons to switch between. Anyone else think this is a good idea? I'd be happy to hear some opinions.

If anyone's actually read this far, I think you deserve a cookie :)

{{classbox| June 22th, 2004.            ''' &quot;Configurable Weapons&quot;  '''}}

Well this will be brief since it's almost 3am and I need some sleep :)

We've been hashing out the details on the plans for configurable weapons. Basically what we decided is that you'll get a certain number of configuration points, which you could use to choose a primary and secondary attachment. Then the remaining points could be used to improve each attachment in any combination of 3 categories: Firing rate, Damage amount, and projectile rate. Certain attachments will not apply to certain categories. For instance, instant hit weapons will not be upgradable in the projectile rate category. We might add add a &quot;special&quot; category as well, for things like adding a tracking ability to a sniper scope.

The user will be able to configure a weapon ahead of time and save presets to an .ini file, and then in game would be able to choose the presets. They could also choose to configure a weapon in-game if they wanted to, with an easy push button interface. Users will also be able to name their weapon presets, so you might see something like &quot;lilguy was killed by someone's crapblaster&quot; etc.

Here are some of the attachments we're cooking up right now:
*For primary attachments:
**Missile launcher
**High power energy rifle (instant-hit sniper rifle)
**Automatic machine gun.
**sub light speed laster gun (think star wars blaster rifles)
*For secondary attachments:
**Sniper scope (special upgrade adds tracking ability)
**grenade launcher (projectile rate increases distance)
**Shield (special upgrade creates stronger shield or full-body shield)
**death prod (some sort of spinning claw or other wicked melee weapon)

I think the most challenging part of all this is going to be the programming. Since everything is going to be basically one weapon class, all the work is going to have to be done in the attachments, which will basically be the 2 weapon fires, or classes containing them. We'll have to figure out how to effectively replicate the appropriate values such as the attachment classes and stats for each module. Another big challenge will be designing a weapon chassis that can be used with all these sorts of weapons, and making the weapon attachments that can fit them. I think it will be worth it though; it'll add another dimension to the strategy element, and people who like to sit and configure their civilizations will have a hayday with it.

I think initially we'll try giving the user one weapon to start with in addition to a melee weapon, and perhaps we'll allow more weapon slots for purchase at the home base as one time upgrades for the whole team, or as personal upgrades.

Ideas?

{{classbox| July 31st, 2004.            ''' &quot;We have a game! (Almost)&quot;  '''}}

We've seen some pretty significant progress lately. About two weeks ago we were joined by Chad Self, a 3D artist with professional experience (he led the art team for a game called ''Extinction'' which was being created by a company that went under) He'll be doing some real artwork for us, and has already done some concept art.

Just a few days after Chad, I also got a note from Parallax, an enthusiastic coder from New Zeland. Due to the lack of progress from almost everyone else who's signed on as a coder, I was reluctant to add another to the list. However, after seeing his resume' and his desire to work on the mod, I couldn't help it. The first night he signed up, he had already checked out the repository, installed WotGreal, and started reading the code. By the first week he had already fixed our dedicated server glitch, read through all of our source code and fixed several bugs, and basically gave the project a shot in the arm. Pretty impressive for someone with no experience with UScript, eh?

On his suggestion, we quickly made our primary goal to make a playable version of the game. Nothing fancy, just some simple rules and functioning objects that make a game. In the last two weeks, here's what we've accomplished:

*Resolved all the dedicated server issues we were having, so we can actually run games now
*Created functioning resource collectors to go along with Crystal mines, and resource counters for teams and individual players
*Created rules for bounty resources for building and player kills.
*Got a functioning HUD class up and running
*Finished up the turret AI. After over a year's time from design/modeling to ai and FX, these dual action laser/missile turrets really ''kick ass''. I know you'll like 'em.
*Created a real design doc ;)
*Finally produced a working map, Scorpion. It's a rocky desert valley with an oasis-type cave in the center (The cave isn't quite finished yet, but soon will be)
*Created a weapon station which is an attachment to the home base. We'll soon add the configurable weapons talked about in the last post

After we finish up coding the game rules that determine when someone wins (think: destroy your opponent and everything he holds dear) we'll have a game where you can:

# start with a home base at your end of the map
# Build extra bases, resource collectors, turrets, and functioning Land/Air factories (which spawn standard ONS vehicles for now)anywhere on the map the terrain allows.
# Kill your opponents or defend your resource collectors to earn more RUs, to make yourself even more deadly.
# use bases to obtain and reload weapons, and restore health.
# cut off your opponents' resources, destroy his bases which are used to respawn, then destroy the players to win the game.

It may be pretty simple, but I'm pretty damn excited about actually having a functioning game. I'll keep you posted.

P.S. Are you a mapper who likes creating big outdoor maps, but hates adding details like Health chargers and weapon lockers, who happens to be looking for a project to work on? email: lilguy@planetunreal.com ;)

{{classbox| October 14th, 2004.            ''' &quot;Internal alpha this weekend&quot;  '''}}

Ok, this will probably be short, as I'm trying to finish up a late homework before tomorrow, but I needed a break :)

We've been making spectacular progress. Our team now has 3 artists (although I haven't heard from the third one in a couple weeks now) and 2 dedicated programmers (and one part-time one). The only thing we really lack is a good level designer with a lot of time.

One of our artists has been hard at work designing the configurable weapons described in the penultimate post. Sometime soon I'll put up some pictures of 'em, but needless to say, they look really sleek.

Parallax and I have been spending most of our time cleaning up old code and making things work smoothly on dedicated server games. We've definitely got something that could be considered playable now, albiet with a few shortcomings. For now you can ask a weapon station for any of 8 standard UT2004 weapons, and spawn any vehicles in the game. We have one map that's looking excellent, and I expect to squash all the major bugs by this Friday for a lan party I'm going to.

As a side note, I noticed a few weeks ago that someone (I think it was DE working on Pariah) mentioned that they're going to have configurable weapons. Think that's cool? well, read my previous post from more than a month before that :) I hate when that happens...Oh well, chances are, we'll make a release before they do, and someday in a chatroom when someone says &quot;oh yeah, DE invented the idea of configurable weapons&quot; some other guy will say &quot;no way man, there was a mod called Apprehension that had those way before that game, it's just that no one ever heard of Apprehension,&quot; or something like that...

Chances are, there's already a game out there that does what we're planning on doing for configurable weapons, I just didn't know about it..Oh well, it's still a cool idea, and I think we'll make it worth playing.

My next big project is going to be getting our marker system working so we can place markers on the minimap or in the actual game, which could serve as goal points for droids/bots, targets for devastator missiles, and flares for your teammates. The system is actually almost done, just need to work out a few bugs and link it together with the devastator. I'm having a blast making all this progress, and it really feels like it's accelerating.

{{classbox| November 5th, 2004.            ''' &quot;Configurable weapon concepts, progress&quot;  '''}}

We made a LOT of progress this week. Parallax got turrets to attack buildings and other turrets, in addition to droids and players. Markers are now working pretty well, you can place them anywhere and your team sees them. I also got some concepts from Dwight, one of our artists a couple weeks ago, with 12 designs for configurable weapons. You can see all 12 of 'em in these 3 shots:

http://mods.moddb.com/gallery/image/17586/

http://mods.moddb.com/gallery/image/17585/

http://mods.moddb.com/gallery/image/17584/

The yellow marks are the places where the secondary attachments can go.

I also did some significant programming this week on the ConfigWeapon class, and made a test just to prove to myself that this is all possible.  It's a sniper rifle with an lcd screen as an attachment. The screen uses a render to texture to give you a live zoomed view.  That way you don't have to switch between a main view and a scope view. Very fun :)

Our hud is also slowly evolving. Buildings now give you status information when you look at them for a couple seconds. And lots of other little advancements too numerous to mention.

In other news, we're still looking for mappers.

{{classbox| October 14th, 2004.            ''' &quot;Progress update, and a bittersweet goodbye&quot;  '''}}

Well, this week marks a major milestone in my career, and the close of a chapter in my life that will be dearly missed.

I was given an offer I couldn't refuse by Raven software [http://www.ravensoft.com] and per the standard game industry contract, I won't be able to work on game mods any more (especially for competitor's games)

Effective sometime early in January, I'm handing control of the mod over to Parallax, who will carry the flag as best he can. We've also been joined recently by 2 new mappers (one of which who has already made two maps, put a cave in one of the old ones, and modeled/texured two weapons), a webmaster (new site soon) and a third modeler who's currently working on the heavy roamer craft. I fully expect this mod to be released sometime next year, possibly in about 5-6 months. I really think it'll shake things up.

Just want to say on a closing note, the Unreal modding community rocks. I've never seen a more talented, dedicated, and enthusiastic crowd anywhere. Game on!

====Discussion/flames ====

'''Lilguy:''' Feel free to comment on anything here, it'd be nice to get some feedback once in awhile :)

'''EntropicLqd:''' I'll take a cookie :)  I like the idea of the configurable weapons but I'd drop the knife and allow players to carry two and maybe make the construction/repair tool a short range melee weapon.  I mean - it's not like the melee weapon is going to get used a whole lot.
: I went to your website and read the design doc.  One thing that did occur to me is that making the game work for a small number of players could be quite difficult.

'''Lilguy:''' Hi again, thanks for the comments!

Well, one of the ideas for the knife was to give the player some sort of &quot;stealth&quot; mode, where he could walk around for awhile in a hidden state, and sneak up behind people and stick them with the poison needles, causing them to immediately freeze up, fall over and die. This would be balanced out by the scout drone, who can spot people in stealth mode and warn players about their location.

The Nano tool is our building tool in the game, it's the method for making buildings and repairing them, along with repairing droids and perhaps other teammates. We thought about making it into a weapon for awhile, but Just couldn't figure out how to do that with 2 fire modes...

What in particular do you think will be difficult with few players? We thought just the opposite, that it would be frustrating trying to work with 16 people on a team, each trying to spend the team's resources and make decisions like where to build bases and turrets. With say, 4 people on a team, everyone will get a chance to speak his mind more often, and there'd be a lot less conflict when it comes to spending money on things. Another we considered is that with all these droids flying around, lag will quickly become a major issue, so less players might be a good thing. I'd be interested in your point of view, though.

'''MythOpus:'''  I'm currently in the process of developing a mod with a resource feature... however I haven't been able to implement it.  Would you mind explaining how you 

'''Lilguy:''' Something must've got cut off there, so I'm not sure what you wanted to know about our resource system. It's pretty simple though; we keep a counter in a custom TeamInfo class for the team resources, and a personal stash counter in a custom PlayerReplicationInfo class. Resource collectors when placed on a crystal mine simply add resources slowly to the team stash. If there's something else you'd like to know, ask here, or better yet email me: lilguy@planetunreal.com and I'll be happy to share.

'''MythOpus:''' Thanks :)  I had that idea too but I had no Idea how to implement the new TeamInfo class.

'''Lilguy:''' Anythying in particular that was tripping you up, or have you figured it all out now?

'''EntropicLqd:''' Heh, have fun in your new venture.  I'd like to say that I'm not jealous, but I am really.  Hope it all works out and that you get some sleep.  :up:

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4269</id>
      <timestamp>2006-04-06T21:06:43Z</timestamp>
      <contributor>
        <ip>202.57.129.114.rev-ip.isp-thailand.com</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">Page created Thursday June 17th, 2004

This page contains my development journal and some random thoughts about the projects I'm working on. Primarily, the UT2004 mod Apprehension.

[http://www.planetunreal.com/apprehension Apprehension homepage on PlanetUnreal]

{{classbox| June 18th, 2004.            ''' &quot;The Introduction&quot;  '''}}

Well, here goes. We've been developing Apprehension about a year now. Not a whole lot to show for it considering that timeframe, but it's slowly moving forward. I really believe the concept of the game is worth completing, even if not in time for some contest :)

I like to call Apprehension a realtime strategy game from a first person perspective. Yes, I've heard of ''Savage'' and ''C&amp;C Red Alert'', and yes I've played ''Natural Selection'', and I know we're not the ''first'' ones to make a game with this idea. Many people don't believe me, however, when I tell them that we came up with this concept before we even heard of any of those other games. Apprehension was born as an idea between a good friend and me, to combine our love of realtime strategy games like ''Starcraft'' and ''Empire Earth'' with the intense action of ''Unreal Tournament'' and ''Half-life.'' To pull this off sucessfully would not be easy. You can't allow the same level of resources and upgrade management as ''Empire Earth'' while expecting players to participate in gunfights at the same time, and you can't allow the crazy intense action of ''Unreal Tournament'' while expecting players to organize armies of units. There must be a perfect balance somewhere, and our goal is to find it, creating a gameplay experience that stands out in a genre that's quickly becoming crowded.

To this end, we quickly made several important design decisions.&lt;br /&gt;First, the strategy end of the game must be simplified. Upgrades and research are not a central part of the game; there may be a few upgrades available, but for the most part you just build a base or a resource collector and be done with it.&lt;br /&gt;Secondly, the interface must be simplified. I borrowed Maya's mouse interface for our menu system, so you click a button to bring up a menu, drag the mouse over the option you want on a dial, release the mouse button, and the nearest object is selected. This is essentially one button press and release that gives you access to every type of building and unit in the game. Slick.&lt;br /&gt;Thirdly, teamplay is to become a major emphasis. We don't like the idea of a class system, and we don't like the idea of a &quot;commander&quot; sitting somewhere telling everyone else what to do. In Apprehension country, everyone is spawned with the equal right to survive and succeed. Small teams are encouraged (and maybe even required) and Apprehension includes severall interface improvements to make the all-essential teamwork easier. Of course, UT2004's introduction of voice chat has really helped with that too Thanks Epic!&lt;br /&gt;Lastly, we want to feature AI controlled droids that can carry out many tasks. They might not be the primary fighters, but will play an important role in the strategy aspect of the game.

I've learned a lot by starting this project. This isn't the first mod I've worked on, but it's the first one I've led. I've discovered that:&lt;br /&gt;(1) it's really hard to find help.&lt;br /&gt;(2) when you find help, it's really hard to find ''good'' help. Some people don't mind trying their hand at game dev. but most of them don't see it as career.&lt;br /&gt;(3) when you find good help, it's really hard to convince that person to stay and keep helping.

And so, the current state of the game is that we have a very detailed plan (although maybe not documented quite as well as it should be) and a ''lot'' of code. I'm fairly adept at 3D modeling, but I decided awhile back that my time is best spent programming, and we'll add the pretty details later. We've got a big to-do list with some fairly detailed instructions, and not a lot of time on our hands these days. I'm trying to find the time to redevelop our website and design doc, in hopes of attracting a few good programmers, level designers, and artists, but no leads yet. In the end it's worth it to me to keep developing this game, even if it takes another year to finish, but it'd be nice if we could get something released this summer.

On the upside, I got a really good idea from my younger brother tonight. Not necessarily totally original, but cool nonetheless. Instead of giving players 10-15 different weapons, we could give them maybe 3: a multi-purpose nano tool (used for construction and repair) a melee weapon (which is a knife with poisonous needles on the handle) and the third weapon would be totally configurable. You'd be given a certain number of &quot;weapon points&quot; to work with. Then you'd be given a choice of primary and secondary attachments each costing a certain number of points, and a number of extra points to increase various attributes like firing rate, ammo capacity, scope zoom, etc. So someone could build something that had a sniper rifle for primary fire, and the scope would be the secondary attachment. Or you could have a weaker machine gun for primary fire, and a rapid fire missile launcher on the secondary. You could configure your weapon in the preferences before the game, or build it on the fly. You'd also be able to store a number of presets, and quickly switch between them at weapon stations in the game. This should make the class-based shooter people happy, and also serve to simplify the action since there won't be 10 weapons to switch between. Anyone else think this is a good idea? I'd be happy to hear some opinions.

If anyone's actually read this far, I think you deserve a cookie :)

{{classbox| June 22th, 2004.            ''' &quot;Configurable Weapons&quot;  '''}}

Well this will be brief since it's almost 3am and I need some sleep :)

We've been hashing out the details on the plans for configurable weapons. Basically what we decided is that you'll get a certain number of configuration points, which you could use to choose a primary and secondary attachment. Then the remaining points could be used to improve each attachment in any combination of 3 categories: Firing rate, Damage amount, and projectile rate. Certain attachments will not apply to certain categories. For instance, instant hit weapons will not be upgradable in the projectile rate category. We might add add a &quot;special&quot; category as well, for things like adding a tracking ability to a sniper scope.

The user will be able to configure a weapon ahead of time and save presets to an .ini file, and then in game would be able to choose the presets. They could also choose to configure a weapon in-game if they wanted to, with an easy push button interface. Users will also be able to name their weapon presets, so you might see something like &quot;lilguy was killed by someone's crapblaster&quot; etc.

Here are some of the attachments we're cooking up right now:
*For primary attachments:
**Missile launcher
**High power energy rifle (instant-hit sniper rifle)
**Automatic machine gun.
**sub light speed laster gun (think star wars blaster rifles)
*For secondary attachments:
**Sniper scope (special upgrade adds tracking ability)
**grenade launcher (projectile rate increases distance)
**Shield (special upgrade creates stronger shield or full-body shield)
**death prod (some sort of spinning claw or other wicked melee weapon)

I think the most challenging part of all this is going to be the programming. Since everything is going to be basically one weapon class, all the work is going to have to be done in the attachments, which will basically be the 2 weapon fires, or classes containing them. We'll have to figure out how to effectively replicate the appropriate values such as the attachment classes and stats for each module. Another big challenge will be designing a weapon chassis that can be used with all these sorts of weapons, and making the weapon attachments that can fit them. I think it will be worth it though; it'll add another dimension to the strategy element, and people who like to sit and configure their civilizations will have a hayday with it.

I think initially we'll try giving the user one weapon to start with in addition to a melee weapon, and perhaps we'll allow more weapon slots for purchase at the home base as one time upgrades for the whole team, or as personal upgrades.

Ideas?

{{classbox| July 31st, 2004.            ''' &quot;We have a game! (Almost)&quot;  '''}}

We've seen some pretty significant progress lately. About two weeks ago we were joined by Chad Self, a 3D artist with professional experience (he led the art team for a game called ''Extinction'' which was being created by a company that went under) He'll be doing some real artwork for us, and has already done some concept art.

Just a few days after Chad, I also got a note from Parallax, an enthusiastic coder from New Zeland. Due to the lack of progress from almost everyone else who's signed on as a coder, I was reluctant to add another to the list. However, after seeing his resume' and his desire to work on the mod, I couldn't help it. The first night he signed up, he had already checked out the repository, installed WotGreal, and started reading the code. By the first week he had already fixed our dedicated server glitch, read through all of our source code and fixed several bugs, and basically gave the project a shot in the arm. Pretty impressive for someone with no experience with UScript, eh?

On his suggestion, we quickly made our primary goal to make a playable version of the game. Nothing fancy, just some simple rules and functioning objects that make a game. In the last two weeks, here's what we've accomplished:

*Resolved all the dedicated server issues we were having, so we can actually run games now
*Created functioning resource collectors to go along with Crystal mines, and resource counters for teams and individual players
*Created rules for bounty resources for building and player kills.
*Got a functioning HUD class up and running
*Finished up the turret AI. After over a year's time from design/modeling to ai and FX, these dual action laser/missile turrets really ''kick ass''. I know you'll like 'em.
*Created a real design doc ;)
*Finally produced a working map, Scorpion. It's a rocky desert valley with an oasis-type cave in the center (The cave isn't quite finished yet, but soon will be)
*Created a weapon station which is an attachment to the home base. We'll soon add the configurable weapons talked about in the last post

After we finish up coding the game rules that determine when someone wins (think: destroy your opponent and everything he holds dear) we'll have a game where you can:

# start with a home base at your end of the map
# Build extra bases, resource collectors, turrets, and functioning Land/Air factories (which spawn standard ONS vehicles for now)anywhere on the map the terrain allows.
# Kill your opponents or defend your resource collectors to earn more RUs, to make yourself even more deadly.
# use bases to obtain and reload weapons, and restore health.
# cut off your opponents' resources, destroy his bases which are used to respawn, then destroy the players to win the game.

It may be pretty simple, but I'm pretty damn excited about actually having a functioning game. I'll keep you posted.

P.S. Are you a mapper who likes creating big outdoor maps, but hates adding details like Health chargers and weapon lockers, who happens to be looking for a project to work on? email: lilguy@planetunreal.com ;)

{{classbox| October 14th, 2004.            ''' &quot;Internal alpha this weekend&quot;  '''}}

Ok, this will probably be short, as I'm trying to finish up a late homework before tomorrow, but I needed a break :)

We've been making spectacular progress. Our team now has 3 artists (although I haven't heard from the third one in a couple weeks now) and 2 dedicated programmers (and one part-time one). The only thing we really lack is a good level designer with a lot of time.

One of our artists has been hard at work designing the configurable weapons described in the penultimate post. Sometime soon I'll put up some pictures of 'em, but needless to say, they look really sleek.

Parallax and I have been spending most of our time cleaning up old code and making things work smoothly on dedicated server games. We've definitely got something that could be considered playable now, albiet with a few shortcomings. For now you can ask a weapon station for any of 8 standard UT2004 weapons, and spawn any vehicles in the game. We have one map that's looking excellent, and I expect to squash all the major bugs by this Friday for a lan party I'm going to.

As a side note, I noticed a few weeks ago that someone (I think it was DE working on Pariah) mentioned that they're going to have configurable weapons. Think that's cool? well, read my previous post from more than a month before that :) I hate when that happens...Oh well, chances are, we'll make a release before they do, and someday in a chatroom when someone says &quot;oh yeah, DE invented the idea of configurable weapons&quot; some other guy will say &quot;no way man, there was a mod called Apprehension that had those way before that game, it's just that no one ever heard of Apprehension,&quot; or something like that...

Chances are, there's already a game out there that does what we're planning on doing for configurable weapons, I just didn't know about it..Oh well, it's still a cool idea, and I think we'll make it worth playing.

My next big project is going to be getting our marker system working so we can place markers on the minimap or in the actual game, which could serve as goal points for droids/bots, targets for devastator missiles, and flares for your teammates. The system is actually almost done, just need to work out a few bugs and link it together with the devastator. I'm having a blast making all this progress, and it really feels like it's accelerating.

{{classbox| November 5th, 2004.            ''' &quot;Configurable weapon concepts, progress&quot;  '''}}

We made a LOT of progress this week. Parallax got turrets to attack buildings and other turrets, in addition to droids and players. Markers are now working pretty well, you can place them anywhere and your team sees them. I also got some concepts from Dwight, one of our artists a couple weeks ago, with 12 designs for configurable weapons. You can see all 12 of 'em in these 3 shots:

http://mods.moddb.com/gallery/image/17586/

http://mods.moddb.com/gallery/image/17585/

http://mods.moddb.com/gallery/image/17584/

The yellow marks are the places where the secondary attachments can go.

I also did some significant programming this week on the ConfigWeapon class, and made a test just to prove to myself that this is all possible.  It's a sniper rifle with an lcd screen as an attachment. The screen uses a render to texture to give you a live zoomed view.  That way you don't have to switch between a main view and a scope view. Very fun :)

Our hud is also slowly evolving. Buildings now give you status information when you look at them for a couple seconds. And lots of other little advancements too numerous to mention.

In other news, we're still looking for mappers.

{{classbox| October 14th, 2004.            ''' &quot;Progress update, and a bittersweet goodbye&quot;  '''}}

Well, this week marks a major milestone in my career, and the close of a chapter in my life that will be dearly missed.

I was given an offer I couldn't refuse by Raven software [http://www.ravensoft.com] and per the standard game industry contract, I won't be able to work on game mods any more (especially for competitor's games)

Effective sometime early in January, I'm handing control of the mod over to Parallax, who will carry the flag as best he can. We've also been joined recently by 2 new mappers (one of which who has already made two maps, put a cave in one of the old ones, and modeled/texured two weapons), a webmaster (new site soon) and a third modeler who's currently working on the heavy roamer craft. I fully expect this mod to be released sometime next year, possibly in about 5-6 months. I really think it'll shake things up.

Just want to say on a closing note, the Unreal modding community rocks. I've never seen a more talented, dedicated, and enthusiastic crowd anywhere. Game on!

====Discussion/flames ====

'''Lilguy:''' Feel free to comment on anything here, it'd be nice to get some feedback once in awhile :)

'''EntropicLqd:''' I'll take a cookie :)  I like the idea of the configurable weapons but I'd drop the knife and allow players to carry two and maybe make the construction/repair tool a short range melee weapon.  I mean - it's not like the melee weapon is going to get used a whole lot.
: I went to your website and read the design doc.  One thing that did occur to me is that making the game work for a small number of players could be quite difficult.

'''Lilguy:''' Hi again, thanks for the comments!

Well, one of the ideas for the knife was to give the player some sort of &quot;stealth&quot; mode, where he could walk around for awhile in a hidden state, and sneak up behind people and stick them with the poison needles, causing them to immediately freeze up, fall over and die. This would be balanced out by the scout drone, who can spot people in stealth mode and warn players about their location.

The Nano tool is our building tool in the game, it's the method for making buildings and repairing them, along with repairing droids and perhaps other teammates. We thought about making it into a weapon for awhile, but Just couldn't figure out how to do that with 2 fire modes...

What in particular do you think will be difficult with few players? We thought just the opposite, that it would be frustrating trying to work with 16 people on a team, each trying to spend the team's resources and make decisions like where to build bases and turrets. With say, 4 people on a team, everyone will get a chance to speak his mind more often, and there'd be a lot less conflict when it comes to spending money on things. Another we considered is that with all these droids flying around, lag will quickly become a major issue, so less players might be a good thing. I'd be interested in your point of view, though.

'''MythOpus:'''  I'm currently in the process of developing a mod with a resource feature... however I haven't been able to implement it.  Would you mind explaining how you 

'''Lilguy:''' Something must've got cut off there, so I'm not sure what you wanted to know about our resource system. It's pretty simple though; we keep a counter in a custom TeamInfo class for the team resources, and a personal stash counter in a custom PlayerReplicationInfo class. Resource collectors when placed on a crystal mine simply add resources slowly to the team stash. If there's something else you'd like to know, ask here, or better yet email me: lilguy@planetunreal.com and I'll be happy to share.

'''MythOpus:''' Thanks :)  I had that idea too but I had no Idea how to implement the new TeamInfo class.

'''Lilguy:''' Anythying in particular that was tripping you up, or have you figured it all out now?

'''EntropicLqd:''' Heh, have fun in your new venture.  I'd like to say that I'm not jealous, but I am really.  Hope it all works out and that you get some sleep.  :up:

----

[[:Category:Legacy Journal]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LimitationVolume</title>
    <id>1736</id>
    <revision>
      <id>4272</id>
      <timestamp>2005-12-16T23:14:25Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; [[Legacy:Volume|Volume]] &gt;&gt; LimitationVolume (Package: XWeapons)}}

Used to limit where various objects can go.

The LimitationVolume limits projectiles, making them and their effects disappear immediately.  It allows you to specify an effect to play when one of these comes into contact with the volume.  LimitationVolumes are generally used to line the bounds of an outdoor map or skybox, so that weapons fire doesn't &quot;hit the sky&quot;.

==Properties==

These properties are hidden.
; bool bLimitTransDisc : Will make [[Legacy:Translocator|Translocator]] discs disappear.
; bool bLimitProjectiles : Will make [[Legacy:Projectile|Projectile]]s discs disappear.
; class&lt;Actor&gt; LimitEffectClass : Will spawn this Actor as an effect to indicate the limitation.

==Events==
; Touch( Actor Other ) : if &lt;tt&gt;LimitEffectClass != None&lt;/tt&gt;, spawns LimitEffectClass at the Other's Location and Rotation.  Sets &lt;tt&gt;Projectile(Other).bNoFX = true&lt;/tt&gt;.  Calls &lt;tt&gt;Other.Destroy()&lt;/tt&gt;.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4273</id>
      <timestamp>2004-08-29T18:58:36Z</timestamp>
      <contributor>
        <ip>ACBD76C4.ipt.aol.com</ip>
      </contributor>
      <comment>This class allows the limitation of projectiles and the translocator disc in the volume.</comment>
      <text xml:space="preserve">The limitation class allows you to control projectiles (Eg. assult grenades) and the translocator disc. It allows you to specify an effect to play when one of these comes into contact with the volume. If either is thrown from inside it disappears imediatley and if one is thrown in it disappears on contact.

Note: It still shares all the traits on a normal volume, foe example location name.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LineOfSightHint</title>
    <id>1733</id>
    <revision>
      <id>4266</id>
      <timestamp>2004-10-17T06:54:55Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:LineOfSightTrigger|LineOfSightTrigger]] &gt;&gt; LineOfSightHint (Package: MoreGame)}}

Displays a hint when a player looks at this actor.

==Properties==

===LineOfSightTrigger===
; bool bTriggerOnceOnly : 
; Sound HintSound : 
; String HintText : 
; float ReTriggerDelay : 

==Related Topics ==

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4267</id>
      <timestamp>2004-06-10T13:56:10Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; [[Legacy:LineOfSightTrigger|LineOfSightTrigger]] &gt;&gt; [[Legacy:LineOfSightHint|LineOfSightHint]]}}

Displays a hint when a player looks at this actor.

==Properties==

===LineOfSightTrigger===
; bool bTriggerOnceOnly : 
; Sound HintSound : 
; String HintText : 
; float ReTriggerDelay : 

==Related Topics ==
* [[:Category:Legacy Class (P2)]]
[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LineOfSightTrigger</title>
    <id>28399</id>
    <revision>
      <id>40071</id>
      <timestamp>2009-11-15T08:25:17Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinearStairBuilder</title>
    <id>1735</id>
    <revision>
      <id>4270</id>
      <timestamp>2004-07-22T04:30:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:BrushBuilder|BrushBuilder]] &gt;&gt; LinearStairBuilder (Package: Editor)}}

This creates a Linear Stair for the [[Legacy:Red Builder Brush|red builder brush]]

==Properties==

* StepLength - the length of each step
* StepHeight - the height of each step. Don't know the precise height, but when 32, you can't walk and jou must jump
* StepWidth - The width of each step
* NumSteps - the number of steps
* AddToFirstStep - the extra height the staircase gets
* GroupName - doesn't work with it

==Alignment tips==

If it's a continuous texture, it's best that the steps are aligned manually. If not, then align to floor. The sides can be aligned by the wall direction to make them go smoothly.

==Related Topics==
* [[Legacy:Brushbuilders|Brushbuilders]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4271</id>
      <timestamp>2004-07-21T18:19:24Z</timestamp>
      <contributor>
        <ip>Buu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This creates a Linear Stair for the [[Legacy:Red Builder Brush|red builder brush]]

==Properties==

* StepLength - the length of each step
* StepHeight - the height of each step. Don't know the precise height, but when 32, you can't walk and jou must jump
* StepWidth - The width of each step
* NumSteps - the number of steps
* AddToFirstStep - the extra height the staircase gets
* GroupName - doesn't work with it

==Alignment tips==

If it's a continuous texture, it's best that the steps are aligned manually. If not, then align to floor. The sides can be aligned by the wall direction to make them go smoothly.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkAltFire</title>
    <id>28403</id>
    <revision>
      <id>40075</id>
      <timestamp>2009-11-15T08:26:25Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkAmmo</title>
    <id>28538</id>
    <revision>
      <id>40239</id>
      <timestamp>2009-11-17T11:04:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkAmmoPickup</title>
    <id>28302</id>
    <revision>
      <id>39959</id>
      <timestamp>2009-11-14T18:27:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkFire</title>
    <id>28556</id>
    <revision>
      <id>40257</id>
      <timestamp>2009-11-17T11:09:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkGun</title>
    <id>28545</id>
    <revision>
      <id>40246</id>
      <timestamp>2009-11-17T11:06:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkTurretController</title>
    <id>28889</id>
    <revision>
      <id>42819</id>
      <timestamp>2010-03-31T11:02:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Linked List</title>
    <id>1654</id>
    <revision>
      <id>4094</id>
      <timestamp>2006-01-16T22:49:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A '''linked list''' is a list of objects linked together by a series of pointers to another object in that list. In [[Legacy:UnrealScript|UnrealScript]] terms, each object has a reference to the next object in the list.

This allows for a near unlimited amount of objects to be connected; a worthy substitution for [[Legacy:Dynamic Array|dynamic array]]s (arrays of no defined size), which are not available in UnrealEngine1. (e.g. [[Legacy:UT|UT]]) This can be used for a variety of purposes: a player's inventory, a history of messages, a bunch of pipebombs a player can detonate, or even simply have easier and quicker access to certain actors such as [[Legacy:Mutator|Mutator]]s and [[Legacy:GameRules|GameRules]].

==Articles about Linked Lists==
* [[Wikipedia:Linked list]]
* [[Legacy:Scripting Linked Lists|Scripting Linked Lists]] &amp;ndash; creating your own linked lists.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Existing Lists In Unreal Tournament]] &amp;ndash; Details about the linked lists used in Unreal Tournament.
* [[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees And Linked Lists To Represent Group Hierarchy]]</text>
    </revision>
    <revision>
      <id>4095</id>
      <timestamp>2006-01-16T19:16:34Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>Dynamic arrays not present in UnrealScript??</comment>
      <text xml:space="preserve">A '''linked list''' is a list of objects linked together by a series of pointers to another object in that list. In [[Legacy:UnrealScript|UnrealScript]] terms, each object has a reference to the next object in the list.

This allows for a near unlimited amount of objects to be connected; a worthy substitution for [[Legacy:Dynamic Array|dynamic array]]s (arrays of no defined size), which are not present in [[Legacy:UnrealScript|UnrealScript]]. This can be used for a variety of purposes: a player's inventory, a history of messages, a bunch of pipebombs a player can detonate, or even simply have easier and quicker access to certain actors such as [[Legacy:Mutator|Mutator]]s and [[Legacy:GameRules|GameRules]].

==Articles about Linked Lists==
* [[Wikipedia:Linked list]]
* [[Legacy:Scripting Linked Lists|Scripting Linked Lists]] &amp;ndash; creating your own linked lists.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Existing Lists In Unreal Tournament]] &amp;ndash; Details about the linked lists used in Unreal Tournament.
* [[Legacy:Using Binary Trees And Linked Lists To Represent Group Hierarchy|Using Binary Trees And Linked Lists To Represent Group Hierarchy]]

&quot;not present in UnrealScript&quot;?? aren't they in UT200x now?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Linked List/Existing Lists In Unreal Tournament</title>
    <id>1667</id>
    <revision>
      <id>4121</id>
      <timestamp>2008-03-25T19:56:57Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Existing Lists in Unreal Tournament ==

This part of the tutorial explains existing [[Legacy:Linked List|linked list]]s in Unreal Tournament.

===Actor List ===

====Type and Scope ====

'''Type:''' All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (all actors have a pointer to this: Xlevel).

'''Scope:''' Exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

====Adding and Removing ====

'''Adding:''' Spawning an actor automatically does this. It adds at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] is always the first actor.

'''Removing:''' Destroying an actor automatically does this.

====Navigating ====

In the [[Legacy:Actor|Actor]] class, various &quot;iterators&quot; exist. These allow you read the list in different ways. Simply use &lt;code&gt;ForEach Iterator_Function(params)&lt;/code&gt; to use them. ForEach acts much like a For Loop.

; AllActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ) : BaseClass is the parent of classes you wish to look for. The actor pointer passed in the second parameter becomes the actor outputted. As the iterator functions are hard-coded into the compiler, you can have the actor pointer be of the BaseClass or any of its parents. Matchtag, if given, will only return actors, which have that tag. This will go through every actor in the level and is thus somewhat slow (this is not noticeable however unless it is called multiple times in one frame), and thus use it sparingly. If a more class specific list exists, such as that for pawns and navigation points (see below), use those instead. Note that if you wish to terminate the loop when a certain actor is returned, simply use &lt;code&gt;break;&lt;/code&gt;.

; ChildActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : The parameters work the same as AllActors'. However, this only returns actors with their owner set to the class this is run on. It has the same speed hit as AllActors.

; BasedActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors that have this as a base. Same speed hit as AllActors.

; TraceActors ( class&lt;actor&gt; BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) : This is supposed to trace a line from Start to End and return all actors hit (executes as fast as a normal trace). However, this is not ever used by Epic in code and I recall of no one ever getting it to work right. I do not recommend using it.

; RadiusActors ( class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ) : This returns all actors that are within radius units of Loc (or if it isn't given; then the actor's location). Same speed hit as AllActors().

; VisibleActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc ) : This is much like RadiusActors() only it also checks if an actor is visible from Loc. Same speed hit as AllActors.

; VisibleCollidingActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc, optional bool bIgnoreHidden ) : This only returns actors with bCollideActors as true. It uses the collision hash to check, and thus it is much faster than Allactors, in normal circumstances. If a very high radius is used (900 or so), then it becomes very slow, and VisibleActors should be used instead.

; ZoneInfo.ZoneActors( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors inside that zone. Same speed hit as AllActors(). Go figure.

===Inventory List ===

====Type and Scope ====

'''Type:'''  Standard one way linked list. Notice how it is defined in actor, and not in inventory. This is designed so other actors (pawns) can have a link to the base, while keeping the same pointer name.

'''Scope:'''  Server. On the client side however, it will only exist for the player being controlled and within his inventory. Other player's will not have an inventory list. Note that in very rare events, replication can come at a weird order and cause the inventory pointer of one item to point to an older one in the list. Thus when using this list client-side, you should have a check so that no more than 100 or so loops occur (to avoid infinite iterators).

====Adding and Removing ====

'''Adding:''' Call AddInventory() on the pawn you wish to add that inventory item to with that item in the parameters. It is then added to the beginning of the inventory list. This should only be done server-side. Note that inventory's GiveTo() automatically does this.

'''Removing:''' Class DeleteInventory() on the pawn(owner) with the item you wish to delete in the parameters. Again, this should only be performed server-side. When an inventory item is destroyed, this automatically occurs (see Inventory.Destroyed()).

====Navigating ====

If you are only searching for one item of a certain class (not child classes!), you can simply call FindInventoryType on the pawn who owns the items. Yet to search through the entire list do the following:

&lt;uscript&gt;
Local Inventory Inv;
For (Inv=somepawn.Inventory;Inv!=none;Inv=Inv.Inventory)
  //do stuff here
&lt;/uscript&gt;

===Pawn List ===

This list is the reason I am writing this tutorial. I tire of seeing code that uses ForEach AllActors(class'pawn',p), when there is a much faster way this can be done.

====Type and Scope ====

'''Type:''' Native controlled standard one way list linked by LevelInfo.PawnList.

'''Scope:''' Server Side only at BeginPlay() in gameinfo. Thus, on a client or in a mutator (post/pre)BeginPlay(), you need to stick with AllActors(class'pawn',p)

====Adding and Removing ====

'''Adding:''' Simply call AddPawn() on the pawn. Note that pawn automatically does this in its PreBeginPlay() so you really do not need to worry about calling this. Adds to the end of the list.

'''Removing:''' Call RemovePawn() on the pawn. This is automatically taken care of in Destroyed().

====Navigating ====

The list base is located in levelinfo. Simply call (in any actor):

&lt;uscript&gt;
Local pawn p;
For (p=level.pawnlist;p!=none;p=p.nextpawn)
  //do stuff
&lt;/uscript&gt;

===Navigation Point List ===

====Type and Scope ====

'''Type:''' Constant standard one way list linked by LevelInfo.NavigationPointList.

'''Scope:''' Server-side only.

====Adding and Removing ====

Cannot be done. The list is generated upon building the paths in UnrealEd.

====Navigating ====

Most likely you will use the navigation point list to find path nodes (a simple navpoint added by level authors). This allows you to spawn actors at many different locations in the map, and still have bots touch them. For instance, the relics mutator searches the Navigation Point list for pathnodes. Relics are then spawned at a random node. Like the pawn list, the base is in LevelInfo. 

&lt;uscript&gt;
Local NavigationPoint np;
For (np=level.NavigationPointList;np!=none;np=np.nextnavigationpoint)
  //do stuff
&lt;/uscript&gt;

Note that many other lists exist within navigation point. They are all used exclusively for AI navigation. Unless your name is Pfhoenix, they have no meaning.

===Mutator List ===

The introduction of mutators in Unreal 2.24 was one of the best things ever done for mod makers. What makes mutators so powerful? The fact that they are linked lists. This allows many different mods to be run at once and change many different game elements.

There are in fact 4 mutator lists in Unreal Tournament; the primary mutator list, damage mutators that only affect (Mutator)TakeDamage calls, message mutators that only affect messages (BroadCast, BroadCastLocalized, and player's talking), and finally HUD mutators that allow mutators to draw on the HUD.

====Type and Scope ====

'''Type:''' All are standard one-way linked lists. HUD mutators are linked to by a HUD, and all others are linked by the GameInfo.

'''Scope:''' Mutators normally (default) only exist server-side. However, the HUD mutators must be on the client (see below).

====Adding ====

=====Normal Mutators =====

When a user selects start, UT opens a map with a special parameter:

  ?mutator=MutatorPackage.MutatorClass,AnotherMutatorPackage.AnotherMutatorClass

The GameInfo's InitGame() is called when it is first spawned. First the base mutator (generally DMMutator) is spawned. From there the mutator options are parsed (this tutorial is not about string manipulation and Unreal URLs!), the mutator class dynamically loaded, then spawned, then finally added to the list:

&lt;uscript&gt;
log(&quot;Add mutator &quot;$LeftOpt);
MClass = class&lt;Mutator&gt;(DynamicLoadObject(LeftOpt, class'Class')); 
BaseMutator.AddMutator(Spawn(MClass));
&lt;/uscript&gt;

AddMutator() adds to the end of the list with the &quot;1337 function&quot; method described earlier in this tutorial. Now the mutator list is ready to receive notification of actor spawning, mutate commands, player respawnings, death notifications, and all those other wonderful events mutators receive from pawns and, more commonly, the gameinfo.

=====Damage Mutators =====

To make a mutator be used as a damage mutator (it still has normal mutator functions!), simply call Level.Game.RegisterDamageMutator(MutatorToBeRegistered). The mutator will now receive notification whenever a pawn takes damage and can modify certain values.

=====Message Mutators =====

This is another specialized mutator, not unlike a damage mutator. Simply call Level.Game.RegisterMessageMutator(MutatorToBeRegistered) to be able to edit all of the wonderful messages. Incidentally, message mutators did not exist until UT version 4.13. They were created simply for support of Rocket Arena. They have also been beneficial in stopping message hacking. :p

===== HUD Mutators ======

I cannot even count the amount of times people have asked why their HUD mutator will not work in network play. What is the reason for this problem? It is quite simple; mutators exist only on the server, yet HUDs are client-side only. Epic's code makes it appear that you can simply call RegisterHUDMutator, which is untrue. The following is one way of adding a HUD mutator on the client:

'''Step 1:''' In the default properties of your mutator, place the following:

&lt;uscript&gt;
bAlwaysRelevant=True
bNetTemporary=True
RemoteRole=ROLE_SimulatedProxy
&lt;/uscript&gt;

These values cause the mutator to be replicated to all clients, but the connection only stays open until the client has received the mutator. The mutator must also be a Simulated Proxy on the client for step 2 to work.

'''Step 2:''' Now add the following code to your mutator:

&lt;uscript&gt;
Simulated Function Tick(float delta)
{
  If (Level.NetMode == NM_DedicatedServer || bHUDMutator)
    Disable('Tick');
  Else
    RegisterHUDMutator();
}
&lt;/uscript&gt;

Each frame, RegisterHUDMutator() is called. If it finds a PlayerPawn with a HUD (local player!), it will set that HUD's HUDMutator to this mutator (as well as preserve the list) and set bHUDMutator to true. If the mutator has already been registered or this is a dedicated server (no HUDs!), then tick () can be safely disabled.

On a final note, I ask that all mod makers who make use of HUD mutators to do the following:  At the end of PostRender() in your HUD mutator, ''please'' add:

&lt;uscript&gt;
If (NextHUDMutator != None)
  NextHUDMutator.PostRender(Canvas);
&lt;/uscript&gt;

For some dumb reason, Epic did not add that support to begin with. Without those lines, your mutator will be the only HUD mutator used. Other HUD mutators will not receive PostRender() calls, and thus not be able to display anything on screen.

====Removing ====

No specialized functions exist to remove elements from mutator lists. Simply follow the removal model at the beginning of this tutorial.

====Navigating ====

Rarely will you ever need to iterate through the mutator list. All functions of mutators simply call that same function on the next mutator, returning a result if necessary. Yet if you wish to go through all mutators simply use:

&lt;uscript&gt;
Local mutator m;
For (m = ListStart; m != None; m = m.ListNext)
  //do stuff
&lt;/uscript&gt;

Replace &lt;code&gt;ListStart&lt;/code&gt; and &lt;code&gt;ListNext&lt;/code&gt; as follows:

{|

|-
|'''Mutator Type'''
|'''ListStart'''
|'''ListNext''' 
|-
|Normal
|&lt;code&gt;Level.Game.BaseMutator&lt;/code&gt;
|&lt;code&gt;NextMutator&lt;/code&gt;
|-
|Damage
|&lt;code&gt;Level.Game.DamageMutator&lt;/code&gt;
|&lt;code&gt;NextDamageMutator&lt;/code&gt;
|-
|Message
|&lt;code&gt;Level.Game.MessageMutator&lt;/code&gt;
|&lt;code&gt;NextMessageMutator&lt;/code&gt;
|-
|HUD
|&lt;code&gt;MyPlayerPawn.myHUD.HUDMutator&lt;/code&gt;
|&lt;code&gt;NextHUDMutator&lt;/code&gt;
|}

===Spawn Notification List ===

This is a list of very powerful actors; SpawnNotifies. For more information read http://unreal.epicgames.com/UTMagic.html. Whenever an actor is spawned/received on a client, native code calls SpawnNotification(actor) on the LevelInfo.SpawnNotify.

====Type and Scope ====

'''Type:''' Standard one-way list linked by LevelInfo.SpawnNotify.

'''Scope:''' Server and client-side. Note however that SpawnNotifies manually add themselves on both server and client, rather than having the list replicated, as is the case with inventory.

====Adding and Removing ====

'''Adding:''' SpawnNotify.PostBeginPlay() automatically adds to the beginning of the list.

'''Removing:''' SpawnNotify.Destroyed() automatically removes that SpawnNotify. Feel free to call Destroyed() yourself to remove a SpawnNotify from a list, for this does not actually destroy the actor.

'''Note:''' The entire spawn notification system can be temporary deactivated as follows:

&lt;uscript&gt;
Local SpawnNotify Sn;
Sn=level.SpawnNotify;
Level.SpawnNotify=None;
//do stuff here without worrying about Spawn Notifies.
Level.SpawnNotify=Sn;
&lt;/uscript&gt;

===Other Cases of Linked Lists ===

; InterpolationPoint : Uses a two-way list for interpolation of player locations and other properties between each point. While the list is created in unrealscript, that is as far as unrealscript handles it. Everything else is handled by native code.

; Pbolt : Uses a standard one-way list that you will probably never need to touch. The plasma beam you see when alt firing the Pulse Gun is actually a linked list of Pbolt's. Unfortunately, the system wasn't written in the best way possible. Ideally, there should be a pointer to the StarterBolt in all beams. Variables only important to the beam as a whole (AccumulatedDamage, LastHitTime) are controlled in each beam, rather than only the list base. Thus when beams are destroyed, some of those values are lost, resulting in odd damage patterns.

; Mover : Uses a one-way linked list that also has a pointer to the base. This is used for movers that follow other movers. Feel free to explore this code on your own.

; Actor.Deleted : A list of actors that have been deleted and are awaiting garbage collection. This occurs when 128 actors are in the list. This is only used in Epic's native C++ code.

; SavedMove : For player movement in a network environment, the client must save old moves to be sent later (to avoid overflowing the network and in cases of packet loss). The actual list is the standard one-way one, which carries move information. A playerpawn has pointers to the SavedMoves (the beginning of the SaveMove list), FreeMoves (a move that is &quot;free&quot;), and PendingMove (the next move to be sent to the server). Yet, this is a tutorial on lists, not something else. Study the SavedMove class and PlayerPawn.ReplicateMove() to learn more.

; Menu.ParentMenu : This is simply a pointer to the previous green menu that showed. These &quot;green menus&quot; were used in Unreal I only.  There is little need to understand how they work if you script in UT.

; ListElement : This is a two-way list that was set up for use with the WebAdmin. It is a quite powerful method of storing data.

; UWindowList : This is a very advanced list, which stores various data for the uWindow system.

; UWindowWindow : All the menus seen in UT are actually stored with this complex list system.

==Related Topics==
* [[Legacy:Scripting Linked Lists|Scripting Linked Lists]]

==Discussion==

'''Daid303:''' How about a UT2003 version of this page?

'''Foxpaw:''' UT2003 uses the same lists. New lists of items have mostly been implemented as dynamic arrays instead. There is also one new linked list to my knowledge, the inventory list of an actor.

'''Wormbo:''' The linked list of Inventory actors was declared in [[Legacy:Actor|Actor]] back in Unreal 1 v205 already. ;) We should probably create a page for all ''useful'' lists (not only linked lists) both in UT and UT2003. Things like the list of deleted actors can hardly be called useful in everyday UnrealScript coding...

'''Daid303:''' In UT2003 you also have the GUI, linked list? (didn't look) and controller ofcouse, is pawn still linked? And it would be nice to know what does and doesn't apply to UT2003. Oh, and how about a 'base' for linked list, 1 way, and 2 way. It would be alot easier of you could just copy a basic then work from that. I made a mistake in a 2 way linked list, and it took me quite a while to fix the remove function.

'''Wormbo:''' The GUI stuff is a set of dynamic arrays in the [[Legacy:GUIController|GUIController]]. Pawns aren't &quot;listed&quot; anymore, the Level.PawnList has been replaced by the Level.ControllerList.

'''Tarquin:''' I've rearranged other pages on linked lists. What should be done with this one? 

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/What Are Linked Lists]] &amp;ndash; '''Section 2 of 2''' &amp;ndash; End of Document</text>
    </revision>
    <revision>
      <id>4122</id>
      <timestamp>2005-09-05T14:10:16Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>opinions needed</comment>
      <text xml:space="preserve">==Existing Lists in Unreal Tournament ==

This part of the tutorial explains existing linked lists in Unreal Tournament.

===Actor List ===

====Type and Scope ====

'''Type:''' All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (all actors have a pointer to this: Xlevel).

'''Scope:''' Exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

====Adding and Removing ====

'''Adding:''' Spawning an actor automatically does this. It adds at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] is always the first actor.

'''Removing:''' Destroying an actor automatically does this.

====Navigating ====

In the [[Legacy:Actor|Actor]] class, various &quot;iterators&quot; exist. These allow you read the list in different ways. Simply use &lt;code&gt;ForEach Iterator_Function(params)&lt;/code&gt; to use them. ForEach acts much like a For Loop.

; AllActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ) : BaseClass is the parent of classes you wish to look for. The actor pointer passed in the second parameter becomes the actor outputted. As the iterator functions are hard-coded into the compiler, you can have the actor pointer be of the BaseClass or any of its parents. Matchtag, if given, will only return actors, which have that tag. This will go through every actor in the level and is thus somewhat slow (this is not noticeable however unless it is called multiple times in one frame), and thus use it sparingly. If a more class specific list exists, such as that for pawns and navigation points (see below), use those instead. Note that if you wish to terminate the loop when a certain actor is returned, simply use &lt;code&gt;break;&lt;/code&gt;.

; ChildActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : The parameters work the same as AllActors'. However, this only returns actors with their owner set to the class this is run on. It has the same speed hit as AllActors.

; BasedActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors that have this as a base. Same speed hit as AllActors.

; TraceActors ( class&lt;actor&gt; BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) : This is supposed to trace a line from Start to End and return all actors hit (executes as fast as a normal trace). However, this is not ever used by Epic in code and I recall of no one ever getting it to work right. I do not recommend using it.

; RadiusActors ( class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ) : This returns all actors that are within radius units of Loc (or if it isn't given; then the actor's location). Same speed hit as AllActors().

; VisibleActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc ) : This is much like RadiusActors() only it also checks if an actor is visible from Loc. Same speed hit as AllActors.

; VisibleCollidingActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc, optional bool bIgnoreHidden ) : This only returns actors with bCollideActors as true. It uses the collision hash to check, and thus it is much faster than Allactors, in normal circumstances. If a very high radius is used (900 or so), then it becomes very slow, and VisibleActors should be used instead.

; ZoneInfo.ZoneActors( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors inside that zone. Same speed hit as AllActors(). Go figure.

===Inventory List ===

====Type and Scope ====

'''Type:'''  Standard one way linked list. Notice how it is defined in actor, and not in inventory. This is designed so other actors (pawns) can have a link to the base, while keeping the same pointer name.

'''Scope:'''  Server. On the client side however, it will only exist for the player being controlled and within his inventory. Other player's will not have an inventory list. Note that in very rare events, replication can come at a weird order and cause the inventory pointer of one item to point to an older one in the list. Thus when using this list client-side, you should have a check so that no more than 100 or so loops occur (to avoid infinite iterators).

====Adding and Removing ====

'''Adding:''' Call AddInventory() on the pawn you wish to add that inventory item to with that item in the parameters. It is then added to the beginning of the inventory list. This should only be done server-side. Note that inventory's GiveTo() automatically does this.

'''Removing:''' Class DeleteInventory() on the pawn(owner) with the item you wish to delete in the parameters. Again, this should only be performed server-side. When an inventory item is destroyed, this automatically occurs (see Inventory.Destroyed()).

====Navigating ====

If you are only searching for one item of a certain class (not child classes!), you can simply call FindInventoryType on the pawn who owns the items. Yet to search through the entire list do the following:

&lt;uscript&gt;
Local Inventory Inv;
For (Inv=somepawn.Inventory;Inv!=none;Inv=Inv.Inventory)
  //do stuff here
&lt;/uscript&gt;

===Pawn List ===

This list is the reason I am writing this tutorial. I tire of seeing code that uses ForEach AllActors(class'pawn',p), when there is a much faster way this can be done.

====Type and Scope ====

'''Type:''' Native controlled standard one way list linked by LevelInfo.PawnList.

'''Scope:''' Server Side only at BeginPlay() in gameinfo. Thus, on a client or in a mutator (post/pre)BeginPlay(), you need to stick with AllActors(class'pawn',p)

====Adding and Removing ====

'''Adding:''' Simply call AddPawn() on the pawn. Note that pawn automatically does this in its PreBeginPlay() so you really do not need to worry about calling this. Adds to the end of the list.

'''Removing:''' Call RemovePawn() on the pawn. This is automatically taken care of in Destroyed().

====Navigating ====

The list base is located in levelinfo. Simply call (in any actor):

&lt;uscript&gt;
Local pawn p;
For (p=level.pawnlist;p!=none;p=p.nextpawn)
  //do stuff
&lt;/uscript&gt;

===Navigation Point List ===

====Type and Scope ====

'''Type:''' Constant standard one way list linked by LevelInfo.NavigationPointList.

'''Scope:''' Server-side only.

====Adding and Removing ====

Cannot be done. The list is generated upon building the paths in UnrealEd.

====Navigating ====

Most likely you will use the navigation point list to find path nodes (a simple navpoint added by level authors). This allows you to spawn actors at many different locations in the map, and still have bots touch them. For instance, the relics mutator searches the Navigation Point list for pathnodes. Relics are then spawned at a random node. Like the pawn list, the base is in LevelInfo. 

&lt;uscript&gt;
Local NavigationPoint np;
For (np=level.NavigationPointList;np!=none;np=np.nextnavigationpoint)
  //do stuff
&lt;/uscript&gt;

Note that many other lists exist within navigation point. They are all used exclusively for AI navigation. Unless your name is Pfhoenix, they have no meaning.

===Mutator List ===

The introduction of mutators in Unreal 2.24 was one of the best things ever done for mod makers. What makes mutators so powerful? The fact that they are linked lists. This allows many different mods to be run at once and change many different game elements.

There are in fact 4 mutator lists in Unreal Tournament; the primary mutator list, damage mutators that only affect (Mutator)TakeDamage calls, message mutators that only affect messages (BroadCast, BroadCastLocalized, and player's talking), and finally HUD mutators that allow mutators to draw on the HUD.

====Type and Scope ====

'''Type:''' All are standard one-way linked lists. HUD mutators are linked to by a HUD, and all others are linked by the GameInfo.

'''Scope:''' Mutators normally (default) only exist server-side. However, the HUD mutators must be on the client (see below).

====Adding ====

=====Normal Mutators =====

When a user selects start, UT opens a map with a special parameter:

  ?mutator=MutatorPackage.MutatorClass,AnotherMutatorPackage.AnotherMutatorClass

The GameInfo's InitGame() is called when it is first spawned. First the base mutator (generally DMMutator) is spawned. From there the mutator options are parsed (this tutorial is not about string manipulation and Unreal URLs!), the mutator class dynamically loaded, then spawned, then finally added to the list:

&lt;uscript&gt;
log(&quot;Add mutator &quot;$LeftOpt);
MClass = class&lt;Mutator&gt;(DynamicLoadObject(LeftOpt, class'Class')); 
BaseMutator.AddMutator(Spawn(MClass));
&lt;/uscript&gt;

AddMutator() adds to the end of the list with the &quot;1337 function&quot; method described earlier in this tutorial. Now the mutator list is ready to receive notification of actor spawning, mutate commands, player respawnings, death notifications, and all those other wonderful events mutators receive from pawns and, more commonly, the gameinfo.

=====Damage Mutators =====

To make a mutator be used as a damage mutator (it still has normal mutator functions!), simply call Level.Game.RegisterDamageMutator(MutatorToBeRegistered). The mutator will now receive notification whenever a pawn takes damage and can modify certain values.

=====Message Mutators =====

This is another specialized mutator, not unlike a damage mutator. Simply call Level.Game.RegisterMessageMutator(MutatorToBeRegistered) to be able to edit all of the wonderful messages. Incidentally, message mutators did not exist until UT version 4.13. They were created simply for support of Rocket Arena. They have also been beneficial in stopping message hacking. :p

===== HUD Mutators ======

I cannot even count the amount of times people have asked why their HUD mutator will not work in network play. What is the reason for this problem? It is quite simple; mutators exist only on the server, yet HUDs are client-side only. Epic's code makes it appear that you can simply call RegisterHUDMutator, which is untrue. The following is one way of adding a HUD mutator on the client:

'''Step 1:''' In the default properties of your mutator, place the following:

&lt;uscript&gt;
bAlwaysRelevant=True
bNetTemporary=True
RemoteRole=ROLE_SimulatedProxy
&lt;/uscript&gt;

These values cause the mutator to be replicated to all clients, but the connection only stays open until the client has received the mutator. The mutator must also be a Simulated Proxy on the client for step 2 to work.

'''Step 2:''' Now add the following code to your mutator:

&lt;uscript&gt;
Simulated Function Tick(float delta)
{
  If (Level.NetMode == NM_DedicatedServer || bHUDMutator)
    Disable('Tick');
  Else
    RegisterHUDMutator();
}
&lt;/uscript&gt;

Each frame, RegisterHUDMutator() is called. If it finds a PlayerPawn with a HUD (local player!), it will set that HUD's HUDMutator to this mutator (as well as preserve the list) and set bHUDMutator to true. If the mutator has already been registered or this is a dedicated server (no HUDs!), then tick () can be safely disabled.

On a final note, I ask that all mod makers who make use of HUD mutators to do the following:  At the end of PostRender() in your HUD mutator, ''please'' add:

&lt;uscript&gt;
If (NextHUDMutator != None)
  NextHUDMutator.PostRender(Canvas);
&lt;/uscript&gt;

For some dumb reason, Epic did not add that support to begin with. Without those lines, your mutator will be the only HUD mutator used. Other HUD mutators will not receive PostRender() calls, and thus not be able to display anything on screen.

====Removing ====

No specialized functions exist to remove elements from mutator lists. Simply follow the removal model at the beginning of this tutorial.

====Navigating ====

Rarely will you ever need to iterate through the mutator list. All functions of mutators simply call that same function on the next mutator, returning a result if necessary. Yet if you wish to go through all mutators simply use:

&lt;uscript&gt;
Local mutator m;
For (m = ListStart; m != None; m = m.ListNext)
  //do stuff
&lt;/uscript&gt;

Replace &lt;code&gt;ListStart&lt;/code&gt; and &lt;code&gt;ListNext&lt;/code&gt; as follows:

{|

|-
|'''Mutator Type'''
|'''ListStart'''
|'''ListNext''' 
|-
|Normal
|&lt;code&gt;Level.Game.BaseMutator&lt;/code&gt;
|&lt;code&gt;NextMutator&lt;/code&gt;
|-
|Damage
|&lt;code&gt;Level.Game.DamageMutator&lt;/code&gt;
|&lt;code&gt;NextDamageMutator&lt;/code&gt;
|-
|Message
|&lt;code&gt;Level.Game.MessageMutator&lt;/code&gt;
|&lt;code&gt;NextMessageMutator&lt;/code&gt;
|-
|HUD
|&lt;code&gt;MyPlayerPawn.myHUD.HUDMutator&lt;/code&gt;
|&lt;code&gt;NextHUDMutator&lt;/code&gt;
|}

===Spawn Notification List ===

This is a list of very powerful actors; SpawnNotifies. For more information read http://unreal.epicgames.com/UTMagic.html. Whenever an actor is spawned/received on a client, native code calls SpawnNotification(actor) on the LevelInfo.SpawnNotify.

====Type and Scope ====

'''Type:''' Standard one-way list linked by LevelInfo.SpawnNotify.

'''Scope:''' Server and client-side. Note however that SpawnNotifies manually add themselves on both server and client, rather than having the list replicated, as is the case with inventory.

====Adding and Removing ====

'''Adding:''' SpawnNotify.PostBeginPlay() automatically adds to the beginning of the list.

'''Removing:''' SpawnNotify.Destroyed() automatically removes that SpawnNotify. Feel free to call Destroyed() yourself to remove a SpawnNotify from a list, for this does not actually destroy the actor.

'''Note:''' The entire spawn notification system can be temporary deactivated as follows:

&lt;uscript&gt;
Local SpawnNotify Sn;
Sn=level.SpawnNotify;
Level.SpawnNotify=None;
//do stuff here without worrying about Spawn Notifies.
Level.SpawnNotify=Sn;
&lt;/uscript&gt;

===Other Cases of Linked Lists ===

; InterpolationPoint : Uses a two-way list for interpolation of player locations and other properties between each point. While the list is created in unrealscript, that is as far as unrealscript handles it. Everything else is handled by native code.

; Pbolt : Uses a standard one-way list that you will probably never need to touch. The plasma beam you see when alt firing the Pulse Gun is actually a linked list of Pbolt's. Unfortunately, the system wasn't written in the best way possible. Ideally, there should be a pointer to the StarterBolt in all beams. Variables only important to the beam as a whole (AccumulatedDamage, LastHitTime) are controlled in each beam, rather than only the list base. Thus when beams are destroyed, some of those values are lost, resulting in odd damage patterns.

; Mover : Uses a one-way linked list that also has a pointer to the base. This is used for movers that follow other movers. Feel free to explore this code on your own.

; Actor.Deleted : A list of actors that have been deleted and are awaiting garbage collection. This occurs when 128 actors are in the list. This is only used in Epic's native C++ code.

; SavedMove : For player movement in a network environment, the client must save old moves to be sent later (to avoid overflowing the network and in cases of packet loss). The actual list is the standard one-way one, which carries move information. A playerpawn has pointers to the SavedMoves (the beginning of the SaveMove list), FreeMoves (a move that is &quot;free&quot;), and PendingMove (the next move to be sent to the server). Yet, this is a tutorial on lists, not something else. Study the SavedMove class and PlayerPawn.ReplicateMove() to learn more.

; Menu.ParentMenu : This is simply a pointer to the previous green menu that showed. These &quot;green menus&quot; were used in Unreal I only.  There is little need to understand how they work if you script in UT.

; ListElement : This is a two-way list that was set up for use with the WebAdmin. It is a quite powerful method of storing data.

; UWindowList : This is a very advanced list, which stores various data for the uWindow system.

; UWindowWindow : All the menus seen in UT are actually stored with this complex list system.

----

'''Daid303:''' How about a UT2003 version of this page?

'''Foxpaw:''' UT2003 uses the same lists. New lists of items have mostly been implemented as dynamic arrays instead. There is also one new linked list to my knowledge, the inventory list of an actor.

'''Wormbo:''' The linked list of Inventory actors was declared in [[Legacy:Actor|Actor]] back in Unreal 1 v205 already. ;) We should probably create a page for all ''useful'' lists (not only linked lists) both in UT and UT2003. Things like the list of deleted actors can hardly be called useful in everyday UnrealScript coding...

'''Daid303:''' In UT2003 you also have the GUI, linked list? (didn't look) and controller ofcouse, is pawn still linked? And it would be nice to know what does and doesn't apply to UT2003. Oh, and how about a 'base' for linked list, 1 way, and 2 way. It would be alot easier of you could just copy a basic then work from that. I made a mistake in a 2 way linked list, and it took me quite a while to fix the remove function.

'''Wormbo:''' The GUI stuff is a set of dynamic arrays in the [[Legacy:GUIController|GUIController]]. Pawns aren't &quot;listed&quot; anymore, the Level.PawnList has been replaced by the Level.ControllerList.

'''Tarquin:''' I've rearranged other pages on linked lists. What should be done with this one? 

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/What Are Linked Lists]] &amp;ndash; '''Section 2 of 2''' &amp;ndash; End of Document</text>
    </revision>
    <revision>
      <id>4123</id>
      <timestamp>2005-09-05T14:10:56Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>opinions needed</comment>
      <text xml:space="preserve">==Existing Lists in Unreal Tournament ==

This part of the tutorial explains existing [[Legacy:Linked List|linked list]]s in Unreal Tournament.

===Actor List ===

====Type and Scope ====

'''Type:''' All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (all actors have a pointer to this: Xlevel).

'''Scope:''' Exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

====Adding and Removing ====

'''Adding:''' Spawning an actor automatically does this. It adds at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] is always the first actor.

'''Removing:''' Destroying an actor automatically does this.

====Navigating ====

In the [[Legacy:Actor|Actor]] class, various &quot;iterators&quot; exist. These allow you read the list in different ways. Simply use &lt;code&gt;ForEach Iterator_Function(params)&lt;/code&gt; to use them. ForEach acts much like a For Loop.

; AllActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ) : BaseClass is the parent of classes you wish to look for. The actor pointer passed in the second parameter becomes the actor outputted. As the iterator functions are hard-coded into the compiler, you can have the actor pointer be of the BaseClass or any of its parents. Matchtag, if given, will only return actors, which have that tag. This will go through every actor in the level and is thus somewhat slow (this is not noticeable however unless it is called multiple times in one frame), and thus use it sparingly. If a more class specific list exists, such as that for pawns and navigation points (see below), use those instead. Note that if you wish to terminate the loop when a certain actor is returned, simply use &lt;code&gt;break;&lt;/code&gt;.

; ChildActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : The parameters work the same as AllActors'. However, this only returns actors with their owner set to the class this is run on. It has the same speed hit as AllActors.

; BasedActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors that have this as a base. Same speed hit as AllActors.

; TraceActors ( class&lt;actor&gt; BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) : This is supposed to trace a line from Start to End and return all actors hit (executes as fast as a normal trace). However, this is not ever used by Epic in code and I recall of no one ever getting it to work right. I do not recommend using it.

; RadiusActors ( class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ) : This returns all actors that are within radius units of Loc (or if it isn't given; then the actor's location). Same speed hit as AllActors().

; VisibleActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc ) : This is much like RadiusActors() only it also checks if an actor is visible from Loc. Same speed hit as AllActors.

; VisibleCollidingActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc, optional bool bIgnoreHidden ) : This only returns actors with bCollideActors as true. It uses the collision hash to check, and thus it is much faster than Allactors, in normal circumstances. If a very high radius is used (900 or so), then it becomes very slow, and VisibleActors should be used instead.

; ZoneInfo.ZoneActors( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors inside that zone. Same speed hit as AllActors(). Go figure.

===Inventory List ===

====Type and Scope ====

'''Type:'''  Standard one way linked list. Notice how it is defined in actor, and not in inventory. This is designed so other actors (pawns) can have a link to the base, while keeping the same pointer name.

'''Scope:'''  Server. On the client side however, it will only exist for the player being controlled and within his inventory. Other player's will not have an inventory list. Note that in very rare events, replication can come at a weird order and cause the inventory pointer of one item to point to an older one in the list. Thus when using this list client-side, you should have a check so that no more than 100 or so loops occur (to avoid infinite iterators).

====Adding and Removing ====

'''Adding:''' Call AddInventory() on the pawn you wish to add that inventory item to with that item in the parameters. It is then added to the beginning of the inventory list. This should only be done server-side. Note that inventory's GiveTo() automatically does this.

'''Removing:''' Class DeleteInventory() on the pawn(owner) with the item you wish to delete in the parameters. Again, this should only be performed server-side. When an inventory item is destroyed, this automatically occurs (see Inventory.Destroyed()).

====Navigating ====

If you are only searching for one item of a certain class (not child classes!), you can simply call FindInventoryType on the pawn who owns the items. Yet to search through the entire list do the following:

&lt;uscript&gt;
Local Inventory Inv;
For (Inv=somepawn.Inventory;Inv!=none;Inv=Inv.Inventory)
  //do stuff here
&lt;/uscript&gt;

===Pawn List ===

This list is the reason I am writing this tutorial. I tire of seeing code that uses ForEach AllActors(class'pawn',p), when there is a much faster way this can be done.

====Type and Scope ====

'''Type:''' Native controlled standard one way list linked by LevelInfo.PawnList.

'''Scope:''' Server Side only at BeginPlay() in gameinfo. Thus, on a client or in a mutator (post/pre)BeginPlay(), you need to stick with AllActors(class'pawn',p)

====Adding and Removing ====

'''Adding:''' Simply call AddPawn() on the pawn. Note that pawn automatically does this in its PreBeginPlay() so you really do not need to worry about calling this. Adds to the end of the list.

'''Removing:''' Call RemovePawn() on the pawn. This is automatically taken care of in Destroyed().

====Navigating ====

The list base is located in levelinfo. Simply call (in any actor):

&lt;uscript&gt;
Local pawn p;
For (p=level.pawnlist;p!=none;p=p.nextpawn)
  //do stuff
&lt;/uscript&gt;

===Navigation Point List ===

====Type and Scope ====

'''Type:''' Constant standard one way list linked by LevelInfo.NavigationPointList.

'''Scope:''' Server-side only.

====Adding and Removing ====

Cannot be done. The list is generated upon building the paths in UnrealEd.

====Navigating ====

Most likely you will use the navigation point list to find path nodes (a simple navpoint added by level authors). This allows you to spawn actors at many different locations in the map, and still have bots touch them. For instance, the relics mutator searches the Navigation Point list for pathnodes. Relics are then spawned at a random node. Like the pawn list, the base is in LevelInfo. 

&lt;uscript&gt;
Local NavigationPoint np;
For (np=level.NavigationPointList;np!=none;np=np.nextnavigationpoint)
  //do stuff
&lt;/uscript&gt;

Note that many other lists exist within navigation point. They are all used exclusively for AI navigation. Unless your name is Pfhoenix, they have no meaning.

===Mutator List ===

The introduction of mutators in Unreal 2.24 was one of the best things ever done for mod makers. What makes mutators so powerful? The fact that they are linked lists. This allows many different mods to be run at once and change many different game elements.

There are in fact 4 mutator lists in Unreal Tournament; the primary mutator list, damage mutators that only affect (Mutator)TakeDamage calls, message mutators that only affect messages (BroadCast, BroadCastLocalized, and player's talking), and finally HUD mutators that allow mutators to draw on the HUD.

====Type and Scope ====

'''Type:''' All are standard one-way linked lists. HUD mutators are linked to by a HUD, and all others are linked by the GameInfo.

'''Scope:''' Mutators normally (default) only exist server-side. However, the HUD mutators must be on the client (see below).

====Adding ====

=====Normal Mutators =====

When a user selects start, UT opens a map with a special parameter:

  ?mutator=MutatorPackage.MutatorClass,AnotherMutatorPackage.AnotherMutatorClass

The GameInfo's InitGame() is called when it is first spawned. First the base mutator (generally DMMutator) is spawned. From there the mutator options are parsed (this tutorial is not about string manipulation and Unreal URLs!), the mutator class dynamically loaded, then spawned, then finally added to the list:

&lt;uscript&gt;
log(&quot;Add mutator &quot;$LeftOpt);
MClass = class&lt;Mutator&gt;(DynamicLoadObject(LeftOpt, class'Class')); 
BaseMutator.AddMutator(Spawn(MClass));
&lt;/uscript&gt;

AddMutator() adds to the end of the list with the &quot;1337 function&quot; method described earlier in this tutorial. Now the mutator list is ready to receive notification of actor spawning, mutate commands, player respawnings, death notifications, and all those other wonderful events mutators receive from pawns and, more commonly, the gameinfo.

=====Damage Mutators =====

To make a mutator be used as a damage mutator (it still has normal mutator functions!), simply call Level.Game.RegisterDamageMutator(MutatorToBeRegistered). The mutator will now receive notification whenever a pawn takes damage and can modify certain values.

=====Message Mutators =====

This is another specialized mutator, not unlike a damage mutator. Simply call Level.Game.RegisterMessageMutator(MutatorToBeRegistered) to be able to edit all of the wonderful messages. Incidentally, message mutators did not exist until UT version 4.13. They were created simply for support of Rocket Arena. They have also been beneficial in stopping message hacking. :p

===== HUD Mutators ======

I cannot even count the amount of times people have asked why their HUD mutator will not work in network play. What is the reason for this problem? It is quite simple; mutators exist only on the server, yet HUDs are client-side only. Epic's code makes it appear that you can simply call RegisterHUDMutator, which is untrue. The following is one way of adding a HUD mutator on the client:

'''Step 1:''' In the default properties of your mutator, place the following:

&lt;uscript&gt;
bAlwaysRelevant=True
bNetTemporary=True
RemoteRole=ROLE_SimulatedProxy
&lt;/uscript&gt;

These values cause the mutator to be replicated to all clients, but the connection only stays open until the client has received the mutator. The mutator must also be a Simulated Proxy on the client for step 2 to work.

'''Step 2:''' Now add the following code to your mutator:

&lt;uscript&gt;
Simulated Function Tick(float delta)
{
  If (Level.NetMode == NM_DedicatedServer || bHUDMutator)
    Disable('Tick');
  Else
    RegisterHUDMutator();
}
&lt;/uscript&gt;

Each frame, RegisterHUDMutator() is called. If it finds a PlayerPawn with a HUD (local player!), it will set that HUD's HUDMutator to this mutator (as well as preserve the list) and set bHUDMutator to true. If the mutator has already been registered or this is a dedicated server (no HUDs!), then tick () can be safely disabled.

On a final note, I ask that all mod makers who make use of HUD mutators to do the following:  At the end of PostRender() in your HUD mutator, ''please'' add:

&lt;uscript&gt;
If (NextHUDMutator != None)
  NextHUDMutator.PostRender(Canvas);
&lt;/uscript&gt;

For some dumb reason, Epic did not add that support to begin with. Without those lines, your mutator will be the only HUD mutator used. Other HUD mutators will not receive PostRender() calls, and thus not be able to display anything on screen.

====Removing ====

No specialized functions exist to remove elements from mutator lists. Simply follow the removal model at the beginning of this tutorial.

====Navigating ====

Rarely will you ever need to iterate through the mutator list. All functions of mutators simply call that same function on the next mutator, returning a result if necessary. Yet if you wish to go through all mutators simply use:

&lt;uscript&gt;
Local mutator m;
For (m = ListStart; m != None; m = m.ListNext)
  //do stuff
&lt;/uscript&gt;

Replace &lt;code&gt;ListStart&lt;/code&gt; and &lt;code&gt;ListNext&lt;/code&gt; as follows:

{|

|-
|'''Mutator Type'''
|'''ListStart'''
|'''ListNext''' 
|-
|Normal
|&lt;code&gt;Level.Game.BaseMutator&lt;/code&gt;
|&lt;code&gt;NextMutator&lt;/code&gt;
|-
|Damage
|&lt;code&gt;Level.Game.DamageMutator&lt;/code&gt;
|&lt;code&gt;NextDamageMutator&lt;/code&gt;
|-
|Message
|&lt;code&gt;Level.Game.MessageMutator&lt;/code&gt;
|&lt;code&gt;NextMessageMutator&lt;/code&gt;
|-
|HUD
|&lt;code&gt;MyPlayerPawn.myHUD.HUDMutator&lt;/code&gt;
|&lt;code&gt;NextHUDMutator&lt;/code&gt;
|}

===Spawn Notification List ===

This is a list of very powerful actors; SpawnNotifies. For more information read http://unreal.epicgames.com/UTMagic.html. Whenever an actor is spawned/received on a client, native code calls SpawnNotification(actor) on the LevelInfo.SpawnNotify.

====Type and Scope ====

'''Type:''' Standard one-way list linked by LevelInfo.SpawnNotify.

'''Scope:''' Server and client-side. Note however that SpawnNotifies manually add themselves on both server and client, rather than having the list replicated, as is the case with inventory.

====Adding and Removing ====

'''Adding:''' SpawnNotify.PostBeginPlay() automatically adds to the beginning of the list.

'''Removing:''' SpawnNotify.Destroyed() automatically removes that SpawnNotify. Feel free to call Destroyed() yourself to remove a SpawnNotify from a list, for this does not actually destroy the actor.

'''Note:''' The entire spawn notification system can be temporary deactivated as follows:

&lt;uscript&gt;
Local SpawnNotify Sn;
Sn=level.SpawnNotify;
Level.SpawnNotify=None;
//do stuff here without worrying about Spawn Notifies.
Level.SpawnNotify=Sn;
&lt;/uscript&gt;

===Other Cases of Linked Lists ===

; InterpolationPoint : Uses a two-way list for interpolation of player locations and other properties between each point. While the list is created in unrealscript, that is as far as unrealscript handles it. Everything else is handled by native code.

; Pbolt : Uses a standard one-way list that you will probably never need to touch. The plasma beam you see when alt firing the Pulse Gun is actually a linked list of Pbolt's. Unfortunately, the system wasn't written in the best way possible. Ideally, there should be a pointer to the StarterBolt in all beams. Variables only important to the beam as a whole (AccumulatedDamage, LastHitTime) are controlled in each beam, rather than only the list base. Thus when beams are destroyed, some of those values are lost, resulting in odd damage patterns.

; Mover : Uses a one-way linked list that also has a pointer to the base. This is used for movers that follow other movers. Feel free to explore this code on your own.

; Actor.Deleted : A list of actors that have been deleted and are awaiting garbage collection. This occurs when 128 actors are in the list. This is only used in Epic's native C++ code.

; SavedMove : For player movement in a network environment, the client must save old moves to be sent later (to avoid overflowing the network and in cases of packet loss). The actual list is the standard one-way one, which carries move information. A playerpawn has pointers to the SavedMoves (the beginning of the SaveMove list), FreeMoves (a move that is &quot;free&quot;), and PendingMove (the next move to be sent to the server). Yet, this is a tutorial on lists, not something else. Study the SavedMove class and PlayerPawn.ReplicateMove() to learn more.

; Menu.ParentMenu : This is simply a pointer to the previous green menu that showed. These &quot;green menus&quot; were used in Unreal I only.  There is little need to understand how they work if you script in UT.

; ListElement : This is a two-way list that was set up for use with the WebAdmin. It is a quite powerful method of storing data.

; UWindowList : This is a very advanced list, which stores various data for the uWindow system.

; UWindowWindow : All the menus seen in UT are actually stored with this complex list system.

==Related Topics==
* [[Legacy:Scripting Linked Lists|Scripting Linked Lists]]

==Comments==

'''Daid303:''' How about a UT2003 version of this page?

'''Foxpaw:''' UT2003 uses the same lists. New lists of items have mostly been implemented as dynamic arrays instead. There is also one new linked list to my knowledge, the inventory list of an actor.

'''Wormbo:''' The linked list of Inventory actors was declared in [[Legacy:Actor|Actor]] back in Unreal 1 v205 already. ;) We should probably create a page for all ''useful'' lists (not only linked lists) both in UT and UT2003. Things like the list of deleted actors can hardly be called useful in everyday UnrealScript coding...

'''Daid303:''' In UT2003 you also have the GUI, linked list? (didn't look) and controller ofcouse, is pawn still linked? And it would be nice to know what does and doesn't apply to UT2003. Oh, and how about a 'base' for linked list, 1 way, and 2 way. It would be alot easier of you could just copy a basic then work from that. I made a mistake in a 2 way linked list, and it took me quite a while to fix the remove function.

'''Wormbo:''' The GUI stuff is a set of dynamic arrays in the [[Legacy:GUIController|GUIController]]. Pawns aren't &quot;listed&quot; anymore, the Level.PawnList has been replaced by the Level.ControllerList.

'''Tarquin:''' I've rearranged other pages on linked lists. What should be done with this one? 

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/What Are Linked Lists]] &amp;ndash; '''Section 2 of 2''' &amp;ndash; End of Document</text>
    </revision>
    <revision>
      <id>34305</id>
      <timestamp>2009-04-05T03:34:19Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <comment>/* HUD Mutators = */</comment>
      <text xml:space="preserve">==Existing Lists in Unreal Tournament ==

This part of the tutorial explains existing [[Legacy:Linked List|linked list]]s in Unreal Tournament.

===Actor List ===

====Type and Scope ====

'''Type:''' All actors in Unreal are connected though a gigantic list (well it is actually a dynamic array, but to make life easier think of it as a list) that exists only in the native C++ code. Without this list, actors would be just plain old objects. The base of this &quot;list&quot; is actually the native level object (all actors have a pointer to this: Xlevel).

'''Scope:''' Exists on both client and server. When a client &quot;receives&quot; an actor, it is added and when its connection is closed (except with [[Legacy:Replication|bNetTemporary]]), it is removed.

====Adding and Removing ====

'''Adding:''' Spawning an actor automatically does this. It adds at the end of the list. Note that [[Legacy:LevelInfo|LevelInfo]] is always the first actor.

'''Removing:''' Destroying an actor automatically does this.

====Navigating ====

In the [[Legacy:Actor|Actor]] class, various &quot;iterators&quot; exist. These allow you read the list in different ways. Simply use &lt;code&gt;ForEach Iterator_Function(params)&lt;/code&gt; to use them. ForEach acts much like a For Loop.

; AllActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional name MatchTag ) : BaseClass is the parent of classes you wish to look for. The actor pointer passed in the second parameter becomes the actor outputted. As the iterator functions are hard-coded into the compiler, you can have the actor pointer be of the BaseClass or any of its parents. Matchtag, if given, will only return actors, which have that tag. This will go through every actor in the level and is thus somewhat slow (this is not noticeable however unless it is called multiple times in one frame), and thus use it sparingly. If a more class specific list exists, such as that for pawns and navigation points (see below), use those instead. Note that if you wish to terminate the loop when a certain actor is returned, simply use &lt;code&gt;break;&lt;/code&gt;.

; ChildActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : The parameters work the same as AllActors'. However, this only returns actors with their owner set to the class this is run on. It has the same speed hit as AllActors.

; BasedActors ( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors that have this as a base. Same speed hit as AllActors.

; TraceActors ( class&lt;actor&gt; BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent ) : This is supposed to trace a line from Start to End and return all actors hit (executes as fast as a normal trace). However, this is not ever used by Epic in code and I recall of no one ever getting it to work right. I do not recommend using it.

; RadiusActors ( class&lt;actor&gt; BaseClass, out actor Actor, float Radius, optional vector Loc ) : This returns all actors that are within radius units of Loc (or if it isn't given; then the actor's location). Same speed hit as AllActors().

; VisibleActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc ) : This is much like RadiusActors() only it also checks if an actor is visible from Loc. Same speed hit as AllActors.

; VisibleCollidingActors ( class&lt;actor&gt; BaseClass, out actor Actor, optional float Radius, optional vector Loc, optional bool bIgnoreHidden ) : This only returns actors with bCollideActors as true. It uses the collision hash to check, and thus it is much faster than Allactors, in normal circumstances. If a very high radius is used (900 or so), then it becomes very slow, and VisibleActors should be used instead.

; ZoneInfo.ZoneActors( class&lt;actor&gt; BaseClass, out actor Actor ) : Returns all actors inside that zone. Same speed hit as AllActors(). Go figure.

===Inventory List ===

====Type and Scope ====

'''Type:'''  Standard one way linked list. Notice how it is defined in actor, and not in inventory. This is designed so other actors (pawns) can have a link to the base, while keeping the same pointer name.

'''Scope:'''  Server. On the client side however, it will only exist for the player being controlled and within his inventory. Other player's will not have an inventory list. Note that in very rare events, replication can come at a weird order and cause the inventory pointer of one item to point to an older one in the list. Thus when using this list client-side, you should have a check so that no more than 100 or so loops occur (to avoid infinite iterators).

====Adding and Removing ====

'''Adding:''' Call AddInventory() on the pawn you wish to add that inventory item to with that item in the parameters. It is then added to the beginning of the inventory list. This should only be done server-side. Note that inventory's GiveTo() automatically does this.

'''Removing:''' Class DeleteInventory() on the pawn(owner) with the item you wish to delete in the parameters. Again, this should only be performed server-side. When an inventory item is destroyed, this automatically occurs (see Inventory.Destroyed()).

====Navigating ====

If you are only searching for one item of a certain class (not child classes!), you can simply call FindInventoryType on the pawn who owns the items. Yet to search through the entire list do the following:

&lt;uscript&gt;
Local Inventory Inv;
For (Inv=somepawn.Inventory;Inv!=none;Inv=Inv.Inventory)
  //do stuff here
&lt;/uscript&gt;

===Pawn List ===

This list is the reason I am writing this tutorial. I tire of seeing code that uses ForEach AllActors(class'pawn',p), when there is a much faster way this can be done.

====Type and Scope ====

'''Type:''' Native controlled standard one way list linked by LevelInfo.PawnList.

'''Scope:''' Server Side only at BeginPlay() in gameinfo. Thus, on a client or in a mutator (post/pre)BeginPlay(), you need to stick with AllActors(class'pawn',p)

====Adding and Removing ====

'''Adding:''' Simply call AddPawn() on the pawn. Note that pawn automatically does this in its PreBeginPlay() so you really do not need to worry about calling this. Adds to the end of the list.

'''Removing:''' Call RemovePawn() on the pawn. This is automatically taken care of in Destroyed().

====Navigating ====

The list base is located in levelinfo. Simply call (in any actor):

&lt;uscript&gt;
Local pawn p;
For (p=level.pawnlist;p!=none;p=p.nextpawn)
  //do stuff
&lt;/uscript&gt;

===Navigation Point List ===

====Type and Scope ====

'''Type:''' Constant standard one way list linked by LevelInfo.NavigationPointList.

'''Scope:''' Server-side only.

====Adding and Removing ====

Cannot be done. The list is generated upon building the paths in UnrealEd.

====Navigating ====

Most likely you will use the navigation point list to find path nodes (a simple navpoint added by level authors). This allows you to spawn actors at many different locations in the map, and still have bots touch them. For instance, the relics mutator searches the Navigation Point list for pathnodes. Relics are then spawned at a random node. Like the pawn list, the base is in LevelInfo. 

&lt;uscript&gt;
Local NavigationPoint np;
For (np=level.NavigationPointList;np!=none;np=np.nextnavigationpoint)
  //do stuff
&lt;/uscript&gt;

Note that many other lists exist within navigation point. They are all used exclusively for AI navigation. Unless your name is Pfhoenix, they have no meaning.

===Mutator List ===

The introduction of mutators in Unreal 2.24 was one of the best things ever done for mod makers. What makes mutators so powerful? The fact that they are linked lists. This allows many different mods to be run at once and change many different game elements.

There are in fact 4 mutator lists in Unreal Tournament; the primary mutator list, damage mutators that only affect (Mutator)TakeDamage calls, message mutators that only affect messages (BroadCast, BroadCastLocalized, and player's talking), and finally HUD mutators that allow mutators to draw on the HUD.

====Type and Scope ====

'''Type:''' All are standard one-way linked lists. HUD mutators are linked to by a HUD, and all others are linked by the GameInfo.

'''Scope:''' Mutators normally (default) only exist server-side. However, the HUD mutators must be on the client (see below).

====Adding ====

=====Normal Mutators =====

When a user selects start, UT opens a map with a special parameter:

  ?mutator=MutatorPackage.MutatorClass,AnotherMutatorPackage.AnotherMutatorClass

The GameInfo's InitGame() is called when it is first spawned. First the base mutator (generally DMMutator) is spawned. From there the mutator options are parsed (this tutorial is not about string manipulation and Unreal URLs!), the mutator class dynamically loaded, then spawned, then finally added to the list:

&lt;uscript&gt;
log(&quot;Add mutator &quot;$LeftOpt);
MClass = class&lt;Mutator&gt;(DynamicLoadObject(LeftOpt, class'Class')); 
BaseMutator.AddMutator(Spawn(MClass));
&lt;/uscript&gt;

AddMutator() adds to the end of the list with the &quot;1337 function&quot; method described earlier in this tutorial. Now the mutator list is ready to receive notification of actor spawning, mutate commands, player respawnings, death notifications, and all those other wonderful events mutators receive from pawns and, more commonly, the gameinfo.

=====Damage Mutators =====

To make a mutator be used as a damage mutator (it still has normal mutator functions!), simply call Level.Game.RegisterDamageMutator(MutatorToBeRegistered). The mutator will now receive notification whenever a pawn takes damage and can modify certain values.

=====Message Mutators =====

This is another specialized mutator, not unlike a damage mutator. Simply call Level.Game.RegisterMessageMutator(MutatorToBeRegistered) to be able to edit all of the wonderful messages. Incidentally, message mutators did not exist until UT version 4.13. They were created simply for support of Rocket Arena. They have also been beneficial in stopping message hacking. :p

===== HUD Mutators =====

I cannot even count the amount of times people have asked why their HUD mutator will not work in network play. What is the reason for this problem? It is quite simple; mutators exist only on the server, yet HUDs are client-side only. Epic's code makes it appear that you can simply call RegisterHUDMutator, which is untrue. The following is one way of adding a HUD mutator on the client:

'''Step 1:''' In the default properties of your mutator, place the following:

&lt;uscript&gt;
bAlwaysRelevant=True
bNetTemporary=True
RemoteRole=ROLE_SimulatedProxy
&lt;/uscript&gt;

These values cause the mutator to be replicated to all clients, but the connection only stays open until the client has received the mutator. The mutator must also be a Simulated Proxy on the client for step 2 to work.

'''Step 2:''' Now add the following code to your mutator:

&lt;uscript&gt;
Simulated Function Tick(float delta)
{
  If (Level.NetMode == NM_DedicatedServer || bHUDMutator)
    Disable('Tick');
  Else
    RegisterHUDMutator();
}
&lt;/uscript&gt;

Each frame, RegisterHUDMutator() is called. If it finds a PlayerPawn with a HUD (local player!), it will set that HUD's HUDMutator to this mutator (as well as preserve the list) and set bHUDMutator to true. If the mutator has already been registered or this is a dedicated server (no HUDs!), then tick () can be safely disabled.

On a final note, I ask that all mod makers who make use of HUD mutators to do the following:  At the end of PostRender() in your HUD mutator, ''please'' add:

&lt;uscript&gt;
If (NextHUDMutator != None)
  NextHUDMutator.PostRender(Canvas);
&lt;/uscript&gt;

For some dumb reason, Epic did not add that support to begin with. Without those lines, your mutator will be the only HUD mutator used. Other HUD mutators will not receive PostRender() calls, and thus not be able to display anything on screen.

====Removing ====

No specialized functions exist to remove elements from mutator lists. Simply follow the removal model at the beginning of this tutorial.

====Navigating ====

Rarely will you ever need to iterate through the mutator list. All functions of mutators simply call that same function on the next mutator, returning a result if necessary. Yet if you wish to go through all mutators simply use:

&lt;uscript&gt;
Local mutator m;
For (m = ListStart; m != None; m = m.ListNext)
  //do stuff
&lt;/uscript&gt;

Replace &lt;code&gt;ListStart&lt;/code&gt; and &lt;code&gt;ListNext&lt;/code&gt; as follows:

{|

|-
|'''Mutator Type'''
|'''ListStart'''
|'''ListNext''' 
|-
|Normal
|&lt;code&gt;Level.Game.BaseMutator&lt;/code&gt;
|&lt;code&gt;NextMutator&lt;/code&gt;
|-
|Damage
|&lt;code&gt;Level.Game.DamageMutator&lt;/code&gt;
|&lt;code&gt;NextDamageMutator&lt;/code&gt;
|-
|Message
|&lt;code&gt;Level.Game.MessageMutator&lt;/code&gt;
|&lt;code&gt;NextMessageMutator&lt;/code&gt;
|-
|HUD
|&lt;code&gt;MyPlayerPawn.myHUD.HUDMutator&lt;/code&gt;
|&lt;code&gt;NextHUDMutator&lt;/code&gt;
|}

===Spawn Notification List ===

This is a list of very powerful actors; SpawnNotifies. For more information read http://unreal.epicgames.com/UTMagic.html. Whenever an actor is spawned/received on a client, native code calls SpawnNotification(actor) on the LevelInfo.SpawnNotify.

====Type and Scope ====

'''Type:''' Standard one-way list linked by LevelInfo.SpawnNotify.

'''Scope:''' Server and client-side. Note however that SpawnNotifies manually add themselves on both server and client, rather than having the list replicated, as is the case with inventory.

====Adding and Removing ====

'''Adding:''' SpawnNotify.PostBeginPlay() automatically adds to the beginning of the list.

'''Removing:''' SpawnNotify.Destroyed() automatically removes that SpawnNotify. Feel free to call Destroyed() yourself to remove a SpawnNotify from a list, for this does not actually destroy the actor.

'''Note:''' The entire spawn notification system can be temporary deactivated as follows:

&lt;uscript&gt;
Local SpawnNotify Sn;
Sn=level.SpawnNotify;
Level.SpawnNotify=None;
//do stuff here without worrying about Spawn Notifies.
Level.SpawnNotify=Sn;
&lt;/uscript&gt;

===Other Cases of Linked Lists ===

; InterpolationPoint : Uses a two-way list for interpolation of player locations and other properties between each point. While the list is created in unrealscript, that is as far as unrealscript handles it. Everything else is handled by native code.

; Pbolt : Uses a standard one-way list that you will probably never need to touch. The plasma beam you see when alt firing the Pulse Gun is actually a linked list of Pbolt's. Unfortunately, the system wasn't written in the best way possible. Ideally, there should be a pointer to the StarterBolt in all beams. Variables only important to the beam as a whole (AccumulatedDamage, LastHitTime) are controlled in each beam, rather than only the list base. Thus when beams are destroyed, some of those values are lost, resulting in odd damage patterns.

; Mover : Uses a one-way linked list that also has a pointer to the base. This is used for movers that follow other movers. Feel free to explore this code on your own.

; Actor.Deleted : A list of actors that have been deleted and are awaiting garbage collection. This occurs when 128 actors are in the list. This is only used in Epic's native C++ code.

; SavedMove : For player movement in a network environment, the client must save old moves to be sent later (to avoid overflowing the network and in cases of packet loss). The actual list is the standard one-way one, which carries move information. A playerpawn has pointers to the SavedMoves (the beginning of the SaveMove list), FreeMoves (a move that is &quot;free&quot;), and PendingMove (the next move to be sent to the server). Yet, this is a tutorial on lists, not something else. Study the SavedMove class and PlayerPawn.ReplicateMove() to learn more.

; Menu.ParentMenu : This is simply a pointer to the previous green menu that showed. These &quot;green menus&quot; were used in Unreal I only.  There is little need to understand how they work if you script in UT.

; ListElement : This is a two-way list that was set up for use with the WebAdmin. It is a quite powerful method of storing data.

; UWindowList : This is a very advanced list, which stores various data for the uWindow system.

; UWindowWindow : All the menus seen in UT are actually stored with this complex list system.

==Related Topics==
* [[Legacy:Scripting Linked Lists|Scripting Linked Lists]]

==Discussion==

'''Daid303:''' How about a UT2003 version of this page?

'''Foxpaw:''' UT2003 uses the same lists. New lists of items have mostly been implemented as dynamic arrays instead. There is also one new linked list to my knowledge, the inventory list of an actor.

'''Wormbo:''' The linked list of Inventory actors was declared in [[Legacy:Actor|Actor]] back in Unreal 1 v205 already. ;) We should probably create a page for all ''useful'' lists (not only linked lists) both in UT and UT2003. Things like the list of deleted actors can hardly be called useful in everyday UnrealScript coding...

'''Daid303:''' In UT2003 you also have the GUI, linked list? (didn't look) and controller ofcouse, is pawn still linked? And it would be nice to know what does and doesn't apply to UT2003. Oh, and how about a 'base' for linked list, 1 way, and 2 way. It would be alot easier of you could just copy a basic then work from that. I made a mistake in a 2 way linked list, and it took me quite a while to fix the remove function.

'''Wormbo:''' The GUI stuff is a set of dynamic arrays in the [[Legacy:GUIController|GUIController]]. Pawns aren't &quot;listed&quot; anymore, the Level.PawnList has been replaced by the Level.ControllerList.

'''Tarquin:''' I've rearranged other pages on linked lists. What should be done with this one? 

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/What Are Linked Lists]] &amp;ndash; '''Section 2 of 2''' &amp;ndash; End of Document</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LinkedReplicationInfo</title>
    <id>1743</id>
    <revision>
      <id>4283</id>
      <timestamp>2006-01-09T17:55:36Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; LinkedReplicationInfo (Package: Engine)}}

This class allows mod authors to [[Legacy:Replication|replicate]] additional information about a player to all clients in a network game by subclassing it and attaching it to a [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]].

==Properties==
; [[Legacy:LinkedReplicationInfo|LinkedReplicationInfo]] NextReplicationInfo: Link to the next replication info. This is used to build a list when there are multiple mods that want to add info about a player.

==Usage==

Neither LinkedReplicationInfo nor [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] provide methods for maintaining the [[Legacy:Linked List|linked list]], so mod authors will have to do that themselves. Both the PlayerReplicationInfo.CustomReplicationInfo and LinkedReplicationInfo.NextReplicationInfo variables are only replicated to clients if bNetInitial, which means that the LinkedReplicationInfo must be added serversidely before replication starts or it might not be linked on the client. Also, LinkedReplicationInfos should never be destroyed because changes in the linked list do not propagate to the clients. You may be able to carefully repair the list in a simulated Destroyed() function, though.

Some potentially useful (but untested) functions:

&lt;uscript&gt;
class MyLinkedRI extends LinkedReplicationInfo;

// should be called right after the PlayerReplicationInfo was spawned
static function MyLinkedRI SpawnFor(PlayerReplicationInfo OwnerPRI)
{
  local LinkedReplicationInfo LinkedRI;
  
  // check for existing linked RI
  LinkedRI = FindFor(OwnerPRI);
  if ( LinkedRI != None )
    return MyLinkedRI(LinkedRI);
  
  // spawn a new one
  if ( OwnerPRI != None &amp;&amp; OwnerPRI.Owner != None ) {
    LinkedRI = OwnerPRI.Spawn(default.Class, OwnerPRI.Owner);
    LinkedRI.NextReplicationInfo = OwnerPRI.CustomReplicationInfo;
    OwnerPRI.CustomReplicationInfo = LinkedRI;
  }
  return MyLinkedRI(LinkedRI);
}

// use this function to find your existing linked RI
static function MyLinkedRI FindFor(PlayerReplicationInfo OwnerPRI)
{
  local LinkedReplicationInfo LinkedRI;
  
  if ( OwnerPRI == None )
    return None;
  
  for (LinkedRI = OwnerPRI.CustomReplicationInfo; LinkedRI != None; LinkedRI = LinkedRI.NextReplicationInfo)
    if ( MyLinkedRI(LinkedRI) != None )
      return MyLinkedRI(LinkedRI);
  
  return None;
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4284</id>
      <timestamp>2005-09-03T08:25:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>can't spawn in a static</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:ReplicationInfo|ReplicationInfo]] &gt;&gt; LinkedReplicationInfo (Package: Engine)}}

This class allows mod authors to [[Legacy:Replication|replicate]] additional information about a player to all clients in a network game by subclassing it and attaching it to a [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]].

==Properties==

; [[Legacy:LinkedReplicationInfo|LinkedReplicationInfo]] NextReplicationInfo: Link to the next replication info. This is used to build a list when there are multiple mods that want to add info about a player.

==Usage==

Neither LinkedReplicationInfo nor [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] provide methods for maintaining the [[Legacy:Linked List|linked list]], so mod authors will have to do that themselves. Both the PlayerReplicationInfo.CustomReplicationInfo and LinkedReplicationInfo.NextReplicationInfo variables are only replicated to clients if bNetInitial, which means that the LinkedReplicationInfo must be added serversidely before replication starts or it might not be linked on the client. Also, LinkedReplicationInfos should never be destroyed because changes in the linked list do not propagate to the clients. You may be able to carefully repair the list in a simulated Destroyed() function, though.

Some potentially useful (but untested) functions:

&lt;uscript&gt;
class MyLinkedRI extends LinkedReplicationInfo;

// should be called right after the PlayerReplicationInfo was spawned
static function MyLinkedRI SpawnFor(PlayerReplicationInfo OwnerPRI)
{
  local LinkedReplicationInfo LinkedRI;
  
  // check for existing linked RI
  LinkedRI = FindFor(OwnerPRI);
  if ( LinkedRI != None )
    return MyLinkedRI(LinkedRI);
  
  // spawn a new one
  if ( OwnerPRI != None &amp;&amp; OwnerPRI.Owner != None ) {
    LinkedRI = OwnerPRI.Spawn(default.Class, OwnerPRI.Owner);
    LinkedRI.NextReplicationInfo = OwnerPRI.CustomReplicationInfo;
    OwnerPRI.CustomReplicationInfo = LinkedRI;
  }
  return MyLinkedRI(LinkedRI);
}

// use this function to find your existing linked RI
static function MyLinkedRI FindFor(PlayerReplicationInfo OwnerPRI)
{
  local LinkedReplicationInfo LinkedRI;
  
  if ( OwnerPRI == None )
    return None;
  
  for (LinkedRI = OwnerPRI.CustomReplicationInfo; LinkedRI != None; LinkedRI = LinkedRI.NextReplicationInfo)
    if ( MyLinkedRI(LinkedRI) != None )
      return MyLinkedRI(LinkedRI);
  
  return None;
}
&lt;/uscript&gt;

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Linking Karma Ragdolls</title>
    <id>1675</id>
    <revision>
      <id>4142</id>
      <timestamp>2003-04-28T22:05:47Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Update October 23rd''' - by SkullboX (Email addresses: SkullboX@planetquake.com)

This info will apply when the first [[Legacy:UT2003|UT2003]] patch has been released. For mod developers the info below is still relevant. However, for those making custom [[Legacy:UT2003|UT2003]] player models that require custom ragdoll skeletons, it will be easier when the new patch is released. The info has been posted on the [http://udn.epicgames.com/pub/Content/RagdollsInUT2003/ this Unreal Developer Network page].

{{innerbox|In the release version of UT2003 (version 2107) you had to create your own species in a new .u file to use a custom ragdoll. This was a little fiddly, but more importantly was caught by the cheat protection code. This approach is still suitable for mod development though, where you are creating a new species anyway to add new animations etc. 

In the forthcoming patch there is an alternative way to use your own ragdoll. Remember that a ragdoll asset is identified by its asset name not the name of the .ka file, so make sure the asset name is unique. 

1) Place the new .ka file in the /KarmaData directory. 

2) Create a new .upl file in the /System directory for your new character. 

3) At the end of the Player=(... line, inside the brackets, add: 

Ragdoll=AssetName 

Obviously replacing 'AssetName' with the name of the ragdoll asset to use for that character. 

Thats it! If no Ragdoll is supplied, it will simply use the one specified by the character's species.

}}

'''October 15th'''

This tutorial briefly explains how to get a custom ragdoll linked to a custom model. The tutorial isn't very detailed and written rather fast, so if you come across any problems or if it still doesn't work after having done all this, please leave me a note.

If you've got a model set up using one of the existing [[Legacy:UT2003|UT2003]] skeletons, it *should* work when using one of the existing [[Legacy:Karma|karma]] collision models. Make sure the Skeleton setup you chose for your model (for example, Jugg) matches the Species (Species=xGame.SPECIES_Jugg). If you've got one of the human skeletons, you should probably use SPECIES_Egypt, _Merc or _Night.

The subject model in this case is named MoP, and MoP's been imported into UnrealEd and has all the sockets set up as they should. If you need info on getting the model working in UT, go to [http://sv2.3dbuzz.com/vbforum/showthread.php?s=9039e52622606cd238abb245e1bfdf27&amp;threadid=14484 this post] by Praetorius.

It also has a custom ragdoll created for it, if you don't know how to make one take [http://www.mathengine.com/kat/2k3_tutorial/KAT_UT2003_Tutorial.html this tutorial].

Start by putting the MoP.ka file in the UT2003\KarmaData folder.

Start UnrealEd, and go to the [[Legacy:Actor Classes|Actor Classes]] tab (if you do not have that window, go to View -&gt; Show Actor Class Browser. This should bring up a list of Unreal scripts.

Start by unchecking the two options on top of that list, 'Use 'Actor' as Parent?' and 'Placeable classes Only?'.

Once you've done that, the list of scripts should be noticeably longer. Scroll down and look for a subtree called [[Legacy:SpeciesType|SpeciesType]], expand it. Four scripts should be there; SPECIES_Alien, SPECIES_Bot, SPECIES_Human and SPECIES_Jugg.

Now select the SpeciesType subtree, and click the new script icon on top of the browser. Behind Package, fill in something related to you model, in this case I would name it MoPScripts (Calling it just MoP will cause confusion and effors when making the .UPL file.) For name fill in SPECIES_MoP. (see [[Legacy:Create A Subclass|Create a subclass]])

Now the new script will come up, and you should see something like:

&lt;uscript&gt;
//=============================================================================
// SPECIES_MoP.
//=============================================================================
class SPECIES_MoP extends SpeciesType
placeable;
&lt;/uscript&gt;

Now Open one of the other Species scripts, SPECIES_Alien for example, and copy the info from 'abstract;' to the bottom. Then go back to your own script and paste it over 'placeable'. Finally, rename &quot;Alien2&quot; to &quot;MoP&quot;. Your script should look liek this by now:

&lt;uscript&gt;
//=============================================================================
// SPECIES_MoP.
//=============================================================================
class SPECIES_MoP extends SpeciesType
abstract;
static function string GetRagSkelName(String MeshName)
{
return &quot;MoP&quot;;
}
&lt;/uscript&gt;

To finish the scripting part, chose from the class window, Tools -&gt; Compile Changed. Then finally press View in the Actor Class Browser and check Show Packages. Select your newly created script and choose to Save Selected Packages. The created file, MoPScripts.u, shouldn't be bigger than 1 kb, if it's larger you've probably saved all the scripts together.

You're now done with the Unreal Scripting, the last step in Linking the Ragdoll to the model is to alter the UPL file of your model. Look for the part with 'species=' and change the stuff behind it to match the location of your newly created script. In my case it would look like this:

&lt;uscript&gt;
Species=MoPScripts.SPECIES_MoP
&lt;/uscript&gt;

Save the UPL file, and it should work.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4143</id>
      <timestamp>2002-10-23T10:47:09Z</timestamp>
      <contributor>
        <ip>Xhome.xs4all.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Update October 23rd''' - by SkullboX (Email addresses: SkullboX@planetquake.com)

This info will apply when the first [[Legacy:UT2003|UT2003]] has been released. For mod developers the info below is still relevant, however, for those making custom [[Legacy:UT2003|UT2003]] player models that require custom ragdoll skeletons, it will be easier when the new patch has been released. The info has bene posted on the [http://udn.epicgames.com/pub/Content/RagdollsInUT2003/ this Unreal Developer Network page].

{{innerbox|In the release version of UT2003 (version 2107) you had to create your own species in a new .u file to use a custom ragdoll. This was a little fiddly, but more importantly was caught by the &gt;cheat protection code. This approach is still suitable for mod development though, where you are creating a new species anyway to add new animations etc. 

In the forthcoming patch there is an alternative way to use your own ragdoll. Remember that a ragdoll asset is identified by its asset name not the name of the .ka file, so make sure the asset &gt;name is unique. 

1) Place the new .ka file in the /KarmaData directory. 

2) Create a new .upl file in the /System directory for your new character. 

3) At the end of the Player=(... line, inside the brackets, add: 

Ragdoll=AssetName 

Obviously replacing 'AssetName' with the name of the ragdoll asset to use for that character. 

Thats it! If no Ragdoll is supplied, it will simply use the one specified by the character's species.

}}

'''October 15th'''

This tutorial briefly explains how to get a custom ragdoll linked to a custom model. The tutorial isn't very detailed and written rather fast, so if you come across any problems or if it still doesn't work after having done all this, please leave me a note.

If you've got a model set up using one of the existing [[Legacy:UT2003|UT2003]] skeletons, it *should* work when using one of the existing [[Legacy:Karma|karma]] collision models. Make sure the Skeleton setup you chose for your model (for example, Jugg) matches the Species (Species=xGame.SPECIES_Jugg). If you've got one of the human skeletons, you should probably use SPECIES_Egypt, _Merc or _Night.

The subject model in this case is named MoP, and MoP's been imported into UnrealEd and has all the sockets set up as they should. If you need info on getting the model working in UT, go to [http://sv2.3dbuzz.com/vbforum/showthread.php?s=9039e52622606cd238abb245e1bfdf27&amp;threadid=14484 this post] by Praetorius.

It also has a custom ragdoll created for it, if you don't know how to make one take [http://www.mathengine.com/kat/2k3_tutorial/KAT_UT2003_Tutorial.html this tutorial].

Start by putting the MoP.ka file in the UT2003\KarmaData folder.

Start UnrealEd, and go to the [[Legacy:Actor Classes|Actor Classes]] tab (if you do not have that window, go to View -&gt; Show Actor Class Browser. This should bring up a list of Unreal scripts.

Start by unchecking the two options on top of that list, 'Use 'Actor' as Parent?' and 'Placeable classes Only?'.

Once you've done that, the list of scripts should be noticeably longer. Scroll down and look for a subtree called [[Legacy:SpeciesType|SpeciesType]], expand it. Four scripts should be there; SPECIES_Alien, SPECIES_Bot, SPECIES_Human and SPECIES_Jugg.

Now select the SpeciesType subtree, and click the new script icon on top of the browser. Behind Package, fill in something related to you model, in this case I would name it MoPScripts (Calling it just MoP will cause confusion and effors when making the .UPL file.) For name fill in SPECIES_MoP. (see [[Legacy:Create A Subclass|Create a subclass]])

Now the new script will come up, and you should see something like:

&lt;uscript&gt;
//=============================================================================
// SPECIES_MoP.
//=============================================================================
class SPECIES_MoP extends SpeciesType
placeable;
&lt;/uscript&gt;

Now Open one of the other Species scripts, SPECIES_Alien for example, and copy the info from 'abstract;' to the bottom. Then go back to your own script and paste it over 'placeable'. Finally, rename &quot;Alien2&quot; to &quot;MoP&quot;. Your script should look liek this by now:

&lt;uscript&gt;
//=============================================================================
// SPECIES_MoP.
//=============================================================================
class SPECIES_MoP extends SpeciesType
abstract;
static function string GetRagSkelName(String MeshName)
{
return &quot;MoP&quot;;
}
&lt;/uscript&gt;

To finish the scripting part, chose from the class window, Tools -&gt; Compile Changed. Then finally press View in the Actor Class Browser and check Show Packages. Select your newly created script and choose to Save Selected Packages. The created file, MoPScripts.u, shouldn't be bigger than 1 kb, if it's larger you've probably saved all the scripts together.

You're now done with the Unreal Scripting, the last step in Linking the Ragdoll to the model is to alter the UPL file of your model. Look for the part with 'species=' and change the stuff behind it to match the location of your newly created script. In my case it would look like this:

&lt;uscript&gt;
Species=MoPScripts.SPECIES_MoP
&lt;/uscript&gt;

Save the UPL file, and it should work.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4144</id>
      <timestamp>2002-10-23T10:49:36Z</timestamp>
      <contributor>
        <ip>Xhome.xs4all.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Update October 23rd''' - by SkullboX (Email addresses: SkullboX@planetquake.com)

This info will apply when the first [[Legacy:UT2003|UT2003]] patch has been released. For mod developers the info below is still relevant. However, for those making custom [[Legacy:UT2003|UT2003]] player models that require custom ragdoll skeletons, it will be easier when the new patch is released. The info has been posted on the [http://udn.epicgames.com/pub/Content/RagdollsInUT2003/ this Unreal Developer Network page].

{{innerbox|In the release version of UT2003 (version 2107) you had to create your own species in a new .u file to use a custom ragdoll. This was a little fiddly, but more importantly was caught by the &gt;cheat protection code. This approach is still suitable for mod development though, where you are creating a new species anyway to add new animations etc. 

In the forthcoming patch there is an alternative way to use your own ragdoll. Remember that a ragdoll asset is identified by its asset name not the name of the .ka file, so make sure the asset &gt;name is unique. 

1) Place the new .ka file in the /KarmaData directory. 

2) Create a new .upl file in the /System directory for your new character. 

3) At the end of the Player=(... line, inside the brackets, add: 

Ragdoll=AssetName 

Obviously replacing 'AssetName' with the name of the ragdoll asset to use for that character. 

Thats it! If no Ragdoll is supplied, it will simply use the one specified by the character's species.

}}

'''October 15th'''

This tutorial briefly explains how to get a custom ragdoll linked to a custom model. The tutorial isn't very detailed and written rather fast, so if you come across any problems or if it still doesn't work after having done all this, please leave me a note.

If you've got a model set up using one of the existing [[Legacy:UT2003|UT2003]] skeletons, it *should* work when using one of the existing [[Legacy:Karma|karma]] collision models. Make sure the Skeleton setup you chose for your model (for example, Jugg) matches the Species (Species=xGame.SPECIES_Jugg). If you've got one of the human skeletons, you should probably use SPECIES_Egypt, _Merc or _Night.

The subject model in this case is named MoP, and MoP's been imported into UnrealEd and has all the sockets set up as they should. If you need info on getting the model working in UT, go to [http://sv2.3dbuzz.com/vbforum/showthread.php?s=9039e52622606cd238abb245e1bfdf27&amp;threadid=14484 this post] by Praetorius.

It also has a custom ragdoll created for it, if you don't know how to make one take [http://www.mathengine.com/kat/2k3_tutorial/KAT_UT2003_Tutorial.html this tutorial].

Start by putting the MoP.ka file in the UT2003\KarmaData folder.

Start UnrealEd, and go to the [[Legacy:Actor Classes|Actor Classes]] tab (if you do not have that window, go to View -&gt; Show Actor Class Browser. This should bring up a list of Unreal scripts.

Start by unchecking the two options on top of that list, 'Use 'Actor' as Parent?' and 'Placeable classes Only?'.

Once you've done that, the list of scripts should be noticeably longer. Scroll down and look for a subtree called [[Legacy:SpeciesType|SpeciesType]], expand it. Four scripts should be there; SPECIES_Alien, SPECIES_Bot, SPECIES_Human and SPECIES_Jugg.

Now select the SpeciesType subtree, and click the new script icon on top of the browser. Behind Package, fill in something related to you model, in this case I would name it MoPScripts (Calling it just MoP will cause confusion and effors when making the .UPL file.) For name fill in SPECIES_MoP. (see [[Legacy:Create A Subclass|Create a subclass]])

Now the new script will come up, and you should see something like:

&lt;uscript&gt;
//=============================================================================
// SPECIES_MoP.
//=============================================================================
class SPECIES_MoP extends SpeciesType
placeable;
&lt;/uscript&gt;

Now Open one of the other Species scripts, SPECIES_Alien for example, and copy the info from 'abstract;' to the bottom. Then go back to your own script and paste it over 'placeable'. Finally, rename &quot;Alien2&quot; to &quot;MoP&quot;. Your script should look liek this by now:

&lt;uscript&gt;
//=============================================================================
// SPECIES_MoP.
//=============================================================================
class SPECIES_MoP extends SpeciesType
abstract;
static function string GetRagSkelName(String MeshName)
{
return &quot;MoP&quot;;
}
&lt;/uscript&gt;

To finish the scripting part, chose from the class window, Tools -&gt; Compile Changed. Then finally press View in the Actor Class Browser and check Show Packages. Select your newly created script and choose to Save Selected Packages. The created file, MoPScripts.u, shouldn't be bigger than 1 kb, if it's larger you've probably saved all the scripts together.

You're now done with the Unreal Scripting, the last step in Linking the Ragdoll to the model is to alter the UPL file of your model. Look for the part with 'species=' and change the stuff behind it to match the location of your newly created script. In my case it would look like this:

&lt;uscript&gt;
Species=MoPScripts.SPECIES_MoP
&lt;/uscript&gt;

Save the UPL file, and it should work.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Linux</title>
    <id>1740</id>
    <revision>
      <id>4279</id>
      <timestamp>2005-01-14T00:16:25Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">Information and tips for running [[Legacy:Unreal Tournament|Unreal Tournament]] under Linux

==Brief History==

A Linux version of [[Legacy:Unreal Tournament|Unreal Tournament]] was originally planned, but not ready in time to be included alongside the Windows release. Epic open sourced the unfinished code for [[Legacy:UT|UT]] under Linux shortly after the game's debut.  This code was quickly adopted by a few developers who started the [http://openut.sourceforge.net/ OpenUT] project on SourceForge.  This later became a joint effort with [http://www.lokigames.com/ Loki Software] to produce a [http://www.lokigames.com/products/ut/ Linux installer] and binaries for the game.  OpenUT is no longer maintained, since January 2001.  Loki is now bankrupt.  See the [http://openut.sourceforge.net/files/OpenUT-FAQ.txt OpenUT FAQ] for more details on the history of the Linux version.  The [http://www.utpg.org/ Unreal Tournament Preservation Group] have taken over maintenance of the code base for [[Legacy:UT|UT]] with an agreement from Epic and are releasing patches for the Linux version as well.

==Current Status==

There exists both a patch and an installer for version 436 of [[Legacy:UT|UT]] under Linux.  These are still available from mirror sites:

* http://www.planetunreal.com/files/ut.shtml
* http://www.3ddownloads.com/index.php3?directory=/linuxgames/loki/patches/ut/

Note that installing the game under Linux requires a copy of the Windows Unreal Tournament game CD.

===UTPG.org - version 451===

The [http://www.utpg.org/ UTPG] folks have released a Linux patch for version 451 of [[Legacy:UT|UT]], which includes numerous security fixes, working webadmin, and Daniel Vogel's OpenGL driver.

==Installation==

Paraphrasing from the &lt;tt&gt;ut-install-436.run.README&lt;/tt&gt;:

* You must have 550MB free disk space
* The Unreal Tournament game CD must be in your CD-ROM drive and mounted before running the installer.

::''example:''&amp;nbsp;&amp;nbsp;&lt;code&gt;mount /cdrom&lt;/code&gt;

''As of November 2004:'' The [[Legacy:UT|UT]] Linux installer runs with only a little tweaking needed.  Running the installer as suggested in the README using

::&lt;code&gt; sh ut-install-436.run&lt;/code&gt;

results in errors for both '''root''' and normal users.

Running the installer as '''root''' with the following options allows the installer to execute properly:

::&lt;code&gt; sh ut-install-436.run &amp;ndash;keep &amp;ndash;confirm&lt;/code&gt;

The installation should default to &lt;tt&gt;/usr/local/games/ut&lt;/tt&gt;.

Note that you will have to manually delete the directory where the temporary installation files are uncompressed to, usually named &lt;tt&gt;ut-436&lt;/tt&gt;, in the same directory you ran the installer from.

===Author's specs:===

; Hardware :
* Pentium II 400Mhz
* 192MB RAM
* ATI Radeon 9000 Pro
* SB Live!

; Environment :
* Linux 2.6.7
* Debian unstable
* XFree86 4.3
* XFree86 &lt;tt&gt;radeon&lt;/tt&gt; driver
* ALSA sound, with OSS emulation</text>
    </revision>
    <revision>
      <id>4280</id>
      <timestamp>2005-01-13T23:21:10Z</timestamp>
      <contributor>
        <ip>Lepam03.pamlico.k12.nc.us</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LionsPhil</title>
    <id>1748</id>
    <revision>
      <id>4292</id>
      <timestamp>2007-06-02T13:36:54Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <comment>DM-LP-Gravometric: more warpzones!</comment>
      <text xml:space="preserve">LionsPhil, or &quot;81-86-106-14.dsl.pipex.com&quot; as the wiki knows him because he can never remember his ID number, let alone his password, probably shouldn't be writing this in the third person.

&lt;nowiki&gt;*ahem*&lt;/nowiki&gt;

I tinker, much like [[Legacy:McNutcase|McNutcase]], and tend to be more focused on finding new ways to make the Unreal Engine wibble than in making masterpieces (it should suprise nobody, then, that the first edit I made here was to [[Legacy:WarpZoneInfo|WarpZoneInfo]]).

Anyway, I sometimes make things and put them somewhere on [http://www.ecs.soton.ac.uk/~prb102/ my website]. Maps I've made public:
* Shonky (can be found if you dig about in the [http://www.ecs.soton.ac.uk/~prb102/junk/ junk folder])
** DM-(LP)-WarpZoneTest, DM-(LP)-WarpZoneTest3 &amp;ndash; builds of the standard WarpZone example; '3' makes it an infinite corridor. Not interesting; listed for completeness.
** DM-(LP)-DropIn &amp;ndash; a hideously minimalist (four-sided, two-zoned) inverse ringworld (you run on the inside, not outside, surface; demonstrates the WarpZone aiming problem quite nicely, and what happens if you slant the ends of something like WarpZoneTest3.
** DM-(LP)-QuantumNightmare &amp;ndash; a pleasingly simple way to break the minds of people who haven't yet seen WarpZones. Four tall rooms in a square, apart from the fact that they're all the same room. Demonstrates rotation of warpzones.
** DM-(LP)-Infinifall &amp;ndash; the &quot;good practices&quot; WarpZone demo map I added to the discussion of [[Legacy:WarpZoneInfo|WarpZoneInfo]].
** DM-1on1-LP-CursedWell &amp;ndash; an attempt at 'negative width walls' inspired by some crazy people over on [http://ars.userfriendly.org/cartoons/read.cgi?id=20051003&amp;tid=1811836 UserFriendly]. The well to which the title alludes works and is very subtle (too subtle to really notice); the doorways suffer horrible graphical glitches where polygons from the player's zone get rendered even though they should be occluded by the warpzone plane (and there's one with a floor-level strip in the YZ plane that I have no idea as to the origins of).
** DM-1on1-LP-CursedWellEx &amp;ndash; as above, but the brick motif side of the well has its 'negative wall' room positioned up a ramp so that four different bits of physical space aren't trying to exist in the same one bit of virtual space. Still glitches. (Yes, the texturing is all misaligned. This was a quick hack.)
* Less shonky
** [http://www.ecs.soton.ac.uk/~prb102/chaos/ DM-1on1-LP-Shafted] &amp;ndash; a &quot;narrow beams&quot; map I made to experiment with i) emitters ii) chaining movers and iii) how fiddly a map can become for the AI says &quot;sod this, I'm off to play Minesweeper&quot;.
** [http://www.ecs.soton.ac.uk/~prb102/chaos/ DM-LP-Gravometric] &amp;ndash; an attempt at a &quot;real&quot; map with plentiful [[Legacy:WarpZoneInfo|warp zones]]; also a little Escher-esque meta-cube, where &quot;down&quot; isn't a particularly consistent concept (using rotated warpzones, rather than [[Legacy:PhysicsVolume|PhysicsVolume]]s, means that the players' feet are always pointing the same way as gravity).

Basically, although Shafted's the only one with any kind of formal license, feel free to crack any of them open in UnrealEd and have a peek/poke &amp;ndash; just share any interesting (read: NNGH. MA ''BRAIN!'') results. ;)

==Discussion ==

'''McNutcase:''' The odd bit in the doorway on CursedWell is where you have a bit of space that's been folded so much it's used by FOUR zones ingame. I figured this out by seeing a bot's feet in said area (also, the UDamage glow leaks through there...) after forgetting to zero bot count for testing...

'''LionsPhil:''' If you mean the sub-'water'-level sections of the crevicies either side of the doorway, then, yeah, in ''virtual'' space they are. In ''physical'' space, of course, they're distinct, and each is a seperate zone. May well be the cause, though, especially for that mystery strip. Hmm. I may modify it to put some normal-space 'padding' to prevent such overlap, seeing as it seems that the engine Really Can't Cope. (A formalised version of this probably belongs on [[Legacy:WarpZoneInfo|WarpZoneInfo]]'s ever-growing list of Things Which Don't Work.)

'''McNutcase:''' Really, though, that list ought to be Things Which No Sane Coder Could Possibly Have Expected Anyone To Even Think Of Trying. We, my friend, are an infinite source of sanity checks and Can't Happen situations...

'''LionsPhil:''' Bah&amp;rarr;''puts on CompSci student hat''&amp;rarr;that just means that they didn't define the behaviour generically/elegantly enough for it to handle complicated combinations of the simple tools they provided. ;) Anyway, an -Ex version of the map now exists with the aformentioned 'padding'; it's fixed the mystery strip, but not the failed occlusion. Bizzarelly, I tried taking a screenshot from the ramp, looking upwards through the door, showing the parts of the surrounding wall from my zone rendering inside the doorframe, but when pasted into El Gimp the doorframe was missing. Now ''that''&lt;nowiki&gt;'&lt;/nowiki&gt;s weird.</text>
    </revision>
    <revision>
      <id>4293</id>
      <timestamp>2005-10-05T19:48:47Z</timestamp>
      <contributor>
        <ip>McNutcase</ip>
      </contributor>
      <comment>never mind sanity checks, we force INsanity checks!</comment>
      <text xml:space="preserve">LionsPhil, or &quot;81-86-106-14.dsl.pipex.com&quot; as the wiki knows him because he can never remember his ID number, let alone his password, probably shouldn't be writing this in the third person.

&lt;nowiki&gt;*ahem*&lt;/nowiki&gt;

I tinker, much like [[Legacy:McNutcase|McNutcase]], and tend to be more focused on finding new ways to make the Unreal Engine wibble than in making masterpieces (it should suprise nobody, then, that the first edit I made here was to [[Legacy:WarpZoneInfo|WarpZoneInfo]]).

Anyway, I sometimes make things and put them somewhere on [http://www.ecs.soton.ac.uk/~prb102/ my website]. Maps I've made public:
* Shonky (can be found if you dig about in the [http://www.ecs.soton.ac.uk/~prb102/junk/ junk folder])
** DM-(LP)-WarpZoneTest, DM-(LP)-WarpZoneTest3 &amp;ndash; builds of the standard WarpZone example; '3' makes it an infinite corridor. Not interesting; listed for completeness.
** DM-(LP)-DropIn &amp;ndash; a hideously minimalist (four-sided, two-zoned) inverse ringworld (you run on the inside, not outside, surface; demonstrates the WarpZone aiming problem quite nicely, and what happens if you slant the ends of something like WarpZoneTest3.
** DM-(LP)-QuantumNightmare &amp;ndash; a pleasingly simple way to break the minds of people who haven't yet seen WarpZones. Four tall rooms in a square, apart from the fact that they're all the same room. Demonstrates rotation of warpzones.
** DM-(LP)-Infinifall &amp;ndash; the &quot;good practices&quot; WarpZone demo map I added to the discussion of [[Legacy:WarpZoneInfo|WarpZoneInfo]].
** DM-1on1-LP-CursedWell &amp;ndash; an attempt at 'negative width walls' inspired by some crazy people over on [http://ars.userfriendly.org/cartoons/read.cgi?id=20051003&amp;tid=1811836 UserFriendly]. The well to which the title alludes works and is very subtle (too subtle to really notice); the doorways suffer horrible graphical glitches where polygons from the player's zone get rendered even though they should be occluded by the warpzone plane (and there's one with a floor-level strip in the YZ plane that I have no idea as to the origins of).
* Less shonky
** [http://www.ecs.soton.ac.uk/~prb102/chaos/ DM-1on1-LP-Shafted] &amp;ndash; a &quot;narrow beams&quot; map I made to experiment with i) emitters ii) chaining movers and iii) how fiddly a map can become for the AI says &quot;sod this, I'm off to play Minesweeper&quot;.

Basically, although Shafted's the only one with any kind of formal license, feel free to crack any of them open in UnrealEd and have a peek/poke &amp;ndash; just share any interesting (read: NNGH. MA ''BRAIN!'') results. ;)

==Discussion ==

'''McNutcase:''' The odd bit in the doorway on CursedWell is where you have a bit of space that's been folded so much it's used by FOUR zones ingame. I figured this out by seeing a bot's feet in said area (also, the UDamage glow leaks through there...) after forgetting to zero bot count for testing...

'''LionsPhil:''' If you mean the sub-'water'-level sections of the crevicies either side of the doorway, then, yeah, in ''virtual'' space they are. In ''physical'' space, of course, they're distinct, and each is a seperate zone. May well be the cause, though, especially for that mystery strip. Hmm. I may modify it to put some normal-space 'padding' to prevent such overlap, seeing as it seems that the engine Really Can't Cope. (A formalised version of this probably belongs on [[Legacy:WarpZoneInfo|WarpZoneInfo]]'s ever-growing list of Things Which Don't Work.)

'''McNutcase:''' Really, though, that list ought to be Things Which No Sane Coder Could Possibly Have Expected Anyone To Even Think Of Trying. We, my friend, are an infinite source of sanity checks and Can't Happen situations...</text>
    </revision>
    <revision>
      <id>4294</id>
      <timestamp>2005-10-05T20:06:11Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <comment>CursedWellEx (Mmm...Windows API flavoured...)</comment>
      <text xml:space="preserve">LionsPhil, or &quot;81-86-106-14.dsl.pipex.com&quot; as the wiki knows him because he can never remember his ID number, let alone his password, probably shouldn't be writing this in the third person.

&lt;nowiki&gt;*ahem*&lt;/nowiki&gt;

I tinker, much like [[Legacy:McNutcase|McNutcase]], and tend to be more focused on finding new ways to make the Unreal Engine wibble than in making masterpieces (it should suprise nobody, then, that the first edit I made here was to [[Legacy:WarpZoneInfo|WarpZoneInfo]]).

Anyway, I sometimes make things and put them somewhere on [http://www.ecs.soton.ac.uk/~prb102/ my website]. Maps I've made public:
* Shonky (can be found if you dig about in the [http://www.ecs.soton.ac.uk/~prb102/junk/ junk folder])
** DM-(LP)-WarpZoneTest, DM-(LP)-WarpZoneTest3 &amp;ndash; builds of the standard WarpZone example; '3' makes it an infinite corridor. Not interesting; listed for completeness.
** DM-(LP)-DropIn &amp;ndash; a hideously minimalist (four-sided, two-zoned) inverse ringworld (you run on the inside, not outside, surface; demonstrates the WarpZone aiming problem quite nicely, and what happens if you slant the ends of something like WarpZoneTest3.
** DM-(LP)-QuantumNightmare &amp;ndash; a pleasingly simple way to break the minds of people who haven't yet seen WarpZones. Four tall rooms in a square, apart from the fact that they're all the same room. Demonstrates rotation of warpzones.
** DM-(LP)-Infinifall &amp;ndash; the &quot;good practices&quot; WarpZone demo map I added to the discussion of [[Legacy:WarpZoneInfo|WarpZoneInfo]].
** DM-1on1-LP-CursedWell &amp;ndash; an attempt at 'negative width walls' inspired by some crazy people over on [http://ars.userfriendly.org/cartoons/read.cgi?id=20051003&amp;tid=1811836 UserFriendly]. The well to which the title alludes works and is very subtle (too subtle to really notice); the doorways suffer horrible graphical glitches where polygons from the player's zone get rendered even though they should be occluded by the warpzone plane (and there's one with a floor-level strip in the YZ plane that I have no idea as to the origins of).
** DM-1on1-LP-CursedWellEx &amp;ndash; as above, but the brick motif side of the well has its 'negative wall' room positioned up a ramp so that four different bits of physical space aren't trying to exist in the same one bit of virtual space. Still glitches. (Yes, the texturing is all misaligned. This was a quick hack.)
* Less shonky
** [http://www.ecs.soton.ac.uk/~prb102/chaos/ DM-1on1-LP-Shafted] &amp;ndash; a &quot;narrow beams&quot; map I made to experiment with i) emitters ii) chaining movers and iii) how fiddly a map can become for the AI says &quot;sod this, I'm off to play Minesweeper&quot;.

Basically, although Shafted's the only one with any kind of formal license, feel free to crack any of them open in UnrealEd and have a peek/poke &amp;ndash; just share any interesting (read: NNGH. MA ''BRAIN!'') results. ;)

==Discussion ==

'''McNutcase:''' The odd bit in the doorway on CursedWell is where you have a bit of space that's been folded so much it's used by FOUR zones ingame. I figured this out by seeing a bot's feet in said area (also, the UDamage glow leaks through there...) after forgetting to zero bot count for testing...

'''LionsPhil:''' If you mean the sub-'water'-level sections of the crevicies either side of the doorway, then, yeah, in ''virtual'' space they are. In ''physical'' space, of course, they're distinct, and each is a seperate zone. May well be the cause, though, especially for that mystery strip. Hmm. I may modify it to put some normal-space 'padding' to prevent such overlap, seeing as it seems that the engine Really Can't Cope. (A formalised version of this probably belongs on [[Legacy:WarpZoneInfo|WarpZoneInfo]]'s ever-growing list of Things Which Don't Work.)

'''McNutcase:''' Really, though, that list ought to be Things Which No Sane Coder Could Possibly Have Expected Anyone To Even Think Of Trying. We, my friend, are an infinite source of sanity checks and Can't Happen situations...

'''LionsPhil:''' Bah&amp;rarr;''puts on CompSci student hat''&amp;rarr;that just means that they didn't define the behaviour generically/elegantly enough for it to handle complicated combinations of the simple tools they provided. ;) Anyway, an -Ex version of the map now exists with the aformentioned 'padding'; it's fixed the mystery strip, but not the failed occlusion. Bizzarelly, I tried taking a screenshot from the ramp, looking upwards through the door, showing the parts of the surrounding wall from my zone rendering inside the doorframe, but when pasted into El Gimp the doorframe was missing. Now ''that''&lt;nowiki&gt;'&lt;/nowiki&gt;s weird.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ListItem</title>
    <id>1657</id>
    <revision>
      <id>4101</id>
      <timestamp>2003-05-27T09:57:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Object (UT)|Object (UT)]] &gt;&gt; ListItem (Package: UTServerAdmin)}}
:

{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; ListItem (Package: XWebAdmin)}}

A simple two-way [[Legacy:Linked List|linked list]] used by the web-based remote server administration ([[Legacy:UTServerAdmin|UTServerAdmin]]) to build lists of maps, mutators, etc.

==Properties==
; ListItem Next : The next item in the list.
; ListItem Prev : The previous item in the list.
; string Tag :
; string Data :
; bool bJustMoved :

==Methods==
; AddElement (ListItem NewElement) :
; AddSortedElement (out ListItem FirstElement, ListItem NewElement) :
; ListItem FindItem (String SearchData) : 
; ListItem DeleteElement (out ListItem First, optional String SearchData) :
; MoveElementUp (out ListItem First, ListItem MoveItem, out int Count) :
; MoveElementDown (out ListItem First, ListItem MoveItem, out int Count) :
; RunTest ( ) : This function is obviously used for testing.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4102</id>
      <timestamp>2002-04-14T09:59:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; ListItem}}

A simple two-way linked list used by the remote server administration ([[Legacy:UTServerAdmin|UTServerAdmin]]) to build lists of maps, mutators, etc.

==Properties ==
; ListItem Next : The next item in the list.
; ListItem Prev : The previous item in the list.
; string Tag :
; string Data :
; bool bJustMoved :

==Functions ==
; function AddElement(ListItem NewElement) :
; function AddSortedElement(out ListItem FirstElement, ListItem NewElement) :
; function ListItem FindItem(String SearchData) : 
; function ListItem DeleteElement(out ListItem First, optional String SearchData) :
; function MoveElementUp(out ListItem First, ListItem MoveItem, out int Count) :
; function MoveElementDown(out ListItem First, ListItem MoveItem, out int Count) :
; function RunTest() : This function is obviously used for testing.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lizardman6</title>
    <id>1756</id>
    <revision>
      <id>4309</id>
      <timestamp>2006-10-30T20:53:37Z</timestamp>
      <contributor>
        <ip>Lizardman6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==About me.....==

I'm trying to learn how to use UnrealScript....but so far, I have not been too successful....:-(

I also need HELP with the UT2004RPG.</text>
    </revision>
    <revision>
      <id>4310</id>
      <timestamp>2006-09-08T22:03:55Z</timestamp>
      <contributor>
        <ip>Lizardman6</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About me.....==</text>
    </revision>
    <revision>
      <id>4311</id>
      <timestamp>2006-09-08T22:32:15Z</timestamp>
      <contributor>
        <ip>Lizardman6</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About me.....==

I'm trying to learn how to use UnrealScript....but so far, I have not been too successful....:-(</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LoTekK</title>
    <id>1674</id>
    <revision>
      <id>4140</id>
      <timestamp>2002-10-15T13:51:34Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki, LoTekK. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''EntropicLqd:''' Welcome to the Wiki.  Hope you enjoy your stay. :)

'''ZxAnPhOrIaN:''' Hi and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4141</id>
      <timestamp>2002-10-15T09:24:12Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>welcome</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki, LoTekK. :) Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list.

'''EntropicLqd:''' Welcome to the Wiki.  Hope you enjoy your stay. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Local PlayerController</title>
    <id>1742</id>
    <revision>
      <id>4282</id>
      <timestamp>2004-12-23T09:07:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Netcode Idioms]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Netcode Idioms|Netcode Idioms]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Local PlayerPawn</title>
    <id>1741</id>
    <revision>
      <id>4281</id>
      <timestamp>2004-12-23T09:06:15Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Netcode Idioms]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Netcode Idioms|Netcode Idioms]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LocalMessage</title>
    <id>1641</id>
    <revision>
      <id>4067</id>
      <timestamp>2007-04-14T02:09:58Z</timestamp>
      <contributor>
        <ip>C-71-62-144-202.hsd1.va.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LocalMessage (Package: Engine)}}

LocalMessages are abstract classes which contain an array of [[Legacy:Localization|localized]] text. They can be used to display messages to players, either individually or globally.

The [[Legacy:PlayerController|PlayerController]] function ReceiveLocalizedMessage() is used to send messages to a specific player by specifying the LocalMessage class and index.  This allows the message to be localized on the client side, and saves network bandwidth since the text is not sent.  Actors (such as the [[Legacy:GameInfo|GameInfo]]) use one or more LocalMessage classes to send messages.  The [[Legacy:BroadcastHandler|BroadcastHandler]] function BroadcastLocalizedMessage() is used to broadcast localized messages to all the players. See [[Legacy:Using LocalMessages|Using LocalMessages]] for more.

''Also see [[Legacy:LocalMessage (UT)|LocalMessage (UT)]].''

==Properties ==
; bool bComplexString : Indicates a multicolor string message class. The HUD calls the RenderComplexMessage function to let the message render itself. This only works for string messages like Say, TeamSay or death messages. (bSpecial == False)
; bool bIsSpecial : If true, don't add to normal queue.
; bool bIsUnique : If true and special, only one can be in the HUD queue at a time.
; bool bIsPartiallyUnique : If true and special, only one can be in the HUD queue with the same switch value
; bool bIsConsoleMessage : If true, put a GetString on the console.
; bool bFadeMessage : If true, use fade out effect on message.
; bool bBeep : If true, beep!
; int Lifetime : Number of seconds to stay in HUD message queue.
; class&lt;LocalMessage&gt; ChildMessage : In some cases, we need to refer to a child message.
; Color DrawColor : Default draw color for this message.
; EDrawPivot DrawPivot : 
; EStackMode StackMode : Brutal hack! o_O
; float PosX, PosY : Default screen location.
; int FontSize : 0: Huge, 1: Big, 2: Small

==Enums ==

===EStackMode ===
; SM_None : 
; SM_Up : 
; SM_Down : 

==Methods ==

All LocalMessage methods are [[Legacy:Static Function|static function]]s and most of them return a value based on the Switch, zero to two [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s and maybe an optional [[Legacy:Object|Object]], so don't be suprised to see long function declaration lines here. ;)
; RenderComplexMessage ([[Legacy:Canvas|Canvas]] Canvas, out float XL, out float YL, optional String MessageString, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : 
; string GetRelatedString (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Returns the display string if for the player mentioned in RelatedPRI_1.
; string GetString (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Returns the display string for all other players.
; string AssembleString ([[Legacy:HUD|HUD]] myHUD, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional String MessageString) : 
; ClientReceive ([[Legacy:PlayerController|PlayerController]] P, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : 
; color GetConsoleColor ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1) : 
; color GetColor (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2) : Returns the draw color for the message.
; GetPos (int Switch, out EDrawPivot OutDrawPivot, out EStackMode OutStackMode, out float OutPosX, out float OutPosY) : Returns a draw position on the canvas for the message.
; int GetFontSize (int Switch, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI1, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI2, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] LocalPlayer) : 
; float GetLifeTime (int Switch) : 

==Known Subclasses ==
 LocalMessage
  +- [[Legacy:BulldogMessage|BulldogMessage]]
  +- [[Legacy:CTFHUDMessage|CTFHUDMessage]]
  |   +- [[Legacy:XBombHUDMessage|xBombHUDMessage]]
  +- [[Legacy:ComboMessage|ComboMessage]]
  +- [[Legacy:CriticalEventPlus|CriticalEventPlus]]
  |   +- [[Legacy:ActionMessage|ActionMessage]]
  |   |   +- [[Legacy:ActionMessage_BR|ActionMessage_BR]]
  |   |   +- [[Legacy:ActionMessage_CTF|ActionMessage_CTF]]
  |   |   +- [[Legacy:ActionMessage_DM|ActionMessage_DM]]
  |   |   +- [[Legacy:ActionMessage_DOM|ActionMessage_DOM]]
  |   |   +- [[Legacy:ActionMessage_SubTitle|ActionMessage_SubTitle]]
  |   +- [[Legacy:CTFMessage|CTFMessage]]
  |   +- [[Legacy:FirstBloodMessage|FirstBloodMessage]]
  |   +- [[Legacy:KillingSpreeMessage|KillingSpreeMessage]]
  |   +- [[Legacy:StartupMessage|StartupMessage]]
  |   +- [[Legacy:TimerMessage|TimerMessage]]
  |   +- [[Legacy:XBombMessage|xBombMessage]]
  +- [[Legacy:FailedConnect|FailedConnect]]
  +- [[Legacy:GameMessage|GameMessage]]
  +- [[Legacy:MultiKillMessage|MultiKillMessage]]
  +- [[Legacy:PickupMessagePlus|PickupMessagePlus]]
  +- [[Legacy:PlayerNameMessage|PlayerNameMessage]]
  +- [[Legacy:SpecialKillMessage|SpecialKillMessage]]
  +- [[Legacy:StringMessagePlus|StringMessagePlus]]
  |   +- [[Legacy:SayMessagePlus|SayMessagePlus]]
  |   +- [[Legacy:TeamSayMessagePlus|TeamSayMessagePlus]]
  +- [[Legacy:XDeathMessage|xDeathMessage]]
  +- [[Legacy:XDomMessage|xDomMessage]]
  +- [[Legacy:XKillerMessagePlus|xKillerMessagePlus]]
  +- [[Legacy:XVictimMessage|xVictimMessage]]

==Related Topics ==
* [[Legacy:Using LocalMessages|Using LocalMessages]]

==Discussion ==

'''Guest:''' (TurkeyFromHell) Hey I'm making this discussion section for one specific question :): 

&lt;code&gt;var(Message) EStackMode StackMode;                                  // Brutal hack!&lt;/code&gt;

wtf ''does'' this comment refer to xD?? I assume there's something fun you could do w/ the var in a mutator but I was introduced to LocalMessage about 10 minutes ago... :)

'''Wormbo:''' It probably refers to the way LocalMessages with the same PosY value are handled by HUD code, because that's when StackMode comes into play to prevent the messages from being drawn onto the same location on the HUD. Ideally the HUD would know a more sophisticated way for figuring out how to arrange overlapping LocalMessages, but it doesn't.

'''Guest:'''(TurkeyFromHell) LOL

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4068</id>
      <timestamp>2007-04-13T14:33:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; LocalMessage (Package: Engine)}}

LocalMessages are abstract classes which contain an array of [[Legacy:Localization|localized]] text. They can be used to display messages to players, either individually or globally.

The [[Legacy:PlayerController|PlayerController]] function ReceiveLocalizedMessage() is used to send messages to a specific player by specifying the LocalMessage class and index.  This allows the message to be localized on the client side, and saves network bandwidth since the text is not sent.  Actors (such as the [[Legacy:GameInfo|GameInfo]]) use one or more LocalMessage classes to send messages.  The [[Legacy:BroadcastHandler|BroadcastHandler]] function BroadcastLocalizedMessage() is used to broadcast localized messages to all the players. See [[Legacy:Using LocalMessages|Using LocalMessages]] for more.

''Also see [[Legacy:LocalMessage (UT)|LocalMessage (UT)]].''

==Properties ==
; bool bComplexString : Indicates a multicolor string message class. The HUD calls the RenderComplexMessage function to let the message render itself. This only works for string messages like Say, TeamSay or death messages. (bSpecial == False)
; bool bIsSpecial : If true, don't add to normal queue.
; bool bIsUnique : If true and special, only one can be in the HUD queue at a time.
; bool bIsPartiallyUnique : If true and special, only one can be in the HUD queue with the same switch value
; bool bIsConsoleMessage : If true, put a GetString on the console.
; bool bFadeMessage : If true, use fade out effect on message.
; bool bBeep : If true, beep!
; int Lifetime : Number of seconds to stay in HUD message queue.
; class&lt;LocalMessage&gt; ChildMessage : In some cases, we need to refer to a child message.
; Color DrawColor : Default draw color for this message.
; EDrawPivot DrawPivot : 
; EStackMode StackMode : Brutal hack! o_O
; float PosX, PosY : Default screen location.
; int FontSize : 0: Huge, 1: Big, 2: Small

==Enums ==

===EStackMode ===
; SM_None : 
; SM_Up : 
; SM_Down : 

==Methods ==

All LocalMessage methods are [[Legacy:Static Function|static function]]s and most of them return a value based on the Switch, zero to two [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s and maybe an optional [[Legacy:Object|Object]], so don't be suprised to see long function declaration lines here. ;)
; RenderComplexMessage ([[Legacy:Canvas|Canvas]] Canvas, out float XL, out float YL, optional String MessageString, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : 
; string GetRelatedString (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Returns the display string if for the player mentioned in RelatedPRI_1.
; string GetString (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Returns the display string for all other players.
; string AssembleString ([[Legacy:HUD|HUD]] myHUD, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional String MessageString) : 
; ClientReceive ([[Legacy:PlayerController|PlayerController]] P, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : 
; color GetConsoleColor ([[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1) : 
; color GetColor (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2) : Returns the draw color for the message.
; GetPos (int Switch, out EDrawPivot OutDrawPivot, out EStackMode OutStackMode, out float OutPosX, out float OutPosY) : Returns a draw position on the canvas for the message.
; int GetFontSize (int Switch, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI1, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI2, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] LocalPlayer) : 
; float GetLifeTime (int Switch) : 

==Known Subclasses ==
 LocalMessage
  +- [[Legacy:BulldogMessage|BulldogMessage]]
  +- [[Legacy:CTFHUDMessage|CTFHUDMessage]]
  |   +- [[Legacy:XBombHUDMessage|xBombHUDMessage]]
  +- [[Legacy:ComboMessage|ComboMessage]]
  +- [[Legacy:CriticalEventPlus|CriticalEventPlus]]
  |   +- [[Legacy:ActionMessage|ActionMessage]]
  |   |   +- [[Legacy:ActionMessage_BR|ActionMessage_BR]]
  |   |   +- [[Legacy:ActionMessage_CTF|ActionMessage_CTF]]
  |   |   +- [[Legacy:ActionMessage_DM|ActionMessage_DM]]
  |   |   +- [[Legacy:ActionMessage_DOM|ActionMessage_DOM]]
  |   |   +- [[Legacy:ActionMessage_SubTitle|ActionMessage_SubTitle]]
  |   +- [[Legacy:CTFMessage|CTFMessage]]
  |   +- [[Legacy:FirstBloodMessage|FirstBloodMessage]]
  |   +- [[Legacy:KillingSpreeMessage|KillingSpreeMessage]]
  |   +- [[Legacy:StartupMessage|StartupMessage]]
  |   +- [[Legacy:TimerMessage|TimerMessage]]
  |   +- [[Legacy:XBombMessage|xBombMessage]]
  +- [[Legacy:FailedConnect|FailedConnect]]
  +- [[Legacy:GameMessage|GameMessage]]
  +- [[Legacy:MultiKillMessage|MultiKillMessage]]
  +- [[Legacy:PickupMessagePlus|PickupMessagePlus]]
  +- [[Legacy:PlayerNameMessage|PlayerNameMessage]]
  +- [[Legacy:SpecialKillMessage|SpecialKillMessage]]
  +- [[Legacy:StringMessagePlus|StringMessagePlus]]
  |   +- [[Legacy:SayMessagePlus|SayMessagePlus]]
  |   +- [[Legacy:TeamSayMessagePlus|TeamSayMessagePlus]]
  +- [[Legacy:XDeathMessage|xDeathMessage]]
  +- [[Legacy:XDomMessage|xDomMessage]]
  +- [[Legacy:XKillerMessagePlus|xKillerMessagePlus]]
  +- [[Legacy:XVictimMessage|xVictimMessage]]

==Related Topics ==
* [[Legacy:Using LocalMessages|Using LocalMessages]]

==Discussion ==

'''Guest:''' (TurkeyFromHell) Hey I'm making this discussion section for one specific question :): 

&lt;code&gt;var(Message) EStackMode StackMode;                                  // Brutal hack!&lt;/code&gt;

wtf ''does'' this comment refer to xD?? I assume there's something fun you could do w/ the var in a mutator but I was introduced to LocalMessage about 10 minutes ago... :)

'''Wormbo:''' It probably refers to the way LocalMessages with the same PosY value are handled by HUD code, because that's when StackMode comes into play to prevent the messages from being drawn onto the same location on the HUD. Ideally the HUD would know a more sophisticated way for figuring out how to arrange overlapping LocalMessages, but it doesn't.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LocalMessage (UT)</title>
    <id>1686</id>
    <revision>
      <id>4168</id>
      <timestamp>2002-12-25T14:53:37Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>renamed</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; LocalMessage (Package: Engine)}}

A LocalMessage contains information about messages displayed on the [[Legacy:HUD (UT)|HUD (UT)]]. All LocalMessages used in UT and most mods are subclasses of [[Legacy:LocalMessagePlus|LocalMessagePlus]].

See [[Legacy:LocalMessage|LocalMessage]] for the UT2k3 version of this class.

==Properties ==
; bool bComplexString : Indicates a multicolor string message class.
; bool bIsSpecial : If true, don't add to normal queue.
; bool bIsUnique : If true and special, only one can be in the HUD queue at a time.
; bool bIsConsoleMessage : If true, put a GetString on the console.
; bool bFadeMessage : If true, use fade out effect on message.
; bool bBeep : If true, beep!
; bool bOffsetYPos : If the YPos indicated isn't where the message appears.
; int Lifetime : Number of seconds to stay in HUD message queue.
; class&lt;LocalMessage&gt; ChildMessage : In some cases, we need to refer to a child message.
; bool bFromBottom : Subtract YPos.
; color DrawColor : Color to display message with.
; float XPos, YPos : Coordinates to print message at.
; bool bCenter : Whether or not to center the message.

==Methods ==

All LocalMessage functions are static.
; RenderComplexMessage ([[Legacy:Canvas|Canvas]] Canvas, out float XL, out float YL, optional String MessageString, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : The message takes care of drawing itself from here.
; string GetString (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Returns the string to display on the HUD.
; string AssembleString ([[Legacy:HUD (UT)|HUD (UT)]] myHUD, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional String MessageString) : If the message is a string message this function returns the string to display.
; ClientReceive ([[Legacy:PlayerPawn|PlayerPawn]] P, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Adds the message to the HUD's message queue.
; color GetColor (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2) : Returns the color to draw this message in.
; float GetOffset (int Switch, float YL, float ClipY) : Returns the vertical position of the message based on the available height.
; int GetFontSize (int Switch) : Returns the font size of the message.

==Known Subclasses ==
* [[Legacy:LocalMessagePlus|LocalMessagePlus]]</text>
    </revision>
    <revision>
      <id>4169</id>
      <timestamp>2002-12-24T23:26:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>rename to &quot;LocalMessage (UT)&quot;, please</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; LocalMessage (Package: Engine)}}

A LocalMessage contains information about messages displayed on the [[Legacy:HUD (UT)|HUD (UT)]]. All LocalMessages used in UT and most mods are subclasses of [[Legacy:LocalMessagePlus|LocalMessagePlus]].

''See [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] for the UT2k3 version of this class.'' (Please correct this link after renaming the page. &amp;ndash; Wormbo)

==Properties ==
; bool bComplexString : Indicates a multicolor string message class.
; bool bIsSpecial : If true, don't add to normal queue.
; bool bIsUnique : If true and special, only one can be in the HUD queue at a time.
; bool bIsConsoleMessage : If true, put a GetString on the console.
; bool bFadeMessage : If true, use fade out effect on message.
; bool bBeep : If true, beep!
; bool bOffsetYPos : If the YPos indicated isn't where the message appears.
; int Lifetime : Number of seconds to stay in HUD message queue.
; class&lt;LocalMessage&gt; ChildMessage : In some cases, we need to refer to a child message.
; bool bFromBottom : Subtract YPos.
; color DrawColor : Color to display message with.
; float XPos, YPos : Coordinates to print message at.
; bool bCenter : Whether or not to center the message.

==Methods ==

All LocalMessage functions are static.
; RenderComplexMessage ([[Legacy:Canvas|Canvas]] Canvas, out float XL, out float YL, optional String MessageString, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : The message takes care of drawing itself from here.
; string GetString (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Returns the string to display on the HUD.
; string AssembleString ([[Legacy:HUD (UT)|HUD (UT)]] myHUD, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional String MessageString) : If the message is a string message this function returns the string to display.
; ClientReceive ([[Legacy:PlayerPawn|PlayerPawn]] P, optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2, optional [[Legacy:Object|Object]] OptionalObject) : Adds the message to the HUD's message queue.
; color GetColor (optional int Switch, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_1, optional [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] RelatedPRI_2) : Returns the color to draw this message in.
; float GetOffset (int Switch, float YL, float ClipY) : Returns the vertical position of the message based on the available height.
; int GetFontSize (int Switch) : Returns the font size of the message.

==Known Subclasses ==
* [[Legacy:LocalMessagePlus|LocalMessagePlus]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LocalMessagePlus</title>
    <id>1663</id>
    <revision>
      <id>4112</id>
      <timestamp>2002-09-07T18:48:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>font sizes</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:LocalMessage (UT)|LocalMessage (UT)]] &gt;&gt; LocalMessagePlus}}

The real base class of all kinds of messages displayed on the [[Legacy:HUD (UT)|HUD (UT)]].

==Properties ==
; color GreenColor, LightGreenColor, CyanColor :
; int FontSize : Relative font size. By default this value is returned by the GetFontSize function. (1 = Big, anything else = huge)

==Known subclasses ==
* [[Legacy:CriticalEventPlus|CriticalEventPlus]]
* [[Legacy:CTFMessage2|CTFMessage2]]
* [[Legacy:DeathMessagePlus|DeathMessagePlus]]
* [[Legacy:DecapitationMessage|DecapitationMessage]]
* [[Legacy:ItemMessagePlus|ItemMessagePlus]]
* [[Legacy:KillerMessagePlus|KillerMessagePlus]]
* [[Legacy:MultiKillMessage|MultiKillMessage]]
* [[Legacy:PickupMessagePlus|PickupMessagePlus]]
* [[Legacy:StringMessagePlus|StringMessagePlus]]
* [[Legacy:VictimMessage|VictimMessage]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Localization</title>
    <id>1653</id>
    <revision>
      <id>4092</id>
      <timestamp>2006-04-06T22:23:26Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">The Unreal engine supports language localizations (or localisations for the English amongst us) in a very straightforward and easy-to-use way.  If you [[Legacy:Variable Syntax|declare]] a string variable using the ''localized'' keyword, the engine will automatically look it up in the selected language's localization file, potentially falling back to the international language localization file first and the value declared in the [[Legacy:Default Properties|default properties]] at last.

The [http://unreal.epicgames.com/Localization.htm Localization page] on the [http://unreal.epicgames.com/ Unreal Technology site] explains all the technical aspects of language localization. Corrections and annotations to this document:

* The file extension and language code for German  is ''.det'', not ''.de''.  (Similar modifications apply to the other language codes; it's also ''.est'', not ''.esp'', and so on &amp;rarr; the last character always is a ''t''.)
* To switch to a different language, open UnrealTournament.ini and replace the language code in the line &quot;Language=int&quot; by the code you wish to use. If the localization file for the ''Core'' package is available and the ''Language'' value in the ''[Language]'' section is set you can also select the language in [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] -&gt; Drivers -&gt; Language.

==External Links==
* [[udn2:LocalizationReference]]
* [http://unreal.epicgames.com/Localization.htm Localization page] on the Unreal Technology site

==Related Topics==
* [[Legacy:INT File|INT File]]s
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]</text>
    </revision>
    <revision>
      <id>4093</id>
      <timestamp>2006-04-06T21:06:39Z</timestamp>
      <contributor>
        <ip>Host217-39-10-127.in-addr.btopenworld.com</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">The Unreal engine supports language localizations (or localisations for the English amongst us) in a very straightforward and easy-to-use way.  If you [[Legacy:Variable Syntax|declare]] a string variable using the ''localized'' keyword, the engine will automatically look it up in the selected language's localization file, potentially falling back to the international language localization file first and the value declared in the [[Legacy:Default Properties|default properties]] at last.

The [http://unreal.epicgames.com/Localization.htm Localization page] on the [http://unreal.epicgames.com/ Unreal Technology site] explains all the technical aspects of language localization. Corrections and annotations to this document:

* The file extension and language code for German  is ''.det'', not ''.de''.  (Similar modifications apply to the other language codes; it's also ''.est'', not ''.esp'', and so on &amp;rarr; the last character always is a ''t''.)
* To switch to a different language, open UnrealTournament.ini and replace the language code in the line &quot;Language=int&quot; by the code you wish to use. If the localization file for the ''Core'' package is available and the ''Language'' value in the ''[Language]'' section is set you can also select the language in [[Legacy:UnrealEd Advanced Options|UnrealEd Advanced Options]] -&gt; Drivers -&gt; Language.

==External Links==
* [[udn2:LocalizationReference]]
* [http://unreal.epicgames.com/Localization.htm Localization page] on the Unreal Technology site

==Related Topics==
* [[Legacy:INT File|INT File]]s
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]

----

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Localized</title>
    <id>1661</id>
    <revision>
      <id>4109</id>
      <timestamp>2003-12-10T17:28:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>redirected to Localization</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Localization|Localization]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LocationID</title>
    <id>1660</id>
    <revision>
      <id>4107</id>
      <timestamp>2003-07-10T23:06:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; LocationID (Package: Engine)}}

(Written &quot;locationid&quot; (all lowercase) in the [[Legacy:Actor Browser|actor browser]] even though it's declared as &quot;LocationID&quot; in the script.  Never mind that.)

A LocationID actor simply overrides a [[Legacy:ZoneInfo_(UT)|ZoneInfo_(UT)]]'s ZoneName property within a local volume. This is a sphere whose size is given by the Radius property; its [[Legacy:Collision Cylinder|collision cylinder]] plays no part.

Used for specifying a different name (which is displayed in the [[Legacy:ScoreBoard|ScoreBoard]] and when using the TeamSay command) for parts of a zone.

Using LocationIDs is advisable where using a [[Legacy:Zone|Zone]]'s ZoneName property isn't possible (in open areas where zoning doesn't make sense, for instance).  The downside of using a LocationID is that it takes the game up to two seconds to realize that a player has entered its radius, so the location info will lag a bit (most noticably when looking at the scoreboard).

Note: A great example of the use of this is CTF-LavaGiant, where all the ridges are named, despite each base being one large zone (actually two, upper and lower, but that is unrelated so I'm ignoring it ;-)).

==Properties ==
; LocationName : The name of this particular place.
; Radius : The size of this place specified as the radius of a sphere.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4108</id>
      <timestamp>2003-07-10T21:56:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor_(UT)|Actor_(UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; LocationID}}

(Written &quot;locationid&quot; (all lowercase) in the [[Legacy:Actor Browser|actor browser]] even though it's declared as &quot;LocationID&quot; in the script.  Never mind that.)

A LocationID actor simply overrides a [[Legacy:ZoneInfo_(UT)|ZoneInfo_(UT)]]'s ZoneName property within a local volume. This is a sphere whose size is given by the Radius property; its [[Legacy:Collision Cylinder|collision cylinder]] plays no part.

Used for specifying a different name (which is displayed in the [[Legacy:ScoreBoard|ScoreBoard]] and when using the TeamSay command) for parts of a zone.

Using LocationIDs is advisable where using a [[Legacy:Zone|Zone]]'s ZoneName property isn't possible (in open areas where zoning doesn't make sense, for instance).  The downside of using a LocationID is that it takes the game up to two seconds to realize that a player has entered its radius, so the location info will lag a bit (most noticably when looking at the scoreboard).

Note: A great example of the use of this is CTF-LavaGiant, where all the ridges are named, despite each base being one large zone (actually two, upper and lower, but that is unrelated so I'm ignoring it ;-)).

==Properties ==
; LocationName : The name of this particular place.
; Radius : The size of this place specified as the radius of a sphere.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LockedObjective</title>
    <id>1682</id>
    <revision>
      <id>4159</id>
      <timestamp>2005-11-22T19:12:43Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; LockedObjective}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:ProximityObjective|ProximityObjective]] &gt;&gt; LockedObjective (Package: UnrealGame)}}

A player must carry a [[Legacy:KeyInventory|KeyInventory]] with a certain [[Legacy:Tag|Tag]] in order to disable this Objective.

==Properties==

===Main===
; name KeyTag : Tag of KeyPickup which unlocks this objective

===Hidden===
; [[Legacy:KeyPickup|KeyPickup]] MyKey : The objective's KeyPickup

==Functions==
; FindKey() : AllActor search for the KeyPickup with a Tag matching KeyTag.
; bool TellBotHowToDisable( [[Legacy:Bot|Bot]] B ) : Tell bots what to do to disable me.  Return true if valid/useable instructions were given.  Bots will either a) find this Objective because they already have the key, b) follow the enemy bot who has the key or c) follow the route to the key after this actor calls FindKey().
; IsRelevant( [[Legacy:Pawn|Pawn]] Instigator, bool bAliveCheck ) : Will return false if DisableObjective is called from KeyInventory.Unlock().  This happens when the Objective is unlocked.

==Related Topics==
* [[Legacy:Mapping For AS (UT)|Mapping for AS (UT)]]
* [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
* [[Legacy:KeyInventory|KeyInventory]]
* [[Legacy:KeyPickup|KeyPickup]]

==Discussion==

'''SuperApe:''' Added functions, properties, UT2004 class hierarchy, related topics.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4160</id>
      <timestamp>2002-12-22T16:33:10Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; LockedObjective}}

A player must carry a [[Legacy:KeyPickup|KeyPickup]] with a certain [[Legacy:Tag|Tag]] in order to disable a '''LockedObjective'''.

==Editable Properties==

; name KeyTag : Name of the [[Legacy:KeyPickup|KeyPickup]]'s tag that unlocks this objective.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lode</title>
    <id>1655</id>
    <revision>
      <id>4096</id>
      <timestamp>2002-07-06T13:54:40Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">''the G.o.a.T'' : Hey there Lode, it's good to have you here :)
:''tarquin'': Lode is here? wow, cool! :-) All hail Lode, the reference genius!
:''the G.o.a.T'' : Hehe :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4097</id>
      <timestamp>2002-03-14T20:11:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''the G.o.a.T'' : Hey there Lode, it's good to have you here :)
:''tarquin'': Lode is here? wow, cool! :-) All hail Lode, the reference genius!</text>
    </revision>
    <revision>
      <id>4098</id>
      <timestamp>2002-03-15T15:06:09Z</timestamp>
      <contributor>
        <ip>The G.O.A.T</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''the G.o.a.T'' : Hey there Lode, it's good to have you here :)
:''tarquin'': Lode is here? wow, cool! :-) All hail Lode, the reference genius!
:''the G.o.a.T'' : Hehe :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Log File</title>
    <id>1738</id>
    <revision>
      <id>4275</id>
      <timestamp>2004-09-06T13:33:21Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">To open a log window, launch UT200x with the command line option &quot;-log&quot;.

==Writing to the log file==

The log file is generally the easiest and most straightforward of the writing functions. The log file is shared among all classes, and will be overwritten every time the game is started. In addition, no facility exists to read the log file from within Unrealscript, though it is easily readable with any text editor.

Note that writing to the log file actually writes to a buffer which is periodically written to the log file, so if the engine crashes with a GPF or similar error shortly after the log statement, it may not have made it into the actual log file. The engine will automatically write out anything left in the log buffer during a normal shutdown. To write to the log file, you can use one of two functions:

===Log===

&lt;uscript&gt;Log( ''Text'', ''Prefix'' );
&lt;/uscript&gt;

The log function takes two arguments, though the second argument is optional. The first argument is a string and is the text that will be written into the log. You can put any variable type in here, and the function will automatically cast it into a string for you. The second argument is the prefix you would like to have for your log message. The prefix is a '''name''' variable, not a string, so it should be enclosed in single quotes and cannot contain spaces. If you omit a prefix, the prefix will default to &lt;nowiki&gt;'ScriptLog'&lt;/nowiki&gt;.

===Warn===

&lt;uscript&gt;Warn( ''Text'' );
&lt;/uscript&gt;

The Warn function is similar to log, but cannot take a prefix and also automatically provides a bit of information about itself. It will list the name of the thing that called it as well as the function and line it was called from. It will even tell you which class it was that the warning was set in, so if you make a call to a superclasses function and that function generates a warning, it will include the name of the superclass instead of the subclass.

===Examples of Log and Warn===

The usage of Log and Warn is fairly straightforward, but some examples are provided here to help illustrate the description.

&lt;uscript&gt;
class SomeClass extends Interaction;

function LogSample()
{
  local int i;
  local string Example;

  log( &quot;First Message&quot; );
  log( &quot;Second Message&quot;, 'ExampleMsg' );
  warn( &quot;Third Message&quot; );

  Example = &quot;Iterating Message&quot;;

  for ( i=0;i&lt;5;i++ )
    log( Example$&quot; Number &quot;$I );
}
&lt;/uscript&gt;

The example function above would produce the following output in the log file:

 ScriptLog: First Message
 ExampleMsg: Second Message
 Warning: Someclass Package.InteractionMaster.SomeClass (Function SomeClass.LogSample:0048) Third Message
 ScriptLog: Iterating Message Number 0
 ScriptLog: Iterating Message Number 1
 ScriptLog: Iterating Message Number 2
 ScriptLog: Iterating Message Number 3
 ScriptLog: Iterating Message Number 4

If you want to write to the log file, but do not want to write into the same log file as everything else, you can use a [[Legacy:FileLog|FileLog]] instead, which allows you to specify a filename but requires a bit more work to use.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Log In</title>
    <id>1666</id>
    <revision>
      <id>4119</id>
      <timestamp>2008-02-15T08:11:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">==Welcome ==

This is the Unreal Wiki Log In page.  If you are new please read &quot;How this Wiki's Log In is Different&quot;. If you are moving from the old site there is a section near the bottom for you entitled &quot;Moving from the old site&quot;.

==Log In ==

Use this link if you already know how this Wiki's Log In works:

http://wiki.beyondunreal.com/wiki?action=login

===How this Wiki's Log In is Different ===

If you are new to this Wiki or to Wikis in general you ought to read this first, because there are differences from what you might be used to.  At some Wikis, many forums, and many bulletin boards, you need to create a username and password to make posts.  You use these to log in each time you visit the site.  On this Wiki you don't need to create a username or a password or even log in.  It is optional: posting anonymously is fine. You don't even have to have a username to create a personal page, but it is very helpful. We highly recommend you read &quot;Why should I have a Username?&quot; to see why you should consider using one.  It just makes things easier for everyone.

===Why should I have a Username? ===

Usernames serve a very important function.  They appear in the [[Legacy:Recent Changes|Recent Changes]] listings when a user updates a page.  This lets everyone know when a page has been updated and by whom.  Do you want to know when an author updates his tutorials? Do you want to to know when someone has responded to your post or contributed something to one of your pages?  Do you want to know when a page has been updated with the latest info from recent patches? These and many other ways of sorting data are all made much easier by people having usernames. Everything is still possible to track down without them, but would you rather hunt through dozens of anonymous changes page by page or simply consult [[Legacy:Recent Changes|Recent Changes]] to see what is going on?  

Getting or having a username doesn't require an email address or any personal information!  None of that is even asked for. Usernames are not even used for logging in. See &quot;Roaming IDs&quot; for more on this. 

===Setting your Username/Password ===

You can set a username/password by going to [http://wiki.beyondunreal.com/wiki?action=editprefs Preferences]. You might wish to note your user ID. Note that this does not mask your IP on [[Legacy:Recent Changes|Recent Changes]]: try hovering the mouse over any name there.

===Roaming IDs ===

The wiki system gives your browser a cookie with a user ID number. If you access the site from a different computer or browser though, or have cleared your cookies, the Wiki won't know who you are automatically.  If you have a user ID and password though, you can tell the wiki who you are, allowing you to use your personalized settings including a username if you have one. 

If you want to use your username and preferences across different machines and browsers, you'll need to Log In for each different machine. To do this you'll need to have your user ID and a password:

'''Question: Do cookies expire? Should we put advice to clear cookies on machines you no longer wish to have access if they do not expire?'''-Gith
# If you already have a username and/or password you can find your user ID by hovering your mouse pointer over your username on [[Legacy:Recent Changes|Recent Changes]]. 
# If you don't, you must set up a password (and a username if you want) by going to the [http://wiki.beyondunreal.com/wiki?action=editprefs Preferences] page. Note your '''user ID''' number (mail it to yourself or something).  You can also use the hover method mentioned above after you have saved your choices IF you chose a username.
# Having a username is not necessary but recommened for reasons outlined above. 
# On any other computer you wish to log in from, go to http://wiki.beyondunreal.com/wiki?action=login and enter your '''user ID''' and password.

You will now be able to post as yourself from the new location, as well as use your preferences, etc. 

===Moving from the old site ===

(Unreal Wiki moved URLs around February 2002. This information is still here in case someone hasn't moved across yet, which is doubtful but possible)

* If you know your ID number and password, log in at the above link.
* You can email Tarquin for your password and ID number.
* You can just go to [http://wiki.beyondunreal.com/wiki?action=editprefs Preferences] and re-enter your name. You'll get a fresh user number.</text>
    </revision>
    <revision>
      <id>4120</id>
      <timestamp>2008-02-14T22:13:16Z</timestamp>
      <contributor>
        <ip>Dsl88-244-13102.ttnet.net.tr</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;

&lt;!&amp;ndash; saved from url=(0014)about:internet &amp;ndash;&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta name=&quot;generator&quot; content=&quot;Web Page Maker V2&quot;&gt;

&lt;/head&gt;

&lt;style type=&quot;text/css&quot;&gt;

/*----------Text Styles----------*/

.ws6 {font-size: 8px;}

.ws7 {font-size: 9.3px;}

.ws8 {font-size: 11px;}

.ws9 {font-size: 12px;}

.ws10 {font-size: 13px;}

.ws11 {font-size: 15px;}

.ws12 {font-size: 16px;}

.ws14 {font-size: 19px;}

.ws16 {font-size: 21px;}

.ws18 {font-size: 24px;}

.ws20 {font-size: 27px;}

.ws22 {font-size: 29px;}

.ws24 {font-size: 32px;}

.ws26 {font-size: 35px;}

.ws28 {font-size: 37px;}

.ws36 {font-size: 48px;}

.ws48 {font-size: 64px;}

.ws72 {font-size: 96px;}

.wpmd {font-size: 13px;font-family: 'Arial';font-style: normal;font-weight: normal;}

/*----------Para Styles----------*/

DIV,UL,OL /* Left */

{
 margin-top: 0px;
 margin-bottom: 0px;

}
&lt;/style&gt;

&lt;body background=&quot;http://img179.imageshack.us/img179/9726/bbbbbbbtm7.jpg&quot;&gt;

&lt;/body&gt;

&lt;/html&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Log Interaction</title>
    <id>1757</id>
    <revision>
      <id>4312</id>
      <timestamp>2006-11-06T15:22:06Z</timestamp>
      <contributor>
        <ip>Shambler</ip>
      </contributor>
      <comment>* Added page with debug helper class</comment>
      <text xml:space="preserve">'''Shambler:''' Got fed up of using the log window to debug stuff so made this real quick....basically this code will allow you to display log info on the HUD ingame and there are a number of ways you can format it to stand out.

Posting it on the wiki for others who may find use in it.
:&lt;wiki&gt;[[Image:Legacy_pgDebugLog.jpeg|]]

==How to use it==

Create a mutator like this one:

&lt;uscript&gt;
Class pgPortalGunMut extends Mutator;

function ModifyPlayer(Pawn Other)
{
	local int i;

	// Debug
	if (Other.Controller != none &amp;&amp; PlayerController(Other.Controller) != none &amp;&amp; PlayerController(Other.Controller).Player != none
		&amp;&amp; PlayerController(Other.Controller).Player.InteractionMaster != none)
	{
		for (i=0; i&lt;PlayerController(Other.Controller).Player.LocalInteractions.Length; ++i)
		{
			if (MathDebugInteraction(PlayerController(Other.Controller).Player.LocalInteractions[i]) != none)
			{
				bSkip = True;
				break;
			}
		}

		if (!bSkip)
			PlayerController(Other.Controller).Player.InteractionMaster.AddInteraction(string(Class'MathDebugInteraction'), PlayerController(Other.Controller).Player);
	}

	Super.ModifyPlayer(Other);
}

function Mutate(string MutateString, PlayerController Sender)
{
	local int i;

	if (MutateString ~= &quot;pgToggleDebug&quot;)
	{
		if (Sender.Player != none &amp;&amp; Sender.Player.InteractionMaster != none)
		{
			for (i=0; i&lt;Sender.Player.LocalInteractions.Length; ++i)
			{
				if (MathDebugInteraction(Sender.Player.LocalInteractions[i]) != none)
				{
					MathDebugInteraction(Sender.Player.LocalInteractions[i]).ToggleDebug();
					break;
				}
			}
		}
	}
	else
	{
		Super.Mutate(MutateString, Sender);
	}
}
&lt;/uscript&gt;

Add some debugging code to the class you want to debug

&lt;uscript&gt;
Class SomeClass extends SomeActor;

var MathDebugInteraction ActiveDebug;
var int FireMode; // This isn't important

function SomeFunction()
{
	local float XDot, ZDot, ZAxisDiff, ClockX, ClockZ, DiffClockZ, ClockTest;


	// Do stuff with these variables
	XDot = Blah;
	ZDot = Blah;
	ZAxisDiff = Blah;
	ClockX = Blah;
	ClockZ = Blah;
	ClockTest = Blah;
	DiffClockZ = Blah;



	// Log stuff to display on screen (shown in picture)


	// Format of the LogString function: (copied here for reference)

	// function LogString(string Info, optional color StringColor, optional bool bUseColor, optional bool bUnderline, optional color HighlightColor, optional bool bDontEndLine)
	// Parameter 1: The string you want to log
	// Parameter 2: The colour of the logstring
	// Parameter 3: Pass in True if you put in a colour for parameter 2 (I should change this but cba)
	// Parameter 4: Underline the text if True is passed in
	// Parameter 5: If you pass a colour in (with an Alpha greater than 0) then the text is highlighted with that colour
	// Parameter 6: If you want the next log string to write on the same line, pass in True here




	// I want to rewrite the log info every tick, so check the timestamp on the debug object...if its 'out of date', use EmptyList to wipe the log data (specifying a new timestamp)
	if (ActiveDebug.LogTimestamp != Level.TimeSeconds)
	{
		ActiveDebug.EmptyList(Level.TimeSeconds);

		// The command to turn this off is detailed in the mutator class
		ActiveDebug.LogString(&quot;To disable this text type: &quot;, Class'Canvas'.static.MakeColor(0,255,0,255), True,,,True);
		ActiveDebug.LogString(&quot;Mutate pgToggleDebug&quot;, Class'Canvas'.static.MakeColor(0,255,0,255), True, True);
		ActiveDebug.LogString(&quot;&quot;);
	}


	if (FireMode == 0)
		ActiveDebug.LogString(&quot;Portal&quot;@FireMode, Class'Canvas'.static.MakeColor(255,255,255,255), True, True, Class'Canvas'.static.MakeColor(0,128,255));
	else
		ActiveDebug.LogString(&quot;Portal&quot;@FireMode, Class'Canvas'.static.MakeColor(255,255,255,255), True, True, Class'Canvas'.static.MakeColor(255,128,0));


	ActiveDebug.LogString(&quot;XDot&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot;(XY Axis change) is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(XDot),,,, Class'Canvas'.static.MakeColor(0,255,255,64), True);
	ActiveDebug.LogString(&quot; or &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(ACos(XDot) * 57.295779)$&quot;º&quot;,,,, Class'Canvas'.static.MakeColor(255,255,0,64));

	ActiveDebug.LogString(&quot;ZDot&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot;(Z Axis change) is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(ZDot),,,, Class'Canvas'.static.MakeColor(0,255,255,64), True);
	ActiveDebug.LogString(&quot; or &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(ACos(ZDot) * 57.295779)$&quot;º&quot;,,,, Class'Canvas'.static.MakeColor(255,255,0,64));

	ActiveDebug.LogString(&quot;ZAxisDiff&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot;(Portal Up-Axis offset) is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(ZAxisDiff),,,, Class'Canvas'.static.MakeColor(0,255,255,64), True);
	ActiveDebug.LogString(&quot; or &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(ACos(ZAxisDiff) * 57.295779)$&quot;º&quot;,,,, Class'Canvas'.static.MakeColor(255,255,0,64));

	ActiveDebug.LogString(&quot;ClockX&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot;(XDot/Yaw clockwise?) is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(bool(ClockX)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

	ActiveDebug.LogString(&quot;ClockZ&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot;(ZDot/Pitch clockwise?) is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(bool(ClockZ)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

	ActiveDebug.LogString(&quot;DiffClockZ&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot; is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(bool(DiffClockZ)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

	ActiveDebug.LogString(&quot;ClockTest&quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
	ActiveDebug.LogString(&quot;(ZDot/Roll clockwise?) is: &quot;, Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
	ActiveDebug.LogString(string(bool(ClockTest)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

	ActiveDebug.LogString(&quot;&quot;);
}
&lt;/uscript&gt;

And put this in a .uc file in with your source, modify the 'foreach' loop on line 45 so you can 'attach' (i.e. put a reference to) the interaction in the class you want to debug.

&lt;uscript&gt;
// An interaction to help me debug problems with the portal gun math
Class MathDebugInteraction extends Interaction;

struct LogElement
{
	var string LogString;
	var color StringColor;
	var bool bUnderline;
	var color HighlightColor;
	var bool bDontEndLine;
};

var array&lt;LogElement&gt; LogList;
var int ListSpacing;
var color ListColor;
var font ListFont;
var float ListX, ListY, FontY, FontScale, LogTimestamp;
var bool bInitialSetup;

var bool bDisableDebug;


function ToggleDebug()
{
	bDisableDebug = !bDisableDebug;

	if (bDisableDebug)
		EmptyList();
}

function PostRender(canvas Canvas)
{
	local pgPortalDecal PD;
	local int i;
	local float LenX, LenY, LastX, LastY;

	/*
	EmptyList();
	LogString(&quot;Arf, testing&quot;);
	LogString(&quot;Wewt, testing2&quot;, Canvas.MakeColor(255,255,255,255), True, True,,True);
	LogString(&quot;AMG TEST&quot;,,,True,Canvas.MakeColor(0,255,0,128));
	LogString(&quot;FEYNAL TEST!!&quot;);
	*/

	if (ViewportOwner != none &amp;&amp; ViewportOwner.Actor != none &amp;&amp; ViewportOwner.Actor.Pawn != none &amp;&amp; xPawn(ViewportOwner.Actor.Pawn) != none)
		foreach ViewportOwner.Actor.DynamicActors(Class'pgPortalDecal', PD)
			if (PD.Owner == ViewportOwner.Actor/* &amp;&amp; PD.FireMode == 0*/ &amp;&amp; PD.ActiveDebug != self)
				PD.ActiveDebug = self;


	if (LogList.Length == 0)
		return;


	// ListX and ListY in default properties tell the code where to start drawing (between 0.0 and 1.0), FontScale determines the size of font with changing screen size
	if (!bInitialSetup)
	{
		ListX = Canvas.ClipX * ListX;
		ListY = Canvas.ClipY * ListY;
		FontScale = Canvas.ClipX * FontScale;

		bInitialSetup = True;
	}


	Canvas.Reset();


	// Setup stored variables
	Canvas.Font = ListFont;

	Canvas.Style = 5;

	Canvas.CurX = ListX;
	Canvas.CurY = ListY;
	Canvas.FontScaleX = FontScale;
	Canvas.FontScaleY = FontScale;

	Canvas.DrawColor = ListColor;

	if (FontY == 0)
		Canvas.StrLen(&quot;X&quot;, FontY, FontY);


	// Draw the list
	for (i=0; i&lt;LogList.Length; ++i)
	{
		if (Canvas.CurY &lt; Canvas.ClipY &amp;&amp; Canvas.CurX &lt; Canvas.ClipX &amp;&amp; LogList[i].LogString != &quot;&quot;)
		{
			LastX = Canvas.CurX;
			LastY = Canvas.CurY;

			Canvas.StrLen(LogList[i].LogString, LenX, LenY);

			// Manage highlighting
			if (LogList[i].HighlightColor.A != 0)
			{
				Canvas.DrawColor = LogList[i].HighlightColor;
				Canvas.DrawRect(Texture'WhiteTexture', Min(LenX, Canvas.ClipX - Canvas.CurX), FontY);
				Canvas.CurX = LastX;
				Canvas.CurY = LastY;
			}

			// Setup the color
			Canvas.DrawColor = LogList[i].StringColor;

			// Manage underlining
			if (LogList[i].bUnderline)
			{
				Canvas.CurY += FontY;
				Canvas.DrawRect(Texture'WhiteTexture', Min(LenX, Canvas.ClipX - Canvas.CurX), FontScale);
				Canvas.CurX = LastX;
				Canvas.CurY = LastY;
			}

			Canvas.DrawTextClipped(LogList[i].LogString);


			Canvas.CurX += Min(LenX, Canvas.ClipX - Canvas.CurX);
		}


		// Endline
		if (!LogList[i].bDontEndLine)
		{
			Canvas.CurX = ListX;
			Canvas.CurY += ListSpacing + FontY;
		}
	}

	Canvas.Reset();
}

function EmptyList(optional float NewTimestamp)
{
	LogList.Length = 0;

	if (NewTimestamp != 0.0)
		LogTimestamp = NewTimestamp;
}


// LogString parameters:
// Parameter 1: The string you want to log
// Parameter 2: The colour of the logstring
// Parameter 3: Pass in True if you put in a colour for parameter 2 (I should change this but cba)
// Parameter 4: Underline the text if True is passed in
// Parameter 5: If you pass a colour in (with an Alpha greater than 0) then the text is highlighted with that colour
// Parameter 6: If you want the next log string to write on the same line, pass in True here

function LogString(string Info, optional color StringColor, optional bool bUseColor, optional bool bUnderline, optional color HighlightColor, optional bool bDontEndLine)
{
	if (bDisableDebug)
		return;

	LogList.Length = LogList.Length + 1;

	LogList[LogList.Length-1].LogString = Info;


	if (bUseColor)
		LogList[LogList.Length-1].StringColor = StringColor;
	else
		LogList[LogList.Length-1].StringColor = ListColor;


	LogList[LogList.Length-1].bUnderline = bUnderline;
	LogList[LogList.Length-1].HighlightColor = HighlightColor;
	LogList[LogList.Length-1].bDontEndLine = bDontEndLine;
}

defaultproperties
{
	bVisible=True


	ListX=0.5625
	ListY=0.125
	ListSpacing=5
	ListColor=(R=255,G=0,B=0,A=255)
	ListFont=DefaultFont
	FontScale=0.00125
}
&lt;/uscript&gt;

'''Shambler:''' Feel free to reformat the page, just keep all the code as it is ;) (I may update it later)</text>
    </revision>
    <revision>
      <id>4313</id>
      <timestamp>2006-11-06T14:51:50Z</timestamp>
      <contributor>
        <ip>Shambler</ip>
      </contributor>
      <minor/>
      <comment>arf</comment>
      <text xml:space="preserve">Shambler: Placeholder for a page I'm bout to add</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Log Warning</title>
    <id>1737</id>
    <revision>
      <id>4274</id>
      <timestamp>2004-09-06T09:24:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Log Warnings]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Log Warnings|Log Warnings]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Log Warnings</title>
    <id>1684</id>
    <revision>
      <id>4164</id>
      <timestamp>2006-03-14T07:24:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There are two groups of log warnings, native warnings and script warnings. Script warnings can be generated manually from [[Legacy:UnrealScript|UnrealScript]] through the &lt;code&gt;Warn&lt;/code&gt; function.

==Script Warnings==

Script warnings generally have the following structure in Unreal/[[Legacy:UT|UT]]:
 ScriptWarning: ''&lt;name&gt;'' ''&lt;object&gt;'' (''Function/State'' ''&lt;function or state name&gt;'':''&lt;adress&gt;'') ''&lt;text&gt;''

In [[Legacy:UT2003|UT2003]] script warnings begin with &quot;Warning:&quot; like the native warnings described in the next section but still contain name, object, function, etc.

; &lt;name&gt; : The class name of the object the warning was generated for.
; &lt;object&gt; : The name of the object (complete name with package) the warning was generated for.
; Function/State : ''Function'' if the problem occured in function code, ''State'' if the problem occured in state code.
; &lt;function or state name&gt; : The name of the function or state (with names of the state, class and package) that caused the warning. This refers to the actual function/state name the problem occured in. Note that this could also point to a parent class of the actual class or the parent state of the actual state.
; &lt;adress&gt; : This is an internal hexadecimal adress and isn't helpful with finding the actual line the warning was generated for.
; &lt;text&gt; : A description of the problem. (see below)

Script warnings don't include information about which function called the function that caused the warning. You have to figure that out yourself.

===Descriptions===
; Accessed None : 
Probably the most common error message in the log file. This error occurs whenever lines like

&lt;uscript&gt;
Owner.SetPhysics(PHYS_Falling);
i = Owner.LifeSpan;
&lt;/uscript&gt;

are executed and ''Owner'' is set to ''None''.

; Attempt to assigned variable through None : 
This is less common and always shows up together with an ''Accessed None'' warning. If you get this warning look for a line like

&lt;uscript&gt;
Owner.LightType = newLightType;
&lt;/uscript&gt;

in the code and check ''Owner''.

'''Note''': First there's the ''Accessed None'' warning (for accessing ''None.LightType'')

; Accessed null class context : 
This error occurs whenever the default value of a class variable is accessed while the class reference is ''None''. If you get this kind of error look for something like&lt;uscript&gt;
x = aClass.default.Property;
&lt;/uscript&gt;

in your code and check why ''aClass'' is ''None''.


; Accessed array '&lt;i&gt;variable name&lt;/i&gt;' out of bounds (&lt;i&gt;index&lt;/i&gt;/&lt;i&gt;length&lt;/i&gt;) : This warning is generated when you try to access elements of a static or dynamic array with an index greater or equal its length or less than zero.

==Native Warnings==

Native warnings don't have a special structure except that they usually begin with &quot;&lt;code&gt;Warning:&lt;/code&gt;&quot; followed by the warning message. However, not all lines beginning with &quot;&lt;code&gt;Warning:&lt;/code&gt;&quot; actually signal problems, some of those are just status messages. (These are described at the end of this page.)

; Failed to load 'NULL'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't resolve package name&lt;br /&gt;Failed to load '&lt;i&gt;object class&lt;/i&gt; None.&lt;i&gt;object name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't resolve package name : These two lines appear together and are caused by the &lt;code&gt;DynamicLoadObject&lt;/code&gt; function when trying to load an object from a non-existing package. ''Object class'' is the class specified as second parameter of &lt;code&gt;DynamicLoadObject&lt;/code&gt; and could be e.g. &quot;Class&quot;, &quot;Texture&quot; or &quot;Sound&quot;. ''Object name'' is the actual name of the object that should be loaded. Note that the object's package name is set to &quot;None&quot; because the package could not be loaded. (which caused the first warning)
; Failed to load '&lt;i&gt;package name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Package '&lt;i&gt;package name&lt;/i&gt;' version mismatch : The client and server version of the package are different, i.e. one isn't an exact copy of the other. This can be bypassed in UT (not UT2003) by network-conforming the package, but you should first make sure that client and server still understand each other.

; SpawnActor failed because no class was specified
; SpawnActor failed because class &lt;i&gt;classname&lt;/i&gt; is abstract
; SpawnActor failed because &lt;i&gt;classname&lt;/i&gt; is not an actor class
; SpawnActor failed because class &lt;i&gt;classname&lt;/i&gt; has bStatic or bNoDelete : An object of the specified class could not be spawned. You can only spawn actor classes that are ''not'' abstract (see [[Legacy:Class Syntax|Class Syntax]]) and have neither bStatic nor bNoDelete set to True.

; RPC bunch overflow : The engine tried to send a network packet larger than 500 bytes.   There are two ways to end up with an overstuffed packet - too many replicated function calls (or &lt;b&gt;R&lt;/b&gt;emote &lt;b&gt;P&lt;/b&gt;rocedure &lt;b&gt;C&lt;/b&gt;all) in a single tick, or a property that is being replicated has a value larger than 500 bytes.  You are sure you don't have any properties that are that large, you say?  Here are some caveats of &lt;i&gt;atomic&lt;/i&gt; replication that you may not know:
;* Static arrays are replicated atomically.  If you change the value of one member of your replicated static array of 10 strings, all 10 strings will be replicated.  Ergo the size of your entire static array must be smaller than 500 bytes.
;* Structs are replicated atomically.  When any value in a replicated struct is changed, the entire struct is replicated.
;* Parameters for replicated function calls must all be replicated in the same packet.  If you have a replicated function call that takes multiple parameters, the cumulative size of all parameters cannot be larger than ~500 bytes.

; Localization&lt;nowiki&gt;:&lt;/nowiki&gt; No localization&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;property&lt;/i&gt; (&lt;i&gt;type&lt;/i&gt;) : This warning means, that the &lt;code&gt;Localize&lt;/code&gt; function couldn't find the specified entry in the language file of the given package. ''Property'' is the name of a property with the desired package and section name. ''Type'' is the requested data type, e.g. int, string, etc.

===Harmless Log Lines===

Log file lines which begin with &lt;code&gt;Warning:&lt;/code&gt; but aren't real warnings.
; Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 0&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 1&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 2&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 3&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Total&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs : These lines just indicate that a downloaded package is being decompressed.

==Related Topics==
* [[Legacy:Compiler Errors|Compiler Errors]]
* [[Legacy:Special UnrealScript Keywords|Special UnrealScript Keywords]]

==Discussion==

'''Mychaeel:''' Evolution writes:

{{innerbox| Static arrays are replicated atomically.  If you change the value of one member of your replicated static array of 10 strings, all 10 strings will be replicated.  Ergo the size of your entire static array must be smaller than 500 bytes.

}}

However, Tim Sweeney writes in [http://unreal.epicgames.com/Network.htm Networking Architecture]:

{{innerbox| Arrays are replicated efficiently; if a single element of a large array changes, only that element is sent.

}}

So &amp;ndash; what's the deal?

'''Wormbo:''' We had a discussion about that on IRC already and we're not really sure. Evolution has this information from Steve Polge. However, Pfhoenix also thinks it's the way Tim Sweeney described it and I did a little testing with an array that ''should'' exceed the magical 500 bytes limit (a static array with a length of 128 consisting of structs with one string and one integer value; integers are 4 bytes, aren't they?) and it replicated without problems or log messages.

'''Evolution:''' Yeah but what does Tim Sweeney know?  :)

'''Wormbo:''' Obviously he knows more about array replication than Mr. Polge. Even an array with 512 elements (that's definately more than 500 bytes) replicated fine.

'''El Muerte TDS:''' why 500 bytes?

'''Evolution:''' I'll verify all this in a few days, at which point I'll remove these comments;  most likely it was just a brain fart on Steve's part.

'''EricBlade:''' Not sure if anyone ever figured this one out, but I think it's dynamic arrays that are replicated efficiently, and static arrays are not.  And it is possible that newer engines may have had some of these restrictions eased/removed.

'''Wormbo:''' Not for UT2004 &amp;ndash; dynamic arrays aren't replicated at all and static arrays are considered as individual variables for replication.

[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4165</id>
      <timestamp>2006-03-14T05:52:13Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There are two groups of log warnings, native warnings and script warnings. Script warnings can be generated manually from [[Legacy:UnrealScript|UnrealScript]] through the &lt;code&gt;Warn&lt;/code&gt; function.

==Script Warnings==

Script warnings generally have the following structure in Unreal/[[Legacy:UT|UT]]:
 ScriptWarning: ''&lt;name&gt;'' ''&lt;object&gt;'' (''Function/State'' ''&lt;function or state name&gt;'':''&lt;adress&gt;'') ''&lt;text&gt;''

In [[Legacy:UT2003|UT2003]] script warnings begin with &quot;Warning:&quot; like the native warnings described in the next section but still contain name, object, function, etc.

; &lt;name&gt; : The class name of the object the warning was generated for.
; &lt;object&gt; : The name of the object (complete name with package) the warning was generated for.
; Function/State : ''Function'' if the problem occured in function code, ''State'' if the problem occured in state code.
; &lt;function or state name&gt; : The name of the function or state (with names of the state, class and package) that caused the warning. This refers to the actual function/state name the problem occured in. Note that this could also point to a parent class of the actual class or the parent state of the actual state.
; &lt;adress&gt; : This is an internal hexadecimal adress and isn't helpful with finding the actual line the warning was generated for.
; &lt;text&gt; : A description of the problem. (see below)

Script warnings don't include information about which function called the function that caused the warning. You have to figure that out yourself.

===Descriptions===
; Accessed None : 
Probably the most common error message in the log file. This error occurs whenever lines like

&lt;uscript&gt;
Owner.SetPhysics(PHYS_Falling);
i = Owner.LifeSpan;
&lt;/uscript&gt;

are executed and ''Owner'' is set to ''None''.

; Attempt to assigned variable through None : 
This is less common and always shows up together with an ''Accessed None'' warning. If you get this warning look for a line like

&lt;uscript&gt;
Owner.LightType = newLightType;
&lt;/uscript&gt;

in the code and check ''Owner''.

'''Note''': First there's the ''Accessed None'' warning (for accessing ''None.LightType'')

; Accessed null class context : 
This error occurs whenever the default value of a class variable is accessed while the class reference is ''None''. If you get this kind of error look for something like&lt;uscript&gt;
x = aClass.default.Property;
&lt;/uscript&gt;

in your code and check why ''aClass'' is ''None''.


; Accessed array '&lt;i&gt;variable name&lt;/i&gt;' out of bounds (&lt;i&gt;index&lt;/i&gt;/&lt;i&gt;length&lt;/i&gt;) : This warning is generated when you try to access elements of a static or dynamic array with an index greater or equal its length or less than zero.

==Native Warnings==

Native warnings don't have a special structure except that they usually begin with &quot;&lt;code&gt;Warning:&lt;/code&gt;&quot; followed by the warning message. However, not all lines beginning with &quot;&lt;code&gt;Warning:&lt;/code&gt;&quot; actually signal problems, some of those are just status messages. (These are described at the end of this page.)

; Failed to load 'NULL'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't resolve package name&lt;br /&gt;Failed to load '&lt;i&gt;object class&lt;/i&gt; None.&lt;i&gt;object name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Can't resolve package name : These two lines appear together and are caused by the &lt;code&gt;DynamicLoadObject&lt;/code&gt; function when trying to load an object from a non-existing package. ''Object class'' is the class specified as second parameter of &lt;code&gt;DynamicLoadObject&lt;/code&gt; and could be e.g. &quot;Class&quot;, &quot;Texture&quot; or &quot;Sound&quot;. ''Object name'' is the actual name of the object that should be loaded. Note that the object's package name is set to &quot;None&quot; because the package could not be loaded. (which caused the first warning)
; Failed to load '&lt;i&gt;package name&lt;/i&gt;'&lt;nowiki&gt;:&lt;/nowiki&gt; Package '&lt;i&gt;package name&lt;/i&gt;' version mismatch : The client and server version of the package are different, i.e. one isn't an exact copy of the other. This can be bypassed in UT (not UT2003) by network-conforming the package, but you should first make sure that client and server still understand each other.

; SpawnActor failed because no class was specified
; SpawnActor failed because class &lt;i&gt;classname&lt;/i&gt; is abstract
; SpawnActor failed because &lt;i&gt;classname&lt;/i&gt; is not an actor class
; SpawnActor failed because class &lt;i&gt;classname&lt;/i&gt; has bStatic or bNoDelete : An object of the specified class could not be spawned. You can only spawn actor classes that are ''not'' abstract (see [[Legacy:Class Syntax|Class Syntax]]) and have neither bStatic nor bNoDelete set to True.

; RPC bunch overflow : The engine tried to send a network packet larger than 500 bytes.   There are two ways to end up with an overstuffed packet - too many replicated function calls (or &lt;b&gt;R&lt;/b&gt;emote &lt;b&gt;P&lt;/b&gt;rocedure &lt;b&gt;C&lt;/b&gt;all) in a single tick, or a property that is being replicated has a value larger than 500 bytes.  You are sure you don't have any properties that are that large, you say?  Here are some caveats of &lt;i&gt;atomic&lt;/i&gt; replication that you may not know:
;* Static arrays are replicated atomically.  If you change the value of one member of your replicated static array of 10 strings, all 10 strings will be replicated.  Ergo the size of your entire static array must be smaller than 500 bytes.
;* Structs are replicated atomically.  When any value in a replicated struct is changed, the entire struct is replicated.
;* Parameters for replicated function calls must all be replicated in the same packet.  If you have a replicated function call that takes multiple parameters, the cumulative size of all parameters cannot be larger than ~500 bytes.

; Localization&lt;nowiki&gt;:&lt;/nowiki&gt; No localization&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;property&lt;/i&gt; (&lt;i&gt;type&lt;/i&gt;) : This warning means, that the &lt;code&gt;Localize&lt;/code&gt; function couldn't find the specified entry in the language file of the given package. ''Property'' is the name of a property with the desired package and section name. ''Type'' is the requested data type, e.g. int, string, etc.

===Harmless Log Lines===

Log file lines which begin with &lt;code&gt;Warning:&lt;/code&gt; but aren't real warnings.
; Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 0&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 1&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 2&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; stage 3&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs&lt;br /&gt;Warning&lt;nowiki&gt;:&lt;/nowiki&gt; Total&lt;nowiki&gt;:&lt;/nowiki&gt; &lt;i&gt;number&lt;/i&gt; secs : These lines just indicate that a downloaded package is being decompressed.

==Related Topics==
* [[Legacy:Compiler Errors|Compiler Errors]]
* [[Legacy:Special UnrealScript Keywords|Special UnrealScript Keywords]]

==Discussion==

'''Mychaeel:''' Evolution writes:

{{innerbox| Static arrays are replicated atomically.  If you change the value of one member of your replicated static array of 10 strings, all 10 strings will be replicated.  Ergo the size of your entire static array must be smaller than 500 bytes.

}}

However, Tim Sweeney writes in [http://unreal.epicgames.com/Network.htm Networking Architecture]:

{{innerbox| Arrays are replicated efficiently; if a single element of a large array changes, only that element is sent.

}}

So &amp;ndash; what's the deal?

'''Wormbo:''' We had a discussion about that on IRC already and we're not really sure. Evolution has this information from Steve Polge. However, Pfhoenix also thinks it's the way Tim Sweeney described it and I did a little testing with an array that ''should'' exceed the magical 500 bytes limit (a static array with a length of 128 consisting of structs with one string and one integer value; integers are 4 bytes, aren't they?) and it replicated without problems or log messages.

'''Evolution:''' Yeah but what does Tim Sweeney know?  :)

'''Wormbo:''' Obviously he knows more about array replication than Mr. Polge. Even an array with 512 elements (that's definately more than 500 bytes) replicated fine.

'''El Muerte TDS:''' why 500 bytes?

'''Evolution:''' I'll verify all this in a few days, at which point I'll remove these comments;  most likely it was just a brain fart on Steve's part.

'''EricBlade:''' Not sure if anyone ever figured this one out, but I think it's dynamic arrays that are replicated efficiently, and static arrays are not.  And it is possible that newer engines may have had some of these restrictions eased/removed.

[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LookTarget</title>
    <id>1729</id>
    <revision>
      <id>4257</id>
      <timestamp>2004-03-29T08:56:43Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; LookTarget}}

A convenience actor that you can point a [[Legacy:Matinee|Matinee]] camera at.  Isn't &lt;code&gt;bStatic&lt;/code&gt; so you can attach these to movers and such.

==Related Topics==

* [[Legacy:Matinee|Matinee]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4258</id>
      <timestamp>2004-03-28T14:46:46Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint|Keypoint]] &gt;&gt; LookTarget}}

A convenience actor that you can point a [[Legacy:Matinee|Matinee]] camera at.  Isn't &lt;code&gt;bStatic&lt;/code&gt; so you can attach these to movers and such.

==Related Topics==

* [[Legacy:Matinee|Matinee]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LoopMover</title>
    <id>28482</id>
    <revision>
      <id>40183</id>
      <timestamp>2009-11-17T10:55:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lost Secrets Of Na Pali</title>
    <id>1760</id>
    <revision>
      <id>4318</id>
      <timestamp>2008-01-04T02:55:09Z</timestamp>
      <contributor>
        <ip>Shadow</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About/Overview==

Lost Secrets of Na Pali (short: LSoNP) was a huge UT99 Total Conversion that contained everything new to UT: new models, high-res textures, new technoligies (bloom, distance fog, particle system, physic engine), rpg style gaming, non-linear gameplay, own exe, own menu, own hud, own loadscreens....

{|

|-
|Mod-Name
|Lost Secrets of Na Pali (or LSoNP)
|-
|Game
|UnrealTournament v436
|-
|Genres
|First Person Shooter, Adventure, RPG, Space Simulator
|-
|Theme
|Sci-Fi, Fantasy, Apocalyptic, Horror
|-
|Players
|Singleplayer, Multiplayer/Coop
|-
|New Sounds
|yes
|-
|New Music
|yes
|-
|New Textures
|yes, too many..
|-
|New Maps
|yes, too many
|-
|New Code
|oh.. ur yes
|-
|State
|Cancelled at 20 % Main Progress
|-
|Team-Leaders/PR
|[[Legacy:Shadow|Shadow]] (Leader/Level-Designer/C++/UScript), Chaoz (Co-Leader/PR), moonangel (Head Coder), Creavion (Head Level-Designer), RapToR (PR/Webdesign/UScript)
|-
|Team-Mappers
|Creavion (Head Level-Designer), milb, shaman, MartinW, DaDrache, TH3D00M 
|-
|Team-Coders
|moonangel (Head Coder), CWF (C++/UScript), Platy (C++), Wolf (UScript), eGo (UScript)
|-
|Team-Designers
|Apocalypse (Models/Animations/Skins), Pandemonium (Textures/Concept Art), Somian (Textures/Sounds), aHOI (Textures), JWH (Musics), aHOI (Textures), Dave Lewis (Models/Skins/Animations)
|-
|Team-Additionals
|Gabraham (HP Help), m4nk (HP/FTP Help), gh0st (Beta-Testing)
|}

The Teamlist consists of all members ever joined the team or later left the team anyway.

==Story==

Around 200 years are gone since the Queen is dead. A lot of things happened. Na Pali was conquered by Earth Forces, the Mercenaries operate far more open and the Skaarj Empire has been to quite for the last decades... Well since a few years the UMS sets up big bases and outposts on Na Pali and support the Nali with technology and weapons. The Skaarj Empire is forced to find any way to finally beat mankind back, first back from Na Pali, and get control back of control of Na Pali. Over some decades they developed a way to grow Pupae half biologically half synthetically. Through this abnormal progress they are able to grow mutated Skaarjs with extraordinary Gen-Pool. These special Skaarjs are &quot;produced&quot; only for one reason: to destroy Mankind and the Nalis in using two ways: Invading on the one hand the Earth AND Na Pali with the new Skaarj-Mutants and on the other hand... in a different time. The Empire developed during many years of researching a Time-Vortex-Machine that causes a controlled black-hole with enough anti-matter to transform gravity and therefor a Time Portal.

First simulations with the Vortex were successful. Not much time passed until the Skaarj were using the Vortex in real space. They send a small fleet somewhere near (a few lightyears away) Na Pali. The vortex seemed to work... but suddenly the forming of the black-hole got out of control. A Time-Anomaly was forming and the fleet was destroyed. Both, the UMS(now you do come into game, you're a Major of the UMS on an Earth Force Ship) and the Skaarjs are sending control troops to the accidental place. Such a huge visible anomaly and the wrecks won't be unseen for long time. When the ships were arriving the Skaarj Ship starts to attack the UMS ship immediately... suddenly the the Anomaly seemed to colapse... but a strange kind of starship appears using unknown technology and weapons ... The ship is about to attack both ships instantly. You and one you soldier escape from your ship flying down to Na Pali. You see your ship exploding... After crashing into a forest you continue your journey by searching the closest UMS Outpost. On you short way through some villages you read about a prophecy called &quot;The End of Everything&quot; in an old Nali book. Is there a connection between the anomaly and the prophecy ? The Skaarj wont spend much time until they come back with a fleet to get at least Na Pali. But they're more open questions, why did the Vortex got out of control ? What role does the unknown species play ? Why is the UMS Coop. so interested in Na Pali ? What is your role in the plot ? How does Na Pali look now, 200 years after the events of UNREAL...

==Features==

===Gameplay===
* interacting, tradig and speaking with NPCs
* Levels are non-linear
* Vehicles
* traveling between Sun-Systems and Planets, (currently) featured Planets/Locations:
** Earth
** Skaarj Homeworld
** Krall Homeworld
** Drakk Homeworld
** Mars
** Na Pali...
* around 15-20 old and new weapons, which can be combined and upgraded
* around 20 different (and new!) races and planets
* epic cut scences and starship battles from fantasy to sci-fi, also beautiful space cutscence like intros for planets or other locations
* skill system
* completely new hud
* several new pick ups (mana, biomods, weapon upgrades)

===Technology===

* Lensflare support
* Dynamic Coronas
* Software Bloom
* Trees and Foliage
* partial Physic Engine
* huge Util Class partially worked out together with Moon Angel to provide many useful and complex Uscript functions (drawing lensflares for example or footstep sounds)
* HighRes Textures up to 4096x4096 Pixels (S3TC)
* Footstep Sounds and Material Relative Events
* Level Memory System
* MP3/Ogg Support
* Dolby Digital Support using OpenAL
* better Terrain
* own complex Particle System
* Skin Illumination (Shiny/Reflecting Meshes, Detail Maps on Meshes, bright glowing Eyes etc.)
* Distance Fog
* Projectors
* Bloom and Blur Effects

==Pictures==

..need to add some pics here..

==Downloads==

There have never been any Game-Downloads for it except some Resource-Downloads like Sounds, Music

or Trailers...

==Links==

[http://www.moddb.com/mods/6444/lost-secrets-of-na-pali Official ModDB Profile]

[http://www.lsonp.de Official Website]

==Future Plans==

Currently only UNREAL: Phoenix Rising and the UnrealTournament Extension Pack are partially using content and features of LSoNP. It might be that it'll be continued in developing when I move to UnrealEngine 3 but that's completely utopic... :rolleyes:</text>
    </revision>
    <revision>
      <id>4319</id>
      <timestamp>2008-01-04T02:49:25Z</timestamp>
      <contributor>
        <ip>62.117.31.10</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==About/Overview==

Lost Secrets of Na Pali (short: LSoNP) was a huge UT99 Total Conversion that contained everything new to UT: new models, high-res textures, new technoligies (bloom, distance fog, particle system, physic engine), rpg style gaming, non-linear gameplay, own exe, own menu, own hud, own loadscreens....

{|

|-
|Mod-Name
|Lost Secrets of Na Pali (or LSoNP)
|-
|Game
|UnrealTournament v436
|-
|Genres
|First Person Shooter, Adventure, RPG, Space Simulator
|-
|Theme
|Sci-Fi, Fantasy, Apocalyptic, Horror
|-
|Players
|Singleplayer, Multiplayer/Coop
|-
|New Sounds
|yes
|-
|New Music
|yes
|-
|New Textures
|yes, too many..
|-
|New Maps
|yes, too many
|-
|New Code
|oh.. ur yes
|-
|State
|Cancelled at 20 % Main Progress
|-
|Team-Leaders/PR
|[[Legacy:Shadow|Shadow]] (Leader/Level-Designer/C++/UScript), Chaoz (Co-Leader/PR), moonangel (Head Coder), Creavion (Head Level-Designer), RapToR (PR/Webdesign/UScript)
|-
|Team-Mappers
|Creavion (Head Level-Designer), milb, shaman, MartinW, DaDrache, TH3D00M 
|-
|Team-Coders
|moonangel (Head Coder), CWF (C++/UScript), Platy (C++), Wolf (UScript), eGo (UScript)
|-
|Team-Designers
|Apocalypse (Models/Animations/Skins), Pandemonium (Textures/Concept Art), Somian (Textures/Sounds), aHOI (Textures), JWH (Musics), aHOI (Textures), Dave Lewis (Models/Skins/Animations)
|-
|Team-Additionals
|Gabraham (HP Help), m4nk (HP/FTP Help), gh0st (Beta-Testing)
|}

The Teamlist consists of all members ever joined the team or later left the team anyway.

==Story==

Around 200 years are gone since the Queen is dead. A lot of things happened. Na Pali was conquered by Earth Forces, the Mercenaries operate far more open and the Skaarj Empire has been to quite for the last decades... Well since a few years the UMS sets up big bases and outposts on Na Pali and support the Nali with technology and weapons. The Skaarj Empire is forced to find any way to finally beat mankind back, first back from Na Pali, and get control back of control of Na Pali. Over some decades they developed a way to grow Pupae half biologically half synthetically. Through this abnormal progress they are able to grow mutated Skaarjs with extraordinary Gen-Pool. These special Skaarjs are &quot;produced&quot; only for one reason: to destroy Mankind and the Nalis in using two ways: Invading on the one hand the Earth AND Na Pali with the new Skaarj-Mutants and on the other hand... in a different time. The Empire developed during many years of researching a Time-Vortex-Machine that causes a controlled black-hole with enough anti-matter to transform gravity and therefor a Time Portal.

First simulations with the Vortex were successful. Not much time passed until the Skaarj were using the Vortex in real space. They send a small fleet somewhere near (a few lightyears away) Na Pali. The vortex seemed to work... but suddenly the forming of the black-hole got out of control. A Time-Anomaly was forming and the fleet was destroyed. Both, the UMS(now you do come into game, you're a Major of the UMS on an Earth Force Ship) and the Skaarjs are sending control troops to the accidental place. Such a huge visible anomaly and the wrecks won't be unseen for long time. When the ships were arriving the Skaarj Ship starts to attack the UMS ship immediately... suddenly the the Anomaly seemed to colapse... but a strange kind of starship appears using unknown technology and weapons ... The ship is about to attack both ships instantly. You and one you soldier escape from your ship flying down to Na Pali. You see your ship exploding... After crashing into a forest you continue your journey by searching the closest UMS Outpost. On you short way through some villages you read about a prophecy called &quot;The End of Everything&quot; in an old Nali book. Is there a connection between the anomaly and the prophecy ? The Skaarj wont spend much time until they come back with a fleet to get at least Na Pali. But they're more open questions, why did the Vortex got out of control ? What role does the unknown species play ? Why is the UMS Coop. so interested in Na Pali ? What is your role in the plot ? How does Na Pali look now, 200 years after the events of UNREAL...

==Features==

===Gameplay===
* interacting, tradig and speaking with NPCs
* Levels are non-linear
* Vehicles
* traveling between Sun-Systems and Planets, (currently) featured Planets/Locations:
** Earth
** Skaarj Homeworld
** Krall Homeworld
** Drakk Homeworld
** Mars
** Na Pali...
* around 15-20 old and new weapons, which can be combined and upgraded
* around 20 different (and new!) races and planets
* epic cut scences and starship battles from fantasy to sci-fi, also beautiful space cutscence like intros for planets or other locations
* skill system
* completely new hud
* several new pick ups (mana, biomods, weapon upgrades)

===Technology===

* Lensflare support
* Dynamic Coronas
* Software Bloom
* Trees and Foliage
* partial Physic Engine
* huge Util Class partially worked out together with Moon Angel to provide many useful and complex Uscript functions (drawing lensflares for example or footstep sounds)
* HighRes Textures up to 4096x4096 Pixels (S3TC)
* Footstep Sounds and Material Relative Events
* Level Memory System
* MP3/Ogg Support
* Dolby Digital Support using OpenAL
* better Terrain
* own complex Particle System
* Skin Illumination (Shiny/Reflecting Meshes, Detail Maps on Meshes, bright glowing Eyes etc.)
* Distance Fog
* Projectors
* Bloom and Blur Effects

==Pictures==

..need to add some pics here..

==Downloads==

There have never been any Game-Downloads for it except some Resource-Downloads like Sounds, Music

or Trailers...

==Links==

[http://www.moddb.com/mods/6444/lost-secrets-of-na-pali Official ModDB Profile]

[http://www.lsonp.de Official Website]

==Future Plans==

Currently only UNREAL: Phoenix Rising and the UnrealTournament Extension Pack are partially using content and features of LSoNP. It might be that it'll be continued in developing when I move to UnrealEngine 3 but that's completely utopic...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:LowGrav</title>
    <id>1656</id>
    <revision>
      <id>4099</id>
      <timestamp>2003-05-27T09:49:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; LowGrav (Package: Botpack)}}

This mutator makes the entire level behave as if it was on the moon.  A side effect of this mutator is all jump boots are removed.

==Methods Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]==
; bool CheckReplacement ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; for every instance of [[Legacy:UT_JumpBoots|UT_JumpBoots]] encountered removing them from the game.  For all objects of type [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] the function sets the &lt;tt&gt;ZoneGravity&lt;/tt&gt; vector to (0,0,-200).  Oddly enough the mutator doesn't set the &lt;tt&gt;bGravityZone&lt;/tt&gt; property of the [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]] class.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4100</id>
      <timestamp>2002-04-10T18:25:35Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>for wormbo</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; LowGrav}}

This mutator makes the entire level behave as if it was on the moon.  A side effect of this mutator is all jump boots are removed &lt;i&gt;That's what the code says - I'm not sure it's true though - must check.&lt;/i&gt;

==Properties ==

None.

==Functions ==
; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; for every instance of [[Legacy:UT_JumpBoots|UT_JumpBoots]] encountered removing them from the game.  For all objects of type [[Legacy:ZoneInfo|ZoneInfo]] the function sets the &lt;tt&gt;ZoneGravity&lt;/tt&gt; vector to (0,0,-200).  Oddly enough the mutator doesn't set the &lt;tt&gt;bGravityZone&lt;/tt&gt; property of the [[Legacy:ZoneInfo|ZoneInfo]] class.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Luggage</title>
    <id>1669</id>
    <revision>
      <id>4127</id>
      <timestamp>2007-09-21T08:37:04Z</timestamp>
      <contributor>
        <ip>Host217-41-111-12.in-addr.btopenworld.com</ip>
      </contributor>
      <comment>*Reverted</comment>
      <text xml:space="preserve">'''Luggage''', or '''Lugg''' for the lazy typers.

Contact me on ICQ (#13481107) or mail me luggage@planetunreal.com if you feel like it...

==Why I Like Editing Games ==

I don't know. It just came. I started out mapping for Unreal 1 when I didn't even know there was something like the Internet, and it showed: I had never been given any tutorials. However, that changed when our public transport system donated me a 33.6k modem... I also finally got my hands on UT. And so I started mapping. Well, I wasn't good. ''(I still ain't, eh...)'' I got around to releasing about 2 maps in about half a year, then I joined Team Orbit. It is a great experience to work with a team as professional as this one, and I've never learned so much in so little time. I made some maps, and I'm still struggling to make more... but the mapping spark seems to have moved on. ''(As if I ever had it! Bleh.)'' So I got into various things... I tried skinning, texture creation, web design ''(Which is maybe the only think I'm really good at... If being good at it doesn't imply mastering PHP, that is.)'' ...and I finally (?) arrived at Unrealscript. I've been taught Java in school for a year, and I'm supposed to be good at it... well, the teacher wasn't, so being better than him probably doesn't mean much. Anyways, knowing a bit of Java proved to be a very good base for learning UScript. And there I am now, writing concepts for lots of ''cool Mods'' I would like to create... Let's just hope I don't repeat ''my old mistakes'' again.

==My old mistakes ==

Well... I have a plethora of unfinished maps on my hard drive. Some of these might even have become good ones. Maybe they would even have earned me some sort of praise... but they didn't. Because they never got released. So here's my interpretation of what went wrong:

#I learn too quickly.
#I take too long breaks.

So, why does that disable me of creating cool maps? Or even maps at all? Because:

1. Means that I advance in skill quicker than I can complete a map. Together with 2. that means that when I finally get back to the map, I don't like what I did anymore, because I think I can already do better.

All in all, this ''doesn't'' help develop my mapping (skinning, texturing etc.) skills at all. If anybody has nice tips to help me get over myself, please [mailto:luggage@planetunreal.com tell me].

==My Favourite Links ==

[http://www.planetunreal.com/luggage Luggage's Hideout] - You guessed it, my homepage.

[http://www.planetunreal.com/teamorbit Team Orbit] - Makers of NeoCairo and future creators of Orbit Wars

[http://www.planetunreal.com/ucz Aeon Development] - a.k.a. ''The-Team-Behind-DarkMagic''

==My Regularly Visited IRC Channels ==

I'm almost a regular in #darkmagic, #unrealcore, and less regularly in #unrealscript on ETG. I really only visit #unrealscript when I've got a problem, hehe :p

----

'''Tarquin:'''  hi Luggage. Consider this your official wiki welcome :)

'''Luggage:'''  Thanks, just gonna add a guestbook :)

==My Guestbook ==

Your Ramblings here.

'''Ars-Magna:''' Hi Luggage, thought I might let you know you aren't alone in the &quot;I never released maps because I never finished any&quot; department. For similar reasons to you, I'll get this awesome idea for a level, and take it to critical stage, then just dump it.

'''Luggage:''' Hey :) I finally made a level with good gameplay... well, acceptably good gameplay, I think. It started all out without architecture, and now I'm adding stuff... anyways, it's for UT, and the new engine's due out last saturday... well, maybe I'll still finish it before I get the new game :)

'''Claw:''' Hi Lug. Shouldn't you have put the Guestbook header above Tarquin's post? :p

'''Luggage:''' Yo Claw! :) No, why?

'''SabbathCat:''' Hi man, interesting Bio man, never read that in your hideout! So did you ever finish that [[Legacy:UT|UT]] map? :)?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4128</id>
      <timestamp>2007-09-21T08:22:31Z</timestamp>
      <contributor>
        <ip>66.232.107.224</ip>
      </contributor>
      <text xml:space="preserve">[url=http://mp3zz.741.com/sitemap.xml]mp3 zz[/url] &lt;a href=&quot;http://mp3zz.741.com/sitemap.xml&quot;&gt;mp3 zz&lt;/a&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lwo2psk</title>
    <id>1739</id>
    <revision>
      <id>4276</id>
      <timestamp>2005-06-08T08:42:02Z</timestamp>
      <contributor>
        <ip>Ntmy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">UnrealEd has build-in support for static meshes from [[Legacy:Lightwave|Lightwave]] files, but not for meshes with bones and animation. So here is a tool to do exactly that: 

: '''Download:''' [http://download.beyondunreal.com/fileworks.php/wiki/modeling/lwo2psk.zip]

'''new version ! ''' (6/3/2005)

-just a small fix to a small glitch with the resting position of the first bone, which could result in misalignment of model &amp; bones in unrealed (thanx to PoLuX for pointing it out)-

The package contains two small tools:
* &lt;code&gt;lwo_2_psk&lt;/code&gt; &amp;ndash; converts a .lwo and a .lws file to a .psk file
* &lt;code&gt;lws_2_psa&lt;/code&gt; &amp;ndash; appends .lws animations to a .psa file

==lwo_2_psk==

This tool converts a .lwo and a .lws file to a .psk file and an empty .psa file. The .lws file is required as it contains the reference-positon of the bones!

; Usage : &lt;code&gt;lwo_2_psk LWOFILE LWSFILE&lt;/code&gt;

; Example : &lt;code&gt;lwo_2_psk myModel.lwo refpos.lws&lt;/code&gt; &lt;br /&gt;This will create a file named &lt;code&gt;myModel.psk&lt;/code&gt; and an empty file &lt;code&gt;myModel.psa&lt;/code&gt;.  The .psa file can be filled with animations using the &lt;code&gt;lws_2_psa&lt;/code&gt; tool (explained below).

; Restrictions : The following restrictions apply when using this tool:
; * Only triangles are allowed, no nurbs surfaces, etc.
; * Vertex maps on the model ''must'' have the same name as the bone that uses them.
; * Only one (!) layer will be recognized.  This will normally be the last layer... but don't count on it.
; * The maximum length of bone/vertice/surface names is 32 characters.
; * 1 meter equals 1 [[Legacy:UU|UU]] (but you'll be able to scale in UnrealEd after importing).
; * When importing to UnrealEd, use the ''Assume Maya Coordinates'' switch (or rotate manually).
; * every Point needs uv-coordinates

==lws_2_psa==

This tool appends .lws animations to a .psa file.  (It always appends and never creates that file.  You can create an empty .psa file with &lt;code&gt;lwo_2_psk&lt;/code&gt; as explained above).

; Usage : &lt;code&gt;lws_2_psa LWSFILE PSAFILE&lt;/code&gt;

; Example : &lt;code&gt;lws_2_psa WalkF.lws myModel.psa&lt;/code&gt; &lt;br /&gt;This will append the &lt;code&gt;WalkF&lt;/code&gt; animation to the &lt;code&gt;myModel.psa&lt;/code&gt; file. &lt;br /&gt;'''Caution:'''  The name will be exactly as given in the command line with the .lws extension stripped from it, so the command line &lt;code&gt;lws_2_psa Scenes/WalkF.lws myModel.psa&lt;/code&gt; will create an animation named &lt;code&gt;Scenes/WalkF&lt;/code&gt;!

; Restrictions : The following restrictions apply when using this tool:
; * Every bone of the scene is read out &amp;ndash; do not have any additional bones in your scene!
; * The position and rotation of a bone should be present in every &quot;key&quot; frame.  If not, it will be taken from previous &quot;key&quot; frame (no tweening!).
; * The frames-per-second &quot;speed&quot; of the animation may not be consistent with UnrealEd, so tweak your animation in UnrealEd.
; * Interpolation between frames is linear in Unreal.

These tools were created and successfully tested against .lwo and .lws files created by [[Legacy:Lightwave|Lightwave]] 7.

if you got problems see [[Legacy:Lwo2psk/Error Messages|Lwo2psk/Error Messages]], and mail me if you can't solve it on your own 

'''Author:''' Christopher &quot;Ntmy&quot; Steglich (dantmy@gmx.net)

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4277</id>
      <timestamp>2005-02-23T10:58:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">UnrealEd has build-in support for [[Legacy:Static Mesh|static mesh]]es from [[Legacy:Lightwave|Lightwave]] files, but not for meshes with [[Legacy:Bone|bone]]s and animation. So here is a tool to do exactly that: 

: '''Download:''' [http://download.beyondunreal.com/fileworks.php/wiki/modeling/lwo2psk.zip]

The package contains two small tools:
* &lt;code&gt;lwo_2_psk&lt;/code&gt; &amp;ndash; converts a .lwo and a .lws file to a .psk file
* &lt;code&gt;lws_2_psa&lt;/code&gt; &amp;ndash; appends .lws animations to a .psa file

==lwo_2_psk==

This tool converts a .lwo and a .lws file to a .psk file and an empty .psa file. The .lws file is required as it contains the reference-positon of the bones!

; Usage : &lt;code&gt;lwo_2_psk LWOFILE LWSFILE&lt;/code&gt;

; Example : &lt;code&gt;lwo_2_psk myModel.lwo refpos.lws&lt;/code&gt; &lt;br /&gt;This will create a file named &lt;code&gt;myModel.psk&lt;/code&gt; and an empty file &lt;code&gt;myModel.psa&lt;/code&gt;.  The .psa file can be filled with animations using the &lt;code&gt;lws_2_psa&lt;/code&gt; tool (explained below).

; Restrictions : The following restrictions apply when using this tool:
; * Only triangles are allowed, no nurbs surfaces, etc.
; * Vertex maps on the model ''must'' have the same name as the bone that uses them.
; * Only one (!) layer will be recognized.  This will normally be the last layer... but don't count on it.
; * The maximum length of bone/vertice/surface names is 32 characters.
; * 1 meter equals 1 [[Legacy:UU|UU]] (but you'll be able to scale in UnrealEd after importing).
; * When importing to UnrealEd, use the ''Assume Maya Coordinates'' switch (or rotate manually).
; * every Point needs uv-coordinates

==lws_2_psa==

This tool appends .lws animations to a .psa file.  (It always appends and never creates that file.  You can create an empty .psa file with &lt;code&gt;lwo_2_psk&lt;/code&gt; as explained above).

; Usage : &lt;code&gt;lws_2_psa LWSFILE PSAFILE&lt;/code&gt;

; Example : &lt;code&gt;lws_2_psa WalkF.lws myModel.psa&lt;/code&gt; &lt;br /&gt;This will append the &lt;code&gt;WalkF&lt;/code&gt; animation to the &lt;code&gt;myModel.psa&lt;/code&gt; file. &lt;br /&gt;'''Caution:'''  The name will be exactly as given in the command line with the .lws extension stripped from it, so the command line &lt;code&gt;lws_2_psa Scenes/WalkF.lws myModel.psa&lt;/code&gt; will create an animation named &lt;code&gt;Scenes/WalkF&lt;/code&gt;!

; Restrictions : The following restrictions apply when using this tool:
; * Every bone of the scene is read out &amp;ndash; do not have any additional bones in your scene!
; * The position and rotation of a bone should be present in every &quot;key&quot; frame.  If not, it will be taken from previous &quot;key&quot; frame (no tweening!).
; * The frames-per-second &quot;speed&quot; of the animation may not be consistent with UnrealEd, so tweak your animation in UnrealEd.
; * Interpolation between frames is linear in Unreal.

These tools were created and successfully tested against .lwo and .lws files created by [[Legacy:Lightwave|Lightwave]] 7.

if you got problems see [[Legacy:Lwo2psk/Error Messages|Lwo2psk/Error Messages]]

'''Author:''' Christopher &quot;Ntmy&quot; Steglich (dantmy@gmx.net)

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4278</id>
      <timestamp>2005-06-03T19:42:16Z</timestamp>
      <contributor>
        <ip>Ntmy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">UnrealEd has build-in support for static meshes from [[Legacy:Lightwave|Lightwave]] files, but not for meshes with bones and animation. So here is a tool to do exactly that: 

: '''Download:''' [http://download.beyondunreal.com/fileworks.php/wiki/modeling/lwo2psk.zip]

The package contains two small tools:
* &lt;code&gt;lwo_2_psk&lt;/code&gt; &amp;ndash; converts a .lwo and a .lws file to a .psk file
* &lt;code&gt;lws_2_psa&lt;/code&gt; &amp;ndash; appends .lws animations to a .psa file

==lwo_2_psk==

This tool converts a .lwo and a .lws file to a .psk file and an empty .psa file. The .lws file is required as it contains the reference-positon of the bones!

; Usage : &lt;code&gt;lwo_2_psk LWOFILE LWSFILE&lt;/code&gt;

; Example : &lt;code&gt;lwo_2_psk myModel.lwo refpos.lws&lt;/code&gt; &lt;br /&gt;This will create a file named &lt;code&gt;myModel.psk&lt;/code&gt; and an empty file &lt;code&gt;myModel.psa&lt;/code&gt;.  The .psa file can be filled with animations using the &lt;code&gt;lws_2_psa&lt;/code&gt; tool (explained below).

; Restrictions : The following restrictions apply when using this tool:
; * Only triangles are allowed, no nurbs surfaces, etc.
; * Vertex maps on the model ''must'' have the same name as the bone that uses them.
; * Only one (!) layer will be recognized.  This will normally be the last layer... but don't count on it.
; * The maximum length of bone/vertice/surface names is 32 characters.
; * 1 meter equals 1 [[Legacy:UU|UU]] (but you'll be able to scale in UnrealEd after importing).
; * When importing to UnrealEd, use the ''Assume Maya Coordinates'' switch (or rotate manually).
; * every Point needs uv-coordinates

==lws_2_psa==

This tool appends .lws animations to a .psa file.  (It always appends and never creates that file.  You can create an empty .psa file with &lt;code&gt;lwo_2_psk&lt;/code&gt; as explained above).

; Usage : &lt;code&gt;lws_2_psa LWSFILE PSAFILE&lt;/code&gt;

; Example : &lt;code&gt;lws_2_psa WalkF.lws myModel.psa&lt;/code&gt; &lt;br /&gt;This will append the &lt;code&gt;WalkF&lt;/code&gt; animation to the &lt;code&gt;myModel.psa&lt;/code&gt; file. &lt;br /&gt;'''Caution:'''  The name will be exactly as given in the command line with the .lws extension stripped from it, so the command line &lt;code&gt;lws_2_psa Scenes/WalkF.lws myModel.psa&lt;/code&gt; will create an animation named &lt;code&gt;Scenes/WalkF&lt;/code&gt;!

; Restrictions : The following restrictions apply when using this tool:
; * Every bone of the scene is read out &amp;ndash; do not have any additional bones in your scene!
; * The position and rotation of a bone should be present in every &quot;key&quot; frame.  If not, it will be taken from previous &quot;key&quot; frame (no tweening!).
; * The frames-per-second &quot;speed&quot; of the animation may not be consistent with UnrealEd, so tweak your animation in UnrealEd.
; * Interpolation between frames is linear in Unreal.

These tools were created and successfully tested against .lwo and .lws files created by [[Legacy:Lightwave|Lightwave]] 7.

if you got problems see [[Legacy:Lwo2psk/Error Messages|Lwo2psk/Error Messages]], and mail me if you can't solve it on your own 

'''Author:''' Christopher &quot;Ntmy&quot; Steglich (dantmy@gmx.net)

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Lwo2psk/Error Messages</title>
    <id>1744</id>
    <revision>
      <id>4285</id>
      <timestamp>2005-02-23T10:38:38Z</timestamp>
      <contributor>
        <ip>Ntmy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Error Messages==

; &lt;nowiki&gt;WARNING: couldn't found uvmap [name] in any surface !? (uv set to surface 0)&lt;/nowiki&gt; : There is an UV map without a surface using it, the program assumes that it belongs to the first surface

; &lt;nowiki&gt;ERROR: Poly [num] has no texture !&lt;/nowiki&gt; : No surface was assigned to the polygon, program automatically assigns first surface.

; &lt;nowiki&gt;ERROR: Surface of Poly [num] has no uv-map! (set to 0)&lt;/nowiki&gt; : The surface don't uses an UV map, 1st surface is automaticaly assigned to the polygon.

; &lt;nowiki&gt;ERROR: Point [num] of Poly [num] has no wedge !&lt;/nowiki&gt; : A wedge consists of a point, an UV pair and a material, thus there are no UV coordinates for that point.

; &lt;nowiki&gt;ERROR: WeightMap [name] doesn't belong to a Bone!&lt;/nowiki&gt; : A weightmap which doesn't have the same name as a bone will be assigned to a bone with index -1.

; &lt;nowiki&gt;ERROR: parent [num] is out of range&lt;/nowiki&gt; : Refers to the parent of a bone, it is out of range when there is no bone with this index (very unlikely to happen).

; &lt;nowiki&gt;ERROR: Bone not found in psa-file: [name]&lt;/nowiki&gt; : There is no corresponding reference-bone in the .psa file, empty psa-files with a full set of reference-bones are created by lwo_2_psk using a reference .lws file.

; &lt;nowiki&gt;ERROR: number of Bones mismatch: psa:[num], lws:[num]&lt;/nowiki&gt; : Your .lws animation has more or less bones than your reference lws-file (the one supplied to lwo_2_psk).

; &lt;nowiki&gt;ERROR getting lws-Bone from psa-Bone [name]&lt;/nowiki&gt; : You should not get this message since the error should have triggered one of the above which end the program.

There are some more error-messages, but i hope their meaning is not hard to guess ;)</text>
    </revision>
    <revision>
      <id>4286</id>
      <timestamp>2005-02-17T12:30:04Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Error Messages==

; &lt;nowiki&gt;WARNING: couldn't found uvmap [name] in any surface !? (uv set to surface 0)&lt;/nowiki&gt; : There is an UV map without a surface using it, the program assumes that it belongs to the first surface

; &lt;nowiki&gt;ERROR: Poly [num] has no texture !&lt;/nowiki&gt; : No surface was assigned to the polygon, program automatically assigns first surface.

; &lt;nowiki&gt;ERROR: Surface of Poly [num] has no uv-map! (set to 0)&lt;/nowiki&gt; : The surface don't uses an UV map, 1st surface is automaticaly assigned to the polygon.

; &lt;nowiki&gt;ERROR: Point [num] of Poly [num] has no wedge !&lt;/nowiki&gt; : A wedge consists of a point, an UV pair and a material, thus there are no UV coordinates for that point.

; &lt;nowiki&gt;ERROR: WeightMap [name] doesn't belong to a Bone!&lt;/nowiki&gt; : A weightmap which doesn't have the same name as a bone will be assigned to a bone with index -1.

; &lt;nowiki&gt;ERROR: parent [num] is out of range&lt;/nowiki&gt; : Refers to the parent of a bone, it is out of range when there is no bone with this index (very unlikely to happen).

; &lt;nowiki&gt;ERROR: Bone not found in psa-file: [name]&lt;/nowiki&gt; : There is no corresponding reference-bone in the .psa file, empty psa-files with a full set of reference-bones are created by lwo_2_psk using a reference .lws file.

; &lt;nowiki&gt;ERROR: number of Bones mismatch: psa:[num], lws:[num]&lt;/nowiki&gt; : Your .lws animation has more or less bones than your reference lws-file (the one supplied to lwo_2_psk).

; &lt;nowiki&gt;ERROR getting lws-Bone from psa-Bone [name]&lt;/nowiki&gt; : You should not get this message since the error should have triggered one of the above which end the program.

There are some more error-messages, but i hope there meaning is not hard to guess ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MBisME</title>
    <id>2053</id>
    <revision>
      <id>5006</id>
      <timestamp>2003-10-11T22:40:39Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===MB is ME ===

====About Me ====

I am in team MaxoverKill and am very no0bish right now... i will work on fixing that though... i have been doing some but not much coding for the Unreal Annihilation project and hope to help make the mod successfully progress... any more info u guys want out there? :)

----

==Guestbook==

'''Wormbo:''' Welcome to the Wiki, enjoy your stay. :)

'''Mosquito:''' Circle of fools say hi! *wiki community all say hi* I hope you enjoy your stay, just don't fall in the lava pits and the princecess is in another castle.

'''Dragonmaw:''' Wassup MB! remember to contribute regularly :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5007</id>
      <timestamp>2003-10-07T04:38:20Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===MB is ME ===

====About Me ====

I am in team MaxoverKill and am very no0bish right now... i will work on fixing that though... i have been doing some but not much coding for the Unreal Annihilation project and hope to help make the mod successfully progress... any more info u guys want out there? :)

----

==Guestbook==

'''Wormbo:''' Welcome to the Wiki, enjoy your stay. :)

'''Mosquito:''' Circle of fools say hi! *wiki community all say hi* I hope you enjoy your stay, just don't fall in the lava pits and the princecess is in another castle.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MCloudZone</title>
    <id>2213</id>
    <revision>
      <id>5357</id>
      <timestamp>2008-03-20T10:48:29Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; MCloudZone}}

Another old class. It's mixed [[Legacy:CloudZone|CloudZone]] and [[Legacy:VacuumZone|VacuumZone]]. It'll destroy everything (except CTF flags) like cloud zone. If player enters this zone, he can be killed instantly or like in [[Legacy:VacuumZone|VacuumZone]].

&lt;uscript&gt;
//==========================================================
// Cloud zone is a good thing, but it destroys all actors
// that enter this zone. That's why I've created this class :)
//==========================================================
// Basicly it kills all pawns instantly or like Vacuum Zone.
// Bot's are killed instantly.
//==========================================================
// CTF flag stays :)
// Projectiles are destroyed
//==========================================================
// author: Raven
// I use Vacuum Zone code.
//==========================================================
// If You want to use this script put me in Credits.
class MCloudZone extends ZoneInfo;

var int Damage;
var name DamageType;
var() bool bKillInstantly;        // Player should be killed instantly after entered this zone?
var() float  KillTime;	          // How long to kill the player?
var() float  StartFlashScale;     // Fog values for client death sequence
var() Vector StartFlashFog;
var() float  EndFlashScale;
var() Vector EndFlashFog;
var() float  DieFOV;		  // Field of view when dead (interpolates)
var() float  DieDrawScale;	  // Drawscale when dead


function BeginPlay()
{
	Super.BeginPlay();
	Disable('Tick');
	DieFOV = FClamp( DieFOV, 1, 170 );
}


event ActorEntered( actor Other )
{

        Super.ActorEntered(Other);

	if (Other.IsA('Pawn'))
        {
             if(Other.IsA('PlayerPawn'))
             {
                  Pawn(Other).PlaySound( Pawn(Other).Die, SLOT_Talk );

                  if(bKillInstantly)
                  {
	                Pawn(Other).TakeDamage(Damage, Pawn(Other),Pawn(Other).Location, Vect(0,0,0), DamageType);
	          }
	          else if(!bKillInstantly)
	          {
	                Enable('Tick');
	          }
	     }
             else
                  Pawn(Other).TakeDamage(Damage, Pawn(Other),Pawn(Other).Location, Vect(0,0,0), DamageType);
        }
	else if(Other.IsA('FlagBase'))
	{
             return;
        }
        else if(Other.IsA('CTFFlag'))
	{
             return;
        }
        else if(Other.IsA('RedFlag'))
	{
             return;
        }
        else
        {
             Other.Destroy();
        }
}

function Tick( float DeltaTime )
{
	local float  		ratio, curScale;
	local vector 		curFog;
	local PlayerPawn	pPawn;
	local Pawn P;
	local bool bActive;
	local int OldFatness;

	for ( P=Level.PawnList; P!=None; P=P.NextPawn )
	{
		// Ensure player hasn't been dispatched through other means already (suicide?)
		if( (P.Region.Zone == self) &amp;&amp; (P.Health &gt; 0) )
		{
			ratio = FMax(0.01,float(Max(P.Fatness,128) - P.Default.Fatness)/FMax(1,(255 - P.Default.Fatness)));
			ratio += DeltaTime/KillTime;
			bActive = true;
			// Fatness
			OldFatness = P.Fatness;
			P.Fatness = Max(P.Fatness,128) + Max(1, ratio * (255 - P.Default.Fatness) - (P.Fatness - P.Default.Fatness));
			if ( P.Fatness &lt; Max(OldFatness,P.Default.Fatness) )
				P.Fatness = 255;

			// Fog &amp; Field of view
			pPawn = PlayerPawn(P);
			if( pPawn != None )
			{
				curScale = (EndFlashScale-StartFlashScale)*ratio + StartFlashScale;
				curFog   = (EndFlashFog  -StartFlashFog  )*ratio + StartFlashFog;
				pPawn.ClientFlash( curScale, 1000 * curFog );

				pPawn.SetFOVAngle( (DieFOV-pPawn.default.FOVAngle)*ratio + pPawn.default.FOVAngle);
			}
			if ( P.Fatness &gt; 250 )
			{	
				Level.Game.SpecialDamageString = DamageString;		
				P.TakeDamage
				(
					10000,
					P,
					P.Location,
					Vect(0,0,0),
					DamageType				
				);
				MakeNormal(P);
			}
		}
	}	
	
	if( !bActive )
		Disable('Tick');
}

function MakeNormal(Pawn P)
{
	local PlayerPawn PPawn;
	// set the fatness back to normal
	P.Fatness = P.Default.Fatness;
	P.DrawScale = P.Default.DrawScale;
	PPawn = PlayerPawn(P);
	if( PPawn != None )
		PPawn.SetFOVAngle( PPawn.Default.FOVAngle );
}

// When an actor leaves this zone.
event ActorLeaving( actor Other )
{
	if( Other.bIsPawn )
		MakeNormal(Pawn(Other));
	Super.ActorLeaving(Other);
}

defaultproperties
{
     Damage=999999
     DamageType='Fell'
     KillTime=2.500000
     StartFlashScale=1.000000
     EndFlashScale=1.000000
     DieFOV=90.000000
     DieDrawScale=1.000000
     DamageString=&quot;%o flayed away.&quot;
     bStatic=False
     bKillInstantly=false;
}
&lt;/uscript&gt;

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Custom Class (UT)]] \\
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5358</id>
      <timestamp>2005-04-05T17:27:16Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; MCloudZone}}

Sorry for any mistakes by English is not my native language. 

The idea for this class comes to me when i found out that creating [[Legacy:CloudZone|CloudZone]] and [[Legacy:VacuumZone|VacuumZone]] is not so good. Beside the worst thing was that [[Legacy:CloudZone|CloudZone]] destroys all [[Legacy:Actor|Actor]]s (including [[Legacy:FlagBase|FlagBase]], [[Legacy:CTFFlag|CTFFlag]] and [[Legacy:RedFlag|RedFlag]]). So I change [[Legacy:CloudZone|CloudZone]] code and mixed it up with [[Legacy:VacuumZone|VacuumZone]] code. I hope it will be helpful for anybody.

&lt;uscript&gt;
//==========================================================
// Cloud zone is a good thing, but it destroys all actors
// that enter this zone. That's why I create this class :)
//==========================================================
// Basicly it kills all pawns instantly or like Vacuum Zone.
// Bot's are killed instantly.
//==========================================================
// CTF flag stays :)
// Projectiles are destroyed
//==========================================================
// author: Raven
// I use Vacuum Zone code.
//==========================================================
// If You want to use this script put me in Credits.
class MCloudZone extends ZoneInfo;

var int Damage;
var name DamageType;
var() bool bKillInstantly;        // Player should be killed instantly after entered this zone?
var() float  KillTime;	          // How long to kill the player?
var() float  StartFlashScale;     // Fog values for client death sequence
var() Vector StartFlashFog;
var() float  EndFlashScale;
var() Vector EndFlashFog;
var() float  DieFOV;		  // Field of view when dead (interpolates)
var() float  DieDrawScale;	  // Drawscale when dead


function BeginPlay()
{
	Super.BeginPlay();
	Disable('Tick');
	DieFOV = FClamp( DieFOV, 1, 170 );
}


event ActorEntered( actor Other )
{

        Super.ActorEntered(Other);

	if (Other.IsA('Pawn'))
        {
             if(Other.IsA('PlayerPawn'))
             {
                  Pawn(Other).PlaySound( Pawn(Other).Die, SLOT_Talk );

                  if(bKillInstantly)
                  {
	                Pawn(Other).TakeDamage(Damage, Pawn(Other),Pawn(Other).Location, Vect(0,0,0), DamageType);
	          }
	          else if(!bKillInstantly)
	          {
	                Enable('Tick');
	          }
	     }
             else
                  Pawn(Other).TakeDamage(Damage, Pawn(Other),Pawn(Other).Location, Vect(0,0,0), DamageType);
        }
	else if(Other.IsA('FlagBase'))
	{
             return;
        }
        else if(Other.IsA('CTFFlag'))
	{
             return;
        }
        else if(Other.IsA('RedFlag'))
	{
             return;
        }
        else
        {
             Other.Destroy();
        }
}

function Tick( float DeltaTime )
{
	local float  		ratio, curScale;
	local vector 		curFog;
	local PlayerPawn	pPawn;
	local Pawn P;
	local bool bActive;
	local int OldFatness;

	for ( P=Level.PawnList; P!=None; P=P.NextPawn )
	{
		// Ensure player hasn't been dispatched through other means already (suicide?)
		if( (P.Region.Zone == self) &amp;&amp; (P.Health &gt; 0) )
		{
			ratio = FMax(0.01,float(Max(P.Fatness,128) - P.Default.Fatness)/FMax(1,(255 - P.Default.Fatness)));
			ratio += DeltaTime/KillTime;
			bActive = true;
			// Fatness
			OldFatness = P.Fatness;
			P.Fatness = Max(P.Fatness,128) + Max(1, ratio * (255 - P.Default.Fatness) - (P.Fatness - P.Default.Fatness));
			if ( P.Fatness &lt; Max(OldFatness,P.Default.Fatness) )
				P.Fatness = 255;

			// Fog &amp; Field of view
			pPawn = PlayerPawn(P);
			if( pPawn != None )
			{
				curScale = (EndFlashScale-StartFlashScale)*ratio + StartFlashScale;
				curFog   = (EndFlashFog  -StartFlashFog  )*ratio + StartFlashFog;
				pPawn.ClientFlash( curScale, 1000 * curFog );

				pPawn.SetFOVAngle( (DieFOV-pPawn.default.FOVAngle)*ratio + pPawn.default.FOVAngle);
			}
			if ( P.Fatness &gt; 250 )
			{	
				Level.Game.SpecialDamageString = DamageString;		
				P.TakeDamage
				(
					10000,
					P,
					P.Location,
					Vect(0,0,0),
					DamageType				
				);
				MakeNormal(P);
			}
		}
	}	
	
	if( !bActive )
		Disable('Tick');
}

function MakeNormal(Pawn P)
{
	local PlayerPawn PPawn;
	// set the fatness back to normal
	P.Fatness = P.Default.Fatness;
	P.DrawScale = P.Default.DrawScale;
	PPawn = PlayerPawn(P);
	if( PPawn != None )
		PPawn.SetFOVAngle( PPawn.Default.FOVAngle );
}

// When an actor leaves this zone.
event ActorLeaving( actor Other )
{
	if( Other.bIsPawn )
		MakeNormal(Pawn(Other));
	Super.ActorLeaving(Other);
}

defaultproperties
{
     Damage=999999
     DamageType='Fell'
     KillTime=2.500000
     StartFlashScale=1.000000
     EndFlashScale=1.000000
     DieFOV=90.000000
     DieDrawScale=1.000000
     DamageString=&quot;%o flayed away.&quot;
     bStatic=False
     bKillInstantly=false;
}
&lt;/uscript&gt;

----

[[:Category:Legacy Class (UT)]] \\ 

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Custom Class]] &lt;br /&gt;[[:Category:Legacy Tutorial]] \\
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5359</id>
      <timestamp>2007-11-19T16:47:19Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; MCloudZone}}

Sorry for any mistakes by English is not my native language. 

The idea for this class comes to me when i found out that creating [[Legacy:CloudZone|CloudZone]] and [[Legacy:VacuumZone|VacuumZone]] is not so good. Beside the worst thing was that [[Legacy:CloudZone|CloudZone]] destroys all [[Legacy:Actor|Actor]]s (including [[Legacy:FlagBase|FlagBase]], [[Legacy:CTFFlag|CTFFlag]] and [[Legacy:RedFlag|RedFlag]]). So I change [[Legacy:CloudZone|CloudZone]] code and mixed it up with [[Legacy:VacuumZone|VacuumZone]] code. I hope it will be helpful for anybody.

&lt;uscript&gt;
//==========================================================
// Cloud zone is a good thing, but it destroys all actors
// that enter this zone. That's why I create this class :)
//==========================================================
// Basicly it kills all pawns instantly or like Vacuum Zone.
// Bot's are killed instantly.
//==========================================================
// CTF flag stays :)
// Projectiles are destroyed
//==========================================================
// author: Raven
// I use Vacuum Zone code.
//==========================================================
// If You want to use this script put me in Credits.
class MCloudZone extends ZoneInfo;

var int Damage;
var name DamageType;
var() bool bKillInstantly;        // Player should be killed instantly after entered this zone?
var() float  KillTime;	          // How long to kill the player?
var() float  StartFlashScale;     // Fog values for client death sequence
var() Vector StartFlashFog;
var() float  EndFlashScale;
var() Vector EndFlashFog;
var() float  DieFOV;		  // Field of view when dead (interpolates)
var() float  DieDrawScale;	  // Drawscale when dead


function BeginPlay()
{
	Super.BeginPlay();
	Disable('Tick');
	DieFOV = FClamp( DieFOV, 1, 170 );
}


event ActorEntered( actor Other )
{

        Super.ActorEntered(Other);

	if (Other.IsA('Pawn'))
        {
             if(Other.IsA('PlayerPawn'))
             {
                  Pawn(Other).PlaySound( Pawn(Other).Die, SLOT_Talk );

                  if(bKillInstantly)
                  {
	                Pawn(Other).TakeDamage(Damage, Pawn(Other),Pawn(Other).Location, Vect(0,0,0), DamageType);
	          }
	          else if(!bKillInstantly)
	          {
	                Enable('Tick');
	          }
	     }
             else
                  Pawn(Other).TakeDamage(Damage, Pawn(Other),Pawn(Other).Location, Vect(0,0,0), DamageType);
        }
	else if(Other.IsA('FlagBase'))
	{
             return;
        }
        else if(Other.IsA('CTFFlag'))
	{
             return;
        }
        else if(Other.IsA('RedFlag'))
	{
             return;
        }
        else
        {
             Other.Destroy();
        }
}

function Tick( float DeltaTime )
{
	local float  		ratio, curScale;
	local vector 		curFog;
	local PlayerPawn	pPawn;
	local Pawn P;
	local bool bActive;
	local int OldFatness;

	for ( P=Level.PawnList; P!=None; P=P.NextPawn )
	{
		// Ensure player hasn't been dispatched through other means already (suicide?)
		if( (P.Region.Zone == self) &amp;&amp; (P.Health &gt; 0) )
		{
			ratio = FMax(0.01,float(Max(P.Fatness,128) - P.Default.Fatness)/FMax(1,(255 - P.Default.Fatness)));
			ratio += DeltaTime/KillTime;
			bActive = true;
			// Fatness
			OldFatness = P.Fatness;
			P.Fatness = Max(P.Fatness,128) + Max(1, ratio * (255 - P.Default.Fatness) - (P.Fatness - P.Default.Fatness));
			if ( P.Fatness &lt; Max(OldFatness,P.Default.Fatness) )
				P.Fatness = 255;

			// Fog &amp; Field of view
			pPawn = PlayerPawn(P);
			if( pPawn != None )
			{
				curScale = (EndFlashScale-StartFlashScale)*ratio + StartFlashScale;
				curFog   = (EndFlashFog  -StartFlashFog  )*ratio + StartFlashFog;
				pPawn.ClientFlash( curScale, 1000 * curFog );

				pPawn.SetFOVAngle( (DieFOV-pPawn.default.FOVAngle)*ratio + pPawn.default.FOVAngle);
			}
			if ( P.Fatness &gt; 250 )
			{	
				Level.Game.SpecialDamageString = DamageString;		
				P.TakeDamage
				(
					10000,
					P,
					P.Location,
					Vect(0,0,0),
					DamageType				
				);
				MakeNormal(P);
			}
		}
	}	
	
	if( !bActive )
		Disable('Tick');
}

function MakeNormal(Pawn P)
{
	local PlayerPawn PPawn;
	// set the fatness back to normal
	P.Fatness = P.Default.Fatness;
	P.DrawScale = P.Default.DrawScale;
	PPawn = PlayerPawn(P);
	if( PPawn != None )
		PPawn.SetFOVAngle( PPawn.Default.FOVAngle );
}

// When an actor leaves this zone.
event ActorLeaving( actor Other )
{
	if( Other.bIsPawn )
		MakeNormal(Pawn(Other));
	Super.ActorLeaving(Other);
}

defaultproperties
{
     Damage=999999
     DamageType='Fell'
     KillTime=2.500000
     StartFlashScale=1.000000
     EndFlashScale=1.000000
     DieFOV=90.000000
     DieDrawScale=1.000000
     DamageString=&quot;%o flayed away.&quot;
     bStatic=False
     bKillInstantly=false;
}
&lt;/uscript&gt;

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy Custom Class (UT)]] \\
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MD5</title>
    <id>2186</id>
    <revision>
      <id>5300</id>
      <timestamp>2006-04-06T22:19:44Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">MD5 was developed by [http://theory.lcs.mit.edu/~rivest/homepage.html Professor Ronald L. Rivest  of MIT]

The MD5 algorithm takes as input a message of arbitrary length and produces as output a 128-bit &quot;fingerprint&quot; or &quot;message digest&quot; of the input. It is conjectured that it is computationally infeasible to produce two messages having the same message digest, or to produce any message having a given prespecified target message digest. The MD5 algorithm is intended for digital signature applications, where a large file must be &quot;compressed&quot; in a secure manner before being encrypted with a private (secret) key under a public-key cryptosystem such as [[Legacy:RSA|RSA]].

==Code==

&lt;uscript&gt;
/** MD5 context */
struct MD5_CTX
{
	/** state (ABCD) */
	var array&lt;int&gt; state;
	/** number of bits, modulo 2^64 (lsb first) */
	var array&lt;int&gt; count;
	/** input buffer */
	var array&lt;byte&gt; buffer;
};

/** return the MD5 of the input string */
static function string MD5String (string str)
{
	local MD5_CTX context;
	local array&lt;byte&gt; digest;
	local string Hex;
	local int i;

	MD5Init (context);
	MD5Update (context, str, Len(str));
	digest.Length = 16;
	MD5Final (digest, context);

	for (i = 0; i &lt; 16; i++)
		Hex = Hex $ DecToHex(digest[i], 1);

	return Hex;
}

/** initialize the MD5 context */
static final function MD5Init(out MD5_CTX context)
{
	context.count.Length = 2;
	context.count[0] = 0;
	context.count[1] = 0;
	context.state.Length = 4;
	context.state[0] = 0x67452301;
	context.state[1] = 0xefcdab89;
	context.state[2] = 0x98badcfe;
	context.state[3] = 0x10325476;
	context.buffer.Length = 64;
}

static final function MD5Transform(out array&lt;int&gt; Buf, array&lt;byte&gt; block)
{
	local int A,B,C,D;
	local array&lt;int&gt; x;

	A = Buf[0];
	B = Buf[1];
	C = Buf[2];
	D = Buf[3];

	x.Length = 16;

	Decode (x, block, 64);

	/* Round 1 */
	FF (a, b, c, d, x[ 0],  7, 0xd76aa478); /* 1 */
	FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */
	FF (c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */
	FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */
	FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); /* 5 */
	FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */
	FF (c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */
	FF (b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */
	FF (a, b, c, d, x[ 8],  7, 0x698098d8); /* 9 */
	FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */
	FF (c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
	FF (b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
	FF (a, b, c, d, x[12],  7, 0x6b901122); /* 13 */
	FF (d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
	FF (c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
	FF (b, c, d, a, x[15], 22, 0x49b40821); /* 16 */

	/* Round 2 */
	GG (a, b, c, d, x[ 1],  5, 0xf61e2562); /* 17 */
	GG (d, a, b, c, x[ 6],  9, 0xc040b340); /* 18 */
	GG (c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
	GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */
	GG (a, b, c, d, x[ 5],  5, 0xd62f105d); /* 21 */
	GG (d, a, b, c, x[10],  9,  0x2441453); /* 22 */
	GG (c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
	GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */
	GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); /* 25 */
	GG (d, a, b, c, x[14],  9, 0xc33707d6); /* 26 */
	GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */
	GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */
	GG (a, b, c, d, x[13],  5, 0xa9e3e905); /* 29 */
	GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); /* 30 */
	GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */
	GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */

	/* Round 3 */
	HH (a, b, c, d, x[ 5],  4, 0xfffa3942); /* 33 */
	HH (d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */
	HH (c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
	HH (b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
	HH (a, b, c, d, x[ 1],  4, 0xa4beea44); /* 37 */
	HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */
	HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */
	HH (b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
	HH (a, b, c, d, x[13],  4, 0x289b7ec6); /* 41 */
	HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */
	HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */
	HH (b, c, d, a, x[ 6], 23,  0x4881d05); /* 44 */
	HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); /* 45 */
	HH (d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
	HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
	HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */

	/* Round 4 */
	II (a, b, c, d, x[ 0],  6, 0xf4292244); /* 49 */
	II (d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */
	II (c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
	II (b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */
	II (a, b, c, d, x[12],  6, 0x655b59c3); /* 53 */
	II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */
	II (c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
	II (b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */
	II (a, b, c, d, x[ 8],  6, 0x6fa87e4f); /* 57 */
	II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
	II (c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */
	II (b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
	II (a, b, c, d, x[ 4],  6, 0xf7537e82); /* 61 */
	II (d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
	II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */
	II (b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */

	Buf[0] += A;
	Buf[1] += B;
	Buf[2] += C;
	Buf[3] += D;
}

/** update MD5 context */
static final function MD5Update(out MD5_CTX Context, string Data, int inputLen)
{
	local int i, index, partlen;
	local array&lt;byte&gt; tmpbuf;

	tmpbuf.Length = 64;
	index = ((context.count[0] &gt;&gt;&gt; 3) &amp; 0x3F);
	if ((context.count[0] += (inputLen &lt;&lt; 3)) &lt; (inputLen &lt;&lt; 3))
		context.count[1]++;
	context.count[1] += (inputLen &gt;&gt;&gt; 29);
	partLen = 64 - index;

	if (inputLen &gt;= partLen)
	{
		MD5Move(Data, 0, context.buffer, index, partLen);
		MD5Transform (context.state, context.buffer);
		for (i = partLen; i + 63 &lt; inputLen; i += 64)
		{
			MD5Move(Data, i, tmpbuf, 0, 64);
			MD5Transform (context.state, tmpbuf);
		}
		index = 0;
	}
	else
		i = 0;

	MD5Move(Data, i, context.buffer, index, inputLen-i);
}

/** finalize the MD5 context */
static final function MD5Final (out array&lt;byte&gt; digest, out MD5_CTX context)
{
	local array&lt;byte&gt; bits;
	local int i, index, padLen;
	local string strbits;
	local string PADDING;

	PADDING = chr(0x80);
	for (i = 1; i &lt; 64; i++)
		PADDING = PADDING$chr(0);

	Encode (bits, context.count, 8);

	index = ((context.count[0] &gt;&gt;&gt; 3) &amp; 0x3f);
	if (index &lt; 56)
		padLen = (56 - index);
	else
		padLen = (120 - index);
	MD5Update (context, PADDING, padLen);
	strbits = &quot;&quot;;
	for (i=0;i&lt;8;i++)
		strbits = strbits$Chr(bits[i]);
	MD5Update (context, strbits, 8);
	Encode (digest, context.state, 16);

	for (i = 0; i &lt; 64; i++)
	{
		context.buffer[i] = 0;
	}
}

static final function Encode (out array&lt;byte&gt; output, array&lt;int&gt; input, int len)
{
	local int i, j;

	i = 0;
	for (j = 0; j &lt; len; j += 4)
	{
		output[j] = (input[i] &amp; 0xff);
		output[j+1] = ((input[i] &gt;&gt; 8) &amp; 0xff);
		output[j+2] = ((input[i] &gt;&gt; 16) &amp; 0xff);
		output[j+3] = ((input[i] &gt;&gt; 24) &amp; 0xff);
		i++;
	}
}


static final function Decode(out array&lt;int&gt; output, array&lt;byte&gt; input, int len)
{
	local int i, j;

	i = 0;
	for (j = 0; j &lt; len; j += 4)
	{
		output[i] = ((input[j]) | (int(input[j+1]) &lt;&lt; 8) | (int(input[j+2]) &lt;&lt; 16) | (int(input[j+3]) &lt;&lt; 24));
		i++;
	}
}


static final function MD5Move(string src, int srcindex, out array&lt;byte&gt; buffer, int bufindex, int len)
{
	local int i,j;

	j = bufindex;
	for (i = srcindex; i &lt; srcindex+len; i++)
	{
		buffer[j] = Asc(Mid(src, i, 1));
		j++;
		if (j == 64)
			break;
	}
}


static final function int ROTATE_LEFT (int x, int n)
{
	return (((x) &lt;&lt; (n)) | ((x) &gt;&gt;&gt; (32-(n))));
}

static final function int F (int x, int y, int z)
{
	return (((x) &amp; (y)) | ((~x) &amp; (z)));
}

static final function int G (int x, int y, int z)
{
	return ((x &amp; z) | (y &amp; (~z)));
}

static final function int H (int x, int y, int z)
{
	return (x ^ y ^ z);
}

static final function int I (int x, int y, int z)
{
	return (y ^ (x | (~z)));
}

static final function FF(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += F(b, c, d) + x + ac;
	a = ROTATE_LEFT (a, s);
	a += b;
}

static final function GG(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += G(b, c, d) + x + ac;
	a = rotate_left (a, s) +b;
}

static final function HH(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += H(b, c, d) + x + ac;
	a = rotate_left (a, s) +b;
}

static final function II(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += I(b, c, d) + x + ac;
	a = rotate_left (a, s) +b;
}

static final function string DecToHex(int dec, int size)
{
	const hex = &quot;0123456789ABCDEF&quot;;
	local string s;
	local int i;

	for (i = 0; i &lt; size*2; i++)
	{
		s = mid(hex, dec &amp; 0xf, 1) $ s;
		dec = dec &gt;&gt;&gt; 4;
	}

	return s;
}
&lt;/uscript&gt;

==License==

Copyright 2004 (c) Petr Jelinek

Released under the [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]] 

==Discussion==

'''Wormbo:''' This implementation is suboptimal due to the way UnrealScript's handles parameters and function calls. It probably spends 30-50% of the execution time only passing parameters and calling functions &amp;ndash; two things UnrealScript isn't particularly good at (especially with large parameters like the MD5 context here) because it involves assigning values to variables.&lt;br /&gt;I'm currently working on implementations of [[Legacy:MD5Hash|MD5Hash]] and [[Legacy:SHA1Hash|SHA1Hash]] for UnrealScript and the MD5 algorithm generally out-performs this one by 30-40%.

==Related Articles==
* [[Legacy:CRC32|CRC32]]
* [[Legacy:SHA1|SHA1]]
* [[Wikipedia:MD5]]

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5301</id>
      <timestamp>2006-04-06T21:06:49Z</timestamp>
      <contributor>
        <ip>Cdn-ece-den-t2-01.cmc.co.denver.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">MD5 was developed by [http://theory.lcs.mit.edu/~rivest/homepage.html Professor Ronald L. Rivest  of MIT]

The MD5 algorithm takes as input a message of arbitrary length and produces as output a 128-bit &quot;fingerprint&quot; or &quot;message digest&quot; of the input. It is conjectured that it is computationally infeasible to produce two messages having the same message digest, or to produce any message having a given prespecified target message digest. The MD5 algorithm is intended for digital signature applications, where a large file must be &quot;compressed&quot; in a secure manner before being encrypted with a private (secret) key under a public-key cryptosystem such as [[Legacy:RSA|RSA]].

==Code==

&lt;uscript&gt;
/** MD5 context */
struct MD5_CTX
{
	/** state (ABCD) */
	var array&lt;int&gt; state;
	/** number of bits, modulo 2^64 (lsb first) */
	var array&lt;int&gt; count;
	/** input buffer */
	var array&lt;byte&gt; buffer;
};

/** return the MD5 of the input string */
static function string MD5String (string str)
{
	local MD5_CTX context;
	local array&lt;byte&gt; digest;
	local string Hex;
	local int i;

	MD5Init (context);
	MD5Update (context, str, Len(str));
	digest.Length = 16;
	MD5Final (digest, context);

	for (i = 0; i &lt; 16; i++)
		Hex = Hex $ DecToHex(digest[i], 1);

	return Hex;
}

/** initialize the MD5 context */
static final function MD5Init(out MD5_CTX context)
{
	context.count.Length = 2;
	context.count[0] = 0;
	context.count[1] = 0;
	context.state.Length = 4;
	context.state[0] = 0x67452301;
	context.state[1] = 0xefcdab89;
	context.state[2] = 0x98badcfe;
	context.state[3] = 0x10325476;
	context.buffer.Length = 64;
}

static final function MD5Transform(out array&lt;int&gt; Buf, array&lt;byte&gt; block)
{
	local int A,B,C,D;
	local array&lt;int&gt; x;

	A = Buf[0];
	B = Buf[1];
	C = Buf[2];
	D = Buf[3];

	x.Length = 16;

	Decode (x, block, 64);

	/* Round 1 */
	FF (a, b, c, d, x[ 0],  7, 0xd76aa478); /* 1 */
	FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */
	FF (c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */
	FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */
	FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); /* 5 */
	FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */
	FF (c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */
	FF (b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */
	FF (a, b, c, d, x[ 8],  7, 0x698098d8); /* 9 */
	FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */
	FF (c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
	FF (b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
	FF (a, b, c, d, x[12],  7, 0x6b901122); /* 13 */
	FF (d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
	FF (c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
	FF (b, c, d, a, x[15], 22, 0x49b40821); /* 16 */

	/* Round 2 */
	GG (a, b, c, d, x[ 1],  5, 0xf61e2562); /* 17 */
	GG (d, a, b, c, x[ 6],  9, 0xc040b340); /* 18 */
	GG (c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
	GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */
	GG (a, b, c, d, x[ 5],  5, 0xd62f105d); /* 21 */
	GG (d, a, b, c, x[10],  9,  0x2441453); /* 22 */
	GG (c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
	GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */
	GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); /* 25 */
	GG (d, a, b, c, x[14],  9, 0xc33707d6); /* 26 */
	GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */
	GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */
	GG (a, b, c, d, x[13],  5, 0xa9e3e905); /* 29 */
	GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); /* 30 */
	GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */
	GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */

	/* Round 3 */
	HH (a, b, c, d, x[ 5],  4, 0xfffa3942); /* 33 */
	HH (d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */
	HH (c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
	HH (b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
	HH (a, b, c, d, x[ 1],  4, 0xa4beea44); /* 37 */
	HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */
	HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */
	HH (b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
	HH (a, b, c, d, x[13],  4, 0x289b7ec6); /* 41 */
	HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */
	HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */
	HH (b, c, d, a, x[ 6], 23,  0x4881d05); /* 44 */
	HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); /* 45 */
	HH (d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
	HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
	HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */

	/* Round 4 */
	II (a, b, c, d, x[ 0],  6, 0xf4292244); /* 49 */
	II (d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */
	II (c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
	II (b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */
	II (a, b, c, d, x[12],  6, 0x655b59c3); /* 53 */
	II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */
	II (c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
	II (b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */
	II (a, b, c, d, x[ 8],  6, 0x6fa87e4f); /* 57 */
	II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
	II (c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */
	II (b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
	II (a, b, c, d, x[ 4],  6, 0xf7537e82); /* 61 */
	II (d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
	II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */
	II (b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */

	Buf[0] += A;
	Buf[1] += B;
	Buf[2] += C;
	Buf[3] += D;
}

/** update MD5 context */
static final function MD5Update(out MD5_CTX Context, string Data, int inputLen)
{
	local int i, index, partlen;
	local array&lt;byte&gt; tmpbuf;

	tmpbuf.Length = 64;
	index = ((context.count[0] &gt;&gt;&gt; 3) &amp; 0x3F);
	if ((context.count[0] += (inputLen &lt;&lt; 3)) &lt; (inputLen &lt;&lt; 3))
		context.count[1]++;
	context.count[1] += (inputLen &gt;&gt;&gt; 29);
	partLen = 64 - index;

	if (inputLen &gt;= partLen)
	{
		MD5Move(Data, 0, context.buffer, index, partLen);
		MD5Transform (context.state, context.buffer);
		for (i = partLen; i + 63 &lt; inputLen; i += 64)
		{
			MD5Move(Data, i, tmpbuf, 0, 64);
			MD5Transform (context.state, tmpbuf);
		}
		index = 0;
	}
	else
		i = 0;

	MD5Move(Data, i, context.buffer, index, inputLen-i);
}

/** finalize the MD5 context */
static final function MD5Final (out array&lt;byte&gt; digest, out MD5_CTX context)
{
	local array&lt;byte&gt; bits;
	local int i, index, padLen;
	local string strbits;
	local string PADDING;

	PADDING = chr(0x80);
	for (i = 1; i &lt; 64; i++)
		PADDING = PADDING$chr(0);

	Encode (bits, context.count, 8);

	index = ((context.count[0] &gt;&gt;&gt; 3) &amp; 0x3f);
	if (index &lt; 56)
		padLen = (56 - index);
	else
		padLen = (120 - index);
	MD5Update (context, PADDING, padLen);
	strbits = &quot;&quot;;
	for (i=0;i&lt;8;i++)
		strbits = strbits$Chr(bits[i]);
	MD5Update (context, strbits, 8);
	Encode (digest, context.state, 16);

	for (i = 0; i &lt; 64; i++)
	{
		context.buffer[i] = 0;
	}
}

static final function Encode (out array&lt;byte&gt; output, array&lt;int&gt; input, int len)
{
	local int i, j;

	i = 0;
	for (j = 0; j &lt; len; j += 4)
	{
		output[j] = (input[i] &amp; 0xff);
		output[j+1] = ((input[i] &gt;&gt; 8) &amp; 0xff);
		output[j+2] = ((input[i] &gt;&gt; 16) &amp; 0xff);
		output[j+3] = ((input[i] &gt;&gt; 24) &amp; 0xff);
		i++;
	}
}


static final function Decode(out array&lt;int&gt; output, array&lt;byte&gt; input, int len)
{
	local int i, j;

	i = 0;
	for (j = 0; j &lt; len; j += 4)
	{
		output[i] = ((input[j]) | (int(input[j+1]) &lt;&lt; 8) | (int(input[j+2]) &lt;&lt; 16) | (int(input[j+3]) &lt;&lt; 24));
		i++;
	}
}


static final function MD5Move(string src, int srcindex, out array&lt;byte&gt; buffer, int bufindex, int len)
{
	local int i,j;

	j = bufindex;
	for (i = srcindex; i &lt; srcindex+len; i++)
	{
		buffer[j] = Asc(Mid(src, i, 1));
		j++;
		if (j == 64)
			break;
	}
}


static final function int ROTATE_LEFT (int x, int n)
{
	return (((x) &lt;&lt; (n)) | ((x) &gt;&gt;&gt; (32-(n))));
}

static final function int F (int x, int y, int z)
{
	return (((x) &amp; (y)) | ((~x) &amp; (z)));
}

static final function int G (int x, int y, int z)
{
	return ((x &amp; z) | (y &amp; (~z)));
}

static final function int H (int x, int y, int z)
{
	return (x ^ y ^ z);
}

static final function int I (int x, int y, int z)
{
	return (y ^ (x | (~z)));
}

static final function FF(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += F(b, c, d) + x + ac;
	a = ROTATE_LEFT (a, s);
	a += b;
}

static final function GG(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += G(b, c, d) + x + ac;
	a = rotate_left (a, s) +b;
}

static final function HH(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += H(b, c, d) + x + ac;
	a = rotate_left (a, s) +b;
}

static final function II(out int a, int b, int c, int d, int x, int s, int ac)
{
	a += I(b, c, d) + x + ac;
	a = rotate_left (a, s) +b;
}

static final function string DecToHex(int dec, int size)
{
	const hex = &quot;0123456789ABCDEF&quot;;
	local string s;
	local int i;

	for (i = 0; i &lt; size*2; i++)
	{
		s = mid(hex, dec &amp; 0xf, 1) $ s;
		dec = dec &gt;&gt;&gt; 4;
	}

	return s;
}
&lt;/uscript&gt;

==License==

Copyright 2004 (c) Petr Jelinek

Released under the [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]] 

==Discussion==

'''Wormbo:''' This implementation is suboptimal due to the way UnrealScript's handles parameters and function calls. It probably spends 30-50% of the execution time only passing parameters and calling functions &amp;ndash; two things UnrealScript isn't particularly good at (especially with large parameters like the MD5 context here) because it involves assigning values to variables.&lt;br /&gt;I'm currently working on implementations of [[Legacy:MD5Hash|MD5Hash]] and [[Legacy:SHA1Hash|SHA1Hash]] for UnrealScript and the MD5 algorithm generally out-performs this one by 30-40%.

==Related Articles==
* [[Legacy:CRC32|CRC32]]
* [[Legacy:SHA1|SHA1]]
* [[Wikipedia:MD5]]

----

[[:Category:Legacy Algorithm]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MD5Hash</title>
    <id>2228</id>
    <revision>
      <id>5393</id>
      <timestamp>2007-11-19T16:48:15Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; MD5Hash (custom class)}}

A custom utility class for calculating [[Wikipedia:MD5]] hashes of strings and dynamic byte arrays. It cannot be used in UnrealEngine1 games due to their lack of dynamic arrays.

This implementation is specially optimized for [[Legacy:UnrealScript|UnrealScript]] and probably won't perform well when ported to Java, C/C++ or other languages. Important performance optimizations include the use of class-global variables and the lack of &lt;tt&gt;out&lt;/tt&gt; parameters, because those are ''not'' &quot;by reference&quot; in UnrealScript!

Note that the bottle neck of this implementation &amp;ndash; string to byte conversion &amp;ndash; still is there and there's no real workaround for that yet. Passing large strings around takes some time, and they always need to be passed at least to the &lt;tt&gt;Mid()&lt;/tt&gt; function.

==Usage==

For now the class can only be used statically:

&lt;uscript&gt;
local array&lt;byte&gt; SomeData;
local string Result;

// fill SomeData with byte values

Result = class'MD5Hash'.static.GetArrayHashString(SomeData);
&lt;/uscript&gt;

&lt;uscript&gt;
local string SomeData;
local string Result;

// fill SomeData with a string

Result = class'MD5Hash'.static.GetStringHashString(SomeData);
&lt;/uscript&gt;

A new version is being worked on that allows the programmer to create an instance of the class as &quot;MD5 context&quot; for more performance-friendly handling of more complex values.

==Methods==

===Static Methods===
; GUID GetArrayHash(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a GUID.
; string GetArrayHashString(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a string.
; GUID GetStringHash(string InData) : Returns the MD5 hash of the specified string as a GUID.
; string GetStringHashString(string InData) : Returns the MD5 hash of the specified string as a string.
; string GetHashString(GUID Hash) : Returns the string representation of the MD5 hash.
; string LittleEndianToHex(int i) : Returns the little endian string representation of the integer value.

==Code==

&lt;uscript&gt;
/******************************************************************************
MD5 hash implementation for UnrealScript by Wormbo.
Feel free to modify and optimize for your needs.
******************************************************************************/


class MD5Hash extends Object;


/** @ignore */
var private GUID StaticHashValue;
/** @ignore */
var private array&lt;byte&gt; StaticData;


//=============================================================================
// Instant hash functions - probably not suitable for long input data
//=============================================================================

static final function GUID GetStringHash(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetStringHashString(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function GUID GetArrayHash(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetArrayHashString(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function string GetHashString(GUID Hash)
{
  return LittleEndianToHex(Hash.A) $ LittleEndianToHex(Hash.B)
      $ LittleEndianToHex(Hash.C) $ LittleEndianToHex(Hash.D);
}


//=============================================================================
// Internal stuff for static instant hashing functions
//=============================================================================

static final function string LittleEndianToHex(int i)
{
  const hex = &quot;0123456789abcdef&quot;;
  
  return Mid(hex, i &gt;&gt; 4 &amp; 0xf, 1) $ Mid(hex, i &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 12 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 8 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 20 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 16 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 28 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 24 &amp; 0xf, 1);
}

static final function StaticProcessChunks()
{
  local int i;
  local int A, B, C, D;
  local int W[16];
  
  i = default.StaticData.Length;
  if (i % 64 &lt; 56)
    default.StaticData.Length = default.StaticData.Length + 64 - i % 64;
  else
    default.StaticData.Length = default.StaticData.Length + 128 - i % 64;
  default.StaticData[i] = 0x80;
  default.StaticData[default.StaticData.Length - 4] = (i &gt;&gt;&gt; 29);
  default.StaticData[default.StaticData.Length - 5] = (i &gt;&gt;&gt; 21);
  default.StaticData[default.StaticData.Length - 6] = (i &gt;&gt;&gt; 13);
  default.StaticData[default.StaticData.Length - 7] = (i &gt;&gt;&gt;  5);
  default.StaticData[default.StaticData.Length - 8] = (i &lt;&lt;   3);
  
  default.StaticHashValue.A = 0x67452301;
  default.StaticHashValue.B = 0xEFCDAB89;
  default.StaticHashValue.C = 0x98BADCFE;
  default.StaticHashValue.D = 0x10325476;
  
  while (default.StaticData.Length &gt; 0) {
    for (i = 0; i &lt; 16; i++) {
      W[i] = (default.StaticData[i * 4 + 3] &lt;&lt; 24)
          | (default.StaticData[i * 4 + 2] &lt;&lt; 16)
          | (default.StaticData[i * 4 + 1] &lt;&lt; 8)
          | default.StaticData[i * 4];
    }
    
    // initialize hash value for this chunk
    A = default.StaticHashValue.A;
    B = default.StaticHashValue.B;
    C = default.StaticHashValue.C;
    D = default.StaticHashValue.D;
    
    // round 1
    A += (D ^ (B &amp; (C ^ D))) + W[ 0] + 0xD76AA478;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 1] + 0xE8C7B756;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 2] + 0x242070DB;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 3] + 0xC1BDCEEE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 4] + 0xF57C0FAF;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 5] + 0x4787C62A;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 6] + 0xA8304613;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 7] + 0xFD469501;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 8] + 0x698098D8;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 9] + 0x8B44F7AF;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[10] + 0xFFFF5BB1;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[11] + 0x895CD7BE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[12] + 0x6B901122;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[13] + 0xFD987193;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[14] + 0xA679438E;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[15] + 0x49B40821;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    // round 2
    A += (C ^ (D &amp; (B ^ C))) + W[ 1] + 0xF61E2562;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 6] + 0xC040B340;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[11] + 0x265E5A51;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 0] + 0xE9B6C7AA;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 5] + 0xD62F105D;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[10] + 0x02441453;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[15] + 0xD8A1E681;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 4] + 0xE7D3FBC8;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 9] + 0x21E1CDE6;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[14] + 0xC33707D6;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 3] + 0xF4D50D87;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 8] + 0x455A14ED;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[13] + 0xA9E3E905;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 2] + 0xFCEFA3F8;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 7] + 0x676F02D9;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[12] + 0x8D2A4C8A;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    // round 3
    A += (B ^ C ^ D) + W[ 5] + 0xFFFA3942;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 8] + 0x8771F681;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[11] + 0x6D9D6122;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[14] + 0xFDE5380C;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 1] + 0xA4BEEA44;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 4] + 0x4BDECFA9;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 7] + 0xF6BB4B60;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[10] + 0xBEBFBC70;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[13] + 0x289B7EC6;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 0] + 0xEAA127FA;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 3] + 0xD4EF3085;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 6] + 0x04881D05;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 9] + 0xD9D4D039;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[12] + 0xE6DB99E5;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[15] + 0x1FA27CF8;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 2] + 0xC4AC5665;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    // round 4
    A += (C ^ (B | ~D)) + W[ 0] + 0xF4292244;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 7] + 0x432AFF97;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[14] + 0xAB9423A7;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 5] + 0xFC93A039;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[12] + 0x655B59C3;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 3] + 0x8F0CCC92;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[10] + 0xFFEFF47D;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 1] + 0x85845dd1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 8] + 0x6FA87E4F;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[15] + 0xFE2CE6E0;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 6] + 0xA3014314;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[13] + 0x4E0811A1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 4] + 0xF7537E82;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[11] + 0xBD3AF235;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 2] + 0x2AD7D2BB;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 9] + 0xEB86D391;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    // add this chunk's hash to result so far
    default.StaticHashValue.A += A;
    default.StaticHashValue.B += B;
    default.StaticHashValue.C += C;
    default.StaticHashValue.D += D;
    
    default.StaticData.Remove(0, 64);
  }
}
&lt;/uscript&gt;

==Implementation Notes==

Only the 5 least significant bits of the second operand of [[Legacy:UnrealScript|UnrealScript]]'s bitshift operators are used. That means, for example &lt;code&gt;(C &gt;&gt;&gt; -30)&lt;/code&gt; is the same as &lt;code&gt;(C &gt;&gt;&gt; 2)&lt;/code&gt;.

The implementation avoids the unneccessary circular variable assignments and additional function calls the original MD5 implementation in RFC 1321 and on Wikipedia suggest. While Wikipedia's very efficient notation of the main loop (see below) is very small, the high number of assignments make it quite slow in UnrealScript.

    '''for''' i '''from''' 0 to 63
        '''if''' 0 ≤ i ≤ 15 '''then'''
            f := (b '''and''' c) '''or''' (('''not''' b) '''and''' d)
            g := i
        '''else if''' 16 ≤ i ≤ 31
            f := (d '''and''' b) '''or''' (('''not''' d) '''and''' c)
            g := (5*i + 1) '''mod''' 16
        '''else if''' 32 ≤ i ≤ 47
            f := b '''xor''' c '''xor''' d
            g := (3*i + 5) '''mod''' 16
        '''else if''' 48 ≤ i ≤ 63
            f := c '''xor''' (b '''or''' ('''not''' d))
            g := (7*i) '''mod''' 16
 
        temp := d
        d := c
        c := b
        b := ((a + f + k(i) + w(g)) '''leftrotate''' r(i)) + b
        a := temp

Another difference from the original implementation suggestions are the calculations on the first and second round. This algorithm implements the optimizations suggested by Wikipedia: &lt;code&gt;d xor (b and (c xor d))&lt;/code&gt; instead of &lt;code&gt;(b and c) or ((not b) and d)&lt;/code&gt; for the first round and &lt;code&gt;c xor (d and (b xor c))&lt;/code&gt; instead of &lt;code&gt;(d and b) or ((not d) and c)&lt;/code&gt; for the second round. This results in a lower number of operations without changing the result.

==Related Topics==
* [[Legacy:SHA1Hash|SHA1Hash]] &amp;ndash; a similar class for calculating SHA1 hashes
* [[Wikipedia:MD5]] &amp;ndash; Wikipedia article about the MD5 hash function

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5394</id>
      <timestamp>2006-02-13T09:55:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; MD5Hash (custom class)}}

A custom utility class for calculating [[Wikipedia:MD5]] hashes of strings and dynamic byte arrays. It cannot be used in UnrealEngine1 games due to their lack of dynamic arrays.

This implementation is specially optimized for [[Legacy:UnrealScript|UnrealScript]] and probably won't perform well when ported to Java, C/C++ or other languages. Important performance optimizations include the use of class-global variables and the lack of &lt;tt&gt;out&lt;/tt&gt; parameters, because those are ''not'' &quot;by reference&quot; in UnrealScript!

Note that the bottle neck of this implementation &amp;ndash; string to byte conversion &amp;ndash; still is there and there's no real workaround for that yet. Passing large strings around takes some time, and they always need to be passed at least to the &lt;tt&gt;Mid()&lt;/tt&gt; function.

==Usage==

For now the class can only be used statically:

&lt;uscript&gt;
local array&lt;byte&gt; SomeData;
local string Result;

// fill SomeData with byte values

Result = class'MD5Hash'.static.GetArrayHashString(SomeData);
&lt;/uscript&gt;

&lt;uscript&gt;
local string SomeData;
local string Result;

// fill SomeData with a string

Result = class'MD5Hash'.static.GetStringHashString(SomeData);
&lt;/uscript&gt;

A new version is being worked on that allows the programmer to create an instance of the class as &quot;MD5 context&quot; for more performance-friendly handling of more complex values.

==Methods==

===Static Methods===
; GUID GetArrayHash(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a GUID.
; string GetArrayHashString(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a string.
; GUID GetStringHash(string InData) : Returns the MD5 hash of the specified string as a GUID.
; string GetStringHashString(string InData) : Returns the MD5 hash of the specified string as a string.
; string GetHashString(GUID Hash) : Returns the string representation of the MD5 hash.
; string LittleEndianToHex(int i) : Returns the little endian string representation of the integer value.

==Code==

&lt;uscript&gt;
/******************************************************************************
MD5 hash implementation for UnrealScript by Wormbo.
Feel free to modify and optimize for your needs.
******************************************************************************/


class MD5Hash extends Object;


/** @ignore */
var private GUID StaticHashValue;
/** @ignore */
var private array&lt;byte&gt; StaticData;


//=============================================================================
// Instant hash functions - probably not suitable for long input data
//=============================================================================

static final function GUID GetStringHash(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetStringHashString(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function GUID GetArrayHash(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetArrayHashString(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function string GetHashString(GUID Hash)
{
  return LittleEndianToHex(Hash.A) $ LittleEndianToHex(Hash.B)
      $ LittleEndianToHex(Hash.C) $ LittleEndianToHex(Hash.D);
}


//=============================================================================
// Internal stuff for static instant hashing functions
//=============================================================================

static final function string LittleEndianToHex(int i)
{
  const hex = &quot;0123456789abcdef&quot;;
  
  return Mid(hex, i &gt;&gt; 4 &amp; 0xf, 1) $ Mid(hex, i &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 12 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 8 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 20 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 16 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 28 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 24 &amp; 0xf, 1);
}

static final function StaticProcessChunks()
{
  local int i;
  local int A, B, C, D;
  local int W[16];
  
  i = default.StaticData.Length;
  if (i % 64 &lt; 56)
    default.StaticData.Length = default.StaticData.Length + 64 - i % 64;
  else
    default.StaticData.Length = default.StaticData.Length + 128 - i % 64;
  default.StaticData[i] = 0x80;
  default.StaticData[default.StaticData.Length - 4] = (i &gt;&gt;&gt; 29);
  default.StaticData[default.StaticData.Length - 5] = (i &gt;&gt;&gt; 21);
  default.StaticData[default.StaticData.Length - 6] = (i &gt;&gt;&gt; 13);
  default.StaticData[default.StaticData.Length - 7] = (i &gt;&gt;&gt;  5);
  default.StaticData[default.StaticData.Length - 8] = (i &lt;&lt;   3);
  
  default.StaticHashValue.A = 0x67452301;
  default.StaticHashValue.B = 0xEFCDAB89;
  default.StaticHashValue.C = 0x98BADCFE;
  default.StaticHashValue.D = 0x10325476;
  
  while (default.StaticData.Length &gt; 0) {
    for (i = 0; i &lt; 16; i++) {
      W[i] = (default.StaticData[i * 4 + 3] &lt;&lt; 24)
          | (default.StaticData[i * 4 + 2] &lt;&lt; 16)
          | (default.StaticData[i * 4 + 1] &lt;&lt; 8)
          | default.StaticData[i * 4];
    }
    
    // initialize hash value for this chunk
    A = default.StaticHashValue.A;
    B = default.StaticHashValue.B;
    C = default.StaticHashValue.C;
    D = default.StaticHashValue.D;
    
    // round 1
    A += (D ^ (B &amp; (C ^ D))) + W[ 0] + 0xD76AA478;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 1] + 0xE8C7B756;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 2] + 0x242070DB;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 3] + 0xC1BDCEEE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 4] + 0xF57C0FAF;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 5] + 0x4787C62A;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 6] + 0xA8304613;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 7] + 0xFD469501;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 8] + 0x698098D8;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 9] + 0x8B44F7AF;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[10] + 0xFFFF5BB1;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[11] + 0x895CD7BE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[12] + 0x6B901122;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[13] + 0xFD987193;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[14] + 0xA679438E;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[15] + 0x49B40821;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    // round 2
    A += (C ^ (D &amp; (B ^ C))) + W[ 1] + 0xF61E2562;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 6] + 0xC040B340;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[11] + 0x265E5A51;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 0] + 0xE9B6C7AA;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 5] + 0xD62F105D;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[10] + 0x02441453;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[15] + 0xD8A1E681;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 4] + 0xE7D3FBC8;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 9] + 0x21E1CDE6;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[14] + 0xC33707D6;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 3] + 0xF4D50D87;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 8] + 0x455A14ED;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[13] + 0xA9E3E905;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 2] + 0xFCEFA3F8;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 7] + 0x676F02D9;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[12] + 0x8D2A4C8A;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    // round 3
    A += (B ^ C ^ D) + W[ 5] + 0xFFFA3942;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 8] + 0x8771F681;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[11] + 0x6D9D6122;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[14] + 0xFDE5380C;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 1] + 0xA4BEEA44;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 4] + 0x4BDECFA9;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 7] + 0xF6BB4B60;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[10] + 0xBEBFBC70;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[13] + 0x289B7EC6;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 0] + 0xEAA127FA;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 3] + 0xD4EF3085;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 6] + 0x04881D05;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 9] + 0xD9D4D039;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[12] + 0xE6DB99E5;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[15] + 0x1FA27CF8;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 2] + 0xC4AC5665;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    // round 4
    A += (C ^ (B | ~D)) + W[ 0] + 0xF4292244;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 7] + 0x432AFF97;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[14] + 0xAB9423A7;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 5] + 0xFC93A039;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[12] + 0x655B59C3;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 3] + 0x8F0CCC92;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[10] + 0xFFEFF47D;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 1] + 0x85845dd1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 8] + 0x6FA87E4F;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[15] + 0xFE2CE6E0;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 6] + 0xA3014314;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[13] + 0x4E0811A1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 4] + 0xF7537E82;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[11] + 0xBD3AF235;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 2] + 0x2AD7D2BB;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 9] + 0xEB86D391;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    // add this chunk's hash to result so far
    default.StaticHashValue.A += A;
    default.StaticHashValue.B += B;
    default.StaticHashValue.C += C;
    default.StaticHashValue.D += D;
    
    default.StaticData.Remove(0, 64);
  }
}
&lt;/uscript&gt;

==Implementation Notes==

Only the 5 least significant bits of the second operand of [[Legacy:UnrealScript|UnrealScript]]'s bitshift operators are used. That means, for example &lt;code&gt;(C &gt;&gt;&gt; -30)&lt;/code&gt; is the same as &lt;code&gt;(C &gt;&gt;&gt; 2)&lt;/code&gt;.

The implementation avoids the unneccessary circular variable assignments and additional function calls the original MD5 implementation in RFC 1321 and on Wikipedia suggest. While Wikipedia's very efficient notation of the main loop (see below) is very small, the high number of assignments make it quite slow in UnrealScript.

    '''for''' i '''from''' 0 to 63
        '''if''' 0 ≤ i ≤ 15 '''then'''
            f := (b '''and''' c) '''or''' (('''not''' b) '''and''' d)
            g := i
        '''else if''' 16 ≤ i ≤ 31
            f := (d '''and''' b) '''or''' (('''not''' d) '''and''' c)
            g := (5*i + 1) '''mod''' 16
        '''else if''' 32 ≤ i ≤ 47
            f := b '''xor''' c '''xor''' d
            g := (3*i + 5) '''mod''' 16
        '''else if''' 48 ≤ i ≤ 63
            f := c '''xor''' (b '''or''' ('''not''' d))
            g := (7*i) '''mod''' 16
 
        temp := d
        d := c
        c := b
        b := ((a + f + k(i) + w(g)) '''leftrotate''' r(i)) + b
        a := temp

Another difference from the original implementation suggestions are the calculations on the first and second round. This algorithm implements the optimizations suggested by Wikipedia: &lt;code&gt;d xor (b and (c xor d))&lt;/code&gt; instead of &lt;code&gt;(b and c) or ((not b) and d)&lt;/code&gt; for the first round and &lt;code&gt;c xor (d and (b xor c))&lt;/code&gt; instead of &lt;code&gt;(d and b) or ((not d) and c)&lt;/code&gt; for the second round. This results in a lower number of operations without changing the result.

==Related Topics==
* [[Legacy:SHA1Hash|SHA1Hash]] &amp;ndash; a similar class for calculating SHA1 hashes
* [[Wikipedia:MD5]] &amp;ndash; Wikipedia article about the MD5 hash function

[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11681</id>
      <timestamp>2008-05-02T07:54:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>uses dynarrays, so can't be implemented directly in UT1</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; MD5Hash (custom class)}}

A custom utility class for calculating [[Wikipedia:MD5]] hashes of strings and dynamic byte arrays. It cannot be used in UnrealEngine1 games due to their lack of dynamic arrays.

This implementation is specially optimized for [[Legacy:UnrealScript|UnrealScript]] and probably won't perform well when ported to Java, C/C++ or other languages. Important performance optimizations include the use of class-global variables and the lack of &lt;tt&gt;out&lt;/tt&gt; parameters, because those are ''not'' &quot;by reference&quot; in UnrealScript!

Note that the bottle neck of this implementation &amp;ndash; string to byte conversion &amp;ndash; still is there and there's no real workaround for that yet. Passing large strings around takes some time, and they always need to be passed at least to the &lt;tt&gt;Mid()&lt;/tt&gt; function.

==Usage==

For now the class can only be used statically:

&lt;uscript&gt;
local array&lt;byte&gt; SomeData;
local string Result;

// fill SomeData with byte values

Result = class'MD5Hash'.static.GetArrayHashString(SomeData);

local string SomeData;
local string Result;

// fill SomeData with a string

Result = class'MD5Hash'.static.GetStringHashString(SomeData);
&lt;/uscript&gt;

A new version is being worked on that allows the programmer to create an instance of the class as &quot;MD5 context&quot; for more performance-friendly handling of more complex values.

==Methods==

===Static Methods===
; GUID GetArrayHash(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a GUID.
; string GetArrayHashString(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a string.
; GUID GetStringHash(string InData) : Returns the MD5 hash of the specified string as a GUID.
; string GetStringHashString(string InData) : Returns the MD5 hash of the specified string as a string.
; string GetHashString(GUID Hash) : Returns the string representation of the MD5 hash.
; string LittleEndianToHex(int i) : Returns the little endian string representation of the integer value.

==Code==

&lt;uscript&gt;
/******************************************************************************
MD5 hash implementation for UnrealScript by Wormbo.
Feel free to modify and optimize for your needs.
******************************************************************************/


class MD5Hash extends Object;


/** @ignore */
var private GUID StaticHashValue;
/** @ignore */
var private array&lt;byte&gt; StaticData;


//=============================================================================
// Instant hash functions - probably not suitable for long input data
//=============================================================================

static final function GUID GetStringHash(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetStringHashString(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function GUID GetArrayHash(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetArrayHashString(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function string GetHashString(GUID Hash)
{
  return LittleEndianToHex(Hash.A) $ LittleEndianToHex(Hash.B)
      $ LittleEndianToHex(Hash.C) $ LittleEndianToHex(Hash.D);
}


//=============================================================================
// Internal stuff for static instant hashing functions
//=============================================================================

static final function string LittleEndianToHex(int i)
{
  const hex = &quot;0123456789abcdef&quot;;
  
  return Mid(hex, i &gt;&gt; 4 &amp; 0xf, 1) $ Mid(hex, i &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 12 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 8 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 20 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 16 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 28 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 24 &amp; 0xf, 1);
}

static final function StaticProcessChunks()
{
  local int i;
  local int A, B, C, D;
  local int W[16];
  
  i = default.StaticData.Length;
  if (i % 64 &lt; 56)
    default.StaticData.Length = default.StaticData.Length + 64 - i % 64;
  else
    default.StaticData.Length = default.StaticData.Length + 128 - i % 64;
  default.StaticData[i] = 0x80;
  default.StaticData[default.StaticData.Length - 4] = (i &gt;&gt;&gt; 29);
  default.StaticData[default.StaticData.Length - 5] = (i &gt;&gt;&gt; 21);
  default.StaticData[default.StaticData.Length - 6] = (i &gt;&gt;&gt; 13);
  default.StaticData[default.StaticData.Length - 7] = (i &gt;&gt;&gt;  5);
  default.StaticData[default.StaticData.Length - 8] = (i &lt;&lt;   3);
  
  default.StaticHashValue.A = 0x67452301;
  default.StaticHashValue.B = 0xEFCDAB89;
  default.StaticHashValue.C = 0x98BADCFE;
  default.StaticHashValue.D = 0x10325476;
  
  while (default.StaticData.Length &gt; 0) {
    for (i = 0; i &lt; 16; i++) {
      W[i] = (default.StaticData[i * 4 + 3] &lt;&lt; 24)
          | (default.StaticData[i * 4 + 2] &lt;&lt; 16)
          | (default.StaticData[i * 4 + 1] &lt;&lt; 8)
          | default.StaticData[i * 4];
    }
    
    // initialize hash value for this chunk
    A = default.StaticHashValue.A;
    B = default.StaticHashValue.B;
    C = default.StaticHashValue.C;
    D = default.StaticHashValue.D;
    
    // round 1
    A += (D ^ (B &amp; (C ^ D))) + W[ 0] + 0xD76AA478;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 1] + 0xE8C7B756;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 2] + 0x242070DB;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 3] + 0xC1BDCEEE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 4] + 0xF57C0FAF;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 5] + 0x4787C62A;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 6] + 0xA8304613;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 7] + 0xFD469501;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 8] + 0x698098D8;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 9] + 0x8B44F7AF;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[10] + 0xFFFF5BB1;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[11] + 0x895CD7BE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[12] + 0x6B901122;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[13] + 0xFD987193;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[14] + 0xA679438E;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[15] + 0x49B40821;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    // round 2
    A += (C ^ (D &amp; (B ^ C))) + W[ 1] + 0xF61E2562;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 6] + 0xC040B340;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[11] + 0x265E5A51;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 0] + 0xE9B6C7AA;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 5] + 0xD62F105D;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[10] + 0x02441453;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[15] + 0xD8A1E681;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 4] + 0xE7D3FBC8;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 9] + 0x21E1CDE6;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[14] + 0xC33707D6;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 3] + 0xF4D50D87;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 8] + 0x455A14ED;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[13] + 0xA9E3E905;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 2] + 0xFCEFA3F8;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 7] + 0x676F02D9;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[12] + 0x8D2A4C8A;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    // round 3
    A += (B ^ C ^ D) + W[ 5] + 0xFFFA3942;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 8] + 0x8771F681;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[11] + 0x6D9D6122;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[14] + 0xFDE5380C;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 1] + 0xA4BEEA44;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 4] + 0x4BDECFA9;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 7] + 0xF6BB4B60;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[10] + 0xBEBFBC70;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[13] + 0x289B7EC6;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 0] + 0xEAA127FA;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 3] + 0xD4EF3085;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 6] + 0x04881D05;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 9] + 0xD9D4D039;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[12] + 0xE6DB99E5;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[15] + 0x1FA27CF8;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 2] + 0xC4AC5665;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    // round 4
    A += (C ^ (B | ~D)) + W[ 0] + 0xF4292244;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 7] + 0x432AFF97;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[14] + 0xAB9423A7;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 5] + 0xFC93A039;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[12] + 0x655B59C3;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 3] + 0x8F0CCC92;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[10] + 0xFFEFF47D;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 1] + 0x85845dd1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 8] + 0x6FA87E4F;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[15] + 0xFE2CE6E0;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 6] + 0xA3014314;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[13] + 0x4E0811A1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 4] + 0xF7537E82;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[11] + 0xBD3AF235;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 2] + 0x2AD7D2BB;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 9] + 0xEB86D391;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    // add this chunk's hash to result so far
    default.StaticHashValue.A += A;
    default.StaticHashValue.B += B;
    default.StaticHashValue.C += C;
    default.StaticHashValue.D += D;
    
    default.StaticData.Remove(0, 64);
  }
}
&lt;/uscript&gt;

==Implementation Notes==

Only the 5 least significant bits of the second operand of [[Legacy:UnrealScript|UnrealScript]]'s bitshift operators are used. That means, for example &lt;code&gt;(C &gt;&gt;&gt; -30)&lt;/code&gt; is the same as &lt;code&gt;(C &gt;&gt;&gt; 2)&lt;/code&gt;.

The implementation avoids the unneccessary circular variable assignments and additional function calls the original MD5 implementation in RFC 1321 and on Wikipedia suggest. While Wikipedia's very efficient notation of the main loop (see below) is very small, the high number of assignments make it quite slow in UnrealScript.

    '''for''' i '''from''' 0 to 63
        '''if''' 0 ≤ i ≤ 15 '''then'''
            f := (b '''and''' c) '''or''' (('''not''' b) '''and''' d)
            g := i
        '''else if''' 16 ≤ i ≤ 31
            f := (d '''and''' b) '''or''' (('''not''' d) '''and''' c)
            g := (5*i + 1) '''mod''' 16
        '''else if''' 32 ≤ i ≤ 47
            f := b '''xor''' c '''xor''' d
            g := (3*i + 5) '''mod''' 16
        '''else if''' 48 ≤ i ≤ 63
            f := c '''xor''' (b '''or''' ('''not''' d))
            g := (7*i) '''mod''' 16
 
        temp := d
        d := c
        c := b
        b := ((a + f + k(i) + w(g)) '''leftrotate''' r(i)) + b
        a := temp

Another difference from the original implementation suggestions are the calculations on the first and second round. This algorithm implements the optimizations suggested by Wikipedia: &lt;code&gt;d xor (b and (c xor d))&lt;/code&gt; instead of &lt;code&gt;(b and c) or ((not b) and d)&lt;/code&gt; for the first round and &lt;code&gt;c xor (d and (b xor c))&lt;/code&gt; instead of &lt;code&gt;(d and b) or ((not d) and c)&lt;/code&gt; for the second round. This results in a lower number of operations without changing the result.

==Related Topics==
* [[Legacy:SHA1Hash|SHA1Hash]] &amp;ndash; a similar class for calculating SHA1 hashes
* [[Wikipedia:MD5]] &amp;ndash; Wikipedia article about the MD5 hash function

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11682</id>
      <timestamp>2008-05-02T07:55:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>formatting</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; MD5Hash (custom class)}}

A custom utility class for calculating [[Wikipedia:MD5]] hashes of strings and dynamic byte arrays. It cannot be used in UnrealEngine1 games due to their lack of dynamic arrays.

This implementation is specially optimized for [[Legacy:UnrealScript|UnrealScript]] and probably won't perform well when ported to Java, C/C++ or other languages. Important performance optimizations include the use of class-global variables and the lack of &lt;tt&gt;out&lt;/tt&gt; parameters, because those are ''not'' &quot;by reference&quot; in UnrealScript!

Note that the bottle neck of this implementation &amp;ndash; string to byte conversion &amp;ndash; still is there and there's no real workaround for that yet. Passing large strings around takes some time, and they always need to be passed at least to the &lt;tt&gt;Mid()&lt;/tt&gt; function.

==Usage==

For now the class can only be used statically:

&lt;uscript&gt;
local array&lt;byte&gt; SomeData;
local string Result;

// fill SomeData with byte values

Result = class'MD5Hash'.static.GetArrayHashString(SomeData);
&lt;/uscript&gt;
or:
&lt;uscript&gt;
local string SomeData;
local string Result;

// fill SomeData with a string

Result = class'MD5Hash'.static.GetStringHashString(SomeData);
&lt;/uscript&gt;

A new version is being worked on that allows the programmer to create an instance of the class as &quot;MD5 context&quot; for more performance-friendly handling of more complex values.

==Methods==

===Static Methods===
; GUID GetArrayHash(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a GUID.
; string GetArrayHashString(array&lt;byte&gt; InData) : Returns the MD5 hash of the specified byte array as a string.
; GUID GetStringHash(string InData) : Returns the MD5 hash of the specified string as a GUID.
; string GetStringHashString(string InData) : Returns the MD5 hash of the specified string as a string.
; string GetHashString(GUID Hash) : Returns the string representation of the MD5 hash.
; string LittleEndianToHex(int i) : Returns the little endian string representation of the integer value.

==Code==

&lt;uscript&gt;
/******************************************************************************
MD5 hash implementation for UnrealScript by Wormbo.
Feel free to modify and optimize for your needs.
******************************************************************************/


class MD5Hash extends Object;


/** @ignore */
var private GUID StaticHashValue;
/** @ignore */
var private array&lt;byte&gt; StaticData;


//=============================================================================
// Instant hash functions - probably not suitable for long input data
//=============================================================================

static final function GUID GetStringHash(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetStringHashString(string In)
{
  local int StrLen, i;
  
  StrLen = Len(In);
  default.StaticData.Length = StrLen;
  for (i = 0; i &lt; StrLen; i++) {
    default.StaticData[i] = Asc(Mid(In, i, 1));
  }
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function GUID GetArrayHash(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return default.StaticHashValue;
}

static final function string GetArrayHashString(array&lt;byte&gt; In)
{
  default.StaticData = In;
  StaticProcessChunks();
  return LittleEndianToHex(default.StaticHashValue.A)
      $ LittleEndianToHex(default.StaticHashValue.B)
      $ LittleEndianToHex(default.StaticHashValue.C)
      $ LittleEndianToHex(default.StaticHashValue.D);
}

static final function string GetHashString(GUID Hash)
{
  return LittleEndianToHex(Hash.A) $ LittleEndianToHex(Hash.B)
      $ LittleEndianToHex(Hash.C) $ LittleEndianToHex(Hash.D);
}


//=============================================================================
// Internal stuff for static instant hashing functions
//=============================================================================

static final function string LittleEndianToHex(int i)
{
  const hex = &quot;0123456789abcdef&quot;;
  
  return Mid(hex, i &gt;&gt; 4 &amp; 0xf, 1) $ Mid(hex, i &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 12 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 8 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 20 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 16 &amp; 0xf, 1)
      $ Mid(hex, i &gt;&gt; 28 &amp; 0xf, 1) $ Mid(hex, i &gt;&gt; 24 &amp; 0xf, 1);
}

static final function StaticProcessChunks()
{
  local int i;
  local int A, B, C, D;
  local int W[16];
  
  i = default.StaticData.Length;
  if (i % 64 &lt; 56)
    default.StaticData.Length = default.StaticData.Length + 64 - i % 64;
  else
    default.StaticData.Length = default.StaticData.Length + 128 - i % 64;
  default.StaticData[i] = 0x80;
  default.StaticData[default.StaticData.Length - 4] = (i &gt;&gt;&gt; 29);
  default.StaticData[default.StaticData.Length - 5] = (i &gt;&gt;&gt; 21);
  default.StaticData[default.StaticData.Length - 6] = (i &gt;&gt;&gt; 13);
  default.StaticData[default.StaticData.Length - 7] = (i &gt;&gt;&gt;  5);
  default.StaticData[default.StaticData.Length - 8] = (i &lt;&lt;   3);
  
  default.StaticHashValue.A = 0x67452301;
  default.StaticHashValue.B = 0xEFCDAB89;
  default.StaticHashValue.C = 0x98BADCFE;
  default.StaticHashValue.D = 0x10325476;
  
  while (default.StaticData.Length &gt; 0) {
    for (i = 0; i &lt; 16; i++) {
      W[i] = (default.StaticData[i * 4 + 3] &lt;&lt; 24)
          | (default.StaticData[i * 4 + 2] &lt;&lt; 16)
          | (default.StaticData[i * 4 + 1] &lt;&lt; 8)
          | default.StaticData[i * 4];
    }
    
    // initialize hash value for this chunk
    A = default.StaticHashValue.A;
    B = default.StaticHashValue.B;
    C = default.StaticHashValue.C;
    D = default.StaticHashValue.D;
    
    // round 1
    A += (D ^ (B &amp; (C ^ D))) + W[ 0] + 0xD76AA478;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 1] + 0xE8C7B756;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 2] + 0x242070DB;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 3] + 0xC1BDCEEE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 4] + 0xF57C0FAF;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 5] + 0x4787C62A;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[ 6] + 0xA8304613;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[ 7] + 0xFD469501;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[ 8] + 0x698098D8;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[ 9] + 0x8B44F7AF;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[10] + 0xFFFF5BB1;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[11] + 0x895CD7BE;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    A += (D ^ (B &amp; (C ^ D))) + W[12] + 0x6B901122;   A = B + (A &lt;&lt;  7 | A &gt;&gt;&gt;  -7);
    D += (C ^ (A &amp; (B ^ C))) + W[13] + 0xFD987193;   D = A + (D &lt;&lt; 12 | D &gt;&gt;&gt; -12);
    C += (B ^ (D &amp; (A ^ B))) + W[14] + 0xA679438E;   C = D + (C &lt;&lt; 17 | C &gt;&gt;&gt; -17);
    B += (A ^ (C &amp; (D ^ A))) + W[15] + 0x49B40821;   B = C + (B &lt;&lt; 22 | B &gt;&gt;&gt; -22);
    
    // round 2
    A += (C ^ (D &amp; (B ^ C))) + W[ 1] + 0xF61E2562;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 6] + 0xC040B340;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[11] + 0x265E5A51;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 0] + 0xE9B6C7AA;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 5] + 0xD62F105D;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[10] + 0x02441453;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[15] + 0xD8A1E681;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 4] + 0xE7D3FBC8;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[ 9] + 0x21E1CDE6;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[14] + 0xC33707D6;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 3] + 0xF4D50D87;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[ 8] + 0x455A14ED;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    A += (C ^ (D &amp; (B ^ C))) + W[13] + 0xA9E3E905;   A = B + (A &lt;&lt;  5 | A &gt;&gt;&gt;  -5);
    D += (B ^ (C &amp; (A ^ B))) + W[ 2] + 0xFCEFA3F8;   D = A + (D &lt;&lt;  9 | D &gt;&gt;&gt;  -9);
    C += (A ^ (B &amp; (D ^ A))) + W[ 7] + 0x676F02D9;   C = D + (C &lt;&lt; 14 | C &gt;&gt;&gt; -14);
    B += (D ^ (A &amp; (C ^ D))) + W[12] + 0x8D2A4C8A;   B = C + (B &lt;&lt; 20 | B &gt;&gt;&gt; -20);
    
    // round 3
    A += (B ^ C ^ D) + W[ 5] + 0xFFFA3942;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 8] + 0x8771F681;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[11] + 0x6D9D6122;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[14] + 0xFDE5380C;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 1] + 0xA4BEEA44;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 4] + 0x4BDECFA9;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 7] + 0xF6BB4B60;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[10] + 0xBEBFBC70;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[13] + 0x289B7EC6;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[ 0] + 0xEAA127FA;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[ 3] + 0xD4EF3085;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 6] + 0x04881D05;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    A += (B ^ C ^ D) + W[ 9] + 0xD9D4D039;    A = B + (A &lt;&lt;  4 | A &gt;&gt;&gt;  -4);
    D += (A ^ B ^ C) + W[12] + 0xE6DB99E5;    D = A + (D &lt;&lt; 11 | D &gt;&gt;&gt; -11);
    C += (D ^ A ^ B) + W[15] + 0x1FA27CF8;    C = D + (C &lt;&lt; 16 | C &gt;&gt;&gt; -16);
    B += (C ^ D ^ A) + W[ 2] + 0xC4AC5665;    B = C + (B &lt;&lt; 23 | B &gt;&gt;&gt; -23);
    
    // round 4
    A += (C ^ (B | ~D)) + W[ 0] + 0xF4292244;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 7] + 0x432AFF97;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[14] + 0xAB9423A7;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 5] + 0xFC93A039;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[12] + 0x655B59C3;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[ 3] + 0x8F0CCC92;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[10] + 0xFFEFF47D;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 1] + 0x85845dd1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 8] + 0x6FA87E4F;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[15] + 0xFE2CE6E0;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 6] + 0xA3014314;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[13] + 0x4E0811A1;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    A += (C ^ (B | ~D)) + W[ 4] + 0xF7537E82;     A = B + (A &lt;&lt;  6 | A &gt;&gt;&gt;  -6);
    D += (B ^ (A | ~C)) + W[11] + 0xBD3AF235;     D = A + (D &lt;&lt; 10 | D &gt;&gt;&gt; -10);
    C += (A ^ (D | ~B)) + W[ 2] + 0x2AD7D2BB;     C = D + (C &lt;&lt; 15 | C &gt;&gt;&gt; -15);
    B += (D ^ (C | ~A)) + W[ 9] + 0xEB86D391;     B = C + (B &lt;&lt; 21 | B &gt;&gt;&gt; -21);
    
    // add this chunk's hash to result so far
    default.StaticHashValue.A += A;
    default.StaticHashValue.B += B;
    default.StaticHashValue.C += C;
    default.StaticHashValue.D += D;
    
    default.StaticData.Remove(0, 64);
  }
}
&lt;/uscript&gt;

==Implementation Notes==

Only the 5 least significant bits of the second operand of [[Legacy:UnrealScript|UnrealScript]]'s bitshift operators are used. That means, for example &lt;code&gt;(C &gt;&gt;&gt; -30)&lt;/code&gt; is the same as &lt;code&gt;(C &gt;&gt;&gt; 2)&lt;/code&gt;.

The implementation avoids the unneccessary circular variable assignments and additional function calls the original MD5 implementation in RFC 1321 and on Wikipedia suggest. While Wikipedia's very efficient notation of the main loop (see below) is very small, the high number of assignments make it quite slow in UnrealScript.

    '''for''' i '''from''' 0 to 63
        '''if''' 0 ≤ i ≤ 15 '''then'''
            f := (b '''and''' c) '''or''' (('''not''' b) '''and''' d)
            g := i
        '''else if''' 16 ≤ i ≤ 31
            f := (d '''and''' b) '''or''' (('''not''' d) '''and''' c)
            g := (5*i + 1) '''mod''' 16
        '''else if''' 32 ≤ i ≤ 47
            f := b '''xor''' c '''xor''' d
            g := (3*i + 5) '''mod''' 16
        '''else if''' 48 ≤ i ≤ 63
            f := c '''xor''' (b '''or''' ('''not''' d))
            g := (7*i) '''mod''' 16
 
        temp := d
        d := c
        c := b
        b := ((a + f + k(i) + w(g)) '''leftrotate''' r(i)) + b
        a := temp

Another difference from the original implementation suggestions are the calculations on the first and second round. This algorithm implements the optimizations suggested by Wikipedia: &lt;code&gt;d xor (b and (c xor d))&lt;/code&gt; instead of &lt;code&gt;(b and c) or ((not b) and d)&lt;/code&gt; for the first round and &lt;code&gt;c xor (d and (b xor c))&lt;/code&gt; instead of &lt;code&gt;(d and b) or ((not d) and c)&lt;/code&gt; for the second round. This results in a lower number of operations without changing the result.

==Related Topics==
* [[Legacy:SHA1Hash|SHA1Hash]] &amp;ndash; a similar class for calculating SHA1 hashes
* [[Wikipedia:MD5]] &amp;ndash; Wikipedia article about the MD5 hash function

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MMAN UGITU</title>
    <id>2035</id>
    <revision>
      <id>4963</id>
      <timestamp>2002-08-28T22:24:40Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki. Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list. :)

'''Tarquin:''' Hullo &amp; welcome.

'''ZxAnPhOrIaN:''' Hello and welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4964</id>
      <timestamp>2002-08-28T07:52:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Hi and welcome to the Wiki. Please add yourself to the [[Legacy:Project Contributors|Project Contributors]] list. :)

'''Tarquin:''' Hullo &amp; welcome.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MMIndustries</title>
    <id>2209</id>
    <revision>
      <id>5348</id>
      <timestamp>2005-01-11T00:17:27Z</timestamp>
      <contributor>
        <ip>MMIndustries</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">---Current projects:&amp;rarr;

----SideScroller Mod----

This semi-total conversion introduces a (kind of bizzare) mix of gameplay action into UT2004. The game comes with a few different modes of play - standard deathmatch, team deathmatch, capture the flag,and domination - as well as a totaly new single player gametype that is oriented towards achieving high scores.

The mod blends 3rd person and side scrolling views, as well as introducing a cell-shaded look, and gameplay that is reminiscent of Jazz-Jackrabbit 2 to create a whole new experience in UT2004.

----ModMelee Duel----

An add-on pack of melee weapons for Chaos UT2. The mod introduces special moves for each weapon.

----UT2004 weapon and mutator mods----

A bunch of small projects for UT2004

----UT Classic weapon and muator mods----

Some new weapons and mutators for the classic UT.</text>
    </revision>
    <revision>
      <id>5349</id>
      <timestamp>2005-01-11T00:16:05Z</timestamp>
      <contributor>
        <ip>MMIndustries</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----Current projects:----

&amp;rarr;SideScroller Mod&amp;rarr;

This semi-total conversion introduces a (kind of bizzare) mix of gameplay action into UT2004. The game comes with a few different modes of play - standard deathmatch, team deathmatch, capture the flag,and domination - as well as a totaly new single player gametype that is oriented towards achieving high scores.

The mod blends 3rd person and side scrolling views, as well as introducing a cell-shaded look, and gameplay that is reminiscent of Jazz-Jackrabbit 2 to create a whole new experience in UT2004.

&amp;rarr;ModMelee Duel&amp;rarr;

An add-on pack of melee weapons for Chaos UT2. The mod introduces special moves for each weapon.

&amp;rarr;UT2004 weapon and mutator mods&amp;rarr;

A bunch of small projects for UT2004

&amp;rarr;UT Classic weapon and muator mods&amp;rarr;

Some new weapons and mutators for the classic UT.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MPGameInfo</title>
    <id>28526</id>
    <revision>
      <id>40227</id>
      <timestamp>2009-11-17T11:02:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MS PowerToys</title>
    <id>2239</id>
    <revision>
      <id>5410</id>
      <timestamp>2007-01-01T00:47:28Z</timestamp>
      <contributor>
        <ip>Dial-2275.wroclaw.dialog.net.pl</ip>
      </contributor>
      <comment>no it doesn't</comment>
      <text xml:space="preserve">'''Microsoft PowerToys''' is a set of several applications for Windows XP created by Microsoft developers. Several of them may be useful for UT Modding, including

* '''Open Command Window Here''' - Adds an &quot;Open Command Window Here&quot; context menu option on file system folders, giving you a quick way to open a command window (cmd.exe) pointing at the selected folder.
* '''Power Calculator''' - Adds calculator with advanced features such as graphs, variables, functions, unit conversions and more.
* '''Image Resizer''' - Enables you to resize one or many image files with a right-click.

Download At [http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx MS's PowerToy's page]</text>
    </revision>
    <revision>
      <id>5411</id>
      <timestamp>2006-12-31T22:18:02Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>a package of useful (for once!) utilities from Microsoft</comment>
      <text xml:space="preserve">'''Microsoft PowerToys''' is a set of several applications for Windows XP created by Microsoft developers. Several of them may be useful for UT Modding, including

* '''Open Command Window Here''' - Adds an &quot;Open Command Window Here&quot; context menu option on file system folders, giving you a quick way to open a command window (cmd.exe) pointing at the selected folder.
* '''Power Calculator''' - Changes the standard windows calculator into a more powerful calculator which can graph and evaluate functions and perform unit conversions.
* '''Image Resizer''' - Enables you to resize one or many image files with a right-click.

Download At [http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx MS's PowerToy's page]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MYCH</title>
    <id>2237</id>
    <revision>
      <id>5406</id>
      <timestamp>2006-12-14T21:22:51Z</timestamp>
      <contributor>
        <ip>Jrubzjeknf</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Jrubzjeknf:'''

{{classbox| '''''MYCHAEEL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''''}}

{{classbox| &amp;nbsp;}}

{{classbox| '''''WWWWWWWEEEEEEE NNNNNNNEEEEEEEEEEEEEDDDDDDDD YYYYYYYYYOOOOOOOOOUUUUUUUUUUUUU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''''}}

{{classbox| &amp;nbsp;}}

{{classbox| '''''GET YOUR ASS BACK ON THE JAILBREAK FORUMS! YOU STARTED SOMETHING, NOW YOU'D BETTER FINISH IT!'''''}}

To the rest:

{{innerbox|[11:21] &lt;Jrubzjeknf&gt; a request for permission to spam the wiki

[11:21] &lt;tarquin&gt; what with?

[11:21] &lt;Jrubzjeknf&gt; MYCH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[11:22] &lt;tarquin&gt; heh, go for it :)

}}

{{classbox| '''''ps. If you don't respond to this, I'm gonna take the train to germany and personally kick your butt back to BUF!'''''}}

{{innerbox|Revision 2 . . December 10, 2006 2:35 by Fyfe [Ever heard of e-mail]

}}

Yes, I emailed him several times on various email addresses, and got no response. This is my last resort.

'''Tarquin:''' Hey Mych. There's a few things to do with JB that we'd appreciate some pointers on. :) 

'''Mychaeel:''' Extra points for creativity (to Jrubzjeknf). :-P  If I were easily embarrassed, I'd probably be right now, but in fact, you made me grin.  :-)

Before I actually had a day job creating software, I had lots of energy to expend on Jailbreak and other creative, personal things like that.  Now, my employer pays me money to make his problems mine.  It's interesting and satisfying with a seasoning of occasional exasperation about some of the third-party software the resident Powers That Be force us to work with &amp;ndash; a rather good, if sometimes spicy, mix overall.

In the past two years that I've had this job I realized that I'm mostly good at one thing:  Focusing on one single problem at a time.  I'm very bad at multitasking.  (Yes, I can do it to some degree, but it degrades my performance from what I ''can'' do to something rather average.)  I tried to fit Jailbreak into that scheme along with my day job, but it didn't work out.

Recently, I've started again doing some small-scale personal development work at home, things that I've come to think of as &quot;weekend projects&quot; &amp;ndash; getting a LDAP server to work for my Thunderbird contacts; making a Perl script that generates a photo gallery; getting acquainted with Symbian OS development for my mobile phone; and a while before, even making some Thunderbird extensions for my own benefit &amp;ndash; stuff that I could pursue at my own pace.  (I made the mistake of releasing my Thunderbird extensions to the public, just to realize that I cannot handle the amount of support requests they generate.  That, and the Mozilla source code makes Epic's UnrealScript code look saintly.)

I don't like to see Jailbreak languish, and I don't want the people I've worked on it with to think that I've abandoned them.  (There's no solace in it being uncomfortably close to the truth.)  For a time, I hoped that the Jailbreak team would just get over my not being there anymore, figure out that I really wasn't that important, and get on.  That's harsh and unfair and I'm a bad person for bailing out like that, but I did have the best intentions of never being a irreplaceable part of any team I was in &amp;ndash; I wrote loads of text and made a best effort in writing maintainable code to that end.  (So much for starting something and then not seeing it to its completion.)  I realize all this might just have backfired, and it's nobody's fault but my own.

Now... I'm slightly scared that attempting to get back into Jailbreak development will suck me in and try to claim more of my time and energy than I have available.  I know that this kind of work needs ongoing dedication, but I might have streaks of days or maybe weeks at a time where I just cannot pay any attention to Jailbreak.  (And after that, I have to make a conscious effort to wrap my mind around its problems again.)  I just happen to have some leeway right now (some of it just spent on writing all this), but that may change any moment, and just getting up to scratch with what happened during the last weeks (months?) is certain to take quite some time.

How can we make this work?  Any suggestions?

'''Jrubzjeknf:''' Finally you respond. Thx! :D

I understand if you're unable to put effort into Jailbreak. After all, there's more out there than UT2004 (like that midterm tomorrow, for which I still need to read half the book :/) and real life just has a higher priority. That's not your fault, that's life. Learn to love it. :)

You're not really required to release the patch. You are just sometimes needed, because you did some weird stuff we don't get. Example: tarquin spent an afternoon of hacking around in your perl scripts to allow me to post news on PJB. :p Another example is [http://mychaeel.no-ip.com/source/Jailbreak/Jailbreak/Installer/ this stuff in the CVS]. I bet it's helpful, but I 'll need to know what it does, and if needed, how I need to update it before I can use it. ;)

The things we need are primarily for finishing stuff, like timestamp.exe to set the build variables. It's not needed on the spot, but needed for a release.

So in conclusion: you're still needed, but only for small things, like an explanation of something or a file transfer. I'm thinking less than 15 minutes of work. Waiting we've done enough though, so if you're able to respond more quickly to requests, it'd be awesome. :D

I'm sure I'll be able to release the patch with Tarquin and Wormbo backing me up. :)

ps. Don't take the first comments too seriously, I just wanted a reaction. ;)

'''Tarquin:''' Oh yeah, and is there a way to add new actors to JBToolbox without breaking network compatibility?

'''Jrubzjeknf:''' We already made JBToolbox2 for that. ;) Actors that are not placed in maps won't break network compatibility. Actors that are, do.</text>
    </revision>
    <revision>
      <id>5407</id>
      <timestamp>2006-12-14T08:49:18Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Jrubzjeknf:'''

{{classbox| '''''MYCHAEEL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''''}}

{{classbox| &amp;nbsp;}}

{{classbox| '''''WWWWWWWEEEEEEE NNNNNNNEEEEEEEEEEEEEDDDDDDDD YYYYYYYYYOOOOOOOOOUUUUUUUUUUUUU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''''}}

{{classbox| &amp;nbsp;}}

{{classbox| '''''GET YOUR ASS BACK ON THE JAILBREAK FORUMS! YOU STARTED SOMETHING, NOW YOU'D BETTER FINISH IT!'''''}}

To the rest:

{{innerbox|[11:21] &lt;Jrubzjeknf&gt; a request for permission to spam the wiki

[11:21] &lt;tarquin&gt; what with?

[11:21] &lt;Jrubzjeknf&gt; MYCH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[11:22] &lt;tarquin&gt; heh, go for it :)

}}

{{classbox| '''''ps. If you don't respond to this, I'm gonna take the train to germany and personally kick your butt back to BUF!'''''}}

{{innerbox|Revision 2 . . December 10, 2006 2:35 by Fyfe [Ever heard of e-mail]

}}

Yes, I emailed him several times on various email addresses, and got no response. This is my last resort.

'''Tarquin:''' Hey Mych. There's a few things to do with JB that we'd appreciate some pointers on. :) 

'''Mychaeel:''' Extra points for creativity (to Jrubzjeknf). :-P  If I were easily embarrassed, I'd probably be right now, but in fact, you made me grin.  :-)

Before I actually had a day job creating software, I had lots of energy to expend on Jailbreak and other creative, personal things like that.  Now, my employer pays me money to make his problems mine.  It's interesting and satisfying with a seasoning of occasional exasperation about some of the third-party software the resident Powers That Be force us to work with &amp;ndash; a rather good, if sometimes spicy, mix overall.

In the past two years that I've had this job I realized that I'm mostly good at one thing:  Focusing on one single problem at a time.  I'm very bad at multitasking.  (Yes, I can do it to some degree, but it degrades my performance from what I ''can'' do to something rather average.)  I tried to fit Jailbreak into that scheme along with my day job, but it didn't work out.

Recently, I've started again doing some small-scale personal development work at home, things that I've come to think of as &quot;weekend projects&quot; &amp;ndash; getting a LDAP server to work for my Thunderbird contacts; making a Perl script that generates a photo gallery; getting acquainted with Symbian OS development for my mobile phone; and a while before, even making some Thunderbird extensions for my own benefit &amp;ndash; stuff that I could pursue at my own pace.  (I made the mistake of releasing my Thunderbird extensions to the public, just to realize that I cannot handle the amount of support requests they generate.  That, and the Mozilla source code makes Epic's UnrealScript code look saintly.)

I don't like to see Jailbreak languish, and I don't want the people I've worked on it with to think that I've abandoned them.  (There's no solace in it being uncomfortably close to the truth.)  For a time, I hoped that the Jailbreak team would just get over my not being there anymore, figure out that I really wasn't that important, and get on.  That's harsh and unfair and I'm a bad person for bailing out like that, but I did have the best intentions of never being a irreplaceable part of any team I was in &amp;ndash; I wrote loads of text and made a best effort in writing maintainable code to that end.  (So much for starting something and then not seeing it to its completion.)  I realize all this might just have backfired, and it's nobody's fault but my own.

Now... I'm slightly scared that attempting to get back into Jailbreak development will suck me in and try to claim more of my time and energy than I have available.  I know that this kind of work needs ongoing dedication, but I might have streaks of days or maybe weeks at a time where I just cannot pay any attention to Jailbreak.  (And after that, I have to make a conscious effort to wrap my mind around its problems again.)  I just happen to have some leeway right now (some of it just spent on writing all this), but that may change any moment, and just getting up to scratch with what happened during the last weeks (months?) is certain to take quite some time.

How can we make this work?  Any suggestions?

'''Jrubzjeknf:''' Finally you respond. Thx! :D

I understand if you're unable to put effort into Jailbreak. After all, there's more out there than UT2004 (like that midterm tomorrow, for which I still need to read half the book :/) and real life just has a higher priority. That's not your fault, that's life. Learn to love it. :)

You're not really required to release the patch. You are just sometimes needed, because you did some weird stuff we don't get. Example: tarquin spent an afternoon of hacking around in your perl scripts to allow me to post news on PJB. :p Another example is [http://mychaeel.no-ip.com/source/Jailbreak/Jailbreak/Installer/ this stuff in the CVS]. I bet it's helpful, but I 'll need to know what it does, and if needed, how I need to update it before I can use it. ;)

The things we need are primarily for finishing stuff, like timestamp.exe to set the build variables. It's not needed on the spot, but needed for a release.

So in conclusion: you're still needed, but only for small things, like an explanation of something or a file transfer. I'm thinking less than 15 minutes of work. Waiting we've done enough though, so if you're able to respond more quickly to requests, it'd be awesome. :D

I'm sure I'll be able to release the patch with Tarquin and Wormbo backing me up. :)

ps. Don't take the first comments too seriously, I just wanted a reaction. ;)

'''Tarquin:''' Oh yeah, and is there a way to add new actors to JBToolbox without breaking network compatibility?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mac</title>
    <id>2185</id>
    <revision>
      <id>5298</id>
      <timestamp>2007-03-21T12:44:19Z</timestamp>
      <contributor>
        <ip>Dial-80-47-1-79.access.uk.tiscali.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is a small 'guide' for Mac users who may want educating on the subject of the Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] games.

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly and having the general effect of making everything appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution in such cases.

===Patches===

Unfortunately, there are only 2 available patches to the game. 224b1 and 224b7. Both are, as the version number suggests, still in the beta stage, and the beta7 requires that the beta1 be installed to function. AFAIK the latest Windows patch (226f) isn't compatabile with the 224b Mac patches, so as I said previously network play is broken between the two platforms. To obtain the Mac patches, have a look at Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files].

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately, it's not actually a 'drop-in' modification (doesn't require the original Unreal to already be installed), and can't run at all on a Mac. It is possible, however, to use Unreal Tournament to run the game instead, using a modification called RTNP2UT. The mod is obtainable via fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ Web Site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material so you need to get that yourself.

===Editing: Maps &amp; Mods===

No UnrealED was released for the Mac. I go into more detail about it below. 

==Unreal Tournament==

It has had it's fair share of problems (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version (which at the time was quite understandable, since the Mac has never been recognised as a great gaming platform, which indeed up until recently, was a well founded fact). 

The job of porting it was given to Westlake Interactive yet again. The Publisher would also be Macsoft yet again, although at a later stage Infograms (AKA Atari), took over support for the Mac version, even though they originally had nothing to do with it.

===Patches ===

The last official patch made available (in sync with the Windows version of the game) was version 436 (which should still be downloadable from [http://www.atarisupport.com/newfaq/unrealtournament.php?browser=1&amp;pageDisplay=MAIN Atari's Support Site], or indeed from Beyond Unreal's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page). It squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying bug I refer to as '''''The Sound Bug''''' that usually occurs on most Mac systems running the classic OS (OS 9.x or below). As far as I'm aware it doesn't occur hardly if at all if you use the prview versions of UT to run the game natively in OS X.

Although the intensity of the bug seems to vary depending on the system you use. For example you might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity (I find that the worst occurance of this is AS-Overlord, at the start). As I said there is no known fix for this problem, despite what Westlake have said in the past about using different versions of the Sound Manager. Unfortunately, they've now dropped support for the game altogether.

On another note about patches, there is some hope, mainly for Mac OS X users. I don't know the details of the problems Mac10 uses have with UT, other than that it appears to not work properly if at all (and as previously stated the sound bug I refered to doesn't seem to occur either). Anyway Westlake did start working on a OS 10 specific version of the game launcher, and released at least three preview versions of it. It was far from complete though, and they even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. 

But Epic's Ryan Gordon, is (or rather was) attempting to make a Mac10 version of the game. I say was because on inspection of his site a while back he apprently found he'd have to completely rewrite something (the renderer I think?) because the code was so ancient and pretty crap. It was put on a backburner I think, and now doesn't look like it'll ever be finished. I wouldn't have thought there'd be any point myself, th egame's so old now, and Mac users of game are few and far between so, what's the point in wasting the time on it? Still if he does ever finish it, I've no idea if he'll be incorperating this into a [http://www.utpg.org/ UTPG] patch or what. Although even UTPG seems to have burnt out now, what with them not having any updates in a long long time. Sounds like UT is pretty much a thing of the past now. However if nostagia is your thing, and you have OS 10, keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case Ryan ever does decide to finish it.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. Don't cry though, as there is a project called [[Legacy:Seppuku|Seppuku]] (which literally translates as something like Suicidally Ambitious).

I expect a lot of people (including myself) felt it was highly unlikely the one guy (Paul Snively) would ever succeed in finishing the project. Still he slaved on, and seemed to run off at a tangent every time he made an update. In fact he seemed more interested in the development of the tools he was supposedly using to make this editor than he did the actual editor. I even asked him once how he was getting on, and he told me. After reading what he wrote, the phrases &quot;beating around the bush&quot; and &quot;complete jargon&quot; sprung to mind. The fact he seemed unable to tell me in simple laymans worried me.

More disappointing was his decision to make the editor cross platform, which seemed a bit of a risk-take considering it would double his work load (unless he got more people on the project, which he never did). Added to which his reasoning for doing so seemed pretty rediculous. It was something along the lines of that he didn't want to try and compete with the windows editor so he'd simply make a windows editor as well so there wouldn't be an competetion (don't hold me to that, but that sure as hell was what it looked like when I read it). He seemed to think it would make his life easier... By doubling his workload? Anyway, none of this really matters anymore. I first noticed in November 2005 that his site wasn't working. And it hasn't been ever since (what with it now being near the end of July '06 I doubt it'll be coming back).

And yet I noticed Paul talking bollocks yet again about something to do with Google a few months back (May I believe), so he's still around... Apparently though he's more interested in the numerous other projects that no-one's ever heard of rather than Seppuku. Oh not forgetting his day job, whatever that is. In other words, the suicidally ambitious Mac Unreal Tournament Editor has commited suicide.

Update March 2007: Still no website. It's been well over a year now, I think we can safely assume he's given up. Shame he didn't even bother to announce it anywhere, as it raises questions as to if he was actually just stringing everyone along this whole time.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). So I suspect there won't be any repeat performances of nasty unfixed bugs. Although still no UnrealED as of yet.

===Patches===

All patches should be available from Macsoft's support pages:

*[http://www.macsoftgames.com/products/ut2k3/support/MacSoft-UT2K3-Support.html UT2003]
*[http://www.macsoftgames.com/products/ut2k4/support/MacSoft-UT2K4-Support.html UT2004]

==UnrealEngine3==

As it's been pointed out by Uncommon, UnrealEd appears to be going to get a Mac release for the upcoming 3rd [[Legacy:Unreal Engine|Unreal Engine]], as mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here]. Which is nice. 

Although with the new revelations of the Mac Intel rigs, I suspect the chances are so high now Mac users will finally get UnrealED you might as well consider it a done deal... Apart from the minor problem that you'll have to buy a new Mac... Though I'm sure if you had enough money to get a G5 you'll certainly have enough laying around to buy a Mactel.

Unreal Tournament 2007 has yet to be announced for Mac I believe but it shouldn't be too far behind the PC release if Ryan Gordon has anything to do with it.

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... there's a surprise.

==Discussion==

'''type4''': If you have sound problems with the Mac Version of UnrealTournament, check out Applications/Utilities/Audio Midi Setup, and set Auto Output Format to 44100 Hz (that works perfectly for me, I'm using osX Tiger 10.4.5). Audio applications like Garageband may change this value for their own purpose to a higher value like 96000 Hz, which leads to no sound in some other applications.

'''Slim''': Worth knowing, although I believe the sound bug that I mention in the article only occurs on OS 9 (or below), or when you're running classic mode on OS 10, and is unfixable. The troubles OS 10 users see are due to the fact the version of UT for X was never really finished and some people get trouble in all sorts of areas, including sound (while, for some reason, others don't). But I altered the article to mention the OS 9 bit anyway so thanks for bringing that up.

'''Slim''': Seppuku is dead. It isn't offical but, meh, Paul doesn't seem to be going to mention is anywhere so I've done it for him.</text>
    </revision>
    <revision>
      <id>5299</id>
      <timestamp>2006-08-14T12:20:36Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <minor/>
      <comment>typo</comment>
      <text xml:space="preserve">This page is a small 'guide' for Mac users who may want educating on the subject of the Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] games.

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly and having the general effect of making everything appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution in such cases.

===Patches===

Unfortunately, there are only 2 available patches to the game. 224b1 and 224b7. Both are, as the version number suggests, still in the beta stage, and the beta7 requires that the beta1 be installed to function. AFAIK the latest Windows patch (226f) isn't compatabile with the 224b Mac patches, so as I said previously network play is broken between the two platforms. To obtain the Mac patches, have a look at Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files].

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately, it's not actually a 'drop-in' modification (doesn't require the original Unreal to already be installed), and can't run at all on a Mac. It is possible, however, to use Unreal Tournament to run the game instead, using a modification called RTNP2UT. The mod is obtainable via fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ Web Site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material so you need to get that yourself.

===Editing: Maps &amp; Mods===

No UnrealED was released for the Mac. I go into more detail about it below. 

==Unreal Tournament==

It has had it's fair share of problems (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version (which at the time was quite understandable, since the Mac has never been recognised as a great gaming platform, which indeed up until recently, was a well founded fact). 

The job of porting it was given to Westlake Interactive yet again. The Publisher would also be Macsoft yet again, although at a later stage Infograms (AKA Atari), took over support for the Mac version, even though they originally had nothing to do with it.

===Patches ===

The last official patch made available (in sync with the Windows version of the game) was version 436 (which should still be downloadable from [http://www.atarisupport.com/newfaq/unrealtournament.php?browser=1&amp;pageDisplay=MAIN Atari's Support Site], or indeed from Beyond Unreal's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page). It squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying bug I refer to as '''''The Sound Bug''''' that usually occurs on most Mac systems running the classic OS (OS 9.x or below). As far as I'm aware it doesn't occur hardly if at all if you use the prview versions of UT to run the game natively in OS X.

Although the intensity of the bug seems to vary depending on the system you use. For example you might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity (I find that the worst occurance of this is AS-Overlord, at the start). As I said there is no known fix for this problem, despite what Westlake have said in the past about using different versions of the Sound Manager. Unfortunately, they've now dropped support for the game altogether.

On another note about patches, there is some hope, mainly for Mac OS X users. I don't know the details of the problems Mac10 uses have with UT, other than that it appears to not work properly if at all (and as previously stated the sound bug I refered to doesn't seem to occur either). Anyway Westlake did start working on a OS 10 specific version of the game launcher, and released at least three preview versions of it. It was far from complete though, and they even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. 

But Epic's Ryan Gordon, is (or rather was) attempting to make a Mac10 version of the game. I say was because on inspection of his site a while back he apprently found he'd have to completely rewrite something (the renderer I think?) because the code was so ancient and pretty crap. It was put on a backburner I think, and now doesn't look like it'll ever be finished. I wouldn't have thought there'd be any point myself, th egame's so old now, and Mac users of game are few and far between so, what's the point in wasting the time on it? Still if he does ever finish it, I've no idea if he'll be incorperating this into a [http://www.utpg.org/ UTPG] patch or what. Although even UTPG seems to have burnt out now, what with them not having any updates in a long long time. Sounds like UT is pretty much a thing of the past now. However if nostagia is your thing, and you have OS 10, keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case Ryan ever does decide to finish it.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. Don't cry though, as there is a project called [[Legacy:Seppuku|Seppuku]] (which literally translates as something like Suicidally Ambitious).

I expect a lot of people (including myself) felt it was highly unlikely the one guy (Paul Snively) would ever succeed in finishing the project. Still he slaved on, and seemed to run off at a tangent every time he made an update. In fact he seemed more interested in the development of the tools he was supposedly using to make this editor than he did the actual editor. I even asked him once how he was getting on, and he told me. After reading what he wrote, the phrases &quot;beating around the bush&quot; and &quot;complete jargon&quot; sprung to mind. The fact he seemed unable to tell me in simple laymans worried me.

More disappointing was his decision to make the editor cross platform, which seemed a bit of a risk-take considering it would double his work load (unless he got more people on the project, which he never did). Added to which his reasoning for doing so seemed pretty rediculous. It was something along the lines of that he didn't want to try and compete with the windows editor so he'd simply make a windows editor as well so there wouldn't be an competetion (don't hold me to that, but that sure as hell was what it looked like when I read it). He seemed to think it would make his life easier... By doubling his workload? Anyway, none of this really matters anymore. I first noticed in November 2005 that his site wasn't working. And it hasn't been ever since (what with it now being near the end of July '06 I doubt it'll be coming back).

And yet I noticed Paul talking bollocks yet again about something to do with Google a few months back (May I believe), so he's still around... Apparently though he's more interested in the numerous other projects that no-one's ever heard of rather than Seppuku. Oh not forgetting his day job, whatever that is. In other words, the suicidally ambitious Mac Unreal Tournament Editor has commited suicide.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). So I suspect there won't be any repeat performances of nasty unfixed bugs. Although still no UnrealED as of yet.

===Patches===

All patches should be available from Macsoft's support pages:

*[http://www.macsoftgames.com/products/ut2k3/support/MacSoft-UT2K3-Support.html UT2003]
*[http://www.macsoftgames.com/products/ut2k4/support/MacSoft-UT2K4-Support.html UT2004]

==UnrealEngine3==

As it's been pointed out by Uncommon, UnrealEd appears to be going to get a Mac release for the upcoming 3rd [[Legacy:Unreal Engine|Unreal Engine]], as mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here]. Which is nice. 

Although with the new revelations of the Mac Intel rigs, I suspect the chances are so high now Mac users will finally get UnrealED you might as well consider it a done deal... Apart from the minor problem that you'll have to buy a new Mac... Though I'm sure if you had enough money to get a G5 you'll certainly have enough laying around to buy a Mactel.

Unreal Tournament 2007 has yet to be announced for Mac I believe but it shouldn't be too far behind the PC release if Ryan Gordon has anything to do with it.

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... there's a surprise.

==Discussion==

'''type4''': If you have sound problems with the Mac Version of UnrealTournament, check out Applications/Utilities/Audio Midi Setup, and set Auto Output Format to 44100 Hz (that works perfectly for me, I'm using osX Tiger 10.4.5). Audio applications like Garageband may change this value for their own purpose to a higher value like 96000 Hz, which leads to no sound in some other applications.

'''Slim''': Worth knowing, although I believe the sound bug that I mention in the article only occurs on OS 9 (or below), or when you're running classic mode on OS 10, and is unfixable. The troubles OS 10 users see are due to the fact the version of UT for X was never really finished and some people get trouble in all sorts of areas, including sound (while, for some reason, others don't). But I altered the article to mention the OS 9 bit anyway so thanks for bringing that up.

'''Slim''': Seppuku is dead. It isn't offical but, meh, Paul doesn't seem to be going to mention is anywhere so I've done it for him.</text>
    </revision>
    <revision>
      <id>34184</id>
      <timestamp>2009-03-31T20:59:03Z</timestamp>
      <contributor>
        <username>Xandros</username>
        <id>1922</id>
      </contributor>
      <comment>It was in need of severe updating, so I did it.</comment>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version, even though they originally had nothing to do with it.

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from Bu's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X with using a preview build Westlake released; the latest one called Preview 3 and was far from complete, and Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlkae dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expansing on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 rebuild of the game. That apparently got put on the back burner some time ago and hasn't had any progress since. Maybe one day he'll finish it, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called [[Legacy:Seppuku|Seppuku]] that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. Although wider opinion on this &quot;project&quot; is that it was a hoax. The name should have been a 'dead' give away (pun intended).

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>34185</id>
      <timestamp>2009-03-31T21:00:48Z</timestamp>
      <contributor>
        <username>Xandros</username>
        <id>1922</id>
      </contributor>
      <minor/>
      <comment>/* Editing: Maps &amp; Mods */ Meant that dead to be italicised.</comment>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version, even though they originally had nothing to do with it.

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from Bu's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X with using a preview build Westlake released; the latest one called Preview 3 and was far from complete, and Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlkae dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expansing on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 rebuild of the game. That apparently got put on the back burner some time ago and hasn't had any progress since. Maybe one day he'll finish it, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called [[Legacy:Seppuku|Seppuku]] that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. Although wider opinion on this &quot;project&quot; is that it was a hoax. The name should have been a ''dead'' give away (pun intended).

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>34221</id>
      <timestamp>2009-04-01T16:54:42Z</timestamp>
      <contributor>
        <username>Xandros</username>
        <id>1922</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called [[Legacy:Seppuku|Seppuku]] that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. Although wider opinion on this &quot;project&quot; is that it was a hoax. The name should have been a ''dead'' give away (pun intended).

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>34299</id>
      <timestamp>2009-04-03T14:14:59Z</timestamp>
      <contributor>
        <username>Xandros</username>
        <id>1922</id>
      </contributor>
      <minor/>
      <comment>Removed the link to Seppuku page (marked that for deletion). Also remove mention of Seppuku being a hoax - that was my opinion, not a fact. I still believe it was though but, meh.</comment>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called Seppuku that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. The project seemingly never got out of the idea stage though.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>43621</id>
      <timestamp>2010-07-08T14:24:25Z</timestamp>
      <contributor>
        <username>Lourensfish</username>
        <id>2165</id>
      </contributor>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). If you want [http://mac-how.net/ make your mac faster] there are some advises. It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called Seppuku that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. The project seemingly never got out of the idea stage though.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>43622</id>
      <timestamp>2010-07-08T18:18:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Lourensfish|Lourensfish]] ([[User talk:Lourensfish|Talk]]) to last revision by [[User:Xandros|Xandros]]</comment>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called Seppuku that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. The project seemingly never got out of the idea stage though.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>43735</id>
      <timestamp>2010-07-22T14:13:23Z</timestamp>
      <contributor>
        <ip>216.118.117.196</ip>
      </contributor>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called Seppuku that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. The project seemingly never got out of the idea stage though.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.

==How To==

Helpful information, like [http://www.mac-how.net/  how to make your mac faster] for games.</text>
    </revision>
    <revision>
      <id>43736</id>
      <timestamp>2010-07-22T15:55:00Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/216.118.117.196|216.118.117.196]] ([[User talk:216.118.117.196|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called Seppuku that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. The project seemingly never got out of the idea stage though.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release. 

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
    <revision>
      <id>44134</id>
      <timestamp>2010-11-29T02:44:34Z</timestamp>
      <contributor>
        <ip>173.86.155.53</ip>
      </contributor>
      <comment>/* Editing: Maps &amp; Mods */</comment>
      <text xml:space="preserve">This page is a history of most Mac versions of [[Legacy:Unreal Engine|Unreal Engine]] based games (mainly ones release by Epic).

==Unreal==

Ported by Westlake Interactive and published by [http://www.macsoftgames.com/ Macsoft], UT was never really finished in terms of patches, which makes network games incompatible with the Windows version. It also has a nasty bug that occurs on some graphics cards (mainly ATi models) that causes lighting to function incorrectly, causing everything to appear very dark. This makes it very difficult to see where the hell you're going on the darker maps. Obviously, software rendering mode doesn't suffer from this problem and is probably the only solution if you're suffering from it.

===Patches===

The last patch made available for the Mac was 224b7. As the version number suggests, it was still in the beta stage when released. Since the latest (and last) Windows patch for Unreal was version 226f, which isn't compatible with the 224b Mac patch, as stated previously network play is broken between the two platforms. The patch ''used'' to be on Beyond Unreal's [http://www.beyondunreal.com/main/unreal/unrealessential.php Essential Unreal Files] page but it apparently no longer is. You can still get the patches (either the full b7 or the full b1 and the update b7) from [http://www.fileplanet.com/30554/0/0/0/1/section/Patches Fileplanet] but you need an account to download them:

*[http://www.fileplanet.com/81655/80000/fileinfo/Beta-7-Full-(Mac) 224b7 Full (31.6mb)]

===Return to Na Pali===

RTNP is the Digital Extremes 'mission pack' for Unreal. This was never released on the Mac, and unfortunately because it's not actually a 'drop-in' modification (it doesn't require the original Unreal to play it), it can't run at all on a Mac in the conventional sense. It is possible however, to use Unreal Tournament to run the pack instead, using a modification called RTNP2UT. The mod is obtainable via Fileplanet, a direct link to which is located on dinwitty's [http://www.planetunreal.com/vortex/ web site]. If you go through the ordeal to download it you might also want to look at [http://forums.beyondunreal.com/showthread.php?t=93896 this] thread on the BuF. Just FYI in case it wasn't obvious enough already; in order to play the mission pack, you actually have to own it. The mod only contains a few altered .u files to enable play, it doesn't provide you with the maps or any other material.

===Editing: Maps &amp; Mods===

No UnrealED or UScript compiler was released for the Mac so mapping and modding isn't possible on the platform.

==Unreal Tournament==

Although ported to the Mac, like its predecessor it has had it's fair share of problems on the platform (probably more so than the Windows version). After the initial release of UT for Windows, it was again decided to get some third party porters in to do the Mac version. The job of porting it was given to Westlake Interactive... Again. The Publisher would also be Macsoft yet again, although at a later stage Infograms took over support for the Mac version (seeing as Macsoft was a subsidiary of Infograms).

===Patches ===

The last official patch that was made available (in sync with the Windows version of the game) was version 436, which should still be downloadable from BU's [http://www.beyondunreal.com/main/ut/utessential.php Essential UT Files] page):

*[http://download.beyondunreal.com/fileworks.php/official/ut/ut436update.sit 436 (3.42mb)]

Patch 436 squished numerous bugs, and even brought in some new ones (as most patches often do). However, there is still an extremely annoying sound bug that usually occurs on most Mac systems running the classic OS (OS 9.x or below). It won't occur on OS X if you use the preview builds, but that's because the music is broken completely in them anyway.

The intensity of the bug seems to vary depending on the system you use. It also seems to vary how quickly it manifests itself. For instance one might be able to play the game perfectly for a short period of time without experiencing this problem, but it may become apparent after a few Map changes that music no longer plays, and sound effects don't seem to play at all, or if they do, the wrong sound plays and usually gets echoed to infinity. There is no known fix for this problem on Classic, despite what Westlake have said in the past about using different versions of the Sound Manager. Support for the game was dropped entirely a long time ago, so it won't get fixed officially now.

The game isn't playable on OS X natively without using a preview build Westlake released; the latest being Preview 3 and was far from complete - Westlake even said that because they were doing it in their own free time that it might never get finished... And low and behold, it didn't. There was talk of a Preview 4 some years ago but that never materialized... Shortly thereafter it seemed Westlake dropped support for the game completely. In any case Preview 2 can be found on [http://www.fileplanet.com/84424/80000/fileinfo/Unreal-Tournament-Preview-2-%5BMac-OSX%5D Fileplanet], but Preview 3 appears to have disappeared (it does tend to float around certain torrent websites). 

Expanding on the OS X side of things, Ryan Gordon is (or rather was) attempting to make a Mac 10 update as part of [http://www.utpg.org/ UTPG]. That apparently got put on the back burner some time ago though, ([http://icculus.org/cgi-bin/finger/finger.pl?user=icculus&amp;date=2005-04-01&amp;time=16-47-15 the last mention of it] on Icculus was back in 2005). UTPG itself hasn't been updated since 2004 either. Maybe one day a UTPG patch for OS X will be finished, so keep an eye on [http://icculus.org/cgi-bin/finger/finger.pl?user=icculus this page] just in case hell freezes over.

===Editing: Maps &amp; Mods===

It is not possible to make Maps or Mods if you have the Mac version of the game. That's because there is no UnrealEd for Mac, as nearly all Mac users who play UT are probably well aware of. There is also no [[Legacy:UnrealScript|UnrealScript]] compiler available, or indeed other less important tools that might have been useful such as a UMOD creation tool, even though Westlake had the kindness in their heart (/sarcasm) to create a tool to install UMOD files which comes with the 436 patch. There was a project called Seppuku that was supposedly trying to create a tool for use on the Mac that would support various other Unreal Engine based games as well. The project seemingly never got out of the idea stage though.

==UT 2003 &amp; 2004==

Both were released for the Mac. Not by Westlake either (hurray!). Patching was kept up to date with the Windows version like UT except no &quot;show stoppers&quot; were seemingly introduced (or indeed went unfixed) as was the case with UT.

===Patches===

The latest patches for the two games are available from Macgamefiles:

*[http://www.macgamefiles.com/detail.php?item=17882 UT2003 2225.2 (7mb)]
*[http://www.macgamefiles.com/detail.php?item=18155 UT2004 3369-2 (200mb)]

==Unreal Tournament 3==

Currently the Mac version of UT3 remains unreleased, but supposedly work is continuing on it and it should see a release soon along with a Linux version. The exact reasons for why it has been delayed for such a long time have not been disclosed, though it is believed to be something to do with a lot of &quot;red tape&quot;.

===Editing: Maps &amp; Mods===

I'm not too familiar with the current situation behind UnrealEd on the Mac this time round though going on what was mentioned [http://beyondunreal.com/daedalus/singlepost.php?id=6277 here] it is a very good possibility it will finally see a release.

For UnrealScript editing there is an application for Mac OS X called Unreal Writer

==Other Games==

There have been numerous other non-Unreal games released on the Mac that use the [[Legacy:Unreal Engine|Unreal Engine]]. Details of exactly what games have been released can be found on the [[Legacy:Unreal Engine Versions|Unreal Engine Versions]] page, although as for which got Mac releases, some of the more popular titles include Deus Ex, Rune, Undying and even the newer XIII, and even Postal 2. None have a Mac version of the map editor available... There's a surprise.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MachDelta</title>
    <id>1818</id>
    <revision>
      <id>4462</id>
      <timestamp>2002-07-06T13:55:08Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Who me?

evil-kiwi@shaw.ca

Hmmm. BYE! :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4463</id>
      <timestamp>2002-04-13T20:35:55Z</timestamp>
      <contributor>
        <ip>MachDelta</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Who me?

evil-kiwi@shaw.ca

Hmmm. BYE! :D</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Machismo</title>
    <id>1761</id>
    <revision>
      <id>4320</id>
      <timestamp>2002-09-24T15:48:07Z</timestamp>
      <contributor>
        <ip>NoFear MSL</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''OshadO'': Wazzup Mach?  Welcome aboard:)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki! :) :tup:

'''NoFear MSL:''' Hello, Machismo!! Is there a place where i can download or vieuw your EXCELLENT UnrealEd 2.0 Tutorials? The link is dead. :( Realy because of you I now understand UnrealEd, but I have to look up some parts o_O I know they are in your Tutorial. Thanx!!!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4321</id>
      <timestamp>2002-08-31T20:15:58Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''OshadO'': Wazzup Mach?  Welcome aboard:)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4322</id>
      <timestamp>2002-09-24T15:46:24Z</timestamp>
      <contributor>
        <ip>NoFear MSL</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''OshadO'': Wazzup Mach?  Welcome aboard:)

'''ZxAnPhOrIaN:''' Hi, welcome to the wiki! :) :tup:

'''NoFear MSL:''' Hello, Machismo!! Is there a place where i can download or vieuw your EXCELLENT UnrealEd 2.0 Tutorials? The link is dead. :( Realy because of you I now understand UnrealEd, but I have to look up some parts o_O I know they are in your Tutorial.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Macro Texture</title>
    <id>1836</id>
    <revision>
      <id>4508</id>
      <timestamp>2006-11-22T07:22:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">You can define a macro texture for each texture in its properties using the texture browser (which requires putting the texture into [[Legacy:MyLevel|MyLevel]]). This macro texture is drawn additionally on top of the texture. 

It's very nice for repeating textures on large surfaces (mountains, huge walls), but almost nobody uses it... (was heavily used in [[Legacy:Unreal 1|Unreal 1]].

It can produce quite subtle effects, but there are a lot of possibilities.

==Procedure ==

Using HortonWhos technique of texture scaling is the best way to create a 'new' texture from an extisting texture without creating any new packages, if you've created your own texture, skip the first step.

#If you want to use an existing texture WetTexture in MyLevel (or an external .utx) , set the source as the texture you want to use.

#Change the DrawScale of this texture by right clicking it in the Texture browser and changing the value under the Texture heading

# Go to the properties of the texture you want to add the MacroTexture to and set its &quot;Macrotexture&quot; property to the texture you imported (or reference with the WetTexture )

# You won't see the MacroTexture in the browser without D3D mode on, but you will see it in game when you run the map.

'''Tarquin:''' HortonWhos ???

'''Mosquito:''' Tim Hortons ofcourse! I've never heard of this MacroTexture stuff before, is it even included in unreal 2 engine builds?

'''MythOpus:''' It should be.  I've seen it before surely.  I think you can make your own Macro materials so, not just assign other textures as a macro.

'''Tarquin:''' well I don't understand these instructions at all. WetTexture? What? The old ones were clearer.

==Examples ==

For example the wall structure on the very first shot repeats which leads to stripes and a kind of pattern. On the second shot there's a macro texture which adds dark/bright shades which make the wall look more natural (similar to detail textures but not if you're close to a wall but on large dimension). Same for the stone in shot 3/4 and the ceiling in 5/6. 

====Here's a basic example of both Detail and Macro Textures in action. ====

'''The following 3 images are the textures used :'''

[[Image:Legacy_jrm_macrotexts.gif|center|The Detail, Standard and MacroTextures]]

In this first shot you can see the detail texture. The source texture had its DrawScale set at 0.250000

[[Image:Legacy_MacroTexture_02.jpeg|center|]]

In this second picture, you can see the &quot;Normal&quot; Texture, with a slight overlay of both Macro and Detail Textures.

[[Image:Legacy_MacroTexture_01.jpeg|center|]]

In this third and final picture, you can see, zoomed out from the surface, the Macro Texture.

The Macrotexture has a DrawScale of 4.00000, making it 4 times as large on the surface as the normal texture.

[[Image:Legacy_MacroTexture_03.jpeg|center|]]

You can download the example map and files at http://wiki.beyondunreal.com/dl.php/wiki/examplemaps/macrotexturetest.zip.

==Related Topics ==
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4509</id>
      <timestamp>2006-11-21T16:14:18Z</timestamp>
      <contributor>
        <ip>61.248.242.84</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">0gjie3h-bjtdwu1-tw6qbbaa http://pokerok.foren-city.de/#1 

&lt;a href=&quot;http://idisk.mac.com/rschunka-Public/index.html#2&quot;&gt;slots&lt;/a&gt; 

[url=http://ulette.foren-city.de/#3]roulette[/url] 

[url]http://sites.blockstar.com/bjack/index.html#4[/url]</text>
    </revision>
    <revision>
      <id>4510</id>
      <timestamp>2006-11-21T16:15:19Z</timestamp>
      <contributor>
        <ip>C-71-230-86-217.hsd1.pa.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">0dqxnvl-m26yg3z-tw6q0bd9 &lt;a href=&quot;http://ulltra.xooit.com#2&quot;&gt;ultram&lt;/a&gt; 

http://idisk.mac.com/rschunka-Public/index.html#1 

[url=http://sites.blockstar.com/bjack/index.html#3]online casino[/url] 

[url]http://crra.foren-city.de/#4[/url]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mad</title>
    <id>2231</id>
    <revision>
      <id>5398</id>
      <timestamp>2006-03-03T05:40:06Z</timestamp>
      <contributor>
        <ip>Mad</ip>
      </contributor>
      <comment>*Added information about Mad.</comment>
      <text xml:space="preserve">===About Me===

Hello everybody. My name is Mitchell and I am a current student at NC State. I have been coding in unrealscript for about 6 months now, and really enjoying it. I currently work in healthcare IT, but would much rather make the jump over to the games industry (My office is right down the road from Epic Games :) ). I use the alias Mad because it is my initials. This is a really great wiki for everyone, and I learn a lot from all the contributors on this site. If you have any comments or questions, just e-mail me at mitchelld02@yahoo.com.

===Contributions===

Mutator Ideas  - RagDollPhysics

Tutorial - Adding a combo with a mutator

Various comments and changes on this site</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MadNad</title>
    <id>1832</id>
    <revision>
      <id>4497</id>
      <timestamp>2004-02-08T10:27:26Z</timestamp>
      <contributor>
        <ip>Www.madnad.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===What's a MadNad===

Often been asked this....Well, back in the days, I wasn't too creative with a game name, so I settled for Nad, which was Dan backwards.  As I got into q3 (did i just say that here?) guys started calling me MadNad after I continuously beat them into the ground.  Well, its just kind of stuck, and when I started my website and got madnad.com, it became very stuck!  Between you and me...I tell everyone that i have one burning inflamed testicle :)

====Personal Info====

I am a Mechanical Engineer living in the US and have really been involved with creating content for games for some time, but it has always been more of a hobby until UT2003.  In fact, I enjoy it so much, that I don't really even play the game that often unless I am testing something (bad Nad).  I've been meaning to come here and share things that I have learned as well, but have been busy/forgetful.  Betweeen work, Excessive, and Troopers, I barely have enough time to sleep.  I'll be coming back and adding some more content soon.

====Contact Info====
* '''Email:''' madnad@madnad.com
*  '''www:'''  http://madnad.com

===Projects===
* [http://PlanetQuake.com/Excessive Mr.Pants' Excessive Overkill for UT2003] - '''''Author'''''
** Flame Thrower - I may release this separatly after Version 2's release
* [http://www.troopers.jolt.co.uk UT2003 Troopers Dawn of Destiny] - '''''Lead Level Designer/Special Effects'''''

===Maps===
* [http://madnad.com/ut2k3/DM-Hecatomb DM-Hecatomb] - '''''Beta'''''
** I would like to finish this someday :)

===Journal===

====ExcessiveV2:====

I have been developing version 2 of Mr.Pants' Excessive Overkill for UT2003, adding numerous new features, and fixes.  BTW, I have only released one version of excessive, no patches.  I am a firm believer in big fixes and not small patches.  I would like people to be able to say...&quot;I like version 2 better than version 1 for these reasons...&quot;    Heres a current list of changes since version 1 was released.

'''''Game'''''
* New Excessive Menu 
* Decreased PlayerSpeed 
* Default Gravity back from 85% Gravity 
* Fixed Health Kegs - allowing for health up to maxHealth 
* Added left hand and centered weapon support - need to fix akimbo Centered weapon 
* Add support for new Epic Gametypes (invasion completed) 
* Add custom crosshair support 
* Removed xWeaponBases off and online (thx Wormbo)
* Adrenaline 
** Slower Adrenaline Award by excessive 
** Added Random Teleport Combo Move 
** Fix health Regeneration Combo move only charging to 200 and increase rate of recharge 

'''''Weapons '''''
*Translocator 
** Configurable TransExplosion on/off 
** Lower Volume on TransExplosion 
** Increase TransBeacon speed 
** Fixed da stupid bots 

*Shield Gun 
** Decrease shield Jumping strength (configurable) 
** Fix Charge fx - (not charging in sync with weapon) 
** Increase shield effectiveness 
** [http://madnad.com/ExcessiveUT2k3/ShieldEX.jpg?link Full_Body_Shield]
*** Blocks all attacks 
*** Reflects most projectiles 
** Decrease Ammo (15) 
** Added sprint mode to shield alt fire if you have more than 10 ammo.  Cannot reuse till shield has fully recharged again.

*Assault Rifle 
** The Excessive Akimbo weapon 
** Increase accuracy 
** Momentum push
** Toggle from bouncy grenades or explode on impact grenades 

*Bio Rifle 
** Increase damage 
** Increse number of globs
** Increase bio glob life (3 seconds) 

*Shock Rifle 
** Increase damage on Primary Fire / Decrease fire rate 
** Secondary configure # of chain reaction balls (configurable) 
** Limited combo explosion sounds to 2 per stream

*Minigun 
** Increase primary fire damage 
** Add sounds for explosions on secondary fire 
** Increase player push on secondary fire 
** Decrease secondary hurtRadius damage 

*LinkGun 
** Fixed bot linking 
** Add Link beam explosion hit sounds 
** Decrease Link Projecitle momentum on victim 
** Increase Link Projecitle momentum on self 
** Burn sound bFullVolume=False

*Flak Cannon 
** Concentrate primary fire more and increase fire rate 
** Increase damage on secondary and get more randomness on the 3 spawning shells 
** Flak jumping toned down

*Rocket Launcher 
** Semi Auto : server configurable variable 
** Fixed rocket Launch (not straight up while running forward) 
** Increased locking ability
** Added acceleration to rockets

*Sniper Rifle 
** Increase headshot radius (headshot=kill)
** More arcs with more damage 

*Redeemer 
** Spawn drunken rockets on impact as initially planned &amp;ndash; Needs fixin 

*Ion Cannon 
** Fix plasma balls not being destroyed when they hit a wall 

*Flame Thrower 
** Add it to the arsenal but making it possible to disable as well 

[http://madnad.com/ExcessiveUT2k3/FlameThrower/Model/Flamethrower1.jpg?link FlameThrower_Incompleted]

'''''Server Side Config Variables'''''

[http://madnad.com/ExcessiveUT2k3/ServerMenu.jpg?link ServerMenu_Screenshot]

'''''Client Side Config Variables''''' 

[http://madnad.com/ExcessiveUT2k3/ClientMenu.jpg?link ClientMenu_Screenshot]

==September, 19th 2003 ==

I've updated the rockets to behave more like rockets.  They actually have an acceleration and a maxspeed now, which really makes them feel more natural.  

==September, 24th 2003 ==

I have had some resistance to the &quot;Realistic Rockets&quot; with my beta team.  After I was told that ChaosUT2 had similar physics involved with their grandes, I contacted them and asked what type of public feedback they received.  Unfortunatley, I was told that they public did not like the added weapon inaccuracies that came along with the added physics.  So, I've opted to make that feature a setting in the server configuration.  

But, I couldn't resist experimenting some more.  I tried adding various percentages of the Instigator.Velocity to the rocket velocity.  This was successful IMO, but I still encountered some resistance, something about Real in Unreal. :)  One of the main issues I was trying to solve by adding the Instigator.velocity was the fact that when rocket jumping, you can actually be falling faster than your rockets shoot, thus raining down rockets on yourself....not really ideal.  The last fix i did was a little more unique.  I decided to do away with the instigator velocity addition in all axis, and instead the Instigator.Velocity.Z is added to the rockets if your are falling.  Firstly, I calculate the instigator.pitch, and if you are looking straight down, I add 7/8 of the Istigator.Velocity.Z to the rocket velocity, but if you are looking level (pitch=0) then I add 0% of the instigator.Velocity.z to the rockets.  This accomplished the raining rockets down upon yourself syndrome, while retaining the weapons accuracy.  I am quite pleased atm, I hope I get some good response from my testers.  

Heres basically how i did it in PostBeginPlay() of the RocketProjectile

&lt;uscript&gt;
if ( Instigator != None &amp;&amp; Instigator.Physics == Phys_Falling )
{
    // Get the pitch of the player
    InstigatorPitch=ExcessivePlayerController(Instigator.Controller).Rotation.Pitch;

    // Is player looking down?  How much? 
    if ( InstigatorPitch &gt; 49152 &amp;&amp; InstigatorPitch &lt; 65536 )
        InstigatorPitch = 65536 - InstigatorPitch;

     Velocity = (speed * Dir ) ;
     
     // Add veloctiy to the rockets
     Velocity.Z +=  0.875 * (( Sin ( pi * InstigatorPitch/16384 + 3*pi/2) + 1) * 0.5 )  * OwnerVelocity.Z;
	             		 
}
&lt;/uscript&gt;

I also added the Flamethrower model ingame, with pilot light, sounds &amp; animation.  I even added a rest animation if you are not moving for 10+ seconds your dude pulls the weapon close and flips a few switches.  The model looks outstanding in game even using the link texture as a place holder.  Check it out: [http://madnad.com/ExcessiveUT2k3/Flamethrower/thrower_1st.jpg?link 1st_person] [http://madnad.com/ExcessiveUT2k3/Flamethrower/FT_3rd.jpg?link 3rd_person] [http://madnad.com/ExcessiveUT2k3/Flamethrower/FT_1std.jpg?link 1st_person_flamage]

==September, 29th 2003 ==

I didn't realize how easy it was going to be to have excessive compatable with Mutant and Last Man Standing.  Excessive was released prior to these new gametypes, along with invasion, and was able to get them all compatable without having to make excessive dependent on the bonus pack, which was what I'd hoped to do.  Who wants to download 100+ MB's for a mod/mutator that is less than 1MB.  The issues that caused the compatablity issues just had to deal with removing all standard weapons every spawn, and then adding excessive weapons.  The invasion gametype was similarily supported by checking to make sure the timer wasn't used for the monsters from the excessive mutator.

I also fixed the twirl formation rockets only spawning as if you were right handed even if you were left handed.  It seems that the Rocket Launcher is this way in standard play.  Wonder if anyone mentioned this to Epic?

==November, 1st 2003 ==

Excsesive was released in time for the MSU, I just haven't publically announced it yet.  I figured I'd wait till after the weekend since there werer a whored of mods were released.  Its available on my site http://madnad.com/ExcessiveUT2k3 .

Enjoy

'''''End'''''

----

'''Dark Pulse:''' IF that's your first 2k3 map, you've either got a whole lot of experience on UT, or you're extremely talented. :)

'''EntropicLqd:''' Hi, welcome to the Wiki.

'''MadNad:'''  Thanks guys...and thx for the compliment Dark Pulse :)  Your closer with the latter of the two...I only made a couple of unreleased maps for ut

'''Dark Pulse:''' Sheeze, I've released Four maps for UT and they don't look that good. Two of them aren't even technically mine, but Revamped versions of existing UT levels, those are the only two that come that close...

BTW; I noticed on your page you go a vid of a Quake III Level up, displaying stats on the server. Got a Fw Q's:

1) How did you make that?

2) What's the music that plays during the Vid

Thanks Madnad. Bye now. :)

'''MadNad:''' Thats a stats program I am working on with my brother.  It will work for all q3engine games.  Currently, we have it working for JK2 and Q3 (and their mods).  The version you see on the site is an older version that was done in vbs, by just parsing the qconsole.log file.  The newer version will be a vb verion that will have a lot more options and will run much better performance wise.  As far as the music, it changes depending on the map.  I did all the web based stuff, html, javascript, flash, asp and my brother is doing the coding for parsing the logs, well, the actual program to be precise.  The program can be running more than 1 game for stats at the same time and could be a completely different game, ie jk2 ffa &amp; q3 tdm at the same time, and you can have it updates stats every x minutes, which is configurable.  

Unfortunately, well for me anyway :), my brother has been busy with his newest member of the family and has not had a chance to work on it for a couple of months.  Here is the latest web version http://madnad.com/newstats (minus the video).    And here is the one running jedi:  http://madnad.com/jedistats .  Jedi is running the old version as well

'''Dark Pulse:''' Interesting. Heh, I was wrangling with ngStats early this morening to get my UT server's stats up, and I finally did it.

How'd you make the videos? Did you just use some kind of screen/sound recorder?

'''MadNad:'''  Nope,  I used a q3 command, something like cl_avidemo 24 which will export 24 fps images out to the screenshots folder.  Then i used something to bring them together and added the music, and imported to flash...but I could do it with my capture card that I have gotten since.

'''Dark Pulse:''' Hmm... Is there any similar command in UT? I know there's one in 2003.

'''MadNad:''' Not that I am aware of.  Whats the command for ut2k3?  I wasn't even aware fo that one.  On another note, I tried to just paste a link to those images, but the link displays the image..hmmm

'''MythOpus:''' Hey...  You might want to update the the 

troopers title to avoid any more battles with BK ;)

'''MadNad:''' Thx bud.  I overlooked that.  Wonder if I left anything else with the old title :stupid:

'''MythOpus:''' Hey again Mad. I'm at school and noticed you on... sup man ?

'''MadNad:''' uhh...hey

'''MythOpus:''' MadNad, Grafik is helping me with my Paint Ball Mod and I'm using his no gore code so I was wondering if you cna look at all source of LaserWar2003 (his mod) and see if you can get an Emitter to get spawned after a Player/Pawn dies.  Look at Grafiks dev journal for the source code :D if you are going to help me/us :D Thanks :D hehe

'''GRAF1K:''' Nervermind, done. :-)

----

'''MadNad:''' Good to hear... there are probably better ways to get a hold of me than posting here.  Just use my email i provided up top :)  cheers
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4498</id>
      <timestamp>2003-11-02T12:46:11Z</timestamp>
      <contributor>
        <ip>MadNad</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===What's a MadNad===

Often been asked this....Well, back in the days, I wasn't too creative with a game name, so I settled for Nad, which was Dan backwards.  As I got into q3 (did i just say that here?) guys started calling me MadNad after I continuously beat them into the ground.  Well, its just kind of stuck, and when I started my website and got madnad.com, it became very stuck!  Between you and me...I tell everyone that i have one burning inflamed testicle :)

====Personal Info====

I am a Mechanical Engineer living in the US and have really been involved with creating content for games for some time, but it has always been more of a hobby until UT2003.  In fact, I enjoy it so much, that I don't really even play the game that often unless I am testing something (bad Nad).  I've been meaning to come here and share things that I have learned as well, but have been busy/forgetful.  Betweeen work, Excessive, and Troopers, I barely have enough time to sleep.  I'll be coming back and adding some more content soon.

====Contact Info====
* '''Email:''' madnad@madnad.com
*  '''www:'''  http://madnad.com

===Projects===
* [http://PlanetQuake.com/Excessive Mr.Pants' Excessive Overkill for UT2003] - '''''Author'''''
** Flame Thrower - I may release this separatly after Version 2's release
* [http://www.troopers.jolt.co.uk UT2003 Troopers Dawn of Destiny] - '''''Lead Level Designer/Special Effects'''''
* Ethereal (unannounced/on hold) - '''''Lead Coder'''''

===Maps===
* [http://madnad.com/ut2k3/DM-Hecatomb DM-Hecatomb] - '''''Beta'''''
** I would like to finish this someday :)

===Journal===

====ExcessiveV2:====

I have been developing version 2 of Mr.Pants' Excessive Overkill for UT2003, adding numerous new features, and fixes.  BTW, I have only released one version of excessive, no patches.  I am a firm believer in big fixes and not small patches.  I would like people to be able to say...&quot;I like version 2 better than version 1 for these reasons...&quot;    Heres a current list of changes since version 1 was released.

'''''Game'''''
* New Excessive Menu 
* Decreased PlayerSpeed 
* Default Gravity back from 85% Gravity 
* Fixed Health Kegs - allowing for health up to maxHealth 
* Added left hand and centered weapon support - need to fix akimbo Centered weapon 
* Add support for new Epic Gametypes (invasion completed) 
* Add custom crosshair support 
* Removed xWeaponBases off and online (thx Wormbo)
* Adrenaline 
** Slower Adrenaline Award by excessive 
** Added Random Teleport Combo Move 
** Fix health Regeneration Combo move only charging to 200 and increase rate of recharge 

'''''Weapons '''''
*Translocator 
** Configurable TransExplosion on/off 
** Lower Volume on TransExplosion 
** Increase TransBeacon speed 
** Fixed da stupid bots 

*Shield Gun 
** Decrease shield Jumping strength (configurable) 
** Fix Charge fx - (not charging in sync with weapon) 
** Increase shield effectiveness 
** [http://madnad.com/ExcessiveUT2k3/ShieldEX.jpg?link Full_Body_Shield]
*** Blocks all attacks 
*** Reflects most projectiles 
** Decrease Ammo (15) 
** Added sprint mode to shield alt fire if you have more than 10 ammo.  Cannot reuse till shield has fully recharged again.

*Assault Rifle 
** The Excessive Akimbo weapon 
** Increase accuracy 
** Momentum push
** Toggle from bouncy grenades or explode on impact grenades 

*Bio Rifle 
** Increase damage 
** Increse number of globs
** Increase bio glob life (3 seconds) 

*Shock Rifle 
** Increase damage on Primary Fire / Decrease fire rate 
** Secondary configure # of chain reaction balls (configurable) 
** Limited combo explosion sounds to 2 per stream

*Minigun 
** Increase primary fire damage 
** Add sounds for explosions on secondary fire 
** Increase player push on secondary fire 
** Decrease secondary hurtRadius damage 

*LinkGun 
** Fixed bot linking 
** Add Link beam explosion hit sounds 
** Decrease Link Projecitle momentum on victim 
** Increase Link Projecitle momentum on self 
** Burn sound bFullVolume=False

*Flak Cannon 
** Concentrate primary fire more and increase fire rate 
** Increase damage on secondary and get more randomness on the 3 spawning shells 
** Flak jumping toned down

*Rocket Launcher 
** Semi Auto : server configurable variable 
** Fixed rocket Launch (not straight up while running forward) 
** Increased locking ability
** Added acceleration to rockets

*Sniper Rifle 
** Increase headshot radius (headshot=kill)
** More arcs with more damage 

*Redeemer 
** Spawn drunken rockets on impact as initially planned &amp;ndash; Needs fixin 

*Ion Cannon 
** Fix plasma balls not being destroyed when they hit a wall 

*Flame Thrower 
** Add it to the arsenal but making it possible to disable as well 

[http://madnad.com/ExcessiveUT2k3/FlameThrower/Model/Flamethrower1.jpg?link FlameThrower_Incompleted]

'''''Server Side Config Variables'''''

[http://madnad.com/ExcessiveUT2k3/ServerMenu.jpg?link ServerMenu_Screenshot]

'''''Client Side Config Variables''''' 

[http://madnad.com/ExcessiveUT2k3/ClientMenu.jpg?link ClientMenu_Screenshot]

==September, 19th 2003 ==

I've updated the rockets to behave more like rockets.  They actually have an acceleration and a maxspeed now, which really makes them feel more natural.  

==September, 24th 2003 ==

I have had some resistance to the &quot;Realistic Rockets&quot; with my beta team.  After I was told that ChaosUT2 had similar physics involved with their grandes, I contacted them and asked what type of public feedback they received.  Unfortunatley, I was told that they public did not like the added weapon inaccuracies that came along with the added physics.  So, I've opted to make that feature a setting in the server configuration.  

But, I couldn't resist experimenting some more.  I tried adding various percentages of the Instigator.Velocity to the rocket velocity.  This was successful IMO, but I still encountered some resistance, something about Real in Unreal. :)  One of the main issues I was trying to solve by adding the Instigator.velocity was the fact that when rocket jumping, you can actually be falling faster than your rockets shoot, thus raining down rockets on yourself....not really ideal.  The last fix i did was a little more unique.  I decided to do away with the instigator velocity addition in all axis, and instead the Instigator.Velocity.Z is added to the rockets if your are falling.  Firstly, I calculate the instigator.pitch, and if you are looking straight down, I add 7/8 of the Istigator.Velocity.Z to the rocket velocity, but if you are looking level (pitch=0) then I add 0% of the instigator.Velocity.z to the rockets.  This accomplished the raining rockets down upon yourself syndrome, while retaining the weapons accuracy.  I am quite pleased atm, I hope I get some good response from my testers.  

Heres basically how i did it in PostBeginPlay() of the RocketProjectile

&lt;uscript&gt;
if ( Instigator != None &amp;&amp; Instigator.Physics == Phys_Falling )
{
    // Get the pitch of the player
    InstigatorPitch=ExcessivePlayerController(Instigator.Controller).Rotation.Pitch;

    // Is player looking down?  How much? 
    if ( InstigatorPitch &gt; 49152 &amp;&amp; InstigatorPitch &lt; 65536 )
        InstigatorPitch = 65536 - InstigatorPitch;

     Velocity = (speed * Dir ) ;
     
     // Add veloctiy to the rockets
     Velocity.Z +=  0.875 * (( Sin ( pi * InstigatorPitch/16384 + 3*pi/2) + 1) * 0.5 )  * OwnerVelocity.Z;
	             		 
}
&lt;/uscript&gt;

I also added the Flamethrower model ingame, with pilot light, sounds &amp; animation.  I even added a rest animation if you are not moving for 10+ seconds your dude pulls the weapon close and flips a few switches.  The model looks outstanding in game even using the link texture as a place holder.  Check it out: [http://madnad.com/ExcessiveUT2k3/Flamethrower/thrower_1st.jpg?link 1st_person] [http://madnad.com/ExcessiveUT2k3/Flamethrower/FT_3rd.jpg?link 3rd_person] [http://madnad.com/ExcessiveUT2k3/Flamethrower/FT_1std.jpg?link 1st_person_flamage]

==September, 29th 2003 ==

I didn't realize how easy it was going to be to have excessive compatable with Mutant and Last Man Standing.  Excessive was released prior to these new gametypes, along with invasion, and was able to get them all compatable without having to make excessive dependent on the bonus pack, which was what I'd hoped to do.  Who wants to download 100+ MB's for a mod/mutator that is less than 1MB.  The issues that caused the compatablity issues just had to deal with removing all standard weapons every spawn, and then adding excessive weapons.  The invasion gametype was similarily supported by checking to make sure the timer wasn't used for the monsters from the excessive mutator.

I also fixed the twirl formation rockets only spawning as if you were right handed even if you were left handed.  It seems that the Rocket Launcher is this way in standard play.  Wonder if anyone mentioned this to Epic?

'''''End'''''

----

'''Dark Pulse:''' IF that's your first 2k3 map, you've either got a whole lot of experience on UT, or you're extremely talented. :)

----

'''EntropicLqd:''' Hi, welcome to the Wiki.

----

'''MadNad:'''  Thanks guys...and thx for the compliment Dark Pulse :)  Your closer with the latter of the two...I only made a couple of unreleased maps for ut

----

'''Dark Pulse:''' Sheeze, I've released Four maps for UT and they don't look that good. Two of them aren't even technically mine, but Revamped versions of existing UT levels, those are the only two that come that close...

BTW; I noticed on your page you go a vid of a Quake III Level up, displaying stats on the server. Got a Fw Q's:

1) How did you make that?

2) What's the music that plays during the Vid

Thanks Madnad. Bye now. :)

----

'''MadNad:''' Thats a stats program I am working on with my brother.  It will work for all q3engine games.  Currently, we have it working for JK2 and Q3 (and their mods).  The version you see on the site is an older version that was done in vbs, by just parsing the qconsole.log file.  The newer version will be a vb verion that will have a lot more options and will run much better performance wise.  As far as the music, it changes depending on the map.  I did all the web based stuff, html, javascript, flash, asp and my brother is doing the coding for parsing the logs, well, the actual program to be precise.  The program can be running more than 1 game for stats at the same time and could be a completely different game, ie jk2 ffa &amp; q3 tdm at the same time, and you can have it updates stats every x minutes, which is configurable.  

Unfortunately, well for me anyway :), my brother has been busy with his newest member of the family and has not had a chance to work on it for a couple of months.  Here is the latest web version http://madnad.com/newstats (minus the video).    And here is the one running jedi:  http://madnad.com/jedistats .  Jedi is running the old version as well

----

'''Dark Pulse:''' Interesting. Heh, I was wrangling with ngStats early this morening to get my UT server's stats up, and I finally did it.

How'd you make the videos? Did you just use some kind of screen/sound recorder?

----

'''MadNad:'''  Nope,  I used a q3 command, something like cl_avidemo 24 which will export 24 fps images out to the screenshots folder.  Then i used something to bring them together and added the music, and imported to flash...but I could do it with my capture card that I have gotten since.

----

'''Dark Pulse:''' Hmm... Is there any similar command in UT? I know there's one in 2003.

----

'''MadNad:''' Not that I am aware of.  Whats the command for ut2k3?  I wasn't even aware fo that one.  On another note, I tried to just paste a link to those images, but the link displays the image..hmmm

'''MythOpus:''' Hey...  You might want to update the the 

troopers title to avoid any more battles with BK ;)

'''MadNad:''' Thx bud.  I overlooked that.  Wonder if I left anything else with the old title :stupid:

'''MythOpus:''' Hey again Mad. I'm at school and noticed you on... sup man ?

'''MadNad:''' uhh...hey

'''MythOpus:''' MadNad, Grafik is helping me with my Paint Ball Mod and I'm using his no gore code so I was wondering if you cna look at all source of LaserWar2003 (his mod) and see if you can get an Emitter to get spawned after a Player/Pawn dies.  Look at Grafiks dev journal for the source code :D if you are going to help me/us :D Thanks :D hehe

'''GRAF1K:''' Nervermind, done. :-)

----

'''MadNad:''' Good to hear... there are probably better ways to get a hold of me than posting here.  Just use my email i provided up top :)  cheers
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4499</id>
      <timestamp>2003-11-02T12:51:48Z</timestamp>
      <contributor>
        <ip>MadNad</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===What's a MadNad===

Often been asked this....Well, back in the days, I wasn't too creative with a game name, so I settled for Nad, which was Dan backwards.  As I got into q3 (did i just say that here?) guys started calling me MadNad after I continuously beat them into the ground.  Well, its just kind of stuck, and when I started my website and got madnad.com, it became very stuck!  Between you and me...I tell everyone that i have one burning inflamed testicle :)

====Personal Info====

I am a Mechanical Engineer living in the US and have really been involved with creating content for games for some time, but it has always been more of a hobby until UT2003.  In fact, I enjoy it so much, that I don't really even play the game that often unless I am testing something (bad Nad).  I've been meaning to come here and share things that I have learned as well, but have been busy/forgetful.  Betweeen work, Excessive, and Troopers, I barely have enough time to sleep.  I'll be coming back and adding some more content soon.

====Contact Info====
* '''Email:''' madnad@madnad.com
*  '''www:'''  http://madnad.com

===Projects===
* [http://PlanetQuake.com/Excessive Mr.Pants' Excessive Overkill for UT2003] - '''''Author'''''
** Flame Thrower - I may release this separatly after Version 2's release
* [http://www.troopers.jolt.co.uk UT2003 Troopers Dawn of Destiny] - '''''Lead Level Designer/Special Effects'''''
* Ethereal (unannounced/on hold) - '''''Lead Coder'''''

===Maps===
* [http://madnad.com/ut2k3/DM-Hecatomb DM-Hecatomb] - '''''Beta'''''
** I would like to finish this someday :)

===Journal===

====ExcessiveV2:====

I have been developing version 2 of Mr.Pants' Excessive Overkill for UT2003, adding numerous new features, and fixes.  BTW, I have only released one version of excessive, no patches.  I am a firm believer in big fixes and not small patches.  I would like people to be able to say...&quot;I like version 2 better than version 1 for these reasons...&quot;    Heres a current list of changes since version 1 was released.

'''''Game'''''
* New Excessive Menu 
* Decreased PlayerSpeed 
* Default Gravity back from 85% Gravity 
* Fixed Health Kegs - allowing for health up to maxHealth 
* Added left hand and centered weapon support - need to fix akimbo Centered weapon 
* Add support for new Epic Gametypes (invasion completed) 
* Add custom crosshair support 
* Removed xWeaponBases off and online (thx Wormbo)
* Adrenaline 
** Slower Adrenaline Award by excessive 
** Added Random Teleport Combo Move 
** Fix health Regeneration Combo move only charging to 200 and increase rate of recharge 

'''''Weapons '''''
*Translocator 
** Configurable TransExplosion on/off 
** Lower Volume on TransExplosion 
** Increase TransBeacon speed 
** Fixed da stupid bots 

*Shield Gun 
** Decrease shield Jumping strength (configurable) 
** Fix Charge fx - (not charging in sync with weapon) 
** Increase shield effectiveness 
** [http://madnad.com/ExcessiveUT2k3/ShieldEX.jpg?link Full_Body_Shield]
*** Blocks all attacks 
*** Reflects most projectiles 
** Decrease Ammo (15) 
** Added sprint mode to shield alt fire if you have more than 10 ammo.  Cannot reuse till shield has fully recharged again.

*Assault Rifle 
** The Excessive Akimbo weapon 
** Increase accuracy 
** Momentum push
** Toggle from bouncy grenades or explode on impact grenades 

*Bio Rifle 
** Increase damage 
** Increse number of globs
** Increase bio glob life (3 seconds) 

*Shock Rifle 
** Increase damage on Primary Fire / Decrease fire rate 
** Secondary configure # of chain reaction balls (configurable) 
** Limited combo explosion sounds to 2 per stream

*Minigun 
** Increase primary fire damage 
** Add sounds for explosions on secondary fire 
** Increase player push on secondary fire 
** Decrease secondary hurtRadius damage 

*LinkGun 
** Fixed bot linking 
** Add Link beam explosion hit sounds 
** Decrease Link Projecitle momentum on victim 
** Increase Link Projecitle momentum on self 
** Burn sound bFullVolume=False

*Flak Cannon 
** Concentrate primary fire more and increase fire rate 
** Increase damage on secondary and get more randomness on the 3 spawning shells 
** Flak jumping toned down

*Rocket Launcher 
** Semi Auto : server configurable variable 
** Fixed rocket Launch (not straight up while running forward) 
** Increased locking ability
** Added acceleration to rockets

*Sniper Rifle 
** Increase headshot radius (headshot=kill)
** More arcs with more damage 

*Redeemer 
** Spawn drunken rockets on impact as initially planned &amp;ndash; Needs fixin 

*Ion Cannon 
** Fix plasma balls not being destroyed when they hit a wall 

*Flame Thrower 
** Add it to the arsenal but making it possible to disable as well 

[http://madnad.com/ExcessiveUT2k3/FlameThrower/Model/Flamethrower1.jpg?link FlameThrower_Incompleted]

'''''Server Side Config Variables'''''

[http://madnad.com/ExcessiveUT2k3/ServerMenu.jpg?link ServerMenu_Screenshot]

'''''Client Side Config Variables''''' 

[http://madnad.com/ExcessiveUT2k3/ClientMenu.jpg?link ClientMenu_Screenshot]

==September, 19th 2003 ==

I've updated the rockets to behave more like rockets.  They actually have an acceleration and a maxspeed now, which really makes them feel more natural.  

==September, 24th 2003 ==

I have had some resistance to the &quot;Realistic Rockets&quot; with my beta team.  After I was told that ChaosUT2 had similar physics involved with their grandes, I contacted them and asked what type of public feedback they received.  Unfortunatley, I was told that they public did not like the added weapon inaccuracies that came along with the added physics.  So, I've opted to make that feature a setting in the server configuration.  

But, I couldn't resist experimenting some more.  I tried adding various percentages of the Instigator.Velocity to the rocket velocity.  This was successful IMO, but I still encountered some resistance, something about Real in Unreal. :)  One of the main issues I was trying to solve by adding the Instigator.velocity was the fact that when rocket jumping, you can actually be falling faster than your rockets shoot, thus raining down rockets on yourself....not really ideal.  The last fix i did was a little more unique.  I decided to do away with the instigator velocity addition in all axis, and instead the Instigator.Velocity.Z is added to the rockets if your are falling.  Firstly, I calculate the instigator.pitch, and if you are looking straight down, I add 7/8 of the Istigator.Velocity.Z to the rocket velocity, but if you are looking level (pitch=0) then I add 0% of the instigator.Velocity.z to the rockets.  This accomplished the raining rockets down upon yourself syndrome, while retaining the weapons accuracy.  I am quite pleased atm, I hope I get some good response from my testers.  

Heres basically how i did it in PostBeginPlay() of the RocketProjectile

&lt;uscript&gt;
if ( Instigator != None &amp;&amp; Instigator.Physics == Phys_Falling )
{
    // Get the pitch of the player
    InstigatorPitch=ExcessivePlayerController(Instigator.Controller).Rotation.Pitch;

    // Is player looking down?  How much? 
    if ( InstigatorPitch &gt; 49152 &amp;&amp; InstigatorPitch &lt; 65536 )
        InstigatorPitch = 65536 - InstigatorPitch;

     Velocity = (speed * Dir ) ;
     
     // Add veloctiy to the rockets
     Velocity.Z +=  0.875 * (( Sin ( pi * InstigatorPitch/16384 + 3*pi/2) + 1) * 0.5 )  * OwnerVelocity.Z;
	             		 
}
&lt;/uscript&gt;

I also added the Flamethrower model ingame, with pilot light, sounds &amp; animation.  I even added a rest animation if you are not moving for 10+ seconds your dude pulls the weapon close and flips a few switches.  The model looks outstanding in game even using the link texture as a place holder.  Check it out: [http://madnad.com/ExcessiveUT2k3/Flamethrower/thrower_1st.jpg?link 1st_person] [http://madnad.com/ExcessiveUT2k3/Flamethrower/FT_3rd.jpg?link 3rd_person] [http://madnad.com/ExcessiveUT2k3/Flamethrower/FT_1std.jpg?link 1st_person_flamage]

==September, 29th 2003 ==

I didn't realize how easy it was going to be to have excessive compatable with Mutant and Last Man Standing.  Excessive was released prior to these new gametypes, along with invasion, and was able to get them all compatable without having to make excessive dependent on the bonus pack, which was what I'd hoped to do.  Who wants to download 100+ MB's for a mod/mutator that is less than 1MB.  The issues that caused the compatablity issues just had to deal with removing all standard weapons every spawn, and then adding excessive weapons.  The invasion gametype was similarily supported by checking to make sure the timer wasn't used for the monsters from the excessive mutator.

I also fixed the twirl formation rockets only spawning as if you were right handed even if you were left handed.  It seems that the Rocket Launcher is this way in standard play.  Wonder if anyone mentioned this to Epic?

==November, 1st 2003 ==

Excsesive was released in time for the MSU, I just haven't publically announced it yet.  I figured I'd wait till after the weekend since there werer a whored of mods were released.  Its available on my site http://madnad.com/ExcessiveUT2k3 .

Enjoy

'''''End'''''

----

'''Dark Pulse:''' IF that's your first 2k3 map, you've either got a whole lot of experience on UT, or you're extremely talented. :)

'''EntropicLqd:''' Hi, welcome to the Wiki.

'''MadNad:'''  Thanks guys...and thx for the compliment Dark Pulse :)  Your closer with the latter of the two...I only made a couple of unreleased maps for ut

'''Dark Pulse:''' Sheeze, I've released Four maps for UT and they don't look that good. Two of them aren't even technically mine, but Revamped versions of existing UT levels, those are the only two that come that close...

BTW; I noticed on your page you go a vid of a Quake III Level up, displaying stats on the server. Got a Fw Q's:

1) How did you make that?

2) What's the music that plays during the Vid

Thanks Madnad. Bye now. :)

'''MadNad:''' Thats a stats program I am working on with my brother.  It will work for all q3engine games.  Currently, we have it working for JK2 and Q3 (and their mods).  The version you see on the site is an older version that was done in vbs, by just parsing the qconsole.log file.  The newer version will be a vb verion that will have a lot more options and will run much better performance wise.  As far as the music, it changes depending on the map.  I did all the web based stuff, html, javascript, flash, asp and my brother is doing the coding for parsing the logs, well, the actual program to be precise.  The program can be running more than 1 game for stats at the same time and could be a completely different game, ie jk2 ffa &amp; q3 tdm at the same time, and you can have it updates stats every x minutes, which is configurable.  

Unfortunately, well for me anyway :), my brother has been busy with his newest member of the family and has not had a chance to work on it for a couple of months.  Here is the latest web version http://madnad.com/newstats (minus the video).    And here is the one running jedi:  http://madnad.com/jedistats .  Jedi is running the old version as well

'''Dark Pulse:''' Interesting. Heh, I was wrangling with ngStats early this morening to get my UT server's stats up, and I finally did it.

How'd you make the videos? Did you just use some kind of screen/sound recorder?

'''MadNad:'''  Nope,  I used a q3 command, something like cl_avidemo 24 which will export 24 fps images out to the screenshots folder.  Then i used something to bring them together and added the music, and imported to flash...but I could do it with my capture card that I have gotten since.

'''Dark Pulse:''' Hmm... Is there any similar command in UT? I know there's one in 2003.

'''MadNad:''' Not that I am aware of.  Whats the command for ut2k3?  I wasn't even aware fo that one.  On another note, I tried to just paste a link to those images, but the link displays the image..hmmm

'''MythOpus:''' Hey...  You might want to update the the 

troopers title to avoid any more battles with BK ;)

'''MadNad:''' Thx bud.  I overlooked that.  Wonder if I left anything else with the old title :stupid:

'''MythOpus:''' Hey again Mad. I'm at school and noticed you on... sup man ?

'''MadNad:''' uhh...hey

'''MythOpus:''' MadNad, Grafik is helping me with my Paint Ball Mod and I'm using his no gore code so I was wondering if you cna look at all source of LaserWar2003 (his mod) and see if you can get an Emitter to get spawned after a Player/Pawn dies.  Look at Grafiks dev journal for the source code :D if you are going to help me/us :D Thanks :D hehe

'''GRAF1K:''' Nervermind, done. :-)

----

'''MadNad:''' Good to hear... there are probably better ways to get a hold of me than posting here.  Just use my email i provided up top :)  cheers
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MadameArsenic</title>
    <id>2238</id>
    <revision>
      <id>5408</id>
      <timestamp>2006-12-16T12:58:00Z</timestamp>
      <contributor>
        <ip>Jrubzjeknf</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello.

I'm a Game and Simulation Design student working with the Unreal 3 engine. If you play much, I belong to the Omnipotents, a clan that just likes to have fun and provides the best AS server for 2k4.

My current project is my final culmination before the release of 2k7: AS-LavaStronghold.

==Comments==

'''Wormbo:''' Welcome to the UnrealWiki! :)

'''Jrubzjeknf:''' Welcome, Madame! :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5409</id>
      <timestamp>2006-12-16T12:32:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello.

I'm a Game and Simulation Design student working with the Unreal 3 engine. If you play much, I belong to the Omnipotents, a clan that just likes to have fun and provides the best AS server for 2k4.

My current project is my final culmination before the release of 2k7: AS-LavaStronghold.

==Comments==

'''Wormbo:''' Welcome to the UnrealWiki! :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maintaining Compatibility</title>
    <id>2051</id>
    <revision>
      <id>5000</id>
      <timestamp>2005-08-31T15:54:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>what's the &quot;way in&quot;?</comment>
      <text xml:space="preserve">''The idea behind this page is [http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=228918 this Infogrames Forum thread] and [http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=247052 this other Infogrames Forum thread] further pushed it. :)''

''For those who doubt Epic's intentions as to what a mutator should do you need look no further than the header comments in Engine.Mutator.

{{innerbox| Mutators allow modifications to gameplay while keeping the game rules intact.

}}

There are several problems when coding a new mutator or gametype. This page deals with problems that are often neglected: Compatibility with other mods and mutators.

This page can probably be divided in subpages for Game Types and Mutators later, but for now two headings should be enough.

==Mutators ==

Avoid replacing [[Legacy:GameInfo|GameInfo]]-specific classes such as the [[Legacy:HUD|HUD]], the [[Legacy:ScoreBoard|ScoreBoard]], the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s (or PRI for short), [[Legacy:Pawn|Pawn]] classes, [[Legacy:Controller|Controller]] classes and the [[Legacy:GameReplicationInfo|GameReplicationInfo]] (GRI).

Just imagine what happens when two mutators try to replace the PRI with their own versions. One of the mutators definately won't work. Maybe the gametype itself depends on its own PRI class, so both mutators can't be used with that gametype.

How to work round these problems:

===HUD / ScoreBoard Additions ===

Use [[Legacy:Interaction|Interaction]]s for this.

===Storing and/or Replicating Per-Player Information ===

Sure, the most straightforward idea is replacing the PRI, but there's another way: Create your own [[Legacy:ReplicationInfo|ReplicationInfo]] subclass. This class might look like this:

&lt;uscript&gt;
class MyReplicationInfo extends ReplicationInfo;

var PlayerReplicationInfo MyPRI;  // Pawns or Controllers aren't generally available on clients
var int MyImportantVariable;      // the value you want to replicate per-player

replication
{
    unreliable if ( Role == ROLE_Authority )
        MyPRI, MyImportantVariable;
}
&lt;/uscript&gt;

You only need to find and use the new MyReplicationInfo actors now. If you set the &lt;code&gt;MyPRI&lt;/code&gt; variable to reference the associate player's [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]], that's easily done both server- and client-side with the DynamicActors [[Legacy:Iterator|iterator]]:

&lt;uscript&gt;
function MyReplicationInfo FindInfoFor(PlayerReplicationInfo PRI)
{
    local MyReplicationInfo MyReplicationInfo;

    foreach DynamicActors(Class'MyReplicationInfo', MyReplicationInfo)
        if (MyReplicationInfo.MyPRI == PRI)
            return MyReplicationInfo;

    return None;  // no matching MyReplicationInfo actor found
}
&lt;/uscript&gt;

===Movement and Physics: The Controller Classes ===

'''Regulating the amount of dodges per jump'''

You'd expect modifying the amount of dodging moves allowed per jump is deeply burried in one of the controller classes. Well, it is, but I was able to &quot;hack into&quot; the PlayerController class without actually subclassing it:

&lt;uscript&gt;
class DodgeHack extends Info;

var PlayerController Controller;

function PostBeginPlay()
{
	Controller = PlayerController(Owner);
	Super.PostBeginPlay();
}

function Tick(float DeltaTime)
{
	if ( Controller == None ) {
		Destroy();
		return;
	}
	
	if ( Controller.DoubleClickDir &gt;= DCLICK_Active ) {
		Controller.ClearDoubleClick();
		Controller.DoubleClickDir = DCLICK_None;
	}
}
&lt;/uscript&gt;

This simple piece of code re-enables the walldodge after a dodging move has been executed. It only needs to be spawned via:

&lt;uscript&gt;
Spawn(class'DodgeHack', thePlayerController);
&lt;/uscript&gt;

Why does this work? Well, the [[Legacy:PlayerController|PlayerController]] class has a DoubleClickDir property which stores the current state of the dodging move. (see [[Legacy:Actor/Enums|Actor/Enums]]/EDoubleClickDir) You could very well limit this to 2 dodges per jump-session, using the fact that the count should be reset whenever the movement type is walking, a way to see whether people have landed.

'''Detecting which direction a player is pressing'''

This might be of use whenever you want to do a combo system of your own, without having to adhere to the strict rules Epic set for these combos, AND without having to replace the controller class. (The rules I was talking about: You can only do a combo when you're not currently using one, each combo must have 4 keypresses etc.)

The trick to use is that the original controller class stores the direction(s) a player is pressing in the OldKey variable, to compare it with the next tick. We could compose this variable ourselves by checking the aBaseY and aStrafe variables, but these are reset after the player's movement code. (meaning we only get second servings)

Now, if you want to change the xPawn's PlayerTick function without replacing it, just make sure there's a clientside object that has the exact same function, but replace the 

&lt;uscript&gt;
    if (aForward &gt; 0)		CurrentKey = CurrentKey | 1; // CK_Up
    else if (aForward &lt; 0)  CurrentKey = CurrentKey | 2; // CK_Down
    if (aStrafe &gt; 0)		CurrentKey = CurrentKey | 4; // CK_Left
    else if (aStrafe &lt; 0)   CurrentKey = CurrentKey | 8; // CK_Right
&lt;/uscript&gt;

with something like this:

&lt;uscript&gt;
    CurrentKey=CheckPlayer.OldKey;
&lt;/uscript&gt;

And the rest of the function should work fine! (of course, any variables that belong to the player should have this CheckPlayer. in front of them, but that's only detail)

Now you can change whatever you want in the function. For an example of this code in action, check the Advanced Adrenaline mutator once it's out. (I will replace that with a link once it is :))

Explore the various functions and properties used in the controller classes to see if you can modify something without actually subclassing a [[Legacy:Controller|Controller]] or [[Legacy:Pawn|Pawn]] class. Ofter there are ways to avoid subclassing, try to find them.

==Game Types ==

With game types you don't have any problems replacing [[Legacy:Controller|Controller]]s, [[Legacy:Pawn|Pawn]]s, the [[Legacy:HUD|HUD]] or any other things specific for game types. Still there are some things you should check. These include Mutator and GameRules function calls.

Some things to watch out for when subclassing certain classes:

When overriding functions, make sure you either call the superclass version of those functions or add the relevant Mutator or GameRules function calls back in.&lt;br /&gt;(see the individual class script files for details)

===GameInfo ===

The Login function should call BaseMutator.ModifyLogin before it parses any of the options.

RestartPlayer calls BaseMutator.PlayerChangedClass when the player changed his/her class since the last respawn.

Some functions ask the mutators to return a default weapon class via the mutators' GetDefaultWeapon function. You should do the same in every place where that class is used. (or cache the output in a class variable)

The SetPlayerDefaults function executes BaseMutator.ModifyPlayer. This function is used by mutators to initialize or update player-specific things and should always be called.

PreventDeath calls the GameRulesModifiers.PreventDeath function if there are any GameRules.

ReduceDamage should always call GameRulesModifiers.NetDamage. This is broken in UT2k3's [[Legacy:TeamGame|TeamGame]] class, so please try to fix it in your GameInfo class. If you don't want GameRules classes to modify the actual damage you can still return a different value, but NetDamage often does other things based on the damage and not calling it might render those GameRules classes useless.

In PickupQuery the GameRules' OverridePickupQuery function is called and has the chance to make the gametype skip the HandlePickupQuery function of the [[Legacy:Pawn|Pawn]]'s [[Legacy:Inventory|Inventory]] items.

GameRules also get a chance to override the RestartGame function with their own HandleRestartGame function, but they might as well only prepare for this event instead of completely handling it themselves.

GameRules can also are allowed to define additional end-of-game conditions via their CheckEndGame function which is called by the GameInfo's own CheckEndGame function.

This list is far from complete, but should give you an idea of what you have to look out for. Mutators, GameRules and also Controllers are allowed to handle a lot of things.

==Related Topics ==
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]]

==Discussion ==

'''Wormbo:''' This page has become neccessary since more and more mutator authors solve their problems (and unknowingly create a lot of new ones) by subclassing gametype-specific classes and replace them in their mutator. I hope it will minimize the number of incompatible mutators although I'm confident that there will still be enough people ignoring this fact. :(

'''Tarquin:''' How about we put a link to this page from all class pages that should NOT be subclassed in modding &amp;ndash; there's a chance authors will look up those pages for info. :)

'''Wormbo:''' Good idea. /me goes and adds some linkage... :)

'''Trystan:''' At least here alternatives are proposed.  A lot of the time you're working on something and don't really have time to wade through the various places to find an alternative - you just want to prototype and see if it works.  With the alternatives to common pitfalls listed here you've saved the programmer that much time and made it that much more probable that he will do as the page suggests.

'''Boksha:''' Added a way to &quot;replace&quot; the PlayerTick function without replacing the controller.

'''Dingus:''' Not quite understanding the 'Replace PlayerTick' method described above. I need to do so in UT99 in order to check/modify mouseinput (aMouseX, aMouseY) on the client. Can you give a more specific example OR sample code. Thx.

'''Tarquin:''' When you make a custom PRI, how do you go about spawning them for each player? What about the [[Legacy:LinkedReplicationInfo|LinkedReplicationInfo]] CustomReplicationInfo property in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]? Basically, what's the &quot;way in&quot;?</text>
    </revision>
    <revision>
      <id>5001</id>
      <timestamp>2005-07-22T16:11:35Z</timestamp>
      <contributor>
        <ip>226-134.94-24.tampabay.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''The idea behind this page is [http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=228918 this Infogrames Forum thread] and [http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=247052 this other Infogrames Forum thread] further pushed it. :)''

''For those who doubt Epic's intentions as to what a mutator should do you need look no further than the header comments in Engine.Mutator.

{{innerbox| Mutators allow modifications to gameplay while keeping the game rules intact.

}}

There are several problems when coding a new mutator or gametype. This page deals with problems that are often neglected: Compatibility with other mods and mutators.

This page can probably be divided in subpages for Game Types and Mutators later, but for now two headings should be enough.

==Mutators ==

Avoid replacing [[Legacy:GameInfo|GameInfo]]-specific classes such as the [[Legacy:HUD|HUD]], the [[Legacy:ScoreBoard|ScoreBoard]], the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s (or PRI for short), [[Legacy:Pawn|Pawn]] classes, [[Legacy:Controller|Controller]] classes and the [[Legacy:GameReplicationInfo|GameReplicationInfo]] (GRI).

Just imagine what happens when two mutators try to replace the PRI with their own versions. One of the mutators definately won't work. Maybe the gametype itself depends on its own PRI class, so both mutators can't be used with that gametype.

How to work round these problems:

===HUD / ScoreBoard Additions ===

Use [[Legacy:Interaction|Interaction]]s for this.

===Storing and/or Replicating Per-Player Information ===

Sure, the most straightforward idea is replacing the PRI, but there's another way: Create your own [[Legacy:ReplicationInfo|ReplicationInfo]] subclass. This class might look like this:

&lt;uscript&gt;
class MyReplicationInfo extends ReplicationInfo;

var PlayerReplicationInfo MyPRI;  // Pawns or Controllers aren't generally available on clients
var int MyImportantVariable;      // the value you want to replicate per-player

replication
{
    unreliable if ( Role == ROLE_Authority )
        MyPRI, MyImportantVariable;
}
&lt;/uscript&gt;

You only need to find and use the new MyReplicationInfo actors now. If you set the &lt;code&gt;MyPRI&lt;/code&gt; variable to reference the associate player's [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]], that's easily done both server- and client-side with the DynamicActors [[Legacy:Iterator|iterator]]:

&lt;uscript&gt;
function MyReplicationInfo FindInfoFor(PlayerReplicationInfo PRI)
{
    local MyReplicationInfo MyReplicationInfo;

    foreach DynamicActors(Class'MyReplicationInfo', MyReplicationInfo)
        if (MyReplicationInfo.MyPRI == PRI)
            return MyReplicationInfo;

    return None;  // no matching MyReplicationInfo actor found
}
&lt;/uscript&gt;

===Movement and Physics: The Controller Classes ===

'''Regulating the amount of dodges per jump'''

You'd expect modifying the amount of dodging moves allowed per jump is deeply burried in one of the controller classes. Well, it is, but I was able to &quot;hack into&quot; the PlayerController class without actually subclassing it:

&lt;uscript&gt;
class DodgeHack extends Info;

var PlayerController Controller;

function PostBeginPlay()
{
	Controller = PlayerController(Owner);
	Super.PostBeginPlay();
}

function Tick(float DeltaTime)
{
	if ( Controller == None ) {
		Destroy();
		return;
	}
	
	if ( Controller.DoubleClickDir &gt;= DCLICK_Active ) {
		Controller.ClearDoubleClick();
		Controller.DoubleClickDir = DCLICK_None;
	}
}
&lt;/uscript&gt;

This simple piece of code re-enables the walldodge after a dodging move has been executed. It only needs to be spawned via:

&lt;uscript&gt;
Spawn(class'DodgeHack', thePlayerController);
&lt;/uscript&gt;

Why does this work? Well, the [[Legacy:PlayerController|PlayerController]] class has a DoubleClickDir property which stores the current state of the dodging move. (see [[Legacy:Actor/Enums|Actor/Enums]]/EDoubleClickDir) You could very well limit this to 2 dodges per jump-session, using the fact that the count should be reset whenever the movement type is walking, a way to see whether people have landed.

'''Detecting which direction a player is pressing'''

This might be of use whenever you want to do a combo system of your own, without having to adhere to the strict rules Epic set for these combos, AND without having to replace the controller class. (The rules I was talking about: You can only do a combo when you're not currently using one, each combo must have 4 keypresses etc.)

The trick to use is that the original controller class stores the direction(s) a player is pressing in the OldKey variable, to compare it with the next tick. We could compose this variable ourselves by checking the aBaseY and aStrafe variables, but these are reset after the player's movement code. (meaning we only get second servings)

Now, if you want to change the xPawn's PlayerTick function without replacing it, just make sure there's a clientside object that has the exact same function, but replace the 

&lt;uscript&gt;
    if (aForward &gt; 0)		CurrentKey = CurrentKey | 1; // CK_Up
    else if (aForward &lt; 0)  CurrentKey = CurrentKey | 2; // CK_Down
    if (aStrafe &gt; 0)		CurrentKey = CurrentKey | 4; // CK_Left
    else if (aStrafe &lt; 0)   CurrentKey = CurrentKey | 8; // CK_Right
&lt;/uscript&gt;

with something like this:

&lt;uscript&gt;
    CurrentKey=CheckPlayer.OldKey;
&lt;/uscript&gt;

And the rest of the function should work fine! (of course, any variables that belong to the player should have this CheckPlayer. in front of them, but that's only detail)

Now you can change whatever you want in the function. For an example of this code in action, check the Advanced Adrenaline mutator once it's out. (I will replace that with a link once it is :))

Explore the various functions and properties used in the controller classes to see if you can modify something without actually subclassing a [[Legacy:Controller|Controller]] or [[Legacy:Pawn|Pawn]] class. Ofter there are ways to avoid subclassing, try to find them.

==Game Types ==

With game types you don't have any problems replacing [[Legacy:Controller|Controller]]s, [[Legacy:Pawn|Pawn]]s, the [[Legacy:HUD|HUD]] or any other things specific for game types. Still there are some things you should check. These include Mutator and GameRules function calls.

Some things to watch out for when subclassing certain classes:

When overriding functions, make sure you either call the superclass version of those functions or add the relevant Mutator or GameRules function calls back in.&lt;br /&gt;(see the individual class script files for details)

===GameInfo ===

The Login function should call BaseMutator.ModifyLogin before it parses any of the options.

RestartPlayer calls BaseMutator.PlayerChangedClass when the player changed his/her class since the last respawn.

Some functions ask the mutators to return a default weapon class via the mutators' GetDefaultWeapon function. You should do the same in every place where that class is used. (or cache the output in a class variable)

The SetPlayerDefaults function executes BaseMutator.ModifyPlayer. This function is used by mutators to initialize or update player-specific things and should always be called.

PreventDeath calls the GameRulesModifiers.PreventDeath function if there are any GameRules.

ReduceDamage should always call GameRulesModifiers.NetDamage. This is broken in UT2k3's [[Legacy:TeamGame|TeamGame]] class, so please try to fix it in your GameInfo class. If you don't want GameRules classes to modify the actual damage you can still return a different value, but NetDamage often does other things based on the damage and not calling it might render those GameRules classes useless.

In PickupQuery the GameRules' OverridePickupQuery function is called and has the chance to make the gametype skip the HandlePickupQuery function of the [[Legacy:Pawn|Pawn]]'s [[Legacy:Inventory|Inventory]] items.

GameRules also get a chance to override the RestartGame function with their own HandleRestartGame function, but they might as well only prepare for this event instead of completely handling it themselves.

GameRules can also are allowed to define additional end-of-game conditions via their CheckEndGame function which is called by the GameInfo's own CheckEndGame function.

This list is far from complete, but should give you an idea of what you have to look out for. Mutators, GameRules and also Controllers are allowed to handle a lot of things.

==Related Topics ==
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]]

==Discussion ==

'''Wormbo:''' This page has become neccessary since more and more mutator authors solve their problems (and unknowingly create a lot of new ones) by subclassing gametype-specific classes and replace them in their mutator. I hope it will minimize the number of incompatible mutators although I'm confident that there will still be enough people ignoring this fact. :(

'''Tarquin:''' How about we put a link to this page from all class pages that should NOT be subclassed in modding &amp;ndash; there's a chance authors will look up those pages for info. :)

'''Wormbo:''' Good idea. /me goes and adds some linkage... :)

'''Trystan:''' At least here alternatives are proposed.  A lot of the time you're working on something and don't really have time to wade through the various places to find an alternative - you just want to prototype and see if it works.  With the alternatives to common pitfalls listed here you've saved the programmer that much time and made it that much more probable that he will do as the page suggests.

'''Boksha:''' Added a way to &quot;replace&quot; the PlayerTick function without replacing the controller.

'''Dingus:''' Not quite understanding the 'Replace PlayerTick' method described above. I need to do so in UT99 in order to check/modify mouseinput (aMouseX, aMouseY) on the client. Can you give a more specific example OR sample code. Thx.</text>
    </revision>
    <revision>
      <id>5002</id>
      <timestamp>2005-08-30T15:19:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''The idea behind this page is [http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=228918 this Infogrames Forum thread] and [http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=247052 this other Infogrames Forum thread] further pushed it. :)''

''For those who doubt Epic's intentions as to what a mutator should do you need look no further than the header comments in Engine.Mutator.

{{innerbox| Mutators allow modifications to gameplay while keeping the game rules intact.

}}

There are several problems when coding a new mutator or gametype. This page deals with problems that are often neglected: Compatibility with other mods and mutators.

This page can probably be divided in subpages for Game Types and Mutators later, but for now two headings should be enough.

==Mutators ==

Avoid replacing [[Legacy:GameInfo|GameInfo]]-specific classes such as the [[Legacy:HUD|HUD]], the [[Legacy:ScoreBoard|ScoreBoard]], the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]s (or PRI for short), [[Legacy:Pawn|Pawn]] classes, [[Legacy:Controller|Controller]] classes and the [[Legacy:GameReplicationInfo|GameReplicationInfo]] (GRI).

Just imagine what happens when two mutators try to replace the PRI with their own versions. One of the mutators definately won't work. Maybe the gametype itself depends on its own PRI class, so both mutators can't be used with that gametype.

How to work round these problems:

===HUD / ScoreBoard Additions ===

Use [[Legacy:Interaction|Interaction]]s for this.

===Storing and/or Replicating Per-Player Information ===

Sure, the most straightforward idea is replacing the PRI, but there's another way: Create your own [[Legacy:ReplicationInfo|ReplicationInfo]] subclass. This class might look like this:

&lt;uscript&gt;
class MyReplicationInfo extends ReplicationInfo;

var PlayerReplicationInfo MyPRI;  // Pawns or Controllers aren't generally available on clients
var int MyImportantVariable;      // the value you want to replicate per-player

replication
{
    unreliable if ( Role == ROLE_Authority )
        MyPRI, MyImportantVariable;
}
&lt;/uscript&gt;

You only need to find and use the new MyReplicationInfo actors now. If you set the &lt;code&gt;MyPRI&lt;/code&gt; variable to reference the associate player's [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]], that's easily done both server- and client-side with the DynamicActors [[Legacy:Iterator|iterator]]:

&lt;uscript&gt;
function MyReplicationInfo FindInfoFor(PlayerReplicationInfo PRI)
{
    local MyReplicationInfo MyReplicationInfo;

    foreach DynamicActors(Class'MyReplicationInfo', MyReplicationInfo)
        if (MyReplicationInfo.MyPRI == PRI)
            return MyReplicationInfo;

    return None;  // no matching MyReplicationInfo actor found
}
&lt;/uscript&gt;

===Movement and Physics: The Controller Classes ===

'''Regulating the amount of dodges per jump'''

You'd expect modifying the amount of dodging moves allowed per jump is deeply burried in one of the controller classes. Well, it is, but I was able to &quot;hack into&quot; the PlayerController class without actually subclassing it:

&lt;uscript&gt;
class DodgeHack extends Info;

var PlayerController Controller;

function PostBeginPlay()
{
	Controller = PlayerController(Owner);
	Super.PostBeginPlay();
}

function Tick(float DeltaTime)
{
	if ( Controller == None ) {
		Destroy();
		return;
	}
	
	if ( Controller.DoubleClickDir &gt;= DCLICK_Active ) {
		Controller.ClearDoubleClick();
		Controller.DoubleClickDir = DCLICK_None;
	}
}
&lt;/uscript&gt;

This simple piece of code re-enables the walldodge after a dodging move has been executed. It only needs to be spawned via:

&lt;uscript&gt;
Spawn(class'DodgeHack', thePlayerController);
&lt;/uscript&gt;

Why does this work? Well, the [[Legacy:PlayerController|PlayerController]] class has a DoubleClickDir property which stores the current state of the dodging move. (see [[Legacy:Actor/Enums|Actor/Enums]]/EDoubleClickDir) You could very well limit this to 2 dodges per jump-session, using the fact that the count should be reset whenever the movement type is walking, a way to see whether people have landed.

'''Detecting which direction a player is pressing'''

This might be of use whenever you want to do a combo system of your own, without having to adhere to the strict rules Epic set for these combos, AND without having to replace the controller class. (The rules I was talking about: You can only do a combo when you're not currently using one, each combo must have 4 keypresses etc.)

The trick to use is that the original controller class stores the direction(s) a player is pressing in the OldKey variable, to compare it with the next tick. We could compose this variable ourselves by checking the aBaseY and aStrafe variables, but these are reset after the player's movement code. (meaning we only get second servings)

Now, if you want to change the xPawn's PlayerTick function without replacing it, just make sure there's a clientside object that has the exact same function, but replace the 

&lt;uscript&gt;
    if (aForward &gt; 0)		CurrentKey = CurrentKey | 1; // CK_Up
    else if (aForward &lt; 0)  CurrentKey = CurrentKey | 2; // CK_Down
    if (aStrafe &gt; 0)		CurrentKey = CurrentKey | 4; // CK_Left
    else if (aStrafe &lt; 0)   CurrentKey = CurrentKey | 8; // CK_Right
&lt;/uscript&gt;

with something like this:

&lt;uscript&gt;
    CurrentKey=CheckPlayer.OldKey;
&lt;/uscript&gt;

And the rest of the function should work fine! (of course, any variables that belong to the player should have this CheckPlayer. in front of them, but that's only detail)

Now you can change whatever you want in the function. For an example of this code in action, check the Advanced Adrenaline mutator once it's out. (I will replace that with a link once it is :))

Explore the various functions and properties used in the controller classes to see if you can modify something without actually subclassing a [[Legacy:Controller|Controller]] or [[Legacy:Pawn|Pawn]] class. Ofter there are ways to avoid subclassing, try to find them.

==Game Types ==

With game types you don't have any problems replacing [[Legacy:Controller|Controller]]s, [[Legacy:Pawn|Pawn]]s, the [[Legacy:HUD|HUD]] or any other things specific for game types. Still there are some things you should check. These include Mutator and GameRules function calls.

Some things to watch out for when subclassing certain classes:

When overriding functions, make sure you either call the superclass version of those functions or add the relevant Mutator or GameRules function calls back in.&lt;br /&gt;(see the individual class script files for details)

===GameInfo ===

The Login function should call BaseMutator.ModifyLogin before it parses any of the options.

RestartPlayer calls BaseMutator.PlayerChangedClass when the player changed his/her class since the last respawn.

Some functions ask the mutators to return a default weapon class via the mutators' GetDefaultWeapon function. You should do the same in every place where that class is used. (or cache the output in a class variable)

The SetPlayerDefaults function executes BaseMutator.ModifyPlayer. This function is used by mutators to initialize or update player-specific things and should always be called.

PreventDeath calls the GameRulesModifiers.PreventDeath function if there are any GameRules.

ReduceDamage should always call GameRulesModifiers.NetDamage. This is broken in UT2k3's [[Legacy:TeamGame|TeamGame]] class, so please try to fix it in your GameInfo class. If you don't want GameRules classes to modify the actual damage you can still return a different value, but NetDamage often does other things based on the damage and not calling it might render those GameRules classes useless.

In PickupQuery the GameRules' OverridePickupQuery function is called and has the chance to make the gametype skip the HandlePickupQuery function of the [[Legacy:Pawn|Pawn]]'s [[Legacy:Inventory|Inventory]] items.

GameRules also get a chance to override the RestartGame function with their own HandleRestartGame function, but they might as well only prepare for this event instead of completely handling it themselves.

GameRules can also are allowed to define additional end-of-game conditions via their CheckEndGame function which is called by the GameInfo's own CheckEndGame function.

This list is far from complete, but should give you an idea of what you have to look out for. Mutators, GameRules and also Controllers are allowed to handle a lot of things.

==Related Topics ==
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]]

==Discussion ==

'''Wormbo:''' This page has become neccessary since more and more mutator authors solve their problems (and unknowingly create a lot of new ones) by subclassing gametype-specific classes and replace them in their mutator. I hope it will minimize the number of incompatible mutators although I'm confident that there will still be enough people ignoring this fact. :(

'''Tarquin:''' How about we put a link to this page from all class pages that should NOT be subclassed in modding &amp;ndash; there's a chance authors will look up those pages for info. :)

'''Wormbo:''' Good idea. /me goes and adds some linkage... :)

'''Trystan:''' At least here alternatives are proposed.  A lot of the time you're working on something and don't really have time to wade through the various places to find an alternative - you just want to prototype and see if it works.  With the alternatives to common pitfalls listed here you've saved the programmer that much time and made it that much more probable that he will do as the page suggests.

'''Boksha:''' Added a way to &quot;replace&quot; the PlayerTick function without replacing the controller.

'''Dingus:''' Not quite understanding the 'Replace PlayerTick' method described above. I need to do so in UT99 in order to check/modify mouseinput (aMouseX, aMouseY) on the client. Can you give a more specific example OR sample code. Thx.

'''Tarquin:''' When you make a custom PRI, how do you go about spawning them for each player? What about the [[Legacy:LinkedReplicationInfo|LinkedReplicationInfo]] CustomReplicationInfo property in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]]?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MakeNaliFriendly</title>
    <id>1766</id>
    <revision>
      <id>4333</id>
      <timestamp>2003-05-27T08:30:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; MakeNaliFriendly (Package: UnrealShare)}}

This little Keypoint is how a mapper can make all the Nali in the level friendly again.  It simply needs to be triggered, and then it will work automatically.  It's a good for a person building a SinglePlayer map to use if they're worried about having Nali that won't go through their scripted sequences because they're afraid of the player.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4334</id>
      <timestamp>2002-01-31T08:36:39Z</timestamp>
      <contributor>
        <ip>TechnoJF</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; MakeNaliFriendly}}

This little Keypoint is how a mapper can make all the Nali in the level friendly again.  It simply needs to be triggered, and then it will work automatically.  It's a good for a person building a SinglePlayer map to use if they're worried about having Nali that won't go through their scripted sequences because they're afraid of the player.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making A 2D Shape</title>
    <id>1768</id>
    <revision>
      <id>4337</id>
      <timestamp>2005-05-23T04:28:54Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>F= D</comment>
      <text xml:space="preserve">The 2D shape editor is a tool for drawing 2-dimensional shapes which are then processed to make a 3-dimensional brush shape in the main editor.

This page covers the basics in making a shape in the 2D editor. For an overview of this tool, interface reference and processing types, see the [[Legacy:2D Shape Editor|2D Shape Editor]] page.

The following tutorials cover making architecture with the 2D editor:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Opening ==

To open up the 2d editor, use tools menu or hit the 2deditor button on the [[Legacy:Toolbar|toolbar]].

The window initially displays a square shape.

==File Operations ==

2D shapes can be loaded and saved, independently of the map in the main UnrealEd.

==Loading a texture ==

A texture can be displayed as a backdrop in the 2D Editor's window. This makes it considerably easier to closely match a texture, for example an arch or a door. There are two ways of doing this. 
# Quick &amp; simple but may crash UnrealEd
## Load the texture in UnrealEd's texture browser (the skycity.utx texture package which has a very nice basic arch)
## Select an arch texture (to see all the arches of that package, in the drop down menu below choose arch)
## Do [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get from current texture. The texture should now be displayed as a backdrop in the 2D editor window.
# More complex but sturdy
## Load the texture in UnrealEd's texture browser, right-click it, and &quot;choose export to .pcx&quot; from the pop-up menu.
## In the save dialog choose save as type &gt; all file types. Save the file as anyname.bmp (the 2D Editor can only open .bmp textures).
## Do [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get from disk. 

The texture should now be displayed as a backdrop in the 2D editor window.

==Moving vertices ==

Select any vertex by clicking on it. Click and drag to move it. 

==Adding vertices ==

==Deleting vertices ==

==Scaling &amp; Zooming ==

Click the magnifying-glass + and - buttons on the toolbar to zoom and out. The view is scaled approximately to the current size of the shape you're working on.

==Segment Type ==

Segments can be linear or curved.
* converting back &amp; forth

===Bezier detail level ===

Its possible to change the detail level of a Bezier curve by adding in more sides to make the curve more smooth. The default detail level is 5. 

First select the Bezier curve by clicking on one of the Bezier adjustment handles. Right click on the Bezier curve in the 2D Editor and go to Segment -&gt; Detail level and make a choice. This can also be accessed through Edit menu -&gt; segment -&gt; detail level. 

things to cover:

*selecting vertices
* splitting sides
*multiple selection
* bezier &amp; switching between the two types of side
* the green origin point
* moving the whole shape with the orange shape centre point
* scaling

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4338</id>
      <timestamp>2003-05-25T08:55:50Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]], [[Category Tutorial]]</comment>
      <text xml:space="preserve">The 2D shape editor is a tool for drawing 2-dimensional shapes which are then processed to make a 3-dimensional brush shape in the main editor.

This page covers the basics in making a shape in the 2D editor. For an overview of this tool, interface reference and processing types, see the [[Legacy:2D Shape Editor|2D Shape Editor]] page.

The following tutorials cover making architecture with the 2D editor:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Opening ==

To open up the 2d editor, use tools menu or hit the 2deditor button on the [[Legacy:Toolbar|toolbar]].

The window initially displays a square shape.

==File Operations ==

2D shapes can be loaded and saved, independently of the map in the main UnrealEd.

==Loading a texture ==

A texture can be displayed as a backdrop in the 2D Editor's window. This makes it considerably easier to closely match a texture, for example an arch or a door. There are two ways of doing this. 
# Quick &amp; simple but may crash UnrealEd
## Load the texture in UnrealEd's texture browser (the skycity.utx texture package which has a very nice basic arch)
## Select an arch texture (to see all the arches of that package, in the drop down menu below choose arch)
## Do [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get from current texture. The texture should now be displayed as a backdrop in the 2D editor window.
# More complex but sturdy
## Load the texture in UnrealEd's texture browser, right-click it, and &quot;choose export to .pcx&quot; from the pop-up menu.
## In the save dialog choose save as type &gt; all file types. Save the file as anyname.bmp (the 2D Editor can only open .bmp textures).
## Do [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get from disk. 

The texture should now be displayed as a backdrop in the 2D editor window.

==Moving vertices ==

Select any vertex by clicking on it. Click and drag to move it. 

==Adding vertices ==

==Deleting vertices ==

==Scaling &amp; Zooming ==

==Segment Type ==

Segments can be linear or curved.
* converting back &amp; forth

===Bezier detail level ===

Its possible to change the detail level of a Bezier curve by adding in more sides to make the curve more smooth. The default detail level is 5. 

First select the Bezier curve by clicking on one of the Bezier adjustment handles. Right click on the Bezier curve in the 2D Editor and go to Segment -&gt; Fetail level and make a choice. This can also be accessed through Edit menu -&gt; segment -&gt; detail level. 

things to cover:

*selecting vertices
* splitting sides
*multiple selection
* bezier &amp; switching between the two types of side
* the green origin point
* moving the whole shape with the orange shape centre point
* scaling

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4339</id>
      <timestamp>2005-05-23T02:52:10Z</timestamp>
      <contributor>
        <ip>User-112164g.dsl.mindspring.com</ip>
      </contributor>
      <comment>Added explanation of zooming</comment>
      <text xml:space="preserve">The 2D shape editor is a tool for drawing 2-dimensional shapes which are then processed to make a 3-dimensional brush shape in the main editor.

This page covers the basics in making a shape in the 2D editor. For an overview of this tool, interface reference and processing types, see the [[Legacy:2D Shape Editor|2D Shape Editor]] page.

The following tutorials cover making architecture with the 2D editor:
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Complex Doors|Making Complex Doors]]

==Opening ==

To open up the 2d editor, use tools menu or hit the 2deditor button on the [[Legacy:Toolbar|toolbar]].

The window initially displays a square shape.

==File Operations ==

2D shapes can be loaded and saved, independently of the map in the main UnrealEd.

==Loading a texture ==

A texture can be displayed as a backdrop in the 2D Editor's window. This makes it considerably easier to closely match a texture, for example an arch or a door. There are two ways of doing this. 
# Quick &amp; simple but may crash UnrealEd
## Load the texture in UnrealEd's texture browser (the skycity.utx texture package which has a very nice basic arch)
## Select an arch texture (to see all the arches of that package, in the drop down menu below choose arch)
## Do [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get from current texture. The texture should now be displayed as a backdrop in the 2D editor window.
# More complex but sturdy
## Load the texture in UnrealEd's texture browser, right-click it, and &quot;choose export to .pcx&quot; from the pop-up menu.
## In the save dialog choose save as type &gt; all file types. Save the file as anyname.bmp (the 2D Editor can only open .bmp textures).
## Do [[Legacy:2D Shape Editor Menu|2D Shape Editor Menu]] -&gt; File -&gt; Image -&gt; Get from disk. 

The texture should now be displayed as a backdrop in the 2D editor window.

==Moving vertices ==

Select any vertex by clicking on it. Click and drag to move it. 

==Adding vertices ==

==Deleting vertices ==

==Scaling &amp; Zooming ==

Click the magnifying-glass + and - buttons on the toolbar to zoom and out. The view is scaled approximately to the current size of the shape you're working on.

==Segment Type ==

Segments can be linear or curved.
* converting back &amp; forth

===Bezier detail level ===

Its possible to change the detail level of a Bezier curve by adding in more sides to make the curve more smooth. The default detail level is 5. 

First select the Bezier curve by clicking on one of the Bezier adjustment handles. Right click on the Bezier curve in the 2D Editor and go to Segment -&gt; Fetail level and make a choice. This can also be accessed through Edit menu -&gt; segment -&gt; detail level. 

things to cover:

*selecting vertices
* splitting sides
*multiple selection
* bezier &amp; switching between the two types of side
* the green origin point
* moving the whole shape with the orange shape centre point
* scaling

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making A Class-Based Mod</title>
    <id>1861</id>
    <revision>
      <id>4569</id>
      <timestamp>2006-09-20T01:49:17Z</timestamp>
      <contributor>
        <ip>Ppp22-194.lns2.syd7.internode.on.net</ip>
      </contributor>
      <minor/>
      <comment>*fixed typos, because, the</comment>
      <text xml:space="preserve">==Dissecting Riftwar: an early UT2003 example ==

'''Before you go any farther:''' I would recommend looking [[Legacy:RegularEngine/Player_Classes|RegularEngine/Player_Classes]] instead.  The RegularEngine is based on UT2004 code, so if you're still on UT2003, I cant' be sure it will work - but it's far more efficient, reliable and readable than what's on this page. '' ... RegX''

A class in [[Legacy:Mod_Ideas/Riftwar|Riftwar]] is ultimately defined by a SpeciesType class. It holds what the class looks like, what it's base attributes are, and it's default weapon/powerup. This is somewhat based on the Species mute left in by Epic (and revived by Brizz). Riftwar creates custom Species classes which hold all the unique aspects that will make a player class a player class.  So let's take a look at one of these classes, with some added comments:

&lt;uscript&gt;class SBSpecies_AlienB extends SBSpecies;

function getDescription() {}  // deprecated

defaultproperties{   // all of the properties for Pawn.Setup - this is what the player class will look like.
FemaleMeshName = &quot;HumanFemaleA.EgyptFemaleA&quot;;
FemaleBodySkinName = &quot;PlayerSkins.EgyptFemaleABodyA&quot;;
FemaleFaceSkinName = &quot;PlayerSkins.EgyptFemaleAHeadA&quot;;

MaleMeshName = &quot;HumanMaleA.EgyptMaleA&quot;;

...
FemaleSkeleton = &quot;HumanMaleA.SkeletonMale&quot;;

GibGroup=&quot;xEffects.xAlienGibGroup&quot;

RaceNum=1
}

defaultproperties {
	ReceivedDamageScaling=+1.0  // Player class stats like speed and damage control
	DamageScaling=+1.2
	...
	DefaultItem=&quot;xWeapons.ShockRifle&quot;  // Default Weapon for this player Class
	PowerUpCombo=&quot;xGame.ComboSpeed&quot;
	DefaultHealth=120 
        DefaultAdrenaline=0
        DefaultShieldAmount=0
	}
&lt;/uscript&gt;

OK, so that's a &quot;player class&quot;. How do you use it? Well, you have to get the [[Legacy:Pawn|Pawn]] and [[Legacy:Controller|Controller]] to set it up, and you have to get it all [[Legacy:Replication|replicated]] on the network. Here's a tip - Species from the Pawn isn't replicated (it's considered client info), so you'll need to have the Controller tell the Pawn what to do with some replicated vars.  Here is the order in which Riftwar takes a normal player who hasn't chosen a class and allows them to choose one:

# In RestartPlayer, the Controller is checked to determine if the player class has been chosen.  

# If it's determined that the player hasn't chosen a class, it stops restarting the player, tells the controller to hide it's pawn and present the user with an interface to choose one.

# The interface selects the player class and assigns variables to the Controller to remember what class to use.

# The Controller destroys it's pawn and goes back to RestartPlayer

# RestartPlayer detects the new variables, assigns the Controller a pawn and sets variables on the pawn to determine what class to use.  This is vital because the way pawns are(n't) replicated, they are the real authority online as to their appearance. 

# The Pawn's setup uses these variables (in Riftwar, it's two ints) to know what mesh and skin to use and what species to assign.

# The ModifyPlayer function looks at the Species to determine modifications/weapons the player class has.

# RestartPlayer finishes, the player is in the game with it's new player class.

Let's look at this with some more detail and point and the pieces of code which comprise it:

The player hits RestartPlayer in the gameinfo when he gets to the level, there it checks to see if he has chosen a class:

&lt;uscript&gt;function RestartPlayer( Controller aPlayer )
{
    local NavigationPoint startSpot;
    local int TeamNum;
    local class&lt;Pawn&gt; DefaultPlayerClass;

    ...
    if ( aPlayer.Pawn == None )
    {
        aPlayer.GotoState('Dead');
        return;
    }

	if(SBPlayer(aPlayer) != none &amp;&amp; !aPlayer.PlayerReplicationInfo.bOutOfLives) {

	if(aPlayer.PlayerReplicationInfo.Team == none){  // No team means they don't know what player class they are
		SBPlayer(aPlayer).overview();            // This function tells the Controller to hide the pawn, open the GUI
		return;                                  // stop here - we can't restart the player yet
		}else{
		SBPawn(aPlayer.Pawn).superSpecies = SBPlayer(aPlayer).superSpecies;  // we know how to set this pawn, continue
		SBPawn(aPlayer.Pawn).subSpecies = SBPlayer(aPlayer).subSpecies;
   		}
		...
	}

&lt;/uscript&gt;

There's some pawn spawning code and bot class choosing code surrounding it, but the meat if the if that says if they don't have a team, do the overview function in the custom controller, which looks like this:

&lt;uscript&gt;exec function overview() {

  if(PlayerReplicationInfo.Team != none) {return;}
     Pawn.setCollision(false,false,false);  // we might need the pawn info, so don't destroy it
     Pawn.bHidden=True;                     // but hide it from the game world
     ClientOpenMenu(&quot;SpeciesBattle.SBTrader&quot;);  // open the GUIPage to decide a player class

}
&lt;/uscript&gt;

So that will open the SBTrader, a GUIPage which is essentially the class chooser. From there, the player selects their class which results in:

&lt;uscript&gt;function bool InternalOnClick(GUIComponent Sender)
{
	local PlayerController pc;
	local SBPlayer spc;

	pc = PlayerOwner();
        spc = SBPlayer(pc);
        if(spc==none){return false;}

	if(Sender==Controls[4]) // close
	{

		if(SpecList.List.Get() == HumanATitle) {  // User has selected &quot;Human Soldier&quot;
				spc.setSubSpecies(1);     // Set the correct Team/Player Class to the Controller
				spc.setSuperSpecies(0);
				spc.SetPlayerTeam(0);
				}
...

&lt;/uscript&gt;

So selecting the &quot;Human Soldier&quot; in the list has the controller set the following vars - superSpecies and subSpecies, using client replicated functions:

&lt;uscript&gt;class SBPlayer extends xPlayer;

var bool bIsFemale;
var int superSpecies;
var int subSpecies;
var int hCount,aCount,uCount;

replication
{
 // Things the server should send to the client.
 reliable if ( bNetDirty &amp;&amp; (Role == Role_Authority) )
  getTeamCount,hCount,aCount,uCount,bIsFemale,superSpecies,subSpecies;
 
 reliable if( Role&lt;ROLE_Authority )
  gotype,goteam,clearSpecies,SetPlayerTeam,overview,ReturnToWorld,setSubSpecies;
}

...
function setSuperSpecies(int s) {
  superSpecies = s;
  }

function setSubSpecies(int s) {
  subSpecies = s;
  }

...

&lt;/uscript&gt;

When you close the SBTrader [[Legacy:GUIPage|GUIPage]] it hits the ReturnToWorld function in the SBPlayer controller. All this does is destroy the current Pawn ( which didn't have the info to setup correctly ) and tell it to try again:

&lt;uscript&gt;
function ReturnToWorld() {
   Pawn.Destroy();                                // We'll get a new one
   log(&quot;SBPlayer &quot;$PlayerReplicationInfo.Team);   // This should never be blank at this point
   GotoState('Returning');                        // Head back to RestartPlayer()
}
&lt;/uscript&gt;

The team is now set - so when we hit RestartPlayer, the pawn remains and gets a chance to setup it's mesh and skin.  We have integers in our sub and superspecies to pick out what mesh and skin the pawn should use:

&lt;uscript&gt;simulated function Setup(xUtil.PlayerRecord rec, optional bool bLoadNow)
{
    if(PlayerReplicationInfo.Team != none) {    // this should be redundant
      if(PlayerReplicationInfo.Team.TeamName == &quot;Humans&quot;){SuperSpecies = 0;}
      if(PlayerReplicationInfo.Team.TeamName == &quot;Aliens&quot;){SuperSpecies = 1;}
      if(PlayerReplicationInfo.Team.TeamName == &quot;Undead&quot;){SuperSpecies = 2;}
      }
      //LOG(&quot;SBPAWN Super:&quot;$superSpecies$&quot; Sub:&quot;$SubSpecies);
	
      if(SuperSpecies == 0){    // Is Human
         if ( subSpecies == 1 ) {  
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanB';  //Is Fatboy Class
	 Species =  class'SpeciesBattle.SBSpecies_HumanB';
	 }else if ( subSpecies == 0 ){
	 Species = class'SpeciesBattle.SBSpecies_HumanA';    //Is Soldier Class
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanA';
	 }else{
	 Species = class'SpeciesBattle.SBSpecies_HumanC';    //Is Mecher Class
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanC';
         }
	    }

	  ...

	RagdollOverride = rec.Ragdoll;

if ( Species.static.Setup(self,rec) ){ResetPhysicsBasedAnim();} 

&lt;/uscript&gt;

Which in turn hits the Species setup, which I won't paste here as it basically just setups up the mesh and voice and is ugly but fairly straightforward.

From there, the ModifyPlayer function in the SpeciesType and the GameRules that are added from the Gameinfo handle the rest of the customization.

Another method is to simply trick the Pawn's setup to look at a specific PlayerName to setup the mesh and determine the species from a upl file - which is exactly how the game works normally. I'm personally not a big fan of upls for anything but bots, but it's a matter of preference. It would simplify the process some, however.

So ... *whew* . Um. Any questions?

----

'''Mychaeel:''' Well.  I think we have a [[:Category:Legacy To Do]] (formatting, subheaders, maybe some of the phrasing)...  :-)

'''RegularX:''' I need to add that I just put in a similar framework for Freehold that works on the same principle, but with about 1/4 of the code required for the Controller and the GameInfo classes.  I have zero time to update this page correctly now (besides, a wise programmer will learn from my mistakes ;) ) - but basically the species/class is held in a single var on the controller, the gameinfo checks for that to produce the class chooser, and otherwise goes to the super.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4570</id>
      <timestamp>2004-12-22T16:39:07Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Dissecting Riftwar: an early UT2003 example ==

'''Before you go any farther:''' I would recommend looking [[Legacy:RegularEngine/Player_Classes|RegularEngine/Player_Classes]] instead.  this is based on UT2004 code, so if you're still on UT2003, I cant' be sure it will work - but the pawn framework should be the same. '' ... RegX''

A class in [[Legacy:Mod_Ideas/Riftwar|Riftwar]] is ultimately defined by a SpeciesType class. It holds what the class looks like, what it's base attributes are, and it's default weapon/powerup. This is somewhat based on the Species mute left in by Epic (and revived by Brizz). Riftwar creates custom Species classes which hold all the unique aspects that will make a player class a player class.  So let's take a look at one of these classes, with some added comments:

&lt;uscript&gt;class SBSpecies_AlienB extends SBSpecies;

function getDescription() {}  // deprecated

defaultproperties{   // all of the properties for Pawn.Setup - this is what the player class will look like.
FemaleMeshName = &quot;HumanFemaleA.EgyptFemaleA&quot;;
FemaleBodySkinName = &quot;PlayerSkins.EgyptFemaleABodyA&quot;;
FemaleFaceSkinName = &quot;PlayerSkins.EgyptFemaleAHeadA&quot;;

MaleMeshName = &quot;HumanMaleA.EgyptMaleA&quot;;

...
FemaleSkeleton = &quot;HumanMaleA.SkeletonMale&quot;;

GibGroup=&quot;xEffects.xAlienGibGroup&quot;

RaceNum=1
}

defaultproperties {
	ReceivedDamageScaling=+1.0  // Player class stats like speed and damage control
	DamageScaling=+1.2
	...
	DefaultItem=&quot;xWeapons.ShockRifle&quot;  // Default Weapon for this player Class
	PowerUpCombo=&quot;xGame.ComboSpeed&quot;
	DefaultHealth=120 
        DefaultAdrenaline=0
        DefaultShieldAmount=0
	}
&lt;/uscript&gt;

OK, so that's a &quot;player class&quot;. How do you use it? Well, you have to get the [[Legacy:Pawn|Pawn]] and [[Legacy:Controller|Controller]] to set it up, and you have to get it all [[Legacy:Replication|replicated]] on the network. Here's a tip - Species from the Pawn isn't replicated (it's considered client info), so you'll need to have the Controller tell the Pawn what to do with some replicated vars.  Here is the order in which Riftwar takes a normal player who hasn't chosen a class and allows them to choose one:

# In RestartPlayer, the Controller is checked to determine if the player class has been chosen.  

# If it's determined that the player hasn't chosen a class, it stops restarting the player, tells the controller to hide it's pawn and present the user with an interface to choose one.

# The interface selects the player class and assigns variables to the Controller to remember what class to use.

# The Controller destroys it's pawn and goes back to RestartPlayer

# RestartPlayer detects the new variables, assigns the Controller a pawn and sets variables on the pawn to determine what class to use.  This is vital becase they way pawns are(n't) replicated, they are the real authority online as to their appearance. 

# The Pawn's setup uses these variables (in Riftwar, it's two ints) to know what mesh and skin to use and what species to assign.

# The ModifyPlayer function looks at the Species to determine modifications/weapons the player class has.

# RestartPlayer finishes, the player is in the game with it's new player class.

Let's look at this with some more detail and point and the pieces of code which comprise it:

The player hits RestartPlayer in the gameinfo when he gets to the level, there it checks to see if he has chosen a class:

&lt;uscript&gt;function RestartPlayer( Controller aPlayer )
{
    local NavigationPoint startSpot;
    local int TeamNum;
    local class&lt;Pawn&gt; DefaultPlayerClass;

    ...
    if ( aPlayer.Pawn == None )
    {
        aPlayer.GotoState('Dead');
        return;
    }

	if(SBPlayer(aPlayer) != none &amp;&amp; !aPlayer.PlayerReplicationInfo.bOutOfLives) {

	if(aPlayer.PlayerReplicationInfo.Team == none){  // No team means they don't know what player class they are
		SBPlayer(aPlayer).overview();            // This function tells the Controller to hide the pawn, open the GUI
		return;                                  // stop here - we can't restart the player yet
		}else{
		SBPawn(aPlayer.Pawn).superSpecies = SBPlayer(aPlayer).superSpecies;  // we know how to set this pawn, continue
		SBPawn(aPlayer.Pawn).subSpecies = SBPlayer(aPlayer).subSpecies;
   		}
		...
	}

&lt;/uscript&gt;

There's some pawn spawning code and bot class choosing code surrounding it, but the meat if the if that says if they don't have a team, do the overview function in the custom controller, which looks like this:

&lt;uscript&gt;exec function overview() {

  if(PlayerReplicationInfo.Team != none) {return;}
     Pawn.setCollision(false,false,false);  // we might need the pawn info, so don't destroy it
     Pawn.bHidden=True;                     // but hide it from the game world
     ClientOpenMenu(&quot;SpeciesBattle.SBTrader&quot;);  // open the GUIPage to decide a player class

}
&lt;/uscript&gt;

So that will open the SBTrader, a GUIPage which is essentially the class chooser. From there, the player selects their class which results in:

&lt;uscript&gt;function bool InternalOnClick(GUIComponent Sender)
{
	local PlayerController pc;
	local SBPlayer spc;

	pc = PlayerOwner();
        spc = SBPlayer(pc);
        if(spc==none){return false;}

	if(Sender==Controls[4]) // close
	{

		if(SpecList.List.Get() == HumanATitle) {  // User has selected &quot;Human Soldier&quot;
				spc.setSubSpecies(1);     // Set the correct Team/Player Class to the Controller
				spc.setSuperSpecies(0);
				spc.SetPlayerTeam(0);
				}
...

&lt;/uscript&gt;

So selecting the &quot;Human Soldier&quot; in the list has the controller set the following vars - superSpecies and subSpecies, using client replicated functions:

&lt;uscript&gt;class SBPlayer extends xPlayer;

var bool bIsFemale;
var int superSpecies;
var int subSpecies;
var int hCount,aCount,uCount;

replication
{
 // Things the server should send to the client.
 reliable if ( bNetDirty &amp;&amp; (Role == Role_Authority) )
  getTeamCount,hCount,aCount,uCount,bIsFemale,superSpecies,subSpecies;
 
 reliable if( Role&lt;ROLE_Authority )
  gotype,goteam,clearSpecies,SetPlayerTeam,overview,ReturnToWorld,setSubSpecies;
}

...
function setSuperSpecies(int s) {
  superSpecies = s;
  }

function setSubSpecies(int s) {
  subSpecies = s;
  }

...

&lt;/uscript&gt;

When you close the SBTrader [[Legacy:GUIPage|GUIPage]] it hits the ReturnToWorld function in the SBPlayer controller. All this does is destroy the current Pawn ( which didn't have the info to setup correctly ) and tell it to try again:

&lt;uscript&gt;
function ReturnToWorld() {
   Pawn.Destroy();                                // We'll get a new one
   log(&quot;SBPlayer &quot;$PlayerReplicationInfo.Team);   // This should never be blank at this point
   GotoState('Returning');                        // Head back to RestartPlayer()
}
&lt;/uscript&gt;

The team is now set - so when we hit RestartPlayer, the pawn remains and gets a chance to setup it's mesh and skin.  We have integers in our sub and superspecies to pick out what mesh and skin the pawn should use:

&lt;uscript&gt;simulated function Setup(xUtil.PlayerRecord rec, optional bool bLoadNow)
{
    if(PlayerReplicationInfo.Team != none) {    // this should be redundant
      if(PlayerReplicationInfo.Team.TeamName == &quot;Humans&quot;){SuperSpecies = 0;}
      if(PlayerReplicationInfo.Team.TeamName == &quot;Aliens&quot;){SuperSpecies = 1;}
      if(PlayerReplicationInfo.Team.TeamName == &quot;Undead&quot;){SuperSpecies = 2;}
      }
      //LOG(&quot;SBPAWN Super:&quot;$superSpecies$&quot; Sub:&quot;$SubSpecies);
	
      if(SuperSpecies == 0){    // Is Human
         if ( subSpecies == 1 ) {  
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanB';  //Is Fatboy Class
	 Species =  class'SpeciesBattle.SBSpecies_HumanB';
	 }else if ( subSpecies == 0 ){
	 Species = class'SpeciesBattle.SBSpecies_HumanA';    //Is Soldier Class
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanA';
	 }else{
	 Species = class'SpeciesBattle.SBSpecies_HumanC';    //Is Mecher Class
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanC';
         }
	    }

	  ...

	RagdollOverride = rec.Ragdoll;

if ( Species.static.Setup(self,rec) ){ResetPhysicsBasedAnim();} 

&lt;/uscript&gt;

Which in turn hits the Species setup, which I won't paste here as it basically just setups up the mesh and voice and is ugly but fairly straightforward.

From there, the ModifyPlayer function in the SpeciesType and the GameRules that are added from the Gameinfo handle the rest of the customization.

Another method is to simply trick the Pawn's setup to look at a specific PlayerName to setup the mesh and determine the species from a upl file - which is exactly how the game works normally. I'm personally not a big fan of upls for anything but bots, but it's a matter of preference. It would simplify the process some, however.

So ... *whew* . Um. Any questions?

----

'''Mychaeel:''' Well.  I think we have a [[:Category:Legacy To Do]] (formatting, subheaders, maybe some of the phrasing)...  :-)

'''RegularX:''' I need to add that I just put in a similar framework for Freehold that works on the same principle, but with about 1/4 of the code required for the Controller and the GameInfo classes.  I have zero time to update this page correctly now (besides, a wise programmer will learn from my mistakes ;) ) - but basically the species/class is held in a single var on the controller, the gameinfo checks for that to produce the class chooser, and otherwise goes to the super.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4571</id>
      <timestamp>2004-12-29T15:10:37Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>just some grammar changes</comment>
      <text xml:space="preserve">==Dissecting Riftwar: an early UT2003 example ==

'''Before you go any farther:''' I would recommend looking [[Legacy:RegularEngine/Player_Classes|RegularEngine/Player_Classes]] instead.  The RegularEngine is based on UT2004 code, so if you're still on UT2003, I cant' be sure it will work - but it's far more efficient, reliable and readable than what's on this page. '' ... RegX''

A class in [[Legacy:Mod_Ideas/Riftwar|Riftwar]] is ultimately defined by a SpeciesType class. It holds what the class looks like, what it's base attributes are, and it's default weapon/powerup. This is somewhat based on the Species mute left in by Epic (and revived by Brizz). Riftwar creates custom Species classes which hold all the unique aspects that will make a player class a player class.  So let's take a look at one of these classes, with some added comments:

&lt;uscript&gt;class SBSpecies_AlienB extends SBSpecies;

function getDescription() {}  // deprecated

defaultproperties{   // all of the properties for Pawn.Setup - this is what the player class will look like.
FemaleMeshName = &quot;HumanFemaleA.EgyptFemaleA&quot;;
FemaleBodySkinName = &quot;PlayerSkins.EgyptFemaleABodyA&quot;;
FemaleFaceSkinName = &quot;PlayerSkins.EgyptFemaleAHeadA&quot;;

MaleMeshName = &quot;HumanMaleA.EgyptMaleA&quot;;

...
FemaleSkeleton = &quot;HumanMaleA.SkeletonMale&quot;;

GibGroup=&quot;xEffects.xAlienGibGroup&quot;

RaceNum=1
}

defaultproperties {
	ReceivedDamageScaling=+1.0  // Player class stats like speed and damage control
	DamageScaling=+1.2
	...
	DefaultItem=&quot;xWeapons.ShockRifle&quot;  // Default Weapon for this player Class
	PowerUpCombo=&quot;xGame.ComboSpeed&quot;
	DefaultHealth=120 
        DefaultAdrenaline=0
        DefaultShieldAmount=0
	}
&lt;/uscript&gt;

OK, so that's a &quot;player class&quot;. How do you use it? Well, you have to get the [[Legacy:Pawn|Pawn]] and [[Legacy:Controller|Controller]] to set it up, and you have to get it all [[Legacy:Replication|replicated]] on the network. Here's a tip - Species from the Pawn isn't replicated (it's considered client info), so you'll need to have the Controller tell the Pawn what to do with some replicated vars.  Here is the order in which Riftwar takes a normal player who hasn't chosen a class and allows them to choose one:

# In RestartPlayer, the Controller is checked to determine if the player class has been chosen.  

# If it's determined that the player hasn't chosen a class, it stops restarting the player, tells the controller to hide it's pawn and present the user with an interface to choose one.

# The interface selects the player class and assigns variables to the Controller to remember what class to use.

# The Controller destroys it's pawn and goes back to RestartPlayer

# RestartPlayer detects the new variables, assigns the Controller a pawn and sets variables on the pawn to determine what class to use.  This is vital becase they way pawns are(n't) replicated, they are the real authority online as to their appearance. 

# The Pawn's setup uses these variables (in Riftwar, it's two ints) to know what mesh and skin to use and what species to assign.

# The ModifyPlayer function looks at the Species to determine modifications/weapons the player class has.

# RestartPlayer finishes, the player is in the game with it's new player class.

Let's look at this with some more detail and point and the pieces of code which comprise it:

The player hits RestartPlayer in the gameinfo when he gets to the level, there it checks to see if he has chosen a class:

&lt;uscript&gt;function RestartPlayer( Controller aPlayer )
{
    local NavigationPoint startSpot;
    local int TeamNum;
    local class&lt;Pawn&gt; DefaultPlayerClass;

    ...
    if ( aPlayer.Pawn == None )
    {
        aPlayer.GotoState('Dead');
        return;
    }

	if(SBPlayer(aPlayer) != none &amp;&amp; !aPlayer.PlayerReplicationInfo.bOutOfLives) {

	if(aPlayer.PlayerReplicationInfo.Team == none){  // No team means they don't know what player class they are
		SBPlayer(aPlayer).overview();            // This function tells the Controller to hide the pawn, open the GUI
		return;                                  // stop here - we can't restart the player yet
		}else{
		SBPawn(aPlayer.Pawn).superSpecies = SBPlayer(aPlayer).superSpecies;  // we know how to set this pawn, continue
		SBPawn(aPlayer.Pawn).subSpecies = SBPlayer(aPlayer).subSpecies;
   		}
		...
	}

&lt;/uscript&gt;

There's some pawn spawning code and bot class choosing code surrounding it, but the meat if the if that says if they don't have a team, do the overview function in the custom controller, which looks like this:

&lt;uscript&gt;exec function overview() {

  if(PlayerReplicationInfo.Team != none) {return;}
     Pawn.setCollision(false,false,false);  // we might need the pawn info, so don't destroy it
     Pawn.bHidden=True;                     // but hide it from the game world
     ClientOpenMenu(&quot;SpeciesBattle.SBTrader&quot;);  // open the GUIPage to decide a player class

}
&lt;/uscript&gt;

So that will open the SBTrader, a GUIPage which is essentially the class chooser. From there, the player selects their class which results in:

&lt;uscript&gt;function bool InternalOnClick(GUIComponent Sender)
{
	local PlayerController pc;
	local SBPlayer spc;

	pc = PlayerOwner();
        spc = SBPlayer(pc);
        if(spc==none){return false;}

	if(Sender==Controls[4]) // close
	{

		if(SpecList.List.Get() == HumanATitle) {  // User has selected &quot;Human Soldier&quot;
				spc.setSubSpecies(1);     // Set the correct Team/Player Class to the Controller
				spc.setSuperSpecies(0);
				spc.SetPlayerTeam(0);
				}
...

&lt;/uscript&gt;

So selecting the &quot;Human Soldier&quot; in the list has the controller set the following vars - superSpecies and subSpecies, using client replicated functions:

&lt;uscript&gt;class SBPlayer extends xPlayer;

var bool bIsFemale;
var int superSpecies;
var int subSpecies;
var int hCount,aCount,uCount;

replication
{
 // Things the server should send to the client.
 reliable if ( bNetDirty &amp;&amp; (Role == Role_Authority) )
  getTeamCount,hCount,aCount,uCount,bIsFemale,superSpecies,subSpecies;
 
 reliable if( Role&lt;ROLE_Authority )
  gotype,goteam,clearSpecies,SetPlayerTeam,overview,ReturnToWorld,setSubSpecies;
}

...
function setSuperSpecies(int s) {
  superSpecies = s;
  }

function setSubSpecies(int s) {
  subSpecies = s;
  }

...

&lt;/uscript&gt;

When you close the SBTrader [[Legacy:GUIPage|GUIPage]] it hits the ReturnToWorld function in the SBPlayer controller. All this does is destroy the current Pawn ( which didn't have the info to setup correctly ) and tell it to try again:

&lt;uscript&gt;
function ReturnToWorld() {
   Pawn.Destroy();                                // We'll get a new one
   log(&quot;SBPlayer &quot;$PlayerReplicationInfo.Team);   // This should never be blank at this point
   GotoState('Returning');                        // Head back to RestartPlayer()
}
&lt;/uscript&gt;

The team is now set - so when we hit RestartPlayer, the pawn remains and gets a chance to setup it's mesh and skin.  We have integers in our sub and superspecies to pick out what mesh and skin the pawn should use:

&lt;uscript&gt;simulated function Setup(xUtil.PlayerRecord rec, optional bool bLoadNow)
{
    if(PlayerReplicationInfo.Team != none) {    // this should be redundant
      if(PlayerReplicationInfo.Team.TeamName == &quot;Humans&quot;){SuperSpecies = 0;}
      if(PlayerReplicationInfo.Team.TeamName == &quot;Aliens&quot;){SuperSpecies = 1;}
      if(PlayerReplicationInfo.Team.TeamName == &quot;Undead&quot;){SuperSpecies = 2;}
      }
      //LOG(&quot;SBPAWN Super:&quot;$superSpecies$&quot; Sub:&quot;$SubSpecies);
	
      if(SuperSpecies == 0){    // Is Human
         if ( subSpecies == 1 ) {  
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanB';  //Is Fatboy Class
	 Species =  class'SpeciesBattle.SBSpecies_HumanB';
	 }else if ( subSpecies == 0 ){
	 Species = class'SpeciesBattle.SBSpecies_HumanA';    //Is Soldier Class
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanA';
	 }else{
	 Species = class'SpeciesBattle.SBSpecies_HumanC';    //Is Mecher Class
	 SBSpecies = class'SpeciesBattle.SBSpecies_HumanC';
         }
	    }

	  ...

	RagdollOverride = rec.Ragdoll;

if ( Species.static.Setup(self,rec) ){ResetPhysicsBasedAnim();} 

&lt;/uscript&gt;

Which in turn hits the Species setup, which I won't paste here as it basically just setups up the mesh and voice and is ugly but fairly straightforward.

From there, the ModifyPlayer function in the SpeciesType and the GameRules that are added from the Gameinfo handle the rest of the customization.

Another method is to simply trick the Pawn's setup to look at a specific PlayerName to setup the mesh and determine the species from a upl file - which is exactly how the game works normally. I'm personally not a big fan of upls for anything but bots, but it's a matter of preference. It would simplify the process some, however.

So ... *whew* . Um. Any questions?

----

'''Mychaeel:''' Well.  I think we have a [[:Category:Legacy To Do]] (formatting, subheaders, maybe some of the phrasing)...  :-)

'''RegularX:''' I need to add that I just put in a similar framework for Freehold that works on the same principle, but with about 1/4 of the code required for the Controller and the GameInfo classes.  I have zero time to update this page correctly now (besides, a wise programmer will learn from my mistakes ;) ) - but basically the species/class is held in a single var on the controller, the gameinfo checks for that to produce the class chooser, and otherwise goes to the super.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making A Static Mesh Translucent</title>
    <id>2212</id>
    <revision>
      <id>5355</id>
      <timestamp>2005-03-04T21:35:32Z</timestamp>
      <contributor>
        <ip>Shambler</ip>
      </contributor>
      <minor/>
      <comment>Added code comment above &quot;MakeActorTranslucent&quot;</comment>
      <text xml:space="preserve">This page describes how to '''dynamically''' make Static mesh's appear translucent (similar to the way Style=STY_Translucent could do the same with actors in Unreal Engine1), what that means is you should be able to modify the textures on any existing Static mesh during runtime and make them appear translucent using the Alpha drawtype.

In fact, you can do pretty much anything that can be done with the entire [[Legacy:Material|Material]]/[[Legacy:Shader|Shader]] system as this method relies on replacing a Static mesh's original textures.

The process of making existing texture's translucent on a Static mesh is not actually too difficult (albeit there are problems described later), but the hard part is [[Legacy:Dynamicly Accessing Original Static Mesh Textures|Dynamicly Accessing Original Static Mesh Textures]] but thankfully there is a page to describe how that's done :) (and you will need the code from that page, it is not included here because I intend to update these pages seperately AND this is a slightly different subject)

Here is the code I have used for making certain Static mesh's appear translucent, due to my limited knowledge of shaders I have had to limit this code in some respects (i.e. if some particular shader options are used it can interfere in such a way as to make the translucency effect not work) if you can improve on my workarounds for some shaders then please do as the code in it's current form is somewhat limited.

'''NOTE:'''You will find the latest ''FindStaticMeshSkins'' function code on the [[Legacy:Dynamicly Accessing Original Static Mesh Textures|Dynamicly Accessing Original Static Mesh Textures]] page.

&lt;UScript&gt;

// This function is used to create a new shader with an opacity channel at a certain Alpha (to create the translucency effect)

simulated function Shader CreateNewTShader()

{

	local Shader ShaderObj;

	ShaderObj = New Class'Engine.Shader';

	// Creates translucency

	ShaderObj.Opacity = New Class'Engine.ConstantColor';

	ConstantColor(ShaderObj.Opacity).Color.A = 128.0;

	return ShaderObj;

}

// This is the main function where most texture/shader changes are made

simulated function MakeActorTranslucent(actor A)

{

	local Array&lt;Material&gt; NewSkins;

	local Material TempMat;

	local int i;

	// First of all retrieve the list of existing skins

	NewSkins = FindStaticMeshSkins(A.StaticMesh);

	// Then iterate that list and try to make the skin translucent (using a ConstantColor modifier to change the Alpha)

	for (i=0; i&lt;NewSkins.Length; i++)

	{

		// If the skin is already a shader this creates some difficulty, the code will 'try' to compensate but you will notice that this will not work on a lot of things

		if (Shader(NewSkins[i]) != None)

		{

			// If SelfIllumination is set then your really screwed...This code tries to compensate with FallbackMaterial's...Open to suggestions here

			if (Shader(NewSkins[i]).SelfIllumination != None)

			{

				// Look for a useable FallbackMaterial, if you can't find one then get rid of the SelfIllumination (last resort)

				if (NewSkins[i].FallbackMaterial != None &amp;&amp; (Shader(NewSkins[i].FallbackMaterial) == none || Shader(Newskins[i].FallbackMaterial).SelfIllumination == none))

				{

					// If the FallbackMaterial is a shader itself then attempt to use it

					if (Shader(NewSkins[i].FallbackMaterial) != None)

						NewSkins[i] = NewSkins[i].FallbackMaterial;

					else

					{

						TempMat = NewSkins[i].FallbackMaterial;

						NewSkins[i] = CreateNewTShader();

						Shader(NewSkins[i]).Diffuse = TempMat;

					}

				}

				else if (NewSkins[i].FallbackMaterial == None)

					Shader(NewSkins[i]).SelfIllumination = None;

			}

			// Create translucency

			Shader(NewSkins[i]).Opacity = New Class'Engine.ConstantColor';

			ConstantColor(Shader(NewSkins[i]).Opacity).Color.A = 128;

		}

		// If this is called then the translucency changes should take place perfectly

		else

		{

			TempMat = CreateNewTShader();

			Shader(TempMat).Diffuse = NewSkins[i];

			NewSkins[i] = TempMat;

		}

		// Setup the actor's Skins array

		A.Skins[i] = NewSkins[i];

	}

}

&lt;/UScript&gt;

==Related Topics ==
* [[Legacy:Static Mesh|Static Mesh]]
* [[Legacy:Dynamicly Accessing Original Static Mesh Textures|Dynamicly Accessing Original Static Mesh Textures]]
* [[Legacy:Material|Material]]
* [[Legacy:Shader|Shader]]

==Comments==

'''Shambler:''' When I created this code for my own purposes I didn't have to account for every single possible combination of shaders and modifiers, thus if people know a good way of improving this code to work with more combinations of modifers etc. then please UPDATE this page (and preferably the code too) thanks :)</text>
    </revision>
    <revision>
      <id>5356</id>
      <timestamp>2005-03-03T12:05:00Z</timestamp>
      <contributor>
        <ip>Shambler</ip>
      </contributor>
      <minor/>
      <comment>Initial writeup</comment>
      <text xml:space="preserve">==Comments==

'''Shambler:''' Todo...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making An Interpolation Path</title>
    <id>1863</id>
    <revision>
      <id>4575</id>
      <timestamp>2005-01-14T03:07:34Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Definition ==

What the heck is an interpolation path? Quite simply, a triggered path that sends the player to diferrent points in it, in a specific order.  An interpolation path was used for Unreal Tournament's CityIntro map that starts up when you first load UT.  Some of the editable variables include skipping the next point, speed of the game (this makes cool matrix-like scenes possible if you know what you're doing), speed of the camera, etc.

An interpolated curve doesn't actually touch the points at all. It is pulled towards the points, but without actually going through them. (It is not the same as splining. A spline is a smoothed line that goes through all of the points in the path. This is commonly used for smooth paths, but not in Unreal.)

==Laying the path ==

The path points are defined with [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; [[Legacy:InterpolationPoint|InterpolationPoint]]. Set:

{|

|-
|Events -&gt; Tag
|Tie all the points with the name 
|-
|InterpolationPoint -&gt; Position
|order of each poit in the path, starting with 0
|-
|InterpolationPoint -&gt; bEndOfPath
|This value in the last point determines whether the path is open or closed
|}

You need at least 3 points for a closed path, 4 for an open path. When any point of the path is selected, UnreaEd shows the path as a curved white line, with little axes glyphs at intervals. These don't actually mean anything, and they will never rotate.

First of all, lay out your path. Find Actor &gt;&gt; Keypoint &gt;&gt; [[Legacy:InterpolationPoint|InterpolationPoint]] in the [[Legacy:Actor Classes Browser|Actor Classes Browser]].  The camera will travel in a straight line from one point to the next, so set your path up accordingly.  

Define the order of the points with the InterpolationPoint -&gt; Position property. This must be set to 0,1,2... etc.

'''Tarquin:''' No-one mentioned the freaky lines and circle that appears in UEd at this point! O_o Or that you need a minimum of 3. And bEndOfPath makes the lines disappear.

'''EntropicLqd:'''  And how the heck do you figure out which way the camera is actually pointing?  I've spent hours trying to figure out how to get my ''InterpolatingSkyZone'' to actually travel the path I want without any crazy rotations but to no avail.  It's fine most of the way around and then it suddenly goes wacky and spins randomly.

'''Tarquin:''' I've just got this to work. Doesnt seem any way to take the player ''off'' the path again. The direction of each IP gives the directio the player will point in, but the path glyphs in UEd dont show this. I've just made myself seasick.,,, urg

'''Mychaeel:''' No, it doesn't spin randomly.  It interpolates the angles numerically, so if one of your interpolation points is set to 355° and the next to 5° (a 10° difference, you'd think), it'll not rotate 355°...359°...0°...5° but ''backwards''.  To make it behave as you want it to, you'd have to set the second InterpolationPoint's rotation to 365° rather than 5°.

==The dynamics ==

The main use of a path is to make the player follow it. This is done with a [[Legacy:SpecialEvent|SpecialEvent]].

(what about making movers folow paths?)

Match the following to iniate the path
* SpecialEvent's Events -&gt; Event 
* All the IP's Events -&gt; Tag

'''Question''': How does one set the object which will take the path?

Set up a [[Legacy:Trigger|Trigger]] to trigger the SpecialEVent to set off the whole process.

Once you have your path laid out, right click on one of the points and select &quot;Select All Interpolation Point&quot;.  Now open the actor properties and change their Event Tags to &quot;Path1&quot; or, if you'd like, a diferrent  name of your choice.  Just make sure that you use that name instead of &quot;Path1&quot; wherever we mention it, if you do use something diferrent.

Now add a regular [[Legacy:Trigger|Trigger]] (Actor &gt;&gt; Triggers &gt;&gt; Trigger) wherever you like &amp;ndash; just make sure you'll be able to find it. To see it in game, either
* set it to display the trigger's sprite in game with Advanced -&gt; bHidden = True 
* set it to cast a small circle of light (set Lighting -&gt; LightType and LightColor properties)

Now, anywhere you like (it can be literally anywhere in the map, doesn't matter where), add a [[Legacy:SpecialEvent|SpecialEvent]] from the same menu.  Change its event tag to &quot;PathStart&quot;, and its Event to &quot;Path1&quot;.  Now open up the regular Trigger's properties and change its Event to &quot;PathStart&quot;.

'''Flopsy:''' Just a comment you need to set the Default State of the Special Event actor to PlayerPath under Object&gt;&gt;InitialState.

====Setting up the path's parameters====

In the properties for each point are modifiers for Game Speed (the speed of everything going on, including that of the camera - bullets will move slower based on this value, for example) and Camera Speed (the actual speed of the camera.  This rate of movement depends on the value in the game speed property).  Note that these are not the actual names of the properties - again my memory is foggy.  It should, however, be pretty obvious.  You'll just have to experiment with the values and se what speed works best for you.  Start with low numbers however.

====Finally====

While the interpolation path should now work in any game mode, playing it in, say, DM, will show your weapon as you move along the path.  You probably don't want this, unless you're making some sort of ride for the player (in single player for example).  In order to make the player appear without any HUD or weaponry of any kind, you'll have to set the default game type (under level properties) to the appropriate actor.  You can find these under Info&gt;GameInfo.  Again I forget the proper name (sorry about all this folks, it's been over a month since I've messed with interpol points), but it should have something to do with &quot;intro&quot; and will be fairly obvious.  Finally, you will need a playerstart in any case, of course, and rebuilding is just as mandatory as ever.  Unless you're doing something special, you'll probably just want to start the player hovering in the air over the trigger, so that they drop onto upon start, triggering your cutscene.

Please note that interpol points can be rotated just like playerstarts.  Whatever direction they are facing is the direction the camera will rotate to.

If I missed anything important, or if anybody wants to look up what the proper names are, feel free to edit it into this page.

''The following pages also have tutorial-style information on making paths. Merging those into this might be a good idea:''
* [[Legacy:UMS/InterpolationTutorial|UMS/InterpolationTutorial]]
* [[Legacy:InterpolationPoint|InterpolationPoint]]

----

content from other pages... refactoring &amp; mergine needed.

===Adding Interpolation Points to your map ===

# InterpolationPoints (hereafter called IP's) can be found under '''Keypoint &gt;&gt; InterpolationPoint''' in the [[Legacy:Actor Classes|Actor Classes]] Browser. The first thing to do is to add one to your level where you want the Interpolation path to start. IPs show a  directional arrow in UnrealEd, which defines (funnily enough) the direction that the actor on the path will be pointing. Set their direction with the [[Legacy:Brush Rotate|Brush Rotate]] tool or the Movement -&gt; Rotation property.

# In InterpolationPoint Properties -&gt; InterpolationPoint -&gt; Position, you should put the number that defines what point in the path this IP is at. This should start at 0, and I have been informed that the upper limit is 127 (thanks to TheMapper for that). 

# I think the best thing to do, is to first add the IP's to your level, in aproximately the right places. Then you can get the path set up correctly, before changing the speed. 

# Once you have got all your IP's in, there are two more that you have to put in. At the last point, you need to have two IP's. Then, put another one in the same position as the first, and give it the next Position after the last one. This is because IP paths actually loop, and the only way to get the path to go through a point is to put two IP's on top of each other. The reason the highest number IP is at the beginning of the path is because the actor following the path will start half way between the first and last IP's. 

===Setting the speed of the Interpolation Points===

# Once you have your path correct, you may want to play around with the speed. You will find that it looks a lot nicer if the speed does vary. Knowing when to vary the speed isn't something that I can teach you. 

# To change the speed, go to '''InterpolationPoint Properties -&gt; InterpolationPoint -&gt; RateModifier'''. Again, it is a matter of trial and error to find a series of values which you like. On each IP, the rate will be at that point, and it will change between the two points. If you want to change the rate very quickly, have two IPs very close to each other with different rate values.

# You can, if you want, change the speed of the game with the '''GameSpeedModifier''', but this works seperately from '''SetSpeed'''. If you do use '''GameSpeedModifier''', then make sure that it is reset back to 1 for the end of the IP path. 

----

* Note: Most of the content from this page is adapted from a tutorial for [[Legacy:UMS|UMS]] that [[Legacy:Hugh|Hugh]] wrote, and this section certainly isn't complete - the specifics of how to get an actor to actually follow the Interpolation path without using UMS I'm not clear on, maybe someone else could help out there &amp;ndash; ''Birelli''

This tutorial I'm only going to tell you the basic technical things you need to do to set up a regular interpolation path.  I'm not expert in this area, but I do know how to create one.  Please note that the terminal I am typing this up at is not equipped with Ued, so I may not tell you the exact name of things.  An interpolation point is actually &quot;InterpolPoint&quot; or something like that, it should be pretty obvious when you're staring at the Keypoint menu.

----

[[:Category:Legacy Tutorial]], [[:Category:Legacy To Do]]: mucho refactoring to do.

http://www.planetdeusex.com/tack/InterpolationPoints.html
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4576</id>
      <timestamp>2005-01-14T02:51:23Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>44756</id>
      <timestamp>2011-11-17T00:57:50Z</timestamp>
      <contributor>
        <ip>98.98.130.166</ip>
      </contributor>
      <comment>/* Laying the path */</comment>
      <text xml:space="preserve">==Definition ==

What the heck is an interpolation path? Quite simply, a triggered path that sends the player to diferrent points in it, in a specific order.  An interpolation path was used for Unreal Tournament's CityIntro map that starts up when you first load UT.  Some of the editable variables include skipping the next point, speed of the game (this makes cool matrix-like scenes possible if you know what you're doing), speed of the camera, etc.

An interpolated curve doesn't actually touch the points at all. It is pulled towards the points, but without actually going through them. (It is not the same as splining. A spline is a smoothed line that goes through all of the points in the path. This is commonly used for smooth paths, but not in Unreal.)

==Laying the path ==

The path points are defined with [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Keypoint (UT)|Keypoint (UT)]] &gt;&gt; [[Legacy:InterpolationPoint|InterpolationPoint]]. Set:

{|

|-
|Events -&gt; Tag
|Tie all the points with the name 
|-
|InterpolationPoint -&gt; Position
|order of each poit in the path, starting with 0
|-
|InterpolationPoint -&gt; bEndOfPath
|This value in the last point determines whether the path is open or closed
|}

You need at least 3 points for a closed path, 4 for an open path. When any point of the path is selected, UnreaEd shows the path as a curved white line, with little axes glyphs at intervals. These don't actually mean anything, and they will never rotate.

First of all, lay out your path. Find Actor &gt;&gt; Keypoint &gt;&gt; [[Legacy:InterpolationPoint|InterpolationPoint]] in the [[Legacy:Actor Classes Browser|Actor Classes Browser]].  The camera will travel in a straight line from one point to the next, so set your path up accordingly.  

Define the order of the points with the InterpolationPoint -&gt; Position property. This must be set to 0,1,2... etc.

'''Tarquin:''' No-one mentioned the freaky lines and circle that appears in UEd at this point! O_o Or that you need a minimum of 3. And bEndOfPath makes the lines disappear.

'''EntropicLqd:'''  And how the heck do you figure out which way the camera is actually pointing?  I've spent hours trying to figure out how to get my ''InterpolatingSkyZone'' to actually travel the path I want without any crazy rotations but to no avail.  It's fine most of the way around and then it suddenly goes wacky and spins randomly.

'''Tarquin:''' I've just got this to work. Doesnt seem any way to take the player ''off'' the path again. The direction of each IP gives the directio the player will point in, but the path glyphs in UEd dont show this. I've just made myself seasick.,,, urg

'''Mychaeel:''' No, it doesn't spin randomly.  It interpolates the angles numerically, so if one of your interpolation points is set to 355° and the next to 5° (a 10° difference, you'd think), it'll not rotate 355°...359°...0°...5° but ''backwards''.  To make it behave as you want it to, you'd have to set the second InterpolationPoint's rotation to 365° rather than 5°.

'''Neveos:'''  Everything is set correctly on mine (it is important that it starts at &quot;0&quot;, btw, or it crashes at the end), but it wants to head back to the first point at the end of the path, before ending.  It doesn't make it all the way to the beginning before it ends, but it definitely is heading to the first point as though it were the last point.  Why is this happening?

==The dynamics ==

The main use of a path is to make the player follow it. This is done with a [[Legacy:SpecialEvent|SpecialEvent]].

(what about making movers folow paths?)

Match the following to iniate the path
* SpecialEvent's Events -&gt; Event 
* All the IP's Events -&gt; Tag

'''Question''': How does one set the object which will take the path?

Set up a [[Legacy:Trigger|Trigger]] to trigger the SpecialEVent to set off the whole process.

Once you have your path laid out, right click on one of the points and select &quot;Select All Interpolation Point&quot;.  Now open the actor properties and change their Event Tags to &quot;Path1&quot; or, if you'd like, a diferrent  name of your choice.  Just make sure that you use that name instead of &quot;Path1&quot; wherever we mention it, if you do use something diferrent.

Now add a regular [[Legacy:Trigger|Trigger]] (Actor &gt;&gt; Triggers &gt;&gt; Trigger) wherever you like &amp;ndash; just make sure you'll be able to find it. To see it in game, either
* set it to display the trigger's sprite in game with Advanced -&gt; bHidden = True 
* set it to cast a small circle of light (set Lighting -&gt; LightType and LightColor properties)

Now, anywhere you like (it can be literally anywhere in the map, doesn't matter where), add a [[Legacy:SpecialEvent|SpecialEvent]] from the same menu.  Change its event tag to &quot;PathStart&quot;, and its Event to &quot;Path1&quot;.  Now open up the regular Trigger's properties and change its Event to &quot;PathStart&quot;.

'''Flopsy:''' Just a comment you need to set the Default State of the Special Event actor to PlayerPath under Object&gt;&gt;InitialState.

====Setting up the path's parameters====

In the properties for each point are modifiers for Game Speed (the speed of everything going on, including that of the camera - bullets will move slower based on this value, for example) and Camera Speed (the actual speed of the camera.  This rate of movement depends on the value in the game speed property).  Note that these are not the actual names of the properties - again my memory is foggy.  It should, however, be pretty obvious.  You'll just have to experiment with the values and se what speed works best for you.  Start with low numbers however.

====Finally====

While the interpolation path should now work in any game mode, playing it in, say, DM, will show your weapon as you move along the path.  You probably don't want this, unless you're making some sort of ride for the player (in single player for example).  In order to make the player appear without any HUD or weaponry of any kind, you'll have to set the default game type (under level properties) to the appropriate actor.  You can find these under Info&gt;GameInfo.  Again I forget the proper name (sorry about all this folks, it's been over a month since I've messed with interpol points), but it should have something to do with &quot;intro&quot; and will be fairly obvious.  Finally, you will need a playerstart in any case, of course, and rebuilding is just as mandatory as ever.  Unless you're doing something special, you'll probably just want to start the player hovering in the air over the trigger, so that they drop onto upon start, triggering your cutscene.

Please note that interpol points can be rotated just like playerstarts.  Whatever direction they are facing is the direction the camera will rotate to.

If I missed anything important, or if anybody wants to look up what the proper names are, feel free to edit it into this page.

''The following pages also have tutorial-style information on making paths. Merging those into this might be a good idea:''
* [[Legacy:UMS/InterpolationTutorial|UMS/InterpolationTutorial]]
* [[Legacy:InterpolationPoint|InterpolationPoint]]

----

content from other pages... refactoring &amp; mergine needed.

===Adding Interpolation Points to your map ===

# InterpolationPoints (hereafter called IP's) can be found under '''Keypoint &gt;&gt; InterpolationPoint''' in the [[Legacy:Actor Classes|Actor Classes]] Browser. The first thing to do is to add one to your level where you want the Interpolation path to start. IPs show a  directional arrow in UnrealEd, which defines (funnily enough) the direction that the actor on the path will be pointing. Set their direction with the [[Legacy:Brush Rotate|Brush Rotate]] tool or the Movement -&gt; Rotation property.

# In InterpolationPoint Properties -&gt; InterpolationPoint -&gt; Position, you should put the number that defines what point in the path this IP is at. This should start at 0, and I have been informed that the upper limit is 127 (thanks to TheMapper for that). 

# I think the best thing to do, is to first add the IP's to your level, in aproximately the right places. Then you can get the path set up correctly, before changing the speed. 

# Once you have got all your IP's in, there are two more that you have to put in. At the last point, you need to have two IP's. Then, put another one in the same position as the first, and give it the next Position after the last one. This is because IP paths actually loop, and the only way to get the path to go through a point is to put two IP's on top of each other. The reason the highest number IP is at the beginning of the path is because the actor following the path will start half way between the first and last IP's. 

===Setting the speed of the Interpolation Points===

# Once you have your path correct, you may want to play around with the speed. You will find that it looks a lot nicer if the speed does vary. Knowing when to vary the speed isn't something that I can teach you. 

# To change the speed, go to '''InterpolationPoint Properties -&gt; InterpolationPoint -&gt; RateModifier'''. Again, it is a matter of trial and error to find a series of values which you like. On each IP, the rate will be at that point, and it will change between the two points. If you want to change the rate very quickly, have two IPs very close to each other with different rate values.

# You can, if you want, change the speed of the game with the '''GameSpeedModifier''', but this works seperately from '''SetSpeed'''. If you do use '''GameSpeedModifier''', then make sure that it is reset back to 1 for the end of the IP path. 

----

* Note: Most of the content from this page is adapted from a tutorial for [[Legacy:UMS|UMS]] that [[Legacy:Hugh|Hugh]] wrote, and this section certainly isn't complete - the specifics of how to get an actor to actually follow the Interpolation path without using UMS I'm not clear on, maybe someone else could help out there &amp;ndash; ''Birelli''

This tutorial I'm only going to tell you the basic technical things you need to do to set up a regular interpolation path.  I'm not expert in this area, but I do know how to create one.  Please note that the terminal I am typing this up at is not equipped with Ued, so I may not tell you the exact name of things.  An interpolation point is actually &quot;InterpolPoint&quot; or something like that, it should be pretty obvious when you're staring at the Keypoint menu.

----

[[:Category:Legacy Tutorial]], [[:Category:Legacy To Do]]: mucho refactoring to do.

http://www.planetdeusex.com/tack/InterpolationPoints.html
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Arches</title>
    <id>1767</id>
    <revision>
      <id>4335</id>
      <timestamp>2005-08-25T01:25:07Z</timestamp>
      <contributor>
        <ip>H8024845235.dsl.speedlinq.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

It's entirely possible to make an arch by just subtracting a nicely-shaped brush between two rooms. However, it's more efficient from the point of view of the game engine to use a slightly different strategy: a square hole is made first with a subtractive brush, and this is then filled up again with a [[Legacy:Semisolid|semisolid]] brush.

Using a semisolid ensures that the diagonal lines of the arch's curvature only cause [[Legacy:BSP|BSP]] cuts locally. The arch textures found in many UT packages are designed to be used in this way, applied on both sides of the semisolid brush.

Picture of the overall strategy:

[[Image:Legacy_archconstruction.gif|center|]]

==Method ==

===Preparing your level for an arch ===

Depending on how big your arch is going to be, you'll need to substract a hole big enough to fit the arch.

Mostly it will be 128-256 width, 128-256 high and 16-32 deep.

===Making the Arch using 2D-editor ===

You now need a brush shape that will fill most of this hole back in, leaving just the arch. This can be easily created in the [[Legacy:2D Shape Editor|2D Shape Editor]].

We've made a start on gathering up 2D shape files for the arch textures that come with UT, so eventually this step may not be needed...

In the meantime: starting with the basic square, select the bottom side by selecting the bottom right vertex. Split this, move the new point up, then split the sides that have just become diagonal. Continue splitting and moving points into place until the shape covers the solid wall part of the arch texture: picture below. The [[Legacy:Making A 2D Shape|Making a 2D shape]] page has more details on this step.

[[Image:Legacy_2D-arch.gif|center|]]

===Tips on matching up to an Arch texture ===
* The easiest way is to import the texture into the 2D-Editor. '''Warning''': this can sometimes crash UnrealEd. This is for the fearless.
* Subtract a cube brush with the same dimensions as the texture, so that the floor has the texture exactly lines up. Now start drawing your shape. To check how you're doing:
*# Extrude the shape
*# Line up the [[Legacy:Red Builder Brush|red builder brush]] to your texture testing room in top view
*# in side or front view, place the top of the RBB just touching the floor of the texture testing room.
*# Compare the edges of the RBB with the texture.

===Adding the arch as a semisolid in your level ===

Once the arch is finished in 2D-editor you still need to turn it into a real brush for use in your level.

# Hit the extrude button
# Type in how long you want the arch to be. I found 16 or 32 to be rather good. It really depends on the level though.
# The red builder brush in UED should now get the shape of your arch.
# Rotate it. If it doesn't rotate correctly, you'll have to [[Legacy:Transform Permanently|Transform Permanently]]) and move it in place. See [[Legacy:Brush Rotate|Brush Rotate]] for info on dealing with rotation problems.
# Now you can do two things:
## Add it as a regular brush, right-click it and goto Solidity-&gt;Semi-Solid
##Click Add Special in the [[Legacy:Toolbox|toolbox]] and select Semi-Solid Decoration from the presets list.

===Merging the polys of the arch ===

It's always good to merge polys on arches, because the 2D-editor will create the arch of a whole bunch of polys and aligning an arch-texture can be a pain. Also merging polys should improve performance ;)

So you should definetely merge polys on your arch. For instructions on how to do this, go here: [[Legacy:Merge Polygons|Merge Polygons]].

===Texturing your arch ===

Since by this time the arch should have merged polys, texturing it will be rather easy. Just select the arch texture you want it to have and apply it to the arch. Move it in place and your set ,)

''Question'': What needs to be said about texturing the inside of the arch??&lt;br /&gt;

''To Do'':
* texturing: choosing textures that match for the arch surround &amp; the wall beyond. 
** Strategies for dealing with arch textures that don't have a seamless match to a wall texture (sinking the arch into the wall or protruding it for example, or adding trim around it)

==Arch textures in Standard UT texture packs ==

Add your name to the list item if you have the corresponding 2DS file or intend to make it.

* Ancient (3, indentical shape) &amp;ndash; Tarquin
* Castle1 (1 texture)
* Crypt2
** cInoxDra, cInoxDrf, 
** ClifRch1, rch1trch
** ClifRch2, rch2trch
** ClifRch3
* DecayedS (some door textures only)
* ...
* PlayrShip
** vDoor2, Door2_30   &amp;ndash; Tarquin
** Door1BK &amp; friends
* Indus2 (Frame1C == the arch from Castle1)
* Indus3: one arch &amp; door texture
* Mine
** 3 arches
** MDoors series &amp;ndash; Tarquin has the door shape only, not the outer part
** MMdoor1
* SkyCity
** Arches: many diffrent arches, matching walltextures included

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4336</id>
      <timestamp>2003-05-25T08:54:15Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==Introduction ==

It's entirely possible to make an arch by just subtracting a nicely-shaped brush between two rooms. However, it's more efficient from the point of view of the game engine to use a slightly different strategy: a square hole is made first with a subtractive brush, and this is then filled up again with a [[Legacy:Semisolid|semisolid]] brush.

Using a semisolid ensures that the diagonal lines of the arch's curvature only cause [[Legacy:BSP|BSP]] cuts locally. The arch textures found in many UT packages are designed to be used in this way, applied on both sides of the semisolid brush.

Picture of the overall strategy:

[[Image:Legacy_archconstruction.gif|center|]]

==Method ==

===Preparing your level for an arch ===

Depending on how big your arch is going to be, you'll need to substract a hole big enough to fit the arch.

Mostly it will be 128-256 width, 128-256 high and 16-32 deep.

===Making the Arch using 2D-editor ===

You now need a brush shape that will fill most of this hole back in, leaving just the arch. This can be easily created in the [[Legacy:2D Shape Editor|2D Shape Editor]].

We've made a start on gathering up 2D shape files for the arch textures that come with UT, so eventually this step may not be needed...

In the meantime: starting with the basic square, select the bottom side by selecting the bottom right vertex. Split this, move the new point up, then split the sides that have just become diagonal. Continue splitting and moving points into place until the shape covers the solid wall part of the arch texture: picture below. The [[Legacy:Making A 2D Shape|Making a 2D shape]] page has more details on this step.

[[Image:Legacy_2D-arch.gif|center|]]

===Tips on matching up to an Arch texture ===
* The easiest way is to import the texture into the 2D-Editor. '''Warning''': this can sometimes crash UnrealEd. This is for the fearless.
* Subtract a cube brush with the same dimensions as the texture, so that the floor has the texture exactly lines up. Now start drawing your shape. To check how you're doing:
*# Extrude the shape
*# Line up the [[Legacy:Red Builder Brush|red builder brush]] to your texture testing room in top view
*# in side or front view, place the top of the RBB just touching the floor of the texture testing room.
*# Compare the edges of the RBB with the texture.

===Adding the arch as a semisolid in your level ===

Once the arch is finished in 2D-editor you still need to turn it into a real brush for use in your level.

# Hit the extrude button
# Type in how long you want the arch to be. I found 16 or 32 to be rather good. It really depends on the level though.
# The red builder brush in UED should now get the shape of your arch.
# Rotate it. If it doesn't rotate correctly, you'll have to [[Legacy:Transform Permanently|Transform Permanently]]) and move it in place. See [[Legacy:Brush Rotate|Brush Rotate]] for info on dealing with rotation problems.
# Now you can do two things:
## Add it as a regular brush, right-click it and goto Solidity-&gt;Semi-Solid
##Click Add Special in the [[Legacy:Toolbox|toolbox]] and select Semi-Solid Decoration from the presets list.

===Merging the polys of the arch ===

It's always good to merge polys on arches, because the 2D-editor will create the arch of a whole bunch of polys and aligning an arch-texture can be a pain. Also merging polys should improve performance ;)

So you should definetely merge polys on your arch. For instructions on how to do this, go here: [[Legacy:Merge Polygons|Merge Polygons]].

===Texturing your arch ===

Since by this time the arch should have merged polys, texturing it will be rather easy. Just select the arch texture you want it to have and apply it to the arch. Move it in place and your set ,)

''Question'': What needs to be said about texturing the inside of the arch??&lt;br /&gt;

''To Do'':
* texturing: choosing textures that match for the arch surround &amp; the wall beyond. 
** Strategies for dealing with arch textures that don't have a seamless match to a wall texture (sinking the arch into the wall or protruding it for example, or adding trim around it)

==Arch textures in Standard UT texture packs ==

Add your name to the list item if you have the corresponding 2DS file or intend to make it.

* Ancient (3, indentical shape) &amp;ndash; Tarquin
* Castle1 (1 texture)
* Crypt2
** cInoxDra, cInoxDrf, 
** ClifRch1, rch1trch
** ClifRch2, rch2trch
** ClifRch3
* DecayedS (some door textures only)
* ...
* PlayrShip
** vDoor2, Door2_30   &amp;ndash; Tarquin
** Door1BK &amp; friends
* Indus2 (Frame1C == the arch from Castle1)
* Indus3: one arch &amp; door texture
* Mine
** 3 arches
** MDoors series &amp;ndash; Tarquin has the door shape only, not the outer part
** MMdoor1

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Architecture</title>
    <id>1837</id>
    <revision>
      <id>4511</id>
      <timestamp>2007-01-03T07:54:58Z</timestamp>
      <contributor>
        <ip>68-186-60-242.dhcp.mghl.ca.charter.com</ip>
      </contributor>
      <comment>Added a couple tips/guidelines for realistic skybox creation.</comment>
      <text xml:space="preserve">Some basic and advanced techniques to improve your level and to take into consideration during the design process.

==Break the Scale==

A map made up of nothing but a few large subtractions and a few lights is not sufficient. Detail is needed. How?

The room shapes themselves should be more than a cube. Extrusions and recessions, sloping, etc. serve to break up the scale.  The human mind needs comparisons to really appreciate the scale of something.  When you first played onslaught, you thought a Goliath was unstoppable until you saw a Leviathan...

On top of the basic room structure, add detail with [[Legacy:Static Mesh|static meshes]].  These help the player form a sense of scale, making your bigger spaces seem that much more vast.

Another thing you can do is to try and change ceiling heights.  That too will break up your scale.  One of the most effective tricks that architect [[Wikipedia:Frank Lloyd Wright]] used to do was have a tiny entrance hallway with a low ceiling and then opened it up to a huge room giving a sense of grandeur and making that room seem bigger.  You can do that in UT too.

When you use columns try and put them on a wider base so they are not straight. Using a cube as a base for round columns will also give your geometry more variety.  Maybe even make an I beam as they look pretty rad.  Aside from these possibly playing a role in your gameplay they will also help add more variety to the map.

==Unity==

Another thing is unity.  You may often see cool architectural elements like trusses repeated throughout a building.  This creates a sense of cohesiveness, as if the whole building was made by the same group of people in a single time period.  Why would someone build a building out of mud with wooden beams and have the doorway made out of riveted steel?  They wouldn't, unless they're insane, stupid, or happen to have a riveted steel doorway built and are only capable of building a building out of mud and wooden (it's very unlikely though). However, you could also have the approach that the structure was built by aliens, who may have radically different ways about thinking about things like this. Architecture that seems ludicrous to us may be perfectly normal for them.

Unity is just as important in outside spaces: you don't want one side of the map to be like Mars and another like Earth &amp;ndash; unless of course you intend to tie it in with a dramatic feature like an eco dome or something.  The thing about themes is that it can make or break a player's sense of immersion.

Immersiveness and the sense of space play a huge role in architecture.  A good architect will account for what a person feels when in a particular space.  In the case of UT this means that you want the player to be into your map.  Think of it like this.  You may have seen a movie that you hated because everything was so stupidly unreal (no pun intended) and made no sense.  You couldn't get into it.  That's what I mean.  You need a sense of cohesiveness and a dose of reality along with the helping of unreality.

While it's important that your map is coherent, beware of remaining too similar throughout. While you do want repetition of key elements you want different areas to contrast while still obeying the overall theme. DM-Tempest is a good example of what I mean. You don't want to have a map that looks like it was made out of a million identical lego blocks, so beware of overusing the same static meshes and/or textures.

==Proportions==

Proportions are very important.  Fortunately if you use the [[Legacy:Grid|grid]] you already are doing proportional work to some extent.  The thing about proportions is that they have a rhythm that makes it easier on the eyes.  And let me tell you beauty is easy on the eyes.  In fact there was a study that the better looking people are, the more proportional their facial elements are.

'''T1:''' I want a link to tell me where this study is, and who did it.

So for example, in your room the walls may be twice as long as they are high.  The floor may have a raised platform about a quarter of its area in the center and the ceiling has an opening right above it covering about half of the area. This assumes that you aren't trying to evoke a chaotic feeling in the player, and it also assumes that the level isn't a city after being hit by a nuke, of course. If you have too much symmetry, the level becomes monotonous and seems like it's made out of a million identical lego blocks. Try to have a balance of symmetry and some very slight asymmetrical elements.

==Lights==

Lighting detail adds realism and atmosphere. Purely ambient lighting generally isn't very good looking. A [[Legacy:Light|light actor]] alone does not suffice.The light needs to come from somewhere. That's where the architecture aspect comes in. Try adding the static mesh &quot;HumanoidArchitecture.Lights.PanLightB&quot; behind your light actor. Looks better, doesn't it?  Lights are some of the most overlooked things by new mappers. 

Coloring is a must for good atmosphere as well. Try opening LightProperties and setting Saturation to 153. The light is now red. LightSaturation sets the extent of coloration. Now set LightHue to 35. The light is a good flame color.

Alternatively you could have a beam or something running over head with lights hanging from there.  That may work too.  Exactly why should you do this?  Well for one thing because you should.  When you break up the scale and make things less massier it becomes easier for us to relate to them.  In case you didn't notice, our species (at least most of us) enjoys things it can relate to.

Their are many ways to make light sources. You could go into the [[Legacy:2D Shape Editor|2D Shape Editor]] and make some simple shapes and turn them sideways in the editor and place a lightsource on them. A good package for lightsource textures are in the mine.utx package. You could also try to make a ground light that is right beside your hallways. These stand out good with red lights. (Only use red lights in dark areas for coolness) When your dealing with normal light sources you should scale down the radius of your lights because it just looks better to have the contrasts between the color from dark to light in your rooms as opposed to a totally bright room with no unity. Don't use the disco lights, this is what is called &quot;OMG N00B |_1GH+1|\|G&quot;.

[[Image:Legacy_DavidMredlight.jpeg|center|This is the DavidM red light that everyone hears about. 200 brightness, 8 radius, reddish color.]]

You might also want to try to add a [[Legacy:Corona|corona]] right in front of your light sources to make it stand out from down a hallway. You might also want to try a [[Legacy:Lightbox|lightbox]] too. Lightboxes do a good job when you place an item right under them. You could easily make an overhead light that you can hang from the ceiling by taking a rectangle and having two other rectangles coming out of the top and extending to the roof. Those can also be substituted with chains or something from the [[Legacy:VolumetricBuilder|VolumetricBuilder]].

[[Image:Legacy_CoronaHallway.jpeg|center|Here is an example of viewing a corona from down a hallway. Really stands out from a distance.]]

If you got the spaceship alien style level you might want to use some texture palette loops to make the constant change in color. It adds to style but it looks kind of weird from ground lights so I'd place them up near the ceiling.

When your dealing with liquids around you you might want to place some light around by the lava or slime to give effect on the surroundings, you don't have to lower the light radius so much with lava.

==Interactive Environment==

Another good thing to do is to make your map have lots of interactivity so it never seems to be boring. You can use [[Legacy:AmbientSound|AmbientSound]] to give players a sense of environment. You can place these near water, lights, machinery etc. You might also want to try to set up button activated traps and doors to give the players more interactivity. Another thing is give the player a dangerous area in the map. It gives the player something to be carefull of and will most definitely keep you more on the edge in a battle. This can be done easily in a space map where edges of plateforms mean your life. Also can be done with lava or slime pits or maybe even a large rotating fan of death. Or an Ion beam.

You can also try to zone in an area and turn it into a healing zone like HealPod by adding a [[Legacy:ZoneInfo|ZoneInfo]] inside your zoned in area and go to ZoneInfo and changing &lt;code&gt;bPainzone&lt;/code&gt; to True and &lt;code&gt;DamagePerSecond&lt;/code&gt; to a ''negative'' value.

Another great idea for an interactive environment is to create lots of destructable terrain in your level; which can be done buy subtracting things and making movers in its place and setting them to move out of the level when shot (preferably by a rocket or and explosion).

Another thing you might consider is maybe some [[Legacy:Laser Trip Bomb|laser trip bomb]]s. You can use these to make something valuable hard to get to. For example surround your redeemer with lasers. Another good idea is just use [[Legacy:ClientScriptedTexture|ClientScriptedTexture]]s or Mychaeel's [[Legacy:Screen|Screen]] to give your map some displays that will tell current ranks of players and other information. Another crazy idea is touchplates that open up walls with special items like shield belts in them. A nice idea is a trap room, where you have a room with a powerup inside, but somebody from the outside can pull switch and kill everyone inside, like for example in DM-Pressure.

==Fill in the Blanks of Your Map==

After your done getting the general look of your map you should go through it again and create some objects in the way like pillars and remove pieces out of the floor. An overused cliche that is used everywhere in first person shooters is a floor tile raised and moved over some and rotated about 45 degrees. This might makes sense in a ancient stone ruins, but for example in Doom 3 on the first level, it's as if some engineer got drunk and decided to open random parts of the floor with a crowbar, exposing the electronics beneath. You might also want to try to flood lower floors of your map with a thin layer of water for extra looks ([[Legacy:Snowdog|Snowdog]]'s JB-Talaeron is a good example). Maybe remove some planks in a wooden bridge. Crates are ok too but they mostly block you from the action so stick them in corners and not in the middle of your level, unless you use them as cover or stairs. You might also want to put masked weeds or chains on pillars an overhead beams to hang down and provide some cover. When you make all your platforms and such you have to take into consideration the weight of such things and what would it take for them to be suspended above the ground. Use this idea to create lots of beams linking your platforms to the walls and ground. Try to make all your beams connect together somewhere; it looks nice and fills in spaces.

[[Image:Legacy_AmonPlanks.jpeg|center|A nice example of the work of Hourences... Non-stop action and masterful details.]]

==Gravity/Velocity Changes ==

If you are doing a space map or something with an antigravity room you might want to try to zone in the room with lots of [[Legacy:Zone Portal|zone portal]]s and then add a [[Legacy:ZoneInfo|ZoneInfo]] in the area and set the &lt;code&gt;ZoneGravity&lt;/code&gt; property. You can also change the &lt;code&gt;ZoneVelocity&lt;/code&gt; property in ZoneInfo to make it feel like your being pulled up or down or where ever, works great if you have a fan somewhere or a zip tube of somesort. [[Legacy:Kicker|Kicker]]s are a great thing to have in a spacemap and can really get the flow and [[Legacy:Z-Axis|z-axis]] fighting going. In UT2003/2004 you should probably use volumes instead.

[[Image:Legacy_KickerAction.jpeg|center|A perfect example of how to keep flow going everywhere with kickers.]]

Ever hear of a gravity kicker? Try to make a tube or a pit with gravity going backwards, you'll see just how neat it actually is. Or another neat idea is to surround your level with volumes that are all backwards gravity to the direction. Meaning that say you shoot something and miss your enemy, it will turn around and fly back at you. Creating a whole new theme for a level. See, gravity aint so bad now is it!

==Add New Textures To Old Surfaces ==

A good way to get rid of the boring old plain textures on walls, floors and ceilings is to make a cube or whatever shape you want and add it to the surface of another texture. It makes it appear to be part of it and will randomize your textures and make them look good. You can use this to make good looking edges around ramps and floors and to simulate carpets on the floors. You can even place those CTF symbols on the walls which is handy when your mapping for CTF. Easy as adding (not subtracting) a textured cube right under your work.

[[Image:Legacy_BrushSinking.jpeg|center|Brush sinking action on the sides of all the plateforms.]]

[[Legacy:Brush Sinking|Brush Sinking]] explains this technique in detail.

==When Placing Items==

When you start to place items you might not want them to be sitting on flat ground because that would be quite boring indeed. You might want to create thin cylinder brush for it to sit on or maybe make some kind of stair set in a corner going up to the item. In UT2003/2004 xWeaponBases already serve this function. You might also want to place items in holes in the floor. Another thing to remember when placing weapons is to place them where someone is going to be. Not in a corner of a wide open area. Try to place everything on a path that the players would take so that it keeps the action going. Health on the other hand should be against walls and corners or even in a dangerous area so that it is more of a risk to get to because you have to leave your normal path. Ammo should most likely be by your weapon but if you spread it around you wont do that much harm. It makes it a challenge to keep killing with a good gun. See [[Legacy:Map Flow|Map Flow]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]] for more.
 

[[Image:Legacy_Weaponshot.jpeg|center|This is not a boring space to go for a weapon. You have to climb up into an open area and notice the brush sinking underneath the weapon.]]

==Skybox Seems Plain &amp;ndash; What Do I Do?==

When you make your [[Legacy:SkyBox|SkyBox]] all nice you may want to consider putting some architecture in the way of the skybox to make it look nicer. This can be done in an inside building map with simple overhead beams and maybe grates. In an outside map it should be left fine because it just would look weird unless it goes with the theme. Another thing to put infront of your skybox could be a window, like a skywindow over the top of your level with beams going through it and maybe even make the window breakable.

See [[Legacy:Making Glass Break|Making Glass Break]]

Not only is the presentation of the skybox important, but the actual appearance of it is just as vital. A proper skybox can give the player a true sense of awe (for example, the player notices comets strewn throughout a starry sky, and is so impressed that he/she is compelled to stop and look up for a few seconds). For outdoor maps, one technique is to make two sheets (one higher than the other) leaving the lower sheet to be translucent. By mixing and matching the textures of each sheet (cloud textures, skies, space etc.) and by placing lights in between the sheets, one can achieve more realistic skies. It's also a good idea to make the sky in your skybox pan (in the case of the two-sheets example, making one pan at an angle slightly greater than that of the other sheet is realistic). 

[[Image:Legacy_AmonSkybox.jpeg|center|A shot from Hourences' DM-Amon. Some nice architecture in the way of the skybox to add effect. Try to picture that missing... Just won't happen will it.]]

Particle effects in skyboxes can also be a good effect.

==Level Layout Tips==

When designing a level it is really all up to you to do but you might want to consider a few things. When linking rooms try to provide multiple ways in and out of them to get good flow going; you can do this by putting hallways on ground level and on raised platforms. Another good idea may be to use [[Legacy:Teleporter|teleporter]]s. When you design large rooms and they seem so boring try to add ledges around them. When making lifts try not to make one so that when you get in you have to turn around to get out, unless it's part of the risk fact of using the lift. Give the players the choice of going up the slower stairs, or going up the faster lift that requires turning around.

==Think Technically==

Created a nice ledge or machine in the level? Think that's enough? Well you're WRONG! As mentioned above, we like something we can relate to, so always think about making it as realistic as possible, unless in 0 gravity, or it's made out of some kind of super-light but strong material, that ledge or machine or very high wall is gonna need supports to keep it standing, you could even have a trigger to snap the supports and make the object fall down, killing anyone underneath it, MUAH HU HU HU HA HA HAAA!!! See [[Legacy:Triggers (UT)|Triggers (UT)]], [[Legacy:Mover|Mover]] and [[Legacy:Making Glass Break|Making Glass Break]] to make this happen (you'll have to make the wall break instead though)

[[Image:Legacy_supports.jpeg|center|Here you can see the supports holding up the grating platform, taken from my DM-Encarceration (still in development)]]

==It's All About Flow==

Newbie mappers might make the mistake of drawing inspiration from their home or their school.  In real life, many rooms have a single entrance / exit, and a layout designed for watching TV, preparing food, or listening to the lecture.  This is not the purpose of spaces in UT.  In UT your tasks are pretty much kill, avoid being killed, hide, or get to a pickup.  

Look at the options a player has at any given point in your map.  I wouldn't want to be walking down the long narrow corridor between two rooms when a guy appears at the far end stacking up multiple rockets.  What are my escape routes?  Similarly,  After getting to a pickup, it's a good feeling to be able to choose from a couple of options about where to go next ''without having to turn back''.  If you look at good maps, you rarely see actual definable rooms: you see a large space with BSP slightly limiting where you can go, what you can see, and who can get you: this is a sign of good flow.  Avoid the &quot;room, corridor, room&quot; syndrome, loathed by all reviewers. The exception is when you place a good powerup like a redeemer or udamage in a narrow hall, making it risky to go and get it, but worth the risk. It forces the player to make a choice: &quot;Do I go into that narrow hall with only one way out and get the 'deemer, and possibly getting mowed down before I can reach it, or not?&quot;

Think of flow as a way to move around a level, multiple ways in and out of each area. Each area feels different.  Kickers, lifts and teleporters everywhere.  No hassle to get to any guns or ammo. No problem finding health.

You can tell if a level has flow if you know where a weapon is going to be placed, or what must be done to open that special door. Just things mappers do a lot that help you quickly get a complex map down pat while playing that make it all that better. Try to avoid cubish maps, or perhaps start with a cube and shape it. Think of z-axis gameplay all the time. Unless your going for a total carnage approach you might want extra ledges and breaking up the height scale on things. That way you can shoot at things from all angles.

See [[Legacy:Map Flow|Map Flow]] for more.

==Approaches To Level Design==

Everyone has to start out somewhere, with a blank area. But everyone has their own approach at creating their levels.

The Twiggman

----

I (The Twiggman) have just discovered what may be a simple and yet professional looking approch. Make note I have not used it yet in level design but so far I think it may help those cube looking hallways and such really take form and flow with the same theme throughout the level. Ok here I go at explaining this one. First just make different parts of your map. Like make a high detailed 512X512X512 area which can be used as a hallway section. Then copy paste that to a layout. Or wherever you may see fit. And then next make high detailed corners and so on. Do all the parts seperate then connect them. It also allows you to put the details and things very early on so that you can build on them later. But it will provide a nice looking template for the level if you run out of good ideas for some parts. And you can also use your little template area for other maps too. Lol some of my maps have been really rushed, I dont even want to talk about fractal 2. Must have been on crack that day. But the next thing to be released I will try this approch. Seems to look nice so far though. As for the layout, I usually end up freestyling them. If I ever plan anything it usually turns out way off scale, no flow or connectivity so in my case it's better to go with freestyling.

'''T1:''' Isn't this generally the idea behind staticmeshes?

==Putting Feelings Into A Level ==

Lets start with a quote from Hourences.

&quot;A feeling is being created by the perfect balance between all aspects, starting from architecture, to details, to light, to music, to sound to effects etc. cliches work fine too, all those things you see in horror movies for examples its emotion, and emotions aren't bound to laws and rules, hard to make up a schedule on how to work then.&quot;

As he stated, a feeling or mood can be placed into a level through perhaps lighting techniques. Use the same colors throughout a level, or perhaps try for the same shadowcasts. Gives a unique feeling. Or maybe you don't want to have anything look the same. 

==Related Topics==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]

==Discussion==

'''JustaAverageKid''': This page could use some screenshots, let's use example maps or existing maps for easier understanding. So far, it's looking great :D

&quot;Justus&quot; That's what I thought myself more screenshots would help.

'''The Twiggman''': I'll see what I can do about the screenshots, I'll take a few example shots and try the uploaded and see what happens. :)

'''Luggage:''' I thought this was about architecture... Wtf do items and ambientsounds have to do with architecture? I'd figure that scaling, lighting and shapes are the most important points about architecture. Lighting influences scale - dark stripes in corridors create a sense of distance for example. Shapes are the very basic thing about architecture. Not indiviual shapes, but the ''piece of architecture'' as a whole. (-&gt; Cohesiveness...)

It's about breaking lines too. If you create your first corridor, you got lots of horizontal lines. Break them up with some vertical &quot;trim&quot;, and add some atmospheric lighting... and you've got a w00ty stylish corridor. (Sorta)

Architecture ''flows''. It's not seperate parts. It all goes together.

The rest is a question of style, i.e. your personal development as an (architecture) artist.

'''Tarquin:'''  I think some items here &amp; on [[Legacy:Mapping For DM|Mapping For DM]] could be moved to their own page. Some stuff could be moved to [[Legacy:Map Flow|Map Flow]] or one of the [[Legacy:Lighting|Lighting]] pages.

'''EntropicLqd:'''  One thing that would be nice is some references to books on Architectural styles.  I've been trying to find one with lots of ''good pictures'' (cos I'm lazy) but not suceeded so far.

'''The Twiggman''' God knows how this turned out to be another mapping tips guide but anyone can easily add tutorials to make architecture. Their sure is a lot of tips in here; I usually put new information that I find and use in here so it's quite a handy bunch to read up on.

'''Legal:''' Pics are broken :( Btw Twiggy, done any maps for SWAT 3 as Stickman?

'''The Twiggman''' Wow, haven't been around here in awhile. lol, no I haven't, must be some other stick like person

'''The Twiggman''' Still adding info wherever possible to this source. It's a good read now and again.

'''Sweavo:''' I made some pretty substantial changes to a few parts - some rewrites, some moving of paras.  I thought some parts lost the way a little bit, plus that one para actually asking us to re-write it! ... But i've not addressed the refactoring issue as I'm not familiar with the other pages mentioned.  Hope I've not pee'd anyone off too much.

----

===Refactoring===

'''Tarquin:''' parts of this page should be moved to [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] and [[Legacy:Mapping Checklist|Mapping Checklist]].

'''ZxAnPhOrIaN:''' Yeah, and there should be a combined [[Legacy:Map Enhancements|Map Enhancements]] page also.

'''SuperApe:''' All design elements here are covered in [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]].  To me, this feels like one big rant.  This should either be refactored into a tutorial or into the above mentioned pages (i.e., [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] and [[Legacy:Mapping Checklist|Mapping Checklist]]).  

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Refactor Me]] &amp;ndash; see Refactoring Discussion above
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4512</id>
      <timestamp>2005-12-02T22:44:48Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Some basic and advanced techniques to improve your level and to take into consideration during the design process.

==Break the Scale==

A map made up of nothing but a few large subtractions and a few lights is not sufficient. Detail is needed. How?

The room shapes themselves should be more than a cube. Extrusions and recessions, sloping, etc. serve to break up the scale.  The human mind needs comparisons to really appreciate the scale of something.  When you first played onslaught, you thought a Goliath was unstoppable until you saw a Leviathan...

On top of the basic room structure, add detail with [[Legacy:Static Mesh|static meshes]].  These help the player form a sense of scale, making your bigger spaces seem that much more vast.

Another thing you can do is to try and change ceiling heights.  That too will break up your scale.  One of the most effective tricks that architect [[Wikipedia:Frank Lloyd Wright]] used to do was have a tiny entrance hallway with a low ceiling and then opened it up to a huge room giving a sense of grandeur and making that room seem bigger.  You can do that in UT too.

When you use columns try and put them on a wider base so they are not straight. Using a cube as a base for round columns will also give your geometry more variety.  Maybe even make an I beam as they look pretty rad.  Aside from these possibly playing a role in your gameplay they will also help add more variety to the map.

==Unity==

Another thing is unity.  You may often see cool architectural elements like trusses repeated throughout a building.  This creates a sense of cohesiveness, as if the whole building was made by the same group of people in a single time period.  Why would someone build a building out of mud with wooden beams and have the doorway made out of riveted steel?  They wouldn't, unless they're insane, stupid, or happen to have a riveted steel doorway built and are only capable of building a building out of mud and wooden (it's very unlikely though). However, you could also have the approach that the structure was built by aliens, who may have radically different ways about thinking about things like this. Architecture that seems ludicrous to us may be perfectly normal for them.

Unity is just as important in outside spaces: you don't want one side of the map to be like Mars and another like Earth &amp;ndash; unless of course you intend to tie it in with a dramatic feature like an eco dome or something.  The thing about themes is that it can make or break a player's sense of immersion.

Immersiveness and the sense of space play a huge role in architecture.  A good architect will account for what a person feels when in a particular space.  In the case of UT this means that you want the player to be into your map.  Think of it like this.  You may have seen a movie that you hated because everything was so stupidly unreal (no pun intended) and made no sense.  You couldn't get into it.  That's what I mean.  You need a sense of cohesiveness and a dose of reality along with the helping of unreality.

While it's important that your map is coherent, beware of remaining too similar throughout. While you do want repetition of key elements you want different areas to contrast while still obeying the overall theme. DM-Tempest is a good example of what I mean. You don't want to have a map that looks like it was made out of a million identical lego blocks, so beware of overusing the same static meshes and/or textures.

==Proportions==

Proportions are very important.  Fortunately if you use the [[Legacy:Grid|grid]] you already are doing proportional work to some extent.  The thing about proportions is that they have a rhythm that makes it easier on the eyes.  And let me tell you beauty is easy on the eyes.  In fact there was a study that the better looking people are, the more proportional their facial elements are.

'''T1:''' I want a link to tell me where this study is, and who did it.

So for example, in your room the walls may be twice as long as they are high.  The floor may have a raised platform about a quarter of its area in the center and the ceiling has an opening right above it covering about half of the area. This assumes that you aren't trying to evoke a chaotic feeling in the player, and it also assumes that the level isn't a city after being hit by a nuke, of course. If you have too much symmetry, the level becomes monotonous and seems like it's made out of a million identical lego blocks. Try to have a balance of symmetry and some very slight asymmetrical elements.

==Lights==

Lighting detail adds realism and atmosphere. Purely ambient lighting generally isn't very good looking. A [[Legacy:Light|light actor]] alone does not suffice.The light needs to come from somewhere. That's where the architecture aspect comes in. Try adding the static mesh &quot;HumanoidArchitecture.Lights.PanLightB&quot; behind your light actor. Looks better, doesn't it?  Lights are some of the most overlooked things by new mappers. 

Coloring is a must for good atmosphere as well. Try opening LightProperties and setting Saturation to 153. The light is now red. LightSaturation sets the extent of coloration. Now set LightHue to 35. The light is a good flame color.

Alternatively you could have a beam or something running over head with lights hanging from there.  That may work too.  Exactly why should you do this?  Well for one thing because you should.  When you break up the scale and make things less massier it becomes easier for us to relate to them.  In case you didn't notice, our species (at least most of us) enjoys things it can relate to.

Their are many ways to make light sources. You could go into the [[Legacy:2D Shape Editor|2D Shape Editor]] and make some simple shapes and turn them sideways in the editor and place a lightsource on them. A good package for lightsource textures are in the mine.utx package. You could also try to make a ground light that is right beside your hallways. These stand out good with red lights. (Only use red lights in dark areas for coolness) When your dealing with normal light sources you should scale down the radius of your lights because it just looks better to have the contrasts between the color from dark to light in your rooms as opposed to a totally bright room with no unity. Don't use the disco lights, this is what is called &quot;OMG N00B |_1GH+1|\|G&quot;.

[[Image:Legacy_DavidMredlight.jpeg|center|This is the DavidM red light that everyone hears about. 200 brightness, 8 radius, reddish color.]]

You might also want to try to add a [[Legacy:Corona|corona]] right in front of your light sources to make it stand out from down a hallway. You might also want to try a [[Legacy:Lightbox|lightbox]] too. Lightboxes do a good job when you place an item right under them. You could easily make an overhead light that you can hang from the ceiling by taking a rectangle and having two other rectangles coming out of the top and extending to the roof. Those can also be substituted with chains or something from the [[Legacy:VolumetricBuilder|VolumetricBuilder]].

[[Image:Legacy_CoronaHallway.jpeg|center|Here is an example of viewing a corona from down a hallway. Really stands out from a distance.]]

If you got the spaceship alien style level you might want to use some texture palette loops to make the constant change in color. It adds to style but it looks kind of weird from ground lights so I'd place them up near the ceiling.

When your dealing with liquids around you you might want to place some light around by the lava or slime to give effect on the surroundings, you don't have to lower the light radius so much with lava.

==Interactive Environment==

Another good thing to do is to make your map have lots of interactivity so it never seems to be boring. You can use [[Legacy:AmbientSound|AmbientSound]] to give players a sense of environment. You can place these near water, lights, machinery etc. You might also want to try to set up button activated traps and doors to give the players more interactivity. Another thing is give the player a dangerous area in the map. It gives the player something to be carefull of and will most definitely keep you more on the edge in a battle. This can be done easily in a space map where edges of plateforms mean your life. Also can be done with lava or slime pits or maybe even a large rotating fan of death. Or an Ion beam.

You can also try to zone in an area and turn it into a healing zone like HealPod by adding a [[Legacy:ZoneInfo|ZoneInfo]] inside your zoned in area and go to ZoneInfo and changing &lt;code&gt;bPainzone&lt;/code&gt; to True and &lt;code&gt;DamagePerSecond&lt;/code&gt; to a ''negative'' value.

Another great idea for an interactive environment is to create lots of destructable terrain in your level; which can be done buy subtracting things and making movers in its place and setting them to move out of the level when shot (preferably by a rocket or and explosion).

Another thing you might consider is maybe some [[Legacy:Laser Trip Bomb|laser trip bomb]]s. You can use these to make something valuable hard to get to. For example surround your redeemer with lasers. Another good idea is just use [[Legacy:ClientScriptedTexture|ClientScriptedTexture]]s or Mychaeel's [[Legacy:Screen|Screen]] to give your map some displays that will tell current ranks of players and other information. Another crazy idea is touchplates that open up walls with special items like shield belts in them. A nice idea is a trap room, where you have a room with a powerup inside, but somebody from the outside can pull switch and kill everyone inside, like for example in DM-Pressure.

==Fill in the Blanks of Your Map==

After your done getting the general look of your map you should go through it again and create some objects in the way like pillars and remove pieces out of the floor. An overused cliche that is used everywhere in first person shooters is a floor tile raised and moved over some and rotated about 45 degrees. This might makes sense in a ancient stone ruins, but for example in Doom 3 on the first level, it's as if some engineer got drunk and decided to open random parts of the floor with a crowbar, exposing the electronics beneath. You might also want to try to flood lower floors of your map with a thin layer of water for extra looks ([[Legacy:Snowdog|Snowdog]]'s JB-Talaeron is a good example). Maybe remove some planks in a wooden bridge. Crates are ok too but they mostly block you from the action so stick them in corners and not in the middle of your level, unless you use them as cover or stairs. You might also want to put masked weeds or chains on pillars an overhead beams to hang down and provide some cover. When you make all your platforms and such you have to take into consideration the weight of such things and what would it take for them to be suspended above the ground. Use this idea to create lots of beams linking your platforms to the walls and ground. Try to make all your beams connect together somewhere; it looks nice and fills in spaces.

[[Image:Legacy_AmonPlanks.jpeg|center|A nice example of the work of Hourences... Non-stop action and masterful details.]]

==Gravity/Velocity Changes ==

If you are doing a space map or something with an antigravity room you might want to try to zone in the room with lots of [[Legacy:Zone Portal|zone portal]]s and then add a [[Legacy:ZoneInfo|ZoneInfo]] in the area and set the &lt;code&gt;ZoneGravity&lt;/code&gt; property. You can also change the &lt;code&gt;ZoneVelocity&lt;/code&gt; property in ZoneInfo to make it feel like your being pulled up or down or where ever, works great if you have a fan somewhere or a zip tube of somesort. [[Legacy:Kicker|Kicker]]s are a great thing to have in a spacemap and can really get the flow and [[Legacy:Z-Axis|z-axis]] fighting going. In UT2003/2004 you should probably use volumes instead.

[[Image:Legacy_KickerAction.jpeg|center|A perfect example of how to keep flow going everywhere with kickers.]]

Ever hear of a gravity kicker? Try to make a tube or a pit with gravity going backwards, you'll see just how neat it actually is. Or another neat idea is to surround your level with volumes that are all backwards gravity to the direction. Meaning that say you shoot something and miss your enemy, it will turn around and fly back at you. Creating a whole new theme for a level. See, gravity aint so bad now is it!

==Add New Textures To Old Surfaces ==

A good way to get rid of the boring old plain textures on walls, floors and ceilings is to make a cube or whatever shape you want and add it to the surface of another texture. It makes it appear to be part of it and will randomize your textures and make them look good. You can use this to make good looking edges around ramps and floors and to simulate carpets on the floors. You can even place those CTF symbols on the walls which is handy when your mapping for CTF. Easy as adding (not subtracting) a textured cube right under your work.

[[Image:Legacy_BrushSinking.jpeg|center|Brush sinking action on the sides of all the plateforms.]]

[[Legacy:Brush Sinking|Brush Sinking]] explains this technique in detail.

==When Placing Items==

When you start to place items you might not want them to be sitting on flat ground because that would be quite boring indeed. You might want to create thin cylinder brush for it to sit on or maybe make some kind of stair set in a corner going up to the item. In UT2003/2004 xWeaponBases already serve this function. You might also want to place items in holes in the floor. Another thing to remember when placing weapons is to place them where someone is going to be. Not in a corner of a wide open area. Try to place everything on a path that the players would take so that it keeps the action going. Health on the other hand should be against walls and corners or even in a dangerous area so that it is more of a risk to get to because you have to leave your normal path. Ammo should most likely be by your weapon but if you spread it around you wont do that much harm. It makes it a challenge to keep killing with a good gun. See [[Legacy:Map Flow|Map Flow]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]] for more.
 

[[Image:Legacy_Weaponshot.jpeg|center|This is not a boring space to go for a weapon. You have to climb up into an open area and notice the brush sinking underneath the weapon.]]

==Skybox Seems Plain &amp;ndash; What Do I Do?==

When you make your [[Legacy:SkyBox|SkyBox]] all nice you may want to consider putting some architecture in the way of the skybox to make it look nicer. This can be done in an inside building map with simple overhead beams and maybe grates. In an outside map it should be left fine because it just would look weird unless it goes with the theme. Another thing to put infront of your skybox could be a window, like a skywindow over the top of your level with beams going through it and maybe even make the window breakable.

See [[Legacy:Making Glass Break|Making Glass Break]]

[[Image:Legacy_AmonSkybox.jpeg|center|A shot from Hourences' DM-Amon. Some nice architecture in the way of the skybox to add effect. Try to picture that missing... Just won't happen will it.]]

Particle effects in skyboxes can also be a good effect.

==Level Layout Tips==

When designing a level it is really all up to you to do but you might want to consider a few things. When linking rooms try to provide multiple ways in and out of them to get good flow going; you can do this by putting hallways on ground level and on raised platforms. Another good idea may be to use [[Legacy:Teleporter|teleporter]]s. When you design large rooms and they seem so boring try to add ledges around them. When making lifts try not to make one so that when you get in you have to turn around to get out, unless it's part of the risk fact of using the lift. Give the players the choice of going up the slower stairs, or going up the faster lift that requires turning around.

==Think Technically==

Created a nice ledge or machine in the level? Think that's enough? Well you're WRONG! As mentioned above, we like something we can relate to, so always think about making it as realistic as possible, unless in 0 gravity, or it's made out of some kind of super-light but strong material, that ledge or machine or very high wall is gonna need supports to keep it standing, you could even have a trigger to snap the supports and make the object fall down, killing anyone underneath it, MUAH HU HU HU HA HA HAAA!!! See [[Legacy:Triggers (UT)|Triggers (UT)]], [[Legacy:Mover|Mover]] and [[Legacy:Making Glass Break|Making Glass Break]] to make this happen (you'll have to make the wall break instead though)

[[Image:Legacy_supports.jpeg|center|Here you can see the supports holding up the grating platform, taken from my DM-Encarceration (still in development)]]

==It's All About Flow==

Newbie mappers might make the mistake of drawing inspiration from their home or their school.  In real life, many rooms have a single entrance / exit, and a layout designed for watching TV, preparing food, or listening to the lecture.  This is not the purpose of spaces in UT.  In UT your tasks are pretty much kill, avoid being killed, hide, or get to a pickup.  

Look at the options a player has at any given point in your map.  I wouldn't want to be walking down the long narrow corridor between two rooms when a guy appears at the far end stacking up multiple rockets.  What are my escape routes?  Similarly,  After getting to a pickup, it's a good feeling to be able to choose from a couple of options about where to go next ''without having to turn back''.  If you look at good maps, you rarely see actual definable rooms: you see a large space with BSP slightly limiting where you can go, what you can see, and who can get you: this is a sign of good flow.  Avoid the &quot;room, corridor, room&quot; syndrome, loathed by all reviewers. The exception is when you place a good powerup like a redeemer or udamage in a narrow hall, making it risky to go and get it, but worth the risk. It forces the player to make a choice: &quot;Do I go into that narrow hall with only one way out and get the 'deemer, and possibly getting mowed down before I can reach it, or not?&quot;

Think of flow as a way to move around a level, multiple ways in and out of each area. Each area feels different.  Kickers, lifts and teleporters everywhere.  No hassle to get to any guns or ammo. No problem finding health.

You can tell if a level has flow if you know where a weapon is going to be placed, or what must be done to open that special door. Just things mappers do a lot that help you quickly get a complex map down pat while playing that make it all that better. Try to avoid cubish maps, or perhaps start with a cube and shape it. Think of z-axis gameplay all the time. Unless your going for a total carnage approach you might want extra ledges and breaking up the height scale on things. That way you can shoot at things from all angles.

See [[Legacy:Map Flow|Map Flow]] for more.

==Approaches To Level Design==

Everyone has to start out somewhere, with a blank area. But everyone has their own approach at creating their levels.

The Twiggman

----

I (The Twiggman) have just discovered what may be a simple and yet professional looking approch. Make note I have not used it yet in level design but so far I think it may help those cube looking hallways and such really take form and flow with the same theme throughout the level. Ok here I go at explaining this one. First just make different parts of your map. Like make a high detailed 512X512X512 area which can be used as a hallway section. Then copy paste that to a layout. Or wherever you may see fit. And then next make high detailed corners and so on. Do all the parts seperate then connect them. It also allows you to put the details and things very early on so that you can build on them later. But it will provide a nice looking template for the level if you run out of good ideas for some parts. And you can also use your little template area for other maps too. Lol some of my maps have been really rushed, I dont even want to talk about fractal 2. Must have been on crack that day. But the next thing to be released I will try this approch. Seems to look nice so far though. As for the layout, I usually end up freestyling them. If I ever plan anything it usually turns out way off scale, no flow or connectivity so in my case it's better to go with freestyling.

'''T1:''' Isn't this generally the idea behind staticmeshes?

==Putting Feelings Into A Level ==

Lets start with a quote from Hourences.

&quot;A feeling is being created by the perfect balance between all aspects, starting from architecture, to details, to light, to music, to sound to effects etc. cliches work fine too, all those things you see in horror movies for examples its emotion, and emotions aren't bound to laws and rules, hard to make up a schedule on how to work then.&quot;

As he stated, a feeling or mood can be placed into a level through perhaps lighting techniques. Use the same colors throughout a level, or perhaps try for the same shadowcasts. Gives a unique feeling. Or maybe you don't want to have anything look the same. 

==Related Topics==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]

==Discussion==

'''JustaAverageKid''': This page could use some screenshots, let's use example maps or existing maps for easier understanding. So far, it's looking great :D

&quot;Justus&quot; That's what I thought myself more screenshots would help.

'''The Twiggman''': I'll see what I can do about the screenshots, I'll take a few example shots and try the uploaded and see what happens. :)

'''Luggage:''' I thought this was about architecture... Wtf do items and ambientsounds have to do with architecture? I'd figure that scaling, lighting and shapes are the most important points about architecture. Lighting influences scale - dark stripes in corridors create a sense of distance for example. Shapes are the very basic thing about architecture. Not indiviual shapes, but the ''piece of architecture'' as a whole. (-&gt; Cohesiveness...)

It's about breaking lines too. If you create your first corridor, you got lots of horizontal lines. Break them up with some vertical &quot;trim&quot;, and add some atmospheric lighting... and you've got a w00ty stylish corridor. (Sorta)

Architecture ''flows''. It's not seperate parts. It all goes together.

The rest is a question of style, i.e. your personal development as an (architecture) artist.

'''Tarquin:'''  I think some items here &amp; on [[Legacy:Mapping For DM|Mapping For DM]] could be moved to their own page. Some stuff could be moved to [[Legacy:Map Flow|Map Flow]] or one of the [[Legacy:Lighting|Lighting]] pages.

'''EntropicLqd:'''  One thing that would be nice is some references to books on Architectural styles.  I've been trying to find one with lots of ''good pictures'' (cos I'm lazy) but not suceeded so far.

'''The Twiggman''' God knows how this turned out to be another mapping tips guide but anyone can easily add tutorials to make architecture. Their sure is a lot of tips in here; I usually put new information that I find and use in here so it's quite a handy bunch to read up on.

'''Legal:''' Pics are broken :( Btw Twiggy, done any maps for SWAT 3 as Stickman?

'''The Twiggman''' Wow, haven't been around here in awhile. lol, no I haven't, must be some other stick like person

'''The Twiggman''' Still adding info wherever possible to this source. It's a good read now and again.

'''Sweavo:''' I made some pretty substantial changes to a few parts - some rewrites, some moving of paras.  I thought some parts lost the way a little bit, plus that one para actually asking us to re-write it! ... But i've not addressed the refactoring issue as I'm not familiar with the other pages mentioned.  Hope I've not pee'd anyone off too much.

----

===Refactoring===

'''Tarquin:''' parts of this page should be moved to [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] and [[Legacy:Mapping Checklist|Mapping Checklist]].

'''ZxAnPhOrIaN:''' Yeah, and there should be a combined [[Legacy:Map Enhancements|Map Enhancements]] page also.

'''SuperApe:''' All design elements here are covered in [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]].  To me, this feels like one big rant.  This should either be refactored into a tutorial or into the above mentioned pages (i.e., [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] and [[Legacy:Mapping Checklist|Mapping Checklist]]).  

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Refactor Me]] &amp;ndash; see Refactoring Discussion above
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35398</id>
      <timestamp>2009-09-03T18:36:47Z</timestamp>
      <contributor>
        <ip>79.68.155.252</ip>
      </contributor>
      <comment>/* Lights */</comment>
      <text xml:space="preserve">Some basic and advanced techniques to improve your level and to take into consideration during the design process.

==Break the Scale==

A map made up of nothing but a few large subtractions and a few lights is not sufficient. Detail is needed. How?

The room shapes themselves should be more than a cube. Extrusions and recessions, sloping, etc. serve to break up the scale.  The human mind needs comparisons to really appreciate the scale of something.  When you first played onslaught, you thought a Goliath was unstoppable until you saw a Leviathan...

On top of the basic room structure, add detail with [[Legacy:Static Mesh|static meshes]].  These help the player form a sense of scale, making your bigger spaces seem that much more vast.

Another thing you can do is to try and change ceiling heights.  That too will break up your scale.  One of the most effective tricks that architect [[Wikipedia:Frank Lloyd Wright]] used to do was have a tiny entrance hallway with a low ceiling and then opened it up to a huge room giving a sense of grandeur and making that room seem bigger.  You can do that in UT too.

When you use columns try and put them on a wider base so they are not straight. Using a cube as a base for round columns will also give your geometry more variety.  Maybe even make an I beam as they look pretty rad.  Aside from these possibly playing a role in your gameplay they will also help add more variety to the map.

==Unity==

Another thing is unity.  You may often see cool architectural elements like trusses repeated throughout a building.  This creates a sense of cohesiveness, as if the whole building was made by the same group of people in a single time period.  Why would someone build a building out of mud with wooden beams and have the doorway made out of riveted steel?  They wouldn't, unless they're insane, stupid, or happen to have a riveted steel doorway built and are only capable of building a building out of mud and wooden (it's very unlikely though). However, you could also have the approach that the structure was built by aliens, who may have radically different ways about thinking about things like this. Architecture that seems ludicrous to us may be perfectly normal for them.

Unity is just as important in outside spaces: you don't want one side of the map to be like Mars and another like Earth &amp;ndash; unless of course you intend to tie it in with a dramatic feature like an eco dome or something.  The thing about themes is that it can make or break a player's sense of immersion.

Immersiveness and the sense of space play a huge role in architecture.  A good architect will account for what a person feels when in a particular space.  In the case of UT this means that you want the player to be into your map.  Think of it like this.  You may have seen a movie that you hated because everything was so stupidly unreal (no pun intended) and made no sense.  You couldn't get into it.  That's what I mean.  You need a sense of cohesiveness and a dose of reality along with the helping of unreality.

While it's important that your map is coherent, beware of remaining too similar throughout. While you do want repetition of key elements you want different areas to contrast while still obeying the overall theme. DM-Tempest is a good example of what I mean. You don't want to have a map that looks like it was made out of a million identical lego blocks, so beware of overusing the same static meshes and/or textures.

==Proportions==

Proportions are very important.  Fortunately if you use the [[Legacy:Grid|grid]] you already are doing proportional work to some extent.  The thing about proportions is that they have a rhythm that makes it easier on the eyes.  And let me tell you beauty is easy on the eyes.  In fact there was a study that the better looking people are, the more proportional their facial elements are.

'''T1:''' I want a link to tell me where this study is, and who did it.

So for example, in your room the walls may be twice as long as they are high.  The floor may have a raised platform about a quarter of its area in the center and the ceiling has an opening right above it covering about half of the area. This assumes that you aren't trying to evoke a chaotic feeling in the player, and it also assumes that the level isn't a city after being hit by a nuke, of course. If you have too much symmetry, the level becomes monotonous and seems like it's made out of a million identical lego blocks. Try to have a balance of symmetry and some very slight asymmetrical elements.

==Lights==

Lighting detail adds realism and atmosphere. Purely ambient lighting generally isn't very good looking. A [[Legacy:Light|light actor]] alone does not suffice.The light needs to come from somewhere. That's where the architecture aspect comes in. Try adding the static mesh &quot;HumanoidArchitecture.Lights.PanLightB&quot; behind your light actor. Looks better, doesn't it?  Lights are some of the most overlooked things by new mappers. 

Coloring is a must for good atmosphere as well. Try opening LightProperties and setting Saturation to 153. The light is now red. LightSaturation sets the extent of coloration. Now set LightHue to 35. The light is a good flame color.

Alternatively you could have a beam or something running over head with lights hanging from there.  That may work too.  Exactly why should you do this?  Well for one thing because you should.  When you break up the scale and make things less massier it becomes easier for us to relate to them.  In case you didn't notice, our species (at least most of us) enjoys things it can relate to.

Their are many ways to make light sources. You could go into the [[Legacy:2D Shape Editor|2D Shape Editor]] and make some simple shapes and turn them sideways in the editor and place a lightsource on them. A good package for lightsource textures are in the mine.utx package. You could also try to make a ground light that is right beside your hallways. These stand out good with red lights. (Only use red lights in dark areas for coolness) When your dealing with normal light sources you should scale down the radius of your lights because it just looks better to have the contrasts between the color from dark to light in your rooms as opposed to a totally bright room with no unity. Don't use the disco lights, this is what we in the buisness call a &quot;N00B |_1GH+1|\|G&quot;.

[[Image:Legacy_DavidMredlight.jpeg|center|This is the DavidM red light that everyone hears about. 200 brightness, 8 radius, reddish color.]]

You might also want to try to add a [[Legacy:Corona|corona]] right in front of your light sources to make it stand out from down a hallway. You might also want to try a [[Legacy:Lightbox|lightbox]] too. Lightboxes do a good job when you place an item right under them. You could easily make an overhead light that you can hang from the ceiling by taking a rectangle and having two other rectangles coming out of the top and extending to the roof. Those can also be substituted with chains or something from the [[Legacy:VolumetricBuilder|VolumetricBuilder]].

[[Image:Legacy_CoronaHallway.jpeg|center|Here is an example of viewing a corona from down a hallway. Really stands out from a distance.]]

If you got the spaceship alien style level you might want to use some texture palette loops to make the constant change in color. It adds to style but it looks kind of weird from ground lights so I'd place them up near the ceiling.

When your dealing with liquids around you you might want to place some light around by the lava or slime to give effect on the surroundings, you don't have to lower the light radius so much with lava.

==Interactive Environment==

Another good thing to do is to make your map have lots of interactivity so it never seems to be boring. You can use [[Legacy:AmbientSound|AmbientSound]] to give players a sense of environment. You can place these near water, lights, machinery etc. You might also want to try to set up button activated traps and doors to give the players more interactivity. Another thing is give the player a dangerous area in the map. It gives the player something to be carefull of and will most definitely keep you more on the edge in a battle. This can be done easily in a space map where edges of plateforms mean your life. Also can be done with lava or slime pits or maybe even a large rotating fan of death. Or an Ion beam.

You can also try to zone in an area and turn it into a healing zone like HealPod by adding a [[Legacy:ZoneInfo|ZoneInfo]] inside your zoned in area and go to ZoneInfo and changing &lt;code&gt;bPainzone&lt;/code&gt; to True and &lt;code&gt;DamagePerSecond&lt;/code&gt; to a ''negative'' value.

Another great idea for an interactive environment is to create lots of destructable terrain in your level; which can be done buy subtracting things and making movers in its place and setting them to move out of the level when shot (preferably by a rocket or and explosion).

Another thing you might consider is maybe some [[Legacy:Laser Trip Bomb|laser trip bomb]]s. You can use these to make something valuable hard to get to. For example surround your redeemer with lasers. Another good idea is just use [[Legacy:ClientScriptedTexture|ClientScriptedTexture]]s or Mychaeel's [[Legacy:Screen|Screen]] to give your map some displays that will tell current ranks of players and other information. Another crazy idea is touchplates that open up walls with special items like shield belts in them. A nice idea is a trap room, where you have a room with a powerup inside, but somebody from the outside can pull switch and kill everyone inside, like for example in DM-Pressure.

==Fill in the Blanks of Your Map==

After your done getting the general look of your map you should go through it again and create some objects in the way like pillars and remove pieces out of the floor. An overused cliche that is used everywhere in first person shooters is a floor tile raised and moved over some and rotated about 45 degrees. This might makes sense in a ancient stone ruins, but for example in Doom 3 on the first level, it's as if some engineer got drunk and decided to open random parts of the floor with a crowbar, exposing the electronics beneath. You might also want to try to flood lower floors of your map with a thin layer of water for extra looks ([[Legacy:Snowdog|Snowdog]]'s JB-Talaeron is a good example). Maybe remove some planks in a wooden bridge. Crates are ok too but they mostly block you from the action so stick them in corners and not in the middle of your level, unless you use them as cover or stairs. You might also want to put masked weeds or chains on pillars an overhead beams to hang down and provide some cover. When you make all your platforms and such you have to take into consideration the weight of such things and what would it take for them to be suspended above the ground. Use this idea to create lots of beams linking your platforms to the walls and ground. Try to make all your beams connect together somewhere; it looks nice and fills in spaces.

[[Image:Legacy_AmonPlanks.jpeg|center|A nice example of the work of Hourences... Non-stop action and masterful details.]]

==Gravity/Velocity Changes ==

If you are doing a space map or something with an antigravity room you might want to try to zone in the room with lots of [[Legacy:Zone Portal|zone portal]]s and then add a [[Legacy:ZoneInfo|ZoneInfo]] in the area and set the &lt;code&gt;ZoneGravity&lt;/code&gt; property. You can also change the &lt;code&gt;ZoneVelocity&lt;/code&gt; property in ZoneInfo to make it feel like your being pulled up or down or where ever, works great if you have a fan somewhere or a zip tube of somesort. [[Legacy:Kicker|Kicker]]s are a great thing to have in a spacemap and can really get the flow and [[Legacy:Z-Axis|z-axis]] fighting going. In UT2003/2004 you should probably use volumes instead.

[[Image:Legacy_KickerAction.jpeg|center|A perfect example of how to keep flow going everywhere with kickers.]]

Ever hear of a gravity kicker? Try to make a tube or a pit with gravity going backwards, you'll see just how neat it actually is. Or another neat idea is to surround your level with volumes that are all backwards gravity to the direction. Meaning that say you shoot something and miss your enemy, it will turn around and fly back at you. Creating a whole new theme for a level. See, gravity aint so bad now is it!

==Add New Textures To Old Surfaces ==

A good way to get rid of the boring old plain textures on walls, floors and ceilings is to make a cube or whatever shape you want and add it to the surface of another texture. It makes it appear to be part of it and will randomize your textures and make them look good. You can use this to make good looking edges around ramps and floors and to simulate carpets on the floors. You can even place those CTF symbols on the walls which is handy when your mapping for CTF. Easy as adding (not subtracting) a textured cube right under your work.

[[Image:Legacy_BrushSinking.jpeg|center|Brush sinking action on the sides of all the plateforms.]]

[[Legacy:Brush Sinking|Brush Sinking]] explains this technique in detail.

==When Placing Items==

When you start to place items you might not want them to be sitting on flat ground because that would be quite boring indeed. You might want to create thin cylinder brush for it to sit on or maybe make some kind of stair set in a corner going up to the item. In UT2003/2004 xWeaponBases already serve this function. You might also want to place items in holes in the floor. Another thing to remember when placing weapons is to place them where someone is going to be. Not in a corner of a wide open area. Try to place everything on a path that the players would take so that it keeps the action going. Health on the other hand should be against walls and corners or even in a dangerous area so that it is more of a risk to get to because you have to leave your normal path. Ammo should most likely be by your weapon but if you spread it around you wont do that much harm. It makes it a challenge to keep killing with a good gun. See [[Legacy:Map Flow|Map Flow]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]] for more.
 

[[Image:Legacy_Weaponshot.jpeg|center|This is not a boring space to go for a weapon. You have to climb up into an open area and notice the brush sinking underneath the weapon.]]

==Skybox Seems Plain &amp;ndash; What Do I Do?==

When you make your [[Legacy:SkyBox|SkyBox]] all nice you may want to consider putting some architecture in the way of the skybox to make it look nicer. This can be done in an inside building map with simple overhead beams and maybe grates. In an outside map it should be left fine because it just would look weird unless it goes with the theme. Another thing to put infront of your skybox could be a window, like a skywindow over the top of your level with beams going through it and maybe even make the window breakable.

See [[Legacy:Making Glass Break|Making Glass Break]]

Not only is the presentation of the skybox important, but the actual appearance of it is just as vital. A proper skybox can give the player a true sense of awe (for example, the player notices comets strewn throughout a starry sky, and is so impressed that he/she is compelled to stop and look up for a few seconds). For outdoor maps, one technique is to make two sheets (one higher than the other) leaving the lower sheet to be translucent. By mixing and matching the textures of each sheet (cloud textures, skies, space etc.) and by placing lights in between the sheets, one can achieve more realistic skies. It's also a good idea to make the sky in your skybox pan (in the case of the two-sheets example, making one pan at an angle slightly greater than that of the other sheet is realistic). 

[[Image:Legacy_AmonSkybox.jpeg|center|A shot from Hourences' DM-Amon. Some nice architecture in the way of the skybox to add effect. Try to picture that missing... Just won't happen will it.]]

Particle effects in skyboxes can also be a good effect.

==Level Layout Tips==

When designing a level it is really all up to you to do but you might want to consider a few things. When linking rooms try to provide multiple ways in and out of them to get good flow going; you can do this by putting hallways on ground level and on raised platforms. Another good idea may be to use [[Legacy:Teleporter|teleporter]]s. When you design large rooms and they seem so boring try to add ledges around them. When making lifts try not to make one so that when you get in you have to turn around to get out, unless it's part of the risk fact of using the lift. Give the players the choice of going up the slower stairs, or going up the faster lift that requires turning around.

==Think Technically==

Created a nice ledge or machine in the level? Think that's enough? Well you're WRONG! As mentioned above, we like something we can relate to, so always think about making it as realistic as possible, unless in 0 gravity, or it's made out of some kind of super-light but strong material, that ledge or machine or very high wall is gonna need supports to keep it standing, you could even have a trigger to snap the supports and make the object fall down, killing anyone underneath it, MUAH HU HU HU HA HA HAAA!!! See [[Legacy:Triggers (UT)|Triggers (UT)]], [[Legacy:Mover|Mover]] and [[Legacy:Making Glass Break|Making Glass Break]] to make this happen (you'll have to make the wall break instead though)

[[Image:Legacy_supports.jpeg|center|Here you can see the supports holding up the grating platform, taken from my DM-Encarceration (still in development)]]

==It's All About Flow==

Newbie mappers might make the mistake of drawing inspiration from their home or their school.  In real life, many rooms have a single entrance / exit, and a layout designed for watching TV, preparing food, or listening to the lecture.  This is not the purpose of spaces in UT.  In UT your tasks are pretty much kill, avoid being killed, hide, or get to a pickup.  

Look at the options a player has at any given point in your map.  I wouldn't want to be walking down the long narrow corridor between two rooms when a guy appears at the far end stacking up multiple rockets.  What are my escape routes?  Similarly,  After getting to a pickup, it's a good feeling to be able to choose from a couple of options about where to go next ''without having to turn back''.  If you look at good maps, you rarely see actual definable rooms: you see a large space with BSP slightly limiting where you can go, what you can see, and who can get you: this is a sign of good flow.  Avoid the &quot;room, corridor, room&quot; syndrome, loathed by all reviewers. The exception is when you place a good powerup like a redeemer or udamage in a narrow hall, making it risky to go and get it, but worth the risk. It forces the player to make a choice: &quot;Do I go into that narrow hall with only one way out and get the 'deemer, and possibly getting mowed down before I can reach it, or not?&quot;

Think of flow as a way to move around a level, multiple ways in and out of each area. Each area feels different.  Kickers, lifts and teleporters everywhere.  No hassle to get to any guns or ammo. No problem finding health.

You can tell if a level has flow if you know where a weapon is going to be placed, or what must be done to open that special door. Just things mappers do a lot that help you quickly get a complex map down pat while playing that make it all that better. Try to avoid cubish maps, or perhaps start with a cube and shape it. Think of z-axis gameplay all the time. Unless your going for a total carnage approach you might want extra ledges and breaking up the height scale on things. That way you can shoot at things from all angles.

See [[Legacy:Map Flow|Map Flow]] for more.

==Approaches To Level Design==

Everyone has to start out somewhere, with a blank area. But everyone has their own approach at creating their levels.

The Twiggman

----

I (The Twiggman) have just discovered what may be a simple and yet professional looking approch. Make note I have not used it yet in level design but so far I think it may help those cube looking hallways and such really take form and flow with the same theme throughout the level. Ok here I go at explaining this one. First just make different parts of your map. Like make a high detailed 512X512X512 area which can be used as a hallway section. Then copy paste that to a layout. Or wherever you may see fit. And then next make high detailed corners and so on. Do all the parts seperate then connect them. It also allows you to put the details and things very early on so that you can build on them later. But it will provide a nice looking template for the level if you run out of good ideas for some parts. And you can also use your little template area for other maps too. Lol some of my maps have been really rushed, I dont even want to talk about fractal 2. Must have been on crack that day. But the next thing to be released I will try this approch. Seems to look nice so far though. As for the layout, I usually end up freestyling them. If I ever plan anything it usually turns out way off scale, no flow or connectivity so in my case it's better to go with freestyling.

'''T1:''' Isn't this generally the idea behind staticmeshes?

==Putting Feelings Into A Level ==

Lets start with a quote from Hourences.

&quot;A feeling is being created by the perfect balance between all aspects, starting from architecture, to details, to light, to music, to sound to effects etc. cliches work fine too, all those things you see in horror movies for examples its emotion, and emotions aren't bound to laws and rules, hard to make up a schedule on how to work then.&quot;

As he stated, a feeling or mood can be placed into a level through perhaps lighting techniques. Use the same colors throughout a level, or perhaps try for the same shadowcasts. Gives a unique feeling. Or maybe you don't want to have anything look the same. 

==Related Topics==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]

==Discussion==

'''JustaAverageKid''': This page could use some screenshots, let's use example maps or existing maps for easier understanding. So far, it's looking great :D

&quot;Justus&quot; That's what I thought myself more screenshots would help.

'''The Twiggman''': I'll see what I can do about the screenshots, I'll take a few example shots and try the uploaded and see what happens. :)

'''Luggage:''' I thought this was about architecture... Wtf do items and ambientsounds have to do with architecture? I'd figure that scaling, lighting and shapes are the most important points about architecture. Lighting influences scale - dark stripes in corridors create a sense of distance for example. Shapes are the very basic thing about architecture. Not indiviual shapes, but the ''piece of architecture'' as a whole. (-&gt; Cohesiveness...)

It's about breaking lines too. If you create your first corridor, you got lots of horizontal lines. Break them up with some vertical &quot;trim&quot;, and add some atmospheric lighting... and you've got a w00ty stylish corridor. (Sorta)

Architecture ''flows''. It's not seperate parts. It all goes together.

The rest is a question of style, i.e. your personal development as an (architecture) artist.

'''Tarquin:'''  I think some items here &amp; on [[Legacy:Mapping For DM|Mapping For DM]] could be moved to their own page. Some stuff could be moved to [[Legacy:Map Flow|Map Flow]] or one of the [[Legacy:Lighting|Lighting]] pages.

'''EntropicLqd:'''  One thing that would be nice is some references to books on Architectural styles.  I've been trying to find one with lots of ''good pictures'' (cos I'm lazy) but not suceeded so far.

'''The Twiggman''' God knows how this turned out to be another mapping tips guide but anyone can easily add tutorials to make architecture. Their sure is a lot of tips in here; I usually put new information that I find and use in here so it's quite a handy bunch to read up on.

'''Legal:''' Pics are broken :( Btw Twiggy, done any maps for SWAT 3 as Stickman?

'''The Twiggman''' Wow, haven't been around here in awhile. lol, no I haven't, must be some other stick like person

'''The Twiggman''' Still adding info wherever possible to this source. It's a good read now and again.

'''Sweavo:''' I made some pretty substantial changes to a few parts - some rewrites, some moving of paras.  I thought some parts lost the way a little bit, plus that one para actually asking us to re-write it! ... But i've not addressed the refactoring issue as I'm not familiar with the other pages mentioned.  Hope I've not pee'd anyone off too much.

----

===Refactoring===

'''Tarquin:''' parts of this page should be moved to [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] and [[Legacy:Mapping Checklist|Mapping Checklist]].

'''ZxAnPhOrIaN:''' Yeah, and there should be a combined [[Legacy:Map Enhancements|Map Enhancements]] page also.

'''SuperApe:''' All design elements here are covered in [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]].  To me, this feels like one big rant.  This should either be refactored into a tutorial or into the above mentioned pages (i.e., [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] and [[Legacy:Mapping Checklist|Mapping Checklist]]).  

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Refactor Me]] &amp;ndash; see Refactoring Discussion above
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Caves With The Extruder</title>
    <id>1827</id>
    <revision>
      <id>4483</id>
      <timestamp>2002-07-21T12:52:59Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>Category Tutorial</comment>
      <text xml:space="preserve">Set the Path to follow the general shape of the cave. Eg
* [0] (0,0,0)
* [1] (4,0,0)
* [2] (8,0,1)
* [3] (12,0,0)

Set ShapeSource to the preset circle, &quot;pCircle&quot; and build.

To change the size, experiment with ShapeFactor and PathFactor.

Set the randomizer to something like:
* X = 0.5
* Y = 0.5
* Z = 0.1 or 0

==Related Topics ==
* The [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] 
* other [[Legacy:Brushbuilders|brushbuilders]]
* other [[Legacy:Application|Application]]
* [[Legacy:Architecture|Architecture]] topic page
* [[:Category:Legacy Tutorial]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4484</id>
      <timestamp>2002-04-30T08:41:36Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>rought start</comment>
      <text xml:space="preserve">Set the Path to follow the general shape of the cave. Eg
* [0] (0,0,0)
* [1] (4,0,0)
* [2] (8,0,1)
* [3] (12,0,0)

Set ShapeSource to the preset circle, &quot;pCircle&quot; and build.

To change the size, experiment with ShapeFactor and PathFactor.

Set the randomizer to something like:
* X = 0.5
* Y = 0.5
* Z = 0.1 or 0</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Complex Doors</title>
    <id>1813</id>
    <revision>
      <id>4448</id>
      <timestamp>2004-01-21T02:36:38Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page will eventually describe how to make doors that have several moving parts. Many of the UT texture sets have door textures that are designed for this purpose.

Things to cover:
* using a trigger to guarantee the parts open simultaneously. TriggerControl state is good for doors.
* set sounds for only one piece of the door

&lt;i&gt;It's generally easier to make the door texture fit your brush if you import the door texture you wish to use into the 2D editor while you are constructing your door brush.&lt;/i&gt;

To line up textures once the mover has been created:
# do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Mover -&gt; show polys
# for each side, select the polys, align them to wall / floor
# [[Legacy:Merge Polygons|merge polygons]]
# re[[Legacy:Build|build]]
# do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Mover -&gt; show polys , again
# line the texture up neatly
# rebuilt again

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]: general page for all about movers
* mover basics:
** [[Legacy:Create A Mover|Create A Mover]]
** [[Legacy:Keyframe|keyframe]]
** [[Legacy:Activating A Mover|activating a mover]]
* [[Legacy:Making Arches|Making Arches]]: Optimize the door frame
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]: basic instructions on using the 2D editor
* [[Legacy:2D Shape Editor|2D Shape Editor]]: reference page

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4449</id>
      <timestamp>2003-05-25T08:59:34Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">This page will eventually describe how to make doors that have several moving parts. Many of the UT texture sets have door textures that are designed for this purpose.

Things to cover:
* using a trigger to guarantee the parts open simultaneously. TriggerControl state is good for doors.
* set sounds for only one piece of the door

&lt;i&gt;It's generally easier to make the door texture fit your brush if you import the door texture you wish to use into the 2D editor while you are constructing your door brush.&lt;/i&gt;

To line up textures once the mover has been created:
# do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Mover -&gt; show polys
# for each side, select the polys, align them to wall / floor
# [[Legacy:Merge Polygons|merge polygons]]
# re[[Legacy:Build|build]]
# do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Mover -&gt; show polys , again
# line the texture up neatly
# rebuilt again

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]: general page for all about movers
* mover basics:
** [[Legacy:Create A Mover|Create A Mover]]
** [[Legacy:Keyframe|keyframe]]
** [[Legacy:Activating A Mover|activating a mover]]
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]: basic instructions on using the 2D editor
* [[Legacy:2D Shape Editor|2D Shape Editor]]: reference page

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4450</id>
      <timestamp>2003-10-24T21:48:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>[[Category Tutorial]] but also [[Category To Do]]</comment>
      <text xml:space="preserve">This page will eventually describe how to make doors that have several moving parts. Many of the UT texture sets have door textures that are designed for this purpose.

Things to cover:
* using a trigger to guarantee the parts open simultaneously. TriggerControl state is good for doors.
* set sounds for only one piece of the door

&lt;i&gt;It's generally easier to make the door texture fit your brush if you import the door texture you wish to use into the 2D editor while you are constructing your door brush.&lt;/i&gt;

To line up textures once the mover has been created:
# do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Mover -&gt; show polys
# for each side, select the polys, align them to wall / floor
# [[Legacy:Merge Polygons|merge polygons]]
# re[[Legacy:Build|build]]
# do [[Legacy:Brush Context  Menu|Brush Context  Menu]] -&gt; Mover -&gt; show polys , again
# line the texture up neatly
# rebuilt again

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]]: general page for all about movers
* mover basics:
** [[Legacy:Create A Mover|Create A Mover]]
** [[Legacy:Keyframe|keyframe]]
** [[Legacy:Activating A Mover|activating a mover]]
* [[Legacy:Making A 2D Shape|Making A 2D Shape]]: basic instructions on using the 2D editor
* [[Legacy:2D Shape Editor|2D Shape Editor]]: reference page

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Curved Corridors</title>
    <id>1770</id>
    <revision>
      <id>4342</id>
      <timestamp>2004-01-21T03:49:00Z</timestamp>
      <contributor>
        <ip>Sobiwan</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&lt;i&gt;Machismo's tutorial, imported with permission to edit...&lt;/i&gt;

==Introduction ==

Curved passages should not be created using vertex editing (although you could do it). Man it would be like wanting to ride along in a cart when you could actually zoom along on a Ferrari!. Before you start this tutorial, you should be somewhat familiar with the [[Legacy:2D Shape Editor|2D Shape Editor]] and in particular with [[Legacy:Making A 2D Shape|Making a 2D shape]].

Let's see how to make one of those nice curved passages that seem to be used in nearly every level (like UT's DM-Zeto, DM-Liandri, etc.). Oh man this is going to be so simple to do but the results that you will get are going to make you go &amp;ndash; wow that was easy!

==How it works ==

The screenshot below shows a single brush made in the 2D Editor. The actual shape to draw in the editor is marked out in blue. When the 2D Ed processes this shape with the '''Revolve''' command, it takes the shape and rotates it around a point, the ''origin''. In the picture, the origin would be somewhere to the left of the shape, and it's been rotated through 4 sides with 16 sides per circle.

[[Image:Legacy_curved_corridor_wireframe.gif|center|]]

The 2D shape used to make this can be downloaded: http://wiki.beyondunreal.com/dl.php/wiki/examplemaps/CurvedCorridor2D.zip

==Making a shape ==

(idea: several tutes on the 2D Ed are going to cover techniques for making a shape: splitting sides, selecting multiple vertices, bezier etc... probably a good idea to put all this on a page like [[Legacy:Making A 2D Shape|Making a 2D shape]])

... more later...

==Orientation ==

The 2D Ed builds the brush at the wrong angle. To place the corridor brush upright, go to side view, and rotate 90 degrees clockwise. Then switch to top view and orient the direction the corridor faces.

Remember:
* this won't work if your [[Legacy:Red Builder Brush|red builder brush]] already has a rotation applied from previously: [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; ''Brush'' -&gt; ''Reset'' -&gt; ''Reset Rotation''.
* the red builder brush will remember this rotation. This is very handy if you want to tweak the shape of your corridor back in the 2D Ed, but remember to reset it when you move on to making other shapes.

==Finishing Touches ==

You may want to [[Legacy:Merge Polygons|merge polygons]] to clean up the ends of your corridor. If your subtractive corridor brush is flush with another subtract and the end surface isn't present, then this isn't necessary.

==Related Topics==
* [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]] is a [[Legacy:Brushbuilders|brushbuilder]] that can make halls

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4343</id>
      <timestamp>2002-06-28T21:09:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&lt;i&gt;Machismo's tutorial, imported with permission to edit...&lt;/i&gt;

==Introduction ==

Curved passages should not be created using vertex editing (although you could do it). Man it would be like wanting to ride along in a cart when you could actually zoom along on a Ferrari!. Before you start this tutorial, you should be somewhat familiar with the [[Legacy:2D Shape Editor|2D Shape Editor]] and in particular with [[Legacy:Making A 2D Shape|Making a 2D shape]].

Let's see how to make one of those nice curved passages that seem to be used in nearly every level (like UT's DM-Zeto, DM-Liandri, etc.). Oh man this is going to be so simple to do but the results that you will get are going to make you go &amp;ndash; wow that was easy!

==How it works ==

The screenshot below shows a single brush made in the 2D Editor. The actual shape to draw in the editor is marked out in blue. When the 2D Ed processes this shape with the '''Revolve''' command, it takes the shape and rotates it around a point, the ''origin''. In the picture, the origin would be somewhere to the left of the shape, and it's been rotated through 4 sides with 16 sides per circle.

[[Image:Legacy_curved_corridor_wireframe.gif|center|]]

The 2D shape used to make this can be downloaded: http://wiki.beyondunreal.com/dl.php/wiki/examplemaps/CurvedCorridor2D.zip

==Making a shape ==

(idea: several tutes on the 2D Ed are going to cover techniques for making a shape: splitting sides, selecting multiple vertices, bezier etc... probably a good idea to put all this on a page like [[Legacy:Making A 2D Shape|Making a 2D shape]])

... more later...

==Orientation ==

The 2D Ed builds the brush at the wrong angle. To place the corridor brush upright, go to side view, and rotate 90 degrees clockwise. Then switch to top view and orient the direction the corridor faces.

Remember:
* this won't work if your [[Legacy:Red Builder Brush|red builder brush]] already has a rotation applied from previously: [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; ''Brush'' -&gt; ''Reset'' -&gt; ''Reset Rotation''.
* the red builder brush will remember this rotation. This is very handy if you want to tweak the shape of your corridor back in the 2D Ed, but remember to reset it when you move on to making other shapes.

==Finishing Touches ==

You may want to [[Legacy:Merge Polygons|merge polygons]] to clean up the ends of your corridor. If your subtractive corridor brush is flush with another subtract and the end surface isn't present, then this isn't necessary.</text>
    </revision>
    <revision>
      <id>4344</id>
      <timestamp>2003-05-25T08:53:16Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">&lt;i&gt;Machismo's tutorial, imported with permission to edit...&lt;/i&gt;

==Introduction ==

Curved passages should not be created using vertex editing (although you could do it). Man it would be like wanting to ride along in a cart when you could actually zoom along on a Ferrari!. Before you start this tutorial, you should be somewhat familiar with the [[Legacy:2D Shape Editor|2D Shape Editor]] and in particular with [[Legacy:Making A 2D Shape|Making a 2D shape]].

Let's see how to make one of those nice curved passages that seem to be used in nearly every level (like UT's DM-Zeto, DM-Liandri, etc.). Oh man this is going to be so simple to do but the results that you will get are going to make you go &amp;ndash; wow that was easy!

==How it works ==

The screenshot below shows a single brush made in the 2D Editor. The actual shape to draw in the editor is marked out in blue. When the 2D Ed processes this shape with the '''Revolve''' command, it takes the shape and rotates it around a point, the ''origin''. In the picture, the origin would be somewhere to the left of the shape, and it's been rotated through 4 sides with 16 sides per circle.

[[Image:Legacy_curved_corridor_wireframe.gif|center|]]

The 2D shape used to make this can be downloaded: http://wiki.beyondunreal.com/dl.php/wiki/examplemaps/CurvedCorridor2D.zip

==Making a shape ==

(idea: several tutes on the 2D Ed are going to cover techniques for making a shape: splitting sides, selecting multiple vertices, bezier etc... probably a good idea to put all this on a page like [[Legacy:Making A 2D Shape|Making a 2D shape]])

... more later...

==Orientation ==

The 2D Ed builds the brush at the wrong angle. To place the corridor brush upright, go to side view, and rotate 90 degrees clockwise. Then switch to top view and orient the direction the corridor faces.

Remember:
* this won't work if your [[Legacy:Red Builder Brush|red builder brush]] already has a rotation applied from previously: [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; ''Brush'' -&gt; ''Reset'' -&gt; ''Reset Rotation''.
* the red builder brush will remember this rotation. This is very handy if you want to tweak the shape of your corridor back in the 2D Ed, but remember to reset it when you move on to making other shapes.

==Finishing Touches ==

You may want to [[Legacy:Merge Polygons|merge polygons]] to clean up the ends of your corridor. If your subtractive corridor brush is flush with another subtract and the end surface isn't present, then this isn't necessary.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Doors</title>
    <id>1830</id>
    <revision>
      <id>4491</id>
      <timestamp>2005-12-17T22:14:45Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial assumes that you know what a [[Legacy:Mover|mover]] is, and how to use [[Legacy:Keyframe|keyframe]]s.

===Part 1===

''In this, the first of many parts, I will explain how to make a very simple door that opens when you bump it''

First, set up your doorframe with a room on either side (usually doors ''do'' lead to somewhere). Texture it and light it, whatever you need to do to make your level to your liking. Then make the door. The door we are going to make is just a mover that is more vertical than horizontal, and spans the area between two walls to block it. Doors can be made any shape, size, or made to go in any direction.

To make the door, build a mover with the nessecary door textures applied that is large enough to span your doorfame, and place it in your doorway. (see [[Legacy:Create A Mover|Create A Mover]] for more on this step).

Right click on it and alter the keyframe 1 to the position you want it to be after the door is opened. This can be up, down, left, right, or rotated in any way from the base keframe. All you have to do is tell the door where to be, and the engine will figure out the rest. The required properties of our door are now in place, and all that is left are the sounds that it gives off when moving.

Unless you want silent doors, you will have to attach sounds to your door. To do this, right click on the door and select Properties (is it F8 that does the same thing?). Expand Mover Sounds. You will see a list of tags. These are the different times a door can emit a noise.

''To be finished at a later date (5/14) or by a different person at a sooner date. &amp;ndash;WheatPuppet''

''I have to wonder if there is anyone who really needs this tutorial, or if I am doing this out of a sense of completion... It's all good though''

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]] for all about movers
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Doors made from several moving parts
* [[Legacy:Door|Door]] &amp;ndash; The NavigationPoint actor that helps bots know how to deal with doors

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4492</id>
      <timestamp>2002-05-13T04:37:18Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial assumes that you know what a [[Legacy:Mover|mover]] is, and how to use [[Legacy:Keyframe|keyframe]]s.

===Part 1===

''In this, the first of many parts, I will explain how to make a very simple door that opens when you bump it''

First, set up your doorframe with a room on either side (usually doors ''do'' lead to somewhere). Texture it and light it, whatever you need to do to make your level to your liking. Then make the door. The door we are going to make is just a mover that is more vertical than horizontal, and spans the area between two walls to block it. Doors can be made any shape, size, or made to go in any direction.

To make the door, build a mover with the nessecary door textures applied that is large enough to span your doorfame, and place it in your doorway. Right click on it and alter the keyframe 1 to the position you want it to be after the door is opened. This can be up, down, left, right, or rotated in any way from the base keframe. All you have to do is tell the door where to be, and the engine will figure out the rest. The required properties of our door are now in place, and all that is left are the sounds that it gives off when moving.

Unless you want silent doors, you will have to attach sounds to your door. To do this, right click on the door and select Properties (is it F8 that does the same thing?). Expand Mover Sounds. You will see a list of tags. These are the different times a door can emit a noise.

''To be finished at a later date (5/14) or by a different person at a sooner date. &amp;ndash;WheatPuppet''

''I have to wonder if there is anyone who really needs this tutorial, or if I am doing this out of a sense of completion... It's all good though''</text>
    </revision>
    <revision>
      <id>4493</id>
      <timestamp>2003-05-25T09:36:55Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">This tutorial assumes that you know what a [[Legacy:Mover|mover]] is, and how to use [[Legacy:Keyframe|keyframe]]s.

===Part 1===

''In this, the first of many parts, I will explain how to make a very simple door that opens when you bump it''

First, set up your doorframe with a room on either side (usually doors ''do'' lead to somewhere). Texture it and light it, whatever you need to do to make your level to your liking. Then make the door. The door we are going to make is just a mover that is more vertical than horizontal, and spans the area between two walls to block it. Doors can be made any shape, size, or made to go in any direction.

To make the door, build a mover with the nessecary door textures applied that is large enough to span your doorfame, and place it in your doorway. (see [[Legacy:Create A Mover|Create A Mover]] for more on this step).

Right click on it and alter the keyframe 1 to the position you want it to be after the door is opened. This can be up, down, left, right, or rotated in any way from the base keframe. All you have to do is tell the door where to be, and the engine will figure out the rest. The required properties of our door are now in place, and all that is left are the sounds that it gives off when moving.

Unless you want silent doors, you will have to attach sounds to your door. To do this, right click on the door and select Properties (is it F8 that does the same thing?). Expand Mover Sounds. You will see a list of tags. These are the different times a door can emit a noise.

''To be finished at a later date (5/14) or by a different person at a sooner date. &amp;ndash;WheatPuppet''

''I have to wonder if there is anyone who really needs this tutorial, or if I am doing this out of a sense of completion... It's all good though''

==Related Topics ==
* [[Legacy:Mover Topics|Mover Topics]] for all about movers
* [[Legacy:Making Complex Doors|Making Complex Doors]]: doors made from several moving parts

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Flames</title>
    <id>1816</id>
    <revision>
      <id>4456</id>
      <timestamp>2004-03-17T11:14:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Yes, that's fine :) (whoever you are!)</comment>
      <text xml:space="preserve">''This is a tutorial for [[Legacy:Unreal Tournament|Unreal Tournament]]. For [[Legacy:UT2003|UT2003]] see elsewhere.''

==Method 1: Sheets ==

To make flames with brushes:
# Click on the '''Volumetric''' brushbuilder in the [[Legacy:Toolbox|toolbox]] (it's the buttons whose tooltip says &quot;torches chains etc&quot;) 
# Choose a flame-like texture to it from packages such as GreatFire and GreatFire2.
# Align it to fit. Right click on the brush to adjust proportions. It's a good idea to set the Translucent [[Legacy:Surface Flags (UT)|surface flag]].

==Method 2: Mesh ==

[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Light (UT)|Light (UT)]] &gt;&gt; [[Legacy:TorchFlame|TorchFlame]] where you want the flame to go. This is not really a good way to add flames, because they tend to 'disappear' from certain angles, etc.

You can scale this TorchFlame by going to its properties and adjusting the Display -&gt; DrawScale property.

==Tips ==

Flames usually don't cast white light. Make sure the light you set matches the flames accordingly (with the GreatFire packages, most flamelight would be red-orange in color.)

Adding a [[Legacy:Corona|corona]] makes the flame look more realistic and gives the impression of volume.

----

'''ProjectX:''' we could do with some screenshots for each tutorial showing each step, we could also do with bundling all tutorials that are to do with fire into here, that way it is easier to navigate the site

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4457</id>
      <timestamp>2004-03-17T05:51:25Z</timestamp>
      <contributor>
        <ip>C-24-7-169-93.client.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>Added a line to the top to denote that this if for UT. Unless I hear otherwise Tarq, I'll just do this as I go through... Is there a better way to denote what game release tutes are for?</comment>
      <text xml:space="preserve">'''''For Unreal Tournament'''''

----

==Method 1: Sheets ==

To make flames with brushes:
# Click on the '''Volumetric''' brushbuilder in the [[Legacy:Toolbox|toolbox]] (it's the buttons whose tooltip says &quot;torches chains etc&quot;) 
# Choose a flame-like texture to it from packages such as GreatFire and GreatFire2.
# Align it to fit. Right click on the brush to adjust proportions. Translucent flag recommended.

==Method 2: Mesh ==

Open your actor browser. Go to the [[Legacy:Light (UT)|Light (UT)]] subsection and select [[Legacy:TorchFlame|TorchFlame]]. Now add that actor where you want the flame to go. This is not really a good way to add flames, cos they tend to 'disappear' from certain angles, etc.

You can scale this TorchFlame by going to its properties and adjusting the Display -&gt; DrawScale property.

==Tips ==

Flames usually don't cast white light. Make sure the light you set matches the flames accordingly (with the GreatFire packages, most flamelight would be red-orange in color.)

Adding a [[Legacy:Corona|corona]] makes the flame look more realistic and gives the impression of volume.

----

'''ProjectX:''' we could do with some screenshots for each tutorial showing each step, we could also do with bundling all tutorials that are to do with fire into here, that way it is easier to navigate the site

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4458</id>
      <timestamp>2004-03-17T11:09:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Yes, that's fine :) (whoever you are!)</comment>
      <text xml:space="preserve">''This is a tutorial for [[Legacy:Unreal Tournament|Unreal Tournament]]. For [[Legacy:UT2003|UT2003]] see elsewhere.''

==Method 1: Sheets ==

To make flames with brushes:
# Click on the '''Volumetric''' brushbuilder in the [[Legacy:Toolbox|toolbox]] (it's the buttons whose tooltip says &quot;torches chains etc&quot;) 
# Choose a flame-like texture to it from packages such as GreatFire and GreatFire2.
# Align it to fit. Right click on the brush to adjust proportions. It's a good idea to set the Translucent [[Legacy:Surface Flags (UT)|surface flag]].

==Method 2: Mesh ==

[[Legacy:Ad An Actor|Ad an Actor]] &gt;&gt; [[Legacy:Light (UT)|Light (UT)]] &gt;&gt; [[Legacy:TorchFlame|TorchFlame]] where you want the flame to go. This is not really a good way to add flames, because they tend to 'disappear' from certain angles, etc.

You can scale this TorchFlame by going to its properties and adjusting the Display -&gt; DrawScale property.

==Tips ==

Flames usually don't cast white light. Make sure the light you set matches the flames accordingly (with the GreatFire packages, most flamelight would be red-orange in color.)

Adding a [[Legacy:Corona|corona]] makes the flame look more realistic and gives the impression of volume.

----

'''ProjectX:''' we could do with some screenshots for each tutorial showing each step, we could also do with bundling all tutorials that are to do with fire into here, that way it is easier to navigate the site

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44349</id>
      <timestamp>2011-04-05T12:14:57Z</timestamp>
      <contributor>
        <ip>92.40.20.152</ip>
      </contributor>
      <text xml:space="preserve">''This is a tutorial for [[Legacy:Unreal Tournament|Unreal Tournament]]. For [[Legacy:UT2003|UT2003]] see elsewhere. (Where, exactly?)''

==Method 1: Sheets ==

To make flames with brushes:
# Click on the '''Volumetric''' brushbuilder in the [[Legacy:Toolbox|toolbox]] (it's the buttons whose tooltip says &quot;torches chains etc&quot;) 
# Choose a flame-like texture to it from packages such as GreatFire and GreatFire2.
# Align it to fit. Right click on the brush to adjust proportions. It's a good idea to set the Translucent [[Legacy:Surface Flags (UT)|surface flag]].

==Method 2: Mesh ==

[[Legacy:Add An Actor|Add an Actor]] &gt;&gt; [[Legacy:Light (UT)|Light (UT)]] &gt;&gt; [[Legacy:TorchFlame|TorchFlame]] where you want the flame to go. This is not really a good way to add flames, because they tend to 'disappear' from certain angles, etc.

You can scale this TorchFlame by going to its properties and adjusting the Display -&gt; DrawScale property.

==Tips ==

Flames usually don't cast white light. Make sure the light you set matches the flames accordingly (with the GreatFire packages, most flamelight would be red-orange in color.)

Adding a [[Legacy:Corona|corona]] makes the flame look more realistic and gives the impression of volume.

----

'''ProjectX:''' we could do with some screenshots for each tutorial showing each step, we could also do with bundling all tutorials that are to do with fire into here, that way it is easier to navigate the site

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Glass Break</title>
    <id>1844</id>
    <revision>
      <id>4527</id>
      <timestamp>2006-01-01T17:18:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Exploding Glass... What? ==

You can simulate real exploding glass in UnrealEd very easily. I will explain this step by step. It is a lot like exploding walls.

'''Note:''' The BreakingGlass actor used in this guide is only available in UT. Starting with UT2003 [[Legacy:Emitter|Emitter]]s can be used instead to create far better glass breaking effects. See the [[Legacy:Breaking Glass UT2003|Breaking Glass UT2003]] for that.

==Show Me! ==

# Find a place you want your glass to go. (Hopefully a windowframe)

# [[Legacy:Create A Mover|Create a mover]] that is 2 units thick and 2 units thinner than your area you wish to put it in. Set its key 1 to outside the level and key 0 in its normal position.&lt;br /&gt;The minus 2 units of glass is used to avoid [[Legacy:BSP Hole|BSP hole]]s when you can see through the edges of the glass. (A lot of mappers forget this and it shows up)

# Texture the mover with something glassish. There is good textures in the Coret package. Make sure you set it to translucent in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]].

# [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Effects &gt;&gt; ExplodingWall &gt;&gt; [[Legacy:BreakingGlass|BreakingGlass]] in the middle of your glass mover. For &quot;respawning&quot; glass you should use the custom [[Legacy:RetriggerableBreakingGlass|RetriggerableBreakingGlass]] actor instead.

# Set the mover's [[Legacy:Event|event]] to match the BreakingGlass actor's [[Legacy:Tag|tag]], e.g. 'glass'.

# [[Legacy:Set The Following Properties|Set the following properties]] of the mover: 
#* Mover -&gt; bDamageTriggered = True
#* Mover -&gt; bTriggerOnlyOnce = True (False for respawning glass)
#* Mover -&gt; DamageThreshold = 1
#* Mover -&gt; MoveTime = 0
#* Object -&gt; [[Legacy:InitialState|InitialState]] = TriggerToggle (for one-shot breaking)&lt;br /&gt;Object -&gt; [[Legacy:InitialState|InitialState]] = TriggerOpenedTime (for respawning glass)
#* Mover -&gt; StayOpenTime = 30-60 (only for respawning glass, number of seconds to wait after breaking)

# [[Legacy:Set The Following Properties|Set the following properties]] of the BreakingGlass actor: 
#* Collision-&gt; bCollideActors = False (this makes sure projectiles really hit the glass mover, not the BreakingGlass actor)
#* Effects -&gt; bOnlyTriggerable = True
#* ExplodingWall -&gt; bTranslucentGlass = True

Alright so you're done now. When you shoot the glass mover with anything that does over 1 damage (basically everything) then it will instantly move out of the level and trigger the actor to display glass shattering and making noise.

==Potential Problems==
; Exploding projectiles not only break the window they hit, but also others nearby : Make sure the glass mover's pivot point is right in its center. Also, if you failed to disable the BreakingGlass actor's collision, the projectile's explosion center might be far enough out from the wall to &quot;see&quot; other glass movers as well.

; For &quot;respawning&quot; glass the breaking effect only plays once : Use the custom [[Legacy:RetriggerableBreakingGlass|RetriggerableBreakingGlass]] class instead of [[Legacy:BreakingGlass|BreakingGlass]].

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4528</id>
      <timestamp>2005-09-21T14:21:09Z</timestamp>
      <contributor>
        <ip>D83-180-18-64.cust.tele2.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Exploding Glass... What? ==

You can simulate real exploding glass in UnrealEd very easily. I will explain this step by step. It is a lot like exploding walls.

'''Note:''' The BreakingGlass actor used in this guide is only available in UT. In UT2003 [[Legacy:Emitter|Emitter]]s can be used instead to create far better glass breaking effects. See the [http://udn.epicgames.com/pub/Content/EmittersExamples/#Breaking_Glass Breaking Glass] section of [[udn2:EmitterExamples]] for a (bad) tutorial about that. Or visit [[Legacy:Breaking Glass UT2003|Breaking Glass UT2003]]

==Show Me! ==

# Find a place you want your glass to go. (Hopefully a windowframe)

# [[Legacy:Create A Mover|Create a mover]] that is 2 units thick and 2 units thinner than your area you wish to put it in. Set its key 1 to outside the level and key 0 in its normal position.

# Texture the mover with something glassish. There is good textures in the Coret package. Make sure you set it to translucent in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]].

# [[Legacy:Add An Actor|Add an actor]] of the class [[Legacy:ExplodingWall|BreakingGlass]] in the middle of your glass mover.

# Set the mover's [[Legacy:Event|event]] to match the BreakingGlass actor's [[Legacy:Tag|tag]], e.g. 'glass'.

# [[Legacy:Set The Following Properties|Set the following properties]] of the mover: 
#* bDamageTriggered = true
#* bTriggerOnlyOnce = true
#* DamageThreshold = 1
#* MoveTime = 0 
#* [[Legacy:InitialState|InitialState]] = TriggerToggle

Alright so you're done now. When you shoot the glass mover with anything that does over 1 damage (basically everything) then it will instantly move out of the level and trigger the actor to display glass shattering and making noise. The minus 2 units of glass is used to avoid [[Legacy:BSP Hole|BSP hole]]s when you can see through the edges of the glass. (A lot of mappers forget this and it shows up)

'''Dark Pulse:''' That's great if you want glass that only breaks once. But for those of you who want it to respawn, try this:

# [[Legacy:Set The Following Properties|Set the following properties]] of the mover:
#* StayOpenTime = 30-60 (whatever, actually. This is the number of seconds, so 225 = 3m45s)
#* [[Legacy:InitialState|InitialState]] = TriggerOpenedTime

On the [[Legacy:ExplodingWall|BreakingGlass]] Actor, set the following:
# Inside the Effects menu of the [[Legacy:ExplodingWall|BreakingGlass]]
#* bOnlyTriggerable = TRUE
#* bTranslucentGlass = TRUE

And there you have it. The Glass should respawn according to however long you set The StayOpenTime of the Mover.

===Small Problem...===

'''Flashpoint Black:''' In A map I've been working on, I have three windows right next to each other that I want to be independently breakable... and it works fine when shooting them with a weapon without splash damage, but when the weapon has splash damamge, take the Rocketlauncher (Eightball), the window that was shot breaks, but the one next to it doesn't, even when shot again. 

'''Dark Pulse:''' I had a similar problem. However, upon examination, I noticed something funny: Both windows would explode '''''WHEN I SHOT THEM FROM A CERTAIN SIDE'''''. As silly as it sounds, Try Rotating that window 180 degrees on the X Axis. It solved my problem.

'''W0RF:''' Another solution is to set a Damage Threshhold for triggering the breaking glass.  That is what I used to make breaking glass in UT; it should apply here as well.  That way, all your triggers won't go off at the drop of a hat.

'''Aramor:''' Somehow the BreakingGlass actor doesn't work the second time on my map. I set all the stuff exactly as shown on this page, but the pieces of glass only emerge the first time I shoot the glass, when the glass comes back and I shoot it again, it just disappears without the cool effect.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4529</id>
      <timestamp>2006-01-01T17:16:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>refactored answers to some questions and suggestions into the tutorial</comment>
      <text xml:space="preserve">==Exploding Glass... What? ==

You can simulate real exploding glass in UnrealEd very easily. I will explain this step by step. It is a lot like exploding walls.

'''Note:''' The BreakingGlass actor used in this guide is only available in UT. Starting with UT2003 [[Legacy:Emitter|Emitter]]s can be used instead to create far better glass breaking effects. See the [[Legacy:Breaking Glass UT2003|Breaking Glass UT2003]] for that.

==Show Me! ==

# Find a place you want your glass to go. (Hopefully a windowframe)

# [[Legacy:Create A Mover|Create a mover]] that is 2 units thick and 2 units thinner than your area you wish to put it in. Set its key 1 to outside the level and key 0 in its normal position.&lt;br /&gt;The minus 2 units of glass is used to avoid [[Legacy:BSP Hole|BSP hole]]s when you can see through the edges of the glass. (A lot of mappers forget this and it shows up)

# Texture the mover with something glassish. There is good textures in the Coret package. Make sure you set it to translucent in the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]].

# [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Effects &gt;&gt; ExplodingWall &gt;&gt; [[Legacy:BreakingGlass|BreakingGlass]] in the middle of your glass mover. For &quot;respawning&quot; glass you should use the custom [[Legacy:RetriggerableBreakingGlass|RetriggerableBreakingGlass]] actor instead.

# Set the mover's [[Legacy:Event|event]] to match the BreakingGlass actor's [[Legacy:Tag|tag]], e.g. 'glass'.

# [[Legacy:Set The Following Properties|Set the following properties]] of the mover: 
#* Mover -&gt; bDamageTriggered = True
#* Mover -&gt; bTriggerOnlyOnce = True (False for respawning glass)
#* Mover -&gt; DamageThreshold = 1
#* Mover -&gt; MoveTime = 0
#* Mover -&gt; [[Legacy:InitialState|InitialState]] = TriggerToggle (for one-shot breaking)&lt;br /&gt;Mover -&gt; [[Legacy:InitialState|InitialState]] = TriggerOpenedTime (for respawning glass)
#* Mover -&gt; StayOpenTime = 30-60 (only for respawning glass, number of seconds to wait after breaking)

# [[Legacy:Set The Following Properties|Set the following properties]] of the BreakingGlass actor: 
#* Collision-&gt; bCollideActors = False (this makes sure projectiles really hit the glass mover, not the BreakingGlass actor)
#* Effects -&gt; bOnlyTriggerable = True
#* ExplodingWall -&gt; bTranslucentGlass = True

Alright so you're done now. When you shoot the glass mover with anything that does over 1 damage (basically everything) then it will instantly move out of the level and trigger the actor to display glass shattering and making noise.

==Potential Problems==
; Exploding projectiles not only break the window they hit, but also others nearby : Make sure the glass mover's pivot point is right in its center. Also, if you failed to disable the BreakingGlass actor's collision, the projectile's explosion center might be far enough out from the wall to &quot;see&quot; other glass movers as well.

; For &quot;respawning&quot; glass the breaking effect only plays once : Use the custom [[Legacy:RetriggerableBreakingGlass|RetriggerableBreakingGlass]] class instead of [[Legacy:BreakingGlass|BreakingGlass]].

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Icons</title>
    <id>1862</id>
    <revision>
      <id>4572</id>
      <timestamp>2004-03-13T09:46:45Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">THis page should ''probably'' be about making custom icons for actors.

These are 32x32 PCX files. 

Does masking work the same way as [[Legacy:Color Blending|Color Blending]]? I have some icons here where transparency colours is last in the colour table. (does it matter WHAT the colour actually is?)

----

'''ZxAnPhOrIaN:'''  Well... this page is supposed to help people to create a button for the custom brush builders and the custom toolbox. Questions like &quot;How did [[Legacy:Tarquin|Tarquin]] draw the torus button for the torus builder, like shading, gradients, sides, etc. ?&quot; should go into here.

'''Tarquin:'''  ahh..... I see! [[Legacy:Making Icons|Making Icons]] then, maybe? 

The Torus button: I made a big torus with a really high detail setting (16 x 16 sides I think, maybe even 32). I found a white texture (UWindow.WhiteTexture), and make a white room, with the white torus inside. I then set up some purple lights to one side, moved the camera back and took a big screenshot in UnrealEd. Then in Photoshop I shrunk it down so it looks smooth. :) 

'''ZxAnPhOrIaN:'''  Is that a joke, or did you really do that?

'''Tarquin:'''  nope, that's how I did it. :D I still have the map, too.

'''ZxAnPhOrIaN:'''  Could you please e-mail me it to me?

'''Tarquin:'''  done :)

'''ZxAnPhOrIaN:'''  Got it! ;) Did you blur the torus to blend the colors together?

'''Tarquin:'''  just take a big screenie (maybe maximize the Viewport with button in the [[Legacy:Console Bar|Console Bar]]), and when you shrink down it'll smooth.

'''ZxAnPhOrIaN:'''  Made an almost exact picture of the torus button!! BTW, how did you think of that anyway??

'''Tarquin:'''  er, I don't know... :) where do ideas come from? what's the difference between a duck? (one of its legs is both the same, BTW). I realised I didn't stand a chance of drawing something that looked remotely good &amp; decided to take a picture of it instead.

'''ZxAnPhOrIaN:'''  Epic probably created their brush builder buttons with the technique that you used. On the other hand, i think that we answered here how to make the brush builder icons

----

'''ZxAnPhOrIaN:''' I'm Creating a Brush Builder Icon &quot;Studio&quot;!</text>
    </revision>
    <revision>
      <id>4573</id>
      <timestamp>2002-08-16T19:20:04Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''ZxAnPhOrIaN:'''  Well... this page is supposed to help people to create a button for the custom brush builders and the custom toolbox. Questions like &quot;How did [[Legacy:Tarquin|Tarquin]] draw the torus button for the torus builder, like shading, gradients, sides, etc. ?&quot; should go into here.

'''Tarquin:'''  ahh..... I see! [[Legacy:Making Icons|Making Icons]] then, maybe? 

The Torus button: I made a big torus with a really high detail setting (16 x 16 sides I think, maybe even 32). I found a white texture (UWindow.WhiteTexture), and make a white room, with the white torus inside. I then set up some purple lights to one side, moved the camera back and took a big screenshot in UnrealEd. Then in Photoshop I shrunk it down so it looks smooth. :) 

'''ZxAnPhOrIaN:'''  Is that a joke, or did you really do that?

'''Tarquin:'''  nope, that's how I did it. :D I still have the map, too.

'''ZxAnPhOrIaN:'''  Could you please e-mail me it to me?

'''Tarquin:'''  done :)

'''ZxAnPhOrIaN:'''  Got it! ;) Did you blur the torus to blend the colors together?

'''Tarquin:'''  just take a big screenie (maybe maximize the Viewport with button in the [[Legacy:Console Bar|Console Bar]]), and when you shrink down it'll smooth.

'''ZxAnPhOrIaN:'''  Made an almost exact picture of the torus button!! BTW, how did you think of that anyway??

'''Tarquin:'''  er, I don't know... :) where do ideas come from? what's the difference between a duck? (one of its legs is both the same, BTW). I realised I didn't stand a chance of drawing something that looked remotely good &amp; decided to take a picture of it instead.

'''ZxAnPhOrIaN:'''  Epic probably created their brush builder buttons with the technique that you used. On the other hand, i think that we answered here how to make the brush builder icons

----

'''ZxAnPhOrIaN:''' I'm Creating a Brush Builder Icon &quot;Studio&quot;!</text>
    </revision>
    <revision>
      <id>4574</id>
      <timestamp>2004-03-13T09:41:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">THis page should ''probably'' be about making custom icons for actors.

These are 32x32 PCX files. 

The transparency colours is last in the colour table. (does it matter WHAT the colour actually is?)

----

'''ZxAnPhOrIaN:'''  Well... this page is supposed to help people to create a button for the custom brush builders and the custom toolbox. Questions like &quot;How did [[Legacy:Tarquin|Tarquin]] draw the torus button for the torus builder, like shading, gradients, sides, etc. ?&quot; should go into here.

'''Tarquin:'''  ahh..... I see! [[Legacy:Making Icons|Making Icons]] then, maybe? 

The Torus button: I made a big torus with a really high detail setting (16 x 16 sides I think, maybe even 32). I found a white texture (UWindow.WhiteTexture), and make a white room, with the white torus inside. I then set up some purple lights to one side, moved the camera back and took a big screenshot in UnrealEd. Then in Photoshop I shrunk it down so it looks smooth. :) 

'''ZxAnPhOrIaN:'''  Is that a joke, or did you really do that?

'''Tarquin:'''  nope, that's how I did it. :D I still have the map, too.

'''ZxAnPhOrIaN:'''  Could you please e-mail me it to me?

'''Tarquin:'''  done :)

'''ZxAnPhOrIaN:'''  Got it! ;) Did you blur the torus to blend the colors together?

'''Tarquin:'''  just take a big screenie (maybe maximize the Viewport with button in the [[Legacy:Console Bar|Console Bar]]), and when you shrink down it'll smooth.

'''ZxAnPhOrIaN:'''  Made an almost exact picture of the torus button!! BTW, how did you think of that anyway??

'''Tarquin:'''  er, I don't know... :) where do ideas come from? what's the difference between a duck? (one of its legs is both the same, BTW). I realised I didn't stand a chance of drawing something that looked remotely good &amp; decided to take a picture of it instead.

'''ZxAnPhOrIaN:'''  Epic probably created their brush builder buttons with the technique that you used. On the other hand, i think that we answered here how to make the brush builder icons

----

'''ZxAnPhOrIaN:''' I'm Creating a Brush Builder Icon &quot;Studio&quot;!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Lifts</title>
    <id>1831</id>
    <revision>
      <id>4494</id>
      <timestamp>2005-12-29T03:52:34Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">(This tutorial was written using [[Legacy:UnrealEd 3|UnrealEd 3]]. Prior versions may follow a slightly different path than what is presented here.)

Creating a lift is a fairly simple process, once you learn how to create movers. Let's take a look at this process in detail:

==Selecting the Lift==

We first must choose a [[Legacy:Static Mesh|static mesh]] that will act as our lift. You can either [[Legacy:Create A Static Mesh|create a static mesh]] or select an existing one. For the purposes of this short tutorial, select a [[Legacy:Static Mesh|static mesh]] that already exists. A good candidate is in the '''HumanoidHardware''' [[Legacy:Static Mesh Package|static mesh package]], under the '''Miscellaneous''' category: '''''MGrate04HA'''''

==Adding the Lift==

Once you have this static mesh selected in the [[Legacy:Static Mesh Browser|static mesh browser]], click the ''Add Mover Brush'' button in the UnrealEd [[Legacy:Toolbox|toolbox]] (this button has a picture of a blue box with several arrows coming out of it). The static mesh you selected should appear in your map and should show up as a purple color (pink if it is selected).

==Placing the Lift==

Move the lift to the location where you want it to start from. We now must introduce the concept of [[Legacy:Keyframe|keyframes]]. A mover can have a total of 8 [[Legacy:Keyframe|keyframes]]. Think of these as navigation points which the mover will travel along. Our lift will begin at frame 0, travel to frame 1, then frame 2, etc. Normally, lifts only have 2 [[Legacy:Keyframe|keyframes]], so we will only use two for this example.

Right click on the static mesh, select the ''Mover'' submenu and select the '''Key 1''' menu item. We have just told UnrealEd to note where keyframe 1 is located. Now move your lift to its destination location. This new position is where keyframe 1 is located. If you right click the static mesh again, select the ''Mover'' submenu and select the '''Key 0''' menu item, you will note that the lift returns to its starting position! Once you have returned the lift to its starting position, it is time to begin editing the lift properties.

==Setting Lift Properties==

Again, right click the static mesh we are using for our lift, and select the '''Mover Properties''' menu item. The properties window will appear. First, expand the '''Object''' category. We should change the ''InitialState'' variable from a value of ''BumpOpenTimed'' to ''StandOpenTimed''. This will prevent the lift from rising up the instant the player touches it (which could cause the lift to leave without the player).

Next, expand the '''Mover''' category. There are many different settings available here, but we are primarily focused on just a few. First is the ''MoverEncroachType'' variable. The two most interesting values here are ''ME_ReturnWhenEncroach'' and ''ME_CrushWhenEncroach''. The first value will cause the lift to return to the previous keyframe if it collides with an actor (e.g., a player is underneath the lift as it comes down). The latter value will cause the player to be crushed if they are caught underneath the lift (or they hit their head on something on the way up). Let us leave it at ''ME_ReturnWhenEncroach'' for now.

Two other important settings are ''MoveTime'' and ''StayOpenTime''. These values are how long (in seconds) the lift takes to move from the first keyframe to the last one, and how long the lift waits before returning in the opposite direction, respectively.

If you have more than two keyframes, you '''must''' change the ''NumKeys'' variable from 2 (the default) to however many keyframes your lift has. So, if my lift has 5 keyframes, I give this variable a value of 5.

For lifts that use triggers see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Triggered Lifts]]

==Setting the Unique Tag==

This is an incredibly important step, so make sure you do this. Expand the '''Events''' category and note the ''Tag'' variable. By default, movers have a ''Tag'' value set to ''Mover''. You need to change this to something unique. I commonly use the same value as the ''Name'' variable in the '''Object''' category. Doing this will prevent a few annoying bugs (such as the ME_ReturnWhenEncroach failing to work when more than one lift is in your level).

==Adding Sound==

Finally, let us add some sounds to our lift. Expand the '''MoverSounds''' category. Listed here are several variables:
*'''ClosedSound''': This sound is played when the lift arrives at its last KeyFrame.
*'''ClosingSound''': This sound is played when the lift starts moving towards its last KeyFrame.
*'''LoopSound''': If the lift's InitialState is set to ConstantLoop, then it will play this sound when it reaches its first and last KeyFrame.
*'''OpenedSound''': This sound is played when the lift arrives at its first KeyFrame.
*'''OpeningSound''': This sound is played when the lift starts its first KeyFrame.

For our simple example, we only care about '''ClosingSound''' and '''OpeningSound'''. Select an appropriate sound for both. I usually use the '''door1''' sound, which can be found in the IndoorAmbience sound package.

==Conclusion==

Save your map, build all and test it out! Your lift should move from one position to the other, include sound and do the right thing if it hits you on the head! That wasn't so hard, was it?

==Related Topics==
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]].
* [[Legacy:Mover|Mover]]
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing Lifts|Pathing Lifts]] &amp;ndash; How to make bots understand your nifty lifts.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4495</id>
      <timestamp>2005-04-24T19:42:10Z</timestamp>
      <contributor>
        <ip>213.177.251.156.adsl.griffin.net.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">(This tutorial was written using [[Legacy:UnrealEd 3|UnrealEd 3]]. Prior versions may follow a slightly different path than what is presented here.)

Creating a lift is a fairly simple process, once you learn how to create movers. Let's take a look at this process in detail:

==Selecting the Lift==

We first must choose a [[Legacy:Static Mesh|static mesh]] that will act as our lift. You can either [[Legacy:Create A Static Mesh|create a static mesh]] or select an existing one. For the purposes of this short tutorial, select a [[Legacy:Static Mesh|static mesh]] that already exists. A good candidate is in the '''HumanoidHardware''' [[Legacy:Static Mesh Package|static mesh package]], under the '''Miscellaneous''' category: '''''MGrate04HA'''''

==Adding the Lift==

Once you have this static mesh selected in the [[Legacy:Static Mesh Browser|static mesh browser]], click the ''Add Mover Brush'' button in the UnrealEd [[Legacy:Toolbox|toolbox]] (this button has a picture of a blue box with several arrows coming out of it). The static mesh you selected should appear in your map and should show up as a purple color (pink if it is selected).

==Placing the Lift==

Move the lift to the location where you want it to start from. We now must introduce the concept of [[Legacy:Keyframe|keyframes]]. A mover can have a total of 8 [[Legacy:Keyframe|keyframes]]. Think of these as navigation points which the mover will travel along. Our lift will begin at frame 0, travel to frame 1, then frame 2, etc. Normally, lifts only have 2 [[Legacy:Keyframe|keyframes]], so we will only use two for this example.

Right click on the static mesh, select the ''Mover'' submenu and select the '''Key 1''' menu item. We have just told UnrealEd to note where keyframe 1 is located. Now move your lift to its destination location. This new position is where keyframe 1 is located. If you right click the static mesh again, select the ''Mover'' submenu and select the '''Key 0''' menu item, you will note that the lift returns to its starting position! Once you have returned the lift to its starting position, it is time to begin editing the lift properties.

==Setting Lift Properties==

Again, right click the static mesh we are using for our lift, and select the '''Mover Properties''' menu item. The properties window will appear. First, expand the '''Object''' category. We should change the ''InitialState'' variable from a value of ''BumpOpenTimed'' to ''StandOpenTimed''. This will prevent the lift from rising up the instant the player touches it (which could cause the lift to leave without the player).

Next, expand the '''Mover''' category. There are many different settings available here, but we are primarily focused on just a few. First is the ''MoverEncroachType'' variable. The two most interesting values here are ''ME_ReturnWhenEncroach'' and ''ME_CrushWhenEncroach''. The first value will cause the lift to return to the previous keyframe if it collides with an actor (e.g., a player is underneath the lift as it comes down). The latter value will cause the player to be crushed if they are caught underneath the lift (or they hit their head on something on the way up). Let us leave it at ''ME_ReturnWhenEncroach'' for now.

Two other important settings are ''MoveTime'' and ''StayOpenTime''. These values are how long (in seconds) the lift takes to move from the first keyframe to the last one, and how long the lift waits before returning in the opposite direction, respectively.

If you have more than two keyframes, you '''must''' change the ''NumKeys'' variable from 2 (the default) to however many keyframes your lift has. So, if my lift has 5 keyframes, I give this variable a value of 5.

==Setting the Unique Tag==

This is an incredibly important step, so make sure you do this. Expand the '''Events''' category and note the ''Tag'' variable. By default, movers have a ''Tag'' value set to ''Mover''. You need to change this to something unique. I commonly use the same value as the ''Name'' variable in the '''Object''' category. Doing this will prevent a few annoying bugs (such as the ME_ReturnWhenEncroach failing to work when more than one lift is in your level).

==Adding Sound==

Finally, let us add some sounds to our lift. Expand the '''MoverSounds''' category. Listed here are several variables:
*'''ClosedSound''': This sound is played when the lift arrives at its last KeyFrame.
*'''ClosingSound''': This sound is played when the lift starts moving towards its last KeyFrame.
*'''LoopSound''': If the lift's InitialState is set to ConstantLoop, then it will play this sound when it reaches its first and last KeyFrame.
*'''OpenedSound''': This sound is played when the lift arrives at its first KeyFrame.
*'''OpeningSound''': This sound is played when the lift starts its first KeyFrame.

For our simple example, we only care about '''ClosingSound''' and '''OpeningSound'''. Select an appropriate sound for both. I usually use the '''door1''' sound, which can be found in the IndoorAmbience sound package.

==Conclusion==

Save your map, build all and test it out! Your lift should move from one position to the other, include sound and do the right thing if it hits you on the head! That wasn't so hard, was it?

==Related Topics==
* [[Legacy:Pathing Lifts|Pathing Lifts]] &amp;ndash; How to make bots understand your nifty lifts.
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]].

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4496</id>
      <timestamp>2005-11-06T10:48:15Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">(This tutorial was written using [[Legacy:UnrealEd 3|UnrealEd 3]]. Prior versions may follow a slightly different path than what is presented here.)

Creating a lift is a fairly simple process, once you learn how to create movers. Let's take a look at this process in detail:

==Selecting the Lift==

We first must choose a [[Legacy:Static Mesh|static mesh]] that will act as our lift. You can either [[Legacy:Create A Static Mesh|create a static mesh]] or select an existing one. For the purposes of this short tutorial, select a [[Legacy:Static Mesh|static mesh]] that already exists. A good candidate is in the '''HumanoidHardware''' [[Legacy:Static Mesh Package|static mesh package]], under the '''Miscellaneous''' category: '''''MGrate04HA'''''

==Adding the Lift==

Once you have this static mesh selected in the [[Legacy:Static Mesh Browser|static mesh browser]], click the ''Add Mover Brush'' button in the UnrealEd [[Legacy:Toolbox|toolbox]] (this button has a picture of a blue box with several arrows coming out of it). The static mesh you selected should appear in your map and should show up as a purple color (pink if it is selected).

==Placing the Lift==

Move the lift to the location where you want it to start from. We now must introduce the concept of [[Legacy:Keyframe|keyframes]]. A mover can have a total of 8 [[Legacy:Keyframe|keyframes]]. Think of these as navigation points which the mover will travel along. Our lift will begin at frame 0, travel to frame 1, then frame 2, etc. Normally, lifts only have 2 [[Legacy:Keyframe|keyframes]], so we will only use two for this example.

Right click on the static mesh, select the ''Mover'' submenu and select the '''Key 1''' menu item. We have just told UnrealEd to note where keyframe 1 is located. Now move your lift to its destination location. This new position is where keyframe 1 is located. If you right click the static mesh again, select the ''Mover'' submenu and select the '''Key 0''' menu item, you will note that the lift returns to its starting position! Once you have returned the lift to its starting position, it is time to begin editing the lift properties.

==Setting Lift Properties==

Again, right click the static mesh we are using for our lift, and select the '''Mover Properties''' menu item. The properties window will appear. First, expand the '''Object''' category. We should change the ''InitialState'' variable from a value of ''BumpOpenTimed'' to ''StandOpenTimed''. This will prevent the lift from rising up the instant the player touches it (which could cause the lift to leave without the player).

Next, expand the '''Mover''' category. There are many different settings available here, but we are primarily focused on just a few. First is the ''MoverEncroachType'' variable. The two most interesting values here are ''ME_ReturnWhenEncroach'' and ''ME_CrushWhenEncroach''. The first value will cause the lift to return to the previous keyframe if it collides with an actor (e.g., a player is underneath the lift as it comes down). The latter value will cause the player to be crushed if they are caught underneath the lift (or they hit their head on something on the way up). Let us leave it at ''ME_ReturnWhenEncroach'' for now.

Two other important settings are ''MoveTime'' and ''StayOpenTime''. These values are how long (in seconds) the lift takes to move from the first keyframe to the last one, and how long the lift waits before returning in the opposite direction, respectively.

If you have more than two keyframes, you '''must''' change the ''NumKeys'' variable from 2 (the default) to however many keyframes your lift has. So, if my lift has 5 keyframes, I give this variable a value of 5.

For lifts that use triggers see [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Triggered Lifts]]

==Setting the Unique Tag==

This is an incredibly important step, so make sure you do this. Expand the '''Events''' category and note the ''Tag'' variable. By default, movers have a ''Tag'' value set to ''Mover''. You need to change this to something unique. I commonly use the same value as the ''Name'' variable in the '''Object''' category. Doing this will prevent a few annoying bugs (such as the ME_ReturnWhenEncroach failing to work when more than one lift is in your level).

==Adding Sound==

Finally, let us add some sounds to our lift. Expand the '''MoverSounds''' category. Listed here are several variables:
*'''ClosedSound''': This sound is played when the lift arrives at its last KeyFrame.
*'''ClosingSound''': This sound is played when the lift starts moving towards its last KeyFrame.
*'''LoopSound''': If the lift's InitialState is set to ConstantLoop, then it will play this sound when it reaches its first and last KeyFrame.
*'''OpenedSound''': This sound is played when the lift arrives at its first KeyFrame.
*'''OpeningSound''': This sound is played when the lift starts its first KeyFrame.

For our simple example, we only care about '''ClosingSound''' and '''OpeningSound'''. Select an appropriate sound for both. I usually use the '''door1''' sound, which can be found in the IndoorAmbience sound package.

==Conclusion==

Save your map, build all and test it out! Your lift should move from one position to the other, include sound and do the right thing if it hits you on the head! That wasn't so hard, was it?

==Related Topics==
* [[Legacy:Pathing Lifts|Pathing Lifts]] &amp;ndash; How to make bots understand your nifty lifts.
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]].

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Lifts/Triggered Lifts</title>
    <id>2222</id>
    <revision>
      <id>5378</id>
      <timestamp>2005-12-29T03:51:13Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Fairly often you read about that lifts only work with bots if the initiastate is standopentimed, this is not the case, another way to do this is with triggeropentimed and with two triggers at the top and bottom of the lift.

Set up a lift as you would in [[Legacy:Making Lifts|Making Lifts]] but set the initialstate to triggeropentimed then make sure your lift is pathed correctly (see: [[Legacy:Pathing Lifts|Pathing Lifts]]) (This will not work with bots at the moment as if they are at the top they will jump down but if they are at the bottom they will go onto the lift and nothing will happen) to make this work:

This tutorial assumes that the lift starts at the bottom and then rises to the top

Make sure your Lift's Mover&gt;&gt;DelayTime = 1 or 2 (so the lift won't rise with out the bot on it)

Add two triggers at the top and bottom of the lift make sure the [[Legacy:Trigger|Trigger]] colision of the trigger at the top of the lift covers the lift exit navigation point and make sure that the trigger at the bottom's radius does not cover the lift exit.

You will need to set the following properties

Both of the trigger's events&gt;&gt;event = lift centre's liftcentre&gt;&gt;lift trigger

And if you have set up you lift correctly that is all you will have to do

Bots dont understand Trigger_ASTeam and will try to use the lift anyway so try to avoid using them (I am undergoing looking for a way to stop bots from a certain team going down a path  - Any ideas?)

After a full rebuild bots will wait at the top and the lift will rise to meet them or just get on the bottom and the lift will go up as normal.

==Related Topics==
* [[Legacy:Mover|Mover]]
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Trigger Systems|Trigger Systems]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing Lifts|Pathing Lifts]]

----

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; This tutorial needs a little organization, formatting and capitalization.
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5379</id>
      <timestamp>2005-11-06T10:47:52Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Fairly often you read about that lifts only work with bots if the initiastate is standopentimed, this is not the case, another way to do this is with triggeropentimed and with two triggers at the top and bottom of the lift.

Set up a lift as you would in [[Legacy:Making Lifts|Making Lifts]] but set the initialstate to triggeropentimed then make sure your lift is pathed correctly (see: [[Legacy:Pathing Lifts|Pathing Lifts]]) (This will not work with bots at the moment as if they are at the top they will jump down but if they are at the bottom they will go onto the lift and nothing will happen) to make this work:

This tutorial assumes that the lift starts at the bottom and then rises to the top

Make sure your Lift's Mover&gt;&gt;DelayTime = 1 or 2 (so the lift won't rise with out the bot on it)

Add two triggers at the top and bottom of the lift make sure the [[Legacy:Trigger|Trigger]] colision of the trigger at the top of the lift covers the lift exit navigation point and make sure that the trigger at the bottom's radius does not cover the lift exit.

You will need to set the following properties

Both of the trigger's events&gt;&gt;event = lift centre's liftcentre&gt;&gt;lift trigger

And if you have set up you lift correctly that is all you will have to do

Bots dont understand Trigger_ASTeam and will try to use the lift anyway so try to avoid using them (I am undergoing looking for a way to stop bots from a certain team going down a path  - Any ideas?)

After a full rebuild bots will wait at the top and the lift will rise to meet them or just get on the bottom and the lift will go up as normal.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Liquids</title>
    <id>2143</id>
    <revision>
      <id>5218</id>
      <timestamp>2006-04-06T22:23:56Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">For UT, see [[Legacy:Making Liquids (UT)|Making Liquids (UT)]]

==UT2003 ==

[[Legacy:Fluid Surfaces|Fluid surfaces]] - Animated sheets used for fluid surfaces

(needs writing)

----

'''ProjectX:''' we could do with some screenshots for each tutorial showing each step, we could also do with bundling all tutorials that are to do with water into here, that way it is easier to navigate the site

'''ZxAnPhOrIaN:''' I will be willing to write a tutorial for water for UT2003

'''MadNad''' I wrote one a while back.  It has more to do with creating a texture for water.  http://madnad.com/UT2004/WaterTutorial  The one thing I found out later ( and noted ) was that be sure to set your FOV=90 when taking the shots for your cubemap.

'''Foxpaw:''' I know for sure that I saw a tutorial on making water for UT2003 on the wiki somewhere, but I don't remember the page name. Yours (MadNad) was very good though, I like the description of making the cubemap, and the screenshots look very good as well. My only complaint with that is that having a clear reflection kind of spoils the effect if a person tries to see their own reflection in the pool.

'''MadNad:''' Huh?  Should water not be translucent, or reflective?  What do you suggest?

'''MythOpus:''' Well water can be translucent and reflective :P

'''Foxpaw:''' Well, I believe what has been suggested in the past (and is what's done by epic) is to blur the living tar out of the cubemap so that people wouldn't notice that they can't see themselves in it, while still retaining the &quot;gloss&quot;. By clear, I was referring to the sharpness of the reflection, I'd say that it should definately be translucent.

'''MadNad''' I know for a fact the water is done just like this on antalus.  However, at the time, I only had a geforce2 gts pro, so I could only use the fallback texture technique of antalus.  If you use a fluidsurface, it distorts the reflection making it very convincing.  Whatever floats your boat I suppose.  Blurring the reflection wouldn't make me believe that I won't be able to see my reflection, I would just expect a blurry reflection.  I did mean to go back and update it now that I have a better vid card, just haven't had time.

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; see above, &quot;needs writing&quot;
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5219</id>
      <timestamp>2006-04-06T21:06:38Z</timestamp>
      <contributor>
        <ip>Softbank220005080193.bbtec.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">For UT, see [[Legacy:Making Liquids (UT)|Making Liquids (UT)]]

==UT2003 ==

[[Legacy:Fluid Surfaces|Fluid surfaces]] - Animated sheets used for fluid surfaces

(needs writing)

----

'''ProjectX:''' we could do with some screenshots for each tutorial showing each step, we could also do with bundling all tutorials that are to do with water into here, that way it is easier to navigate the site

'''ZxAnPhOrIaN:''' I will be willing to write a tutorial for water for UT2003

'''MadNad''' I wrote one a while back.  It has more to do with creating a texture for water.  http://madnad.com/UT2004/WaterTutorial  The one thing I found out later ( and noted ) was that be sure to set your FOV=90 when taking the shots for your cubemap.

'''Foxpaw:''' I know for sure that I saw a tutorial on making water for UT2003 on the wiki somewhere, but I don't remember the page name. Yours (MadNad) was very good though, I like the description of making the cubemap, and the screenshots look very good as well. My only complaint with that is that having a clear reflection kind of spoils the effect if a person tries to see their own reflection in the pool.

'''MadNad:''' Huh?  Should water not be translucent, or reflective?  What do you suggest?

'''MythOpus:''' Well water can be translucent and reflective :P

'''Foxpaw:''' Well, I believe what has been suggested in the past (and is what's done by epic) is to blur the living tar out of the cubemap so that people wouldn't notice that they can't see themselves in it, while still retaining the &quot;gloss&quot;. By clear, I was referring to the sharpness of the reflection, I'd say that it should definately be translucent.

'''MadNad''' I know for a fact the water is done just like this on antalus.  However, at the time, I only had a geforce2 gts pro, so I could only use the fallback texture technique of antalus.  If you use a fluidsurface, it distorts the reflection making it very convincing.  Whatever floats your boat I suppose.  Blurring the reflection wouldn't make me believe that I won't be able to see my reflection, I would just expect a blurry reflection.  I did mean to go back and update it now that I have a better vid card, just haven't had time.

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; see above, &quot;needs writing&quot;

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Liquids (UT)</title>
    <id>2142</id>
    <revision>
      <id>5215</id>
      <timestamp>2007-10-03T22:41:47Z</timestamp>
      <contributor>
        <ip>Rrcs-67-78-112-145.sw.biz.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This tutorial covers [[Legacy:UT|UT]]. See [[Legacy:Making Liquids|Making Liquids]] for the modern version.''

==Introduction ==

Making water, lava or slime couldn't be easier.  It's like falling of your bike your very first time.  Yep that easy.  By the time you're done with this tutorial, you should be able to use sheets and actors to create a body of water within your level.  For the sake of simplity I shall refer to making water in this tutorial though the process is the same as setting up anything else like lava or slime.  I'm also assuming you know the basics of addition, subtraction and know your way around UnrealEd enough to know where buttons are etc. If you don't, some pages that may help are:
* [[Legacy:UnrealEd Interface|UnrealEd interface]] and in particular the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Actor Overview|Actor Overview]] 

==Instructions ==
# In order to build water we must have a place to hold the water. [[Legacy:Subtract A Space|Subtract a space]] in your map: 512x1024x1024. Then subtract from the floor a cube of about 256x256x256. You should now have something that looks like a room with an empty swimming pool.
# Open the [[Legacy:Texture Browser|texture browser]] and pick a nice water texture from GenFluids.utx or anyother pack that you might prefer to use. (See [[Legacy:Texture Package (UT)|Texture Package (UT)]] for a complete list.)
# Now we need a [[Legacy:Sheet|sheet]] brush for the water surface. Make a sheet 256 x 256. (Some tutorials tell you the sheet must be slightly bigger than the size of the pool. This is incorrect. It must line up ''exactly'', and if you are using the [[Legacy:Grid|grid]], this is easily done. On the other hand, if you make the sheet slightly bigger it's easier to select it in the Top orthogonal viewport. If the water surface is a complex shape (eg you have pillars or rocks or something) then it's easiest to overlap the sheet with solid space.)
# click on the [[Legacy:Add Special|add special]] brush button.  Scroll down the prefabs to water and click OK. You should see a green sheet now.  Move the sheet to the top of the pool and set it in place so it's a little bit lower than the top edge.&lt;br /&gt;Example: we have a pool that is 256 units deep.  Set the sheet at 240, or lower if you want. You can also set it flush at 256 mark if you'd like.
# What we've done so far is create a zone which we will tell UnrealEd to treat as water. [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; ZoneInfo &gt;&gt; [[Legacy:WaterZone|WaterZone]]. (Or [[Legacy:LavaZone|LavaZone]], or [[Legacy:SlimeZone|SlimeZone]] depending on what you want to create.) Make sure is it near the bottom so there is no chance of a leak.
# [[Legacy:Rebuild|Rebuild]] and go play your level.  You have lava, water, slime whatever you wanted.

==In more depth ==

The leaks basically refered to your zone not being built properly. Switch the 3D viewport to Zone/Portal view by clicking the icon in the viewport titlebar (#10 in the picture below).

All the geometry will now be displayed in shades of one colour. If you go below the sheet that acts as the surface of the water, the [[Legacy:Zone Portal|zone portal]], the color will be different.

[[Image:Legacy_interface.viewporttitlebar.brighter.gif|center|]]

This means there are two zones separated by that sheet.  This sheet is essentially telling UnrealEd that everything below this sheet will have different properties (in our case water) and everything above will be something else.  For the sake of having fun delete the sheet and rebuild.  Play your level and tell me if there is a difference ;)

==Related Topics ==
* [[Legacy:Zoning|Zoning]]
* [[Legacy:Architecture|Architecture]] topic page

==Comments==

'''Tarquin:''' This page is going to become [[Legacy:Making Water (UT)|Making water (UT)]]

&lt;nowiki&gt;--Me--&lt;/nowiki&gt; Like all the rest of the tutorials on this website, this one is completely useless. UnrealEd 3 has no &quot;Water&quot; prefab in the Make Special Brush selection. Also, there is no Genfluids texture pack. Try again.

'''Another Me:''' Like all the rest of the casual ridiculers on the internet, this one is completely without a leg to stand on. UnrealEd 3 has no relation to Unreal Tournament. It is for UT200X. Try again.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5216</id>
      <timestamp>2007-10-03T10:04:48Z</timestamp>
      <contributor>
        <ip>Adsl-146-77-25.mia.bellsouth.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This tutorial covers [[Legacy:UT|UT]]. See [[Legacy:Making Liquids|Making Liquids]] for the modern version.''

==Introduction ==

Making water, lava or slime couldn't be easier.  It's like falling of your bike your very first time.  Yep that easy.  By the time you're done with this tutorial, you should be able to use sheets and actors to create a body of water within your level.  For the sake of simplity I shall refer to making water in this tutorial though the process is the same as setting up anything else like lava or slime.  I'm also assuming you know the basics of addition, subtraction and know your way around UnrealEd enough to know where buttons are etc. If you don't, some pages that may help are:
* [[Legacy:UnrealEd Interface|UnrealEd interface]] and in particular the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Actor Overview|Actor Overview]] 

==Instructions ==
# In order to build water we must have a place to hold the water. [[Legacy:Subtract A Space|Subtract a space]] in your map: 512x1024x1024. Then subtract from the floor a cube of about 256x256x256. You should now have something that looks like a room with an empty swimming pool.
# Open the [[Legacy:Texture Browser|texture browser]] and pick a nice water texture from GenFluids.utx or anyother pack that you might prefer to use. (See [[Legacy:Texture Package (UT)|Texture Package (UT)]] for a complete list.)
# Now we need a [[Legacy:Sheet|sheet]] brush for the water surface. Make a sheet 256 x 256. (Some tutorials tell you the sheet must be slightly bigger than the size of the pool. This is incorrect. It must line up ''exactly'', and if you are using the [[Legacy:Grid|grid]], this is easily done. On the other hand, if you make the sheet slightly bigger it's easier to select it in the Top orthogonal viewport. If the water surface is a complex shape (eg you have pillars or rocks or something) then it's easiest to overlap the sheet with solid space.)
# click on the [[Legacy:Add Special|add special]] brush button.  Scroll down the prefabs to water and click OK. You should see a green sheet now.  Move the sheet to the top of the pool and set it in place so it's a little bit lower than the top edge.&lt;br /&gt;Example: we have a pool that is 256 units deep.  Set the sheet at 240, or lower if you want. You can also set it flush at 256 mark if you'd like.
# What we've done so far is create a zone which we will tell UnrealEd to treat as water. [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; ZoneInfo &gt;&gt; [[Legacy:WaterZone|WaterZone]]. (Or [[Legacy:LavaZone|LavaZone]], or [[Legacy:SlimeZone|SlimeZone]] depending on what you want to create.) Make sure is it near the bottom so there is no chance of a leak.
# [[Legacy:Rebuild|Rebuild]] and go play your level.  You have lava, water, slime whatever you wanted.

==In more depth ==

The leaks basically refered to your zone not being built properly. Switch the 3D viewport to Zone/Portal view by clicking the icon in the viewport titlebar (#10 in the picture below).

All the geometry will now be displayed in shades of one colour. If you go below the sheet that acts as the surface of the water, the [[Legacy:Zone Portal|zone portal]], the color will be different.

[[Image:Legacy_interface.viewporttitlebar.brighter.gif|center|]]

This means there are two zones separated by that sheet.  This sheet is essentially telling UnrealEd that everything below this sheet will have different properties (in our case water) and everything above will be something else.  For the sake of having fun delete the sheet and rebuild.  Play your level and tell me if there is a difference ;)

==Related Topics ==
* [[Legacy:Zoning|Zoning]]
* [[Legacy:Architecture|Architecture]] topic page

==Comments==

'''Tarquin:''' This page is going to become [[Legacy:Making Water (UT)|Making water (UT)]]

&amp;ndash;Me&amp;ndash; Like all the rest of the tutorials on this website, this one is completely useless. UnrealEd 3 has no &quot;Water&quot; prefab in the Make Special Brush selection. Also, there is no Genfluids texture pack. Try again.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5217</id>
      <timestamp>2007-10-03T22:32:09Z</timestamp>
      <contributor>
        <ip>Rrcs-67-78-112-145.sw.biz.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''This tutorial covers [[Legacy:UT|UT]]. See [[Legacy:Making Liquids|Making Liquids]] for the modern version.''

==Introduction ==

Making water, lava or slime couldn't be easier.  It's like falling of your bike your very first time.  Yep that easy.  By the time you're done with this tutorial, you should be able to use sheets and actors to create a body of water within your level.  For the sake of simplity I shall refer to making water in this tutorial though the process is the same as setting up anything else like lava or slime.  I'm also assuming you know the basics of addition, subtraction and know your way around UnrealEd enough to know where buttons are etc. If you don't, some pages that may help are:
* [[Legacy:UnrealEd Interface|UnrealEd interface]] and in particular the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Actor Overview|Actor Overview]] 

==Instructions ==
# In order to build water we must have a place to hold the water. [[Legacy:Subtract A Space|Subtract a space]] in your map: 512x1024x1024. Then subtract from the floor a cube of about 256x256x256. You should now have something that looks like a room with an empty swimming pool.
# Open the [[Legacy:Texture Browser|texture browser]] and pick a nice water texture from GenFluids.utx or anyother pack that you might prefer to use. (See [[Legacy:Texture Package (UT)|Texture Package (UT)]] for a complete list.)
# Now we need a [[Legacy:Sheet|sheet]] brush for the water surface. Make a sheet 256 x 256. (Some tutorials tell you the sheet must be slightly bigger than the size of the pool. This is incorrect. It must line up ''exactly'', and if you are using the [[Legacy:Grid|grid]], this is easily done. On the other hand, if you make the sheet slightly bigger it's easier to select it in the Top orthogonal viewport. If the water surface is a complex shape (eg you have pillars or rocks or something) then it's easiest to overlap the sheet with solid space.)
# click on the [[Legacy:Add Special|add special]] brush button.  Scroll down the prefabs to water and click OK. You should see a green sheet now.  Move the sheet to the top of the pool and set it in place so it's a little bit lower than the top edge.&lt;br /&gt;Example: we have a pool that is 256 units deep.  Set the sheet at 240, or lower if you want. You can also set it flush at 256 mark if you'd like.
# What we've done so far is create a zone which we will tell UnrealEd to treat as water. [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; ZoneInfo &gt;&gt; [[Legacy:WaterZone|WaterZone]]. (Or [[Legacy:LavaZone|LavaZone]], or [[Legacy:SlimeZone|SlimeZone]] depending on what you want to create.) Make sure is it near the bottom so there is no chance of a leak.
# [[Legacy:Rebuild|Rebuild]] and go play your level.  You have lava, water, slime whatever you wanted.

==In more depth ==

The leaks basically refered to your zone not being built properly. Switch the 3D viewport to Zone/Portal view by clicking the icon in the viewport titlebar (#10 in the picture below).

All the geometry will now be displayed in shades of one colour. If you go below the sheet that acts as the surface of the water, the [[Legacy:Zone Portal|zone portal]], the color will be different.

[[Image:Legacy_interface.viewporttitlebar.brighter.gif|center|]]

This means there are two zones separated by that sheet.  This sheet is essentially telling UnrealEd that everything below this sheet will have different properties (in our case water) and everything above will be something else.  For the sake of having fun delete the sheet and rebuild.  Play your level and tell me if there is a difference ;)

==Related Topics ==
* [[Legacy:Zoning|Zoning]]
* [[Legacy:Architecture|Architecture]] topic page

==Comments==

'''Tarquin:''' This page is going to become [[Legacy:Making Water (UT)|Making water (UT)]]

&lt;nowiki&gt;--Me--&lt;/nowiki&gt; Like all the rest of the tutorials on this website, this one is completely useless. UnrealEd 3 has no &quot;Water&quot; prefab in the Make Special Brush selection. Also, there is no Genfluids texture pack. Try again.

'''Another Me:''' Like all the rest of the casual ridiculers on the internet, this one is completely without a leg to stand on. UnrealEd 3 has no relation to Unreal Tournament. It is for UT2004. Try again.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34361</id>
      <timestamp>2009-04-23T00:03:59Z</timestamp>
      <contributor>
        <ip>118.138.224.43</ip>
      </contributor>
      <comment>/* Introduction */ spelling mistake -&gt; falling of = falling off</comment>
      <text xml:space="preserve">''This tutorial covers [[Legacy:UT|UT]]. See [[Legacy:Making Liquids|Making Liquids]] for the modern version.''

==Introduction ==

Making water, lava or slime couldn't be easier.  It's like falling off your bike your very first time.  Yep that easy.  By the time you're done with this tutorial, you should be able to use sheets and actors to create a body of water within your level.  For the sake of simplity I shall refer to making water in this tutorial though the process is the same as setting up anything else like lava or slime.  I'm also assuming you know the basics of addition, subtraction and know your way around UnrealEd enough to know where buttons are etc. If you don't, some pages that may help are:
* [[Legacy:UnrealEd Interface|UnrealEd interface]] and in particular the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Actor Overview|Actor Overview]]

==Instructions ==
# In order to build water we must have a place to hold the water. [[Legacy:Subtract A Space|Subtract a space]] in your map: 512x1024x1024. Then subtract from the floor a cube of about 256x256x256. You should now have something that looks like a room with an empty swimming pool.
# Open the [[Legacy:Texture Browser|texture browser]] and pick a nice water texture from GenFluids.utx or anyother pack that you might prefer to use. (See [[Legacy:Texture Package (UT)|Texture Package (UT)]] for a complete list.)
# Now we need a [[Legacy:Sheet|sheet]] brush for the water surface. Make a sheet 256 x 256. (Some tutorials tell you the sheet must be slightly bigger than the size of the pool. This is incorrect. It must line up ''exactly'', and if you are using the [[Legacy:Grid|grid]], this is easily done. On the other hand, if you make the sheet slightly bigger it's easier to select it in the Top orthogonal viewport. If the water surface is a complex shape (eg you have pillars or rocks or something) then it's easiest to overlap the sheet with solid space.)
# click on the [[Legacy:Add Special|add special]] brush button.  Scroll down the prefabs to water and click OK. You should see a green sheet now.  Move the sheet to the top of the pool and set it in place so it's a little bit lower than the top edge.&lt;br /&gt;Example: we have a pool that is 256 units deep.  Set the sheet at 240, or lower if you want. You can also set it flush at 256 mark if you'd like.
# What we've done so far is create a zone which we will tell UnrealEd to treat as water. [[Legacy:Add An Actor|Add an Actor]] &gt;&gt; Info &gt;&gt; ZoneInfo &gt;&gt; [[Legacy:WaterZone|WaterZone]]. (Or [[Legacy:LavaZone|LavaZone]], or [[Legacy:SlimeZone|SlimeZone]] depending on what you want to create.) Make sure is it near the bottom so there is no chance of a leak.
# [[Legacy:Rebuild|Rebuild]] and go play your level.  You have lava, water, slime whatever you wanted.

==In more depth ==

The leaks basically refered to your zone not being built properly. Switch the 3D viewport to Zone/Portal view by clicking the icon in the viewport titlebar (#10 in the picture below).

All the geometry will now be displayed in shades of one colour. If you go below the sheet that acts as the surface of the water, the [[Legacy:Zone Portal|zone portal]], the color will be different.

[[Image:Legacy_interface.viewporttitlebar.brighter.gif|center|]]

This means there are two zones separated by that sheet.  This sheet is essentially telling UnrealEd that everything below this sheet will have different properties (in our case water) and everything above will be something else.  For the sake of having fun delete the sheet and rebuild.  Play your level and tell me if there is a difference ;)

==Related Topics ==
* [[Legacy:Zoning|Zoning]]
* [[Legacy:Architecture|Architecture]] topic page

==Comments==

'''Tarquin:''' This page is going to become [[Legacy:Making Water (UT)|Making water (UT)]]

&lt;nowiki&gt;--Me--&lt;/nowiki&gt; Like all the rest of the tutorials on this website, this one is completely useless. UnrealEd 3 has no &quot;Water&quot; prefab in the Make Special Brush selection. Also, there is no Genfluids texture pack. Try again.

'''Another Me:''' Like all the rest of the casual ridiculers on the internet, this one is completely without a leg to stand on. UnrealEd 3 has no relation to Unreal Tournament. It is for UT200X. Try again.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods</title>
    <id>1817</id>
    <revision>
      <id>4459</id>
      <timestamp>2008-03-03T13:25:48Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <comment>restored revision 124. Some idiot delete whole content</comment>
      <text xml:space="preserve">There seems to be lots of confusion as to what the difference between a mutator, mod, gametype, or total conversion is.  You'll find that the definition varies from person to person so the following definitions will probably not be accepted by the whole community, but they should help mod developers.  
  

==Overview  ==
; Mutator : Mutators are one way of making a mod activatable for the user. A mutator usually is a small modification to only one or few rules of a game, but there are exceptions to this rule.  Mutators are usually made with the intent for it to be compatible and/or usable with other mutators, most game types, or even multiple game types or total conversions.  A mutator has rules governing how it should behave, how it should interact, and how much it should change within a game.  See [[Legacy:Mutator Topics|Mutator Topics]].  
; Gametype : Gametypes are another way to make a mod user-selectable. Each gametype has a different objective.  The gametype of CTF is ''Capture The Flag''.  The goal is to find and return the enemy flag to your base.  Included with UT2K3 is also the gametypes of BR (Bombing Run), DM (Deathmatch), TDM (Team Deathmatch), and DOM (Domination).  Each gametype has a different way to end or win a map.  
; Total conversion (TC) : A total conversion is a collection of gametypes with a common theme and purpose.  For a total conversion it is generally accepted that new menus will be present, new graphics will be used throughout the entire game, a new set of INI files will be used, and that little, if any, content from the original game will be present or used.  
; Server add-on : Server add-ons don't change any part of the game's rules. Usually they add additional features for remote administration, security, player stats, etc. Server add-ons are often activated by adding an entry to the ServerActors list (INI section [Engine.GameEngine]), but there are also other ways, like changing the AccessControlClass (INI section [Engine.GameInfo]) or adding [[Legacy:WebApplication|WebApplication]]s to [UWeb.WebServer].  
; Client add-on : In UT's UWindow system it was possible to use some client-side add ons like GUI skins or other game menu modifications like the Mod Menu Extension or [osX] Background Changer. These not change any part of the gameplay, but only help players like their favorite game's menu system. ;) Client-side add-ons aren't possible in UT2003 anymore. (At least not at this time.)  
; New content : Maps, voice packs, announcer packs, player models or skins and similar content additions could also be viewed as mods since they modify and extend the game.  
  

Note that the term &quot;mod&quot; does not appear in this list, because it only is a general term for all kinds of modifications to the game. Players often distinguish between &quot;mod&quot; and &quot;mutator&quot; eventhough they are actually only refering to different mutators.  

Here on UnrealWiki we try to keep the term &quot;mod&quot; for the general concept of a modification to the game. A &quot;mutator&quot; is anything that can be added through the mutators list, while a &quot;gametype&quot; is anything that is activated through the game type list. There are mutators and gametypes that come with the game and there are custom mutators and gametypes &amp;ndash; the former are stock content while the latter are &quot;mods&quot;, no matter how much they actually do.  
  

==The Layman's Guide to Making Mods  ==

If you are thinking about making a mod (for any game) and are not sure what you need to know, how to go about it, or simply want to avoid the most obvious mistakes then read on.  The pages linked to below contain some excellent advice, and possibly comments on stuff that hadn't occured to you.  
  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/My_Team_Your_Team]] &amp;ndash; Introduction and disclaimer for all those, &quot;what's all this my team your team crap?&quot; readers.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Why_Are_You_Making_A_Mod]] &amp;ndash; Sometimes the reason a mod fails is the reason you started it in the first place.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Building_a_Team]] &amp;ndash; Building up your mod team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Despotism_Or_Communism]] &amp;ndash; Some thoughts on team structure.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Working_as_a_Team]] &amp;ndash; The day to day life of a team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Asset_Management]] &amp;ndash; How to manage the assets of your mod (code, textures, models, etc).  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Distributed_Development]] &amp;ndash; Find out how hard and unpleasant distributed development can be.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Effective_Testing]] &amp;ndash; How to get the most out of testing your mod.  
* [[Legacy:Releasing A Mod|Releasing A Mod]]  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supporting_Your_Mod]] &amp;ndash; Easing the burden of mod support.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod_Death]] &amp;ndash; What happens when a mod or mod team self destruct and how to cope.  
  

==Thoughts on Mod Making  ==

Several of the Unreal Wiki's contributors have experience in creating successful mods. Reading their accounts of their work and their advice is recommended.  
  
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Making your idea a reality.  
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people like your mod.  
* [[Legacy:Jb|Jb]] &amp;ndash; an analysis of the ChaosUT mod's history  
* [[Legacy:Piglet/Finishing_Things|Piglet/Finishing_Things]] &amp;ndash; How to actually finish your mods, that said it's more how to '''start''' so that you '''can''' finish.  
* [[Legacy:A_Bug'S_Life|A_Bug's_Life]]  
* [[Legacy:GODZ_Inception|GODZ_Inception]] &amp;ndash; a journal of how GODZ started.  
* [[Legacy:Making Mods/General Mod Optimization|Making Mods/General Mod Optimization]] &amp;ndash; Common mistakes and ignored settings which often lead to lower performance &amp;ndash; and how to fix/use them.  
  

==Some Recommended Reading  ==

It never ceases to amaze me how many programmers completely fail to take advantage of the wealth of experience of software developers that have decided to commit the things they have learnt to paper and write a book.  Although the following books will not help you write mods, they will help you write better software, and possibly manage your team and project more effectively.  You don't have to agree with what the books say &amp;ndash; as long as you understand why you disagree.  The books are in no particular order. (the links go to the original Wiki at C2: [[Wiki:WelcomeVisitors]], which has plenty on coding and is also a recommended read.)  
* [[Wiki:CodeComplete]] &amp;ndash; by [[Wiki:SteveMcConnell]]  
* [[Wiki:RapidDevelopment]] &amp;ndash; by Steve McConnell  
* [[Wiki:DebuggingTheDevelopmentProcess]] &amp;ndash; by [[Wiki:SteveMaguire]]  
* [[Wiki:WritingSolidCode]] &amp;ndash; by Steve Maguire  
* [http://www.amazon.com/exec/obidos/tg/detail/-/1560797045 Why Teams Don't Work] &amp;ndash; by Harvey Robbins and Michael Finley  
* [http://www.amazon.com/exec/obidos/tg/detail/-/0932633439/qid=1075688276 Peopleware &amp;ndash; Productive Projects and Teams] &amp;ndash; by Timothy Lister and Tom Demarco  
  

===Books on Unreal Modding/Programming  ===

  
* [http://www.amazon.co.uk/Mastering-Unreal-Technology-Level-Design/dp/0672326922] - Mastering Unreal Technology: The Art of level Design  
* [http://www.amazon.co.uk/Unreal-Tournament-Game-Programming-Teens/dp/1598633465] - Unreal Tournament Game Programming for Teens  
* [http://www.amazon.com/UnrealScript-Game-Programming-All-One/dp/1598631489] - UnrealScript Game Programming: All in One  
  

==Related Topics  ==

===Basic Topics  ===
* [[Legacy:UnrealScript|UnrealScript Topics]]  
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]  

===Design Concepts  ===
* [[Legacy:Gameplay|Gameplay]]  
* [[Legacy:Game Balance|Game Balance]]  

===Modding Topics  ===
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]. Written in the early days of UT, but much is still relevant.  
* [[Legacy:Mod_Authoring_for_UT2K3|Mod_Authoring_for_UT2K3]].  Document similar to Brandon's but for UT2K3.  
* [[Legacy:Interactive GUI|Interactive GUI]]  
* [[Legacy:Mutator_Topics|Mutator_Topics]]  
** [[Legacy:Useful Mutator Functions|Useful Mutator Functions]]  
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] - A tutorial covering modeling, animation and import of skeletal mesh characters  

===Miscellaneous  ===
* [[:Category:Legacy Custom Class]] - A list of custom classes on the wiki  
* [[Legacy:Unreal_University|Unreal_University]] - An annual weekend seminar given by Epic (and others) on the topics of mod making.  
* [[Legacy:Mod Ideas|Mod Ideas]] - Get some ideas for a project or share your own  
* [[Legacy:Testing Lab|Testing Lab]] - Get others to help test your code  
  

==Discussion  ==

'''SuperApe:''' This page deserves to be linked from the Home Page.  Is this a good hub for Modding? 

'''fleshsniper1:''' hmm.... iv looked around and all this wiki gives on making mods is opinion/experience. it doesnt tell you where to began if you actualy want to start making one. like in SOURCE engine, they tell you that you must first get a base by copying some of the codes and then you start editing the menus and create a map and such. now for me a newb, im not sure where to start. do i just make maps and replace some models and edit the scripts? how would i make menus and where do put my content source? i guess im talking more on a TC mod which i believe requires more than what is provided here... thanks for reading

'''Ambershee:''' There are loads of tutorials on the wiki. Look at the sections Mapping Lessons and UnrealScript Lessons.

'''fleshsniper1:''' right now iv done most of the basic tutorials. i can make a crappy map and compile it with pawn actors and such basics. but where do i began creating/importing content and maintining my content away from unreals content. how to go about? is that what packages are for? it would be nice if there was a guide for making a SP mod that includes starting up a base that wont interfere with the UT2004 game, how to manage content. somthing like that :)

'''Ambershee:''' http://udn.epicgames.com/Two/MyFirstCode.html

'''fleshsniper1:''' Well hello. I will tell you that your mod will never work or even get of the ground, if you dont know how to script. No matter how good your design or artist you are, whatever great ideas you have, they will never get of the ground or come to fruition until you learn to script (or posses scripting ability through another person) which is basically programming. I realize my low inspiration was due to this fact (and real life issues lol), I always though i could become a scripter later on and can work on the art first, but now i realize it is unhealthy... 1/5/08, Now iv tested all parts of developing games and i know what i CAN and cannot do. I can make any games i want :), thanks to the great flexible unreal engine 3... I just hope the NWO and other bad people dont start enslaving humans before my game is complete. After my game is complete i have no worry

'''computergod666:''' Anyone know if it is possible to do a singleplayer mod for UT, and how?

'''Raven:''' It is possible to make a single player mod. It is just a gametype, but the rules are explicitly setup to focus on the single player aspects. There are many extra issues that come up when making an exclusive single player game, mostly to do with the shear output of art content to give the player enough to do and see. 

'''computergod666:''' Thanks. So does anyone know of a good tutorial for making SP mods?

'''computergod666:''' I get the funny feeling that no one around here is interested in single-player games!

'''SuperApe:''' [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]] can help for UT2004.  OSM Adventure is a single-player/coop gametype and OSMT gives you plenty of tools to make a SP adventure in UT2004.  And of course, if you're talking about UT99, there are the original &quot;old skool toolz&quot; availble there. :)

----

'''Wormbo:''' UltraHyperCode, people keep deleting this because it doesn't make much sense and definitely doesn't belong on this page. [[Legacy:Delete Reply When You See It|Delete reply when you see it]].</text>
    </revision>
    <revision>
      <id>4460</id>
      <timestamp>2008-02-09T19:55:40Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>hope that helps</comment>
      <text xml:space="preserve">There seems to be lots of confusion as to what the difference between a mutator, mod, gametype, or total conversion is.  You'll find that the definition varies from person to person so the following definitions will probably not be accepted by the whole community, but they should help mod developers.  
  

==Overview  ==
; Mutator : Mutators are one way of making a mod activatable for the user. A mutator usually is a small modification to only one or few rules of a game, but there are exceptions to this rule.  Mutators are usually made with the intent for it to be compatible and/or usable with other mutators, most game types, or even multiple game types or total conversions.  A mutator has rules governing how it should behave, how it should interact, and how much it should change within a game.  See [[Legacy:Mutator Topics|Mutator Topics]].  
; Gametype : Gametypes are another way to make a mod user-selectable. Each gametype has a different objective.  The gametype of CTF is ''Capture The Flag''.  The goal is to find and return the enemy flag to your base.  Included with UT2K3 is also the gametypes of BR (Bombing Run), DM (Deathmatch), TDM (Team Deathmatch), and DOM (Domination).  Each gametype has a different way to end or win a map.  
; Total conversion (TC) : A total conversion is a collection of gametypes with a common theme and purpose.  For a total conversion it is generally accepted that new menus will be present, new graphics will be used throughout the entire game, a new set of INI files will be used, and that little, if any, content from the original game will be present or used.  
; Server add-on : Server add-ons don't change any part of the game's rules. Usually they add additional features for remote administration, security, player stats, etc. Server add-ons are often activated by adding an entry to the ServerActors list (INI section [Engine.GameEngine]), but there are also other ways, like changing the AccessControlClass (INI section [Engine.GameInfo]) or adding [[Legacy:WebApplication|WebApplication]]s to [UWeb.WebServer].  
; Client add-on : In UT's UWindow system it was possible to use some client-side add ons like GUI skins or other game menu modifications like the Mod Menu Extension or [osX] Background Changer. These not change any part of the gameplay, but only help players like their favorite game's menu system. ;) Client-side add-ons aren't possible in UT2003 anymore. (At least not at this time.)  
; New content : Maps, voice packs, announcer packs, player models or skins and similar content additions could also be viewed as mods since they modify and extend the game.  
  

Note that the term &quot;mod&quot; does not appear in this list, because it only is a general term for all kinds of modifications to the game. Players often distinguish between &quot;mod&quot; and &quot;mutator&quot; eventhough they are actually only refering to different mutators.  

Here on UnrealWiki we try to keep the term &quot;mod&quot; for the general concept of a modification to the game. A &quot;mutator&quot; is anything that can be added through the mutators list, while a &quot;gametype&quot; is anything that is activated through the game type list. There are mutators and gametypes that come with the game and there are custom mutators and gametypes &amp;ndash; the former are stock content while the latter are &quot;mods&quot;, no matter how much they actually do.  
  

==The Layman's Guide to Making Mods  ==

If you are thinking about making a mod (for any game) and are not sure what you need to know, how to go about it, or simply want to avoid the most obvious mistakes then read on.  The pages linked to below contain some excellent advice, and possibly comments on stuff that hadn't occured to you.  
  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/My_Team_Your_Team]] &amp;ndash; Introduction and disclaimer for all those, &quot;what's all this my team your team crap?&quot; readers.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Why_Are_You_Making_A_Mod]] &amp;ndash; Sometimes the reason a mod fails is the reason you started it in the first place.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Building_a_Team]] &amp;ndash; Building up your mod team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Despotism_Or_Communism]] &amp;ndash; Some thoughts on team structure.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Working_as_a_Team]] &amp;ndash; The day to day life of a team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Asset_Management]] &amp;ndash; How to manage the assets of your mod (code, textures, models, etc).  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Distributed_Development]] &amp;ndash; Find out how hard and unpleasant distributed development can be.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Effective_Testing]] &amp;ndash; How to get the most out of testing your mod.  
* [[Legacy:Releasing A Mod|Releasing A Mod]]  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supporting_Your_Mod]] &amp;ndash; Easing the burden of mod support.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod_Death]] &amp;ndash; What happens when a mod or mod team self destruct and how to cope.  
  

==Thoughts on Mod Making  ==

Several of the Unreal Wiki's contributors have experience in creating successful mods. Reading their accounts of their work and their advice is recommended.  
  
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Making your idea a reality.  
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people like your mod.  
* [[Legacy:Jb|Jb]] &amp;ndash; an analysis of the ChaosUT mod's history  
* [[Legacy:Piglet/Finishing_Things|Piglet/Finishing_Things]] &amp;ndash; How to actually finish your mods, that said it's more how to '''start''' so that you '''can''' finish.  
* [[Legacy:A_Bug'S_Life|A_Bug's_Life]]  
* [[Legacy:GODZ_Inception|GODZ_Inception]] &amp;ndash; a journal of how GODZ started.  
* [[Legacy:Making Mods/General Mod Optimization|Making Mods/General Mod Optimization]] &amp;ndash; Common mistakes and ignored settings which often lead to lower performance &amp;ndash; and how to fix/use them.  
  

==Some Recommended Reading  ==

It never ceases to amaze me how many programmers completely fail to take advantage of the wealth of experience of software developers that have decided to commit the things they have learnt to paper and write a book.  Although the following books will not help you write mods, they will help you write better software, and possibly manage your team and project more effectively.  You don't have to agree with what the books say &amp;ndash; as long as you understand why you disagree.  The books are in no particular order. (the links go to the original Wiki at C2: [[Wiki:WelcomeVisitors]], which has plenty on coding and is also a recommended read.)  
* [[Wiki:CodeComplete]] &amp;ndash; by [[Wiki:SteveMcConnell]]  
* [[Wiki:RapidDevelopment]] &amp;ndash; by Steve McConnell  
* [[Wiki:DebuggingTheDevelopmentProcess]] &amp;ndash; by [[Wiki:SteveMaguire]]  
* [[Wiki:WritingSolidCode]] &amp;ndash; by Steve Maguire  
* [http://www.amazon.com/exec/obidos/tg/detail/-/1560797045 Why Teams Don't Work] &amp;ndash; by Harvey Robbins and Michael Finley  
* [http://www.amazon.com/exec/obidos/tg/detail/-/0932633439/qid=1075688276 Peopleware &amp;ndash; Productive Projects and Teams] &amp;ndash; by Timothy Lister and Tom Demarco  
  

===Books on Unreal Modding/Programming  ===

  
* [http://www.amazon.co.uk/Mastering-Unreal-Technology-Level-Design/dp/0672326922] - Mastering Unreal Technology: The Art of level Design  
* [http://www.amazon.co.uk/Unreal-Tournament-Game-Programming-Teens/dp/1598633465] - Unreal Tournament Game Programming for Teens  
* [http://www.amazon.com/UnrealScript-Game-Programming-All-One/dp/1598631489] - UnrealScript Game Programming: All in One  
  

==Related Topics  ==

===Basic Topics  ===
* [[Legacy:UnrealScript|UnrealScript Topics]]  
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]  

===Design Concepts  ===
* [[Legacy:Gameplay|Gameplay]]  
* [[Legacy:Game Balance|Game Balance]]  

===Modding Topics  ===
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]. Written in the early days of UT, but much is still relevant.  
* [[Legacy:Mod_Authoring_for_UT2K3|Mod_Authoring_for_UT2K3]].  Document similar to Brandon's but for UT2K3.  
* [[Legacy:Interactive GUI|Interactive GUI]]  
* [[Legacy:Mutator_Topics|Mutator_Topics]]  
** [[Legacy:Useful Mutator Functions|Useful Mutator Functions]]  
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] - A tutorial covering modeling, animation and import of skeletal mesh characters  

===Miscellaneous  ===
* [[:Category:Legacy Custom Class]] - A list of custom classes on the wiki  
* [[Legacy:Unreal_University|Unreal_University]] - An annual weekend seminar given by Epic (and others) on the topics of mod making.  
* [[Legacy:Mod Ideas|Mod Ideas]] - Get some ideas for a project or share your own  
* [[Legacy:Testing Lab|Testing Lab]] - Get others to help test your code  
  

==Discussion  ==

'''SuperApe:''' This page deserves to be linked from the Home Page.  Is this a good hub for Modding? 

'''fleshsniper1:''' hmm.... iv looked around and all this wiki gives on making mods is opinion/experience. it doesnt tell you where to began if you actualy want to start making one. like in SOURCE engine, they tell you that you must first get a base by copying some of the codes and then you start editing the menus and create a map and such. now for me a newb, im not sure where to start. do i just make maps and replace some models and edit the scripts? how would i make menus and where do put my content source? i guess im talking more on a TC mod which i believe requires more than what is provided here... thanks for reading

'''Ambershee:''' There are loads of tutorials on the wiki. Look at the sections Mapping Lessons and UnrealScript Lessons.

'''fleshsniper1:''' right now iv done most of the basic tutorials. i can make a crappy map and compile it with pawn actors and such basics. but where do i began creating/importing content and maintining my content away from unreals content. how to go about? is that what packages are for? it would be nice if there was a guide for making a SP mod that includes starting up a base that wont interfere with the UT2004 game, how to manage content. somthing like that :)

'''Ambershee:''' http://udn.epicgames.com/Two/MyFirstCode.html

'''fleshsniper1:''' Well hello. I will tell you that your mod will never work or even get of the ground, if you dont know how to script. No matter how good your design or artist you are, whatever great ideas you have, they will never get of the ground or come to fruition until you learn to script (or posses scripting ability through another person) which is basically programming. I realize my low inspiration was due to this fact (and real life issues lol), I always though i could become a scripter later on and can work on the art first, but now i realize it is unhealthy... 1/5/08, Now iv tested all parts of developing games and i know what i CAN and cannot do. I can make any games i want :), thanks to the great flexible unreal engine 3... I just hope the NWO and other bad people dont start enslaving humans before my game is complete. After my game is complete i have no worry

'''computergod666:''' Anyone know if it is possible to do a singleplayer mod for UT, and how?

'''Raven:''' It is possible to make a single player mod. It is just a gametype, but the rules are explicitly setup to focus on the single player aspects. There are many extra issues that come up when making an exclusive single player game, mostly to do with the shear output of art content to give the player enough to do and see. 

'''computergod666:''' Thanks. So does anyone know of a good tutorial for making SP mods?

'''computergod666:''' I get the funny feeling that no one around here is interested in single-player games!

'''SuperApe:''' [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]] can help for UT2004.  OSM Adventure is a single-player/coop gametype and OSMT gives you plenty of tools to make a SP adventure in UT2004.  And of course, if you're talking about UT99, there are the original &quot;old skool toolz&quot; availble there. :)

----

'''Wormbo:''' UltraHyperCode, people keep deleting this because it doesn't make much sense and definitely doesn't belong on this page. [[Legacy:Delete Reply When You See It|Delete reply when you see it]].</text>
    </revision>
    <revision>
      <id>4461</id>
      <timestamp>2008-03-03T12:59:49Z</timestamp>
      <contributor>
        <ip>Ip68-226-251-33.lf.br.cox.net</ip>
      </contributor>
      <comment>*NEO</comment>
      <text xml:space="preserve">The Matrix Has You Now!!!</text>
    </revision>
    <revision>
      <id>34416</id>
      <timestamp>2009-05-20T15:32:33Z</timestamp>
      <contributor>
        <ip>93.72.18.123</ip>
      </contributor>
      <comment>A</comment>
      <text xml:space="preserve">There seems to be lots of confusion as to what the difference between a mutator, mod, gametype, or total conversion is.  You'll find that the definition varies from person to person so the following definitions will probably not be accepted by the whole community, but they should help mod developers.  
  

==Overview  ==
; Mutator : Mutators are one way of making a mod activatable for the user. A mutator usually is a small modification to only one or few rules of a game, but there are exceptions to this rule.  Mutators are usually made with the intent for it to be compatible and/or usable with other mutators, most game types, or even multiple game types or total conversions.  A mutator has rules governing how it should behave, how it should interact, and how much it should change within a game.  See [[Legacy:Mutator Topics|Mutator Topics]].  
; Gametype : Gametypes are another way to make a mod user-selectable. Each gametype has a different objective.  The gametype of CTF is ''Capture The Flag''.  The goal is to find and return the enemy flag to your base.  Included with UT2K3 is also the gametypes of BR (Bombing Run), DM (Deathmatch), TDM (Team Deathmatch), and DOM (Domination).  Each gametype has a different way to end or win a map.  
; Total conversion (TC) : A total conversion is a collection of gametypes with a common theme and purpose.  For a total conversion it is generally accepted that new menus will be present, new graphics will be used throughout the entire game, a new set of INI files will be used, and that little, if any, content from the original game will be present or used.  
; Server add-on : Server add-ons don't change any part of the game's rules. Usually they add additional features for remote administration, security, player stats, etc. Server add-ons are often activated by adding an entry to the ServerActors list (INI section [Engine.GameEngine]), but there are also other ways, like changing the AccessControlClass (INI section [Engine.GameInfo]) or adding [[Legacy:WebApplication|WebApplication]]s to [UWeb.WebServer].  
; Client add-on : In UT's UWindow system it was possible to use some client-side add ons like GUI skins or other game menu modifications like the Mod Menu Extension or [osX] Background Changer. These not change any part of the gameplay, but only help players like their favorite game's menu system. ;) Client-side add-ons aren't possible in UT2003 anymore. (At least not at this time.)  
; New content : Maps, voice packs, announcer packs, player models or skins and similar content additions could also be viewed as mods since they modify and extend the game.  
  

Note that the term &quot;mod&quot; does not appear in this list, because it only is a general term for all kinds of modifications to the game. Players often distinguish between &quot;mod&quot; and &quot;mutator&quot; eventhough they are actually only refering to different mutators.  

Here on UnrealWiki we try to keep the term &quot;mod&quot; for the general concept of a modification to the game. A &quot;mutator&quot; is anything that can be added through the mutators list, while a &quot;gametype&quot; is anything that is activated through the game type list. There are mutators and gametypes that come with the game and there are custom mutators and gametypes &amp;ndash; the former are stock content while the latter are &quot;mods&quot;, no matter how much they actually do.  
  

==The Layman's Guide to Making Mods  ==

If you are thinking about making a mod (for any game) and are not sure what you need to know, how to go about it, or simply want to avoid the most obvious mistakes then read on.  The pages linked to below contain some excellent advice, and possibly comments on stuff that hadn't occured to you.  
  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/My_Team_Your_Team]] &amp;ndash; Introduction and disclaimer for all those, &quot;what's all this my team your team crap?&quot; readers.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Why_Are_You_Making_A_Mod]] &amp;ndash; Sometimes the reason a mod fails is the reason you started it in the first place.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Building_a_Team]] &amp;ndash; Building up your mod team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Despotism_Or_Communism]] &amp;ndash; Some thoughts on team structure.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Working_as_a_Team]] &amp;ndash; The day to day life of a team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Asset_Management]] &amp;ndash; How to manage the assets of your mod (code, textures, models, etc).  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Distributed_Development]] &amp;ndash; Find out how hard and unpleasant distributed development can be.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Effective_Testing]] &amp;ndash; How to get the most out of testing your mod.  
* [[Legacy:Releasing A Mod|Releasing A Mod]]  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supporting_Your_Mod]] &amp;ndash; Easing the burden of mod support.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod_Death]] &amp;ndash; What happens when a mod or mod team self destruct and how to cope.  
  

==Thoughts on Mod Making  ==

Several of the Unreal Wiki's contributors have experience in creating successful mods. Reading their accounts of their work and their advice is recommended.  
  
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Making your idea a reality.  
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people like your mod.  
* [[Legacy:Jb|Jb]] &amp;ndash; an analysis of the ChaosUT mod's history  
* [[Legacy:Piglet/Finishing_Things|Piglet/Finishing_Things]] &amp;ndash; How to actually finish your mods, that said it's more how to '''start''' so that you '''can''' finish.  
* [[Legacy:A_Bug'S_Life|A_Bug's_Life]]  
* [[Legacy:GODZ_Inception|GODZ_Inception]] &amp;ndash; a journal of how GODZ started.  
* [[Legacy:Making Mods/General Mod Optimization|Making Mods/General Mod Optimization]] &amp;ndash; Common mistakes and ignored settings which often lead to lower performance &amp;ndash; and how to fix/use them.  
  

==Some Recommended Reading  ==

It never ceases to amaze me how many programmers completely fail to take advantage of the wealth of experience of software developers that have decided to commit the things they have learnt to paper and write a book.  Although the following books will not help you write mods, they will help you write better software, and possibly manage your team and project more effectively.  You don't have to agree with what the books say &amp;ndash; as long as you understand why you disagree.  The books are in no particular order. (the links go to the original Wiki at C2: [[Wiki:WelcomeVisitors]], which has plenty on coding and is also a recommended read.)  
* [[Wiki:CodeComplete]] &amp;ndash; by [[Wiki:SteveMcConnell]]  
* [[Wiki:RapidDevelopment]] &amp;ndash; by Steve McConnell  
* [[Wiki:DebuggingTheDevelopmentProcess]] &amp;ndash; by [[Wiki:SteveMaguire]]  
* [[Wiki:WritingSolidCode]] &amp;ndash; by Steve Maguire  
* [http://www.amazon.com/exec/obidos/tg/detail/-/1560797045 Why Teams Don't Work] &amp;ndash; by Harvey Robbins and Michael Finley  
* [http://www.amazon.com/exec/obidos/tg/detail/-/0932633439/qid=1075688276 Peopleware &amp;ndash; Productive Projects and Teams] &amp;ndash; by Timothy Lister and Tom Demarco  
  

===Books on Unreal Modding/Programming  ===

  
* [http://www.amazon.co.uk/Mastering-Unreal-Technology-Level-Design/dp/0672326922] - Mastering Unreal Technology: The Art of level Design  
* [http://www.amazon.co.uk/Unreal-Tournament-Game-Programming-Teens/dp/1598633465] - Unreal Tournament Game Programming for Teens  
* [http://www.amazon.com/UnrealScript-Game-Programming-All-One/dp/1598631489] - UnrealScript Game Programming: All in One  
  

==Related Topics  ==

===Basic Topics  ===
* [[Legacy:UnrealScript|UnrealScript Topics]]  
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]  

===Design Concepts  ===
* [[Legacy:Gameplay|Gameplay]]  
* [[Legacy:Game Balance|Game Balance]]  

===Modding Topics  ===
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]. Written in the early days of UT, but much is still relevant.  
* [[Legacy:Mod_Authoring_for_UT2K3|Mod_Authoring_for_UT2K3]].  Document similar to Brandon's but for UT2K3.  
* [[Legacy:Interactive GUI|Interactive GUI]]  
* [[Legacy:Mutator_Topics|Mutator_Topics]]  
** [[Legacy:Useful Mutator Functions|Useful Mutator Functions]]  
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] - A tutorial covering modeling, animation and import of skeletal mesh characters  

===Miscellaneous  ===
* [[:Category:Legacy Custom Class]] - A list of custom classes on the wiki  
* [[Legacy:Unreal_University|Unreal_University]] - An annual weekend seminar given by Epic (and others) on the topics of mod making.  
* [[Legacy:Mod Ideas|Mod Ideas]] - Get some ideas for a project or share your own  
* [[Legacy:Testing Lab|Testing Lab]] - Get others to help test your code  
  

==Discussion  ==

'''SuperApe:''' This page deserves to be linked from the Home Page.  Is this a good hub for Modding? 

'''fleshsniper1:''' hmm.... iv looked around and all this wiki gives on making mods is opinion/experience. it doesnt tell you where to began if you actualy want to start making one. like in SOURCE engine, they tell you that you must first get a base by copying some of the codes and then you start editing the menus and create a map and such. now for me a newb, im not sure where to start. do i just make maps and replace some models and edit the scripts? how would i make menus and where do put my content source? i guess im talking more on a TC mod which i believe requires more than what is provided here... thanks for reading

'''Ambershee:''' There are loads of tutorials on the wiki. Look at the sections Mapping Lessons and UnrealScript Lessons.

'''fleshsniper1:''' right now iv done most of the basic tutorials. i can make a crappy map and compile it with pawn actors and such basics. but where do i began creating/importing content and maintining my content away from unreals content. how to go about? is that what packages are for? it would be nice if there was a guide for making a SP mod that includes starting up a base that wont interfere with the UT2004 game, how to manage content. somthing like that :)

'''Ambershee:''' http://udn.epicgames.com/Two/MyFirstCode.html

'''fleshsniper1:''' Well hello. I will tell you that your mod will never work or even get of the ground, if you dont know how to script. No matter how good your design or artist you are, whatever great ideas you have, they will never get of the ground or come to fruition until you learn to script (or posses scripting ability through another person) which is basically programming. I realize my low inspiration was due to this fact (and real life issues lol), I always though i could become a scripter later on and can work on the art first, but now i realize it is unhealthy... 1/5/08, Now iv tested all parts of developing games and i know what i CAN and cannot do. I can make any games i want :), thanks to the great flexible unreal engine 3... I just hope the NWO and other bad people dont start enslaving humans before my game is complete. After my game is complete i have no worry

'''computergod666:''' Anyone know if it is possible to do a singleplayer mod for UT, and how?

'''Raven:''' It is possible to make a single player mod. It is just a gametype, but the rules are explicitly setup to focus on the single player aspects. There are many extra issues that come up when making an exclusive single player game, mostly to do with the shear output of art content to give the player enough to do and see. 

'''computergod666:''' Thanks. So does anyone know of a good tutorial for making SP mods?

'''computergod666:''' I get the funny feeling that no one around here is interested in single-player games!

'''SuperApe:''' [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]] can help for UT2004.  OSM Adventure is a single-player/coop gametype and OSMT gives you plenty of tools to make a SP adventure in UT2004.  And of course, if you're talking about UT99, there are the original &quot;old skool toolz&quot; availble there. :)

----

'''Wormbo:''' UltraHyperCode, people keep deleting this because it doesn't make much sense and definitely doesn't belong on this page. [[Legacy:Delete Reply When You See It|Delete reply when you see it]].
[http://www.google.com google]</text>
    </revision>
    <revision>
      <id>34420</id>
      <timestamp>2009-05-21T22:03:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/93.72.18.123|93.72.18.123]] ([[User talk:93.72.18.123|Talk]]) to last version by [[User:Raven|Raven]]</comment>
      <text xml:space="preserve">There seems to be lots of confusion as to what the difference between a mutator, mod, gametype, or total conversion is.  You'll find that the definition varies from person to person so the following definitions will probably not be accepted by the whole community, but they should help mod developers.  
  

==Overview  ==
; Mutator : Mutators are one way of making a mod activatable for the user. A mutator usually is a small modification to only one or few rules of a game, but there are exceptions to this rule.  Mutators are usually made with the intent for it to be compatible and/or usable with other mutators, most game types, or even multiple game types or total conversions.  A mutator has rules governing how it should behave, how it should interact, and how much it should change within a game.  See [[Legacy:Mutator Topics|Mutator Topics]].  
; Gametype : Gametypes are another way to make a mod user-selectable. Each gametype has a different objective.  The gametype of CTF is ''Capture The Flag''.  The goal is to find and return the enemy flag to your base.  Included with UT2K3 is also the gametypes of BR (Bombing Run), DM (Deathmatch), TDM (Team Deathmatch), and DOM (Domination).  Each gametype has a different way to end or win a map.  
; Total conversion (TC) : A total conversion is a collection of gametypes with a common theme and purpose.  For a total conversion it is generally accepted that new menus will be present, new graphics will be used throughout the entire game, a new set of INI files will be used, and that little, if any, content from the original game will be present or used.  
; Server add-on : Server add-ons don't change any part of the game's rules. Usually they add additional features for remote administration, security, player stats, etc. Server add-ons are often activated by adding an entry to the ServerActors list (INI section [Engine.GameEngine]), but there are also other ways, like changing the AccessControlClass (INI section [Engine.GameInfo]) or adding [[Legacy:WebApplication|WebApplication]]s to [UWeb.WebServer].  
; Client add-on : In UT's UWindow system it was possible to use some client-side add ons like GUI skins or other game menu modifications like the Mod Menu Extension or [osX] Background Changer. These not change any part of the gameplay, but only help players like their favorite game's menu system. ;) Client-side add-ons aren't possible in UT2003 anymore. (At least not at this time.)  
; New content : Maps, voice packs, announcer packs, player models or skins and similar content additions could also be viewed as mods since they modify and extend the game.  
  

Note that the term &quot;mod&quot; does not appear in this list, because it only is a general term for all kinds of modifications to the game. Players often distinguish between &quot;mod&quot; and &quot;mutator&quot; eventhough they are actually only refering to different mutators.  

Here on UnrealWiki we try to keep the term &quot;mod&quot; for the general concept of a modification to the game. A &quot;mutator&quot; is anything that can be added through the mutators list, while a &quot;gametype&quot; is anything that is activated through the game type list. There are mutators and gametypes that come with the game and there are custom mutators and gametypes &amp;ndash; the former are stock content while the latter are &quot;mods&quot;, no matter how much they actually do.  
  

==The Layman's Guide to Making Mods  ==

If you are thinking about making a mod (for any game) and are not sure what you need to know, how to go about it, or simply want to avoid the most obvious mistakes then read on.  The pages linked to below contain some excellent advice, and possibly comments on stuff that hadn't occured to you.  
  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/My_Team_Your_Team]] &amp;ndash; Introduction and disclaimer for all those, &quot;what's all this my team your team crap?&quot; readers.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Why_Are_You_Making_A_Mod]] &amp;ndash; Sometimes the reason a mod fails is the reason you started it in the first place.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Building_a_Team]] &amp;ndash; Building up your mod team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Despotism_Or_Communism]] &amp;ndash; Some thoughts on team structure.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Working_as_a_Team]] &amp;ndash; The day to day life of a team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Asset_Management]] &amp;ndash; How to manage the assets of your mod (code, textures, models, etc).  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Distributed_Development]] &amp;ndash; Find out how hard and unpleasant distributed development can be.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Effective_Testing]] &amp;ndash; How to get the most out of testing your mod.  
* [[Legacy:Releasing A Mod|Releasing A Mod]]  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supporting_Your_Mod]] &amp;ndash; Easing the burden of mod support.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod_Death]] &amp;ndash; What happens when a mod or mod team self destruct and how to cope.  
  

==Thoughts on Mod Making  ==

Several of the Unreal Wiki's contributors have experience in creating successful mods. Reading their accounts of their work and their advice is recommended.  
  
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Making your idea a reality.  
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people like your mod.  
* [[Legacy:Jb|Jb]] &amp;ndash; an analysis of the ChaosUT mod's history  
* [[Legacy:Piglet/Finishing_Things|Piglet/Finishing_Things]] &amp;ndash; How to actually finish your mods, that said it's more how to '''start''' so that you '''can''' finish.  
* [[Legacy:A_Bug'S_Life|A_Bug's_Life]]  
* [[Legacy:GODZ_Inception|GODZ_Inception]] &amp;ndash; a journal of how GODZ started.  
* [[Legacy:Making Mods/General Mod Optimization|Making Mods/General Mod Optimization]] &amp;ndash; Common mistakes and ignored settings which often lead to lower performance &amp;ndash; and how to fix/use them.  
  

==Some Recommended Reading  ==

It never ceases to amaze me how many programmers completely fail to take advantage of the wealth of experience of software developers that have decided to commit the things they have learnt to paper and write a book.  Although the following books will not help you write mods, they will help you write better software, and possibly manage your team and project more effectively.  You don't have to agree with what the books say &amp;ndash; as long as you understand why you disagree.  The books are in no particular order. (the links go to the original Wiki at C2: [[Wiki:WelcomeVisitors]], which has plenty on coding and is also a recommended read.)  
* [[Wiki:CodeComplete]] &amp;ndash; by [[Wiki:SteveMcConnell]]  
* [[Wiki:RapidDevelopment]] &amp;ndash; by Steve McConnell  
* [[Wiki:DebuggingTheDevelopmentProcess]] &amp;ndash; by [[Wiki:SteveMaguire]]  
* [[Wiki:WritingSolidCode]] &amp;ndash; by Steve Maguire  
* [http://www.amazon.com/exec/obidos/tg/detail/-/1560797045 Why Teams Don't Work] &amp;ndash; by Harvey Robbins and Michael Finley  
* [http://www.amazon.com/exec/obidos/tg/detail/-/0932633439/qid=1075688276 Peopleware &amp;ndash; Productive Projects and Teams] &amp;ndash; by Timothy Lister and Tom Demarco  
  

===Books on Unreal Modding/Programming  ===

  
* [http://www.amazon.co.uk/Mastering-Unreal-Technology-Level-Design/dp/0672326922] - Mastering Unreal Technology: The Art of level Design  
* [http://www.amazon.co.uk/Unreal-Tournament-Game-Programming-Teens/dp/1598633465] - Unreal Tournament Game Programming for Teens  
* [http://www.amazon.com/UnrealScript-Game-Programming-All-One/dp/1598631489] - UnrealScript Game Programming: All in One  
  

==Related Topics  ==

===Basic Topics  ===
* [[Legacy:UnrealScript|UnrealScript Topics]]  
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]  

===Design Concepts  ===
* [[Legacy:Gameplay|Gameplay]]  
* [[Legacy:Game Balance|Game Balance]]  

===Modding Topics  ===
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]. Written in the early days of UT, but much is still relevant.  
* [[Legacy:Mod_Authoring_for_UT2K3|Mod_Authoring_for_UT2K3]].  Document similar to Brandon's but for UT2K3.  
* [[Legacy:Interactive GUI|Interactive GUI]]  
* [[Legacy:Mutator_Topics|Mutator_Topics]]  
** [[Legacy:Useful Mutator Functions|Useful Mutator Functions]]  
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] - A tutorial covering modeling, animation and import of skeletal mesh characters  

===Miscellaneous  ===
* [[:Category:Legacy Custom Class]] - A list of custom classes on the wiki  
* [[Legacy:Unreal_University|Unreal_University]] - An annual weekend seminar given by Epic (and others) on the topics of mod making.  
* [[Legacy:Mod Ideas|Mod Ideas]] - Get some ideas for a project or share your own  
* [[Legacy:Testing Lab|Testing Lab]] - Get others to help test your code  
  

==Discussion  ==

'''SuperApe:''' This page deserves to be linked from the Home Page.  Is this a good hub for Modding? 

'''fleshsniper1:''' hmm.... iv looked around and all this wiki gives on making mods is opinion/experience. it doesnt tell you where to began if you actualy want to start making one. like in SOURCE engine, they tell you that you must first get a base by copying some of the codes and then you start editing the menus and create a map and such. now for me a newb, im not sure where to start. do i just make maps and replace some models and edit the scripts? how would i make menus and where do put my content source? i guess im talking more on a TC mod which i believe requires more than what is provided here... thanks for reading

'''Ambershee:''' There are loads of tutorials on the wiki. Look at the sections Mapping Lessons and UnrealScript Lessons.

'''fleshsniper1:''' right now iv done most of the basic tutorials. i can make a crappy map and compile it with pawn actors and such basics. but where do i began creating/importing content and maintining my content away from unreals content. how to go about? is that what packages are for? it would be nice if there was a guide for making a SP mod that includes starting up a base that wont interfere with the UT2004 game, how to manage content. somthing like that :)

'''Ambershee:''' http://udn.epicgames.com/Two/MyFirstCode.html

'''fleshsniper1:''' Well hello. I will tell you that your mod will never work or even get of the ground, if you dont know how to script. No matter how good your design or artist you are, whatever great ideas you have, they will never get of the ground or come to fruition until you learn to script (or posses scripting ability through another person) which is basically programming. I realize my low inspiration was due to this fact (and real life issues lol), I always though i could become a scripter later on and can work on the art first, but now i realize it is unhealthy... 1/5/08, Now iv tested all parts of developing games and i know what i CAN and cannot do. I can make any games i want :), thanks to the great flexible unreal engine 3... I just hope the NWO and other bad people dont start enslaving humans before my game is complete. After my game is complete i have no worry

'''computergod666:''' Anyone know if it is possible to do a singleplayer mod for UT, and how?

'''Raven:''' It is possible to make a single player mod. It is just a gametype, but the rules are explicitly setup to focus on the single player aspects. There are many extra issues that come up when making an exclusive single player game, mostly to do with the shear output of art content to give the player enough to do and see. 

'''computergod666:''' Thanks. So does anyone know of a good tutorial for making SP mods?

'''computergod666:''' I get the funny feeling that no one around here is interested in single-player games!

'''SuperApe:''' [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]] can help for UT2004.  OSM Adventure is a single-player/coop gametype and OSMT gives you plenty of tools to make a SP adventure in UT2004.  And of course, if you're talking about UT99, there are the original &quot;old skool toolz&quot; availble there. :)

----

'''Wormbo:''' UltraHyperCode, people keep deleting this because it doesn't make much sense and definitely doesn't belong on this page. [[Legacy:Delete Reply When You See It|Delete reply when you see it]].</text>
    </revision>
    <revision>
      <id>43749</id>
      <timestamp>2010-07-29T12:56:25Z</timestamp>
      <contributor>
        <ip>119.155.44.91</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">There seems to be lots of confusion as to what the difference between a mutator, mod, gametype, or total conversion is.  You'll find that the definition varies from person to person so the following definitions will probably not be accepted by the whole community, but they should help mod developers.  
  

==Overview  ==
; Mutator : Mutators are one way of making a mod activatable for the user. A mutator usually is a small modification to only one or few rules of a game, but there are exceptions to this rule.  Mutators are usually made with the intent for it to be compatible and/or usable with other mutators, most game types, or even multiple game types or total conversions.  A mutator has rules governing how it should behave, how it should interact, and how much it should change within a game.  See [[Legacy:Mutator Topics|Mutator Topics]].  
; Gametype : Gametypes are another way to make a mod user-selectable. Each gametype has a different objective.  The gametype of CTF is ''Capture The Flag''.  The goal is to find and return the enemy flag to your base.  Included with UT2K3 is also the gametypes of BR (Bombing Run), DM (Deathmatch), TDM (Team Deathmatch), and DOM (Domination).  Each gametype has a different way to end or win a map.  
; Total conversion (TC) : A total conversion is a collection of gametypes with a common theme and purpose.  For a total conversion it is generally accepted that new menus will be present, new graphics will be used throughout the entire game, a new set of INI files will be used, and that little, if any, content from the original game will be present or used.  
; Server add-on : Server add-ons don't change any part of the game's rules. Usually they add additional features for remote administration, security, player stats, etc. Server add-ons are often activated by adding an entry to the ServerActors list (INI section [Engine.GameEngine]), but there are also other ways, like changing the AccessControlClass (INI section [Engine.GameInfo]) or adding [[Legacy:WebApplication|WebApplication]]s to [UWeb.WebServer].  
; Client add-on : In UT's UWindow system it was possible to use some client-side add ons like GUI skins or other game menu modifications like the Mod Menu Extension or [osX] Background Changer. These not change any part of the gameplay, but only help players like their favorite game's menu system. ;) Client-side add-ons aren't possible in UT2003 anymore. (At least not at this time.)  
; New content : Maps, voice packs, announcer packs, player models or skins and similar content additions could also be viewed as mods since they modify and extend the game.  
  

Note that the term &quot;mod&quot; does not appear in this list, because it only is a general term for all kinds of modifications to the game. Players often distinguish between &quot;mod&quot; and &quot;mutator&quot; eventhough they are actually only refering to different mutators.  

Here on UnrealWiki we try to keep the term &quot;mod&quot; for the general concept of a modification to the game. A &quot;mutator&quot; is anything that can be added through the mutators list, while a &quot;gametype&quot; is anything that is activated through the game type list. There are mutators and gametypes that come with the game and there are custom mutators and gametypes &amp;ndash; the former are stock content while the latter are &quot;mods&quot;, no matter how much they actually do.  
  

==The Layman's Guide to Making Mods  ==

If you are thinking about making a mod (for any game) and are not sure what you need to know, how to go about it, or simply want to avoid the most obvious mistakes then read on.  The pages linked to below contain some excellent advice, and possibly comments on stuff that hadn't occured to you.  
  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/My_Team_Your_Team]] &amp;ndash; Introduction and disclaimer for all those, &quot;what's all this my team your team crap?&quot; readers.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Why_Are_You_Making_A_Mod]] &amp;ndash; Sometimes the reason a mod fails is the reason you started it in the first place.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Building_a_Team]] &amp;ndash; Building up your mod team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Despotism_Or_Communism]] &amp;ndash; Some thoughts on team structure.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Working_as_a_Team]] &amp;ndash; The day to day life of a team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Asset_Management]] &amp;ndash; How to manage the assets of your mod (code, textures, models, etc).  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Distributed_Development]] &amp;ndash; Find out how hard and unpleasant distributed development can be.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Effective_Testing]] &amp;ndash; How to get the most out of testing your mod.  
* [[Legacy:Releasing A Mod|Releasing A Mod]]  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supporting_Your_Mod]] &amp;ndash; Easing the burden of mod support.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod_Death]] &amp;ndash; What happens when a mod or mod team self destruct and how to cope.  
  

==Thoughts on Mod Making  ==

Several of the Unreal Wiki's contributors have experience in creating successful mods. Reading their accounts of their work and their advice is recommended.  
  
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Making your idea a reality.  
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people like your mod.  
* [[Legacy:Jb|Jb]] &amp;ndash; an analysis of the ChaosUT mod's history  
* [[Legacy:Piglet/Finishing_Things|Piglet/Finishing_Things]] &amp;ndash; How to actually finish your mods, that said it's more how to '''start''' so that you '''can''' finish.  
* [[Legacy:A_Bug'S_Life|A_Bug's_Life]]  
* [[Legacy:GODZ_Inception|GODZ_Inception]] &amp;ndash; a journal of how GODZ started.  
* [[Legacy:Making Mods/General Mod Optimization|Making Mods/General Mod Optimization]] &amp;ndash; Common mistakes and ignored settings which often lead to lower performance &amp;ndash; and how to fix/use them.  
  

==Some Recommended Reading  ==

It never ceases to amaze me how many programmers completely fail to take advantage of the wealth of experience of software developers that have decided to commit the things they have learnt to paper and write a book.  Although the following books will not help you write mods, they will help you write better software, and possibly manage your team and project more effectively.  You don't have to agree with what the books say &amp;ndash; as long as you understand why you disagree.  The books are in no particular order. (the links go to the original Wiki at C2: [[Wiki:WelcomeVisitors]], which has plenty on coding and is also a recommended read.)  
* [[Wiki:CodeComplete]] &amp;ndash; by [[Wiki:SteveMcConnell]]  
* [[Wiki:RapidDevelopment]] &amp;ndash; by Steve McConnell  
* [[Wiki:DebuggingTheDevelopmentProcess]] &amp;ndash; by [[Wiki:SteveMaguire]]  
* [[Wiki:WritingSolidCode]] &amp;ndash; by Steve Maguire  
* [http://www.amazon.com/exec/obidos/tg/detail/-/1560797045 Why Teams Don't Work] &amp;ndash; by Harvey Robbins and Michael Finley  
* [http://www.amazon.com/exec/obidos/tg/detail/-/0932633439/qid=1075688276 Peopleware &amp;ndash; Productive Projects and Teams] &amp;ndash; by Timothy Lister and Tom Demarco  
  

===Books on Unreal Modding/Programming  ===

  
* [http://www.amazon.co.uk/Mastering-Unreal-Technology-Level-Design/dp/0672326922] - Mastering Unreal Technology: The Art of level Design  
* [http://www.amazon.co.uk/Unreal-Tournament-Game-Programming-Teens/dp/1598633465] - Unreal Tournament Game Programming for Teens  
* [http://www.amazon.com/UnrealScript-Game-Programming-All-One/dp/1598631489] - UnrealScript Game Programming: All in One  
  

==Related Topics  ==

===Basic Topics  ===
* [[Legacy:UnrealScript|UnrealScript Topics]]  
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]  

===Design Concepts  ===
* [[Legacy:Gameplay|Gameplay]]  
* [[Legacy:Game Balance|Game Balance]]  

===Modding Topics  ===
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]. Written in the early days of UT, but much is still relevant.  
* [[Legacy:Mod_Authoring_for_UT2K3|Mod_Authoring_for_UT2K3]].  Document similar to Brandon's but for UT2K3.  
* [[Legacy:Interactive GUI|Interactive GUI]]  
* [[Legacy:Mutator_Topics|Mutator_Topics]]  
** [[Legacy:Useful Mutator Functions|Useful Mutator Functions]]  
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] - A tutorial covering modeling, animation and import of skeletal mesh characters  

===Miscellaneous  ===
* [[:Category:Legacy Custom Class]] - A list of custom classes on the wiki  
* [[Legacy:Unreal_University|Unreal_University]] - An annual weekend seminar given by Epic (and others) on the topics of mod making.  
* [[Legacy:Mod Ideas|Mod Ideas]] - Get some ideas for a project or share your own  
* [[Legacy:Testing Lab|Testing Lab]] - Get others to help test your code  
  

==Discussion  ==

'''SuperApe:''' This page deserves to be linked from the Home Page.  Is this a good hub for Modding? 

'''fleshsniper1:''' hmm.... iv looked around and all this wiki gives on making mods is opinion/experience. it doesnt tell you where to began if you actualy want to start making one. like in SOURCE engine, they tell you that you must first get a base by copying some of the codes and then you start editing the menus and create a map and such. now for me a newb, im not sure where to start. do i just make maps and replace some models and edit the scripts? how would i make menus and where do put my content source? i guess im talking more on a TC mod which i believe requires more than what is provided here... thanks for reading [http://www.realessaywriting.com essay help]

'''Ambershee:''' There are loads of tutorials on the wiki. Look at the sections Mapping Lessons and UnrealScript Lessons.

'''fleshsniper1:''' right now iv done most of the basic tutorials. i can make a crappy map and compile it with pawn actors and such basics. but where do i began creating/importing content and maintining my content away from unreals content. how to go about? is that what packages are for? it would be nice if there was a guide for making a SP mod that includes starting up a base that wont interfere with the UT2004 game, how to manage content. somthing like that :)

'''Ambershee:''' http://udn.epicgames.com/Two/MyFirstCode.html

'''fleshsniper1:''' Well hello. I will tell you that your mod will never work or even get of the ground, if you dont know how to script. No matter how good your design or artist you are, whatever great ideas you have, they will never get of the ground or come to fruition until you learn to script (or posses scripting ability through another person) which is basically programming. I realize my low inspiration was due to this fact (and real life issues lol), I always though i could become a scripter later on and can work on the art first, but now i realize it is unhealthy... 1/5/08, Now iv tested all parts of developing games and i know what i CAN and cannot do. I can make any games i want :), thanks to the great flexible unreal engine 3... I just hope the NWO and other bad people dont start enslaving humans before my game is complete. After my game is complete i have no worry

'''computergod666:''' Anyone know if it is possible to do a singleplayer mod for UT, and how?

'''Raven:''' It is possible to make a single player mod. It is just a gametype, but the rules are explicitly setup to focus on the single player aspects. There are many extra issues that come up when making an exclusive single player game, mostly to do with the shear output of art content to give the player enough to do and see.[http://www.realthesiswriting.com thesis help] 

'''computergod666:''' Thanks. So does anyone know of a good tutorial for making SP mods?

'''computergod666:''' I get the funny feeling that no one around here is interested in single-player games!

'''SuperApe:''' [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]] can help for UT2004.  OSM Adventure is a single-player/coop gametype and OSMT gives you plenty of tools to make a SP adventure in UT2004.  And of course, if you're talking about UT99, there are the original &quot;old skool toolz&quot; availble there. :)

----

'''Wormbo:''' UltraHyperCode, people keep deleting this because it doesn't make much sense and definitely doesn't belong on this page. [[Legacy:Delete Reply When You See It|Delete reply when you see it]].</text>
    </revision>
    <revision>
      <id>43752</id>
      <timestamp>2010-07-29T14:02:19Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/119.155.44.91|119.155.44.91]] ([[User talk:119.155.44.91|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">There seems to be lots of confusion as to what the difference between a mutator, mod, gametype, or total conversion is.  You'll find that the definition varies from person to person so the following definitions will probably not be accepted by the whole community, but they should help mod developers.  
  

==Overview  ==
; Mutator : Mutators are one way of making a mod activatable for the user. A mutator usually is a small modification to only one or few rules of a game, but there are exceptions to this rule.  Mutators are usually made with the intent for it to be compatible and/or usable with other mutators, most game types, or even multiple game types or total conversions.  A mutator has rules governing how it should behave, how it should interact, and how much it should change within a game.  See [[Legacy:Mutator Topics|Mutator Topics]].  
; Gametype : Gametypes are another way to make a mod user-selectable. Each gametype has a different objective.  The gametype of CTF is ''Capture The Flag''.  The goal is to find and return the enemy flag to your base.  Included with UT2K3 is also the gametypes of BR (Bombing Run), DM (Deathmatch), TDM (Team Deathmatch), and DOM (Domination).  Each gametype has a different way to end or win a map.  
; Total conversion (TC) : A total conversion is a collection of gametypes with a common theme and purpose.  For a total conversion it is generally accepted that new menus will be present, new graphics will be used throughout the entire game, a new set of INI files will be used, and that little, if any, content from the original game will be present or used.  
; Server add-on : Server add-ons don't change any part of the game's rules. Usually they add additional features for remote administration, security, player stats, etc. Server add-ons are often activated by adding an entry to the ServerActors list (INI section [Engine.GameEngine]), but there are also other ways, like changing the AccessControlClass (INI section [Engine.GameInfo]) or adding [[Legacy:WebApplication|WebApplication]]s to [UWeb.WebServer].  
; Client add-on : In UT's UWindow system it was possible to use some client-side add ons like GUI skins or other game menu modifications like the Mod Menu Extension or [osX] Background Changer. These not change any part of the gameplay, but only help players like their favorite game's menu system. ;) Client-side add-ons aren't possible in UT2003 anymore. (At least not at this time.)  
; New content : Maps, voice packs, announcer packs, player models or skins and similar content additions could also be viewed as mods since they modify and extend the game.  
  

Note that the term &quot;mod&quot; does not appear in this list, because it only is a general term for all kinds of modifications to the game. Players often distinguish between &quot;mod&quot; and &quot;mutator&quot; eventhough they are actually only refering to different mutators.  

Here on UnrealWiki we try to keep the term &quot;mod&quot; for the general concept of a modification to the game. A &quot;mutator&quot; is anything that can be added through the mutators list, while a &quot;gametype&quot; is anything that is activated through the game type list. There are mutators and gametypes that come with the game and there are custom mutators and gametypes &amp;ndash; the former are stock content while the latter are &quot;mods&quot;, no matter how much they actually do.  
  

==The Layman's Guide to Making Mods  ==

If you are thinking about making a mod (for any game) and are not sure what you need to know, how to go about it, or simply want to avoid the most obvious mistakes then read on.  The pages linked to below contain some excellent advice, and possibly comments on stuff that hadn't occured to you.  
  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/My_Team_Your_Team]] &amp;ndash; Introduction and disclaimer for all those, &quot;what's all this my team your team crap?&quot; readers.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Why_Are_You_Making_A_Mod]] &amp;ndash; Sometimes the reason a mod fails is the reason you started it in the first place.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Building_a_Team]] &amp;ndash; Building up your mod team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Despotism_Or_Communism]] &amp;ndash; Some thoughts on team structure.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Working_as_a_Team]] &amp;ndash; The day to day life of a team.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Asset_Management]] &amp;ndash; How to manage the assets of your mod (code, textures, models, etc).  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Distributed_Development]] &amp;ndash; Find out how hard and unpleasant distributed development can be.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Effective_Testing]] &amp;ndash; How to get the most out of testing your mod.  
* [[Legacy:Releasing A Mod|Releasing A Mod]]  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supporting_Your_Mod]] &amp;ndash; Easing the burden of mod support.  
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod_Death]] &amp;ndash; What happens when a mod or mod team self destruct and how to cope.  
  

==Thoughts on Mod Making  ==

Several of the Unreal Wiki's contributors have experience in creating successful mods. Reading their accounts of their work and their advice is recommended.  
  
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; Making your idea a reality.  
* [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] &amp;ndash; How to make people like your mod.  
* [[Legacy:Jb|Jb]] &amp;ndash; an analysis of the ChaosUT mod's history  
* [[Legacy:Piglet/Finishing_Things|Piglet/Finishing_Things]] &amp;ndash; How to actually finish your mods, that said it's more how to '''start''' so that you '''can''' finish.  
* [[Legacy:A_Bug'S_Life|A_Bug's_Life]]  
* [[Legacy:GODZ_Inception|GODZ_Inception]] &amp;ndash; a journal of how GODZ started.  
* [[Legacy:Making Mods/General Mod Optimization|Making Mods/General Mod Optimization]] &amp;ndash; Common mistakes and ignored settings which often lead to lower performance &amp;ndash; and how to fix/use them.  
  

==Some Recommended Reading  ==

It never ceases to amaze me how many programmers completely fail to take advantage of the wealth of experience of software developers that have decided to commit the things they have learnt to paper and write a book.  Although the following books will not help you write mods, they will help you write better software, and possibly manage your team and project more effectively.  You don't have to agree with what the books say &amp;ndash; as long as you understand why you disagree.  The books are in no particular order. (the links go to the original Wiki at C2: [[Wiki:WelcomeVisitors]], which has plenty on coding and is also a recommended read.)  
* [[Wiki:CodeComplete]] &amp;ndash; by [[Wiki:SteveMcConnell]]  
* [[Wiki:RapidDevelopment]] &amp;ndash; by Steve McConnell  
* [[Wiki:DebuggingTheDevelopmentProcess]] &amp;ndash; by [[Wiki:SteveMaguire]]  
* [[Wiki:WritingSolidCode]] &amp;ndash; by Steve Maguire  
* [http://www.amazon.com/exec/obidos/tg/detail/-/1560797045 Why Teams Don't Work] &amp;ndash; by Harvey Robbins and Michael Finley  
* [http://www.amazon.com/exec/obidos/tg/detail/-/0932633439/qid=1075688276 Peopleware &amp;ndash; Productive Projects and Teams] &amp;ndash; by Timothy Lister and Tom Demarco  
  

===Books on Unreal Modding/Programming  ===

  
* [http://www.amazon.co.uk/Mastering-Unreal-Technology-Level-Design/dp/0672326922] - Mastering Unreal Technology: The Art of level Design  
* [http://www.amazon.co.uk/Unreal-Tournament-Game-Programming-Teens/dp/1598633465] - Unreal Tournament Game Programming for Teens  
* [http://www.amazon.com/UnrealScript-Game-Programming-All-One/dp/1598631489] - UnrealScript Game Programming: All in One  
  

==Related Topics  ==

===Basic Topics  ===
* [[Legacy:UnrealScript|UnrealScript Topics]]  
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]  

===Design Concepts  ===
* [[Legacy:Gameplay|Gameplay]]  
* [[Legacy:Game Balance|Game Balance]]  

===Modding Topics  ===
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]. Written in the early days of UT, but much is still relevant.  
* [[Legacy:Mod_Authoring_for_UT2K3|Mod_Authoring_for_UT2K3]].  Document similar to Brandon's but for UT2K3.  
* [[Legacy:Interactive GUI|Interactive GUI]]  
* [[Legacy:Mutator_Topics|Mutator_Topics]]  
** [[Legacy:Useful Mutator Functions|Useful Mutator Functions]]  
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] - A tutorial covering modeling, animation and import of skeletal mesh characters  

===Miscellaneous  ===
* [[:Category:Legacy Custom Class]] - A list of custom classes on the wiki  
* [[Legacy:Unreal_University|Unreal_University]] - An annual weekend seminar given by Epic (and others) on the topics of mod making.  
* [[Legacy:Mod Ideas|Mod Ideas]] - Get some ideas for a project or share your own  
* [[Legacy:Testing Lab|Testing Lab]] - Get others to help test your code  
  

==Discussion  ==

'''SuperApe:''' This page deserves to be linked from the Home Page.  Is this a good hub for Modding? 

'''fleshsniper1:''' hmm.... iv looked around and all this wiki gives on making mods is opinion/experience. it doesnt tell you where to began if you actualy want to start making one. like in SOURCE engine, they tell you that you must first get a base by copying some of the codes and then you start editing the menus and create a map and such. now for me a newb, im not sure where to start. do i just make maps and replace some models and edit the scripts? how would i make menus and where do put my content source? i guess im talking more on a TC mod which i believe requires more than what is provided here... thanks for reading

'''Ambershee:''' There are loads of tutorials on the wiki. Look at the sections Mapping Lessons and UnrealScript Lessons.

'''fleshsniper1:''' right now iv done most of the basic tutorials. i can make a crappy map and compile it with pawn actors and such basics. but where do i began creating/importing content and maintining my content away from unreals content. how to go about? is that what packages are for? it would be nice if there was a guide for making a SP mod that includes starting up a base that wont interfere with the UT2004 game, how to manage content. somthing like that :)

'''Ambershee:''' http://udn.epicgames.com/Two/MyFirstCode.html

'''fleshsniper1:''' Well hello. I will tell you that your mod will never work or even get of the ground, if you dont know how to script. No matter how good your design or artist you are, whatever great ideas you have, they will never get of the ground or come to fruition until you learn to script (or posses scripting ability through another person) which is basically programming. I realize my low inspiration was due to this fact (and real life issues lol), I always though i could become a scripter later on and can work on the art first, but now i realize it is unhealthy... 1/5/08, Now iv tested all parts of developing games and i know what i CAN and cannot do. I can make any games i want :), thanks to the great flexible unreal engine 3... I just hope the NWO and other bad people dont start enslaving humans before my game is complete. After my game is complete i have no worry

'''computergod666:''' Anyone know if it is possible to do a singleplayer mod for UT, and how?

'''Raven:''' It is possible to make a single player mod. It is just a gametype, but the rules are explicitly setup to focus on the single player aspects. There are many extra issues that come up when making an exclusive single player game, mostly to do with the shear output of art content to give the player enough to do and see. 

'''computergod666:''' Thanks. So does anyone know of a good tutorial for making SP mods?

'''computergod666:''' I get the funny feeling that no one around here is interested in single-player games!

'''SuperApe:''' [[Legacy:SuperApe/Old Skool Monsta Toolz|Old Skool Monsta Toolz]] can help for UT2004.  OSM Adventure is a single-player/coop gametype and OSMT gives you plenty of tools to make a SP adventure in UT2004.  And of course, if you're talking about UT99, there are the original &quot;old skool toolz&quot; availble there. :)

----

'''Wormbo:''' UltraHyperCode, people keep deleting this because it doesn't make much sense and definitely doesn't belong on this page. [[Legacy:Delete Reply When You See It|Delete reply when you see it]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Asset Management</title>
    <id>1850</id>
    <revision>
      <id>4542</id>
      <timestamp>2005-12-16T19:44:40Z</timestamp>
      <contributor>
        <ip>38.116.192.13</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The word 'asset' is being in this instance as a script, model, texture, sound, etc.

In making a mod, you will often have many assets created. This is especially true for a total conversion, which contains little, if any, assets from the original game. Analyze, for a moment, the assets that can go into a single map. The list is not that long, but remember that you'll have many of each.

* The map file itself
* Static meshes
* Textures
* Sounds
* Music
* Particles
* Scripted events

Assets are what make up you mod. Wouldn't you like to keep them safe from hard drive failure? Don't you want to be organized for maximum efficiency? Read on.

==Protection==

Imagine that you are deep into the development of a mod. You've created tons of custom content, you've solved interpersonal conflicts in your team, you've pulled together for a common goal. You're mere weeks from a release! And then...

Your hard drive fails. Not just any hard drive. ''The'' hard drive. The hard drive storing all your finished creations. The agony! Now forget that ghastly image. It's an extreme one, even an improbable one. But you'd still like to take all precautions against it, wouldn't you? That's why you need to back up your assets. Have multiple people on you team store the complete library of the current versions of your assets. Don't have a team? Put the assets on your web server. Don't have a web server? Email the packages to yourself.

Another sound piece of advice is to use a [[Legacy:CVS|CVS]]. This will help keep track of versions and make the latest version of every asset available to all team members.

==Organization==

If you're a mapper, you've futilely attempted to traverse the horrible catacombs of Epic and Digital Extreme's assets, both texture and static mesh. Not fun. Of course you'd like your team to work efficiently. Even without a team, it can be depressing looking through your carefully crafted assets and seeing them scattered throughout cryptically named packages. Don't let it happen to you.

* Consolidate. Put all your assets into a main package.
* Use groups in you packages. If you've got large collection of static mesh assets, organize them by theme, such as Industrial, Outdoor, etc.
* Don't put in anything you're not proud of. No one wants to wade through sixteen unusable unfinished or unprofessional assets to get to two good ones.

In short, back up, use a CVS, and be organized. A well managed asset is a happy asset. Or something like that.

==Discussion==

'''GRAF1K:''' More later on organization. It's a very important topic, and I've barely scratched the surface. Anyone else, feel free to beat me to it. :)

'''TSOShadow:''' I think it's pretty well done. Although you may want some advice for the slow ended internet connection. Like how to transfer files Or ways of transfering files to another computer with a better connection with out the internet. Another thing is what if you get a brand new computer? How do you get your files from one HD to another? (If anyone would like to add this...)</text>
    </revision>
    <revision>
      <id>4543</id>
      <timestamp>2005-01-11T15:53:38Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>despam</comment>
      <text xml:space="preserve">The word 'asset' is being in this instance as a script, model, texture, sound, etc.

In making a mod, you will often have many assets created. This is especially true for a total conversion, which contains little, if any, assets from the original game. Analyze, for a moment, the assets that can go into a single map. The list is not that long, but remember that you'll have many of each.

* The map file itself
* Static meshes
* Textures
* Sounds
* Music
* Particles
* Scripted events

Assets are what make up you mod. Wouldn't you like to keep them safe from hard drive failure? Don't you want to be organized for maximum efficiency? Read on.

==Protection==

Imagine that you are deep into the development of a mod. You've created tons of custom content, you've solved interpersonal conflicts in your team, you've pulled together for a common goal. You're mere weeks from a release! And then...

Your hard drive fails. Not just any hard drive. ''The'' hard drive. The hard drive storing all your finished creations. The agony! Now forget that ghastly image. It's an extreme one, even an improbable one. But you'd still like to take all precautions against it, wouldn't you? That's why you need to back up your assets. Have multiple people on you team store the complete library of the current versions of your assets. Don't have a team? Put the assets on your web server. Don't have a web server? Email the packages to yourself.

Another sound piece of advice is to use a [[Legacy:CVS|CVS]]. This will help keep track of versions and make the latest version of every asset available to all team members.

==Organization==

If you're a mapper, you've futilely attempted to traverse the horrible catacombs of Epic and Digital Extreme's assets, both texture and static mesh. Not fun. Of course you'd like your team to work efficiently. Even without a team, it can be depressing looking through your carefully crafted assets and seeing them scattered throughout cryptically named packages. Don't let it happen to you.

* Consolidate. Put all your assets into a main package.
* Use groups in you packages. If you've got large collection of static mesh assets, organize them by theme, such as Industrial, Outdoor, etc.
* Don't put in anything you're not proud of. No one wants to wade through sixteen unusable unfinished or unprofessional assets to get to two good ones.

In short, back up, use a CVS, and be organized. A well managed asset is a happy asset. Or something like that.

==Discussion==

'''GRAF1K:''' More later on organization. It's a very important topic, and I've barely scratched the surface. Anyone else, feel free to beat me to it. :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Building A Team</title>
    <id>1849</id>
    <revision>
      <id>4539</id>
      <timestamp>2005-12-16T19:40:58Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Reply to TSOShadow.  Actions speak louder than words.</comment>
      <text xml:space="preserve">==Building a Team ==

So you have a truly classic idea for a mod, and you've read the [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] and [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] pages so you know how to avoid some of the obvious pitfalls.  You now need a team to help you bring your stunning mod concept to life.

===Do you really need a team ===

The very first thing you must do is challenge the idea that you need a team at all.  Is the mod big enough to warrant building a team to do it?  You might not have all of the skills necessary to bring the mod to life, but, you may not need a full time team to work on it.  You may also be able to acquire the skills you need to create your own mod.  Making small mods with other people is hard.  It's easy to get to a point where the &quot;maintenance of the team&quot; becomes more of a burden than the help the team itself provides.

Consider a weapon mod.

I'm a coder at heart, writing software is where I get my kicks.  In order to do a proper weapon mod I'd need a set of models and skins for the weapon, ammo packs, and bullet effects.  I've never tried modelling anything with a proper 3D package &amp;ndash; I'd much prefer to type the vertice and facet definitions in by hand.  My texturing skills are so poor that they deserve warning stickers.

However, do I really want or need to build a team of modellers and skinners around me before I start my mod?  The answer is not at all.  I'd start by writing the code for the weapon using one of the standard game models.  I might attempt to sketch my idea for the weapon in Corel Draw or Photopaint - or even on paper.  Once I'm at least semi-happy with the code I might start up my favourite (ie. the one I have installed) modelling package and see how far I can get.  Alternatively, I could post on one of the many forums a request for help.  I could then finish off the mod without ever having built a team to do it.

===Balance is important ===

If you are convinced that your mod is big enough to warrant a team of people working on it full time then you need to consider how many people capable of each discipline (modelling, coding, skinning etc) you need.  Having multi-skilled team members is extremely useful as they can have areas of overlapping responsibility.

Don't fill your team with modellers when your mod only needs three models.  This applies equally to the other elements of your mod.  In the case of the modellers, one modeller will do most of the work and the other two will get frustrated, fed up, and then leave, because they have nothing to do.  Before they leave though they will be unconciously (or maybe conciously) spreading disastisfaction with the team and mod.  This is bad for morale and will hurt productivity.

Probably the hardest area to accurately recruit for is your coding.  Splitting code up is difficult unless you have a reasonable idea of how everything fits together.  The best approach to use is to recruit a single coder and make them responsible for the overal design and structure of the code.  Only bring in another coder if they can see some easy way to partition the development responsibilities, or, if they start to get swamped.

It's better to have a small team and take longer to finish the mod than it is to have a big team and risk never finishing anything.  As the size of the mod team increases, the amount of time spent communicating within the team increases exponentially.  The more time that is spent in communication, the less time is spent actually doing any work on the mod.

I have seen two teams of 4 people deliver a project in 6 months that a single team of just over 100 couldn't deliver in a year.  So having a large team can be a good way of assuring failure rather than success.  It's more important to have a large team testing the mod than it is a large team building it.

===Make Responsibilities Clear ===

Make sure that everyone in the team knows not only what they are responsible for delivering, but also what everyone else is responsible for as well.  In most cases this split of responsibility is easy to define.  Where this split of responsibility is difficult to define spend some time thinking about it rather than just ignoring the issue.  It will save you some pain later on down the line.  Don't worry if your initial split of work and responsibility seems unbalanced, having one person picking up more work than an another.  Clarity is what is important here.

Review the responsibilities or each team member regularly.  You may find that your original split of work can be further refined to balance the work out between the team members.  You will find that this needs to be done anyway as ''real life'' and other ''unexpected events'' kick in and impact on your project team.

If you can specify internal delivery dates for the components of your mod all the better.  This helps you keep track of where you are up to.  Remember though, any dates specified are simply working values.  They can and will move both forwards and backwards.  Being able to check delivery dates against components can be a good indicator of whether one member of the team is swamped with work, or simply needs a break.

===Know When to Stop ===

At the point the team starts the mod you should have stated clearly and concisely exactly when the mod is finished.  If the mod's final state is left as a vague description then you risk catching &quot;When It's Done&quot; syndrome.  Knowing when the mod is finished is as important as starting it in the first place.  The clearer the specification of the mod the better your position is going to be.

Make sure everyone in the team understands and agrees with what constitutes the finished mod.  The team members will almost certainly want to add features of their own, so be prepared for that.  Just make sure that you agree from the outset which features will make it into the current version.

==Related Topics==
* [[Legacy:Mod Ideas|Mod Ideas]]

==Discussion==

'''TSOShadow:''' I'm not good at writeing so I'll put this in words instead. What if your attempting to start up a dropped mod? (With Permission of course) And old memebers/community think your some nut that will ruin it? How do you get people to trust you that your here to build a new experience on a premade base?

'''SuperApe:''' You could ask the originators to vouch for you.  Beyond that, your own actions should be what other judge you on.  If you listen to your critics and allow the dialogue to improve on the design, you may well win them over.  But, in short, do what you need to do, what you've been been given &quot;Permission&quot; to do, and worry about naysayer afterwards.</text>
    </revision>
    <revision>
      <id>4540</id>
      <timestamp>2005-12-16T19:34:37Z</timestamp>
      <contributor>
        <ip>38.116.192.13</ip>
      </contributor>
      <text xml:space="preserve">==Building a Team ==

So you have a truly classic idea for a mod, and you've read the [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] and [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] pages so you know how to avoid some of the obvious pitfalls.  You now need a team to help you bring your stunning mod concept to life.

===Do you really need a team ===

The very first thing you must do is challenge the idea that you need a team at all.  Is the mod big enough to warrant building a team to do it?  You might not have all of the skills necessary to bring the mod to life, but, you may not need a full time team to work on it.  You may also be able to acquire the skills you need to create your own mod.  Making small mods with other people is hard.  It's easy to get to a point where the &quot;maintenance of the team&quot; becomes more of a burden than the help the team itself provides.

Consider a weapon mod.

I'm a coder at heart, writing software is where I get my kicks.  In order to do a proper weapon mod I'd need a set of models and skins for the weapon, ammo packs, and bullet effects.  I've never tried modelling anything with a proper 3D package &amp;ndash; I'd much prefer to type the vertice and facet definitions in by hand.  My texturing skills are so poor that they deserve warning stickers.

However, do I really want or need to build a team of modellers and skinners around me before I start my mod?  The answer is not at all.  I'd start by writing the code for the weapon using one of the standard game models.  I might attempt to sketch my idea for the weapon in Corel Draw or Photopaint - or even on paper.  Once I'm at least semi-happy with the code I might start up my favourite (ie. the one I have installed) modelling package and see how far I can get.  Alternatively, I could post on one of the many forums a request for help.  I could then finish off the mod without ever having built a team to do it.

===Balance is important ===

If you are convinced that your mod is big enough to warrant a team of people working on it full time then you need to consider how many people capable of each discipline (modelling, coding, skinning etc) you need.  Having multi-skilled team members is extremely useful as they can have areas of overlapping responsibility.

Don't fill your team with modellers when your mod only needs three models.  This applies equally to the other elements of your mod.  In the case of the modellers, one modeller will do most of the work and the other two will get frustrated, fed up, and then leave, because they have nothing to do.  Before they leave though they will be unconciously (or maybe conciously) spreading disastisfaction with the team and mod.  This is bad for morale and will hurt productivity.

Probably the hardest area to accurately recruit for is your coding.  Splitting code up is difficult unless you have a reasonable idea of how everything fits together.  The best approach to use is to recruit a single coder and make them responsible for the overal design and structure of the code.  Only bring in another coder if they can see some easy way to partition the development responsibilities, or, if they start to get swamped.

It's better to have a small team and take longer to finish the mod than it is to have a big team and risk never finishing anything.  As the size of the mod team increases, the amount of time spent communicating within the team increases exponentially.  The more time that is spent in communication, the less time is spent actually doing any work on the mod.

I have seen two teams of 4 people deliver a project in 6 months that a single team of just over 100 couldn't deliver in a year.  So having a large team can be a good way of assuring failure rather than success.  It's more important to have a large team testing the mod than it is a large team building it.

===Make Responsibilities Clear ===

Make sure that everyone in the team knows not only what they are responsible for delivering, but also what everyone else is responsible for as well.  In most cases this split of responsibility is easy to define.  Where this split of responsibility is difficult to define spend some time thinking about it rather than just ignoring the issue.  It will save you some pain later on down the line.  Don't worry if your initial split of work and responsibility seems unbalanced, having one person picking up more work than an another.  Clarity is what is important here.

Review the responsibilities or each team member regularly.  You may find that your original split of work can be further refined to balance the work out between the team members.  You will find that this needs to be done anyway as ''real life'' and other ''unexpected events'' kick in and impact on your project team.

If you can specify internal delivery dates for the components of your mod all the better.  This helps you keep track of where you are up to.  Remember though, any dates specified are simply working values.  They can and will move both forwards and backwards.  Being able to check delivery dates against components can be a good indicator of whether one member of the team is swamped with work, or simply needs a break.

===Know When to Stop ===

At the point the team starts the mod you should have stated clearly and concisely exactly when the mod is finished.  If the mod's final state is left as a vague description then you risk catching &quot;When It's Done&quot; syndrome.  Knowing when the mod is finished is as important as starting it in the first place.  The clearer the specification of the mod the better your position is going to be.

Make sure everyone in the team understands and agrees with what constitutes the finished mod.  The team members will almost certainly want to add features of their own, so be prepared for that.  Just make sure that you agree from the outset which features will make it into the current version.

----

'''TSOShadow:''' I'm not good at writeing so I'll put this in words instead. What if your attempting to start up a dropped mod? (With Permission of course) And old memebers/community think your some nut that will ruin it? How do you get people to trust you that your here to build a new experience on a premade base?</text>
    </revision>
    <revision>
      <id>4541</id>
      <timestamp>2005-12-16T19:40:22Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Building a Team ==

So you have a truly classic idea for a mod, and you've read the [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] and [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] pages so you know how to avoid some of the obvious pitfalls.  You now need a team to help you bring your stunning mod concept to life.

===Do you really need a team ===

The very first thing you must do is challenge the idea that you need a team at all.  Is the mod big enough to warrant building a team to do it?  You might not have all of the skills necessary to bring the mod to life, but, you may not need a full time team to work on it.  You may also be able to acquire the skills you need to create your own mod.  Making small mods with other people is hard.  It's easy to get to a point where the &quot;maintenance of the team&quot; becomes more of a burden than the help the team itself provides.

Consider a weapon mod.

I'm a coder at heart, writing software is where I get my kicks.  In order to do a proper weapon mod I'd need a set of models and skins for the weapon, ammo packs, and bullet effects.  I've never tried modelling anything with a proper 3D package &amp;ndash; I'd much prefer to type the vertice and facet definitions in by hand.  My texturing skills are so poor that they deserve warning stickers.

However, do I really want or need to build a team of modellers and skinners around me before I start my mod?  The answer is not at all.  I'd start by writing the code for the weapon using one of the standard game models.  I might attempt to sketch my idea for the weapon in Corel Draw or Photopaint - or even on paper.  Once I'm at least semi-happy with the code I might start up my favourite (ie. the one I have installed) modelling package and see how far I can get.  Alternatively, I could post on one of the many forums a request for help.  I could then finish off the mod without ever having built a team to do it.

===Balance is important ===

If you are convinced that your mod is big enough to warrant a team of people working on it full time then you need to consider how many people capable of each discipline (modelling, coding, skinning etc) you need.  Having multi-skilled team members is extremely useful as they can have areas of overlapping responsibility.

Don't fill your team with modellers when your mod only needs three models.  This applies equally to the other elements of your mod.  In the case of the modellers, one modeller will do most of the work and the other two will get frustrated, fed up, and then leave, because they have nothing to do.  Before they leave though they will be unconciously (or maybe conciously) spreading disastisfaction with the team and mod.  This is bad for morale and will hurt productivity.

Probably the hardest area to accurately recruit for is your coding.  Splitting code up is difficult unless you have a reasonable idea of how everything fits together.  The best approach to use is to recruit a single coder and make them responsible for the overal design and structure of the code.  Only bring in another coder if they can see some easy way to partition the development responsibilities, or, if they start to get swamped.

It's better to have a small team and take longer to finish the mod than it is to have a big team and risk never finishing anything.  As the size of the mod team increases, the amount of time spent communicating within the team increases exponentially.  The more time that is spent in communication, the less time is spent actually doing any work on the mod.

I have seen two teams of 4 people deliver a project in 6 months that a single team of just over 100 couldn't deliver in a year.  So having a large team can be a good way of assuring failure rather than success.  It's more important to have a large team testing the mod than it is a large team building it.

===Make Responsibilities Clear ===

Make sure that everyone in the team knows not only what they are responsible for delivering, but also what everyone else is responsible for as well.  In most cases this split of responsibility is easy to define.  Where this split of responsibility is difficult to define spend some time thinking about it rather than just ignoring the issue.  It will save you some pain later on down the line.  Don't worry if your initial split of work and responsibility seems unbalanced, having one person picking up more work than an another.  Clarity is what is important here.

Review the responsibilities or each team member regularly.  You may find that your original split of work can be further refined to balance the work out between the team members.  You will find that this needs to be done anyway as ''real life'' and other ''unexpected events'' kick in and impact on your project team.

If you can specify internal delivery dates for the components of your mod all the better.  This helps you keep track of where you are up to.  Remember though, any dates specified are simply working values.  They can and will move both forwards and backwards.  Being able to check delivery dates against components can be a good indicator of whether one member of the team is swamped with work, or simply needs a break.

===Know When to Stop ===

At the point the team starts the mod you should have stated clearly and concisely exactly when the mod is finished.  If the mod's final state is left as a vague description then you risk catching &quot;When It's Done&quot; syndrome.  Knowing when the mod is finished is as important as starting it in the first place.  The clearer the specification of the mod the better your position is going to be.

Make sure everyone in the team understands and agrees with what constitutes the finished mod.  The team members will almost certainly want to add features of their own, so be prepared for that.  Just make sure that you agree from the outset which features will make it into the current version.

==Related Topics==
* [[Legacy:Mod Ideas|Mod Ideas]]

==Discussion==

'''TSOShadow:''' I'm not good at writeing so I'll put this in words instead. What if your attempting to start up a dropped mod? (With Permission of course) And old memebers/community think your some nut that will ruin it? How do you get people to trust you that your here to build a new experience on a premade base?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Despotism Or Communism</title>
    <id>1856</id>
    <revision>
      <id>4556</id>
      <timestamp>2003-04-08T10:16:59Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>created</comment>
      <text xml:space="preserve">==Communism or Despotism ==

Whether or not a mod team needs a leader has been the subject of some fairly heated debate.  This is likely to continue.  So, should mod teams have a &quot;leader&quot; or not?  It depends.

Probably the best way to determine whether a team needs a leader or not is to start without one.  When there is no specified leader in a team of people one will emerge naturally.  It's possible that a group of people will emerge as the team &quot;leader&quot;.  Even in teams that claim to have &quot;no leader&quot; there will be one or two members that are ultimately consulted to resolve disputes.  However, if you feel you really need a declared stance on the matter read on.

===Despotism ===

A team where one single person calls all the shots without any input from the other team members is a true despotism.  Quite often that person will be brilliant at what they do and convinced that they are truly better than all of the low-life incompetants they have within ''their'' team.  This type of person will aim to get the mod released at all costs and (assuming the team lasts that long) will crow about how wonderful they are to all and sundry.

Despotisms only work well when the ''despot'' is capable of implementing the entire mod vision themselves, and can work like a machine to accomplish their goal.  Mod teams with a despot in charge never get bogged down with unresolved issues as decisions are made quickly and finally.  Teams like this do tend to have a higher turnover of members though.

There are watered down versons of the despotism though.  I've taken to calling these benevolent dictatorships.  The &quot;team leader&quot; of a benevolent dictatorship generally feels a sense of responsibility for the mod and the team.  They are happy to make a final decision but will listen to (and actively seek) input from the team members.  Depending on how self effacing the team leader is this sort of team can progress (or should that be regress) to the communist model over time.

The single biggest advantage that a depost team model has over a communist one is that these teams never get bogged down with lots of little unanswered questions and un-made decisions.

===Communism ===

In a communist team all members have equal importance.  All important mod decisions are made collectively.  The underpinning of a communism is that each team member has a deep respect for all of the other members of the team.  If this breaks down then the communism will tend towards a benevolent dictatorship.

Apart from getting bogged down with unanswered questions one of the other problem communisms suffer from is lack of direction.  Although this is related to the unanswered questions problem it is subtly different.  Because every team member has an equal say in the final state of the mod it can suffer from an overwhleming overflow of good ideas that get imlpemented in a haphazard and incoherent way.  A clear design document will resolve this.

Communisms can also suffer from a lack of production.  A communistic team can slip into a pattern of sitting around talking a lot rather than actually producing a mod.

And finally a quote from [[Legacy:Mychaeel|Mychaeel]] taken from the original discussion.

{{innerbox|If you '''need''' a leader, there's no question that you ought to '''have''' one.  There's just no way you can tell that you need one before you have even gathered a team, and of course you would choose your team's members (given that you're the one who tries to create a team for a certain project) not only by their technical skills but also by their teamworking abilities.

Somebody joining a team does well listening to the other team members to find his or her place in the team.  At the same time the other team members must realize that by inviting somebody into their team they also share responsibility for the mod with the new member.  In an environment like a game's modding community people committing their time and skill for a certain project have a right to expect that they're an equitable member of the team they joined.  (Some might not expect that and, in fact, be glad if somebody tells them what to do.  In that case the rest of the team can tell them what needs to be done.)

If some (or almost all) of your team's members don't have enough maturity or teamworking experience to be able to effectively discuss and settle matters of disagreement, somebody has to assume authority to make those decisions.  That authority must be accepted by the rest of the team, and it is hard to sustain that acceptance for anybody being self-absorbed in a &quot;leader&quot; position and/or lacking any actual (technical) skills that are crucial for the mod's success.  Nobody becomes a &quot;leader&quot; by virtue of being called one (or calling him/herself one).  Nobody who ''is'' a leader needs to be called one.  See also [[Legacy:Mod_Authoring/Some_Advice_To_Start_With|Mod_Authoring/Some_Advice_To_Start_With]]:  &quot;Never join a project whose idea man or leader has no obvious development skills.&quot;

}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Distributed Development</title>
    <id>1854</id>
    <revision>
      <id>4551</id>
      <timestamp>2006-04-07T08:04:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">==Making a Distributed Development Team Work ==

It's fair to say that most mods are developed by a single person working on their own, or maybe a couple of people in the same time zone.  When a team is distrubted in both space and time zone the single most important factor for a mod team's success, communication, becomes extremely difficult.

===Talk or Die ===

People communicate most effectively when they are sat in front of each other.  You can talk freely, draw diagrams, and generally make points that would be missed or misinterpreted via another medium (axcept maybe by phone).  I have seen a very long and dull e-mail conversation (about 90 odd messages) over 2 days about a particular problem get resolved in a 10 minute face to face meeting.

When a mod team is distributed face to face meetings are hard, and most likely impossible.  It seems that if you are not sitting next to, or near, a person you are working with it's very easy to forget that they exist.  Once you forget that they are around then you stop communicating.  That's bad.

Isolation is the killer.  It can cause any or all of the following destructive patterns, all of which can be avoided by [[Legacy:Making Mods/Working As A Team|good communication]].
* One thing vital to the success of your mod is that everyone on the team needs to be working towards the same end result.  When the team is separated diverging ideas about what the mod should be can easily creep in.
* Sitting alone building a model or coding up a new weapon it can be very easy to get the feeling that you are the only person doing anything on the mod.  Especially if you've not heard from anyone on the team for a while.
* Lack of feedback is particularly disheartening.  If you want to discourage someone working within the same mod team as yourself then never give them any feedback on the work they do.
* Failing to track progress effectively can be a killer.  It doesn't matter whether you deliver the mod early or late, it's only a game mod, but not knowing how far towards completion team members are can be frustrating and worrying.
* When a team member goes quiet, either by no longer replying to e-mails (or maybe they get bounced), or simply no longer sending out a steady stream of information, it effects everyone on the team.  Perhaps they've quit the team and are too scared to tell anyone.  The could even be working away, quite happy in their own little world, cracking on with the delivery of their bits of the mod.  The fact that you don't know will cause confusion and possibly duplication of effort.  It can also be discouraging for them if they pop up suddenly and say, &quot;Here's that widget we needfor map X.&quot;, and get a response like, &quot;Oh, Dave did that last week, we thought you'd gone.&quot;.

==Little Bits ==

Although communication is the most significant problem facing a distributed development team there are additional challenges that can just as easily cause problems.
* Having more than one developer work on code is hard.  It's vital that you break the code into different parts (modules) that can be developed as separatelt from each other as possible. For example if your mod has new weapons and new gameplay elements, then its not too unreasonable to have one coder work mainly on the weapons part while another coder works on the gameplay (the game type, HUD, mutators, etc).  If you have purely a weapons mod, you could simply assign three to each coder for example.  The tricky part is always the integration of the code after it's been written.
* Code integration is hard.  It's well worth the effort of assigning owners to specific modules and files.  Even though the temptation will be extreme, never change files you don't have checked out (or you don't own).  I guarantee that you will lose code at some point during the mod development when you try and integrate your code with that from the other developer(s) if you do.

* It's well worth taking the &quot;release little and often&quot; approach within the team.  Releasing your code and content to each other as often as you have a stable version of a new feature has a number of benefits.  It provides the team with a sense of progress.  It gives everyone in the team practice as pulling the whole mod together.  It allows for regular internal shake down testing.  It ensures that everyone is working towards the same goal (there should be no suprises in what's delivered).  Don't fall into the trap of releasing code that simply won't run though.  You'll simply hold everyone else on the team up (and they'll hate you for it).
* Every time a member of the team releases some new code, texture, model, or other asset do your very best to grab the release and apply it to the build you are developing against.  This ensures that there are no integration nightmares at the end of the project.  It's not uncommon for things to break when mod assets are integrated.  Frequent integrations keep the amount of pain to a minimum.
* Make sure you have a centrally maintained build script (and build manager if you can manage it) to pull everything together.
* Small teams are better.
* Over all it's much easier to transfer little bits exactly how you want them then it is to transfer the entire mod and find that it is like putting a square in a circle.

If at all possible set up a [[Legacy:Subversion|Subversion]] or [[Legacy:CVS|CVS]] system on a server, so there is always ONE true up-to-date version, and anyone can grab it.  This is worth doing even if the only CVS server you can get hold of runs on one of the team's PCs and is not available 24 hours a day.

:'''Jb:''' One thing that I think works for sharing code is when you can break you code into different parts (modules) that can be developed in part, separate of each other. For example if your mod has new weapons and new gameplay elements, then its not too unreasonable to have one coder work mainly on the weapons part while another coder works on the gameplay part (new game type, HUD, mut, ect). Or if you say have a weapons mod. Here you could split up the weapons an &quot;assign 3 to each coder&quot; for example. Then the tricky part is only have one to bring it all together. Not sure if that fits anywhere... just IMHO that it might work somewhere :)
:'''EntropicLqd:''' Agreed.  I've got a paragraph written up on that at work that I never got time to paste in.  I'll combine yours and mine and drop it in.  Your examples were better I think.  You can just edit the text of the main content if you want though.  I'll update it tomorrow.
:'''EntropicLqd:''' Yours was much better so I kept it, and tacked what remained of my thoughts on the end.

:'''Jb:'''  Nice work EntropicLqd!
:'''EntropicLqd:''' Thanks, but you started it, and that last update was pretty much all yours anyway.
:'''ZedSquared:''' This whole making mods section is fantastic folks! Well done, I'll see if I can add anything worthwhile but I think you've got it all already :-) It might be worth mentioning that for good reliable free cvs services (as well as mailing lists, forums, bug trackers and loads more) it's worth considering hosting your project on sourceforge, the only downside is that your development stage code will be available for anyone to download if they can work CVS. Oh and you have to be releasing your mod under GPL type license too. There are also some good docs on installing wincvs over there. 

'''Lilguy:''' I don't have time to reformat it at the moment, but a lot more has to be said about version management systems like CVS and Subversion. These types of programs are standard in any type of professional development environment with more than a couple developers, and can even be very useful on a personal level. They track changes, and efficiently store ''everything'' that has ever been committed &amp;ndash; so nothing that's been checked in can ever be truly destroyed, unless the cvs server itself gets destroyed. They also are fairly good at merging code changes together, so if two people happen to work on the same code (changing different lines) then there's a pretty good chance that it will be able to merge the changes correctly. So essentially, it deals very effectively with every one of the issues in the &quot;other issues&quot; section. They are used most effectively when everyone who's working on something does an update before starting to work on something, and commits as often as possible (i.e. as soon as the code you're working on compiles and runs)

'''Foogod:''' BTW, I've just added several pages to the Wiki about setting up [[Legacy:Subversion|Subversion]] for Unreal projects.  Comments are welcome.

'''Lilguy:''' Thanks! Subversion rocks, everyone should use it.

'''TSOShadow:''' I like what you all have done here. It really explains communication and file intergration well. Although I think I'll touch up the other issues as I got alittle lost in there...</text>
    </revision>
    <revision>
      <id>4552</id>
      <timestamp>2005-12-16T20:01:25Z</timestamp>
      <contributor>
        <ip>38.116.192.13</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Making a Distributed Development Team Work ==

It's fair to say that most mods are developed by a single person working on their own, or maybe a couple of people in the same time zone.  When a team is distrubted in both space and time zone the single most important factor for a mod team's success, communication, becomes extremely difficult.

===Talk or Die ===

People communicate most effectively when they are sat in front of each other.  You can talk freely, draw diagrams, and generally make points that would be missed or misinterpreted via another medium (axcept maybe by phone).  I have seen a very long and dull e-mail conversation (about 90 odd messages) over 2 days about a particular problem get resolved in a 10 minute face to face meeting.

When a mod team is distributed face to face meetings are hard, and most likely impossible.  It seems that if you are not sitting next to, or near, a person you are working with it's very easy to forget that they exist.  Once you forget that they are around then you stop communicating.  That's bad.

Isolation is the killer.  It can cause any or all of the following destructive patterns, all of which can be avoided by [[Legacy:Making Mods/Working As A Team|good communication]].
* One thing vital to the success of your mod is that everyone on the team needs to be working towards the same end result.  When the team is separated diverging ideas about what the mod should be can easily creep in.
* Sitting alone building a model or coding up a new weapon it can be very easy to get the feeling that you are the only person doing anything on the mod.  Especially if you've not heard from anyone on the team for a while.
* Lack of feedback is particularly disheartening.  If you want to discourage someone working within the same mod team as yourself then never give them any feedback on the work they do.
* Failing to track progress effectively can be a killer.  It doesn't matter whether you deliver the mod early or late, it's only a game mod, but not knowing how far towards completion team members are can be frustrating and worrying.
* When a team member goes quiet, either by no longer replying to e-mails (or maybe they get bounced), or simply no longer sending out a steady stream of information, it effects everyone on the team.  Perhaps they've quit the team and are too scared to tell anyone.  The could even be working away, quite happy in their own little world, cracking on with the delivery of their bits of the mod.  The fact that you don't know will cause confusion and possibly duplication of effort.  It can also be discouraging for them if they pop up suddenly and say, &quot;Here's that widget we needfor map X.&quot;, and get a response like, &quot;Oh, Dave did that last week, we thought you'd gone.&quot;.

==Little Bits ==

Although communication is the most significant problem facing a distributed development team there are additional challenges that can just as easily cause problems.
* Having more than one developer work on code is hard.  It's vital that you break the code into different parts (modules) that can be developed as separatelt from each other as possible. For example if your mod has new weapons and new gameplay elements, then its not too unreasonable to have one coder work mainly on the weapons part while another coder works on the gameplay (the game type, HUD, mutators, etc).  If you have purely a weapons mod, you could simply assign three to each coder for example.  The tricky part is always the integration of the code after it's been written.
* Code integration is hard.  It's well worth the effort of assigning owners to specific modules and files.  Even though the temptation will be extreme, never change files you don't have checked out (or you don't own).  I guarantee that you will lose code at some point during the mod development when you try and integrate your code with that from the other developer(s) if you do.

* It's well worth taking the &quot;release little and often&quot; approach within the team.  Releasing your code and content to each other as often as you have a stable version of a new feature has a number of benefits.  It provides the team with a sense of progress.  It gives everyone in the team practice as pulling the whole mod together.  It allows for regular internal shake down testing.  It ensures that everyone is working towards the same goal (there should be no suprises in what's delivered).  Don't fall into the trap of releasing code that simply won't run though.  You'll simply hold everyone else on the team up (and they'll hate you for it).
* Every time a member of the team releases some new code, texture, model, or other asset do your very best to grab the release and apply it to the build you are developing against.  This ensures that there are no integration nightmares at the end of the project.  It's not uncommon for things to break when mod assets are integrated.  Frequent integrations keep the amount of pain to a minimum.
* Make sure you have a centrally maintained build script (and build manager if you can manage it) to pull everything together.
* Small teams are better.
* Over all it's much easier to transfer little bits exactly how you want them then it is to transfer the entire mod and find that it is like putting a square in a circle.

If at all possible set up a [[Legacy:Subversion|Subversion]] or [[Legacy:CVS|CVS]] system on a server, so there is always ONE true up-to-date version, and anyone can grab it.  This is worth doing even if the only CVS server you can get hold of runs on one of the team's PCs and is not available 24 hours a day.

:'''Jb:''' One thing that I think works for sharing code is when you can break you code into different parts (modules) that can be developed in part, separate of each other. For example if your mod has new weapons and new gameplay elements, then its not too unreasonable to have one coder work mainly on the weapons part while another coder works on the gameplay part (new game type, HUD, mut, ect). Or if you say have a weapons mod. Here you could split up the weapons an &quot;assign 3 to each coder&quot; for example. Then the tricky part is only have one to bring it all together. Not sure if that fits anywhere... just IMHO that it might work somewhere :)
:'''EntropicLqd:''' Agreed.  I've got a paragraph written up on that at work that I never got time to paste in.  I'll combine yours and mine and drop it in.  Your examples were better I think.  You can just edit the text of the main content if you want though.  I'll update it tomorrow.
:'''EntropicLqd:''' Yours was much better so I kept it, and tacked what remained of my thoughts on the end.

:'''Jb:'''  Nice work EntropicLqd!
:'''EntropicLqd:''' Thanks, but you started it, and that last update was pretty much all yours anyway.
:'''ZedSquared:''' This whole making mods section is fantastic folks! Well done, I'll see if I can add anything worthwhile but I think you've got it all already :-) It might be worth mentioning that for good reliable free cvs services (as well as mailing lists, forums, bug trackers and loads more) it's worth considering hosting your project on sourceforge, the only downside is that your development stage code will be available for anyone to download if they can work CVS. Oh and you have to be releasing your mod under GPL type license too. There are also some good docs on installing wincvs over there. 

'''Lilguy:''' I don't have time to reformat it at the moment, but a lot more has to be said about version management systems like CVS and Subversion. These types of programs are standard in any type of professional development environment with more than a couple developers, and can even be very useful on a personal level. They track changes, and efficiently store ''everything'' that has ever been committed &amp;ndash; so nothing that's been checked in can ever be truly destroyed, unless the cvs server itself gets destroyed. They also are fairly good at merging code changes together, so if two people happen to work on the same code (changing different lines) then there's a pretty good chance that it will be able to merge the changes correctly. So essentially, it deals very effectively with every one of the issues in the &quot;other issues&quot; section. They are used most effectively when everyone who's working on something does an update before starting to work on something, and commits as often as possible (i.e. as soon as the code you're working on compiles and runs)

'''Foogod:''' BTW, I've just added several pages to the Wiki about setting up [[Legacy:Subversion|Subversion]] for Unreal projects.  Comments are welcome.

'''Lilguy:''' Thanks! Subversion rocks, everyone should use it.

'''TSOShadow:''' I like what you all have done here. It really explains communication and file intergration well. Although I think I'll touch up the other issues as I got alittle lost in there...</text>
    </revision>
    <revision>
      <id>4553</id>
      <timestamp>2006-04-06T21:06:36Z</timestamp>
      <contributor>
        <ip>CDN-CE-INFLOW-T2-02.inflow.pa.bo.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Making a Distributed Development Team Work ==

It's fair to say that most mods are developed by a single person working on their own, or maybe a couple of people in the same time zone.  When a team is distrubted in both space and time zone the single most important factor for a mod team's success, communication, becomes extremely difficult.

===Talk or Die ===

People communicate most effectively when they are sat in front of each other.  You can talk freely, draw diagrams, and generally make points that would be missed or misinterpreted via another medium (axcept maybe by phone).  I have seen a very long and dull e-mail conversation (about 90 odd messages) over 2 days about a particular problem get resolved in a 10 minute face to face meeting.

When a mod team is distributed face to face meetings are hard, and most likely impossible.  It seems that if you are not sitting next to, or near, a person you are working with it's very easy to forget that they exist.  Once you forget that they are around then you stop communicating.  That's bad.

Isolation is the killer.  It can cause any or all of the following destructive patterns, all of which can be avoided by [[Legacy:Making Mods/Working As A Team|good communication]].
* One thing vital to the success of your mod is that everyone on the team needs to be working towards the same end result.  When the team is separated diverging ideas about what the mod should be can easily creep in.
* Sitting alone building a model or coding up a new weapon it can be very easy to get the feeling that you are the only person doing anything on the mod.  Especially if you've not heard from anyone on the team for a while.
* Lack of feedback is particularly disheartening.  If you want to discourage someone working within the same mod team as yourself then never give them any feedback on the work they do.
* Failing to track progress effectively can be a killer.  It doesn't matter whether you deliver the mod early or late, it's only a game mod, but not knowing how far towards completion team members are can be frustrating and worrying.
* When a team member goes quiet, either by no longer replying to e-mails (or maybe they get bounced), or simply no longer sending out a steady stream of information, it effects everyone on the team.  Perhaps they've quit the team and are too scared to tell anyone.  The could even be working away, quite happy in their own little world, cracking on with the delivery of their bits of the mod.  The fact that you don't know will cause confusion and possibly duplication of effort.  It can also be discouraging for them if they pop up suddenly and say, &quot;Here's that widget we needfor map X.&quot;, and get a response like, &quot;Oh, Dave did that last week, we thought you'd gone.&quot;.

==Little Bits ==

Although communication is the most significant problem facing a distributed development team there are additional challenges that can just as easily cause problems.
* Having more than one developer work on code is hard.  It's vital that you break the code into different parts (modules) that can be developed as separatelt from each other as possible. For example if your mod has new weapons and new gameplay elements, then its not too unreasonable to have one coder work mainly on the weapons part while another coder works on the gameplay (the game type, HUD, mutators, etc).  If you have purely a weapons mod, you could simply assign three to each coder for example.  The tricky part is always the integration of the code after it's been written.
* Code integration is hard.  It's well worth the effort of assigning owners to specific modules and files.  Even though the temptation will be extreme, never change files you don't have checked out (or you don't own).  I guarantee that you will lose code at some point during the mod development when you try and integrate your code with that from the other developer(s) if you do.

* It's well worth taking the &quot;release little and often&quot; approach within the team.  Releasing your code and content to each other as often as you have a stable version of a new feature has a number of benefits.  It provides the team with a sense of progress.  It gives everyone in the team practice as pulling the whole mod together.  It allows for regular internal shake down testing.  It ensures that everyone is working towards the same goal (there should be no suprises in what's delivered).  Don't fall into the trap of releasing code that simply won't run though.  You'll simply hold everyone else on the team up (and they'll hate you for it).
* Every time a member of the team releases some new code, texture, model, or other asset do your very best to grab the release and apply it to the build you are developing against.  This ensures that there are no integration nightmares at the end of the project.  It's not uncommon for things to break when mod assets are integrated.  Frequent integrations keep the amount of pain to a minimum.
* Make sure you have a centrally maintained build script (and build manager if you can manage it) to pull everything together.
* Small teams are better.
* Over all it's much easier to transfer little bits exactly how you want them then it is to transfer the entire mod and find that it is like putting a square in a circle.

If at all possible set up a [[Legacy:Subversion|Subversion]] or [[Legacy:CVS|CVS]] system on a server, so there is always ONE true up-to-date version, and anyone can grab it.  This is worth doing even if the only CVS server you can get hold of runs on one of the team's PCs and is not available 24 hours a day.

:'''Jb:''' One thing that I think works for sharing code is when you can break you code into different parts (modules) that can be developed in part, separate of each other. For example if your mod has new weapons and new gameplay elements, then its not too unreasonable to have one coder work mainly on the weapons part while another coder works on the gameplay part (new game type, HUD, mut, ect). Or if you say have a weapons mod. Here you could split up the weapons an &quot;assign 3 to each coder&quot; for example. Then the tricky part is only have one to bring it all together. Not sure if that fits anywhere... just IMHO that it might work somewhere :)
:'''EntropicLqd:''' Agreed.  I've got a paragraph written up on that at work that I never got time to paste in.  I'll combine yours and mine and drop it in.  Your examples were better I think.  You can just edit the text of the main content if you want though.  I'll update it tomorrow.
:'''EntropicLqd:''' Yours was much better so I kept it, and tacked what remained of my thoughts on the end.

:'''Jb:'''  Nice work EntropicLqd!
:'''EntropicLqd:''' Thanks, but you started it, and that last update was pretty much all yours anyway.
:'''ZedSquared:''' This whole making mods section is fantastic folks! Well done, I'll see if I can add anything worthwhile but I think you've got it all already :-) It might be worth mentioning that for good reliable free cvs services (as well as mailing lists, forums, bug trackers and loads more) it's worth considering hosting your project on sourceforge, the only downside is that your development stage code will be available for anyone to download if they can work CVS. Oh and you have to be releasing your mod under GPL type license too. There are also some good docs on installing wincvs over there. 

'''Lilguy:''' I don't have time to reformat it at the moment, but a lot more has to be said about version management systems like CVS and Subversion. These types of programs are standard in any type of professional development environment with more than a couple developers, and can even be very useful on a personal level. They track changes, and efficiently store ''everything'' that has ever been committed &amp;ndash; so nothing that's been checked in can ever be truly destroyed, unless the cvs server itself gets destroyed. They also are fairly good at merging code changes together, so if two people happen to work on the same code (changing different lines) then there's a pretty good chance that it will be able to merge the changes correctly. So essentially, it deals very effectively with every one of the issues in the &quot;other issues&quot; section. They are used most effectively when everyone who's working on something does an update before starting to work on something, and commits as often as possible (i.e. as soon as the code you're working on compiles and runs)

'''Foogod:''' BTW, I've just added several pages to the Wiki about setting up [[Legacy:Subversion|Subversion]] for Unreal projects.  Comments are welcome.

'''Lilguy:''' Thanks! Subversion rocks, everyone should use it.

'''TSOShadow:''' I like what you all have done here. It really explains communication and file intergration well. Although I think I'll touch up the other issues as I got alittle lost in there...

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Effective Testing</title>
    <id>1848</id>
    <revision>
      <id>4536</id>
      <timestamp>2005-12-05T03:14:22Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Effective Testing ==

===Some Possible Scenarios ===

If either of the following scenarios strike a chord then this page should hopefully help you to fix the problem.  Although, it's probable that you should be contributing to this page rather than reading it.

====The developer ====

So, time has passed and people are interested in playing your mod.  You've finished, or at the very least finalised all of the features in the first version of your mod, and it's ready for release.  You upload it onto your mod web site with pleasure.  Maybe you even dance around the room a little while it's uploading.  In a few minutes people will be able to view all of your hard work and tell you how much it rocks.

The reality turns out to be most unpleasant.  Your in-box is swamped with e-mails complaining about bugs, balance, and calls for support and changes to be made.  All you can do is read in disbelief as all of your hard work is slated, shredded, and generally jumped on by hoards of ungrateful screaming barbarians.

Maybe you should have got some other people to look at your mod.  Maybe you did, but their testing wasn't effective enough.

====The tester ====

Wow, cool, you've been accepted as a beta tester on your favourite mod.  You've been anticipating this one for a while and you're really excited that you'll get the chance to play it before anyone else.  And give feedback.  You install the mod, fire it up, and it fails to even start.  &quot;What sort of crappy half-arsed mod is this?&quot;, you cry before you remember it's a beta - which means it doesn't work.  After some to-ing and fro-ing between yourself and the developer you eventually get the mod up and running and you start to test it.

While playing with the new hand held automatic limb dismember device you realise that the gun has stopped firing.  It's obviously a bug.  You send in your bug report to the developer: ''The gun stopped firing.''.  If you had a patient developer you might have got a request for more information.  You may even have been removed from the beta-test team without any adequate explanation as to why.

===What went wrong ===

In the developer's case, he simply hadn't put enough time or effort (if any) into testing his mod so it crashed and burned on release.  In the tester's case, the bug report submitted contained almost no useful information.  The feedback provided to the developer was almost useless in helping the developer find the problem.

==Why do I need to test my mod ==

If you write perfect code all the time that always works first time, in the manner you expected, every single time then you can stop reading.  The odds are however that every now and then small errors creep into your code.  These may be simple typing errors, or they could be non-obvious logical flaws in the structure of your code.  Remember, just because your code compiles doesn’t mean it will work in the way that you intended.  Consider the code below.

&lt;uscript&gt;
for (I=0;I&lt;10;I++);
  DoSomethingTenTimes();
&lt;/uscript&gt;

&lt;uscript&gt;
for (I=0;I&lt;10;I++)
  DoSomethingTenTimes();
&lt;/uscript&gt;

Neither statement will produce a compiler error, but only the second one will actually perform the required operations.

Once you accept the fact that you cannot and will not write completely perfect code all of the time then it’s obvious that you need some way of finding the errors in the code.  This process is called testing.  The aim of the game is to put your code through the wringer, and hopefully find any problems before anyone else does.

==How To Test A Mod ==

===Doing it right ===

Testing a mod effectively is hard.  Very hard.  The testing process takes up a lot of time, and can also be a very tedious job.  There are two types of testing.
* Shake down testing &amp;ndash; The easiest and lightest form of testing.  If your mod is complex then this should be avoided.
* Full testing &amp;ndash; The only real way of ensuring your mod gets released with the minimum number of bugs.

The type of testing you choose to use will be influenced by the size and complexity of the mod.  It will also have a big impact on the final quality of your mod.  Shake down testing is great for small map components and simple mutators.  Anything more complex than that and you should seriously consider using a full test approach.  Otherwise you risk releasing a buggy pile of pap to the general public.

===Shake down testing ===

This is the lightest form of testing.  Anyone can start a mod up run around a bit, do some &quot;stuff&quot;, and generally &quot;have a look&quot; for problems.  This is the type of testing that most developers do.  They start up their mod, check out the last thing they changed, and determine whether they are happy or not.  They don’t bother checking to see if the change they just made broke something else.  If they are sensible, the mod they are testing is sufficiently simple that there isn’t anything else to break.

If this testing technique is used then you should either not bother with a testing team at all, or, make your testing team as large as you possibly can.

If the mod is complex, then this type of testing can be more harmful than useful as it allows the developer to build up a false sense of security in the quality of their mod.  This type of testing should not be used for complex mods.

===Full testing ===

This type of testing is time consuming, laborious, and quite often dull.  It is however, the most effective way or systematically removing problems and bugs from your mod.

Before you even start your mod for the first time, or while you are writing the code for it, create a list of things that could possibly go wrong.  The list of things that may go wrong should be phrased as much as possible as questions that can be answered yes or no.  This speeds the testing slightly as the tests become a simple tick list.

Rather than attempt to describe in detail how to come up with the list, here is an example taken from the list I’m building up for my single flag CTF mod.  It’s only a small subset of a rather scary looking list.
* When the game starts are both Flag Bases on the map visible?
* Is there only one flag on the map?
* Is the HUD showing that nether team has the flag and that it’s dropped soemwhere?
* Is the flag picked up when touched?
* Is the flag displayed properly when held (can I see myself carrying it in behind view)?
* Is the flag respawned somewhere on the map if I fall into a pain zone?
* Is the flag dropped if I use the teleporter?

Once you have your list of tests written out, you need to use it.  Every time you do a build that could be a viable release you should run through all of your tests ticking each one off as you see the expected behaviour.  If you get some unexpected behaviour then either your test is wrong, or, you have found a bug.

Once you have finished all of your test conditions it’s well worth entering a period of Shake down testing to try out new and strange things that &quot;people would never do in real life&quot;.  Every time you find a problem that isn’t covered by your existing test list add it.  By adding tests to your initial list you are ensuring that a particular problem does not reoccur once removed.

===Group testing ===

If the mod is a reasonable size then it’s worth trying to find some testers to help you.  As the complexity of the mod increases the number of tests that need to be done grows hugely as the number of components that can be interacted with, and the number of combinations of components that can be interacted grows. The following are some points to consider when you have a group of testers

* First thing you might want to think about is have one central point for bugs to be reported and/or documented (message board?). It does you no good if you have to wade through 30 reports of the same bug. You could expand on this to have someone lead or take charge of this part of the team. Having one source to keep track of the bugs and what has been or has not been fixed allows for the other members to have more time to fix the said bugs.

* Delegate and/or assign certain parts of the mod testing to certain people. For example give a certain group of people (or a single person) an area they should look at for bugs and give another group a different area. For example have one group that looks at the weapons while the other group looks at the game play aspect of the mod. This allows for an efficient way to get more coverage and testing as well as it being a more effective way to user your resources. Your testers will also like is as they wont have to spend as much time testing/bug hunting. Some overlapping is a good idea but try to keep that to a minimum. If you did elect one member of the team to handle to be the central point for bug testing this then its should be their job to do the delegating.

* Get confirmation from another member when a bug is reported. Sometimes one of your users could have accidentally corrupted a core file that will cause a bug to appear when it is more of a configuration issue on that users PC. For example say if they accidentally loaded a older version of a .u file and get some type of &quot;weird results&quot;. 

* Make sure you have a reliable group. Having a group that does not test their assign areas will not help you at all. Make sure you find people that can dedicated the time that it is needed when your ready for testing. Nothing is more aggravating then posting an update and not seeing any feedback on it. If its at all possible you can try to have a set date for updates. This helps as then your beta testers will know when an update is out and when they need to reserve time for testing.

===Don't forget about the network testing ===

One of the things that it's easy to forget, especially if it's a small mod, is to test your mod thoroughly over a network, preferably against a dedicated server.  Network replication is one of the biggest pit fall a coder will have to face. Just because things work fine in a practice match does not mean that they will work in an on-line game. Usually they won't work in on-line games unless the coder has dealt with replication in their past work. The larger the mod the more chances for replication issues to crop up and usually these are the harder bugs to fix. You also can test what happens to your mod on dynamic conditions or when players leave under catastrophic circumstances (drop the network). For example what happens to the flag if the flag carrier leaves? Or what happens to your remote controlled weapon if the owner leaves?  You can also check the network use of your mod as well. Finally don't forget to look at the log from the server when testing your mod with a dedicated server.

==Reporting Faults ==

Finding a problem is not useful in itself.  The developer is still unaware that the problem exists.  How you communicate that problem to the developer is crucial to avoid wasting your time and his.

If you have a tick list of tests, and one of them failed then reporting the problem is easy.  You can tell the developer which test failed, and supply him with your log file.  Because the developer has an exact duplicate of your list he can see everything you did up to the point your problem occurred. By providing him with your log file he may be able to tell directly from the log what went wrong.

If this is a brand new test then the first thing you should so is update your tick list of tests.  Then send the following information on to the developer.
* The exact details of the problem.
* What you did prior to the problem manifesting itself.
* What you were trying to do.
* What objects you had in your inventory &amp;ndash; and your &quot;player state&quot;.

The more detail you can supply to the developer about the bug the better.  If you are testing a map then send some screenshots of the problem or feature that caused you the problem.

Always remember to send your log file along with your bug report.  The log file is one of the most valuable tools the developer has when it comes to resolving problems.

Don’t be surprised (or offended) if the developer comes back with some more questions about your fault.  They may not have been able to reproduce it, or, they might want additional clarification about the exact manifestation of the problem.  If you can identify a problem with the way in which bugs are reported then change the way you (and the team) report bugs.

If you have a team of testers, consider using a standard format for error reporting across the whole team.  That way new testers will get up to speed faster, and developers can find the information they are looking for easier.

==Some common pitfalls ==
;The change is only one line it can't possibly be wrong. : Those tiny one line fixes to your code will quite often cause you far more pain than a complete change to the class hierarchy.  The reason for this is that the one-line code change doesn’t get the same level of consideration as a complete class hierarchy change.  It’s very easy to fall into the trap of, &quot;It’s only one line it won’t break anything and it will fix my problem.&quot;.

; Changing code at the point of release. : If you ever change some code prior to building your release, and then fail to test it, your release will have bugs.  In the best case you will have introduced a new bug (assuming the one you were trying to fix was fixed by your last minute change).  At worst you will have completely broken your mod and it will no longer work.

; Publishing an unattainable release date. : As a developer you are always optimistic about how much bug free code you can write in a given amount of time.  Publishing a release date for your mod based upon your expectations of when the mod will be finished will out you and your team under extreme pressure.  Have you allowed time for testing and bug fixing in your date?  Do you have any spare time (contingency) added to cater for interruptions from real life? Bad things happen when release dates are missed.  The developer and testers may get discouraged.  People will start to lose interest in the mod and accuse it of being vapourware.  Your team may get flamed to a crisp for not delivering on your published release date.  Your &quot;consumers&quot; won’t care that your PC caught fire, or that a builder has severed your Internet connection so you couldn’t do anything.  All they will see is that you failed to deliver, when you said you were going to.

==Related Topics==
* [[Legacy:A Bug'S Life|A Bug's Life]] &amp;ndash; hints on how to write a useful bug report
* [[Legacy:Debugging Techniques|Debugging Techniques]] &amp;ndash; useful techniques for finding and eliminating bugs
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your mod

[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4537</id>
      <timestamp>2003-06-15T13:55:19Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Effective Testing ==

===Some Possible Scenarios ===

If either of the following scenarios strike a chord then this page should hopefully help you to fix the problem.  Although, it's probable that you should be contributing to this page rather than reading it.

====The developer ====

So, time has passed and people are interested in playing your mod.  You've finished, or at the very least finalised all of the features in the first version of your mod, and it's ready for release.  You upload it onto your mod web site with pleasure.  Maybe you even dance around the room a little while it's uploading.  In a few minutes people will be able to view all of your hard work and tell you how much it rocks.

The reality turns out to be most unpleasant.  Your in-box is swamped with e-mails complaining about bugs, balance, and calls for support and changes to be made.  All you can do is read in disbelief as all of your hard work is slated, shredded, and generally jumped on by hoards of ungrateful screaming barbarians.

Maybe you should have got some other people to look at your mod.  Maybe you did, but their testing wasn't effective enough.

====The tester ====

Wow, cool, you've been accepted as a beta tester on your favourite mod.  You've been anticipating this one for a while and you're really excited that you'll get the chance to play it before anyone else.  And give feedback.  You install the mod, fire it up, and it fails to even start.  &quot;What sort of crappy half-arsed mod is this?&quot;, you cry before you remember it's a beta - which means it doesn't work.  After some to-ing and fro-ing between yourself and the developer you eventually get the mod up and running and you start to test it.

While playing with the new hand held automatic limb dismember device you realise that the gun has stopped firing.  It's obviously a bug.  You send in your bug report to the developer: ''The gun stopped firing.''.  If you had a patient developer you might have got a request for more information.  You may even have been removed from the beta-test team without any adequate explanation as to why.

===What went wrong ===

In the developer's case, he simply hadn't put enough time or effort (if any) into testing his mod so it crashed and burned on release.  In the tester's case, the bug report submitted contained almost no useful information.  The feedback provided to the developer was almost useless in helping the developer find the problem.

==Why do I need to test my mod ==

If you write perfect code all the time that always works first time, in the manner you expected, every single time then you can stop reading.  The odds are however that every now and then small errors creep into your code.  These may be simple typing errors, or they could be non-obvious logical flaws in the structure of your code.  Remember, just because your code compiles doesn’t mean it will work in the way that you intended.  Consider the code below.

&lt;uscript&gt;
for (I=0;I&lt;10;I++);
  DoSomethingTenTimes();
&lt;/uscript&gt;

&lt;uscript&gt;
for (I=0;I&lt;10;I++)
  DoSomethingTenTimes();
&lt;/uscript&gt;

Neither statement will produce a compiler error, but only the second one will actually perform the required operations.

Once you accept the fact that you cannot and will not write completely perfect code all of the time then it’s obvious that you need some way of finding the errors in the code.  This process is called testing.  The aim of the game is to put your code through the wringer, and hopefully find any problems before anyone else does.

==How To Test A Mod ==

===Doing it right ===

Testing a mod effectively is hard.  Very hard.  The testing process takes up a lot of time, and can also be a very tedious job.  There are two types of testing.
* Shake down testing &amp;ndash; The easiest and lightest form of testing.  If your mod is complex then this should be avoided.
* Full testing &amp;ndash; The only real way of ensuring your mod gets released with the minimum number of bugs.

The type of testing you choose to use will be influenced by the size and complexity of the mod.  It will also have a big impact on the final quality of your mod.  Shake down testing is great for small map components and simple mutators.  Anything more complex than that and you should seriously consider using a full test approach.  Otherwise you risk releasing a buggy pile of pap to the general public.

===Shake down testing ===

This is the lightest form of testing.  Anyone can start a mod up run around a bit, do some &quot;stuff&quot;, and generally &quot;have a look&quot; for problems.  This is the type of testing that most developers do.  They start up their mod, check out the last thing they changed, and determine whether they are happy or not.  They don’t bother checking to see if the change they just made broke something else.  If they are sensible, the mod they are testing is sufficiently simple that there isn’t anything else to break.

If this testing technique is used then you should either not bother with a testing team at all, or, make your testing team as large as you possibly can.

If the mod is complex, then this type of testing can be more harmful than useful as it allows the developer to build up a false sense of security in the quality of their mod.  This type of testing should not be used for complex mods.

===Full testing ===

This type of testing is time consuming, laborious, and quite often dull.  It is however, the most effective way or systematically removing problems and bugs from your mod.

Before you even start your mod for the first time, or while you are writing the code for it, create a list of things that could possibly go wrong.  The list of things that may go wrong should be phrased as much as possible as questions that can be answered yes or no.  This speeds the testing slightly as the tests become a simple tick list.

Rather than attempt to describe in detail how to come up with the list, here is an example taken from the list I’m building up for my single flag CTF mod.  It’s only a small subset of a rather scary looking list.
* When the game starts are both Flag Bases on the map visible?
* Is there only one flag on the map?
* Is the HUD showing that nether team has the flag and that it’s dropped soemwhere?
* Is the flag picked up when touched?
* Is the flag displayed properly when held (can I see myself carrying it in behind view)?
* Is the flag respawned somewhere on the map if I fall into a pain zone?
* Is the flag dropped if I use the teleporter?

Once you have your list of tests written out, you need to use it.  Every time you do a build that could be a viable release you should run through all of your tests ticking each one off as you see the expected behaviour.  If you get some unexpected behaviour then either your test is wrong, or, you have found a bug.

Once you have finished all of your test conditions it’s well worth entering a period of Shake down testing to try out new and strange things that &quot;people would never do in real life&quot;.  Every time you find a problem that isn’t covered by your existing test list add it.  By adding tests to your initial list you are ensuring that a particular problem does not reoccur once removed.

===Group testing ===

If the mod is a reasonable size then it’s worth trying to find some testers to help you.  As the complexity of the mod increases the number of tests that need to be done grows hugely as the number of components that can be interacted with, and the number of combinations of components that can be interacted grows. The following are some points to consider when you have a group of testers

* First thing you might want to think about is have one central point for bugs to be reported and/or documented (message board?). It does you no good if you have to wade through 30 reports of the same bug. You could expand on this to have someone lead or take charge of this part of the team. Having one source to keep track of the bugs and what has been or has not been fixed allows for the other members to have more time to fix the said bugs.

* Delegate and/or assign certain parts of the mod testing to certain people. For example give a certain group of people (or a single person) an area they should look at for bugs and give another group a different area. For example have one group that looks at the weapons while the other group looks at the game play aspect of the mod. This allows for an efficient way to get more coverage and testing as well as it being a more effective way to user your resources. Your testers will also like is as they wont have to spend as much time testing/bug hunting. Some overlapping is a good idea but try to keep that to a minimum. If you did elect one member of the team to handle to be the central point for bug testing this then its should be their job to do the delegating.

* Get confirmation from another member when a bug is reported. Sometimes one of your users could have accidentally corrupted a core file that will cause a bug to appear when it is more of a configuration issue on that users PC. For example say if they accidentally loaded a older version of a .u file and get some type of &quot;weird results&quot;. 

* Make sure you have a reliable group. Having a group that does not test their assign areas will not help you at all. Make sure you find people that can dedicated the time that it is needed when your ready for testing. Nothing is more aggravating then posting an update and not seeing any feedback on it. If its at all possible you can try to have a set date for updates. This helps as then your beta testers will know when an update is out and when they need to reserve time for testing.

===Don't forget about the network testing ===

One of the things that it's easy to forget, especially if it's a small mod, is to test your mod thoroughly over a network, preferably against a dedicated server.  Network replication is one of the biggest pit fall a coder will have to face. Just because things work fine in a practice match does not mean that they will work in an on-line game. Usually they won't work in on-line games unless the coder has dealt with replication in their past work. The larger the mod the more chances for replication issues to crop up and usually these are the harder bugs to fix. You also can test what happens to your mod on dynamic conditions or when players leave under catastrophic circumstances (drop the network). For example what happens to the flag if the flag carrier leaves? Or what happens to your remote controlled weapon if the owner leaves?  You can also check the network use of your mod as well. Finally don't forget to look at the log from the server when testing your mod with a dedicated server.

==Reporting Faults ==

Finding a problem is not useful in itself.  The developer is still unaware that the problem exists.  How you communicate that problem to the developer is crucial to avoid wasting your time and his.

If you have a tick list of tests, and one of them failed then reporting the problem is easy.  You can tell the developer which test failed, and supply him with your log file.  Because the developer has an exact duplicate of your list he can see everything you did up to the point your problem occurred. By providing him with your log file he may be able to tell directly from the log what went wrong.

If this is a brand new test then the first thing you should so is update your tick list of tests.  Then send the following information on to the developer.
* The exact details of the problem.
* What you did prior to the problem manifesting itself.
* What you were trying to do.
* What objects you had in your inventory &amp;ndash; and your &quot;player state&quot;.

The more detail you can supply to the developer about the bug the better.  If you are testing a map then send some screenshots of the problem or feature that caused you the problem.

Always remember to send your log file along with your bug report.  The log file is one of the most valuable tools the developer has when it comes to resolving problems.

Don’t be surprised (or offended) if the developer comes back with some more questions about your fault.  They may not have been able to reproduce it, or, they might want additional clarification about the exact manifestation of the problem.  If you can identify a problem with the way in which bugs are reported then change the way you (and the team) report bugs.

If you have a team of testers, consider using a standard format for error reporting across the whole team.  That way new testers will get up to speed faster, and developers can find the information they are looking for easier.

==Some common pitfalls ==
;The change is only one line it can't possibly be wrong. : Those tiny one line fixes to your code will quite often cause you far more pain than a complete change to the class hierarchy.  The reason for this is that the one-line code change doesn’t get the same level of consideration as a complete class hierarchy change.  It’s very easy to fall into the trap of, &quot;It’s only one line it won’t break anything and it will fix my problem.&quot;.

; Changing code at the point of release. : If you ever change some code prior to building your release, and then fail to test it, your release will have bugs.  In the best case you will have introduced a new bug (assuming the one you were trying to fix was fixed by your last minute change).  At worst you will have completely broken your mod and it will no longer work.

; Publishing an unattainable release date. : As a developer you are always optimistic about how much bug free code you can write in a given amount of time.  Publishing a release date for your mod based upon your expectations of when the mod will be finished will out you and your team under extreme pressure.  Have you allowed time for testing and bug fixing in your date?  Do you have any spare time (contingency) added to cater for interruptions from real life? Bad things happen when release dates are missed.  The developer and testers may get discouraged.  People will start to lose interest in the mod and accuse it of being vapourware.  Your team may get flamed to a crisp for not delivering on your published release date.  Your &quot;consumers&quot; won’t care that your PC caught fire, or that a builder has severed your Internet connection so you couldn’t do anything.  All they will see is that you failed to deliver, when you said you were going to.

==Related Topics==
* [[Legacy:A Bug'S Life|A Bug's Life]] &amp;ndash; hints on how to write a useful bug report
* [[Legacy:Debugging Techniques|Debugging Techniques]] &amp;ndash; useful techniques for finding and eliminating bugs</text>
    </revision>
    <revision>
      <id>4538</id>
      <timestamp>2004-07-31T10:08:22Z</timestamp>
      <contributor>
        <ip>C-67-181-53-12.client.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Effective Testing ==

===Some Possible Scenarios ===

If either of the following scenarios strike a chord then this page should hopefully help you to fix the problem.  Although, it's probable that you should be contributing to this page rather than reading it.

====The developer ====

So, time has passed and people are interested in playing your mod.  You've finished, or at the very least finalised all of the features in the first version of your mod, and it's ready for release.  You upload it onto your mod web site with pleasure.  Maybe you even dance around the room a little while it's uploading.  In a few minutes people will be able to view all of your hard work and tell you how much it rocks.

The reality turns out to be most unpleasant.  Your in-box is swamped with e-mails complaining about bugs, balance, and calls for support and changes to be made.  All you can do is read in disbelief as all of your hard work is slated, shredded, and generally jumped on by hoards of ungrateful screaming barbarians.

Maybe you should have got some other people to look at your mod.  Maybe you did, but their testing wasn't effective enough.

====The tester ====

Wow, cool, you've been accepted as a beta tester on your favourite mod.  You've been anticipating this one for a while and you're really excited that you'll get the chance to play it before anyone else.  And give feedback.  You install the mod, fire it up, and it fails to even start.  &quot;What sort of crappy half-arsed mod is this?&quot;, you cry before you remember it's a beta - which means it doesn't work.  After some to-ing and fro-ing between yourself and the developer you eventually get the mod up and running and you start to test it.

While playing with the new hand held automatic limb dismember device you realise that the gun has stopped firing.  It's obviously a bug.  You send in your bug report to the developer: ''The gun stopped firing.''.  If you had a patient developer you might have got a request for more information.  You may even have been removed from the beta-test team without any adequate explanation as to why.

===What went wrong ===

In the developer's case, he simply hadn't put enough time or effort (if any) into testing his mod so it crashed and burned on release.  In the tester's case, the bug report submitted contained almost no useful information.  The feedback provided to the developer was almost useless in helping the developer find the problem.

==Why do I need to test my mod ==

If you write perfect code all the time that always works first time, in the manner you expected, every single time then you can stop reading.  The odds are however that every now and then small errors creep into your code.  These may be simple typing errors, or they could be non-obvious logical flaws in the structure of your code.  Remember, just because your code compiles doesn’t mean it will work in the way that you intended.  Consider the code below.

&lt;uscript&gt;
for (I=0;I&lt;10;I++);
  DoSomethingTenTimes();
&lt;/uscript&gt;

&lt;uscript&gt;
for (I=0;I&lt;10;I++)
  DoSomethingTenTimes();
&lt;/uscript&gt;

Neither statement will produce a compiler error, but only the second one will actually perform the required operations.

Once you accept the fact that you cannot and will not write completely perfect code all of the time then it’s obvious that you need some way of finding the errors in the code.  This process is called testing.  The aim of the game is to put your code through the wringer, and hopefully find any problems before anyone else does.

==How To Test A Mod ==

===Doing it right ===

Testing a mod effectively is hard.  Very hard.  The testing process takes up a lot of time, and can also be a very tedious job.  There are two types of testing.
* Shake down testing &amp;ndash; The easiest and lightest form of testing.  If your mod is complex then this should be avoided.
* Full testing &amp;ndash; The only real way of ensuring your mod gets released with the minimum number of bugs.

The type of testing you choose to use will be influenced by the size and complexity of the mod.  It will also have a big impact on the final quality of your mod.  Shake down testing is great for small map components and simple mutators.  Anything more complex than that and you should seriously consider using a full test approach.  Otherwise you risk releasing a buggy pile of pap to the general public.

===Shake down testing ===

This is the lightest form of testing.  Anyone can start a mod up run around a bit, do some &quot;stuff&quot;, and generally &quot;have a look&quot; for problems.  This is the type of testing that most developers do.  They start up their mod, check out the last thing they changed, and determine whether they are happy or not.  They don’t bother checking to see if the change they just made broke something else.  If they are sensible, the mod they are testing is sufficiently simple that there isn’t anything else to break.

If this testing technique is used then you should either not bother with a testing team at all, or, make your testing team as large as you possibly can.

If the mod is complex, then this type of testing can be more harmful than useful as it allows the developer to build up a false sense of security in the quality of their mod.  This type of testing should not be used for complex mods.

===Full testing ===

This type of testing is time consuming, laborious, and quite often dull.  It is however, the most effective way or systematically removing problems and bugs from your mod.

Before you even start your mod for the first time, or while you are writing the code for it, create a list of things that could possibly go wrong.  The list of things that may go wrong should be phrased as much as possible as questions that can be answered yes or no.  This speeds the testing slightly as the tests become a simple tick list.

Rather than attempt to describe in detail how to come up with the list, here is an example taken from the list I’m building up for my single flag CTF mod.  It’s only a small subset of a rather scary looking list.
* When the game starts are both Flag Bases on the map visible?
* Is there only one flag on the map?
* Is the HUD showing that nether team has the flag and that it’s dropped soemwhere?
* Is the flag picked up when touched?
* Is the flag displayed properly when held (can I see myself carrying it in behind view)?
* Is the flag respawned somewhere on the map if I fall into a pain zone?
* Is the flag dropped if I use the teleporter?

Once you have your list of tests written out, you need to use it.  Every time you do a build that could be a viable release you should run through all of your tests ticking each one off as you see the expected behaviour.  If you get some unexpected behaviour then either your test is wrong, or, you have found a bug.

Once you have finished all of your test conditions it’s well worth entering a period of Shake down testing to try out new and strange things that &quot;people would never do in real life&quot;.  Every time you find a problem that isn’t covered by your existing test list add it.  By adding tests to your initial list you are ensuring that a particular problem does not reoccur once removed.

===Group testing ===

If the mod is a reasonable size then it’s worth trying to find some testers to help you.  As the complexity of the mod increases the number of tests that need to be done grows hugely as the number of components that can be interacted with, and the number of combinations of components that can be interacted grows. The following are some points to consider when you have a group of testers

* First thing you might want to think about is have one central point for bugs to be reported and/or documented (message board?). It does you no good if you have to wade through 30 reports of the same bug. You could expand on this to have someone lead or take charge of this part of the team. Having one source to keep track of the bugs and what has been or has not been fixed allows for the other members to have more time to fix the said bugs.

* Delegate and/or assign certain parts of the mod testing to certain people. For example give a certain group of people (or a single person) an area they should look at for bugs and give another group a different area. For example have one group that looks at the weapons while the other group looks at the game play aspect of the mod. This allows for an efficient way to get more coverage and testing as well as it being a more effective way to user your resources. Your testers will also like is as they wont have to spend as much time testing/bug hunting. Some overlapping is a good idea but try to keep that to a minimum. If you did elect one member of the team to handle to be the central point for bug testing this then its should be their job to do the delegating.

* Get confirmation from another member when a bug is reported. Sometimes one of your users could have accidentally corrupted a core file that will cause a bug to appear when it is more of a configuration issue on that users PC. For example say if they accidentally loaded a older version of a .u file and get some type of &quot;weird results&quot;. 

* Make sure you have a reliable group. Having a group that does not test their assign areas will not help you at all. Make sure you find people that can dedicated the time that it is needed when your ready for testing. Nothing is more aggravating then posting an update and not seeing any feedback on it. If its at all possible you can try to have a set date for updates. This helps as then your beta testers will know when an update is out and when they need to reserve time for testing.

===Don't forget about the network testing ===

One of the things that it's easy to forget, especially if it's a small mod, is to test your mod thoroughly over a network, preferably against a dedicated server.  Network replication is one of the biggest pit fall a coder will have to face. Just because things work fine in a practice match does not mean that they will work in an on-line game. Usually they won't work in on-line games unless the coder has dealt with replication in their past work. The larger the mod the more chances for replication issues to crop up and usually these are the harder bugs to fix. You also can test what happens to your mod on dynamic conditions or when players leave under catastrophic circumstances (drop the network). For example what happens to the flag if the flag carrier leaves? Or what happens to your remote controlled weapon if the owner leaves?  You can also check the network use of your mod as well. Finally don't forget to look at the log from the server when testing your mod with a dedicated server.

==Reporting Faults ==

Finding a problem is not useful in itself.  The developer is still unaware that the problem exists.  How you communicate that problem to the developer is crucial to avoid wasting your time and his.

If you have a tick list of tests, and one of them failed then reporting the problem is easy.  You can tell the developer which test failed, and supply him with your log file.  Because the developer has an exact duplicate of your list he can see everything you did up to the point your problem occurred. By providing him with your log file he may be able to tell directly from the log what went wrong.

If this is a brand new test then the first thing you should so is update your tick list of tests.  Then send the following information on to the developer.
* The exact details of the problem.
* What you did prior to the problem manifesting itself.
* What you were trying to do.
* What objects you had in your inventory &amp;ndash; and your &quot;player state&quot;.

The more detail you can supply to the developer about the bug the better.  If you are testing a map then send some screenshots of the problem or feature that caused you the problem.

Always remember to send your log file along with your bug report.  The log file is one of the most valuable tools the developer has when it comes to resolving problems.

Don’t be surprised (or offended) if the developer comes back with some more questions about your fault.  They may not have been able to reproduce it, or, they might want additional clarification about the exact manifestation of the problem.  If you can identify a problem with the way in which bugs are reported then change the way you (and the team) report bugs.

If you have a team of testers, consider using a standard format for error reporting across the whole team.  That way new testers will get up to speed faster, and developers can find the information they are looking for easier.

==Some common pitfalls ==
;The change is only one line it can't possibly be wrong. : Those tiny one line fixes to your code will quite often cause you far more pain than a complete change to the class hierarchy.  The reason for this is that the one-line code change doesn’t get the same level of consideration as a complete class hierarchy change.  It’s very easy to fall into the trap of, &quot;It’s only one line it won’t break anything and it will fix my problem.&quot;.

; Changing code at the point of release. : If you ever change some code prior to building your release, and then fail to test it, your release will have bugs.  In the best case you will have introduced a new bug (assuming the one you were trying to fix was fixed by your last minute change).  At worst you will have completely broken your mod and it will no longer work.

; Publishing an unattainable release date. : As a developer you are always optimistic about how much bug free code you can write in a given amount of time.  Publishing a release date for your mod based upon your expectations of when the mod will be finished will out you and your team under extreme pressure.  Have you allowed time for testing and bug fixing in your date?  Do you have any spare time (contingency) added to cater for interruptions from real life? Bad things happen when release dates are missed.  The developer and testers may get discouraged.  People will start to lose interest in the mod and accuse it of being vapourware.  Your team may get flamed to a crisp for not delivering on your published release date.  Your &quot;consumers&quot; won’t care that your PC caught fire, or that a builder has severed your Internet connection so you couldn’t do anything.  All they will see is that you failed to deliver, when you said you were going to.

==Related Topics==
* [[Legacy:A Bug'S Life|A Bug's Life]] &amp;ndash; hints on how to write a useful bug report
* [[Legacy:Debugging Techniques|Debugging Techniques]] &amp;ndash; useful techniques for finding and eliminating bugs
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your mod</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/General Mod Optimization</title>
    <id>1857</id>
    <revision>
      <id>4557</id>
      <timestamp>2004-08-11T12:40:21Z</timestamp>
      <contributor>
        <ip>SquirrelZero</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Here I will outline some easy and commonly overlooked methods for optimizing your mod so that it performs at its best.  I encountered all of these myself while producing Frag.Ops, and being my first mod I realized how easy it is to not notice these things.  Currently a work in progress.  -SquirrelZero

==Mesh LOD - UT200X ==

Mesh LOD (Level Of Detail) levels and their benefits.

===Player Models===

For each of your player models, you should have 4 [[Legacy:LOD|LOD]] levels.  These can be viewed in the LOD drop-down menu in the [[Legacy:Animation Browser|Animation Browser]].  LOD levels are what the engine will display at varying view distances from the model, to save polygon counts that the viewer would otherwise never notice.  Each level collapses certain polygons on the model to create a lower-poly version of the original.  When importing your models into the editor, these levels are generated for you.  However, if you saved them with smoothing groups, the engine will generally collapse parts of the model that you really don't want it to collapse &amp;ndash; like the neck, ankles, elbows, wrists, etc.  This causes pieces of the model to be completely see-through at a relatively short view distance.  Make sure you don't save any player models with smoothing groups.

===Vehicles===

These are generally the same as Player Models.  No need for further explanation.

===1st and 3rd Person Weapon Models===

Here you only need 1 LOD level: the original mesh.  Since the editor automatically creates the 4 levels for you when importing a model, this is often the most overlooked setting I've come across.  You can safely delete levels 1,2, and 3, thus reducing the total data size by a very large amount.  When preloading each model, all of the LOD levels are preloaded along with it, and by deleting these you can reduce the memory usage often by almost a megabyte per 1st person model, and 200-300 kilobytes per 3rd person model.  In cases of high memory usage, this can make a world of difference.   

==Rigidize - UT200X ==

The rigidize subcategory of LOD levels, used for reducing the overhead when drawing a skeletal mesh.

===Player Models===

This is somewhat of a topic of contention among modders.  Open the Animation Browser and go to the first level of LOD in any stock UT200X player model.  You'll see a subsection named '''Rigidize'''.  There is a variable here named '''MeshSectionMethod'''.  You'll notice that on all UT200X player models, they're set to '''MSM_SmoothOnly'''.  This basically tells the engine &quot;This mesh has no rigid parts, and should be reuploaded to the video card each time the model needs to be repainted.&quot;  Sound slow?  It is.  In fact, it's the slowest of all the Rigid settings.  So why do all the stock models use it?  Most player models have very few rigid parts and are generally deformable on the whole.  For example, if you set it to '''MSM_RigidOnly''' then click the '''Redigest LOD''' button, you'll only see the rigid parts, which are very few and don't make up large chunks of the polycount.  Obviously using MSM_RigidOnly would be a bad idea, since you wouldn't want to see only those small patches of the model in the game.  '''MSM_Mixed''' tells the engine &quot;This model has both smooth and rigid parts, so cache some of it to memory while reuploading the rest.&quot;  However, using this on a model with very few rigid parts can actually decrease performance, since the CPU overhead needed to compute these configurations would outweigh the benefit.

So when is it a good idea to use MSM_Mixed on a player model?  Say your killer new model is a mechanical one, like a robot, with very few deformable parts &amp;ndash; let's say, a Star Wars AT-ST.  Machines generally don't deform because they're made of metal.  In this case, you would probably see an excellent benefit from using the MSM_Mixed rigid setting, since it will allow your model to be almost entirely cacheable to video memory, like a static mesh.  This means the video card would require less overhead per tick when rendering that model, allowing a substantial performance increase.  This and the MSM_RigidOnly setting are also common on Vehicles in UT2004, which I'll get to next.

===Vehicles===

Vehicles can almost always use MSM_RigidOnly.  Very few vehicles will need to deform, except perhaps ones like the LawDogs horses or the Shattered Oasis cows.  This is used extensively in UT2004 to boost performance in maps where sometimes there are as many as 10-15 vehicles on screen at once. 

===1st Person Weapon Models===

Here's a good time to make use of the MSM_Mixed and MSM_RigidOnly settings.  Since most weapons don't deform, you can safely use MSM_RigidOnly in almost all situations.  This basically allows your weapons to be entirely cacheable to the video card, and is much, much faster than reuploading the entire mesh each repaint, especially when compared with models at high polycounts.  The only time you wouldn't want to use this setting is if your models also included some kind of arm or hand holding them, since these need to deform and can't be rigid.  Here it is safe to use MSM_Mixed because the weapon itself takes up a large chunk of the polycount, and is not deformable.

===3rd Person Weapon Models===

Ah, here we introduce a new rigid setting: '''MSM_SinglePiece'''.  This is similar to MSM_RigidOnly, except forces the model to always use the reference pose (no animation).  Nearly all 3rd person weapon/inventory models can use this setting.  This setting performs nearly as good as static meshes, with the small exception of the mesh skeleton.  The reason 3rd person weapon models are skeletal meshes at all is because they can use bones, which are very handy for attaching effects like shell ejectors and muzzle flashes, things that would otherwise be very difficult to code in.  Note that MSM_SinglePiece is the fastest of all the Rigid settings.

==Conclusion==

This is by no means complete, but I do need some sleep now :).  I'll be adding a few more tips this week, and I intend to link the relevant sections to their counterparts elsewhere on the wiki.

---- ----

'''EntropicLqd:'''  Can you explain ''deformable'' a little more clearly.  Is it the same as ''animated''?  In which case the Flak Cannon would be ''deformable''? or is it something else?  interesting page btw.  Very nice.

'''Foxpaw:''' I believe deformable refers to a group of vertices that do not change position relative to each other. So, for instance, some parts of the flak cannon are animated, but all parts of the piston head (and I believe the shell too) stay in the same place relative to each other, as do the &quot;body&quot; pieces. However, in, say, a player, the &quot;skin&quot; of the player changes considerably as it moves.

'''Foxpaw:''' Also, should this page be merged with [[Legacy:Optimization Techniques|Optimization Techniques]]?

'''SquirrelZero:''' Ah, I didn't see that page.  It might fit in quite nicely there.  Foxpaw is correct, ''deformable'' refers to models that stretch and bend, like the legs on a player model when running, or the twisting of the torso.  The model's structure changes often and so needs to be reuploaded to memory with each change.

'''Dirk Fist:''' Rubber == Deformable; Porcelain != Deformable :D</text>
    </revision>
    <revision>
      <id>4558</id>
      <timestamp>2004-04-08T01:13:48Z</timestamp>
      <contributor>
        <ip>SquirrelZero</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here I will outline some easy and commonly overlooked methods for optimizing your mod so that it performs at its best.  I encountered all of these myself while producing Frag.Ops, and being my first mod I realized how easy it is to not notice these things.  Currently a work in progress.  -SquirrelZero

==Mesh LOD - UT200X ==

Mesh LOD (Level Of Detail) levels and their benefits.

===Player Models===

For each of your player models, you should have 4 [[Legacy:LOD|LOD]] levels.  These can be viewed in the LOD drop-down menu in the [[Legacy:Animation Browser|Animation Browser]].  LOD levels are what the engine will display at varying view distances from the model, to save polygon counts that the viewer would otherwise never notice.  Each level collapses certain polygons on the model to create a lower-poly version of the original.  When importing your models into the editor, these levels are generated for you.  However, if you saved them with smoothing groups, the engine will generally collapse parts of the model that you really don't want it to collapse &amp;ndash; like the neck, ankles, elbows, wrists, etc.  This causes pieces of the model to be completely see-through at a relatively short view distance.  Make sure you don't save any player models with smoothing groups.

===Vehicles===

These are generally the same as Player Models.  No need for further explanation.

===1st and 3rd Person Weapon Models===

Here you only need 1 LOD level: the original mesh.  Since the editor automatically creates the 4 levels for you when importing a model, this is often the most overlooked setting I've come across.  You can safely delete levels 1,2, and 3, thus reducing the total data size by a very large amount.  When preloading each model, all of the LOD levels are preloaded along with it, and by deleting these you can reduce the memory usage often by almost a megabyte per 1st person model, and 200-300 kilobytes per 3rd person model.  In cases of high memory usage, this can make a world of difference.   

==Rigidize - UT200X ==

The rigidize subcategory of LOD levels, used for reducing the overhead when drawing a skeletal mesh.

===Player Models===

This is somewhat of a topic of contention among modders.  Open the Animation Browser and go to the first level of LOD in any stock UT200X player model.  You'll see a subsection named '''Rigidize'''.  There is a variable here named '''MeshSectionMethod'''.  You'll notice that on all UT200X player models, they're set to '''MSM_SmoothOnly'''.  This basically tells the engine &quot;This mesh has no rigid parts, and should be reuploaded to the video card each time the model needs to be repainted.&quot;  Sound slow?  It is.  So why do all the stock models use it?  Most player models have very few rigid parts and are generally deformable on the whole.  For example, if you set it to '''MSM_RigidOnly''' then click the '''Redigest LOD''' button, you'll only see the rigid parts, which are very few and don't make up large chunks of the polycount.  Obviously using MSM_RigidOnly would be a bad idea, since you wouldn't want to see only those small patches of the model in the game.  '''MSM_Mixed''' tells the engine &quot;This model has both smooth and rigid parts, so cache some of it to memory while reuploading the rest.&quot;  However, using this on a model with very few rigid parts can actually decrease performance, since the CPU overhead needed to compute these configurations would outweigh the benefit.

So when is it a good idea to use MSM_Mixed on a player model?  Say your killer new model is a mechanical one, like a robot, with very few deformable parts &amp;ndash; let's say, a Star Wars AT-ST.  Machines generally don't deform because they're made of metal.  In this case, you would probably see an excellent benefit from using the MSM_Mixed rigid setting, since it will allow your model to be almost entirely cacheable to video memory, like a static mesh.  This means the video card would require less overhead per tick when rendering that model, allowing a substantial performance increase.  This and the MSM_RigidOnly setting are also common on Vehicles in UT2004, which I'll get to next.

===Vehicles===

Vehicles can almost always use MSM_RigidOnly.  Very few vehicles will need to deform, except perhaps ones like the LawDogs horses or the Shattered Oasis cows.  This is used extensively in UT2004 to boost performance in maps where sometimes there are as many as 10-15 vehicles on screen at once. 

===1st Person Weapon Models===

Here's a good time to make use of the MSM_Mixed and MSM_RigidOnly settings.  Since most weapons don't deform, you can safely use MSM_RigidOnly in almost all situations.  This basically allows your weapons to be entirely cacheable to the video card, and is much, much faster than reuploading the entire mesh each repaint, especially when compared with models at high polycounts.  The only time you wouldn't want to use this setting is if your models also included some kind of arm or hand holding them, since these need to deform and can't be rigid.  Here it is safe to use MSM_Mixed because the weapon itself takes up a large chunk of the polycount, and is not deformable.

===3rd Person Weapon Models===

Ah, here we introduce a new rigid setting: '''MSM_SinglePiece'''.  This is similar to MSM_RigidOnly, except forces the model to always use the reference pose (no animation).  Nearly all 3rd person weapon/inventory models can use this setting.  This setting performs nearly as good as static meshes, with the small exception of the mesh skeleton.  The reason 3rd person weapon models are skeletal meshes at all is because they can use bones, which are very handy for attaching effects like shell ejectors and muzzle flashes, things that would otherwise be very difficult to code in.

==Conclusion==

This is by no means complete, but I do need some sleep now :).  I'll be adding a few more tips this week, and I intend to link the relevant sections to their counterparts elsewhere on the wiki.

---- ----

'''EntropicLqd:'''  Can you explain ''deformable'' a little more clearly.  Is it the same as ''animated''?  In which case the Flak Cannon would be ''deformable''? or is it something else?  interesting page btw.  Very nice.

'''Foxpaw:''' I believe deformable refers to a group of vertices that do not change position relative to each other. So, for instance, some parts of the flak cannon are animated, but all parts of the piston head (and I believe the shell too) stay in the same place relative to each other, as do the &quot;body&quot; pieces. However, in, say, a player, the &quot;skin&quot; of the player changes considerably as it moves.

'''Foxpaw:''' Also, should this page be merged with [[Legacy:Optimization Techniques|Optimization Techniques]]?

'''SquirrelZero:''' Ah, I didn't see that page.  It might fit in quite nicely there.  Foxpaw is correct, ''deformable'' refers to models that stretch and bend, like the legs on a player model when running, or the twisting of the torso.  The model's structure changes often and so needs to be reuploaded to memory with each change.</text>
    </revision>
    <revision>
      <id>4559</id>
      <timestamp>2004-04-10T17:53:04Z</timestamp>
      <contributor>
        <ip>Dirk Fist</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here I will outline some easy and commonly overlooked methods for optimizing your mod so that it performs at its best.  I encountered all of these myself while producing Frag.Ops, and being my first mod I realized how easy it is to not notice these things.  Currently a work in progress.  -SquirrelZero

==Mesh LOD - UT200X ==

Mesh LOD (Level Of Detail) levels and their benefits.

===Player Models===

For each of your player models, you should have 4 [[Legacy:LOD|LOD]] levels.  These can be viewed in the LOD drop-down menu in the [[Legacy:Animation Browser|Animation Browser]].  LOD levels are what the engine will display at varying view distances from the model, to save polygon counts that the viewer would otherwise never notice.  Each level collapses certain polygons on the model to create a lower-poly version of the original.  When importing your models into the editor, these levels are generated for you.  However, if you saved them with smoothing groups, the engine will generally collapse parts of the model that you really don't want it to collapse &amp;ndash; like the neck, ankles, elbows, wrists, etc.  This causes pieces of the model to be completely see-through at a relatively short view distance.  Make sure you don't save any player models with smoothing groups.

===Vehicles===

These are generally the same as Player Models.  No need for further explanation.

===1st and 3rd Person Weapon Models===

Here you only need 1 LOD level: the original mesh.  Since the editor automatically creates the 4 levels for you when importing a model, this is often the most overlooked setting I've come across.  You can safely delete levels 1,2, and 3, thus reducing the total data size by a very large amount.  When preloading each model, all of the LOD levels are preloaded along with it, and by deleting these you can reduce the memory usage often by almost a megabyte per 1st person model, and 200-300 kilobytes per 3rd person model.  In cases of high memory usage, this can make a world of difference.   

==Rigidize - UT200X ==

The rigidize subcategory of LOD levels, used for reducing the overhead when drawing a skeletal mesh.

===Player Models===

This is somewhat of a topic of contention among modders.  Open the Animation Browser and go to the first level of LOD in any stock UT200X player model.  You'll see a subsection named '''Rigidize'''.  There is a variable here named '''MeshSectionMethod'''.  You'll notice that on all UT200X player models, they're set to '''MSM_SmoothOnly'''.  This basically tells the engine &quot;This mesh has no rigid parts, and should be reuploaded to the video card each time the model needs to be repainted.&quot;  Sound slow?  It is.  So why do all the stock models use it?  Most player models have very few rigid parts and are generally deformable on the whole.  For example, if you set it to '''MSM_RigidOnly''' then click the '''Redigest LOD''' button, you'll only see the rigid parts, which are very few and don't make up large chunks of the polycount.  Obviously using MSM_RigidOnly would be a bad idea, since you wouldn't want to see only those small patches of the model in the game.  '''MSM_Mixed''' tells the engine &quot;This model has both smooth and rigid parts, so cache some of it to memory while reuploading the rest.&quot;  However, using this on a model with very few rigid parts can actually decrease performance, since the CPU overhead needed to compute these configurations would outweigh the benefit.

So when is it a good idea to use MSM_Mixed on a player model?  Say your killer new model is a mechanical one, like a robot, with very few deformable parts &amp;ndash; let's say, a Star Wars AT-ST.  Machines generally don't deform because they're made of metal.  In this case, you would probably see an excellent benefit from using the MSM_Mixed rigid setting, since it will allow your model to be almost entirely cacheable to video memory, like a static mesh.  This means the video card would require less overhead per tick when rendering that model, allowing a substantial performance increase.  This and the MSM_RigidOnly setting are also common on Vehicles in UT2004, which I'll get to next.

===Vehicles===

Vehicles can almost always use MSM_RigidOnly.  Very few vehicles will need to deform, except perhaps ones like the LawDogs horses or the Shattered Oasis cows.  This is used extensively in UT2004 to boost performance in maps where sometimes there are as many as 10-15 vehicles on screen at once. 

===1st Person Weapon Models===

Here's a good time to make use of the MSM_Mixed and MSM_RigidOnly settings.  Since most weapons don't deform, you can safely use MSM_RigidOnly in almost all situations.  This basically allows your weapons to be entirely cacheable to the video card, and is much, much faster than reuploading the entire mesh each repaint, especially when compared with models at high polycounts.  The only time you wouldn't want to use this setting is if your models also included some kind of arm or hand holding them, since these need to deform and can't be rigid.  Here it is safe to use MSM_Mixed because the weapon itself takes up a large chunk of the polycount, and is not deformable.

===3rd Person Weapon Models===

Ah, here we introduce a new rigid setting: '''MSM_SinglePiece'''.  This is similar to MSM_RigidOnly, except forces the model to always use the reference pose (no animation).  Nearly all 3rd person weapon/inventory models can use this setting.  This setting performs nearly as good as static meshes, with the small exception of the mesh skeleton.  The reason 3rd person weapon models are skeletal meshes at all is because they can use bones, which are very handy for attaching effects like shell ejectors and muzzle flashes, things that would otherwise be very difficult to code in.

==Conclusion==

This is by no means complete, but I do need some sleep now :).  I'll be adding a few more tips this week, and I intend to link the relevant sections to their counterparts elsewhere on the wiki.

---- ----

'''EntropicLqd:'''  Can you explain ''deformable'' a little more clearly.  Is it the same as ''animated''?  In which case the Flak Cannon would be ''deformable''? or is it something else?  interesting page btw.  Very nice.

'''Foxpaw:''' I believe deformable refers to a group of vertices that do not change position relative to each other. So, for instance, some parts of the flak cannon are animated, but all parts of the piston head (and I believe the shell too) stay in the same place relative to each other, as do the &quot;body&quot; pieces. However, in, say, a player, the &quot;skin&quot; of the player changes considerably as it moves.

'''Foxpaw:''' Also, should this page be merged with [[Legacy:Optimization Techniques|Optimization Techniques]]?

'''SquirrelZero:''' Ah, I didn't see that page.  It might fit in quite nicely there.  Foxpaw is correct, ''deformable'' refers to models that stretch and bend, like the legs on a player model when running, or the twisting of the torso.  The model's structure changes often and so needs to be reuploaded to memory with each change.

'''Dirk Fist:''' Rubber == Deformable; Porcelain != Deformable :D</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Mod Death</title>
    <id>1852</id>
    <revision>
      <id>4546</id>
      <timestamp>2005-12-16T20:05:22Z</timestamp>
      <contributor>
        <ip>38.116.192.13</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Why do Mods and Mod Teams die ? ==

Many Mod Teams die before they publish something.  Some die before they have had a chance to advertise their existence.  If a team exists without a purpose its members will most likely leave and find other teams.  Some mod teams collapse before they really start because the ''idea'' was either hard, vague, or the team couldn't agree.

===Mods that die before they start ===

The majority of mods that die before they start, start in the same way.  The &quot;project manager&quot; makes a post on a forum advertising a &quot;great new mod idea, come and help me work on it.&quot;.  After a bit of digging prospective team members find that the only thing that exists for the mod is simply a website.  If you've been there and done that, or, are thinking about doing it then read [[Legacy:Mychaeel/Mod_Startups|Mychaeel/Mod_Startups]].  It will save you some pain.

Occasionally a mod will die before it's been started because it is so ambitious.  Most &quot;total conversions&quot; go this way.  It's very easy to come up with a mod idea where the actual amount of effort required to build it is so daunting that the mod team goes into a type of paralysis.  The mod itself is so big that it's scary.

===Mods that die before publishing anything ===

I would say that the vast majority of mods involving a team of two or more people fall into this category.  Work on the mod starts off well, but when the &quot;interesting&quot; work is completed the members of the team lose interest and gradually drift away.  Maintaining a tight focus when all that is needed is polishing work on the user interface, the config, testing, and bug fixing is difficult.  This is made harder by the distributed nature of most mod teams.

Lack of organisation or even over organisation can also kill a mod that has started well.  It generally exhibits itself as a gradual decline of interest and an increase in a poor attitude.  Some team leads try to be the focal point of all communication.  This can help, but more often than not prevents the team gelling properly.

Interruptions from &quot;real life&quot; and a decline in interest in the mod from team members also kill mods before they publish.  Loss of a key team member to real life problems can be catastrophic for small teams, especially if the person dropping out has become the central focus of the mod.  If the mod is a reasonable size then it's very easy to simply get sick of working on it.  One the &quot;mod sickness&quot; kicks in the only thing that will keep a team together and working on the mod is stubborness, the desire to actually finish something, and an enthusiastic beta-testing team.

Some mods die because one particular member of the team &quot;goes to the dark side&quot; and becomes increasingly negative and cynical about the mod &amp;ndash; or constantly attempts to further their own agenda over and above everyone elses.  Once that happens the whole team can be quickly sucked into an increasing attitude of negativity.  Unfortunately the only way to avoid destruction in this way is to kick the &quot;bad apple&quot; from the team.

Making a sizeable mod is not for the faint hearted.  There is always far more work to do than it first appears.  This in itself is a discouraging factor that will cause mod teams to falter and stumble.

===Other reasons mods die ===

Some mods start with a great blaze of publicity designed to send ripples of amazement and interest throught the community.  This is all well and good (although over hyping your mod is a bad thing) but when the community doesn't even bother to look at the mod web site (assuming there is one) it can be very discouraging.  This discouragement can in turn lead to the mod team giving up on the mod and either finding something else to do, or disbanding.

There is an inherent risk with any mod idea that it simply doesn't work when implemented.  This might be because of a technology limitation or simply an interface or implementation problem.  Whatever the reason is, some great ideas just don't translate well into code.  When a team finds themselves in this position it's very easy to point the finger at the person who dreamt up the original idea and blame them.  In fact, this is the very worst thing you can do.  These things happen - it's a fact of life.  Rather than sit around being glum, or destructing the team, brainstorm another idea - or see if there is a solution to the issue you have.  You've already got some experience working together and you've managed to get further than most.

If a mod does't get a detailed specification or description fairly quickly after its inception the odds are it will die shortly after.  It could be that the idea itself is not interesting enough for anyone to want to add detail to it.  Alternatively, the original idea could be so vague that it meant all things to all people, sparking off long winded and destructive discussions on what form the mod should take.

==Handling a Mod Team Failure ==

Seeing a mod fail, or a team simply rip itself apart, is never a pleasant experience.  For the people directly involved it can be a painful nightmare.  And a very painful process.  There are many ways of coping with this, good and bad.  Rather than discuss in great detail each point I've summarised them.  It's easier that way.
* Don't ever post any personal attacks on team members on any forum anywhere &amp;ndash; even if you feel like it.  You might need to work with these people again.  It's also a very childish and unhelpful way to behave.  Even if the mod failure wasn't &quot;your fault&quot; you stand to lose a lot of respect from your peers.  The Internet can be a very unforgiving place and has a long memory.  Would you want someone on your team with a record of publishing personal attacks?
* If you are still interested in continuing the development of the mod then get permission from the team and either finish it alone, or build another team.
* See if you can work out exactly what went wrong.  Once you've done that, come back and update these pages (avoiding mentioning any names).  That way other people will benefit from your experience.  And you have a record for future reference which will help you avoid it next time.
* Quitting the mod scene altogether is always an option.  However, this should be a final resort.
* Taking a short break from mod making can be a good idea.  It allows you a bit of a break from &quot;having&quot; to deliver.
* Build some really really small mods.  If you've been working on a large mod project for ages, and it suddenly goes awry, build some small mods and release them.  A small mod is something that can be built in a couple of days (or less).  Releasing a bunch of small mods is a good way to bouy yourself back up.
* Take a look around for similar mods you might be interested in.  Some of these might need some additional help even if they have no published vacancies.
* Don't take your mods too seriously.  I realise that a lot of people see mods as a way of getting into the games industry.  Although this is &quot;a good thing&quot; you are better off making mods for fun first, and for career second.  It's additional pressure you don't need and makes surviving a mod failure easier.
* Realize that even if you are trying to use your mod as resume fodder, you will probably not get paid for it, and most people outside the community will probably not care.  Remember where your priorities lie.

----

''' EntropicLqd:''' I've taken the liberty of resetting the discussion &amp;ndash; hope no-one minds.  Death Angyl - your comments have formed the basis of a new page [[Legacy:Making Mods/Why Are You Making A Mod|Making Mods/Why Are You Making A Mod]].  Good work.

'''TSOShadow:''' It would be nice if someone slipped in a &quot;Mod revival from the dead&quot; Bit as I'm working on this in real life. (Unless I do it before I see a change then I'll go ahead and slip in what I did in the re-incarnation)</text>
    </revision>
    <revision>
      <id>4547</id>
      <timestamp>2004-11-25T23:22:05Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Why do Mods and Mod Teams die ? ==

Many Mod Teams die before they publish something.  Some die before they have had a chance to advertise their existence.  If a team exists without a purpose its members will most likely leave and find other teams.  Some mod teams collapse before they really start because the ''idea'' was either hard, vague, or the team couldn't agree.

===Mods that die before they start ===

The majority of mods that die before they start, start in the same way.  The &quot;project manager&quot; makes a post on a forum advertising a &quot;great new mod idea, come and help me work on it.&quot;.  After a bit of digging prospective team members find that the only thing that exists for the mod is simply a website.  If you've been there and done that, or, are thinking about doing it then read [[Legacy:Mychaeel/Mod_Startups|Mychaeel/Mod_Startups]].  It will save you some pain.

Occasionally a mod will die before it's been started because it is so ambitious.  Most &quot;total conversions&quot; go this way.  It's very easy to come up with a mod idea where the actual amount of effort required to build it is so daunting that the mod team goes into a type of paralysis.  The mod itself is so big that it's scary.

===Mods that die before publishing anything ===

I would say that the vast majority of mods involving a team of two or more people fall into this category.  Work on the mod starts off well, but when the &quot;interesting&quot; work is completed the members of the team lose interest and gradually drift away.  Maintaining a tight focus when all that is needed is polishing work on the user interface, the config, testing, and bug fixing is difficult.  This is made harder by the distributed nature of most mod teams.

Lack of organisation or even over organisation can also kill a mod that has started well.  It generally exhibits itself as a gradual decline of interest and an increase in a poor attitude.  Some team leads try to be the focal point of all communication.  This can help, but more often than not prevents the team gelling properly.

Interruptions from &quot;real life&quot; and a decline in interest in the mod from team members also kill mods before they publish.  Loss of a key team member to real life problems can be catastrophic for small teams, especially if the person dropping out has become the central focus of the mod.  If the mod is a reasonable size then it's very easy to simply get sick of working on it.  One the &quot;mod sickness&quot; kicks in the only thing that will keep a team together and working on the mod is stubborness, the desire to actually finish something, and an enthusiastic beta-testing team.

Some mods die because one particular member of the team &quot;goes to the dark side&quot; and becomes increasingly negative and cynical about the mod &amp;ndash; or constantly attempts to further their own agenda over and above everyone elses.  Once that happens the whole team can be quickly sucked into an increasing attitude of negativity.  Unfortunately the only way to avoid destruction in this way is to kick the &quot;bad apple&quot; from the team.

Making a sizeable mod is not for the faint hearted.  There is always far more work to do than it first appears.  This in itself is a discouraging factor that will cause mod teams to falter and stumble.

===Other reasons mods die ===

Some mods start with a great blaze of publicity designed to send ripples of amazement and interest throught the community.  This is all well and good (although over hyping your mod is a bad thing) but when the community doesn't even bother to look at the mod web site (assuming there is one) it can be very discouraging.  This discouragement can in turn lead to the mod team giving up on the mod and either finding something else to do, or disbanding.

There is an inherent risk with any mod idea that it simply doesn't work when implemented.  This might be because of a technology limitation or simply an interface or implementation problem.  Whatever the reason is, some great ideas just don't translate well into code.  When a team finds themselves in this position it's very easy to point the finger at the person who dreamt up the original idea and blame them.  In fact, this is the very worst thing you can do.  These things happen - it's a fact of life.  Rather than sit around being glum, or destructing the team, brainstorm another idea - or see if there is a solution to the issue you have.  You've already got some experience working together and you've managed to get further than most.

If a mod does't get a detailed specification or description fairly quickly after its inception the odds are it will die shortly after.  It could be that the idea itself is not interesting enough for anyone to want to add detail to it.  Alternatively, the original idea could be so vague that it meant all things to all people, sparking off long winded and destructive discussions on what form the mod should take.

==Handling a Mod Team Failure ==

Seeing a mod fail, or a team simply rip itself apart, is never a pleasant experience.  For the people directly involved it can be a painful nightmare.  And a very painful process.  There are many ways of coping with this, good and bad.  Rather than discuss in great detail each point I've summarised them.  It's easier that way.
* Don't ever post any personal attacks on team members on any forum anywhere &amp;ndash; even if you feel like it.  You might need to work with these people again.  It's also a very childish and unhelpful way to behave.  Even if the mod failure wasn't &quot;your fault&quot; you stand to lose a lot of respect from your peers.  The Internet can be a very unforgiving place and has a long memory.  Would you want someone on your team with a record of publishing personal attacks?
* If you are still interested in continuing the development of the mod then get permission from the team and either finish it alone, or build another team.
* See if you can work out exactly what went wrong.  Once you've done that, come back and update these pages (avoiding mentioning any names).  That way other people will benefit from your experience.  And you have a record for future reference which will help you avoid it next time.
* Quitting the mod scene altogether is always an option.  However, this should be a final resort.
* Taking a short break from mod making can be a good idea.  It allows you a bit of a break from &quot;having&quot; to deliver.
* Build some really really small mods.  If you've been working on a large mod project for ages, and it suddenly goes awry, build some small mods and release them.  A small mod is something that can be built in a couple of days (or less).  Releasing a bunch of small mods is a good way to bouy yourself back up.
* Take a look around for similar mods you might be interested in.  Some of these might need some additional help even if they have no published vacancies.
* Don't take your mods too seriously.  I realise that a lot of people see mods as a way of getting into the games industry.  Although this is &quot;a good thing&quot; you are better off making mods for fun first, and for career second.  It's additional pressure you don't need and makes surviving a mod failure easier.
* Realize that even if you are trying to use your mod as resume fodder, you will probably not get paid for it, and most people outside the community will probably not care.  Remember where your priorities lie.

----

''' EntropicLqd:''' I've taken the liberty of resetting the discussion &amp;ndash; hope no-one minds.  Death Angyl - your comments have formed the basis of a new page [[Legacy:Making Mods/Why Are You Making A Mod|Making Mods/Why Are You Making A Mod]].  Good work.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/My Team Your Team</title>
    <id>1853</id>
    <revision>
      <id>4548</id>
      <timestamp>2005-01-11T15:50:56Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>despam</comment>
      <text xml:space="preserve">==My Team or Your Team (a disclaimer) ==

Before you start reading this whole [[Legacy:Making Mods|Making Mods]] section and get turned off but what seems to be a heavy emphasis on having a team leader, remember it doesn't have to be like that for every type of project.  The apparent emphasis on a team owner like this simply made the section easier to write.

Having a team leader or lead coder/mapper/whatever isn't mandatory.  In other words, don't waste more time building an intricate team structure than that structure would help to save.  In fact it is problably better to avoid having a heavy team structure if at all possible.  This gives all participants in the creation of the mod a sense of equal ownership.

Some mod teams work fine as an &quot;autonomous collective&quot; (shades of Monty Python).  Sometimes the older members (or sometimes just one) will be accepted as unofficial leaders, simply because in the event of disagreements members will respect their opinion.

Nevertheless, for larger projects such as total conversions, or complex gametypes, it might be wise for the founders of the mod to think about the development plan for the game, and setup a team hierarchy where the more experienced developers are guiding the less experienced ones, and one person is in charge of organizing the team, setting up file servers, organizing meetings, making sure the design specs are kept up to date, etc.

However your team fits itself together (and no two teams are alike) the following are essential.
* A fair and consistent way of handling disputes and disagreements.
* A single, bang up to date, specification for your mod that's available to everyone. A private wiki works great for that.
* At least one communication-platform where everyone can speak to the rest: one or several of an IRC channel, a forum, etc.
* Some sort of version management system like [[Legacy:CVS|CVS]] For larger projects like total conversions and complicated gametypes with lots of files, or frequent updates.

----

'''Spoon:''' I agree with this. I think you need someone to get the ball rolling, aka a project leader, after that let the individual's skill, creativity, and experience take over. Don't micro manage your team. Come up with a goal and let them communicate between each other to get it done. As a project leader, your goal is to work on a kick ass website :D

'''Lilguy:'''I hate to say it, but I strongly disagree with just about everything on this page. The first paragraph is just plain confusing, and there are a lot of claims in here without any sort of evidence or credibility. If there are ''any'' mods out there which have been completed without a team leader (and no, web designer doesn't = team leader) I bet you could count them on one hand. To expect a group of amauture developers to get together, organize a unified design, and create a game over a period of months or years, is very naive in my opinion. I've found that simply organizing people's work and keeping the specs up to date is just about a full-time job in itself.

'''T1:''' Fraghouse doesn't have a team leader and look at all the mods they've made. The Fraghouse Invasion Community Pack (which confusingly enough, was not made by Fraghouse) didn't have a team leader either. If I paid more attention to the mods out there, I'd probably know about more.

'''EntropicLqd:''' This section was primarily about adding a bit of balance.  Most of the rest of the [[Legacy:Making Mods|Making Mods]] section assumes some kind of team-leader/project manager type person is in place and/or a relatively rigid team structure.  At the end of the day a team should select an organisational structure that suits them and the way they want to work.  The last paragraph states that pretty nicely I think.

'''Tarquin:''' should we add CVS to the list of essentials above?

'''Lilguy:''' Done. I also fixed (somewhat) the first paragraph, although the grammar in the rest of the article is still pretty confusing. \

I guess when I made the comment above, I was thinking mostly in terms of larger projects such as total conversions. For the kinda stuff that Fraghouse does (map packs, mutators, gametypes) indeed not a lot of structure is neccessary, since these are typically short-term projects, with an evolutionary-type development cycle where adding little ideas and changing things around without a plan is acceptable. In many cases though, the intention is to make a complete game, or make ''major'' modifications to the original. These projects really require a lot of thought, planning, and organization. Encouraging startup developers to &quot;avoid having a heavy team structure if at all possible&quot; is exactly what many people who've been members of failed mods would tell you was the problem, along with a lack of communication.</text>
    </revision>
    <revision>
      <id>4549</id>
      <timestamp>2005-01-11T15:16:02Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-scar.boom.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-rosacea.boom.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-product.boom.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-medicine.boom.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://acne-treatment.boom.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>4550</id>
      <timestamp>2005-01-11T15:16:15Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-scar.boom.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-rosacea.boom.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-product.boom.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-medicine.boom.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://acne-treatment.boom.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Supporting Your Mod</title>
    <id>1847</id>
    <revision>
      <id>4535</id>
      <timestamp>2002-09-25T13:10:20Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Created page</comment>
      <text xml:space="preserve">==Supporting Your Mod ==

Once all of the euphoria of finally finishing something and getting it released has died away, the long dark teatime of the soul begins.  In the months and years that follow the release of your mod to the general public the sounds of the popping corks will be scant comfort as you scream for the nth time, &quot;Didn’t they read the README? Haven’t they checked the FAQ?&quot;.

===Work doesn’t always stop when the mod is released ===

Once you have released your mod you might think that you could move onto something else, but that’s not always the case.  If the mod is a very simple mutator then you might get lucky.  However, for a mod of any complexity you will almost receive a fair few e-mails requesting help, new features, and bug reports.

For a complex mod it’s not difficult to spend more time supporting it than you did writing it.  You may have only spent 6 months writing the mod, but the game the mod is for may last for many years.  IF you skimped on the bug fixing and testing then this is the point at which it bites.

===Create an FAQ ===

One of the best things you can do in reducing the number of support e-mails (or at least speeding up the processing of them) is by maintaining an FAQ.  Whenever you get a question not on the FAQ add the question along with a detailed answer.  Make sure the FAQ is referenced in the read me, and the release notes.  Publish the FAQ on the Internet on you &quot;mod site&quot; if you have one.  Keep a copy of the FAQ on your desktop so you can simply drag and drop it into an e-mail as you answer the same question for the 15th time.

Always place a version number or last updated date on the FAQ.

===Future versions ===

One of the things you will need to be clear about is whether or not there is on-going development for the mod.  You can avoid a lot of future feature requests simply by making it clear that there will never be another version of the mod.  However, if you do intend to continue to extend the mod then add some sections to the bottom of the FAQ.  These sections should that list all of the features that have been requested so far in the following categories – rejected, scheduled, and under consideration.  This should reduce the number of duplicate requests, but probably won’t.

===Releasing bug fixes ===

Any subsequent release of your mod should be handled with care.  The release should received as much, if not more, testing that the initial release did – you don’t want to release something that is as broken (or worse) than the current live version.

Never rush out a bug fix release unless there is a huge gaping critical error in your mod (presumably caused because you made a last minute code change before doing the final build).  No matter how much people shout for a new release wait until there is a sensible amount of fixes in the code before doing the release.

Unless you change the name of your mod package, having many versions floating around the Internet will increase the chance of &quot;package mismatch&quot; errors occurring.

===Always be polite ===

The customer is always right, even when they’ve ignored the README and FAQ, and are utterly stupid as well.

Even if you do feel like flaming them into small charcoal crisps, stamping on the pieces, and then sending the few remaining crumbs into the centre of a volcano don't do it.  Instead, take a deep breath, and reply with the FAQ (updated if necessary).  It will save your blood pressure, and make your mod look well supported.  This in turn should improve the reputation of your mod which means more people will download and play it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Why Are You Making A Mod</title>
    <id>1855</id>
    <revision>
      <id>4554</id>
      <timestamp>2004-12-23T04:24:22Z</timestamp>
      <contributor>
        <ip>C68.190.90.160.mad.wi.charter.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Although the reasons that people make mods are many and varied they can be distilled down into a very few all encompassing groups discussed below.

What this page will hopefully do is allow you to take a step back and consider the following.
* Why you want to get where you want to get?
* How you are going to get where you want?
* Are you willing to get to where you want?

The last may seem counterintuitive but you have to ask it of yourself each day.  Lots of modders do and find that they don't in fact want what they thought they did, thus we see the high &quot;failure&quot; rates.  Lots of modders don't even ask these questions and lose their way.  If you can face yourself and the answers to each and every one of these important questions, the odds are you will succeed.

(See also [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] for a similar rant.)

==It's the Technical Challenge==

There will always be a few people in the world that write mods simply because they can.  These people will generally work alone and churn out small mutators and game mods by the bucket load.  Their motivation is purely at a technical &quot;how does this work&quot;, &quot;Can I do this&quot; level.

Quite often people like this will have many unfinished projects littered over their hard disk.  The ''interesting'' stuff has been done but it's never been packaged up because something more interesting came along to look at.  For these people, the doing is more important than finishing or releasing.

==The Idea Seemed Like a Fun One==

Most (hopefully) people want to write a mod becasue the idea itself seems like fun, and they know that they will play it.  This is the best reason to write a mod in fact.  If the mod is fun, and stays that way through the development process then your chances of success are good.

Some of these mods are small, some (like Chaos UT) are reasonably large and complex.  The actual mod size is not important.  It's the fun factor that counts.  Mods written for &quot;fun&quot; mods only fail for two reasons.  The first is that the mod wasn't fun when implemented.  The second is that the team collapsed (normalling an indication of the first but not always)

==I Want to Learn To Program==

Some people write mods because they see it as a way of learning to program.  As such a mod can be a fun way to &quot;dip the toe&quot; into the world of programming to see if you like it.  The benefit of this is that writing a small weapons mutator is way more interesting than some dull file processing program.

One thing that this type of person needs to realise is that although most of the concepts available within Unreal Script are directly transferrable to other programming languages - the other languages and environments still need to be learned.

If you start learning to program with UnrealScript remember that it's only a start.  There will be whole areas of programming discipline that you will miss out on.  It's also well worth getting someone else to review the code you've used for your mod.  This will help you not only clean up your programming style but also teach you new (and hopefully more efficient) ways of approaching a given problem.

And finally, if you do fall into this category the Recommended Reading section of the [[Legacy:Making Mods|Making Mods]] page really is just that.  Recommended.

==I want to get my mod published==

This is one of the most problematic reasons to be building a mod.

Statistically speaking, the ratio of working, widely accepted total conversions for FPS games (HL, UT in particular) to the number of ideas out there is very low.  There are maybe 10 HL &quot;large mods&quot; (e.g. DoD, CS, etc.) which have been widely popular, and even fewer UT mods (I can think of only 1 off the top of my head, which is TacOps).

In fact, simply by making a game modification under a EULA and not a professional license, you put yourself in a very strange place to try and get something published.  You are essentially developing new content for a published game for free.  The basics of your game are inherently owned by someone else.  This would be something like trying to build your dream house on someone else's land.

That is not to say mod work won't help you get a job.  In fact, many industry professionals began in the mod community.  There is a lot of blending between the amateur and professional communities these days.  Still, the game industry is relatively small compared to its audience - and that includes modders.  If you are working on a mod because you want this to be your profession - you should realize that just releasing one whiz bang thing isn't going to get you a contract.  Your best bet is to be passionate and professional about what you're doing - just like an employer would want to see.

So if you are working on a mod to get a job be aware that it's not a guaranteed way into the industry. By all means hold to that goal.  If you put enough work in you will most likely succeed eventually.  However it's better that you work on a mod because you enjoy it.

&lt;br /&gt;

'''Nuleo''': Oh come on now.  We all know you just want to eliminate the competition for the Make Something Unreal Contest ;D  I mean half of the people who worked on UT were once modders themselves.  Ok, so if you are just making a minor modification like a mutator something than you won't be the star of the next Gaming Conference but what better way  to demonstrate to game companies that you are capable of producing high quality content than by making a mod (preferrably a Total Conversion).  And anyway, what else are you going to do short of be related to the CEO, show them you're degree?  LOL.

'''RegularX''':  It's the last sentence that's most pertinent.  There are lots of talented people in the mod community - but there are only so many jobs out there.  When mod teams go into a project thinking &quot;we're going to make a bushel of money&quot; (and slowly, they are actually starting to think just that) they generally end up a) worrying about a lot of things completely unrelated to modding (ie lawyers), b) worrying about making a mod that they think will be popular/marketable - not necessarily new and fun or innovative, and most of all c) fail.  

Bottom line - I've worked with some people who were completely professional/perfectionists/etc - and they undoubtably have some good stuff in their portfolio by the end of the day.  But that's not why they were making stuff... 

'''Nuleo''': Well everyone does things because they enjoy it, and if not than thats unfortunate.  And if you can make money doing what you enjoy than thats even better.  I suppose its a matter of opinion and up to each individual &quot;Why I am making a mod&quot; and we just have different opinions.  If you are just making a mod for yourself, some friends, and maybe a few other people to play than yeah, don't expect publicity or money.  But if you think you have the skills and the talent (and the people) to make a truly compelling experience than you should go for broke (again, I am refering to total conversions not small modifications).  From my personal experience, mods don't &quot;fail&quot; because people expect too much but because they expect too little of themselves; They don't take the mod seriously or they make the excuses such as &quot;I don't have enough time&quot; or they can't handle focusing and working hard for the long haul and I guess for some its the get rich quick thing but I think you have to be pretty out of it to believe you are going to make any huge amount of money from a mod in and of itself.  My advice to modders - Keep your feet on the ground but Aim High :D

'''Wormbo:''' &quot;And if you can make money doing what you enjoy than thats even better.&quot; &lt;- But not with UT2003. (Words like &quot;EULA&quot; come to mind...) You can have a lot of publicity without even expecting it, btw.

'''Foxpaw:''' That is true, but a mod can also go commercial if it's popular enough - like counterstrike, tactical ops, or team fortress 2. (I've actually never seen that one in stores, so maybe it got cancelled.) Also there's money to be made in the MSU contest plus if you take the top prize you can make a commercial version of your mod. So I wouldn't say that it's not possible to make money using UT2003.

'''RegularX:''' TF2 was never a mod - but a commercial sequel, the TF team was swallowed up with Half-Life.  But you could count Team Fortress, Counter-Strike, Day of Defeat, Gunman Chronicles, and Tac Ops.  Rumors are floating that Natural Selection will go pro as well.  So that's six mods out of literally hundreds of projects, and most of them due to Valve's desire to keep the Half-Life engine selling past it's expiration date.  Then you could factor in all the individuals who have gotten jobs (ie Epic).

Sure it's certainly beneficial to getting into the industry - but that's not the point.  It's the wrong end to be starting from.  Talented people with a passion for these things are most likely to get a job, whether they join a mod team or not.  People who are scrambling to put code and maps together because they think that they will have the next Counter-Strike and see their game in stores, are (imho) doing the wrong thing for the wrong reasons and as Wormbo pointed out - with the wrong license.

I think the MSUC is walking a fine line between trying to reward mod projects for doing really creative work and trying to get modsters to think about being marketable.  I think it's a great thing, and I love seeing more people get involved in the process - but my guess is that come March 15th, you'll suddenly see a bunch of people magically lose interest in building mod content when they don't have a license to win for anymore.  And that's what I mean by the wrong reasons.

'''Foxpaw:''' I realize that TF2 was never a mod, but what I meant was, making the free mod generated the community that TF2 was going to be marketed to - so that's the commercial connection. I agree that the majority of mod projects won't ever end up making any money. Heck, most mod projects don't even make it to beta stage. I just think that it's inaccurate to say that you can't make money at all doing it.

'''Lilguy:''' I think the last paragraph about making mods for money needs to be renamed/re-thought, perhaps to &quot;I want to get my mod published&quot; First of all, a distinction needs to be made between making a mod with hopes that it will go commercial, and making a mod with hopes that a developer will take notice of your talent and hire you to work on some other game. While the first may be wishful thinking, the second is hands-down the best way to get into the industry &amp;ndash; I'm living proof of that. My Apprehension mod hasn't been released yet, but I was still made an offer from Ravensoft after showing them my code (and of course, my CS degree)

I think it's sort of an elitist attitude that people shouldn't want to make money by modding &amp;ndash; it's OK to want to make your favorite hobby into a carreer. I do agree that making mods that aim to be marketable is a problem, but it's a problem that exists in the industry itself, and can't really be blamed on a contest.

'''RegularX:''' I would agree with your edit suggestion - it makes a more clear distinction between trying to make money by creating a quasi-commercial game and trying to break into the industry by padding your portfolio.  I certainly don't think there's anything wrong with showing off good work to professionals in the hopes of getting hired.  As for the MSUC, I don't blame it for creating the atmosphere (I lay that at Valve's feet) - but I do blame it for encouraging it.  About half way through - Epic paid close attention to marketable mods and got a bit myopic (imho).  I had entered the contest hoping to get some quality feedback from professionals, and mostly what I got was &quot;why don't you get custom models?&quot;  When I asked about altered models for entry into MSUC, the response I got was  &quot;Yes, that's OK - but you know you can't box it like that.&quot; At this point I'm thinking there needs to be a distinction made between trying to mod an engine and trying to setup a development studio without paying for a license.

And I'm not btw, saying that Epic are nothing but greedy bastards trying desperately to churn out a Counter-Strike to be like Valve.  Like I've said, I have pretty mixed feelings about MSUC.  Overall, I think it was great and the community got some awesome, high quality mods and UT2004 got the attention it deserves for being a moddable engine.  

'''EntropicLqd:''' If you are not happy with the page then change it.  It was written at a time (seems an age ago tbh) where there were many many people trying to put mod teams together that were simply setting themselves up to fail - and destroy whatever enthusiasm they had for modding in the process.  Things seem to have calmed down a bit - although to be fair I've been out of the modding scene for over a year now so I don't really know.  To be honest it's nice to see the pages in the [[Legacy:Making Mods|Making Mods]] section getting a bit of attention.

'''RegularX:''' Fine, fine.  I took a stab at it.  I didn't write the original, but I tried to blend what I think was the original intent with a positive vibe on doing good work to get a good job.

'''EntropicLqd:'''Further tweaked.

'''Lilguy:''' Thanks guys, very nice work :)</text>
    </revision>
    <revision>
      <id>4555</id>
      <timestamp>2004-12-21T09:46:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Although the reasons that people make mods are many and varied they can be distilled down into a very few all encompassing groups discussed below.

What this page will hopefully do is allow you to take a step back and consider the following.
* Why you want to get where you want to get?
* How you are going to get where you want?
* Are you willing to get to where you want?

The last may seem counterintuitive but you have to ask it of yourself each day.  Lots of modders do and find that they don't in fact want what they thought they did, thus we see the high &quot;failure&quot; rates.  Lots of modders don't even ask these questions and lose their way.  If you can face yourself and the answers to each and every one of these important questions, the odds are you will succeed.

(See also [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] for a similar rant.)

==It's the Technical Challenge==

There will always be a few people in the world that write mods simply because they can.  These people will generally work alone and churn out small mutators and game mods by the bucket load.  Their motivation is purely at a technical &quot;how does this work&quot;, &quot;Can I do this&quot; level.

Quite often people like this will have many unfinished projects littered over their hard disk.  The ''interesting'' stuff has been done but it's never been packaged up because something more interesting came along to look at.  For these people, the doing is more important than finishing or releasing.

==The Idea Seemed Like a Fun One==

Most (hopefully) people want to write a mod becasue the idea itself seems like fun, and they know that they will play it.  This is the best reason to write a mod in fact.  If the mod is fun, and stays that way through the development process then your chances of success are good.

Some of these mods are small, some (like Chaos UT) are reasonably large and complex.  The actual mod size is not important.  It's the fun factor that counts.  Mods written for &quot;fun&quot; mods only fail for two reasons.  The first is that the mod wasn't fun when implemented.  The second is that the team collapsed (normalling an indication of the first but not always)

==I Want to Learn To Program==

Some people write mods because they see it as a way of learning to program.  As such a mod can be a fun way to &quot;dip the toe&quot; into the world of programming to see if you like it.  The benefit of this is that writing a small weapons mutator is way more interesting than some dull file processing program.

One thing that this type of person needs to realise is that although most of the concepts available within Unreal Script are directly transferrable to other programming languages - the other languages and environments still need to be learned.

If you start learning to program with UnrealScript remember that it's only a start.  There will be whole areas of programming discipline that you will miss out on.  It's also well worth getting someone else to review the code you've used for your mod.  This will help you not only clean up your programming style but also teach you new (and hopefully more efficient) ways of approaching a given problem.

And finally, if you do fall into this category the Recommended Reading section of the [[Legacy:Making Mods|Making Mods]] page really is just that.  Recommended.

==I want to get my mod published==

This is one of the most problematic reasons to be building a mod.

Statistically speaking, the ratio of working, widely accepted total conversions for FPS games (HL, UT in particular) to the number of ideas out there is very low.  There are maybe 10 HL &quot;large mods&quot; (e.g. DoD, CS, etc.) which have been widely popular, and even fewer UT mods (I can think of only 1 off the top of my head, which is TacOps).

In fact, simply by making a game modification under a EULA and not a professional license, you put yourself in a very strange place to try and get something published.  You are essentially developing new content for a published game for free.  The basics of your game are inherently owned by someone else.  This would be something like trying to build your dream house on someone else's land.

That is not to say mod work won't help you get a job.  In fact, many industry professionals began in the mod community.  There is a lot of blending between the amateur and professional communities these days.  Still, the game industry is relatively small compared to its audience - and that includes modders.  If you are working on a mod because you want this to be your profession - you should realize that just releasing one whiz bang thing isn't going to get you a contract.  Your best bet is to be passionate and professional about what you're doing - just like an employer would want to see.

So if you are working on a mod to get a job be aware that it's not a guaranteed way into the industry. By all means hold to that goal.  If you put enough work in you will most likely succeed eventually.  However it's better that you work on a mod because you enjoy it.

&lt;br /&gt;

'''Nuleo''': Oh come on now.  We all know you just want to eliminate the competition for the Make Something Unreal Contest ;D  I mean half of the people who worked on UT were once modders themselves.  Ok, so if you are just making a minor modification like a mutator something than you won't be the star of the next Gaming Conference but what better way  to demonstrate to game companies that you are capable of producing high quality content than by making a mod (preferrably a Total Conversion).  And anyway, what else are you going to do short of be related to the CEO, show them you're degree?  LOL.

'''RegularX''':  It's the last sentence that's most pertinent.  There are lots of talented people in the mod community - but there are only so many jobs out there.  When mod teams go into a project thinking &quot;we're going to make a bushel of money&quot; (and slowly, they are actually starting to think just that) they generally end up a) worrying about a lot of things completely unrelated to modding (ie lawyers), b) worrying about making a mod that they think will be popular/marketable - not necessarily new and fun or innovative, and most of all c) fail.  

Bottom line - I've worked with some people who were completely professional/perfectionists/etc - and they undoubtably have some good stuff in their portfolio by the end of the day.  But that's not why they were making stuff... 

'''Nuleo''': Well everyone does things because they enjoy it, and if not than thats unfortunate.  And if you can make money doing what you enjoy than thats even better.  I suppose its a matter of opinion and up to each individual &quot;Why I am making a mod&quot; and we just have different opinions.  If you are just making a mod for yourself, some friends, and maybe a few other people to play than yeah, don't expect publicity or money.  But if you think you have the skills and the talent (and the people) to make a truly compelling experience than you should go for broke (again, I am refering to total conversions not small modifications).  From my personal experience, mods don't &quot;fail&quot; because people expect too much but because they expect too little of themselves; They don't take the mod seriously or they make the excuses such as &quot;I don't have enough time&quot; or they can't handle focusing and working hard for the long haul and I guess for some its the get rich quick thing but I think you have to be pretty out of it to believe you are going to make any huge amount of money from a mod in and of itself.  My advice to modders - Keep your feet on the ground but Aim High :D

'''Wormbo:''' &quot;And if you can make money doing what you enjoy than thats even better.&quot; &lt;- But not with UT2003. (Words like &quot;EULA&quot; come to mind...) You can have a lot of publicity without even expecting it, btw.

'''Foxpaw:''' That is true, but a mod can also go commercial if it's popular enough - like counterstrike, tactical ops, or team fortress 2. (I've actually never seen that one in stores, so maybe it got cancelled.) Also there's money to be made in the MSU contest plus if you take the top prize you can make a commercial version of your mod. So I wouldn't say that it's not possible to make money using UT2003.

'''RegularX:''' TF2 was never a mod - but a commercial sequel, the TF team was swallowed up with Half-Life.  But you could count Team Fortress, Counter-Strike, Day of Defeat, Gunman Chronicles, and Tac Ops.  Rumors are floating that Natural Selection will go pro as well.  So that's six mods out of literally hundreds of projects, and most of them due to Valve's desire to keep the Half-Life engine selling past it's expiration date.  Then you could factor in all the individuals who have gotten jobs (ie Epic).

Sure it's certainly beneficial to getting into the industry - but that's not the point.  It's the wrong end to be starting from.  Talented people with a passion for these things are most likely to get a job, whether they join a mod team or not.  People who are scrambling to put code and maps together because they think that they will have the next Counter-Strike and see their game in stores, are (imho) doing the wrong thing for the wrong reasons and as Wormbo pointed out - with the wrong license.

I think the MSUC is walking a fine line between trying to reward mod projects for doing really creative work and trying to get modsters to think about being marketable.  I think it's a great thing, and I love seeing more people get involved in the process - but my guess is that come March 15th, you'll suddenly see a bunch of people magically lose interest in building mod content when they don't have a license to win for anymore.  And that's what I mean by the wrong reasons.

'''Foxpaw:''' I realize that TF2 was never a mod, but what I meant was, making the free mod generated the community that TF2 was going to be marketed to - so that's the commercial connection. I agree that the majority of mod projects won't ever end up making any money. Heck, most mod projects don't even make it to beta stage. I just think that it's inaccurate to say that you can't make money at all doing it.

'''Lilguy:''' I think the last paragraph about making mods for money needs to be renamed/re-thought, perhaps to &quot;I want to get my mod published&quot; First of all, a distinction needs to be made between making a mod with hopes that it will go commercial, and making a mod with hopes that a developer will take notice of your talent and hire you to work on some other game. While the first may be wishful thinking, the second is hands-down the best way to get into the industry &amp;ndash; I'm living proof of that. My Apprehension mod hasn't been released yet, but I was still made an offer from Ravensoft after showing them my code (and of course, my CS degree)

I think it's sort of an elitist attitude that people shouldn't want to make money by modding &amp;ndash; it's OK to want to make your favorite hobby into a carreer. I do agree that making mods that aim to be marketable is a problem, but it's a problem that exists in the industry itself, and can't really be blamed on a contest.

'''RegularX:''' I would agree with your edit suggestion - it makes a more clear distinction between trying to make money by creating a quasi-commercial game and trying to break into the industry by padding your portfolio.  I certainly don't think there's anything wrong with showing off good work to professionals in the hopes of getting hired.  As for the MSUC, I don't blame it for creating the atmosphere (I lay that at Valve's feet) - but I do blame it for encouraging it.  About half way through - Epic paid close attention to marketable mods and got a bit myopic (imho).  I had entered the contest hoping to get some quality feedback from professionals, and mostly what I got was &quot;why don't you get custom models?&quot;  When I asked about altered models for entry into MSUC, the response I got was  &quot;Yes, that's OK - but you know you can't box it like that.&quot; At this point I'm thinking there needs to be a distinction made between trying to mod an engine and trying to setup a development studio without paying for a license.

And I'm not btw, saying that Epic are nothing but greedy bastards trying desperately to churn out a Counter-Strike to be like Valve.  Like I've said, I have pretty mixed feelings about MSUC.  Overall, I think it was great and the community got some awesome, high quality mods and UT2004 got the attention it deserves for being a moddable engine.  

'''EntropicLqd:''' If you are not happy with the page then change it.  It was written at a time (seems an age ago tbh) where there were many many people trying to put mod teams together that were simply setting themselves up to fail - and destroy whatever enthusiasm they had for modding in the process.  Things seem to have calmed down a bit - although to be fair I've been out of the modding scene for over a year now so I don't really know.  To be honest it's nice to see the pages in the [[Legacy:Making Mods|Making Mods]] section getting a bit of attention.

'''RegularX:''' Fine, fine.  I took a stab at it.  I didn't write the original, but I tried to blend what I think was the original intent with a positive vibe on doing good work to get a good job.

'''EntropicLqd:'''Further tweaked.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Mods/Working As A Team</title>
    <id>1851</id>
    <revision>
      <id>4544</id>
      <timestamp>2007-06-09T10:41:16Z</timestamp>
      <contributor>
        <ip>Adsl-75-50-48-92.dsl.spfdmo.sbcglobal.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Working as a Team ==

If you've managed to get this far you are doing well.  You have managed to pull a team of people together to work on a mod.  Your biggest problem now, apart from finishing the mod and getting people to play it, is keeping your team enthused and together.

===Communicate! ===

Good communication is absoloutely key.  The better you get on as a group of people, the stronger your team will be when things get tough.  This is particularly important for mod teams as they are very rarely co-located.

Set up a fixed same time, same place meeting at least once a week, two or three times if you can manage it.  These fixed meetings should be used to report progress and discuss the inevitable problems that crop up.  Keeping these sorts of meetings short is a good idea, but make sure it's either over IRC or voice over IP.  A forum is not a good place for a meeting.

If you have your meetings via IRC, make sure at least one person keeps a log of the meeting.  That way agreements, actions, and changes to the mod are recorded.  If someone doesn't have the log make sure it gets e-mailed to them.

IRC can be very &quot;spammy&quot;.  If you are having a meeting then show some restraint.  Make sure that someone has finished &quot;typing their piece&quot; before leaping in with comments.  While the team is fairly new, never ever insult someone, even if it's in jest.  Written text is often mis-interpreted.  Equally, if you think someone is having a dig at you, keep your fingers off the keyboard and let it pass.  By all means follow up any problems you may have with an e-mail, but be restrained.  Your &quot;attacker&quot; was most likely not intending to cause offence.  As you get to know each other and develop some &quot;trust&quot; this will become less of an issue.

If you use Voice-over-IP (VoIP) to have your meetings, make sure you keep track of the discussions that occur, and make sure that a written record gets sent to everyone involved in the mod &amp;ndash; even if they missed the meeting.

E-mail conversations should be avoided where possible.  They are time consuming and very wasteful of resource.  You will save yourself much pain and frustration if you simply organise an ad-hoc IRC or VoIP meeting.  A discussion on a forum is to be preferred over an e-mail conversation.

Although forums are very poor for meetings they are great for posting meeting records, progress, and non time-critical questions and musings.  Forums are well suited to the discussion of a non time-critical feature for the mod.  If you do use a forum, make sure everyone on the team uses it.  A dead development forum is pointless.  If you have a question or idea that doesn't need an immediate answer then a forum is a better medium of communication than a bunch of e-mails flying backwards and forwards.

If you team members are going to be on-line at different times (because of differences in time zones) then a forum is generally a more practical medium for communication than IRC or VoIP.  In this case team members that have a question about a specific problem they can post it on the forum in the knowledge that by the time they get back on-line the following day some sort of answer will be waiting for them.

It's well worth the teams effort to post little individual progress updates on how things are going.  For example your coder might post an update to say that the primary fire for weapon X is finished.  These small updates may seem somewhat pointless, but they indicate that progress is being made on the mod.  There's nothing worse than working in a vacuum wondering if anyone else is working on the mod or whether it's just you.  Lots of small updates can also provide an element of excitement as well as it indicates that things are being finished.  One of the nicest things about the use of a forum is that you have the time and space to frame your thoughts in their entirety.

And finally a warning.  If your team fails to communicate, it's already dead.

===Some Things to Avoid ===

Do your level best to avoid adding features to the mod while you are writing it.  New features and ideas are bound to occur to you as the mod develops.  This is a natural and good thing.  However, you should observe the following rules.
* Make sure that any changes to the current mod spec are agreed by all members of the team.
* Only add new features if you cannot defer them to a later release.

Many projects fail simply because the number of excellent features required grow faster than they can be written.  When this happens the mod never gets finished.

Respect the other team members responsibilities.  In other words, don't do their work for them.  At best they'll appreciate the extra help.  At worst you will be duplicating work they've already done and create bad feeling.  The most likely outcome is that they'll be a bit annoyed that you've taken &quot;some of their turf&quot;.  There are very few reasons for ever picking up another team member's work and responsibilities.
* They have explicitly requested from help
* They have gone on holiday and know that you may pick up some of their work (because you asked first)
* They have quit the team (hopefully this won't happen).

And never ever tell another member how ''easy'' something is unless you know exactly what you're speaking of. And don't overestimate or underestimate someone. I know that's quite difficult but overestimating someone might put too much pressure on him/her and underestimating might give him the feeling of beeing unimportant or worse, he's thinking of you as a know-it-all.

===Attitude is Everything ===

The team's attitude to the mod and each other is fundamental to the success of the mod.  It is vitally important to attempt to be positive about the mod at all times.  Especially in the later stages of the mod when the team will be sick of the site of it.

Be flexible with each other.  Don't get hung up and stressed with a team member who requests a couple of weeks off.  Everyone needs time to let their batteries recharge once in a while.  Just because you can work non-stop for 20 hours a day every day for seven days a week doesn't mean everyone else can.  Allow team members some real life.  It will help keep the team healthy.

Don't be possessive about your particular set of responsibilities or deliverables.  If you are a week late delivering something, don't get upset if the team asks if you need some help.  Before you flatly refuse the offered help consider the offer carefully.  It may be that you could actually use the help.

The team should try and share as much information with each other as possible.  This provides the team with an excited buzz as all team members can see progress being made, and work happening.  It also means that the team has the opportunity to spot problems and hitches in progress as soon as they start to appear.  If you have more than one developer working within the team then at the very least the developers should walk each other through their code.

It's well worth putting some time into cross training each other.  A team of generalists who have specific areas of expertise is in a much better position to survive the loss of a team member than a team of narrow skilled experts.  Having team members cross train each other will not only bring the team closer together but provide an avenue for people to try things outside of their immediate area of expertise. Besides which, everyone likes learning new stuff.

===Summary ===
* Communicate.
* Be flexible.
* Don't get possessive.
* Communicate.
* Respect other people's areas of responsibility.
* Share all information as much as possible.
* Consider cross training.
* Communicate.

==Discussion==

'''Mychaeel:''' I can ''not'' understand where that apparent antipathy against using forums for &quot;team meetings&quot; in the first paragraphs comes from.  Actually, I'm much more disinclined to use IRC (shortlived, spammy, unstructured, unlinkable) or even Voice-over-IP (not even possible to keep a useful record).  Forums, on the other hand, encourage thoughtful posting, structure, allow for posting additional media such as images, are searchable and are kept around for future referencing. &amp;ndash; I'd like to have this matter discussed before changing anything about the text itself.

'''El Muerte TDS:''' there's also something like a mailig list. It's just not one or the other, using more tha one medium is often better, Forum\Mailing list\NNTP and IRC is a good combination. Sometimes you just fast responses. VoIP is juist chaotic for meetings.

'''EntropicLqd:''' If you don't like it change it.  The reason I don't see a forum as being a good medium for a &quot;meeting&quot; is because it doesn't fit my concept of a meeting.  To me a meeting is a short-lived and immediate discussion between two or more people about a particular subject.  It's the word immediate in my definition that precludes the use of a forum for a meeting.

'''Mychaeel:''' EntropicLqd, I like to make changes an ''educated'' decision, so I like to have a ''discussion'' about what I feel needs a change.  Otherwise I'd just change it.  :-) &amp;ndash; Why is &quot;immediate&quot; such an important thing?  I don't see a mention of that term in the text above either; just a direct transition from &quot;you must communicate&quot; (which without any doubt is true) to &quot;meeting&quot; to &quot;forums bad, IRC good.&quot;  If that's not what the text means to express, it's at the very least misleading.

'''EntropicLqd:''' Immediacy is the very core of a meeting to my mind.  That immediacy and &quot;real time&quot; response is what separates a &quot;discussion&quot; via a forum or e-mail (or whatever) from a &quot;meeting&quot;.  I'm treating them as two distinct concepts.  So, because of my requirement on immediacy for a &quot;meeting&quot; it cannot take place effectively in a forum.  Also, surely part of the requirement of a meeting is that all of the meeting members have to be present and able to communicate at the same time.  Would you call our comments a meeting?  No - because it's not.  We are not &quot;meeting&quot; as such.  We in a discussion with each point occuring at a distinct point in space.  The text above starts with a discussion about meetings.  You can't have a meeting in a forum - but you can have a discussion.  The text certainly doesn't preclude the use of forums - and even encourages it in some cases.  All it really says is that a forum is a bad place for a meeting - which to my mind is a true and valid statement.
: To be fair, when I wrote the page I simply threw down a bunch of stuff that seemed sensible based on experience gained in the work place.  I've never been part of a mod team (there is no requirement for someone who can't even guarantee an hour a night) so my musings above could be complete rubbish.  Looking at the page now it could probably do with some sub-headings splitting out the various forms of communication and discussing the things they are good for.

'''Mychaeel:''' In that case, I argue the importance of having a ''meeting'' to discuss things.  The emphasis is on ''discussing'' things, and I think that forums are by far better suited for that than IRC or VoIP.  Granted, it's a different matter if you actually can meet physically in real life &amp;ndash; but meeting in person also opens the opportunity of using many more communication channels than just speech.

In conclusion, I'd like to have emphasis put on the important of ''discussing'' and ''communicating'' in a team by whichever means is best suited for it, but not necessarily of conducting ''meetings'' for that purpose.  Different communication channels such as forums, IRC, VoIP can be mentioned with their respective advantages and disadvantages.

'''RegularX:''' On the FH Team we use group emails about 90% of the time, with emails usually 2-3 times a week.  We catch up personally on AIM and IRC from time to time but with people across huge time differences and two continents, it's not really feasible (or necessary) to get everyone talking at once.  Communication is key for both keeping everyone up to date with progress and also push the development along, but how that communication takes place is probably up to the team.

'''LegalAssassin:''' All of this text is good, and I think it's something all mods should follow (unless they do already). However, what happens when these basic &quot;rules&quot; are broken by a team member? IMO, the leader, if there's one, should make sure that the rulebreaker either sticks to th plan or is removed from the team. But what do you do when the leader refuses to do this, and, in example, makes drastic changes in the plan because one guy demands it and others already working by the basic plan? And what should you do if you love the mod and the plan, but the lead allows one member of the team call other members &quot;cunt, dick, moron&quot; etc? Also, if you are hired as a mapper, and instead you're doing something else full time in order to help the modellers make the models more accurate (per their request) - should you be considered useless/disposable?

These are rather tough questions, and to be honest I have tried to sort them out for months without getting it quite right (if the general opinion is what can be called &quot;right&quot;). Ideas? Thoughts?

'''EntropicLqd:''' Every book I've ever read on team-structure in IT states pretty much categroically that as soon as you get someone from the &quot;dark-side&quot; in a team you need to lose them fast unless you want the team to pretty much self-destruct - or at the very best their morale sucked out of them.

My own experience bears this reccomendation out.  As soon as you get someone who thinks they are &quot;God's gift&quot;, or someone who is just plain abusive - the team dynamic becomes very defensive.  If that person is not removed then the team over time will become non-productive - spending more time putting defensive barriers in place than actually producing anything.  If that person is not removed then you either live with the misery or leave.  Once one or two people quit it normally opens the floodgates and the innefective leader is left with the prima-donna wondering where the hwll his team went.

In the &quot;business world&quot; it's a little easier to simply get up and go - the very nature of the IT business means that you don't have as much of ''yourself'' invested in the work.  I turned down a job (along with a 20% pay-rise) once because I found out I was going to be working with someone I knew to be a member of the &quot;dark-side&quot; (having worked with them at a different job).  It cost me money in the short-term but I'm 100% convinced that I was happier for it.

In the mod world you are creating something because its fun, using your ''own time''.  And that means that you have a lot of yourself invested in it.  Walking out on that is very hard.  If you can still offset the misery against the satisfaction of producing the mod then good luck.  Its probably easier (and maybe more effective) to organise a mass &quot;strike&quot; until the offender is removed.

In my opinion abuse should not be tolerated.  And if someone is that good then they should be trying to help out and ''pass on'' some knowledge.  Not abusing the troops.

'''Legal:''' Yeah, what strikes me as odd is that this person is actually tolerated by other members of the team. In example, he's a mapper, and as he didn't like the skin of a weapon (which was superb) he decided he could do it better and sent the modeller a &quot;corrected version&quot;, editing 50% of the weapon. The skinner &quot;went back to work on it&quot; (made the original version even a bit better) and put a FINAL-tag on it. The mapper sees it and goes on about what a useless skinner he is, as soon as he's not in the room that is. Once the lead is notified, he gets away with &quot;don't do that&quot;. Still, from what I've heard, the team is supposed to be stable now. I have a rather high tolerance, but the way this person acts and talk shit about people once they leave the room, pretty much remakes the entire mod and makes sure members get fired/quit, I can't really take that. Several people left due to this situation, yet the lead considers this team member invaluable.

What's strange is that he's pretty average, not very good, though very fast. Of course, he's fast as he's allowed to do whatever unlike the other mappers, but still, he's really fast. Now, I don't see why a mapper would be so impossible to replace, but that's not to be discussed here.

The question is, what should I have done different? As you said, I put a lot of time into it, over 100 hours over the past six months doing careful research out of which around what I did in 4 hours was used since the plan was changed. So leaving wasn't much of an option. Any ideas would be nice...

Also, look at my personal page, I'll post something there too (unrelated, sort of).

'''Lilguy:''' What we've used for Apprehension (pretty effectively) is a combination of just about all these different forms of communications. We use Ventrilo (voip) when a few of us are working on a specific coding project or something, or we're testing the game and want to be able to talk about gamplay as we go. We use a mailing list (which I see as another form of forum) for discussing the major issues and answering questions. And on a personal level, we use instant messenger programs to discuss things one-on one, and when people are getting signed up initially.

One other form of communication that we've found critical is the versioning system (we use subversion, but cvs works too). This is sort of implicit communication, since you immediately see exactly what each member is contributing as he checks it in, and also the logs are a sort of progress update that can be searched at any time.

'''Lei-Get:''' Hello. I'm Lei-Get. I have to say that the best rule to follow is actually one that the Bible says to follow: &quot;Treat other people the same way you want them to treat you.&quot; I think this is the most important rule in making a mod. The second being that, &quot;all the team members should work for the same goal&quot;. And the third being, &quot;stay as simple as possible.&quot; -June 9, 2007-</text>
    </revision>
    <revision>
      <id>4545</id>
      <timestamp>2004-12-16T21:45:45Z</timestamp>
      <contributor>
        <ip>Lilguy</ip>
      </contributor>
      <comment>some more comments on communication</comment>
      <text xml:space="preserve">==Working as a Team ==

If you've managed to get this far you are doing well.  You have managed to pull a team of people together to work on a mod.  Your biggest problem now, apart from finishing the mod and getting people to play it, is keeping your team enthused and together.

===Communicate! ===

Good communication is absoloutely key.  The better you get on as a group of people, the stronger your team will be when things get tough.  This is particularly important for mod teams as they are very rarely co-located.

Set up a fixed same time, same place meeting at least once a week, two or three times if you can manage it.  These fixed meetings should be used to report progress and discuss the inevitable problems that crop up.  Keeping these sorts of meetings short is a good idea, but make sure it's either over IRC or voice over IP.  A forum is not a good place for a meeting.

If you have your meetings via IRC, make sure at least one person keeps a log of the meeting.  That way agreements, actions, and changes to the mod are recorded.  If someone doesn't have the log make sure it gets e-mailed to them.

IRC can be very &quot;spammy&quot;.  If you are having a meeting then show some restraint.  Make sure that someone has finished &quot;typing their piece&quot; before leaping in with comments.  While the team is fairly new, never ever insult someone, even if it's in jest.  Written text is often mis-interpreted.  Equally, if you think someone is having a dig at you, keep your fingers off the keyboard and let it pass.  By all means follow up any problems you may have with an e-mail, but be restrained.  Your &quot;attacker&quot; was most likely not intending to cause offence.  As you get to know each other and develop some &quot;trust&quot; this will become less of an issue.

If you use Voice-over-IP (VoIP) to have your meetings, make sure you keep track of the discussions that occur, and make sure that a written record gets sent to everyone involved in the mod &amp;ndash; even if they missed the meeting.

E-mail conversations should be avoided where possible.  They are time consuming and very wasteful of resource.  You will save yourself much pain and frustration if you simply organise an ad-hoc IRC or VoIP meeting.  A discussion on a forum is to be preferred over an e-mail conversation.

Although forums are very poor for meetings they are great for posting meeting records, progress, and non time-critical questions and musings.  Forums are well suited to the discussion of a non time-critical feature for the mod.  If you do use a forum, make sure everyone on the team uses it.  A dead development forum is pointless.  If you have a question or idea that doesn't need an immediate answer then a forum is a better medium of communication than a bunch of e-mails flying backwards and forwards.

If you team members are going to be on-line at different times (because of differences in time zones) then a forum is generally a more practical medium for communication than IRC or VoIP.  In this case team members that have a question about a specific problem they can post it on the forum in the knowledge that by the time they get back on-line the following day some sort of answer will be waiting for them.

It's well worth the teams effort to post little individual progress updates on how things are going.  For example your coder might post an update to say that the primary fire for weapon X is finished.  These small updates may seem somewhat pointless, but they indicate that progress is being made on the mod.  There's nothing worse than working in a vacuum wondering if anyone else is working on the mod or whether it's just you.  Lots of small updates can also provide an element of excitement as well as it indicates that things are being finished.  One of the nicest things about the use of a forum is that you have the time and space to frame your thoughts in their entirety.

And finally a warning.  If your team fails to communicate, it's already dead.

===Some Things to Avoid ===

Do your level best to avoid adding features to the mod while you are writing it.  New features and ideas are bound to occur to you as the mod develops.  This is a natural and good thing.  However, you should observe the following rules.
* Make sure that any changes to the current mod spec are agreed by all members of the team.
* Only add new features if you cannot defer them to a later release.

Many projects fail simply because the number of excellent features required grow faster than they can be written.  When this happens the mod never gets finished.

Respect the other team members responsibilities.  In other words, don't do their work for them.  At best they'll appreciate the extra help.  At worst you will be duplicating work they've already done and create bad feeling.  The most likely outcome is that they'll be a bit annoyed that you've taken &quot;some of their turf&quot;.  There are very few reasons for ever picking up another team member's work and responsibilities.
* They have explicitly requested from help
* They have gone on holiday and know that you may pick up some of their work (because you asked first)
* They have quit the team (hopefully this won't happen).

And never ever tell another member how ''easy'' something is unless you know exactly what you're speaking of. And don't overestimate or underestimate someone. I know that's quite difficult but overestimating someone might put too much pressure on him/her and underestimating might give him the feeling of beeing unimportant or worse, he's thinking of you as a know-it-all.

===Attitude is Everything ===

The team's attitude to the mod and each other is fundamental to the success of the mod.  It is vitally important to attempt to be positive about the mod at all times.  Especially in the later stages of the mod when the team will be sick of the site of it.

Be flexible with each other.  Don't get hung up and stressed with a team member who requests a couple of weeks off.  Everyone needs time to let their batteries recharge once in a while.  Just because you can work non-stop for 20 hours a day every day for seven days a week doesn't mean everyone else can.  Allow team members some real life.  It will help keep the team healthy.

Don't be possessive about your particular set of responsibilities or deliverables.  If you are a week late delivering something, don't get upset if the team asks if you need some help.  Before you flatly refuse the offered help consider the offer carefully.  It may be that you could actually use the help.

The team should try and share as much information with each other as possible.  This provides the team with an excited buzz as all team members can see progress being made, and work happening.  It also means that the team has the opportunity to spot problems and hitches in progress as soon as they start to appear.  If you have more than one developer working within the team then at the very least the developers should walk each other through their code.

It's well worth putting some time into cross training each other.  A team of generalists who have specific areas of expertise is in a much better position to survive the loss of a team member than a team of narrow skilled experts.  Having team members cross train each other will not only bring the team closer together but provide an avenue for people to try things outside of their immediate area of expertise. Besides which, everyone likes learning new stuff.

===Summary ===
* Communicate.
* Be flexible.
* Don't get possessive.
* Communicate.
* Respect other people's areas of responsibility.
* Share all information as much as possible.
* Consider cross training.
* Communicate.

==Discussion==

'''Mychaeel:''' I can ''not'' understand where that apparent antipathy against using forums for &quot;team meetings&quot; in the first paragraphs comes from.  Actually, I'm much more disinclined to use IRC (shortlived, spammy, unstructured, unlinkable) or even Voice-over-IP (not even possible to keep a useful record).  Forums, on the other hand, encourage thoughtful posting, structure, allow for posting additional media such as images, are searchable and are kept around for future referencing. &amp;ndash; I'd like to have this matter discussed before changing anything about the text itself.

'''El Muerte TDS:''' there's also something like a mailig list. It's just not one or the other, using more tha one medium is often better, Forum\Mailing list\NNTP and IRC is a good combination. Sometimes you just fast responses. VoIP is juist chaotic for meetings.

'''EntropicLqd:''' If you don't like it change it.  The reason I don't see a forum as being a good medium for a &quot;meeting&quot; is because it doesn't fit my concept of a meeting.  To me a meeting is a short-lived and immediate discussion between two or more people about a particular subject.  It's the word immediate in my definition that precludes the use of a forum for a meeting.

'''Mychaeel:''' EntropicLqd, I like to make changes an ''educated'' decision, so I like to have a ''discussion'' about what I feel needs a change.  Otherwise I'd just change it.  :-) &amp;ndash; Why is &quot;immediate&quot; such an important thing?  I don't see a mention of that term in the text above either; just a direct transition from &quot;you must communicate&quot; (which without any doubt is true) to &quot;meeting&quot; to &quot;forums bad, IRC good.&quot;  If that's not what the text means to express, it's at the very least misleading.

'''EntropicLqd:''' Immediacy is the very core of a meeting to my mind.  That immediacy and &quot;real time&quot; response is what separates a &quot;discussion&quot; via a forum or e-mail (or whatever) from a &quot;meeting&quot;.  I'm treating them as two distinct concepts.  So, because of my requirement on immediacy for a &quot;meeting&quot; it cannot take place effectively in a forum.  Also, surely part of the requirement of a meeting is that all of the meeting members have to be present and able to communicate at the same time.  Would you call our comments a meeting?  No - because it's not.  We are not &quot;meeting&quot; as such.  We in a discussion with each point occuring at a distinct point in space.  The text above starts with a discussion about meetings.  You can't have a meeting in a forum - but you can have a discussion.  The text certainly doesn't preclude the use of forums - and even encourages it in some cases.  All it really says is that a forum is a bad place for a meeting - which to my mind is a true and valid statement.
: To be fair, when I wrote the page I simply threw down a bunch of stuff that seemed sensible based on experience gained in the work place.  I've never been part of a mod team (there is no requirement for someone who can't even guarantee an hour a night) so my musings above could be complete rubbish.  Looking at the page now it could probably do with some sub-headings splitting out the various forms of communication and discussing the things they are good for.

'''Mychaeel:''' In that case, I argue the importance of having a ''meeting'' to discuss things.  The emphasis is on ''discussing'' things, and I think that forums are by far better suited for that than IRC or VoIP.  Granted, it's a different matter if you actually can meet physically in real life &amp;ndash; but meeting in person also opens the opportunity of using many more communication channels than just speech.

In conclusion, I'd like to have emphasis put on the important of ''discussing'' and ''communicating'' in a team by whichever means is best suited for it, but not necessarily of conducting ''meetings'' for that purpose.  Different communication channels such as forums, IRC, VoIP can be mentioned with their respective advantages and disadvantages.

'''RegularX:''' On the FH Team we use group emails about 90% of the time, with emails usually 2-3 times a week.  We catch up personally on AIM and IRC from time to time but with people across huge time differences and two continents, it's not really feasible (or necessary) to get everyone talking at once.  Communication is key for both keeping everyone up to date with progress and also push the development along, but how that communication takes place is probably up to the team.

'''LegalAssassin:''' All of this text is good, and I think it's something all mods should follow (unless they do already). However, what happens when these basic &quot;rules&quot; are broken by a team member? IMO, the leader, if there's one, should make sure that the rulebreaker either sticks to th plan or is removed from the team. But what do you do when the leader refuses to do this, and, in example, makes drastic changes in the plan because one guy demands it and others already working by the basic plan? And what should you do if you love the mod and the plan, but the lead allows one member of the team call other members &quot;cunt, dick, moron&quot; etc? Also, if you are hired as a mapper, and instead you're doing something else full time in order to help the modellers make the models more accurate (per their request) - should you be considered useless/disposable?

These are rather tough questions, and to be honest I have tried to sort them out for months without getting it quite right (if the general opinion is what can be called &quot;right&quot;). Ideas? Thoughts?

'''EntropicLqd:''' Every book I've ever read on team-structure in IT states pretty much categroically that as soon as you get someone from the &quot;dark-side&quot; in a team you need to lose them fast unless you want the team to pretty much self-destruct - or at the very best their morale sucked out of them.

My own experience bears this reccomendation out.  As soon as you get someone who thinks they are &quot;God's gift&quot;, or someone who is just plain abusive - the team dynamic becomes very defensive.  If that person is not removed then the team over time will become non-productive - spending more time putting defensive barriers in place than actually producing anything.  If that person is not removed then you either live with the misery or leave.  Once one or two people quit it normally opens the floodgates and the innefective leader is left with the prima-donna wondering where the hwll his team went.

In the &quot;business world&quot; it's a little easier to simply get up and go - the very nature of the IT business means that you don't have as much of ''yourself'' invested in the work.  I turned down a job (along with a 20% pay-rise) once because I found out I was going to be working with someone I knew to be a member of the &quot;dark-side&quot; (having worked with them at a different job).  It cost me money in the short-term but I'm 100% convinced that I was happier for it.

In the mod world you are creating something because its fun, using your ''own time''.  And that means that you have a lot of yourself invested in it.  Walking out on that is very hard.  If you can still offset the misery against the satisfaction of producing the mod then good luck.  Its probably easier (and maybe more effective) to organise a mass &quot;strike&quot; until the offender is removed.

In my opinion abuse should not be tolerated.  And if someone is that good then they should be trying to help out and ''pass on'' some knowledge.  Not abusing the troops.

'''Legal:''' Yeah, what strikes me as odd is that this person is actually tolerated by other members of the team. In example, he's a mapper, and as he didn't like the skin of a weapon (which was superb) he decided he could do it better and sent the modeller a &quot;corrected version&quot;, editing 50% of the weapon. The skinner &quot;went back to work on it&quot; (made the original version even a bit better) and put a FINAL-tag on it. The mapper sees it and goes on about what a useless skinner he is, as soon as he's not in the room that is. Once the lead is notified, he gets away with &quot;don't do that&quot;. Still, from what I've heard, the team is supposed to be stable now. I have a rather high tolerance, but the way this person acts and talk shit about people once they leave the room, pretty much remakes the entire mod and makes sure members get fired/quit, I can't really take that. Several people left due to this situation, yet the lead considers this team member invaluable.

What's strange is that he's pretty average, not very good, though very fast. Of course, he's fast as he's allowed to do whatever unlike the other mappers, but still, he's really fast. Now, I don't see why a mapper would be so impossible to replace, but that's not to be discussed here.

The question is, what should I have done different? As you said, I put a lot of time into it, over 100 hours over the past six months doing careful research out of which around what I did in 4 hours was used since the plan was changed. So leaving wasn't much of an option. Any ideas would be nice...

Also, look at my personal page, I'll post something there too (unrelated, sort of).

'''Lilguy:''' What we've used for Apprehension (pretty effectively) is a combination of just about all these different forms of communications. We use Ventrilo (voip) when a few of us are working on a specific coding project or something, or we're testing the game and want to be able to talk about gamplay as we go. We use a mailing list (which I see as another form of forum) for discussing the major issues and answering questions. And on a personal level, we use instant messenger programs to discuss things one-on one, and when people are getting signed up initially.

One other form of communication that we've found critical is the versioning system (we use subversion, but cvs works too). This is sort of implicit communication, since you immediately see exactly what each member is contributing as he checks it in, and also the logs are a sort of progress update that can be searched at any time.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Multi-Story Elevators</title>
    <id>2103</id>
    <revision>
      <id>5124</id>
      <timestamp>2007-05-18T20:01:56Z</timestamp>
      <contributor>
        <ip>Evan E</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">There are several important things you should keep in mind:
* DM-Gridb2 style elevators cannot be used by bots, since they don't understand that the elevator CAN'T stop, they'll wait forever.
* These elevators can't move quickly, or players would be able to get inside the shaft, and that's not fun.
* I don't know if this can be reworked to function in UT, but with a little experience, it wouldn't be too difficult.

This is advanced stuff, so I'm expecting you know how to make a simple level out of subtract [[Legacy:Brush|brushes]], and convert basic brushes into [[Legacy:Static Mesh|static meshes]]. I will be using the static meshes I made for DM-Gridb2, but this can be done with any configuration of meshes with simple logic.

==Step One:==

Make something that basically looks like this:

[[Image:Legacy_pdGrid1.jpeg|center|See, not too difficult! Just don't play with fire.]]

==Step Two:==

Now that we have our backwards Z thing, we need to add the elevator. Go find a nice elevator [[Legacy:Static Mesh|static mesh]].

[[Image:Legacy_pdGrid2.jpeg|center|Now don't start Fappin' yet.. you still need to convert it to a [[Legacy:Mover|Mover]].]]

==Step Three==

Now, you should know how to place a mover in the level; if you don't, go back to [[Legacy:Mover|Mover]]. Place it at the bottom floor, then make the second keyframe at the top floor.

[[Image:Legacy_pdGrid3.jpeg|center|These settings can be changed, but for the sake of my sanity, these are the settings I'll be using.]]

It's important to make the lift crush players on encroach, incase they get ''inside'' the shaft. It might be also useful to place volumes that destroy actors who fall into them at the bottom of the shaft.

==Step Four==

Let's make some doors. Take some door meshes and place them blocking the top and bottom, if you want to be '''really''' crafty, you could attach another set to the lift itself, but thats if you want to be '''super''' realistic. :P Now, give the set of doors the tag &quot;topdoors&quot; and &quot;bottomdoors&quot; respectively.

[[Image:Legacy_pdGrid4.jpeg|center|That should say TRIGGERCONTROL not TRIGGERPOUND.]]

==Step Five==

It's time to make the triggers for the doors. Place the top trigger ''just'' below where the top elevator will stop, and place the bottom trigger just ''above'' where the bottom of the elevator will stop. Set their events respectively and copy the settings I have in the screenshot.

[[Image:Legacy_pdGrid5-2.jpeg|center|Almost finished with the mechanics!]]

Now you should have a CRAPPY but working elevator, now go back and do some fine tweaking.

==Conclusion===

If you were following this tutorial correctly, you shouldn't have the the slightest idea how this works, here's the rundown:
* The elevator is triggered by walking on to it and it moves to the second floor. This will trigger:
** The lift. It will leave the bottom.
** Bottom trigger, it closes the door.
* The lift makes it to the top, triggering:
** The top [[Legacy:Trigger|Trigger]], opening the TOP doors.
** When it leaves it closes the doors.

Now that you understand the theory, you can move on to:
** Add a second set of doors attached to the lift.
** make a DM-gridb2 style elevator
** Use buttons to to trigger the lift

Oh, and I'm yet to tell you how to make this a DM-Gridb2 style elevator, its simple:
* make the mover loop
* set the keyframes as:
** bottom
** bottom
** top
** top
* and set the move time to something big... like 15 seconds. 

==Related Topics==
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

'''(Author):''' If you come up with any ideas that you could make with this system, add them below.

'''Mosquito:''' YARG!! finished this tut, with hickup no less!

'''Legal:''' Erm, I don't care about if you had hickups when you wrote this... I just want to know how. Well, not me, but whoever read it ;) [Cleaned up]

'''dUc0N:''' Those are indeed some sexyfied doors y'have there :P

'''Timster:''' this rokz

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5125</id>
      <timestamp>2005-04-24T19:40:52Z</timestamp>
      <contributor>
        <ip>213.177.251.156.adsl.griffin.net.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There are several important things you should keep in mind:
* DM-Gridb2 style elevators cannot be used by bots, since they don't understand that the elevator CAN'T stop, they'll wait forever.
* These elevators can't move quickly, or players would be able to get inside the shaft, and that's not fun.
* I don't know if this can be reworked to function in UT, but with a little experience, it wouldn't be too difficult.

This is advanced stuff, so I'm expecting you know how to make a simple level out of subtract [[Legacy:Brush|brushes]], and convert basic brushes into [[Legacy:Static Mesh|static meshes]]. I will be using the static meshes I made for DM-Gridb2, but this can be done with any configuration of meshes with simple logic.

==Step One:==

Make something that basically looks like this:

[[Image:Legacy_pdGrid1.jpeg|center|See, not too difficult! Just don't play with fire.]]

==Step Two:==

Now that we have our sexy backwards Z thing, we need to add the elevator. Go find a nice elevator [[Legacy:Static Mesh|static mesh]].

[[Image:Legacy_pdGrid2.jpeg|center|Now don't start Fappin' yet.. you still need to convert it to a [[Legacy:Mover|Mover]].]]

==Step Three==

Now, you should know how to place a mover in the level; if you don't, go back to [[Legacy:Mover|Mover]]. Place it at the bottom floor, then make the second keyframe at the top floor.

[[Image:Legacy_pdGrid3.jpeg|center|These settings can be changed, but for the sake of my sanity, these are the settings I'll be using.]]

It's important to make the lift crush players on encroach, incase they get ''inside'' the shaft. It might be also useful to place volumes that destroy actors who fall into them at the bottom of the shaft.

==Step Four==

Let's make some doors. Take some sexy door meshes and place them blocking the top and bottom, if you want to be '''really''' crafty, you could attach another set to the lift itself, but thats if you want to be '''super''' realistic. :P Now, give the set of doors the tag &quot;topdoors&quot; and &quot;bottomdoors&quot; respectively.

[[Image:Legacy_pdGrid4.jpeg|center|That should say TRIGGERCONTROL not TRIGGERPOUND.]]

==Step Five==

It's time to make the triggers for the doors. Place the top trigger ''just'' below where the top elevator will stop, and place the bottom trigger just ''above'' where the bottom of the elevator will stop. Set their events respectively and copy the settings I have in the screenshot.

[[Image:Legacy_pdGrid5-2.jpeg|center|Almost finished with the mechanics!]]

Now you should have a CRAPPY but working elevator, now go back and do some fine tweaking.

==Conclusion===

If you were following this tutorial correctly, you shouldn't have the the slightest idea how this works, here's the rundown:
* The elevator is triggered by walking on to it and it moves to the second floor. This will trigger:
** The lift. It will leave the bottom.
** Bottom trigger, it closes the door.
* The lift makes it to the top, triggering:
** The top [[Legacy:Trigger|Trigger]], opening the TOP doors.
** When it leaves it closes the doors.

Now that you understand the theory, you can move on to:
** Add a second set of doors attached to the lift.
** make a DM-gridb2 style elevator
** Use buttons to to trigger the lift

Oh, and I'm yet to tell you how to make this a DM-Gridb2 style elevator, its simple:
* make the mover loop
* set the keyframes as:
** bottom
** bottom
** top
** top
* and set the move time to something big... like 15 seconds. 

===Discussion===

if you come up with any ideas that you could make with this system, add them below.

'''Mosquito:''' YARG!! finished this tut, with hickup no less!

'''Legal:''' Erm, I don't care about if you had hickups when you wrote this... I just want to know how. Well, not me, but whoever read it ;) [Cleaned up]

'''dUc0N:''' Those are indeed some sexyfied doors y'have there :P

Timster:this rokz

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]&lt;br /&gt;[[:Category:Legacy Tutorial]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5126</id>
      <timestamp>2006-01-06T17:46:09Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">There are several important things you should keep in mind:
* DM-Gridb2 style elevators cannot be used by bots, since they don't understand that the elevator CAN'T stop, they'll wait forever.
* These elevators can't move quickly, or players would be able to get inside the shaft, and that's not fun.
* I don't know if this can be reworked to function in UT, but with a little experience, it wouldn't be too difficult.

This is advanced stuff, so I'm expecting you know how to make a simple level out of subtract [[Legacy:Brush|brushes]], and convert basic brushes into [[Legacy:Static Mesh|static meshes]]. I will be using the static meshes I made for DM-Gridb2, but this can be done with any configuration of meshes with simple logic.

==Step One:==

Make something that basically looks like this:

[[Image:Legacy_pdGrid1.jpeg|center|See, not too difficult! Just don't play with fire.]]

==Step Two:==

Now that we have our sexy backwards Z thing, we need to add the elevator. Go find a nice elevator [[Legacy:Static Mesh|static mesh]].

[[Image:Legacy_pdGrid2.jpeg|center|Now don't start Fappin' yet.. you still need to convert it to a [[Legacy:Mover|Mover]].]]

==Step Three==

Now, you should know how to place a mover in the level; if you don't, go back to [[Legacy:Mover|Mover]]. Place it at the bottom floor, then make the second keyframe at the top floor.

[[Image:Legacy_pdGrid3.jpeg|center|These settings can be changed, but for the sake of my sanity, these are the settings I'll be using.]]

It's important to make the lift crush players on encroach, incase they get ''inside'' the shaft. It might be also useful to place volumes that destroy actors who fall into them at the bottom of the shaft.

==Step Four==

Let's make some doors. Take some sexy door meshes and place them blocking the top and bottom, if you want to be '''really''' crafty, you could attach another set to the lift itself, but thats if you want to be '''super''' realistic. :P Now, give the set of doors the tag &quot;topdoors&quot; and &quot;bottomdoors&quot; respectively.

[[Image:Legacy_pdGrid4.jpeg|center|That should say TRIGGERCONTROL not TRIGGERPOUND.]]

==Step Five==

It's time to make the triggers for the doors. Place the top trigger ''just'' below where the top elevator will stop, and place the bottom trigger just ''above'' where the bottom of the elevator will stop. Set their events respectively and copy the settings I have in the screenshot.

[[Image:Legacy_pdGrid5-2.jpeg|center|Almost finished with the mechanics!]]

Now you should have a CRAPPY but working elevator, now go back and do some fine tweaking.

==Conclusion===

If you were following this tutorial correctly, you shouldn't have the the slightest idea how this works, here's the rundown:
* The elevator is triggered by walking on to it and it moves to the second floor. This will trigger:
** The lift. It will leave the bottom.
** Bottom trigger, it closes the door.
* The lift makes it to the top, triggering:
** The top [[Legacy:Trigger|Trigger]], opening the TOP doors.
** When it leaves it closes the doors.

Now that you understand the theory, you can move on to:
** Add a second set of doors attached to the lift.
** make a DM-gridb2 style elevator
** Use buttons to to trigger the lift

Oh, and I'm yet to tell you how to make this a DM-Gridb2 style elevator, its simple:
* make the mover loop
* set the keyframes as:
** bottom
** bottom
** top
** top
* and set the move time to something big... like 15 seconds. 

==Related Topics==
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

'''(Author):''' If you come up with any ideas that you could make with this system, add them below.

'''Mosquito:''' YARG!! finished this tut, with hickup no less!

'''Legal:''' Erm, I don't care about if you had hickups when you wrote this... I just want to know how. Well, not me, but whoever read it ;) [Cleaned up]

'''dUc0N:''' Those are indeed some sexyfied doors y'have there :P

'''Timster:''' this rokz

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32373</id>
      <timestamp>2008-07-15T00:02:06Z</timestamp>
      <contributor>
        <username>WarChicken</username>
        <id>962</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">There are several important things you should keep in mind:
* DM-Gridb2 style elevators cannot be used by bots, since they don't understand that the elevator CAN'T stop, they'll wait forever.
* These elevators can't move quickly, or players would be able to get inside the shaft, and that's not fun.
* I don't know if this can be reworked to function in UT, but with a little experience, it wouldn't be too difficult.

This is advanced stuff, so I'm expecting you know how to make a simple level out of subtract [[Legacy:Brush|brushes]], and convert basic brushes into [[Legacy:Static Mesh|static meshes]]. I will be using the static meshes I made for DM-Gridb2, but this can be done with any configuration of meshes with simple logic.

==Step One:==

Make something that basically looks like this:

[[Image:Legacy_pdGrid1.jpeg|center|See, not too difficult! Just don't play with fire.]]

==Step Two:==

Now that we have our backwards Z thing, we need to add the elevator. Go find a nice elevator [[Legacy:Static Mesh|static mesh]].

[[Image:Legacy_pdGrid2.jpeg|center|Now don't start Fappin' yet.. you still need to convert it to a [[Legacy:Mover|Mover]].]]

==Step Three==

Now, you should know how to place a mover in the level; if you don't, go back to [[Legacy:Mover|Mover]]. Place it at the bottom floor, then make the second keyframe at the top floor.

[[Image:Legacy_pdGrid3.jpeg|center|These settings can be changed, but for the sake of my sanity, these are the settings I'll be using.]]

It's important to make the lift crush players on encroach, incase they get ''inside'' the shaft. It might be also useful to place volumes that destroy actors who fall into them at the bottom of the shaft.

==Step Four==

Let's make some doors. Take some door meshes and place them blocking the top and bottom, if you want to be '''really''' crafty, you could attach another set to the lift itself, but thats if you want to be '''super''' realistic. :P Now, give the set of doors the tag &quot;topdoors&quot; and &quot;bottomdoors&quot; respectively.

[[Image:Legacy_pdGrid4.jpeg|center|That should say TRIGGERCONTROL not TRIGGERPOUND.]]

==Step Five==

It's time to make the triggers for the doors. Place the top trigger ''just'' below where the top elevator will stop, and place the bottom trigger just ''above'' where the bottom of the elevator will stop. Set their events respectively and copy the settings I have in the screenshot.

[[Image:Legacy_pdGrid5-2.jpeg|center|Almost finished with the mechanics!]]

Now you should have a CRAPPY but working elevator, now go back and do some fine tweaking.

==Conclusion===

If you were following this tutorial correctly, you shouldn't have the the slightest idea how this works, here's the rundown:
* The elevator is triggered by walking on to it and it moves to the second floor. This will trigger:
** The lift. It will leave the bottom.
** Bottom trigger, it closes the door.
* The lift makes it to the top, triggering:
** The top [[Legacy:Trigger|Trigger]], opening the TOP doors.
** When it leaves it closes the doors.

Now that you understand the theory, you can move on to:
** Add a second set of doors attached to the lift.
** make a DM-gridb2 style elevator
** Use buttons to to trigger the lift

Oh, and I'm yet to tell you how to make this a DM-Gridb2 style elevator, its simple:
* make the mover loop
* set the keyframes as:
** bottom
** bottom
** top
** top
* and set the move time to something big... like 15 seconds. 

==Related Topics==
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* [[Legacy:Mover Topics|Mover Topics]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

'''WarChicken:''' When I read &quot;Multi-Story&quot;, I thought it's about more than two. So here's my Problem: Having a mover that has 3 Keyframes and having it set to stay open 2 seconds, it holds on the 1st floor just to instantly restart traveling to the 2nd floor. How do I make an elevator that stays open 2 seconds on every floor it stops?

'''(Author):''' If you come up with any ideas that you could make with this system, add them below.

'''Mosquito:''' YARG!! finished this tut, with hickup no less!

'''Legal:''' Erm, I don't care about if you had hickups when you wrote this... I just want to know how. Well, not me, but whoever read it ;) [Cleaned up]

'''dUc0N:''' Those are indeed some sexyfied doors y'have there :P

'''Timster:''' this rokz

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making New Input Commands</title>
    <id>2155</id>
    <revision>
      <id>5247</id>
      <timestamp>2004-10-31T13:14:15Z</timestamp>
      <contributor>
        <ip>Host217-44-152-152.range217-44.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Tutorial: Making new input commands [Written for UT2004 but it should work in UT2003/UT99]

Author: James Tan aka Solid Snake

Last update: 27/5/2004

===Introduction===

Sometimes when you are making a new game/mod it is possible that you may need to add in extra keys to allow the player to do more things at once. Adding these into the Unreal engine is very easy, although the way it actually works is a little strange at first, but hopefully after this tutorial it should be no problems.

===Toggle input===

Togglet inputs are ones that the user simply had to push the button and Unreal will do something. There are no special conditions for these types of inputs as well as the fact that these are the most simplistic types of inputs. These keys are things such as Esc for the menu, or F4 for the first person camera view. To add these into Unreal is a two step process, the first step is to make the exec function within a player owned class and then making a physical bind between Unreal and the user through the User.ini.

Step 1: Making the exec function

&lt;uscript&gt;
exec function OpenMenu(optional float F)
{
  if(F == 1)
    // Run this line.
  else
    // Run this line.
}
&lt;/uscript&gt;

Step 2: Editing the user.ini.

From here, you now need to assign a key to this function. Simply open up the user.ini file, and look for a free key. An example is something like 'B='. Just add in your function name, so it looks like 'B=OpenMenu'. Now when you press B, it will run your function, provided that the player is controlling the class which has this function defined in it. Note that I have added an optional float in the syntax of the function. To parse a value into the function, simple write the number like so, 'B=OpenMenu 1'. That way you can have multiple keys which all do similar things but you can differentiate between the keys. This is how weapon switching is done.

===Sustained inputs===

Sustained are useful when you want to know if the player is holding onto a key or not, so these would encompasses movement type keys, time dependent keys and weapon related keys. Basically, if you need a key which requires the player to hold onto the key then this is where you want it to be. However this is a little but more complicated as such, since more scripts will need to be created. This of course is just the way I do it, and there can be more than one way.

Step 1: Making your input variable

&lt;uscript&gt;
var input byte bHoldMenu;
&lt;/uscript&gt;

This should go in a class which the player has control of, thus the immediately obvious ones are ones such as PlayerController. Now, what we need to do is to monitor this value. We don't have to do anything else other than that, since Unreal will automatically alter this variable when a key is pressed.

Step 2: Monitoring your new input variable.

&lt;uscript&gt;
function PlayerTick(float DeltaTime)
{
  Super.PlayerTick(DeltaTime);
  if(bHoldMenu == 1)
    // Key pressed down/held down. Run this line.
  else
    // Key released or not pressed. Run this line.
}
&lt;/uscript&gt;

As you can see here, I have monitored the input variable in the PlayerTick function which is of course in my own PlayerController class.

Step 3: Assigning a key to your new input variable.

Now, open up your User.ini file and append to the current ... Argh I forgot this! Will update when I remember or have a user.ini in front of me. 

For those that kind of know what I mean, you have to make a new command and bind it to an alias. You then bind a key to the alias and not the input variable.

-Still needs work!-
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5248</id>
      <timestamp>2004-07-21T09:31:43Z</timestamp>
      <contributor>
        <ip>Student-3.networking.otago.ac.nz</ip>
      </contributor>
      <comment>Updated, nearly completed...</comment>
      <text xml:space="preserve">Tutorial: Making new input commands [Written for UT2004 but it should work in UT2003/UT99]

Author: James Tan aka Solid Snake

Last update: 27/5/2004

===Introduction===

Sometimes when you are making a new game/mod it is possible that you may need to add in extra keys to allow the player to do more things at once. Adding these into the Unreal engine is very easy, although the way it actually works is a little strange at first, but hopefully after this tutorial it should be no problems.

===Toggle input===

Togglet inputs are ones that the user simply had to push the button and Unreal will do something. There are no special conditions for these types of inputs as well as the fact that these are the most simplistic types of inputs. These keys are things such as Esc for the menu, or F4 for the first person camera view. To add these into Unreal is a two step process, the first step is to make the exec function within a player owned class and then making a physical bind between Unreal and the user through the User.ini.

Step 1: Making the exec function

&lt;uscript&gt;
exec function OpenMenu(optional float F)
{
  if(F == 1)
    // Run this line.
  else
    // Run this line.
}
&lt;/uscript&gt;

Step 2: Editing the user.ini.

From here, you now need to assign a key to this function. Simply open up the user.ini file, and look for a free key. An example is something like 'B='. Just add in your function name, so it looks like 'B=OpenMenu'. Now when you press B, it will run your function, provided that the player is controlling the class which has this function defined in it. Note that I have added an optional float in the syntax of the function. To parse a value into the function, simple write the number like so, 'B=OpenMenu 1'. That way you can have multiple keys which all do similar things but you can differentiate between the keys. This is how weapon switching is done.

===Sustained inputs===

Sustained are useful when you want to know if the player is holding onto a key or not, so these would encompasses movement type keys, time dependent keys and weapon related keys. Basically, if you need a key which requires the player to hold onto the key then this is where you want it to be. However this is a little but more complicated as such, since more scripts will need to be created. This of course is just the way I do it, and there can be more than one way.

Step 1: Making your input variable

&lt;uscript&gt;
var input byte bHoldMenu;
&lt;/uscript&gt;

This should go in a class which the player has control of, thus the immediately obvious ones are ones such as PlayerController. Now, what we need to do is to monitor this value. We don't have to do anything else other than that, since Unreal will automatically alter this variable when a key is pressed.

Step 2: Monitoring your new input variable.

&lt;uscript&gt;
function PlayerTick(float DeltaTime)
{
  Super.PlayerTick(DeltaTime)
  if(bHoldMenu == 1)
    // Key pressed down/held down. Run this line.
  else
    // Key released or not pressed. Run this line.
}
&lt;/uscript&gt;

As you can see here, I have monitored the input variable in the PlayerTick function which is of course in my own PlayerController class.

Step 3: Assigning a key to your new input variable.

Now, open up your User.ini file and append to the current ... Argh I forgot this! Will update when I remember or have a user.ini in front of me. 

For those that kind of know what I mean, you have to make a new command and bind it to an alias. You then bind a key to the alias and not the input variable.

-Still needs work!-
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Ramps</title>
    <id>1815</id>
    <revision>
      <id>4454</id>
      <timestamp>2003-12-11T18:45:50Z</timestamp>
      <contributor>
        <ip>Weird Al</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A quick pictorial guide on ramp-making techniques

==Vertex Edited Ramps==

===Assumtions===

I'm assuming here that you already know how to.
* Select Brushes
* Add and [[Legacy:Subtract|Subtract]] stuff
* Know your way around the UnrealEd [[Legacy:Toolbox|toolbox]].

[[Image:Legacy_rampmake01.gif|right|]]

'''''These type of ramps are useful for making sloping coridors between rooms mainly, but once you get the hang of the technique, you can apply it to all manner of potential uses.'''''

===Selecting the vertices on the cube===

*First off, you'll need a cube.

*Click the [[Image:Legacy_button.mode.vertex.gif|]] button to switch to [[Legacy:Vertex Editing|vertex editing]] mode.

*Select the lower corner in either of the side views.

*Hold CTRL+ALT+LeftMouse and Drag to make a selection rectangle around the lower corner as seen in the first image.

'Make sure the brush is selected when you do this, otherwise the vertices won't be selected.'

[[Image:Legacy_rampmake02.gif|right|]]

===Draging the selected vertices on the cube.===

'''Now you've selected the vertices, you'll want to drag them down to make your ramp.'''

*Hold CTRL+LeftMouse and Drag downwards. ''You should keep the [[Legacy:Grid|Grid]] at least 16[[Legacy:UU|UU]] or preferably 64[[Legacy:UU|UU]] to keep the angles neat for saving on those nasty [[Legacy:BSP Hole|BSP Hole]]s. ''

In the example I've used a [[Legacy:Grid|Grid]]Size of 16 and dragged the vertices to make a nice 1:2 gradient slope. '''Note:''' ''Try and keep slopes less than 45 degrees, anything more becomes difficult for bots to negotiate.''

[[Image:Legacy_rampmake03.gif|right|]]

===Subtracting the brush.===

If you've got your ramp the way you want it looking, simply subtract and texture! :)

I've just done a simple example here, but there are plenty more things you can do by simply moving the

ends of a cube around, from making sloped walkways, corridors that slope at both ends.. Many, many possible permutations on the simple technique.

Check out the [[Legacy:Vertex Editing|Vertex Editing]] page to find out more on the subject, or alternatively, scroll some more to find out about [[Legacy:Brush Clipping|Brush Clipping]] to get those ramps.

==Brush Clipped Ramps==

''Starting with a basic cuboid 64x256x256''

[[Image:Legacy_rampmake04.gif|center|]]

*Select the [[Legacy:Brush Clipping|Brush Clipping]] tool [[Image:Legacy_button.mode.clip.gif|]] 

*Click the vertices as demonstrated in the second picture, you should get a little pin icon to mark where the clipping line will start and end.

[[Image:Legacy_rampmake05.gif|center|]]

*In this picture I have placed the two clipping markers and flipped the clipping normal (the line pointing perpendicular to the clip plane to illustrate which side of the brush will be lopped off.)
*Use the [[Image:Legacy_button_flip_clip.gif|]] button to flip the line and choose which side you want to remove.  

[[Image:Legacy_rampmake06.gif|center|]]

*In this picture I've now clicked the [[Image:Legacy_button_brush_clip.gif|]] button and chopped off the top of the cuboid to make a triangular prism shape. If it doesn't work, chances are you've managed to deselect the builder brush. Click on it again to get it bright red and try again.

[[Image:Legacy_rampmake07.gif|center|]]

*The brush has now been added and the Cube Builder has been reset.

[[Image:Legacy_rampmake08.gif|center|]]

*The fantastic ramp in all its glory. Obviously after practice you'll be making something a bit more interesting that this pie-slice example. :D

Happy Clipping..

For more info on brush clipping, see [[Legacy:Brush Clipping|Brush Clipping]]

==Related Topics ==
* Reference for the [[Legacy:Toolbox|Toolbox]] 
* [[Legacy:UnrealEd Interface|UnrealEd interface]]
* [[Legacy:Architecture|Architecture]] topics
* [[Legacy:Making Ramps|Making Ramps]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4455</id>
      <timestamp>2003-12-10T14:31:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A quick pictorial guide on ramp-making techniques

==Vertex Edited Ramps==

===Assumtions===

I'm assuming here that you already know how to.
* Select Brushes
* Add and [[Legacy:Subtract|Subtract]] stuff
* Know your way around the UnrealEd [[Legacy:Toolbox|toolbox]].

[[Image:Legacy_rampmake01.gif|right|]]

'''''These type of ramps are useful for making sloping coridors between rooms mainly, but once you get the hang of the technique, you can apply it to all manner of potential uses.'''''

===Selecting the vertices on the cube===

*First off, you'll need a cube.

*Click the [[Image:Legacy_button.mode.vertex.gif|]] button to switch to [[Legacy:Vertex Editing|vertex editing]] mode.

*Select the lower corner in either of the side views.

*Hold CTRL+ALT+LeftMouse and Drag to make a selection rectangle around the lower corner as seen in the first image.

'Make sure the brush is selected when you do this, otherwise the vertices won't be selected.'

[[Image:Legacy_rampmake02.gif|right|]]

===Draging the selected vertices on the cube.===

'''Now you've selected the vertices, you'll want to drag them down to make your ramp.'''

*Hold CTRL+LeftMouse and Drag downwards. ''You should keep the [[Legacy:Grid|Grid]] at least 16[[Legacy:UU|UU]] or preferably 64[[Legacy:UU|UU]] to keep the angles neat for saving on those nasty [[Legacy:BSP Hole|BSP Hole]]s. ''

In the example I've used a [[Legacy:Grid|Grid]]Size of 16 and dragged the vertices to make a nice 1:2 gradient slope. '''Note:''' ''Try and keep slopes less than 45 degrees, anything more becomes difficult for bots to negotiate.''

[[Image:Legacy_rampmake03.gif|right|]]

===Subtracting the brush.===

If you've got your ramp the way you want it looking, simply subtract and texture! :)

I've just done a simple example here, but there are plenty more things you can do by simply moving the

ends of a cube around, from making sloped walkways, corridors that slope at both ends.. Many, many possible permutations on the simple technique.

Check out the [[Legacy:Vertex Editing|Vertex Editing]] page to find out more on the subject, or alternatively, scroll some more to find out about [[Legacy:Brush Clipping|Brush Clipping]] to get those ramps.

==Brush Clipped Ramps==

''Starting with a basic cuboid 64x256x256''

[[Image:Legacy_rampmake04.gif|center|]]

*Select the [[Legacy:Brush Clipping|Brush Clipping]] tool [[Image:Legacy_button.mode.clip.gif|]] 

*Click the vertices as demonstrated in the second picture, you should get a little pin icon to mark where the clipping line will start and end.

[[Image:Legacy_rampmake05.gif|center|]]

*In this picture I have placed the two clipping markers and flipped the clipping normal (the line pointing perpendicular to the clip plane to illustrate which side of the brush will be lopped off.)
*Use the [[Image:Legacy_button_flip_clip.gif|]] button to flip the line and choose which side you want to remove.  

[[Image:Legacy_rampmake06.gif|center|]]

*In this picture I've now clicked the [[Image:Legacy_button_brush_clip.gif|]] button and chopped off the top of the cuboid to make a triangular prism shape. 

[[Image:Legacy_rampmake07.gif|center|]]

*The brush has now been added and the Cube Builder has been reset.

[[Image:Legacy_rampmake08.gif|center|]]

*The fantastic ramp in all its glory. Obviously after practice you'll be making something a bit more interesting that this pie-slice example. :D

Happy Clipping..

For more info on brush clipping, see [[Legacy:Brush Clipping|Brush Clipping]]

==Related Topics ==
* Reference for the [[Legacy:Toolbox|Toolbox]] 
* [[Legacy:UnrealEd Interface|UnrealEd interface]]
* [[Legacy:Architecture|Architecture]] topics
* [[Legacy:Making Ramps|Making Ramps]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Screenshots</title>
    <id>2215</id>
    <revision>
      <id>5362</id>
      <timestamp>2006-09-13T13:02:57Z</timestamp>
      <contributor>
        <ip>Webcache00.lnd.ops.eu.uu.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Taking a Screenshot in Unreal Tournament ==

Play your map in Unreal Tournament. 

===Set the scene===

Depending on whether you want images for the map thumbnail or action shots, bots are a consideration:

* To remove bots from the game, enter &lt;code&gt;killpawns&lt;/code&gt; in the console.
* To freeze bots in a good position, allowing you to move around and try different angles of shot, enter &lt;code&gt;playersonly&lt;/code&gt; in the console.

===Clear the View ===

To get a clear view, either set &quot;Play as Spectator&quot; under Player Options before starting the practise session, or remove the HUD manually.

# To remove the HUD, do one of the following:
#* Press the &lt;code&gt;-&lt;/code&gt; (minus) key until your HUD completely disappears.
#* Set &quot;Play as Spectator&quot; under Player Options before starting the practice session
#* You can also remove the HUD just temporarily without changing your configuration by entering the following two console commands:&lt;pre&gt;  set PlayerPawn HUDType None
  set PlayerPawn myHUD None&lt;/pre&gt;
#* Or use the &lt;code&gt;togglescreenshotmode&lt;/code&gt; command at the console to toggle all HUDs on and off.

# To remove the first-person view of your weapon, do one of the following, enter &lt;code&gt;killall Inventory&lt;/code&gt; in the console, or &lt;code&gt; SetHand Hidden&lt;/code&gt;. (note: to put the hand back in its normal place afterwards use sethand right).
# You might also want to type in &lt;code&gt;fly&lt;/code&gt; to fly around to get the best view for a shot.

===Resolution &amp; brightness ===

To get your sreen in the perfect resolution to avoid excessive editing later go to windowed mode by hitting ALT-ENTER or use the Menu.  Next go to the console and type the following command:
 SETRES 256x256

Adjust the brightness with the &lt;tt&gt;F11&lt;/tt&gt; key. Press &lt;tt&gt;F9&lt;/tt&gt; to create a snapshot .bmp file of the screen in your [[Legacy:Engine Directory Structure|System directory]]: all such files are named &lt;tt&gt;Shot0000.bmp&lt;/tt&gt;, &lt;tt&gt;Shot0001.bmp&lt;/tt&gt; and so on. Note that Unreal Tournament stops taking screenshots when you reach &lt;tt&gt;Shot0255.bmp&lt;/tt&gt; despite the four-digit number in the file name, so be sure that you make room for new screenshots in time by deleting old ones.

===Processing ===

Depending on what you want to do with your screenshots, here is some general advice:

* By any means, '''gamma-correct them'''.  Screenshots appear much darker outside the game than in the game, so unless you want the viewers of your screenshots to get an unhealthy tan due to having had to turn their monitor brightness way up, lighten the shots up a bit.  
* Level correction is often a good idea too. Note that Photoshop's Auto levels option tends to make your shot look like badly colourized Laurel and Hardy films.
* Cropping the screenshot if often a good idea and can create a more striking image. Save your original and try different possibilities. Another way is to add a layer in Photoshop that is all black apart from a transparent window, and drag this around the image.
* If you want to post them in a forum, '''scale them down''' (640x480 pixels at most) and '''convert them to .jpg''' using your favorite image editing program.  Nobody likes having to use the horizontal scrollbar to view your screenshots completely.
* For show-off screenshots, enter the map '''in spectator mode''' so your HUD and your weapon don't appear on the shots.  Besides, you'll be able to get much better camera angles that way.

There's a utility which performs some of the screenshot processing here: http://www.willemssoft.be/english/index1024normal.html WARNING: this page annoyingly enlarges the window.

== Screenshot in UnrealEd ===

You can maximize a viewport to get a larger picture; see [[Legacy:Console Bar|Console Bar]]. Hit &lt;tt&gt;PrtSc&lt;/tt&gt; on your keyboard. Switch to your favourite bitmap image editor (PhotoShop, PaintShopPro etc) and paste. 

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]

==Discussion==

'''Balu:''' Is there a way to create movies? E.g. to create an animated gif showing how an effect looks like.

'''Foxpaw:''' There are programs that you can use to compile an animated gif from a series of bitmaps, I don't have a link handy. The only problem with that is that you would need to take screenshots rapidly and evenly, unless you wrote a class especially for the task that would, for instance, advance a frame of the animation/effect/whatever every time you triggered it by some means. ( like shooting it ) Plus that sounds like something resembling hard work.

'''Balu:''' I know those programs, but I don't think you can &quot;hit&quot; the right frames using screenshots. I was thinking of image like the ones in the emitter-examples on UDN: http://udn.epicgames.com/pub/Content/EmittersTutorial/acceleration.gif

'''ZxAnPhOrIaN:''' Do you want it for a map or just a stand-alone picture?

'''Balu:''' Standalone - to create some example pics for this wiki e.g.

'''ZxAnPhOrIaN:''' Ok, try the demo record console command in the game and try to find a demo recording converter (to gif or avi).

'''Balu:''' I've just looked around for ways to do so, but only found [http://www.perilith.com/movieunrealplusplus/ MovieUnreal++] - which is for UT only though. Does anyone have something like this for UT2003?

'''Foxpaw:''' Like I said, if you have trouble hitting the right frames you could write a class that would advance the frame each time it was triggered, so for instance it could monitor the player's bExtra0, which isn't used as far as I cn tell but can be bound to a key. You could then have it advance one frame each time it was triggered. Alternately I believe there is generic video capture software that you could use while running UT, but I don't have any specific examples of one.

'''Balu:''' Anyone willing to undertake the task of doing the ''you''-part of Foxpaws idea? I am truly not skilled enough to do so. I'd love to analyze the code though and willing to write a doc for the wiki (if I understand a word ;)

'''EntropicLqd:''' Could't you ensure you hit the right frames by setting the game speed to something really low and then thumping the f9 key repeatedly?

'''Balu:''' That might be possible, but it's more a workaround... I also just found [[Legacy:Capturing_Unreal_Video|Capturing_Unreal_Video]] where this discussion should be taken I guess...

'''ZxAnPhOrIaN:''' In an ini (i think UT2003), there is a variable called something like framerate or framespersecond, set it really low, and don't forget to change it back!

'''Foxpaw:''' Just skimming over this page again, the code to make something that would take screenshots repeatedly some distance apart would look something like this:

&lt;uscript&gt;
class TimedScreenshots extends Actor;

var float FPS;
var float NextShotTime;

function PostBeginPlay()
{
  NextShotTime = Level.TimeSeconds;
}

function Tick(float Delta)
{
  while (Level.TimeSeconds &gt;= NextShotTime)
  {
    ConsoleCommand(&quot;SShot&quot;);
    NextShotTime += 1/FPS;
  }
}

defaultproperties
{
  bHidden=true
  FPS=10
}
&lt;/uscript&gt;

Then you could bind a key to &quot;Summon WhateverPackage.TimedScreenshots&quot; and another key to &quot;Killall TimedScreenshots&quot;.

To get the best results if you want a high FPS for your video, you could set the timedilation low and the FPS in that class low. For 30FPS for instance, you could set the FPS in the class to 3 and &quot;Set LevelInfo TimeDilation 0.1&quot; on the console. This probrably wouldn't be of much help unless your computer can't put out as many FPS as you want the video to have at the detail settings you want for the video.

'''DarthDevilous:''' From the current article:

{{innerbox| Unreal Tournament stops taking screenshots when you reach &lt;tt&gt;Shot0255.bmp&lt;/tt&gt;

}}

This doesn't seem to be the case in UT2004, I am currently at &lt;tt&gt;Shot00283&lt;/tt&gt;. Also my Screenshots end up in the /ScreenShots subdirectory. Is this functionality new in UT2004 or what? (and could someone update the article appropriatly)

'''Xian:''' I assume that is because you have 2 zeros. It might go up to 9999 but I am not sure.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5363</id>
      <timestamp>2006-04-23T17:25:08Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Taking a Screenshot in Unreal Tournament ==

Play your map in Unreal Tournament. 

===Set the scene===

Depending on whether you want images for the map thumbnail or action shots, bots are a consideration:

* To remove bots from the game, enter &lt;code&gt;killpawns&lt;/code&gt; in the console.
* To freeze bots in a good position, allowing you to move around and try different angles of shot, enter &lt;code&gt;playersonly&lt;/code&gt; in the console.

===Clear the View ===

To get a clear view, either set &quot;Play as Spectator&quot; under Player Options before starting the practise session, or remove the HUD manually.

# To remove the HUD, do one of the following:
#* Press the &lt;code&gt;-&lt;/code&gt; (minus) key until your HUD completely disappears.
#* Set &quot;Play as Spectator&quot; under Player Options before starting the practice session
#* You can also remove the HUD just temporarily without changing your configuration by entering the following two console commands:&lt;pre&gt;  set PlayerPawn HUDType None
  set PlayerPawn myHUD None&lt;/pre&gt;
#* Or use the &lt;code&gt;togglescreenshotmode&lt;/code&gt; command at the console to toggle all HUDs on and off.

# To remove the first-person view of your weapon, do one of the following, enter &lt;code&gt;killall Inventory&lt;/code&gt; in the console, or &lt;code&gt; SetHand Hidden&lt;/code&gt;.
# You might also want to type in &lt;code&gt;fly&lt;/code&gt; to fly around to get the best view for a shot.

===Resolution &amp; brightness ===

To get your sreen in the perfect resolution to avoid excessive editing later go to windowed mode by hitting ALT-ENTER or use the Menu.  Next go to the console and type the following command:
 SETRES 256x256

Adjust the brightness with the &lt;tt&gt;F11&lt;/tt&gt; key. Press &lt;tt&gt;F9&lt;/tt&gt; to create a snapshot .bmp file of the screen in your [[Legacy:Engine Directory Structure|System directory]]: all such files are named &lt;tt&gt;Shot0000.bmp&lt;/tt&gt;, &lt;tt&gt;Shot0001.bmp&lt;/tt&gt; and so on. Note that Unreal Tournament stops taking screenshots when you reach &lt;tt&gt;Shot0255.bmp&lt;/tt&gt; despite the four-digit number in the file name, so be sure that you make room for new screenshots in time by deleting old ones.

===Processing ===

Depending on what you want to do with your screenshots, here is some general advice:

* By any means, '''gamma-correct them'''.  Screenshots appear much darker outside the game than in the game, so unless you want the viewers of your screenshots to get an unhealthy tan due to having had to turn their monitor brightness way up, lighten the shots up a bit.  
* Level correction is often a good idea too. Note that Photoshop's Auto levels option tends to make your shot look like badly colourized Laurel and Hardy films.
* Cropping the screenshot if often a good idea and can create a more striking image. Save your original and try different possibilities. Another way is to add a layer in Photoshop that is all black apart from a transparent window, and drag this around the image.
* If you want to post them in a forum, '''scale them down''' (640x480 pixels at most) and '''convert them to .jpg''' using your favorite image editing program.  Nobody likes having to use the horizontal scrollbar to view your screenshots completely.
* For show-off screenshots, enter the map '''in spectator mode''' so your HUD and your weapon don't appear on the shots.  Besides, you'll be able to get much better camera angles that way.

There's a utility which performs some of the screenshot processing here: http://www.willemssoft.be/english/index1024normal.html WARNING: this page annoyingly enlarges the window.

== Screenshot in UnrealEd ===

You can maximize a viewport to get a larger picture; see [[Legacy:Console Bar|Console Bar]]. Hit &lt;tt&gt;PrtSc&lt;/tt&gt; on your keyboard. Switch to your favourite bitmap image editor (PhotoShop, PaintShopPro etc) and paste. 

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]

==Discussion==

'''Balu:''' Is there a way to create movies? E.g. to create an animated gif showing how an effect looks like.

'''Foxpaw:''' There are programs that you can use to compile an animated gif from a series of bitmaps, I don't have a link handy. The only problem with that is that you would need to take screenshots rapidly and evenly, unless you wrote a class especially for the task that would, for instance, advance a frame of the animation/effect/whatever every time you triggered it by some means. ( like shooting it ) Plus that sounds like something resembling hard work.

'''Balu:''' I know those programs, but I don't think you can &quot;hit&quot; the right frames using screenshots. I was thinking of image like the ones in the emitter-examples on UDN: http://udn.epicgames.com/pub/Content/EmittersTutorial/acceleration.gif

'''ZxAnPhOrIaN:''' Do you want it for a map or just a stand-alone picture?

'''Balu:''' Standalone - to create some example pics for this wiki e.g.

'''ZxAnPhOrIaN:''' Ok, try the demo record console command in the game and try to find a demo recording converter (to gif or avi).

'''Balu:''' I've just looked around for ways to do so, but only found [http://www.perilith.com/movieunrealplusplus/ MovieUnreal++] - which is for UT only though. Does anyone have something like this for UT2003?

'''Foxpaw:''' Like I said, if you have trouble hitting the right frames you could write a class that would advance the frame each time it was triggered, so for instance it could monitor the player's bExtra0, which isn't used as far as I cn tell but can be bound to a key. You could then have it advance one frame each time it was triggered. Alternately I believe there is generic video capture software that you could use while running UT, but I don't have any specific examples of one.

'''Balu:''' Anyone willing to undertake the task of doing the ''you''-part of Foxpaws idea? I am truly not skilled enough to do so. I'd love to analyze the code though and willing to write a doc for the wiki (if I understand a word ;)

'''EntropicLqd:''' Could't you ensure you hit the right frames by setting the game speed to something really low and then thumping the f9 key repeatedly?

'''Balu:''' That might be possible, but it's more a workaround... I also just found [[Legacy:Capturing_Unreal_Video|Capturing_Unreal_Video]] where this discussion should be taken I guess...

'''ZxAnPhOrIaN:''' In an ini (i think UT2003), there is a variable called something like framerate or framespersecond, set it really low, and don't forget to change it back!

'''Foxpaw:''' Just skimming over this page again, the code to make something that would take screenshots repeatedly some distance apart would look something like this:

&lt;uscript&gt;
class TimedScreenshots extends Actor;

var float FPS;
var float NextShotTime;

function PostBeginPlay()
{
  NextShotTime = Level.TimeSeconds;
}

function Tick(float Delta)
{
  while (Level.TimeSeconds &gt;= NextShotTime)
  {
    ConsoleCommand(&quot;SShot&quot;);
    NextShotTime += 1/FPS;
  }
}

defaultproperties
{
  bHidden=true
  FPS=10
}
&lt;/uscript&gt;

Then you could bind a key to &quot;Summon WhateverPackage.TimedScreenshots&quot; and another key to &quot;Killall TimedScreenshots&quot;.

To get the best results if you want a high FPS for your video, you could set the timedilation low and the FPS in that class low. For 30FPS for instance, you could set the FPS in the class to 3 and &quot;Set LevelInfo TimeDilation 0.1&quot; on the console. This probrably wouldn't be of much help unless your computer can't put out as many FPS as you want the video to have at the detail settings you want for the video.

'''DarthDevilous:''' From the current article:

{{innerbox| Unreal Tournament stops taking screenshots when you reach &lt;tt&gt;Shot0255.bmp&lt;/tt&gt;

}}

This doesn't seem to be the case in UT2004, I am currently at &lt;tt&gt;Shot00283&lt;/tt&gt;. Also my Screenshots end up in the /ScreenShots subdirectory. Is this functionality new in UT2004 or what? (and could someone update the article appropriatly)

'''Xian:''' I assume that is because you have 2 zeros. It might go up to 9999 but I am not sure.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Seemless Textures From Photographic Sources</title>
    <id>2247</id>
    <revision>
      <id>5428</id>
      <timestamp>2008-02-27T20:54:05Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless) [http://www.i-tex.de/news.php Link]
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps) [http://www.crazybump.com/ Link]
* UT3 Material Editor (to get them into the game)

==The Process==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, I load my photo-editing software. There are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

I then save this, and open it in Texture Maker, I have shown on previous occasions how to use the resampler to resample textures, but with these textures too much detail is lost in the process, insted, this time I go to the function selection and choose the '''Make Seemless''' option, my preference is the '''Circle Blend''', though you may like to experiment with some of the other options here, I process both the textures this way resulting in '''Tiles #05 and #06'''

'''Tile #05''' Looks ok to me, and I think this will work in game, while looking at it closely you can see the blend, I think that it shouldn't show up to much in game, in '''Tile #06''' however, the blending is readily apparent, and this will need to be touched up in an image editing program that has some form of ''clone-stamp''.

Essentially these textures are done and ready for seemless tiling, but to capture the feel of their essence - one more step remains before bringing them into the ''Material Editor''.

For the sake of making this easier on myself, I am only going to continue the rest of this example using the image shown in '''Tile #05'''.

I startup the CrazyBump Application, and open my image as a photograph, a momentary pause later I am at the screen shown in '''Tile #07'''. This screen llows you to choose if the brighter pixels are going to be higher or lower than the darker ones, like in this example if I want the roots to be raised or depressed over/into the soil, the image on the left shows the root raised, it is the one I want.

After selecting that, the next screen comes up as shown in '''Tile #08'''. I am not going to go into too much detail as to how the controls of CrazyBump work, and simply state that to the best of my knowledge, all the maps with the exception of the occlusion maps can be used in UT3 (maybe even the occlusion - though I am not certain of how - ''yet'').

So after tweaking these maps through the sliding controls till the texture looks the way I want it, I save 4 of the 5 maps, then with my photo-editing software I combine the grey scale images into one image, each using it's own color channel, in this case I have put the specular on the red channel, and the displacement on the green, I could have optionally put the occlusion on the blue, but since I am not using it, I left it as solid white. (see '''Tiles #09 through #11''').

I start up the UT3 Editor, and import my 3 textures. Then I make a material, in its most simple form it should look like as shown in '''Tile #12''', though you can embelish it far more than this.

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_EarthRough0009_L_3.jpeg|center|Tile #05 : Rough Earth Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_3.jpeg|center|Tile #06 : Grassy Rock Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_CrazyBump_01.jpeg|center|Tile #07 : Crazy Bump Z-Axis Selector]]

[[Image:Legacy_AS_CrazyBump_02.jpeg|center|Tile #08 : Crazy Bump Main Interface]]

[[Image:Legacy_AS_Earthrough0009_l_COLOR.jpeg|center|Tile #09 : Finished Seemless Texture (Diffuse Component)]]

[[Image:Legacy_AS_Earthrough0009_l_NRM.jpeg|center|Tile #10 : Finished Seemless Texture (Normal Component)]]

[[Image:Legacy_AS_Earthrough0009_l_SPECDISP.jpeg|center|Tile #11 : Finished Seemless Texture (Specular and Displacement Components)]]

[[Image:Legacy_AS_SimpleMaterial_0001.jpeg|center|Tile #12 : A simple material showing where these textures go!]]</text>
    </revision>
    <revision>
      <id>5429</id>
      <timestamp>2008-02-27T17:47:11Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Tools Used:
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)</text>
    </revision>
    <revision>
      <id>5430</id>
      <timestamp>2008-02-27T17:49:30Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.</text>
    </revision>
    <revision>
      <id>5431</id>
      <timestamp>2008-02-27T17:55:28Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

==Image Tiles==

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #01 : Grassy Rock Image (Original is 3008x2000)]]</text>
    </revision>
    <revision>
      <id>5432</id>
      <timestamp>2008-02-27T17:59:49Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, there are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]</text>
    </revision>
    <revision>
      <id>5433</id>
      <timestamp>2008-02-27T18:21:03Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, there are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]</text>
    </revision>
    <revision>
      <id>5434</id>
      <timestamp>2008-02-27T18:28:00Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, I load my photo-editing software. There are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

I then save this, and open it in Texture Maker, I have shown on previous occasions how to use the resampler to resample textures, but with these textures too much detail is lost in the process, insted, this time I go to the function selection and choose the '''Make Seemless''' option, my preference is the '''Circle Blend''', though you may like to experiment with some of the other options here, I process both the textures this way resulting in '''Tiles #05 and #06'''

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]</text>
    </revision>
    <revision>
      <id>5435</id>
      <timestamp>2008-02-27T18:36:43Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, I load my photo-editing software. There are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

I then save this, and open it in Texture Maker, I have shown on previous occasions how to use the resampler to resample textures, but with these textures too much detail is lost in the process, insted, this time I go to the function selection and choose the '''Make Seemless''' option, my preference is the '''Circle Blend''', though you may like to experiment with some of the other options here, I process both the textures this way resulting in '''Tiles #05 and #06'''

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_EarthRough0009_L_3.jpeg|center|Tile #05 : Rough Earth Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_3.jpeg|center|Tile #06 : Grassy Rock Resized Image (Seemless Variant)]]</text>
    </revision>
    <revision>
      <id>5436</id>
      <timestamp>2008-02-27T19:13:11Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, I load my photo-editing software. There are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

I then save this, and open it in Texture Maker, I have shown on previous occasions how to use the resampler to resample textures, but with these textures too much detail is lost in the process, insted, this time I go to the function selection and choose the '''Make Seemless''' option, my preference is the '''Circle Blend''', though you may like to experiment with some of the other options here, I process both the textures this way resulting in '''Tiles #05 and #06'''

'''Tile #05''' Looks ok to me, and I think this will work in game, while looking at it closely you can see the blend, I think that it shouldn't show up to much in game, in '''Tile #06''' however, the blending is readily apparent, and this will need to be touched up in an image editing program that has some form of ''clone-stamp''.

Essentially these textures are done and ready for seemless tiling, but to capture the feel of their essence - one more step remains before bringing them into the ''Material Editor''.

For the sake of making this easier on myself, I am only going to continue the rest of this example using the image shown in '''Tile #05'''.

I startup the CrazyBump Application, and open my image as a photograph, a momentary pause later I am at the screen shown in '''Tile #07'''. This screen llows you to choose if the brighter pixels are going to be higher or lower than the darker ones, like in this example if I want the roots to be raised or depressed over/into the soil, the image on the left shows the root raised, it is the one I want.

After selecting that, the next screen comes up as shown in '''Tile #08'''. I am not going to go into too much detail as to how the controls of CrazyBump work, and simply state that to the best of my knowledge, all the maps with the exception of the occlusion maps can be used in UT3 (maybe even the occlusion - though I am not certain of how - ''yet'').

So after tweaking these maps through the sliding controls till the texture looks the way I want it, I save 4 of the 5 maps, and then prepare for import (see '''Tiles #09 through #12''').

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_EarthRough0009_L_3.jpeg|center|Tile #05 : Rough Earth Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_3.jpeg|center|Tile #06 : Grassy Rock Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_CrazyBump_01.jpeg|center|Tile #07 : Crazy Bump Z-Axis Selector]]

[[Image:Legacy_AS_CrazyBump_02.jpeg|center|Tile #08 : Crazy Bump Main Interface]]</text>
    </revision>
    <revision>
      <id>5437</id>
      <timestamp>2008-02-27T20:19:44Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless)
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps)
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, I load my photo-editing software. There are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

I then save this, and open it in Texture Maker, I have shown on previous occasions how to use the resampler to resample textures, but with these textures too much detail is lost in the process, insted, this time I go to the function selection and choose the '''Make Seemless''' option, my preference is the '''Circle Blend''', though you may like to experiment with some of the other options here, I process both the textures this way resulting in '''Tiles #05 and #06'''

'''Tile #05''' Looks ok to me, and I think this will work in game, while looking at it closely you can see the blend, I think that it shouldn't show up to much in game, in '''Tile #06''' however, the blending is readily apparent, and this will need to be touched up in an image editing program that has some form of ''clone-stamp''.

Essentially these textures are done and ready for seemless tiling, but to capture the feel of their essence - one more step remains before bringing them into the ''Material Editor''.

For the sake of making this easier on myself, I am only going to continue the rest of this example using the image shown in '''Tile #05'''.

I startup the CrazyBump Application, and open my image as a photograph, a momentary pause later I am at the screen shown in '''Tile #07'''. This screen llows you to choose if the brighter pixels are going to be higher or lower than the darker ones, like in this example if I want the roots to be raised or depressed over/into the soil, the image on the left shows the root raised, it is the one I want.

After selecting that, the next screen comes up as shown in '''Tile #08'''. I am not going to go into too much detail as to how the controls of CrazyBump work, and simply state that to the best of my knowledge, all the maps with the exception of the occlusion maps can be used in UT3 (maybe even the occlusion - though I am not certain of how - ''yet'').

So after tweaking these maps through the sliding controls till the texture looks the way I want it, I save 4 of the 5 maps, then with my photo-editing software I combine the grey scale images into one image, each using it's own color channel, in this case I have put the specular on the red channel, and the displacement on the green, I could have optionally put the occlusion on the blue, but since I am not using it, I left it as solid white. (see '''Tiles #09 through #11''').

I start up the UT3 Editor, and import my 3 textures. Then I make a material, in its most simple form it should look like as shown in '''Tile #12''', though you can embelish it far more than this.

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_EarthRough0009_L_3.jpeg|center|Tile #05 : Rough Earth Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_3.jpeg|center|Tile #06 : Grassy Rock Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_CrazyBump_01.jpeg|center|Tile #07 : Crazy Bump Z-Axis Selector]]

[[Image:Legacy_AS_CrazyBump_02.jpeg|center|Tile #08 : Crazy Bump Main Interface]]

[[Image:Legacy_AS_Earthrough0009_l_COLOR.jpeg|center|Tile #09 : Finished Seemless Texture (Diffuse Component)]]

[[Image:Legacy_AS_Earthrough0009_l_NRM.jpeg|center|Tile #10 : Finished Seemless Texture (Normal Component)]]

[[Image:Legacy_AS_Earthrough0009_l_SPECDISP.jpeg|center|Tile #11 : Finished Seemless Texture (Specular and Displacement Components)]]

[[Image:Legacy_AS_SimpleMaterial_0001.jpeg|center|Tile #12 : A simple material showing where these textures go!]]</text>
    </revision>
    <revision>
      <id>5438</id>
      <timestamp>2008-02-27T20:22:46Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Tools Used:==
* A camera or other source for photographic textures
* Texture Maker (to make the textures seemless) [http://www.i-tex.de/news.php Link]
* Photoshop or other image editing software (to touch up the texture)
* CrazyBump (to divide the texture into various maps) [http://www.crazybump.com/ Link]
* UT3 Material Editor (to get them into the game)

==Foreword==

For this example - I will be demonstrating two seperate images to illustrate the process, the originals can be seen in '''Tiles #01 and #02'''.

The first thing I do is make the texture the correct size, I load my photo-editing software. There are quite a few options in this step, from ''Bicubic Resizes'' to ''Cropping'', I went with a resize, to achieve a height of 2048 pixels, and then cropped the image, while retaining its ''X-Y'' proportions so that there was no distorting, you can see the results in '''Tiles #03 and #04'''

I then save this, and open it in Texture Maker, I have shown on previous occasions how to use the resampler to resample textures, but with these textures too much detail is lost in the process, insted, this time I go to the function selection and choose the '''Make Seemless''' option, my preference is the '''Circle Blend''', though you may like to experiment with some of the other options here, I process both the textures this way resulting in '''Tiles #05 and #06'''

'''Tile #05''' Looks ok to me, and I think this will work in game, while looking at it closely you can see the blend, I think that it shouldn't show up to much in game, in '''Tile #06''' however, the blending is readily apparent, and this will need to be touched up in an image editing program that has some form of ''clone-stamp''.

Essentially these textures are done and ready for seemless tiling, but to capture the feel of their essence - one more step remains before bringing them into the ''Material Editor''.

For the sake of making this easier on myself, I am only going to continue the rest of this example using the image shown in '''Tile #05'''.

I startup the CrazyBump Application, and open my image as a photograph, a momentary pause later I am at the screen shown in '''Tile #07'''. This screen llows you to choose if the brighter pixels are going to be higher or lower than the darker ones, like in this example if I want the roots to be raised or depressed over/into the soil, the image on the left shows the root raised, it is the one I want.

After selecting that, the next screen comes up as shown in '''Tile #08'''. I am not going to go into too much detail as to how the controls of CrazyBump work, and simply state that to the best of my knowledge, all the maps with the exception of the occlusion maps can be used in UT3 (maybe even the occlusion - though I am not certain of how - ''yet'').

So after tweaking these maps through the sliding controls till the texture looks the way I want it, I save 4 of the 5 maps, then with my photo-editing software I combine the grey scale images into one image, each using it's own color channel, in this case I have put the specular on the red channel, and the displacement on the green, I could have optionally put the occlusion on the blue, but since I am not using it, I left it as solid white. (see '''Tiles #09 through #11''').

I start up the UT3 Editor, and import my 3 textures. Then I make a material, in its most simple form it should look like as shown in '''Tile #12''', though you can embelish it far more than this.

==Image Tiles==

[[Image:Legacy_EarthRough0009_L.jpeg|center|Tile #01 : Rough Earth Image (Original is 3008x2000)]]

[[Image:Legacy_RockGrassy0037_L.jpeg|center|Tile #02 : Grassy Rock Image (Original is 3008x2000)]]

[[Image:Legacy_AS_EarthRough0009_L_2.jpeg|center|Tile #03 : Rough Earth Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_2.jpeg|center|Tile #04 : Grassy Rock Resized Image (Non-Seemless Variant)]]

[[Image:Legacy_AS_EarthRough0009_L_3.jpeg|center|Tile #05 : Rough Earth Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_RockGrassy0037_L_3.jpeg|center|Tile #06 : Grassy Rock Resized Image (Seemless Variant)]]

[[Image:Legacy_AS_CrazyBump_01.jpeg|center|Tile #07 : Crazy Bump Z-Axis Selector]]

[[Image:Legacy_AS_CrazyBump_02.jpeg|center|Tile #08 : Crazy Bump Main Interface]]

[[Image:Legacy_AS_Earthrough0009_l_COLOR.jpeg|center|Tile #09 : Finished Seemless Texture (Diffuse Component)]]

[[Image:Legacy_AS_Earthrough0009_l_NRM.jpeg|center|Tile #10 : Finished Seemless Texture (Normal Component)]]

[[Image:Legacy_AS_Earthrough0009_l_SPECDISP.jpeg|center|Tile #11 : Finished Seemless Texture (Specular and Displacement Components)]]

[[Image:Legacy_AS_SimpleMaterial_0001.jpeg|center|Tile #12 : A simple material showing where these textures go!]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Sparks (UT)</title>
    <id>2236</id>
    <revision>
      <id>5404</id>
      <timestamp>2006-11-24T12:30:09Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Sparks for UT==

'''Note:''' I'm new to the whole Wookee thing so can someone else edit the formatting for this when I'm done with the tutorials

===What you need to know already:===
*Mapping basics such as how to use the editor - see [[Legacy:Mapping Lessons|Mapping Lessons]]
*[[Legacy:StochasticTrigger|StochasticTrigger]]
*[[Legacy:SmokeGenerator|SmokeGenerator]]

===How it works:===
*First up in the Actor Class browser hunt down Effects -&gt; SmokeGenerator. Right click on the map and select Place 'SmokeGenerator' here. This should set down a black ball type thing into your level.
*Right click the SmokeGenerator you just placed and open the properties window. Under events find and set the [[Legacy:Tag|Tag]] field.
*Find the 'SmokeGenerator' properties list in the window.
*At this point I ran out of time but I will be back to sort this out - I just need to check the exact name of tyhe fields that need changing in order to prevent confusion. It's a start though...

==Discussion==

'''Boff:''' I recently made a map that blew apart piece by piece after I had blown a nuclear Fusion Reactor and I wanted to know how to make sparks and noticed there was nothing on the wiki. So here I am spreading some enlightenment.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5405</id>
      <timestamp>2006-11-24T12:28:35Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Sparks for UT==

'''Note:''' I'm new to the whole Wookee thing so can someone else edit the formatting for this when I'm done with the tutorials

===What you need to know already:===
*Mapping basics such as how to use the editor - see [[Legacy:Mapping Lessons|Mapping Lessons]]
*[[Legacy:StochasticTrigger|StochasticTrigger]]
*[[Legacy:SmokeGenerator|SmokeGenerator]]

===How it works:===
*First up in the Actor Class browser hunt down Effects -&gt; SmokeGenerator. Right click on the map and select Place 'SmokeGenerator' here. This should set down a black ball type thing into your level.
*Right click the SmokeGenerator you just placed and open the properties window. Under events find and set the [[Legacy:Tag|Tag]] field.
*Find the 'SmokeGenerator' properties list in the window.
*At this point I ran out of time but I will be back to sort this out - I just need to check the exact name of tyhe fields that need changing in order to prevent confusion. It's a start though...

==Discussion==

'''Boff:''' I recently made a map that blew apart piece by piece after I had blown a nuclear Fusion Reactor and I wanted to know how to make sparks and noticed there was nothing on the wiki. So here I am spreading some enlightenment.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Stairs</title>
    <id>1771</id>
    <revision>
      <id>4345</id>
      <timestamp>2006-08-07T02:55:12Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Types of stairs builder ==
* linear
* curved
* spiral (and [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]])

==Use semisolids ==

[[Image:Legacy_stairsconstruction.gif|right|]]

Create stairs with [[Legacy:Semisolid|semisolid]]s. You'll save on a ton of [[Legacy:BSP|BSP]] cuts. Though be careful with the Semisolid Region Limit Error (made-up name ;) ) &amp;ndash; when making a staircase from semi-solids avoid having visible semisolid faces flush with the face of a subtract box. If the boundry of your stairs and the boundry of a subtract box is on the same grid line, it may cause your stair texture to disapear from certain viewing angles in game. Instead, if you have a staircase 4 steps high, create 3 steps, and texture the wall behind them to look like the last step. Players will step up onto the floor above just as if they were going up stairs.

Stylistically, unless required by your levelmore than 8 or so stairs is a bad idea. It doesn't look good, and when a player runs up them their view goes de-dum-dedum-dedum-dedum.

The method in the upper diagram (to the right)is better than the lower diagram, as the semisolid face marked with a * may vanish when looking at the stairs from the front.

An additional reason not to use the stair tool, and instead use the [[Legacy:2D Shape Editor|2D Shape Editor]] or a [[Legacy:Semisolid|semisolid]] for your stair case is that each stair has a [[Legacy:Vertex|vertex]] at its top and bottom, this causes the game to light the visible side of your stair case individually for each stair. This makes your stairs look quite ugly, as you can see below. 

http://img370.imageshack.us/img370/3514/stairlightzz7.png

----

'''Mychaeel:'''  This needs an overhaul...

'''Tarquin:'''  Yes. We've got to find out what people want from stairs, how they relate to them, what sort of image they have for them &amp;ndash; do people want stairs that can be fitted nasally? ;)

'''Mychaeel:'''  I'd do it myself, if I only was into mapping at all...  I just stumbled over this page when I tested the search function and found it lacking.  At least a description of the stair builders might be handy here...

'''Tarquin:'''  good idea. (I ws just being silly earlier :D ) I'll grab the parameters next time I run UEd.

----

Suggested questions to be answered on this page

=== Dimensions &amp; Aesthetics ==

The the maximum height each step can have and still be passable without jumping is 32 Unreal Units. Steps are usually built 16 units high. (see [[Legacy:General Scale And Dimensions|General Scale And Dimensions]] for more).

:'''Tarquin:'''  the max value of 32 is from the Dimensions page, but I have a creepy feeling 32 isn't climbable. Will check

:'''EternalEpoch:''' 32 isnt climbable without jumping, id stick to 16, 24 max

* What is the usual architectural rule of thumb on the proportion of the rise/run of each step?  This is important for both visual appearance and playability.
: '''Bean:''' IMO, 12-16 units height, 16 width in most situatiobs,

:'''Tarquin:'''  a run of 16 looks a little steep IMO. 32 is good. 48 or 64 looks more stately, like successive platform things (I'll find the word I mean later...)

:'''FreshMeat''' I have steps 32 high and they work just fine in 2k4.

* Is it appropriate to make stairs be the sides of a Mayan Temple? (i.e., is it a good idea to use stairs to make large pyramid type shapes?
: '''Bean:''' personal preference i guess

* Rotation of stairs is difficult off of the X, Y or Z axis.  Any suggestions on how to do off axis rotations?  Are they even a good idea given BSP problems?
: '''Bean:''' just rotate at a given pivot. sometimes, I make stairs by sutracting a stair brush flipped upside down on another brush.

* Spiral staircases introduce higher complexity and problems with semi-realistic texturing.  Any suggestions?
: '''Bean:''' Dont use them, find an alternate. :)

:'''Tarquin:'''  I think [[Legacy:TexAlign|TexAlign]] will handle spiral stairs. Use SHIFT+I to quickly select surfaces by kind. (see [[Legacy:Selecting Surfaces|Selecting Surfaces]])

* Curved staircases - how much of a curve should they have and how many steps per revolution?
: '''Bean:''' Don't use em, dont know. someone step in? :)
  '''Aydin:'''  Ive never had a problem with curved stairs.  I think they are a great addition to any level.  A cylyndrical room with curved staris?  its a great idea!

'''Tarquin:'''  thank you, whoever you are :D I'll expand a bit on some of those later.

'''Bean:''' thanks for the clarification Tarquin, i read some of what i wrote and it didnt sound right :/

'''Phoenix:''' It does look good: Try 64 steps/rotation, and more than that number of steps, and when you subtract it, it looks impressive. It really adds to the feeling in some of my maps of insanity.

[[:Category:Legacy Refactor Me]]

==Related topics ==
* [[Legacy:Architecture|Architecture]] main page
* [[Legacy:Semisolid|Semisolid]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4346</id>
      <timestamp>2006-07-31T21:34:15Z</timestamp>
      <contributor>
        <ip>H77.223.40.69.ip.alltel.net</ip>
      </contributor>
      <comment>format changes, added more information, clarified remarks.</comment>
      <text xml:space="preserve">==Types of stairs builder ==
* linear
* curved
* spiral (and [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]])

==Use semisolids ==

[[Image:Legacy_stairsconstruction.gif|right|]]

Create stairs with [[Legacy:Semisolid|semisolid]]s. You'll save on a ton of [[Legacy:BSP|BSP]] cuts. Though be careful with the Semisolid Region Limit Error (made-up name ;) ) &amp;ndash; when making a staircase from semi-solids avoid having visible semisolid faces flush with the face of a subtract box. If the boundry of your stairs and the boundry of a subtract box is on the same grid line, it may cause your stair texture to disapear from certain viewing angles in game. Instead, if you have a staircase 4 steps high, create 3 steps, and texture the wall behind them to look like the last step. Players will step up onto the floor above just as if they were going up stairs.

Stylistically, unless required by your levelmore than 8 or so stairs is a bad idea. It doesn't look good, and when a player runs up them their view goes de-dum-dedum-dedum-dedum.

The method in the upper diagram (to the right)is better than the lower diagram, as the semisolid face marked with a * may vanish when looking at the stairs from the front.

An additional reason not to use the stair tool, and instead use the [[Legacy:2d Shape Editor|2d shape editor]] or a [[Legacy:Semisolid|semisolid]] for your stair case is that each stair has a [[Legacy:Vertex|vertex]] at its top and bottom, this causes the game to light the visible side of your stair case individually for each stair. This makes your stairs look quite ugly, as you can see below. 

http://img370.imageshack.us/img370/3514/stairlightzz7.png

----

'''Mychaeel:'''  This needs an overhaul...

'''Tarquin:'''  Yes. We've got to find out what people want from stairs, how they relate to them, what sort of image they have for them &amp;ndash; do people want stairs that can be fitted nasally? ;)

'''Mychaeel:'''  I'd do it myself, if I only was into mapping at all...  I just stumbled over this page when I tested the search function and found it lacking.  At least a description of the stair builders might be handy here...

'''Tarquin:'''  good idea. (I ws just being silly earlier :D ) I'll grab the parameters next time I run UEd.

----

Suggested questions to be answered on this page

=== Dimensions &amp; Aesthetics ==

The the maximum height each step can have and still be passable without jumping is 32 Unreal Units. Steps are usually built 16 units high. (see [[Legacy:General Scale And Dimensions|General Scale And Dimensions]] for more).

:'''Tarquin:'''  the max value of 32 is from the Dimensions page, but I have a creepy feeling 32 isn't climbable. Will check

:'''EternalEpoch:''' 32 isnt climbable without jumping, id stick to 16, 24 max

* What is the usual architectural rule of thumb on the proportion of the rise/run of each step?  This is important for both visual appearance and playability.
: '''Bean:''' IMO, 12-16 units height, 16 width in most situatiobs,

:'''Tarquin:'''  a run of 16 looks a little steep IMO. 32 is good. 48 or 64 looks more stately, like successive platform things (I'll find the word I mean later...)

:'''FreshMeat''' I have steps 32 high and they work just fine in 2k4.

* Is it appropriate to make stairs be the sides of a Mayan Temple? (i.e., is it a good idea to use stairs to make large pyramid type shapes?
: '''Bean:''' personal preference i guess

* Rotation of stairs is difficult off of the X, Y or Z axis.  Any suggestions on how to do off axis rotations?  Are they even a good idea given BSP problems?
: '''Bean:''' just rotate at a given pivot. sometimes, I make stairs by sutracting a stair brush flipped upside down on another brush.

* Spiral staircases introduce higher complexity and problems with semi-realistic texturing.  Any suggestions?
: '''Bean:''' Dont use them, find an alternate. :)

:'''Tarquin:'''  I think [[Legacy:TexAlign|TexAlign]] will handle spiral stairs. Use SHIFT+I to quickly select surfaces by kind. (see [[Legacy:Selecting Surfaces|Selecting Surfaces]])

* Curved staircases - how much of a curve should they have and how many steps per revolution?
: '''Bean:''' Don't use em, dont know. someone step in? :)
  '''Aydin:'''  Ive never had a problem with curved stairs.  I think they are a great addition to any level.  A cylyndrical room with curved staris?  its a great idea!

'''Tarquin:'''  thank you, whoever you are :D I'll expand a bit on some of those later.

'''Bean:''' thanks for the clarification Tarquin, i read some of what i wrote and it didnt sound right :/

'''Phoenix:''' It does look good: Try 64 steps/rotation, and more than that number of steps, and when you subtract it, it looks impressive. It really adds to the feeling in some of my maps of insanity.

==Related topics ==
* [[Legacy:Architecture|Architecture]] main page
* [[Legacy:Semisolid|Semisolid]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4347</id>
      <timestamp>2006-08-04T04:59:50Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Types of stairs builder ==
* linear
* curved
* spiral (and [[Legacy:TarquinSpiralStairBuilder|TarquinSpiralStairBuilder]])

==Use semisolids ==

[[Image:Legacy_stairsconstruction.gif|right|]]

Create stairs with [[Legacy:Semisolid|semisolid]]s. You'll save on a ton of [[Legacy:BSP|BSP]] cuts. Though be careful with the Semisolid Region Limit Error (made-up name ;) ) &amp;ndash; when making a staircase from semi-solids avoid having visible semisolid faces flush with the face of a subtract box. If the boundry of your stairs and the boundry of a subtract box is on the same grid line, it may cause your stair texture to disapear from certain viewing angles in game. Instead, if you have a staircase 4 steps high, create 3 steps, and texture the wall behind them to look like the last step. Players will step up onto the floor above just as if they were going up stairs.

Stylistically, unless required by your levelmore than 8 or so stairs is a bad idea. It doesn't look good, and when a player runs up them their view goes de-dum-dedum-dedum-dedum.

The method in the upper diagram (to the right)is better than the lower diagram, as the semisolid face marked with a * may vanish when looking at the stairs from the front.

An additional reason not to use the stair tool, and instead use the [[Legacy:2d Shape Editor|2d shape editor]] or a [[Legacy:Semisolid|semisolid]] for your stair case is that each stair has a [[Legacy:Vertex|vertex]] at its top and bottom, this causes the game to light the visible side of your stair case individually for each stair. This makes your stairs look quite ugly, as you can see below. 

http://img370.imageshack.us/img370/3514/stairlightzz7.png

----

'''Mychaeel:'''  This needs an overhaul...

'''Tarquin:'''  Yes. We've got to find out what people want from stairs, how they relate to them, what sort of image they have for them &amp;ndash; do people want stairs that can be fitted nasally? ;)

'''Mychaeel:'''  I'd do it myself, if I only was into mapping at all...  I just stumbled over this page when I tested the search function and found it lacking.  At least a description of the stair builders might be handy here...

'''Tarquin:'''  good idea. (I ws just being silly earlier :D ) I'll grab the parameters next time I run UEd.

----

Suggested questions to be answered on this page

=== Dimensions &amp; Aesthetics ==

The the maximum height each step can have and still be passable without jumping is 32 Unreal Units. Steps are usually built 16 units high. (see [[Legacy:General Scale And Dimensions|General Scale And Dimensions]] for more).

:'''Tarquin:'''  the max value of 32 is from the Dimensions page, but I have a creepy feeling 32 isn't climbable. Will check

:'''EternalEpoch:''' 32 isnt climbable without jumping, id stick to 16, 24 max

* What is the usual architectural rule of thumb on the proportion of the rise/run of each step?  This is important for both visual appearance and playability.
: '''Bean:''' IMO, 12-16 units height, 16 width in most situatiobs,

:'''Tarquin:'''  a run of 16 looks a little steep IMO. 32 is good. 48 or 64 looks more stately, like successive platform things (I'll find the word I mean later...)

:'''FreshMeat''' I have steps 32 high and they work just fine in 2k4.

* Is it appropriate to make stairs be the sides of a Mayan Temple? (i.e., is it a good idea to use stairs to make large pyramid type shapes?
: '''Bean:''' personal preference i guess

* Rotation of stairs is difficult off of the X, Y or Z axis.  Any suggestions on how to do off axis rotations?  Are they even a good idea given BSP problems?
: '''Bean:''' just rotate at a given pivot. sometimes, I make stairs by sutracting a stair brush flipped upside down on another brush.

* Spiral staircases introduce higher complexity and problems with semi-realistic texturing.  Any suggestions?
: '''Bean:''' Dont use them, find an alternate. :)

:'''Tarquin:'''  I think [[Legacy:TexAlign|TexAlign]] will handle spiral stairs. Use SHIFT+I to quickly select surfaces by kind. (see [[Legacy:Selecting Surfaces|Selecting Surfaces]])

* Curved staircases - how much of a curve should they have and how many steps per revolution?
: '''Bean:''' Don't use em, dont know. someone step in? :)
  '''Aydin:'''  Ive never had a problem with curved stairs.  I think they are a great addition to any level.  A cylyndrical room with curved staris?  its a great idea!

'''Tarquin:'''  thank you, whoever you are :D I'll expand a bit on some of those later.

'''Bean:''' thanks for the clarification Tarquin, i read some of what i wrote and it didnt sound right :/

'''Phoenix:''' It does look good: Try 64 steps/rotation, and more than that number of steps, and when you subtract it, it looks impressive. It really adds to the feeling in some of my maps of insanity.

[[:Category:Legacy Refactor Me]]

==Related topics ==
* [[Legacy:Architecture|Architecture]] main page
* [[Legacy:Semisolid|Semisolid]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Terrain (UT)</title>
    <id>2038</id>
    <revision>
      <id>4970</id>
      <timestamp>2006-05-13T14:31:44Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>I probably won't understand why the previous editor annotated the correct link instead of just replacing the incorrect one...</comment>
      <text xml:space="preserve">==Ways to Make Terrain ==

===Terrain Brush ===

Vertex Editing the terrain brush shape. Do this by placing the side with all of the vertices facing upward and using editing to lower and raise land where desired.

See [http://members.fortunecity.com/bot40/Terrain/Part1.html Bot_40's Terrain Tutorial]

===Floor Lofter ===

You will need a floor lofter thats all I know. Ued 1 has a floor lofter in it and it works so you could import and export the brushes.

===Tessellated cubes ===

This involves using tessellated cubes to make the terrain in your map-it is like using the terrain brush but you can modify the brush sizes and stuff as you go so it is more configurable

===3rd Party Apps ===

====Using TerraEdit====

[[Legacy:TerraEdit|TerraEdit]] works quite a bit like the editor's Terrain Brush, in that you can manually raise and lower the terrain vertices.  The real benefit is that you can use BMP heightmaps to automatically generated terrain.  It also has a nice smoothing tool that can add a bit of realism.

====Using 3D Studio Max====

Making terrain in [[Legacy:3D Studio Max|3D Studio Max]] is simple. To do so, create the desired size of your terrain using a box primitive (with a good amount of segments), then  convert it to an editable mesh. Next, apply a Displace modifier to the mesh. With the displace modifier, you can apply what is called a &quot;height map&quot; (a greyscale image that actually transform the surface. Black is flat, grey to white are the varying degrees of height) on the surface. You could &quot;paint&quot; an actual path in your favorite image editor and apply it to a surface. Once you are pleased with your results, collapse the mesh, then export to a .dxf file to be imported into UnrealED.

====Using Nem's Mega 3D Terrain Generator====

slightly similar to TerraEdit, by the way you can move things up and down, but is much more powerful and has more tools.  heck, i (Icedude) used it to make a realistic terrain, and i suck at mapping!

[http://nemesis.thewavelength.net Nem's Tools Homepage]

Get 2.3.0, includes dxf support. 

Save as dxf, then import it as a brush.

'''Ike Bart:''' When I tried importing a brush I made in Nem's 3D Terrain Generator version 2.3.0, All I got was a big sheet that looks like my terrain.  I exported that terrain file to a heightmap in BMP format and then imported it into TerraEdit after converting it to 8-bit greyscale exported it again to .t3d format using TerraEdit and there is my terrain brush, nice and solid.

'''Icedude:''' If you add it in a cube the same size as the terrain, it is solid anyway, so you dont need to export it again

===Easy process or high performance? ===

[[Image:Legacy_legalwork_terra_step1.gif|]]

''The hard way''

The easiest way of making terrain for us without 3DS Max is to use Nem's program. The &quot;problem&quot; with it is that it generates many unnecessary polygons, such as in flat areas. To reduce the polycount, and thus improve performance, demands that you need to do your terrain in UED. Of course this might be a bloody headache, but the performance of your map increases and you can add your polygons somewhere else, in example add more trees, make a better bridge over the creek you made and other cute stuff.

Just something for us UT mappers to consider before the mods move to UT2003 :)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4971</id>
      <timestamp>2006-05-13T14:05:40Z</timestamp>
      <contributor>
        <ip>Jan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Ways to Make Terrain ==

===Terrain Brush ===

Vertex Editing the terrain brush shape. Do this by placing the side with all of the vertices facing upward and using editing to lower and raise land where desired.

See [http://members.fortunecity.com/bot40/Terrain/Part1.html Bot_40's Terrain Tutorial]

===Floor Lofter ===

You will need a floor lofter thats all I know. Ued 1 has a floor lofter in it and it works so you could import and export the brushes.

===Tessellated cubes ===

This involves using tessellated cubes to make the terrain in your map-it is like using the terrain brush but you can modify the brush sizes and stuff as you go so it is more configurable

===3rd Party Apps ===

====Using TerraEdit====

[[Legacy:TerraEdit|TerraEdit]] works quite a bit like the editor's Terrain Brush, in that you can manually raise and lower the terrain vertices.  The real benefit is that you can use BMP heightmaps to automatically generated terrain.  It also has a nice smoothing tool that can add a bit of realism.

====Using 3D Studio Max====

Making terrain in [[Legacy:3D Studio Max|3D Studio Max]] is simple. To do so, create the desired size of your terrain using a box primitive (with a good amount of segments), then  convert it to an editable mesh. Next, apply a Displace modifier to the mesh. With the displace modifier, you can apply what is called a &quot;height map&quot; (a greyscale image that actually transform the surface. Black is flat, grey to white are the varying degrees of height) on the surface. You could &quot;paint&quot; an actual path in your favorite image editor and apply it to a surface. Once you are pleased with your results, collapse the mesh, then export to a .dxf file to be imported into UnrealED.

====Using Nem's Mega 3D Terrain Generator====

slightly similar to TerraEdit, by the way you can move things up and down, but is much more powerful and has more tools.  heck, i (Icedude) used it to make a realistic terrain, and i suck at mapping!

[http://countermap.counter-strike.net/Nemesis/index.html Nem's Tools Homepage]DEAD LINK -&gt; http://nemesis.thewavelength.net/

Get 2.3.0, includes dxf support. 

Save as dxf, then import it as a brush.

'''Ike Bart:''' When I tried importing a brush I made in Nem's 3D Terrain Generator version 2.3.0, All I got was a big sheet that looks like my terrain.  I exported that terrain file to a heightmap in BMP format and then imported it into TerraEdit after converting it to 8-bit greyscale exported it again to .t3d format using TerraEdit and there is my terrain brush, nice and solid.

'''Icedude:''' If you add it in a cube the same size as the terrain, it is solid anyway, so you dont need to export it again

===Easy process or high performance? ===

[[Image:Legacy_legalwork_terra_step1.gif|]]

''The hard way''

The easiest way of making terrain for us without 3DS Max is to use Nem's program. The &quot;problem&quot; with it is that it generates many unnecessary polygons, such as in flat areas. To reduce the polycount, and thus improve performance, demands that you need to do your terrain in UED. Of course this might be a bloody headache, but the performance of your map increases and you can add your polygons somewhere else, in example add more trees, make a better bridge over the creek you made and other cute stuff.

Just something for us UT mappers to consider before the mods move to UT2003 :)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34148</id>
      <timestamp>2009-03-26T10:21:31Z</timestamp>
      <contributor>
        <ip>195.37.205.30</ip>
      </contributor>
      <comment>/* Using 3D Studio Max */</comment>
      <text xml:space="preserve">==Ways to Make Terrain ==

===Terrain Brush ===

Vertex Editing the terrain brush shape. Do this by placing the side with all of the vertices facing upward and using editing to lower and raise land where desired.

See [http://members.fortunecity.com/bot40/Terrain/Part1.html Bot_40's Terrain Tutorial]

===Floor Lofter ===

You will need a floor lofter thats all I know. Ued 1 has a floor lofter in it and it works so you could import and export the brushes.

===Tessellated cubes ===

This involves using tessellated cubes to make the terrain in your map-it is like using the terrain brush but you can modify the brush sizes and stuff as you go so it is more configurable

===3rd Party Apps ===

====Using TerraEdit====

[[Legacy:TerraEdit|TerraEdit]] works quite a bit like the editor's Terrain Brush, in that you can manually raise and lower the terrain vertices.  The real benefit is that you can use BMP heightmaps to automatically generated terrain.  It also has a nice smoothing tool that can add a bit of realism.

====Using 3D Studio Max====

Making terrain in [[Legacy:3D Studio Max|3D Studio Max]] is simple. To do so, create the desired size of your terrain using a box primitive (with a good amount of segments), then  convert it to an editable mesh. Next, apply a Displace modifier to the mesh. With the displace modifier, you can apply what is called a &quot;height map&quot; (a greyscale image that actually transform the surface. Grey is flat, black to white are the varying degrees of height) on the surface. You could &quot;paint&quot; an actual path in your favorite image editor and apply it to a surface. Once you are pleased with your results, collapse the mesh, then export to a .dxf file to be imported into UnrealED.

====Using Nem's Mega 3D Terrain Generator====

slightly similar to TerraEdit, by the way you can move things up and down, but is much more powerful and has more tools.  heck, i (Icedude) used it to make a realistic terrain, and i suck at mapping!

[http://nemesis.thewavelength.net Nem's Tools Homepage]

Get 2.3.0, includes dxf support. 

Save as dxf, then import it as a brush.

'''Ike Bart:''' When I tried importing a brush I made in Nem's 3D Terrain Generator version 2.3.0, All I got was a big sheet that looks like my terrain.  I exported that terrain file to a heightmap in BMP format and then imported it into TerraEdit after converting it to 8-bit greyscale exported it again to .t3d format using TerraEdit and there is my terrain brush, nice and solid.

'''Icedude:''' If you add it in a cube the same size as the terrain, it is solid anyway, so you dont need to export it again

===Easy process or high performance? ===

[[Image:Legacy_legalwork_terra_step1.gif|Legacy_legalwork_terra_step1.gif]]

''The hard way''

The easiest way of making terrain for us without 3DS Max is to use Nem's program. The &quot;problem&quot; with it is that it generates many unnecessary polygons, such as in flat areas. To reduce the polycount, and thus improve performance, demands that you need to do your terrain in UED. Of course this might be a bloody headache, but the performance of your map increases and you can add your polygons somewhere else, in example add more trees, make a better bridge over the creek you made and other cute stuff.

Just something for us UT mappers to consider before the mods move to UT2003 :)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Trim</title>
    <id>1812</id>
    <revision>
      <id>4446</id>
      <timestamp>2007-11-29T06:35:00Z</timestamp>
      <contributor>
        <ip>C-67-183-171-184.hsd1.wa.comcast.net</ip>
      </contributor>
      <comment>Made directions a little more specific</comment>
      <text xml:space="preserve">Trim is simply another term for &quot;edging&quot;.  Take a look at the ledges and edges of surfaces and platforms within any map and you will see that the texture around the edges is different to that used for the main floor texture.

Trim helps break up the floor textures used and when done well can make the level look much &quot;cleaner&quot;.  It can also make the level look more plausible; see-through walkways with solid edges for supports for example.

==Subtractive trim ==

(First of all, can someone explain *what is trim*?)

The basic idea is that if you want trim around the base of a room, flush with the wall:
* make a subtractive brush that is the same base width and length as the room, and 32 high. Subtract this to create a change in texture on the wall and make the room brush smaller too so they don't overlap.
* alternative method: use clipping to split the room subtract 32 units above the floor. (NB split, not clip &amp;ndash; produce two brushes)

This technique is useful for walkways and ledges too: instead of subtracting a large room &amp; adding in a ledge, subtract 3 brushes:
* below the ledge
* above the ledge
* and a ledge-thickness piece sandwiched in between

This gives you free trim all the way around the room, but there can only be one direction for the texture.  If your trim needs to be directional, try seperate pieces by [[Legacy:Making Trim With The Extruder|making trim with the extruder]].

==Related Topics==
* [[Legacy:Making Trim With The Extruder|Making Trim With The Extruder]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Design|Map Design]]

==Discussion==

'''EntropicLqd:''' If you do it this way don't add a zone portal at the point the two subtract brushes meet.  I did that once and my level got flooded with lava :(  Took ages to figure out what was causing it.

'''Tarquin:''' I can't see how that could have been the problem. Zone Portals can cut across several subtracts.

'''EntropicLqd:'' Me neither - but I moved the zone portal down by 8 units and it was fine after that.  Here's a small diagram of what I had prior to moving the zone portal down:

 |                       |
 |                       |
 +- Zone portal at join -+
 |                       |
 |                       |

: The + symbols show the point at which the subtract brushes met.  They were adjacent and all the rest of it.  It's possible that it was the rebuild that solved the problem - but then why didn't the other zillion previous rebuilds do the same?  Dunno m8.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4447</id>
      <timestamp>2007-01-07T22:03:40Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>Added additional topic</comment>
      <text xml:space="preserve">Trim is simply another term for &quot;edging&quot;.  Take a look at the ledges and edges of surfaces and platforms within any map and you will see that the texture around the edges is different to that used for the main floor texture.

Trim helps break up the floor textures used and when done well can make the level look much &quot;cleaner&quot;.  It can also make the level look more plausible; see-through walkways with solid edges for supports for example.

==Subtractive trim ==

(First of all, can someone explain *what is trim*?)

The basic idea is that if you want trim around the base of a room, flush with the wall:
* make a subtract (What is a &quot;subtract&quot;? If you mean &quot;subtractive brush&quot; you should say that. &quot;Subtract&quot; is a verb.) the same base size as the room, and 32 high. (&lt;&amp;ndash; If it's the &quot;same base size&quot; as the room why is it only 32 high? Shouldn't it be the &quot;same width and length as the room but only 32 high&quot;?) Subtract this, and make the room brush smaller too so they don't overlap. (&lt;&amp;rarr; Subtract this from what? How can you subtract this brush from an empty space? I don't understand this explanation.)
* alternative method: use clipping to split the room subtract 32 units above the floor. (NB split, not clip &amp;ndash; produce two brushes)

This technique is useful for walkways and ledges too: instead of subtracting a large room &amp; adding in a ledge, subtract 3 brushes:
* below the ledge
* above the ledge
* and a ledge-thickness piece sandwiched in between

This gives you free trim all the way around the room, but there can only be one direction for the texture.  If your trim needs to be directional, try seperate pieces by [[Legacy:Making Trim With The Extruder|making trim with the extruder]].

==Related Topics==
* [[Legacy:Making Trim With The Extruder|Making Trim With The Extruder]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Architecture|Architecture]]
* [[Legacy:Map Design|Map Design]]

==Discussion==

'''EntropicLqd:''' If you do it this way don't add a zone portal at the point the two subtract brushes meet.  I did that once and my level got flooded with lava :(  Took ages to figure out what was causing it.

'''Tarquin:''' I can't see how that could have been the problem. Zone Portals can cut across several subtracts.

'''EntropicLqd:'' Me neither - but I moved the zone portal down by 8 units and it was fine after that.  Here's a small diagram of what I had prior to moving the zone portal down:

 |                       |
 |                       |
 +- Zone portal at join -+
 |                       |
 |                       |

: The + symbols show the point at which the subtract brushes met.  They were adjacent and all the rest of it.  It's possible that it was the rebuild that solved the problem - but then why didn't the other zillion previous rebuilds do the same?  Dunno m8.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Trim With The Extruder</title>
    <id>1772</id>
    <revision>
      <id>4348</id>
      <timestamp>2007-01-07T21:14:09Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] can be used to make segmented trim brushes. This tutorial assumes that you're vaguely familiar with the concept of the Extruder brushbuilder. See the [[Legacy:Architecture|Architecture]] topic page for more on trim.

(BTW peeps, this tutorial I'm sure will confuse all but the l33test of quaternion-jedi, so please feel free to edit. Yes, I'll add pics later but today I'm in Grouch-mode so I'm currently inclined to say &quot;if you can't visualise in 3D go and edit for Tetris&quot;)

==Simple corners ==

Let's suppose we have a square room created by a large subtractive cube brush. Adding another cube with half the dimensions will create a raised area in one corner. We're going to add trim around the edge. Suppose the large room is 256x256x256 (although the height doesn't matter), and the shelf area is 128x128x128. A corner of the small brush is on a corner of the large one.

The quick &amp; simple way to add trim to this shelf would be to whip up two brushes, 256 long with a square cross-section of 32. However, for the sake of illustration we're going to do something a little more complicated. (If this is &quot;more complicated&quot; why should we learn how to do it? Common sense says simpler things work better.)

====Shape ====

Leave the ''ShapeSource'' property set to &quot;SO_pSquare&quot; (the preset square). This builds a square of side 1 in the Extruder's ShapePoints array, so set the ''ShapeFactor'' property to multiply it up to the size of trim that we want: in this example, that's 32.

====Path ====

We'll be working with the path in Top view, so &quot;up&quot; &amp; &quot;left&quot; refer to directions in that orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. Suppose the shelf occupies the lower left corner of the room. The path needs 3 points, and it needs to go right, then down. The simplest way to describe this shape is:
*[0] ( 0, 0, 0 )
*[1] ( 1, 0, 0 )
*[2] ( 1, 1, 0 )

Things to remember: 
* Unreal uses a left-handed coordinate system, so the positive y-axis goes down in top view.
* The cordinates of the path are in the [[Legacy:Red Builder Brush|red builder brush]]'s personal system. In other words, they're relative to where the RBB is placed in the world. (okay, that needs a rewrite for clarity)

The path coordinates are nice, simple numbers, that can be scaled to any size with the ''PathFactor'' property. An easy way to work with this is to set the grid to the same size as the value of PathFactor and then count grid squares. Here, set PathFactor to 128.

Just to confuse: with the relative paths option, describing a path with vectors is even simpler. Each vector is how far to travel from the previous point. The path in relative vectors is:
*[0] ( 0, 0, 0 )r
*[1] ( 1, 0, 0 )r
*[2] ( 0, 1, 0 )r

The ''PathSource'' property tells the Extruder which method you're using to describe the path.

Try either method, press build, and line up the RBB to the correct spot and add it to the world. The texture may need to be rotated, depending on whether the trim texture you've selected is horizontal or vertical. If this is the case, select any of the trim brush's surfaces, press SHIFT+B and rotate them by 90 degrees. (related reading: [[Legacy:Selecting Surfaces|Selecting Surfaces]] and [[Legacy:Surface Properties Window|Surface Properties Window]]).

==External Corner ==

Suppose now that we want to add trim that goes around the base of the shelf. We could use the same brush and obtain a surface that's flush with the main wall. Alternatively, we might want a brush that protrudes like a step, or a brush embedded in the floor. The current shape of the RBB is too short at each end to do this.

We could simply use [[Legacy:Vertex Editing|vertex editing]] or [[Legacy:Face Drag|face drag]] on each end, or we could fiddle with the path points. The first method would be fine for a simple piece of trim like this, and the second method is fiddly because with the current PathFactor we'd need to type in fractions. Far too much work.

Instead, we're going to keep the path exactly as it is: it follows the edge of the shelf so from an esthetical point of view it makes sense not to change it. We're going to change the shape instead. Position the camera in the 3D viewport so you're level with the RBB and looking at the first path point. In the Top view the camera icon will be to the immediate left of the RBB. You'll see a red cross, the [[Legacy:Pivot|pivot]] point, in the upper left corner of the end face of the brush. The pivot point corresponds to (0,0,0) in the shape co-ordinates.

This is where it gets technical. The square that make the end face of the brush is the Extruder's initial Shape. It's been tilted by 90 degrees because the first path segment travels along the x-axis and not straight up. If you find this next section totally confusing, reset the path points to (0, 0, 0), (0, 0, 1) and it will be easier to see what is happening.

We want the shape to move from its current position 1 unit to the left, so the pivot point is in the upper right corner. As we're using the preset system to make the shape, we can tell it to do that very simply. The ''PresetMetrics'' array gives the presets module of the Extruder extra information about the shape we want. 
* The first pair of values gives the width &amp; height of the square. They're currently zero, which tells the module to use default values. 
* The second pair of values gives the offset of the shape; in other words the 2-dimensional coordinates of the top left corner of the square in Shape-space. Confused? Try setting PresetMetrics[2] to 1 and press Build. The pivot cross stays in the same place, but the rest of the brush has moved down by 32 world units.

Now set [2] back to 0, and set [3] to -1. The brush moves back up and to the left. Looking in Top view, you can by selecting the added trim brush and the RBB in turn that their pivot point is in the same place: this is because they have the same path. 

All we've essentially done is told the Extruder attach the shape to the path at a different point.

==45 degree turns ==

Now let's make the shape we're trimming a little more complex. Either delete both trim brushes, or make another room in the world by duplicating the two cubes and rebuilding.

Use [[Legacy:Brush Clipping|brush clipping]] to slice off a piece of the additive brush: cut diagonally across the corner that's in the center of the room &amp;ndash; ie place a clip marker halfway along the top side and right side.

To trim this new shape, we need to follow its edge with the path as before. We'll need 4 points this time. If we work with the same scale the second point will be (0.5,0,0) so to simplify the points, change the PathFactor and the Grid to 64. Counting the squares gives our path as:
* [0] ( 0, 0, 0 )
* [1] ( 1, 0, 0 )
* [2] ( 2, 1, 0 )
* [3] ( 2, 2, 0 )

Note that these are absolute, so change ''PathSource'' back from earlier. The trim can follow the path on the inside or the outside, as above.

[[Image:Legacy_extruder.trim1.gif|center|]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4349</id>
      <timestamp>2003-05-25T08:55:00Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">The [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] can be used to make segmented trim brushes. This tutorial assumes that you're vaguely familiar with the concept of the Extruder brushbuilder. See the [[Legacy:Architecture|Architecture]] topic page for more on trim.

(BTW peeps, this tutorial I'm sure will confuse all but the l33test of quaternion-jedi, so please feel free to edit. Yes, I'll add pics later but today I'm in Grouch-mode so I'm currently inclined to say &quot;if you can't visualise in 3D go and edit for Tetris&quot;)

==Simple corners ==

Let's suppose we have a square room created by a large subtractive cube brush. Adding another cube with half the dimensions will create a raised area in one corner. We're going to add trim around the edge. Suppose the large room is 256x256x256 (although the height doesn't matter), and the shelf area is 128x128x128. A corner of the small brush is on a corner of the large one.

The quick &amp; simple way to add trim to this shelf would be to whip up two brushes, 256 long with a square cross-section of 32. However, for the sake of illustration we're going to do something a little more complicated.

====Shape ====

Leave the ''ShapeSource'' property set to &quot;SO_pSquare&quot; (the preset square). This builds a square of side 1 in the Extruder's ShapePoints array, so set the ''ShapeFactor'' property to multiply it up to the size of trim that we want: in this example, that's 32.

====Path ====

We'll be working with the path in Top view, so &quot;up&quot; &amp; &quot;left&quot; refer to directions in that orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. Suppose the shelf occupies the lower left corner of the room. The path needs 3 points, and it needs to go right, then down. The simplest way to describe this shape is:
*[0] ( 0, 0, 0 )
*[1] ( 1, 0, 0 )
*[2] ( 1, 1, 0 )

Things to remember: 
* Unreal uses a left-handed coordinate system, so the positive y-axis goes down in top view.
* The cordinates of the path are in the [[Legacy:Red Builder Brush|red builder brush]]'s personal system. In other words, they're relative to where the RBB is placed in the world. (okay, that needs a rewrite for clarity)

The path coordinates are nice, simple numbers, that can be scaled to any size with the ''PathFactor'' property. An easy way to work with this is to set the grid to the same size as the value of PathFactor and then count grid squares. Here, set PathFactor to 128.

Just to confuse: with the relative paths option, describing a path with vectors is even simpler. Each vector is how far to travel from the previous point. The path in relative vectors is:
*[0] ( 0, 0, 0 )r
*[1] ( 1, 0, 0 )r
*[2] ( 0, 1, 0 )r

The ''PathSource'' property tells the Extruder which method you're using to describe the path.

Try either method, press build, and line up the RBB to the correct spot and add it to the world. The texture may need to be rotated, depending on whether the trim texture you've selected is horizontal or vertical. If this is the case, select any of the trim brush's surfaces, press SHIFT+B and rotate them by 90 degrees. (related reading: [[Legacy:Selecting Surfaces|Selecting Surfaces]] and [[Legacy:Surface Properties Window|Surface Properties Window]]).

==External Corner ==

Suppose now that we want to add trim that goes around the base of the shelf. We could use the same brush and obtain a surface that's flush with the main wall. Alternatively, we might want a brush that protrudes like a step, or a brush embedded in the floor. The current shape of the RBB is too short at each end to do this.

We could simply use [[Legacy:Vertex Editing|vertex editing]] or [[Legacy:Face Drag|face drag]] on each end, or we could fiddle with the path points. The first method would be fine for a simple piece of trim like this, and the second method is fiddly because with the current PathFactor we'd need to type in fractions. Far too much work.

Instead, we're going to keep the path exactly as it is: it follows the edge of the shelf so from an esthetical point of view it makes sense not to change it. We're going to change the shape instead. Position the camera in the 3D viewport so you're level with the RBB and looking at the first path point. In the Top view the camera icon will be to the immediate left of the RBB. You'll see a red cross, the [[Legacy:Pivot|pivot]] point, in the upper left corner of the end face of the brush. The pivot point corresponds to (0,0,0) in the shape co-ordinates.

This is where it gets technical. The square that make the end face of the brush is the Extruder's initial Shape. It's been tilted by 90 degrees because the first path segment travels along the x-axis and not straight up. If you find this next section totally confusing, reset the path points to (0, 0, 0), (0, 0, 1) and it will be easier to see what is happening.

We want the shape to move from its current position 1 unit to the left, so the pivot point is in the upper right corner. As we're using the preset system to make the shape, we can tell it to do that very simply. The ''PresetMetrics'' array gives the presets module of the Extruder extra information about the shape we want. 
* The first pair of values gives the width &amp; height of the square. They're currently zero, which tells the module to use default values. 
* The second pair of values gives the offset of the shape; in other words the 2-dimensional coordinates of the top left corner of the square in Shape-space. Confused? Try setting PresetMetrics[2] to 1 and press Build. The pivot cross stays in the same place, but the rest of the brush has moved down by 32 world units.

Now set [2] back to 0, and set [3] to -1. The brush moves back up and to the left. Looking in Top view, you can by selecting the added trim brush and the RBB in turn that their pivot point is in the same place: this is because they have the same path. 

All we've essentially done is told the Extruder attach the shape to the path at a different point.

==45 degree turns ==

Now let's make the shape we're trimming a little more complex. Either delete both trim brushes, or make another room in the world by duplicating the two cubes and rebuilding.

Use [[Legacy:Brush Clipping|brush clipping]] to slice off a piece of the additive brush: cut diagonally across the corner that's in the center of the room &amp;ndash; ie place a clip marker halfway along the top side and right side.

To trim this new shape, we need to follow its edge with the path as before. We'll need 4 points this time. If we work with the same scale the second point will be (0.5,0,0) so to simplify the points, change the PathFactor and the Grid to 64. Counting the squares gives our path as:
* [0] ( 0, 0, 0 )
* [1] ( 1, 0, 0 )
* [2] ( 2, 1, 0 )
* [3] ( 2, 2, 0 )

Note that these are absolute, so change ''PathSource'' back from earlier. The trim can follow the path on the inside or the outside, as above.

[[Image:Legacy_extruder.trim1.gif|center|]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4350</id>
      <timestamp>2007-01-07T21:13:36Z</timestamp>
      <contributor>
        <ip>Pool-138-88-234-43.res.east.verizon.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The [[Legacy:Extruder Brushbuilder|Extruder Brushbuilder]] can be used to make segmented trim brushes. This tutorial assumes that you're vaguely familiar with the concept of the Extruder brushbuilder. See the [[Legacy:Architecture|Architecture]] topic page for more on trim.

(BTW peeps, this tutorial I'm sure will confuse all but the l33test of quaternion-jedi, so please feel free to edit. Yes, I'll add pics later but today I'm in Grouch-mode so I'm currently inclined to say &quot;if you can't visualise in 3D go and edit for Tetris&quot;)

==Simple corners ==

Let's suppose we have a square room created by a large subtractive cube brush. Adding another cube with half the dimensions will create a raised area in one corner. We're going to add trim around the edge. Suppose the large room is 256x256x256 (although the height doesn't matter), and the shelf area is 128x128x128. A corner of the small brush is on a corner of the large one.

The quick &amp; simple way to add trim to this shelf would be to whip up two brushes, 256 long with a square cross-section of 32. However, for the sake of illustration we're going to do something a little more complicated. (If this is &quot;more complicated&quot; why should we learn how to do it?)

====Shape ====

Leave the ''ShapeSource'' property set to &quot;SO_pSquare&quot; (the preset square). This builds a square of side 1 in the Extruder's ShapePoints array, so set the ''ShapeFactor'' property to multiply it up to the size of trim that we want: in this example, that's 32.

====Path ====

We'll be working with the path in Top view, so &quot;up&quot; &amp; &quot;left&quot; refer to directions in that orthogonal [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]. Suppose the shelf occupies the lower left corner of the room. The path needs 3 points, and it needs to go right, then down. The simplest way to describe this shape is:
*[0] ( 0, 0, 0 )
*[1] ( 1, 0, 0 )
*[2] ( 1, 1, 0 )

Things to remember: 
* Unreal uses a left-handed coordinate system, so the positive y-axis goes down in top view.
* The cordinates of the path are in the [[Legacy:Red Builder Brush|red builder brush]]'s personal system. In other words, they're relative to where the RBB is placed in the world. (okay, that needs a rewrite for clarity)

The path coordinates are nice, simple numbers, that can be scaled to any size with the ''PathFactor'' property. An easy way to work with this is to set the grid to the same size as the value of PathFactor and then count grid squares. Here, set PathFactor to 128.

Just to confuse: with the relative paths option, describing a path with vectors is even simpler. Each vector is how far to travel from the previous point. The path in relative vectors is:
*[0] ( 0, 0, 0 )r
*[1] ( 1, 0, 0 )r
*[2] ( 0, 1, 0 )r

The ''PathSource'' property tells the Extruder which method you're using to describe the path.

Try either method, press build, and line up the RBB to the correct spot and add it to the world. The texture may need to be rotated, depending on whether the trim texture you've selected is horizontal or vertical. If this is the case, select any of the trim brush's surfaces, press SHIFT+B and rotate them by 90 degrees. (related reading: [[Legacy:Selecting Surfaces|Selecting Surfaces]] and [[Legacy:Surface Properties Window|Surface Properties Window]]).

==External Corner ==

Suppose now that we want to add trim that goes around the base of the shelf. We could use the same brush and obtain a surface that's flush with the main wall. Alternatively, we might want a brush that protrudes like a step, or a brush embedded in the floor. The current shape of the RBB is too short at each end to do this.

We could simply use [[Legacy:Vertex Editing|vertex editing]] or [[Legacy:Face Drag|face drag]] on each end, or we could fiddle with the path points. The first method would be fine for a simple piece of trim like this, and the second method is fiddly because with the current PathFactor we'd need to type in fractions. Far too much work.

Instead, we're going to keep the path exactly as it is: it follows the edge of the shelf so from an esthetical point of view it makes sense not to change it. We're going to change the shape instead. Position the camera in the 3D viewport so you're level with the RBB and looking at the first path point. In the Top view the camera icon will be to the immediate left of the RBB. You'll see a red cross, the [[Legacy:Pivot|pivot]] point, in the upper left corner of the end face of the brush. The pivot point corresponds to (0,0,0) in the shape co-ordinates.

This is where it gets technical. The square that make the end face of the brush is the Extruder's initial Shape. It's been tilted by 90 degrees because the first path segment travels along the x-axis and not straight up. If you find this next section totally confusing, reset the path points to (0, 0, 0), (0, 0, 1) and it will be easier to see what is happening.

We want the shape to move from its current position 1 unit to the left, so the pivot point is in the upper right corner. As we're using the preset system to make the shape, we can tell it to do that very simply. The ''PresetMetrics'' array gives the presets module of the Extruder extra information about the shape we want. 
* The first pair of values gives the width &amp; height of the square. They're currently zero, which tells the module to use default values. 
* The second pair of values gives the offset of the shape; in other words the 2-dimensional coordinates of the top left corner of the square in Shape-space. Confused? Try setting PresetMetrics[2] to 1 and press Build. The pivot cross stays in the same place, but the rest of the brush has moved down by 32 world units.

Now set [2] back to 0, and set [3] to -1. The brush moves back up and to the left. Looking in Top view, you can by selecting the added trim brush and the RBB in turn that their pivot point is in the same place: this is because they have the same path. 

All we've essentially done is told the Extruder attach the shape to the path at a different point.

==45 degree turns ==

Now let's make the shape we're trimming a little more complex. Either delete both trim brushes, or make another room in the world by duplicating the two cubes and rebuilding.

Use [[Legacy:Brush Clipping|brush clipping]] to slice off a piece of the additive brush: cut diagonally across the corner that's in the center of the room &amp;ndash; ie place a clip marker halfway along the top side and right side.

To trim this new shape, we need to follow its edge with the path as before. We'll need 4 points this time. If we work with the same scale the second point will be (0.5,0,0) so to simplify the points, change the PathFactor and the Grid to 64. Counting the squares gives our path as:
* [0] ( 0, 0, 0 )
* [1] ( 1, 0, 0 )
* [2] ( 2, 1, 0 )
* [3] ( 2, 2, 0 )

Note that these are absolute, so change ''PathSource'' back from earlier. The trim can follow the path on the inside or the outside, as above.

[[Image:Legacy_extruder.trim1.gif|center|]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Unreal Tournament Decorations (Vertex)</title>
    <id>1821</id>
    <revision>
      <id>4468</id>
      <timestamp>2003-07-18T23:31:51Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

This is a great way for a beginner to get started on modeling for Unreal Tournament. Even though great tools like [[Legacy:MeshMaker|MeshMaker]] exist, learning the old fashioned way of importing models can teach good skills like setting up a project and compiling and working with Unrealscript.

To export a model from Max into something UT can use takes a few steps you must follow before actually exporting the object. For simplicity I'm assuming the decoration has no animations.

: &quot;Max&quot; means [[Legacy:3D Studio Max|3D Studio Max]], right?  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

===Export from Max ===

* It must be one object and named with a &quot;01&quot; at the end. For example: boulder01. It also needs texture coordinates 
* It must not be bigger than a 256x256 grid extent centered on the origin. You can scale it to suit in script later so don't fret over that yet. 
* Place a blank material on the object called &quot;Skin&quot;. 
* Export to .3ds.

===Import ===

Now, setting up your stuff for import into Unrealtournament. This is fun.

* Open up UnrealEd and then the Class Browser (little chess piece icon).

* Choose File -&gt; Export All Scripts and let it burn. Close down UnrealEd.

* Open up your UnrealTournament folder and create a subfolder called MyDecoration (or whatever). Create two subfolders in MyDecoration called Classes and Models.

:: ''This step is explained in so many pages, it should be on [[:Category:Legacy Basic Procedure]]. Ideas for a page name? &quot;Set up a package folder&quot; maybe?''  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
* Open up the file called Unrealtournament.ini located in your Unrealtournament\System directory. About half way down you will see a bunch of stuff saying &quot;EditPackages=Botpack&quot;, etc. Add a line to those that says &quot;EditPackages=MyDecoration&quot;. Save the file

* Download [[Legacy:3ds2unr|3ds2unr]] from http://unreal.epicgames.com; the link is in the 3ds2unr doc located in the links to the left of the page. Extract the zip to a folder called C:\3ds2unr (create it).

* Open up a DOS prompt window. Type: &quot;cd\3ds2unr&quot;. Then type: &quot;3ds2unr -setproj&quot;

A Browse window will pop up. Point to the MyDecoration folder under your Unrealtournament folder. Hit ok. Minimize the DOS prompt window

* Place your .3ds file into the 3ds2unr directory

* Bring up the DOS prompt again. Type: &quot;3ds2unr MyDecoration whatever.3ds&quot; 

(&quot;Whatever&quot; being the name of your .3ds file of course) Minimize the window again

* You will now have in the Classes directory of your MyDecoration folder a .uc file called &quot;MyDecoration.uc&quot;. In the models folder will be two files called &quot;MyDecoration_a.3d&quot; and &quot;MyDecoration_d.3d&quot; &lt;br /&gt;If you get any errors it's most likely because you did something wrong when exporting it from Max, like leaving a hidden object like a light around or something

* Place your 8 bit 256 color .pcx skin in the Models directory. Look in the .uc (in your Classes directory) for a line that says &quot;#exec TEXTURE IMPORT NAME=Jwhatever1 FILE=MODELS\whatever0.PCX GROUP=Skins

* Change the .pcx name in the script to the name of your .pcx skin. Or vice versa. Doesn't matter as long as both names are the same

* At the top of the script is a line that says &quot;Class MyDecoration expands Actor;&quot;

Change it to read: &quot;Class MyDecoration extends ut_Decoration;&quot;. Save the .uc file.

* Bring up your DOS prompt window again and type &quot;cd\Unrealtournament\System&quot;. Then type &quot;ucc make&quot;

* Your code and model files will compile and may take a minute or so to get through checking all of UT's packages. If all goes well (i.e. no errors or warnings) you will have a file in your UT\System directory called MyDecoration.u.

You can now load that into your map from UnrealEd at will and your class will show up under Actor &gt;&gt; Decoration &gt;&gt; ut_Decoration in the [[Legacy:Actor Classes Browser|Actor Classes Browser]]. You can also control its scale in the script by adding &quot;DrawScale=&quot; ,with 1 being its default size, to one of the lines under the DefaultProperties of the .uc file (at the bottom). If you recompile the code again, make sure you delete the MyDecoration.u file from your System directory first. Look at other ut_Decoration scripts located in ..\Unrealtournament\Botpack\Classes to get more default properties you can use for your decoration, like solidity.

'''Bean:''' Note, if you use an old version of 3ds2unr, such as the one at [http://unreal.epicgames.com Epic's Unreal Site], you may encounter some problems with skins on decorations being mirrored backwards randomly. It's actually quite odd how that happens. If you are using an old version, encounter the problem, and don't feel like grabbing an updated version, just go into Photoshop and flip your canvas horizontally for the skin.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4469</id>
      <timestamp>2002-07-08T11:53:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Introduction ===

This is a great way for a beginner to get started on modeling for Unreal Tournament. Even though great tools like [[Legacy:MeshMaker|MeshMaker]] exist, learning the old fashioned way of importing models can teach good skills like setting up a project and compiling and working with Unrealscript.

To export a model from Max into something UT can use takes a few steps you must follow before actually exporting the object. For simplicity I'm assuming the decoration has no animations.

* It must be one object and named with a &quot;01&quot; at the end. For example: boulder01. It also needs texture coordinates 
* It must not be bigger than a 256x256 grid extent centered on the origin. You can scale it to suit in script later so don't fret over that yet. 
* Place a blank material on the object called &quot;Skin&quot;. 
* Export to .3ds.

====Import ====

Now, setting up your stuff for import into Unrealtournament. This is fun.

* Open up UnrealEd and then the Class Browser (little chess piece icon).

* Choose File -&gt; Export All Scripts and let it burn. Close down UnrealEd.

* Open up your UnrealTournament folder and create a subfolder called MyDecoration (or whatever). Create two subfolders in MyDecoration called Classes and Models.

: This step is explained in so many pages, it should be on [[:Category:Legacy Basic Procedure]]. Ideas for a page name? &quot;Set up a package folder&quot; maybe?  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
* Open up the file called Unrealtournament.ini located in your Unrealtournament\System directory. About half way down you will see a bunch of stuff saying &quot;EditPackages=Botpack&quot;, etc. Add a line to those that says &quot;EditPackages=MyDecoration&quot;. Save the file

* Download 3ds2unr from http://unreal.epicgames.com; the link is in the 3ds2unr doc located in the links to the left of the page. Extract the zip to a folder called C:\3ds2unr (create it).

* Open up a DOS prompt window. Type: &quot;cd\3ds2unr&quot;. Then type: &quot;3ds2unr -setproj&quot;

A Browse window will pop up. Point to the MyDecoration folder under your Unrealtournament folder. Hit ok. Minimize the DOS prompt window

* Place your .3ds file into the 3ds2unr directory

* Bring up the DOS prompt again. Type: &quot;3ds2unr MyDecoration whatever.3ds&quot; 

(&quot;Whatever&quot; being the name of your .3ds file of course) Minimize the window again

* You will now have in the Classes directory of your MyDecoration folder a .uc file called &quot;MyDecoration.uc&quot;. In the models folder will be two files called &quot;MyDecoration_a.3d&quot; and &quot;MyDecoration_d.3d&quot; 

If you get any errors it's most likely because you did something wrong when exporting it from Max, like leaving a hidden object like a light around or something

* Place your 8 bit 256 color .pcx skin in the Models directory. Look in the .uc (in your Classes directory) for a line that says &quot;#exec TEXTURE IMPORT NAME=Jwhatever1 FILE=MODELS\whatever0.PCX GROUP=Skins

* Change the .pcx name in the script to the name of your .pcx skin. Or vice versa. Doesn't matter as long as both names are the same

* At the top of the script is a line that says &quot;Class MyDecoration expands Actor;&quot;

Change it to read: &quot;Class MyDecoration extends ut_Decoration;&quot;. Save the .uc file.

* Bring up your DOS prompt window again and type &quot;cd\Unrealtournament\System&quot;. Then type &quot;ucc make&quot;

* Your code and model files will compile and may take a minute or so to get through checking all of UT's packages. If all goes well (i.e. no errors or warnings) you will have a file in your UT\System directory called MyDecoration.u.

You can now load that into your map from UnrealEd at will and your class will show up under Actor&gt;Decoration&gt;ut_Decoration in the class browser. You can also control its scale in the script by adding &quot;DrawScale=&quot; ,with 1 being it's default size, to one of the lines under the DefaultProperties of the .uc file (at the bottom). If you recompile the code again, make sure you delete the MyDecoration.u file from your System directory first. Look at other ut_Decoration scripts located in ..\Unrealtournament\Botpack\Classes to get more default properties you can use for your decoration, like solidity.

'''Bean:''' Note, if you use an old version of 3ds2unr, such as the one at [http://unreal.epicgames.com Epic's Unreal Site], you may encounter some problems with skins on decorations being mirrored backwards randomly. It's actually quite odd how that happens. If you are using an old version, encounter the problem, and don't feel like grabbing an updated version, just go into Photoshop and flip your canvas horizontally for the skin.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4470</id>
      <timestamp>2002-07-21T15:56:14Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction ==

This is a great way for a beginner to get started on modeling for Unreal Tournament. Even though great tools like [[Legacy:MeshMaker|MeshMaker]] exist, learning the old fashioned way of importing models can teach good skills like setting up a project and compiling and working with Unrealscript.

To export a model from Max into something UT can use takes a few steps you must follow before actually exporting the object. For simplicity I'm assuming the decoration has no animations.

: &quot;Max&quot; means [[Legacy:3D Studio Max|3D Studio Max]], right?  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

===Export from Max ===

* It must be one object and named with a &quot;01&quot; at the end. For example: boulder01. It also needs texture coordinates 
* It must not be bigger than a 256x256 grid extent centered on the origin. You can scale it to suit in script later so don't fret over that yet. 
* Place a blank material on the object called &quot;Skin&quot;. 
* Export to .3ds.

===Import ===

Now, setting up your stuff for import into Unrealtournament. This is fun.

* Open up UnrealEd and then the Class Browser (little chess piece icon).

* Choose File -&gt; Export All Scripts and let it burn. Close down UnrealEd.

* Open up your UnrealTournament folder and create a subfolder called MyDecoration (or whatever). Create two subfolders in MyDecoration called Classes and Models.

:: ''This step is explained in so many pages, it should be on [[:Category:Legacy Basic Procedure]]. Ideas for a page name? &quot;Set up a package folder&quot; maybe?''  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
* Open up the file called Unrealtournament.ini located in your Unrealtournament\System directory. About half way down you will see a bunch of stuff saying &quot;EditPackages=Botpack&quot;, etc. Add a line to those that says &quot;EditPackages=MyDecoration&quot;. Save the file

* Download [[Legacy:3ds2unr|3ds2unr]] from http://unreal.epicgames.com; the link is in the 3ds2unr doc located in the links to the left of the page. Extract the zip to a folder called C:\3ds2unr (create it).

* Open up a DOS prompt window. Type: &quot;cd\3ds2unr&quot;. Then type: &quot;3ds2unr -setproj&quot;

A Browse window will pop up. Point to the MyDecoration folder under your Unrealtournament folder. Hit ok. Minimize the DOS prompt window

* Place your .3ds file into the 3ds2unr directory

* Bring up the DOS prompt again. Type: &quot;3ds2unr MyDecoration whatever.3ds&quot; 

(&quot;Whatever&quot; being the name of your .3ds file of course) Minimize the window again

* You will now have in the Classes directory of your MyDecoration folder a .uc file called &quot;MyDecoration.uc&quot;. In the models folder will be two files called &quot;MyDecoration_a.3d&quot; and &quot;MyDecoration_d.3d&quot; &lt;br /&gt;If you get any errors it's most likely because you did something wrong when exporting it from Max, like leaving a hidden object like a light around or something

* Place your 8 bit 256 color .pcx skin in the Models directory. Look in the .uc (in your Classes directory) for a line that says &quot;#exec TEXTURE IMPORT NAME=Jwhatever1 FILE=MODELS\whatever0.PCX GROUP=Skins

* Change the .pcx name in the script to the name of your .pcx skin. Or vice versa. Doesn't matter as long as both names are the same

* At the top of the script is a line that says &quot;Class MyDecoration expands Actor;&quot;

Change it to read: &quot;Class MyDecoration extends ut_Decoration;&quot;. Save the .uc file.

* Bring up your DOS prompt window again and type &quot;cd\Unrealtournament\System&quot;. Then type &quot;ucc make&quot;

* Your code and model files will compile and may take a minute or so to get through checking all of UT's packages. If all goes well (i.e. no errors or warnings) you will have a file in your UT\System directory called MyDecoration.u.

You can now load that into your map from UnrealEd at will and your class will show up under Actor &gt;&gt; Decoration &gt;&gt; ut_Decoration in the [[Legacy:Actor Classes Browser|Actor Classes Browser]]. You can also control its scale in the script by adding &quot;DrawScale=&quot; ,with 1 being its default size, to one of the lines under the DefaultProperties of the .uc file (at the bottom). If you recompile the code again, make sure you delete the MyDecoration.u file from your System directory first. Look at other ut_Decoration scripts located in ..\Unrealtournament\Botpack\Classes to get more default properties you can use for your decoration, like solidity.

'''Bean:''' Note, if you use an old version of 3ds2unr, such as the one at [http://unreal.epicgames.com Epic's Unreal Site], you may encounter some problems with skins on decorations being mirrored backwards randomly. It's actually quite odd how that happens. If you are using an old version, encounter the problem, and don't feel like grabbing an updated version, just go into Photoshop and flip your canvas horizontally for the skin.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Water (UT)</title>
    <id>2197</id>
    <revision>
      <id>5326</id>
      <timestamp>2005-02-06T17:54:45Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">How do you create water zone endings?

'''evil_blue_dude:''' This is a sad excuse for a page.

'''T1:''' Why does this page even exist?

'''Tarquin:''' It shouldn't. It's just a n00b creating it from a link. I was going to move the [[Legacy:Making Liquids (UT)|Making Liquids (UT)]] page to this title.</text>
    </revision>
    <revision>
      <id>5327</id>
      <timestamp>2005-02-06T15:27:15Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">How do you create water zone endings?

'''evil_blue_dude:''' This is a sad excuse for a page.

'''T1:''' Why does this page even exist?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Waterfalls</title>
    <id>1773</id>
    <revision>
      <id>4351</id>
      <timestamp>2004-07-22T07:56:00Z</timestamp>
      <contributor>
        <ip>Buu</ip>
      </contributor>
      <comment>added basic waterfall tut</comment>
      <text xml:space="preserve">==Creating The Waterfall ==

This is a tutorial for a texture that is already moving.

1 Choose a nice location for your waterfall. Make sure that you have a river or lake or something at the end of the waterfall. 

2 Open the texture pack HubEffects, it has a nice waterfall texture called Waterfall2. Select it.

3 Create a [[Legacy:Sheet|sheet]]. The best way to make the waterfall look nice with this texture is by making the height 4 times as high as the width . Rotate the [[Legacy:Red Builder Brush|red builder brush]] and move until it sits where you want it.

4 Click on the Add Special Brush button, and choose water. Or you can add it, go to surface properties and select translucent at the surface flags.

5 Go to [[Legacy:Surface Properties|surface properties]] (press F5) ==&gt; alignment. Scale your texture so you have 1 waterfall. To do this easily (with this texture), do the width of the sheet divided by 64, and use that number as the scale.

The waterfall should look good now.

----

This is a tutorial for a texture that isn't moving.

1 Choose a nice location for your waterfall. Make sure that you have a river or lake or something at the end of the waterfall.

2 Open the texture pack GenFluid. go to Water, and select one of the two textures called waterfa2 or waterfal.

3 Create a [[Legacy:Sheet|sheet]]. The best way to make the waterfall look nice with this texture is by making the height twice as big. Rotate and move the [[Legacy:Red Builder Brush|red builder brush]] until it sits where you want it.

4 Click on the Add Special Brush button, and choose water. Or you can add it, go to surface properties and select translucent at the surface flags.

5 Go to [[Legacy:Surface Properties|surface properties]] (press F5) ==&gt; alignment. Scale your texture so you have 1 waterfall. To do this easily (with this texture), do the width of the brush divided by 64, and use that number as the scale.

6 Go to Flags in the surface properties window, and select V-pan. (press the [[Legacy:Realtime Preview|realtime preview]] button to see it move smoothly). Sometimes the waterfall goes up. You can fix this by either rotating the texture (surface properties ==&gt; alignment and press flip V) or by moving the brush upside down. 

7 You can see that the waterfall isn't moving very fast. To make it go more rapid, add a zone info ([[Legacy:Actor (UT)|actor (UT)]] ==&gt; [[Legacy:Info (UT)|info (UT)]] ==&gt; [[Legacy:ZoneInfo (UT)|ZoneInfo (UT)]]) in the area of the waterfall. go to the ZoneInfo's properties ==&gt; ZoneLight ==&gt; TexVPanSpeed and increase that number. I think 4 is enough.

And thats it. Your waterfall is done.

==The Finishing Touches ==

===Fog ===

A waterfall needs some kind of fogging. There are several way to accomplish this.

* You can add some sheet (like you do when making flames) and give them a fog-textures. But this only works when the player isn't able to get really close to that waterfall. Cos if you get to close, the fog will not look that great.
* You can use a [[Legacy:SmokeGenerator|SmokeGenerator]]. Do remember that they'll need to be triggered, before they will emit fog.
* Or, the best of the bunch is to use real [[Legacy:Fog|fog]]!

===Ripples ===

To create one large, localized ripple effect in the water surface:

# Create a square, horizontal [[Legacy:Sheet|sheet]] brush. The size depends on how big you want the ripples to be. 
# add it as a non-solid 1 unit above the water surface
# apply the texture HubEffects.WaterRings2. It's a greyscale texture, designed (presumably) specifically to be used with the &quot;modulated&quot; effect.&lt;br /&gt;Question: are there any other textures like this, whether watery or not?
# Set the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] to Unlit and Modulated

I've found that because the ripple isn't quite centred on the texture, a sheet of size 96 goes with texture scale of 1, 192 with 2, etc.

This effect is seen in [[Legacy:Unreal 1|Unreal 1]]'s &quot;Nyleve&quot; level (check...? it's the first outdoor level in the game), and more recently in JB-Pressurized for [[Legacy:Jailbreak|Jailbreak]].

===Sound ===

Don't forget to add ambient sound to your waterfall. This is VERY important, because a waterfall without sound is very unrealistic. Also, the ambient sound can be quite loud, to give the waterfall more 'power'.

Note that you don't need to add an [[Legacy:AmbientSound (UT)|AmbientSound (UT)]] actor specifically, you can set the Sound properties of any actor that's already in the right place &amp;ndash; the SmokeGenerator would do fine if you're using one.

Try adding a very loud sound next to the waterfall with a small radius so that it sounds very loud when you are near it, then add another one which is a lot quieter but with a very large radius so that you can hear the waterfall slightly from a long way away.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4352</id>
      <timestamp>2003-05-25T09:24:54Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==The waterfall ==

&lt;Insert basic waterfall tutorial here&gt;

things to cover:
* choosing a texture
* [[Legacy:Surface Properties Window|Surface Properties Window]]: stretching the texture &amp; setting panning flag
* set panning speed in [[Legacy:ZoneInfo|ZoneInfo]]

==The Finishing Touches ==

===Fog ===

A waterfall needs some kind of fogging. There are several way to accomplish this.

* You can add some sheet (like you do when making flames) and give them a fog-textures. But this only works when the player isn't able to get really close to that waterfall. Cos if you get to close, the fog will not look that great.
* You can use a [[Legacy:SmokeGenerator|SmokeGenerator]]. Do remember that they'll need to be triggered, before they will emit fog.
* Or, the best of the bunch is to use real [[Legacy:Fog|fog]]!

===Ripples ===

To create one large, localized ripple effect in the water surface:

# Create a square, horizontal [[Legacy:Sheet|sheet]] brush. The size depends on how big you want the ripples to be. 
# add it as a non-solid 1 unit above the water surface
# apply the texture HubEffects.WaterRings2. It's a greyscale texture, designed (presumably) specifically to be used with the &quot;modulated&quot; effect.&lt;br /&gt;Question: are there any other textures like this, whether watery or not?
# Set the [[Legacy:Surface Flags (UT)|Surface Flags (UT)]] to Unlit and Modulated

I've found that because the ripple isn't quite centred on the texture, a sheet of size 96 goes with texture scale of 1, 192 with 2, etc.

This effect is seen in [[Legacy:Unreal 1|Unreal 1]]'s &quot;Nyleve&quot; level (check...? it's the first outdoor level in the game), and more recently in JB-Pressurized for [[Legacy:Jailbreak|Jailbreak]].

===Sound ===

Don't forget to add ambient sound to your waterfall. This is VERY important, because a waterfall without sound is very unrealistic. Also, the ambient sound can be quite loud, to give the waterfall more 'power'.

Note that you don't need to add an [[Legacy:AmbientSound (UT)|AmbientSound (UT)]] actor specifically, you can set the Sound properties of any actor that's already in the right place &amp;ndash; the SmokeGenerator would do fine if you're using one.

Try adding a very loud sound next to the waterfall with a small radius so that it sounds very loud when you are near it, then add another one which is a lot quieter but with a very large radius so that you can hear the waterfall slightly from a long way away.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Windows</title>
    <id>2101</id>
    <revision>
      <id>5118</id>
      <timestamp>2008-03-03T18:35:56Z</timestamp>
      <contributor>
        <ip>RyanMiller</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">If you're looking for the old UT tutorial, it can be found here: [[Legacy:Making Windows (UT)|Making Windows (UT)]]

==Window tutorial for UT2003==

I'll just cover the basics of windows creation: that is to say, how to create a glass-like material and how to make a window using it.

===Creating a texture===

You don't really need anything fancy, a very simple texture will do the trick. It doesn't even have to tile ;) What is more important is the [[Legacy:Alpha Channel|alpha channel]]. It will determine how translucent the windows will be. Create a new mask. In PSP click on the new mask button, then hold ''CTRL+ALT+V'' to show it and ''CRTL+K'' to toggle mask editing.

[[Image:Legacy_fluidsurfaces-5.jpeg|center|In Paint Shop Pro the ''New Mask'' button is at the top of the layer box]]

The white parts of the mask will be transparent, the black ones will be opaque. When you're satisfied with your alpha channel, store it inside the image (In Paint Shop Pro you have to use the ''Save in an alpha channel'' in the Mask menu), hide the mask and save your image (it has to be a .TGA file).

[[Image:Legacy_ut2k3windows1.jpeg|center|the texture and the [[Legacy:Alpha Channel|alpha channel]]]]

===Creating the material===

Open UnrealEd, import the texture you just created. You can import it into any package, but the &quot;MyLevel&quot; package is good, as it will cause the materials to be stored inside the level, so it will be easier to distribute your map.

Now you have to create a reflective material. Choose ''File'' -&gt; ''New'' and pick '''Combiner''' in the combo list. You can use any name you want for the material.

In the combiner's properties, set the first material to your use your glass texture. For the second material, use a '''TexEnvMap'''. Ideally it should match your level, but it won't be overly clear anyway so it needn't match exactly. There are a lot of these in CubeMaps.utx, or you can create your own. For the combiners operation, select '''CO_Alphablend_With_Mask''' from the ''CombineOperation'' combo list. The mask material defines the way the two material will blend. Use the glass texture once again (since it contains an alpha channel). You may have to set '''InvertMask''' to ''true''. You should experiment with both settings to see which gives you the effect you desire.

Now we need to make a translucent version of that material. Create a new material, a '''Shader'''. Use the ''combiner'' you just created for the '''Diffuse''' slot and the glass texture for the '''Opacity slot'''.

[[Image:Legacy_ut2k3windows2.jpeg|center|You should have something like this.]]

===Creating the window===

You could use the glass material on a regular brush but it's not the best way to do it, because the BSP takes more time to render. Use your red builder brush to create a rectangular window (128x128x4 for instance), select the glass shader and click on the '''Convert to Static Mesh button''', name it ''Glass_128x128x4'' and save it in ''MyLevel'' or in a custom package.

Now you have a ready-to-use window. You can still resize it with the '''DrawScale3D''' fields. Changes made to the static mesh will affect every instance in your level. Moreover, using a static mesh allows you to turn the windows into [[Legacy:Mover|mover]]s (to make them breakable).

[[Image:Legacy_ut2k3windows3.jpeg|center|The final result.]]

Most of the time windows are too dark, you can fix that easily by setting the '''ScaleGlow''' value to something around ''64'' in the ''Display'' properties of your static meshes. Alternatively you can use the '''Self Illumination''' layer of the Shader material you created.

==Discussion==

'''Vortex:''' I have some problems with &quot;MY&quot; glass and water on UT04. As I make a window or just a texture you can see true, you only see the walls and the map it self, if a player goes behind the glass, part of his body will dissapear.

'''RyanMiller:''' This is a Z-Draw issue that you're having. It has to do with the order in which things are drawn on screen, which is ignoring your player. This tends to happen most often with Static Meshes, less with BSP and almost never with sprite Emitters. Unreal doesn't let you edit the Z-Draw order so I suggest trying a BSP. 
 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5119</id>
      <timestamp>2007-07-04T20:24:29Z</timestamp>
      <contributor>
        <ip>Vortex</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">If you're looking for the old UT tutorial, it can be found here: [[Legacy:Making Windows (UT)|Making Windows (UT)]]

==Window tutorial for UT2003==

I'll just cover the basics of windows creation: that is to say, how to create a glass-like material and how to make a window using it.

===Creating a texture===

You don't really need anything fancy, a very simple texture will do the trick. It doesn't even have to tile ;) What is more important is the [[Legacy:Alpha Channel|alpha channel]]. It will determine how translucent the windows will be. Create a new mask. In PSP click on the new mask button, then hold ''CTRL+ALT+V'' to show it and ''CRTL+K'' to toggle mask editing.

[[Image:Legacy_fluidsurfaces-5.jpeg|center|In Paint Shop Pro the ''New Mask'' button is at the top of the layer box]]

The white parts of the mask will be transparent, the black ones will be opaque. When you're satisfied with your alpha channel, store it inside the image (In Paint Shop Pro you have to use the ''Save in an alpha channel'' in the Mask menu), hide the mask and save your image (it has to be a .TGA file).

[[Image:Legacy_ut2k3windows1.jpeg|center|the texture and the [[Legacy:Alpha Channel|alpha channel]]]]

===Creating the material===

Open UnrealEd, import the texture you just created. You can import it into any package, but the &quot;MyLevel&quot; package is good, as it will cause the materials to be stored inside the level, so it will be easier to distribute your map.

Now you have to create a reflective material. Choose ''File'' -&gt; ''New'' and pick '''Combiner''' in the combo list. You can use any name you want for the material.

In the combiner's properties, set the first material to your use your glass texture. For the second material, use a '''TexEnvMap'''. Ideally it should match your level, but it won't be overly clear anyway so it needn't match exactly. There are a lot of these in CubeMaps.utx, or you can create your own. For the combiners operation, select '''CO_Alphablend_With_Mask''' from the ''CombineOperation'' combo list. The mask material defines the way the two material will blend. Use the glass texture once again (since it contains an alpha channel). You may have to set '''InvertMask''' to ''true''. You should experiment with both settings to see which gives you the effect you desire.

Now we need to make a translucent version of that material. Create a new material, a '''Shader'''. Use the ''combiner'' you just created for the '''Diffuse''' slot and the glass texture for the '''Opacity slot'''.

[[Image:Legacy_ut2k3windows2.jpeg|center|You should have something like this.]]

===Creating the window===

You could use the glass material on a regular brush but it's not the best way to do it, because the BSP takes more time to render. Use your red builder brush to create a rectangular window (128x128x4 for instance), select the glass shader and click on the '''Convert to Static Mesh button''', name it ''Glass_128x128x4'' and save it in ''MyLevel'' or in a custom package.

Now you have a ready-to-use window. You can still resize it with the '''DrawScale3D''' fields. Changes made to the static mesh will affect every instance in your level. Moreover, using a static mesh allows you to turn the windows into [[Legacy:Mover|mover]]s (to make them breakable).

[[Image:Legacy_ut2k3windows3.jpeg|center|The final result.]]

Most of the time windows are too dark, you can fix that easily by setting the '''ScaleGlow''' value to something around ''64'' in the ''Display'' properties of your static meshes. Alternatively you can use the '''Self Illumination''' layer of the Shader material you created.

==Discussion==

Vortex: I have some problems with &quot;MY&quot; glass and water on UT04. As I make a window or just a texture you can see true, you only see the walls and the map it self, if a player goes behind the glass, part of his body will dissapear. 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5120</id>
      <timestamp>2007-07-04T20:26:01Z</timestamp>
      <contributor>
        <ip>Vortex</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">If you're looking for the old UT tutorial, it can be found here: [[Legacy:Making Windows (UT)|Making Windows (UT)]]

==Window tutorial for UT2003==

I'll just cover the basics of windows creation: that is to say, how to create a glass-like material and how to make a window using it.

===Creating a texture===

You don't really need anything fancy, a very simple texture will do the trick. It doesn't even have to tile ;) What is more important is the [[Legacy:Alpha Channel|alpha channel]]. It will determine how translucent the windows will be. Create a new mask. In PSP click on the new mask button, then hold ''CTRL+ALT+V'' to show it and ''CRTL+K'' to toggle mask editing.

[[Image:Legacy_fluidsurfaces-5.jpeg|center|In Paint Shop Pro the ''New Mask'' button is at the top of the layer box]]

The white parts of the mask will be transparent, the black ones will be opaque. When you're satisfied with your alpha channel, store it inside the image (In Paint Shop Pro you have to use the ''Save in an alpha channel'' in the Mask menu), hide the mask and save your image (it has to be a .TGA file).

[[Image:Legacy_ut2k3windows1.jpeg|center|the texture and the [[Legacy:Alpha Channel|alpha channel]]]]

===Creating the material===

Open UnrealEd, import the texture you just created. You can import it into any package, but the &quot;MyLevel&quot; package is good, as it will cause the materials to be stored inside the level, so it will be easier to distribute your map.

Now you have to create a reflective material. Choose ''File'' -&gt; ''New'' and pick '''Combiner''' in the combo list. You can use any name you want for the material.

In the combiner's properties, set the first material to your use your glass texture. For the second material, use a '''TexEnvMap'''. Ideally it should match your level, but it won't be overly clear anyway so it needn't match exactly. There are a lot of these in CubeMaps.utx, or you can create your own. For the combiners operation, select '''CO_Alphablend_With_Mask''' from the ''CombineOperation'' combo list. The mask material defines the way the two material will blend. Use the glass texture once again (since it contains an alpha channel). You may have to set '''InvertMask''' to ''true''. You should experiment with both settings to see which gives you the effect you desire.

Now we need to make a translucent version of that material. Create a new material, a '''Shader'''. Use the ''combiner'' you just created for the '''Diffuse''' slot and the glass texture for the '''Opacity slot'''.

[[Image:Legacy_ut2k3windows2.jpeg|center|You should have something like this.]]

===Creating the window===

You could use the glass material on a regular brush but it's not the best way to do it, because the BSP takes more time to render. Use your red builder brush to create a rectangular window (128x128x4 for instance), select the glass shader and click on the '''Convert to Static Mesh button''', name it ''Glass_128x128x4'' and save it in ''MyLevel'' or in a custom package.

Now you have a ready-to-use window. You can still resize it with the '''DrawScale3D''' fields. Changes made to the static mesh will affect every instance in your level. Moreover, using a static mesh allows you to turn the windows into [[Legacy:Mover|mover]]s (to make them breakable).

[[Image:Legacy_ut2k3windows3.jpeg|center|The final result.]]

Most of the time windows are too dark, you can fix that easily by setting the '''ScaleGlow''' value to something around ''64'' in the ''Display'' properties of your static meshes. Alternatively you can use the '''Self Illumination''' layer of the Shader material you created.

==Discussion==

'''Vortex:''' I have some problems with &quot;MY&quot; glass and water on UT04. As I make a window or just a texture you can see true, you only see the walls and the map it self, if a player goes behind the glass, part of his body will dissapear. 

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Making Windows (UT)</title>
    <id>2040</id>
    <revision>
      <id>4974</id>
      <timestamp>2004-03-06T01:33:28Z</timestamp>
      <contributor>
        <ip>Evrtwa1-ar15-4-65-239-081.evrtwa1.dsl-verizon.net</ip>
      </contributor>
      <comment>my way...</comment>
      <text xml:space="preserve">The correct way of making glass is one of the big debates of the Unreal Editing community. Briefly, techniques include:
* Just a sheet
* Sheet with semisolid ICH. further options are:
** size of the semisolid: snug fit / shrunken
** position of the semisolid: encasing the sheet / behind, in front
* sheet with a floating solid
* using BlockAll
* The ever-popular, Exploding Glass actor, incorporated into a 'glass' cube.
* Using a mover instead of the ICH, this way you can make the light appear to go through the window

(feel free to add to this list)

====engine load considerations ====

Remember that looking through glass takes even more CPU than just having an empty space, so use glass judiciously.

====textures ====

Good glass textures can be found in the &quot;GenIn&quot; texture package.

One way of making glass is to:&lt;br /&gt;
#Make transparent sheets to &quot;box in&quot; the area that will become glass. Clicking add special and selecting &quot;transparent window&quot; for your sheets is a good way to make a window sheet.
#Make an [[Legacy:Invisible Collision Hull|Invisible Collision Hull]] that fills the whole space that will be glass.

==Methods ==

===preparation ===

To make a window between two rooms, you will need:
# two rooms. Two subtracted cube brushes will do. Place them side by side, with a gap between them. 32 is a good size for a gap, though this is just a guideline: larger or smaller is fine too.
# create a cube brush, say 128x128x32. This will fit exactly between the two rooms. 
# Subtract it. Now you have a hole in the wall that divides the two rooms.

===adding glass ===
# Click on the sheet [[Legacy:Brushbuilders|brushbuilder]] and make a sheet with the same dimensions as the window hole &amp;ndash; for this example, that's 128x128.
# place it inside the window hole, so it divides the window hole brush in half.
# Choose a glass texture in the [[Legacy:Texture Browser|texture browser]].
# Click the &quot;Add Special&quot; button in the [[Legacy:Toolbox|toolbox]]. 

At this point the various doctrines(!) differ.

====just a sheet ====

This is the simplest method &amp;ndash; if you've followed the above steps, you're done! The glass will not block players or projectiles, so this is only advisable if:
* the glass is out of a player's reach, for example a very high skylight
* there is solid wall (perhaps showing the sky) immediately behind the glass, for example the windows in DM-Tempest. 16 units or less and the player will not be able to tell that part of their collision cylinder has entered the glass.

====snug fit ====

(&lt;i&gt;i think it's fair to say that this is probably the favoured method. I just made the name up, so if anyone can think of a better description, change it &amp;ndash; Tarquin&lt;/i&gt;)

[[Image:Legacy_makingglass.2.gif|center|]]

# create a [[Legacy:Semisolid|semisolid]] cube with the same cross-section as the window hole, but half the thickness &amp;ndash;  for this example, that's 128x128x16.
# place it in the window hole, centred so there's the same amount of space in each side. (see picture) (and arg, if someone wants to rewrite my lousy text, please please do)

&lt;br clear=all&gt;

====floating solid ====

&lt;i&gt;erm, this is one of the wackier ways of doing glass. it should get a mention, but personally I don't touch it with a bargepole&lt;/i&gt;

'''Flashman:''' For the record the 'Floating solid' method uses the same preparation steps as above, but in place of the [[Legacy:Semisolid|semisolid]] sized 128x128x16, make a cube brush sized 126x126x16 and then [[Legacy:Add Special|Add special brush]] -&gt; (Solid, Invisible) in the same position as before. The reson for bringing the sides in alittle bit is that if the solid makes contact with the windowframe then you'll get [[Legacy:Terminology|HOM]] on the area of contact, as the engine thinks there's no surface there to render.

'''''Arguments for / against this method:'''''
# A bot can 'see' through a semisolid, but not a solid, for instance if your window points out to some lovely scenery, then you might want to stop the bots having to calculate any possible threat in this direction, as there's never going to be one, and likewise if it's a window into another part of your level it would be wise to let your bots 'see' through it in interests of fair play! :D
# Semisolids don't make BSP cuts, but in most cirumstances solids do. This is why semisolids are most commonly used for pillars. If you use solids for pillars/in your windows and find that you ''Node Ratio'' is high (generally more than 2) then switch to semisolids

''N.B. The Node Ratio is the ratio of BSP leaf Nodes to the number of Polys in your map, and can be checked in the [[Legacy:Build Window|Build Window]]. For more information on Leaf Nodes see [[Legacy:Node Count|Node Count]]''

====using BlockAll ====

for small windows it can be easier to add a [[Legacy:BlockAll|BlockAll]] actor centred on the sheet.

==== Using a Mover ===

Firstly create your window as described in a “snug fit” window but instead of using an ICH create a mover in exactly the same manner.  

Now set the mover outside of your map (above your window opening) as keyframe 1. 

Now in the mover properties there is a value called WorldRaytraceKey this is the keyframe used to calculate where your mover casts its shadow. If you set this to keyframe 1 and leave your mover in keyframe 0 there will be no shadow cast by your window, allowing light through the opening giving a more realistic appearance. 

set it's InitialState to TriggerToggle and give the brush a tag.  Do not give it a trigger for it!

===How Mappers Make Their Glass===

'''Bean:''' Here's my tutorial on making glass.

''Example:'' Two 256x256x256 rooms(side by side) divided by a 128x128x64 cube &quot;window enclosure&quot;. What I do is add a 128x128 sheet with a glass texture in the middle of the enclosure. Then, I add a 120x120 brush (basically, around minus 4-8 units of the original glass size) on both sides of the sheet (about 2-4 units apart from the sheet on each side). Then, I make all the surfaces of those brushes invisible and the brushes themselves semi-solid (ya gettin all this? :D).

'''Craze:''' its not &quot;my&quot; way but i saw it in a level and liked it,how about to rooms 512x512x512 with a 32 unit gap, then make a hole 256x256x32 now you have a 256x256 hole thats 32 deep, then get a good texture and add a 255x255x32 brush and addit into the hole, then set it to transparent or whatever you want, there you now a (BSP's worst enemy) window that wont give you a hall of mirrors if its see threw.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4975</id>
      <timestamp>2003-08-08T09:53:50Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <minor/>
      <comment>fixed &quot;brushbuilder&quot; link</comment>
      <text xml:space="preserve">The correct way of making glass is one of the big debates of the Unreal Editing community. Briefly, techniques include:
* Just a sheet
* Sheet with semisolid ICH. further options are:
** size of the semisolid: snug fit / shrunken
** position of the semisolid: encasing the sheet / behind, in front
* sheet with a floating solid
* using BlockAll
* The ever-popular, Exploding Glass actor, incorporated into a 'glass' cube.
* Using a mover instead of the ICH, this way you can make the light appear to go through the window

(feel free to add to this list)

====engine load considerations ====

Remember that looking through glass takes even more CPU than just having an empty space, so use glass judiciously.

====textures ====

Good glass textures can be found in the &quot;GenIn&quot; texture package.

One way of making glass is to:&lt;br /&gt;
#Make transparent sheets to &quot;box in&quot; the area that will become glass. Clicking add special and selecting &quot;transparent window&quot; for your sheets is a good way to make a window sheet.
#Make an [[Legacy:Invisible Collision Hull|Invisible Collision Hull]] that fills the whole space that will be glass.

==Methods ==

===preparation ===

To make a window between two rooms, you will need:
# two rooms. Two subtracted cube brushes will do. Place them side by side, with a gap between them. 32 is a good size for a gap, though this is just a guideline: larger or smaller is fine too.
# create a cube brush, say 128x128x32. This will fit exactly between the two rooms. 
# Subtract it. Now you have a hole in the wall that divides the two rooms.

===adding glass ===
# Click on the sheet [[Legacy:Brushbuilders|brushbuilder]] and make a sheet with the same dimensions as the window hole &amp;ndash; for this example, that's 128x128.
# place it inside the window hole, so it divides the window hole brush in half.
# Choose a glass texture in the [[Legacy:Texture Browser|texture browser]].
# Click the &quot;Add Special&quot; button in the [[Legacy:Toolbox|toolbox]]. 

At this point the various doctrines(!) differ.

====just a sheet ====

This is the simplest method &amp;ndash; if you've followed the above steps, you're done! The glass will not block players or projectiles, so this is only advisable if:
* the glass is out of a player's reach, for example a very high skylight
* there is solid wall (perhaps showing the sky) immediately behind the glass, for example the windows in DM-Tempest. 16 units or less and the player will not be able to tell that part of their collision cylinder has entered the glass.

====snug fit ====

(&lt;i&gt;i think it's fair to say that this is probably the favoured method. I just made the name up, so if anyone can think of a better description, change it &amp;ndash; Tarquin&lt;/i&gt;)

[[Image:Legacy_makingglass.2.gif|center|]]

# create a [[Legacy:Semisolid|semisolid]] cube with the same cross-section as the window hole, but half the thickness &amp;ndash;  for this example, that's 128x128x16.
# place it in the window hole, centred so there's the same amount of space in each side. (see picture) (and arg, if someone wants to rewrite my lousy text, please please do)

&lt;br clear=all&gt;

====floating solid ====

&lt;i&gt;erm, this is one of the wackier ways of doing glass. it should get a mention, but personally I don't touch it with a bargepole&lt;/i&gt;

'''Flashman:''' For the record the 'Floating solid' method uses the same preparation steps as above, but in place of the [[Legacy:Semisolid|semisolid]] sized 128x128x16, make a cube brush sized 126x126x16 and then [[Legacy:Add Special|Add special brush]] -&gt; (Solid, Invisible) in the same position as before. The reson for bringing the sides in alittle bit is that if the solid makes contact with the windowframe then you'll get [[Legacy:Terminology|HOM]] on the area of contact, as the engine thinks there's no surface there to render.

'''''Arguments for / against this method:'''''
# A bot can 'see' through a semisolid, but not a solid, for instance if your window points out to some lovely scenery, then you might want to stop the bots having to calculate any possible threat in this direction, as there's never going to be one, and likewise if it's a window into another part of your level it would be wise to let your bots 'see' through it in interests of fair play! :D
# Semisolids don't make BSP cuts, but in most cirumstances solids do. This is why semisolids are most commonly used for pillars. If you use solids for pillars/in your windows and find that you ''Node Ratio'' is high (generally more than 2) then switch to semisolids

''N.B. The Node Ratio is the ratio of BSP leaf Nodes to the number of Polys in your map, and can be checked in the [[Legacy:Build Window|Build Window]]. For more information on Leaf Nodes see [[Legacy:Node Count|Node Count]]''

====using BlockAll ====

for small windows it can be easier to add a [[Legacy:BlockAll|BlockAll]] actor centred on the sheet.

==== Using a Mover ===

Firstly create your window as described in a “snug fit” window but instead of using an ICH create a mover in exactly the same manner.  

Now set the mover outside of your map (above your window opening) as keyframe 1. 

Now in the mover properties there is a value called WorldRaytraceKey this is the keyframe used to calculate where your mover casts its shadow. If you set this to keyframe 1 and leave your mover in keyframe 0 there will be no shadow cast by your window, allowing light through the opening giving a more realistic appearance. 

set it's InitialState to TriggerToggle and give the brush a tag.  Do not give it a trigger for it!

===How Mappers Make Their Glass===

'''Bean:''' Here's my tutorial on making glass.

''Example:'' Two 256x256x256 rooms(side by side) divided by a 128x128x64 cube &quot;window enclosure&quot;. What I do is add a 128x128 sheet with a glass texture in the middle of the enclosure. Then, I add a 120x120 brush (basically, around minus 4-8 units of the original glass size) on both sides of the sheet (about 2-4 units apart from the sheet on each side). Then, I make all the surfaces of those brushes invisible and the brushes themselves semi-solid (ya gettin all this? :D).

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Manifest</title>
    <id>2144</id>
    <revision>
      <id>5220</id>
      <timestamp>2007-08-29T19:00:07Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>no need to specify that it's used in both versions of UT200x</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Manifest (Package: Engine)}}

Manifest contains a list of saved packages that have been created when saving [[Legacy:DataObject|DataObject]]s. The saved packages are stored in the Saves directory (hardcoded), and have a .uvx extention.

A manifest instance is returned when you call [[Legacy:GameInfo|GameInfo]].GetSavedGames(). 

==Properties==
; array&lt;string&gt; ManifestEntries : the list of saved packages

==Related Topics==
* [[Legacy:DataObject|DataObject]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5221</id>
      <timestamp>2004-01-23T09:44:30Z</timestamp>
      <contributor>
        <ip>El Muerte TDS</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Manifest}}

A manifest instance is returned when you call [[Legacy:GameInfo|GameInfo]].GetSavedGames()

It contains a list of saved packages that have been created when saving [[Legacy:DataObject|DataObject]]s

The saved packages are stored in the Saves directory (hardcoded), and have the extention .uvx

==Properties==
; array&lt;string&gt; ManifestEntries : the list of saved packages</text>
    </revision>
    <revision>
      <id>5222</id>
      <timestamp>2006-11-26T03:47:26Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Clean up</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]]/[[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; Manifest (Package: Engine)}}

Manifest contains a list of saved packages that have been created when saving [[Legacy:DataObject|DataObject]]s. The saved packages are stored in the Saves directory (hardcoded), and have a .uvx extention.

A manifest instance is returned when you call [[Legacy:GameInfo|GameInfo]].GetSavedGames(). 

==Properties==
; array&lt;string&gt; ManifestEntries : the list of saved packages

==Related Topics==
* [[Legacy:DataObject|DataObject]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Manipulating Terrain</title>
    <id>2080</id>
    <revision>
      <id>5062</id>
      <timestamp>2003-05-25T09:49:22Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">==Rotating and Mirroring Terrain ==

===Rotating ===

[[Image:Legacy_TerrainTT_Flip.png|center|First Picture: Original terrain &lt;br /&gt;Second Picture: End Result]]
* With the existing terrain, select the terrain info actor.
* Go into the TerrainInfo Dropdown section.
* Go into the TerrainScale struct.
* To flip the terrain, put a minus (-) sign in front of the values of X and Y.

===Mirroring ===

[[Image:Legacy_TerrainTT_Rotate.png|center|First Picture: Original terrain &lt;br /&gt;Second Picture: End Result]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5063</id>
      <timestamp>2003-02-09T19:52:58Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Flipping and Mirroring Terrain ==

===Flipping ===

[[Image:Legacy_TerrainTT_Flip.png|center|First Picture: Original terrain &lt;br /&gt;Second Picture: End Result]]
* With the existing terrain, select the terrain info actor.
* Go into the TerrainInfo Dropdown section.
* Go into the TerrainScale struct.
* To flip the terrain, put a minus (-) sign in front of the values of X and Y.

===Mirroring ===

[[Image:Legacy_TerrainTT_Rotate.png|center|First Picture: Original terrain &lt;br /&gt;Second Picture: End Result]]</text>
    </revision>
    <revision>
      <id>5064</id>
      <timestamp>2003-02-27T00:17:20Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Rotating and Mirroring Terrain ==

===Rotating ===

[[Image:Legacy_TerrainTT_Flip.png|center|First Picture: Original terrain &lt;br /&gt;Second Picture: End Result]]
* With the existing terrain, select the terrain info actor.
* Go into the TerrainInfo Dropdown section.
* Go into the TerrainScale struct.
* To flip the terrain, put a minus (-) sign in front of the values of X and Y.

===Mirroring ===

[[Image:Legacy_TerrainTT_Rotate.png|center|First Picture: Original terrain &lt;br /&gt;Second Picture: End Result]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Manta</title>
    <id>28422</id>
    <revision>
      <id>40094</id>
      <timestamp>2009-11-15T08:28:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Manual Shift Car</title>
    <id>2192</id>
    <revision>
      <id>5316</id>
      <timestamp>2006-05-19T23:18:24Z</timestamp>
      <contributor>
        <ip>WinterHummer</ip>
      </contributor>
      <minor/>
      <comment>Asked a question</comment>
      <text xml:space="preserve">==Breakdown ==

This is a convertion of [[Legacy:ONSWheeledCraft|ONSWheeledCraft]]. This class allows for a stick shift or otherwise known as a manual transmission car.  Why stick shift?
* It doesn't cost much in terms of fps
* Lets you rev it in neutral :)
* Fun to drive
* Will allow rear/front/all wheel drive
* Holding the brake and the rear wheels keep spinning (no rear brakes)

* I hope you can use what I (CIpen) have created

==The Goods ==

===To start the class off ===

&lt;uscript&gt;
class WheeledClutch_Brake extends ONSVehicle;

&lt;/uscript&gt;

===Critical variables ===

&lt;uscript&gt;
var() float             WheelSoftness;
var() float             WheelPenScale;
var() float             WheelPenOffset;
var() float             WheelRestitution;
var() float             WheelAdhesion;
var() float             WheelInertia;   // I believe this is how much to resist change in motion

    //I(CIpen) made these an array so we could have different slips on each surface
var() array&lt;float&gt;         WheelLongSlip; // I think this is so we can have the wheels slip when you take off
var() array&lt;InterpCurve&gt;   WheelLongFrictionFunc;//this is the curve for how slippery the wheels are allong the X axis(forwards slip)
var() array&lt;InterpCurve&gt;   WheelLatSlipFunc;//this is the curve for how slippery the wheels are allong the Y axis(left/right slip)
var() array&lt;float&gt;         WheelLongFrictionScale;  // quick way to change the ammount of friction without having to draw out
var() array&lt;float&gt;         WheelLatFrictionScale;   // a new friction curve

var() float                             WheelHandbrakeSlip;
var() float                             WheelHandbrakeFriction;
var() float                             WheelSuspensionTravel;
var() float                             WheelSuspensionOffset;
var() float                             WheelSuspensionMaxRenderTravel;   
var() float                             FTScale;
var() float                             ChassisTorqueScale;
var() float                             MinBrakeFriction;
var() InterpCurve                       MaxSteerAngleCurve; // degrees, this makes the wheels turn like real car wheels*
var() float                             GearRatios[8];  // 0 is reverse, 1-4 f
var() int                               NumForwardGears;
var() float                             TransRatio;   // Other(constant)gears  i.e. so we can have driveshaft ratio(if one applies)
var() float                             ChangeUpPoint;   //EngineRPM that signals gear up change
var() float                             ChangeDownPoint; //EngineRPM that signals gear down change

var   int                               bGearUp;
var   int                               bGearDown;

var() float                             LSDFactor;                                                                                    
var() float                             EngineBrakeFactor;
var() float                             EngineBrakeRPMScale;                                                                                     
var() float                             MaxBrakeTorque;
var() float                             SteerSpeed;         // How fast it turns         
var() float                             TurnDamping;                                                                                    
var() float                             StopThreshold;
var() float                             HandbrakeThresh;                                                                                     
var() float                             EngineInertia;     // Pre-gear box engine (piston mass)
var   bool                              bClutching;        // If holding the clutch
var   bool                              bOldClutching;  
var() float                             IdleRPM;              //RPM to idle at
var() float                             EngineRPMSoundRange;   //RPM sound range
var() name                              SteerBoneName;
var() EAxis                             SteerBoneAxis;
var() float                             SteerBoneMaxAngle; // degrees                                                                                     

var   float                             OutputBrake;    //How much we are braking
var   float                             OutputGas;      //How much are we giving gas
var   float                             OutputPitch;
var   bool                              OutputHandbrake;

var   int                               Gear;           //What gear we are in
var   float                             ForwardVel;
var   bool                              bIsInverted;
var   bool                              bIsDriving;
var   float                             NumPoweredWheels;
var   float                             NeutralRPM;

var   InterpCurve                       RPMtoGas;           // This is what I use to convert the current in gear RPM to the amount of gas so the RPM doesn't go to zero when we hit the clutch
var() InterpCurve                       TorqueCurve;        // Engine output torque
var() InterpCurve                       EngineS;
var() InterpCurve                       BrakeCurve;     //This simulates more lifelike braking, where you apply braking

var   float                             Gas, Gas2, hBrake;

var   float                             RPM2;    //Neutral RPM
var   float                             RPM;     //Neutral RPM
var   float                             NRPM;
var   bool                              bBraking;   //if we are braking
var   bool                              bThrot, bNThrot, bNoGas;
var   bool                              bInGear;          //if we are completly in gear
var   bool                              bRadians;
var   float                             TotalSpinVel;
var   float                             EngineRPM;
var   float                             WheelRPM;// used to get the wheel RPM at anytime(so we don't change EngineRPM which is what the engine sound is tied to)
var   float                             CarMPH;
var   float                             ETorque;
var   float                             ActualSteering;
var   float                             SteerBoneAngle;
var   float                             EnginePitch;
var   Vector                            worldForward;
var   Vector                            worldRight;
var   Vector                            worldUp;
var   Matrix                            carTM;
var   Rotator                           SteerRot;
var   bool                              bCurrentOnGround;
var   float                             DeltaPitch;
var   float                             DeltaHeading;
var   float                             DeltaRoll;
var   float                             VRate;

var   vector                            one, two, three;
var   vector                            Dist1, Dist2;     // unused but this was for doing the daredevil stuff
var   float                             Dist3;
var   bool                              bBrakeFrontWheelsOnly, bBrakeFrontWheels;
var   Vector                            UDForce, UDTorque;
var   Vector                            WForce, WTorque;
var   Coords                            WheelCoords;
var   Coords                            OldCoords;
var   Coords                            Coords;
var   Vector                            ForwardsInOldPlane;
var   Pawn                              OldDriver;        

struct native SCarState
{
    	  var vector                    ChassisPosition;                               
    	  var Quat                      ChassisQuaternion;                             
    	  var vector                    ChassisLinVel;                                 
    	  var vector                    ChassisAngVel;                                 
                                                                                     
    	  var byte                      ServerHandbrake;                               
    	  var byte                      ServerBrake;                                   
    	  var byte                      ServerGas;                                     
    	  var byte                      ServerGear;                                    
    	  var byte                      ServerSteering;
    	  var int                       ServerViewPitch;
          var int                       ServerViewYaw;
};
                                                                               
var   byte                     FudgeByte;                                                                                     
var   SCarState                CarState;                                      
var   SCarState                OldCarState;
var   KRigidBodyState          ChassisState;                                  
var   bool                     bNewCarState;                                                                                    
var   bool                     bOldVehicleOnGround;
var   float                    TheDeltaTime;
&lt;/uscript&gt;

===Not so critical variables ===

&lt;uscript&gt;
var   class&lt;CameraEffect&gt;           myBlur;
var   myMotionBlur                  ClientMotionBlur;

var   array&lt;ONSDirtSlipEffect&gt;          Dust; // FL, FR, RL, RR
var() float                             DustSlipRate;
var() float                             DustSlipThresh;
var() float	                        RevMeterPosX;
var() float	                        RevMeterPosY;
var() float	                        RevMeterScale;
var() float	                        RevMeterSizeY;

var() bool			        bDoStuntInfo;
var() bool			        bAllowAirControl;
var() bool			        bAllowChargingJump;
var   bool			        bAllowBigWheels;
                                                                                     
var   bool		                bPushDown; //jump is being charged
var   bool                          bOldPushDown;
var   bool                          bAllWheelsOnGround;
                                                                                     
var() float			        MaxJumpForce;
var   float                         JumpForce;
var() float			        MaxJumpSpin;
var   float                         JumpSpin;

var() float			        JumpChargeTime;
var   float			        DesiredJumpForce; //used by AI
var   string			JumpFeedbackForce;                             
                                                                                     
var   sound			        JumpSound;
                                                                                   
var() float			        JumpMeterOriginX;
var() float                         JumpMeterOriginY;
var() float			        JumpMeterWidth;
var() float                         JumpMeterHeight;
var() float                         JumpMeterSpacing;
var() color			        JumpMeterColor;
var() color                         SpinMeterColor;
var   Texture			JumpMeterTexture;                              
                                                                                   
var() float			        AirTurnTorque;
var() float			        AirPitchTorque;
var() float			        AirPitchDamping;
var() float			        AirRollTorque;
var() float			        AirRollDamping;
var() float			        MinAirControlDamping;                                                                                    
var   float			        FenderBenderSpeed;
                                                                            
var() bool	                        bMakeBrakeLights;
var() vector	                       BrakeLightOffset[2];                           
var   ONSBrakelightCorona	        BrakeLight[2];                                 
var() Material	                      BrakeLightMaterial;                            
                                                                                     
var   Rotator			OldRotation;
var   Vector			LastOnGroundLocation;                          
var   float			        LastOnGroundTime;
                                                                                     
var   float			        InAirSpin; // Degrees
var   float			        InAirPitch; // Degrees
var   float			        InAirRoll; // Degrees
var   float			        InAirTime; // Second
var   float			        InAirDistance; // Meters
var   int				DaredevilPoints;
var   config int                    IntSteerBoneAngle;

var() float			        DaredevilThreshInAirSpin;                      
var() float			        DaredevilThreshInAirPitch;
var() float			        DaredevilThreshInAirRoll;
var() float			        DaredevilThreshInAirTime;
var() float			        DaredevilThreshInAirDistance;
var() class&lt;LocalMessage&gt;	        DaredevilMessageClass;

&lt;/uscript&gt;

==== Replication =====

&lt;uscript&gt;
replication
{
        reliable if (Role == ROLE_Authority)
                CarState, FudgeByte;                       // make sure we get what we need to the client
        reliable if (bNetInitial &amp;&amp; Role == ROLE_Authority)
                bAllowAirControl, bAllowChargingJump;        // showoff stuff
        reliable if (bNetInitial &amp;&amp; bDoStuntInfo &amp;&amp; Role == ROLE_Authority)
                DaredevilThreshInAirDistance, DaredevilThreshInAirTime, DaredevilThreshInAirSpin, DaredevilThreshInAirPitch, DaredevilThreshInAirRoll;
}
&lt;/uscript&gt;

===Functions ===

;PostNetBeginPlay

&lt;uscript&gt;
simulated function PostNetBeginPlay()
{
        local int i;
 	NumPoweredWheels = 0.0;
	for(i=0; i&lt;=1; i++)
	{
		NumPoweredWheels += 1.0;
	}
       SVehicleUpdateParams();
       Super.PostNetBeginPlay();
}
&lt;/uscript&gt;

;PostNetReceive : Here is were we deal with stuff coming from the server.

&lt;uscript&gt;
simulated function PostNetReceive()
{
 	Super.PostNetReceive();

	if(OldCarState.ChassisPosition == CarState.ChassisPosition &amp;&amp;
		OldCarState.ChassisQuaternion.X == CarState.ChassisQuaternion.X &amp;&amp;
		OldCarState.ChassisQuaternion.Y == CarState.ChassisQuaternion.Y &amp;&amp;
		OldCarState.ChassisQuaternion.Z == CarState.ChassisQuaternion.Z &amp;&amp;
		OldCarState.ChassisQuaternion.W == CarState.ChassisQuaternion.W &amp;&amp;
		OldCarState.ChassisLinVel == CarState.ChassisLinVel &amp;&amp;
		OldCarState.ChassisAngVel == CarState.ChassisAngVel &amp;&amp;
		OldCarState.ServerHandbrake == CarState.ServerHandbrake &amp;&amp;
		OldCarState.ServerBrake == CarState.ServerBrake &amp;&amp;
		OldCarState.ServerGas == CarState.ServerGas &amp;&amp;
		OldCarState.ServerGear == CarState.ServerGear &amp;&amp;
		OldCarState.ServerSteering == CarState.ServerSteering &amp;&amp;
		OldCarState.ServerViewPitch == CarState.ServerViewPitch &amp;&amp;
		OldCarState.ServerViewYaw == CarState.ServerViewYaw)
		return;

	ChassisState.Position.X = CarState.ChassisPosition.X;
	ChassisState.Position.Y = CarState.ChassisPosition.Y;
	ChassisState.Position.Z = CarState.ChassisPosition.Z;

	ChassisState.Quaternion = CarState.ChassisQuaternion;

	ChassisState.LinVel.X = 0.1f * CarState.ChassisLinVel.X;
	ChassisState.LinVel.Y = 0.1f * CarState.ChassisLinVel.Y;
	ChassisState.LinVel.Z = 0.1f * CarState.ChassisLinVel.Z;

	ChassisState.AngVel.X = 0.001f * CarState.ChassisAngVel.X;
	ChassisState.AngVel.Y = 0.001f * CarState.ChassisAngVel.Y;
	ChassisState.AngVel.Z = 0.001f * CarState.ChassisAngVel.Z;

	bNewCarState = true;
	OldCarState.ChassisPosition = CarState.ChassisPosition;
	OldCarState.ChassisQuaternion = CarState.ChassisQuaternion;
	OldCarState.ChassisLinVel = CarState.ChassisLinVel;
	OldCarState.ChassisAngVel = CarState.ChassisAngVel;
	OldCarState.ServerHandbrake = CarState.ServerHandbrake;
	OldCarState.ServerBrake = CarState.ServerBrake;
	OldCarState.ServerGas = CarState.ServerGas;
	OldCarState.ServerGear = CarState.ServerGear;
	OldCarState.ServerSteering = CarState.ServerSteering;
	OldCarState.ServerViewPitch = CarState.ServerViewPitch;
	OldCarState.ServerViewYaw = CarState.ServerViewYaw;

	OutputPitch = RangeByteToFloat(CarState.ServerHandbrake);
	OutputHandbrake = (OutputPitch &gt; 0.01);
	OutputBrake = RangeByteToFloat(CarState.ServerBrake);
	OutputGas = RangeByteToFloat(CarState.ServerGas);
	Gear = CarState.ServerGear;
	Steering = RangeByteToFloat(CarState.ServerSteering);
	DriverViewPitch = CarState.ServerViewPitch;
	DriverViewYaw = CarState.ServerViewYaw;
}

&lt;/uscript&gt;

;PrecacheAnnouncer

&lt;uscript&gt;
simulated function PrecacheAnnouncer(AnnouncerVoice V, bool bRewardSounds)
{

	if (bRewardSounds &amp;&amp; !bSoundsPrecached)
		V.PrecacheSound('fender_bender');

	Super.PrecacheAnnouncer(V, bRewardSounds);
}
&lt;/uscript&gt;

;KUpdateState : This function tells when we should update.

&lt;uscript&gt;
event bool KUpdateState(out KRigidBodyState newState)
{
	if(Role == ROLE_Authority || !bNewCarState)
		return false;

	newState = ChassisState;
	bNewCarState = false;
	return true;
}
&lt;/uscript&gt;

;SVehicleUpdateParams

&lt;uscript&gt;
event SVehicleUpdateParams()
{
	local int i;

	Super.SVehicleUpdateParams();

	for(i=0; i&lt;Wheels.Length; i++)
	{
		Wheels[i].Softness = WheelSoftness;
		Wheels[i].PenScale = WheelPenScale;
		Wheels[i].PenOffset = WheelPenOffset;
		Wheels[i].LongSlip = WheelLongSlip[0];
		Wheels[i].LatSlipFunc = WheelLatSlipFunc[0];
		Wheels[i].Restitution = WheelRestitution;
		Wheels[i].Adhesion = WheelAdhesion;
		Wheels[i].WheelInertia = WheelInertia;
		Wheels[i].LongFrictionFunc = WheelLongFrictionFunc[0];
		Wheels[i].HandbrakeFrictionFactor = WheelHandbrakeFriction;
		Wheels[i].HandbrakeSlipFactor = WheelHandbrakeSlip;
		Wheels[i].SuspensionTravel = WheelSuspensionTravel;
		Wheels[i].SuspensionOffset = WheelSuspensionOffset;
		Wheels[i].SuspensionMaxRenderTravel = WheelSuspensionMaxRenderTravel;
	}
	if(Level.NetMode != NM_DedicatedServer &amp;&amp; bMakeBrakeLights)
	{
		for(i=0; i&lt;2; i++)
		{
                     if (BrakeLight[i] != None)
                     {
				BrakeLight[i].SetBase(None);
				BrakeLight[i].SetLocation( Location + (BrakelightOffset[i] &gt;&gt; Rotation) );
				BrakeLight[i].SetBase(self);
				BrakeLight[i].SetRelativeRotation( rot(0,32768,0) );
				BrakeLight[i].Skins[0] = BrakeLightMaterial;
		      }
		}
	}
}
&lt;/uscript&gt;

;UpdateVehicle : This is the function were everything happens
           &lt;i&gt;Also see &lt;/i&gt;[[Legacy:Manual Shift Car/C++ Version|Manual Shift Car/C++ Version]]

&lt;uscript&gt;
function UpdateVehicle(float DeltaTime)
{
        local Matrix carTM;
        local Vector worldUp, worldRight, worldForward;

        local KarmaParams KP;
        local KRigidBodyState rbState;
        local int   i;
        local float maxSteerAngle, maxSteer, deltaSteer;
        local float DriveTorque, GripTorque, EngineTorque, EngineBraking, EngineWheelRatio;
        local float BrakeTorque;
        local float NewTotalSpinVel, LSDSplit, EvenSplit, UseSplit;
        local float TransInertia;
        local float LimitBrakeTorque;
        local float WheelTorque, VehicleForce, TransAcc;
        local float TurnAngVel, DampingScale, TurnDampingMag;
        local float PitchAngVel, RollAngVel, PitchDampingMag, RollDampingMag;

        local Vector AirControlTorque, AngVel;
        local float  VRate;
        local Vector Force, Torque;
        local int z;

        WForce = vect(0, 0, 0);
	WTorque = vect(0, 0, 0);

	if(!KIsAwake())
		return;
        KP = KarmaParams(KParams);
        if(KP == None)
		return;

        if(Controller != None)
	{
	      //Calc up (z), right(y) and forward (x) vectors
	      GetAxes(Rotation, worldRight, worldForward, worldUp);

	      /////////// STEERING ///////////
	      maxSteerAngle = InterpCurveEval(MaxSteerAngleCurve, VRate);
	      if(maxSteerAngle==0)
                    maxSteer = DeltaTime * SteerSpeed * maxSteerAngle;
              else
	            maxSteer = DeltaTime * SteerSpeed;

	      deltaSteer = (-Steering * maxSteerAngle) - ActualSteering; // Amount we want to move (target - current)
	      deltaSteer = Clamp(deltaSteer, -maxSteer, maxSteer);
	      ActualSteering += deltaSteer;

	      if(bAuto==True)
              {
	      	      EngineTorque = OutputGas * InterpCurveEval(TorqueCurve, EngineRPM);
	      	      EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);
	      	      EngineTorque -= EngineBraking;
	      	      EngineWheelRatio = GearRatios[Gear] * TransRatio;
	      	      NewTotalSpinVel=0.0;
	      	      EngineRPM = 0.0;
	      	      for(i=0; i&lt;Wheels.length; i++)
	      	      {
		      	      EvenSplit = 1/NumPoweredWheels;
		      	      if(TotalSpinVel &gt; 0.1)
			      	      LSDSplit = (TotalSpinVel - Wheels[i].SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		      	      else
			      	      LSDSplit = EvenSplit;
		      	      UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);
		      	      DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
		      	      GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));
		      	      if(Wheels[i].SlipVel &lt; 0.0)
			      	      GripTorque *= -1.0;
		      	      TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + Wheels[i].WheelInertia;
		      	      if(Wheels[i].SpinVel &gt; 0.0)
		              	      BrakeTorque = -OutputBrake * MaxBrakeTorque;
                      	      else
                              	      BrakeTorque = OutputBrake * MaxBrakeTorque;

		      	      LimitBrakeTorque = ( Abs(Wheels[i].SpinVel) * TransInertia ) / TheDeltaTime; // Size of torque needed to completely stop wheel spinning.
		      	      BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!
		      	      WheelTorque = DriveTorque + BrakeTorque - GripTorque;
		      	      VehicleForce = GripTorque / (FTScale * Wheels[i].WheelRadius);
		      	      if( OutputBrake &gt; 0.0 ||  (DriveTorque + BrakeTorque) * Wheels[i].SpinVel &lt; 0.0)
		      	      {
			      	      Wheels[i].DriveForce = 0.0;
			      	      Wheels[i].LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		      	      }
		      	      else
		      	      {
			      	      Wheels[i].DriveForce = VehicleForce;
			      	      Wheels[i].LongFriction = 0.0;
		      	      }
		      	      if (Wheels[i].bWheelOnGround)
			      	      Wheels[i].ChassisTorque = -1.0 * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		     	       else
			      	      Wheels[i].ChassisTorque = 0.0;
		      	      TransAcc = WheelTorque / TransInertia;
		      	      Wheels[i].SpinVel += TransAcc * DeltaTime;
		      	      if(Gear == 0 &amp;&amp; Wheels[i].SpinVel &gt; 0.0)
			      	      Wheels[i].SpinVel = 0.0;
		      	      else if(Gear &gt; 0 &amp;&amp; Wheels[i].SpinVel &lt; 0.0)
			      	      Wheels[i].SpinVel = 0.0;
		      	      NewTotalSpinVel += Wheels[i].SpinVel;
		      	      EngineRPM += Wheels[i].SpinVel / EngineWheelRatio;
		      	      Wheels[i].LatFriction = WheelLatFrictionScale[0] * Wheels[i].TireLoad;
		      	      Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
		      	      if(OutputHandbrake &amp;&amp; Wheels[i].bHandbrakeWheel)
		      	      {
			      	      Wheels[i].LatFriction *= Wheels[i].HandbrakeFrictionFactor;
			      	      Wheels[i].LatSlip *= Wheels[i].HandbrakeSlipFactor;
                              }
		      	      if(Wheels[i].SteerType == VST_Steered)
			      	      Wheels[i].Steer = ActualSteering;
		      	      else if(Wheels[i].SteerType == VST_Inverted)
			      	      Wheels[i].Steer = -ActualSteering;
		      	      else
			      	      Wheels[i].Steer = 0.0;
	      	      }
	      	      EngineRPM /= NumPoweredWheels;
	      	      EngineRPM = Max(EngineRPM, 0.01); // ensure always positive!
	      	      TotalSpinVel = NewTotalSpinVel;
	      }
///////////////STICK SHIFT///////////////////////////////
	      else
	      {
                   if(bClutching)
                   {
                        EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                   }
                   else
                   {
                        EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                        if(EngineTorque &gt;= 0)
                        {
                        	   // Calculate torque at output of engine. Combination of throttle, current RPM and engine braking.
	                        EngineTorque = OutputGas * InterpCurveEval(TorqueCurve, EngineRPM);
                        }
                        else if(EngineTorque &lt; 0)
                        {
                                EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                        }

	                EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);
	           }

                  // EngineRPM = OutputGas * InterpCurveEval(RPMCurve, EngineTorque);

	           EngineTorque -= EngineBraking;
                   ETorque = EngineTorque;
	           //DebugInfo = FString::Printf(TEXT(&quot;OutputBrake: %f	EngineRPM: %f    EngineTorque: %f&quot;), OutputBrake, EngineRPM, EngineTorque);

	           // Total gear ratio between engine and differential (ie before being split between wheels).
	           // A higher gear ratio and the torque at the wheels is reduced.
	           EngineWheelRatio = GearRatios[Gear] * TransRatio;

                   if(bClutching)
                   {
                        //EngineRPM = 0.0;
                        WheelRPM = 0.0;
                   }
                   else
                   {
                        if(Wheels[i].bPoweredWheel)
                        {
	                     // Reset engine RPM. We calculate this by adding the component of each wheel spinning.
	                     NewTotalSpinVel=0.0;
	                     if(bInGear)
	                     {
	                           WheelRPM = 0.0;
	                           EngineRPM = 0.0;
	                     }
	                     else if(!bInGear)
	                           WheelRPM = 0.0;
	                }
	           }

	      // Do model for each wheel.
	      //  Okay this needs to be fixed because the way this is, all the wheels get power

	           for(i=0;i&lt;Wheels.length; i++)
	           {
	     	      //Wheels[i];
		      /////////// DRIVE ///////////
		      // Heuristic to divide torque up so that the wheels that are spinning slower get more of it.
		      // Sum of LSDFactor across all wheels should be 1.
		      // JTODO: Do we need to handle the case of vehicles with different size wheels?

		      EvenSplit = 1/NumPoweredWheels;

		      // If no wheels are spinning, just do an even split.
		      if(TotalSpinVel &gt; 0.1)
			      LSDSplit = (TotalSpinVel - Wheels[i].SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		      else
			      LSDSplit = EvenSplit;

		      UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);

                      if(bClutching)
                      {
                           EngineRPM = RPM;

                           //DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
                      }
                      else
                      {
                           if(Wheels[i].bPoweredWheel)
                           {
                                //EngineRPM = RPM;

                                // Calculate Drive Torque : applied at wheels (ie after gearbox and differential)
		                // This is an 'open differential' ie. equal torque to each wheel
		                DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
		           }
		      }

		      /////////// LONGITUDINAL ///////////
		      // Calculate Grip Torque : longitudinal force against ground * distance of action (radius of tyre)
		      // LongFrictionFunc is assumed to be reflected for negative Slip Ratio
		      GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

		      if(Wheels[i].SlipVel &lt; 0.0)
			      GripTorque *= -1.0;

                      if(Wheels[i].bPoweredWheel)
                      {
                           // GripTorque can't be more than the torque needed to invert slip ratio.
		           TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + Wheels[i].WheelInertia;
                      }

		      //FLOAT SlipAngVel = Wheels[i].SlipVel/Wheels[i].WheelRadius;

                      if(bBraking)
                      {
		           // Brake torque acts to stop wheels (ie against direction of motion)
		           BrakeTorque = 0.0;
		           if(Wheels[i].SpinVel &gt; 0.0)
		                BrakeTorque = -OutputBrake * MaxBrakeTorque;
                          else
                                BrakeTorque = OutputBrake * MaxBrakeTorque;

		           LimitBrakeTorque = ( Abs(Wheels[i].SpinVel) * TransInertia ) / TheDeltaTime; // Size of torque needed to completely stop wheel spinning.
		           BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!
		           mBrakeTorque = BrakeTorque;
                      }
                      else
                      {
                           BrakeTorque = 0;
                           mBrakeTorque = BrakeTorque;
                      }
//_____________________________________________

                      if(bClutching)
                      {
                              WheelTorque = GripTorque;
                              //Log(&quot;GripTorque&quot;);
                              //Log(GripTorque);
                      }
                      else     // we are in full gear
                      {
                           if(!Wheels[i].bPoweredWheel)
                           {
                              //Don't do this if 4 wheel drive!!!!
                              WheelTorque = GripTorque * 2;
                           }
                           else
                           {
                              // Resultant torque at wheel : torque applied from engine + brakes + equal-and-opposite from tire-road interaction.
		              WheelTorque = DriveTorque + BrakeTorque - GripTorque;
		          /*    Log(&quot;WheelTorque&quot;);
                              Log(WheelTorque);
                              Log(&quot;GripTorque&quot;);
                              Log(GripTorque);      */
		           }
                      }
//____________________________________________

		      // Resultant linear force applied to car. (GripTorque applied at road)
		      VehicleForce = GripTorque / (FTScale * Wheels[i].WheelRadius);

		      // If the wheel torque is opposing the direction of spin (ie braking) we use friction to apply it.
		      if( OutputBrake &gt; 0 &amp;&amp; bBraking)//  || (DriveTorque + BrakeTorque) * Wheels[i].SpinVel &lt; 0.0
		      {
			      Wheels[i].DriveForce = 0.0;
			      Wheels[i].LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		      }
		      else if(bClutching)
		      {
		              Wheels[i].DriveForce = 0.0;
                              Wheels[i].LongFriction = 0.0;
		      }
		      else
		      {
		              if(!Wheels[i].bPoweredWheel)
		              {
		                     Wheels[i].DriveForce = 0.0;
                                     Wheels[i].LongFriction = 0.0;
		              }
		              else
		              {
			           Wheels[i].DriveForce = VehicleForce;
                                   Wheels[i].LongFriction = 0.0;
			           //Wheels[i].LongFriction = 0.0;
			      }
		      }


                      if(Wheels[i].bPoweredWheel)
                      {
		           // Calculate torque applied back to chassis if wheel is on the ground
		           if (Wheels[i].bWheelOnGround)
			      Wheels[i].ChassisTorque = -1.0 * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		           else
			      Wheels[i].ChassisTorque = 0.0;
                      }

		      // Calculate new wheel speed.
		      // The lower the gear ratio, the harder it is to accelerate the engine.

		      if(bClutching)
		      {
		             TransAcc = WheelTorque / -1;
		             Wheels[i].SpinVel += TransAcc * DeltaTime;
		      }
		      else
		      {
		             if(!Wheels[i].bPoweredWheel)
		             {
		                   TransAcc = WheelTorque / -1;
		                   Wheels[i].SpinVel += TransAcc * DeltaTime;
		             }
		             else
		             {
		                   TransAcc = WheelTorque / TransInertia;
		                   Wheels[i].SpinVel += TransAcc * DeltaTime;
		             }
                      }

//  -----this is were the engine needs to be slowly put into gear-----

                      if(bClutching)
                      {

                          WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                          //TorqueConverter();
                      }
                      else   // we are in full gear
                      {
                          if(!Wheels[i].bPoweredWheel)
                          {
                               WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                          }
                          else
                          {
                      	       // Accumulate wheel spin speeds to find engine RPM.
		               // The lower the gear ratio, the faster the engine spins for a given wheel speed.
		               NewTotalSpinVel += Wheels[i].SpinVel;
                               if(!bInGear)
                               {
//                                  EngineRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    TorqueConverter();

                               }
                               if(bInGear)
                               {
                                    WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    EngineRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                               }
                          }

                      }
//  ---------------------------------------------------------------

		      // Make sure the wheel can't spin in the wrong direction for the current gear.
		      if(bClutching)
		      {
		      }
		      else
		      {
		           if(Wheels[i].bPoweredWheel)
		           {
		                  if(Gear == 0 &amp;&amp; Wheels[i].SpinVel &gt; 0.0)
			               Wheels[i].SpinVel = 0.0;
		                  else if(Gear &gt; 0 &amp;&amp; Wheels[i].SpinVel &lt; 0.0)
			               Wheels[i].SpinVel = 0.0;
			   }
		      }

		      /////////// LATERAL ///////////
                      if(!Wheels[i].bPoweredWheel)
                      {
		           Wheels[i].LatFriction = (WheelLatFrictionScale[0] * 1.5) * Wheels[i].TireLoad ;
		           Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
                      }
                      else
                      {
                           Wheels[i].LatFriction = WheelLatFrictionScale[0] * Wheels[i].TireLoad;
		           Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
                      }

		      if(OutputHandbrake &amp;&amp; Wheels[i].bHandbrakeWheel)
		      {
			      Wheels[i].LatFriction *= Wheels[i].HandbrakeFrictionFactor;
			      Wheels[i].LatSlip *= Wheels[i].HandbrakeSlipFactor;
		      }

		      /////////// STEERING  ///////////

		      // Pass on steering to wheels that want it.
		      if(Wheels[i].SteerType == VST_Steered)
			      Wheels[i].Steer = ActualSteering;
		      else if(Wheels[i].SteerType == VST_Inverted)
			      Wheels[i].Steer = -ActualSteering;
		      else
			      Wheels[i].Steer = 0.0;
	         }
              }
              if(bClutching)
              {
              }
              else
              {
                   // EngineRPM is in radians per second, want in revolutions per minute
	           EngineRPM /= 4;
//	           EngineRPM /= 2.0 * PI; // revs per sec
//	           EngineRPM *= 60;
	           EngineRPM = Max(EngineRPM, 0.00); // ensure always positive!

	           RPM /= NumPoweredWheels;
//	           RPM /= 2.0 * PI; // revs per sec
//	           RPM *= 60;
	           RPM = Max(EngineRPM, 0.00); // ensure always positive!
              }

              if(!bClutching)
              {
	           // Update total wheel spin vel
	           TotalSpinVel = NewTotalSpinVel;
	      }

	      // Turn (yaw) damping.
	      carTM = CachedLocalToWorld;  // was  carTM = LocalToWorld()
	      //worldUp(carTM.M[2][0], carTM.M[2][1], carTM.M[2][2]);
	      //worldRight(carTM.M[1][0], carTM.M[1][1], carTM.M[1][2]);
	      //worldForward(carTM.M[0][0], carTM.M[0][1], carTM.M[0][2]);

            //  KGetRigidBodyState(rbState);
	    //  AngVel = KRBVecToVector(rbState.AngVel);
	      AngVel.X = rbState.AngVel.X;
              AngVel.Y = rbState.AngVel.Y;
              AngVel.Z = rbState.AngVel.Z;
	      TurnAngVel = AngVel dot worldUp;

	      DampingScale = 1.0 - MinAirControlDamping;
	      if(bAllowAirControl &amp;&amp; !bVehicleOnGround)
	      {
	  //            Log(&quot;bVehicleOnGround&quot;);
          //            Log(bVehicleOnGround);
		      TurnDampingMag = (1.0 - DampingScale*Abs(Steering)) * TurnDamping * TurnAngVel;
		      //KAddImpulse( WForce, -TurnDampingMag * worldUp );
		      Force += (WForce + (-1 * TurnDampingMag) * worldUp);
	      }

	      else
	      {
		      TurnDampingMag = (1.0 - Abs(ActualSteering)) * TurnDamping * TurnAngVel;
		      //KAddImpulse( WForce, -TurnDampingMag * worldUp );
		      Force += (WForce + (-1 + TurnDampingMag) * worldUp);
	      }

	      // If vehicle is in the air and we are allowing air control...
	      if(!bVehicleOnGround)
	      {
		      PitchAngVel = AngVel dot worldRight;
		      RollAngVel = AngVel dot worldForward;

		      if(bAllowAirControl)
		      {
			      AirControlTorque = worldRight * OutputPitch * -AirPitchTorque;

			      if(bIsWalking)
			      {
	//		              Log(&quot;bIsWalking&quot;);
	//		              Log(bIsWalking);
				      AirControlTorque += (worldForward * Steering * -AirRollTorque);
				      }
			      else
			      {
				      AirControlTorque += (worldUp * Steering * -AirTurnTorque);
			      }
                              //KAddImpulse( WForce, AirControlTorque );
			      Force += AirControlTorque;

			      // Damping forces
			      PitchDampingMag = (1.0 - DampingScale*Abs(OutputPitch)) * AirPitchDamping * PitchAngVel;
			      RollDampingMag = (1.0 - DampingScale*Abs(Steering)) * AirRollDamping * RollAngVel;

                              //KAddImpulse( WForce, (-PitchDampingMag * worldRight) + (-RollDampingMag * worldForward) );
			      Force += (WForce + ((-1 + PitchDampingMag) * worldRight) + ((-1 + RollDampingMag) * worldForward));
			      
			      UDForce = Force;
			      UDTorque = Torque;
		      }
		      else
		      {
			 PitchDampingMag = AirPitchDamping * PitchAngVel;
			 //KAddImpulse( WForce, -PitchDampingMag * worldRight );
			 Force += (WForce + (-1 + PitchDampingMag) * worldRight);
		      }
              }
              else
              {
                   UDForce = Force;
                   UDTorque = Torque;
              }
	}
}
&lt;/uscript&gt;
;Engine

&lt;uscript&gt;
function Engine()
{
     Gas = Gas2;
     RPM = InterpCurveEval(EngineS, Gas);
}
&lt;/uscript&gt;
;StoptheCar
*This function allows for slower, more real life like breaking

&lt;uscript&gt;
function StoptheCar()
{
   if(bBraking)
   {
      if(hBrake&lt;=21 &amp;&amp; hBrake&gt;=0)
      {
           hBrake += 0.5;
      }
      if(hBrake&gt;21)
             hBrake = 21;
   }
   if(!bBraking)
   {
           if(hBrake&lt;=21 &amp;&amp; hBrake&gt;=0)
           {
                hBrake -= 0.5;
           }
           if(hBrake&lt;0)
                hBrake = 0;
   }
}
&lt;/uscript&gt;
;TorqueConverter
*This function should prolly have a different name, I named it this thinking I would need to accually have a torque converter for the tranny but I turned out making it a function that eases into gear and fixes the rpm to equal that of the engine rpm when the clutch is pressed.

&lt;uscript&gt;
function TorqueConverter()
{
    local  float    rpmDifference;
    local  float    myRPM;
    rpmDifference = 0.0;
    myRPM = WheelRPM;
    myRPM *= 6.28; // convert to radians per sec
    myRPM /= 60;
         if(EngineRPM == myRPM)
              bInGear = True;
         else if(EngineRPM &gt; myRPM)
         {
              if(myRPM &lt; 0)
                    rpmDifference = EngineRPM - (2 * Abs(myRPM));

              else if(myRPM &gt;= 0)
                    rpmDifference = EngineRPM - myRPM;
              if(rpmDifference &lt;= 200.0)
              {
                   bInGear = True;
              }
              else if(rpmDifference &gt; 200.0)
              {
                   bInGear = False;
                   rpmDifference = rpmDifference * 0.2;
                   EngineRPM -= rpmDifference;
                   bRadians = True;
              }
         }
         else if(EngineRPM &lt; myRPM)
         {
              rpmDifference = myRPM - EngineRPM;
              if(rpmDifference &lt;= 200.0)
              {
                   bInGear = True;
              }
              else if(rpmDifference &gt; 200.0)
              {
                   bInGear = False;
                   rpmDifference = rpmDifference * 0.2;
                   EngineRPM -= rpmDifference;
                   bRadians = True;
              }
         }
}
&lt;/uscript&gt;

;KApplyForce

&lt;uscript&gt;
function KApplyForce(out vector Force, out vector Torque)
{
    Super.KApplyForce(Force, Torque);
    Force += UDForce;
    Torque += UDTorque;
    if (bBoosting == true &amp;&amp; bVehicleOnGround == true)
        Force += vector(Rotation) * SpeedBoost;
}
&lt;/uscript&gt;

;KImpact

&lt;uscript&gt;
event KImpact(Actor Other, vector Pos, vector ImpactVel, vector ImpactNorm)
{
    if (Role == ROLE_Authority)
    {

        ImpactInfo.Other = Other;
        ImpactInfo.Pos = Pos;
        ImpactInfo.ImpactVel = ImpactVel;
        ImpactInfo.ImpactNorm = ImpactNorm;
        ImpactInfo.ImpactAccel = KParams.KAcceleration;
        ImpactTicksLeft = ImpactDamageTicks;
    }
}
&lt;/uscript&gt;

;DrivingStatusChanged

&lt;uscript&gt;
event DrivingStatusChanged()
{
	local int i;
	Super.DrivingStatusChanged();
    if (bDriving &amp;&amp; Level.NetMode != NM_DedicatedServer &amp;&amp; !bDropDetail)
	{
        Dust.length = Wheels.length;
        for(i=0; i&lt;Wheels.Length; i++)
            if (Dust[i] == None)
            {
        		// Create wheel dust emitters.
        		WheelCoords = GetBoneCoords(Wheels[i].BoneName);
        		Dust[i] = spawn(class'ONSDirtSlipEffect', self,, WheelCoords.Origin + ((vect(0,0,-1) * Wheels[i].WheelRadius) &gt;&gt; Rotation));
        		Dust[i].SetBase(self);
			    Dust[i].SetDirtColor( Level.DustColor );
        	}
		if(bMakeBrakeLights)
		{
			for(i=0; i&lt;2; i++)
    			if (BrakeLight[i] == None)
    			{
    				BrakeLight[i] = spawn(class'ONSBrakelightCorona', self,, Location + (BrakeLightOffset[i] &gt;&gt; Rotation) );
    				BrakeLight[i].SetBase(self);
    				BrakeLight[i].SetRelativeRotation( rot(0,32768,0) ); // Point lights backwards.
    				BrakeLight[i].Skins[0] = BrakeLightMaterial;
    			}
		}
	}
    else
    {
        if (Level.NetMode != NM_DedicatedServer)
    	{
            for(i=0; i&lt;Dust.Length; i++)
                Dust[i].Destroy();

            Dust.Length = 0;

            if(bMakeBrakeLights)
            {
            	for(i=0; i&lt;2; i++)
                    if (BrakeLight[i] != None)
                        BrakeLight[i].Destroy();
            }
        }
        TurnDamping = 0.0;
    }
}
&lt;/uscript&gt;

;KDriverEnter

&lt;uscript&gt;
function KDriverEnter(Pawn P)
{
        Super.KDriverEnter(P);
}
&lt;/uscript&gt;

;ClientKDriverLeave

&lt;uscript&gt;
simulated function ClientKDriverLeave(PlayerController PC)
{
	Super.ClientKDriverLeave(PC);

	bWeaponIsAltFiring = false;
	PC.EndZoom();
}

&lt;/uscript&gt;

;SpecialCalcFirstPersonView

&lt;uscript&gt;
simulated function SpecialCalcFirstPersonView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation )
{
	ViewActor = self;
	CameraLocation = Location + (FPCamPos &gt;&gt; Rotation);
}
&lt;/uscript&gt;

;Fire

&lt;uscript&gt;
function Fire(optional float F)
{
       VehicleFire(False);
}
&lt;/uscript&gt;

;AltFire

&lt;uscript&gt;
function AltFire(optional float F)
{

        VehicleFire(true);
}
&lt;/uscript&gt;

;VehicleFire

&lt;uscript&gt;
function VehicleFire(bool bWasAltFire)
{
         if(!bWasAltFire)
         {
                 bGearUp = 1;
                 ChangeGear(bGearUp);
         }

         else if(bWasAltFire)
         {
                 bGearDown = -1;
                 ChangeGear(bGearDown);
         }
}
&lt;/uscript&gt;

;VehicleCeaseFire

&lt;uscript&gt;
function VehicleCeaseFire(bool bWasAltFire)
{
         if(!bWasAltFire)
         {
                 bGearUp = 0;
                 ChangeGear(bGearUp);
         }
         else if(bWasAltFire)
         {
                 bGearDown = 0;
                 ChangeGear(bGearDown);
         }
    Super.VehicleCeaseFire(bWasAltFire);
}
&lt;/uscript&gt;

;ClientVehicleCeaseFire

&lt;uscript&gt;
simulated function ClientVehicleCeaseFire(bool bWasAltFire)
{
    Super.ClientVehicleCeaseFire(bWasAltFire);
}
&lt;/uscript&gt;

;Tick

&lt;uscript&gt;
function Tick(float DT)
{
    local int               i, x;
    local bool              lostTraction;
    local KarmaParams       KP;
    local KRigidBodyState   BodyState;

    TheDeltaTime = DT;
    Super.Tick(DT);

    VRate = VSize(Velocity);
    KP = KarmaParams(KParams);
    KGetRigidBodyState(BodyState);

    SteerBoneAxis = AXIS_Z;
    KWake();
    if(Role == ROLE_Authority)
    {
        if(bDriving)
	{
	    // Update ForwardVel, CarMPH and bIsInverted on both server and client.
            GetAxes(Rotation, worldForward, worldRight, worldUp);

  	    ForwardVel = Velocity dot worldForward;
	    CarMPH = Abs((ForwardVel * 3600.0) / 140800.0); // Convert from units per sec to miles per hour.

	    bIsInverted = worldUp.Z &lt; 0.2;

	    // Update engine sound pitch
	    EnginePitch = 255.0 * ((EngineRPM+IdleRPM)/EngineRPMSoundRange);
	    EnginePitch = Clamp(EnginePitch, 0.0, 255.0);
	    SoundPitch = EnginePitch;

            SteerBoneAngle = (ActualSteering/InterpCurveEval(MaxSteerAngleCurve, VRate)) * SteerBoneMaxAngle * (65535.0/360.0);

            one.X = 0;
            one.Y = 0;
            one.Z = SteerBoneAngle;

            two.X = SteerBoneAngle;
            two.Y = 0;
            two.Z = 0;

            three.X = 0;
            three.Y = SteerBoneAngle;
            three.Z = 0;


            if(SteerBoneAxis == AXIS_X)
                 //SteerRot = Rotator(0, 0, SteerBoneAngle);
                 SteerRot = Rotator(one);

            else if(SteerBoneAxis == AXIS_Y)
                 //SteerRot = Rotator(SteerBoneAngle, 0, 0);
                 SteerRot = Rotator(two);

            else
                 //SteerRot = Rotator(0, SteerBoneAngle, 0);
                 SteerRot = Rotator(three);

            SetBoneDirection(SteerBoneName, SteerRot, WForce, 1, 0);
        }
    }
    	// Update any stunt variables.
	if(bDoStuntInfo)
	{
		ForwardsInOldPlane = Coords.XAxis - (Coords.XAxis dot OldCoords.ZAxis) * OldCoords.ZAxis;
		//ForwardsInOldPlane = SafeNormal(ForwardsInOldPlane);
		DeltaHeading = Acos( Clamp( ForwardsInOldPlane dot OldCoords.XAxis, -1.0, 1.0 ) );
		if( (ForwardsInOldPlane dot OldCoords.YAxis) &lt; 0.0)
			DeltaHeading *= -1.0;
		DeltaPitch = Asin( Clamp(Coords.XAxis dot OldCoords.ZAxis, -1.0f, 1.0) );
		DeltaRoll = Asin( Clamp(Coords.YAxis dot OldCoords.ZAxis, -1.0f, 1.0) );
		//debugf( TEXT(&quot;DR:%f DP:%f&quot;), DeltaRoll, DeltaPitch );

		bCurrentOnGround = (bVehicleOnGround || KP.bContactingLevel);
		DaredevilPoints = 0;

		if(bCurrentOnGround)
		{
			if(!bOldVehicleOnGround)
			{
				// We just landed - see if we should display Daredevil 'message'
				InAirTime = Level.TimeSeconds - LastOnGroundTime;

                                Dist1 = Location;
                                Dist2 = LastOnGroundLocation;
                                Vect  = Dist1 - Dist2;
                                Dist3 = Vect.X * Vect.X - Vect.Y * Vect.Y;
                                Dist3 = Sqrt(Dist3);

				DaredevilPoints += Max( Ceil( Abs(InAirSpin)/(0.5*DaredevilThreshInAirSpin) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( Abs(InAirPitch)/(0.5*DaredevilThreshInAirPitch) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( Abs(InAirRoll)/(0.5*DaredevilThreshInAirRoll) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( InAirTime/(0.5*DaredevilThreshInAirTime) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( InAirDistance/(0.5f*DaredevilThreshInAirDistance) ) - 1, 0 );
				DaredevilPoints *= 10;

				// A wheel must be touching the ground on landing to get a daredevil
				if( bVehicleOnGround &amp;&amp; DaredevilPoints &gt; 0 )
				{
					OnDaredevil();
				}
			}


			LastOnGroundLocation = Location;
			LastOnGroundTime = Level.TimeSeconds;
			InAirSpin = 0.0;
			InAirPitch = 0.0;
			InAirRoll = 0.0;
		}
		else
		{
			InAirSpin += (180.0/PI) * DeltaHeading;
			InAirPitch += (180.0/PI) * DeltaPitch;
			InAirRoll += (180.0/PI) * DeltaRoll;
		}

		OldRotation = Rotation;
		bOldVehicleOnGround = bCurrentOnGround;
	}

	if(!bDriving)
	{
		bOldVehicleOnGround = true; // If no-one is in the vehicle, dont consider it for daredevil status.
	}

	if(bAllowChargingJump)
	{
		// Check if all wheels are on the ground.
		if(bAllWheelsOnGround == true)
		{
		     for(x = 0; x&lt;Wheels.Length; x++)
		     {
			 if (Wheels[x].bWheelOnGround != false)
				bAllWheelsOnGround = false;
		     }
		}
		else
		{
		     // If any wheels are off the ground - we can just reset everything.
		     if(!bVehicleOnGround)
		     {
		          JumpForce = 0.0;
		          JumpSpin = 0.0;
//                          bPushDown = false;
		     }

		}
	}
      //Engine(Throttle);
     // If on the server - we work out OutputGas, OutputBrake etc, and pack them to be sent to the client.
     if(!bClutching)
           Gas2 = InterpCurveEval(RPMtoGas, EngineRPM);
     ProcessCarInput();
     PackState();
}
&lt;/uscript&gt;

;ProcessCarInput

&lt;uscript&gt;
function ProcessCarInput()
{
        local bool     bReverse;

	bReverse = false;
	if(Driver == none)
	{
		OutputBrake = 1.0;
		OutputGas = 0.0;
	}
	else
	{
		if(Throttle &gt;= 0) // pressing forwards
		{
                        OutputGas = Abs(Throttle);
                        OutputBrake = 0.0;
                        if(bClutching)
                        {
                             if(Throttle == 0)
                             {
                                  if(Gas2&lt;=21 &amp;&amp; Gas2&gt;=0)
                                  {
                                        Gas2 -= 0.5;
                                  }
                                  if(Gas2&lt;0)
                                        Gas2 = 0;
                             }
                             else
                             {
                                  if(Gas2&lt;=21 &amp;&amp; Gas2&gt;=0)
                                  {
                                         Gas2 += 0.5;
                                  }
                                  if(Gas2&gt;21)
                                         Gas2 = 21;
                             }
                             if(Gas2 &gt;=21)
                                  Gas2 = 21;
                         }
                         if(!bClutching)

                 }

       StoptheCar();
       OutputBrake = Abs(InterpCurveEval(BrakeCurve, hBrake));

	OutputPitch = Rise;
	}
	Engine();
	KWake();
}
&lt;/uscript&gt;

;Clutch

&lt;uscript&gt;
exec function Clutch(bool bEnabled)
{
       if(!bEnabled)
       {
           bClutching = False;
           bInGear = False;
       }

       else if(bEnabled)
       {
           bClutching = True;

           RPM = EngineRPM;
       }
}
&lt;/uscript&gt;

;Brake

&lt;uscript&gt;
exec function Brake(bool bEnabled)
{
      if(bEnabled)
      {
           bBraking = True;
           OutputHandbrake = true;
      }
      if(!bEnabled)
      {
           bBraking = false;
           OutputHandbrake = false;
      }
}
&lt;/uscript&gt;

;ChangeGear

&lt;uscript&gt;
function ChangeGear(int GearChoice)
{
      if(bClutching){
        if(Gear &gt;= 1 &amp;&amp; Gear &lt;= 7)
        {
             if(GearChoice == 1)
             {
                  Gear++;
                  bGearUp = 0;
             }
             else if(GearChoice == -1)
             {
                  Gear--;
                  bGearDown = 0;
             }
             else if(GearChoice == 0)
             {

             }
        }
        else if(Gear == 0 &amp;&amp; GearChoice == 1)
        {
              Gear++;
              bGearUp = 0;
        }
        else if(Gear == 8 &amp;&amp; GearChoice == -1)
        {
              Gear--;
              bGearDown = 0;
        }
        else
        {
             bGearUp = 0;
             bGearDown = 0;
        }
      }
}
&lt;/uscript&gt;

;PackState

&lt;uscript&gt;
function PackState()
{
	local KRigidBodyState   RBState;
	local rotator           ViewRot;
	if(!KIsAwake())
		return;
	KGetRigidBodyState(RBState);
        CActiveWeapon=SActiveWeapon;
	CarState.ChassisPosition.X = RBState.Position.X;
	CarState.ChassisPosition.Y = RBState.Position.Y;
	CarState.ChassisPosition.Z = RBState.Position.Z;
	CarState.ChassisQuaternion = RBState.Quaternion;
	CarState.ChassisLinVel.X = 10.0 * RBState.LinVel.X;
	CarState.ChassisLinVel.Y = 10.0 * RBState.LinVel.Y;
	CarState.ChassisLinVel.Z = 10.0 * RBState.LinVel.Z;
	CarState.ChassisAngVel.X = 1000.0 * RBState.AngVel.X;
	CarState.ChassisAngVel.Y = 1000.0 * RBState.AngVel.Y;
	CarState.ChassisAngVel.Z = 1000.0 * RBState.AngVel.Z;
        CarState.ServerHandbrake = FloatToRangeByte(OutputPitch);
	CarState.ServerBrake = FloatToRangeByte(OutputBrake);
	CarState.ServerGas = FloatToRangeByte(OutputGas);
	CarState.ServerGear = Gear;
	CarState.ServerSteering = FloatToRangeByte(Steering);
	if(Controller != None)
	{
		if(IsHumanControlled())
		{
			DriverViewPitch = Controller.Rotation.Pitch;
			DriverViewYaw = Controller.Rotation.Yaw;
		}
		else
		{
			ViewRot = rotator(Controller.FocalPoint - Location);
			DriverViewPitch = ViewRot.Pitch;
			DriverViewYaw = ViewRot.Yaw;
		}
	}
	else
	{
		DriverViewPitch = Rotation.Pitch;
		DriverViewYaw = Rotation.Yaw;
	}
	CarState.ServerViewPitch = DriverViewPitch;
	CarState.ServerViewYaw = DriverViewYaw;
	FudgeByte++;
}
&lt;/uscript&gt;

;Motion Blur (still in the works)

&lt;uscript&gt;
function addblur()
{
      local PlayerController PC;
      
      PC = PlayerController(Controller);
      
      PC.AddCameraEffect(new myBlur);
}
&lt;/uscript&gt;

;LimitPitch

&lt;uscript&gt;
function int LimitPitch(int pitch)
{
	if (bAllowAirControl &amp;&amp; !bVehicleOnGround)
		return pitch;
	return Super.LimitPitch(pitch);
}
&lt;/uscript&gt;

;Destroyed

&lt;uscript&gt;
simulated function Destroyed()
{
    if (LeftTrail != None)
        LeftTrail.Destroy();

    if (RightTrail != None)
        RightTrail.Destroy();

    Super.Destroyed();
}
&lt;/uscript&gt;

;TakeImpactDamage

&lt;uscript&gt;
event TakeImpactDamage(float AccelMag)
{
    local int Damage;
        Damage = int(VSize(ImpactInfo.Other.Velocity) * 20 * ImpactDamageModifier());
    if (Vehicle(ImpactInfo.Other) != None)
        TakeDamage(Damage, Vehicle(ImpactInfo.Other), ImpactInfo.Pos, vect(0,0,0), class'DamType');
    else
        TakeDamage(int(AccelMag * ImpactDamageModifier())/ WallCollisionResistance , Self, ImpactInfo.Pos, vect(0,0,0), class'DamType');

    //FIXME - scale sound volume to damage amount
    if (ImpactDamageSounds.Length &gt; 0)        PlaySound(ImpactDamageSounds[Rand(ImpactDamageSounds.Length-1)],,TransientSoundVolume*2.5);
    if (Health &lt; 0 &amp;&amp; (Level.TimeSeconds - LastImpactExplosionTime) &gt; TimeBetweenImpactExplosions)
    {
        VehicleExplosion(Normal(ImpactInfo.ImpactNorm), 0.5);
        LastImpactExplosionTime = Level.TimeSeconds;
    }
}
&lt;/uscript&gt;

;Died

&lt;uscript&gt;
function Died(Controller Killer, class&lt;DamageType&gt; damageType, vector HitLocation)
{
    if (damageType == none)
       return;
    if (Killer != None)        PlayerController(Killer).ReceiveLocalizedMessage(class'VehicleKillMessage', 7);
    Super.Died(Killer, damageType, HitLocation);
}
&lt;/uscript&gt;

;FloatToRangeByte

&lt;uscript&gt;
simulated function byte FloatToRangeByte(float f)
{
	f= FClamp(f, 0, 1);
	f = Round(f * 255);
	return byte(f);
}
&lt;/uscript&gt;

;RangeByteToFloat

&lt;uscript&gt;
//The opposite of the above function.
simulated function float RangeByteToFloat(byte b)
{
	local float f;
	f = b;
	f /= 255;
	return f;
}
&lt;/uscript&gt;

====Defaults ====

&lt;uscript&gt;
defaultproperties
{
     myBlur=Class'WhatEverPackage.myMotionBlur'

     NumForwardGears=7

     DustSlipRate=2.800000
     DustSlipThresh=50.000000
     DaredevilThreshInAirSpin=100.000000
     DaredevilThreshInAirPitch=300.000000
     DaredevilThreshInAirRoll=300.000000
     DaredevilThreshInAirTime=1.500000
     DaredevilThreshInAirDistance=17.000000
     DaredevilMessageClass=Class'Onslaught.ONSDaredevilMessage'
     bOldVehicleOnGround=True
     MaxJumpSpin=30000.000000
     JumpChargeTime=1.000000
     JumpFeedbackForce=&quot;HoverBikeJump&quot;
     JumpSound=Sound'ONSVehicleSounds-S.Hydraulics.Hydraulic10'
     JumpMeterOriginX=0.275000
     JumpMeterOriginY=0.943000
     JumpMeterWidth=0.136000
     JumpMeterHeight=0.057000
     JumpMeterSpacing=0.010000
     JumpMeterColor=(R=215,A=255)
     SpinMeterColor=(B=215,G=100,A=255)
     JumpMeterTexture=Texture'Engine.WhiteTexture'
     MinAirControlDamping=0.100000
     bBrakeFrontWheelsOnly=False
     ChangeUpPoint=2800
     StopThreshold=0.2
     CrosshairHitFeedbackTex=Texture'ONSInterface-TX.tankBarrelAligned'
     DefaultCrosshair=Material'InterfaceContent.Hud.fbBombFocus'
     CrosshairScale=0.125
     bTeamLocked=false
     bGearUp=True
     bInGear=True
     bEjectPassengersWhenFlipped=False
     bCanFlip=true
     DisintegrationHealth=0.0
     bShowChargingBar = false;
     // Damages
     WallCollisionResistance = 5 // Collision resistance: the bigger it is, the less damage taken
     ExplosionDamage=0.0
     DriverDamageMult=0
     CenterSpringRangePitch=5000
     CenterSpringRangeRoll=5000
     StolenAnnouncement=&quot;Play&quot;

     bNetNotify=true
}
&lt;/uscript&gt;
*Global variables that would need to be added to the above uscript:

&lt;uscript&gt;
enum ETextAnchor
{
    TA_Left,
    TA_Right,
    TA_Middle
};
var   float                         ScaleX, ScaleY;
&lt;/uscript&gt;

'''CIpen:'''  Here is some simple code you can add to print data on the screen to avoid logging 24/7.  This is what I used to check numbers such as RPM, Gas, EngineRPM, and whatever else I could fit on 1024x768 resolution.  I've found it to be most handy.  I'm sure you can find this elsewhere but I'm saving you the effort of looking.

*And here is the DrawHUD function that we must have to draw on the screen when a player has possesion of the vehicle:

&lt;uscript&gt;
simulated function DrawHUD(Canvas C)
{
    local PlayerController PC;


    PC = PlayerController(Controller);

    ScaleX = C.ClipX/1024;
    ScaleY = C.ClipY/768;

    C.Style = ERenderStyle.STY_Additive;
    C.Font = PC.MyHUD.GetFontSizeIndex(C, -2);
    C.DrawColor = C.MakeColor(255,255,255);

    DrawEngineStuff(C);
}
&lt;/uscript&gt;

*Here is the DrawEngineStuff(C) which is isn't a required function but is there to organize:

&lt;uscript&gt;
simulated function DrawEngineStuff(Canvas C)
{
    C.Font = C.TinyFont;

    C.SetPos(40*ScaleX, 150*ScaleY);
    C.DrawText(&quot;Engine stuff&quot;);

    C.SetPos(40*ScaleX, 160*ScaleY);
    C.DrawText(&quot;Engine RPM: &quot; @ EngineRPM);
}
&lt;/uscript&gt;

40*ScaleX sets the vertical starting position, and 150*ScaleY sets the horizontal starting position.

====Notes ====

If you are to subclass, you need to know that the engine rpm is in radians per min.  This means that if you were to create a torque curve and wanted the rpm range to be from 500 to 7000, you would need to convert all the points from revolutions per min to radians per sec.  Take the rpm(real life engine rpm) of 7000, divide by 60, then multiply by 2 PI.  Like so:

(7000/60)*6.2831853

this yields 733.038285 as the correct rpm

bNetNotify=true is prolly the most critical thing needed for this class to work online/lan

I've got a lot of changes that need to be made to this class, so be patient.  Additions include, properly calculating wheel torque if the wheel is powered or not, better collisions with walls(currently if you hit a wall flat at 300 mph the vehicle just stops and takes no damage), available auto transmision, ...

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topics for Vehicles.
* [[Legacy:Vehicle|Vehicle]] &amp;ndash; Parent class for all vehicles and turrets.
** [[Legacy:SVehicle|SVehicle]]
*** [[Legacy:ONSVehicle|ONSVehicle]]
**** [[Legacy:ONSWheeledCraft|ONSWheeledCraft]]
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''Graphik:''' Very nice idea, but a bit unsuited for an FPS, more for a racing game like UnWheel. It seems to me that Epic made sure that the vehicles were as &quot;dumbed down&quot; as possible to keep the focus on fragging people with a vehicle rather than the minutia of driving one. I recommend sending this in to [http://unwheel.beyondunreal.com/ UnWheel] when you're done. If they don't actually use it I'm sure they'd at the very least find it interesting.

'''CIpen:''' Accually I got a thumbs up on that at the same time I created this page.  The bounds of this script is almost limitless, as it would be easy to have say the tire blow out when shot.  As soon as I get a free day I'll update this page with all the new additions (infact that might be something good to do tonight).  The big change is that I added the option for auto or stick control and the the power is ditributed over the wheels that are powered.

'''Foxpaw:''' Why do you divide by 60 when converting rotations per minute to radians per minute? The radians per minute should be greater than the roatations per minute, as there's more than one radian per rotation. Or is that supposed to say, radians per second?

'''CIpen:''' Yes, you pointed out a typo :D.  Yes, it should say radians per second.  Yet your own message has typos, it's not rotations per minute, but revolutions per minute. :)

'''Foxpaw:''' Err, ehm, well, I guess that depends on where you measure it from. I'd measure it from the flywheel which definately rotates. I suppose some parts of the crankshaft do revolve though, so either could be correct.

----

'''Zxanphorian:''' WOW, that is a lot of scriptage there! I have an idea, to make it randomly stall :B

----

'''CIpen:'''  Ya, there are a lot of cool possibilities with this class.  You could attach a model to the wheel bone, add another bone for disk brakes (to attach a disk brake mesh to that turns when the wheels turn), make the engine blow up if you downgear and the engine rpm goes to high, have an axle break, have more wheel slip functions for different traction of different surfaces...     any number of things....

'''OlympusMons:''' I would have to agree CIpen. Has anyone given any thought to making a proper automatic car you know the manual automatic ones. :S Like what mafia did. I havent really had time to look through all this code although I'd like to, I was just wondering if all of this is actually needed to make a manual shift car or if there are other features which have been added through all of this script. Actually another cool thing to do would be to make a proper 4wd manual shift. Hmm!

'''CIpen:'''  Good! Lets get to the meat!  The first thing you need to know is that the function UpdateVehicle() is somehow tied to native code.  To see this all you need to do is log the DeltaTime from inside the Tick() function and from inside UpdateVehicle() function.  You should see that UpdateVehicle() always has the same DeltaTime so matter what your FPS is (at least this is what I remember it being when I tested it).

The next serious thing is that, unless you do your own wheel calculations, you'll have to build around the SVehicleWheel variables that are calculated each frame.  It's both good and bad I guess.  Take a minute to thing about this:  below is the line that calculates the GripTorque.

&lt;uscript&gt;
GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

&lt;/uscript&gt;

Now, lets say we want to be the biggest uscript hot shot around, you might change this line to look like this:

&lt;uscript&gt;

if(bPlayerIsOnHood)
     GripTorque = FTScale * Wheels[i].WheelRadius * (Wheels[i].TireLoad + PlayerMass) * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));
else
     GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

&lt;/uscript&gt;

Thus simulating player weight on the car(more or less).  That is after you do some stuff to get if the player is on the vehicle or not.

btw I just updated it UpdateVehicle() because it was far behind.

'''Tarquin:''' I moved this back to its original name, as the class name didn't seem very descriptive.

'''WinterHummer:''' Can someong give me a good scorpion subclass of this for me and other lazy people?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5317</id>
      <timestamp>2005-01-06T15:48:08Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Breakdown ==

This is a convertion of [[Legacy:ONSWheeledCraft|ONSWheeledCraft]]. This class allows for a stick shift or otherwise known as a manual transmission car.  Why stick shift?
* It doesn't cost much in terms of fps
* Lets you rev it in neutral :)
* Fun to drive
* Will allow rear/front/all wheel drive
* Holding the brake and the rear wheels keep spinning (no rear brakes)

* I hope you can use what I (CIpen) have created

==The Goods ==

===To start the class off ===

&lt;uscript&gt;
class WheeledClutch_Brake extends ONSVehicle;

&lt;/uscript&gt;

===Critical variables ===

&lt;uscript&gt;
var() float             WheelSoftness;
var() float             WheelPenScale;
var() float             WheelPenOffset;
var() float             WheelRestitution;
var() float             WheelAdhesion;
var() float             WheelInertia;   // I believe this is how much to resist change in motion

    //I(CIpen) made these an array so we could have different slips on each surface
var() array&lt;float&gt;         WheelLongSlip; // I think this is so we can have the wheels slip when you take off
var() array&lt;InterpCurve&gt;   WheelLongFrictionFunc;//this is the curve for how slippery the wheels are allong the X axis(forwards slip)
var() array&lt;InterpCurve&gt;   WheelLatSlipFunc;//this is the curve for how slippery the wheels are allong the Y axis(left/right slip)
var() array&lt;float&gt;         WheelLongFrictionScale;  // quick way to change the ammount of friction without having to draw out
var() array&lt;float&gt;         WheelLatFrictionScale;   // a new friction curve

var() float                             WheelHandbrakeSlip;
var() float                             WheelHandbrakeFriction;
var() float                             WheelSuspensionTravel;
var() float                             WheelSuspensionOffset;
var() float                             WheelSuspensionMaxRenderTravel;   
var() float                             FTScale;
var() float                             ChassisTorqueScale;
var() float                             MinBrakeFriction;
var() InterpCurve                       MaxSteerAngleCurve; // degrees, this makes the wheels turn like real car wheels*
var() float                             GearRatios[8];  // 0 is reverse, 1-4 f
var() int                               NumForwardGears;
var() float                             TransRatio;   // Other(constant)gears  i.e. so we can have driveshaft ratio(if one applies)
var() float                             ChangeUpPoint;   //EngineRPM that signals gear up change
var() float                             ChangeDownPoint; //EngineRPM that signals gear down change

var   int                               bGearUp;
var   int                               bGearDown;

var() float                             LSDFactor;                                                                                    
var() float                             EngineBrakeFactor;
var() float                             EngineBrakeRPMScale;                                                                                     
var() float                             MaxBrakeTorque;
var() float                             SteerSpeed;         // How fast it turns         
var() float                             TurnDamping;                                                                                    
var() float                             StopThreshold;
var() float                             HandbrakeThresh;                                                                                     
var() float                             EngineInertia;     // Pre-gear box engine (piston mass)
var   bool                              bClutching;        // If holding the clutch
var   bool                              bOldClutching;  
var() float                             IdleRPM;              //RPM to idle at
var() float                             EngineRPMSoundRange;   //RPM sound range
var() name                              SteerBoneName;
var() EAxis                             SteerBoneAxis;
var() float                             SteerBoneMaxAngle; // degrees                                                                                     

var   float                             OutputBrake;    //How much we are braking
var   float                             OutputGas;      //How much are we giving gas
var   float                             OutputPitch;
var   bool                              OutputHandbrake;

var   int                               Gear;           //What gear we are in
var   float                             ForwardVel;
var   bool                              bIsInverted;
var   bool                              bIsDriving;
var   float                             NumPoweredWheels;
var   float                             NeutralRPM;

var   InterpCurve                       RPMtoGas;           // This is what I use to convert the current in gear RPM to the amount of gas so the RPM doesn't go to zero when we hit the clutch
var() InterpCurve                       TorqueCurve;        // Engine output torque
var() InterpCurve                       EngineS;
var() InterpCurve                       BrakeCurve;     //This simulates more lifelike braking, where you apply braking

var   float                             Gas, Gas2, hBrake;

var   float                             RPM2;    //Neutral RPM
var   float                             RPM;     //Neutral RPM
var   float                             NRPM;
var   bool                              bBraking;   //if we are braking
var   bool                              bThrot, bNThrot, bNoGas;
var   bool                              bInGear;          //if we are completly in gear
var   bool                              bRadians;
var   float                             TotalSpinVel;
var   float                             EngineRPM;
var   float                             WheelRPM;// used to get the wheel RPM at anytime(so we don't change EngineRPM which is what the engine sound is tied to)
var   float                             CarMPH;
var   float                             ETorque;
var   float                             ActualSteering;
var   float                             SteerBoneAngle;
var   float                             EnginePitch;
var   Vector                            worldForward;
var   Vector                            worldRight;
var   Vector                            worldUp;
var   Matrix                            carTM;
var   Rotator                           SteerRot;
var   bool                              bCurrentOnGround;
var   float                             DeltaPitch;
var   float                             DeltaHeading;
var   float                             DeltaRoll;
var   float                             VRate;

var   vector                            one, two, three;
var   vector                            Dist1, Dist2;     // unused but this was for doing the daredevil stuff
var   float                             Dist3;
var   bool                              bBrakeFrontWheelsOnly, bBrakeFrontWheels;
var   Vector                            UDForce, UDTorque;
var   Vector                            WForce, WTorque;
var   Coords                            WheelCoords;
var   Coords                            OldCoords;
var   Coords                            Coords;
var   Vector                            ForwardsInOldPlane;
var   Pawn                              OldDriver;        

struct native SCarState
{
    	  var vector                    ChassisPosition;                               
    	  var Quat                      ChassisQuaternion;                             
    	  var vector                    ChassisLinVel;                                 
    	  var vector                    ChassisAngVel;                                 
                                                                                     
    	  var byte                      ServerHandbrake;                               
    	  var byte                      ServerBrake;                                   
    	  var byte                      ServerGas;                                     
    	  var byte                      ServerGear;                                    
    	  var byte                      ServerSteering;
    	  var int                       ServerViewPitch;
          var int                       ServerViewYaw;
};
                                                                               
var   byte                     FudgeByte;                                                                                     
var   SCarState                CarState;                                      
var   SCarState                OldCarState;
var   KRigidBodyState          ChassisState;                                  
var   bool                     bNewCarState;                                                                                    
var   bool                     bOldVehicleOnGround;
var   float                    TheDeltaTime;
&lt;/uscript&gt;

===Not so critical variables ===

&lt;uscript&gt;
var   class&lt;CameraEffect&gt;           myBlur;
var   myMotionBlur                  ClientMotionBlur;

var   array&lt;ONSDirtSlipEffect&gt;          Dust; // FL, FR, RL, RR
var() float                             DustSlipRate;
var() float                             DustSlipThresh;
var() float	                        RevMeterPosX;
var() float	                        RevMeterPosY;
var() float	                        RevMeterScale;
var() float	                        RevMeterSizeY;

var() bool			        bDoStuntInfo;
var() bool			        bAllowAirControl;
var() bool			        bAllowChargingJump;
var   bool			        bAllowBigWheels;
                                                                                     
var   bool		                bPushDown; //jump is being charged
var   bool                          bOldPushDown;
var   bool                          bAllWheelsOnGround;
                                                                                     
var() float			        MaxJumpForce;
var   float                         JumpForce;
var() float			        MaxJumpSpin;
var   float                         JumpSpin;

var() float			        JumpChargeTime;
var   float			        DesiredJumpForce; //used by AI
var   string			JumpFeedbackForce;                             
                                                                                     
var   sound			        JumpSound;
                                                                                   
var() float			        JumpMeterOriginX;
var() float                         JumpMeterOriginY;
var() float			        JumpMeterWidth;
var() float                         JumpMeterHeight;
var() float                         JumpMeterSpacing;
var() color			        JumpMeterColor;
var() color                         SpinMeterColor;
var   Texture			JumpMeterTexture;                              
                                                                                   
var() float			        AirTurnTorque;
var() float			        AirPitchTorque;
var() float			        AirPitchDamping;
var() float			        AirRollTorque;
var() float			        AirRollDamping;
var() float			        MinAirControlDamping;                                                                                    
var   float			        FenderBenderSpeed;
                                                                            
var() bool	                        bMakeBrakeLights;
var() vector	                       BrakeLightOffset[2];                           
var   ONSBrakelightCorona	        BrakeLight[2];                                 
var() Material	                      BrakeLightMaterial;                            
                                                                                     
var   Rotator			OldRotation;
var   Vector			LastOnGroundLocation;                          
var   float			        LastOnGroundTime;
                                                                                     
var   float			        InAirSpin; // Degrees
var   float			        InAirPitch; // Degrees
var   float			        InAirRoll; // Degrees
var   float			        InAirTime; // Second
var   float			        InAirDistance; // Meters
var   int				DaredevilPoints;
var   config int                    IntSteerBoneAngle;

var() float			        DaredevilThreshInAirSpin;                      
var() float			        DaredevilThreshInAirPitch;
var() float			        DaredevilThreshInAirRoll;
var() float			        DaredevilThreshInAirTime;
var() float			        DaredevilThreshInAirDistance;
var() class&lt;LocalMessage&gt;	        DaredevilMessageClass;

&lt;/uscript&gt;

==== Replication =====

&lt;uscript&gt;
replication
{
        reliable if (Role == ROLE_Authority)
                CarState, FudgeByte;                       // make sure we get what we need to the client
        reliable if (bNetInitial &amp;&amp; Role == ROLE_Authority)
                bAllowAirControl, bAllowChargingJump;        // showoff stuff
        reliable if (bNetInitial &amp;&amp; bDoStuntInfo &amp;&amp; Role == ROLE_Authority)
                DaredevilThreshInAirDistance, DaredevilThreshInAirTime, DaredevilThreshInAirSpin, DaredevilThreshInAirPitch, DaredevilThreshInAirRoll;
}
&lt;/uscript&gt;

===Functions ===

;PostNetBeginPlay

&lt;uscript&gt;
simulated function PostNetBeginPlay()
{
        local int i;
 	NumPoweredWheels = 0.0;
	for(i=0; i&lt;=1; i++)
	{
		NumPoweredWheels += 1.0;
	}
       SVehicleUpdateParams();
       Super.PostNetBeginPlay();
}
&lt;/uscript&gt;

;PostNetReceive : Here is were we deal with stuff coming from the server.

&lt;uscript&gt;
simulated function PostNetReceive()
{
 	Super.PostNetReceive();

	if(OldCarState.ChassisPosition == CarState.ChassisPosition &amp;&amp;
		OldCarState.ChassisQuaternion.X == CarState.ChassisQuaternion.X &amp;&amp;
		OldCarState.ChassisQuaternion.Y == CarState.ChassisQuaternion.Y &amp;&amp;
		OldCarState.ChassisQuaternion.Z == CarState.ChassisQuaternion.Z &amp;&amp;
		OldCarState.ChassisQuaternion.W == CarState.ChassisQuaternion.W &amp;&amp;
		OldCarState.ChassisLinVel == CarState.ChassisLinVel &amp;&amp;
		OldCarState.ChassisAngVel == CarState.ChassisAngVel &amp;&amp;
		OldCarState.ServerHandbrake == CarState.ServerHandbrake &amp;&amp;
		OldCarState.ServerBrake == CarState.ServerBrake &amp;&amp;
		OldCarState.ServerGas == CarState.ServerGas &amp;&amp;
		OldCarState.ServerGear == CarState.ServerGear &amp;&amp;
		OldCarState.ServerSteering == CarState.ServerSteering &amp;&amp;
		OldCarState.ServerViewPitch == CarState.ServerViewPitch &amp;&amp;
		OldCarState.ServerViewYaw == CarState.ServerViewYaw)
		return;

	ChassisState.Position.X = CarState.ChassisPosition.X;
	ChassisState.Position.Y = CarState.ChassisPosition.Y;
	ChassisState.Position.Z = CarState.ChassisPosition.Z;

	ChassisState.Quaternion = CarState.ChassisQuaternion;

	ChassisState.LinVel.X = 0.1f * CarState.ChassisLinVel.X;
	ChassisState.LinVel.Y = 0.1f * CarState.ChassisLinVel.Y;
	ChassisState.LinVel.Z = 0.1f * CarState.ChassisLinVel.Z;

	ChassisState.AngVel.X = 0.001f * CarState.ChassisAngVel.X;
	ChassisState.AngVel.Y = 0.001f * CarState.ChassisAngVel.Y;
	ChassisState.AngVel.Z = 0.001f * CarState.ChassisAngVel.Z;

	bNewCarState = true;
	OldCarState.ChassisPosition = CarState.ChassisPosition;
	OldCarState.ChassisQuaternion = CarState.ChassisQuaternion;
	OldCarState.ChassisLinVel = CarState.ChassisLinVel;
	OldCarState.ChassisAngVel = CarState.ChassisAngVel;
	OldCarState.ServerHandbrake = CarState.ServerHandbrake;
	OldCarState.ServerBrake = CarState.ServerBrake;
	OldCarState.ServerGas = CarState.ServerGas;
	OldCarState.ServerGear = CarState.ServerGear;
	OldCarState.ServerSteering = CarState.ServerSteering;
	OldCarState.ServerViewPitch = CarState.ServerViewPitch;
	OldCarState.ServerViewYaw = CarState.ServerViewYaw;

	OutputPitch = RangeByteToFloat(CarState.ServerHandbrake);
	OutputHandbrake = (OutputPitch &gt; 0.01);
	OutputBrake = RangeByteToFloat(CarState.ServerBrake);
	OutputGas = RangeByteToFloat(CarState.ServerGas);
	Gear = CarState.ServerGear;
	Steering = RangeByteToFloat(CarState.ServerSteering);
	DriverViewPitch = CarState.ServerViewPitch;
	DriverViewYaw = CarState.ServerViewYaw;
}

&lt;/uscript&gt;

;PrecacheAnnouncer

&lt;uscript&gt;
simulated function PrecacheAnnouncer(AnnouncerVoice V, bool bRewardSounds)
{
	if (bRewardSounds &amp;&amp; !bSoundsPrecached)
		V.PrecacheSound('fender_bender');

	Super.PrecacheAnnouncer(V, bRewardSounds);
}
&lt;/uscript&gt;

;KUpdateState : This function tells when we should update.

&lt;uscript&gt;
event bool KUpdateState(out KRigidBodyState newState)
{
	if(Role == ROLE_Authority || !bNewCarState)
		return false;

	newState = ChassisState;
	bNewCarState = false;
	return true;
}
&lt;/uscript&gt;

;SVehicleUpdateParams

&lt;uscript&gt;
event SVehicleUpdateParams()
{
	local int i;

	Super.SVehicleUpdateParams();

	for(i=0; i&lt;Wheels.Length; i++)
	{
		Wheels[i].Softness = WheelSoftness;
		Wheels[i].PenScale = WheelPenScale;
		Wheels[i].PenOffset = WheelPenOffset;
		Wheels[i].LongSlip = WheelLongSlip[0];
		Wheels[i].LatSlipFunc = WheelLatSlipFunc[0];
		Wheels[i].Restitution = WheelRestitution;
		Wheels[i].Adhesion = WheelAdhesion;
		Wheels[i].WheelInertia = WheelInertia;
		Wheels[i].LongFrictionFunc = WheelLongFrictionFunc[0];
		Wheels[i].HandbrakeFrictionFactor = WheelHandbrakeFriction;
		Wheels[i].HandbrakeSlipFactor = WheelHandbrakeSlip;
		Wheels[i].SuspensionTravel = WheelSuspensionTravel;
		Wheels[i].SuspensionOffset = WheelSuspensionOffset;
		Wheels[i].SuspensionMaxRenderTravel = WheelSuspensionMaxRenderTravel;
	}
	if(Level.NetMode != NM_DedicatedServer &amp;&amp; bMakeBrakeLights)
	{
		for(i=0; i&lt;2; i++)
		{
                     if (BrakeLight[i] != None)
                     {
				BrakeLight[i].SetBase(None);
				BrakeLight[i].SetLocation( Location + (BrakelightOffset[i] &gt;&gt; Rotation) );
				BrakeLight[i].SetBase(self);
				BrakeLight[i].SetRelativeRotation( rot(0,32768,0) );
				BrakeLight[i].Skins[0] = BrakeLightMaterial;
		      }
		}
	}
}
&lt;/uscript&gt;

;UpdateVehicle : This is the function were everything happens
           &lt;i&gt;Also see &lt;/i&gt;[[Legacy:Manual Shift Car/C++ Version|Manual Shift Car/C++ Version]]

&lt;uscript&gt;
function UpdateVehicle(float DeltaTime)
{
        local Matrix carTM;
        local Vector worldUp, worldRight, worldForward;

        local KarmaParams KP;
        local KRigidBodyState rbState;
        local int   i;
        local float maxSteerAngle, maxSteer, deltaSteer;
        local float DriveTorque, GripTorque, EngineTorque, EngineBraking, EngineWheelRatio;
        local float BrakeTorque;
        local float NewTotalSpinVel, LSDSplit, EvenSplit, UseSplit;
        local float TransInertia;
        local float LimitBrakeTorque;
        local float WheelTorque, VehicleForce, TransAcc;
        local float TurnAngVel, DampingScale, TurnDampingMag;
        local float PitchAngVel, RollAngVel, PitchDampingMag, RollDampingMag;

        local Vector AirControlTorque, AngVel;
        local float  VRate;
        local Vector Force, Torque;
        local int z;

        WForce = vect(0, 0, 0);
	WTorque = vect(0, 0, 0);

	if(!KIsAwake())
		return;
        KP = KarmaParams(KParams);
        if(KP == None)
		return;

        if(Controller != None)
	{
	      //Calc up (z), right(y) and forward (x) vectors
	      GetAxes(Rotation, worldRight, worldForward, worldUp);

	      /////////// STEERING ///////////
	      maxSteerAngle = InterpCurveEval(MaxSteerAngleCurve, VRate);
	      if(maxSteerAngle==0)
                    maxSteer = DeltaTime * SteerSpeed * maxSteerAngle;
              else
	            maxSteer = DeltaTime * SteerSpeed;

	      deltaSteer = (-Steering * maxSteerAngle) - ActualSteering; // Amount we want to move (target - current)
	      deltaSteer = Clamp(deltaSteer, -maxSteer, maxSteer);
	      ActualSteering += deltaSteer;

	      if(bAuto==True)
              {
	      	      EngineTorque = OutputGas * InterpCurveEval(TorqueCurve, EngineRPM);
	      	      EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);
	      	      EngineTorque -= EngineBraking;
	      	      EngineWheelRatio = GearRatios[Gear] * TransRatio;
	      	      NewTotalSpinVel=0.0;
	      	      EngineRPM = 0.0;
	      	      for(i=0; i&lt;Wheels.length; i++)
	      	      {
		      	      EvenSplit = 1/NumPoweredWheels;
		      	      if(TotalSpinVel &gt; 0.1)
			      	      LSDSplit = (TotalSpinVel - Wheels[i].SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		      	      else
			      	      LSDSplit = EvenSplit;
		      	      UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);
		      	      DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
		      	      GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));
		      	      if(Wheels[i].SlipVel &lt; 0.0)
			      	      GripTorque *= -1.0;
		      	      TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + Wheels[i].WheelInertia;
		      	      if(Wheels[i].SpinVel &gt; 0.0)
		              	      BrakeTorque = -OutputBrake * MaxBrakeTorque;
                      	      else
                              	      BrakeTorque = OutputBrake * MaxBrakeTorque;

		      	      LimitBrakeTorque = ( Abs(Wheels[i].SpinVel) * TransInertia ) / TheDeltaTime; // Size of torque needed to completely stop wheel spinning.
		      	      BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!
		      	      WheelTorque = DriveTorque + BrakeTorque - GripTorque;
		      	      VehicleForce = GripTorque / (FTScale * Wheels[i].WheelRadius);
		      	      if( OutputBrake &gt; 0.0 ||  (DriveTorque + BrakeTorque) * Wheels[i].SpinVel &lt; 0.0)
		      	      {
			      	      Wheels[i].DriveForce = 0.0;
			      	      Wheels[i].LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		      	      }
		      	      else
		      	      {
			      	      Wheels[i].DriveForce = VehicleForce;
			      	      Wheels[i].LongFriction = 0.0;
		      	      }
		      	      if (Wheels[i].bWheelOnGround)
			      	      Wheels[i].ChassisTorque = -1.0 * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		     	       else
			      	      Wheels[i].ChassisTorque = 0.0;
		      	      TransAcc = WheelTorque / TransInertia;
		      	      Wheels[i].SpinVel += TransAcc * DeltaTime;
		      	      if(Gear == 0 &amp;&amp; Wheels[i].SpinVel &gt; 0.0)
			      	      Wheels[i].SpinVel = 0.0;
		      	      else if(Gear &gt; 0 &amp;&amp; Wheels[i].SpinVel &lt; 0.0)
			      	      Wheels[i].SpinVel = 0.0;
		      	      NewTotalSpinVel += Wheels[i].SpinVel;
		      	      EngineRPM += Wheels[i].SpinVel / EngineWheelRatio;
		      	      Wheels[i].LatFriction = WheelLatFrictionScale[0] * Wheels[i].TireLoad;
		      	      Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
		      	      if(OutputHandbrake &amp;&amp; Wheels[i].bHandbrakeWheel)
		      	      {
			      	      Wheels[i].LatFriction *= Wheels[i].HandbrakeFrictionFactor;
			      	      Wheels[i].LatSlip *= Wheels[i].HandbrakeSlipFactor;
                              }
		      	      if(Wheels[i].SteerType == VST_Steered)
			      	      Wheels[i].Steer = ActualSteering;
		      	      else if(Wheels[i].SteerType == VST_Inverted)
			      	      Wheels[i].Steer = -ActualSteering;
		      	      else
			      	      Wheels[i].Steer = 0.0;
	      	      }
	      	      EngineRPM /= NumPoweredWheels;
	      	      EngineRPM = Max(EngineRPM, 0.01); // ensure always positive!
	      	      TotalSpinVel = NewTotalSpinVel;
	      }
///////////////STICK SHIFT///////////////////////////////
	      else
	      {
                   if(bClutching)
                   {
                        EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                   }
                   else
                   {
                        EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                        if(EngineTorque &gt;= 0)
                        {
                        	   // Calculate torque at output of engine. Combination of throttle, current RPM and engine braking.
	                        EngineTorque = OutputGas * InterpCurveEval(TorqueCurve, EngineRPM);
                        }
                        else if(EngineTorque &lt; 0)
                        {
                                EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                        }

	                EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);
	           }

                  // EngineRPM = OutputGas * InterpCurveEval(RPMCurve, EngineTorque);

	           EngineTorque -= EngineBraking;
                   ETorque = EngineTorque;
	           //DebugInfo = FString::Printf(TEXT(&quot;OutputBrake: %f	EngineRPM: %f    EngineTorque: %f&quot;), OutputBrake, EngineRPM, EngineTorque);

	           // Total gear ratio between engine and differential (ie before being split between wheels).
	           // A higher gear ratio and the torque at the wheels is reduced.
	           EngineWheelRatio = GearRatios[Gear] * TransRatio;

                   if(bClutching)
                   {
                        //EngineRPM = 0.0;
                        WheelRPM = 0.0;
                   }
                   else
                   {
                        if(Wheels[i].bPoweredWheel)
                        {
	                     // Reset engine RPM. We calculate this by adding the component of each wheel spinning.
	                     NewTotalSpinVel=0.0;
	                     if(bInGear)
	                     {
	                           WheelRPM = 0.0;
	                           EngineRPM = 0.0;
	                     }
	                     else if(!bInGear)
	                           WheelRPM = 0.0;
	                }
	           }

	      // Do model for each wheel.
	      //  Okay this needs to be fixed because the way this is, all the wheels get power

	           for(i=0;i&lt;Wheels.length; i++)
	           {
	     	      //Wheels[i];
		      /////////// DRIVE ///////////
		      // Heuristic to divide torque up so that the wheels that are spinning slower get more of it.
		      // Sum of LSDFactor across all wheels should be 1.
		      // JTODO: Do we need to handle the case of vehicles with different size wheels?

		      EvenSplit = 1/NumPoweredWheels;

		      // If no wheels are spinning, just do an even split.
		      if(TotalSpinVel &gt; 0.1)
			      LSDSplit = (TotalSpinVel - Wheels[i].SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		      else
			      LSDSplit = EvenSplit;

		      UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);

                      if(bClutching)
                      {
                           EngineRPM = RPM;

                           //DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
                      }
                      else
                      {
                           if(Wheels[i].bPoweredWheel)
                           {
                                //EngineRPM = RPM;

                                // Calculate Drive Torque : applied at wheels (ie after gearbox and differential)
		                // This is an 'open differential' ie. equal torque to each wheel
		                DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
		           }
		      }

		      /////////// LONGITUDINAL ///////////
		      // Calculate Grip Torque : longitudinal force against ground * distance of action (radius of tyre)
		      // LongFrictionFunc is assumed to be reflected for negative Slip Ratio
		      GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

		      if(Wheels[i].SlipVel &lt; 0.0)
			      GripTorque *= -1.0;

                      if(Wheels[i].bPoweredWheel)
                      {
                           // GripTorque can't be more than the torque needed to invert slip ratio.
		           TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + Wheels[i].WheelInertia;
                      }

		      //FLOAT SlipAngVel = Wheels[i].SlipVel/Wheels[i].WheelRadius;

                      if(bBraking)
                      {
		           // Brake torque acts to stop wheels (ie against direction of motion)
		           BrakeTorque = 0.0;
		           if(Wheels[i].SpinVel &gt; 0.0)
		                BrakeTorque = -OutputBrake * MaxBrakeTorque;
                          else
                                BrakeTorque = OutputBrake * MaxBrakeTorque;

		           LimitBrakeTorque = ( Abs(Wheels[i].SpinVel) * TransInertia ) / TheDeltaTime; // Size of torque needed to completely stop wheel spinning.
		           BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!
		           mBrakeTorque = BrakeTorque;
                      }
                      else
                      {
                           BrakeTorque = 0;
                           mBrakeTorque = BrakeTorque;
                      }
//_____________________________________________

                      if(bClutching)
                      {
                              WheelTorque = GripTorque;
                              //Log(&quot;GripTorque&quot;);
                              //Log(GripTorque);
                      }
                      else     // we are in full gear
                      {
                           if(!Wheels[i].bPoweredWheel)
                           {
                              //Don't do this if 4 wheel drive!!!!
                              WheelTorque = GripTorque * 2;
                           }
                           else
                           {
                              // Resultant torque at wheel : torque applied from engine + brakes + equal-and-opposite from tire-road interaction.
		              WheelTorque = DriveTorque + BrakeTorque - GripTorque;
		          /*    Log(&quot;WheelTorque&quot;);
                              Log(WheelTorque);
                              Log(&quot;GripTorque&quot;);
                              Log(GripTorque);      */
		           }
                      }
//____________________________________________

		      // Resultant linear force applied to car. (GripTorque applied at road)
		      VehicleForce = GripTorque / (FTScale * Wheels[i].WheelRadius);

		      // If the wheel torque is opposing the direction of spin (ie braking) we use friction to apply it.
		      if( OutputBrake &gt; 0 &amp;&amp; bBraking)//  || (DriveTorque + BrakeTorque) * Wheels[i].SpinVel &lt; 0.0
		      {
			      Wheels[i].DriveForce = 0.0;
			      Wheels[i].LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		      }
		      else if(bClutching)
		      {
		              Wheels[i].DriveForce = 0.0;
                              Wheels[i].LongFriction = 0.0;
		      }
		      else
		      {
		              if(!Wheels[i].bPoweredWheel)
		              {
		                     Wheels[i].DriveForce = 0.0;
                                     Wheels[i].LongFriction = 0.0;
		              }
		              else
		              {
			           Wheels[i].DriveForce = VehicleForce;
                                   Wheels[i].LongFriction = 0.0;
			           //Wheels[i].LongFriction = 0.0;
			      }
		      }


                      if(Wheels[i].bPoweredWheel)
                      {
		           // Calculate torque applied back to chassis if wheel is on the ground
		           if (Wheels[i].bWheelOnGround)
			      Wheels[i].ChassisTorque = -1.0 * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		           else
			      Wheels[i].ChassisTorque = 0.0;
                      }

		      // Calculate new wheel speed.
		      // The lower the gear ratio, the harder it is to accelerate the engine.

		      if(bClutching)
		      {
		             TransAcc = WheelTorque / -1;
		             Wheels[i].SpinVel += TransAcc * DeltaTime;
		      }
		      else
		      {
		             if(!Wheels[i].bPoweredWheel)
		             {
		                   TransAcc = WheelTorque / -1;
		                   Wheels[i].SpinVel += TransAcc * DeltaTime;
		             }
		             else
		             {
		                   TransAcc = WheelTorque / TransInertia;
		                   Wheels[i].SpinVel += TransAcc * DeltaTime;
		             }
                      }

//  -----this is were the engine needs to be slowly put into gear-----

                      if(bClutching)
                      {

                          WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                          //TorqueConverter();
                      }
                      else   // we are in full gear
                      {
                          if(!Wheels[i].bPoweredWheel)
                          {
                               WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                          }
                          else
                          {
                      	       // Accumulate wheel spin speeds to find engine RPM.
		               // The lower the gear ratio, the faster the engine spins for a given wheel speed.
		               NewTotalSpinVel += Wheels[i].SpinVel;
                               if(!bInGear)
                               {
//                                  EngineRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    TorqueConverter();

                               }
                               if(bInGear)
                               {
                                    WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    EngineRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                               }
                          }

                      }
//  ---------------------------------------------------------------

		      // Make sure the wheel can't spin in the wrong direction for the current gear.
		      if(bClutching)
		      {
		      }
		      else
		      {
		           if(Wheels[i].bPoweredWheel)
		           {
		                  if(Gear == 0 &amp;&amp; Wheels[i].SpinVel &gt; 0.0)
			               Wheels[i].SpinVel = 0.0;
		                  else if(Gear &gt; 0 &amp;&amp; Wheels[i].SpinVel &lt; 0.0)
			               Wheels[i].SpinVel = 0.0;
			   }
		      }

		      /////////// LATERAL ///////////
                      if(!Wheels[i].bPoweredWheel)
                      {
		           Wheels[i].LatFriction = (WheelLatFrictionScale[0] * 1.5) * Wheels[i].TireLoad ;
		           Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
                      }
                      else
                      {
                           Wheels[i].LatFriction = WheelLatFrictionScale[0] * Wheels[i].TireLoad;
		           Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
                      }

		      if(OutputHandbrake &amp;&amp; Wheels[i].bHandbrakeWheel)
		      {
			      Wheels[i].LatFriction *= Wheels[i].HandbrakeFrictionFactor;
			      Wheels[i].LatSlip *= Wheels[i].HandbrakeSlipFactor;
		      }

		      /////////// STEERING  ///////////

		      // Pass on steering to wheels that want it.
		      if(Wheels[i].SteerType == VST_Steered)
			      Wheels[i].Steer = ActualSteering;
		      else if(Wheels[i].SteerType == VST_Inverted)
			      Wheels[i].Steer = -ActualSteering;
		      else
			      Wheels[i].Steer = 0.0;
	         }
              }
              if(bClutching)
              {
              }
              else
              {
                   // EngineRPM is in radians per second, want in revolutions per minute
	           EngineRPM /= 4;
//	           EngineRPM /= 2.0 * PI; // revs per sec
//	           EngineRPM *= 60;
	           EngineRPM = Max(EngineRPM, 0.00); // ensure always positive!

	           RPM /= NumPoweredWheels;
//	           RPM /= 2.0 * PI; // revs per sec
//	           RPM *= 60;
	           RPM = Max(EngineRPM, 0.00); // ensure always positive!
              }

              if(!bClutching)
              {
	           // Update total wheel spin vel
	           TotalSpinVel = NewTotalSpinVel;
	      }

	      // Turn (yaw) damping.
	      carTM = CachedLocalToWorld;  // was  carTM = LocalToWorld()
	      //worldUp(carTM.M[2][0], carTM.M[2][1], carTM.M[2][2]);
	      //worldRight(carTM.M[1][0], carTM.M[1][1], carTM.M[1][2]);
	      //worldForward(carTM.M[0][0], carTM.M[0][1], carTM.M[0][2]);

            //  KGetRigidBodyState(rbState);
	    //  AngVel = KRBVecToVector(rbState.AngVel);
	      AngVel.X = rbState.AngVel.X;
              AngVel.Y = rbState.AngVel.Y;
              AngVel.Z = rbState.AngVel.Z;
	      TurnAngVel = AngVel dot worldUp;

	      DampingScale = 1.0 - MinAirControlDamping;
	      if(bAllowAirControl &amp;&amp; !bVehicleOnGround)
	      {
	  //            Log(&quot;bVehicleOnGround&quot;);
          //            Log(bVehicleOnGround);
		      TurnDampingMag = (1.0 - DampingScale*Abs(Steering)) * TurnDamping * TurnAngVel;
		      //KAddImpulse( WForce, -TurnDampingMag * worldUp );
		      Force += (WForce + (-1 * TurnDampingMag) * worldUp);
	      }

	      else
	      {
		      TurnDampingMag = (1.0 - Abs(ActualSteering)) * TurnDamping * TurnAngVel;
		      //KAddImpulse( WForce, -TurnDampingMag * worldUp );
		      Force += (WForce + (-1 + TurnDampingMag) * worldUp);
	      }

	      // If vehicle is in the air and we are allowing air control...
	      if(!bVehicleOnGround)
	      {
		      PitchAngVel = AngVel dot worldRight;
		      RollAngVel = AngVel dot worldForward;

		      if(bAllowAirControl)
		      {
			      AirControlTorque = worldRight * OutputPitch * -AirPitchTorque;

			      if(bIsWalking)
			      {
	//		              Log(&quot;bIsWalking&quot;);
	//		              Log(bIsWalking);
				      AirControlTorque += (worldForward * Steering * -AirRollTorque);
				      }
			      else
			      {
				      AirControlTorque += (worldUp * Steering * -AirTurnTorque);
			      }
                              //KAddImpulse( WForce, AirControlTorque );
			      Force += AirControlTorque;

			      // Damping forces
			      PitchDampingMag = (1.0 - DampingScale*Abs(OutputPitch)) * AirPitchDamping * PitchAngVel;
			      RollDampingMag = (1.0 - DampingScale*Abs(Steering)) * AirRollDamping * RollAngVel;

                              //KAddImpulse( WForce, (-PitchDampingMag * worldRight) + (-RollDampingMag * worldForward) );
			      Force += (WForce + ((-1 + PitchDampingMag) * worldRight) + ((-1 + RollDampingMag) * worldForward));
			      
			      UDForce = Force;
			      UDTorque = Torque;
		      }
		      else
		      {
			 PitchDampingMag = AirPitchDamping * PitchAngVel;
			 //KAddImpulse( WForce, -PitchDampingMag * worldRight );
			 Force += (WForce + (-1 + PitchDampingMag) * worldRight);
		      }
              }
              else
              {
                   UDForce = Force;
                   UDTorque = Torque;
              }
	}
}
&lt;/uscript&gt;
;Engine

&lt;uscript&gt;
function Engine()
{
     Gas = Gas2;
     RPM = InterpCurveEval(EngineS, Gas);
}
&lt;/uscript&gt;
;StoptheCar
*This function allows for slower, more real life like breaking

&lt;uscript&gt;
function StoptheCar()
{
   if(bBraking)
   {
      if(hBrake&lt;=21 &amp;&amp; hBrake&gt;=0)
      {
           hBrake += 0.5;
      }
      if(hBrake&gt;21)
             hBrake = 21;
   }
   if(!bBraking)
   {
           if(hBrake&lt;=21 &amp;&amp; hBrake&gt;=0)
           {
                hBrake -= 0.5;
           }
           if(hBrake&lt;0)
                hBrake = 0;
   }
}
&lt;/uscript&gt;
;TorqueConverter
*This function should prolly have a different name, I named it this thinking I would need to accually have a torque converter for the tranny but I turned out making it a function that eases into gear and fixes the rpm to equal that of the engine rpm when the clutch is pressed.

&lt;uscript&gt;
function TorqueConverter()
{
    local  float    rpmDifference;
    local  float    myRPM;
    rpmDifference = 0.0;
    myRPM = WheelRPM;
    myRPM *= 6.28; // convert to radians per sec
    myRPM /= 60;
         if(EngineRPM == myRPM)
              bInGear = True;
         else if(EngineRPM &gt; myRPM)
         {
              if(myRPM &lt; 0)
                    rpmDifference = EngineRPM - (2 * Abs(myRPM));

              else if(myRPM &gt;= 0)
                    rpmDifference = EngineRPM - myRPM;
              if(rpmDifference &lt;= 200.0)
              {
                   bInGear = True;
              }
              else if(rpmDifference &gt; 200.0)
              {
                   bInGear = False;
                   rpmDifference = rpmDifference * 0.2;
                   EngineRPM -= rpmDifference;
                   bRadians = True;
              }
         }
         else if(EngineRPM &lt; myRPM)
         {
              rpmDifference = myRPM - EngineRPM;
              if(rpmDifference &lt;= 200.0)
              {
                   bInGear = True;
              }
              else if(rpmDifference &gt; 200.0)
              {
                   bInGear = False;
                   rpmDifference = rpmDifference * 0.2;
                   EngineRPM -= rpmDifference;
                   bRadians = True;
              }
         }
}
&lt;/uscript&gt;

;KApplyForce

&lt;uscript&gt;
function KApplyForce(out vector Force, out vector Torque)
{
    Super.KApplyForce(Force, Torque);
    Force += UDForce;
    Torque += UDTorque;
    if (bBoosting == true &amp;&amp; bVehicleOnGround == true)
        Force += vector(Rotation) * SpeedBoost;
}
&lt;/uscript&gt;

;KImpact

&lt;uscript&gt;
event KImpact(Actor Other, vector Pos, vector ImpactVel, vector ImpactNorm)
{
    if (Role == ROLE_Authority)
    {

        ImpactInfo.Other = Other;
        ImpactInfo.Pos = Pos;
        ImpactInfo.ImpactVel = ImpactVel;
        ImpactInfo.ImpactNorm = ImpactNorm;
        ImpactInfo.ImpactAccel = KParams.KAcceleration;
        ImpactTicksLeft = ImpactDamageTicks;
    }
}
&lt;/uscript&gt;

;DrivingStatusChanged

&lt;uscript&gt;
event DrivingStatusChanged()
{
	local int i;
	Super.DrivingStatusChanged();
    if (bDriving &amp;&amp; Level.NetMode != NM_DedicatedServer &amp;&amp; !bDropDetail)
	{
        Dust.length = Wheels.length;
        for(i=0; i&lt;Wheels.Length; i++)
            if (Dust[i] == None)
            {
        		// Create wheel dust emitters.
        		WheelCoords = GetBoneCoords(Wheels[i].BoneName);
        		Dust[i] = spawn(class'ONSDirtSlipEffect', self,, WheelCoords.Origin + ((vect(0,0,-1) * Wheels[i].WheelRadius) &gt;&gt; Rotation));
        		Dust[i].SetBase(self);
			    Dust[i].SetDirtColor( Level.DustColor );
        	}
		if(bMakeBrakeLights)
		{
			for(i=0; i&lt;2; i++)
    			if (BrakeLight[i] == None)
    			{
    				BrakeLight[i] = spawn(class'ONSBrakelightCorona', self,, Location + (BrakeLightOffset[i] &gt;&gt; Rotation) );
    				BrakeLight[i].SetBase(self);
    				BrakeLight[i].SetRelativeRotation( rot(0,32768,0) ); // Point lights backwards.
    				BrakeLight[i].Skins[0] = BrakeLightMaterial;
    			}
		}
	}
    else
    {
        if (Level.NetMode != NM_DedicatedServer)
    	{
            for(i=0; i&lt;Dust.Length; i++)
                Dust[i].Destroy();

            Dust.Length = 0;

            if(bMakeBrakeLights)
            {
            	for(i=0; i&lt;2; i++)
                    if (BrakeLight[i] != None)
                        BrakeLight[i].Destroy();
            }
        }
        TurnDamping = 0.0;
    }
}
&lt;/uscript&gt;

;KDriverEnter

&lt;uscript&gt;
function KDriverEnter(Pawn P)
{
        Super.KDriverEnter(P);
}
&lt;/uscript&gt;

;ClientKDriverLeave

&lt;uscript&gt;
simulated function ClientKDriverLeave(PlayerController PC)
{
	Super.ClientKDriverLeave(PC);

	bWeaponIsAltFiring = false;
	PC.EndZoom();
}

&lt;/uscript&gt;

;SpecialCalcFirstPersonView

&lt;uscript&gt;
simulated function SpecialCalcFirstPersonView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation )
{
	ViewActor = self;
	CameraLocation = Location + (FPCamPos &gt;&gt; Rotation);
}
&lt;/uscript&gt;

;Fire

&lt;uscript&gt;
function Fire(optional float F)
{
       VehicleFire(False);
}
&lt;/uscript&gt;

;AltFire

&lt;uscript&gt;
function AltFire(optional float F)
{

        VehicleFire(true);
}
&lt;/uscript&gt;

;VehicleFire

&lt;uscript&gt;
function VehicleFire(bool bWasAltFire)
{
         if(!bWasAltFire)
         {
                 bGearUp = 1;
                 ChangeGear(bGearUp);
         }

         else if(bWasAltFire)
         {
                 bGearDown = -1;
                 ChangeGear(bGearDown);
         }
}
&lt;/uscript&gt;

;VehicleCeaseFire

&lt;uscript&gt;
function VehicleCeaseFire(bool bWasAltFire)
{
         if(!bWasAltFire)
         {
                 bGearUp = 0;
                 ChangeGear(bGearUp);
         }
         else if(bWasAltFire)
         {
                 bGearDown = 0;
                 ChangeGear(bGearDown);
         }
    Super.VehicleCeaseFire(bWasAltFire);
}
&lt;/uscript&gt;

;ClientVehicleCeaseFire

&lt;uscript&gt;
simulated function ClientVehicleCeaseFire(bool bWasAltFire)
{
    Super.ClientVehicleCeaseFire(bWasAltFire);
}
&lt;/uscript&gt;

;Tick

&lt;uscript&gt;
function Tick(float DT)
{
    local int               i, x;
    local bool              lostTraction;
    local KarmaParams       KP;
    local KRigidBodyState   BodyState;

    TheDeltaTime = DT;
    Super.Tick(DT);

    VRate = VSize(Velocity);
    KP = KarmaParams(KParams);
    KGetRigidBodyState(BodyState);

    SteerBoneAxis = AXIS_Z;
    KWake();
    if(Role == ROLE_Authority)
    {
        if(bDriving)
	{
	    // Update ForwardVel, CarMPH and bIsInverted on both server and client.
            GetAxes(Rotation, worldForward, worldRight, worldUp);

  	    ForwardVel = Velocity dot worldForward;
	    CarMPH = Abs((ForwardVel * 3600.0) / 140800.0); // Convert from units per sec to miles per hour.

	    bIsInverted = worldUp.Z &lt; 0.2;

	    // Update engine sound pitch
	    EnginePitch = 255.0 * ((EngineRPM+IdleRPM)/EngineRPMSoundRange);
	    EnginePitch = Clamp(EnginePitch, 0.0, 255.0);
	    SoundPitch = EnginePitch;

            SteerBoneAngle = (ActualSteering/InterpCurveEval(MaxSteerAngleCurve, VRate)) * SteerBoneMaxAngle * (65535.0/360.0);

            one.X = 0;
            one.Y = 0;
            one.Z = SteerBoneAngle;

            two.X = SteerBoneAngle;
            two.Y = 0;
            two.Z = 0;

            three.X = 0;
            three.Y = SteerBoneAngle;
            three.Z = 0;


            if(SteerBoneAxis == AXIS_X)
                 //SteerRot = Rotator(0, 0, SteerBoneAngle);
                 SteerRot = Rotator(one);

            else if(SteerBoneAxis == AXIS_Y)
                 //SteerRot = Rotator(SteerBoneAngle, 0, 0);
                 SteerRot = Rotator(two);

            else
                 //SteerRot = Rotator(0, SteerBoneAngle, 0);
                 SteerRot = Rotator(three);

            SetBoneDirection(SteerBoneName, SteerRot, WForce, 1, 0);
        }
    }
    	// Update any stunt variables.
	if(bDoStuntInfo)
	{
		ForwardsInOldPlane = Coords.XAxis - (Coords.XAxis dot OldCoords.ZAxis) * OldCoords.ZAxis;
		//ForwardsInOldPlane = SafeNormal(ForwardsInOldPlane);
		DeltaHeading = Acos( Clamp( ForwardsInOldPlane dot OldCoords.XAxis, -1.0, 1.0 ) );
		if( (ForwardsInOldPlane dot OldCoords.YAxis) &lt; 0.0)
			DeltaHeading *= -1.0;
		DeltaPitch = Asin( Clamp(Coords.XAxis dot OldCoords.ZAxis, -1.0f, 1.0) );
		DeltaRoll = Asin( Clamp(Coords.YAxis dot OldCoords.ZAxis, -1.0f, 1.0) );
		//debugf( TEXT(&quot;DR:%f DP:%f&quot;), DeltaRoll, DeltaPitch );

		bCurrentOnGround = (bVehicleOnGround || KP.bContactingLevel);
		DaredevilPoints = 0;

		if(bCurrentOnGround)
		{
			if(!bOldVehicleOnGround)
			{
				// We just landed - see if we should display Daredevil 'message'
				InAirTime = Level.TimeSeconds - LastOnGroundTime;

                                Dist1 = Location;
                                Dist2 = LastOnGroundLocation;
                                Vect  = Dist1 - Dist2;
                                Dist3 = Vect.X * Vect.X - Vect.Y * Vect.Y;
                                Dist3 = Sqrt(Dist3);

				DaredevilPoints += Max( Ceil( Abs(InAirSpin)/(0.5*DaredevilThreshInAirSpin) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( Abs(InAirPitch)/(0.5*DaredevilThreshInAirPitch) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( Abs(InAirRoll)/(0.5*DaredevilThreshInAirRoll) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( InAirTime/(0.5*DaredevilThreshInAirTime) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( InAirDistance/(0.5f*DaredevilThreshInAirDistance) ) - 1, 0 );
				DaredevilPoints *= 10;

				// A wheel must be touching the ground on landing to get a daredevil
				if( bVehicleOnGround &amp;&amp; DaredevilPoints &gt; 0 )
				{
					OnDaredevil();
				}
			}


			LastOnGroundLocation = Location;
			LastOnGroundTime = Level.TimeSeconds;
			InAirSpin = 0.0;
			InAirPitch = 0.0;
			InAirRoll = 0.0;
		}
		else
		{
			InAirSpin += (180.0/PI) * DeltaHeading;
			InAirPitch += (180.0/PI) * DeltaPitch;
			InAirRoll += (180.0/PI) * DeltaRoll;
		}

		OldRotation = Rotation;
		bOldVehicleOnGround = bCurrentOnGround;
	}

	if(!bDriving)
	{
		bOldVehicleOnGround = true; // If no-one is in the vehicle, dont consider it for daredevil status.
	}

	if(bAllowChargingJump)
	{
		// Check if all wheels are on the ground.
		if(bAllWheelsOnGround == true)
		{
		     for(x = 0; x&lt;Wheels.Length; x++)
		     {
			 if (Wheels[x].bWheelOnGround != false)
				bAllWheelsOnGround = false;
		     }
		}
		else
		{
		     // If any wheels are off the ground - we can just reset everything.
		     if(!bVehicleOnGround)
		     {
		          JumpForce = 0.0;
		          JumpSpin = 0.0;
//                          bPushDown = false;
		     }

		}
	}
      //Engine(Throttle);
     // If on the server - we work out OutputGas, OutputBrake etc, and pack them to be sent to the client.
     if(!bClutching)
           Gas2 = InterpCurveEval(RPMtoGas, EngineRPM);
     ProcessCarInput();
     PackState();
}
&lt;/uscript&gt;

;ProcessCarInput

&lt;uscript&gt;
function ProcessCarInput()
{
        local bool     bReverse;

	bReverse = false;
	if(Driver == none)
	{
		OutputBrake = 1.0;
		OutputGas = 0.0;
	}
	else
	{
		if(Throttle &gt;= 0) // pressing forwards
		{
                        OutputGas = Abs(Throttle);
                        OutputBrake = 0.0;
                        if(bClutching)
                        {
                             if(Throttle == 0)
                             {
                                  if(Gas2&lt;=21 &amp;&amp; Gas2&gt;=0)
                                  {
                                        Gas2 -= 0.5;
                                  }
                                  if(Gas2&lt;0)
                                        Gas2 = 0;
                             }
                             else
                             {
                                  if(Gas2&lt;=21 &amp;&amp; Gas2&gt;=0)
                                  {
                                         Gas2 += 0.5;
                                  }
                                  if(Gas2&gt;21)
                                         Gas2 = 21;
                             }
                             if(Gas2 &gt;=21)
                                  Gas2 = 21;
                         }
                         if(!bClutching)

                 }

       StoptheCar();
       OutputBrake = Abs(InterpCurveEval(BrakeCurve, hBrake));

	OutputPitch = Rise;
	}
	Engine();
	KWake();
}
&lt;/uscript&gt;

;Clutch

&lt;uscript&gt;
exec function Clutch(bool bEnabled)
{
       if(!bEnabled)
       {
           bClutching = False;
           bInGear = False;
       }

       else if(bEnabled)
       {
           bClutching = True;

           RPM = EngineRPM;
       }
}
&lt;/uscript&gt;

;Brake

&lt;uscript&gt;
exec function Brake(bool bEnabled)
{
      if(bEnabled)
      {
           bBraking = True;
           OutputHandbrake = true;
      }
      if(!bEnabled)
      {
           bBraking = false;
           OutputHandbrake = false;
      }
}
&lt;/uscript&gt;

;ChangeGear

&lt;uscript&gt;
function ChangeGear(int GearChoice)
{
      if(bClutching){
        if(Gear &gt;= 1 &amp;&amp; Gear &lt;= 7)
        {
             if(GearChoice == 1)
             {
                  Gear++;
                  bGearUp = 0;
             }
             else if(GearChoice == -1)
             {
                  Gear--;
                  bGearDown = 0;
             }
             else if(GearChoice == 0)
             {

             }
        }
        else if(Gear == 0 &amp;&amp; GearChoice == 1)
        {
              Gear++;
              bGearUp = 0;
        }
        else if(Gear == 8 &amp;&amp; GearChoice == -1)
        {
              Gear--;
              bGearDown = 0;
        }
        else
        {
             bGearUp = 0;
             bGearDown = 0;
        }
      }
}
&lt;/uscript&gt;

;PackState

&lt;uscript&gt;
function PackState()
{
	local KRigidBodyState   RBState;
	local rotator           ViewRot;
	if(!KIsAwake())
		return;
	KGetRigidBodyState(RBState);
        CActiveWeapon=SActiveWeapon;
	CarState.ChassisPosition.X = RBState.Position.X;
	CarState.ChassisPosition.Y = RBState.Position.Y;
	CarState.ChassisPosition.Z = RBState.Position.Z;
	CarState.ChassisQuaternion = RBState.Quaternion;
	CarState.ChassisLinVel.X = 10.0 * RBState.LinVel.X;
	CarState.ChassisLinVel.Y = 10.0 * RBState.LinVel.Y;
	CarState.ChassisLinVel.Z = 10.0 * RBState.LinVel.Z;
	CarState.ChassisAngVel.X = 1000.0 * RBState.AngVel.X;
	CarState.ChassisAngVel.Y = 1000.0 * RBState.AngVel.Y;
	CarState.ChassisAngVel.Z = 1000.0 * RBState.AngVel.Z;
        CarState.ServerHandbrake = FloatToRangeByte(OutputPitch);
	CarState.ServerBrake = FloatToRangeByte(OutputBrake);
	CarState.ServerGas = FloatToRangeByte(OutputGas);
	CarState.ServerGear = Gear;
	CarState.ServerSteering = FloatToRangeByte(Steering);
	if(Controller != None)
	{
		if(IsHumanControlled())
		{
			DriverViewPitch = Controller.Rotation.Pitch;
			DriverViewYaw = Controller.Rotation.Yaw;
		}
		else
		{
			ViewRot = rotator(Controller.FocalPoint - Location);
			DriverViewPitch = ViewRot.Pitch;
			DriverViewYaw = ViewRot.Yaw;
		}
	}
	else
	{
		DriverViewPitch = Rotation.Pitch;
		DriverViewYaw = Rotation.Yaw;
	}
	CarState.ServerViewPitch = DriverViewPitch;
	CarState.ServerViewYaw = DriverViewYaw;
	FudgeByte++;
}
&lt;/uscript&gt;

;Motion Blur (still in the works)

&lt;uscript&gt;
function addblur()
{
      local PlayerController PC;
      
      PC = PlayerController(Controller);
      
      PC.AddCameraEffect(new myBlur);
}
&lt;/uscript&gt;

;LimitPitch

&lt;uscript&gt;
function int LimitPitch(int pitch)
{
	if (bAllowAirControl &amp;&amp; !bVehicleOnGround)
		return pitch;
	return Super.LimitPitch(pitch);
}
&lt;/uscript&gt;

;Destroyed

&lt;uscript&gt;
simulated function Destroyed()
{
    if (LeftTrail != None)
        LeftTrail.Destroy();

    if (RightTrail != None)
        RightTrail.Destroy();

    Super.Destroyed();
}
&lt;/uscript&gt;

;TakeImpactDamage

&lt;uscript&gt;
event TakeImpactDamage(float AccelMag)
{
    local int Damage;
        Damage = int(VSize(ImpactInfo.Other.Velocity) * 20 * ImpactDamageModifier());
    if (Vehicle(ImpactInfo.Other) != None)
        TakeDamage(Damage, Vehicle(ImpactInfo.Other), ImpactInfo.Pos, vect(0,0,0), class'DamType');
    else
        TakeDamage(int(AccelMag * ImpactDamageModifier())/ WallCollisionResistance , Self, ImpactInfo.Pos, vect(0,0,0), class'DamType');

    //FIXME - scale sound volume to damage amount
    if (ImpactDamageSounds.Length &gt; 0)        PlaySound(ImpactDamageSounds[Rand(ImpactDamageSounds.Length-1)],,TransientSoundVolume*2.5);
    if (Health &lt; 0 &amp;&amp; (Level.TimeSeconds - LastImpactExplosionTime) &gt; TimeBetweenImpactExplosions)
    {
        VehicleExplosion(Normal(ImpactInfo.ImpactNorm), 0.5);
        LastImpactExplosionTime = Level.TimeSeconds;
    }
}
&lt;/uscript&gt;

;Died

&lt;uscript&gt;
function Died(Controller Killer, class&lt;DamageType&gt; damageType, vector HitLocation)
{
    if (damageType == none)
       return;
    if (Killer != None)        PlayerController(Killer).ReceiveLocalizedMessage(class'VehicleKillMessage', 7);
    Super.Died(Killer, damageType, HitLocation);
}
&lt;/uscript&gt;

;FloatToRangeByte

&lt;uscript&gt;
simulated function byte FloatToRangeByte(float f)
{
	f= FClamp(f, 0, 1);
	f = Round(f * 255);
	return byte(f);
}
&lt;/uscript&gt;

;RangeByteToFloat

&lt;uscript&gt;
//The opposite of the above function.
simulated function float RangeByteToFloat(byte b)
{
	local float f;
	f = b;
	f /= 255;
	return f;
}
&lt;/uscript&gt;

====Defaults ====

&lt;uscript&gt;
defaultproperties
{
     myBlur=Class'WhatEverPackage.myMotionBlur'

     NumForwardGears=7

     DustSlipRate=2.800000
     DustSlipThresh=50.000000
     DaredevilThreshInAirSpin=100.000000
     DaredevilThreshInAirPitch=300.000000
     DaredevilThreshInAirRoll=300.000000
     DaredevilThreshInAirTime=1.500000
     DaredevilThreshInAirDistance=17.000000
     DaredevilMessageClass=Class'Onslaught.ONSDaredevilMessage'
     bOldVehicleOnGround=True
     MaxJumpSpin=30000.000000
     JumpChargeTime=1.000000
     JumpFeedbackForce=&quot;HoverBikeJump&quot;
     JumpSound=Sound'ONSVehicleSounds-S.Hydraulics.Hydraulic10'
     JumpMeterOriginX=0.275000
     JumpMeterOriginY=0.943000
     JumpMeterWidth=0.136000
     JumpMeterHeight=0.057000
     JumpMeterSpacing=0.010000
     JumpMeterColor=(R=215,A=255)
     SpinMeterColor=(B=215,G=100,A=255)
     JumpMeterTexture=Texture'Engine.WhiteTexture'
     MinAirControlDamping=0.100000
     bBrakeFrontWheelsOnly=False
     ChangeUpPoint=2800
     StopThreshold=0.2
     CrosshairHitFeedbackTex=Texture'ONSInterface-TX.tankBarrelAligned'
     DefaultCrosshair=Material'InterfaceContent.Hud.fbBombFocus'
     CrosshairScale=0.125
     bTeamLocked=false
     bGearUp=True
     bInGear=True
     bEjectPassengersWhenFlipped=False
     bCanFlip=true
     DisintegrationHealth=0.0
     bShowChargingBar = false;
     // Damages
     WallCollisionResistance = 5 // Collision resistance: the bigger it is, the less damage taken
     ExplosionDamage=0.0
     DriverDamageMult=0
     CenterSpringRangePitch=5000
     CenterSpringRangeRoll=5000
     StolenAnnouncement=&quot;Play&quot;

     bNetNotify=true
}
&lt;/uscript&gt;
*Global variables that would need to be added to the above uscript:

&lt;uscript&gt;
enum ETextAnchor
{
    TA_Left,
    TA_Right,
    TA_Middle
};
var   float                         ScaleX, ScaleY;
&lt;/uscript&gt;

'''CIpen:'''  Here is some simple code you can add to print data on the screen to avoid logging 24/7.  This is what I used to check numbers such as RPM, Gas, EngineRPM, and whatever else I could fit on 1024x768 resolution.  I've found it to be most handy.  I'm sure you can find this elsewhere but I'm saving you the effort of looking.

*And here is the DrawHUD function that we must have to draw on the screen when a player has possesion of the vehicle:

&lt;uscript&gt;
simulated function DrawHUD(Canvas C)
{
    local PlayerController PC;

    PC = PlayerController(Controller);

    ScaleX = C.ClipX/1024;
    ScaleY = C.ClipY/768;

    C.Style = ERenderStyle.STY_Additive;
    C.Font = PC.MyHUD.GetFontSizeIndex(C, -2);
    C.DrawColor = C.MakeColor(255,255,255);

    DrawEngineStuff(C);
}
&lt;/uscript&gt;

*Here is the DrawEngineStuff(C) which is isn't a required function but is there to organize:

&lt;uscript&gt;
simulated function DrawEngineStuff(Canvas C)
{
    C.Font = C.TinyFont;

    C.SetPos(40*ScaleX, 150*ScaleY);
    C.DrawText(&quot;Engine stuff&quot;);

    C.SetPos(40*ScaleX, 160*ScaleY);
    C.DrawText(&quot;Engine RPM: &quot; @ EngineRPM);
}
&lt;/uscript&gt;

40*ScaleX sets the vertical starting position, and 150*ScaleY sets the horizontal starting position.

====Notes ====

If you are to subclass, you need to know that the engine rpm is in radians per min.  This means that if you were to create a torque curve and wanted the rpm range to be from 500 to 7000, you would need to convert all the points from revolutions per min to radians per sec.  Take the rpm(real life engine rpm) of 7000, divide by 60, then multiply by 2 PI.  Like so:

(7000/60)*6.2831853

this yields 733.038285 as the correct rpm

bNetNotify=true is prolly the most critical thing needed for this class to work online/lan

I've got a lot of changes that need to be made to this class, so be patient.  Additions include, properly calculating wheel torque if the wheel is powered or not, better collisions with walls(currently if you hit a wall flat at 300 mph the vehicle just stops and takes no damage), available auto transmision, ...

'''Graphik:''' Very nice idea, but a bit unsuited for an FPS, more for a racing game like UnWheel. It seems to me that Epic made sure that the vehicles were as &quot;dumbed down&quot; as possible to keep the focus on fragging people with a vehicle rather than the minutia of driving one. I recommend sending this in to [http://unwheel.beyondunreal.com/ UnWheel] when you're done. If they don't actually use it I'm sure they'd at the very least find it interesting.

'''CIpen:''' Accually I got a thumbs up on that at the same time I created this page.  The bounds of this script is almost limitless, as it would be easy to have say the tire blow out when shot.  As soon as I get a free day I'll update this page with all the new additions (infact that might be something good to do tonight).  The big change is that I added the option for auto or stick control and the the power is ditributed over the wheels that are powered.

'''Foxpaw:''' Why do you divide by 60 when converting rotations per minute to radians per minute? The radians per minute should be greater than the roatations per minute, as there's more than one radian per rotation. Or is that supposed to say, radians per second?

'''CIpen:''' Yes, you pointed out a typo :D.  Yes, it should say radians per second.  Yet your own message has typos, it's not rotations per minute, but revolutions per minute. :)

'''Foxpaw:''' Err, ehm, well, I guess that depends on where you measure it from. I'd measure it from the flywheel which definately rotates. I suppose some parts of the crankshaft do revolve though, so either could be correct.

----

'''Zxanphorian:''' WOW, that is a lot of scriptage there! I have an idea, to make it randomly stall :B

----

'''CIpen:'''  Ya, there are a lot of cool possibilities with this class.  You could attach a model to the wheel bone, add another bone for disk brakes (to attach a disk brake mesh to that turns when the wheels turn), make the engine blow up if you downgear and the engine rpm goes to high, have an axle break, have more wheel slip functions for different traction of different surfaces...     any number of things....

'''OlympusMons:''' I would have to agree CIpen. Has anyone given any thought to making a proper automatic car you know the manual automatic ones. :S Like what mafia did. I havent really had time to look through all this code although I'd like to, I was just wondering if all of this is actually needed to make a manual shift car or if there are other features which have been added through all of this script. Actually another cool thing to do would be to make a proper 4wd manual shift. Hmm!

'''CIpen:'''  Good! Lets get to the meat!  The first thing you need to know is that the function UpdateVehicle() is somehow tied to native code.  To see this all you need to do is log the DeltaTime from inside the Tick() function and from inside UpdateVehicle() function.  You should see that UpdateVehicle() always has the same DeltaTime so matter what your FPS is (at least this is what I remember it being when I tested it).

The next serious thing is that, unless you do your own wheel calculations, you'll have to build around the SVehicleWheel variables that are calculated each frame.  It's both good and bad I guess.  Take a minute to thing about this:  below is the line that calculates the GripTorque.

&lt;uscript&gt;
GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

&lt;/uscript&gt;

Now, lets say we want to be the biggest uscript hot shot around, you might change this line to look like this:

&lt;uscript&gt;

if(bPlayerIsOnHood)
     GripTorque = FTScale * Wheels[i].WheelRadius * (Wheels[i].TireLoad + PlayerMass) * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));
else
     GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

&lt;/uscript&gt;

Thus simulating player weight on the car(more or less).  That is after you do some stuff to get if the player is on the vehicle or not.

btw I just updated it UpdateVehicle() because it was far behind.

'''Tarquin:''' I moved this back to its original name, as the class name didn't seem very descriptive.</text>
    </revision>
    <revision>
      <id>5318</id>
      <timestamp>2006-01-01T21:11:06Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Breakdown ==

This is a convertion of [[Legacy:ONSWheeledCraft|ONSWheeledCraft]]. This class allows for a stick shift or otherwise known as a manual transmission car.  Why stick shift?
* It doesn't cost much in terms of fps
* Lets you rev it in neutral :)
* Fun to drive
* Will allow rear/front/all wheel drive
* Holding the brake and the rear wheels keep spinning (no rear brakes)

* I hope you can use what I (CIpen) have created

==The Goods ==

===To start the class off ===

&lt;uscript&gt;
class WheeledClutch_Brake extends ONSVehicle;

&lt;/uscript&gt;

===Critical variables ===

&lt;uscript&gt;
var() float             WheelSoftness;
var() float             WheelPenScale;
var() float             WheelPenOffset;
var() float             WheelRestitution;
var() float             WheelAdhesion;
var() float             WheelInertia;   // I believe this is how much to resist change in motion

    //I(CIpen) made these an array so we could have different slips on each surface
var() array&lt;float&gt;         WheelLongSlip; // I think this is so we can have the wheels slip when you take off
var() array&lt;InterpCurve&gt;   WheelLongFrictionFunc;//this is the curve for how slippery the wheels are allong the X axis(forwards slip)
var() array&lt;InterpCurve&gt;   WheelLatSlipFunc;//this is the curve for how slippery the wheels are allong the Y axis(left/right slip)
var() array&lt;float&gt;         WheelLongFrictionScale;  // quick way to change the ammount of friction without having to draw out
var() array&lt;float&gt;         WheelLatFrictionScale;   // a new friction curve

var() float                             WheelHandbrakeSlip;
var() float                             WheelHandbrakeFriction;
var() float                             WheelSuspensionTravel;
var() float                             WheelSuspensionOffset;
var() float                             WheelSuspensionMaxRenderTravel;   
var() float                             FTScale;
var() float                             ChassisTorqueScale;
var() float                             MinBrakeFriction;
var() InterpCurve                       MaxSteerAngleCurve; // degrees, this makes the wheels turn like real car wheels*
var() float                             GearRatios[8];  // 0 is reverse, 1-4 f
var() int                               NumForwardGears;
var() float                             TransRatio;   // Other(constant)gears  i.e. so we can have driveshaft ratio(if one applies)
var() float                             ChangeUpPoint;   //EngineRPM that signals gear up change
var() float                             ChangeDownPoint; //EngineRPM that signals gear down change

var   int                               bGearUp;
var   int                               bGearDown;

var() float                             LSDFactor;                                                                                    
var() float                             EngineBrakeFactor;
var() float                             EngineBrakeRPMScale;                                                                                     
var() float                             MaxBrakeTorque;
var() float                             SteerSpeed;         // How fast it turns         
var() float                             TurnDamping;                                                                                    
var() float                             StopThreshold;
var() float                             HandbrakeThresh;                                                                                     
var() float                             EngineInertia;     // Pre-gear box engine (piston mass)
var   bool                              bClutching;        // If holding the clutch
var   bool                              bOldClutching;  
var() float                             IdleRPM;              //RPM to idle at
var() float                             EngineRPMSoundRange;   //RPM sound range
var() name                              SteerBoneName;
var() EAxis                             SteerBoneAxis;
var() float                             SteerBoneMaxAngle; // degrees                                                                                     

var   float                             OutputBrake;    //How much we are braking
var   float                             OutputGas;      //How much are we giving gas
var   float                             OutputPitch;
var   bool                              OutputHandbrake;

var   int                               Gear;           //What gear we are in
var   float                             ForwardVel;
var   bool                              bIsInverted;
var   bool                              bIsDriving;
var   float                             NumPoweredWheels;
var   float                             NeutralRPM;

var   InterpCurve                       RPMtoGas;           // This is what I use to convert the current in gear RPM to the amount of gas so the RPM doesn't go to zero when we hit the clutch
var() InterpCurve                       TorqueCurve;        // Engine output torque
var() InterpCurve                       EngineS;
var() InterpCurve                       BrakeCurve;     //This simulates more lifelike braking, where you apply braking

var   float                             Gas, Gas2, hBrake;

var   float                             RPM2;    //Neutral RPM
var   float                             RPM;     //Neutral RPM
var   float                             NRPM;
var   bool                              bBraking;   //if we are braking
var   bool                              bThrot, bNThrot, bNoGas;
var   bool                              bInGear;          //if we are completly in gear
var   bool                              bRadians;
var   float                             TotalSpinVel;
var   float                             EngineRPM;
var   float                             WheelRPM;// used to get the wheel RPM at anytime(so we don't change EngineRPM which is what the engine sound is tied to)
var   float                             CarMPH;
var   float                             ETorque;
var   float                             ActualSteering;
var   float                             SteerBoneAngle;
var   float                             EnginePitch;
var   Vector                            worldForward;
var   Vector                            worldRight;
var   Vector                            worldUp;
var   Matrix                            carTM;
var   Rotator                           SteerRot;
var   bool                              bCurrentOnGround;
var   float                             DeltaPitch;
var   float                             DeltaHeading;
var   float                             DeltaRoll;
var   float                             VRate;

var   vector                            one, two, three;
var   vector                            Dist1, Dist2;     // unused but this was for doing the daredevil stuff
var   float                             Dist3;
var   bool                              bBrakeFrontWheelsOnly, bBrakeFrontWheels;
var   Vector                            UDForce, UDTorque;
var   Vector                            WForce, WTorque;
var   Coords                            WheelCoords;
var   Coords                            OldCoords;
var   Coords                            Coords;
var   Vector                            ForwardsInOldPlane;
var   Pawn                              OldDriver;        

struct native SCarState
{
    	  var vector                    ChassisPosition;                               
    	  var Quat                      ChassisQuaternion;                             
    	  var vector                    ChassisLinVel;                                 
    	  var vector                    ChassisAngVel;                                 
                                                                                     
    	  var byte                      ServerHandbrake;                               
    	  var byte                      ServerBrake;                                   
    	  var byte                      ServerGas;                                     
    	  var byte                      ServerGear;                                    
    	  var byte                      ServerSteering;
    	  var int                       ServerViewPitch;
          var int                       ServerViewYaw;
};
                                                                               
var   byte                     FudgeByte;                                                                                     
var   SCarState                CarState;                                      
var   SCarState                OldCarState;
var   KRigidBodyState          ChassisState;                                  
var   bool                     bNewCarState;                                                                                    
var   bool                     bOldVehicleOnGround;
var   float                    TheDeltaTime;
&lt;/uscript&gt;

===Not so critical variables ===

&lt;uscript&gt;
var   class&lt;CameraEffect&gt;           myBlur;
var   myMotionBlur                  ClientMotionBlur;

var   array&lt;ONSDirtSlipEffect&gt;          Dust; // FL, FR, RL, RR
var() float                             DustSlipRate;
var() float                             DustSlipThresh;
var() float	                        RevMeterPosX;
var() float	                        RevMeterPosY;
var() float	                        RevMeterScale;
var() float	                        RevMeterSizeY;

var() bool			        bDoStuntInfo;
var() bool			        bAllowAirControl;
var() bool			        bAllowChargingJump;
var   bool			        bAllowBigWheels;
                                                                                     
var   bool		                bPushDown; //jump is being charged
var   bool                          bOldPushDown;
var   bool                          bAllWheelsOnGround;
                                                                                     
var() float			        MaxJumpForce;
var   float                         JumpForce;
var() float			        MaxJumpSpin;
var   float                         JumpSpin;

var() float			        JumpChargeTime;
var   float			        DesiredJumpForce; //used by AI
var   string			JumpFeedbackForce;                             
                                                                                     
var   sound			        JumpSound;
                                                                                   
var() float			        JumpMeterOriginX;
var() float                         JumpMeterOriginY;
var() float			        JumpMeterWidth;
var() float                         JumpMeterHeight;
var() float                         JumpMeterSpacing;
var() color			        JumpMeterColor;
var() color                         SpinMeterColor;
var   Texture			JumpMeterTexture;                              
                                                                                   
var() float			        AirTurnTorque;
var() float			        AirPitchTorque;
var() float			        AirPitchDamping;
var() float			        AirRollTorque;
var() float			        AirRollDamping;
var() float			        MinAirControlDamping;                                                                                    
var   float			        FenderBenderSpeed;
                                                                            
var() bool	                        bMakeBrakeLights;
var() vector	                       BrakeLightOffset[2];                           
var   ONSBrakelightCorona	        BrakeLight[2];                                 
var() Material	                      BrakeLightMaterial;                            
                                                                                     
var   Rotator			OldRotation;
var   Vector			LastOnGroundLocation;                          
var   float			        LastOnGroundTime;
                                                                                     
var   float			        InAirSpin; // Degrees
var   float			        InAirPitch; // Degrees
var   float			        InAirRoll; // Degrees
var   float			        InAirTime; // Second
var   float			        InAirDistance; // Meters
var   int				DaredevilPoints;
var   config int                    IntSteerBoneAngle;

var() float			        DaredevilThreshInAirSpin;                      
var() float			        DaredevilThreshInAirPitch;
var() float			        DaredevilThreshInAirRoll;
var() float			        DaredevilThreshInAirTime;
var() float			        DaredevilThreshInAirDistance;
var() class&lt;LocalMessage&gt;	        DaredevilMessageClass;

&lt;/uscript&gt;

==== Replication =====

&lt;uscript&gt;
replication
{
        reliable if (Role == ROLE_Authority)
                CarState, FudgeByte;                       // make sure we get what we need to the client
        reliable if (bNetInitial &amp;&amp; Role == ROLE_Authority)
                bAllowAirControl, bAllowChargingJump;        // showoff stuff
        reliable if (bNetInitial &amp;&amp; bDoStuntInfo &amp;&amp; Role == ROLE_Authority)
                DaredevilThreshInAirDistance, DaredevilThreshInAirTime, DaredevilThreshInAirSpin, DaredevilThreshInAirPitch, DaredevilThreshInAirRoll;
}
&lt;/uscript&gt;

===Functions ===

;PostNetBeginPlay

&lt;uscript&gt;
simulated function PostNetBeginPlay()
{
        local int i;
 	NumPoweredWheels = 0.0;
	for(i=0; i&lt;=1; i++)
	{
		NumPoweredWheels += 1.0;
	}
       SVehicleUpdateParams();
       Super.PostNetBeginPlay();
}
&lt;/uscript&gt;

;PostNetReceive : Here is were we deal with stuff coming from the server.

&lt;uscript&gt;
simulated function PostNetReceive()
{
 	Super.PostNetReceive();

	if(OldCarState.ChassisPosition == CarState.ChassisPosition &amp;&amp;
		OldCarState.ChassisQuaternion.X == CarState.ChassisQuaternion.X &amp;&amp;
		OldCarState.ChassisQuaternion.Y == CarState.ChassisQuaternion.Y &amp;&amp;
		OldCarState.ChassisQuaternion.Z == CarState.ChassisQuaternion.Z &amp;&amp;
		OldCarState.ChassisQuaternion.W == CarState.ChassisQuaternion.W &amp;&amp;
		OldCarState.ChassisLinVel == CarState.ChassisLinVel &amp;&amp;
		OldCarState.ChassisAngVel == CarState.ChassisAngVel &amp;&amp;
		OldCarState.ServerHandbrake == CarState.ServerHandbrake &amp;&amp;
		OldCarState.ServerBrake == CarState.ServerBrake &amp;&amp;
		OldCarState.ServerGas == CarState.ServerGas &amp;&amp;
		OldCarState.ServerGear == CarState.ServerGear &amp;&amp;
		OldCarState.ServerSteering == CarState.ServerSteering &amp;&amp;
		OldCarState.ServerViewPitch == CarState.ServerViewPitch &amp;&amp;
		OldCarState.ServerViewYaw == CarState.ServerViewYaw)
		return;

	ChassisState.Position.X = CarState.ChassisPosition.X;
	ChassisState.Position.Y = CarState.ChassisPosition.Y;
	ChassisState.Position.Z = CarState.ChassisPosition.Z;

	ChassisState.Quaternion = CarState.ChassisQuaternion;

	ChassisState.LinVel.X = 0.1f * CarState.ChassisLinVel.X;
	ChassisState.LinVel.Y = 0.1f * CarState.ChassisLinVel.Y;
	ChassisState.LinVel.Z = 0.1f * CarState.ChassisLinVel.Z;

	ChassisState.AngVel.X = 0.001f * CarState.ChassisAngVel.X;
	ChassisState.AngVel.Y = 0.001f * CarState.ChassisAngVel.Y;
	ChassisState.AngVel.Z = 0.001f * CarState.ChassisAngVel.Z;

	bNewCarState = true;
	OldCarState.ChassisPosition = CarState.ChassisPosition;
	OldCarState.ChassisQuaternion = CarState.ChassisQuaternion;
	OldCarState.ChassisLinVel = CarState.ChassisLinVel;
	OldCarState.ChassisAngVel = CarState.ChassisAngVel;
	OldCarState.ServerHandbrake = CarState.ServerHandbrake;
	OldCarState.ServerBrake = CarState.ServerBrake;
	OldCarState.ServerGas = CarState.ServerGas;
	OldCarState.ServerGear = CarState.ServerGear;
	OldCarState.ServerSteering = CarState.ServerSteering;
	OldCarState.ServerViewPitch = CarState.ServerViewPitch;
	OldCarState.ServerViewYaw = CarState.ServerViewYaw;

	OutputPitch = RangeByteToFloat(CarState.ServerHandbrake);
	OutputHandbrake = (OutputPitch &gt; 0.01);
	OutputBrake = RangeByteToFloat(CarState.ServerBrake);
	OutputGas = RangeByteToFloat(CarState.ServerGas);
	Gear = CarState.ServerGear;
	Steering = RangeByteToFloat(CarState.ServerSteering);
	DriverViewPitch = CarState.ServerViewPitch;
	DriverViewYaw = CarState.ServerViewYaw;
}

&lt;/uscript&gt;

;PrecacheAnnouncer

&lt;uscript&gt;
simulated function PrecacheAnnouncer(AnnouncerVoice V, bool bRewardSounds)
{
	if (bRewardSounds &amp;&amp; !bSoundsPrecached)
		V.PrecacheSound('fender_bender');

	Super.PrecacheAnnouncer(V, bRewardSounds);
}
&lt;/uscript&gt;

;KUpdateState : This function tells when we should update.

&lt;uscript&gt;
event bool KUpdateState(out KRigidBodyState newState)
{
	if(Role == ROLE_Authority || !bNewCarState)
		return false;

	newState = ChassisState;
	bNewCarState = false;
	return true;
}
&lt;/uscript&gt;

;SVehicleUpdateParams

&lt;uscript&gt;
event SVehicleUpdateParams()
{
	local int i;

	Super.SVehicleUpdateParams();

	for(i=0; i&lt;Wheels.Length; i++)
	{
		Wheels[i].Softness = WheelSoftness;
		Wheels[i].PenScale = WheelPenScale;
		Wheels[i].PenOffset = WheelPenOffset;
		Wheels[i].LongSlip = WheelLongSlip[0];
		Wheels[i].LatSlipFunc = WheelLatSlipFunc[0];
		Wheels[i].Restitution = WheelRestitution;
		Wheels[i].Adhesion = WheelAdhesion;
		Wheels[i].WheelInertia = WheelInertia;
		Wheels[i].LongFrictionFunc = WheelLongFrictionFunc[0];
		Wheels[i].HandbrakeFrictionFactor = WheelHandbrakeFriction;
		Wheels[i].HandbrakeSlipFactor = WheelHandbrakeSlip;
		Wheels[i].SuspensionTravel = WheelSuspensionTravel;
		Wheels[i].SuspensionOffset = WheelSuspensionOffset;
		Wheels[i].SuspensionMaxRenderTravel = WheelSuspensionMaxRenderTravel;
	}
	if(Level.NetMode != NM_DedicatedServer &amp;&amp; bMakeBrakeLights)
	{
		for(i=0; i&lt;2; i++)
		{
                     if (BrakeLight[i] != None)
                     {
				BrakeLight[i].SetBase(None);
				BrakeLight[i].SetLocation( Location + (BrakelightOffset[i] &gt;&gt; Rotation) );
				BrakeLight[i].SetBase(self);
				BrakeLight[i].SetRelativeRotation( rot(0,32768,0) );
				BrakeLight[i].Skins[0] = BrakeLightMaterial;
		      }
		}
	}
}
&lt;/uscript&gt;

;UpdateVehicle : This is the function were everything happens
           &lt;i&gt;Also see &lt;/i&gt;[[Legacy:Manual Shift Car/C++ Version|Manual Shift Car/C++ Version]]

&lt;uscript&gt;
function UpdateVehicle(float DeltaTime)
{
        local Matrix carTM;
        local Vector worldUp, worldRight, worldForward;

        local KarmaParams KP;
        local KRigidBodyState rbState;
        local int   i;
        local float maxSteerAngle, maxSteer, deltaSteer;
        local float DriveTorque, GripTorque, EngineTorque, EngineBraking, EngineWheelRatio;
        local float BrakeTorque;
        local float NewTotalSpinVel, LSDSplit, EvenSplit, UseSplit;
        local float TransInertia;
        local float LimitBrakeTorque;
        local float WheelTorque, VehicleForce, TransAcc;
        local float TurnAngVel, DampingScale, TurnDampingMag;
        local float PitchAngVel, RollAngVel, PitchDampingMag, RollDampingMag;

        local Vector AirControlTorque, AngVel;
        local float  VRate;
        local Vector Force, Torque;
        local int z;

        WForce = vect(0, 0, 0);
	WTorque = vect(0, 0, 0);

	if(!KIsAwake())
		return;
        KP = KarmaParams(KParams);
        if(KP == None)
		return;

        if(Controller != None)
	{
	      //Calc up (z), right(y) and forward (x) vectors
	      GetAxes(Rotation, worldRight, worldForward, worldUp);

	      /////////// STEERING ///////////
	      maxSteerAngle = InterpCurveEval(MaxSteerAngleCurve, VRate);
	      if(maxSteerAngle==0)
                    maxSteer = DeltaTime * SteerSpeed * maxSteerAngle;
              else
	            maxSteer = DeltaTime * SteerSpeed;

	      deltaSteer = (-Steering * maxSteerAngle) - ActualSteering; // Amount we want to move (target - current)
	      deltaSteer = Clamp(deltaSteer, -maxSteer, maxSteer);
	      ActualSteering += deltaSteer;

	      if(bAuto==True)
              {
	      	      EngineTorque = OutputGas * InterpCurveEval(TorqueCurve, EngineRPM);
	      	      EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);
	      	      EngineTorque -= EngineBraking;
	      	      EngineWheelRatio = GearRatios[Gear] * TransRatio;
	      	      NewTotalSpinVel=0.0;
	      	      EngineRPM = 0.0;
	      	      for(i=0; i&lt;Wheels.length; i++)
	      	      {
		      	      EvenSplit = 1/NumPoweredWheels;
		      	      if(TotalSpinVel &gt; 0.1)
			      	      LSDSplit = (TotalSpinVel - Wheels[i].SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		      	      else
			      	      LSDSplit = EvenSplit;
		      	      UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);
		      	      DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
		      	      GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));
		      	      if(Wheels[i].SlipVel &lt; 0.0)
			      	      GripTorque *= -1.0;
		      	      TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + Wheels[i].WheelInertia;
		      	      if(Wheels[i].SpinVel &gt; 0.0)
		              	      BrakeTorque = -OutputBrake * MaxBrakeTorque;
                      	      else
                              	      BrakeTorque = OutputBrake * MaxBrakeTorque;

		      	      LimitBrakeTorque = ( Abs(Wheels[i].SpinVel) * TransInertia ) / TheDeltaTime; // Size of torque needed to completely stop wheel spinning.
		      	      BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!
		      	      WheelTorque = DriveTorque + BrakeTorque - GripTorque;
		      	      VehicleForce = GripTorque / (FTScale * Wheels[i].WheelRadius);
		      	      if( OutputBrake &gt; 0.0 ||  (DriveTorque + BrakeTorque) * Wheels[i].SpinVel &lt; 0.0)
		      	      {
			      	      Wheels[i].DriveForce = 0.0;
			      	      Wheels[i].LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		      	      }
		      	      else
		      	      {
			      	      Wheels[i].DriveForce = VehicleForce;
			      	      Wheels[i].LongFriction = 0.0;
		      	      }
		      	      if (Wheels[i].bWheelOnGround)
			      	      Wheels[i].ChassisTorque = -1.0 * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		     	       else
			      	      Wheels[i].ChassisTorque = 0.0;
		      	      TransAcc = WheelTorque / TransInertia;
		      	      Wheels[i].SpinVel += TransAcc * DeltaTime;
		      	      if(Gear == 0 &amp;&amp; Wheels[i].SpinVel &gt; 0.0)
			      	      Wheels[i].SpinVel = 0.0;
		      	      else if(Gear &gt; 0 &amp;&amp; Wheels[i].SpinVel &lt; 0.0)
			      	      Wheels[i].SpinVel = 0.0;
		      	      NewTotalSpinVel += Wheels[i].SpinVel;
		      	      EngineRPM += Wheels[i].SpinVel / EngineWheelRatio;
		      	      Wheels[i].LatFriction = WheelLatFrictionScale[0] * Wheels[i].TireLoad;
		      	      Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
		      	      if(OutputHandbrake &amp;&amp; Wheels[i].bHandbrakeWheel)
		      	      {
			      	      Wheels[i].LatFriction *= Wheels[i].HandbrakeFrictionFactor;
			      	      Wheels[i].LatSlip *= Wheels[i].HandbrakeSlipFactor;
                              }
		      	      if(Wheels[i].SteerType == VST_Steered)
			      	      Wheels[i].Steer = ActualSteering;
		      	      else if(Wheels[i].SteerType == VST_Inverted)
			      	      Wheels[i].Steer = -ActualSteering;
		      	      else
			      	      Wheels[i].Steer = 0.0;
	      	      }
	      	      EngineRPM /= NumPoweredWheels;
	      	      EngineRPM = Max(EngineRPM, 0.01); // ensure always positive!
	      	      TotalSpinVel = NewTotalSpinVel;
	      }
///////////////STICK SHIFT///////////////////////////////
	      else
	      {
                   if(bClutching)
                   {
                        EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                   }
                   else
                   {
                        EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                        if(EngineTorque &gt;= 0)
                        {
                        	   // Calculate torque at output of engine. Combination of throttle, current RPM and engine braking.
	                        EngineTorque = OutputGas * InterpCurveEval(TorqueCurve, EngineRPM);
                        }
                        else if(EngineTorque &lt; 0)
                        {
                                EngineTorque = InterpCurveEval(TorqueCurve, EngineRPM);
                        }

	                EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);
	           }

                  // EngineRPM = OutputGas * InterpCurveEval(RPMCurve, EngineTorque);

	           EngineTorque -= EngineBraking;
                   ETorque = EngineTorque;
	           //DebugInfo = FString::Printf(TEXT(&quot;OutputBrake: %f	EngineRPM: %f    EngineTorque: %f&quot;), OutputBrake, EngineRPM, EngineTorque);

	           // Total gear ratio between engine and differential (ie before being split between wheels).
	           // A higher gear ratio and the torque at the wheels is reduced.
	           EngineWheelRatio = GearRatios[Gear] * TransRatio;

                   if(bClutching)
                   {
                        //EngineRPM = 0.0;
                        WheelRPM = 0.0;
                   }
                   else
                   {
                        if(Wheels[i].bPoweredWheel)
                        {
	                     // Reset engine RPM. We calculate this by adding the component of each wheel spinning.
	                     NewTotalSpinVel=0.0;
	                     if(bInGear)
	                     {
	                           WheelRPM = 0.0;
	                           EngineRPM = 0.0;
	                     }
	                     else if(!bInGear)
	                           WheelRPM = 0.0;
	                }
	           }

	      // Do model for each wheel.
	      //  Okay this needs to be fixed because the way this is, all the wheels get power

	           for(i=0;i&lt;Wheels.length; i++)
	           {
	     	      //Wheels[i];
		      /////////// DRIVE ///////////
		      // Heuristic to divide torque up so that the wheels that are spinning slower get more of it.
		      // Sum of LSDFactor across all wheels should be 1.
		      // JTODO: Do we need to handle the case of vehicles with different size wheels?

		      EvenSplit = 1/NumPoweredWheels;

		      // If no wheels are spinning, just do an even split.
		      if(TotalSpinVel &gt; 0.1)
			      LSDSplit = (TotalSpinVel - Wheels[i].SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		      else
			      LSDSplit = EvenSplit;

		      UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);

                      if(bClutching)
                      {
                           EngineRPM = RPM;

                           //DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
                      }
                      else
                      {
                           if(Wheels[i].bPoweredWheel)
                           {
                                //EngineRPM = RPM;

                                // Calculate Drive Torque : applied at wheels (ie after gearbox and differential)
		                // This is an 'open differential' ie. equal torque to each wheel
		                DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);
		           }
		      }

		      /////////// LONGITUDINAL ///////////
		      // Calculate Grip Torque : longitudinal force against ground * distance of action (radius of tyre)
		      // LongFrictionFunc is assumed to be reflected for negative Slip Ratio
		      GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

		      if(Wheels[i].SlipVel &lt; 0.0)
			      GripTorque *= -1.0;

                      if(Wheels[i].bPoweredWheel)
                      {
                           // GripTorque can't be more than the torque needed to invert slip ratio.
		           TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + Wheels[i].WheelInertia;
                      }

		      //FLOAT SlipAngVel = Wheels[i].SlipVel/Wheels[i].WheelRadius;

                      if(bBraking)
                      {
		           // Brake torque acts to stop wheels (ie against direction of motion)
		           BrakeTorque = 0.0;
		           if(Wheels[i].SpinVel &gt; 0.0)
		                BrakeTorque = -OutputBrake * MaxBrakeTorque;
                          else
                                BrakeTorque = OutputBrake * MaxBrakeTorque;

		           LimitBrakeTorque = ( Abs(Wheels[i].SpinVel) * TransInertia ) / TheDeltaTime; // Size of torque needed to completely stop wheel spinning.
		           BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!
		           mBrakeTorque = BrakeTorque;
                      }
                      else
                      {
                           BrakeTorque = 0;
                           mBrakeTorque = BrakeTorque;
                      }
//_____________________________________________

                      if(bClutching)
                      {
                              WheelTorque = GripTorque;
                              //Log(&quot;GripTorque&quot;);
                              //Log(GripTorque);
                      }
                      else     // we are in full gear
                      {
                           if(!Wheels[i].bPoweredWheel)
                           {
                              //Don't do this if 4 wheel drive!!!!
                              WheelTorque = GripTorque * 2;
                           }
                           else
                           {
                              // Resultant torque at wheel : torque applied from engine + brakes + equal-and-opposite from tire-road interaction.
		              WheelTorque = DriveTorque + BrakeTorque - GripTorque;
		          /*    Log(&quot;WheelTorque&quot;);
                              Log(WheelTorque);
                              Log(&quot;GripTorque&quot;);
                              Log(GripTorque);      */
		           }
                      }
//____________________________________________

		      // Resultant linear force applied to car. (GripTorque applied at road)
		      VehicleForce = GripTorque / (FTScale * Wheels[i].WheelRadius);

		      // If the wheel torque is opposing the direction of spin (ie braking) we use friction to apply it.
		      if( OutputBrake &gt; 0 &amp;&amp; bBraking)//  || (DriveTorque + BrakeTorque) * Wheels[i].SpinVel &lt; 0.0
		      {
			      Wheels[i].DriveForce = 0.0;
			      Wheels[i].LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		      }
		      else if(bClutching)
		      {
		              Wheels[i].DriveForce = 0.0;
                              Wheels[i].LongFriction = 0.0;
		      }
		      else
		      {
		              if(!Wheels[i].bPoweredWheel)
		              {
		                     Wheels[i].DriveForce = 0.0;
                                     Wheels[i].LongFriction = 0.0;
		              }
		              else
		              {
			           Wheels[i].DriveForce = VehicleForce;
                                   Wheels[i].LongFriction = 0.0;
			           //Wheels[i].LongFriction = 0.0;
			      }
		      }


                      if(Wheels[i].bPoweredWheel)
                      {
		           // Calculate torque applied back to chassis if wheel is on the ground
		           if (Wheels[i].bWheelOnGround)
			      Wheels[i].ChassisTorque = -1.0 * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		           else
			      Wheels[i].ChassisTorque = 0.0;
                      }

		      // Calculate new wheel speed.
		      // The lower the gear ratio, the harder it is to accelerate the engine.

		      if(bClutching)
		      {
		             TransAcc = WheelTorque / -1;
		             Wheels[i].SpinVel += TransAcc * DeltaTime;
		      }
		      else
		      {
		             if(!Wheels[i].bPoweredWheel)
		             {
		                   TransAcc = WheelTorque / -1;
		                   Wheels[i].SpinVel += TransAcc * DeltaTime;
		             }
		             else
		             {
		                   TransAcc = WheelTorque / TransInertia;
		                   Wheels[i].SpinVel += TransAcc * DeltaTime;
		             }
                      }

//  -----this is were the engine needs to be slowly put into gear-----

                      if(bClutching)
                      {

                          WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                          //TorqueConverter();
                      }
                      else   // we are in full gear
                      {
                          if(!Wheels[i].bPoweredWheel)
                          {
                               WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                          }
                          else
                          {
                      	       // Accumulate wheel spin speeds to find engine RPM.
		               // The lower the gear ratio, the faster the engine spins for a given wheel speed.
		               NewTotalSpinVel += Wheels[i].SpinVel;
                               if(!bInGear)
                               {
//                                  EngineRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    TorqueConverter();

                               }
                               if(bInGear)
                               {
                                    WheelRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                                    EngineRPM += (Wheels[i].SpinVel / EngineWheelRatio);
                               }
                          }

                      }
//  ---------------------------------------------------------------

		      // Make sure the wheel can't spin in the wrong direction for the current gear.
		      if(bClutching)
		      {
		      }
		      else
		      {
		           if(Wheels[i].bPoweredWheel)
		           {
		                  if(Gear == 0 &amp;&amp; Wheels[i].SpinVel &gt; 0.0)
			               Wheels[i].SpinVel = 0.0;
		                  else if(Gear &gt; 0 &amp;&amp; Wheels[i].SpinVel &lt; 0.0)
			               Wheels[i].SpinVel = 0.0;
			   }
		      }

		      /////////// LATERAL ///////////
                      if(!Wheels[i].bPoweredWheel)
                      {
		           Wheels[i].LatFriction = (WheelLatFrictionScale[0] * 1.5) * Wheels[i].TireLoad ;
		           Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
                      }
                      else
                      {
                           Wheels[i].LatFriction = WheelLatFrictionScale[0] * Wheels[i].TireLoad;
		           Wheels[i].LatSlip = InterpCurveEval(Wheels[i].LatSlipFunc, Wheels[i].SlipAngle);
                      }

		      if(OutputHandbrake &amp;&amp; Wheels[i].bHandbrakeWheel)
		      {
			      Wheels[i].LatFriction *= Wheels[i].HandbrakeFrictionFactor;
			      Wheels[i].LatSlip *= Wheels[i].HandbrakeSlipFactor;
		      }

		      /////////// STEERING  ///////////

		      // Pass on steering to wheels that want it.
		      if(Wheels[i].SteerType == VST_Steered)
			      Wheels[i].Steer = ActualSteering;
		      else if(Wheels[i].SteerType == VST_Inverted)
			      Wheels[i].Steer = -ActualSteering;
		      else
			      Wheels[i].Steer = 0.0;
	         }
              }
              if(bClutching)
              {
              }
              else
              {
                   // EngineRPM is in radians per second, want in revolutions per minute
	           EngineRPM /= 4;
//	           EngineRPM /= 2.0 * PI; // revs per sec
//	           EngineRPM *= 60;
	           EngineRPM = Max(EngineRPM, 0.00); // ensure always positive!

	           RPM /= NumPoweredWheels;
//	           RPM /= 2.0 * PI; // revs per sec
//	           RPM *= 60;
	           RPM = Max(EngineRPM, 0.00); // ensure always positive!
              }

              if(!bClutching)
              {
	           // Update total wheel spin vel
	           TotalSpinVel = NewTotalSpinVel;
	      }

	      // Turn (yaw) damping.
	      carTM = CachedLocalToWorld;  // was  carTM = LocalToWorld()
	      //worldUp(carTM.M[2][0], carTM.M[2][1], carTM.M[2][2]);
	      //worldRight(carTM.M[1][0], carTM.M[1][1], carTM.M[1][2]);
	      //worldForward(carTM.M[0][0], carTM.M[0][1], carTM.M[0][2]);

            //  KGetRigidBodyState(rbState);
	    //  AngVel = KRBVecToVector(rbState.AngVel);
	      AngVel.X = rbState.AngVel.X;
              AngVel.Y = rbState.AngVel.Y;
              AngVel.Z = rbState.AngVel.Z;
	      TurnAngVel = AngVel dot worldUp;

	      DampingScale = 1.0 - MinAirControlDamping;
	      if(bAllowAirControl &amp;&amp; !bVehicleOnGround)
	      {
	  //            Log(&quot;bVehicleOnGround&quot;);
          //            Log(bVehicleOnGround);
		      TurnDampingMag = (1.0 - DampingScale*Abs(Steering)) * TurnDamping * TurnAngVel;
		      //KAddImpulse( WForce, -TurnDampingMag * worldUp );
		      Force += (WForce + (-1 * TurnDampingMag) * worldUp);
	      }

	      else
	      {
		      TurnDampingMag = (1.0 - Abs(ActualSteering)) * TurnDamping * TurnAngVel;
		      //KAddImpulse( WForce, -TurnDampingMag * worldUp );
		      Force += (WForce + (-1 + TurnDampingMag) * worldUp);
	      }

	      // If vehicle is in the air and we are allowing air control...
	      if(!bVehicleOnGround)
	      {
		      PitchAngVel = AngVel dot worldRight;
		      RollAngVel = AngVel dot worldForward;

		      if(bAllowAirControl)
		      {
			      AirControlTorque = worldRight * OutputPitch * -AirPitchTorque;

			      if(bIsWalking)
			      {
	//		              Log(&quot;bIsWalking&quot;);
	//		              Log(bIsWalking);
				      AirControlTorque += (worldForward * Steering * -AirRollTorque);
				      }
			      else
			      {
				      AirControlTorque += (worldUp * Steering * -AirTurnTorque);
			      }
                              //KAddImpulse( WForce, AirControlTorque );
			      Force += AirControlTorque;

			      // Damping forces
			      PitchDampingMag = (1.0 - DampingScale*Abs(OutputPitch)) * AirPitchDamping * PitchAngVel;
			      RollDampingMag = (1.0 - DampingScale*Abs(Steering)) * AirRollDamping * RollAngVel;

                              //KAddImpulse( WForce, (-PitchDampingMag * worldRight) + (-RollDampingMag * worldForward) );
			      Force += (WForce + ((-1 + PitchDampingMag) * worldRight) + ((-1 + RollDampingMag) * worldForward));
			      
			      UDForce = Force;
			      UDTorque = Torque;
		      }
		      else
		      {
			 PitchDampingMag = AirPitchDamping * PitchAngVel;
			 //KAddImpulse( WForce, -PitchDampingMag * worldRight );
			 Force += (WForce + (-1 + PitchDampingMag) * worldRight);
		      }
              }
              else
              {
                   UDForce = Force;
                   UDTorque = Torque;
              }
	}
}
&lt;/uscript&gt;
;Engine

&lt;uscript&gt;
function Engine()
{
     Gas = Gas2;
     RPM = InterpCurveEval(EngineS, Gas);
}
&lt;/uscript&gt;
;StoptheCar
*This function allows for slower, more real life like breaking

&lt;uscript&gt;
function StoptheCar()
{
   if(bBraking)
   {
      if(hBrake&lt;=21 &amp;&amp; hBrake&gt;=0)
      {
           hBrake += 0.5;
      }
      if(hBrake&gt;21)
             hBrake = 21;
   }
   if(!bBraking)
   {
           if(hBrake&lt;=21 &amp;&amp; hBrake&gt;=0)
           {
                hBrake -= 0.5;
           }
           if(hBrake&lt;0)
                hBrake = 0;
   }
}
&lt;/uscript&gt;
;TorqueConverter
*This function should prolly have a different name, I named it this thinking I would need to accually have a torque converter for the tranny but I turned out making it a function that eases into gear and fixes the rpm to equal that of the engine rpm when the clutch is pressed.

&lt;uscript&gt;
function TorqueConverter()
{
    local  float    rpmDifference;
    local  float    myRPM;
    rpmDifference = 0.0;
    myRPM = WheelRPM;
    myRPM *= 6.28; // convert to radians per sec
    myRPM /= 60;
         if(EngineRPM == myRPM)
              bInGear = True;
         else if(EngineRPM &gt; myRPM)
         {
              if(myRPM &lt; 0)
                    rpmDifference = EngineRPM - (2 * Abs(myRPM));

              else if(myRPM &gt;= 0)
                    rpmDifference = EngineRPM - myRPM;
              if(rpmDifference &lt;= 200.0)
              {
                   bInGear = True;
              }
              else if(rpmDifference &gt; 200.0)
              {
                   bInGear = False;
                   rpmDifference = rpmDifference * 0.2;
                   EngineRPM -= rpmDifference;
                   bRadians = True;
              }
         }
         else if(EngineRPM &lt; myRPM)
         {
              rpmDifference = myRPM - EngineRPM;
              if(rpmDifference &lt;= 200.0)
              {
                   bInGear = True;
              }
              else if(rpmDifference &gt; 200.0)
              {
                   bInGear = False;
                   rpmDifference = rpmDifference * 0.2;
                   EngineRPM -= rpmDifference;
                   bRadians = True;
              }
         }
}
&lt;/uscript&gt;

;KApplyForce

&lt;uscript&gt;
function KApplyForce(out vector Force, out vector Torque)
{
    Super.KApplyForce(Force, Torque);
    Force += UDForce;
    Torque += UDTorque;
    if (bBoosting == true &amp;&amp; bVehicleOnGround == true)
        Force += vector(Rotation) * SpeedBoost;
}
&lt;/uscript&gt;

;KImpact

&lt;uscript&gt;
event KImpact(Actor Other, vector Pos, vector ImpactVel, vector ImpactNorm)
{
    if (Role == ROLE_Authority)
    {

        ImpactInfo.Other = Other;
        ImpactInfo.Pos = Pos;
        ImpactInfo.ImpactVel = ImpactVel;
        ImpactInfo.ImpactNorm = ImpactNorm;
        ImpactInfo.ImpactAccel = KParams.KAcceleration;
        ImpactTicksLeft = ImpactDamageTicks;
    }
}
&lt;/uscript&gt;

;DrivingStatusChanged

&lt;uscript&gt;
event DrivingStatusChanged()
{
	local int i;
	Super.DrivingStatusChanged();
    if (bDriving &amp;&amp; Level.NetMode != NM_DedicatedServer &amp;&amp; !bDropDetail)
	{
        Dust.length = Wheels.length;
        for(i=0; i&lt;Wheels.Length; i++)
            if (Dust[i] == None)
            {
        		// Create wheel dust emitters.
        		WheelCoords = GetBoneCoords(Wheels[i].BoneName);
        		Dust[i] = spawn(class'ONSDirtSlipEffect', self,, WheelCoords.Origin + ((vect(0,0,-1) * Wheels[i].WheelRadius) &gt;&gt; Rotation));
        		Dust[i].SetBase(self);
			    Dust[i].SetDirtColor( Level.DustColor );
        	}
		if(bMakeBrakeLights)
		{
			for(i=0; i&lt;2; i++)
    			if (BrakeLight[i] == None)
    			{
    				BrakeLight[i] = spawn(class'ONSBrakelightCorona', self,, Location + (BrakeLightOffset[i] &gt;&gt; Rotation) );
    				BrakeLight[i].SetBase(self);
    				BrakeLight[i].SetRelativeRotation( rot(0,32768,0) ); // Point lights backwards.
    				BrakeLight[i].Skins[0] = BrakeLightMaterial;
    			}
		}
	}
    else
    {
        if (Level.NetMode != NM_DedicatedServer)
    	{
            for(i=0; i&lt;Dust.Length; i++)
                Dust[i].Destroy();

            Dust.Length = 0;

            if(bMakeBrakeLights)
            {
            	for(i=0; i&lt;2; i++)
                    if (BrakeLight[i] != None)
                        BrakeLight[i].Destroy();
            }
        }
        TurnDamping = 0.0;
    }
}
&lt;/uscript&gt;

;KDriverEnter

&lt;uscript&gt;
function KDriverEnter(Pawn P)
{
        Super.KDriverEnter(P);
}
&lt;/uscript&gt;

;ClientKDriverLeave

&lt;uscript&gt;
simulated function ClientKDriverLeave(PlayerController PC)
{
	Super.ClientKDriverLeave(PC);

	bWeaponIsAltFiring = false;
	PC.EndZoom();
}

&lt;/uscript&gt;

;SpecialCalcFirstPersonView

&lt;uscript&gt;
simulated function SpecialCalcFirstPersonView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation )
{
	ViewActor = self;
	CameraLocation = Location + (FPCamPos &gt;&gt; Rotation);
}
&lt;/uscript&gt;

;Fire

&lt;uscript&gt;
function Fire(optional float F)
{
       VehicleFire(False);
}
&lt;/uscript&gt;

;AltFire

&lt;uscript&gt;
function AltFire(optional float F)
{

        VehicleFire(true);
}
&lt;/uscript&gt;

;VehicleFire

&lt;uscript&gt;
function VehicleFire(bool bWasAltFire)
{
         if(!bWasAltFire)
         {
                 bGearUp = 1;
                 ChangeGear(bGearUp);
         }

         else if(bWasAltFire)
         {
                 bGearDown = -1;
                 ChangeGear(bGearDown);
         }
}
&lt;/uscript&gt;

;VehicleCeaseFire

&lt;uscript&gt;
function VehicleCeaseFire(bool bWasAltFire)
{
         if(!bWasAltFire)
         {
                 bGearUp = 0;
                 ChangeGear(bGearUp);
         }
         else if(bWasAltFire)
         {
                 bGearDown = 0;
                 ChangeGear(bGearDown);
         }
    Super.VehicleCeaseFire(bWasAltFire);
}
&lt;/uscript&gt;

;ClientVehicleCeaseFire

&lt;uscript&gt;
simulated function ClientVehicleCeaseFire(bool bWasAltFire)
{
    Super.ClientVehicleCeaseFire(bWasAltFire);
}
&lt;/uscript&gt;

;Tick

&lt;uscript&gt;
function Tick(float DT)
{
    local int               i, x;
    local bool              lostTraction;
    local KarmaParams       KP;
    local KRigidBodyState   BodyState;

    TheDeltaTime = DT;
    Super.Tick(DT);

    VRate = VSize(Velocity);
    KP = KarmaParams(KParams);
    KGetRigidBodyState(BodyState);

    SteerBoneAxis = AXIS_Z;
    KWake();
    if(Role == ROLE_Authority)
    {
        if(bDriving)
	{
	    // Update ForwardVel, CarMPH and bIsInverted on both server and client.
            GetAxes(Rotation, worldForward, worldRight, worldUp);

  	    ForwardVel = Velocity dot worldForward;
	    CarMPH = Abs((ForwardVel * 3600.0) / 140800.0); // Convert from units per sec to miles per hour.

	    bIsInverted = worldUp.Z &lt; 0.2;

	    // Update engine sound pitch
	    EnginePitch = 255.0 * ((EngineRPM+IdleRPM)/EngineRPMSoundRange);
	    EnginePitch = Clamp(EnginePitch, 0.0, 255.0);
	    SoundPitch = EnginePitch;

            SteerBoneAngle = (ActualSteering/InterpCurveEval(MaxSteerAngleCurve, VRate)) * SteerBoneMaxAngle * (65535.0/360.0);

            one.X = 0;
            one.Y = 0;
            one.Z = SteerBoneAngle;

            two.X = SteerBoneAngle;
            two.Y = 0;
            two.Z = 0;

            three.X = 0;
            three.Y = SteerBoneAngle;
            three.Z = 0;


            if(SteerBoneAxis == AXIS_X)
                 //SteerRot = Rotator(0, 0, SteerBoneAngle);
                 SteerRot = Rotator(one);

            else if(SteerBoneAxis == AXIS_Y)
                 //SteerRot = Rotator(SteerBoneAngle, 0, 0);
                 SteerRot = Rotator(two);

            else
                 //SteerRot = Rotator(0, SteerBoneAngle, 0);
                 SteerRot = Rotator(three);

            SetBoneDirection(SteerBoneName, SteerRot, WForce, 1, 0);
        }
    }
    	// Update any stunt variables.
	if(bDoStuntInfo)
	{
		ForwardsInOldPlane = Coords.XAxis - (Coords.XAxis dot OldCoords.ZAxis) * OldCoords.ZAxis;
		//ForwardsInOldPlane = SafeNormal(ForwardsInOldPlane);
		DeltaHeading = Acos( Clamp( ForwardsInOldPlane dot OldCoords.XAxis, -1.0, 1.0 ) );
		if( (ForwardsInOldPlane dot OldCoords.YAxis) &lt; 0.0)
			DeltaHeading *= -1.0;
		DeltaPitch = Asin( Clamp(Coords.XAxis dot OldCoords.ZAxis, -1.0f, 1.0) );
		DeltaRoll = Asin( Clamp(Coords.YAxis dot OldCoords.ZAxis, -1.0f, 1.0) );
		//debugf( TEXT(&quot;DR:%f DP:%f&quot;), DeltaRoll, DeltaPitch );

		bCurrentOnGround = (bVehicleOnGround || KP.bContactingLevel);
		DaredevilPoints = 0;

		if(bCurrentOnGround)
		{
			if(!bOldVehicleOnGround)
			{
				// We just landed - see if we should display Daredevil 'message'
				InAirTime = Level.TimeSeconds - LastOnGroundTime;

                                Dist1 = Location;
                                Dist2 = LastOnGroundLocation;
                                Vect  = Dist1 - Dist2;
                                Dist3 = Vect.X * Vect.X - Vect.Y * Vect.Y;
                                Dist3 = Sqrt(Dist3);

				DaredevilPoints += Max( Ceil( Abs(InAirSpin)/(0.5*DaredevilThreshInAirSpin) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( Abs(InAirPitch)/(0.5*DaredevilThreshInAirPitch) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( Abs(InAirRoll)/(0.5*DaredevilThreshInAirRoll) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( InAirTime/(0.5*DaredevilThreshInAirTime) ) - 1, 0 );
				DaredevilPoints += Max( Ceil( InAirDistance/(0.5f*DaredevilThreshInAirDistance) ) - 1, 0 );
				DaredevilPoints *= 10;

				// A wheel must be touching the ground on landing to get a daredevil
				if( bVehicleOnGround &amp;&amp; DaredevilPoints &gt; 0 )
				{
					OnDaredevil();
				}
			}


			LastOnGroundLocation = Location;
			LastOnGroundTime = Level.TimeSeconds;
			InAirSpin = 0.0;
			InAirPitch = 0.0;
			InAirRoll = 0.0;
		}
		else
		{
			InAirSpin += (180.0/PI) * DeltaHeading;
			InAirPitch += (180.0/PI) * DeltaPitch;
			InAirRoll += (180.0/PI) * DeltaRoll;
		}

		OldRotation = Rotation;
		bOldVehicleOnGround = bCurrentOnGround;
	}

	if(!bDriving)
	{
		bOldVehicleOnGround = true; // If no-one is in the vehicle, dont consider it for daredevil status.
	}

	if(bAllowChargingJump)
	{
		// Check if all wheels are on the ground.
		if(bAllWheelsOnGround == true)
		{
		     for(x = 0; x&lt;Wheels.Length; x++)
		     {
			 if (Wheels[x].bWheelOnGround != false)
				bAllWheelsOnGround = false;
		     }
		}
		else
		{
		     // If any wheels are off the ground - we can just reset everything.
		     if(!bVehicleOnGround)
		     {
		          JumpForce = 0.0;
		          JumpSpin = 0.0;
//                          bPushDown = false;
		     }

		}
	}
      //Engine(Throttle);
     // If on the server - we work out OutputGas, OutputBrake etc, and pack them to be sent to the client.
     if(!bClutching)
           Gas2 = InterpCurveEval(RPMtoGas, EngineRPM);
     ProcessCarInput();
     PackState();
}
&lt;/uscript&gt;

;ProcessCarInput

&lt;uscript&gt;
function ProcessCarInput()
{
        local bool     bReverse;

	bReverse = false;
	if(Driver == none)
	{
		OutputBrake = 1.0;
		OutputGas = 0.0;
	}
	else
	{
		if(Throttle &gt;= 0) // pressing forwards
		{
                        OutputGas = Abs(Throttle);
                        OutputBrake = 0.0;
                        if(bClutching)
                        {
                             if(Throttle == 0)
                             {
                                  if(Gas2&lt;=21 &amp;&amp; Gas2&gt;=0)
                                  {
                                        Gas2 -= 0.5;
                                  }
                                  if(Gas2&lt;0)
                                        Gas2 = 0;
                             }
                             else
                             {
                                  if(Gas2&lt;=21 &amp;&amp; Gas2&gt;=0)
                                  {
                                         Gas2 += 0.5;
                                  }
                                  if(Gas2&gt;21)
                                         Gas2 = 21;
                             }
                             if(Gas2 &gt;=21)
                                  Gas2 = 21;
                         }
                         if(!bClutching)

                 }

       StoptheCar();
       OutputBrake = Abs(InterpCurveEval(BrakeCurve, hBrake));

	OutputPitch = Rise;
	}
	Engine();
	KWake();
}
&lt;/uscript&gt;

;Clutch

&lt;uscript&gt;
exec function Clutch(bool bEnabled)
{
       if(!bEnabled)
       {
           bClutching = False;
           bInGear = False;
       }

       else if(bEnabled)
       {
           bClutching = True;

           RPM = EngineRPM;
       }
}
&lt;/uscript&gt;

;Brake

&lt;uscript&gt;
exec function Brake(bool bEnabled)
{
      if(bEnabled)
      {
           bBraking = True;
           OutputHandbrake = true;
      }
      if(!bEnabled)
      {
           bBraking = false;
           OutputHandbrake = false;
      }
}
&lt;/uscript&gt;

;ChangeGear

&lt;uscript&gt;
function ChangeGear(int GearChoice)
{
      if(bClutching){
        if(Gear &gt;= 1 &amp;&amp; Gear &lt;= 7)
        {
             if(GearChoice == 1)
             {
                  Gear++;
                  bGearUp = 0;
             }
             else if(GearChoice == -1)
             {
                  Gear--;
                  bGearDown = 0;
             }
             else if(GearChoice == 0)
             {

             }
        }
        else if(Gear == 0 &amp;&amp; GearChoice == 1)
        {
              Gear++;
              bGearUp = 0;
        }
        else if(Gear == 8 &amp;&amp; GearChoice == -1)
        {
              Gear--;
              bGearDown = 0;
        }
        else
        {
             bGearUp = 0;
             bGearDown = 0;
        }
      }
}
&lt;/uscript&gt;

;PackState

&lt;uscript&gt;
function PackState()
{
	local KRigidBodyState   RBState;
	local rotator           ViewRot;
	if(!KIsAwake())
		return;
	KGetRigidBodyState(RBState);
        CActiveWeapon=SActiveWeapon;
	CarState.ChassisPosition.X = RBState.Position.X;
	CarState.ChassisPosition.Y = RBState.Position.Y;
	CarState.ChassisPosition.Z = RBState.Position.Z;
	CarState.ChassisQuaternion = RBState.Quaternion;
	CarState.ChassisLinVel.X = 10.0 * RBState.LinVel.X;
	CarState.ChassisLinVel.Y = 10.0 * RBState.LinVel.Y;
	CarState.ChassisLinVel.Z = 10.0 * RBState.LinVel.Z;
	CarState.ChassisAngVel.X = 1000.0 * RBState.AngVel.X;
	CarState.ChassisAngVel.Y = 1000.0 * RBState.AngVel.Y;
	CarState.ChassisAngVel.Z = 1000.0 * RBState.AngVel.Z;
        CarState.ServerHandbrake = FloatToRangeByte(OutputPitch);
	CarState.ServerBrake = FloatToRangeByte(OutputBrake);
	CarState.ServerGas = FloatToRangeByte(OutputGas);
	CarState.ServerGear = Gear;
	CarState.ServerSteering = FloatToRangeByte(Steering);
	if(Controller != None)
	{
		if(IsHumanControlled())
		{
			DriverViewPitch = Controller.Rotation.Pitch;
			DriverViewYaw = Controller.Rotation.Yaw;
		}
		else
		{
			ViewRot = rotator(Controller.FocalPoint - Location);
			DriverViewPitch = ViewRot.Pitch;
			DriverViewYaw = ViewRot.Yaw;
		}
	}
	else
	{
		DriverViewPitch = Rotation.Pitch;
		DriverViewYaw = Rotation.Yaw;
	}
	CarState.ServerViewPitch = DriverViewPitch;
	CarState.ServerViewYaw = DriverViewYaw;
	FudgeByte++;
}
&lt;/uscript&gt;

;Motion Blur (still in the works)

&lt;uscript&gt;
function addblur()
{
      local PlayerController PC;
      
      PC = PlayerController(Controller);
      
      PC.AddCameraEffect(new myBlur);
}
&lt;/uscript&gt;

;LimitPitch

&lt;uscript&gt;
function int LimitPitch(int pitch)
{
	if (bAllowAirControl &amp;&amp; !bVehicleOnGround)
		return pitch;
	return Super.LimitPitch(pitch);
}
&lt;/uscript&gt;

;Destroyed

&lt;uscript&gt;
simulated function Destroyed()
{
    if (LeftTrail != None)
        LeftTrail.Destroy();

    if (RightTrail != None)
        RightTrail.Destroy();

    Super.Destroyed();
}
&lt;/uscript&gt;

;TakeImpactDamage

&lt;uscript&gt;
event TakeImpactDamage(float AccelMag)
{
    local int Damage;
        Damage = int(VSize(ImpactInfo.Other.Velocity) * 20 * ImpactDamageModifier());
    if (Vehicle(ImpactInfo.Other) != None)
        TakeDamage(Damage, Vehicle(ImpactInfo.Other), ImpactInfo.Pos, vect(0,0,0), class'DamType');
    else
        TakeDamage(int(AccelMag * ImpactDamageModifier())/ WallCollisionResistance , Self, ImpactInfo.Pos, vect(0,0,0), class'DamType');

    //FIXME - scale sound volume to damage amount
    if (ImpactDamageSounds.Length &gt; 0)        PlaySound(ImpactDamageSounds[Rand(ImpactDamageSounds.Length-1)],,TransientSoundVolume*2.5);
    if (Health &lt; 0 &amp;&amp; (Level.TimeSeconds - LastImpactExplosionTime) &gt; TimeBetweenImpactExplosions)
    {
        VehicleExplosion(Normal(ImpactInfo.ImpactNorm), 0.5);
        LastImpactExplosionTime = Level.TimeSeconds;
    }
}
&lt;/uscript&gt;

;Died

&lt;uscript&gt;
function Died(Controller Killer, class&lt;DamageType&gt; damageType, vector HitLocation)
{
    if (damageType == none)
       return;
    if (Killer != None)        PlayerController(Killer).ReceiveLocalizedMessage(class'VehicleKillMessage', 7);
    Super.Died(Killer, damageType, HitLocation);
}
&lt;/uscript&gt;

;FloatToRangeByte

&lt;uscript&gt;
simulated function byte FloatToRangeByte(float f)
{
	f= FClamp(f, 0, 1);
	f = Round(f * 255);
	return byte(f);
}
&lt;/uscript&gt;

;RangeByteToFloat

&lt;uscript&gt;
//The opposite of the above function.
simulated function float RangeByteToFloat(byte b)
{
	local float f;
	f = b;
	f /= 255;
	return f;
}
&lt;/uscript&gt;

====Defaults ====

&lt;uscript&gt;
defaultproperties
{
     myBlur=Class'WhatEverPackage.myMotionBlur'

     NumForwardGears=7

     DustSlipRate=2.800000
     DustSlipThresh=50.000000
     DaredevilThreshInAirSpin=100.000000
     DaredevilThreshInAirPitch=300.000000
     DaredevilThreshInAirRoll=300.000000
     DaredevilThreshInAirTime=1.500000
     DaredevilThreshInAirDistance=17.000000
     DaredevilMessageClass=Class'Onslaught.ONSDaredevilMessage'
     bOldVehicleOnGround=True
     MaxJumpSpin=30000.000000
     JumpChargeTime=1.000000
     JumpFeedbackForce=&quot;HoverBikeJump&quot;
     JumpSound=Sound'ONSVehicleSounds-S.Hydraulics.Hydraulic10'
     JumpMeterOriginX=0.275000
     JumpMeterOriginY=0.943000
     JumpMeterWidth=0.136000
     JumpMeterHeight=0.057000
     JumpMeterSpacing=0.010000
     JumpMeterColor=(R=215,A=255)
     SpinMeterColor=(B=215,G=100,A=255)
     JumpMeterTexture=Texture'Engine.WhiteTexture'
     MinAirControlDamping=0.100000
     bBrakeFrontWheelsOnly=False
     ChangeUpPoint=2800
     StopThreshold=0.2
     CrosshairHitFeedbackTex=Texture'ONSInterface-TX.tankBarrelAligned'
     DefaultCrosshair=Material'InterfaceContent.Hud.fbBombFocus'
     CrosshairScale=0.125
     bTeamLocked=false
     bGearUp=True
     bInGear=True
     bEjectPassengersWhenFlipped=False
     bCanFlip=true
     DisintegrationHealth=0.0
     bShowChargingBar = false;
     // Damages
     WallCollisionResistance = 5 // Collision resistance: the bigger it is, the less damage taken
     ExplosionDamage=0.0
     DriverDamageMult=0
     CenterSpringRangePitch=5000
     CenterSpringRangeRoll=5000
     StolenAnnouncement=&quot;Play&quot;

     bNetNotify=true
}
&lt;/uscript&gt;
*Global variables that would need to be added to the above uscript:

&lt;uscript&gt;
enum ETextAnchor
{
    TA_Left,
    TA_Right,
    TA_Middle
};
var   float                         ScaleX, ScaleY;
&lt;/uscript&gt;

'''CIpen:'''  Here is some simple code you can add to print data on the screen to avoid logging 24/7.  This is what I used to check numbers such as RPM, Gas, EngineRPM, and whatever else I could fit on 1024x768 resolution.  I've found it to be most handy.  I'm sure you can find this elsewhere but I'm saving you the effort of looking.

*And here is the DrawHUD function that we must have to draw on the screen when a player has possesion of the vehicle:

&lt;uscript&gt;
simulated function DrawHUD(Canvas C)
{
    local PlayerController PC;

    PC = PlayerController(Controller);

    ScaleX = C.ClipX/1024;
    ScaleY = C.ClipY/768;

    C.Style = ERenderStyle.STY_Additive;
    C.Font = PC.MyHUD.GetFontSizeIndex(C, -2);
    C.DrawColor = C.MakeColor(255,255,255);

    DrawEngineStuff(C);
}
&lt;/uscript&gt;

*Here is the DrawEngineStuff(C) which is isn't a required function but is there to organize:

&lt;uscript&gt;
simulated function DrawEngineStuff(Canvas C)
{
    C.Font = C.TinyFont;

    C.SetPos(40*ScaleX, 150*ScaleY);
    C.DrawText(&quot;Engine stuff&quot;);

    C.SetPos(40*ScaleX, 160*ScaleY);
    C.DrawText(&quot;Engine RPM: &quot; @ EngineRPM);
}
&lt;/uscript&gt;

40*ScaleX sets the vertical starting position, and 150*ScaleY sets the horizontal starting position.

====Notes ====

If you are to subclass, you need to know that the engine rpm is in radians per min.  This means that if you were to create a torque curve and wanted the rpm range to be from 500 to 7000, you would need to convert all the points from revolutions per min to radians per sec.  Take the rpm(real life engine rpm) of 7000, divide by 60, then multiply by 2 PI.  Like so:

(7000/60)*6.2831853

this yields 733.038285 as the correct rpm

bNetNotify=true is prolly the most critical thing needed for this class to work online/lan

I've got a lot of changes that need to be made to this class, so be patient.  Additions include, properly calculating wheel torque if the wheel is powered or not, better collisions with walls(currently if you hit a wall flat at 300 mph the vehicle just stops and takes no damage), available auto transmision, ...

==Related Topics==
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Main topics for Vehicles.
* [[Legacy:Vehicle|Vehicle]] &amp;ndash; Parent class for all vehicles and turrets.
** [[Legacy:SVehicle|SVehicle]]
*** [[Legacy:ONSVehicle|ONSVehicle]]
**** [[Legacy:ONSWheeledCraft|ONSWheeledCraft]]
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''Graphik:''' Very nice idea, but a bit unsuited for an FPS, more for a racing game like UnWheel. It seems to me that Epic made sure that the vehicles were as &quot;dumbed down&quot; as possible to keep the focus on fragging people with a vehicle rather than the minutia of driving one. I recommend sending this in to [http://unwheel.beyondunreal.com/ UnWheel] when you're done. If they don't actually use it I'm sure they'd at the very least find it interesting.

'''CIpen:''' Accually I got a thumbs up on that at the same time I created this page.  The bounds of this script is almost limitless, as it would be easy to have say the tire blow out when shot.  As soon as I get a free day I'll update this page with all the new additions (infact that might be something good to do tonight).  The big change is that I added the option for auto or stick control and the the power is ditributed over the wheels that are powered.

'''Foxpaw:''' Why do you divide by 60 when converting rotations per minute to radians per minute? The radians per minute should be greater than the roatations per minute, as there's more than one radian per rotation. Or is that supposed to say, radians per second?

'''CIpen:''' Yes, you pointed out a typo :D.  Yes, it should say radians per second.  Yet your own message has typos, it's not rotations per minute, but revolutions per minute. :)

'''Foxpaw:''' Err, ehm, well, I guess that depends on where you measure it from. I'd measure it from the flywheel which definately rotates. I suppose some parts of the crankshaft do revolve though, so either could be correct.

----

'''Zxanphorian:''' WOW, that is a lot of scriptage there! I have an idea, to make it randomly stall :B

----

'''CIpen:'''  Ya, there are a lot of cool possibilities with this class.  You could attach a model to the wheel bone, add another bone for disk brakes (to attach a disk brake mesh to that turns when the wheels turn), make the engine blow up if you downgear and the engine rpm goes to high, have an axle break, have more wheel slip functions for different traction of different surfaces...     any number of things....

'''OlympusMons:''' I would have to agree CIpen. Has anyone given any thought to making a proper automatic car you know the manual automatic ones. :S Like what mafia did. I havent really had time to look through all this code although I'd like to, I was just wondering if all of this is actually needed to make a manual shift car or if there are other features which have been added through all of this script. Actually another cool thing to do would be to make a proper 4wd manual shift. Hmm!

'''CIpen:'''  Good! Lets get to the meat!  The first thing you need to know is that the function UpdateVehicle() is somehow tied to native code.  To see this all you need to do is log the DeltaTime from inside the Tick() function and from inside UpdateVehicle() function.  You should see that UpdateVehicle() always has the same DeltaTime so matter what your FPS is (at least this is what I remember it being when I tested it).

The next serious thing is that, unless you do your own wheel calculations, you'll have to build around the SVehicleWheel variables that are calculated each frame.  It's both good and bad I guess.  Take a minute to thing about this:  below is the line that calculates the GripTorque.

&lt;uscript&gt;
GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

&lt;/uscript&gt;

Now, lets say we want to be the biggest uscript hot shot around, you might change this line to look like this:

&lt;uscript&gt;

if(bPlayerIsOnHood)
     GripTorque = FTScale * Wheels[i].WheelRadius * (Wheels[i].TireLoad + PlayerMass) * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));
else
     GripTorque = FTScale * Wheels[i].WheelRadius * Wheels[i].TireLoad * WheelLongFrictionScale[0] * InterpCurveEval(Wheels[i].LongFrictionFunc, Abs(Wheels[i].SlipVel));

&lt;/uscript&gt;

Thus simulating player weight on the car(more or less).  That is after you do some stuff to get if the player is on the vehicle or not.

btw I just updated it UpdateVehicle() because it was far behind.

'''Tarquin:''' I moved this back to its original name, as the class name didn't seem very descriptive.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Manual Shift Car/CPlusPlus Version</title>
    <id>2193</id>
    <revision>
      <id>5319</id>
      <timestamp>2004-10-01T22:10:49Z</timestamp>
      <contributor>
        <ip>CIpen</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====UpdateVehicle ====

*This is so you can see what I started with in hopes you can derive something better someday :)

&lt;uscript&gt;
void AONSWheeledCraft::UpdateVehicle(FLOAT DeltaTime)
{
	guard(AONSWheeledCraft::UpdateVehicle);

	/////////// STEERING ///////////

	FLOAT maxSteerAngle = MaxSteerAngleCurve.Eval(Velocity.Size());

#if 0
	FLOAT maxSteer = DeltaTime * SteerSpeed * maxSteerAngle;
#else
	FLOAT maxSteer = DeltaTime * SteerSpeed;
#endif

	FLOAT deltaSteer;
	
	// When using Jumping Vehicle mutator and holding down to jump, always steer straight.
	if(!bPushDown)
		deltaSteer = (-Steering * maxSteerAngle) - ActualSteering; // Amount we want to move (target - current)
	else
		deltaSteer = -ActualSteering; 

	deltaSteer = Clamp&lt;FLOAT&gt;(deltaSteer, -maxSteer, maxSteer);
	ActualSteering += deltaSteer;

	/////////// ENGINE ///////////

	// Calculate torque at output of engine. Combination of throttle, current RPM and engine braaking.
	FLOAT EngineTorque = OutputGas * TorqueCurve.Eval( EngineRPM );
	FLOAT EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);

	EngineTorque -= EngineBraking;

	DebugInfo = FString::Printf(TEXT(&quot;OutputBrake: %f	EngineRPM: %f    EngineTorque: %f&quot;), OutputBrake, EngineRPM, EngineTorque);

	// Total gear ratio between engine and differential (ie before being split between wheels).
	// A higher gear ratio and the torque at the wheels is reduced.
	FLOAT EngineWheelRatio = GearRatios[Gear] * TransRatio;

	// Reset engine RPM. We calculate this by adding the component of each wheel spinning.
	FLOAT NewTotalSpinVel=0.0f;
	EngineRPM = 0.0f;

	// Do model for each wheel.
	for(INT i=0; i&lt;Wheels.Num(); i++)
	{
		USVehicleWheel* vw = Wheels(i);

		/////////// DRIVE ///////////

		// Heuristic to divide torque up so that the wheels that are spinning slower get more of it.
		// Sum of LSDFactor across all wheels should be 1.
		// JTODO: Do we need to handle the case of vehicles with different size wheels?
		FLOAT LSDSplit, EvenSplit, UseSplit;

		EvenSplit = 1/NumPoweredWheels;

		// If no wheels are spinning, just do an even split.
		if(TotalSpinVel &gt; 0.1f)
			LSDSplit = (TotalSpinVel - vw-&gt;SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		else
			LSDSplit = EvenSplit;

		UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);

		// Calculate Drive Torque : applied at wheels (ie after gearbox and differential)
		// This is an 'open differential' ie. equal torque to each wheel
		FLOAT DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);

		/////////// LONGITUDINAL ///////////

		// Calculate Grip Torque : longitudinal force against ground * distance of action (radius of tyre)
		// LongFrictionFunc is assumed to be reflected for negative Slip Ratio
		FLOAT GripTorque = FTScale * vw-&gt;WheelRadius * vw-&gt;TireLoad * WheelLongFrictionScale * vw-&gt;LongFrictionFunc.Eval( Abs(vw-&gt;SlipVel) );
		if(vw-&gt;SlipVel &lt; 0.0f)
			GripTorque *= -1.0f;

		// GripTorque can't be more than the torque needed to invert slip ratio.
		FLOAT TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + vw-&gt;WheelInertia;
		//FLOAT SlipAngVel = vw-&gt;SlipVel/vw-&gt;WheelRadius;

		// Brake torque acts to stop wheels (ie against direction of motion)
		FLOAT BrakeTorque = 0.0f;

		if(vw-&gt;SpinVel &gt; 0.0f)
			BrakeTorque = -OutputBrake * MaxBrakeTorque;
		else
			BrakeTorque = OutputBrake * MaxBrakeTorque;

		FLOAT LimitBrakeTorque = ( Abs(vw-&gt;SpinVel) * TransInertia ) / DeltaTime; // Size of torque needed to completely stop wheel spinning.
		BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!

		// Resultant torque at wheel : torque applied from engine + brakes + equal-and-opposite from tire-road interaction.
		FLOAT WheelTorque = DriveTorque + BrakeTorque - GripTorque;
	
		// Resultant linear force applied to car. (GripTorque applied at road)
		FLOAT VehicleForce = GripTorque / (FTScale * vw-&gt;WheelRadius);

		// If the wheel torque is opposing the direction of spin (ie braking) we use friction to apply it.
		if( OutputBrake &gt; 0.0f ||  (DriveTorque + BrakeTorque) * vw-&gt;SpinVel &lt; 0.0f)
		{
			vw-&gt;DriveForce = 0.0f;
			vw-&gt;LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		}
		else
		{
			vw-&gt;DriveForce = VehicleForce;
			vw-&gt;LongFriction = 0.0f;
		}

		// Calculate torque applied back to chassis if wheel is on the ground
		if (vw-&gt;bWheelOnGround)
			vw-&gt;ChassisTorque = -1.0f * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		else
			vw-&gt;ChassisTorque = 0.0f;

		// Calculate new wheel speed. 
		// The lower the gear ratio, the harder it is to accelerate the engine.
		FLOAT TransAcc = WheelTorque / TransInertia;
		vw-&gt;SpinVel += TransAcc * DeltaTime;

		// Make sure the wheel can't spin in the wrong direction for the current gear.
		if(Gear == 0 &amp;&amp; vw-&gt;SpinVel &gt; 0.0f)
			vw-&gt;SpinVel = 0.0f;
		else if(Gear &gt; 0 &amp;&amp; vw-&gt;SpinVel &lt; 0.0f)
			vw-&gt;SpinVel = 0.0f;

		// Accumulate wheel spin speeds to find engine RPM. 
		// The lower the gear ratio, the faster the engine spins for a given wheel speed.
		NewTotalSpinVel += vw-&gt;SpinVel;
		EngineRPM += vw-&gt;SpinVel / EngineWheelRatio;

		/////////// LATERAL ///////////

		vw-&gt;LatFriction = WheelLatFrictionScale * vw-&gt;TireLoad;
		vw-&gt;LatSlip = vw-&gt;LatSlipFunc.Eval(vw-&gt;SlipAngle);

		if(OutputHandbrake &amp;&amp; vw-&gt;bHandbrakeWheel)
		{
			vw-&gt;LatFriction *= vw-&gt;HandbrakeFrictionFactor;
			vw-&gt;LatSlip *= vw-&gt;HandbrakeSlipFactor;
		}

		/////////// STEERING  ///////////

		// Pass on steering to wheels that want it.
		if(vw-&gt;SteerType == VST_Steered)
			vw-&gt;Steer = ActualSteering;
		else if(vw-&gt;SteerType == VST_Inverted)
			vw-&gt;Steer = -ActualSteering;
		else
			vw-&gt;Steer = 0.0f;
	}

	// EngineRPM is in radians per second, want in revolutions per minute
	EngineRPM /= NumPoweredWheels;
	EngineRPM /= 2.0f * (FLOAT)PI; // revs per sec
	EngineRPM *= 60;
	EngineRPM = Max( EngineRPM, 0.01f ); // ensure always positive!

	// Update total wheel spin vel
	TotalSpinVel = NewTotalSpinVel;

	// Turn (yaw) damping.
	FMatrix carTM = LocalToWorld();
	FVector worldUp(carTM.M[2][0], carTM.M[2][1], carTM.M[2][2]);
	FVector worldRight(carTM.M[1][0], carTM.M[1][1], carTM.M[1][2]);
	FVector worldForward(carTM.M[0][0], carTM.M[0][1], carTM.M[0][2]);

	FKRigidBodyState rbState;
	KGetRigidBodyState(&amp;rbState);
	FVector AngVel(rbState.AngVel.X, rbState.AngVel.Y, rbState.AngVel.Z);
	FLOAT TurnAngVel = AngVel | worldUp;

	FLOAT DampingScale = 1.0f - MinAirControlDamping;

	if(bAllowAirControl &amp;&amp; !bVehicleOnGround)
	{
		FLOAT TurnDampingMag = (1.0f - DampingScale*Abs(Steering)) * TurnDamping * TurnAngVel;
		KAddForces( FVector(0,0,0), -TurnDampingMag * worldUp );
	}
	else
	{
		FLOAT TurnDampingMag = (1.0f - Abs(Steering)) * TurnDamping * TurnAngVel;
		KAddForces( FVector(0,0,0), -TurnDampingMag * worldUp );
	}

	// If vehicle is in the air and we are allowing air control...
	if(!bVehicleOnGround)
	{
		FLOAT PitchAngVel = AngVel | worldRight;
		FLOAT RollAngVel = AngVel | worldForward;

		if(bAllowAirControl)
		{
			FVector AirControlTorque = worldRight * OutputPitch * -AirPitchTorque;

			if(bIsWalking)
				AirControlTorque += (worldForward * Steering * -AirRollTorque);
			else
				AirControlTorque += (worldUp * Steering * -AirTurnTorque);

			KAddForces( FVector(0,0,0), AirControlTorque );

			// Damping forces
			FLOAT PitchDampingMag = (1.0f - DampingScale*Abs(OutputPitch)) * AirPitchDamping * PitchAngVel;
			FLOAT RollDampingMag = (1.0f - DampingScale*Abs(Steering)) * AirRollDamping * RollAngVel;

			KAddForces( FVector(0,0,0), (-PitchDampingMag * worldRight) + (-RollDampingMag * worldForward) );
		}
		else
		{
			FLOAT PitchDampingMag = AirPitchDamping * PitchAngVel;
			KAddForces( FVector(0,0,0), -PitchDampingMag * worldRight );
		}

	}

	unguard;
}


&lt;/uscript&gt;

----

'''Foxpaw:''' The title of this page is a little misleading. It should perhaps be a subpage of your manual shifting vehicle page.

Also I'm a bit confused. You made a C++ version before making an Unrealscript version? Does this mean you have the native headers for UT2004?

'''CIpen:''' Sorry about that one :).  No, the code here is from http://www.psyonix.com/ and no, I do not have the native headers.  Even if I did have the headers, would it be good to have everything in script?  No, I don't think you want to be doing second order derivatives in script to calculate suspension/chassy movement.

'''Foxpaw:''' I don't see any reason why UScript couldn't handle that, as it is quite fast for an interpreted language. I also don't see any derivatives being calculated at all in that source.

Anyways, that's slightly besides the point. I see now that this is the C++ code for an onslaught wheeled vehicle, not the C++ code for the &quot;manual shift car&quot; that you created. The name somewhat implied that this was a C++ version of the UScript car detailed on it's parent page, which would have required the native headers to get into the game. (If you had made the &quot;manual shift car&quot; in C++, that is.)

'''CIpen:'''  Hey Foxpaw, that's nice you are pointing this out.  I'll remember you for the next time I need someone to show me that I'm not half way through writing my page(the obvious).

Ya, double briliant, unreal script can not even handle simple rotations per min to radians per min convertion and you are claiming it can calculate second order derivatives on the fly?  Where is this script at?  Foxpaw show me were your unreal script is that will calculate the spring motion of a car tire + spring + shock + engine torque in unreal script on the fly. 

'''Foxpaw:''' Err, that was a bit rude, but anyway, I'm not sure where you got your ideas about what Unrealscript can handle. RPM can be easily converted to radians per minute with one line: RadiansPerMinute = RPM * 2 * Pi; Unrealscript is a more-or-less full featured programming language: except for a few things that are restricted for security purposes, Unrealscript can do everything that C++ can do.

I don't have any code to calculate motion of tires since I haven't coded any land vehicles, but my mod handles hundreds, if not thousands of coordinate rotation and other matrix operations every tick, and still runs at over 200 fps - so I'm sure that it has the capability to handle calculating a few derivatives at acceptable speed.

'''CIpen:'''  I made this page to show the native function UpdateState().  Foxpaw, did you have a question about the function or did you come to boast about your mod?  Please Foxpaw, if it isn't about the code above please discuss it in the forums.

'''Foxpaw:''' Errr, I made a comment regarding the title of this page, and asked what this was since there was very little other than the code and a short note at the top stating that this is what you started with. You responded saying that you got the code from Psyonix at which point I realized what this was. You also said that you wouldn't want to do second order derivatives in Unrealscript. I said that I now realized what this was but said that I saw no reason why you couldn't do derivatives in UnrealScript. Then you responded defensively and made a remark about the capability (or lack thereof) of Unrealscript to perform even a simple calculation, let alone a complex one. I refuted that statement with an example of complex calculations being performed in Unrealscript. (my mod)

So, I don't see why &quot;now I see what this page is about&quot; prompted the rude response: &quot; Hey Foxpaw, that's nice you are pointing this out.  I'll remember you for the next time I need someone to show me that I'm not half way through writing my page(the obvious).&quot; I also don't see why me showing you that you can in fact perform an operation you claimed impossible offends you.

'''CIpen:''' &quot;I'm not half way through writing my page&quot;, did you miss this part of the sentence? :D  

Okay, yes, you can do complex calculations.  You win.  I do not have the time to answer this, so, you're right.  And when you're right, you're right.  But why even convert rotations per min to radians per min if you don't have to?  And what if there is already a lot eye candy?  Yes you're right, it is optional to optimize your code/map/whatever.</text>
    </revision>
    <revision>
      <id>5320</id>
      <timestamp>2004-10-01T18:02:24Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====UpdateVehicle ====

*This is so you can see what I started with in hopes you can derive something better someday :)

&lt;uscript&gt;
void AONSWheeledCraft::UpdateVehicle(FLOAT DeltaTime)
{
	guard(AONSWheeledCraft::UpdateVehicle);

	/////////// STEERING ///////////

	FLOAT maxSteerAngle = MaxSteerAngleCurve.Eval(Velocity.Size());

#if 0
	FLOAT maxSteer = DeltaTime * SteerSpeed * maxSteerAngle;
#else
	FLOAT maxSteer = DeltaTime * SteerSpeed;
#endif

	FLOAT deltaSteer;
	
	// When using Jumping Vehicle mutator and holding down to jump, always steer straight.
	if(!bPushDown)
		deltaSteer = (-Steering * maxSteerAngle) - ActualSteering; // Amount we want to move (target - current)
	else
		deltaSteer = -ActualSteering; 

	deltaSteer = Clamp&lt;FLOAT&gt;(deltaSteer, -maxSteer, maxSteer);
	ActualSteering += deltaSteer;

	/////////// ENGINE ///////////

	// Calculate torque at output of engine. Combination of throttle, current RPM and engine braaking.
	FLOAT EngineTorque = OutputGas * TorqueCurve.Eval( EngineRPM );
	FLOAT EngineBraking = (1.0f - OutputGas) * (EngineBrakeRPMScale*EngineRPM * EngineBrakeRPMScale*EngineRPM * EngineBrakeFactor);

	EngineTorque -= EngineBraking;

	DebugInfo = FString::Printf(TEXT(&quot;OutputBrake: %f	EngineRPM: %f    EngineTorque: %f&quot;), OutputBrake, EngineRPM, EngineTorque);

	// Total gear ratio between engine and differential (ie before being split between wheels).
	// A higher gear ratio and the torque at the wheels is reduced.
	FLOAT EngineWheelRatio = GearRatios[Gear] * TransRatio;

	// Reset engine RPM. We calculate this by adding the component of each wheel spinning.
	FLOAT NewTotalSpinVel=0.0f;
	EngineRPM = 0.0f;

	// Do model for each wheel.
	for(INT i=0; i&lt;Wheels.Num(); i++)
	{
		USVehicleWheel* vw = Wheels(i);

		/////////// DRIVE ///////////

		// Heuristic to divide torque up so that the wheels that are spinning slower get more of it.
		// Sum of LSDFactor across all wheels should be 1.
		// JTODO: Do we need to handle the case of vehicles with different size wheels?
		FLOAT LSDSplit, EvenSplit, UseSplit;

		EvenSplit = 1/NumPoweredWheels;

		// If no wheels are spinning, just do an even split.
		if(TotalSpinVel &gt; 0.1f)
			LSDSplit = (TotalSpinVel - vw-&gt;SpinVel)/((NumPoweredWheels-1) * TotalSpinVel);
		else
			LSDSplit = EvenSplit;

		UseSplit = ((1-LSDFactor) * EvenSplit) + (LSDFactor * LSDSplit);

		// Calculate Drive Torque : applied at wheels (ie after gearbox and differential)
		// This is an 'open differential' ie. equal torque to each wheel
		FLOAT DriveTorque = UseSplit * (EngineTorque / EngineWheelRatio);

		/////////// LONGITUDINAL ///////////

		// Calculate Grip Torque : longitudinal force against ground * distance of action (radius of tyre)
		// LongFrictionFunc is assumed to be reflected for negative Slip Ratio
		FLOAT GripTorque = FTScale * vw-&gt;WheelRadius * vw-&gt;TireLoad * WheelLongFrictionScale * vw-&gt;LongFrictionFunc.Eval( Abs(vw-&gt;SlipVel) );
		if(vw-&gt;SlipVel &lt; 0.0f)
			GripTorque *= -1.0f;

		// GripTorque can't be more than the torque needed to invert slip ratio.
		FLOAT TransInertia = (EngineInertia / Abs(GearRatios[Gear] * TransRatio)) + vw-&gt;WheelInertia;
		//FLOAT SlipAngVel = vw-&gt;SlipVel/vw-&gt;WheelRadius;

		// Brake torque acts to stop wheels (ie against direction of motion)
		FLOAT BrakeTorque = 0.0f;

		if(vw-&gt;SpinVel &gt; 0.0f)
			BrakeTorque = -OutputBrake * MaxBrakeTorque;
		else
			BrakeTorque = OutputBrake * MaxBrakeTorque;

		FLOAT LimitBrakeTorque = ( Abs(vw-&gt;SpinVel) * TransInertia ) / DeltaTime; // Size of torque needed to completely stop wheel spinning.
		BrakeTorque = Clamp(BrakeTorque, -LimitBrakeTorque, LimitBrakeTorque); // Never apply more than this!

		// Resultant torque at wheel : torque applied from engine + brakes + equal-and-opposite from tire-road interaction.
		FLOAT WheelTorque = DriveTorque + BrakeTorque - GripTorque;
	
		// Resultant linear force applied to car. (GripTorque applied at road)
		FLOAT VehicleForce = GripTorque / (FTScale * vw-&gt;WheelRadius);

		// If the wheel torque is opposing the direction of spin (ie braking) we use friction to apply it.
		if( OutputBrake &gt; 0.0f ||  (DriveTorque + BrakeTorque) * vw-&gt;SpinVel &lt; 0.0f)
		{
			vw-&gt;DriveForce = 0.0f;
			vw-&gt;LongFriction = Abs(VehicleForce) + (OutputBrake * MinBrakeFriction);
		}
		else
		{
			vw-&gt;DriveForce = VehicleForce;
			vw-&gt;LongFriction = 0.0f;
		}

		// Calculate torque applied back to chassis if wheel is on the ground
		if (vw-&gt;bWheelOnGround)
			vw-&gt;ChassisTorque = -1.0f * (DriveTorque + BrakeTorque) * ChassisTorqueScale;
		else
			vw-&gt;ChassisTorque = 0.0f;

		// Calculate new wheel speed. 
		// The lower the gear ratio, the harder it is to accelerate the engine.
		FLOAT TransAcc = WheelTorque / TransInertia;
		vw-&gt;SpinVel += TransAcc * DeltaTime;

		// Make sure the wheel can't spin in the wrong direction for the current gear.
		if(Gear == 0 &amp;&amp; vw-&gt;SpinVel &gt; 0.0f)
			vw-&gt;SpinVel = 0.0f;
		else if(Gear &gt; 0 &amp;&amp; vw-&gt;SpinVel &lt; 0.0f)
			vw-&gt;SpinVel = 0.0f;

		// Accumulate wheel spin speeds to find engine RPM. 
		// The lower the gear ratio, the faster the engine spins for a given wheel speed.
		NewTotalSpinVel += vw-&gt;SpinVel;
		EngineRPM += vw-&gt;SpinVel / EngineWheelRatio;

		/////////// LATERAL ///////////

		vw-&gt;LatFriction = WheelLatFrictionScale * vw-&gt;TireLoad;
		vw-&gt;LatSlip = vw-&gt;LatSlipFunc.Eval(vw-&gt;SlipAngle);

		if(OutputHandbrake &amp;&amp; vw-&gt;bHandbrakeWheel)
		{
			vw-&gt;LatFriction *= vw-&gt;HandbrakeFrictionFactor;
			vw-&gt;LatSlip *= vw-&gt;HandbrakeSlipFactor;
		}

		/////////// STEERING  ///////////

		// Pass on steering to wheels that want it.
		if(vw-&gt;SteerType == VST_Steered)
			vw-&gt;Steer = ActualSteering;
		else if(vw-&gt;SteerType == VST_Inverted)
			vw-&gt;Steer = -ActualSteering;
		else
			vw-&gt;Steer = 0.0f;
	}

	// EngineRPM is in radians per second, want in revolutions per minute
	EngineRPM /= NumPoweredWheels;
	EngineRPM /= 2.0f * (FLOAT)PI; // revs per sec
	EngineRPM *= 60;
	EngineRPM = Max( EngineRPM, 0.01f ); // ensure always positive!

	// Update total wheel spin vel
	TotalSpinVel = NewTotalSpinVel;

	// Turn (yaw) damping.
	FMatrix carTM = LocalToWorld();
	FVector worldUp(carTM.M[2][0], carTM.M[2][1], carTM.M[2][2]);
	FVector worldRight(carTM.M[1][0], carTM.M[1][1], carTM.M[1][2]);
	FVector worldForward(carTM.M[0][0], carTM.M[0][1], carTM.M[0][2]);

	FKRigidBodyState rbState;
	KGetRigidBodyState(&amp;rbState);
	FVector AngVel(rbState.AngVel.X, rbState.AngVel.Y, rbState.AngVel.Z);
	FLOAT TurnAngVel = AngVel | worldUp;

	FLOAT DampingScale = 1.0f - MinAirControlDamping;

	if(bAllowAirControl &amp;&amp; !bVehicleOnGround)
	{
		FLOAT TurnDampingMag = (1.0f - DampingScale*Abs(Steering)) * TurnDamping * TurnAngVel;
		KAddForces( FVector(0,0,0), -TurnDampingMag * worldUp );
	}
	else
	{
		FLOAT TurnDampingMag = (1.0f - Abs(Steering)) * TurnDamping * TurnAngVel;
		KAddForces( FVector(0,0,0), -TurnDampingMag * worldUp );
	}

	// If vehicle is in the air and we are allowing air control...
	if(!bVehicleOnGround)
	{
		FLOAT PitchAngVel = AngVel | worldRight;
		FLOAT RollAngVel = AngVel | worldForward;

		if(bAllowAirControl)
		{
			FVector AirControlTorque = worldRight * OutputPitch * -AirPitchTorque;

			if(bIsWalking)
				AirControlTorque += (worldForward * Steering * -AirRollTorque);
			else
				AirControlTorque += (worldUp * Steering * -AirTurnTorque);

			KAddForces( FVector(0,0,0), AirControlTorque );

			// Damping forces
			FLOAT PitchDampingMag = (1.0f - DampingScale*Abs(OutputPitch)) * AirPitchDamping * PitchAngVel;
			FLOAT RollDampingMag = (1.0f - DampingScale*Abs(Steering)) * AirRollDamping * RollAngVel;

			KAddForces( FVector(0,0,0), (-PitchDampingMag * worldRight) + (-RollDampingMag * worldForward) );
		}
		else
		{
			FLOAT PitchDampingMag = AirPitchDamping * PitchAngVel;
			KAddForces( FVector(0,0,0), -PitchDampingMag * worldRight );
		}

	}

	unguard;
}


&lt;/uscript&gt;

----

'''Foxpaw:''' The title of this page is a little misleading. It should perhaps be a subpage of your manual shifting vehicle page.

Also I'm a bit confused. You made a C++ version before making an Unrealscript version? Does this mean you have the native headers for UT2004?

'''CIpen:''' Sorry about that one :).  No, the code here is from http://www.psyonix.com/ and no, I do not have the native headers.  Even if I did have the headers, would it be good to have everything in script?  No, I don't think you want to be doing second order derivatives in script to calculate suspension/chassy movement.

'''Foxpaw:''' I don't see any reason why UScript couldn't handle that, as it is quite fast for an interpreted language. I also don't see any derivatives being calculated at all in that source.

Anyways, that's slightly besides the point. I see now that this is the C++ code for an onslaught wheeled vehicle, not the C++ code for the &quot;manual shift car&quot; that you created. The name somewhat implied that this was a C++ version of the UScript car detailed on it's parent page, which would have required the native headers to get into the game. (If you had made the &quot;manual shift car&quot; in C++, that is.)

'''CIpen:'''  Hey Foxpaw, that's nice you are pointing this out.  I'll remember you for the next time I need someone to show me that I'm not half way through writing my page(the obvious).

Ya, double briliant, unreal script can not even handle simple rotations per min to radians per min convertion and you are claiming it can calculate second order derivatives on the fly?  Where is this script at?  Foxpaw show me were your unreal script is that will calculate the spring motion of a car tire + spring + shock + engine torque in unreal script on the fly. 

'''Foxpaw:''' Err, that was a bit rude, but anyway, I'm not sure where you got your ideas about what Unrealscript can handle. RPM can be easily converted to radians per minute with one line: RadiansPerMinute = RPM * 2 * Pi; Unrealscript is a more-or-less full featured programming language: except for a few things that are restricted for security purposes, Unrealscript can do everything that C++ can do.

I don't have any code to calculate motion of tires since I haven't coded any land vehicles, but my mod handles hundreds, if not thousands of coordinate rotation and other matrix operations every tick, and still runs at over 200 fps - so I'm sure that it has the capability to handle calculating a few derivatives at acceptable speed.

'''CIpen:'''  I made this page to show the native function UpdateState().  Foxpaw, did you have a question about the function or did you come to boast about your mod?  Please Foxpaw, if it isn't about the code above please discuss it in the forums.

'''Foxpaw:''' Errr, I made a comment regarding the title of this page, and asked what this was since there was very little other than the code and a short note at the top stating that this is what you started with. You responded saying that you got the code from Psyonix at which point I realized what this was. You also said that you wouldn't want to do second order derivatives in Unrealscript. I said that I now realized what this was but said that I saw no reason why you couldn't do derivatives in UnrealScript. Then you responded defensively and made a remark about the capability (or lack thereof) of Unrealscript to perform even a simple calculation, let alone a complex one. I refuted that statement with an example of complex calculations being performed in Unrealscript. (my mod)

So, I don't see why &quot;now I see what this page is about&quot; prompted the rude response: &quot; Hey Foxpaw, that's nice you are pointing this out.  I'll remember you for the next time I need someone to show me that I'm not half way through writing my page(the obvious).&quot; I also don't see why me showing you that you can in fact perform an operation you claimed impossible offends you.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Atmosphere</title>
    <id>2109</id>
    <revision>
      <id>5139</id>
      <timestamp>2005-12-24T17:27:23Z</timestamp>
      <contributor>
        <ip>142-165-228-234.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>my opinion</comment>
      <text xml:space="preserve">==Map Atmosphere UT and UT2003 (by EntropicLqd)==

It must be said that one of the greatest achievements of UT was the diversity and quality of the maps that shipped with the game.  Even though the maps within UT were constrained by a harsh polygon limit each one managed to create its own unique atmosphere and feeling.

Unfortunately UT2003 managed to lose this somewhere along the way.  Much criticism has been heaped on the maps that shipped with the game.  Indeed as I consider the maps that shipped with UT2003 I can only think of a few that have the same quality of atmosphere as the maps for UT.

What follows is a summary of what I believe went wrong.  Bear in mind that I'm writing from a position where I don't actually like the UT2003 game that much.  It doesn't mean I'm wrong &amp;ndash; just slightly biased.

===The Music===

Why is music important to a level?  It provides a backdrop to the theme of the level.  A slow piece in a minor key gives a level a melancholy and mournful backdrop.  Upbeat music can provide a level with a feeling of pace and life, even when the level in reality lacks it.

----

The music in UT was excellent.  Whenever I get a game I go through an exercise of listening to the music without playing the game.  The music in UT is not only quite diverse but also worth listening to.  I occasionally still listen to the music from Phobos or Tempest (to name two of my favourites).  They are excellent pieces.  I even still play UT with the music every now and then &amp;ndash; high acclaim indeed given the number of hours of UT I have put in since its release.

The music from UT2003 is bland.  I forced myself to sit through every piece once.  I have no intention of doing it again.  It was an exercise in patience and self-torture.

====Verbatim====

'''Foxpaw:''' I'd wholeheartedly agree about the music. The music in UT was mostly very actiony and intense. The music in UT2003 is, with a few exceptions, quite unobtrusive and ambient. The music in UT often also created an illusion of a more dynamic environment. UT8, with it's piston sliding sound, made a factory constructed from static BSP feel like the equipment was running. Superfist just sounds so fast, it's responsible for most of the wear on my car's back tires. :P 

===The Themes===

----

The maps in UT were quite diverse.  It felt like you were playing in many different places from many different times.  Even given the limitations of the engine at the time each map manages to stand out from the others.  The maps are distinguishable from each other and clearly separate.

This is not the case in UT2003.  The maps seem to have blended together into some sort of techno mulch.  The maps don't really manage to stand apart from each other.  There are some exceptions to this though.  Asbestos, Magma, and Maul have very definite themes and to my mind stand out from the rather bland crowd they find themselves in.  Now that I think on it those maps also play very well.

====Verbatim====

'''Foxpaw:''' I also think that the locales were better in UT. UT felt like you were fighting in a factory/church/run-down apartment building/whatever while most UT2003 levels have the feel of playing in a proper arena. It's like military simulation paintball versus tournament paintball. In UT you were fighting a pitched battle in an Aztec ruin, in UT2003 you're just hiding behind a high-detail inflatable cone that looks like a pyramid over ashphalt painted to look like sand.

'''EntropicLqd:''' I've often wondered if there comes a point where the more detail that is added actually detracts from the perceived &quot;reality&quot; of a level.  My theory goes like this: ''The closer detail becomes to real-life the more obvious the shortcomings become thus reducing the amount of immersion.''.  Essentially the brain stops subconciously filling in the gaps and starts pointing them out.

'''Zxanphorian:''' Yeah, i totally 100% agree on your theory ent, because, look at DM-Conveyor and CTF-Gauntlet, for example. They look more like factories and industrial areas than any industrial map in UT2003 can be like. I believe that more gamers would gravitate to a warish, military-like games (like i do) than sports-theme games. If you want sports, get a sports game. Games that combine sports with war-like situations are a no. ... I felt that there was a &quot;life&quot; in UT, and UT2003 seems lifeless; there isn't any soul in UT2003.

'''RDGDanClark:''' I'm not so sure, some of the most popular maps are based around themes that aren't war related. Even in UT1 we had great maps based on hockey, football and soccer. Maps like CTF-Bedrooms (in it's many incarnations) aren't really warlike situations. On the other hand, trying to turn a war-style game into a sports game  (i.e. Bombing Run) doesn't do much for me. Trying to turn UT into Madden is a bad idea.

'''Foxpaw:''' Well, we'll just call that Urban Warfare. :P Seriously though, I think that most UT2003 maps feel like an arena dressed up as a real environment, rather than a real combat environment. Good for gameplay maybe, but I think the atmosphere is just as important.

'''EntropicLqd:''' I'm not convinced there is anything inherently wrong with Boming Run as a gametype.  At the end of the day you still need to kill off the opposing team if you want to stand a chance of winning.  If you take out the whole &quot;commentator/sports&quot; concept behind UT2003 and keep the idea of Bombing Run it suddenly becomes more palatable.  I do wonder if they simply tried to hard when putting the maps together - that is - started with an idea for map flow and then build the environment around it rather than put the environment together and fit the map flow within it.

===Map Flow===

Having started writing this piece I realise that the biggest factor in the &quot;blandness&quot; of the UT2003 maps over the UT maps is the map flow.  As a general rule the maps in UT really worked.  They played as great as they looked.  Sure there are some generally accepted balance issues on a couple of the maps but even so the maps played well.   The same cannot be said for the UT2003 maps &amp;ndash; even though they all look gorgeous.

----

I think the following things contribute to this.
# The new scaling of the player size means that the players look out of place within the maps.  They players just look too small for the environments they find themselves in.
# The new jumping moves change the way the game is played significantly.  In UT you could dodge across the map to cross the map in an extra second or so.  In UT2003 you have to dodge-jump everywhere just to keep up.  There is a map whose name I'll remember in a minute (CTF-Core I think) where you feel like you want to dodge jump down a set of steps.  It's something you can't do without hitting the ceiling.  This just breaks the map flow for me every time I do it.
# The move to static meshes changed the way maps were built.  The change is very profound and I suspect the re-use of the static meshes across all of the maps has more to do with the bland &quot;didn't I just play this map&quot; feel of them than most other things.

To back up that last point - DE's Grendel Keep is an excellent level.  It flows well and has great atmosphere.  It's also very &quot;clean&quot; in terms of detail.  There is a definate lack of meshes to get caught on, and the majority of meshes that are used are used for decorative purposes - in much the same way as semi-solids were used in UT.

====Verbatim====

'''Erika:''' Static meshes also hinder map flow because there is a larger chance to get stuck on a mesh in UT200x than there is to get stuck on BSP in UT.

===Characters===

====Verbatim====

'''Zxanphorian:'''Also, another way I felt more immersed in UT is characters. The first time i played against the Skaarj Hybrids in UT, I was admittenly scared of them, and my hand, grabbing the mouse, jumped away from the computer desk. That didn't happen in UT2003. At all. Also, the boss in UT is and always will be more scarier than Malcolm in UT2003.

'''EntropicLqd:''' I'm sure the problem with the characters in UT2003 is purely one of size rather than there being anything really wrong with them.  It's hard for me to pin down really as I find the character scaling so irritating.  I think the reason Xan is more scary then Malcolm is down to the choice of level.  Playing UT2003's Malcolm on UT's hyperblast would have been hardwork.

'''Zxanphorian:''' You may say that because the UT2003 characters have too many gadgets on them. In UT, they were cut and dry to the point.

'''EntropicLqd:''' Nope.  I've just finished re-testing my statement.  If I set the xGame.xPawn DrawScale to 1.25 then I find the game much more playable.  The characters seem to fit better into the environments.  I don't know what the actual difference is in height between UT and UT2003 - I just wanted something that looked right.

'''WheatPuppet:''' I agree with the character design thing. In UT the most &quot;out-there&quot; models (at least the ones that came boxed with the game) were the Necroth ones. In UT2003 a lot of the models&amp;ndash;esp. Mr. Crow and family&amp;ndash;have this S&amp;M quality that I find very hard to take seriously. I'm not looking for high art in gameplay models&amp;ndash;it's UT, after all&amp;ndash;but I think they could've done better than that.

'''Erika:''' Actually, UT200x characters are taller than UT characters. The maps are just way too big and the characters are way too lightly coloured that they appear to be small. UT2003 characters are also really cartoony, which is a shame since the first UT was nice.

'''El Muerte:''' I'm pretty sure the UT200x characters have the same height as the UT characters.  The rooms might be smaller though.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

==Discussion==

'''Tarquin:''' If you write in MS Word please turn off &quot;smart quotes&quot; &amp;ndash; the source here is full of ugly &amp;amp;#8217;

'''EntropicLqd:''' Sorry - I forgot about the apostrophes :(.  I normally write in notepad.  That should be better.

'''Zxanphorian:''' AHHHHHH PAGE OVERRUN!!! Jk :) Thanks Entropic! This gave me an idea of a page that has wikiers write about a certain concept about gameplay, like map atmosphere. In those pages there should be a main body that all people edit and a debate section, that is self-explanitory. Nice job entropic for writing this piece. But, this piece needs more info and examples. (may i edit the body?)

'''EntropicLqd:''' Feel free to hack and slash the body of the document around all you like.

'''StarWeaver:''' Re the concept of UT vs 200x in general . . . Well, I certainly remember feeling this way in the past. I remember when I first got 2003, I think it was fairly new then, and I played it for a little while, and then I said &quot;eh&quot; and went back to UT. But I got 2004 around Feb 2005, and it worked a lot better for me then. Granted, I hadn't been playing FPSs nearly as much at that point (was pretty much on an Neverwinter Nights kick), so perhaps I had less immediate experience to compare it to, but . . . it just seemed to be a lot more fun than 2003 was. And that was without onslaught and assault and all that. Does anyone have any opinions on 2003 vs 2004? Are the newer epic maps any better than the first batch for the engine? Maybe the newer CBP and UCMP and the newer independant releases have hit the mark a bit better?

'''MythOpus:''' I think UT 1 will always be better than any UT200X or any of it's mod variants.  Period.  The Map Atmosphere (although less 'tecky') is far more superior.  That feeling like your part of the team is great (unfortunately, not so great with ut200x).  I recommend mapping for UT 1 for the rest of your life.  There's just not enough detail/atmosphere that can be crammed into a UT200x Map.

----

'''Zxanphorian:''' Admin, please delete that subpage of [[Legacy:Zxanphorian|Zxanphorian]], please

'''SuperApe:''' Add a Delete Me catergory tag and it will be removed eventually.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5140</id>
      <timestamp>2005-12-24T02:35:40Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <comment>Comment</comment>
      <text xml:space="preserve">==Map Atmosphere UT and UT2003 (by EntropicLqd)==

It must be said that one of the greatest achievements of UT was the diversity and quality of the maps that shipped with the game.  Even though the maps within UT were constrained by a harsh polygon limit each one managed to create its own unique atmosphere and feeling.

Unfortunately UT2003 managed to lose this somewhere along the way.  Much criticism has been heaped on the maps that shipped with the game.  Indeed as I consider the maps that shipped with UT2003 I can only think of a few that have the same quality of atmosphere as the maps for UT.

What follows is a summary of what I believe went wrong.  Bear in mind that I'm writing from a position where I don't actually like the UT2003 game that much.  It doesn't mean I'm wrong &amp;ndash; just slightly biased.

===The Music===

Why is music important to a level?  It provides a backdrop to the theme of the level.  A slow piece in a minor key gives a level a melancholy and mournful backdrop.  Upbeat music can provide a level with a feeling of pace and life, even when the level in reality lacks it.

----

The music in UT was excellent.  Whenever I get a game I go through an exercise of listening to the music without playing the game.  The music in UT is not only quite diverse but also worth listening to.  I occasionally still listen to the music from Phobos or Tempest (to name two of my favourites).  They are excellent pieces.  I even still play UT with the music every now and then &amp;ndash; high acclaim indeed given the number of hours of UT I have put in since its release.

The music from UT2003 is bland.  I forced myself to sit through every piece once.  I have no intention of doing it again.  It was an exercise in patience and self-torture.

====Verbatim====

'''Foxpaw:''' I'd wholeheartedly agree about the music. The music in UT was mostly very actiony and intense. The music in UT2003 is, with a few exceptions, quite unobtrusive and ambient. The music in UT often also created an illusion of a more dynamic environment. UT8, with it's piston sliding sound, made a factory constructed from static BSP feel like the equipment was running. Superfist just sounds so fast, it's responsible for most of the wear on my car's back tires. :P 

===The Themes===

----

The maps in UT were quite diverse.  It felt like you were playing in many different places from many different times.  Even given the limitations of the engine at the time each map manages to stand out from the others.  The maps are distinguishable from each other and clearly separate.

This is not the case in UT2003.  The maps seem to have blended together into some sort of techno mulch.  The maps don't really manage to stand apart from each other.  There are some exceptions to this though.  Asbestos, Magma, and Maul have very definite themes and to my mind stand out from the rather bland crowd they find themselves in.  Now that I think on it those maps also play very well.

====Verbatim====

'''Foxpaw:''' I also think that the locales were better in UT. UT felt like you were fighting in a factory/church/run-down apartment building/whatever while most UT2003 levels have the feel of playing in a proper arena. It's like military simulation paintball versus tournament paintball. In UT you were fighting a pitched battle in an Aztec ruin, in UT2003 you're just hiding behind a high-detail inflatable cone that looks like a pyramid over ashphalt painted to look like sand.

'''EntropicLqd:''' I've often wondered if there comes a point where the more detail that is added actually detracts from the perceived &quot;reality&quot; of a level.  My theory goes like this: ''The closer detail becomes to real-life the more obvious the shortcomings become thus reducing the amount of immersion.''.  Essentially the brain stops subconciously filling in the gaps and starts pointing them out.

'''Zxanphorian:''' Yeah, i totally 100% agree on your theory ent, because, look at DM-Conveyor and CTF-Gauntlet, for example. They look more like factories and industrial areas than any industrial map in UT2003 can be like. I believe that more gamers would gravitate to a warish, military-like games (like i do) than sports-theme games. If you want sports, get a sports game. Games that combine sports with war-like situations are a no. ... I felt that there was a &quot;life&quot; in UT, and UT2003 seems lifeless; there isn't any soul in UT2003.

'''RDGDanClark:''' I'm not so sure, some of the most popular maps are based around themes that aren't war related. Even in UT1 we had great maps based on hockey, football and soccer. Maps like CTF-Bedrooms (in it's many incarnations) aren't really warlike situations. On the other hand, trying to turn a war-style game into a sports game  (i.e. Bombing Run) doesn't do much for me. Trying to turn UT into Madden is a bad idea.

'''Foxpaw:''' Well, we'll just call that Urban Warfare. :P Seriously though, I think that most UT2003 maps feel like an arena dressed up as a real environment, rather than a real combat environment. Good for gameplay maybe, but I think the atmosphere is just as important.

'''EntropicLqd:''' I'm not convinced there is anything inherently wrong with Boming Run as a gametype.  At the end of the day you still need to kill off the opposing team if you want to stand a chance of winning.  If you take out the whole &quot;commentator/sports&quot; concept behind UT2003 and keep the idea of Bombing Run it suddenly becomes more palatable.  I do wonder if they simply tried to hard when putting the maps together - that is - started with an idea for map flow and then build the environment around it rather than put the environment together and fit the map flow within it.

===Map Flow===

Having started writing this piece I realise that the biggest factor in the &quot;blandness&quot; of the UT2003 maps over the UT maps is the map flow.  As a general rule the maps in UT really worked.  They played as great as they looked.  Sure there are some generally accepted balance issues on a couple of the maps but even so the maps played well.   The same cannot be said for the UT2003 maps &amp;ndash; even though they all look gorgeous.

----

I think the following things contribute to this.
# The new scaling of the player size means that the players look out of place within the maps.  They players just look too small for the environments they find themselves in.
# The new jumping moves change the way the game is played significantly.  In UT you could dodge across the map to cross the map in an extra second or so.  In UT2003 you have to dodge-jump everywhere just to keep up.  There is a map whose name I'll remember in a minute (CTF-Core I think) where you feel like you want to dodge jump down a set of steps.  It's something you can't do without hitting the ceiling.  This just breaks the map flow for me every time I do it.
# The move to static meshes changed the way maps were built.  The change is very profound and I suspect the re-use of the static meshes across all of the maps has more to do with the bland &quot;didn't I just play this map&quot; feel of them than most other things.

To back up that last point - DE's Grendel Keep is an excellent level.  It flows well and has great atmosphere.  It's also very &quot;clean&quot; in terms of detail.  There is a definate lack of meshes to get caught on, and the majority of meshes that are used are used for decorative purposes - in much the same way as semi-solids were used in UT.

====Verbatim====

'''Erika:''' Static meshes also hinder map flow because there is a larger chance to get stuck on a mesh in UT200x than there is to get stuck on BSP in UT.

===Characters===

====Verbatim====

'''Zxanphorian:'''Also, another way I felt more immersed in UT is characters. The first time i played against the Skaarj Hybrids in UT, I was admittenly scared of them, and my hand, grabbing the mouse, jumped away from the computer desk. That didn't happen in UT2003. At all. Also, the boss in UT is and always will be more scarier than Malcolm in UT2003.

'''EntropicLqd:''' I'm sure the problem with the characters in UT2003 is purely one of size rather than there being anything really wrong with them.  It's hard for me to pin down really as I find the character scaling so irritating.  I think the reason Xan is more scary then Malcolm is down to the choice of level.  Playing UT2003's Malcolm on UT's hyperblast would have been hardwork.

'''Zxanphorian:''' You may say that because the UT2003 characters have too many gadgets on them. In UT, they were cut and dry to the point.

'''EntropicLqd:''' Nope.  I've just finished re-testing my statement.  If I set the xGame.xPawn DrawScale to 1.25 then I find the game much more playable.  The characters seem to fit better into the environments.  I don't know what the actual difference is in height between UT and UT2003 - I just wanted something that looked right.

'''WheatPuppet:''' I agree with the character design thing. In UT the most &quot;out-there&quot; models (at least the ones that came boxed with the game) were the Necroth ones. In UT2003 a lot of the models&amp;ndash;esp. Mr. Crow and family&amp;ndash;have this S&amp;M quality that I find very hard to take seriously. I'm not looking for high art in gameplay models&amp;ndash;it's UT, after all&amp;ndash;but I think they could've done better than that.

'''Erika:''' Actually, UT200x characters are taller than UT characters. The maps are just way too big and the characters are way too lightly coloured that they appear to be small. UT2003 characters are also really cartoony, which is a shame since the first UT was nice.

'''El Muerte:''' I'm pretty sure the UT200x characters have the same height as the UT characters.  The rooms might be smaller though.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

==Discussion==

'''Tarquin:''' If you write in MS Word please turn off &quot;smart quotes&quot; &amp;ndash; the source here is full of ugly &amp;amp;#8217;

'''EntropicLqd:''' Sorry - I forgot about the apostrophes :(.  I normally write in notepad.  That should be better.

'''Zxanphorian:''' AHHHHHH PAGE OVERRUN!!! Jk :) Thanks Entropic! This gave me an idea of a page that has wikiers write about a certain concept about gameplay, like map atmosphere. In those pages there should be a main body that all people edit and a debate section, that is self-explanitory. Nice job entropic for writing this piece. But, this piece needs more info and examples. (may i edit the body?)

'''EntropicLqd:''' Feel free to hack and slash the body of the document around all you like.

'''StarWeaver:''' Re the concept of UT vs 200x in general . . . Well, I certainly remember feeling this way in the past. I remember when I first got 2003, I think it was fairly new then, and I played it for a little while, and then I said &quot;eh&quot; and went back to UT. But I got 2004 around Feb 2005, and it worked a lot better for me then. Granted, I hadn't been playing FPSs nearly as much at that point (was pretty much on an Neverwinter Nights kick), so perhaps I had less immediate experience to compare it to, but . . . it just seemed to be a lot more fun than 2003 was. And that was without onslaught and assault and all that. Does anyone have any opinions on 2003 vs 2004? Are the newer epic maps any better than the first batch for the engine? Maybe the newer CBP and UCMP and the newer independant releases have hit the mark a bit better?

----

'''Zxanphorian:''' Admin, please delete that subpage of [[Legacy:Zxanphorian|Zxanphorian]], please

'''SuperApe:''' Add a Delete Me catergory tag and it will be removed eventually.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Build Errors</title>
    <id>2240</id>
    <revision>
      <id>5412</id>
      <timestamp>2007-08-03T06:47:39Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>*bNoDelete=False -- TriggerLight error</comment>
      <text xml:space="preserve">If you [[Legacy:Rebuild|Rebuild]] your map or use the [[Legacy:Map Check|Map Check]] tool, and the engine determines that there is a problem, you may see the errors shown below.

'''You are encouraged to add any errors that you don't know what they mean; someone will fill in an explanation (probably within a day or two) and it will expand this database. ;)'''

==Format==

The &quot;Rebuild Errors&quot; dialogue is split into 2 columns: one which lists the offending [[Legacy:Actor|actor]] (on the left) and one which displays the issue (on the right).  Double-clicking on an actor in the left column performs the same function as finding one in the [[Legacy:Actor Search|Actor Search]] window: all viewports will zoom directly to that actor.  The 3D viewport will place the [[Legacy:Camera|camera]] over the actor, but the 2D viewports will maintain their distance.

Map Check errors are usually not actor-specific, and so only have one column (which reports the error, but not its source).

Note that the error messages listed below consist of the text that appears on the right-hand column of the Rebuild Error Dialogue, or in the Map Check dialogue.

Also note that the letters X and Y are replaced with numbers to identify the actor in the actual error message.

The errors are grouped first by type, second by location, and third alphabetically, ignoring spaces.

==Errors==

The exact wording of the errors may differ slightly depending on which location it appears (if it can appear in both the Map Check dialogue and the Rebuild Error dialogue).

===Botpathing Errors===

====Map Check and Rebuild Errors====
; &quot;Cannot Reach NavigationPoint X from this node!&quot; : This rare message occurs if a path has been forced between two NavigationPoints but the path is invalid, or occasionally if a pathnode is too far from an objective (like a CTF Flag) and the engine feels that there should be a path connecting the objective to the node.  If the problem is the first, simply unforce the path or adjust the location of the nodes.  If the problem is the second, just add some pathnodes in between.
; &quot;JumpDest has no forced paths to it&quot; : You've added a JumpSpot but have not forced any paths to it.  You must force a path to it in order for bots to notice it.
; &quot;Ladder Volume is not a ladder volume&quot; : There is no [[Legacy:Ladder (UT)|Ladder (UT)]] actor in the [[Legacy:LadderVolume|LadderVolume]].  You probably moved it accidentally, or have deleted the one that spawns there by default.
; &quot;Navigation point embedded in world geometry&quot; : You've placed a pathnode ouside of subtracted space.  Simply delete the node or move it back inside.
; &quot;Navigation point is not on valid base&quot; : You've placed a navigation point on either a mover or a nonsolid actor.  Move it to an appropriate spot on flat, solid space.
; &quot;No forced destination for this jumppad!&quot; : You've added a [[Legacy:UTJumpPad|UTJumpPad]], but have not forced a path from it to a [[Legacy:JumpSpot|JumpSpot]].  To get a UTJumpPad to work correctly, this must be done.  Remember that the UTJumpPad's Properties&gt;&gt;Navigation Point&gt;&gt;ForcedPath array must contain the actual '''name''' of the actor, '''not''' the [[Legacy:Tag|Tag]].  The name of an object is found under its Properties&gt;&gt;Object&gt;&gt;Name, and will be something like JumpSpot0.
; &quot;No navigation point associated with this mover!&quot; : If the specified mover is a lift, you have not placed a [[Legacy:LiftCenter|LiftCenter]] and/or [[Legacy:LiftExit|LiftExit]] and associated them with the mover.  If the specified mover is a door, set its Properties&gt;&gt;AI to bAutoDoor=True or bNoAIRelevance=True.  If the mover is neither, then set its Properties&gt;&gt;AI to bNoAIRelevance=True.
; &quot;Pathnode X should be JumpDest for Pathnode Y&quot; : Pathnode X is at a hard-to-reach location from Pathnode Y's position, and so a jumpspot should be placed there to make bot navigation easier.

====Rebuild Errors====
; &quot;Navigation point is too close or on too steep a slope&quot; : You've placed a navigation point too close to a steep slope or too high above the ground.  Move it to a flat, solid area, move it closer to the ground, or delete it.  Often occurs when pathing is done before terrain is finished, and the terrain is raised above the existing navigation point.
; &quot;No paths from Pathnode X&quot; : Just what it says: there are no paths to the pathnode specified.  To solve this issue, add pathnodes to connect the node in question to the rest of the network.  Occurs when paths are forced to a pathnode, or when a pathnode is at the bottom of a steep drop.  Often occurs in conjunction with the next error.
; &quot;No paths to Pathnode X&quot; : Just what it says: there are no paths from the pathnode specified.  To solve this issue, add pathnodes to connect the node in question to the rest of the network.  Occurs when paths are forced from this pathnode, or when a pathnode is at the top of a steep drop.  Often occurs in conjunction with the previous error.
; &quot;Pathnode X is too close to Pathnode Y&quot; : You may have accidentally duplicated a pathnode; just move one of the offending pathnodes away or delete it.  This error always occurs in pairs.
; &quot;May be too close to other navigation points&quot; : The actor highlighted adds to the bot path network, but is likely colliding with other bot path network actors, like NavigationPoints or Pickups.  Delete or move the highlighted actor or ones close to it.  Too many NavigationPoint actors too close together will cause AI navigation problems in game.

====Map Check Errors====
; &quot;Only X Playerstarts in map!&quot; : Probably occurs if there are less playerstarts in the map than the maximum playercount.
; &quot;Paths need to be rebuilt&quot; : Exactly what it says: rebuild your botpathing network.  This error will be shown if you use the Map Check tool after changing anything in the botpathing network until you rebuild paths.
; &quot;Path to Pathnode X is very long&amp;ndash;place a pathnode in between.&quot; : This error even gives you the solution: There are close to 1024 units between Pathnodes X and Y, and it's a little to far for bots to navigate comfortably.  Place a pathnode between the two offending nodes to solve this issue.  Often occurs in pairs.
; &quot;Playerstart not useable&quot; : Occurs if a playerstart is either hanging in midair, sitting on a mover or nonsolid brush, or embedded in a solid space.  Often coincides with other similar errors.  To fix, find the offending playerstart and move it to an appropriate location.
; &quot;TriggerLightX bNoDelete false, but is bNoDelete by default - map will fail in netplay&quot; : You've set the Advanced&gt;&gt;bNoDelete property to False on a TriggerLight actor.  This is not allowed because TriggerLights are hardcoded to be bNoDelete=True.  Simply reset bNoDelete to True to fix this issue.

===Build Errors===
; &quot;Brush X has NULL material references&quot; (Map Check and Rebuild Error): You did not apply a texture to a brush.  Don't be too alarmed, because it will still have the default engine texture.  This is not an issue that must be fixed (but it's probably a good idea).  Note that the Map Check error does not specify the brush.

===Lighting Errors===
; &quot;There are no lights in this map!&quot; (Map Check Error only): If you need help to figure this one out, you should probably give up mapping right now.

==Related Topics==
* [[Legacy:Rebuild|Rebuild]]
* [[Legacy:Build|Build]]
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5413</id>
      <timestamp>2007-06-22T13:40:35Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <comment>Rebuild Error described. -SuperApe</comment>
      <text xml:space="preserve">If you [[Legacy:Rebuild|Rebuild]] your map or use the [[Legacy:Map Check|Map Check]] tool, and the engine determines that there is a problem, you may see the errors shown below.

'''You are encouraged to add any errors that you don't know what they mean; someone will fill in an explanation (probably within a day or two) and it will expand this database. ;)'''

==Format==

The &quot;Rebuild Errors&quot; dialogue is split into 2 columns: one which lists the offending [[Legacy:Actor|actor]] (on the left) and one which displays the issue (on the right).  Double-clicking on an actor in the left column performs the same function as finding one in the [[Legacy:Actor Search|Actor Search]] window: all viewports will zoom directly to that actor.  The 3D viewport will place the [[Legacy:Camera|camera]] over the actor, but the 2D viewports will maintain their distance.

Map Check errors are usually not actor-specific, and so only have one column (which reports the error, but not its source).

Note that the error messages listed below consist of the text that appears on the right-hand column of the Rebuild Error Dialogue, or in the Map Check dialogue.

Also note that the letters X and Y are replaced with numbers to identify the actor in the actual error message.

The errors are grouped first by type, second by location, and third alphabetically, ignoring spaces.

==Errors==

The exact wording of the errors may differ slightly depending on which location it appears (if it can appear in both the Map Check dialogue and the Rebuild Error dialogue).

===Botpathing Errors===

====Map Check and Rebuild Errors====
; &quot;Cannot Reach NavigationPoint X from this node!&quot; : This rare message occurs if a path has been forced between two NavigationPoints but the path is invalid, or occasionally if a pathnode is too far from an objective (like a CTF Flag) and the engine feels that there should be a path connecting the objective to the node.  If the problem is the first, simply unforce the path or adjust the location of the nodes.  If the problem is the second, just add some pathnodes in between.
; &quot;JumpDest has no forced paths to it&quot; : You've added a JumpSpot but have not forced any paths to it.  You must force a path to it in order for bots to notice it.
; &quot;Ladder Volume is not a ladder volume&quot; : There is no [[Legacy:Ladder (UT)|Ladder (UT)]] actor in the [[Legacy:LadderVolume|LadderVolume]].  You probably moved it accidentally, or have deleted the one that spawns there by default.
; &quot;Navigation point embedded in world geometry&quot; : You've placed a pathnode ouside of subtracted space.  Simply delete the node or move it back inside.
; &quot;Navigation point is not on valid base&quot; : You've placed a navigation point on either a mover or a nonsolid actor.  Move it to an appropriate spot on flat, solid space.
; &quot;No forced destination for this jumppad!&quot; : You've added a [[Legacy:UTJumpPad|UTJumpPad]], but have not forced a path from it to a [[Legacy:JumpSpot|JumpSpot]].  To get a UTJumpPad to work correctly, this must be done.  Remember that the UTJumpPad's Properties&gt;&gt;Navigation Point&gt;&gt;ForcedPath array must contain the actual '''name''' of the actor, '''not''' the [[Legacy:Tag|Tag]].  The name of an object is found under its Properties&gt;&gt;Object&gt;&gt;Name, and will be something like JumpSpot0.
; &quot;No navigation point associated with this mover!&quot; : If the specified mover is a lift, you have not placed a [[Legacy:LiftCenter|LiftCenter]] and/or [[Legacy:LiftExit|LiftExit]] and associated them with the mover.  If the specified mover is a door, set its Properties&gt;&gt;AI to bAutoDoor=True or bNoAIRelevance=True.  If the mover is neither, then set its Properties&gt;&gt;AI to bNoAIRelevance=True.
; &quot;Pathnode X should be JumpDest for Pathnode Y&quot; : Pathnode X is at a hard-to-reach location from Pathnode Y's position, and so a jumpspot should be placed there to make bot navigation easier.

====Rebuild Errors====
; &quot;Navigation point is too close or on too steep a slope&quot; : You've placed a navigation point too close to a steep slope or too high above the ground.  Move it to a flat, solid area, move it closer to the ground, or delete it.  Often occurs when pathing is done before terrain is finished, and the terrain is raised above the existing navigation point.
; &quot;No paths from Pathnode X&quot; : Just what it says: there are no paths to the pathnode specified.  To solve this issue, add pathnodes to connect the node in question to the rest of the network.  Occurs when paths are forced to a pathnode, or when a pathnode is at the bottom of a steep drop.  Often occurs in conjunction with the next error.
; &quot;No paths to Pathnode X&quot; : Just what it says: there are no paths from the pathnode specified.  To solve this issue, add pathnodes to connect the node in question to the rest of the network.  Occurs when paths are forced from this pathnode, or when a pathnode is at the top of a steep drop.  Often occurs in conjunction with the previous error.
; &quot;Pathnode X is too close to Pathnode Y&quot; : You may have accidentally duplicated a pathnode; just move one of the offending pathnodes away or delete it.  This error always occurs in pairs.
; &quot;May be too close to other navigation points&quot; : The actor highlighted adds to the bot path network, but is likely colliding with other bot path network actors, like NavigationPoints or Pickups.  Delete or move the highlighted actor or ones close to it.  Too many NavigationPoint actors too close together will cause AI navigation problems in game.

====Map Check Errors====
; &quot;Only X Playerstarts in map!&quot; : Probably occurs if there are less playerstarts in the map than the maximum playercount.
; &quot;Paths need to be rebuilt&quot; : Exactly what it says: rebuild your botpathing network.  This error will be shown if you use the Map Check tool after changing anything in the botpathing network until you rebuild paths.
; &quot;Path to Pathnode X is very long&amp;ndash;place a pathnode in between.&quot; : This error even gives you the solution: There are close to 1024 units between Pathnodes X and Y, and it's a little to far for bots to navigate comfortably.  Place a pathnode between the two offending nodes to solve this issue.  Often occurs in pairs.
; &quot;Playerstart not useable&quot; : Occurs if a playerstart is either hanging in midair, sitting on a mover or nonsolid brush, or embedded in a solid space.  Often coincides with other similar errors.  To fix, find the offending playerstart and move it to an appropriate location.

===Build Errors===
; &quot;Brush X has NULL material references&quot; (Map Check and Rebuild Error): You did not apply a texture to a brush.  Don't be too alarmed, because it will still have the default engine texture.  This is not an issue that must be fixed (but it's probably a good idea).  Note that the Map Check error does not specify the brush.

===Lighting Errors===
; &quot;There are no lights in this map!&quot; (Map Check Error only): If you need help to figure this one out, you should probably give up mapping right now.

==Related Topics==
* [[Legacy:Rebuild|Rebuild]]
* [[Legacy:Build|Build]]
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]

==Discussion==

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Design</title>
    <id>2084</id>
    <revision>
      <id>5074</id>
      <timestamp>2008-01-03T19:59:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''Since this page is the single most frequently spammed page on our wiki (whyever that may be), we've locked it for the time being.  If you'd like to add anything to it, please leave a note on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]].

}}

'''Map Design''', like any design, is essentially an art.  It is a personal creation by the designer that attempts to communicate with their audience.  The designer works like any other artist, to attract their audience for the purpose of further discovery.

Design for Unreal maps focuses on elements that appeal to the player and that entice the player to explore the map.

==Design Principles==

General design principles help to solidify ideas and give structure to mappers with only a vague idea.  On the macro-level, these principles help to organize the most important ideas, but they can also serve to help with the decisions made for every detail.  A design is a set of answers to the open-ended questions these principles pose.

===Theme===

The theme of a map is a combination of the setting and circumstances that make this map unique.  A map's theme can be any well-defined circumstances that influence other elements and principles of the design in a consistent way.  Most decisions made should be based on theme.  The theme is '''what''' the map seems to present to the player.

===Style===

The style of any art makes it distinctive.  For successful design, the style becomes a consistent way the various elements are communicated to the player.  Style will carry from one element, aspect or detail of the design to another in similar ways.  The style is '''how''' the map presents itself to the player.

===Balance===

Balance is an important principle to be aware of in design.  It should not always suggest perfect balance (which tends to be aesthetically boring), but instead should suggest an awareness of the balance between various elements.  A map called, &quot;King of the Hill&quot;, may indeed require a highly fortified central hill that would seem to throw the map's balance off, but it would be necessary.  The balance of a map refers to the predictable climate the player will find themself in.

See also [http://forums.unrealplayground.com/showthread.php?t=39310 Balance vs. Imbalance : An Essay About Strategy] by Blitz. 

===Variation===

Variation is an essential design principle.  Without variation, the player will experience less and have less to act upon or think about.  Variation works only when there is some patten or rhythm to vary against, perhaps even a consistent Theme, Style or Balance.  Variation is what suprises the player; it's the subject of discovery.

====Break Up Surfaces====
:Try not to let any surface be plain, add some indents, some meshes, maybe a few walking gorillas if you have to, but a plain map is a failure, even if it has good flow not many will play it.

==Mapping Elements==

These mapping elements are common terms in Unreal mapping.  They represent the framework for all map design.  By defining these terms, mappers gain a toolbox of ideas they can implement.  

===Layout===

Layout, sometimes referred to as Map [[Legacy:Architecture|Architecture]], is the term used to describe the overall shape of the map as well as the detailed interconnections between areas.  A layout is the simple &quot;floor plan&quot; of the map: how many rooms?, how big is this space?,  where do these paths lead?, etc.

See also [[Legacy:Map Flow|Map Flow]].

===Placement===

Placement of elements within the layout becomes crucial for popular gameplay.  PlayerStarts, Weapons, Items, and even Decoration and Lights, all need proper placement to appeal to the player.  PlayerStart, Weapon, Item, and [[Legacy:GameObjective|GameObjective]] placement is governed by the guideline of Risk vs Reward; the idea that for every risk a player takes, there is a reward of equal value.

====Risk vs Reward====
: As famously expounded by CliffyB, ''&quot;Put desirable things in a dangerous or exposed spot.&quot;''.  The Keg of Health or some other highly desireable item you want to place in your map should be in the most open, visible, and exposed spot you can find.  Alternately, it could be hidden from view and difficult to get to.  It should be a risk to get there, and double the risk to get back.  A fine example of this is the shield-belt and damage-amp chamber in DM-Pressure.

See also [[Legacy:Placing PlayerStart|Placing PlayerStart]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]].

===Decoration===

Decoration serves to support the player's suspension of disbelief and to draw the player into the environment.  Decoration not only includes the decorative items added to support theme and style, it also includes the decorative features and details of the architecture, particle work, skyboxes, etc.  When used consistently through a map, decoration helps to give the player a sense that the experience is real.

====Edge Trim====
: This is an example of a nice detail leading to an overall graphically pleasing map. A trimmed edge is where you put a different texture (preferably a different colour and a plain one) on the edge of the original texture, i.e. at the floor-wall corners, at the edge of ramps and walkways and on staircases. Trim can now come in mesh format as well, for example DM-Plunge, every surface that has that weird light holder has trim, and it looks so much better.

See also [[Legacy:Building With Static Meshes|Building With Static Meshes]] and [[Legacy:Texture Topics|Texture Topics]].

===Lighting===

Lighting is a critical element to communicating to the player.  Without light, the player has lost half their senses.  Each opportunity to shine light on the details of the design is a communication to the player.  Red or Blue lights talk about Team sides, a red flashing light warns of a hazard, a small spotlight beaming down on a spot in the layout beckons players to go there.

See also [[Legacy:Lighting|Lighting]], [[Legacy:Lighting Basics|Lighting Basics]] and [[Legacy:Lighting Strategies|Lighting Strategies]].

===Sound===

The other half of the player's senses is hearing; and as crucial as it is, sound is forgotten more often than not.  The sound in a map usually isn't noticed until it's not there.  It's a very powerful tool to manipulate perception.  Working in tandem with light, the player will have support for the visual communication, making things seem more real.  While sound working in contrast or discord with light, can make the players feel disengaged, disoriented or anxious.

====Create sound cues ====
: Use sounds to give away player locations.  Make each lift on the map sound slightly different.  That way a player will know when he uses a lift his opponent will know exactly where he is.  Health vials, jump boots, and other objects that make a distinctive sound can be used to place players at certain points on the map.  Shallow pools of water are also good for this.  Effective use of sound cues can make a 1-on-1 match turn into an intense tactical battle as each player tries to outmaneuver the other based upon where they hear the opponent, rather than where they see their opponent.

See also [[Legacy:AmbientSound|AmbientSound]] and [[Legacy:Triggering Sounds|Triggering Sounds]].

===Bot Support===

Bot support is an essential element of map design, especially if the map is to be released to the public.  Sometimes bots are used simply as player place-holders in servers, often bots are the only opponents a player can find for a custom map.  Bots need help to act like real players.  It is the job of the mapper to create the support system all bot players expect.  The goal of good botplay design is to allow the player to forget their bot opponent is not a human player.

See also [[Legacy:Bot Support|Bot Support]].

==External Links==
* [http://www.3dgate.com/techniques/2001/010811/0811pagan_01.html Level Design by Tito Pagán]
* [http://www.planetquake.com/aeons/on_mapping.html æon's Mapping Guide]
* [http://www.icecreamyou.com/design.html Multiplayer Design Considerations]

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Making Architecture|Making Architecture]]
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; A collection of lessons and thoughts on map making.
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] &amp;ndash; A page of general style tips
* [[Legacy:Making Trim|Making Trim]] &amp;ndash; Technical aspects of making trim

* The thorny issue of [[Legacy:Brush Deletion|Brush Deletion]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] - UT2004 only
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] - UT only
** [[Legacy:Mapping For DDOM|Mapping For DDOM]]
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:'''  Large revision done.  I've moved the pattern talk to discussion.  What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5075</id>
      <timestamp>2007-12-08T22:58:05Z</timestamp>
      <contributor>
        <ip>59.42.250.145</ip>
      </contributor>
      <minor/>
      <comment>1712158853@msn.com</comment>
      <text xml:space="preserve"> http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/adding-custom-ringtones-to-a-verizon-phone.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/alias-theme-song-ringtones-verizon-wireless.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/verizon-wireless-ring-back-tones-download.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/close-encounters-of-third-kind-verpzon-ringtones.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/download-ringtones-verizon.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/free-full-song-ringtones-for-verizon.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/free-ringtones-for-verizon-users.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/verizon-nokia-ringtone.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/free-ringtone-downloads-for-verizon.html
 http://natura.di.uminho.pt/wiki/plugin/attachments/ProjectosParaAlunos/motorola-verizon-ringtones.html</text>
    </revision>
    <revision>
      <id>5076</id>
      <timestamp>2007-12-08T23:05:27Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>revert and lock</comment>
      <text xml:space="preserve">{{innerbox| ''Since this page is the single most frequently spammed page on our wiki (whyever that may be), we've locked it for the time being.  If you'd like to add anything to it, please leave a note on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]].

}}

'''Map Design''', like any design, is essentially an art.  It is a personal creation by the designer that attempts to communicate with their audience.  The designer works like any other artist, to attract their audience for the purpose of further discovery.

Design for Unreal maps focuses on elements that appeal to the player and that entice the player to explore the map.

==Design Principles==

General design principles help to solidify ideas and give structure to mappers with only a vague idea.  On the macro-level, these principles help to organize the most important ideas, but they can also serve to help with the decisions made for every detail.  A design is a set of answers to the open-ended questions these principles pose.

===Theme===

The theme of a map is a combination of the setting and circumstances that make this map unique.  A map's theme can be any well-defined circumstances that influence other elements and principles of the design in a consistent way.  Most decisions made should be based on theme.  The theme is '''what''' the map seems to present to the player.

===Style===

The style of any art makes it distinctive.  For successful design, the style becomes a consistent way the various elements are communicated to the player.  Style will carry from one element, aspect or detail of the design to another in similar ways.  The style is '''how''' the map presents itself to the player.

===Balance===

Balance is an important principle to be aware of in design.  It should not always suggest perfect balance (which tends to be aesthetically boring), but instead should suggest an awareness of the balance between various elements.  A map called, &quot;King of the Hill&quot;, may indeed require a highly fortified central hill that would seem to throw the map's balance off, but it would be necessary.  The balance of a map refers to the predictable climate the player will find themself in.

See also [http://forums.unrealplayground.com/showthread.php?t=39310 Balance vs. Imbalance : An Essay About Strategy] by Blitz. 

===Variation===

Variation is an essential design principle.  Without variation, the player will experience less and have less to act upon or think about.  Variation works only when there is some patten or rhythm to vary against, perhaps even a consistent Theme, Style or Balance.  Variation is what suprises the player; it's the subject of discovery.

====Break Up Surfaces====
:Try not to let any surface be plain, add some indents, some meshes, maybe a few walking gorillas if you have to, but a plain map is a failure, even if it has good flow not many will play it.

==Mapping Elements==

These mapping elements are common terms in Unreal mapping.  They represent the framework for all map design.  By defining these terms, mappers gain a toolbox of ideas they can implement.  

===Layout===

Layout, sometimes referred to as Map [[Legacy:Architecture|Architecture]], is the term used to describe the overall shape of the map as well as the detailed interconnections between areas.  A layout is the simple &quot;floor plan&quot; of the map: how many rooms?, how big is this space?,  where do these paths lead?, etc.

See also [[Legacy:Map Flow|Map Flow]].

===Placement===

Placement of elements within the layout becomes crucial for popular gameplay.  PlayerStarts, Weapons, Items, and even Decoration and Lights, all need proper placement to appeal to the player.  PlayerStart, Weapon, Item, and [[Legacy:GameObjective|GameObjective]] placement is governed by the guideline of Risk vs Reward; the idea that for every risk a player takes, there is a reward of equal value.

====Risk vs Reward====
: As famously expounded by CliffyB, ''&quot;Put desirable things in a dangerous or exposed spot.&quot;''.  The Keg of Health or some other highly desireable item you want to place in your map should be in the most open, visible, and exposed spot you can find.  Alternately, it could be hidden from view and difficult to get to.  It should be a risk to get there, and double the risk to get back.  A fine example of this is the shield-belt and damage-amp chamber in DM-Pressure.

See also [[Legacy:Placing PlayerStart|Placing PlayerStart]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]].

===Decoration===

Decoration serves to support the player's suspension of disbelief and to draw the player into the environment.  Decoration not only includes the decorative items added to support theme and style, it also includes the decorative features and details of the architecture, particle work, skyboxes, etc.  When used consistently through a map, decoration helps to give the player a sense that the experience is real.

====Edge Trim====
: This is an example of a nice detail leading to an overall graphically pleasing map. A trimmed edge is where you put a different texture (preferably a different colour and a plain one) on the edge of the original texture, i.e. at the floor-wall corners, at the edge of ramps and walkways and on staircases. Trim can now come in mesh format as well, for example DM-Plunge, every surface that has that weird light holder has trim, and it looks so much better.

See also [[Legacy:Building With Static Meshes|Building With Static Meshes]] and [[Legacy:Texture Topics|Texture Topics]].

===Lighting===

Lighting is a critical element to communicating to the player.  Without light, the player has lost half their senses.  Each opportunity to shine light on the details of the design is a communication to the player.  Red or Blue lights talk about Team sides, a red flashing light warns of a hazard, a small spotlight beaming down on a spot in the layout beckons players to go there.

See also [[Legacy:Lighting|Lighting]], [[Legacy:Lighting Basics|Lighting Basics]] and [[Legacy:Lighting Strategies|Lighting Strategies]].

===Sound===

The other half of the player's senses is hearing; and as crucial as it is, sound is forgotten more often than not.  The sound in a map usually isn't noticed until it's not there.  It's a very powerful tool to manipulate perception.  Working in tandem with light, the player will have support for the visual communication, making things seem more real.  While sound working in contrast or discord with light, can make the players feel disengaged, disoriented or anxious.

====Create sound cues ====
: Use sounds to give away player locations.  Make each lift on the map sound slightly different.  That way a player will know when he uses a lift his opponent will know exactly where he is.  Health vials, jump boots, and other objects that make a distinctive sound can be used to place players at certain points on the map.  Shallow pools of water are also good for this.  Effective use of sound cues can make a 1-on-1 match turn into an intense tactical battle as each player tries to outmaneuver the other based upon where they hear the opponent, rather than where they see their opponent.

See also [[Legacy:AmbientSound|AmbientSound]] and [[Legacy:Triggering Sounds|Triggering Sounds]].

===Bot Support===

Bot support is an essential element of map design, especially if the map is to be released to the public.  Sometimes bots are used simply as player place-holders in servers, often bots are the only opponents a player can find for a custom map.  Bots need help to act like real players.  It is the job of the mapper to create the support system all bot players expect.  The goal of good botplay design is to allow the player to forget their bot opponent is not a human player.

See also [[Legacy:Bot Support|Bot Support]].

==External Links==
* [http://www.3dgate.com/techniques/2001/010811/0811pagan_01.html Level Design by Tito Pagán]
* [http://www.planetquake.com/aeons/on_mapping.html æon's Mapping Guide]
* [http://www.icecreamyou.com/Design.htm Multiplayer Design Considerations]

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Making Architecture|Making Architecture]]
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; A collection of lessons and thoughts on map making.
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] &amp;ndash; A page of general style tips
* [[Legacy:Making Trim|Making Trim]] &amp;ndash; Technical aspects of making trim

* The thorny issue of [[Legacy:Brush Deletion|Brush Deletion]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] - UT2004 only
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] - UT only
** [[Legacy:Mapping For DDOM|Mapping For DDOM]]
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:'''  Large revision done.  I've moved the pattern talk to discussion.  What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>12637</id>
      <timestamp>2008-05-13T18:07:19Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <minor/>
      <comment>link fix</comment>
      <text xml:space="preserve">{{innerbox| ''Since this page is the single most frequently spammed page on our wiki (whyever that may be), we've locked it for the time being.  If you'd like to add anything to it, please leave a note on [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]].

}}

'''Map Design''', like any design, is essentially an art.  It is a personal creation by the designer that attempts to communicate with their audience.  The designer works like any other artist, to attract their audience for the purpose of further discovery.

Design for Unreal maps focuses on elements that appeal to the player and that entice the player to explore the map.

==Design Principles==

General design principles help to solidify ideas and give structure to mappers with only a vague idea.  On the macro-level, these principles help to organize the most important ideas, but they can also serve to help with the decisions made for every detail.  A design is a set of answers to the open-ended questions these principles pose.

===Theme===

The theme of a map is a combination of the setting and circumstances that make this map unique.  A map's theme can be any well-defined circumstances that influence other elements and principles of the design in a consistent way.  Most decisions made should be based on theme.  The theme is '''what''' the map seems to present to the player.

===Style===

The style of any art makes it distinctive.  For successful design, the style becomes a consistent way the various elements are communicated to the player.  Style will carry from one element, aspect or detail of the design to another in similar ways.  The style is '''how''' the map presents itself to the player.

===Balance===

Balance is an important principle to be aware of in design.  It should not always suggest perfect balance (which tends to be aesthetically boring), but instead should suggest an awareness of the balance between various elements.  A map called, &quot;King of the Hill&quot;, may indeed require a highly fortified central hill that would seem to throw the map's balance off, but it would be necessary.  The balance of a map refers to the predictable climate the player will find themself in.

See also [http://unrealplayground.com/forums/showthread.php?t=39310 Balance vs. Imbalance : An Essay About Strategy] by Blitz. 

===Variation===

Variation is an essential design principle.  Without variation, the player will experience less and have less to act upon or think about.  Variation works only when there is some patten or rhythm to vary against, perhaps even a consistent Theme, Style or Balance.  Variation is what suprises the player; it's the subject of discovery.

====Break Up Surfaces====
:Try not to let any surface be plain, add some indents, some meshes, maybe a few walking gorillas if you have to, but a plain map is a failure, even if it has good flow not many will play it.

==Mapping Elements==

These mapping elements are common terms in Unreal mapping.  They represent the framework for all map design.  By defining these terms, mappers gain a toolbox of ideas they can implement.  

===Layout===

Layout, sometimes referred to as Map [[Legacy:Architecture|Architecture]], is the term used to describe the overall shape of the map as well as the detailed interconnections between areas.  A layout is the simple &quot;floor plan&quot; of the map: how many rooms?, how big is this space?,  where do these paths lead?, etc.

See also [[Legacy:Map Flow|Map Flow]].

===Placement===

Placement of elements within the layout becomes crucial for popular gameplay.  PlayerStarts, Weapons, Items, and even Decoration and Lights, all need proper placement to appeal to the player.  PlayerStart, Weapon, Item, and [[Legacy:GameObjective|GameObjective]] placement is governed by the guideline of Risk vs Reward; the idea that for every risk a player takes, there is a reward of equal value.

====Risk vs Reward====
: As famously expounded by CliffyB, ''&quot;Put desirable things in a dangerous or exposed spot.&quot;''.  The Keg of Health or some other highly desireable item you want to place in your map should be in the most open, visible, and exposed spot you can find.  Alternately, it could be hidden from view and difficult to get to.  It should be a risk to get there, and double the risk to get back.  A fine example of this is the shield-belt and damage-amp chamber in DM-Pressure.

See also [[Legacy:Placing PlayerStart|Placing PlayerStart]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]].

===Decoration===

Decoration serves to support the player's suspension of disbelief and to draw the player into the environment.  Decoration not only includes the decorative items added to support theme and style, it also includes the decorative features and details of the architecture, particle work, skyboxes, etc.  When used consistently through a map, decoration helps to give the player a sense that the experience is real.

====Edge Trim====
: This is an example of a nice detail leading to an overall graphically pleasing map. A trimmed edge is where you put a different texture (preferably a different colour and a plain one) on the edge of the original texture, i.e. at the floor-wall corners, at the edge of ramps and walkways and on staircases. Trim can now come in mesh format as well, for example DM-Plunge, every surface that has that weird light holder has trim, and it looks so much better.

See also [[Legacy:Building With Static Meshes|Building With Static Meshes]] and [[Legacy:Texture Topics|Texture Topics]].

===Lighting===

Lighting is a critical element to communicating to the player.  Without light, the player has lost half their senses.  Each opportunity to shine light on the details of the design is a communication to the player.  Red or Blue lights talk about Team sides, a red flashing light warns of a hazard, a small spotlight beaming down on a spot in the layout beckons players to go there.

See also [[Legacy:Lighting|Lighting]], [[Legacy:Lighting Basics|Lighting Basics]] and [[Legacy:Lighting Strategies|Lighting Strategies]].

===Sound===

The other half of the player's senses is hearing; and as crucial as it is, sound is forgotten more often than not.  The sound in a map usually isn't noticed until it's not there.  It's a very powerful tool to manipulate perception.  Working in tandem with light, the player will have support for the visual communication, making things seem more real.  While sound working in contrast or discord with light, can make the players feel disengaged, disoriented or anxious.

====Create sound cues ====
: Use sounds to give away player locations.  Make each lift on the map sound slightly different.  That way a player will know when he uses a lift his opponent will know exactly where he is.  Health vials, jump boots, and other objects that make a distinctive sound can be used to place players at certain points on the map.  Shallow pools of water are also good for this.  Effective use of sound cues can make a 1-on-1 match turn into an intense tactical battle as each player tries to outmaneuver the other based upon where they hear the opponent, rather than where they see their opponent.

See also [[Legacy:AmbientSound|AmbientSound]] and [[Legacy:Triggering Sounds|Triggering Sounds]].

===Bot Support===

Bot support is an essential element of map design, especially if the map is to be released to the public.  Sometimes bots are used simply as player place-holders in servers, often bots are the only opponents a player can find for a custom map.  Bots need help to act like real players.  It is the job of the mapper to create the support system all bot players expect.  The goal of good botplay design is to allow the player to forget their bot opponent is not a human player.

See also [[Legacy:Bot Support|Bot Support]].

==External Links==
* [http://www.3dgate.com/techniques/2001/010811/0811pagan_01.html Level Design by Tito Pagán]
* [http://www.planetquake.com/aeons/on_mapping.html æon's Mapping Guide]
* [http://www.icecreamyou.com/design.html Multiplayer Design Considerations]

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Making Architecture|Making Architecture]]
* [[Legacy:Mapping Lessons|Mapping Lessons]] &amp;ndash; A collection of lessons and thoughts on map making.
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]] &amp;ndash; A page of general style tips
* [[Legacy:Making Trim|Making Trim]] &amp;ndash; Technical aspects of making trim

* The thorny issue of [[Legacy:Brush Deletion|Brush Deletion]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] - UT2004 only
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] - UT only
** [[Legacy:Mapping For DDOM|Mapping For DDOM]]
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:'''  Large revision done.  I've moved the pattern talk to discussion.  What do you think?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Design/Discussion</title>
    <id>2246</id>
    <revision>
      <id>5425</id>
      <timestamp>2008-03-10T16:08:50Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Since [[Legacy:Map Design|Map Design]] is, for whatever reason that may be, the single most frequently spammed page on our wiki, we've locked it for the time being. If you'd like to add or modify anything about it, please '''leave a note here.'''

My Design tutorial referenced on this page, Multiplayer Design Considerations, has changed its URL.  It is now located at http://www.icecreamyou.com/design.html - thanks.  &amp;ndash;[[Legacy:IceCreamYou|IceCreamYou]]

'''SuperApe:''' Link Revision

Under Design Principles -&gt; Balance, a line to a link on Balance needs revising:

&quot;See also [Balance vs. Imbalance : An Essay About Strategy] by Blitz.&quot;, should now point to: http://unrealplayground.com/forums/showthread.php?t=39310

UnrealPlayground recently revised their file structure.

Thanks.

-SuperApe-</text>
    </revision>
    <revision>
      <id>5426</id>
      <timestamp>2007-12-08T23:07:26Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Since [[Legacy:Map Design|Map Design]] is, for whatever reason that may be, the single most frequently spammed page on our wiki, we've locked it for the time being. If you'd like to add or modify anything about it, please '''leave a note here.'''</text>
    </revision>
    <revision>
      <id>5427</id>
      <timestamp>2008-01-03T16:06:55Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <minor/>
      <comment>forgot to add my name :-/</comment>
      <text xml:space="preserve">Since [[Legacy:Map Design|Map Design]] is, for whatever reason that may be, the single most frequently spammed page on our wiki, we've locked it for the time being. If you'd like to add or modify anything about it, please '''leave a note here.'''

My Design tutorial referenced on this page, Multiplayer Design Considerations, has changed its URL.  It is now located at http://www.icecreamyou.com/design.html - thanks.  &amp;ndash;[[Legacy:IceCreamYou|IceCreamYou]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map File</title>
    <id>1786</id>
    <revision>
      <id>4382</id>
      <timestamp>2008-03-20T17:34:30Z</timestamp>
      <contributor>
        <ip>78-56-57-236.ip.zebra.lt</ip>
      </contributor>
      <comment>* Unreal 2 format added</comment>
      <text xml:space="preserve">A '''Map file''' is just like any other [[Legacy:Unreal Engine|Unreal Engine]] file [[Legacy:Package|package]]s.  Being a package they can contain all types of resources; the .unr file extension is merely a convention to denote &quot;this package contains brushes and actors that make a playable map.&quot;

Check [http://www.acordero.org Antonio Cordero's website] for a pretty thorough documentation of the [http://www.acordero.org/projects/utpf/ Unreal package format] and a Delphi unit that implements it.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Game'''''
| style=&quot;text-align: center&quot; |'''''File Extension''''' 
|-
|[[Legacy:Unreal|Unreal]]&lt;br /&gt;[[Legacy:Unreal Tournament|Unreal Tournament]]
|.UNR 
|-
|[[Legacy:Unreal 2|Unreal 2]]
|.UN2 
|-
|[[Legacy:UT2003|UT2003]]&lt;br /&gt;[[Legacy:UT2004|UT2004]]
|.UT2 
|-
|[[Legacy:DeusEx|DeusEx]]
|.DX 
|}

==Related Topics==
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:File Format|File Format]]
* [[Legacy:Package|Package]]
* [[Legacy:Package File Format|Package File Format]]
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]</text>
    </revision>
    <revision>
      <id>4383</id>
      <timestamp>2006-12-31T09:00:45Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>found it!</comment>
      <text xml:space="preserve">A '''Map file''' is just like any other [[Legacy:Unreal Engine|Unreal Engine]] file [[Legacy:Package|package]]s.  Being a package they can contain all types of resources; the .unr file extension is merely a convention to denote &quot;this package contains brushes and actors that make a playable map.&quot;

Check [http://www.acordero.org Antonio Cordero's website] for a pretty thorough documentation of the [http://www.acordero.org/projects/utpf/ Unreal package format] and a Delphi unit that implements it.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''''Game'''''
| style=&quot;text-align: center&quot; |'''''File Extension''''' 
|-
|[[Legacy:Unreal|Unreal]]&lt;br /&gt;[[Legacy:Unreal Tournament|Unreal Tournament]]
|.UNR 
|-
|[[Legacy:UT2003|UT2003]]&lt;br /&gt;[[Legacy:UT2004|UT2004]]
|.UT2 
|-
|[[Legacy:DeusEx|DeusEx]]
|.DX 
|}

==Related Topics==
* [[Legacy:Unreal Engine|Unreal Engine]]
* [[Legacy:File Format|File Format]]
* [[Legacy:Package|Package]]
* [[Legacy:Package File Format|Package File Format]]
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map File Prefix</title>
    <id>2149</id>
    <revision>
      <id>5232</id>
      <timestamp>2006-09-12T23:08:38Z</timestamp>
      <contributor>
        <ip>192.251.69.13</ip>
      </contributor>
      <minor/>
      <comment>Added OSM. :) --SuperApe</comment>
      <text xml:space="preserve">In the Unreal Tournament games, the list of maps displayed for a particular [[Legacy:Gametype|gametype]] is determined by the '''map prefix''' on the filename. So if you want a map to appear in the game interface, its filename (up to the file extension) must be of the form:

 PREFIX-ActualName

The prefixes are:

* '''''AS''''' = Assault (UT, UT2004)
* '''''BR''''' = Bombing Run (UT200x)
* '''''CTF''''' = Capture the Flag
* '''''VCTF''''' = Vehicle Capture the Flag (UT2004)
* '''''DOM''''' = Domination (UT), Double-Domination (UT200x)
* '''''DM''''' = Deathmatch
* '''''ONS''''' = Onslaught (UT2004)

For example:
 BR-MyMap
 DM-AnotherMap

Some mods introduce their own prefixes, such as '''''RA-''''' for Rocket Arena, '''''JB-''''' for [[Legacy:Jailbreak|Jailbreak]] and '''''OSM-''''' for [[Legacy:SuperApe/Mapping_For_OSM_Adventure|OSM Adventure]].

Note that setting this prefix ''doesn't'' tell the map itself what gametype it is, you need to set the [[Legacy:Level Properties|Level properties]] for that!

The prefix should always be capitalised or there will be problems with mapvote and linux based download redirect servers. Mapvote capitalises the prefix as part of its prefix changing logic, the UT server will find the file with lower case prefix because of its case insensitive match but the web server will not. Depending on server settings this will result in either a stream download (slow) or a refused to send error.

==Related Topics==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Map Planning|Map Planning]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5233</id>
      <timestamp>2005-12-18T00:52:53Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">In the Unreal Tournament games, the list of maps displayed for a particular [[Legacy:Gametype|gametype]] is determined by the '''map prefix''' on the filename. So if you want a map to appear in the game interface, its filename (up to the file extension) must be of the form:

 PREFIX-ActualName

The prefixes are:

* '''''AS''''' = Assault (UT, UT2004)
* '''''BR''''' = Bombing Run (UT200x)
* '''''CTF''''' = Capture the Flag
* '''''VCTF''''' = Vehicle Capture the Flag (UT2004)
* '''''DOM''''' = Domination (UT), Double-Domination (UT200x)
* '''''DM''''' = Deathmatch
* '''''ONS''''' = Onslaught (UT2004)

For example:
 BR-MyMap
 DM-AnotherMap

Some mods introduce their own prefixes, such as '''''RA-''''' for Rocket Arena and '''''JB-''''' for [[Legacy:Jailbreak|Jailbreak]].

Note that setting this prefix ''doesn't'' tell the map itself what gametype it is, you need to set the [[Legacy:Level Properties|Level properties]] for that!

==Related Topics==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Map Planning|Map Planning]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5234</id>
      <timestamp>2006-09-12T23:02:00Z</timestamp>
      <contributor>
        <ip>Webcache00.lnd.ops.eu.uu.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In the Unreal Tournament games, the list of maps displayed for a particular [[Legacy:Gametype|gametype]] is determined by the '''map prefix''' on the filename. So if you want a map to appear in the game interface, its filename (up to the file extension) must be of the form:

 PREFIX-ActualName

The prefixes are:

* '''''AS''''' = Assault (UT, UT2004)
* '''''BR''''' = Bombing Run (UT200x)
* '''''CTF''''' = Capture the Flag
* '''''VCTF''''' = Vehicle Capture the Flag (UT2004)
* '''''DOM''''' = Domination (UT), Double-Domination (UT200x)
* '''''DM''''' = Deathmatch
* '''''ONS''''' = Onslaught (UT2004)

For example:
 BR-MyMap
 DM-AnotherMap

Some mods introduce their own prefixes, such as '''''RA-''''' for Rocket Arena and '''''JB-''''' for [[Legacy:Jailbreak|Jailbreak]].

Note that setting this prefix ''doesn't'' tell the map itself what gametype it is, you need to set the [[Legacy:Level Properties|Level properties]] for that!

The prefix should always be capitalised or there will be problems with mapvote and linux based download redirect servers. Mapvote capitalises the prefix as part of its prefix changing logic, the UT server will find the file with lower case prefix because of its case insensitive match but the web server will not. Depending on server settings this will result in either a stream download (slow) or a refused to send error.

==Related Topics==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Map Planning|Map Planning]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Filesize</title>
    <id>2179</id>
    <revision>
      <id>5291</id>
      <timestamp>2004-07-21T07:57:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The average filesize of maps has rocketed since the release of UT2003. 

Some tips for reducing the size of your map:

* set all unseen [[Legacy:BSP Surface|BSP surface]]s to unlit (those completely behind static meshes or terrain)
*set bsp surfaces where shadow detail is not needed to 256
*rebuilding lighting with [[Legacy:DXT|DXT]]1 compression
*compress all (custom) textures that don't need an alpha channel to DXT1</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Flow</title>
    <id>1822</id>
    <revision>
      <id>4471</id>
      <timestamp>2008-02-11T13:37:03Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Map flow''' is a somewhat subjective term.  It could be defined as the sum value of the potential movements, actions and strategies a map has.  Making it even harder to define, map flow also shares several elements from other map design principles.  Generally, the principles have to do with layout and object placement, but they are also tied to psychology and timing.  The unifying goal for all principles that make up map flow is to maximize the replay value of the given map.

==General Navigation ==

The manifestation of Map Flow is usually thought of as an imaginary river or wind flowing through the map.  Where the flow is congested, turbulent, or imbalanced is where the map will frustrate players the most in terms of navigation.

===An Open Map and a Variety of Routes===

If a player can see it, they should be able to reach it very easily and without backtracking.  Players should be able to get anywhere in a map very quickly.  The space should also include more than one way to get to and from main landmarks.  These ideas promote both an immediate engagement with the map's strategies and a long-term exploration of alternate tactics.

===Free Movements ===

{{innerbox| Nothing is worse than running with the flag and then getting stuck on a little decorative rock that looks so nice and pretty sitting there, but is a death trap for anyone that tries to run over it.  &amp;rarr;''Hanover_Fist''

}}

&quot;Sticky&quot; spots prevent obvious navigation when the game engine's collision detection gets in the way.  This happens more often with static meshes, but can also happen with steeper sections of terrain and in tight spaces made of BSP.  Make sure doorways, pathways, tunnels and crawlspaces are big enough to move through in a firefight. See also [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].  Playtest these areas with the idea that players will be more concerned about combat than traveling in smooth, central paths.  Playtest the edges of your pathways, extra rough spots of terrain, and the areas with heavy decoration, then place low-poly blocking volumes to replace any sticky static mesh collision and discreetly cover (or just smooth) any terrain collision you find not working well.

===Dead Ends, Hazards, and Risk vs Reward ===

Risk vs Reward is the concept that there is a balance between the risks a player must take and the rewards the player will recieve if those risks are succesfull.  A hidden deathtrap in a main corridor or a safe pile of powerups in front of a PlayerStart are examples of situations that are out of balance.

A dead end can either enhance or ruin a map depending on the situation.  Dead ends can provide a focus point for combat if they are used to hold control points and flag bases in CTF and DOM [[Legacy:Gametype|gametype]]s.  The worst thing you can do as a mapper is force the hunted into an area of no escape; waiting for death, while the hunter launches projectiles into the dead end.  This requires no skill for the hunter and it aggrevates the hunted.  Provide extra ways either in or out of the area or make the dead end quick to reach and retreat from.  Above all remember to balance the risk with reward by placing a strong powerup or weapon inside a dead end.  Hazards suchs as open lava pools, dangerous heavy machinery or large drop-offs should be given the same Risk vs Reward considerations.

===Interconnectivity===

Interconnectivity has to do with the varied connections between the areas of a map.  Having more than two ways in or out of a space ensures multiple tactics in Navigation.  Players will be aware of these extra routes as escape routes, ambush points, sniper positions, and usable cover.  This principle can also eliminate &quot;perfect&quot; sniper positions by forcing the sniper to look over their shoulder.  In the extreme, this principle can be overdone, making the map lose some of the variation or definition between areas, as if it were only one space.

===Side Passages, Escape Routes, and Cover===

While players move from one area to another, there will inevitably be combat.  In situations under fire, players seek cover to block the line of fire of their opponent, while lining up their own clear shot.  Long stretches of space without usable cover, side passages or corners will frustrate players in the heat of combat.  Useable cover includes features a player can use to block enemy fire, and usually block their line of sight as well.

===Rewarding Special Moves===

Special moves such as the Translocate, Dodge, DoubleJump, ImpactJump and LiftJump use a higher than novice skill.  Couple these skills with a knowledge of a map that rewards special moves, and players are given the opportunity to PWN (dominate) unsuspecting opponents.  Rewards for such moves can be everything from access to a shortcut, to getting them through a narrow escape route.  The various Jump moves can reward players by getting them to an out-of-reach ledge with a special item on it.

==The Z-Axis==

These are the elements of the layout that take advantage of vertical site lines, vertical movement and vertical combat.  [[Legacy:Z-Axis|Z-axis]] has a page all to itself.

==Predictability==

Players in any game require some certainty in order to plan ahead.  In Map Flow, certainty comes from predictable events and structure.

===Framerates and Optimization===

Before you start building a map, decide the maximum players it should hold in the heat of battle.  This is the single most important factor in framerate perfomance, given large overhead for player models, weapons fire, personal effects and gore.  If the map holds too many players fighting in one area, your map's performance will suffer and so will the players; especially online.  Optimize thoroughly to ensure the player's experience is smooth throughout and your carefully timed elements are not interfered with.

===Balance of Power, No Perfect Sniper Positions===

Here a map with good flow is essentially balanced for combat between players.  In such a map, no player will accidentally gain a severe tactical advantage or disadvantage.  No sniper position will be &quot;perfect&quot;; that is, easily defendable, difficult to assault.  No spot on the map should be an easy target without sufficient reward value.  Of course, no team game maps should have inherit advantages for one team over another.  Within this balance, provide some variety of PlayerStart positions, including a safe spots or item stashes as well as hazardous or frontline areas.  See also [[Legacy:Placing PlayerStart|Placing PlayerStart]]

===Sound cues, Triggered Events, and Item Placement===

Use triggered sounds like water puddles that splash or carefully place items like health vials to create sound cues near special areas.  Any detectable event that is triggered by player movement through a space will work.  Doors often serve this purpose well, as they usually make distinct sounds and they delineate two different areas.  These are great ways to add potential risk to high-traffic or particularly attractive areas.  See also [[Legacy:Triggering Sounds|Triggering Sounds]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]].

===Patterns of Rhythm and Form===

Players recognize patterns easily and use them to their advantage.  A regular series of spaces or a regular measure of time can allow players to predict each other's movements or changes in the environment.  A regular loud sound can cover the sounds of a player's actions.  After going through a series of rooms with the same shape, a team can hone their tactics as they advance.  A symetrical map can help players learn a large map in half the time.  

===Clear Goals===

It shouldn't be a complete mystery how to succeed in a map.  If there are strategically critical positions to hold, they should be almost immediately obvious to the player entering the map for the first time.  A player will want to devise successfull attacking or defending plans while getting the first impressions of a map's layout.

===Building Goals Towards a SuperGoal===

A heightened sense of achievement comes from an accumulation of efforts.  If a map's design uses a progression of actions or challenges to achieve a climax with sufficient reward value, the players will feel more involved and satisfied with their efforts.  The rewards can either help the player or hurt their opponent.  The Assault (AS) and Onslaught (ONS) gameTypes have this progession of goals clearly built into the rules of the game, but other [[Legacy:Gametype|gametype]]s can impress players by using the same idea in unique ways.

==Action==

Action is change over time and is a term used to describe conditions changing at an irregular pace or direction.  Whether the players change or the environment changes, action is what players need to experience in order to feel satisfied with the game.  In many ways, the principle of Action conflicts with the principle of Predictability, and a balance must be struck.  Although action typically implies movement, any apparent change qualifies as action.

===Variation in Space and Timing===

Variation is a designers best friend.  Here it's the player's perpception of the environment that changes.  As a player is aware of the map, their perpection of the space they're in changes when they move from space to space.  The change from a narrow hallway to a wide room gives a perceptual change that registers as action to the player.  Random timing can increase tension or danger and serve to make experiences more organic.  An irregular water drip will give a listening player a greater sense of purpose, to find a pattern, and a greater sense of satisfaction when they come to the conclusions the pattern is complex or there is no pattern.

===Keep Up the Pace===

Keeping the pace alive is an old secret to success in performance.  Your audience, the players, don't want to wait for the next thing to happen, the next thing should be waiting for them.  Make sure lifts don't take too long to ride, spaces aren't too long without some change, and progressions of predicatble events don't take too long to complete.

===Use of Layout to Create Suspense===

One of the most subtle forms of action is a change in mood.  The player can be in the most familiar surroundings and yet their experience can change drastically by their level of anger, joy or fear.  By making sure a sniper position includes an alternate entrance that just happens to be behind the sniper, you've created tension.  By giving the opponent several routes to attack the base, you've created potential fear for defending players.  By having regular intervals or events end in a strange or unpredictable way, you've created suspense for the player paying attention.

===Suprises and Discovery===

No player wants to experience &quot;the same old thing&quot;.  If suprises can happen and the player can discover new features of the map, the impulse will be there to replay the map.  While a suprise shouldn't happen so often as to become ordinary, it will have to be noticed to be effective.  In performance, the promise of suprise and discovery is called, &quot;the hook&quot;.  The hook can be anything from a cryptic map description, to in-game clues, to blatant advertisement of a secret in the map.

==Related Topics ==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]

==Discussion==

'''SuperApe:''' What do you think?

'''Kedren:''' I think it sums things up very neatly.

'''SuperApe:''' Dear, 129.19.1.147.  Can you revise your contribution to be less &quot;personal&quot;, more generalized?  If you can't sum up your point in one sentence, this is likely a less concrete issue or one that is already covered.  This page includes larger concepts, but is not meant to be a grocery list of examples or personal favorites.  More generalized is more helpful to everyone, whether casually reading or doing research.  Your contribution has been moved here to discussion for review and possible revision.

'''129.19.1.147:''' Arena layout

The layout of the arena plays a large part in the action. Maps can be quiet, good for snipers, good for flak cannons, or just plain bloody. A good example of an extremely active map is Blood Core Arena (CTF-Bloodcore, UT). You can't go ten feet without running into an enemy. It is an intense, bloody map. My personal congratulations to Jan Kohnert.

On the other hand, there are maps like Hall of Giants (CTF-HallOfGiants) and Facing Worlds. They are large, open, and quiet. (You can't even snipe all the way across Hall of Giants.) Then there are bad maps, like DM-BattleArena. I hope this was taken out of UT2kx, because in UT, it was terrible. All the action is on the ground floor because there is nothing interesting on the upper levels. I guess this is what you would call a 'killbox'.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4472</id>
      <timestamp>2008-02-09T20:36:27Z</timestamp>
      <contributor>
        <ip>129.19.1.147</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Map flow''' is a somewhat subjective term.  It could be defined as the sum value of the potential movements, actions and strategies a map has.  Making it even harder to define, map flow also shares several elements from other map design principles.  Generally, the principles have to do with layout and object placement, but they are also tied to psychology and timing.  The unifying goal for all principles that make up map flow is to maximize the replay value of the given map.

==General Navigation ==

The manifestation of Map Flow is usually thought of as an imaginary river or wind flowing through the map.  Where the flow is congested, turbulent, or imbalanced is where the map will frustrate players the most in terms of navigation.

===An Open Map and a Variety of Routes===

If a player can see it, they should be able to reach it very easily and without backtracking.  Players should be able to get anywhere in a map very quickly.  The space should also include more than one way to get to and from main landmarks.  These ideas promote both an immediate engagement with the map's strategies and a long-term exploration of alternate tactics.

===Free Movements ===

{{innerbox| Nothing is worse than running with the flag and then getting stuck on a little decorative rock that looks so nice and pretty sitting there, but is a death trap for anyone that tries to run over it.  &amp;rarr;''Hanover_Fist''

}}

&quot;Sticky&quot; spots prevent obvious navigation when the game engine's collision detection gets in the way.  This happens more often with static meshes, but can also happen with steeper sections of terrain and in tight spaces made of BSP.  Make sure doorways, pathways, tunnels and crawlspaces are big enough to move through in a firefight. See also [[Legacy:General Scale And Dimensions|General Scale and Dimensions]].  Playtest these areas with the idea that players will be more concerned about combat than traveling in smooth, central paths.  Playtest the edges of your pathways, extra rough spots of terrain, and the areas with heavy decoration, then place low-poly blocking volumes to replace any sticky static mesh collision and discreetly cover (or just smooth) any terrain collision you find not working well.

===Dead Ends, Hazards, and Risk vs Reward ===

Risk vs Reward is the concept that there is a balance between the risks a player must take and the rewards the player will recieve if those risks are succesfull.  A hidden deathtrap in a main corridor or a safe pile of powerups in front of a PlayerStart are examples of situations that are out of balance.

A dead end can either enhance or ruin a map depending on the situation.  Dead ends can provide a focus point for combat if they are used to hold control points and flag bases in CTF and DOM [[Legacy:Gametype|gametype]]s.  The worst thing you can do as a mapper is force the hunted into an area of no escape; waiting for death, while the hunter launches projectiles into the dead end.  This requires no skill for the hunter and it aggrevates the hunted.  Provide extra ways either in or out of the area or make the dead end quick to reach and retreat from.  Above all remember to balance the risk with reward by placing a strong powerup or weapon inside a dead end.  Hazards suchs as open lava pools, dangerous heavy machinery or large drop-offs should be given the same Risk vs Reward considerations.

===Interconnectivity===

Interconnectivity has to do with the varied connections between the areas of a map.  Having more than two ways in or out of a space ensures multiple tactics in Navigation.  Players will be aware of these extra routes as escape routes, ambush points, sniper positions, and usable cover.  This principle can also eliminate &quot;perfect&quot; sniper positions by forcing the sniper to look over their shoulder.  In the extreme, this principle can be overdone, making the map lose some of the variation or definition between areas, as if it were only one space.

===Side Passages, Escape Routes, and Cover===

While players move from one area to another, there will inevitably be combat.  In situations under fire, players seek cover to block the line of fire of their opponent, while lining up their own clear shot.  Long stretches of space without usable cover, side passages or corners will frustrate players in the heat of combat.  Useable cover includes features a player can use to block enemy fire, and usually block their line of sight as well.

===Rewarding Special Moves===

Special moves such as the Translocate, Dodge, DoubleJump, ImpactJump and LiftJump use a higher than novice skill.  Couple these skills with a knowledge of a map that rewards special moves, and players are given the opportunity to PWN (dominate) unsuspecting opponents.  Rewards for such moves can be everything from access to a shortcut, to getting them through a narrow escape route.  The various Jump moves can reward players by getting them to an out-of-reach ledge with a special item on it.

==The Z-Axis==

These are the elements of the layout that take advantage of vertical site lines, vertical movement and vertical combat.  [[Legacy:Z-Axis|Z-axis]] has a page all to itself.

==Predictability==

Players in any game require some certainty in order to plan ahead.  In Map Flow, certainty comes from predictable events and structure.

===Framerates and Optimization===

Before you start building a map, decide the maximum players it should hold in the heat of battle.  This is the single most important factor in framerate perfomance, given large overhead for player models, weapons fire, personal effects and gore.  If the map holds too many players fighting in one area, your map's performance will suffer and so will the players; especially online.  Optimize thoroughly to ensure the player's experience is smooth throughout and your carefully timed elements are not interfered with.

===Balance of Power, No Perfect Sniper Positions===

Here a map with good flow is essentially balanced for combat between players.  In such a map, no player will accidentally gain a severe tactical advantage or disadvantage.  No sniper position will be &quot;perfect&quot;; that is, easily defendable, difficult to assault.  No spot on the map should be an easy target without sufficient reward value.  Of course, no team game maps should have inherit advantages for one team over another.  Within this balance, provide some variety of PlayerStart positions, including a safe spots or item stashes as well as hazardous or frontline areas.  See also [[Legacy:Placing PlayerStart|Placing PlayerStart]]

===Sound cues, Triggered Events, and Item Placement===

Use triggered sounds like water puddles that splash or carefully place items like health vials to create sound cues near special areas.  Any detectable event that is triggered by player movement through a space will work.  Doors often serve this purpose well, as they usually make distinct sounds and they delineate two different areas.  These are great ways to add potential risk to high-traffic or particularly attractive areas.  See also [[Legacy:Triggering Sounds|Triggering Sounds]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]].

===Patterns of Rhythm and Form===

Players recognize patterns easily and use them to their advantage.  A regular series of spaces or a regular measure of time can allow players to predict each other's movements or changes in the environment.  A regular loud sound can cover the sounds of a player's actions.  After going through a series of rooms with the same shape, a team can hone their tactics as they advance.  A symetrical map can help players learn a large map in half the time.  

===Clear Goals===

It shouldn't be a complete mystery how to succeed in a map.  If there are strategically critical positions to hold, they should be almost immediately obvious to the player entering the map for the first time.  A player will want to devise successfull attacking or defending plans while getting the first impressions of a map's layout.

===Building Goals Towards a SuperGoal===

A heightened sense of achievement comes from an accumulation of efforts.  If a map's design uses a progression of actions or challenges to achieve a climax with sufficient reward value, the players will feel more involved and satisfied with their efforts.  The rewards can either help the player or hurt their opponent.  The Assault (AS) and Onslaught (ONS) gameTypes have this progession of goals clearly built into the rules of the game, but other [[Legacy:Gametype|gametype]]s can impress players by using the same idea in unique ways.

==Action==

Action is change over time and is a term used to describe conditions changing at an irregular pace or direction.  Whether the players change or the environment changes, action is what players need to experience in order to feel satisfied with the game.  In many ways, the principle of Action conflicts with the principle of Predictability, and a balance must be struck.  Although action typically implies movement, any apparent change qualifies as action.

===Variation in Space and Timing===

Variation is a designers best friend.  Here it's the player's perpception of the environment that changes.  As a player is aware of the map, their perpection of the space they're in changes when they move from space to space.  The change from a narrow hallway to a wide room gives a perceptual change that registers as action to the player.  Random timing can increase tension or danger and serve to make experiences more organic.  An irregular water drip will give a listening player a greater sense of purpose, to find a pattern, and a greater sense of satisfaction when they come to the conclusions the pattern is complex or there is no pattern.

===Keep Up the Pace===

Keeping the pace alive is an old secret to success in performance.  Your audience, the players, don't want to wait for the next thing to happen, the next thing should be waiting for them.  Make sure lifts don't take too long to ride, spaces aren't too long without some change, and progressions of predicatble events don't take too long to complete.

===Use of Layout to Create Suspense===

One of the most subtle forms of action is a change in mood.  The player can be in the most familiar surroundings and yet their experience can change drastically by their level of anger, joy or fear.  By making sure a sniper position includes an alternate entrance that just happens to be behind the sniper, you've created tension.  By giving the opponent several routes to attack the base, you've created potential fear for defending players.  By having regular intervals or events end in a strange or unpredictable way, you've created suspense for the player paying attention.

===Suprises and Discovery===

No player wants to experience &quot;the same old thing&quot;.  If suprises can happen and the player can discover new features of the map, the impulse will be there to replay the map.  While a suprise shouldn't happen so often as to become ordinary, it will have to be noticed to be effective.  In performance, the promise of suprise and discovery is called, &quot;the hook&quot;.  The hook can be anything from a cryptic map description, to in-game clues, to blatant advertisement of a secret in the map.

===Arena layout===

The layout of the arena plays a large part in the action. Maps can be quiet, good for snipers, good for flak cannons, or just plain bloody. A good example of an extremely active map is Blood Core Arena (CTF-Bloodcore, UT). You can't go ten feet without running into an enemy. It is an intense, bloody map. My personal congratulations to Jan Kohnert.

On the other hand, there are maps like Hall of Giants (CTF-HallOfGiants) and Facing Worlds. They are large, open, and quiet. (You can't even snipe all the way across Hall of Giants.) Then there are bad maps, like DM-BattleArena. I hope this was taken out of UT2kx, because in UT, it was terrible. All the action is on the ground floor because there is nothing interesting on the upper levels. I guess this is what you would call a 'killbox'.

==Related Topics ==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]

==Discussion==

'''SuperApe:''' What do you think?

'''Kedren:''' I think it sums things up very neatly.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Ideas</title>
    <id>2054</id>
    <revision>
      <id>5008</id>
      <timestamp>2008-02-08T16:18:02Z</timestamp>
      <contributor>
        <ip>Ip599363c1.rubicom.hu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Main Gametypes ==

This area are ideas for the main core gametpes.

===Deathmatch and Team Deathmatch  ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-MtDoom]]
|ZxAnPhOrIaN
|_
|EVEN BETTER THAN RIVENDALE ;) :) :P :D. A dark, fiendish hell with The Tower, lava pits, and deathtraps, from ''The Fellowship of the Ring''! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-CluedoMansion]]
|Phoenix
|Cluedo
|Basically, a map with the cluedo layout, a ragdoll mesh in a basement, and six weapons, one in each of six rooms.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-Rivendale]]
|LegalAssassin
|_
|Even better than MtDoom ;) A bright elvish paradise with water, trees and stone, also from LOTR. 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-GrandCanyon]]
|ZxAnPhOrIaN
|_
|The Grand Canyon in Arizona, but at a small scale, with the Colorado River in the bottom. The redeemer, ion painter, and the lightning gun will be on a near impossible-to-get-to butte in the middle of the canyon. You will use all five translocator charges. Also, there would be health up there also, and a water moat. (a little fiction, isn't that why the game is called Unreal Tournament??)  
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-Ascension]]
|NickR
|Ancient Eygpt
|A 1 on 1 Tower type map with multiple levels that you can ascend to when both of you have a certain amount of frags put together, until your at the top and you have to get each other off the edge! That hasn't been done before. Right? :/ 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-Ranma]]
|UltraN00b
|_
|You play inside a giant rotating metal drum, the weapons are atached to the side of the drum and rotate with it. In the center of the cilynder there is a structure that rotates along with the level, alowing people to ride it up to the center where the super weapon is placed. 
|}

===Capture The Flag ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-SpaceRing]]
|ZxAnPhOrIaN
|_
|A space future-theme like the UT warp-zone portal test level, RingWorld. Tarquin's tourus builder would come in handy with this map! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Rivendoom]]
|ZxAnPhOrIaN
|_
|Both places together! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Ascension]]
|NickR
|Ancient Eygpt
|A Two Towers type map with multiple levels that you can ascend to to get the flag. One tower for each team with a flag on top. Every time a team captures a flag the opposing teams flag spawns on the next level above, making it harder for the team trying to get it. :D Do I have good ideas or what? 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Surfaced]]
|EnlightenedOne
|_
|A level where a water zone portal is created so that you are forced onto the surface of the water like a pond skater and you have a tank either in a fish tank or a lake like theme with edges on the outer side of the lake and in the center between flags on oposing ends you have some land like a rock you would expect to find in a fish tank or an island in a lake which allows for some land action aswell as river dualing between pond like plants. 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Sentinel]]
|Bob_The_Beheader
|_
|A CTF that has a sentinel in the middle that's hooked up to a domination point
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Asteroids]]
|NogginBasher
|_
|I thought it might be fun to base a map around that old 2d game where there are space rocks flying across the screen.  Set up some moving asteroids, and the FC must hop from one to the other to get home!  I did make a prototype of this map. 
|}

===Domination ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|}

===Bombing Run ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description
|'''Reserved To
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BR-Colosseum]]
|ZxAnPhOrIaN
|_
|The ancient Colosseum in ancient Rome like in the movie ''Gladiator'' 
|}

===Assault ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-SmashNGrab]]
|cigawoot
|_
|Go down to a secure repository out in the middle of nowhere and try to steal a trophy out of a bank.  And then fly off without getting shot down 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-MinasTirith]]
|Cobalt
|_
|Break into Minas Tirith using some explosives that are mounted on the door, then climb the terrace pieces with alternating staircases (one on the right, then the left) to get to the steward's chambers.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Bone Island]]
|cigawoot
|_
|Infiltrate the Bone Island Academy and try to secure bioweapons as Red Faction
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Citadel]]
|amitakartok
|Half-Life 2
|Break into the dreaded Citadel, secure supply rooms, checkpoints, destabilize the reactor at the bottom and destroy the teleport at the top to cut off reinforcements from the enemy. 
|}

==Mod Ideas ==

This area are ideas for potential mod ideas. If the mod hasn't been coded, maybe we can convert them into the Main gametypes.

===Assault ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Island]]
|AlphaOne
|_
|An island level like in HALO. The objective is to assault/defend some sort of structure in the middle at the top of the mountain.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Medieval]]
|AlphaOne
|_
|(don't know teh righ spelling) Assault a castle on top of a hill, which is surrounded by a forest, river, valley, and another mountain.
|}

===Cold War ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-November_SinkSub]]
|LegalAssassin
|_
|Two submarines, one deep sea base and a nuke ;)! (AS-OceanFloor with more bases spread out) Also, some Karma 2p Mini-Subs and 1p transport (you hang behind it) would be cool! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Marquesas]]
|ZxAnPhOrIaN
|_
|Rugged mountanous island (like ''Survivor 4: Marquesas'') with the two shelters of the two teams as the missle silo and the tribal councel area as the missle parts respawn location. 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Bridge]]
|ZxAnPhOrIaN
|_
|Like the ''Americas Army: Operations'' Bridge map with the two towers as the missle silo and the top of the arch in the middle as the missle piece respawn point.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Sahara]]
|ZxAnPhOrIaN
|_
|Desert type level with two oasis as the missle silo and animal bone wrecage as the missle piece respawn point.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Mongolia]]
|ZxAnPhOrIaN
|
|This would be the rural highlands of Mongolia with the Mongolians nomadic yurts (portable houses like tents, but with better structure). The missle silo would be the Ghengis Kahn tent and the town center as the missle piece respawn point.
|}

==Related Pages ==
* [[Legacy:Mod Ideas|Mod Ideas]]
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Testing Lab|Testing Lab]]</text>
    </revision>
    <revision>
      <id>5009</id>
      <timestamp>2007-10-12T02:58:30Z</timestamp>
      <contributor>
        <ip>77-100-96-247.cable.ubr01.azte.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Main Gametypes ==

This area are ideas for the main core gametpes.

===Deathmatch and Team Deathmatch  ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-MtDoom]]
|ZxAnPhOrIaN
|_
|EVEN BETTER THAN RIVENDALE ;) :) :P :D. A dark, fiendish hell with The Tower, lava pits, and deathtraps, from ''The Fellowship of the Ring''! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-CluedoMansion]]
|Phoenix
|Cluedo
|Basically, a map with the cluedo layout, a ragdoll mesh in a basement, and six weapons, one in each of six rooms.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-Rivendale]]
|LegalAssassin
|_
|Even better than MtDoom ;) A bright elvish paradise with water, trees and stone, also from LOTR. 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-GrandCanyon]]
|ZxAnPhOrIaN
|_
|The Grand Canyon in Arizona, but at a small scale, with the Colorado River in the bottom. The redeemer, ion painter, and the lightning gun will be on a near impossible-to-get-to butte in the middle of the canyon. You will use all five translocator charges. Also, there would be health up there also, and a water moat. (a little fiction, isn't that why the game is called Unreal Tournament??)  
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-Ascension]]
|NickR
|Ancient Eygpt
|A 1 on 1 Tower type map with multiple levels that you can ascend to when both of you have a certain amount of frags put together, until your at the top and you have to get each other off the edge! That hasn't been done before. Right? :/ 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DM-Ranma]]
|UltraN00b
|_
|You play inside a giant rotating metal drum, the weapons are atached to the side of the drum and rotate with it. In the center of the cilynder there is a structure that rotates along with the level, alowing people to ride it up to the center where the super weapon is placed. 
|}

===Capture The Flag ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-SpaceRing]]
|ZxAnPhOrIaN
|_
|A space future-theme like the UT warp-zone portal test level, RingWorld. Tarquin's tourus builder would come in handy with this map! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Rivendoom]]
|ZxAnPhOrIaN
|_
|Both places together! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Ascension]]
|NickR
|Ancient Eygpt
|A Two Towers type map with multiple levels that you can ascend to to get the flag. One tower for each team with a flag on top. Every time a team captures a flag the opposing teams flag spawns on the next level above, making it harder for the team trying to get it. :D Do I have good ideas or what? 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Surfaced]]
|EnlightenedOne
|_
|A level where a water zone portal is created so that you are forced onto the surface of the water like a pond skater and you have a tank either in a fish tank or a lake like theme with edges on the outer side of the lake and in the center between flags on oposing ends you have some land like a rock you would expect to find in a fish tank or an island in a lake which allows for some land action aswell as river dualing between pond like plants. 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Sentinel]]
|Bob_The_Beheader
|_
|A CTF that has a sentinel in the middle that's hooked up to a domination point
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTF-Asteroids]]
|NogginBasher
|_
|I thought it might be fun to base a map around that old 2d game where there are space rocks flying across the screen.  Set up some moving asteroids, and the FC must hop from one to the other to get home!  I did make a prototype of this map. 
|}

===Domination ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|}

===Bombing Run ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description
|'''Reserved To
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BR-Colosseum]]
|ZxAnPhOrIaN
|_
|The ancient Colosseum in ancient Rome like in the movie ''Gladiator'' 
|}

===Assault ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-SmashNGrab]]
|cigawoot
|_
|Go down to a secure repository out in the middle of nowhere and try to steal a trophy out of a bank.  And then fly off without getting shot down 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-MinasTirith]]
|Cobalt
|_
|Break into Minas Tirith using some explosives that are mounted on the door, then climb the terrace pieces with alternating staircases (one on the right, then the left) to get to the steward's chambers.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Bone Island]]
|cigawoot
|_
|Infiltrate the Bone Island Academy and try to secure bioweapons as Red Faction
|}

==Mod Ideas ==

This area are ideas for potential mod ideas. If the mod hasn't been coded, maybe we can convert them into the Main gametypes.

===Assault ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Island]]
|AlphaOne
|_
|An island level like in HALO. The objective is to assault/defend some sort of structure in the middle at the top of the mountain.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AS-Medieval]]
|AlphaOne
|_
|(don't know teh righ spelling) Assault a castle on top of a hill, which is surrounded by a forest, river, valley, and another mountain.
|}

===Cold War ===

{|

|-
|'''Map Name
|'''Creator
|'''Theme
|'''Quick Description 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-November_SinkSub]]
|LegalAssassin
|_
|Two submarines, one deep sea base and a nuke ;)! (AS-OceanFloor with more bases spread out) Also, some Karma 2p Mini-Subs and 1p transport (you hang behind it) would be cool! 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Marquesas]]
|ZxAnPhOrIaN
|_
|Rugged mountanous island (like ''Survivor 4: Marquesas'') with the two shelters of the two teams as the missle silo and the tribal councel area as the missle parts respawn location. 
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Bridge]]
|ZxAnPhOrIaN
|_
|Like the ''Americas Army: Operations'' Bridge map with the two towers as the missle silo and the top of the arch in the middle as the missle piece respawn point.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Sahara]]
|ZxAnPhOrIaN
|_
|Desert type level with two oasis as the missle silo and animal bone wrecage as the missle piece respawn point.
|-
|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CW-Mongolia]]
|ZxAnPhOrIaN
|
|This would be the rural highlands of Mongolia with the Mongolians nomadic yurts (portable houses like tents, but with better structure). The missle silo would be the Ghengis Kahn tent and the town center as the missle piece respawn point.
|}

==Related Pages ==
* [[Legacy:Mod Ideas|Mod Ideas]]
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Testing Lab|Testing Lab]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Ideas/CTF-MetalGlove</title>
    <id>2055</id>
    <revision>
      <id>5010</id>
      <timestamp>2003-04-11T19:48:46Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==CTF-MetalGlove &amp;ndash; The spec for the map ==

===The Flag Room ===

The flag sits in a rectangular room, similar in construction to the Gauntlet base, between two large pillars. Behind one pillar is a small shield.  The sides of the flag room are sloped in a similar manner to Gauntlet but rather than having a single spawn room, there are two, one on each side.  The flag room also has a wooden ramp around the edge, reached by a lift that sits behind the shield. The back wall is moved farther away from the rear pillar to accommodate the lift.  Consider using stairs instead.  It should not be possible to dodge-jump between the ramps either side of the base.  It needs to be wider than that.

Weapons available within the flag room are the bio rifle, the link gun, and the lightning gun.

The flag room roof is nice and pointed. It has some rafters. There's a lightning gun up there. 

From the flag it is possible to escape out of a large arched front door (a la Gauntlet) or out of the top left or right smaller arches, reached via the wooden platforms that run around the edges of the flag room.  If leaving by the either of the two arches, players have no choice but to drop down to the ground outside of the base.  This acts as a natural choke point.

===Outside of the Flag Room ===

The area immediately outside the base is reasonably open, although populated with 4 (or 6) pillars. Players at this point can run forwards and down a slope into the &quot;lower area&quot;, right or left around the &quot;sides&quot; of the level, or up ramps to the left or right ramp that takes them via the &quot;Upper route&quot;.  The layout should be fairly similar to Gauntlet only slightly more open (and maybe less dark).

It’s probably worth putting some health and ammo out here, as this is the main choke point within the level.  If a flag carrier gets past this part of the map then they have a large choice of routes, and the ability to switch between them almost at will.

===The Lower Route ===

The lower route is reached by running in a straight line out of the flag room and down some steps.  At the bottom of the steps the player must run around the edges of a large bottomless (nearly) pit.  At the bottom of the pit is either a Redeemer or an Ion painter – depends on the final level structure.  Small alcoves within the sides of the pit allow someone with the teleporter to escape back out.  The alcoves need small ridges above them to stop people landing in them (or maybe not – might lead to some interesting tactics).  The ledges around the edge of the pit need to be reasonably thin, but not too small.  Some weaving should be allowed.

The lower route provides access to the rocket launcher on one side, and some ammo on the other.  This should “lure” players into always taking the same side – another potential choke point.  There is an opening either side of the room for &quot;chutes&quot;, the entrances to which are in the &quot;Side Rooms&quot;.

===The Upper Route ===

The upper route is reached by running out of the flag room and either left or right up some ramps (or maybe steps).  The ramps curve around a large central pillar (like Gauntlet) and then go in a straight line towards the other base.  The two sides are not symmetrical.  The left ramp’s are level and players must dodge jump to the right to continue on into the other base, or, double jump over a stone pillar/some sort of construction to continue running in a straight line.  Players should have enough time to dodge-jump across to the other ramp after the double jump. This should make the central area reasonably large.

===The Side Rooms ===

The side rooms are accessed via some steps, or via two windows, one at each end of the room facing over the platforms.  It would be nice if players could double/jump or dodge-jump from the upper route into the side rooms but it’s not essential.  They can always hammer jump if they have to.

From the side rooms it is possible to run out down the steps, jump out of the windows (maybe onto the top route with a bit of cunning), or down some chutes that take the player to the lower route.  The side rooms should be simple in interior, and open rather than cluttered with pillars and the like.  There should possibly be a single pillar in the room.

The side rooms should contain the Flak cannon on one side, and the Mini-gun on the other.

The Middle Route

The middle route is simply composed of the rest of the level.  From the flag room the player can run either left or right around the edge of the map.  Since the central area of the map is empty bar a couple of bits of infrastructure the player can cross either left or right at will.  The very centre of the map holds the shock rifle and some ammo for it.

===Setting, Boundaries, and Style Notes ===

In an ideal world this level should be completely enclosed.  Since I’m intending to use the ruination prefab set this may not be possible.

However, if this proves impractical then the level should be set in a grassy (forget all this lava and snow rubbish I want something summery) valley with cliffs (or steep sides) at the central point of the level.  It may be possible to allow players to run all the way around the edge of the level standing on the prefabs, but is probably not worth the effort.

An another alternative is to place the level in a wide very foggy valley and then set up laser grids all round the outside of the level to discourage players from going there.

The real problem I have is that a blocking volume would look odd and feel wrong.  Far too much effort has been put into restricting the player’s movement for the sake of game-play in the maps shipped with the game.  IMHO it hurts game-play more that way.

===Comments ===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Ideas/CTF-Sentinel</title>
    <id>2057</id>
    <revision>
      <id>5013</id>
      <timestamp>2007-01-18T07:17:05Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Bob_The_Beheader''' I've gotten a pretty good start on this map, but any ideas would be helpful.

==Concept:==

CTF-Sentinel has a layout similar to CTF-Face. Maybe a little more closed in.

There is a sentinel in the middle of the map that oversees a good portion of the no-man-land in the middle. Also in the middle is a domination point. 

The sentinel belongs to the team that is in control of the domination point. In order to cap the flag, the carrier must run through the sentinel's line of fire. (of course we aren't talking about an over-the-top base defending sentinel, but a well-balanced one, like the ones that you have to destroy as one of the objectives in AS-Mothership. But in this case, the sentinel will be indestructible. Destroying it would take away the entire point of the map. Also of course the sentinel will not take the place of players trying to intercept the carrier. Control of the sentinel will be a secondary objective.

===Coding Requirements:===
# An embedded mutator that allows vehicles into standard CTF maps. Also, it replaces both team's CTFTeamAI with the one described in the Solutions section below.
# Of course a sentinel subclass:
## The sentinel should begin play on neither team, but attack both. (I'm putting it on team 2, but it should probably be higher)
## When the sentinel is not on a team, it's weapon effects shouldn't be colored red or blue. I'm thinking purple.
## The sentinel should always keep attacking flag carriers as the first priority when it sees multiple targets.

===Solutions:===
* The bots can be made to not attack the sentinel by getting them to always think that it is on there team. This requires subclassing [[Legacy:CTFTeamAI|CTFTeamAI]], and rewriting the onThisTeam(Pawn Other) function to return true if Other is a TeamSentinel. Otherwise, it acts normally.

===Can I get Some advice?===

# Should the sentinel be able to help defend the domination point?
# How much of the central area should be in the sentinel's line of fire?
# How far out of thier way should player have to go in order to get to the domination point?
# Should DOM point campers be able to easily leave the point and intercept enemy flag carriers?
# Should the flag carrier be able to access the domination point on their way home?
# How much of a secondary objective should controlling the sentinel be? should it be an absolute requirement for capping? Or should flag carriers be able to run the gauntlet even if the enemy controls the sentinel (simply with more difficulty)
# How can I set up priorities for the bots so that there is a balance between defending the domination point and trying to cap the flag? Currently, all the bots want to camp the DOM point. I cant for the life of me make them realize that the flag should be thier primary goal.</text>
    </revision>
    <revision>
      <id>5014</id>
      <timestamp>2006-10-22T22:42:19Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Bob_The_Beheader''' I've gotten a pretty good start on this map, but any ideas would be helpful.

==Concept:==

CTF-Sentinel has a layout similer to CTF-Face. Maybe a little more closed in.

There is a sentinel in the middle of the map that oversees a good portion of the no-man-land in the middle. Also in the middle is a domination point. 

The sentinel belongs to the team that is in control of the domination point. In order to cap the flag, the carrier must run through the sentinel's line of fire. (of course we arn't talking about an over-the-top base defending sentinel, but a well-balanced one? Also of course the sentinel will not take the place of players trying to intercept the carrier. Control of the sentinel will be a secondary objective.

===Coding Requirements:===

# An embedded mutator that allows vehicles into standard CTF maps
# Of course a sentinel subclass:
## The sentinel should begin play on neither team, but attack both. (im putting it on team 2)
## When the sentinel is not on a team, it's weapon effects shouldn't be colored red or blue. I'm thinking purple
## The sentinel should always keep attacking flag carriers as the first priority when it sees multiple targets.

===Can I get Some advice?===

# Should the sentinel be able to help defend the domination point?
# How much of the central area should be?
# How far out of thier way should player have to go in order to get to the domination point?
# Should DOM point campers be able to easily leave the point and intercept enemy flag carriers?
# Should the flag carrier be able to access the domination point on thier way home?
# How much of a secondary objective should controlling the sentinel be? should it be an absolute requirement for capping? Or should flag carriers be able to run the gauntlet even if the enemey controls the sentinel (simply with more difficulty)

# How can I set up priorities for the bots so that there is a balance between defending the domination point and trying to cap the flag? Currently, all the bots want to camp the DOM point. I cant for the life of me make them realize that the flag should be thier primary goal.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map IdeasCW-Mongolia</title>
    <id>2232</id>
    <revision>
      <id>5399</id>
      <timestamp>2006-03-24T04:30:31Z</timestamp>
      <contributor>
        <ip>C-71-199-11-215.hsd1.co.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">You</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Optimization</title>
    <id>2085</id>
    <revision>
      <id>5077</id>
      <timestamp>2007-07-30T19:43:08Z</timestamp>
      <contributor>
        <ip>24-113-89-39.wavecable.com</ip>
      </contributor>
      <minor/>
      <comment>* Added awesome tutorial link by AngelMapper, removed previous (broken) link.</comment>
      <text xml:space="preserve">'''Optimizing a map''' is a balancing exercise between building a great looking map and builing a map that runs at a playable speed.

''For an excellent offsite tutorial by Angel Mapper, see http://angelmapper.com/tutorials/optimization1.htm''

==Occlusion==

Because game engines simply draw ''everything'' and rely on overdrawing to actually make sure the player only sees what they ought to see, a huge amount of detail is drawn by the graphics card unnecessarily. Occlusion is the reduction of what actually gets drawn on screen. A number of different techniques allow mappers to control occlusion and keep levels playable.

In [[Legacy:UT|UT]], level optimization was primarily about keeping the number of visible polygons to a sensible number (150 polygons was considered about the most you wanted in view in the beginning, although most PCs will handle 400 with ease these days).  In addition the number of visible objects (or meshes) needed to be kept to a minimum. For more on changes from the Unreal and UT generation of the engine, see [[Legacy:Occlusion Changes For UnrealEngine2|Occlusion Changes For UnrealEngine2]].

===Using Zones===

[[Legacy:Zoning|Zoning]] splits the map up into separate areas called zones. These provide a way for the engine to eliminate a large proportion of the map from what it has to consider for rendering, simply because the player can't see it. Zone portals are basically the opposite of Antiportals (as the name suggests). Zones completely eliminate entire meshes (and other geometry) from the rendering queue (except for those meshes that are un-occluded by zone-portals).

Only the geometry inside a zone within which a client is present will be rendered... with the exception of any other geometry that is visible through a zone portal. Zones occlude EVERYTHING outside them, which is bad since then nothing could be seen through doors and windows between zones. So EPIC created this special mechanism called a zone portal to un-occlude whatever things might be seen through them (for doors and windows between zones, etc). Zone portals are special entities that take on the shape of their defining brushes. They are NOT BSP geometry! If the player is looking through a zone portal, meshes in adjacent zones will still be rendered if they are also in the player's fustrum.

Zones are calculated at map-build time from the BSP geometry that makes up a room, but since rooms generally have an opening to adjacent rooms (otherwise players would be trapped!), Epic had to come up with a special way to tell the engine where passage of players was possible (non-solid), while still maintaining the seal of the zone. [Question: are Non-solid brushes NON-BSP??? I believe they are just raw sheet polygons, especially considering that semi-solids are not even BSP]. 

Zone portals are not BSP. They are come from the original brushes that define them, just like Antiportals. Note however, that it is possible to use a brush to define both a zone portal surface and simulatenously visible BSP polygons. But keep in mind that it's the actual original brush shape that is used for portal calculations at runtime, so if the brush sticks into BSP walls, the part that is sticking into the walls will still allow the rendering of geometry in the adjacent zone. [Also note that all sheets are Non-solid despite that their defining brush might be set to solid or semi-solid. So for example, a single sheet brush can generate both a zone-portal and a visible non-solid polygon (neither of which is BSP??)]. It is the source geometry of the portal that is used for determining what is visible, not just the part of it that creates the BSP polygons (when its visibility surface property is set to true). Because of this you should use the 2D shape editor to make your zone portals fit the hole they're filling as closely as possible (within reason - do not use more than 6 verices or so to define the portal brush).

Zones are much less flexible than [[Legacy:Antiportal|Antiportal]]s as they are static within the map and can only be formed using [[Legacy:BSP|BSP]] geometry + zone portals. [[Legacy:Static Mesh|Static mesh]]es and terrain cannot be used to form zones.

Even though zones are not as flexible as Antiportals they are much faster to use for in-game occlusion and so should be the first line of defense against mesh rendering. 

Essentially, if you cannot &quot;see&quot; a zone then none of the geometry within that zone will be considered by the rendering engine.  The entire level segment within the zone is occluded. But zone portals can still be &quot;seen&quot; through even if they are opaque, so do not take this too literally. When optimizing your level, assume that players have magic glasses and can &quot;see&quot; through zone portals even if the texture on them is opaque. But note, there is a nifty feature to get around this. (See the ManualExcludes paragraph below).

A popular optimization technique in the Epic maps is to place zone portals at either end of a hallway.  This way if you're viewing the hallway from an off angle, the portal at the far end won't be visible through the portal at the near end, and everything beyond the hallway can quickly be thrown out. Basically, try to create as many non-adjacent zones as possible. In other words, combine zoning with the players view fustrum to achieve the best occlusion.

The biggest drawback to zones is that it is impossible to zone large outdoor areas. 

See also: [[Legacy:Zoning|Zoning]]

===Using Antiportals===

That is why Antiportals were invented. They are simple shapes that work even outdoors. Instead of telling the engine what it should render, they tell the engine what it should not render, depending on the direction the client is looking. They use the players view fustrum to figure out what to occlude.

Comparing every polygon of a mesh against an Antiportal is not cheap, but it is certainly less expensive than doing so against regular BSP nodes on average (assuming the average BSP poly count is 200~500), which was the old method. Of course these days with the use of static-meshes, the BSP poly count is often much lower than that, with static-mesh polygons in their place, and static-meshes are even worse! They don't even have a binary-tree like BSP. [Instead of a Logarithmic-Complexity data-structure-oriented piece of code to process mesh occlusion, there would be an N^2-Complexity algorithm-oriented piece of code. This is, in laymen's terms, is VERY BAD.]

Antiportals solve this problem because they are simple shapes (or should be!). However, since they will occlude everything &quot;behind&quot; them (relative to the client), they must be placed carefully. Make sure they are always hidden inside visible static geometry including BSP, terrain, and static-meshes.

[[Legacy:Antiportal|Antiportal]]s can be any shape you want, and the specific shape does not make a big difference in the performance, as long as it is not complex (the number of vertices should be low: try to stick to simple prisms). [[Legacy:Antiportal|Antiportal]]s are relatively slow but if they occlude a large number of polygons it is generally worth it. An Antiportal can, for instance, be placed inside a static mesh to basically make the static mesh occlude, or it can be made to the shape of an existing BSP brush to make that brush appear to occlude meshes. Note that Antiportals are invisible and cannot actually be used to make visible geometry. If an Antiportal is visible to a player, a [[Legacy:Hall Of Mirrors|HOM]] effect can occur.

Antiportals are generally used in large outdoor areas or other areas that cannot be reasonably zoned off. For example, if you had an outdoor area with a large hill, it is usually not practical to try to zone of the hill, because you are pretty well always going to be able to see into the other zones, just not into much of them. In this instance an Antiportal could be used to occlude the objects behind it.  (see CTF-Magma for a counterexample).

It is worth noting that an Antiportal will only be used for occlusion if some part of it is contained within a zone visible to the player. As a result, the total number of Antiportals in a level may be high, but you should try to keep the number of Antiportals in each zone to a minimum to optimize the number of Antiportal calculations made.

[[Legacy:Devastation|Devastation]] also adds a new type of Antiportal to the mappers arsenal.  This is the Zone-antiportal.  A Zone-Antiportal is just like a regular Antiportal, except that it has a list of zones that will not be occluded by the Antiportal, even if that zone is behind the Antiportal. One use for this might be a huge outdoor wall with little &quot;pockets&quot; (rooms) attach to it. The rooms would have open doorways in the wall (requiring some subtraction brushes for the doors + zone portal sheets). The entire wall shape could contain a big rectangular antiportal to block everything beyond the wall EXCEPT those rooms by adding them to the zones to exclude. A more common example would be a building in the outdoors which should occlude everything behind it but not everything inside of it (you can see through the windows for instance).

===Using BSP inside of Antiportals for Online Optimization===

Antiportals occlude static meshes, BSP and terrain chunks, but DO NOT occlude other players or their projectiles. If you plan on having a lot of players in a map that uses antiportals, create a slightly smaller semisolid/unlit/invisible BSP brush and put it inside of the antiportal. This will occlude any network relevant actors and will help optimize online play with many players.

===Combining The Two===

Antiportals can be used to occlude zone portals.  For example, lets say you have a set of large pillars in front of an area with a small doorway at the back.  Obviously you should put a zone portal in the doorway, but it would be useful to not render the zone inside the doorway if the doorway isn't visible.  The two options are to either put a zone portal between each pillar (one big zone portal won't work), or to put an Antiportal inside each pillar.  Depending on the specifics of the map the later may be the better option as it saves you a zone (you only have 63 available, which can become an issue in a large CTF/BR map).

===Manually excluding Zones from rendering===

Antiportals are not the only way in the UnrealEngine2 to prevent things from being rendered. Another, more general way is the ManualExcludes array in the [[Legacy:ZoneInfo|ZoneInfo]]'s ZoneVisibility property group. In this array you can specify the ZoneInfos of other zones that will never be seen by a player in the zone belonging to this ZoneInfo.

Imagine a room with a few pillars and a doorway on each side. The pillars might be placed in a way that blocks the view from each doorwa to the others, but it might not be possible to properly occlude those doorways' zoneportals with antiportals in the pillars. This is where the ManualExcludes take over: For each doorway zone you specify the other doorway zones in the ManualExcludes array to completely exclude them from rendering.

To add ZoneInfos to the ManualExcludes list you have to put their Object -&gt; Name into the textbox. For obvious reasons you can only exclude zones that have their own ZoneInfo actor.

===Using ForcedVisibilityZoneTag===

Sometimes the visibility logic can't decide, which zone an actor belongs to. This often happens with larger [[Legacy:StaticMesh|StaticMesh]]es that reach into BSP geometry. These actors are often rendered even if they are not visible at all.

You can tell the visibility logic, which zone this actor belongs to, by matching its Display -&gt; ForcedVisibilityZoneTag property with the Events -&gt; Tag property of the ZoneInfo(s) of the zone(s) the actor is located in. This way the visibility logic knows that the actor belongs to the zone or zones with that tag and properly excludes it from rendering if the zone is not visible.

==Reducing Channels for Online Optimization==

Every pickup on a map creates a channel when played on a server. The more channels on a server, the more lag there is overall on the server. Try to use fewer pickups on larger maps, and replace clustered pickups with a weapon locker.

==Simplify Collisions==

If you have many complex [[Legacy:Static Mesh|static mesh]]es in your level either make them non-collidable or use a simplified collision hull. You can do this either with a blockingvolume or by saving a brush into the static mesh using the static mesh browser. If you do the latter, the brush will be used for collision but the static mesh will be displayed. If you do not use either of these, straight triangle collision is used on every polygon in the static mesh. This can have a significant impact on the performance of your level.

==Simplify lighting==

Even static lights are costly since they are only static with respect to BSP geometry and STATIC mesh vertices. Their effect on non-static meshes (such as) players is still calculated at runtime. The bigger the radius of each light, the longer it takes the runtime system to calculate what non-static meshes should be affected by the light. The obvious solution is to minimize the radius of lights (typically 32 units are less is good), as well as the number of unique lights. [Given a choice between using smaller radii and fewer lights, it is better to use smaller radii and more lights. The volume of a sphere is 4/3*Pi*r^3! Multiply this by the number of lights (assuming that they have the same radius), and you get n*4/3*Pi*r^3, where n is the number of lights. So increasing the r on a particular light has a cubic detriment on its efficiency, whereas increasing n only has a linear detriment.]

But sometimes, you need to use a bigger radius, or many lights. One method to minimize this is to use bSpecialit in the light, as well as on the BSP surface or static mesh it is intended to light. This will cause the light to be used for static map lighting, while not actually lighting players. However, be careful that this does not look weird! You still need to have lights that *do* affect the player to make sure it looks like they are really in the room.

==Minimize Texture Loading==

Don't be afraid to use polygons. A high polycount (up to 50,000 polygons in view today!) is better than a high texture-memory usage!

These days, the pushing of mesh polygons to the video card is far cheaper than the pushing of textures. In the old days, textures were used for making &quot;virtual&quot; 3D geometry (just like faux architecture in the real world), to save on the number of polygons. This meant that great looking levels needed a relatively large number of custom textures to implement all the 3D looking complexities. It was hoped that the user did not notice too much that what he was looking at was actually a 2D surface. This technique is still used today, and the best example of its usage is in AS-RobotFactory. It is sometimes the best way to do things. However the rules have changed quite a bit. Now polygons are generally far cheaper. Texture loading is quite expensive. The fewer unique textures you use in your level, the better. Try to reuse a relatively small set of base textures frequently, and building the vast majority of your 3D detail with *actual* 3D geometry in Maya or 3DS Max. Not only will your level run faster, but it will also look better.

It is also far easier and faster to model architecture than it is to draw it. Of course, this comes with some practice in Maya or 3DSMax. Emulating 3D shapes in 2D artwork is hard. Especially since, once applied in your level, the textures tend to look flat and unrealistic.

There are however somethings that must be done with textures still. Small 3D details, like the plaster on a wall, or the rust on metal, must still be implemeted with textures. It also sometimes looks better to use textures to implement details that are very nearly 2D in real life, because you can control the shadown and lighting directly using your raster editor, as opposed to hoping and praying that the Vertex Lighting of Unreal looks good.

Another method for decreasing texture usage is using ColorModifier materials together with grayscale images. See http://udn.epicgames.com/Two/MaterialsModifiers. The grays determine how dark or light to make various pixels in the texture. Using this, you can optimize the compression of the texture since it has fewer colors, while also reusing the texture in various parts of your map with different hues. This works well for paint, plaster and other raw bases. It does not work well for multi-hued textures, such as moss covered rocks (where there are rock hues [brown, black, white ] and moss colors [green, aqua]). You can sometimes design your static meshes with a few extra polygons that are layered, to apply multiple ColorModifier materials and textures. Note that Combiner materials were desinged for this kind of thing, but at present do not work reliably on many conventional video cards. Plus it is more efficient on many static meshes to use a few more polygons that are layered, than it is to go through the Unreal material pipeline with Combiners.

As an example of this method, you might have an old Italian villa. The houses are made of red-organgish bricks, plaster, and paint. The plaster and paint is weathered and peeling off in places. You could implement the walls of the houses using 2 or 3 polygon layers: the underneath layer for bricks, the 2nd layer for plaster, and possibly a 3rd layer for paint. You could reuse the same brick texture on all the walls of the houses, but use different colors of plaster and paint on top of it. All the houses could reuse just a handful of plaster and paint textures that are grayscale, plus a bunch of ColorModifier materials to make these few textures look like 20 or 30 different ones! And since ColorModifiers are implemented at compile time in the lightmap, you are not actually increasing  texture memory usage to the video card at runtime. The same textures are cached and reused, improving framerate, while only the lightmap values change from house to house.

==Other Things that Slow Levels Down==

Here are some things to avoid when you construct a level:
* Spawning. Spawning objects is relatively expensive. Emitters spawn a large number of objects, and so are not practical in most serious online maps. (Avoid emitters!)
* Players. Having many players in an area is a bad idea most of the time. It not only causes network lag since the server must send more information to each client, but it also slows down the rendering tremendously, with the game having to animate and render all the players. Also, don't forget that local clients perform local physics calculations to estimate the location and orientation every player that relevant more frequently than the server updates this information (to minimize the appearance of network lag). Unfortunately, this leads to local CPU lag due to all the extra calculations. Avoid creating maps in which large scale battles take place in one visible area.

==Discussion==

'''inio:''' Is anyone interested in a demo map with examples of the various occlusion methods?  There seems to be a lot of &quot;here's how you do it&quot; but no &quot;here's how it's done&quot; relating to this topic.

'''King Mango:''' Yes I would be interested in that. I am curious if antiportals are even used in UED2... It would be nice if there could be rooms connected to one another, with a sort of &quot;stand here&quot; design on the floor. Then when a player stands there a series of triggered messages explains what to put the crosshairs on and why the info displayed by &quot;stat fps&quot; is different for each occlusion type.

'''EntropicLqd:''' Antiportals do not exist in UED2 at all.  PS - It looks liked you are cutting and pasting from notepad with word wrap turned on - hard line breaks are generally a bad thing.

'''inio:''' Antiportals weren't needed in UnrealEd 2 because it didn't have [[Legacy:Terrain|terrain]], it didn't have [[Legacy:Static Mesh|static mesh]]es, and BSP ocluded in the engine versions it worked with.

'''anonymous:''' Could anyone possibly write something about how to fix bsp bugs the editor causes? I'm talking stuff like invisible walls caused by editor rebuilder bugs. I currently fix them by remodelling part of my maps with is a rather unelegant way.

'''evil_blue_dude:''' I've found a fool proof way. I think I'll write a tutorial! :D

'''Durandal:''' Think it needs noting that WarpZones are still functional in UEd 3.0. (But I cant work out how to make it so you see the other side...)

'''Tarquin:''' Note to c-67-183-19-195.client.comcast.net &amp;ndash; the new material is good, but we now seem to have the same thing twice (more or less) on this page. Things need merging.

==Related Topics==
* [[Legacy:Zone|Zone]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:Antiportal|Antiportal]]
* [[Legacy:Distance Fog|Distance Fog]]

----
* Zone Your World: [[Legacy:Zoning|Zoning]] , [[Legacy:Zoning (UT)|Zoning (UT)]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:WarpZoneInfo|WarpZoneInfo]] &amp;ndash; also (confusingly) called portals
* [[Legacy:Gravity, Warp Tunnels|Gravity, Warp Tunnels]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BlockAll|BlockAll]] and [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Volume|Volume]]

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; see top.

	

	
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5078</id>
      <timestamp>2005-11-06T00:30:36Z</timestamp>
      <contributor>
        <ip>Nata47</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Optimizing a map''' is a balancing exercise between building a great looking map and builing a map that runs at a playable speed.

==Occlusion==

Because game engines simply draw ''everything'' and rely on overdrawing to actually make sure the player only sees what they ought to see, a huge amount of detail is drawn by the graphics card unnecessarily. Occlusion is the reduction of what actually gets drawn on screen. A number of different techniques allow mappers to control occlusion and keep levels playable.

In [[Legacy:UT|UT]], level optimization was primarily about keeping the number of visible polygons to a sensible number (150 polygons was considered about the most you wanted in view in the beginning, although most PCs will handle 400 with ease these days).  In addition the number of visible objects (or meshes) needed to be kept to a minimum. For more on changes from the Unreal and UT generation of the engine, see [[Legacy:Occlusion Changes For UnrealEngine2|Occlusion Changes For UnrealEngine2]].

===Using Zones===

[[Legacy:Zoning|Zoning]] splits the map up into separate areas called zones. These provide a way for the engine to eliminate a large proportion of the map from what it has to consider for rendering, simply because the player can't see it. Zone portals are basically the opposite of Antiportals (as the name suggests). Zones completely eliminate entire meshes (and other geometry) from the rendering queue (except for those meshes that are un-occluded by zone-portals).

Only the geometry inside a zone within which a client is present will be rendered... with the exception of any other geometry that is visible through a zone portal. Zones occlude EVERYTHING outside them, which is bad since then nothing could be seen through doors and windows between zones. So EPIC created this special mechanism called a zone portal to un-occlude whatever things might be seen through them (for doors and windows between zones, etc). Zone portals are special entities that take on the shape of their defining brushes. They are NOT BSP geometry! If the player is looking through a zone portal, meshes in adjacent zones will still be rendered if they are also in the player's fustrum.

Zones are calculated at map-build time from the BSP geometry that makes up a room, but since rooms generally have an opening to adjacent rooms (otherwise players would be trapped!), Epic had to come up with a special way to tell the engine where passage of players was possible (non-solid), while still maintaining the seal of the zone. [Question: are Non-solid brushes NON-BSP??? I believe they are just raw sheet polygons, especially considering that semi-solids are not even BSP]. 

Zone portals are not BSP. They are come from the original brushes that define them, just like Antiportals. Note however, that it is possible to use a brush to define both a zone portal surface and simulatenously visible BSP polygons. But keep in mind that it's the actual original brush shape that is used for portal calculations at runtime, so if the brush sticks into BSP walls, the part that is sticking into the walls will still allow the rendering of geometry in the adjacent zone. [Also note that all sheets are Non-solid despite that their defining brush might be set to solid or semi-solid. So for example, a single sheet brush can generate both a zone-portal and a visible non-solid polygon (neither of which is BSP??)]. It is the source geometry of the portal that is used for determining what is visible, not just the part of it that creates the BSP polygons (when its visibility surface property is set to true). Because of this you should use the 2D shape editor to make your zone portals fit the hole they're filling as closely as possible (within reason - do not use more than 6 verices or so to define the portal brush).

Zones are much less flexible than [[Legacy:Antiportal|Antiportal]]s as they are static within the map and can only be formed using [[Legacy:BSP|BSP]] geometry + zone portals. [[Legacy:Static Mesh|Static mesh]]es and terrain cannot be used to form zones.

Even though zones are not as flexible as Antiportals they are much faster to use for in-game occlusion and so should be the first line of defense against mesh rendering. 

Essentially, if you cannot &quot;see&quot; a zone then none of the geometry within that zone will be considered by the rendering engine.  The entire level segment within the zone is occluded. But zone portals can still be &quot;seen&quot; through even if they are opaque, so do not take this too literally. When optimizing your level, assume that players have magic glasses and can &quot;see&quot; through zone portals even if the texture on them is opaque. But note, there is a nifty feature to get around this. (See the ManualExcludes paragraph below).

A popular optimization technique in the Epic maps is to place zone portals at either end of a hallway.  This way if you're viewing the hallway from an off angle, the portal at the far end won't be visible through the portal at the near end, and everything beyond the hallway can quickly be thrown out. Basically, try to create as many non-adjacent zones as possible. In other words, combine zoning with the players view fustrum to achieve the best occlusion.

The biggest drawback to zones is that it is impossible to zone large outdoor areas. 

See also: [[Legacy:Zoning|Zoning]]

===Using Antiportals===

That is why Antiportals were invented. They are simple shapes that work even outdoors. Instead of telling the engine what it should render, they tell the engine what it should not render, depending on the direction the client is looking. They use the players view fustrum to figure out what to occlude.

Comparing every polygon of a mesh against an Antiportal is not cheap, but it is certainly less expensive than doing so against regular BSP nodes on average (assuming the average BSP poly count is 200~500), which was the old method. Of course these days with the use of static-meshes, the BSP poly count is often much lower than that, with static-mesh polygons in their place, and static-meshes are even worse! They don't even have a binary-tree like BSP. [Instead of a Logarithmic-Complexity data-structure-oriented piece of code to process mesh occlusion, there would be an N^2-Complexity algorithm-oriented piece of code. This is, in laymen's terms, is VERY BAD.]

Antiportals solve this problem because they are simple shapes (or should be!). However, since they will occlude everything &quot;behind&quot; them (relative to the client), they must be placed carefully. Make sure they are always hidden inside visible static geometry including BSP, terrain, and static-meshes.

[[Legacy:Antiportal|Antiportal]]s can be any shape you want, and the specific shape does not make a big difference in the performance, as long as it is not complex (the number of vertices should be low: try to stick to simple prisms). [[Legacy:Antiportal|Antiportal]]s are relatively slow but if they occlude a large number of polygons it is generally worth it. An Antiportal can, for instance, be placed inside a static mesh to basically make the static mesh occlude, or it can be made to the shape of an existing BSP brush to make that brush appear to occlude meshes. Note that Antiportals are invisible and cannot actually be used to make visible geometry. If an Antiportal is visible to a player, a [[Legacy:Hall Of Mirrors|HOM]] effect can occur.

Antiportals are generally used in large outdoor areas or other areas that cannot be reasonably zoned off. For example, if you had an outdoor area with a large hill, it is usually not practical to try to zone of the hill, because you are pretty well always going to be able to see into the other zones, just not into much of them. In this instance an Antiportal could be used to occlude the objects behind it.  (see CTF-Magma for a counterexample).

It is worth noting that an Antiportal will only be used for occlusion if some part of it is contained within a zone visible to the player. As a result, the total number of Antiportals in a level may be high, but you should try to keep the number of Antiportals in each zone to a minimum to optimize the number of Antiportal calculations made.

[[Legacy:Devastation|Devastation]] also adds a new type of Antiportal to the mappers arsenal.  This is the Zone-antiportal.  A Zone-Antiportal is just like a regular Antiportal, except that it has a list of zones that will not be occluded by the Antiportal, even if that zone is behind the Antiportal. One use for this might be a huge outdoor wall with little &quot;pockets&quot; (rooms) attach to it. The rooms would have open doorways in the wall (requiring some subtraction brushes for the doors + zone portal sheets). The entire wall shape could contain a big rectangular antiportal to block everything beyond the wall EXCEPT those rooms by adding them to the zones to exclude. A more common example would be a building in the outdoors which should occlude everything behind it but not everything inside of it (you can see through the windows for instance).

===Combining The Two===

Antiportals can be used to occlude zone portals.  For example, lets say you have a set of large pillars in front of an area with a small doorway at the back.  Obviously you should put a zone portal in the doorway, but it would be useful to not render the zone inside the doorway if the doorway isn't visible.  The two options are to either put a zone portal between each pillar (one big zone portal won't work), or to put an Antiportal inside each pillar.  Depending on the specifics of the map the later may be the better option as it saves you a zone (you only have 63 available, which can become an issue in a large CTF/BR map).

===Manually excluding Zones from rendering===

Antiportals are not the only way in the UnrealEngine2 to prevent things from being rendered. Another, more general way is the ManualExcludes array in the [[Legacy:ZoneInfo|ZoneInfo]]'s ZoneVisibility property group. In this array you can specify the ZoneInfos of other zones that will never be seen by a player in the zone belonging to this ZoneInfo.

Imagine a room with a few pillars and a doorway on each side. The pillars might be placed in a way that blocks the view from each doorwa to the others, but it might not be possible to properly occlude those doorways' zoneportals with antiportals in the pillars. This is where the ManualExcludes take over: For each doorway zone you specify the other doorway zones in the ManualExcludes array to completely exclude them from rendering.

To add ZoneInfos to the ManualExcludes list you have to put their Object -&gt; Name into the textbox. For obvious reasons you can only exclude zones that have their own ZoneInfo actor.

===Using ForcedVisibilityZoneTag===

Sometimes the visibility logic can't decide, which zone an actor belongs to. This often happens with larger [[Legacy:StaticMesh|StaticMesh]]es that reach into BSP geometry. These actors are often rendered even if they are not visible at all.

You can tell the visibility logic, which zone this actor belongs to, by matching its Display -&gt; ForcedVisibilityZoneTag property with the Events -&gt; Tag property of the ZoneInfo(s) of the zone(s) the actor is located in. This way the visibility logic knows that the actor belongs to the zone or zones with that tag and properly excludes it from rendering if the zone is not visible.

==Simplify Collisions==

If you have many complex [[Legacy:Static Mesh|static mesh]]es in your level either make them non-collidable or use a simplified collision hull. You can do this either with a blockingvolume or by saving a brush into the static mesh using the static mesh browser. If you do the latter, the brush will be used for collision but the static mesh will be displayed. If you do not use either of these, straight triangle collision is used on every polygon in the static mesh. This can have a significant impact on the performance of your level.

==Simplify lighting==

Even static lights are costly since they are only static with respect to BSP geometry and STATIC mesh vertices. Their effect on non-static meshes (such as) players is still calculated at runtime. The bigger the radius of each light, the longer it takes the runtime system to calculate what non-static meshes should be affected by the light. The obvious solution is to minimize the radius of lights (typically 32 units are less is good), as well as the number of unique lights. [Given a choice between using smaller radii and fewer lights, it is better to use smaller radii and more lights. The volume of a sphere is 4/3*Pi*r^3! Multiply this by the number of lights (assuming that they have the same radius), and you get n*4/3*Pi*r^3, where n is the number of lights. So increasing the r on a particular light has a cubic detriment on its efficiency, whereas increasing n only has a linear detriment.]

But sometimes, you need to use a bigger radius, or many lights. One method to minimize this is to use bSpecialit in the light, as well as on the BSP surface or static mesh it is intended to light. This will cause the light to be used for static map lighting, while not actually lighting players. However, be careful that this does not look weird! You still need to have lights that *do* affect the player to make sure it looks like they are really in the room.

See also [http://www.unrealops.com/modules.php?op=modload&amp;name=Reviews&amp;file=index&amp;req=showcontent&amp;id=84 Rachel's map optimizing tute]

==Minimize Texture Loading==

Don't be afraid to use polygons. A high polycount (up to 50,000 polygons in view today!) is better than a high texture-memory usage!

These days, the pushing of mesh polygons to the video card is far cheaper than the pushing of textures. In the old days, textures were used for making &quot;virtual&quot; 3D geometry (just like faux architecture in the real world), to save on the number of polygons. This meant that great looking levels needed a relatively large number of custom textures to implement all the 3D looking complexities. It was hoped that the user did not notice too much that what he was looking at was actually a 2D surface. This technique is still used today, and the best example of its usage is in AS-RobotFactory. It is sometimes the best way to do things. However the rules have changed quite a bit. Now polygons are generally far cheaper. Texture loading is quite expensive. The fewer unique textures you use in your level, the better. Try to reuse a relatively small set of base textures frequently, and building the vast majority of your 3D detail with *actual* 3D geometry in Maya or 3DS Max. Not only will your level run faster, but it will also look better.

It is also far easier and faster to model architecture than it is to draw it. Of course, this comes with some practice in Maya or 3DSMax. Emulating 3D shapes in 2D artwork is hard. Especially since, once applied in your level, the textures tend to look flat and unrealistic.

There are however somethings that must be done with textures still. Small 3D details, like the plaster on a wall, or the rust on metal, must still be implemeted with textures. It also sometimes looks better to use textures to implement details that are very nearly 2D in real life, because you can control the shadown and lighting directly using your raster editor, as opposed to hoping and praying that the Vertex Lighting of Unreal looks good.

Another method for decreasing texture usage is using ColorModifier materials together with grayscale images. See http://udn.epicgames.com/Two/MaterialsModifiers. The grays determine how dark or light to make various pixels in the texture. Using this, you can optimize the compression of the texture since it has fewer colors, while also reusing the texture in various parts of your map with different hues. This works well for paint, plaster and other raw bases. It does not work well for multi-hued textures, such as moss covered rocks (where there are rock hues [brown, black, white ] and moss colors [green, aqua]). You can sometimes design your static meshes with a few extra polygons that are layered, to apply multiple ColorModifier materials and textures. Note that Combiner materials were desinged for this kind of thing, but at present do not work reliably on many conventional video cards. Plus it is more efficient on many static meshes to use a few more polygons that are layered, than it is to go through the Unreal material pipeline with Combiners.

As an example of this method, you might have an old Italian villa. The houses are made of red-organgish bricks, plaster, and paint. The plaster and paint is weathered and peeling off in places. You could implement the walls of the houses using 2 or 3 polygon layers: the underneath layer for bricks, the 2nd layer for plaster, and possibly a 3rd layer for paint. You could reuse the same brick texture on all the walls of the houses, but use different colors of plaster and paint on top of it. All the houses could reuse just a handful of plaster and paint textures that are grayscale, plus a bunch of ColorModifier materials to make these few textures look like 20 or 30 different ones! And since ColorModifiers are implemented at compile time in the lightmap, you are not actually increasing  texture memory usage to the video card at runtime. The same textures are cached and reused, improving framerate, while only the lightmap values change from house to house.

==Other Things that Slow Levels Down==

Here are some things to avoid when you construct a level:
* Spawning. Spawning objects is relatively expensive. Emitters spawn a large number of objects, and so are not practical in most serious online maps. (Avoid emitters!)
* Players. Having many players in an area is a bad idea most of the time. It not only causes network lag since the server must send more information to each client, but it also slows down the rendering tremendously, with the game having to animate and render all the players. Also, don't forget that local clients perform local physics calculations to estimate the location and orientation every player that relevant more frequently than the server updates this information (to minimize the appearance of network lag). Unfortunately, this leads to local CPU lag due to all the extra calculations. Avoid creating maps in which large scale battles take place in one visible area.

==Discussion==

'''inio:''' Is anyone interested in a demo map with examples of the various occlusion methods?  There seems to be a lot of &quot;here's how you do it&quot; but no &quot;here's how it's done&quot; relating to this topic.

'''King Mango:''' Yes I would be interested in that. I am curious if antiportals are even used in UED2... It would be nice if there could be rooms connected to one another, with a sort of &quot;stand here&quot; design on the floor. Then when a player stands there a series of triggered messages explains what to put the crosshairs on and why the info displayed by &quot;stat fps&quot; is different for each occlusion type.

'''EntropicLqd:''' Antiportals do not exist in UED2 at all.  PS - It looks liked you are cutting and pasting from notepad with word wrap turned on - hard line breaks are generally a bad thing.

'''inio:''' Antiportals weren't needed in UnrealEd 2 because it didn't have [[Legacy:Terrain|terrain]], it didn't have [[Legacy:Static Mesh|static mesh]]es, and BSP ocluded in the engine versions it worked with.

'''anonymous:''' Could anyone possibly write something about how to fix bsp bugs the editor causes? I'm talking stuff like invisible walls caused by editor rebuilder bugs. I currently fix them by remodelling part of my maps with is a rather unelegant way.

'''evil_blue_dude:''' I've found a fool proof way. I think I'll write a tutorial! :D

'''Durandal:''' Think it needs noting that WarpZones are still functional in UEd 3.0. (But I cant work out how to make it so you see the other side...)

'''Tarquin:''' Note to c-67-183-19-195.client.comcast.net &amp;ndash; the new material is good, but we now seem to have the same thing twice (more or less) on this page. Things need merging.

==Related Topics==
* [[Legacy:Zone|Zone]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:Antiportal|Antiportal]]
* [[Legacy:Distance Fog|Distance Fog]]

----
* Zone Your World: [[Legacy:Zoning|Zoning]] , [[Legacy:Zoning (UT)|Zoning (UT)]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:WarpZoneInfo|WarpZoneInfo]] &amp;ndash; also (confusingly) called portals
* [[Legacy:Gravity, Warp Tunnels|Gravity, Warp Tunnels]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BlockAll|BlockAll]] and [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Volume|Volume]]

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; see top.

	

	
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5079</id>
      <timestamp>2005-12-20T20:14:33Z</timestamp>
      <contributor>
        <ip>JoystickMonkey</ip>
      </contributor>
      <comment>Online Optimization Techniques</comment>
      <text xml:space="preserve">'''Optimizing a map''' is a balancing exercise between building a great looking map and builing a map that runs at a playable speed.

==Occlusion==

Because game engines simply draw ''everything'' and rely on overdrawing to actually make sure the player only sees what they ought to see, a huge amount of detail is drawn by the graphics card unnecessarily. Occlusion is the reduction of what actually gets drawn on screen. A number of different techniques allow mappers to control occlusion and keep levels playable.

In [[Legacy:UT|UT]], level optimization was primarily about keeping the number of visible polygons to a sensible number (150 polygons was considered about the most you wanted in view in the beginning, although most PCs will handle 400 with ease these days).  In addition the number of visible objects (or meshes) needed to be kept to a minimum. For more on changes from the Unreal and UT generation of the engine, see [[Legacy:Occlusion Changes For UnrealEngine2|Occlusion Changes For UnrealEngine2]].

===Using Zones===

[[Legacy:Zoning|Zoning]] splits the map up into separate areas called zones. These provide a way for the engine to eliminate a large proportion of the map from what it has to consider for rendering, simply because the player can't see it. Zone portals are basically the opposite of Antiportals (as the name suggests). Zones completely eliminate entire meshes (and other geometry) from the rendering queue (except for those meshes that are un-occluded by zone-portals).

Only the geometry inside a zone within which a client is present will be rendered... with the exception of any other geometry that is visible through a zone portal. Zones occlude EVERYTHING outside them, which is bad since then nothing could be seen through doors and windows between zones. So EPIC created this special mechanism called a zone portal to un-occlude whatever things might be seen through them (for doors and windows between zones, etc). Zone portals are special entities that take on the shape of their defining brushes. They are NOT BSP geometry! If the player is looking through a zone portal, meshes in adjacent zones will still be rendered if they are also in the player's fustrum.

Zones are calculated at map-build time from the BSP geometry that makes up a room, but since rooms generally have an opening to adjacent rooms (otherwise players would be trapped!), Epic had to come up with a special way to tell the engine where passage of players was possible (non-solid), while still maintaining the seal of the zone. [Question: are Non-solid brushes NON-BSP??? I believe they are just raw sheet polygons, especially considering that semi-solids are not even BSP]. 

Zone portals are not BSP. They are come from the original brushes that define them, just like Antiportals. Note however, that it is possible to use a brush to define both a zone portal surface and simulatenously visible BSP polygons. But keep in mind that it's the actual original brush shape that is used for portal calculations at runtime, so if the brush sticks into BSP walls, the part that is sticking into the walls will still allow the rendering of geometry in the adjacent zone. [Also note that all sheets are Non-solid despite that their defining brush might be set to solid or semi-solid. So for example, a single sheet brush can generate both a zone-portal and a visible non-solid polygon (neither of which is BSP??)]. It is the source geometry of the portal that is used for determining what is visible, not just the part of it that creates the BSP polygons (when its visibility surface property is set to true). Because of this you should use the 2D shape editor to make your zone portals fit the hole they're filling as closely as possible (within reason - do not use more than 6 verices or so to define the portal brush).

Zones are much less flexible than [[Legacy:Antiportal|Antiportal]]s as they are static within the map and can only be formed using [[Legacy:BSP|BSP]] geometry + zone portals. [[Legacy:Static Mesh|Static mesh]]es and terrain cannot be used to form zones.

Even though zones are not as flexible as Antiportals they are much faster to use for in-game occlusion and so should be the first line of defense against mesh rendering. 

Essentially, if you cannot &quot;see&quot; a zone then none of the geometry within that zone will be considered by the rendering engine.  The entire level segment within the zone is occluded. But zone portals can still be &quot;seen&quot; through even if they are opaque, so do not take this too literally. When optimizing your level, assume that players have magic glasses and can &quot;see&quot; through zone portals even if the texture on them is opaque. But note, there is a nifty feature to get around this. (See the ManualExcludes paragraph below).

A popular optimization technique in the Epic maps is to place zone portals at either end of a hallway.  This way if you're viewing the hallway from an off angle, the portal at the far end won't be visible through the portal at the near end, and everything beyond the hallway can quickly be thrown out. Basically, try to create as many non-adjacent zones as possible. In other words, combine zoning with the players view fustrum to achieve the best occlusion.

The biggest drawback to zones is that it is impossible to zone large outdoor areas. 

See also: [[Legacy:Zoning|Zoning]]

===Using Antiportals===

That is why Antiportals were invented. They are simple shapes that work even outdoors. Instead of telling the engine what it should render, they tell the engine what it should not render, depending on the direction the client is looking. They use the players view fustrum to figure out what to occlude.

Comparing every polygon of a mesh against an Antiportal is not cheap, but it is certainly less expensive than doing so against regular BSP nodes on average (assuming the average BSP poly count is 200~500), which was the old method. Of course these days with the use of static-meshes, the BSP poly count is often much lower than that, with static-mesh polygons in their place, and static-meshes are even worse! They don't even have a binary-tree like BSP. [Instead of a Logarithmic-Complexity data-structure-oriented piece of code to process mesh occlusion, there would be an N^2-Complexity algorithm-oriented piece of code. This is, in laymen's terms, is VERY BAD.]

Antiportals solve this problem because they are simple shapes (or should be!). However, since they will occlude everything &quot;behind&quot; them (relative to the client), they must be placed carefully. Make sure they are always hidden inside visible static geometry including BSP, terrain, and static-meshes.

[[Legacy:Antiportal|Antiportal]]s can be any shape you want, and the specific shape does not make a big difference in the performance, as long as it is not complex (the number of vertices should be low: try to stick to simple prisms). [[Legacy:Antiportal|Antiportal]]s are relatively slow but if they occlude a large number of polygons it is generally worth it. An Antiportal can, for instance, be placed inside a static mesh to basically make the static mesh occlude, or it can be made to the shape of an existing BSP brush to make that brush appear to occlude meshes. Note that Antiportals are invisible and cannot actually be used to make visible geometry. If an Antiportal is visible to a player, a [[Legacy:Hall Of Mirrors|HOM]] effect can occur.

Antiportals are generally used in large outdoor areas or other areas that cannot be reasonably zoned off. For example, if you had an outdoor area with a large hill, it is usually not practical to try to zone of the hill, because you are pretty well always going to be able to see into the other zones, just not into much of them. In this instance an Antiportal could be used to occlude the objects behind it.  (see CTF-Magma for a counterexample).

It is worth noting that an Antiportal will only be used for occlusion if some part of it is contained within a zone visible to the player. As a result, the total number of Antiportals in a level may be high, but you should try to keep the number of Antiportals in each zone to a minimum to optimize the number of Antiportal calculations made.

[[Legacy:Devastation|Devastation]] also adds a new type of Antiportal to the mappers arsenal.  This is the Zone-antiportal.  A Zone-Antiportal is just like a regular Antiportal, except that it has a list of zones that will not be occluded by the Antiportal, even if that zone is behind the Antiportal. One use for this might be a huge outdoor wall with little &quot;pockets&quot; (rooms) attach to it. The rooms would have open doorways in the wall (requiring some subtraction brushes for the doors + zone portal sheets). The entire wall shape could contain a big rectangular antiportal to block everything beyond the wall EXCEPT those rooms by adding them to the zones to exclude. A more common example would be a building in the outdoors which should occlude everything behind it but not everything inside of it (you can see through the windows for instance).

===Using BSP inside of Antiportals for Online Optimization===

Antiportals occlude static meshes, BSP and terrain chunks, but DO NOT occlude other players or their projectiles. If you plan on having a lot of players in a map that uses antiportals, create a slightly smaller semisolid/unlit/invisible BSP brush and put it inside of the antiportal. This will occlude any network relevant actors and will help optimize online play with many players.

===Combining The Two===

Antiportals can be used to occlude zone portals.  For example, lets say you have a set of large pillars in front of an area with a small doorway at the back.  Obviously you should put a zone portal in the doorway, but it would be useful to not render the zone inside the doorway if the doorway isn't visible.  The two options are to either put a zone portal between each pillar (one big zone portal won't work), or to put an Antiportal inside each pillar.  Depending on the specifics of the map the later may be the better option as it saves you a zone (you only have 63 available, which can become an issue in a large CTF/BR map).

===Manually excluding Zones from rendering===

Antiportals are not the only way in the UnrealEngine2 to prevent things from being rendered. Another, more general way is the ManualExcludes array in the [[Legacy:ZoneInfo|ZoneInfo]]'s ZoneVisibility property group. In this array you can specify the ZoneInfos of other zones that will never be seen by a player in the zone belonging to this ZoneInfo.

Imagine a room with a few pillars and a doorway on each side. The pillars might be placed in a way that blocks the view from each doorwa to the others, but it might not be possible to properly occlude those doorways' zoneportals with antiportals in the pillars. This is where the ManualExcludes take over: For each doorway zone you specify the other doorway zones in the ManualExcludes array to completely exclude them from rendering.

To add ZoneInfos to the ManualExcludes list you have to put their Object -&gt; Name into the textbox. For obvious reasons you can only exclude zones that have their own ZoneInfo actor.

===Using ForcedVisibilityZoneTag===

Sometimes the visibility logic can't decide, which zone an actor belongs to. This often happens with larger [[Legacy:StaticMesh|StaticMesh]]es that reach into BSP geometry. These actors are often rendered even if they are not visible at all.

You can tell the visibility logic, which zone this actor belongs to, by matching its Display -&gt; ForcedVisibilityZoneTag property with the Events -&gt; Tag property of the ZoneInfo(s) of the zone(s) the actor is located in. This way the visibility logic knows that the actor belongs to the zone or zones with that tag and properly excludes it from rendering if the zone is not visible.

==Reducing Channels for Online Optimization==

Every pickup on a map creates a channel when played on a server. The more channels on a server, the more lag there is overall on the server. Try to use fewer pickups on larger maps, and replace clustered pickups with a weapon locker.

==Simplify Collisions==

If you have many complex [[Legacy:Static Mesh|static mesh]]es in your level either make them non-collidable or use a simplified collision hull. You can do this either with a blockingvolume or by saving a brush into the static mesh using the static mesh browser. If you do the latter, the brush will be used for collision but the static mesh will be displayed. If you do not use either of these, straight triangle collision is used on every polygon in the static mesh. This can have a significant impact on the performance of your level.

==Simplify lighting==

Even static lights are costly since they are only static with respect to BSP geometry and STATIC mesh vertices. Their effect on non-static meshes (such as) players is still calculated at runtime. The bigger the radius of each light, the longer it takes the runtime system to calculate what non-static meshes should be affected by the light. The obvious solution is to minimize the radius of lights (typically 32 units are less is good), as well as the number of unique lights. [Given a choice between using smaller radii and fewer lights, it is better to use smaller radii and more lights. The volume of a sphere is 4/3*Pi*r^3! Multiply this by the number of lights (assuming that they have the same radius), and you get n*4/3*Pi*r^3, where n is the number of lights. So increasing the r on a particular light has a cubic detriment on its efficiency, whereas increasing n only has a linear detriment.]

But sometimes, you need to use a bigger radius, or many lights. One method to minimize this is to use bSpecialit in the light, as well as on the BSP surface or static mesh it is intended to light. This will cause the light to be used for static map lighting, while not actually lighting players. However, be careful that this does not look weird! You still need to have lights that *do* affect the player to make sure it looks like they are really in the room.

See also [http://www.unrealops.com/modules.php?op=modload&amp;name=Reviews&amp;file=index&amp;req=showcontent&amp;id=84 Rachel's map optimizing tute]

==Minimize Texture Loading==

Don't be afraid to use polygons. A high polycount (up to 50,000 polygons in view today!) is better than a high texture-memory usage!

These days, the pushing of mesh polygons to the video card is far cheaper than the pushing of textures. In the old days, textures were used for making &quot;virtual&quot; 3D geometry (just like faux architecture in the real world), to save on the number of polygons. This meant that great looking levels needed a relatively large number of custom textures to implement all the 3D looking complexities. It was hoped that the user did not notice too much that what he was looking at was actually a 2D surface. This technique is still used today, and the best example of its usage is in AS-RobotFactory. It is sometimes the best way to do things. However the rules have changed quite a bit. Now polygons are generally far cheaper. Texture loading is quite expensive. The fewer unique textures you use in your level, the better. Try to reuse a relatively small set of base textures frequently, and building the vast majority of your 3D detail with *actual* 3D geometry in Maya or 3DS Max. Not only will your level run faster, but it will also look better.

It is also far easier and faster to model architecture than it is to draw it. Of course, this comes with some practice in Maya or 3DSMax. Emulating 3D shapes in 2D artwork is hard. Especially since, once applied in your level, the textures tend to look flat and unrealistic.

There are however somethings that must be done with textures still. Small 3D details, like the plaster on a wall, or the rust on metal, must still be implemeted with textures. It also sometimes looks better to use textures to implement details that are very nearly 2D in real life, because you can control the shadown and lighting directly using your raster editor, as opposed to hoping and praying that the Vertex Lighting of Unreal looks good.

Another method for decreasing texture usage is using ColorModifier materials together with grayscale images. See http://udn.epicgames.com/Two/MaterialsModifiers. The grays determine how dark or light to make various pixels in the texture. Using this, you can optimize the compression of the texture since it has fewer colors, while also reusing the texture in various parts of your map with different hues. This works well for paint, plaster and other raw bases. It does not work well for multi-hued textures, such as moss covered rocks (where there are rock hues [brown, black, white ] and moss colors [green, aqua]). You can sometimes design your static meshes with a few extra polygons that are layered, to apply multiple ColorModifier materials and textures. Note that Combiner materials were desinged for this kind of thing, but at present do not work reliably on many conventional video cards. Plus it is more efficient on many static meshes to use a few more polygons that are layered, than it is to go through the Unreal material pipeline with Combiners.

As an example of this method, you might have an old Italian villa. The houses are made of red-organgish bricks, plaster, and paint. The plaster and paint is weathered and peeling off in places. You could implement the walls of the houses using 2 or 3 polygon layers: the underneath layer for bricks, the 2nd layer for plaster, and possibly a 3rd layer for paint. You could reuse the same brick texture on all the walls of the houses, but use different colors of plaster and paint on top of it. All the houses could reuse just a handful of plaster and paint textures that are grayscale, plus a bunch of ColorModifier materials to make these few textures look like 20 or 30 different ones! And since ColorModifiers are implemented at compile time in the lightmap, you are not actually increasing  texture memory usage to the video card at runtime. The same textures are cached and reused, improving framerate, while only the lightmap values change from house to house.

==Other Things that Slow Levels Down==

Here are some things to avoid when you construct a level:
* Spawning. Spawning objects is relatively expensive. Emitters spawn a large number of objects, and so are not practical in most serious online maps. (Avoid emitters!)
* Players. Having many players in an area is a bad idea most of the time. It not only causes network lag since the server must send more information to each client, but it also slows down the rendering tremendously, with the game having to animate and render all the players. Also, don't forget that local clients perform local physics calculations to estimate the location and orientation every player that relevant more frequently than the server updates this information (to minimize the appearance of network lag). Unfortunately, this leads to local CPU lag due to all the extra calculations. Avoid creating maps in which large scale battles take place in one visible area.

==Discussion==

'''inio:''' Is anyone interested in a demo map with examples of the various occlusion methods?  There seems to be a lot of &quot;here's how you do it&quot; but no &quot;here's how it's done&quot; relating to this topic.

'''King Mango:''' Yes I would be interested in that. I am curious if antiportals are even used in UED2... It would be nice if there could be rooms connected to one another, with a sort of &quot;stand here&quot; design on the floor. Then when a player stands there a series of triggered messages explains what to put the crosshairs on and why the info displayed by &quot;stat fps&quot; is different for each occlusion type.

'''EntropicLqd:''' Antiportals do not exist in UED2 at all.  PS - It looks liked you are cutting and pasting from notepad with word wrap turned on - hard line breaks are generally a bad thing.

'''inio:''' Antiportals weren't needed in UnrealEd 2 because it didn't have [[Legacy:Terrain|terrain]], it didn't have [[Legacy:Static Mesh|static mesh]]es, and BSP ocluded in the engine versions it worked with.

'''anonymous:''' Could anyone possibly write something about how to fix bsp bugs the editor causes? I'm talking stuff like invisible walls caused by editor rebuilder bugs. I currently fix them by remodelling part of my maps with is a rather unelegant way.

'''evil_blue_dude:''' I've found a fool proof way. I think I'll write a tutorial! :D

'''Durandal:''' Think it needs noting that WarpZones are still functional in UEd 3.0. (But I cant work out how to make it so you see the other side...)

'''Tarquin:''' Note to c-67-183-19-195.client.comcast.net &amp;ndash; the new material is good, but we now seem to have the same thing twice (more or less) on this page. Things need merging.

==Related Topics==
* [[Legacy:Zone|Zone]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:Antiportal|Antiportal]]
* [[Legacy:Distance Fog|Distance Fog]]

----
* Zone Your World: [[Legacy:Zoning|Zoning]] , [[Legacy:Zoning (UT)|Zoning (UT)]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:WarpZoneInfo|WarpZoneInfo]] &amp;ndash; also (confusingly) called portals
* [[Legacy:Gravity, Warp Tunnels|Gravity, Warp Tunnels]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BlockAll|BlockAll]] and [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Volume|Volume]]

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; see top.

	

	
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Map Planning</title>
    <id>2082</id>
    <revision>
      <id>5068</id>
      <timestamp>2008-03-25T19:36:53Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page outlines techiniques and methods useful in planning a successful map design.

==Overview==

{{innerbox| If you fail to plan, you plan to fail. '''&amp;ndash; Anonymous'''

}}

Building contractors have a saying that is applicable to mappers as well: &quot;Measure twice, cut once.&quot;  The idea is that you can save time, effort and materials by planning ahead and visualizing the design before work begins.  While some may swear by &quot;improvisational mapping&quot;, most would have to agree that mapping is hard work and takes long enough without mistakes and miscalculations that require reworking, or worse, redoing.

Once the mapper has become inspired by some source to create a compelling design, they can begin to define the details of the map and create a visualization of a workable layout.  Then before construction, the map designer can use their visualizations to work out any problems that could arise with respect to appearance, map flow or technical issues.  After that, the mapper can proceed with construction, confident that most of the potential &quot;show stopper&quot; problems have been solved already.

It is recommended that mappers aquaint themselves with the general concepts and elements of [[Legacy:Gameplay|Gameplay]], [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]] before proceeding.

==Inspirational Sources==

Inspiration can come from unconventional sources; layout ideas can come from styrafoam packaging, texture ideas can come from nature, unreal gameplay ideas can come from board games, etc.  Consider random sources and experiment with limits of perception to find new ways of looking at the world around you.  This section includes various links and ideas that help find inspiration for map designs, themes or styles.

===General===
* Look at existing maps to get an idea of what style you like, whether that be a particular style of lighting or of architecture.
* Take ideas from television or films; the sets, the buildings, the lighting, the sounds (''for example, the dark gothic tower in Batman or those seen in the Lord of The Rings trilogy'').
* Look at the wiki pages [[Legacy:Static_Mesh_Package|Static_Mesh_Package]] and [[Legacy:Texture_Package|Texture_Package]] when deciding what static meshes and which textures to use in your map.

===Topics===
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; The Wiki page on map ideas.

===Links===
* [http://www.castlewales.com/life.html Rooms of a Castle] &amp;ndash; What's needed to give an impression of people living in your ancient arena.
* [http://www.greatmirror.com/ GreatMirror.com] &amp;ndash; A collection of photos from neat outdoor and ancient settings.
* [http://www.greatbuildings.com/ GreatBuildings.com] &amp;ndash; An architectual site.
* [http://unrealplayground.com/forums/showthread.php?t=23839 UP Forums &quot;Mapping Ideas&quot; Thread] &amp;ndash; An ongoing discussion and exchange of map ideas for the Unreal Engine.
* [http://www.unrealplayground.com/forums/showthread.php?p=554718 UP Forums &quot;Environmental Inspiration for Mappers&quot; Thread] &amp;ndash; An ongoing discussion with links to great environmental inspirations.
* [http://www.creativitypool.com/ CreativityPool.com] &amp;ndash; A site devoted to free idea exchange.

==Planning==

These are the primary ideas to organize for map design.  It is strongly recommended that you write down your ideas as they come to you.  You may not end up using them all, some may even be contradictory, but you will be in a stronger position to design once you have all your ideas in once place.

===Gametype===

Review any speical requirements for the [[Legacy:Gametype|gametype]] you are mapping for.  Should the layout be open (like DeathMatch or Onslaught) or more linear (like Assault or Capture The Flag)?  Does this gametype allow vehicles?  What [[Legacy:GameObjective|GameObjective]]s are involved?  By in large, the map design will be centered around the requirements and guidelines of it's designated gametype.

===Goals===

Define the unique purpose of the map.  What will make this map stand out from other maps of this gametype?  What will the focus of the map be?  What elements of the gameplay can be affected by this design?  Write down one sentence that clearly defines the unique goal for this map.

===Theme===

Choose a compelling theme.  Don't be afraid to explore vastly different themes.  Often once one theme is fully considered, another one comes to mind.  Sometimes the original theme idea is strengthened by considering others.  Pick one theme that will strongly address the goal for this map.

===Scope===

Define the size of this map's gameplay.  Based on the goal and theme of the map, make decisions about the scale of the map size, the number of players this map should hold, the number or difficulty of the game objectives (if this gametype has them).  Would this map's goal and theme be best served with a tight layout and a small number of players, or with a grand landscape and several available vehicles?  Should this design be small but open-ended, or linear and very involved; required several steps to complete?  Choose an approximate scope for this map based on it's goal and theme; make notes on map size, suggested player count, game objectives, etc. 

===Special Features===

Any unique elements of this map should be clearly defined and possibly tested separately before further work is done.  Are there elements that you can imagine that would strongly support the goal, theme and scope of this map?  Will this map need custom static meshes?  A new particle effect?  A unique trigger system?  Identify these special features early and make note of them.

==Visualizing==

After you have thought of a few ideas and written them down, it's time to think of how you're actually going to manifest your ideas to the Unreal Editor.  The idea now is to play with different layouts, different designs.  Try many different ways of configuring the elements of the map design until you find things that work best.  These are some methods of solidifying the plan.  Choose a method that is comfortable to you.

===Pencil and Paper===

This is a simplest form of visualizing.  The drawing doesn't have to be pretty, just functional and accurate enough to visualize walking through the layout.  Sketch out the floor plan; a top down view of the layout.  Make several floor plans for each level, if it's a multi-story layout.  Sketch key unique elements or features that will give the map it's character. Try using grid paper.

===Drawing / Painting Application===

Instead of using a pencil and paper, it might be easier for you to use a paint program.  As with the pencil and paper, make multiple drawings for each level of the layout and try to make visual notes and representations of key unique elements of the map.  The advantage of using this method is you can take the resulting drawing straight into the editor and use it as a guide during construction, by applying it as a texture to a plane at the bottom of the editor space.

===Cutouts / Models===

Either with toy building blocks, clay, wood, paper or cardboard, simple models can be made to represent the hallways, rooms, stairs, ledges, outdoor buildings, etc. of your layout.  These elements can be shifted around and playfully reconnected to find a variety of layout designs.  

===Segmenting Layouts (&quot;Frankenmapping&quot;)===

In the editor, other maps (or '''copies''' of them) can be raided for their layout elements.  Make a temporary test map.  A hallway can be cut from one map and pasted into the test map and combined with a stairway from another map, or a room from a third map.  While the walls may not line up and the detail elements (such as textures, static mesh trim, etc.) may not match, but the resulting test map should give an approximate representation of a layout.  You do not need to try and playtest the map (it will most likely crash or be filled with HOMs), but you can easily navigate around the layout through the editor.  It is recommended that you keep the editor's grid lock enabled at all times.

==Early Testing==

Before construction begins, this is the time to use the visualizations to expose potential problems with flow, appearance or techinical issues.  When problems do arise, you will only have to rework the visualization of your design, not the construction of the design, so it should come as a relief rather than a frustration.

===Basic Gameplay===
* Review the requirements and guidelines for the [[Legacy:Gametype|gametype]] this map is designed for and check it against your current design.
* Take this opportunity to review the elements and concepts of [[Legacy:Map Design|Map Design]] and see how your current design measures up.
* Imagine yourself playing this map; reaching objectives, attacking, defending, playing on different teams, etc.  You may become further inspired to make changes based on elements that you find during this process.

===Sight Lines===
* Review the look of the layout from all angles and all points in the map.  You may find spots to improve or elements you would like to highlight.
* Check to make sure the map doesn't provide huge, long-range vista views.  This could prove to be a framerate killer later on.
* Look for architechture that might improve in appearance with a little layout adjustment, check for lighting hotspots or dark holes, find bland spots in the map and think of ways to make them interesting.

===Map Flow===
* Look for dead ends, long narrow hallways or other elements that will kill [[Legacy:Map Flow|Map Flow]].
* Visualize a player navigating your layout between random points in the map.  Is there an obvious problem getting from here to there?  Make adjustments that will allow a player to get anywhere from anywhere fairly quickly.
* Does the layout make good use of the [[Legacy:Z-Axis|Z-Axis]] with plenty of vertical movement and vertical combat options?  Make notes on good spots to place [[Legacy:UTJumpPad|UTJumpPad]]s, [[Legacy:Mover|Mover]]s, [[Legacy:Teleporter|Teleporter]]s, or the like.  Think about opening up something like windows or grates in the floor or ceiling.
* Make notes on good spots to place PlayerStarts, Inventory Items, Vehicle Factories and the GameObjectives.

===Technical Issues===

Make a note of the technical elements of the map and think about testing them separately '''before''' you begin construction.
* Will this map need special [[Legacy:Trigger Systems|Trigger Systems]]?  Can you do it with a [[Legacy:ScriptedTrigger|ScriptedTrigger]]?
* Are there any elements that can't be created with stock Objects?  Can you come up with a workaround or code your own custom Object?
* Are the technical elements of your map &lt;u&gt;too&lt;/u&gt; technical?  Would they essentially require a custom mod or mutator?  Test out the elements early on to avoid basing your map on something that you can't complete.

====A Note About Techincal Elements====

Think about what it is you're capable of.  There's no shame in asking another more experienced mapper to help if they are willing and have the time; you could learn from them and pick up a few useful hints along the way. Just a friendly word of advice: if you do get help from someone else in the mapping process, always grant them some of the credit in the Readme file.  It shows you're grateful to them for taking the time and for helping you learn something useful.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map File Prefix|Map File Prefix]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] (UT2004 only)
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] (UT only)
** [[Legacy:Mapping For DDOM|Mapping For DDOM]] (UT200x)
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:''' Revised.  Comments welcome.

'''Bioslimer_[nl]''' nice and, thank you 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5069</id>
      <timestamp>2008-01-02T14:20:21Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page outlines techiniques and methods useful in planning a successful map design.

==Overview==

{{innerbox| If you fail to plan, you plan to fail. '''&amp;ndash; Anonymous'''

}}

Building contractors have a saying that is applicable to mappers as well: &quot;Measure twice, cut once.&quot;  The idea is that you can save time, effort and materials by planning ahead and visualizing the design before work begins.  While some may swear by &quot;improvisational mapping&quot;, most would have to agree that mapping is hard work and takes long enough without mistakes and miscalculations that require reworking, or worse, redoing.

Once the mapper has become inspired by some source to create a compelling design, they can begin to define the details of the map and create a visualization of a workable layout.  Then before construction, the map designer can use their visualizations to work out any problems that could arise with respect to appearance, map flow or technical issues.  After that, the mapper can proceed with construction, confident that most of the potential &quot;show stopper&quot; problems have been solved already.

It is recommended that mappers aquaint themselves with the general concepts and elements of [[Legacy:Gameplay|Gameplay]], [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]] before proceeding.

==Inspirational Sources==

Inspiration can come from unconventional sources; layout ideas can come from styrafoam packaging, texture ideas can come from nature, unreal gameplay ideas can come from board games, etc.  Consider random sources and experiment with limits of perception to find new ways of looking at the world around you.  This section includes various links and ideas that help find inspiration for map designs, themes or styles.

===General===
* Look at existing maps to get an idea of what style you like, whether that be a particular style of lighting or of architecture.
* Take ideas from television or films; the sets, the buildings, the lighting, the sounds (''for example, the dark gothic tower in Batman or those seen in the Lord of The Rings trilogy'').
* Look at the wiki pages [[Legacy:Static_Mesh_Package|Static_Mesh_Package]] and [[Legacy:Texture_Package|Texture_Package]] when deciding what static meshes and which textures to use in your map.

===Topics===
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; The Wiki page on map ideas.

===Links===
* [http://www.castlewales.com/life.html Rooms of a Castle] &amp;ndash; What's needed to give an impression of people living in your ancient arena.
* [http://www.greatmirror.com/ GreatMirror.com] &amp;ndash; A collection of photos from neat outdoor and ancient settings.
* [http://www.greatbuildings.com/ GreatBuildings.com] &amp;ndash; An architectual site.
* [http://unrealplayground.com/forums/showthread.php?t=23839 UP Forums &quot;Mapping Ideas&quot; Thread] &amp;ndash; An ongoing discussion and exchange of map ideas for the Unreal Engine.
* [http://www.unrealplayground.com/forums/showthread.php?p=554718 UP Forums &quot;Environmental Inspiration for Mappers&quot; Thread] &amp;ndash; An ongoing discussion with links to great environmental inspirations.
* [http://www.creativitypool.com/ CreativityPool.com] &amp;ndash; A site devoted to free idea exchange.

==Planning==

These are the primary ideas to organize for map design.  It is strongly recommended that you write down your ideas as they come to you.  You may not end up using them all, some may even be contradictory, but you will be in a stronger position to design once you have all your ideas in once place.

===Gametype===

Review any speical requirements for the [[Legacy:Gametype|gametype]] you are mapping for.  Should the layout be open (like DeathMatch or Onslaught) or more linear (like Assault or Capture The Flag)?  Does this gametype allow vehicles?  What [[Legacy:GameObjective|GameObjective]]s are involved?  By in large, the map design will be centered around the requirements and guidelines of it's designated gametype.

===Goals===

Define the unique purpose of the map.  What will make this map stand out from other maps of this gametype?  What will the focus of the map be?  What elements of the gameplay can be affected by this design?  Write down one sentence that clearly defines the unique goal for this map.

===Theme===

Choose a compelling theme.  Don't be afraid to explore vastly different themes.  Often once one theme is fully considered, another one comes to mind.  Sometimes the original theme idea is strengthened by considering others.  Pick one theme that will strongly address the goal for this map.

===Scope===

Define the size of this map's gameplay.  Based on the goal and theme of the map, make decisions about the scale of the map size, the number of players this map should hold, the number or difficulty of the game objectives (if this gametype has them).  Would this map's goal and theme be best served with a tight layout and a small number of players, or with a grand landscape and several available vehicles?  Should this design be small but open-ended, or linear and very involved; required several steps to complete?  Choose an approximate scope for this map based on it's goal and theme; make notes on map size, suggested player count, game objectives, etc. 

===Special Features===

Any unique elements of this map should be clearly defined and possibly tested separately before further work is done.  Are there elements that you can imagine that would strongly support the goal, theme and scope of this map?  Will this map need custom static meshes?  A new particle effect?  A unique trigger system?  Identify these special features early and make note of them.

==Visualizing==

After you have thought of a few ideas and written them down, it's time to think of how you're actually going to manifest your ideas to the Unreal Editor.  The idea now is to play with different layouts, different designs.  Try many different ways of configuring the elements of the map design until you find things that work best.  These are some methods of solidifying the plan.  Choose a method that is comfortable to you.

===Pencil and Paper===

This is a simplest form of visualizing.  The drawing doesn't have to be pretty, just functional and accurate enough to visualize walking through the layout.  Sketch out the floor plan; a top down view of the layout.  Make several floor plans for each level, if it's a multi-story layout.  Sketch key unique elements or features that will give the map it's character. Try using grid paper.

===Drawing / Painting Application===

Instead of using a pencil and paper, it might be easier for you to use a paint program.  As with the pencil and paper, make multiple drawings for each level of the layout and try to make visual notes and representations of key unique elements of the map.  The advantage of using this method is you can take the resulting drawing straight into the editor and use it as a guide during construction, by applying it as a texture to a plane at the bottom of the editor space.

===Cutouts / Models===

Either with toy building blocks, clay, wood, paper or cardboard, simple models can be made to represent the hallways, rooms, stairs, ledges, outdoor buildings, etc. of your layout.  These elements can be shifted around and playfully reconnected to find a variety of layout designs.  

===Segmenting Layouts (&quot;Frankenmapping&quot;)===

In the editor, other maps (or '''copies''' of them) can be raided for their layout elements.  Make a temporary test map.  A hallway can be cut from one map and pasted into the test map and combined with a stairway from another map, or a room from a third map.  While the walls may not line up and the detail elements (such as textures, static mesh trim, etc.) may not match, but the resulting test map should give an approximate representation of a layout.  You do not need to try and playtest the map (it will most likely crash or be filled with HOMs), but you can easily navigate around the layout through the editor.  It is recommended that you keep the editor's grid lock enabled at all times.

==Early Testing==

Before construction begins, this is the time to use the visualizations to expose potential problems with flow, appearance or techinical issues.  When problems do arise, you will only have to rework the visualization of your design, not the construction of the design, so it should come as a relief rather than a frustration.

===Basic Gameplay===
* Review the requirements and guidelines for the [[Legacy:Gametype|gametype]] this map is designed for and check it against your current design.
* Take this opportunity to review the elements and concepts of [[Legacy:Map Design|Map Design]] and see how your current design measures up.
* Imagine yourself playing this map; reaching objectives, attacking, defending, playing on different teams, etc.  You may become further inspired to make changes based on elements that you find during this process.

===Sight Lines===
* Review the look of the layout from all angles and all points in the map.  You may find spots to improve or elements you would like to highlight.
* Check to make sure the map doesn't provide huge, long-range vista views.  This could prove to be a framerate killer later on.
* Look for architechture that might improve in appearance with a little layout adjustment, check for lighting hotspots or dark holes, find bland spots in the map and think of ways to make them interesting.

===Map Flow===
* Look for dead ends, long narrow hallways or other elements that will kill [[Legacy:Map Flow|Map Flow]].
* Visualize a player navigating your layout between random points in the map.  Is there an obvious problem getting from here to there?  Make adjustments that will allow a player to get anywhere from anywhere fairly quickly.
* Does the layout make good use of the [[Legacy:Z-Axis|Z-Axis]] with plenty of vertical movement and vertical combat options?  Make notes on good spots to place [[Legacy:UTJumpPad|UTJumpPad]]s, [[Legacy:Mover|Mover]]s, [[Legacy:Teleporter|Teleporter]]s, or the like.  Think about opening up something like windows or grates in the floor or ceiling.
* Make notes on good spots to place PlayerStarts, Inventory Items, Vehicle Factories and the GameObjectives.

===Technical Issues===

Make a note of the technical elements of the map and think about testing them separately '''before''' you begin construction.
* Will this map need special [[Legacy:Trigger Systems|Trigger Systems]]?  Can you do it with a [[Legacy:ScriptedTrigger|ScriptedTrigger]]?
* Are there any elements that can't be created with stock Objects?  Can you come up with a workaround or code your own custom Object?
* Are the technical elements of your map &lt;u&gt;too&lt;/u&gt; technical?  Would they essentially require a custom mod or mutator?  Test out the elements early on to avoid basing your map on something that you can't complete.

====A Note About Techincal Elements====

Think about what it is you're capable of.  There's no shame in asking another more experienced mapper to help if they are willing and have the time; you could learn from them and pick up a few useful hints along the way. Just a friendly word of advice: if you do get help from someone else in the mapping process, always grant them some of the credit in the Readme file.  It shows you're grateful to them for taking the time and for helping you learn something useful.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map File Prefix|Map File Prefix]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] (UT2004 only)
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] (UT only)
** [[Legacy:Mapping For DDOM|Mapping For DDOM]] (UT200x)
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:''' Revised.  Comments welcome.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5070</id>
      <timestamp>2008-03-12T18:07:42Z</timestamp>
      <contributor>
        <ip>5377da89.adsl.wanadoo.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page outlines techiniques and methods useful in planning a successful map design.

==Overview==

{{innerbox| If you fail to plan, you plan to fail. '''&amp;ndash; Anonymous'''

}}

Building contractors have a saying that is applicable to mappers as well: &quot;Measure twice, cut once.&quot;  The idea is that you can save time, effort and materials by planning ahead and visualizing the design before work begins.  While some may swear by &quot;improvisational mapping&quot;, most would have to agree that mapping is hard work and takes long enough without mistakes and miscalculations that require reworking, or worse, redoing.

Once the mapper has become inspired by some source to create a compelling design, they can begin to define the details of the map and create a visualization of a workable layout.  Then before construction, the map designer can use their visualizations to work out any problems that could arise with respect to appearance, map flow or technical issues.  After that, the mapper can proceed with construction, confident that most of the potential &quot;show stopper&quot; problems have been solved already.

It is recommended that mappers aquaint themselves with the general concepts and elements of [[Legacy:Gameplay|Gameplay]], [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]] before proceeding.

==Inspirational Sources==

Inspiration can come from unconventional sources; layout ideas can come from styrafoam packaging, texture ideas can come from nature, unreal gameplay ideas can come from board games, etc.  Consider random sources and experiment with limits of perception to find new ways of looking at the world around you.  This section includes various links and ideas that help find inspiration for map designs, themes or styles.

===General===
* Look at existing maps to get an idea of what style you like, whether that be a particular style of lighting or of architecture.
* Take ideas from television or films; the sets, the buildings, the lighting, the sounds (''for example, the dark gothic tower in Batman or those seen in the Lord of The Rings trilogy'').
* Look at the wiki pages [[Legacy:Static_Mesh_Package|Static_Mesh_Package]] and [[Legacy:Texture_Package|Texture_Package]] when deciding what static meshes and which textures to use in your map.

===Topics===
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; The Wiki page on map ideas.

===Links===
* [http://www.castlewales.com/life.html Rooms of a Castle] &amp;ndash; What's needed to give an impression of people living in your ancient arena.
* [http://www.greatmirror.com/ GreatMirror.com] &amp;ndash; A collection of photos from neat outdoor and ancient settings.
* [http://www.greatbuildings.com/ GreatBuildings.com] &amp;ndash; An architectual site.
* [http://unrealplayground.com/forums/showthread.php?t=23839 UP Forums &quot;Mapping Ideas&quot; Thread] &amp;ndash; An ongoing discussion and exchange of map ideas for the Unreal Engine.
* [http://www.unrealplayground.com/forums/showthread.php?p=554718 UP Forums &quot;Environmental Inspiration for Mappers&quot; Thread] &amp;ndash; An ongoing discussion with links to great environmental inspirations.
* [http://www.creativitypool.com/ CreativityPool.com] &amp;ndash; A site devoted to free idea exchange.

==Planning==

These are the primary ideas to organize for map design.  It is strongly recommended that you write down your ideas as they come to you.  You may not end up using them all, some may even be contradictory, but you will be in a stronger position to design once you have all your ideas in once place.

===Gametype===

Review any speical requirements for the [[Legacy:Gametype|gametype]] you are mapping for.  Should the layout be open (like DeathMatch or Onslaught) or more linear (like Assault or Capture The Flag)?  Does this gametype allow vehicles?  What [[Legacy:GameObjective|GameObjective]]s are involved?  By in large, the map design will be centered around the requirements and guidelines of it's designated gametype.

===Goals===

Define the unique purpose of the map.  What will make this map stand out from other maps of this gametype?  What will the focus of the map be?  What elements of the gameplay can be affected by this design?  Write down one sentence that clearly defines the unique goal for this map.

===Theme===

Choose a compelling theme.  Don't be afraid to explore vastly different themes.  Often once one theme is fully considered, another one comes to mind.  Sometimes the original theme idea is strengthened by considering others.  Pick one theme that will strongly address the goal for this map.

===Scope===

Define the size of this map's gameplay.  Based on the goal and theme of the map, make decisions about the scale of the map size, the number of players this map should hold, the number or difficulty of the game objectives (if this gametype has them).  Would this map's goal and theme be best served with a tight layout and a small number of players, or with a grand landscape and several available vehicles?  Should this design be small but open-ended, or linear and very involved; required several steps to complete?  Choose an approximate scope for this map based on it's goal and theme; make notes on map size, suggested player count, game objectives, etc. 

===Special Features===

Any unique elements of this map should be clearly defined and possibly tested separately before further work is done.  Are there elements that you can imagine that would strongly support the goal, theme and scope of this map?  Will this map need custom static meshes?  A new particle effect?  A unique trigger system?  Identify these special features early and make note of them.

==Visualizing==

After you have thought of a few ideas and written them down, it's time to think of how you're actually going to manifest your ideas to the Unreal Editor.  The idea now is to play with different layouts, different designs.  Try many different ways of configuring the elements of the map design until you find things that work best.  These are some methods of solidifying the plan.  Choose a method that is comfortable to you.

===Pencil and Paper===

This is a simplest form of visualizing.  The drawing doesn't have to be pretty, just functional and accurate enough to visualize walking through the layout.  Sketch out the floor plan; a top down view of the layout.  Make several floor plans for each level, if it's a multi-story layout.  Sketch key unique elements or features that will give the map it's character. Try using grid paper.

===Drawing / Painting Application===

Instead of using a pencil and paper, it might be easier for you to use a paint program.  As with the pencil and paper, make multiple drawings for each level of the layout and try to make visual notes and representations of key unique elements of the map.  The advantage of using this method is you can take the resulting drawing straight into the editor and use it as a guide during construction, by applying it as a texture to a plane at the bottom of the editor space.

===Cutouts / Models===

Either with toy building blocks, clay, wood, paper or cardboard, simple models can be made to represent the hallways, rooms, stairs, ledges, outdoor buildings, etc. of your layout.  These elements can be shifted around and playfully reconnected to find a variety of layout designs.  

===Segmenting Layouts (&quot;Frankenmapping&quot;)===

In the editor, other maps (or '''copies''' of them) can be raided for their layout elements.  Make a temporary test map.  A hallway can be cut from one map and pasted into the test map and combined with a stairway from another map, or a room from a third map.  While the walls may not line up and the detail elements (such as textures, static mesh trim, etc.) may not match, but the resulting test map should give an approximate representation of a layout.  You do not need to try and playtest the map (it will most likely crash or be filled with HOMs), but you can easily navigate around the layout through the editor.  It is recommended that you keep the editor's grid lock enabled at all times.

==Early Testing==

Before construction begins, this is the time to use the visualizations to expose potential problems with flow, appearance or techinical issues.  When problems do arise, you will only have to rework the visualization of your design, not the construction of the design, so it should come as a relief rather than a frustration.

===Basic Gameplay===
* Review the requirements and guidelines for the [[Legacy:Gametype|gametype]] this map is designed for and check it against your current design.
* Take this opportunity to review the elements and concepts of [[Legacy:Map Design|Map Design]] and see how your current design measures up.
* Imagine yourself playing this map; reaching objectives, attacking, defending, playing on different teams, etc.  You may become further inspired to make changes based on elements that you find during this process.

===Sight Lines===
* Review the look of the layout from all angles and all points in the map.  You may find spots to improve or elements you would like to highlight.
* Check to make sure the map doesn't provide huge, long-range vista views.  This could prove to be a framerate killer later on.
* Look for architechture that might improve in appearance with a little layout adjustment, check for lighting hotspots or dark holes, find bland spots in the map and think of ways to make them interesting.

===Map Flow===
* Look for dead ends, long narrow hallways or other elements that will kill [[Legacy:Map Flow|Map Flow]].
* Visualize a player navigating your layout between random points in the map.  Is there an obvious problem getting from here to there?  Make adjustments that will allow a player to get anywhere from anywhere fairly quickly.
* Does the layout make good use of the [[Legacy:Z-Axis|Z-Axis]] with plenty of vertical movement and vertical combat options?  Make notes on good spots to place [[Legacy:UTJumpPad|UTJumpPad]]s, [[Legacy:Mover|Mover]]s, [[Legacy:Teleporter|Teleporter]]s, or the like.  Think about opening up something like windows or grates in the floor or ceiling.
* Make notes on good spots to place PlayerStarts, Inventory Items, Vehicle Factories and the GameObjectives.

===Technical Issues===

Make a note of the technical elements of the map and think about testing them separately '''before''' you begin construction.
* Will this map need special [[Legacy:Trigger Systems|Trigger Systems]]?  Can you do it with a [[Legacy:ScriptedTrigger|ScriptedTrigger]]?
* Are there any elements that can't be created with stock Objects?  Can you come up with a workaround or code your own custom Object?
* Are the technical elements of your map &lt;u&gt;too&lt;/u&gt; technical?  Would they essentially require a custom mod or mutator?  Test out the elements early on to avoid basing your map on something that you can't complete.

====A Note About Techincal Elements====

Think about what it is you're capable of.  There's no shame in asking another more experienced mapper to help if they are willing and have the time; you could learn from them and pick up a few useful hints along the way. Just a friendly word of advice: if you do get help from someone else in the mapping process, always grant them some of the credit in the Readme file.  It shows you're grateful to them for taking the time and for helping you learn something useful.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map File Prefix|Map File Prefix]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] (UT2004 only)
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] (UT only)
** [[Legacy:Mapping For DDOM|Mapping For DDOM]] (UT200x)
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:''' Revised.  Comments welcome.

'''Bioslimer_[nl]''' nice and, thank you 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5071</id>
      <timestamp>2008-03-25T19:36:29Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page outlines techiniques and methods useful in planning a successful map design.

==Overview==

{{innerbox| If you fail to plan, you plan to fail. '''&amp;ndash; Anonymous'''

}}

Building contractors have a saying that is applicable to mappers as well: &quot;Measure twice, cut once.&quot;  The idea is that you can save time, effort and materials by planning ahead and visualizing the design before work begins.  While some may swear by &quot;improvisational mapping&quot;, most would have to agree that mapping is hard work and takes long enough without mistakes and miscalculations that require reworking, or worse, redoing.

Once the mapper has become inspired by some source to create a compelling design, they can begin to define the details of the map and create a visualization of a workable layout.  Then before construction, the map designer can use their visualizations to work out any problems that could arise with respect to appearance, map flow or technical issues.  After that, the mapper can proceed with construction, confident that most of the potential &quot;show stopper&quot; problems have been solved already.

It is recommended that mappers aquaint themselves with the general concepts and elements of [[Legacy:Gameplay|Gameplay]], [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]] before proceeding.

==Inspirational Sources==

Inspiration can come from unconventional sources; layout ideas can come from styrafoam packaging, texture ideas can come from nature, unreal gameplay ideas can come from board games, etc.  Consider random sources and experiment with limits of perception to find new ways of looking at the world around you.  This section includes various links and ideas that help find inspiration for map designs, themes or styles.

===General===
* Look at existing maps to get an idea of what style you like, whether that be a particular style of lighting or of architecture.
* Take ideas from television or films; the sets, the buildings, the lighting, the sounds (''for example, the dark gothic tower in Batman or those seen in the Lord of The Rings trilogy'').
* Look at the wiki pages [[Legacy:Static_Mesh_Package|Static_Mesh_Package]] and [[Legacy:Texture_Package|Texture_Package]] when deciding what static meshes and which textures to use in your map.

===Topics===
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; The Wiki page on map ideas.

===Links===
* [http://www.castlewales.com/life.html Rooms of a Castle] &amp;ndash; What's needed to give an impression of people living in your ancient arena.
* [http://www.greatmirror.com/ GreatMirror.com] &amp;ndash; A collection of photos from neat outdoor and ancient settings.
* [http://www.greatbuildings.com/ GreatBuildings.com] &amp;ndash; An architectual site.
* [http://unrealplayground.com/forums/showthread.php?t=23839 UP Forums &quot;Mapping Ideas&quot; Thread] &amp;ndash; An ongoing discussion and exchange of map ideas for the Unreal Engine.
* [http://www.unrealplayground.com/forums/showthread.php?p=554718 UP Forums &quot;Environmental Inspiration for Mappers&quot; Thread] &amp;ndash; An ongoing discussion with links to great environmental inspirations.
* [http://www.creativitypool.com/ CreativityPool.com] &amp;ndash; A site devoted to free idea exchange.

==Planning==

These are the primary ideas to organize for map design.  It is strongly recommended that you write down your ideas as they come to you.  You may not end up using them all, some may even be contradictory, but you will be in a stronger position to design once you have all your ideas in once place.

===Gametype===

Review any speical requirements for the [[Legacy:Gametype|gametype]] you are mapping for.  Should the layout be open (like DeathMatch or Onslaught) or more linear (like Assault or Capture The Flag)?  Does this gametype allow vehicles?  What [[Legacy:GameObjective|GameObjective]]s are involved?  By in large, the map design will be centered around the requirements and guidelines of it's designated gametype.

===Goals===

Define the unique purpose of the map.  What will make this map stand out from other maps of this gametype?  What will the focus of the map be?  What elements of the gameplay can be affected by this design?  Write down one sentence that clearly defines the unique goal for this map.

===Theme===

Choose a compelling theme.  Don't be afraid to explore vastly different themes.  Often once one theme is fully considered, another one comes to mind.  Sometimes the original theme idea is strengthened by considering others.  Pick one theme that will strongly address the goal for this map.

===Scope===

Define the size of this map's gameplay.  Based on the goal and theme of the map, make decisions about the scale of the map size, the number of players this map should hold, the number or difficulty of the game objectives (if this gametype has them).  Would this map's goal and theme be best served with a tight layout and a small number of players, or with a grand landscape and several available vehicles?  Should this design be small but open-ended, or linear and very involved; required several steps to complete?  Choose an approximate scope for this map based on it's goal and theme; make notes on map size, suggested player count, game objectives, etc. 

===Special Features===

Any unique elements of this map should be clearly defined and possibly tested separately before further work is done.  Are there elements that you can imagine that would strongly support the goal, theme and scope of this map?  Will this map need custom static meshes?  A new particle effect?  A unique trigger system?  Identify these special features early and make note of them.

==Visualizing==

After you have thought of a few ideas and written them down, it's time to think of how you're actually going to manifest your ideas to the Unreal Editor.  The idea now is to play with different layouts, different designs.  Try many different ways of configuring the elements of the map design until you find things that work best.  These are some methods of solidifying the plan.  Choose a method that is comfortable to you.

===Pencil and Paper===

This is a simplest form of visualizing.  The drawing doesn't have to be pretty, just functional and accurate enough to visualize walking through the layout.  Sketch out the floor plan; a top down view of the layout.  Make several floor plans for each level, if it's a multi-story layout.  Sketch key unique elements or features that will give the map it's character. Try using grid paper.

===Drawing / Painting Application===

Instead of using a pencil and paper, it might be easier for you to use a paint program.  As with the pencil and paper, make multiple drawings for each level of the layout and try to make visual notes and representations of key unique elements of the map.  The advantage of using this method is you can take the resulting drawing straight into the editor and use it as a guide during construction, by applying it as a texture to a plane at the bottom of the editor space.

===Cutouts / Models===

Either with toy building blocks, clay, wood, paper or cardboard, simple models can be made to represent the hallways, rooms, stairs, ledges, outdoor buildings, etc. of your layout.  These elements can be shifted around and playfully reconnected to find a variety of layout designs.  

===Segmenting Layouts (&quot;Frankenmapping&quot;)===

In the editor, other maps (or '''copies''' of them) can be raided for their layout elements.  Make a temporary test map.  A hallway can be cut from one map and pasted into the test map and combined with a stairway from another map, or a room from a third map.  While the walls may not line up and the detail elements (such as textures, static mesh trim, etc.) may not match, but the resulting test map should give an approximate representation of a layout.  You do not need to try and playtest the map (it will most likely crash or be filled with HOMs), but you can easily navigate around the layout through the editor.  It is recommended that you keep the editor's grid lock enabled at all times.

==Early Testing==

Before construction begins, this is the time to use the visualizations to expose potential problems with flow, appearance or techinical issues.  When problems do arise, you will only have to rework the visualization of your design, not the construction of the design, so it should come as a relief rather than a frustration.

===Basic Gameplay===
* Review the requirements and guidelines for the [[Legacy:Gametype|gametype]] this map is designed for and check it against your current design.
* Take this opportunity to review the elements and concepts of [[Legacy:Map Design|Map Design]] and see how your current design measures up.
* Imagine yourself playing this map; reaching objectives, attacking, defending, playing on different teams, etc.  You may become further inspired to make changes based on elements that you find during this process.

===Sight Lines===
* Review the look of the layout from all angles and all points in the map.  You may find spots to improve or elements you would like to highlight.
* Check to make sure the map doesn't provide huge, long-range vista views.  This could prove to be a framerate killer later on.
* Look for architechture that might improve in appearance with a little layout adjustment, check for lighting hotspots or dark holes, find bland spots in the map and think of ways to make them interesting.

===Map Flow===
* Look for dead ends, long narrow hallways or other elements that will kill [[Legacy:Map Flow|Map Flow]].
* Visualize a player navigating your layout between random points in the map.  Is there an obvious problem getting from here to there?  Make adjustments that will allow a player to get anywhere from anywhere fairly quickly.
* Does the layout make good use of the [[Legacy:Z-Axis|Z-Axis]] with plenty of vertical movement and vertical combat options?  Make notes on good spots to place [[Legacy:UTJumpPad|UTJumpPad]]s, [[Legacy:Mover|Mover]]s, [[Legacy:Teleporter|Teleporter]]s, or the like.  Think about opening up something like windows or grates in the floor or ceiling.
* Make notes on good spots to place PlayerStarts, Inventory Items, Vehicle Factories and the GameObjectives.

===Technical Issues===

Make a note of the technical elements of the map and think about testing them separately '''before''' you begin construction.
* Will this map need special [[Legacy:Trigger Systems|Trigger Systems]]?  Can you do it with a [[Legacy:ScriptedTrigger|ScriptedTrigger]]?
* Are there any elements that can't be created with stock Objects?  Can you come up with a workaround or code your own custom Object?
* Are the technical elements of your map &lt;u&gt;too&lt;/u&gt; technical?  Would they essentially require a custom mod or mutator?  Test out the elements early on to avoid basing your map on something that you can't complete.

====A Note About Techincal Elements====

Think about what it is you're capable of.  There's no shame in asking another more experienced mapper to help if they are willing and have the time; you could learn from them and pick up a few useful hints along the way. Just a friendly word of advice: if you do get help from someone else in the mapping process, always grant them some of the credit in the Readme file.  It shows you're grateful to them for taking the time and for helping you learn something useful.

==External References==
* [[udn2:UT3MultiplayerMapTheory]]

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map File Prefix|Map File Prefix]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] (UT2004 only)
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] (UT only)
** [[Legacy:Mapping For DDOM|Mapping For DDOM]] (UT200x)
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:''' Revised.  Comments welcome.

'''Bioslimer_[nl]''' nice and, thank you 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44508</id>
      <timestamp>2011-07-06T02:35:38Z</timestamp>
      <contributor>
        <ip>99.73.119.81</ip>
      </contributor>
      <comment>/* Gametype */</comment>
      <text xml:space="preserve">This page outlines techiniques and methods useful in planning a successful map design.

==Overview==

{{innerbox| If you fail to plan, you plan to fail. '''&amp;ndash; Anonymous'''

}}

Building contractors have a saying that is applicable to mappers as well: &quot;Measure twice, cut once.&quot;  The idea is that you can save time, effort and materials by planning ahead and visualizing the design before work begins.  While some may swear by &quot;improvisational mapping&quot;, most would have to agree that mapping is hard work and takes long enough without mistakes and miscalculations that require reworking, or worse, redoing.

Once the mapper has become inspired by some source to create a compelling design, they can begin to define the details of the map and create a visualization of a workable layout.  Then before construction, the map designer can use their visualizations to work out any problems that could arise with respect to appearance, map flow or technical issues.  After that, the mapper can proceed with construction, confident that most of the potential &quot;show stopper&quot; problems have been solved already.

It is recommended that mappers aquaint themselves with the general concepts and elements of [[Legacy:Gameplay|Gameplay]], [[Legacy:Map Design|Map Design]] and [[Legacy:Map Flow|Map Flow]] before proceeding.

==Inspirational Sources==

Inspiration can come from unconventional sources; layout ideas can come from styrafoam packaging, texture ideas can come from nature, unreal gameplay ideas can come from board games, etc.  Consider random sources and experiment with limits of perception to find new ways of looking at the world around you.  This section includes various links and ideas that help find inspiration for map designs, themes or styles.

===General===
* Look at existing maps to get an idea of what style you like, whether that be a particular style of lighting or of architecture.
* Take ideas from television or films; the sets, the buildings, the lighting, the sounds (''for example, the dark gothic tower in Batman or those seen in the Lord of The Rings trilogy'').
* Look at the wiki pages [[Legacy:Static_Mesh_Package|Static_Mesh_Package]] and [[Legacy:Texture_Package|Texture_Package]] when deciding what static meshes and which textures to use in your map.

===Topics===
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; The Wiki page on map ideas.

===Links===
* [http://www.castlewales.com/life.html Rooms of a Castle] &amp;ndash; What's needed to give an impression of people living in your ancient arena.
* [http://www.greatmirror.com/ GreatMirror.com] &amp;ndash; A collection of photos from neat outdoor and ancient settings.
* [http://www.greatbuildings.com/ GreatBuildings.com] &amp;ndash; An architectual site.
* [http://unrealplayground.com/forums/showthread.php?t=23839 UP Forums &quot;Mapping Ideas&quot; Thread] &amp;ndash; An ongoing discussion and exchange of map ideas for the Unreal Engine.
* [http://www.unrealplayground.com/forums/showthread.php?p=554718 UP Forums &quot;Environmental Inspiration for Mappers&quot; Thread] &amp;ndash; An ongoing discussion with links to great environmental inspirations.
* [http://www.creativitypool.com/ CreativityPool.com] &amp;ndash; A site devoted to free idea exchange.

==Planning==

These are the primary ideas to organize for map design.  It is strongly recommended that you write down your ideas as they come to you.  You may not end up using them all, some may even be contradictory, but you will be in a stronger position to design once you have all your ideas in once place.

===Gametype===

Review any speical requirements for the [[Legacy:Gametype|gametype]] you are mapping for.  Should the layout be open (like DeathMatch or Onslaught) or more linear (like Assault or Capture The Flag)?  Does this gametype allow vehicles?  What [[Legacy:GameObjective|GameObjective]]s are involved?  By and large, the map design will be centered around the requirements and guidelines of its designated gametype.

===Goals===

Define the unique purpose of the map.  What will make this map stand out from other maps of this gametype?  What will the focus of the map be?  What elements of the gameplay can be affected by this design?  Write down one sentence that clearly defines the unique goal for this map.

===Theme===

Choose a compelling theme.  Don't be afraid to explore vastly different themes.  Often once one theme is fully considered, another one comes to mind.  Sometimes the original theme idea is strengthened by considering others.  Pick one theme that will strongly address the goal for this map.

===Scope===

Define the size of this map's gameplay.  Based on the goal and theme of the map, make decisions about the scale of the map size, the number of players this map should hold, the number or difficulty of the game objectives (if this gametype has them).  Would this map's goal and theme be best served with a tight layout and a small number of players, or with a grand landscape and several available vehicles?  Should this design be small but open-ended, or linear and very involved; required several steps to complete?  Choose an approximate scope for this map based on it's goal and theme; make notes on map size, suggested player count, game objectives, etc. 

===Special Features===

Any unique elements of this map should be clearly defined and possibly tested separately before further work is done.  Are there elements that you can imagine that would strongly support the goal, theme and scope of this map?  Will this map need custom static meshes?  A new particle effect?  A unique trigger system?  Identify these special features early and make note of them.

==Visualizing==

After you have thought of a few ideas and written them down, it's time to think of how you're actually going to manifest your ideas to the Unreal Editor.  The idea now is to play with different layouts, different designs.  Try many different ways of configuring the elements of the map design until you find things that work best.  These are some methods of solidifying the plan.  Choose a method that is comfortable to you.

===Pencil and Paper===

This is a simplest form of visualizing.  The drawing doesn't have to be pretty, just functional and accurate enough to visualize walking through the layout.  Sketch out the floor plan; a top down view of the layout.  Make several floor plans for each level, if it's a multi-story layout.  Sketch key unique elements or features that will give the map it's character. Try using grid paper.

===Drawing / Painting Application===

Instead of using a pencil and paper, it might be easier for you to use a paint program.  As with the pencil and paper, make multiple drawings for each level of the layout and try to make visual notes and representations of key unique elements of the map.  The advantage of using this method is you can take the resulting drawing straight into the editor and use it as a guide during construction, by applying it as a texture to a plane at the bottom of the editor space.

===Cutouts / Models===

Either with toy building blocks, clay, wood, paper or cardboard, simple models can be made to represent the hallways, rooms, stairs, ledges, outdoor buildings, etc. of your layout.  These elements can be shifted around and playfully reconnected to find a variety of layout designs.  

===Segmenting Layouts (&quot;Frankenmapping&quot;)===

In the editor, other maps (or '''copies''' of them) can be raided for their layout elements.  Make a temporary test map.  A hallway can be cut from one map and pasted into the test map and combined with a stairway from another map, or a room from a third map.  While the walls may not line up and the detail elements (such as textures, static mesh trim, etc.) may not match, but the resulting test map should give an approximate representation of a layout.  You do not need to try and playtest the map (it will most likely crash or be filled with HOMs), but you can easily navigate around the layout through the editor.  It is recommended that you keep the editor's grid lock enabled at all times.

==Early Testing==

Before construction begins, this is the time to use the visualizations to expose potential problems with flow, appearance or techinical issues.  When problems do arise, you will only have to rework the visualization of your design, not the construction of the design, so it should come as a relief rather than a frustration.

===Basic Gameplay===
* Review the requirements and guidelines for the [[Legacy:Gametype|gametype]] this map is designed for and check it against your current design.
* Take this opportunity to review the elements and concepts of [[Legacy:Map Design|Map Design]] and see how your current design measures up.
* Imagine yourself playing this map; reaching objectives, attacking, defending, playing on different teams, etc.  You may become further inspired to make changes based on elements that you find during this process.

===Sight Lines===
* Review the look of the layout from all angles and all points in the map.  You may find spots to improve or elements you would like to highlight.
* Check to make sure the map doesn't provide huge, long-range vista views.  This could prove to be a framerate killer later on.
* Look for architechture that might improve in appearance with a little layout adjustment, check for lighting hotspots or dark holes, find bland spots in the map and think of ways to make them interesting.

===Map Flow===
* Look for dead ends, long narrow hallways or other elements that will kill [[Legacy:Map Flow|Map Flow]].
* Visualize a player navigating your layout between random points in the map.  Is there an obvious problem getting from here to there?  Make adjustments that will allow a player to get anywhere from anywhere fairly quickly.
* Does the layout make good use of the [[Legacy:Z-Axis|Z-Axis]] with plenty of vertical movement and vertical combat options?  Make notes on good spots to place [[Legacy:UTJumpPad|UTJumpPad]]s, [[Legacy:Mover|Mover]]s, [[Legacy:Teleporter|Teleporter]]s, or the like.  Think about opening up something like windows or grates in the floor or ceiling.
* Make notes on good spots to place PlayerStarts, Inventory Items, Vehicle Factories and the GameObjectives.

===Technical Issues===

Make a note of the technical elements of the map and think about testing them separately '''before''' you begin construction.
* Will this map need special [[Legacy:Trigger Systems|Trigger Systems]]?  Can you do it with a [[Legacy:ScriptedTrigger|ScriptedTrigger]]?
* Are there any elements that can't be created with stock Objects?  Can you come up with a workaround or code your own custom Object?
* Are the technical elements of your map &lt;u&gt;too&lt;/u&gt; technical?  Would they essentially require a custom mod or mutator?  Test out the elements early on to avoid basing your map on something that you can't complete.

====A Note About Techincal Elements====

Think about what it is you're capable of.  There's no shame in asking another more experienced mapper to help if they are willing and have the time; you could learn from them and pick up a few useful hints along the way. Just a friendly word of advice: if you do get help from someone else in the mapping process, always grant them some of the credit in the Readme file.  It shows you're grateful to them for taking the time and for helping you learn something useful.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Mapping Checklist|Mapping Checklist]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map File Prefix|Map File Prefix]]
* Mapping for specific [[Legacy:Gametype|Gametype]]s
** [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
** [[Legacy:Mapping For AS (UT2004)|Mapping for AS (UT2004)]]
** [[Legacy:Mapping For ONS|Mapping For ONS]]
** [[Legacy:Mapping For BR|Mapping For BR]]
** [[Legacy:Mapping For CTF|Mapping For CTF]]
** [[Legacy:Mapping For VCTF|Mapping For VCTF]] (UT2004 only)
** [[Legacy:Mapping For DM|Mapping For DM]]
** [[Legacy:Mapping For DOM|Mapping For DOM]] (UT only)
** [[Legacy:Mapping For DDOM|Mapping For DDOM]] (UT200x)
** [[Legacy:Mapping For Jailbreak|Mapping For Jailbreak]]
** [[Legacy:Mapping For UT Jailbreak|Mapping For UT Jailbreak]]
** [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]]

==Discussion==

'''SuperApe:''' Revised.  Comments welcome.

'''Bioslimer_[nl]''' nice and, thank you 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MapList</title>
    <id>1846</id>
    <revision>
      <id>4533</id>
      <timestamp>2004-11-24T14:01:24Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>categorized as UT class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; MapList (Package: Engine)}}

Used to create a list of maps for a [[Legacy:GameInfo (UT)|GameInfo (UT)]].

==Properties==
; config string Maps[32] : The list of map names.
; config int MapNum : Number current map.

==Methods==
; string GetNextMap ( ) : Gets the name of the next map in the rotation. This map's number is saved in the &lt;tt&gt;MapNum&lt;/tt&gt; property.

==Known Subclasses==

===Unreal===
* DMmaplist
* DKmaplist (list of DarkMatch maps, empty)

===Unreal Tournament===
* ASDefaultMapList (default [[Legacy:Assault|Assault]] map list)
* ASMapList (currently selected Assault maps)
* CTFDefaultMapList (default [[Legacy:CTFGame (UT)|CTF]] map list)
* CTFBonusMapList (Bonuspack 1 CTF maps)
* CTFMapList (currently selected CTF maps)
* DOMDefaultMapList (default [[Legacy:Domination|Domination]] map list)
* DOMMapList (currently selected Domination maps)
* TDKDefaultMapList (default [[Legacy:TDarkMatch|Tournament DarkMatch]] map list, empty)
* TDKMapList (currently selected DarkMatch maps)
* TDMDefaultMapList (default [[Legacy:DeathMatchPlus|Tournament DeathMatch]] map list)
* TDMSmallMapList (smaller DeathMatch maps)
* TDMMediumMapList (medium-sized DeathMatch maps)
* TDMLargeMapList (large DeathMatch maps)
* TDMBonusMapList (Bonuspack 1 DeathMatch maps)
* TDMmaplist (currently selected DeathMatch maps)

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4534</id>
      <timestamp>2002-09-11T09:41:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; MapList}}

Used to create a list of maps for a [[Legacy:GameInfo (UT)|GameInfo (UT)]].

==Properties ==
; config string Maps[32] : The list of map names.
; config int MapNum : Number current map.

==Methods ==
; string GetNextMap ( ) : Gets the name of the next map in the rotation. This map's number is saved in the &lt;tt&gt;MapNum&lt;/tt&gt; property.

==Known Subclasses ==

====Unreal ====
* DMmaplist
* DKmaplist (list of DarkMatch maps, empty)

====Unreal Tournament ====
* ASDefaultMapList (default [[Legacy:Assault|Assault]] map list)
* ASMapList (currently selected Assault maps)
* CTFDefaultMapList (default [[Legacy:CTFGame (UT)|CTF]] map list)
* CTFBonusMapList (Bonuspack 1 CTF maps)
* CTFMapList (currently selected CTF maps)
* DOMDefaultMapList (default [[Legacy:Domination|Domination]] map list)
* DOMMapList (currently selected Domination maps)
* TDKDefaultMapList (default [[Legacy:TDarkMatch|Tournament DarkMatch]] map list, empty)
* TDKMapList (currently selected DarkMatch maps)
* TDMDefaultMapList (default [[Legacy:DeathMatchPlus|Tournament DeathMatch]] map list)
* TDMSmallMapList (smaller DeathMatch maps)
* TDMMediumMapList (medium-sized DeathMatch maps)
* TDMLargeMapList (large DeathMatch maps)
* TDMBonusMapList (Bonuspack 1 DeathMatch maps)
* TDMmaplist (currently selected DeathMatch maps)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MapScale</title>
    <id>1819</id>
    <revision>
      <id>4464</id>
      <timestamp>2006-11-28T04:51:10Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Changed link from UNR File to Map File</comment>
      <text xml:space="preserve">'''MapScale''' is an external utility for UnrealEd which scales [[Legacy:T3D File|T3D file]]; ie, entire maps. It's completely free and available in multiple languages.

Note that [[Legacy:UnrealEd 3|UnrealEd 3]] has MapScale's functionality built in already:  Select all brushes and actors, then click on ''Tools'' -&gt; ''Scale Map'', enter a factor and click ''OK''.)

==Description==

===What is MapScale for?===

MapScale is an external tool that lets you scale a complete Unreal or Unreal Tournament map. Yes, this tool will not only scale the brushes, it will also make sure that the Lights, Triggers, Inventory items etc. stay at the right positions. That means that you can make the whole map bigger or smaller without bigger problems. It is much easier to use this utility than to do the conversion by hand. The complete conversion process only takes a few minutes!

===How does it work?===

Basically, the tool does not convert the map itself. At first, you will have to export your map into [[Legacy:T3D File|T3D File]] format. This format is also called Unreal Text, because it contains all the information in a [[Legacy:Map File|Map File]], but you can open it with a normal text editor like Notepad.

This file is then opened in MapScale. The program will analyze the file and apply a specified scale factor at it.

Additional features:
* MapScale can also scale the '''LightRadius''' of the Light actors in your map. That's important because the Light radii in your map would be too big if you scaled the map down.
* It can scale the '''CollisionRadius''' and/or '''CollisionHeight''' of triggerable actors, too. This will automatically scale the [[Legacy:Collision Cylinder|Collision Cylinder]] of these actors in your map.
* It can do '''negative scaling'''. This is very helpful when you want to create a symmetrical [[Legacy:Mapping For CTF|CTF map]] for example: Just build one side, scale it by -1 and add it to the map - and your CTF map is almost finished!

==Download==
: You can download MapScale for free at my homepage:
* http://mapscale.sidewinder.de.vu/

: If there are any questions concerning the program, please contact me under:
* Sidewinder_GER@hotmail.com

At the moment, there are three different language interfaces available: English, German and French. If you'd like to create another language interface, please contact me!

==Discussion==

'''Tarquin:'''  Questions to be answered: does the UEd command do everything Mapscale can &amp;ndash; ie negative scaling for reflecting half-maps? If there is a 2003 version, here's an idea: would it be possible for mapscale to read t3D with copy &amp; paste from UEd?

'''Mychaeel:''' The built-in scaling facility only has a single &quot;Factor&quot; setting, not individual ones for every coordinate axis.  On the other hand I'm not even sure whether you ''could'' mirror static meshes by manually giving them a negative X scaling, for instance.

'''Tarquin:''' Negative values are possible in Display -&gt; Drawscale3D. It's very handy :) But yeah, the current UT version of MapScale won't be able to scale SMs and because the Brush Scaling has changed, I don't think those will be recognized either. When I imported a UEd 2 T3D file, all my reflection and scaling info vanished.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4465</id>
      <timestamp>2005-12-18T00:23:45Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''MapScale''' is an external utility for UnrealEd which scales [[Legacy:T3D File|T3D file]]; ie, entire maps. It's completely free and available in multiple languages.

Note that [[Legacy:UnrealEd 3|UnrealEd 3]] has MapScale's functionality built in already:  Select all brushes and actors, then click on ''Tools'' -&gt; ''Scale Map'', enter a factor and click ''OK''.)

==Description==

===What is MapScale for?===

MapScale is an external tool that lets you scale a complete Unreal or Unreal Tournament map. Yes, this tool will not only scale the brushes, it will also make sure that the Lights, Triggers, Inventory items etc. stay at the right positions. That means that you can make the whole map bigger or smaller without bigger problems. It is much easier to use this utility than to do the conversion by hand. The complete conversion process only takes a few minutes!

===How does it work?===

Basically, the tool does not convert the map itself. At first, you will have to export your map into [[Legacy:T3D File|T3D File]] format. This format is also called Unreal Text, because it contains all the information in a [[Legacy:UNR File|UNR File]], but you can open it with a normal text editor like Notepad.

This file is then opened in MapScale. The program will analyze the file and apply a specified scale factor at it.

Additional features:
* MapScale can also scale the '''LightRadius''' of the Light actors in your map. That's important because the Light radii in your map would be too big if you scaled the map down.
* It can scale the '''CollisionRadius''' and/or '''CollisionHeight''' of triggerable actors, too. This will automatically scale the [[Legacy:Collision Cylinder|Collision Cylinder]] of these actors in your map.
* It can do '''negative scaling'''. This is very helpful when you want to create a symmetrical [[Legacy:Mapping For CTF|CTF map]] for example: Just build one side, scale it by -1 and add it to the map - and your CTF map is almost finished!

==Download==
: You can download MapScale for free at my homepage:
* http://mapscale.sidewinder.de.vu/

: If there are any questions concerning the program, please contact me under:
* Sidewinder_GER@hotmail.com

At the moment, there are three different language interfaces available: English, German and French. If you'd like to create another language interface, please contact me!

==Discussion==

'''Tarquin:'''  Questions to be answered: does the UEd command do everything Mapscale can &amp;ndash; ie negative scaling for reflecting half-maps? If there is a 2003 version, here's an idea: would it be possible for mapscale to read t3D with copy &amp; paste from UEd?

'''Mychaeel:''' The built-in scaling facility only has a single &quot;Factor&quot; setting, not individual ones for every coordinate axis.  On the other hand I'm not even sure whether you ''could'' mirror static meshes by manually giving them a negative X scaling, for instance.

'''Tarquin:''' Negative values are possible in Display -&gt; Drawscale3D. It's very handy :) But yeah, the current UT version of MapScale won't be able to scale SMs and because the Brush Scaling has changed, I don't think those will be recognized either. When I imported a UEd 2 T3D file, all my reflection and scaling info vanished.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MapScreen</title>
    <id>28663</id>
    <revision>
      <id>40519</id>
      <timestamp>2010-01-14T09:04:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MapToHUD</title>
    <id>2034</id>
    <revision>
      <id>4961</id>
      <timestamp>2008-01-20T11:23:48Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>Level.PawnList used CS</comment>
      <text xml:space="preserve">The MapToHUD function calculates screen coordinates based on a directional vector, the view rotation, the FOV and the target [[Legacy:Canvas|Canvas]].

'''Note:''' In [[Legacy:UT2003|UT2003]] you can and should use the WorldToScreen function of the Canvas or [[Legacy:Interaction|Interaction]] class.

==Parameters ==
; out vector Result : The X and Y components of this vector will contain the absolute canvas coordinates calculated by the function.
; rotator ViewRotation : The rotation of the camera.
; float FOV : The FOV of the camera. This value must be specified in degrees like the [[Legacy:PlayerPawn|PlayerPawn]]'s FOVAngle property.
; vector TargetDir : A vector pointing from the camera's location to the location which should be converted to screen coordinates. For [[Legacy:PlayerPawn|PlayerPawn]]s this is &lt;code&gt;PlayerPawn.Location + PlayerPawn.EyeHeight * vect(0,0,1)&lt;/code&gt;.
; [[Legacy:Canvas|Canvas]] Canvas : The [[Legacy:Canvas|Canvas]] the coordinates are calculated for.

==Return Value ==

The function returns whether the coordinates it calculated are on the screen or not. This is only reliable for FOV values less than 180°.

==Code ==

&lt;uscript&gt;
/********************************************************************************
* Converts a given directional vector to canvas coordinates.                    *
* X and Y values of the returned vector contain absolute coordinates.           *
* The function returns, whether the target direction is visible for the player. *
* Created by Wormbo                                                             *
********************************************************************************/
simulated function bool MapToHUD(out vector Result, rotator ViewRotation, float FOV, vector TargetDir, Canvas Canvas)
{
	local float TanFOVx, TanFOVy;
	local float TanX, TanY;
	local float dx, dy;
	local vector X, Y, Dir, XY;
	
	TanFOVx = Tan(FOV * Pi / 360);
	TanFOVy = (Canvas.ClipY / Canvas.ClipX) * TanFOVx;
	GetAxes(ViewRotation, Dir, X, Y);
	
	Dir *= TargetDir dot Dir;
	XY = TargetDir - Dir;
	dx = XY dot X;
	dy = XY dot Y;
	
	TanX = dx / VSize(dir);
	TanY = dy / VSize(dir);
	
	Result.X = Canvas.ClipX * 0.5 * (1 + TanX / TanFOVx);
	Result.Y = Canvas.ClipY * 0.5 * (1 - TanY / TanFOVy);
	
	return Dir dot vector(ViewRotation) &gt; 0 &amp;&amp; Result.X == FClamp(Result.X, Canvas.OrgX, Canvas.ClipX)
			&amp;&amp; Result.Y == FClamp(Result.Y, Canvas.OrgY, Canvas.ClipY);
}
&lt;/uscript&gt;

==Example ==

In this example CurrentTarget is a targeted actor (e.g. another player) and Reticle is a [[Legacy:Texture (UT)|Texture (UT)]] which will be drawn with its center at the target's location. It will only be drawn when the target is on screen (return value of MapToHUD) and there's no level geometry between the point of vision and the target (FastTrace).

Reticle.USize and .VSize are the width and height of the texture.

&lt;uscript&gt;
simulated function PostRender(canvas Canvas)
{
	local vector dir, POV, DrawPos;
	local PlayerPawn P;
	
	P = PlayerPawn(Owner);
	if ( P == None || CurrentTarget == None )
		return;
	
	POV = Owner.Location + vect(0,0,1) * P.EyeHeight;
	Dir = CurrentTarget.Location - POV; // direction to target
	
	if ( MapToHUD(DrawPos, P.ViewRotation, P.FOVAngle, Dir, Canvas)
			&amp;&amp; FastTrace(CurrentTarget.Location, POV) ) {
		Canvas.SetPos(DrawPos.X - Reticle.USize * 0.5, DrawPos.Y - Reticle.VSize * 0.5);
		Canvas.DrawIcon(Reticle, 1.0);
	}
}
&lt;/uscript&gt;

==WorldToScreen==

The MapToHUD function can be used to create UT2003's WorldToScreen function for UT. (In case you prefer using that.)

&lt;uscript&gt;
/********************************************************************************
* Converts a given world location to canvas coordinates.                        *
* X and Y values of the returned vector contain absolute coordinates.           *
* Created by Wormbo                                                             *
********************************************************************************/
simulated function vector WorldToScreen(Canvas C, vector WorldLoc)
{
	local vector CamLoc, ScreenLoc;
	local rotator CamRot;
	local Actor Camera;
	
	C.ViewPort.Actor.PlayerCalcView(Camera, CamLoc, CamRot);
	MapToHUD(ScreenLoc, CamRot, C.ViewPort.Actor.FOVAngle, Normal(WorldLoc - CamLoc), C);
	
	return ScreenLoc;
}
&lt;/uscript&gt;

==Alternate version==

Here's an alternate version that I cooked up for Esc.  I put it in the base HUD class:

&lt;uscript&gt;
// Created by M.C. Spanky, aka Martin C. Martin, for Esc (www.esconline.org)

simulated static function bool WorldToScreen(Vector WorldLocation, Pawn ThePlayer, 
     float ScreenWidth, float ScreenHeight, out float X, out float Y)
{
   local vector EyePos, RelativeToPlayer;
   local float Scale;

   EyePos = ThePlayer.Location;
   EyePos.Z += ThePlayer.BaseEyeHeight; // Maybe ThePlayer.EyeHeight instead?

   RelativeToPlayer = (WorldLocation - EyePos) &lt;&lt; ThePlayer.ViewRotation;

   if (RelativeToPlayer.X &lt; 0.01)
      return false;

   Scale = (ScreenWidth / 2) / Tan(ThePlayer.FovAngle/2/180*Pi);

   X = RelativeToPlayer.Y / RelativeToPlayer.X * Scale + ScreenWidth / 2;
   Y = - RelativeToPlayer.Z / RelativeToPlayer.X * Scale + ScreenHeight / 2;

   return true;
}
&lt;/uscript&gt;

To call it from the HUD, you could do something like this:

local float X, Y;

WorldToScreen(&lt;trace result&gt;, Pawn(Owner), Canvas.ClipX, Canvas.ClipY, X, Y);

A couple notes:

-It returns &quot;false&quot; if the WorldLocation is behind the player (or so close that we risk a division by zero.)-

-This assumes that you're in first person view, i.e. not in a cut scene or bBehindView. It should be easy enough to find the &quot;true&quot; camera location &amp; rotation &amp; FOV in all cases, by looking at the player's ViewTarget. I'm unsure of the details, so I'll leave that to you. :)-

-Canvas.Clip[XY] don't always equal the screen resolution, although they usually do, and I can't find a better pair of vars.-

==Floating Names==

Here's an example of how to use it, some really simple &quot;floating names&quot; code. Put this in your HUD:

&lt;uscript&gt;
// Created by M.C. Spanky, aka Martin C. Martin, for Esc (www.esconline.org)
simulated function PostRender( canvas Canvas )
{
   local Pawn thisPawn;
   local float X, Y;
   local float W, H;
   local bool bOnScreen;
   local vector worldPosition;

   Super.PostRender(Canvas);
   for (thisPawn = Level.PawnList; thisPawn != None; thisPawn = thisPawn.NextPawn) {
      worldPosition = thisPawn.Location;
      worldPosition.Z += thisPawn.CollisionHeight;
      bOnScreen = WorldToScreen(worldPosition, Pawn(Owner), Canvas.ClipX, Canvas.ClipY, X, Y);
      if (bOnScreen &amp;&amp; X &gt; 0 &amp;&amp; X &lt; Canvas.ClipX &amp;&amp; Y &gt; 0 &amp;&amp; Y &lt; Canvas.ClipY) {
         Canvas.SetPos(0, 0);
         Canvas.TextSize(thisPawn.MenuName, W, H);
         Canvas.SetPos(X - W/2, Y - H/2);
         Canvas.DrawText(thisPawn.MenuName, false);
      }
   }
}
&lt;/uscript&gt;

(If you already have a PostRender(), merge it with that.) Start a level and spawn some Kralls or Nalis or whatever puts a glide in your stride and a dip in your hip. The name will be in the right place no matter whether they're above you and looking up or below you and looking down. You'll even see your own name above you if you look up. :)

'''Xian:''' Thought I should mention that the above code would not work online as Level.PawnList is inaccessible client-side.

==MouseTrace==

Here's a function that goes the other way: given an X and Y on the screen, it figures out what direction in space this corresponds to, and does a trace to find the first actor along that direction. Esc uses this so that you can click on another player to select them. This one's written to be in PlayerPawn, but you could modify it to take the player as an arg, as above.

&lt;uscript&gt;
simulated function Actor MouseTrace(float MouseX, float MouseY, float ScreenWidth, float ScreenHeight)
{
   local Actor Other;
   local vector HitLocation, HitNormal, StartTrace, EndTrace;
   local vector MouseDirection;

   // This is right, we divide by ScreenWidth/2 for both x and y.
   MouseDirection.X = 1 / tan(FovAngle/2/180*Pi);
   MouseDirection.Y = (MouseX - ScreenWidth / 2) / (ScreenWidth / 2);
   MouseDirection.Z = -(MouseY - ScreenHeight / 2) / (ScreenWidth / 2);

   MouseDirection = Normal(MouseDirection);

   StartTrace = Location;
   StartTrace.Z += BaseEyeHeight;

   // Spawn( class'UnrealShare.FatRing',,,StartTrace + 500 *(MouseDirection &gt;&gt; ViewRotation) );

   EndTrace = StartTrace + (MouseDirection &gt;&gt; ViewRotation) * 1000.0;
   Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);

   return Other;
}
&lt;/uscript&gt;

The UT2003 class [[Legacy:Interaction|Interaction]] comes with the functions ScreenToWorld and WorldToScreen. These functions are meant to do the above conversions.

'''A word of warning, if you override the CalcPlayerView function and don't set ViewActor to something then the engine will crash when calling ScreenToWorld and WorldToScreen.'''

'''Foxpaw:''' I had a question but I realize now that this was a function you wrote yourself, not one that epic included.

'''Wormbo:''' To quote your original question:

{{innerbox|Why do you suppose epic used a different computation to align the targeting reticles on the redeemer view? I'm curious if this method might have a drawback that makes it unfeasable in that application?

}}

The method Epic used for the Redeemer was way too inaccurate for what I needed in Rockets UT, so I wrote MapToHUD. The only drawback of this function might be the difficult syntax, but I never saw any other accurate world -&gt; screen conversion before.

'''Daid303:''' I'm wondering, there are 2 totaly diffrent methodes used above here, but they both seem to give the same result. Is there a diffrence? in accuracy maybe, or speed?

'''UArch''' its a little unrelated but ive adapted the mousetrace function for another use, is there any way to have it trace out in a fisheye-style fov instead? :0

'''Xian:''' Although this is trivial, I was wondering... Isn't it better (optimization-wise) to do

&lt;uscript&gt;if (FastTrace(CurrentTarget.Location,POV)
         &amp;&amp; MapToHUD(DrawPos,P.ViewRotation,P.FOVAngle,Dir,Canvas))&lt;/uscript&gt;

instead of 

&lt;uscript&gt;if ( MapToHUD(DrawPos, P.ViewRotation, P.FOVAngle, Dir, Canvas)
            &amp;&amp; FastTrace(CurrentTarget.Location, POV) )&lt;/uscript&gt;

That way, the game will only calculate if the Target is in front of us, instead of bothering to do all the coord coversions/calculus and then saying &quot;ah nevermind, the dude isn't in front of us&quot;.

'''Wormbo:''' (Fast)Tracing is an expensive operation. It really depends on whether FastTrace() is faster than MapToHud(), but I'm pretty sure it's not.

'''Xian:''' Ah, I see what you mean :) Thanks.

==Related Classes==
* [[Legacy:Canvas (UT)|Canvas (UT)]]
* [[Legacy:PlayerPawn|PlayerPawn]]
* [[Legacy:Canvas|Canvas]] (UT2003)

==Related Topics==
* [[Legacy:Open Source|Open Source]]</text>
    </revision>
    <revision>
      <id>4962</id>
      <timestamp>2006-08-21T16:54:55Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The MapToHUD function calculates screen coordinates based on a directional vector, the view rotation, the FOV and the target [[Legacy:Canvas|Canvas]].

'''Note:''' In [[Legacy:UT2003|UT2003]] you can and should use the WorldToScreen function of the Canvas or [[Legacy:Interaction|Interaction]] class.

==Parameters ==
; out vector Result : The X and Y components of this vector will contain the absolute canvas coordinates calculated by the function.
; rotator ViewRotation : The rotation of the camera.
; float FOV : The FOV of the camera. This value must be specified in degrees like the [[Legacy:PlayerPawn|PlayerPawn]]'s FOVAngle property.
; vector TargetDir : A vector pointing from the camera's location to the location which should be converted to screen coordinates. For [[Legacy:PlayerPawn|PlayerPawn]]s this is &lt;code&gt;PlayerPawn.Location + PlayerPawn.EyeHeight * vect(0,0,1)&lt;/code&gt;.
; [[Legacy:Canvas|Canvas]] Canvas : The [[Legacy:Canvas|Canvas]] the coordinates are calculated for.

==Return Value ==

The function returns whether the coordinates it calculated are on the screen or not. This is only reliable for FOV values less than 180°.

==Code ==

&lt;uscript&gt;
/********************************************************************************
* Converts a given directional vector to canvas coordinates.                    *
* X and Y values of the returned vector contain absolute coordinates.           *
* The function returns, whether the target direction is visible for the player. *
* Created by Wormbo                                                             *
********************************************************************************/
simulated function bool MapToHUD(out vector Result, rotator ViewRotation, float FOV, vector TargetDir, Canvas Canvas)
{
	local float TanFOVx, TanFOVy;
	local float TanX, TanY;
	local float dx, dy;
	local vector X, Y, Dir, XY;
	
	TanFOVx = Tan(FOV * Pi / 360);
	TanFOVy = (Canvas.ClipY / Canvas.ClipX) * TanFOVx;
	GetAxes(ViewRotation, Dir, X, Y);
	
	Dir *= TargetDir dot Dir;
	XY = TargetDir - Dir;
	dx = XY dot X;
	dy = XY dot Y;
	
	TanX = dx / VSize(dir);
	TanY = dy / VSize(dir);
	
	Result.X = Canvas.ClipX * 0.5 * (1 + TanX / TanFOVx);
	Result.Y = Canvas.ClipY * 0.5 * (1 - TanY / TanFOVy);
	
	return Dir dot vector(ViewRotation) &gt; 0 &amp;&amp; Result.X == FClamp(Result.X, Canvas.OrgX, Canvas.ClipX)
			&amp;&amp; Result.Y == FClamp(Result.Y, Canvas.OrgY, Canvas.ClipY);
}
&lt;/uscript&gt;

==Example ==

In this example CurrentTarget is a targeted actor (e.g. another player) and Reticle is a [[Legacy:Texture (UT)|Texture (UT)]] which will be drawn with its center at the target's location. It will only be drawn when the target is on screen (return value of MapToHUD) and there's no level geometry between the point of vision and the target (FastTrace).

Reticle.USize and .VSize are the width and height of the texture.

&lt;uscript&gt;
simulated function PostRender(canvas Canvas)
{
	local vector dir, POV, DrawPos;
	local PlayerPawn P;
	
	P = PlayerPawn(Owner);
	if ( P == None || CurrentTarget == None )
		return;
	
	POV = Owner.Location + vect(0,0,1) * P.EyeHeight;
	Dir = CurrentTarget.Location - POV; // direction to target
	
	if ( MapToHUD(DrawPos, P.ViewRotation, P.FOVAngle, Dir, Canvas)
			&amp;&amp; FastTrace(CurrentTarget.Location, POV) ) {
		Canvas.SetPos(DrawPos.X - Reticle.USize * 0.5, DrawPos.Y - Reticle.VSize * 0.5);
		Canvas.DrawIcon(Reticle, 1.0);
	}
}
&lt;/uscript&gt;

==WorldToScreen==

The MapToHUD function can be used to create UT2003's WorldToScreen function for UT. (In case you prefer using that.)

&lt;uscript&gt;
/********************************************************************************
* Converts a given world location to canvas coordinates.                        *
* X and Y values of the returned vector contain absolute coordinates.           *
* Created by Wormbo                                                             *
********************************************************************************/
simulated function vector WorldToScreen(Canvas C, vector WorldLoc)
{
	local vector CamLoc, ScreenLoc;
	local rotator CamRot;
	local Actor Camera;
	
	C.ViewPort.Actor.PlayerCalcView(Camera, CamLoc, CamRot);
	MapToHUD(ScreenLoc, CamRot, C.ViewPort.Actor.FOVAngle, Normal(WorldLoc - CamLoc), C);
	
	return ScreenLoc;
}
&lt;/uscript&gt;

==Alternate version==

Here's an alternate version that I cooked up for Esc.  I put it in the base HUD class:

&lt;uscript&gt;
// Created by M.C. Spanky, aka Martin C. Martin, for Esc (www.esconline.org)

simulated static function bool WorldToScreen(Vector WorldLocation, Pawn ThePlayer, 
     float ScreenWidth, float ScreenHeight, out float X, out float Y)
{
   local vector EyePos, RelativeToPlayer;
   local float Scale;

   EyePos = ThePlayer.Location;
   EyePos.Z += ThePlayer.BaseEyeHeight; // Maybe ThePlayer.EyeHeight instead?

   RelativeToPlayer = (WorldLocation - EyePos) &lt;&lt; ThePlayer.ViewRotation;

   if (RelativeToPlayer.X &lt; 0.01)
      return false;

   Scale = (ScreenWidth / 2) / Tan(ThePlayer.FovAngle/2/180*Pi);

   X = RelativeToPlayer.Y / RelativeToPlayer.X * Scale + ScreenWidth / 2;
   Y = - RelativeToPlayer.Z / RelativeToPlayer.X * Scale + ScreenHeight / 2;

   return true;
}
&lt;/uscript&gt;

To call it from the HUD, you could do something like this:

local float X, Y;

WorldToScreen(&lt;trace result&gt;, Pawn(Owner), Canvas.ClipX, Canvas.ClipY, X, Y);

A couple notes:

-It returns &quot;false&quot; if the WorldLocation is behind the player (or so close that we risk a division by zero.)-

-This assumes that you're in first person view, i.e. not in a cut scene or bBehindView. It should be easy enough to find the &quot;true&quot; camera location &amp; rotation &amp; FOV in all cases, by looking at the player's ViewTarget. I'm unsure of the details, so I'll leave that to you. :)-

-Canvas.Clip[XY] don't always equal the screen resolution, although they usually do, and I can't find a better pair of vars.-

==Floating Names==

Here's an example of how to use it, some really simple &quot;floating names&quot; code. Put this in your HUD:

&lt;uscript&gt;
// Created by M.C. Spanky, aka Martin C. Martin, for Esc (www.esconline.org)
simulated function PostRender( canvas Canvas )
{
   local Pawn thisPawn;
   local float X, Y;
   local float W, H;
   local bool bOnScreen;
   local vector worldPosition;

   Super.PostRender(Canvas);
   for (thisPawn = Level.PawnList; thisPawn != None; thisPawn = thisPawn.NextPawn) {
      worldPosition = thisPawn.Location;
      worldPosition.Z += thisPawn.CollisionHeight;
      bOnScreen = WorldToScreen(worldPosition, Pawn(Owner), Canvas.ClipX, Canvas.ClipY, X, Y);
      if (bOnScreen &amp;&amp; X &gt; 0 &amp;&amp; X &lt; Canvas.ClipX &amp;&amp; Y &gt; 0 &amp;&amp; Y &lt; Canvas.ClipY) {
         Canvas.SetPos(0, 0);
         Canvas.TextSize(thisPawn.MenuName, W, H);
         Canvas.SetPos(X - W/2, Y - H/2);
         Canvas.DrawText(thisPawn.MenuName, false);
      }
   }
}
&lt;/uscript&gt;

(If you already have a PostRender(), merge it with that.) Start a level and spawn some Kralls or Nalis or whatever puts a glide in your stride and a dip in your hip. The name will be in the right place no matter whether they're above you and looking up or below you and looking down. You'll even see your own name above you if you look up. :)

==MouseTrace==

Here's a function that goes the other way: given an X and Y on the screen, it figures out what direction in space this corresponds to, and does a trace to find the first actor along that direction. Esc uses this so that you can click on another player to select them. This one's written to be in PlayerPawn, but you could modify it to take the player as an arg, as above.

&lt;uscript&gt;
simulated function Actor MouseTrace(float MouseX, float MouseY, float ScreenWidth, float ScreenHeight)
{
   local Actor Other;
   local vector HitLocation, HitNormal, StartTrace, EndTrace;
   local vector MouseDirection;

   // This is right, we divide by ScreenWidth/2 for both x and y.
   MouseDirection.X = 1 / tan(FovAngle/2/180*Pi);
   MouseDirection.Y = (MouseX - ScreenWidth / 2) / (ScreenWidth / 2);
   MouseDirection.Z = -(MouseY - ScreenHeight / 2) / (ScreenWidth / 2);

   MouseDirection = Normal(MouseDirection);

   StartTrace = Location;
   StartTrace.Z += BaseEyeHeight;

   // Spawn( class'UnrealShare.FatRing',,,StartTrace + 500 *(MouseDirection &gt;&gt; ViewRotation) );

   EndTrace = StartTrace + (MouseDirection &gt;&gt; ViewRotation) * 1000.0;
   Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);

   return Other;
}
&lt;/uscript&gt;

The UT2003 class [[Legacy:Interaction|Interaction]] comes with the functions ScreenToWorld and WorldToScreen. These functions are meant to do the above conversions.

'''A word of warning, if you override the CalcPlayerView function and don't set ViewActor to something then the engine will crash when calling ScreenToWorld and WorldToScreen.'''

'''Foxpaw:''' I had a question but I realize now that this was a function you wrote yourself, not one that epic included.

'''Wormbo:''' To quote your original question:

{{innerbox|Why do you suppose epic used a different computation to align the targeting reticles on the redeemer view? I'm curious if this method might have a drawback that makes it unfeasable in that application?

}}

The method Epic used for the Redeemer was way too inaccurate for what I needed in Rockets UT, so I wrote MapToHUD. The only drawback of this function might be the difficult syntax, but I never saw any other accurate world -&gt; screen conversion before.

'''Daid303:''' I'm wondering, there are 2 totaly diffrent methodes used above here, but they both seem to give the same result. Is there a diffrence? in accuracy maybe, or speed?

'''UArch''' its a little unrelated but ive adapted the mousetrace function for another use, is there any way to have it trace out in a fisheye-style fov instead? :0

'''Xian:''' Although this is trivial, I was wondering... Isn't it better (optimization-wise) to do

&lt;uscript&gt;if (FastTrace(CurrentTarget.Location,POV)
         &amp;&amp; MapToHUD(DrawPos,P.ViewRotation,P.FOVAngle,Dir,Canvas))&lt;/uscript&gt;

instead of 

&lt;uscript&gt;if ( MapToHUD(DrawPos, P.ViewRotation, P.FOVAngle, Dir, Canvas)
            &amp;&amp; FastTrace(CurrentTarget.Location, POV) )&lt;/uscript&gt;

That way, the game will only calculate if the Target is in front of us, instead of bothering to do all the coord coversions/calculus and then saying &quot;ah nevermind, the dude isn't in front of us&quot;.

'''Wormbo:''' (Fast)Tracing is an expensive operation. It really depends on whether FastTrace() is faster than MapToHud(), but I'm pretty sure it's not.

'''Xian:''' Ah, I see what you mean :) Thanks.

==Related Classes==
* [[Legacy:Canvas (UT)|Canvas (UT)]]
* [[Legacy:PlayerPawn|PlayerPawn]]
* [[Legacy:Canvas|Canvas]] (UT2003)

==Related Topics==
* [[Legacy:Open Source|Open Source]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping Application</title>
    <id>2091</id>
    <revision>
      <id>5093</id>
      <timestamp>2005-11-17T02:29:32Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Application|Application]]s that are useful for mapping with [[Legacy:UnrealEd|UnrealEd]]:

==General==
* [[Legacy:MapScale|MapScale]] &amp;ndash; scales the brushes and actors of a [[Legacy:T3D File|T3D file]]
* [[Legacy:TexAlign|TexAlign]] &amp;ndash; superb tool for painless texture alignment
* [[Legacy:UnrealFX|UnrealFX]] &amp;ndash; edits a mesh's poly flags individually
* [[Legacy:UTToolkit|UTToolkit]] &amp;ndash; opens package files and [[Legacy:T3D File|T3D file]]s

==Reference ==
* [[Legacy:UTX-Viewer|UTX-Viewer]] &amp;ndash; texture viewer
* [[Legacy:Mesh Browser Project|mesh browser project]]

==Terrain Creation ==
* [[Legacy:TerraEdit|TerraEdit]] &amp;ndash; Terrain editing program for UT generation. Makes importable brushes, v. easy &amp; does (v. good) textures automatically.
* [[Legacy:Terrain Generator|Terrain Generator]] &amp;ndash; latest version, 2.3.0 Beta adds support for export to an UnrealEd-compatible format: http://countermap.counter-strike.net/Nemesis/terrain.html
* See also [[Legacy:Making Terrain (UT)|Making Terrain (UT)]]

==Botpathing utilities ==
* [[Legacy:Mind Reader|Mind Reader]] (UT)
* [[Legacy:PathLogic|PathLogic]] (UT) &amp;ndash; place [[Legacy:NavigationPoint|NavigationPoint]]s &amp; other [[Legacy:Bot Support|Bot Support]] related actors from within the game

==Interface Plugins ==

Things that plug into [[Legacy:UnrealEd|UnrealEd]]
* [[Legacy:Custom Brushbuilder|Custom Brushbuilder]] packages add buttons to the [[Legacy:Brushbuilders|brushbuilders]] in the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Custom Toolbox Buttons|Custom Toolbox Buttons]] add shortcuts for [[Legacy:UnrealEd Console|UnrealEd console]] commands into the last group of the [[Legacy:Toolbox|Toolbox]]
* [[Legacy:Toolbar Creator|Toolbar Creator]]

==Related Topics==

==Discussion==

'''SuperApe:''' Added Category Application.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5094</id>
      <timestamp>2004-05-03T16:06:22Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Application|Application]]s that are useful for mapping with [[Legacy:UnrealEd|UnrealEd]]:

==General==

* [[Legacy:MapScale|MapScale]] &amp;ndash; scales the brushes and actors of a [[Legacy:T3D File|T3D file]]
* [[Legacy:TexAlign|TexAlign]] &amp;ndash; superb tool for painless texture alignment
* [[Legacy:UnrealFX|UnrealFX]] &amp;ndash; edits a mesh's poly flags individually
* [[Legacy:UTToolkit|UTToolkit]] &amp;ndash; opens package files and [[Legacy:T3D File|T3D file]]s

==Reference ==
* [[Legacy:UTX Viewer|UTX Viewer]] &amp;ndash; texture viewer
* [[Legacy:Mesh Browser Project|mesh browser project]]

==Terrain Creation ==
* [[Legacy:TerraEdit|TerraEdit]] &amp;ndash; Terrain editing program for UT generation. Makes importable brushes, v. easy &amp; does (v. good) textures automatically.
* [[Legacy:Terrain Generator|Terrain Generator]] &amp;ndash; latest version, 2.3.0 Beta adds support for export to an UnrealEd-compatible format: http://countermap.counter-strike.net/Nemesis/terrain.html
* See also [[Legacy:Making Terrain (UT)|Making Terrain (UT)]]

==Botpathing utilities ==
* [[Legacy:Mind Reader|Mind Reader]]
* [[Legacy:PathLogic|PathLogic]] &amp;ndash; place [[Legacy:NavigationPoint|NavigationPoint]]s &amp; other related [[Legacy:Bot Navigation|bot navigation]] actors from within the game

==Interface Plugins ==

Things that plug into [[Legacy:UnrealEd|UnrealEd]]
* [[Legacy:Custom Brushbuilder|Custom Brushbuilder]] packages add buttons to the [[Legacy:Brushbuilders|brushbuilders]] in the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Custom Toolbox Buttons|Custom Toolbox Buttons]] add shortcuts for [[Legacy:UnrealEd Console|UnrealEd console]] commands into the last group of the [[Legacy:Toolbox|Toolbox]]
* [[Legacy:Toolbar Creator|Toolbar Creator]]</text>
    </revision>
    <revision>
      <id>5095</id>
      <timestamp>2004-05-03T16:16:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Application|Application]]s that are useful for mapping with [[Legacy:UnrealEd|UnrealEd]]:

==General==

* [[Legacy:MapScale|MapScale]] &amp;ndash; scales the brushes and actors of a [[Legacy:T3D File|T3D file]]
* [[Legacy:TexAlign|TexAlign]] &amp;ndash; superb tool for painless texture alignment
* [[Legacy:UnrealFX|UnrealFX]] &amp;ndash; edits a mesh's poly flags individually
* [[Legacy:UTToolkit|UTToolkit]] &amp;ndash; opens package files and [[Legacy:T3D File|T3D file]]s

==Reference ==
* [[Legacy:UTX-Viewer|UTX-Viewer]] &amp;ndash; texture viewer
* [[Legacy:Mesh Browser Project|mesh browser project]]

==Terrain Creation ==
* [[Legacy:TerraEdit|TerraEdit]] &amp;ndash; Terrain editing program for UT generation. Makes importable brushes, v. easy &amp; does (v. good) textures automatically.
* [[Legacy:Terrain Generator|Terrain Generator]] &amp;ndash; latest version, 2.3.0 Beta adds support for export to an UnrealEd-compatible format: http://countermap.counter-strike.net/Nemesis/terrain.html
* See also [[Legacy:Making Terrain (UT)|Making Terrain (UT)]]

==Botpathing utilities ==
* [[Legacy:Mind Reader|Mind Reader]]
* [[Legacy:PathLogic|PathLogic]] &amp;ndash; place [[Legacy:NavigationPoint|NavigationPoint]]s &amp; other related [[Legacy:Bot Navigation|bot navigation]] actors from within the game

==Interface Plugins ==

Things that plug into [[Legacy:UnrealEd|UnrealEd]]
* [[Legacy:Custom Brushbuilder|Custom Brushbuilder]] packages add buttons to the [[Legacy:Brushbuilders|brushbuilders]] in the [[Legacy:Toolbox|toolbox]]
* [[Legacy:Custom Toolbox Buttons|Custom Toolbox Buttons]] add shortcuts for [[Legacy:UnrealEd Console|UnrealEd console]] commands into the last group of the [[Legacy:Toolbox|Toolbox]]
* [[Legacy:Toolbar Creator|Toolbar Creator]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping Checklist</title>
    <id>1835</id>
    <revision>
      <id>4506</id>
      <timestamp>2006-04-06T22:18:01Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">This is a list of things to check before releasing a map.

==Within The Editor==

===Check For The Dreaded HOM===

Always look around your level checking for the dreaded [[Legacy:Hall Of Mirrors|Hall of Mirrors]] effect (HOM), or any [[Legacy:Invisible Collision Hull|invisible collision hull]]s that are not meant to be there. 

===Check the Map Flow===

[[Legacy:Map Flow|Map Flow]] is the quality of the map that keeps the player interested, engaged and &quot;on their toes&quot;.  It can also describe the smoothness of gameplay a map delivers.  Many players leave a map that feels choppy; review the page link to find out how to make it move like a river.

===Cull Textures===

In the log ([[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Log), type &quot;texture cull&quot; and hit enter; this will get rid of textures that are present within the map file, but that are not actually used in your level.
* Do not cull a partially built level; any textures which are only used on brushes currently hidden will be wiped.  This will result in the next Full [[Legacy:Rebuild|Rebuild]] having lots of blobby green textures.  See [[Legacy:Texture Cull|Texture Cull]] for more information on culling textures.

===Add Bot Support===

Ensure people can play your level offline as you intended for it to be played.  99% of the time a reviewer's initial reaction to your level will be determined by playing it with bots and if they stand around doing nothing it makes a bad first impression.  Check [[Legacy:Bot Support|Bot Support]], [[Legacy:Bot Pathing|Bot Pathing]] and [[Legacy:Testing Botplay|Testing Botplay]] for more information.

===Include A Skybox===

Adding a [[Legacy:SkyBox|SkyBox]] to map is highly recommended, even if there is no way to see the &quot;outside&quot; of your level.
* This is because the lack of a skybox has been known to cause problems with the bot AI, and other parts of the code. 
* ''Really? I've never heard of this. Why would it cause problems? &amp;ndash; Tarquin''
* ''I believe that is a myth.  I have not seen a difference in any code. &amp;ndash; SuperApe''

===Check For Bleaching===

Check your [[Legacy:Lighting|lighting]] to make sure the lights are not &quot;bleached&quot;. This happens when lights of too higher a brightness are put near each other.  It will look like your coloured lights have gone white in the centre, whilst the outline looks normal.
* To fix, lower the relevant lights' brightnesses or saturation values.
* Check the [[Legacy:Lighting|lighting]] pages for more information.

===Include Music===

Most maps have music in them, if only as an ambient sound.  If you do choose to add music to your map, ensure it is not too loud or unsuitable for your level.

===Environmental Sound===

Make sure all your relevant zones have a ZoneSound property enabled in your [[Legacy:ZoneInfo|ZoneInfo]].  This one small task only takes an extra 5 seconds, but can potentially add a lot to the audio ambience of a level with no real impact on in-game performance.

===Include A Level Screenshot===

Add a [[Legacy:Level Screenshot|Level Screenshot]] to your map.  This just makes it look more professional to the end-users.

===Set A Default Gametype===

Some players will start maps by double-clicking the file directly, and unless you correctly set a DefaultGameType in the [[Legacy:Level Properties|Level Properties]], your map will start running under a [[Legacy:DM|DeathMatch]] game.  This spoils the first impression, and could lead to a bad review.

''A default gametype is also required for certain gametypes to run correctly when played from the editor.  Double Domination for example will have no DOM points if the default gametype hasn't been set correctly. In UT2004 it is essential to set the default gametype for Onslaught, as the power core and nodes will not appear otherwise. &amp;ndash; Radiosity''

==Include A Readme File==

Write a &quot;ReadMe&quot; file and bundle it along with your map in a .zip compressed file.
* As a minimum requirement, include your name, (or nickname) and email address.
* If your map requires additional files that aren't bundled, specify which (and where to get them).
* If your map comes with bundled files (e.g., texture packages), list them. This will help users keep their installation clean should they wish to remove your map.
* Specify the following:
** whether or not you want to allow other people to use your map as a base for derivative works (like conversions to other game types)
** whether or not (and how) your map may be distributed by other people (like other websites, or magazine coverdiscs)
** whether or not your map may be commercially exploited (i.e. distributed in a way that requires payment to the distributor).
* '''Do not name the file ''ReadMe.txt''.'''  It is customary to give a readme file your map's base name, like &lt;tt&gt;DM-MyMap.txt&lt;/tt&gt; or &lt;tt&gt;DM-MyMap_ReadMe.txt&lt;/tt&gt;.  That way users can safely keep your readme file in their Help directory and will be able to see at a glance which map it belongs to.
* [http://nalicity.beyondunreal.com NaliCity] provides an automated [http://nalicity.beyondunreal.com/site_readmegen.php readme generator] for UT, not UT2003. It should also be mentioned that this is an online, not offline, tool.

==Pack It Up==

===Clean Up Stray Files===

The map file (.UNR, .UT2, etc) can contain most [[Legacy:Unreal Resource|Unreal resource]]s you used in your map: textures, sounds, code, static meshes and so on. The only exception is [[Legacy:Music|music]], which in [[Legacy:UT2003|UT2003]] and later games is in the [[Legacy:OGG Format|OGG format]]. OGG files must be included in your zip as a seperate file.

Putting resources in extra packages only makes sense if you plan to reuse them in another map (and you are sure the user will have both maps). Otherwise they just clutter your map distribution, and increase the complexity of installation.

See [[Legacy:Embedding Code|Embedding Code]] and [[Legacy:MyLevel|MyLevel]] for instructions on how to embed code and other media packages in your level. 

===Check Cohesiveness===

Make sure every non-standard file needed to play your map is bundled in your map distribution file (i.e. .zip file).  Don't take the presence of a given mod for granted (unless your map is being distributed ''with'' or as ''part of'' that mod).  If in doubt, get your game CD and browse it to find out whether a particular package is part of the standard installation or not.

* If your map requires files that you cannot or do not want to bundle, make note of that in the readme file (see above), providing links to download locations.
* You can find a list of all standard texture packs here: [[Legacy:Texture Package|Texture Package]].

===Embed folders===

If you're distributing your map as a zip file, store the files within their respective folders. This will allow the user to simply extract the zip file to their [[Legacy:Game Directory|game directory]], and WinZip (or another archiving app) will take of putting the map file and the packages in their correct place.

==Ask for Feedback==

Get ready for response.  The worst thing that could happen to you is getting a really bad review on your map. Even really experienced mappers get bad reviews on some of his or her maps. You have to understand why you got that score, and learn from that. Contrary, you shouldn't lash out and say &quot;You better give a good review or I will report you for not reviewing truthfully!&quot;, or someting lamer than that. Or, the best thing that could happen to you is getting a really good review on your map. You may even think that the map you created will be a really bad n00bish map, but in reality, it might be a hosted map of the week. You never know until you release the map. You can reduce the incidence of negative feedback through beta testing, however.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Debugging Techniques|Debugging Techniques]] &amp;ndash; Testing your map for internet use.
* [[Legacy:Making Mods/Effective Testing|Making Mods/Effective Testing]] &amp;ndash; Still some good info for mappers as well as modders.
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get a little feedback from this community.

==Discussion==

'''SuperApe:''' Working in with [[Legacy:Topics On Mapping|Topics on Mapping]] family of pages.

'''Tarquin:''' Good idea. Not all of the things on this page are useful. Eg 'Check the flow'. That's starting to sound like saying 'Build the map' is a checklist item...

'''SuperApe:''' Agreed.  That's really a design issue that should've been taken care of before construction.

'''Doogle:''' Just put the nalicity links to working ones :)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4507</id>
      <timestamp>2006-04-06T21:07:00Z</timestamp>
      <contributor>
        <ip>58.77.34.161</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">This is a list of things to check before releasing a map.

==Within The Editor==

===Check For The Dreaded HOM===

Always look around your level checking for the dreaded [[Legacy:Hall Of Mirrors|Hall of Mirrors]] effect (HOM), or any [[Legacy:Invisible Collision Hull|invisible collision hull]]s that are not meant to be there. 

===Check the Map Flow===

[[Legacy:Map Flow|Map Flow]] is the quality of the map that keeps the player interested, engaged and &quot;on their toes&quot;.  It can also describe the smoothness of gameplay a map delivers.  Many players leave a map that feels choppy; review the page link to find out how to make it move like a river.

===Cull Textures===

In the log ([[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Log), type &quot;texture cull&quot; and hit enter; this will get rid of textures that are present within the map file, but that are not actually used in your level.
* Do not cull a partially built level; any textures which are only used on brushes currently hidden will be wiped.  This will result in the next Full [[Legacy:Rebuild|Rebuild]] having lots of blobby green textures.  See [[Legacy:Texture Cull|Texture Cull]] for more information on culling textures.

===Add Bot Support===

Ensure people can play your level offline as you intended for it to be played.  99% of the time a reviewer's initial reaction to your level will be determined by playing it with bots and if they stand around doing nothing it makes a bad first impression.  Check [[Legacy:Bot Support|Bot Support]], [[Legacy:Bot Pathing|Bot Pathing]] and [[Legacy:Testing Botplay|Testing Botplay]] for more information.

===Include A Skybox===

Adding a [[Legacy:SkyBox|SkyBox]] to map is highly recommended, even if there is no way to see the &quot;outside&quot; of your level.
* This is because the lack of a skybox has been known to cause problems with the bot AI, and other parts of the code. 
* ''Really? I've never heard of this. Why would it cause problems? &amp;ndash; Tarquin''
* ''I believe that is a myth.  I have not seen a difference in any code. &amp;ndash; SuperApe''

===Check For Bleaching===

Check your [[Legacy:Lighting|lighting]] to make sure the lights are not &quot;bleached&quot;. This happens when lights of too higher a brightness are put near each other.  It will look like your coloured lights have gone white in the centre, whilst the outline looks normal.
* To fix, lower the relevant lights' brightnesses or saturation values.
* Check the [[Legacy:Lighting|lighting]] pages for more information.

===Include Music===

Most maps have music in them, if only as an ambient sound.  If you do choose to add music to your map, ensure it is not too loud or unsuitable for your level.

===Environmental Sound===

Make sure all your relevant zones have a ZoneSound property enabled in your [[Legacy:ZoneInfo|ZoneInfo]].  This one small task only takes an extra 5 seconds, but can potentially add a lot to the audio ambience of a level with no real impact on in-game performance.

===Include A Level Screenshot===

Add a [[Legacy:Level Screenshot|Level Screenshot]] to your map.  This just makes it look more professional to the end-users.

===Set A Default Gametype===

Some players will start maps by double-clicking the file directly, and unless you correctly set a DefaultGameType in the [[Legacy:Level Properties|Level Properties]], your map will start running under a [[Legacy:DM|DeathMatch]] game.  This spoils the first impression, and could lead to a bad review.

''A default gametype is also required for certain gametypes to run correctly when played from the editor.  Double Domination for example will have no DOM points if the default gametype hasn't been set correctly. In UT2004 it is essential to set the default gametype for Onslaught, as the power core and nodes will not appear otherwise. &amp;ndash; Radiosity''

==Include A Readme File==

Write a &quot;ReadMe&quot; file and bundle it along with your map in a .zip compressed file.
* As a minimum requirement, include your name, (or nickname) and email address.
* If your map requires additional files that aren't bundled, specify which (and where to get them).
* If your map comes with bundled files (e.g., texture packages), list them. This will help users keep their installation clean should they wish to remove your map.
* Specify the following:
** whether or not you want to allow other people to use your map as a base for derivative works (like conversions to other game types)
** whether or not (and how) your map may be distributed by other people (like other websites, or magazine coverdiscs)
** whether or not your map may be commercially exploited (i.e. distributed in a way that requires payment to the distributor).
* '''Do not name the file ''ReadMe.txt''.'''  It is customary to give a readme file your map's base name, like &lt;tt&gt;DM-MyMap.txt&lt;/tt&gt; or &lt;tt&gt;DM-MyMap_ReadMe.txt&lt;/tt&gt;.  That way users can safely keep your readme file in their Help directory and will be able to see at a glance which map it belongs to.
* [http://nalicity.beyondunreal.com NaliCity] provides an automated [http://nalicity.beyondunreal.com/site_readmegen.php readme generator] for UT, not UT2003. It should also be mentioned that this is an online, not offline, tool.

==Pack It Up==

===Clean Up Stray Files===

The map file (.UNR, .UT2, etc) can contain most [[Legacy:Unreal Resource|Unreal resource]]s you used in your map: textures, sounds, code, static meshes and so on. The only exception is [[Legacy:Music|music]], which in [[Legacy:UT2003|UT2003]] and later games is in the [[Legacy:OGG Format|OGG format]]. OGG files must be included in your zip as a seperate file.

Putting resources in extra packages only makes sense if you plan to reuse them in another map (and you are sure the user will have both maps). Otherwise they just clutter your map distribution, and increase the complexity of installation.

See [[Legacy:Embedding Code|Embedding Code]] and [[Legacy:MyLevel|MyLevel]] for instructions on how to embed code and other media packages in your level. 

===Check Cohesiveness===

Make sure every non-standard file needed to play your map is bundled in your map distribution file (i.e. .zip file).  Don't take the presence of a given mod for granted (unless your map is being distributed ''with'' or as ''part of'' that mod).  If in doubt, get your game CD and browse it to find out whether a particular package is part of the standard installation or not.

* If your map requires files that you cannot or do not want to bundle, make note of that in the readme file (see above), providing links to download locations.
* You can find a list of all standard texture packs here: [[Legacy:Texture Package|Texture Package]].

===Embed folders===

If you're distributing your map as a zip file, store the files within their respective folders. This will allow the user to simply extract the zip file to their [[Legacy:Game Directory|game directory]], and WinZip (or another archiving app) will take of putting the map file and the packages in their correct place.

==Ask for Feedback==

Get ready for response.  The worst thing that could happen to you is getting a really bad review on your map. Even really experienced mappers get bad reviews on some of his or her maps. You have to understand why you got that score, and learn from that. Contrary, you shouldn't lash out and say &quot;You better give a good review or I will report you for not reviewing truthfully!&quot;, or someting lamer than that. Or, the best thing that could happen to you is getting a really good review on your map. You may even think that the map you created will be a really bad n00bish map, but in reality, it might be a hosted map of the week. You never know until you release the map. You can reduce the incidence of negative feedback through beta testing, however.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Debugging Techniques|Debugging Techniques]] &amp;ndash; Testing your map for internet use.
* [[Legacy:Making Mods/Effective Testing|Making Mods/Effective Testing]] &amp;ndash; Still some good info for mappers as well as modders.
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get a little feedback from this community.

==Discussion==

'''SuperApe:''' Working in with [[Legacy:Topics On Mapping|Topics on Mapping]] family of pages.

'''Tarquin:''' Good idea. Not all of the things on this page are useful. Eg 'Check the flow'. That's starting to sound like saying 'Build the map' is a checklist item...

'''SuperApe:''' Agreed.  That's really a design issue that should've been taken care of before construction.

'''Doogle:''' Just put the nalicity links to working ones :)

----

[[:Category:Legacy Mapping]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For 1on1</title>
    <id>2151</id>
    <revision>
      <id>5238</id>
      <timestamp>2005-12-18T22:11:42Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">1on1 deathmatch levels are arguably the hardest to make well. A 1on1 has the tightest margin of error when dealing with flow problems, because the player is more often navigating your level than shooting at her opponent. When a 1on1 map has lousy flow&amp;ndash;it's hard to climb that ramp, you get stuck on some trivial decoration&amp;ndash;then it's not just a &quot;lame bit&quot; on your map, it's a serious inbitor to gameplay.

Most deathmatch map, but especially 1-on-1 deathmatch maps, are based on a series of major and minor nodes. If you run around in them it's pretty easy to tell where they are. Major nodes are typically multi-level rooms with more than two entrances and maybe some goodie in the middle to tempt people.

Minor nodes are the rooms that usually hold health, powerups, weapons, and most of the PlayerSpawns. Minor nodes are tpyically escape routes, side halls, reloading spots, spawn areas, and &quot;unimportant&quot; rooms. This is where you load up before hunting down the enemy.

A typical 1on1 map has between two and five major nodes and no more than twice that in minor nodes.

A 1on1 map is unique in that it's just you, your enemy, and the level you're fighting in. When you aren't worrying about a bunch of other players shooting you in the face, you can spend time trying to figure out where your enemy is. For instance, all the pickups make a very distinct noise when collected (health vials, for some reason, are particularly loud and easy to pick out), so you can often determine where your opponent is by what things they pick up. You can also track them by the swath of missing pickups (ammo, health, damage amps, etc...) and figure out their cycle around the map. Anyway, the point is, a 1on1 game is much more of a sneaky game of ambush and thinking, rather than quick trigger fingers and flak cannons (those things help, too, you know).

When making a 1on1 map, you should be thinking about how you'd want to ''play'' a 1on1 map. The first step should be to make a little diagram of the different major nodes you want, and figure out how you want them to be connected. Mark where you want elevators, important powerups, multilevel rooms, and rooms that have one-way shortcuts to other locations (teleporters, dropshafts, etc.).

The second step is to think about how you want the major nodes to flow together with minor nodes. This, for me, is the hardest part. In many 1on1 maps, the lines are blurred between connector and node. Many 1on1 maps have little symmetry&amp;ndash;all the doors and halls are unique. This helps add more flavor than what would otherwise exist on such a small map, and it makes the map seem somewhat bigger than it otherwise would.

When you develop the overall design, you should think about where you want noisemakers. Noisemakers would be any powerup that makes a distinctive noise, or some bit of the environment that reveals the location of the player that triggered it. Adding noisemakers makes a 1on1 map much more interesting. It also plays into the risk-vs-reward principle of mapping, since a player must decide if grabbing that keg o' health is worth walking through that noisy puddle and revealing their location.

==Related Links==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For DM|Mapping for DM]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Map Planning|Map Planning]]

==Discussion==

'''SuperApe:'''  Here's a good start, WheatPuppet.

'''WheatPuppet:''' Heh. I probably should've done it myself, but, especially in a Wiki format, I have trouble doing completely new things. :P Adding and editing&amp;ndash;I do that fine. I'll probably get time this weekend. I'll put up a sticky-note... there. Now I won't forget. Someone keeps stealing my sticky note pads and I don't like it.

'''WheatPuppet:''' I'm pretty sure someone (Tarq?) wrote an essay with some overlapping material, but I don't know where it went. Feel free to edit, since I didn't plan out the above very carefully.

'''SuperApe:''' This page needs a little love.  It's been a while now and I'm not sure if WheatPuppet is coming back to it.

'''StarWeaver:''' The main thing I've noticed about the one-on-one maps i've played in UT2004 (The defaults, ECE, CBP, UCMP, 1-on-1-pack) is that most of them seem *too large* for a one on one match. Heck, the single player ladder sends you to several of them for 3- and 4-way matches, and I found the one-on-one challange matches to generally be pretty boring, especially on maps like Roughinery (But then, if I had set things up it would be a 3 or 5 point match and not a 15 for those . . . ) Heck, I run 4-on-4 Team Deathmatch games on Roughinery and Irondust and such with no problem.

'''SuperApe:''' I agree.  To me they just seem to say, &quot;this map is fast&quot;.  But I think they are certainly playable with well over two players.  Speaking of rambling, the above text is rather block-like and could use a little organization via sections and sub-sections.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; Should make look more like the other &quot;Mapping For...&quot; pages, less rant-like.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5239</id>
      <timestamp>2005-12-18T21:54:46Z</timestamp>
      <contributor>
        <ip>StarWeaver</ip>
      </contributor>
      <comment>Rambling in comments: map size.</comment>
      <text xml:space="preserve">1on1 deathmatch levels are arguably the hardest to make well. A 1on1 has the tightest margin of error when dealing with flow problems, because the player is more often navigating your level than shooting at her opponent. When a 1on1 map has lousy flow&amp;ndash;it's hard to climb that ramp, you get stuck on some trivial decoration&amp;ndash;then it's not just a &quot;lame bit&quot; on your map, it's a serious inbitor to gameplay.

Most deathmatch map, but especially 1-on-1 deathmatch maps, are based on a series of major and minor nodes. If you run around in them it's pretty easy to tell where they are. Major nodes are typically multi-level rooms with more than two entrances and maybe some goodie in the middle to tempt people.

Minor nodes are the rooms that usually hold health, powerups, weapons, and most of the PlayerSpawns. Minor nodes are tpyically escape routes, side halls, reloading spots, spawn areas, and &quot;unimportant&quot; rooms. This is where you load up before hunting down the enemy.

A typical 1on1 map has between two and five major nodes and no more than twice that in minor nodes.

A 1on1 map is unique in that it's just you, your enemy, and the level you're fighting in. When you aren't worrying about a bunch of other players shooting you in the face, you can spend time trying to figure out where your enemy is. For instance, all the pickups make a very distinct noise when collected (health vials, for some reason, are particularly loud and easy to pick out), so you can often determine where your opponent is by what things they pick up. You can also track them by the swath of missing pickups (ammo, health, damage amps, etc...) and figure out their cycle around the map. Anyway, the point is, a 1on1 game is much more of a sneaky game of ambush and thinking, rather than quick trigger fingers and flak cannons (those things help, too, you know).

When making a 1on1 map, you should be thinking about how you'd want to ''play'' a 1on1 map. The first step should be to make a little diagram of the different major nodes you want, and figure out how you want them to be connected. Mark where you want elevators, important powerups, multilevel rooms, and rooms that have one-way shortcuts to other locations (teleporters, dropshafts, etc.).

The second step is to think about how you want the major nodes to flow together with minor nodes. This, for me, is the hardest part. In many 1on1 maps, the lines are blurred between connector and node. Many 1on1 maps have little symmetry&amp;ndash;all the doors and halls are unique. This helps add more flavor than what would otherwise exist on such a small map, and it makes the map seem somewhat bigger than it otherwise would.

When you develop the overall design, you should think about where you want noisemakers. Noisemakers would be any powerup that makes a distinctive noise, or some bit of the environment that reveals the location of the player that triggered it. Adding noisemakers makes a 1on1 map much more interesting. It also plays into the risk-vs-reward principle of mapping, since a player must decide if grabbing that keg o' health is worth walking through that noisy puddle and revealing their location.

==Related Links==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Mapping For DM|Mapping for DM]]

==Discussion==

'''SuperApe:'''  Here's a good start, WheatPuppet.

'''WheatPuppet:''' Heh. I probably should've done it myself, but, especially in a Wiki format, I have trouble doing completely new things. :P Adding and editing&amp;ndash;I do that fine. I'll probably get time this weekend. I'll put up a sticky-note... there. Now I won't forget. Someone keeps stealing my sticky note pads and I don't like it.

'''WheatPuppet:''' I'm pretty sure someone (Tarq?) wrote an essay with some overlapping material, but I don't know where it went. Feel free to edit, since I didn't plan out the above very carefully.

'''SuperApe:''' This page needs a little love.  It's been a while now and I'm not sure if WheatPuppet is coming back to it.

'''StarWeaver:''' The main thing I've noticed about the one-on-one maps i've played in UT2004 (The defaults, ECE, CBP, UCMP, 1-on-1-pack) is that most of them seem *too large* for a one on one match. Heck, the single player ladder sends you to several of them for 3- and 4-way matches, and I found the one-on-one challange matches to generally be pretty boring, especially on maps like Roughinery (But then, if I had set things up it would be a 3 or 5 point match and not a 15 for those . . . ) Heck, I run 4-on-4 Team Deathmatch games on Roughinery and Irondust and such with no problem.

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; Should make look more like the other &quot;Mapping For...&quot; pages, less rant-like.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For AS</title>
    <id>1841</id>
    <revision>
      <id>4522</id>
      <timestamp>2004-09-21T09:00:46Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">See:

* [[Legacy:Mapping For AS (UT)|Mapping For AS (UT)]]
* [[Legacy:Mapping For AS (UT2004)|Mapping For AS (UT2004)]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For AS (UT)</title>
    <id>2190</id>
    <revision>
      <id>5311</id>
      <timestamp>2006-01-05T03:36:51Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Assault''' is one of the standard [[Legacy:Unreal Tournament|Unreal Tournament]] [[Legacy:Gametype|gametype]]s. The [[Legacy:Map File Prefix|map file prefix]] is '''AS'''.

One team assaults a base guarded by the other team and has to fulfill a given number of tasks within limited time; the other team has to prevent that. After a round has ended (because the assaulting team has completed its mission or the time ran out), assaulters and defenders switch positions.

==Essentials ==

What each Assault map needs:

* Set the [[Legacy:Level Properties|Level Properties]] -&gt; DefaultGameType to Assault.
* [[Legacy:FortStandard|FortStandard]] actors mark each goal the attacking team must reach
* An [[Legacy:AssaultInfo|AssaultInfo]] allows you to set descriptions and screenshots of each goal

==General ==
* Make your hallways and geometry wide enough to allow multiple players to battle easily.
* Don't make a level that somebody can solve in 30 seconds.  It's always a nice idea to put shortcuts or things like that but don't make them so that they make the final objective easy.
*The translocator is disabled in AS, so it is a good idea to put lift jumps, opportunities for hammerjumps, slope dodges and other things that give players added mobility increasing the enjoyment of playing your level. But, be aware of HUGE boosting opportunities that would compromise the linear plan of your level.
*If you have objectives that are damage triggered, be sure an attacking team can not shoot at them from unintended areas.

==PlayerStarts ==
* Make sure you put enough [[Legacy:PlayerStart|PlayerStart]]s in the map to begin with.
* When players start make sure you have enough ammo and weapons for multiple players.
* When placing [[Legacy:PlayerStart|PlayerStart]]s in AS, you will use &quot;0&quot; for the defending team, and &quot;1&quot; for the attacking team. To set these values go into the player start properties and under PlayerStart -&gt; [[Legacy:TeamNumber|TeamNumber]], enter the appropriate value. It is important to note that you can trigger the bEnabled value in order to spawn players in different areas as they progress through the map. The Events-&gt;Event should be matching in both sets of PlayerStarts for both teams, and all the player starts in the two areas to be toggled should have the same Events-&gt;Tag. This will switch PlayerStarts for both teams to the appropriate area. You do not need to set PlayerStart Oject-&gt;InitialState to TriggerToggle, in fact you can not change the intial state of PlayerStarts. Just remember that the Playerstarts that are farther into the map should have PlayerStart-&gt;bEnabled set to False. :D There are a couple of otherwise excellent maps that have overlooked this. You will find it difficult to defend the first four objectives if you are locked behind the fifth... You can put triggers on the other side of objectives that once reached are triggered, or you can make them the events called by a mover etc... If you use a trigger, and don't want the defending team to trigger it, just use a [[Legacy:TeamTrigger|TeamTrigger]]
*Some kind of a cannon would be a good idea to protect spawning players too.

==Pathing Assault==

[[Legacy:DefensePoint|DefensePoint]]s can be used to tell the bots where to stand for the best defense of each objective. If you do not place defense points, bots will stand as close as possible to the [[Legacy:FortStandard|FortStandard]]. 
*Here are the properties you will need to adjust in the DefensePoint's properties under... yup, DefensePoint:
**'''''FortTag''''': Set this to the Events&gt;Tag of the FortStandard you want the bots to defend. You will need to create defense points for each objective. So if there is a spot that is suitable for defending multiple objectives, say a sniper perch or the like, then you will need to place several DefensePoints with each of the different FortTags specified.
**'''''Priority''''': Applies only to the group of defense points belonging to a  particular FortStandard, and again, &quot;0&quot; is the highest priority. You do not need to set this if you don't want to. But after playtesting, it might be a good idea to enter values for this field.
**'''''Team''''': Obviously, they will belong to the defending team so leave them at the default &quot;0&quot;

In order to force bots to take different routes you will need to use an [[Legacy:AssaultRandomizer|AssaultRandomizer]]. This will require some playtesting because the level should be fully pathed and all objectives/items etc... should be in place before using these actors. Once the level is fully pathed, playtest it a few times with one bot, and watch the route it takes to accomplish the mission. Where you want him to take a different route, you will place an AssaultRandomizer on the shorter path someplace where he can not get around it by addtitional path lines. Place this '''''after''''' the junction you want him to branch off at. It simulates the impression that that path is longer than it actually is. You will need to trigger this actor and here are a couple ways. I am not sure how this works, because there is no initial state variable for this actor. 

*Use a regular [[Legacy:Trigger|trigger]] set to toggle (So the randomizer is on and off randomly as players collide the trigger. could be used to make the bots sneaky?)
*Use a [[Legacy:Counter|counter]]
*Use a [[Legacy:StochasticTrigger|StochasticTrigger]]
*Use a [[Legacy:Dispatcher|Dispatcher]] with the randomizer called twice in outevents, and put a suitable outdelay.

There are probably more ways to do this, but I have not tried them. Good luck, and I love assault and am always looking for new maps. Once your map is done, be sure to Upload it to one of the UT map sites such as Unreal Playground or Nali City. Good luck and have fun. .

==Objectives==

===Screenshots and Objective descriptions for the HUD:===

'''''You should without fail''''' create screenshots for each objective that clearly define where they are, (show more than just a picture of a button. Make it so there is some indication of where it is located.) and compose some some sort of text to describe how to trigger it, (shoot it or touch it?) and why it is an objective.  Telling why adds some atmosphere to the map. To do this you will need to place an '''''AssaultInfo''''' actor somewhere in the level. Here are the fields you will be concerned with filling out:
*Open the AssaultInfo actor's properties and under AssaultInfo you will see:
**'''''NumObjShots''''': Enter a value here corresponding to the number of objectives in your level.
**'''''ObjDesc''''': is where you will put the text that appears in the HUD when you press F3 during an assault game below the picture when you see the &quot;Transmission Follows:&quot; scroll beneath it.
**'''''ObjShots''''': This is similar to putting a [[Legacy:Screenshot (UT)|Screenshot (UT)]] in your level.
*Also a message in the center of the screen telling players what the next objective is once the previous one is complete is a good idea.

==EndGame==

Try and do some kind of a nice ending sequence.  It's always a joy to see something like a bridge that you were trying to blow up collapse ala ''AS-Bridge''

==Related Topics==
* [[Legacy:Mapping For AS|Mapping for AS]] (UT2004)
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Bot Support|Bot Support]]

==Discussion==

I don't play Assault.  I loathe it..well the online type.  I only did this because somebody started the page but put no text so i figured what the hell.  This page definitly needs input from an assault player tho, and a mapper who has made an assault level.-shadow

It is important to place grading spawn points on very long levels. Monsters and extra Bots confuse things greatly. Dynamic lighting is fine, but huge areas of strobing just annoys people right? Fort Standards are REALLY IMPORTANT and you must do them well. Big huge levels are great fun. -{di3}killboy

'''evil_blue_dude'''More mappers should make assault. Its good fun to play and to make.

When making assault maps, remember to test it for hammer jumping exploits. If you have a gate for example check to see if hammer jumpers can get over it. Things like that can be really annoying if left unfixed. Skilled hammer jumpers for example can complete AS-Mazon relatively quickly if no one's guarding the main gate because of the exposed ledge above it. It's not just hammer jumping that can cause problems either. Even AS-Dam has it's flaws - you can jump through the window of the tower and avoid the first objective and can quite easily complete the second and third objectives before the defenders even know what the hell's happening. - Slim

'''xX)(Xx'''

Also, some triggers in Assault maps are affected by ZEROPING weapons, the zeroping weapons just can't hit the fortstandards, it would be great to know why

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5312</id>
      <timestamp>2004-08-03T12:18:20Z</timestamp>
      <contributor>
        <ip>ACBAAF3C.ipt.aol.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Assault''' is one of the standard [[Legacy:Unreal Tournament|Unreal Tournament]] [[Legacy:Gametype|gametype]]s. The [[Legacy:Map File Prefix|map file prefix]] is '''AS'''.

One team assaults a base guarded by the other team and has to fulfill a given number of tasks within limited time; the other team has to prevent that. After a round has ended (because the assaulting team has completed its mission or the time ran out), assaulters and defenders switch positions.

==Essentials ==

What each Assault map needs:

* Set the [[Legacy:Level Properties|Level Properties]] -&gt; DefaultGameType to Assault.
* [[Legacy:FortStandard|FortStandard]] actors mark each goal the attacking team must reach
* An [[Legacy:AssaultInfo|AssaultInfo]] allows you to set descriptions and screenshots of each goal

==General ==
* Make your hallways and geometry wide enough to allow multiple players to battle easily.
* Don't make a level that somebody can solve in 30 seconds.  It's always a nice idea to put shortcuts or things like that but don't make them so that they make the final objective easy.
*The translocator is disabled in AS, so it is a good idea to put lift jumps, opportunities for hammerjumps, slope dodges and other things that give players added mobility increasing the enjoyment of playing your level. But, be aware of HUGE boosting opportunities that would compromise the linear plan of your level.
*If you have objectives that are damage triggered, be sure an attacking team can not shoot at them from unintended areas.

==PlayerStarts ==
* Make sure you put enough [[Legacy:PlayerStart|PlayerStart]]s in the map to begin with.
* When players start make sure you have enough ammo and weapons for multiple players.
* When placing [[Legacy:PlayerStart|PlayerStart]]s in AS, you will use &quot;0&quot; for the defending team, and &quot;1&quot; for the attacking team. To set these values go into the player start properties and under PlayerStart -&gt; [[Legacy:TeamNumber|TeamNumber]], enter the appropriate value. It is important to note that you can trigger the bEnabled value in order to spawn players in different areas as they progress through the map. The Events-&gt;Event should be matching in both sets of PlayerStarts for both teams, and all the player starts in the two areas to be toggled should have the same Events-&gt;Tag. This will switch PlayerStarts for both teams to the appropriate area. You do not need to set PlayerStart Oject-&gt;InitialState to TriggerToggle, in fact you can not change the intial state of PlayerStarts. Just remember that the Playerstarts that are farther into the map should have PlayerStart-&gt;bEnabled set to False. :D There are a couple of otherwise excellent maps that have overlooked this. You will find it difficult to defend the first four objectives if you are locked behind the fifth... You can put triggers on the other side of objectives that once reached are triggered, or you can make them the events called by a mover etc... If you use a trigger, and don't want the defending team to trigger it, just use a [[Legacy:TeamTrigger|TeamTrigger]]
*Some kind of a cannon would be a good idea to protect spawning players too.

==Pathing Assault==

[[Legacy:DefensePoint|DefensePoint]]s can be used to tell the bots where to stand for the best defense of each objective. If you do not place defense points, bots will stand as close as possible to the [[Legacy:FortStandard|FortStandard]]. 
*Here are the properties you will need to adjust in the DefensePoint's properties under... yup, DefensePoint:
**'''''FortTag''''': Set this to the Events&gt;Tag of the FortStandard you want the bots to defend. You will need to create defense points for each objective. So if there is a spot that is suitable for defending multiple objectives, say a sniper perch or the like, then you will need to place several DefensePoints with each of the different FortTags specified.
**'''''Priority''''': Applies only to the group of defense points belonging to a  particular FortStandard, and again, &quot;0&quot; is the highest priority. You do not need to set this if you don't want to. But after playtesting, it might be a good idea to enter values for this field.
**'''''Team''''': Obviously, they will belong to the defending team so leave them at the default &quot;0&quot;

In order to force bots to take different routes you will need to use an [[Legacy:AssaultRandomizer|AssaultRandomizer]]. This will require some playtesting because the level should be fully pathed and all objectives/items etc... should be in place before using these actors. Once the level is fully pathed, playtest it a few times with one bot, and watch the route it takes to accomplish the mission. Where you want him to take a different route, you will place an AssaultRandomizer on the shorter path someplace where he can not get around it by addtitional path lines. Place this '''''after''''' the junction you want him to branch off at. It simulates the impression that that path is longer than it actually is. You will need to trigger this actor and here are a couple ways. I am not sure how this works, because there is no initial state variable for this actor. 

*Use a regular [[Legacy:Trigger|trigger]] set to toggle (So the randomizer is on and off randomly as players collide the trigger. could be used to make the bots sneaky?)
*Use a [[Legacy:Counter|counter]]
*Use a [[Legacy:StochasticTrigger|StochasticTrigger]]
*Use a [[Legacy:Dispatcher|Dispatcher]] with the randomizer called twice in outevents, and put a suitable outdelay.

There are probably more ways to do this, but I have not tried them. Good luck, and I love assault and am always looking for new maps. Once your map is done, be sure to Upload it to one of the UT map sites such as Unreal Playground or Nali City. Good luck and have fun. .

==Objectives ==

===Screenshots and Objective descriptions for the HUD:===

'''''You should without fail''''' create screenshots for each objective that clearly define where they are, (show more than just a picture of a button. Make it so there is some indication of where it is located.) and compose some some sort of text to describe how to trigger it, (shoot it or touch it?) and why it is an objective.  Telling why adds some atmosphere to the map. To do this you will need to place an '''''AssaultInfo''''' actor somewhere in the level. Here are the fields you will be concerned with filling out:
*Open the AssaultInfo actor's properties and under AssaultInfo you will see:
**'''''NumObjShots''''': Enter a value here corresponding to the number of objectives in your level.
**'''''ObjDesc''''': is where you will put the text that appears in the HUD when you press F3 during an assault game below the picture when you see the &quot;Transmission Follows:&quot; scroll beneath it.
**'''''ObjShots''''': This is similar to putting a [[Legacy:Screenshot (UT)|Screenshot (UT)]] in your level.
*Also a message in the center of the screen telling players what the next objective is once the previous one is complete is a good idea.

==EndGame ==

Try and do some kind of a nice ending sequence.  It's always a joy to see something like a bridge that you were trying to blow up collapse ala ''AS-Bridge''

==Comments ==

I don't play Assault.  I loathe it..well the online type.  I only did this because somebody started the page but put no text so i figured what the hell.  This page definitly needs input from an assault player tho, and a mapper who has made an assault level.-shadow

It is important to place grading spawn points on very long levels. Monsters and extra Bots confuse things greatly. Dynamic lighting is fine, but huge areas of strobing just annoys people right? Fort Standards are REALLY IMPORTANT and you must do them well. Big huge levels are great fun. -{di3}killboy

'''evil_blue_dude'''More mappers should make assault. Its good fun to play and to make.

When making assault maps, remember to test it for hammer jumping exploits. If you have a gate for example check to see if hammer jumpers can get over it. Things like that can be really annoying if left unfixed. Skilled hammer jumpers for example can complete AS-Mazon relatively quickly if no one's guarding the main gate because of the exposed ledge above it. It's not just hammer jumping that can cause problems either. Even AS-Dam has it's flaws - you can jump through the window of the tower and avoid the first objective and can quite easily complete the second and third objectives before the defenders even know what the hell's happening. - Slim

'''xX)(Xx'''

Also, some triggers in Assault maps are affected by ZEROPING weapons, the zeroping weapons just can't hit the fortstandards, it would be great to know why</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For AS (UT2004)</title>
    <id>2191</id>
    <revision>
      <id>5313</id>
      <timestamp>2007-01-31T12:26:01Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Gametype Basics==

Assault is a team based gametype where one team is attacking the other - a progression of objectives must be completed to finish the round. Objectives usually consist of driving a vehicle to a check point, holding a lever to progress to the next area or destroying objects to get past.

The style of assault maps can vary greatly between maps and you can do pretty close to anything you want in terms of size and layout.

The default assault maps that come with the game are fairly linear and players have to follow a set route with usually one or two alternatives but then centralising around the objective.

If you are looking to make an Assualt Map with no experience about assault you will want to read through the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] which is a fairly comprehensive tutorial on making assault maps.

==Optimization ==
: More: [[Legacy:Map Optimization|Map Optimization]]

===Fog===

No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. See also [[Legacy:Fog|fog]].

===StaticMesh CullDistance===

'''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

===Checkpoints===

Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

===Doors===

Make an antiportal that is the same size of your door but a bit wider (a few pixels, so it covers any zoneportals you may be using in the doorway when it is closed). Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

===Hiding Areas===

When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

===AntiPortal size===

Remember, one big [[Legacy:Antiportal|antiportal]] is always better than lots of little ones. Always.

===Zoning===

Try to place [[Legacy:ZonePortal|ZonePortal]]s in a place where they won't be seen that often. This causes the other zones to be rendered less often.

==External Links==
* [http://www.angelmapper.com/tutorials/assault.htm Angel Mapper's Assault Mapping Tutorial]

==Tutorials==
* [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]

==Related Topics==
* [[Legacy:Pathing For Assault|Pathing for Assault]]

* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Vehicle|Vehicle]]
** [[Legacy:ASVehicle|ASVehicle]]
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]]
* [[Legacy:Map Flow|Map Flow]]
** [[Legacy:Vehicle Gameplay|Vehicle Gameplay]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

{{innerbox|That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!) - ''MarZer''

}}

'''Tarquin:''' I've tidied up a bit. Some bits are general and could be moved to other pages (eg cull distance)

'''Catdæmon:''' Hope this is the right way to comment... oh well. Nice tutorial!

'''MarZer:''' Cheers Cat! I'm not done yet though. Over the next week or so I will be working with PointlesS to write a fully-fledged Assault Mapping Tutorial - one that *attempts* to cover all the bases.

'''Boksha:''' &quot;Make an antiportal that is the same size of your door but a bit narrower.&quot; Wouldn't it make more sense to make the antiportal WIDER than the door? That way you could also have it block a zoneportal that's also in the door, and make sure nothing on the other side of the door gets rendered if it doesn't have to be.

'''MarZer:''' Indeed, thanks :) . *edits page*

'''Blip2:''' Moved pathing stuff to [[Legacy:Pathing For Assault|Pathing for Assault]] - I'll add more general stuff about assault later and finish tidying up

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5314</id>
      <timestamp>2006-06-06T15:27:02Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Recently, while helping PointlesS with his Assault map AS-CityInvasion, I realised that many mappers are having trouble mapping for Assault. Having completed a fully-pathed and co-ordinated Assault map myself I'm pretty well-versed in the subject. As such, I'm posting a bunch of random Assault Mapping tips (most of which I gave to PointlesS) for mappers to use as a reference:

==Gametype Basics==

'''SuperApe:''' The basics of Assault mapping for UT200x have been skipped over.  This needs to be at least outlined.  I am not the expert on AS mapping, so perhaps someone could review the tutorial links at the bottom and fill this in?

===Default Gametype===

Set LevelInfo -&gt; DefaultGametype to &lt;tt&gt;UT2k4Assault.ASGameInfo&lt;/tt&gt;.

===Progressive PlayerStarts===

Use TriggeredPlayerStarts and a PlayerStartManager.

==General Assault Pathing==

First things first: NEVER use the autodoor/door actors. They are bugged. I have noticed bots often get confused when [[Legacy:Door|Door]]/[[Legacy:AutoDoor|AutoDoor]]s are used. Use 2 pathnodes and force a path between them accross the door. 

For every single vehicle path you have, try to have about 3 normal paths nearby. This is good for two reasons: bots on foot will attack/defend from different directions and if the vehicle gets off track, it can use the normal paths to find it's way back.

BlockedPaths, ForcedPaths and ProscribedPaths are your friend. Sometimes, bots just need to be forced:

===ForcedPaths===

Even if the editor doesn't make a link, you can force it yourself by first finding out the name of the node you want the path to (Properties -&gt; Object -&gt; Name), then selecting the node you want to make the link from and going to it's properties. Here, go to the Navigation group and head down to ForcedPaths. In the first item in the list, add the name of the pathnode you are forcing a link to. The next time you rebuild there will be a yellow line between the two nodes. This is one-way. To have it two way like a normal link, do the same thing, starting with the second node and linking back to the first.

===ProscribedPaths===

Set them up exactly like ForcedPaths, but they tell bots that they SHOULD NOT take this path, no matter what. This is useful as sometimes bots keep taking some stupid route and end up stuck, confused etc. When you [[Legacy:Rebuild|Rebuild]], they will be red paths.

===BlockedPaths===

Sometimes you want bots to follow a path until something happens (a door closes, something falls in the path). This is what blockedpaths are for. Say you have a blast door that is shut and opens when a particular objective is completed. Put a [[Legacy:BlockedPath|BlockedPath]] in front of it then make sure that its bBlockedPath property (or whatever it is called) under Navigation is set to true. Seeing as though you will already have nodes on the other side of the door, force a path from the blocked path to one of the nodes on the other side (and back again). Set the tag of the BlockedPath to whatever event opens the door, and when it is triggered (when the door opens), the bBlockedPath property will be toggled to false which lets bots know they can now go down that route.

==Vehicle Assault Pathing ==
: More: [[Legacy:Pathing For Vehicles|Pathing For Vehicles]] and [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]

ANY objective that requires the bots to use a vehicle, even if it is not mission-critical, should be given a VehiclePathName. You may have noticed this property before, here's how to use it: 

In the GameObjective group of the objective, there is the VehiclePathName field. Here, you enter the name of the ''vehicle-accessible pathnode closest to the objective they should be trying to reach''.

Another thing about vehicle pathing: When vehicle Assault mapping, remember ANY navigation points can be used by vehicles as long as bVehicleDestination (under Navigation) is true. In fact, you don't even need RoadPathNodes at all. The only benefit of using those over normal PathNodes is the distance they link over.

Vehicle paths should be as simple as possible: try to keep them as curves as opposed to sharp bends. The reason is this: If you have an L-shaped bend with one pathnode, it looks like an L to the bots. They don't slow down for it and generally crash. If you use a lot of pathnodes close together to round off the corner (say, 5 pathnodes, 300 Unreal Units apart in a curve, making up the corner), the bots will better judge the corner and slow down.

Defensive bots will not use their vehicles unless they see an enemy to attack with. Not by default. It is turned off in the vehicle code. Turning it back on is a simple matter of adding a few lines and saving it in myLevel. These scripts are like those used in AS-Confexia. These are as so:

&lt;uscript&gt;
class Blargh extends Foo; //Foo can be any one of the Vehicle classes

var (Vehicle)	bool bDefensiveUse;

function PreBeginPlay()
{
	bDefensive = bDefensiveUse;
	Super.PreBeginPlay();
}

defaultproperties
{
     bDefensiveUse=True
}
&lt;/uscript&gt;

==AI Scripts ==

The AI scripts system is bugged. I noticed this early in the making of HighRise. Here is the way it works:

In an Assault map, every AI script ''must'' be linked to an objective. The AI in UT2004 is very intelligent, but not intelligent enough to be able to decipher a mapper's random tags and events. :p 

You do this: The group of AI scripts you want defenders to use when they defend an objective you give the same tag to. MyTag. Then in the properties of the objective they are to defend, go to the GameObjective group. Look for the DefenseScriptTags field. Enter MyTag (subbing in your actual tag obviously). The bots will now know what to do come that objective.

This must be done for every single AI script in the level, there cannot be one single one that is not attached to an objective of some kind or ''all of them will fail''.

==Optimization ==
: More: [[Legacy:Map Optimization|Map Optimization]]

===Fog===

No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. See also [[Legacy:Fog|fog]].

===StaticMesh CullDistance===

'''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

===Checkpoints===

Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

===Doors===

Make an antiportal that is the same size of your door but a bit wider (a few pixels, so it covers any zoneportals you may be using in the doorway when it is closed). Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

===Hiding Areas===

When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

===AntiPortal size===

Remember, one big [[Legacy:Antiportal|antiportal]] is always better than lots of little ones. Always.

===Zoning===

Try to place [[Legacy:ZonePortal|ZonePortal]]s in a place where they won't be seen that often. This causes the other zones to be rendered less often.

==External Links==
* [http://www.angelmapper.com/tutorials/assault.htm Angel Mapper's Assault Mapping Tutorial]

==Tutorials==
* [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Vehicle|Vehicle]]
** [[Legacy:ASVehicle|ASVehicle]]
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]]
* [[Legacy:Map Flow|Map Flow]]
** [[Legacy:Vehicle Gameplay|Vehicle Gameplay]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

{{innerbox|That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!) - ''MarZer''

}}

'''Tarquin:''' I've tidied up a bit. Some bits are general and could be moved to other pages (eg cull distance)

'''Catdæmon:''' Hope this is the right way to comment... oh well. Nice tutorial!

'''MarZer:''' Cheers Cat! I'm not done yet though. Over the next week or so I will be working with PointlesS to write a fully-fledged Assault Mapping Tutorial - one that *attempts* to cover all the bases.

'''Boksha:''' &quot;Make an antiportal that is the same size of your door but a bit narrower.&quot; Wouldn't it make more sense to make the antiportal WIDER than the door? That way you could also have it block a zoneportal that's also in the door, and make sure nothing on the other side of the door gets rendered if it doesn't have to be.

'''MarZer:''' Indeed, thanks :) . *edits page*

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5315</id>
      <timestamp>2007-01-31T12:25:01Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>Adding Assault Basics (taken out stuff in as mapping tut)</comment>
      <text xml:space="preserve">==Gametype Basics==

Assault is a team based gametype where one team is attacking the other - a progression of objectives must be completed to finish the round. Objectives usually consist of driving a vehicle to a check point, holding a lever to progress to the next area or destroying objects to get past.

The style of assault maps can vary greatly between maps and you can do pretty close to anything you want in terms of size and layout.

The default assault maps that come with the game are fairly linear and players have to follow a set route with usually one or two alternatives but then centralising around the objective.

If you are looking to make an Assualt Map with no experience about assault you will want to read through the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] which is a fairly comprehensive tutorial on making assault maps.

==Optimization ==
: More: [[Legacy:Map Optimization|Map Optimization]]

===Fog===

No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. See also [[Legacy:Fog|fog]].

===StaticMesh CullDistance===

'''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

===Checkpoints===

Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

===Doors===

Make an antiportal that is the same size of your door but a bit wider (a few pixels, so it covers any zoneportals you may be using in the doorway when it is closed). Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

===Hiding Areas===

When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

===AntiPortal size===

Remember, one big [[Legacy:Antiportal|antiportal]] is always better than lots of little ones. Always.

===Zoning===

Try to place [[Legacy:ZonePortal|ZonePortal]]s in a place where they won't be seen that often. This causes the other zones to be rendered less often.

==External Links==
* [http://www.angelmapper.com/tutorials/assault.htm Angel Mapper's Assault Mapping Tutorial]

==Tutorials==
* [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Vehicle|Vehicle]]
** [[Legacy:ASVehicle|ASVehicle]]
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]]
* [[Legacy:Map Flow|Map Flow]]
** [[Legacy:Vehicle Gameplay|Vehicle Gameplay]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

{{innerbox|That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!) - ''MarZer''

}}

'''Tarquin:''' I've tidied up a bit. Some bits are general and could be moved to other pages (eg cull distance)

'''Catdæmon:''' Hope this is the right way to comment... oh well. Nice tutorial!

'''MarZer:''' Cheers Cat! I'm not done yet though. Over the next week or so I will be working with PointlesS to write a fully-fledged Assault Mapping Tutorial - one that *attempts* to cover all the bases.

'''Boksha:''' &quot;Make an antiportal that is the same size of your door but a bit narrower.&quot; Wouldn't it make more sense to make the antiportal WIDER than the door? That way you could also have it block a zoneportal that's also in the door, and make sure nothing on the other side of the door gets rendered if it doesn't have to be.

'''MarZer:''' Indeed, thanks :) . *edits page*

'''Blip2:''' Moved pathing stuff to [[Legacy:Pathing For Assault|Pathing for Assault]] - I'll add more general stuff about assault later and finish tidying up

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>33990</id>
      <timestamp>2009-02-06T00:53:06Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <minor/>
      <comment>link fix</comment>
      <text xml:space="preserve">==Gametype Basics==

Assault is a team based gametype where one team is attacking the other - a progression of objectives must be completed to finish the round. Objectives usually consist of driving a vehicle to a check point, holding a lever to progress to the next area or destroying objects to get past.

The style of assault maps can vary greatly between maps and you can do pretty close to anything you want in terms of size and layout.

The default assault maps that come with the game are fairly linear and players have to follow a set route with usually one or two alternatives but then centralising around the objective.

If you are looking to make an Assualt Map with no experience about assault you will want to read through the [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]] which is a fairly comprehensive tutorial on making assault maps.

==Optimization ==
: More: [[Legacy:Map Optimization|Map Optimization]]

===Fog===

No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. See also [[Legacy:Fog|fog]].

===StaticMesh CullDistance===

'''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

===Checkpoints===

Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

===Doors===

Make an antiportal that is the same size of your door but a bit wider (a few pixels, so it covers any zoneportals you may be using in the doorway when it is closed). Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

===Hiding Areas===

When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

===AntiPortal size===

Remember, one big [[Legacy:Antiportal|antiportal]] is always better than lots of little ones. Always.

===Zoning===

Try to place [[Legacy:ZonePortal|ZonePortal]]s in a place where they won't be seen that often. This causes the other zones to be rendered less often.

==External Links==
* [http://www.angelmapper.com/gamedev/tutorials/assault.htm Angel Mapper's Assault Mapping Tutorial]

==Tutorials==
* [[Legacy:Assault Mapping Tutorial|Assault Mapping Tutorial]]

==Related Topics==
* [[Legacy:Pathing For Assault|Pathing for Assault]]

* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]]
** [[Legacy:Bot Pathing|Bot Pathing]]
*** [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
*** [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Vehicle|Vehicle]]
** [[Legacy:ASVehicle|ASVehicle]]
* [[Legacy:SVehicleFactory|SVehicleFactory]]
** [[Legacy:ASVehicleFactory|ASVehicleFactory]]
* [[Legacy:Map Flow|Map Flow]]
** [[Legacy:Vehicle Gameplay|Vehicle Gameplay]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

{{innerbox|That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!) - ''MarZer''

}}

'''Tarquin:''' I've tidied up a bit. Some bits are general and could be moved to other pages (eg cull distance)

'''Catdæmon:''' Hope this is the right way to comment... oh well. Nice tutorial!

'''MarZer:''' Cheers Cat! I'm not done yet though. Over the next week or so I will be working with PointlesS to write a fully-fledged Assault Mapping Tutorial - one that *attempts* to cover all the bases.

'''Boksha:''' &quot;Make an antiportal that is the same size of your door but a bit narrower.&quot; Wouldn't it make more sense to make the antiportal WIDER than the door? That way you could also have it block a zoneportal that's also in the door, and make sure nothing on the other side of the door gets rendered if it doesn't have to be.

'''MarZer:''' Indeed, thanks :) . *edits page*

'''Blip2:''' Moved pathing stuff to [[Legacy:Pathing For Assault|Pathing for Assault]] - I'll add more general stuff about assault later and finish tidying up

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For BR</title>
    <id>2037</id>
    <revision>
      <id>4968</id>
      <timestamp>2005-12-29T04:11:00Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">In '''Bombing Run (BR)''', two teams face off against each other in large arena-like levels.  A ball is spawned at the center of the level or at equal distance from teams.  The object of the game is for one team to carry the ball to a hoop in the opposing team's base (the goal) and either carry it through the hoop (worth 7 points), or fire the ball through the hoop (worth 3 points).  Once a team has scored the players are re-spawned at PlayerStart positions after 5 seconds or so and the ball is re-spawned in the center of the map.

==Objects and Settings==
* '''[[Legacy:Level Properties|Level Properties]]''' (LevelInfo) DefaultGameType : &lt;tt&gt;xGame.xBombingRun&lt;/tt&gt;
* [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpDest|JumpDest]] -&gt; [[Legacy:JumpSpot|JumpSpot]] -&gt; [[Legacy:GameObjective|GameObjective]] -&gt; [[Legacy:XBombSpawn|xBombSpawn]]
* [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:JumpDest|JumpDest]] -&gt; [[Legacy:JumpSpot|JumpSpot]] -&gt; [[Legacy:GameObjective|GameObjective]] -&gt; [[Legacy:XBombDelivery|xBombDelivery]]
* [[Legacy:NavigationPoint|NavigationPoint]] -&gt; [[Legacy:ShootSpot|ShootSpot]] -&gt; RedShootSpot &amp; BlueShootSpot

==Layout Structure ==

Bombing Run maps by their very nature tend to be composed of large rooms rather than small cramped corridors.  Space is needed to allow the ball to be passed between team members.  Multiple levels within a BR map can work very well but should be used with care as it would be possible to make it far too easy to score.

Framerate is the biggest thing to watch for in a Bombing Run map.  Because the rooms are so large it's easily possible to either pack in too much detail or allow players to see from one end of the level through to the other (always a frame rate killer).

Think very very carefully before making an assymetrical Bombing Run map; you may break the gameplay compeltely.

See also [[Legacy:Map Flow|Map Flow]].

Critical areas of the Bombing Run map are discussed below.

===The Scoring Hoop (xBombDelivery)===

Probably the most important thing to remember about the positioning of the scoring hoop [[Legacy:GameObjective|GameObjective]] is that it should be difficult to throw the ball through, and much harder for a player to actually carry the ball through.  Having some sort of penalty (like death) for carrying the ball through the hoop is fine &amp;ndash; just a bit gimmicky.  Placing the scoring hoop at the end of a long thin ramp with certain death on either side is also fine.

Probably the most important thing to remember is that it should be impossible to score from a great distance.  The ball can be thrown a long way.  Teams really shouldn't be able to throw the ball from one end of the level to the other and score bypassing the defense.

It's possible to have more than one scoring hoop per team. Several maps out there take advantage of this fact, though it's questionable if it enhances gameplay any.

===PlayerStart Positions===

There should be an identical number of player start points for each team, and they need to be placed in exactly the same relative positions from the ball spaw point.  Otherwise one team may be able to reach the ball spawn point much faster than the other team, gaining a big advantage.

Players start points should be close enough to a weapon that one can easily be grabbed.  Ideally there should also be a selection of routes to the ball spawn point.  The distance between the player start points and the scoring hoop also needs careful thought.  If the player start points are too close to the scoring hoop then attackers will have a very hard time scoring as they will be wading through multiple waves of defenders.

See also [[Legacy:Placing PlayerStart|Placing PlayerStart]].

===The Ball (xBombSpawn) Position ===

Currently there can be only one of these on a level.  At the start of each round (or when the ball is reset) this is the point at which the ball is respawn.  The bigger the area the ball spawns in the less like a spam-frag fest round starts will be.  It should be possible to pass the ball out of the spawn room quickly.  The first person to touch the ball is almost certainly going to die very shortly after picking it up.

===ShootSpots===

Bots require ShootSpots in the map to play correctly.  A ShootSpot should be placed in an area where a bot can shoot the ball straight at the opposing goal, preferably near the goal with a better-than-decent chance of scoring.  A [[Legacy:BlueShootSpot|BlueShootSpot]] will fire at the blue goal, Red at the red goal; although bots from either Team will use the ShootSpot if distressed.  Bots from the Blue Team shooting from a BlueShootSpot will try to launch the ball straight at the red goal, effectively 'punting' the ball to the other side of the map.  Note: Bots will do this whether the map blocks a clear, straight shot to the goal or not.  When placing ShootSpots, be aware of the line as well as the arc that bots will try to launch the ball at in order to hit the opposing goal from that point. (''I hope that makes sense.  Just play test with ''xBombDelivery-&gt;TouchdownDifficulty'' set to 1 and you'll see the bots try to shoot more often.'' &amp;ndash;'''SuperApe''')  More than one ShootSpot can be placed per goal.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''SuperApe:''' I can envisage all sorts of inventive ideas for ball spawn points and map features.  Out of all of the game styles, Bombing Run probably lends itself most to the creation of one-off features that aid the gameplay.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4969</id>
      <timestamp>2005-11-01T18:25:32Z</timestamp>
      <contributor>
        <ip>Pool1489.cvx8-bradley.dialup.earthlink.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">In '''Bombing Run''' (BR) two teams face off against each other in large arena-like levels.  A ball is spawned at the center of the level.  The object of the game is for one team to carry the ball to a hoop in the opposing team's base (the goal) and either carry it through the hoop (worth 7 points), or, fire the ball through the hoop (worth 3 points).  Once a team has scored the players are re-spawned at their starting points after 5 seconds or so and the ball is re-spawned in the center of the map.

==Map Structure ==

Bombing run maps by their very nature tend to be composed of large rooms rather than small cramped corridors.  Space is needed to allow the ball to be passed between team members.  Multiple levels within a BR map can work very well but should be used with care as it would be possible to make it far too easy to score.

Framerate is the biggest thing to watch for in a Bombing Run map.  Because the rooms are so large it's easily possible to either pack in too much detail, or, allow players to see from one end of the level through to the other (always a frame rate killer).

Think very very carefully before making an assymetrical Bombing Run map &amp;ndash; you may break the gameplay compeltely.

The specific areas of the map are discussed below.

===The scoring hoop ===

Probably the most important thing to remember about the positioning of the scoring hoop is that it should be difficult to throw the ball through, and much harder for a player to actually carry the ball through.  Having some sort of penalty (like death) for carrying the ball through the hoop is fine &amp;ndash; just a bit gimmicky.  Placing the scoring hoop at the end of a long thin ramp with certain death on either side is also fine.

Probably the most important thing to remember is that it should be impossible to score from a great distance.  The ball can be thrown a long way.  Teams really shouldn't be able to throw the ball from one end of the level to the other and score bypassing the defense.

It's possible to have more than one scoring hoop per team. Several maps out there take advantage of this fact, though it's questionable if it enhances gameplay any.

===Player start points ===

There should be an identical number of player start points for each team, and they need to be placed in exactly the same relative positions from the ball spaw point.  Otherwise one team may be able to reach the ball spawn point much faster than the other team, gaining a big advantage.

Players start points should be close enough to a weapon that one can easily be grabbed.  Ideally there should also be a selection of routes to the ball spawn point.  The distance between the player start points and the scoring hoop also needs careful thought.  If the player start points are too close to the scoring hoop then attackers will have a very hard time scoring as they will be wading through multiple waves of defenders.

===The ball spawn point ===

Currently there can be only one of these on a level.  At the start of each round (or when the ball is reset) this is the point at which the ball is respawn.  The bigger the area the ball spawns in the less like a spam-frag fest round starts will be.  It should be possible to pass the ball out of the spawn room quickly.  The first person to touch the ball is almost certainly going to die very shortly after picking it up.

===ShootSpots===

Bots require ShootSpots in the map to play correctly.  A ShootSpot should be placed in an area where a bot can shoot the ball straight at the opposing goal, preferably near the goal with a better-than-decent chance of scoring.  A [[Legacy:BlueShootSpot|BlueShootSpot]] will fire at the blue goal, Red at the red goal; although bots from either Team will use the ShootSpot if distressed.  Bots from the Blue Team shooting from a BlueShootSpot will try to launch the ball straight at the red goal, effectively 'punting' the ball to the other side of the map.  Note: Bots will do this whether the map blocks a clear, straight shot to the goal or not.  When placing ShootSpots, be aware of the line as well as the arc that bots will try to launch the ball at in order to hit the opposing goal from that point. (''I hope that makes sense.  Just play test with ''xBombDelivery-&gt;TouchdownDifficulty'' set to 1 and you'll see the bots try to shoot more often.'' &amp;ndash;'''SuperApe''')  More than one ShootSpot can be placed per goal.

==Summary ==

I can envisage all sorts of inventive ideas for ball spawn points and map features.  Out of all of the game styles, Bombing Run probably lends itself most to the creation of one-off features that aid the gameplay.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For BR4</title>
    <id>2196</id>
    <revision>
      <id>5324</id>
      <timestamp>2004-11-30T21:09:36Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>examples</comment>
      <text xml:space="preserve">BR4 is essentially Bombing Run with 4 teams. Actually, it's based more on [http://uncommonplace.com/games/bombingspree.html Bombing Spree], as there can be multiple balls.

In order to access the BR4 classes, you may need to go to the Actors browser and open BR4.u.

==Goals==

Instead of [[Legacy:XBombDelivery|xBombDelivery]], you will use BombDelivery4, and set the Team value as usual (Green=2, Gold=3). You must use BombDelivery4 even for the Red and Blue goals, otherwise scoring will not work properly.

==ShootSpots==

There are two additional types of [[Legacy:ShootSpot|ShootSpot]]: GreenShootSpot and GoldShootSpot. They work the same as the blue and red versions: place them where you want bots to shoot into the corresponding goal. The normal [[Legacy:RedShootSpot|RedShootSpot]] and [[Legacy:BlueShootSpot|BlueShootSpot]] can be used in a BR4 map.

==Balls==

Use BallSpawn4 to place balls. Balls can be assigned a team number (0-3), or left neutral (255). If you play a game with the BR4 Team Balls option set to None, then all balls will be neutral; otherwise, they will be as you placed them in your map. You should of course have the same number for each team. Your map can have any combination of team balls and neutral balls. The limit is 8 balls in a map, but that should be plenty.

You can specify when certain balls will appear, depeding on the Team Balls setting. Set BombSpawn4-&gt;AppearForTeamOption as follows:

{|

|-
|&lt;tt&gt;app_All&lt;/tt&gt;
|Always appears
|-
|&lt;tt&gt;app_AllTeam&lt;/tt&gt;
|Appears with Team Balls set to either Pickup or Scoring
|-
|&lt;tt&gt;app_None&lt;/tt&gt;
|Only appears with Team Balls set to None
|-
|&lt;tt&gt;app_Pickup&lt;/tt&gt;
|Only appears with Team Balls set to Pickup
|-
|&lt;tt&gt;app_Scoring&lt;/tt&gt;
|Only appears with Team Balls set to Scoring
|}

Notice how this is done in BR4-TutorialClassic. There are 4 team balls, all set to &lt;tt&gt;app_AllTeam&lt;/tt&gt;. Then there are two neutral balls set to &lt;tt&gt;app_None&lt;/tt&gt;. In BR4-Chrome, there are 12 balls in the map, but no more than 6 will appear at a time. It has two sets of team balls: Team Scoring balls near the center, and Team Pickup balls closer to each base. There are four neutral balls, two of which are set to &lt;tt&gt;app_None&lt;/tt&gt;.

You can also use this setting to control which Team Balls settings can be used in your map, because it will be automatically adjusted to make sure that at least one ball appears. For example, if all balls in a map are set to &lt;tt&gt;app_Pickup&lt;/tt&gt;, then the game will automatically switch to Team Pickup balls for that map.

==Other stuff==

Monitors, banners, and so forth are done [[Legacy:OverloadUT/Making CTF4 Maps|as in CTF4]].</text>
    </revision>
    <revision>
      <id>5325</id>
      <timestamp>2004-11-30T01:19:55Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">BR4 is essentially Bombing Run with 4 teams. Actually, it's based more on [http://uncommonplace.com/games/bombingspree.html Bombing Spree], as there can be multiple balls.

In order to access the BR4 classes, you may need to go to the Actors browser and open BR4.u.

==Goals==

Instead of [[Legacy:XBombDelivery|xBombDelivery]], you will use BombDelivery4, and set the Team value as usual (Green=2, Gold=3). You must use BombDelivery4 even for the Red and Blue goals, otherwise scoring will not work properly.

==ShootSpots==

There are two additional types of [[Legacy:ShootSpot|ShootSpot]]: GreenShootSpot and GoldShootSpot. They work the same as the blue and red versions: place them where you want bots to shoot into the corresponding goal. The normal [[Legacy:RedShootSpot|RedShootSpot]] and [[Legacy:BlueShootSpot|BlueShootSpot]] can be used in a BR4 map.

==Balls==

Use BallSpawn4 to place balls. Balls can be assigned a team number (0-3), or left neutral (255). If you play a game with the BR4 Team Balls option set to None, then all balls will be neutral; otherwise, they will be as you placed them in your map. You should of course have the same number for each team. Your map can have any combination of team balls and neutral balls. The limit is 8 balls in a map, but that should be plenty.

You can specify when certain balls will appear, depeding on the Team Balls setting. Set BombSpawn4-&gt;AppearForTeamOption as follows:

{|

|-
|&lt;tt&gt;app_All&lt;/tt&gt;
|Always appears
|-
|&lt;tt&gt;app_AllTeam&lt;/tt&gt;
|Appears with Team Balls set to either Pickup or Scoring
|-
|&lt;tt&gt;app_None&lt;/tt&gt;
|Only appears with Team Balls set to None
|-
|&lt;tt&gt;app_Pickup&lt;/tt&gt;
|Only appears with Team Balls set to Pickup
|-
|&lt;tt&gt;app_Scoring&lt;/tt&gt;
|Only appears with Team Balls set to Scoring
|}

You can also use this setting to control which Team Balls settings can be used in your map, because it will be automatically adjusted to make sure that at least one ball appears. For example, if all balls in a map are set to &lt;tt&gt;app_Pickup&lt;/tt&gt;, then the game will automatically switch to Team Pickup balls for that map.

==Other stuff==

Monitors, banners, and so forth are done [[Legacy:OverloadUT/Making CTF4 Maps|as in CTF4]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For CTF</title>
    <id>1840</id>
    <revision>
      <id>4519</id>
      <timestamp>2007-05-28T16:50:52Z</timestamp>
      <contributor>
        <ip>Evan E</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Capture the Flag (CTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

==From Deathmatch to Capture the Flag==

On the surface it may seem like a CTF map is simply just an elongated DM map with a couple of flags and team spawn points thrown in for good measure.  Unfortunately this is not the case.  When [[Legacy:Mapping_For_DM|Mapping_For_DM]], the [[Legacy:Map Flow|flow]] of the level has to be considered in its entirety.  There shouldn't be any choking points on the map and few (if any) dead ends.  CTF maps on the other hand thrive on natural choke points and have, by their very nature, at least two dead ends (ie. the flag rooms).  The only important map flow is between the two flag bases.

==Creating a CTF Map==

When building a CTF map there are a number of things that are vital to its success.  These are summarised below.
* The flag room and the location of the [[Legacy:FlagBase|FlagBase]] object within it.
* The location of the team spawning points.
* The route(s) from a flag room into the central area (if there is one) of your map.
* The balancing of the map and its weapons so that neither team has an advantage over the other.
* The [[Legacy:LevelInfo|LevelInfo]] -&gt; DefaultGameType set to &lt;tt&gt;xGame.xCTFGame&lt;/tt&gt;

===The Flag Room===

There are two styles of flag room you can use.  You can either build a flag room that is relatively open and reasonably large (e.g. Orbital, and Command), or, you can go for a smaller flag room with obstacles (e.g. Coret, and Gauntlet).  Neither type of flag room is particularly advantageous to the attacking or defending team.  At this point advantage goes to whichever team is best in the flag room environment itself. 

The flag room should have some health and ammunition available to the defenders, and possibly a low powered weapon (such as the Pulse or Bio Rifles).  The more powerful weapons should be placed away from the flag, or in an awkward position.  This means that a flag's defenders must be out of position to obtain them, placing the flag at some risk. 

And finally, although it seems obvious, there should be no question in a player's mind as to which team the flag room belongs to.  It should be completely obvious.  Placing the flag on an obvious feature or making it the centerpoint of the room is also a good idea - it serves to emphasise the location of the flag.  Just ensure that the feature used for this purpose doesn't obstruct the player unexpectedly (the flag holder on Coret is a bugger for that).

===Team Spawn Points===

Spawn points need to be carefully placed.  Place them near the center of a map and the defence will have an easy ride.  Place them behind the flag, or level with the flag, and the attackers will have a far easier job escaping with the flags as the defence may not be able to catch up with the escaping flag carrier.  Generally spawn points should be placed around the flag room (but not necessarily within it) but no closer to the center of the map than about half way through a base.  It's generally better to favour the attacking team when placing spawn points though as this ensures the focus of the defence is on defending the base.

===Routes Between the Flags===

How the routes between the two flag rooms are constructed will determine how your map flows, and how it is paced.

If you want a fairly slow pace then the central area between the two flag rooms should be very open, and long.  The cover available to the flag carrier and his team mates should be extremely limited.  In this type of map there is normally only a single choke point &amp;ndash; the central area.  ''CTF-Hydro'' is a good example of this type of map.  The bridges are really the only choke point in the level.  If you control them you control the game. 

A good example of a medium paced map is ''CTF-Coret''.  The level is mainly corridor based with the central area having plenty of pillars and cover for the flag carrier.  The map also has multiple routes between the flag rooms.  The are plenty of opportunities to move between the different routes between the two flag rooms, which helps the flag carriers escape.  There are two choke points in Coret, one in each base.  Each choke point is located just after the first door to each base.  The choke point is located at the ramp that links the upper and lower routes.  At the top of this ramp you can see everyone attempting to take the top route, and hear people coming through the door trying to take the lower route.

Fast paced maps are always small.  Both open and corridor fast paced maps exist, and both work well when done right.  Maps of this form are almost exclusively based on a figure of eight, or, a straight line with occasional obstacles.  ''CTF-Gauntlet'' and ''CTF-Niven'' are good examples of this type of map.

Probably the best models to use when creating your routes between the flags are one or more figure of 8's, or a braid type structure.  ''CTF-Command'' and ''CTF-Gauntlet'' are classic figure of eight maps.  ''CTF-Coret'' is much closer to the braid model as it has multiple cross over points and loops.

The routes between each of the flag rooms should be team coloured at each end, and neutrally decorated in the center of the map.  If it's a large map consider putting obvious markers on walls that lead towards the flag rooms.  A player should never been in doubt as to which flag room they are heading towards.

===Map Balance &amp;ndash; Symmetry or Asymmetry===

The debate about map symmetry for CTF games has raged long and hard.  Rather than become embroiled in a discussion that is well outside of the scope of this page I'll side step the issue.  Some points worthy of consideration are listed below.
* Asymmetrical maps take forever to balance correctly and are harder to build well.
* It is important that both teams have equal access to weapons, health, and armour &amp;ndash; even if the map is asymmetrical.
* A map that is symmetrical in structure does not necessarily have to be symmetrical in terms of theme.

Personally, I would recommend making your maps symmetrical: that way you can be completely sure that the map is balanced. The symmetry can be:
* simple: The bases face each other. The [[Legacy:MapScale|MapScale]] tool can be used to quickly make one base a mirror image of the other.
* rotational: drag-select the entire base, duplicate, and rotate to make base number two.

Diagonal lines of symmetry (bases at right angles), or bases one above the other are also sometimes seen.  Be careful when building map bases above each other.  Although it seems that the lower team has an advantage because their flag carrier can escape more easily, this is not the case.  The lower team will be overwhelmed by players from the upper team dropping into their base - by simply falling.  The upper team's ability to field players more quickly makes covering the flag carrier much easier and more than offsets the lower teams ability to escape faster. 

If you do decide to build an asymmetrical map you absolutely must ensure that it gets extensively play tested by clans that play regularly in leagues and ladders. 

==Item Placement==

Make sure both bases have equal amounts of health, weapons, armour, and other items that can be picked up.  If the map is symmetrical then the objects should be as well.  Make sure that there is enough ammunition and health for the number of players you envisage using the map.  Also, make sure there are enough player starts.  You might think your map shouldn't be played by more than 8 people at a time, but at some point someone will play it with 16.

Make sure you have enough [[Legacy:PlayerStart|PlayerStart]]s and that you assign them for each team.  Don't make a red team member spawn in the blue base or vice versa.  See also [[Legacy:Team Number|Team Number]].
* Team 0 is Red 
* Team 1 is Blue

==Troubleshooting==

Some known problems with CTF levels:
; Bots won't get the flag : Try moving the end of your flag further into the floor.  Don't worry about the overlap with geometry. It won't cause [[Legacy:BSP Hole|BSP hole]]s.  It's also worth checking the bot-paths as displayed within the path view.  You can find the path view toggle within the [[Legacy:Viewport_Caption_Context_Menu|Viewport_Caption_Context_Menu]].  You may find that you don't have a path to the flag.

; Bots only take one path : Try using [[Legacy:AlternatePath|AlternatePath]] actors and setting a priority on them.  You can also put items on an alternate path to entice bots towards that direction. Also allow for translocation points and distance shooting for bots.

; The flag has fallen into a pit and is stuck there : Make sure that all falls and drops have a [[Legacy:PainZone|PainZone]] at the bottom - that way the flag will be returned when it drops into it.  A map that suffers from this problem is ''CTF-High''. &amp;ndash; Or, make sure that the ZoneInfo(lava pressure vaccum etc) in the area you want the flag to be returned has to have bStatic = True in the advanced properties.

; The Map won't show up in the map list when creating a server in some cases. : If you have periods in the map name (CTF-Level1.4) then eliminate them.  Underscores can also causes issues.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]
* [[Legacy:Lifts Vs Jumppads|Lifts Vs Jumppads]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''CH3Z:''' Some of the stylistic and opinionated statements should be edited out of this page.

'''SuperApe:''' Personally, I'm all for seeing wiki page text free of opinions and rants.  I say, go ahead and clean up along those lines.  If you go too far, someone will pull it back.

'''CH3Z:''' It would be like trying figure out the best side of a sphere to grab a hold of. Where would one start? I am hoping that the original author will reconsider the content of this page and strip it down closer to the neccesary facts that a person wanting to make a ctf map, according to '''their own''' art and style, and to serve the kind of gameplay that '''that mapper''' desires the map to offer, would find useful. &quot;There are two styles of flag room you can use.&quot; awww shoot really? Is that all I get... two? It was good to mention that there are the two ways, Symmetry or Asymmetry, and some insight into things that one might consider when going asymmetrical that are not issues of going symmetrical can be a very helpful point to touch on. But to point out that it is an age old dispute and that you aren't going to touch it, then turn around and show obviouse favor to one over the othre and discourage the other... well... If a person '''can''' make an asymmetrical map that addresses those issues and ends up well done then it will offer a much more realistic environment then simple mirror image. So why not just give them the facts and points to ponder and let them consider these things when producing for us all to enjoy an new ctf map that is hopefully unique and not conformant to any individuality-stiffling influence. That's just touching on a few things, if I were to edit this page to &quot;just the facts&quot; I'm afraid it would be so consice as to offend the author. I hope my comments don't serve the same appearance of malintent. Blunt and to the point, yes, but not intentionally without tact. I want people who read this page to bennefit from it and I believe I see among the content herewithin statements that are less than supportive of that goal. A consice page will serve very well actually. It is not necessary that a page have any minimum amount of data on it. It is only necessary that it serve it's purpose and serve it's intended audience.   

'''EntropicLqd:''' I ''think'' I might have been the original author of this page about a gazillion years ago.  Feel free to edit it as you see fit - just try not to make it so dry as to be upalatable.  I promise not to be offended :) - it was probably written as a re-action to the endless stream of diabolical CTF maps I was downloading and checking out at the time.  Sometimes an expressed opinion can be more useful than a bunch of dry facts as you have to consider why you would disagree.  But hey, I'm starting to ramble now (happens when you get old).

'''CH3Z:''' Mom! He just called me, &quot;OLD&quot;! I must have been some kind of mood that day; looking at this page now, it's not out of hand, and alot of the opinions seem to be popular opinion. So if no further discussion follows soon supporting changes, I'll leave it alone and take the discussion down. I might possibly make one or two slight changes, maybe none. 

'''SuperApe:''' Upon closer examination, this page doesn't seem overly ''rantish''.  The references to specific maps may not be the most helpful, but it's not a big problem IMO.  Some of the info seems subjective, like flag rooms ''should'' be dead ends, CTF maps ''need'' a choke point in the center, etc.  These should be defined as suggestions, not guidelines. (again, IMHO)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4520</id>
      <timestamp>2006-03-14T21:46:14Z</timestamp>
      <contributor>
        <ip>N8Mills</ip>
      </contributor>
      <comment>Map Names</comment>
      <text xml:space="preserve">'''Capture the Flag (CTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

==From Deathmatch to Capture the Flag==

On the surface it may seem like a CTF map is simply just an elongated DM map with a couple of flags and team spawn points thrown in for good measure.  Unfortunately this is not the case.  When [[Legacy:Mapping_For_DM|Mapping_For_DM]], the [[Legacy:Map Flow|flow]] of the level has to be considered in its entirety.  There shouldn't be any choking points on the map and few (if any) dead ends.  CTF maps on the other hand thrive on natural choke points and have, by their very nature, at least two dead ends (ie. the flag rooms).  The only important map flow is between the two flag bases.

==Creating a CTF Map==

When building a CTF map there are a number of things that are vital to its success.  These are summarised below.
* The flag room and the location of the [[Legacy:FlagBase|FlagBase]] object within it.
* The location of the team spawning points.
* The route(s) from a flag room into the central area (if there is one) of your map.
* The balancing of the map and its weapons so that neither team has an advantage over the other.
* The [[Legacy:LevelInfo|LevelInfo]] -&gt; DefaultGameType set to &lt;tt&gt;xGame.xCTFGame&lt;/tt&gt;.

===The Flag Room===

There are two styles of flag room you can use.  You can either build a flag room that is relatively open and reasonably large (e.g. Orbital, and Command), or, you can go for a smaller flag room with obstacles (e.g. Coret, and Gauntlet).  Neither type of flag room is particularly advantageous to the attacking or defending team.  At this point advantage goes to whichever team is best in the flag room environment itself. 

The flag room should have some health and ammunition available to the defenders, and possibly a low powered weapon (such as the Pulse or Bio Rifles).  The more powerful weapons should be placed away from the flag, or in an awkward position.  This means that a flag's defenders must be out of position to obtain them, placing the flag at some risk. 

And finally, although it seems obvious, there should be no question in a player's mind as to which team the flag room belongs to.  It should be completely obvious.  Placing the flag on an obvious feature or making it the centerpoint of the room is also a good idea - it serves to emphasise the location of the flag.  Just ensure that the feature used for this purpose doesn't obstruct the player unexpectedly (the flag holder on Coret is a bugger for that).

===Team Spawn Points===

Spawn points need to be carefully placed.  Place them near the center of a map and the defence will have an easy ride.  Place them behind the flag, or level with the flag, and the attackers will have a far easier job escaping with the flags as the defence may not be able to catch up with the escaping flag carrier.  Generally spawn points should be placed around the flag room (but not necessarily within it) but no closer to the center of the map than about half way through a base.  It's generally better to favour the attacking team when placing spawn points though as this ensures the focus of the defence is on defending the base.

===Routes Between the Flags===

How the routes between the two flag rooms are constructed will determine how your map flows, and how it is paced.

If you want a fairly slow pace then the central area between the two flag rooms should be very open, and long.  The cover available to the flag carrier and his team mates should be extremely limited.  In this type of map there is normally only a single choke point &amp;ndash; the central area.  ''CTF-Hydro'' is a good example of this type of map.  The bridges are really the only choke point in the level.  If you control them you control the game. 

A good example of a medium paced map is ''CTF-Coret''.  The level is mainly corridor based with the central area having plenty of pillars and cover for the flag carrier.  The map also has multiple routes between the flag rooms.  The are plenty of opportunities to move between the different routes between the two flag rooms, which helps the flag carriers escape.  There are two choke points in Coret, one in each base.  Each choke point is located just after the first door to each base.  The choke point is located at the ramp that links the upper and lower routes.  At the top of this ramp you can see everyone attempting to take the top route, and hear people coming through the door trying to take the lower route.

Fast paced maps are always small.  Both open and corridor fast paced maps exist, and both work well when done right.  Maps of this form are almost exclusively based on a figure of eight, or, a straight line with occasional obstacles.  ''CTF-Gauntlet'' and ''CTF-Niven'' are good examples of this type of map.

Probably the best models to use when creating your routes between the flags are one or more figure of 8's, or a braid type structure.  ''CTF-Command'' and ''CTF-Gauntlet'' are classic figure of eight maps.  ''CTF-Coret'' is much closer to the braid model as it has multiple cross over points and loops.

The routes between each of the flag rooms should be team coloured at each end, and neutrally decorated in the center of the map.  If it's a large map consider putting obvious markers on walls that lead towards the flag rooms.  A player should never been in doubt as to which flag room they are heading towards.

===Map Balance &amp;ndash; Symmetry or Asymmetry===

The debate about map symmetry for CTF games has raged long and hard.  Rather than become embroiled in a discussion that is well outside of the scope of this page I'll side step the issue.  Some points worthy of consideration are listed below.
* Asymmetrical maps take forever to balance correctly and are harder to build well.
* It is important that both teams have equal access to weapons, health, and armour &amp;ndash; even if the map is asymmetrical.
* A map that is symmetrical in structure does not necessarily have to be symmetrical in terms of theme.

Personally, I would recommend making your maps symmetrical: that way you can be completely sure that the map is balanced. The symmetry can be:
* simple: The bases face each other. The [[Legacy:MapScale|MapScale]] tool can be used to quickly make one base a mirror image of the other.
* rotational: drag-select the entire base, duplicate, and rotate to make base number two.

Diagonal lines of symmetry (bases at right angles), or bases one above the other are also sometimes seen.  Be careful when building map bases above each other.  Although it seems that the lower team has an advantage because their flag carrier can escape more easily, this is not the case.  The lower team will be overwhelmed by players from the upper team dropping into their base - by simply falling.  The upper team's ability to field players more quickly makes covering the flag carrier much easier and more than offsets the lower teams ability to escape faster. 

If you do decide to build an asymmetrical map you absolutely must ensure that it gets extensively play tested by clans that play regularly in leagues and ladders. 

==Item Placement==

Make sure both bases have equal amounts of health, weapons, armour, and other items that can be picked up.  If the map is symmetrical then the objects should be as well.  Make sure that there is enough ammunition and health for the number of players you envisage using the map.  Also, make sure there are enough player starts.  You might think your map shouldn't be played by more than 8 people at a time, but at some point someone will play it with 16.

Make sure you have enough [[Legacy:PlayerStart|PlayerStart]]s and that you assign them for each team.  Don't make a red team member spawn in the blue base or vice versa.  See also [[Legacy:Team Number|Team Number]].
* Team 0 is Red 
* Team 1 is Blue

==Troubleshooting==

Some known problems with CTF levels:
; Bots won't get the flag : Try moving the end of your flag further into the floor.  Don't worry about the overlap with geometry. It won't cause [[Legacy:BSP Hole|BSP hole]]s.  It's also worth checking the bot-paths as displayed within the path view.  You can find the path view toggle within the [[Legacy:Viewport_Caption_Context_Menu|Viewport_Caption_Context_Menu]].  You may find that you don't have a path to the flag.

; Bots only take one path : Try using [[Legacy:AlternatePath|AlternatePath]] actors and setting a priority on them.  You can also put items on an alternate path to entice bots towards that direction. Also allow for translocation points and distance shooting for bots.

; The flag has fallen into a pit and is stuck there : Make sure that all falls and drops have a [[Legacy:PainZone|PainZone]] at the bottom - that way the flag will be returned when it drops into it.  A map that suffers from this problem is ''CTF-High''. &amp;ndash; Or, make sure that the ZoneInfo(lava pressure vaccum etc) in the area you want the flag to be returned has to have bStatic = True in the advanced properties.

; The Map won't show up in the map list when creating a server in some cases.  If you have periods in the map name (CTF-Level1.4) then eliminate them.  Underscores can also causes issues.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]
* [[Legacy:Lifts Vs Jumppads|Lifts Vs Jumppads]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''CH3Z:''' Some of the stylistic and opinionated statements should be edited out of this page.

'''SuperApe:''' Personally, I'm all for seeing wiki page text free of opinions and rants.  I say, go ahead and clean up along those lines.  If you go too far, someone will pull it back.

'''CH3Z:''' It would be like trying figure out the best side of a sphere to grab a hold of. Where would one start? I am hoping that the original author will reconsider the content of this page and strip it down closer to the neccesary facts that a person wanting to make a ctf map, according to '''their own''' art and style, and to serve the kind of gameplay that '''that mapper''' desires the map to offer, would find useful. &quot;There are two styles of flag room you can use.&quot; awww shoot really? Is that all I get... two? It was good to mention that there are the two ways, Symmetry or Asymmetry, and some insight into things that one might consider when going asymmetrical that are not issues of going symmetrical can be a very helpful point to touch on. But to point out that it is an age old dispute and that you aren't going to touch it, then turn around and show obviouse favor to one over the othre and discourage the other... well... If a person '''can''' make an asymmetrical map that addresses those issues and ends up well done then it will offer a much more realistic environment then simple mirror image. So why not just give them the facts and points to ponder and let them consider these things when producing for us all to enjoy an new ctf map that is hopefully unique and not conformant to any individuality-stiffling influence. That's just touching on a few things, if I were to edit this page to &quot;just the facts&quot; I'm afraid it would be so consice as to offend the author. I hope my comments don't serve the same appearance of malintent. Blunt and to the point, yes, but not intentionally without tact. I want people who read this page to bennefit from it and I believe I see among the content herewithin statements that are less than supportive of that goal. A consice page will serve very well actually. It is not necessary that a page have any minimum amount of data on it. It is only necessary that it serve it's purpose and serve it's intended audience.   

'''EntropicLqd:''' I ''think'' I might have been the original author of this page about a gazillion years ago.  Feel free to edit it as you see fit - just try not to make it so dry as to be upalatable.  I promise not to be offended :) - it was probably written as a re-action to the endless stream of diabolical CTF maps I was downloading and checking out at the time.  Sometimes an expressed opinion can be more useful than a bunch of dry facts as you have to consider why you would disagree.  But hey, I'm starting to ramble now (happens when you get old).

'''CH3Z:''' Mom! He just called me, &quot;OLD&quot;! I must have been some kind of mood that day; looking at this page now, it's not out of hand, and alot of the opinions seem to be popular opinion. So if no further discussion follows soon supporting changes, I'll leave it alone and take the discussion down. I might possibly make one or two slight changes, maybe none. 

'''SuperApe:''' Upon closer examination, this page doesn't seem overly ''rantish''.  The references to specific maps may not be the most helpful, but it's not a big problem IMO.  Some of the info seems subjective, like flag rooms ''should'' be dead ends, CTF maps ''need'' a choke point in the center, etc.  These should be defined as suggestions, not guidelines. (again, IMHO)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4521</id>
      <timestamp>2006-03-14T21:46:46Z</timestamp>
      <contributor>
        <ip>N8Mills</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Capture the Flag (CTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.

==From Deathmatch to Capture the Flag==

On the surface it may seem like a CTF map is simply just an elongated DM map with a couple of flags and team spawn points thrown in for good measure.  Unfortunately this is not the case.  When [[Legacy:Mapping_For_DM|Mapping_For_DM]], the [[Legacy:Map Flow|flow]] of the level has to be considered in its entirety.  There shouldn't be any choking points on the map and few (if any) dead ends.  CTF maps on the other hand thrive on natural choke points and have, by their very nature, at least two dead ends (ie. the flag rooms).  The only important map flow is between the two flag bases.

==Creating a CTF Map==

When building a CTF map there are a number of things that are vital to its success.  These are summarised below.
* The flag room and the location of the [[Legacy:FlagBase|FlagBase]] object within it.
* The location of the team spawning points.
* The route(s) from a flag room into the central area (if there is one) of your map.
* The balancing of the map and its weapons so that neither team has an advantage over the other.
* The [[Legacy:LevelInfo|LevelInfo]] -&gt; DefaultGameType set to &lt;tt&gt;xGame.xCTFGame&lt;/tt&gt;.

===The Flag Room===

There are two styles of flag room you can use.  You can either build a flag room that is relatively open and reasonably large (e.g. Orbital, and Command), or, you can go for a smaller flag room with obstacles (e.g. Coret, and Gauntlet).  Neither type of flag room is particularly advantageous to the attacking or defending team.  At this point advantage goes to whichever team is best in the flag room environment itself. 

The flag room should have some health and ammunition available to the defenders, and possibly a low powered weapon (such as the Pulse or Bio Rifles).  The more powerful weapons should be placed away from the flag, or in an awkward position.  This means that a flag's defenders must be out of position to obtain them, placing the flag at some risk. 

And finally, although it seems obvious, there should be no question in a player's mind as to which team the flag room belongs to.  It should be completely obvious.  Placing the flag on an obvious feature or making it the centerpoint of the room is also a good idea - it serves to emphasise the location of the flag.  Just ensure that the feature used for this purpose doesn't obstruct the player unexpectedly (the flag holder on Coret is a bugger for that).

===Team Spawn Points===

Spawn points need to be carefully placed.  Place them near the center of a map and the defence will have an easy ride.  Place them behind the flag, or level with the flag, and the attackers will have a far easier job escaping with the flags as the defence may not be able to catch up with the escaping flag carrier.  Generally spawn points should be placed around the flag room (but not necessarily within it) but no closer to the center of the map than about half way through a base.  It's generally better to favour the attacking team when placing spawn points though as this ensures the focus of the defence is on defending the base.

===Routes Between the Flags===

How the routes between the two flag rooms are constructed will determine how your map flows, and how it is paced.

If you want a fairly slow pace then the central area between the two flag rooms should be very open, and long.  The cover available to the flag carrier and his team mates should be extremely limited.  In this type of map there is normally only a single choke point &amp;ndash; the central area.  ''CTF-Hydro'' is a good example of this type of map.  The bridges are really the only choke point in the level.  If you control them you control the game. 

A good example of a medium paced map is ''CTF-Coret''.  The level is mainly corridor based with the central area having plenty of pillars and cover for the flag carrier.  The map also has multiple routes between the flag rooms.  The are plenty of opportunities to move between the different routes between the two flag rooms, which helps the flag carriers escape.  There are two choke points in Coret, one in each base.  Each choke point is located just after the first door to each base.  The choke point is located at the ramp that links the upper and lower routes.  At the top of this ramp you can see everyone attempting to take the top route, and hear people coming through the door trying to take the lower route.

Fast paced maps are always small.  Both open and corridor fast paced maps exist, and both work well when done right.  Maps of this form are almost exclusively based on a figure of eight, or, a straight line with occasional obstacles.  ''CTF-Gauntlet'' and ''CTF-Niven'' are good examples of this type of map.

Probably the best models to use when creating your routes between the flags are one or more figure of 8's, or a braid type structure.  ''CTF-Command'' and ''CTF-Gauntlet'' are classic figure of eight maps.  ''CTF-Coret'' is much closer to the braid model as it has multiple cross over points and loops.

The routes between each of the flag rooms should be team coloured at each end, and neutrally decorated in the center of the map.  If it's a large map consider putting obvious markers on walls that lead towards the flag rooms.  A player should never been in doubt as to which flag room they are heading towards.

===Map Balance &amp;ndash; Symmetry or Asymmetry===

The debate about map symmetry for CTF games has raged long and hard.  Rather than become embroiled in a discussion that is well outside of the scope of this page I'll side step the issue.  Some points worthy of consideration are listed below.
* Asymmetrical maps take forever to balance correctly and are harder to build well.
* It is important that both teams have equal access to weapons, health, and armour &amp;ndash; even if the map is asymmetrical.
* A map that is symmetrical in structure does not necessarily have to be symmetrical in terms of theme.

Personally, I would recommend making your maps symmetrical: that way you can be completely sure that the map is balanced. The symmetry can be:
* simple: The bases face each other. The [[Legacy:MapScale|MapScale]] tool can be used to quickly make one base a mirror image of the other.
* rotational: drag-select the entire base, duplicate, and rotate to make base number two.

Diagonal lines of symmetry (bases at right angles), or bases one above the other are also sometimes seen.  Be careful when building map bases above each other.  Although it seems that the lower team has an advantage because their flag carrier can escape more easily, this is not the case.  The lower team will be overwhelmed by players from the upper team dropping into their base - by simply falling.  The upper team's ability to field players more quickly makes covering the flag carrier much easier and more than offsets the lower teams ability to escape faster. 

If you do decide to build an asymmetrical map you absolutely must ensure that it gets extensively play tested by clans that play regularly in leagues and ladders. 

==Item Placement==

Make sure both bases have equal amounts of health, weapons, armour, and other items that can be picked up.  If the map is symmetrical then the objects should be as well.  Make sure that there is enough ammunition and health for the number of players you envisage using the map.  Also, make sure there are enough player starts.  You might think your map shouldn't be played by more than 8 people at a time, but at some point someone will play it with 16.

Make sure you have enough [[Legacy:PlayerStart|PlayerStart]]s and that you assign them for each team.  Don't make a red team member spawn in the blue base or vice versa.  See also [[Legacy:Team Number|Team Number]].
* Team 0 is Red 
* Team 1 is Blue

==Troubleshooting==

Some known problems with CTF levels:
; Bots won't get the flag : Try moving the end of your flag further into the floor.  Don't worry about the overlap with geometry. It won't cause [[Legacy:BSP Hole|BSP hole]]s.  It's also worth checking the bot-paths as displayed within the path view.  You can find the path view toggle within the [[Legacy:Viewport_Caption_Context_Menu|Viewport_Caption_Context_Menu]].  You may find that you don't have a path to the flag.

; Bots only take one path : Try using [[Legacy:AlternatePath|AlternatePath]] actors and setting a priority on them.  You can also put items on an alternate path to entice bots towards that direction. Also allow for translocation points and distance shooting for bots.

; The flag has fallen into a pit and is stuck there : Make sure that all falls and drops have a [[Legacy:PainZone|PainZone]] at the bottom - that way the flag will be returned when it drops into it.  A map that suffers from this problem is ''CTF-High''. &amp;ndash; Or, make sure that the ZoneInfo(lava pressure vaccum etc) in the area you want the flag to be returned has to have bStatic = True in the advanced properties.

; The Map won't show up in the map list when creating a server in some cases. : If you have periods in the map name (CTF-Level1.4) then eliminate them.  Underscores can also causes issues.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For VCTF|Mapping for VCTF]]
* [[Legacy:Lifts Vs Jumppads|Lifts Vs Jumppads]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''CH3Z:''' Some of the stylistic and opinionated statements should be edited out of this page.

'''SuperApe:''' Personally, I'm all for seeing wiki page text free of opinions and rants.  I say, go ahead and clean up along those lines.  If you go too far, someone will pull it back.

'''CH3Z:''' It would be like trying figure out the best side of a sphere to grab a hold of. Where would one start? I am hoping that the original author will reconsider the content of this page and strip it down closer to the neccesary facts that a person wanting to make a ctf map, according to '''their own''' art and style, and to serve the kind of gameplay that '''that mapper''' desires the map to offer, would find useful. &quot;There are two styles of flag room you can use.&quot; awww shoot really? Is that all I get... two? It was good to mention that there are the two ways, Symmetry or Asymmetry, and some insight into things that one might consider when going asymmetrical that are not issues of going symmetrical can be a very helpful point to touch on. But to point out that it is an age old dispute and that you aren't going to touch it, then turn around and show obviouse favor to one over the othre and discourage the other... well... If a person '''can''' make an asymmetrical map that addresses those issues and ends up well done then it will offer a much more realistic environment then simple mirror image. So why not just give them the facts and points to ponder and let them consider these things when producing for us all to enjoy an new ctf map that is hopefully unique and not conformant to any individuality-stiffling influence. That's just touching on a few things, if I were to edit this page to &quot;just the facts&quot; I'm afraid it would be so consice as to offend the author. I hope my comments don't serve the same appearance of malintent. Blunt and to the point, yes, but not intentionally without tact. I want people who read this page to bennefit from it and I believe I see among the content herewithin statements that are less than supportive of that goal. A consice page will serve very well actually. It is not necessary that a page have any minimum amount of data on it. It is only necessary that it serve it's purpose and serve it's intended audience.   

'''EntropicLqd:''' I ''think'' I might have been the original author of this page about a gazillion years ago.  Feel free to edit it as you see fit - just try not to make it so dry as to be upalatable.  I promise not to be offended :) - it was probably written as a re-action to the endless stream of diabolical CTF maps I was downloading and checking out at the time.  Sometimes an expressed opinion can be more useful than a bunch of dry facts as you have to consider why you would disagree.  But hey, I'm starting to ramble now (happens when you get old).

'''CH3Z:''' Mom! He just called me, &quot;OLD&quot;! I must have been some kind of mood that day; looking at this page now, it's not out of hand, and alot of the opinions seem to be popular opinion. So if no further discussion follows soon supporting changes, I'll leave it alone and take the discussion down. I might possibly make one or two slight changes, maybe none. 

'''SuperApe:''' Upon closer examination, this page doesn't seem overly ''rantish''.  The references to specific maps may not be the most helpful, but it's not a big problem IMO.  Some of the info seems subjective, like flag rooms ''should'' be dead ends, CTF maps ''need'' a choke point in the center, etc.  These should be defined as suggestions, not guidelines. (again, IMHO)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For DDOM</title>
    <id>2139</id>
    <revision>
      <id>5208</id>
      <timestamp>2005-12-17T21:28:37Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Double Domination (DDOM)''' is a [[Legacy:Gametype|gametype]] introduced in [[Legacy:UT2003|UT2003]].  Two [[Legacy:GameObjective|GameObjective]] control points, [[Legacy:XDomPoint|xDomPoint]], are placed in the map: DomPoint A and DomPoint B.  Each round a team has to touch and hold both DomPoints for 10 seconds to score a point.  After a short break, the DomPoints are reset for the next round.

Domination maps in [[Legacy:UT|UT]] were generally built more like Deathmatch maps than any other gametype.  There were a varied number of DomPoints, like 2-4, placed at spots around the map that lended themselves to some kind of defense.

Double Domination's mapping has changed significantly.  Its maps are closer to CTF in that there are only two DomPoints.  Although the DomPoints are not explicitly Team controlled, they are ''generally'' symmetrical, with a control point at each end of the map in a base of some sort.  Instead of [[Legacy:PlayerStart|PlayerStart]]s being placed at either end of the map, one base per team, they are normally placed in the center area of the map, equally distant from the DomPoints.

==Map Construction==
* Set LevelProperties -&gt; LevelInfo -&gt; DefaultGametype to &lt;tt&gt;xGame.xDoubleDom&lt;/tt&gt;.

* To add a DomPoint, [[Legacy:Add An Actor|add an actor]] &gt;&gt; NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; DominationPoint &gt;&gt; xDomPoint &gt;&gt; xDomPointA/B.  One xDomPointA and one xDomPointB should be placed in the map.

* [[Legacy:AssaultPath|AssaultPath]]s can be added, leading towards the DomPoints, for better [[Legacy:Bot Support|Bot Support]].

==Mapping Guidelines==
* PlayerStarts should be of an equal distance to DomPoints, especially if they have specific Team Indexes (see [[Legacy:Team Number|Team Number]]).  One team should not spawn closer to a DomPoint than the other.

* DomPoints should normally be a good distance from each other, usually opposite ends of the map.

* Entrances to DomPoint areas should not be choke points.  There should usually be more than one way in or out.

* Some obvious cover or other defensive qualities of the DomPoints should be present.

==Layout Styles==

Aside from the standard layout guidlines above, Double Domination offers variety in what a layout gameplay can be like.

; Regular CTF style : Blue Team and Red Team both have a base with a DomPoint in each.  In this type of map, you would have to hold off the enemy at their own base for ten seconds to score a point.

; King Of The Hill style : Both DomPoints are next to each other at the centre of the map.  Effectively, if you have one DomPoint, you have both.  Teams just have to defend it for the time needed to score.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For DOM|Mapping for DOM]] &amp;ndash; UT Only
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gameplay|Gameplay]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5209</id>
      <timestamp>2005-11-01T18:28:35Z</timestamp>
      <contributor>
        <ip>Pool1489.cvx8-bradley.dialup.earthlink.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Double Domination''' (DDOM or DD) is a [[Legacy:Gametype|gametype]] introduced in [[Legacy:UT2003|UT2003]]. Two control points are placed in the map.  A team has to control both points for 10 seconds to score a point.

Domination maps in [[Legacy:UT|UT]] were generally built more like Deathmatch maps than any other gametype.  Control points could be of a varied number, and were generally just scattered around the map.

Double Domination's mapping has changed significantly.  The gametype its maps are closest to now is probably CTF &amp;ndash; they are ''generally'' symmetrical, with a control point at each end of the map in a base of some sort.  However, instead of playerstarts being placed at either end of the map, one base per team, they are placed in the centre area of the map, and not usually seperated by team.  Examples:  '''DOM-ScorchedEarth''', '''DOM-Suntemple'''.

==General Map Rules==

Player Starts should be of an equal distance to control points - especially if they have specific Team Indexes.  One team should not spawn closer to control points than the other.

Control points should be of a good distance from each other, usually opposite ends of the map.

Entrances to control point areas should not be choke points - there should usually be more than one way in.

==Mapping==

To add a control point, [[Legacy:Add An Actor|add an actor]] &gt;&gt; NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; DominationPoint &gt;&gt; xDomPoint &gt;&gt; xDomPointA/B

One xDomPointA and one xDomPointB should be placed in the map.

==Alternative Maps==

Double Domination offers a lot of variety in what maps can be like.  Possible examples:

Blue Team and Red Team both have a base with a control point in each (regular CTF style map).  In this type of map, you would have to hold off the enemy at their own base for ten seconds to score a point.

King Of The Hill style gameplay - Both control points are next to each other at the centre of the map.  Effectively - if you have one control point, you have both - you just have to defend it for the time needed to score.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For DOM|Mapping for DOM]] &amp;ndash; UT Only
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For DM</title>
    <id>1838</id>
    <revision>
      <id>4513</id>
      <timestamp>2007-09-27T23:51:18Z</timestamp>
      <contributor>
        <ip>J94182.upc-j.chello.nl</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Mapping for DeathMatch couldn't be easier. They can be a lot of fun to make.  They allow you a lot of freedom because essentially there are no &quot;rules.&quot; There is really nothing special that has to be put in a DeathMatch map. Your first endeavor as a mapper is almost always a DM map, and when you make a new map in UnrealEd it defaults to being DM (when you click the joystick button to [[Legacy:Playtest|Playtest]] the map). 

However, there are some ingredients that you need to have a succesful DM map.

==Map Flow==

[[Legacy:Map Flow|Map Flow]] above all else.  You have to be able to get from one place to another very easily.  And what's more you've got to have several options.  UnrealTournament's ''DM-Tempest'' has brilliant flow as does ''DM-Malevolence.''  They are almost open ended but not at all confusing to navigate.  The reason is that no two places look the same so you can tell where you are.  This is why a symmetrical map is bad in DM in my opinion. Another thing with flow you might want to consider is the fact that you might want doors and other movers in the way with switches to open them for all the nice detail but it really can ruin the flow if you want to get to the next room in a small amount of time and get fragged because you were finding the switch. But all the flow really depends on the type of deathmatch map you want to create; you can make the map that is more realistic and actually takes an environment and makes it a killing field, or you can make the arena style like DM-Fractal where you must focus your flow on keeping the possiblity of fragging from every angle all while maintaining a fast paced match. 

Flow should dictate architecture. Build you details around the path you have created.

See also [[Legacy:Map Flow|Map Flow]].

===Z-Axis===

This is the second element.  The [[Legacy:Z-Axis|Z-axis]] is essentially part of your flow.  You need to be able to go up/down easily, and hey, you can always make shortcuts the player can hammer jump (Rocket Jump in 2003/2004) to if they want. Also, aiming up and down to fire fight is always fun.

An example would be ''DM-Phobos''.  You can hammer jump to the armor from the hallway below, or you can also hammer jump up to the ledge from the area with pads/flak if the boots are gone.  It's all part of flow and adds an element of surprise to the game.  You just don't know where your opponent will pop up from.  Also consider lift jumps.  

''DM-Deck16]['' is a good example of a useful lift jump for catching a player off guard. Deck16][ is also a great example of z-axis use. The multiple levels can make a level feel very large and complex when they are fairly small and simple.

See also [[Legacy:Z-Axis|Z-Axis]].

===Player Starts===

Every DM map should have at least as many [[Legacy:PlayerStart|PlayerStart]]s as the top of the recommended player load (and more is always good).

Generally, about 1.5x the amount of playerstarts should be present depending on the max players for the map. If you plan on allowing 5 max players, then place down at least 7-8 players start. It's good to follow these rules for two reasons:
*When multiple players are fragged, it makes sure that there are enough playerstarts for the returning players. If there are not enough, it will result in frustrating telefragging in UT, or being temporarily unable to respawn in UT2004.
*It allows some variety in spawning.

See also [[Legacy:Placing PlayerStart|Placing PlayerStart]].

===Item Placement===

Don't place too many desirable items or weapons next to each other.  This will become a camper's haven.  For example, the shock/belt room in ''DM-Peak''. You can dominate the game by just standing in the corner and making combos. A good way to make a hot spot is to designate an area with useful items and weapons close to each other so that a player who wants to control that area still has to move around. A good idea is to make the respawn time for shieldbelts and armor about 50 seconds to a minute. Another use that items/weapons serve is sound cues to alert players of another's position.  Example on ''DM-Turbine'' &amp;ndash; the elevator that leads to the rocket launcher is preceded by several health vials.  A good player would hear the sound of the vials being taken and an elevator being used thus predicting where his opponent might be.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]].

==Architectural Details and Ambience==

The Level Designer can think of the DeathMatch Map as a scene from a Hollywood Blockbuster. Numerous architectural design features can be added to the basic level geometry to enhance the visual impact of gameplay and make it more exciting. This can be a challenge for designers; to come up with inspirational themes and ambiance, while maintaining fast and furious flow dynamics, lethally insane fun, and ultra-realistic real-time 3D rendering. Architecture can be be used for eye candy, but it is best when used to create a more realistic-looking map. Paying attention to details such as load bearing supports (pillars), trims, windows, fog, climbing vines, etc can keep a deathmatcher more immersed in his environment. You may also want to create exploding glass and or walls to make some intresting secrets in your levels like a plain wall and a place where it can be blown up going to an area with the redemer in it. Or glass tiles in the floor that look into the floor below that can be shot out.

See also [[Legacy:Map Design|Map Design]].

==&quot;Gifts and Gimmicks&quot;==

''If you aren't a Boy Scout, you wouldn't get that reference.  The magazine, ''Boys Life'' has a section's title called '''Gifts and Gimmicks'''.''

These are always an element that can be thrown in to add to a DM map. Like traps for instance, they are fun to make and can provide some fun visuals to watch but dont go to overborn with it and create a map that depends on the player to get a score of 0 to win over the others with negatives. The trap in ''DM-Pressure'' is always fun.  However a map should never be just about a gimmick.  A gimmick should add to the map but not be the main part of it.

See also [[Legacy:Gameplay|Gameplay]].

==Other Gametypes==

There are several other [[Legacy:Gametype|Gametype]]s that use Deathmatch maps.

===Standard Gametypes===
* [[Legacy:TeamDeathmatch|TeamDeathmatch]]
* [[Legacy:LastManStanding|LastManStanding]] (UT2004 only)
* [[Legacy:Invasion|Invasion]] (UT2004 only)
* [[Legacy:Mutant|Mutant]] (UT2004 only)

===Custom Gametypes===

==Tutorials==
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[:Category:Legacy Basic Procedure]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For 1on1|Mapping for 1on1]]
* [[Legacy:Team Number|Team Number]] &amp;ndash; For Team Deathmatch, this page refers to a useful custom actor, TeamSpawn.

==Discussion==

'''TechnoJF:'''  I like the way that this article looks.  However, I think that it could also use a few blurbs on how to make a map more condusive to gameplay for TeamDM and Last Man Standing.  I'd write these details myself, but I'm not too knowledgable on this topic.

'''&lt;MOZI&gt;:''' Hey this is nice i can add stuff to a tutorial. Okay reason im adding this comment is to help n00bies ( if u dont speak that jargon i wrote newbies), becuase i was once a (hate to say it but..) BAD mapper, no talent what so ever. However i never gave up( everyone says that) But the key to my evergroing unreal skills was practice. Anywas about DM gameplay there are two ways to hit this one is just build rooms and hallways which is good place to start but dont stick with it. When u make ur room add two or three doors or cuts in the wall to access other places and take u different directions. Once u keep doing that and adding great theme and eyecandy and realism the map begins to create the flow on its own ull see waht i mean when it happenz. For even more flow and fast game play add curve hallways ( ZETO IS GREAT IN THIS ) the Z axis ( DECK, CODEX, TURBINE, PHOBOS, FLOATING PYRAMID) those are great maps to study with in the editor. Also im going to quote DavidM on this &quot; DOnt be afraid to rip of style&quot;. In my own words means examine a style try to copy it ( NOT COPY PASTE !) to make ur own style and flow well ive rambled enough enjoy UNREAL ! 

'''Bean:''' Added some of my insight.

'''Luggage:''' I think &quot;flow&quot; should rather be replaced by &quot;gameplay&quot;, and have flow as a sub-point... [[Legacy:Gameplay|Gameplay]] isn't all about flow, you know... I learned that already, I think ;)

It's rather floorplan, scaling and items... flow is a result of those. Right, Mr. M.?

'''SuperApe:''' [[Legacy:Map Flow|Map Flow]] handles flow, [[Legacy:Gameplay|Gameplay]] talks about gameplay.  As sub-topics to Map Flow, [[Legacy:Placing PlayerStart|Placing PlayerStart]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]] are available.  [[Legacy:Map Design|Map Design]] talks about general concepts and elements, serving as a sub-hub.  This page obviously has been around a while, I just updated the current linkage and re-arranged the sections to match the current [[Legacy:Topics On Mapping|Topics On Mapping]] organization. 

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4514</id>
      <timestamp>2005-12-13T15:37:15Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>added info on how to playtest</comment>
      <text xml:space="preserve">Mapping for DeathMatch couldn't be easier. They can be a lot of fun to make.  They allow you a lot of freedom because essentially there are no &quot;rules.&quot; There is really nothing special that has to be put in a DeathMatch map. Your first endeavor as a mapper is almost always a DM map, and when you make a new map in UnrealEd it defaults to being DM (when you click the joystick to [[Legacy:Playtest|playtest]] the map). 

Note: I think its something to do with d3d cards or something, but the joystick button never works for playtesting a map. You have to do Build-&gt;Play

However, there are some ingredients that you need to have a succesful DM map.

===Player starts ===

Every DM map should have at least as many [[Legacy:PlayerStart|PlayerStart]]s as the top of the recommended player load (and more is always good).

Generally, about 1.5x the amount of playerstarts should be present depending on the max players for the map. If you plan on allowing 5 max players, then place down at least 7-8 players start. It's good to follow these rules for two reasons:
*When multiple players are fragged, it makes sure that there are enough playerstarts for the returning players. If there are not enough, it will result in frustrating telefragging.
*It allows some variety in spawning.

===Flow ===

Flow above all else.  You have to be able to get from one place to another very easily.  And what's more you've got to have several options.  UnrealTournament's ''DM-Tempest'' has brilliant flow as does ''DM-Malevolence.''  They are almost open ended but not at all confusing to navigate.  The reason is that no two places look the same so you can tell where you are.  This is why a symmetrical map is bad in DM in my opinion. Another thing with flow you might want to consider is the fact that you might want doors and other movers in the way with switches to open them for all the nice detail but it really can ruin the flow if you want to get to the next room in a small amount of time and get fragged because you were finding the switch. But all the flow really depends on the type of deathmatch map you want to create; you can make the map that is more realistic and actually takes an environment and makes it a killing field, or you can make the arena style like DM-Fractal where you must focus you flow on keeping the possiblity of fragging from every angle all while maintaining a fast paced match. 

Flow should dictate architecture. Build you details around the path you have created.

: More: [[Legacy:Map Flow|Map Flow]]

===z-axis ===

This is the second element.  The [[Legacy:Z-Axis|Z-axis]] is essentially part of your flow.  You need to be able to go up/down easily, and hey, you can always make shortcuts the player can hammer jump (Rocket Jump in 2003/2004) to if they want. Also, aiming up and down to fire fight is always fun.

An example would be ''DM-Phobos''.  You can hammer jump to the armor from the hallway below, or you can also hammer jump up to the ledge from the area with pads/flak if the boots are gone.  It's all part of flow and adds an element of surprise to the game.  You just don't know where your opponent will pop up from.  Also consider lift jumps.  

''DM-Deck16]['' is a good example of a useful lift jump for catching a player off guard. Deck16][ is also a great example of z-axis use. The multiple levels can make a level feel very large and complex when they are fairly small and simple.

: More: [[Legacy:Z-Axis|Z-axis]]

===Item placement ===

Don't place too many desirable items or weapons next to each other.  This will become a camper's haven.  For example, the shock/belt room in ''DM-Peak''. You can dominate the game by just standing in the corner and making combos. A good way to make a hot spot is to designate an area with useful items and weapons close to each other so that a player who wants to control that area still has to move around. A good idea is to make the respawn time for shieldbelts and armor about 50 seconds to a minute. Another use that items/weapons serve is sound cues to alert players of another's position.  Example on ''DM-Turbine'' &amp;ndash; the elevator that leads to the rocket launcher is preceded by several health vials.  A good player would hear the sound of the vials being taken and an elevator being used thus predicting where his opponent might be.

===Architectural Details and Ambience ===

The Level Designer can think of the DeathMatch Map as a scene from a Hollywood Blockbuster. Numerous architectural design features can be added to the basic level geometry to enhance the visual impact of gameplay and make it more exciting. This can be a challenge for designers; to come up with inspirational themes and ambiance, while maintaining fast and furious flow dynamics, lethally insane fun, and ultra-realistic real-time 3D rendering. Architecture can be be used for eye candy, but it is best when used to create a more realistic-looking map. Paying attention to details such as load bearing supports (pillars), trims, windows, fog, climbing vines, etc can keep a deathmatcher more immersed in his environment. You may also want to create exploding glass and or walls to make some intresting secrets in your levels like a plain wall and a place where it can be blown up going to an area with the redemer in it. Or glass tiles in the floor that look into the floor below that can be shot out.

===&quot;Gifts and Gimmicks&quot; (if you aren't a Boy Scout, you wouldn't get that (the magazine, ''Boys Life'' has a section's title called Gifts and Gimmicks)) ===

These are always an element that can be thrown in to add to a DM map. Like traps for instance, they are fun to make and can provide some fun visuals to watch but dont go to overborn with it and create a map that depends on the player to get a score of 0 to win over the others with negatives. The trap in ''DM-Pressure'' is always fun.  However a map should never be just about a gimmick.  A gimmick should add to the map but not be the main part of it.

==Related Topics==
* [[Legacy:Mapping For 1on1|Mapping for 1on1]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''TechnoJF:'''  I like the way that this article looks.  However, I think that it could also use a few blurbs on how to make a map more condusive to gameplay for TeamDM and Last Man Standing.  I'd write these details myself, but I'm not too knowledgable on this topic.

'''&lt;MOZI&gt;:''' Hey this is nice i can add stuff to a tutorial. Okay reason im adding this comment is to help n00bies ( if u dont speak that jargon i wrote newbies), becuase i was once a (hate to say it but..) BAD mapper, no talent what so ever. However i never gave up( everyone says that) But the key to my evergroing unreal skills was practice. Anywas about DM gameplay there are two ways to hit this one is just build rooms and hallways which is good place to start but dont stick with it. When u make ur room add two or three doors or cuts in the wall to access other places and take u different directions. Once u keep doing that and adding great theme and eyecandy and realism the map begins to create the flow on its own ull see waht i mean when it happenz. For even more flow and fast game play add curve hallways ( ZETO IS GREAT IN THIS) the Z axis ( DECK, CODEX, TURBINE, PHOBOS, FLOATING PYRAMID) those are great maps to study with in the editor. Also im going to quote DavidM on this &quot; DOnt be afraid to rip of style&quot;. In my own words means examine a style try to copy it ( NOT COPY PASTE !) to make ur own style and flow well ive rambled enough enjoy UNREAL ! 

'''Bean:''' Added some of my insight.

'''Luggage:''' I think &quot;flow&quot; should rather be replaced by &quot;gameplay&quot;, and have flow as a sub-point... [[Legacy:Gameplay|Gameplay]] isn't all about flow, you know... I learned that already, I think ;)

It's rather floorplan, scaling and items... flow is a result of those. Right, Mr. M.?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4515</id>
      <timestamp>2005-12-17T00:32:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Mapping for DeathMatch couldn't be easier. They can be a lot of fun to make.  They allow you a lot of freedom because essentially there are no &quot;rules.&quot; There is really nothing special that has to be put in a DeathMatch map. Your first endeavor as a mapper is almost always a DM map, and when you make a new map in UnrealEd it defaults to being DM (when you click the joystick button to [[Legacy:Playtest|Playtest]] the map). 

However, there are some ingredients that you need to have a succesful DM map.

==Map Flow==

[[Legacy:Map Flow|Map Flow]] above all else.  You have to be able to get from one place to another very easily.  And what's more you've got to have several options.  UnrealTournament's ''DM-Tempest'' has brilliant flow as does ''DM-Malevolence.''  They are almost open ended but not at all confusing to navigate.  The reason is that no two places look the same so you can tell where you are.  This is why a symmetrical map is bad in DM in my opinion. Another thing with flow you might want to consider is the fact that you might want doors and other movers in the way with switches to open them for all the nice detail but it really can ruin the flow if you want to get to the next room in a small amount of time and get fragged because you were finding the switch. But all the flow really depends on the type of deathmatch map you want to create; you can make the map that is more realistic and actually takes an environment and makes it a killing field, or you can make the arena style like DM-Fractal where you must focus you flow on keeping the possiblity of fragging from every angle all while maintaining a fast paced match. 

Flow should dictate architecture. Build you details around the path you have created.

See also [[Legacy:Map Flow|Map Flow]].

===Z-Axis===

This is the second element.  The [[Legacy:Z-Axis|Z-axis]] is essentially part of your flow.  You need to be able to go up/down easily, and hey, you can always make shortcuts the player can hammer jump (Rocket Jump in 2003/2004) to if they want. Also, aiming up and down to fire fight is always fun.

An example would be ''DM-Phobos''.  You can hammer jump to the armor from the hallway below, or you can also hammer jump up to the ledge from the area with pads/flak if the boots are gone.  It's all part of flow and adds an element of surprise to the game.  You just don't know where your opponent will pop up from.  Also consider lift jumps.  

''DM-Deck16]['' is a good example of a useful lift jump for catching a player off guard. Deck16][ is also a great example of z-axis use. The multiple levels can make a level feel very large and complex when they are fairly small and simple.

See also [[Legacy:Z-Axis|Z-Axis]].

===Player Starts===

Every DM map should have at least as many [[Legacy:PlayerStart|PlayerStart]]s as the top of the recommended player load (and more is always good).

Generally, about 1.5x the amount of playerstarts should be present depending on the max players for the map. If you plan on allowing 5 max players, then place down at least 7-8 players start. It's good to follow these rules for two reasons:
*When multiple players are fragged, it makes sure that there are enough playerstarts for the returning players. If there are not enough, it will result in frustrating telefragging in UT, or being temporarily unable to respawn in UT2004.
*It allows some variety in spawning.

See also [[Legacy:Placing PlayerStart|Placing PlayerStart]].

===Item Placement===

Don't place too many desirable items or weapons next to each other.  This will become a camper's haven.  For example, the shock/belt room in ''DM-Peak''. You can dominate the game by just standing in the corner and making combos. A good way to make a hot spot is to designate an area with useful items and weapons close to each other so that a player who wants to control that area still has to move around. A good idea is to make the respawn time for shieldbelts and armor about 50 seconds to a minute. Another use that items/weapons serve is sound cues to alert players of another's position.  Example on ''DM-Turbine'' &amp;ndash; the elevator that leads to the rocket launcher is preceded by several health vials.  A good player would hear the sound of the vials being taken and an elevator being used thus predicting where his opponent might be.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]].

==Architectural Details and Ambience==

The Level Designer can think of the DeathMatch Map as a scene from a Hollywood Blockbuster. Numerous architectural design features can be added to the basic level geometry to enhance the visual impact of gameplay and make it more exciting. This can be a challenge for designers; to come up with inspirational themes and ambiance, while maintaining fast and furious flow dynamics, lethally insane fun, and ultra-realistic real-time 3D rendering. Architecture can be be used for eye candy, but it is best when used to create a more realistic-looking map. Paying attention to details such as load bearing supports (pillars), trims, windows, fog, climbing vines, etc can keep a deathmatcher more immersed in his environment. You may also want to create exploding glass and or walls to make some intresting secrets in your levels like a plain wall and a place where it can be blown up going to an area with the redemer in it. Or glass tiles in the floor that look into the floor below that can be shot out.

See also [[Legacy:Map Design|Map Design]].

==&quot;Gifts and Gimmicks&quot;==

''If you aren't a Boy Scout, you wouldn't get that reference.  The magazine, ''Boys Life'' has a section's title called '''Gifts and Gimmicks'''.''

These are always an element that can be thrown in to add to a DM map. Like traps for instance, they are fun to make and can provide some fun visuals to watch but dont go to overborn with it and create a map that depends on the player to get a score of 0 to win over the others with negatives. The trap in ''DM-Pressure'' is always fun.  However a map should never be just about a gimmick.  A gimmick should add to the map but not be the main part of it.

See also [[Legacy:Gameplay|Gameplay]].

==Other Gametypes==

There are several other [[Legacy:Gametype|Gametype]]s that use Deathmatch maps.

===Standard Gametypes===
* [[Legacy:TeamDeathmatch|TeamDeathmatch]]
* [[Legacy:LastManStanding|LastManStanding]] (UT2004 only)
* [[Legacy:Invasion|Invasion]] (UT2004 only)
* [[Legacy:Mutant|Mutant]] (UT2004 only)

===Custom Gametypes===

==Tutorials==
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[:Category:Legacy Basic Procedure]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]
** [[Legacy:Mapping For 1on1|Mapping for 1on1]]
* [[Legacy:Team Number|Team Number]] &amp;ndash; For Team Deathmatch, this page refers to a useful custom actor, TeamSpawn.

==Discussion==

'''TechnoJF:'''  I like the way that this article looks.  However, I think that it could also use a few blurbs on how to make a map more condusive to gameplay for TeamDM and Last Man Standing.  I'd write these details myself, but I'm not too knowledgable on this topic.

'''&lt;MOZI&gt;:''' Hey this is nice i can add stuff to a tutorial. Okay reason im adding this comment is to help n00bies ( if u dont speak that jargon i wrote newbies), becuase i was once a (hate to say it but..) BAD mapper, no talent what so ever. However i never gave up( everyone says that) But the key to my evergroing unreal skills was practice. Anywas about DM gameplay there are two ways to hit this one is just build rooms and hallways which is good place to start but dont stick with it. When u make ur room add two or three doors or cuts in the wall to access other places and take u different directions. Once u keep doing that and adding great theme and eyecandy and realism the map begins to create the flow on its own ull see waht i mean when it happenz. For even more flow and fast game play add curve hallways ( ZETO IS GREAT IN THIS ) the Z axis ( DECK, CODEX, TURBINE, PHOBOS, FLOATING PYRAMID) those are great maps to study with in the editor. Also im going to quote DavidM on this &quot; DOnt be afraid to rip of style&quot;. In my own words means examine a style try to copy it ( NOT COPY PASTE !) to make ur own style and flow well ive rambled enough enjoy UNREAL ! 

'''Bean:''' Added some of my insight.

'''Luggage:''' I think &quot;flow&quot; should rather be replaced by &quot;gameplay&quot;, and have flow as a sub-point... [[Legacy:Gameplay|Gameplay]] isn't all about flow, you know... I learned that already, I think ;)

It's rather floorplan, scaling and items... flow is a result of those. Right, Mr. M.?

'''SuperApe:''' [[Legacy:Map Flow|Map Flow]] handles flow, [[Legacy:Gameplay|Gameplay]] talks about gameplay.  As sub-topics to Map Flow, [[Legacy:Placing PlayerStart|Placing PlayerStart]] and [[Legacy:Inventory Item Placement|Inventory Item Placement]] are available.  [[Legacy:Map Design|Map Design]] talks about general concepts and elements, serving as a sub-hub.  This page obviously has been around a while, I just updated the current linkage and re-arranged the sections to match the current [[Legacy:Topics On Mapping|Topics On Mapping]] organization. 

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For DOM</title>
    <id>1839</id>
    <revision>
      <id>4516</id>
      <timestamp>2005-11-18T20:32:59Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:Domination|Domination]] (DOM): Standard Unreal Tournament game type. Control points are scattered in a map; in the stock maps, there are 3 control points - but you can have more or less, depending on the type of map you are making.  A team gains control over a control point by one of its team members touching it.  Each team scores continuously according to the number of control points held. The first team to hit the score limit wins.

Just like mapping for any other MOD make sure you play enough DOM to know a good map from a bad one before you decide to make a DOM map. 

===Control points ===

The key element of a DOM map is of course the [[Legacy:ControlPoint|ControlPoint]]s. A control point comes in three basic flavors:  

* Points that are super easy to defend such as the lift point at &quot;DOM-Gearbolt&quot;.
* Points that are very hard to defend such as anything on &quot;DOM-MetalDreams&quot;.
* Control points that are just plain oddball like the Hall of Pillars in &quot;DOM-Sesmar&quot;.

A good level will have a mix of atleast two types.  Personally I don't like &quot;Sesmar&quot;'s &quot;Hall of Pillars&quot; type control point because you can't do anything with it.  Clan play on this point involves one player from each team constantly translocating to capture it and scoring Telefrags on each other.  Waste of time imo.

A lot of the rules from a good [[Legacy:Mapping For DM|Deathmatch]] map apply to DOM maps.  &quot;Flow&quot; is a very important thing.  You should be able to get by from point to point on foot very easily utilising levels, shortcuts etc.  However keep in mind that the TL is also enabled in DOM so design a map accordingly.  

Control points should be in varied locations, and also, the locations they are should usually stand out as special.  For example,  in &quot;DOM-Leadworks&quot;, every control point is in a very different type of location, but they can also be easily spotted as they are in places that stand out - a bridge, a room with lava to fall in, etc.

'''To add control points to a map:'''

Open the [[Legacy:Actor Class Browser|Actor Class Browser]] and select:

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:ControlPoint|ControlPoint]]}}

Right click in level and add.  Position it as you would any actor, then go into the properties of it.

Open the submenu named ControlPoint and go down to PointName.  Type in what you want the name of that point to be in game e.g. Top Platform. This will be the label used at the side of the HUD for the specific control point.

At the greenevent and blueevent, it means if you want an event to happen when a that colour team gets the control point.

===PlayerStarts ===

Try to place the [[Legacy:PlayerStart|PlayerStart]]s in such a way that the distances to the three control points are more or less equal; this comes in handy when playing clan wars and people are usually assigned one of the points.  Also try to place the spawnpoints away from the action; not only away from the control points, but also away from the main routes that lead from control point to control point.  This decreases spawncamping dramatically.  Don't forget to place a strong weapon next to the spawnpoints, so the player at least stands a chance when he/she attacks the control points.  For a great example of good spawnpoint placing, check out DOM-Gearbolt. The main spawnchamber is on a low level, which isn't on a main route to travel from control point to control point.  It is in the center of the map, so all control points can be quickly reached.  The shock rifle and sniper rifle are in that same room, so players can grab a weapon and join the action very quickly.

As for all maptypes, [[Legacy:Z-Axis|z-axis]] is very important in Domination maps. A good map should at least have two, but preferably three, different height levels.  For an example of good z-axis usage, check out DOM-Olden.  The map has a good, open structure with wooden beams at a lot of different levels.  It encourages the player to use his/her translocator more and it improves gameplay a lot, because attacks can come from anywhere.

==Related Topics==
* [[Legacy:Mapping For DDOM|Mapping for DDOM]] (UT200x)
* Mapping for other [[Legacy:Gametype|Gametype]]s
* [[Legacy:Topics On Mapping|Topics on Mapping]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4517</id>
      <timestamp>2003-05-22T12:32:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Domination (DOM): Standard Unreal Tournament game type. Three or four control points are scattered in a map; a team gains control over a control point by one of its team members touching it. Each team scores continuously according to the number of control points held. The first team to hit the score limit wins.

Just like mapping for anyother MOD make sure you play enough DOM to know a good map from a bad one before you decide to make a DOM map. 

===Control points ===

The key element of a DOM map is of course the [[Legacy:ControlPoint|ControlPoint]]s. A control point comes in three basic flavors:  

* Points that are super easy to defend such as the lift point at &quot;DOM-Gearbolt&quot;.
* Points that are very hard to defend such as anything on &quot;DOM-MetalDreams&quot;.
* Control points that are just plain oddball like the Hall of Pillars in &quot;DOM-Sesmar&quot;.

A good level will have a mix of atleast two types.  Personally I don't like &quot;Sesmar&quot;'s &quot;Hall of Pillars&quot; type control point because you can't do anything with it.  Clan play on this point involves one player from each team constantly translocating to capture it and scoring Telefrags on each other.  Waste of time imo.

A lot of the rules from a good [[Legacy:Mapping For DM|Deathmatch]] map apply to DOM maps.  &quot;Flow&quot; is a very important thing.  You should be able to get by from point to point on foot very easily utilising levels, shortcuts etc.  However keep in mind that the TL is also enabled in DOM so design a map accordingly.

===PlayerStarts ===

Ttry to place the [[Legacy:PlayerStart|PlayerStart]]s in such a way that the distances to the three control points are more or less equal; this comes in handy when playing clan wars and people are usually assigned one of the points.  Also try to place the spawnpoints away from the action; not only away from the control points, but also away from the main routes that lead from control point to control point.  This decreases spawncamping dramatically.  Don't forget to place a strong weapon next to the spawnpoints, so the player at least stands a chance when he/she attacks the control points.  For a great example of good spawnpoint placing, check out DOM-Gearbolt. The main spawnchamber is on a low level, which isn't on a main route to travel from control point to control point.  It is in the center of the map, so all control points can be quickly reached.  The shock rifle and sniper rifle are in that same room, so players can grab a weapon and join the action very quickly.

As for all maptypes, [[Legacy:Z-Axis|z-axis]] is very important in Domination maps. A good map should at least have two, but preferably three, different height levels.  For an example of good z-axis usage, check out DOM-Olden.  The map has a good, open structure with wooden beams at a lot of different levels.  It encourages the player to use his/her translocator more and it improves gameplay a lot, because attacks can come from anywhere.

==Related Topics ==
* other [[Legacy:Gametype|Gametype]]

----

spare stuff, please merge:

First of all you need a good map with varied places to put control points e.g. dont just put them next to eachother.

Goto the browser thing (pawn icon) and open the navigation poit submenu.

And select controlpoint.

Go back to your level and right click on the screen and click add control point.

Position it perfectly and then double click on it for its porperties to come up.

Open the submenu named ControlPoint and go down to PointName and Type in what you want the name of that point to be in game e.g. Top Platform. So when someone gets it it goes Red or wateva has the Top Platfrom Base or wateva it is. Where the greenevent and blueevent.... it means if u want an event to happen when a that colour team gets that point.

By Jam</text>
    </revision>
    <revision>
      <id>4518</id>
      <timestamp>2004-06-22T08:06:09Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>fixed typo</comment>
      <text xml:space="preserve">[[Legacy:Domination|Domination]] (DOM): Standard Unreal Tournament game type. Control points are scattered in a map; in the stock maps, there are 3 control points - but you can have more or less, depending on the type of map you are making.  A team gains control over a control point by one of its team members touching it.  Each team scores continuously according to the number of control points held. The first team to hit the score limit wins.

Just like mapping for any other MOD make sure you play enough DOM to know a good map from a bad one before you decide to make a DOM map. 

===Control points ===

The key element of a DOM map is of course the [[Legacy:ControlPoint|ControlPoint]]s. A control point comes in three basic flavors:  

* Points that are super easy to defend such as the lift point at &quot;DOM-Gearbolt&quot;.
* Points that are very hard to defend such as anything on &quot;DOM-MetalDreams&quot;.
* Control points that are just plain oddball like the Hall of Pillars in &quot;DOM-Sesmar&quot;.

A good level will have a mix of atleast two types.  Personally I don't like &quot;Sesmar&quot;'s &quot;Hall of Pillars&quot; type control point because you can't do anything with it.  Clan play on this point involves one player from each team constantly translocating to capture it and scoring Telefrags on each other.  Waste of time imo.

A lot of the rules from a good [[Legacy:Mapping For DM|Deathmatch]] map apply to DOM maps.  &quot;Flow&quot; is a very important thing.  You should be able to get by from point to point on foot very easily utilising levels, shortcuts etc.  However keep in mind that the TL is also enabled in DOM so design a map accordingly.  

Control points should be in varied locations, and also, the locations they are should usually stand out as special.  For example,  in &quot;DOM-Leadworks&quot;, every control point is in a very different type of location, but they can also be easily spotted as they are in places that stand out - a bridge, a room with lava to fall in, etc.

'''To add control points to a map:'''

Open the [[Legacy:Actor Class Browser|Actor Class Browser]] and select:

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] &gt;&gt; [[Legacy:ControlPoint|ControlPoint]]}}

Right click in level and add.  Position it as you would any actor, then go into the properties of it.

Open the submenu named ControlPoint and go down to PointName.  Type in what you want the name of that point to be in game e.g. Top Platform. This will be the label used at the side of the HUD for the specific control point.

At the greenevent and blueevent, it means if you want an event to happen when a that colour team gets the control point.

===PlayerStarts ===

Try to place the [[Legacy:PlayerStart|PlayerStart]]s in such a way that the distances to the three control points are more or less equal; this comes in handy when playing clan wars and people are usually assigned one of the points.  Also try to place the spawnpoints away from the action; not only away from the control points, but also away from the main routes that lead from control point to control point.  This decreases spawncamping dramatically.  Don't forget to place a strong weapon next to the spawnpoints, so the player at least stands a chance when he/she attacks the control points.  For a great example of good spawnpoint placing, check out DOM-Gearbolt. The main spawnchamber is on a low level, which isn't on a main route to travel from control point to control point.  It is in the center of the map, so all control points can be quickly reached.  The shock rifle and sniper rifle are in that same room, so players can grab a weapon and join the action very quickly.

As for all maptypes, [[Legacy:Z-Axis|z-axis]] is very important in Domination maps. A good map should at least have two, but preferably three, different height levels.  For an example of good z-axis usage, check out DOM-Olden.  The map has a good, open structure with wooden beams at a lot of different levels.  It encourages the player to use his/her translocator more and it improves gameplay a lot, because attacks can come from anywhere.

==Related Topics ==
* other [[Legacy:Gametype|Gametype]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For DrawBridges</title>
    <id>2153</id>
    <revision>
      <id>5242</id>
      <timestamp>2006-08-13T12:22:15Z</timestamp>
      <contributor>
        <ip>DarkMan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping for Drawbridges ===

'''Ragdoll:''' I am thinking of creating a new gametype called DrawBridges. I will tell you what it involves and would appreciate any feedback. Im using [[Legacy:Devastation|Devastation]].

This isnt a entirely new gametype per se, but really a twist on the standard CTF gametype.

Im going to be creating a map to test how well this would work online.

==The basics ==

The base map is two medium sized ships, one for each team (deva owners, think DM-Tankers). Each ship has a drawbridge going to the other side. There is a smaller tugboat in between the two ships which houses the command center. At the start of the game, both bridges are up.

The drawbridges are activated by a switch in the command center, which both teams always have access to. I will be using Laser fence volumes to prevent illegal crossings to the other side. (for those not acquainted with devastation, these are a special blocking volume coupled with a laser emitter that will allow one team to pass through but will stop any members of the opposing team.) 

Say team one have control of the command center. They will lower their bridge first. The end of each drawbridge when lowered will be high above the deck of the ship, only allowing members of that drawbridges team to drop off and preventing any enemy members from jumping up onto it. 

Team 1s members, now on the enemy side, must steal the enemy flag and return it to thier base. Assuming that team 1 still have control of the command center, they must lower the enemy bridge to allow the flag carrier to cross and capture the flag.

What is critical here is what team has control of the command center. Nobody is going anywhere unless both bridges are raised and lowered at the right times.

==Technical Details ==

Default gametype is CTF

Im going to be using eight special event triggers keyed to the drawbridges to display &quot;Blue teams bridge is opening!&quot; and &quot;red teams bridge is closed!&quot; Etc.

==The result ==

See for yourself

[[Image:Legacy_Drabridges-Liner.jpeg|]]

You can see the Control room tugboat in the middle, and you can identify each ship by its coloured lights. The forward bridge (conformist) is down. The bridges are raised and enclosed to stop this becoming a snipefest (do a google image search for &quot;devastation&quot; and look for the p*laser rifle, fancy 12 people with them on a map like that?)

I know the ships dont look realistic in the water, but ive already used enough emitters for the funnel smoke and propeller wake, and dont want to use any more for spray and wake, you know how they laaaaag. 

also note the cool flying mover helicopter, it loops around the map making periodic flybys of the ships.

==Feedback ==

'''Tarquin:''' Sounds interesting, but how many people play Devastation? You might get more of an audience on UT2004. Also, since this is just planning for your project, it would be better moved to [[Legacy:Mod Ideas|Mod Ideas]].

'''Ragdoll:''' Thanks for the feedback, i have actually started building a map already. Devastation has a very small (its lucky to have 12 people playing online at once)audience but I would still be willing to give it a try. I dont have UT2004, only pariah (whose editor doesnt work) and devastation. Maybe someone else would be interested in developing this for UT2004?

'''Tarquin:''' What I meant is that the &quot;Mapping For Foo&quot; pages are mapping guides for mods that exist. This is more of a design document for a project in development.

'''Ragdoll:''' You know, something real funny happened. I sent  the test version of this map to the main dev sever admin (yeah, devastation has about 3 active servers, our community is composed of about 14 people lol) but then the following day i heard he was on holiday, so he didnt get it and it wasnt running on the server. Then my friend said his cousing, who owns deva, played it on the server. Im like, unless someone ripped it off from me, or im living in the twilight zone (again), something real strange is happening.

'''DarkMan:''' Hmm, this doesn't need any mods... It's more or less just triggers and movers. Though it's a good idea, I'll give it a try after I'm done with my current map.</text>
    </revision>
    <revision>
      <id>5243</id>
      <timestamp>2005-10-13T21:14:23Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <comment>Updated with info on first test map, need feedback!</comment>
      <text xml:space="preserve">===Mapping for Drawbridges ===

'''Ragdoll:''' I am thinking of creating a new gametype called DrawBridges. I will tell you what it involves and would appreciate any feedback. Im using [[Legacy:Devastation|Devastation]].

This isnt a entirely new gametype per se, but really a twist on the standard CTF gametype.

Im going to be creating a map to test how well this would work online.

==The basics ==

The base map is two medium sized ships, one for each team (deva owners, think DM-Tankers). Each ship has a drawbridge going to the other side. There is a smaller tugboat in between the two ships which houses the command center. At the start of the game, both bridges are up.

The drawbridges are activated by a switch in the command center, which both teams always have access to. I will be using Laser fence volumes to prevent illegal crossings to the other side. (for those not acquainted with devastation, these are a special blocking volume coupled with a laser emitter that will allow one team to pass through but will stop any members of the opposing team.) 

Say team one have control of the command center. They will lower their bridge first. The end of each drawbridge when lowered will be high above the deck of the ship, only allowing members of that drawbridges team to drop off and preventing any enemy members from jumping up onto it. 

Team 1s members, now on the enemy side, must steal the enemy flag and return it to thier base. Assuming that team 1 still have control of the command center, they must lower the enemy bridge to allow the flag carrier to cross and capture the flag.

What is critical here is what team has control of the command center. Nobody is going anywhere unless both bridges are raised and lowered at the right times.

==Technical Details ==

Default gametype is CTF

Im going to be using eight special event triggers keyed to the drawbridges to display &quot;Blue teams bridge is opening!&quot; and &quot;red teams bridge is closed!&quot; Etc.

==The result ==

See for yourself

[[Image:Legacy_Drabridges-Liner.jpeg|]]

You can see the Control room tugboat in the middle, and you can identify each ship by its coloured lights. The forward bridge (conformist) is down. The bridges are raised and enclosed to stop this becoming a snipefest (do a google image search for &quot;devastation&quot; and look for the p*laser rifle, fancy 12 people with them on a map like that?)

I know the ships dont look realistic in the water, but ive already used enough emitters for the funnel smoke and propeller wake, and dont want to use any more for spray and wake, you know how they laaaaag. 

also note the cool flying mover helicopter, it loops around the map making periodic flybys of the ships.

==Feedback ==

'''Tarquin:''' Sounds interesting, but how many people play Devastation? You might get more of an audience on UT2004. Also, since this is just planning for your project, it would be better moved to [[Legacy:Mod Ideas|Mod Ideas]].

'''Ragdoll:''' Thanks for the feedback, i have actually started building a map already. Devastation has a very small (its lucky to have 12 people playing online at once)audience but I would still be willing to give it a try. I dont have UT2004, only pariah (whose editor doesnt work) and devastation. Maybe someone else would be interested in developing this for UT2004?

'''Tarquin:''' What I meant is that the &quot;Mapping For Foo&quot; pages are mapping guides for mods that exist. This is more of a design document for a project in development.

'''Ragdoll:'''You know, something real funny happened. I sent  the test version of this map to the main dev sever admin (yeah, devastation has about 3 active servers, our community is composed of about 14 people lol) but then the following day i heard he was on holiday, so he didnt get it and it wasnt running on the server. Then my friend said his cousing, who owns deva, played it on the server. Im like, unless someone ripped it off from me, or im living in the twilight zone (again), something real strange is happening.</text>
    </revision>
    <revision>
      <id>5244</id>
      <timestamp>2006-08-13T12:21:43Z</timestamp>
      <contributor>
        <ip>DarkMan</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping for Drawbridges ===

'''Ragdoll:''' I am thinking of creating a new gametype called DrawBridges. I will tell you what it involves and would appreciate any feedback. Im using [[Legacy:Devastation|Devastation]].

This isnt a entirely new gametype per se, but really a twist on the standard CTF gametype.

Im going to be creating a map to test how well this would work online.

==The basics ==

The base map is two medium sized ships, one for each team (deva owners, think DM-Tankers). Each ship has a drawbridge going to the other side. There is a smaller tugboat in between the two ships which houses the command center. At the start of the game, both bridges are up.

The drawbridges are activated by a switch in the command center, which both teams always have access to. I will be using Laser fence volumes to prevent illegal crossings to the other side. (for those not acquainted with devastation, these are a special blocking volume coupled with a laser emitter that will allow one team to pass through but will stop any members of the opposing team.) 

Say team one have control of the command center. They will lower their bridge first. The end of each drawbridge when lowered will be high above the deck of the ship, only allowing members of that drawbridges team to drop off and preventing any enemy members from jumping up onto it. 

Team 1s members, now on the enemy side, must steal the enemy flag and return it to thier base. Assuming that team 1 still have control of the command center, they must lower the enemy bridge to allow the flag carrier to cross and capture the flag.

What is critical here is what team has control of the command center. Nobody is going anywhere unless both bridges are raised and lowered at the right times.

==Technical Details ==

Default gametype is CTF

Im going to be using eight special event triggers keyed to the drawbridges to display &quot;Blue teams bridge is opening!&quot; and &quot;red teams bridge is closed!&quot; Etc.

==The result ==

See for yourself

[[Image:Legacy_Drabridges-Liner.jpeg|]]

You can see the Control room tugboat in the middle, and you can identify each ship by its coloured lights. The forward bridge (conformist) is down. The bridges are raised and enclosed to stop this becoming a snipefest (do a google image search for &quot;devastation&quot; and look for the p*laser rifle, fancy 12 people with them on a map like that?)

I know the ships dont look realistic in the water, but ive already used enough emitters for the funnel smoke and propeller wake, and dont want to use any more for spray and wake, you know how they laaaaag. 

also note the cool flying mover helicopter, it loops around the map making periodic flybys of the ships.

==Feedback ==

'''Tarquin:''' Sounds interesting, but how many people play Devastation? You might get more of an audience on UT2004. Also, since this is just planning for your project, it would be better moved to [[Legacy:Mod Ideas|Mod Ideas]].

'''Ragdoll:''' Thanks for the feedback, i have actually started building a map already. Devastation has a very small (its lucky to have 12 people playing online at once)audience but I would still be willing to give it a try. I dont have UT2004, only pariah (whose editor doesnt work) and devastation. Maybe someone else would be interested in developing this for UT2004?

'''Tarquin:''' What I meant is that the &quot;Mapping For Foo&quot; pages are mapping guides for mods that exist. This is more of a design document for a project in development.

'''Ragdoll:''' You know, something real funny happened. I sent  the test version of this map to the main dev sever admin (yeah, devastation has about 3 active servers, our community is composed of about 14 people lol) but then the following day i heard he was on holiday, so he didnt get it and it wasnt running on the server. Then my friend said his cousing, who owns deva, played it on the server. Im like, unless someone ripped it off from me, or im living in the twilight zone (again), something real strange is happening.

'''DarkMan:''' Hmm, this doesn't need any mods... It's more or less just triggers and movers. Though it's a good idea, I'll give it a try after I'm done with this one.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For FEBA</title>
    <id>2027</id>
    <revision>
      <id>4944</id>
      <timestamp>2002-04-30T11:37:14Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>formatting</comment>
      <text xml:space="preserve">http://www.planetunreal.com/feba/doorway.jpg

* Website: http://www.planetUnreal.com/feba/
* Current version: release 1.69, future release 2.0

At the moment, ''FEBA'' can run all types of UT maps (DM, CTF, AS &amp; DOM) as well as most [[Legacy:Unreal 1|Unreal 1]] singleplayer maps (which are converted to teamplay maps at the beginning of the game) and probably a good share of all other particular gametypes and mod dedicated maps (still to be tested).

What that means is that if you are a mapper and wish to make a map for our mod, all you have to take care of is the ambiance of the map (please don't make it a modern-city or a Face ripoff). If you respect the simple rules of making map for the gametype you choose, it should work fine (although a few maps won't work with feba for some gameplay reasons).

===Theme of the Map ===

Remember the FEBA storyline and settings. Most of the action takes place on a remote planet inhabited by powerful magic users. On top of that you have a human mercenary army attracted by the planet mineral resources who land and confront the natives.

Remember:
* Team 0 (&lt;font color=red&gt;red&lt;/font&gt;) is the havian base
* Team 1 (&lt;font color=blue&gt;blue&lt;/font&gt;) is the UETF Base.

===Gametype ===

Choose a gametype for your map: SinglePlayer, DM, CTF, AS, other... Remember that when playing FEBA all maps are converted to teamgame. Currently (as of release 2.x) all UT gametype are supported as well as unreal1 single player (in most cases) and UT mods gametypes (probably).

As an added value your map will be playable outside of FEBA as a standard map for that gametype!

====Items ====

When playing FEBA all UT items are suppressed (ammo, weapons, etc) and [[Legacy:PlayerStart|PlayerStart]]s are scrambled. If you wish to put in the map an item that shouldn't be delete by the gametype, you have to give this item the tag &quot;FEBA&quot; in its properties.

==Related Topics ==
* mapping for other [[Legacy:Gametype|Gametype]]</text>
    </revision>
    <revision>
      <id>4945</id>
      <timestamp>2002-01-29T21:24:32Z</timestamp>
      <contributor>
        <ip>TaoPaiPai</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">http://www.planetunreal.com/feba/doorway.jpg

&lt;br /&gt;[http://www.planetUnreal.com/feba/ The Website]

At the moment,''FEBA''(&lt;sub&gt;release 1.69,future release 2.0&lt;/sub&gt;) can run all types of UT maps (DM,CTF,AS DOM maps) as well as most unreal1 singleplayer maps (which are converted to teamplay maps at the beginning of the game) and probably a good share of all other particular gametypes and mod dedicated maps (still to be tested).&lt;br&gt;

What that means is that if you are a mapper and wish to make a map for our mod,all you have to take care of is the ambiance of the map.(please don't make it a modern-city or a Face ripoff).If you respect the simple rules of making map for the gametype you choose,it should work fine (although a few maps won't work with feba for some gameplay reasons).

&lt;table bgColor=&quot;#ffaaaa&quot;&gt;&lt;tr&gt;&lt;td&gt;

''-Step 1-''Select the theme of the Map.&lt;br&gt;

Remember the FEBA storyline and settings.Most of the action takes place on a remote planet inhabited by powerful magic users.On top of that you have a human mercenary army attracted by the planet mineral ressources who land and confront the natives.&lt;br&gt;

Remember:Team 0 (&lt;font color=red&gt;red&lt;/font&gt;) is the havian base and team 1 (&lt;font color=blue&gt;blue&lt;/font&gt;) is the UETF Base.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;table bgColor=&quot;#ffffaa&quot;&gt;&lt;tr&gt;&lt;td&gt;

''-step 2-''Select the Gametype that you will use:&lt;i&gt; singlePlayer , DM , CTF , AS , other&lt;/i&gt; ...&lt;br&gt;

Remember that when playing feba all maps are converted to teamgame.Currently (as of release 2.x) all UT gametype are supported as well as unreal1 single player (in most cases) and UT mods gametypes(probably).

As an added value your map will be playable outside of FEBA as a standard map for that gametype!

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;font color=red&gt;When playing FEBA all UT items are suppressed (ammo,weapons,etc) and playerstarts are scrambled.If you wish to put in the map an item that shouldn't be delete by the gametype, you have to give this item the tag &quot;FEBA&quot; in its properties.&lt;/font&gt;</text>
    </revision>
    <revision>
      <id>4946</id>
      <timestamp>2002-04-30T11:36:02Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>formatting</comment>
      <text xml:space="preserve">http://www.planetunreal.com/feba/doorway.jpg

* Website: http://www.planetUnreal.com/feba/
* Current version: release 1.69, future release 2.0

At the moment, ''FEBA'' can run all types of UT maps (DM, CTF, AS &amp; DOM) as well as most [[Legacy:Unreal 1|Unreal 1]] singleplayer maps (which are converted to teamplay maps at the beginning of the game) and probably a good share of all other particular gametypes and mod dedicated maps (still to be tested).

What that means is that if you are a mapper and wish to make a map for our mod, all you have to take care of is the ambiance of the map (please don't make it a modern-city or a Face ripoff). If you respect the simple rules of making map for the gametype you choose, it should work fine (although a few maps won't work with feba for some gameplay reasons).

===Theme of the Map ===

Remember the FEBA storyline and settings. Most of the action takes place on a remote planet inhabited by powerful magic users. On top of that you have a human mercenary army attracted by the planet mineral ressources who land and confront the natives.

Remember:
* Team 0 (&lt;font color=red&gt;red&lt;/font&gt;) is the havian base
* Team 1 (&lt;font color=blue&gt;blue&lt;/font&gt;) is the UETF Base.

===Gametype ===

Choose a gametype for your map: SinglePlayer, DM, CTF, AS, other... Remember that when playing FEBA all maps are converted to teamgame. Currently (as of release 2.x) all UT gametype are supported as well as unreal1 single player (in most cases) and UT mods gametypes (probably).

As an added value your map will be playable outside of FEBA as a standard map for that gametype!

====Items ====

When playing FEBA all UT items are suppressed (ammo, weapons, etc) and [[Legacy:PlayerStart|PlayerStart]]s are scrambled. If you wish to put in the map an item that shouldn't be delete by the gametype, you have to give this item the tag &quot;FEBA&quot; in its properties.

==Related Topics ==
* mapping for other [[Legacy:Gametype|Gametype]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Flag Domination</title>
    <id>2146</id>
    <revision>
      <id>5225</id>
      <timestamp>2005-01-06T18:41:24Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>A/B/C flag classes</comment>
      <text xml:space="preserve">[http://uncommonplace.com/games/flagdom.html Flag Domination]: Like a cross between CTF and Domination, FD starts out with two or three flags in the center of the map, and teams score points by capturing the flags at their designated locations.

----

Be sure to look at the flags and monitors in the existing maps to make sure you understand how all this stuff works. If you have any questions, visit my [http://uncommonplace.com/forums/ forums], or just add comments to this Wiki page :)

This document covers mapping for the UT2003 version of Flag Domination. Mapping for the UT version is similar.

==Flags==

A map can have either two or three flags.  For each flag, there must be one &lt;tt&gt;FDBase&lt;/tt&gt;, and one &lt;tt&gt;FDCapture&lt;/tt&gt; per team. The inheritance chain for both is:

{{classbox| [[Legacy:UT2003|UT2003]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:CTFBase|CTFBase]] &gt;&gt; [[Legacy:XRealCTFBase|xRealCTFBase]] &gt;&gt; FDBase/FDCapture}}

Keep in mind that, as in CTF, the visible flag base decoration will be created at run time, so it's normal for the flag not to touch the ground in UnrealEd.

You can also use the &lt;tt&gt;AFlagBase&lt;/tt&gt;, &lt;tt&gt;BFlagBase&lt;/tt&gt;, and &lt;tt&gt;CFlagBase&lt;/tt&gt; classes, especially if you don't plan to have custom names and symbols. They were created for use by the automatic flag placement in Vehicle Flag Domination, but they're also convenient for mapping. The come with their skin, index, capture event, name, and symbol pre-set.

===FDBase===
;GameObjective-&gt;ObjectiveName:The name of the flag. This will be used in HUD messages, as well as for matching the flag base up with capture points, banners and monitors.
;FDBase-&gt;FlagSymbol:The symbol that appears on the flag and in the HUD, monitors and banners. The default A, B and C symbols are in FDFlags.utx: &lt;tt&gt;FDFlags.Symbol.A_Logo&lt;/tt&gt;, etc. Custom symbols can be either masked or alpha. Don't forget to set &lt;tt&gt;UClamp&lt;/tt&gt; and &lt;tt&gt;VClamp&lt;/tt&gt; to &lt;tt&gt;TC_Clamp&lt;/tt&gt; after importing them, and try to keep the symbols a good distance from the edges or the clamping effect will become noticeable at smaller sizes.
;FDBase-&gt;CaptureEvent:Triggered whenever a flag is captured or stolen. This is the event used by the monitors.
;FDBase-&gt;FlagIndex:Controls the order in which flags are displayed in the HUD: use the values 0, 1 and 2. If left at -1, the flags will be displayed in the order in which they were placed in the map. The &lt;tt&gt;A&lt;/tt&gt;/&lt;tt&gt;B&lt;/tt&gt;/&lt;tt&gt;CFlagBase&lt;/tt&gt; classes have this set appropriately by default.
;Skins:Each &lt;tt&gt;FDBase&lt;/tt&gt; ''must'' have a different skin (otherwise they won't show different symbols). FDFlags.utx has three versions of the black skin, plus orange, magenta, and cyan skins. Be sure to use the [[Legacy:FinalBlend|FinalBlend]] versions. You can also, of course, use a custom skin. Just make sure a white flag symbol will show against your skin.
;GameObjective-&gt;Score:Can be set to a value higher than 1; this will be used in Timed scoring as the number of points scored at every interval.

===FDCapture===
;GameObjective-&gt;ObjectiveName:Set this to the same name as the corresponding &lt;tt&gt;FDBase&lt;/tt&gt;.
;GameObjective-&gt;DefenderTeamIndex:0 for Red and 1 for Blue.
;GameObjective-&gt;DefenseScriptTags: See Defense, below.
;FDCapture-&gt;CaptureEvent:Triggered when a flag is captured at this point.
;FDCapture-&gt;StealEvent:Triggered when a flag is stolen from this point. Added in version 3.3.
;Skins:The skin will be set at run time, but you may want to set it in the map just so it looks better while you're editing it.

==Defense==

The original UT Flag Domination had a special &lt;tt&gt;FDDefensePoint&lt;/tt&gt;; this is not needed in UT2003/2004, which has [[Legacy:Creating A Defense Point In UT200x|a built-in mechanism]] for associating a defense point with a particular [[Legacy:GameObjective|GameObjective]]. Set the &lt;tt&gt;FDCapture&lt;/tt&gt;'s GameObjective-&gt;DefenseScriptTags to something unique, like 'BlueMooseFlag', and then add [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s (Actor-&gt;KeyPoint-&gt;AIScript) where you want the bots to stand. Set the Tag of each one to the same value as the &lt;tt&gt;FDCapture&lt;/tt&gt;'s DefenseScriptTags. Don't forget to point them in the right direction.

==Banners and Monitors (look under [[Legacy:Decoration|Decoration]])==

Like the flags, banners and monitors must have a skin that corresponds to their flag. The skins are in FDBanners.utx, and they're numbered. It doesn't matter which skin number goes with which flag, as long as you're consistent. Remember to go by flag, not by team. There are also additional numbered versions of each banner/monitor with the corresponding skins set by default.

As with flags, the thing to remember is that two objects with the same skin will always look the same. They don't have copies of the same skin, they actually share one skin between them. That's why FDBanners.utx has three copies of each.

* 
&lt;tt&gt;FDMonitor&lt;/tt&gt; is just like [[Legacy:XDOMMonitor|xDOMMonitor]], showing the capture status of a flag. Set the FlagName to match the ObjectiveName of the FDBase, and make sure each &lt;tt&gt;FDBase&lt;/tt&gt;'s CaptureEvent is unique (normally FDCap1, 2 or 3). Set xDOMMonitor-&gt;ActiveShader, BlueShader and RedShader to the appropriate skin for the flag (ie &lt;tt&gt;FDBanners.Monitor.GrayScreen1&lt;/tt&gt;, &lt;tt&gt;GrayScreen2&lt;/tt&gt;, etc). The other shader fields are not used. The monitor will automatically pick up the flag's symbol based on the FlagName.

(Note that &lt;tt&gt;FDCapture&lt;/tt&gt; also has a CaptureEvent field. This event is triggered when the flag is captured at that point, whereas the FDBase's CaptureEvent is triggered when the flag is captured, or picked up, by *any* team.)


* &lt;tt&gt;FDxTeamBanner&lt;/tt&gt; actually works like a monitor (as does [[Legacy:XTeamBanner|xTeamBanner]], though their neutral skin is broken). If you don't want it to change, just set the Tag to None, set the skin to whichever for the team and flag (use gray to mark the flag's home base area), and set the Team value to 0 or 1. If you do want it to change, set the BlueSkin, RedSkin, and GraySkin fields as needed, in addition to the Tag.

* &lt;tt&gt;FDBlueBanner&lt;/tt&gt; and &lt;tt&gt;FDRedBanner&lt;/tt&gt; are the hanging banners as seen in FD-Canyon. Again, set the skin number as necessary. These banners don't change, so the Tag doesn't matter.</text>
    </revision>
    <revision>
      <id>5226</id>
      <timestamp>2004-12-13T20:18:19Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[http://uncommonplace.com/games/flagdom.html Flag Domination]: Like a cross between CTF and Domination, FD starts out with two or three flags in the center of the map, and teams score points by capturing the flags at their designated locations.

----

Be sure to look at the flags and monitors in the existing maps to make sure you understand how all this stuff works. If you have any questions, visit my [http://uncommonplace.com/forums/ forums], or just add comments to this Wiki page :)

This document covers mapping for the UT2003 version of Flag Domination. Mapping for the UT version is similar.

==Flags==

A map can have either two or three flags.  For each flag, there must be one &lt;tt&gt;FDBase&lt;/tt&gt;, and one &lt;tt&gt;FDCapture&lt;/tt&gt; per team. The inheritance chain for both is:

{{classbox| [[Legacy:UT2003|UT2003]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:CTFBase|CTFBase]] &gt;&gt; [[Legacy:XRealCTFBase|xRealCTFBase]] &gt;&gt; FDBase/FDCapture}}

Keep in mind that, as in CTF, the visible flag base decoration will be created at run time, so it's normal for the flag not to touch the ground in UnrealEd.

===FDBase===
;GameObjective-&gt;ObjectiveName:The name of the flag. This will be used in HUD messages, as well as for matching the flag base up with FDCaptures, banners and monitors.
;FDBase-&gt;FlagSymbol:The symbol that appears on the flag and in the HUD, monitors and banners. The default A, B and C symbols are in FDFlags.utx: &lt;tt&gt;FDFlags.Symbol.A_Logo&lt;/tt&gt;, etc. Custom symbols can be either masked or alpha. Don't forget to set &lt;tt&gt;UClamp&lt;/tt&gt; and &lt;tt&gt;VClamp&lt;/tt&gt; to &lt;tt&gt;TC_Clamp&lt;/tt&gt; after importing them, and try to keep the symbols a good distance from the edges or the clamping effect will become noticeable at smaller sizes.
;FDBase-&gt;CaptureEvent:Triggered whenever a flag is captured or stolen. This is the event used by the monitors.
;FDBase-&gt;FlagIndex:Controls the order in which flags are displayed in the HUD. If left at -1, the flags will be displayed in the order in which they were placed in the map.
;Skins:Each FDBase ''must'' have a different skin (otherwise they won't show different symbols). FDFlags.utx has three versions of the black skin, plus orange, magenta, and cyan skins. Be sure to use the [[Legacy:FinalBlend|FinalBlend]] versions. You can also, of course, use a custom skin. Just make sure a white flag symbol will show against your skin.
;GameObjective-&gt;Score:Can be set to a value higher than 1; this will be used in Timed scoring as the number of points scored at every interval.

===FDCapture===
;GameObjective-&gt;ObjectiveName:Set this to the same name as the corresponding FDBase.
;GameObjective-&gt;DefenderTeamIndex:0 for Red and 1 for Blue.
;GameObjective-&gt;DefenseScriptTags: See Defense, below.
;FDCapture-&gt;CaptureEvent:Triggered when a flag is captured at this point.
;FDCapture-&gt;StealEvent:Triggered when a flag is stolen from this point. Added in version 3.3.
;Skins:The skin will be set at run time, but you may want to set it in the map just so it looks better while you're editing it.

==Defense==

The original UT Flag Domination had a special &lt;tt&gt;FDDefensePoint&lt;/tt&gt;; this is not needed in UT2003/2004, which has [[Legacy:Creating A Defense Point In UT200x|a built-in mechanism]] for associating a defense point with a particular [[Legacy:GameObjective|GameObjective]]. Set the FDCapture's GameObjective-&gt;DefenseScriptTags to something unique, like 'BlueMooseFlag', and then add [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]]s (Actor-&gt;KeyPoint-&gt;AIScript) where you want the bots to stand. Set the Tag of each one to the same value as the FDCapture's DefenseScriptTags. Don't forget to point them in the right direction.

==Banners and Monitors (look under [[Legacy:Decoration|Decoration]])==

Like the flags, banners and monitors must have a skin that corresponds to their flag. The skins are in FDBanners.utx, and they're numbered. It doesn't matter which skin number goes with which flag, as long as you're consistent. Remember to go by flag, not by team. There are also additional numbered versions of each banner/monitor with the corresponding skins set by default.

As with flags, the thing to remember is that two objects with the same skin will always look the same. They don't have copies of the same skin, they actually share one skin between them. That's why FDBanners.utx has three copies of each.

* 
&lt;tt&gt;FDMonitor&lt;/tt&gt; is just like [[Legacy:XDOMMonitor|xDOMMonitor]], showing the capture status of a flag. Set the FlagName to match the ObjectiveName of the FDBase, and make sure each FDBase's CaptureEvent is unique (normally FDCap1, 2 or 3). Set xDOMMonitor-&gt;ActiveShader, BlueShader and RedShader to the appropriate skin for the flag (ie &lt;tt&gt;FDBanners.Monitor.GrayScreen1&lt;/tt&gt;, &lt;tt&gt;GrayScreen2&lt;/tt&gt;, etc). The other shader fields are not used. The monitor will automatically pick up the flag's symbol based on the FlagName.

(Note that FDCapture also has a CaptureEvent field. This event is triggered when the flag is captured at that point, whereas the FDBase's CaptureEvent is triggered when the flag is captured, or picked up, by *any* team.)


* &lt;tt&gt;FDxTeamBanner&lt;/tt&gt; actually works like a monitor (as does [[Legacy:XTeamBanner|xTeamBanner]], though their neutral skin is broken). If you don't want it to change, just set the Tag to None, set the skin to whichever for the team and flag (use gray to mark the flag's home base area), and set the Team value to 0 or 1. If you do want it to change, set the BlueSkin, RedSkin, and GraySkin fields as needed, in addition to the Tag.

* &lt;tt&gt;FDBlueBanner&lt;/tt&gt; and &lt;tt&gt;FDRedBanner&lt;/tt&gt; are the hanging banners as seen in FD-Canyon. Again, set the skin number as necessary. These banners don't change, so the Tag doesn't matter.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak</title>
    <id>1801</id>
    <revision>
      <id>4419</id>
      <timestamp>2006-05-10T16:33:52Z</timestamp>
      <contributor>
        <ip>The Head</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''For mapping information about Jailbreak III for [[Legacy:Unreal Tournament|Unreal Tournament]], see [[Legacy:Mapping For UT Jailbreak|Mapping for UT Jailbreak]].''

The official Jailbreak 200x documentation site is the '''Jailbreak Developer Network''' at http://www.planetjailbreak.com/jdn/ (another Wiki, in fact).  All mapping-related actors are documented there, and several small tutorials explain how to set up Jailbreak maps.

==Overview==

There are far fewer special classes compared to the UT version. In particular:
* Use standard [[Legacy:PlayerStart|PlayerStart]] everywhere. Set the [[Legacy:Team Number|team number]] as you would in any other game.
* Use standard [[Legacy:ZoneInfo|ZoneInfo]] everywhere. You can use any subclasses too, for anything, including the Arena and the Jails.
** The JBInfoJail actor can be set to automatically bind itself to the zone it sits in.
** The JBInfoArena actor can be set to automatically bind itself to the zone it sits in also, but you probably will want several zones in the arena to optimise it. So you can:
*** set a [[Legacy:Tag|Tag]] for all Arena zones
*** use a [[Legacy:Volume|Volume]] to delineate the arena
* The release switch can be any [[Legacy:GameObjective|GameObjective]] subclass.

For [[Legacy:Bot Support|bot support]] [[Legacy:Playtest|playtest]]ing, disable the PlayerStarts in the jails and the arena, shove two flags in and run it as CTF ;)

==Spoondog's Guide to Mapping for Jailbreak==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/General Layout]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Weapon Availability]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Deathmatch Or CTF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Risk Balance]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Boring Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Arena]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conclusion]]

==Other Guides==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/More Mapping Tips]]</text>
    </revision>
    <revision>
      <id>4420</id>
      <timestamp>2004-06-06T13:22:19Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''For mapping information about Jailbreak III for [[Legacy:Unreal Tournament|Unreal Tournament]], see [[Legacy:Mapping For UT Jailbreak|Mapping for UT Jailbreak]].''

The official Jailbreak 200x documentation site is the '''Jailbreak Developer Network''' at http://www.planetjailbreak.com/jdn/ (another Wiki, in fact).  All mapping-related actors are documented there, and several small tutorials explain how to set up Jailbreak maps.

==Overview==

There are far fewer special classes compared to the UT version. In particular:
* Use standard [[Legacy:PlayerStart|PlayerStart]] everywhere. Set the [[Legacy:Team Number|team number]] as you would in any other game.
* Use standard [[Legacy:ZoneInfo|ZoneInfo]] everywhere. You can use any subclasses too, for anything, including the Arena and the Jails.
** The JBInfoJail actor can be set to automatically bind itself to the zone it sits in.
** The JBInfoArena actor can be set to automatically bind itself to the zone it sits in also, but you probably will want several zones in the arena to optimise it. So you can:
*** set a [[Legacy:Tag|Tag]] for all Arena zones
*** use a [[Legacy:Volume|Volume]] to delineate the arena
* The release switch can be any [[Legacy:GameObjective|GameObjective]] subclass.

For [[Legacy:Bot Support|bot support]] [[Legacy:Playtest|playtest]]ing, disable the PlayerStarts in the jails and the arena, shove two flags in and run it as CTF ;)

==Spoondog's Guide to Mapping for Jailbreak==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/General Layout]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Weapon Availability]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Deathmatch Or CTF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Risk Balance]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Boring Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Arena]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conclusion]]</text>
    </revision>
    <revision>
      <id>4421</id>
      <timestamp>2006-05-10T15:47:35Z</timestamp>
      <contributor>
        <ip>The Head</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''For mapping information about Jailbreak III for [[Legacy:Unreal Tournament|Unreal Tournament]], see [[Legacy:Mapping For UT Jailbreak|Mapping for UT Jailbreak]].''

The official Jailbreak 200x documentation site is the '''Jailbreak Developer Network''' at http://www.planetjailbreak.com/jdn/ (another Wiki, in fact).  All mapping-related actors are documented there, and several small tutorials explain how to set up Jailbreak maps.

==Overview==

There are far fewer special classes compared to the UT version. In particular:
* Use standard [[Legacy:PlayerStart|PlayerStart]] everywhere. Set the [[Legacy:Team Number|team number]] as you would in any other game.
* Use standard [[Legacy:ZoneInfo|ZoneInfo]] everywhere. You can use any subclasses too, for anything, including the Arena and the Jails.
** The JBInfoJail actor can be set to automatically bind itself to the zone it sits in.
** The JBInfoArena actor can be set to automatically bind itself to the zone it sits in also, but you probably will want several zones in the arena to optimise it. So you can:
*** set a [[Legacy:Tag|Tag]] for all Arena zones
*** use a [[Legacy:Volume|Volume]] to delineate the arena
* The release switch can be any [[Legacy:GameObjective|GameObjective]] subclass.

For [[Legacy:Bot Support|bot support]] [[Legacy:Playtest|playtest]]ing, disable the PlayerStarts in the jails and the arena, shove two flags in and run it as CTF ;)

==Spoondog's Guide to Mapping for Jailbreak==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/General Layout]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Weapon Availability]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Deathmatch Or CTF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Risk Balance]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Boring Jails]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Arena]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conclusion]]

==Coming Soon==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/More Mapping Tips]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Boring Jails</title>
    <id>2164</id>
    <revision>
      <id>5261</id>
      <timestamp>2004-06-06T14:10:34Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Boring Jails==

===&quot;Why are we waiting... we are suffo...&quot; *cough* *ahem*===

The heading pretty much explains itself.  Boring jails were a bit of a problem in the old Jailbreak days before [[Legacy:Mychaeel|Mychaeel]]'s [[Legacy:Screen|Screen]] and [[Legacy:CameraSpot|CameraSpot]] components became available.  Nowadays you have a ton of things at your disposal to throw in your jails and relieve the prisoners of their boredom while they wait to be released.

You can use:

; [[Legacy:CameraSpot|CameraSpot]] (UTJB), [[JDN:JBCamera|JBCamera]] (JB2003/2004) : Put some JBCamera actors throughout your level in cool spots, and stick a monitor/trigger in Jail so prisoners can surveil the action outside while they get taken from behi... *ahem*... anyway... yea, there's also lots of functionality '''within''' these JBCameras &amp;ndash; you can make them switchable by the person who is watching through them, you can make them change using a timer, or JB2003/2004 even has an automated function that you can set, where the game will choose the best camera for the player to view, based on the amount of players in view.

; [[Legacy:Screen|Screen]] (UTJB), [[JDN:JBScreen|JBScreen]] : You can put a scoreboard on the wall, or a map surveillance screen that shows the location of all the players in the game (just like the scoreboard minimap), or even an IRC chat screen where you can chat in an IRC channel from within the game!  It's funny in #utjb seeing all the &quot;ah s**t&quot;s and &quot;ffs!&quot;s from people who are playing a level with an IRC screen in it :-)

; Prison Escapes : One of those things where I can't begin to explain the fun you could have making one of these!  So many possibilities &amp;ndash; you could make a hatch where prisoners have to make a human ladder to escape, or there can be more elaborate escapes such as the excellent example in Tarquin's JB-Pressurized (UTJB).  Or you could have a combination of human ladders and fighting monsters (JB-EternalCaves-III &amp;ndash; UTJB), or an impact jump, then a death-defying (actually, often not &quot;defying&quot; death at all muhahaha) set of leaps on poles over a pool of acid, all the time have a stone titan throwing instant-kill rocks at you!!! (JB-SprinTitan &amp;ndash; UTJB).  Usually escapes will leave the prisoner low on health too so as not to give them '''too''' much of a reward (Hell, they already got out of Jail free!)

; Arena Switches : You can put switches in Jails that prisoners on each team can press if they wish to challenge each other for freedom in an arena match.

...so you have no excuse to have boring jails in your maps!  (I only left CastleBreak's Jails empty because I ran out of time... but that's not an excuse... *ahem*)  One thing you will find about the Jailbreak community is that they love cool stuff.  You will be worshipped if you create a really good and challenging escape!

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Risk Balance]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Arena]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Conclusion</title>
    <id>2167</id>
    <revision>
      <id>5266</id>
      <timestamp>2006-06-21T11:10:36Z</timestamp>
      <contributor>
        <ip>222.155.38.178</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Conclusion==

===Oh... that's it?===

Well, I think you know just about everything there is to know about designing a Jailbreak map now.  I hope everything I've discussed here serves as a good set of guidelines for making your Jailbreak maps own.

And for those who haven't made a Jailbreak map yet &amp;ndash; I hope this has inspired you to go ahead and get creative.  More level designers means more maps, and that's always a good thing!  Oh, and don't forget the basic things to finish off your level &amp;ndash; screenshots, level info, playercount, scoreboard minimap (check the [[JDN:Home_Page|JDN]] on how to do it or there are instructions in-game), default gametype set to &quot;Jailbreak.Jailbreak&quot; and a cool secret here and there!

Good luck, and I hope making Jailbreak maps is as satisfying and ultimately beneficlal as it has been for me (for real).

: Cory Spooner &lt;br /&gt;&quot;Spoondog&quot; &lt;br /&gt;http://spoondog.beyondunreal.com &lt;br /&gt;thespoondog@beyondunreal.com

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5267</id>
      <timestamp>2004-06-06T14:17:25Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Conclusion==

===Oh... that's it?===

Well, I think you know just about everything there is to know about designing a Jailbreak map now.  I hope everything I've discussed here serves as a good set of guidelines for making your Jailbreak maps own.

And for those who haven't made a Jailbreak map yet &amp;ndash; I hope this has inspired you to go ahead and get creative.  More level designers means more maps, and that's always a good thing!  Oh, and don't forget the basic things to finish off your level &amp;ndash; screenshots, level info, playercount, scoreboard minimap (check the [[JDN:Home_Page|JDN]] on how to do it or there are instructions in-game), default gametype set to &quot;Jailbreak.Jailbreak&quot; and a cool secret here and there!

Good luck, and I hope making Jailbreak maps is as satisfying and ultimately beneficlal as it has been for me (for real).

: Cory Spooner &lt;br /&gt;&quot;Spoondog&quot; &lt;br /&gt;http://www.planetunreal.com/spoondog/ &lt;br /&gt;thespoondog@planetunreal.com

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5268</id>
      <timestamp>2005-05-15T03:29:22Z</timestamp>
      <contributor>
        <ip>194.26.233.220.exetel.com.au</ip>
      </contributor>
      <comment>changed my website address!</comment>
      <text xml:space="preserve">==Conclusion==

===Oh... that's it?===

Well, I think you know just about everything there is to know about designing a Jailbreak map now.  I hope everything I've discussed here serves as a good set of guidelines for making your Jailbreak maps own.

And for those who haven't made a Jailbreak map yet &amp;ndash; I hope this has inspired you to go ahead and get creative.  More level designers means more maps, and that's always a good thing!  Oh, and don't forget the basic things to finish off your level &amp;ndash; screenshots, level info, playercount, scoreboard minimap (check the [[JDN:Home_Page|JDN]] on how to do it or there are instructions in-game), default gametype set to &quot;Jailbreak.Jailbreak&quot; and a cool secret here and there!

Good luck, and I hope making Jailbreak maps is as satisfying and ultimately beneficlal as it has been for me (for real).

: Cory Spooner &lt;br /&gt;&quot;Spoondog&quot; &lt;br /&gt;http://spoondog.beyondunreal.com &lt;br /&gt;thespoondog@planetunreal.com

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Death Sequence</title>
    <id>2166</id>
    <revision>
      <id>5264</id>
      <timestamp>2006-04-06T22:19:17Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Death Sequence==

===LOOOOL!! Flying dildo rockets killed him OMG!!!...===

Just as you would be worshipped for creating a really good escape, you will also be worshipped if you create an absolutely cool death sequence/execution for the captured team.

If you are a player of UTJB then you will know how many cool, funny and original death sequences there are.  From ravenous pupaes eating everyone, to pressurization chambers, and death by loud speakers to drowning deaths and flying dildo rockets &amp;ndash; there is something for the whole family!

[[Image:Legacy_jailbreak-mapping-execution-1-dildo.jpeg|center|An... interesting death sequence...]]

Usually death sequences will wipe out all the prisoners but there is the occasional one (JB-Gauntlet-III, JB-Hydro32 &amp;ndash; UTJB) where it is possible to avoid being killed by the monsters or whatever is after you (the players will die by default gibbing anyway, but it was still worth it to escape the intended death method) and that is actually quite fun to try and do that &amp;ndash; so that's something to think about when designing a cool execution.

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Arena]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conclusion]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5265</id>
      <timestamp>2006-04-06T21:06:52Z</timestamp>
      <contributor>
        <ip>59.187.231.124</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Death Sequence==

===LOOOOL!! Flying dildo rockets killed him OMG!!!...===

Just as you would be worshipped for creating a really good escape, you will also be worshipped if you create an absolutely cool death sequence/execution for the captured team.

If you are a player of UTJB then you will know how many cool, funny and original death sequences there are.  From ravenous pupaes eating everyone, to pressurization chambers, and death by loud speakers to drowning deaths and flying dildo rockets &amp;ndash; there is something for the whole family!

[[Image:Legacy_jailbreak-mapping-execution-1-dildo.jpeg|center|An... interesting death sequence...]]

Usually death sequences will wipe out all the prisoners but there is the occasional one (JB-Gauntlet-III, JB-Hydro32 &amp;ndash; UTJB) where it is possible to avoid being killed by the monsters or whatever is after you (the players will die by default gibbing anyway, but it was still worth it to escape the intended death method) and that is actually quite fun to try and do that &amp;ndash; so that's something to think about when designing a cool execution.

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Arena]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Conclusion]]

----

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/General Layout</title>
    <id>2158</id>
    <revision>
      <id>5252</id>
      <timestamp>2006-04-06T22:20:29Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">==General Layout==

===Where am I?  It's too hard to release!===

[[Image:Legacy_jailbreak-mapping-general-1-phobos.jpeg|right|JB-Phobos][ is a good example of multiple routes in the centre and one route to the switch.]]

[[Image:Legacy_jailbreak-mapping-general-2-gauntlet.jpeg|right|JB-Gauntlet-III is also a good example.]]

The first thing I am going to talk about is the general layout of a good Jailbreak map.  Many maps (some of mine) suffer from players not knowing where they are or release switches being either too easy to defend, or too easy to attack.  Mappers should make sure that, just like a CTF map, the route to both their base and the enemy base is made as obvious as possible.

This can be done with things like team-coloured banners and decorations, team-coloured textures, team-coloured lighting, or even a team-coloured skybox!  This is not to say go ahead and make all of your textures, meshes and lights fully saturated red/blue, as in some cases you may want to keep it subtle to match the theme of your map.  Do make sure that you make team bases apparent in some way though, or it can result in players being confused as to where to go, and this is a bad thing in Jailbreak.  Though, '''there is a compass''' in all versions of Jailbreak that points to either the enemy release switch or the players release switch (user-configurable), which helps, but shouldn’t be relied on fully.

With layout, I’ve also found that it works best (produces the most fun and even-matched games) to have '''more routes in the centre''' and '''less near the release'''.  This is where level design for Jailbreak differs from CTF.  In CTF it often works well to have multiple routes in/out of a flag area with one or two high-risk areas in the middle that the flag carrier must go through (Hydro16, Orbital, Lucius, even Face).  In Jailbreak however, it is the getting '''to''' the switch that counts, and not the getting '''back'''.  If you have a release switch that is easy to get to via multiple routes, then it is going to be too easy to release.  Some will say “but what about if you counteract that by having a chokepoint in the middle to defend”, and this is kind of true, but because of the Deathmatch-style gameplay that is mixed in with Jailbreak you will find that the attacking player is often already past the chokepoint anyway.

This is not to say that those kind of layouts don't work -– but a more-routes-in-middle-less-routes-near-switch layout has the following advantage:  It means that a '''lone player''' is able to defend his/her switch from '''multiple attackers''' successfully if they are good enough.  It is very hard to do this with the other more-routes-near-switch-less-in-middle layout because, although the lone player can go to the centre of the map to defend, he/she will end up going after an attacker while another one runs past.  If there is less routes near the switch, the player can defend it by themselves (if the right weapons are available).  It sucks big-time if the last player is always going to be over-powered by the enemy.  Having multiple routes in the centre of the map also means that the player can perhaps sneak by unnoticed if they are good… but it is still dangerous near the switch because one player could be the end of you! :-)

Whatever layout you decide to go for, it is always good to test (preferably with other human players) on an untextured, undecorated layout map first and see if it plays well -– if it does, then go ahead and use it!

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5253</id>
      <timestamp>2006-04-06T21:06:47Z</timestamp>
      <contributor>
        <ip>200.21.231.8</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==General Layout==

===Where am I?  It's too hard to release!===

[[Image:Legacy_jailbreak-mapping-general-1-phobos.jpeg|right|JB-Phobos][ is a good example of multiple routes in the centre and one route to the switch.]]

[[Image:Legacy_jailbreak-mapping-general-2-gauntlet.jpeg|right|JB-Gauntlet-III is also a good example.]]

The first thing I am going to talk about is the general layout of a good Jailbreak map.  Many maps (some of mine) suffer from players not knowing where they are or release switches being either too easy to defend, or too easy to attack.  Mappers should make sure that, just like a CTF map, the route to both their base and the enemy base is made as obvious as possible.

This can be done with things like team-coloured banners and decorations, team-coloured textures, team-coloured lighting, or even a team-coloured skybox!  This is not to say go ahead and make all of your textures, meshes and lights fully saturated red/blue, as in some cases you may want to keep it subtle to match the theme of your map.  Do make sure that you make team bases apparent in some way though, or it can result in players being confused as to where to go, and this is a bad thing in Jailbreak.  Though, '''there is a compass''' in all versions of Jailbreak that points to either the enemy release switch or the players release switch (user-configurable), which helps, but shouldn?t be relied on fully.

With layout, I?ve also found that it works best (produces the most fun and even-matched games) to have '''more routes in the centre''' and '''less near the release'''.  This is where level design for Jailbreak differs from CTF.  In CTF it often works well to have multiple routes in/out of a flag area with one or two high-risk areas in the middle that the flag carrier must go through (Hydro16, Orbital, Lucius, even Face).  In Jailbreak however, it is the getting '''to''' the switch that counts, and not the getting '''back'''.  If you have a release switch that is easy to get to via multiple routes, then it is going to be too easy to release.  Some will say ?but what about if you counteract that by having a chokepoint in the middle to defend?, and this is kind of true, but because of the Deathmatch-style gameplay that is mixed in with Jailbreak you will find that the attacking player is often already past the chokepoint anyway.

This is not to say that those kind of layouts don't work -? but a more-routes-in-middle-less-routes-near-switch layout has the following advantage:  It means that a '''lone player''' is able to defend his/her switch from '''multiple attackers''' successfully if they are good enough.  It is very hard to do this with the other more-routes-near-switch-less-in-middle layout because, although the lone player can go to the centre of the map to defend, he/she will end up going after an attacker while another one runs past.  If there is less routes near the switch, the player can defend it by themselves (if the right weapons are available).  It sucks big-time if the last player is always going to be over-powered by the enemy.  Having multiple routes in the centre of the map also means that the player can perhaps sneak by unnoticed if they are good? but it is still dangerous near the switch because one player could be the end of you! :-)

Whatever layout you decide to go for, it is always good to test (preferably with other human players) on an untextured, undecorated layout map first and see if it plays well -? if it does, then go ahead and use it!

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]]

----

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Introduction</title>
    <id>2157</id>
    <revision>
      <id>5251</id>
      <timestamp>2004-06-06T13:26:56Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

Hi there and welcome to my comprehensive guide to mapping for [[Legacy:Jailbreak|Jailbreak]].  My name is Cory Spooner a.k.a. Spoondog and I am from New Zealand, but am currently working in Australia for [http://www.perception.com.au Perception Pty.] on a future Unreal title based on the popular Stargate SG-1 television series.

If you have played a fair bit of Jailbreak then you will probably have played a few of my maps.  I have been designing levels for Unreal Tournament since somewhere in 2000, and have made approximately fourty to fifty levels in total for UT, UT2003 and UT2004 -– around thirty of them are for Jailbreak. :-)

Jailbreak is the most fun gametype I have come across and that is why I continue to map for it.  The community is great, and if you design a level for Jailbreak, you can be sure it will be well-received by almost everybody –- which always makes it worth the effort!  Jailbreak is also widely played and reviewed, and is accepted by major map sites such as [http://www.nalicity.com Nali City] and [http://www.mapraider.com Mapraider], so any levels you make will most likely get a lot of exposure, and you will find that Jailbreak levels get commented on almost as much as standard gametypes.  Why Epic hasn’t included Jailbreak as a standard gametype yet is beyond me! ;-)

This guide covers Jailbreak 2004, Jailbreak 2003 and UT Jailbreak and uses examples from all of them.  It should only be used as a reference, and please be aware that a fair chunk of this guide is formed from my own experience in Jailbreak mapping and may not necessarily reflect the opinions of other level designers or players.  Also keep in mind that even I am guilty of not following these, my own, guidelines &amp;ndash; but just because a map doesn't follow a particular guideline doesn’t mean it is a bad map!  I have tried to cover most aspects of Jailbreak mapping, and you will find that a lot of these guidelines also relate to mapping for other game-types besides Jailbreak, though if I tried to cover all of those I would be here forever.  The sections in this document are not in any particular order, so be sure to read it all!

So anyway, seeing you have chosen to design a map for Jailbreak –- read on and I’m sure these guidelines will help you on your way to creating the ultimate fun-packed Jailbreak level!

----

'''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/General Layout]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Jails</title>
    <id>2159</id>
    <revision>
      <id>5254</id>
      <timestamp>2004-06-06T13:43:00Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Jails==

===Is this game ever going to end?  Camper!===

You should always design or at least think about Jail placement right from the start when designing a map.  Placement of jails can be the deciding factor on whether a map rocks… or sucks.

There has been a lot of debate on whether Jails should be in the enemy base, in your base or in the middle.  Personally, if I had to choose, my first choice would definitely be that jails should be in the middle if possible.  My second choice would be for you to be jailed in your own base –- even though this of course doesn't make sense (why would the enemy jail you in your own base?), in most cases it just produces better gameplay… and we have to remember that it is a “Tournament” after all, so the teams jail their opposition wherever the hell the Tournament sponsors tell them to!  But please remember '''all of these three scenarios can work''', under different circumstances... but regardless of what jail placement is chosen, released players should always have a safe passage back to their own base.  The benefits of each type of jail setup are explained below.

====Option 1: Jailed in the enemy base (JB-IndusRage2 &amp;ndash; JB2003/2004)====

[[Image:Legacy_jailbreak-mapping-jails-1-alcatraz.jpeg|right|JB-Alcatraz (UTJB) &amp;ndash; A good map but sometimes ruined by &quot;base-switching&quot;.]]

This is my least preferred layout, but it can work if the map is not too large.  A huge map that has a long distance between switches is not suitable for this setup because it causes the infamous “base-switching” and release-switch-camping, which leads to a long, drawn-out game, with the match often tied at the end.

The reason this is not so bad in a smaller map is because players can do the obvious and counteract the base-switching by heading back to their own base to defend.  This can actually be a really cool challenge to see if you can break the cycle by yourself :-)

On large maps the player would have to run miles to get back to their own base to counter the base-switching, and then probably get killed at the end of it.  Not good.

====Option 2:  Jailed in the centre of the map (JB-CastleBreak, JB-Heights &amp;ndash; JB2003/2004)====

[[Image:Legacy_jailbreak-mapping-jails-2-castlebreak.jpeg|right|JB-Castlebreak is an example of jails in the centre of the map.]]

This is my preferred option because it is the ultimate compromise between the two other types of jail placement, and it gives players the '''choice''' of what they want to do.  They can head back into their own base and load up or defend –- or they can risk entering the enemy base straight from jail.  Players should have a safe passage back to their own base and it is preferable that it is made risky for them to head straight into the enemy base from there (e.g. a weak weapon made available on the way or a dangerous area to go through).

====Option 3:  Jailed in your own base (JB-Cavern &amp;ndash; JB2003/2004)====




[[Image:Legacy_jailbreak-mapping-jails-3-cavern.jpeg|right|JB-Cavern is an example of jails in your own base.]]

Sometimes it is not suitable for jails to be in the enemy base, and you have designed your map already and decided that the jails don't belong in the centre either.  This is where you can put the jails in your own base.

It is the unrealistic option but it means players have a safe passage to their own base and avoids base-switching and release-switch-camping because there is always a good flood of released players to over-power the hostile enemy.



Hopefully this wee explanation here clears it up so you can choose the right jail placement to suit your map... :-)

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/General Layout]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Weapon Availability]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/More Mapping Tips</title>
    <id>2168</id>
    <revision>
      <id>5269</id>
      <timestamp>2006-05-10T19:20:37Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Taken from [http://forums.beyondunreal.com/showthread.php?p=2053523#post2053523 this thread] on BuF

Most important feature of this thread was the following statement in regards to map layout.

I have already quoted various coments from the thread, 

==Give the teams a reason to leave their base==

===Shields===

''Don't put the 100a in the base....''

'''spineblaZe''': &quot;Absolutely no shields in the base. None. 0. Zilch. Neither 100's or 50's should be available in your base. You want shields, you should have to go get some.&quot;

'''The_Head''': &quot;Personally I believe it is ok to use the 50a ''near'' the base, but in a position so that getting it you are moving yourself right to the edge of the base itself, thus leaving yourself vulnreble to damage from oncoming attackers. 'Do not' put loads of armor in a small room at the back of the base.&quot;

===Keg O'Health + Other 'big' powerups.===

''....Or the Keg for that matter''

For the same reason as the shields they should be kept out of the base, A few vials and healthpacks are fine, and you can adjust the amounts of these for balance on the map. Putting the Keg in the centre of the map works well and is seen in many maps, 100a and the damage amp also fit well in the centre of them map. (to go a little off topic)

===No Lightning Gun or Shock Rifle===

Be carefull with what weapons are in the base, how to do this can vary quite a lot, different players and different mappers value weapons differently, I personally don't rate the linkgun at all (The_Head) 

'''spineblaZe''': &quot;Do not put either of these weapons in the base. I cannot stress this enough. They are arguably the most powerful and useful weapons in the game. If you want one, you should have to go out and get it.

-IMO, Link, Bio and Flak are good weapons to have in the base. They are good enough and versatile enough to get you going. Use your best judgement. &quot;-

'''Birelli''': &quot;Now, that having been said putting high-value weapons like the shock rifle and rocket launcher, as well as the high-level power-ups in the middle of the map is still a great idea across-the-board. Mappers should definitely do that, and above all every mapper should at least consider these issues, since in JB they are way more important than in any other gametype.&quot;

'''G.Lecter''': &quot;Defending the switches must be possible, so having a powerful weapon in the bases might be a good idea. However, it all depends on the difficulty you want to give the map.&quot;

Overall, the last thing you want to do is fill up the bases with lots of ammo for the weapons, argueing over which weapons should go in the base will go on for ever, but it seems to be agreed to seriously limit the ammo in a base.

===Spawn Points===

Be sure to spread out the pathnodes, everyone spawning in the same place will often lead to linear play, also you will notice the bots will often all group together when this is the case (memories of my early beta's of Egypt come into my mind - The_Head)

Also it will effect the fps at the start of a match, whilst many of us may not have problems with loosing a few fps, it can be quite critical to some players.

Having the playerstarts spread around the base, is an important feature of a good map, whilst the idea of a spawn room might initially seem a good one, but it can only be a bad thing in terms of playability.

'''spineblaZe''': &quot;Mix it up. At the start of the map, don't be afraid to spawn people all over the map. Who said all the spawn points have to be in your base? Make sure to keep 3 or 4 spawns in the base, but spread the rest out. Put some in the middle of the map, and even put some red and blue spawns by eachother. This will start the fighting immediately, and give your team more incentive to leave their base and come to the aid or rescue of their teammates.&quot;

This comment got mixed receptions, most people seemed to agree spreading the playerstarts jsut around the base was enough, but in a map that has a problem of lots of camping within the base, a good plan of action is to make sure some players will spawn next to one another, this will almost certainly result in a jailed player. Giving a reason to leave the base and attack.

'''Birelli''': &quot;Putting player starts across the map means newbs will get pounded on before they have a chance to orient themselves, that's discouraging and drives new players away.&quot;

This I guess will come down to the maps author!

-depends on whether you want a nice n00b freindly map, or one more aimed at the &quot;pro&quot; players.-

==Comments==

'''Tarquin:''' Can we think of a better page title than 'tips'? Or merge into other pages?

* Fold into [[Legacy:Mapping For Jailbreak/Weapon Availability|Mapping For Jailbreak/Weapon Availability]] and rename it /Pickups
* not sure where to move that spawning stuff

'''The_Head:''' That was the best I could think of at the time, Open to suggestions though.

As to merging into Spoondogs guide, I have left that for now as I wanted to make sure I got the hang of editing in the wiki before I go mess up the order of his guide. ALso it would no longer be ''&quot;Spoondogs&quot;'' guide to JB mapping</text>
    </revision>
    <revision>
      <id>5270</id>
      <timestamp>2006-05-10T19:13:38Z</timestamp>
      <contributor>
        <ip>The Head</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Taken from [http://forums.beyondunreal.com/showthread.php?p=2053523#post2053523 this thread] on BuF

Most important feature of this thread was the following statement in regards to map layout.

I have already quoted various coments from the thread, 

==give the teams a reason to leave their base==

===Shields===

''Don't put the 100a in the base....''

'''spineblaZe''': &quot;Absolutely no shields in the base. None. 0. Zilch. Neither 100's or 50's should be available in your base. You want shields, you should have to go get some.&quot;

'''The_Head''': &quot;Personally I believe it is ok to use the 50a ''near'' the base, but in a position so that getting it you are moving yourself right to the edge of the base itself, thus leaving yourself vulnreble to damage from oncoming attackers. 'Do not' put loads of armor in a small room at the back of the base.&quot;

===Keg O'Health + Other 'big' powerups.===

''....Or the Keg for that matter''

For the same reason as the shields they should be kept out of the base, A few vials and healthpacks are fine, and you can adjust the amounts of these for balance on the map. Putting the Keg in the centre of the map works well and is seen in many maps, 100a and the damage amp also fit well in the centre of them map. (to go a little off topic)

===No Lightning Gun or Shock Rifle===

Be carefull with what weapons are in the base, how to do this can varie quite a lot, different players and different mappers value weapons differently, I personally don't rate the linkgun at all (The_Head) 

'''spineblaZe''': &quot;Do not put either of these weapons in the base. I cannot stress this enough. They are arguably the most powerful and useful weapons in the game. If you want one, you should have to go out and get it.

-IMO, Link, Bio and Flak are good weapons to have in the base. They are good enough and versatile enough to get you going. Use your best judgement. &quot;-

'''Birelli''': &quot;Now, that having been said putting high-value weapons like the shock rifle and rocket launcher, as well as the high-level power-ups in the middle of the map is still a great idea across-the-board. Mappers should definitely do that, and above all every mapper should at least consider these issues, since in JB they are way more important than in any other gametype.&quot;

'''G.Lecter''': &quot;Defending the switches must be possible, so having a powerful weapon in the bases might be a good idea. However, it all depends on the difficulty you want to give the map.&quot;

Overall, the last thing you want to do is fill up the bases with lots of ammo for the weapons, argueing over which weapons should go in the base will go on for ever, but it seems to be agreed to seriously limit the ammo in a base.

===Spawn Points===

Be sure to spread out the pathnodes, everyone spawning in the same place will often lead to linear play, also you will notice the bots will often all group together when this is the case (memories of my early beta's of Egypt come into my mind - The_Head)

Also it will effect the fps at the start of a match, whilst many of us may not have problems with loosing a few fps, it can be quite critical to some players.

Having the playerstarts spread around the base, is an important feature of a good map, whilst the idea of a spawn room might initially seem a good one, but it can only be a bad thing in terms of playability.

'''spineblaZe''': &quot;Mix it up. At the start of the map, don't be afraid to spawn people all over the map. Who said all the spawn points have to be in your base? Make sure to keep 3 or 4 spawns in the base, but spread the rest out. Put some in the middle of the map, and even put some red and blue spawns by eachother. This will start the fighting immediately, and give your team more incentive to leave their base and come to the aid or rescue of their teammates.&quot;

This comment got mixed receptions, most people seemed to agree spreading the playerstarts jsut around the base was enough, but in a map that has a problem of lots of camping within the base, a good plan of action is to make sure some players will spawn next to one another, this will almost certainly result in a jailed player. Giving a reason to leave the base and attack.

'''Birelli''': &quot;Putting player starts across the map means newbs will get pounded on before they have a chance to orient themselves, that's discouraging and drives new players away.&quot;

This I guess will come down to the maps author!

-depends on whether you want a nice n00b freindly map, or one more aimed at the &quot;pro&quot; players.-

----

====Comments====

'''Tarquin:''' Can we think of a better page title than 'tips'? Or merge into other pages?

* Fold into [[Legacy:Mapping For Jailbreak/Weapon Availability|Mapping For Jailbreak/Weapon Availability]] and rename it /Pickups
* not sure where to move that spawning stuff

'''The_Head:''' That was the best I could think of at the time, Open to suggestions though.

As to merging into Spoondogs guide, I have left that for now as I wanted to make sure I got the hang of editing in the wiki before I go mess up the order of his guide. ALso it would no longer be ''&quot;Spoondogs&quot;'' guide to JB mapping</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Risk Balance</title>
    <id>2163</id>
    <revision>
      <id>5260</id>
      <timestamp>2004-06-06T14:01:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Risk Balance==

===Should I go down and grab that Damage Amp, or stay up here with my bio-rifle...===

One of the most fun parts of designing a level for me is also giving the player choices throughout the entire level.  This aspect is very important, and is relevant to all gametypes.  I like to call it &quot;Risk Balance&quot;.  Either on a broad scale (&quot;Should I take the left route, that has the UDamage, to the enemy base &amp;ndash; or should I take the right route, where I am less likely to encounter that l33t Spoondog on the way...&quot;), or on a smaller scale (&quot;Oh crap, I could jump down and grab the RL, but I think Spoondog might own me, so maybe I'll stay up here with my mediocre weapon...&quot;).  As a level designer, you have the opportunity to create as much of that as you like, and what better game to do it in than Unreal Tournament &amp;ndash; with so many weapons, fire modes, pickups and varying opportunities at your disposal...

Here are some common examples in my Jailbreak maps:




[[Image:Legacy_jailbreak-mapping-risk-1-castlebreak.jpeg|left|Broad scale risk balance in JB-CastleBreak.]]

'''JB-CastleBreak (JB2003/2004)''' &amp;ndash; Example of very broad risk balance situation &amp;ndash; &quot;Hmm... I wanna go up the middle to the top of the hill and grab the super shield but I'll probably get my head sniped off, and there's no weapons up there...  On the other hand, I could just take one of the side routes &amp;ndash; that way I won't get the super shield but at least I'll get a minigun or shock-rifle for my troubles...&quot;

'''JB-CastleBreak (JB2003/2004)''' &amp;ndash; Example of balancing switches &amp;ndash; &quot;That release switch is the quickest to get to, but I have to go over the drawbridge and I think someone might close it before I get there... so I'll go around the back and use the other release switch &amp;ndash; it takes longer but they can't block me off that way...&quot;






[[Image:Legacy_jailbreak-mapping-risk-2-indusrage.jpeg|left|Small-scale risk balance in JB-IndusRage2.]]

'''JB-IndusRage2 (JB2003/2004)''' &amp;ndash; Example of a smaller risk balance situation &amp;ndash; &quot;There's some RL ammo down there &amp;ndash; I could jump down and be sweet-as for ammo for this round, but then I'll end up on the lower level, so maybe I should just keep my good spot up here and make-do with the ammo I've got...&quot;






[[Image:Legacy_jailbreak-mapping-risk-3-relic.jpeg|left|Using the jump boots in JB-Relic.]]

'''JB-Relic (UTJB)''' &amp;ndash; Example of pickup usage &amp;ndash; &quot;I could take one of the normal routes down the sides, or I could wait here for those JumpBoots to respawn and use them to jump right down the middle over the waterfalls for a quick release...&quot;



This is not a new concept &amp;ndash; you will notice it in almost every map you come across, to a varying degree.  But try and fit it into your levels wherever possible as it enhances gameplay so much and extends the replayability of your level.

----

'''Previous:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Deathmatch Or CTF]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Boring Jails]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Shooting From Jails</title>
    <id>2161</id>
    <revision>
      <id>5257</id>
      <timestamp>2004-06-06T13:46:34Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Shooting from Jails==

===WTF?  OMG BUG!!! The dudes in jail can shoot me through the bars!===

I’ve heard this before, and trust me &amp;ndash; it's not a bug.  In fact, the jails in my maps are notorious for being able to shoot out of them.

A perfect example of this is JB-Complex (UTJB) &amp;ndash; I specifically designed and placed the jails so they were at a high vantage point, and had bar windows on all sides so players could shoot unsuspecting players from their containment!  It adds an extra twist to those otherwise boring jails, and makes sure jail-door-camping Llamas get what they deserve :-)

It also means that players aren't completely useless while in jail, which I personally like.

One thing to remember is that this means players can also shoot '''in''' at jailed players.  However, players don’t get any points for killing jailed players and are only risking their own life and wasting their ammo in doing so.  So by all means, don't be afraid to let players shoot through your jail doors and windows if you feel the need!

----

'''Previous:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Weapon Availability]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Deathmatch Or CTF]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32353</id>
      <timestamp>2008-07-06T13:13:10Z</timestamp>
      <contributor>
        <username>Q</username>
        <id>895</id>
      </contributor>
      <comment>/* WTF?  OMG BUG!!! The dudes in jail can shoot me through the bars! */</comment>
      <text xml:space="preserve">==Shooting from Jails==

===WTF?  OMG BUG!!! The dudes in jail can shoot me through the bars!===

I’ve heard this before, and trust me &amp;ndash; it's not a bug.  In fact, the jails in my maps are notorious for being able to shoot out of them.

A perfect example of this is &quot;JB-Complex: (UTJB) &amp;ndash; I specifically designed and placed the jails so they were at a high vantage point, and had bar windows on all sides so players could shoot unsuspecting players from their containment!  It adds an extra twist to those otherwise boring jails, and makes sure jail-door-camping Llamas get what they deserve :-)

It also means that players aren't completely useless while in jail, which I personally like.

One thing to remember is that this means players can also shoot '''in''' at jailed players.  However, players don’t get any points for killing jailed players and are only risking their own life and wasting their ammo in doing so.  So by all means, don't be afraid to let players shoot through your jail doors and windows if you feel the need! :)

----

'''Previous:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Weapon Availability]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Deathmatch Or CTF]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Team Deathmatch Or CTF</title>
    <id>2162</id>
    <revision>
      <id>5258</id>
      <timestamp>2006-04-06T22:21:00Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">==Team Deathmatch or CTF?==

===&quot;It's TDM coz the object is to frag other players.&quot; &quot;Nah it's CTF coz of the team bases&quot;...===

So what is it most like?  TDM or CTF?  This is also one of the more debated topics about Jailbreak… and to tell you the truth, I really couldn't make a choice between the two, honestly.  So instead, I’ll say how Jailbreak is similar to each of them &amp;ndash; this can influence the way you will design the layout of your map because obviously there is a huge difference between designing a DM level and designing a CTF level &amp;ndash; and the way I explain it should show that it is a nice compromise between the two :-)

So… TDM.  Obviously in Jailbreak you have to try and frag the other players as much as possible, like in TDM right?  True, but fragging players can also sometimes be second priority to releasing your team, just as in CTF fragging is often second priority to capturing the flag.  Jailbreak also needs team-colours to indicate which base you are in, and just like in CTF, the map should be designed to allow for '''defense points'''.  On the other hand, unlike CTF, the release room should be hard to get '''into''', but not necessarily hard to get '''out of''' (where in CTF the flagroom should not be too easy to get out of).  Because you end up in Jail when you get fragged too, it means that it makes you value your life more than both TDM and CTF.  Jailbreak is the perfect compromise in gameplay &amp;ndash; it makes your life very valuable, so your first instinct is to hide... &quot;Oh, but I have to rescue my team!&quot;... so you can't hide, and you get points for releasing, so now it makes sense to attack instead of hiding… &quot;But then I might die and cause the capture of my team!&quot;... so maybe you should hide...  &quot;But they're relying on me to release them!&quot;... so you have to attack!...  Aaahhhhhhhhhh!!! Hehe.  You choose :-)

So for the purpose of level design, lets say that in this sense it is good to design a level with at least some Z-axis, and with good connectivity for those one-on-one situations which are so common in Jailbreak (i.e. '''get''' anywhere in the map '''from''' anywhere in the map).  CTF can sometimes be fun without a whole heap of Z-axis (Hydro16), whereas because of the Deathmatch element in Jailbreak, you really need to include some higher spots, so a player’s ability to move around the map doesn't go unrewarded.  But obviously in Jailbreak there are two teams, and there are release switches.  So your level won’t end up just like a Deathmatch level because you need to have clearly defined bases for the release switch, and just like in CTF, both symmetrical and asymmetrical layouts can be good.  A good example of the mixture between CTF and DM layouts is my map JB-Phobos][ (UTJB) &amp;ndash; it had the same theme as Inoxx’s original DM, and about the same amount of Z-axis (about four or five levels), but still had clearly defined bases and was symmetrical.  Lots of routes in the centre, but only one way to the release switch… and it plays good.  JB-Phobos][ is taking it to the extreme though in terms of z-axis :-)

So, in short &amp;ndash; try to design your levels to cater for both styles of gameplay &amp;ndash; think of what you like about a good Deathmatch level, or a good CTF level, and try to combine them to produce a design that works well, good luck, that’s always the fun part for me!

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Risk Balance]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5259</id>
      <timestamp>2006-04-06T21:06:47Z</timestamp>
      <contributor>
        <ip>Cdn-ce-den-t1-01.cmc.co.denver.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Team Deathmatch or CTF?==

===&quot;It's TDM coz the object is to frag other players.&quot; &quot;Nah it's CTF coz of the team bases&quot;...===

So what is it most like?  TDM or CTF?  This is also one of the more debated topics about Jailbreak? and to tell you the truth, I really couldn't make a choice between the two, honestly.  So instead, I?ll say how Jailbreak is similar to each of them &amp;ndash; this can influence the way you will design the layout of your map because obviously there is a huge difference between designing a DM level and designing a CTF level &amp;ndash; and the way I explain it should show that it is a nice compromise between the two :-)

So? TDM.  Obviously in Jailbreak you have to try and frag the other players as much as possible, like in TDM right?  True, but fragging players can also sometimes be second priority to releasing your team, just as in CTF fragging is often second priority to capturing the flag.  Jailbreak also needs team-colours to indicate which base you are in, and just like in CTF, the map should be designed to allow for '''defense points'''.  On the other hand, unlike CTF, the release room should be hard to get '''into''', but not necessarily hard to get '''out of''' (where in CTF the flagroom should not be too easy to get out of).  Because you end up in Jail when you get fragged too, it means that it makes you value your life more than both TDM and CTF.  Jailbreak is the perfect compromise in gameplay &amp;ndash; it makes your life very valuable, so your first instinct is to hide... &quot;Oh, but I have to rescue my team!&quot;... so you can't hide, and you get points for releasing, so now it makes sense to attack instead of hiding? &quot;But then I might die and cause the capture of my team!&quot;... so maybe you should hide...  &quot;But they're relying on me to release them!&quot;... so you have to attack!...  Aaahhhhhhhhhh!!! Hehe.  You choose :-)

So for the purpose of level design, lets say that in this sense it is good to design a level with at least some Z-axis, and with good connectivity for those one-on-one situations which are so common in Jailbreak (i.e. '''get''' anywhere in the map '''from''' anywhere in the map).  CTF can sometimes be fun without a whole heap of Z-axis (Hydro16), whereas because of the Deathmatch element in Jailbreak, you really need to include some higher spots, so a player?s ability to move around the map doesn't go unrewarded.  But obviously in Jailbreak there are two teams, and there are release switches.  So your level won?t end up just like a Deathmatch level because you need to have clearly defined bases for the release switch, and just like in CTF, both symmetrical and asymmetrical layouts can be good.  A good example of the mixture between CTF and DM layouts is my map JB-Phobos][ (UTJB) &amp;ndash; it had the same theme as Inoxx?s original DM, and about the same amount of Z-axis (about four or five levels), but still had clearly defined bases and was symmetrical.  Lots of routes in the centre, but only one way to the release switch? and it plays good.  JB-Phobos][ is taking it to the extreme though in terms of z-axis :-)

So, in short &amp;ndash; try to design your levels to cater for both styles of gameplay &amp;ndash; think of what you like about a good Deathmatch level, or a good CTF level, and try to combine them to produce a design that works well, good luck, that?s always the fun part for me!

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Risk Balance]]

----

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/The Arena</title>
    <id>2165</id>
    <revision>
      <id>5262</id>
      <timestamp>2006-04-06T22:21:59Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">==The Arena==

===**Spoondog fights Sexmachine in the arena**... &lt;Sexmachine&gt; Ah crap...===

The arena is a perfect place to implement that risk balance stuff I was talking about earlier.  In fact, take a look at any of my levels and you will find that the arena will have some kind of life-threatening decision to make.

Actually, a good example is Snowdog's JB-Talaeron (UTJB) &amp;ndash; you have the choice of staying low with your shock-rifle or going onto the rise and getting the damage amp (I usually stay low as the person getting the damage amp is in the perfect spot for a good combo...).

[[Image:Legacy_jailbreak-mapping-arena-1-talaeron.jpeg|center|JB-Talaeron's arena &amp;ndash; safe shock rifle or risky amp?]]

Usually I make my arena's based on '''one''' simple decision and that is enough &amp;ndash; the players are only going to spend a little while in here, it doesn't need to be a whole deathmatch level in itself (even though DavidM's JB-Nifam (UTJB) and my JB-DarkAges (UTJB) arenas are '''actually''' released Deathmatch maps &amp;ndash; we were just lazy!).  Anyway, at least make sure you have an arena &amp;ndash; a JB map without an arena is unheard of these days.

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Boring Jails]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5263</id>
      <timestamp>2006-04-06T21:06:44Z</timestamp>
      <contributor>
        <ip>CDN-CE-INFLOW-T2-04.inflow.pa.bo.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==The Arena==

===**Spoondog fights Sexmachine in the arena**... &lt;Sexmachine&gt; Ah crap...===

The arena is a perfect place to implement that risk balance stuff I was talking about earlier.  In fact, take a look at any of my levels and you will find that the arena will have some kind of life-threatening decision to make.

Actually, a good example is Snowdog's JB-Talaeron (UTJB) &amp;ndash; you have the choice of staying low with your shock-rifle or going onto the rise and getting the damage amp (I usually stay low as the person getting the damage amp is in the perfect spot for a good combo...).

[[Image:Legacy_jailbreak-mapping-arena-1-talaeron.jpeg|center|JB-Talaeron's arena &amp;ndash; safe shock rifle or risky amp?]]

Usually I make my arena's based on '''one''' simple decision and that is enough &amp;ndash; the players are only going to spend a little while in here, it doesn't need to be a whole deathmatch level in itself (even though DavidM's JB-Nifam (UTJB) and my JB-DarkAges (UTJB) arenas are '''actually''' released Deathmatch maps &amp;ndash; we were just lazy!).  Anyway, at least make sure you have an arena &amp;ndash; a JB map without an arena is unheard of these days.

----

'''Previous:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Boring Jails]] &amp;ndash; '''Next:''' [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Death Sequence]]

----

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Jailbreak/Weapon Availability</title>
    <id>2160</id>
    <revision>
      <id>5255</id>
      <timestamp>2006-04-06T22:19:31Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">==Weapon Availability==

===Not fair! I only have assault rifle/enforcer!===

This section is short and sweet &amp;ndash; no one likes not having a decent weapon to run around with.

Sure &amp;ndash; some maps are designed so the player must use his/her brain to find a good weapon but don't go over the top -? make sure at least a weaker weapon is available at the start of a round, then they can traverse the map after that to gain a better one... and '''always''' make sure released players get access to some sort of weapon, preferably an decent one so they can defend themselves from jail-door campers.  This is not a guideline it is a '''command''' goddammit!  ;-)

Release protection is good, and helps, but it doesn't last forever, so it's not enough on its own.

----

'''Previous:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]] &amp;ndash; '''Next:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5256</id>
      <timestamp>2006-04-06T21:06:51Z</timestamp>
      <contributor>
        <ip>ContentTelepuerto1.racsa.co.cr</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Weapon Availability==

===Not fair! I only have assault rifle/enforcer!===

This section is short and sweet &amp;ndash; no one likes not having a decent weapon to run around with.

Sure &amp;ndash; some maps are designed so the player must use his/her brain to find a good weapon but don't go over the top -? make sure at least a weaker weapon is available at the start of a round, then they can traverse the map after that to gain a better one... and '''always''' make sure released players get access to some sort of weapon, preferably an decent one so they can defend themselves from jail-door campers.  This is not a guideline it is a '''command''' goddammit!  ;-)

Release protection is good, and helps, but it doesn't last forever, so it's not enough on its own.

----

'''Previous:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jails]] &amp;ndash; '''Next:'''  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Shooting From Jails]]

----

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For King Of The Hill</title>
    <id>2030</id>
    <revision>
      <id>4951</id>
      <timestamp>2002-10-07T08:09:26Z</timestamp>
      <contributor>
        <ip>WebcacheH01a.cache.pol.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''King Of The Hill''' (KOTH) is a team game, similar to Domination. (general explanation here...)

Several mod teams have created implementations of KOTH for UT:

* KOTH2, coded by Gorgor, from which is derived
** [http://www.boilingpoint.com/~jasonyu/koth2/ KOTH2] with bot support, by Jason Yu ([[Legacy:Captain Kewl|Captain Kewl]]), which is used in part or whole for
*** KOTH and Roving KOTH, for [http://www.planetunreal.com/rampancy/ Marathon|Rampancy], and
*** M:R KOTH, for [http://resurrection.bungie.org Marathon: Resurrection]
* KOTH, by the [http://dynamic4.gamespy.com/~chaotic/index.php ChaosUT] team

==General principles ==

Arena-style maps with a hill in the center tend to yield better gameplay than standard deathmatch-style maps.

Use your creativity to create &quot;hills&quot; (ie frozen pond, bottom of a crater, top of a skyscraper,ect)

==Specifics ==

KOTH2 maps are named with the KOTH- prefix and contain at least one Hill actor. The Hill is a [[Legacy:Trigger|Trigger]] subclass which is activated when a [[Legacy:PlayerPawn|PlayerPawn]] or [[Legacy:Bot (UT)|Bot (UT)]] falls within its [[Legacy:Collision Cylinder|collision cylinder]]. The only stipulation in placement is that it (the KOTH2 actor itself) is reachable by a pathhnode network &amp;ndash; this is to ensure proper bot behavior.

Note ChaosUT KOTH maps can use a hill trigger or zone as sometimes a zone is a better choice (non-circular hills). The ChaosUT KOTH also requires defense points be placed inside the hill. The ChaosUT KOTH version also has a team option. You should group your [[Legacy:PlayerStart|PlayerStart]]s together and remember to set the same TeamNumber of those players starts. 

==Related Topics ==
* [[Legacy:Mod Ideas/KOTH|Mod Ideas/KOTH]]
* [[Legacy:Mapping For King Of The Hill/CUT2_KOTH|Mapping For King Of The Hill/CUT2_KOTH]] - Mapping for ChaosUT2: Evolution (King of the Hill mode)

===Links ===
* KOTH2: http://www.boilingpoint.com/~jasonyu/koth2/
* The Ventcore Project (KOTH2 Maps): http://www.frogblast.com/
* The ChaosUT (KOTH Maps): http://dynamic4.gamespy.com/~chaotic/mapping/mappingguide.php?s=3.1

==Discussion ==

'''Jb:''' First of all thanks for fixing my Wiki blunders. Sorry I will get the hang of it. But yes. The KOTH2 was originally coded by Gorgor. His version used triggers but was not compatible with the bots (ie the bots did not know how to play KOTH). The Marathon Rampancy (SP?) team also based their version of the KOTH2 using triggers. However their version was compatible with bots. The ChaosUT team coded their to use hill triggers and zones (as sometimes you want to use a hill zone, other times you want a trigger). They also used Defense points and placed these defense points inside the hill trigger/zone. They did the so that you could place several defense points inside a hill trigger/zone and the bot would move from defense point to defense point to more mimic how a human might play KOTH. Finally this allowed them to handle multiple hill. You can set the defense points fortstand tag for each hill. Thus a bot wound wonder from hill to hill. Finally the ChaosUT was the only one to have a Team version of KOTH as well. The key to making it compatible with bots is base KOTH of TeamGamePlus so you can set orders for the bots. 

'''capt. k.:''' That's why I specified &quot;KOTH2&quot; in the original page title.  :)

'''Tarquin:''' I've rearranged a bit, but as I've never played this there's some blanks I can't write: a general intro to the concept, the general ideas involved in the maps, and the specifics for each version. I take it none of them are compatible with each other?

'''Jb:'''  The KOTH2 code was intergrated into Marthon Rampancy so yes those are compatabile. Saddly to say that the ChoasUT maps are not. We offered more features for the KoTH game play but we had to do things a bit different in order to add these features (Team version of KOTH, addtion of zone to mark hill areas,  a flag to allow for hill time given if the player is not alone on the hill and more control over where the bot defened including moving around on the hill). I have been looking for a way to make them compatibile but have yet to fine one :(

'''capt. k.'''  Integrated into Marathon Resurrection and otherwise reverse compatible.  I think Rampancy just builds on top of it.  I don't think there's any way to get around the dependency on KOTH2.u of maps built around it, but as triggers aren't static, one could easily do a check for KOTH2Hill actors after the map is loaded and replace with or add their own hills.

'''Jb:'''  Capt. K, good point and I know I can do that. However we use Defense points to route the bots too the hill. So I could add a defense point near the location of the KOTH2Hill Triggers that the other mods use. But I would be worried that the bots may run into issues (like would I have to rebuild the paths, putting defense points too close together may cause the bots to get stuck, ect).</text>
    </revision>
    <revision>
      <id>4952</id>
      <timestamp>2002-08-15T12:42:55Z</timestamp>
      <contributor>
        <ip>Jb</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''King Of The Hill''' (KOTH) is a team game, similar to Domination. (general explanation here...)

Several mod teams have created implementations of KOTH for UT:

* KOTH2, coded by Gorgor, from which is derived
** [http://www.boilingpoint.com/~jasonyu/koth2/ KOTH2] with bot support, by Jason Yu ([[Legacy:Captain Kewl|Captain Kewl]]), which is used in part or whole for
*** KOTH and Roving KOTH, for [http://www.planetunreal.com/rampancy/ Marathon|Rampancy], and
*** M:R KOTH, for [http://resurrection.bungie.org Marathon: Resurrection]
* KOTH, by the [http://dynamic4.gamespy.com/~chaotic/index.php ChaosUT] team

==General principles ==

Arena-style maps with a hill in the center tend to yield better gameplay than standard deathmatch-style maps.

Use your creativity to create &quot;hills&quot; (ie frozen pond, bottom of a crater, top of a skyscraper,ect)

==Specifics ==

KOTH2 maps are named with the KOTH- prefix and contain at least one Hill actor. The Hill is a [[Legacy:Trigger|Trigger]] subclass which is activated when a [[Legacy:PlayerPawn|PlayerPawn]] or [[Legacy:Bot (UT)|Bot (UT)]] falls within its [[Legacy:Collision Cylinder|collision cylinder]]. The only stipulation in placement is that it (the KOTH2 actor itself) is reachable by a pathhnode network &amp;ndash; this is to ensure proper bot behavior.

Note ChaosUT KOTH maps can use a hill trigger or zone as sometimes a zone is a better choice (non-circular hills). The ChaosUT KOTH also requires defense points be placed inside the hill. The ChaosUT KOTH version also has a team option. You should group your [[Legacy:PlayerStart|PlayerStart]]s together and remember to set the same TeamNumber of those players starts. 

==Related Topics ==
* [[Legacy:Mod Ideas/KOTH|Mod Ideas/KOTH]]

===Links ===
* KOTH2: http://www.boilingpoint.com/~jasonyu/koth2/
* The Ventcore Project (KOTH2 Maps): http://www.frogblast.com/
* The ChaosUT (KOTH Maps): http://dynamic4.gamespy.com/~chaotic/mapping/mappingguide.php?s=3.1

==Discussion ==

'''Jb:''' First of all thanks for fixing my Wiki blunders. Sorry I will get the hang of it. But yes. The KOTH2 was originally coded by Gorgor. His version used triggers but was not compatible with the bots (ie the bots did not know how to play KOTH). The Marathon Rampancy (SP?) team also based their version of the KOTH2 using triggers. However their version was compatible with bots. The ChaosUT team coded their to use hill triggers and zones (as sometimes you want to use a hill zone, other times you want a trigger). They also used Defense points and placed these defense points inside the hill trigger/zone. They did the so that you could place several defense points inside a hill trigger/zone and the bot would move from defense point to defense point to more mimic how a human might play KOTH. Finally this allowed them to handle multiple hill. You can set the defense points fortstand tag for each hill. Thus a bot wound wonder from hill to hill. Finally the ChaosUT was the only one to have a Team version of KOTH as well. The key to making it compatible with bots is base KOTH of TeamGamePlus so you can set orders for the bots. 

'''capt. k.:''' That's why I specified &quot;KOTH2&quot; in the original page title.  :)

'''Tarquin:''' I've rearranged a bit, but as I've never played this there's some blanks I can't write: a general intro to the concept, the general ideas involved in the maps, and the specifics for each version. I take it none of them are compatible with each other?

'''Jb:'''  The KOTH2 code was intergrated into Marthon Rampancy so yes those are compatabile. Saddly to say that the ChoasUT maps are not. We offered more features for the KoTH game play but we had to do things a bit different in order to add these features (Team version of KOTH, addtion of zone to mark hill areas,  a flag to allow for hill time given if the player is not alone on the hill and more control over where the bot defened including moving around on the hill). I have been looking for a way to make them compatibile but have yet to fine one :(

'''capt. k.'''  Integrated into Marathon Resurrection and otherwise reverse compatible.  I think Rampancy just builds on top of it.  I don't think there's any way to get around the dependency on KOTH2.u of maps built around it, but as triggers aren't static, one could easily do a check for KOTH2Hill actors after the map is loaded and replace with or add their own hills.

'''Jb:'''  Capt. K, good point and I know I can do that. However we use Defense points to route the bots too the hill. So I could add a defense point near the location of the KOTH2Hill Triggers that the other mods use. But I would be worried that the bots may run into issues (like would I have to rebuild the paths, putting defense points too close together may cause the bots to get stuck, ect).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For MCTF</title>
    <id>2028</id>
    <revision>
      <id>4947</id>
      <timestamp>2002-07-09T06:23:12Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>fixed multilab link</comment>
      <text xml:space="preserve">===The Multi-Team CTF Mods Available ===

There are currently 3 multi-team CTF mods available for Unreal Tournament.  These are Multi-CTF aka MCTF (CTFM maps), CTF4 (CTF4 maps), and CTF+ (CTF maps). 

* CTF+ is available on the [http://www.lathamit.co.uk/snout/ SNOUT] website but is no longer supported (well, that's the theory anyway).
* CTF4 home page: http://www.uncommonplace.com/games/ctf4.html
* MultiCTF home page: http://www.planetunreal.com/multictf 

====CTF+ ====

This mod was originally a multi-team CTF mod which later included support for a single flag mode.  Teams are selected based upon the number of [[Legacy:FlagBase|FlagBase]] objects on the map so maps with two, three, and four teams could be used within the same map rotation.  The mod contains support for up to four [[Legacy:FlagBase|FlagBase]]s, and multiple flags of the same colour.  There are other options but I forget what they are now and I'm pretty certain that the later revisions of both CTF4 and MCTF contained all of the CTF+ features (with the possible exception of dynamic teams).

====MCTF ====

This mod started out as a Last Team Standing variant of CTF with support for 4 teams.  As far as I know this is the only one of the three mods that has support for additional events and triggers.  The mod has a somewhat odd extra-time feature, support for one flag mode, and a massive number of variations on handling a team getting out and &quot;crazy options&quot; like being able to pick up your own flag or translocate with the flag.

====CTF4 ====

This mod started out as purely a mutli-team CTF mod with the ability to set the number of teams, with any flags without an owning team being removed from the game.  It now supports a host of other features (like Last Team Standing etc). CTF4 also has a large variety of scoring systems including combinations of certain systems.

===Multi-Team Mapping ===

Apart from the additional [[Legacy:FlagBase|FlagBase]]s on the map multi-team CTF is mapped in a very similar way to CTF.  As far as I know CTF4 is the only one of the three mods that implements proper alternate pathing.  Rather than set the [[Legacy:AlternatePath|AlternatePath]] Team property to the &quot;owning team&quot; it should be set to the team that the [[Legacy:AlternatePath|AlternatePath]] travels to.

The Team property of [[Legacy:FlagBase|FlagBase]] objects on the map should be set as follows:
* 0 - Red
* 1 - Blue
* 2 - Green
* 3 - Gold

You should use the following filename prefixes for your Multi-team CTF maps:
* CTFM - The map contains events and triggers specific to MCTF, and has two, three, or four flag bases, although four is encouraged.
* CTF3 - The map contains no MCTF specific map features and has three flag bases.
* CTF4 - The map contains no MCTF specific map features and has four flag bases.

^ that should be made alot clearer.
: How's that?  Not sure what you need adding. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]
:: &lt;i&gt;I suppose that does it.  The difference between &quot;has only four bases&quot; and &quot;has four bases&quot; wasn't clear.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;
:: '''Birelli:''' Actually, CTFM maps can have any number of bases, as long as there is more than one (i.e. &quot;multiple&quot; flag bases). Check out Spoon's CTFM-Obsession for an example of a CTFM map that has three teams. MCTF has full support for different numbers of teams, and does have extra-time (it's just a tad odd because of the reverse-scoring method that MCTF has (you get a point for being scored on, so when there is only one team remaining with the least number of points they win). &amp;ndash; I'm changing stuff above to reflect what I just said here.
:: '''EntropicLqd:'''  That's fine.  I wrote the MCTF and CTF4 stuff from memory based upon my last experiences with it.  Both mods have obviously moved on.  Ironically, it was these mods that really hammered home the point that more configurable features are not necessarily better.  Although (possibly) more fun for the single home user &amp;ndash; it reduces the chance of a server being started.  I'll get around to removing this discussion at some point.
:: '''Birelli:''' Yeah, I agree. More than the competition between the mods, the fact that both mods have competed agressively to have more features, more options, more replayability in botmatches has made this entire concept go down the drains with, as far as I know, 0 players online at any one point. It'd be nice to see one combined mod in UT2003. The problem is that there are serious differences in these mods. CTF4 is very offense-oriented, you must cap to win. MultiCTF is extremely defense-oriented, you can win having never seen more than the corridors leading off of your flag room and never seeing another player, for that matter, although as you defend better other teams' bots tend to attack you more. 
:: '''EntropicLqd:''' One of the biggest factors for me freezing the development of the CTF+ mod was the fact that there were other multi-team CTF mods and the community really didn't need an additional one.  It was a sad decision to make, but as I mention elsewhere, you need a lot of players to make 4 team CTF viable.  Three team works better but it was the single flag mode that really worked well - much better than I ever though it would in fact.
:: '''Birelli:''' Ah, I didn't realize you developed CTF+, I come from the perspective of running [http://www.planetunreal.com/multictf/multilab MultiLab] with Ciggie and SpoonDog, we're kind of keeping the shattered and virtually non-existent MCTF community alive you could say ;-). I love the CTF+ idea of just making as many teams as there are colors of flag in the game, Wyzard hasn't done anything in the way of even a map update himself since February and I know Excessive was willing to here talk of merging CTF4 and MCTF, so maybe UT2003 can have one united mod :-).
:: '''EntropicLqd:''' In terms of merging the CTF4 and MCTF code good luck.  We already tried to merge the CTF+, MCTF, and CTF4 code bases together but it never happened for a variety of reasons - the only visible result of the attempt was David Catmull's flag mutator.  For UT2003 I'll be doing a single flag CTF mod only, which should leave MCTF and CTF4 as the only multi-team CTF mods around.  As for the CTF+ idea of making as many teams as there are flags - you can thank the Germans for that.  A group of them specifically requested support for 3 team maps, and that was the only sensible way to add support for them.  Not that they ever made any maps.  MCTF is more than welcome to ''steal the code'' that dynamically alters the number of teams (I could probably dig out the specifics if you wanted).  But hey - maybe a feature for MCTF-UT2003.  I can't help thinking that there will be less support for multiple teams in UT2003 though.

I have seen people set the DefaultGameType property of the [[Legacy:LevelInfo|LevelInfo]] object to the specific mod they used to make the map.  I would discourage this practice as it restricts the portability of the map between the multi-team CTF mods.  Say I've downloaded CTF4-Lucius, this has a default gametype of CTF4.  If I only have CTF+ installed on my machine I will be unable to play the map - even though CTF+ will run the map without problems.

In terms of actually building multi-team CTF maps, it's worth bearing the following things in mind.
* It's worth keeping the maps fairly small.  Typically there will be fewer than 4 players on each of the teams so on large maps the action can drag a little.
* Make sure that all bases are equidistant from each other (the same distance apart).
*If you are building a map specifically for the single flag mode, then make sure the bases are hard to defend and the middle area reasonable clear and open.  The aim is for the flag to spend more time in the middle of the map than at a team's [[Legacy:FlagBase|FlagBase]].

==Related Topics ==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:GameInfo (UT)|GameInfo (UT)]]</text>
    </revision>
    <revision>
      <id>4948</id>
      <timestamp>2002-07-09T00:01:36Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===The Multi-Team CTF Mods Available ===

There are currently 3 multi-team CTF mods available for Unreal Tournament.  These are Multi-CTF aka MCTF (CTFM maps), CTF4 (CTF4 maps), and CTF+ (CTF maps). 

* CTF+ is available on the [http://www.lathamit.co.uk/snout/ SNOUT] website but is no longer supported (well, that's the theory anyway).
* CTF4 home page: http://www.uncommonplace.com/games/ctf4.html
* MultiCTF home page: http://www.planetunreal.com/multictf 

====CTF+ ====

This mod was originally a multi-team CTF mod which later included support for a single flag mode.  Teams are selected based upon the number of [[Legacy:FlagBase|FlagBase]] objects on the map so maps with two, three, and four teams could be used within the same map rotation.  The mod contains support for up to four [[Legacy:FlagBase|FlagBase]]s, and multiple flags of the same colour.  There are other options but I forget what they are now and I'm pretty certain that the later revisions of both CTF4 and MCTF contained all of the CTF+ features (with the possible exception of dynamic teams).

====MCTF ====

This mod started out as a Last Team Standing variant of CTF with support for 4 teams.  As far as I know this is the only one of the three mods that has support for additional events and triggers.  The mod has a somewhat odd extra-time feature, support for one flag mode, and a massive number of variations on handling a team getting out and &quot;crazy options&quot; like being able to pick up your own flag or translocate with the flag.

====CTF4 ====

This mod started out as purely a mutli-team CTF mod with the ability to set the number of teams, with any flags without an owning team being removed from the game.  It now supports a host of other features (like Last Team Standing etc). CTF4 also has a large variety of scoring systems including combinations of certain systems.

===Multi-Team Mapping ===

Apart from the additional [[Legacy:FlagBase|FlagBase]]s on the map multi-team CTF is mapped in a very similar way to CTF.  As far as I know CTF4 is the only one of the three mods that implements proper alternate pathing.  Rather than set the [[Legacy:AlternatePath|AlternatePath]] Team property to the &quot;owning team&quot; it should be set to the team that the [[Legacy:AlternatePath|AlternatePath]] travels to.

The Team property of [[Legacy:FlagBase|FlagBase]] objects on the map should be set as follows:
* 0 - Red
* 1 - Blue
* 2 - Green
* 3 - Gold

You should use the following filename prefixes for your Multi-team CTF maps:
* CTFM - The map contains events and triggers specific to MCTF, and has two, three, or four flag bases, although four is encouraged.
* CTF3 - The map contains no MCTF specific map features and has three flag bases.
* CTF4 - The map contains no MCTF specific map features and has four flag bases.

^ that should be made alot clearer.
: How's that?  Not sure what you need adding. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]
:: &lt;i&gt;I suppose that does it.  The difference between &quot;has only four bases&quot; and &quot;has four bases&quot; wasn't clear.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;
:: '''Birelli:''' Actually, CTFM maps can have any number of bases, as long as there is more than one (i.e. &quot;multiple&quot; flag bases). Check out Spoon's CTFM-Obsession for an example of a CTFM map that has three teams. MCTF has full support for different numbers of teams, and does have extra-time (it's just a tad odd because of the reverse-scoring method that MCTF has (you get a point for being scored on, so when there is only one team remaining with the least number of points they win). &amp;ndash; I'm changing stuff above to reflect what I just said here.
:: '''EntropicLqd:'''  That's fine.  I wrote the MCTF and CTF4 stuff from memory based upon my last experiences with it.  Both mods have obviously moved on.  Ironically, it was these mods that really hammered home the point that more configurable features are not necessarily better.  Although (possibly) more fun for the single home user &amp;ndash; it reduces the chance of a server being started.  I'll get around to removing this discussion at some point.
:: '''Birelli:''' Yeah, I agree. More than the competition between the mods, the fact that both mods have competed agressively to have more features, more options, more replayability in botmatches has made this entire concept go down the drains with, as far as I know, 0 players online at any one point. It'd be nice to see one combined mod in UT2003. The problem is that there are serious differences in these mods. CTF4 is very offense-oriented, you must cap to win. MultiCTF is extremely defense-oriented, you can win having never seen more than the corridors leading off of your flag room and never seeing another player, for that matter, although as you defend better other teams' bots tend to attack you more. 
:: '''EntropicLqd:''' One of the biggest factors for me freezing the development of the CTF+ mod was the fact that there were other multi-team CTF mods and the community really didn't need an additional one.  It was a sad decision to make, but as I mention elsewhere, you need a lot of players to make 4 team CTF viable.  Three team works better but it was the single flag mode that really worked well - much better than I ever though it would in fact.
:: '''Birelli:''' Ah, I didn't realize you developed CTF+, I come from the perspective of running [[http://www.planetunreal.com/multictf/multilab|MultiLab]] with Ciggie and SpoonDog, we're kind of keeping the shattered and virtually non-existent MCTF community alive you could say ;-). I love the CTF+ idea of just making as many teams as there are colors of flag in the game, Wyzard hasn't done anything in the way of even a map update himself since February and I know Excessive was willing to here talk of merging CTF4 and MCTF, so maybe UT2003 can have one united mod :-).

I have seen people set the DefaultGameType property of the [[Legacy:LevelInfo|LevelInfo]] object to the specific mod they used to make the map.  I would discourage this practice as it restricts the portability of the map between the multi-team CTF mods.  Say I've downloaded CTF4-Lucius, this has a default gametype of CTF4.  If I only have CTF+ installed on my machine I will be unable to play the map - even though CTF+ will run the map without problems.

In terms of actually building multi-team CTF maps, it's worth bearing the following things in mind.
* It's worth keeping the maps fairly small.  Typically there will be fewer than 4 players on each of the teams so on large maps the action can drag a little.
* Make sure that all bases are equidistant from each other (the same distance apart).
*If you are building a map specifically for the single flag mode, then make sure the bases are hard to defend and the middle area reasonable clear and open.  The aim is for the flag to spend more time in the middle of the map than at a team's [[Legacy:FlagBase|FlagBase]].

==Related Topics ==
* [[Legacy:Gametype|Gametype]]
* [[Legacy:GameInfo (UT)|GameInfo (UT)]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Monster Hunt</title>
    <id>2029</id>
    <revision>
      <id>4949</id>
      <timestamp>2007-01-29T21:03:49Z</timestamp>
      <contributor>
        <ip>Adsl-68-255-75-144.dsl.lgtpmi.ameritech.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">You can download Monsterhunt from http://www.thegamebox.net/files/Unreal_Tournament/Mods/monsterhunt500.zip

===Mapping For Monster Hunt===

===Taken From The Creators Website (Now Down)===

====Tips For Creating a Succesful MH map====

*Before you start on a map, open the MonsterHunt.u package in the class-browser so you have access to all the Monster Hunt-specific stuff. 

*Maps should be more of a single player style, but make sure there are enough pickups for all the players and that there's enough space for a group of players to move around in.
 
*Boss monsters should be in large spacious areas, the players must be able to concentrate on defeating the monsters and not have to worry about the surrounding architecture. 

*Make an escape route for the players to run through and place a MonsterEnd trigger (found in the classe-browser: Triggers -&gt; Trigger -&gt; MonsterEnd) where the players will run to end the level. 

*If you want to add bot support to your map (very highly recommended), you can use the MonsterWaypoint actor (found in the classe-browser: Keypoint -&gt; MonsterWaypoint). Just put the MonsterWaypoint actors wherever you want a bot waypoint to be, like near a button or a lever, or just along the path through the level. Set it's Position property to tell the bots in which order the waypoints must be visited. Set the first one at 1, the next at 2, then 3, and so on. You can also enter the Event tag of a particular actor so when the bot gets to the waypoint, something can be triggered to happen.
 
*Be sure to add lots of PlayerStarts at the beginning of the level to make sure the players don't telefrag each other when the round starts - about 12-18 will be enough for a normal size map. 

*You can implement simple puzzles for the players to solve along the way, but don't use too many as players will probably get frustrated. 

*Feel free to use as many special effects as you like, in this style of game, the players will really take note an think &quot;How'd they do that???&quot; :-) 

*Remember that there is no Translocator, so don't make any situations where it's needed to progress. 

*The difficulty of the map is important, start with relatively weak monsters and as players progress through the level, use stronger and stronger enemies. 

*Make sure your Boss monster is pretty strong, players will be disappointed it only takes a few shots to kill it. 

*Don't put any monsters near to where the players will start, they'll all be slaughtered as soon as they spawn.
 
*Environmental hazzards (slime, lava, huge drops, etc.) are great, but make sure the boss monster(s) can't fall in, or it'll spoil the fun of defeating them. 

*Don't give the players the best guns at the beginning, or they'll mow through the monsters too easily. 

*Use the MonsterEvent (under Triggers &gt; SpecialEvent) to display messages for the players, everything has already been pre-configured, just type the message and connect it to a trigger. 

*Set the boss monster's bIsBoss to True so the player can get extra points for killing him. 

DOWNLOAD HERE: http://browse.files.filefront.com/Unreal+Tournament+Modifications+Monster+Hunt/;1351805;/browsefiles.html

----

See also [[Legacy:Monster Arena Mapping|Monster Arena Mapping]]

----

====Category====
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4950</id>
      <timestamp>2004-12-19T16:18:14Z</timestamp>
      <contributor>
        <ip>ACBE8A2B.ipt.aol.com</ip>
      </contributor>
      <comment>added category classes</comment>
      <text xml:space="preserve">You can download Monsterhunt from http://www.thegamebox.net/files/Unreal_Tournament/Mods/monsterhunt500.zip

===Mapping For Monster Hunt===

===Taken From The Creators Website (Now Down)===

====Tips For Creating a Succesful MH map====

*Before you start on a map, open the MonsterHunt.u package in the class-browser so you have access to all the Monster Hunt-specific stuff. 

*Maps should be more of a single player style, but make sure there are enough pickups for all the players and that there's enough space for a group of players to move around in.
 
*Boss monsters should be in large spacious areas, the players must be able to concentrate on defeating the monsters and not have to worry about the surrounding architecture. 

*Make an escape route for the players to run through and place a MonsterEnd trigger (found in the classe-browser: Triggers -&gt; Trigger -&gt; MonsterEnd) where the players will run to end the level. 

*If you want to add bot support to your map (very highly recommended), you can use the MonsterWaypoint actor (found in the classe-browser: Keypoint -&gt; MonsterWaypoint). Just put the MonsterWaypoint actors wherever you want a bot waypoint to be, like near a button or a lever, or just along the path through the level. Set it's Position property to tell the bots in which order the waypoints must be visited. Set the first one at 1, the next at 2, then 3, and so on. You can also enter the Event tag of a particular actor so when the bot gets to the waypoint, something can be triggered to happen.
 
*Be sure to add lots of PlayerStarts at the beginning of the level to make sure the players don't telefrag each other when the round starts - about 12-18 will be enough for a normal size map. 

*You can implement simple puzzles for the players to solve along the way, but don't use too many as players will probably get frustrated. 

*Feel free to use as many special effects as you like, in this style of game, the players will really take note an think &quot;How'd they do that???&quot; :-) 

*Remember that there is no Translocator, so don't make any situations where it's needed to progress. 

*The difficulty of the map is important, start with relatively weak monsters and as players progress through the level, use stronger and stronger enemies. 

*Make sure your Boss monster is pretty strong, players will be disappointed it only takes a few shots to kill it. 

*Don't put any monsters near to where the players will start, they'll all be slaughtered as soon as they spawn.
 
*Environmental hazzards (slime, lava, huge drops, etc.) are great, but make sure the boss monster(s) can't fall in, or it'll spoil the fun of defeating them. 

*Don't give the players the best guns at the beginning, or they'll mow through the monsters too easily. 

*Use the MonsterEvent (under Triggers &gt; SpecialEvent) to display messages for the players, everything has already been pre-configured, just type the message and connect it to a trigger. 

*Set the boss monster's bIsBoss to True so the player can get extra points for killing him. 

----

See also [[Legacy:Monster Arena Mapping|Monster Arena Mapping]]

----

====Category====
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For ONS</title>
    <id>2156</id>
    <revision>
      <id>5249</id>
      <timestamp>2006-04-06T22:20:09Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">In '''Onslaught''' (ONS) two teams compete to build a chain of Power Nodes from their Power Core to the other team's Power Core whereapon it can be attacked.  The game ends when one of the Power Cores has been destroyed.  The game restricts the Power Nodes that can be attacked by linking them together in a specific structure.  Onslaught also makes extensive use of vehicles.

==Fundamentals==

To create an onslaught map, the absolute minimum is to have two powercores, spawn points for two players, and you must set the DefaultGameType in LevelInfo to &lt;tt&gt;Onslaught.ONSOnslaughtGame&lt;/tt&gt;.  Without these conditions the game will not apply the necessary rules for the game to work.

==Map size==

Onslaught maps are typically outdoor environments and as such are much larger than maps for the other gametypes.  The smallest Onslaught map is probably around the same size as the largest Capture the Flag or Bombing Run map.  The gametype supports these large maps in the following ways.
* Combat is concentrated around around Power Nodes.  In general only one or two Power Nodes will be attackable at any one time.
* Players can teleport between Power Nodes their team controls and their base as long as the Power Node is not under attack.  This allows rapid travel across the map.
* Players can spawn at any Power Node their team controls as long as it is not under attack.  This allows a ''moving front'' to be developed.
* Vehicles allow players to cover ground much faster than they can on foot.

Given the size of the map, ensuring the map is optimised well and has a good framerate thoughout becomes much more important.

==Use of the Z-Axis==

Making effective use of the [[Legacy:Z-Axis|Z-Axis]] within Onslaught maps is very difficult.  The map showing the Power Node locations is a purely 2D construction and provides no clues as to the height of a Power Node.  Having to work in an additional axis will generally mean that the map is not as instantly accessable as it otherwise might have been.

Slopes, hills, and mountains are all good things to have in your map.  Not only do they help provide the map with some crucial variation, but they can also aid map optimisation. 

Avoid excessive use of ''thin paths across instant death precipices''.  These can make vehicles almost useless in sections of your map.  Also some vehicles don't handle that well close to an ''edge''.

==Power Node placement==

The location of the Power Nodes on the map is one of the crucial factors to how fast or slow your map will play.  Maps that are sparsely populated with Power Nodes will feel much larger than they perhaps are in reality, and the pace of the game will be reduced as a consequence.

Remember, the farther apart the Power Nodes are from each other the longer it will take players to travel between them.  Spare a thought for the foot solider.  A player who finds himself spawning at a Power Node or Power Core with no available vehicles has two choices.  Wait for a vehicle to spawn or start running.  Ideally the jog to the next Power Node shouldn't be too long.  ONS-Torlan has the Power Node distances about right whereas the foot solider on ONS-Dria is in for a long and dull walk.

Each Power Node should have its own set of player spawn points.  These spawn points should be spread evenly around the node.  Place them such that newly spawning players can easily get to either a vehicle or a weapon locker (preferably both).

===Avenues of attack===

It is very easy to make a Power Node extremely difficult to hold once it is controlled.  The hovering energy sphere that each Power Node has can be used as a target from a significant distance.  Use slopes, trees, and other features to restrict the angles and distance from which the Power Node's energy sphere can be attacked.

It's also worth considering adding shortcuts for players on foot that are not available to players in vehicles to add additional tactical considerations to the map &amp;ndash; or simply to reudce the amount of time spent running to a Power Node.

===Link setup===

To design the various Link Setups for the map, play the map and in-game, hit ESC to bring up the menu.  Then click on Link Designer.  The nodes and cores that have been placed should be seen on the map and a link setup can be made and saved.

The way in which the Power Nodes are linked together can radically alter the gameplay of the map.  This happens for two reasons.
* The path that must be followed to traverse the map (link one base to the other) is determined by the link setup.
* The vehicles and weapons available to teams is based upon the nodes captured.

An example of this is linking the ''tank node'' on ONS-Torlan with a teams base rather than the primary Power Node.  This has the effect of allowing a 2 front attack on the primary node making it significantly harder to control.  It also means a tank is always available to both teams.

Typically only one or two Power Nodes will link directly to a Power Core although the actual number is really determined by the map design.  Having many links to the Power Core can dilute the pace of the game though so be careful when doing it.

Try and avoid having a single node in the center of the map acting as a choke point linked to from more than two nodes unless there is a significant chance that the node can be held long enough for one of the teams to advance.  ONS-Primeval is a good example of this.  Without the tank at the central node it would be impossible to hold it long enough to mount any sort of attack on either the next node or the Power Core.

Consider creating link setups that allow a team to isolate an enemy power node.  ONS-Dawn is a good example of this.  If one team is building the power node on one side of their enemies base the other team can work their way down the other side of the map and then cut across in the center of the map.  By holding the two central nodes they have isolated a node and are in a good position to mount an attack themselves.  Having these sorts of outflanking manoeuvers available to teams can add significant depth and replayability to a map.

==Vehicles Overview==

There are the stock vehicles that came with the original release of UT2004:
* Raptors are excellent against land and air targets but in a sky full of Avrils they won't last too long.  They can be a very quick way of getting from A to B as they are not tied to the terrain unlike the rest of the vehicles.
* Tanks are powerful and slow moving.  Use their lack of speed to offset their devastating firepower.  The vertical angle at which the primary tank gun can aim is restricted so Tanks can be disadvantaged when travelling on slopes.
* Hellbenders are a good way of moving a bunch of people around quickly, and are excellent at  destroying infantry.  Put them up against a tank and they won't last too long.
* Scorpions are reasonably fast and can be an inconvenience to soldiers on foot.  They are good for taking out Power Nodes and Mantas.  A fully charged ''bola'' does a suprising amount of damage.
* Mantas are a very fast way of getting around, but get killed easily.  They are excellent against Tanks without Avril support.  The Manta's primary fire is an excellent way of taking out Power Nodes from a long distance.  They are also good for squishing players on foot.
* Leviathans are very big, very powerful, and very slow.  A fully manned Leviathan is quite fearsome - when it eventually arrives.

Additionally, there are ECE (Editor's Choice Edition) vehicles. These vehicles are considered stock by the community and so you should not ignore them. Most new maps these days include ECE vehicles.
* Cicadas are the most powerful weapon for taking down a node, and are not nearly as good at other things. They can take down tanks and Levis faster than any other vehicle, when used by expert pilots, but it is more risky than using a Raptor to do so if the enemy team has Raptors of their own in the sky protecting their tanks and Levis. Raptors can easily take down Cicadas. Almost all pilots have a very tough time killing ground troops with Cicadas (because it is HARD especially with higher pings).
* SPMAs are great for shelling contested nodes near the center. They are sometimes placed in such a way as to defend the enemy's primary node once it has been captured, which is an acceptable use of them. But you should avoid placing them in such a way as to suggest their use in spawn killing the losing team at their power core. That is not fun for the losing team and players will hate your map.
* Paladins are for defense. Defense! Got it? They are for shielding nodes and killing nearby attackers. They are NOT for cross country rides to grandmother's house.

==Vehicle Placement==

The golden rule here is balance.  Your vehicle placement is the PRIMARY way in which you can directly affect how much power the winning team has against the losing team. Generally each Power Node will have between 2 and 4 vehicles associated with it.  The larger the map the more vehicles will be needed as travelling between Power Nodes on foot becomes less attractive and less effective.

For making maps that really shine in gameplay, and support the kinds of strategies and tactics experienced ONS players would like to use, follow these tips:
* Try to limit the placements of tanks. Prefer to place them in the base AND/OR at a central contested node. Avoid placing tanks at other nodes as this generally gives the winning team too much of advantage over the losing team.
* A similar reasoning applies to Leviathans. They are best placed at each power core OR at a single central contested node (but not both). Giving the winning team more than one Leviathan is a BAD idea.
* Paladins are slow and vulnerable critters. But they make excellent defense vehicles for nodes. Not only can they sheild the node, but they can even kill ground troops that get close by using the Paladin combo (while sheild is up, press fire to make a local shockwave for personal defense). Place Paladins ONLY at or near primary or secondary nodes. Do not place them at a node that is far away from the nodes they would be useful to defend. Avoid placing them at the power core, unless it is a short drive to the primary node.
* Avoid placing Mantas all over the map at various nodes. Giving the winning team a hell of a lot of Mantas is a bad thing. It makes it nearly impossible for the losing team to make a comeback when they are constantly being roadkilled, and every time they get their primary node back up, 5 mantas attack it again. Prefer to put 2 or 3 Mantas at each power core, and a sparse number at various nodes throughout the map.
* Scorpians are great for taking out tanks, as well as mantas in narrow channels. You may wish to place them with these goals in mind to help the losing team fight back.
* The Raptor is the most versitile vehicle of the lot. It can be used to take out enemy aircraft (both Raptors and Cicadas), sniff out enemy snipers and campers hiding in trees and rubble, kill tanks, Levis, Mantas, and so on. In fact, the best use of the Raptor is as a predator of other vehicles (thus its name). There really is no substitute for this. Cicadas are NOT good replacements for Raptors (why? because enemy Raptors 'eat Cicadas for lunch.'). Do not think placing a Cicada at the power core will be sufficient. You should always have at least one Raptor there. This gives a losing team at least some chance of fighting off the tanks and Levis that are slaughtering them, and makes the game more interesting and comeback-possible.

See also [[Legacy:Vehicle Gameplay|Vehicle Gameplay]].

==Weapon Placement==
* At the Power Core make sure there is a good mix of hitscan and projectile weapons.  There's nothing worse than trying to take back a Primary Node only to find that your best weapon is the short range Flak Cannon (Remember that the Link gun is much more important in Onslaught than in many other, if not all, gametypes). 
* The Weapon Lockers at each Power Node should contain a different selection of weapons.  As with the Power Core a mix of hitscan and projectile weapons is preferred.
* A ''full'' Weapon Locker can be collected by any player at any time irrespective of whether it is next to a Power Node controlled by the other team.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]].

==Map Checklist==
* Have you set up the Power Node network?  Hit ESC in game and click on the Link Designer.
* Do you have any vehicles spawning at a Power Node that are facing the wrong way for one team but the right way for another?
* Can you reliably teleport between all of the Power Nodes - arriving at the Power Node you expect (odd things can happen if ''node areas'' overlap).
* Do you wishto ship more than one Power Node setup with your map?
* Show level properties.  Make sure LevelInfo.DefaultGameType is set to &lt;tt&gt;Onslaught.ONSOnslaughtGame&lt;/tt&gt;.

==External Links (Tutorials)==
* [http://www.psyonix.com/OnslaughtMapTutorial.shtml Onslaught Tutorial] from psyonix.com
* [http://angelmapper.com/tutorials/onslaught.htm Onslaught Tutorial] from angelmapper.com

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Pathing For Vehicles|Pathing for Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''Tarquin:''' how do you define the power node network, and how do you ship alternatives? this article should link to relevant information, eg actor classes

'''Sweavo:''' pasted an external link to some of that info.  It should be assimilated into here though I think.

'''enDLine.SPA:''' you have to play your map, hit esc to bring up the hud and click the map tab, then click link deisgner in the lower right. I also added an external link to Angel Mappers Onslaught Tutorial.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5250</id>
      <timestamp>2006-04-06T21:06:49Z</timestamp>
      <contributor>
        <ip>Wsu195-153.ctelco.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">In '''Onslaught''' (ONS) two teams compete to build a chain of Power Nodes from their Power Core to the other team's Power Core whereapon it can be attacked.  The game ends when one of the Power Cores has been destroyed.  The game restricts the Power Nodes that can be attacked by linking them together in a specific structure.  Onslaught also makes extensive use of vehicles.

==Fundamentals==

To create an onslaught map, the absolute minimum is to have two powercores, spawn points for two players, and you must set the DefaultGameType in LevelInfo to &lt;tt&gt;Onslaught.ONSOnslaughtGame&lt;/tt&gt;.  Without these conditions the game will not apply the necessary rules for the game to work.

==Map size==

Onslaught maps are typically outdoor environments and as such are much larger than maps for the other gametypes.  The smallest Onslaught map is probably around the same size as the largest Capture the Flag or Bombing Run map.  The gametype supports these large maps in the following ways.
* Combat is concentrated around around Power Nodes.  In general only one or two Power Nodes will be attackable at any one time.
* Players can teleport between Power Nodes their team controls and their base as long as the Power Node is not under attack.  This allows rapid travel across the map.
* Players can spawn at any Power Node their team controls as long as it is not under attack.  This allows a ''moving front'' to be developed.
* Vehicles allow players to cover ground much faster than they can on foot.

Given the size of the map, ensuring the map is optimised well and has a good framerate thoughout becomes much more important.

==Use of the Z-Axis==

Making effective use of the [[Legacy:Z-Axis|Z-Axis]] within Onslaught maps is very difficult.  The map showing the Power Node locations is a purely 2D construction and provides no clues as to the height of a Power Node.  Having to work in an additional axis will generally mean that the map is not as instantly accessable as it otherwise might have been.

Slopes, hills, and mountains are all good things to have in your map.  Not only do they help provide the map with some crucial variation, but they can also aid map optimisation. 

Avoid excessive use of ''thin paths across instant death precipices''.  These can make vehicles almost useless in sections of your map.  Also some vehicles don't handle that well close to an ''edge''.

==Power Node placement==

The location of the Power Nodes on the map is one of the crucial factors to how fast or slow your map will play.  Maps that are sparsely populated with Power Nodes will feel much larger than they perhaps are in reality, and the pace of the game will be reduced as a consequence.

Remember, the farther apart the Power Nodes are from each other the longer it will take players to travel between them.  Spare a thought for the foot solider.  A player who finds himself spawning at a Power Node or Power Core with no available vehicles has two choices.  Wait for a vehicle to spawn or start running.  Ideally the jog to the next Power Node shouldn't be too long.  ONS-Torlan has the Power Node distances about right whereas the foot solider on ONS-Dria is in for a long and dull walk.

Each Power Node should have its own set of player spawn points.  These spawn points should be spread evenly around the node.  Place them such that newly spawning players can easily get to either a vehicle or a weapon locker (preferably both).

===Avenues of attack===

It is very easy to make a Power Node extremely difficult to hold once it is controlled.  The hovering energy sphere that each Power Node has can be used as a target from a significant distance.  Use slopes, trees, and other features to restrict the angles and distance from which the Power Node's energy sphere can be attacked.

It's also worth considering adding shortcuts for players on foot that are not available to players in vehicles to add additional tactical considerations to the map &amp;ndash; or simply to reudce the amount of time spent running to a Power Node.

===Link setup===

To design the various Link Setups for the map, play the map and in-game, hit ESC to bring up the menu.  Then click on Link Designer.  The nodes and cores that have been placed should be seen on the map and a link setup can be made and saved.

The way in which the Power Nodes are linked together can radically alter the gameplay of the map.  This happens for two reasons.
* The path that must be followed to traverse the map (link one base to the other) is determined by the link setup.
* The vehicles and weapons available to teams is based upon the nodes captured.

An example of this is linking the ''tank node'' on ONS-Torlan with a teams base rather than the primary Power Node.  This has the effect of allowing a 2 front attack on the primary node making it significantly harder to control.  It also means a tank is always available to both teams.

Typically only one or two Power Nodes will link directly to a Power Core although the actual number is really determined by the map design.  Having many links to the Power Core can dilute the pace of the game though so be careful when doing it.

Try and avoid having a single node in the center of the map acting as a choke point linked to from more than two nodes unless there is a significant chance that the node can be held long enough for one of the teams to advance.  ONS-Primeval is a good example of this.  Without the tank at the central node it would be impossible to hold it long enough to mount any sort of attack on either the next node or the Power Core.

Consider creating link setups that allow a team to isolate an enemy power node.  ONS-Dawn is a good example of this.  If one team is building the power node on one side of their enemies base the other team can work their way down the other side of the map and then cut across in the center of the map.  By holding the two central nodes they have isolated a node and are in a good position to mount an attack themselves.  Having these sorts of outflanking manoeuvers available to teams can add significant depth and replayability to a map.

==Vehicles Overview==

There are the stock vehicles that came with the original release of UT2004:
* Raptors are excellent against land and air targets but in a sky full of Avrils they won't last too long.  They can be a very quick way of getting from A to B as they are not tied to the terrain unlike the rest of the vehicles.
* Tanks are powerful and slow moving.  Use their lack of speed to offset their devastating firepower.  The vertical angle at which the primary tank gun can aim is restricted so Tanks can be disadvantaged when travelling on slopes.
* Hellbenders are a good way of moving a bunch of people around quickly, and are excellent at  destroying infantry.  Put them up against a tank and they won't last too long.
* Scorpions are reasonably fast and can be an inconvenience to soldiers on foot.  They are good for taking out Power Nodes and Mantas.  A fully charged ''bola'' does a suprising amount of damage.
* Mantas are a very fast way of getting around, but get killed easily.  They are excellent against Tanks without Avril support.  The Manta's primary fire is an excellent way of taking out Power Nodes from a long distance.  They are also good for squishing players on foot.
* Leviathans are very big, very powerful, and very slow.  A fully manned Leviathan is quite fearsome - when it eventually arrives.

Additionally, there are ECE (Editor's Choice Edition) vehicles. These vehicles are considered stock by the community and so you should not ignore them. Most new maps these days include ECE vehicles.
* Cicadas are the most powerful weapon for taking down a node, and are not nearly as good at other things. They can take down tanks and Levis faster than any other vehicle, when used by expert pilots, but it is more risky than using a Raptor to do so if the enemy team has Raptors of their own in the sky protecting their tanks and Levis. Raptors can easily take down Cicadas. Almost all pilots have a very tough time killing ground troops with Cicadas (because it is HARD especially with higher pings).
* SPMAs are great for shelling contested nodes near the center. They are sometimes placed in such a way as to defend the enemy's primary node once it has been captured, which is an acceptable use of them. But you should avoid placing them in such a way as to suggest their use in spawn killing the losing team at their power core. That is not fun for the losing team and players will hate your map.
* Paladins are for defense. Defense! Got it? They are for shielding nodes and killing nearby attackers. They are NOT for cross country rides to grandmother's house.

==Vehicle Placement==

The golden rule here is balance.  Your vehicle placement is the PRIMARY way in which you can directly affect how much power the winning team has against the losing team. Generally each Power Node will have between 2 and 4 vehicles associated with it.  The larger the map the more vehicles will be needed as travelling between Power Nodes on foot becomes less attractive and less effective.

For making maps that really shine in gameplay, and support the kinds of strategies and tactics experienced ONS players would like to use, follow these tips:
* Try to limit the placements of tanks. Prefer to place them in the base AND/OR at a central contested node. Avoid placing tanks at other nodes as this generally gives the winning team too much of advantage over the losing team.
* A similar reasoning applies to Leviathans. They are best placed at each power core OR at a single central contested node (but not both). Giving the winning team more than one Leviathan is a BAD idea.
* Paladins are slow and vulnerable critters. But they make excellent defense vehicles for nodes. Not only can they sheild the node, but they can even kill ground troops that get close by using the Paladin combo (while sheild is up, press fire to make a local shockwave for personal defense). Place Paladins ONLY at or near primary or secondary nodes. Do not place them at a node that is far away from the nodes they would be useful to defend. Avoid placing them at the power core, unless it is a short drive to the primary node.
* Avoid placing Mantas all over the map at various nodes. Giving the winning team a hell of a lot of Mantas is a bad thing. It makes it nearly impossible for the losing team to make a comeback when they are constantly being roadkilled, and every time they get their primary node back up, 5 mantas attack it again. Prefer to put 2 or 3 Mantas at each power core, and a sparse number at various nodes throughout the map.
* Scorpians are great for taking out tanks, as well as mantas in narrow channels. You may wish to place them with these goals in mind to help the losing team fight back.
* The Raptor is the most versitile vehicle of the lot. It can be used to take out enemy aircraft (both Raptors and Cicadas), sniff out enemy snipers and campers hiding in trees and rubble, kill tanks, Levis, Mantas, and so on. In fact, the best use of the Raptor is as a predator of other vehicles (thus its name). There really is no substitute for this. Cicadas are NOT good replacements for Raptors (why? because enemy Raptors 'eat Cicadas for lunch.'). Do not think placing a Cicada at the power core will be sufficient. You should always have at least one Raptor there. This gives a losing team at least some chance of fighting off the tanks and Levis that are slaughtering them, and makes the game more interesting and comeback-possible.

See also [[Legacy:Vehicle Gameplay|Vehicle Gameplay]].

==Weapon Placement==
* At the Power Core make sure there is a good mix of hitscan and projectile weapons.  There's nothing worse than trying to take back a Primary Node only to find that your best weapon is the short range Flak Cannon (Remember that the Link gun is much more important in Onslaught than in many other, if not all, gametypes). 
* The Weapon Lockers at each Power Node should contain a different selection of weapons.  As with the Power Core a mix of hitscan and projectile weapons is preferred.
* A ''full'' Weapon Locker can be collected by any player at any time irrespective of whether it is next to a Power Node controlled by the other team.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]].

==Map Checklist==
* Have you set up the Power Node network?  Hit ESC in game and click on the Link Designer.
* Do you have any vehicles spawning at a Power Node that are facing the wrong way for one team but the right way for another?
* Can you reliably teleport between all of the Power Nodes - arriving at the Power Node you expect (odd things can happen if ''node areas'' overlap).
* Do you wishto ship more than one Power Node setup with your map?
* Show level properties.  Make sure LevelInfo.DefaultGameType is set to &lt;tt&gt;Onslaught.ONSOnslaughtGame&lt;/tt&gt;.

==External Links (Tutorials)==
* [http://www.psyonix.com/OnslaughtMapTutorial.shtml Onslaught Tutorial] from psyonix.com
* [http://angelmapper.com/tutorials/onslaught.htm Onslaught Tutorial] from angelmapper.com

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Pathing For Vehicles|Pathing for Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''Tarquin:''' how do you define the power node network, and how do you ship alternatives? this article should link to relevant information, eg actor classes

'''Sweavo:''' pasted an external link to some of that info.  It should be assimilated into here though I think.

'''enDLine.SPA:''' you have to play your map, hit esc to bring up the hud and click the map tab, then click link deisgner in the lower right. I also added an external link to Angel Mappers Onslaught Tutorial.

----

[[:Category:Legacy Mapping]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34029</id>
      <timestamp>2009-02-13T01:48:18Z</timestamp>
      <contributor>
        <username>SuperApe</username>
        <id>96</id>
      </contributor>
      <minor/>
      <comment>link fix</comment>
      <text xml:space="preserve">In '''Onslaught''' (ONS) two teams compete to build a chain of Power Nodes from their Power Core to the other team's Power Core whereapon it can be attacked.  The game ends when one of the Power Cores has been destroyed.  The game restricts the Power Nodes that can be attacked by linking them together in a specific structure.  Onslaught also makes extensive use of vehicles.

==Fundamentals==

To create an onslaught map, the absolute minimum is to have two powercores, spawn points for two players, and you must set the DefaultGameType in LevelInfo to &lt;tt&gt;Onslaught.ONSOnslaughtGame&lt;/tt&gt;.  Without these conditions the game will not apply the necessary rules for the game to work.

==Map size==

Onslaught maps are typically outdoor environments and as such are much larger than maps for the other gametypes.  The smallest Onslaught map is probably around the same size as the largest Capture the Flag or Bombing Run map.  The gametype supports these large maps in the following ways.
* Combat is concentrated around around Power Nodes.  In general only one or two Power Nodes will be attackable at any one time.
* Players can teleport between Power Nodes their team controls and their base as long as the Power Node is not under attack.  This allows rapid travel across the map.
* Players can spawn at any Power Node their team controls as long as it is not under attack.  This allows a ''moving front'' to be developed.
* Vehicles allow players to cover ground much faster than they can on foot.

Given the size of the map, ensuring the map is optimised well and has a good framerate thoughout becomes much more important.

==Use of the Z-Axis==

Making effective use of the [[Legacy:Z-Axis|Z-Axis]] within Onslaught maps is very difficult.  The map showing the Power Node locations is a purely 2D construction and provides no clues as to the height of a Power Node.  Having to work in an additional axis will generally mean that the map is not as instantly accessable as it otherwise might have been.

Slopes, hills, and mountains are all good things to have in your map.  Not only do they help provide the map with some crucial variation, but they can also aid map optimisation. 

Avoid excessive use of ''thin paths across instant death precipices''.  These can make vehicles almost useless in sections of your map.  Also some vehicles don't handle that well close to an ''edge''.

==Power Node placement==

The location of the Power Nodes on the map is one of the crucial factors to how fast or slow your map will play.  Maps that are sparsely populated with Power Nodes will feel much larger than they perhaps are in reality, and the pace of the game will be reduced as a consequence.

Remember, the farther apart the Power Nodes are from each other the longer it will take players to travel between them.  Spare a thought for the foot solider.  A player who finds himself spawning at a Power Node or Power Core with no available vehicles has two choices.  Wait for a vehicle to spawn or start running.  Ideally the jog to the next Power Node shouldn't be too long.  ONS-Torlan has the Power Node distances about right whereas the foot solider on ONS-Dria is in for a long and dull walk.

Each Power Node should have its own set of player spawn points.  These spawn points should be spread evenly around the node.  Place them such that newly spawning players can easily get to either a vehicle or a weapon locker (preferably both).

===Avenues of attack===

It is very easy to make a Power Node extremely difficult to hold once it is controlled.  The hovering energy sphere that each Power Node has can be used as a target from a significant distance.  Use slopes, trees, and other features to restrict the angles and distance from which the Power Node's energy sphere can be attacked.

It's also worth considering adding shortcuts for players on foot that are not available to players in vehicles to add additional tactical considerations to the map &amp;ndash; or simply to reudce the amount of time spent running to a Power Node.

===Link setup===

To design the various Link Setups for the map, play the map and in-game, hit ESC to bring up the menu.  Then click on Link Designer.  The nodes and cores that have been placed should be seen on the map and a link setup can be made and saved.

The way in which the Power Nodes are linked together can radically alter the gameplay of the map.  This happens for two reasons.
* The path that must be followed to traverse the map (link one base to the other) is determined by the link setup.
* The vehicles and weapons available to teams is based upon the nodes captured.

An example of this is linking the ''tank node'' on ONS-Torlan with a teams base rather than the primary Power Node.  This has the effect of allowing a 2 front attack on the primary node making it significantly harder to control.  It also means a tank is always available to both teams.

Typically only one or two Power Nodes will link directly to a Power Core although the actual number is really determined by the map design.  Having many links to the Power Core can dilute the pace of the game though so be careful when doing it.

Try and avoid having a single node in the center of the map acting as a choke point linked to from more than two nodes unless there is a significant chance that the node can be held long enough for one of the teams to advance.  ONS-Primeval is a good example of this.  Without the tank at the central node it would be impossible to hold it long enough to mount any sort of attack on either the next node or the Power Core.

Consider creating link setups that allow a team to isolate an enemy power node.  ONS-Dawn is a good example of this.  If one team is building the power node on one side of their enemies base the other team can work their way down the other side of the map and then cut across in the center of the map.  By holding the two central nodes they have isolated a node and are in a good position to mount an attack themselves.  Having these sorts of outflanking manoeuvers available to teams can add significant depth and replayability to a map.

==Vehicles Overview==

There are the stock vehicles that came with the original release of UT2004:
* Raptors are excellent against land and air targets but in a sky full of Avrils they won't last too long.  They can be a very quick way of getting from A to B as they are not tied to the terrain unlike the rest of the vehicles.
* Tanks are powerful and slow moving.  Use their lack of speed to offset their devastating firepower.  The vertical angle at which the primary tank gun can aim is restricted so Tanks can be disadvantaged when travelling on slopes.
* Hellbenders are a good way of moving a bunch of people around quickly, and are excellent at  destroying infantry.  Put them up against a tank and they won't last too long.
* Scorpions are reasonably fast and can be an inconvenience to soldiers on foot.  They are good for taking out Power Nodes and Mantas.  A fully charged ''bola'' does a suprising amount of damage.
* Mantas are a very fast way of getting around, but get killed easily.  They are excellent against Tanks without Avril support.  The Manta's primary fire is an excellent way of taking out Power Nodes from a long distance.  They are also good for squishing players on foot.
* Leviathans are very big, very powerful, and very slow.  A fully manned Leviathan is quite fearsome - when it eventually arrives.

Additionally, there are ECE (Editor's Choice Edition) vehicles. These vehicles are considered stock by the community and so you should not ignore them. Most new maps these days include ECE vehicles.
* Cicadas are the most powerful weapon for taking down a node, and are not nearly as good at other things. They can take down tanks and Levis faster than any other vehicle, when used by expert pilots, but it is more risky than using a Raptor to do so if the enemy team has Raptors of their own in the sky protecting their tanks and Levis. Raptors can easily take down Cicadas. Almost all pilots have a very tough time killing ground troops with Cicadas (because it is HARD especially with higher pings).
* SPMAs are great for shelling contested nodes near the center. They are sometimes placed in such a way as to defend the enemy's primary node once it has been captured, which is an acceptable use of them. But you should avoid placing them in such a way as to suggest their use in spawn killing the losing team at their power core. That is not fun for the losing team and players will hate your map.
* Paladins are for defense. Defense! Got it? They are for shielding nodes and killing nearby attackers. They are NOT for cross country rides to grandmother's house.

==Vehicle Placement==

The golden rule here is balance.  Your vehicle placement is the PRIMARY way in which you can directly affect how much power the winning team has against the losing team. Generally each Power Node will have between 2 and 4 vehicles associated with it.  The larger the map the more vehicles will be needed as travelling between Power Nodes on foot becomes less attractive and less effective.

For making maps that really shine in gameplay, and support the kinds of strategies and tactics experienced ONS players would like to use, follow these tips:
* Try to limit the placements of tanks. Prefer to place them in the base AND/OR at a central contested node. Avoid placing tanks at other nodes as this generally gives the winning team too much of advantage over the losing team.
* A similar reasoning applies to Leviathans. They are best placed at each power core OR at a single central contested node (but not both). Giving the winning team more than one Leviathan is a BAD idea.
* Paladins are slow and vulnerable critters. But they make excellent defense vehicles for nodes. Not only can they sheild the node, but they can even kill ground troops that get close by using the Paladin combo (while sheild is up, press fire to make a local shockwave for personal defense). Place Paladins ONLY at or near primary or secondary nodes. Do not place them at a node that is far away from the nodes they would be useful to defend. Avoid placing them at the power core, unless it is a short drive to the primary node.
* Avoid placing Mantas all over the map at various nodes. Giving the winning team a hell of a lot of Mantas is a bad thing. It makes it nearly impossible for the losing team to make a comeback when they are constantly being roadkilled, and every time they get their primary node back up, 5 mantas attack it again. Prefer to put 2 or 3 Mantas at each power core, and a sparse number at various nodes throughout the map.
* Scorpians are great for taking out tanks, as well as mantas in narrow channels. You may wish to place them with these goals in mind to help the losing team fight back.
* The Raptor is the most versitile vehicle of the lot. It can be used to take out enemy aircraft (both Raptors and Cicadas), sniff out enemy snipers and campers hiding in trees and rubble, kill tanks, Levis, Mantas, and so on. In fact, the best use of the Raptor is as a predator of other vehicles (thus its name). There really is no substitute for this. Cicadas are NOT good replacements for Raptors (why? because enemy Raptors 'eat Cicadas for lunch.'). Do not think placing a Cicada at the power core will be sufficient. You should always have at least one Raptor there. This gives a losing team at least some chance of fighting off the tanks and Levis that are slaughtering them, and makes the game more interesting and comeback-possible.

See also [[Legacy:Vehicle Gameplay|Vehicle Gameplay]].

==Weapon Placement==
* At the Power Core make sure there is a good mix of hitscan and projectile weapons.  There's nothing worse than trying to take back a Primary Node only to find that your best weapon is the short range Flak Cannon (Remember that the Link gun is much more important in Onslaught than in many other, if not all, gametypes). 
* The Weapon Lockers at each Power Node should contain a different selection of weapons.  As with the Power Core a mix of hitscan and projectile weapons is preferred.
* A ''full'' Weapon Locker can be collected by any player at any time irrespective of whether it is next to a Power Node controlled by the other team.

See also [[Legacy:Inventory Item Placement|Inventory Item Placement]].

==Map Checklist==
* Have you set up the Power Node network?  Hit ESC in game and click on the Link Designer.
* Do you have any vehicles spawning at a Power Node that are facing the wrong way for one team but the right way for another?
* Can you reliably teleport between all of the Power Nodes - arriving at the Power Node you expect (odd things can happen if ''node areas'' overlap).
* Do you wishto ship more than one Power Node setup with your map?
* Show level properties.  Make sure LevelInfo.DefaultGameType is set to &lt;tt&gt;Onslaught.ONSOnslaughtGame&lt;/tt&gt;.

==External Links (Tutorials)==
* [http://www.psyonix.com/OnslaughtMapTutorial.shtml Onslaught Tutorial] from psyonix.com
* [http://www.angelmapper.com/gamedev/tutorials/onslaught.htm Onslaught Tutorial] from angelmapper.com

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Pathing For Vehicles|Pathing for Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''Tarquin:''' how do you define the power node network, and how do you ship alternatives? this article should link to relevant information, eg actor classes

'''Sweavo:''' pasted an external link to some of that info.  It should be assimilated into here though I think.

'''enDLine.SPA:''' you have to play your map, hit esc to bring up the hud and click the map tab, then click link deisgner in the lower right. I also added an external link to Angel Mappers Onslaught Tutorial.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For One Flag Capture</title>
    <id>2086</id>
    <revision>
      <id>5080</id>
      <timestamp>2006-01-19T04:57:18Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Is a little like [[Legacy:Mapping For CTF|Mapping For CTF]] exept for the objectives.

&lt;wiki&gt;@@[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:OFC_Goals|OFC_Goals]]
* &lt;b&gt;OFC_RedGoal&lt;/b&gt; replace the Red flag.
* &lt;b&gt;OFC_BlueGoal&lt;/b&gt; replace the Blue flag.

The goals are the capture point of flag, one alone for each team.

&lt;wiki&gt;@@[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]]
* &lt;b&gt;OFC_FlagBase&lt;/b&gt; place one or several in middle map, the flag start and restart (after a capture) randomly on one Flag base.

For all details of all specific actor of this mod see : http://oneflagcapture.free.fr/mapping.htm

==External links ==
* &lt;b&gt;Home page :&lt;/b&gt; http://oneflagcapture.free.fr/

==Related Topics ==
* [[Legacy:Gametype|Gametype]]

==Discussion ==</text>
    </revision>
    <revision>
      <id>5081</id>
      <timestamp>2003-04-26T09:46:19Z</timestamp>
      <contributor>
        <ip>Crokx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Is a little like [[Legacy:Mapping For CTF|Mapping For CTF]] exept for the objectives.

&lt;wiki&gt;@@[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:OFC_Goals|OFC_Goals]]
* &lt;b&gt;OFC_RedGoal&lt;/b&gt; replace the Red flag.
* &lt;b&gt;OFC_BlueGoal&lt;/b&gt; replace the Blue flag.

The goals are the capture point of flag, one alone for each team.

&lt;wiki&gt;@@[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]]
* &lt;b&gt;OFC_FlagBase&lt;/b&gt; place one or several in middle map, the flag start and restart (after a capture) randomly on one Flag base.

For all details of all specific actor of this mod see : http://oneflagcapture.free.fr/mapping.htm

==Related links ==
* &lt;b&gt;Home page :&lt;/b&gt; http://oneflagcapture.free.fr/

==Related topic ==
* [[Legacy:Gametype|Gametype]]

==Discussion ==</text>
    </revision>
    <revision>
      <id>5082</id>
      <timestamp>2003-10-13T07:19:10Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>* Standardizing: &quot;Related Topics&quot;</comment>
      <text xml:space="preserve">Is a little like [[Legacy:Mapping For CTF|Mapping For CTF]] exept for the objectives.

&lt;wiki&gt;@@[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]] &gt;&gt; [[Legacy:OFC_Goals|OFC_Goals]]
* &lt;b&gt;OFC_RedGoal&lt;/b&gt; replace the Red flag.
* &lt;b&gt;OFC_BlueGoal&lt;/b&gt; replace the Blue flag.

The goals are the capture point of flag, one alone for each team.

&lt;wiki&gt;@@[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:JumpDest|JumpDest]] &gt;&gt; [[Legacy:JumpSpot|JumpSpot]] &gt;&gt; [[Legacy:GameObjective|GameObjective]]
* &lt;b&gt;OFC_FlagBase&lt;/b&gt; place one or several in middle map, the flag start and restart (after a capture) randomly on one Flag base.

For all details of all specific actor of this mod see : http://oneflagcapture.free.fr/mapping.htm

==Related links ==
* &lt;b&gt;Home page :&lt;/b&gt; http://oneflagcapture.free.fr/

==Related Topics ==
* [[Legacy:Gametype|Gametype]]

==Discussion ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For RocketArena</title>
    <id>1805</id>
    <revision>
      <id>4429</id>
      <timestamp>2005-01-14T03:16:19Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">So you want to map for Rocket Arena? (RA|UT)

Well it couldn't be simpler.  Rocket Arena maps are the simplest most fun map types.  The reason being that the game allows you to concentrate entirly on flow and eyecandy.  No weapon placement or complex pathing.  Just go wild and have fun.

One of the important aspects of a fun Rocket Arena map is that there should be few, if any, surfaces where one could get hung up on moving

forward or backward.  This greatly aids in playability in that players can easily keep moving all of the time.

The only exception in RA|UT maps is that you need to add a tasty pellet actor (comes with RA mod) to your map or bots won't move.  This actor simulates a pickup which gives a bot incentive to move.  Without this no matter how well you path your map the bots will stay put till they see an enemy.

Here's a few things to keep in mind.

''Flow'': Make sure you keep in mind that there is no fall damage and people will rocket jump.  This makes [[Legacy:Z-Axis|z-axis]] a very important part of the flow.  Keep that in mind.  At the same time tho don't make the height between levels too high. Peopl run out of rockets and then have to traverse thos levels on foot.

*I'm not sure about how you handle arenas within a map... I know you make all arenas in one file and add an actor but anyway point is add to this/edit thi etc.  I'll work on this over time but it'll be a couple of weeks before I can do that.  I just wanted to get this started. OshadO</text>
    </revision>
    <revision>
      <id>4430</id>
      <timestamp>2005-01-13T23:27:06Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For TTR</title>
    <id>2075</id>
    <revision>
      <id>5052</id>
      <timestamp>2003-07-28T19:35:01Z</timestamp>
      <contributor>
        <ip>Public4-stre2-3-cust78.bagu.broadband.ntl.com</ip>
      </contributor>
      <comment>Updated forum link</comment>
      <text xml:space="preserve">'''The Third Reich Mapping Guide''' by butto.

TTR is a [[Legacy:UT|UT]] [[Legacy:Mod|mod]]. Links:
* website: http://www.thethirdreich.com/
* forums: http://www.thethirdreich.com/forum

==Overview ==

Mapping for the Third Reich will offer its own unique challenges due to the objective based nature of gameplay.  This document details everything that you, as a mapper, need to know to create your own scenarios for use in TTR.

==The Basics==

Maps in TTR are objective based and play is divided into rounds.  One team, the attacking team, is trying to accomplish certain objectives.  The other team, the defending team, is trying to prevent them from accomplishing these objectives before the round is over.  Each map can have anywhere between one and eight different objectives.  An objective can be any variety of things from stealing documents or an enigma machine to capturing territory or rescuing POWs.  Objectives can be in one of three different states - incomplete, complete, or failed.  When a round starts, all objectives are incomplete.  When an objective is accomplished by the attacking team, it is marked as complete.  If time runs out or some critical event occurs, an objective will be marked as failed. As soon as an objective is failed, the attacking team immediately loses.  The attacking team must complete all of their objectives to attain victory.

==Player Starts==

There are three teams in TTR - the Allies, Axis, and Spectators.  Their [[Legacy:Team Number|team number]]s are 0, 1, and 3 respectively.  The spawn points for players on the same team should be kept in the same general area with the exception of the spectator team.  There should be at least 16 spawn points per team to avoid telefragging in large games with the exception of the spectators once again, as they will only need one or maybe a few, spawn points.

==The Level Info: TTR_LevelInfo ==

Every TTR map must include a TTR_LevelInfo actor.  The level info lets the mapper setup all the properties for the map.  I'm going to run through every property and explain how to set it.  I will use the format 'Variable (Valid values)' followed by a description.

===TTR_Environment ===

; AirPressure (Barometric Pressure, for you weather fans!) : This is the air pressure in the map, which is important for ballistics calculations.  As a general rule, air pressure at sea level is about 29-30 lb/ft^3.  It will go down by one for every thousand feet above sea level.  It will also go down a little when there is stormy weather.

; bEnableWind: Set this to true (default) to allow wind in your map.  Wind affects bullets.  It also makes trees and foliage sway and allows newspapers to blow around if placed in the map.

; Climate : (CLIMATE_Temperate, CLIMATE_Desert, CLIMATE_Arctic) This is where you set the map's climate.  This will determine player uniforms. *Note: is not yet operational ingame.

; North (Any valid rotation in [[Legacy:Unreal Unit|Unreal unit]]s) : This sets what direction is north on the map.  -16384 is what you should set this to if north is up on the top view map in UnrealEd.

; Temperature (Anything within reason): Set the map's temperature in Fahrenheit here.  Sorry it's not Celsius, but it's more convenient to use American units in UT.  This affects bullet behavior and causes the players' breath to show if it is cold out.  The actual temperature will be within five degrees of what you set.

; WindDirection (DIR_North, DIR_NorthEast, DIR_East, DIR_SouthEast, DIR_South, DIR_SouthWest, DIR_West, DIR_NorthWest): This is where you set the general direction that the wind blows.  The wind will deviate from this a little, but will generally stay around it.

; WindSpeed (WS_VeryLight,WS_Light,WS_Moderate,WS_Heavy,WS_VeryHeavy): This sets how fast the wind is going.  WS_VeryLight has a top speed of around 4 MPH (barely felt).  WS_VeryHeavy has a top speed around 32 MPH (gale force).

; WindType (WT_Breezy,WT_Gusty,WT_Steady):Here you can set how the wind behaves.  WT_Breezy causes the wind to be a lot lighter than the max speed, but pick up every now and then.  WT_Gusty causes the wind to stay a little closer to the max speed and gusts of wind will come more frequently.  WT_Steady causes the wind to stay close to the max speed and gusts occur very frequently.

===TTR_LevelProperties===

; DefendingTeam (0,1) : This is used to set which team is the defending team on this map.  Use 0 for Allies or 1 for Axis.

; InvincibilityTime (0-10): This is the number of seconds that a player should be impregnable to damage after spawning to prevent spawn camping.

; PrepTime (0 or above) : This is the number of seconds before a round starts that the defending team can move, but the attackers cannot.  This allows the defenders to get into positions.  It is the mapper's responsibility to make sure that the defenders cannot reach the attacker spawn point and do lame things.

; ReinforcementInterval (30 or above): This is the number of seconds between respawn periods.  People are respawned in waves every however many seconds you set so that people can stay together more or less.  This interval will be randomized, so the actual waves will be at whatever value you set give or take 10 seconds.  This is to prevent players from knowing exactly when everyone will be respawning.  The default is 45 seconds between waves, but what this number should be depends a lot on the size of the map.

; RoundDuration (1 or above):This is the length of each round in minutes.  How long a round should be is entirely up to the mapper.  It should be long enough to give the attackers a chance, but not so long that it is easy for them.  Please keep rounds longer than one minute, but preferably longer than that.

===TTR_Objectives===

; AttackerObjectives[8] (Any text):This is where you write the text that will appear whenever the objectives are visible to a player on the attacking team in-game.  An example of what to put would be &quot;Steal the design plans for the latest German airplane.&quot;

; DefenderObjectives[8] (Any text): This is the same thing for the defending team.  Because the defenders are trying to prevent the attackers from accomplishing the objectives, they need to be reworded.  For example, I would write &quot;Protect the design plans for our latest airplane.&quot; instead of the text used above for the attackers.

; NumObjectives (1-8):This tells the game code how many objectives there will be in total in the map.

==Setting up Objectives==

Now that we have covered the level info, it is time to look at what we need to do in order to put the actual objectives into the map.  There are a wide variety of classes at your disposal to construct the objectives.  While each objective is unique, they all have several things in common to make it easy to figure things out.

One of the classes involved in each objective will have a 'TTR_Objectives' category in its [[Legacy:Default Properties|default properties]].  You will be able to set, at the very least, a variable called 'ObjectiveNumber' in here.  This number corresponds to the number in the array where you put the text description in the level info.  So if you have only one objective, its ObjectiveNumber will be 0 and the description of the objective will be in the first row for both the attacker and defender descriptions.

Because of the way this system works, it is technically possible to have two different objectives use the same number.  That would make it possible for the attackers to have an option of completing one objective or another.  This was not an intended option, but more of a quirk. :)

So if you've stayed with me this far, it's now time to look at each objective individually and explain all the unique properties.

===Stealing Documents===

The stealing documents objective works as follows.  Someone on the attacking team must grab a TTR_Documents pickup item placed somewhere on the map and return it to a TTR_DropOffZone.  As soon as a player on the attacking team enters the zone with the documents in his position, this objective is completed.  Let's take a look at the setup.

{{classbox| TTR_Documents}}

Place this item wherever you want in the map.  You can rename it to be whatever specific documents they are supposed to be.  This classes is located under Actor-&gt;Inventory-&gt;Pickup-&gt;UT_Pickup-&gt;TTR_Pickup-&gt;TTR_Documents.

; Events -&gt; Tag (Any name) : This is a [[Legacy:Tag|tag]] for the documents used to differentiate one documents pickup from another when it is taken to a drop off zone.
 

; TTR_Objectives -&gt; ObjectiveNumber (0-7): Already explained before.  The number of this objective on the objectives list.

{{classbox| Actor &gt;&gt; Info &gt;&gt; ZoneInfo &gt;&gt; TTR_Zone &gt;&gt; TTR_DropOffZone}}

This is a zone where any variety of things can be dropped off.    As soon as a player from the attacking team carries the documents into here, the objective number of the documents is set to complete.

; PickupItems[8] (class of pickup,tag for pickup) :You can drop off up to eight different pickup items at a TTR_DropOffZone, not just TTR_Documents.  For each one, you must enter the class name (class'TTR.TTR_Documents' in this case) and the tag you gave that item.  The zone will take care of the rest.

===Stealing an Enigma Machine===

The Germans used a special device known as an enigma machine to send coded messages between their ranks.  Through the help of stolen machines and lots of dedicated people working at decrypting messages, the Allies knew almost every German movement ahead of time.  While it may not be totally realistic to be stealing an enigma machine in the fashion that they will be in TTR, it's fun nonetheless and fits the WWII theme.

This objective works almost exactly like the document objective, so make sure you have read that first.  The only difference is that a TTR_EnigmaMachine class is used in place of a TTR_Documents and the TTR_DropOffZone has a few minor changes.  The pickup class can be found under Actor-&gt;Inventory-&gt;Pickup-&gt;UT_Pickup-&gt;TTR_Pickup-&gt;TTR_EnigmaMachine.  The class you enter for the item in the TTR_DropOffZone is class'TTR.TTR_EnigmaMachine'.  It should be pretty straightforward.

===Taking Territory===

Territorial control is one of the most common objectives in war and also one of the most difficult to replicate in a game.  In TTR, holding territory works in the following way.  If only a certain percentage of players on the attacking team are in the area for a certain period of time and nobody from the defending team is there, the territory is taken.  Territory cannot be taken back because it would go against the attackers/defenders nature of gameplay.

This objective is managed with a single class, TTR_HoldArea.  It can be found under Actor &gt;&gt; HoldArea.  Place this where you want to allow the attackers to take the territory.  You also have the option of adding a TTR_FlagPole actor into your map, which will allow you to have a flag that changes textures depending on who holds the territory.

{{classbox| TTR_HoldArea}}

Here are all the properties of a TTR_HoldArea.

; Events -&gt; Tag (Any name) : Use this only if you want to have a flag tied to the area.  

; TTR_HoldArea -&gt; HoldSecs (0 or above) : How many seconds there must be enough players from the attacking team and no players from the defending team in this area.
; TTR_HoldArea -&gt; NumPlayers (0-1): Percentage of players from the attacking team that must be in the zone to complete the objective.  Default is 0.33 (33% or at least 1 player).

; TTR_HoldArea -&gt;Radius (Anything within reason):This is the radius within the TTR_HoldArea actor that a player must be.  The default is 256.  Hold areas can span a pretty large area if you'd like, like a whole town center.

; TTR_HoldArea -&gt;bUseZone: If true it will use the TTR_zone it is linked to. Make sure you place a TTR_zone in the zone and give it the same 'Tag' as the TTR_HoldArea. Should work after you done that.

; TTR_Objectives -&gt; ObjectiveNumber (0-7): Already discussed many times over.

{{classbox| TTR_FlagPole}}

Here is how you can setup a TTR_FlagPole, which can be used with the zone, but doesn't have to.  The flagpole will create its own flag when the game starts.  That flag will wave according to the wind.

; Events -&gt; Tag (Same name used by TTR_HoldArea): Set this if this flag is going to be used with a TTR_HoldArea.  It doesn't have to be.  It can just be a decoration.

; TTR_FlagPole -&gt; bAttachToHoldArea (true,false) : True if this flag is going to show which team holds the territory in a hold area.

; TTR_FlagPole -&gt;FlagOffset (Vector): This does not need to be changed.  It is the offset where the flag will be spawned relative to the center of the flagpole.

; TTR_FlagPole -&gt;TeamNumber (0,1):This is used only if the flag is not going to be attached to a hold area.  This will determine which flag texture to use in that case.  0 = Allies 1 = Axis.

==Using Airplanes==

Airplanes can add a lot of ambient to a level and even provide a unique element to the gameplay.  Setting them up is rather complex - I won't lie.  The basic idea is that you put a plane anywhere in the level.  You then add a bunch of waypoints to define where the plane starts, where it will travel, when it will fire machine guns, and when it will drop bombs.  Then you place a trigger in the level that will trigger the plane.  When the plane is triggered, it will become visible at the first waypoint (number 0), follow its path, do whatever, and vanish until the next round once it hits the last waypoint.

{{classbox| TTR_Airplane }}

Now let's take a look at this in more detail.  When you add an airplane to the level, its placement does not matter.  It will get moved to the first waypoint automatically.  You can change several of the plane's settings.

; Events -&gt; Tag (Any name): This is the name used so that the waypoints and trigger can be linked to the right plane.

; TTR_Airplane -&gt; FlySound (Any sound): This should be fine the way it is, but you can change it.

; TTR_Airplane -&gt; Health (Anything within reason):This sets the health of the plane.  1000 is default.

; TTR_Airplane -&gt; Speed (~150-300): This is the speed of the plane in miles per hour (MPH).

; TTR_Airplane -&gt; Team (0,1): 0 if the plane is on the Allies, 1 if it is on the Axis.  This should be setup properly by default.

TTR_BombSetup

** Incomplete

TTR_MGSetup

This should be fine the way it is.  It has all the data on machine guns for the plane in there by default.

===TTR_AirplaneWaypoint===

We covered everything there is to the plane itself.  Now the plane needs a path to follow.  The TTR_AirplaneWaypoint class is used to create this.  You cannot have more than 32 waypoints, but that should be more than enough.  Now let's take a look at the properties you have to configure.

; Events -&gt; Tag (Any name): Same as for the plane.

; TTR_Waypoint -&gt; Banking (0-16383) : This is how many unreal units the plane will bank when it hits this waypoint.  If the plane is not turning, it can be 0.  0 is no banking and 16384 is 90 degrees of banking.  Typically, somewhere around 4096 will be good.  The banking has to be perfected by trial and error more or less.

; TTR_Waypoint -&gt; bDropBomb (true,false): Obsolete, will get redone

; TTR_Waypoint -&gt;  bFireMachineGun (true,false)

-True if the plane should fire machine guns enroute to this waypoint.-

; TTR_Waypoint -&gt; bFireCannon (true,false): Here for possible support later.  It is not used.

; TTR_Waypoint -&gt;  WaypointNumber (0-31): Waypoint numbers are used to determine the order of the waypoints.  0 is the starting waypoint.  Each waypoint must be added in sequence.  If numbers are missing in the middle, the plane will vanish early.

{{classbox| TTR_AirplaneTrigger}}

The plane and paths are all set.  Next, we need to add a trigger to set this plane on its way.  The trigger can set the plane off in any of three ways: a particular round time, if a player comes within a certain distance of the trigger, or if a certain objective or combination of objectives have been completed.  The trigger can be found under Triggers-&gt;TTR_AirplaneTrigger.

; TTR_AirplaneTrigger-&gt; bRandom (true,false): If true, only one out of all the planes linked to this trigger will actually be sent off.  This is to add a degree of randomness.

; TTR_AirplaneTrigger-&gt; AirplaneTags[8] (Any name):  This is where you can specify up to 8 planes that will be launched when this trigger is set off.

TTR_ObjMetTrigger

; bObjectivesMet (true,false):True to enable triggering when the following list of objectives is complete.

;Objectives[8] (0,1): The 8 objectives correspond to the 8 objectives in the level info.  Put 1 for the objectives that must be completed before the plane can be triggered.  Leave the rest at 0.

TTR_ProximityTrigger

; bProximity (true,false):  True to enable triggering when a player comes within a certaibn radius.

; TriggerRadius (Anything within reason):  How far away a player can be from the trigger to set it off.

; TeamNumber (0,1,255): What team must the player be on to set it off?  0 for Allies, 1 for Axis, 255 for any team.

TTR_TimedTrigger

;bTimed (true,false):  True if the trigger should go after at a certain round time.

; RoundTime (Anything with the duration of a round):  This is the number of seconds will be REMAINING on the round timer when the plane is to be triggered.

** Incomplete and some stuff will change

==Adding Minefields==

Minefields can be added through use of the TTR_MineInfo (Actor-&gt;Info-&gt;TTR_MineInfo) class.  This class automatically plants however many mines you want randomly within a certain radius.  It will automatically place them according to the contour of the surface below.  Make sure this actor is placed above the highest terrain level in its radius and that there are no big colliding actors underneath.  A mine will only be created on the surface of the level itself, not any actors.  The mines are reset and randomized at the start of each round.

{{classbox| Actor &gt;&gt; Info &gt;&gt; TTR_MineInfo}}

; NumMines (1-16): Sets how many mines are created.  There is a maximum of 16 for any one mine info.

; Radius (Anything within reason): Sets the radius within which the mines will be spawned.

; MineType (Any valid class): Leave it at the default.

==Doors Activated by the Use Key==

All doors in TTR maps should be use key activated so that the player has more control over when to open and close a door.  To create such doors, you must do two things to your mover: Set bUseTriggered to ‘true’ and set InitialState to ‘TriggerControlled’.  There you have it.

==Triggers==

Several new triggers have been added to TTR that you may find useful.  The triggers used in TTR will be automatically reset at the start of each round if you use the correct triggers.

You can use the standard Trigger class without any problems.  If bTriggeredOnceOnly is true then the trigger can only be activated once per round.

The TTR_UseTrigger (Actor-&gt;Triggers-&gt;Trigger-&gt;TTR_UseTrigger) works just like a normal trigger except for the fact that it is activated when a player presses the use key.  The bTriggeredOnlyOnce behavior for this trigger is the same as the normal trigger.

To trigger an event when a certain objective or group of objectives have been completed, use the TTR_ObjectiveTrigger (Actor-&gt;Triggers-&gt;Trigger-&gt;TTR_ObjectiveTrigger).  This trigger has one property - Objectives[8].  The eight members of this array represent the eight objectives that are possible on the objectives list.  Set any of them to ‘1’ if you want the event to be triggered after they have been completed.  Otherwise, leave them at ‘0’.  Setting any to ‘1’ that go beyond the number of objectives on the objectives list will do nothing.

Instead of using the TimedTrigger class, please use TTR_TimedTrigger.  This class works in exactly the same manner but will work better with rounds.

==Other Notes==

When creating zones in TTR, you should use the TTR_Zone and TTR_WaterZone actors.  They allow you to disable wind and change the temperature, which is needed for indoor areas.''

'''Mosquito:''' Yay, finally a TTR tut, thanks who ever fixed it up before posting it</text>
    </revision>
    <revision>
      <id>5053</id>
      <timestamp>2003-07-06T19:00:22Z</timestamp>
      <contributor>
        <ip>U212-239-170-197.adsl.pi.be</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">'''The Third Reich Mapping Guide''' by butto.

TTR is a [[Legacy:UT|UT]] [[Legacy:Mod|mod]]. Links:
* website: http://www.thethirdreich.com/
* forums: http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=89

==Overview ==

Mapping for the Third Reich will offer its own unique challenges due to the objective based nature of gameplay.  This document details everything that you, as a mapper, need to know to create your own scenarios for use in TTR.

==The Basics==

Maps in TTR are objective based and play is divided into rounds.  One team, the attacking team, is trying to accomplish certain objectives.  The other team, the defending team, is trying to prevent them from accomplishing these objectives before the round is over.  Each map can have anywhere between one and eight different objectives.  An objective can be any variety of things from stealing documents or an enigma machine to capturing territory or rescuing POWs.  Objectives can be in one of three different states - incomplete, complete, or failed.  When a round starts, all objectives are incomplete.  When an objective is accomplished by the attacking team, it is marked as complete.  If time runs out or some critical event occurs, an objective will be marked as failed. As soon as an objective is failed, the attacking team immediately loses.  The attacking team must complete all of their objectives to attain victory.

==Player Starts==

There are three teams in TTR - the Allies, Axis, and Spectators.  Their [[Legacy:Team Number|team number]]s are 0, 1, and 3 respectively.  The spawn points for players on the same team should be kept in the same general area with the exception of the spectator team.  There should be at least 16 spawn points per team to avoid telefragging in large games with the exception of the spectators once again, as they will only need one or maybe a few, spawn points.

==The Level Info: TTR_LevelInfo ==

Every TTR map must include a TTR_LevelInfo actor.  The level info lets the mapper setup all the properties for the map.  I'm going to run through every property and explain how to set it.  I will use the format 'Variable (Valid values)' followed by a description.

===TTR_Environment ===

; AirPressure (Barometric Pressure, for you weather fans!) : This is the air pressure in the map, which is important for ballistics calculations.  As a general rule, air pressure at sea level is about 29-30 lb/ft^3.  It will go down by one for every thousand feet above sea level.  It will also go down a little when there is stormy weather.

; bEnableWind: Set this to true (default) to allow wind in your map.  Wind affects bullets.  It also makes trees and foliage sway and allows newspapers to blow around if placed in the map.

; Climate : (CLIMATE_Temperate, CLIMATE_Desert, CLIMATE_Arctic) This is where you set the map's climate.  This will determine player uniforms. *Note: is not yet operational ingame.

; North (Any valid rotation in [[Legacy:Unreal Unit|Unreal unit]]s) : This sets what direction is north on the map.  -16384 is what you should set this to if north is up on the top view map in UnrealEd.

; Temperature (Anything within reason): Set the map's temperature in Fahrenheit here.  Sorry it's not Celsius, but it's more convenient to use American units in UT.  This affects bullet behavior and causes the players' breath to show if it is cold out.  The actual temperature will be within five degrees of what you set.

; WindDirection (DIR_North, DIR_NorthEast, DIR_East, DIR_SouthEast, DIR_South, DIR_SouthWest, DIR_West, DIR_NorthWest): This is where you set the general direction that the wind blows.  The wind will deviate from this a little, but will generally stay around it.

; WindSpeed (WS_VeryLight,WS_Light,WS_Moderate,WS_Heavy,WS_VeryHeavy): This sets how fast the wind is going.  WS_VeryLight has a top speed of around 4 MPH (barely felt).  WS_VeryHeavy has a top speed around 32 MPH (gale force).

; WindType (WT_Breezy,WT_Gusty,WT_Steady):Here you can set how the wind behaves.  WT_Breezy causes the wind to be a lot lighter than the max speed, but pick up every now and then.  WT_Gusty causes the wind to stay a little closer to the max speed and gusts of wind will come more frequently.  WT_Steady causes the wind to stay close to the max speed and gusts occur very frequently.

===TTR_LevelProperties===

; DefendingTeam (0,1) : This is used to set which team is the defending team on this map.  Use 0 for Allies or 1 for Axis.

; InvincibilityTime (0-10): This is the number of seconds that a player should be impregnable to damage after spawning to prevent spawn camping.

; PrepTime (0 or above) : This is the number of seconds before a round starts that the defending team can move, but the attackers cannot.  This allows the defenders to get into positions.  It is the mapper's responsibility to make sure that the defenders cannot reach the attacker spawn point and do lame things.

; ReinforcementInterval (30 or above): This is the number of seconds between respawn periods.  People are respawned in waves every however many seconds you set so that people can stay together more or less.  This interval will be randomized, so the actual waves will be at whatever value you set give or take 10 seconds.  This is to prevent players from knowing exactly when everyone will be respawning.  The default is 45 seconds between waves, but what this number should be depends a lot on the size of the map.

; RoundDuration (1 or above):This is the length of each round in minutes.  How long a round should be is entirely up to the mapper.  It should be long enough to give the attackers a chance, but not so long that it is easy for them.  Please keep rounds longer than one minute, but preferably longer than that.

===TTR_Objectives===

; AttackerObjectives[8] (Any text):This is where you write the text that will appear whenever the objectives are visible to a player on the attacking team in-game.  An example of what to put would be &quot;Steal the design plans for the latest German airplane.&quot;

; DefenderObjectives[8] (Any text): This is the same thing for the defending team.  Because the defenders are trying to prevent the attackers from accomplishing the objectives, they need to be reworded.  For example, I would write &quot;Protect the design plans for our latest airplane.&quot; instead of the text used above for the attackers.

; NumObjectives (1-8):This tells the game code how many objectives there will be in total in the map.

==Setting up Objectives==

Now that we have covered the level info, it is time to look at what we need to do in order to put the actual objectives into the map.  There are a wide variety of classes at your disposal to construct the objectives.  While each objective is unique, they all have several things in common to make it easy to figure things out.

One of the classes involved in each objective will have a 'TTR_Objectives' category in its [[Legacy:Default Properties|default properties]].  You will be able to set, at the very least, a variable called 'ObjectiveNumber' in here.  This number corresponds to the number in the array where you put the text description in the level info.  So if you have only one objective, its ObjectiveNumber will be 0 and the description of the objective will be in the first row for both the attacker and defender descriptions.

Because of the way this system works, it is technically possible to have two different objectives use the same number.  That would make it possible for the attackers to have an option of completing one objective or another.  This was not an intended option, but more of a quirk. :)

So if you've stayed with me this far, it's now time to look at each objective individually and explain all the unique properties.

===Stealing Documents===

The stealing documents objective works as follows.  Someone on the attacking team must grab a TTR_Documents pickup item placed somewhere on the map and return it to a TTR_DropOffZone.  As soon as a player on the attacking team enters the zone with the documents in his position, this objective is completed.  Let's take a look at the setup.

{{classbox| TTR_Documents}}

Place this item wherever you want in the map.  You can rename it to be whatever specific documents they are supposed to be.  This classes is located under Actor-&gt;Inventory-&gt;Pickup-&gt;UT_Pickup-&gt;TTR_Pickup-&gt;TTR_Documents.

; Events -&gt; Tag (Any name) : This is a [[Legacy:Tag|tag]] for the documents used to differentiate one documents pickup from another when it is taken to a drop off zone.
 

; TTR_Objectives -&gt; ObjectiveNumber (0-7): Already explained before.  The number of this objective on the objectives list.

{{classbox| Actor &gt;&gt; Info &gt;&gt; ZoneInfo &gt;&gt; TTR_Zone &gt;&gt; TTR_DropOffZone}}

This is a zone where any variety of things can be dropped off.    As soon as a player from the attacking team carries the documents into here, the objective number of the documents is set to complete.

; PickupItems[8] (class of pickup,tag for pickup) :You can drop off up to eight different pickup items at a TTR_DropOffZone, not just TTR_Documents.  For each one, you must enter the class name (class'TTR.TTR_Documents' in this case) and the tag you gave that item.  The zone will take care of the rest.

===Stealing an Enigma Machine===

The Germans used a special device known as an enigma machine to send coded messages between their ranks.  Through the help of stolen machines and lots of dedicated people working at decrypting messages, the Allies knew almost every German movement ahead of time.  While it may not be totally realistic to be stealing an enigma machine in the fashion that they will be in TTR, it's fun nonetheless and fits the WWII theme.

This objective works almost exactly like the document objective, so make sure you have read that first.  The only difference is that a TTR_EnigmaMachine class is used in place of a TTR_Documents and the TTR_DropOffZone has a few minor changes.  The pickup class can be found under Actor-&gt;Inventory-&gt;Pickup-&gt;UT_Pickup-&gt;TTR_Pickup-&gt;TTR_EnigmaMachine.  The class you enter for the item in the TTR_DropOffZone is class'TTR.TTR_EnigmaMachine'.  It should be pretty straightforward.

===Taking Territory===

Territorial control is one of the most common objectives in war and also one of the most difficult to replicate in a game.  In TTR, holding territory works in the following way.  If only a certain percentage of players on the attacking team are in the area for a certain period of time and nobody from the defending team is there, the territory is taken.  Territory cannot be taken back because it would go against the attackers/defenders nature of gameplay.

This objective is managed with a single class, TTR_HoldArea.  It can be found under Actor &gt;&gt; HoldArea.  Place this where you want to allow the attackers to take the territory.  You also have the option of adding a TTR_FlagPole actor into your map, which will allow you to have a flag that changes textures depending on who holds the territory.

{{classbox| TTR_HoldArea}}

Here are all the properties of a TTR_HoldArea.

; Events -&gt; Tag (Any name) : Use this only if you want to have a flag tied to the area.  

; TTR_HoldArea -&gt; HoldSecs (0 or above) : How many seconds there must be enough players from the attacking team and no players from the defending team in this area.
; TTR_HoldArea -&gt; NumPlayers (0-1): Percentage of players from the attacking team that must be in the zone to complete the objective.  Default is 0.33 (33% or at least 1 player).

; TTR_HoldArea -&gt;Radius (Anything within reason):This is the radius within the TTR_HoldArea actor that a player must be.  The default is 256.  Hold areas can span a pretty large area if you'd like, like a whole town center.

; TTR_HoldArea -&gt;bUseZone: If true it will use the TTR_zone it is linked to. Make sure you place a TTR_zone in the zone and give it the same 'Tag' as the TTR_HoldArea. Should work after you done that.

; TTR_Objectives -&gt; ObjectiveNumber (0-7): Already discussed many times over.

{{classbox| TTR_FlagPole}}

Here is how you can setup a TTR_FlagPole, which can be used with the zone, but doesn't have to.  The flagpole will create its own flag when the game starts.  That flag will wave according to the wind.

; Events -&gt; Tag (Same name used by TTR_HoldArea): Set this if this flag is going to be used with a TTR_HoldArea.  It doesn't have to be.  It can just be a decoration.

; TTR_FlagPole -&gt; bAttachToHoldArea (true,false) : True if this flag is going to show which team holds the territory in a hold area.

; TTR_FlagPole -&gt;FlagOffset (Vector): This does not need to be changed.  It is the offset where the flag will be spawned relative to the center of the flagpole.

; TTR_FlagPole -&gt;TeamNumber (0,1):This is used only if the flag is not going to be attached to a hold area.  This will determine which flag texture to use in that case.  0 = Allies 1 = Axis.

==Using Airplanes==

Airplanes can add a lot of ambient to a level and even provide a unique element to the gameplay.  Setting them up is rather complex - I won't lie.  The basic idea is that you put a plane anywhere in the level.  You then add a bunch of waypoints to define where the plane starts, where it will travel, when it will fire machine guns, and when it will drop bombs.  Then you place a trigger in the level that will trigger the plane.  When the plane is triggered, it will become visible at the first waypoint (number 0), follow its path, do whatever, and vanish until the next round once it hits the last waypoint.

{{classbox| TTR_Airplane }}

Now let's take a look at this in more detail.  When you add an airplane to the level, its placement does not matter.  It will get moved to the first waypoint automatically.  You can change several of the plane's settings.

; Events -&gt; Tag (Any name): This is the name used so that the waypoints and trigger can be linked to the right plane.

; TTR_Airplane -&gt; FlySound (Any sound): This should be fine the way it is, but you can change it.

; TTR_Airplane -&gt; Health (Anything within reason):This sets the health of the plane.  1000 is default.

; TTR_Airplane -&gt; Speed (~150-300): This is the speed of the plane in miles per hour (MPH).

; TTR_Airplane -&gt; Team (0,1): 0 if the plane is on the Allies, 1 if it is on the Axis.  This should be setup properly by default.

TTR_BombSetup

** Incomplete

TTR_MGSetup

This should be fine the way it is.  It has all the data on machine guns for the plane in there by default.

===TTR_AirplaneWaypoint===

We covered everything there is to the plane itself.  Now the plane needs a path to follow.  The TTR_AirplaneWaypoint class is used to create this.  You cannot have more than 32 waypoints, but that should be more than enough.  Now let's take a look at the properties you have to configure.

; Events -&gt; Tag (Any name): Same as for the plane.

; TTR_Waypoint -&gt; Banking (0-16383) : This is how many unreal units the plane will bank when it hits this waypoint.  If the plane is not turning, it can be 0.  0 is no banking and 16384 is 90 degrees of banking.  Typically, somewhere around 4096 will be good.  The banking has to be perfected by trial and error more or less.

; TTR_Waypoint -&gt; bDropBomb (true,false): Obsolete, will get redone

; TTR_Waypoint -&gt;  bFireMachineGun (true,false)

-True if the plane should fire machine guns enroute to this waypoint.-

; TTR_Waypoint -&gt; bFireCannon (true,false): Here for possible support later.  It is not used.

; TTR_Waypoint -&gt;  WaypointNumber (0-31): Waypoint numbers are used to determine the order of the waypoints.  0 is the starting waypoint.  Each waypoint must be added in sequence.  If numbers are missing in the middle, the plane will vanish early.

{{classbox| TTR_AirplaneTrigger}}

The plane and paths are all set.  Next, we need to add a trigger to set this plane on its way.  The trigger can set the plane off in any of three ways: a particular round time, if a player comes within a certain distance of the trigger, or if a certain objective or combination of objectives have been completed.  The trigger can be found under Triggers-&gt;TTR_AirplaneTrigger.

; TTR_AirplaneTrigger-&gt; bRandom (true,false): If true, only one out of all the planes linked to this trigger will actually be sent off.  This is to add a degree of randomness.

; TTR_AirplaneTrigger-&gt; AirplaneTags[8] (Any name):  This is where you can specify up to 8 planes that will be launched when this trigger is set off.

TTR_ObjMetTrigger

; bObjectivesMet (true,false):True to enable triggering when the following list of objectives is complete.

;Objectives[8] (0,1): The 8 objectives correspond to the 8 objectives in the level info.  Put 1 for the objectives that must be completed before the plane can be triggered.  Leave the rest at 0.

TTR_ProximityTrigger

; bProximity (true,false):  True to enable triggering when a player comes within a certaibn radius.

; TriggerRadius (Anything within reason):  How far away a player can be from the trigger to set it off.

; TeamNumber (0,1,255): What team must the player be on to set it off?  0 for Allies, 1 for Axis, 255 for any team.

TTR_TimedTrigger

;bTimed (true,false):  True if the trigger should go after at a certain round time.

; RoundTime (Anything with the duration of a round):  This is the number of seconds will be REMAINING on the round timer when the plane is to be triggered.

** Incomplete and some stuff will change

==Adding Minefields==

Minefields can be added through use of the TTR_MineInfo (Actor-&gt;Info-&gt;TTR_MineInfo) class.  This class automatically plants however many mines you want randomly within a certain radius.  It will automatically place them according to the contour of the surface below.  Make sure this actor is placed above the highest terrain level in its radius and that there are no big colliding actors underneath.  A mine will only be created on the surface of the level itself, not any actors.  The mines are reset and randomized at the start of each round.

{{classbox| Actor &gt;&gt; Info &gt;&gt; TTR_MineInfo}}

; NumMines (1-16): Sets how many mines are created.  There is a maximum of 16 for any one mine info.

; Radius (Anything within reason): Sets the radius within which the mines will be spawned.

; MineType (Any valid class): Leave it at the default.

==Doors Activated by the Use Key==

All doors in TTR maps should be use key activated so that the player has more control over when to open and close a door.  To create such doors, you must do two things to your mover: Set bUseTriggered to ‘true’ and set InitialState to ‘TriggerControlled’.  There you have it.

==Triggers==

Several new triggers have been added to TTR that you may find useful.  The triggers used in TTR will be automatically reset at the start of each round if you use the correct triggers.

You can use the standard Trigger class without any problems.  If bTriggeredOnceOnly is true then the trigger can only be activated once per round.

The TTR_UseTrigger (Actor-&gt;Triggers-&gt;Trigger-&gt;TTR_UseTrigger) works just like a normal trigger except for the fact that it is activated when a player presses the use key.  The bTriggeredOnlyOnce behavior for this trigger is the same as the normal trigger.

To trigger an event when a certain objective or group of objectives have been completed, use the TTR_ObjectiveTrigger (Actor-&gt;Triggers-&gt;Trigger-&gt;TTR_ObjectiveTrigger).  This trigger has one property - Objectives[8].  The eight members of this array represent the eight objectives that are possible on the objectives list.  Set any of them to ‘1’ if you want the event to be triggered after they have been completed.  Otherwise, leave them at ‘0’.  Setting any to ‘1’ that go beyond the number of objectives on the objectives list will do nothing.

Instead of using the TimedTrigger class, please use TTR_TimedTrigger.  This class works in exactly the same manner but will work better with rounds.

==Other Notes==

When creating zones in TTR, you should use the TTR_Zone and TTR_WaterZone actors.  They allow you to disable wind and change the temperature, which is needed for indoor areas.''

'''Mosquito:''' Yay, finally a TTR tut, thanks who ever fixed it up before posting it</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Territories</title>
    <id>2210</id>
    <revision>
      <id>5350</id>
      <timestamp>2007-03-01T11:00:52Z</timestamp>
      <contributor>
        <ip>82-41-73-37.cable.ubr10.edin.blueyonder.co.uk</ip>
      </contributor>
      <comment>Rewriting this page, starting by removing pointless pictures</comment>
      <text xml:space="preserve">This page is for the Territories [[Legacy:Gametype|gametype]] in the Unreal engine game [[Legacy:Devastation|Devastation]].

Even if you dont own Devastation, I think this gametype could be a REALLY good mod for other games (hinting at someone who knows how to mod games :Rolleyes:)

For those of you who have never heard of Territories, i will give you a quick run-through. There are two teams, and each one has its own base.inside each base is a spawning machine which brings you back to life when you are killed. The base is protected by laser fences which will only open to let your team through. The map has a coderoom located somewhere,containing a mainframe computer which you use to download a special code into a handheld device. You then have to 'hack' the enemy laser fences using the codes you have, vai a keypad interact point at the fence. When the fence is disabled, you have to storm the base and destroy the spawner so the enemy team will not be coming back. you have won the game when all of the enemy has been killed. Weapons are obtained by a loadout system. When you kill an enemy you recieve a amount of points which you exchange for weapons and ammunition in a designated loadout volume inside your base. Obvoiusly the less effective weapons (micro viper, 9mm SMG, Handguns etc) are less expensive while the more effective weapons (Cobra cannon, particle laser rifle, antique machine gun etc) are more expensive.

==Map Size ==

It is very difficult to suggest a appropriate size of map, it really all depends on how you want it to be played. If you want fast-paced action go with a small map size (rivers of waste 2 or sniper IG-72 for example). This means that when you respawn you can get into the action quickly, theres no trudging all-the-way-to-the-other-side-of-the-map just to find people to kill. With a small map you must also consider that when a fence is hacked, and you kill the incoming enemies they respawn and can reach the open fence very quickly having not very far to go from thier base to ours. 

This can result in a never ending stream of enemies continually coming at your base and making defending very difficult. 

The final consideration is the simplest- its a small map, which means things will become crowded with more players. I myself have played a 6v6 clan war on rivers of waste 2 (easily the smallest territories map out there) and it was absolute chaos all the way through.

If you want more out in the open combat but you dont want your map to be too big so players can get back into action in a reasonable time then you would be looking to scale your map along the lines of DTT-Union or DTT-Nightforts or any of the other medium sized maps out there. If you are really unsure of the size to make your map, choose to make it just right- not too big or not too small. If you follow the scale of the average map then you will get a map big enough for open air combat and close up encounters....and of course SNIPING!!!! (one of my all time fauvorite activities on any map in any game)

REALLY big maps (DTT Fearzone scale) demand much more tactical combat. And remember, in a huge map its a long journey from your base to wherever the action is if you get killed. Also, if you get killed after hacking a fence then theres no way at all you can make it back to the enemy fence while it is still open, although this is a definite advantage to the defending team who would not have to worry about repeat waves of attackers. 

==Map Design ==

Theres an unwritten law that says territories maps have to be completely symmetrical. This is not true. You will want to keep your map roughly identical on each side to ensure no team has an advantage over the other but it doesnt have to be excact. A good example of this is DTT-DowntownChozo. on each side of the map there is a courtyard with elevated walkways, a few small alleyways, and a large open street outside the base. But the layout of the courtyards and bases are different,still though no team has a particualry advantageous position over the other one. so when designing a territories map you will be looking at a semi-symetrical layout, or of course you could make it completely symetrical, eg like on rivers of waste 2.

==Maps with a &quot;choke point&quot;==

This is just my personal opinion, but i feel nothing is more terrible than a map where there is only one passage from one side through to the other. Chozo may be a balanced map, but it has a choke point right at the two entrances into the coderoom. All everyone does in this map is sit on the roofs and walkways and endlessly snipe you as you come to the coderoom. Then everyone fills the place with smoke grenades and i get about 3 FPS and cant see anything. So, make a choke point if you must, but be warned its a sniper and camper haven.

==Base Design ==

The bases themselves do not have to be identical at all, although it is nice to have 2 matching bases. The position of the laser fences is critical however. The last thing you want is a map where one base is easy to get out of and smoothly desgined, and the other one is impossible to get out of and is arranged in a totally messy manner. With that in mind,when designing a base place the laser fences in a reasonable place and make sure no base offers an advantage over the other one, even if they are assymetrical. 

A small thing to note is the position of the spawner box. have it in a position where it is protected from outside snipers so they cannot in any circumstances destroy the spawner without first hacking the fence. Even if it means putting a dirty great static mesh in front of it to prevent this, believe me there is nothing worse than having your spawner destroyed while your fences are intact.

As for the fences themselves, there is no real guidelines to follow other than general scale; you dont 

want a tiny doorway laser fence so everyone gets stuck trying to exit (like on rivers of waste 2), but at the same time you want to avoid a huge laser fence that makes the defending team over-anticipate where the enemy will come through.

==The coderoom ==

ALWAYS be very careful with the location and accesibility of the coderoom. it should more or less dead in the middle of the map. never have just one entrance to the coderoom, this makes it far to easy for the team inside to defend. even with two entrances, you should be careful to avoid a coderoom that makes it impossible to attack. look at DTT-Union. the coderoom has two entrances, but because of its elevated position in is too advantageous to the team inside. you can attack and gain control of the coderoom if one or two people are in it, but if there is three or more it is simply not possible to regain control.

If you must put the exits/entrances of the coderoom right next to each other, provide some cover on at least one so the team that has just been in the coderoom has a chance of getting away without being gunned down as soon as they leave.

==Real map examples of what you want to achieve ==

If you need some inspiration or guidance, ive slected some maps which are well designed and show these recomendations in action. i will try to add some pictures too.

DTT Union

if you can forgive the somewhat over-biased to-the-team-inside coderoom, this map is one of the most balanced out there, even though it is not identical on each side. The bases, although mostly simular, do have  a slightly different geometrical layout to each other. note also the high level pipes extending out from each base to the central structure. The resistance team has two next to each other, however one of them has a break in it to make it more of a challenge to cross. the conformist team has not breaks in either of its pipes, but they are spaced wide apart at different ends of the base and only one provides access to the central structure.</text>
    </revision>
    <revision>
      <id>5351</id>
      <timestamp>2005-05-09T19:41:35Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is for the Territories [[Legacy:Gametype|gametype]] in the Unreal engine game [[Legacy:Devastation|Devastation]].

Even if you dont own Devastation, I think this gametype could be a REALLY good mod for other games (hinting at someone who knows how to mod games :Rolleyes:)

For those of you who have never heard of Territories, i will give you a quick run-through. There are two teams, and each one has its own base.inside each base is a spawning machine which brings you back to life when you are killed. The base is protected by laser fences which will only open to let your team through. The map has a coderoom located somewhere,containing a mainframe computer which you use to download a special code into a handheld device. You then have to 'hack' the enemy laser fences using the codes you have, vai a keypad interact point at the fence. When the fence is disabled, you have to storm the base and destroy the spawner so the enemy team will not be coming back. you have won the game when all of the enemy has been killed. Weapons are obtained by a loadout system. When you kill an enemy you recieve a amount of points which you exchange for weapons and ammunition in a designated loadout volume inside your base. Obvoiusly the less effective weapons (micro viper, 9mm SMG, Handguns etc) are less expensive while the more effective weapons (Cobra cannon, particle laser rifle, antique machine gun etc) are more expensive.

@block@Devastation2005-03-0220-52-53-24  this is a spawner which brings you back when you are killed.the sliver box in view is the spawner box which the enemy try to destroy. this map is DTT-physcowardV42.The loadout activator ( default key B) is also shown.

==Map Size ==

It is very difficult to suggest a appropriate size of map, it really all depends on how you want it to be played. If you want fast-paced action go with a small map size (rivers of waste 2 or sniper IG-72 for example). This means that when you respawn you can get into the action quickly, theres no trudging all-the-way-to-the-other-side-of-the-map just to find people to kill. With a small map you must also consider that when a fence is hacked, and you kill the incoming enemies they respawn and can reach the open fence very quickly having not very far to go from thier base to yours. This can result in a never ending stream of enemies continually coming at your base and making defending very difficult. The final consideration is the simplest- its a small map, which means things will become crowded with more players. I myself have played a 6v6 clan war on rivers of waste 2 (easily the smallest territories map out there) and it was absolute chaos all the way through.

If you want more out in the open combat but you dont want your map to be too big so players can get back into action in a reasonable time then you would be looking to scale your map along the lines of DTT-Union or DTT-Nightforts or any of the other medium sized maps out there. If you are really unsure of the size to make your map, choose to make it just right- not too big or not too small. If you follow the scale of the average map then you will get a map big enough for open air combat and close up encounters....and of course SNIPING!!!! (one of my all time fauvorite activities on any map in any game)

REALLY big maps (DTT Fearzone scale) demand much more tactical combat. And remember, in a huge map its a long journey from your base to wherever the action is if you get killed. Also, if you get killed after hacking a fence then theres no way at all you can make it back to the enemy fence while it is still open, although this is a definite advantage to the defending team who would not have to worry about repeat waves of attackers. 

==Map Design ==

Theres an unwritten law that says territories maps have to be completely symmetrical. This is not true. You will want to keep your map roughly identical on each side to ensure no team has an advantage over the other but it doesnt have to be excact. A good example of this is DTT-DowntownChozo. on each side of the map there is a courtyard with elevated walkways, a few small alleyways, and a large open street outside the base. But the layout of the courtyards and bases are different,still though no team has a particualry advantageous position over the other one. so when designing a territories map you will be looking at a semi-symetrical layout, or of course you could make it completely symetrical, eg like on rivers of waste 2.

==Maps with a &quot;choke point&quot;==

This is just my personal opinion, but i feel nothing is more terrible than a map where there is only one passage from one side through to the other. Chozo may be a balanced map, but it has a choke point right at the two entrances into the coderoom. All everyone does in this map is sit on the roofs and walkways and endlessly snipe you as you come to the coderoom. Then everyone fills the place with smoke grenades and i get about 3 FPS and cant see anything. So, make a choke point if you must, but be warned its a sniper and camper haven.

==Base Design ==

The bases themselves do not have to be identical at all, although it is nice to have 2 matching bases. The position of the laser fences is critical however. The last thing you want is a map where one base is easy to get out of and smoothly desgined, and the other one is impossible to get out of and is arranged in a totally messy manner. With that in mind,when designing a base place the laser fences in a reasonable place and make sure no base offers an advantage over the other one, even if they are assymetrical. 

A small thing to note is the position of the spawner box. have it in a position where it is protected from outside snipers so they cannot in any circumstances destroy the spawner without first hacking the fence. Even if it means putting a dirty great static mesh in front of it to prevent this, believe me there is nothing worse than having your spawner destroyed while your fences are intact.

As for the fences themselves, there is no real guidelines to follow other than general scale; you dont 

want a tiny doorway laser fence so everyone gets stuck trying to exit (like on rivers of waste 2), but at the same time you want to avoid a huge laser fence that makes the defending team over-anticipate where the enemy will come through.

==The coderoom ==

ALWAYS be very careful with the location and accesibility of the coderoom. it should more or less dead in the middle of the map. never have just one entrance to the coderoom, this makes it far to easy for the team inside to defend. even with two entrances, you should be careful to avoid a coderoom that makes it impossible to attack. look at DTT-Union. the coderoom has two entrances, but because of its elevated position in is too advantageous to the team inside. you can attack and gain control of the coderoom if one or two people are in it, but if there is three or more it is simply not possible to regain control.

If you must put the exits/entrances of the coderoom right next to each other, provide some cover on at least one so the team that has just been in the coderoom has a chance of getting away without being gunned down as soon as they leave.

==Real map examples of what you want to achieve ==

If you need some inspiration or guidance, ive slected some maps which are well designed and show these recomendations in action. i will try to add some pictures too.

DTT Union

if you can forgive the somewhat over-biased to-the-team-inside coderoom, this map is one of the most balanced out there, even though it is not identical on each side. The bases, although mostly simular, do have  a slightly different geometrical layout to each other. note also the high level pipes extending out from each base to the central structure. The resistance team has two next to each other, however one of them has a break in it to make it more of a challenge to cross. the conformist team has not breaks in either of its pipes, but they are spaced wide apart at different ends of the base and only one provides access to the central structure.

(If you are really interested, yes im D2A SlipStreams65 in these screenshots.)

@block@Devastation2005-05-0920-13-35-53 DTT-Union in one shot. Surely one of the best maps of all time in my opinion.

@block@Devastation2005-05-0920-29-45-55 The (Slightly biased to the defending team in my opinion) coderoom of Union. The mainframe is right in the middle of the room, in between the two stair cases.

DTT Sniper-IG-72

No prizes for guessing what this map is about, but it is a perfect example of how totally different bases can be fair and map design doesnt have to be symmetrical. It is also the only map i am aware of that has three laser fences on each base.the triple level layout makes navigating quite interesting, and the coderoom at first glance appears to have only  only one entrance, but it actually has a external entrance. Using this external entrance is a perfect example of risk vs reward. this map is set high above the city streets and a slip of the gangways means a fall to a unpleasant death. The other entrance to the coderoom is perched right on the edge of a building, and requires you to jump across a deceptively big gap to reach it. however, this other entrance gives better defensive access and can give the team inside a little surprise if you 'drop in' when they least expect it.

Now ill let the pictures do the talking... (apologies for the brightness, my screen capture hotkey is the same as the gamma adjustment)

@block@devastation2005-02-1816-25-24-80 This is one side of the resistance base, viewed from the middle level of the base with a clear view of one fence.

@block@devastation2005-02-1816-25-14-34  The other side of the resistance base, from the same map level and showing the other two fences

@block@devastation2005-02-1816-24-50-04  Two fences of the conformist base viewed from the top level.

@block@devastation2005-02-1816-24-37-11    The other fence of the conformist base, from a nice sniping spot (no wonder no one uses that fence anymore)

The two bases are pretty different, but this is still a very unbaised map which offers no advantages to one team over the other.

I will add to this page in the future, feel free to add to it yourself.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UT Jailbreak</title>
    <id>2083</id>
    <revision>
      <id>5072</id>
      <timestamp>2006-01-17T19:53:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General ==

In general, a Jailbreak map is similar to a [[Legacy:CTF|CTF]] in that both teams have a base of some sort which contains a valuable target. The main difference is, of course that the flag has been replaced by a jail release mechanism, and that this jail release mechanism only becomes a viable target when one or more of a player's team mates have become captured. 

The differences in gameplay have several consequences for map design as well. These are strictly conceptual guidelines, not a must of any sort. Because there is no true &quot;objective&quot; until a team mate has been imprisoned, there should be a motivation for a team to venture out of their base, other than reaching the enemy's. This motivation could take the form of a weapon not available in the bases, a powerup, or the like.

As always, everything to do with red is 0 and blue is 1.

==Areas ==

===Base ===

Each team needs a base. This needs:
* a jail release mechanism
* player starts, set with JBPlayerStart actors. Note that Jailbreak never uses the regular PlayerStart class.

This is much like a base for [[Legacy:CTF|CTF]] &amp;ndash; anything goes. However, due to the fact that a player, upon simply reaching a release mechanism, has accomplished his goal and does not have to return to his base in order to score, the mechanism or the complete base may be better defended than it would be in a CTF, since a player only need pass the defense points once.

Also, successfully invading the base doesn't score a point, in ''prohibits scoring'' for the enemy team. So whereas a base that is easy to attack in CTF produces high scores and fast action, in Jailbreak it will tend to result in a null tie and a dull game.

The jail release mechanism is an actor of the class TeamActivatedTrigger. Specifics on this actor are given on the [[Legacy:Jailbreak/Classes|Jailbreak/Classes]] page.

Placement of PlayerStarts is not as important as in CTF: players will only spawn there at the start of the game and on release from the arena. At all other times they spawn in jail and walk out upon release.

The viewpoint can be made to follow an [[Legacy:Interpolated Path|interpolated path]] or attached to a mover (see [[Legacy:Mover Topics|Mover Topics]] for more).

===Jails ===

The map needs two jails. These each need:
* A JailZone actor to define the zone
* A JBViewpoint actor which sets the capture viewpoint for the scoring team
* A means of exit which is triggered by the jail release mechanism, a TeamActivatedTrigger actor 
* player starts, set with JBPlayerStart actors. These need the bJailedStart flag set. It's good design to set these facing the exit, so players that are killed moments before the jail doors are about to close can run out.

A jail should be sealed insofar that a player, without help and without the use of a translocator, but with an impact hammer should not be able to leave the jail. The exit, triggered by the jail release mechanism can be a simple door, but could also be a kicker, a slide, or what not. 

To ensure correct bot behavior, players should be able to leave the jailzone within five seconds of the release mechanism's activation. This is due to the fact that a bot, upon releasing his teammates, cannot 'see' the release mechanism for that period of time to prevent him from incessantly triggering the mechanism until everybody has left the jailzone.

Although no doubt entertaining, it is probably inadvisable to create jails in such a fashion that an outside player can kill its inmates (although a kill on an already imprisoned player does not count towards your score). 

:'''Tip:'''  If you want to have the jails disregard you for testing purposes, enter &lt;tt&gt;set PlayerPawn bIsPlayer false&lt;/tt&gt; at the console.  With that you can safely &quot;ghost&quot; into jails and the arena to watch your bots without being subject to those special zones yourself.  (To revert the change, enter &lt;tt&gt;set PlayerPawn bIsPlayer true&lt;/tt&gt;.)

====Placement ====

The jail area need not be placed directly adjacent to the release mechanism. This mechanism will often be deep within an enemy base, and placing the jail too deep in the enemy base will only lead to a carnage immediately after the jailed prisoner's release. Rather, released prisoners should have a reasonably safe route back to their own base, so they may regroup in relative peace and mount a new assault. If placed between bases, the jail exit should probably face away from the enemy base, so that snipers will not immediately shoot the heads off the escapees.

====Style ====

Weaker players may spend quite some time in jail. Some ideas to alleviate the boredom of hard time:
* sculpt and place the jails in such a fashion that a jailed player has a good view of one or several key points in the game
* add map [[Legacy:Screen|Screen]]s or [[Legacy:CameraSpot|CameraSpot]]s so players can watch the action
* add [[Legacy:Screen|Screen]]s with web pages, server stats or IRC channels.

====Death ====

When all players of one team are held in their jail, the game marks a point, kills them &amp; shows the carnage to the scoring team players. However, it's possible to enhance the standard gibbing with a custom death scene.

If the game finds something that's triggered by RedCaptured/BlueCaptured, the standard gibbing after 4 seconds is disabled and the game expects the map to kill the prisoners. After ForceKillAfter seconds, they're gibbed anyway.

====Viewpoint ====

Each jail needs a JBViewpoint actor.

Quote from the JB forums:

The camera starts at the InterpolationPoint with Position=0 and moves along the path.  When it arrives at an InterpolationPoint with bEndOfPath=True, it stops; otherwise it loops when it arrives at the last InterpolationPoint in the path. 

* To reiterate, if no path is present, JBViewpoint actors simply behave like before; that is, they sit there and don't do anything.
* To make a path work with JBViewpoint actors, the individual InterpolationPoint actors' bNoDelete property must be set to &quot;True.&quot;  If it isn't, the JBViewpoint will refuse to use this path (and state so in the log).  The reason for this is replication-related.
* Since the players that were subjected to the death sequence start watching from the JBViewpoint much later than the players from the capturing team, I have introduced a new JBViewpoint property comprehensibly called &quot;StaticCameraForDyingTeam&quot; (defaults to &quot;True&quot;).  If set to &quot;True,&quot; members of the captured team will have their viewpoint set to the JBViewpoint's original location without any movement; if set to &quot;False,&quot; they'll perform the same camera movement as their capturers, starting when they switch their viewpoint.

A different matter is that you can also (successfully) attach a JBViewpoint to a mover now (Beta 5).  If you have a normal mover that rotates back and forth, so will the the JBViewpoint.  If you need rotation in pitch and roll direction too, you might need El's [[Legacy:ActorAttacher|ActorAttacher]].

Or, set the JBViewpoint's RotationRate and set bFixedRotationDir to &quot;True&quot; and Physics to &quot;PHYS_Rotating,&quot; and the JBViewpoint will continuously revolve according to its RotationRate.

===Arena ===

The arena is an optional component. It's possible to have more than one. Each needs:
* A JBArenaZone actor
* Two JBArenaStart actors, with their teams set.

It should be an area of the map from which it is not possible to escape, or for a specator to fall in. Zone it off nicely, and watch out for those impact jumps. 

A subclass of ZoneInfo, JBArenaZone, tells the game where to host the fight and holds settings on how frequently to stage fights. Add to your arena two JBarenaStarts (subclass of playerstart). Set the teamnumber to 0 for the red start and 1 for the blue. Placing more than one JBArenastart for each team is futile, since the system will always grab the first one.

There are a few more things to keep in mind:
* Don't trigger them too often. If you set them off too often, it may prove very difficult to get all the players in jail at the same time.
* Your arena can be as big or as small as you want, and can contain weapons or other pickups. However, all pickups stay in the arena and may not be kept by either player win or lose. You can have as many arenas in your map as you like. They don't conflict with each other and will summon players independently of each other. For best results, set their '''TriggerAfter''' property so that they're not all triggered at the same time.

:'''Tip:'''  If you want to have the arena disregard you for testing purposes, enter &lt;tt&gt;set PlayerPawn bIsPlayer false&lt;/tt&gt; at the console.  With that you can safely &quot;ghost&quot; into jails and the arena to watch your bots without being subject to those special zones yourself.  (To revert the change, enter &lt;tt&gt;set PlayerPawn bIsPlayer true&lt;/tt&gt;.)

:'''Tip:'''  In order to shorten the wait time between arena fights when testing (or debugging) arenas, here's a bunch of useful console commands that temporarily tell the arena to make fights as frequent as possible: &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone TriggerAfter 0&lt;/tt&gt; &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone TriggerSeconds 2&lt;/tt&gt; &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone NextTrigger 0&lt;/tt&gt; &lt;br /&gt;You can enter those commands at the console.  For more convenience, you can also write them to a plain text file (called &quot;arenatest.txt,&quot; for instance) and simply call with &lt;tt&gt;exec arenatest.txt&lt;/tt&gt; at the console prompt.

==Weapons and Items ==

When placing weapons, keep in mind that Jailbreak will probably be played with weaponstay off. (The Mothership servers have weaponstay on.) This adds weapons distribution as a strategic element. It also some way towards alleviating the imbalance between a team whose players are all free and one with members imprisoned, since relatively more weapons will be available on the side of the 'losing' team.

===Translocator ===

Jailbreak equips players with a translocator but disallows its use on a zone by zone basis. To allow players to translocate into a zone, the [[Legacy:ZoneInfo|ZoneInfo]]'s '''ZoneTag''' must begin with the string &quot;JBTransloc&quot;.

==Bot Support ==

Pathnoding is very similar to [[Legacy:CTF|CTF]]. Bots use [[Legacy:DefensePoint|DefensePoint]]s and [[Legacy:AmbushPoint|AmbushPoint]]s. Also, bots will use altpaths, although the return only variable has no meaning in this context. Be sure to pathnode a route out of the jail.

Again, much of the above is simply a guideline and is in no way binding.

:Bots may have trouble finding the release switch. Try lowering it slightly, this usually fixes the problem. 
::This was an occasional problem in 205, may no longer be an issue with 300  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
:'''Tip:''' When spectating your bots to check their gameplay and your botpathing, sorting the scoreboard by bot orders is very handy: It displays all attacking bots at the top, all defending bots below, and jailed bots at the bottom. Simply press F1 to display the scoreboard and then press GreyStar [*] (by default; or the key you bound to &quot;Switch compass/scoreboard order&quot;) until the status line below the scoreboard reads &quot;Scoreboard sorted by &lt;b&gt;Orders&lt;/b&gt;&quot;.

==Team Settings ==

A quick run-down of the actors and settings required for Jailbreak to work. Remember to set the '''DefaultGameType''' in the [[Legacy:Level Properties|level properties]] to &quot;JailBreak&quot;!

===PlayerStarts ===

The map must not contain any ordinary PlayerStart actors. 
; Main area : JBPlayerStart. Set JBPlayerStart -&gt; bJailedStart = False
; Jail : JBPlayerStart. Set JBPlayerStart -&gt; bJailedStart = True  Several are needed in each jail, maybe 4-6.
; Arena : JBArenaStart.

In all cases, set PlayerStart -&gt; TeamNumber to 0 (red) or 1 (blue).

===JailZone ===
* Red Jail: holds red players prisoner. JailedTeam = 0
* Blue Jail: holds blue players prisoner. JailedTeam = 1 

===Release Switch ===

This is an actor of the class TeamActivatedTrigger. Set:
* isJailReleaseMechanism = true
* Team:
** Defended by blue, releases the red team: Team = 0
** Defended by red, releases the blue team: Team = 1
* Event so something happens to let players out. It's also a good idea to trigger some sort of visual cue so the player activating knows they have suceeded (a lever moving for example).

==Dynamics ==

There are two main incidents that take place during a Jailbreak game: Release and capture. Both of these require a certain amount of work on the part of the mapper:

===Release ===

The release mechanism at its simplest is an actor of the class TeamActivatedTrigger. Set ''IsJailReleaseMechanism'' to True so bots know that it is a jail release switch. It's the responsibility of the mapper to choose an Event name and thus tie the TeamActivatedTrigger to the relevant jail doors (or kicker, or whatever system releases players).

Remember that the release switch located in the Red base must open the doors of the Blue jail to release the Blue players. For headaches induced by the whole red/blue thing, we recommend aspirin ;-)

Note that you can also use a TeamActivatedMechanism for making simple team-specific triggers, like for a team-based armory.

===Capture ===

The game automatically fires events 'RedCaptured' and 'BlueCaptured' when all players of a team are in the jail. If nothing is triggered by these, then players will be gibbed after a certain time (how much?). It's the responsibility of the mapper to make capture deaths more interesting by using these events to trigger something. Note that special JailZone subclasses which incorporate a death method (eg PressureJailZone) need to have their ''Tag'' set to either 'RedCaptured' or 'BlueCaptured' by the mapper to function.

:'''Tip:''' Because the capture events are built into the game type, you won't see red lines connecting actors which are triggered by them. If you find this disturbing, or just to check things are properly connected, create dummy triggers either outside the level or set so nothing can collide with it &amp; give them the each a capture event.

==Finishing Touches ==

As well as a [[Legacy:Screenshot|screenshot]], a Jailbreak map can incoporate a Map Banner and HUD Skins. 

The map banner is displayed on the HUD during pre-play flyby. This is created by embedding one or two 256x128 textures in the [[Legacy:MyLevel|MyLevel]] package, named &quot;SkinMapBanner1&quot;, and optionally &quot;SkinMapBanner2&quot; to make a wider banner.

These textures must both be referenced in the map (by an actor, or discreetly on a surface somewhere) otherwise UnrealEd will discard them on saving.

It is also possible to embed entire custom HUD skins in maps.  See the [http://www.ph.tum.de/~mkath/jb/jbskintutorial.html HUD skinning tutorial] for details.

==Map Standards ==

[[Legacy:ElBundee|ElBundee]] came up with the &quot;'''Jailbreak seal of approval'''&quot;, a short list of useful things each Jailbreak mapper should take care of:
* DefaultGametype set to Jailbreak 
* JBPlayerStarts in jail: at least 3 each jail
* JBPlayerStarts outside: at least upper IdealPlayerCount / 2 + 1 each team 
* No normal [[Legacy:PlayerStart|PlayerStart]]s left
* Set all JailDoorMovers to &quot;CrushWhenEncroach&quot; 
* Map Logo
* LocationStrings wherever possible for [[Legacy:Zone|Zone]]s
* Translocator support (if any) 
* JBViewpoints ( = DeathCams): 1 each jail
* Arena (optional)
* Jail escape routes (optional)

==External Links==
* [http://forums.beyondunreal.com/forumdisplay.php?forumid=382 Jailbreak Mapping and Development forum]
* HUD Skin: http://www1.physik.tu-muenchen.de/~mkath/jb/jbskintutorial.html

==Related Topics==
* [[Legacy:Jailbreak/Classes|Jailbreak/Classes]]
* [[Legacy:AmbushPoint|AmbushPoint]]s (drat. It's [[Legacy:DefensePoint|DefensePoint]]s for team stuff?)
* use [[Legacy:MapScale|MapScale]] to make a reflection of one base
* [[Legacy:Screen|Screen]]
* [[Legacy:CameraSpot|CameraSpot]]
* [[Legacy:HeroStatue|HeroStatue]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''Mychaeel:''' How about calling this page &quot;Mapping for Jailbreak (UT)&quot; instead to stick with the convention?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5073</id>
      <timestamp>2003-04-12T17:39:26Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==General ==

In general, a Jailbreak map is similar to a [[Legacy:CTF|CTF]] in that both teams have a base of some sort which contains a valuable target. The main difference is, of course that the flag has been replaced by a jail release mechanism, and that this jail release mechanism only becomes a viable target when one or more of a player's team mates have become captured. 

The differences in gameplay have several consequences for map design as well. These are strictly conceptual guidelines, not a must of any sort. Because there is no true &quot;objective&quot; until a team mate has been imprisoned, there should be a motivation for a team to venture out of their base, other than reaching the enemy's. This motivation could take the form of a weapon not available in the bases, a powerup, or the like.

As always, everything to do with red is 0 and blue is 1.

==Areas ==

===Base ===

Each team needs a base. This needs:
* a jail release mechanism
* player starts, set with JBPlayerStart actors. Note that Jailbreak never uses the regular PlayerStart class.

This is much like a base for [[Legacy:CTF|CTF]] &amp;ndash; anything goes. However, due to the fact that a player, upon simply reaching a release mechanism, has accomplished his goal and does not have to return to his base in order to score, the mechanism or the complete base may be better defended than it would be in a CTF, since a player only need pass the defense points once.

Also, successfully invading the base doesn't score a point, in ''prohibits scoring'' for the enemy team. So whereas a base that is easy to attack in CTF produces high scores and fast action, in Jailbreak it will tend to result in a null tie and a dull game.

The jail release mechanism is an actor of the class TeamActivatedTrigger. Specifics on this actor are given on the [[Legacy:Jailbreak/Classes|Jailbreak/Classes]] page.

Placement of PlayerStarts is not as important as in CTF: players will only spawn there at the start of the game and on release from the arena. At all other times they spawn in jail and walk out upon release.

The viewpoint can be made to follow an [[Legacy:Interpolated Path|interpolated path]] or attached to a mover (see [[Legacy:Mover Topics|Mover Topics]] for more).

===Jails ===

The map needs two jails. These each need:
* A JailZone actor to define the zone
* A JBViewpoint actor which sets the capture viewpoint for the scoring team
* A means of exit which is triggered by the jail release mechanism, a TeamActivatedTrigger actor 
* player starts, set with JBPlayerStart actors. These need the bJailedStart flag set. It's good design to set these facing the exit, so players that are killed moments before the jail doors are about to close can run out.

A jail should be sealed insofar that a player, without help and without the use of a translocator, but with an impact hammer should not be able to leave the jail. The exit, triggered by the jail release mechanism can be a simple door, but could also be a kicker, a slide, or what not. 

To ensure correct bot behavior, players should be able to leave the jailzone within five seconds of the release mechanism's activation. This is due to the fact that a bot, upon releasing his teammates, cannot 'see' the release mechanism for that period of time to prevent him from incessantly triggering the mechanism until everybody has left the jailzone.

Although no doubt entertaining, it is probably inadvisable to create jails in such a fashion that an outside player can kill its inmates (although a kill on an already imprisoned player does not count towards your score). 

:'''Tip:'''  If you want to have the jails disregard you for testing purposes, enter &lt;tt&gt;set PlayerPawn bIsPlayer false&lt;/tt&gt; at the console.  With that you can safely &quot;ghost&quot; into jails and the arena to watch your bots without being subject to those special zones yourself.  (To revert the change, enter &lt;tt&gt;set PlayerPawn bIsPlayer true&lt;/tt&gt;.)

====Placement ====

The jail area need not be placed directly adjacent to the release mechanism. This mechanism will often be deep within an enemy base, and placing the jail too deep in the enemy base will only lead to a carnage immediately after the jailed prisoner's release. Rather, released prisoners should have a reasonably safe route back to their own base, so they may regroup in relative peace and mount a new assault. If placed between bases, the jail exit should probably face away from the enemy base, so that snipers will not immediately shoot the heads off the escapees.

====Style ====

Weaker players may spend quite some time in jail. Some ideas to alleviate the boredom of hard time:
* sculpt and place the jails in such a fashion that a jailed player has a good view of one or several key points in the game
* add map [[Legacy:Screen|Screen]]s or [[Legacy:CameraSpot|CameraSpot]]s so players can watch the action
* add [[Legacy:Screen|Screen]]s with web pages, server stats or IRC channels.

====Death ====

When all players of one team are held in their jail, the game marks a point, kills them &amp; shows the carnage to the scoring team players. However, it's possible to enhance the standard gibbing with a custom death scene.

If the game finds something that's triggered by RedCaptured/BlueCaptured, the standard gibbing after 4 seconds is disabled and the game expects the map to kill the prisoners. After ForceKillAfter seconds, they're gibbed anyway.

====Viewpoint ====

Each jail needs a JBViewpoint actor.

Quote from the JB forums:

The camera starts at the InterpolationPoint with Position=0 and moves along the path.  When it arrives at an InterpolationPoint with bEndOfPath=True, it stops; otherwise it loops when it arrives at the last InterpolationPoint in the path. 

* To reiterate, if no path is present, JBViewpoint actors simply behave like before; that is, they sit there and don't do anything.
* To make a path work with JBViewpoint actors, the individual InterpolationPoint actors' bNoDelete property must be set to &quot;True.&quot;  If it isn't, the JBViewpoint will refuse to use this path (and state so in the log).  The reason for this is replication-related.
* Since the players that were subjected to the death sequence start watching from the JBViewpoint much later than the players from the capturing team, I have introduced a new JBViewpoint property comprehensibly called &quot;StaticCameraForDyingTeam&quot; (defaults to &quot;True&quot;).  If set to &quot;True,&quot; members of the captured team will have their viewpoint set to the JBViewpoint's original location without any movement; if set to &quot;False,&quot; they'll perform the same camera movement as their capturers, starting when they switch their viewpoint.

A different matter is that you can also (successfully) attach a JBViewpoint to a mover now (Beta 5).  If you have a normal mover that rotates back and forth, so will the the JBViewpoint.  If you need rotation in pitch and roll direction too, you might need El's [[Legacy:ActorAttacher|ActorAttacher]].

Or, set the JBViewpoint's RotationRate and set bFixedRotationDir to &quot;True&quot; and Physics to &quot;PHYS_Rotating,&quot; and the JBViewpoint will continuously revolve according to its RotationRate.

===Arena ===

The arena is an optional component. It's possible to have more than one. Each needs:
* A JBArenaZone actor
* Two JBArenaStart actors, with their teams set.

It should be an area of the map from which it is not possible to escape, or for a specator to fall in. Zone it off nicely, and watch out for those impact jumps. 

A subclass of ZoneInfo, JBArenaZone, tells the game where to host the fight and holds settings on how frequently to stage fights. Add to your arena two JBarenaStarts (subclass of playerstart). Set the teamnumber to 0 for the red start and 1 for the blue. Placing more than one JBArenastart for each team is futile, since the system will always grab the first one.

There are a few more things to keep in mind:
* Don't trigger them too often. If you set them off too often, it may prove very difficult to get all the players in jail at the same time.
* Your arena can be as big or as small as you want, and can contain weapons or other pickups. However, all pickups stay in the arena and may not be kept by either player win or lose. You can have as many arenas in your map as you like. They don't conflict with each other and will summon players independently of each other. For best results, set their '''TriggerAfter''' property so that they're not all triggered at the same time.

:'''Tip:'''  If you want to have the arena disregard you for testing purposes, enter &lt;tt&gt;set PlayerPawn bIsPlayer false&lt;/tt&gt; at the console.  With that you can safely &quot;ghost&quot; into jails and the arena to watch your bots without being subject to those special zones yourself.  (To revert the change, enter &lt;tt&gt;set PlayerPawn bIsPlayer true&lt;/tt&gt;.)

:'''Tip:'''  In order to shorten the wait time between arena fights when testing (or debugging) arenas, here's a bunch of useful console commands that temporarily tell the arena to make fights as frequent as possible: &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone TriggerAfter 0&lt;/tt&gt; &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone TriggerSeconds 2&lt;/tt&gt; &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone NextTrigger 0&lt;/tt&gt; &lt;br /&gt;You can enter those commands at the console.  For more convenience, you can also write them to a plain text file (called &quot;arenatest.txt,&quot; for instance) and simply call with &lt;tt&gt;exec arenatest.txt&lt;/tt&gt; at the console prompt.

==Weapons and Items ==

When placing weapons, keep in mind that Jailbreak will probably be played with weaponstay off. (The Mothership servers have weaponstay on.) This adds weapons distribution as a strategic element. It also some way towards alleviating the imbalance between a team whose players are all free and one with members imprisoned, since relatively more weapons will be available on the side of the 'losing' team.

===Translocator ===

Jailbreak equips players with a translocator but disallows its use on a zone by zone basis. To allow players to translocate into a zone, the [[Legacy:ZoneInfo|ZoneInfo]]'s '''ZoneTag''' must begin with the string &quot;JBTransloc&quot;.

==Bot Support ==

Pathnoding is very similar to [[Legacy:CTF|CTF]]. Bots use [[Legacy:DefensePoint|DefensePoint]]s and [[Legacy:AmbushPoint|AmbushPoint]]s. Also, bots will use altpaths, although the return only variable has no meaning in this context. Be sure to pathnode a route out of the jail.

Again, much of the above is simply a guideline and is in no way binding.

:Bots may have trouble finding the release switch. Try lowering it slightly, this usually fixes the problem. 
::This was an occasional problem in 205, may no longer be an issue with 300  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
:'''Tip:''' When spectating your bots to check their gameplay and your botpathing, sorting the scoreboard by bot orders is very handy: It displays all attacking bots at the top, all defending bots below, and jailed bots at the bottom. Simply press F1 to display the scoreboard and then press GreyStar [*] (by default; or the key you bound to &quot;Switch compass/scoreboard order&quot;) until the status line below the scoreboard reads &quot;Scoreboard sorted by &lt;b&gt;Orders&lt;/b&gt;&quot;.

==Team Settings ==

A quick run-down of the actors and settings required for Jailbreak to work. Remember to set the '''DefaultGameType''' in the [[Legacy:Level Properties|level properties]] to &quot;JailBreak&quot;!

===PlayerStarts ===

The map must not contain any ordinary PlayerStart actors. 
; Main area : JBPlayerStart. Set JBPlayerStart -&gt; bJailedStart = False
; Jail : JBPlayerStart. Set JBPlayerStart -&gt; bJailedStart = True  Several are needed in each jail, maybe 4-6.
; Arena : JBArenaStart.

In all cases, set PlayerStart -&gt; TeamNumber to 0 (red) or 1 (blue).

===JailZone ===
* Red Jail: holds red players prisoner. JailedTeam = 0
* Blue Jail: holds blue players prisoner. JailedTeam = 1 

===Release Switch ===

This is an actor of the class TeamActivatedTrigger. Set:
* isJailReleaseMechanism = true
* Team:
** Defended by blue, releases the red team: Team = 0
** Defended by red, releases the blue team: Team = 1
* Event so something happens to let players out. It's also a good idea to trigger some sort of visual cue so the player activating knows they have suceeded (a lever moving for example).

==Dynamics ==

There are two main incidents that take place during a Jailbreak game: Release and capture. Both of these require a certain amount of work on the part of the mapper:

===Release ===

The release mechanism at its simplest is an actor of the class TeamActivatedTrigger. Set ''IsJailReleaseMechanism'' to True so bots know that it is a jail release switch. It's the responsibility of the mapper to choose an Event name and thus tie the TeamActivatedTrigger to the relevant jail doors (or kicker, or whatever system releases players).

Remember that the release switch located in the Red base must open the doors of the Blue jail to release the Blue players. For headaches induced by the whole red/blue thing, we recommend aspirin ;-)

Note that you can also use a TeamActivatedMechanism for making simple team-specific triggers, like for a team-based armory.

===Capture ===

The game automatically fires events 'RedCaptured' and 'BlueCaptured' when all players of a team are in the jail. If nothing is triggered by these, then players will be gibbed after a certain time (how much?). It's the responsibility of the mapper to make capture deaths more interesting by using these events to trigger something. Note that special JailZone subclasses which incorporate a death method (eg PressureJailZone) need to have their ''Tag'' set to either 'RedCaptured' or 'BlueCaptured' by the mapper to function.

:'''Tip:''' Because the capture events are built into the game type, you won't see red lines connecting actors which are triggered by them. If you find this disturbing, or just to check things are properly connected, create dummy triggers either outside the level or set so nothing can collide with it &amp; give them the each a capture event.

==Finishing Touches ==

As well as a [[Legacy:Screenshot|screenshot]], a Jailbreak map can incoporate a Map Banner and HUD Skins. 

The map banner is displayed on the HUD during pre-play flyby. This is created by embedding one or two 256x128 textures in the [[Legacy:MyLevel|MyLevel]] package, named &quot;SkinMapBanner1&quot;, and optionally &quot;SkinMapBanner2&quot; to make a wider banner.

These textures must both be referenced in the map (by an actor, or discreetly on a surface somewhere) otherwise UnrealEd will discard them on saving.

It is also possible to embed entire custom HUD skins in maps.  See the [http://www.ph.tum.de/~mkath/jb/jbskintutorial.html HUD skinning tutorial] for details.

==Map Standards ==

[[Legacy:ElBundee|ElBundee]] came up with the &quot;'''Jailbreak seal of approval'''&quot;, a short list of useful things each Jailbreak mapper should take care of:
* DefaultGametype set to Jailbreak 
* JBPlayerStarts in jail: at least 3 each jail
* JBPlayerStarts outside: at least upper IdealPlayerCount / 2 + 1 each team 
* No normal [[Legacy:PlayerStart|PlayerStart]]s left
* Set all JailDoorMovers to &quot;CrushWhenEncroach&quot; 
* Map Logo
* LocationStrings wherever possible for [[Legacy:Zone|Zone]]s
* Translocator support (if any) 
* JBViewpoints ( = DeathCams): 1 each jail
* Arena (optional)
* Jail escape routes (optional)

==Other Things ==
* [[Legacy:AmbushPoint|AmbushPoint]]s (drat. It's [[Legacy:DefensePoint|DefensePoint]]s for team stuff?)
* use [[Legacy:MapScale|MapScale]] to make a reflection of one base
* [[Legacy:Screen|Screen]]
* [[Legacy:CameraSpot|CameraSpot]]
* [[Legacy:HeroStatue|HeroStatue]]
* HUD Skin: http://www1.physik.tu-muenchen.de/~mkath/jb/jbskintutorial.html

==See Also ==

On the Unreal Wiki:
* [[Legacy:Jailbreak/Classes|Jailbreak/Classes]]

On the Web: 
* [http://forums.beyondunreal.com/forumdisplay.php?forumid=382 Jailbreak Mapping and Development forum]

----

'''Mychaeel:''' How about calling this page &quot;Mapping for Jailbreak (UT)&quot; instead to stick with the convention?</text>
    </revision>
    <revision>
      <id>35573</id>
      <timestamp>2009-11-02T03:17:42Z</timestamp>
      <contributor>
        <ip>67.161.216.199</ip>
      </contributor>
      <comment>deleted profanity</comment>
      <text xml:space="preserve" />
    </revision>
    <revision>
      <id>35574</id>
      <timestamp>2009-11-03T08:14:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/67.161.216.199|67.161.216.199]] ([[User talk:67.161.216.199|Talk]]) to last revision by [[User:SuperApe|SuperApe]]</comment>
      <text xml:space="preserve">==General ==

In general, a Jailbreak map is similar to a [[Legacy:CTF|CTF]] in that both teams have a base of some sort which contains a valuable target. The main difference is, of course that the flag has been replaced by a jail release mechanism, and that this jail release mechanism only becomes a viable target when one or more of a player's team mates have become captured. 

The differences in gameplay have several consequences for map design as well. These are strictly conceptual guidelines, not a must of any sort. Because there is no true &quot;objective&quot; until a team mate has been imprisoned, there should be a motivation for a team to venture out of their base, other than reaching the enemy's. This motivation could take the form of a weapon not available in the bases, a powerup, or the like.

As always, everything to do with red is 0 and blue is 1.

==Areas ==

===Base ===

Each team needs a base. This needs:
* a jail release mechanism
* player starts, set with JBPlayerStart actors. Note that Jailbreak never uses the regular PlayerStart class.

This is much like a base for [[Legacy:CTF|CTF]] &amp;ndash; anything goes. However, due to the fact that a player, upon simply reaching a release mechanism, has accomplished his goal and does not have to return to his base in order to score, the mechanism or the complete base may be better defended than it would be in a CTF, since a player only need pass the defense points once.

Also, successfully invading the base doesn't score a point, in ''prohibits scoring'' for the enemy team. So whereas a base that is easy to attack in CTF produces high scores and fast action, in Jailbreak it will tend to result in a null tie and a dull game.

The jail release mechanism is an actor of the class TeamActivatedTrigger. Specifics on this actor are given on the [[Legacy:Jailbreak/Classes|Jailbreak/Classes]] page.

Placement of PlayerStarts is not as important as in CTF: players will only spawn there at the start of the game and on release from the arena. At all other times they spawn in jail and walk out upon release.

The viewpoint can be made to follow an [[Legacy:Interpolated Path|interpolated path]] or attached to a mover (see [[Legacy:Mover Topics|Mover Topics]] for more).

===Jails ===

The map needs two jails. These each need:
* A JailZone actor to define the zone
* A JBViewpoint actor which sets the capture viewpoint for the scoring team
* A means of exit which is triggered by the jail release mechanism, a TeamActivatedTrigger actor 
* player starts, set with JBPlayerStart actors. These need the bJailedStart flag set. It's good design to set these facing the exit, so players that are killed moments before the jail doors are about to close can run out.

A jail should be sealed insofar that a player, without help and without the use of a translocator, but with an impact hammer should not be able to leave the jail. The exit, triggered by the jail release mechanism can be a simple door, but could also be a kicker, a slide, or what not. 

To ensure correct bot behavior, players should be able to leave the jailzone within five seconds of the release mechanism's activation. This is due to the fact that a bot, upon releasing his teammates, cannot 'see' the release mechanism for that period of time to prevent him from incessantly triggering the mechanism until everybody has left the jailzone.

Although no doubt entertaining, it is probably inadvisable to create jails in such a fashion that an outside player can kill its inmates (although a kill on an already imprisoned player does not count towards your score). 

:'''Tip:'''  If you want to have the jails disregard you for testing purposes, enter &lt;tt&gt;set PlayerPawn bIsPlayer false&lt;/tt&gt; at the console.  With that you can safely &quot;ghost&quot; into jails and the arena to watch your bots without being subject to those special zones yourself.  (To revert the change, enter &lt;tt&gt;set PlayerPawn bIsPlayer true&lt;/tt&gt;.)

====Placement ====

The jail area need not be placed directly adjacent to the release mechanism. This mechanism will often be deep within an enemy base, and placing the jail too deep in the enemy base will only lead to a carnage immediately after the jailed prisoner's release. Rather, released prisoners should have a reasonably safe route back to their own base, so they may regroup in relative peace and mount a new assault. If placed between bases, the jail exit should probably face away from the enemy base, so that snipers will not immediately shoot the heads off the escapees.

====Style ====

Weaker players may spend quite some time in jail. Some ideas to alleviate the boredom of hard time:
* sculpt and place the jails in such a fashion that a jailed player has a good view of one or several key points in the game
* add map [[Legacy:Screen|Screen]]s or [[Legacy:CameraSpot|CameraSpot]]s so players can watch the action
* add [[Legacy:Screen|Screen]]s with web pages, server stats or IRC channels.

====Death ====

When all players of one team are held in their jail, the game marks a point, kills them &amp; shows the carnage to the scoring team players. However, it's possible to enhance the standard gibbing with a custom death scene.

If the game finds something that's triggered by RedCaptured/BlueCaptured, the standard gibbing after 4 seconds is disabled and the game expects the map to kill the prisoners. After ForceKillAfter seconds, they're gibbed anyway.

====Viewpoint ====

Each jail needs a JBViewpoint actor.

Quote from the JB forums:

The camera starts at the InterpolationPoint with Position=0 and moves along the path.  When it arrives at an InterpolationPoint with bEndOfPath=True, it stops; otherwise it loops when it arrives at the last InterpolationPoint in the path. 

* To reiterate, if no path is present, JBViewpoint actors simply behave like before; that is, they sit there and don't do anything.
* To make a path work with JBViewpoint actors, the individual InterpolationPoint actors' bNoDelete property must be set to &quot;True.&quot;  If it isn't, the JBViewpoint will refuse to use this path (and state so in the log).  The reason for this is replication-related.
* Since the players that were subjected to the death sequence start watching from the JBViewpoint much later than the players from the capturing team, I have introduced a new JBViewpoint property comprehensibly called &quot;StaticCameraForDyingTeam&quot; (defaults to &quot;True&quot;).  If set to &quot;True,&quot; members of the captured team will have their viewpoint set to the JBViewpoint's original location without any movement; if set to &quot;False,&quot; they'll perform the same camera movement as their capturers, starting when they switch their viewpoint.

A different matter is that you can also (successfully) attach a JBViewpoint to a mover now (Beta 5).  If you have a normal mover that rotates back and forth, so will the the JBViewpoint.  If you need rotation in pitch and roll direction too, you might need El's [[Legacy:ActorAttacher|ActorAttacher]].

Or, set the JBViewpoint's RotationRate and set bFixedRotationDir to &quot;True&quot; and Physics to &quot;PHYS_Rotating,&quot; and the JBViewpoint will continuously revolve according to its RotationRate.

===Arena ===

The arena is an optional component. It's possible to have more than one. Each needs:
* A JBArenaZone actor
* Two JBArenaStart actors, with their teams set.

It should be an area of the map from which it is not possible to escape, or for a specator to fall in. Zone it off nicely, and watch out for those impact jumps. 

A subclass of ZoneInfo, JBArenaZone, tells the game where to host the fight and holds settings on how frequently to stage fights. Add to your arena two JBarenaStarts (subclass of playerstart). Set the teamnumber to 0 for the red start and 1 for the blue. Placing more than one JBArenastart for each team is futile, since the system will always grab the first one.

There are a few more things to keep in mind:
* Don't trigger them too often. If you set them off too often, it may prove very difficult to get all the players in jail at the same time.
* Your arena can be as big or as small as you want, and can contain weapons or other pickups. However, all pickups stay in the arena and may not be kept by either player win or lose. You can have as many arenas in your map as you like. They don't conflict with each other and will summon players independently of each other. For best results, set their '''TriggerAfter''' property so that they're not all triggered at the same time.

:'''Tip:'''  If you want to have the arena disregard you for testing purposes, enter &lt;tt&gt;set PlayerPawn bIsPlayer false&lt;/tt&gt; at the console.  With that you can safely &quot;ghost&quot; into jails and the arena to watch your bots without being subject to those special zones yourself.  (To revert the change, enter &lt;tt&gt;set PlayerPawn bIsPlayer true&lt;/tt&gt;.)

:'''Tip:'''  In order to shorten the wait time between arena fights when testing (or debugging) arenas, here's a bunch of useful console commands that temporarily tell the arena to make fights as frequent as possible: &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone TriggerAfter 0&lt;/tt&gt; &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone TriggerSeconds 2&lt;/tt&gt; &lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;set JBArenaZone NextTrigger 0&lt;/tt&gt; &lt;br /&gt;You can enter those commands at the console.  For more convenience, you can also write them to a plain text file (called &quot;arenatest.txt,&quot; for instance) and simply call with &lt;tt&gt;exec arenatest.txt&lt;/tt&gt; at the console prompt.

==Weapons and Items ==

When placing weapons, keep in mind that Jailbreak will probably be played with weaponstay off. (The Mothership servers have weaponstay on.) This adds weapons distribution as a strategic element. It also some way towards alleviating the imbalance between a team whose players are all free and one with members imprisoned, since relatively more weapons will be available on the side of the 'losing' team.

===Translocator ===

Jailbreak equips players with a translocator but disallows its use on a zone by zone basis. To allow players to translocate into a zone, the [[Legacy:ZoneInfo|ZoneInfo]]'s '''ZoneTag''' must begin with the string &quot;JBTransloc&quot;.

==Bot Support ==

Pathnoding is very similar to [[Legacy:CTF|CTF]]. Bots use [[Legacy:DefensePoint|DefensePoint]]s and [[Legacy:AmbushPoint|AmbushPoint]]s. Also, bots will use altpaths, although the return only variable has no meaning in this context. Be sure to pathnode a route out of the jail.

Again, much of the above is simply a guideline and is in no way binding.

:Bots may have trouble finding the release switch. Try lowering it slightly, this usually fixes the problem. 
::This was an occasional problem in 205, may no longer be an issue with 300  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
:'''Tip:''' When spectating your bots to check their gameplay and your botpathing, sorting the scoreboard by bot orders is very handy: It displays all attacking bots at the top, all defending bots below, and jailed bots at the bottom. Simply press F1 to display the scoreboard and then press GreyStar [*] (by default; or the key you bound to &quot;Switch compass/scoreboard order&quot;) until the status line below the scoreboard reads &quot;Scoreboard sorted by &lt;b&gt;Orders&lt;/b&gt;&quot;.

==Team Settings ==

A quick run-down of the actors and settings required for Jailbreak to work. Remember to set the '''DefaultGameType''' in the [[Legacy:Level Properties|level properties]] to &quot;JailBreak&quot;!

===PlayerStarts ===

The map must not contain any ordinary PlayerStart actors. 
; Main area : JBPlayerStart. Set JBPlayerStart -&gt; bJailedStart = False
; Jail : JBPlayerStart. Set JBPlayerStart -&gt; bJailedStart = True  Several are needed in each jail, maybe 4-6.
; Arena : JBArenaStart.

In all cases, set PlayerStart -&gt; TeamNumber to 0 (red) or 1 (blue).

===JailZone ===
* Red Jail: holds red players prisoner. JailedTeam = 0
* Blue Jail: holds blue players prisoner. JailedTeam = 1 

===Release Switch ===

This is an actor of the class TeamActivatedTrigger. Set:
* isJailReleaseMechanism = true
* Team:
** Defended by blue, releases the red team: Team = 0
** Defended by red, releases the blue team: Team = 1
* Event so something happens to let players out. It's also a good idea to trigger some sort of visual cue so the player activating knows they have suceeded (a lever moving for example).

==Dynamics ==

There are two main incidents that take place during a Jailbreak game: Release and capture. Both of these require a certain amount of work on the part of the mapper:

===Release ===

The release mechanism at its simplest is an actor of the class TeamActivatedTrigger. Set ''IsJailReleaseMechanism'' to True so bots know that it is a jail release switch. It's the responsibility of the mapper to choose an Event name and thus tie the TeamActivatedTrigger to the relevant jail doors (or kicker, or whatever system releases players).

Remember that the release switch located in the Red base must open the doors of the Blue jail to release the Blue players. For headaches induced by the whole red/blue thing, we recommend aspirin ;-)

Note that you can also use a TeamActivatedMechanism for making simple team-specific triggers, like for a team-based armory.

===Capture ===

The game automatically fires events 'RedCaptured' and 'BlueCaptured' when all players of a team are in the jail. If nothing is triggered by these, then players will be gibbed after a certain time (how much?). It's the responsibility of the mapper to make capture deaths more interesting by using these events to trigger something. Note that special JailZone subclasses which incorporate a death method (eg PressureJailZone) need to have their ''Tag'' set to either 'RedCaptured' or 'BlueCaptured' by the mapper to function.

:'''Tip:''' Because the capture events are built into the game type, you won't see red lines connecting actors which are triggered by them. If you find this disturbing, or just to check things are properly connected, create dummy triggers either outside the level or set so nothing can collide with it &amp; give them the each a capture event.

==Finishing Touches ==

As well as a [[Legacy:Screenshot|screenshot]], a Jailbreak map can incoporate a Map Banner and HUD Skins. 

The map banner is displayed on the HUD during pre-play flyby. This is created by embedding one or two 256x128 textures in the [[Legacy:MyLevel|MyLevel]] package, named &quot;SkinMapBanner1&quot;, and optionally &quot;SkinMapBanner2&quot; to make a wider banner.

These textures must both be referenced in the map (by an actor, or discreetly on a surface somewhere) otherwise UnrealEd will discard them on saving.

It is also possible to embed entire custom HUD skins in maps.  See the [http://www.ph.tum.de/~mkath/jb/jbskintutorial.html HUD skinning tutorial] for details.

==Map Standards ==

[[Legacy:ElBundee|ElBundee]] came up with the &quot;'''Jailbreak seal of approval'''&quot;, a short list of useful things each Jailbreak mapper should take care of:
* DefaultGametype set to Jailbreak 
* JBPlayerStarts in jail: at least 3 each jail
* JBPlayerStarts outside: at least upper IdealPlayerCount / 2 + 1 each team 
* No normal [[Legacy:PlayerStart|PlayerStart]]s left
* Set all JailDoorMovers to &quot;CrushWhenEncroach&quot; 
* Map Logo
* LocationStrings wherever possible for [[Legacy:Zone|Zone]]s
* Translocator support (if any) 
* JBViewpoints ( = DeathCams): 1 each jail
* Arena (optional)
* Jail escape routes (optional)

==External Links==
* [http://forums.beyondunreal.com/forumdisplay.php?forumid=382 Jailbreak Mapping and Development forum]
* HUD Skin: http://www1.physik.tu-muenchen.de/~mkath/jb/jbskintutorial.html

==Related Topics==
* [[Legacy:Jailbreak/Classes|Jailbreak/Classes]]
* [[Legacy:AmbushPoint|AmbushPoint]]s (drat. It's [[Legacy:DefensePoint|DefensePoint]]s for team stuff?)
* use [[Legacy:MapScale|MapScale]] to make a reflection of one base
* [[Legacy:Screen|Screen]]
* [[Legacy:CameraSpot|CameraSpot]]
* [[Legacy:HeroStatue|HeroStatue]]
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Gametype|Gametype]]

==Discussion==

'''Mychaeel:''' How about calling this page &quot;Mapping for Jailbreak (UT)&quot; instead to stick with the convention?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP</title>
    <id>2195</id>
    <revision>
      <id>5322</id>
      <timestamp>2006-06-12T21:16:57Z</timestamp>
      <contributor>
        <ip>C-67-160-239-80.hsd1.ca.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

'''Unreal Tournament eXpanded MultiPlayer''' (UTXMP) is total conversion of Unreal2 multiplayer expansion (XMP), which lost its support due to closure of Legend Entertainment by Atari in January 2004. Luckily, now '''[http://www.free-monkey.com/main Free Monkey Interactive]''' is developing '''UTXMP''', which brings popular XMP gameplay to Epic Games' '''Unreal Tournament 2004''' with the support of former Legend Entertainment employees.

UTXMP comes with large amount of new textures and [[Legacy:Static Mesh|static mesh]]es, plus all resources from original Unreal2 XMP game. Moreover, all UT2004 resources are available to mappers too.

Also, because UTXMP is built on [[Legacy:UT2004|UT2004]], it has better net code, can handle higher [[Legacy:Polycount|polycount]] and more vehicles at the same time.

==Starting UTXMP editor==

For those who cant find UTXMP Editor shortcut in start menu :D.

You need to start UnrealEd with &quot;-mod=UTXMP&quot; to work with UTXMP maps.

It's easy to do that this way:
# Copy UTXMP desktop shortcut and paste it to desktop.
# Rename to some better name, ie &quot;UTXMP Editor&quot;
# In shortcut properties, change &quot;Target&quot; field value from &quot;C:\UT2004\System\'''UT2004.exe''' -mod=UTXMP&quot; to &quot;C:\UT2004\System\'''UnrealEd.exe''' -mod=UTXMP&quot;
# Click OK and now you can start UED with this shortcut. You can even change its icon to green one :D.

==Testing your map==

You can't play your map by clicking &quot;play map&quot; button in UED. To do that run it from game or create another shortcut with &quot;C:\UT2004\System\UT2004.exe '''&lt;your map name&gt;''' -mod=UTXMP&quot; as target.

==UTXMP game objects==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

==Tutorials==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Radar]]

[[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP map to UTXMP]]

==Some notes==
* DO NOT put U2XMP assets in your UT2k4 root folders(i.e. mesh packages, texture packages, etc..). Also make sure that you dont have dublicated packages in these folders: UT2004\Textures and UT2004\UTXMP\Textures, UT2004\StaticMeshes and UT2004\UTXMP\StaticMeshes, etc..

*You can type in command prompt when testing map:
** &quot;killbots&quot; to stop bots killing you
** &quot;god&quot; to be god
** &quot;changesize 1.3&quot; to become bigger
** &quot;setjumpz X&quot; to adjust jump height

* Loader actor is no longer necessary in UTXMP maps

==UTXMP gameplay tips for mapper==

'''''Following paragraphs should cover basic things mapper needs to know and things he should avoid.'''''

I am probably the first one who tries to write down the problems mapper faces making XMP maps. And almost every problem comes from having three different classes with different skills. I will try to sum up the skills:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |
| style=&quot;text-align: center&quot; |'''Ranger'''
| style=&quot;text-align: center&quot; |'''Tech'''
| style=&quot;text-align: center&quot; |'''Gunner'''  
|-
| style=&quot;text-align: left&quot; |Speed
| style=&quot;text-align: center&quot; |'''++++'''
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''+'''       
|-
| style=&quot;text-align: left&quot; |Hack
| style=&quot;text-align: center&quot; |'''+'''
| style=&quot;text-align: center&quot; |'''+++'''
| style=&quot;text-align: center&quot; |'''+'''       
|-
| style=&quot;text-align: left&quot; |Shield
| style=&quot;text-align: center&quot; |'''+'''
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''++++'''    
|-
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |
|-
| style=&quot;text-align: left&quot; |Offence
| style=&quot;text-align: center&quot; |'''++++'''
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''++'''      
|-
| style=&quot;text-align: left&quot; |Defence
| style=&quot;text-align: center&quot; |
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''++++'''    
|-
| style=&quot;text-align: left&quot; |Mid-field
| style=&quot;text-align: center&quot; |'''+++'''
| style=&quot;text-align: center&quot; |'''+++'''
| style=&quot;text-align: center&quot; |'''+'''       
|}

This table cant be accurate, because '''best gameplay happens when classes are working together'''.

You can also check out [http://www.free-monkey.com/main/manual this manual] if you are new to UTXMP.

To better demonstrate the advantages of each class, lets see in what maps they could get maximum advantage.

====Sniper paradise====

Imagine a large plain map with no fog. And sniping places which only ranger can reach, because he can jump higher. That would be sniper paradise, because he could snipe any other class with ease, since they do not have any such long-range weapons.

====Techer paradise====

Map with a lot of doors. And plenty of energy sources, as well as deploy points. Since a techer can hack much faster, doors are not big problem for him. Oh, and i almost forgot! Long narrow tunnels! Techer places one rocket turret at the end of such tunnel, and it frags everyone who tries to pass it.

====Gunner paradise====

Oh yeah... Small room, one teleporter, and he frags everyone who tries to get in. So make sure teleporters are not the only way to get into your base, because gunner placing mines on them could defend from almost all attacks.

To sum up, the best map should let you play with any class, and give you enough ways to do different things, like getting into the base in 5 different ways, to defend in 5 different ways, to attack in 5 different ways. So everything is about variety and good imagination.

===What does a &quot;standard&quot; XMP map look like?===

The following ''Standard'' map definition does ''not'' mean that you should make only standard maps. It means that if you break some rules, you might face some gameplay problems that you would need to solve in some way.

The ''Standard'' XMP map should:
* Have two bases (or at least something that could be called base)
* Have at least two non-hackable deploy points in each base
* Have enough space to use vehicles
* Not have hackable deploy points close to artifact node
* Have 2-4 energy sources
* At least 5 ways to get into the base
* At least 2 ways from one base to another
* 2-4 deploy points somewhere in the map

==Related Topics==

[[Legacy:Map Design|Map Design]]

[[Legacy:Adding Polish To Maps|Adding Polish To Maps]]

[[Legacy:Gametype|Gametype]]

==Discussion==

'''Smot:''' Who needs 5 base enterances? Isn't that a little much? I can't think of any U2:XMP maps (other than Rampant) with 5 entrances, and Rampant is a b*tch to defent because you can sneak into the node room from like 9 different places. Also, I do believe it's just &quot;Tech&quot;, not &quot;Techer&quot;.

'''Nercury:''' Feel free to correct my grammar mistakes and add anything what is missing. :D

'''Nercury:''' BTW, i am not betatester, also i am not leaking info, so dont blame me if i manage to guess something :P

'''PRG:''' A couple things about this starting with this small piece of info. DO NOT put U2XMP assets in your UT2k4 root folders(ie. mesh packages, texture packages, etc..) You WILL have problems with UTXMP when it comes out. 

Second thing, most of the enclosed bases in stock maps with good play flow have at least 5+ ways to get into the base or artifact node.  Unless the entrances are huge, 3 ways in as stated tends be a bottleneck that makes it impossible for the offence to get in and make it out alive.

'''Nercury:''' You can fix things yourself and leave note here rather than saying whats wrong :)

This page is getting bigger and bigger, and i started thinking about several sub-pages. Now i am just adding info without much care about layout.

'''Tarquin:''' You could make a page for each class, for example.

'''Phalanx:''' now that the mod is out a few more details need adding now like adding a radar, more detail on hackable objects (especailly doors). o and while i'm here for a map to work u need the loader in there too

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5323</id>
      <timestamp>2005-02-22T23:23:13Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

'''Unreal Tournament eXpanded MultiPlayer''' (UTXMP) is total conversion of Unreal2 multiplayer expansion (XMP), which lost its support due to closure of Legend Entertainment by Atari in January 2004. Luckily, now '''[http://www.free-monkey.com/main Free Monkey Interactive]''' is developing '''UTXMP''', which brings popular XMP gameplay to Epic Games' '''Unreal Tournament 2004''' with the support of former Legend Entertainment employees.

UTXMP comes with large amount of new textures and [[Legacy:Static Mesh|static mesh]]es, plus all resources from original Unreal2 XMP game. Moreover, all UT2004 resources are available to mappers too.

Also, because UTXMP is built on [[Legacy:UT2004|UT2004]], it has better net code, can handle higher [[Legacy:Polycount|polycount]] and more vehicles at the same time.

==Starting UTXMP editor==

For those who cant find UTXMP Editor shortcut in start menu :D.

You need to start UnrealEd with &quot;-mod=UTXMP&quot; to work with UTXMP maps.

It's easy to do that this way:
# Copy UTXMP desktop shortcut and paste it to desktop.
# Rename to some better name, ie &quot;UTXMP Editor&quot;
# In shortcut properties, change &quot;Target&quot; field value from &quot;C:\UT2004\System\'''UT2004.exe''' -mod=UTXMP&quot; to &quot;C:\UT2004\System\'''UnrealEd.exe''' -mod=UTXMP&quot;
# Click OK and now you can start UED with this shortcut. You can even change its icon to green one :D.

==Testing your map==

You can't play your map by clicking &quot;play map&quot; button in UED. To do that run it from game or create another shortcut with &quot;C:\UT2004\System\UT2004.exe '''&lt;your map name&gt;''' -mod=UTXMP&quot; as target.

==UTXMP game objects==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

==Tutorials==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding Radar]]

[[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP map to UTXMP]]

==Some notes==
* DO NOT put U2XMP assets in your UT2k4 root folders(i.e. mesh packages, texture packages, etc..). Also make sure that you dont have dublicated packages in these folders: UT2004\Textures and UT2004\UTXMP\Textures, UT2004\StaticMeshes and UT2004\UTXMP\StaticMeshes, etc..

*You can type in command prompt when testing map:
** &quot;killbots&quot; to stop bots killing you
** &quot;god&quot; to be god
** &quot;changesize 1.3&quot; to become bigger
** &quot;setjumpz X&quot; to adjust jump height

* Loader actor is no longer necessary in UTXMP maps

==UTXMP gameplay tips for mapper==

'''''Following paragraphs should cover basic things mapper needs to know and things he should avoid.'''''

I am probably the first one who tries to write down the problems mapper faces making XMP maps. And almost every problem comes from having three different classes with different skills. I will try to sum up the skills:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |
| style=&quot;text-align: center&quot; |'''Ranger'''
| style=&quot;text-align: center&quot; |'''Techer'''
| style=&quot;text-align: center&quot; |'''Gunner'''  
|-
| style=&quot;text-align: left&quot; |Speed
| style=&quot;text-align: center&quot; |'''++++'''
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''+'''       
|-
| style=&quot;text-align: left&quot; |Hack
| style=&quot;text-align: center&quot; |'''+'''
| style=&quot;text-align: center&quot; |'''+++'''
| style=&quot;text-align: center&quot; |'''+'''       
|-
| style=&quot;text-align: left&quot; |Shield
| style=&quot;text-align: center&quot; |'''+'''
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''++++'''    
|-
| colspan=&quot;4&quot; style=&quot;text-align: center&quot; |
|-
| style=&quot;text-align: left&quot; |Offence
| style=&quot;text-align: center&quot; |'''++++'''
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''++'''      
|-
| style=&quot;text-align: left&quot; |Defence
| style=&quot;text-align: center&quot; |
| style=&quot;text-align: center&quot; |'''++'''
| style=&quot;text-align: center&quot; |'''++++'''    
|-
| style=&quot;text-align: left&quot; |Mid-field
| style=&quot;text-align: center&quot; |'''+++'''
| style=&quot;text-align: center&quot; |'''+++'''
| style=&quot;text-align: center&quot; |'''+'''       
|}

This table cant be accurate, because '''best gameplay happens when classes are working together'''.

You can also check out [http://www.free-monkey.com/main/manual this manual] if you are new to UTXMP.

To better demonstrate the advantages of each class, lets see in what maps they could get maximum advantage.

====Sniper paradise====

Imagine a large plain map with no fog. And sniping places which only ranger can reach, because he can jump higher. That would be sniper paradise, because he could snipe any other class with ease, since they do not have any such long-range weapons.

====Techer paradise====

Map with a lot of doors. And plenty of energy sources, as well as deploy points. Since a techer can hack much faster, doors are not big problem for him. Oh, and i almost forgot! Long narrow tunnels! Techer places one rocket turret at the end of such tunnel, and it frags everyone who tries to pass it.

====Gunner paradise====

Oh yeah... Small room, one teleporter, and he frags everyone who tries to get in. So make sure teleporters are not the only way to get into your base, because gunner placing mines on them could defend from almost all attacks.

To sum up, the best map should let you play with any class, and give you enough ways to do different things, like getting into the base in 5 different ways, to defend in 5 different ways, to attack in 5 different ways. So everything is about variety and good imagination.

===What does a &quot;standard&quot; XMP map look like?===

The following ''Standard'' map definition does ''not'' mean that you should make only standard maps. It means that if you break some rules, you might face some gameplay problems that you would need to solve in some way.

The ''Standard'' XMP map should:
* Have two bases (or at least something that could be called base)
* Have at least two non-hackable deploy points in each base
* Have enough space to use vehicles
* Not have hackable deploy points close to artifact node
* Have 2-4 energy sources
* At least 5 ways to get into the base
* At least 2 ways from one base to another
* 2-4 deploy points somewhere in the map

==Related Topics==

[[Legacy:Map Design|Map Design]]

[[Legacy:Adding Polish To Maps|Adding Polish To Maps]]

[[Legacy:Gametype|Gametype]]

==Discussion==

'''Nercury:''' Feel free to correct my grammar mistakes and add anything what is missing. :D

'''Nercury:''' BTW, i am not betatester, also i am not leaking info, so dont blame me if i manage to guess something :P

'''PRG:''' A couple things about this starting with this small piece of info. DO NOT put U2XMP assets in your UT2k4 root folders(ie. mesh packages, texture packages, etc..) You WILL have problems with UTXMP when it comes out. 

Second thing, most of the enclosed bases in stock maps with good play flow have at least 5+ ways to get into the base or artifact node.  Unless the entrances are huge, 3 ways in as stated tends be a bottleneck that makes it impossible for the offence to get in and make it out alive.

'''Nercury:''' You can fix things yourself and leave note here rather than saying whats wrong :)

This page is getting bigger and bigger, and i started thinking about several sub-pages. Now i am just adding info without much care about layout.

'''Tarquin:''' You could make a page for each class, for example.

'''Phalanx:''' now that the mod is out a few more details need adding now like adding a radar, more detail on hackable objects (especailly doors). o and while i'm here for a map to work u need the loader in there too

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Adding Radar</title>
    <id>2207</id>
    <revision>
      <id>5344</id>
      <timestamp>2006-07-06T00:57:29Z</timestamp>
      <contributor>
        <ip>Cpc2-bolt4-0-0-cust802.manc.cable.ntl.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Radar for UTXMP by ...AndRelax

This is dead easy really.
# In UnrealEd, save up and prepare a view window for a [[Legacy:Level Screenshot|Level Screenshot]] by using dynamic light and [[Legacy:Realtime Preview|realtime preview]], and maybe deleting or [[Legacy:Hiding Actors|Hiding Actors]] or icons you don't want.
# Take the screenie from above, with your camera looking down, positioned at 0,0 on the grid and 'north' at the top. If you didn't put the map in the middle, then still take the pic from the centre, just leave it so the map is offset.
# Crop the image to a square in your fave [[Legacy:Image Editor|image editor]], resize it to 512x512 and save as a tga.
# Import it as a texture into Ued, compress it to dxt1 or appropriate. Select it for use later.
# Go to the [[Legacy:Level Properties|Level Properties]] and under RadarMap, set
* bShowRadarMap=1   of course
* bUseTerrainForRadar=1 if your map has [[Legacy:Terrain|terrain]] to its extents, this is convenient, otherwise if there is no terrain or you have stuff beyond its extents, set to 0.
* CustomRadarRange -active if the above is set to 0, this is the width of your level in unrealunits that the image you imported represents. 
* RadarMapImage -set to the texture you imported.

[[Legacy:Playtest|Playtest]], and check particularly that it's the right way up (!) and that the scale is right. The best way to check is to walk to a deploy point and see if the game's representation of it matches your radar image.

==Comments:==

'''Sp4ceLorD:''' You may use the top view with terrain=shown for simple maps / to check the angle of your screenshot :)

'''Phalanx''' another quick footnote, its extreamly hard to get the radar 100% accurate, got this from FMI themselves, i guess its the way its done, TBH a radar thats 99% accurate should be ok</text>
    </revision>
    <revision>
      <id>5345</id>
      <timestamp>2005-03-26T13:47:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Radar for UTXMP by ...AndRelax

This is dead easy really.
# In UnrealEd, save up and prepare a view window for a [[Legacy:Level Screenshot|Level Screenshot]] by using dynamic light and [[Legacy:Realtime Preview|realtime preview]], and maybe deleting or [[Legacy:Hiding Actors|Hiding Actors]] or icons you don't want.
# Take the screenie from above, with your camera looking down, positioned at 0,0 on the grid and 'north' at the top. If you didn't put the map in the middle, then still take the pic from the centre, just leave it so the map is offset.
# Crop the image to a square in your fave [[Legacy:Image Editor|image editor]], resize it to 512x512 and save as a tga.
# Import it as a texture into Ued, compress it to dxt1 or appropriate. Select it for use later.
# Go to the [[Legacy:Level Properties|Level Properties]] and under RadarMap, set
* bShowRadarMap=1   of course
* bUseTerrainForRadar=1 if your map has [[Legacy:Terrain|terrain]] to its extents, this is convenient, otherwise if there is no terrain or you have stuff beyond its extents, set to 0.
* CustomRadarRange -active if the above is set to 0, this is the width of your level in unrealunits that the image you imported represents. 
* RadarMapImage -set to the texture you imported.

[[Legacy:Playtest|Playtest]], and check particularly that it's the right way up (!) and that the scale is right. The best way to check is to walk to a deploy point and see if the game's representation of it matches your radar image.

==Comments:==

'''Sp4ceLorD:''' You may use the top view with terrain=shown for simple maps / to check the angle of your screenshot :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Artifact Node</title>
    <id>2202</id>
    <revision>
      <id>5338</id>
      <timestamp>2004-12-18T22:44:21Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPArtifactNode actor here:

{{classbox| NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; XMPArtifactNode}}

==Actor properties==
; Team &gt;&gt; TeamIndex : set to 0 for RED, 1 for BLUE, 255 for neutral (green).
; XMPArtifactNode &gt;&gt; HolderClasses : add two artifacts in two slots. Make sure your Red and Blue node slots are different: for example, if you added artifacts to slots 0 and 2 in Red node, in Blue node add them to 1 and 3.

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Deployment Point</title>
    <id>2200</id>
    <revision>
      <id>5333</id>
      <timestamp>2004-12-18T22:38:17Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPDeployPoint actor here:

{{classbox| NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; XMPHackTrigger &gt;&gt; XMPDeployPoint}}

==Actor properties==
; XMPHackTrigger &gt;&gt; bUsable : set to False to make non-hackable deploy at the base.
; XMPHackTrigger &gt;&gt; Team : set to 0 for RED, 1 for BLUE, 255 for neutral (green).
; XMPDeployPoint &gt;&gt; RespawnDelayPct : adjust amount of time deploy point delays to make spawn moment of deploys differ.

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
    <revision>
      <id>5334</id>
      <timestamp>2004-12-18T16:38:42Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Deployment point actor===

{{classbox| NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; XMPHackTrigger &gt;&gt; XMPDeployPoint}}

====Properties====

'''XMPHackTrigger'''
* bUsable - set to False to make non-hackable deploy at the base.
* Team - set to 0 for RED, 1 for BLUE, 255 for neutral (green).

'''XMPDeployPoint'''
* RespawnDelayPct - adjust amount of time deploy point delays to make spawn moment of deploys differ.

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Energy Source</title>
    <id>2201</id>
    <revision>
      <id>5335</id>
      <timestamp>2004-12-19T19:07:03Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPGenerator actor here:

{{classbox| NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; XMPHackTrigger &gt;&gt; XMPGenerator}}

==Actor properties==
; XMPGenerator &gt;&gt; EnergyRateBase : change this value to ajust how much energy is drained to owning team.
; XMPGenerator &gt;&gt; EnergyRatePerPlayer : change this value to ajust how much energy depends on number of players.
; XMPHackTrigger &gt;&gt; bUsable : set to False to make non-hackable energy source.
; XMPHackTrigger &gt;&gt; Team : set to 0 for RED, 1 for BLUE, 255 for neutral (green).

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]

'''Tarquin:''' Is this a page for several UTXMP actors, or for just the XMPGenerator? If the latter, it might be better to put it at [[Legacy:XMPGenerator|XMPGenerator]] and treat like a class page

'''Nercury:''' Just XMPGenerator. I wrote property groups before &quot;&gt;&gt;&quot; to help mappers find properties easier. Also i want to delay saving this page as class page until UTXMP is no longer beta.</text>
    </revision>
    <revision>
      <id>5336</id>
      <timestamp>2004-12-18T22:33:46Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPGenerator actor here:

{{classbox| NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; XMPHackTrigger &gt;&gt; XMPGenerator}}

==Actor properties==
; XMPGenerator &gt;&gt; EnergyRateBase : change this value to ajust how much energy is drained to owning team.
; XMPGenerator &gt;&gt; EnergyRatePerPlayer : change this value to ajust how much energy depends on number of players.
; XMPHackTrigger &gt;&gt; bUsable : set to False to make non-hackable energy source.
; XMPHackTrigger &gt;&gt; Team : set to 0 for RED, 1 for BLUE, 255 for neutral (green).

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
    <revision>
      <id>5337</id>
      <timestamp>2004-12-18T23:57:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPGenerator actor here:

{{classbox| NavigationPoint &gt;&gt; JumpDest &gt;&gt; JumpSpot &gt;&gt; GameObjective &gt;&gt; XMPHackTrigger &gt;&gt; XMPGenerator}}

==Actor properties==
; XMPGenerator &gt;&gt; EnergyRateBase : change this value to ajust how much energy is drained to owning team.
; XMPGenerator &gt;&gt; EnergyRatePerPlayer : change this value to ajust how much energy depends on number of players.
; XMPHackTrigger &gt;&gt; bUsable : set to False to make non-hackable energy source.
; XMPHackTrigger &gt;&gt; Team : set to 0 for RED, 1 for BLUE, 255 for neutral (green).

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]

'''Tarquin:''' Is this a page for several UTXMP actors, or for just the XMPGenerator? If the latter, it might be better to put it at [[Legacy:XMPGenerator|XMPGenerator]] and treat like a class page</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Hackable Doors And Movers</title>
    <id>2206</id>
    <revision>
      <id>5342</id>
      <timestamp>2004-12-18T16:51:49Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Hackable doors and movers===

'''''[needs to be added]'''''

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
    <revision>
      <id>5343</id>
      <timestamp>2004-12-18T16:49:03Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Hackable doors and movers===

'''''[needs to be added]'''''

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Manned Turrets</title>
    <id>2205</id>
    <revision>
      <id>5341</id>
      <timestamp>2004-12-18T16:48:22Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Manned turrets===

'''''[needs to be added]'''''

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/Supply Stations</title>
    <id>2203</id>
    <revision>
      <id>5339</id>
      <timestamp>2004-12-18T22:47:10Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPHealthStation, XMPEnergyStation and XMPSupplyStation actors here:

{{classbox| xPickUpBase &gt;&gt; XMPPowerStation &gt;&gt; *}}

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/XMP Vehicle Factory]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UTXMP/XMP Vehicle Factory</title>
    <id>2204</id>
    <revision>
      <id>5340</id>
      <timestamp>2004-12-19T19:09:27Z</timestamp>
      <contributor>
        <ip>Nercury</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Look for XMPRaptorFactory, XMPJuggernautFactory and XMPHarbingerFactory here:

{{classbox| SVehicleFactory &gt;&gt; XMPVehicleFactory &gt;&gt; *}}

==Actor properties==
; XMPVehicleFactory &gt;&gt; RespawnTime : respawn time :p.

==See also==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deployment Point]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Energy Source]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artifact Node]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Supply Stations]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manned Turrets]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hackable Doors And Movers]]

Back to [[Legacy:Mapping For UTXMP|Mapping For UTXMP]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Unreal Coop</title>
    <id>1843</id>
    <revision>
      <id>4525</id>
      <timestamp>2006-09-22T17:30:18Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''Contributed to the Unreal Wiki by [[Legacy:Techno_JF|Techno_JF]].''

Unreal Coop is an alternate gametype that some [[Legacy:Mapping For Unreal SinglePlayer|SinglePlayer]] maps can take advantage of.  (Technically, all true SinglePlayer maps can be played in Coop, but this is highly inadvisable for a number of them.)

I guess the best way to consider what makes a map successful for coop play is to think of features found in successful coop maps.  (Note, this page assumes that standard coop with Unreal's default weapons is meant.)

===Player Starts===

Obviously, the most important thing to do to make a map playable in coop is to include multiple [[Legacy:PlayerStart|PlayerStarts]] at the beginning of the map.  Having your players telefrag each other as they start the level is extremely bad form.  In many cases, this might require getting creative so that there are actually places to put PlayerStarts.

{{innerbox| ''Example:''  in Outpost 3J, a map that comes with Unreal 1, the player would normally start at the beginning of a long tunnel of water that he had to swim through to enter the base.  However, the storyline of the map is set up so that the player easily finds a SCUBA Gear pickup in the previous level.  In coop, this piece of the storyline cannot be assumed.  There is only one set of SCUBA Gear in the previous level, which means that every other player would drown, including players who join the server while this level is running.  To fix this, all the PlayerStarts were put in the first room, at the point where a player on his own would be surfacing from the water tunnel to enter the base.

}}

===Weapons===

Weapons should be made available to players at the beginning of each level.  It can be rather frustrating for someone who is just joining a server to have to defend himself with nothing but the Dispersion Pistol.  Easy access to a Stinger or an ASMD is highly advisable, but sometimes an Automag will suffice.  Remember that most Coop servers will be set up so that weapons instantly respawn after they're picked up.  In other words, players will start moving into the level with fully loaded weapons of whatever type you leave them.

===Filters===

Remember to take advantage of the [[Legacy:Actor (UT)/Filter|Filter]] properties of various Actors that you place in your level.  Though these properties are primarily used to determine which difficulty levels an Actor is present or absent in, there are additional variables to prevent Actors from showing up in either SinglePlayer or network games.  These variables are:
* bSinglePlayer
* bNet
* bNetSpecial

For example, you could have that unbalancing Flak Cannon near the beginning of your level be missing when the level is played online, or you could create an extra team of Krall that will only be there when the level is played online.  Also, remember that CreatureFactories can be set up to produce an additional number of creatures specifically for Coop games.  The variable is '''AddedCoopCapacity'''.  This is yet another way for you to get creative when you build your level.

===Scripted Scenes===

Do you remember those high-intensity areas of some of the Unreal levels, where a door would slam shut behind you when you entered a room and you would have to face some major enemy or group of enemies?  You shouldn't abandon these ideas if you're planning on making your maps Coop-compatible.  On the other hand, you'll certainly need to tweak them a bit so that they still work in coop.  This is most easily done by making an alternate entrance into the combat area.  Seal off the area with a [[Legacy:Mover|Mover]], and make the mover so that it only works in online play.  (Filtering [[Legacy:Dispatcher|Dispatchers]] is usually the best way of doing this.)  Players arriving later should be able to get into the combat area through this route, but no player should be able to use it to escape from the combat area.

{{innerbox|''Examples:'' The three most well-known instances of this mechanic in the Unreal 1 maps are for the Titan in the Dark Arena, the Titan in the Temple of Vandora, and the room in the Cellars at Dasa Pass where you have to kill all the Krall before the doors will open again.

}}

===Advance Starts===

For those of you who are familiar with the [[Legacy:Mapping For AS|Assault]] gametype in Unreal Tournament, you might want to take a cue from this style of mapping if your level becomes a bit too large.  In Assault, when certain objectives are accomplished by the attacking team, a new set of PlayerStarts is turned on while the original ones are turned off.  The same principle holds true for Coop.  Nobody likes having to spend five minutes running through the empty parts of a level just to get back up to where the action is taking place.  

''Errata:  I have been informed that this does not seem to work in Coop for either Unreal 1 or OldSkool Amp'd, for the simple reason that PlayerStarts did not have bEnabled variables in Unreal 1.  However, this will be possible in the version of Coop that comes with Operation: Na Pali.''

{{innerbox|''Counterexample:''  In the Sunspire, if a player dies after getting almost all the way up the tower, then the player respawns back at the gate, and they have to run all the way over the ledge, back to the door of the Sunspire itself, and then they have to work their way back up through all the places where they had originally been.  Most players find this to be a major turnoff, especially when no one else is very close to completing the level.  This is the perfect example of what to avoid in a large coop-compatible map.

}}

===Finale===

Last but not least, do something for the end of your maps that makes them a bit more coop-compatible.  One problem with the stock Unreal maps is that you can't do anything else with them after you get to the map with the final cutscene. The server becomes entirely useless because it's just running a cutscene map where nothing is happening.  What I would suggest is to filter [[Legacy:Teleporter|Teleporters]] for standalone play and online play.  The Teleporter at the end of your last map for the SinglePlayer gametype will lead to a cutscene or whatever other dynamic ending you have planned.  On the other hand, the Teleporter at this location for the Coop gametype might lead back to the very first map in your pack.

===Conclusion===

So, this may look like a lot of information to go through, but most of it is just common sense that's been given a bit of contemplation.  Just as with any mapping project, you have the final word as to what stays in your map and what gets the axe.  You know that you want people to enjoy playing your SinglePlayer maps, and you don't want them to just play your maps once and then never want to look at them again.  Making your maps playable in Coop is a definite plus when it comes to making a SinglePlayer map that can be enjoyed over and over again.

==Related Topics==
* [[Legacy:Mapping For Unreal SinglePlayer|Mapping For Unreal SinglePlayer]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

===Custom Content===
* [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]] &amp;ndash; A singleplayer/cooperative gametype for UT2004.

==Discussion==

'''SuperApe:''' I will be revising this page soon.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4526</id>
      <timestamp>2003-05-23T21:23:24Z</timestamp>
      <contributor>
        <ip>Techno JF</ip>
      </contributor>
      <minor/>
      <comment>Minor text changes.</comment>
      <text xml:space="preserve">==Mapping for the Coop Gametype ==

Unreal Coop is an alternate gametype that some [[Legacy:Mapping For Unreal SinglePlayer|SinglePlayer]] maps can take advantage of.  (Technically, all true SinglePlayer maps can be played in Coop, but this is highly inadvisable for a number of them.)

I guess the best way to consider what makes a map successful for coop play is to think of features found in successful coop maps.  (Note, this page assumes that standard coop with Unreal's default weapons is meant.)

===Player Starts ===

Obviously, the most important thing to do to make a map playable in coop is to include multiple [[Legacy:PlayerStart|PlayerStarts]] at the beginning of the map.  Having your players telefrag each other as they start the level is extremely bad form.  In many cases, this might require getting creative so that there are actually places to put PlayerStarts.

{{innerbox| ''Example:''  in Outpost 3J, a map that comes with Unreal 1, the player would normally start at the beginning of a long tunnel of water that he had to swim through to enter the base.  However, the storyline of the map is set up so that the player easily finds a SCUBA Gear pickup in the previous level.  In coop, this piece of the storyline cannot be assumed.  There is only one set of SCUBA Gear in the previous level, which means that every other player would drown, including players who join the server while this level is running.  To fix this, all the PlayerStarts were put in the first room, at the point where a player on his own would be surfacing from the water tunnel to enter the base.

}}

===Weapons ===

Weapons should be made available to players at the beginning of each level.  It can be rather frustrating for someone who is just joining a server to have to defend himself with nothing but the Dispersion Pistol.  Easy access to a Stinger or an ASMD is highly advisable, but sometimes an Automag will suffice.  Remember that most Coop servers will be set up so that weapons instantly respawn after they're picked up.  In other words, players will start moving into the level with fully loaded weapons of whatever type you leave them.

===Filters ===

Remember to take advantage of the [[Legacy:Actor (UT)/Filter|Filter]] properties of various Actors that you place in your level.  Though these properties are primarily used to determine which difficulty levels an Actor is present or absent in, there are additional variables to prevent Actors from showing up in either SinglePlayer or network games.  These variables are:
* bSinglePlayer
* bNet
* bNetSpecial

For example, you could have that unbalancing Flak Cannon near the beginning of your level be missing when the level is played online, or you could create an extra team of Krall that will only be there when the level is played online.  Also, remember that CreatureFactories can be set up to produce an additional number of creatures specifically for Coop games.  The variable is '''AddedCoopCapacity'''.  This is yet another way for you to get creative when you build your level.

===Scripted Scenes ===

Do you remember those high-intensity areas of some of the Unreal levels, where a door would slam shut behind you when you entered a room and you would have to face some major enemy or group of enemies?  You shouldn't abandon these ideas if you're planning on making your maps Coop-compatible.  On the other hand, you'll certainly need to tweak them a bit so that they still work in coop.  This is most easily done by making an alternate entrance into the combat area.  Seal off the area with a [[Legacy:Mover|Mover]], and make the mover so that it only works in online play.  (Filtering [[Legacy:Dispatcher|Dispatchers]] is usually the best way of doing this.)  Players arriving later should be able to get into the combat area through this route, but no player should be able to use it to escape from the combat area.

{{innerbox|''Examples:'' The three most well-known instances of this mechanic in the Unreal 1 maps are for the Titan in the Dark Arena, the Titan in the Temple of Vandora, and the room in the Cellars at Dasa Pass where you have to kill all the Krall before the doors will open again.

}}

===Advance Starts ===

For those of you who are familiar with the [[Legacy:Mapping For AS|Assault]] gametype in Unreal Tournament, you might want to take a cue from this style of mapping if your level becomes a bit too large.  In Assault, when certain objectives are accomplished by the attacking team, a new set of PlayerStarts is turned on while the original ones are turned off.  The same principle holds true for Coop.  Nobody likes having to spend five minutes running through the empty parts of a level just to get back up to where the action is taking place.  

''Errata:  I have been informed that this does not seem to work in Coop for either Unreal 1 or OldSkool Amp'd, for the simple reason that PlayerStarts did not have bEnabled variables in Unreal 1.  However, this will be possible in the version of Coop that comes with Operation: Na Pali.''

{{innerbox|''Counterexample:''  In the Sunspire, if a player dies after getting almost all the way up the tower, then the player respawns back at the gate, and they have to run all the way over the ledge, back to the door of the Sunspire itself, and then they have to work their way back up through all the places where they had originally been.  Most players find this to be a major turnoff, especially when no one else is very close to completing the level.  This is the perfect example of what to avoid in a large coop-compatible map.

}}

===Finale ===

Last but not least, do something for the end of your maps that makes them a bit more coop-compatible.  One problem with the stock Unreal maps is that you can't do anything else with them after you get to the map with the final cutscene. The server becomes entirely useless because it's just running a cutscene map where nothing is happening.  What I would suggest is to filter [[Legacy:Teleporter|Teleporters]] for standalone play and online play.  The Teleporter at the end of your last map for the SinglePlayer gametype will lead to a cutscene or whatever other dynamic ending you have planned.  On the other hand, the Teleporter at this location for the Coop gametype might lead back to the very first map in your pack.

===Conclusion ===

So, this may look like a lot of information to go through, but most of it is just common sense that's been given a bit of contemplation.  Just as with any mapping project, you have the final word as to what stays in your map and what gets the axe.  You know that you want people to enjoy playing your SinglePlayer maps, and you don't want them to just play your maps once and then never want to look at them again.  Making your maps playable in Coop is a definite plus when it comes to making a SinglePlayer map that can be enjoyed over and over again.

''Contributed to the Unreal Wiki by [[Legacy:Techno_JF|Techno_JF]].''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For Unreal SinglePlayer</title>
    <id>1842</id>
    <revision>
      <id>4523</id>
      <timestamp>2006-09-22T17:26:21Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">''Originally published at [http://www.unrealsp.org UnrealSP.org] by Drevlin and eVOLVE''

==Introduction==

You want to create a singleplayer level but don’t know in what end to start? Perhaps you have already created a singleplayer map but you feel that it is missing that little “extra”. In the following documentation you’ll read about how to create a better singleplayer experience…

NOTE that this is not a pure tutorial - in some places I might describe how to make stuff but you should not count on it.

====Index====
# Lighting
# Use of environment 
# Holding up a storyline and keeping it exciting. 
# Weapon / powerup placement 
# Creatures and scripted sequences
# Various small tips for Singleplayer mappers

==Lighting==

You might think wonder “what difference may sp lighting do compared to lighting in multiplayer maps?” Well not much really J

Although you need to plan your lighting a bit better - in multiplayer a lot of people turn lighting off to see all of the level unlit. There are not many people who do the same in singleplayer maps. Lighting is an important factor in the atmosphere of a level and atmosphere in singleplayer maps is more important than in multiplayer maps. Remember the flickering corridors in Doom, and it gave you that “omg Omg OMg OMG!!!!” feeling? 

One must remember that lighting is not just the presence of light, but also the absence of it. Use shadows to your advantage when covering enemies and secret areas (more on secret areas in “Use of environment”) Allot of people don’t use that much of coloured lights anymore, which I find to be a shame. I mean look around yourself, the light you see around you is not just one colour, and if it is it sure as *ell not white/uncoloured. When coloured lighting was introduced in Quake 2 (It was first, right?) Everyone thought “oooh yeeeey… that looks awesome!!” And with Unreal it was “OOOOH YEA!! HOLY MOTHER!!!” Unreal has one of the most advanced lighting engines to date, use it. 

In short:
* Think not only in the ways of “light there and light there” but also in the ways of absence of light. Hide enemies in shadows, use special effects such as flickering, Strobe and other to create a rich light map. 

==Use of environment==

A very important factor in singleplayer levels is that the environment feels realistic for what’s going on, meaning that if you are making a level which has the story of a wrecked alien city you don’t go build a medival castle… “But of course” you say but remember the case mentioned above, was a extreme chase. Small things such as miss aligned textures, poor use of textures or perhaps a misplaced powerup can completely ruin a level.

Be smart in the design of the level. Use the [[Legacy:Z-Axis|Z-axis]] (up and down, folks) in your work; surprise the player with special effects and, of course, overwhelming architecture.

One thing that I miss in today’s games is the &quot;Secret areas&quot; where goodies such as weapons or armors can be found. Hide secret passages in shadows and/or use natural covers (Trees, bushes, rocks etc).

Also when you make Castles or houses or facilities remember to make the realistic and make sure that the architecture is natural and doesn’t get in the players way. Also make sure that the creatures that inhabit the place find it easy to navigate. Make multiple rooms with areas such as sleeping halls, libraries, engine rooms, dining rooms, transport tunnels - anything to make the building feel realistic for its purpose (I find it hard to believe that an alien race invaded a planet only to build useless buildings on it.)

In short:
* Use the Z-Axis to your advantage by not only building the level on the X and Y axis. Be a perfectionist! Look for small flaws such as wrongly aligned textures alike and correct them. 
* Make Eye candy &amp;ndash; when everyone says “Gameplay comes first” they are correct, however this doesn’t disable you from making a good-looking level. 

Bottom line is what looks good and plays good is good level Environmental wise.

==Holding up a storyline and keeping it exciting ==

You should have completed the entire story and plot before starting the work on the level/levels and it should contain information about what will be told (using the translator). Just as in a good book the ending should be surprising and to do this you should lead the player into a, so to say, “different direction” so when the ending does appear he is totally unprepared for it (Mentally wise). You can also use Translator events in an “unknowing way” - meaning that you, for example, stumble across a few dead corpses of a few humans who have had “Sightings of a aggressive species”. The player feel a bit excited for seeing this “Aggressive species” as well as he is a bit afraid to encounter it.

Another thing which is very effective is a simple change of music. Switching from calm music to an echoeing silence will make the player cautious, and maybe afriad. The opposite to. Just when the player thinks its over you can suddenly change the music for a &quot;surprising&quot; feel.

===Advanced Story Telling===

The following section is for the ones who feel they want to do more than just Translator events to be the main source of information… How to accomplish this? Use movies/in game sequences. Ill tell you about the latter first:

By saying &quot;in game sequences&quot; I mean Scripted sequences… still not with me? Remember the Skaarj that ran away in the first level of Unreal when you got the dispersion pistol? Or perhaps when the poor guy gets thrown into a wall followed by a couple of rockets from a brute? That is what I am talking about. This may not be the CLEAREST way of telling the story (And you should not only use this method) but it’s a real cool thing that I use a lot in my levels. It don’t just have to be made to tell the story but just as a “cool thing” to have in your level. See more on scripted sequences down below. 

You can go one step longer and use movies, using the game engine, to tell the story &amp;ndash; have you ever heard of the word “Machinima”? Its another word for “Movies which uses a game engine” (Good short, eh?) This is easily made in the powerful tool put together by the great Unframed Team (www.unframed.org) called UMS or Unreal Movie Studio (see [[Legacy:Capturing Unreal Video|Capturing Unreal Video]]). In it you will find a lot of useful features that will enable to make your level a interactive movie if you so want J. If you feel that you just wish to use the regular tools already existing in UnrealED (or are just to tired to learn some new tool) you can make less advanced movies using just UnrealED (But it will take longer time and is more difficult and uncontrollable)

In short:
* Hide the true objective of the campaign until the very end of the scenario. 

==Inventory Item Placement==

A very important topic as the placement of the weapons and powerups are '''vital''' to build a level. 

The best way to find out what is needed and what weapon/powerup feels right at a certain spot is simply to play the level (Using no cheats). Keep in mind that there are worse people than you that are going to play the level so don’t place the weapon so you barely survive. 

In Short:
* Aw cmon… The info stated above is NOT very long… Read it trough you lazy sob J

==Creatures and ScriptedSequences==

The main factor in a good level is really the characters you meet in it and who you are fighting because think of it &amp;ndash; if people want to play an quest based game they will not play Unreal but some adventure game. The creatures in your level must feel realistic for the level and must not feel misplaced. It really helps if the Creature is not just standing in one place doing nothing. Simple Scripted sequences such as Patrolling creatures and on Skaarj creatures you can place them behind a keyboard and use the option “buttonpushener”. A useful simple sequence is the sleeping Krall - Go into Krall properties and then display. Under animation type either Sleep1, sleep 2 or sleep3 to get the Krall far into the land of dreams (which cant be THAT far from the Unreal universe J

That covers the “Basics” of this section so now lets move into the more advanced stuff. 

The little actor called [[Legacy:AlarmPoint|AlarmPoint]] mostly makes scripted sequences in Unreal and this little actor is somewhat awesome. You can get the Creatures to fight each other, you can make the buggers flee, push a button and even take alternative routes to attack the player by using only this actor. 

Learning this actor is VITAL for you to bring the community a good singleplayer experience: find out more about it on the [[Legacy:ScriptedPawn|ScriptedPawn]] page.

==Fun Factor==

It has to be fun.

That sentance may seem like a &quot;well duh!&quot; kind of thing, but, sadly, this cruitial factor is missing from alot of custom single player maps I have played. Dont make it so hard you have to try 7,415,151,337 times to beat it. Dont make puzzles that are near impossible to solve. (ie: you must shoot an invisible trgger in the darkest part of the room then blah blah blah, just to open a single door (unless it is a secret area or, of course, the player is expected to accidentally shoot the trigger in the middle of a firefight.) that you must solve to continue. Dont make the puzzles to simple either.

Also dont make fights to boring or to long. Nothing is more annoying in a game to work for 10 minutes to get one shot one soem boss monster thingy and you realize you must do it 99 more times.

==External Links==

Sites dedicated to the original Unreal game and singleplayer mapping.
* [http://www.unrealsp.org/ unrealsp.org]
* [http://oldunreal.com/ oldunreal.com]

==Related Topics==
* [[Legacy:Mapping For Unreal Coop|Mapping for Unreal Coop]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

===Custom Content===
* [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]] &amp;ndash; A singleplayer/cooperative gametype for UT2004.

==Discussion==

'''evil_blue_dude:''' Made a few changes. Marked them with a boldm first letter.

'''SuperApe:''' I'm close to releasing a SP gametype mod as part of a mapping toolset that is meant to mimic the old UT-style monster AI.  After a little more SP mapping experience, I'd like to revisit this page.  Just to clean it up; the technical info for my mod should be the same as old UT, so this would be used as a reference for both.  The concepts are the same, I just want to format and clarify some of these things.

'''SuperApe:''' removed bolding from ebd.  Will revise this page soon.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4524</id>
      <timestamp>2005-11-13T03:58:03Z</timestamp>
      <contributor>
        <ip>Dsl-135.252.240.220.dsl.comindico.com.au</ip>
      </contributor>
      <comment>Added a comment.</comment>
      <text xml:space="preserve">''Originally published at [http://www.unrealsp.org UnrealSP.org] by Drevlin and eVOLVE''

==Introduction ==

You want to create a singleplayer level but don’t know in what end to start? Perhaps you have already created a singleplayer map but you feel that it is missing that little “extra”. In the following documentation you’ll read about how to create a better singleplayer experience…

NOTE that this is not a pure tutorial - in some places I might describe how to make stuff but you should not count on it.

====Index ====
# Lighting
# Use of environment 
# Holding up a storyline and keeping it exciting. 
# Weapon / powerup placement 
# Creatures and scripted sequences
# Various small tips for Singleplayer mappers

==Lighting ==

You might think wonder “what difference may sp lighting do compared to lighting in multiplayer maps?” Well not much really J

Although you need to plan your lighting a bit better - in multiplayer a lot of people turn lighting off to see all of the level unlit. There are not many people who do the same in singleplayer maps. Lighting is an important factor in the atmosphere of a level and atmosphere in singleplayer maps is more important than in multiplayer maps. Remember the flickering corridors in Doom, and it gave you that “omg Omg OMg OMG!!!!” feeling? 

One must remember that lighting is not just the presence of light, but also the absence of it. Use shadows to your advantage when covering enemies and secret areas (more on secret areas in “Use of environment”) Allot of people don’t use that much of coloured lights anymore, which I find to be a shame. I mean look around yourself, the light you see around you is not just one colour, and if it is it sure as *ell not white/uncoloured. When coloured lighting was introduced in Quake 2 (It was first, right?) Everyone thought “oooh yeeeey… that looks awesome!!” And with Unreal it was “OOOOH YEA!! HOLY MOTHER!!!” Unreal has one of the most advanced lighting engines to date, use it. 

In short:
* Think not only in the ways of “light there and light there” but also in the ways of absence of light. Hide enemies in shadows, use special effects such as flickering, Strobe and other to create a rich light map. 

==Use of environment ==

A very important factor in singleplayer levels is that the environment feels realistic for what’s going on, meaning that if you are making a level which has the story of a wrecked alien city you don’t go build a medival castle… “But of course” you say but remember the case mentioned above, was a extreme chase. Small things such as miss aligned textures, poor use of textures or perhaps a misplaced powerup can completely ruin a level.

Be smart in the design of the level. Use the [[Legacy:Z-Axis|Z-axis]] (up and down, folks) in your work; surprise the player with special effects and, of course, overwhelming architecture.

One thing that I miss in today’s games is the &quot;Secret areas&quot; where goodies such as weapons or armors can be found. Hide secret passages in shadows and/or use natural covers (Trees, bushes, rocks etc).

Also when you make Castles or houses or facilities remember to make the realistic and make sure that the architecture is natural and doesn’t get in the players way. Also make sure that the creatures that inhabit the place find it easy to navigate. Make multiple rooms with areas such as sleeping halls, libraries, engine rooms, dining rooms, transport tunnels - anything to make the building feel realistic for its purpose (I find it hard to believe that an alien race invaded a planet only to build useless buildings on it.)

In short:
* Use the Z-Axis to your advantage by not only building the level on the X and Y axis. Be a perfectionist! Look for small flaws such as wrongly aligned textures alike and correct them. 
* Make Eye candy &amp;ndash; when everyone says “Gameplay comes first” they are correct, however this doesn’t disable you from making a good-looking level. 

Bottom line is what looks good and plays good is good level Environmental wise.

==Holding up a storyline and keeping it exciting ==

You should have completed the entire story and plot before starting the work on the level/levels and it should contain information about what will be told (using the translator). Just as in a good book the ending should be surprising and to do this you should lead the player into a, so to say, “different direction” so when the ending does appear he is totally unprepared for it (Mentally wise). You can also use Translator events in an “unknowing way” - meaning that you, for example, stumble across a few dead corpses of a few humans who have had “Sightings of a aggressive species”. The player feel a bit excited for seeing this “Aggressive species” as well as he is a bit afraid to encounter it.

'''A'''nother thing which is very effective is a simple change of music. Switching from calm music to an echoeing silence will make the player cautious, and maybe afriad. The opposite to. Just when the player thinks its over you can suddenly change the music for a &quot;surprising&quot; feel.

===Advanced story telling ===

The following section is for the ones who feel they want to do more than just Translator events to be the main source of information… How to accomplish this? Use movies/in game sequences. Ill tell you about the latter first:

By saying &quot;in game sequences&quot; I mean Scripted sequences… still not with me? Remember the Skaarj that ran away in the first level of Unreal when you got the dispersion pistol? Or perhaps when the poor guy gets thrown into a wall followed by a couple of rockets from a brute? That is what I am talking about. This may not be the CLEAREST way of telling the story (And you should not only use this method) but it’s a real cool thing that I use a lot in my levels. It don’t just have to be made to tell the story but just as a “cool thing” to have in your level. See more on scripted sequences down below. 

You can go one step longer and use movies, using the game engine, to tell the story &amp;ndash; have you ever heard of the word “Machinima”? Its another word for “Movies which uses a game engine” (Good short, eh?) This is easily made in the powerful tool put together by the great Unframed Team (www.unframed.org) called UMS or Unreal Movie Studio (see [[Legacy:Capturing Unreal Video|Capturing Unreal Video]]). In it you will find a lot of useful features that will enable to make your level a interactive movie if you so want J. If you feel that you just wish to use the regular tools already existing in UnrealED (or are just to tired to learn some new tool) you can make less advanced movies using just UnrealED (But it will take longer time and is more difficult and uncontrollable)

In short:
* Hide the true objective of the campaign until the very end of the scenario. 

==Weapon / powerup placement ==

A very important topic as the placement of the weapons and powerups are '''vital''' to build a level. 

The best way to find out what is needed and what weapon/powerup feels right at a certain spot is simply to play the level (Using no cheats). Keep in mind that there are worse people than you that are going to play the level so don’t place the weapon so you barely survive. 

In Short:
* Aw cmon… The info stated above is NOT very long… Read it trough you lazy sob J

==Creatures and scripted sequences ==

The main factor in a good level is really the characters you meet in it and who you are fighting because think of it &amp;ndash; if people want to play an quest based game they will not play Unreal but some adventure game. The creatures in your level must feel realistic for the level and must not feel misplaced. It really helps if the Creature is not just standing in one place doing nothing. Simple Scripted sequences such as Patrolling creatures and on Skaarj creatures you can place them behind a keyboard and use the option “buttonpushener”. A useful simple sequence is the sleeping Krall - Go into Krall properties and then display. Under animation type either Sleep1, sleep 2 or sleep3 to get the Krall far into the land of dreams (which cant be THAT far from the Unreal universe J

That covers the “Basics” of this section so now lets move into the more advanced stuff. 

The little actor called [[Legacy:AlarmPoint|AlarmPoint]] mostly makes scripted sequences in Unreal and this little actor is somewhat awesome. You can get the Creatures to fight each other, you can make the buggers flee, push a button and even take alternative routes to attack the player by using only this actor. 

Learning this actor is VITAL for you to bring the community a good singleplayer experience: find out more about it on the [[Legacy:ScriptedPawn|ScriptedPawn]] page.

=='''F'''un Factor ==

It has to be fun.

That sentance may seem like a &quot;well duh!&quot; kind of thing, but, sadly, this cruitial 

factor is missing from alot of custom single player maps I have played. Dont make it so hard you 

have to try 7,415,151,337 times to beat it. Dont make puzzles that are near impossible to solve.

(ie: you must shoot an invisible trgger in the darkest part of the room then blah blah blah, 

just to open a single door (unless it is a secret area or, of course, the player is expected to accidentally shoot the trigger in the middle of a firefight. Phoenix)) that you must solve to continue. Dont make the puzzles to simple either.

Also dont make fights to boring, or to long. Nothings more annoying in a game to work for 10 minutes

to get one shot one soem boss monster thingy and you realize you must do it 99 more times.

'''evil_blue_dude:''' Made a few changes. Marked them with a boldm first letter.</text>
    </revision>
    <revision>
      <id>43225</id>
      <timestamp>2010-05-11T03:31:01Z</timestamp>
      <contributor>
        <username>Hetchienna18</username>
        <id>2136</id>
      </contributor>
      <text xml:space="preserve">''Originally published at [http://www.unrealsp.org UnrealSP.org] by Drevlin and eVOLVE''

==Introduction==

You want to create a singleplayer level but don’t know in what end to start? Perhaps you have already created a singleplayer map but you feel that it is missing that little “extra”. In the following documentation you’ll read about how to create a better singleplayer experience…

NOTE that this is not a pure tutorial - in some places I might describe how to make stuff but you should not count on it.

====Index====
# Lighting
# Use of environment 
# Holding up a storyline and keeping it exciting. 
# Weapon / powerup placement 
# Creatures and scripted sequences
# Various small tips for Singleplayer mappers

==Lighting==

You might think wonder “what difference may sp lighting do compared to lighting in multiplayer maps?” Well not much really J

Although you need to plan your lighting a bit better - in multiplayer a lot of people turn lighting off to see all of the level unlit. There are not many people who do the same in singleplayer maps. Lighting is an important factor in the atmosphere of a level and atmosphere in singleplayer maps is more important than in multiplayer maps. Remember the flickering corridors in Doom, and it gave you that “omg Omg OMg OMG!!!!” feeling? 

One must remember that lighting is not just the presence of light, but also the absence of it. Use shadows to your advantage when covering enemies and secret areas (more on secret areas in “Use of environment”) Allot of people don’t use that much of coloured lights anymore, which I find to be a shame. I mean look around yourself, the light you see around you is not just one colour, and if it is it sure as *ell not white/uncoloured. When coloured lighting was introduced in Quake 2 (It was first, right?) Everyone thought “oooh yeeeey… that looks awesome!!” And with Unreal it was “OOOOH YEA!! HOLY MOTHER!!!” Unreal has one of the most advanced lighting engines to date, use it. 

In short:
* Think not only in the ways of “light there and light there” but also in the ways of absence of light. Hide enemies in shadows, use special effects such as flickering, Strobe and other to create a rich light map. 

==Use of environment==

A very important factor in singleplayer levels is that the environment feels realistic for what’s going on, meaning that if you are making a level which has the story of a wrecked alien city you don’t go build a medival castle… “But of course” you say but remember the case mentioned above, was a extreme chase. Small things such as miss aligned textures, poor use of textures or perhaps a misplaced powerup can completely ruin a level.

Be smart in the design of the level. Use the [[Legacy:Z-Axis|Z-axis]] (up and down, folks) in your work; surprise the player with special effects and, of course, overwhelming architecture.

One thing that I miss in today’s games is the &quot;Secret areas&quot; where goodies such as weapons or armors can be found. Hide secret passages in shadows and/or use natural covers (Trees, bushes, rocks etc).

Also when you make Castles or houses or facilities remember to make the realistic and make sure that the architecture is natural and doesn’t get in the players way. Also make sure that the creatures that inhabit the place find it easy to navigate. Make multiple rooms with areas such as sleeping halls, libraries, engine rooms, dining rooms, transport tunnels - anything to make the building feel realistic for its purpose (I find it hard to believe that an alien race invaded a planet only to build useless buildings on it.)

In short:
* Use the Z-Axis to your advantage by not only building the level on the X and Y axis. Be a perfectionist! Look for small flaws such as wrongly aligned textures alike and correct them. 
* Make Eye candy &amp;ndash; when everyone says “Gameplay comes first” they are correct, however this doesn’t disable you from making a good-looking level. 

Bottom line is what looks good and plays good is good level Environmental wise.

==Holding up a storyline and keeping it exciting ==

You should have completed the entire story and plot before starting the work on the level/levels and it should contain information about what will be told (using the translator). Just as in a good book the ending should be surprising and to do this you should lead the player into a, so to say, “different direction” so when the ending does appear he is totally unprepared for it (Mentally wise). You can also use Translator events in an “unknowing way” - meaning that you, for example, stumble across a few dead corpses of a few humans who have had “Sightings of a aggressive species”. The player feel a bit excited for seeing this “Aggressive species” as well as he is a bit afraid to encounter it.

Another thing which is very effective is a simple change of music. Switching from calm music to an echoeing silence will make the player cautious, and maybe afriad. The opposite to. Just when the player thinks its over you can suddenly change the music for a &quot;surprising&quot; feel.

===Advanced Story Telling===

The following section is for the ones who feel they want to do more than just Translator events to be the main source of information… How to accomplish this? Use movies/in game sequences. Ill tell you about the latter first:

By saying &quot;in game sequences&quot; I mean Scripted sequences… still not with me? Remember the Skaarj that ran away in the first level of Unreal when you got the dispersion pistol? Or perhaps when the poor guy gets thrown into a wall followed by a couple of rockets from a brute? That is what I am talking about. This may not be the CLEAREST way of telling the story (And you should not only use this method) but it’s a real cool thing that I use a lot in my levels. It don’t just have to be made to tell the story but just as a “cool thing” to have in your level. See more on scripted sequences down below. 

You can go one step longer and use movies, using the game engine, to tell the story &amp;ndash; have you ever heard of the word “Machinima”? Its another word for “Movies which uses a game engine” (Good short, eh?) This is easily made in the powerful tool put together by the great Unframed Team (www.unframed.org) called UMS or Unreal Movie Studio (see [[Legacy:Capturing Unreal Video|Capturing Unreal Video]]). In it you will find a lot of useful features that will enable to make your level a interactive movie if you so want J. If you feel that you just wish to use the regular tools already existing in UnrealED (or are just to tired to learn some new tool) you can make less advanced movies using just UnrealED (But it will take longer time and is more difficult and uncontrollable)

In short:
* Hide the true objective of the campaign until the very end of the scenario. 

==Inventory Item Placement==

A very important topic as the placement of the weapons and powerups are '''vital''' to build a level. 

The best way to find out what is needed and what weapon/powerup feels right at a certain spot is simply to play the level (Using no cheats). Keep in mind that there are worse people than you that are going to play the level so don’t place the weapon so you barely survive. 

In Short:
* Aw cmon… The info stated above is NOT very long… Read it trough you lazy sob J

==Creatures and ScriptedSequences==

The main factor in a good level is really the characters you meet in it and who you are fighting because think of it &amp;ndash; if people want to play an quest based game they will not play Unreal but some adventure game. The creatures in your level must feel realistic for the level and must not feel misplaced. It really helps if the Creature is not just standing in one place doing nothing. Simple Scripted sequences such as Patrolling creatures and on Skaarj creatures you can place them behind a keyboard and use the option “buttonpushener”. A useful simple sequence is the sleeping Krall - Go into Krall properties and then display. Under animation type either Sleep1, sleep 2 or sleep3 to get the Krall far into the land of dreams (which cant be THAT far from the Unreal universe J

That covers the “Basics” of this section so now lets move into the more advanced stuff. 

The little actor called [[Legacy:AlarmPoint|AlarmPoint]] mostly makes scripted sequences in Unreal and this little actor is somewhat awesome. You can get the Creatures to fight each other, you can make the buggers flee, push a button and even take alternative routes to attack the player by using only this actor. 

Learning this actor is VITAL for you to bring the community a good singleplayer experience: find out more about it on the [[Legacy:ScriptedPawn|ScriptedPawn]] page.

==Fun Factor==

It has to be fun.

That sentance may seem like a &quot;well duh!&quot; kind of thing, but, sadly, this cruitial factor is missing from alot of custom single player maps I have played. Dont make it so hard you have to try 7,415,151,337 times to beat it. Dont make puzzles that are near impossible to solve. (ie: you must shoot an invisible trgger in the darkest part of the room then blah blah blah, just to open a single door (unless it is a secret area or, of course, the player is expected to accidentally shoot the trigger in the middle of a firefight.) that you must solve to continue. Dont make the puzzles to simple either.

Also dont make fights to boring or to long. Nothing is more annoying in a game to work for 10 minutes to get one shot one soem boss monster thingy and you realize you must do it 99 more times.

==External Links==

Sites dedicated to the original Unreal game and singleplayer mapping.
* [http://www.unrealsp.org/ unrealsp.org]
* [http://oldunreal.com/ oldunreal.com]
* [http://www.lindaolsson.com/'''palm beach homes''']
==Related Topics==
* [[Legacy:Mapping For Unreal Coop|Mapping for Unreal Coop]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

===Custom Content===
* [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]] &amp;ndash; A singleplayer/cooperative gametype for UT2004.

==Discussion==

'''evil_blue_dude:''' Made a few changes. Marked them with a boldm first letter.

'''SuperApe:''' I'm close to releasing a SP gametype mod as part of a mapping toolset that is meant to mimic the old UT-style monster AI.  After a little more SP mapping experience, I'd like to revisit this page.  Just to clean it up; the technical info for my mod should be the same as old UT, so this would be used as a reference for both.  The concepts are the same, I just want to format and clarify some of these things.

'''SuperApe:''' removed bolding from ebd.  Will revise this page soon.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43226</id>
      <timestamp>2010-05-11T10:09:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Hetchienna18|Hetchienna18]] ([[User talk:Hetchienna18|Talk]]) to last revision by [[User:SuperApe|SuperApe]]</comment>
      <text xml:space="preserve">''Originally published at [http://www.unrealsp.org UnrealSP.org] by Drevlin and eVOLVE''

==Introduction==

You want to create a singleplayer level but don’t know in what end to start? Perhaps you have already created a singleplayer map but you feel that it is missing that little “extra”. In the following documentation you’ll read about how to create a better singleplayer experience…

NOTE that this is not a pure tutorial - in some places I might describe how to make stuff but you should not count on it.

====Index====
# Lighting
# Use of environment 
# Holding up a storyline and keeping it exciting. 
# Weapon / powerup placement 
# Creatures and scripted sequences
# Various small tips for Singleplayer mappers

==Lighting==

You might think wonder “what difference may sp lighting do compared to lighting in multiplayer maps?” Well not much really J

Although you need to plan your lighting a bit better - in multiplayer a lot of people turn lighting off to see all of the level unlit. There are not many people who do the same in singleplayer maps. Lighting is an important factor in the atmosphere of a level and atmosphere in singleplayer maps is more important than in multiplayer maps. Remember the flickering corridors in Doom, and it gave you that “omg Omg OMg OMG!!!!” feeling? 

One must remember that lighting is not just the presence of light, but also the absence of it. Use shadows to your advantage when covering enemies and secret areas (more on secret areas in “Use of environment”) Allot of people don’t use that much of coloured lights anymore, which I find to be a shame. I mean look around yourself, the light you see around you is not just one colour, and if it is it sure as *ell not white/uncoloured. When coloured lighting was introduced in Quake 2 (It was first, right?) Everyone thought “oooh yeeeey… that looks awesome!!” And with Unreal it was “OOOOH YEA!! HOLY MOTHER!!!” Unreal has one of the most advanced lighting engines to date, use it. 

In short:
* Think not only in the ways of “light there and light there” but also in the ways of absence of light. Hide enemies in shadows, use special effects such as flickering, Strobe and other to create a rich light map. 

==Use of environment==

A very important factor in singleplayer levels is that the environment feels realistic for what’s going on, meaning that if you are making a level which has the story of a wrecked alien city you don’t go build a medival castle… “But of course” you say but remember the case mentioned above, was a extreme chase. Small things such as miss aligned textures, poor use of textures or perhaps a misplaced powerup can completely ruin a level.

Be smart in the design of the level. Use the [[Legacy:Z-Axis|Z-axis]] (up and down, folks) in your work; surprise the player with special effects and, of course, overwhelming architecture.

One thing that I miss in today’s games is the &quot;Secret areas&quot; where goodies such as weapons or armors can be found. Hide secret passages in shadows and/or use natural covers (Trees, bushes, rocks etc).

Also when you make Castles or houses or facilities remember to make the realistic and make sure that the architecture is natural and doesn’t get in the players way. Also make sure that the creatures that inhabit the place find it easy to navigate. Make multiple rooms with areas such as sleeping halls, libraries, engine rooms, dining rooms, transport tunnels - anything to make the building feel realistic for its purpose (I find it hard to believe that an alien race invaded a planet only to build useless buildings on it.)

In short:
* Use the Z-Axis to your advantage by not only building the level on the X and Y axis. Be a perfectionist! Look for small flaws such as wrongly aligned textures alike and correct them. 
* Make Eye candy &amp;ndash; when everyone says “Gameplay comes first” they are correct, however this doesn’t disable you from making a good-looking level. 

Bottom line is what looks good and plays good is good level Environmental wise.

==Holding up a storyline and keeping it exciting ==

You should have completed the entire story and plot before starting the work on the level/levels and it should contain information about what will be told (using the translator). Just as in a good book the ending should be surprising and to do this you should lead the player into a, so to say, “different direction” so when the ending does appear he is totally unprepared for it (Mentally wise). You can also use Translator events in an “unknowing way” - meaning that you, for example, stumble across a few dead corpses of a few humans who have had “Sightings of a aggressive species”. The player feel a bit excited for seeing this “Aggressive species” as well as he is a bit afraid to encounter it.

Another thing which is very effective is a simple change of music. Switching from calm music to an echoeing silence will make the player cautious, and maybe afriad. The opposite to. Just when the player thinks its over you can suddenly change the music for a &quot;surprising&quot; feel.

===Advanced Story Telling===

The following section is for the ones who feel they want to do more than just Translator events to be the main source of information… How to accomplish this? Use movies/in game sequences. Ill tell you about the latter first:

By saying &quot;in game sequences&quot; I mean Scripted sequences… still not with me? Remember the Skaarj that ran away in the first level of Unreal when you got the dispersion pistol? Or perhaps when the poor guy gets thrown into a wall followed by a couple of rockets from a brute? That is what I am talking about. This may not be the CLEAREST way of telling the story (And you should not only use this method) but it’s a real cool thing that I use a lot in my levels. It don’t just have to be made to tell the story but just as a “cool thing” to have in your level. See more on scripted sequences down below. 

You can go one step longer and use movies, using the game engine, to tell the story &amp;ndash; have you ever heard of the word “Machinima”? Its another word for “Movies which uses a game engine” (Good short, eh?) This is easily made in the powerful tool put together by the great Unframed Team (www.unframed.org) called UMS or Unreal Movie Studio (see [[Legacy:Capturing Unreal Video|Capturing Unreal Video]]). In it you will find a lot of useful features that will enable to make your level a interactive movie if you so want J. If you feel that you just wish to use the regular tools already existing in UnrealED (or are just to tired to learn some new tool) you can make less advanced movies using just UnrealED (But it will take longer time and is more difficult and uncontrollable)

In short:
* Hide the true objective of the campaign until the very end of the scenario. 

==Inventory Item Placement==

A very important topic as the placement of the weapons and powerups are '''vital''' to build a level. 

The best way to find out what is needed and what weapon/powerup feels right at a certain spot is simply to play the level (Using no cheats). Keep in mind that there are worse people than you that are going to play the level so don’t place the weapon so you barely survive. 

In Short:
* Aw cmon… The info stated above is NOT very long… Read it trough you lazy sob J

==Creatures and ScriptedSequences==

The main factor in a good level is really the characters you meet in it and who you are fighting because think of it &amp;ndash; if people want to play an quest based game they will not play Unreal but some adventure game. The creatures in your level must feel realistic for the level and must not feel misplaced. It really helps if the Creature is not just standing in one place doing nothing. Simple Scripted sequences such as Patrolling creatures and on Skaarj creatures you can place them behind a keyboard and use the option “buttonpushener”. A useful simple sequence is the sleeping Krall - Go into Krall properties and then display. Under animation type either Sleep1, sleep 2 or sleep3 to get the Krall far into the land of dreams (which cant be THAT far from the Unreal universe J

That covers the “Basics” of this section so now lets move into the more advanced stuff. 

The little actor called [[Legacy:AlarmPoint|AlarmPoint]] mostly makes scripted sequences in Unreal and this little actor is somewhat awesome. You can get the Creatures to fight each other, you can make the buggers flee, push a button and even take alternative routes to attack the player by using only this actor. 

Learning this actor is VITAL for you to bring the community a good singleplayer experience: find out more about it on the [[Legacy:ScriptedPawn|ScriptedPawn]] page.

==Fun Factor==

It has to be fun.

That sentance may seem like a &quot;well duh!&quot; kind of thing, but, sadly, this cruitial factor is missing from alot of custom single player maps I have played. Dont make it so hard you have to try 7,415,151,337 times to beat it. Dont make puzzles that are near impossible to solve. (ie: you must shoot an invisible trgger in the darkest part of the room then blah blah blah, just to open a single door (unless it is a secret area or, of course, the player is expected to accidentally shoot the trigger in the middle of a firefight.) that you must solve to continue. Dont make the puzzles to simple either.

Also dont make fights to boring or to long. Nothing is more annoying in a game to work for 10 minutes to get one shot one soem boss monster thingy and you realize you must do it 99 more times.

==External Links==

Sites dedicated to the original Unreal game and singleplayer mapping.
* [http://www.unrealsp.org/ unrealsp.org]
* [http://oldunreal.com/ oldunreal.com]

==Related Topics==
* [[Legacy:Mapping For Unreal Coop|Mapping for Unreal Coop]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

===Custom Content===
* [[Legacy:SuperApe/Mapping_For_OSM_Adventure|Mapping For OSM Adventure]] &amp;ndash; A singleplayer/cooperative gametype for UT2004.

==Discussion==

'''evil_blue_dude:''' Made a few changes. Marked them with a boldm first letter.

'''SuperApe:''' I'm close to releasing a SP gametype mod as part of a mapping toolset that is meant to mimic the old UT-style monster AI.  After a little more SP mapping experience, I'd like to revisit this page.  Just to clean it up; the technical info for my mod should be the same as old UT, so this would be used as a reference for both.  The concepts are the same, I just want to format and clarify some of these things.

'''SuperApe:''' removed bolding from ebd.  Will revise this page soon.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For UnrealFortress</title>
    <id>2031</id>
    <revision>
      <id>4953</id>
      <timestamp>2005-12-18T00:00:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping For UnrealFortress ===

Im not gonna go into specifc Mapping right now, because the wiki is a great resource for that anyway. So this is just about the Differances from regular mapping.

==== Setup =====

To start you need to be able to open unrealfortress maps / actors etc. There are a few ways to go about this.
* Create a shortcut to unrealed.exe and add: -ini=unrealfortress.ini   to the end.
* Add the paths to your unrealtournament.ini 
** Paths=../UNF/System/*.u
** Paths=../UNF/Maps/*.unr
** Paths=../UNF/Textures/*.utx
** Paths=../UNF/Sounds/*.uax
** Paths=../UNF/Music/*.umx
* extract UnrealFortress manually so it acts like a regular mod, (forget about the UNF sub directory just throw everything from /UT/UNF/System into /UT/System

----

===UnrealFortress Specific Actors ===

====&quot;special&quot; actors ====

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; game_mapinfo }}

Controls a number of game settings.
* The Command Point Scoring Setup.
* The Model and Skin used for the VIP
* Absolute and Percentage Class limits.
* The Fortress Gametype
* The number of Teams in use on this map.
* The name of each Team.


{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; effect_weatherGen }}

weather-generator, use for snow and rain


==== Bot related actors =====
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_defense }}

Like regular [[Legacy:DefensePoint|DefensePoint]], Except can set Preferred classes for Defense at this spot.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_dispenser }}

Where bots place Dispensors

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_sentry }}

The Navpoint_Sentry is special in that the bot stands on the Navpoint_Sentry and builds the SG infront of him in the direction of the Navpoint_Sentry arrow. You can configure the Type of guns the Bot will place on the SG in this actor as well.

** Direction it faces is where the actor points
** You can set a suggested Loadout for the Bot Sentry
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_trap }}

This is an actor that tells a bot where to set up a trap. Under ‘DefensePoint’ set the team; under ‘Navpoint_Trap’ configure, if a bot-Demolitionist should place a Claymore and/or a bot-Armourer should place a LaserTripMine. Consider that LTMs can only be placed on walls. To make a bot place a LTM, place the trap-actor near a wall, the red arrow must point towards it.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; Navpoint_BotLove}}

This is a special actor for cases, that confuse bots, if normal triggers would be used. A perfect example is the laser-control switch in UNF-CTF-Depression, which can be activated only once in a few seconds. After it is activated, it ‘sleeps’ for the configured amount of time, during which it can’t be triggered. The actor in Depression was coded for the special purposes of the map. Bot_Love is a more general trigger made for such occasions. The bots understand, that while it is ‘sleeping’, it cannot be accessed and they won’t go for it until it is available again. Be sure to set the team-number correctly.


====Triggers ====
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_class}}

class (and team) specific trigger (once only) 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_detpack}}

Will trigger an event when a detpack is placed within a certain raidus of it.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; trigger_fear }}

fear-spots for bots.

* @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_fireextinguisher 
* @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_firesetter 
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_team }}

team-trigger, working for the specific team only 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_PlayerCounter}}

Triggers an event when the number of players on a specific team is greater than the configured threshold.


====Ladders ====

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; trigger_ladder }}

Put in center/middle of ladders, make sure collision height covers the whole ladder 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:LiftCenter|LiftCenter]] &gt;&gt; trigger_laddercenter }}

Put at the top of the ladder, ABOVE the trigger_ladder 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:LiftExit (UT)|LiftExit (UT)]] &gt;&gt; trigger_ladderend }}

Put one at the start and one at the end of ladder, just as for elevators 


====Pickups ====

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_AmmoPack}}

You are able to edit the amount of Ammo the Pack contains. The list below identifies the numbers refering to the various Ammotypes:
* AmmoAmount(0) - Gel Ammo(doubles as flak for the SG) 
* AmmoAmount(1) - Shells 
* AmmoAmount(2) - Mortar 
* AmmoAmount(3) - Rockets 
* AmmoAmount(4) - Darts 
* AmmoAmount(5) - Gren 1 
* AmmoAmount(6) - Gren 2 
* AmmoAmount(7) - Gren 3 
* AmmoAmount(8) - Metal 
* AmmoAmount(9) – Buckshot

An AmmoPack can be teamspecific, i.e. only a player of the specified team may pick up this AmmoPack. Set bTeamOwned to True and set a number for ownerTeam, whereas 0 stands for Team 1(Red); 1 for Team 2 (Blue); 2 for Team 3 (Yellow); 3 for Team 4 (Green).


* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_Armour}}

100 Armour

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_chute }}

Parachute pick one up, and jump from the tallest building

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; [[Legacy:MedBox|MedBox]] &gt;&gt; misc_medpack}}

This health-regenerating item has been specially designed for UNF. Though it's based on the standard UT Health, it differs much from it, since it replenishes a certain class' health only to it's assigned limit. If you'd use a standard UT medbox, it would give the player health up to 100 units, eventhough the ranger for example is limited to 50 units. As a result, always use the misc_medbox.


All Pickups can be set to be team specific, except the parachute

====Gametype Specific Actors ====
* Command Point
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint &gt;&gt; deco_commandCapturePoint
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
** deco_commandPointFlagBase
* Capture The Flag
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_flagBase
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint
**# Set which team this capture point is for
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
* One Flag 
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_flagbase &gt;&gt; deco_oneFlagBase  
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint &gt;&gt; deco_oneCapturePoint 
**# Set which team this capture point is for
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
*
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedstart 
** VIP starts here (only 1 allowed) 
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedend 
** VIP escapes here (only 1 allowed)
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedhide 
** nice hiding spots for the VIP (many allowed)

===Notes / Special Unreal Fortress Commands ===
* 
viewbotinfo 

will display info on what a bot is currently doing. Very usefull for troubleshooting bot-paths

* 
class sizes:

Every class in Unreal Fortress has a different [[Legacy:Collision_Cylinder|Collision_Cylinder]]

** Ranger: Height 88 Breadth 39
** Medic: Height 86 Breadth 38
** Marksman: Height 84 Breadth 43
** HuntedB: Height 89 Breadth 39
** HuntedA: Height 88 Breadth 39
** Armourer: Height 87 Breadth 40
** Arsonist: Height 87 Breadth 39
** Commando:Height 90 Breadth 44
** Demolitionist: Height 86 Breadth 48
** HeavyGunner: Height 103 Breadth 55
** Saboteur: Height 85 Breadth 37
** The Jump-Height (how high someone can jump) for all classes is 48 Units.

* 
Fog Zones: The marksman class can take the texture of the brush he is standing on. This works by using his shadow to pick it up. However, Players do not have shadows in fog zones. Therefore, it is advisable to not use them where a marksman can go prone.


==Discussion==

Well Some of this may be a little out of date as most of the information here was taken from a [http://www.unrealfortress.com/board/read.php?TID=10266 thread] that was written in an older build, ive updated what i know has changed so far. Hopefully this will be of help to someone.  &amp;rarr;[[Legacy:Highlander|Highlander]]

Some thanks go out to Azm0 who provided me with the as yet unreleased official mapping info so i'll actually start fleshing this out a bit.  &amp;rarr;[[Legacy:Highlander|Highlander]]

Will add full class sizes once i find exactly what they are  &amp;rarr;[[Legacy:Highlander|Highlander]]

'''SuperApe:''' Should this page be linked up with [[Legacy:Gametype|Gametype]]?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4954</id>
      <timestamp>2002-08-07T01:52:53Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping For UnrealFortress ===

Im not gonna go into specifc Mapping right now, because the wiki is a great resource for that anyway. So this is just about the Differances from regular mapping.

==== Setup =====

To start you need to be able to open unrealfortress maps / actors etc. There are a few ways to go about this.
* Create a shortcut to unrealed.exe and add: -ini=unrealfortress.ini   to the end.
* Add the paths to your unrealtournament.ini 
** Paths=../UNF/System/*.u
** Paths=../UNF/Maps/*.unr
** Paths=../UNF/Textures/*.utx
** Paths=../UNF/Sounds/*.uax
** Paths=../UNF/Music/*.umx
* extract UnrealFortress manually so it acts like a regular mod, (forget about the UNF sub directory just throw everything from /UT/UNF/System into /UT/System

----

===UnrealFortress Specific Actors ===

====&quot;special&quot; actors ====

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; game_mapinfo }}

Controls a number of game settings.
* The Command Point Scoring Setup.
* The Model and Skin used for the VIP
* Absolute and Percentage Class limits.
* The Fortress Gametype
* The number of Teams in use on this map.
* The name of each Team.


{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; effect_weatherGen }}

weather-generator, use for snow and rain


==== Bot related actors =====
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_defense }}

Like regular [[Legacy:DefensePoint|DefensePoint]], Except can set Preferred classes for Defense at this spot.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_dispenser }}

Where bots place Dispensors

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_sentry }}

The Navpoint_Sentry is special in that the bot stands on the Navpoint_Sentry and builds the SG infront of him in the direction of the Navpoint_Sentry arrow. You can configure the Type of guns the Bot will place on the SG in this actor as well.

** Direction it faces is where the actor points
** You can set a suggested Loadout for the Bot Sentry
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_trap }}

This is an actor that tells a bot where to set up a trap. Under ‘DefensePoint’ set the team; under ‘Navpoint_Trap’ configure, if a bot-Demolitionist should place a Claymore and/or a bot-Armourer should place a LaserTripMine. Consider that LTMs can only be placed on walls. To make a bot place a LTM, place the trap-actor near a wall, the red arrow must point towards it.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; Navpoint_BotLove}}

This is a special actor for cases, that confuse bots, if normal triggers would be used. A perfect example is the laser-control switch in UNF-CTF-Depression, which can be activated only once in a few seconds. After it is activated, it ‘sleeps’ for the configured amount of time, during which it can’t be triggered. The actor in Depression was coded for the special purposes of the map. Bot_Love is a more general trigger made for such occasions. The bots understand, that while it is ‘sleeping’, it cannot be accessed and they won’t go for it until it is available again. Be sure to set the team-number correctly.


====Triggers ====
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_class}}

class (and team) specific trigger (once only) 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_detpack}}

Will trigger an event when a detpack is placed within a certain raidus of it.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; trigger_fear }}

fear-spots for bots.

* @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_fireextinguisher 
* @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_firesetter 
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_team }}

team-trigger, working for the specific team only 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_PlayerCounter}}

Triggers an event when the number of players on a specific team is greater than the configured threshold.


====Ladders ====

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; trigger_ladder }}

Put in center/middle of ladders, make sure collision height covers the whole ladder 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:LiftCenter|LiftCenter]] &gt;&gt; trigger_laddercenter }}

Put at the top of the ladder, ABOVE the trigger_ladder 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:LiftExit (UT)|LiftExit (UT)]] &gt;&gt; trigger_ladderend }}

Put one at the start and one at the end of ladder, just as for elevators 


====Pickups ====

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_AmmoPack}}

You are able to edit the amount of Ammo the Pack contains. The list below identifies the numbers refering to the various Ammotypes:
* AmmoAmount(0) - Gel Ammo(doubles as flak for the SG) 
* AmmoAmount(1) - Shells 
* AmmoAmount(2) - Mortar 
* AmmoAmount(3) - Rockets 
* AmmoAmount(4) - Darts 
* AmmoAmount(5) - Gren 1 
* AmmoAmount(6) - Gren 2 
* AmmoAmount(7) - Gren 3 
* AmmoAmount(8) - Metal 
* AmmoAmount(9) – Buckshot

An AmmoPack can be teamspecific, i.e. only a player of the specified team may pick up this AmmoPack. Set bTeamOwned to True and set a number for ownerTeam, whereas 0 stands for Team 1(Red); 1 for Team 2 (Blue); 2 for Team 3 (Yellow); 3 for Team 4 (Green).


* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_Armour}}

100 Armour

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_chute }}

Parachute pick one up, and jump from the tallest building

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; [[Legacy:MedBox|MedBox]] &gt;&gt; misc_medpack}}

This health-regenerating item has been specially designed for UNF. Though it's based on the standard UT Health, it differs much from it, since it replenishes a certain class' health only to it's assigned limit. If you'd use a standard UT medbox, it would give the player health up to 100 units, eventhough the ranger for example is limited to 50 units. As a result, always use the misc_medbox.


All Pickups can be set to be team specific, except the parachute

====Gametype Specific Actors ====
* Command Point
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint &gt;&gt; deco_commandCapturePoint
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
** deco_commandPointFlagBase
* Capture The Flag
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_flagBase
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint
**# Set which team this capture point is for
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
* One Flag 
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_flagbase &gt;&gt; deco_oneFlagBase  
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint &gt;&gt; deco_oneCapturePoint 
**# Set which team this capture point is for
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
*
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedstart 
** VIP starts here (only 1 allowed) 
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedend 
** VIP escapes here (only 1 allowed)
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedhide 
** nice hiding spots for the VIP (many allowed)

===Notes / Special Unreal Fortress Commands ===
* 
viewbotinfo 

will display info on what a bot is currently doing. Very usefull for troubleshooting bot-paths

* 
class sizes:

Every class in Unreal Fortress has a different [[Legacy:Collision_Cylinder|Collision_Cylinder]]

** Armourer
** Ranger
** Medic
** Heavy Gunner Height 52 units, Radius 24 Units
** Commando
** Demo
** Sabouter
** Arsonist
** Marksmen
** VIP
* 
Fog Zones: The marksman class can take the texture of the brush he is standing on. This works by using his shadow to pick it up. However, Players do not have shadows in fog zones. Therefore, it is advisable to not use them where a marksman can go prone.


----

Well Some of this may be a little out of date as most of the information here was taken from a [http://www.unrealfortress.com/board/read.php?TID=10266 thread] that was written in an older build, ive updated what i know has changed so far. Hopefully this will be of help to someone.  &amp;rarr;[[Legacy:Highlander|Highlander]]

Some thanks go out to Azm0 who provided me with the as yet unreleased official mapping info so i'll actually start fleshing this out a bit.  &amp;rarr;[[Legacy:Highlander|Highlander]]

Will add full class sizes once i find exactly what they are  &amp;rarr;[[Legacy:Highlander|Highlander]]</text>
    </revision>
    <revision>
      <id>4955</id>
      <timestamp>2002-08-31T21:12:25Z</timestamp>
      <contributor>
        <ip>Highlander</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Mapping For UnrealFortress ===

Im not gonna go into specifc Mapping right now, because the wiki is a great resource for that anyway. So this is just about the Differances from regular mapping.

==== Setup =====

To start you need to be able to open unrealfortress maps / actors etc. There are a few ways to go about this.
* Create a shortcut to unrealed.exe and add: -ini=unrealfortress.ini   to the end.
* Add the paths to your unrealtournament.ini 
** Paths=../UNF/System/*.u
** Paths=../UNF/Maps/*.unr
** Paths=../UNF/Textures/*.utx
** Paths=../UNF/Sounds/*.uax
** Paths=../UNF/Music/*.umx
* extract UnrealFortress manually so it acts like a regular mod, (forget about the UNF sub directory just throw everything from /UT/UNF/System into /UT/System

----

===UnrealFortress Specific Actors ===

====&quot;special&quot; actors ====

{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; game_mapinfo }}

Controls a number of game settings.
* The Command Point Scoring Setup.
* The Model and Skin used for the VIP
* Absolute and Percentage Class limits.
* The Fortress Gametype
* The number of Teams in use on this map.
* The name of each Team.


{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Effects (UT)|Effects (UT)]] &gt;&gt; effect_weatherGen }}

weather-generator, use for snow and rain


==== Bot related actors =====
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_defense }}

Like regular [[Legacy:DefensePoint|DefensePoint]], Except can set Preferred classes for Defense at this spot.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_dispenser }}

Where bots place Dispensors

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_sentry }}

The Navpoint_Sentry is special in that the bot stands on the Navpoint_Sentry and builds the SG infront of him in the direction of the Navpoint_Sentry arrow. You can configure the Type of guns the Bot will place on the SG in this actor as well.

** Direction it faces is where the actor points
** You can set a suggested Loadout for the Bot Sentry
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_trap }}

This is an actor that tells a bot where to set up a trap. Under ‘DefensePoint’ set the team; under ‘Navpoint_Trap’ configure, if a bot-Demolitionist should place a Claymore and/or a bot-Armourer should place a LaserTripMine. Consider that LTMs can only be placed on walls. To make a bot place a LTM, place the trap-actor near a wall, the red arrow must point towards it.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; Navpoint_BotLove}}

This is a special actor for cases, that confuse bots, if normal triggers would be used. A perfect example is the laser-control switch in UNF-CTF-Depression, which can be activated only once in a few seconds. After it is activated, it ‘sleeps’ for the configured amount of time, during which it can’t be triggered. The actor in Depression was coded for the special purposes of the map. Bot_Love is a more general trigger made for such occasions. The bots understand, that while it is ‘sleeping’, it cannot be accessed and they won’t go for it until it is available again. Be sure to set the team-number correctly.


====Triggers ====
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_class}}

class (and team) specific trigger (once only) 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_detpack}}

Will trigger an event when a detpack is placed within a certain raidus of it.

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; trigger_fear }}

fear-spots for bots.

* @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_fireextinguisher 
* @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_firesetter 
* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_team }}

team-trigger, working for the specific team only 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; [[Legacy:Trigger|Trigger]] &gt;&gt; trigger_PlayerCounter}}

Triggers an event when the number of players on a specific team is greater than the configured threshold.


====Ladders ====

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; trigger_ladder }}

Put in center/middle of ladders, make sure collision height covers the whole ladder 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:LiftCenter|LiftCenter]] &gt;&gt; trigger_laddercenter }}

Put at the top of the ladder, ABOVE the trigger_ladder 

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; [[Legacy:LiftExit (UT)|LiftExit (UT)]] &gt;&gt; trigger_ladderend }}

Put one at the start and one at the end of ladder, just as for elevators 


====Pickups ====

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_AmmoPack}}

You are able to edit the amount of Ammo the Pack contains. The list below identifies the numbers refering to the various Ammotypes:
* AmmoAmount(0) - Gel Ammo(doubles as flak for the SG) 
* AmmoAmount(1) - Shells 
* AmmoAmount(2) - Mortar 
* AmmoAmount(3) - Rockets 
* AmmoAmount(4) - Darts 
* AmmoAmount(5) - Gren 1 
* AmmoAmount(6) - Gren 2 
* AmmoAmount(7) - Gren 3 
* AmmoAmount(8) - Metal 
* AmmoAmount(9) – Buckshot

An AmmoPack can be teamspecific, i.e. only a player of the specified team may pick up this AmmoPack. Set bTeamOwned to True and set a number for ownerTeam, whereas 0 stands for Team 1(Red); 1 for Team 2 (Blue); 2 for Team 3 (Yellow); 3 for Team 4 (Green).


* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_Armour}}

100 Armour

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; misc_chute }}

Parachute pick one up, and jump from the tallest building

* 
{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; [[Legacy:MedBox|MedBox]] &gt;&gt; misc_medpack}}

This health-regenerating item has been specially designed for UNF. Though it's based on the standard UT Health, it differs much from it, since it replenishes a certain class' health only to it's assigned limit. If you'd use a standard UT medbox, it would give the player health up to 100 units, eventhough the ranger for example is limited to 50 units. As a result, always use the misc_medbox.


All Pickups can be set to be team specific, except the parachute

====Gametype Specific Actors ====
* Command Point
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint &gt;&gt; deco_commandCapturePoint
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
** deco_commandPointFlagBase
* Capture The Flag
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_flagBase
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint
**# Set which team this capture point is for
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
* One Flag 
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_flagbase &gt;&gt; deco_oneFlagBase  
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; deco_capturePoint &gt;&gt; deco_oneCapturePoint 
**# Set which team this capture point is for
**# Set the Personal and Team Score
**# Will broadcast an event on a Flag Capture.
*
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedstart 
** VIP starts here (only 1 allowed) 
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedend 
** VIP escapes here (only 1 allowed)
** @@ [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:NavigationPoint|NavigationPoint]] &gt;&gt; navpoint_huntedhide 
** nice hiding spots for the VIP (many allowed)

===Notes / Special Unreal Fortress Commands ===
* 
viewbotinfo 

will display info on what a bot is currently doing. Very usefull for troubleshooting bot-paths

* 
class sizes:

Every class in Unreal Fortress has a different [[Legacy:Collision_Cylinder|Collision_Cylinder]]

** Ranger: Height 88 Breadth 39
** Medic: Height 86 Breadth 38
** Marksman: Height 84 Breadth 43
** HuntedB: Height 89 Breadth 39
** HuntedA: Height 88 Breadth 39
** Armourer: Height 87 Breadth 40
** Arsonist: Height 87 Breadth 39
** Commando:Height 90 Breadth 44
** Demolitionist: Height 86 Breadth 48
** HeavyGunner: Height 103 Breadth 55
** Saboteur: Height 85 Breadth 37
** The Jump-Height (how high someone can jump) for all classes is 48 Units.

* 
Fog Zones: The marksman class can take the texture of the brush he is standing on. This works by using his shadow to pick it up. However, Players do not have shadows in fog zones. Therefore, it is advisable to not use them where a marksman can go prone.


----

Well Some of this may be a little out of date as most of the information here was taken from a [http://www.unrealfortress.com/board/read.php?TID=10266 thread] that was written in an older build, ive updated what i know has changed so far. Hopefully this will be of help to someone.  &amp;rarr;[[Legacy:Highlander|Highlander]]

Some thanks go out to Azm0 who provided me with the as yet unreleased official mapping info so i'll actually start fleshing this out a bit.  &amp;rarr;[[Legacy:Highlander|Highlander]]

Will add full class sizes once i find exactly what they are  &amp;rarr;[[Legacy:Highlander|Highlander]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping For VCTF</title>
    <id>2154</id>
    <revision>
      <id>5245</id>
      <timestamp>2007-04-25T23:09:52Z</timestamp>
      <contributor>
        <ip>User-5441aed5.lns2-c7.dsl.pol.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Vehicle Capture the Flag (VCTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.  This is an extention of the Capture the Flag gametype for [[Legacy:UT2004|UT2004]] with the primary difference being vehicle support.  Flying Vehicles may not carry the flag and translocator use is prohibited by default.  ''It's strongly recommended that mappers review [[Legacy:Mapping For CTF|Mapping for CTF]] as well.''

==Design considerations==

===Layout===

An obviousbly linear layout (straight from RedFlagBase to BlueFlagBase) is very easy to make when you have a gametype with only two game objectives and the long range/fast movement of vehicles.  Try to spread out (branch out) the routes between flags; spreading the field out and offering more variety in routes to and from the enemy flag.  Otherwise, an obvious bottleneck or 'choke spot' will present itself, making flag capture difficult if not impossible; but definately frustrating to play, due to lack of variety.

That said, vehicles almost demand layouts of considerable size.  Pedestrians should feel somewhat &quot;stranded&quot; in remote places in your map without a vehicle. (See ITEM PLACEMENT for pedestrian remedies)

Vehicles also add firepower and armor to each Team.  Therefore, the route to the flag should be appropriately difficult.  Defenses of all kinds are encouraged to help make the Capture challenging. (walls, doors, gates, turrets, custom shields, etc.)

===Item Placement===

The flagbases should be inaccessible by larger vehicles, either by structure, barrier or pedestal.  Otherwise, players and bots will ride a tank or leviathan on top of their flag to defend and camp on it.

Neutral vehicles placed in the center can add to gameplay by providing a &quot;soft&quot; gameObjective; a place Teams want to control.  Neutral (non-flying) vehicles placed near flagbases allow enemies to make quick getaways.

With large layouts, pedestrians can feel stranded out in remote locations.  Offer them alternative travel to key points with JumpPads, Teleporters, Movers, etc. in those locations.

===Vehicles===

Remember: By default, flying vehicles cannot carry the flag.  Also, someone riding on top of any vehicle can pick up the flag without getting off the vehicle (the Manta is excellent for this).

VehicleFactories will not spawn vehicles in a VCTF map until the gametype is set in LevelInfo to &lt;tt&gt;xGame.XVehicleCTFGame&lt;/tt&gt; and both FlagBases are placed.

ONSVehicles(Factories) will spawn by automatically setting the TeamNumber to match that of the nearest GameObjective (Flag).  Try the custom [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] for greater control over aspects of vehicle spawning.

===Botplay===

Bots will not use vehicles until a proper CTF bot path network is set, with an AssaultPath set to each flag and at least one WHITE (widest) path connects the two flags.  The vehicle spawn points must also be accessible to these wide pathways with their own WHITE paths.

Neutral controllers, controlling bots, turrets, etc., will attack Red and Blue Team members equally.  They will ignore other Neutral controllers, as if Neutral was it's own Team. (Team 255)

==Creating a VCTF Map ==

This is a list of critical elements needed to create a simple VCTF map.
* Modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt;.
* A big enough space for vehicles and/or flying vehicles.
* Place two [[Legacy:XRealCTFBase|xRealCTFBase]]s, ones for Red and Blue teams.  These must be accessible to a RoadPathNode path network. (see the '''Botplay''' section above)
* Place player starts (set &lt;tt&gt;PlayerStart.TeamNum&lt;/tt&gt;s: 0=red, 1=blue)
* Place an [[Legacy:AssaultPath|AssaultPath]] near each flag (line of sight is good) for the attacking team.
* Place VehicleFactory actors where you want vehicles to spawn. Set the direction you want them to start in. The TeamNumber for the vehicles will be set automatically when using ONSVehicleFactories; whichever gameobjective is closer; the red flag or the blue flag. By using custom actors like the [[Legacy:TeamVehicleFactory|TeamVehicleFactory]], you can set the TeamNumber yourself. (0=red, 1=blue, 255=none or neutral)
* When placing [[Legacy:RoadPathNode|RoadPathNode]]s, keep the paths wide (white) between nodes for large ground vehicles and especially along the paths to the flags. Keep these spaced over 512 or 1024 apart because vehicles are not as agile as players on foot; they need to make wider turns.  Try to keep the number of pathnodes even on each team's side of the map.  There must be at least one white path connecting the flags to the path network, but more paths are recommended.
* Place [[Legacy:FlyingPathNode|FlyingPathNode]]s (between 1024 and 2048 apart) about 1024 to 2048 above the ground. Don't bother making fine or complicated pathing for flying vehicles, with momentum carrying them, they need to make very wide turns, rises and dives.

==Tips==

===Vehicle Pathing for VCTF ( by Toonces T. Cat )===

A few key points to note in the construction of a VCTF level.

* Using an [[Legacy:AssaultPath|AssaultPath]] after the last [[Legacy:RoadPathNode|RoadPathNode]] that vehicles can reach works, and works well, but introduces new and even more complex issues into the equation. Someone else mentioned it in another thread, but what good is it to have your bot grab the flag and then not have a vehicle available when it returns to the RoadPathed area of the map? The best bet is to have the flag in an area where it can make a double (bi-directional) white connection to one or more RoadPathNodes.

* Think vertical and you can have your cake and eat it too. I have created a second elevated level that is pathed just for foot use and it also connects to both flags and, even though the bots use it, it does not preclude them from using the vehicles as well. In fact, combos are very possible as I have seen them use the overhead route to get the flag and then jump into a Tank or a Hell Bender that one of their team-mates is using and hitch a ride home...

* The translocator definitely should be allowed in the game-type. The bots commonly chase a team-mate's vehicle with it and will jump on-board in mid-toss...It is extremely cool to watch them do this... ('''SuperApe''': Toonce's is talking about ignoring the default rules for VCTF that disallow Translocators.  This could be done by placing a custom actor (subclass of [[Legacy:XPickUpBase|xPickUpBase]]) and specifying a XWeapon.Transpickup as it's Powerup.  See also [http://forums.unrealplayground.com/showthread.php?t=24029 this thread].)

* When the flag is in a vehicle accessible area, elevate it above the floor on some type of base that the bots can climb on foot, but not in a vehicle. I am using an octagonal base that is about 256 units in diameter and about 40 units high. It has 4 narrow stairwells cut into it (one on every other side) that the bots can use. It is high enough to stop a vehicle (except for the Leviathan), but not so high that the nearby RoadPathNodes cannot make a good path connection.

Why do you need this? Because the bots playing defense will pile into a Goliath and camp the flag if they can get on top of it...and I mean literally ON TOP of it. An enemy bot cannot get to it to take the flag if they are there. This is a workaround of sorts, but it is an effective one as even if they are using a Tank, if the attacker engages them, another bot can come up form behind and take the flag...I've watched it a dozen times.

* As I said above, the 40 unit high barrier will not stop a Leviathan...Hence, tip #5 is do not path the Leviathans if you have them in your level. If a Masterful bot gets into one of them with a couple of his pals, the other team is in big trouble. It's better to keep them out the Leviathans unless a human is driving it.

* RoadPathNodes can be further cleaned up by changing the MaxRoadDistance value in the properties. The default distance is ten thousand. This can create ALL KINDS of unwanted clutter. In the top orthographic view measure between the nodes that you want to connect using  SHIFT+MIDDLEMOUSE to bring up the ruler and adjust the nodes accordingly.

==FAQ==

Frequently asked questions and common problems while mapping for VCTF.

* ''Where is the VehicleCTF gametype in the UT2004 menu?''

The VehicleCTF gametype will not show up in the list of available gametypes until at least one VCTF map is placed in the Maps directory. (Filename syntax is : '''VCTF-Foo''')
* ''Vehicles aren't spawning''

You must modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt; and have both the Red and Blue team FlagBases set in the map.  After that, Vehicle Factories will spawn vehicles.
* ''Bots won't use the vehicles''

There must be at least one fully connected path from one flag to the other and at least one of these paths must be solidly '''white''' all along the route.  This will indicate to bots that they can use a vehicle to reach their goal along that path.  The VehicleFactories will also have to be connected to at least one of these routes with a white path.
* ''Bots only use the shortest path to the enemy flag and back''

Use of an AssaultPath close to and within line of sight of the target flag will help bots reach their goal, but to encourage bots to use more of the layout, use other AssaultPaths that meet up to that goal.  See [[Legacy:AssaultPath|AssaultPath]] and [[Legacy:Bot Pathing|Bot Pathing]].

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=23758 Unreal Playground Forum: Mapping for VCTF]
* [http://blitz.unrealplayground.com/tutorials/bots.html Blitz's Advanced Bot Pathing Tutorial]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Vehicle|Vehicle]] &amp;ndash; Parent class for all vehicles in UT2004
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Vehicle main topic

==Discussion==

'''SuperApe''': Created.  Most borrowed from the external link I wrote a while ago.  Toonce's vehicle pathing comments added from [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and edited slightly.  [[Legacy:XVehicleCTFGame|xVehicleCTFGame]], [[Legacy:RoadPathNode|RoadPathNode]], [[Legacy:FlyingPathNode|FlyingPathNode]], [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] pages added and other misc links changed. ([[Legacy:NavigationPoint|NavigationPoint]] subclass list, etc.)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5246</id>
      <timestamp>2006-06-15T18:48:26Z</timestamp>
      <contributor>
        <ip>192.251.69.127</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Vehicle Capture the Flag (VCTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.  This is an extention of the Capture the Flag gametype for [[Legacy:UT2004|UT2004]] with the primary difference being vehicle support.  Flying Vehicles may not carry the flag and translocator use is prohibited by default.  ''It's strongly recommended that mappers review [[Legacy:Mapping For CTF|Mapping for CTF]] as well.''

==Design considerations==

===Layout===

An obviousbly linear layout (straight from RedFlagBase to BlueFlagBase) is very easy to make when you have a gametype with only two game objectives and the long range/fast movement of vehicles.  Try to spread out (branch out) the routes between flags; spreading the field out and offering more variety in routes to and from the enemy flag.  Otherwise, an obvious bottleneck or 'choke spot' will present itself, making flag capture difficult if not impossible; but definately frustrating to play, due to lack of variety.

That said, vehicles almost demand layouts of considerable size.  Pedestrians should feel somewhat &quot;stranded&quot; in remote places in your map without a vehicle. (See ITEM PLACEMENT for pedestrian remedies)

Vehicles also add firepower and armor to each Team.  Therefore, the route to the flag should be appropriately difficult.  Defenses of all kinds are encouraged to help make the Capture challenging. (walls, doors, gates, turrets, custom shields, etc.)

===Item Placement===

The flagbases should be inaccessible by larger vehicles, either by structure, barrier or pedestal.  Otherwise, players and bots will ride a tank or leviathan on top of their flag to defend and camp on it.

Neutral vehicles placed in the center can add to gameplay by providing a &quot;soft&quot; gameObjective; a place Teams want to control.  Neutral (non-flying) vehicles placed near flagbases allow enemies to make quick getaways.

With large layouts, pedestrians can feel stranded out in remote locations.  Offer them alternative travel to key points with JumpPads, Teleporters, Movers, etc. in those locations.

===Vehicles===

Remember: By default, flying vehicles cannot carry the flag.

VehicleFactories will not spawn vehicles in a VCTF map until the gametype is set in LevelInfo to &lt;tt&gt;xGame.XVehicleCTFGame&lt;/tt&gt; and both FlagBases are placed.

ONSVehicles(Factories) will spawn by automatically setting the TeamNumber to match that of the nearest GameObjective (Flag).  Try the custom [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] for greater control over aspects of vehicle spawning.

===Botplay===

Bots will not use vehicles until a proper CTF bot path network is set, with an AssaultPath set to each flag and at least one WHITE (widest) path connects the two flags.  The vehicle spawn points must also be accessible to these wide pathways with their own WHITE paths.

Neutral controllers, controlling bots, turrets, etc., will attack Red and Blue Team members equally.  They will ignore other Neutral controllers, as if Neutral was it's own Team. (Team 255)

==Creating a VCTF Map ==

This is a list of critical elements needed to create a simple VCTF map.
* Modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt;.
* A big enough space for vehicles and/or flying vehicles.
* Place two [[Legacy:XRealCTFBase|xRealCTFBase]]s, ones for Red and Blue teams.  These must be accessible to a RoadPathNode path network. (see the '''Botplay''' section above)
* Place player starts (set &lt;tt&gt;PlayerStart.TeamNum&lt;/tt&gt;s: 0=red, 1=blue)
* Place an [[Legacy:AssaultPath|AssaultPath]] near each flag (line of sight is good) for the attacking team.
* Place VehicleFactory actors where you want vehicles to spawn. Set the direction you want them to start in. The TeamNumber for the vehicles will be set automatically when using ONSVehicleFactories; whichever gameobjective is closer; the red flag or the blue flag. By using custom actors like the [[Legacy:TeamVehicleFactory|TeamVehicleFactory]], you can set the TeamNumber yourself. (0=red, 1=blue, 255=none or neutral)
* When placing [[Legacy:RoadPathNode|RoadPathNode]]s, keep the paths wide (white) between nodes for large ground vehicles and especially along the paths to the flags. Keep these spaced over 512 or 1024 apart because vehicles are not as agile as players on foot; they need to make wider turns.  Try to keep the number of pathnodes even on each team's side of the map.  There must be at least one white path connecting the flags to the path network, but more paths are recommended.
* Place [[Legacy:FlyingPathNode|FlyingPathNode]]s (between 1024 and 2048 apart) about 1024 to 2048 above the ground. Don't bother making fine or complicated pathing for flying vehicles, with momentum carrying them, they need to make very wide turns, rises and dives.

==Tips==

===Vehicle Pathing for VCTF ( by Toonces T. Cat )===

A few key points to note in the construction of a VCTF level.

* Using an [[Legacy:AssaultPath|AssaultPath]] after the last [[Legacy:RoadPathNode|RoadPathNode]] that vehicles can reach works, and works well, but introduces new and even more complex issues into the equation. Someone else mentioned it in another thread, but what good is it to have your bot grab the flag and then not have a vehicle available when it returns to the RoadPathed area of the map? The best bet is to have the flag in an area where it can make a double (bi-directional) white connection to one or more RoadPathNodes.

* Think vertical and you can have your cake and eat it too. I have created a second elevated level that is pathed just for foot use and it also connects to both flags and, even though the bots use it, it does not preclude them from using the vehicles as well. In fact, combos are very possible as I have seen them use the overhead route to get the flag and then jump into a Tank or a Hell Bender that one of their team-mates is using and hitch a ride home...

* The translocator definitely should be allowed in the game-type. The bots commonly chase a team-mate's vehicle with it and will jump on-board in mid-toss...It is extremely cool to watch them do this... ('''SuperApe''': Toonce's is talking about ignoring the default rules for VCTF that disallow Translocators.  This could be done by placing a custom actor (subclass of [[Legacy:XPickUpBase|xPickUpBase]]) and specifying a XWeapon.Transpickup as it's Powerup.  See also [http://forums.unrealplayground.com/showthread.php?t=24029 this thread].)

* When the flag is in a vehicle accessible area, elevate it above the floor on some type of base that the bots can climb on foot, but not in a vehicle. I am using an octagonal base that is about 256 units in diameter and about 40 units high. It has 4 narrow stairwells cut into it (one on every other side) that the bots can use. It is high enough to stop a vehicle (except for the Leviathan), but not so high that the nearby RoadPathNodes cannot make a good path connection.

Why do you need this? Because the bots playing defense will pile into a Goliath and camp the flag if they can get on top of it...and I mean literally ON TOP of it. An enemy bot cannot get to it to take the flag if they are there. This is a workaround of sorts, but it is an effective one as even if they are using a Tank, if the attacker engages them, another bot can come up form behind and take the flag...I've watched it a dozen times.

* As I said above, the 40 unit high barrier will not stop a Leviathan...Hence, tip #5 is do not path the Leviathans if you have them in your level. If a Masterful bot gets into one of them with a couple of his pals, the other team is in big trouble. It's better to keep them out the Leviathans unless a human is driving it.

* RoadPathNodes can be further cleaned up by changing the MaxRoadDistance value in the properties. The default distance is ten thousand. This can create ALL KINDS of unwanted clutter. In the top orthographic view measure between the nodes that you want to connect using  SHIFT+MIDDLEMOUSE to bring up the ruler and adjust the nodes accordingly.

==FAQ==

Frequently asked questions and common problems while mapping for VCTF.

* ''Where is the VehicleCTF gametype in the UT2004 menu?''

The VehicleCTF gametype will not show up in the list of available gametypes until at least one VCTF map is placed in the Maps directory. (Filename syntax is : '''VCTF-Foo''')
* ''Vehicles aren't spawning''

You must modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt; and have both the Red and Blue team FlagBases set in the map.  After that, Vehicle Factories will spawn vehicles.
* ''Bots won't use the vehicles''

There must be at least one fully connected path from one flag to the other and at least one of these paths must be solidly '''white''' all along the route.  This will indicate to bots that they can use a vehicle to reach their goal along that path.  The VehicleFactories will also have to be connected to at least one of these routes with a white path.
* ''Bots only use the shortest path to the enemy flag and back''

Use of an AssaultPath close to and within line of sight of the target flag will help bots reach their goal, but to encourage bots to use more of the layout, use other AssaultPaths that meet up to that goal.  See [[Legacy:AssaultPath|AssaultPath]] and [[Legacy:Bot Pathing|Bot Pathing]].

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=23758 Unreal Playground Forum: Mapping for VCTF]
* [http://blitz.unrealplayground.com/tutorials/bots.html Blitz's Advanced Bot Pathing Tutorial]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Vehicle|Vehicle]] &amp;ndash; Parent class for all vehicles in UT2004
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Vehicle main topic

==Discussion==

'''SuperApe''': Created.  Most borrowed from the external link I wrote a while ago.  Toonce's vehicle pathing comments added from [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and edited slightly.  [[Legacy:XVehicleCTFGame|xVehicleCTFGame]], [[Legacy:RoadPathNode|RoadPathNode]], [[Legacy:FlyingPathNode|FlyingPathNode]], [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] pages added and other misc links changed. ([[Legacy:NavigationPoint|NavigationPoint]] subclass list, etc.)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32327</id>
      <timestamp>2008-06-22T14:53:54Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <comment>/* Vehicle Pathing for VCTF ( by Toonces T. Cat ) */</comment>
      <text xml:space="preserve">'''Vehicle Capture the Flag (VCTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.  This is an extention of the Capture the Flag gametype for [[Legacy:UT2004|UT2004]] with the primary difference being vehicle support.  Flying Vehicles may not carry the flag and translocator use is prohibited by default.  ''It's strongly recommended that mappers review [[Legacy:Mapping For CTF|Mapping for CTF]] as well.''

==Design considerations==

===Layout===

An obviousbly linear layout (straight from RedFlagBase to BlueFlagBase) is very easy to make when you have a gametype with only two game objectives and the long range/fast movement of vehicles.  Try to spread out (branch out) the routes between flags; spreading the field out and offering more variety in routes to and from the enemy flag.  Otherwise, an obvious bottleneck or 'choke spot' will present itself, making flag capture difficult if not impossible; but definately frustrating to play, due to lack of variety.

That said, vehicles almost demand layouts of considerable size.  Pedestrians should feel somewhat &quot;stranded&quot; in remote places in your map without a vehicle. (See ITEM PLACEMENT for pedestrian remedies)

Vehicles also add firepower and armor to each Team.  Therefore, the route to the flag should be appropriately difficult.  Defenses of all kinds are encouraged to help make the Capture challenging. (walls, doors, gates, turrets, custom shields, etc.)

===Item Placement===

The flagbases should be inaccessible by larger vehicles, either by structure, barrier or pedestal.  Otherwise, players and bots will ride a tank or leviathan on top of their flag to defend and camp on it.

Neutral vehicles placed in the center can add to gameplay by providing a &quot;soft&quot; gameObjective; a place Teams want to control.  Neutral (non-flying) vehicles placed near flagbases allow enemies to make quick getaways.

With large layouts, pedestrians can feel stranded out in remote locations.  Offer them alternative travel to key points with JumpPads, Teleporters, Movers, etc. in those locations.

===Vehicles===

Remember: By default, flying vehicles cannot carry the flag.  Also, someone riding on top of any vehicle can pick up the flag without getting off the vehicle (the Manta is excellent for this).

VehicleFactories will not spawn vehicles in a VCTF map until the gametype is set in LevelInfo to &lt;tt&gt;xGame.XVehicleCTFGame&lt;/tt&gt; and both FlagBases are placed.

ONSVehicles(Factories) will spawn by automatically setting the TeamNumber to match that of the nearest GameObjective (Flag).  Try the custom [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] for greater control over aspects of vehicle spawning.

===Botplay===

Bots will not use vehicles until a proper CTF bot path network is set, with an AssaultPath set to each flag and at least one WHITE (widest) path connects the two flags.  The vehicle spawn points must also be accessible to these wide pathways with their own WHITE paths.

Neutral controllers, controlling bots, turrets, etc., will attack Red and Blue Team members equally.  They will ignore other Neutral controllers, as if Neutral was it's own Team. (Team 255)

==Creating a VCTF Map ==

This is a list of critical elements needed to create a simple VCTF map.
* Modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt;.
* A big enough space for vehicles and/or flying vehicles.
* Place two [[Legacy:XRealCTFBase|xRealCTFBase]]s, ones for Red and Blue teams.  These must be accessible to a RoadPathNode path network. (see the '''Botplay''' section above)
* Place player starts (set &lt;tt&gt;PlayerStart.TeamNum&lt;/tt&gt;s: 0=red, 1=blue)
* Place an [[Legacy:AssaultPath|AssaultPath]] near each flag (line of sight is good) for the attacking team.
* Place VehicleFactory actors where you want vehicles to spawn. Set the direction you want them to start in. The TeamNumber for the vehicles will be set automatically when using ONSVehicleFactories; whichever gameobjective is closer; the red flag or the blue flag. By using custom actors like the [[Legacy:TeamVehicleFactory|TeamVehicleFactory]], you can set the TeamNumber yourself. (0=red, 1=blue, 255=none or neutral)
* When placing [[Legacy:RoadPathNode|RoadPathNode]]s, keep the paths wide (white) between nodes for large ground vehicles and especially along the paths to the flags. Keep these spaced over 512 or 1024 apart because vehicles are not as agile as players on foot; they need to make wider turns.  Try to keep the number of pathnodes even on each team's side of the map.  There must be at least one white path connecting the flags to the path network, but more paths are recommended.
* Place [[Legacy:FlyingPathNode|FlyingPathNode]]s (between 1024 and 2048 apart) about 1024 to 2048 above the ground. Don't bother making fine or complicated pathing for flying vehicles, with momentum carrying them, they need to make very wide turns, rises and dives.

==Tips==

===Vehicle Pathing for VCTF ( by Toonces T. Cat )===

A few key points to note in the construction of a VCTF level.

* Using an [[Legacy:AssaultPath|AssaultPath]] after the last [[Legacy:RoadPathNode|RoadPathNode]] that vehicles can reach works, and works well, but introduces new and even more complex issues into the equation. Someone else mentioned it in another thread, but what good is it to have your bot grab the flag and then not have a vehicle available when it returns to the RoadPathed area of the map? The best bet is to have the flag in an area where it can make a double (bi-directional) white connection to one or more RoadPathNodes.

* Think vertical and you can have your cake and eat it too. I have created a second elevated level that is pathed just for foot use and it also connects to both flags and, even though the bots use it, it does not preclude them from using the vehicles as well. In fact, combos are very possible as I have seen them use the overhead route to get the flag and then jump into a Tank or a Hell Bender that one of their team-mates is using and hitch a ride home...

* The translocator definitely should be allowed in the game-type. The bots commonly chase a team-mate's vehicle with it and will jump on-board in mid-toss...It is extremely cool to watch them do this... ('''SuperApe''': Toonce's is talking about ignoring the default rules for VCTF that disallow Translocators.  This could be done by placing a custom actor (subclass of [[Legacy:XPickUpBase|xPickUpBase]]) and specifying a XWeapon.Transpickup as it's Powerup.  See also [http://forums.unrealplayground.com/showthread.php?t=24029 this thread] ('''GreatEmerald''': ''Note: dead link - any replacement?'').)

* When the flag is in a vehicle accessible area, elevate it above the floor on some type of base that the bots can climb on foot, but not in a vehicle. I am using an octagonal base that is about 256 units in diameter and about 40 units high. It has 4 narrow stairwells cut into it (one on every other side) that the bots can use. It is high enough to stop a vehicle (except for the Leviathan), but not so high that the nearby RoadPathNodes cannot make a good path connection.

Why do you need this? Because the bots playing defense will pile into a Goliath and camp the flag if they can get on top of it...and I mean literally ON TOP of it. An enemy bot cannot get to it to take the flag if they are there. This is a workaround of sorts, but it is an effective one as even if they are using a Tank, if the attacker engages them, another bot can come up form behind and take the flag...I've watched it a dozen times.

* As I said above, the 40 unit high barrier will not stop a Leviathan...Hence, tip #5 is do not path the Leviathans if you have them in your level. If a Masterful bot gets into one of them with a couple of his pals, the other team is in big trouble. It's better to keep them out the Leviathans unless a human is driving it. ('''GreatEmerald''': If you need a Leviathan, though, you can set some RoadPathNodes' properties, under Navigation Point, bNoSuperSize to True to keep Leviathans out of some trouble. This way you can also make a defensive Leviathan by setting bNoSuperSize properties only to those nodes that are close to flags, although bots might not want to go in. You might also path everything normally, add an AssaultPath somewhat away from the flag and make all next PathNodes/RoadPathNodes bNoSuperSize to make bots use Leviathans, but not spam with them.)

* RoadPathNodes can be further cleaned up by changing the MaxRoadDistance value in the properties. The default distance is ten thousand. This can create ALL KINDS of unwanted clutter. In the top orthographic view measure between the nodes that you want to connect using  SHIFT+MIDDLEMOUSE to bring up the ruler and adjust the nodes accordingly.

==FAQ==

Frequently asked questions and common problems while mapping for VCTF.

* ''Where is the VehicleCTF gametype in the UT2004 menu?''

The VehicleCTF gametype will not show up in the list of available gametypes until at least one VCTF map is placed in the Maps directory. (Filename syntax is : '''VCTF-Foo''')
* ''Vehicles aren't spawning''

You must modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt; and have both the Red and Blue team FlagBases set in the map.  After that, Vehicle Factories will spawn vehicles.
* ''Bots won't use the vehicles''

There must be at least one fully connected path from one flag to the other and at least one of these paths must be solidly '''white''' all along the route.  This will indicate to bots that they can use a vehicle to reach their goal along that path.  The VehicleFactories will also have to be connected to at least one of these routes with a white path.
* ''Bots only use the shortest path to the enemy flag and back''

Use of an AssaultPath close to and within line of sight of the target flag will help bots reach their goal, but to encourage bots to use more of the layout, use other AssaultPaths that meet up to that goal.  See [[Legacy:AssaultPath|AssaultPath]] and [[Legacy:Bot Pathing|Bot Pathing]].

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=23758 Unreal Playground Forum: Mapping for VCTF]
* [http://blitz.unrealplayground.com/tutorials/bots.html Blitz's Advanced Bot Pathing Tutorial]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Vehicle|Vehicle]] &amp;ndash; Parent class for all vehicles in UT2004
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Vehicle main topic

==Discussion==

'''SuperApe''': Created.  Most borrowed from the external link I wrote a while ago.  Toonce's vehicle pathing comments added from [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and edited slightly.  [[Legacy:XVehicleCTFGame|xVehicleCTFGame]], [[Legacy:RoadPathNode|RoadPathNode]], [[Legacy:FlyingPathNode|FlyingPathNode]], [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] pages added and other misc links changed. ([[Legacy:NavigationPoint|NavigationPoint]] subclass list, etc.)

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32329</id>
      <timestamp>2008-06-22T15:53:08Z</timestamp>
      <contributor>
        <username>GreatEmerald</username>
        <id>809</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">'''Vehicle Capture the Flag (VCTF):''' Two teams both have a movable flag that's planted on an immobile flag base. A team scores a point by getting both flags to their home flag base.  This is an extention of the Capture the Flag gametype for [[Legacy:UT2004|UT2004]] with the primary difference being vehicle support.  Flying Vehicles may not carry the flag and translocator use is prohibited by default.  ''It's strongly recommended that mappers review [[Legacy:Mapping For CTF|Mapping for CTF]] as well.''

==Design considerations==

===Layout===

An obviousbly linear layout (straight from RedFlagBase to BlueFlagBase) is very easy to make when you have a gametype with only two game objectives and the long range/fast movement of vehicles.  Try to spread out (branch out) the routes between flags; spreading the field out and offering more variety in routes to and from the enemy flag.  Otherwise, an obvious bottleneck or 'choke spot' will present itself, making flag capture difficult if not impossible; but definately frustrating to play, due to lack of variety.

That said, vehicles almost demand layouts of considerable size.  Pedestrians should feel somewhat &quot;stranded&quot; in remote places in your map without a vehicle. (See ITEM PLACEMENT for pedestrian remedies)

Vehicles also add firepower and armor to each Team.  Therefore, the route to the flag should be appropriately difficult.  Defenses of all kinds are encouraged to help make the Capture challenging. (walls, doors, gates, turrets, custom shields, etc.)

===Item Placement===

The flagbases should be inaccessible by larger vehicles, either by structure, barrier or pedestal.  Otherwise, players and bots will ride a tank or leviathan on top of their flag to defend and camp on it.

Neutral vehicles placed in the center can add to gameplay by providing a &quot;soft&quot; gameObjective; a place Teams want to control.  Neutral (non-flying) vehicles placed near flagbases allow enemies to make quick getaways.

With large layouts, pedestrians can feel stranded out in remote locations.  Offer them alternative travel to key points with JumpPads, Teleporters, Movers, etc. in those locations.

===Vehicles===

Remember: By default, flying vehicles cannot carry the flag.  Also, someone riding on top of any vehicle can pick up the flag without getting off the vehicle (the Manta is excellent for this).

VehicleFactories will not spawn vehicles in a VCTF map until the gametype is set in LevelInfo to &lt;tt&gt;xGame.XVehicleCTFGame&lt;/tt&gt; and both FlagBases are placed.

ONSVehicles(Factories) will spawn by automatically setting the TeamNumber to match that of the nearest GameObjective (Flag).  Try the custom [[Legacy:TeamVehicleFactory|TeamVehicleFactory]] for greater control over aspects of vehicle spawning.

===Botplay===

Bots will not use vehicles until a proper CTF bot path network is set, with an AssaultPath set to each flag and at least one WHITE (widest) path connects the two flags.  The vehicle spawn points must also be accessible to these wide pathways with their own WHITE paths.

Neutral controllers, controlling bots, turrets, etc., will attack Red and Blue Team members equally.  They will ignore other Neutral controllers, as if Neutral was it's own Team. (Team 255)

==Creating a VCTF Map ==

This is a list of critical elements needed to create a simple VCTF map.
* Modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt;.
* A big enough space for vehicles and/or flying vehicles.
* Place two [[Legacy:XRealCTFBase|xRealCTFBase]]s, ones for Red and Blue teams.  These must be accessible to a RoadPathNode path network. (see the '''Botplay''' section above)
* Place player starts (set &lt;tt&gt;PlayerStart.TeamNum&lt;/tt&gt;s: 0=red, 1=blue)
* Place an [[Legacy:AssaultPath|AssaultPath]] near each flag (line of sight is good) for the attacking team.
* Place VehicleFactory actors where you want vehicles to spawn. Set the direction you want them to start in. The TeamNumber for the vehicles will be set automatically when using ONSVehicleFactories; whichever gameobjective is closer; the red flag or the blue flag. By using custom actors like the [[Legacy:TeamVehicleFactory|TeamVehicleFactory]], you can set the TeamNumber yourself. (0=red, 1=blue, 255=none or neutral)
* When placing [[Legacy:RoadPathNode|RoadPathNode]]s, keep the paths wide (white) between nodes for large ground vehicles and especially along the paths to the flags. Keep these spaced over 512 or 1024 apart because vehicles are not as agile as players on foot; they need to make wider turns.  Try to keep the number of pathnodes even on each team's side of the map.  There must be at least one white path connecting the flags to the path network, but more paths are recommended.
* Place [[Legacy:FlyingPathNode|FlyingPathNode]]s (between 1024 and 2048 apart) about 1024 to 2048 above the ground. Don't bother making fine or complicated pathing for flying vehicles, with momentum carrying them, they need to make very wide turns, rises and dives.

==Tips==

===Vehicle Pathing for VCTF ( by Toonces T. Cat )===

A few key points to note in the construction of a VCTF level.

* Using an [[Legacy:AssaultPath|AssaultPath]] after the last [[Legacy:RoadPathNode|RoadPathNode]] that vehicles can reach works, and works well, but introduces new and even more complex issues into the equation. Someone else mentioned it in another thread, but what good is it to have your bot grab the flag and then not have a vehicle available when it returns to the RoadPathed area of the map? The best bet is to have the flag in an area where it can make a double (bi-directional) white connection to one or more RoadPathNodes.

* Think vertical and you can have your cake and eat it too. I have created a second elevated level that is pathed just for foot use and it also connects to both flags and, even though the bots use it, it does not preclude them from using the vehicles as well. In fact, combos are very possible as I have seen them use the overhead route to get the flag and then jump into a Tank or a Hell Bender that one of their team-mates is using and hitch a ride home...

* The translocator definitely should be allowed in the game-type. The bots commonly chase a team-mate's vehicle with it and will jump on-board in mid-toss...It is extremely cool to watch them do this... ('''SuperApe''': Toonce's is talking about ignoring the default rules for VCTF that disallow Translocators.  This could be done by placing a custom actor (subclass of [[Legacy:XPickUpBase|xPickUpBase]]) and specifying a XWeapon.Transpickup as it's Powerup.  See also [http://forums.unrealplayground.com/showthread.php?t=24029 this thread] ('''GreatEmerald''': ''Note: dead link - any replacement?'').)

* When the flag is in a vehicle accessible area, elevate it above the floor on some type of base that the bots can climb on foot, but not in a vehicle. I am using an octagonal base that is about 256 units in diameter and about 40 units high. It has 4 narrow stairwells cut into it (one on every other side) that the bots can use. It is high enough to stop a vehicle (except for the Leviathan), but not so high that the nearby RoadPathNodes cannot make a good path connection.

Why do you need this? Because the bots playing defense will pile into a Goliath and camp the flag if they can get on top of it...and I mean literally ON TOP of it. An enemy bot cannot get to it to take the flag if they are there. This is a workaround of sorts, but it is an effective one as even if they are using a Tank, if the attacker engages them, another bot can come up form behind and take the flag...I've watched it a dozen times.

* As I said above, the 40 unit high barrier will not stop a Leviathan...Hence, tip #5 is do not path the Leviathans if you have them in your level. If a Masterful bot gets into one of them with a couple of his pals, the other team is in big trouble. It's better to keep them out the Leviathans unless a human is driving it. ('''GreatEmerald''': If you need a Leviathan, though, you can set some RoadPathNodes' properties, under Navigation Point, bNoSuperSize to True to keep Leviathans out of some trouble. This way you can also make a defensive Leviathan by setting bNoSuperSize properties only to those nodes that are close to flags, although bots might not want to go in. You might also path everything normally, add an AssaultPath somewhat away from the flag and make all next PathNodes/RoadPathNodes bNoSuperSize to make bots use Leviathans, but not spam with them.)

* RoadPathNodes can be further cleaned up by changing the MaxRoadDistance value in the properties. The default distance is ten thousand. This can create ALL KINDS of unwanted clutter. In the top orthographic view measure between the nodes that you want to connect using  SHIFT+MIDDLEMOUSE to bring up the ruler and adjust the nodes accordingly.

==FAQ==

Frequently asked questions and common problems while mapping for VCTF.

* ''Where is the VehicleCTF gametype in the UT2004 menu?''

The VehicleCTF gametype will not show up in the list of available gametypes until at least one VCTF map is placed in the Maps directory. (Filename syntax is : '''VCTF-Foo''')
* ''Vehicles aren't spawning''

You must modify LevelProperties-&gt;LevelInfo-&gt;DefaultGametype to &lt;tt&gt;xGame.xVehicleCTFGame&lt;/tt&gt; and have both the Red and Blue team FlagBases set in the map.  After that, Vehicle Factories will spawn vehicles.
* ''Bots won't use the vehicles''

There must be at least one fully connected path from one flag to the other and at least one of these paths must be solidly '''white''' all along the route.  This will indicate to bots that they can use a vehicle to reach their goal along that path.  The VehicleFactories will also have to be connected to at least one of these routes with a white path.
* ''Bots only use the shortest path to the enemy flag and back''

Use of an AssaultPath close to and within line of sight of the target flag will help bots reach their goal, but to encourage bots to use more of the layout, use other AssaultPaths that meet up to that goal.  See [[Legacy:AssaultPath|AssaultPath]] and [[Legacy:Bot Pathing|Bot Pathing]].

==External Links==
* [http://forums.unrealplayground.com/showthread.php?t=23758 Unreal Playground Forum: Mapping for VCTF]
* [http://blitz.unrealplayground.com/tutorials/bots.html Blitz's Advanced Bot Pathing Tutorial]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Mapping For CTF|Mapping for CTF]]
* [[Legacy:Pathing For Vehicles|Pathing For Vehicles]]
* [[Legacy:Pathing 2k4 Flying Vehicles|Pathing 2k4 Flying Vehicles]]
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Gametype|Gametype]]
* [[Legacy:Vehicle|Vehicle]] &amp;ndash; Parent class for all vehicles in UT2004
* [[Legacy:Vehicles|Vehicles]] &amp;ndash; Vehicle main topic

==Discussion==

'''SuperApe''': Created.  Most borrowed from the external link I wrote a while ago.  Toonce's vehicle pathing comments added from [[Legacy:Pathing For Vehicles|Pathing for Vehicles]] and edited slightly.  [[Legacy:XVehicleCTFGame|xVehicleCTFGame]], [[Legacy:RoadPathNode|RoadPathNode]], [[Legacy:FlyingPathNode|FlyingPathNode]], [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] pages added and other misc links changed. ([[Legacy:NavigationPoint|NavigationPoint]] subclass list, etc.)

'''[[User:GreatEmerald|GreatEmerald]]''': Saw some interesting bot behaviour when spectating a VCTF match with 2 bots. I used AssaultPaths. So when a bot with a vehicle got to one, it left the vehicle, took the flag and... Acted randomly. Usually, bots enter the vehicle with which they came, then instantly exit. Some times though, they enter the vehicle, drive in it for a few seconds and leave it. And the other times bots enter the vehicle and drive nicely. When the bots get back on foot, they can use their own vehicles near their base. Strangely, bots with flags enter the vehicle, and again, some times they drive, and some times they just leave the vehicle. Another strange addition is when a bot with a flag tries to return their own flag. One time a bot in a tank killed a bot flag carrier, then drove very near the dropped flag, returned it, then continued on foot, decided to get into the tank again, ran back and stood near the vehicle, but didn't enter. Another bot that was carrying the flag on foot killed another flag carrier (it was on foot too), ran away from its own flag, decided to return it, returned it, ran back to the AssaultPath and again tried to capture the enemy flag. Any explanation on what's happening and what to do?

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping Hello World</title>
    <id>2102</id>
    <revision>
      <id>5121</id>
      <timestamp>2006-06-06T15:57:15Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

This page is a  basic scripting tutorial aimed at mappers who want to learn to create custom subclasses.  It will explain how to make some sort of [[Legacy:Trigger|Trigger]] subclass that says &quot;hello world&quot; in the HUD message area by default.

==Instructions==
# Preliminaries:
## [[Legacy:Subtract A Space|Subtract A Space]]
## [[Legacy:Place A Playerstart|Place A Playerstart]]
# [[Legacy:Create A Subclass|Create A Subclass]] from Trigger, call it '''HelloWorldTrigger''' in package [[Legacy:MyLevel|MyLevel]].
# Cut the default code from the [[Legacy:Script Editor|Script Editor]] and paste in this simple script: &lt;br /&gt;&lt;uscript&gt;
//===============================================
// HelloWorldTrigger.
// Displays &quot;Hello World!&quot; to the player's HUD.
//===============================================
class HelloWorldTrigger extends Trigger
     placable;

function PostBeginPlay()
{
     Super.PostBeginPlay();
     Message = &quot;Hello World!&quot;;
}
&lt;/uscript&gt;
# Compile
# [[Legacy:Add An Actor|Add an Actor]] of this new class
# [[Legacy:Set The Following Properties|Set the following Properties]]: ''(not necessary with this HelloWorldTrigger code)''
## [[Legacy:Actor/Collision|Actor/Collision]]
## Something so it displays (light, texture, static mesh)
# Save and [[Legacy:Playtest|Playtest]]

==Related Topics==
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Third-Party Components|Third-Party Components]]

==Discussion==

'''Unknown (author):''' some rough notes on what this page should have... please add / suggest / change

'''Musicalglass:''' Might want to point out that this quick method of subclassing will not work for all needs, such as working with animated skeletal meshes. List a few circumstances where you might need to compile the long way and link to that bit and maybe Playing Mesh Animations for a sample tutorial. I actually have a second tutorial which I didn't post dealing with the second part of Playing Mesh Animations using the simple mesh cube that comes with the editor. Most likely far too wordy for your tastes, but I'd be happy to submit it for your review. I wanted to take things like rotation and translational values and experiment with doing simple scripting exercises such as how to add Touch or a Trigger or script a sequence or call on different states. We need more practical examples of simple scripts and maybe tie it in with one of these simple tutorials so people can get their feet wet with coding with some kind of visual feedback suitable for a gaming environment.

'''SuperApe:''' This page seems to need a little more explanation, a little more concepts and elements-type stuff.  I might suggest we use one of the [[Legacy:Third-Party Components|Third-Party Components]] for the &quot;Paste in a simple script&quot; step.  We could have a [[Legacy:RandomTrigger|RandomTrigger]] activate three colored [[Legacy:TriggerLight|TriggerLight]]s, for example.  And, the page title kind of threw me off, should it be more like, &quot;Scripting Hello World&quot;?

'''Tarquin:''' Not really, the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a mutator. :)

'''SuperApe:''' Note any ''stock'' Trigger will do (the work of the code above) if you put, &quot;Hello World&quot; in the Trigger -&gt; Message property.  Maybe we should do something more custom.

'''Tarquin:''' But then there wouldn't be any scripting!  The purpose of a 'Hello world' program is to be simple, so I don't think something more custom would be suitable.

'''StarWeaver:''' Personally, I wouldn't expect the *mapping* concept of Hello World to involve scripting, just the minimum amount of complexity to create a functioning level; e.g., perhaps, &quot;Select a texture that won't make you yark, subtract a standard rectangular space, add a player start and one interactable object like a pickupbase.&quot;

'''Tarquin:''' That's [[Legacy:Create A Room|Create a room]]. basically, what I was trying to do here was starting point for: 'Want some code in your map? Don't want to code a whole mutator just to get started?'

'''SuperApe:''' :)  I see the point of using this page as a starting point for using custom scripts by mappers.  I see [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a more advanced scripting tutorial.  (BTW, those should be linked as a series of &quot;Basic Procedure&quot;-like steps for Modding from [[Legacy:Making Mods|Making Mods]], IMHO)  I think my earlier comment about how this particular code duplicated the functionality already available in Trigger was to be taken together with the suggestion that we use one of the &lt;u&gt;simpler&lt;/u&gt; scripts from [[Legacy:Third-Party Components|Third-Party Components]].  To me, to introduce scripting with the above code to perform that function would be confusing a) the issue of what a Trigger does by default and b) the issue of how one gets a custom actor to display or broadcast a message.  Although you're right, it is simple, it doesn't actually hit the point of using custom code: to get extra functionality not available in stock objects.  Also, note that this code doesn't require any other property settings, which as the steps above indicate, might be good to include in a tutorial like this.  As far as the name of the page, as long as it's linked ''to'' well, it probably doesn't matter so much.  But, on the other hand, I might suggest &quot;Mappers Hello World&quot;, to keep the idea that this is a simpler version of scripting tutorial.  That title sounds like, &quot;Math for Artists&quot;, to me and seems more appropriate.  What does everyone think of that?

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; This tutorial needs some work.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5122</id>
      <timestamp>2005-12-22T16:39:23Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview==

This page is a  basic scripting tutorial aimed at mappers who want to learn to create custom subclasses.  It will explain how to make some sort of [[Legacy:Trigger|Trigger]] subclass that says &quot;hello world&quot; in the HUD message area.

==Instructions==
# Preliminaries (just link to the [[Legacy:Mapping Lessons|Mapping lessons]] tutorials for these):
## [[Legacy:Subtract A Space|Subtract A Space]]
## [[Legacy:Place A Playerstart|Place A Playerstart]]
# [[Legacy:Create A Subclass|Create A Subclass]] from Trigger, call it '''HelloWorldTrigger''' in package [[Legacy:MyLevel|MyLevel]].
# Cut the default code from the [[Legacy:Script Editor|Script Editor]] and paste in this simple script: &lt;br /&gt;&lt;uscript&gt;
//===============================================
// HelloWorldTrigger.
// Displays &quot;Hello World!&quot; to the player's HUD.
//===============================================
class HelloWorldTrigger extends Trigger
     placable;

function PostBeginPlay()
{
     Super.PostBeginPlay();
     Message = &quot;Hello World!&quot;;
}
&lt;/uscript&gt;
# Compile
# [[Legacy:Add An Actor|Add an Actor]] of this new class
# [[Legacy:Set The Following Properties|Set the following Properties]]: ''(not necessary with the HelloWorldTrigger)''
## [[Legacy:Actor/Collision|Actor/Collision]]
## Something so it displays (light, texture, static mesh)
# Save and [[Legacy:Playtest|Playtest]]

==Related Topics==
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Third-Party Components|Third-Party Components]]

==Discussion==

'''Unknown (author):''' some rough notes on what this page should have... please add / suggest / change

'''Musicalglass:''' Might want to point out that this quick method of subclassing will not work for all needs, such as working with animated skeletal meshes. List a few circumstances where you might need to compile the long way and link to that bit and maybe Playing Mesh Animations for a sample tutorial. I actually have a second tutorial which I didn't post dealing with the second part of Playing Mesh Animations using the simple mesh cube that comes with the editor. Most likely far too wordy for your tastes, but I'd be happy to submit it for your review. I wanted to take things like rotation and translational values and experiment with doing simple scripting exercises such as how to add Touch or a Trigger or script a sequence or call on different states. We need more practical examples of simple scripts and maybe tie it in with one of these simple tutorials so people can get their feet wet with coding with some kind of visual feedback suitable for a gaming environment.

'''SuperApe:''' This page seems to need a little more explanation, a little more concepts and elements-type stuff.  I might suggest we use one of the [[Legacy:Third-Party Components|Third-Party Components]] for the &quot;Paste in a simple script&quot; step.  We could have a [[Legacy:RandomTrigger|RandomTrigger]] activate three colored [[Legacy:TriggerLight|TriggerLight]]s, for example.  And, the page title kind of threw me off, should it be more like, &quot;Scripting Hello World&quot;?

'''Tarquin:''' Not really, the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a mutator. :)

'''SuperApe:''' Note any ''stock'' Trigger will do this if you put, &quot;Hello World&quot; in the Trigger -&gt; Message property.  Maybe we should do something more custom.

'''Tarquin:''' but then there wouldn't be any scripting! The purpose of a 'Hello world' program is to be simple, so I don't think something more custom would be suitable.

'''StarWeaver:''' Personally, I wouldn't expect the *mapping* concept of Hello World to involve scripting, just the minimum amount of complexity to create a functioning level; e.g., perhaps, &quot;Select a texture that won't make you yark, subtract a standard rectangular space, add a player start and one interactable object like a pickupbase.&quot;

'''Tarquin:''' That's [[Legacy:Create A Room|Create a room]]. basically, what I was trying to do here was starting point for: 'Want some code in your map? Don't want to code a whole mutator just to get started?'

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; This tutorial needs some work.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5123</id>
      <timestamp>2005-12-22T17:30:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>my $0.02.</comment>
      <text xml:space="preserve">==Overview==

This page is a  basic scripting tutorial aimed at mappers who want to learn to create custom subclasses.  It will explain how to make some sort of [[Legacy:Trigger|Trigger]] subclass that says &quot;hello world&quot; in the HUD message area.

==Instructions==
# Preliminaries:
## [[Legacy:Subtract A Space|Subtract A Space]]
## [[Legacy:Place A Playerstart|Place A Playerstart]]
# [[Legacy:Create A Subclass|Create A Subclass]] from Trigger, call it '''HelloWorldTrigger''' in package [[Legacy:MyLevel|MyLevel]].
# Cut the default code from the [[Legacy:Script Editor|Script Editor]] and paste in this simple script: &lt;br /&gt;&lt;uscript&gt;
//===============================================
// HelloWorldTrigger.
// Displays &quot;Hello World!&quot; to the player's HUD.
//===============================================
class HelloWorldTrigger extends Trigger
     placable;

function PostBeginPlay()
{
     Super.PostBeginPlay();
     Message = &quot;Hello World!&quot;;
}
&lt;/uscript&gt;
# Compile
# [[Legacy:Add An Actor|Add an Actor]] of this new class
# [[Legacy:Set The Following Properties|Set the following Properties]]: ''(not necessary with the HelloWorldTrigger)''
## [[Legacy:Actor/Collision|Actor/Collision]]
## Something so it displays (light, texture, static mesh)
# Save and [[Legacy:Playtest|Playtest]]

==Related Topics==
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Third-Party Components|Third-Party Components]]

==Discussion==

'''Unknown (author):''' some rough notes on what this page should have... please add / suggest / change

'''Musicalglass:''' Might want to point out that this quick method of subclassing will not work for all needs, such as working with animated skeletal meshes. List a few circumstances where you might need to compile the long way and link to that bit and maybe Playing Mesh Animations for a sample tutorial. I actually have a second tutorial which I didn't post dealing with the second part of Playing Mesh Animations using the simple mesh cube that comes with the editor. Most likely far too wordy for your tastes, but I'd be happy to submit it for your review. I wanted to take things like rotation and translational values and experiment with doing simple scripting exercises such as how to add Touch or a Trigger or script a sequence or call on different states. We need more practical examples of simple scripts and maybe tie it in with one of these simple tutorials so people can get their feet wet with coding with some kind of visual feedback suitable for a gaming environment.

'''SuperApe:''' This page seems to need a little more explanation, a little more concepts and elements-type stuff.  I might suggest we use one of the [[Legacy:Third-Party Components|Third-Party Components]] for the &quot;Paste in a simple script&quot; step.  We could have a [[Legacy:RandomTrigger|RandomTrigger]] activate three colored [[Legacy:TriggerLight|TriggerLight]]s, for example.  And, the page title kind of threw me off, should it be more like, &quot;Scripting Hello World&quot;?

'''Tarquin:''' Not really, the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a mutator. :)

'''SuperApe:''' Note any ''stock'' Trigger will do (the work of the code above) if you put, &quot;Hello World&quot; in the Trigger -&gt; Message property.  Maybe we should do something more custom.

'''Tarquin:''' But then there wouldn't be any scripting!  The purpose of a 'Hello world' program is to be simple, so I don't think something more custom would be suitable.

'''StarWeaver:''' Personally, I wouldn't expect the *mapping* concept of Hello World to involve scripting, just the minimum amount of complexity to create a functioning level; e.g., perhaps, &quot;Select a texture that won't make you yark, subtract a standard rectangular space, add a player start and one interactable object like a pickupbase.&quot;

'''Tarquin:''' That's [[Legacy:Create A Room|Create a room]]. basically, what I was trying to do here was starting point for: 'Want some code in your map? Don't want to code a whole mutator just to get started?'

'''SuperApe:''' :)  I see the point of using this page as a starting point for using custom scripts by mappers.  I see [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a more advanced scripting tutorial.  (BTW, those should be linked as a series of &quot;Basic Procedure&quot;-like steps for Modding from [[Legacy:Making Mods|Making Mods]], IMHO)  I think my earlier comment about how this particular code duplicated the functionality already available in Trigger was to be taken together with the suggestion that we use one of the &lt;u&gt;simpler&lt;/u&gt; scripts from [[Legacy:Third-Party Components|Third-Party Components]].  To me, to introduce scripting with the above code to perform that function would be confusing a) the issue of what a Trigger does by default and b) the issue of how one gets a custom actor to display or broadcast a message.  Although you're right, it is simple, it doesn't actually hit the point of using custom code: to get extra functionality not available in stock objects.  Also, note that this code doesn't require any other property settings, which as the steps above indicate, might be good to include in a tutorial like this.  As far as the name of the page, as long as it's linked ''to'' well, it probably doesn't matter so much.  But, on the other hand, I might suggest &quot;Mappers Hello World&quot;, to keep the idea that this is a simpler version of scripting tutorial.  That title sounds like, &quot;Math for Artists&quot;, to me and seems more appropriate.  What does everyone thing of that?

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; This tutorial needs some work.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44218</id>
      <timestamp>2010-12-29T17:40:11Z</timestamp>
      <contributor>
        <ip>90.212.241.153</ip>
      </contributor>
      <comment>/* Instructions */</comment>
      <text xml:space="preserve">==Overview==

This page is a  basic scripting tutorial aimed at mappers who want to learn to create custom subclasses.  It will explain how to make some sort of [[Legacy:Trigger|Trigger]] subclass that says &quot;hello world&quot; in the HUD message area by default.

==Instructions==
# Preliminaries:
## [[Legacy:Subtract A Space|Subtract A Space]]
## [[Legacy:Place A Playerstart|Place A Playerstart]]
# [[Legacy:Create A Subclass|Create A Subclass]] from Trigger, call it '''HelloWorldTrigger''' in package [[Legacy:MyLevel|MyLevel]].
# Cut the default code from the [[Legacy:Script Editor|Script Editor]] and paste in this simple script: &lt;br /&gt;
&lt;uscript&gt;
//===============================================
// HelloWorldTrigger.
// Displays &quot;Hello World!&quot; to the player's HUD.
//===============================================
class HelloWorldTrigger extends Trigger
     placable;

function PostBeginPlay()
{
     Super.PostBeginPlay();
     Message = &quot;Hello World!&quot;;
}
&lt;/uscript&gt;
# Compile
# [[Legacy:Add An Actor|Add an Actor]] of this new class
# [[Legacy:Set The Following Properties|Set the following Properties]]: ''(not necessary with this HelloWorldTrigger code)''
## [[Legacy:Actor/Collision|Actor/Collision]]
## Something so it displays (light, texture, static mesh)
# Save and [[Legacy:Playtest|Playtest]]

==Related Topics==
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Third-Party Components|Third-Party Components]]

==Discussion==

'''Unknown (author):''' some rough notes on what this page should have... please add / suggest / change

'''Musicalglass:''' Might want to point out that this quick method of subclassing will not work for all needs, such as working with animated skeletal meshes. List a few circumstances where you might need to compile the long way and link to that bit and maybe Playing Mesh Animations for a sample tutorial. I actually have a second tutorial which I didn't post dealing with the second part of Playing Mesh Animations using the simple mesh cube that comes with the editor. Most likely far too wordy for your tastes, but I'd be happy to submit it for your review. I wanted to take things like rotation and translational values and experiment with doing simple scripting exercises such as how to add Touch or a Trigger or script a sequence or call on different states. We need more practical examples of simple scripts and maybe tie it in with one of these simple tutorials so people can get their feet wet with coding with some kind of visual feedback suitable for a gaming environment.

'''SuperApe:''' This page seems to need a little more explanation, a little more concepts and elements-type stuff.  I might suggest we use one of the [[Legacy:Third-Party Components|Third-Party Components]] for the &quot;Paste in a simple script&quot; step.  We could have a [[Legacy:RandomTrigger|RandomTrigger]] activate three colored [[Legacy:TriggerLight|TriggerLight]]s, for example.  And, the page title kind of threw me off, should it be more like, &quot;Scripting Hello World&quot;?

'''Tarquin:''' Not really, the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a mutator. :)

'''SuperApe:''' Note any ''stock'' Trigger will do (the work of the code above) if you put, &quot;Hello World&quot; in the Trigger -&gt; Message property.  Maybe we should do something more custom.

'''Tarquin:''' But then there wouldn't be any scripting!  The purpose of a 'Hello world' program is to be simple, so I don't think something more custom would be suitable.

'''StarWeaver:''' Personally, I wouldn't expect the *mapping* concept of Hello World to involve scripting, just the minimum amount of complexity to create a functioning level; e.g., perhaps, &quot;Select a texture that won't make you yark, subtract a standard rectangular space, add a player start and one interactable object like a pickupbase.&quot;

'''Tarquin:''' That's [[Legacy:Create A Room|Create a room]]. basically, what I was trying to do here was starting point for: 'Want some code in your map? Don't want to code a whole mutator just to get started?'

'''SuperApe:''' :)  I see the point of using this page as a starting point for using custom scripts by mappers.  I see [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] is a more advanced scripting tutorial.  (BTW, those should be linked as a series of &quot;Basic Procedure&quot;-like steps for Modding from [[Legacy:Making Mods|Making Mods]], IMHO)  I think my earlier comment about how this particular code duplicated the functionality already available in Trigger was to be taken together with the suggestion that we use one of the &lt;u&gt;simpler&lt;/u&gt; scripts from [[Legacy:Third-Party Components|Third-Party Components]].  To me, to introduce scripting with the above code to perform that function would be confusing a) the issue of what a Trigger does by default and b) the issue of how one gets a custom actor to display or broadcast a message.  Although you're right, it is simple, it doesn't actually hit the point of using custom code: to get extra functionality not available in stock objects.  Also, note that this code doesn't require any other property settings, which as the steps above indicate, might be good to include in a tutorial like this.  As far as the name of the page, as long as it's linked ''to'' well, it probably doesn't matter so much.  But, on the other hand, I might suggest &quot;Mappers Hello World&quot;, to keep the idea that this is a simpler version of scripting tutorial.  That title sounds like, &quot;Math for Artists&quot;, to me and seems more appropriate.  What does everyone think of that?

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] &amp;ndash; This tutorial needs some work.
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping Lessons</title>
    <id>1825</id>
    <revision>
      <id>4478</id>
      <timestamp>2008-02-22T12:33:42Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is for tutorials aimed at beginners with no mapping experience.

==Editing in Unreal 3==

These tutorials are strictly for use with UT3. Mapping is similar previous versions of the engine, but there are a some differences.

# [[Legacy:UT3 Whats New, Whats Not|UT3 Whats New, Whats not]] &amp;ndash; Getting ready to map for UT3

==A first functional map in unreal tournament 3.==

Please note that the new unreal editor is quite similar to the old one. Which means that if you have experience with the old one, you will quickly get the hang of this. Also this means that tutorials for UT04/03 will sometimes help for UT3. If you follow these steps you will learn the editor and have a basic map ready in no time :P

# [[Legacy:Creating A Space|Creating a Space]] - The most basic part.
# [[Legacy:Adding A Brick|Adding a Brick]] - The other Figures.
# [[Legacy:Creating Light|Creating Light]] - Unless you want to play in the dark.

More will be coming, plus they still need some fixing.

==A first functional map==

This is a sequence of tutorial pages which will guide you through the steps in making a simple map that you'll be able play in the game. The emphasis is on getting things done: concepts are explained briefly but can be skipped, and there are links to other parts of the wiki for further reading. Each tutorial will give the link to the next page.

Though this may seem like a lot to learn before being able to do anything, you will have a map that you can play in-game after the third lesson. The first few lessons should only take a few minutes to complete.

# [[Legacy:Subtract A Space|Subtract A Space]] - the first step to another world
# [[Legacy:Place A Light|Place a Light]] and build the lighting so you can see
# [[Legacy:Place A Playerstart|Place a Playerstart]] so you can [[Legacy:Playtest|Playtest]] the map 
# [[Legacy:Apply Texture|Apply Texture]] to a surface
# [[Legacy:Place A Pickup|Place a Pickup]] - adding weapons and other items
# [[Legacy:Adding A Block|Adding a Block]] - adding a cube to your subtracted space
# [[Legacy:Creating A Terrain|Creating a Terrain]] - creating organic ground
# [[Legacy:Adding Sunlight|Adding Sunlight]] - ''let there be (sun)light''
# [[Legacy:Building A SkyBox|Building A SkyBox]] - creating the distant &quot;background&quot;
# [[Legacy:Add A Static Mesh|Add A Static Mesh]] - adding complex decoration

After you've got the basics, you might want to check out the [[Legacy:Topics On Mapping|Topics On Mapping]] page.

From there, check out [[Legacy:Learn The Tools|Learn the Tools]] which covers many common problems you may encounter.

Note that different gametypes present different map requirements. See the [[Legacy:Gametype|Gametype]] page for help regarding these requirements. See [[Legacy:Map File Prefix|Map File Prefix]] for the appropriate file prefix for your map.

==Acidsphinx's journal into UT3==

An incomplete set of tutorials and guides.

[[Legacy:Acidsphinx'S Journal Into UT3|Acidsphinx's Journal into UT3]]

==External Links==
* [http://www.icecreamyou.com/tutorials.html The Complete Mapping Guide] &amp;ndash; IceCreamYou's guide to turn new mappers pro.  For UT2004 and UT3.

==Related Topics==
* [[Legacy:Beginners Guide To Mapping|Beginners Guide To Mapping]]
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your maps
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] - Cleanup and revision.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4479</id>
      <timestamp>2008-02-18T22:28:16Z</timestamp>
      <contributor>
        <ip>32.84-48-200.nextgentel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is for tutorials aimed at beginners with no mapping experience.

==Editing in Unreal 3==

These tutorials are strictly for use with UT3. Mapping is similar previous versions of the engine, but there are a some differences.

# [[Legacy:UT3 Whats New, Whats Not|UT3 Whats New, Whats not]] &amp;ndash; Getting ready to map for UT3

==A first functional map in unreal tournament 3.==

Please note that the new unreal editor is quite similar to the old one. Which means that if you have experience with the old one, you will quickly get the hang of this. Also this means that tutorials for UT04/03 will sometimes help for UT3. If you follow these steps you will learn the editor and have a basic map ready in no time :P

# [[Legacy:Creating A Space|Creating a Space]] - The most basic part.
# [[Legacy:Adding A Brick|Adding a Brick]] - The other Figures.
# [[Legacy:Creating Light|Creating Light]] - Unless you want to play in the dark.

More will be coming, plus they still need some fixing.

==A first functional map==

This is a sequence of tutorial pages which will guide you through the steps in making a simple map that you'll be able play in the game. The emphasis is on getting things done: concepts are explained briefly but can be skipped, and there are links to other parts of the wiki for further reading. Each tutorial will give the link to the next page.

Though this may seem like a lot to learn before being able to do anything, you will have a map that you can play in-game after the third lesson. The first few lessons should only take a few minutes to complete.

# [[Legacy:Subtract A Space|Subtract A Space]] - the first step to another world
# [[Legacy:Place A Light|Place a Light]] and build the lighting so you can see
# [[Legacy:Place A Playerstart|Place a Playerstart]] so you can [[Legacy:Playtest|Playtest]] the map 
# [[Legacy:Apply Texture|Apply Texture]] to a surface
# [[Legacy:Place A Pickup|Place a Pickup]] - adding weapons and other items
# [[Legacy:Adding A Block|Adding a Block]] - adding a cube to your subtracted space
# [[Legacy:Creating A Terrain|Creating a Terrain]] - creating organic ground
# [[Legacy:Adding Sunlight|Adding Sunlight]] - ''let there be (sun)light''
# [[Legacy:Building A SkyBox|Building A SkyBox]] - creating the distant &quot;background&quot;
# [[Legacy:Add A Static Mesh|Add A Static Mesh]] - adding complex decoration

After you've got the basics, you might want to check out the [[Legacy:Topics On Mapping|Topics On Mapping]] page.

From there, check out [[Legacy:Learn The Tools|Learn the Tools]] which covers many common problems you may encounter.

Note that different gametypes present different map requirements. See the [[Legacy:Gametype|Gametype]] page for help regarding these requirements. See [[Legacy:Map File Prefix|Map File Prefix]] for the appropriate file prefix for your map.

==External Links==
* [http://www.icecreamyou.com/tutorials.html The Complete Mapping Guide] &amp;ndash; IceCreamYou's guide to turn new mappers pro.  For UT2004 and UT3.

==Related Topics==
* [[Legacy:Beginners Guide To Mapping|Beginners Guide To Mapping]]
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your maps
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] - Cleanup and revision.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4480</id>
      <timestamp>2008-02-22T10:56:04Z</timestamp>
      <contributor>
        <ip>AcidSphinx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is for tutorials aimed at beginners with no mapping experience.

==Editing in Unreal 3==

These tutorials are strictly for use with UT3. Mapping is similar previous versions of the engine, but there are a some differences.

# [[Legacy:UT3 Whats New, Whats Not|UT3 Whats New, Whats not]] &amp;ndash; Getting ready to map for UT3

==A first functional map in unreal tournament 3.==

Please note that the new unreal editor is quite similar to the old one. Which means that if you have experience with the old one, you will quickly get the hang of this. Also this means that tutorials for UT04/03 will sometimes help for UT3. If you follow these steps you will learn the editor and have a basic map ready in no time :P

# [[Legacy:Creating A Space|Creating a Space]] - The most basic part.
# [[Legacy:Adding A Brick|Adding a Brick]] - The other Figures.
# [[Legacy:Creating Light|Creating Light]] - Unless you want to play in the dark.

More will be coming, plus they still need some fixing.

==A first functional map==

This is a sequence of tutorial pages which will guide you through the steps in making a simple map that you'll be able play in the game. The emphasis is on getting things done: concepts are explained briefly but can be skipped, and there are links to other parts of the wiki for further reading. Each tutorial will give the link to the next page.

Though this may seem like a lot to learn before being able to do anything, you will have a map that you can play in-game after the third lesson. The first few lessons should only take a few minutes to complete.

# [[Legacy:Subtract A Space|Subtract A Space]] - the first step to another world
# [[Legacy:Place A Light|Place a Light]] and build the lighting so you can see
# [[Legacy:Place A Playerstart|Place a Playerstart]] so you can [[Legacy:Playtest|Playtest]] the map 
# [[Legacy:Apply Texture|Apply Texture]] to a surface
# [[Legacy:Place A Pickup|Place a Pickup]] - adding weapons and other items
# [[Legacy:Adding A Block|Adding a Block]] - adding a cube to your subtracted space
# [[Legacy:Creating A Terrain|Creating a Terrain]] - creating organic ground
# [[Legacy:Adding Sunlight|Adding Sunlight]] - ''let there be (sun)light''
# [[Legacy:Building A SkyBox|Building A SkyBox]] - creating the distant &quot;background&quot;
# [[Legacy:Add A Static Mesh|Add A Static Mesh]] - adding complex decoration

After you've got the basics, you might want to check out the [[Legacy:Topics On Mapping|Topics On Mapping]] page.

From there, check out [[Legacy:Learn The Tools|Learn the Tools]] which covers many common problems you may encounter.

Note that different gametypes present different map requirements. See the [[Legacy:Gametype|Gametype]] page for help regarding these requirements. See [[Legacy:Map File Prefix|Map File Prefix]] for the appropriate file prefix for your map.

==Acidsphinx's journal into UT3==

===DM-Siesmic Canyon===

====Miscellanious Infos====

[[Legacy:DM-Seismic Canyon Foreword|DM-Seismic Canyon Foreword]]

[[Legacy:DM-Siesmic Canyon Links|DM-Siesmic Canyon Links]]

[[Legacy:DM-Siesmic Canyon Planning|DM-Siesmic Canyon Planning]]

====Lessons====

'''Part #01'''

[[Legacy:Part 01 DM-Siesmic Canyon Textures|Part 01 DM-Siesmic Canyon Textures]]

[[Legacy:Part 01 DM-Siesmic Canyon Static Meshes|Part 01 DM-Siesmic Canyon Static Meshes]]

[[Legacy:Part 01 DM-Siesmic Canyon Mesh Import|Part 01 DM-Siesmic Canyon Mesh Import]]

[[Legacy:Part 01 DM-Siesmic Canyon A Quick Test|Part 01 DM-Siesmic Canyon A Quick Test]]

====Lessons Summary====

[[Legacy:Part 01-Using VertexColoring To Smoothly Texture Static Meshes|Part 01-Using VertexColoring to Smoothly Texture Static Meshes]]

==External Links==
* [http://www.icecreamyou.com/tutorials.html The Complete Mapping Guide] &amp;ndash; IceCreamYou's guide to turn new mappers pro.  For UT2004 and UT3.

==Related Topics==
* [[Legacy:Beginners Guide To Mapping|Beginners Guide To Mapping]]
* [[Legacy:Testing Lab|Testing Lab]] &amp;ndash; Get others to help test your maps
* [[Legacy:Topics On Mapping|Topics On Mapping]]
* [[Legacy:Map Planning|Map Planning]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Map Flow|Map Flow]]

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy Tutorial]]

[[:Category:Legacy To Do]] - Cleanup and revision.
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping Lessons/Functional Map</title>
    <id>2105</id>
    <revision>
      <id>5130</id>
      <timestamp>2006-12-17T17:35:21Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page will teach you how to create an ugly but functional room.

==Making a Cube==
;File &amp;ndash;&gt; New: If you've been fooling around in UnrealEd you'll want to work with a fresh map.

;[[Legacy:Toolbox|Toolbox]] &amp;ndash;&gt; Cube icon: On the left side of the screen there's a toolbar with a bunch of icons.

You'll see a box titled &quot;CubeBuilder&quot;:

[[Image:Legacy_interface-Ed3-CubeBuilder.png|center|The CubeBuilder properties]]

;Enter your size: You can enter in just about anything, but for this tutorial we want a 256x256x256 cube.

;Subtract your space: Just press CTRL+S on your keyboard.

==Lighting==

Now you have a little hollow cube. A &quot;room&quot; for our purposes. But it doesn't look anything like even a basic cube you'd see in Unreal. To fix that, we need some light:

;Add a light actor: Right-click within the dimensions of your cube in any veiw (A 2D view is recommended), then click &quot;Add light here&quot; in the menu that pops up.

;Build the level: Press F8 on your keyboard, and click &quot;Build&quot; in the Build menu that comes up.

==PlayerStart==

Now you have light. Your room now looks like it will in-game, but the game won't know where to put you if you try and play it now. Lastly, we need a PlayerStart:

;Add a PlayerStart: Right-click within the dimensions of your cube in any veiw, then click &quot;Add PlayerStart here&quot; in the menu that pops up.

;Build the level again: Press F8 on your keyboard, and click &quot;Build&quot; in the Build menu that comes up.

Now you have a finished level. Save it (File -&gt; Save) with a DM- prefix just like any other Deathmatch level, then play (Build -&gt; Play Level).

----

Back to [[Legacy:Mapping Lessons|Mapping Lessons]]</text>
    </revision>
    <revision>
      <id>5131</id>
      <timestamp>2003-10-21T02:09:23Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>Reponse</comment>
      <text xml:space="preserve">This page will teach you how to create an ugly but functional room.

==Making a Cube==
;File &amp;ndash;&gt; New: If you've been fooling around in UnrealEd you'll want to work with a fresh map.

;[[Legacy:Toolbox|Toolbox]] &amp;ndash;&gt; Cube icon: On the left side of the screen there's a toolbar with a bunch of icons.

You'll see a box titled &quot;CubeBuilder&quot;:

[[Image:Legacy_interface-Ed3-CubeBuilder.png|center|The CubeBuilder properties]]

;Enter your size: You can enter in just about anything, but for this tutorial we want a 256x256x256 cube.

;Subtract your space: Just press CTRL+S on your keyboard.

==Lighting==

Now you have a little hollow cube. A &quot;room&quot; for our purposes. But it doesn't look anything like even a basic cube you'd see in Unreal. To fix that, we need some light:

;Add a light actor: Right-click within the dimensions of your cube in any veiw (A 2D view is recommended), then click &quot;Add light here&quot; in the menu that pops up.

;Build the level: Press F8 on your keyboard, and click &quot;Build&quot; in the Build menu that comes up.

'''RDGDanClark:''' Can someone confirm the method by which a light (or any actor) is placed when using a 2D viewport? For instance, when placing a light in the overhead 2D view, what determines where in the Z axis the actor actually ends up?

'''MythOpus:''' Ususally, at least for me, the light is put in the center of the brush you placed it in.

'''GRAF1K:''' It is placed at 0 on the z-axis &amp;ndash; the plane the the origin point is on.

==PlayerStart==

Now you have light. Your room now looks like it will in-game, but the game won't know where to put you if you try and play it now. Lastly, we need a PlayerStart:

;Add a PlayerStart: Right-click within the dimensions of your cube in any veiw, then click &quot;Add PlayerStart here&quot; in the menu that pops up.

;Build the level again: Press F8 on your keyboard, and click &quot;Build&quot; in the Build menu that comes up.

Now you have a finished level. Save it (File -&gt; Save) with a DM- prefix just like any other Deathmatch level, then play (Build -&gt; Play Level).

----

Back to [[Legacy:Mapping Lessons|Mapping Lessons]]</text>
    </revision>
    <revision>
      <id>5132</id>
      <timestamp>2003-11-20T17:57:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Tarquin:''' This page will be replaced by the [[Legacy:Mapping Lessons|Mapping Lessons]] sequence.

----

This page will teach you how to create an ugly but functional room.

==Making a Cube==
;File &amp;ndash;&gt; New: If you've been fooling around in UnrealEd you'll want to work with a fresh map.

;[[Legacy:Toolbox|Toolbox]] &amp;ndash;&gt; Cube icon: On the left side of the screen there's a toolbar with a bunch of icons.

You'll see a box titled &quot;CubeBuilder&quot;:

[[Image:Legacy_interface-Ed3-CubeBuilder.png|center|The CubeBuilder properties]]

;Enter your size: You can enter in just about anything, but for this tutorial we want a 256x256x256 cube.

;Subtract your space: Just press CTRL+S on your keyboard.

==Lighting==

Now you have a little hollow cube. A &quot;room&quot; for our purposes. But it doesn't look anything like even a basic cube you'd see in Unreal. To fix that, we need some light:

;Add a light actor: Right-click within the dimensions of your cube in any veiw (A 2D view is recommended), then click &quot;Add light here&quot; in the menu that pops up.

;Build the level: Press F8 on your keyboard, and click &quot;Build&quot; in the Build menu that comes up.

'''RDGDanClark:''' Can someone confirm the method by which a light (or any actor) is placed when using a 2D viewport? For instance, when placing a light in the overhead 2D view, what determines where in the Z axis the actor actually ends up?

'''MythOpus:''' Ususally, at least for me, the light is put in the center of the brush you placed it in.

'''GRAF1K:''' It is placed at 0 on the z-axis &amp;ndash; the plane the the origin point is on.

==PlayerStart==

Now you have light. Your room now looks like it will in-game, but the game won't know where to put you if you try and play it now. Lastly, we need a PlayerStart:

;Add a PlayerStart: Right-click within the dimensions of your cube in any veiw, then click &quot;Add PlayerStart here&quot; in the menu that pops up.

;Build the level again: Press F8 on your keyboard, and click &quot;Build&quot; in the Build menu that comes up.

Now you have a finished level. Save it (File -&gt; Save) with a DM- prefix just like any other Deathmatch level, then play (Build -&gt; Play Level).

----

Back to [[Legacy:Mapping Lessons|Mapping Lessons]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mapping Resources</title>
    <id>1829</id>
    <revision>
      <id>4488</id>
      <timestamp>2003-07-07T14:36:08Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT Topics_On_Mapping</text>
    </revision>
    <revision>
      <id>4489</id>
      <timestamp>2003-05-23T21:42:34Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Beginning Pages ==

{{innerbox| A journey of a thousand pages begins with the first word.

 ''Original: A journey of a thousand miles begins with the first step.''

}}

The Unreal Editor looks like a scary beast.  However, with a bit of patience, a bit of time, and a reasonable amount of practice it can be tamed.  And once you've tamed it, worlds are yours for the creating.

If you are used to using WorldCraft, you are in for a bit of a shock.  The Unreal Editor will seem obtuse, awkward, and just plain contrary.  Once you get used to it however you'll realise that it's outstanding.  Just don't expect it to be an easy ride.

Before we open the editor, lets cover off some basic and fundamental concepts you'll need before you get started.  Trust me, it'll help.

''Note: When opening links, open them up in new windows for more optimised learning.''

===The Prequisites ===

These are the pages you should read before you open the editor.
* The [[Legacy:Unreal World|Unreal World]] &amp;ndash; A basic description of the world Unreal lives in.
* [[Legacy:Unreal Geometry|Unreal Geometry]] &amp;ndash; What Unreal Geometry is.
* [[Legacy:BSP|BSP]] &amp;ndash; What bsp is and what it does.
* [[Legacy:CSG|CSG]] &amp;ndash; Constructive Solid Geometry, a map creators tools.
* [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]] &amp;ndash; needs a name change and a rewrite.
* [[Legacy:Beginners Guide To Mapping|Beginners Guide To Mapping]] &amp;ndash; Self Explanatory
* [[Legacy:Welcome To UnrealEd|Welcome To UnrealEd]] &amp;ndash; Welcoming
* [[Legacy:UnrealEd Beginner FAQ|UnrealEd Beginner FAQ]] &amp;ndash; A faq on unreal ed, great for beginners.
* [[Legacy:Crashing UnrealEd|Crashing UnrealEd]] &amp;ndash; How to crash, or avoid, crashing unrealed
* [[Legacy:Package|Package]] &amp;ndash; What each package is and holds
* [[Legacy:Map Planning|Map Planning]] &amp;ndash; An esential part of mapping that you do ''before'' opening up UnrealEd. It is required to create ''superb'' maps.

Now that you at least have a vague idea about the environment you are going to be working in it's time to have a look at the editor, and find out how to use it.

====Old School to New School ====

Moving from [[Legacy:UT|UT]] to [[Legacy:UT2003|UT2003]]? Here is your chance to see what changes from Unreal Tournament to Unreal Tornament 2003!
* [[Legacy:New Features In UT2003|New Features In UT2003]]
* [[Legacy:New UnrealScript In UT2003|New UnrealScript in UT2003]]
* [[Legacy:New UnrealEd Interface In UT2003|New UnrealEd Interface in UT2003]]

===Getting around in the editor ===
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]
* The [[Legacy:Toolbar|Toolbar]] &amp;ndash; An explanation of the icons at the top.
* The [[Legacy:Toolbox|Toolbox]] &amp;ndash; An explanation of the icons at the left.

* Understanding [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s
* [[Legacy:Mouse Control|Mouse Control]] &amp;ndash; Getting around in the Unreal Editor and basic interaction.

===Crafting and mapping the map or level ===

All building starts with the [[Legacy:Red Builder Brush|red builder brush]]. This is in a way a 3D cursor, which the mapper shapes and edits before using it to imprint a new [[Legacy:Brush|Brush]] on the world. 

The red bruilder brush can be given new shapes with:
* [[Legacy:Brushbuilders|Brushbuilders]], [[Legacy:Brushbuilder|Brushbuilder]], the standard brush shapes in the [[Legacy:Toolbox|toolbox]]
** [[Legacy:Custom Brushbuilder|Custom Brushbuilder]] &amp;ndash; Custom brushbuilders made by mappers and some scripters
*** [[Legacy:Scripting Custom Brushbuilders|Scripting Custom Brushbuilders]] &amp;ndash; How to script custom brushbuilders.
* [[Legacy:2D Shape Editor|2D Shape Editor]], a simple &amp; powerful tool for making more complex shapes

Once you have a basic shape, it can be edited with the following techniques:
* [[Legacy:Intersect|Intersect]]ion and Deintersection
* [[Legacy:Brush Clipping|Brush Clipping]] 
* [[Legacy:Vertex Editing|Vertex Editing]] 
* [[Legacy:Brush Transformation|Brush Transformation]]
* [[Legacy:PolyBrush Basics|Combining Brushes]]

Brush shapes can be saved to disk and reused in other maps:
* [[Legacy:Brush Exporting And Importing|Brush Exporting And Importing]]

These were from the links in the bottom:
* [[Legacy:Subtraction And Addition|Subtraction And Addition]]
* [[Legacy:Brush Sinking|Brush Sinking]]
* [[Legacy:Brush Order|Brush Order]]
* The [[Legacy:Build|Build]] process
* [[Legacy:Brush Duplication|Brush Duplication]] (more of an interface thing but here for now)

===Building Your First Basic Level ===

''This is the unreal editor's Hello World''

All of the fundamental actions used in creating the levels below (and then a few more) are covered from [[:Category:Legacy Basic Procedure]].  If you can't remember how to add some glass or create a lift then check there &amp;ndash; it will be quicker than scanning through the tutorials.  If you are completely new to all of this then don't worry.  The tutorials reference the appropriate procedures when needed.
* [[Legacy:Create A Room|Create a room]] &amp;ndash; Prequisite that you should go through before making DM-Quadroid.
* [[Legacy:Creating DM-Quadroid|Creating DM-Quadroid]] &amp;ndash; Building a simple UT deathmatch level.  No matter how simple it still requires effort. ''In progress''
* [[Legacy:Map Ideas|Map Ideas]] &amp;ndash; Use these to get inspiration for making maps.

===Mapping for &lt;Insert [[Legacy:Gametype|Gametype]] Here&gt; ===

These pages exibit info, thoughts, and theory about mapping for the following gametypes. You must read the beginning ones first and the end ones last to have a feel of mapping for them before mapping.
* [[Legacy:Mapping For AS|Mapping for AS]] &amp;ndash; Assault
* [[Legacy:Mapping For BR|Mapping for BR]] &amp;ndash; Boming Run
* [[Legacy:Mapping For CTF|Mapping For CTF]] &amp;ndash; Capture the Flag
* [[Legacy:Mapping For One Flag Capture|Mapping For One Flag Capture]] &amp;ndash; Read the mapping for CTF page first before reading this page.
* [[Legacy:Mapping For DM|Mapping For DM]] &amp;ndash; Deathmatch
* [[Legacy:Mapping For DOM|Mapping For DOM]] &amp;ndash; Domination
* [[Legacy:Mapping For DDOM|Mapping for DDOM]] &amp;ndash; Double Domination
* [[Legacy:Mapping For FEBA|Mapping for FEBA]] &amp;ndash; Forward Edge Battle Area
* [[Legacy:Mapping For Jailbreak|Mapping for Jailbreak]] &amp;ndash; self explanitory
* [[Legacy:Mapping For King Of The Hill|Mapping for King Of The Hill]] &amp;ndash; self explanitory
* [[Legacy:Mapping For MCTF|Mapping for MCTF]] &amp;ndash; Multi Capture the Flag
* [[Legacy:Mapping For Monster Hunt|Mapping for Monster Hunt]] &amp;ndash; self explanitory
* [[Legacy:Mapping For RocketArena|Mapping for RocketArena]] &amp;ndash; self explanitory
* [[Legacy:Mapping For TTR|Mapping for TTR]] &amp;ndash; The Third Reich
* [[Legacy:Mapping For Unreal SinglePlayer|Mapping For Unreal SinglePlayer]] &amp;ndash; self explanitory
* [[Legacy:Mapping For Unreal Coop|Mapping For Unreal Coop]] &amp;ndash; self explanitory
* [[Legacy:Mapping For UnrealFortress|Mapping for UnrealFortress]] &amp;ndash; self explanitory

===Flow and Design ===

You should also read these to learn how to make your level flow better.
* [[Legacy:Map Flow|Map Flow]]
* [[Legacy:Map Design|Map Design]]
* [[Legacy:Placing PlayerStart|Placing PlayerStart]]s
* [[Legacy:Weapon Placement|Weapon Placement]]
* [[Legacy:Inventory Item Placement|Inventory Item Placement]]
* [[Legacy:Z-Axis|Z-Axis]] discusses good use of height and levels within a map.
* see also [[Legacy:Gametype|Gametype]] for gametype-specific things on flow and placement.
* [[Legacy:Adding Polish To Maps|Adding Polish To Maps]]
* [[Legacy:Making_Architecture|Making_Architecture]]
* [[:Category:Legacy Basic Procedure]]

==Mapping areas ==

The following are a list of links and descriptions about the different mapping areas, such as pathing, lighting, etc.

===Actor ===
* UT 2003
** [[Legacy:Actor|Actor]]
** [[Legacy:Actor/Advanced|Actor/Advanced]]
** [[Legacy:Actor/Collision|Actor/Collision]]
** [[Legacy:Actor/Display|Actor/Display]]
** [[Legacy:Actor/Events|Actor/Events]]
** [[Legacy:Actor/Force|Actor/Force]]
** [[Legacy:Actor/Karma|Actor/Karma]]
** [[Legacy:Actor/LightColor|Actor/LightColor]]
** [[Legacy:Actor/Lighting|Actor/Lighting]]
** [[Legacy:Actor/Movement|Actor/Movement]]
** [[Legacy:Actor/Object|Actor/Object]]
** [[Legacy:Actor/Sound|Actor/Sound]]
* UT
** [[Legacy:Actor (UT)|Actor (UT)]]
** [[Legacy:Actor (UT)/Advanced|Actor (UT)/Advanced]]
** [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]]
** [[Legacy:Actor (UT)/Display|Actor (UT)/Display]]
** [[Legacy:Actor (UT)/Events|Actor (UT)/Events]]
** [[Legacy:Actor (UT)/Filter|Actor (UT)/Filter]]
** [[Legacy:Actor (UT)/Lighting|Actor (UT)/Lighting]]
** [[Legacy:Actor (UT)/Movement|Actor (UT)/Movement]]
** [[Legacy:Actor (UT)/Networking|Actor (UT)/Networking]]
** [[Legacy:Actor (UT)/Object|Actor (UT)/Object]]
** [[Legacy:Actor (UT)/Sound|Actor (UT)/Sound]]

===Architectural features ===

Techniques for making complex architexture.
* [[Legacy:Making Architecture|Making Architecture]]
* [[Legacy:Making Curved Corridors|Making Curved Corridors]]
* [[Legacy:Making Stairs|Making Stairs]]
* [[Legacy:Making Terrain (UT)|Making Terrain (UT)]] 
* [[Legacy:Making Arches|Making Arches]]
* [[Legacy:Making Trim|Making Trim]]
* [[Legacy:Making Trim With The Extruder|Making Trim with the Extruder]]
* [[Legacy:Making Flames|Making Flames]]
* [[Legacy:Decoration|Decoration]]s and [[Legacy:Mesh|Mesh]]es
* [http://planetunreal.com/phalanx/tut's/tutorial_geo.htm Architecture] tutorial by Hourences.

===Dynamics / Effects / Realisticness / etc. ===
* Teleportation
** [[Legacy:Teleportation Basics|Teleportation Basics]]
** [[Legacy:Teleporters As In CTF-Face|Teleporters As In CTF-Face]]
* Exploding Stuff
** [[Legacy:Landmines|Landmines]]
** [[Legacy:Laser Trip Bomb|Laser Trip Bomb]]
* Liquids and Water
** [[Legacy:Liquid Basics|Liquid Basics]]: Making Water, Lava, Slime etc
** [[Legacy:Rising Water|Rising Water]]: Rising water
** [[Legacy:Rising Water (UT2k3)|Rising Water (UT2k3)]]: Rising water in Unreal Tournament 2003
** [[Legacy:Fluid Surfaces|Fluid Surfaces]]
** [[Legacy:Making Water|Making water]]
*** [[Legacy:Making Waterfalls|Making waterfalls]]
** [[Legacy:XProcMesh|xProcMesh]]
* Natural
** [[Legacy:Building An Outside Area|Building an outside area]]
** [[Legacy:SkyBox|SkyBox]] &amp; [[Legacy:Building A SkyBox|Building a SkyBox]]
* Windows and Fans
** [[Legacy:Glass|Glass]]
** [[Legacy:Making Windows With UT2k3|Making Windows With UT2k3]]
** [[Legacy:Deadly Fan|Deadly Fan]]
** [[Legacy:Floater Fan|Floater Fan]]
* Miscellaneous
** [[Legacy:Blood Effects|Blood Effects]]
** [http://darendash.home.attbi.com/AdvancedLightning.html Electrical Storms]
** [http://darendash.home.attbi.com/CycloneTutorial.html Cyclones/Whirlpools]
** [http://darendash.home.attbi.com/PortalTutorial.html Bent Space &amp; Escher Worlds]
** [[Legacy:Making An Interpolation Path|Making an Interpolation Path]] &amp;ndash; How to set up the camera for your own UT cutscene
* Moving Parts (Movers)
** [[Legacy:Create A Mover|Create A Mover]]: a basic tutorial
** [[Legacy:Making Doors|Making doors]]
** [[Legacy:Making Lifts|Making lifts]]
** Futher reading: [[Legacy:Mover Topics|Mover Topics]]
*Triggers
** Adding Interactivity with [[Legacy:Triggers (UT)|Triggers (UT)]]
** Advanced interactivity with [[Legacy:Trigger Systems|Trigger Systems]]
* Emitting Devices
** [[Legacy:ParticleEmitter|ParticleEmitter]]
** [[Legacy:Emitter|Emitter]]
*** [[Legacy:ParticleEmitter Cookbook|ParticleEmitter Cookbook]]
** [[Legacy:XEmitter|xEmitter]]

==Lighting ==
* How Rooms are Lit: [[Legacy:Lighting|Lighting]] topics.
** [[Legacy:Corona|Corona]] &amp;ndash; often (incorrectly) referred to as [[Legacy:Lens Flare|lens flare]]s
** [[Legacy:Shadows|Shadows]]
* [[Legacy:Fog|Fog]]
* [[Legacy:Movable Lights|Movable Lights]]
* [[Legacy:Lightmap Errors|Lightmap Errors]]
* [[Legacy:Light|Light]]
* [[Legacy:Colors|Colors]]
* [http://planetunreal.com/phalanx/tut's/tutorial_vertex.htm Vertex Lighting] tutorial by Hourences.

===Pathing ===
* [[Legacy:Pathnoding|Pathnoding]]
* [[Legacy:Pathnoding Lifts|Pathnoding Lifts]]
* [[Legacy:Strategic Bots|Strategic Bots]]: DefensePoints, Sniping
* [[Legacy:Smart Bots|Smart Bots]]: Translocation, etc.
* ScriptedPawns (Monsters)
** [[Legacy:AlarmPoint|AlarmPoint]]
** [[Legacy:Orders|Orders]]
** [[Legacy:General Scripted Sequences|General scripted sequences]]
** [[Legacy:Setting Up CreatureFactories|Setting up CreatureFactories]] 

===Sounds ===
* Adding [[Legacy:Sounds|Sounds]]
* [http://planetunreal.com/phalanx/tut's/tutorial_sound.htm Sound] tutorial written by Hourences.

===Static Meshes ===
* [[Legacy:Static Mesh|Static Mesh]]
* [[Legacy:Mapping With Static Meshes|Mapping With Static Meshes]] (needs work)
* [[Legacy:Static Mesh Modelling|Static Mesh Modelling]]
* [[Legacy:Static Mesh Package|Static Mesh Package]]
* [[Legacy:Static Mesh Ideas|Static Mesh Ideas]]

===Techniques / Troubleshooting / Documents ===
* [[Legacy:Actor Overview|Actor Overview]] &amp;ndash; adding actors and setting their properties
* [[Legacy:Preflight Steps|Preflight Steps]]
* [[Legacy:Playtest|Playtest]]
* [[Legacy:Embedding Code|Embedding Code]] or other packages into your map
* [[Legacy:Using The Console|Using the Console]] &amp;ndash; Getting at some additional functionality using the console.
* [[Legacy:Brush Rotate|Gimbal lock]] or, why rotation in UnrealEd doesn't always do what you want it to.
* [[Legacy:General Scale And Dimensions|General Scale and Dimensions]]
* The [[Legacy:Snap To Grid|Snap to Grid]] feature
* [[Legacy:UnrealEd Tips|UnrealEd tips]]: add any general tips here for now!
* [[Legacy:Break The Hierarchy|break the Hierarchy]] will write about this later...  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 
* [[:Category:Legacy Basic Procedure]]
* [[Legacy:MyLevel|MyLevel]] Package
* [[Legacy:Mapping Tips|Mapping Tips]]
* Make sure you've done everything on [[Legacy:Mapping Checklist|Mapping Checklist]]  before releasing a map

===Terrain ===
* [[Legacy:Terrain|Terrain]] &amp;ndash; Making Landscapes
** [[Legacy:Creating A Terrain|Creating A Terrain]]
** [[Legacy:Terrain Mode|Terrain Mode]]
** [[Legacy:Quick UT2003 Terrain|Quick UT2003 Terrain]]
** [[Legacy:Using The Terrain Tool|Using The Terrain Tool]]

===Texturing ===
* [[Legacy:Decorating Rooms With Textures|Decorating Rooms with Textures]]
* [[Legacy:Texture Topics|Texture Topics]]
** [[Legacy:Texture Import And Export|Texture Import And Export]]
** [[Legacy:Dynamic Texture|Dynamic Texture]]
*** [[Legacy:Animated Texture|Animated Texture]]
** [[Legacy:3D Studio Max Advanced Texturing|3D Studio Max Advanced Texturing]] &amp;ndash; How to skin that terrain or align the textures on your sphere
* [[Legacy:Texture Effects|masked textures]]
* [[Legacy:Import The Texture|Import The Texture]]
* [[Legacy:Texture Import And Export|Texture Import And Export]]

===Zoning / Volumes / Optimization ===
* Zone Your World: [[Legacy:Zoning|Zoning]] , [[Legacy:Zoning (UT)|Zoning (UT)]]
* [[Legacy:ZoneInfo|ZoneInfo]]
* [[Legacy:WarpZoneInfo|WarpZoneInfo]] &amp;ndash; also (confusingly) called portals
* [[Legacy:Gravity, Warp Tunnels|Gravity, Warp Tunnels]]
* [[Legacy:Zone|Zone]]
* [[Legacy:BlockAll|BlockAll]] and [[Legacy:BlockPlayer|BlockPlayer]]
* [[Legacy:Solidity|Solidity]]
* [[Legacy:Invisible Collision Hull|Invisible Collision Hull]]
* [[Legacy:Antiportal|Antiportal]]
* [[Legacy:Map Optimization|Map Optimization]]
* [[Legacy:Volume|Volume]]

==Comments ==

'''Mosquito:''' First, yes it's too big.  Second, this needs to be renamed to [[Legacy:Mapping|Mapping]]!! :shocked:

'''ZxAnPhOrIaN:''' I aggree that this page has to be renamed and/or redirected to [[Legacy:Mapping|Mapping]]. Maybe we can do that same technique that tarq has done in the [[Legacy:Brushbuilders|Brushbuilders]] page to this page to make it smaller and easier to navigate.

'''Mosquito:''' There is no main mapping page.  And this page needs to be it.  You'll need to change some of the headings around and call them something different (EG. Mapping areas.... That needs to be different.)

'''ZxAnPhOrIaN:''' More user friendly, maybe?

'''Mosquito:''' Yes, I have a good idea of what needs to be done.  I'll tell you when we can talk in real time.

==Related Links ==
* [[Legacy:Architecture|Architecture]]
* [[Legacy:CSG|CSG]] [[Legacy:CSG Architecture|Architecture]]
* [[Legacy:Static Mesh|Static mesh]]es.
* [[Legacy:Mapping Lessons|Mapping Lessons]]
* [[Legacy:Map Ideas|Map Ideas]]

----

[[:Category:Legacy To Do]]

See [[Legacy:Home Page/Discuss|Home Page/Discuss]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4490</id>
      <timestamp>2003-07-07T14:35:43Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT Topics On Mapping</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MarZer</title>
    <id>2188</id>
    <revision>
      <id>5305</id>
      <timestamp>2004-09-11T09:05:53Z</timestamp>
      <contributor>
        <ip>MarZer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hooray. About damn time I got my aught onto the Wiki. Hi guys!

===MarZer's random stuff===

====Introduction====

I'm MarZer. I began mapping when I was about 12 years old with Quake II (I'm 17 now), and have since been playing with various forms of modding. I'm mostly a mapper but have recently dipped my toes into that great big puddle that is unrealscripting. I'm the creator of DWeather for UT2004, which is a mapper's utility that allows them to add dynamically-controlled weather and environmental effects to their maps. I will eventually put something on here about it, but for now I have homework to do :(

====My Creations====

[http://www.marzerium.com/MarZer/DWeather/ DWeather for UT2004]

[http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=405515 AS-MZ-HighRise, ONS-MZ-ViperLake, ONS-MZ-RaptorSkies]

====Plans====

Currently the only real project I have going is DWeather. It is an on-going thing that is proving to be a valuable learning experience (this is the first thing I have EVER coded :P). I am also a part of LeoPawnz' Invasion Bonus Pack 2004, but I am not mapping for it at the moment because my contribution to it IS DWeather. I am always looking for the odd bit of help here and there with DWeather (particularly with netcode!) so if any of you skilled coders want to lend a hand dont hesitate to speak up! 

The biggest target on my list is getting all the various DWeather actors linked together in some sort of system. At the moment the only things that are linked to some degree are the lightning and the lightning target actors. The eventual plan is to have just one actor you place (or maybe multiples of the same master actor) that would have a heap of settings like the environment type, weather system type, time of day, length of day, wind direction etc and every thing would be dynamically generated off of that. So, with one of these 'Weather Controllers' in a map, you could set it to be stormy and it would spawn some clouds. The clouds would roughly follow the wind direction and speed. If a few clouds came in close proximity with each other, they would darken and eventually they would thunder and shortly after produce lightning. The lightning would cause some fires where it struck. Wether or not it rains would be up to chance, and if it does those fires will be put out by the rain. The rain would stop... something else random would happen... ad infinitum. Sounds tricky doesn't it? 

11/09/04: DWeather now has a meteor spawner that spawns meteors that fall at random angles, at random intervals.

====Sitting around the campfire...====

I have a whole bunch of really useful custom actors for mappers to use that don't in any way pertain to DWeather. I am thinking of renaming it to Mapper's Tools or something and putting them all in there. Some of these include an enhanced assault roundend trigger that fires off an event when the round is finished, useful for taking care of something that needs doing right at the end of the round. There are a whole bunch of others too. What do you think?

'''GRAFIK:''' Most likely you have 100% wide edit area turned on in your Preferences. Or does &quot;Damn this text input box thinger is buggy :S&quot; refer to another problem?

'''MarZer:''' Ahhhh. Nice. Yes, that was the problem. The input box would be the width of the window but as soon as I edited the contents in some way the border of it would shoot out of the screen. Fixed now, cheers. */me Wiki n00b*</text>
    </revision>
    <revision>
      <id>5306</id>
      <timestamp>2004-09-09T16:53:43Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Hooray. About damn time I got my aught onto the Wiki. Hi guys!

===MarZer's random stuff===

====Introduction====

I'm MarZer. I began mapping when I was about 12 years old with Quake II (I'm 17 now), and have since been playing with various forms of modding. I'm mostly a mapper but have recently dipped my toes into that great big puddle that is unrealscripting. I'm the creator of DWeather for UT2004, which is a mapper's utility that allows them to add dynamically-controlled weather and environmental effects to their maps. I will eventually put something on here about it, but for now I have homework to do :(

====My Creations====

[http://www.marzerium.com/MarZer/DWeather/ DWeather for UT2004]

[http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=405515 AS-MZ-HighRise, ONS-MZ-ViperLake, ONS-MZ-RaptorSkies]

====Plans====

Currently the only real project I have going is DWeather. It is an on-going thing that is proving to be a valuable learning experience (this is the first thing I have EVER coded :P). I am also a part of LeoPawnz' Invasion Bonus Pack 2004, but I am not mapping for it at the moment because my contribution to it IS DWeather. I am always looking for the odd bit of help here and there with DWeather (particularly with netcode!) so if any of you skilled coders want to lend a hand dont hesitate to speak up! 

The biggest target on my list is getting all the various DWeather actors linked together in some sort of system. At the moment the only things that are linked to some degree are the lightning and the lightning target actors. The eventual plan is to have just one actor you place (or maybe multiples of the same master actor) that would have a heap of settings like the environment type, weather system type, time of day, length of day, wind direction etc and every thing would be dynamically generated off of that. So, with one of these 'Weather Controllers' in a map, you could set it to be stormy and it would spawn some clouds. The clouds would roughly follow the wind direction and speed. If a few clouds came in close proximity with each other, they would darken and eventually they would thunder and shortly after produce lightning. The lightning would cause some fires where it struck. Wether or not it rains would be up to chance, and if it does those fires will be put out by the rain. The rain would stop... something else random would happen... ad infinitum. Sounds tricky doesn't it? 

====Sitting around the campfire...====

Damn this text input box thinger is buggy :S

I have a whole bunch of really useful custom actors for mappers to use that don't in any way pertain to DWeather. I am thinking of renaming it to Mapper's Tools or something and putting them all in there. Some of these include an enhanced assault roundend trigger that fires off an event when the round is finished, useful for taking care of something that needs doing right at the end of the round. There are a whole bunch of others too. What do you think?

'''GRAFIK:''' Most likely you have 100% wide edit area turned on in your Preferences. Or does &quot;Damn this text input box thinger is buggy :S&quot; refer to another problem?</text>
    </revision>
    <revision>
      <id>5307</id>
      <timestamp>2004-09-09T22:44:04Z</timestamp>
      <contributor>
        <ip>MarZer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hooray. About damn time I got my aught onto the Wiki. Hi guys!

===MarZer's random stuff===

====Introduction====

I'm MarZer. I began mapping when I was about 12 years old with Quake II (I'm 17 now), and have since been playing with various forms of modding. I'm mostly a mapper but have recently dipped my toes into that great big puddle that is unrealscripting. I'm the creator of DWeather for UT2004, which is a mapper's utility that allows them to add dynamically-controlled weather and environmental effects to their maps. I will eventually put something on here about it, but for now I have homework to do :(

====My Creations====

[http://www.marzerium.com/MarZer/DWeather/ DWeather for UT2004]

[http://www.ataricommunity.com/forums/showthread.php?s=&amp;threadid=405515 AS-MZ-HighRise, ONS-MZ-ViperLake, ONS-MZ-RaptorSkies]

====Plans====

Currently the only real project I have going is DWeather. It is an on-going thing that is proving to be a valuable learning experience (this is the first thing I have EVER coded :P). I am also a part of LeoPawnz' Invasion Bonus Pack 2004, but I am not mapping for it at the moment because my contribution to it IS DWeather. I am always looking for the odd bit of help here and there with DWeather (particularly with netcode!) so if any of you skilled coders want to lend a hand dont hesitate to speak up! 

The biggest target on my list is getting all the various DWeather actors linked together in some sort of system. At the moment the only things that are linked to some degree are the lightning and the lightning target actors. The eventual plan is to have just one actor you place (or maybe multiples of the same master actor) that would have a heap of settings like the environment type, weather system type, time of day, length of day, wind direction etc and every thing would be dynamically generated off of that. So, with one of these 'Weather Controllers' in a map, you could set it to be stormy and it would spawn some clouds. The clouds would roughly follow the wind direction and speed. If a few clouds came in close proximity with each other, they would darken and eventually they would thunder and shortly after produce lightning. The lightning would cause some fires where it struck. Wether or not it rains would be up to chance, and if it does those fires will be put out by the rain. The rain would stop... something else random would happen... ad infinitum. Sounds tricky doesn't it? 

====Sitting around the campfire...====

Damn this text input box thinger is buggy :S

I have a whole bunch of really useful custom actors for mappers to use that don't in any way pertain to DWeather. I am thinking of renaming it to Mapper's Tools or something and putting them all in there. Some of these include an enhanced assault roundend trigger that fires off an event when the round is finished, useful for taking care of something that needs doing right at the end of the round. There are a whole bunch of others too. What do you think?

'''GRAFIK:''' Most likely you have 100% wide edit area turned on in your Preferences. Or does &quot;Damn this text input box thinger is buggy :S&quot; refer to another problem?

'''MarZer:''' Ahhhh. Nice. Yes, that was the problem. The input box would be the width of the window but as soon as I edited the contents in some way the border of it would shoot out of the screen. Fixed now, cheers. */me Wiki n00b*</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MarZer/Assault</title>
    <id>2189</id>
    <revision>
      <id>5308</id>
      <timestamp>2004-09-21T04:40:02Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===MarZer's Assault Mapping Tips===

Recently, while helping PointlesS with his Assault map AS-CityInvasion, I realised that many mappers are having trouble mapping for Assault. Having completed a fully-pathed and co-ordinated Assault map myself I'm pretty well-versed in the subject. As such, I'm posting a bunch of random Assault Mapping tips (most of which I gave to PointlesS) for mappers to use as a reference:

====General Assault Pathing====

First things first: NEVER use the autodoor/door actors. They are complete ****. Use 2 pathnodes and force a path between them accross the door. I have noticed bots often get confused when Door/AutoDoors are used.

For every single vehicle path you have, try to have about 3 normal paths nearby. This is good for two reasons: bots on foot will attack/defend from different directions and if the vehicle gets off track, it can use the normal paths to find it's way back.

BlockedPaths, ForcedPaths and ProscribedPaths are your friend. Sometimes, bots just need to be forced:

'''''ForcedPaths''''': Even if the editor doesn't make a link, you can force it yourcelf by first finding out the name of the node you want the path to (Properties -&gt; Object -&gt; Name), then selecting the node you want to make the link from and going to it's properties. Here, go to the Navigation group and head down to ForcedPaths. In the first item in the list, add the name of the pathnode you are forcing a link to. The next time you rebuild there will be a yellow line between the two nodes. This is one-way. To have it two way like a normal link, do the same thing, starting with the second node and linking back to the first.

'''''ProscribedPaths''''': Set them up exactly like ForcedPaths, but they tell bots that they SHOULD NOT take this path, no matter what. This is useful as sometimes bots keep taking some stupid route and end up stuck, confused etc.. When you Rebuild, they will be red paths.

'''''BlockedPaths''''': Sometimes you want bots to follow a path until something happens (a door closes, something falls in the path). This is what blockedpaths are for. Say you have a blast door that is shut and opens when a particular objective is completed. Put a BlockedPath in front of it then make sure that its bBlockedPath property (or whatever it is called) under Navigation is set to true. Seeing as though you will already have nodes on the other side of the door, force a path from the blocked path to one of the nodes on the other side (and back again). Set the tag of the BlockedPath to whatever event opens the door, and when it is triggered (when the door opens), the bBlockedPath property will be toggled to false which lets bots know they can now go down that route.

====Vehicle Assault Pathing ====

ANY objective that requires the bots to use a vehicle, even if it is not mission-critical, should be given a VehiclePathName. You may have noticed this property before, here's how to use it: 

In the GameObjective group of the objective, there is the VehiclePathName field. Here, you enter the name of the ''vehicle-accessible pathnode closest to the objective they should be trying to reach''.

Another thing about vehicle pathing: When vehicle Assault mapping, remember ANY navigation points can be used by vehicles as long as bVehicleDestination (under Navigation) is true. In fact, you don't even need RoadPathNodes at all. The only benefit of using those over normal PathNodes is the distance they link over.

Vehicle paths should be as simple as possible: try to keep them as curves as opposed to sharp bends. The reason is this: If you have an L-shaped bend with one pathnode, it looks like an L to the bots. They don't slow down for it and generally crash. If you use a lot of pathnodes close together to round off the corner (say, 5 pathnodes, 300 Unreal Units apart in a curve, making up the corner), the bots will better judge the corner and slow down.

Defensive bots will not use their vehicles unless they see an enemy to attack with. Not by default. It is turned off in the vehicle code. Turning it back on is a simple matter of adding a few lines and saving it in myLevel. These scripts are used in AS-Confexia.

====AI Scripts====

The AI scripts system is bugged. I noticed this early in the making of HighRise. Here is the way it works:

In an Assault map, '''EVERY''' AI SCRIPT IN THE MAP &lt;u&gt;MUST&lt;/u&gt; be linked to an objective. The AI in UT2004 is very intelligent, but not intelligent enough to be able to decipher a mapper's random tags and events :p 

You do this: The group of AI scripts you want defenders to use when they defend an objective you give the same tag to. MyTag. Then in the properties of the objective they are to defend, go to the GameObjective group. Look for the DefenseScriptTags field. Enter MyTag (subbing in your actual tag obviously). The bots will now know what to do come that objective.

This must be done for every single AI script in the level, there cannot be one single one that is not attached to an objective of some kind or ALL OF THEM WILL FAIL.

====Optimization====

'''''Fog''''': No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. 

'''''StaticMesh CullDistance''''' '''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

'''''Checkpoints''''': Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

'''''Doors''''': Make an antiportal that is the same size of your door but a bit narrower. Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

'''''Hiding Areas''''': When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

'''''AntiPortal size''''': Remember, one big antiportal is always better than lots of little ones. Always.

'''''Zoning''''': Try to place ZonePortals in a place where they wont be seen that often. This causes the other zones to be rendered less often.

That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!)

==Discussion==

'''Graphik:''' Before you link to this page on [[Legacy:Gametype|Gametype]]:

If you desire this page to be part of the 'public domain', please create a new page for it not subpaged from your personal page. Anything on or below your personal page is considered just that: personal.

Additionally, a bit of cleanup is in order. If you move this content to a different page as mentioned above I'll do the cleanup for you if you like.</text>
    </revision>
    <revision>
      <id>5309</id>
      <timestamp>2004-09-21T02:55:59Z</timestamp>
      <contributor>
        <ip>MarZer</ip>
      </contributor>
      <comment>Posted my Assault Mapping Tips page</comment>
      <text xml:space="preserve">===MarZer's Assault Mapping Tips===

Recently, while helping PointlesS with his Assault map AS-CityInvasion, I realised that many mappers are having trouble mapping for Assault. Having completed a fully-pathed and co-ordinated Assault map myself I'm pretty well-versed in the subject. As such, I'm posting a bunch of random Assault Mapping tips (most of which I gave to PointlesS) for mappers to use as a reference:

====General Assault Pathing====

First things first: NEVER use the autodoor/door actors. They are complete ****. Use 2 pathnodes and force a path between them accross the door. I have noticed bots often get confused when Door/AutoDoors are used.

For every single vehicle path you have, try to have about 3 normal paths nearby. This is good for two reasons: bots on foot will attack/defend from different directions and if the vehicle gets off track, it can use the normal paths to find it's way back.

BlockedPaths, ForcedPaths and ProscribedPaths are your friend. Sometimes, bots just need to be forced:

'''''ForcedPaths''''': Even if the editor doesn't make a link, you can force it yourcelf by first finding out the name of the node you want the path to (Properties -&gt; Object -&gt; Name), then selecting the node you want to make the link from and going to it's properties. Here, go to the Navigation group and head down to ForcedPaths. In the first item in the list, add the name of the pathnode you are forcing a link to. The next time you rebuild there will be a yellow line between the two nodes. This is one-way. To have it two way like a normal link, do the same thing, starting with the second node and linking back to the first.

'''''ProscribedPaths''''': Set them up exactly like ForcedPaths, but they tell bots that they SHOULD NOT take this path, no matter what. This is useful as sometimes bots keep taking some stupid route and end up stuck, confused etc.. When you Rebuild, they will be red paths.

'''''BlockedPaths''''': Sometimes you want bots to follow a path until something happens (a door closes, something falls in the path). This is what blockedpaths are for. Say you have a blast door that is shut and opens when a particular objective is completed. Put a BlockedPath in front of it then make sure that its bBlockedPath property (or whatever it is called) under Navigation is set to true. Seeing as though you will already have nodes on the other side of the door, force a path from the blocked path to one of the nodes on the other side (and back again). Set the tag of the BlockedPath to whatever event opens the door, and when it is triggered (when the door opens), the bBlockedPath property will be toggled to false which lets bots know they can now go down that route.

====Vehicle Assault Pathing ====

ANY objective that requires the bots to use a vehicle, even if it is not mission-critical, should be given a VehiclePathName. You may have noticed this property before, here's how to use it: 

In the GameObjective group of the objective, there is the VehiclePathName field. Here, you enter the name of the ''vehicle-accessible pathnode closest to the objective they should be trying to reach''.

Another thing about vehicle pathing: When vehicle Assault mapping, remember ANY navigation points can be used by vehicles as long as bVehicleDestination (under Navigation) is true. In fact, you don't even need RoadPathNodes at all. The only benefit of using those over normal PathNodes is the distance they link over.

Vehicle paths should be as simple as possible: try to keep them as curves as opposed to sharp bends. The reason is this: If you have an L-shaped bend with one pathnode, it looks like an L to the bots. They don't slow down for it and generally crash. If you use a lot of pathnodes close together to round off the corner (say, 5 pathnodes, 300 Unreal Units apart in a curve, making up the corner), the bots will better judge the corner and slow down.

Defensive bots will not use their vehicles unless they see an enemy to attack with. Not by default. It is turned off in the vehicle code. Turning it back on is a simple matter of adding a few lines and saving it in myLevel. These scripts are used in AS-Confexia.

====AI Scripts====

The AI scripts system is bugged. I noticed this early in the making of HighRise. Here is the way it works:

In an Assault map, '''EVERY''' AI SCRIPT IN THE MAP &lt;u&gt;MUST&lt;/u&gt; be linked to an objective. The AI in UT2004 is very intelligent, but not intelligent enough to be able to decipher a mapper's random tags and events :p 

You do this: The group of AI scripts you want defenders to use when they defend an objective you give the same tag to. MyTag. Then in the properties of the objective they are to defend, go to the GameObjective group. Look for the DefenseScriptTags field. Enter MyTag (subbing in your actual tag obviously). The bots will now know what to do come that objective.

This must be done for every single AI script in the level, there cannot be one single one that is not attached to an objective of some kind or ALL OF THEM WILL FAIL.

====Optimization====

'''''Fog''''': No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. 

'''''StaticMesh CullDistance''''' '''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

'''''Checkpoints''''': Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

'''''Doors''''': Make an antiportal that is the same size of your door but a bit narrower. Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

'''''Hiding Areas''''': When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

'''''AntiPortal size''''': Remember, one big antiportal is always better than lots of little ones. Always.

'''''Zoning''''': Try to place ZonePortals in a place where they wont be seen that often. This causes the other zones to be rendered less often.

That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!)</text>
    </revision>
    <revision>
      <id>5310</id>
      <timestamp>2004-09-21T04:33:41Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===MarZer's Assault Mapping Tips===

Recently, while helping PointlesS with his Assault map AS-CityInvasion, I realised that many mappers are having trouble mapping for Assault. Having completed a fully-pathed and co-ordinated Assault map myself I'm pretty well-versed in the subject. As such, I'm posting a bunch of random Assault Mapping tips (most of which I gave to PointlesS) for mappers to use as a reference:

====General Assault Pathing====

First things first: NEVER use the autodoor/door actors. They are complete ****. Use 2 pathnodes and force a path between them accross the door. I have noticed bots often get confused when Door/AutoDoors are used.

For every single vehicle path you have, try to have about 3 normal paths nearby. This is good for two reasons: bots on foot will attack/defend from different directions and if the vehicle gets off track, it can use the normal paths to find it's way back.

BlockedPaths, ForcedPaths and ProscribedPaths are your friend. Sometimes, bots just need to be forced:

'''''ForcedPaths''''': Even if the editor doesn't make a link, you can force it yourcelf by first finding out the name of the node you want the path to (Properties -&gt; Object -&gt; Name), then selecting the node you want to make the link from and going to it's properties. Here, go to the Navigation group and head down to ForcedPaths. In the first item in the list, add the name of the pathnode you are forcing a link to. The next time you rebuild there will be a yellow line between the two nodes. This is one-way. To have it two way like a normal link, do the same thing, starting with the second node and linking back to the first.

'''''ProscribedPaths''''': Set them up exactly like ForcedPaths, but they tell bots that they SHOULD NOT take this path, no matter what. This is useful as sometimes bots keep taking some stupid route and end up stuck, confused etc.. When you Rebuild, they will be red paths.

'''''BlockedPaths''''': Sometimes you want bots to follow a path until something happens (a door closes, something falls in the path). This is what blockedpaths are for. Say you have a blast door that is shut and opens when a particular objective is completed. Put a BlockedPath in front of it then make sure that its bBlockedPath property (or whatever it is called) under Navigation is set to true. Seeing as though you will already have nodes on the other side of the door, force a path from the blocked path to one of the nodes on the other side (and back again). Set the tag of the BlockedPath to whatever event opens the door, and when it is triggered (when the door opens), the bBlockedPath property will be toggled to false which lets bots know they can now go down that route.

====Vehicle Assault Pathing ====

ANY objective that requires the bots to use a vehicle, even if it is not mission-critical, should be given a VehiclePathName. You may have noticed this property before, here's how to use it: 

In the GameObjective group of the objective, there is the VehiclePathName field. Here, you enter the name of the ''vehicle-accessible pathnode closest to the objective they should be trying to reach''.

Another thing about vehicle pathing: When vehicle Assault mapping, remember ANY navigation points can be used by vehicles as long as bVehicleDestination (under Navigation) is true. In fact, you don't even need RoadPathNodes at all. The only benefit of using those over normal PathNodes is the distance they link over.

Vehicle paths should be as simple as possible: try to keep them as curves as opposed to sharp bends. The reason is this: If you have an L-shaped bend with one pathnode, it looks like an L to the bots. They don't slow down for it and generally crash. If you use a lot of pathnodes close together to round off the corner (say, 5 pathnodes, 300 Unreal Units apart in a curve, making up the corner), the bots will better judge the corner and slow down.

Defensive bots will not use their vehicles unless they see an enemy to attack with. Not by default. It is turned off in the vehicle code. Turning it back on is a simple matter of adding a few lines and saving it in myLevel. These scripts are used in AS-Confexia.

====AI Scripts====

The AI scripts system is bugged. I noticed this early in the making of HighRise. Here is the way it works:

In an Assault map, '''EVERY''' AI SCRIPT IN THE MAP &lt;u&gt;MUST&lt;/u&gt; be linked to an objective. The AI in UT2004 is very intelligent, but not intelligent enough to be able to decipher a mapper's random tags and events :p 

You do this: The group of AI scripts you want defenders to use when they defend an objective you give the same tag to. MyTag. Then in the properties of the objective they are to defend, go to the GameObjective group. Look for the DefenseScriptTags field. Enter MyTag (subbing in your actual tag obviously). The bots will now know what to do come that objective.

This must be done for every single AI script in the level, there cannot be one single one that is not attached to an objective of some kind or ALL OF THEM WILL FAIL.

====Optimization====

'''''Fog''''': No further than 20000 units for the max distance is sufficient for outside levels, assuming you have antiportals and other optimization methods in place. 

'''''StaticMesh CullDistance''''' '''(Properties -&gt; Display -&gt; CullDistance)''': If you have an indoor Assault Map, there is a good chance you won't be using fog, but there is also a good chance that most of the Static Meshes in the level won't be seen at the same time. By setting the static meshes a CullDistance, they won't be rendered by the engine when they are further away from you than this distance, even if they aren't occluded by fog, AntiPotals or Zones.

'''''Checkpoints''''': Another thing that you can do is have 'checkpoint' areas close off as previous parts of your map become empty (as the mission progresses). This allows you to trigger antiportals to hide these unused inaccessable areas, making rendering much less taxing.

'''''Doors''''': Make an antiportal that is the same size of your door but a bit narrower. Put it over the door. In the properties of the door, go to the Mover group. In AntiPortalTag set it a unique name. Then in the properties of the AntiPortal, go to the Events group and set its Tag the same as what you just entered in the mover's AntiPortalTag. Go to the Movement group and set the AntiPortal's AttachTag to that of the tag of the door. Then go to the Object group (still in the AntiPortal's properties) and set InitialState to TriggerToggle. This will stop whatever is behind the door (line of sight, unless the door is a zone portal as well) being rendered when the door is closed (when the AntiPortal is active and down) but when the door opens the AntiPortal gets turned off and moved out with the door, so it is as if it was never there. When the door shuts again it turns back on. This is very useful if you have a lot of indoor-outdoor areas.

'''''Hiding Areas''''': When you place an AntiPortal it is turned on by default. Triggering it will disable it (provided it's Object -&gt; InitialState property is set to TriggerToggle). You can use a sheet AP to stop rendering of all the behind bits of a map until players can actually get in there, at which point you turn it off.

'''''AntiPortal size''''': Remember, one big antiportal is always better than lots of little ones. Always.

'''''Zoning''''': Try to place ZonePortals in a place where they wont be seen that often. This causes the other zones to be rendered less often.

That is all for now, I hope it helps some people. I will update this later, as well as writing a decent Assault mapping tutorial that gets into the nitty-gritty, evil, nasty bits of it at some point. Feel free to add things to it (hey, this is the Wiki after all!)

'''Graphik:''' The link to this page on [[Legacy:Gametype|Gametype]] didn't really belong there. Firstly, if you'd like to make a page on Assault that is part of the Wiki's 'public domain', you ought to make sure it isn't a subpage of your personal page. Plus, what belongs there is not a tips page but rather a reference page in the style of [[Legacy:Mapping For ONS|Mapping for ONS]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Marduk2</title>
    <id>2243</id>
    <revision>
      <id>5419</id>
      <timestamp>2007-08-10T06:32:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>hi!</comment>
      <text xml:space="preserve">==Marduk2 ==

'''Accomplishments'''

I came up with the ideas for the total conversion mods:

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artillery Towers]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Minions]]

==Guestbook==

'''Wormbo:''' Hi and welcome to the wiki! :D Do you want me to move those subpages of your personal page back to the [[Legacy:Mod Ideas|Mod Ideas]] page?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5420</id>
      <timestamp>2007-08-08T21:27:25Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Marduk2 ==

'''Accomplishments'''

I came up with the ideas for the total conversion mods:

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Artillery Towers]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Minions]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Marduk2/Artillery Towers</title>
    <id>2245</id>
    <revision>
      <id>5423</id>
      <timestamp>2007-08-10T02:19:00Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Artillery Towers ==

Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off [the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a room in the tower will open and a large bomb will appear in the ammo room of the other team, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

==Ammo ==

ammo is distributed from a console in the ammo room, the player walks up to the console and a screen opens up asking what ammo the person wants, the player selects it and then has to wait for the ammo to be created, this varies from ammo to ammo, some taking less than a second, others taking much longer.some ideas for ammo I have:

acid ammo, that burns the tower when it hits it for a while

interceptor ammo, little rockets that try to hit enemy ammo when they are shot out of the mortar

interceptor blocker, attracts all interceptor rockets(see above) in the area, even ones from the team that fired the blocker

umbra bomb, it explodes in midair between the towers and creates a large area of black energy that makes it so that nobody can see what's going on inside the area, designed to provide cover

napalm bomb, when it hits it sprays unlit napalm all over the place, which then ignites soon after

bombshell, basic ammo that makes a small explosion when it hits

scatter bomb, when it's hit by enemy fire it splits into smaller shells that do moderate damage

drone pod, when the pod hits the enemy tower it folds open and releases 3 drones, small robots that can stick to walls and armed with small heat beams, the pod itself doesn't do damage but the drones can if they don't have any players nearby to attack

dud ammo, looks like a random kind of ammo when shot and attracts interceptors but does no damage to towers it hits.

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)

===Interested Scriptors ===

==Discussion ==

'''MythOpus:''' I'd hate to be a bother Marduk but could you perhaps use some formatting to pretty this page up?

'''Marduk:''' sorry, I just started this site so I'm not to good at that.</text>
    </revision>
    <revision>
      <id>5424</id>
      <timestamp>2007-08-08T23:43:07Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Artillery Towers ==

Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off [the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a room in the tower will open and a large bomb will appear in the ammo room of the other team, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

==Ammo ==

ammo is distributed from a console in the ammo room, the player walks up to the console and a screen opens up asking what ammo the person wants, the player selects it and then has to wait for the ammo to be created, this varies from ammo to ammo, some taking less than a second, others taking much longer.some ideas for ammo I have:

acid ammo, that burns the tower when it hits it for a while

interceptor ammo, little rockets that try to hit enemy ammo when they are shot out of the mortar

interceptor blocker, attracts all interceptor rockets(see above) in the area, even ones from the team that fired the blocker

umbra bomb, it explodes in midair between the towers and creates a large area of black energy that makes it so that nobody can see what's going on inside the area, designed to provide cover

napalm bomb, when it hits it sprays unlit napalm all over the place, which then ignites soon after

bombshell, basic ammo that makes a small explosion when it hits

scatter bomb, when it's hit by enemy fire it splits into smaller shells that do moderate damage

drone pod, when the pod hits the enemy tower it folds open and releases 3 drones, small robots that can stick to walls and armed with small heat beams, the pod itself doesn't do damage but the drones can if they don't have any players nearby to attack

dud ammo, looks like a random kind of ammo when shot and attracts interceptors but does no damage to towers it hits.

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)

'''MythOpus:''' I'd hate to be a bother Marduk but could you perhaps use some formatting to pretty this page up?

'''Marduk:''' sorry, I just started this site so I'm not to good at that.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Marduk2/Minions</title>
    <id>2244</id>
    <revision>
      <id>5421</id>
      <timestamp>2007-08-10T02:20:00Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Minions ==

==Description ==

Minions is a team-based multiplayer game. There are 2 teams, both of which are led by a Summoner who acts like a commander and orchestrates their attacks. The rest of the players are Minions, who are various monsters that act out(or not) the Summoners plan. The summoner is chosen at random(if set at random) and the rest of the players are split up evenly. Then the Minions choose their type and when everyone is decided, or the timers runs out the game begins.

==Objective and Gameplay ==

'''Summoner'''

The summoner is a medium speed human player who has a larger minimap and can see all of his team's players wherever they are on the map. The summoner only has one objective, to survive the opponent's Minions until his Minions can kill the other Summoner. The summoner has an area of healing around him that heals his own Minions and can use his staff to hurt opposing Minions in a pinch and can also place down an altar where Minions can respawn. The summoner can speak to all of his team mates at the same time or individually to coordinate them to attack his opponents.If the Summoner dies his team looses the game.

'''Minions'''

The Minions have a slightly easier job than the Summoner, they must either a:seek out the opposing Summoner or b:they guard their Summoner by killing opposing Minions. There are many types of Minions(detailed below)who all have different roles, weapons, strengths, and weaknesses. Minions can only talk to other Minions who are close to them and overall rely on the Summoner to direct them. When a Minion dies the player is put on a que to respawn and when the timer is up the Minion respawns at an altar that the Summoner has placed down.

==Minion Species(types) ==

The Minions are the Summoner's army and all have a role to fill, should a player not like the Minion they are using they can choose a new type when they respawn.

'''Orc'''

The Orc is the basic attack force of the Summoner's army, being strong and durable. The orc is well armored and has the most health of all the Minions. The Orc is equipped with a Battle Axe which can be used in fast, weak swings, or slow powerful swings,and a Crossbow which can fire from 1 to 5 bolts depending on how long the trigger is held.The Orc looks like your generic 6 foot tall, green-skinned man with red eyes and tusks and an axe, it also has spikes coming out of it's spine.

'''Imp'''

The imp is a small fast scout Minion with low health and a low profile. The Imp can jump very high and takes half as much falling damage as other Minions.The Imp has the special power to turn invisible for periods of time, although this uses mana, and can also do a lunging attack with it's claws to defend itself.The imp is a small gray demon-like creature with horns and ripped wings.

'''Gel Cube'''

The Gel Cube is a lumbering mass of blue gel in a roughly cubic shape(go figure). The Gel Cube is slow and well armored with slightly less health than the Orc, the Cube can also be walked through, albiet the Minion doing so will be slowed and damaged the further in it is. The Gel Cube has only one attack, it touches opposing Minions and damages them with digestive fluids, the fluids do more damage the further the Minion is in the cube, for example, a Minion touching it would take minor damage, whereas a unit in the center of the cube would be killed very quickly. The Gel Cube serves as a roadblock or a meat shield for weaker Minions.

'''Fury'''

The fury is this mod's version of a sniper. The fury is a lightly armored Minion that can shoot hitscan beams of fire from it's hands at a slow rate  or weaker fire blasts at a much faster rate, the Fury has only a limited supply of fire although, so it cannot fire constantly. The hitscan blast uses up a whole mana(firepower) bar while the fireblasts use only a small part.The fury looks like a female being made of fire in black wrappings that cover most of it's body.

'''Wisp'''

The Wisp is a small white orb of light with a see-through core and calm eyes that acts as a medic. The Wisp's first attack shoots a fast line of white healing energy forward that goes though Minions but not walls and heals allied Minions, the Wisp's second move it a short range 'pulse' healing that must be activated, this heals much more health that the beam but to get any healing out of it an allied Minion must be close to the Wisp. The wisp has low health and armor but moves as fast as the Imp so it can get out of harms way quickly.

'''Iron Golem'''

The Iron Golem is a large suit of black and red armor with a large black crossbow built into it's arm with lots of health and armor but slow movement. The Iron Golem serves as heavy artillery with it's crossbow which can fire either huge explosive bolts that can be seen in the air due to the firey effects and dodged by a competent player, or a faster slightly smaller ballista bolt that can kill in a single hit and impale multiple enemy Minions, or even the allied Minions if friendly fire is on. The Iron Golem will fall apart if it hits the ground from too high a cliff, if will rebuild itself but it will take time where it is an easy kill.

'''Necroshade'''

The Necroshade is a stealth Minion with useful abilities. The necroshade moves slightly slower than the Imp and Wisp but is invisible unless it is moving too fast, it's claw attack is an instant-kill if it hits an enemy Minion in the back.(doesn't work on the Summoner because he can see it no matter what)The Necroshade can also create two portals, the first is the entrance portal and takes half the Necroshade's mana to create, the second portal made is the exit portal. Portals cannot be made in the air and there can only be 2 portals per Necroshade at a time, the entrance and the exit portals. The Necroshade's mana does not regenerate but it can get back the mana used to create a portal by attacking it, this destroys both portals and gives the Necroshade a full Mana bar. The Necroshade looks like a large hunched-over humanoid figure with spindly arms and legs, the face is featureless except for 9 glowing red eyes and a mouth full of sharp teeth. The Necroshade leaves behind a wispy trail of black smoke behind it making it slightly easier to spot, it's eyes also glow in the dark.

==Variables ==

-friendly fire-

-random Summoner selection-

-base health/mana adjustment-

-damage/healing adjustment-

-respawn time and penalties for suicides-

-possible CTF mode where the Summoner holds his team's flag until he is killed and can respawn.-

-turning enemy use of Necroshade portals on/off-

-number of players 3v3 4v4 5v5 6v6 -

if anyone would like to make this mod or models for it please post it on this page

===Interested Scriptors ===

==Discussion ==</text>
    </revision>
    <revision>
      <id>5422</id>
      <timestamp>2007-08-10T01:53:11Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Minions ==

==Description ==

Minions is a team-based multiplayer game. There are 2 teams, both of which are led by a Summoner who acts like a commander and orchestrates their attacks. The rest of the players are Minions, who are various monsters that act out(or not) the Summoners plan. The summoner is chosen at random(if set at random) and the rest of the players are split up evenly. Then the Minions choose their type and when everyone is decided, or the timers runs out the game begins.

==Objective and Gameplay ==

'''Summoner'''

The summoner is a medium speed human player who has a larger minimap and can see all of his team's players wherever they are on the map. The summoner only has one objective, to survive the opponent's Minions until his Minions can kill the other Summoner. The summoner has an area of healing around him that heals his own Minions and can use his staff to hurt opposing Minions in a pinch and can also place down an altar where Minions can respawn. The summoner can speak to all of his team mates at the same time or individually to coordinate them to attack his opponents.If the Summoner dies his team looses the game.

'''Minions'''

The Minions have a slightly easier job than the Summoner, they must either a:seek out the opposing Summoner or b:they guard their Summoner by killing opposing Minions. There are many types of Minions(detailed below)who all have different roles, weapons, strengths, and weaknesses. Minions can only talk to other Minions who are close to them and overall rely on the Summoner to direct them. When a Minion dies the player is put on a que to respawn and when the timer is up the Minion respawns at an altar that the Summoner has placed down.

==Minion Species(types) ==

The Minions are the Summoner's army and all have a role to fill, should a player not like the Minion they are using they can choose a new type when they respawn.

'''Orc'''

The Orc is the basic attack force of the Summoner's army, being strong and durable. The orc is well armored and has the most health of all the Minions. The Orc is equipped with a Battle Axe which can be used in fast, weak swings, or slow powerful swings,and a Crossbow which can fire from 1 to 5 bolts depending on how long the trigger is held.The Orc looks like your generic 6 foot tall, green-skinned man with red eyes and tusks and an axe, it also has spikes coming out of it's spine.

'''Imp'''

The imp is a small fast scout Minion with low health and a low profile. The Imp can jump very high and takes half as much falling damage as other Minions.The Imp has the special power to turn invisible for periods of time, although this uses mana, and can also do a lunging attack with it's claws to defend itself.The imp is a small gray demon-like creature with horns and ripped wings.

'''Gel Cube'''

The Gel Cube is a lumbering mass of blue gel in a roughly cubic shape(go figure). The Gel Cube is slow and well armored with slightly less health than the Orc, the Cube can also be walked through, albiet the Minion doing so will be slowed and damaged the further in it is. The Gel Cube has only one attack, it touches opposing Minions and damages them with digestive fluids, the fluids do more damage the further the Minion is in the cube, for example, a Minion touching it would take minor damage, whereas a unit in the center of the cube would be killed very quickly. The Gel Cube serves as a roadblock or a meat shield for weaker Minions.

'''Fury'''

The fury is this mod's version of a sniper. The fury is a lightly armored Minion that can shoot hitscan beams of fire from it's hands at a slow rate  or weaker fire blasts at a much faster rate, the Fury has only a limited supply of fire although, so it cannot fire constantly. The hitscan blast uses up a whole mana(firepower) bar while the fireblasts use only a small part.The fury looks like a female being made of fire in black wrappings that cover most of it's body.

'''Wisp'''

The Wisp is a small white orb of light with a see-through core and calm eyes that acts as a medic. The Wisp's first attack shoots a fast line of white healing energy forward that goes though Minions but not walls and heals allied Minions, the Wisp's second move it a short range 'pulse' healing that must be activated, this heals much more health that the beam but to get any healing out of it an allied Minion must be close to the Wisp. The wisp has low health and armor but moves as fast as the Imp so it can get out of harms way quickly.

'''Iron Golem'''

The Iron Golem is a large suit of black and red armor with a large black crossbow built into it's arm with lots of health and armor but slow movement. The Iron Golem serves as heavy artillery with it's crossbow which can fire either huge explosive bolts that can be seen in the air due to the firey effects and dodged by a competent player, or a faster slightly smaller ballista bolt that can kill in a single hit and impale multiple enemy Minions, or even the allied Minions if friendly fire is on. The Iron Golem will fall apart if it hits the ground from too high a cliff, if will rebuild itself but it will take time where it is an easy kill.

'''Necroshade'''

The Necroshade is a stealth Minion with useful abilities. The necroshade moves slightly slower than the Imp and Wisp but is invisible unless it is moving too fast, it's claw attack is an instant-kill if it hits an enemy Minion in the back.(doesn't work on the Summoner because he can see it no matter what)The Necroshade can also create two portals, the first is the entrance portal and takes half the Necroshade's mana to create, the second portal made is the exit portal. Portals cannot be made in the air and there can only be 2 portals per Necroshade at a time, the entrance and the exit portals. The Necroshade's mana does not regenerate but it can get back the mana used to create a portal by attacking it, this destroys both portals and gives the Necroshade a full Mana bar. The Necroshade looks like a large hunched-over humanoid figure with spindly arms and legs, the face is featureless except for 9 glowing red eyes and a mouth full of sharp teeth. The Necroshade leaves behind a wispy trail of black smoke behind it making it slightly easier to spot, it's eyes also glow in the dark.

==Variables ==

-friendly fire-

-random Summoner selection-

-base health/mana adjustment-

-damage/healing adjustment-

-respawn time and penalties for suicides-

-possible CTF mode where the Summoner holds his team's flag until he is killed and can respawn.-

-turning enemy use of Necroshade portals on/off-

-number of players 3v3 4v4 5v5 6v6 -

if anyone would like to make this mod or models for it please post it on this page</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MaskedCompare</title>
    <id>2071</id>
    <revision>
      <id>5044</id>
      <timestamp>2005-01-14T03:28:59Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">With the algoritm below you can compare a string with a wild card string.

==Usage==

There are two types of wild cards: &lt;code&gt;*&lt;/code&gt; to match zero or more characters and &lt;code&gt;?&lt;/code&gt; to match a single character

For example, the mask &lt;code&gt; bite my *ass &lt;/code&gt; matches:
 bite my ass
 bite my shining metal ass
 bite my          ass

The mask &lt;code&gt; mich?el &lt;/code&gt; matches:
 michael
 michiel

But not:
 michel
 michaeel

==Code==

&lt;uscript&gt;
// Internal function used for MaskedCompare
static private final function bool _match(out string mask, out string target)
{
  local string m, mp, cp;
  m = Left(mask, 1);
  while ((target != &quot;&quot;) &amp;&amp; (m != &quot;*&quot;))
  {
    if ((m != Left(target, 1)) &amp;&amp; (m != &quot;?&quot;)) return false;
    mask = Mid(Mask, 1);
    target = Mid(target, 1);
		m = Left(mask, 1);
  }

  while (target != &quot;&quot;) 
  {
		if (m == &quot;*&quot;) 
    {
      mask = Mid(Mask, 1);
			if (mask == &quot;&quot;) return true; // only &quot;*&quot; mask -&gt; always true
			mp = mask;
			cp = Mid(target, 1);
      m = Left(mask, 1);
		} 
    else if ((m == Left(target, 1)) || (m == &quot;?&quot;)) 
    {
			mask = Mid(Mask, 1);
      target = Mid(target, 1);
  		m = Left(mask, 1);
		} 
    else 
    {
			mask = mp;
      m = Left(mask, 1);
			target = cp;
      cp = Mid(cp, 1);
		}
	}

  while (Left(mask, 1) == &quot;*&quot;) 
  {
		mask = Mid(Mask, 1);
	}
	return (mask == &quot;&quot;);
}

// Compare a string with a mask
// Wildcards: * = X chars; ? = 1 char
// Wildcards can appear anywhere in the mask
static final function bool MaskedCompare(coerce string target, string mask, optional bool casesensitive)
{
  if (!casesensitive)
  {
    mask = Caps(mask);
    target = Caps(target);
  }
  if (mask == &quot;*&quot;) return true;

  return _match(mask, target);
}
&lt;/uscript&gt;

[[Category:Legacy Algorithm|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5045</id>
      <timestamp>2005-01-13T23:48:02Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Master Browser</title>
    <id>2130</id>
    <revision>
      <id>5185</id>
      <timestamp>2006-04-06T22:16:37Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">The Master Browser is a Browser window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] that can contain any of the other browsers.  The image below shows the Master Browser with every possible browser docked in it (UnrealEd3):

[[Image:Legacy_interface-Ed3-masterbrowser.png|center|]]

The names of each browser are displayed in seperate tabs under the toolbar, and can be clicked on to display that browser.

To dock or undock a browser, go to ''View -&gt; Docked'' in the toolbar.  Warning:  this may cause crashes in the Editor.

==Related Topics ==

*[[Legacy:Actor Class Browser|Actor Class Browser]]
*[[Legacy:Animation Browser|Animation Browser]]
*[[Legacy:Group Browser|Group Browser]]
*[[Legacy:Mesh Browser|Mesh Browser]]
*[[Legacy:Music Browser|Music Browser]]
*[[Legacy:Prefab Browser|Prefab Browser]]
*[[Legacy:Sound Browser|Sound Browser]]
*[[Legacy:Static Mesh Browser|Static Mesh Browser]]
*[[Legacy:Texture Browser|Texture Browser]]

----

'''Tarquin:''' Could you remake the pic as a PNG please? It might be smaller, and it won't have JPEG blur. The filename should begin with &quot;interface-Ed3-&quot; :)

'''Daid303:''' Darn :P I was thinking this page was about the master browser as in 'searching for internet games', oh well.

'''Shuriken:''' Tarq- done.  The old masterbrowser image still exists... I'm guessing I can't delete it? 
:Daid- Hmm... yeah.  Didn't think about that :s

'''Tarquin:''' 44k down to 16k! Told you so :D  I'll take care of the old image.</text>
    </revision>
    <revision>
      <id>5186</id>
      <timestamp>2006-04-06T21:07:08Z</timestamp>
      <contributor>
        <ip>CDN-CE-INFLOW-T2-01.inflow.pa.bo.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">The Master Browser is a Browser window in the [[Legacy:UnrealEd Interface|UnrealEd Interface]] that can contain any of the other browsers.  The image below shows the Master Browser with every possible browser docked in it (UnrealEd3):

[[Image:Legacy_interface-Ed3-masterbrowser.png|center|]]

The names of each browser are displayed in seperate tabs under the toolbar, and can be clicked on to display that browser.

To dock or undock a browser, go to ''View -&gt; Docked'' in the toolbar.  Warning:  this may cause crashes in the Editor.

==Related Topics ==

*[[Legacy:Actor Class Browser|Actor Class Browser]]
*[[Legacy:Animation Browser|Animation Browser]]
*[[Legacy:Group Browser|Group Browser]]
*[[Legacy:Mesh Browser|Mesh Browser]]
*[[Legacy:Music Browser|Music Browser]]
*[[Legacy:Prefab Browser|Prefab Browser]]
*[[Legacy:Sound Browser|Sound Browser]]
*[[Legacy:Static Mesh Browser|Static Mesh Browser]]
*[[Legacy:Texture Browser|Texture Browser]]

----

'''Tarquin:''' Could you remake the pic as a PNG please? It might be smaller, and it won't have JPEG blur. The filename should begin with &quot;interface-Ed3-&quot; :)

'''Daid303:''' Darn :P I was thinking this page was about the master browser as in 'searching for internet games', oh well.

'''Shuriken:''' Tarq- done.  The old masterbrowser image still exists... I'm guessing I can't delete it? 
:Daid- Hmm... yeah.  Didn't think about that :s

'''Tarquin:''' 44k down to 16k! Told you so :D  I'll take care of the old image.

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MasterMD5Commandlet</title>
    <id>2045</id>
    <revision>
      <id>4985</id>
      <timestamp>2004-10-09T11:17:22Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; MasterMD5Commandlet}}

This package, new to versions of the Unreal Engine post-[[Legacy:UT2003|UT2003]] provides package-level security.  This commandlet creates an .md5 checksum of passed files, and updates the database file of the md5 checksums - found in /System/Packages.md5.

This can be used, for example, by a game server to verify clients' package checksums - if there is a mismatch, the client is rejected, removed from the server, and shown a &quot;Corrupt Connection&quot; message.
 

====Comment from Epic ====

Here is a post to the UT2003 Mod Developers list by Joe W @ Epic... 

----

&quot;I do know about the external bot that's floating around. It's a typical opengl hack that uses modified skins to detect when to fire at an opponent. Like all external bots, it's most useful only in low pings situations. 

Directly after the patch is finalized, I'll release a mutator that will allows admins to lock down any file in the game with an MD5 check. This can then be used to detect the skin hack needed to make this bot function. Eventually, I'll merge the functionality back in to the main UT2003 code, but not until we decide to break netcode compatibility.

Now with that said, let me try and explain in a little more detail about the MD5 database system. When a client connects to your server, he sets up a communication stream that describes all of the packages loaded on the client. Each package is identified and it's corresponding checksum is sent to the server for verification. The 

server then looks up each package in the MD5 database and determines if the package is indeed correct. If not, it drops the player with a Corrupted Connection message. 

ONLY packages that contain Uscript structures are verified, so while every package type in UT2003 can contain script code, only those that actually do will be processed. There is no way to hide script code from detection. If it exists in a package, that package will be flagged. 

So where does the MD5 database get it's data from? 4 places. First, is the default data shipped with the game or the patch (or when you rebuild the database from scratch). The second is any package loaded on the server will automatically be added to the database. Third, is upon connect to the master server, your server might receive critical updates from us. Finally, you can manually add packages yourself. 

So, when should you add a package to your database? If you are adding .U files that require ServerActors or are mutators/new game types, then you probably do not need to manually add the package. UT2003 should auto-detect them (as long as they are loaded). Also, as a general rule, new resource files (.UTX/.UKX/.USX/Etc) shouldn't need to be added. 

However, if the package you wish to allow has a .U file (or is known to contain code) and you wish to allow clients to use it, but it's not loaded on your server, feel free to add the file. 

'''Starting with the patches, the format to use the MasterMD5 command is as follows''': 

ucc mastermd5 [-option..] &lt;parms&gt;

''Options:''

;-c : Rebuild the Packages.MD5 database from scratch. Parms are a list of wildcards to process. Ex: &quot;ucc mastermd5 -c *.u&quot;. The -C command will search all sub directories in \UT2003. 

;-a : Adds a file (or files) to your Packages.MD5 database. Same params as -c above 

;-s : Shows all entries in the current database.

;-f : Performs a full MD5 hash of the single file passed in Parms.

;-w : Dumps the GUIDs and MD5 hashes of the single file (or multiple files) passed in Parms.

Some of you write-protected your Packages.md5. Please do not do this anymore. You will need those updates. I hope this helps shed some light on everything. If not, drop me a line. 

J. 

Joe Wilcox 

Programmer, Epic Games 

===Discussion ===

'''DJPaul:''' Thanks to [[Legacy:FurrySound{Moo}|FurrySound{Moo}]] for this.

'''Foxpaw:''' Is there a way to disable the checksum.. check? I can't remember why I wanted to do this since it's late and I'm on my way to bed, but I wanted to be able to have different packages on different clients, and I'm sure I'll remember why when I get up tomorrow. Obviously, of course, they would have to be &quot;compatible,&quot; IE replicating the same information and not simulating anything that might differ, but is there a way to disable the MD5 check from the server to make this possible? I understand that you can have server-only script, but I'd like the capability to have client-only script as well.

'''El Muerte TDS:''' no you can't disable MD5 checking. However it is possible do have diffirent client and server versions of a package, as long as the MD5 record is present on the server there won't be a problem.

'''Foxpaw:''' Won't it reject the client if the MD5 checksums do not match? Since the packages would be different they would clearly have a different MD5 checksum.

'''El Muerte TDS:''' only if the packages.md5 archive doesn't have the right GUID/MD5 combo for that client package

'''Foxpaw:''' I'm still confused.. The server and client have their own MD5 checksums stored and they only verify against themselves? Or does the server store MD5 checksums for both themselves and the clients?

'''Mychaeel:''' The server calculates them and caches them in Packages.md5.  The client calculates them on the fly when queried by a server and sends them back to the server for verification.

'''Foxpaw:''' I'm a bit unclear still on how this works, is the following correct?
* Client connects to Server
* Client performs MD5 checksum on all packages containing script
* Client sends checksum data along with package names to server
* Server compares MD5 checksum to stored checksum to verify if the package is allowed

So this is for client-side only packages then? Or did I misunderstand the above? And there's no way to disable it if you want to, say, have clients be able to make their own UScript packages that will interact with the server packages in some way, only packages that have been on the server and had their checksum added to the database can be used on the client?

'''El Muerte TDS:''' you can't disable it

'''Foxpaw:''' So is the rest of my understanding about it accurate?</text>
    </revision>
    <revision>
      <id>4986</id>
      <timestamp>2003-10-30T14:29:18Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Object|Object]] &gt;&gt; [[Legacy:Commandlet|Commandlet]] &gt;&gt; MasterMD5Commandlet}}

This package, new to versions of the Unreal Engine post-[[Legacy:UT2003|UT2003]] provides package-level security.  This commandlet creates an .md5 checksum of passed files, and updates the database file of the md5 checksums - found in /System/Packages.md5.

This can be used, for example, by a game server to verify clients' package checksums - if there is a mismatch, the client is rejected, removed from the server, and shown a &quot;Corrupt Connection&quot; message.
 

====Comment from Epic ====

Here is a post to the UT2003 Mod Developers list by Joe W @ Epic... 

----

&quot;I do know about the external bot that's floating around. It's a typical opengl hack that uses modified skins to detect when to fire at an opponent. Like all external bots, it's most useful only in low pings situations. 

Directly after the patch is finalized, I'll release a mutator that will allows admins to lock down any file in the game with an MD5 check. This can then be used to detect the skin hack needed to make this bot function. Eventually, I'll merge the functionality back in to the main UT2003 code, but not until we decide to break netcode compatibility.

Now with that said, let me try and explain in a little more detail about the MD5 database system. When a client connects to your server, he sets up a communication stream that describes all of the packages loaded on the client. Each package is identified and it's corresponding checksum is sent to the server for verification. The 

server then looks up each package in the MD5 database and determines if the package is indeed correct. If not, it drops the player with a Corrupted Connection message. 

ONLY packages that contain Uscript structures are verified, so while every package type in UT2003 can contain script code, only those that actually do will be processed. There is no way to hide script code from detection. If it exists in a package, that package will be flagged. 

So where does the MD5 database get it's data from? 4 places. First, is the default data shipped with the game or the patch (or when you rebuild the database from scratch). The second is any package loaded on the server will automatically be added to the database. Third, is upon connect to the master server, your server might receive critical updates from us. Finally, you can manually add packages yourself. 

So, when should you add a package to your database? If you are adding .U files that require ServerActors or are mutators/new game types, then you probably do not need to manually add the package. UT2003 should auto-detect them (as long as they are loaded). Also, as a general rule, new resource files (.UTX/.UKX/.USX/Etc) shouldn't need to be added. 

However, if the package you wish to allow has a .U file (or is known to contain code) and you wish to allow clients to use it, but it's not loaded on your server, feel free to add the file. 

'''Starting with the patches, the format to use the MasterMD5 command is as follows''': 

ucc mastermd5 [-option..] &lt;parms&gt;

''Options:''

;-c : Rebuild the Packages.MD5 database from scratch. Parms are a list of wildcards to process. Ex: &quot;ucc mastermd5 -c *.u&quot;. The -C command will search all sub directories in \UT2003. 

;-a : Adds a file (or files) to your Packages.MD5 database. Same params as -c above 

;-s : Shows all entries in the current database.

;-f : Performs a full MD5 hash of the single file passed in Parms.

Some of you write-protected your Packages.md5. Please do not do this anymore. You will need those updates. I hope this helps shed some light on everything. If not, drop me a line. 

J. 

Joe Wilcox 

Programmer, Epic Games 

===Discussion ===

'''DJPaul:''' Thanks to [[Legacy:FurrySound{Moo}|FurrySound{Moo}]] for this.

'''Foxpaw:''' Is there a way to disable the checksum.. check? I can't remember why I wanted to do this since it's late and I'm on my way to bed, but I wanted to be able to have different packages on different clients, and I'm sure I'll remember why when I get up tomorrow. Obviously, of course, they would have to be &quot;compatible,&quot; IE replicating the same information and not simulating anything that might differ, but is there a way to disable the MD5 check from the server to make this possible? I understand that you can have server-only script, but I'd like the capability to have client-only script as well.

'''El Muerte TDS:''' no you can't disable MD5 checking. However it is possible do have diffirent client and server versions of a package, as long as the MD5 record is present on the server there won't be a problem.

'''Foxpaw:''' Won't it reject the client if the MD5 checksums do not match? Since the packages would be different they would clearly have a different MD5 checksum.

'''El Muerte TDS:''' only if the packages.md5 archive doesn't have the right GUID/MD5 combo for that client package

'''Foxpaw:''' I'm still confused.. The server and client have their own MD5 checksums stored and they only verify against themselves? Or does the server store MD5 checksums for both themselves and the clients?

'''Mychaeel:''' The server calculates them and caches them in Packages.md5.  The client calculates them on the fly when queried by a server and sends them back to the server for verification.

'''Foxpaw:''' I'm a bit unclear still on how this works, is the following correct?
* Client connects to Server
* Client performs MD5 checksum on all packages containing script
* Client sends checksum data along with package names to server
* Server compares MD5 checksum to stored checksum to verify if the package is allowed

So this is for client-side only packages then? Or did I misunderstand the above? And there's no way to disable it if you want to, say, have clients be able to make their own UScript packages that will interact with the server packages in some way, only packages that have been on the server and had their checksum added to the database can be used on the client?

'''El Muerte TDS:''' you can't disable it

'''Foxpaw:''' So is the rest of my understanding about it accurate?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MasterOfTheDark</title>
    <id>2117</id>
    <revision>
      <id>5157</id>
      <timestamp>2005-01-10T22:01:33Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">After a long time away from UT2004 and the Wiki, I decided to get back into it.  I suppose it's because I woke up early in the morning at the beginning and said &quot;I MUST MAKE THAT MUTATOR!&quot;  I didn't stop there... I'm working on a full-fledged mod now.

The thing that got me really suddenly interested is a dispute between my brother and I about controls for Metroid Prime 2.  I've heard it said before, and I bet I'll hear it again: &quot;Give me a mouse and a keyboard and I could totally own [you/this game].&quot;  That gave me the reverse idea - give me Retro's MP controls, and I could totally own Unreal Tournament.  And so I made the mutator for my XBox controller via USB and an interaction.  I'm now happy - owning godlike bots and plowing through everything - but in no way done coding.

===About Me===

My proper name's Matt DeKrey - but I've been going by MasterOfTheDark on the 'net for about ten years now.  I've been programming for longer than I can remember, starting with HTML (not really programming, but it is what got me started), and then on to several flavors of BASIC, C++, Java, and C#.  Somewhere in there I learned php, asp, jsp, and pl.  In the last year I added Maya's mel and Unreal Script to my list.  I'm currently in Dallas attending college at UTD - majoring in computer science.  

I'm a member of the Student Game Developers' Association on campus at UTD, and currently serving as the president for the group.  I was the lead programmer for the UT2004 mod &quot;Turbo Joust&quot; that was entered in the MSU competition; if you looked at the code, I know it's a mess - but it ran on UT2003 just the same.  

I've worked at Barking Lizards Technology for six months on the X-Men Legends release for the N-Gage.  I plan on working professionally in the game industry when I graduate (May 2006), perhaps at a company of me and my friends.  

As far as my other interests go, I enjoy playing games.  My most recent addictions were Paper Mario 2 and Metroid Prime 2.  I'm also a DM when I'm not in the mood for video games.

===Comments===

'''Dragonmaw:''' Welcome to the Wiki!  Always glad to see more people joining and occaisionally helping.

'''MythOpus:''' He beat me to it :tdown: Anyways, Welcome to the Wiki !

'''MasterOfTheDark:''' Well, I didn't know this was here 'til just now.  I've been on the Wiki for about a month now (yeah, registered for a month and just noticing it's here, I know) and don't really feel  completely comfortable making changes to what else is here.  Maybe in another couple of weeks when I have time (school).  Anyway, thanks for the welcome and all the content!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5158</id>
      <timestamp>2005-01-10T20:57:47Z</timestamp>
      <contributor>
        <ip>66.192.30.22</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MasterServerClient</title>
    <id>2214</id>
    <revision>
      <id>5360</id>
      <timestamp>2006-05-06T20:04:41Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>Wikified Class</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] [[Legacy:UT2004|UT2004]] [[Legacy:Land Of The Dead|Land of the Dead]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:MasterServerLink|MasterServerLink]] &gt;&gt; [[Legacy:ServerQueryClient|ServerQueryClient]] &gt;&gt; [[Legacy:MasterServerClient|MasterServerClient]]}}

==Properties==
; int MSLinkPtr : 

===Query===
; array&lt;QueryData&gt; Query : 
; int ResultCount : 

==Enums==

===EClientToMaster===

; CTM_Query :
; CTM_GetMOTD :
; CTM_QueryUpgrade :

===EMOTDResponse===

; MR_MOTD :
; MR_MandatoryUpgrade :
; MR_OptionalUpgrade :
; MR_NewServer :
; MR_IniSetting :
; MR_Command :

===EQueryType===

; QT_Equals :
; QT_NotEquals :
; QT_LessThan :
; QT_LessThanEquals :
; QT_GreaterThan :
; QT_GreaterThanEquals :

===EResponseInfo===

; RI_AuthenticationFailed :
; RI_ConnectionFailed :
; RI_ConnectionTimeout :
; RI_Success :
; RI_MustUpgrade :

==Structures==

===QueryData===

====MasterServerClient====
; string Key : 
; EQueryType QueryType : 
; string Value : 

==Delegates==
;  OnQueryFinished(EResponseInfo ResponseInfo, int Info ): 
;  OnReceivedMOTDData(EMOTDResponse Command, string Value ): 
;  OnReceivedServer(GameInfo.ServerResponseLine s ): 

==Functions==
;  LaunchAutoUpdate( ): 
;  StartQuery(EClientToMaster Command ): 
;  Stop( ): 

You use this class to query servers off of epics master server.

==Basic Usage:==

Spawn a new MasterServerClient actor, setup the delegates OnReceivedServer and OnQueryFinished, add queries to the query array, call StartQuery(CTM_Query) - thats it!

look for the function AddQueryTerm - its useful for adding to the query array.

==Discussion==

'''TwinsenEd:''' I was thrown off a bit by the &quot;gametype&quot; query, although some of the defaults say &quot;Onslaught.ONSOnslaught&quot;, a fully qualified name, it only returned results when I dropped the package name. You can get away with just adding a gametype as the only query item with AddQueryTerm(&quot;gametype&quot;,&quot;GameTypeName&quot;,QT_Equals);

'''El Muerte:''' and that's a good things, because package names have to change in a lot of cases (e.g. to prevent version issues)

'''SuperApe:''' Is this a class page?  Custom class?  Needs love.

'''EricBlade:''' Well, here's the output of a Class Wikify. :D  I'm re-building my game's server browser, and would love to know how to make the best use of these functions, if anyone has any better documentation. :D</text>
    </revision>
    <revision>
      <id>5361</id>
      <timestamp>2005-12-18T00:47:23Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">You use this class to query servers off of epics master server.

==Basic Usage:==

Spawn a new MasterServerClient actor, setup the delegates OnReceivedServer and OnQueryFinished, add queries to the query array, call StartQuery(CTM_Query) - thats it!

look for the function AddQueryTerm - its useful for adding to the query array.

==Discussion==

'''TwinsenEd:''' I was thrown off a bit by the &quot;gametype&quot; query, although some of the defaults say &quot;Onslaught.ONSOnslaught&quot;, a fully qualified name, it only returned results when I dropped the package name. You can get away with just adding a gametype as the only query item with AddQueryTerm(&quot;gametype&quot;,&quot;GameTypeName&quot;,QT_Equals);

'''El Muerte:''' and that's a good things, because package names have to change in a lot of cases (e.g. to prevent version issues)

'''SuperApe:''' Is this a class page?  Custom class?  Needs love.

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MasterServerGameStats</title>
    <id>1824</id>
    <revision>
      <id>4476</id>
      <timestamp>2003-08-13T08:47:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>not [[CAtegory Class Tree]]</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameStats|GameStats]] &gt;&gt; MasterServerGameStats (Package: IpDrv)}}

This subclass of [[Legacy:GameStats|GameStats]] is used to send game stats to the [[Legacy:MasterServerUpLink|MasterServerUpLink]].  This subclass does not create a [[Legacy:FileLog|FileLog]] but instead when ''Logf'' method is called writes to the MasterServerUplink.

{{innerbox|For more information about the logging and what is logged see [[Legacy:GameStats|GameStats]].

}}

==Properties ==
; [[Legacy:MasterServerUplink|MasterServerUplink]] Uplink : Creates an uplink to the [[Legacy:GameSpy|GameSpy]] servers and sends those servers the game stats.

==Methods==

===Inherited From [[Legacy:GameStats|GameStats]]===
; Init ( ) : Logs to the standard local log that the class has been initialized (''MasterServerGameStats initializing'').

; Logf (string LogString) : Insures proper connection to UpLink then attempts to call ''LogStatLine'' of [[Legacy:MasterServerUplink|MasterServerUplink]].  If the stats are rejected then the connection is lost.

; Shutdown ( ) : Does nothing.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4477</id>
      <timestamp>2003-08-12T22:57:31Z</timestamp>
      <contributor>
        <ip>Burtlo</ip>
      </contributor>
      <comment>Summary, variables, and methods.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:GameStats|GameStats]] &gt;&gt; MasterServerGameStats (Package: IpDrv)}}

This subclass of [[Legacy:GameStats|GameStats]] is used to send game stats to the [[Legacy:MasterServerUpLink|MasterServerUpLink]].  This subclass does not create a [[Legacy:FileLog|FileLog]] but instead when ''Logf'' method is called writes to the MasterServerUplink.

{{innerbox|For more information about the logging and what is logged see [[Legacy:GameStats|GameStats]].

}}

==Properties ==
; [[Legacy:MasterServerUplink|MasterServerUplink]] Uplink : Creates an uplink to the [[Legacy:GameSpy|GameSpy]] servers and sends those servers the game stats.

==Methods==
; Init () : Overriden. Logs to the standard local log that the class has been initialized (''MasterServerGameStats initializing'').

; Logf (string LogString) : Overriden.  Insures proper connection to UpLink then attempts to call ''LogStatLine'' of [[Legacy:MasterServerUplink|MasterServerUplink]].  If the stats are rejected then the connection is lost.

; Shutdown () : Overriden.  Does nothing.

==Known Subclases==
; None 

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MasterServerLink</title>
    <id>2233</id>
    <revision>
      <id>5400</id>
      <timestamp>2006-05-06T22:42:58Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>Added</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] [[Legacy:UT2004|UT2004]] [[Legacy:Land Of The Dead|Land of the Dead]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:MasterServerLink|MasterServerLink]]}}

==Properties==
; int CurrentMasterServer : The Master Server that the game is currently querying
; int LANPort : 
; int LANServerPort : 
; int LinkPtr : 
; string MasterServerAddress[5] : List of Master Server addresses to query
; int MasterServerPort[5] : List of Master Server ports to query

==Functions==
; bool Poll(int WaitTime ): Unclear what this function does, any help?
;  Tick(float Delta ): Calls Poll(0)

==Events==
;  GetMasterServer(out string OutAddress, out int OutPort ): returns the Master Server Address and Port to use in OutAddress and OutPort</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MatAction</title>
    <id>28449</id>
    <revision>
      <id>40146</id>
      <timestamp>2009-11-17T10:08:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MatObject</title>
    <id>28417</id>
    <revision>
      <id>40089</id>
      <timestamp>2009-11-15T08:28:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MatSubAction</title>
    <id>28521</id>
    <revision>
      <id>40222</id>
      <timestamp>2009-11-17T11:02:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Matariel</title>
    <id>2220</id>
    <revision>
      <id>5374</id>
      <timestamp>2007-05-06T06:38:48Z</timestamp>
      <contributor>
        <ip>Matariel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">So, I get my own page now eh? Well since you got here, I suppose you want a treat. Here, have an e-cookie :D

I suppose the time to update this page with real info is soon, maybe tomorrow? Yeah, tomorrow, I like the sound of that.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5375</id>
      <timestamp>2007-05-06T06:38:34Z</timestamp>
      <contributor>
        <ip>Matariel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Matariel==

So, I get my own page now eh? Well since you got here, I suppose you want a treat. Here, have an e-cookie :D

I suppose the time to update this page with real info is soon, maybe tomorrow? Yeah, tomorrow, I like the sound of that.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Match These Tags</title>
    <id>2079</id>
    <revision>
      <id>5060</id>
      <timestamp>2003-11-30T13:37:57Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

* For how to set the properties of an actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

==Overview ==

There are many instances where you need to &quot;tie&quot; two or more actors together in some way. The [[Legacy:Unreal Engine|Unreal Engine]] does this by using tag properties. These are [[Legacy:Name|name]] variables. It doesn't matter what the actual value is, the important thing is that they match.

The classic example is the Events -&gt; Tag and Events -&gt; Trigger pair. If we have:

* A Trigger actor with Events -&gt; [[Legacy:Event|Event]] = foo
* Another actor with Events -&gt; [[Legacy:Tag|Tag]] = foo

then the two are tied together, and the Trigger will activate the other actor. It doesn't matter that we used &quot;foo&quot;, only that they ''both'' have &quot;foo&quot;. We could have used &quot;bar&quot;. But of course, if later on we want to match another, ''different'' pair, then we can't use &quot;foo&quot;, because it's already used. We can give many other actors the &quot;foo&quot; tag, but they'll be involved with the two we already have: other Triggers, or other actors we want to be activated by any of the triggers (database people will recognize this as a many-to-many relationship).

For example, the Trigger actor could activate a roomfull of monsters, like this:
* Trigger actor with Events -&gt; [[Legacy:Event|Event]] = foo
* Monster1 with Events -&gt; [[Legacy:Tag|Tag]] = foo
* Monster2 with Events -&gt; [[Legacy:Tag|Tag]] = foo
* ... and so on.

All the monsters will be activated by the Trigger.

Many other properties use this concept. For example: [[Legacy:FortStandard|FortStandard]] -&gt; NearestPathNodeTag, etc

==Instructions ==

To match the tags of two actors:

# Decide on a name to connect the two. It can be anything: &quot;MrHappyPants&quot; will do, though it can help if you use something that indicates what is going on, like &quot;SecretDoor&quot; or &quot;BigBadMonsterThatComesToEatUnsuspectingCampingPlayer&quot; (actually, don't chose that,  [[Legacy:Name|name]]s are limited to a max of 31 characters, but you get the drift).
#&lt;wiki&gt;Open the [[Legacy:Actor Properties Window|Actor Properties Window]] by doing one of:
#* [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; Properties (the first item in the menu)
#* Press the button labeled #12 on the [[Legacy:Toolbar|toolbar]] image above
#* Press the F4 key
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties

[[Image:Legacy_interface-Ed3-actorproperties.png|center|'''Actor Properties Window'''&lt;/wiki&gt;]]

# Click the first actor. In the Actor Properties Window find the property you need to set (in most cases, 'Event' or 'Tag' remember). Type in the name. You can then select the text and copy it if you like (CTRL-C).
# Click the second actor. The Actor Properties Window updates itself to show the properties of the second actor. ''Make sure you don't now have both selected, UnrealEd sometimes likes to extend selections.'' Find the property you need to set. Type in the same name. If you copied the name in the first one, you can do paste here (CTRL-V).
# If you lose sleep over whether you made a typo, change the capitalization of the second name to make sure they have matched. If UnrealEd changes the capitalization as soon as the text box loses focus, then it has made a match. This is because names are stored in whichever case you typed them in the first time. For example, if you first type &quot;fOO&quot;, then type &quot;foo&quot; the second time, UEd will change it to &quot;fOO&quot;.

==Related Topics ==
* [[Legacy:Event|Event]] covers these concepts in more depth.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5061</id>
      <timestamp>2003-05-25T09:50:45Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">''This is a [[:Category:Legacy Basic Procedure]] tutorial page. It explains how to perform a single procedure which is required in many different contexts.''

* For how to set the properties of an actor, see [[Legacy:Set The Following Properties|Set The Following Properties]]
* For more on working with actors in general, see [[Legacy:Actor Overview|Actor Overview]].

==Overview ==

There are many instances where you need to &quot;tie&quot; two or more actors together in some way. The [[Legacy:Unreal Engine|Unreal Engine]] does this by using tag properties. These are [[Legacy:Name|name]] variables. It doesn't matter what the actual value is, the important thing is that they match.

The classic example is the Events -&gt; Tag and Events -&gt; Trigger pair. If we have:

* A Trigger actor with Events -&gt; [[Legacy:Event|Event]] = foo
* Another actor with Events -&gt; [[Legacy:Tag|Tag]] = foo

then the two are tied together, and the Trigger will activate the other actor. It doesn't matter that we used &quot;foo&quot;, only that they ''both'' have &quot;foo&quot;. We could have used &quot;bar&quot;. But of course, if later on we want to match another, ''different'' pair, then we can't use &quot;foo&quot;, because it's already used. We can give many other actors the &quot;foo&quot; tag, but they'll be involved with the two we already have: other Triggers, or other actors we want to be activated by any of the triggers (database people will recognize this as a many-to-many relationship).

For example, the Trigger actor could activate a roomfull of monsters, like this:
* Trigger actor with Events -&gt; [[Legacy:Event|Event]] = foo
* Monster1 with Events -&gt; [[Legacy:Tag|Tag]] = foo
* Monster2 with Events -&gt; [[Legacy:Tag|Tag]] = foo
* ... and so on.

All the monsters will be activated by the Trigger.

==Instructions ==

To match the tags of two actors:

# Decide on a name to connect the two. It can be anything: &quot;MrHappyPants&quot; will do, though it can help if you use something that indicates what is going on, like &quot;SecretDoor&quot; or &quot;BigBadMonsterThatComesToEatUnsuspectingCampingPlayer&quot;( actually, don't chose that,  [[Legacy:Name|name]]s are limited to a max of 31 characters, but you get the drift )
# Open the [[Legacy:Actor Properties Window|Actor Properties Window]] by doing one of:
#* [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; &lt;classname&gt; Properties (the first item in the menu)
#* Press the button labeled #12 on the [[Legacy:Toolbar|toolbar]] image above
#* Press the F4 key
#* [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Actor Properties

[[Image:Legacy_interface-Ed3-actorproperties.png|center|'''Actor Properties Window''']]

# Click the first actor. In the Actor Properties Window find the property you need to set (which will be 'Event' or 'Tag' remember). Type in the name. You can then select the text &amp; copy it if you like.
# Click the second actor. In the Actor Properties Window find the property you need to set. Type in the same name. If you copied the name in the first one, you can do paste here.
# If you lose sleep over whether you made a typo, change the capitalization of the second name to make sure they have matched. If UnrealEd changes the capitalization as soon as the text box loses focus, then it has made a match. This is because names are stored in whichever case you typed them in the first time. For example, if you first type &quot;fOO&quot;, then type &quot;foo&quot; the second time, UEd will change it to &quot;fOO&quot;.

==Related Topics ==
* [[Legacy:Event|Event]] covers these concepts in more depth.

[[Category:Legacy Basic Procedure|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MatchInfo</title>
    <id>28866</id>
    <revision>
      <id>42793</id>
      <timestamp>2010-03-30T16:20:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Material</title>
    <id>2062</id>
    <revision>
      <id>5022</id>
      <timestamp>2005-10-30T03:55:08Z</timestamp>
      <contributor>
        <ip>211.26.100.67</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Material (Package: Engine)}}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; Material (Package: Engine)}}

The superclass of all texture-like objects that can be applied to surfaces or drawn on a [[Legacy:Canvas|Canvas]].

Any Material object can be [[Legacy:Creating Actors And Objects|created at runtime]] and used by script code (whereas in [[Legacy:UT|UT]] the attempt to do so crashed the game).  You can, however, set up a Material's properties only once per frame before the Material is drawn the first time that frame; subsequent property changes remain uneffective.

See also: [[Legacy:Material Context Menu|Material Context Menu]], [[Legacy:Topics On Materials|Topics On Materials]] topic page

==Properties==

===Editable===
; Material FallbackMaterial : A fallback material.  Automatically used by the engine if the user's video card cannot cope with a complex shader construction used in this material.
; ESurfaceTypes SurfaceType : Type of surface, see [[Legacy:ESurfaceTypes|ESurfaceTypes]].

===Internal===

[[Image:Legacy_DefaultTexture.jpeg|right|The default texture.]]
; Material DefaultMaterial : The default material goes by the intuitive name DefaultMaterial.
; bool UseFallback (transient, const) : Render device should use the fallback.
; bool Validated (transient, const) : Material has been validated as renderable.

==Methods==
; Reset ( ) : Resets the material. The material class's Reset method only calls the FallbackMaterial's Reset method.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the material. The material class's Trigger method method only triggers the FallbackMaterial.
; int MaterialUSize ( ) [native] : Returns the width of the material.
; int MaterialVSize ( ) [native] : Returns the height of the material.

==Known Subclasses ==
 [[Legacy:Material|Material]]
    +-[[Legacy:Combiner|Combiner]]
    +-[[Legacy:Modifier|Modifier]]
    |   +-[[Legacy:ColorModifier|ColorModifier]]
    |   +-[[Legacy:FinalBlend|FinalBlend]]
    |   +-[[Legacy:MaterialSequence|MaterialSequence]]
    |   +-[[Legacy:MaterialSwitch|MaterialSwitch]]
    |   +-[[Legacy:OpacityModifier|OpacityModifier]]
    |   +-[[Legacy:TexModifier|TexModifier]]
    |       +-[[Legacy:TexCoordSource|TexCoordSource]]
    |       +-[[Legacy:TexEnvMap|TexEnvMap]]
    |       +-[[Legacy:TexMatrix|TexMatrix]]
    |       +-[[Legacy:TexOscillator|TexOscillator]]
    |       |   +-[[Legacy:TexOscillatorTriggered|TexOscillatorTriggered]]
    |       +-[[Legacy:TexPanner|TexPanner]]
    |       |   +-[[Legacy:TexPannerTriggered|TexPannerTriggered]]
    |       +-[[Legacy:TexRotator|TexRotator]]
    |       +-[[Legacy:TexScaler|TexScaler]]
    +-[[Legacy:RenderedMaterial|RenderedMaterial]]
        +-[[Legacy:BitmapMaterial|BitmapMaterial]]
        |   +-[[Legacy:ScriptedTexture|ScriptedTexture]]
        |   +-[[Legacy:ShadowBitmapMaterial|ShadowBitmapMaterial]]
        |   +-[[Legacy:Texture|Texture]]
        |       +-[[Legacy:Cubemap|Cubemap]]
        |       +-[[Legacy:FractalTexture|FractalTexture]]
        |           +-[[Legacy:FireTexture|FireTexture]]
        |           +-[[Legacy:IceTexture|IceTexture]]
        |           +-[[Legacy:WaterTexture|WaterTexture]]
        |               +-[[Legacy:FluidTexture|FluidTexture]]
        |               +-[[Legacy:WaveTexture|WaveTexture]]
        |               +-[[Legacy:WetTexture|WetTexture]]
        +-[[Legacy:ConstantMaterial|ConstantMaterial]]
        |   +-[[Legacy:ConstantColor|ConstantColor]]
        |   +-[[Legacy:FadeColor|FadeColor]]
        +-[[Legacy:ParticleMaterial|ParticleMaterial]]
        +-[[Legacy:ProjectorMaterial|ProjectorMaterial]]
        +-[[Legacy:Shader|Shader]]
        +-[[Legacy:TerrainMaterial|TerrainMaterial]]
        +-[[Legacy:VertexColor|VertexColor]]

==Related Topics ==
* [[Legacy:Texture Topics|Texture Topics]]
* [[udn2:MaterialTutorial]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5023</id>
      <timestamp>2003-05-04T10:54:20Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Material (Package: Engine)}}

The superclass of all texture-like objects that can be applied to surfaces or drawn on a [[Legacy:Canvas|Canvas]].

Any Material object can be [[Legacy:Creating Actors And Objects|created at runtime]] and used by script code (whereas in [[Legacy:UT|UT]] the attempt to do so crashed the game).  You can, however, set up a Material's properties only once per frame before the Material is drawn the first time that frame; subsequent property changes remain uneffective.

See also: [[Legacy:Material Context Menu|Material Context Menu]], [[Legacy:Topics On Materials|Topics On Materials]] topic page

==Properties==

===Editable===
; Material FallbackMaterial : A fallback material.  Automatically used by the engine if the user's video card cannot cope with a complex shader construction used in this material.
; ESurfaceTypes SurfaceType : Type of surface (see &lt;code&gt;ESurfaceTypes&lt;/code&gt; enum below).

===Internal===
; Material DefaultMaterial :  
The default material goes by the intuitive name DefaultTexture. [[Image:Legacy_DefaultTexture.jpeg|center|The default texture.]]

; bool UseFallback (transient, const) : Render device should use the fallback.
; bool Validated (transient, const) : Material has been validated as renderable.

==Enums==
* [[Legacy:ESurfaceTypes|ESurfaceTypes]]

==Methods==
; Reset ( ) : Resets the material. The material class's Reset method only calls the FallbackMaterial's Reset method.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the material. The material class's Trigger method method only triggers the FallbackMaterial.
; int MaterialUSize ( ) [native] : Returns the width of the material.
; int MaterialVSize ( ) [native] : Returns the height of the material.

==Known Subclasses ==
 [[Legacy:Material|Material]]
    +-[[Legacy:Combiner|Combiner]]
    +-[[Legacy:Modifier|Modifier]]
    |     +-[[Legacy:ColorModifier|ColorModifier]]
    |     +-[[Legacy:FinalBlend|FinalBlend]]
    |     +-[[Legacy:MaterialSequence|MaterialSequence]]
    |     +-[[Legacy:MaterialSwitch|MaterialSwitch]]
    |     +-[[Legacy:OpacityModifier|OpacityModifier]]
    |     +-[[Legacy:TexModifier|TexModifier]]
    |           +-[[Legacy:TexCoordSource|TexCoordSource]]
    |           +-[[Legacy:TexEnvMap|TexEnvMap]]
    |           +-[[Legacy:TexMatrix|TexMatrix]]
    |           +-[[Legacy:TexOscillator|TexOscillator]]
    |           |     +-[[Legacy:TexOscillatorTriggered|TexOscillatorTriggered]]
    |           +-[[Legacy:TexPanner|TexPanner]]
    |           |     +-[[Legacy:TexPannerTriggered|TexPannerTriggered]]
    |           +-[[Legacy:TexRotator|TexRotator]]
    |           +-[[Legacy:TexScaler|TexScaler]]
    +-[[Legacy:RenderedMaterial|RenderedMaterial]]
          +-[[Legacy:BitmapMaterial|BitmapMaterial]]
          |     +-[[Legacy:ScriptedTexture|ScriptedTexture]]
          |     +-[[Legacy:ShadowBitmapMaterial|ShadowBitmapMaterial]]
          |     +-[[Legacy:Texture|Texture]]
          |           +-[[Legacy:Cubemap|Cubemap]]
          |           +-[[Legacy:FractalTexture|FractalTexture]]
          |                 +-[[Legacy:FireTexture|FireTexture]]
          |                 +-[[Legacy:IceTexture|IceTexture]]
          |                 +-[[Legacy:WaterTexture|WaterTexture]]
          |                       +-[[Legacy:FluidTexture|FluidTexture]]
          |                       +-[[Legacy:WaveTexture|WaveTexture]]
          |                       +-[[Legacy:WetTexture|WetTexture]]
          +-[[Legacy:ConstantMaterial|ConstantMaterial]]
          +-[[Legacy:ParticleMaterial|ParticleMaterial]]
          +-[[Legacy:ProjectorMaterial|ProjectorMaterial]]
          +-[[Legacy:Shader|Shader]]
          +-[[Legacy:TerrainMaterial|TerrainMaterial]]
          +-[[Legacy:VertexColor|VertexColor]]

==Related Topics ==
* [[Legacy:Texture Topics|Texture Topics]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5024</id>
      <timestamp>2004-03-15T19:55:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; Material (Package: Engine)}}

The superclass of all texture-like objects that can be applied to surfaces or drawn on a [[Legacy:Canvas|Canvas]].

Any Material object can be [[Legacy:Creating Actors And Objects|created at runtime]] and used by script code (whereas in [[Legacy:UT|UT]] the attempt to do so crashed the game).  You can, however, set up a Material's properties only once per frame before the Material is drawn the first time that frame; subsequent property changes remain uneffective.

See also: [[Legacy:Material Context Menu|Material Context Menu]], [[Legacy:Topics On Materials|Topics On Materials]] topic page

==Properties==

===Editable===
; Material FallbackMaterial : A fallback material.  Automatically used by the engine if the user's video card cannot cope with a complex shader construction used in this material.
; ESurfaceTypes SurfaceType : Type of surface, see [[Legacy:ESurfaceTypes|ESurfaceTypes]].

===Internal===

[[Image:Legacy_DefaultTexture.jpeg|right|The default texture.]]
; Material DefaultMaterial : The default material goes by the intuitive name DefaultMaterial.
; bool UseFallback (transient, const) : Render device should use the fallback.
; bool Validated (transient, const) : Material has been validated as renderable.

==Methods==
; Reset ( ) : Resets the material. The material class's Reset method only calls the FallbackMaterial's Reset method.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the material. The material class's Trigger method method only triggers the FallbackMaterial.
; int MaterialUSize ( ) [native] : Returns the width of the material.
; int MaterialVSize ( ) [native] : Returns the height of the material.

==Known Subclasses ==
 [[Legacy:Material|Material]]
    +-[[Legacy:Combiner|Combiner]]
    +-[[Legacy:Modifier|Modifier]]
    |   +-[[Legacy:ColorModifier|ColorModifier]]
    |   +-[[Legacy:FinalBlend|FinalBlend]]
    |   +-[[Legacy:MaterialSequence|MaterialSequence]]
    |   +-[[Legacy:MaterialSwitch|MaterialSwitch]]
    |   +-[[Legacy:OpacityModifier|OpacityModifier]]
    |   +-[[Legacy:TexModifier|TexModifier]]
    |       +-[[Legacy:TexCoordSource|TexCoordSource]]
    |       +-[[Legacy:TexEnvMap|TexEnvMap]]
    |       +-[[Legacy:TexMatrix|TexMatrix]]
    |       +-[[Legacy:TexOscillator|TexOscillator]]
    |       |   +-[[Legacy:TexOscillatorTriggered|TexOscillatorTriggered]]
    |       +-[[Legacy:TexPanner|TexPanner]]
    |       |   +-[[Legacy:TexPannerTriggered|TexPannerTriggered]]
    |       +-[[Legacy:TexRotator|TexRotator]]
    |       +-[[Legacy:TexScaler|TexScaler]]
    +-[[Legacy:RenderedMaterial|RenderedMaterial]]
        +-[[Legacy:BitmapMaterial|BitmapMaterial]]
        |   +-[[Legacy:ScriptedTexture|ScriptedTexture]]
        |   +-[[Legacy:ShadowBitmapMaterial|ShadowBitmapMaterial]]
        |   +-[[Legacy:Texture|Texture]]
        |       +-[[Legacy:Cubemap|Cubemap]]
        |       +-[[Legacy:FractalTexture|FractalTexture]]
        |           +-[[Legacy:FireTexture|FireTexture]]
        |           +-[[Legacy:IceTexture|IceTexture]]
        |           +-[[Legacy:WaterTexture|WaterTexture]]
        |               +-[[Legacy:FluidTexture|FluidTexture]]
        |               +-[[Legacy:WaveTexture|WaveTexture]]
        |               +-[[Legacy:WetTexture|WetTexture]]
        +-[[Legacy:ConstantMaterial|ConstantMaterial]]
        |   +-[[Legacy:ConstantColor|ConstantColor]]
        |   +-[[Legacy:FadeColor|FadeColor]]
        +-[[Legacy:ParticleMaterial|ParticleMaterial]]
        +-[[Legacy:ProjectorMaterial|ProjectorMaterial]]
        +-[[Legacy:Shader|Shader]]
        +-[[Legacy:TerrainMaterial|TerrainMaterial]]
        +-[[Legacy:VertexColor|VertexColor]]

==Related Topics ==
* [[Legacy:Texture Topics|Texture Topics]]
* [[udn2:MaterialTutorial]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Material (UT3)</title>
    <id>28633</id>
    <revision>
      <id>40489</id>
      <timestamp>2010-01-14T08:57:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Material Context Menu</title>
    <id>2070</id>
    <revision>
      <id>5042</id>
      <timestamp>2007-07-08T01:49:45Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the reference page for the context menu which appears when a [[Legacy:Material|material]] in the [[Legacy:Texture Browser|Texture Browser]] is right-clicked.

; Properties : Opens the [[Legacy:Material Properties|Material Properties]] window.
; Duplicate : Lets you make a copy of this material, in the same package or elsewhere
; Rename : Rename the material.  It's safe to use this command on materials that are used by other combining materials (and things in the map): references to the material you rename are all updated. You can also move it to a different group in the package.

; Remove from level: Removed all associations with the selected [[Legacy:Material|material]] from the level currently open.

; Detail Hack: No idea!

; Compress : Apply [[Legacy:Texture Compression|texture compression]].

; Export to file ...: Exports the material to a normal graphics file on your hard drive. You can then edit it in a [[Legacy:Graphics Application|graphics application]].

; Delete : Delete the selected material from the package.

==Related Topics==
* Other [[Legacy:UnrealEd Menus|UnrealEd Menus]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5043</id>
      <timestamp>2004-03-15T10:33:53Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is the reference page for the context menu which appears when a [[Legacy:Material|material]] in the [[Legacy:Texture Browser|Texture Browser]] is right-clicked.

; Properties : opens the [[Legacy:Material Properties|Material Properties]] window
; Duplicate : Lets you make a copy of this material, in the same package or elsewhere
; Rename : Rename the material.  It's safe to use this command on materials that are used by other combining materials (and things in the map): references to the material you rename all &quot;catch up&quot;. You can also move it to a different group in the package.

; Remove from level:

; Detail Hack: No idea!

; Compress : apply [[Legacy:Texture Compression|texture compression]]

; Export to file ...: Exports the material to a normal graphics file on your hard drive. You can then edit it in a [[Legacy:Graphics Application|graphics application]].

; Delete : Delete the material

==Related Topics==
* Other [[Legacy:UnrealEd Menus|UnrealEd Menus]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MaterialFactory</title>
    <id>2234</id>
    <revision>
      <id>5401</id>
      <timestamp>2006-06-24T20:58:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; MaterialFactory (Package: Editor)}}

Abstract base class for material factories. Subclasses of this class are used in UnrealEd 3 to create non-[[Legacy:Texture|Texture]] [[Legacy:Material|Material]]s. Non-abstract subclasses of this class are displayed in the Class drop-down list of UnrealEd's '''New Material''' dialog window ([[Legacy:Texture Browser Menu|Texture Browser Menu]] File -&gt; New...)

==Properties==
; string Description : A description of the type of material created by this material factory. This description 

==Methods==
; ConsoleCommand(string Cmd) [native] : Similar to the ConsoleCommand() functions in the [[Legacy:Actor|Actor]] and [[Legacy:Interaction|Interaction]] classes, but doesn't return anything.

; [[Legacy:Material|Material]] CreateMaterial([[Legacy:Object|Object]] InOuter, string InPackage, string InGroup, string InName) : Called by the editor engine when the user presses the '''New''' button in the '''New Material''' dialog window. This function should be overridden to somehow create a new [[Legacy:Material|Material]] object in the package ''InPackage'', group ''InGroup'', with the name ''InName'' according to the parameters in the selected subclass. See [[Legacy:RawMaterialFactory|RawMaterialFactory]] and [[Legacy:FractalTextureFactory|FractalTextureFactory]] for two examples, how this may work. ''InOuter'' is a reference to the package or group (actually a package contained in another package) object the new material should be created in. UnrealEd automatically opens the properties window for the material returned by this function.

==Known Subclasses==
* [[Legacy:RawMaterialFactory|RawMaterialFactory]]
* [[Legacy:FractalTextureFactory|FractalTextureFactory]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5402</id>
      <timestamp>2006-06-24T18:28:02Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:MaterialFactory|MaterialFactory]]}}

==Constants==
; RF_Standalone = 0x00080000 : 

==Properties==
; string Description : 

==Functions==
;  ConsoleCommand(string Cmd ): 

==Events==
; Material CreateMaterial(Object InOuter, string InPackage, string InGroup, string InName ):</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MaterialInstance</title>
    <id>28623</id>
    <revision>
      <id>40479</id>
      <timestamp>2010-01-14T08:54:59Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MaterialSequence</title>
    <id>2064</id>
    <revision>
      <id>5027</id>
      <timestamp>2008-03-21T03:01:55Z</timestamp>
      <contributor>
        <ip>Cpe-76-168-205-5.socal.res.rr.com</ip>
      </contributor>
      <comment>Fisholith: I found a scaling solution for the material sequences on BSP.</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:Modifier|Modifier]] &gt;&gt; MaterialSequence (Package: Engine)}}

==Properties ==

===MaterialSequence Group ===
; bool Loop : Whether the sequence should be repeated once it finished.
; bool Paused : Whether the sequence is currently stoppen.
; array&lt;MaterialSequenceItem&gt; SequenceItems : 
; EMaterialSequenceTriggerActon TriggerAction : What to do when the MaterialSequence is triggered.

===UnrealScript-Only Properties ===
; float CurrentTime (transient) :  
; float LastTime (transient) :  
; float TotalTime :  

==Structs ==

===MaterialSequenceItem ===

&lt;uscript&gt;
struct native MaterialSequenceItem
{
	var() editinlineuse Material Material;
	var() float Time;
	var() EMaterialSequenceAction Action;
};
&lt;/uscript&gt;
; [[Legacy:Material|Material]] Material : The material to fade in or display.
; float Time : How long the material is displayed or how long it takes to blend over from the previous material.
; EMaterialSequenceAction Action : Whether to crossfade to this material or to just display it.

==Enums ==

===EMaterialSequenceAction ===
;MSA_ShowMaterial : Just display this material.
;MSA_FadeToMaterial : Crossfade from the previous material to this material.

===EMaterialSequenceTriggerActon ===
;MSTA_Ignore : Not triggerable.
;MSTA_Reset : Reset the MaterialSequence.
;MSTA_Pause : Toggle between stopping and playing the sequence.
;MSTA_Stop : Stop the sequence.

==Methods ==

===Inherited From [[Legacy:Material|Material]] ===
; Reset ( ) : Resets the MaterialSequence and restores the default value of &lt;code&gt;Paused&lt;/code&gt;.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the MaterialSequence according to the value of the &lt;code&gt;Action&lt;/code&gt; property. (see EMaterialSequenceTriggerActon enum above)

----

'''Unfallzeuge:''' I just found out, that material-sequences only work on static meshes and NOT on brushes - (you'll see just a solid colour). Take care that the orientation of your polygons (of your mesh) is right, flip them or make a 2-sided material to show the material-sequence properly.

'''LionsPhil:''' Actually, if you get the camera ''reeeally close'', it appears that the scaling goes all wrong in the game and you get many tiny repetitions of your texture (as if you'd set the scale to some very small number). Bizzarely, it's fine in the editor itself.

'''Fisholith:''' Solution! After playing around with the use of material sequences on BSP in a level, I found that if you scale them by x1024 they look exactly like a x1 scale normal texture. That is to say, whatever normal texture-scale you want a &quot;Material Sequence&quot; texture to appear at, (e.g. 0.5), just multiply that number by 1024, and use the resulting value to scale the material sequence texture (e.g. 0.5 * 1024 = 512). I hope this helps out. Take care everyone. 
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5028</id>
      <timestamp>2005-10-22T15:59:11Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <comment>MaterialSequences on BSP.</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; [[Legacy:Modifier|Modifier]] &gt;&gt; MaterialSequence (Package: Engine)}}

==Properties ==

===MaterialSequence Group ===
; bool Loop : Whether the sequence should be repeated once it finished.
; bool Paused : Whether the sequence is currently stoppen.
; array&lt;MaterialSequenceItem&gt; SequenceItems : 
; EMaterialSequenceTriggerActon TriggerAction : What to do when the MaterialSequence is triggered.

===UnrealScript-Only Properties ===
; float CurrentTime (transient) :  
; float LastTime (transient) :  
; float TotalTime :  

==Structs ==

===MaterialSequenceItem ===

&lt;uscript&gt;
struct native MaterialSequenceItem
{
	var() editinlineuse Material Material;
	var() float Time;
	var() EMaterialSequenceAction Action;
};
&lt;/uscript&gt;
; [[Legacy:Material|Material]] Material : The material to fade in or display.
; float Time : How long the material is displayed or how long it takes to blend over from the previous material.
; EMaterialSequenceAction Action : Whether to crossfade to this material or to just display it.

==Enums ==

===EMaterialSequenceAction ===
;MSA_ShowMaterial : Just display this material.
;MSA_FadeToMaterial : Crossfade from the previous material to this material.

===EMaterialSequenceTriggerActon ===
;MSTA_Ignore : Not triggerable.
;MSTA_Reset : Reset the MaterialSequence.
;MSTA_Pause : Toggle between stopping and playing the sequence.
;MSTA_Stop : Stop the sequence.

==Methods ==

===Inherited From [[Legacy:Material|Material]] ===
; Reset ( ) : Resets the MaterialSequence and restores the default value of &lt;code&gt;Paused&lt;/code&gt;.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the MaterialSequence according to the value of the &lt;code&gt;Action&lt;/code&gt; property. (see EMaterialSequenceTriggerActon enum above)

----

'''Unfallzeuge:''' I just found out, that material-sequences only work on static meshes and NOT on brushes - (you'll see just a solid colour). Take care that the orientation of your polygons (of your mesh) is right, flip them or make a 2-sided material to show the material-sequence properly.

'''LionsPhil:''' Actually, if you get the camera ''reeeally close'', it appears that the scaling goes all wrong in the game and you get many tiny repetitions of your texture (as if you'd set the scale to some very small number). Bizzarely, it's fine in the editor itself.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MaterialSwitch</title>
    <id>28364</id>
    <revision>
      <id>40032</id>
      <timestamp>2009-11-15T07:55:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MaterialTrigger</title>
    <id>2099</id>
    <revision>
      <id>5113</id>
      <timestamp>2008-03-25T19:51:46Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &gt;&gt; MaterialTrigger (Package: Engine)}}

A MaterialTrigger triggers all associated [[Legacy:Material|Material]]s.  While any Material can be triggered only some of them (e.g. [[Legacy:MaterialSwitch|MaterialSwitch]] or [[Legacy:MaterialSequence|MaterialSequence]]) actually show a reaction.

'''Note:''' This class does not work for network clients. See [[Legacy:ClientMaterialTrigger|ClientMaterialTrigger]] for a fix.

==Properties==
; array&lt;[[Legacy:Material|Material]]&gt; MaterialsToTrigger : All materials that should be triggered by this MaterialTrigger.

==Known Subclasses==
* [[Legacy:ClientMaterialTrigger|ClientMaterialTrigger]] (custom)

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Dynamics|Dynamics]]

==Discussion==

'''SuperApe:''' If you need this to work online, I highly recommend Wormbo's ClientMaterialTrigger, linked above.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5114</id>
      <timestamp>2003-05-25T14:12:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers|Triggers]] &gt;&gt; MaterialTrigger (Package: Engine)}}

A MaterialTrigger triggers all associated [[Legacy:Material|Material]]s. While any Material can be triggered only some of them (e.g. [[Legacy:MaterialSwitch|MaterialSwitch]] or [[Legacy:MaterialSequence|MaterialSequence]]) actually show a reaction.

'''Note:''' This class does not work for network clients. See [[Legacy:ClientMaterialTrigger|ClientMaterialTrigger]] for a fix.

==Properties==
; array&lt;[[Legacy:Material|Material]]&gt; MaterialsToTrigger : All materials that should be triggered by this MaterialTrigger.

==Known Subclasses==
* [[Legacy:ClientMaterialTrigger|ClientMaterialTrigger]] (custom)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5115</id>
      <timestamp>2005-12-03T00:18:25Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &gt;&gt; MaterialTrigger (Package: Engine)}}

A MaterialTrigger triggers all associated [[Legacy:Material|Material]]s.  While any Material can be triggered only some of them (e.g. [[Legacy:MaterialSwitch|MaterialSwitch]] or [[Legacy:MaterialSequence|MaterialSequence]]) actually show a reaction.

'''Note:''' This class does not work for network clients. See [[Legacy:ClientMaterialTrigger|ClientMaterialTrigger]] for a fix.

==Properties==
; array&lt;[[Legacy:Material|Material]]&gt; MaterialsToTrigger : All materials that should be triggered by this MaterialTrigger.

==Known Subclasses==
* [[Legacy:ClientMaterialTrigger|ClientMaterialTrigger]] (custom)

==Related Topics==
* [[Legacy:Texture Topics|Texture Topics]]
* [[Legacy:Dynamics|Dynamics]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Matinee</title>
    <id>2036</id>
    <revision>
      <id>4965</id>
      <timestamp>2006-05-04T00:29:34Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Matinee''' is a tool in [[Legacy:UT2003|UT200x]] which allows complex camera scenes to be scripted: level fly by, scripted sequences, cinematics etc. 

Notes: 
* All the information here is based upon the [[Legacy:XIIIEd|XIIIEd]]. This editor uses unreal engine build 829. Things '''might''' be different in higher versions :/
* I found Matinee to be very crash-sensitive. So while you're learning the basics it might crash a few times. I suggest you save often ;)

==Introduction==

Every level can have multiple (cut)scenes. Each scene is divided in several actions and each action can be divided in several subactions.

There are these possible actions:
; ActionPause : This will pause the camera or actor at the interpolation point or actor you set, for the time you set.
; ActionMoveCamera : This will move the camera/object from one interpolation point, or other actor, to another.

There are these possible subactions:
; SubActionSceneSpeed : Speed up or slow down camera movement speed.
; SubActionGameSpeed : Speed up or slow down game speed.
; SubActionOrientation : Changes the camera orientation.
; SubActionFOV : Changes the Field Of View.
; SubActionTrigger : Triggers an Event (I can't get this to work needs a more detailed explanation from an expert)
; SubActionFade : Fades the screen, in or out.

==Simple Tutorial (flyby) ==

Open your level. Click the &quot;Matinee&quot; button in the [[Legacy:Toolbox|toolbox]] (next to the Terrain Editing one). You'll get a new window and here is where it will all happen ;)

While in the &quot;Scene&quot;-tab, click &quot;Add new Scene&quot;. The list below will now show a scene. Select the newly created scene by clicking on that scene in the list box.

Before we can add any usefull actions we'll need some Interpolation Points in the level. This is done with the use of the last tab, called &quot;Tools&quot;. I add Interpolation Points like this:
#Activate the 3D-view.
#Move the camera to the &quot;starting point&quot; of the cutscene.
#Click &quot;Add Interpolation Point&quot;. An Interpolation Point will be added at the exact postion and orientation as the camera is right now.
#Move to the next keypoint in the cutscene.
#Click &quot;Add Interpolation Point&quot;.
*...

Once your Interpolation Points are in the level, you need to go to the &quot;Actions&quot; tab. Click &quot;Add New Action&quot; and you'll be given a choice between ActionPause and ActionMoveCamera. Choose ActionMoveCamera and an Action should be added to the list. If not then make sure that the scene is selected (in the Scenes-tab). Select the newly created Action. Open the &quot;MatAction&quot;-subsection of it's properties. Now you need to select the first Interpolation Point of your scene in a 2D-view. Once selected, select IntPoint in the Action's Properties and click Use. Seeing as this is the first Action, you don't need to change any of the other properties. Do check that the Duration (under Time) is set to 0.

Now add another ActionMoveCamera Action. In it's IntPoint property set the second Interpolation Point and a line should appear between the first Point and the second. Under Time-&gt;Duration you need to set how long it should take to go from point1 to point2. Make SURE it's set to sumtin other then 0 because otherwise the Editor will crash when you preview it. Under Path you might wanna change the PathStyle from Linear to Bezier (the line will change to a curve). This will allow you to smooth the flyby by moving the two control-points (those two big white circles) around.

Now you should continue adding new actions until every Interpolation Point you added is covered.

After that is done, you can click the &quot;Open a Preview Window&quot; button. Click &quot;Play Forwards&quot; to view your newly created flyby. If you did it all correctly :)

Now if you want the cutscene to be seen ingame, you'll need to add a trigger which simply triggers the cutscene.

This explains the very basics of Matinee.

==Detail==

Now we'll explain everything in more detail. We'll go over each tab in great details.

===Scene ===

[[Image:Legacy_matinee1.jpeg|right|The Scene tab]]

Here you create every scene you'll have in your level.

The buttons allow you to create a new scene, duplicate an existing scene, delete a scene and open a preview window.
; New Scene : Create a new blank scene in your level.
; Duplicate Scene : Duplicates the selected scene so there is an exact copy of it.
; Delete Scene : Delete the select scene from the level. (Note: There is no confirmation for this action, so be carefull not to press this button by accident ;))
; Open a Preview Window : Open a new window which allows you to preview your matinee-scenes.

In  this tab you can also set some properties for each scene individually. These settings can be found in the [[Legacy:SceneManager|SceneManager]] subsection.
; Actions : This allows you the manage all the actions in this scene, but I find it easier to manage the actions trough the Actions-tab.
; Affect : Here you have two options
;; AFFECT_ViewportCamera : This is for your standard flyby. The camera will move along the path of this scene.
;; AFFECT_Actor : With this you can have a mesh in your level follow the path of this scene.
; AffectActor : If the Affect-tag is set to AFFECT_Actor, then you can set which actor is affected with this tag. The actor which you want to follow the path must have &quot;bStatic=False&quot;! Also the object/actor seems to loose it's collision once it starts moving :(
; bCinematicView : When set to true, the screen will be cinematicview, as in widescreen.
; bLooping : When set true, the scene will loop. However it seemed to crash the game when I tried it.

===Action ===

[[Image:Legacy_matinee2.jpeg|right|The Action tab]]
*to come*

====ActionPause ====

====ActionMoveCamera ====

===SubAction ===

[[Image:Legacy_matinee3.jpeg|right|The SubAction tab]]
*to come*

====SubActionSceneSpeed ====

====SubActionGameSpeed ====

====SubActionOrientation ====

====SubActionFOV ====

====SubActionTrigger ====

====SubActionFade ====

===Tools ===

[[Image:Legacy_matinee4.jpeg|right|The Tools tab]]

====Add Interpolation Point ====

If a 2D-view is active and you push this button, then an Interpolation Point will be added at the center of the view. On the other hand if the 3D-view is active and you push the button, then an Interpolation Point will be added at the exact same position and orientation as the camera is in the 3D-view.

====Add LookTarget ====

If you want the camera to look at something which isn't really an actor, then you can use these. Simply add them where you want the camera to look at and use these actors in the LookAt-tag of the SubAction. For the addition of these actors, the same rules apply as with the Interpolation Point.

==Related Topics==
* [[Legacy:Topics On Mapping|Topics On Mapping]]
** [[Legacy:Mapping For AS|Mapping for AS]]
* [[Legacy:SceneManager|SceneManager]]
* [[Legacy:XIntroPawn|xIntroPawn]]
* [[Legacy:Trigger Systems|Trigger Systems]]

==Discussion==

====ToDo====
* Explain the subactions.
* Explain ActionPause.
*...

I've found a german tutorial for another matinee-tool: http://unrealed.planet-multiplayer.de/index.php?P=tutorial&amp;D=2-matinee-tool-1 but it's not working at all :(

'''ProjectX:''' He he, whenever i add a subaction UED crashes, i think i'm public enemy #1 with the UED Goblin, lol, i have so many crashes. Also, is there a way to set it that the matinee plays when you load the level, cos when i load my level, it just starts at the player starts.

UPDATE- To cause a movie to be played at the start of the level, set the player start's event to the name of the scene.

----

Update for UT2003 v2225

'''Foxpaw:''' As far as I can tell, Matinee is no different in UT2003 than it was in XIIIEd, with the exception of an additional tool button that automatically adds an action for you instead of you having to add one separately after clicking add interpolation point, so the [[:Category:Legacy To Do]] should maybe just be changed to a [[:Category:Legacy Refactor Me]].

Interpolation Points &amp;ndash; is that an [[Legacy:InterpolationPoint|InterpolationPoint]] actor? if so, plase link &amp;ndash; no, I meant in the actual article above! and don't pipe it &amp;ndash; if it's the name of a class, it should appear as it does in script!

'''MadNad''' I've heard rumors that someone had this working online??? Any truth to that?

'''DaveA''' Define 'this'. Do you mean this: www.unrealroc.com ?

----

[[:Category:Legacy To Do]] &amp;ndash; Refactor?
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4966</id>
      <timestamp>2004-03-10T00:16:31Z</timestamp>
      <contributor>
        <ip>12.144.246.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Matinee''' is a new tool in [[Legacy:UT2003|UT2003]] which allows complex camera scenes to be scripted: level fly by, scripted sequences, cinematics etc. 

Notes: 
* All the information here is based upon the [[Legacy:XIIIEd|XIIIEd]]. This editor uses unreal engine build 829. Things '''might''' be different in higher versions :/
* I found Matinee to be very crash-sensitive. So while you're learning the basics it might crash a few times. I suggest you save often ;)

==Quick Introduction ==

Every level can have multiple (cut)scenes. Each scene is divided in several actions and each action can be divided in several subactions.

There are these possible actions:
; ActionPause : This will pause the camera or actor at the interpolation point or actor you set, for the time you set.
; ActionMoveCamera : This will move the camera/object from one interpolation point, or other actor, to another.

There are these possible subactions:
; SubActionSceneSpeed : Speed up or slow down camera movement speed.
; SubActionGameSpeed : Speed up or slow down game speed.
; SubActionOrientation : Changes the camera orientation.
; SubActionFOV : Changes the Field Of View.
; SubActionTrigger : Triggers an Event (I can't get this to work needs a more detailed explanation from an expert)
; SubActionFade : Fades the screen, in or out.

==Simple Tutorial (flyby) ==

Open your level. Click the &quot;Matinee&quot; button in the [[Legacy:Toolbox|toolbox]] (next to the Terrain Editing one). You'll get a new window and here is where it will all happen ;)

While in the &quot;Scene&quot;-tab, click &quot;Add new Scene&quot;. The list below will now show a scene. Select the newly created scene by clicking on that scene in the list box.

Before we can add any usefull actions we'll need some Interpolation Points in the level. This is done with the use of the last tab, called &quot;Tools&quot;. I add Interpolation Points like this:
#Activate the 3D-view.
#Move the camera to the &quot;starting point&quot; of the cutscene.
#Click &quot;Add Interpolation Point&quot;. An Interpolation Point will be added at the exact postion and orientation as the camera is right now.
#Move to the next keypoint in the cutscene.
#Click &quot;Add Interpolation Point&quot;.
*...

Once your Interpolation Points are in the level, you need to go to the &quot;Actions&quot; tab. Click &quot;Add New Action&quot; and you'll be given a choice between ActionPause and ActionMoveCamera. Choose ActionMoveCamera and an Action should be added to the list. If not then make sure that the scene is selected (in the Scenes-tab). Select the newly created Action. Open the &quot;MatAction&quot;-subsection of it's properties. Now you need to select the first Interpolation Point of your scene in a 2D-view. Once selected, select IntPoint in the Action's Properties and click Use. Seeing as this is the first Action, you don't need to change any of the other properties. Do check that the Duration (under Time) is set to 0.

Now add another ActionMoveCamera Action. In it's IntPoint property set the second Interpolation Point and a line should appear between the first Point and the second. Under Time-&gt;Duration you need to set how long it should take to go from point1 to point2. Make SURE it's set to sumtin other then 0 because otherwise the Editor will crash when you preview it. Under Path you might wanna change the PathStyle from Linear to Bezier (the line will change to a curve). This will allow you to smooth the flyby by moving the two control-points (those two big white circles) around.

Now you should continue adding new actions until every Interpolation Point you added is covered.

After that is done, you can click the &quot;Open a Preview Window&quot; button. Click &quot;Play Forwards&quot; to view your newly created flyby. If you did it all correctly :)

Now if you want the cutscene to be seen ingame, you'll need to add a trigger which simply triggers the cutscene.

This explains the very basics of Matinee.

==Detail==

Now we'll explain everything in more detail. We'll go over each tab in great details.

===Scene ===

[[Image:Legacy_matinee1.jpeg|right|The Scene tab]]

Here you create every scene you'll have in your level.

The buttons allow you to create a new scene, duplicate an existing scene, delete a scene and open a preview window.
; New Scene : Create a new blank scene in your level.
; Duplicate Scene : Duplicates the selected scene so there is an exact copy of it.
; Delete Scene : Delete the select scene from the level. (Note: There is no confirmation for this action, so be carefull not to press this button by accident ;))
; Open a Preview Window : Open a new window which allows you to preview your matinee-scenes.

In  this tab you can also set some properties for each scene individually. These settings can be found in the [[Legacy:SceneManager|SceneManager]] subsection.
; Actions : This allows you the manage all the actions in this scene, but I find it easier to manage the actions trough the Actions-tab.
; Affect : Here you have two options
;; AFFECT_ViewportCamera : This is for your standard flyby. The camera will move along the path of this scene.
;; AFFECT_Actor : With this you can have a mesh in your level follow the path of this scene.
; AffectActor : If the Affect-tag is set to AFFECT_Actor, then you can set which actor is affected with this tag. The actor which you want to follow the path must have &quot;bStatic=False&quot;! Also the object/actor seems to loose it's collision once it starts moving :(
; bCinematicView : When set to true, the screen will be cinematicview, as in widescreen.
; bLooping : When set true, the scene will loop. However it seemed to crash the game when I tried it.

===Action ===

[[Image:Legacy_matinee2.jpeg|right|The Action tab]]
*to come*

====ActionPause ====

====ActionMoveCamera ====

===SubAction ===

[[Image:Legacy_matinee3.jpeg|right|The SubAction tab]]
*to come*

====SubActionSceneSpeed ====

====SubActionGameSpeed ====

====SubActionOrientation ====

====SubActionFOV ====

====SubActionTrigger ====

====SubActionFade ====

===Tools ===

[[Image:Legacy_matinee4.jpeg|right|The Tools tab]]

====Add Interpolation Point ====

If a 2D-view is active and you push this button, then an Interpolation Point will be added at the center of the view. On the other hand if the 3D-view is active and you push the button, then an Interpolation Point will be added at the exact same position and orientation as the camera is in the 3D-view.

====Add LookTarget ====

If you want the camera to look at something which isn't really an actor, then you can use these. Simply add them where you want the camera to look at and use these actors in the LookAt-tag of the SubAction. For the addition of these actors, the same rules apply as with the Interpolation Point.

===ToDo ===
* Explain the subactions.
* Explain ActionPause.
*...

===Comments ===

I've found a german tutorial for another matinee-tool: http://unrealed.planet-multiplayer.de/index.php?P=tutorial&amp;D=2-matinee-tool-1 but it's not working at all :(

'''ProjectX:''' He he, whenever i add a subaction UED crashes, i think i'm public enemy #1 with the UED Goblin, lol, i have so many crashes. Also, is there a way to set it that the matinee plays when you load the level, cos when i load my level, it just starts at the player starts.

UPDATE- To cause a movie to be played at the start of the level, set the player start's event to the name of the scene.

----

[[:Category:Legacy To Do]] &amp;ndash; Update for UT2003 v2225

'''Foxpaw:''' As far as I can tell, Matinee is no different in UT2003 than it was in XIIIEd, with the exception of an additional tool button that automatically adds an action for you instead of you having to add one separately after clicking add interpolation point, so the [[:Category:Legacy To Do]] should maybe just be changed to a [[:Category:Legacy Refactor Me]].

Interpolation Points &amp;ndash; is that an [[Legacy:InterpolationPoint|InterpolationPoint]] actor? if so, plase link &amp;ndash; no, I meant in the actual article above! and don't pipe it &amp;ndash; if it's the name of a class, it should appear as it does in script!

'''MadNad''' I've heard rumors that someone had this working online??? Any truth to that?
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4967</id>
      <timestamp>2004-08-05T08:50:52Z</timestamp>
      <contributor>
        <ip>C-67-170-242-238.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Matinee''' is a new tool in [[Legacy:UT2003|UT2003]] which allows complex camera scenes to be scripted: level fly by, scripted sequences, cinematics etc. 

Notes: 
* All the information here is based upon the [[Legacy:XIIIEd|XIIIEd]]. This editor uses unreal engine build 829. Things '''might''' be different in higher versions :/
* I found Matinee to be very crash-sensitive. So while you're learning the basics it might crash a few times. I suggest you save often ;)

==Quick Introduction ==

Every level can have multiple (cut)scenes. Each scene is divided in several actions and each action can be divided in several subactions.

There are these possible actions:
; ActionPause : This will pause the camera or actor at the interpolation point or actor you set, for the time you set.
; ActionMoveCamera : This will move the camera/object from one interpolation point, or other actor, to another.

There are these possible subactions:
; SubActionSceneSpeed : Speed up or slow down camera movement speed.
; SubActionGameSpeed : Speed up or slow down game speed.
; SubActionOrientation : Changes the camera orientation.
; SubActionFOV : Changes the Field Of View.
; SubActionTrigger : Triggers an Event (I can't get this to work needs a more detailed explanation from an expert)
; SubActionFade : Fades the screen, in or out.

==Simple Tutorial (flyby) ==

Open your level. Click the &quot;Matinee&quot; button in the [[Legacy:Toolbox|toolbox]] (next to the Terrain Editing one). You'll get a new window and here is where it will all happen ;)

While in the &quot;Scene&quot;-tab, click &quot;Add new Scene&quot;. The list below will now show a scene. Select the newly created scene by clicking on that scene in the list box.

Before we can add any usefull actions we'll need some Interpolation Points in the level. This is done with the use of the last tab, called &quot;Tools&quot;. I add Interpolation Points like this:
#Activate the 3D-view.
#Move the camera to the &quot;starting point&quot; of the cutscene.
#Click &quot;Add Interpolation Point&quot;. An Interpolation Point will be added at the exact postion and orientation as the camera is right now.
#Move to the next keypoint in the cutscene.
#Click &quot;Add Interpolation Point&quot;.
*...

Once your Interpolation Points are in the level, you need to go to the &quot;Actions&quot; tab. Click &quot;Add New Action&quot; and you'll be given a choice between ActionPause and ActionMoveCamera. Choose ActionMoveCamera and an Action should be added to the list. If not then make sure that the scene is selected (in the Scenes-tab). Select the newly created Action. Open the &quot;MatAction&quot;-subsection of it's properties. Now you need to select the first Interpolation Point of your scene in a 2D-view. Once selected, select IntPoint in the Action's Properties and click Use. Seeing as this is the first Action, you don't need to change any of the other properties. Do check that the Duration (under Time) is set to 0.

Now add another ActionMoveCamera Action. In it's IntPoint property set the second Interpolation Point and a line should appear between the first Point and the second. Under Time-&gt;Duration you need to set how long it should take to go from point1 to point2. Make SURE it's set to sumtin other then 0 because otherwise the Editor will crash when you preview it. Under Path you might wanna change the PathStyle from Linear to Bezier (the line will change to a curve). This will allow you to smooth the flyby by moving the two control-points (those two big white circles) around.

Now you should continue adding new actions until every Interpolation Point you added is covered.

After that is done, you can click the &quot;Open a Preview Window&quot; button. Click &quot;Play Forwards&quot; to view your newly created flyby. If you did it all correctly :)

Now if you want the cutscene to be seen ingame, you'll need to add a trigger which simply triggers the cutscene.

This explains the very basics of Matinee.

==Detail==

Now we'll explain everything in more detail. We'll go over each tab in great details.

===Scene ===

[[Image:Legacy_matinee1.jpeg|right|The Scene tab]]

Here you create every scene you'll have in your level.

The buttons allow you to create a new scene, duplicate an existing scene, delete a scene and open a preview window.
; New Scene : Create a new blank scene in your level.
; Duplicate Scene : Duplicates the selected scene so there is an exact copy of it.
; Delete Scene : Delete the select scene from the level. (Note: There is no confirmation for this action, so be carefull not to press this button by accident ;))
; Open a Preview Window : Open a new window which allows you to preview your matinee-scenes.

In  this tab you can also set some properties for each scene individually. These settings can be found in the [[Legacy:SceneManager|SceneManager]] subsection.
; Actions : This allows you the manage all the actions in this scene, but I find it easier to manage the actions trough the Actions-tab.
; Affect : Here you have two options
;; AFFECT_ViewportCamera : This is for your standard flyby. The camera will move along the path of this scene.
;; AFFECT_Actor : With this you can have a mesh in your level follow the path of this scene.
; AffectActor : If the Affect-tag is set to AFFECT_Actor, then you can set which actor is affected with this tag. The actor which you want to follow the path must have &quot;bStatic=False&quot;! Also the object/actor seems to loose it's collision once it starts moving :(
; bCinematicView : When set to true, the screen will be cinematicview, as in widescreen.
; bLooping : When set true, the scene will loop. However it seemed to crash the game when I tried it.

===Action ===

[[Image:Legacy_matinee2.jpeg|right|The Action tab]]
*to come*

====ActionPause ====

====ActionMoveCamera ====

===SubAction ===

[[Image:Legacy_matinee3.jpeg|right|The SubAction tab]]
*to come*

====SubActionSceneSpeed ====

====SubActionGameSpeed ====

====SubActionOrientation ====

====SubActionFOV ====

====SubActionTrigger ====

====SubActionFade ====

===Tools ===

[[Image:Legacy_matinee4.jpeg|right|The Tools tab]]

====Add Interpolation Point ====

If a 2D-view is active and you push this button, then an Interpolation Point will be added at the center of the view. On the other hand if the 3D-view is active and you push the button, then an Interpolation Point will be added at the exact same position and orientation as the camera is in the 3D-view.

====Add LookTarget ====

If you want the camera to look at something which isn't really an actor, then you can use these. Simply add them where you want the camera to look at and use these actors in the LookAt-tag of the SubAction. For the addition of these actors, the same rules apply as with the Interpolation Point.

===ToDo ===
* Explain the subactions.
* Explain ActionPause.
*...

===Comments ===

I've found a german tutorial for another matinee-tool: http://unrealed.planet-multiplayer.de/index.php?P=tutorial&amp;D=2-matinee-tool-1 but it's not working at all :(

'''ProjectX:''' He he, whenever i add a subaction UED crashes, i think i'm public enemy #1 with the UED Goblin, lol, i have so many crashes. Also, is there a way to set it that the matinee plays when you load the level, cos when i load my level, it just starts at the player starts.

UPDATE- To cause a movie to be played at the start of the level, set the player start's event to the name of the scene.

----

[[:Category:Legacy To Do]] &amp;ndash; Update for UT2003 v2225

'''Foxpaw:''' As far as I can tell, Matinee is no different in UT2003 than it was in XIIIEd, with the exception of an additional tool button that automatically adds an action for you instead of you having to add one separately after clicking add interpolation point, so the [[:Category:Legacy To Do]] should maybe just be changed to a [[:Category:Legacy Refactor Me]].

Interpolation Points &amp;ndash; is that an [[Legacy:InterpolationPoint|InterpolationPoint]] actor? if so, plase link &amp;ndash; no, I meant in the actual article above! and don't pipe it &amp;ndash; if it's the name of a class, it should appear as it does in script!

'''MadNad''' I've heard rumors that someone had this working online??? Any truth to that?

'''DaveA''' Define 'this'. Do you mean this: www.unrealroc.com ?
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya</title>
    <id>1823</id>
    <revision>
      <id>4473</id>
      <timestamp>2007-10-05T00:36:47Z</timestamp>
      <contributor>
        <ip>P57A976C0.dip.t-dialin.net</ip>
      </contributor>
      <minor/>
      <comment>2007-10-04 DoomAbbey- read reply action on delete-after-read-tag</comment>
      <text xml:space="preserve">* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Level Designers Discuss what kind of tutorials you want to see written on this page
* [[Legacy:Maya FAQ|Maya FAQ]] &amp;ndash; Common problems experienced when using Maya to import into UnrealEd, with some solutions

'''Maya''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by Alias, now supported by [http://usa.autodesk.com/adsk/servlet/home?siteID=123112&amp;id=129446 Autodesk]. You can download [http://usa.autodesk.com/adsk/servlet/index?siteID=123112&amp;id=7639525 Maya 7.0 PLE] (Personal Learning Edition) for free from Autodesk's website. Maya 4.0.1 PLE was distributed with [[Legacy:UT2003|UT2003]] on CD#3 (see press release text below), but it's unclear whether a key will be issued for this older version. Note that [[Legacy:UT2004|UT2004]] comes with Maya 5.0 PLE in the &quot;\CD6\Extras&quot; directory on the DVD.

'''Note:''' Maya PLE is for NT-based versions of Windows ''only''. This means is only runs under Windows NT 4, 2000 and XP. For other applications that work under Windows 98/ME see [[Legacy:Topics On Modeling|Topics on Modeling]].

==Tutorials ==
* [[Legacy:Introduction To Maya|Introduction To Maya]]
* [[Legacy:Importing Models From Maya|Importing Models from Maya]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

(PlaceHolder Tutorial Organisation)
* Part I - Building A Polygonal Mesh In Maya
* Part II - Quick Look At Creating Materials Using Maya's Hypershade, Assigning Textures and Basic Planar/Cylindrical/Automatic Mapping
* Part III - Basic Lighting and Baking Lightmaps For Shadows
* Part IV - ActorX for Maya and Exporting Basics
* Part V - Animation Basics

==External Links==

===Web Resources===
* [http://www.highend3d.com highend3d.com - excellent tutorials and resources for Maya and other apps]
* [http://www.aliaswavefront.com/en/Community/Learn/how_tos/games/pre_light/index.html How to prelight a scene] '''blip2:''' broken link!
* [http://www.mesmer.com/books/mayaguntutorial.html Polygon Modeling Tutorial: Low Poly, High Powered Gun] 
* [http://www.thehobbitguy.com/tutorials/polymodeling/ Dave K's Poly Head Modeling Tutorial]
* [http://www.kniffen.ca/index.php?target=tutorials/texture/UV1.php Setting up UV's for a model in order to paint the textures] '''blip2:''' broken link!
* [http://scripts.zbufferstudios.com/mel/aseExporter.rar Maya script] Plugin to convert objects to .Ase

===Recommended Books ===
*[http://store.aliaswavefront.com/dr/v2/ec_MAIN.Entry10?V1=385089&amp;PN=1&amp;SP=10023&amp;xid=41107&amp;DSP=&amp;CUR=840&amp;PGRP=0&amp;CACHE_ID=0|Learning Maya | Games and Interactive]
*[http://store.aliaswavefront.com/dr/v2/ec_MAIN.Entry10?V1=405326&amp;PN=1&amp;SP=10023&amp;xid=41107&amp;DSP=&amp;CUR=840&amp;PGRP=0&amp;CACHE_ID=0|Maya Techniques | Polygon Texturing, Shading and Lighting DVD]
*[http://www.amazon.com/exec/obidos/tg/detail/-/0735711895/qid=1030853974/sr=8-1/ref=sr_8_1/102-7554483-2741717?v=glance&amp;s=books&amp;n=507846|Maya 4 Fundamentals : by Jim Lammers, Lee Gooding]
*[http://www.amazon.com/exec/obidos/tg/detail/-/0782128351/qid=1030854030/sr=1-1/ref=sr_1_1/102-7554483-2741717?v=glance&amp;s=books MasteringMaya 3]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Maya FAQ|Maya FAQ]]

===Maya Unreal Plugins===
* [[udn2:MayaCompletePlugins]]
* [[Legacy:ActorX|ActorX]]
* [[Legacy:UnEditor.Mll|unEditor.mll]]  NOTE: See this page if you're having trouble getting the added Scale attribute to work properly.

==Comments==

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4474</id>
      <timestamp>2007-09-13T02:04:25Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Level Designers Discuss what kind of tutorials you want to see written on this page
* [[Legacy:Maya FAQ|Maya FAQ]] &amp;ndash; Common problems experienced when using Maya to import into UnrealEd, with some solutions

'''Maya''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by Alias, now supported by [http://usa.autodesk.com/adsk/servlet/home?siteID=123112&amp;id=129446 Autodesk]. You can download [http://usa.autodesk.com/adsk/servlet/index?siteID=123112&amp;id=7639525 Maya 7.0 PLE] (Personal Learning Edition) for free from Autodesk's website. Maya 4.0.1 PLE was distributed with [[Legacy:UT2003|UT2003]] on CD#3 (see press release text below), but it's unclear whether a key will be issued for this older version. note that [[Legacy:UT2004|UT2004]] comes with Maya 5.0 PLE 

'''''2007-09-13 DoomAbbey:''''' Am I blind ?? My DVD copy (EAN 5037930060762) of UT2004 comes with '''NO''' sign of Maya at all. :pissed: '''WTF?'''

'''Note:''' Maya PLE is for NT-based versions of Windows ''only''. This means is only runs under Windows NT 4, 2000 and XP. For other applications that work under Windows 98/ME see [[Legacy:Topics On Modeling|Topics on Modeling]].

==Tutorials ==
* [[Legacy:Introduction To Maya|Introduction To Maya]]
* [[Legacy:Importing Models From Maya|Importing Models from Maya]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

(PlaceHolder Tutorial Organisation)
* Part I - Building A Polygonal Mesh In Maya
* Part II - Quick Look At Creating Materials Using Maya's Hypershade, Assigning Textures and Basic Planar/Cylindrical/Automatic Mapping
* Part III - Basic Lighting and Baking Lightmaps For Shadows
* Part IV - ActorX for Maya and Exporting Basics
* Part V - Animation Basics

==External Links==

===Web Resources===
* [http://www.highend3d.com highend3d.com - excellent tutorials and resources for Maya and other apps]
* [http://www.aliaswavefront.com/en/Community/Learn/how_tos/games/pre_light/index.html How to prelight a scene] '''blip2:''' broken link!
* [http://www.mesmer.com/books/mayaguntutorial.html Polygon Modeling Tutorial: Low Poly, High Powered Gun] 
* [http://www.thehobbitguy.com/tutorials/polymodeling/ Dave K's Poly Head Modeling Tutorial]
* [http://www.kniffen.ca/index.php?target=tutorials/texture/UV1.php Setting up UV's for a model in order to paint the textures] '''blip2:''' broken link!
* [http://scripts.zbufferstudios.com/mel/aseExporter.rar Maya script] Plugin to convert objects to .Ase

===Recommended Books ===
*[http://store.aliaswavefront.com/dr/v2/ec_MAIN.Entry10?V1=385089&amp;PN=1&amp;SP=10023&amp;xid=41107&amp;DSP=&amp;CUR=840&amp;PGRP=0&amp;CACHE_ID=0|Learning Maya | Games and Interactive]
*[http://store.aliaswavefront.com/dr/v2/ec_MAIN.Entry10?V1=405326&amp;PN=1&amp;SP=10023&amp;xid=41107&amp;DSP=&amp;CUR=840&amp;PGRP=0&amp;CACHE_ID=0|Maya Techniques | Polygon Texturing, Shading and Lighting DVD]
*[http://www.amazon.com/exec/obidos/tg/detail/-/0735711895/qid=1030853974/sr=8-1/ref=sr_8_1/102-7554483-2741717?v=glance&amp;s=books&amp;n=507846|Maya 4 Fundamentals : by Jim Lammers, Lee Gooding]
*[http://www.amazon.com/exec/obidos/tg/detail/-/0782128351/qid=1030854030/sr=1-1/ref=sr_1_1/102-7554483-2741717?v=glance&amp;s=books MasteringMaya 3]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Maya FAQ|Maya FAQ]]

===Maya Unreal Plugins===
* [[udn2:MayaCompletePlugins]]
* [[Legacy:ActorX|ActorX]]
* [[Legacy:UnEditor.Mll|unEditor.mll]]  NOTE: See this page if you're having trouble getting the added Scale attribute to work properly.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4475</id>
      <timestamp>2007-09-13T07:47:26Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discuss]] &amp;ndash; Level Designers Discuss what kind of tutorials you want to see written on this page
* [[Legacy:Maya FAQ|Maya FAQ]] &amp;ndash; Common problems experienced when using Maya to import into UnrealEd, with some solutions

'''Maya''' is a professional 3D [[Legacy:Modeling Application|modeling application]] created by Alias, now supported by [http://usa.autodesk.com/adsk/servlet/home?siteID=123112&amp;id=129446 Autodesk]. You can download [http://usa.autodesk.com/adsk/servlet/index?siteID=123112&amp;id=7639525 Maya 7.0 PLE] (Personal Learning Edition) for free from Autodesk's website. Maya 4.0.1 PLE was distributed with [[Legacy:UT2003|UT2003]] on CD#3 (see press release text below), but it's unclear whether a key will be issued for this older version. Note that [[Legacy:UT2004|UT2004]] comes with Maya 5.0 PLE in the &quot;\CD6\Extras&quot; directory on the DVD.

'''Note:''' Maya PLE is for NT-based versions of Windows ''only''. This means is only runs under Windows NT 4, 2000 and XP. For other applications that work under Windows 98/ME see [[Legacy:Topics On Modeling|Topics on Modeling]].

==Tutorials ==
* [[Legacy:Introduction To Maya|Introduction To Maya]]
* [[Legacy:Importing Models From Maya|Importing Models from Maya]]
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

(PlaceHolder Tutorial Organisation)
* Part I - Building A Polygonal Mesh In Maya
* Part II - Quick Look At Creating Materials Using Maya's Hypershade, Assigning Textures and Basic Planar/Cylindrical/Automatic Mapping
* Part III - Basic Lighting and Baking Lightmaps For Shadows
* Part IV - ActorX for Maya and Exporting Basics
* Part V - Animation Basics

==External Links==

===Web Resources===
* [http://www.highend3d.com highend3d.com - excellent tutorials and resources for Maya and other apps]
* [http://www.aliaswavefront.com/en/Community/Learn/how_tos/games/pre_light/index.html How to prelight a scene] '''blip2:''' broken link!
* [http://www.mesmer.com/books/mayaguntutorial.html Polygon Modeling Tutorial: Low Poly, High Powered Gun] 
* [http://www.thehobbitguy.com/tutorials/polymodeling/ Dave K's Poly Head Modeling Tutorial]
* [http://www.kniffen.ca/index.php?target=tutorials/texture/UV1.php Setting up UV's for a model in order to paint the textures] '''blip2:''' broken link!
* [http://scripts.zbufferstudios.com/mel/aseExporter.rar Maya script] Plugin to convert objects to .Ase

===Recommended Books ===
*[http://store.aliaswavefront.com/dr/v2/ec_MAIN.Entry10?V1=385089&amp;PN=1&amp;SP=10023&amp;xid=41107&amp;DSP=&amp;CUR=840&amp;PGRP=0&amp;CACHE_ID=0|Learning Maya | Games and Interactive]
*[http://store.aliaswavefront.com/dr/v2/ec_MAIN.Entry10?V1=405326&amp;PN=1&amp;SP=10023&amp;xid=41107&amp;DSP=&amp;CUR=840&amp;PGRP=0&amp;CACHE_ID=0|Maya Techniques | Polygon Texturing, Shading and Lighting DVD]
*[http://www.amazon.com/exec/obidos/tg/detail/-/0735711895/qid=1030853974/sr=8-1/ref=sr_8_1/102-7554483-2741717?v=glance&amp;s=books&amp;n=507846|Maya 4 Fundamentals : by Jim Lammers, Lee Gooding]
*[http://www.amazon.com/exec/obidos/tg/detail/-/0782128351/qid=1030854030/sr=1-1/ref=sr_1_1/102-7554483-2741717?v=glance&amp;s=books MasteringMaya 3]

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Maya FAQ|Maya FAQ]]

===Maya Unreal Plugins===
* [[udn2:MayaCompletePlugins]]
* [[Legacy:ActorX|ActorX]]
* [[Legacy:UnEditor.Mll|unEditor.mll]]  NOTE: See this page if you're having trouble getting the added Scale attribute to work properly.

==Comments==

'''2007-09-13 DoomAbbey:''' Am I blind ?? My DVD copy (EAN 5037930060762) of UT2004 comes with '''NO''' sign of Maya at all. :pissed: '''WTF?'''

'''Wormbo:''' Try looking under &quot;\CD6\Extras\MayaPLE&quot;, that's where it was on the original German version (EAN 3 546430 107836) I have. I don't know about ECE or the Unreal Anthology, though. Try asking stuff like this on a forum like [http://forums.beyondunreal.com/forumdisplay.php?f=346 BUF Modeling/Skinning] and if you have an answer, come back to this page and update it. :) ([[:Category:Legacy Delete Reply When You See It]])

[[Category:Legacy Delete Reply When You See It|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya FAQ</title>
    <id>1814</id>
    <revision>
      <id>4451</id>
      <timestamp>2006-05-20T01:53:20Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This section aims to address common problems experienced with Maya, with particular emphasis on importing from [[Legacy:Maya|Maya]] PLE into [[Legacy:UnrealEd|UnrealEd]] (mostly in relation to [[Legacy:Static Mesh|static mesh]]es), written (initially ;-)) from the perspective of a Maya noob. It's almost a FAQ, but the questions probably aren't 'frequently asked', and the answers are (at the moment) pretty much guesswork. 

==Basics==
; Where do I find Maya? : Your UT2003 or UT2004 game disk, in the Extras folder.

'''NOTE:''' The version of Maya PLE available from Alias' website does not support the UnrealEd export plugin.

; Where do I get the key I need for installing it? I thought it's free? : You can register for free at [http://www.alias.com/ Alias.com].

; Why can't I run Maya? : Maya ''only'' works on Windows NT-based operating systems, such as 2000 and XP. Also, the developers of this software have gone to great lengths to provide FAQs and Tutorials in their support section of their website. They even include a fairly exhaustive database of &quot;Qualified Hardware&quot;. I could have included about 6 inline links in that statement. But, its all here in [http://www.alias.com/eng/support/maya/index.jhtml Alias's Maya Support Page.]

; Rotating and scaling my scene seems limited. : If you don't have a 3 button mouse (or one where the scroll-wheel acts as a 3rd button) then, yes, you are missing something. Get one. Sounds like you also need to pay a visit to [http://www.alias.com/eng/support/maya/index.jhtml Alias's Maya Support Page] and review their &quot;Qualified Hardware&quot; database.

==Importing into UnrealEd==

''See also [[Legacy:Importing Models From Maya|Importing Models from Maya]].''

; When I export objects, the extra attribute Scale that I added to the export set doesn't work &amp;ndash; the models are always the same size in UEd no matter what the Scale value. : There are two versions of the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in. The one dated 10/28/03 erroneously ignores the Scale property. Try the earlier version from the link below if you have this problem.

http://wiki.beyondunreal.com/dl.php/wiki/patches/UnEditor091802.zip

; I have ActorX in the plug-ins directory, but I can't get it to work with Maya PLE. Why not? : Maya PLE cannot use most plug-ins, including ActorX. It's a limitation of the license. If you're using Maya PLE v.4.0.1 that shipped with UT2003, you can use the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in for exporting to UEd3. 

; When importing a static mesh into UnrealEd, it doesn't look anything like the mesh I designed in Maya and/or parts of the mesh are in the wrong place relative to each other : It seems that the importer doesn't work properly unless you select all the objects making up the static mesh and then select Modify -&gt; Freeze Transformations first.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' I also select Edit -&gt; Delete by Type -&gt; History first, but this may not be required. 

; Some parts of the mesh don't appear in UnrealEd : It seems that objects created using the normal Edit -&gt; Duplicate function (created either as copies or instances) don't seem to import into UnrealEd. Using the Edit -&gt; Duplicate with Transform function does seem to work, however (subject to the point above regarding freezing transformations before importing).

; I've added the package, group and scale attributes to the set which I've created, but both the scale and group attributes seem to be ignored : '''Fat Marrow:''' I don't know the solution, but it is worth noting that the package attribute at least seems to be case sensitive (must be lower case).

; I double-click a material I've created, and I've added the URMaterialName attribute to it, but the texture doesn't seem to get set when I import : You have to add the URMaterialName attribute to the material shading group, which is distinct from the material you created (its default name ends with an 'SG' suffix). One way to select the shading group is to go to the hypershade window, select your material, right-click it and select 'Graph selected' (or something like that), then select the material again in the lower window and click the button in one of the hypershade menu bars which looks like a square with arrows going in and out of it ('show upstream and downstream connections'). You should then see your shading group appear to the RHS of your material. Then double-click this, and then add the URMaterialName attribute.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' This seems unduly convoluted, but I've found no other/better way to do this.

; I've set up my URMaterialName attributes properly for my shading groups (see above), but when I import my model, parts of it are covered in a blank concrete texture : You have to manually load all of the referenced texture packs before you import your model. But also check your spelling &amp;ndash; is that Abaddon, or Abbadon? 

; I've set up my URMaterialName attributes properly '''and''' I've now loaded all the necessary texture packs, but my textures still don't import properly : If you've had a failed import, it's often necessary to delete that static mesh before trying again. This may seem frustrating, but you have to keep the UnrealEd gremlin well-fed.

; When I map 'File' textures to surfaces in Maya, they come out upside down in UnrealEd : '''Fat Marrow:''' I don't really know the solution, other than to do hacky things like flip the textures before you import them into UnrealEd. This may also be a Targa-specific problem; saving textures as (say) .bmp may work better.

; I get strange artifacts when I import meshes into UnrealEd : It seems that the importer doesn't always work well when converting quad polygons to triangles; you are better off converting your meshes before importing (Polygons -&gt; Triangulate).&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' In other situations, for some reason when extruding faces in certain ways, I get strange artifacts which can't be cured.

; When I type 'unEditor mesh &lt;name&gt;' in the script box, nothing happens &amp;ndash; not even an error : Sometimes the Maya / UnrealEd interface seems to get borked and cause this &amp;ndash; restarting both seems to fix it sometimes. At other times, nothing at all seems to fix it &amp;ndash; I think this happens when the objects have been mangled in some strange noob-like way. For this reason, I recommend saving multiple versions of the Maya PLE file and regularly doing a test import (if you just make a quick set and don't bother setting any of the necessary attributes, you will create a mesh in the MyPackage package, in the MyPackageN group &amp;ndash; where N increases each time you export the same set name).

; When I import an object, there are more materials associated with it than I had expected : You need to combine all your polygons before importing &amp;ndash; Polygons -&gt; Combine (and then make sure that your combined polygon is the only member of your set), or else the importer creates at least one material per object.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' I still get spurious extra materials appearing sometimes in the static mesh browser

; When I import an object, all the edges get smoothed, even edges that didn't even originally share vertices (but the endpoints were at the same place). : Is this just a limitation of the unEditor plugin?

'''Chip:''' This is a plug-in limitation.

; When I try to load the unEditor.mll plugin shipped with PLE I get the error &quot;The plug-in could not be loaded.  The Personal Learning Edition of Maya can only load plug-ins that are built specifically for the Personal Learning Edition...&quot; : (originally discovered on the [[Legacy:Maya/Discuss|Maya/Discuss]] page) To fix this, hold the windows key hit type F15 (Pause).  Click the Advanced tab and then the Environment Variables button.  Find the PATH environment variable and hit the Edit button.  After &quot;C:\Program Files\AliasWavefront\Maya 4 Personal Learning Edition\bin;&quot; and before any system paths, add the following:&quot;C:\UT2003\System;c:\UT2003;&quot;.  Quit and re-open Maya and it should not start UnrealEd when you load the plugin.

'''GRAF!K:''' Interesting error message for that problem. :-/

; All or part of my model appears inside-out when I import it, and/or I can walk and shoot through it : This may be because the face normals are wrong or reversed. Select the relevant faces (or the entire model) and select Edit Polygons -&gt; Normals -&gt; Reverse (I don't know what the options do) or try other commands in the Normals submenu (Set Normals to Face [or something like that] seems appropriate).

'''enDLine.SPA:''' If you reverse the normals (to make say a cave or inside out structure) make sure to turn on backface culling (Shading-&gt;back face culling) and when you import the mesh in ued and get it all set up where you want it make sure to turn &lt;b&gt;&lt;i&gt;off&lt;/i&gt;&lt;/b&gt; simple collision. 

; When I import a model, it looks fine but I can walk and shoot through it : Sometimes extruding faces (usually many at a time) can cause non-obvious 'bugs' in the model, which look ok but mess up the collision side of things. You can sometimes identify areas of concern by doing a Polygon -&gt; Cleanup (with pretty much all options ticked), and seeing which parts collapse (then undo the cleanup and start reworking those parts of the model). However, in general, it seems best to use face extrusions sparingly (from a noob perspective, anyway) &amp;ndash; edge extrusions may generally cause fewer problems, however.

; When I look at my model in Maya, the lighting is strange in places : This is most commonly caused by non-planar polygons (e.g. you've moved one point of a quadrilateral out of the plane of the other three points), which there is no obviously correct way to light/draw. It's probably best to fix these as they occur by using the Split Polygon tool to split up the polygon in question until only planar polygons remain. The importer will probably do this in any event, but possibly not without bugs. A further source of strange lighting is if you play around with the orientation of the face normals. I think (but I am not sure) that Edit Polygons -&gt; Normals -&gt; Set Normal to Face [or something like that] usually fixes this.

; How do I get cool rendered shadows and lights on my model, like the UT2k3 industrial static meshes have? : There is an option in Maya to 'bake' shadows and lighting onto models, but it doesn't seem possible in the PLE version without getting a watermark (i.e. give up). As far as I worked out, it seems to involve selecting the object you want to 'bake', shift-selecting the relevant shading group / material, and then selecting a menu option in the hypershade window which is something like 'Convert to File Texture'.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' Anyone else know any different? I'd love to be able to do this in the PLE version...

; Isn't there a quicker way to set up the sets for exporting with unEditor? : Yes, by installing [[Legacy:PerformCreateUTSet.Mel|performCreateUTSet.mel]] into your local scripts directory (see help files for details), you can create a shelf button that pops up a window to let you create the set by filling in some fields and clicking a button.

; I use maya6 ple edition, how do i get the things i made with it into unreal editor?

==See also==

[[Legacy:Static Mesh Modeling|Static mesh modeling]]

----

==Discussion==

'''Fat Marrow:''' This is beginning to need more structure, but I can't think of any obvious subheadings

'''Ben2500:''' Are there any downloads for Maya that will make it work on a computer running ME.

'''Dirk Fist:''' There is a bug in my video card/driver( and/or UED-3 ?) which prevents UED from running if any other program is using the 3D hardware. For this reason I could'nt export using maya 4, but the new maya 5 exporter (comes with 2k4) can connect to a running copy of UED-3. Just thought I would share this info for people with similarly inadequate video cards ;)  

'''Zugy:''' [http://www.alias.com/eng/products-services/maya/maya_ple/ Maya 6.0 PLE] has been released a bit ago...anyone know more about it? (I'm not really a modeler, I just heard is all)

'''Graphik:''' There's nothing in 6 of note to game modders. You can't use the UnrealEd export tool with it anyhow.

'''enDLine.SPA:''' There needs to be more about ActorX and stuff for the folks who have a legit copy of maya. 

'''MayaGeek:''' Here's a link to a good tutorial for ActorX for those of you who has a legit copy of maya. =) http://udn.epicgames.com/Two/ActorXMayaTutorial

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4452</id>
      <timestamp>2005-12-22T16:41:18Z</timestamp>
      <contributor>
        <ip>Pcp09729065pcs.union01.nj.comcast.net</ip>
      </contributor>
      <comment>added comment</comment>
      <text xml:space="preserve">This section aims to address common problems experienced with Maya, with particular emphasis on importing from [[Legacy:Maya|Maya]] PLE into [[Legacy:UnrealEd|UnrealEd]] (mostly in relation to [[Legacy:Static Mesh|static mesh]]es), written (initially ;-)) from the perspective of a Maya noob. It's almost a FAQ, but the questions probably aren't 'frequently asked', and the answers are (at the moment) pretty much guesswork. 

==Basics==
; Where do I find Maya? : Your UT2003 or UT2004 game disk, in the Extras folder.

'''NOTE:''' The version of Maya PLE available from Alias' website does not support the UnrealEd export plugin.

; Where do I get the key I need for installing it? I thought it's free? : You can register for free at [http://www.alias.com/ Alias.com].

; Why can't I run Maya? : Maya ''only'' works on Windows NT-based operating systems, such as 2000 and XP. Also, the developers of this software have gone to great lengths to provide FAQs and Tutorials in their support section of their website. They even include a fairly exhaustive database of &quot;Qualified Hardware&quot;. I could have included about 6 inline links in that statement. But, its all here in [http://www.alias.com/eng/support/maya/index.jhtml Alias's Maya Support Page.]

; Rotating and scaling my scene seems limited. : If you don't have a 3 button mouse (or one where the scroll-wheel acts as a 3rd button) then, yes, you are missing something. Get one. Sounds like you also need to pay a visit to [http://www.alias.com/eng/support/maya/index.jhtml Alias's Maya Support Page] and review their &quot;Qualified Hardware&quot; database.

==Importing into UnrealEd==

; When I export objects, the extra attribute Scale that I added to the export set doesn't work &amp;ndash; the models are always the same size in UEd no matter what the Scale value. : There are two versions of the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in. The one dated 10/28/03 erroneously ignores the Scale property. Try the earlier version from the link below if you have this problem.

http://wiki.beyondunreal.com/dl.php/wiki/patches/UnEditor091802.zip

; I have ActorX in the plug-ins directory, but I can't get it to work with Maya PLE. Why not? : Maya PLE cannot use most plug-ins, including ActorX. It's a limitation of the license. If you're using Maya PLE v.4.0.1 that shipped with UT2003, you can use the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in for exporting to UEd3. 

; When importing a static mesh into UnrealEd, it doesn't look anything like the mesh I designed in Maya and/or parts of the mesh are in the wrong place relative to each other : It seems that the importer doesn't work properly unless you select all the objects making up the static mesh and then select Modify -&gt; Freeze Transformations first.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' I also select Edit -&gt; Delete by Type -&gt; History first, but this may not be required. 

; Some parts of the mesh don't appear in UnrealEd : It seems that objects created using the normal Edit -&gt; Duplicate function (created either as copies or instances) don't seem to import into UnrealEd. Using the Edit -&gt; Duplicate with Transform function does seem to work, however (subject to the point above regarding freezing transformations before importing).

; I've added the package, group and scale attributes to the set which I've created, but both the scale and group attributes seem to be ignored : '''Fat Marrow:''' I don't know the solution, but it is worth noting that the package attribute at least seems to be case sensitive (must be lower case).

; I double-click a material I've created, and I've added the URMaterialName attribute to it, but the texture doesn't seem to get set when I import : You have to add the URMaterialName attribute to the material shading group, which is distinct from the material you created (its default name ends with an 'SG' suffix). One way to select the shading group is to go to the hypershade window, select your material, right-click it and select 'Graph selected' (or something like that), then select the material again in the lower window and click the button in one of the hypershade menu bars which looks like a square with arrows going in and out of it ('show upstream and downstream connections'). You should then see your shading group appear to the RHS of your material. Then double-click this, and then add the URMaterialName attribute.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' This seems unduly convoluted, but I've found no other/better way to do this.

; I've set up my URMaterialName attributes properly for my shading groups (see above), but when I import my model, parts of it are covered in a blank concrete texture : You have to manually load all of the referenced texture packs before you import your model. But also check your spelling &amp;ndash; is that Abaddon, or Abbadon? 

; I've set up my URMaterialName attributes properly '''and''' I've now loaded all the necessary texture packs, but my textures still don't import properly : If you've had a failed import, it's often necessary to delete that static mesh before trying again. This may seem frustrating, but you have to keep the UnrealEd gremlin well-fed.

; When I map 'File' textures to surfaces in Maya, they come out upside down in UnrealEd : '''Fat Marrow:''' I don't really know the solution, other than to do hacky things like flip the textures before you import them into UnrealEd. This may also be a Targa-specific problem; saving textures as (say) .bmp may work better.

; I get strange artifacts when I import meshes into UnrealEd : It seems that the importer doesn't always work well when converting quad polygons to triangles; you are better off converting your meshes before importing (Polygons -&gt; Triangulate).&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' In other situations, for some reason when extruding faces in certain ways, I get strange artifacts which can't be cured.

; When I type 'unEditor mesh &lt;name&gt;' in the script box, nothing happens &amp;ndash; not even an error : Sometimes the Maya / UnrealEd interface seems to get borked and cause this &amp;ndash; restarting both seems to fix it sometimes. At other times, nothing at all seems to fix it &amp;ndash; I think this happens when the objects have been mangled in some strange noob-like way. For this reason, I recommend saving multiple versions of the Maya PLE file and regularly doing a test import (if you just make a quick set and don't bother setting any of the necessary attributes, you will create a mesh in the MyPackage package, in the MyPackageN group &amp;ndash; where N increases each time you export the same set name).

; When I import an object, there are more materials associated with it than I had expected : You need to combine all your polygons before importing &amp;ndash; Polygons -&gt; Combine (and then make sure that your combined polygon is the only member of your set), or else the importer creates at least one material per object.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' I still get spurious extra materials appearing sometimes in the static mesh browser

; When I import an object, all the edges get smoothed, even edges that didn't even originally share vertices (but the endpoints were at the same place). : Is this just a limitation of the unEditor plugin?

'''Chip:''' This is a plug-in limitation.

; When I try to load the unEditor.mll plugin shipped with PLE I get the error &quot;The plug-in could not be loaded.  The Personal Learning Edition of Maya can only load plug-ins that are built specifically for the Personal Learning Edition...&quot; : (originally discovered on the [[Legacy:Maya/Discuss|Maya/Discuss]] page) To fix this, hold the windows key hit type F15 (Pause).  Click the Advanced tab and then the Environment Variables button.  Find the PATH environment variable and hit the Edit button.  After &quot;C:\Program Files\AliasWavefront\Maya 4 Personal Learning Edition\bin;&quot; and before any system paths, add the following:&quot;C:\UT2003\System;c:\UT2003;&quot;.  Quit and re-open Maya and it should not start UnrealEd when you load the plugin.

'''GRAF!K:''' Interesting error message for that problem. :-/

; All or part of my model appears inside-out when I import it, and/or I can walk and shoot through it : This may be because the face normals are wrong or reversed. Select the relevant faces (or the entire model) and select Edit Polygons -&gt; Normals -&gt; Reverse (I don't know what the options do) or try other commands in the Normals submenu (Set Normals to Face [or something like that] seems appropriate).

'''enDLine.SPA:''' If you reverse the normals (to make say a cave or inside out structure) make sure to turn on backface culling (Shading-&gt;back face culling) and when you import the mesh in ued and get it all set up where you want it make sure to turn &lt;b&gt;&lt;i&gt;off&lt;/i&gt;&lt;/b&gt; simple collision. 

; When I import a model, it looks fine but I can walk and shoot through it : Sometimes extruding faces (usually many at a time) can cause non-obvious 'bugs' in the model, which look ok but mess up the collision side of things. You can sometimes identify areas of concern by doing a Polygon -&gt; Cleanup (with pretty much all options ticked), and seeing which parts collapse (then undo the cleanup and start reworking those parts of the model). However, in general, it seems best to use face extrusions sparingly (from a noob perspective, anyway) &amp;ndash; edge extrusions may generally cause fewer problems, however.

; When I look at my model in Maya, the lighting is strange in places : This is most commonly caused by non-planar polygons (e.g. you've moved one point of a quadrilateral out of the plane of the other three points), which there is no obviously correct way to light/draw. It's probably best to fix these as they occur by using the Split Polygon tool to split up the polygon in question until only planar polygons remain. The importer will probably do this in any event, but possibly not without bugs. A further source of strange lighting is if you play around with the orientation of the face normals. I think (but I am not sure) that Edit Polygons -&gt; Normals -&gt; Set Normal to Face [or something like that] usually fixes this.

; How do I get cool rendered shadows and lights on my model, like the UT2k3 industrial static meshes have? : There is an option in Maya to 'bake' shadows and lighting onto models, but it doesn't seem possible in the PLE version without getting a watermark (i.e. give up). As far as I worked out, it seems to involve selecting the object you want to 'bake', shift-selecting the relevant shading group / material, and then selecting a menu option in the hypershade window which is something like 'Convert to File Texture'.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' Anyone else know any different? I'd love to be able to do this in the PLE version...

; Isn't there a quicker way to set up the sets for exporting with unEditor? : Yes, by installing [[Legacy:PerformCreateUTSet.Mel|performCreateUTSet.mel]] into your local scripts directory (see help files for details), you can create a shelf button that pops up a window to let you create the set by filling in some fields and clicking a button.

; I use maya6 ple edition, how do i get the things i made with it into unreal editor?

==See also==

[[Legacy:Static Mesh Modeling|Static mesh modeling]]

----

==Discussion==

'''Fat Marrow:''' This is beginning to need more structure, but I can't think of any obvious subheadings

'''Ben2500:''' Are there any downloads for Maya that will make it work on a computer running ME.

'''Dirk Fist:''' There is a bug in my video card/driver( and/or UED-3 ?) which prevents UED from running if any other program is using the 3D hardware. For this reason I could'nt export using maya 4, but the new maya 5 exporter (comes with 2k4) can connect to a running copy of UED-3. Just thought I would share this info for people with similarly inadequate video cards ;)  

'''Zugy:''' [http://www.alias.com/eng/products-services/maya/maya_ple/ Maya 6.0 PLE] has been released a bit ago...anyone know more about it? (I'm not really a modeler, I just heard is all)

'''Graphik:''' There's nothing in 6 of note to game modders. You can't use the UnrealEd export tool with it anyhow.

'''enDLine.SPA:''' There needs to be more about ActorX and stuff for the folks who have a legit copy of maya. 

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4453</id>
      <timestamp>2006-01-13T10:33:47Z</timestamp>
      <contributor>
        <ip>MayaGeek</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This section aims to address common problems experienced with Maya, with particular emphasis on importing from [[Legacy:Maya|Maya]] PLE into [[Legacy:UnrealEd|UnrealEd]] (mostly in relation to [[Legacy:Static Mesh|static mesh]]es), written (initially ;-)) from the perspective of a Maya noob. It's almost a FAQ, but the questions probably aren't 'frequently asked', and the answers are (at the moment) pretty much guesswork. 

==Basics==
; Where do I find Maya? : Your UT2003 or UT2004 game disk, in the Extras folder.

'''NOTE:''' The version of Maya PLE available from Alias' website does not support the UnrealEd export plugin.

; Where do I get the key I need for installing it? I thought it's free? : You can register for free at [http://www.alias.com/ Alias.com].

; Why can't I run Maya? : Maya ''only'' works on Windows NT-based operating systems, such as 2000 and XP. Also, the developers of this software have gone to great lengths to provide FAQs and Tutorials in their support section of their website. They even include a fairly exhaustive database of &quot;Qualified Hardware&quot;. I could have included about 6 inline links in that statement. But, its all here in [http://www.alias.com/eng/support/maya/index.jhtml Alias's Maya Support Page.]

; Rotating and scaling my scene seems limited. : If you don't have a 3 button mouse (or one where the scroll-wheel acts as a 3rd button) then, yes, you are missing something. Get one. Sounds like you also need to pay a visit to [http://www.alias.com/eng/support/maya/index.jhtml Alias's Maya Support Page] and review their &quot;Qualified Hardware&quot; database.

==Importing into UnrealEd==

; When I export objects, the extra attribute Scale that I added to the export set doesn't work &amp;ndash; the models are always the same size in UEd no matter what the Scale value. : There are two versions of the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in. The one dated 10/28/03 erroneously ignores the Scale property. Try the earlier version from the link below if you have this problem.

http://wiki.beyondunreal.com/dl.php/wiki/patches/UnEditor091802.zip

; I have ActorX in the plug-ins directory, but I can't get it to work with Maya PLE. Why not? : Maya PLE cannot use most plug-ins, including ActorX. It's a limitation of the license. If you're using Maya PLE v.4.0.1 that shipped with UT2003, you can use the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in for exporting to UEd3. 

; When importing a static mesh into UnrealEd, it doesn't look anything like the mesh I designed in Maya and/or parts of the mesh are in the wrong place relative to each other : It seems that the importer doesn't work properly unless you select all the objects making up the static mesh and then select Modify -&gt; Freeze Transformations first.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' I also select Edit -&gt; Delete by Type -&gt; History first, but this may not be required. 

; Some parts of the mesh don't appear in UnrealEd : It seems that objects created using the normal Edit -&gt; Duplicate function (created either as copies or instances) don't seem to import into UnrealEd. Using the Edit -&gt; Duplicate with Transform function does seem to work, however (subject to the point above regarding freezing transformations before importing).

; I've added the package, group and scale attributes to the set which I've created, but both the scale and group attributes seem to be ignored : '''Fat Marrow:''' I don't know the solution, but it is worth noting that the package attribute at least seems to be case sensitive (must be lower case).

; I double-click a material I've created, and I've added the URMaterialName attribute to it, but the texture doesn't seem to get set when I import : You have to add the URMaterialName attribute to the material shading group, which is distinct from the material you created (its default name ends with an 'SG' suffix). One way to select the shading group is to go to the hypershade window, select your material, right-click it and select 'Graph selected' (or something like that), then select the material again in the lower window and click the button in one of the hypershade menu bars which looks like a square with arrows going in and out of it ('show upstream and downstream connections'). You should then see your shading group appear to the RHS of your material. Then double-click this, and then add the URMaterialName attribute.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' This seems unduly convoluted, but I've found no other/better way to do this.

; I've set up my URMaterialName attributes properly for my shading groups (see above), but when I import my model, parts of it are covered in a blank concrete texture : You have to manually load all of the referenced texture packs before you import your model. But also check your spelling &amp;ndash; is that Abaddon, or Abbadon? 

; I've set up my URMaterialName attributes properly '''and''' I've now loaded all the necessary texture packs, but my textures still don't import properly : If you've had a failed import, it's often necessary to delete that static mesh before trying again. This may seem frustrating, but you have to keep the UnrealEd gremlin well-fed.

; When I map 'File' textures to surfaces in Maya, they come out upside down in UnrealEd : '''Fat Marrow:''' I don't really know the solution, other than to do hacky things like flip the textures before you import them into UnrealEd. This may also be a Targa-specific problem; saving textures as (say) .bmp may work better.

; I get strange artifacts when I import meshes into UnrealEd : It seems that the importer doesn't always work well when converting quad polygons to triangles; you are better off converting your meshes before importing (Polygons -&gt; Triangulate).&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' In other situations, for some reason when extruding faces in certain ways, I get strange artifacts which can't be cured.

; When I type 'unEditor mesh &lt;name&gt;' in the script box, nothing happens &amp;ndash; not even an error : Sometimes the Maya / UnrealEd interface seems to get borked and cause this &amp;ndash; restarting both seems to fix it sometimes. At other times, nothing at all seems to fix it &amp;ndash; I think this happens when the objects have been mangled in some strange noob-like way. For this reason, I recommend saving multiple versions of the Maya PLE file and regularly doing a test import (if you just make a quick set and don't bother setting any of the necessary attributes, you will create a mesh in the MyPackage package, in the MyPackageN group &amp;ndash; where N increases each time you export the same set name).

; When I import an object, there are more materials associated with it than I had expected : You need to combine all your polygons before importing &amp;ndash; Polygons -&gt; Combine (and then make sure that your combined polygon is the only member of your set), or else the importer creates at least one material per object.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' I still get spurious extra materials appearing sometimes in the static mesh browser

; When I import an object, all the edges get smoothed, even edges that didn't even originally share vertices (but the endpoints were at the same place). : Is this just a limitation of the unEditor plugin?

'''Chip:''' This is a plug-in limitation.

; When I try to load the unEditor.mll plugin shipped with PLE I get the error &quot;The plug-in could not be loaded.  The Personal Learning Edition of Maya can only load plug-ins that are built specifically for the Personal Learning Edition...&quot; : (originally discovered on the [[Legacy:Maya/Discuss|Maya/Discuss]] page) To fix this, hold the windows key hit type F15 (Pause).  Click the Advanced tab and then the Environment Variables button.  Find the PATH environment variable and hit the Edit button.  After &quot;C:\Program Files\AliasWavefront\Maya 4 Personal Learning Edition\bin;&quot; and before any system paths, add the following:&quot;C:\UT2003\System;c:\UT2003;&quot;.  Quit and re-open Maya and it should not start UnrealEd when you load the plugin.

'''GRAF!K:''' Interesting error message for that problem. :-/

; All or part of my model appears inside-out when I import it, and/or I can walk and shoot through it : This may be because the face normals are wrong or reversed. Select the relevant faces (or the entire model) and select Edit Polygons -&gt; Normals -&gt; Reverse (I don't know what the options do) or try other commands in the Normals submenu (Set Normals to Face [or something like that] seems appropriate).

'''enDLine.SPA:''' If you reverse the normals (to make say a cave or inside out structure) make sure to turn on backface culling (Shading-&gt;back face culling) and when you import the mesh in ued and get it all set up where you want it make sure to turn &lt;b&gt;&lt;i&gt;off&lt;/i&gt;&lt;/b&gt; simple collision. 

; When I import a model, it looks fine but I can walk and shoot through it : Sometimes extruding faces (usually many at a time) can cause non-obvious 'bugs' in the model, which look ok but mess up the collision side of things. You can sometimes identify areas of concern by doing a Polygon -&gt; Cleanup (with pretty much all options ticked), and seeing which parts collapse (then undo the cleanup and start reworking those parts of the model). However, in general, it seems best to use face extrusions sparingly (from a noob perspective, anyway) &amp;ndash; edge extrusions may generally cause fewer problems, however.

; When I look at my model in Maya, the lighting is strange in places : This is most commonly caused by non-planar polygons (e.g. you've moved one point of a quadrilateral out of the plane of the other three points), which there is no obviously correct way to light/draw. It's probably best to fix these as they occur by using the Split Polygon tool to split up the polygon in question until only planar polygons remain. The importer will probably do this in any event, but possibly not without bugs. A further source of strange lighting is if you play around with the orientation of the face normals. I think (but I am not sure) that Edit Polygons -&gt; Normals -&gt; Set Normal to Face [or something like that] usually fixes this.

; How do I get cool rendered shadows and lights on my model, like the UT2k3 industrial static meshes have? : There is an option in Maya to 'bake' shadows and lighting onto models, but it doesn't seem possible in the PLE version without getting a watermark (i.e. give up). As far as I worked out, it seems to involve selecting the object you want to 'bake', shift-selecting the relevant shading group / material, and then selecting a menu option in the hypershade window which is something like 'Convert to File Texture'.&lt;br /&gt;&lt;br /&gt;'''Fat Marrow:''' Anyone else know any different? I'd love to be able to do this in the PLE version...

; Isn't there a quicker way to set up the sets for exporting with unEditor? : Yes, by installing [[Legacy:PerformCreateUTSet.Mel|performCreateUTSet.mel]] into your local scripts directory (see help files for details), you can create a shelf button that pops up a window to let you create the set by filling in some fields and clicking a button.

; I use maya6 ple edition, how do i get the things i made with it into unreal editor?

==See also==

[[Legacy:Static Mesh Modeling|Static mesh modeling]]

----

==Discussion==

'''Fat Marrow:''' This is beginning to need more structure, but I can't think of any obvious subheadings

'''Ben2500:''' Are there any downloads for Maya that will make it work on a computer running ME.

'''Dirk Fist:''' There is a bug in my video card/driver( and/or UED-3 ?) which prevents UED from running if any other program is using the 3D hardware. For this reason I could'nt export using maya 4, but the new maya 5 exporter (comes with 2k4) can connect to a running copy of UED-3. Just thought I would share this info for people with similarly inadequate video cards ;)  

'''Zugy:''' [http://www.alias.com/eng/products-services/maya/maya_ple/ Maya 6.0 PLE] has been released a bit ago...anyone know more about it? (I'm not really a modeler, I just heard is all)

'''Graphik:''' There's nothing in 6 of note to game modders. You can't use the UnrealEd export tool with it anyhow.

'''enDLine.SPA:''' There needs to be more about ActorX and stuff for the folks who have a legit copy of maya. 

'''MayaGeek:''' Here's a link to a good tutorial for ActorX for those of you who has a legit copy of maya. =) http://udn.epicgames.com/Two/ActorXMayaTutorial

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya PLE Character Model Tutorial</title>
    <id>2133</id>
    <revision>
      <id>5193</id>
      <timestamp>2006-10-15T13:21:11Z</timestamp>
      <contributor>
        <ip>Offramp</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|10/15/03. With Maya 5 Personal Learning Edition now available for download from Alias, it's necessary to say that this tutorial is written for use with Maya 4.0.1 PLE, that shipped with the UT2003 release CDs. Maya 5 PLE does not support the unEditor.mll plug-in that shipped with UT2003/Maya 4 PLE.

03/08/05. Belated update: UT2004 shipped with a new version of unEditor.mll for Maya 5 PLE that sports a spiffy new interface and new features.  

Check the UDN site [[udn2:MayaCompletePlugins]] for the latest version, which fixes a bug affecting collision geometry exports.

}}
 

==From Maya PLE to Antalus in 101 Steps ==

'''Maya PLE 4.0.1''' and the associated plug-in '''unEditor.mll''' shipped with UT2003, and the combination was touted as '' &quot;the kind of integrated 3D pipeline used by top game developers.&quot; ''

Well, sort of. The limitations of the Personal Learning Edition, while quite understandable, present a number of roadblocks to easily getting a character model into UT2003, particularly when it comes to skinning the model. But it is possible, and can be quite successful.

===Overview ===

This first in a series of planned tutorials about character modeling for Unreal-engine-based mods focuses on the &quot;mechanical&quot; steps of creating a Maya PLE model using skeletal animation, and getting it into UT2003.

The tutorial has five parts:

* [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]]
* [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]]
* [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]]
* [[Legacy:Maya PLE Character Model Tutorial Part 4|Texturing]]
* [[Legacy:Maya PLE Character Model Tutorial Part 5|Exporting]]

Unfortunately, an exhaustive explanation of modeling, rigging, skinning, animating, exporting, and tweaking a fully-developed UT2003 character equivalent to Wraith, Gorge, Cobalt or Satin is far beyond the scope of this &quot;elementary&quot; tutorial &amp;ndash; there are just too many details, and it would necessarily assume a great deal of pre-existing skill and knowledge. 

Instead, I'll outline the steps to get a very simplified skeletal animation built, rigged, textured, exported and ready to select as a UT2003 character. The result will be a character pretty much unplayable in the game (except for laughs, perhaps), but the critical steps will have been covered, and you will have a procedure to expand on as you develop a more capable character model of your own design.

[[Image:Legacy_MCMT-TCManOnAntalus.jpeg|center|TinCanMan, product of this tutorial, contemplates a superweapon on Antalus]]

This tutorial will NOT teach you how to be a good modeler or animator or skinner. Those parts of the learning curve you'll have to navigate on your own (or wait for future tutorials).

Familiarity and facility with the Maya PLE interface is highly recommended. Menu operations or tools important to the specific steps are usually highlighted in '''boldface''', but it's assumed that you can manage the more general operations (like renaming objects, entering Channel Box values, etc.) without detailed explanation.

===Preparation ===

A valuable first step in planning a character model is to find out what the game expects. For normal gameplay, the UT2003 characters have a fully defined set of animations the game plays under various circumstances. The animation sequences for any UT2003 character can be viewed in the Animations browser (FIG 1). 

[[Image:Legacy_MCMT-01-AnimSeqList.gif|center|FIG 1. The UEd Animations browser]]

The list is extensive, and the game engine expects any character to have them all. However, not having them all doesn't break the game, it just generates a lot of warnings in the UT2003 log. While this is undesirable for a properly functional character, for the tutorial model it will be par for the course.

Better news is that the animated motions displayed by playing the sequences in the browser are of no consequence to the game engine. Only the sequence names are relevant &amp;ndash; the same animation created in Maya PLE could be given a number of different sequence names in UT2003, and the engine would play it accordingly. This isn't very useful, but it is instructive.

Enough verbiage, time to start [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]] !

==Discussion==

'''Corran:''' Should the tutorial pages not be sub-pages? It would make it all fit together much better methinks.

'''Chip:''' The tute is pretty linear &amp; sequential, broken into sections/pages to keep each a bit more manageable. Most subpages I've seen deal with associated subjects, rather than a direct continuance of their main pages. Would the additional visibility of the sections, and their links, from using subpages be valuable if each isn't really &quot;standalone&quot;?

'''Corran:''' Each of the five tutorial pages are currently not part of this page except through links. If they were sub-pages, it would make it more clear that they are part of the the same subject (like a directory holding five chapters of a tutorial). It would be like the [[Legacy:Mod_Authoring|Mod_Authoring]] page, with the sub-pages being parts of the whole tutorial. Also, they'd show up together, as sub-pages on the search page.

'''SuperApe:''' I believe this page setup is okay.  Instead of linking from [[Legacy:Mod_Authoring|Mod_Authoring]], which was created as a stand-alone guide, I linked from [[Legacy:Making Mods|Making Mods]], which will probably become a hub for all Modding Topics at some point.  Excellent tutorial by the way.  The only thing that was missing for me was proper and more detailed UV mapping for character models, but that can be found elsewhere, I'm sure.

'''Winxprules:''' Uh-oh... I went to install Maya off the UT2004 DVD today (9th Feb '06) and went to get an activation code.  BUT - Maya doesn't supply codes for version 5.0 anymore!  Not only that, but the UT2004 plug-in included with the game doesn't work with Maya 7.0, the latest version available.  Problem?  I think so...  people have discussed this on BUF already, so if you want more information, try a search there.

'''Offramp:''' The activation codes for Maya PLE 4.0, 4.5 and 5.0 are still available (http://www.alias.com/eng/login/enquiries/ple_unlock_m50/index.html). The UT export plug-in for Maya PLE 7.0 can be found on the UDN pages (http://udn.epicgames.com/Two/MayaCompletePlugins).

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5194</id>
      <timestamp>2006-05-20T02:07:55Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Try Importing Models from Maya.</comment>
      <text xml:space="preserve">{{innerbox|10/15/03. With Maya 5 Personal Learning Edition now available for download from Alias, it's necessary to say that this tutorial is written for use with Maya 4.0.1 PLE, that shipped with the UT2003 release CDs. Maya 5 PLE does not support the unEditor.mll plug-in that shipped with UT2003/Maya 4 PLE.

03/08/05. Belated update: UT2004 shipped with a new version of unEditor.mll for Maya 5 PLE that sports a spiffy new interface and new features.  

Check the UDN site [[udn2:MayaCompletePlugins]] for the latest version, which fixes a bug affecting collision geometry exports.

}}
 

==From Maya PLE to Antalus in 101 Steps ==

'''Maya PLE 4.0.1''' and the associated plug-in '''unEditor.mll''' shipped with UT2003, and the combination was touted as '' &quot;the kind of integrated 3D pipeline used by top game developers.&quot; ''

Well, sort of. The limitations of the Personal Learning Edition, while quite understandable, present a number of roadblocks to easily getting a character model into UT2003, particularly when it comes to skinning the model. But it is possible, and can be quite successful.

===Overview ===

This first in a series of planned tutorials about character modeling for Unreal-engine-based mods focuses on the &quot;mechanical&quot; steps of creating a Maya PLE model using skeletal animation, and getting it into UT2003.

The tutorial has five parts:

* [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]]
* [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]]
* [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]]
* [[Legacy:Maya PLE Character Model Tutorial Part 4|Texturing]]
* [[Legacy:Maya PLE Character Model Tutorial Part 5|Exporting]]

Unfortunately, an exhaustive explanation of modeling, rigging, skinning, animating, exporting, and tweaking a fully-developed UT2003 character equivalent to Wraith, Gorge, Cobalt or Satin is far beyond the scope of this &quot;elementary&quot; tutorial &amp;ndash; there are just too many details, and it would necessarily assume a great deal of pre-existing skill and knowledge. 

Instead, I'll outline the steps to get a very simplified skeletal animation built, rigged, textured, exported and ready to select as a UT2003 character. The result will be a character pretty much unplayable in the game (except for laughs, perhaps), but the critical steps will have been covered, and you will have a procedure to expand on as you develop a more capable character model of your own design.

[[Image:Legacy_MCMT-TCManOnAntalus.jpeg|center|TinCanMan, product of this tutorial, contemplates a superweapon on Antalus]]

This tutorial will NOT teach you how to be a good modeler or animator or skinner. Those parts of the learning curve you'll have to navigate on your own (or wait for future tutorials).

Familiarity and facility with the Maya PLE interface is highly recommended. Menu operations or tools important to the specific steps are usually highlighted in '''boldface''', but it's assumed that you can manage the more general operations (like renaming objects, entering Channel Box values, etc.) without detailed explanation.

===Preparation ===

A valuable first step in planning a character model is to find out what the game expects. For normal gameplay, the UT2003 characters have a fully defined set of animations the game plays under various circumstances. The animation sequences for any UT2003 character can be viewed in the Animations browser (FIG 1). 

[[Image:Legacy_MCMT-01-AnimSeqList.gif|center|FIG 1. The UEd Animations browser]]

The list is extensive, and the game engine expects any character to have them all. However, not having them all doesn't break the game, it just generates a lot of warnings in the UT2003 log. While this is undesirable for a properly functional character, for the tutorial model it will be par for the course.

Better news is that the animated motions displayed by playing the sequences in the browser are of no consequence to the game engine. Only the sequence names are relevant &amp;ndash; the same animation created in Maya PLE could be given a number of different sequence names in UT2003, and the engine would play it accordingly. This isn't very useful, but it is instructive.

Enough verbiage, time to start [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]] !

==Discussion==

'''Corran:''' Should the tutorial pages not be sub-pages? It would make it all fit together much better methinks.

'''Chip:''' The tute is pretty linear &amp; sequential, broken into sections/pages to keep each a bit more manageable. Most subpages I've seen deal with associated subjects, rather than a direct continuance of their main pages. Would the additional visibility of the sections, and their links, from using subpages be valuable if each isn't really &quot;standalone&quot;?

'''Corran:''' Each of the five tutorial pages are currently not part of this page except through links. If they were sub-pages, it would make it more clear that they are part of the the same subject (like a directory holding five chapters of a tutorial). It would be like the [[Legacy:Mod_Authoring|Mod_Authoring]] page, with the sub-pages being parts of the whole tutorial. Also, they'd show up together, as sub-pages on the search page.

'''SuperApe:''' I believe this page setup is okay.  Instead of linking from [[Legacy:Mod_Authoring|Mod_Authoring]], which was created as a stand-alone guide, I linked from [[Legacy:Making Mods|Making Mods]], which will probably become a hub for all Modding Topics at some point.  Excellent tutorial by the way.  The only thing that was missing for me was proper and more detailed UV mapping for character models, but that can be found elsewhere, I'm sure.

'''Winxprules:''' Uh-oh... I went to install Maya off the UT2004 DVD today (9th Feb '06) and went to get an activation code.  BUT - Maya doesn't supply codes for version 5.0 anymore!  Not only that, but the UT2004 plug-in included with the game doesn't work with Maya 7.0, the latest version available.  Problem?  I think so...  people have discussed this on BUF already, so if you want more information, try a search there.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5195</id>
      <timestamp>2006-10-15T13:20:14Z</timestamp>
      <contributor>
        <ip>Offramp</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|10/15/03. With Maya 5 Personal Learning Edition now available for download from Alias, it's necessary to say that this tutorial is written for use with Maya 4.0.1 PLE, that shipped with the UT2003 release CDs. Maya 5 PLE does not support the unEditor.mll plug-in that shipped with UT2003/Maya 4 PLE.

03/08/05. Belated update: UT2004 shipped with a new version of unEditor.mll for Maya 5 PLE that sports a spiffy new interface and new features.  

Check the UDN site [[udn2:MayaCompletePlugins]] for the latest version, which fixes a bug affecting collision geometry exports.

}}
 

==From Maya PLE to Antalus in 101 Steps ==

'''Maya PLE 4.0.1''' and the associated plug-in '''unEditor.mll''' shipped with UT2003, and the combination was touted as '' &quot;the kind of integrated 3D pipeline used by top game developers.&quot; ''

Well, sort of. The limitations of the Personal Learning Edition, while quite understandable, present a number of roadblocks to easily getting a character model into UT2003, particularly when it comes to skinning the model. But it is possible, and can be quite successful.

===Overview ===

This first in a series of planned tutorials about character modeling for Unreal-engine-based mods focuses on the &quot;mechanical&quot; steps of creating a Maya PLE model using skeletal animation, and getting it into UT2003.

The tutorial has five parts:

* [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]]
* [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]]
* [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]]
* [[Legacy:Maya PLE Character Model Tutorial Part 4|Texturing]]
* [[Legacy:Maya PLE Character Model Tutorial Part 5|Exporting]]

Unfortunately, an exhaustive explanation of modeling, rigging, skinning, animating, exporting, and tweaking a fully-developed UT2003 character equivalent to Wraith, Gorge, Cobalt or Satin is far beyond the scope of this &quot;elementary&quot; tutorial &amp;ndash; there are just too many details, and it would necessarily assume a great deal of pre-existing skill and knowledge. 

Instead, I'll outline the steps to get a very simplified skeletal animation built, rigged, textured, exported and ready to select as a UT2003 character. The result will be a character pretty much unplayable in the game (except for laughs, perhaps), but the critical steps will have been covered, and you will have a procedure to expand on as you develop a more capable character model of your own design.

[[Image:Legacy_MCMT-TCManOnAntalus.jpeg|center|TinCanMan, product of this tutorial, contemplates a superweapon on Antalus]]

This tutorial will NOT teach you how to be a good modeler or animator or skinner. Those parts of the learning curve you'll have to navigate on your own (or wait for future tutorials).

Familiarity and facility with the Maya PLE interface is highly recommended. Menu operations or tools important to the specific steps are usually highlighted in '''boldface''', but it's assumed that you can manage the more general operations (like renaming objects, entering Channel Box values, etc.) without detailed explanation.

===Preparation ===

A valuable first step in planning a character model is to find out what the game expects. For normal gameplay, the UT2003 characters have a fully defined set of animations the game plays under various circumstances. The animation sequences for any UT2003 character can be viewed in the Animations browser (FIG 1). 

[[Image:Legacy_MCMT-01-AnimSeqList.gif|center|FIG 1. The UEd Animations browser]]

The list is extensive, and the game engine expects any character to have them all. However, not having them all doesn't break the game, it just generates a lot of warnings in the UT2003 log. While this is undesirable for a properly functional character, for the tutorial model it will be par for the course.

Better news is that the animated motions displayed by playing the sequences in the browser are of no consequence to the game engine. Only the sequence names are relevant &amp;ndash; the same animation created in Maya PLE could be given a number of different sequence names in UT2003, and the engine would play it accordingly. This isn't very useful, but it is instructive.

Enough verbiage, time to start [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]] !

==Discussion==

'''Corran:''' Should the tutorial pages not be sub-pages? It would make it all fit together much better methinks.

'''Chip:''' The tute is pretty linear &amp; sequential, broken into sections/pages to keep each a bit more manageable. Most subpages I've seen deal with associated subjects, rather than a direct continuance of their main pages. Would the additional visibility of the sections, and their links, from using subpages be valuable if each isn't really &quot;standalone&quot;?

'''Corran:''' Each of the five tutorial pages are currently not part of this page except through links. If they were sub-pages, it would make it more clear that they are part of the the same subject (like a directory holding five chapters of a tutorial). It would be like the [[Legacy:Mod_Authoring|Mod_Authoring]] page, with the sub-pages being parts of the whole tutorial. Also, they'd show up together, as sub-pages on the search page.

'''SuperApe:''' I believe this page setup is okay.  Instead of linking from [[Legacy:Mod_Authoring|Mod_Authoring]], which was created as a stand-alone guide, I linked from [[Legacy:Making Mods|Making Mods]], which will probably become a hub for all Modding Topics at some point.  Excellent tutorial by the way.  The only thing that was missing for me was proper and more detailed UV mapping for character models, but that can be found elsewhere, I'm sure.

'''Winxprules:''' Uh-oh... I went to install Maya off the UT2004 DVD today (9th Feb '06) and went to get an activation code.  BUT - Maya doesn't supply codes for version 5.0 anymore!  Not only that, but the UT2004 plug-in included with the game doesn't work with Maya 7.0, the latest version available.  Problem?  I think so...  people have discussed this on BUF already, so if you want more information, try a search there.

'''Offramp:''' The activation codes for Maya PLE 4.0, 4.5 and 5.0 are still available (http://www.alias.com/eng/login/enquiries/ple_unlock_m50/index.html). A UT export plug-in as well (http://udn.epicgames.com/Two/MayaCompletePlugins).

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34372</id>
      <timestamp>2009-04-27T17:17:52Z</timestamp>
      <contributor>
        <ip>91.111.17.51</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">{{innerbox|10/15/03. With Maya 5 Personal Learning Edition now available for download from Alias, it's necessary to say that this tutorial is written for use with Maya 4.0.1 PLE, that shipped with the UT2003 release CDs. Maya 5 PLE does not support the unEditor.mll plug-in that shipped with UT2003/Maya 4 PLE.

03/08/05. Belated update: UT2004 shipped with a new version of unEditor.mll for Maya 5 PLE that sports a spiffy new interface and new features.  

Check the UDN site [[udn2:MayaCompletePlugins]] for the latest version, which fixes a bug affecting collision geometry exports.

}}
 

==From Maya PLE to Antalus in 101 Steps ==

'''Maya PLE 4.0.1''' and the associated plug-in '''unEditor.mll''' shipped with UT2003, and the combination was touted as '' &quot;the kind of integrated 3D pipeline used by top game developers.&quot; ''

Well, sort of. The limitations of the Personal Learning Edition, while quite understandable, present a number of roadblocks to easily getting a character model into UT2003, particularly when it comes to skinning the model. But it is possible, and can be quite successful.

===Overview ===

This first in a series of planned tutorials about character modeling for Unreal-engine-based mods focuses on the &quot;mechanical&quot; steps of creating a Maya PLE model using skeletal animation, and getting it into UT2003.

The tutorial has five parts:

* [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]]
* [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]]
* [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]]
* [[Legacy:Maya PLE Character Model Tutorial Part 4|Texturing]]
* [[Legacy:Maya PLE Character Model Tutorial Part 5|Exporting]]

Unfortunately, an exhaustive explanation of modeling, rigging, skinning, animating, exporting, and tweaking a fully-developed UT2003 character equivalent to Wraith, Gorge, Cobalt or Satin is far beyond the scope of this &quot;elementary&quot; tutorial &amp;ndash; there are just too many details, and it would necessarily assume a great deal of pre-existing skill and knowledge. 

Instead, I'll outline the steps to get a very simplified skeletal animation built, rigged, textured, exported and ready to select as a UT2003 character. The result will be a character pretty much unplayable in the game (except for laughs, perhaps), but the critical steps will have been covered, and you will have a procedure to expand on as you develop a more capable character model of your own design.

[[Image:Legacy_MCMT-TCManOnAntalus.jpeg|center|TinCanMan, product of this tutorial, contemplates a superweapon on Antalus]]

This tutorial will NOT teach you how to be a good modeler or animator or skinner. Those parts of the learning curve you'll have to navigate on your own (or wait for future tutorials).

Familiarity and facility with the Maya PLE interface is highly recommended. Menu operations or tools important to the specific steps are usually highlighted in '''boldface''', but it's assumed that you can manage the more general operations (like renaming objects, entering Channel Box values, etc.) without detailed explanation.

===Preparation ===

A valuable first step in planning a character model is to find out what the game expects. For normal gameplay, the UT2003 characters have a fully defined set of animations the game plays under various circumstances. The animation sequences for any UT2003 character can be viewed in the Animations browser (FIG 1). 

[[Image:Legacy_MCMT-01-AnimSeqList.gif|center|FIG 1. The UEd Animations browser]]

The list is extensive, and the game engine expects any character to have them all. However, not having them all doesn't break the game, it just generates a lot of warnings in the UT2003 log. While this is undesirable for a properly functional character, for the tutorial model it will be par for the course.

Better news is that the animated motions displayed by playing the sequences in the browser are of no consequence to the game engine. Only the sequence names are relevant &amp;ndash; the same animation created in Maya PLE could be given a number of different sequence names in UT2003, and the engine would play it accordingly. This isn't very useful, but it is instructive.

Enough verbiage, time to start [[Legacy:Maya PLE Character Model Tutorial Part 1|Modeling]] !

==Discussion==

'''Corran:''' Should the tutorial pages not be sub-pages? It would make it all fit together much better methinks.

'''Chip:''' The tute is pretty linear &amp; sequential, broken into sections/pages to keep each a bit more manageable. Most subpages I've seen deal with associated subjects, rather than a direct continuance of their main pages. Would the additional visibility of the sections, and their links, from using subpages be valuable if each isn't really &quot;standalone&quot;?

'''Corran:''' Each of the five tutorial pages are currently not part of this page except through links. If they were sub-pages, it would make it more clear that they are part of the the same subject (like a directory holding five chapters of a tutorial). It would be like the [[Legacy:Mod_Authoring|Mod_Authoring]] page, with the sub-pages being parts of the whole tutorial. Also, they'd show up together, as sub-pages on the search page.

'''SuperApe:''' I believe this page setup is okay.  Instead of linking from [[Legacy:Mod_Authoring|Mod_Authoring]], which was created as a stand-alone guide, I linked from [[Legacy:Making Mods|Making Mods]], which will probably become a hub for all Modding Topics at some point.  Excellent tutorial by the way.  The only thing that was missing for me was proper and more detailed UV mapping for character models, but that can be found elsewhere, I'm sure.

'''Winxprules:''' Uh-oh... I went to install Maya off the UT2004 DVD today (9th Feb '06) and went to get an activation code.  BUT - Maya doesn't supply codes for version 5.0 anymore!  Not only that, but the UT2004 plug-in included with the game doesn't work with Maya 7.0, the latest version available.  Problem?  I think so...  people have discussed this on BUF already, so if you want more information, try a search there.

'''Offramp:''' The activation codes for Maya PLE 4.0, 4.5 and 5.0 are still available (http://www.alias.com/eng/login/enquiries/ple_unlock_m50/index.html). The UT export plug-in for Maya PLE 7.0 can be found on the UDN pages (http://udn.epicgames.com/Two/MayaCompletePlugins).

'''Nyxs:''' Well as from 27/4/09 The Maya PLE codes are no longer supplied by Alias (now owned by Autodesk) the links above just point to product autodesks range. :( shame.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya PLE Character Model Tutorial Part 1</title>
    <id>2126</id>
    <revision>
      <id>5176</id>
      <timestamp>2005-12-01T02:45:47Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Modeling ==

The tutorial character is extremely simple: just cylinders of various dimensions arranged in a roughly bipedal human structure. No hands, no feet &amp;ndash; they'd complicate the animation process and slow the tutorial. Just torso, arms, legs, and head. In addition, the segments of the figure will be unconnected, reducing the need for finicky mesh point weight adjustments (skin weight painting). Remember, this is a very no-frills tutorial.

1. Launch Maya PLE, select the Modeling editor from the Status Line drop-down menu, and set your workspace view to perspective wireframe. Set the Grid parameters to Length and Width = 50, Grid Lines Every 0.5 units, and Subdivisions = 2. Enable Snap to Grids.

2. In the main menu use '''Create&gt;Polygon Primitives&gt;Cylinder&gt;OPTIONS''' (NOTE: OPTIONS is represented by the shadowed square to the right of the text menu item) to open the Polygon Cylinder Options dialog. Enter the values shown in FIG 2 and click Create. Change the name of the newly-created cylinder to ''torso''. Move ''torso'' up to Translate Y=12.0

[[Image:Legacy_MCMT-02-CylSpecs.gif|center|FIG 2. Polygon Cylinder options]]

3. Duplicate (Ctrl+d) the Cylinder and name the copy ''hips''. Scale ''hips'' to Scale X=0.8, Scale Y = 0.5, Scale Z=0.8 and move it to Translate Y=3.0. At this point the bottom cap of cylinder ''hips'' should be located close to the origin. Use the grid to confirm this (FIG 3).

[[Image:Legacy_MCMT-03-HipsAlign.gif|center|FIG 3. Position of the hips cylinder]]

4. Duplicate ''torso'' and name the copy ''head''. Scale ''head'' to Scale X=0.625, Scale Y=0.5, Scale Z=0.625, and move it up to Translate Y=22.0

5. Duplicate ''torso'' and name the copy ''R_thigh''. Scale ''R_thigh'' to Scale X=0.5, Scale Y=1.125, Scale Z=0.5, and move it to Translate X= -3.0, Translate Y= -6.25 

6. Duplicate ''R_thigh'' and name the copy ''L_thigh''. Move ''L_thigh'' to Translate X=3.0

7. Duplicate ''R_thigh'' and name the copy ''R_calf''. Scale ''R_calf'' to Scale X=0.35, Z= 0.35, and move to Translate Y= -18.0

8. Duplicate ''R_calf'' and name the copy ''L_calf''. Move ''L_calf'' to Translate X=3.0

9. Duplicate ''torso'' and name the copy ''R_arm''. Scale ''R_arm'' to Scale X=0.3, Scale Z=0.3, and move it to Translate X= -7.0 

10. Duplicate ''R_arm'' and name the copy ''L_arm''. Move ''L_arm'' to Translate X=7.0

11. Duplicate ''R_arm'' and rename the copy ''R_4arm''. Scale ''R_4arm'' to Scale X=0.25, Scale Y=0.9, Scale X=0.25, and move down to Translate Y=1.5

12. Duplicate ''R_4arm'' and name the copy ''L_4arm''. Move ''L_4arm'' to Translate X=7.0

The basic structure is done &amp;ndash; time now to make it just a tad more &quot;human&quot; by adding a small &quot;flex&quot; to the segments.

Note: this section does not tell you to Select Torso and set Rotate X=-4, and Select Hips and Rotate X=4, However

based on Fig 4. I think it is obvious that it should be done.

13. Move ''head'' to Translate Z= -0.5

14. Select both ''R_arm'' &amp; ''L_arm'' and set Translate Z= -0.5, Rotate X=4

15. Select both ''R_4arm'' &amp; ''L_4arm'' and set Translate Z= -0.5, Rotate X= -4

16. Select both ''R_thigh'' &amp; ''L_thigh'' and set Rotate X= -4

17. Select both ''R_calf'' &amp; ''L_calf'' and set Rotate X=4

Your model cylinder citizen should resemble FIG 4.

[[Image:Legacy_MCMT-04-CylMan.gif|center|FIG 4. The completed model]]

The next step is [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]] the model for skeletal animation.

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
    <revision>
      <id>5177</id>
      <timestamp>2004-05-01T13:24:42Z</timestamp>
      <contributor>
        <ip>24.207.204.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Modeling ==

The tutorial character is extremely simple: just cylinders of various dimensions arranged in a roughly bipedal human structure. No hands, no feet &amp;ndash; they'd complicate the animation process and slow the tutorial. Just torso, arms, legs, and head. In addition, the segments of the figure will be unconnected, reducing the need for finicky mesh point weight adjustments (skin weight painting). Remember, this is a very no-frills tutorial.

1. Launch Maya PLE, select the Modeling editor from the Status Line drop-down menu, and set your workspace view to perspective wireframe. Set the Grid parameters to Length and Width = 50, Grid Lines Every 0.5 units, and Subdivisions = 2. Enable Snap to Grids.

2. In the main menu use '''Create&gt;Polygon Primitives&gt;Cylinder&gt;OPTIONS''' (NOTE: OPTIONS is represented by the shadowed square to the right of the text menu item) to open the Polygon Cylinder Options dialog. Enter the values shown in FIG 2 and click Create. Change the name of the newly-created cylinder to ''torso''. Move ''torso'' up to Translate Y=12.0

[[Image:Legacy_MCMT-02-CylSpecs.gif|center|FIG 2. Polygon Cylinder options]]

3. Duplicate (Ctrl+d) the Cylinder and name the copy ''hips''. Scale ''hips'' to Scale X=0.8, Scale Y = 0.5, Scale Z=0.8 and move it to Translate Y=3.0. At this point the bottom cap of cylinder ''hips'' should be located close to the origin. Use the grid to confirm this (FIG 3).

[[Image:Legacy_MCMT-03-HipsAlign.gif|center|FIG 3. Position of the hips cylinder]]

4. Duplicate ''torso'' and name the copy ''head''. Scale ''head'' to Scale X=0.625, Scale Y=0.5, Scale Z=0.625, and move it up to Translate Y=22.0

5. Duplicate ''torso'' and name the copy ''R_thigh''. Scale ''R_thigh'' to Scale X=0.5, Scale Y=1.125, Scale Z=0.5, and move it to Translate X= -3.0, Translate Y= -6.25 

6. Duplicate ''R_thigh'' and name the copy ''L_thigh''. Move ''L_thigh'' to Translate X=3.0

7. Duplicate ''R_thigh'' and name the copy ''R_calf''. Scale ''R_calf'' to Scale X=0.35, Z= 0.35, and move to Translate Y= -18.0

8. Duplicate ''R_calf'' and name the copy ''L_calf''. Move ''L_calf'' to Translate X=3.0

9. Duplicate ''torso'' and name the copy ''R_arm''. Scale ''R_arm'' to Scale X=0.3, Scale Z=0.3, and move it to Translate X= -7.0 

10. Duplicate ''R_arm'' and name the copy ''L_arm''. Move ''L_arm'' to Translate X=7.0

11. Duplicate ''R_arm'' and rename the copy ''R_4arm''. Scale ''R_4arm'' to Scale X=0.25, Scale Y=0.9, Scale X=0.25, and move down to Translate Y=1.5

12. Duplicate ''R_4arm'' and name the copy ''L_4arm''. Move ''L_4arm'' to Translate X=7.0

The basic structure is done &amp;ndash; time now to make it just a tad more &quot;human&quot; by adding a small &quot;flex&quot; to the segments.

Note: this section does not tell you to Select Torso and set Rotate X=-4, and Select Hips and Rotate X=4, However

based on Fig 4. I think it is obvious that it should be done. - Hanover_Fist

13. Move ''head'' to Translate Z= -0.5

14. Select both ''R_arm'' &amp; ''L_arm'' and set Translate Z= -0.5, Rotate X=4

15. Select both ''R_4arm'' &amp; ''L_4arm'' and set Translate Z= -0.5, Rotate X= -4

16. Select both ''R_thigh'' &amp; ''L_thigh'' and set Translate X= -4

17. Select both ''R_calf'' &amp; ''L_calf'' and set Translate X=4

Your model cylinder citizen should resemble FIG 4.

[[Image:Legacy_MCMT-04-CylMan.gif|center|FIG 4. The completed model]]

The next step is [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]] the model for skeletal animation.

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
    <revision>
      <id>5178</id>
      <timestamp>2004-12-13T20:37:44Z</timestamp>
      <contributor>
        <ip>Doproxy.tvusd.k12.ca.us</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Modeling ==

The tutorial character is extremely simple: just cylinders of various dimensions arranged in a roughly bipedal human structure. No hands, no feet &amp;ndash; they'd complicate the animation process and slow the tutorial. Just torso, arms, legs, and head. In addition, the segments of the figure will be unconnected, reducing the need for finicky mesh point weight adjustments (skin weight painting). Remember, this is a very no-frills tutorial.

1. Launch Maya PLE, select the Modeling editor from the Status Line drop-down menu, and set your workspace view to perspective wireframe. Set the Grid parameters to Length and Width = 50, Grid Lines Every 0.5 units, and Subdivisions = 2. Enable Snap to Grids.

2. In the main menu use '''Create&gt;Polygon Primitives&gt;Cylinder&gt;OPTIONS''' (NOTE: OPTIONS is represented by the shadowed square to the right of the text menu item) to open the Polygon Cylinder Options dialog. Enter the values shown in FIG 2 and click Create. Change the name of the newly-created cylinder to ''torso''. Move ''torso'' up to Translate Y=12.0

[[Image:Legacy_MCMT-02-CylSpecs.gif|center|FIG 2. Polygon Cylinder options]]

3. Duplicate (Ctrl+d) the Cylinder and name the copy ''hips''. Scale ''hips'' to Scale X=0.8, Scale Y = 0.5, Scale Z=0.8 and move it to Translate Y=3.0. At this point the bottom cap of cylinder ''hips'' should be located close to the origin. Use the grid to confirm this (FIG 3).

[[Image:Legacy_MCMT-03-HipsAlign.gif|center|FIG 3. Position of the hips cylinder]]

4. Duplicate ''torso'' and name the copy ''head''. Scale ''head'' to Scale X=0.625, Scale Y=0.5, Scale Z=0.625, and move it up to Translate Y=22.0

5. Duplicate ''torso'' and name the copy ''R_thigh''. Scale ''R_thigh'' to Scale X=0.5, Scale Y=1.125, Scale Z=0.5, and move it to Translate X= -3.0, Translate Y= -6.25 

6. Duplicate ''R_thigh'' and name the copy ''L_thigh''. Move ''L_thigh'' to Translate X=3.0

7. Duplicate ''R_thigh'' and name the copy ''R_calf''. Scale ''R_calf'' to Scale X=0.35, Z= 0.35, and move to Translate Y= -18.0

8. Duplicate ''R_calf'' and name the copy ''L_calf''. Move ''L_calf'' to Translate X=3.0

9. Duplicate ''torso'' and name the copy ''R_arm''. Scale ''R_arm'' to Scale X=0.3, Scale Z=0.3, and move it to Translate X= -7.0 

10. Duplicate ''R_arm'' and name the copy ''L_arm''. Move ''L_arm'' to Translate X=7.0

11. Duplicate ''R_arm'' and rename the copy ''R_4arm''. Scale ''R_4arm'' to Scale X=0.25, Scale Y=0.9, Scale X=0.25, and move down to Translate Y=1.5

12. Duplicate ''R_4arm'' and name the copy ''L_4arm''. Move ''L_4arm'' to Translate X=7.0

The basic structure is done &amp;ndash; time now to make it just a tad more &quot;human&quot; by adding a small &quot;flex&quot; to the segments.

Note: this section does not tell you to Select Torso and set Rotate X=-4, and Select Hips and Rotate X=4, However

based on Fig 4. I think it is obvious that it should be done.

13. Move ''head'' to Translate Z= -0.5

14. Select both ''R_arm'' &amp; ''L_arm'' and set Translate Z= -0.5, Rotate X=4

15. Select both ''R_4arm'' &amp; ''L_4arm'' and set Translate Z= -0.5, Rotate X= -4

16. Select both ''R_thigh'' &amp; ''L_thigh'' and set Rotate X= -4

17. Select both ''R_calf'' &amp; ''L_calf'' and set Rotate X=4

Your model cylinder citizen should resemble FIG 4.

[[Image:Legacy_MCMT-04-CylMan.gif|center|FIG 4. The completed model]]

The next step is [[Legacy:Maya PLE Character Model Tutorial Part 2|Rigging]] the model for skeletal animation.

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya PLE Character Model Tutorial Part 2</title>
    <id>2127</id>
    <revision>
      <id>5179</id>
      <timestamp>2007-02-26T19:29:08Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Rigging the model ==

Time to add some bones. Unlike the UT2003 models, this one will have a minimal rig, and that brings up a point about bone names in character skeletons. 

As far as i know, the UT2003 characters were modeled and rigged in 3DS Max, which provides a pre-fabbed skeletal rig known as Biped as part of Character Studio. The bones in Biped are already named, and the game engine references these bone names in a number of ways, either directly or through assigned aliases.

But &amp;ndash; and this is an important caveat for custom model builders &amp;ndash; the Max bone names are not absolute requirements. Bones can be be named as suits the modeler/animator, as long as the game engine is properly informed about what bone names are actually used. That being said, it would obviously simplify the process of creating a custom character to use the Biped rig and its bone names, but for any except two-legged humanoids, Biped is inappropriate.

For this tutorial, custom bone names will be used, both to differentiate between Biped bones and the Maya PLE character's, and so the process of identifying custom bone names to the engine when necessary can be illustrated. Maya PLE has no pre-assembled rigs, so one has to be constructed.

18. Switch to the Animation editor. Select the '''IK Joint Tool''' from the Shelf, or in the main menu use '''Skeleton&gt;Joint Tool'''. For this tutorial we're using the default tool options for the Joint Tool, so opening the OPTIONS dialog isn't necessary. Make sure Snap to Grids is still enabled. 

Switch the workspace to an orthographic Front view.

19. Place the tool pointer at the workspace origin, click, move the pointer to Y=1, click, then hit Enter. This creates the first 2 joints and one bone. Press '''g''' (lower case) to get the Joint Tool back, then click again at the origin, then click at Y= -0.5. Hit Enter, creating a third joint. (see &quot;NOTE&quot; after step 22 for explanation of why values in the channel box change)

20. Open Outliner (main menu '''Window&gt;Outliner''') and expand the hierarchy (click the + sign) at ''joint1''. You should see ''joint2'' and ''joint3'' in the tree. Rename ''joint1'' to ''RootBone''. This bone is the top of the skeleton hierarchy for the model.

'''''HINTS:''''' Use Outliner for selecting joints and bones in the rigging process; it's much easier than trying to pick them out in the viewport. For better joint &amp; bone visibility, use '''Display&gt;Joint Size&gt;''' to enlarge them in the workspaces.

21. Rename ''joint2'' to ''Spine01''. Rename ''joint3'' to ''Pelvis''. These two joints will gain bones later.

You may note that Maya PLE labels the skeleton parts as joints, and we're renaming them as bones. In Maya PLE, bones are always associated with a joint, so we're essentially renaming the pair of objects. Joints can exist without bones, however, so some joints (such as those at the ends of skeletal hierarchies) may not be renamed. 

Time for a progress check. Compare FIG 5 with what you have in your scene.

[[Image:Legacy_MCMT-05-FirstBones.gif|center|FIG 5. RootBone, Spine01 and Pelvis]]

22. Use the '''IK Joint Tool''' to create a joint at the top of ''R_thigh'', X= -3, Y= -0.5, then at the knee Y= [-11], then at the bottom of the calf Y= [-12]. 

NOTE: The bracketed values indicate what shows in the Channel Box during this process &amp;ndash; they are relative to the parent joint of the joint being created, not to world space. To make things a bit more confusing, the Y value can become an X value once the LMB is release to form the joint, and can change sign as well. This is normal.

23. Select the joint at the top of ''R_thigh'' and rename it ''R_thighBone''. Select the joint at the top of ''R_calf'' and rename it ''R_calfBone''.

24. Duplicate ''R_thighBone''. As a child of ''R_thighBone'', ''R_calfBone'' will also be duplicated, preserving the hierarchy in the duplicate. Rename the duplicate of ''R_thighBone'' to ''L_thighBone'', and its child to ''L_calfBone''.

25. Select (in this order) ''R_thighBone'', then the joint named ''Pelvis''. In the main menu use '''Skeleton&gt;Connect Joint&gt;OPTIONS''', make sure the Parent Joint radio button is enabled in the dialog that opens, and click Apply. A new bone now connects ''R_thighBone'' and the ''Pelvis'' joint. This is the first half of a complete ''Pelvis'' bone.

26. Select (in this order) ''L_thighBone'', then ''Pelvis'', and in the Connect Joint Options dialog, once again click Apply.

This completes the lower-body hierarchy for this simplified skeleton and model. Expand the hierarchy tree in Outliner to see the parent/child relationships of the various bones, noting that ''RootBone'' is now at the top of the tree. Check FIG 6 to confirm the model's progress so far.

[[Image:Legacy_MCMT-06-LwrSkeleton.gif|center|FIG 6. The skeleton's lower half]]

27. To build the spine, select the '''IK Joint Tool''', click on the joint ''Spine01'', then place 3 more joints above it at [6], [6] and [4]. The last of the 3 should be placed at the top of the ''torso'' cylinder (FIG 7). Hit Enter to create the hierarchy.

[[Image:Legacy_MCMT-07-SpineBones.gif|center|FIG 7. Positioning the spine bones]]

28. Rename the spine joints in Outliner, moving up from ''Spine01'', as ''Spine02'', ''Spine03'', and ''Clavicle''. ''Clavicle'' has no bone yet.

29. Arm bones next. As with the leg bones, we'll create a two-bone hierarchy first, then connect it to the ''Clavicle'' joint. 

Starting at the top center of cylinder ''R_arm'', use the '''IK Joint Tool''' to create joints at the shoulder, elbow, and wrist, making sure the joints are aligned vertically, then hit Enter to set the hierarchy. Rename the joints created to ''R_armBone'' and ''R_4armBone'' &amp;ndash; which is which should be obvious. The end joint need not be renamed. 

When finished, select ''R_armBone'' and confirm that it's positioned at X= -7.0, Y=17.0

30. Duplicate ''R_armBone'' and move it to x=7.0, then rename the duplicate hierarchy appropriately for the left arm.

NOTE: Joint names in different hierarchies can be identical if the parent joints have different names, so for clarity, renaming ''all'' duplicated joints to avoid duplicate names is recommended.

31. Next select (in order) ''R_armBone'' and ''Clavicle'', then connect them in the same manner as with the leg bones and ''Pelvis''. Repeat the connect process with ''L_armBone'' and ''Clavicle''. (FIG 8)

[[Image:Legacy_MCMT-08-UpperBones.gif|center|FIG 8. The upper body bones]]

32. To complete the upper body hierarchy, it's now necessary to create and connect a neck joint and bone. Create a joint just above ''Clavicle'', at Y=17.5, and another at [5], then hit Enter. Rename the resulting bone as ''Neck''.

33. Select ''Neck'', then ''Clavicle'', and connect as before.

The skeleton is now complete. Check the layout in the viewports and the hierarchy in Outliner and confirm that they look like FIg 9.

[[Image:Legacy_MCMT-09-AllBones.gif|center|FIG 9. Front view of the complete skeleton]]

34. The X and Y positions of the joints are set, but some Z-axis tweaks are needed to align the rig with the polymesh &quot;skin.&quot; 

Switch to ortho Side view, select the joints one-by-one, and use the Move tool + Insert to adjust the joints in Z so they align with the centers of the polymesh limbs and torso (FIG 10). Be sure to use Insert to have the joints move independently of the skeletal hierarchy.

35. The spine is a special case. Maya PLE's IK solvers limit the extent a joint can flex, so for spine-like flexibility, the joint/bone system needs at least a couple of segments, and they have to be set up to flex in opposite directions. FIG 10 illustrates appropriate positioning for the spine segments &amp;ndash; copy the shallow &quot;zig-zag&quot; orientation shown. The reason for this will become apparent when IK Handles are applied to the rig.

[[Image:Legacy_MCMT-10-ZAxisTweaks.gif|center|FIG 10. Two views of the final skeleton]]

Keep in mind that this is a very rudimentary skeletal rig, suitable for this tutorial but not for a fully useable character. Study the UT2003 character rigs in the Animation browser, and other skeletal animation examples you can search out in the Maya documentation and on the web, for examples of fully-developed bone rigs. 

36. To preserve this orientation of the skeleton, select ''RootBone''. In the '''Command Line''' field, enter the MEL command string &lt;tt&gt;select -hi&lt;/tt&gt; and hit Enter. &lt;tt&gt;select -hi&lt;/tt&gt; tells Maya PLE to select all objects in the hierarchy below ''RootBone'', i.e., all the joints &amp; bones. MEL (Maya Embedded Language) commands are case-sensitive, so type it exactly. 

Use '''Skeleton&gt;Set Preferred Angle''' in the main menu. This &quot;records&quot; the orientation of all the selected joints so they can be reset later with the '''Skeleton&gt;Assume Preferred Angle''' menu item.

===Adding IK Handles ===

A skeletal hierarchy by itself is just a bag o' bones: unless you're planning to use only FK to animate it (not the usual method), IK Handles must be added to connect certain joint/bone pairs. If you're not too clear on the difference between Inverse Kinematic (IK) and Forward Kinematics (FK), no worries, for this tute a complete understanding isn't necessary. More info at [[Wikipedia:Inverse kinematic animation]] 

37. First the workspace has to be cleared of stuff not needed for now. In the main menu use '''Display&gt;Hide&gt;Geometry&gt;Polygon Surfaces''' to hide the polymesh cylinders so joints can be easily selected with the pointer. Switch to a perspective viewport.

38. Start with the legs. Select the '''IK Handle''' tool, click on ''joint'n' ''('n' is a number) at the end of the right leg joint/bone chain, then click on joint ''R_thighBone''. The leg bones will change color, selection handles appear, and the two joints are connected by a line, the handle vector.

39. In like fashion, create an IK Handle connecting ''joint'n' ''at the end of the left leg bone and ''L_thighBone''.

40. Create the arm bone IK Handles, connecting ''joint'n' ''at the end of each chain to its respective shoulder joint. Then use '''Edit&gt;Select All by Type&gt;IK Handles''' and compare your rig to FIG 11.

[[Image:Legacy_MCMT-11-LimbsIK.gif|center|FIG 11. IK handles added to legs and arms]]

Save your file now. Time to play with the IK rig a bit before proceeding, and progress so far should be saved in case reverting to this point is necessary.

Select an IK handle and move it around, testing the range of motion it offers. Note that the joint the IK handle controls cannot be &quot;hyperextended&quot; &amp;ndash; flexed past a point where the joint/bone chain aligns with the handle vector line. While this is fine for joints like elbows and knees, it complicates structures like the spine, which has to flex with much greater freedom.

When you're ready to proceed, select the entire skeleton as described in 36. above, then use '''Skeleton&gt;Assume Preferred Angle''' to get your rig back in the &quot;default&quot; position. If this fails for some reason (it can occasionally fail with more complex rigs), just reopen the file without saving changes.

41. Connect ''Spine01'' and ''Spine03'' with an IK Handle.

42. Connect ''Spine02'' and ''Clavicle'' with an IK Handle. The character's IK controls are now rigged.

43. Rename the IK handles according to the bones they control &amp;ndash; see FIG 12. 

[[Image:Legacy_MCMT-12-IKHnames.gif|center|FIG 12. IK Handle names]]

Again take a few minutes to &quot;exercise&quot; the model using the IK handles. Gain some familiarity with the motion capabilities and limits, particularly the spine, which often requires manipulating more than one handle simultaneously to attain a desired position.

Once more it needs to be stated that this tutorial uses a VERY rudimentary model, with simple geometry and a simple IK rig (skeleton + IK handles). For a more complex model, the rigging is quite a bit more elaborate, as a review of the UT2003 models' skeletons will reveal. 

NOTE: There may also be significant differences in how Max &amp; Maya deal with Inverse Kinematics that will result in IK rigs that differ in detail, so using Maya PLE to &quot;copy&quot; a skeleton built in Max may not be successful without adaptation.

===Binding the Skin ===

This process &quot;attaches&quot; the polymesh objects of the character model to the IK rig so that the rig controls the motion of the polymesh, which is the only visible part of the model in-game.

44. Use '''Display&gt;Show&gt;Show Geometry&gt;Polygon Surfaces''' to make the model's meshes visible again. Use '''Display&gt;Hide&gt;Hide Kinematics&gt;All''' to hide the IK rig for now while some more modeling is done.

45. Looking at Outliner, the scene now has 11 polymesh objects listed. These have to be made into a single polymesh for binding as a skin. Switch to the '''Modeling''' editor, then select all the cylinders comprising the model.

46. Use '''Polygons&gt;Combine''' in the main menu. Outliner now shows a single polymesh object (''polySurface'n' ''). Rename this object ''SkinMesh''. 

Note that in Outliner, things are getting complicated, as it still displays the names of the previously separate cylinder objects (FIG 13). These are part of the &quot;history&quot; of the polygon mesh we've been working with. They're not needed, so delete them by selecting ''SkinMesh'' and using '''Edit&gt;Delete by Type&gt;History''' in the main menu.

[[Image:Legacy_MCMT-13-History.gif|center|FIG 13. The combined polymesh's history in Outliner]]

47. Switch back to the '''Animation''' editor and make the IK rig visible again with '''Display&gt;Show&gt;Show Kinematics&gt;All'''.

48. In Outliner, select ''SkinMesh'', then Ctrl+select ''RootBone'' to add it to the selection. 

49. In the main menu, use '''Skin&gt;Bind Skins&gt;Smooth Bind&gt;OPTIONS''' to open the Smooth Bind Options dialog. Enter the settings shown in FIG 14 and click Bind Skin. ''SkinMesh'' will change color, indicating it is now bound to the IK rig.

[[Image:Legacy_MCMT-14-BindSkinSpecs.gif|center|FIG 14. The Smooth Bind options to use]]

50. Select an IK handle and move it &amp;ndash; ''SkinMesh'' moves with it. If things look wrong in some places, it's OK, it'll be fixed in a moment.

51. After binding, the position of the IK rig + skin is &quot;recorded&quot; as the Bind Pose. If while moving the model around you manage to &quot;lock&quot; it into a distorted pose that can't be undone (it can happen with extreme poses), select any part of the skeleton and use '''Skin&gt;Go to Bind Pose''' to recover.

You may note that some parts of ''SkinMesh'' move inappropriately, like parts of the torso moving with the arms. This is due to the binding method used (Closest Joint), and can be fixed in a number of ways. The usual method is to bind the skin in a different pose where the bones and skin sections are more widely separated. This is one reason the reference pose for many models is the &quot;T-bone&quot; &amp;ndash; arms-straight-out-from-the-shoulders.

52. Select ''SkinMesh'' in Outliner and use '''Skin&gt;Detach Skin&gt;OPTIONS''' to open the dialog. Choose the Delete History option, then click Detach. ''SkinMesh'' is no longer bound to the IK rig.

53. Hide the Kinematics (IK rig) as before, and switch to the Modeling editor. With ''SkinMesh'' selected, use '''Edit Polygons&gt;Separate'''. In Outliner, ''SkinMesh'' changes to a Group item (different icon), and the individual cylinders of the model are listed as group members (with new names, unfortunately, but that's not critical at this point).

54. Using an ortho front viewport, select the 2 cylinders of the right arm, then select the Rotate Tool. The pivot is at the origin, and will have to be moved to the &quot;shoulder&quot; position, so use Insert and move it to the top center of the right upper arm cylinder (FIG 15). Make sure Snap to Grids is enabled to insure accurate positioning of the pivot.

[[Image:Legacy_MCMT-15-PlacePivot.gif|center|FIG 15. Place the pivot at the top center of the &quot;shoulder&quot;]]

55. Hit Insert again to disable &quot;move pivot&quot; mode, then rotate the two selected cylinders -90 degrees on the Z axis so they point straight out from the torso (FIG 16). This can be done with the manipulator (hard to get exactly 90 degrees), or by entering Rotate Z= -90 in the Channel Box.

[[Image:Legacy_MCMT-16-RotateArm.gif|center|FIG 16. Rotating the arm]]

56. To complete the &quot;T-bone&quot; pose, re-align the left arm cylinders in like fashion. The rotation for these will be Rotate Z=90. 

57. Select All and use '''Polygons&gt;Combine''', then use '''Edit&gt;Delete by Type&gt;History''' to clear the unnecessary items from Outliner. Rename the combined polymesh as ''SkinMesh''.

58. Show the IK rig. Make sure Snap to Grids is enabled. Select ''ikHandle_R_arm'' and move the arm bones so they line up with the center of the right arm cylinders (FIG 17). Align the left arm bones to the left arm mesh in similar fashion. Switch to ortho Top view to confirm the bone alignment along the centers of the cylinders (FIG 17).

[[Image:Legacy_MCMT-17-IKHrealign.gif|center|FIG 17. Realigning the skeleton using the IK handles]]

59. Switch to the Animation editor. In Outliner, select ''SkinMesh'', Ctrl-select ''RootBone'', and use '''Skin&gt;Bind Skin&gt;Smooth Bind''' to once again attach the skin to the IK rig. The options are preserved from the last Smooth Bind, so the dialog isn't needed this time. 

Move the IK handles around &amp;ndash; the previous inappropriate skin moves are gone. Near the joints, the skin deformation influenced by the joints is obvious, but that's normal (and desirable for models where the entire body is a single continuous mesh). 

At this point it's possible to proceed with animating the character, but it's also a good time to use one of Maya's coolest character modeling features (imho, of course), the '''Paint Skin Weights Tool''' (PSWT).

&quot;Skin weights&quot; refers to the amount of influence any joint/bone has over any single vertex in the polygon mesh bound to a skeleton. Some apps use numerical data entry to fine tune this value, and in Maya PLE that's also an option, but I find it tedious and inefficient. The Paint Skin Weights tool does the same task with a &quot;paint brush&quot; applied directly to the model.

60. Switch the viewport Shading from Wireframe to Smooth Shade All. Use Display&gt;Grid to toggle the viewport grid off. Switch to a perspective viewport.

61. Select ''SkinMesh''. Use '''Skin&gt;Edit Smooth Skin&gt;Paint Skin Weights Tool&gt;OPTIONS''' to open the appropriate dialog. ''SkinMesh'' will turn from shaded grey to flat black, with some grey perhaps visible in a small patch or patches.

62. In the Paint Skin Weights Tool dialog, the Brush, Influence and Paint Weights sections should be revealed. 

Note the listing of bone names (called Transforms in the dialog). When a bone is selected in this list, the amount of influence it has on a skin mesh is displayed on the model by a shade of grey &amp;ndash; the brighter the grey, the more the influence, up to 1.0 = white = 100% influence.

The Brush section is fairly self-explanatory. The defaults are OK for now. In the Paint Weights section, the 2 operations of greatest interest are Scale and Add. 

Scale reduces the influence by multiplying the current influence by the number in the Value field. A Scale Value of 0 removes all influence. 

Value is added to the influence when Add is enabled.

Replace changes the influence to Value. 

Smooth is more valuable on high-poly models where vertices are closely spaced. It evens the distribution of skin weight Values in a painted area.

Skin weights are normalized, meaning the influences on any vertex from any number of joints must always add up to no more than 1.0.

63. Before painting, use '''Skin&gt;Edit Smooth Skin&gt;Enable Weight Normalization''' to have Maya PLE automatically normalize the influences on vertices during painting.

In the PSWT dialog, reveal the Display section and check the Show Wireframe checkbox. For low-poly models this makes it easier to identify the vertex locations when painting.

64. In the Transforms list (the bone names), select ''R_armBone''. The model is &quot;illuminated&quot; to show the extent of influence this bone has on the skin. Note the fade to grey at the ends of the upper arm cylinder &amp;ndash; in most models, areas near joints have shared influence (FIG 18). Select ''R_4armBone'' in the PSWT Transforms list and note a similar weight distribution. At the joint, total influence is 1.0, but it's shared by the two bones. You're about to change that.

[[Image:Legacy_MCMT-18-SkinWeights.gif|center|FIG 18. Shared skin weights near the elbow joint]]

The character looks a bit like it's been assembled from tin cans, so he's now officially dubbed &quot;TinCanMan.&quot; But tin cans are rigid, so the shared influences at joints cause flex in the skin &quot;cylinders&quot; that are unnatural for TinCanMan. This is remedied by painting the skin weights to different values.

65. In the PSWT, select ''R_armBone'' and enable Add, set Value = 1.0. Paint the &quot;elbow&quot; end of the upper arm section of ''SkinMesh'', being sure the brush passes over the vertices. The skin will turn white where the painted weight is applied. Paint all sides of the elbow end of the upper arm cylinder.

66. Select Scale, set Value = 0. Paint the elbow section of the right forearm segment of the mesh &amp;ndash; it will turn from pale grey to flat black. All influence from ''R_armBone'' has been removed from this portion of the mesh (FIG 19).

[[Image:Legacy_MCMT-19-PaintSkinWeights.gif|center|FIG. 19 Painting the elbow joint skin weights]]

Now select ''R_4armBone'' in the Transforms list and note the changes to its influence. The auto-normalization insures that the influence removed from ''R_armBone'' is added to ''R_4armBone''. Now flex the joint and note that the end of the cylinders near the joint are no longer deformed &amp;ndash; the &quot;tin cans&quot; now look rigid. Reactivate the PSWT (which was disabled when the Move tool was chosen).

Select ''L_armBone'' in the PSWT list. Note that its influences match the initial values for its counterpart on the right. This  part of the mesh does not need to be painted to match &amp;ndash; there's a menu item for that.

67. Use '''Skin&gt;Edit Smooth Skin&gt;Mirror Skin Weights&gt;OPTIONS''', and in the dialog enable Mirror Axis YZ, leave Direction unchecked (or uncheck it). Click Mirror. The display of skin weights on the model doesn't update immediately, so select ''L_armBone'' again in the PSWT. The skin weight influences from ''R_armBone'' have been mirrored across the YZ plane to ''L_armBone''.

68. Use the PSWT techniques to modify the influences on the rest of the right side of the IK rig, so TinCanMan's parts don't deform &quot;out of character.&quot; 

For the torso segment of TinCanMan, ''Spine02'' should have full influence. For the hips segment, ''Spine01'' should have full influence.

Mirror the changes to the left side, and the skin weight painting is done.

The PSWT is invaluable for tweaking the joints of &quot;real&quot; characters, because the default weighting at joints usually leads to some unnatural deformation. Using the PSWT judiciously can greatly increase the realism of characters, particularly those with a single continuous skin mesh.

BTW, the UT2K3 models use segmented body parts extensively&amp;ndash; they are, to a certain degree, just much more sophisticated &quot;TinCanCreatures.&quot;

Practice using the IK handles to manipulate TinCanMan, using '''Skin&gt;Go to Bind Pose''' to &quot;reset&quot; his position.

Time to create some [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]] for TinCanMan.

==Discussion==

'''Animus:''' is it not easyer to use the mirror joint tool? image 5 is confusing it says RootBone, Spine01 and Pelvis that means the middle one is the spine? at 27 the tut says connect a new joint start at spine01 ? also at 23 it says nothing about ranaming the joint for the foot.

'''SuperApe:''' Q#1: It may indeed be easier to use the mirror joint tool; this may just be a matter of preference on the part of the author to show the low-level steps involved.  Q#2: Yes.  Q#3: Yes.  Q#4: There is no foot.  These are minor complaints when weighed against scope and quality of the whole tutorial.  Unless there was a major problem (and I haven't found one in this tut), I wouldn't worry about it.

'''Animus:''' yes your totaly right this tutorial is very good i just wanted to make it clear.

'''Dr. Freemanstein:''' I am experiencing big problems at step 49.  I have Maya 7.0 PLE which does not share the same options as the example dialogue box.  In 7.0, the &quot;Bind To&quot; drop down only has &quot;Joint Heirarchy&quot;, &quot;Selected Joints&quot; and &quot;Object Heirarchy&quot;.  Also the &quot;Bind Method&quot; menu only has &quot;Closest in Heirarchy&quot; and &quot;Closest Distance&quot;.  I have tried all possible combinations, but to no avail.  Moving the IK handles only moves the bones while the skin remains stationary!  Anyone figured this one out??

'''SuperApe:''' My educated guess is that Bind &quot;Joint Heirarchy&quot; is the same as &quot;Complete Skeleton&quot; and that &quot;Object Heirarchy&quot; is a new option.  Also, I can guess that Bind Options &quot;Closest in Heirarchy&quot; is the same as &quot;Closest Joint&quot; and that the syntax here changed to acomodate the new &quot;Object Heirarchy&quot; option.  As to why your Bind operation is not working, I would make sure you are shift-selecting your Mesh and Root joint in that order and that you see the Mesh color change once the Bind operation is complete. :)
  

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
    <revision>
      <id>5180</id>
      <timestamp>2007-02-26T16:27:00Z</timestamp>
      <contributor>
        <ip>Swan-cache-3.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Rigging the model ==

Time to add some bones. Unlike the UT2003 models, this one will have a minimal rig, and that brings up a point about bone names in character skeletons. 

As far as i know, the UT2003 characters were modeled and rigged in 3DS Max, which provides a pre-fabbed skeletal rig known as Biped as part of Character Studio. The bones in Biped are already named, and the game engine references these bone names in a number of ways, either directly or through assigned aliases.

But &amp;ndash; and this is an important caveat for custom model builders &amp;ndash; the Max bone names are not absolute requirements. Bones can be be named as suits the modeler/animator, as long as the game engine is properly informed about what bone names are actually used. That being said, it would obviously simplify the process of creating a custom character to use the Biped rig and its bone names, but for any except two-legged humanoids, Biped is inappropriate.

For this tutorial, custom bone names will be used, both to differentiate between Biped bones and the Maya PLE character's, and so the process of identifying custom bone names to the engine when necessary can be illustrated. Maya PLE has no pre-assembled rigs, so one has to be constructed.

18. Switch to the Animation editor. Select the '''IK Joint Tool''' from the Shelf, or in the main menu use '''Skeleton&gt;Joint Tool'''. For this tutorial we're using the default tool options for the Joint Tool, so opening the OPTIONS dialog isn't necessary. Make sure Snap to Grids is still enabled. 

Switch the workspace to an orthographic Front view.

19. Place the tool pointer at the workspace origin, click, move the pointer to Y=1, click, then hit Enter. This creates the first 2 joints and one bone. Press '''g''' (lower case) to get the Joint Tool back, then click again at the origin, then click at Y= -0.5. Hit Enter, creating a third joint. (see &quot;NOTE&quot; after step 22 for explanation of why values in the channel box change)

20. Open Outliner (main menu '''Window&gt;Outliner''') and expand the hierarchy (click the + sign) at ''joint1''. You should see ''joint2'' and ''joint3'' in the tree. Rename ''joint1'' to ''RootBone''. This bone is the top of the skeleton hierarchy for the model.

'''''HINTS:''''' Use Outliner for selecting joints and bones in the rigging process; it's much easier than trying to pick them out in the viewport. For better joint &amp; bone visibility, use '''Display&gt;Joint Size&gt;''' to enlarge them in the workspaces.

21. Rename ''joint2'' to ''Spine01''. Rename ''joint3'' to ''Pelvis''. These two joints will gain bones later.

You may note that Maya PLE labels the skeleton parts as joints, and we're renaming them as bones. In Maya PLE, bones are always associated with a joint, so we're essentially renaming the pair of objects. Joints can exist without bones, however, so some joints (such as those at the ends of skeletal hierarchies) may not be renamed. 

Time for a progress check. Compare FIG 5 with what you have in your scene.

[[Image:Legacy_MCMT-05-FirstBones.gif|center|FIG 5. RootBone, Spine01 and Pelvis]]

22. Use the '''IK Joint Tool''' to create a joint at the top of ''R_thigh'', X= -3, Y= -0.5, then at the knee Y= [-11], then at the bottom of the calf Y= [-12]. 

NOTE: The bracketed values indicate what shows in the Channel Box during this process &amp;ndash; they are relative to the parent joint of the joint being created, not to world space. To make things a bit more confusing, the Y value can become an X value once the LMB is release to form the joint, and can change sign as well. This is normal.

23. Select the joint at the top of ''R_thigh'' and rename it ''R_thighBone''. Select the joint at the top of ''R_calf'' and rename it ''R_calfBone''.

24. Duplicate ''R_thighBone''. As a child of ''R_thighBone'', ''R_calfBone'' will also be duplicated, preserving the hierarchy in the duplicate. Rename the duplicate of ''R_thighBone'' to ''L_thighBone'', and its child to ''L_calfBone''.

25. Select (in this order) ''R_thighBone'', then the joint named ''Pelvis''. In the main menu use '''Skeleton&gt;Connect Joint&gt;OPTIONS''', make sure the Parent Joint radio button is enabled in the dialog that opens, and click Apply. A new bone now connects ''R_thighBone'' and the ''Pelvis'' joint. This is the first half of a complete ''Pelvis'' bone.

26. Select (in this order) ''L_thighBone'', then ''Pelvis'', and in the Connect Joint Options dialog, once again click Apply.

This completes the lower-body hierarchy for this simplified skeleton and model. Expand the hierarchy tree in Outliner to see the parent/child relationships of the various bones, noting that ''RootBone'' is now at the top of the tree. Check FIG 6 to confirm the model's progress so far.

[[Image:Legacy_MCMT-06-LwrSkeleton.gif|center|FIG 6. The skeleton's lower half]]

27. To build the spine, select the '''IK Joint Tool''', click on the joint ''Spine01'', then place 3 more joints above it at [6], [6] and [4]. The last of the 3 should be placed at the top of the ''torso'' cylinder (FIG 7). Hit Enter to create the hierarchy.

[[Image:Legacy_MCMT-07-SpineBones.gif|center|FIG 7. Positioning the spine bones]]

28. Rename the spine joints in Outliner, moving up from ''Spine01'', as ''Spine02'', ''Spine03'', and ''Clavicle''. ''Clavicle'' has no bone yet.

29. Arm bones next. As with the leg bones, we'll create a two-bone hierarchy first, then connect it to the ''Clavicle'' joint. 

Starting at the top center of cylinder ''R_arm'', use the '''IK Joint Tool''' to create joints at the shoulder, elbow, and wrist, making sure the joints are aligned vertically, then hit Enter to set the hierarchy. Rename the joints created to ''R_armBone'' and ''R_4armBone'' &amp;ndash; which is which should be obvious. The end joint need not be renamed. 

When finished, select ''R_armBone'' and confirm that it's positioned at X= -7.0, Y=17.0

30. Duplicate ''R_armBone'' and move it to x=7.0, then rename the duplicate hierarchy appropriately for the left arm.

NOTE: Joint names in different hierarchies can be identical if the parent joints have different names, so for clarity, renaming ''all'' duplicated joints to avoid duplicate names is recommended.

31. Next select (in order) ''R_armBone'' and ''Clavicle'', then connect them in the same manner as with the leg bones and ''Pelvis''. Repeat the connect process with ''L_armBone'' and ''Clavicle''. (FIG 8)

[[Image:Legacy_MCMT-08-UpperBones.gif|center|FIG 8. The upper body bones]]

32. To complete the upper body hierarchy, it's now necessary to create and connect a neck joint and bone. Create a joint just above ''Clavicle'', at Y=17.5, and another at [5], then hit Enter. Rename the resulting bone as ''Neck''.

33. Select ''Neck'', then ''Clavicle'', and connect as before.

The skeleton is now complete. Check the layout in the viewports and the hierarchy in Outliner and confirm that they look like FIg 9.

[[Image:Legacy_MCMT-09-AllBones.gif|center|FIG 9. Front view of the complete skeleton]]

34. The X and Y positions of the joints are set, but some Z-axis tweaks are needed to align the rig with the polymesh &quot;skin.&quot; 

Switch to ortho Side view, select the joints one-by-one, and use the Move tool + Insert to adjust the joints in Z so they align with the centers of the polymesh limbs and torso (FIG 10). Be sure to use Insert to have the joints move independently of the skeletal hierarchy.

35. The spine is a special case. Maya PLE's IK solvers limit the extent a joint can flex, so for spine-like flexibility, the joint/bone system needs at least a couple of segments, and they have to be set up to flex in opposite directions. FIG 10 illustrates appropriate positioning for the spine segments &amp;ndash; copy the shallow &quot;zig-zag&quot; orientation shown. The reason for this will become apparent when IK Handles are applied to the rig.

[[Image:Legacy_MCMT-10-ZAxisTweaks.gif|center|FIG 10. Two views of the final skeleton]]

Keep in mind that this is a very rudimentary skeletal rig, suitable for this tutorial but not for a fully useable character. Study the UT2003 character rigs in the Animation browser, and other skeletal animation examples you can search out in the Maya documentation and on the web, for examples of fully-developed bone rigs. 

36. To preserve this orientation of the skeleton, select ''RootBone''. In the '''Command Line''' field, enter the MEL command string &lt;tt&gt;select -hi&lt;/tt&gt; and hit Enter. &lt;tt&gt;select -hi&lt;/tt&gt; tells Maya PLE to select all objects in the hierarchy below ''RootBone'', i.e., all the joints &amp; bones. MEL (Maya Embedded Language) commands are case-sensitive, so type it exactly. 

Use '''Skeleton&gt;Set Preferred Angle''' in the main menu. This &quot;records&quot; the orientation of all the selected joints so they can be reset later with the '''Skeleton&gt;Assume Preferred Angle''' menu item.

===Adding IK Handles ===

A skeletal hierarchy by itself is just a bag o' bones: unless you're planning to use only FK to animate it (not the usual method), IK Handles must be added to connect certain joint/bone pairs. If you're not too clear on the difference between Inverse Kinematic (IK) and Forward Kinematics (FK), no worries, for this tute a complete understanding isn't necessary. More info at [[Wikipedia:Inverse kinematic animation]] 

37. First the workspace has to be cleared of stuff not needed for now. In the main menu use '''Display&gt;Hide&gt;Geometry&gt;Polygon Surfaces''' to hide the polymesh cylinders so joints can be easily selected with the pointer. Switch to a perspective viewport.

38. Start with the legs. Select the '''IK Handle''' tool, click on ''joint'n' ''('n' is a number) at the end of the right leg joint/bone chain, then click on joint ''R_thighBone''. The leg bones will change color, selection handles appear, and the two joints are connected by a line, the handle vector.

39. In like fashion, create an IK Handle connecting ''joint'n' ''at the end of the left leg bone and ''L_thighBone''.

40. Create the arm bone IK Handles, connecting ''joint'n' ''at the end of each chain to its respective shoulder joint. Then use '''Edit&gt;Select All by Type&gt;IK Handles''' and compare your rig to FIG 11.

[[Image:Legacy_MCMT-11-LimbsIK.gif|center|FIG 11. IK handles added to legs and arms]]

Save your file now. Time to play with the IK rig a bit before proceeding, and progress so far should be saved in case reverting to this point is necessary.

Select an IK handle and move it around, testing the range of motion it offers. Note that the joint the IK handle controls cannot be &quot;hyperextended&quot; &amp;ndash; flexed past a point where the joint/bone chain aligns with the handle vector line. While this is fine for joints like elbows and knees, it complicates structures like the spine, which has to flex with much greater freedom.

When you're ready to proceed, select the entire skeleton as described in 36. above, then use '''Skeleton&gt;Assume Preferred Angle''' to get your rig back in the &quot;default&quot; position. If this fails for some reason (it can occasionally fail with more complex rigs), just reopen the file without saving changes.

41. Connect ''Spine01'' and ''Spine03'' with an IK Handle.

42. Connect ''Spine02'' and ''Clavicle'' with an IK Handle. The character's IK controls are now rigged.

43. Rename the IK handles according to the bones they control &amp;ndash; see FIG 12. 

[[Image:Legacy_MCMT-12-IKHnames.gif|center|FIG 12. IK Handle names]]

Again take a few minutes to &quot;exercise&quot; the model using the IK handles. Gain some familiarity with the motion capabilities and limits, particularly the spine, which often requires manipulating more than one handle simultaneously to attain a desired position.

Once more it needs to be stated that this tutorial uses a VERY rudimentary model, with simple geometry and a simple IK rig (skeleton + IK handles). For a more complex model, the rigging is quite a bit more elaborate, as a review of the UT2003 models' skeletons will reveal. 

NOTE: There may also be significant differences in how Max &amp; Maya deal with Inverse Kinematics that will result in IK rigs that differ in detail, so using Maya PLE to &quot;copy&quot; a skeleton built in Max may not be successful without adaptation.

===Binding the Skin ===

This process &quot;attaches&quot; the polymesh objects of the character model to the IK rig so that the rig controls the motion of the polymesh, which is the only visible part of the model in-game.

44. Use '''Display&gt;Show&gt;Show Geometry&gt;Polygon Surfaces''' to make the model's meshes visible again. Use '''Display&gt;Hide&gt;Hide Kinematics&gt;All''' to hide the IK rig for now while some more modeling is done.

45. Looking at Outliner, the scene now has 11 polymesh objects listed. These have to be made into a single polymesh for binding as a skin. Switch to the '''Modeling''' editor, then select all the cylinders comprising the model.

46. Use '''Polygons&gt;Combine''' in the main menu. Outliner now shows a single polymesh object (''polySurface'n' ''). Rename this object ''SkinMesh''. 

Note that in Outliner, things are getting complicated, as it still displays the names of the previously separate cylinder objects (FIG 13). These are part of the &quot;history&quot; of the polygon mesh we've been working with. They're not needed, so delete them by selecting ''SkinMesh'' and using '''Edit&gt;Delete by Type&gt;History''' in the main menu.

[[Image:Legacy_MCMT-13-History.gif|center|FIG 13. The combined polymesh's history in Outliner]]

47. Switch back to the '''Animation''' editor and make the IK rig visible again with '''Display&gt;Show&gt;Show Kinematics&gt;All'''.

48. In Outliner, select ''SkinMesh'', then Ctrl+select ''RootBone'' to add it to the selection. 

49. In the main menu, use '''Skin&gt;Bind Skins&gt;Smooth Bind&gt;OPTIONS''' to open the Smooth Bind Options dialog. Enter the settings shown in FIG 14 and click Bind Skin. ''SkinMesh'' will change color, indicating it is now bound to the IK rig.

[[Image:Legacy_MCMT-14-BindSkinSpecs.gif|center|FIG 14. The Smooth Bind options to use]]

50. Select an IK handle and move it &amp;ndash; ''SkinMesh'' moves with it. If things look wrong in some places, it's OK, it'll be fixed in a moment.

51. After binding, the position of the IK rig + skin is &quot;recorded&quot; as the Bind Pose. If while moving the model around you manage to &quot;lock&quot; it into a distorted pose that can't be undone (it can happen with extreme poses), select any part of the skeleton and use '''Skin&gt;Go to Bind Pose''' to recover.

You may note that some parts of ''SkinMesh'' move inappropriately, like parts of the torso moving with the arms. This is due to the binding method used (Closest Joint), and can be fixed in a number of ways. The usual method is to bind the skin in a different pose where the bones and skin sections are more widely separated. This is one reason the reference pose for many models is the &quot;T-bone&quot; &amp;ndash; arms-straight-out-from-the-shoulders.

52. Select ''SkinMesh'' in Outliner and use '''Skin&gt;Detach Skin&gt;OPTIONS''' to open the dialog. Choose the Delete History option, then click Detach. ''SkinMesh'' is no longer bound to the IK rig.

53. Hide the Kinematics (IK rig) as before, and switch to the Modeling editor. With ''SkinMesh'' selected, use '''Edit Polygons&gt;Separate'''. In Outliner, ''SkinMesh'' changes to a Group item (different icon), and the individual cylinders of the model are listed as group members (with new names, unfortunately, but that's not critical at this point).

54. Using an ortho front viewport, select the 2 cylinders of the right arm, then select the Rotate Tool. The pivot is at the origin, and will have to be moved to the &quot;shoulder&quot; position, so use Insert and move it to the top center of the right upper arm cylinder (FIG 15). Make sure Snap to Grids is enabled to insure accurate positioning of the pivot.

[[Image:Legacy_MCMT-15-PlacePivot.gif|center|FIG 15. Place the pivot at the top center of the &quot;shoulder&quot;]]

55. Hit Insert again to disable &quot;move pivot&quot; mode, then rotate the two selected cylinders -90 degrees on the Z axis so they point straight out from the torso (FIG 16). This can be done with the manipulator (hard to get exactly 90 degrees), or by entering Rotate Z= -90 in the Channel Box.

[[Image:Legacy_MCMT-16-RotateArm.gif|center|FIG 16. Rotating the arm]]

56. To complete the &quot;T-bone&quot; pose, re-align the left arm cylinders in like fashion. The rotation for these will be Rotate Z=90. 

57. Select All and use '''Polygons&gt;Combine''', then use '''Edit&gt;Delete by Type&gt;History''' to clear the unnecessary items from Outliner. Rename the combined polymesh as ''SkinMesh''.

58. Show the IK rig. Make sure Snap to Grids is enabled. Select ''ikHandle_R_arm'' and move the arm bones so they line up with the center of the right arm cylinders (FIG 17). Align the left arm bones to the left arm mesh in similar fashion. Switch to ortho Top view to confirm the bone alignment along the centers of the cylinders (FIG 17).

[[Image:Legacy_MCMT-17-IKHrealign.gif|center|FIG 17. Realigning the skeleton using the IK handles]]

59. Switch to the Animation editor. In Outliner, select ''SkinMesh'', Ctrl-select ''RootBone'', and use '''Skin&gt;Bind Skin&gt;Smooth Bind''' to once again attach the skin to the IK rig. The options are preserved from the last Smooth Bind, so the dialog isn't needed this time. 

Move the IK handles around &amp;ndash; the previous inappropriate skin moves are gone. Near the joints, the skin deformation influenced by the joints is obvious, but that's normal (and desirable for models where the entire body is a single continuous mesh). 

At this point it's possible to proceed with animating the character, but it's also a good time to use one of Maya's coolest character modeling features (imho, of course), the '''Paint Skin Weights Tool''' (PSWT).

&quot;Skin weights&quot; refers to the amount of influence any joint/bone has over any single vertex in the polygon mesh bound to a skeleton. Some apps use numerical data entry to fine tune this value, and in Maya PLE that's also an option, but I find it tedious and inefficient. The Paint Skin Weights tool does the same task with a &quot;paint brush&quot; applied directly to the model.

60. Switch the viewport Shading from Wireframe to Smooth Shade All. Use Display&gt;Grid to toggle the viewport grid off. Switch to a perspective viewport.

61. Select ''SkinMesh''. Use '''Skin&gt;Edit Smooth Skin&gt;Paint Skin Weights Tool&gt;OPTIONS''' to open the appropriate dialog. ''SkinMesh'' will turn from shaded grey to flat black, with some grey perhaps visible in a small patch or patches.

62. In the Paint Skin Weights Tool dialog, the Brush, Influence and Paint Weights sections should be revealed. 

Note the listing of bone names (called Transforms in the dialog). When a bone is selected in this list, the amount of influence it has on a skin mesh is displayed on the model by a shade of grey &amp;ndash; the brighter the grey, the more the influence, up to 1.0 = white = 100% influence.

The Brush section is fairly self-explanatory. The defaults are OK for now. In the Paint Weights section, the 2 operations of greatest interest are Scale and Add. 

Scale reduces the influence by multiplying the current influence by the number in the Value field. A Scale Value of 0 removes all influence. 

Value is added to the influence when Add is enabled.

Replace changes the influence to Value. 

Smooth is more valuable on high-poly models where vertices are closely spaced. It evens the distribution of skin weight Values in a painted area.

Skin weights are normalized, meaning the influences on any vertex from any number of joints must always add up to no more than 1.0.

63. Before painting, use '''Skin&gt;Edit Smooth Skin&gt;Enable Weight Normalization''' to have Maya PLE automatically normalize the influences on vertices during painting.

In the PSWT dialog, reveal the Display section and check the Show Wireframe checkbox. For low-poly models this makes it easier to identify the vertex locations when painting.

64. In the Transforms list (the bone names), select ''R_armBone''. The model is &quot;illuminated&quot; to show the extent of influence this bone has on the skin. Note the fade to grey at the ends of the upper arm cylinder &amp;ndash; in most models, areas near joints have shared influence (FIG 18). Select ''R_4armBone'' in the PSWT Transforms list and note a similar weight distribution. At the joint, total influence is 1.0, but it's shared by the two bones. You're about to change that.

[[Image:Legacy_MCMT-18-SkinWeights.gif|center|FIG 18. Shared skin weights near the elbow joint]]

The character looks a bit like it's been assembled from tin cans, so he's now officially dubbed &quot;TinCanMan.&quot; But tin cans are rigid, so the shared influences at joints cause flex in the skin &quot;cylinders&quot; that are unnatural for TinCanMan. This is remedied by painting the skin weights to different values.

65. In the PSWT, select ''R_armBone'' and enable Add, set Value = 1.0. Paint the &quot;elbow&quot; end of the upper arm section of ''SkinMesh'', being sure the brush passes over the vertices. The skin will turn white where the painted weight is applied. Paint all sides of the elbow end of the upper arm cylinder.

66. Select Scale, set Value = 0. Paint the elbow section of the right forearm segment of the mesh &amp;ndash; it will turn from pale grey to flat black. All influence from ''R_armBone'' has been removed from this portion of the mesh (FIG 19).

[[Image:Legacy_MCMT-19-PaintSkinWeights.gif|center|FIG. 19 Painting the elbow joint skin weights]]

Now select ''R_4armBone'' in the Transforms list and note the changes to its influence. The auto-normalization insures that the influence removed from ''R_armBone'' is added to ''R_4armBone''. Now flex the joint and note that the end of the cylinders near the joint are no longer deformed &amp;ndash; the &quot;tin cans&quot; now look rigid. Reactivate the PSWT (which was disabled when the Move tool was chosen).

Select ''L_armBone'' in the PSWT list. Note that its influences match the initial values for its counterpart on the right. This  part of the mesh does not need to be painted to match &amp;ndash; there's a menu item for that.

67. Use '''Skin&gt;Edit Smooth Skin&gt;Mirror Skin Weights&gt;OPTIONS''', and in the dialog enable Mirror Axis YZ, leave Direction unchecked (or uncheck it). Click Mirror. The display of skin weights on the model doesn't update immediately, so select ''L_armBone'' again in the PSWT. The skin weight influences from ''R_armBone'' have been mirrored across the YZ plane to ''L_armBone''.

68. Use the PSWT techniques to modify the influences on the rest of the right side of the IK rig, so TinCanMan's parts don't deform &quot;out of character.&quot; 

For the torso segment of TinCanMan, ''Spine02'' should have full influence. For the hips segment, ''Spine01'' should have full influence.

Mirror the changes to the left side, and the skin weight painting is done.

The PSWT is invaluable for tweaking the joints of &quot;real&quot; characters, because the default weighting at joints usually leads to some unnatural deformation. Using the PSWT judiciously can greatly increase the realism of characters, particularly those with a single continuous skin mesh.

BTW, the UT2K3 models use segmented body parts extensively&amp;ndash; they are, to a certain degree, just much more sophisticated &quot;TinCanCreatures.&quot;

Practice using the IK handles to manipulate TinCanMan, using '''Skin&gt;Go to Bind Pose''' to &quot;reset&quot; his position.

Time to create some [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]] for TinCanMan.

==Discussion==

'''Animus:''' is it not easyer to use the mirror joint tool? image 5 is confusing it says RootBone, Spine01 and Pelvis that means the middle one is the spine? at 27 the tut says connect a new joint start at spine01 ? also at 23 it says nothing about ranaming the joint for the foot.

'''SuperApe:''' Q#1: It may indeed be easier to use the mirror joint tool; this may just be a matter of preference on the part of the author to show the low-level steps involved.  Q#2: Yes.  Q#3: Yes.  Q#4: There is no foot.  These are minor complaints when weighed against scope and quality of the whole tutorial.  Unless there was a major problem (and I haven't found one in this tut), I wouldn't worry about it.

'''Animus:''' yes your totaly right this tutorial is very good i just wanted to make it clear.

'''Dr. Freemanstein:''' I am experiencing big problems at step 49.  I have Maya 7.0 PLE which does not share the same options as the example dialogue box.  In 7.0, the &quot;Bind To&quot; drop down only has &quot;Joint Heirarchy&quot;, &quot;Selected Joints&quot; and &quot;Object Heirarchy&quot;.  Also the &quot;Bind Method&quot; menu only has &quot;Closest in Heirarchy&quot; and &quot;Closest Distance&quot;.  I have tried all possible combinations, but to no avail.  Moving the IK handles only moves the bones while the skin remains stationary!  Anyone figured this one out??
  

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
    <revision>
      <id>10947</id>
      <timestamp>2008-04-09T17:37:38Z</timestamp>
      <contributor>
        <username>Angry baker</username>
        <id>156</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">==Rigging the model ==

Time to add some bones. Unlike the UT2003 models, this one will have a minimal rig, and that brings up a point about bone names in character skeletons. 

As far as i know, the UT2003 characters were modeled and rigged in 3DS Max, which provides a pre-fabbed skeletal rig known as Biped as part of Character Studio. The bones in Biped are already named, and the game engine references these bone names in a number of ways, either directly or through assigned aliases.

But &amp;ndash; and this is an important caveat for custom model builders &amp;ndash; the Max bone names are not absolute requirements. Bones can be be named as suits the modeler/animator, as long as the game engine is properly informed about what bone names are actually used. That being said, it would obviously simplify the process of creating a custom character to use the Biped rig and its bone names, but for any except two-legged humanoids, Biped is inappropriate.

For this tutorial, custom bone names will be used, both to differentiate between Biped bones and the Maya PLE character's, and so the process of identifying custom bone names to the engine when necessary can be illustrated. Maya PLE has no pre-assembled rigs, so one has to be constructed.

18. Switch to the Animation editor. Select the '''IK Joint Tool''' from the Shelf, or in the main menu use '''Skeleton&gt;Joint Tool'''. For this tutorial we're using the default tool options for the Joint Tool, so opening the OPTIONS dialog isn't necessary. Make sure Snap to Grids is still enabled. 

Switch the workspace to an orthographic Front view.

19. Place the tool pointer at the workspace origin, click, move the pointer to Y=1, click, then hit Enter. This creates the first 2 joints and one bone. Press '''g''' (lower case) to get the Joint Tool back, then click again at the origin, then click at Y= -0.5. Hit Enter, creating a third joint. (see &quot;NOTE&quot; after step 22 for explanation of why values in the channel box change)

20. Open Outliner (main menu '''Window&gt;Outliner''') and expand the hierarchy (click the + sign) at ''joint1''. You should see ''joint2'' and ''joint3'' in the tree. Rename ''joint1'' to ''RootBone''. This bone is the top of the skeleton hierarchy for the model.

'''''HINTS:''''' Use Outliner for selecting joints and bones in the rigging process; it's much easier than trying to pick them out in the viewport. For better joint &amp; bone visibility, use '''Display&gt;Joint Size&gt;''' to enlarge them in the workspaces.

21. Rename ''joint2'' to ''Spine01''. Rename ''joint3'' to ''Pelvis''. These two joints will gain bones later.

You may note that Maya PLE labels the skeleton parts as joints, and we're renaming them as bones. In Maya PLE, bones are always associated with a joint, so we're essentially renaming the pair of objects. Joints can exist without bones, however, so some joints (such as those at the ends of skeletal hierarchies) may not be renamed. 

Time for a progress check. Compare FIG 5 with what you have in your scene.

[[Image:Legacy_MCMT-05-FirstBones.gif|center|FIG 5. RootBone, Spine01 and Pelvis]]

22. Use the '''IK Joint Tool''' to create a joint at the top of ''R_thigh'', X= -3, Y= -0.5, then at the knee Y= [-11], then at the bottom of the calf Y= [-12]. 

NOTE: The bracketed values indicate what shows in the Channel Box during this process &amp;ndash; they are relative to the parent joint of the joint being created, not to world space. To make things a bit more confusing, the Y value can become an X value once the LMB is release to form the joint, and can change sign as well. This is normal.

23. Select the joint at the top of ''R_thigh'' and rename it ''R_thighBone''. Select the joint at the top of ''R_calf'' and rename it ''R_calfBone''.

24. Duplicate ''R_thighBone''. As a child of ''R_thighBone'', ''R_calfBone'' will also be duplicated, preserving the hierarchy in the duplicate. Rename the duplicate of ''R_thighBone'' to ''L_thighBone'', and its child to ''L_calfBone''.

25. Select (in this order) ''R_thighBone'', then the joint named ''Pelvis''. In the main menu use '''Skeleton&gt;Connect Joint&gt;OPTIONS''', make sure the Parent Joint radio button is enabled in the dialog that opens, and click Apply. A new bone now connects ''R_thighBone'' and the ''Pelvis'' joint. This is the first half of a complete ''Pelvis'' bone.

26. Select (in this order) ''L_thighBone'', then ''Pelvis'', and in the Connect Joint Options dialog, once again click Apply.

This completes the lower-body hierarchy for this simplified skeleton and model. Expand the hierarchy tree in Outliner to see the parent/child relationships of the various bones, noting that ''RootBone'' is now at the top of the tree. Check FIG 6 to confirm the model's progress so far.

[[Image:Legacy_MCMT-06-LwrSkeleton.gif|center|FIG 6. The skeleton's lower half]]

27. To build the spine, select the '''IK Joint Tool''', click on the joint ''Spine01'', then place 3 more joints above it at [6], [6] and [4]. The last of the 3 should be placed at the top of the ''torso'' cylinder (FIG 7). Hit Enter to create the hierarchy.

[[Image:Legacy_MCMT-07-SpineBones.gif|center|FIG 7. Positioning the spine bones]]

28. Rename the spine joints in Outliner, moving up from ''Spine01'', as ''Spine02'', ''Spine03'', and ''Clavicle''. ''Clavicle'' has no bone yet.

29. Arm bones next. As with the leg bones, we'll create a two-bone hierarchy first, then connect it to the ''Clavicle'' joint. 

Starting at the top center of cylinder ''R_arm'', use the '''IK Joint Tool''' to create joints at the shoulder, elbow, and wrist, making sure the joints are aligned vertically, then hit Enter to set the hierarchy. Rename the joints created to ''R_armBone'' and ''R_4armBone'' &amp;ndash; which is which should be obvious. The end joint need not be renamed. 

When finished, select ''R_armBone'' and confirm that it's positioned at X= -7.0, Y=17.0

30. Duplicate ''R_armBone'' and move it to x=7.0, then rename the duplicate hierarchy appropriately for the left arm.

NOTE: Joint names in different hierarchies can be identical if the parent joints have different names, so for clarity, renaming ''all'' duplicated joints to avoid duplicate names is recommended.

31. Next select (in order) ''R_armBone'' and ''Clavicle'', then connect them in the same manner as with the leg bones and ''Pelvis''. Repeat the connect process with ''L_armBone'' and ''Clavicle''. (FIG 8)

[[Image:Legacy_MCMT-08-UpperBones.gif|center|FIG 8. The upper body bones]]

32. To complete the upper body hierarchy, it's now necessary to create and connect a neck joint and bone. Create a joint just above ''Clavicle'', at Y=17.5, and another at [5], then hit Enter. Rename the resulting bone as ''Neck''.

33. Select ''Neck'', then ''Clavicle'', and connect as before.

The skeleton is now complete. Check the layout in the viewports and the hierarchy in Outliner and confirm that they look like FIg 9.

[[Image:Legacy_MCMT-09-AllBones.gif|center|FIG 9. Front view of the complete skeleton]]

34. The X and Y positions of the joints are set, but some Z-axis tweaks are needed to align the rig with the polymesh &quot;skin.&quot; 

Switch to ortho Side view, select the joints one-by-one, and use the Move tool + Insert to adjust the joints in Z so they align with the centers of the polymesh limbs and torso (FIG 10). Be sure to use Insert to have the joints move independently of the skeletal hierarchy.

35. The spine is a special case. Maya PLE's IK solvers limit the extent a joint can flex, so for spine-like flexibility, the joint/bone system needs at least a couple of segments, and they have to be set up to flex in opposite directions. FIG 10 illustrates appropriate positioning for the spine segments &amp;ndash; copy the shallow &quot;zig-zag&quot; orientation shown. The reason for this will become apparent when IK Handles are applied to the rig.

[[Image:Legacy_MCMT-10-ZAxisTweaks.gif|center|FIG 10. Two views of the final skeleton]]

Keep in mind that this is a very rudimentary skeletal rig, suitable for this tutorial but not for a fully useable character. Study the UT2003 character rigs in the Animation browser, and other skeletal animation examples you can search out in the Maya documentation and on the web, for examples of fully-developed bone rigs. 

36. To preserve this orientation of the skeleton, select ''RootBone''. In the '''Command Line''' field, enter the MEL command string &lt;tt&gt;select -hi&lt;/tt&gt; and hit Enter. &lt;tt&gt;select -hi&lt;/tt&gt; tells Maya PLE to select all objects in the hierarchy below ''RootBone'', i.e., all the joints &amp; bones. MEL (Maya Embedded Language) commands are case-sensitive, so type it exactly. 

Use '''Skeleton&gt;Set Preferred Angle''' in the main menu. This &quot;records&quot; the orientation of all the selected joints so they can be reset later with the '''Skeleton&gt;Assume Preferred Angle''' menu item.

===Adding IK Handles ===

A skeletal hierarchy by itself is just a bag o' bones: unless you're planning to use only FK to animate it (not the usual method), IK Handles must be added to connect certain joint/bone pairs. If you're not too clear on the difference between Inverse Kinematic (IK) and Forward Kinematics (FK), no worries, for this tute a complete understanding isn't necessary. More info at [[Wikipedia:Inverse kinematic animation]] 

37. First the workspace has to be cleared of stuff not needed for now. In the main menu use '''Display&gt;Hide&gt;Geometry&gt;Polygon Surfaces''' to hide the polymesh cylinders so joints can be easily selected with the pointer. Switch to a perspective viewport.

38. Start with the legs. Select the '''IK Handle''' tool, click on ''joint'n' ''('n' is a number) at the end of the right leg joint/bone chain, then click on joint ''R_thighBone''. The leg bones will change color, selection handles appear, and the two joints are connected by a line, the handle vector.

39. In like fashion, create an IK Handle connecting ''joint'n' ''at the end of the left leg bone and ''L_thighBone''.

40. Create the arm bone IK Handles, connecting ''joint'n' ''at the end of each chain to its respective shoulder joint. Then use '''Edit&gt;Select All by Type&gt;IK Handles''' and compare your rig to FIG 11.

[[Image:Legacy_MCMT-11-LimbsIK.gif|center|FIG 11. IK handles added to legs and arms]]

Save your file now. Time to play with the IK rig a bit before proceeding, and progress so far should be saved in case reverting to this point is necessary.

Select an IK handle and move it around, testing the range of motion it offers. Note that the joint the IK handle controls cannot be &quot;hyperextended&quot; &amp;ndash; flexed past a point where the joint/bone chain aligns with the handle vector line. While this is fine for joints like elbows and knees, it complicates structures like the spine, which has to flex with much greater freedom.

When you're ready to proceed, select the entire skeleton as described in 36. above, then use '''Skeleton&gt;Assume Preferred Angle''' to get your rig back in the &quot;default&quot; position. If this fails for some reason (it can occasionally fail with more complex rigs), just reopen the file without saving changes.

41. Connect ''Spine01'' and ''Spine03'' with an IK Handle.

42. Connect ''Spine02'' and ''Clavicle'' with an IK Handle. The character's IK controls are now rigged.

43. Rename the IK handles according to the bones they control &amp;ndash; see FIG 12. 

[[Image:Legacy_MCMT-12-IKHnames.gif|center|FIG 12. IK Handle names]]

Again take a few minutes to &quot;exercise&quot; the model using the IK handles. Gain some familiarity with the motion capabilities and limits, particularly the spine, which often requires manipulating more than one handle simultaneously to attain a desired position.

Once more it needs to be stated that this tutorial uses a VERY rudimentary model, with simple geometry and a simple IK rig (skeleton + IK handles). For a more complex model, the rigging is quite a bit more elaborate, as a review of the UT2003 models' skeletons will reveal. 

NOTE: There may also be significant differences in how Max &amp; Maya deal with Inverse Kinematics that will result in IK rigs that differ in detail, so using Maya PLE to &quot;copy&quot; a skeleton built in Max may not be successful without adaptation.

===Binding the Skin ===

This process &quot;attaches&quot; the polymesh objects of the character model to the IK rig so that the rig controls the motion of the polymesh, which is the only visible part of the model in-game.

44. Use '''Display&gt;Show&gt;Show Geometry&gt;Polygon Surfaces''' to make the model's meshes visible again. Use '''Display&gt;Hide&gt;Hide Kinematics&gt;All''' to hide the IK rig for now while some more modeling is done.

45. Looking at Outliner, the scene now has 11 polymesh objects listed. These have to be made into a single polymesh for binding as a skin. Switch to the '''Modeling''' editor, then select all the cylinders comprising the model.

46. Use '''Polygons&gt;Combine''' in the main menu. Outliner now shows a single polymesh object (''polySurface'n' ''). Rename this object ''SkinMesh''. 

Note that in Outliner, things are getting complicated, as it still displays the names of the previously separate cylinder objects (FIG 13). These are part of the &quot;history&quot; of the polygon mesh we've been working with. They're not needed, so delete them by selecting ''SkinMesh'' and using '''Edit&gt;Delete by Type&gt;History''' in the main menu.

[[Image:Legacy_MCMT-13-History.gif|center|FIG 13. The combined polymesh's history in Outliner]]

47. Switch back to the '''Animation''' editor and make the IK rig visible again with '''Display&gt;Show&gt;Show Kinematics&gt;All'''.

48. In Outliner, select ''SkinMesh'', then Ctrl+select ''RootBone'' to add it to the selection. 

49. In the main menu, use '''Skin&gt;Bind Skins&gt;Smooth Bind&gt;OPTIONS''' to open the Smooth Bind Options dialog. Enter the settings shown in FIG 14 and click Bind Skin. ''SkinMesh'' will change color, indicating it is now bound to the IK rig.

[[Image:Legacy_MCMT-14-BindSkinSpecs.gif|center|FIG 14. The Smooth Bind options to use]]

50. Select an IK handle and move it &amp;ndash; ''SkinMesh'' moves with it. If things look wrong in some places, it's OK, it'll be fixed in a moment.

51. After binding, the position of the IK rig + skin is &quot;recorded&quot; as the Bind Pose. If while moving the model around you manage to &quot;lock&quot; it into a distorted pose that can't be undone (it can happen with extreme poses), select any part of the skeleton and use '''Skin&gt;Go to Bind Pose''' to recover.

You may note that some parts of ''SkinMesh'' move inappropriately, like parts of the torso moving with the arms. This is due to the binding method used (Closest Joint), and can be fixed in a number of ways. The usual method is to bind the skin in a different pose where the bones and skin sections are more widely separated. This is one reason the reference pose for many models is the &quot;T-bone&quot; &amp;ndash; arms-straight-out-from-the-shoulders.

52. Select ''SkinMesh'' in Outliner and use '''Skin&gt;Detach Skin&gt;OPTIONS''' to open the dialog. Choose the Delete History option, then click Detach. ''SkinMesh'' is no longer bound to the IK rig.

53. Hide the Kinematics (IK rig) as before, and switch to the Modeling editor. With ''SkinMesh'' selected, use '''Edit Polygons&gt;Separate'''. In Outliner, ''SkinMesh'' changes to a Group item (different icon), and the individual cylinders of the model are listed as group members (with new names, unfortunately, but that's not critical at this point).

54. Using an ortho front viewport, select the 2 cylinders of the right arm, then select the Rotate Tool. The pivot is at the origin, and will have to be moved to the &quot;shoulder&quot; position, so use Insert and move it to the top center of the right upper arm cylinder (FIG 15). Make sure Snap to Grids is enabled to insure accurate positioning of the pivot.

[[Image:Legacy_MCMT-15-PlacePivot.gif|center|FIG 15. Place the pivot at the top center of the &quot;shoulder&quot;]]

55. Hit Insert again to disable &quot;move pivot&quot; mode, then rotate the two selected cylinders -90 degrees on the Z axis so they point straight out from the torso (FIG 16). This can be done with the manipulator (hard to get exactly 90 degrees), or by entering Rotate Z= -90 in the Channel Box.

[[Image:Legacy_MCMT-16-RotateArm.gif|center|FIG 16. Rotating the arm]]

56. To complete the &quot;T-bone&quot; pose, re-align the left arm cylinders in like fashion. The rotation for these will be Rotate Z=90. 

57. Select All and use '''Polygons&gt;Combine''', then use '''Edit&gt;Delete by Type&gt;History''' to clear the unnecessary items from Outliner. Rename the combined polymesh as ''SkinMesh''.

58. Show the IK rig. Make sure Snap to Grids is enabled. Select ''ikHandle_R_arm'' and move the arm bones so they line up with the center of the right arm cylinders (FIG 17). Align the left arm bones to the left arm mesh in similar fashion. Switch to ortho Top view to confirm the bone alignment along the centers of the cylinders (FIG 17).

[[Image:Legacy_MCMT-17-IKHrealign.gif|center|FIG 17. Realigning the skeleton using the IK handles]]

59. Switch to the Animation editor. In Outliner, select ''SkinMesh'', Ctrl-select ''RootBone'', and use '''Skin&gt;Bind Skin&gt;Smooth Bind''' to once again attach the skin to the IK rig. The options are preserved from the last Smooth Bind, so the dialog isn't needed this time. 

Move the IK handles around &amp;ndash; the previous inappropriate skin moves are gone. Near the joints, the skin deformation influenced by the joints is obvious, but that's normal (and desirable for models where the entire body is a single continuous mesh). 

At this point it's possible to proceed with animating the character, but it's also a good time to use one of Maya's coolest character modeling features (imho, of course), the '''Paint Skin Weights Tool''' (PSWT).

&quot;Skin weights&quot; refers to the amount of influence any joint/bone has over any single vertex in the polygon mesh bound to a skeleton. Some apps use numerical data entry to fine tune this value, and in Maya PLE that's also an option, but I find it tedious and inefficient. The Paint Skin Weights tool does the same task with a &quot;paint brush&quot; applied directly to the model.

60. Switch the viewport Shading from Wireframe to Smooth Shade All. Use Display&gt;Grid to toggle the viewport grid off. Switch to a perspective viewport.

61. Select ''SkinMesh''. Use '''Skin&gt;Edit Smooth Skin&gt;Paint Skin Weights Tool&gt;OPTIONS''' to open the appropriate dialog. ''SkinMesh'' will turn from shaded grey to flat black, with some grey perhaps visible in a small patch or patches.

62. In the Paint Skin Weights Tool dialog, the Brush, Influence and Paint Weights sections should be revealed. 

Note the listing of bone names (called Transforms in the dialog). When a bone is selected in this list, the amount of influence it has on a skin mesh is displayed on the model by a shade of grey &amp;ndash; the brighter the grey, the more the influence, up to 1.0 = white = 100% influence.

The Brush section is fairly self-explanatory. The defaults are OK for now. In the Paint Weights section, the 2 operations of greatest interest are Scale and Add. 

Scale reduces the influence by multiplying the current influence by the number in the Value field. A Scale Value of 0 removes all influence. 

Value is added to the influence when Add is enabled.

Replace changes the influence to Value. 

Smooth is more valuable on high-poly models where vertices are closely spaced. It evens the distribution of skin weight Values in a painted area.

Skin weights are normalized, meaning the influences on any vertex from any number of joints must always add up to no more than 1.0.

63. Before painting, use '''Skin&gt;Edit Smooth Skin&gt;Enable Weight Normalization''' to have Maya PLE automatically normalize the influences on vertices during painting.

In the PSWT dialog, reveal the Display section and check the Show Wireframe checkbox. For low-poly models this makes it easier to identify the vertex locations when painting.

64. In the Transforms list (the bone names), select ''R_armBone''. The model is &quot;illuminated&quot; to show the extent of influence this bone has on the skin. Note the fade to grey at the ends of the upper arm cylinder &amp;ndash; in most models, areas near joints have shared influence (FIG 18). Select ''R_4armBone'' in the PSWT Transforms list and note a similar weight distribution. At the joint, total influence is 1.0, but it's shared by the two bones. You're about to change that.

[[Image:Legacy_MCMT-18-SkinWeights.gif|center|FIG 18. Shared skin weights near the elbow joint]]

The character looks a bit like it's been assembled from tin cans, so he's now officially dubbed &quot;TinCanMan.&quot; But tin cans are rigid, so the shared influences at joints cause flex in the skin &quot;cylinders&quot; that are unnatural for TinCanMan. This is remedied by painting the skin weights to different values.

65. In the PSWT, select ''R_armBone'' and enable Add, set Value = 1.0. Paint the &quot;elbow&quot; end of the upper arm section of ''SkinMesh'', being sure the brush passes over the vertices. The skin will turn white where the painted weight is applied. Paint all sides of the elbow end of the upper arm cylinder.

66. Select Scale, set Value = 0. Paint the elbow section of the right forearm segment of the mesh &amp;ndash; it will turn from pale grey to flat black. All influence from ''R_armBone'' has been removed from this portion of the mesh (FIG 19).

[[Image:Legacy_MCMT-19-PaintSkinWeights.gif|center|FIG. 19 Painting the elbow joint skin weights]]

Now select ''R_4armBone'' in the Transforms list and note the changes to its influence. The auto-normalization insures that the influence removed from ''R_armBone'' is added to ''R_4armBone''. Now flex the joint and note that the end of the cylinders near the joint are no longer deformed &amp;ndash; the &quot;tin cans&quot; now look rigid. Reactivate the PSWT (which was disabled when the Move tool was chosen).

Select ''L_armBone'' in the PSWT list. Note that its influences match the initial values for its counterpart on the right. This  part of the mesh does not need to be painted to match &amp;ndash; there's a menu item for that.

67. Use '''Skin&gt;Edit Smooth Skin&gt;Mirror Skin Weights&gt;OPTIONS''', and in the dialog enable Mirror Axis YZ, leave Direction unchecked (or uncheck it). Click Mirror. The display of skin weights on the model doesn't update immediately, so select ''L_armBone'' again in the PSWT. The skin weight influences from ''R_armBone'' have been mirrored across the YZ plane to ''L_armBone''.

68. Use the PSWT techniques to modify the influences on the rest of the right side of the IK rig, so TinCanMan's parts don't deform &quot;out of character.&quot; 

For the torso segment of TinCanMan, ''Spine02'' should have full influence. For the hips segment, ''Spine01'' should have full influence.

Mirror the changes to the left side, and the skin weight painting is done.

The PSWT is invaluable for tweaking the joints of &quot;real&quot; characters, because the default weighting at joints usually leads to some unnatural deformation. Using the PSWT judiciously can greatly increase the realism of characters, particularly those with a single continuous skin mesh.

BTW, the UT2K3 models use segmented body parts extensively&amp;ndash; they are, to a certain degree, just much more sophisticated &quot;TinCanCreatures.&quot;

Practice using the IK handles to manipulate TinCanMan, using '''Skin&gt;Go to Bind Pose''' to &quot;reset&quot; his position.

Time to create some [[Legacy:Maya PLE Character Model Tutorial Part 3|Animation]] for TinCanMan.

==Discussion==

'''Animus:''' is it not easyer to use the mirror joint tool? image 5 is confusing it says RootBone, Spine01 and Pelvis that means the middle one is the spine? at 27 the tut says connect a new joint start at spine01 ? also at 23 it says nothing about ranaming the joint for the foot.

'''SuperApe:''' Q#1: It may indeed be easier to use the mirror joint tool; this may just be a matter of preference on the part of the author to show the low-level steps involved.  Q#2: Yes.  Q#3: Yes.  Q#4: There is no foot.  These are minor complaints when weighed against scope and quality of the whole tutorial.  Unless there was a major problem (and I haven't found one in this tut), I wouldn't worry about it.

'''Animus:''' yes your totaly right this tutorial is very good i just wanted to make it clear.

'''Dr. Freemanstein:''' I am experiencing big problems at step 49.  I have Maya 7.0 PLE which does not share the same options as the example dialogue box.  In 7.0, the &quot;Bind To&quot; drop down only has &quot;Joint Heirarchy&quot;, &quot;Selected Joints&quot; and &quot;Object Heirarchy&quot;.  Also the &quot;Bind Method&quot; menu only has &quot;Closest in Heirarchy&quot; and &quot;Closest Distance&quot;.  I have tried all possible combinations, but to no avail.  Moving the IK handles only moves the bones while the skin remains stationary!  Anyone figured this one out??

'''SuperApe:''' My educated guess is that Bind &quot;Joint Heirarchy&quot; is the same as &quot;Complete Skeleton&quot; and that &quot;Object Heirarchy&quot; is a new option.  Also, I can guess that Bind Options &quot;Closest in Heirarchy&quot; is the same as &quot;Closest Joint&quot; and that the syntax here changed to acomodate the new &quot;Object Heirarchy&quot; option.  As to why your Bind operation is not working, I would make sure you are shift-selecting your Mesh and Root joint in that order and that you see the Mesh color change once the Bind operation is complete. :)
  
'''angry:''' Can anyone tell me how I attach a weapon to this character to stop him firing from the RootBone??




----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya PLE Character Model Tutorial Part 3</title>
    <id>2128</id>
    <revision>
      <id>5182</id>
      <timestamp>2006-04-07T01:11:05Z</timestamp>
      <contributor>
        <ip>CDN-CE-INFLOW-T2-01.inflow.pa.bo.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">==Animation 101: A Walk Cycle ==

Animating all the sequences that the UT2003 characters use seems like quite a task, even for seasoned animators. Luckily, as mentioned, that need not be done. For this tutorial a walk cycle and an &quot;idling&quot; sequence will be enough to illustrate many later procedures.

69.  First adjust the animation-related UI elements: set the Range Slider to Start Time=0, Playback Start Time=0, Playback End Time=50, End Time=50. In Animation Preferences, set the Playback prefs to Update View=Active, Looping=Continuous, and Playback Speed to Other, entering 1.25 in the Other text entry field on the right (this equals 24fps x 1.25 = 30fps, a de facto &quot;standard&quot; for playback rates of game animations). Click Save. Use '''Window&gt;Animation Editors&gt;Graph Editor''' to open the Graph Editor dialog. 

70. Drag the Time Slider marker to frame 0, or enter 0 in the Current Time field. 

71. In the Channel Box select the channels to keyframe by clicking on their labels to the left of the data entry fields. Click-drag and Ctrl-click to select the following:

Translate X, Translate Y, Translate Z, Pole Vector X, Pole Vector Y, Pole Vector Z.

In Outliner, select all the ''ikHandle_'' objects. 

Use '''Animate&gt;Set Key&gt;OPTIONS''' to open the dialog for Set Key, and set the options as shown in FIG 20. Then click Set Key.

[[Image:Legacy_MCMT-20-KeyOptions.gif|center|FIG.20 Set Key Options]]

71. Move to frame 5 in the Time Slider, then click in the title bar of the Graph Editor and press '''s''' (lower case) to set a key at frame 5. In like manner set another key at frame 10. 

The key at frame 0 preserves the Bind Pose IK handle positions, and that at frame 5 &quot;isolates&quot; frame 0 from the influence of keys at frames beyond 5. 

Since the 2 animation sequences for TinCanMan will be done in a single file, they should be separated by a &quot;buffer&quot; of a number of frames, so keyframes in one sequence don't influence motion in another. For example, TinCanMan will have sequences from frame 10 to frame 42, and from frame 50 to frame 98. A key (actually a set of keys for multiple channels) placed at frame 47 will help prevent the sequences from affecting one another. The reason for this will become clearer when examining the Graph Editor's animation curves.

72. A &quot;ground plane&quot; is a helpful reference when animating footsteps, so use '''Create&gt;Polygon Primitives&gt;Plane&gt;OPTIONS''' to create a poly plane with the settings in FIG 21. Move the plane to Translate Y= -23.00

[[Image:Legacy_MCMT-21-GroundPlane.gif|center|FIG 21. Ground plane parameters]]

73. In Outliner, select ''ikHandle_R_leg'', and move it in Z to Translate Z=7.2.&lt;br /&gt;Then select ''ikHandle_L_leg'' and move in Z to Translate Z= -7.0. &lt;br /&gt;Select both ''ikHandle_R_leg'' and ''ikHandle_L_leg'', select the channel label Translate Z in the Channel Box, click on the Graph Editor title bar, and press '''s''' to set a key at frame 10 for the changed values (alternately, use '''Animate&gt;Set Key''').

Note how the animation curves in the Graph Editor change &amp;ndash; those for Translate Z of both the leg IK handles now curve.

Frame 10 is the first frame of the walk cycle animation.

74. Move the Time Slider to frame 42 and set a key for the legs' IK handles. Since a walk cycle loops through a series of frames, the beginning and end frames must be identical.

75. Set the Time Slider to frame 26, the midpoint of the 32-frame sequence. Now switch the positions of the right &amp; left legs, easiest to accomplish by selecting each and entering the Z value of the other in the Channel Box. Set a key for these values of Translate Z.

The curve in the Graph Editor now depicts the sine-wave shape of the forward &amp; backward leg movement (FIG 22).

[[Image:Legacy_MCMT-22-ZCurves.gif|center|FIG 22. Z-axis animation curves for legs]]

Set the '''Playback Start Time''' to 10, the '''Playback End Time''' to 42, and '''Play Forward''' the animation loop. Not very aesthetic, but the legs do move. The motion will be polished later.

NOTE: Once keyframes are applied to the IK handles, '''Skeleton&gt;Assume Preferred Angle''' and '''Skin&gt;Go To Bind Pose''' will not work properly while the IK solver nodes are active. To use these commands with keyframed IK handles in place, use the main menu item '''Modify&gt;Enable Nodes&gt;Disable All''' first. With nodes disabled, the IK handle keyframes are inactive. Use '''Modify&gt;Enable Nodes&gt;Enable All''' to restore their operation. Or, more selectively, you can uncheck/check the IK Solvers item in the '''Modify&gt;Enable Nodes&gt;''' roll-out.

76. Return to frame 10 to position the arms for the sequence's first frame.&lt;br /&gt;Position ''ikHandle_R_arm'' at Translate X= -8.0 and , Translate Y= -2, Translate Z= -4.50.&lt;br /&gt;Position ''ikHandle_L_arm'' at Translate X=8.0 and Translate Y= -2, Translate Z= 6.0.&lt;br /&gt;Set a key for Translate X, Y, and Z. Move to frame 42 and set a key.

77. Move to frame 26 and switch the arm positions, them set a key for Translate Z (X &amp; Y don't change, so a key isn't needed for them).

78. Play Forward the animation &amp;ndash; again, not very pretty, but functional for the tutorial. To smooth the motion a bit, especially the transition from last to first frames of the loop, select the IK handles for both arms &amp; both legs, then in the Graph Editor select all the visible keyframes.

In the Graph Editor tool shelf, click on the icon for ''Flat Tangents'' (horizontal line with keyframe squares at either end). This will change the shape of the curves between keyframes, making the slope of the curves as they enter frame 42 the same as that leaving frame 10.

79. To tweak the leg motion into something more naturalistic, set the following keys for the legs:

{|

|-
| style=&quot;text-align: left&quot; |FRAME NO.
| style=&quot;text-align: left&quot; |IK HANDLE or BONE
| style=&quot;text-align: left&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEY VALUE
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0.45
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |- 0.45
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0.45
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |- 0.45
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |8.0
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |- 8.0
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |8.0
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |- 8.0
|-
| style=&quot;text-align: center&quot; |10, 26 &amp; 42
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |8 &amp; 34
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |0.25
|-
| style=&quot;text-align: center&quot; |10, 26 &amp; 42
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |13.0
|-
| style=&quot;text-align: center&quot; |8 &amp; 34
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |13.25
|}

These keys can be selected and given Flat Tangents to keep them smooth through the cycle.

Note how the settings follow a cyclical pattern. For more naturalistic movement in &quot;organic&quot; characters, it's often useful to shift the frame number of some keyframes forward or backward a bit so the motion isn't absolutely synchronized to certain frames numbers. Using other than Flat Tangents is another technique worthy of exploration.

===Animation 102: Just Hangin' ===

The other animation sequence to create is an &quot;idle&quot; action, for when the character is not walking. This sequence will start at frame 50 and initially end at frame 82. Frames 43 - 49 will be the &quot;buffer&quot;. &quot;Isolating&quot; keyframes will be set at frame 47. 

80. In Outliner, select ''RootBone'', ''Pelvis'', ''Neck'' and all the IK handles &amp;ndash; these are the scene objects with keyframes. In the Graph Editor, make sure no keys are selected and press '''f''' (lower case). This brings all visible keys into view in the graph window. Select all keys at frame 5. Set the Current Time to 47. 

In the Graph Editor menu, use '''Edit&gt;Copy''', then '''Edit&gt;Paste''' to copy the frame 5 keys to frame 47. Move to frame 50 and Edit&gt;Paste again (in the Graph Editor). 

The frame 5 values were chosen because they set the model back to the upright Bind Pose, which will be simpler to adjust to a new pose than having to &quot;un-pose&quot; the final frames of the walk animation.

81. Rather than step through the keyframing for the idling sequence, the keyframe values to set are given in a table as above. Study the result in the Graph Editor to learn what the keys do to affect the model's motion.

{|

|-
| style=&quot;text-align: left&quot; |FRAME NO.
| style=&quot;text-align: left&quot; |IK HANDLE or BONE
| style=&quot;text-align: left&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEY VALUE
|-
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |0.864
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |0.959
|-
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |5.0
|-
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |5.0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |14.0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |0.782
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |17.822
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |- 6.672
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |- 1.5
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |- 0.25
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |7.53
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |- 1.5
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |0.25
|}

82. After setting these keys, select all the keyframed objects. Then select their frame 50 keys in the Graph Editor. Go to frame 82, then '''Edit&gt;Copy''' and '''Edit&gt;Paste''' the selected keys using the Graph Editor's menu. Then Play Forward frames 50 - 82.

When the laughter dies down, notice that even though the key values are the same at the start &amp; end of the sequence, there is still a lot of motion in the &quot;tween&quot; frames. Looking at the Graph Editor explains this &amp;ndash; the tangents through the keyframes are not all flat, and in some cases produce very pronounced animation curves (FIG 23), indicating substantial value change over time from frame 50 to 82 (i.e., motion).

[[Image:Legacy_MCMT-23-BigCurves.gif|center|FIG 23. Pronounced animation curves = large motions]]

83. All the curves could be flattened, but that would mean setting new keys to get the motion back. Better just to edit the existing curves. Here are recommendations:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |IK HANDLE or BONE
| style=&quot;text-align: center&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEYS AT FRAME NO.
| style=&quot;text-align: left&quot; |EDIT TO CURVE
|-
| style=&quot;text-align: center&quot; |RootBone
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Flatten  
|-
| style=&quot;text-align: center&quot; |RootBone
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |RootBone
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |Pelvis
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |Pelvis
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |Neck
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |Neck
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine01
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine01
| style=&quot;text-align: center&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine02
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine02
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine02
| style=&quot;text-align: center&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_R_arm
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_R_arm
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_R_arm
| style=&quot;text-align: center&quot; |Translate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_L_arm
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_L_arm
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_L_arm
| style=&quot;text-align: center&quot; |Translate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|}

The idling action needs to be subtle, so some of the curves (such as Translate X &amp; Y for the arms) need to be made very shallow.

83. The final keys to add to the idling sequence are:

{|

|-
| style=&quot;text-align: left&quot; |FRAME NO.
| style=&quot;text-align: left&quot; |IK HANDLE or BONE
| style=&quot;text-align: left&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEY VALUE
|-
| style=&quot;text-align: center&quot; |60
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |0.25
|-
| style=&quot;text-align: center&quot; |72
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |- 0.25
|}

This adds a bit of swing to the arms.

Tweak the curves until you like the action, keeping in mind it should be subtle. Even with very small motions, though, TinCanMan looks a bit twitchy, so the action needs to be slowed a bit.

84. Select all the keyframed objects in Outliner. In the Graph Editor, select all the keys from frame 50 to frame 82 inclusive. In the Graph Editor menu, use '''Edit&gt;Scale&gt;OPTIONS'''  to open the Scale Keys dialog. Enable the Method: Start and Stop radio button, and check Only Scale Specified Keys. In the New Start/End Times field enter 50 and 98, respectively. Then click Scale.

The animation is now 49 frames long, about 33% slower. Play Forward and see how it affects the idling action &amp;ndash; quite a bit more relaxed-looking. FIG 24 shows the Graph Editor curves for the finished &quot;idling&quot; animation.

[[Image:Legacy_MCMT-24-IdleAnimCurves.gif|center|]]

TinCanMan's two simple animation sequences are done.&lt;br /&gt;Consider for a moment the time and skill required to animate the full range of character motions in the &quot;stock&quot; UT2003 models &amp;ndash; no mean feat.

Next up: [[Legacy:Maya PLE Character Model Tutorial Part 4|Texturing]] TinCanMan

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
    <revision>
      <id>5181</id>
      <timestamp>2006-04-07T07:31:16Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Animation 101: A Walk Cycle ==

Animating all the sequences that the UT2003 characters use seems like quite a task, even for seasoned animators. Luckily, as mentioned, that need not be done. For this tutorial a walk cycle and an &quot;idling&quot; sequence will be enough to illustrate many later procedures.

69.  First adjust the animation-related UI elements: set the Range Slider to Start Time=0, Playback Start Time=0, Playback End Time=50, End Time=50. In Animation Preferences, set the Playback prefs to Update View=Active, Looping=Continuous, and Playback Speed to Other, entering 1.25 in the Other text entry field on the right (this equals 24fps x 1.25 = 30fps, a de facto &quot;standard&quot; for playback rates of game animations). Click Save. Use '''Window&gt;Animation Editors&gt;Graph Editor''' to open the Graph Editor dialog. 

70. Drag the Time Slider marker to frame 0, or enter 0 in the Current Time field. 

71. In the Channel Box select the channels to keyframe by clicking on their labels to the left of the data entry fields. Click-drag and Ctrl-click to select the following:

Translate X, Translate Y, Translate Z, Pole Vector X, Pole Vector Y, Pole Vector Z.

In Outliner, select all the ''ikHandle_'' objects. 

Use '''Animate&gt;Set Key&gt;OPTIONS''' to open the dialog for Set Key, and set the options as shown in FIG 20. Then click Set Key.

[[Image:Legacy_MCMT-20-KeyOptions.gif|center|FIG.20 Set Key Options]]

71. Move to frame 5 in the Time Slider, then click in the title bar of the Graph Editor and press '''s''' (lower case) to set a key at frame 5. In like manner set another key at frame 10. 

The key at frame 0 preserves the Bind Pose IK handle positions, and that at frame 5 &quot;isolates&quot; frame 0 from the influence of keys at frames beyond 5. 

Since the 2 animation sequences for TinCanMan will be done in a single file, they should be separated by a &quot;buffer&quot; of a number of frames, so keyframes in one sequence don't influence motion in another. For example, TinCanMan will have sequences from frame 10 to frame 42, and from frame 50 to frame 98. A key (actually a set of keys for multiple channels) placed at frame 47 will help prevent the sequences from affecting one another. The reason for this will become clearer when examining the Graph Editor's animation curves.

72. A &quot;ground plane&quot; is a helpful reference when animating footsteps, so use '''Create&gt;Polygon Primitives&gt;Plane&gt;OPTIONS''' to create a poly plane with the settings in FIG 21. Move the plane to Translate Y= -23.00

[[Image:Legacy_MCMT-21-GroundPlane.gif|center|FIG 21. Ground plane parameters]]

73. In Outliner, select ''ikHandle_R_leg'', and move it in Z to Translate Z=7.2.&lt;br /&gt;Then select ''ikHandle_L_leg'' and move in Z to Translate Z= -7.0. &lt;br /&gt;Select both ''ikHandle_R_leg'' and ''ikHandle_L_leg'', select the channel label Translate Z in the Channel Box, click on the Graph Editor title bar, and press '''s''' to set a key at frame 10 for the changed values (alternately, use '''Animate&gt;Set Key''').

Note how the animation curves in the Graph Editor change &amp;ndash; those for Translate Z of both the leg IK handles now curve.

Frame 10 is the first frame of the walk cycle animation.

74. Move the Time Slider to frame 42 and set a key for the legs' IK handles. Since a walk cycle loops through a series of frames, the beginning and end frames must be identical.

75. Set the Time Slider to frame 26, the midpoint of the 32-frame sequence. Now switch the positions of the right &amp; left legs, easiest to accomplish by selecting each and entering the Z value of the other in the Channel Box. Set a key for these values of Translate Z.

The curve in the Graph Editor now depicts the sine-wave shape of the forward &amp; backward leg movement (FIG 22).

[[Image:Legacy_MCMT-22-ZCurves.gif|center|FIG 22. Z-axis animation curves for legs]]

Set the '''Playback Start Time''' to 10, the '''Playback End Time''' to 42, and '''Play Forward''' the animation loop. Not very aesthetic, but the legs do move. The motion will be polished later.

NOTE: Once keyframes are applied to the IK handles, '''Skeleton&gt;Assume Preferred Angle''' and '''Skin&gt;Go To Bind Pose''' will not work properly while the IK solver nodes are active. To use these commands with keyframed IK handles in place, use the main menu item '''Modify&gt;Enable Nodes&gt;Disable All''' first. With nodes disabled, the IK handle keyframes are inactive. Use '''Modify&gt;Enable Nodes&gt;Enable All''' to restore their operation. Or, more selectively, you can uncheck/check the IK Solvers item in the '''Modify&gt;Enable Nodes&gt;''' roll-out.

76. Return to frame 10 to position the arms for the sequence's first frame.&lt;br /&gt;Position ''ikHandle_R_arm'' at Translate X= -8.0 and , Translate Y= -2, Translate Z= -4.50.&lt;br /&gt;Position ''ikHandle_L_arm'' at Translate X=8.0 and Translate Y= -2, Translate Z= 6.0.&lt;br /&gt;Set a key for Translate X, Y, and Z. Move to frame 42 and set a key.

77. Move to frame 26 and switch the arm positions, them set a key for Translate Z (X &amp; Y don't change, so a key isn't needed for them).

78. Play Forward the animation &amp;ndash; again, not very pretty, but functional for the tutorial. To smooth the motion a bit, especially the transition from last to first frames of the loop, select the IK handles for both arms &amp; both legs, then in the Graph Editor select all the visible keyframes.

In the Graph Editor tool shelf, click on the icon for ''Flat Tangents'' (horizontal line with keyframe squares at either end). This will change the shape of the curves between keyframes, making the slope of the curves as they enter frame 42 the same as that leaving frame 10.

79. To tweak the leg motion into something more naturalistic, set the following keys for the legs:

{|

|-
| style=&quot;text-align: left&quot; |FRAME NO.
| style=&quot;text-align: left&quot; |IK HANDLE or BONE
| style=&quot;text-align: left&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEY VALUE
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0.45
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |- 0.45
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0.45
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |- 0.45
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |8.0
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |- 8.0
|-
| style=&quot;text-align: center&quot; |10 &amp; 42
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |8.0
|-
| style=&quot;text-align: center&quot; |26
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate X
| style=&quot;text-align: center&quot; |- 8.0
|-
| style=&quot;text-align: center&quot; |10, 26 &amp; 42
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |8 &amp; 34
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |0.25
|-
| style=&quot;text-align: center&quot; |10, 26 &amp; 42
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |13.0
|-
| style=&quot;text-align: center&quot; |8 &amp; 34
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |13.25
|}

These keys can be selected and given Flat Tangents to keep them smooth through the cycle.

Note how the settings follow a cyclical pattern. For more naturalistic movement in &quot;organic&quot; characters, it's often useful to shift the frame number of some keyframes forward or backward a bit so the motion isn't absolutely synchronized to certain frames numbers. Using other than Flat Tangents is another technique worthy of exploration.

===Animation 102: Just Hangin' ===

The other animation sequence to create is an &quot;idle&quot; action, for when the character is not walking. This sequence will start at frame 50 and initially end at frame 82. Frames 43 - 49 will be the &quot;buffer&quot;. &quot;Isolating&quot; keyframes will be set at frame 47. 

80. In Outliner, select ''RootBone'', ''Pelvis'', ''Neck'' and all the IK handles &amp;ndash; these are the scene objects with keyframes. In the Graph Editor, make sure no keys are selected and press '''f''' (lower case). This brings all visible keys into view in the graph window. Select all keys at frame 5. Set the Current Time to 47. 

In the Graph Editor menu, use '''Edit&gt;Copy''', then '''Edit&gt;Paste''' to copy the frame 5 keys to frame 47. Move to frame 50 and Edit&gt;Paste again (in the Graph Editor). 

The frame 5 values were chosen because they set the model back to the upright Bind Pose, which will be simpler to adjust to a new pose than having to &quot;un-pose&quot; the final frames of the walk animation.

81. Rather than step through the keyframing for the idling sequence, the keyframe values to set are given in a table as above. Study the result in the Graph Editor to learn what the keys do to affect the model's motion.

{|

|-
| style=&quot;text-align: left&quot; |FRAME NO.
| style=&quot;text-align: left&quot; |IK HANDLE or BONE
| style=&quot;text-align: left&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEY VALUE
|-
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |0.864
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |RootBone
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |0.959
|-
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |Pelvis
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |5.0
|-
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |Neck
| style=&quot;text-align: left&quot; |Rotate Z
| style=&quot;text-align: center&quot; |5.0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |14.0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine01
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |0.782
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |17.822
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_Spine02
| style=&quot;text-align: left&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |0
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |- 6.672
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |- 1.5
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |- 0.25
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate X
| style=&quot;text-align: center&quot; |7.53
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate Y
| style=&quot;text-align: center&quot; |- 1.5
|-
| style=&quot;text-align: center&quot; |50
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |0.25
|}

82. After setting these keys, select all the keyframed objects. Then select their frame 50 keys in the Graph Editor. Go to frame 82, then '''Edit&gt;Copy''' and '''Edit&gt;Paste''' the selected keys using the Graph Editor's menu. Then Play Forward frames 50 - 82.

When the laughter dies down, notice that even though the key values are the same at the start &amp; end of the sequence, there is still a lot of motion in the &quot;tween&quot; frames. Looking at the Graph Editor explains this &amp;ndash; the tangents through the keyframes are not all flat, and in some cases produce very pronounced animation curves (FIG 23), indicating substantial value change over time from frame 50 to 82 (i.e., motion).

[[Image:Legacy_MCMT-23-BigCurves.gif|center|FIG 23. Pronounced animation curves = large motions]]

83. All the curves could be flattened, but that would mean setting new keys to get the motion back. Better just to edit the existing curves. Here are recommendations:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |IK HANDLE or BONE
| style=&quot;text-align: center&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEYS AT FRAME NO.
| style=&quot;text-align: left&quot; |EDIT TO CURVE
|-
| style=&quot;text-align: center&quot; |RootBone
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Flatten  
|-
| style=&quot;text-align: center&quot; |RootBone
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |RootBone
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |Pelvis
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |Pelvis
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |Neck
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |0 &amp; 47
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |Neck
| style=&quot;text-align: center&quot; |Rotate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine01
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine01
| style=&quot;text-align: center&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine02
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves 
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine02
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_Spine02
| style=&quot;text-align: center&quot; |Pole Vector X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_R_arm
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_R_arm
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_R_arm
| style=&quot;text-align: center&quot; |Translate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|-
| style=&quot;text-align: center&quot; |ikHandle_L_arm
| style=&quot;text-align: center&quot; |Translate X
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_L_arm
| style=&quot;text-align: center&quot; |Translate Y
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Make the curve shallower and symmetrical by adjusting the slope of the incoming and outgoing curves
|-
| style=&quot;text-align: center&quot; |ikHandle_L_arm
| style=&quot;text-align: center&quot; |Translate Z
| style=&quot;text-align: center&quot; |50 &amp; 82
| style=&quot;text-align: left&quot; |Flatten
|}

The idling action needs to be subtle, so some of the curves (such as Translate X &amp; Y for the arms) need to be made very shallow.

83. The final keys to add to the idling sequence are:

{|

|-
| style=&quot;text-align: left&quot; |FRAME NO.
| style=&quot;text-align: left&quot; |IK HANDLE or BONE
| style=&quot;text-align: left&quot; |CHANNEL
| style=&quot;text-align: center&quot; |KEY VALUE
|-
| style=&quot;text-align: center&quot; |60
| style=&quot;text-align: left&quot; |ikHandle_R_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |0.25
|-
| style=&quot;text-align: center&quot; |72
| style=&quot;text-align: left&quot; |ikHandle_L_arm
| style=&quot;text-align: left&quot; |Translate Z
| style=&quot;text-align: center&quot; |- 0.25
|}

This adds a bit of swing to the arms.

Tweak the curves until you like the action, keeping in mind it should be subtle. Even with very small motions, though, TinCanMan looks a bit twitchy, so the action needs to be slowed a bit.

84. Select all the keyframed objects in Outliner. In the Graph Editor, select all the keys from frame 50 to frame 82 inclusive. In the Graph Editor menu, use '''Edit&gt;Scale&gt;OPTIONS'''  to open the Scale Keys dialog. Enable the Method: Start and Stop radio button, and check Only Scale Specified Keys. In the New Start/End Times field enter 50 and 98, respectively. Then click Scale.

The animation is now 49 frames long, about 33% slower. Play Forward and see how it affects the idling action &amp;ndash; quite a bit more relaxed-looking. FIG 24 shows the Graph Editor curves for the finished &quot;idling&quot; animation.

[[Image:Legacy_MCMT-24-IdleAnimCurves.gif|center|]]

TinCanMan's two simple animation sequences are done.&lt;br /&gt;Consider for a moment the time and skill required to animate the full range of character motions in the &quot;stock&quot; UT2003 models &amp;ndash; no mean feat.

Next up: [[Legacy:Maya PLE Character Model Tutorial Part 4|Texturing]] TinCanMan

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya PLE Character Model Tutorial Part 4</title>
    <id>2129</id>
    <revision>
      <id>5183</id>
      <timestamp>2006-05-19T00:52:38Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>From page 2. -&gt; &quot;46. Use Polygons&gt;Combine in the main menu. Outliner now shows a single polymesh object (polySurface'n' ). Rename this object SkinMesh.&quot;</comment>
      <text xml:space="preserve">==Texturing TinCanMan ==

Skinning a model properly is a topic is worthy of an extensive tutorial all its own, so rather than hold up the progress toward getting TinCanMan into UT2003, a simple texture will be applied. 

The model's component cylinders were originally created with the Normalize the Whole Object option, which applies a set of UV coordinates to the mesh. Any texture applied will adhere to those coordinates, as the UV mapping is preserved through the modeling stages done so far.

To apply a file-based texture in Maya PLE (FIG. 25A-D):

85. Select ''SkinMesh''. Right click and hold on ''SkinMesh'' and choose '''Materials&gt;Assign New Material&gt;Lambert''' from the rollouts. (Other Material types can be probably be used as well, I just always use Lambert.) An Attribute Editor dialog for Lambert'n'SG opens. 'n' will be a number.

[[Image:Legacy_MCMT-25A.gif|center|FIG. 25A  Initial dialog for applying a texture]]

86. In the Attributes list, expand '''Common Material Attributes'''. The top Attribute in this section is Color. Click the checkered-icon button at the right of the Color slider.

87. A '''Create Render Node''' dialog opens (FIG. 25B). '''With New Texture Placement''' should be checked. Expand the '''2D Textures''' section (NOTE: Some Attribute/Node dialog sections described here may be already expanded when the dialog opens). The 'Normal' radio button should be active. Click the File button (second from the top on the right-hand column of the 2D Textures section).

[[Image:Legacy_MCMT-25B.gif|center|FIG. 25B Create Render Node dialog]]

88. The Create Render Node dialog closes, and the Attribute Editor now shows attributes for file'n' ('n' is a number). Expand '''File Attributes''', find the '''Image Name''' text input field, click the folder-icon button at the right.

89. A Windows File Open dialog opens. Navigate to &amp; select your texture file, click Open. The Attribute Editor displays the selected file (FIG.25C).

[[Image:Legacy_MCMT-25C.gif|center|FIG. 25C Texture file specs displayed in the Attribute Editor]]

Make sure '''Shading&gt;Hardware Texturing''' for the active viewport is enabled, or the file texture won't be displayed.

[[Image:Legacy_MCMT-25D.gif|center|FIG. 25D Enable Hardware Texturing in viewport]]

Last, but certainly not least, [[Legacy:Maya PLE Character Model Tutorial Part 5|Exporting]] TinCanMan to UEd.

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
    <revision>
      <id>5184</id>
      <timestamp>2006-05-19T00:34:56Z</timestamp>
      <contributor>
        <ip>84-45-226-149.no-dns-yet.enta.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Texturing TinCanMan ==

Skinning a model properly is a topic is worthy of an extensive tutorial all its own, so rather than hold up the progress toward getting TinCanMan into UT2003, a simple texture will be applied. 

The model's component cylinders were originally created with the Normalize the Whole Object option, which applies a set of UV coordinates to the mesh. Any texture applied will adhere to those coordinates, as the UV mapping is preserved through the modeling stages done so far.

To apply a file-based texture in Maya PLE (FIG. 25A-D):

85. Select ''SkinMesh''. Right click and hold on ''SkinMesh'' and choose '''Materials&gt;Assign New Material&gt;Lambert''' from the rollouts. (Other Material types can be probably be used as well, I just always use Lambert.) An Attribute Editor dialog for Lambert'n'SG opens. 'n' will be a number.

[[Image:Legacy_MCMT-25A.gif|center|FIG. 25A  Initial dialog for applying a texture]]

86. In the Attributes list, expand '''Common Material Attributes'''. The top Attribute in this section is Color. Click the checkered-icon button at the right of the Color slider.

87. A '''Create Render Node''' dialog opens (FIG. 25B). '''With New Texture Placement''' should be checked. Expand the '''2D Textures''' section (NOTE: Some Attribute/Node dialog sections described here may be already expanded when the dialog opens). The 'Normal' radio button should be active. Click the File button (second from the top on the right-hand column of the 2D Textures section).

[[Image:Legacy_MCMT-25B.gif|center|FIG. 25B Create Render Node dialog]]

88. The Create Render Node dialog closes, and the Attribute Editor now shows attributes for file'n' ('n' is a number). Expand '''File Attributes''', find the '''Image Name''' text input field, click the folder-icon button at the right.

89. A Windows File Open dialog opens. Navigate to &amp; select your texture file, click Open. The Attribute Editor displays the selected file (FIG.25C).

[[Image:Legacy_MCMT-25C.gif|center|FIG. 25C Texture file specs displayed in the Attribute Editor]]

Make sure '''Shading&gt;Hardware Texturing''' for the active viewport is enabled, or the file texture won't be displayed.

[[Image:Legacy_MCMT-25D.gif|center|FIG. 25D Enable Hardware Texturing in viewport]]

Last, but certainly not least, [[Legacy:Maya PLE Character Model Tutorial Part 5|Exporting]] TinCanMan to UEd.

----

===discussion.===

'''vitaloverdose''' &quot;85. Select SkinMesh. &quot; .... where from? I cant see anything that says skin mesh snywhere.

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya PLE Character Model Tutorial Part 5</title>
    <id>2132</id>
    <revision>
      <id>5190</id>
      <timestamp>2005-12-01T02:49:50Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Getting Into the Game ==

Modeling done, IK rigging complete, animation sequences finalized, and a spot of texturing applied &amp;ndash; TinCanMan is ready for prime-time. This chapter of the tutorial will re-iterate the model export instructions from Epic, but it's part of the process and doesn't suffer from repetition.

IMPORTANT NOTE: This part of the tutorial assumes you have edited the system environment variable according to the instructions on CD#3 of the UT2003 release, and that the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in loads successfully.

First save the TinCanMan file and use '''File&gt;New''' to clear the workspace. Use '''Window&gt;Settings/Preferences&gt;Plug-in Manager''' to open the Plug-in Manager. Check the box next to '''unEditor.mll'''. UnrealEd should open as the plug-in loads. (The reason for the File&gt;New before loading the plug-in is that I've repeatedly had Maya PLE &amp; UEd crash if a scene of any complexity is open when loading unEditor.mll, but it always works OK if I do File&gt;New first.)

Switch back to Maya PLE, close the Plug-in Manager dialog, and open the TinCanMan file.

90. Switch to the Modeling editor. Select ''SkinMesh''. Use '''Polygons&gt;Triangulate''' to explicitly insure all the SkinMesh polys are triangulated &amp;ndash; unEditor.mll does not automatically triangulate on export. Save the file.

91. In Outliner, select ''RootBone''. In the main menu use '''Create&gt;Sets&gt;Set&gt;OPTIONS''' to open the Create Set dialog. In the Name field enter ''TinCanMan'' and click Apply and Close.

92. In Outliner, select ''TinCanMan''. Be sure it is the only object selected in Outliner, then open the Attribute Editor by 2-clicking the ''TinCanMan'' set icon.

93. Expand the '''Extra Attributes''' section (it will be empty). In the Attribute Editor menu, use '''Attributes&gt;Add Attributes''' to open the Add Attribute dialog. 

94. In the Add Attribute dialog, enable the String radio button in the Data Type section, type in ''package'' for the Attribute Name, then click Add. 

Type ''animargs'' in the Attribute Name field and click Add. 

Change the Data Type to Float and type ''scale'' in the Attribute Name field. Click Add. Close the Add Attribute dialog.

95. The Attribute Editor Extra Attributes section should now contain the three newly-added attributes. In the package field of Additional Attributes, enter ''T_C_Man''. In the Scale field enter 2.0. In the animargs field type 

:WalkF 10 41 Idle_Rifle 50 97

Note that the frame-range for the two animation sequences is one frame short of the full sequence length that was keyframed. That's because the start &amp; end frames of the animation cycles are identical, and only one of them is needed in the cycle when played back. The slight pause caused by having two identical frames in the loop can sometimes be quite apparent, so it's best to leave one out.

If you checked out the xPawn.uc file, or looked carefully at the animation sequences list in the UEd Animations browser, you'll recognize that the names chosen for TinCanMan's anims match those used for UT2003's &quot;stock&quot; characters. This isn't an absolute necessity, but it greatly simplifies the steps needed to get the model into the game. More info about this in a future tutorial.

96. In the Command Line type 

:unEditor anim TinCanMan 

and hit Enter. The viewport should show the model animations playing through once at fast speed while the model exports. The Command Feedback should report ''Result:  [1] animating meshes(s) exported''

97. Switch to UEd and open the Textures browser. Import the texture file that was applied in Maya PLE, using package name ''TinCanMan_TX'' and group name ''Skins''. Save the package in the UT2003/Textures directory. Select the newly-imported texture in the Texture browser.

98. Open the Animations browser and use the package-select drop-down to select ''T_C_Man'' from the list. The other fields at the top of the browser should read ''TinCanMan'', and the animation sequence list should show ''WalkF[32]'' and ''Idle_Rifle[48]''. The model will have the Engine.Default texture. Select an animation sequence, enable looping in the playback controls, and play the animation. Cool.

99. In the '''Mesh''' tab at the right of the browser, expand '''Skin''' fully, click '''Add''', then '''Use''', to apply the newly-imported TinCanMan texture to the model in the Skin(0) slot. Save the file in the UT2003/Animations directory as ''T_C_Man.ukx''.

[[Image:Legacy_MCMT-26-TCManInUed.gif|center|FIG 26. TinCanMan in the UEd Animations browser]]

TinCanMan is now available for use by UT2003, but a another step is needed to insure he can be easily selected for use by the engine or a player. Return to Maya PLE, save the file and quit. UEd will close also since it was opened as a plug-in.

100. A .upl file must be created for TinCanMan. This text file contains references to character specifications, and is necessary if the character is to appear in the Instant Action menu Player roster. 

The entries highlighted in FIG 27 are the minimum necessary to identify TinCanMan to the game. Make sure you enter the filenames you chose for the .ukx and .utx packages in the Mesh and Skins parameters, respectively. The file can be created in Notepad and saved to the UT2003/System directory. Name it ''TinCanMan.upl''.

[[Image:Legacy_MCMT-27-TCManUPL.gif|center|FIG. 27 Example text for TinCanMan.upl]]

A &quot;fully-fleshed&quot; .upl file will also reference a '''Portrait''' image file (256w x 512d) to fill the new slot in the Player tab character lineup (rather than the big question mark that will show otherwise), and a short '''Text''' description entered in xPlayers.int (in the DecoText section) that appears as the character's Bio. Check xPlayersL1.upl for clues to syntax, etc. for these specifications.

Now it's time to try out TinCanMan. 

101. Launch UT2003, go to the Player tab, and scroll through the roster lineup &amp;ndash; you should see a big question mark among the character portraits (unless you were industrious enough to make a portrait for TinCanMan and specify it in the .upl file). Select this image and click on the Bio/3D View button at the right of the interface. TinCanMan should appear here. If not, don't worry, it's not a killer problem.

Select your favorite map, set the bot count to 0 (TinCanMan is easy prey &amp;ndash; give 'im a chance!), and Play the map.

When the character spawns, it should display the Idle_Rifle animation. Press the Shift key and your forward motion key (e.g., W), and TinCanMan will walk forward, displaying the walk cycle he was given. However, any other movement keys won't produce new animations, because TinCanMan has only two sequences identified in his .ukx file &amp;ndash; ''WalkF'' and ''Idle_Rifle''. This is all the engine knows to play for this character. If you showlog and try walking to the left, the engine logs a warning that a certain anim sequence it expects can't be found. The remedy is to provide the character with a complete set of animation sequences, with names that match those the engine expects for xPawn.

So that's it &amp;ndash; 101 steps and you have a Maya PLE character model in the game. TinCanMan isn't much use for fighting a deathmatch (though it's possible, if you can contain the snickers), but the steps required to manufacture and import a fully-animated mega-death-dealing model of your own creation are the same, just more complex in detail.

===More Customization ===

Beyond the 101 steps lies a vast territory wherein all varieties of creatures are possible. But those require more a elaborate process to make them fully useable in-game. The modeling and animation steps in Maya PLE are the same (if more sophisticated), but for advanced custom characters (i.e., those whose actions/animations don't match up with the given defaults for xPawn), substantially more effort is required to get them to function properly in the Unreal universe. This is the approach a total conversion mod might take for its characters. A tutorial covering this process is in the R&amp;D stage.

Also in the works is information about using the Animations browser to fine-tune an imported model, including how to attach weapons and game effects to designated bones. For now, check the UDN tutorials, they're a prime source:

[[udn2:AnimBrowserTutorial]]

----

[[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]]</text>
    </revision>
    <revision>
      <id>5191</id>
      <timestamp>2005-01-14T00:21:07Z</timestamp>
      <contributor>
        <ip>Ip67-153-93-135.z93-153-67.customer.algx.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>5192</id>
      <timestamp>2005-01-14T03:42:41Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Getting Into the Game ==

Modeling done, IK rigging complete, animation sequences finalized, and a spot of texturing applied &amp;ndash; TinCanMan is ready for prime-time. This chapter of the tutorial will re-iterate the model export instructions from Epic, but it's part of the process and doesn't suffer from repetition.

IMPORTANT NOTE: This part of the tutorial assumes you have edited the system environment variable according to the instructions on CD#3 of the UT2003 release, and that the [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in loads successfully.

First save the TinCanMan file and use '''File&gt;New''' to clear the workspace. Use '''Window&gt;Settings/Preferences&gt;Plug-in Manager''' to open the Plug-in Manager. Check the box next to '''unEditor.mll'''. UnrealEd should open as the plug-in loads. (The reason for the File&gt;New before loading the plug-in is that I've repeatedly had Maya PLE &amp; UEd crash if a scene of any complexity is open when loading unEditor.mll, but it always works OK if I do File&gt;New first.)

Switch back to Maya PLE, close the Plug-in Manager dialog, and open the TinCanMan file.

90. Switch to the Modeling editor. Select ''SkinMesh''. Use '''Polygons&gt;Triangulate''' to explicitly insure all the SkinMesh polys are triangulated &amp;ndash; unEditor.mll does not automatically triangulate on export. Save the file.

91. In Outliner, select ''RootBone''. In the main menu use '''Create&gt;Sets&gt;Set&gt;OPTIONS''' to open the Create Set dialog. In the Name field enter ''TinCanMan'' and click Apply and Close.

92. In Outliner, select ''TinCanMan''. Be sure it is the only object selected in Outliner, then open the Attribute Editor by 2-clicking the ''TinCanMan'' set icon.

93. Expand the '''Extra Attributes''' section (it will be empty). In the Attribute Editor menu, use '''Attributes&gt;Add Attributes''' to open the Add Attribute dialog. 

94. In the Add Attribute dialog, enable the String radio button in the Data Type section, type in ''package'' for the Attribute Name, then click Add. 

Type ''animargs'' in the Attribute Name field and click Add. 

Change the Data Type to Float and type ''scale'' in the Attribute Name field. Click Add. Close the Add Attribute dialog.

95. The Attribute Editor Extra Attributes section should now contain the three newly-added attributes. In the package field of Additional Attributes, enter ''T_C_Man''. In the Scale field enter 2.0. In the animargs field type 

:WalkF 10 41 Idle_Rifle 50 97

Note that the frame-range for the two animation sequences is one frame short of the full sequence length that was keyframed. That's because the start &amp; end frames of the animation cycles are identical, and only one of them is needed in the cycle when played back. The slight pause caused by having two identical frames in the loop can sometimes be quite apparent, so it's best to leave one out.

If you checked out the xPawn.uc file, or looked carefully at the animation sequences list in the UEd Animations browser, you'll recognize that the names chosen for TinCanMan's anims match those used for UT2003's &quot;stock&quot; characters. This isn't an absolute necessity, but it greatly simplifies the steps needed to get the model into the game. More info about this in a future tutorial.

96. In the Command Line type 

:unEditor anim TinCanMan 

and hit Enter. The viewport should show the model animations playing through once at fast speed while the model exports. The Command Feedback should report ''Result:  [1] animating meshes(s) exported''

97. Switch to UEd and open the Textures browser. Import the texture file that was applied in Maya PLE, using package name ''TinCanMan_TX'' and group name ''Skins''. Save the package in the UT2003/Textures directory. Select the newly-imported texture in the Texture browser.

98. Open the Animations browser and use the package-select drop-down to select ''T_C_Man'' from the list. The other fields at the top of the browser should read ''TinCanMan'', and the animation sequence list should show ''WalkF[32]'' and ''Idle_Rifle[48]''. The model will have the Engine.Default texture. Select an animation sequence, enable looping in the playback controls, and play the animation. Cool.

99. In the '''Mesh''' tab at the right of the browser, expand '''Skin''' fully, click '''Add''', then '''Use''', to apply the newly-imported TinCanMan texture to the model in the Skin(0) slot. Save the file in the UT2003/Animations directory as ''T_C_Man.ukx''.

[[Image:Legacy_MCMT-26-TCManInUed.gif|center|FIG 26. TinCanMan in the UEd Animations browser]]

TinCanMan is now available for use by UT2003, but a another step is needed to insure he can be easily selected for use by the engine or a player. Return to Maya PLE, save the file and quit. UEd will close also since it was opened as a plug-in.

100. A .upl file must be created for TinCanMan. This text file contains references to character specifications, and is necessary if the character is to appear in the Instant Action menu Player roster. 

The entries highlighted in FIG 27 are the minimum necessary to identify TinCanMan to the game. Make sure you enter the filenames you chose for the .ukx and .utx packages in the Mesh and Skins parameters, respectively. The file can be created in Notepad and saved to the UT2003/System directory. Name it ''TinCanMan.upl''.

[[Image:Legacy_MCMT-27-TCManUPL.gif|center|FIG. 27 Example text for TinCanMan.upl]]

A &quot;fully-fleshed&quot; .upl file will also reference a '''Portrait''' image file (256w x 512d) to fill the new slot in the Player tab character lineup (rather than the big question mark that will show otherwise), and a short '''Text''' description entered in xPlayers.int (in the DecoText section) that appears as the character's Bio. Check xPlayersL1.upl for clues to syntax, etc. for these specifications.

Now it's time to try out TinCanMan. 

101. Launch UT2003, go to the Player tab, and scroll through the roster lineup &amp;ndash; you should see a big question mark among the character portraits (unless you were industrious enough to make a portrait for TinCanMan and specify it in the .upl file). Select this image and click on the Bio/3D View button at the right of the interface. TinCanMan should appear here. If not, don't worry, it's not a killer problem.

Select your favorite map, set the bot count to 0 (TinCanMan is easy prey &amp;ndash; give 'im a chance!), and Play the map.

When the character spawns, it should display the Idle_Rifle animation. Press the Shift key and your forward motion key (e.g., W), and TinCanMan will walk forward, displaying the walk cycle he was given. However, any other movement keys won't produce new animations, because TinCanMan has only two sequences identified in his .ukx file &amp;ndash; ''WalkF'' and ''Idle_Rifle''. This is all the engine knows to play for this character. If you showlog and try walking to the left, the engine logs a warning that a certain anim sequence it expects can't be found. The remedy is to provide the character with a complete set of animation sequences, with names that match those the engine expects for xPawn.

So that's it &amp;ndash; 101 steps and you have a Maya PLE character model in the game. TinCanMan isn't much use for fighting a deathmatch (though it's possible, if you can contain the snickers), but the steps required to manufacture and import a fully-animated mega-death-dealing model of your own creation are the same, just more complex in detail.

===More Customization ===

Beyond the 101 steps lies a vast territory wherein all varieties of creatures are possible. But those require more a elaborate process to make them fully useable in-game. The modeling and animation steps in Maya PLE are the same (if more sophisticated), but for advanced custom characters (i.e., those whose actions/animations don't match up with the given defaults for xPawn), substantially more effort is required to get them to function properly in the Unreal universe. This is the approach a total conversion mod might take for its characters. A tutorial covering this process is in the R&amp;D stage.

Also in the works is information about using the Animations browser to fine-tune an imported model, including how to attach weapons and game effects to designated bones. For now, check the UDN tutorials, they're a prime source:

[[udn2:AnimBrowserTutorial]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Maya/Discuss</title>
    <id>1765</id>
    <revision>
      <id>4331</id>
      <timestamp>2006-12-24T03:49:34Z</timestamp>
      <contributor>
        <ip>C-24-218-139-94.hsd1.ma.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Machismo : Before I write the tutorials i thought i'd get some suggestions :p&lt;br /&gt;
#  A look at creating a 500 poly &quot;level peice&quot; ... a cliched pipe or something more complex?original?
## EP curve Tool/Revolving/Loft/Bevel - your basic 2deditor like functions 
## Maya Boolean Operations - Combine/Union/Difference/Intersection   
## Create Polygon Tool/ Appened toPolygon Tool
## Sculpt Polygon Tool - For creating terrain mesh peices
## Extrude/Merge Face/Vertices/Edges
## Hypershade and materials 
## Layingout UVS, Moving and Sewing UV's
## Painting the skin in Photoshop
## Baking Shadows / Generating Lightmaps
## Content Pipeline From Maya TO UnrealEd3 &amp; Optimising meshes for game use??

Meh i'm just getting myself organised, this looks like it could be a long haul tutorial written over several weeks :)

'''EntropicLqd:'''  No kidding.  I started Maya up and it frightenend me so I closed it down again.  As long as the whole process from creation in Maya through to import into UT is covered it doesn't matter how complex or simple the level piece is I don't think.

'''Machismo:''' True. But anyone who reads this part of the wiki should have basic working knowledge of maya. from help &gt;&gt; Library (F1) and at least Chapter One and Two of Instant Maya. The movement and layout is intuitive give it a try :)

'''EntropicLqd:'''  I'm not sure there's any such thing as &quot;intuitive&quot; - except maybe ''order by thought''.  Thanks for specifying the course pre-requisites though - I'll be encouraged and have another go. :)

'''EntropicLqd:'''  Well, it was a little less scary this time around, but my goodness me - there's so much stuff to remember.  I keep trying to move around in Maya in the same way as I do in UT, and odd things keep happening.  That water mark is intensely annoying.  I wish they'd made it a little more faint.  It makes my eyes go funny after a while because I keep thinking it should be occluded by the objects I'm editing rather than in front of them.  It's probably a perspective thing - everything else moves around except the watermark.  I really hope the one that comes with UT2003 doesn't have it.  Still, having managed what I've done so far I guess I'll be able to create reasonably simple prefabs in ... oooooh ... 3-4 months.

'''Tarquin:''' Maya PLE is a 140MB download, so I won't have it until UT2003 is released, and even then I'll need to get myself a new graphics card &amp;ndash; so I'm talking in the dark here, but may I suggest you collate jottings on the Maya interface somewhere? I pretty much built up the [[Legacy:Mouse Control|Mouse Control]] page bit by bit as a text file on my HD when I was getting to grips with UEd.

'''EntropicLqd:''' I certainly could do that.  The only potential problem with that it seems (although I've not done it) that you can customise the GUI elements.  But yes, it's a good idea, and I'll do it.

'''ProjectX;''' I'm having preoblems with the whole layout thing too, but i won't let it beat me. I can't seem to load the UnEditor Plugin, ne1 know how to?

'''Highlander:''' Had the same trouble, you need to add it to your path variable. Bring up the system properties (windows key + pause) goto advanced then enviroment variables. add something like the following:

&lt;nowiki&gt;; C:\Program Files\AliasWavefront\Maya 4 Personal Learning Edition\bin;C:\UT2003\System;c:\UT2003&lt;/nowiki&gt;

to the end (basicly unreal and maya need to be in the path variable for some strange reason...

'''MouriceNo1:''' You need to put the path in there so that the Maya plugin can find the UnrealEd and UT2003 exes without having to have it set it in Maya.

'''sandorski:'''  Just wondering if these suggested Tuts were ever completed. I know most of the stuff, but the Sewing of UVs is a bit beyond my current knowledge base.

'''Sirellyn:''' PROBLEM.  Using Unreal Tournament 2004, and using maya PLE w. plugin I got from the directors cut CD.  Everything is going fine until I try to export.  I use the command:

UnrealEd mesh myBox;

and get

Error: MayaUnrealEd: This command requires at least one flag

There's no documentation on the plugin (or it's proper syntax..) anywhere that I can find.  In fact the buzz vids that come with it tell you to use the command: UnEditor.  But the plugin doesn't even know that command.  Can anyone help?

'''Tarquin:''' I'd like to see a tutorial just on getting started &amp;ndash; creating, say, a simple mesh to make into a UEd static mesh.

'''Dan:''' Whenever i try to export a skeletal mesh, it ends up in the default package, even if i tell it to create a new package. This only happens for skeletal meshes, not static meshes.</text>
    </revision>
    <revision>
      <id>4332</id>
      <timestamp>2005-03-26T22:48:57Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Machismo : Before I write the tutorials i thought i'd get some suggestions :p&lt;br /&gt;
#  A look at creating a 500 poly &quot;level peice&quot; ... a cliched pipe or something more complex?original?
## EP curve Tool/Revolving/Loft/Bevel - your basic 2deditor like functions 
## Maya Boolean Operations - Combine/Union/Difference/Intersection   
## Create Polygon Tool/ Appened toPolygon Tool
## Sculpt Polygon Tool - For creating terrain mesh peices
## Extrude/Merge Face/Vertices/Edges
## Hypershade and materials 
## Layingout UVS, Moving and Sewing UV's
## Painting the skin in Photoshop
## Baking Shadows / Generating Lightmaps
## Content Pipeline From Maya TO UnrealEd3 &amp; Optimising meshes for game use??

Meh i'm just getting myself organised, this looks like it could be a long haul tutorial written over several weeks :)

'''EntropicLqd:'''  No kidding.  I started Maya up and it frightenend me so I closed it down again.  As long as the whole process from creation in Maya through to import into UT is covered it doesn't matter how complex or simple the level piece is I don't think.

'''Machismo:''' True. But anyone who reads this part of the wiki should have basic working knowledge of maya. from help &gt;&gt; Library (F1) and at least Chapter One and Two of Instant Maya. The movement and layout is intuitive give it a try :)

'''EntropicLqd:'''  I'm not sure there's any such thing as &quot;intuitive&quot; - except maybe ''order by thought''.  Thanks for specifying the course pre-requisites though - I'll be encouraged and have another go. :)

'''EntropicLqd:'''  Well, it was a little less scary this time around, but my goodness me - there's so much stuff to remember.  I keep trying to move around in Maya in the same way as I do in UT, and odd things keep happening.  That water mark is intensely annoying.  I wish they'd made it a little more faint.  It makes my eyes go funny after a while because I keep thinking it should be occluded by the objects I'm editing rather than in front of them.  It's probably a perspective thing - everything else moves around except the watermark.  I really hope the one that comes with UT2003 doesn't have it.  Still, having managed what I've done so far I guess I'll be able to create reasonably simple prefabs in ... oooooh ... 3-4 months.

'''Tarquin:''' Maya PLE is a 140MB download, so I won't have it until UT2003 is released, and even then I'll need to get myself a new graphics card &amp;ndash; so I'm talking in the dark here, but may I suggest you collate jottings on the Maya interface somewhere? I pretty much built up the [[Legacy:Mouse Control|Mouse Control]] page bit by bit as a text file on my HD when I was getting to grips with UEd.

'''EntropicLqd:''' I certainly could do that.  The only potential problem with that it seems (although I've not done it) that you can customise the GUI elements.  But yes, it's a good idea, and I'll do it.

'''ProjectX;''' I'm having preoblems with the whole layout thing too, but i won't let it beat me. I can't seem to load the UnEditor Plugin, ne1 know how to?

'''Highlander:''' Had the same trouble, you need to add it to your path variable. Bring up the system properties (windows key + pause) goto advanced then enviroment variables. add something like the following:

&lt;nowiki&gt;; C:\Program Files\AliasWavefront\Maya 4 Personal Learning Edition\bin;C:\UT2003\System;c:\UT2003&lt;/nowiki&gt;

to the end (basicly unreal and maya need to be in the path variable for some strange reason...

'''MouriceNo1:''' You need to put the path in there so that the Maya plugin can find the UnrealEd and UT2003 exes without having to have it set it in Maya.

'''sandorski:'''  Just wondering if these suggested Tuts were ever completed. I know most of the stuff, but the Sewing of UVs is a bit beyond my current knowledge base.

'''Sirellyn:''' PROBLEM.  Using Unreal Tournament 2004, and using maya PLE w. plugin I got from the directors cut CD.  Everything is going fine until I try to export.  I use the command:

UnrealEd mesh myBox;

and get

Error: MayaUnrealEd: This command requires at least one flag

There's no documentation on the plugin (or it's proper syntax..) anywhere that I can find.  In fact the buzz vids that come with it tell you to use the command: UnEditor.  But the plugin doesn't even know that command.  Can anyone help?

'''Tarquin:''' I'd like to see a tutorial just on getting started &amp;ndash; creating, say, a simple mesh to make into a UEd static mesh.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:McNutcase</title>
    <id>2211</id>
    <revision>
      <id>5352</id>
      <timestamp>2005-10-02T19:33:24Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <minor/>
      <comment>Got one now.</comment>
      <text xml:space="preserve">'''Designation:''' McNutcase

'''Mission:''' breakage of Unreal engine

'''Status:''' incomplete

I have apparently become an authority on edge conditions of the Unreal engine, and what happens when you push it beyond those limits. I am also well-known for an amazing ability to use WarpZones to brainmelting effect, whether by creating infinite spaces or by geometric impossibilities.

Coming soon: DM-Kneecap for UT99; faking the W dimension for dummies!

Contact available via Google's mail service in a rather obvious manner; if you're not smart enough to figure that out, I don't want to risk letting you see my maps.

Personal site: [http://mcnutcase.pihost.us/donkeys.html The Donkey Dialogues]

==Guestbook==

'''Tarquin:''' Hi. Welcome to unreal wiki. :)

'''McNutcase:''' Thanks... been hanging out here absorbing knowledge for a fair while, thanks to [[Legacy:LionsPhil|LionsPhil]], but only recently decided to share my knowledge on how to make the Unreal engine cry. Pretty much all the mappers I know ask me for advice on a) which weapons will work best in a given map and b) whether a given effect wil work, cause the engine to cry, or just look utterly pony.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5353</id>
      <timestamp>2005-02-24T22:22:13Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Designation:''' McNutcase

'''Mission:''' breakage of Unreal engine

'''Status:''' incomplete

I have apparently become an authority on edge conditions of the Unreal engine, and what happens when you push it beyond those limits. I am also well-known for an amazing ability to use WarpZones to brainmelting effect, whether by creating infinite spaces or by geometric impossibilities.

Coming soon: DM-Kneecap for UT99; faking the W dimension for dummies!

Contact available via Google's mail service in a rather obvious manner; if you're not smart enough to figure that out, I don't want to risk letting you see my maps.

Personal site: [http://mcnutcase.pihost.us/donkeys.html The Donkey Dialogues]

==Guestbook==

'''Tarquin:''' Hi. Welcome to unreal wiki. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5354</id>
      <timestamp>2005-02-25T18:04:52Z</timestamp>
      <contributor>
        <ip>McNutcase</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Designation:''' McNutcase

'''Mission:''' breakage of Unreal engine

'''Status:''' incomplete

I have apparently become an authority on edge conditions of the Unreal engine, and what happens when you push it beyond those limits. I am also well-known for an amazing ability to use WarpZones to brainmelting effect, whether by creating infinite spaces or by geometric impossibilities.

Coming soon: DM-Kneecap for UT99; faking the W dimension for dummies!

Contact available via Google's mail service in a rather obvious manner; if you're not smart enough to figure that out, I don't want to risk letting you see my maps.

Personal site: [http://mcnutcase.pihost.us/donkeys.html The Donkey Dialogues]

==Guestbook==

'''Tarquin:''' Hi. Welcome to unreal wiki. :)

'''McNutcase:''' Thanks... been hanging out here absorbing knowledge for a fair while, thanks to LionsPhil (who as yet lacks a personal page), but only recently decided to share my knowledge on how to make the Unreal engine cry. Pretty much all the mappers I know ask me for advice on a) which weapons will work best in a given map and b) whether a given effect wil work, cause the engine to cry, or just look utterly pony.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mcspanky</title>
    <id>1845</id>
    <revision>
      <id>4530</id>
      <timestamp>2002-07-06T13:55:32Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Too much coffee.  No time to chat.  Check out our mod [[Legacy:Esc|Esc]]: http://www.esconline.org

----

'''Tarquin:'''  Could I just check that you've asked the writers of stuff you've imported (eg Yoda, Mr.Mitchell) for permission to Wikify their work? It's important because material might be merged &amp; rewritten in the future &amp;ndash; for example [[Legacy:Scripting Operators|Scripting Operators]] opens with some notes I wrote ages ago, and then there's Yoda's text. I'd like to merge the two at some point.

'''Mr.Mitchell:'''  You can use the stuff I put in the MC Spanky's coding FAQ. But as far as I can remember I only updated the link to [[Legacy:VisualUC|VisualUC]] in that FAQ. 

'''Tarquin:'''  There was a FAQ entry that said &quot;By Mr.Mitchell&quot;, I've moved it to its own page: [[Legacy:Binding Keys|Binding Keys]]

'''Mr.Mitchell:'''  MC Spanky must have been sleeping when he tranferred that page to the Wiki, cause I didn't write that.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4531</id>
      <timestamp>2002-06-29T18:27:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Too much coffee.  No time to chat.  Check out our mod [[Legacy:Esc|Esc]]: http://www.esconline.org

----

'''Tarquin:'''  Could I just check that you've asked the writers of stuff you've imported (eg Yoda, Mr.Mitchell) for permission to Wikify their work? It's important because material might be merged &amp; rewritten in the future &amp;ndash; for example [[Legacy:Scripting Operators|Scripting Operators]] opens with some notes I wrote ages ago, and then there's Yoda's text. I'd like to merge the two at some point.

'''Mr.Mitchell:'''  You can use the stuff I put in the MC Spanky's coding FAQ. But as far as I can remember I only updated the link to [[Legacy:VisualUC|VisualUC]] in that FAQ. 

'''Tarquin:'''  There was a FAQ entry that said &quot;By Mr.Mitchell&quot;, I've moved it to its own page: [[Legacy:Binding Keys|Binding Keys]]</text>
    </revision>
    <revision>
      <id>4532</id>
      <timestamp>2002-06-29T21:27:54Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Too much coffee.  No time to chat.  Check out our mod [[Legacy:Esc|Esc]]: http://www.esconline.org

----

'''Tarquin:'''  Could I just check that you've asked the writers of stuff you've imported (eg Yoda, Mr.Mitchell) for permission to Wikify their work? It's important because material might be merged &amp; rewritten in the future &amp;ndash; for example [[Legacy:Scripting Operators|Scripting Operators]] opens with some notes I wrote ages ago, and then there's Yoda's text. I'd like to merge the two at some point.

'''Mr.Mitchell:'''  You can use the stuff I put in the MC Spanky's coding FAQ. But as far as I can remember I only updated the link to [[Legacy:VisualUC|VisualUC]] in that FAQ. 

'''Tarquin:'''  There was a FAQ entry that said &quot;By Mr.Mitchell&quot;, I've moved it to its own page: [[Legacy:Binding Keys|Binding Keys]]

'''Mr.Mitchell:'''  MC Spanky must have been sleeping when he tranferred that page to the Wiki, cause I didn't write that.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeanFish</title>
    <id>2089</id>
    <revision>
      <id>5088</id>
      <timestamp>2003-12-23T00:00:46Z</timestamp>
      <contributor>
        <ip>Client124.cbcast.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Welcome to my page!  Feel free to add random ponderings if you want in the &quot;Discussion&quot; area, and if you have any suggestions/comments/complaints/threats feel free to put those wherever seems relevant.

The concept of the wiki is strong with this page author, so don't be shy about putting stuff on here!

====Contact Information====

AIM:  HopFrog 187

MSN:  NinjaGuppy6@hotmail.com

Yahoo!:  wonko32

ICQ:  89282852

EMail:  NinjaGuppy6@hotmail.com

====Current Projects====
*Active Projects
**Carjack! (yes, we've started working on code for this...)
**A blitzball-style level for Deathball
*Future Projects
**Gnome Action Cinema (more on this later, name subject to change)
**UT2003 Extended SDK

====Diary of a Madman====

As I traversed through the grassy plains of UnrealScriptLand, I came across the most frightening sight I'd ever witnessed, for there before me was a wall of teepees.  &quot;Natives,&quot; I grunted with a slightly depressed tone knowing that the answer I seek is somewhere on the other side of that wall which I will never be able to afford to go over (I love overly long sentences.  Are you out of breath yet?  See below to fix that problem!).  These natives were wielding flamethrowers and boards with nails in them.  I was simply no match with only my car keys available.

====AmphibiousWaterVolume is brought to life!====

I'll be sure to post the code here when I'm done making the class more easily manipulated.  Flexible code is good code :)  Ok, ok, I'll post what I have so far.  Any advice would be appreciated.  I'm also still testing it, so if there are bugs I'd love to hear about them so that I can (hopefully) fix them in less time than it took me to figure out how to make this thing work at all!

&lt;uscript&gt;
//By:  MeanFish
//Purpose:  to make it so that people wont drown inside
//of this water volume's loving arms.

class AmphibiousWaterVolume extends WaterVolume;

var int nTempTime;
var int nAdjustedBreathingTime;

//if an Actor enters the volume, set their breathing abilities to
//&quot;I could do this for six months!&quot; (literally)
function touch(Actor other)
{
         local Pawn myPawn;

         if (Other.IsA('Pawn'))
         {
            myPawn = Pawn(other);
            nTempTime = myPawn.UnderwaterTime;
            myPawn.UnderwaterTime= +nAdjustedBreathingTime;
         }
         
         Super.touch();
}

//if an Actor leaves, make sure to set their breathing back to normal, 
//in case there is a normal water volume in the same level.
function untouch(Actor Other)
{
         local Pawn myPawn;
         if (Other.IsA('Pawn'))
         {
            myPawn = Pawn(Other);
            myPawn.UnderwaterTime=ntempTime;
         }
         Super.untouch();
}

defaultproperties
{
nAdjustedBreathingTime=9999999.0
//I'm trying to make it so that projectiles are immune to the slowdown effect
//of underwater combat.  translation:  I'm trying to use this for a deathball level.
bMoveProjectiles=false;
}
&lt;/uscript&gt;

Oh yeah...and if you decide to use this, dont forget to add whatever package you put it in to your

EditPackages section for UEd (at the bottom of ut2003.ini).  Probably childs play for most of y'all but it was hard for me so BACK OFF! :-P

===Discussion===

'''Foxpaw:''' There's a slight problem with the way that your code resets the breathing times. If Player A enters the water, then Player B enters, then Player A leaves, Player A will get Player B's breathing properties back instead of their own. Most pawns have the same underwater breathing properties, but I wouldn't rule out the possibility of someone making a model with a custom species that has different breathing options. Alternatively, some players could have something like the scuba tanks on that submarine assault level in UT. A way to ensure that each person gets their own breathing properties back is by keeping track of a list of players and their underwater times, like so:

&lt;uscript&gt;
struct BreathingProperties
{
  var Pawn Player;
  var float StoredTime;
};

var array&lt;BreathingProperties&gt; StoredProperties;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function int FindBreathingPropsFor( Pawn Player )
{
  local int i;
  
  if ( Player == None ) return -1;

  for (i=0;i&lt;StoredProperties.Length;i++)
    if ( StoredProperties[i].Player == Player ) return i;

  return -1;
}

simulated function StoreBreathingPropsFor( Pawn Player )
{
  local int i;
  local BreathingProperties NewProperties;

  if ( Player == None ) return;

  i = FindBreathingPropsFor( Player );
  if ( i &lt; 0 || i &gt; StoredProperties.Length )
  {
    NewProperties.Player = Player;
    i = StoredProperties.Length;
    StoredProperties[i] = NewProperties;
  }

  StoredProperties[i].StoredTime = Player.UnderwaterTime;
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function Touch( actor Other )
{
  if ( Other.IsA( 'Pawn' ) )
  {
    StoreBreathingPropsFor( Pawn( Other ) );
    Pawn( Other ).UnderwaterTime += nAdjustedBreathingTime;
  }

  Super.Touch( Other );
}

simulated function Untouch( actor Other )
{
  local int i;

  Super.Untouch( Other );

  if ( Other.IsA( 'Pawn' ) )
  {
    i = FindBreathingPropsFor( Pawn( Other ) );
    if ( i &gt;= 0 &amp;&amp; i &lt; StoredProperties.Length )
    {
      Pawn( Other ).UnderwaterTime = StoredProperties[i].StoredTime;
      StoredProperties.Remove( i, 1 );
    }
  }
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
&lt;/uscript&gt;

'''MeanFish:''' Dude that's awesome...thanks a lot!  I'll be spending some time deciphering it.  I'm still learning, as mentioned previously but I appreciate the help a ton!
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5089</id>
      <timestamp>2003-11-02T19:16:54Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Suggested alternative implementation.</comment>
      <text xml:space="preserve">Welcome to my page!  Feel free to add things if you want in the &quot;Discussion&quot; area.

====Contact Information====

AIM:  HopFrog 187

MSN:  NinjaGuppy6@hotmail.com

Yahoo!:  wonko32

ICQ:  89282852

EMail:  NinjaGuppy6@hotmail.com

====Current Projects====
*Active Projects
**Carjack! (yes, we've started working on code for this...)
**A blitzball-style level for Deathball
*Future Projects
**Gnome Action Cinema (more on this later, name subject to change)
**UT2003 Extended SDK

====Diary of a Madman====

As I traversed through the grassy plains of UnrealScriptLand, I came across the most frightening sight I'd ever witnessed, for there before me was a wall of teepees.  &quot;Natives,&quot; I grunted with a slightly depressed tone knowing that the answer I seek is somewhere on the other side of that wall which I will never be able to afford to go over (I love overly long sentences.  Are you out of breath yet?  See below to fix that problem!).  These natives were wielding flamethrowers and boards with nails in them.  I was simply no match with only my car keys available.

====AmphibiousWaterVolume is brought to life!====

I'll be sure to post the code here when I'm done making the class more easily manipulated.  Flexible code is good code :)  Ok, ok, I'll post what I have so far.  Any advice would be appreciated.  I'm also still testing it, so if there are bugs I'd love to hear about them so that I can (hopefully) fix them in less time than it took me to figure out how to make this thing work at all!

&lt;uscript&gt;
//By:  MeanFish
//Purpose:  to make it so that people wont drown inside
//of this water volume's loving arms.

class AmphibiousWaterVolume extends WaterVolume;

var int nTempTime;
var int nAdjustedBreathingTime;

//if an Actor enters the volume, set their breathing abilities to
//&quot;I could do this for six months!&quot; (literally)
function touch(Actor other)
{
         local Pawn myPawn;

         if (Other.IsA('Pawn'))
         {
            myPawn = Pawn(other);
            nTempTime = myPawn.UnderwaterTime;
            myPawn.UnderwaterTime= +nAdjustedBreathingTime;
         }
         
         Super.touch();
}

//if an Actor leaves, make sure to set their breathing back to normal, 
//in case there is a normal water volume in the same level.
function untouch(Actor Other)
{
         local Pawn myPawn;
         if (Other.IsA('Pawn'))
         {
            myPawn = Pawn(Other);
            myPawn.UnderwaterTime=ntempTime;
         }
         Super.untouch();
}

defaultproperties
{
nAdjustedBreathingTime=9999999.0
//I'm trying to make it so that projectiles are immune to the slowdown effect
//of underwater combat.  translation:  I'm trying to use this for a deathball level.
bMoveProjectiles=false;
}
&lt;/uscript&gt;

Oh yeah...and if you decide to use this, dont forget to add whatever package you put it in to your

EditPackages section for UEd (at the bottom of ut2003.ini).  Probably childs play for most of y'all but it was hard for me so BACK OFF! :-P

===Discussion===

'''Foxpaw:''' There's a slight problem with the way that your code resets the breathing times. If Player A enters the water, then Player B enters, then Player A leaves, Player A will get Player B's breathing properties back instead of their own. Most pawns have the same underwater breathing properties, but I wouldn't rule out the possibility of someone making a model with a custom species that has different breathing options. Alternatively, some players could have something like the scuba tanks on that submarine assault level in UT. A way to ensure that each person gets their own breathing properties back is by keeping track of a list of players and their underwater times, like so:

&lt;uscript&gt;
struct BreathingProperties
{
  var Pawn Player;
  var float StoredTime;
};

var array&lt;BreathingProperties&gt; StoredProperties;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function int FindBreathingPropsFor( Pawn Player )
{
  local int i;
  
  if ( Player == None ) return -1;

  for (i=0;i&lt;StoredProperties.Length;i++)
    if ( StoredProperties[i].Player == Player ) return i;

  return -1;
}

simulated function StoreBreathingPropsFor( Pawn Player )
{
  local int i;
  local BreathingProperties NewProperties;

  if ( Player == None ) return;

  i = FindBreathingPropsFor( Player );
  if ( i &lt; 0 || i &gt; StoredProperties.Length )
  {
    NewProperties.Player = Player;
    i = StoredProperties.Length;
    StoredProperties[i] = NewProperties;
  }

  StoredProperties[i].StoredTime = Player.UnderwaterTime;
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function Touch( actor Other )
{
  if ( Other.IsA( 'Pawn' ) )
  {
    StoreBreathingPropsFor( Pawn( Other ) );
    Pawn( Other ).UnderwaterTime += nAdjustedBreathingTime;
  }

  Super.Touch( Other );
}

simulated function Untouch( actor Other )
{
  local int i;

  Super.Untouch( Other );

  if ( Other.IsA( 'Pawn' ) )
  {
    i = FindBreathingPropsFor( Pawn( Other ) );
    if ( i &gt;= 0 &amp;&amp; i &lt; StoredProperties.Length )
    {
      Pawn( Other ).UnderwaterTime = StoredProperties[i].StoredTime;
      StoredProperties.Remove( i, 1 );
    }
  }
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>5090</id>
      <timestamp>2003-11-02T22:51:53Z</timestamp>
      <contributor>
        <ip>MeanFish</ip>
      </contributor>
      <comment>Dude, that's awesome.  Thanks!</comment>
      <text xml:space="preserve">Welcome to my page!  Feel free to add random ponderings if you want in the &quot;Discussion&quot; area, and if you have any suggestions/comments/complaints/threats feel free to put those wherever seems relevant.

The concept of the wiki is strong with this page author, so don't be shy about putting stuff on here!

====Contact Information====

AIM:  HopFrog 187

MSN:  NinjaGuppy6@hotmail.com

Yahoo!:  wonko32

ICQ:  89282852

EMail:  NinjaGuppy6@hotmail.com

====Current Projects====
*Active Projects
**Carjack! (yes, we've started working on code for this...)
**A blitzball-style level for Deathball
*Future Projects
**Gnome Action Cinema (more on this later, name subject to change)
**UT2003 Extended SDK

====Diary of a Madman====

As I traversed through the grassy plains of UnrealScriptLand, I came across the most frightening sight I'd ever witnessed, for there before me was a wall of teepees.  &quot;Natives,&quot; I grunted with a slightly depressed tone knowing that the answer I seek is somewhere on the other side of that wall which I will never be able to afford to go over (I love overly long sentences.  Are you out of breath yet?  See below to fix that problem!).  These natives were wielding flamethrowers and boards with nails in them.  I was simply no match with only my car keys available.

====AmphibiousWaterVolume is brought to life!====

I'll be sure to post the code here when I'm done making the class more easily manipulated.  Flexible code is good code :)  Ok, ok, I'll post what I have so far.  Any advice would be appreciated.  I'm also still testing it, so if there are bugs I'd love to hear about them so that I can (hopefully) fix them in less time than it took me to figure out how to make this thing work at all!

&lt;uscript&gt;
//By:  MeanFish
//Purpose:  to make it so that people wont drown inside
//of this water volume's loving arms.

class AmphibiousWaterVolume extends WaterVolume;

var int nTempTime;
var int nAdjustedBreathingTime;

//if an Actor enters the volume, set their breathing abilities to
//&quot;I could do this for six months!&quot; (literally)
function touch(Actor other)
{
         local Pawn myPawn;

         if (Other.IsA('Pawn'))
         {
            myPawn = Pawn(other);
            nTempTime = myPawn.UnderwaterTime;
            myPawn.UnderwaterTime= +nAdjustedBreathingTime;
         }
         
         Super.touch();
}

//if an Actor leaves, make sure to set their breathing back to normal, 
//in case there is a normal water volume in the same level.
function untouch(Actor Other)
{
         local Pawn myPawn;
         if (Other.IsA('Pawn'))
         {
            myPawn = Pawn(Other);
            myPawn.UnderwaterTime=ntempTime;
         }
         Super.untouch();
}

defaultproperties
{
nAdjustedBreathingTime=9999999.0
//I'm trying to make it so that projectiles are immune to the slowdown effect
//of underwater combat.  translation:  I'm trying to use this for a deathball level.
bMoveProjectiles=false;
}
&lt;/uscript&gt;

Oh yeah...and if you decide to use this, dont forget to add whatever package you put it in to your

EditPackages section for UEd (at the bottom of ut2003.ini).  Probably childs play for most of y'all but it was hard for me so BACK OFF! :-P

===Discussion===

'''Foxpaw:''' There's a slight problem with the way that your code resets the breathing times. If Player A enters the water, then Player B enters, then Player A leaves, Player A will get Player B's breathing properties back instead of their own. Most pawns have the same underwater breathing properties, but I wouldn't rule out the possibility of someone making a model with a custom species that has different breathing options. Alternatively, some players could have something like the scuba tanks on that submarine assault level in UT. A way to ensure that each person gets their own breathing properties back is by keeping track of a list of players and their underwater times, like so:

&lt;uscript&gt;
struct BreathingProperties
{
  var Pawn Player;
  var float StoredTime;
};

var array&lt;BreathingProperties&gt; StoredProperties;

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function int FindBreathingPropsFor( Pawn Player )
{
  local int i;
  
  if ( Player == None ) return -1;

  for (i=0;i&lt;StoredProperties.Length;i++)
    if ( StoredProperties[i].Player == Player ) return i;

  return -1;
}

simulated function StoreBreathingPropsFor( Pawn Player )
{
  local int i;
  local BreathingProperties NewProperties;

  if ( Player == None ) return;

  i = FindBreathingPropsFor( Player );
  if ( i &lt; 0 || i &gt; StoredProperties.Length )
  {
    NewProperties.Player = Player;
    i = StoredProperties.Length;
    StoredProperties[i] = NewProperties;
  }

  StoredProperties[i].StoredTime = Player.UnderwaterTime;
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //

simulated function Touch( actor Other )
{
  if ( Other.IsA( 'Pawn' ) )
  {
    StoreBreathingPropsFor( Pawn( Other ) );
    Pawn( Other ).UnderwaterTime += nAdjustedBreathingTime;
  }

  Super.Touch( Other );
}

simulated function Untouch( actor Other )
{
  local int i;

  Super.Untouch( Other );

  if ( Other.IsA( 'Pawn' ) )
  {
    i = FindBreathingPropsFor( Pawn( Other ) );
    if ( i &gt;= 0 &amp;&amp; i &lt; StoredProperties.Length )
    {
      Pawn( Other ).UnderwaterTime = StoredProperties[i].StoredTime;
      StoredProperties.Remove( i, 1 );
    }
  }
}

// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
// **************************************************************************************** //
&lt;/uscript&gt;

'''MeanFish:''' Dude that's awesome...thanks a lot!  I'll be spending some time deciphering it.  I'm still learning, as mentioned previously but I appreciate the help a ton!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mecha</title>
    <id>1860</id>
    <revision>
      <id>4566</id>
      <timestamp>2003-08-04T15:44:57Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>screening [[Category Journal]]</comment>
      <text xml:space="preserve">==Mecha==

24-year-old 3D/video artist by training, Java/Lotus Notes/&quot;miscellaneous&quot; developer by necessity. Works for a relatively unknown shipping company in Seattle; lives just inside the city. Fan of robotical-type things; giant or no, and most definitively old-school. Also a game-fan-in-general(but especially shmups), comic-n-animation afficinado, and beer-lover descendant.

I've actually played around editing with games since the original Doom; ever since after the Aliens TC and discovering the Doom Construction Kit(&quot;Ve ah Developahz.&quot;).Unfortunately, nothing public ever came of this(not even the UT experimenting), so I'm hoping to finally rectify that with UT2k3. Much of the general idea of [[Legacy:Mychaeel|Mychaeel]]'s writings have been ingrained on my soul ever since the Quake and Avara days(born out of the vitriol towards websites popping up on the Gamespy Planet* sites promising fantabulous things, that were obviously run by 12-year-olds). Also a dislike of clans in general, but that's another story.

I especially like pushing new gameplay concepts and &quot;weird&quot;/funny things in the Unreal engines. My development tastes correspond with Jeff &quot;Llamatron&quot; Minter:

{{innerbox|&quot;Reality is boring. With the graphic power becoming available to humble game coders like me, I can now give gameplayers a car that looks _extremely like an actual car_. Or I can use that same power to take them to a completely new space, where every day, before breakfast, they can see things that no living human has ever seen before.&quot; &amp;ndash;Jeff Minter, 1997

}}

Quite.

I can be reached easiest at mechaman@gocougs.wsu.edu. My working page is at http://welcome.to/nowloading, but the amount of time between updates should tell you something. Another gap to be rectified!

[[Legacy:Mecha/Developer Journal|Mecha/Developer Journal]]

===Projects===

====Major====

'''Gearframe Generation:

Largish pseudo-TC loosely based on the Virtual On series, including other bits from favorite mecha games like Armored Core, Gunvalkyrie, and ZOE. Was actually inspired by Smashdroids UT, but UT's animation system wasn't up to the requirements at the time. Has actually been planned in my off hours over the past year or two, and most of my other projects are proof-of-concept demos supporting its underpinnings.

====Minor====

'''Yorick:

Taken too much damage, or a well-placed head-shot? There goes the ol' noggin flying&amp;ndash;but the catch is that you're still in it. Depending on the complexity(and the patience of the author), either your body is &quot;remote-controlled&quot; until it picks it back up, or you'll have to manually yell to the bot controlling your body to come get you. Watch out for other player's kicks!

'''CrashDummy:

Hitting the wall too hard? It'll hurt.(Of course, this one has run into problems already while I figure out where the physical damage code is located).

'''AirTrick:

With jet-assisted jumps and a limited-duration jetpack, the catch is that you'll need to perform an action or &quot;dash&quot; to keep the timer high on the jets. Think Gunvalkyrie's Boost Combo system, or (*choke*) Marvel vs. Capcom 2's aerial juggles. Not rightly sure if this concept works in a fast-action game, but like I said, proof-of-concept demonstrators.

'''WallJump:

Similiar to [[Legacy:Wormbo|Wormbo]]'s MultiDodge, instead of dodging near a wall, you can flip off of it. Simple, but hopefully good for entertaining screenies(I'm hoping that these three also work to liven up [http://www.flyingserpent.com/kakutou/ Raging Carnival] as well).

'''WackyWeapons: 

Mostly based on various mecha games(Homing Laser Launcher, Multiwarhead Missiles, etc.) , and other random concepts that sounded fun. I'm a big fan of experimenting with remote-control weaponry&amp;ndash;not Redeemers, mind you, but rather more autonomous drones. Think Bal-Baros.

Now, to wait for the usual words of welcome from the rest of the inmate&amp;ndash;er, developers. ;)

----

'''Wormbo:''' Well, I'll start with the usual words. ;) Welcome to the site. Feel free to add yourself to the list of [[Legacy:Project Contributors|Project Contributors]] (if you didn't do that already) and have a look at [[:Category:Legacy Journal]], maybe you want to put your journal there.&lt;br /&gt;&quot;Similar to [[Legacy:Wormbo|Wormbo]]'s MultiJump&quot; &amp;ndash; I must be sleep-coding again, I can't remember such a mutator. o_O However, I made a Multi Dodging mutator.

'''EntropicLqd:''' Welcome to the Wiki.

'''Tarquin:''' Hi &amp; welcome to the site

'''Mecha:''' The brain, she is the no work! Appropriate changes made, and thanks to all. ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4567</id>
      <timestamp>2003-01-06T12:44:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Mecha==

24-year-old 3D/video artist by training, Java/Lotus Notes/&quot;miscellaneous&quot; developer by necessity. Works for a relatively unknown shipping company in Seattle; lives just inside the city. Fan of robotical-type things; giant or no, and most definitively old-school. Also a game-fan-in-general(but especially shmups), comic-n-animation afficinado, and beer-lover descendant.

I've actually played around editing with games since the original Doom; ever since after the Aliens TC and discovering the Doom Construction Kit(&quot;Ve ah Developahz.&quot;).Unfortunately, nothing public ever came of this(not even the UT experimenting), so I'm hoping to finally rectify that with UT2k3. Much of the general idea of [[Legacy:Mychaeel|Mychaeel]]'s writings have been ingrained on my soul ever since the Quake and Avara days(born out of the vitriol towards websites popping up on the Gamespy Planet* sites promising fantabulous things, that were obviously run by 12-year-olds). Also a dislike of clans in general, but that's another story.

I especially like pushing new gameplay concepts and &quot;weird&quot;/funny things in the Unreal engines. My development tastes correspond with Jeff &quot;Llamatron&quot; Minter:

{{innerbox|&quot;Reality is boring. With the graphic power becoming available to humble game coders like me, I can now give gameplayers a car that looks _extremely like an actual car_. Or I can use that same power to take them to a completely new space, where every day, before breakfast, they can see things that no living human has ever seen before.&quot; &amp;ndash;Jeff Minter, 1997

}}

Quite.

I can be reached easiest at mechaman@gocougs.wsu.edu . My working page is at http://welcome.to/nowloading, but the amount of time between updates should tell you something. Another gap to be rectified!

===Projects===

====Major====

'''Gearframe Generation:

Largish pseudo-TC loosely based on the Virtual On series, including other bits from favorite mecha games like Armored Core, Gunvalkyrie, and ZOE. Was actually inspired by Smashdroids UT, but UT's animation system wasn't up to the requirements at the time. Has actually been planned in my off hours over the past year or two, and most of my other projects are proof-of-concept demos supporting its underpinnings.

====Minor====

'''Yorick:

Taken too much damage, or a well-placed head-shot? There goes the ol' noggin flying&amp;ndash;but the catch is that you're still in it. Depending on the complexity(and the patience of the author), either your body is &quot;remote-controlled&quot; until it picks it back up, or you'll have to manually yell to the bot controlling your body to come get you. Watch out for other player's kicks!

'''CrashDummy:

Hitting the wall too hard? It'll hurt.(Of course, this one has run into problems already while I figure out where the physical damage code is located).

'''AirTrick:

Similar to [[Legacy:Wormbo|Wormbo]]'s MultiJump; but in addition to a limited-duration jetpack, the catch is that you'll need to perform an action or &quot;dash&quot; to keep the timer high on the jets. Think Gunvalkyrie's Boost Combo system, or (*choke*) Marvel vs. Capcom 2's aerial juggles. Not rightly sure if this concept works in a fast-action game, but like I said, proof-of-concept demonstrators.

'''WallJump:

Instead of being able to dodge near a wall, you just flip off of it. Simple, but hopefully good for entertaining screenies(I'm hoping that these three also work to liven up [http://www.flyingserpent.com/kakutou/ Raging Carnival] as well).

'''WackyWeapons: 

Mostly based on various mecha games(Homing Laser Launcher, Multiwarhead Missiles, etc.) , and other random concepts that sounded fun. I'm a big fan of experimenting with remote-control weaponry&amp;ndash;not Redeemers, mind you, but rather more autonomous drones. Think Bal-Baros.

===Journal===

====01/05/2003====

After moving into a new apartment, waiting for DSL, and enduring the holidays, I've finally gotten to start UT2k3 development. Decided to add a page on the Wiki, and will try to clear up bits about Maya and animation as well. Speaking of which, I'm disappointed in Alias|Wavefront. Not only is their &quot;customized&quot; PLE just the standard PLE(super-annoying watermarks and all&amp;ndash;they could have really stolen gmax's thunder here) with a UT2k3 startup screen, Maya 4.0 is significantly less impressive than I thought it would be. A|W promised &quot;an entirely updated interface!&quot;, yet it's still pretty much as it was in 3.0&amp;ndash;a heap of random options just tossed in a pile. Max may not be as powerful but(with the exception of the transform stack) is much more fun to model in than Maya. I think I need to petition the Blender gang to open up bone data in the Python module, now that they've gone open-source. I'd rather spend time working out problems in a familiar interface, rather than work out the interface to solve the problems. Of course, if it was up to me, I'd be using Softimage|XSI, but SI doesn't think the hobbyist's market is for them yet, a pity.

Now, to wait for the usual words of welcome from the rest of the inmate&amp;ndash;er, developers. ;)

----

'''Wormbo:''' Well, I'll start with the usual words. ;) Welcome to the site. Feel free to add yourself to the list of [[Legacy:Project Contributors|Project Contributors]] (if you didn't do that already) and have a look at [[:Category:Legacy Journal]], maybe you want to put your journal there.&lt;br /&gt;&quot;Similar to [[Legacy:Wormbo|Wormbo]]'s MultiJump&quot; &amp;ndash; I must be sleep-coding again, I can't remember such a mutator. o_O However, I made a Multi Dodging mutator.

'''EntropicLqd:''' Welcome to the Wiki.

'''Tarquin:''' Hi &amp; welcome to the site

[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4568</id>
      <timestamp>2003-02-15T03:24:52Z</timestamp>
      <contributor>
        <ip>Mecha</ip>
      </contributor>
      <minor/>
      <comment>added journal link</comment>
      <text xml:space="preserve">==Mecha==

24-year-old 3D/video artist by training, Java/Lotus Notes/&quot;miscellaneous&quot; developer by necessity. Works for a relatively unknown shipping company in Seattle; lives just inside the city. Fan of robotical-type things; giant or no, and most definitively old-school. Also a game-fan-in-general(but especially shmups), comic-n-animation afficinado, and beer-lover descendant.

I've actually played around editing with games since the original Doom; ever since after the Aliens TC and discovering the Doom Construction Kit(&quot;Ve ah Developahz.&quot;).Unfortunately, nothing public ever came of this(not even the UT experimenting), so I'm hoping to finally rectify that with UT2k3. Much of the general idea of [[Legacy:Mychaeel|Mychaeel]]'s writings have been ingrained on my soul ever since the Quake and Avara days(born out of the vitriol towards websites popping up on the Gamespy Planet* sites promising fantabulous things, that were obviously run by 12-year-olds). Also a dislike of clans in general, but that's another story.

I especially like pushing new gameplay concepts and &quot;weird&quot;/funny things in the Unreal engines. My development tastes correspond with Jeff &quot;Llamatron&quot; Minter:

{{innerbox|&quot;Reality is boring. With the graphic power becoming available to humble game coders like me, I can now give gameplayers a car that looks _extremely like an actual car_. Or I can use that same power to take them to a completely new space, where every day, before breakfast, they can see things that no living human has ever seen before.&quot; &amp;ndash;Jeff Minter, 1997

}}

Quite.

I can be reached easiest at mechaman@gocougs.wsu.edu . My working page is at http://welcome.to/nowloading, but the amount of time between updates should tell you something. Another gap to be rectified!

[[Legacy:Mecha/Developer Journal|Mecha/Developer Journal]]

===Projects===

====Major====

'''Gearframe Generation:

Largish pseudo-TC loosely based on the Virtual On series, including other bits from favorite mecha games like Armored Core, Gunvalkyrie, and ZOE. Was actually inspired by Smashdroids UT, but UT's animation system wasn't up to the requirements at the time. Has actually been planned in my off hours over the past year or two, and most of my other projects are proof-of-concept demos supporting its underpinnings.

====Minor====

'''Yorick:

Taken too much damage, or a well-placed head-shot? There goes the ol' noggin flying&amp;ndash;but the catch is that you're still in it. Depending on the complexity(and the patience of the author), either your body is &quot;remote-controlled&quot; until it picks it back up, or you'll have to manually yell to the bot controlling your body to come get you. Watch out for other player's kicks!

'''CrashDummy:

Hitting the wall too hard? It'll hurt.(Of course, this one has run into problems already while I figure out where the physical damage code is located).

'''AirTrick:

With jet-assisted jumps and a limited-duration jetpack, the catch is that you'll need to perform an action or &quot;dash&quot; to keep the timer high on the jets. Think Gunvalkyrie's Boost Combo system, or (*choke*) Marvel vs. Capcom 2's aerial juggles. Not rightly sure if this concept works in a fast-action game, but like I said, proof-of-concept demonstrators.

'''WallJump:

Similiar to [[Legacy:Wormbo|Wormbo]]'s MultiDodge, instead of dodging near a wall, you can flip off of it. Simple, but hopefully good for entertaining screenies(I'm hoping that these three also work to liven up [http://www.flyingserpent.com/kakutou/ Raging Carnival] as well).

'''WackyWeapons: 

Mostly based on various mecha games(Homing Laser Launcher, Multiwarhead Missiles, etc.) , and other random concepts that sounded fun. I'm a big fan of experimenting with remote-control weaponry&amp;ndash;not Redeemers, mind you, but rather more autonomous drones. Think Bal-Baros.

Now, to wait for the usual words of welcome from the rest of the inmate&amp;ndash;er, developers. ;)

----

'''Wormbo:''' Well, I'll start with the usual words. ;) Welcome to the site. Feel free to add yourself to the list of [[Legacy:Project Contributors|Project Contributors]] (if you didn't do that already) and have a look at [[:Category:Legacy Journal]], maybe you want to put your journal there.&lt;br /&gt;&quot;Similar to [[Legacy:Wormbo|Wormbo]]'s MultiJump&quot; &amp;ndash; I must be sleep-coding again, I can't remember such a mutator. o_O However, I made a Multi Dodging mutator.

'''EntropicLqd:''' Welcome to the Wiki.

'''Tarquin:''' Hi &amp; welcome to the site

'''Mecha:''' The brain, she is the no work! Appropriate changes made, and thanks to all. ;)

[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mecha/Developer Journal</title>
    <id>2097</id>
    <revision>
      <id>5107</id>
      <timestamp>2003-08-05T09:50:42Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===03/10/2003===

Woo-lah.

Noticed PHYS_Hovering on the [[Legacy:PhysicsType|PhysicsType]] page, and tried playing around with it. I thought it'd be perfect to make skates with, with the part about &quot;making crazy jumps&quot;. 

Turns out, weird things happen. I threw together a mutator(basing it off of BootsOfJumping) that basically tries to set you in PHYS_Hovering all the time. I've yet to get the hang of state changes&amp;ndash;translocating, firing a remote-Redeemer, or entering/leaving a vehicle resets you to PHYS_Walking. However, I threw in some random lines of code, and now it will reactivate when switching weapons(!?), or getting shot into the air by a bot.

As the page says, PHYS_Hovering apparently wasn't meant to be dealt with. showdebug doesn't list it when it's active, and the pawn frequently gets stuck in animations&amp;ndash;pain(after I used the shieldgun to bunny hop out of some places; hovering renders you unable to get some pickups, or negotiate steep stairs), or weapon switching. Hovering also negates some of the effect of jumppads; running into them on Face3 makes them about a fourth as effective as normal. Hovering also means you don't take any falling damage at all though(you do a neat little bounce effect). You also pretty much ignore walls that aren't 90-degrees vertical&amp;ndash;you can even climb the pyramid in Face3! Seems gentle terrain bumps(like in Antalus) result in the fastest speeds/highest jumps.

I also stuck in foot trails from the Speed Combo for grins; these dissappear about a minute into the level. I've no idea why, again(outside of the usual crappy-code answer).

Bots don't seem to be affected&amp;ndash;although they categorically don't do well with subtle gameplay changes.

And of course, apparently I'm not cleaning up properly&amp;ndash;dying causes an infinite recursion fault.

Still though, it's fun to see the pawn hovering around&amp;ndash;probably could use the effect for an antigrav belt or poor-man's jetpack. I wonder if it was originally intended for the hover bikes, before [[Legacy:Karma|Karma]] was added? Will probably keep experimenting with it. And I've now been introduced to just how much an Inventory item can do.

Am still working behind-the-scenes, have a ninja-themed mutator pack planned. Waiting for Lightwave Discovery Edition, to actually get custom meshes in-game.

===02/14/2003===

's been over a month already?

After a (self-destructed) video project at the top, a two week-long headache in the middle, and some sleepless nights(causing the headache) finishing a design document for Gearframe at the end, it's been hectic. Couple that with my grandmother's decline and passing away, and you could say that &quot;stuff's happened&quot;.

But a bit of nose-tweaking on the BU forums have woken me up, so it's off to the races again. The design document should go public(it's being passed around a circle of friends and contacts) within a few days for people to laugh at. In the meantime, I'm trying to clean up some minor Wiki bits I noticed and add some things that have sat around on my drive for awhile.

===01/06/2003===

Seems that Maya PLE won't import anything worth a damn, not even DXF. I'd hoped to import an old [http://voot411.virtualon.net/ajim.htm Ajim] model for excretions and laughter, but no dice. And the 4.5 PLE, which gets rid of the watermark, doesn't appear to have an Unreal plugin yet. After a day of indigestion at work followed by a sensible spicy Indian dinner, I'm going to bed.

===01/05/2003===

After moving into a new apartment, waiting for DSL, and enduring the holidays, I've finally gotten to start UT2k3 development. Decided to add a page on the Wiki, and will try to clear up bits about Maya and animation as well. Speaking of which, I'm disappointed in Alias|Wavefront. Not only is their &quot;customized&quot; PLE just the standard PLE(super-annoying watermarks and all&amp;ndash;they could have really stolen gmax's thunder here) with a UT2k3 startup screen, Maya 4.0 is significantly less impressive than I thought it would be. A|W promised &quot;an entirely updated interface!&quot;, yet it's still pretty much as it was in 3.0&amp;ndash;a heap of random options just tossed in a pile. Max may not be as powerful but(with the exception of the transform stack) is much more fun to model in than Maya. I think I need to petition the Blender gang to open up bone data in the Python module, now that they've gone open-source. I'd rather spend time working out problems in a familiar interface, rather than work out the interface to solve the problems. Of course, if it was up to me, I'd be using Softimage|XSI, but SI doesn't think the hobbyist's market is for them yet, a pity.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5108</id>
      <timestamp>2003-02-15T03:35:36Z</timestamp>
      <contributor>
        <ip>Mecha</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===02/14/2003===

's been over a month already?

After a (self-destructed) video project at the top, a two week-long headache in the middle, and some sleepless nights(causing the headache) finishing a design document for Gearframe at the end, it's been hectic. Couple that with my grandmother's decline and passing away, and you could say that &quot;stuff's happened&quot;.

But a bit of nose-tweaking on the BU forums have woken me up, so it's off to the races again. The design document should go public(it's being passed around a circle of friends and contacts) within a few days for people to laugh at. In the meantime, I'm trying to clean up some minor Wiki bits I noticed and add some things that have sat around on my drive for awhile.

===01/06/2003===

Seems that Maya PLE won't import anything worth a damn, not even DXF. I'd hoped to import an old [http://voot411.virtualon.net/ajim.htm Ajim] model for excretions and laughter, but no dice. And the 4.5 PLE, which gets rid of the watermark, doesn't appear to have an Unreal plugin yet. After a day of indigestion at work followed by a sensible spicy Indian dinner, I'm going to bed.

===01/05/2003===

After moving into a new apartment, waiting for DSL, and enduring the holidays, I've finally gotten to start UT2k3 development. Decided to add a page on the Wiki, and will try to clear up bits about Maya and animation as well. Speaking of which, I'm disappointed in Alias|Wavefront. Not only is their &quot;customized&quot; PLE just the standard PLE(super-annoying watermarks and all&amp;ndash;they could have really stolen gmax's thunder here) with a UT2k3 startup screen, Maya 4.0 is significantly less impressive than I thought it would be. A|W promised &quot;an entirely updated interface!&quot;, yet it's still pretty much as it was in 3.0&amp;ndash;a heap of random options just tossed in a pile. Max may not be as powerful but(with the exception of the transform stack) is much more fun to model in than Maya. I think I need to petition the Blender gang to open up bone data in the Python module, now that they've gone open-source. I'd rather spend time working out problems in a familiar interface, rather than work out the interface to solve the problems. Of course, if it was up to me, I'd be using Softimage|XSI, but SI doesn't think the hobbyist's market is for them yet, a pity.</text>
    </revision>
    <revision>
      <id>5109</id>
      <timestamp>2003-03-11T06:11:42Z</timestamp>
      <contributor>
        <ip>Mecha</ip>
      </contributor>
      <comment>just random journaling</comment>
      <text xml:space="preserve">===03/10/2003===

Woo-lah.

Noticed PHYS_Hovering on the [[Legacy:PhysicsType|PhysicsType]] page, and tried playing around with it. I thought it'd be perfect to make skates with, with the part about &quot;making crazy jumps&quot;. 

Turns out, weird things happen. I threw together a mutator(basing it off of BootsOfJumping) that basically tries to set you in PHYS_Hovering all the time. I've yet to get the hang of state changes&amp;ndash;translocating, firing a remote-Redeemer, or entering/leaving a vehicle resets you to PHYS_Walking. However, I threw in some random lines of code, and now it will reactivate when switching weapons(!?), or getting shot into the air by a bot.

As the page says, PHYS_Hovering apparently wasn't meant to be dealt with. showdebug doesn't list it when it's active, and the pawn frequently gets stuck in animations&amp;ndash;pain(after I used the shieldgun to bunny hop out of some places; hovering renders you unable to get some pickups, or negotiate steep stairs), or weapon switching. Hovering also negates some of the effect of jumppads; running into them on Face3 makes them about a fourth as effective as normal. Hovering also means you don't take any falling damage at all though(you do a neat little bounce effect). You also pretty much ignore walls that aren't 90-degrees vertical&amp;ndash;you can even climb the pyramid in Face3! Seems gentle terrain bumps(like in Antalus) result in the fastest speeds/highest jumps.

I also stuck in foot trails from the Speed Combo for grins; these dissappear about a minute into the level. I've no idea why, again(outside of the usual crappy-code answer).

Bots don't seem to be affected&amp;ndash;although they categorically don't do well with subtle gameplay changes.

And of course, apparently I'm not cleaning up properly&amp;ndash;dying causes an infinite recursion fault.

Still though, it's fun to see the pawn hovering around&amp;ndash;probably could use the effect for an antigrav belt or poor-man's jetpack. I wonder if it was originally intended for the hover bikes, before [[Legacy:Karma|Karma]] was added? Will probably keep experimenting with it. And I've now been introduced to just how much an Inventory item can do.

Am still working behind-the-scenes, have a ninja-themed mutator pack planned. Waiting for Lightwave Discovery Edition, to actually get custom meshes in-game.

===02/14/2003===

's been over a month already?

After a (self-destructed) video project at the top, a two week-long headache in the middle, and some sleepless nights(causing the headache) finishing a design document for Gearframe at the end, it's been hectic. Couple that with my grandmother's decline and passing away, and you could say that &quot;stuff's happened&quot;.

But a bit of nose-tweaking on the BU forums have woken me up, so it's off to the races again. The design document should go public(it's being passed around a circle of friends and contacts) within a few days for people to laugh at. In the meantime, I'm trying to clean up some minor Wiki bits I noticed and add some things that have sat around on my drive for awhile.

===01/06/2003===

Seems that Maya PLE won't import anything worth a damn, not even DXF. I'd hoped to import an old [http://voot411.virtualon.net/ajim.htm Ajim] model for excretions and laughter, but no dice. And the 4.5 PLE, which gets rid of the watermark, doesn't appear to have an Unreal plugin yet. After a day of indigestion at work followed by a sensible spicy Indian dinner, I'm going to bed.

===01/05/2003===

After moving into a new apartment, waiting for DSL, and enduring the holidays, I've finally gotten to start UT2k3 development. Decided to add a page on the Wiki, and will try to clear up bits about Maya and animation as well. Speaking of which, I'm disappointed in Alias|Wavefront. Not only is their &quot;customized&quot; PLE just the standard PLE(super-annoying watermarks and all&amp;ndash;they could have really stolen gmax's thunder here) with a UT2k3 startup screen, Maya 4.0 is significantly less impressive than I thought it would be. A|W promised &quot;an entirely updated interface!&quot;, yet it's still pretty much as it was in 3.0&amp;ndash;a heap of random options just tossed in a pile. Max may not be as powerful but(with the exception of the transform stack) is much more fun to model in than Maya. I think I need to petition the Blender gang to open up bone data in the Python module, now that they've gone open-source. I'd rather spend time working out problems in a familiar interface, rather than work out the interface to solve the problems. Of course, if it was up to me, I'd be using Softimage|XSI, but SI doesn't think the hobbyist's market is for them yet, a pity.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MedBox</title>
    <id>2230</id>
    <revision>
      <id>5397</id>
      <timestamp>2006-02-20T13:06:53Z</timestamp>
      <contributor>
        <ip>Boff</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==MedBox==

This is your average health box. It adds 20 to your overall health up to a maximum of 100.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Melaneus</title>
    <id>2110</id>
    <revision>
      <id>5141</id>
      <timestamp>2003-09-01T10:14:42Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal|Developer Journal]] &amp;ndash; List of stuff I'm working on for UT2003

==About Me (or, the origin of Melaneus)==

There was a game called The Even More Incredible Machine. In it, you made contraptions out of things like hamster cages, monkeys on bicycles, and many varieties of balls. In this game was a character called Mel Schlemming (who acted like a Lemming from that game series). Well, of course it was fun to torture Mels by putting them in deadly pinball bumper traps and feeding them to alligators. 

Eventually I set one Mel apart, that was my avatar of sorts. He killed the other Mels and other crazy things. He was Maniacal Mel. 

Maniacal Mel became my &quot;handle&quot; and I used it on many occasions. I used the shorthand MMel for usernames and sometimes parts of passwords.

I dream of making epic video games. Of my many ideas was one called &quot;The Gate War&quot;, which was a fantasy story with superhero grade characters called the Ecliptic. One character in this story was Mel. He was supposed to be a little crazy, but a help to the good guys nonetheless. Well, Mel doesn't sound like the name a fantasy genre character would have. The character's full name expanded to &quot;Melaneus Ambrax Therus T. Ambrosius&quot; (the T stands for Tetranimus), and this is where my handle Melaneus, which I use for my UT2003 productions, comes from.

==Critical Systems Digital==

For all intents and purposes, I am CSD. Ever sinse I first came up with the virtual company name sometime around 1996, it has been as much a part of my work as the name Melaneus.

I've went as far as to replace the nVidia logo on UT2003 with a totally cool 3D CSD logo. Well, it's cool to me.

I reserve all rights to the name and insignia of Critical Systems Digital.

; Home page : http://users.adelphia.net/~csdgames/

There I present some of my game ideas in Flash. I have to admit I am a fan of the Nintendo video games, with the Legend of Zelda series being my favorite. (I'm making a UT2003 map of the Light World from the SNES game &quot;A Link to the Past&quot;, for cryin' out loud.) I tend to prefer a bit of cutesiness over the ultraviolence that seems so prevalent in the PC gaming genre.

; SwitchArsenal: http://csdgames.ut2003files.com/

SwitchArsenal, my big contribution to UT2003, is a toolkit for customizing many aspects of the game, such as the pickups, what players start with, and class/purchase menus. I do believe I spend more than 5x more time coding than playing. I'm guessing I'm not alone... 

----

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.

'''Zxanphorian:''' Hey, i have The Even More Incredible Machine too! :) (Welcome, btw) :) :tup:

'''Tarquin:''' Hi :)

----
  [[:Category:Legacy Personal Page]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5142</id>
      <timestamp>2003-09-01T04:59:04Z</timestamp>
      <contributor>
        <ip>Melaneus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal|Developer Journal]] &amp;ndash; List of stuff I'm working on for UT2003

==About Me (or, the origin of Melaneus)==

There was a game called The Even More Incredible Machine. In it, you made contraptions out of things like hamster cages, monkeys on bicycles, and many varieties of balls. In this game was a character called Mel Schlemming (who acted like a Lemming from that game series). Well, of course it was fun to torture Mels by putting them in deadly pinball bumper traps and feeding them to alligators. 

Eventually I set one Mel apart, that was my avatar of sorts. He killed the other Mels and other crazy things. He was Maniacal Mel. 

Maniacal Mel became my &quot;handle&quot; and I used it on many occasions. I used the shorthand MMel for usernames and sometimes parts of passwords.

I dream of making epic video games. Of my many ideas was one called &quot;The Gate War&quot;, which was a fantasy story with superhero grade characters called the Ecliptic. One character in this story was Mel. He was supposed to be a little crazy, but a help to the good guys nonetheless. Well, Mel doesn't sound like the name a fantasy genre character would have. The character's full name expanded to &quot;Melaneus Ambrax Therus T. Ambrosius&quot; (the T stands for Tetranimus), and this is where my handle Melaneus, which I use for my UT2003 productions, comes from.

==Critical Systems Digital==

For all intents and purposes, I am CSD. Ever sinse I first came up with the virtual company name sometime around 1996, it has been as much a part of my work as the name Melaneus.

I've went as far as to replace the nVidia logo on UT2003 with a totally cool 3D CSD logo. Well, it's cool to me.

I reserve all rights to the name and insignia of Critical Systems Digital.

; Home page : http://users.adelphia.net/~csdgames/

There I present some of my game ideas in Flash. I have to admit I am a fan of the Nintendo video games, with the Legend of Zelda series being my favorite. (I'm making a UT2003 map of the Light World from the SNES game &quot;A Link to the Past&quot;, for cryin' out loud.) I tend to prefer a bit of cutesiness over the ultraviolence that seems so prevalent in the PC gaming genre.

; SwitchArsenal: http://csdgames.ut2003files.com/

SwitchArsenal, my big contribution to UT2003, is a toolkit for customizing many aspects of the game, such as the pickups, what players start with, and class/purchase menus. I do believe I spend more than 5x more time coding than playing. I'm guessing I'm not alone... 

----

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay.

'''Zxanphorian:''' Hey, i have The Even More Incredible Machine too! :) (Welcome, btw) :) :tup:

----
  [[:Category:Legacy Personal Page]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Melaneus/Developer Journal</title>
    <id>2111</id>
    <revision>
      <id>5143</id>
      <timestamp>2003-09-01T09:15:43Z</timestamp>
      <contributor>
        <ip>Melaneus</ip>
      </contributor>
      <comment>Added more projects, links</comment>
      <text xml:space="preserve">Mel's exploits in the world of UT2003

==SwitchArsenal (Mutator)==

This mutator lets users customize various parts of the game, such as weapons, item pickups, starting equipment, class-based games, and purchase menus. It also supports randomized sets and lots of 3rd party modifications.

Currently SA6b is available to the public, at locations like UT2003Files and UT2003HQ.

SA6c will have some improvements to the class/purchase systems. For instance, the two systems are currently in an &quot;either-or&quot; state, but in SA6c they can both be run at once. I'm adding the ability to add on-screen descriptions of the items, plus classes can optionally change the character model of the player. Those stupid bots are doing their best to screw it up, though.

http://csdgames.ut2003files.com

==The Legend of Zelda: The Light World (Map)==

I tend to say my &quot;favorite game of all time&quot; is the SNES classic, The Legend of Zelda: A Link to the Past. In honor of this, I am making a 3D translation of the main map of the game. It's huge. Maybe it will make a good map for UT2004's Onslaught mode. 

I love Nintendo's games. People who think they are &quot;too cool&quot; for Nintendo can go lead empty, pointless lives.

Sorry, it is under heavy construction, and seeing that it is maybe up to 50mb with its support files, I don't want to send it to anyone right now.

==The Legend of Zelda: Hyrule Castle (Map)==

Before the map above, I translated most of Hyrule Castle to UT2003. After making the inside, I began work the outside and ended up switching to making the entire world map and ignoring the inside of the castle.

Ooh, look, I found a place that still has it.

http://www.pcgamemods.com/900/

==Super Weapon Bar (Mutator)==

Because of SwitchArsenal, I've come familiar with a flaw in the weapon programming of UT2003. If you scroll over weapons, it can skip those that are in the same inventory group. To patch this, I made Super Weapon Bar, which scrolls the entire list of weapons instead of stacking them in 9 slots.

http://csdgames.ut2003files.com/Downloads/SuperWeaponBar.zip

==Velocity Trap (Weapon)==

This weapon does not hurt anybody. Instead it slows the victim's movement rate to a crawl. However, they can still rotate at normal speed and fight back. Alt-fire sends the target flying. The best use of this weapon is in a team game. Having one person trap a jumpy player can allow their teammate take them out easier. Trapping the flag carrier will reduce their chances of escape. Also the secondary fire can hit teammates, so you can boost them with alt-fire as well.

http://csdgames.ut2003files.com/Downloads/VelocityTrapv11.zip

==Hand of Death (Weapon)==

This weapon acts like the redeemer, except it is slower, and it causes instant death when it touches a player. 

under construcion

==Camera Mode (GameType)==

I threw together a gametype that eliminates the HUD. This allows you to take pictures of a level without having to shut off the HUD and crosshairs, and then have to turn them back on when you want to play a normal game.

not available - unless somebody requests it.

==Shooting Gallery (GameType)==

This was a single player game where you shot targets. It had modes where the player could not move, and the player automatically moved &quot;on a rail&quot;. I also got into making a simple conversation system, a challenge progression, and a USE icon that informed you what action pressing the USE key would do. It's sitting on the virtual back shelf right now.

No links. Contact me if you are interested.

==The Heart of Dragons (GAME)==

THOD is my biggest game project. I have worked characters, history, architecture, and game mechanics for this game. It would play similarly to the 3D Legend of Zelda games, although it has 3 player characters and more RPG elements, etc. I only mention this here because I build the game architecture in UT2003.

You can view my CSD games Flash presentation.

http://users.adelphia.net/~csdgames

All rights reserved. Now, if you rip off my UT2003 code, I will be miffed and try to get the word out that you are a stealin' weasel. If you rip off my CSD game productions, I will try to hunt you down and kill you, or leave you horribly disfigured for the rest of your pain-filled life. 

Oh, sorry about that.

----
  [[:Category:Legacy Journal]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5144</id>
      <timestamp>2003-09-01T04:50:21Z</timestamp>
      <contributor>
        <ip>Melaneus</ip>
      </contributor>
      <comment>Started Journal</comment>
      <text xml:space="preserve">Mel's exploits in the world of UT2003

Links and stuff coming soon, or not...

==SwitchArsenal (Mutator)==

This mutator lets users customize various parts of the game, such as weapons, item pickups, starting equipment, class-based games, and purchase menus. It also supports randomized sets and lots of 3rd party modifications.

Currently SA6b is available to the public, at locations like UT2003Files and UT2003HQ.

SA6c will have some improvements to the class/purchase systems. For instance, the two systems are currently in an &quot;either-or&quot; state, but in SA6c they can both be run at once. I'm adding the ability to add on-screen descriptions of the items, plus classes can optionally change the character model of the player. Those stupid bots are doing their best to screw it up, though.

==The Legend of Zelda: The Light World (Map)==

I tend to say my &quot;favorite game of all time&quot; is the SNES classic, The Legend of Zelda: A Link to the Past. In honor of this, I am making a 3D translation of the main map of the game. It's huge. Maybe it will make a good map for UT2004's Onslaught mode.

==Super Weapon Bar (Mutator)==

Because of SwitchArsenal, I've come familiar with a flaw in the weapon programming of UT2003. If you scroll over weapons, it can skip those that are in the same inventory group. To patch this, I made Super Weapon Bar, which scrolls the entire list of weapons instead of stacking them in 9 slots.

==Hand of Death (Weapon)==

This weapon acts like the redeemer, except it is slower, and it causes instant death when it touches a player. 

----
  [[:Category:Legacy Journal]]
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mentalflossboy</title>
    <id>2039</id>
    <revision>
      <id>4972</id>
      <timestamp>2003-06-26T21:43:56Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Heyyo===

: Well, I'm new to this whole wiki thing but this seems like a really useful resource.  I put up a little [[Legacy:Mentalflossboy/Developer Journal|page]] in the developer's section, too.

: Basically, I'm new to UnrealScript and UT2003 modding, and my job for the summer is to design a language teaching scenario based on the game.  I need to have the player be able to run around and interact with NPCs, which won't be like bots.  It's really a pretty big modification, since the whole &quot;shooting&quot; thing isn't really the focus of the project I'm working on, and the interaction is.

: Anyways, if you have suggestions on where I should look for information or any tips/ideas, lemme know.

: My biggest question at the moment is whether or not I'll be able to interface with C++ code from UnrealScript.  I know you can do something with &quot;native&quot; functions, but I don't know if you need the license from epic to do so.  Currently, I'm just doing the game end of the project, but eventually I'm going to need to make it work with language recognition code that other people are writing.  So I'm thinking that I can call the C++ native functions from UnrealScript and get messages back from the code (i.e., the user just said the correct phrase, now do something) and then do the appropriate thing in the game.  Is this feasible?

'''GRAF!K:''' I'm not sure how well native C++ will interact with Uscript, but if you want to do some native coding you can shoot of an e-mail to Epic, and they may give you the headers necessary for doing so.

====June 19, 2003====
: Well, I've been working at this for almost three weeks.  My boss hasn't really given me much direction, just said, &quot;Do something with Unreal.&quot;  *chuckles*  So yeah.  Been reading a lot of UnrealScript and stuff.

: I think I can do an interface with xPawns using ScriptedControllers, which will trigger specific events depending on which goalsyou have accomplished in the level so far.  It seems that this will be the easiest way of doing interaction with NPCs, and I don't have to really write any new code.  I've done a couple mods (changing weapons around, etc) to get the feel of UnrealScript, and I've been working some in UnrealED.

: So it looks like I'll just make a map in UnrealED and put in a bunch of Triggers, ScriptedControllers, and a few xPawns which will be manipulated by the controllers.

: This whole wiki page thing is really spectacular.  I'm just staying in my corner for now, since I'm still pretty new to UnrealScript and modding, but hopefully once I actually know my stuff I can help you guys out in other areas of this site.  I've pretty much got this page open as a reference for the entire day I'm at work.  :-P

====June 22, 2003 ====
: Things go better.  I had a really productive meeting with my boss, and have some actual direction now!  *yay!*  Anyways, I spent this morning working on the GUI stuff that's built in to UT2003, searching to see if I could find some way to make a separate window (in addition to the main window the game plays in).  After hitting dead ends for a while, I postes a question on the Help Desk and found out from Mych (thanks again, btw) that it's all done natively, so unless I get the headers from Epic, I'm going to have to find some other way to do what I want.  *hehehe*  Ah well.

----

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4973</id>
      <timestamp>2003-06-23T22:16:07Z</timestamp>
      <contributor>
        <ip>Mentalflossboy</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Heyyo===

: Well, I'm new to this whole wiki thing but this seems like a really useful resource.  I put up a little [[Legacy:Mentalflossboy/Developer Journal|page]] in the developer's section, too.

: Basically, I'm new to UnrealScript and UT2003 modding, and my job for the summer is to design a language teaching scenario based on the game.  I need to have the player be able to run around and interact with NPCs, which won't be like bots.  It's really a pretty big modification, since the whole &quot;shooting&quot; thing isn't really the focus of the project I'm working on, and the interaction is.

: Anyways, if you have suggestions on where I should look for information or any tips/ideas, lemme know.

: My biggest question at the moment is whether or not I'll be able to interface with C++ code from UnrealScript.  I know you can do something with &quot;native&quot; functions, but I don't know if you need the license from epic to do so.  Currently, I'm just doing the game end of the project, but eventually I'm going to need to make it work with language recognition code that other people are writing.  So I'm thinking that I can call the C++ native functions from UnrealScript and get messages back from the code (i.e., the user just said the correct phrase, now do something) and then do the appropriate thing in the game.  Is this feasible?

====June 19, 2003====
: Well, I've been working at this for almost three weeks.  My boss hasn't really given me much direction, just said, &quot;Do something with Unreal.&quot;  *chuckles*  So yeah.  Been reading a lot of UnrealScript and stuff.

: I think I can do an interface with xPawns using ScriptedControllers, which will trigger specific events depending on which goalsyou have accomplished in the level so far.  It seems that this will be the easiest way of doing interaction with NPCs, and I don't have to really write any new code.  I've done a couple mods (changing weapons around, etc) to get the feel of UnrealScript, and I've been working some in UnrealED.

: So it looks like I'll just make a map in UnrealED and put in a bunch of Triggers, ScriptedControllers, and a few xPawns which will be manipulated by the controllers.

: This whole wiki page thing is really spectacular.  I'm just staying in my corner for now, since I'm still pretty new to UnrealScript and modding, but hopefully once I actually know my stuff I can help you guys out in other areas of this site.  I've pretty much got this page open as a reference for the entire day I'm at work.  :-P

====June 22, 2003 ====
: Things go better.  I had a really productive meeting with my boss, and have some actual direction now!  *yay!*  Anyways, I spent this morning working on the GUI stuff that's built in to UT2003, searching to see if I could find some way to make a separate window (in addition to the main window the game plays in).  After hitting dead ends for a while, I postes a question on the Help Desk and found out from Mych (thanks again, btw) that it's all done natively, so unless I get the headers from Epic, I'm going to have to find some other way to do what I want.  *hehehe*  Ah well.

----

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mentalflossboy/Developer Journal</title>
    <id>2108</id>
    <revision>
      <id>5137</id>
      <timestamp>2003-08-05T09:58:19Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===mentalflossboy's page===

====Introduction====

: I really don't have a whole lot to post here.  Really, I'm just putting this out here to see if I can get any feedback.  I'm an undergrad student working as a summer intern and my job is to modify UT2003 to create a training scenario.

====What I'm Trying to Do====

: Basically, I'm trying to create some NPCs that the player will have to walk up to and interact with to advance in the level.  So if anyone has some helpful hints on how I might want to go about doing this, that'd be awesome.

: I'm new to UnrealScript (well, I've been learning it for about two weeks, now) and since I'm working for acadamia (and not industry) we don't have a developer's license or anything so I'm just working with the retail version of the game.  I've already mucked around with some code (got a third person camera which functions, for example (not that silly &quot;behindview 1&quot; from the console)) so I've got some basic ideas of how things work, I'm just not sure what the best way to create the NPCs will be.

====Yup.====

: So yeah..  If you have any helpful hints or can direct me to some resources, I'll be greatly appreciative.  ;-)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5138</id>
      <timestamp>2003-06-12T21:18:07Z</timestamp>
      <contributor>
        <ip>Mentalflossboy</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===mentalflossboy's page===

====Introduction====

: I really don't have a whole lot to post here.  Really, I'm just putting this out here to see if I can get any feedback.  I'm an undergrad student working as a summer intern and my job is to modify UT2003 to create a training scenario.

====What I'm Trying to Do====

: Basically, I'm trying to create some NPCs that the player will have to walk up to and interact with to advance in the level.  So if anyone has some helpful hints on how I might want to go about doing this, that'd be awesome.

: I'm new to UnrealScript (well, I've been learning it for about two weeks, now) and since I'm working for acadamia (and not industry) we don't have a developer's license or anything so I'm just working with the retail version of the game.  I've already mucked around with some code (got a third person camera which functions, for example (not that silly &quot;behindview 1&quot; from the console)) so I've got some basic ideas of how things work, I'm just not sure what the best way to create the NPCs will be.

====Yup.====

: So yeah..  If you have any helpful hints or can direct me to some resources, I'll be greatly appreciative.  ;-)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Menu</title>
    <id>1774</id>
    <revision>
      <id>4353</id>
      <timestamp>2003-05-04T09:14:59Z</timestamp>
      <contributor>
        <ip>216.150.111.xxx</ip>
      </contributor>
      <minor/>
      <comment>&quot;Actor (UT)&quot; fix</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; Menu}}

: ''See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for information on the menus in UnrealEd.''

From the Menu class itself:

&quot;Serves as a generic menu master class.  Can be used with any style of menu implementation. Offers menu services such as reading input. Not dependent on any visual style.&quot;

Note: In UT all menus are part of the UWindow system and extend [[Legacy:UWindowBase|UWindowBase]], which is not a subclass of Actor.

These menus were the &quot;Green Menus&quot; of Unreal I.  Hopefully, Epic will kill these things off in UW once and for all.  Menus should really be objects.  Uwindows 4ever! (heh... -UsAaR33) 

==Properties ==
; ParentMenu : This menu's parent menu.
; Selection : The currently selected item. (?)
; MenuLength : The number of items in this menu. (?)
; bConfigChanged : 
; bExitAllMenus : 
; PlayerOwner : 
; HelpMessage[24] : 
; MenuList[24] :
; LeftString :
; RightString :
; CenterString :
; EnabledString :
; MenuTitle :
; YesString :
; NoString :

==Functions ==
; function bool ProcessSelection() :
; function bool ProcessLeft() :
; function bool ProcessRight() :
; function bool ProcessYes() :
; function bool ProcessNo() :
; function SaveConfigs() :
; function PlaySelectSound() :
; function PlayModifySound() :
; function PlayEnterSound() :
; function ProcessMenuInput(coerce string InputString) :
; function ProcessMenuUpdate(coerce string InputString) :
; function ProcessMenuEscape() :
; function ProcessMenuKey(int KeyNo, string KeyName) :
; function MenuTick(float DeltaTime) :
; function MenuInit() :
; function DrawMenu(canvas Canvas) :
; function ExitAllMenus() :
; function Menu ExitMenu() :
; function SetFontBrightness(canvas Canvas, bool bBright) :
; function MenuProcessInput(byte KeyNum, byte ActionNum) :

==Known subclasses ==
* [[Legacy:UnrealMenu|UnrealMenu]]

==Related Topics ==
* [[Legacy:UWindowBase|The UWindow System]]</text>
    </revision>
    <revision>
      <id>4354</id>
      <timestamp>2002-06-26T05:44:57Z</timestamp>
      <contributor>
        <ip>UsAaR33</ip>
      </contributor>
      <comment>A small note</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; Menu}}

: See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for information on the menus in UnrealEd.

From the Menu class itself:

&quot;Serves as a generic menu master class.  Can be used with any style of menu implementation. Offers menu services such as reading input. Not dependent on any visual style.&quot;

Note: In UT all menus are part of the UWindow system and extend [[Legacy:UWindowBase|UWindowBase]], which is not a subclass of Actor.

These menus were the &quot;Green Menus&quot; of Unreal I.  Hopefully, Epic will kill these things off in UW once and for all.  Menus should really be objects.  Uwindows 4ever! (heh... -UsAaR33) 

==Properties ==
; ParentMenu : This menu's parent menu.
; Selection : The currently selected item. (?)
; MenuLength : The number of items in this menu. (?)
; bConfigChanged : 
; bExitAllMenus : 
; PlayerOwner : 
; HelpMessage[24] : 
; MenuList[24] :
; LeftString :
; RightString :
; CenterString :
; EnabledString :
; MenuTitle :
; YesString :
; NoString :

==Functions ==
; function bool ProcessSelection() :
; function bool ProcessLeft() :
; function bool ProcessRight() :
; function bool ProcessYes() :
; function bool ProcessNo() :
; function SaveConfigs() :
; function PlaySelectSound() :
; function PlayModifySound() :
; function PlayEnterSound() :
; function ProcessMenuInput(coerce string InputString) :
; function ProcessMenuUpdate(coerce string InputString) :
; function ProcessMenuEscape() :
; function ProcessMenuKey(int KeyNo, string KeyName) :
; function MenuTick(float DeltaTime) :
; function MenuInit() :
; function DrawMenu(canvas Canvas) :
; function ExitAllMenus() :
; function Menu ExitMenu() :
; function SetFontBrightness(canvas Canvas, bool bBright) :
; function MenuProcessInput(byte KeyNum, byte ActionNum) :

==Known subclasses ==
* [[Legacy:UnrealMenu|UnrealMenu]]

==Related Topics ==
* [[Legacy:UWindowBase|The UWindow System]]</text>
    </revision>
    <revision>
      <id>4355</id>
      <timestamp>2002-06-26T10:12:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; Menu}}

: ''See [[Legacy:UnrealEd Menus|UnrealEd Menus]] for information on the menus in UnrealEd.''

From the Menu class itself:

&quot;Serves as a generic menu master class.  Can be used with any style of menu implementation. Offers menu services such as reading input. Not dependent on any visual style.&quot;

Note: In UT all menus are part of the UWindow system and extend [[Legacy:UWindowBase|UWindowBase]], which is not a subclass of Actor.

These menus were the &quot;Green Menus&quot; of Unreal I.  Hopefully, Epic will kill these things off in UW once and for all.  Menus should really be objects.  Uwindows 4ever! (heh... -UsAaR33) 

==Properties ==
; ParentMenu : This menu's parent menu.
; Selection : The currently selected item. (?)
; MenuLength : The number of items in this menu. (?)
; bConfigChanged : 
; bExitAllMenus : 
; PlayerOwner : 
; HelpMessage[24] : 
; MenuList[24] :
; LeftString :
; RightString :
; CenterString :
; EnabledString :
; MenuTitle :
; YesString :
; NoString :

==Functions ==
; function bool ProcessSelection() :
; function bool ProcessLeft() :
; function bool ProcessRight() :
; function bool ProcessYes() :
; function bool ProcessNo() :
; function SaveConfigs() :
; function PlaySelectSound() :
; function PlayModifySound() :
; function PlayEnterSound() :
; function ProcessMenuInput(coerce string InputString) :
; function ProcessMenuUpdate(coerce string InputString) :
; function ProcessMenuEscape() :
; function ProcessMenuKey(int KeyNo, string KeyName) :
; function MenuTick(float DeltaTime) :
; function MenuInit() :
; function DrawMenu(canvas Canvas) :
; function ExitAllMenus() :
; function Menu ExitMenu() :
; function SetFontBrightness(canvas Canvas, bool bBright) :
; function MenuProcessInput(byte KeyNum, byte ActionNum) :

==Known subclasses ==
* [[Legacy:UnrealMenu|UnrealMenu]]

==Related Topics ==
* [[Legacy:UWindowBase|The UWindow System]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Meowcat</title>
    <id>2032</id>
    <revision>
      <id>4956</id>
      <timestamp>2002-08-05T21:02:07Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Hi meowcat, welcome to the Wiki.  :-)

'''Tarquin:''' Welcome to the site. 

'''ZxAnPhOrIaN:''' Hey, welcome to the wiki! :) :tup:

'''DJPaul:'''  w0rd.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4957</id>
      <timestamp>2002-08-05T20:33:51Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Hi meowcat, welcome to the Wiki.  :-)

'''Tarquin:''' Welcome to the site. 

'''ZxAnPhOrIaN:''' Hey, welcome to the wiki! :) :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mercenary</title>
    <id>1858</id>
    <revision>
      <id>4560</id>
      <timestamp>2006-02-10T19:28:15Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Mercenary}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Mercenary &gt;&gt; MercenaryElite}}

[[Image:Legacy_scriptedpawn.mercenaries.jpeg|center|&lt;i&gt;A standard Mercenary on the left, and a Mercenary Elite on the right.  The average Mercenary stands only slightly taller than a normal-sized Human.&lt;/i&gt;]]

The Mercenaries could be considered as something of a &quot;third pary&quot; in the Unreal universe.  While hostile to intruders, thieves, and spies, Mercenaries are friendly to pretty much anyone who openly attacks their more dangerous enemies, such as the Skaarj.  However, it is rumored that a few Mercenaries and a few small clans of Skaarj have formed a shaky alliance in the name of mutual profit.  However, most Mercenaries can be considered neutral characters or even allies by Humans.

With their advanced knowledge of electrical and chemical engineering, many Human corporations will compete with each other for the privilege of trading with the Mercenaries for pieces of their technology.  Some Human corporations even turn a profit by using Mercenary-supplied blueprints to manufacture technology for the Mercenaries.

When on duty, Mercenaries are expected to be armed with a multi-function arm weapon.  Completely covering the right arm up to the elbow, this weapon serves as both a gatling gun and a rocket launcher.  On the defensive side, almost all Mercenaries have short-duration invulnerability shields that protect them from all forms of damage and momentum changes.  However, the Mercenaries stationed at a base near Sharuk Crossing on the Nali homeworld have had to do without this asset for quite some time now.

Mercenaries Elite are identified by their blue skin and more powerful rocket launcher.  Also Mercenaries Elite have a shield accessory that leaves a hole in the shield at the end of their weapon's barrel, giving them the ability to continue firing at their targets even when their invulnerability shield is active.

Remember, FollowingMercenaries can be found in Operation: Na Pali.  These are quite friendly mercenaries that are even willing to follow the player around. Read their story [http://www.planetunreal.com/teamvortex/help/data/docs/merc.html here].

==Properties==

Mercenaries have several properties that can be altered by mappers, other than the default sounds.
; PunchDamage : When the Mercenary hits a target in melee range with his fist, then the damage is based on this value.
; bButtonPusher : This is very similar to the bButtonPusher variable for a Skaarj.  Just set this variable to True and place the Mercenary in front of a console of some sort.  The mercenary will use his exposed hand to manipulate the console.  Remember that when a Mercenary is hard at work, he will not be easily distracted by other things going on around him, even if an intruder walks past him.
; bTalker : This is very similar to the bDicePlayer variable for a Krall.  Gather together a team of Mercenaries into a circle, and set bTalker to True for each of them.  When the player encounters them, they will be standing in a circle, in the middle of a deep conversation.
; bSquatter : This should be used in conjunction with bTalker.  Talking Mercenaries with this set to True will be squatting as they hold their conversation.
; bHasInvulnerableShield, bCanFireWhileInvulnerable : These variables determine if a Mercenary has an invulnerability shield, and if the Mercenary can continue to use his weapons while his shield is active.
; invulnerableCharge : This is the number of seconds in which a Mercenary's shield will remain active before automatically switching itself off.

==Discussion==

'''UsAaR33''': Hah.. Writing a story of some kind? And trying to simultaneously cover Unreal I, RTNP, and ONP?  Well, I just added my own quick link :p

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4561</id>
      <timestamp>2002-07-02T07:40:25Z</timestamp>
      <contributor>
        <ip>TechnoJF</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Mercenary&lt;br /&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Mercenary &gt;&gt; MercenaryElite}}

&lt;br&gt;

[[Image:Legacy_scriptedpawn.mercenaries.jpeg|center|&lt;i&gt;A standard Mercenary on the left, and a Mercenary Elite on the right.  The average Mercenary stands only slightly taller than a normal-sized Human.&lt;/i&gt;]]

&lt;br&gt;

The Mercenaries could be considered as something of a &quot;third pary&quot; in the Unreal universe.  While hostile to intruders, thieves, and spies, Mercenaries are friendly to pretty much anyone who openly attacks their more dangerous enemies, such as the Skaarj.  However, it is rumored that a few Mercenaries and a few small clans of Skaarj have formed a shaky alliance in the name of mutual profit.  However, most Mercenaries can be considered neutral characters or even allies by Humans.

&lt;br&gt;

With their advanced knowledge of electrical and chemical engineering, many Human corporations will compete with each other for the privilege of trading with the Mercenaries for pieces of their technology.  Some Human corporations even turn a profit by using Mercenary-supplied blueprints to manufacture technology for the Mercenaries.

&lt;br&gt;

When on duty, Mercenaries are expected to be armed with a multi-function arm weapon.  Completely covering the right arm up to the elbow, this weapon serves as both a gatling gun and a rocket launcher.  On the defensive side, almost all Mercenaries have short-duration invulnerability shields that protect them from all forms of damage and momentum changes.  However, the Mercenaries stationed at a base near Sharuk Crossing on the Nali homeworld have had to do without this asset for quite some time now.

&lt;br&gt;

Mercenaries Elite are identified by their blue skin and more powerful rocket launcher.  Also Mercenaries Elite have a shield accessory that leaves a hole in the shield at the end of their weapon's barrel, giving them the ability to continue firing at their targets even when their invulnerability shield is active.

===Properties ===

Mercenaries have several properties that can be altered by mappers, other than the default sounds.

; PunchDamage : When the Mercenary hits a target in melee range with his fist, then the damage is based on this value.
; bButtonPusher : This is very similar to the bButtonPusher variable for a Skaarj.  Just set this variable to True and place the Mercenary in front of a console of some sort.  The mercenary will use his exposed hand to manipulate the console.  Remember that when a Mercenary is hard at work, he will not be easily distracted by other things going on around him, even if an intruder walks past him.
; bTalker : This is very similar to the bDicePlayer variable for a Krall.  Gather together a team of Mercenaries into a circle, and set bTalker to True for each of them.  When the player encounters them, they will be standing in a circle, in the middle of a deep conversation.
; bSquatter : This should be used in conjunction with bTalker.  Talking Mercenaries with this set to True will be squatting as they hold their conversation.
; bHasInvulnerableShield, bCanFireWhileInvulnerable : These variables determine if a Mercenary has an invulnerability shield, and if the Mercenary can continue to use his weapons while his shield is active.
; invulnerableCharge : This is the number of seconds in which a Mercenary's shield will remain active before automatically switching itself off.</text>
    </revision>
    <revision>
      <id>4562</id>
      <timestamp>2004-05-20T01:18:34Z</timestamp>
      <contributor>
        <ip>64-216-188-176.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Category Class (UT)&quot; reference</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Mercenary&lt;br /&gt;[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Mercenary &gt;&gt; MercenaryElite}}

&lt;br&gt;

[[Image:Legacy_scriptedpawn.mercenaries.jpeg|center|&lt;i&gt;A standard Mercenary on the left, and a Mercenary Elite on the right.  The average Mercenary stands only slightly taller than a normal-sized Human.&lt;/i&gt;]]

&lt;br&gt;

The Mercenaries could be considered as something of a &quot;third pary&quot; in the Unreal universe.  While hostile to intruders, thieves, and spies, Mercenaries are friendly to pretty much anyone who openly attacks their more dangerous enemies, such as the Skaarj.  However, it is rumored that a few Mercenaries and a few small clans of Skaarj have formed a shaky alliance in the name of mutual profit.  However, most Mercenaries can be considered neutral characters or even allies by Humans.

&lt;br&gt;

With their advanced knowledge of electrical and chemical engineering, many Human corporations will compete with each other for the privilege of trading with the Mercenaries for pieces of their technology.  Some Human corporations even turn a profit by using Mercenary-supplied blueprints to manufacture technology for the Mercenaries.

&lt;br&gt;

When on duty, Mercenaries are expected to be armed with a multi-function arm weapon.  Completely covering the right arm up to the elbow, this weapon serves as both a gatling gun and a rocket launcher.  On the defensive side, almost all Mercenaries have short-duration invulnerability shields that protect them from all forms of damage and momentum changes.  However, the Mercenaries stationed at a base near Sharuk Crossing on the Nali homeworld have had to do without this asset for quite some time now.

&lt;br&gt;

Mercenaries Elite are identified by their blue skin and more powerful rocket launcher.  Also Mercenaries Elite have a shield accessory that leaves a hole in the shield at the end of their weapon's barrel, giving them the ability to continue firing at their targets even when their invulnerability shield is active.

Remember, FollowingMercenaries can be found in Operation: Na Pali.  These are quite friendly mercenaries that are even willing to follow the player around. Read their story [http://www.planetunreal.com/teamvortex/help/data/docs/merc.html here].

===Properties ===

Mercenaries have several properties that can be altered by mappers, other than the default sounds.

; PunchDamage : When the Mercenary hits a target in melee range with his fist, then the damage is based on this value.
; bButtonPusher : This is very similar to the bButtonPusher variable for a Skaarj.  Just set this variable to True and place the Mercenary in front of a console of some sort.  The mercenary will use his exposed hand to manipulate the console.  Remember that when a Mercenary is hard at work, he will not be easily distracted by other things going on around him, even if an intruder walks past him.
; bTalker : This is very similar to the bDicePlayer variable for a Krall.  Gather together a team of Mercenaries into a circle, and set bTalker to True for each of them.  When the player encounters them, they will be standing in a circle, in the middle of a deep conversation.
; bSquatter : This should be used in conjunction with bTalker.  Talking Mercenaries with this set to True will be squatting as they hold their conversation.
; bHasInvulnerableShield, bCanFireWhileInvulnerable : These variables determine if a Mercenary has an invulnerability shield, and if the Mercenary can continue to use his weapons while his shield is active.
; invulnerableCharge : This is the number of seconds in which a Mercenary's shield will remain active before automatically switching itself off.

----

'''UsAaR33''': Hah.. Writing a story of some kind? And trying to simultaneously cover Unreal I, RTNP, and ONP?  Well, I just added my own quick link :p

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Merge Polygons</title>
    <id>1775</id>
    <revision>
      <id>4356</id>
      <timestamp>2003-05-25T08:56:02Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Mapping]]</comment>
      <text xml:space="preserve">A set of coplanar [[Legacy:Polygon|polygon]]s in a [[Legacy:Brush|brush]] can be merged together. Merged polygons are treated as single surface in UnrealEd which makes texture alignment easier. Nodes are always convex, so the result may still be made up of several nodes. Effects of this procedure:
* [[Legacy:Polycount|polycount]] is reduced
* [[Legacy:Node Count|node count]] may be reduced. This depends on the shape and configuration of the polygons you are merging. If it's possible to merge adjacent polygons while preserving conmvexity, the engine will do so.
* the brush wireframe is unchanged.

This can be used on any type of brush, add / subtract, any [[Legacy:Solidity|solidity]].

: If you are using subtracted trim then it pays to optimise your brush.

To merge polygons:

# Select them (see [[Legacy:Selecting Surfaces|selecting surfaces]])
# Align them with either the 'align to wall' or 'align to floor' command in the [[Legacy:Surface Properties Window|surface properties window]].
# Select the brush they belong to by SHIFT + left-clicking a surface. It doesn't matter if the surfaces become unselected.
# Do: [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polygons -&gt; Merge
# rebuild geometry
# each sets surfaces on the brush which are coplanar and aligned will now behave as a single surface.

Notes:
* the brush's wireframe will not change. 
* polygons do not need to be adjacent to be merged
* polygons need to be in the same alignment to be merged, but the panning does not need to be seamless.

==Related Topics ==

Tutorials that use this technique (brief list)
* [[Legacy:Making Complex Doors|Making complex doors]]
* [[Legacy:Making Arches|Making arches]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4357</id>
      <timestamp>2002-04-30T19:31:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A set of coplanar [[Legacy:Polygon|polygon]]s in a [[Legacy:Brush|brush]] can be merged together. Merged polygons are treated as single surface in UnrealEd which makes texture alignment easier. BSP polys are always convex, so the result may still be made up of several BSP polys. Effects of this procedure:
* [[Legacy:Polycount|polycount]] is reduced
* [[Legacy:Node Count|node count]] may be reduced. This depends on the shape and configuration of the polygons you are merging. If it's possible to merge adjacent polygons while preserving conmvexity, the engine will do so.
* the brush wireframe is unchanged.

:&lt;i&gt;See the [[Legacy:Node Count|Node count]] page for theories on Node count. I'm fairly sure that node count != wireframe vertices.  ''Tarquin''  &lt;/i&gt;
:&lt;i&gt;Does this work on subtracted brushes?  I've not managed to do it.  If you are using subtracted trim then it pays to optimise your brush first. '' EntropicLqd'' &lt;/i&gt;
:: yup.  &amp;ndash; ''Tarquin'' 

To merge polygons:

# Select them
# Align them with either 'align to wall' or 'align to floor'
# In the brush's [[Legacy:Right-Click Menu|right-click menu]] select &lt;i&gt;Polygons &gt; Merge&lt;/i&gt;
# rebuild geometry

Notes:
* the brush's wireframe will not change. 
* polys do not need to be adjacent to be merged
* polys need to be in the same alignment to be merged, but the panning does not need to be seamless.

==Related Topics ==

Procedures that use this technique (brief list)
* [[Legacy:Making Complex Doors|Making complex doors]]
* [[Legacy:Making Arches|Making arches]]</text>
    </revision>
    <revision>
      <id>4358</id>
      <timestamp>2002-06-28T21:18:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A set of coplanar [[Legacy:Polygon|polygon]]s in a [[Legacy:Brush|brush]] can be merged together. Merged polygons are treated as single surface in UnrealEd which makes texture alignment easier. Nodes are always convex, so the result may still be made up of several nodes. Effects of this procedure:
* [[Legacy:Polycount|polycount]] is reduced
* [[Legacy:Node Count|node count]] may be reduced. This depends on the shape and configuration of the polygons you are merging. If it's possible to merge adjacent polygons while preserving conmvexity, the engine will do so.
* the brush wireframe is unchanged.

This can be used on any type of brush, add / subtract, any [[Legacy:Solidity|solidity]].

: If you are using subtracted trim then it pays to optimise your brush.

To merge polygons:

# Select them (see [[Legacy:Selecting Surfaces|selecting surfaces]])
# Align them with either the 'align to wall' or 'align to floor' command in the [[Legacy:Surface Properties Window|surface properties window]].
# Select the brush they belong to by SHIFT + left-clicking a surface. It doesn't matter if the surfaces become unselected.
# Do: [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Polygons -&gt; Merge
# rebuild geometry
# each sets surfaces on the brush which are coplanar and aligned will now behave as a single surface.

Notes:
* the brush's wireframe will not change. 
* polygons do not need to be adjacent to be merged
* polygons need to be in the same alignment to be merged, but the panning does not need to be seamless.

==Related Topics ==

Tutorials that use this technique (brief list)
* [[Legacy:Making Complex Doors|Making complex doors]]
* [[Legacy:Making Arches|Making arches]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mesh</title>
    <id>1776</id>
    <revision>
      <id>4359</id>
      <timestamp>2005-01-11T15:53:46Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>despam</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; Primitive &gt;&gt; Mesh}}

Thought I would link to a short mesh primer I wrote:

http://pages.zoom.co.uk/expendablejim/meshes/meshes.htm

  -Expendable Jim

:Egad, it's amazing what I find on this site!  &amp;rarr;[[Legacy:Tarquin|Tarquin]]

==Known Subclasses==
* LodMesh
** SkeletalMesh
** VertMesh (UT 2003)</text>
    </revision>
    <revision>
      <id>4360</id>
      <timestamp>2002-10-15T08:48:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; Primitive &gt;&gt; Mesh}}

Thought I would link to a short mesh primer I wrote:

http://pages.zoom.co.uk/expendablejim/meshes/meshes.htm

  -Expendable Jim

:Egad, it's amazing what I find on this site!  &amp;rarr;[[Legacy:Tarquin|Tarquin]]

==Known Subclasses==
* LodMesh
** SkeletalMesh
** VertMesh (UT 2003)</text>
    </revision>
    <revision>
      <id>4361</id>
      <timestamp>2005-01-11T15:10:31Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne medicine scar treatment] 
*[http://acn-scar.boom.ru/ acne medicine scar treatment] 
*[http://acne-care.hotmail.ru/ acne medicine adult care skin] 
*[http://care-acn.boom.ru/ acne medicine adult care skin] 
*[http://acn-care.boom.ru/ acne medicine care] 
*[http://acne1care4skin.chat.ru/ acne medicine skin care product] 
*[http://acne1solution.chat.ru/ acne medicine solution] 
*[http://acn-solution.boom.ru/ acne medicine solution] 
*[http://acne1control.chat.ru/ acne medicine control] 
*[http://acne-control.hotmail.ru/ acne medicine control] 
*[http://acn-control.boom.ru/ acne medicine control] 
*[http://acne-best-treatment.newmail.ru/ murad acne medicine treatment] 
*[http://acn-treatm.boom.ru/ murad acne medicine treatment] 
*[http://product2acne.chat.ru/ acne medicine product] 
*[http://acn1-product.boom.ru/ acne medicine product] 
*[http://acne-product.hotmail.ru/ acne medicine product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne medicine best cure] 
*[http://adult-acne.hotmail.ru/ adult acne medicine treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne medicine treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cheap cigarettes] 
*[http://acne1product.chat.ru/ acne medicine product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale cheap newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne medicine scar] 
*[http://acne1rosacea.chat.ru/ acne medicine rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine medicine] 
*[http://acne1treatment.chat.ru/ acne medicine treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne medicine scar] 
*[http://acne-scar.boom.ru/ acne medicine scar] 
*[http://acne-rosacea.newmail.ru/ acne medicine rosacea] 
*[http://acne-rosacea.boom.ru/ acne medicine rosacea] 
*[http://acne-product.newmail.ru/ acne medicine product] 
*[http://acne-product.boom.ru/ acne medicine product] 
*[http://acne-medicine.newmail.ru/ acne medicine medicine] 
*[http://acne-medicine.boom.ru/ acne medicine medicine] 
*[http://acne-treatment.newmail.ru/ acne medicine treatment] 
*[http://acne-treatment.boom.ru/ acne medicine treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ cheap paper shredder] 
*[http://pp-shredd.boom.ru/ cheap paper shredder] 
*[http://paper-shredder.newmail.ru/ cheap paper shredder] 
*[http://paper1-shredder.boom.ru/ cheap paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ best skin treatment] 
*[http://skin-treat.newmail.ru/ best skin treatment] 
*[http://skin-treat.boom.ru/ best skin treatment] 
*[http://skin-treatment.nm.ru/ best skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cheap cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap discount cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ cheap paper shredder] 
*[http://skin-treatment.newmail.ru/ best skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ best skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ cheap paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap discount cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cheap cigarettes] 
*[http://z100.boom.ru/ marlboro cheap cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ cheap newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cheap cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap discount cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ cheap newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cheap cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cheap cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap discount cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm best skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mesh Browser</title>
    <id>2033</id>
    <revision>
      <id>4958</id>
      <timestamp>2007-01-10T15:57:40Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">The '''Mesh Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

Uses of the browser:
* displays currently loaded non-skeletal [[Legacy:Mesh|mesh]]es (skeletal meshes can be viewed in the [[Legacy:Animation Browser|Animation Browser]])

[[Image:Legacy_interface-Ed3-meshbrowser.png|center|Mesh Browser]]

==Opening ==

The Static Mesh Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Mesh Browser
* Press the Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an eye.

==Browser Toolbar Buttons ==

The Static Mesh Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* Play Animation
* Stop Animation

==Using the Mesh Browser to preview reskinned meshes==

One very useful function of the Mesh Browser for coders is its ability to display the meshes with modifications to skins, drawstyle, etc. because you don't have to place an actor in the level and modify it.
* Select a mesh from the list
* Right-click on the mesh in the window and select ''Actor Properties'' to bring up the Camera Properties window
* Open the Display group in the Camera Properties window and start messing around with the options

----

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Texture Browser|Texture Browser]] | [[Legacy:Prefab Browser|Prefab Browser]] '''Next &gt;'''

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4959</id>
      <timestamp>2003-09-18T14:20:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Mesh Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

Uses of the browser:
* displays currently loaded non-skeletal [[Legacy:Mesh|mesh]]es (skeletal meshes can be viewed in the [[Legacy:Animation Browser|Animation Browser]])

[[Image:Legacy_interface-Ed3-meshbrowser.png|center|Mesh Browser]]

==Opening ==

The Static Mesh Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Mesh Browser
* Press the Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an eye.

==Browser Toolbar Buttons ==

The Static Mesh Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* Play Animation
* Stop Animation

==Using the Mesh Browser to preview reskinned meshes==

One very useful function of the Mesh Browser for coders is its ability to display the meshes with modifications to skins, drawstyle, etc. because you don't have to place an actor in the level and modify it.
* Select a mesh from the list
* Right-click on the mesh in the window and select ''Actor Properties'' to bring up the Camera Properties window
* Open the Display group in the Camera Properties window and start messing around with the options

----

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Texture Browser|Texture Browser]] | [[Legacy:Prefab Browser|Prefab Browser]] '''Next &gt;'''

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4960</id>
      <timestamp>2007-01-10T10:33:34Z</timestamp>
      <contributor>
        <ip>213.166.17.17</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Mesh Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

Uses of the browser:
* displays currently loaded non-skeletal [[Legacy:Mesh|mesh]]es (skeletal meshes can be viewed in the [[Legacy:Animation Browser|Animation Browser]])

[[Image:Legacy_interface-Ed3-meshbrowser.png|center|Mesh Browser]]

==Opening ==

The Static Mesh Browser is accessed either of two ways: 
* Do [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Mesh Browser
* Press the Mesh Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window. It looks like an eye.

==Browser Toolbar Buttons ==

The Static Mesh Browser has the following buttons (from left to right) in its toolbar:
* Dock / undock from browser window
* Play Animation
* Stop Animation

==Using the Mesh Browser to preview reskinned meshes==

One very useful function of the Mesh Browser for coders is its ability to display the meshes with modifications to skins, drawstyle, etc. because you don't have to place an actor in the level and modify it.
* Select a mesh from the list
* Right-click on the mesh in the window and select ''Actor Properties'' to bring up the Camera Properties window
* Open the Display group in the Camera Properties window and start messing around with the options</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mesh Browser Project</title>
    <id>2152</id>
    <revision>
      <id>5240</id>
      <timestamp>2007-07-08T01:11:03Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <text xml:space="preserve">Current project to create a browser for [[Legacy:Static Mesh|static mesh]]es.

See also the list of [[Legacy:Static Mesh Package|Static Mesh Package]]s and the [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]].

This is an app for all the people that ask &quot;How can I find a mesh or texture quickly?&quot; or &quot;Is there some kind of list of static meshes/textures I can look through?&quot;

We all know that loading packages in UED's browser just to see what is in them really sucks.  Really really sucks.  It does not help matters when you realize that most packages (especially static meshes) are named according to their author, not necessarily their contents.  odinfix is well on the way to solving this problem.

==odinfix's UED keyword browser project==

In a nutshell, this is a small application that is a database of all the default Texture and Static Mesh packages in Unreal Tournament 2004.  It has keywords assigned to each mesh or texture, and has a search function.  If you're looking for a static mesh to use as a pipe, you type in 'pipe' in the keyword browser, and it lists all the mesh names (and locations) that fit that description.  You can add more than one keyword to further filter the results ('pipe' would return a LOT of meshes).  If you're looking for a &quot;rusty&quot; texture, you do the same thing and see what the browser returns, etc.  It supports thumbnail images, so you can scroll through and see a snapshot of the mesh.

Merely having thumbnails of each static mesh or texture puts this light years ahead of loading packages in UED just to look through them.  With the ability to search by keyword, imagine how much time this saves.  In my own experience, I don't even bother getting very specific with my searches...if I'm looking for a ramp, I'll put that into the browser and scroll through the thumbnails to find something I'd like to take a closer look at in UnrealEd.  In the spirit of creativity, those working on keywording the meshes are trying to offer suggested uses for a mesh, beyond what the meshes were originally made for.  The object is to think of what a specific mesh '''might''' be used for, not just identifying it.  This might result in getting a lot of results for a particular keyword, but more is better in this case :P

[[Image:Legacy_ukb1.jpeg|center|UnrealEd Keyword Browser by odinfix/Fixell Software Innovations]]
*This is the main window.  You can either browse through the available keywords, or type the word you want to search for.
*# Like Ued's broswers, it begins to parse results as you type.
*# Double-click the keyword you want, or use the arrows, and a list will be shown of all meshes that fit that description.  You can add more keywords to narrow your search, or just click through the results.  This particular example (with an incomplete database) tells me that there are 5 different packages that have a barrel static mesh in them.
*# With &quot;Show Images&quot; selected, you'll see a thumbnail of the mesh, as well as where to find it.
*# Note in the above example, I have already selected the keyword &quot;barrel&quot;, and the keyword list is showing me the keywords also associated with meshes that have the &quot;barrel&quot; keyword attached...if I wanted to add &quot;corroded&quot; to the search, it's going to narrow the list to only meshes that have both keywords.

You can edit keywords yourself, or add packages and keywords for meshes that come with other maps.  You can share your own database and merge someone else's database into yours quite easily.  Even after there's a single databse posted, it is expected that users will modify  or edit it, refine keywords, etc. and then share with others.  It's a pretty powerful tool, and very flexible for the future.

see [http://sv1.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=68116 this thread on 3DBuzz] for the applications and more specific info.  

[http://download.beyondunreal.com/browse.php?dir=unwheel/misc/ Version 3.02 downloads]

[http://web.archive.org/web/20040927192705/http://www.fixellsoftwareinnovations.com/ Cached copy of website]

''UPDATE:''  We're done with Static Meshes...the database has every mesh keyworded, and all the thumbnails are done.  The database will certainly need some refinement as people use it and make corrections/additions, but it's complete for default packages and it works.  

Thumbnails should be done for textures already, but finishing that database will take a bit longer. In the meantime the 3DBuzz forum thread still has all the latest info.

Steven Horton has been kind enough to do a lot of work on the Static Mesh thumbnails, including hosting them on his website. If you want to make your own, read through the 3DBuzz thread linked above where he describes the process and get the map he uses as a &quot;photo studio&quot; of sorts.

There's a lot more to this application than what I have posted, and the instructions inside the app are better than what I have said here, but you should get the idea.  odinfix will (I hope) be able to explain it better.

==Discussion==

'''Tarquin:''' what sort of space do you need, X-O? Plain text data is fine, and you could use the [[Legacy:Static Mesh Package|Static Mesh Package]] page as a starting point. Thumbnails for each mesh is a little more problematic: our image uploader is slow and we're not really suited to image-intensive stuff. But you can embed external images :)

'''X-0:''' I believe that the problem of holding all the necessary files is being taken care of, but this page should be useful in either letting people know the project exists or showing them what it is and does.

'''X-0:''' Hey!  This is pretty easy!  Thanks Tarquin ;)

'''Tarquin:''' np :D

'''Olorin:''' ehr.. any way to open up a texture package and read its content at run-time? I'm thinking, instead of using this big database (which needs to be maintained), to have a similar app that you can kick off giving it a folder name (or a single texture package name). The app would open the texture package (or packages in the folder) and dynamically create a snapshot and the other info for you. Is this doeabl or is the formate of the texture packages proprietary or too hard to make sense of?

'''Foxpaw:''' Most of that is theoretically doable, but the keyword information would not be stored in actual Unreal packages, so you would still need a database.

'''EricBlade:''' Not sure how old this page is, but I'd love to see something like this.. Particularly with the ability to at least create a basic index of other USX/UTX packages, as I'm not using UTxxxx ..  but it would still be very handy! 

'''Tgusagalpa:''' This whole thing is dead because the download files don't go any where.

'''MythOpus:''' Nope, this page is still 'alive'... or at least the downloads are.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5241</id>
      <timestamp>2006-10-06T01:06:00Z</timestamp>
      <contributor>
        <ip>Tgusagalpa</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Current project to create a browser for [[Legacy:Static Mesh|static mesh]]es.

See also the list of [[Legacy:Static Mesh Package|Static Mesh Package]]s and the [[Legacy:Static Mesh Package/Index|Static Mesh Package/Index]].

This is an app for all the people that ask &quot;How can I find a mesh or texture quickly?&quot; or &quot;Is there some kind of list of static meshes/textures I can look through?&quot;

We all know that loading packages in UED's browser just to see what is in them really sucks.  Really really sucks.  It does not help matters when you realize that most packages (especially static meshes) are named according to their author, not necessarily their contents.  odinfix is well on the way to solving this problem.

==odinfix's UED keyword browser project==

In a nutshell, this is a small application that is a database of all the default Texture and Static Mesh packages in Unreal Tournament 2004.  It has keywords assigned to each mesh or texture, and has a search function.  If you're looking for a static mesh to use as a pipe, you type in 'pipe' in the keyword browser, and it lists all the mesh names (and locations) that fit that description.  You can add more than one keyword to further filter the results ('pipe' would return a LOT of meshes).  If you're looking for a &quot;rusty&quot; texture, you do the same thing and see what the browser returns, etc.  It supports thumbnail images, so you can scroll through and see a snapshot of the mesh.

Merely having thumbnails of each static mesh or texture puts this light years ahead of loading packages in UED just to look through them.  With the ability to search by keyword, imagine how much time this saves.  In my own experience, I don't even bother getting very specific with my searches...if I'm looking for a ramp, I'll put that into the browser and scroll through the thumbnails to find something I'd like to take a closer look at in UnrealEd.  In the spirit of creativity, those working on keywording the meshes are trying to offer suggested uses for a mesh, beyond what the meshes were originally made for.  The object is to think of what a specific mesh '''might''' be used for, not just identifying it.  This might result in getting a lot of results for a particular keyword, but more is better in this case :P

[[Image:Legacy_ukb1.jpeg|center|UnrealEd Keyword Browser by odinfix/Fixell Software Innovations]]
*This is the main window.  You can either browse through the available keywords, or type the word you want to search for.
*# Like Ued's broswers, it begins to parse results as you type.
*# Double-click the keyword you want, or use the arrows, and a list will be shown of all meshes that fit that description.  You can add more keywords to narrow your search, or just click through the results.  This particular example (with an incomplete database) tells me that there are 5 different packages that have a barrel static mesh in them.
*# With &quot;Show Images&quot; selected, you'll see a thumbnail of the mesh, as well as where to find it.
*# Note in the above example, I have already selected the keyword &quot;barrel&quot;, and the keyword list is showing me the keywords also associated with meshes that have the &quot;barrel&quot; keyword attached...if I wanted to add &quot;corroded&quot; to the search, it's going to narrow the list to only meshes that have both keywords.

You can edit keywords yourself, or add packages and keywords for meshes that come with other maps.  You can share your own database and merge someone else's database into yours quite easily.  Even after there's a single databse posted, it is expected that users will modify  or edit it, refine keywords, etc. and then share with others.  It's a pretty powerful tool, and very flexible for the future.

see [http://sv1.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=68116 this thread on 3DBuzz] for the applications and more specific info.  

[http://download.beyondunreal.com/browse.php?dir=unwheel/misc/ Version 3.02 downloads]

[http://web.archive.org/web/20040927192705/http://www.fixellsoftwareinnovations.com/ Cached copy of website]

''UPDATE:''  We're done with Static Meshes...the database has every mesh keyworded, and all the thumbnails are done.  The database will certainly need some refinement as people use it and make corrections/additions, but it's complete for default packages and it works.  

Thumbnails should be done for textures already, but finishing that database will take a bit longer. In the meantime the 3DBuzz forum thread still has all the latest info.

Steven Horton has been kind enough to do a lot of work on the Static Mesh thumbnails, including hosting them on his website. If you want to make your own, read through the 3DBuzz thread linked above where he describes the process and get the map he uses as a &quot;photo studio&quot; of sorts.

There's a lot more to this application than what I have posted, and the instructions inside the app are better than what I have said here, but you should get the idea.  odinfix will (I hope) be able to explain it better.

==Discussion==

'''Tarquin:''' what sort of space do you need, X-O? Plain text data is fine, and you could use the [[Legacy:Static Mesh Package|Static Mesh Package]] page as a starting point. Thumbnails for each mesh is a little more problematic: our image uploader is slow and we're not really suited to image-intensive stuff. But you can embed external images :)

'''X-0:''' I believe that the problem of holding all the necessary files is being taken care of, but this page should be useful in either letting people know the project exists or showing them what it is and does.

'''X-0:''' Hey!  This is pretty easy!  Thanks Tarquin ;)

'''Tarquin:''' np :D

'''Olorin:''' ehr.. any way to open up a texture package and read its content at run-time? I'm thinking, instead of using this big database (which needs to be maintained), to have a similar app that you can kick off giving it a folder name (or a single texture package name). The app would open the texture package (or packages in the folder) and dynamically create a snapshot and the other info for you. Is this doeabl or is the formate of the texture packages proprietary or too hard to make sense of?

'''Foxpaw:''' Most of that is theoretically doable, but the keyword information would not be stored in actual Unreal packages, so you would still need a database.

'''EricBlade:''' Not sure how old this page is, but I'd love to see something like this.. Particularly with the ability to at least create a basic index of other USX/UTX packages, as I'm not using UTxxxx ..  but it would still be very handy! 

'''Tgusagalpa:''' This whole thing is dead because the download files don't go any where.  [[:Category:Legacy Delete Me]] ?

[[Category:Legacy Delete Me|{{PAGENAME}}]]
[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshActor</title>
    <id>1826</id>
    <revision>
      <id>4481</id>
      <timestamp>2003-05-27T10:08:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; MeshActor (Package: UMenu)}}

An Actor used by the UWindow system to display meshes like in the weapon priority window.

==Properties==
; [[Legacy:UMenuPlayerMeshClient|UMenuPlayerMeshClient]] NotifyClient : A special subclass of [[Legacy:UMenuDialogClientWindow|UMenuDialogClientWindow]] that receives an &lt;tt&gt;AnimEnd&lt;/tt&gt; call from this actor.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4482</id>
      <timestamp>2002-04-26T15:16:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; MeshActor}}

An Actor used by the UWindow system to display meshes like in the weapon priority window.

==Properties ==
; [[Legacy:UMenuPlayerMeshClient|UMenuPlayerMeshClient]] NotifyClient : A special subclass of [[Legacy:UMenuDialogClientWindow|UMenuDialogClientWindow]] that receives an &lt;tt&gt;AnimEnd&lt;/tt&gt; call from this actor.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshAnimation</title>
    <id>28359</id>
    <revision>
      <id>40026</id>
      <timestamp>2009-11-15T07:50:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshEffect</title>
    <id>28460</id>
    <revision>
      <id>40157</id>
      <timestamp>2009-11-17T10:10:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshEmitter</title>
    <id>28268</id>
    <revision>
      <id>39925</id>
      <timestamp>2009-11-14T18:04:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshInstance</title>
    <id>28484</id>
    <revision>
      <id>40185</id>
      <timestamp>2009-11-17T10:56:08Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshMaker</title>
    <id>1780</id>
    <revision>
      <id>4370</id>
      <timestamp>2005-11-02T18:02:12Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''MeshMaker''' is a Windows-based tool that creates skinned decorations out of UnrealEd prefabs in a matter of seconds.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FAQ]] &amp;ndash; Go here, ask your question, and check back for the answer.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]] &amp;ndash; New features for the next version (including suggestions).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Decoration Subtree]] &amp;ndash; How to make all decorations from a custom package appear in a subtree in the [[Legacy:Actor Browser|actor browser]].

'''You don't need MeshMaker for UT2003 or '04''' &amp;ndash; it's built-in functionality of UnrealEd 3.0.  To create a [[Legacy:Static Mesh|static mesh]] from a brush/prefab in UnrealEd 3.0, simply select ''Create from Selection'' in the static mesh browser's ''Edit'' menu.

==Web Links ==

* [http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage], with news, documentation and a quick walkthrough.
* [http://forums.beyondunreal.com/showthread.php?threadid=93908 BeyondUnreal Forums, brainstorming thread] where all started.
* [http://forums.beyondunreal.com/showthread.php?threadid=95780 BeyondUnreal Forums, release thread] where the first release was discussed.

Created by [[Legacy:Mychaeel|Mychaeel]].

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4371</id>
      <timestamp>2003-05-24T16:41:16Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''MeshMaker''' is a Windows-based tool that creates skinned decorations out of UnrealEd prefabs in a matter of seconds.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FAQ]] &amp;ndash; Go here, ask your question, and check back for the answer.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]] &amp;ndash; New features for the next version (including suggestions).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Decoration Subtree]] &amp;ndash; How to make all decorations from a custom package appear in a subtree in the [[Legacy:Actor Browser|actor browser]].

'''You don't need MeshMaker for UT2003''' &amp;ndash; it's built-in functionality of UnrealEd 3.0.  To create a [[Legacy:Static Mesh|static mesh]] from a brush/prefab in UnrealEd 3.0, simply select ''Create from Selection'' in the static mesh browser's ''Edit'' menu.

==Web Links ==

* [http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage], with news, documentation and a quick walkthrough.
* [http://forums.beyondunreal.com/showthread.php?threadid=93908 BeyondUnreal Forums, brainstorming thread] where all started.
* [http://forums.beyondunreal.com/showthread.php?threadid=95780 BeyondUnreal Forums, release thread] where the first release was discussed.

Created by [[Legacy:Mychaeel|Mychaeel]].

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34065</id>
      <timestamp>2009-02-23T13:44:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Web Links */ fixed homepage link via wayback machine</comment>
      <text xml:space="preserve">'''MeshMaker''' is a Windows-based tool that creates skinned decorations out of UnrealEd prefabs in a matter of seconds.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FAQ]] &amp;ndash; Go here, ask your question, and check back for the answer.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]] &amp;ndash; New features for the next version (including suggestions).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Decoration Subtree]] &amp;ndash; How to make all decorations from a custom package appear in a subtree in the [[Legacy:Actor Browser|actor browser]].

'''You don't need MeshMaker for UT2003 or '04''' &amp;ndash; it's built-in functionality of UnrealEd 3.0.  To create a [[Legacy:Static Mesh|static mesh]] from a brush/prefab in UnrealEd 3.0, simply select ''Create from Selection'' in the static mesh browser's ''Edit'' menu.

==Web Links ==

* [http://web.archive.org/web/20060718012116/http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage], with news, documentation and a quick walkthrough.
* [http://forums.beyondunreal.com/showthread.php?threadid=93908 BeyondUnreal Forums, brainstorming thread] where all started.
* [http://forums.beyondunreal.com/showthread.php?threadid=95780 BeyondUnreal Forums, release thread] where the first release was discussed.

Created by [[Legacy:Mychaeel|Mychaeel]].

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34516</id>
      <timestamp>2009-06-28T21:15:18Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Web Links */ added working download links</comment>
      <text xml:space="preserve">'''MeshMaker''' is a Windows-based tool that creates skinned decorations out of UnrealEd prefabs in a matter of seconds.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FAQ]] &amp;ndash; Go here, ask your question, and check back for the answer.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]] &amp;ndash; New features for the next version (including suggestions).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creating A Decoration Subtree]] &amp;ndash; How to make all decorations from a custom package appear in a subtree in the [[Legacy:Actor Browser|actor browser]].

'''You don't need MeshMaker for UT2003 or '04''' &amp;ndash; it's built-in functionality of UnrealEd 3.0.  To create a [[Legacy:Static Mesh|static mesh]] from a brush/prefab in UnrealEd 3.0, simply select ''Create from Selection'' in the static mesh browser's ''Edit'' menu.

==Web Links ==

* [http://web.archive.org/web/20060718012116/http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage], with news, documentation and a quick walkthrough.
* [http://forums.beyondunreal.com/showthread.php?threadid=93908 BeyondUnreal Forums, brainstorming thread] where all started.
* [http://forums.beyondunreal.com/showthread.php?threadid=95780 BeyondUnreal Forums, release thread] where the first release was discussed.
* [http://mb.link-m.de/download/MeshMaker-umod.zip Download (UMOD)] 502 kB
* [http://mb.link-m.de/download/MeshMaker-zip.zip Download (ZIP)] 505 kB

Created by [[Legacy:Mychaeel|Mychaeel]].

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshMaker/Creating A Decoration Subtree</title>
    <id>1779</id>
    <revision>
      <id>4367</id>
      <timestamp>2002-07-21T15:38:44Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Not only can you bundle multiple [[Legacy:Decoration|decoration]]s created with [[Legacy:MeshMaker|MeshMaker]] in a single .u file, with a bit of manual help you can also have them appear in their own subtree in the class hierarchy displayed in the [[Legacy:Actor Browser|actor browser]] (like the decorations listed below [[Legacy:UT_Decoration|UT_Decoration]]).

For the purpose of this... tutorial, I'll assume that your decoration package file is called MychDecoPack.u and that you want your decorations to appear in a subtree called &lt;code&gt;MychDeco&lt;/code&gt;.  (Just substitute those terms where they occur with your own.)

# Browse to your [[Legacy:Engine Directory Structure|UnrealTournament directory]].  You'll find a directory called &quot;MychDecoPack&quot; there.  In that directory, there's a subdirectory called &quot;Classes&quot;.  Open it.  This &quot;Classes&quot; directory contains a bunch of .uc files; each of those files corresponds to a decoration you converted (you'll recognize the file names as the names you gave your individual decorations).

# Create a new file in that directory, called MychDeco.uc, that contains the following code:&lt;uscript&gt;
class MychDeco extends Decoration;
&lt;/uscript&gt;

# Open '''every single''' of the other .uc files and substitute the expression &quot;&lt;code&gt;extends Decoration&lt;/code&gt;&quot; somewhere near the top of the file by &quot;&lt;code&gt;extends MychDeco&lt;/code&gt;&quot;.  The result could look somewhat like this:&lt;uscript&gt;
class MychCupOfCoffee extends MychDeco;
&lt;/uscript&gt;

Now what's left to do is to recompile the decoration package.  Don't worry, it's just as easy.

# Open [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] and find a couple of lines starting with the term &quot;EditPackages&quot;.  Add another line for your package (leave the .u off):&lt;pre&gt;  EditPackages=MychDecoPack&lt;/pre&gt;

# Go to your UnrealTournament\System directory and delete (yes, delete) the old MychDecoPack.u.

# Open the ''Run'' dialog box (from the ''Start'' menu) and click the ''Browse'' button.  Browse to your UnrealTournament\System directory and find a program called &quot;ucc&quot;.  Click ''Open''.

# Back in the ''Run'' dialog box (you didn't click ''OK'' there yet), append the string &quot;make&quot; to the command line (separated by a blank).  Now, click ''OK''.  A console window opens, and you'll see all of your EditPackages being processed, and your own decoration package too.

If everything works out, you'll find a new MychDecoPack.u in your UnrealTournament\System directory.

----

If it doesn't work our or if you have comments or questions, just hit the &quot;Edit text of this page&quot; link below and add your comments or questions at the bottom of this page.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4368</id>
      <timestamp>2002-07-10T13:03:43Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Not only can you bundle multiple [[Legacy:Decoration|decoration]]s created with [[Legacy:MeshMaker|MeshMaker]] in a single .u file, with a bit of manual help you can also have them appear in their own subtree in the class hierarchy displayed in the [[Legacy:Actor Browser|actor browser]] (like the decorations listed below [[Legacy:UT_Decoration|UT_Decoration]]).</text>
    </revision>
    <revision>
      <id>4369</id>
      <timestamp>2002-07-21T12:57:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>[[Category Tutorial]]</comment>
      <text xml:space="preserve">Not only can you bundle multiple [[Legacy:Decoration|decoration]]s created with [[Legacy:MeshMaker|MeshMaker]] in a single .u file, with a bit of manual help you can also have them appear in their own subtree in the class hierarchy displayed in the [[Legacy:Actor Browser|actor browser]] (like the decorations listed below [[Legacy:UT_Decoration|UT_Decoration]]).

For the purpose of this... tutorial, I'll assume that your decoration package file is called MychDecoPack.u and that you want your decorations to appear in a subtree called &lt;code&gt;MychDeco&lt;/code&gt;.  (Just substitute those terms where they occur with your own.)

# Browse to your [[Legacy:Engine Directory Structure|UnrealTournament directory]].  You'll find a directory called &quot;MychDecoPack&quot; there.  In that directory, there's a subdirectory called &quot;Classes&quot;.  Open it.  This &quot;Classes&quot; directory contains a bunch of .uc files; each of those files corresponds to a decoration you converted (you'll recognize the file names as the names you gave your individual decorations).

# Create a new file in that directory, called MychDeco.uc, that contains the following code:&lt;uscript&gt;
class MychDeco extends Decoration;
&lt;/uscript&gt;

# Open '''every single''' of the other .uc files and substitute the expression &quot;&lt;code&gt;extends Decoration&lt;/code&gt;&quot; somewhere near the top of the file by &quot;&lt;code&gt;extends MychDeco&lt;/code&gt;&quot;.  The result could look somewhat like this:&lt;uscript&gt;
class MychCupOfCoffee extends MychDeco;
&lt;/uscript&gt;

Now what's left to do is to recompile the decoration package.  Don't worry, it's just as easy.

# Open [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] and find a couple of lines starting with the term &quot;EditPackages&quot;.  Add another line for your package (leave the .u off):&lt;pre&gt;  EditPackages=MychDecoPack&lt;/pre&gt;

# Go to your UnrealTournament\System directory and delete (yes, delete) the old MychDecoPack.u.

# Open the ''Run'' dialog box (from the ''Start'' menu) and click the ''Browse'' button.  Browse to your UnrealTournament\System directory and find a program called &quot;ucc&quot;.  Click ''Open''.

# Back in the ''Run'' dialog box (you didn't click ''OK'' there yet), append the string &quot;make&quot; to the command line (separated by a blank).  Now, click ''OK''.  A console window opens, and you'll see all of your EditPackages being processed, and your own decoration package too.

If everything works out, you'll find a new MychDecoPack.u in your UnrealTournament\System directory.

----

If it doesn't work our or if you have comments or questions, just hit the &quot;Edit text of this page&quot; link below and add your comments or questions at the bottom of this page.
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshMaker/FAQ</title>
    <id>1777</id>
    <revision>
      <id>4362</id>
      <timestamp>2004-10-01T07:26:41Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>De spam</comment>
      <text xml:space="preserve">''Click &quot;Edit text of this page&quot; below to add your question to this page.  See also [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]].''

----

'''Tarquin:''' Suggestion: add a checkbox to set 'EdShouldSnap' property

'''Mychaeel:'''  Good thought.  Guess I'll add an &quot;Advanced Options&quot; dialog where LOD settings are available as well.

----

'''Tarquin:'''  I imported the deco into MyLevel with &quot;obj load file=projectorlight.u Package=MyLevel&quot; and I then had to set the multiskins myself. what did I do wrong?

'''Mychaeel:'''  Hmm... hmm.  Shouldn't happen.  Will think about that (and experiment a bit).

----

'''EntropicLqd:'''  Are you going to port it to UT2003 and Unreal 2?

'''Mychaeel:'''  With the new engine's enhanced abilities and the new &quot;hardware brushes&quot; I fear the demand for a tool like MeshMaker will rapidly decrease... but if there is any, I'll certainly consider it.

'''UsAaR33:'''  Hmm.. I'd imagine demand skyrocketing.  Hardware brushes must be used for movers after all.  And with Epic's lack of support for Gmax (AFAIK), this leaves those without $1000+ to buy software (and with morals+) in the dark.  Meshmaker could allow for easy creation of hardware brushes... just make something in ued... and it could become a hardware brush..

'''Mychaeel:'''  As far as I know that functionality is already built into the new UnrealEd; from what I heard it's possible to create hardware brushes directly from the [[Legacy:Red Builder Brush|red builder brush]] and also convert static meshes back to BSP.

----

'''UsAaR33:''' Just wondering... how hard was meshmaker to code? I imagine the skin mapping being the hardest...

'''Mychaeel:'''  The algorithm that &quot;corrects&quot; texture alignment when people try to do stuff that just won't work on meshes (tiling textures, for instance) was the trickiest part.  Designing the interface to be as easy to use as possible took most of the time though...

----

'''Torn_Agressor:''' might not be a directly related question to meshmaker, but if i wanted to get the meshes into MyLevel how would i do this?..

'''Mychaeel:''' That's described on the [http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage].

----

'''King Mango:'''When creating a prefab in UED2, I aligned all the textures as I wanted, rebuilt the level exported the brush and ran it through mesh maker. When I placed it in my level, the textures had all been unaligned. I tried several times to correct this to no avail...

'''Mychaeel:''' It is technically impossible to &quot;tile&quot; textures on a mesh whereas it's very possible (and common) to do that on brush surfaces.  When a texture is &quot;tiled&quot; on a brush surface, MeshMaker adjusts its alignment to meet those requirements.

Technical background:  Texture alignment on a ''brush surface'' is defined by a texel origin for one of its corners and two vectors which specify orientation and scale; texture alignment on a ''mesh triangle'' is defined by simply a set of texel coordinates for each of the triangle's three corners.

'''SabbathCat:''' Hi Mychaeel, I've been trying to line up a texture on a &quot;Cross&quot; shaped mesh, I'd made a custom skin, and tried several ways of aligning it, but it always goes off, despite the texture being aligned to the corner. Is it possible to play with the texture alignment from withi the .3d file, or in the t3d before compiling? The texture itself is big enough that it shouldn't tile, it's set-up so it should in theory align perfectly when &quot;aligned to floor&quot;. 

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4363</id>
      <timestamp>2004-10-01T06:29:24Z</timestamp>
      <contributor>
        <ip>61.149.159.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''Click &quot;Edit text of this page&quot; below to add your question to this page.  See also [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]].''

----

'''Tarquin:''' Suggestion: add a checkbox to set 'EdShouldSnap' property

'''Mychaeel:'''  Good thought.  Guess I'll add an &quot;Advanced Options&quot; dialog where LOD settings are available as well.

----

'''Tarquin:'''  I imported the deco into MyLevel with &quot;obj load file=projectorlight.u Package=MyLevel&quot; and I then had to set the multiskins myself. what did I do wrong?

'''Mychaeel:'''  Hmm... hmm.  Shouldn't happen.  Will think about that (and experiment a bit).

----

'''EntropicLqd:'''  Are you going to port it to UT2003 and Unreal 2?

'''Mychaeel:'''  With the new engine's enhanced abilities and the new &quot;hardware brushes&quot; I fear the demand for a tool like MeshMaker will rapidly decrease... but if there is any, I'll certainly consider it.

'''UsAaR33:'''  Hmm.. I'd imagine demand skyrocketing.  Hardware brushes must be used for movers after all.  And with Epic's lack of support for Gmax (AFAIK), this leaves those without $1000+ to buy software (and with morals+) in the dark.  Meshmaker could allow for easy creation of hardware brushes... just make something in ued... and it could become a hardware brush..

'''Mychaeel:'''  As far as I know that functionality is already built into the new UnrealEd; from what I heard it's possible to create hardware brushes directly from the [[Legacy:Red Builder Brush|red builder brush]] and also convert static meshes back to BSP.

----

'''UsAaR33:''' Just wondering... how hard was meshmaker to code? I imagine the skin mapping being the hardest...

'''Mychaeel:'''  The algorithm that &quot;corrects&quot; texture alignment when people try to do stuff that just won't work on meshes (tiling textures, for instance) was the trickiest part.  Designing the interface to be as easy to use as possible took most of the time though...

----

'''Torn_Agressor:''' might not be a directly related question to meshmaker, but if i wanted to get the meshes into MyLevel how would i do this?..

'''Mychaeel:''' That's described on the [http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage].

----

'''King Mango:'''When creating a prefab in UED2, I aligned all the textures as I wanted, rebuilt the level exported the brush and ran it through mesh maker. When I placed it in my level, the textures had all been unaligned. I tried several times to correct this to no avail...

'''Mychaeel:''' It is technically impossible to &quot;tile&quot; textures on a mesh whereas it's very possible (and common) to do that on brush surfaces.  When a texture is &quot;tiled&quot; on a brush surface, MeshMaker adjusts its alignment to meet those requirements.

Technical background:  Texture alignment on a ''brush surface'' is defined by a texel origin for one of its corners and two vectors which specify orientation and scale; texture alignment on a ''mesh triangle'' is defined by simply a set of texel coordinates for each of the triangle's three corners.

'''SabbathCat:''' Hi Mychaeel, I've been trying to line up a texture on a &quot;Cross&quot; shaped mesh, I'd made a custom skin, and tried several ways of aligning it, but it always goes off, despite the texture being aligned to the corner. Is it possible to play with the texture alignment from withi the .3d file, or in the t3d before compiling? The texture itself is big enough that it shouldn't tile, it's set-up so it should in theory align perfectly when &quot;aligned to floor&quot;. 

----

[[:Category:Legacy FAQ]]

[http://www.iqwork.com 数据恢复 硬盘恢复]

[http://www.butianshi.com 数据恢复 硬盘修复]

[http://www.witji.com raid数据恢复]

[http://www.datasoon.com 硬盘修复]

[http://www.shujuhuifu120.com 数据恢复 硬盘恢复]

[http://www.shujuhf.com 数据恢复 硬盘修复]

[http://www.huifusj.com raid数据恢复]
[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44336</id>
      <timestamp>2011-03-11T09:57:04Z</timestamp>
      <contributor>
        <ip>80.135.3.99</ip>
      </contributor>
      <text xml:space="preserve">''Click &quot;Edit text of this page&quot; below to add your question to this page.  See also [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]].''

----

'''Tarquin:''' Suggestion: add a checkbox to set 'EdShouldSnap' property

'''Mychaeel:'''  Good thought.  Guess I'll add an &quot;Advanced Options&quot; dialog where LOD settings are available as well.

----

'''Tarquin:'''  I imported the deco into MyLevel with &quot;obj load file=projectorlight.u Package=MyLevel&quot; and I then had to set the multiskins myself. what did I do wrong?

'''Mychaeel:'''  Hmm... hmm.  Shouldn't happen.  Will think about that (and experiment a bit).

----

'''EntropicLqd:'''  Are you going to port it to UT2003 and Unreal 2?

'''Mychaeel:'''  With the new engine's enhanced abilities and the new &quot;hardware brushes&quot; I fear the demand for a tool like MeshMaker will rapidly decrease... but if there is any, I'll certainly consider it.

'''UsAaR33:'''  Hmm.. I'd imagine demand skyrocketing.  Hardware brushes must be used for movers after all.  And with Epic's lack of support for Gmax (AFAIK), this leaves those without $1000+ to buy software (and with morals+) in the dark.  Meshmaker could allow for easy creation of hardware brushes... just make something in ued... and it could become a hardware brush..

'''Mychaeel:'''  As far as I know that functionality is already built into the new UnrealEd; from what I heard it's possible to create hardware brushes directly from the [[Legacy:Red Builder Brush|red builder brush]] and also convert static meshes back to BSP.

----

'''UsAaR33:''' Just wondering... how hard was meshmaker to code? I imagine the skin mapping being the hardest...

'''Mychaeel:'''  The algorithm that &quot;corrects&quot; texture alignment when people try to do stuff that just won't work on meshes (tiling textures, for instance) was the trickiest part.  Designing the interface to be as easy to use as possible took most of the time though...

----

'''Torn_Agressor:''' might not be a directly related question to meshmaker, but if i wanted to get the meshes into MyLevel how would i do this?..

'''Mychaeel:''' That's described on the [http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage].

----

'''King Mango:'''When creating a prefab in UED2, I aligned all the textures as I wanted, rebuilt the level exported the brush and ran it through mesh maker. When I placed it in my level, the textures had all been unaligned. I tried several times to correct this to no avail...

'''Mychaeel:''' It is technically impossible to &quot;tile&quot; textures on a mesh whereas it's very possible (and common) to do that on brush surfaces.  When a texture is &quot;tiled&quot; on a brush surface, MeshMaker adjusts its alignment to meet those requirements.

Technical background:  Texture alignment on a ''brush surface'' is defined by a texel origin for one of its corners and two vectors which specify orientation and scale; texture alignment on a ''mesh triangle'' is defined by simply a set of texel coordinates for each of the triangle's three corners.

'''SabbathCat:''' Hi Mychaeel, I've been trying to line up a texture on a &quot;Cross&quot; shaped mesh, I'd made a custom skin, and tried several ways of aligning it, but it always goes off, despite the texture being aligned to the corner. Is it possible to play with the texture alignment from withi the .3d file, or in the t3d before compiling? The texture itself is big enough that it shouldn't tile, it's set-up so it should in theory align perfectly when &quot;aligned to floor&quot;. 

---

'''papercoffee:''' I didn't use MM till now... but...
First- is this wiki section still active?
Second- how do you manage the collision radius of a mesh build with the mesh-maker??

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44337</id>
      <timestamp>2011-03-11T19:59:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">''Click &quot;Edit text of this page&quot; below to add your question to this page.  See also [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Update]].''

----

'''Tarquin:''' Suggestion: add a checkbox to set 'EdShouldSnap' property

'''Mychaeel:'''  Good thought.  Guess I'll add an &quot;Advanced Options&quot; dialog where LOD settings are available as well.

----

'''Tarquin:'''  I imported the deco into MyLevel with &quot;obj load file=projectorlight.u Package=MyLevel&quot; and I then had to set the multiskins myself. what did I do wrong?

'''Mychaeel:'''  Hmm... hmm.  Shouldn't happen.  Will think about that (and experiment a bit).

----

'''EntropicLqd:'''  Are you going to port it to UT2003 and Unreal 2?

'''Mychaeel:'''  With the new engine's enhanced abilities and the new &quot;hardware brushes&quot; I fear the demand for a tool like MeshMaker will rapidly decrease... but if there is any, I'll certainly consider it.

'''UsAaR33:'''  Hmm.. I'd imagine demand skyrocketing.  Hardware brushes must be used for movers after all.  And with Epic's lack of support for Gmax (AFAIK), this leaves those without $1000+ to buy software (and with morals+) in the dark.  Meshmaker could allow for easy creation of hardware brushes... just make something in ued... and it could become a hardware brush..

'''Mychaeel:'''  As far as I know that functionality is already built into the new UnrealEd; from what I heard it's possible to create hardware brushes directly from the [[Legacy:Red Builder Brush|red builder brush]] and also convert static meshes back to BSP.

----

'''UsAaR33:''' Just wondering... how hard was meshmaker to code? I imagine the skin mapping being the hardest...

'''Mychaeel:'''  The algorithm that &quot;corrects&quot; texture alignment when people try to do stuff that just won't work on meshes (tiling textures, for instance) was the trickiest part.  Designing the interface to be as easy to use as possible took most of the time though...

----

'''Torn_Agressor:''' might not be a directly related question to meshmaker, but if i wanted to get the meshes into MyLevel how would i do this?..

'''Mychaeel:''' That's described on the [http://www.planetunreal.com/screen/meshmaker/ MeshMaker homepage].

----

'''King Mango:'''When creating a prefab in UED2, I aligned all the textures as I wanted, rebuilt the level exported the brush and ran it through mesh maker. When I placed it in my level, the textures had all been unaligned. I tried several times to correct this to no avail...

'''Mychaeel:''' It is technically impossible to &quot;tile&quot; textures on a mesh whereas it's very possible (and common) to do that on brush surfaces.  When a texture is &quot;tiled&quot; on a brush surface, MeshMaker adjusts its alignment to meet those requirements.

Technical background:  Texture alignment on a ''brush surface'' is defined by a texel origin for one of its corners and two vectors which specify orientation and scale; texture alignment on a ''mesh triangle'' is defined by simply a set of texel coordinates for each of the triangle's three corners.

'''SabbathCat:''' Hi Mychaeel, I've been trying to line up a texture on a &quot;Cross&quot; shaped mesh, I'd made a custom skin, and tried several ways of aligning it, but it always goes off, despite the texture being aligned to the corner. Is it possible to play with the texture alignment from withi the .3d file, or in the t3d before compiling? The texture itself is big enough that it shouldn't tile, it's set-up so it should in theory align perfectly when &quot;aligned to floor&quot;. 

----

'''papercoffee:''' I didn't use MM till now... but...
First- is this wiki section still active?
Second- how do you manage the collision radius of a mesh build with the mesh-maker??

'''Wormbo:''' You don't. MeshMaker makes best effort to match the collision cylinder to the mesh. If you need a different collision size you need to modify it in the .uc file or later after placing the converted mesh.

[[Category:Legacy FAQ|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MeshMaker/Update</title>
    <id>1778</id>
    <revision>
      <id>4364</id>
      <timestamp>2004-10-03T17:59:41Z</timestamp>
      <contributor>
        <ip>Host217-44-152-152.range217-44.btcentralplus.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page lists new features for [[Legacy:MeshMaker|MeshMaker]] 1.1.  If you have suggestions, add them under the ''Suggestions'' topic &amp;ndash; I will review them and put them under any of the other topics as appropriate.

Also, if you have comments on anything on this page, please add them.  (Use the handy &lt;code&gt;~~~&lt;/code&gt; markup at the start of the paragraphs you add to include your user name.)

----

The ''Status'' shown at the end of each section is one of the following:

{|

|-
|'''Implemented'''
|Finished, pre-beta-tested and ready to go.
|-
|'''Unfinished'''
|Implementation has begun, but isn't finished yet.
|-
|'''Concept'''
|Thought through and deemed feasible and worthwhile; about to be implemented.
|-
|'''Idea'''
|Nice-to-have without any further thoughts about feasibility and implementation details.
|}

----

==Fixes ==

===Base Directory ===

MeshMaker doesn't take Unreal Tournament's base directory from the registry anymore '''if''' MeshMaker.exe is located in an Unreal engine game's directory structure.  That way users with multiple installations of Unreal Tournament aren't stuck with the one they installed last anymore.

If MeshMaker.exe is located somewhere else, it still looks in the registry for the correct paths.

'''Status:'''  Implemented

===Package Directories ===

MeshMaker 1.0 checked the ''Paths'' entries in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] to determine the directories used for texture search.  Some mods (total conversions like Tactical Ops and Infiltration) keep their texture packages (and other packages that are crossreferencing those texture packages) in completely different directories though which are specified in other .ini files (TacticalOps.ini, for instance).

To address that, MeshMaker now scans ''all'' .ini files in the System directory for ''Paths'' entries.

'''Status:'''  Implemented

===Texture Package Loading ===

While MeshMaker itself doesn't care about secondary packages referenced from texture packages (like footstep sounds in a separate .u file) when loading those packages, the compiler does and doesn't properly load those packages then &amp;ndash; the result are meshes that come out unskinned.

The new version (apart from taking more package directories into account, see above) displays a warning message if the compiler stumbled over such a problem.

'''Status:'''  Implemented

===Texture Realignment ===

MeshMaker makes an effort to automatically realign textures whose alignment on the original prefab collides with the entirely different notion of skinning a mesh (the former uses origin and direction on the texture, the latter works by specifying an UV coordinate per vertex).

In the implementation of that, a small bug sneaked in so that, in rare cases, the &quot;corrected&quot; alignment wasn't as close to the original as possible (which still can be pretty far away from the intended alignment).

'''Status:'''  Implemented

===Vertex Coordinate Resolution ===

A small bug made MeshMaker 1.0 not use the full resolution of the limited coordinate space meshes reside in.  In the new version, the vertex coordinate resolution is almost doubled.

'''Status:'''  Implemented

==Features ==

===Language Localization ===

MeshMaker's user interface is completely localizable now; similar in functionality to UnrealScript's [[Legacy:Localization|localization]] support, every string that appears in the user interface has a unique section and label and can be read from a language file.  (If no file is found, the strings default to English.)

Such a localization file is a plain-text file with the extension .lang and looks like this:

&lt;pre&gt;
  [FormMain]
  CheckBoxExportCollision=Kollisionshülle erstellen
  HeaderControlTextures(Texture)=Textur
  HeaderControlTextures(Package)=Paket
  HeaderControlTextures(Status)=Status
  LabelCaptionExportClass=Klasse:
  LabelCaptionExportPackage=Paket:
  LabelDescriptionDecoration1=Mit dieser Option wird MeshMaker automatisch ein Paket %s.u&lt;/pre&gt;

MeshMaker automatically switches to your operating system's interface language if a localization for that language is available; that behavior can be overridden by a registry entry.

'''Status:'''  Implemented &lt;br /&gt;'''Available languages:'''  English, German, French, Swedish, Dutch, (Spanish)

===Deus Ex Support ===

Deus Ex uses an updated version of Unreal's mesh format, employing higher-resolution vertex coordinates.  MeshMaker automatically determines whether it is run from a Deus Ex installation and converts meshes into that new format if appropriate.

'''Status:'''  Implemented

===Memorize Import Directory ===

For convenience, MeshMaker could memorize the directory of the last prefab imported (rather than using the Maps directory by default on each run).

'''Status:'''  Concept

===Embedded Textures ===

MeshMaker 1.0 always references textures in their original packages, unlike most other decorations which have those textures embedded in the .u files.  The new version will provide an option to embed those textures in the .u file; maybe even to specify external bitmap files (.pcx, .bmp, .tga).  (The latter was originally planned as part of .3ds support for MeshMaker, but I think I'm going to scratch that &amp;ndash; it's a lot of hassle for a little worth.)

'''Status:'''  Unfinished

===LOD Processing Control ===

Decorations generated by MeshMaker used to have LOD processing switched off entirely; the reason for that is that prefab vertices can't be properly welded in many cases, which confuses the LOD processing algorithm and makes it create undesired gaps and holes.

An ''Advanced Options'' dialog box in MeshMaker could provide a slider bar for that setting, leaving it to users to determine how much distortion their prefabs/meshes can handle.

'''Status:'''  Concept

===Balanced Poly Segmentation ===

[[Image:Legacy_meshmaker-polysegmentation.gif|right|]]

MeshMaker 1.0 splits polys in the way shown on the left side (the simplest possible approach), but since the way faces are arranged has an influence on how they're lit, the option on the right side might occasionally be desirable.

That could also be an option in that ''Advanced Options'' dialog.

'''Status:'''  Concept

===Grid Snapping ===

Something else for ''Advanced Options'' could be a checkbox controlling the bEdShouldSnap property of the finished decoration.

'''Status:'''  Concept

===Smart Resizing ===

MeshMaker has to convert the model from UnrealEd's world coordinate space to the rather coarsely discrete and pretty limited vertex coordinate space used for meshes.  That leads to aliasing/quantization errors which can be visible in the finished mesh as small gaps between adjacent faces.

The feature I dubbed ''Smart Resizing'' would try to determine the optimal resizing factor to keep such quantization errors at a minimum.  (Uh-huh, I know.)

'''Status:'''  Idea

===Smart Vertex Welding ===

As mentioned above, prefab vertices frequently can't be properly welded as it would be needed for effective LOD processing or to prevent aliasing effects from showing up as gaps between faces.  ''Smart Vertex Welding'' would create additional mesh vertices (and, thus, additional faces) to be able to properly connect two faces if one of the first face's vertices lies on the second face's edge.  (One more for ''Advanced Options''.)

'''Status:'''  Idea

==Suggestions ==

Click &quot;Edit text of this page&quot; (below) and add suggestions here.

XepptizZ;When I made My first mesh the mesh's center wasn't what it was supposed to be.
        Even though the prefab had a center vertex( that little red point in the brush wich doesn't 
        connect with the other points) placed in the middle.

'''Torn_Agressor:''' same problem as Xepptizz, it would be really useful if the meshes kept the same pivot location as the brush you imported, particularly for objects where you need them to pivot from a very specific point,

but meshmaker always places the pivot exactly in the center of the mesh :o</text>
    </revision>
    <revision>
      <id>4365</id>
      <timestamp>2004-09-16T20:42:22Z</timestamp>
      <contributor>
        <ip>Dslam150-19-59-81.dyndsl.zonnet.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page lists new features for [[Legacy:MeshMaker|MeshMaker]] 1.1.  If you have suggestions, add them under the ''Suggestions'' topic &amp;ndash; I will review them and put them under any of the other topics as appropriate.

Also, if you have comments on anything on this page, please add them.  (Use the handy &lt;code&gt;~~~&lt;/code&gt; markup at the start of the paragraphs you add to include your user name.)

----

The ''Status'' shown at the end of each section is one of the following:

{|

|-
|'''Implemented'''
|Finished, pre-beta-tested and ready to go.
|-
|'''Unfinished'''
|Implementation has begun, but isn't finished yet.
|-
|'''Concept'''
|Thought through and deemed feasible and worthwhile; about to be implemented.
|-
|'''Idea'''
|Nice-to-have without any further thoughts about feasibility and implementation details.
|}

----

==Fixes ==

===Base Directory ===

MeshMaker doesn't take Unreal Tournament's base directory from the registry anymore '''if''' MeshMaker.exe is located in an Unreal engine game's directory structure.  That way users with multiple installations of Unreal Tournament aren't stuck with the one they installed last anymore.

If MeshMaker.exe is located somewhere else, it still looks in the registry for the correct paths.

'''Status:'''  Implemented

===Package Directories ===

MeshMaker 1.0 checked the ''Paths'' entries in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] to determine the directories used for texture search.  Some mods (total conversions like Tactical Ops and Infiltration) keep their texture packages (and other packages that are crossreferencing those texture packages) in completely different directories though which are specified in other .ini files (TacticalOps.ini, for instance).

To address that, MeshMaker now scans ''all'' .ini files in the System directory for ''Paths'' entries.

'''Status:'''  Implemented

===Texture Package Loading ===

While MeshMaker itself doesn't care about secondary packages referenced from texture packages (like footstep sounds in a separate .u file) when loading those packages, the compiler does and doesn't properly load those packages then &amp;ndash; the result are meshes that come out unskinned.

The new version (apart from taking more package directories into account, see above) displays a warning message if the compiler stumbled over such a problem.

'''Status:'''  Implemented

===Texture Realignment ===

MeshMaker makes an effort to automatically realign textures whose alignment on the original prefab collides with the entirely different notion of skinning a mesh (the former uses origin and direction on the texture, the latter works by specifying an UV coordinate per vertex).

In the implementation of that, a small bug sneaked in so that, in rare cases, the &quot;corrected&quot; alignment wasn't as close to the original as possible (which still can be pretty far away from the intended alignment).

'''Status:'''  Implemented

===Vertex Coordinate Resolution ===

A small bug made MeshMaker 1.0 not use the full resolution of the limited coordinate space meshes reside in.  In the new version, the vertex coordinate resolution is almost doubled.

'''Status:'''  Implemented

==Features ==

===Language Localization ===

MeshMaker's user interface is completely localizable now; similar in functionality to UnrealScript's [[Legacy:Localization|localization]] support, every string that appears in the user interface has a unique section and label and can be read from a language file.  (If no file is found, the strings default to English.)

Such a localization file is a plain-text file with the extension .lang and looks like this:

&lt;pre&gt;
  [FormMain]
  CheckBoxExportCollision=Kollisionshülle erstellen
  HeaderControlTextures(Texture)=Textur
  HeaderControlTextures(Package)=Paket
  HeaderControlTextures(Status)=Status
  LabelCaptionExportClass=Klasse:
  LabelCaptionExportPackage=Paket:
  LabelDescriptionDecoration1=Mit dieser Option wird MeshMaker automatisch ein Paket %s.u&lt;/pre&gt;

MeshMaker automatically switches to your operating system's interface language if a localization for that language is available; that behavior can be overridden by a registry entry.

'''Status:'''  Implemented &lt;br /&gt;'''Available languages:'''  English, German, French, Swedish, Dutch, (Spanish)

===Deus Ex Support ===

Deus Ex uses an updated version of Unreal's mesh format, employing higher-resolution vertex coordinates.  MeshMaker automatically determines whether it is run from a Deus Ex installation and converts meshes into that new format if appropriate.

'''Status:'''  Implemented

===Memorize Import Directory ===

For convenience, MeshMaker could memorize the directory of the last prefab imported (rather than using the Maps directory by default on each run).

'''Status:'''  Concept

===Embedded Textures ===

MeshMaker 1.0 always references textures in their original packages, unlike most other decorations which have those textures embedded in the .u files.  The new version will provide an option to embed those textures in the .u file; maybe even to specify external bitmap files (.pcx, .bmp, .tga).  (The latter was originally planned as part of .3ds support for MeshMaker, but I think I'm going to scratch that &amp;ndash; it's a lot of hassle for a little worth.)

'''Status:'''  Unfinished

===LOD Processing Control ===

Decorations generated by MeshMaker used to have LOD processing switched off entirely; the reason for that is that prefab vertices can't be properly welded in many cases, which confuses the LOD processing algorithm and makes it create undesired gaps and holes.

An ''Advanced Options'' dialog box in MeshMaker could provide a slider bar for that setting, leaving it to users to determine how much distortion their prefabs/meshes can handle.

'''Status:'''  Concept

===Balanced Poly Segmentation ===

[[Image:Legacy_meshmaker-polysegmentation.gif|right|]]

MeshMaker 1.0 splits polys in the way shown on the left side (the simplest possible approach), but since the way faces are arranged has an influence on how they're lit, the option on the right side might occasionally be desirable.

That could also be an option in that ''Advanced Options'' dialog.

'''Status:'''  Concept

===Grid Snapping ===

Something else for ''Advanced Options'' could be a checkbox controlling the bEdShouldSnap property of the finished decoration.

'''Status:'''  Concept

===Smart Resizing ===

MeshMaker has to convert the model from UnrealEd's world coordinate space to the rather coarsely discrete and pretty limited vertex coordinate space used for meshes.  That leads to aliasing/quantization errors which can be visible in the finished mesh as small gaps between adjacent faces.

The feature I dubbed ''Smart Resizing'' would try to determine the optimal resizing factor to keep such quantization errors at a minimum.  (Uh-huh, I know.)

'''Status:'''  Idea

===Smart Vertex Welding ===

As mentioned above, prefab vertices frequently can't be properly welded as it would be needed for effective LOD processing or to prevent aliasing effects from showing up as gaps between faces.  ''Smart Vertex Welding'' would create additional mesh vertices (and, thus, additional faces) to be able to properly connect two faces if one of the first face's vertices lies on the second face's edge.  (One more for ''Advanced Options''.)

'''Status:'''  Idea

==Suggestions ==

Click &quot;Edit text of this page&quot; (below) and add suggestions here.

XepptizZ;When I made My first mesh the mesh's center wasn't what it was supposed to be.
        Even though the prefab had a center vertex( that little red point in the brush wich doesn't 
        connect with the other points) placed in the middle.</text>
    </revision>
    <revision>
      <id>4366</id>
      <timestamp>2004-10-01T20:08:05Z</timestamp>
      <contributor>
        <ip>Host217-44-152-152.range217-44.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page lists new features for [[Legacy:MeshMaker|MeshMaker]] 1.1.  If you have suggestions, add them under the ''Suggestions'' topic &amp;ndash; I will review them and put them under any of the other topics as appropriate.

Also, if you have comments on anything on this page, please add them.  (Use the handy &lt;code&gt;~~~&lt;/code&gt; markup at the start of the paragraphs you add to include your user name.)

----

The ''Status'' shown at the end of each section is one of the following:

{|

|-
|'''Implemented'''
|Finished, pre-beta-tested and ready to go.
|-
|'''Unfinished'''
|Implementation has begun, but isn't finished yet.
|-
|'''Concept'''
|Thought through and deemed feasible and worthwhile; about to be implemented.
|-
|'''Idea'''
|Nice-to-have without any further thoughts about feasibility and implementation details.
|}

----

==Fixes ==

===Base Directory ===

MeshMaker doesn't take Unreal Tournament's base directory from the registry anymore '''if''' MeshMaker.exe is located in an Unreal engine game's directory structure.  That way users with multiple installations of Unreal Tournament aren't stuck with the one they installed last anymore.

If MeshMaker.exe is located somewhere else, it still looks in the registry for the correct paths.

'''Status:'''  Implemented

===Package Directories ===

MeshMaker 1.0 checked the ''Paths'' entries in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] to determine the directories used for texture search.  Some mods (total conversions like Tactical Ops and Infiltration) keep their texture packages (and other packages that are crossreferencing those texture packages) in completely different directories though which are specified in other .ini files (TacticalOps.ini, for instance).

To address that, MeshMaker now scans ''all'' .ini files in the System directory for ''Paths'' entries.

'''Status:'''  Implemented

===Texture Package Loading ===

While MeshMaker itself doesn't care about secondary packages referenced from texture packages (like footstep sounds in a separate .u file) when loading those packages, the compiler does and doesn't properly load those packages then &amp;ndash; the result are meshes that come out unskinned.

The new version (apart from taking more package directories into account, see above) displays a warning message if the compiler stumbled over such a problem.

'''Status:'''  Implemented

===Texture Realignment ===

MeshMaker makes an effort to automatically realign textures whose alignment on the original prefab collides with the entirely different notion of skinning a mesh (the former uses origin and direction on the texture, the latter works by specifying an UV coordinate per vertex).

In the implementation of that, a small bug sneaked in so that, in rare cases, the &quot;corrected&quot; alignment wasn't as close to the original as possible (which still can be pretty far away from the intended alignment).

'''Status:'''  Implemented

===Vertex Coordinate Resolution ===

A small bug made MeshMaker 1.0 not use the full resolution of the limited coordinate space meshes reside in.  In the new version, the vertex coordinate resolution is almost doubled.

'''Status:'''  Implemented

==Features ==

===Language Localization ===

MeshMaker's user interface is completely localizable now; similar in functionality to UnrealScript's [[Legacy:Localization|localization]] support, every string that appears in the user interface has a unique section and label and can be read from a language file.  (If no file is found, the strings default to English.)

Such a localization file is a plain-text file with the extension .lang and looks like this:

&lt;pre&gt;
  [FormMain]
  CheckBoxExportCollision=Kollisionshülle erstellen
  HeaderControlTextures(Texture)=Textur
  HeaderControlTextures(Package)=Paket
  HeaderControlTextures(Status)=Status
  LabelCaptionExportClass=Klasse:
  LabelCaptionExportPackage=Paket:
  LabelDescriptionDecoration1=Mit dieser Option wird MeshMaker automatisch ein Paket %s.u&lt;/pre&gt;

MeshMaker automatically switches to your operating system's interface language if a localization for that language is available; that behavior can be overridden by a registry entry.

'''Status:'''  Implemented &lt;br /&gt;'''Available languages:'''  English, German, French, Swedish, Dutch, (Spanish)

===Deus Ex Support ===

Deus Ex uses an updated version of Unreal's mesh format, employing higher-resolution vertex coordinates.  MeshMaker automatically determines whether it is run from a Deus Ex installation and converts meshes into that new format if appropriate.

'''Status:'''  Implemented

===Memorize Import Directory ===

For convenience, MeshMaker could memorize the directory of the last prefab imported (rather than using the Maps directory by default on each run).

'''Status:'''  Concept

===Embedded Textures ===

MeshMaker 1.0 always references textures in their original packages, unlike most other decorations which have those textures embedded in the .u files.  The new version will provide an option to embed those textures in the .u file; maybe even to specify external bitmap files (.pcx, .bmp, .tga).  (The latter was originally planned as part of .3ds support for MeshMaker, but I think I'm going to scratch that &amp;ndash; it's a lot of hassle for a little worth.)

'''Status:'''  Unfinished

===LOD Processing Control ===

Decorations generated by MeshMaker used to have LOD processing switched off entirely; the reason for that is that prefab vertices can't be properly welded in many cases, which confuses the LOD processing algorithm and makes it create undesired gaps and holes.

An ''Advanced Options'' dialog box in MeshMaker could provide a slider bar for that setting, leaving it to users to determine how much distortion their prefabs/meshes can handle.

'''Status:'''  Concept

===Balanced Poly Segmentation ===

[[Image:Legacy_meshmaker-polysegmentation.gif|right|]]

MeshMaker 1.0 splits polys in the way shown on the left side (the simplest possible approach), but since the way faces are arranged has an influence on how they're lit, the option on the right side might occasionally be desirable.

That could also be an option in that ''Advanced Options'' dialog.

'''Status:'''  Concept

===Grid Snapping ===

Something else for ''Advanced Options'' could be a checkbox controlling the bEdShouldSnap property of the finished decoration.

'''Status:'''  Concept

===Smart Resizing ===

MeshMaker has to convert the model from UnrealEd's world coordinate space to the rather coarsely discrete and pretty limited vertex coordinate space used for meshes.  That leads to aliasing/quantization errors which can be visible in the finished mesh as small gaps between adjacent faces.

The feature I dubbed ''Smart Resizing'' would try to determine the optimal resizing factor to keep such quantization errors at a minimum.  (Uh-huh, I know.)

'''Status:'''  Idea

===Smart Vertex Welding ===

As mentioned above, prefab vertices frequently can't be properly welded as it would be needed for effective LOD processing or to prevent aliasing effects from showing up as gaps between faces.  ''Smart Vertex Welding'' would create additional mesh vertices (and, thus, additional faces) to be able to properly connect two faces if one of the first face's vertices lies on the second face's edge.  (One more for ''Advanced Options''.)

'''Status:'''  Idea

==Suggestions ==

Click &quot;Edit text of this page&quot; (below) and add suggestions here.

XepptizZ;When I made My first mesh the mesh's center wasn't what it was supposed to be.
        Even though the prefab had a center vertex( that little red point in the brush wich doesn't 
        connect with the other points) placed in the middle.

'''Torn_Agressor:''' same problem as Xepptizz, it would be really useful if the meshes kept the same pivot location as the brush you imported, particularly for objects where you need them to pivot from a very specific point,

but meshmaker always places the pivot exactly in the center of the mesh :o

also wondering, if you will ever release meshmaker source in the future? :P</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Message Interactions</title>
    <id>2044</id>
    <revision>
      <id>4983</id>
      <timestamp>2004-08-17T22:25:47Z</timestamp>
      <contributor>
        <ip>Toronto-HSE-ppp3855849.sympatico.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Message mutators pick up all messages that are displayed on screen: Who killed who, who picked up the flag, who took the ball in bombing run, etc. What it will NOT pick up on though, is when you use the SAY command or the TeamSay command.

I suppose a reporter bot could be made using one of these.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]] for this.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

A simple interaction:

&lt;uscript&gt;
Class MyInteraction extends Interaction;

Function Initialize()
{
    Log(&quot;Interaction Initialized&quot;);
}
&lt;/uscript&gt;

Dont forget to add

&lt;uscript&gt;
bActive=True
&lt;/uscript&gt;

Under defaultproperties (else this interaction wont do anything).

Now, how to pick up the messages? Add this function:

&lt;uscript&gt;
function Message( coerce string Msg, float MsgLife)
{
//Do stuff here
}
&lt;/uscript&gt;

&quot;Msg&quot;, as you could guess, is the message itself. MsgLife is how long it is diplayed on screen for.

That is all there is to it.

If you wanted to log everything that appeared on screen, your Interaction class would look like this:

&lt;uscript&gt;
Class MyInteraction extends Interaction;

Function Initialize()
{
    Log(&quot;Interaction Initialized&quot;);
}

function Message( coerce string Msg, float MsgLife)
{
    Log(&quot;Message:&quot; @ Msg);
}

DefaultProperties
{
bActive=True
}
&lt;/uscript&gt;

Thats it. :)

----

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''Daid:''' Is it possible to change the message with this code?

'''Will:''' Afraid not. All it allows you to do is see the messages, log them, whatever. It's a very basic function, and rather crap.

'''Tyoma:''' So message mutators are dead?

'''Wormbo:''' Yes, they are. The only class that is still allowed to modify messages is the BroadcastHandler which is spawned as a per-GameInfo actor.

'''Bob242:''' So if I wanted to make a reporter mutator for every type of message, including say and teamsay commands, it would have to be client-side, right?

'''Wormbo:''' No, in UT2004 you can subclass [[Legacy:BroadcastHandler|BroadcastHandler]] and register it. See your UnrealScript source files for details. (Someone should update the BroadcastHandler page with the UT2004 features...)

'''Bob242:''' Well, I'm working on writing a simple mutator for a game using the same Engine as UT2003.  So I would be kind of stuck in this regard, correct?  The best I can think of is to make a server side mutator that uses an interaction that reads all of the messages placed in the HUD...  Sorry, I'm kind of new to UScript.  Does this sound plausible?  I'm trying to read everything that goes into all clients' consoles.</text>
    </revision>
    <revision>
      <id>4984</id>
      <timestamp>2004-08-17T20:40:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Message mutators pick up all messages that are displayed on screen: Who killed who, who picked up the flag, who took the ball in bombing run, etc. What it will NOT pick up on though, is when you use the SAY command or the TeamSay command.

I suppose a reporter bot could be made using one of these.

First off, you need to make your mutator class that will create your interaction. See [[Legacy:Creating An Interaction From A Mutator|Creating An Interaction From A Mutator]] for this.

Done that? Good...

So thats the mutator part done. Next is the easy part! :)

A simple interaction:

&lt;uscript&gt;
Class MyInteraction extends Interaction;

Function Initialize()
{
    Log(&quot;Interaction Initialized&quot;);
}
&lt;/uscript&gt;

Dont forget to add

&lt;uscript&gt;
bActive=True
&lt;/uscript&gt;

Under defaultproperties (else this interaction wont do anything).

Now, how to pick up the messages? Add this function:

&lt;uscript&gt;
function Message( coerce string Msg, float MsgLife)
{
//Do stuff here
}
&lt;/uscript&gt;

&quot;Msg&quot;, as you could guess, is the message itself. MsgLife is how long it is diplayed on screen for.

That is all there is to it.

If you wanted to log everything that appeared on screen, your Interaction class would look like this:

&lt;uscript&gt;
Class MyInteraction extends Interaction;

Function Initialize()
{
    Log(&quot;Interaction Initialized&quot;);
}

function Message( coerce string Msg, float MsgLife)
{
    Log(&quot;Message:&quot; @ Msg);
}

DefaultProperties
{
bActive=True
}
&lt;/uscript&gt;

Thats it. :)

----

'''Will:''' Any problems understanding this? Anything I could do to make it clearer? If so: tell me, or do it yourself ;)

'''Daid:''' Is it possible to change the message with this code?

'''Will:''' Afraid not. All it allows you to do is see the messages, log them, whatever. It's a very basic function, and rather crap.

'''Tyoma:''' So message mutators are dead?

'''Wormbo:''' Yes, they are. The only class that is still allowed to modify messages is the BroadcastHandler which is spawned as a per-GameInfo actor.

'''Bob242:''' So if I wanted to make a reporter mutator for every type of message, including say and teamsay commands, it would have to be clent-side, right?

'''Wormbo:''' No, in UT2004 you can subclass [[Legacy:BroadcastHandler|BroadcastHandler]] and register it. See your UnrealScript source files for details. (Someone should update the BroadcastHandler page with the UT2004 features...)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Message Placeholder</title>
    <id>1781</id>
    <revision>
      <id>4372</id>
      <timestamp>2006-04-06T22:18:54Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">'''Message placeholders''' are special escape codes that insert data from the game into strings. The most common example of these is the death messages, that say, for example:
: ''The Great Zaganza got ripped into tiny pieces by Hortense.''

Of course, the [[Legacy:Unreal Engine|Unreal Engine]] doesn't store that string, since it doesn't know the players will be called &quot;The Great Zaganza&quot; and &quot;Hortense&quot;. It stores the string 
: ''%o got ripped into tiny pieces by %k''

The %o and %k are placeholders, and when the string is used, they will be replaced with meaningful content: in this case, the names of players.

==Death Messages in UT ==

These can be used in the DeathMessage variable in the [[Legacy:Weapon (UT)|Weapon (UT)]] class and as SpecialDamageString of the [[Legacy:GameInfo (UT)|GameInfo (UT)]] when using 'SpecialDamage' as damage type. 

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%k&lt;/code&gt;
|Killer's name
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%w&lt;/code&gt;
|Weapon the killer was holding while the other player died.
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%o&lt;/code&gt;
|Victim's name
|}

Each placeholder may only appear once.

===SpecialEvent ===

Custom death messages for [[Legacy:SpecialEvent|SpecialEvent]] only work in the '''KillInstigator''' [[Legacy:InitialState|InitialState]]. Set DamageType to 'SpecialDamage'.

Only &lt;code&gt;%o&lt;/code&gt; is parsed but &lt;code&gt;%k&lt;/code&gt; must be included for it to work, it will be removed with no replacement.

===ZoneInfo ===

Set DamageType to 'SpecialDamage'. &lt;code&gt;%k&lt;/code&gt; must be included, otherwise the death message will be blank in the game.

''They DO work without'' &lt;code&gt;%o&lt;/code&gt;'', but it doesn't look nice. -GeniusDex''

===Zones using death messages ===
* [[Legacy:ZoneInfo|ZoneInfo]]
** [[Legacy:PressureZone|PressureZone]]
** [[Legacy:LavaZone|LavaZone]]
** [[Legacy:SlimeZone|SlimeZone]]

''The noted types of ZoneInfos are only examples, as far as i know every ZoneInfo can be killing. -GeniusDex''

''Please add other triggers and zones that use death messages.''

===Related UT Topics ===
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
* [[Legacy:GameInfo (UT)|GameInfo (UT)]]
* [[Legacy:Taking Damage|Taking Damage]]

==Placeholders in UT2003 ==

In UT2003 only the placeholders %k (killer) and %o (victim) are used in death messages.

However, there are several placeholders usable in TeamSay messages. They only work in team games and only with the TeamSay, not the Say command. The placeholders are not case-sensitive.

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%A&lt;/code&gt;
|amount of adrenaline (&quot;xx Adrenaline&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%H&lt;/code&gt;
|amount of health (&quot;xx Health&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%L&lt;/code&gt;
|current location (near game objectives or &quot;pickups with inventory items on a pickup base&quot;, i.e. usually weapons, but not health, shield or double damage)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%S&lt;/code&gt;
|amount of shield (&quot;xx Shield&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%W&lt;/code&gt;
|currently selected weapon
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%%&lt;/code&gt;
|the &quot;%&quot; character (used e.g. as &quot;%%w&quot; to display &quot;%w&quot; instead of the weapon name)
|}

With the TTM 2003 mod there are also &quot;%P&quot; and &quot;%G&quot; (&quot;pickups&quot; and &quot;guns&quot;) to display nearby (non-)weapon pickups. Mods can add their own variables from their [[Legacy:Mutator|Mutator]], [[Legacy:GameInfo|GameInfo]] and/or [[Legacy:Controller|Controller]] classes via the &lt;code&gt;ParseChatPercVar()&lt;/code&gt; function.

===Related UT2003 Topics ===
* [[Legacy:Controller|Controller]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]</text>
    </revision>
    <revision>
      <id>4373</id>
      <timestamp>2006-04-06T21:06:57Z</timestamp>
      <contributor>
        <ip>Cdn-ce-wland-t2-03.westlandrdc.mi.michigan.comcast.net</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">'''Message placeholders''' are special escape codes that insert data from the game into strings. The most common example of these is the death messages, that say, for example:
: ''The Great Zaganza got ripped into tiny pieces by Hortense.''

Of course, the [[Legacy:Unreal Engine|Unreal Engine]] doesn't store that string, since it doesn't know the players will be called &quot;The Great Zaganza&quot; and &quot;Hortense&quot;. It stores the string 
: ''%o got ripped into tiny pieces by %k''

The %o and %k are placeholders, and when the string is used, they will be replaced with meaningful content: in this case, the names of players.

==Death Messages in UT ==

These can be used in the DeathMessage variable in the [[Legacy:Weapon (UT)|Weapon (UT)]] class and as SpecialDamageString of the [[Legacy:GameInfo (UT)|GameInfo (UT)]] when using 'SpecialDamage' as damage type. 

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%k&lt;/code&gt;
|Killer's name
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%w&lt;/code&gt;
|Weapon the killer was holding while the other player died.
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%o&lt;/code&gt;
|Victim's name
|}

Each placeholder may only appear once.

===SpecialEvent ===

Custom death messages for [[Legacy:SpecialEvent|SpecialEvent]] only work in the '''KillInstigator''' [[Legacy:InitialState|InitialState]]. Set DamageType to 'SpecialDamage'.

Only &lt;code&gt;%o&lt;/code&gt; is parsed but &lt;code&gt;%k&lt;/code&gt; must be included for it to work, it will be removed with no replacement.

===ZoneInfo ===

Set DamageType to 'SpecialDamage'. &lt;code&gt;%k&lt;/code&gt; must be included, otherwise the death message will be blank in the game.

''They DO work without'' &lt;code&gt;%o&lt;/code&gt;'', but it doesn't look nice. -GeniusDex''

===Zones using death messages ===
* [[Legacy:ZoneInfo|ZoneInfo]]
** [[Legacy:PressureZone|PressureZone]]
** [[Legacy:LavaZone|LavaZone]]
** [[Legacy:SlimeZone|SlimeZone]]

''The noted types of ZoneInfos are only examples, as far as i know every ZoneInfo can be killing. -GeniusDex''

''Please add other triggers and zones that use death messages.''

===Related UT Topics ===
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
* [[Legacy:GameInfo (UT)|GameInfo (UT)]]
* [[Legacy:Taking Damage|Taking Damage]]

==Placeholders in UT2003 ==

In UT2003 only the placeholders %k (killer) and %o (victim) are used in death messages.

However, there are several placeholders usable in TeamSay messages. They only work in team games and only with the TeamSay, not the Say command. The placeholders are not case-sensitive.

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%A&lt;/code&gt;
|amount of adrenaline (&quot;xx Adrenaline&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%H&lt;/code&gt;
|amount of health (&quot;xx Health&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%L&lt;/code&gt;
|current location (near game objectives or &quot;pickups with inventory items on a pickup base&quot;, i.e. usually weapons, but not health, shield or double damage)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%S&lt;/code&gt;
|amount of shield (&quot;xx Shield&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%W&lt;/code&gt;
|currently selected weapon
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%%&lt;/code&gt;
|the &quot;%&quot; character (used e.g. as &quot;%%w&quot; to display &quot;%w&quot; instead of the weapon name)
|}

With the TTM 2003 mod there are also &quot;%P&quot; and &quot;%G&quot; (&quot;pickups&quot; and &quot;guns&quot;) to display nearby (non-)weapon pickups. Mods can add their own variables from their [[Legacy:Mutator|Mutator]], [[Legacy:GameInfo|GameInfo]] and/or [[Legacy:Controller|Controller]] classes via the &lt;code&gt;ParseChatPercVar()&lt;/code&gt; function.

===Related UT2003 Topics ===
* [[Legacy:Controller|Controller]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
    <revision>
      <id>33570</id>
      <timestamp>2008-12-06T09:35:09Z</timestamp>
      <contributor>
        <username>OunoaCchia</username>
        <id>1722</id>
      </contributor>
      <comment>limonchirel</comment>
      <text xml:space="preserve">elcnarolmo
'''Message placeholders''' are special escape codes that insert data from the game into strings. The most common example of these is the death messages, that say, for example:
: ''The Great Zaganza got ripped into tiny pieces by Hortense.''

Of course, the [[Legacy:Unreal Engine|Unreal Engine]] doesn't store that string, since it doesn't know the players will be called &quot;The Great Zaganza&quot; and &quot;Hortense&quot;. It stores the string 
: ''%o got ripped into tiny pieces by %k''

The %o and %k are placeholders, and when the string is used, they will be replaced with meaningful content: in this case, the names of players.

==Death Messages in UT ==

These can be used in the DeathMessage variable in the [[Legacy:Weapon (UT)|Weapon (UT)]] class and as SpecialDamageString of the [[Legacy:GameInfo (UT)|GameInfo (UT)]] when using 'SpecialDamage' as damage type. 

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%k&lt;/code&gt;
|Killer's name
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%w&lt;/code&gt;
|Weapon the killer was holding while the other player died.
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%o&lt;/code&gt;
|Victim's name
|}

Each placeholder may only appear once.

===SpecialEvent ===

Custom death messages for [[Legacy:SpecialEvent|SpecialEvent]] only work in the '''KillInstigator''' [[Legacy:InitialState|InitialState]]. Set DamageType to 'SpecialDamage'.

Only &lt;code&gt;%o&lt;/code&gt; is parsed but &lt;code&gt;%k&lt;/code&gt; must be included for it to work, it will be removed with no replacement.

===ZoneInfo ===

Set DamageType to 'SpecialDamage'. &lt;code&gt;%k&lt;/code&gt; must be included, otherwise the death message will be blank in the game.

''They DO work without'' &lt;code&gt;%o&lt;/code&gt;'', but it doesn't look nice. -GeniusDex''

===Zones using death messages ===
* [[Legacy:ZoneInfo|ZoneInfo]]
** [[Legacy:PressureZone|PressureZone]]
** [[Legacy:LavaZone|LavaZone]]
** [[Legacy:SlimeZone|SlimeZone]]

''The noted types of ZoneInfos are only examples, as far as i know every ZoneInfo can be killing. -GeniusDex''

''Please add other triggers and zones that use death messages.''

===Related UT Topics ===
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
* [[Legacy:GameInfo (UT)|GameInfo (UT)]]
* [[Legacy:Taking Damage|Taking Damage]]

==Placeholders in UT2003 ==

In UT2003 only the placeholders %k (killer) and %o (victim) are used in death messages.

However, there are several placeholders usable in TeamSay messages. They only work in team games and only with the TeamSay, not the Say command. The placeholders are not case-sensitive.

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%A&lt;/code&gt;
|amount of adrenaline (&quot;xx Adrenaline&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%H&lt;/code&gt;
|amount of health (&quot;xx Health&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%L&lt;/code&gt;
|current location (near game objectives or &quot;pickups with inventory items on a pickup base&quot;, i.e. usually weapons, but not health, shield or double damage)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%S&lt;/code&gt;
|amount of shield (&quot;xx Shield&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%W&lt;/code&gt;
|currently selected weapon
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%%&lt;/code&gt;
|the &quot;%&quot; character (used e.g. as &quot;%%w&quot; to display &quot;%w&quot; instead of the weapon name)
|}

With the TTM 2003 mod there are also &quot;%P&quot; and &quot;%G&quot; (&quot;pickups&quot; and &quot;guns&quot;) to display nearby (non-)weapon pickups. Mods can add their own variables from their [[Legacy:Mutator|Mutator]], [[Legacy:GameInfo|GameInfo]] and/or [[Legacy:Controller|Controller]] classes via the &lt;code&gt;ParseChatPercVar()&lt;/code&gt; function.

===Related UT2003 Topics ===
* [[Legacy:Controller|Controller]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]</text>
    </revision>
    <revision>
      <id>33571</id>
      <timestamp>2008-12-06T09:35:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/OunoaCchia|OunoaCchia]] ([[User talk:OunoaCchia|Talk]]); changed back to last version by [[User:El Muerte|El Muerte]]</comment>
      <text xml:space="preserve">'''Message placeholders''' are special escape codes that insert data from the game into strings. The most common example of these is the death messages, that say, for example:
: ''The Great Zaganza got ripped into tiny pieces by Hortense.''

Of course, the [[Legacy:Unreal Engine|Unreal Engine]] doesn't store that string, since it doesn't know the players will be called &quot;The Great Zaganza&quot; and &quot;Hortense&quot;. It stores the string 
: ''%o got ripped into tiny pieces by %k''

The %o and %k are placeholders, and when the string is used, they will be replaced with meaningful content: in this case, the names of players.

==Death Messages in UT ==

These can be used in the DeathMessage variable in the [[Legacy:Weapon (UT)|Weapon (UT)]] class and as SpecialDamageString of the [[Legacy:GameInfo (UT)|GameInfo (UT)]] when using 'SpecialDamage' as damage type. 

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%k&lt;/code&gt;
|Killer's name
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%w&lt;/code&gt;
|Weapon the killer was holding while the other player died.
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%o&lt;/code&gt;
|Victim's name
|}

Each placeholder may only appear once.

===SpecialEvent ===

Custom death messages for [[Legacy:SpecialEvent|SpecialEvent]] only work in the '''KillInstigator''' [[Legacy:InitialState|InitialState]]. Set DamageType to 'SpecialDamage'.

Only &lt;code&gt;%o&lt;/code&gt; is parsed but &lt;code&gt;%k&lt;/code&gt; must be included for it to work, it will be removed with no replacement.

===ZoneInfo ===

Set DamageType to 'SpecialDamage'. &lt;code&gt;%k&lt;/code&gt; must be included, otherwise the death message will be blank in the game.

''They DO work without'' &lt;code&gt;%o&lt;/code&gt;'', but it doesn't look nice. -GeniusDex''

===Zones using death messages ===
* [[Legacy:ZoneInfo|ZoneInfo]]
** [[Legacy:PressureZone|PressureZone]]
** [[Legacy:LavaZone|LavaZone]]
** [[Legacy:SlimeZone|SlimeZone]]

''The noted types of ZoneInfos are only examples, as far as i know every ZoneInfo can be killing. -GeniusDex''

''Please add other triggers and zones that use death messages.''

===Related UT Topics ===
* [[Legacy:Weapon (UT)|Weapon (UT)]]
* [[Legacy:ScrollingMessageTexture|ScrollingMessageTexture]]
* [[Legacy:GameInfo (UT)|GameInfo (UT)]]
* [[Legacy:Taking Damage|Taking Damage]]

==Placeholders in UT2003 ==

In UT2003 only the placeholders %k (killer) and %o (victim) are used in death messages.

However, there are several placeholders usable in TeamSay messages. They only work in team games and only with the TeamSay, not the Say command. The placeholders are not case-sensitive.

{|

|-
|'''Placeholder'''
|'''Description''' 
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%A&lt;/code&gt;
|amount of adrenaline (&quot;xx Adrenaline&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%H&lt;/code&gt;
|amount of health (&quot;xx Health&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%L&lt;/code&gt;
|current location (near game objectives or &quot;pickups with inventory items on a pickup base&quot;, i.e. usually weapons, but not health, shield or double damage)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%S&lt;/code&gt;
|amount of shield (&quot;xx Shield&quot;)
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%W&lt;/code&gt;
|currently selected weapon
|-
| style=&quot;text-align: center&quot; |&lt;code&gt;%%&lt;/code&gt;
|the &quot;%&quot; character (used e.g. as &quot;%%w&quot; to display &quot;%w&quot; instead of the weapon name)
|}

With the TTM 2003 mod there are also &quot;%P&quot; and &quot;%G&quot; (&quot;pickups&quot; and &quot;guns&quot;) to display nearby (non-)weapon pickups. Mods can add their own variables from their [[Legacy:Mutator|Mutator]], [[Legacy:GameInfo|GameInfo]] and/or [[Legacy:Controller|Controller]] classes via the &lt;code&gt;ParseChatPercVar()&lt;/code&gt; function.

===Related UT2003 Topics ===
* [[Legacy:Controller|Controller]]
* [[Legacy:GameInfo|GameInfo]]
* [[Legacy:Mutator|Mutator]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MessageTextureClient</title>
    <id>2199</id>
    <revision>
      <id>5330</id>
      <timestamp>2006-03-14T22:07:03Z</timestamp>
      <contributor>
        <ip>Hazel.H</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:MessageTextureClient|MessageTextureClient]] (Package: GamePlay)}}

These are basically used for in-map scrolling messages. A good example are the scoreboards in DM-Morpheus in UT2004. This is done clientsidely and will thus require you to be in-game to see the effect.

The [[Legacy:ScriptedTexture|ScriptedTexture]] the messages are drawn on will contain the message in the specified color on black background. If you need a more complex look, try using a [[Legacy:Combiner|Combiner]], [[Legacy:Shader|Shader]], [[Legacy:FinalBlend|FinalBlend]] or any of the other texture [[Legacy:Modifier|modifier]]s or a combination of them.

==Properties==

===MessageTextureClient Group===
; bool bCaps : Display the message in ALL-CAPS.
; [[Legacy:Font|Font]] Font : The font used to draw the message.
; color FontColor : The message's display color.
; [[Legacy:ScriptedTexture|ScriptedTexture]] MessageTexture : The ScriptedTesture the message should be drawn on.
; string ScrollingMessage : The scrolling text of the message. You can use any of the following [[Legacy:Message Placeholder|message placeholder]]s:
{|

|-
|%lp
|leading player's name 
|-
|%lf
|leading player's score
|}

The placeholders &quot;%p&quot; and &quot;%h&quot; mentioned in a comment in the source code don't seem to actually work.

===Hidden Properties===
; string HerMessage (localized) : The pronoun &quot;his&quot;. This was intended to be used for the &quot;%h&quot; placeholder, but that isn't being recognized.
; string HisMessage (localized) : The pronoun &quot;her&quot;. This was intended to be used for the &quot;%h&quot; placeholder, but that isn't being recognized.
; string OldText : Display string from last texture update.

==Methods==

All functions in this class are [[Legacy:Simulated Function|simulated function]]s.

===Events Inherited From [[Legacy:Actor|Actor]]===
; PostNetBeginPlay( ) : Sets this actor as the message texture's Client.
; RenderTexture([[Legacy:ScriptedTexture|ScriptedTexture]] Tex) : Renders the scrolling message.
; Timer( ) : Updates the message text and checks whether the message texture needs to be updated as well.

===Other Functions===
; string Replace(string Text, string Match, string Replacement) : Replaces the first occurance of &lt;tt&gt;Match&lt;/tt&gt; in &lt;tt&gt;Text&lt;/tt&gt; with &lt;tt&gt;Replacement&lt;/tt&gt; and returns the new string.

==A good tutorial==

There is a Tutorial by Fuegerstef on the UT Maniac Board, which I found very useful when trying to put a scrolling text in my map [http://www.utmaniac.com/modules.php?name=Forums&amp;file=viewtopic&amp;t=185&amp;view=next#2012 http://www.utmaniac.com/modules.php?name=Forums&amp;file=viewtopic&amp;t=185&amp;view=next#2012]

==Related Topics==
*[[Legacy:Scrolling Scoreboard|Scrolling Scoreboard]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5331</id>
      <timestamp>2004-11-28T09:53:41Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>Addition of page. All known info added.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]]/[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:MessageTextureClient|MessageTextureClient]]}}

These are basically used for in-map Scrolling Messages; a Good example are the Scoreboards in DM-Morpheus in UT2004. This is apparently done Clientside and will thus require you to be in-game to see the Effect.

MessageTextureClient Properties are as follows:

''bCaps'' - Whether the Message is always in Capitals (True) or is not case specific. (False)

''Font'' - The Font to use.

''FontColor'' - The Color the Font will be. Can also specify an Alpha Channel.

''MessageTexture'' - The Texture to use for the scrolling Message IN EDITOR. This also determines on what Texture the Message will be tacked on to. This will be a Black Background in-game.

''ScrollingMessage'' - The Text of the Message. If you wish to use this as a Scoreboard, there's some Shortkey parameters you can specify here:

{|

|-
|%p
|Local Player's name; that is; the name of the person who is looking at the message. 
|-
|%h
|Gender of the Local Player; changes accordingly.
|-
|%lp
|Lead Player's name.
|-
|%lf
|Lead Player's Frags.
|}</text>
    </revision>
    <revision>
      <id>5332</id>
      <timestamp>2005-04-25T18:05:27Z</timestamp>
      <contributor>
        <ip>PD9EAB885.dip.t-dialin.net</ip>
      </contributor>
      <minor/>
      <comment>added link to tutorial /Dudenman</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:MessageTextureClient|MessageTextureClient]] (Package: GamePlay)}}

These are basically used for in-map scrolling messages. A good example are the scoreboards in DM-Morpheus in UT2004. This is done clientsidely and will thus require you to be in-game to see the effect.

The [[Legacy:ScriptedTexture|ScriptedTexture]] the messages are drawn on will contain the message in the specified color on black background. If you need a more complex look, try using a [[Legacy:Combiner|Combiner]], [[Legacy:Shader|Shader]], [[Legacy:FinalBlend|FinalBlend]] or any of the other texture [[Legacy:Modifier|modifier]]s or a combination of them.

==Properties==

===MessageTextureClient Group===
; bool bCaps : Display the message in ALL-CAPS.
; [[Legacy:Font|Font]] Font : The font used to draw the message.
; color FontColor : The message's display color.
; [[Legacy:ScriptedTexture|ScriptedTexture]] MessageTexture : The ScriptedTesture the message should be drawn on.
; string ScrollingMessage : The scrolling text of the message. You can use any of the following [[Legacy:Message Placeholder|message placeholder]]s:
{|

|-
|%lp
|leading player's name 
|-
|%lf
|leading player's score
|}

The placeholders &quot;%p&quot; and &quot;%h&quot; mentioned in a comment in the source code don't seem to actually work.

===Hidden Properties===
; string HerMessage (localized) : The pronoun &quot;his&quot;. This was intended to be used for the &quot;%h&quot; placeholder, but that isn't being recognized.
; string HisMessage (localized) : The pronoun &quot;her&quot;. This was intended to be used for the &quot;%h&quot; placeholder, but that isn't being recognized.
; string OldText : Display string from last texture update.

==Methods==

All functions in this class are [[Legacy:Simulated Function|simulated function]]s.

===Events Inherited From [[Legacy:Actor|Actor]]===
; PostNetBeginPlay( ) : Sets this actor as the message texture's Client.
; RenderTexture([[Legacy:ScriptedTexture|ScriptedTexture]] Tex) : Renders the scrolling message.
; Timer( ) : Updates the message text and checks whether the message texture needs to be updated as well.

===Other Functions===
; string Replace(string Text, string Match, string Replacement) : Replaces the first occurance of &lt;tt&gt;Match&lt;/tt&gt; in &lt;tt&gt;Text&lt;/tt&gt; with &lt;tt&gt;Replacement&lt;/tt&gt; and returns the new string.

==A good tutorial==

There is a Tutorial by Fuegerstef on the UT Maniac Board, which I found very useful when trying to put a scrolling text in my map [http://www.utmaniac.com/modules.php?name=Forums&amp;file=viewtopic&amp;t=185&amp;view=next#2012 http://www.utmaniac.com/modules.php?name=Forums&amp;file=viewtopic&amp;t=185&amp;view=next#2012]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MessagingSpectator</title>
    <id>28461</id>
    <revision>
      <id>40158</id>
      <timestamp>2009-11-17T10:10:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MessagingSpectator (UT)</title>
    <id>2061</id>
    <revision>
      <id>5021</id>
      <timestamp>2002-04-20T15:41:46Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:PlayerPawn|PlayerPawn]] &gt;&gt; [[Legacy:Spectator|Spectator]] &gt;&gt; MessagingSpectator}}

Spectator base class for game helper spectators which receive messages.

==Known subclasses ==
* [[Legacy:DemoRecSpectator|DemoRecSpectator]]
* [[Legacy:UTServerAdminSpectator (UT)|UTServerAdminSpectator (UT)]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MetaTopics</title>
    <id>1782</id>
    <revision>
      <id>4374</id>
      <timestamp>2007-01-23T01:14:34Z</timestamp>
      <contributor>
        <username>IceCreamYou</username>
        <id>6</id>
      </contributor>
      <comment>Revert</comment>
      <text xml:space="preserve">This is the header page for metatopics: topics about the project. If you are new to the project, you may want to read [[Legacy:New Contributors Quick Start|New Contributors Quick Start]].  
  

==News  ==
* [[Legacy:Home Page|Home Page]] &amp;ndash; announcements will be posted here  
* [[Legacy:Featured Pages|Featured Pages]] &amp;ndash; links to what's new and cool on the wiki  
  

==FAQs  ==
* [[Legacy:Using The Wiki|Using The Wiki]] &amp;ndash; information for newcomers  
* [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] &amp;ndash; general information on becoming a contributor  
* [[Legacy:Project FAQ|Project FAQ]] &amp;ndash; what is this place?  
* [[Legacy:Wiki FAQ|Wiki FAQ]] &amp;ndash; what's this &quot;wiki&quot; thing?  
  

==General  ==
* [[Legacy:Project Aims|Project Aims]] &amp;ndash; what are we doing here?  
* [[Legacy:Project Copyright|Project Copyright]]  
* [[Legacy:Wiki Protection|Wiki Protection]] &amp;ndash; what to do if you see someone has damaged the site  
* [[Legacy:TourBusStop|TourBusStop]] &amp;ndash; visit other Wiki sites  
* [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]  
* More on Wikis in various [[Legacy:External Links|external links]]  
  

==Content and Style   ==
* [[Legacy:Project Discussion|Project Discussion]]: where should this project be going?  
* [[Legacy:Wiki Public Relations|Wiki Public Relations]]  
* [[:Category:Legacy Wanted Pages]]  
  

Making the most of the wiki system &amp; general guidelines on editing &amp; creating pages:  
  
* [[Legacy:Guidelines On General Style|Guidelines on General Style]]  
* [[Legacy:Guidelines On Page Creation|Guidelines on Page Creation]]  
* [[Legacy:Guidelines On Page Links|Guidelines on Page Links]]  
* [[Legacy:Guidelines On Spelling|Guidelines on Spelling]]  
* [[Legacy:Guidelines On Technical Names|Guidelines on Technical Names]]  
* [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]]  
  

==Technical   ==
* [[Legacy:Wiki Markup|Wiki markup]]  
* [[Legacy:Wookee|Wookee]], our new Wiki markup parser.  
* [[Legacy:InterWiki|InterWiki]]: making quick links to other sites  
  
* [[Legacy:Wiki Development|Wiki Development]] &amp;ndash; Enhancements made to the perl script. Suggest &amp; discuss here too.  
* [[Legacy:Sandbox|Sandbox]] &amp;ndash; experiment with [[Legacy:Wiki Markup|Wiki markup]] on this page.  
* [[Legacy:Wiki System Commands|Wiki System Commands]] &amp;ndash; Special URL commands this wiki system understands.  
* [[Legacy:Wiki Site Stats|Wiki Site Stats]]  
* [[Legacy:Wiki Integration|Wiki Integration]] &amp;ndash; Browser search tabs, mIRC aliases, and more.  
* [[Legacy:Namespaces|Namespaces]]  
* [[Legacy:Offline Wiki|Offline Wiki]]  
* [[:Category:Legacy Text Mangling Alert]] &amp;ndash; Use this [[Legacy:WikiTag|WikiTag]] to alert a contributor whose web browser has accidentally damaged the text of a page they have edited.  
* [[Legacy:Wiki Admin|Wiki Admin]] - Last of all, a list of current admins and what it is they can do.  
  

==Customize   ==
* [[Legacy:Project Skins|Project Skins]] : How to set custom styles for the project and create your own.  
* [[Legacy:Wiki Sidebar|Wiki Sidebar]] : You can edit the wiki's sidebar!  
  

==Credits   ==
* [[:Category:Legacy Personal Page]] &amp;ndash; Create a personal page on the Unreal Wiki.  
  
  

==Contact   ==
* irc://irc.enterthegame.com/unrealwiki  
* [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum] &amp;ndash; This forum is for questions about the operation of the wiki, not for help with coding UnrealScript, mapping etc.   
  

--------- ---------
  

&gt; &quot;Wiki is like a huge jigsaw puzzle you work on with lots of friends: you take the box and tip everything out onto the floor you then root around and pick out pieces that look interesting. Over time people tend to find a spot they like and work there. When you put pieces together to make a part of the picture, you're creating small pockets of order which eventually can be joined up with other sections.&quot; &amp;ndash; Tarquin  
[[Category:Legacy Wanted Pages|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4375</id>
      <timestamp>2007-01-22T23:30:00Z</timestamp>
      <contributor>
        <ip>213.140.58.187</ip>
      </contributor>
      <comment>http://www.eulgaro.znfyp.com</comment>
      <text xml:space="preserve">edmcl yqxncawvd crolqvm nktlpuoge atrgdxh yztfv mcsejtx</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MiceMenGrav Mutator</title>
    <id>2221</id>
    <revision>
      <id>5376</id>
      <timestamp>2005-08-30T15:30:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">MiceMenGrav: A Mutator Tutorial for [[Legacy:UT2003|UT2003]].

* Coders: Wedge, [[Legacy:ThePelkus|ThePelkus]]
* Author: [[Legacy:ThePelkus|ThePelkus]]

This is a beginner level mutator development tutorial. The reader should have a basic knowledge of UnrealScript and should be able to make a basic mutator. This tutorial will help the reader understand potential uses for the following classes:
* [[Legacy:Mutator|Mutator]]
* [[Legacy:GameRules|GameRules]]
* [[Legacy:GUIPage|GUIPage]]
* [[Legacy:Inventory|Inventory]]

This mutator was implemented in UT2003. We have no development experience on other versions of Unreal, so we are not sure how specific this code is to UT2003.

==Conceptual Origins==

This mutator is the combination of two other mutators:

* ''MiceMen'', coded by Wedge, affects the player size based on the current configuration and the number of player kills.

* ''GravMod'', coded by ThePelkus, draws players together when they attack each other.

==Code Download==

While snippets of the source are shown below when relevant, the full source is available [http://kai.curtisforhire.com/downloads/micemengrav.zip here]. While there is no candy surprise, there are plenty of comments to keep you in the know.

==Making your own GameRules==

The [[Legacy:GameRules|GameRules]] class is easy to bend to your purposes. Like the [[Legacy:Mutator|Mutator]] objects, the [[Legacy:GameRules|GameRules]] objects live in a linked list. When the game needs to do something using the [[Legacy:GameRules|GameRules]] objects, it recurses through the list, giving each object a chance to do its thing. Technically speaking, the game is not responsible for making sure that every object in the list gets its turn at bat &amp;ndash; that's why you'll need lines like this one:

&lt;uscript&gt;
	/* Sampled from a ModifyPlayer definition in a custom mutator */
	// If there is another mutator in the chain
	if ( NextMutator != None )
		// Call this method in the next mutator; pass the same parameters
		NextMutator.ModifyPlayer(Other);
&lt;/uscript&gt;

Keeping this list structure in mind, all we need to do to have a little fun is derive our own rules and override some of the member functions!

===Placing your rules in your project===

Before you go overriding functions left and right, you want to incorporate your custom rules into your mutator so that you can check changes as you make them. As we just said, the hook for the engine is a chain of [[Legacy:GameRules|GameRules]] objects that lives somewhere in the system. Specifically, this chain is accessed as '''Level.Game.GameRulesModifiers''' from any [[Legacy:Actor|Actor]] class. How convenient, then, that [[Legacy:Mutator|Mutator]] is a subclass of [[Legacy:Actor|Actor]]!

To add your rules to the chain, just add the following code to PostBeginPlay() in the mutator that you derived from the [[Legacy:Mutator|Mutator]] class:

&lt;uscript&gt;
/* The following code assumes that you have a variable called myRules representing your rules; see MutMiceMen.uc for an example. */

	// Add the rules object to the list of GameRules in the game
	if ( Level.Game.GameRulesModifiers == None )
		Level.Game.GameRulesModifiers = myRules;
	else
		Level.Game.GameRulesModifiers.AddGameRules(myRules);
&lt;/uscript&gt;

===Building GravShot into our custom rules===

We derived a class called MiceMenRules from [[Legacy:GameRules|GameRules]] so that we could take advantage of some of the built-in functionality. In fact, almost all of the GravShot functionality lives in the NetDamage function of our custom rules.

As stated in the [[Legacy:GameRules|GameRules]] page, the NetDamage function &quot;''allows the GameRules to modify the damage (return value) and momentum. The OriginalDamage parameter should be passed to the next GameRules without any modifications.''&quot; Technically, GravShot doesn't alter either of these values. But NetDamage also takes as parameters the attacking pawn (InstigatedBy) and the target pawn (Injureed). Using these two pawns, our rules:

* Calculate the normalized vector from the victim to the instigator
: &lt;uscript&gt;
            // Get normalized vector from target to shooter
		    myVec = Normal(InstigatedBy.Location - Injured.Location);
&lt;/uscript&gt;

* Scale that vector
: &lt;uscript&gt;
		    // Set up multiplier vector
		    multVec.x = mutInstance.MovementMultiplier * 100;
		    multVec.y = mutInstance.MovementMultiplier * 100;
		    multVec.z = mutInstance.MovementMultiplier * 100;

		    // scale normalized vector; better way?
		    myVec = myVec * multVec;
&lt;/uscript&gt;

* Add the scaled vector to the victim's velocity.
: &lt;uscript&gt;
    		Injured.AddVelocity(myVec);
&lt;/uscript&gt;

Note once again that, after all of the GravShot code, the NetDamage member of the next [[Legacy:GameRules|GameRules]] object (if it exists) is called with the same parameters.

With this mutator active, the Injured pawn is moved towards the InstigatedBy pawn by some fixed amount. We'll see where this amount is set later when we look at the config menu. For practice you might try making the scaling factor situational e.g. scale based on distance or damage inflicted.

===Building MiceMen into our custom rules===

The MiceMen part of the mutator overrides the ScoreKill member of the rules. From the [[Legacy:GameRules|GameRules]] page, we know that the ScoreKill function &quot;''Augements the action taken when a player scores a kill. Not the score itself, but having to do with the Controllers involved in the Kill.''&quot;

The following two lines of code are all that we added to the ScoreKill method:

&lt;uscript&gt;
	if ( (Killer != None) &amp;&amp; (Killer.Pawn != None) )
		mutInstance.ChangePlayerSize(Killer.Pawn, mutInstance.GetScaleFor(Killer.Pawn));
&lt;/uscript&gt;

In this case, the Killer parameter (a [[Legacy:Controller|Controller]]) is used for its associated pawn. This pawn is passed to ChangePlayerSize(), a custom function in our mutator, along with a scaling factor. The scaling factor is calculated using GetScaleFor(), yet another custom function in our mutator, which also takes the pawn associated with Killer as a parameter. Again, after our code is called, ScoreKill is called in the next [[Legacy:GameRules|GameRules]] object.

Clearly a lot of the logic for MiceMen is included in the mutator, so let's take a look at that now!

==Making your own Mutator, briefly==

Presumably you already have the basics of making a mutator down, so we're just going to show you what we did with ours.

===PostBeginPlay()===

Our PostBeginPlay() code is pretty standard, going through the following steps:

# Call method in parent class
# Instantiate derived [[Legacy:GameRules|GameRules]]
# Initialize mutator instance in derived [[Legacy:GameRules|GameRules]]
# Add [[Legacy:GameRules|GameRules]] to GameRulesModifiers linked list

The only really odd step in there is Step 3. Because the mutator class contains functions and data needed for the MiceMen scaling in the rules, the rules contain an instance of the mutator. It may seem a little circular, but it works out fine.

===ModifyPlayer()===

The [[Legacy:Mutator|Mutator]] page lists the following description for the ModifyPlayer() function:

{{innerbox| This function can be used to update the player's inventory, speed, and other attributes. this function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

}}

We used ModifyPlayer() to do the following:
; Scale the player : Player scaling is handled in our custom functions called ''ChangePlayerSize()'' and ''GetScaleFor()''. The comments included in the code make the function self-explanatory. Unfortunately, we're uncertain as to whether certain functions are necessary.

; Create a custom [[Legacy:Inventory|Inventory]] item to scale the player's weapon : In order to make sure that the player's weapon model scales properly when weapons are switched, the player is given a WeaponScaler, a custom class we derived from [[Legacy:Inventory|Inventory]].

==Making your own Inventory items==

In earlier revisions of this mutator, the player weapon would not resize to match the player scale when the player switched weapons. Our solution: we derived a class from [[Legacy:Inventory|Inventory]] that would handle the resizing for us.

Our use of [[Legacy:Inventory|Inventory]]-related functionality was very minimal. The [[Legacy:Inventory|Inventory]] class has a method called ''OwnerEvent''. This method is called - surprise, surprise - whenever an event is triggered in owner. Since we wanted to change the rescale the player weapon whenever the weapon was changed, we watched for an event called 'ChangedWeapon':

&lt;uscript&gt;
function OwnerEvent(name EventName)
{
	if(EventName == 'ChangedWeapon')
	{
	 WeaponAttachment(Instigator.Weapon.ThirdPersonActor).SetCollisionSize(WeaponAttachment(Instigator.Weapon.ThirdPersonActor).Default.CollisionRadius * Instigator.DrawScale, WeaponAttachment(Instigator.Weapon.ThirdPersonActor).Default.CollisionHeight * Instigator.DrawScale);
	 WeaponAttachment(Instigator.Weapon.ThirdPersonActor).SetDrawScale(WeaponAttachment(Instigator.Weapon.ThirdPersonActor).Default.DrawScale * Instigator.DrawScale);
    }
}
&lt;/uscript&gt;

When this event occurred, the collision and draw size were rescaled based on the player's DrawScale. Note that these properties were only set on the third person mesh as indicated by the use of [[Legacy:WeaponAttachment|WeaponAttachment]] and ''ThirdPersonActor'' above. Also note that the player is referred to as ''Instigator'' since we need a [[Legacy:Pawn|Pawn]] to get a [[Legacy:Weapon|weapon]].

==Using GUIPage to configure your muator, super briefly!==

This section is unnecessary as the information that would go here is explained perfectly well over in [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]. In fact, most of the config code for this mutator was taken straight from the provided example code.

While [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] is fairly complete in terms of explaining the connection between GUI items and mutator variables, it's also a good idea to look through the documentation on other classes in the [[Legacy:GUI_Class_Hierarchy|GUI_Class_Hierarchy]] to make sure you don't fall victim to the old problems of giant checkboxes and the like.

==Problems==

It's true - we're not perfect, which makes this problematic as a tutorial. Help us make this tutorial more useful for beginners by helping us catch the following bugs:

===Levitating players===

Just run around for a little while and it won't take long until you'll see some of the other players flying around in midair. It's been hard for us to establish exactly when this happens, so even figuring that out would be very useful.

'''Tricadex''' - I think this is caused by problems with the collision box and crouching

===Funny skeletons===

Resizing players seems to do funny things to their corpses. We attempted to fix this problem using the ''BoneRefresh()'' method of the [[Legacy:Actor|Actor]] class, but it's not clear whether there are still funny effects.

Feel free to add comments to this page to help us fix these problems!

==About this mutator==

The MiceMenGrav mutator is a class project from the [http://www.bcc.ctc.edu Bellevue Community College] [http://gaming.bcc.ctc.edu gaming curriculum] in Bellevue, WA. This program is also responsible for the [[Legacy:VampireShoppers|VampireShoppers]] mutator.

----
 [[:Category:Legacy Tutorial]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5377</id>
      <timestamp>2004-11-23T00:23:32Z</timestamp>
      <contributor>
        <ip>Tricadex</ip>
      </contributor>
      <comment>*about the levitating players bug</comment>
      <text xml:space="preserve">===MiceMenGrav: A Mutator Tutorial (UT2003)===

Coders: Wedge, [[Legacy:ThePelkus|ThePelkus]]

Author: [[Legacy:ThePelkus|ThePelkus]]

This is a beginner level mutator development tutorial. The reader should have a basic knowledge of UnrealScript and should be able to make a basic mutator. This tutorial will help the reader understand potential uses for the following classes:
* [[Legacy:Mutator|Mutator]]
* [[Legacy:GameRules|GameRules]]
* [[Legacy:GUIPage|GUIPage]]
* [[Legacy:Inventory|Inventory]]

This mutator was implemented in UT2003. We have no development experience on other versions of Unreal, so we are not sure how specific this code is to UT2003.

===Conceptual Origins===

This mutator is the combination of two other mutators:

* ''MiceMen'', coded by Wedge, affects the player size based on the current configuration and the number of player kills.

* ''GravMod'', coded by ThePelkus, draws players together when they attack each other.

===Code Download===

While snippets of the source are shown below when relevant, the full source is available [http://kai.curtisforhire.com/downloads/micemengrav.zip here]. While there is no candy surprise, there are plenty of comments to keep you in the know.

===Making your own GameRules===

The [[Legacy:GameRules|GameRules]] class is easy to bend to your purposes. Like the [[Legacy:Mutator|Mutator]] objects, the [[Legacy:GameRules|GameRules]] objects live in a linked list. When the game needs to do something using the [[Legacy:GameRules|GameRules]] objects, it recurses through the list, giving each object a chance to do its thing. Technically speaking, the game is not responsible for making sure that every object in the list gets its turn at bat &amp;ndash; that's why you'll need lines like this one:

&lt;uscript&gt;
	/* Sampled from a ModifyPlayer definition in a custom mutator */
	// If there is another mutator in the chain
	if ( NextMutator != None )
		// Call this method in the next mutator; pass the same parameters
		NextMutator.ModifyPlayer(Other);
&lt;/uscript&gt;

Keeping this list structure in mind, all we need to do to have a little fun is derive our own rules and override some of the member functions!

====Placing your rules in your project====

Before you go overriding functions left and right, you want to incorporate your custom rules into your mutator so that you can check changes as you make them. As we just said, the hook for the engine is a chain of [[Legacy:GameRules|GameRules]] objects that lives somewhere in the system. Specifically, this chain is accessed as '''Level.Game.GameRulesModifiers''' from any [[Legacy:Actor|Actor]] class. How convenient, then, that [[Legacy:Mutator|Mutator]] is a subclass of [[Legacy:Actor|Actor]]!

To add your rules to the chain, just add the following code to PostBeginPlay() in the mutator that you derived from the [[Legacy:Mutator|Mutator]] class:

&lt;uscript&gt;
/* The following code assumes that you have a variable called myRules representing your rules; see MutMiceMen.uc for an example. */

	// Add the rules object to the list of GameRules in the game
	if ( Level.Game.GameRulesModifiers == None )
		Level.Game.GameRulesModifiers = myRules;
	else
		Level.Game.GameRulesModifiers.AddGameRules(myRules);
&lt;/uscript&gt;

====Building GravShot into our custom rules====

We derived a class called MiceMenRules from [[Legacy:GameRules|GameRules]] so that we could take advantage of some of the built-in functionality. In fact, almost all of the GravShot functionality lives in the NetDamage function of our custom rules.

As stated in the [[Legacy:GameRules|GameRules]] page, the NetDamage function &quot;''allows the GameRules to modify the damage (return value) and momentum. The OriginalDamage parameter should be passed to the next GameRules without any modifications.''&quot; Technically, GravShot doesn't alter either of these values. But NetDamage also takes as parameters the attacking pawn (InstigatedBy) and the target pawn (Injureed). Using these two pawns, our rules:

* Calculate the normalized vector from the victim to the instigator
: &lt;uscript&gt;
            // Get normalized vector from target to shooter
		    myVec = Normal(InstigatedBy.Location - Injured.Location);
&lt;/uscript&gt;

* Scale that vector
: &lt;uscript&gt;
		    // Set up multiplier vector
		    multVec.x = mutInstance.MovementMultiplier * 100;
		    multVec.y = mutInstance.MovementMultiplier * 100;
		    multVec.z = mutInstance.MovementMultiplier * 100;

		    // scale normalized vector; better way?
		    myVec = myVec * multVec;
&lt;/uscript&gt;

* Add the scaled vector to the victim's velocity.
: &lt;uscript&gt;
    		Injured.AddVelocity(myVec);
&lt;/uscript&gt;

Note once again that, after all of the GravShot code, the NetDamage member of the next [[Legacy:GameRules|GameRules]] object (if it exists) is called with the same parameters.

With this mutator active, the Injured pawn is moved towards the InstigatedBy pawn by some fixed amount. We'll see where this amount is set later when we look at the config menu. For practice you might try making the scaling factor situational e.g. scale based on distance or damage inflicted.

====Building MiceMen into our custom rules====

The MiceMen part of the mutator overrides the ScoreKill member of the rules. From the [[Legacy:GameRules|GameRules]] page, we know that the ScoreKill function &quot;''Augements the action taken when a player scores a kill. Not the score itself, but having to do with the Controllers involved in the Kill.''&quot;

The following two lines of code are all that we added to the ScoreKill method:

&lt;uscript&gt;
	if ( (Killer != None) &amp;&amp; (Killer.Pawn != None) )
		mutInstance.ChangePlayerSize(Killer.Pawn, mutInstance.GetScaleFor(Killer.Pawn));
&lt;/uscript&gt;

In this case, the Killer parameter (a [[Legacy:Controller|Controller]]) is used for its associated pawn. This pawn is passed to ChangePlayerSize(), a custom function in our mutator, along with a scaling factor. The scaling factor is calculated using GetScaleFor(), yet another custom function in our mutator, which also takes the pawn associated with Killer as a parameter. Again, after our code is called, ScoreKill is called in the next [[Legacy:GameRules|GameRules]] object.

Clearly a lot of the logic for MiceMen is included in the mutator, so let's take a look at that now!

===Making your own Mutator, briefly===

Presumably you already have the basics of making a mutator down, so we're just going to show you what we did with ours.

====PostBeginPlay()====

Our PostBeginPlay() code is pretty standard, going through the following steps:

# Call method in parent class
# Instantiate derived [[Legacy:GameRules|GameRules]]
# Initialize mutator instance in derived [[Legacy:GameRules|GameRules]]
# Add [[Legacy:GameRules|GameRules]] to GameRulesModifiers linked list

The only really odd step in there is Step 3. Because the mutator class contains functions and data needed for the MiceMen scaling in the rules, the rules contain an instance of the mutator. It may seem a little circular, but it works out fine.

====ModifyPlayer()====

The [[Legacy:Mutator|Mutator]] page lists the following description for the ModifyPlayer() function:

{{innerbox| This function can be used to update the player's inventory, speed, and other attributes. this function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

}}

We used ModifyPlayer() to do the following:
; Scale the player : Player scaling is handled in our custom functions called ''ChangePlayerSize()'' and ''GetScaleFor()''. The comments included in the code make the function self-explanatory. Unfortunately, we're uncertain as to whether certain functions are necessary.

; Create a custom [[Legacy:Inventory|Inventory]] item to scale the player's weapon : In order to make sure that the player's weapon model scales properly when weapons are switched, the player is given a WeaponScaler, a custom class we derived from [[Legacy:Inventory|Inventory]].

===Making your own Inventory items===

In earlier revisions of this mutator, the player weapon would not resize to match the player scale when the player switched weapons. Our solution: we derived a class from [[Legacy:Inventory|Inventory]] that would handle the resizing for us.

Our use of [[Legacy:Inventory|Inventory]]-related functionality was very minimal. The [[Legacy:Inventory|Inventory]] class has a method called ''OwnerEvent''. This method is called - surprise, surprise - whenever an event is triggered in owner. Since we wanted to change the rescale the player weapon whenever the weapon was changed, we watched for an event called 'ChangedWeapon':

&lt;uscript&gt;
function OwnerEvent(name EventName)
{
	if(EventName == 'ChangedWeapon')
	{
	 WeaponAttachment(Instigator.Weapon.ThirdPersonActor).SetCollisionSize(WeaponAttachment(Instigator.Weapon.ThirdPersonActor).Default.CollisionRadius * Instigator.DrawScale, WeaponAttachment(Instigator.Weapon.ThirdPersonActor).Default.CollisionHeight * Instigator.DrawScale);
	 WeaponAttachment(Instigator.Weapon.ThirdPersonActor).SetDrawScale(WeaponAttachment(Instigator.Weapon.ThirdPersonActor).Default.DrawScale * Instigator.DrawScale);
    }
}
&lt;/uscript&gt;

When this event occurred, the collision and draw size were rescaled based on the player's DrawScale. Note that these properties were only set on the third person mesh as indicated by the use of [[Legacy:WeaponAttachment|WeaponAttachment]] and ''ThirdPersonActor'' above. Also note that the player is referred to as ''Instigator'' since we need a [[Legacy:Pawn|Pawn]] to get a [[Legacy:Weapon|weapon]].

===Using GUIPage to configure your muator, super briefly!===

This section is unnecessary as the information that would go here is explained perfectly well over in [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]. In fact, most of the config code for this mutator was taken straight from the provided example code.

While [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] is fairly complete in terms of explaining the connection between GUI items and mutator variables, it's also a good idea to look through the documentation on other classes in the [[Legacy:GUI_Class_Hierarchy|GUI_Class_Hierarchy]] to make sure you don't fall victim to the old problems of giant checkboxes and the like.

===Problems===

It's true - we're not perfect, which makes this problematic as a tutorial. Help us make this tutorial more useful for beginners by helping us catch the following bugs:

====Levitating players====

Just run around for a little while and it won't take long until you'll see some of the other players flying around in midair. It's been hard for us to establish exactly when this happens, so even figuring that out would be very useful.

'''Tricadex''' - I think this is caused by problems with the collision box and crouching

====Funny skeletons====

Resizing players seems to do funny things to their corpses. We attempted to fix this problem using the ''BoneRefresh()'' method of the [[Legacy:Actor|Actor]] class, but it's not clear whether there are still funny effects.

Feel free to add comments to this page to help us fix these problems!

----

====About this mutator====

The MiceMenGrav mutator is a class project from the [http://www.bcc.ctc.edu Bellevue Community College] [http://gaming.bcc.ctc.edu gaming curriculum] in Bellevue, WA. This program is also responsible for the [[Legacy:VampireShoppers|VampireShoppers]] mutator.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MidKnight</title>
    <id>2184</id>
    <revision>
      <id>5296</id>
      <timestamp>2005-06-04T15:49:13Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>despam</comment>
      <text xml:space="preserve">Well Guys, I guess this is the page that I will put my stuff on. I am fairly new to the wikki community so bare with me..

one thing that I have done that has helped me out was compiled a recent version of the offlinewikki into a help file. This saves my bandwidth (I am currently on 24k) and space on my hardrive. It is also nice to have it in a helpfile format so i can lookthru it by searching. I am also currently in the process of doing the same for the UDN site (for personal use since that stuff is copyrighted) but it is definatly faster.

I hope to be posting my stuff soon. I am currently working on a Infiltration gametype for 2k4.</text>
    </revision>
    <revision>
      <id>5297</id>
      <timestamp>2005-06-04T09:11:40Z</timestamp>
      <contributor>
        <ip>24.156.50.104</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Well Guys, I guess this is the page that I will put my stuff on. I am fairly new to the wikki community so bare with me..

one thing that I have done that has helped me out was compiled a recent version of the offlinewikki into a help file. This saves my bandwidth (I am currently on 24k) and space on my hardrive. It is also nice to have it in a helpfile format so i can lookthru it by searching. I am also currently in the process of doing the same for the UDN site (for personal use since that stuff is copyrighted) but it is definatly faster.

I hope to be posting my stuff soon. I am currently working on a Infiltration gametype for 2k4.

[http://tadalafil-vardenafil-sildenafil.com/ sildenafil citrate] sildenafil citrate</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MilkShape</title>
    <id>1783</id>
    <revision>
      <id>4376</id>
      <timestamp>2006-04-07T07:32:56Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">====MilkShape 3D v. 1.6.6 ====

''Article date 10/22/03''

MilkShape 3D (MS3D) is a 3D modeling and animation toolbox designed for low-poly-count game content creation rather than producing render-to-file still images or movies. It is strictly polygon-based (triangles only &amp;ndash; no quads), provides a good suite of capable, basic modeling tools, and is easy to learn. Anyone with a smattering of 3D modeling experience can begin making serious static meshes for UT2003 in the first hour or so of using MS3D, and even raw beginners should have a fairly shallow learning curve.

MS3D's strong suit is that it is designed for modders, and sports an extensive list of import/export options that make it valuable as a &quot;translator&quot; app as well as one for creating original content. This allows setting up content &quot;pipelines&quot; that wouldn't be possible otherwise (e.g., a wave-modulated banner modeled and animated in [[Legacy:Gmax|gmax]], exported to Quake III Arena .md3 format, imported into MS3D, exported as .3ds, and made into a vertex animation for UT2003 using the classic [[Legacy:3ds2unr|3ds2unr]] utility).

MS3D has some warts. Its interface is not particularly graceful, though it is competent. It has only basic planar-mapping texturing tools, requiring some extra effort for complex shapes, and takes a very &quot;hairy-eyeball&quot; approach to texture placement &amp;ndash; tweaks can be hard to get really accurate. But with the ability to export MS3D models in dozens of formats, these limitations can usually be offset by acquiring other tools to fill in where MS3D is less useful (e.g., a mesh unwrapping/painting prog).

MilkShape 3D is very good for producing [[Legacy:Static Mesh|static mesh]]es of low to intermediate complexity for [[Legacy:UT2003|UT2003]] game content (see examples below). When exported using one of the three [[Legacy:Lightwave|Lightwave]] LWO options (see pic below), the exports can be imported directly into UEd 3's [[Legacy:Static Mesh Browser|Static Mesh browser]] (Tutorial: [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]). For models of greater complexity, freeware such as gmax can be used for the initial modeling, then exported in a format MS3D can import (such as Quake III Arena .md3), for tweaking and re-exporting in a UT2003-useable format like LWO. Meshes for early Unreal games can be exported in .3ds format.

[[Image:Legacy_MS3D-LWOexport.gif|center|LWO export options to use in MilkShape 3D]]

MS3D has animation capabilities, including skeletal animation using Forward Kinematics (FK) only, but as of v.1.6.6 can export animations for Unreal-engine games only in .3d or .3ds format, which means bringing them into the game as vertex animations &amp;ndash; not a good approach for character anims, but useful for effects of certain types. Tutorial: [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]]

MilkShape can load the default male or female [[Legacy:UT|UT]] (not UT2003) skeletons for binding to a custom model, then provide .psk export for combining with existing .psa data. Version 1.6.6 cannot export .psa, which limits the customization possiblities. Models bound in MS3D to the UT skeletons can probably be used for UT2003 (confirmation would be appreciated), but there are subtle differences in the skeletons that may need to be taken into account.

Material assignments using MS3D's less-than-streamlined interface can be tedious, but when done with some planning, gives good results in UEd. One significant advantage over [[Legacy:Maya|Maya]] 4.0.1 PLE and its [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in is that the MS3D LWO export preserves smoothing groups/hard edges when imported into the Static Mesh browser, if the materials are set up properly in MS3D and UEd. This capability makes it a better choice as a low-cost Static Mesh &quot;factory.&quot; 

Below are examples of MS3D v.1.6.5 models both in the app and in UT2003.

[[Image:Legacy_MS3D2UT2003.jpeg|center|]]

==Downloads==

This very useful 3D modeling app is available from Chumbalum Soft.
* http://www.swissquake.ch/chumbalum-soft/

The fully enabled app can be downloaded for a 30-day free trial. Its price is very reasonable (US$25 as of 10/16/03), it has a user community of wide-ranging ability and interest, and a well-trafficked forum for questions, answers, and showing off MilkShape models.

An MS3D SDK is available &amp;ndash; MS3D's basic capablities are extended by a fair number of plug-ins produced by various code-savvy users. MilkShape 3D v.1.7.0 beta is currently being offered on the Chumbalum Soft site; among its new features are .psk/.psa import/export options (unevaluated as yet) that use the UT2003 skeletons.

==Tutorials ==

* [[Legacy:Importing Milkshape Characters To UT2004|Importing Milkshape Characters To UT2004]]

* [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]] (formerly ''MilkShape Modeling and Import'')&lt;br /&gt;Describes exporting a MilkShape model for import into UT as vertex animation (this technique is not used for characters in UT2003).

* [[Legacy:NeverWinter Nights To UT2003|NeverWinter Nights to UT2003]]&lt;br /&gt;Importing NWN models into Unreal Tournament 2003 using Milkshape

* [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]&lt;br /&gt;Describes building a simple model (a tri-bladed shuriken), groups manipulation, material assignments, export options to use for UT2003 static meshes, insuring smoothing and hard edge info is preserved in UT2003, and basic MS3D texture mapping.

* MilkShape + gmax &lt;br /&gt;(Planned) Using MilkShape as a &quot;translator&quot; between gmax and UT2003 allows more advanced modeling, texture/UV, and animation techniques. Describes creating a wave-modified banner and getting it into UT2003 as a vertex animation.

==Related Topics ==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

==Comments==

&lt;b&gt;5parrowhawk:&lt;/b&gt; I've had some trouble with Milkshape's PSA export. Seems the program doesn't autoswap the y and z axes for joint rotation, meaning that the rotation data in an exported PSA is all out of whack unless you use only the x-axis.

Anyone else have this problem? I can't find the settings in Milkshape to swap axes, if there are any.

'''Bob_The_Beheader:''' Great piece of software, especially for importing/exporting models and stuff. It's

pretty poor for creating models by itself, but just friggin' awesome when it comes to taking models from

other programs and getting them into the game.

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4377</id>
      <timestamp>2006-04-07T01:11:15Z</timestamp>
      <contributor>
        <ip>218.152.129.28</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">====MilkShape 3D v. 1.6.6 ====

''Article date 10/22/03''

MilkShape 3D (MS3D) is a 3D modeling and animation toolbox designed for low-poly-count game content creation rather than producing render-to-file still images or movies. It is strictly polygon-based (triangles only &amp;ndash; no quads), provides a good suite of capable, basic modeling tools, and is easy to learn. Anyone with a smattering of 3D modeling experience can begin making serious static meshes for UT2003 in the first hour or so of using MS3D, and even raw beginners should have a fairly shallow learning curve.

MS3D's strong suit is that it is designed for modders, and sports an extensive list of import/export options that make it valuable as a &quot;translator&quot; app as well as one for creating original content. This allows setting up content &quot;pipelines&quot; that wouldn't be possible otherwise (e.g., a wave-modulated banner modeled and animated in [[Legacy:Gmax|gmax]], exported to Quake III Arena .md3 format, imported into MS3D, exported as .3ds, and made into a vertex animation for UT2003 using the classic [[Legacy:3ds2unr|3ds2unr]] utility).

MS3D has some warts. Its interface is not particularly graceful, though it is competent. It has only basic planar-mapping texturing tools, requiring some extra effort for complex shapes, and takes a very &quot;hairy-eyeball&quot; approach to texture placement &amp;ndash; tweaks can be hard to get really accurate. But with the ability to export MS3D models in dozens of formats, these limitations can usually be offset by acquiring other tools to fill in where MS3D is less useful (e.g., a mesh unwrapping/painting prog).

MilkShape 3D is very good for producing [[Legacy:Static Mesh|static mesh]]es of low to intermediate complexity for [[Legacy:UT2003|UT2003]] game content (see examples below). When exported using one of the three [[Legacy:Lightwave|Lightwave]] LWO options (see pic below), the exports can be imported directly into UEd 3's [[Legacy:Static Mesh Browser|Static Mesh browser]] (Tutorial: [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]). For models of greater complexity, freeware such as gmax can be used for the initial modeling, then exported in a format MS3D can import (such as Quake III Arena .md3), for tweaking and re-exporting in a UT2003-useable format like LWO. Meshes for early Unreal games can be exported in .3ds format.

[[Image:Legacy_MS3D-LWOexport.gif|center|LWO export options to use in MilkShape 3D]]

MS3D has animation capabilities, including skeletal animation using Forward Kinematics (FK) only, but as of v.1.6.6 can export animations for Unreal-engine games only in .3d or .3ds format, which means bringing them into the game as vertex animations &amp;ndash; not a good approach for character anims, but useful for effects of certain types. Tutorial: [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]]

MilkShape can load the default male or female [[Legacy:UT|UT]] (not UT2003) skeletons for binding to a custom model, then provide .psk export for combining with existing .psa data. Version 1.6.6 cannot export .psa, which limits the customization possiblities. Models bound in MS3D to the UT skeletons can probably be used for UT2003 (confirmation would be appreciated), but there are subtle differences in the skeletons that may need to be taken into account.

Material assignments using MS3D's less-than-streamlined interface can be tedious, but when done with some planning, gives good results in UEd. One significant advantage over [[Legacy:Maya|Maya]] 4.0.1 PLE and its [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in is that the MS3D LWO export preserves smoothing groups/hard edges when imported into the Static Mesh browser, if the materials are set up properly in MS3D and UEd. This capability makes it a better choice as a low-cost Static Mesh &quot;factory.&quot; 

Below are examples of MS3D v.1.6.5 models both in the app and in UT2003.

[[Image:Legacy_MS3D2UT2003.jpeg|center|]]

==Downloads==

This very useful 3D modeling app is available from Chumbalum Soft.
* http://www.swissquake.ch/chumbalum-soft/

The fully enabled app can be downloaded for a 30-day free trial. Its price is very reasonable (US$25 as of 10/16/03), it has a user community of wide-ranging ability and interest, and a well-trafficked forum for questions, answers, and showing off MilkShape models.

An MS3D SDK is available &amp;ndash; MS3D's basic capablities are extended by a fair number of plug-ins produced by various code-savvy users. MilkShape 3D v.1.7.0 beta is currently being offered on the Chumbalum Soft site; among its new features are .psk/.psa import/export options (unevaluated as yet) that use the UT2003 skeletons.

==Tutorials ==

* [[Legacy:Importing Milkshape Characters To UT2004|Importing Milkshape Characters To UT2004]]

* [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]] (formerly ''MilkShape Modeling and Import'')&lt;br /&gt;Describes exporting a MilkShape model for import into UT as vertex animation (this technique is not used for characters in UT2003).

* [[Legacy:NeverWinter Nights To UT2003|NeverWinter Nights to UT2003]]&lt;br /&gt;Importing NWN models into Unreal Tournament 2003 using Milkshape

* [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]&lt;br /&gt;Describes building a simple model (a tri-bladed shuriken), groups manipulation, material assignments, export options to use for UT2003 static meshes, insuring smoothing and hard edge info is preserved in UT2003, and basic MS3D texture mapping.

* MilkShape + gmax &lt;br /&gt;(Planned) Using MilkShape as a &quot;translator&quot; between gmax and UT2003 allows more advanced modeling, texture/UV, and animation techniques. Describes creating a wave-modified banner and getting it into UT2003 as a vertex animation.

==Related Topics ==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

==Comments==

&lt;b&gt;5parrowhawk:&lt;/b&gt; I've had some trouble with Milkshape's PSA export. Seems the program doesn't autoswap the y and z axes for joint rotation, meaning that the rotation data in an exported PSA is all out of whack unless you use only the x-axis.

Anyone else have this problem? I can't find the settings in Milkshape to swap axes, if there are any.

'''Bob_The_Beheader:''' Great piece of software, especially for importing/exporting models and stuff. It's

pretty poor for creating models by itself, but just friggin' awesome when it comes to taking models from

other programs and getting them into the game.

----

[[:Category:Legacy Modeling]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11864</id>
      <timestamp>2008-05-11T17:07:53Z</timestamp>
      <contributor>
        <username>Feralidragon</username>
        <id>505</id>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">====MilkShape 3D v. 1.6.6 ====

''Article date 10/22/03''

MilkShape 3D (MS3D) is a 3D modeling and animation toolbox designed for low-poly-count game content creation rather than producing render-to-file still images or movies. It is strictly polygon-based (triangles only &amp;ndash; no quads), provides a good suite of capable, basic modeling tools, and is easy to learn. Anyone with a smattering of 3D modeling experience can begin making serious static meshes for UT2003 in the first hour or so of using MS3D, and even raw beginners should have a fairly shallow learning curve.

MS3D's strong suit is that it is designed for modders, and sports an extensive list of import/export options that make it valuable as a &quot;translator&quot; app as well as one for creating original content. This allows setting up content &quot;pipelines&quot; that wouldn't be possible otherwise (e.g., a wave-modulated banner modeled and animated in [[Legacy:Gmax|gmax]], exported to Quake III Arena .md3 format, imported into MS3D, exported as .3ds, and made into a vertex animation for UT2003 using the classic [[Legacy:3ds2unr|3ds2unr]] utility).

MS3D has some warts. Its interface is not particularly graceful, though it is competent. It has only basic planar-mapping texturing tools, requiring some extra effort for complex shapes, and takes a very &quot;hairy-eyeball&quot; approach to texture placement &amp;ndash; tweaks can be hard to get really accurate. But with the ability to export MS3D models in dozens of formats, these limitations can usually be offset by acquiring other tools to fill in where MS3D is less useful (e.g., a mesh unwrapping/painting prog).

MilkShape 3D is very good for producing [[Legacy:Static Mesh|static mesh]]es of low to intermediate complexity for [[Legacy:UT2003|UT2003]] game content (see examples below). When exported using one of the three [[Legacy:Lightwave|Lightwave]] LWO options (see pic below), the exports can be imported directly into UEd 3's [[Legacy:Static Mesh Browser|Static Mesh browser]] (Tutorial: [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]). For models of greater complexity, freeware such as gmax can be used for the initial modeling, then exported in a format MS3D can import (such as Quake III Arena .md3), for tweaking and re-exporting in a UT2003-useable format like LWO. Meshes for early Unreal games can be exported in .3ds format.

[[Image:Legacy_MS3D-LWOexport.gif|center|LWO export options to use in MilkShape 3D]]

MS3D has animation capabilities, including skeletal animation using Forward Kinematics (FK) only, but as of v.1.6.6 can export animations for Unreal-engine games only in .3d or .3ds format, which means bringing them into the game as vertex animations &amp;ndash; not a good approach for character anims, but useful for effects of certain types. Tutorial: [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]]

MilkShape can load the default male or female [[Legacy:UT|UT]] (not UT2003) skeletons for binding to a custom model, then provide .psk export for combining with existing .psa data. Version 1.6.6 cannot export .psa, which limits the customization possiblities. Models bound in MS3D to the UT skeletons can probably be used for UT2003 (confirmation would be appreciated), but there are subtle differences in the skeletons that may need to be taken into account.

Material assignments using MS3D's less-than-streamlined interface can be tedious, but when done with some planning, gives good results in UEd. One significant advantage over [[Legacy:Maya|Maya]] 4.0.1 PLE and its [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in is that the MS3D LWO export preserves smoothing groups/hard edges when imported into the Static Mesh browser, if the materials are set up properly in MS3D and UEd. This capability makes it a better choice as a low-cost Static Mesh &quot;factory.&quot; 

Below are examples of MS3D v.1.6.5 models both in the app and in UT2003.

[[Image:Legacy_MS3D2UT2003.jpeg|center|]]

==Downloads==

This very useful 3D modeling app is available from Chumbalum Soft.
* http://www.swissquake.ch/chumbalum-soft/

The fully enabled app can be downloaded for a 30-day free trial. Its price is very reasonable (US$25 as of 10/16/03), it has a user community of wide-ranging ability and interest, and a well-trafficked forum for questions, answers, and showing off MilkShape models.

An MS3D SDK is available &amp;ndash; MS3D's basic capablities are extended by a fair number of plug-ins produced by various code-savvy users. MilkShape 3D v.1.7.0 beta is currently being offered on the Chumbalum Soft site; among its new features are .psk/.psa import/export options (unevaluated as yet) that use the UT2003 skeletons.

==Tutorials ==

* [[Legacy:Importing Milkshape Characters To UT2004|Importing Milkshape Characters To UT2004]]

* [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]] (formerly ''MilkShape Modeling and Import'')&lt;br /&gt;Describes exporting a MilkShape model for import into UT as vertex animation (this technique is not used for characters in UT2003).

* [[Legacy:NeverWinter Nights To UT2003|NeverWinter Nights to UT2003]]&lt;br /&gt;Importing NWN models into Unreal Tournament 2003 using Milkshape

* [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]&lt;br /&gt;Describes building a simple model (a tri-bladed shuriken), groups manipulation, material assignments, export options to use for UT2003 static meshes, insuring smoothing and hard edge info is preserved in UT2003, and basic MS3D texture mapping.

* MilkShape + gmax &lt;br /&gt;(Planned) Using MilkShape as a &quot;translator&quot; between gmax and UT2003 allows more advanced modeling, texture/UV, and animation techniques. Describes creating a wave-modified banner and getting it into UT2003 as a vertex animation.

==Related Topics ==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

==Comments==

&lt;b&gt;5parrowhawk:&lt;/b&gt; I've had some trouble with Milkshape's PSA export. Seems the program doesn't autoswap the y and z axes for joint rotation, meaning that the rotation data in an exported PSA is all out of whack unless you use only the x-axis.

Anyone else have this problem? I can't find the settings in Milkshape to swap axes, if there are any.

'''Bob_The_Beheader:''' Great piece of software, especially for importing/exporting models and stuff. It's

pretty poor for creating models by itself, but just friggin' awesome when it comes to taking models from

other programs and getting them into the game.

'''Feralidragon:''' I was wondering, I am using MilkShape 1.8.2 for modelling to Unreal Tournament Classic or GOTY, and at the beggining, I exported many models to _d.3d and _a.3d formats (unreal format) without any problems, all perfect. But one day, it started to export them with little and big distortions in the models, and I don't know what's hapenning. I already tried to make a total new reinstall (uninstalled, deleted all MilkShape related files, except the models, and install again), and it didn't work. The funny thing, is that I stored a model in unreal format in my HD at the beggining, and model is fine, but when i import it to this MilkShape, the importer itself distorts the model. So both exporter and importer are distorting my models. Anyone know what's happening and how to solve this?

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11868</id>
      <timestamp>2008-05-11T22:16:16Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moving comments to talk page</comment>
      <text xml:space="preserve">====MilkShape 3D v. 1.6.6 ====

''Article date 10/22/03''

MilkShape 3D (MS3D) is a 3D modeling and animation toolbox designed for low-poly-count game content creation rather than producing render-to-file still images or movies. It is strictly polygon-based (triangles only &amp;ndash; no quads), provides a good suite of capable, basic modeling tools, and is easy to learn. Anyone with a smattering of 3D modeling experience can begin making serious static meshes for UT2003 in the first hour or so of using MS3D, and even raw beginners should have a fairly shallow learning curve.

MS3D's strong suit is that it is designed for modders, and sports an extensive list of import/export options that make it valuable as a &quot;translator&quot; app as well as one for creating original content. This allows setting up content &quot;pipelines&quot; that wouldn't be possible otherwise (e.g., a wave-modulated banner modeled and animated in [[Legacy:Gmax|gmax]], exported to Quake III Arena .md3 format, imported into MS3D, exported as .3ds, and made into a vertex animation for UT2003 using the classic [[Legacy:3ds2unr|3ds2unr]] utility).

MS3D has some warts. Its interface is not particularly graceful, though it is competent. It has only basic planar-mapping texturing tools, requiring some extra effort for complex shapes, and takes a very &quot;hairy-eyeball&quot; approach to texture placement &amp;ndash; tweaks can be hard to get really accurate. But with the ability to export MS3D models in dozens of formats, these limitations can usually be offset by acquiring other tools to fill in where MS3D is less useful (e.g., a mesh unwrapping/painting prog).

MilkShape 3D is very good for producing [[Legacy:Static Mesh|static mesh]]es of low to intermediate complexity for [[Legacy:UT2003|UT2003]] game content (see examples below). When exported using one of the three [[Legacy:Lightwave|Lightwave]] LWO options (see pic below), the exports can be imported directly into UEd 3's [[Legacy:Static Mesh Browser|Static Mesh browser]] (Tutorial: [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]). For models of greater complexity, freeware such as gmax can be used for the initial modeling, then exported in a format MS3D can import (such as Quake III Arena .md3), for tweaking and re-exporting in a UT2003-useable format like LWO. Meshes for early Unreal games can be exported in .3ds format.

[[Image:Legacy_MS3D-LWOexport.gif|center|LWO export options to use in MilkShape 3D]]

MS3D has animation capabilities, including skeletal animation using Forward Kinematics (FK) only, but as of v.1.6.6 can export animations for Unreal-engine games only in .3d or .3ds format, which means bringing them into the game as vertex animations &amp;ndash; not a good approach for character anims, but useful for effects of certain types. Tutorial: [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]]

MilkShape can load the default male or female [[Legacy:UT|UT]] (not UT2003) skeletons for binding to a custom model, then provide .psk export for combining with existing .psa data. Version 1.6.6 cannot export .psa, which limits the customization possiblities. Models bound in MS3D to the UT skeletons can probably be used for UT2003 (confirmation would be appreciated), but there are subtle differences in the skeletons that may need to be taken into account.

Material assignments using MS3D's less-than-streamlined interface can be tedious, but when done with some planning, gives good results in UEd. One significant advantage over [[Legacy:Maya|Maya]] 4.0.1 PLE and its [[Legacy:UnEditor.Mll|unEditor.mll]] plug-in is that the MS3D LWO export preserves smoothing groups/hard edges when imported into the Static Mesh browser, if the materials are set up properly in MS3D and UEd. This capability makes it a better choice as a low-cost Static Mesh &quot;factory.&quot; 

Below are examples of MS3D v.1.6.5 models both in the app and in UT2003.

[[Image:Legacy_MS3D2UT2003.jpeg|center|]]

==Downloads==

This very useful 3D modeling app is available from Chumbalum Soft.
* http://www.swissquake.ch/chumbalum-soft/

The fully enabled app can be downloaded for a 30-day free trial. Its price is very reasonable (US$25 as of 10/16/03), it has a user community of wide-ranging ability and interest, and a well-trafficked forum for questions, answers, and showing off MilkShape models.

An MS3D SDK is available &amp;ndash; MS3D's basic capablities are extended by a fair number of plug-ins produced by various code-savvy users. MilkShape 3D v.1.7.0 beta is currently being offered on the Chumbalum Soft site; among its new features are .psk/.psa import/export options (unevaluated as yet) that use the UT2003 skeletons.

==Tutorials ==

* [[Legacy:Importing Milkshape Characters To UT2004|Importing Milkshape Characters To UT2004]]

* [[Legacy:UT Vertex Animations From MilkShape|UT Vertex Animations from MilkShape]] (formerly ''MilkShape Modeling and Import'')&lt;br /&gt;Describes exporting a MilkShape model for import into UT as vertex animation (this technique is not used for characters in UT2003).

* [[Legacy:NeverWinter Nights To UT2003|NeverWinter Nights to UT2003]]&lt;br /&gt;Importing NWN models into Unreal Tournament 2003 using Milkshape

* [[Legacy:MilkShape For UT2003 Static Meshes|MilkShape for UT2003 Static Meshes]]&lt;br /&gt;Describes building a simple model (a tri-bladed shuriken), groups manipulation, material assignments, export options to use for UT2003 static meshes, insuring smoothing and hard edge info is preserved in UT2003, and basic MS3D texture mapping.

* MilkShape + gmax &lt;br /&gt;(Planned) Using MilkShape as a &quot;translator&quot; between gmax and UT2003 allows more advanced modeling, texture/UV, and animation techniques. Describes creating a wave-modified banner and getting it into UT2003 as a vertex animation.

==Related Topics ==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Static Mesh|Static Mesh]]

[[Category:Legacy Modeling|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MilkShape For UT2003 Static Meshes</title>
    <id>2134</id>
    <revision>
      <id>5196</id>
      <timestamp>2006-08-05T00:19:32Z</timestamp>
      <contributor>
        <ip>70-57-117-201.ptld.qwest.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Prerequisites: UT2003 and Unreal Ed 3.0, [[Legacy:MilkShape|MilkShape]] 3D v.1.6.5 or above. Familiarity with elementary 3D modeling terminology and processes is recommended, and some preliminary practice with the MilkShape 3D (MS3D) interface is useful.

'''Tutorial Structure:'''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modeling And Smoothing In MS3D]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Materials And Smoothing For UEd3]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Export And Import]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Applying File Textures In MS3D]]

===Overview ===

This tutorial steps through a simple MilkShape modeling task, using the basic tools for creation, selection and manipulation of the model and its components. It describes the process of assigning materials in MilkShape 3D as a means of preserving smoothing groups/hard edges when the objects are imported into UEd 3 as static meshes. Export options that permit import into UEd3 are described. Planar texture mapping is described.

The object being modeled and exported for use as a static mesh in UEd3 is a three-pointed blade weapon similar to a shuriken or the Unreal razorjack ammo:

[[Image:Legacy_MS3DT-00.gif|center|A shuriken made in MilkShape and imported into UEd3]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5197</id>
      <timestamp>2003-10-23T11:40:40Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">Prerequisites: UT2003 and Unreal Ed 3.0, [[Legacy:MilkShape|MilkShape]] 3D v.1.6.5 or above. Familiarity with elementary 3D modeling terminology and processes is recommended, and some preliminary practice with the MilkShape 3D (MS3D) interface is useful.

'''Tutorial Structure:'''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modeling And Smoothing In MS3D]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Materials And Smoothing For UEd3]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Export And Import]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Applying File Textures In MS3D]]

===Overview ===

This tutorial steps through a simple MilkShape modeling task, using the basic tools for creation, selection and manipulation of the model and its components. It describes the process of assigning materials in MilkShape 3D as a means of preserving smoothing groups/hard edges when the objects are imported into UEd 3 as static meshes. Export options that permit import into UEd3 are described. Planar texture mapping is described.

The object being modeled and exported for use as a static mesh in UEd3 is a three-pointed blade weapon similar to a shuriken or the Unreal rajorjack ammo:

[[Image:Legacy_MS3DT-00.gif|center|A shuriken made in MilkShape and imported into UEd3]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MilkShape For UT2003 Static Meshes/Applying File Textures In MS3D</title>
    <id>2135</id>
    <revision>
      <id>5198</id>
      <timestamp>2003-10-23T12:16:44Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>typo fix</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Applying File Textures ===

The materials assigned in the previous tutorial section had no associated file textures &amp;ndash; they were essentially just names for UEd to use when assigning smoothing to an imported model. In the UEd Texture browser, an actual texture file was assigned to the model, but the UV texture coordinates of the model hadn't been modified &amp;ndash; there is texture stretching due to the scale &amp; rotate modeling procedures (FIG 19). The model needs to be texture mapped.

[[Image:Legacy_MS3DT-19.gif|center|FIG. 19 A &quot;pictorial&quot; texture applied to shuriken shows distortion]]

Texture mapping in MS3D is pretty basic &amp;ndash; it only provides for planar projection mapping. The projection axis is chosen from one of the orthographic views: Top, Bottom, Left, Right, Front or Back. The faces of the model that are being mapped must be oriented parallel to one of these viewplanes for textures to be mapped without stretching, which complicates the texturing process. There are no numeric methods for positioning textures, so very exact placements are tricky. Despite these limitations, texture-mapping MS3D models can be successful if carefully planned.

For the shuriken model, a 256x256 texture was painted, using a screen capture from the MS3D Top viewport as a guide. The texture is displayed below &amp;ndash; download it for use with this tutorial section. The JPEG format is OK for use in MS3D, but you'll need to convert it to a BMP or TGA file for use in UEd.

[[Image:Legacy_shurikentex.jpeg|center|FIG. 20 The texture for the shuriken &amp;ndash; 256x256. Convert to BMP or TGA for UEd.]]

The texture will initially be applied to all faces simultaneously, so that it can be fitted to the model accurately. In MilkShape, Select All. In the Group tab, click the Regroup button. Enable Rotate (F3), and in the Top viewport, rotate the model until one blade points down, matching the texture positioning as closely as possible (it doesn't need to be 100% accurate at this point). Enable '''Textured''' in the Top viewport and 3D viewport options.

[[Image:Legacy_MS3DT-21.gif|center|FIG. 21 Model rotated for texture mapping]]

In the Materials tab, create a new Material named ''shurikenTex''. Choose white as a Diffuse color. Click on the top wide button labeled '''&lt;none&gt;''', located in the center set of Materials tab buttons (FIG. 22). The bottom button labeled &lt;none&gt; is for applying an alpha-mask file.

[[Image:Legacy_MS3DT-21B.gif|center|FIG. 22 Adding a file texture to a material in MS3D]]

In the Open Image dialog that opens, find ''shuriken.jpg'' and open it. Click Assign in the Materials tab &amp;ndash; the model should now display the applied texture file, but in a distorted manner (FIG 22). This is due to the default UV mapping of the cylinder that became a shuriken.

[[Image:Legacy_MS3DT-22.gif|center|FIG. 23 Distorted texture in MS3D]]

In the MS3D main menu, use '''Window&gt;Texture Coordinate Editor''', or the shortcut keys Ctrl+T. The '''Texture Coordinate Editor''' (TCE) opens in its own app window. On the right of the TCE, enter 2.0 in the text field next to the '''Scale''' button, then click Scale. Drag the corner of the TCE dialog to enlarge it, and position it where the MS3D Top viewport is also visible. Check the Redraw checkbox.

Use Ctrl+MMB (middle mouse button) to drag the image in the TCE window more to the center of the window.

The current projection for the texture placement is from the front of the original cylinder &amp;ndash; the meshlines shown in the TCE correspond to an ortho Front view of the cylinder. The model has been stretched to fit to the texture file in all directions.

In the TCE, note that ''Regroup1'' (the regrouped shuriken mesh) is selected in the top drop-down list (which specifies the group being mapped), and that ''Front'' is selected in the bottom (which specifies the projection axis). Click the down-karat next to Front and select ''Top'' from the list. Click '''Remap'''

The TCE meshlines change to a view from the Top, and in the Top viewport, the texture looks less distorted, if a bit off-center.

To realign the texture more accurately, click the '''Region''' button in the TCE. Starting just inside the top left blade point of the shuriken texture, drag a rectangle in the TCE window, making sure that the sides of the rectangle fall just inside the blade points of the texture image (which was made slightly oversize so it would &quot;bleed&quot; over the model edges). Then click ''Remap''. The texture will align itself more closely to the model.

If you're very lucky, you rotated the model EXACTLY enough to perfectly fit the texture &amp;ndash; good job! But if not, it's a simple matter to rotate the model a bit more in the appropriate direction, Remap the texture using Region, and checking the results. The goal is a well-aligned model and texture outline:

[[Image:Legacy_MS3DT-23.gif|center|FIG. 24 Aligning the model &amp; the texture in the TCE]]

It's possible to rotate the texture in the TCE, but you may find it harder to control than rotating the model and Remapping as needed.

The model now has a single material applied, which includes a texture file, and a new set of UV texture coordinates (mapping) applied from the Top projection. The single texture means that UED will smooth the entire model on import &amp;ndash; not desirable. 

To re-establish the &quot;smoothing by material name&quot; of the previous tutorial section, select and regroup the faces of the model into three groups (''hubs, UpSurf'' and ''DownSurf'') as was previously done. Then assign each new group its corresponding named material.

In the Materials tab, select materials ''hubs'', ''UpSurf'', and ''DownSurf'', and specify the ''shuriken.jpg'' image as the texture file for each, and change the Diffuse color to white. Essentially, these materials are now identical to ''shurikenTex'' and to each other. Remember, only the material names matter for UEd's smoothing operations. In the viewports, the shuriken model does not change in appearance &amp;ndash; the UV coordinates weren't changed by regrouping, and three materials identical except for name have been applied. 

Save the file and export it to a new LWO file, ''shuriken2.lwo.''

In UEd, make sure the ''MilkShapeMaterial.utx'' texture package and the ''WikiTute_SM.usx'' static mesh package are open and ''fully'' loaded. Then import ''shuriken2.lwo'' into the '''WikiTute_SM.MS3Dmodels''' group. Save the .usx package. 

In the Texture browser, import the BMP or TGA version of the shuriken texture image into the '''MilkShapeMaterial.NamedMaterials''' group. Save the .utx package. Select the newly-imported texture.

[[Image:Legacy_MS3DT-24.gif|center|]]

In the Static Mesh browser, expand the Materials section for ''shuriken2'', then assign the selected texture in each of the Material slots. ''shuriken2'' now has a fully UV mapped texture file applied, and the original smoothing groups are preserved as well.

[[Image:Legacy_MS3DT-00.gif|center|]]

This ends the tutorial. Go forth and model worlds!</text>
    </revision>
    <revision>
      <id>5199</id>
      <timestamp>2003-10-23T00:30:49Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>finis!</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Applying File Textures ===

The materials assigned in the previous tutorial section had no associated file textures &amp;ndash; they were essentially just names for UEd to use when assigning smoothing to an imported model. In the UEd Texture browser, an actual texture file was assigned to the model, but the UV texture coordinates of the model hadn't been modified &amp;ndash; there is texture stretching due to the scale &amp; rotate modeling procedures (FIG 19). The model needs to be texture mapped.

[[Image:Legacy_MS3DT-19.gif|center|FIG. 19 A &quot;pictorial&quot; texture applied to shuriken shows distortion]]

Texture mapping in MS3D is pretty basic &amp;ndash; it only provides for planar projection mapping. The projection axis is chosen from one of the orthographic views: Top, Bottom, Left, Right, Front or Back. The faces of the model that are being mapped must be oriented parallel to one of these viewplanes for textures to be mapped without stretching, which complicates the texturing process. There are no numeric methods for positioning textures, so very exact placements are tricky. Despite these limitations, texture-mapping MS3D models can be successful if carefully planned.

For the shuriken model, a 256x256 texture was painted, using a screen capture from the MS3D Top viewport as a guide. The texture is displayed below &amp;ndash; download it for use with this tutorial section. The JPEG format is OK for use in MS3D, but you'll need to convert it to a BMP or TGA file for use in UEd.

[[Image:Legacy_shurikentex.jpeg|center|FIG. 20 The texture for the shuriken &amp;ndash; 256x256. Convert to BMP or TGA for UEd.]]

The texture will initially be applied to all faces simultaneously, so that it can be fitted to the model accurately. In MilkShape, Select All. In the Group tab, click the Regroup button. Enable Rotate (F3), and in the Top viewport, rotate the model until one blade points down, matching the texture positioning as closely as possible (it doesn't need to be 100% accurate at this point). Enable '''Textured''' in the Top viewport and 3D viewport options.

[[Image:Legacy_MS3DT-21.gif|center|FIG. 21 Model rotated for texture mapping]]

In the Materials tab, create a new Material named ''shurikenTex''. Choose white as a Diffuse color. Click on the top wide button labeled '''&lt;none&gt;''', located in the center set of Materials tab buttons (FIG. 22). The bottom button labeled &lt;next&gt; is for applying an alpha-mask file.

[[Image:Legacy_MS3DT-21B.gif|center|FIG. 22 Adding a file texture to a material in MS3D]]

In the Open Image dialog that opens, find ''shuriken.jpg'' and open it. Click Assign in the Materials tab &amp;ndash; the model should now display the applied texture file, but in a distorted manner (FIG 22). This is due to the default UV mapping of the cylinder that became a shuriken.

[[Image:Legacy_MS3DT-22.gif|center|FIG. 23 Distorted texture in MS3D]]

In the MS3D main menu, use '''Window&gt;Texture Coordinate Editor''', or the shortcut keys Ctrl+T. The '''Texture Coordinate Editor''' (TCE) opens in its own app window. On the right of the TCE, enter 2.0 in the text field next to the '''Scale''' button, then click Scale. Drag the corner of the TCE dialog to enlarge it, and position it where the MS3D Top viewport is also visible. Check the Redraw checkbox.

Use Ctrl+MMB (middle mouse button) to drag the image in the TCE window more to the center of the window.

The current projection for the texture placement is from the front of the original cylinder &amp;ndash; the meshlines shown in the TCE correspond to an ortho Front view of the cylinder. The model has been stretched to fit to the texture file in all directions.

In the TCE, note that ''Regroup1'' (the regrouped shuriken mesh) is selected in the top drop-down list (which specifies the group being mapped), and that ''Front'' is selected in the bottom (which specifies the projection axis). Click the down-karat next to Front and select ''Top'' from the list. Click '''Remap'''

The TCE meshlines change to a view from the Top, and in the Top viewport, the texture looks less distorted, if a bit off-center.

To realign the texture more accurately, click the '''Region''' button in the TCE. Starting just inside the top left blade point of the shuriken texture, drag a rectangle in the TCE window, making sure that the sides of the rectangle fall just inside the blade points of the texture image (which was made slightly oversize so it would &quot;bleed&quot; over the model edges). Then click ''Remap''. The texture will align itself more closely to the model.

If you're very lucky, you rotated the model EXACTLY enough to perfectly fit the texture &amp;ndash; good job! But if not, it's a simple matter to rotate the model a bit more in the appropriate direction, Remap the texture using Region, and checking the results. The goal is a well-aligned model and texture outline:

[[Image:Legacy_MS3DT-23.gif|center|FIG. 24 Aligning the model &amp; the texture in the TCE]]

It's possible to rotate the texture in the TCE, but you may find it harder to control than rotating the model and Remapping as needed.

The model now has a single material applied, which includes a texture file, and a new set of UV texture coordinates (mapping) applied from the Top projection. The single texture means that UED will smooth the entire model on import &amp;ndash; not desirable. 

To re-establish the &quot;smoothing by material name&quot; of the previous tutorial section, select and regroup the faces of the model into three groups (''hubs, UpSurf'' and ''DownSurf'') as was previously done. Then assign each new group its corresponding named material.

In the Materials tab, select materials ''hubs'', ''UpSurf'', and ''DownSUrf'', and specify the ''shuriken.jpg'' image as the texture file for each, and change the Diffuse color to white. Essentially, these materials are now identical to ''shurikenTex'' and to each other. Remember, only the material names matter for UEd's smoothing operations. In the viewports, the shuriken model does not change in appearance &amp;ndash; the UV coordinates weren't changed by regrouping, and three materials identical except for name have been applied. 

Save the file and export it to a new LWO file, ''shuriken2.lwo.''

In UEd, make sure the ''MilkShapeMaterial.utx'' texture package and the ''WikiTute_SM.usx'' static mesh packages are open and ''fully'' loaded. Then import ''shuriken2.lwo'' into the '''WikiTute_SM.MS3Dmodels''' group. Save the .usx package. 

In the Texture browser, import the BMP or TGA version of the shuriken texture image into the '''MilkShapeMaterial.NamedMaterials''' group. Save the .utx package. Select the newly-imported texture.

[[Image:Legacy_MS3DT-24.gif|center|]]

In the Static Mesh browser, expand the Materials section for ''shuriken2'', then assign the selected texture in each of the Material slots. ''shuriken2'' now has a fully UV mapped texture file applied, and the original smoothing groups are preserved as well.

[[Image:Legacy_MS3DT-00.gif|center|]]

This ends the tutorial. Go forth and model worlds!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MilkShape For UT2003 Static Meshes/Export And Import</title>
    <id>2136</id>
    <revision>
      <id>5200</id>
      <timestamp>2005-12-02T23:14:11Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Export and Import ===

Exporting models from MS3D for use as static meshes in UEd3 is very straightforward. UEd can import models in the LWO (Lightwave object) format, extension ''.lwo''. However, the MS3D Export menu roll-out has ''three'' LWO options &amp;ndash; my experience is that the one shown in FIG 13. works best when configured as shown. 

[[Image:Legacy_MS3D-LWOexport.gif|center|FIG. 13 LWO export options to use in MilkShape 3D]]

Note that ''ALL'' objects in a MilkShape model file are exported &amp;ndash; separate .lwo files must be made for each object to be imported as a separate static mesh in UEd.

The origin of the MS3D workspace will define the pivot point for static meshes made from MS3D models. This can be useful when building a complex assortment of objects that must fit together in UEd, but are exported as separate LWOs (e.g. the facades of a building, and its rooftop edge trim). After building the components to fit in MS3D, make separate files of each component for export, but do ''not'' move the objects in the component files. In UED the parts can be easily reassembled due to the common pivot point for all the component static meshes.

Use the options described above to export the shuriken model to filename ''shuriken.lwo''. Save the LWO export in any convenient directory.

Launch UEd3, and open the Textures browser. Prior to importing the LWO file as a static mesh, there ''MUST'' be textures present in the Texture browser with names that match the material names assigned to the model in MS3D. Any material name that is not found will be assigned Texture'Engine.DefaultTexture' (bleah!), and smoothing info based on material names may be lost.

In the Textures browser, use File&gt;Import to create a new texture; use '''Package: MilkShapeMaterials, Group: NamedMaterials''', and '''Name: hubs'''. Add textures named ''UpSUrf'' and ''DownSurf'' to this package and save it (FIG. 14).

[[Image:Legacy_MS3DT-14.gif|center|FIG. 14 Creating UEd textures named to match the MS3D material names.]]

Texture name spelling in UEd must exactly match those assigned in MS3D, but is not case-sensitive. The actual textures imported are irrelevant &amp;ndash; the same texture file could be used for all three differently named textures. Only the naming is important.

Switch to the Static Mesh browser. Use File&gt;Import to open the dialog, and select the ''shuriken.lwo'' file. Use '''Package: WikiTute_SM, Group: MS3Dmodels, Name: shuriken''', click OK.

[[Image:Legacy_MS3DT-15.gif|center|FIG. 15 Static mesh import dialogs]]

You will get the following Message dialog &amp;ndash; just click OK. 

[[Image:Legacy_MS3DT-16.gif|center|FIG. 16 LWO import warning]]

The warning is (afaik) because the materials used have no texture files associated with them as yet (this will be changed in Part 4 of the tutorial). The warning can be ignored &amp;ndash; it does not affect the import.

In the Static Mesh browser display, the shuriken should now be visible, and the Materials property section should list the three material names ''hubs'', ''UpSurf'', and ''DownSurf''. Textures on the model will reflect those you chose when creating the ''MilkShapeMaterials'' package.

[[Image:Legacy_MS3DT-17.gif|center|FIG 17. The imported shuriken model with assigned UEd textures]]

Save the ''WikiTute_SM'' static mesh package.

In the browser, the ''shuriken'' static mesh is Unlit and thus doesn't show the smoothing properly &amp;ndash; it has to be placed in a map with a lighting setup. Open (or create) a map with relatively bright and directional lighting (too dim &amp; flat a lighting scheme and the smoothing may be harder to see). Click the '''Insert Static Mesh in Level''' button to place ''shuriken'' at the current camera position, then pull back the camera in the 3D window.

Inspect ''shuriken'' from a number of viewpoints, noting that there is a visible hard-edge boundary between the ''hubs'', ''UpSurf'', and ''DownSurf'' sections &amp;ndash; the smoothing groups from MS3D have been preserved by assigning the three material names for export/import.

The edges may be difficult to see clearly if three differently-colored textures were created in the ''MilkShapeMaterials'' package. In the Textures browser, select one of the textures, preferably one not too light or dark. In the Static Mesh browser, assign this single material to all three '''Materials''' property slots for ''shuriken''. In the map, the static mesh will become monochrome, but the smoothing and edges are not changed.

[[Image:Legacy_MS3DT-18.gif|center|FIG. 18 A monochrome shuriken shows smoothing &amp; edges clearly]]

This is an important aspect of the model &amp;ndash; once imported with separate material names to define smoothing, it doesn't matter what textures are actually assigned in UEd, the smoothing will be preserved. Thus, if a static mesh must have hard edges, but is planned to have only a single texture, multiple materials should be applied in MS3D to define smoothing and edges. Once imported into UEd, all Materials slots can be given the same texture.

Example: for a concrete-textured cube, three materials need be assigned in MS3D, one each for the opposing pairs of faces of the cube. 

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Applying File Textures In MS3D|Applying File Textures in MS3D]]

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5201</id>
      <timestamp>2003-10-23T00:05:57Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>new tute page - in progress</comment>
      <text xml:space="preserve">{{innerbox||^'''THIS IS A WORK IN PROGRESS'''&lt;br /&gt;

}}

Please do not edit or restructure this page or its subpages until this notice has been removed. Comments during reconstruction are most welcome :)&lt;br /&gt;Thanks

----

{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Export and Import ===

Exporting models from MS3D for use as static meshes in UEd3 is very straightforward. UEd can import models in the LWO (Lightwave object) format, extension ''.lwo''. However, the MS3D Export menu roll-out has ''three'' LWO options &amp;ndash; my experience is that the one shown in FIG 13. works best when configured as shown. 

[[Image:Legacy_MS3D-LWOexport.gif|center|FIG. 13 LWO export options to use in MilkShape 3D]]

Note that ''ALL'' objects in a MilkShape model file are exported &amp;ndash; separate .lwo files must be made for each object to be imported as a separate static mesh in UEd.

The origin of the MS3D workspace will define the pivot point for static meshes made from MS3D models. This can be useful when building a complex assortment of objects that must fit together in UEd, but are exported as separate LWOs (e.g. the facades of a building, and its rooftop edge trim). After building the components to fit in MS3D, make separate files of each component for export, but do ''not'' move the objects in the component files. In UED the parts can be easily reassembled due to the common pivot point for all the component static meshes.

Use the options described above to export the shuriken model to filename ''shuriken.lwo''. Save the LWO export in any convenient directory.

Launch UEd3, and open the Textures browser. Prior to importing the LWO file as a static mesh, there ''MUST'' be textures present in the Texture browser with names that match the material names assigned to the model in MS3D. Any material name that is not found will be assigned Texture'Engine.DefaultTexture' (bleah!), and smoothing info based on material names may be lost.

In the Textures browser, use File&gt;Import to create a new texture; use '''Package: MilkShapeMaterials, Group: NamedMaterials''', and '''Name: hubs'''. Add textures named ''UpSUrf'' and ''DownSurf'' to this package and save it (FIG. 14).

[[Image:Legacy_MS3DT-14.gif|center|FIG. 14 Creating UEd textures named to match the MS3D material names.]]

Texture name spelling in UEd must exactly match those assigned in MS3D, but is not case-sensitive. The actual textures imported are irrelevant &amp;ndash; the same texture file could be used for all three differently named textures. Only the naming is important.

Switch to the Static Mesh browser. Use File&gt;Import to open the dialog, and select the ''shuriken.lwo'' file. Use '''Package: WikiTute_SM, Group: MS3Dmodels, Name: shuriken''', click OK.

[[Image:Legacy_MS3DT-15.gif|center|FIG. 15 Static mesh import dialogs]]

You will get the following Message dialog &amp;ndash; just click OK. 

[[Image:Legacy_MS3DT-16.gif|center|FIG. 16 LWO import warning]]

The warning is (afaik) because the materials used have no texture files associated with them as yet (this will be changed in Part 4 of the tutorial). The warning can be ignored &amp;ndash; it does not affect the import.

In the Static Mesh browser display, the shuriken should now be visible, and the Materials property section should list the three material names ''hubs'', ''UpSurf'', and ''DownSurf''. Textures on the model will reflect those you chose when creating the ''MilkShapeMaterials'' package.

[[Image:Legacy_MS3DT-17.gif|center|FIG 17. The imported shuriken model with assigned UEd textures]]

Save the ''WikiTute_SM'' static mesh package.

In the browser, the ''shuriken'' static mesh is Unlit and thus doesn't show the smoothing properly &amp;ndash; it has to be placed in a map with a lighting setup. Open (or create) a map with relatively bright and directional lighting (too dim &amp; flat a lighting scheme and the smoothing may be harder to see). Click the '''Insert Static Mesh in Level''' button to place ''shuriken'' at the current camera position, then pull back the camera in the 3D window.

Inspect ''shuriken'' from a number of viewpoints, noting that there is a visible hard-edge boundary between the ''hubs'', ''UpSurf'', and ''DownSurf'' sections &amp;ndash; the smoothing groups from MS3D have been preserved by assigning the three material names for export/import.

The edges may be difficult to see clearly if three differently-colored textures were created in the ''MilkShapeMaterials'' package. In the Textures browser, select one of the textures, preferably one not too light or dark. In the Static Mesh browser, assign this single material to all three '''Materials''' property slots for ''shuriken''. In the map, the static mesh will become monochrome, but the smoothing and edges are not changed.

[[Image:Legacy_MS3DT-18.gif|center|FIG. 18 A monochrome shuriken shows smoothing &amp; edges clearly]]

This is an important aspect of the model &amp;ndash; once imported with separate material names to define smoothing, it doesn't matter what textures are actually assigned in UEd, the smoothing will be preserved. Thus, if a static mesh must have hard edges, but is planned to have only a single texture, multiple materials should be applied in MS3D to define smoothing and edges. Once imported into UEd, all Materials slots can be given the same texture.

Example: for a concrete-textured cube, three materials need be assigned in MS3D, one each for the opposing pairs of faces of the cube. 

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Applying File Textures In MS3D|Applying File Textures in MS3D]]</text>
    </revision>
    <revision>
      <id>5202</id>
      <timestamp>2003-10-23T00:28:16Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>finishing up</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Export and Import ===

Exporting models from MS3D for use as static meshes in UEd3 is very straightforward. UEd can import models in the LWO (Lightwave object) format, extension ''.lwo''. However, the MS3D Export menu roll-out has ''three'' LWO options &amp;ndash; my experience is that the one shown in FIG 13. works best when configured as shown. 

[[Image:Legacy_MS3D-LWOexport.gif|center|FIG. 13 LWO export options to use in MilkShape 3D]]

Note that ''ALL'' objects in a MilkShape model file are exported &amp;ndash; separate .lwo files must be made for each object to be imported as a separate static mesh in UEd.

The origin of the MS3D workspace will define the pivot point for static meshes made from MS3D models. This can be useful when building a complex assortment of objects that must fit together in UEd, but are exported as separate LWOs (e.g. the facades of a building, and its rooftop edge trim). After building the components to fit in MS3D, make separate files of each component for export, but do ''not'' move the objects in the component files. In UED the parts can be easily reassembled due to the common pivot point for all the component static meshes.

Use the options described above to export the shuriken model to filename ''shuriken.lwo''. Save the LWO export in any convenient directory.

Launch UEd3, and open the Textures browser. Prior to importing the LWO file as a static mesh, there ''MUST'' be textures present in the Texture browser with names that match the material names assigned to the model in MS3D. Any material name that is not found will be assigned Texture'Engine.DefaultTexture' (bleah!), and smoothing info based on material names may be lost.

In the Textures browser, use File&gt;Import to create a new texture; use '''Package: MilkShapeMaterials, Group: NamedMaterials''', and '''Name: hubs'''. Add textures named ''UpSUrf'' and ''DownSurf'' to this package and save it (FIG. 14).

[[Image:Legacy_MS3DT-14.gif|center|FIG. 14 Creating UEd textures named to match the MS3D material names.]]

Texture name spelling in UEd must exactly match those assigned in MS3D, but is not case-sensitive. The actual textures imported are irrelevant &amp;ndash; the same texture file could be used for all three differently named textures. Only the naming is important.

Switch to the Static Mesh browser. Use File&gt;Import to open the dialog, and select the ''shuriken.lwo'' file. Use '''Package: WikiTute_SM, Group: MS3Dmodels, Name: shuriken''', click OK.

[[Image:Legacy_MS3DT-15.gif|center|FIG. 15 Static mesh import dialogs]]

You will get the following Message dialog &amp;ndash; just click OK. 

[[Image:Legacy_MS3DT-16.gif|center|FIG. 16 LWO import warning]]

The warning is (afaik) because the materials used have no texture files associated with them as yet (this will be changed in Part 4 of the tutorial). The warning can be ignored &amp;ndash; it does not affect the import.

In the Static Mesh browser display, the shuriken should now be visible, and the Materials property section should list the three material names ''hubs'', ''UpSurf'', and ''DownSurf''. Textures on the model will reflect those you chose when creating the ''MilkShapeMaterials'' package.

[[Image:Legacy_MS3DT-17.gif|center|FIG 17. The imported shuriken model with assigned UEd textures]]

Save the ''WikiTute_SM'' static mesh package.

In the browser, the ''shuriken'' static mesh is Unlit and thus doesn't show the smoothing properly &amp;ndash; it has to be placed in a map with a lighting setup. Open (or create) a map with relatively bright and directional lighting (too dim &amp; flat a lighting scheme and the smoothing may be harder to see). Click the '''Insert Static Mesh in Level''' button to place ''shuriken'' at the current camera position, then pull back the camera in the 3D window.

Inspect ''shuriken'' from a number of viewpoints, noting that there is a visible hard-edge boundary between the ''hubs'', ''UpSurf'', and ''DownSurf'' sections &amp;ndash; the smoothing groups from MS3D have been preserved by assigning the three material names for export/import.

The edges may be difficult to see clearly if three differently-colored textures were created in the ''MilkShapeMaterials'' package. In the Textures browser, select one of the textures, preferably one not too light or dark. In the Static Mesh browser, assign this single material to all three '''Materials''' property slots for ''shuriken''. In the map, the static mesh will become monochrome, but the smoothing and edges are not changed.

[[Image:Legacy_MS3DT-18.gif|center|FIG. 18 A monochrome shuriken shows smoothing &amp; edges clearly]]

This is an important aspect of the model &amp;ndash; once imported with separate material names to define smoothing, it doesn't matter what textures are actually assigned in UEd, the smoothing will be preserved. Thus, if a static mesh must have hard edges, but is planned to have only a single texture, multiple materials should be applied in MS3D to define smoothing and edges. Once imported into UEd, all Materials slots can be given the same texture.

Example: for a concrete-textured cube, three materials need be assigned in MS3D, one each for the opposing pairs of faces of the cube. 

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Applying File Textures In MS3D|Applying File Textures in MS3D]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MilkShape For UT2003 Static Meshes/Materials And Smoothing For UEd3</title>
    <id>2137</id>
    <revision>
      <id>5203</id>
      <timestamp>2003-10-23T00:26:35Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>finishing up</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Materials &amp; Smoothing for UEd3 ===

Assigning materials properly in MS3D is essential for preserving the smooth or hard edges of the model when it is imported into UEd3. While modeling, using MS3D's Smoothing Groups tool provides necessary visual feedback. However, the smoothing groups applied in MS3D are essentially ignored; instead, UEd smooths surfaces of objects from MS3D on the basis of material names.

MilkShape materials need not reference a file texture, although that is an option which will be explained in the 4th part of this tutorial. Only material names need be exported with the model. These are easily set up in MilkShape.

Press Ctrl+Shift+A to deselect all. Switch to Groups tab. In the Groups list, highlight ''hubs'' and press the Groups box Select button. 

Switch to '''Materials''' tab. In the bottom set of buttons, click '''New'''. Rename ''Material01'' as ''hubs''. In the upper set of buttons, click '''Diffuse''' and select a color from the Color Picker that opens. Click '''Assign''' at the bottom of the Materials tab.

In the 3D window, ''hubs'' will reflect the color of the new material if '''Smooth Shaded''' is enabled for that viewport (right-click on a viewport to set the shading and other options).

Deselect all, then highlight and Select ''UpSurf'' in the Groups tab list. Using the procedure described, create a new material named ''UpSurf'' and Assign it to the ''UpSurf'' group. Use a different Diffuse color for material ''UpSurf''.

Repeat the procedure to Assign a new material to group ''DownSurf''. Name the new material ''DownSurf''.

[[Image:Legacy_MS3DT-12.gif|center|FIG. 12 Material assignments in MS3D]]

Note that the Materials list now echoes the Groups list, and recall that the Groups have been assigned different smoothing groups. This is the basic rule for assigning materials in MS3D to preserve smoothing groups in UEd3 (and the hard edges between them) &amp;ndash; each smoothing group must have a uniquely-named Material assigned to it. In UEd, smoothing is done on the basis of the Material names. For complex models, using material names that match those of the model's Groups helps keep things organized and intelligible.

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Export And Import|Export and Import]]</text>
    </revision>
    <revision>
      <id>5204</id>
      <timestamp>2003-10-23T00:08:26Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>new tute page -- in progress</comment>
      <text xml:space="preserve">{{innerbox||^'''THIS IS A WORK IN PROGRESS'''&lt;br /&gt;

}}

Please do not edit or restructure this page or its subpages until this notice has been removed. Comments during reconstruction are most welcome :)&lt;br /&gt;Thanks

----

{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Materials &amp; Smoothing for UEd3 ===

Assigning materials properly in MS3D is essential for preserving the smooth or hard edges of the model when it is imported into UEd3. While modeling, using MS3D's Smoothing Groups tool provides necessary visual feedback. However, the smoothing groups applied in MS3D are essentially ignored; instead, UEd smooths surfaces of objects from MS3D on the basis of material names.

MilkShape materials need not reference a file texture, although that is an option which will be explained in the 4th part of this tutorial. Only material names need be exported with the model. These are easily set up in MilkShape.

Press Ctrl+Shift+A to deselect all. Switch to Groups tab. In the Groups list, highlight ''hubs'' and press the Groups box Select button. 

Switch to '''Materials''' tab. In the bottom set of buttons, click '''New'''. Rename ''Material01'' as ''hubs''. In the upper set of buttons, click '''Diffuse''' and select a color from the Color Picker that opens. Click '''Assign''' at the bottom of the Materials tab.

In the 3D window, ''hubs'' will reflect the color of the new material if '''Smooth Shaded''' is enabled for that viewport (right-click on a viewport to set the shading and other options).

Deselect all, then highlight and Select ''UpSurf'' in the Groups tab list. Using the procedure described, create a new material named ''UpSurf'' and Assign it to the ''UpSurf'' group. Use a different Diffuse color for material ''UpSurf''.

Repeat the procedure to Assign a new material to group ''DownSurf''. Name the new material ''DownSurf''.

[[Image:Legacy_MS3DT-12.gif|center|FIG. 12 Material assignments in MS3D]]

Note that the Materials list now echoes the Groups list, and recall that the Groups have been assigned different smoothing groups. This is the basic rule for assigning materials in MS3D to preserve smoothing groups in UEd3 (and the hard edges between them) &amp;ndash; each smoothing group must have a uniquely-named Material assigned to it. In UEd, smoothing is done on the basis of the Material names. For complex models, using material names that match those of the model's Groups helps keep things organized and intelligible.

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Export And Import|Export and Import]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MilkShape For UT2003 Static Meshes/Modeling And Smoothing In MS3D</title>
    <id>2138</id>
    <revision>
      <id>5205</id>
      <timestamp>2005-12-27T15:32:27Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Modeling the shuriken ===

Launch MilkShape. Enable the '''Model''' tab. Enable the '''Cylinder''' tool button, enter '''Stacks''' = 4, '''Slices''' = 15 in the data entry fields. '''Close Cylinder''' should be checked.

In the Front viewport, place the pointer at X = -40, Y = 20, click LMB &amp; drag to X = 40, Y = -20.

In the '''Tools box''', enable '''Select'''. In the '''Select Options''' box, enable '''Vertex'''.

In the Front viewport, drag-select the vertices of the top surface (cap) of the cylinder (drag-select = LMB click &amp; drag to lasso the vertices). 

Add the vertices of the bottom cap to the selection (Shift + LMB drag-select adds vertices to the selection).

In the toolbox, enable '''Scale'''. In '''Scale Options''', disable the '''Y axis button'''. In the data entry fields, enter .30 in X and Z (.30 = 30% scale factor). Click the Scale button. The result is shown in FIG. 1

[[Image:Legacy_MS3DT-01.gif|center|FIG. 1 Scaling the caps' vertices]]

Enable Select (shortcut key = F1), Options = Vertex. In the Top viewport, drag-select the vertices on the circumference of the cylinder that are located at the 3 o'clock position. Using this position as 1, count vertices around the circumference (either direction) and add the vertices at counts 6 and 11 to the selection.

Scale (shortcut key = F4) the selected vertices .50 in X &amp; Z (FIG. 2).

[[Image:Legacy_MS3DT-02.gif|center|FIG. 2 Scaling down 3 circumference vertices]]

Counting from position 1 on the circumference, select vertices at 3, 8 and 13. Scale the vertices 1.5 in X &amp; Z (FIG. 3).

[[Image:Legacy_MS3DT-03.gif|center|FIG. 3 Scaling up 3 circumference vertices]]

Enable the '''Rotate''' tool (shortcut key = F3). Using the data entry fields, rotate the selected vertices -10 in Y (FIG. 4).

[[Image:Legacy_MS3DT-04.gif|center|FIG. 4 Rotating 3 circumference vertices]]

Counting from position 1 on the circumference, select vertices at 5, 10 and 15. Scale the vertices .73 in X &amp; Z. Rotate the vertices 10 in Y.

Counting from position 1 on the circumference, select vertices at 2, 7 and 12. Rotate the vertices -10 in Y.

Select vertices at 3, 8 and 13. With Rotate enabled, click LMB &amp; drag in the Top viewport to rotate vertices slightly counterclockwise. In like manner, select, rotate, and scale sets of vertices at every 5th count, until the top view of the model closely resembles FIG. 5.

[[Image:Legacy_MS3DT-05.gif|center|FIG. 5 Top view profile is taking shape]]

In the Left viewport, drag-select the vertices highlighted (red) in FIG. 6 and scale .50 in X &amp; Z. Select the vertices of the cylinder caps and scale .73 in X &amp; Z (FIG. 6).

[[Image:Legacy_MS3DT-06.gif|center|FIG. 6 Modeling in the Left viewport]]

Enable Select, Select Options=Face, and By Vertex is checked ( '''Select|Face|By Vertex''' ). Drag-select the top &amp; bottom cap vertices. The faces connected to these vertices will be highlighted (FIG. 7A).

[[Image:Legacy_MS3DT-07.gif|center|FIG 7. Selecting faces &amp; regrouping]]

Enable the '''Groups''' tab. Click the '''Regroup''' button. '''Rename''' ''Regroup 1'' to ''hubs'' (FIG. 7B).

Enable the Model tab. Enable '''Select|Face|By Vertex'''. In the Front viewport, drag-select the top two rows of vertices. The faces of the top half of the model will be highlighted.

Drag-'''de'''select the vertices of the top cap (drag-deselect = Shift + click &amp; drag with RMB). The faces just above the horizontal centerline of the model should be highlighted (FIG. 8A). Enable Groups, Regroup the faces, and rename them ''UpSurf'' (FIG. 8B).

[[Image:Legacy_MS3DT-08.gif|center|FIG. 8 Selecting &amp; regrouping more faces]]

Enable '''Model|Select|Face|By Vertex'''. As above, select the faces just below the model's horizontal centerline. Switch to the Groups tab, Regroup these faces and rename them ''DownSurf'' (FIG 9).

[[Image:Legacy_MS3DT-09.gif|center|FIG. 9 Remaining faces regrouped &amp; renamed]]

Click on the background of any ortho viewport (Front, Side or Top) to deselect all, or use the Shift+Ctrl+A shortcut. 

In the Groups list, highlight ''hubs'' and click the '''Select''' button in the '''Group''' box. Faces in the ''hubs'' group will be highlighted. 

In the '''Smoothing Groups''' box, enable the Assign button &amp; click on the square smoothing group button labeled 1. In the 3D viewport, the faces of group ''hubs'' will be smoothed.

Deselect all, then highlight ''UpSurf'' in the Groups list &amp; click Group|Select. In Smoothing Groups, assign smoothing group number 2 to ''UpSurf''.

Deselect all, then highlight ''DownSurf'' in the Groups list &amp; click Group|Select. In Smoothing Groups, assign smoothing group number 3 to ''DownSurf''.

[[Image:Legacy_MS3DT-10.gif|center|FIG. 11 Smoothing group assignments]]

There should now be hard (unsmoothed) edges between ''hubs'', ''UpSurf'' and ''DownSurf''.

Switch to Model, select all (Ctrl+A), and scale the entire model .30 in Y only (disable the X &amp; Z axis buttons). 

Enable '''Select|Vertex''' and in the Front viewport drag-select the vertices of the caps, then Scale then .73 in X &amp; Z.

In the Top viewport, drag-select the vertices at the origin (center of ''hubs''). Enable Scale in Y only, then LMB click + drag in the Front viewport to scale up the central vertices a small amount in Y, rounding the off the ''hubs'' slightly. The modeling is complete.

[[Image:Legacy_MS3DT-11.gif|center|FIG. 10 The finished model]]

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Materials And Smoothing For UEd3|Materials and Smoothing for UEd3]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5206</id>
      <timestamp>2003-10-23T00:14:38Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>new tute page -- in progress</comment>
      <text xml:space="preserve">{{innerbox||^'''THIS IS A WORK IN PROGRESS'''&lt;br /&gt;

}}

Please do not edit or restructure this page or its subpages until this notice has been removed. Comments during reconstruction are most welcome :)&lt;br /&gt;Thanks

----

{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Modeling the shuriken ===

Launch MilkShape. Enable the '''Model''' tab. Enable the '''Cylinder''' tool button, enter '''Stacks''' = 4, '''Slices''' = 15 in the data entry fields. '''Close Cylinder''' should be checked.

In the Front viewport, place the pointer at X = -40, Y = 20, click LMB &amp; drag to X = 40, Y = -20.

In the '''Tools box''', enable '''Select'''. In the '''Select Options''' box, enable '''Vertex'''.

In the Front viewport, drag-select the vertices of the top surface (cap) of the cylinder (drag-select = LMB click &amp; drag to lasso the vertices). 

Add the vertices of the bottom cap to the selection (Shift + LMB drag-select adds vertices to the selection).

In the toolbox, enable '''Scale'''. In '''Scale Options''', disable the '''Y axis button'''. In the data entry fields, enter .30 in X and Z (.30 = 30% scale factor). Click the Scale button. The result is shown in FIG. 1

[[Image:Legacy_MS3DT-01.gif|center|FIG. 1 Scaling the caps' vertices]]

Enable Select (shortcut key = F1), Options = Vertex. In the Top viewport, drag-select the vertices on the circumference of the cylinder that are located at the 3 o'clock position. Using this position as 1, count vertices around the circumference (either direction) and add the vertices at counts 6 and 11 to the selection.

Scale (shortcut key = F4) the selected vertices .50 in X &amp; Z (FIG. 2).

[[Image:Legacy_MS3DT-02.gif|center|FIG. 2 Scaling down 3 circumference vertices]]

Counting from position 1 on the circumference, select vertices at 3, 8 and 13. Scale the vertices 1.5 in X &amp; Z (FIG. 3).

[[Image:Legacy_MS3DT-03.gif|center|FIG. 3 Scaling up 3 circumference vertices]]

Enable the '''Rotate''' tool (shortcut key = F3). Using the data entry fields, rotate the selected vertices -10 in Y (FIG. 4).

[[Image:Legacy_MS3DT-04.gif|center|FIG. 4 Rotating 3 circumference vertices]]

Counting from position 1 on the circumference, select vertices at 5, 10 and 15. Scale the vertices .73 in X &amp; Z. Rotate the vertices 10 in Y.

Counting from position 1 on the circumference, select vertices at 2, 7 and 12. Rotate the vertices -10 in Y.

Select vertices at 3, 8 and 13. With Rotate enabled, click LMB &amp; drag in the Top viewport to rotate vertices slightly counterclockwise. In like manner, select, rotate, and scale sets of vertices at every 5th count, until the top view of the model closely resembles FIG. 5.

[[Image:Legacy_MS3DT-05.gif|center|FIG. 5 Top view profile is taking shape]]

In the Left viewport, drag-select the vertices highlighted (red) in FIG. 6 and scale .50 in X &amp; Z. Select the vertices of the cylinder caps and scale .73 in X &amp; Z (FIG. 6).

[[Image:Legacy_MS3DT-06.gif|center|FIG. 6 Modeling in the Left viewport]]

Enable Select, Select Options=Face, and By Vertex is checked ( '''Select|Face|By Vertex''' ). Drag-select the top &amp; bottom cap vertices. The faces connected to these vertices will be highlighted (FIG. 7A).

[[Image:Legacy_MS3DT-07.gif|center|FIG 7. Selecting faces &amp; regrouping]]

Enable the '''Groups''' tab. Click the '''Regroup''' button. '''Rename''' ''Regroup 1'' to ''hubs'' (FIG. 7B).

Enable the Model tab. Enable '''Select|Face|By Vertex'''. In the Front viewport, drag-select the top two rows of vertices. The faces of the top half of the model will be highlighted.

Drag-'''de'''select the vertices of the top cap (drag-deselect = Shift + click &amp; drag with RMB). The faces just above the horizontal centerline of the model should be highlighted (FIG. 8A). Enable Groups, Regroup the faces, and rename them ''UpSurf'' (FIG. 8B).

[[Image:Legacy_MS3DT-08.gif|center|FIG. 8 Selecting &amp; regrouping more faces]]

Enable '''Model|Select|Face|By Vertex'''. As above, select the faces just below the model's horizontal centerline. Switch to the Groups tab, Regroup these faces and rename them ''DownSurf'' (FIG 9).

[[Image:Legacy_MS3DT-09.gif|center|FIG. 9 Remaining faces regrouped &amp; renamed]]

Click on the background of any ortho viewport (Front, Side or Top) to deselect all, or use the Shift+Ctrl+A shortcut. 

In the Groups list, highlight ''hubs'' and click the '''Select''' button in the '''Group''' box. Faces in the ''hubs'' group will be highlighted. 

In the '''Smoothing Groups''' box, enable the Assign button &amp; click on the square smoothing group button labeled 1. In the 3D viewport, the faces of group ''hubs'' will be smoothed.

Deselect all, then highlight ''UpSurf'' in the Groups list &amp; click Group|Select. In Smoothing Groups, assign smoothing group number 2 to ''UpSurf''.

Deselect all, then highlight ''DownSurf'' in the Groups list &amp; click Group|Select. In Smoothing Groups, assign smoothing group number 3 to ''DownSurf''.

[[Image:Legacy_MS3DT-10.gif|center|FIG. 11 Smoothing group assignments]]

There should now be hard (unsmoothed) edges between ''hubs'', ''UpSurf'' and ''DownSurf''.

Switch to Model, select all (Ctrl+A), and scale the entire model .30 in Y only (disable the X &amp; Z axis buttons). 

Enable '''Select|Vertex''' and in the Front viewport drag-select the vertices of the caps, then Scale then .73 in X &amp; Z.

In the Top viewport, drag-select the vertices at the origin (center of ''hubs''). Enable Scale in Y only, then LMB click + drag in the Front viewport to scale up the central vertices a small amount in Y, rounding the off the ''hubs'' slightly. The modeling is complete.

[[Image:Legacy_MS3DT-11.gif|center|FIG. 10 The finished model]]

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Materials And Smoothing For UEd3|Materials and Smoothing for UEd3]]</text>
    </revision>
    <revision>
      <id>5207</id>
      <timestamp>2003-10-23T00:24:59Z</timestamp>
      <contributor>
        <ip>Chip</ip>
      </contributor>
      <comment>finishing up</comment>
      <text xml:space="preserve">{{innerbox|NOTE: The pictures in this tutorial do not show the interface elements to relative scale.

}}

===Modeling the shuriken ===

Launch MilkShape. Enable the '''Model''' tab. Enable the '''Cylinder''' tool button, enter '''Stacks''' = 4, '''Slices''' = 15 in the data entry fields. '''Close Cylinder''' should be checked.

In the Front viewport, place the pointer at X = -40, Y = 20, click LMB &amp; drag to X = 40, Y = -20.

In the '''Tools box''', enable '''Select'''. In the '''Select Options''' box, enable '''Vertex'''.

In the Front viewport, drag-select the vertices of the top surface (cap) of the cylinder (drag-select = LMB click &amp; drag to lasso the vertices). 

Add the vertices of the bottom cap to the selection (Shift + LMB drag-select adds vertices to the selection).

In the toolbox, enable '''Scale'''. In '''Scale Options''', disable the '''Y axis button'''. In the data entry fields, enter .30 in X and Z (.30 = 30% scale factor). Click the Scale button. The result is shown in FIG. 1

[[Image:Legacy_MS3DT-01.gif|center|FIG. 1 Scaling the caps' vertices]]

Enable Select (shortcut key = F1), Options = Vertex. In the Top viewport, drag-select the vertices on the circumference of the cylinder that are located at the 3 o'clock position. Using this position as 1, count vertices around the circumference (either direction) and add the vertices at counts 6 and 11 to the selection.

Scale (shortcut key = F4) the selected vertices .50 in X &amp; Z (FIG. 2).

[[Image:Legacy_MS3DT-02.gif|center|FIG. 2 Scaling down 3 circumference vertices]]

Counting from position 1 on the circumference, select vertices at 3, 8 and 13. Scale the vertices 1.5 in X &amp; Z (FIG. 3).

[[Image:Legacy_MS3DT-03.gif|center|FIG. 3 Scaling up 3 circumference vertices]]

Enable the '''Rotate''' tool (shortcut key = F3). Using the data entry fields, rotate the selected vertices -10 in Y (FIG. 4).

[[Image:Legacy_MS3DT-04.gif|center|FIG. 4 Rotating 3 circumference vertices]]

Counting from position 1 on the circumference, select vertices at 5, 10 and 15. Scale the vertices .73 in X &amp; Z. Rotate the vertices 10 in Y.

Counting from position 1 on the circumference, select vertices at 2, 7 and 12. Rotate the vertices -10 in Y.

Select vertices at 3, 8 and 13. With Rotate enabled, click LMB &amp; drag in the Top viewport to rotate vertices slightly counterclockwise. In like manner, select, rotate, and scale sets of vertices at every 5th count, until the top view of the model closely resembles FIG. 5.

[[Image:Legacy_MS3DT-05.gif|center|FIG. 5 Top view profile is taking shape]]

In the Left viewport, drag-select the vertices highlighted (red) in FIG. 6 and scale .50 in X &amp; Z. Select the vertices of the cylinder caps and scale .73 in X &amp; Z (FIG. 6).

[[Image:Legacy_MS3DT-06.gif|center|FIG. 6 Modeling in the Left viewport]]

Enable Select, Select Options=Face, and By Vertex is checked ( '''Select|Face|By Vertex''' ). Drag-select the top &amp; bottom cap vertices. The faces connected to these vertices will be highlighted (FIG. 7A).

[[Image:Legacy_MS3DT-07.gif|center|FIG 7. Selecting faces &amp; regrouping]]

Enable the '''Groups''' tab. Click the '''Regroup''' button. '''Rename''' ''Regroup 1'' to ''hubs'' (FIG. 7B).

Enable the Model tab. Enable '''Select|Face|By Vertex'''. In the Front viewport, drag-select the top two rows of vertices. The faces of the top half of the model will be highlighted.

Drag-'''de'''select the vertices of the top cap (drag-deselect = Shift + click &amp; drag with RMB). The faces just above the horizontal centerline of the model should be highlighted (FIG. 8A). Enable Groups, Regroup the faces, and rename them ''UpSurf'' (FIG. 8B).

[[Image:Legacy_MS3DT-08.gif|center|FIG. 8 Selecting &amp; regrouping more faces]]

Enable '''Model|Select|Face|By Vertex'''. As above, select the faces just below the model's horizontal centerline. Switch to the Groups tab, Regroup these faces and rename them ''DownSurf'' (FIG 9).

[[Image:Legacy_MS3DT-09.gif|center|FIG. 9 Remaining faces regrouped &amp; renamed]]

Click on the background of any ortho viewport (Front, Side or Top) to deselect all, or use the Shift+Ctrl+A shortcut. 

In the Groups list, highlight ''hubs'' and click the '''Select''' button in the '''Group''' box. Faces in the ''hubs'' group will be highlighted. 

In the '''Smoothing Groups''' box, enable the Assign button &amp; click on the square smoothing group button labeled 1. In the 3D viewport, the faces of group ''hubs'' will be smoothed.

Deselect all, then highlight ''UpSurf'' in the Groups list &amp; click Group|Select. In Smoothing Groups, assign smoothing group number 2 to ''UpSurf''.

Deselect all, then highlight ''DownSurf'' in the Groups list &amp; click Group|Select. In Smoothing Groups, assign smoothing group number 3 to ''DownSurf''.

[[Image:Legacy_MS3DT-10.gif|center|FIG. 11 Smoothing group assignments]]

There should now be hard (unsmoothed) edges between ''hubs'', ''UpSurf'' and ''DownSurf''.

Switch to Model, select all (Ctrl+A), and scale the entire model .30 in Y only (disable the X &amp; Z axis buttons). 

Enable '''Select|Vertex''' and in the Front viewport drag-select the vertices of the caps, then Scale then .73 in X &amp; Z.

In the Top viewport, drag-select the vertices at the origin (center of ''hubs''). Enable Scale in Y only, then LMB click + drag in the Front viewport to scale up the central vertices a small amount in Y, rounding the off the ''hubs'' slightly. The modeling is complete.

[[Image:Legacy_MS3DT-11.gif|center|FIG. 10 The finished model]]

Next: [[Legacy:MilkShape For UT2003 Static Meshes/Materials And Smoothing For UEd3|Materials and Smoothing for UEd3]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mind Reader</title>
    <id>1834</id>
    <revision>
      <id>4503</id>
      <timestamp>2005-11-16T21:46:25Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a UT mutator. In UT200x you can use the [[Legacy:ShowDebug|ShowDebug]] [[Legacy:Console Commands|console command]] while spectating a bot to see the bot's goals.

==Description==

Ever wonder why bots do what they do? Especially when you think they should be doing something else? This mutator will allow you to explore the inner workings of a bot's mind. This mutator  lets you discover things like, are they picking the right spots to defend? Why do they go there? How are my paths working?

The best way to use this mutator is as a spectator,  otherwise you'll be too busy shooting to make use of it. You can use it in the regular flying-camera mode, or by switching to spy on individual bots. If you do the flying-camera thing, then you'll get data on whatever bot you're looking at, as an extension of the player name that always pops up when you look at someone.&lt;br /&gt;

The Mindreader Mutator can be used to diagnose pathnoding problems with BOTs. The following information is displayed on the viewing screen, in game, when the Mindreader Mutator is selected before loading a level:&lt;br&gt;

*''State'' Every object in UnrealScript has states; bots have states like Fallback, Retreat, Falling, and Dying. 
*''Move Target'' This is usually the nearest pathnode that the bot is moving towards, and it can also be an item that the bot is about to pick up. 
*''Enemy'' Whoever the bot's designated target is. 
*''Orders'' Defending, Attacking, Following, etc. 
*''Real Orders'' The actual orders that have been given to a bot. This can sometimes be different from it's working orders. For example, if it's told to defend, but there's nothing to defend, it may decide to do something else for the time being. 
*''Order Object'' The thing or player the bot was told to defend, or follow, or whatever. 
*''Goal'' This text string is updated sporadically as a general indicator of what the bot is doing. It often becomes obsolete long before it gets updated, but it still can be useful. 

Also, other indications of potential BOT navigation are given, as follows:

* ''Red crosshairs''  Enemy  
* ''Green box''  Order Object - Remember this could be a player or it could be a thing. 
* ''Blue box''  Move Target - This is usually a pathnode, which you otherwise can't see. It may also be an item that the bot wants to pick up, or the player that the bot is following. 
* ''Blue cross''  Destination - The location that the bot is trying to reach. Usually the location of the Move Target, unless the bot is doing Evasive/Tactical maneuvers. 
* ''Yellow boxes''  Route Cache - The pathnodes that make up the route that the bot is following. 

==Link to the Mind Reader Mutator ==

[http://www.uncommonplace.com/games/mindreader.html Mindreader Mutator, Version 1.1]

==Discussion==

'''Uncommon:''' I do plan to eventually make a UT2003/2004 version of this. The ShowDebug command does give you the same info, but it also hides the HUD and fills the screen with lots of other stuff you (or at least I) don't normally need to know. I think it would also be good if the path wasn't obscured by map geometry.

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4504</id>
      <timestamp>2004-05-10T17:04:50Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a UT mutator. In UT200x you can use the DrawDebug [[Legacy:Console Commands|console commands]] while spectating a bot to see the bot's goals.

: stupid question, but how do you spectate a bot??
: Go to Options -&gt; Player Setup, and check the box marked &quot;play as spectator.&quot;  In the next game you play, you'll be in Spectator Mode.  Left-click to cycle through all the bots and player's cameras, or right-click to fly around the map.

==Description==

Ever wonder why bots do what they do? Especially when you think they should be doing something else? This mutator will allow you to explore the inner workings of a bot's mind. This mutator  lets you discover things like, are they picking the right spots to defend? Why do they go there? How are my paths working?

The best way to use this mutator is as a spectator,  otherwise you'll be too busy shooting to make use of it. You can use it in the regular flying-camera mode, or by switching to spy on individual bots. If you do the flying-camera thing, then you'll get data on whatever bot you're looking at, as an extension of the player name that always pops up when you look at someone.&lt;br /&gt;

The Mindreader Mutator can be used to diagnose pathnoding problems with BOTs. The following information is displayed on the viewing screen, in game, when the Mindreader Mutator is selected before loading a level:&lt;br&gt;

*''State'' Every object in UnrealScript has states; bots have states like Fallback, Retreat, Falling, and Dying. 
*''Move Target'' This is usually the nearest pathnode that the bot is moving towards, and it can also be an item that the bot is about to pick up. 
*''Enemy'' Whoever the bot's designated target is. 
*''Orders'' Defending, Attacking, Following, etc. 
*''Real Orders'' The actual orders that have been given to a bot. This can sometimes be different from it's working orders. For example, if it's told to defend, but there's nothing to defend, it may decide to do something else for the time being. 
*''Order Object'' The thing or player the bot was told to defend, or follow, or whatever. 
*''Goal'' This text string is updated sporadically as a general indicator of what the bot is doing. It often becomes obsolete long before it gets updated, but it still can be useful. 

Also, other indications of potential BOT navigation are given, as follows:

* ''Red crosshairs''  Enemy  
* ''Green box''  Order Object - Remember this could be a player or it could be a thing. 
* ''Blue box''  Move Target - This is usually a pathnode, which you otherwise can't see. It may also be an item that the bot wants to pick up, or the player that the bot is following. 
* ''Blue cross''  Destination - The location that the bot is trying to reach. Usually the location of the Move Target, unless the bot is doing Evasive/Tactical maneuvers. 
* ''Yellow boxes''  Route Cache - The pathnodes that make up the route that the bot is following. 

==Link to the Mind Reader Mutator ==

[http://www.uncommonplace.com/games/mindreader.html Mindreader Mutator, Version 1.1]

'''Uncommon:''' I do plan to eventually make a UT2003/2004 version of this. The ShowDebug command does give you the same info, but it also hides the HUD and fills the screen with lots of other stuff you (or at least I) don't normally need to know. I think it would also be good if the path wasn't obscured by map geometry.</text>
    </revision>
    <revision>
      <id>4505</id>
      <timestamp>2004-05-11T09:16:30Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a UT mutator. In UT200x you can use the [[Legacy:ShowDebug|ShowDebug]] [[Legacy:Console Commands|console command]] while spectating a bot to see the bot's goals.

==Description==

Ever wonder why bots do what they do? Especially when you think they should be doing something else? This mutator will allow you to explore the inner workings of a bot's mind. This mutator  lets you discover things like, are they picking the right spots to defend? Why do they go there? How are my paths working?

The best way to use this mutator is as a spectator,  otherwise you'll be too busy shooting to make use of it. You can use it in the regular flying-camera mode, or by switching to spy on individual bots. If you do the flying-camera thing, then you'll get data on whatever bot you're looking at, as an extension of the player name that always pops up when you look at someone.&lt;br /&gt;

The Mindreader Mutator can be used to diagnose pathnoding problems with BOTs. The following information is displayed on the viewing screen, in game, when the Mindreader Mutator is selected before loading a level:&lt;br&gt;

*''State'' Every object in UnrealScript has states; bots have states like Fallback, Retreat, Falling, and Dying. 
*''Move Target'' This is usually the nearest pathnode that the bot is moving towards, and it can also be an item that the bot is about to pick up. 
*''Enemy'' Whoever the bot's designated target is. 
*''Orders'' Defending, Attacking, Following, etc. 
*''Real Orders'' The actual orders that have been given to a bot. This can sometimes be different from it's working orders. For example, if it's told to defend, but there's nothing to defend, it may decide to do something else for the time being. 
*''Order Object'' The thing or player the bot was told to defend, or follow, or whatever. 
*''Goal'' This text string is updated sporadically as a general indicator of what the bot is doing. It often becomes obsolete long before it gets updated, but it still can be useful. 

Also, other indications of potential BOT navigation are given, as follows:

* ''Red crosshairs''  Enemy  
* ''Green box''  Order Object - Remember this could be a player or it could be a thing. 
* ''Blue box''  Move Target - This is usually a pathnode, which you otherwise can't see. It may also be an item that the bot wants to pick up, or the player that the bot is following. 
* ''Blue cross''  Destination - The location that the bot is trying to reach. Usually the location of the Move Target, unless the bot is doing Evasive/Tactical maneuvers. 
* ''Yellow boxes''  Route Cache - The pathnodes that make up the route that the bot is following. 

==Link to the Mind Reader Mutator ==

[http://www.uncommonplace.com/games/mindreader.html Mindreader Mutator, Version 1.1]

'''Uncommon:''' I do plan to eventually make a UT2003/2004 version of this. The ShowDebug command does give you the same info, but it also hides the HUD and fills the screen with lots of other stuff you (or at least I) don't normally need to know. I think it would also be good if the path wasn't obscured by map geometry.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MiniAmmo</title>
    <id>1784</id>
    <revision>
      <id>4378</id>
      <timestamp>2008-02-08T08:25:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; MiniAmmo (Package: BotPack)}}

Ammo for the UT Minigun ([[Legacy:Minigun2|Minigun2]]) and the [[Legacy:Enforcer|Enforcer]]. Both weapons take their ammo from the same supply, so with only a small amount of ammo it might be better to use the Enforcer since it does 17 points of damage while the Minigun only does 9-15 points. Each pickup gives 50 rounds with a maximum capacity of 199 rounds.

The subclass EClip only gives 20 rounds.

==Known Subclasses==
* EClip

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4379</id>
      <timestamp>2008-02-08T02:50:47Z</timestamp>
      <contributor>
        <ip>Cpe-75-80-151-39.san.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">lulz gone</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MiniHealthPack</title>
    <id>2123</id>
    <revision>
      <id>5171</id>
      <timestamp>2003-10-05T20:38:45Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:TournamentPickup|TournamentPickup]] &gt;&gt; [[Legacy:TournamentHealth|TournamentHealth]] &gt;&gt; MiniHealthPack (Package: XPickups)}}

'''''UT2003, Build 2225'''

&lt;uscript&gt;
//=============================================================================
// MiniHealthPack
//=============================================================================
class MiniHealthPack extends TournamentHealth; // our class and it's parent (TournamentHealth)

// This 'todo' comment is actually in the final code! Obviously, the sound effect has been added, though no 
// EXEC line is here to load a Sounds package. Perhaps someone else can comment on this.

// todo: need custom sound effect for this!

defaultproperties
{
    MaxDesireability=0.3
    PickupMessage=&quot;You picked up a Health Vial +&quot;   // the on-screen message when you pick up the vial.
    bSuperHeal=true          
    Physics=PHYS_Rotating                           // why they would bother rotating a perfect cylinder I'm not sure...
    RotationRate=(Yaw=24000)                        // this is the rate that the vial rotates at
    DrawScale=0.06                                  // the model is much larger than it appears as in the game. This scales it down.
    PickupSound=sound'PickupSounds.HealthPack'      // the sound you hear when you pick it up.
    PickupForce=&quot;HealthPack&quot;  // jdf
    DrawType=DT_StaticMesh                          // if you want to use a static mesh for the object, you have to tell the engine.
    StaticMesh=StaticMesh'XPickups_rc.MiniHealthPack' // this is the particular static mesh we want to use.
    CollisionRadius=24.0                            // determines how close to the object you must be to pick it up.
    HealingAmount=5                                 // how much healing it does.
    Style=STY_AlphaZ
    ScaleGlow=0.6
}
&lt;/uscript&gt;

The Health pickup line of classes aren't very big or complicated, they get most of their functionality from the [[Legacy:TournamentPickup|TournamentPickup]] and [[Legacy:Pickup|Pickup]] classes.

===Subclasses===
*None

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Miniammo</title>
    <id>2229</id>
    <revision>
      <id>5395</id>
      <timestamp>2006-02-21T10:56:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>redirect to MiniAmmo</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:MiniAmmo|MiniAmmo]]</text>
    </revision>
    <revision>
      <id>5396</id>
      <timestamp>2006-02-20T22:23:08Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; [[Legacy:Pickup (UT)|Pickup (UT)]] &gt;&gt; [[Legacy:Ammo (UT)|Ammo (UT)]] &gt;&gt; [[Legacy:TournamentAmmo|TournamentAmmo]] &gt;&gt; Miniammo (Package: )}}

This contains the ammo for the Minigun and Enforcer weapons. It contains 50 bullets and maxes at 199.

==Properties==

==Functions==

==Related Topics==

==Discussion==

'''SuperApe:''' Edits to show basic class page subsections.  [[Legacy:MiniAmmo|MiniAmmo]] page already exists.  Delete Me tag added.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Minigun</title>
    <id>2116</id>
    <revision>
      <id>5154</id>
      <timestamp>2005-11-18T21:06:58Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; Minigun (Package: xWeapons)}}

This is the Minigun class.  The UT2003 code can be found under [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]].  The code is useful for when you are creating a weapon with a charge-up time.

==Related Topics==
* [[Legacy:MinigunAmmo|MinigunAmmo]]
* [[Legacy:MinigunPickup|MinigunPickup]]
* [[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]
* [[Legacy:MinigunFire|MinigunFire]]
* [[Legacy:MinigunAltFire|MinigunAltFire]]
* [[Legacy:MinigunAttachment|MinigunAttachment]]
* [[Legacy:Weapon|Weapon]]
* [[Legacy:Pickup|Pickup]]
* [[Legacy:Code References|Code References]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5155</id>
      <timestamp>2003-10-05T23:24:38Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; Minigun (Package: xWeapons)}}

----

This is the Minigun class.  The UT2003 code can be found under [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]].  The code is useful for when you are creating a weapon with a charge-up time.

==Comments==</text>
    </revision>
    <revision>
      <id>5156</id>
      <timestamp>2004-10-09T10:52:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; Minigun (Package: xWeapons)}}

This is the Minigun class.  The UT2003 code can be found under [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]].  The code is useful for when you are creating a weapon with a charge-up time.

==Related Topics==

[[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]

[[Legacy:MinigunFire|MinigunFire]]

[[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:MinigunAttachment|MinigunAttachment]]

[[Legacy:Weapon|Weapon]]

[[Legacy:Pickup|Pickup]]

[[Legacy:Code References|Code References]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Minigun/Script</title>
    <id>2125</id>
    <revision>
      <id>5174</id>
      <timestamp>2004-10-09T10:53:01Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:Weapon|Weapon]] &gt;&gt; Minigun (commented UnrealScript code)}}

This is a reference to the Minigun code in case you can't understand the code.  All the remarks you see in the code will be done by me.  It's a good reference for various guns that fire rapidly and have charge-up times.

&lt;uscript&gt;
//=============================================================================
// Minigun  // This is the name of the weapon.
//=============================================================================
class Minigun extends Weapon  //The class is the type of weapon, while the extends is used to refer the code to a specific type of actor
    config(user);  // This says that there are variables here that get their values from the user.ini file.

// The InterfaceContent.utx file contains all the icons for all the weapons. The following line loads the file so we can get to the icon for our minigun.
#EXEC OBJ LOAD FILE=InterfaceContent.utx

var     float           CurrentRoll;
var     float           RollSpeed;
//var     float           FireTime;
var() xEmitter          ShellCaseEmitter;
var() vector            AttachLoc;
var() rotator           AttachRot;
var   int               CurrentMode;
var() float             GearRatio;
var() float             GearOffset;
var() float             Blend;
//These are the variables used in the code

simulated function PostBeginPlay()  //Says to start code after play begins
{
    Super.PostBeginPlay();

    if ( Level.NetMode == NM_DedicatedServer )
        return;

    ShellCaseEmitter = spawn(class'ShellSpewer');
	if ( ShellCaseEmitter != None )
	{
		ShellCaseEmitter.Trigger(Self, Instigator);
		AttachToBone(ShellCaseEmitter, 'shell');
	} //This says if the ShellCaseEmitter variable is not zero then the minigun will create an emitter to expel the shells when you fire
}

function DropFrom(vector StartLocation)
{
	local Ammunition AssaultAmmo; // This creates a local instance of Assault Rifle ammunition.
	local Weapon AssaultRifle;    // This creates a local instance of an Assault Rifle.
                                      // Both of these will be used in the following lines, but will be &quot;destroyed&quot; when the function ends.
	
	Super.DropFrom(StartLocation);
	if ( (Instigator != None) &amp;&amp; (Instigator.Health &gt; 0) ) 
	{
		
		AssaultAmmo = Ammunition(Instigator.FindInventoryType(class'MinigunAmmo'));
		if ( AssaultAmmo == None )
		{
			AssaultAmmo = spawn(class'MinigunAmmo',Instigator);
			AssaultAmmo.GiveTo( Instigator, None );
		} //This is the code to cause the ammo to be shared with the Assualt Rifle
		AssaultAmmo.AmmoAmount = 0;
		AssaultRifle = Weapon(Instigator.FindInventoryType(class'AssaultRifle'));
		if ( AssaultRifle != None )
			AssaultRifle.Ammo[0] = AssaultAmmo;
	}	
}

simulated function OutOfAmmo()
{
    if ( !Instigator.IsLocallyControlled() || HasAmmo() )
        return;

	Instigator.AmbientSound = None;
    DoAutoSwitch();
} //This says if a minigun runs out of ammo the weapon will autoswitch

simulated function Destroyed()
{
    if (ShellCaseEmitter != None)
    {
        ShellCaseEmitter.Destroy();
        ShellCaseEmitter = None;
    }

    Super.Destroyed();
}

BotFire() //Initiates this section of code when a bot fires.
function bool BotFire(bool bFinished, optional name FiringMode)
{
    local int newmode;
    local Controller C;

    C = Instigator.Controller;
	newMode = BestMode();

	if ( newMode == 0 )
	{
		C.bFire = 1;
		C.bAltFire = 0;
	}
	else
	{
		C.bFire = 0;
		C.bAltFire = 1;
	}

	if ( bFinished )
		return true;

    if ( FireMode[BotMode].bIsFiring &amp;&amp; (NewMode != BotMode) )
		StopFire(BotMode);

    if ( !ReadyToFire(newMode) || ClientState != WS_ReadyToFire )
		return false;

    BotMode = NewMode;
    StartFire(NewMode);
    return true;
} //Allows the bots to change firing mode when using the minigun

//This is the AI Interface
function float GetAIRating()
{
	return AIRating * FMin(Pawn(Owner).DamageScaling, 1.5);
}

BestMode()
function byte BestMode()
{
	local float EnemyDist;
	local bot B;

	B = Bot(Instigator.Controller);
	if ( (B == None) || (B.Enemy == None) )
		return 0;

	if ( FireMode[0].bIsFiring )
		return 0;
	else if ( FireMode[1].bIsFiring )
		return 1;
	EnemyDist = VSize(B.Enemy.Location - Instigator.Location);
	if ( EnemyDist &lt; 2000 )
		return 0;
	return 1;
} //This section is used to choose the best firing mode for the bots

simulated function SpawnShells(float amountPerSec)
{
    if(ShellCaseEmitter == None || !FirstPersonView())
        return;
	if ( Bot(Instigator.Controller) != None )
	{
		ShellCaseEmitter.Destroy();
		return;
	}

	ShellCaseEmitter.mRegenRange[0] = amountPerSec;
	ShellCaseEmitter.mRegenRange[1] = amountPerSec;
    ShellCaseEmitter.Trigger(self, Instigator);
} //This is the code for the amount of shells spawned per sec

simulated function bool FirstPersonView()
{
    return (Instigator.IsLocallyControlled() &amp;&amp; (PlayerController(Instigator.Controller) != None) &amp;&amp; !PlayerController(Instigator.Controller).bBehindView);
}

//This next section prevents the wrong animations from playing
simulated function AnimEnd(int channel)
{
}

// This is client side only: It updates the first person barrel rotation
simulated function UpdateRoll(float dt, float speed, int mode)
{
    local rotator r;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mode == CurrentMode) // to limit to one mode
    {
       // log(self$&quot; updateroll (mode=&quot;$mode$&quot;) speed=&quot;$speed);

        RollSpeed = speed;
        CurrentRoll += dt*RollSpeed;
        CurrentRoll = CurrentRoll % 65536.f;
        r.Roll = int(CurrentRoll);
        SetBoneRotation('Bone Barrels', r, 0, Blend);

        r.Roll = GearOffset + r.Roll*GearRatio;
        SetBoneRotation('Bone gear', r, 0, Blend);
    }
}

simulated function bool StartFire(int mode)
{
    local bool bStart;

	if ( !MinigunFire(FireMode[0]).IsIdle() || !MinigunFire(FireMode[1]).IsIdle() )
		return false;

    bStart = Super.StartFire(mode);
    if (bStart)
        FireMode[mode].StartFiring();

    return bStart;
} // If this function returns True, the weapon will start firing, if it returns False, it won't.

// This section allows fire modes to return to idle on weapon switch 
(simulated function DetachFromPawn(Pawn P)
{
    ReturnToIdle();

    Super.DetachFromPawn(P);
}

simulated function bool PutDown()
{
    ReturnToIdle();

    return Super.PutDown();
}

simulated function ReturnToIdle()
{
    local int mode;

    for (mode=0; mode&lt;NUM_FIRE_MODES; mode++)
    {
        if (FireMode[mode] != None)
        {
            FireMode[mode].GotoState('Idle');
        }
    }
}

defaultproperties // These are the default properties of each variable. Some were created at the top of this file, others are inherited from the weapon's parent class.
{
     AttachLoc=(X=-77.000000,Y=6.000000,Z=4.000000) // Where the model attachs
     AttachRot=(Pitch=22000,Yaw=-16384) // The rotation it is at
     GearRatio=-2.370000
     Blend=1.000000
     FireModeClass(0)=Class'XWeapons.MinigunFire'    // Firing mode 1 (Primary)
     FireModeClass(1)=Class'XWeapons.MinigunAltFire' // Firing mode 2 (Alt/Secondary)
     PutDownAnim=&quot;PutDown&quot;
     SelectSound=Sound'WeaponSounds.Minigun.SwitchToMiniGun' // The Sound that is played when you switch to this weapon.
     SelectForce=&quot;SwitchToMiniGun&quot;
     AIRating=0.710000
     CurrentRating=0.710000
     EffectOffset=(X=100.000000,Y=18.000000,Z=-16.000000)
     DisplayFOV=60.000000
     Priority=7
     DefaultPriority=7
     HudColor=(B=255)
     SmallViewOffset=(X=8.000000,Y=1.000000,Z=-2.000000)
     CenteredOffsetY=-6.000000
     CenteredRoll=0
     CenteredYaw=-500
     InventoryGroup=6 // The inventory group used (i.e. the number you press to reach the gun)
     PickupClass=Class'XWeapons.MinigunPickup' // The MinigunPickup class defines the weapon the way it sits on the ground.
     PlayerViewOffset=(X=2.000000,Y=-1.000000)
     PlayerViewPivot=(Yaw=500)
     BobDamping=2.250000
     AttachmentClass=Class'XWeapons.MinigunAttachment'
     IconMaterial=Texture'InterfaceContent.HUD.SkinA'
     IconCoords=(X1=200,Y1=372,X2=321,Y2=462)
     ItemName=&quot;Minigun&quot; // The name!

     LightType=LT_Pulse             // Any of the excellent lighting tutorials
     LightEffect=LE_NonIncidence    // at the Wiki and around the web can 
     LightBrightness=150.000000     // detail what these light properties
     LightRadius=4.000000           // are. They are the same properties that 
     LightHue=30                    // you would set on a light on your map.
     LightSaturation=150            // If you look closely on a dark map you'll 
     LightPeriod=3                  // notice that all the weapons actually give off a pulse light.

     Mesh=SkeletalMesh'Weapons.Minigun_1st' // The skeletal mesh of the model
     DrawScale=0.400000
     UV2Texture=Shader'XGameShaders.WeaponShaders.WeaponEnvShader'
     SoundRadius=400.000000 // The radius of the minigun sounds
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>5175</id>
      <timestamp>2003-10-13T22:14:31Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

This is a reference to the Minigun code in case you can't understand the code.  All the remarks you see in the code will be done by me.  It's a good reference for various guns that fire rapidly and have charge-up times.

&lt;uscript&gt;
//=============================================================================
// Minigun  // This is the name of the weapon.
//=============================================================================
class Minigun extends Weapon  //The class is the type of weapon, while the extends is used to refer the code to a specific type of actor
    config(user);  // This says that there are variables here that get their values from the user.ini file.

// The InterfaceContent.utx file contains all the icons for all the weapons. The following line loads the file so we can get to the icon for our minigun.
#EXEC OBJ LOAD FILE=InterfaceContent.utx

var     float           CurrentRoll;
var     float           RollSpeed;
//var     float           FireTime;
var() xEmitter          ShellCaseEmitter;
var() vector            AttachLoc;
var() rotator           AttachRot;
var   int               CurrentMode;
var() float             GearRatio;
var() float             GearOffset;
var() float             Blend;
//These are the variables used in the code

simulated function PostBeginPlay()  //Says to start code after play begins
{
    Super.PostBeginPlay();

    if ( Level.NetMode == NM_DedicatedServer )
        return;

    ShellCaseEmitter = spawn(class'ShellSpewer');
	if ( ShellCaseEmitter != None )
	{
		ShellCaseEmitter.Trigger(Self, Instigator);
		AttachToBone(ShellCaseEmitter, 'shell');
	} //This says if the ShellCaseEmitter variable is not zero then the minigun will create an emitter to expel the shells when you fire
}

function DropFrom(vector StartLocation)
{
	local Ammunition AssaultAmmo; // This creates a local instance of Assault Rifle ammunition.
	local Weapon AssaultRifle;    // This creates a local instance of an Assault Rifle.
                                      // Both of these will be used in the following lines, but will be &quot;destroyed&quot; when the function ends.
	
	Super.DropFrom(StartLocation);
	if ( (Instigator != None) &amp;&amp; (Instigator.Health &gt; 0) ) 
	{
		
		AssaultAmmo = Ammunition(Instigator.FindInventoryType(class'MinigunAmmo'));
		if ( AssaultAmmo == None )
		{
			AssaultAmmo = spawn(class'MinigunAmmo',Instigator);
			AssaultAmmo.GiveTo( Instigator, None );
		} //This is the code to cause the ammo to be shared with the Assualt Rifle
		AssaultAmmo.AmmoAmount = 0;
		AssaultRifle = Weapon(Instigator.FindInventoryType(class'AssaultRifle'));
		if ( AssaultRifle != None )
			AssaultRifle.Ammo[0] = AssaultAmmo;
	}	
}

simulated function OutOfAmmo()
{
    if ( !Instigator.IsLocallyControlled() || HasAmmo() )
        return;

	Instigator.AmbientSound = None;
    DoAutoSwitch();
} //This says if a minigun runs out of ammo the weapon will autoswitch

simulated function Destroyed()
{
    if (ShellCaseEmitter != None)
    {
        ShellCaseEmitter.Destroy();
        ShellCaseEmitter = None;
    }

    Super.Destroyed();
}

BotFire() //Initiates this section of code when a bot fires.
function bool BotFire(bool bFinished, optional name FiringMode)
{
    local int newmode;
    local Controller C;

    C = Instigator.Controller;
	newMode = BestMode();

	if ( newMode == 0 )
	{
		C.bFire = 1;
		C.bAltFire = 0;
	}
	else
	{
		C.bFire = 0;
		C.bAltFire = 1;
	}

	if ( bFinished )
		return true;

    if ( FireMode[BotMode].bIsFiring &amp;&amp; (NewMode != BotMode) )
		StopFire(BotMode);

    if ( !ReadyToFire(newMode) || ClientState != WS_ReadyToFire )
		return false;

    BotMode = NewMode;
    StartFire(NewMode);
    return true;
} //Allows the bots to change firing mode when using the minigun

//This is the AI Interface
function float GetAIRating()
{
	return AIRating * FMin(Pawn(Owner).DamageScaling, 1.5);
}

BestMode()
function byte BestMode()
{
	local float EnemyDist;
	local bot B;

	B = Bot(Instigator.Controller);
	if ( (B == None) || (B.Enemy == None) )
		return 0;

	if ( FireMode[0].bIsFiring )
		return 0;
	else if ( FireMode[1].bIsFiring )
		return 1;
	EnemyDist = VSize(B.Enemy.Location - Instigator.Location);
	if ( EnemyDist &lt; 2000 )
		return 0;
	return 1;
} //This section is used to choose the best firing mode for the bots

simulated function SpawnShells(float amountPerSec)
{
    if(ShellCaseEmitter == None || !FirstPersonView())
        return;
	if ( Bot(Instigator.Controller) != None )
	{
		ShellCaseEmitter.Destroy();
		return;
	}

	ShellCaseEmitter.mRegenRange[0] = amountPerSec;
	ShellCaseEmitter.mRegenRange[1] = amountPerSec;
    ShellCaseEmitter.Trigger(self, Instigator);
} //This is the code for the amount of shells spawned per sec

simulated function bool FirstPersonView()
{
    return (Instigator.IsLocallyControlled() &amp;&amp; (PlayerController(Instigator.Controller) != None) &amp;&amp; !PlayerController(Instigator.Controller).bBehindView);
}

//This next section prevents the wrong animations from playing
simulated function AnimEnd(int channel)
{
}

// This is client side only: It updates the first person barrel rotation
simulated function UpdateRoll(float dt, float speed, int mode)
{
    local rotator r;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mode == CurrentMode) // to limit to one mode
    {
       // log(self$&quot; updateroll (mode=&quot;$mode$&quot;) speed=&quot;$speed);

        RollSpeed = speed;
        CurrentRoll += dt*RollSpeed;
        CurrentRoll = CurrentRoll % 65536.f;
        r.Roll = int(CurrentRoll);
        SetBoneRotation('Bone Barrels', r, 0, Blend);

        r.Roll = GearOffset + r.Roll*GearRatio;
        SetBoneRotation('Bone gear', r, 0, Blend);
    }
}

simulated function bool StartFire(int mode)
{
    local bool bStart;

	if ( !MinigunFire(FireMode[0]).IsIdle() || !MinigunFire(FireMode[1]).IsIdle() )
		return false;

    bStart = Super.StartFire(mode);
    if (bStart)
        FireMode[mode].StartFiring();

    return bStart;
} // If this function returns True, the weapon will start firing, if it returns False, it won't.

// This section allows fire modes to return to idle on weapon switch 
(simulated function DetachFromPawn(Pawn P)
{
    ReturnToIdle();

    Super.DetachFromPawn(P);
}

simulated function bool PutDown()
{
    ReturnToIdle();

    return Super.PutDown();
}

simulated function ReturnToIdle()
{
    local int mode;

    for (mode=0; mode&lt;NUM_FIRE_MODES; mode++)
    {
        if (FireMode[mode] != None)
        {
            FireMode[mode].GotoState('Idle');
        }
    }
}

defaultproperties // These are the default properties of each variable. Some were created at the top of this file, others are inherited from the weapon's parent class.
{
     AttachLoc=(X=-77.000000,Y=6.000000,Z=4.000000) // Where the model attachs
     AttachRot=(Pitch=22000,Yaw=-16384) // The rotation it is at
     GearRatio=-2.370000
     Blend=1.000000
     FireModeClass(0)=Class'XWeapons.MinigunFire'    // Firing mode 1 (Primary)
     FireModeClass(1)=Class'XWeapons.MinigunAltFire' // Firing mode 2 (Alt/Secondary)
     PutDownAnim=&quot;PutDown&quot;
     SelectSound=Sound'WeaponSounds.Minigun.SwitchToMiniGun' // The Sound that is played when you switch to this weapon.
     SelectForce=&quot;SwitchToMiniGun&quot;
     AIRating=0.710000
     CurrentRating=0.710000
     EffectOffset=(X=100.000000,Y=18.000000,Z=-16.000000)
     DisplayFOV=60.000000
     Priority=7
     DefaultPriority=7
     HudColor=(B=255)
     SmallViewOffset=(X=8.000000,Y=1.000000,Z=-2.000000)
     CenteredOffsetY=-6.000000
     CenteredRoll=0
     CenteredYaw=-500
     InventoryGroup=6 // The inventory group used (i.e. the number you press to reach the gun)
     PickupClass=Class'XWeapons.MinigunPickup' // The MinigunPickup class defines the weapon the way it sits on the ground.
     PlayerViewOffset=(X=2.000000,Y=-1.000000)
     PlayerViewPivot=(Yaw=500)
     BobDamping=2.250000
     AttachmentClass=Class'XWeapons.MinigunAttachment'
     IconMaterial=Texture'InterfaceContent.HUD.SkinA'
     IconCoords=(X1=200,Y1=372,X2=321,Y2=462)
     ItemName=&quot;Minigun&quot; // The name!

     LightType=LT_Pulse             // Any of the excellent lighting tutorials
     LightEffect=LE_NonIncidence    // at the Wiki and around the web can 
     LightBrightness=150.000000     // detail what these light properties
     LightRadius=4.000000           // are. They are the same properties that 
     LightHue=30                    // you would set on a light on your map.
     LightSaturation=150            // If you look closely on a dark map you'll 
     LightPeriod=3                  // notice that all the weapons actually give off a pulse light.

     Mesh=SkeletalMesh'Weapons.Minigun_1st' // The skeletal mesh of the model
     DrawScale=0.400000
     UV2Texture=Shader'XGameShaders.WeaponShaders.WeaponEnvShader'
     SoundRadius=400.000000 // The radius of the minigun sounds
}
&lt;/uscript&gt;

==Related Topics==

[[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]

[[Legacy:MinigunFire|MinigunFire]]

[[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:MinigunAttachment|MinigunAttachment]]

[[Legacy:Weapon|Weapon]]

[[Legacy:Code References|Code References]]

[[:Category:Legacy Class (UT2003)]]

==Comments==
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Minigun2</title>
    <id>28386</id>
    <revision>
      <id>40057</id>
      <timestamp>2009-11-15T08:15:52Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinigunAltFire</title>
    <id>2120</id>
    <revision>
      <id>5164</id>
      <timestamp>2005-11-18T22:09:29Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Marked up.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:WeaponFire|WeaponFire]] &gt;&gt; [[Legacy:InstantFire|InstantFire]] &gt;&gt; [[Legacy:MinigunFire|MinigunFire]] &gt;&gt; MinigunAltFire (Package : XWeapons)}}

==Known Subclasses==
* [[Legacy:ClassicMinigunAltFire|ClassicMinigunAltFire]] (UT2004)

==Discussion==

'''Unknown:''' (author) Feel free to correct or add.  I plan on doing so.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5165</id>
      <timestamp>2003-10-05T20:08:04Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

&lt;uscript&gt;

class MinigunAltFire extends MinigunFire; //This shows that the alt-fire is only an extension of normal fire

defaultproperties
{
     BarrelRotationsPerSec=1.000000 //Rotations per sec in alt-fire
     FiringSound=Sound'WeaponSounds.Minigun.minialtfireb' //Firing sound in alt-fire
     WindUpTime=0.150000 //Wind-up time for alt-fire
     FiringForce=&quot;minialtfireb&quot;
     DamageType=Class'XWeapons.DamTypeMinigunAlt' //Damage Class for the alt-fire
     DamageMin=12 //Minimum alt damage
     DamageMax=14 //Maximum alt damage
     FireLoopAnimRate=3.000000
     PreFireTime=0.150000
     SmokeEmitterClass=Class'XEffects.MinigunAltMuzzleSmoke'
     Spread=0.030000 //Deviation from crosshair
}
&lt;/uscript&gt;

Feel free to correct or add.  I plan on doing so.

----

[[Legacy:Code References|Code References]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinigunAmmo</title>
    <id>2121</id>
    <revision>
      <id>5166</id>
      <timestamp>2003-10-05T20:15:50Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

&lt;uscript&gt;
class MinigunAmmo extends Ammunition; //Shows that minigun ammo is derived from the ammunition class

//The minigun HUD display icon lives in this texture package.
#EXEC OBJ LOAD FILE=InterfaceContent.utx

defaultproperties //Normal variable properties
{
     MaxAmmo=350                                       //Maximum ammo allowed for the minigun
     InitialAmount=150                                 //This sets the amount of ammo you get when you pickup the minigun.
     PickupClass=Class'XWeapons.MinigunAmmoPickup'     //Pickup class for the ammo
     IconMaterial=Texture'InterfaceContent.HUD.SkinA'  //This says package to get the HUD icon from. This line would not be
                                                       //  valid if we hadn't loaded the InterfaceContent package above.
     IconCoords=(X1=445,Y1=75,X2=544,Y2=149)           //This says which HUD icon in the InterfaceContent package to use.
     ItemName=&quot;Bullets&quot;                                //Name of the ingame pickup, i.e. &quot;You got Bullets!&quot;
}

// &quot;But wait, I thought you only got 50 bullets from each Ammo pickup?&quot;
// &quot;You do... check out the MinigunAmmoPickup class :)&quot;
&lt;/uscript&gt;

As always corrections and additions are welcome

==Comments==

----

[[Legacy:Code References|Code References]]</text>
    </revision>
    <revision>
      <id>5167</id>
      <timestamp>2003-10-05T18:11:25Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class MinigunAmmo extends Ammunition; //Shows that minigun ammo is derived from the ammunition class

#EXEC OBJ LOAD FILE=InterfaceContent.utx   //The minigun HUD display icon lives in this texture package.

defaultproperties //Normal variable properties
{
     MaxAmmo=350                                       //Maximum ammo allowed for the minigun
     InitialAmount=150                                 //This sets the amount of ammo you get when you pickup the minigun.
     PickupClass=Class'XWeapons.MinigunAmmoPickup'     //Pickup class for the ammo
     IconMaterial=Texture'InterfaceContent.HUD.SkinA'  //This says package to get the HUD icon from. This line would not be
                                                       //  valid if we hadn't loaded the InterfaceContent package above.
     IconCoords=(X1=445,Y1=75,X2=544,Y2=149)           //This says which HUD icon in the InterfaceContent package to use.
     ItemName=&quot;Bullets&quot;                                //Name of the ingame pickup, i.e. &quot;You got Bullets!&quot;
}

// &quot;But wait, I thought you only got 50 bullets from each Ammo pickup?&quot;
// &quot;You do... check out the MinigunAmmoPickup class :)&quot;
&lt;/uscript&gt;

As always corrections and additions are welcome

==Comments==

----

[[Legacy:Code References|Code References]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinigunAmmoPickup</title>
    <id>2122</id>
    <revision>
      <id>5168</id>
      <timestamp>2006-05-15T08:27:30Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''From UT2003; Build 2225'''''

&lt;uscript&gt;
class MinigunAmmoPickup extends UTAmmoPickup;  // This class inherits properties from UTAmmoPickup.

defaultproperties
{
    InventoryType=class'MinigunAmmo'                          // This links the class to the MinigunAmmo class.

    PickupMessage=&quot;You picked up 50 bullets.&quot;                 // ...You've actually played the game right? :D
    PickupSound=Sound'PickupSounds.MinigunAmmoPickup'         // The sound you hear when you pickup the ammo pack.
    PickupForce=&quot;MinigunAmmoPickup&quot;  // jdf

    AmmoAmount=50                                             // How many bullets are in each ammo pickup pack.
    CollisionHeight=12.750000                                 // Sets a collision value.

    StaticMesh=StaticMesh'WeaponStaticMesh.MinigunAmmoPickup' // Which static mesh the game will use for the ammo pack.
    DrawType=DT_StaticMesh                                    // If you're using a static mesh,
                                                              // you have to tell the engine.
}
&lt;/uscript&gt;

==Related Topics==
*[[Legacy:Code References|Code References]]
*[[Legacy:Minigun|Minigun]]
*[[Legacy:MinigunPickup|MinigunPickup]]
*[[Legacy:MinigunFire|MinigunFire]]
*[[Legacy:MinigunAltFire|MinigunAltFire]]
*[[Legacy:MinigunAmmo|MinigunAmmo]]
*[[Legacy:MinigunAttachment|MinigunAttachment]]</text>
    </revision>
    <revision>
      <id>5169</id>
      <timestamp>2003-10-05T18:20:11Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''From UT2003; Build 2225'''''

&lt;uscript&gt;
class MinigunAmmoPickup extends UTAmmoPickup;  // This class inherits properties from UTAmmoPickup.

defaultproperties
{
    InventoryType=class'MinigunAmmo'                          // This links the class to the MinigunAmmo class.

    PickupMessage=&quot;You picked up 50 bullets.&quot;                 // ...You've actually played the game right? :D
    PickupSound=Sound'PickupSounds.MinigunAmmoPickup'         // The sound you hear when you pickup the ammo pack.
    PickupForce=&quot;MinigunAmmoPickup&quot;  // jdf

    AmmoAmount=50                                             // How many bullets are in each ammo pickup pack.
    CollisionHeight=12.750000                                 // Sets a collision value.

    StaticMesh=StaticMesh'WeaponStaticMesh.MinigunAmmoPickup' // Which static mesh the game will use for the ammo pack.
    DrawType=DT_StaticMesh                                    // If you're using a static mesh, you have to tell the engine.
}
&lt;/uscript&gt;

===Related===

[[Legacy:Code References|Code References]]

[[Legacy:Minigun|Minigun]]

[[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:MinigunFire|MinigunFire]]

[[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:MinigunAttachment|MinigunAttachment]]</text>
    </revision>
    <revision>
      <id>5170</id>
      <timestamp>2003-10-13T07:24:43Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>*Standardizing: &quot;Related Topics&quot;</comment>
      <text xml:space="preserve">'''''From UT2003; Build 2225'''''

&lt;uscript&gt;
class MinigunAmmoPickup extends UTAmmoPickup;  // This class inherits properties from UTAmmoPickup.

defaultproperties
{
    InventoryType=class'MinigunAmmo'                          // This links the class to the MinigunAmmo class.

    PickupMessage=&quot;You picked up 50 bullets.&quot;                 // ...You've actually played the game right? :D
    PickupSound=Sound'PickupSounds.MinigunAmmoPickup'         // The sound you hear when you pickup the ammo pack.
    PickupForce=&quot;MinigunAmmoPickup&quot;  // jdf

    AmmoAmount=50                                             // How many bullets are in each ammo pickup pack.
    CollisionHeight=12.750000                                 // Sets a collision value.

    StaticMesh=StaticMesh'WeaponStaticMesh.MinigunAmmoPickup' // Which static mesh the game will use for the ammo pack.
    DrawType=DT_StaticMesh                                    // If you're using a static mesh, you have to tell the engine.
}
&lt;/uscript&gt;

==Related Topics==
*[[Legacy:Code References|Code References]]
*[[Legacy:Minigun|Minigun]]
*[[Legacy:MinigunPickup|MinigunPickup]]
*[[Legacy:MinigunFire|MinigunFire]]
*[[Legacy:MinigunAltFire|MinigunAltFire]]
*[[Legacy:MinigunAmmo|MinigunAmmo]]
*[[Legacy:MinigunAttachment|MinigunAttachment]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinigunAttachment</title>
    <id>2124</id>
    <revision>
      <id>5172</id>
      <timestamp>2005-12-11T04:25:46Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:InventoryAttachment|InventoryAttachment]] &gt;&gt; [[Legacy:WeaponAttachment|WeaponAttachment]] &gt;&gt; [[Legacy:XWeaponAttachment|xWeaponAttachment]] &gt;&gt; MinigunAttachment (Package: xWeapons)}}

This is the WeaponAttachment for the Minigun, a gatling-style machine gun.

==Properties==

===Main===
; [[Legacy:Emitter|Emitter]] mTracer (editinline) : The Tracer emitter
; float mTracerIntervalPrimary :
; float mTracerIntervalSecondary :
; float mTracerPullback :
; float mTracerMinDistance :
; float mTracerSpeed :
; vector mShellEmitterOffset :

===Hidden===
; class&lt;[[Legacy:Emitter|Emitter]]&gt; mMuzFlashClass : Muzzle flash class
; [[Legacy:Emitter|Emitter]] mMuzFlash3rd : The muzzle flash emitter
; class&lt;[[Legacy:Emitter|Emitter]]&gt; mTracerClass : Class of the tracer emitter
; float mTracerInterval : The frequency of tracers
; float mLastTracerTime :
; byte OldSpawnHitCount :
; float mCurrentRoll :
; float mRollInc :
; float mRollUpdateTime :
; class&lt;[[Legacy:XEmitter|xEmitter]]&gt; mShellCaseEmitterClass :
; [[Legacy:XEmitter|xEmitter]] mShellCaseEmitter :
; vector mOldHitLocation : Where the tracer last hit

==Functions==

(incomplete)
; UpdateRoll( float dt ) (simulated) : Updates the roll for the flash emitter attachment.
; vector GetTracerStart() (simulated) : Starts the tracer code.
; UpdateTracer() (simulated) : Updates the position for the tracer emitter.
; UpdateHit( [[Legacy:Actor|Actor]] HitActor, vector HitLocation, vector HitNormal ) : Used to update properties so hit effect can be spawn client side.

==Events==
; ThirdPersonEffects() (simulated) : What someone else sees of the emitters.

==States==

===TickTracer===

====Functions====
; Tick( float deltaTime) (simulated) : Calls &lt;tt&gt;UpdateRoll( deltaTime )&lt;/tt&gt;.

==Source Code==

&lt;uscript&gt;
class MinigunAttachment extends xWeaponAttachment;

var class&lt;Emitter&gt;      mMuzFlashClass;
var Emitter             mMuzFlash3rd;

var class&lt;Emitter&gt;      mTracerClass;
var() editinline Emitter mTracer;
var float				mTracerInterval;
var() float             mTracerIntervalPrimary;
var() float             mTracerIntervalSecondary;
var() float				mTracerPullback;
var() float				mTracerMinDistance;
var() float				mTracerSpeed;
var float               mLastTracerTime;
var byte				OldSpawnHitCount;

var float               mCurrentRoll;
var float               mRollInc;
var float               mRollUpdateTime;

var class&lt;xEmitter&gt;     mShellCaseEmitterClass;
var xEmitter            mShellCaseEmitter;
var() vector            mShellEmitterOffset;

var vector	mOldHitLocation;

function Destroyed()
{
    if (mTracer != None)
        mTracer.Destroy();

    if (mMuzFlash3rd != None)
        mMuzFlash3rd.Destroy();

    if (mShellCaseEmitter != None)
        mShellCaseEmitter.Destroy();

	Super.Destroyed();
}

simulated function UpdateRoll(float dt)
{
    local rotator r;

    UpdateRollTime(false);

    if (mRollInc &lt;= 0.f)
        return;

    mCurrentRoll += dt*mRollInc;
    mCurrentRoll = mCurrentRoll % 65536.f;
    r.Roll = int(mCurrentRoll);

    SetBoneRotation('Bone Barrels', r, 0, 1.f);
}

simulated function UpdateRollTime(bool bUpdate)
{
    local float diff;

    diff = Level.TimeSeconds - mRollUpdateTime;

    if (bUpdate)
        mRollUpdateTime = Level.TimeSeconds;

    // TODO: clean up!
    if (diff &gt; 0.2)
    {
        mRollInc = 0.f;
    }
}

simulated function vector GetTracerStart()
{
    local Pawn p;

    p = Pawn(Owner);

    if ( (p != None) &amp;&amp; p.IsFirstPerson() &amp;&amp; p.Weapon != None )
    {
        // 1st person
        return p.Weapon.GetEffectStart();
    }

    // 3rd person
	if ( mMuzFlash3rd != None )
		return mMuzFlash3rd.Location;
	else
		return Location;
}

simulated function UpdateTracer()
{
    local vector SpawnLoc, SpawnDir, SpawnVel;
	local float hitDist;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mTracer == None)
    {
        mTracer = Spawn(mTracerClass);
        //AttachToBone(mTracer, 'tip');
    }

    if (mTracer != None &amp;&amp; Level.TimeSeconds &gt; mLastTracerTime + mTracerInterval)
    {
		SpawnLoc = GetTracerStart();
		mTracer.SetLocation(SpawnLoc);

		hitDist = VSize(mHitLocation - SpawnLoc) - mTracerPullback;

		// If we have a hit but the hit location has not changed
		if(mHitLocation == mOldHitLocation)
			SpawnDir = vector( Instigator.GetViewRotation() );
		else
			SpawnDir = Normal(mHitLocation - SpawnLoc);

		if(hitDist &gt; mTracerMinDistance)
		{
			SpawnVel = SpawnDir * mTracerSpeed;
			
			mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
			mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
			mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
			mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
			mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
			mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;

			mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed;
			mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;

			mTracer.SpawnParticle(1);
		}

		mLastTracerTime = Level.TimeSeconds;

        GotoState('TickTracer');
    }

	mOldHitLocation = mHitLocation;
}

/* UpdateHit
- used to update properties so hit effect can be spawn client side
*/
function UpdateHit(Actor HitActor, vector HitLocation, vector HitNormal)
{
    NetUpdateTime = Level.TimeSeconds - 1;
	SpawnHitCount++;
	mHitLocation = HitLocation;
	mHitActor = HitActor;
	mHitNormal = HitNormal;
}

simulated event ThirdPersonEffects()
{
	local PlayerController PC;
	
    if ( (Level.NetMode == NM_DedicatedServer) || (Instigator == None) )
		return; 

    if ( FlashCount &gt; 0 )
	{
 		PC = Level.GetLocalPlayerController();
		if ( OldSpawnHitCount != SpawnHitCount )
		{
			OldSpawnHitCount = SpawnHitCount;
			GetHitInfo();
			PC = Level.GetLocalPlayerController();
			if ( (Instigator.Controller == PC) || (VSize(PC.ViewTarget.Location - mHitLocation) &lt; 2000) )
			{
				if ( FiringMode == 0 )
					Spawn(class'HitEffect'.static.GetHitEffect(mHitActor, mHitLocation, mHitNormal),,, mHitLocation, Rotator(mHitNormal));
				else
					Spawn(class'XEffects.ExploWallHit',,, mHitLocation, Rotator(mHitNormal));
				CheckForSplash();
			}
		}
		if ( (Level.TimeSeconds - LastRenderTime &gt; 0.2) &amp;&amp; (Instigator.Controller != PC) )
			return;

	 	WeaponLight();

		if (FiringMode == 0)
        {
            mTracerInterval = mTracerIntervalPrimary;
            mRollInc = 65536.f*3.f;
        }
        else
        {
            mTracerInterval = mTracerIntervalSecondary;
            mRollInc = 65536.f;
        } 

		if ( Level.bDropDetail || Level.DetailMode == DM_Low )
			mTracerInterval *= 2.0;

        UpdateRollTime(true);
		
        UpdateTracer();

        if (mMuzFlash3rd == None)
        {
            mMuzFlash3rd = Spawn(mMuzFlashClass);
            AttachToBone(mMuzFlash3rd, 'tip');
        }
        if (mMuzFlash3rd != None)
        {
            mMuzFlash3rd.SpawnParticle(1);
        }

        if ( (mShellCaseEmitter == None) &amp;&amp; (Level.DetailMode != DM_Low) &amp;&amp; !Level.bDropDetail )
        {
            mShellCaseEmitter = Spawn(mShellCaseEmitterClass);
            if ( mShellCaseEmitter != None )
				AttachToBone(mShellCaseEmitter, 'shell');
        }
        if (mShellCaseEmitter != None)
            mShellCaseEmitter.mStartParticles++;
    }
    else
    {
        GotoState('');
    }

    Super.ThirdPersonEffects();
}

state TickTracer
{
    simulated function Tick(float deltaTime)
    {
        UpdateRoll(deltaTime);
    }
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Minigun|Minigun]]
* [[Legacy:MinigunPickup|MinigunPickup]]
* [[Legacy:InstantFire|InstantFire]]
* [[Legacy:MinigunFire|MinigunFire]]

==Discussion==

'''Unknown:''' (author) Adding to this is always appreciated.

'''SuperApe:''' Marked up.  Keeping Source Code section as reference for [[Legacy:UnrealWiki To Do|UnrealWiki To Do]].

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5173</id>
      <timestamp>2005-12-10T22:35:44Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>Undoing that last [[Category Class Tree]] Should it have been done? I dunno... :)</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:InventoryAttachment|InventoryAttachment]] &gt;&gt; [[Legacy:WeaponAttachment|WeaponAttachment]] &gt;&gt; [[Legacy:XWeaponAttachment|xWeaponAttachment]] &gt;&gt; MinigunAttachment (Package: xWeapons)}}

This is the WeaponAttachment for the Minigun, a gatling-style machine gun.

==Properties==

===Main===
; [[Legacy:Emitter|Emitter]] mTracer (editinline) : The Tracer emitter
; float mTracerIntervalPrimary :
; float mTracerIntervalSecondary :
; float mTracerPullback :
; float mTracerMinDistance :
; float mTracerSpeed :
; vector mShellEmitterOffset :

===Hidden===
; class&lt;[[Legacy:Emitter|Emitter]]&gt; mMuzFlashClass : Muzzle flash class
; [[Legacy:Emitter|Emitter]] mMuzFlash3rd : The muzzle flash emitter
; class&lt;[[Legacy:Emitter|Emitter]]&gt; mTracerClass : Class of the tracer emitter
; float mTracerInterval : The frequency of tracers
; float mLastTracerTime :
; byte OldSpawnHitCount :
; float mCurrentRoll :
; float mRollInc :
; float mRollUpdateTime :
; class&lt;[[Legacy:XEmitter|xEmitter]]&gt; mShellCaseEmitterClass :
; [[Legacy:XEmitter|xEmitter]] mShellCaseEmitter :
; vector mOldHitLocation : Where the tracer last hit

==Functions==

(incomplete)
; simulated UpdateRoll( float dt ) : Updates the roll for the flash emitter attachment.
; simulated GetTracerStart() : Starts the tracer code.  Returns a vector.
; simulated UpdateTracer() : Updates the position for the tracer emitter.
; UpdateHit( [[Legacy:Actor|Actor]] HitActor, vector HitLocation, vector HitNormal ) : Used to update properties so hit effect can be spawn client side.

==Events==
; simulated ThirdPersonEffects() : What someone else sees of the emitters.

==States==
; TickTracer : Calls &lt;tt&gt;UpdateRoll()&lt;/tt&gt; each Tick().

==Source Code==

&lt;uscript&gt;
class MinigunAttachment extends xWeaponAttachment;

var class&lt;Emitter&gt;      mMuzFlashClass;
var Emitter             mMuzFlash3rd;

var class&lt;Emitter&gt;      mTracerClass;
var() editinline Emitter mTracer;
var float				mTracerInterval;
var() float             mTracerIntervalPrimary;
var() float             mTracerIntervalSecondary;
var() float				mTracerPullback;
var() float				mTracerMinDistance;
var() float				mTracerSpeed;
var float               mLastTracerTime;
var byte				OldSpawnHitCount;

var float               mCurrentRoll;
var float               mRollInc;
var float               mRollUpdateTime;

var class&lt;xEmitter&gt;     mShellCaseEmitterClass;
var xEmitter            mShellCaseEmitter;
var() vector            mShellEmitterOffset;

var vector	mOldHitLocation;

function Destroyed()
{
    if (mTracer != None)
        mTracer.Destroy();

    if (mMuzFlash3rd != None)
        mMuzFlash3rd.Destroy();

    if (mShellCaseEmitter != None)
        mShellCaseEmitter.Destroy();

	Super.Destroyed();
}

simulated function UpdateRoll(float dt)
{
    local rotator r;

    UpdateRollTime(false);

    if (mRollInc &lt;= 0.f)
        return;

    mCurrentRoll += dt*mRollInc;
    mCurrentRoll = mCurrentRoll % 65536.f;
    r.Roll = int(mCurrentRoll);

    SetBoneRotation('Bone Barrels', r, 0, 1.f);
}

simulated function UpdateRollTime(bool bUpdate)
{
    local float diff;

    diff = Level.TimeSeconds - mRollUpdateTime;

    if (bUpdate)
        mRollUpdateTime = Level.TimeSeconds;

    // TODO: clean up!
    if (diff &gt; 0.2)
    {
        mRollInc = 0.f;
    }
}

simulated function vector GetTracerStart()
{
    local Pawn p;

    p = Pawn(Owner);

    if ( (p != None) &amp;&amp; p.IsFirstPerson() &amp;&amp; p.Weapon != None )
    {
        // 1st person
        return p.Weapon.GetEffectStart();
    }

    // 3rd person
	if ( mMuzFlash3rd != None )
		return mMuzFlash3rd.Location;
	else
		return Location;
}

simulated function UpdateTracer()
{
    local vector SpawnLoc, SpawnDir, SpawnVel;
	local float hitDist;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mTracer == None)
    {
        mTracer = Spawn(mTracerClass);
        //AttachToBone(mTracer, 'tip');
    }

    if (mTracer != None &amp;&amp; Level.TimeSeconds &gt; mLastTracerTime + mTracerInterval)
    {
		SpawnLoc = GetTracerStart();
		mTracer.SetLocation(SpawnLoc);

		hitDist = VSize(mHitLocation - SpawnLoc) - mTracerPullback;

		// If we have a hit but the hit location has not changed
		if(mHitLocation == mOldHitLocation)
			SpawnDir = vector( Instigator.GetViewRotation() );
		else
			SpawnDir = Normal(mHitLocation - SpawnLoc);

		if(hitDist &gt; mTracerMinDistance)
		{
			SpawnVel = SpawnDir * mTracerSpeed;
			
			mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
			mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
			mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
			mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
			mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
			mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;

			mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed;
			mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;

			mTracer.SpawnParticle(1);
		}

		mLastTracerTime = Level.TimeSeconds;

        GotoState('TickTracer');
    }

	mOldHitLocation = mHitLocation;
}

/* UpdateHit
- used to update properties so hit effect can be spawn client side
*/
function UpdateHit(Actor HitActor, vector HitLocation, vector HitNormal)
{
    NetUpdateTime = Level.TimeSeconds - 1;
	SpawnHitCount++;
	mHitLocation = HitLocation;
	mHitActor = HitActor;
	mHitNormal = HitNormal;
}

simulated event ThirdPersonEffects()
{
	local PlayerController PC;
	
    if ( (Level.NetMode == NM_DedicatedServer) || (Instigator == None) )
		return; 

    if ( FlashCount &gt; 0 )
	{
 		PC = Level.GetLocalPlayerController();
		if ( OldSpawnHitCount != SpawnHitCount )
		{
			OldSpawnHitCount = SpawnHitCount;
			GetHitInfo();
			PC = Level.GetLocalPlayerController();
			if ( (Instigator.Controller == PC) || (VSize(PC.ViewTarget.Location - mHitLocation) &lt; 2000) )
			{
				if ( FiringMode == 0 )
					Spawn(class'HitEffect'.static.GetHitEffect(mHitActor, mHitLocation, mHitNormal),,, mHitLocation, Rotator(mHitNormal));
				else
					Spawn(class'XEffects.ExploWallHit',,, mHitLocation, Rotator(mHitNormal));
				CheckForSplash();
			}
		}
		if ( (Level.TimeSeconds - LastRenderTime &gt; 0.2) &amp;&amp; (Instigator.Controller != PC) )
			return;

	 	WeaponLight();

		if (FiringMode == 0)
        {
            mTracerInterval = mTracerIntervalPrimary;
            mRollInc = 65536.f*3.f;
        }
        else
        {
            mTracerInterval = mTracerIntervalSecondary;
            mRollInc = 65536.f;
        } 

		if ( Level.bDropDetail || Level.DetailMode == DM_Low )
			mTracerInterval *= 2.0;

        UpdateRollTime(true);
		
        UpdateTracer();

        if (mMuzFlash3rd == None)
        {
            mMuzFlash3rd = Spawn(mMuzFlashClass);
            AttachToBone(mMuzFlash3rd, 'tip');
        }
        if (mMuzFlash3rd != None)
        {
            mMuzFlash3rd.SpawnParticle(1);
        }

        if ( (mShellCaseEmitter == None) &amp;&amp; (Level.DetailMode != DM_Low) &amp;&amp; !Level.bDropDetail )
        {
            mShellCaseEmitter = Spawn(mShellCaseEmitterClass);
            if ( mShellCaseEmitter != None )
				AttachToBone(mShellCaseEmitter, 'shell');
        }
        if (mShellCaseEmitter != None)
            mShellCaseEmitter.mStartParticles++;
    }
    else
    {
        GotoState('');
    }

    Super.ThirdPersonEffects();
}

state TickTracer
{
    simulated function Tick(float deltaTime)
    {
        UpdateRoll(deltaTime);
    }
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Minigun|Minigun]]
* [[Legacy:MinigunPickup|MinigunPickup]]
* [[Legacy:InstantFire|InstantFire]]
* [[Legacy:MinigunFire|MinigunFire]]

==Discussion==

'''Unknown:''' (author) Adding to this is always appreciated.

'''SuperApe:''' Marked up.  Keeping Source Code section as reference for [[Legacy:UnrealWiki To Do|UnrealWiki To Do]].

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinigunFire</title>
    <id>2118</id>
    <revision>
      <id>5159</id>
      <timestamp>2003-10-13T22:13:25Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

Once again another reference of code, but this time for the Primary Fire of the minigun.  Oh, and please correct me if I'm wrong.  I won't get too pissed off ;)

&lt;uscript&gt;
class MinigunFire extends InstantFire; //This is the class and the parent that it inherits some functionality from.

// These are declarations of variables used in the code.
var() float MaxRollSpeed; 
var() float RollSpeed; 
var() float BarrelRotationsPerSec; //Amount of rotations of the barrel per sec
var() int   RoundsPerRotation;     //Rounds fired per rotation
var() float FireTime;
var() Sound WindingSound;          //The sound you hear when the minigun is getting ready to shoot.
var() Sound FiringSound;           //The sound you hear when the minigun is actually shooting.
var MiniGun Gun;
var() float WindUpTime;            //Amount of time it takes to wind up

var() String FiringForce;          //Amount of recoil
var() String WindingForce;

//What happens when you beserk (adrenaline combo) with this firing mode
function StartBerserk() 
{
    DamageMin = default.DamageMin * 1.33;
    DamageMax = default.DamageMax * 1.33;
}

//What happens when you stop beserking
function StopBerserk() 
{
    DamageMin = default.DamageMin;
    DamageMax = default.DamageMax;
}

//Initiate this code after game begins
function PostBeginPlay() 
{
    Super.PostBeginPlay();

    //Set the firing rate
    FireRate = 1.f / (RoundsPerRotation * BarrelRotationsPerSec);

    //Set the maximum barrel rotation speed
    MaxRollSpeed = 65536.f*BarrelRotationsPerSec; 
    Gun = Minigun(Owner);
}

//DoTrace is a function common to all weapons that handles the movement of projectiles and the determination 
//of the point of impact for instant-hit weapons.
function DoTrace(Vector Start, Rotator Dir)
{
	if ( FRand() &lt; DeathMatch(Level.Game).MinigunLockDownFactor )
		Momentum = FMax(1.0,DeathMatch(Level.Game).MinigunLockDownFactor) * Default.Momentum;
	else
		Momentum = 0;
	Super.DoTrace(Start,Dir);
} 

//Set muzzle flash to proper location on the gun
function FlashMuzzleFlash() 
{
    local rotator r;
    r.Roll = Rand(65536);
    Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f);
    Super.FlashMuzzleFlash();
}

//Set effects of the gun
function InitEffects() 
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'flash');
}

//Set ambient sounds
function PlayAmbientSound(Sound aSound) 
{
    if ( (Minigun(Weapon) == None) || (Instigator == None) || (aSound == None &amp;&amp; ThisModeNum != Gun.CurrentMode) )
        return;

    Instigator.AmbientSound = aSound;
    Gun.CurrentMode = ThisModeNum;
}

//Stop the barrel roll
//When this function is called, it does an error check to make sure it's a valid call, then it simply sets
//the rollspeed to 0.0 -- stopping the roll.
function StopRolling()
{
    if (Gun == None || ThisModeNum != Gun.CurrentMode)
        return;

    RollSpeed = 0.f;
    Gun.RollSpeed = 0.f;
} 

function PlayPreFire() {}
function PlayStartHold() {}
function PlayFiring() {}
function PlayFireEnd() {}
function StartFiring();
function StopFiring();
function bool IsIdle()
{
	return false;
}

auto state Idle
{
	function bool IsIdle()
	{
		return true;
	}

    function BeginState()
    {
        PlayAmbientSound(None);
        StopRolling();
    }

    function EndState()
    {
        PlayAmbientSound(WindingSound);
    }

    function StartFiring() //Says once you start to fire it winds up first
    {
        RollSpeed = 0;
	FireTime = (RollSpeed/MaxRollSpeed) * WindUpTime;
        GotoState('WindUp');
    }
}

state WindUp
{
    function BeginState() //Starts the wind-up Procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState() //Says when wind-up ends the firing begins
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }        
    }

    function ModeTick(float dt)
    {
        FireTime += dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;

        if ( !bIsFiring )
        {
	    GotoState('WindDown');
	    return;
	}
        
        if (RollSpeed &gt;= MaxRollSpeed)
        {
            RollSpeed = MaxRollSpeed;
            FireTime = WindUpTime;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
	    GotoState('FireLoop');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StopFiring() //Says if you stop firing it winds down
    {
        GotoState('WindDown');
    }
}

state FireLoop //A loop that continues only if the boolean variable bIsFiring is true
{
    function BeginState()
    {
        NextFireTime = Level.TimeSeconds - 0.1; //fire now!
        PlayAmbientSound(FiringSound);
        ClientPlayForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(FireLoopAnim, FireLoopAnimRate, TweenTime);
        Gun.SpawnShells(RoundsPerRotation*BarrelRotationsPerSec);
    }

    function StopFiring()
    {
        GotoState('WindDown');
    }

    function EndState() //What happens after you stop firing
    {
        PlayAmbientSound(WindingSound);
        StopForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(Gun.IdleAnim, Gun.IdleAnimRate, TweenTime);
        Gun.SpawnShells(0.f);
     }

    function ModeTick(float dt)
    {
        Super.ModeTick(dt);
        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
        if ( !bIsFiring )
        {
	    GotoState('WindDown');
	    return;
	}
    }
}

state WindDown
{
    function BeginState() //Begins the wind-down procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState()
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }//This checks to see what mode is firing, and stops the force feedback if any is occuring.
    }

    function ModeTick(float dt)
    {
        FireTime -= dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;
         
        if (RollSpeed &lt;= 0.f)
        {
            RollSpeed = 0.f;
            FireTime = 0.f;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
            GotoState('Idle');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StartFiring() //Says in order to fire the gun must wind-up
    {
        GotoState('WindUp');
    }
}

defaultproperties //Default variable settings. Some were declared at the top of the file, others were declared in the parent class.
{
     BarrelRotationsPerSec=3.000000                              // How many times the barrel rotates every second.
     RoundsPerRotation=5                                         // How many rounds (shots) it fires every rotation.
     WindingSound=Sound'WeaponSounds.Minigun.miniempty'          // The sound it plays when the gun is winding up.
     FiringSound=Sound'WeaponSounds.Minigun.minifireb'           // The sound it plays when the gun is firing.
     WindUpTime=0.270000                                         // The default windup time.
     FiringForce=&quot;minifireb&quot;
     WindingForce=&quot;miniempty&quot;
     DamageType=Class'XWeapons.DamTypeMinigunBullet'
     DamageMin=6                                                 // The minimum amount of damage each bullet does.
     DamageMax=7                                                 // The maximum amount of damage each bullet does.
     Momentum=1200.000000
     FireLoopAnimRate=9.000000
     PreFireTime=0.270000
     AmmoClass=Class'XWeapons.MinigunAmmo'                       // Which class of ammunition this weapon uses.
     AmmoPerFire=1                                               // How much of that ammuntion is used per shot. This might
                                                                 // seem pointless, but recall how the alt-fire on the Flak
                                                                 // Cannon uses more than one piece of ammo.
     ShakeRotMag=(X=50.000000,Y=50.000000,Z=50.000000)
     ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=1.000000,Y=1.000000,Z=1.000000)
     ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
     ShakeOffsetTime=2.000000
     BotRefireRate=0.990000
     bPawnRapidFireAnim=True
     FlashEmitterClass=Class'XEffects.MinigunMuzFlash1st'       // Which class the weapon will use for its muzzle flash emitter.
     SmokeEmitterClass=Class'XEffects.MinigunMuzzleSmoke'       // Which class the weapon will use for its muzzle smoke emitter.
     aimerror=900.000000

     Spread=0.080000        // How much variation there is between shots. This keeps the bullets going in slightly different directions.           
     SpreadStyle=SS_Random  // This makes sure that the Spread is truly random, so that the bullets going in slightly different directions looks pretty realistic.
}
&lt;/uscript&gt;

Once again I would like anyone to correct or add to any of this.

==Related Topics==

[[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]

[[Legacy:InstantFire|InstantFire]]

[[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:MinigunAttachment|MinigunAttachment]]

[[Legacy:Code References|Code References]]

[[:Category:Legacy Class (UT2003)]]

==Comments==
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5160</id>
      <timestamp>2003-10-05T20:07:44Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

Once again another reference of code, but this time for the Primary Fire of the minigun.  Oh, and please correct me if I'm wrong.  I won't get too pissed off ;)

&lt;uscript&gt;
class MinigunFire extends InstantFire; //This is the class and the parent that it inherits some functionality from.

// These are declarations of variables used in the code.
var() float MaxRollSpeed; 
var() float RollSpeed; 
var() float BarrelRotationsPerSec; //Amount of rotations of the barrel per sec
var() int   RoundsPerRotation;     //Rounds fired per rotation
var() float FireTime;
var() Sound WindingSound;          //The sound you hear when the minigun is getting ready to shoot.
var() Sound FiringSound;           //The sound you hear when the minigun is actually shooting.
var MiniGun Gun;
var() float WindUpTime;            //Amount of time it takes to wind up

var() String FiringForce;          //Amount of recoil
var() String WindingForce;

//What happens when you beserk (adrenaline combo) with this firing mode
function StartBerserk() 
{
    DamageMin = default.DamageMin * 1.33;
    DamageMax = default.DamageMax * 1.33;
}

//What happens when you stop beserking
function StopBerserk() 
{
    DamageMin = default.DamageMin;
    DamageMax = default.DamageMax;
}

//Initiate this code after game begins
function PostBeginPlay() 
{
    Super.PostBeginPlay();

    //Set the firing rate
    FireRate = 1.f / (RoundsPerRotation * BarrelRotationsPerSec);

    //Set the maximum barrel rotation speed
    MaxRollSpeed = 65536.f*BarrelRotationsPerSec; 
    Gun = Minigun(Owner);
}

//DoTrace is a function common to all weapons that handles the movement of projectiles and the determination 
//of the point of impact for instant-hit weapons.
function DoTrace(Vector Start, Rotator Dir)
{
	if ( FRand() &lt; DeathMatch(Level.Game).MinigunLockDownFactor )
		Momentum = FMax(1.0,DeathMatch(Level.Game).MinigunLockDownFactor) * Default.Momentum;
	else
		Momentum = 0;
	Super.DoTrace(Start,Dir);
} 

//Set muzzle flash to proper location on the gun
function FlashMuzzleFlash() 
{
    local rotator r;
    r.Roll = Rand(65536);
    Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f);
    Super.FlashMuzzleFlash();
}

//Set effects of the gun
function InitEffects() 
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'flash');
}

//Set ambient sounds
function PlayAmbientSound(Sound aSound) 
{
    if ( (Minigun(Weapon) == None) || (Instigator == None) || (aSound == None &amp;&amp; ThisModeNum != Gun.CurrentMode) )
        return;

    Instigator.AmbientSound = aSound;
    Gun.CurrentMode = ThisModeNum;
}

//Stop the barrel roll
//When this function is called, it does an error check to make sure it's a valid call, then it simply sets
//the rollspeed to 0.0 -- stopping the roll.
function StopRolling()
{
    if (Gun == None || ThisModeNum != Gun.CurrentMode)
        return;

    RollSpeed = 0.f;
    Gun.RollSpeed = 0.f;
} 

function PlayPreFire() {}
function PlayStartHold() {}
function PlayFiring() {}
function PlayFireEnd() {}
function StartFiring();
function StopFiring();
function bool IsIdle()
{
	return false;
}

auto state Idle
{
	function bool IsIdle()
	{
		return true;
	}

    function BeginState()
    {
        PlayAmbientSound(None);
        StopRolling();
    }

    function EndState()
    {
        PlayAmbientSound(WindingSound);
    }

    function StartFiring() //Says once you start to fire it winds up first
    {
        RollSpeed = 0;
	FireTime = (RollSpeed/MaxRollSpeed) * WindUpTime;
        GotoState('WindUp');
    }
}

state WindUp
{
    function BeginState() //Starts the wind-up Procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState() //Says when wind-up ends the firing begins
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }        
    }

    function ModeTick(float dt)
    {
        FireTime += dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;

        if ( !bIsFiring )
        {
	    GotoState('WindDown');
	    return;
	}
        
        if (RollSpeed &gt;= MaxRollSpeed)
        {
            RollSpeed = MaxRollSpeed;
            FireTime = WindUpTime;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
	    GotoState('FireLoop');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StopFiring() //Says if you stop firing it winds down
    {
        GotoState('WindDown');
    }
}

state FireLoop //A loop that continues only if the boolean variable bIsFiring is true
{
    function BeginState()
    {
        NextFireTime = Level.TimeSeconds - 0.1; //fire now!
        PlayAmbientSound(FiringSound);
        ClientPlayForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(FireLoopAnim, FireLoopAnimRate, TweenTime);
        Gun.SpawnShells(RoundsPerRotation*BarrelRotationsPerSec);
    }

    function StopFiring()
    {
        GotoState('WindDown');
    }

    function EndState() //What happens after you stop firing
    {
        PlayAmbientSound(WindingSound);
        StopForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(Gun.IdleAnim, Gun.IdleAnimRate, TweenTime);
        Gun.SpawnShells(0.f);
     }

    function ModeTick(float dt)
    {
        Super.ModeTick(dt);
        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
        if ( !bIsFiring )
        {
	    GotoState('WindDown');
	    return;
	}
    }
}

state WindDown
{
    function BeginState() //Begins the wind-down procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState()
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }//This checks to see what mode is firing, and stops the force feedback if any is occuring.
    }

    function ModeTick(float dt)
    {
        FireTime -= dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;
         
        if (RollSpeed &lt;= 0.f)
        {
            RollSpeed = 0.f;
            FireTime = 0.f;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
            GotoState('Idle');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StartFiring() //Says in order to fire the gun must wind-up
    {
        GotoState('WindUp');
    }
}

defaultproperties //Default variable settings. Some were declared at the top of the file, others were declared in the parent class.
{
     BarrelRotationsPerSec=3.000000                              // How many times the barrel rotates every second.
     RoundsPerRotation=5                                         // How many rounds (shots) it fires every rotation.
     WindingSound=Sound'WeaponSounds.Minigun.miniempty'          // The sound it plays when the gun is winding up.
     FiringSound=Sound'WeaponSounds.Minigun.minifireb'           // The sound it plays when the gun is firing.
     WindUpTime=0.270000                                         // The default windup time.
     FiringForce=&quot;minifireb&quot;
     WindingForce=&quot;miniempty&quot;
     DamageType=Class'XWeapons.DamTypeMinigunBullet'
     DamageMin=6                                                 // The minimum amount of damage each bullet does.
     DamageMax=7                                                 // The maximum amount of damage each bullet does.
     Momentum=1200.000000
     FireLoopAnimRate=9.000000
     PreFireTime=0.270000
     AmmoClass=Class'XWeapons.MinigunAmmo'                       // Which class of ammunition this weapon uses.
     AmmoPerFire=1                                               // How much of that ammuntion is used per shot. This might
                                                                 // seem pointless, but recall how the alt-fire on the Flak
                                                                 // Cannon uses more than one piece of ammo.
     ShakeRotMag=(X=50.000000,Y=50.000000,Z=50.000000)
     ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=1.000000,Y=1.000000,Z=1.000000)
     ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
     ShakeOffsetTime=2.000000
     BotRefireRate=0.990000
     bPawnRapidFireAnim=True
     FlashEmitterClass=Class'XEffects.MinigunMuzFlash1st'       // Which class the weapon will use for its muzzle flash emitter.
     SmokeEmitterClass=Class'XEffects.MinigunMuzzleSmoke'       // Which class the weapon will use for its muzzle smoke emitter.
     aimerror=900.000000

     Spread=0.080000        // How much variation there is between shots. This keeps the bullets going in slightly different directions.           
     SpreadStyle=SS_Random  // This makes sure that the Spread is truly random, so that the bullets going in slightly different directions looks pretty realistic.
}
&lt;/uscript&gt;

Once again I would like anyone to correct or add to any of this.

==Comments==

'''Dragonmaw:''' I have added a site for cataloguing all break-downs of the code.  Here is the link: [[Legacy:Code References|Code References]]</text>
    </revision>
    <revision>
      <id>5161</id>
      <timestamp>2003-10-13T21:06:03Z</timestamp>
      <contributor>
        <ip>168.212.165.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

Once again another reference of code, but this time for the Primary Fire of the minigun.  Oh, and please correct me if I'm wrong.  I won't get too pissed off ;)

&lt;uscript&gt;
class MinigunFire extends InstantFire; //This is the class and the parent that it inherits some functionality from.

// These are declarations of variables used in the code.
var() float MaxRollSpeed; 
var() float RollSpeed; 
var() float BarrelRotationsPerSec; //Amount of rotations of the barrel per sec
var() int   RoundsPerRotation;     //Rounds fired per rotation
var() float FireTime;
var() Sound WindingSound;          //The sound you hear when the minigun is getting ready to shoot.
var() Sound FiringSound;           //The sound you hear when the minigun is actually shooting.
var MiniGun Gun;
var() float WindUpTime;            //Amount of time it takes to wind up

var() String FiringForce;          //Amount of recoil
var() String WindingForce;

//What happens when you beserk (adrenaline combo) with this firing mode
function StartBerserk() 
{
    DamageMin = default.DamageMin * 1.33;
    DamageMax = default.DamageMax * 1.33;
}

//What happens when you stop beserking
function StopBerserk() 
{
    DamageMin = default.DamageMin;
    DamageMax = default.DamageMax;
}

//Initiate this code after game begins
function PostBeginPlay() 
{
    Super.PostBeginPlay();

    //Set the firing rate
    FireRate = 1.f / (RoundsPerRotation * BarrelRotationsPerSec);

    //Set the maximum barrel rotation speed
    MaxRollSpeed = 65536.f*BarrelRotationsPerSec; 
    Gun = Minigun(Owner);
}

//DoTrace is a function common to all weapons that handles the movement of projectiles and the determination 
//of the point of impact for instant-hit weapons.
function DoTrace(Vector Start, Rotator Dir)
{
	if ( FRand() &lt; DeathMatch(Level.Game).MinigunLockDownFactor )
		Momentum = FMax(1.0,DeathMatch(Level.Game).MinigunLockDownFactor) * Default.Momentum;
	else
		Momentum = 0;
	Super.DoTrace(Start,Dir);
} 

//Set muzzle flash to proper location on the gun
function FlashMuzzleFlash() 
{
    local rotator r;
    r.Roll = Rand(65536);
    Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f);
    Super.FlashMuzzleFlash();
}

//Set effects of the gun
function InitEffects() 
{
    Super.InitEffects();
    if ( FlashEmitter != None )
		Weapon.AttachToBone(FlashEmitter, 'flash');
}

//Set ambient sounds
function PlayAmbientSound(Sound aSound) 
{
    if ( (Minigun(Weapon) == None) || (Instigator == None) || (aSound == None &amp;&amp; ThisModeNum != Gun.CurrentMode) )
        return;

    Instigator.AmbientSound = aSound;
    Gun.CurrentMode = ThisModeNum;
}

//Stop the barrel roll
//When this function is called, it does an error check to make sure it's a valid call, then it simply sets
//the rollspeed to 0.0 -- stopping the roll.
function StopRolling()
{
    if (Gun == None || ThisModeNum != Gun.CurrentMode)
        return;

    RollSpeed = 0.f;
    Gun.RollSpeed = 0.f;
} 

function PlayPreFire() {}
function PlayStartHold() {}
function PlayFiring() {}
function PlayFireEnd() {}
function StartFiring();
function StopFiring();
function bool IsIdle()
{
	return false;
}

auto state Idle
{
	function bool IsIdle()
	{
		return true;
	}

    function BeginState()
    {
        PlayAmbientSound(None);
        StopRolling();
    }

    function EndState()
    {
        PlayAmbientSound(WindingSound);
    }

    function StartFiring() //Says once you start to fire it winds up first
    {
        RollSpeed = 0;
	FireTime = (RollSpeed/MaxRollSpeed) * WindUpTime;
        GotoState('WindUp');
    }
}

state WindUp
{
    function BeginState() //Starts the wind-up Procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState() //Says when wind-up ends the firing begins
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }        
    }

    function ModeTick(float dt)
    {
        FireTime += dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;

        if ( !bIsFiring )
        {
	    GotoState('WindDown');
	    return;
	}
        
        if (RollSpeed &gt;= MaxRollSpeed)
        {
            RollSpeed = MaxRollSpeed;
            FireTime = WindUpTime;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
	    GotoState('FireLoop');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StopFiring() //Says if you stop firing it winds down
    {
        GotoState('WindDown');
    }
}

state FireLoop //A loop that continues only if the boolean variable bIsFiring is true
{
    function BeginState()
    {
        NextFireTime = Level.TimeSeconds - 0.1; //fire now!
        PlayAmbientSound(FiringSound);
        ClientPlayForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(FireLoopAnim, FireLoopAnimRate, TweenTime);
        Gun.SpawnShells(RoundsPerRotation*BarrelRotationsPerSec);
    }

    function StopFiring()
    {
        GotoState('WindDown');
    }

    function EndState() //What happens after you stop firing
    {
        PlayAmbientSound(WindingSound);
        StopForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(Gun.IdleAnim, Gun.IdleAnimRate, TweenTime);
        Gun.SpawnShells(0.f);
     }

    function ModeTick(float dt)
    {
        Super.ModeTick(dt);
        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
        if ( !bIsFiring )
        {
	    GotoState('WindDown');
	    return;
	}
    }
}

state WindDown
{
    function BeginState() //Begins the wind-down procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState()
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }//This checks to see what mode is firing, and stops the force feedback if any is occuring.
    }

    function ModeTick(float dt)
    {
        FireTime -= dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;
         
        if (RollSpeed &lt;= 0.f)
        {
            RollSpeed = 0.f;
            FireTime = 0.f;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
            GotoState('Idle');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StartFiring() //Says in order to fire the gun must wind-up
    {
        GotoState('WindUp');
    }
}

defaultproperties //Default variable settings. Some were declared at the top of the file, others were declared in the parent class.
{
     BarrelRotationsPerSec=3.000000                              // How many times the barrel rotates every second.
     RoundsPerRotation=5                                         // How many rounds (shots) it fires every rotation.
     WindingSound=Sound'WeaponSounds.Minigun.miniempty'          // The sound it plays when the gun is winding up.
     FiringSound=Sound'WeaponSounds.Minigun.minifireb'           // The sound it plays when the gun is firing.
     WindUpTime=0.270000                                         // The default windup time.
     FiringForce=&quot;minifireb&quot;
     WindingForce=&quot;miniempty&quot;
     DamageType=Class'XWeapons.DamTypeMinigunBullet'
     DamageMin=6                                                 // The minimum amount of damage each bullet does.
     DamageMax=7                                                 // The maximum amount of damage each bullet does.
     Momentum=1200.000000
     FireLoopAnimRate=9.000000
     PreFireTime=0.270000
     AmmoClass=Class'XWeapons.MinigunAmmo'                       // Which class of ammunition this weapon uses.
     AmmoPerFire=1                                               // How much of that ammuntion is used per shot. This might
                                                                 // seem pointless, but recall how the alt-fire on the Flak
                                                                 // Cannon uses more than one piece of ammo.
     ShakeRotMag=(X=50.000000,Y=50.000000,Z=50.000000)
     ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=1.000000,Y=1.000000,Z=1.000000)
     ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
     ShakeOffsetTime=2.000000
     BotRefireRate=0.990000
     bPawnRapidFireAnim=True
     FlashEmitterClass=Class'XEffects.MinigunMuzFlash1st'       // Which class the weapon will use for its muzzle flash emitter.
     SmokeEmitterClass=Class'XEffects.MinigunMuzzleSmoke'       // Which class the weapon will use for its muzzle smoke emitter.
     aimerror=900.000000

     Spread=0.080000        // How much variation there is between shots. This keeps the bullets going in slightly different directions.           
     SpreadStyle=SS_Random  // This makes sure that the Spread is truly random, so that the bullets going in slightly different directions looks pretty realistic.
}
&lt;/uscript&gt;

Once again I would like anyone to correct or add to any of this.

==Related Topics==

[[Legacy:MinigunAmmo|MinigunAmmo]]

[[Legacy:MinigunPickup|MinigunPickup]]

[[Legacy:MinigunAmmoPickup|MinigunAmmoPickup]]

[[Legacy:InstantFire|InstantFire]]

[[Legacy:MinigunAltFire|MinigunAltFire]]

[[Legacy:MinigunAttachment|MinigunAttachment]]

[[Legacy:Code References|Code References]]

[[:Category:Legacy Class (UT)]]

==Comments==
[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinigunPickup</title>
    <id>2119</id>
    <revision>
      <id>5162</id>
      <timestamp>2003-10-05T20:06:11Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''UT2003, Build 2225'''''

The Pickup class for any weapon defines how the weapon looks when it's sitting on the ground (or in a [[Legacy:XWeaponBase|xWeaponBase]] in the case of UT2003).

&lt;uscript&gt;
//=============================================================================
// Minigun.
//=============================================================================
class MinigunPickup extends UTWeaponPickup; //The pickup class and its parent

static function StaticPrecache(LevelInfo L) //This are the stuff used by the gun.  Used only after first time game is run
{
    L.AddPrecacheMaterial(Texture'XEffects.TracerT');                    //The tracers you see when firing
    L.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex');             //The casing texture
    L.AddPrecacheMaterial(Texture'XGameShaders.MinigunFlash');           //The flash of the muzzle
    L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.MinigunPickup'); //The actual pick-up model
}

simulated function UpdatePrecacheMaterials() //This adds the stuff used by the minigun to the precache.  Only used first time you play unreal or if a server has changed these materials
{
    Level.AddPrecacheMaterial(Texture'XEffects.TracerT');
    Level.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex');
    Level.AddPrecacheMaterial(Texture'XGameShaders.MinigunFlash');
}

defaultproperties //The default settings for a few variables
{
     MaxDesireability=0.730000                     //How much the bots love this weapon.
     InventoryType=Class'XWeapons.Minigun'         //The type of slot it takes.
     PickupMessage=&quot;You got the Minigun.&quot;          //The message when you get it.
     PickupSound=Sound'PickupSounds.MinigunPickup' //The sound you hear when you pick it up.
     PickupForce=&quot;MinigunPickup&quot;
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'WeaponStaticMesh.MinigunPickup'
     DrawScale=0.600000
}
&lt;/uscript&gt;

Well, that's it for the minigun.  As always corrections are always wanted.

==Comments==

'''Dragonmaw:''' I have added a site for cataloguing all break-downs of the code.  Here is the link: [[Legacy:Code References|Code References]]</text>
    </revision>
    <revision>
      <id>5163</id>
      <timestamp>2003-10-05T17:16:05Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The Pickup class for any weapon defines how the weapon looks when it's sitting on the ground (or in a [[Legacy:XWeaponBase|xWeaponBase]] in the case of UT2003).

&lt;uscript&gt;
//=============================================================================
// Minigun.
//=============================================================================
class MinigunPickup extends UTWeaponPickup; //The pickup class and its parent

static function StaticPrecache(LevelInfo L) //This are the stuff used by the gun.  Used only after first time game is run
{
    L.AddPrecacheMaterial(Texture'XEffects.TracerT');                    //The tracers you see when firing
    L.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex');             //The casing texture
    L.AddPrecacheMaterial(Texture'XGameShaders.MinigunFlash');           //The flash of the muzzle
    L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.MinigunPickup'); //The actual pick-up model
}

simulated function UpdatePrecacheMaterials() //This adds the stuff used by the minigun to the precache.  Only used first time you play unreal or if a server has changed these materials
{
    Level.AddPrecacheMaterial(Texture'XEffects.TracerT');
    Level.AddPrecacheMaterial(Texture'XEffects.ShellCasingTex');
    Level.AddPrecacheMaterial(Texture'XGameShaders.MinigunFlash');
}

defaultproperties //The default settings for a few variables
{
     MaxDesireability=0.730000                     //How much the bots love this weapon.
     InventoryType=Class'XWeapons.Minigun'         //The type of slot it takes.
     PickupMessage=&quot;You got the Minigun.&quot;          //The message when you get it.
     PickupSound=Sound'PickupSounds.MinigunPickup' //The sound you hear when you pick it up.
     PickupForce=&quot;MinigunPickup&quot;
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'WeaponStaticMesh.MinigunPickup'
     DrawScale=0.600000
}
&lt;/uscript&gt;

Well, that's it for the minigun.  As always corrections are always wanted.

==Comments==

'''Dragonmaw:''' I have added a site for cataloguing all break-downs of the code.  Here is the link: [[Legacy:Code References|Code References]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinisterFish</title>
    <id>2087</id>
    <revision>
      <id>5083</id>
      <timestamp>2005-03-26T11:05:40Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Go to [[Legacy:MinisterFish/Developer Journal|MinisterFish/Developer Journal]] to see what I have been working on lately.

====My Bio====

I currently live in Denver, Colorado. I haven't spent much time in the Unreal world lately.

I started hanging out in the Unreal community at UTBooty (old review site) around early 2000 and started to get interested into mapping for UT. I have released two maps, CTF-Cathartic and DOM-Extractor, and worked on a mod called Team Hunt for the original UT. 

All of this started me to getting interested in game design and prompted me to go back to college so that I can get my Bachelor's Degree in Computer Science (have an Associates in Math already). I started to mess around with other games and things outside of the Unreal Community, such as coding for Q3, making maps with Worldcraft for HL games, working with the Torque Engine (Tribes2), learn how to make things for the WildTangent plugin, beta test some games, etc. I still hung around the Unreal community during all this time, but more as a player in clans for UT and UT2003.

====Contact Info====

Email: 
*chrisvoyles@hotmail.com
*chrisvoyles@yahoo.com

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5084</id>
      <timestamp>2003-04-28T20:00:08Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>hello</comment>
      <text xml:space="preserve">'''Tarquin:''' Hi there! Welcome to the unreal wiki :D

'''MinisterFish:''' Thanks :) I'll try to add my profile here sometime soon.

'''EntropicLqd:''' Hello and welcome.  That's an interesting name.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5085</id>
      <timestamp>2003-04-30T23:41:11Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Go to [[Legacy:MinisterFish/Developer Journal|MinisterFish/Developer Journal]] to see what I have been working on lately.

====My Bio====

I currently live in San Francisco and am a 33 year old college student (don't be like me and wait till you're this age to finish off your degree).

I started hanging the Unreal community at UTBooty (old review site) around early 2000 and started to get interested into mapping for UT. I only officially released one map even though I worked on quite a few different ideas. That map would be DOM-Extractor. I also did a remake of DM-Peak to DOM. All I did with that one was change the spawn points around and added some control points. 

All of this started me to getting interested in game design and prompted me to go back to college so that I can get my Bachelor's Degree in Computer Science (have an Associates in Math already). I started to mess around with other games and things outside of the Unreal Community, such as coding for Q3, making maps with Worldcraft for HL games, working with the Torque Engine (Tribes2), learn how to make things for the WildTangent plugin, play around with AliceBot.org to learn a little bit about chatterbots, beta test some games, etc. I still hung around the Unreal community during all this time, but more as a player in clans for UT and UT2003 and a forum member of http://www.utunlimited.net 

So, with all this interest in games and mapping, I created a site called 3DMappers.com, which is a site not really dedicated to one engine or even one kind of level design software. The site is more of a collection of resources than being a resource site in itself. Basically, it's just my little playground.

====Contact Info====

Email: 
*cvoyles@3dmappers.com
*ministerfish@runbox.com

Web:
* http://www.3dmappers.com 
* http://www.utunlimited.net

IRC: 
*irc.enterthegame.com #utunlimited #nc3 
*www.maxgaming.net #garagegames #realmwars

----

'''Tarquin:''' Hi there! Welcome to the unreal wiki :D

'''MinisterFish:''' Thanks :) I'll try to add my profile here sometime soon.

'''EntropicLqd:''' Hello and welcome.  That's an interesting name.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MinisterFish/Developer Journal</title>
    <id>2106</id>
    <revision>
      <id>5133</id>
      <timestamp>2005-03-26T11:19:35Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===March 26, 2005===

I have nothing planned at this moment. I'm just getting back to the Unreal scene after two years of being away. I'll look around the Wiki and see if there is anything I can contribute to for now.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5134</id>
      <timestamp>2003-08-05T09:51:19Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===June 2, 2003===

I found an old UT map on my hard drive that wasn't completed and decided to go ahead and finish it. Took me this whole last week to finish it. If you are interested, it can be found at http://www.utunlimited.net/downloads/ministerfish/CTF-Cathartic.zip .

I'm still skeptical about working on The Machine. I would hate to start a big project and not get any fulfillment out of it. I would think it would be better to just work on smaller projects that wouldnt take as long and I know i would finish.

===April 30, 2003===

I'm being lazy on my project ''The Machine'' but spending a little time getting to know a little more about scripted bots in UT2003 so it ain't all bad. I'll probably start back up on the game design doc for ''The Machine'' this weekend. I also need to go out and get a copy of Unreal2 since ''The Machine'' might be better suited for it than UT2003. I'm thinking lazy but realistic.

===May 2, 2003===

PHP time! Because game design documents (GDDs) can change quite a bit during the development processs, I'm going to start with a tool that will work with the dynamic property of a GDD. Creating the tool will delay me from actually working on the GDD for my game, but hopefully, it will help with this project and possible projects in the future.

I think the technical design documents could also be integrated with this tool, but I haven't quite figured out how I would do this.

'''Mychaeel:''' Hmm.  Did you ever consider using a Wiki for that?  :-)

'''MinisterFish:''' A Wiki would be handy for the editing part of a design doc, but it's too open. I'm going to digest your suggestion and figure out what would be the pros and cons for me using a Wiki.

'''Wormbo:''' The UDN and the JDN (Jailbreak Developers Network) are both Wikis.

===May 4, 2003===

OK, I have been playing around with my own Wiki and will most likely use this for my own project.

I have also been thinking about my project. I've been looking at my [http://3dmappers.com/treatment.shtml treatment] over and over again. I've been thinking of changing my background story and setting to something based on an Unreal story and setting. The things I would changes in my [http://3dmappers.com/treatment.shtml treament] are:
*Getting rid of the ALMs skill base system and just go with acquiring weapons and weapons upgrades as the means of advancing skill.
*Weapons will be based off of Unreal 2 weapons with maybe some additional functionality to some of the weapons, such as a stun component to the dispersion pistol.
*No explosives except the grenade launcher.
*No environmental training, hacking, or infiltration skills.
*The suit system will be just like that of Unreal 2.
*Infiltration would be just having the player trying to be quiet to avoid detection (walk vs run).
*No training session mission because people should be familar with gameplay from Unreal 2.
*I still want vehicles added.
*There should still be dual paths to reach the main objective of the game based on the player's actions. So, the missions are still basically the same but the names and setting changes.
*I still want an inventory system.

I have dumbed down the project quite a bit (this has really been dumbed down from a beginning of a MMORPG on a totally different engine than Unreal). Now I'll need less models and skins, less coding, and less time to do the project. Hopefully, it will still be fun to play, but I know it won't have near the depth of what I actually want to do. Just trying to be realistic with myself and want something I know I can do myself in case I don't get a team to help me.

So, my next step with this is to rewrite the treatment.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Minuszero</title>
    <id>2090</id>
    <revision>
      <id>5091</id>
      <timestamp>2003-11-20T19:23:07Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki. :tup: &amp;rarr;[[Legacy:GRAF1K|GRAF1K]]</text>
    </revision>
    <revision>
      <id>5092</id>
      <timestamp>2003-11-20T19:22:02Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Welcome to the Unreal Wiki! Your [[Legacy:Bulldog Player|Bulldog Player]] tutorial looks quite interesting. :tup: &amp;rarr;[[Legacy:GRAF1K|GRAF1K]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MipMap</title>
    <id>1785</id>
    <revision>
      <id>4380</id>
      <timestamp>2007-03-08T02:53:26Z</timestamp>
      <contributor>
        <ip>Bas2-hamilton14-1167918194.dsl.bell.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''MipMaps''' are downscaled versions (by powers of two) of a [[Legacy:Texture|Texture]] that are automatically created if you select ''Create MipMaps'' when [[Legacy:Texture Import And Export|importing a texture]].

The engine uses MipMaps to reduce jitter on textured surfaces when they're viewed from a distance; this process is called [[Legacy:Bilinear Filtering|bilinear filtering]].  When drawing a [[Legacy:Brush|brush]] surface on the screen, the engine selects the MipMap that fits best; in fact, different parts of the surface can be textured with different MipMaps.  Blending multiple MipMaps is called [[Legacy:Trilinear Filtering|trilinear filtering]].

While the Unreal engine supports [[Legacy:Texture|Texture]]s up to sizes beyond 256x256, some (older) video hardware can't go higher than that.  In order to accommodate that, the engine then simply selects the largest MipMap the hardware can handle and displays that instead.  So, feel free to use large textures, but if you do, ''always'' create MipMaps for them.

[[Legacy:ScriptedTexture|ScriptedTexture]]s, [[Legacy:FireTexture|FireTexture]]s and other [[Legacy:Dynamic Texture|Dynamic Texture]]s have in principle no MipMaps and thus are restricted to 256x256 pixels.  MipMaps also aren't used on [[Legacy:Mesh|mesh]]es, so the same restriction applies for them as well.

==Example ==

Until anyone else uploads this anywhere, download the sample [http://www.geocities.com/aqqt/mipmap_sample.zip this location]. I hope it helps somehow :)

Bright red is top detail (original texture), lower detail = darker red. The smallest MipMaps (8x8 and lower) are black.

==Types of texture that should not have MipMaps==

Mipmaps should never be created for any texture that is going to be used for anything Interface-related. Player Portrait images and weapon HUD icons are two examples of this.

:'''Mychaeel:''' I disagree.  MipMaps can ''greatly'' enhance the display of a downscaled image; otherwise the video card just skips pixels when drawing a downscaled texture or texture part on the HUD.
:'''Legal:''' I agree with Mychaeel here - MipMaps are often great for Player Portraits in example, however you should make sure the MipMaps doesn't look like shit. The .dds plug-in for Photoshop allows you to see and edit individual MipMaps of textures. If something can't be done with MipMaps, like sometimes the scope of a sniper rifle, leave it out. But make it a last option.
:A note about Terrain Heightmap images: there is absolutely no need to create mipmaps for a G16 heightmap image, as the texture itself will never be seen within the game. Mipmaps are purely aesthetic in their nature, so a good rule of thumb would be: If you can't see it in-game, it doesn't need mipmaps (excepting Interface content as mentioned above of course).

:'''Drak:''' I generally drop the mips for masked textures, this reduces the mask from being blurred in the distance.  Also, 2003 &amp; 2004 have an LODset property found within the texture's properties dialog box under 'Texture' that will decide which mip is best for the engine internally.  Just select the appropriate one such as:  LODset_Interface.  In fact, this property should be set for your level preview screenshots for instance.  By default LODset_World is selected upon import.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4381</id>
      <timestamp>2004-06-16T18:25:42Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''MipMaps''' are downscaled versions (by powers of two) of a [[Legacy:Texture|Texture]] that are automatically created if you select ''Create MipMaps'' when [[Legacy:Texture Import And Export|importing a texture]].

The engine uses MipMaps to reduce jitter on textured surfaces when they're viewed from a distance; this process is called [[Legacy:Bilinear Filtering|bilinear filtering]].  When drawing a [[Legacy:Brush|brush]] surface on the screen, the engine selects the MipMap that fits best; in fact, different parts of the surface can be textured with different MipMaps.  Blending multiple MipMaps is called [[Legacy:Trilinear Filtering|trilinear filtering]].

While the Unreal engine supports [[Legacy:Texture|Texture]]s up to sizes beyond 256x256, some (older) video hardware can't go higher than that.  In order to accommodate that, the engine then simply selects the largest MipMap the hardware can handle and displays that instead.  So, feel free to use large textures, but if you do, ''always'' create MipMaps for them.

[[Legacy:ScriptedTexture|ScriptedTexture]]s, [[Legacy:FireTexture|FireTexture]]s and other [[Legacy:Dynamic Texture|Dynamic Texture]]s have in principle no MipMaps and thus are restricted to 256x256 pixels.  MipMaps also aren't used on [[Legacy:Mesh|mesh]]es, so the same restriction applies for them as well.

==Example ==

Until anyone else uploads this anywhere, download the sample [http://www.geocities.com/aqqt/mipmap_sample.zip this location]. I hope it helps somehow :)

Bright red is top detail (original texture), lower detail = darker red. The smallest MipMaps (8x8 and lower) are black.

==Types of texture that should not have MipMaps==

Mipmaps should never be created for any texture that is going to be used for anything Interface-related. Player Portrait images and weapon HUD icons are two examples of this.

:'''Mychaeel:''' I disagree.  MipMaps can ''greatly'' enhance the display of a downscaled image; otherwise the video card just skips pixels when drawing a downscaled texture or texture part on the HUD.
:'''Legal:''' I agree with Mychaeel here - MipMaps are often great for Player Portraits in example, however you should make sure the MipMaps doesn't look like shit. The .dds plug-in for Photoshop allows you to see and edit individual MipMaps of textures. If something can't be done with MipMaps, like sometimes the scope of a sniper rifle, leave it out. But make it a last option.

A note about Terrain Heightmap images: there is absolutely no need to create mipmaps for a G16 heightmap image, as the texture itself will never be seen within the game. Mipmaps are purely aesthetic in their nature, so a good rule of thumb would be: If you can't see it in-game, it doesn't need mipmaps (excepting Interface content as mentioned above of course).

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35503</id>
      <timestamp>2009-10-24T14:47:18Z</timestamp>
      <contributor>
        <ip>24.132.196.15</ip>
      </contributor>
      <comment>Added a comment regarding text and masked textures, and fixed one minor grammar &quot;mistake&quot; - XpanD</comment>
      <text xml:space="preserve">'''MipMaps''' are downscaled versions (by powers of two) of a [[Legacy:Texture|Texture]] that are automatically created if you select ''Create MipMaps'' when [[Legacy:Texture Import And Export|importing a texture]].

The engine uses MipMaps to reduce jitter on textured surfaces when they're viewed from a distance; this process is called [[Legacy:Bilinear Filtering|bilinear filtering]].  When drawing a [[Legacy:Brush|brush]] surface on the screen, the engine selects the MipMap that fits best; in fact, different parts of the surface can be textured with different MipMaps.  Blending multiple MipMaps is called [[Legacy:Trilinear Filtering|trilinear filtering]].

While the Unreal engine supports [[Legacy:Texture|Texture]]s up to sizes beyond 256x256, some (older) video hardware can't go higher than that.  In order to accommodate that, the engine then simply selects the largest MipMap the hardware can handle and displays that instead.  So, feel free to use large textures, but if you do, ''always'' create MipMaps for them.

[[Legacy:ScriptedTexture|ScriptedTexture]]s, [[Legacy:FireTexture|FireTexture]]s and other [[Legacy:Dynamic Texture|Dynamic Texture]]s have in principle no MipMaps and thus are restricted to 256x256 pixels.  MipMaps also aren't used on [[Legacy:Mesh|mesh]]es, so the same restriction applies for them as well.

==Example ==

Until anyone else uploads this anywhere, download the sample [http://www.geocities.com/aqqt/mipmap_sample.zip this location]. I hope it helps somehow :)

Bright red is top detail (original texture), lower detail = darker red. The smallest MipMaps (8x8 and lower) are black.

==Types of texture that should not have MipMaps==

MipMaps should never be created for any texture that is going to be used for anything Interface-related. Player Portrait images and weapon HUD icons are two examples of this.

:'''Mychaeel:''' I disagree.  MipMaps can ''greatly'' enhance the display of a downscaled image; otherwise the video card just skips pixels when drawing a downscaled texture or texture part on the HUD.
:'''Legal:''' I agree with Mychaeel here - MipMaps are often great for Player Portraits in example, however you should make sure the MipMaps doesn't look like shit. The .dds plug-in for Photoshop allows you to see and edit individual MipMaps of textures. If something can't be done with MipMaps, like sometimes the scope of a sniper rifle, leave it out. But make it a last option.
:A note about Terrain Heightmap images: there is absolutely no need to create mipmaps for a G16 heightmap image, as the texture itself will never be seen within the game. Mipmaps are purely aesthetic in their nature, so a good rule of thumb would be: If you can't see it in-game, it doesn't need mipmaps (excepting Interface content as mentioned above of course).

:'''Drak:''' I generally drop the mips for masked textures, this reduces the mask from being blurred in the distance.  Also, 2003 &amp; 2004 have an LODset property found within the texture's properties dialog box under 'Texture' that will decide which mip is best for the engine internally.  Just select the appropriate one such as:  LODset_Interface.  In fact, this property should be set for your level preview screenshots for instance.  By default LODset_World is selected upon import.

:'''XpanD:''' I'm working on a tutorial map for a gametype (BunnyTracks for anybody interested) at the moment, and I'm using a lot of floating text in the map (in 12 human-translated languages, and every texture is 256x256 size and masked). Well, anyways... I found that when I turn off MipMaps, those textures I'm using to display the translation are a lot crisper when looked at from afar. So... For text I'd personally recommend people to not use MipMaps, unless you actually WANT the text to blur when you get a certain distance from it. Oh, one more thing... The file I loaded all of these textures into also lost about 1.5MB in size, going from 8MB to just 6.6MB. :)

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35504</id>
      <timestamp>2009-10-24T14:48:33Z</timestamp>
      <contributor>
        <ip>24.132.196.15</ip>
      </contributor>
      <comment>Oops, forgot to add that it was in UT1/UT99. :P</comment>
      <text xml:space="preserve">'''MipMaps''' are downscaled versions (by powers of two) of a [[Legacy:Texture|Texture]] that are automatically created if you select ''Create MipMaps'' when [[Legacy:Texture Import And Export|importing a texture]].

The engine uses MipMaps to reduce jitter on textured surfaces when they're viewed from a distance; this process is called [[Legacy:Bilinear Filtering|bilinear filtering]].  When drawing a [[Legacy:Brush|brush]] surface on the screen, the engine selects the MipMap that fits best; in fact, different parts of the surface can be textured with different MipMaps.  Blending multiple MipMaps is called [[Legacy:Trilinear Filtering|trilinear filtering]].

While the Unreal engine supports [[Legacy:Texture|Texture]]s up to sizes beyond 256x256, some (older) video hardware can't go higher than that.  In order to accommodate that, the engine then simply selects the largest MipMap the hardware can handle and displays that instead.  So, feel free to use large textures, but if you do, ''always'' create MipMaps for them.

[[Legacy:ScriptedTexture|ScriptedTexture]]s, [[Legacy:FireTexture|FireTexture]]s and other [[Legacy:Dynamic Texture|Dynamic Texture]]s have in principle no MipMaps and thus are restricted to 256x256 pixels.  MipMaps also aren't used on [[Legacy:Mesh|mesh]]es, so the same restriction applies for them as well.

==Example ==

Until anyone else uploads this anywhere, download the sample [http://www.geocities.com/aqqt/mipmap_sample.zip this location]. I hope it helps somehow :)

Bright red is top detail (original texture), lower detail = darker red. The smallest MipMaps (8x8 and lower) are black.

==Types of texture that should not have MipMaps==

MipMaps should never be created for any texture that is going to be used for anything Interface-related. Player Portrait images and weapon HUD icons are two examples of this.

:'''Mychaeel:''' I disagree.  MipMaps can ''greatly'' enhance the display of a downscaled image; otherwise the video card just skips pixels when drawing a downscaled texture or texture part on the HUD.
:'''Legal:''' I agree with Mychaeel here - MipMaps are often great for Player Portraits in example, however you should make sure the MipMaps doesn't look like shit. The .dds plug-in for Photoshop allows you to see and edit individual MipMaps of textures. If something can't be done with MipMaps, like sometimes the scope of a sniper rifle, leave it out. But make it a last option.
:A note about Terrain Heightmap images: there is absolutely no need to create mipmaps for a G16 heightmap image, as the texture itself will never be seen within the game. Mipmaps are purely aesthetic in their nature, so a good rule of thumb would be: If you can't see it in-game, it doesn't need mipmaps (excepting Interface content as mentioned above of course).

:'''Drak:''' I generally drop the mips for masked textures, this reduces the mask from being blurred in the distance.  Also, 2003 &amp; 2004 have an LODset property found within the texture's properties dialog box under 'Texture' that will decide which mip is best for the engine internally.  Just select the appropriate one such as:  LODset_Interface.  In fact, this property should be set for your level preview screenshots for instance.  By default LODset_World is selected upon import.

:'''XpanD:''' I'm working on a tutorial map for a gametype (BunnyTracks for anybody interested) in UT1 at the moment, and I'm using a lot of floating text in the map (in 12 human-translated languages, and every texture is 256x256 size and masked). Well, anyways... I found that when I turn off MipMaps, those textures I'm using to display the translation are a lot crisper when looked at from afar. So... For text I'd personally recommend people to not use MipMaps, unless you actually WANT the text to blur when you get a certain distance from it. Oh, one more thing... The file I loaded all of these textures into also lost about 1.5MB in size, going from 8MB to just 6.6MB. :)

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mit'Yau</title>
    <id>1804</id>
    <revision>
      <id>4427</id>
      <timestamp>2002-07-06T14:02:50Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>[[Category Personal Page]]</comment>
      <text xml:space="preserve">:&lt;i&gt;Hi, and welcome to the Wiki.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4428</id>
      <timestamp>2002-04-22T15:40:39Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">:&lt;i&gt;Hi, and welcome to the Wiki.  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mix</title>
    <id>2148</id>
    <revision>
      <id>5230</id>
      <timestamp>2004-03-16T22:36:14Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>welcome</comment>
      <text xml:space="preserve">===Stuff I'm Doing===
* [http://duffers.beyondunreal.com Duffers Golf]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer'S Journal]]
* [http://www.mixworld.com mixworld.com] (personal blog, also some dev stuff)
* [http://www.coilgames.com coilgames.com]

----

'''EntropicLqd:''' Hi, welcome to the Wiki.  Enjoy your stay here.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5231</id>
      <timestamp>2004-03-16T21:51:18Z</timestamp>
      <contributor>
        <ip>Mix</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Stuff I'm Doing===
* [http://duffers.beyondunreal.com Duffers Golf]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer'S Journal]]
* [http://www.mixworld.com mixworld.com] (personal blog, also some dev stuff)
* [http://www.coilgames.com coilgames.com]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mix/Developer's Journal</title>
    <id>2131</id>
    <revision>
      <id>5187</id>
      <timestamp>2004-09-30T18:35:23Z</timestamp>
      <contributor>
        <ip>Mix</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| September 30, 2004}}
:Been a while—yada, yada. 

:After the results were released for Phase 3, we decided to step back and re-evaluate. Duffers is going through a bit of a metamorphosis, and the core gameplay is changing. We haven't announced this elsewhere, but adept followers (are there any?) should realize that we're going totally mini-golf. We're also not aiming for a simulation, but our version of it. Duffers' previous incarnations were too simulation-y, and a poor one at that. We never intended for it to be that way, but somehow it happened. Now we're focusing on what gameplay we can accomplish with our limited resources, so things like player models are out.

:Another change is that since we're only concentrating on &quot;Putting&quot;, we're going to recode the physics for it. The previous system was more of a hack, and wasn't too concerned with collisions other than vertical (ball on ground). Now we're moving to a more general physics/collision method.

:Also, the holes are constructed from modular 'set pieces' instead of being specific meshes. This allows us to spend less time constructing holes, and will allow fans to easily create new courses in UnrealEd only. One of the biggest problems we've had with Duffers is the skill overhead needed for course creation.

{{classbox| May 20, 2004}}
:The biggest hurdle in porting Duffers to UT2K4 hasn't been physics, gameplay, or replication; it's been the GUI. Epic rewrote major portions of the GUI and it's been my task to get all our old convoluted menu code converted over to the new system. Some stuff works without modification, but I've had to rewrite the Settings pages and the Server Browser (which is the WORST, as the UT2K4 browser is even more complex than UT2K3's was, and that's saying something). There are things about the new system I like, such as being able to override styles just by creating your own style with the same keyname. That alone eliminated a lot of bad code I had to hack together to change the styles of things like moComboBox. The '''automated''' keyword addition makes GUI objects easier to implement. Makes me wish I had that functionality when I was creating the GUI the first time.

:I think our initial release went well, even though the game is very rough. Feedback has been largely positive, with most commenting on the achievement of getting Golf into UT.

{{classbox| May 7, 2004}}
:The Unreal Engine continues to amaze me. Not only were we able to code our own ball physics, it has come out fairly convincing. There are a few minor hitches, such as a slight pause when the ball switches from falling/bouncing to rolling, and sometimes the ball does a series of little 'bunny hops' when the velocity is low and the angle almost perpendicular. However, I am confident we can overcome both soon. What we don't have anymore is a problem with the ball falling through the ground. That's a huge relief.

{{classbox| April 15, 2004}}
:We're moving, albeit slowly, towards a public release. Physics continue to be a stumbling block, as we aren't math gurus. I'm still confident we will pull it off, I'm just not sure how long it will take. What I'm worried about (and we haven't getton into yet) is rolling. Figuring out what the velocity should be based on angle and friction is going to be a bit intensive. And that doesn't even count rotation.

:If anyone has some insight on ball physics and would like to lend some advice, we're all ears.

{{classbox| April 8, 2004}}
:It's been a little while since I updated this journal, but for good reason. We've been incredibly busy with Duffers, trying to get it ready for a public release. I've started redoing the course, and the technique I came up with is working out very well. Each hole is made up of static meshes, and the edge of the hole is faded out to invisible. This allows the hole to blend into the skybox, and makes the whole thing look seamless. The hole, even though they share the same shape and size as the previous course, look much bigger, due to the larger surrounding area and open space. I need to redo the grass textures however, since I changed the lighting quite a bit, and that dramatically changed the look of the current textures. It seems like fixing one problem creates another.

:Our other big issue we've been facing is ball physics and the tendency for the ball to fall through the ground. We thought we had corrected it somewhat, but we were still having problems every once in a while, especially on slower systems. Now our approach has turned to creating our own physics, and not just for rolling, but for the entirety of the ball flight. We're doing this so we have a more airtight handle on the ball and it also allows us to have more control over drag, wind resistance, and the hook/slice modifications we need to make to the ball. We've been having to read up on our physics calculations, but it's coming along. We initially had panned this idea since we thought it would be too CPU intensive, but UnrealScript has proven more capable than we anticipated, and there is only one ball per team in motion at any time.

:It's just too bad that Karma couldn't handle this situation. We had big issues with multiplayer, as the simulation would deviate on the server and client. Updating the state resulted in jumpyness, and that's not something you want in a golf game. The last thing you need is for the client to see the ball drop in the cup but the server has it rolling just outside. We cannot afford to have a major discrepancy between the two.

:We initially wanted our closed beta period to last only a week, then release a public version, but with these problems and the Easter holiday, that looks unlikely. I'm at the point where trying to nail down a date seems pointless. We'll just press on as hard as humanly possible.

{{classbox| March 23, 2004}}
:Our weekly testing/coding session went fairly well this past weekend, but it didn't seem on the surface that we got much accomplished. We're at the point where the major stuff is working, and we're tying up the millions of loose ends that help it all work together seamlessly. Our Karma woes are less but not totally gone, as we've had some luck tracing every tick. One problem we have now is that the client can get quite out of sync with the server. You can hit your ball and it seems to go into the cup, but the server registered something different. That's bad. We're looking in to how to remedy this somewhat.

:I need to get my issues taken care of (I'm handling interface duties) so I can get back to asset creation and my next major task: redoing the course for the third time. I've decided to construct it entirely out of static meshes, and contain each hole in its own &quot;room&quot;. This will solve some problems for us, but you won't be able to see other players on other holes like we had initially planned. I think it's a valid tradeoff.

{{classbox| March 16, 2004}}
:I decided to start writing a journal here on the wiki as a kind of suppliment to the blogging I do on [http://www.mixworld.com mixworld]. The wiki will hopefully allow me to get some feedback on the problems the team is having on our project [http://duffers.beyondunreal.com Duffers Golf]. I'll keep this journal strictly related to UnrealScript and UEngine discussions, and relate other thoughts on the blog. Blah blah blah.

:Anyway, the current problem we're having is with collision. Maybe we're UnrealScript newbies (which in a way, we are) but we're struggling with the ball flight. After much trial and error, we settled on a solution that has the ball using PHYS_Falling for the main part of ball flight and when it slows to rolling speed, switching over to PHYS_Karma. It works reasonably well about 90% of the time, but under certain conditions (slow machines, weird angles, etc) the ball will fall through the ground. That is bad.

:We know why it happens; Karma doesn't have prediction like the other PHYS_ types do. We saw this coming, and even toyed with the idea of using PHYS_Walking and scripting the rotation of the ball as it rolled, but decided it was too much trouble. I'm now thinking it might not be as much trouble. We're kind of caught in the middle. The other PHYS_ types don't do as much as we need, and Karma does too much (in a sense). I wish we had more access to make it work like we want, but that's the price you pay for doing a mod.

'''Foxpaw:''' Just thought I'd toss in my two cents.. The reason stuff is falling through the floor is probrably because you're using terrain for the ground, and terrain is a thin sheet. So, if an object is moving more than the size of it's collision hull per tick, it can be on one side of the terraininfo one tick, and the other side the other tick, without ever actually overlapping the terraininfo, which is required to collide with a terraininfo. There's no real &quot;prediction&quot; in any of the physics types, but most stuff in Unreal is moving slowly enough or is big enough that falling through terrain isn't an issue.

Fast moving projectiles in UT2003 trace from their current position to their last position every tick, to see if they intercepted anything during that tick. If they did, you can set them to the point they intersected and go from there. That is how they avoid travelling &quot;through&quot; things. Also, hitting BSP and some static mesh collision hulls will cause this behaviour natively, but not terrain, as you can pass through terrain without ever touching it if you are small and fast moving enough.

'''Mix:''' We're actually using static meshes for the bulk of the level now, and are probably going to switch over to completely using static meshes, but the same theory applies. I guess 'prediction' was a bad term to use. The problem is Karma doesn't do that natively, and we're worried that tracing every tick will be too detrimental to performance.  What do you think of essentially coding our own 'physics' (as we still have to factor in wind and air resistance)? We're worried that it would be too slow.

'''Foxpaw:''' I wouldn't worry about performance if you're just doing the physics on the one ball. The tracing thing is done by many projectiles in UT2003, of which there may be dozens flying about at any time. Traces aren't particularly a &quot;heavyweight&quot; action in UT2003, though they were in UT. (Basically, they're not heavyweight on more modern machines) The exception of course is large extent traces, but a zero extent trace (a normal trace) should be fine for the size of the ball. I would stick with what you're doing now and just put in wind resistance and such by modifying the velocity of the object when in PHYS_Falling. Karma already has wind resistance and such, but you may need to adjust the amount of it. 

'''Mix:''' So basically we need to add in to PHYS_Karma what the other physics types already have; ie, a trace to see if they passed through anything during each tick.

'''Foxpaw:''' Well, no.. The other physics types don't have that. But they can appear to because when they get moved internally via SetLocation(), (natively) if they are inside something else then they will be placed at the nearest possible location that isn't inside that. Non-Karma actors can fall through stuff too.

The thing with Karma is, Karma simulated actors don't teleport to the nearest non-touching thing. I would do what you described initially, basically use PHYS_Falling whenever the ball is airborne/bouncing (and thus take advantage of the &quot;teleportation&quot;, and only use Karma when the ball has more or less stopped bouncing and is just rolling. You could implement something like the tracing done on projectiles with the Karma as well, like you suggested. That would probrably work. However, it will likely be somewhat more involved coding-wise.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5188</id>
      <timestamp>2004-03-17T21:06:04Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| March 16, 2004}}
:I decided to start writing a journal here on the wiki as a kind of suppliment to the blogging I do on [http://www.mixworld.com mixworld]. The wiki will hopefully allow me to get some feedback on the problems the team is having on our project [http://duffers.beyondunreal.com Duffers Golf]. I'll keep this journal strictly related to UnrealScript and UEngine discussions, and relate other thoughts on the blog. Blah blah blah.

:Anyway, the current problem we're having is with collision. Maybe we're UnrealScript newbies (which in a way, we are) but we're struggling with the ball flight. After much trial and error, we settled on a solution that has the ball using PHYS_Falling for the main part of ball flight and when it slows to rolling speed, switching over to PHYS_Karma. It works reasonably well about 90% of the time, but under certain conditions (slow machines, weird angles, etc) the ball will fall through the ground. That is bad.

:We know why it happens; Karma doesn't have prediction like the other PHYS_ types do. We saw this coming, and even toyed with the idea of using PHYS_Walking and scripting the rotation of the ball as it rolled, but decided it was too much trouble. I'm now thinking it might not be as much trouble. We're kind of caught in the middle. The other PHYS_ types don't do as much as we need, and Karma does too much (in a sense). I wish we had more access to make it work like we want, but that's the price you pay for doing a mod.

'''Foxpaw:''' Just thought I'd toss in my two cents.. The reason stuff is falling through the floor is probrably because you're using terrain for the ground, and terrain is a thin sheet. So, if an object is moving more than the size of it's collision hull per tick, it can be on one side of the terraininfo one tick, and the other side the other tick, without ever actually overlapping the terraininfo, which is required to collide with a terraininfo. There's no real &quot;prediction&quot; in any of the physics types, but most stuff in Unreal is moving slowly enough or is big enough that falling through terrain isn't an issue.

Fast moving projectiles in UT2003 trace from their current position to their last position every tick, to see if they intercepted anything during that tick. If they did, you can set them to the point they intersected and go from there. That is how they avoid travelling &quot;through&quot; things. Also, hitting BSP and some static mesh collision hulls will cause this behaviour natively, but not terrain, as you can pass through terrain without ever touching it if you are small and fast moving enough.

'''Mix:''' We're actually using static meshes for the bulk of the level now, and are probably going to switch over to completely using static meshes, but the same theory applies. I guess 'prediction' was a bad term to use. The problem is Karma doesn't do that natively, and we're worried that tracing every tick will be too detrimental to performance.  What do you think of essentially coding our own 'physics' (as we still have to factor in wind and air resistance)? We're worried that it would be too slow.

'''Foxpaw:''' I wouldn't worry about performance if you're just doing the physics on the one ball. The tracing thing is done by many projectiles in UT2003, of which there may be dozens flying about at any time. Traces aren't particularly a &quot;heavyweight&quot; action in UT2003, though they were in UT. (Basically, they're not heavyweight on more modern machines) The exception of course is large extent traces, but a zero extent trace (a normal trace) should be fine for the size of the ball. I would stick with what you're doing now and just put in wind resistance and such by modifying the velocity of the object when in PHYS_Falling. Karma already has wind resistance and such, but you may need to adjust the amount of it. 

'''Mix:''' So basically we need to add in to PHYS_Karma what the other physics types already have; ie, a trace to see if they passed through anything during each tick.

'''Foxpaw:''' Well, no.. The other physics types don't have that. But they can appear to because when they get moved internally via SetLocation(), (natively) if they are inside something else then they will be placed at the nearest possible location that isn't inside that. Non-Karma actors can fall through stuff too.

The thing with Karma is, Karma simulated actors don't teleport to the nearest non-touching thing. I would do what you described initially, basically use PHYS_Falling whenever the ball is airborne/bouncing (and thus take advantage of the &quot;teleportation&quot;, and only use Karma when the ball has more or less stopped bouncing and is just rolling. You could implement something like the tracing done on projectiles with the Karma as well, like you suggested. That would probrably work. However, it will likely be somewhat more involved coding-wise.</text>
    </revision>
    <revision>
      <id>5189</id>
      <timestamp>2004-05-20T20:41:09Z</timestamp>
      <contributor>
        <ip>Mix</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| May 20, 2004}}
:The biggest hurdle in porting Duffers to UT2K4 hasn't been physics, gameplay, or replication; it's been the GUI. Epic rewrote major portions of the GUI and it's been my task to get all our old convoluted menu code converted over to the new system. Some stuff works without modification, but I've had to rewrite the Settings pages and the Server Browser (which is the WORST, as the UT2K4 browser is even more complex than UT2K3's was, and that's saying something). There are things about the new system I like, such as being able to override styles just by creating your own style with the same keyname. That alone eliminated a lot of bad code I had to hack together to change the styles of things like moComboBox. The '''automated''' keyword addition makes GUI objects easier to implement. Makes me wish I had that functionality when I was creating the GUI the first time.

:I think our initial release went well, even though the game is very rough. Feedback has been largely positive, with most commenting on the achievement of getting Golf into UT.

{{classbox| May 7, 2004}}
:The Unreal Engine continues to amaze me. Not only were we able to code our own ball physics, it has come out fairly convincing. There are a few minor hitches, such as a slight pause when the ball switches from falling/bouncing to rolling, and sometimes the ball does a series of little 'bunny hops' when the velocity is low and the angle almost perpendicular. However, I am confident we can overcome both soon. What we don't have anymore is a problem with the ball falling through the ground. That's a huge relief.

{{classbox| April 15, 2004}}
:We're moving, albeit slowly, towards a public release. Physics continue to be a stumbling block, as we aren't math gurus. I'm still confident we will pull it off, I'm just not sure how long it will take. What I'm worried about (and we haven't getton into yet) is rolling. Figuring out what the velocity should be based on angle and friction is going to be a bit intensive. And that doesn't even count rotation.

:If anyone has some insight on ball physics and would like to lend some advice, we're all ears.

{{classbox| April 8, 2004}}
:It's been a little while since I updated this journal, but for good reason. We've been incredibly busy with Duffers, trying to get it ready for a public release. I've started redoing the course, and the technique I came up with is working out very well. Each hole is made up of static meshes, and the edge of the hole is faded out to invisible. This allows the hole to blend into the skybox, and makes the whole thing look seamless. The hole, even though they share the same shape and size as the previous course, look much bigger, due to the larger surrounding area and open space. I need to redo the grass textures however, since I changed the lighting quite a bit, and that dramatically changed the look of the current textures. It seems like fixing one problem creates another.

:Our other big issue we've been facing is ball physics and the tendency for the ball to fall through the ground. We thought we had corrected it somewhat, but we were still having problems every once in a while, especially on slower systems. Now our approach has turned to creating our own physics, and not just for rolling, but for the entirety of the ball flight. We're doing this so we have a more airtight handle on the ball and it also allows us to have more control over drag, wind resistance, and the hook/slice modifications we need to make to the ball. We've been having to read up on our physics calculations, but it's coming along. We initially had panned this idea since we thought it would be too CPU intensive, but UnrealScript has proven more capable than we anticipated, and there is only one ball per team in motion at any time.

:It's just too bad that Karma couldn't handle this situation. We had big issues with multiplayer, as the simulation would deviate on the server and client. Updating the state resulted in jumpyness, and that's not something you want in a golf game. The last thing you need is for the client to see the ball drop in the cup but the server has it rolling just outside. We cannot afford to have a major discrepancy between the two.

:We initially wanted our closed beta period to last only a week, then release a public version, but with these problems and the Easter holiday, that looks unlikely. I'm at the point where trying to nail down a date seems pointless. We'll just press on as hard as humanly possible.

{{classbox| March 23, 2004}}
:Our weekly testing/coding session went fairly well this past weekend, but it didn't seem on the surface that we got much accomplished. We're at the point where the major stuff is working, and we're tying up the millions of loose ends that help it all work together seamlessly. Our Karma woes are less but not totally gone, as we've had some luck tracing every tick. One problem we have now is that the client can get quite out of sync with the server. You can hit your ball and it seems to go into the cup, but the server registered something different. That's bad. We're looking in to how to remedy this somewhat.

:I need to get my issues taken care of (I'm handling interface duties) so I can get back to asset creation and my next major task: redoing the course for the third time. I've decided to construct it entirely out of static meshes, and contain each hole in its own &quot;room&quot;. This will solve some problems for us, but you won't be able to see other players on other holes like we had initially planned. I think it's a valid tradeoff.

{{classbox| March 16, 2004}}
:I decided to start writing a journal here on the wiki as a kind of suppliment to the blogging I do on [http://www.mixworld.com mixworld]. The wiki will hopefully allow me to get some feedback on the problems the team is having on our project [http://duffers.beyondunreal.com Duffers Golf]. I'll keep this journal strictly related to UnrealScript and UEngine discussions, and relate other thoughts on the blog. Blah blah blah.

:Anyway, the current problem we're having is with collision. Maybe we're UnrealScript newbies (which in a way, we are) but we're struggling with the ball flight. After much trial and error, we settled on a solution that has the ball using PHYS_Falling for the main part of ball flight and when it slows to rolling speed, switching over to PHYS_Karma. It works reasonably well about 90% of the time, but under certain conditions (slow machines, weird angles, etc) the ball will fall through the ground. That is bad.

:We know why it happens; Karma doesn't have prediction like the other PHYS_ types do. We saw this coming, and even toyed with the idea of using PHYS_Walking and scripting the rotation of the ball as it rolled, but decided it was too much trouble. I'm now thinking it might not be as much trouble. We're kind of caught in the middle. The other PHYS_ types don't do as much as we need, and Karma does too much (in a sense). I wish we had more access to make it work like we want, but that's the price you pay for doing a mod.

'''Foxpaw:''' Just thought I'd toss in my two cents.. The reason stuff is falling through the floor is probrably because you're using terrain for the ground, and terrain is a thin sheet. So, if an object is moving more than the size of it's collision hull per tick, it can be on one side of the terraininfo one tick, and the other side the other tick, without ever actually overlapping the terraininfo, which is required to collide with a terraininfo. There's no real &quot;prediction&quot; in any of the physics types, but most stuff in Unreal is moving slowly enough or is big enough that falling through terrain isn't an issue.

Fast moving projectiles in UT2003 trace from their current position to their last position every tick, to see if they intercepted anything during that tick. If they did, you can set them to the point they intersected and go from there. That is how they avoid travelling &quot;through&quot; things. Also, hitting BSP and some static mesh collision hulls will cause this behaviour natively, but not terrain, as you can pass through terrain without ever touching it if you are small and fast moving enough.

'''Mix:''' We're actually using static meshes for the bulk of the level now, and are probably going to switch over to completely using static meshes, but the same theory applies. I guess 'prediction' was a bad term to use. The problem is Karma doesn't do that natively, and we're worried that tracing every tick will be too detrimental to performance.  What do you think of essentially coding our own 'physics' (as we still have to factor in wind and air resistance)? We're worried that it would be too slow.

'''Foxpaw:''' I wouldn't worry about performance if you're just doing the physics on the one ball. The tracing thing is done by many projectiles in UT2003, of which there may be dozens flying about at any time. Traces aren't particularly a &quot;heavyweight&quot; action in UT2003, though they were in UT. (Basically, they're not heavyweight on more modern machines) The exception of course is large extent traces, but a zero extent trace (a normal trace) should be fine for the size of the ball. I would stick with what you're doing now and just put in wind resistance and such by modifying the velocity of the object when in PHYS_Falling. Karma already has wind resistance and such, but you may need to adjust the amount of it. 

'''Mix:''' So basically we need to add in to PHYS_Karma what the other physics types already have; ie, a trace to see if they passed through anything during each tick.

'''Foxpaw:''' Well, no.. The other physics types don't have that. But they can appear to because when they get moved internally via SetLocation(), (natively) if they are inside something else then they will be placed at the nearest possible location that isn't inside that. Non-Karma actors can fall through stuff too.

The thing with Karma is, Karma simulated actors don't teleport to the nearest non-touching thing. I would do what you described initially, basically use PHYS_Falling whenever the ball is airborne/bouncing (and thus take advantage of the &quot;teleportation&quot;, and only use Karma when the ball has more or less stopped bouncing and is just rolling. You could implement something like the tracing done on projectiles with the Karma as well, like you suggested. That would probrably work. However, it will likely be somewhat more involved coding-wise.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MixMover</title>
    <id>28548</id>
    <revision>
      <id>40249</id>
      <timestamp>2009-11-17T11:06:22Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MoCheckBox</title>
    <id>2150</id>
    <revision>
      <id>5235</id>
      <timestamp>2006-01-01T20:21:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIMenuOption|GUIMenuOption]] &gt;&gt; MoCheckBox (Package: XInterface)}}

Combines a label and check box button.

This GUI control behaves a little oddly: the checkbox fills up ALL space to the right of the caption. Therefore, you need to make that space SMALL for the button to be a 'normal' size, ie the same sort of size and shape as the other checkboxes in the UT2003 GUI.

Sample properties (to get the same proportions as built-in UT2004 controls):

&lt;uscript&gt;
CaptionWidth  = 0.9; // prevent button from being too big
bHeightFromComponent = False; // prevents TINY button
bSquare=True; // makes the button round
WinHeight = 0.07; // not too big for button to be right size, 
   //obviously this depends on the panel that holds this component
// WinWidth then sets how far the button is from the left edge of the widget
&lt;/uscript&gt;

==Properties==

===Option===

These properties are available to edit.
; string CheckStyleName :
; GUICheckBoxButton MyCheckBox (noexport, editconst) :
; bool bChecked (noexport, editconst, deprecated) :

==Functions==
; InitComponent( [[Legacy:GUIController|GUIController]] MyController, [[Legacy:GUIComponent|GUIComponent]] MyOwner ) : Initializes checkbox.  
; SetComponentValue( coerce string NewValue, optional bool bNoChange ) : If &lt;tt&gt;bNoChange&lt;/tt&gt; is false, sets &lt;tt&gt;bIgnoreChange&lt;/tt&gt; to false and calls &lt;tt&gt;Checked(NewValue)&lt;/tt&gt;.  Otherwise sets &lt;tt&gt;bIgnoreChange&lt;/tt&gt; to true.
; string GetComponentValue() : Returns &lt;tt&gt;string(IsChecked())&lt;/tt&gt;.
; ResetComponent() : Calls &lt;tt&gt;MyCheckBox.SetChecked(False)&lt;/tt&gt;.
; bool IsChecked() : Returns &lt;tt&gt;MyCheckBox.bChecked&lt;/tt&gt;.
; bool Checked( coerce bool C ) : Calls &lt;tt&gt;MyCheckBox.SetChecked(C)&lt;/tt&gt;.  Returns true.
; ButtonChecked( [[Legacy:GUIComponent|GUIComponent]] Sender ) : If &lt;tt&gt;Sender == MyCheckBox&lt;/tt&gt;, calls &lt;tt&gt;InternalOnChange(self)&lt;/tt&gt;.
; bool InternalClick( [[Legacy:GUIComponent|GUIComponent]] Sender ) (private) : If &lt;tt&gt;bValueReadOnly&lt;/tt&gt;, returns true.  Otherwise returns &lt;tt&gt;MyCheckBox.InternalOnClick(Sender)&lt;/tt&gt;.

==Discussion==

'''EntropicLqd:''' From what I remember you can specify widget sizes in two ways.  One is as a ratio of the holding panels height and width.  The other is in absoloute pixels.  Maybe absoloute pixels would be the way to go here.  Just be careful about people playing on lower resolution screens.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5236</id>
      <timestamp>2006-01-01T18:51:55Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIMenuOption|GUIMenuOption]] &gt;&gt; MoCheckBox (Package: XInterface)}}

Combines a label and check box button.

===Tip===

This GUI control behaves a little oddly: the checkbox fills up ALL space to the right of the caption. Therefore, you need to make that space SMALL for the button to be a 'normal' size, ie the same sort of size and shape as the other checkboxes in the UT2003 GUI.

====Example Settings====
; CaptionWidth : 0.9  (Prevent button from being too big)
; bHeightFromComponent : False  (Prevents TINY button)
; bSquare : True  (Makes the button round)
; WinHeight : 0.07  (Not too big for button to be right size, obviously this depends on the panel that holds this component)
; WinWidth : Sets how far the button is from the left edge of the widget

==Properties==

===Option===

These properties are available to edit.
; string CheckStyleName :
; GUICheckBoxButton MyCheckBox (noexport, editconst) :
; bool bChecked (noexport, editconst, deprecated) :

==Functions==
; InitComponent( [[Legacy:GUIController|GUIController]] MyController, [[Legacy:GUIComponent|GUIComponent]] MyOwner ) : Initializes checkbox.  
; SetComponentValue( coerce string NewValue, optional bool bNoChange ) : If &lt;tt&gt;bNoChange&lt;/tt&gt; is false, sets &lt;tt&gt;bIgnoreChange&lt;/tt&gt; to false and calls &lt;tt&gt;Checked(NewValue)&lt;/tt&gt;.  Otherwise sets &lt;tt&gt;bIgnoreChange&lt;/tt&gt; to true.
; string GetComponentValue() : Returns &lt;tt&gt;string(IsChecked())&lt;/tt&gt;.
; ResetComponent() : Calls &lt;tt&gt;MyCheckBox.SetChecked(False)&lt;/tt&gt;.
; bool IsChecked() : Returns &lt;tt&gt;MyCheckBox.bChecked&lt;/tt&gt;.
; bool Checked( coerce bool C ) : Calls &lt;tt&gt;MyCheckBox.SetChecked(C)&lt;/tt&gt;.  Returns true.
; ButtonChecked( [[Legacy:GUIComponent|GUIComponent]] Sender ) : If &lt;tt&gt;Sender == MyCheckBox&lt;/tt&gt;, calls &lt;tt&gt;InternalOnChange(self)&lt;/tt&gt;.
; bool InternalClick( [[Legacy:GUIComponent|GUIComponent]] Sender ) (private) : If &lt;tt&gt;bValueReadOnly&lt;/tt&gt;, returns true.  Otherwise returns &lt;tt&gt;MyCheckBox.InternalOnClick(Sender)&lt;/tt&gt;.

==Discussion==

'''EntropicLqd:''' From what I remember you can specify widget sizes in two ways.  One is as a ratio of the holding panels height and width.  The other is in absoloute pixels.  Maybe absoloute pixels would be the way to go here.  Just be careful about people playing on lower resolution screens.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5237</id>
      <timestamp>2006-01-01T20:21:27Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIMenuOption|GUIMenuOption]] &gt;&gt; MoCheckBox (Package: XInterface)}}

Combines a label and check box button.

This GUI control behaves a little oddly: the checkbox fills up ALL space to the right of the caption. Therefore, you need to make that space SMALL for the button to be a 'normal' size, ie the same sort of size and shape as the other checkboxes in the UT2003 GUI.

Sample properties (to get the same proportions as built-in UT2004 controls):

&lt;uscript&gt;
CaptionWidth  = 0.9; // prevent button from being too big
bHeightFromComponent = False; // prevents TINY button
bSquare=True; // makes the button round
WinHeight = 0.07; // not too big for button to be right size, obviously this depends on the panel that holds this component
WinWidth then sets how far the button is from the left edge of the widget
&lt;/uscript&gt;

==Properties==

===Option===

These properties are available to edit.
; string CheckStyleName :
; GUICheckBoxButton MyCheckBox (noexport, editconst) :
; bool bChecked (noexport, editconst, deprecated) :

==Functions==
; InitComponent( [[Legacy:GUIController|GUIController]] MyController, [[Legacy:GUIComponent|GUIComponent]] MyOwner ) : Initializes checkbox.  
; SetComponentValue( coerce string NewValue, optional bool bNoChange ) : If &lt;tt&gt;bNoChange&lt;/tt&gt; is false, sets &lt;tt&gt;bIgnoreChange&lt;/tt&gt; to false and calls &lt;tt&gt;Checked(NewValue)&lt;/tt&gt;.  Otherwise sets &lt;tt&gt;bIgnoreChange&lt;/tt&gt; to true.
; string GetComponentValue() : Returns &lt;tt&gt;string(IsChecked())&lt;/tt&gt;.
; ResetComponent() : Calls &lt;tt&gt;MyCheckBox.SetChecked(False)&lt;/tt&gt;.
; bool IsChecked() : Returns &lt;tt&gt;MyCheckBox.bChecked&lt;/tt&gt;.
; bool Checked( coerce bool C ) : Calls &lt;tt&gt;MyCheckBox.SetChecked(C)&lt;/tt&gt;.  Returns true.
; ButtonChecked( [[Legacy:GUIComponent|GUIComponent]] Sender ) : If &lt;tt&gt;Sender == MyCheckBox&lt;/tt&gt;, calls &lt;tt&gt;InternalOnChange(self)&lt;/tt&gt;.
; bool InternalClick( [[Legacy:GUIComponent|GUIComponent]] Sender ) (private) : If &lt;tt&gt;bValueReadOnly&lt;/tt&gt;, returns true.  Otherwise returns &lt;tt&gt;MyCheckBox.InternalOnClick(Sender)&lt;/tt&gt;.

==Discussion==

'''EntropicLqd:''' From what I remember you can specify widget sizes in two ways.  One is as a ratio of the holding panels height and width.  The other is in absoloute pixels.  Maybe absoloute pixels would be the way to go here.  Just be careful about people playing on lower resolution screens.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MoComboBox</title>
    <id>28423</id>
    <revision>
      <id>40095</id>
      <timestamp>2009-11-15T08:29:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MoEditBox</title>
    <id>28471</id>
    <revision>
      <id>40170</id>
      <timestamp>2009-11-17T10:50:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MoFloatEdit</title>
    <id>28504</id>
    <revision>
      <id>40205</id>
      <timestamp>2009-11-17T10:59:02Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MoNumericEdit</title>
    <id>2141</id>
    <revision>
      <id>5213</id>
      <timestamp>2003-12-05T09:47:41Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIMenuOption|GUIMenuOption]] &gt;&gt; MoNumericEdit}}

Numerical edit box with + and - buttons and a built-in caption. Most significant properties are inherited from [[Legacy:GUIMenuOption|GUIMenuOption]].

==Example Definition==

&lt;uscript&gt;
defaultproperties {
  Begin Object Class=moNumericEdit Name=MaximumLlamaDuration
    WinTop=0.0
    WinLeft=0.1
    WinHeight=0.1
    WinWidth=0.7
    Caption=&quot;Llama Hunt Duration&quot;
    Hint=&quot;Maximum duration of a llama hunt.&quot;
    CaptionWidth=0.714286
    MinValue=10
    MaxValue=120
    bHeightFromComponent=False
    OnChange=SaveINISettings
  End Object
  Controls(5)=moNumericEdit'MaximumLlamaDuration'
}
&lt;/uscript&gt;

----

[[Category Class (UT2003)</text>
    </revision>
    <revision>
      <id>5214</id>
      <timestamp>2003-12-04T22:09:08Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:GUI|GUI]] &gt;&gt; [[Legacy:GUIComponent|GUIComponent]] &gt;&gt; [[Legacy:GUIMultiComponent|GUIMultiComponent]] &gt;&gt; [[Legacy:GUIMenuOption|GUIMenuOption]] &gt;&gt; MoNumericEdit}}

Numerical edit box with + and - buttons and a built-in caption.

==Example Definition==

&lt;uscript&gt;
defaultproperties {
  Begin Object Class=moNumericEdit Name=MaximumLlamaDuration
    WinTop=0.0
    WinLeft=0.1
    WinHeight=0.1
    WinWidth=0.7
    Caption=&quot;Llama Hunt Duration&quot;
    Hint=&quot;Maximum duration of a llama hunt.&quot;
    CaptionWidth=0.714286
    MinValue=10
    MaxValue=120
    bHeightFromComponent=False
    OnChange=SaveINISettings
  End Object
  Controls(5)=moNumericEdit'MaximumLlamaDuration'
}
&lt;/uscript&gt;

----

[[Category Class (UT2003)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod</title>
    <id>2076</id>
    <revision>
      <id>5054</id>
      <timestamp>2006-06-30T15:03:35Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>#REDIRECT [[Making Mods]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Making Mods|Making Mods]]</text>
    </revision>
    <revision>
      <id>5055</id>
      <timestamp>2006-06-29T21:12:28Z</timestamp>
      <contributor>
        <ip>64-110-208-15.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Mods... making a mod guarantees you a place in gaming hall of fame! It makes you l33t! Everyone should make a mod! 

Many non-Unreal games only know the concept of the Total Conversion, which has to be applied even if a mod only wants to add a new game type or change small aspects of the game. The [[Legacy:Unreal Engine|Unreal engine]] offers all three concepts: 

* Total Conversion for a complete change, 
* new [[Legacy:Gametype|gametype]]s for a different set of game rules 
* and the [[Legacy:Mutator|mutator]]s to change only small parts of the rules or add things to existing game types.

(seriously... need to explain what a mod is, as opposed to a [[Legacy:Mutator|mutator]]...)

Types of mod:
* [[Legacy:Gametype|gametype]] mods
* and others...

==Mod pages ==
* [[Legacy:Jailbreak|Jailbreak]]
* [[Legacy:Esc|Esc]], and [[Legacy:Esc/FAQ|Esc/FAQ]]
* [[Legacy:ThieveryUT|ThieveryUT]]

==Mapping for mods ==

===UT2003 Mods ===
* [[Legacy:Mapping For Find The Ball|Mapping for Find The Ball]]
* [[Legacy:Mapping For Flag Domination|Mapping for Flag Domination]]

===UT Mods ===
* [[Legacy:Mapping For FEBA|Mapping for FEBA]]
* [[Legacy:Mapping For Jailbreak|Mapping for Jailbreak]]
* [[Legacy:Mapping For King Of The Hill|Mapping for King of the Hill]]
* [[Legacy:Mapping For MCTF|Mapping for MCTF]]
* [[Legacy:Mapping For RocketArena|Mapping for RocketArena]]
* [[Legacy:Mapping For Monster Hunt|Mapping for Monster Hunt]]
* [[Legacy:Mapping For UnrealFortress|Mapping for UnrealFortress]]
* [[Legacy:Mapping For TTR|Mapping for TTR]]

==Related topics ==
* [[Legacy:Making Mods|Making Mods]] - essential advice
* [[Legacy:Mod Ideas|Mod Ideas]]

'''Uncommon:''' Shouldn't this be merged with [[Legacy:Gametype|Gametype]] or something?

'''Tarquin:''' mod != gametype :) Maybe merge with [[Legacy:Making Mods|making mods]].

'''P:''' gametype is something the gamecompany makes. A mod is user-made. So it's not teh same thing.

'''Tarquin:''' Wrong. A gametype is a gametype. Some come the with game, and users can make their own too.

'''MythOpus:''' A mod is a modification, therefore anything changed in the game by anyone can be considered a 'mod'.  Even the developers of a game 'mod' it with patches of some sort...

'''Wormbo:''' /me votes for &quot;#REDIRECT [[Legacy:Making Mods|Making Mods]]&quot; :) This page is messy and kind of redundant.

'''Sweavo:''' I vote for deleting this page's ass!  It's just noise.  REDIRECT if you like but get rid of this!

'''MythOpus:''' The intro kills it for me.  I can't tell if the author was being sarcastic, or if he was dead serious.  Redirect it to the How To Make Mods pages.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring</title>
    <id>1800</id>
    <revision>
      <id>4417</id>
      <timestamp>2002-12-30T15:04:14Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>more detailed note about &quot;expands&quot;</comment>
      <text xml:space="preserve">==Mod Authoring for Unreal Tournament ==

''This page and its subpages make up a document by Brandon Reinhart. The Unreal Wiki has been granted permission to host it. Please don't make any edits to these pages other than basic formatting of the text: write on [[Legacy:Making Mods|Making Mods]] instead. Note that this document dates from the early days of [[Legacy:UT|UT]], so some elements of it may be dated. Especially the [[Legacy:Class Syntax|class definitions]] with '''expands''' and the [[Legacy:Mutator|Mutator]] class described in this document will not work correctly in UT2003.''

{{innerbox| Brandon Reinhart &lt;br /&gt;Epic Games, Inc. &lt;br /&gt;brandon@epicgames.com &lt;br /&gt;http://unreal.epicgames.com

}}

{{innerbox| ''Last Updated: 12/08/1999''

}}

==Introduction ==

{{innerbox| Winds and storms, embrace us now, &lt;br /&gt;Lay waste the light of day, &lt;br /&gt;Open gates to darker lands &lt;br /&gt;We spread our wings and fly away.

}}

{{innerbox| ''Emperor, Alsvartr (The Oath)''

}}

Writing mods for the Unreal engine can be an extremely rewarding task. In the current state of the games industry, there is little better a way for a skilled programmer to show the world what he is capable of. This document is intended to give interested mod authors the information they need to write a successful mod for the Unreal engine. I will include technical information as well as pointers on mod development. If you work hard, you can get some fun stuff done through mod authoring.

==Contents ==
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Lazy Man'S Guide]] 
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Some Advice To Start With]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Three Mod Types]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A Few Things To Watch Out For]]
*Getting dirty: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A Scoreboard]]</text>
    </revision>
    <revision>
      <id>4418</id>
      <timestamp>2002-11-05T11:39:39Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Mod Authoring for Unreal Tournament ==

''This page and its subpages make up a document by Brandon Reinhart. The Unreal Wiki has been granted permission to host it. Please don't make any edits to these pages other than basic formatting of the text: write on [[Legacy:Making Mods|Making Mods]] instead. Note that this document dates from the early days of [[Legacy:UT|UT]], so some elements of it may be dated.''

{{innerbox| Brandon Reinhart &lt;br /&gt;Epic Games, Inc. &lt;br /&gt;brandon@epicgames.com &lt;br /&gt;http://unreal.epicgames.com

}}

{{innerbox| ''Last Updated: 12/08/1999''

}}

==Introduction ==

{{innerbox| Winds and storms, embrace us now, &lt;br /&gt;Lay waste the light of day, &lt;br /&gt;Open gates to darker lands &lt;br /&gt;We spread our wings and fly away.

}}

{{innerbox| ''Emperor, Alsvartr (The Oath)''

}}

Writing mods for the Unreal engine can be an extremely rewarding task. In the current state of the games industry, there is little better a way for a skilled programmer to show the world what he is capable of. This document is intended to give interested mod authors the information they need to write a successful mod for the Unreal engine. I will include technical information as well as pointers on mod development. If you work hard, you can get some fun stuff done through mod authoring.

==Contents ==
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Lazy Man'S Guide]] 
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Some Advice To Start With]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Three Mod Types]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A Few Things To Watch Out For]]
*Getting dirty: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A Scoreboard]]</text>
    </revision>
    <revision>
      <id>43549</id>
      <timestamp>2010-06-26T17:44:43Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>/* Contents */ fixed first link</comment>
      <text xml:space="preserve">==Mod Authoring for Unreal Tournament ==

''This page and its subpages make up a document by Brandon Reinhart. The Unreal Wiki has been granted permission to host it. Please don't make any edits to these pages other than basic formatting of the text: write on [[Legacy:Making Mods|Making Mods]] instead. Note that this document dates from the early days of [[Legacy:UT|UT]], so some elements of it may be dated. Especially the [[Legacy:Class Syntax|class definitions]] with '''expands''' and the [[Legacy:Mutator|Mutator]] class described in this document will not work correctly in UT2003.''

{{innerbox| Brandon Reinhart &lt;br /&gt;Epic Games, Inc. &lt;br /&gt;brandon@epicgames.com &lt;br /&gt;http://unreal.epicgames.com

}}

{{innerbox| ''Last Updated: 12/08/1999''

}}

==Introduction ==

{{innerbox| Winds and storms, embrace us now, &lt;br /&gt;Lay waste the light of day, &lt;br /&gt;Open gates to darker lands &lt;br /&gt;We spread our wings and fly away.

}}

{{innerbox| ''Emperor, Alsvartr (The Oath)''

}}

Writing mods for the Unreal engine can be an extremely rewarding task. In the current state of the games industry, there is little better a way for a skilled programmer to show the world what he is capable of. This document is intended to give interested mod authors the information they need to write a successful mod for the Unreal engine. I will include technical information as well as pointers on mod development. If you work hard, you can get some fun stuff done through mod authoring.

==Contents ==
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Lazy Man's Guide]] 
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Some Advice To Start With]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Three Mod Types]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A Few Things To Watch Out For]]
*Getting dirty: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]]
*[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A Scoreboard]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring For UT2K3</title>
    <id>2058</id>
    <revision>
      <id>5015</id>
      <timestamp>2005-12-29T02:02:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This document is being inspired by Brandon of Epic Game's original document, found at [[Legacy:Mod Authoring|Mod Authoring]].  It's being &quot;updated&quot; by me to help me understand the changes from [[Legacy:UT|UT]] to [[Legacy:UT2003|UT2003]], and to update Wiki with something a bit more current in regards to '''plain and simple mod making.'''

==Introduction==

Making a mod for UT2K3 &amp;ndash; whether it is a simple mutator or total conversion (TC) &amp;ndash; is an awesome and completely fun task.  Most games now have a great deal of time spent reinventing the wheel:  the sound and graphics engine used to drive the game itself.  Making a mod removes the tedium of creating the engine and gets straight to the best part:  creating content.  Making a mod is also a fairly risk free method of seeing whether or not you truly enjoy game programming, and whether or not you have the technical skills to do so.

==Contents==

''This is a work in progress and as such will not be complete for several days, if not weeks.  Please forgive any slow progress on this document and bear with me.  This document is heavily based on Brandon's original document structurally.''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Quick Start Guide]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Listen To Your Mother]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod Types]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Project Setup]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Compiling]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mutators]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mutators Indepth]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Game Types]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/GameInfo]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HUD]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scoreboards]]

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Mutator Topics|Mutator Topics]]

==Discussion==

'''Tarquin:''' We only have two pages written here. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Quick Start Guide]] duplicates existing stuff like [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] and other pages in that series. We should merge if they are similar. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Listen To Your Mother]] should be renamed. We have a LOT of GOOD advice pages lying around. But while they all interlink, there's no real coherence.

'''Burtlo:''' I would propose the addition of '''GUI Tabpanel''' and '''GameRules''' to mod authoring for UT2K3, of course I don't know the intended vision of the these tutorials/documents.  I'm willing to write some code in for both '''GUI Tabpanel''' and '''GameRules''' as well as more stuff when I learn it.

'''Tarquin:''' [[Legacy:GameRules|GameRules]], [[Legacy:GUI Tabpanel|GUI Tabpanel]] &amp;ndash; if those don't already exist, make them :)

'''SuperApe:''' I wonder how ''stale'' this page is?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5016</id>
      <timestamp>2003-08-11T15:34:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This document is being inspired by Brandon of Epic Game's original document, found at [[Legacy:Mod Authoring|Mod Authoring]].  It's being &quot;updated&quot; by me to help me understand the changes from [[Legacy:UT|UT]] to [[Legacy:UT2003|UT2003]], and to update Wiki with something a bit more current in regards to '''plain and simple mod making.'''

==Introduction ==

Making a mod for UT2K3 &amp;ndash; whether it is a simple mutator or total conversion (TC) &amp;ndash; is an awesome and completely fun task.  Most games now have a great deal of time spent reinventing the wheel:  the sound and graphics engine used to drive the game itself.  Making a mod removes the tedium of creating the engine and gets straight to the best part:  creating content.  Making a mod is also a fairly risk free method of seeing whether or not you truly enjoy game programming, and whether or not you have the technical skills to do so.

==Contents ==

''This is a work in progress and as such will not be complete for several days, if not weeks.  Please forgive any slow progress on this document and bear with me.  This document is heavily based on Brandon's original document structurally.''
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Quick Start Guide]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Listen To Your Mother]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod Types]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Project Setup]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Compiling]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mutators]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mutators Indepth]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Game Types]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/GameInfo]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HUD]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Scoreboards]]

----

'''Tarquin:''' We only have two pages written here. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Quick Start Guide]] duplicates existing stuff like [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] and other pages in that series. We should merge if they are similar. [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Listen To Your Mother]] should be renamed. We have a LOT of GOOD advice pages lying around. But while they all interlink, there's no real coherence.

'''Burtlo:''' I would propose the addition of '''GUI Tabpanel''' and '''GameRules''' to mod authoring for UT2K3, of course I don't know the intended vision of the these tutorials/documents.  I'm willing to write some code in for both '''GUI Tabpanel''' and '''GameRules''' as well as more stuff when I learn it.

'''Tarquin:''' [[Legacy:GameRules|GameRules]], [[Legacy:GUI Tabpanel|GUI Tabpanel]] &amp;ndash; if those don't already exist, make them :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring For UT2K3/HUD</title>
    <id>2060</id>
    <revision>
      <id>5018</id>
      <timestamp>2006-03-14T15:24:56Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <comment>Calculating the final size of the widget</comment>
      <text xml:space="preserve">==What is a HUD?==

The HUD is the graphical representation of information that the user sees superimposed over the action during play.  It shows their health, weapons, armor, etc; anything relevant to the game at that time.  If you are implementing a whole new game type you may wish to build your own HUD.  However, if you wanted to add an element to the existing HUD, e.g. ''time remaining'' in the match or perhaps a ''radar'' like in the ''Invasion'' Gametype, you probably just want to create an [[Legacy:Interaction|Interaction]].

==Implementing your own HUD==

Implementing your own HUD is not that hard.  Let's start by simply copying an existing HUD and then making small changes to the code.  You can find the '''HUD''' class in the following class structure.

 [[Legacy:Object|Object]]
  +-[[Legacy:Actor|Actor]]
      +-[[Legacy:HUD|HUD]]  
          +-[[Legacy:CinematicHud|CinematicHud]]
          +-[[Legacy:HudBase|HudBase]]
              +-[[Legacy:HudBDeathMatch|HudBDeathMatch]]
                  +-[[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
                  +-[[Legacy:HudBBombingRun|HudBBombingRun]]
                  +-[[Legacy:HudBCaptureTheFlag|HudBCaptureTheFlag]]
                  +-[[Legacy:HudBDoubleDomination|HudBDoubleDomination]]

There are several HUD subclasses to choose from.  I looked at the one that matched my game type the most.  ''HudBDeathMatch'' is the class that I wanted to copy so I subclassed ''HudBase'', saved the file as ''HudBMyNewHUDName'' in my package and then copied the entire code from ''HudBDeathMatch''.

Then I went into the '''GameType''' that I created and added this line in my [[Legacy:Default Properties|default properties]]:

&lt;uscript&gt;HUDType=&quot;MyPackage.HUDMyNewHUDName&quot;&lt;/uscript&gt;

* ''MyPackage'' is simply the [[Legacy:Package|package]] that you create and are saving your work.
* ''HUDMyNewHUDName'' is the actual name of your HUD class, I chose one that was very similar to the existing HUD types.

Compile the code and start your game and if you handled the copy and paste work correctly then everything should run and appear as normal correctly.  The the hard part is trying to figure out everything inside the HUD and how to edit it.  So lets actually look at the code.

==Inside the belly of the beast==

This code below is taken from the '''HUDBase''' class and talks about the multiple passes the class goes through when drawing the HUD.

&lt;uscript&gt;
// Derived HUDs override UpdateHud to update variables before rendering;
// NO draw code should be in derived DrawHud's; they should instead override
// DrawHudPass[A-D] and call their base class' DrawHudPass[A-D] (This cuts
// down on render state changes).

simulated function UpdateHud();

simulated function DrawHudPassA (Canvas C); // Alpha Pass
simulated function DrawHudPassB (Canvas C); // Additive Pass
simulated function DrawHudPassC (Canvas C); // Alpha Pass
simulated function DrawHudPassD (Canvas C); // Alternate Texture Pass
&lt;/uscript&gt;

Each pass takes care of drawing a different aspect of the HUD.  Now looking specifically at the functions in our HUD we should note what happens in each function as well as some other functions that are being used.

; DrawHudPassA :  seems to take care of most of the graphical features of the HUD.
; ShowPointBarTop :  and  : ShowPointBarBottom :  draw parts of the graphical HUD in DrawHudPassA.
; DrawHudPassC :  seems to take care of most of the numbers and strings that the user sees, like his health, adrenaline, crosshairs and other personal information.  
; DrawWeaponBar : draws the weapon bar

So this HUD class uses two of the four passes and then uses three extra function to draw some of the HUD as well.  But what is being drawn when it draws the HUD, what are the elements of the HUD.  Looking at the element classes at the top of the class I find that there are types of objects being drawn ''NumericWidget'', which controlls all number values (life,shield,ammo), and ''SpriteWidget'', which is every other piece (borders,icons,pictures).

===Tackling the NumericWidget and SpriteWidget ===

In '''defaultproperties''' the graphical look of both elements are set. I'm going to specifically look at '''ShieldCount''' which is the total amount of shield points that a player has in the game.  

&lt;uscript&gt;ShieldCount=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerLeft,PosX=0.500000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))&lt;/uscript&gt;

Now, lets look specifically at what is being set here in detail and go blow-by-blow at each of these attributes.

; RenderStyle :RenderStyle is an ERenderStyle enumeration.  It controls the type of [[Legacy:Color Blending|color blending]] or its effect on the other units that it lays over in the HUD.

; TextureScale : Texture Scale is the scale that is applied to the texture, relative to a screen resolution of 640 x 480 pixels (that means: at that screen resolution a sprite with TextureScale=1.0 will be drawn one-to-one; at other screen resolutions it will be proportionally scaled up or down).

; PosX, PosY, OffsetX, OffsetY :
[[Image:Legacy_ScreenPosition.gif|center|]]

The values of PosX and PosY are decimal values representing the position on the screen.  This frees the user from having to worry about the position of their HUD items in relation to the screen resolution.  So if you set the PosX=0.5000000 and PosY=0.5000000 then you always get a position in the center of the screen.  

OffsetX and OffsetY are in actual pixels.  You might be able to get to the point of the map that you want, but then you want to shift it a specific number of pixels and this is where OffsetX and OffsetY would come into play.


; Drawpivot :
Drawpivot is a point on the texture or numeric image.

  DP_UpperLeft
  DP_UpperMiddle
  DP_UpperRight
  DP_LowerLeft
  DP_LowerMiddle
  DP_LowerRight
  DP_MiddleLeft
  DP_MiddleMiddle
  DP_MiddleRight

The position and offset properties specify a single point on the screen.  Drawpivot specifies what part of the bitmap is to appear at that point.  So if you specified DP_UpperLeft, the bitmap would &quot;hang&quot; down and to the right of the position specified.




; Tints : This is the color of the mesh/text and can be dependant on the team (in three color intensity format).  Tint[0] is the first team and Tint[1] is the second team.  For armor it isn’t important to have the difference in color.  I would recommend using a graphical color chooser to find the Red-Green-Blue (three-color intensity) you are looking for.

===SpriteWidget ===

So here are the properties specific to the sprite widget call.  Up to this point a lot of them are already covered in the '''NumericWidget'''.  

;  WidgetTexture : 
WidgetTexture loads the texture from a texture pack for the SpriteWidget.  You are able to view all the textures that UT2K3 uses through UnrealEd 3.0.  Here is an example of the HUD Textures that are used.

&lt;uscript&gt;...WidgetTexture=Texture'InterfaceContent.HUD.SkinA'...&lt;/uscript&gt;

&lt;center&gt;[[Image:Legacy_HUD_textures.gif|]]&lt;/center&gt;

This texture is not actual size.


; TextureCoords : Textures usually come with several on the same sheet.  So you often need to specify the rectangle that surrounds the texture that you want.  In this case we just want to grab the shield from that texture pack, and so there is a start point (x,y) and then a length in both directions.

====TextureScale====

&lt;center&gt;[[Image:Legacy_textureScale.gif|]]&lt;/center&gt;

The texture scale is a percentage at which you want the texture to be displayed.  This is useful as the texture picture is usually larger than you want it to appear in your HUD.

====ScaleMode====

  SM_None
  SM_Up
  SM_Down
  SM_Left
  SM_Right

This is the side that it is scale from.  This is used for the bars that adjust with your health and ammo.  Most of those start from the left side.  But this is if you plan to have your texture start to get chopped off through use. 

====Scale====

This is a float value that represents how much is cut off from the direction specified above.  So for ammo depletion they probably calculate an amount appropriate based on the maximum and how much you are firing off.

===Drawing with Numeric and Sprite Widget.===

I noticed there were a two function calls: DrawSpriteWidge and DrawNumericWidget.

These are native functions that take care of drawing the two widgets we defined above.

&lt;uscript&gt;
DrawSpriteWidget (Canvas C, out SpriteWidget W) [simulated, final]
// Draws the HUD element described by the SpriteWidget W.

DrawNumericWidget (Canvas C, out NumericWidget W, out DigitSet D) [simulated, final]
// Draws a number.
&lt;/uscript&gt;

===Calculating the final size of the widget===

If your wanting to calculate the final size of the widget, from my observations the formula for doing so seems to be:

&lt;uscript&gt;
SpriteWidgetWidth = (SpriteWidget.TextureCoords.X2 - SpriteWidget.TextureCoords.X1) * SpriteWidget.TextureScale * C.ClipX/640 * MyHUD.HUDScale;
SpriteWidgetHeight = (SpriteWidget.TextureCoords.Y2 - SpriteWidget.TextureCoords.Y1) * SpriteWidget.TextureScale * C.ClipY/480 * MyHUD.HUDScale;
&lt;/uscript&gt;

==Adding a Time Display==

So I wanted the user to be aware of the time in the game. NOTE: I'm not sure if this is the players time in game or the lifetime of the game.  And so, by example I thought I would go through adding a time display.

===Writing a Function===

&lt;uscript&gt;
var() NumericWidget myTime_seconds;
var() NumericWidget myTime_minutes;
var() NumericWidget myTime_hours;
&lt;/uscript&gt;

I added these variables near the beginning of the class where the other Widgets were being declared.

===Calculating Game Time===

I wanted to calculate game time and as I previously discussed I know that some of the information about the game and the players were in it are carried in the [[Legacy:GameReplicationInfo|GameReplicationInfo]] and [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] classes.
 

So I created a function that would calculate game time.

&lt;uscript&gt;
simulated function CalculateGameTime()  {

    local int iElapsedTime;

    iElapsedTime = PlayerOwner.GameReplicationInfo.ElapsedTime;

    myTime_hours.Value = iElapsedTime / 3600;

    iElapsedTime = iElapsedTime % 3600;
    myTime_minutes.Value = iElapsedTime / 60;

    iElapsedTime = iElapsedTime % 60;
    myTime_seconds.Value = iElapsedTime;

}
&lt;/uscript&gt;

This converts the game time in seconds into hours, minutes, and seconds.  I didn't want the player to have to do the conversion in their head from the seconds.  I imagine I could have done this another way, but these seemed like a good idea at the time.

===Getting my time to update===

So I created a way to update the game time but I needed to figure out how to get it displayed.  I again copied form that the other widgets used.  Inside a '''DrawHudPassC''' I added this code (replaced some code with a ... for space reasons). 

&lt;uscript&gt;
simulated function DrawHudPassC (Canvas C)
{
    local float PortraitWidth,PortraitHeight, XL, YL, Abbrev;
    local string PortraitString;
    
    ...

    // Screen
    if( bShowPersonalInfo )
    {
        …
    
       //time
       DrawNumericWidget( C, myTime_hours, DigitsBig );
       DrawNumericWidget( C, myTime_minutes, DigitsBig );
       DrawNumericWidget( C, myTime_seconds, DigitsBig );
    }
&lt;/uscript&gt;

''C'' is the Canvas that these Widgets are drawn on, the widgets that I'm drawing are what follow, and the digits that I'm going to use are a set called DigitsBig previously loaded in the defaultproperties.

===Giving my Widgets a look in the defaultproperties===

&lt;uscript&gt;
myTime_hours=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.450000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
myTime_minutes=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.470000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
myTime_seconds=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.490000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
&lt;/uscript&gt;

This places them on the screen somewhere near the center next to the cursor.  The important thing is that they were displayed.  I also need to go back and give them more space and fill empty zeros.

==Comments==

'''Burtlo''': I haven't tried creating/adding/editing anything in the texture packs and need to read up on that so I can write more for this tutorial.  Also some help on formatting would be great.  First time really writing in a Wiki.

'''Tarquin:''' Can I move this to [[Legacy:Working With The HUD|Working with the HUD]] maybe?

'''Burtlo:'''  I got to this page from the bottom of Making Mods.  If you think it would be more useful in a different category [[Legacy:Working With The HUD|Working with the HUD]] then by all means go for it.

'''Tarquin:''' It's not really about &quot;categories&quot;, it's just about making page names easier &amp;ndash; subpages are not very easy to deal with or link to. And I would rather things were a part of the whole wiki than being seen as part of a smaller work-in-progress document.

'''Nuleo:''' Ok so I made a hud and it draws numeric widgets fine but for some reason the sprtie widgets aren't showing up, anyone want to do a tutorial on that?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5019</id>
      <timestamp>2006-01-07T10:26:04Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==What is a HUD?==

The HUD is the graphical representation of information that the user sees superimposed over the action during play.  It shows their health, weapons, armor, etc; anything relevant to the game at that time.  If you are implementing a whole new game type you may wish to build your own HUD.  However, if you wanted to add an element to the existing HUD, e.g. ''time remaining'' in the match or perhaps a ''radar'' like in the ''Invasion'' Gametype, you probably just want to create an [[Legacy:Interaction|Interaction]].

==Implementing your own HUD==

Implementing your own HUD is not that hard.  Let's start by simply copying an existing HUD and then making small changes to the code.  You can find the '''HUD''' class in the following class structure.

 [[Legacy:Object|Object]]
  +-[[Legacy:Actor|Actor]]
      +-[[Legacy:HUD|HUD]]  
          +-[[Legacy:CinematicHud|CinematicHud]]
          +-[[Legacy:HudBase|HudBase]]
              +-[[Legacy:HudBDeathMatch|HudBDeathMatch]]
                  +-[[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
                  +-[[Legacy:HudBBombingRun|HudBBombingRun]]
                  +-[[Legacy:HudBCaptureTheFlag|HudBCaptureTheFlag]]
                  +-[[Legacy:HudBDoubleDomination|HudBDoubleDomination]]

There are several HUD subclasses to choose from.  I looked at the one that matched my game type the most.  ''HudBDeathMatch'' is the class that I wanted to copy so I subclassed ''HudBase'', saved the file as ''HudBMyNewHUDName'' in my package and then copied the entire code from ''HudBDeathMatch''.

Then I went into the '''GameType''' that I created and added this line in my [[Legacy:Default Properties|default properties]]:

&lt;uscript&gt;HUDType=&quot;MyPackage.HUDMyNewHUDName&quot;&lt;/uscript&gt;

* ''MyPackage'' is simply the [[Legacy:Package|package]] that you create and are saving your work.
* ''HUDMyNewHUDName'' is the actual name of your HUD class, I chose one that was very similar to the existing HUD types.

Compile the code and start your game and if you handled the copy and paste work correctly then everything should run and appear as normal correctly.  The the hard part is trying to figure out everything inside the HUD and how to edit it.  So lets actually look at the code.

==Inside the belly of the beast==

This code below is taken from the '''HUDBase''' class and talks about the multiple passes the class goes through when drawing the HUD.

&lt;uscript&gt;
// Derived HUDs override UpdateHud to update variables before rendering;
// NO draw code should be in derived DrawHud's; they should instead override
// DrawHudPass[A-D] and call their base class' DrawHudPass[A-D] (This cuts
// down on render state changes).

simulated function UpdateHud();

simulated function DrawHudPassA (Canvas C); // Alpha Pass
simulated function DrawHudPassB (Canvas C); // Additive Pass
simulated function DrawHudPassC (Canvas C); // Alpha Pass
simulated function DrawHudPassD (Canvas C); // Alternate Texture Pass
&lt;/uscript&gt;

Each pass takes care of drawing a different aspect of the HUD.  Now looking specifically at the functions in our HUD we should note what happens in each function as well as some other functions that are being used.

; DrawHudPassA :  seems to take care of most of the graphical features of the HUD.
; ShowPointBarTop :  and  : ShowPointBarBottom :  draw parts of the graphical HUD in DrawHudPassA.
; DrawHudPassC :  seems to take care of most of the numbers and strings that the user sees, like his health, adrenaline, crosshairs and other personal information.  
; DrawWeaponBar : draws the weapon bar

So this HUD class uses two of the four passes and then uses three extra function to draw some of the HUD as well.  But what is being drawn when it draws the HUD, what are the elements of the HUD.  Looking at the element classes at the top of the class I find that there are types of objects being drawn ''NumericWidget'', which controlls all number values (life,shield,ammo), and ''SpriteWidget'', which is every other piece (borders,icons,pictures).

===Tackling the NumericWidget and SpriteWidget ===

In '''defaultproperties''' the graphical look of both elements are set. I'm going to specifically look at '''ShieldCount''' which is the total amount of shield points that a player has in the game.  

&lt;uscript&gt;ShieldCount=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerLeft,PosX=0.500000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))&lt;/uscript&gt;

Now, lets look specifically at what is being set here in detail and go blow-by-blow at each of these attributes.

; RenderStyle :RenderStyle is an ERenderStyle enumeration.  It controls the type of [[Legacy:Color Blending|color blending]] or its effect on the other units that it lays over in the HUD.

; TextureScale : Texture Scale is the scale that is applied to the texture, relative to a screen resolution of 640 x 480 pixels (that means: at that screen resolution a sprite with TextureScale=1.0 will be drawn one-to-one; at other screen resolutions it will be proportionally scaled up or down).

; PosX, PosY, OffsetX, OffsetY :
[[Image:Legacy_ScreenPosition.gif|center|]]

The values of PosX and PosY are decimal values representing the position on the screen.  This frees the user from having to worry about the position of their HUD items in relation to the screen resolution.  So if you set the PosX=0.5000000 and PosY=0.5000000 then you always get a position in the center of the screen.  

OffsetX and OffsetY are in actual pixels.  You might be able to get to the point of the map that you want, but then you want to shift it a specific number of pixels and this is where OffsetX and OffsetY would come into play.


; Drawpivot :
Drawpivot is a point on the texture or numeric image.

  DP_UpperLeft
  DP_UpperMiddle
  DP_UpperRight
  DP_LowerLeft
  DP_LowerMiddle
  DP_LowerRight
  DP_MiddleLeft
  DP_MiddleMiddle
  DP_MiddleRight

The position and offset properties specify a single point on the screen.  Drawpivot specifies what part of the bitmap is to appear at that point.  So if you specified DP_UpperLeft, the bitmap would &quot;hang&quot; down and to the right of the position specified.




; Tints : This is the color of the mesh/text and can be dependant on the team (in three color intensity format).  Tint[0] is the first team and Tint[1] is the second team.  For armor it isn’t important to have the difference in color.  I would recommend using a graphical color chooser to find the Red-Green-Blue (three-color intensity) you are looking for.

===SpriteWidget ===

So here are the properties specific to the sprite widget call.  Up to this point a lot of them are already covered in the '''NumericWidget'''.  

;  WidgetTexture : 
WidgetTexture loads the texture from a texture pack for the SpriteWidget.  You are able to view all the textures that UT2K3 uses through UnrealEd 3.0.  Here is an example of the HUD Textures that are used.

&lt;uscript&gt;...WidgetTexture=Texture'InterfaceContent.HUD.SkinA'...&lt;/uscript&gt;

&lt;center&gt;[[Image:Legacy_HUD_textures.gif|]]&lt;/center&gt;

This texture is not actual size.


; TextureCoords : Textures usually come with several on the same sheet.  So you often need to specify the rectangle that surrounds the texture that you want.  In this case we just want to grab the shield from that texture pack, and so there is a start point (x,y) and then a length in both directions.

====TextureScale====

&lt;center&gt;[[Image:Legacy_textureScale.gif|]]&lt;/center&gt;

The texture scale is a percentage at which you want the texture to be displayed.  This is useful as the texture picture is usually larger than you want it to appear in your HUD.

====ScaleMode====

  SM_None
  SM_Up
  SM_Down
  SM_Left
  SM_Right

This is the side that it is scale from.  This is used for the bars that adjust with your health and ammo.  Most of those start from the left side.  But this is if you plan to have your texture start to get chopped off through use. 

====Scale====

This is a float value that represents how much is cut off from the direction specified above.  So for ammo depletion they probably calculate an amount appropriate based on the maximum and how much you are firing off.

===Drawing with Numeric and Sprite Widget.===

I noticed there were a two function calls: DrawSpriteWidge and DrawNumericWidget.

These are native functions that take care of drawing the two widgets we defined above.

&lt;uscript&gt;
DrawSpriteWidget (Canvas C, out SpriteWidget W) [simulated, final]
// Draws the HUD element described by the SpriteWidget W.

DrawNumericWidget (Canvas C, out NumericWidget W, out DigitSet D) [simulated, final]
// Draws a number.
&lt;/uscript&gt;

===Calculating the final size of the widget===

If your wanting to calculate the final size of the widget, from my observations the formula for doing so seems to be:

&lt;uscript&gt;
SpriteWidgetWidth = Texture.USize() * SpriteWidget.TextureScale * C.ClipX/640;
SpriteWidgetHeight = Texture.VSize() * SpriteWidget.TextureScale * C.ClipY/480;
&lt;/uscript&gt;

I think thats right. That what I am using anyways... (Solid Snake)

==Adding a Time Display==

So I wanted the user to be aware of the time in the game. NOTE: I'm not sure if this is the players time in game or the lifetime of the game.  And so, by example I thought I would go through adding a time display.

===Writing a Function===

&lt;uscript&gt;
var() NumericWidget myTime_seconds;
var() NumericWidget myTime_minutes;
var() NumericWidget myTime_hours;
&lt;/uscript&gt;

I added these variables near the beginning of the class where the other Widgets were being declared.

===Calculating Game Time===

I wanted to calculate game time and as I previously discussed I know that some of the information about the game and the players were in it are carried in the [[Legacy:GameReplicationInfo|GameReplicationInfo]] and [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] classes.
 

So I created a function that would calculate game time.

&lt;uscript&gt;
simulated function CalculateGameTime()  {

    local int iElapsedTime;

    iElapsedTime = PlayerOwner.GameReplicationInfo.ElapsedTime;

    myTime_hours.Value = iElapsedTime / 3600;

    iElapsedTime = iElapsedTime % 3600;
    myTime_minutes.Value = iElapsedTime / 60;

    iElapsedTime = iElapsedTime % 60;
    myTime_seconds.Value = iElapsedTime;

}
&lt;/uscript&gt;

This converts the game time in seconds into hours, minutes, and seconds.  I didn't want the player to have to do the conversion in their head from the seconds.  I imagine I could have done this another way, but these seemed like a good idea at the time.

===Getting my time to update===

So I created a way to update the game time but I needed to figure out how to get it displayed.  I again copied form that the other widgets used.  Inside a '''DrawHudPassC''' I added this code (replaced some code with a ... for space reasons). 

&lt;uscript&gt;
simulated function DrawHudPassC (Canvas C)
{
    local float PortraitWidth,PortraitHeight, XL, YL, Abbrev;
    local string PortraitString;
    
    ...

    // Screen
    if( bShowPersonalInfo )
    {
        …
    
       //time
       DrawNumericWidget( C, myTime_hours, DigitsBig );
       DrawNumericWidget( C, myTime_minutes, DigitsBig );
       DrawNumericWidget( C, myTime_seconds, DigitsBig );
    }
&lt;/uscript&gt;

''C'' is the Canvas that these Widgets are drawn on, the widgets that I'm drawing are what follow, and the digits that I'm going to use are a set called DigitsBig previously loaded in the defaultproperties.

===Giving my Widgets a look in the defaultproperties===

&lt;uscript&gt;
myTime_hours=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.450000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
myTime_minutes=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.470000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
myTime_seconds=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.490000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
&lt;/uscript&gt;

This places them on the screen somewhere near the center next to the cursor.  The important thing is that they were displayed.  I also need to go back and give them more space and fill empty zeros.

==Comments==

'''Burtlo''': I haven't tried creating/adding/editing anything in the texture packs and need to read up on that so I can write more for this tutorial.  Also some help on formatting would be great.  First time really writing in a Wiki.

'''Tarquin:''' Can I move this to [[Legacy:Working With The HUD|Working with the HUD]] maybe?

'''Burtlo:'''  I got to this page from the bottom of Making Mods.  If you think it would be more useful in a different category [[Legacy:Working With The HUD|Working with the HUD]] then by all means go for it.

'''Tarquin:''' It's not really about &quot;categories&quot;, it's just about making page names easier &amp;ndash; subpages are not very easy to deal with or link to. And I would rather things were a part of the whole wiki than being seen as part of a smaller work-in-progress document.

'''Nuleo:''' Ok so I made a hud and it draws numeric widgets fine but for some reason the sprtie widgets aren't showing up, anyone want to do a tutorial on that?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5020</id>
      <timestamp>2006-03-14T15:08:19Z</timestamp>
      <contributor>
        <ip>Switch</ip>
      </contributor>
      <minor/>
      <comment>MaterialUSize()</comment>
      <text xml:space="preserve">==What is a HUD?==

The HUD is the graphical representation of information that the user sees superimposed over the action during play.  It shows their health, weapons, armor, etc; anything relevant to the game at that time.  If you are implementing a whole new game type you may wish to build your own HUD.  However, if you wanted to add an element to the existing HUD, e.g. ''time remaining'' in the match or perhaps a ''radar'' like in the ''Invasion'' Gametype, you probably just want to create an [[Legacy:Interaction|Interaction]].

==Implementing your own HUD==

Implementing your own HUD is not that hard.  Let's start by simply copying an existing HUD and then making small changes to the code.  You can find the '''HUD''' class in the following class structure.

 [[Legacy:Object|Object]]
  +-[[Legacy:Actor|Actor]]
      +-[[Legacy:HUD|HUD]]  
          +-[[Legacy:CinematicHud|CinematicHud]]
          +-[[Legacy:HudBase|HudBase]]
              +-[[Legacy:HudBDeathMatch|HudBDeathMatch]]
                  +-[[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]]
                  +-[[Legacy:HudBBombingRun|HudBBombingRun]]
                  +-[[Legacy:HudBCaptureTheFlag|HudBCaptureTheFlag]]
                  +-[[Legacy:HudBDoubleDomination|HudBDoubleDomination]]

There are several HUD subclasses to choose from.  I looked at the one that matched my game type the most.  ''HudBDeathMatch'' is the class that I wanted to copy so I subclassed ''HudBase'', saved the file as ''HudBMyNewHUDName'' in my package and then copied the entire code from ''HudBDeathMatch''.

Then I went into the '''GameType''' that I created and added this line in my [[Legacy:Default Properties|default properties]]:

&lt;uscript&gt;HUDType=&quot;MyPackage.HUDMyNewHUDName&quot;&lt;/uscript&gt;

* ''MyPackage'' is simply the [[Legacy:Package|package]] that you create and are saving your work.
* ''HUDMyNewHUDName'' is the actual name of your HUD class, I chose one that was very similar to the existing HUD types.

Compile the code and start your game and if you handled the copy and paste work correctly then everything should run and appear as normal correctly.  The the hard part is trying to figure out everything inside the HUD and how to edit it.  So lets actually look at the code.

==Inside the belly of the beast==

This code below is taken from the '''HUDBase''' class and talks about the multiple passes the class goes through when drawing the HUD.

&lt;uscript&gt;
// Derived HUDs override UpdateHud to update variables before rendering;
// NO draw code should be in derived DrawHud's; they should instead override
// DrawHudPass[A-D] and call their base class' DrawHudPass[A-D] (This cuts
// down on render state changes).

simulated function UpdateHud();

simulated function DrawHudPassA (Canvas C); // Alpha Pass
simulated function DrawHudPassB (Canvas C); // Additive Pass
simulated function DrawHudPassC (Canvas C); // Alpha Pass
simulated function DrawHudPassD (Canvas C); // Alternate Texture Pass
&lt;/uscript&gt;

Each pass takes care of drawing a different aspect of the HUD.  Now looking specifically at the functions in our HUD we should note what happens in each function as well as some other functions that are being used.

; DrawHudPassA :  seems to take care of most of the graphical features of the HUD.
; ShowPointBarTop :  and  : ShowPointBarBottom :  draw parts of the graphical HUD in DrawHudPassA.
; DrawHudPassC :  seems to take care of most of the numbers and strings that the user sees, like his health, adrenaline, crosshairs and other personal information.  
; DrawWeaponBar : draws the weapon bar

So this HUD class uses two of the four passes and then uses three extra function to draw some of the HUD as well.  But what is being drawn when it draws the HUD, what are the elements of the HUD.  Looking at the element classes at the top of the class I find that there are types of objects being drawn ''NumericWidget'', which controlls all number values (life,shield,ammo), and ''SpriteWidget'', which is every other piece (borders,icons,pictures).

===Tackling the NumericWidget and SpriteWidget ===

In '''defaultproperties''' the graphical look of both elements are set. I'm going to specifically look at '''ShieldCount''' which is the total amount of shield points that a player has in the game.  

&lt;uscript&gt;ShieldCount=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerLeft,PosX=0.500000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))&lt;/uscript&gt;

Now, lets look specifically at what is being set here in detail and go blow-by-blow at each of these attributes.

; RenderStyle :RenderStyle is an ERenderStyle enumeration.  It controls the type of [[Legacy:Color Blending|color blending]] or its effect on the other units that it lays over in the HUD.

; TextureScale : Texture Scale is the scale that is applied to the texture, relative to a screen resolution of 640 x 480 pixels (that means: at that screen resolution a sprite with TextureScale=1.0 will be drawn one-to-one; at other screen resolutions it will be proportionally scaled up or down).

; PosX, PosY, OffsetX, OffsetY :
[[Image:Legacy_ScreenPosition.gif|center|]]

The values of PosX and PosY are decimal values representing the position on the screen.  This frees the user from having to worry about the position of their HUD items in relation to the screen resolution.  So if you set the PosX=0.5000000 and PosY=0.5000000 then you always get a position in the center of the screen.  

OffsetX and OffsetY are in actual pixels.  You might be able to get to the point of the map that you want, but then you want to shift it a specific number of pixels and this is where OffsetX and OffsetY would come into play.


; Drawpivot :
Drawpivot is a point on the texture or numeric image.

  DP_UpperLeft
  DP_UpperMiddle
  DP_UpperRight
  DP_LowerLeft
  DP_LowerMiddle
  DP_LowerRight
  DP_MiddleLeft
  DP_MiddleMiddle
  DP_MiddleRight

The position and offset properties specify a single point on the screen.  Drawpivot specifies what part of the bitmap is to appear at that point.  So if you specified DP_UpperLeft, the bitmap would &quot;hang&quot; down and to the right of the position specified.




; Tints : This is the color of the mesh/text and can be dependant on the team (in three color intensity format).  Tint[0] is the first team and Tint[1] is the second team.  For armor it isn’t important to have the difference in color.  I would recommend using a graphical color chooser to find the Red-Green-Blue (three-color intensity) you are looking for.

===SpriteWidget ===

So here are the properties specific to the sprite widget call.  Up to this point a lot of them are already covered in the '''NumericWidget'''.  

;  WidgetTexture : 
WidgetTexture loads the texture from a texture pack for the SpriteWidget.  You are able to view all the textures that UT2K3 uses through UnrealEd 3.0.  Here is an example of the HUD Textures that are used.

&lt;uscript&gt;...WidgetTexture=Texture'InterfaceContent.HUD.SkinA'...&lt;/uscript&gt;

&lt;center&gt;[[Image:Legacy_HUD_textures.gif|]]&lt;/center&gt;

This texture is not actual size.


; TextureCoords : Textures usually come with several on the same sheet.  So you often need to specify the rectangle that surrounds the texture that you want.  In this case we just want to grab the shield from that texture pack, and so there is a start point (x,y) and then a length in both directions.

====TextureScale====

&lt;center&gt;[[Image:Legacy_textureScale.gif|]]&lt;/center&gt;

The texture scale is a percentage at which you want the texture to be displayed.  This is useful as the texture picture is usually larger than you want it to appear in your HUD.

====ScaleMode====

  SM_None
  SM_Up
  SM_Down
  SM_Left
  SM_Right

This is the side that it is scale from.  This is used for the bars that adjust with your health and ammo.  Most of those start from the left side.  But this is if you plan to have your texture start to get chopped off through use. 

====Scale====

This is a float value that represents how much is cut off from the direction specified above.  So for ammo depletion they probably calculate an amount appropriate based on the maximum and how much you are firing off.

===Drawing with Numeric and Sprite Widget.===

I noticed there were a two function calls: DrawSpriteWidge and DrawNumericWidget.

These are native functions that take care of drawing the two widgets we defined above.

&lt;uscript&gt;
DrawSpriteWidget (Canvas C, out SpriteWidget W) [simulated, final]
// Draws the HUD element described by the SpriteWidget W.

DrawNumericWidget (Canvas C, out NumericWidget W, out DigitSet D) [simulated, final]
// Draws a number.
&lt;/uscript&gt;

===Calculating the final size of the widget===

If your wanting to calculate the final size of the widget, from my observations the formula for doing so seems to be:

&lt;uscript&gt;
SpriteWidgetWidth = SpriteWidget.WidgetTexture.MaterialUSize() * SpriteWidget.TextureScale * C.ClipX/640;
SpriteWidgetHeight = SpriteWidget.WidgetTexture.MaterialVSize() * SpriteWidget.TextureScale * C.ClipY/480;
&lt;/uscript&gt;

I think thats right. That what I am using anyways... (Solid Snake)

==Adding a Time Display==

So I wanted the user to be aware of the time in the game. NOTE: I'm not sure if this is the players time in game or the lifetime of the game.  And so, by example I thought I would go through adding a time display.

===Writing a Function===

&lt;uscript&gt;
var() NumericWidget myTime_seconds;
var() NumericWidget myTime_minutes;
var() NumericWidget myTime_hours;
&lt;/uscript&gt;

I added these variables near the beginning of the class where the other Widgets were being declared.

===Calculating Game Time===

I wanted to calculate game time and as I previously discussed I know that some of the information about the game and the players were in it are carried in the [[Legacy:GameReplicationInfo|GameReplicationInfo]] and [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] classes.
 

So I created a function that would calculate game time.

&lt;uscript&gt;
simulated function CalculateGameTime()  {

    local int iElapsedTime;

    iElapsedTime = PlayerOwner.GameReplicationInfo.ElapsedTime;

    myTime_hours.Value = iElapsedTime / 3600;

    iElapsedTime = iElapsedTime % 3600;
    myTime_minutes.Value = iElapsedTime / 60;

    iElapsedTime = iElapsedTime % 60;
    myTime_seconds.Value = iElapsedTime;

}
&lt;/uscript&gt;

This converts the game time in seconds into hours, minutes, and seconds.  I didn't want the player to have to do the conversion in their head from the seconds.  I imagine I could have done this another way, but these seemed like a good idea at the time.

===Getting my time to update===

So I created a way to update the game time but I needed to figure out how to get it displayed.  I again copied form that the other widgets used.  Inside a '''DrawHudPassC''' I added this code (replaced some code with a ... for space reasons). 

&lt;uscript&gt;
simulated function DrawHudPassC (Canvas C)
{
    local float PortraitWidth,PortraitHeight, XL, YL, Abbrev;
    local string PortraitString;
    
    ...

    // Screen
    if( bShowPersonalInfo )
    {
        …
    
       //time
       DrawNumericWidget( C, myTime_hours, DigitsBig );
       DrawNumericWidget( C, myTime_minutes, DigitsBig );
       DrawNumericWidget( C, myTime_seconds, DigitsBig );
    }
&lt;/uscript&gt;

''C'' is the Canvas that these Widgets are drawn on, the widgets that I'm drawing are what follow, and the digits that I'm going to use are a set called DigitsBig previously loaded in the defaultproperties.

===Giving my Widgets a look in the defaultproperties===

&lt;uscript&gt;
myTime_hours=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.450000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
myTime_minutes=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.470000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
myTime_seconds=(RenderStyle=STY_Alpha,TextureScale=0.100000,DrawPivot=DP_LowerMiddle,PosX=0.490000,PosY=0.500000,OffsetX=0,OffsetY=0,Tints[0]=(B=255,G=255,R=255,A=255),Tints[1]=(B=255,G=255,R=255,A=255))
&lt;/uscript&gt;

This places them on the screen somewhere near the center next to the cursor.  The important thing is that they were displayed.  I also need to go back and give them more space and fill empty zeros.

==Comments==

'''Burtlo''': I haven't tried creating/adding/editing anything in the texture packs and need to read up on that so I can write more for this tutorial.  Also some help on formatting would be great.  First time really writing in a Wiki.

'''Tarquin:''' Can I move this to [[Legacy:Working With The HUD|Working with the HUD]] maybe?

'''Burtlo:'''  I got to this page from the bottom of Making Mods.  If you think it would be more useful in a different category [[Legacy:Working With The HUD|Working with the HUD]] then by all means go for it.

'''Tarquin:''' It's not really about &quot;categories&quot;, it's just about making page names easier &amp;ndash; subpages are not very easy to deal with or link to. And I would rather things were a part of the whole wiki than being seen as part of a smaller work-in-progress document.

'''Nuleo:''' Ok so I made a hud and it draws numeric widgets fine but for some reason the sprtie widgets aren't showing up, anyone want to do a tutorial on that?

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring For UT2K3/Listen To Your Mother</title>
    <id>2059</id>
    <revision>
      <id>5017</id>
      <timestamp>2002-11-30T02:06:05Z</timestamp>
      <contributor>
        <ip>Trystan</ip>
      </contributor>
      <comment>Listen to Your Mother, Creation</comment>
      <text xml:space="preserve">==Listen to your Mother ==

Well, not your mother perhaps &amp;ndash; but others who have been there and done that.  When you begin your mod don't begin with a large scale total conversion.  Chances are you're going to get discouraged and find too many roadblocks to continue on that path.  Instead, start small &amp;ndash; create mutators, modify weapons, play with pawns and controllers.  Find your way around UT2K3 by examining others' code and by writing your own.

If you insist on starting with a total conversion (or if you're an experienced modder moving to the UT2K3 engine) it's truly imperative to have a schedule and design document.  These things don't have to be released to the public but on an internal team they are key to keeping things on track and on schedule.  The design document lets everybody know what's going on and why so there's no surprises come the deadline dates.  

Good reading for those who are just starting on a team, looking at recruiting a team, or just beginning to work with UT2K3 in any way are the following articles:  [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]], [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]], [[Legacy:Making Mods/Building A Team|Making Mods/Building A Team]], [[Legacy:Making Mods/Mod Death|Making Mods/Mod Death]], [[Legacy:Making Mods/Why Are You Making A Mod|Making Mods/Why Are You Making A Mod]], and [[Legacy:Making Mods/Working As A Team|Making Mods/Working As A Team]].  If you have multiple coders on your team it is imperative to find some sort of regulated system for code sharing:  repeatedly merging in changes from other coders is not a good use of a programmer's time.  Check out [[Legacy:CVS|CVS]], RCS, Subversion, or BitKeeper, to name a few SCCS systems.  ([[Legacy:CVS|CVS]], RCS, Subversion are free.  BitKeeper requires a type of license known as OpenLogging to be used for free; check their web site for more information.)

Advice straight from the original version of this article follows:

{{innerbox|Everyone is an idea man.  Everybody thinks they have a revolutionary new game concept that no one else has ever thought of.  Having cool ideas will rarely get you anywhere in the games industry.  You have to be able to implement your ideas or provide some useful skill.  This also applies to mod authoring.  If you become a skilled or notable mod author, you will find people propositioning you to implement their ideas.  Never join a project whose idea man or leader has no obvious development skills.  Never join a project that only has a web designer.  You have your own ideas.  Focus on them carefully and in small chunks and you will be able to develop cool projects.

:From [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring/Some Advice To Start With]], by Brandon Reinhart

}}

When you hear everyone telling you to read the code, do it.  They're telling you that because it truly is the fastest way to find anything in the engine.  Knowing when and where things work is crucial to putting together efficient code.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/A Few Things To Watch Out For</title>
    <id>1790</id>
    <revision>
      <id>4391</id>
      <timestamp>2003-05-20T02:44:17Z</timestamp>
      <contributor>
        <ip>Alien8</ip>
      </contributor>
      <minor/>
      <comment>*Replaced all instances of 'expands' with 'extends'</comment>
      <text xml:space="preserve">This is where I'm going to put all the information that I wish someone had told me when I started writing mods for Unreal. A lot of this information may not be relevant to you until you have more experience with the engine. I spent a lot of time out on my front porch with a buddy (Sel Tremble) talking about things like [[Legacy:Replication|replication]] trying to figure out exactly how it all worked. That was definitely one of the most satisfying things I have ever done. Cracking open a new game can be a very cool experience, but also a very frustrating one. Here I'll give you a couple pointers to ease your exploration.

===Accessed Nones ===

Sooner or later these will start showing up in your log files. UnrealScript treats ''Accessed None''s as warnings but you should treat them as errors. ''Accessed None''s are easy to fix and always signal that something is wrong with your code. If you are familiar with C++ or Java, it's easy to figure out what an Accessed None is. I'll briefly explain them to people who aren't so familiar.

UnrealScript is an object oriented programming language. When you write a program in UnrealScript, you define a set of behavior for these objects to obey and how they will interact. An object has a set of properties: member variables and member functions. In order to access an object property, you need a reference to that object. Let's look at some sample code:

&lt;uscript&gt;
class MyObject extends Info;

var PlayerReplicationInfo PlayerInfo;

function PlayerReplicationInfo TestFunction()
{
	return PlayerInfo;
}
&lt;/uscript&gt;

Here we have a simple object called &lt;code&gt;MyObject&lt;/code&gt; that is a subclass of [[Legacy:Info (UT)|Info (UT)]]. It has two properties: a variable called PlayerInfo and a function called TestFunction. You might want to interact with this object from inside your mod. Let's say you have a reference to a MyObject inside your mod and you want to get some information from inside the PlayerInfo property. You might write code that looks like this:

&lt;uscript&gt;
class MyMod extends TournamentGameInfo;

function string GetPlayerName()
{
	local MyObject Object1;
	local string PlayerName;

	Object1 = GetMyObject();
	PlayerName = Object1.PlayerInfo.PlayerName;
	Log(&quot;The player's name is&quot;@PlayerName);	
}
&lt;/uscript&gt;

In this example we call a function called &lt;code&gt;GetMyObject()&lt;/code&gt; to get a reference to a MyObject. We then access that reference to resolve PlayerInfo (&lt;code&gt;Object1.PlayerInfo&lt;/code&gt;) and then access the PlayerInfo reference to resolve PlayerName (&lt;code&gt;PlayerInfo.PlayerName&lt;/code&gt;). But what if there isn't a MyObject available, or a bug in &lt;code&gt;GetMyObject()&lt;/code&gt; causes it to fail to return a MyObject? In that case, the function would return ''None''. ''None'' is an empty reference... a lot like a NULL pointer in C++.

If, in our example, &lt;code&gt;GetMyObject()&lt;/code&gt; returns None, then the variable Object1 is assigned None. In the next line, we try and access Object1 to resolve the PlayerInfo reference. Uh oh... Object1 is ''None''... it doesn't refer to anything. We can't access it, so the Unreal engine logs a warning saying the code broke: &quot;Accessed None in MyMod.GetPlayerName!&quot;

Its very easy to avoid buggy code like this. Just add a couple checks to your code and define special behavior in the case of a mistake:

&lt;uscript&gt;
class MyMod extends TournamentGameInfo;

function string GetPlayerName()
{
	local MyObject Object1;
	local string PlayerName;

	Object1 = GetMyObject();
	if ((Object1 != None) &amp;&amp; (Object1.PlayerInfo != None))
		PlayerName = Object1.PlayerInfo.PlayerName;
	else
		PlayerName = &quot;Unknown&quot;;
	Log(&quot;The player's name is&quot;@PlayerName);	
}
&lt;/uscript&gt;

Now we are checking to see if Object1 is none and then checking to see if the PlayerInfo reference is none. &lt;code&gt;if&lt;/code&gt; statements in UnrealScript use short circuit logic. That is, &lt;code&gt;if&lt;/code&gt; statements are evaluated from left to right. As soon as the code encounters a statement that negates the &lt;code&gt;if&lt;/code&gt;, it stops evaluating. That means that if Object1 is ''None'', the code will never evaluate the &lt;code&gt;(Object1.PlayerInfo != None)&lt;/code&gt; statement. It knows that it doesn't matter what the rest of the statement says, the first part is false so the entire statement is false. 

''Accessed None''s can be especially dangerous in time critical functions like Timer and Tick. It takes a lot of time to write out an error message to the log and if your code is dumping 3000 error messages a second it can really kill performance (not to mention disk space). 

===Dangerous Iterators ===

UnrealScript implements a very useful programming tool called [[Legacy:UnrealScript Language Reference/Advanced Language Features|iterators]]. An iterator is a datatype that encapsulates a list. (UnrealScript only supports list iterators, our next language will support user defined iterators). You can get an iterator and loop on it, performing an operation on every object inside the iterator. Here is an example:

&lt;uscript&gt;
local Ammo A;
foreach AllActors(class'Ammo', A)
{
	A.AmmoAmount = 999;
}
&lt;/uscript&gt;

In this example we are using the AllActors function to get an actor list iterator. We then use the foreach iterator loop to perform some behavior on every object the AllActors function returns. AllActors takes the class of the type of actor you want and a variable to put it in. AllActors will search through '''every actor in the current game''' for the objects you want. Here we are saying &quot;Set the AmmoAmount of every actor in the game to 999.&quot; Sounds pretty cool, but lets think about it. We are searching through a list of hundreds of Actors for a small few. This isn't exactly a fast operation.

Iterators can be extremely useful if used carefully. Because they tend to be slow, you'll want to avoid performing iterations faster than a couple times a second. Never perform an AllActors iteration inside of Tick() and never perform AllActors iterations inside of other loops. (Okay, so saying ''never'' is a little strict. Let's say... ''use your best judgement''...)

The most common type of AllActors search you'll work with will probably be a search for all of the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] actors. PlayerReplicationInfo contains important information about Players that the server sends to each client. It allows each client to have an idea of the status of other players without sending too much information. Its used to show the scores on the scoreboard and other common things.

Usually, there will only be a handful of PlayerReplicationInfo actors in the global actor list. It doesn't really make sense to do a time consuming search for so few results. In order to simplify this common iteration, we've added a PRI array to GameReplicationInfo. Every tenth of a second, the PRIArray is updated to contain the current set of PlayerReplicationInfos. You can then do your operation of the PRIArray without having to do an AllActors call.

Other iterators are also available. Look in the [[Legacy:Actor|Actor]] class definition for information. They do exactly what they sound like: TouchingActors returns touching actors, RadiusActors returns all the actors in the given radius, etc. Intelligent use of these iterators will help you keep your code fast.

===The Foibles of Tracing ===

Wahaha. I just wanted to use the word foible.

Because the Unreal engine does not use a potentially visible set, if you want to find something in the world in a spacial sense, you'll need to perform a trace. Most of the time you'll have a good idea of where you are tracing, you just want to know whats on the other end of the line. Other times, you'll use a series of traces to get an idea of what surrounds the object in question.

My first advice is to avoid traces wherever possible. Think very hard about what you are using the trace for and try to come up with an alternate way of doing it. Traces are expensive operations that can introduce subtle slowdowns into your mod. You might have a player doing a couple traces every tick and during your testing everything is fine. What you don't realize, is that as soon as you are playing online with 15 of your buddies, those traces start to add up. 

If you have to perform traces, limit their size. Shorter traces are faster than long traces. If you are designing a new Shotgun weapon for UT, for example, you might want to perform 12 traces when the weapon is fired to figure out the scatter of the gun. 12 traces is perfectly reasonable.... it's not like the player is going to be firing his shotgun 30 times a second. However, those 12 traces could get expensive if your mod uses large open levels. Its highly unlikely your shotgun is going to be very useful as a long-range weapon, so you might as well cut off its range at a certain point. It saves the engine from having to trace from one end of the map to the other in the worst case.

Using traces is ultimately a judgment call. It really only becomes a big problem when you perform a lot of traces in a single frame. Nonetheless, it's definitely something to keep your eyes on. ''Always think about the performance implications of code you write.''

===Decrypting Replication ===

Understanding [[Legacy:Replication|replication]] is one of the most difficult aspects of writing a mod, but its utterly necessary if you plan on doing any netplay at all. Unfortunately, Tim's replication docs are not easy to understand and make some assumptions about the reader's knowledge that you may not possess. I'll try to point out the things that I learned only through trial and error.

'''Simulated''' functions are called on both the client and the server. '''But only if called from a simulated function.''' As soon as a function call breaks the simulation chain, the simulation stops. Be very aware of what you are simulating and what you are doing in simulated functions. '''Never add a function modifier like simulated just because you saw it in the Unreal source code somewhere else.''' Understand why you are adding it, know what it does. You can't possibly expect to write quality mods if you don't know what your code is doing.

Because a simulated function is called on both the client and the server you have to be particularly aware of what data you are accessing. Some object references that are available on the server might not be available on the client. For example, every [[Legacy:Actor|Actor]] has a reference to the current level. Inside the level reference is a reference to the current game. You might write code that looks like this:

&lt;uscript&gt;
simulated function bool CheckTeamGame()
{
	return Level.Game.bTeamGame
}
&lt;/uscript&gt;

This is a simple simulated function that returns true or false depending on whether or not the current game is a team game. It does this by checking the bTeamGame property of the current level's [[Legacy:GameInfo (UT)|GameInfo (UT)]] reference. What's wrong with this picture?

The Game property of the Level reference is only valid on the server. The client doesn't know anything about the server's game object so the client will log an ''Accessed None''. Yuck!

If you open up the script for [[Legacy:LevelInfo|LevelInfo]], you can find a section that looks like this:

&lt;uscript&gt;
//-----------------------------------------------------------------------------
// Network replication.

replication
{
	reliable if( Role==ROLE_Authority )
		Pauser, TimeDilation, bNoCheating, bAllowFOV;
}
&lt;/uscript&gt;

The replication block is a special statement that tells the Unreal engine how to deal with the properties of this object. Lets look at it closely.

First, we have a replication condition: &lt;code&gt;reliable if( Role == ROLE_Authority)&lt;/code&gt;. The first part of the condition will either be reliable or unreliable. If it says reliable, that means the engine will make sure the replicated information gets to each client safely. Because of the way the UDP protocol works, its possible for packets to get lost in transmission. Unreliable replication won't check to see if the packet arrived safely. Reliable replication has a slightly higher network overhead than unreliable replication.

The second part of the condition &lt;code&gt;(Role == ROLE_Authority)&lt;/code&gt; tells the engine when to send the data. In this situation we are going to send the data whenever the current LevelInfo object is an Authority. To really decypher what this means you have to understand the specific role of the object in question. With a LevelInfo, the server is going to maintain the authoritative version of the object. The server tells the clients how the level is behaving, not the other way around. For our example replication block, this means that the data will be sent from the server to each client. 

The other common type of condition is &lt;code&gt;(Role &lt; ROLE_Authority)&lt;/code&gt;. This means that the engine should send the data when the current object is not an authority. Or rather, that the client should tell the server the correct information.

Finally, we see four variables listed beneath the condition. These are the variables that the statement applies to. In this situation, we have a statement saying, &quot;If we are the server and the client has an outdated copy of these variables, then send to the client new information about Pauser, TimeDilation, bNoCheating, and bAllowFOV. Always make sure the data arrives safely.&quot;

The replication statement doesn't cover the rest of the variables in the LevelInfo. This can mean two things. Either the information is filled in by the client in C++ (in the case of TimeSeconds) or the information is never updated on the client and is completely unreliable (in the case of Game).

You don't have access to the C++ code, but you can make a couple inferences about an object's properties to help you determine whether or not a class has non-replicated properties that are filled in my C++. Look at the class declaration for LevelInfo:

&lt;uscript&gt;
class LevelInfo extends ZoneInfo
  native;
&lt;/uscript&gt;

Native means &quot;This object is declared in C++ and in UnrealScript.&quot; Native classes probably have behavior in C++ that you can't see. Only a few special classes are native.

Finally, watch out for classes that say &lt;code&gt;nativereplication&lt;/code&gt; in the class declaration. This means that the &lt;code&gt;replication&lt;/code&gt; block inside UnrealScript doesn't do anything and that replication is entirely defined in C++. Some network heavy objects use native replication to help with network performance. 

So now you have an idea of how to avoid problems with simulated functions. Now lets look at replicated functions. 

A replicated function is a function that is called from the client or the server but executed on the other side. An example of a replicated function is the &lt;code&gt;Say&lt;/code&gt; function. When you hit the T key to talk to everyone in a game, you are actually executing the Say function along with whatever you said. The client takes the function and its parameters and sends it to the server for execution. The server then broadcasts your message to all the other clients. 

Replicated functions are very easy to use if you remember one thing: They can't return a value. A replicated function is transmitted over the network to the other side... that takes time (approximately equal to your ping). If replicated functions were blocking (i.e.: they waited for a return value) network communication would halt.

This is obvious for anyone who thinks about it, but when you are working on your mod you might not think about it. Replicated functions return immediately. Use them to trigger behavior on the client (like special effects) or send a message (a weapon fire message to the server). 

Finally, replicated functions are restricted to only a few classes. A function call on an actor can only be replicated to the player who owns that actor. A function call can only be replicated to one actor (the player who owns it); they cannot be multicast. You might use them with weapons or inventory items you make (where the function is replicated to the player who owns the item).

Okay, so that should help you get into replication... let's move on. 

===Don't use UnrealEd ===

UnrealEd is a great editor for developing levels, but probably not the best place to work on code. This is a judgment call. I use Microsoft Developer Studio as my editor and &lt;code&gt;ucc make&lt;/code&gt; to compile the package files. I find the Find In Files option in Dev Studio to be very useful and the editor to be very powerful.

In addition, UnrealEd hides the default properties blocks of source files, making them only accessible through the Show Defaults option. This just sucks! To export the script files to disk, go to the script browser and hit the &quot;Export All&quot; button. The files will be exported to their package directories ready for you to browse.

If UnrealEd crashes with a DLL or OCX error of some sort, go to unreal.epicgames.com and click on Downloads. Download the latest Unreal Editor Fix. The current fix level is 4.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Three Mod Types]] &amp;ndash; '''Section 4 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]]</text>
    </revision>
    <revision>
      <id>4392</id>
      <timestamp>2002-02-05T14:23:14Z</timestamp>
      <contributor>
        <ip>TechnoJF</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is where I'm going to put all the information that I wish someone had told me when I started writing mods for Unreal. A lot of this information may not be relevant to you until you have more experience with the engine. I spent a lot of time out on my front porch with a buddy (Sel Tremble) talking about things like replication trying to figure out exactly how it all worked. That was definitely one of the most satisfying things I have ever done. Cracking open a new game can be a very cool experience, but also a very frustrating one. Here I'll give you a couple pointers to ease your exploration.

===Accessed Nones ===

Sooner or later these will start showing up in your log files. UnrealScript treats Accessed Nones as warnings but you should treat them as errors. Accessed Nones are easy to fix and always signal that something is wrong with your code. If you are familiar with C++ or Java, it's easy to figure out what an Accessed None is. I'll briefly explain them to people who aren't so familiar.

UnrealScript is an object oriented programming language. When you write a program in UnrealScript, you define a set of behavior for these objects to obey and how they will interact. An object has a set of properties: member variables and member functions. In order to access an object property, you need a reference to that object. Let's look at some sample code:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;class MyObject expands Info;

var PlayerReplicationInfo PlayerInfo;

function PlayerReplicationInfo TestFunction()

{

	return PlayerInfo;

}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

Here we have a simple object called &quot;MyObject&quot; that is a subclass of Info. It has two properties: a variable called PlayerInfo and a function called TestFunction. You might want to interact with this object from inside your mod. Let's say you have a reference to a MyObject inside your mod and you want to get some information from inside the PlayerInfo property. You might write code that looks like this:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;class MyMod expands TournamentGameInfo;

function string GetPlayerName()

{

	local MyObject Object1;

	local string PlayerName;

	Object1 = GetMyObject();

	PlayerName = Object1.PlayerInfo.PlayerName;

	Log(&quot;The player's name is&quot;@PlayerName);	

}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

In this example we call a function called GetMyObject() to get a reference to a MyObject. We then access that reference to resolve PlayerInfo (&quot;&lt;B&gt;Object1.PlayerInfo&lt;/B&gt;&quot;) and then access the PlayerInfo reference to resolve PlayerName (&quot;&lt;B&gt;PlayerInfo.PlayerName&lt;/B&gt;&quot;). But what if there isn't a MyObject available, or a bug in GetMyObject() causes it to fail to return a MyObject? In that case, the function would return &quot;None.&quot; None is an empty reference...a lot like a NULL pointer in C++.

If, in our example, GetMyObject() returns None, then the variable Object1 is assigned None. In the next line, we try and access Object1 to resolve the PlayerInfo reference. Uh oh....Object1 is None...it doesn't refer to anything. We can't access it, so the Unreal engine logs a warning saying the code broke: Accessed None in MyMod.GetPlayerName!

Its very easy to avoid buggy code like this. Just add a couple checks to your code and define special behavior in the case of a mistake:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;class MyMod expands TournamentGameInfo;

function string GetPlayerName()

{

	local MyObject Object1;

	local string PlayerName;

	Object1 = GetMyObject();

	if ((Object1 != None) &amp;amp;&amp;amp; (Object1.PlayerInfo != None))

		PlayerName = Object1.PlayerInfo.PlayerName;

	else

		PlayerName = &quot;Unknown&quot;;

	Log(&quot;The player's name is&quot;@PlayerName);	

}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

Now we are checking to see if Object1 is none and then checking to see if the PlayerInfo reference is none. &quot;If&quot; statements in UnrealScript use short circuit logic. That is, &quot;If&quot; statements are evaluated from left to right. As soon as the code encounters a statement that negates the &quot;If&quot;, it stops evaluating. That means that if Object1 is None, the code will never evaluate the (Object1.PlayerInfo != None) statement. It knows that it doesn't matter what the rest of the statement says, the first part is false so the entire statement is false. 

Accessed Nones can be especially dangerous in time critical functions like Timer and Tick. It takes a lot of time to write out an error message to the log and if your code is dumping 3000 error messages a second it can really kill performance (not to mention disk space). 

===Dangerous Iterators ===

UnrealScript implements a very useful programming tool called Iterators. An iterator is a datatype that encapsulates a list. (UnrealScript only supports list iterators, our next language will support user defined iterators). You can get an iterator and loop on it, performing an operation on every object inside the iterator. Here is an example:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;local Ammo A;

foreach AllActors(class'Ammo', A)

{

	A.AmmoAmount = 999;

}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

In this example we are using the AllActors function to get an Actor List iterator. We then use the foreach iterator loop to perform some behavior on every object the AllActors function returns. AllActors takes the class of the type of actor you want and a variable to put it in. AllActors will search through &lt;B&gt;every actor in the current game&lt;/B&gt; for the objects you want. Here we are saying &quot;set the AmmoAmount of every actor in the game to 999.&quot; Sounds pretty cool, but lets think about it. We are searching through a list of hundreds of Actors for a small few. This isn't exactly a fast operation.

Iterators can be extremely useful if used carefully. Because they tend to be slow, you'll want to avoid performing iterations faster than a couple times a second. Never perform an AllActors iteration inside of Tick() and never perform AllActors iterations inside of other loops. (Okay, so saying NEVER is a little strict. Let's say...USE YOUR BEST JUDGEMENT...)

The most common type of AllActors search you'll work with will probably be a search for all of the PlayerReplicationInfo actors. PlayerReplicationInfo contains important information about Players that the server sends to each client. It allows each client to have an idea of the status of other players without sending too much information. Its used to show the scores on the scoreboard and other common things.

Usually, there will only be a handful of PlayerReplicationInfo actors in the global Actor List. It doesn't really make sense to do a time consuming search for so few results. In order to simplify this common iteration, we've added a PRI array to GameReplicationInfo. Every tenth of a second, the PRIArray is updated to contain the current set of PlayerReplicationInfos. You can then do your operation of the PRIArray without having to do an AllActors call.

Other iterators are also available. Look in the Actor class definition for information. They do exactly what they sound like: TouchingActors returns touching actors, RadiusActors returns all the actors in the given radius, etc. Intelligent use of these iterators will help you keep your code fast.

===The Foibles of Tracing ===

Wahaha. I just wanted to use the word foible.

Because the Unreal engine does not use a potentially visible set, if you want to find something in the world in a spacial sense, you'll need to perform a trace. Most of the time you'll have a good idea of where you are tracing, you just want to know whats on the other end of the line. Other times, you'll use a series of traces to get an idea of what surrounds the object in question.

My first advice is to avoid traces wherever possible. Think very hard about what you are using the trace for and try to come up with an alternate way of doing it. Traces are expensive operations that can introduce subtle slowdowns into your mod. You might have a player doing a couple traces every tick and during your testing everything is fine. What you don't realize, is that as soon as you are playing online with 15 of your buddies, those traces start to add up. 

If you have to perform traces, limit their size. Shorter traces are faster than long traces. If you are designing a new Shotgun weapon for UT, for example, you might want to perform 12 traces when the weapon is fired to figure out the scatter of the gun. 12 traces is perfectly reasonable.... it's not like the player is going to be firing his shotgun 30 times a second. However, those 12 traces could get expensive if your mod uses large open levels. Its highly unlikely your shotgun is going to be very useful as a long-range weapon, so you might as well cut off its range at a certain point. It saves the engine from having to trace from one end of the map to the other in the worst case. &lt;P&gt;Using traces is ultimately a judgment call. It really only becomes a big problem when you perform a lot of traces in a single frame. Nonetheless, it's definitely something to keep your eyes on. &lt;B&gt;Always think about the performance implications of code you write.&lt;/B&gt; 

===Decrypting Replication ===

Understanding replication is one of the most difficult aspects of writing a mod, but its utterly necessary if you plan on doing any netplay at all. Unfortunately, Tim's replication docs are not easy to understand and make some assumptions about the reader's knowledge that you may not possess. I'll try to point out the things that I learned only through trial and error.

&lt;B&gt;Simulated&lt;/B&gt; functions are called on both the client and the server. &lt;B&gt;But only if called from a simulated function.&lt;/B&gt; As soon as a function call breaks the simulation chain, the simulation stops. Be very aware of what you are simulating and what you are doing in simulated functions. &lt;B&gt;Never add a function modifier like simulated just because you saw it in the Unreal source code somewhere else.&lt;/B&gt; Understand why you are adding it, know what it does. You can't possibly expect to write quality mods if you don't know what your code is doing.

Because a simulated function is called on both the client and the server you have to be particularly aware of what data you are accessing. Some object references that are available on the server might not be available on the client. For example, every Actor has a reference to the current level. Inside the level reference is a reference to the current game. You might write code that looks like this:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;simulated function bool CheckTeamGame()

{

	return Level.Game.bTeamGame

}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

This is a simple simulated function that returns true or false depending on whether or not the current game is a Team Game. It does this by checking the bTeamGame property of the current level's GameInfo reference. What's wrong with this picture?

The Game property of the Level reference is only valid on the server. The client doesn't know anything about the server's game object so the client will log an Accessed None. Yuck!

If you open up the script for LevelInfo, you can find a section that looks like this:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;//-----------------------------------------------------------------------------

// Network replication.

replication

{

	reliable if( Role==ROLE_Authority )

		Pauser, TimeDilation, bNoCheating, bAllowFOV;

}
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

The replication block is a special statement that tells the Unreal engine how to deal with the properties of this object. Lets look at it closely.

First, we have a replication condition: &lt;B&gt;reliable if( Role == ROLE_Authority)&lt;/B&gt;. The first part of the condition will either be reliable or unreliable. If it says reliable, that means the engine will make sure the replicated information gets to each client safely. Because of the way the UDP protocol works, its possible for packets to get lost in transmission. Unreliable replication won't check to see if the packet arrived safely. Reliable replication has a slightly higher network overhead than unreliable replication.

The second part of the condition (Role == ROLE_Authority) tells the engine when to send the data. In this situation we are going to send the data whenever the current LevelInfo object is an Authority. To really decypher what this means you have to understand the specific role of the object in question. With a LevelInfo, the server is going to maintain the authoritative version of the object. The server tells the clients how the level is behaving, not the other way around. For our example replication block, this means that the data will be sent from the server to each client. 

The other common type of condition is (Role &amp;lt; ROLE_Authority). This means that the engine should send the data when the current object is not an authority. Or rather, that the client should tell the server the correct information.

Finally, we see four variables listed beneath the condition. These are the variables that the statement applies to. In this situation, we have a statement saying, &quot;If we are the server and the client has an outdated copy of these variables, then send to the client new information about Pauser, TimeDilation, bNoCheating, and bAllowFOV. Always make sure the data arrives safely.&quot;

The replication statement doesn't cover the rest of the variables in the LevelInfo. This can mean two things. Either the information is filled in by the client in C++ (in the case of TimeSeconds) or the information is never updated on the client and is completely unreliable (in the case of Game).

You don't have access to the C++ code, but you can make a couple inferences about an object's properties to help you determine whether or not a class has non-replicated properties that are filled in my C++. Look at the class declaration for LevelInfo:

&lt;BLOCKQUOTE&gt;&lt;PRE&gt;class LevelInfo extends ZoneInfo
  native;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

Native means &quot;This object is declared in C++ and in UnrealScript.&quot; Native classes probably have behavior in C++ that you can't see. Only a few special classes are native.

Finally, watch out for classes that say &quot;nativereplication&quot; in the class declaration. This means that the &quot;replication&quot; block inside UnrealScript doesn't do anything and that replication is entirely defined in C++. Some network heavy objects use native replication to help with network performance. 

So now you have an idea of how to avoid problems with simulated functions. Now lets look at replicated functions. 

A replicated function is a function that is called from the client or the server but executed on the other side. An example of a replicated function is the &quot;Say&quot; function. When you hit the T key to talk to everyone in a game, you are actually executing the Say function along with whatever you said. The client takes the function and its parameters and sends it to the server for execution. The server then broadcasts your message to all the other clients. 

Replicated functions are very easy to use if you remember one thing: they can't return a value. A replicated function is transmitted over the network to the other side...that takes time (approximately equal to your ping). If replicated functions were blocking (i.e.: they waited for a return value) network communication would halt.

This is obvious for anyone who thinks about it, but when you are working on your mod you might not think about it. Replicated functions return immediately. Use them to trigger behavior on the client (like special effects) or send a message (a weapon fire message to the server). 

Finally, replicated functions are restricted to only a few classes. A function call on an actor can only be replicated to the player who owns that actor. A function call can only be replicated to one actor (the player who owns it); they cannot be multicast. You might use them with weapons or inventory items you make (where the function is replicated to the player who owns the item).

Okay, so that should help you get into replication....let's move on. 

===Don't use UnrealEd ===

UnrealEd is a great editor for developing levels, but probably not the best place to work on code. This is a judgment call. I use Microsoft Developer Studio as my editor and &quot;ucc make&quot; to compile the package files. I find the Find In Files option in Dev Studio to be very useful and the editor to be very powerful.

In addition, UnrealEd hides the default properties blocks of source files, making them only accessible through the Show Defaults option. This just sucks! To export the script files to disk, go to the script browser and hit the &quot;Export All&quot; button. The files will be exported to their package directories ready for you to browse.

If UnrealEd crashes with a DLL or OCX error of some sort, go to unreal.epicgames.com and click on Downloads. Download the latest Unreal Editor Fix. The current fix level is 4.

&lt;TABLE WIDTH=&quot;100%&quot; BORDER=0&gt;

&lt;tr&gt;&lt;td&gt;&lt;i&gt;Next Page:&lt;/i&gt; [[Legacy:Mod_Authoring/Setting_Up_Your_Project|Getting Dirty: Setting Up Your Project]]

&lt;td ALIGN=&quot;RIGHT&quot;&gt;&lt;FONT COLOR=green&gt;Section 4 of 12&lt;/FONT&gt;&lt;/TABLE&gt;</text>
    </revision>
    <revision>
      <id>4393</id>
      <timestamp>2002-11-01T04:38:07Z</timestamp>
      <contributor>
        <ip>ATimson</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is where I'm going to put all the information that I wish someone had told me when I started writing mods for Unreal. A lot of this information may not be relevant to you until you have more experience with the engine. I spent a lot of time out on my front porch with a buddy (Sel Tremble) talking about things like [[Legacy:Replication|replication]] trying to figure out exactly how it all worked. That was definitely one of the most satisfying things I have ever done. Cracking open a new game can be a very cool experience, but also a very frustrating one. Here I'll give you a couple pointers to ease your exploration.

===Accessed Nones ===

Sooner or later these will start showing up in your log files. UnrealScript treats ''Accessed None''s as warnings but you should treat them as errors. ''Accessed None''s are easy to fix and always signal that something is wrong with your code. If you are familiar with C++ or Java, it's easy to figure out what an Accessed None is. I'll briefly explain them to people who aren't so familiar.

UnrealScript is an object oriented programming language. When you write a program in UnrealScript, you define a set of behavior for these objects to obey and how they will interact. An object has a set of properties: member variables and member functions. In order to access an object property, you need a reference to that object. Let's look at some sample code:

&lt;uscript&gt;
class MyObject expands Info;

var PlayerReplicationInfo PlayerInfo;

function PlayerReplicationInfo TestFunction()
{
	return PlayerInfo;
}
&lt;/uscript&gt;

Here we have a simple object called &lt;code&gt;MyObject&lt;/code&gt; that is a subclass of [[Legacy:Info (UT)|Info (UT)]]. It has two properties: a variable called PlayerInfo and a function called TestFunction. You might want to interact with this object from inside your mod. Let's say you have a reference to a MyObject inside your mod and you want to get some information from inside the PlayerInfo property. You might write code that looks like this:

&lt;uscript&gt;
class MyMod expands TournamentGameInfo;

function string GetPlayerName()
{
	local MyObject Object1;
	local string PlayerName;

	Object1 = GetMyObject();
	PlayerName = Object1.PlayerInfo.PlayerName;
	Log(&quot;The player's name is&quot;@PlayerName);	
}
&lt;/uscript&gt;

In this example we call a function called &lt;code&gt;GetMyObject()&lt;/code&gt; to get a reference to a MyObject. We then access that reference to resolve PlayerInfo (&lt;code&gt;Object1.PlayerInfo&lt;/code&gt;) and then access the PlayerInfo reference to resolve PlayerName (&lt;code&gt;PlayerInfo.PlayerName&lt;/code&gt;). But what if there isn't a MyObject available, or a bug in &lt;code&gt;GetMyObject()&lt;/code&gt; causes it to fail to return a MyObject? In that case, the function would return ''None''. ''None'' is an empty reference... a lot like a NULL pointer in C++.

If, in our example, &lt;code&gt;GetMyObject()&lt;/code&gt; returns None, then the variable Object1 is assigned None. In the next line, we try and access Object1 to resolve the PlayerInfo reference. Uh oh... Object1 is ''None''... it doesn't refer to anything. We can't access it, so the Unreal engine logs a warning saying the code broke: &quot;Accessed None in MyMod.GetPlayerName!&quot;

Its very easy to avoid buggy code like this. Just add a couple checks to your code and define special behavior in the case of a mistake:

&lt;uscript&gt;
class MyMod expands TournamentGameInfo;

function string GetPlayerName()
{
	local MyObject Object1;
	local string PlayerName;

	Object1 = GetMyObject();
	if ((Object1 != None) &amp;&amp; (Object1.PlayerInfo != None))
		PlayerName = Object1.PlayerInfo.PlayerName;
	else
		PlayerName = &quot;Unknown&quot;;
	Log(&quot;The player's name is&quot;@PlayerName);	
}
&lt;/uscript&gt;

Now we are checking to see if Object1 is none and then checking to see if the PlayerInfo reference is none. &lt;code&gt;if&lt;/code&gt; statements in UnrealScript use short circuit logic. That is, &lt;code&gt;if&lt;/code&gt; statements are evaluated from left to right. As soon as the code encounters a statement that negates the &lt;code&gt;if&lt;/code&gt;, it stops evaluating. That means that if Object1 is ''None'', the code will never evaluate the &lt;code&gt;(Object1.PlayerInfo != None)&lt;/code&gt; statement. It knows that it doesn't matter what the rest of the statement says, the first part is false so the entire statement is false. 

''Accessed None''s can be especially dangerous in time critical functions like Timer and Tick. It takes a lot of time to write out an error message to the log and if your code is dumping 3000 error messages a second it can really kill performance (not to mention disk space). 

===Dangerous Iterators ===

UnrealScript implements a very useful programming tool called [[Legacy:UnrealScript Language Reference/Advanced Language Features|iterators]]. An iterator is a datatype that encapsulates a list. (UnrealScript only supports list iterators, our next language will support user defined iterators). You can get an iterator and loop on it, performing an operation on every object inside the iterator. Here is an example:

&lt;uscript&gt;
local Ammo A;
foreach AllActors(class'Ammo', A)
{
	A.AmmoAmount = 999;
}
&lt;/uscript&gt;

In this example we are using the AllActors function to get an actor list iterator. We then use the foreach iterator loop to perform some behavior on every object the AllActors function returns. AllActors takes the class of the type of actor you want and a variable to put it in. AllActors will search through '''every actor in the current game''' for the objects you want. Here we are saying &quot;Set the AmmoAmount of every actor in the game to 999.&quot; Sounds pretty cool, but lets think about it. We are searching through a list of hundreds of Actors for a small few. This isn't exactly a fast operation.

Iterators can be extremely useful if used carefully. Because they tend to be slow, you'll want to avoid performing iterations faster than a couple times a second. Never perform an AllActors iteration inside of Tick() and never perform AllActors iterations inside of other loops. (Okay, so saying ''never'' is a little strict. Let's say... ''use your best judgement''...)

The most common type of AllActors search you'll work with will probably be a search for all of the [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] actors. PlayerReplicationInfo contains important information about Players that the server sends to each client. It allows each client to have an idea of the status of other players without sending too much information. Its used to show the scores on the scoreboard and other common things.

Usually, there will only be a handful of PlayerReplicationInfo actors in the global actor list. It doesn't really make sense to do a time consuming search for so few results. In order to simplify this common iteration, we've added a PRI array to GameReplicationInfo. Every tenth of a second, the PRIArray is updated to contain the current set of PlayerReplicationInfos. You can then do your operation of the PRIArray without having to do an AllActors call.

Other iterators are also available. Look in the [[Legacy:Actor|Actor]] class definition for information. They do exactly what they sound like: TouchingActors returns touching actors, RadiusActors returns all the actors in the given radius, etc. Intelligent use of these iterators will help you keep your code fast.

===The Foibles of Tracing ===

Wahaha. I just wanted to use the word foible.

Because the Unreal engine does not use a potentially visible set, if you want to find something in the world in a spacial sense, you'll need to perform a trace. Most of the time you'll have a good idea of where you are tracing, you just want to know whats on the other end of the line. Other times, you'll use a series of traces to get an idea of what surrounds the object in question.

My first advice is to avoid traces wherever possible. Think very hard about what you are using the trace for and try to come up with an alternate way of doing it. Traces are expensive operations that can introduce subtle slowdowns into your mod. You might have a player doing a couple traces every tick and during your testing everything is fine. What you don't realize, is that as soon as you are playing online with 15 of your buddies, those traces start to add up. 

If you have to perform traces, limit their size. Shorter traces are faster than long traces. If you are designing a new Shotgun weapon for UT, for example, you might want to perform 12 traces when the weapon is fired to figure out the scatter of the gun. 12 traces is perfectly reasonable.... it's not like the player is going to be firing his shotgun 30 times a second. However, those 12 traces could get expensive if your mod uses large open levels. Its highly unlikely your shotgun is going to be very useful as a long-range weapon, so you might as well cut off its range at a certain point. It saves the engine from having to trace from one end of the map to the other in the worst case.

Using traces is ultimately a judgment call. It really only becomes a big problem when you perform a lot of traces in a single frame. Nonetheless, it's definitely something to keep your eyes on. ''Always think about the performance implications of code you write.''

===Decrypting Replication ===

Understanding [[Legacy:Replication|replication]] is one of the most difficult aspects of writing a mod, but its utterly necessary if you plan on doing any netplay at all. Unfortunately, Tim's replication docs are not easy to understand and make some assumptions about the reader's knowledge that you may not possess. I'll try to point out the things that I learned only through trial and error.

'''Simulated''' functions are called on both the client and the server. '''But only if called from a simulated function.''' As soon as a function call breaks the simulation chain, the simulation stops. Be very aware of what you are simulating and what you are doing in simulated functions. '''Never add a function modifier like simulated just because you saw it in the Unreal source code somewhere else.''' Understand why you are adding it, know what it does. You can't possibly expect to write quality mods if you don't know what your code is doing.

Because a simulated function is called on both the client and the server you have to be particularly aware of what data you are accessing. Some object references that are available on the server might not be available on the client. For example, every [[Legacy:Actor|Actor]] has a reference to the current level. Inside the level reference is a reference to the current game. You might write code that looks like this:

&lt;uscript&gt;
simulated function bool CheckTeamGame()
{
	return Level.Game.bTeamGame
}
&lt;/uscript&gt;

This is a simple simulated function that returns true or false depending on whether or not the current game is a team game. It does this by checking the bTeamGame property of the current level's [[Legacy:GameInfo (UT)|GameInfo (UT)]] reference. What's wrong with this picture?

The Game property of the Level reference is only valid on the server. The client doesn't know anything about the server's game object so the client will log an ''Accessed None''. Yuck!

If you open up the script for [[Legacy:LevelInfo|LevelInfo]], you can find a section that looks like this:

&lt;uscript&gt;
//-----------------------------------------------------------------------------
// Network replication.

replication
{
	reliable if( Role==ROLE_Authority )
		Pauser, TimeDilation, bNoCheating, bAllowFOV;
}
&lt;/uscript&gt;

The replication block is a special statement that tells the Unreal engine how to deal with the properties of this object. Lets look at it closely.

First, we have a replication condition: &lt;code&gt;reliable if( Role == ROLE_Authority)&lt;/code&gt;. The first part of the condition will either be reliable or unreliable. If it says reliable, that means the engine will make sure the replicated information gets to each client safely. Because of the way the UDP protocol works, its possible for packets to get lost in transmission. Unreliable replication won't check to see if the packet arrived safely. Reliable replication has a slightly higher network overhead than unreliable replication.

The second part of the condition &lt;code&gt;(Role == ROLE_Authority)&lt;/code&gt; tells the engine when to send the data. In this situation we are going to send the data whenever the current LevelInfo object is an Authority. To really decypher what this means you have to understand the specific role of the object in question. With a LevelInfo, the server is going to maintain the authoritative version of the object. The server tells the clients how the level is behaving, not the other way around. For our example replication block, this means that the data will be sent from the server to each client. 

The other common type of condition is &lt;code&gt;(Role &lt; ROLE_Authority)&lt;/code&gt;. This means that the engine should send the data when the current object is not an authority. Or rather, that the client should tell the server the correct information.

Finally, we see four variables listed beneath the condition. These are the variables that the statement applies to. In this situation, we have a statement saying, &quot;If we are the server and the client has an outdated copy of these variables, then send to the client new information about Pauser, TimeDilation, bNoCheating, and bAllowFOV. Always make sure the data arrives safely.&quot;

The replication statement doesn't cover the rest of the variables in the LevelInfo. This can mean two things. Either the information is filled in by the client in C++ (in the case of TimeSeconds) or the information is never updated on the client and is completely unreliable (in the case of Game).

You don't have access to the C++ code, but you can make a couple inferences about an object's properties to help you determine whether or not a class has non-replicated properties that are filled in my C++. Look at the class declaration for LevelInfo:

&lt;uscript&gt;
class LevelInfo extends ZoneInfo
  native;
&lt;/uscript&gt;

Native means &quot;This object is declared in C++ and in UnrealScript.&quot; Native classes probably have behavior in C++ that you can't see. Only a few special classes are native.

Finally, watch out for classes that say &lt;code&gt;nativereplication&lt;/code&gt; in the class declaration. This means that the &lt;code&gt;replication&lt;/code&gt; block inside UnrealScript doesn't do anything and that replication is entirely defined in C++. Some network heavy objects use native replication to help with network performance. 

So now you have an idea of how to avoid problems with simulated functions. Now lets look at replicated functions. 

A replicated function is a function that is called from the client or the server but executed on the other side. An example of a replicated function is the &lt;code&gt;Say&lt;/code&gt; function. When you hit the T key to talk to everyone in a game, you are actually executing the Say function along with whatever you said. The client takes the function and its parameters and sends it to the server for execution. The server then broadcasts your message to all the other clients. 

Replicated functions are very easy to use if you remember one thing: They can't return a value. A replicated function is transmitted over the network to the other side... that takes time (approximately equal to your ping). If replicated functions were blocking (i.e.: they waited for a return value) network communication would halt.

This is obvious for anyone who thinks about it, but when you are working on your mod you might not think about it. Replicated functions return immediately. Use them to trigger behavior on the client (like special effects) or send a message (a weapon fire message to the server). 

Finally, replicated functions are restricted to only a few classes. A function call on an actor can only be replicated to the player who owns that actor. A function call can only be replicated to one actor (the player who owns it); they cannot be multicast. You might use them with weapons or inventory items you make (where the function is replicated to the player who owns the item).

Okay, so that should help you get into replication... let's move on. 

===Don't use UnrealEd ===

UnrealEd is a great editor for developing levels, but probably not the best place to work on code. This is a judgment call. I use Microsoft Developer Studio as my editor and &lt;code&gt;ucc make&lt;/code&gt; to compile the package files. I find the Find In Files option in Dev Studio to be very useful and the editor to be very powerful.

In addition, UnrealEd hides the default properties blocks of source files, making them only accessible through the Show Defaults option. This just sucks! To export the script files to disk, go to the script browser and hit the &quot;Export All&quot; button. The files will be exported to their package directories ready for you to browse.

If UnrealEd crashes with a DLL or OCX error of some sort, go to unreal.epicgames.com and click on Downloads. Download the latest Unreal Editor Fix. The current fix level is 4.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Three Mod Types]] &amp;ndash; '''Section 4 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/A First Look At GameInfo</title>
    <id>1791</id>
    <revision>
      <id>4394</id>
      <timestamp>2003-08-08T00:26:40Z</timestamp>
      <contributor>
        <ip>Ip68-110-10-195.tc.ph.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Open the Engine package file &lt;code&gt;GameInfo.uc&lt;/code&gt;. This is the definition of the basic game logic. At the top of the file you'll see a long list of variable declarations. Many of these variables have comments that describe their purpose. Below the variable declarations come the functions (or methods) that do the work.

; Timer : The first thing to look at is the Timer function. In [[Legacy:GameInfo (UT)|GameInfo (UT)]] its pretty short, but in [[Legacy:DeathMatchPlus|DeathMatchPlus]] its very long. Timer is a special UnrealScript event. If you call the function &lt;code&gt;SetTimer(int Time, bool bLoop)&lt;/code&gt; you can set up a repeating timer on your [[Legacy:Actor|actor]]. The Time parameter describes when the Timer function should be called. The bLoop parameter describes whether or not Timer should be called in a loop after the first call. '''All TournamentGameInfo classes use a Timer loop of one second.''' This means that the Timer function is called every second. You can use Timer for events that have to happen at certain times. By declaring watch variables that count up seconds, you can perform events at any time up to a second's resolution. DeathMatchPlus uses this to check and see if the TimeLimit has been hit in a game.

; Tick : Another important time function to get to know is Tick. Tick isn't used in GameInfo, but any Actor can use it. The declaration for Tick is: &lt;code&gt;Tick(float DeltaTime)&lt;/code&gt;. Tick is called on '''every''' Actor in the game each frame. DeltaTime contains the amount of time that has passed since the last Tick. Using Tick, you can perform behavior that has to be done at less-than-a-second resolution. You must be careful not to perform CPU heavy behavior in Tick, because it is called so often.

; Login : Scroll down in GameInfo until you find the Login function. This function is called by the engine whenever a player logs in to the game. GameInfo's version of login does important setup stuff like assigning the player a name, a skin, a mesh and so forth. It also spawns the intial teleport effect and finds a spawn point to stick the player at. A little ways below Login is Logout. It is called whenever a player leaves the game. You can use logout to clean up after a player exits.

; AddDefaultInventory : Another interesting function in GameInfo is AddDefaultInventory. This function assigns a player his initial weapon and equipment. In UnrealTournment's DeathMatchPlus, the player is given an [[Legacy:ImpactHammer|ImpactHammer]] and an [[Legacy:Enforcer|Enforcer]]. [[Legacy:LMS|LastManStanding]] has a great example of doing cool things with AddDefaultInventory. It gives the player every weapon in the game (except for the Redeemer) as well as some armor and a lot of ammo. You can use AddDefaultInventory to add custom inventory to players that join your mod (for example, you might want to give them a grenade and some money).

; FindPlayerStart : The FindPlayerStart method searches the actors in a level for [[Legacy:NavigationPoint|NavigationPoint]]s suitable for spawning. The [[Legacy:PlayerStart|PlayerStart]] actor that a map designer adds to their map is one such location. In [[Legacy:TeamGamePlus|TeamGamePlus]], FindPlayerStart spawns players and bots depending on their Team. It checks the Team of each playerstart and the Team of the pawn to be spawned. You can use FindPlayerStart to write custom spawn code (for example, you might want to spawn Terrorists in one location and Snipers in another).

; RestartPlayer : The RestartPlayer method is called whenever a player respawns. The basic GameInfo version calls FindPlayerStart to find a starting spot, moves the player to that spot and spawns a teleport effect. It also restores the players health, sets the player's collision, and gives the player his default inventory.

; Killed : The Killed method is very useful. It is called whenever a player kills another player. It looks at the cirumstances of the death (whether a player suicided or killed successfully) and the type of damage and prints a message. It also logs the event to the ngStats log. Finally, it calls ScoreKill.

; ScoreKill : ScoreKill awards points for a kill. DeathMatchPlus assigns a frag for a successful kill and subtracts one for a suicide. TeamGamePlus also adds a point to the TeamInfo of the Killer's team, or subtracts one in the case of a suicide.

; DiscardInventory : DiscardInventory is called whenever a player dies or is removed from the game. DiscardInventory goes through a pawn's inventory, tossing out weapons and destroying others as appropriate. You might override this function if you wanted to toss out a backpack or a trap.

; EndGame : Finally, the EndGame function is called with a reason whenever the game ends. You might want to perform special logging or clean up here.

So thats a quick look at the more important GameInfo functions. The advanced GameInfo classes like DeathMatchPlus add important new behavior for controlling bots and single player games, as well as refining the GameInfo methods into specific rules.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]] &amp;ndash; '''Section 10 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]]</text>
    </revision>
    <revision>
      <id>4395</id>
      <timestamp>2003-06-02T12:34:50Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Open the Engine package file &lt;code&gt;GameInfo.uc&lt;/code&gt;. This is the definition of the basic game logic. At the top of the file you'll see a long list of variable declarations. Many of these variables have comments that describe their purpose. Below the variable declarations come the functions (or methods) that do the work.

; Timer : The first thing to look at is the Timer function. In [[Legacy:GameInfo (UT)|GameInfo (UT)]] its pretty short, but in [[Legacy:DeathMatchPlus|DeathMatchPlus]] its very long. Timer is a special UnrealScript event. If you call the function &lt;code&gt;SetTimer(int Time, bool bLoop)&lt;/code&gt; you can set up a repeating timer on your [[Legacy:Actor|actor]]. The Time parameter describes when the Timer function should be called. The bLoop parameter describes whether or not Timer should be called in a loop after the first call. '''All TournamentGameInfo classes use a Timer loop of one second.''' This means that the Timer function is called every second. You can use Timer for events that have to happen at certain times. By declaring watch variables that count up seconds, you can perform events at any time up to a second's resolution. DeathMatchPlus uses this to check and see if the TimeLimit has been hit in a game.

; Tick : Another important time function to get to know is Tick. Tick isn't used in GameInfo, but any Actor can use it. The declaration for Tick is: &lt;code&gt;Tick(float DeltaTime)&lt;/code&gt;. Tick is called on '''every''' Actor in the game each frame. DeltaTime contains the amount of time that has passed since the last Tick. Using Tick, you can perform behavior that has to be done at less-than-a-second resolution. You must be careful not to perform CPU heavy behavior in Tick, because it is called so often.

; Login : Scroll down in GameInfo until you find the Login function. This function is called by the engine whenever a player logs in to the game. GameInfo's version of login does important setup stuff like assigning the player a name, a skin, a mesh and so forth. It also spawns the intial teleport effect and finds a spawn point to stick the player at. A little ways below Login is Logout. It is called whenever a player leaves the game. You can use logout to clean up after a player exits.

; AddDefaultInventory : Another interesting function in GameInfo is AddDefaultInventory. This function assigns a player his initial weapon and equipment. In UnrealTournment's DeathMatchPlus, the player is given an [[Legacy:ImpactHammer|ImpactHammer]] and an [[Legacy:Enforcer|Enforcer]]. [[Legacy:LMS|LastManStanding]] has a great example of doing cool things with AddDefaultInventory. It gives the player every weapon in the game (except for the Redeemer) as well as some armor and a lot of ammo. You can use AddDefaultInventory to add custom inventory to players that join your mod (for example, you might want to give them a grenade and some money).

; FindPlayerStart : The FindPlayerStart method searches the actors in a level for [[Legacy:NavigationPoint|NavigationPoint]]s suitable for spawning. The [[Legacy:PlayerStart|PlayerStart]] actor that a map designer adds to their map is one such location. In [[Legacy:TeamGamePlus|TeamGamePlus]], FindPlayerStart spawns players and bots depending on their Team. It checks the Team of each playerstart and the Team of the pawn to be spawned. You can use FindPlayerStart to write custom spawn code (for example, you might want to spawn Terrorists in one location and Snipers in another).

; RestartPlayer : The RestartPlayer method is called whenever a player respawns. The basic GameInfo version calls FindPlayerStart to find a starting spot, moves the player to that spot and spawns a teleport effect. It also restores the players health, sets the player's collision, and gives the player his default inventory.

; Killed : The Killed method is very useful. It is called whenever a player kills another player. It looks at the cirumstances of the death (whether a player suicided or killed successfully) and the type of damage and prints a message. It also logs the event to the ngStats log. Finally, it calls ScoreKill.

; ScoreKill : ScoreKill awards points for a kill. DeathMatchPlus assigns a frag for a successful kill and subtracts one for a suicide. TeamGamePlus also adds a point to the TeamInfo of the Killer's team, or subtracts one in the case of a suicide.

; DiscardInventory : DiscardInventory is called whenever a player dies or is removed from the game. DiscardInventory goes through a pawn's inventory, tossing out weapons and destroying others as appropriate. You might override this function if you wanted to toss out a backpack or a trap.

; EndGame : Finally, the EndGame function is called with a reason whenever the game ends. You might want to perform special logging or clean up here.

So thats a quick look at the more important GameInfo functions. The advanced GameInfo classes like DeathMatchPlus add important new behavior for controlling bots and single player games, as well as refining the GameInfo methods into specific rules.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]] &amp;ndash; '''Section 10 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]]</text>
    </revision>
    <revision>
      <id>4396</id>
      <timestamp>2003-08-08T00:26:24Z</timestamp>
      <contributor>
        <ip>Ip68-110-10-195.tc.ph.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">pen the Engine package file &lt;code&gt;GameInfo.uc&lt;/code&gt;. This is the definition of the basic game logic. At the top of the file you'll see a long list of variable declarations. Many of these variables have comments that describe their purpose. Below the variable declarations come the functions (or methods) that do the work.

; Timer : The first thing to look at is the Timer function. In [[Legacy:GameInfo (UT)|GameInfo (UT)]] its pretty short, but in [[Legacy:DeathMatchPlus|DeathMatchPlus]] its very long. Timer is a special UnrealScript event. If you call the function &lt;code&gt;SetTimer(int Time, bool bLoop)&lt;/code&gt; you can set up a repeating timer on your [[Legacy:Actor|actor]]. The Time parameter describes when the Timer function should be called. The bLoop parameter describes whether or not Timer should be called in a loop after the first call. '''All TournamentGameInfo classes use a Timer loop of one second.''' This means that the Timer function is called every second. You can use Timer for events that have to happen at certain times. By declaring watch variables that count up seconds, you can perform events at any time up to a second's resolution. DeathMatchPlus uses this to check and see if the TimeLimit has been hit in a game.

; Tick : Another important time function to get to know is Tick. Tick isn't used in GameInfo, but any Actor can use it. The declaration for Tick is: &lt;code&gt;Tick(float DeltaTime)&lt;/code&gt;. Tick is called on '''every''' Actor in the game each frame. DeltaTime contains the amount of time that has passed since the last Tick. Using Tick, you can perform behavior that has to be done at less-than-a-second resolution. You must be careful not to perform CPU heavy behavior in Tick, because it is called so often.

; Login : Scroll down in GameInfo until you find the Login function. This function is called by the engine whenever a player logs in to the game. GameInfo's version of login does important setup stuff like assigning the player a name, a skin, a mesh and so forth. It also spawns the intial teleport effect and finds a spawn point to stick the player at. A little ways below Login is Logout. It is called whenever a player leaves the game. You can use logout to clean up after a player exits.

; AddDefaultInventory : Another interesting function in GameInfo is AddDefaultInventory. This function assigns a player his initial weapon and equipment. In UnrealTournment's DeathMatchPlus, the player is given an [[Legacy:ImpactHammer|ImpactHammer]] and an [[Legacy:Enforcer|Enforcer]]. [[Legacy:LMS|LastManStanding]] has a great example of doing cool things with AddDefaultInventory. It gives the player every weapon in the game (except for the Redeemer) as well as some armor and a lot of ammo. You can use AddDefaultInventory to add custom inventory to players that join your mod (for example, you might want to give them a grenade and some money).

; FindPlayerStart : The FindPlayerStart method searches the actors in a level for [[Legacy:NavigationPoint|NavigationPoint]]s suitable for spawning. The [[Legacy:PlayerStart|PlayerStart]] actor that a map designer adds to their map is one such location. In [[Legacy:TeamGamePlus|TeamGamePlus]], FindPlayerStart spawns players and bots depending on their Team. It checks the Team of each playerstart and the Team of the pawn to be spawned. You can use FindPlayerStart to write custom spawn code (for example, you might want to spawn Terrorists in one location and Snipers in another).

; RestartPlayer : The RestartPlayer method is called whenever a player respawns. The basic GameInfo version calls FindPlayerStart to find a starting spot, moves the player to that spot and spawns a teleport effect. It also restores the players health, sets the player's collision, and gives the player his default inventory.

; Killed : The Killed method is very useful. It is called whenever a player kills another player. It looks at the cirumstances of the death (whether a player suicided or killed successfully) and the type of damage and prints a message. It also logs the event to the ngStats log. Finally, it calls ScoreKill.

; ScoreKill : ScoreKill awards points for a kill. DeathMatchPlus assigns a frag for a successful kill and subtracts one for a suicide. TeamGamePlus also adds a point to the TeamInfo of the Killer's team, or subtracts one in the case of a suicide.

; DiscardInventory : DiscardInventory is called whenever a player dies or is removed from the game. DiscardInventory goes through a pawn's inventory, tossing out weapons and destroying others as appropriate. You might override this function if you wanted to toss out a backpack or a trap.

; EndGame : Finally, the EndGame function is called with a reason whenever the game ends. You might want to perform special logging or clean up here.

So thats a quick look at the more important GameInfo functions. The advanced GameInfo classes like DeathMatchPlus add important new behavior for controlling bots and single player games, as well as refining the GameInfo methods into specific rules.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]] &amp;ndash; '''Section 10 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/Adding A HUD</title>
    <id>1788</id>
    <revision>
      <id>4386</id>
      <timestamp>2003-03-29T18:08:27Z</timestamp>
      <contributor>
        <ip>Cache1-nrth.server.ntli.net</ip>
      </contributor>
      <comment>Fixed the code</comment>
      <text xml:space="preserve">Notice the [[Legacy:GameInfo (UT)|GameInfo (UT)]] variable HUDType. This is used to specify the type of [[Legacy:HUD (UT)|HUD (UT)]] the player will be given if they play your game. [[Legacy:DeathMatchPlus|DeathMatchPlus]] uses a HUDType of Botpack.ChallengeHUD. The [[Legacy:ChallengeHUD|ChallengeHUD]] class is the primary HUD for Unreal Tournament. Let's take a look at adding custom HUD elements.

First, create a subclass of ChallengeHUD. Lets call it MyHUD:

&lt;uscript&gt;class MyHUD extends ChallengeHUD;&lt;/uscript&gt;

Now add MyHUD to your gametype's HUDType. In the defaultproperties set MyHUD equal to &lt;code&gt;class'MyPackage.MyHUD'&lt;/code&gt; Remember, you can't see [[Legacy:Default Properties|defaultproperties]] if you are editing UnrealScript from UnrealEd. Make sure you've exported the source classes and are editing using your own text editor like CoolEdit or MS Dev Studio.

A HUD does all of its drawing in the PostRender function. PostRender is called after the world has been drawn and all the models in the world have been drawn. The function passes you a canvas, which is an object that is used as an interface to the player's screen. Add a PostRender function to MyHUD:

&lt;uscript&gt;
function PostRender(canvas C)
{
	Super.PostRender(C);
}
&lt;/uscript&gt;

What does the Super call do? It calls the parent class version of PostRender. MyHUD's parent class is ChallengeHUD, so that version of PostRender is called. If you add your custom code after the call to Super.PostRender, you'll be able to add elements to the HUD that will draw on top of all the other HUD elements. If you don't call Super.PostRender all of the basic HUD elements like weapon readouts and so forth will not be drawn.

The [[Legacy:Canvas|Canvas]] class is defined in the Engine package. You might want to open it up and get a look at its member functions. The ChallengeHUD class is full of good examples on how to draw stuff to the HUD. As an example, lets just draw the player's name on the HUD:

&lt;uscript&gt;
function PostRender(canvas C)
{
	Super.PostRender(C);
	C.SetPos( 0, C.ClipY/2 );
	C.DrawColor.R = 255;
	C.DrawColor.G = 0;
	C.DrawColor.B = 0;
	C.Font = MyFonts.GetBigFont( C.ClipX );
	C.DrawText( PlayerOwner.PlayerReplicationInfo.PlayerName, False );
}
&lt;/uscript&gt;

This code sets the canvas drawing position to halfway down the screen and all the way to the left. Next, it sets the drawing color to be a deep red. It then asks MyFonts (the ChallengeHUD font info object) to return an appropriate big font. The font size returned depends on the screen's resolution, so we have to tell the FontInfo class what the X length of the screen is. Finally, we draw the player's name.

Your HUD can be much more complex... adding scrolling features and new types of information readouts. You'll want to look over ChallengeHUD's PostRender function and see how it gets information about the world from PlayerOwner and other related objects. Skillfully changing the HUD can add a whole new look and feel to your modification.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]] &amp;ndash; '''Section 11 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A Scoreboard]]</text>
    </revision>
    <revision>
      <id>4387</id>
      <timestamp>2002-05-14T11:52:35Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Notice the [[Legacy:GameInfo (UT)|GameInfo (UT)]] variable HUDType. This is used to specify the type of [[Legacy:HUD (UT)|HUD (UT)]] the player will be given if they play your game. [[Legacy:DeathMatchPlus|DeathMatchPlus]] uses a HUDType of Botpack.ChallengeHUD. The [[Legacy:ChallengeHUD|ChallengeHUD]] class is the primary HUD for Unreal Tournament. Let's take a look at adding custom HUD elements.

First, create a subclass of ChallengeHUD. Lets call it MyHUD:

&lt;uscript&gt;class MyHUD extends ChallengeHUD;&lt;/uscript&gt;

Now add MyHUD to your gametype's HUDType. In the defaultproperties set MyHUD equal to &lt;code&gt;class'MyPackage.MyHUD'&lt;/code&gt; Remember, you can't see [[Legacy:Default Properties|defaultproperties]] if you are editing UnrealScript from UnrealEd. Make sure you've exported the source classes and are editing using your own text editor like CoolEdit or MS Dev Studio.

A HUD does all of its drawing in the PostRender function. PostRender is called after the world has been drawn and all the models in the world have been drawn. The function passes you a canvas, which is an object that is used as an interface to the player's screen. Add a PostRender function to MyHUD:

&lt;uscript&gt;
function PostRender(canvas C)
{
	Super.PostRender(C);
}
&lt;/uscript&gt;

What does the Super call do? It calls the parent class version of PostRender. MyHUD's parent class is ChallengeHUD, so that version of PostRender is called. If you add your custom code after the call to Super.PostRender, you'll be able to add elements to the HUD that will draw on top of all the other HUD elements. If you don't call Super.PostRender all of the basic HUD elements like weapon readouts and so forth will not be drawn.

The [[Legacy:Canvas|Canvas]] class is defined in the Engine package. You might want to open it up and get a look at its member functions. The ChallengeHUD class is full of good examples on how to draw stuff to the HUD. As an example, lets just draw the player's name on the HUD:

&lt;uscript&gt;
function PostRender(canvas C)
{
	Super.PostRender(C);
	C.SetPos( 0, Canvas.ClipY/2 );
	C.DrawColor.R = 255;
	C.DrawColor.G = 0;
	C.DrawColor.B = 0;
	C.Font = MyFonts.GetBigFont( C.ClipX );
	C.DrawText( PlayerOwner.PlayerReplicationInfo.PlayerName, False );
}
&lt;/uscript&gt;

This code sets the canvas drawing position to halfway down the screen and all the way to the left. Next, it sets the drawing color to be a deep red. It then asks MyFonts (the ChallengeHUD font info object) to return an appropriate big font. The font size returned depends on the screen's resolution, so we have to tell the FontInfo class what the X length of the screen is. Finally, we draw the player's name.

Your HUD can be much more complex... adding scrolling features and new types of information readouts. You'll want to look over ChallengeHUD's PostRender function and see how it gets information about the world from PlayerOwner and other related objects. Skillfully changing the HUD can add a whole new look and feel to your modification.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]] &amp;ndash; '''Section 11 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A Scoreboard]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/Adding A Scoreboard</title>
    <id>1789</id>
    <revision>
      <id>4388</id>
      <timestamp>2002-05-14T11:53:49Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:ScoreBoard|Scoreboard]]s work just like [[Legacy:HUD (UT)|HUD (UT)]]s. If you create a new scoreboard class that extends [[Legacy:TournamentScoreBoard|TournamentScoreBoard]] and put the class in your game type's ScoreBoardType variable, players will be given a scoreboard of that kind. A scoreboard draws its information whenever the player's bShowScores variable is true. It draws through the PostRender function and is given a [[Legacy:Canvas|Canvas]] parameter. Look at [[Legacy:TournamentScoreBoard|TournamentScoreBoard]] for an example of player sorting and score listing.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Adding A HUD]] &amp;ndash; '''Section 12 of 12''' &amp;ndash; End of Document</text>
    </revision>
    <revision>
      <id>4389</id>
      <timestamp>2002-05-13T20:17:42Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <comment>Put a link to TournamentScoreboard in here... I don't know what it is.</comment>
      <text xml:space="preserve">Scoreboards work just like HUDs. If you create a new scoreboard class that extends TournamentScoreboard and put the class in your gametype's ScoreBoardType variable, players will be given a scoreboard of that kind. A scoreboard draws its information whenever the Player's bShowScores variable is true. It draws through the PostRender function and is given a Canvas parameter. Look at TournamentScoreboard for an example of player sorting and score listing.

{|

|-
| style=&quot;text-align: left&quot; |''Return to the Wiki:'' [[Legacy:HomePage|HomePage]] 
|-
| style=&quot;text-align: left&quot; |Section 12 of 12 
|}</text>
    </revision>
    <revision>
      <id>4390</id>
      <timestamp>2002-05-13T21:42:40Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>a link to wiki homepage aren't needed: it's in the header. Link to TournamentScoreBoard created.</comment>
      <text xml:space="preserve">Scoreboards work just like HUDs. If you create a new scoreboard class that extends [[Legacy:TournamentScoreBoard|TournamentScoreBoard]] and put the class in your gametype's ScoreBoardType variable, players will be given a scoreboard of that kind. A scoreboard draws its information whenever the [[Legacy:Player|Player]]'s bShowScores variable is true. It draws through the PostRender function and is given a Canvas parameter. Look at [[Legacy:TournamentScoreBoard|TournamentScoreBoard]] for an example of player sorting and score listing.

{|

|-
| style=&quot;text-align: left&quot; |Section 12 of 12 
|}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/How To Build Your Package</title>
    <id>1792</id>
    <revision>
      <id>4397</id>
      <timestamp>2003-08-08T00:06:14Z</timestamp>
      <contributor>
        <ip>Ip68-110-10-195.tc.ph.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Now that your package is set up, you are ready to build it. You don't have any code written yet, so lets make a very simple useless mod. This will serve as a good example of making a new GameType.

In the MyPackage\Classes directory, create a file called MyGame.uc. Put the following code inside of it:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;

defaultproperties
{
	GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

This creates a class called &lt;code&gt;MyGame&lt;/code&gt; that is a subclass of [[Legacy:DeathMatchPlus|DeathMatchPlus]]. All we are doing is changing the name of the game... pretty simple. Notice the inheritance in action. All the code that makes up DeathMatchPlus is now a part of your game type.

Save the file and change directory to System. Type &lt;code&gt;ucc make&lt;/code&gt; and watch the code burn. Pretty soon, your package will be compiled and a new MyPackage.u will be sitting in the System directory.

In order to make our new gametype show up in the menus, we have to give it a metaclass definition. Create a file in the System directory called MyPackage.int. INT files primarily contain [[Legacy:Localization|localization]] information for foreign versions of the game, but they also contain extra information about the classes inside a package.

Add the following lines to your .int file:

  [Public]
  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)

Save it and exit. When UT's menus search for games to list in the Game selection window, they search all the .int files in the System directory for classes that have a MetaClass of &lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;. Now your game will show up on that list. Start Unreal Tournament and go to Start Practice Session. Find your game on the list. If you start it, &quot;My Game&quot; will show up as the game's name in the scoreboard. Cool!

So that's how you build a basic project. Obviously writing a mod is a lot more complicated than that. Now we'll get down and ''really'' dirty by looking at the specifics of different types of mod.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]] &amp;ndash; '''Section 6 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]]</text>
    </revision>
    <revision>
      <id>4398</id>
      <timestamp>2003-05-20T02:45:17Z</timestamp>
      <contributor>
        <ip>Alien8</ip>
      </contributor>
      <minor/>
      <comment>*Changes single instance of 'expands' to 'extends'</comment>
      <text xml:space="preserve">Now that your package is set up, you are ready to build it. You don't have any code written yet, so lets make a very simple useless mod. This will serve as a good example of making a new GameType.

In the MyPackage\Classes directory, create a file called MyGame.uc. Put the following code inside of it:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;

defaultproperties
{
	GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

This creates a class called &lt;code&gt;MyGame&lt;/code&gt; that is a subclass of [[Legacy:DeathMatchPlus|DeathMatchPlus]]. All we are doing is changing the name of the game... pretty simple. Notice the inheritance in action. All the code that makes up DeathMatchPlus is now a part of your game type.

Save the file and change directory to System. Type &lt;code&gt;ucc make&lt;/code&gt; and watch the code burn. Pretty soon, your package will be compiled and a new MyPackage.u will be sitting in the System directory.

In order to make our new gametype show up in the menus, we have to give it a metaclass definition. Create a file in the System directory called MyPackage.int. INT files primarily contain [[Legacy:Localization|localization]] information for foreign versions of the game, but they also contain extra information about the classes inside a package.

Add the following lines to your .int file:

  [Public]
  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)

Save it and exit. When UT's menus search for games to list in the Game selection window, they search all the .int files in the System directory for classes that have a MetaClass of &lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;. Now your game will show up on that list. Start Unreal Tournament and go to Start Practice Session. Find your game on the list. If you start it, &quot;My Game&quot; will show up as the game's name in the scoreboard. Cool!

So that's how you build a basic project. Obviously writing a mod is a lot more complicated than that. Now we'll get down and ''really'' dirty by looking at the specifics of different types of mod.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]] &amp;ndash; '''Section 6 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]]</text>
    </revision>
    <revision>
      <id>4399</id>
      <timestamp>2003-08-08T00:05:47Z</timestamp>
      <contributor>
        <ip>Ip68-110-10-195.tc.ph.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">//

Now that your package is set up, you are ready to build it. You don't have any code written yet, so lets make a very simple useless mod. This will serve as a good example of making a new GameType.

In the MyPackage\Classes directory, create a file called MyGame.uc. Put the following code inside of it:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;

defaultproperties
{
	GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

This creates a class called &lt;code&gt;MyGame&lt;/code&gt; that is a subclass of [[Legacy:DeathMatchPlus|DeathMatchPlus]]. All we are doing is changing the name of the game... pretty simple. Notice the inheritance in action. All the code that makes up DeathMatchPlus is now a part of your game type.

Save the file and change directory to System. Type &lt;code&gt;ucc make&lt;/code&gt; and watch the code burn. Pretty soon, your package will be compiled and a new MyPackage.u will be sitting in the System directory.

In order to make our new gametype show up in the menus, we have to give it a metaclass definition. Create a file in the System directory called MyPackage.int. INT files primarily contain [[Legacy:Localization|localization]] information for foreign versions of the game, but they also contain extra information about the classes inside a package.

Add the following lines to your .int file:

  [Public]
  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)

Save it and exit. When UT's menus search for games to list in the Game selection window, they search all the .int files in the System directory for classes that have a MetaClass of &lt;code&gt;Botpack.TournamentGameInfo&lt;/code&gt;. Now your game will show up on that list. Start Unreal Tournament and go to Start Practice Session. Find your game on the list. If you start it, &quot;My Game&quot; will show up as the game's name in the scoreboard. Cool!

So that's how you build a basic project. Obviously writing a mod is a lot more complicated than that. Now we'll get down and ''really'' dirty by looking at the specifics of different types of mod.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Setting Up Your Project]] &amp;ndash; '''Section 6 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/Introduction To GameTypes</title>
    <id>1793</id>
    <revision>
      <id>4400</id>
      <timestamp>2007-08-07T18:58:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">Where to start, where to start? This is the meat. The big bone. Now we start getting into the hard stuff. [[Legacy:Mutator|Mutator]]s can do some cool stuff. They are pretty easy to understand and they can do a lot of things by interacting with the game. They can be mixed and matched to get even cooler effects... but they are ''not'' very powerful. If you want to make a new type of game (say a [[Legacy:Jailbreak|Jailbreak]] style mod) you can't do it with mutators. You need to have complete control over the game rules. That's where the [[Legacy:GameInfo (UT)|GameInfo (UT)]] series of classes come into play.

GameInfo is a class located in Engine. It is created by the game engine and is the core of the game play rules. Unreal Tournament makes use of a series of GameInfo subclasses located in the Botpack package. [[Legacy:TournamentGameInfo|TournamentGameInfo]] contains code that is universal to all of Unreal Tournament's game types. [[Legacy:DeathMatchPlus|DeathMatchPlus]] contains the code for running a normal death match. [[Legacy:TeamGamePlus|TeamGamePlus]] contains code for team deathmatch as well as general team management code. [[Legacy:DOM|Domination]] and [[Legacy:AS|Assault]], which are subclasses of TeamGamePlus, implement those particular game types.

The first step in writing your new game type is to determine which class to subclass. If you are writing a team game, you'll want to subclass TeamGamePlus. If you are writing a game without teams, use DeathMatchPlus. If you are writing a game that departs significantly from any previously styled game type, use TournamentGameInfo. Subclassing is very beneficial... you immediately inherit all of the code in your parent classes.

Lets look at a very simple GameType mod:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;
defaultproperties
{
   GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

The above code, when saved in a file called &lt;code&gt;MyGame.uc&lt;/code&gt; will build a new game type. The only difference here is that we've changed the name to &quot;My Game.&quot; This new name will be reflected in many places: the ''Practice Session'' selection window, the [[Legacy:ScoreBoard|scoreboard]] header, and so forth. If you play this game, it'll play just like DeathMatchPlus... we haven't actually added any new behavior.

Like Mutators, we need to do a little .int file hacking in order to get the new game type to show up in the menus. Edit your package's .int file and add the following lines to the &lt;code&gt;[Public]&lt;/code&gt; section:

  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)
  Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

The practice session and start server menus look in all .int files for declared objects that have a MetaClass of Botpack.TournamentGameInfo. If you add these line to your package's .int file, you'll get an entry called &quot;My Game&quot; in the list of games. The name is taken from the GameName variable of your GameInfo class. The &lt;code&gt;Preferences&lt;/code&gt; line gives your game a configuration entry in the ''Advanced Options'' menu. You probably don't need to worry about that right now.

So now we have a simple game to start messing with. What do we do? Well lets look at a few of the methods available in GameInfo. Remember, you'll need to do a lot of research on your own. You'll only become a strong UnrealScript hacker if you spend time to acquaint yourself with the code at your fingertips.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]] &amp;ndash; '''Section 9 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]</text>
    </revision>
    <revision>
      <id>4401</id>
      <timestamp>2004-11-08T22:53:36Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Moved out some stuff - we can't modify this page because our permissions to host it here don't allow us to. Moved stuff to Inbox.</comment>
      <text xml:space="preserve">Where to start, where to start? This is the meat. The big bone. Now we start getting into the hard stuff. [[Legacy:Mutator|Mutator]]s can do some cool stuff. They are pretty easy to understand and they can do a lot of things by interacting with the game. They can be mixed and matched to get even cooler effects... but they are ''not'' very powerful. If you want to make a new type of game (say a [[Legacy:Jailbreak|Jailbreak]] style mod) you can't do it with mutators. You need to have complete control over the game rules. That's where the [[Legacy:GameInfo (UT)|GameInfo (UT)]] series of classes come into play.

GameInfo is a class located in Engine. It is created by the game engine and is the core of the game play rules. Unreal Tournament makes use of a series of GameInfo subclasses located in the Botpack package. [[Legacy:TournamentGameInfo|TournamentGameInfo]] contains code that is universal to all of Unreal Tournament's game types. [[Legacy:DeathMatchPlus|DeathMatchPlus]] contains the code for running a normal death match. [[Legacy:TeamGamePlus|TeamGamePlus]] contains code for team deathmatch as well as general team management code. [[Legacy:DOM|Domination]] and [[Legacy:AS|Assault]], which are subclasses of TeamGamePlus, implement those particular game types.

The first step in writing your new game type is to determine which class to subclass. If you are writing a team game, you'll want to subclass TeamGamePlus. If you are writing a game without teams, use DeathMatchPlus. If you are writing a game that departs significantly from any previously styled game type, use TournamentGameInfo. Subclassing is very beneficial... you immediately inherit all of the code in your parent classes.

Lets look at a very simple GameType mod:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;
defaultproperties
{
   GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

The above code, when saved in a file called &lt;code&gt;MyGame.uc&lt;/code&gt; will build a new game type. The only difference here is that we've changed the name to &quot;My Game.&quot; This new name will be reflected in many places: the ''Practice Session'' selection window, the [[Legacy:ScoreBoard|scoreboard]] header, and so forth. If you play this game, it'll play just like DeathMatchPlus... we haven't actually added any new behavior.

Like Mutators, we need to do a little .int file hacking in order to get the new game type to show up in the menus. Edit your package's .int file and add the following lines to the &lt;code&gt;[Public]&lt;/code&gt; section:

  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)
  Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

The practice session and start server menus look in all .int files for declared objects that have a MetaClass of Botpack.TournamentGameInfo. If you add these line to your package's .int file, you'll get an entry called &quot;My Game&quot; in the list of games. The name is taken from the GameName variable of your GameInfo class. The &lt;code&gt;Preferences&lt;/code&gt; line gives your game a configuration entry in the ''Advanced Options'' menu. You probably don't need to worry about that right now.

So now we have a simple game to start messing with. What do we do? Well lets look at a few of the methods available in GameInfo. Remember, you'll need to do a lot of research on your own. You'll only become a strong UnrealScript hacker if you spend time to acquaint yourself with the code at your fingertips.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]] &amp;ndash; '''Section 9 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]</text>
    </revision>
    <revision>
      <id>4402</id>
      <timestamp>2007-08-07T14:57:19Z</timestamp>
      <contributor>
        <ip>Echo474.server4you.de</ip>
      </contributor>
      <comment>*Mod Authoring/Introduction To GameTypes</comment>
      <text xml:space="preserve">Where to start, where to start? This is the meat. The big bone. Now we start getting into the hard stuff. [[Legacy:Mutator|Mutator]]s can do some cool stuff. They are pretty easy to understand and they can do a lot of things by interacting with the game. They can be mixed and matched to get even cooler effects... but they are ''not'' very powerful. If you want to make a new type of game (say a [[Legacy:Jailbreak|Jailbreak]] style mod) you can't do it with mutators. You need to have complete control over the game rules. That's where the [[Legacy:GameInfo (UT)|GameInfo (UT)]] series of classes come into play.

GameInfo is a class located in Engine. It is created by the game engine and is the core of the game play rules. Unreal Tournament makes use of a series of GameInfo subclasses located in the Botpack package. [[Legacy:TournamentGameInfo|TournamentGameInfo]] contains code that is universal to all of Unreal Tournament's game types. [[Legacy:DeathMatchPlus|DeathMatchPlus]] contains the code for running a normal death match. [[Legacy:TeamGamePlus|TeamGamePlus]] contains code for team deathmatch as well as general team management code. [[Legacy:DOM|Domination]] and [[Legacy:AS|Assault]], which are subclasses of TeamGamePlus, implement those particular game types.

The first step in writing your new game type is to determine which class to subclass. If you are writing a team game, you'll want to subclass TeamGamePlus. If you are writing a game without teams, use DeathMatchPlus. If you are writing a game that departs significantly from any previously styled game type, use TournamentGameInfo. Subclassing is very beneficial... you immediately inherit all of the code in your parent classes.

Lets look at [http://www.bestessaytips.com/ best essay tips]
 a very simple GameType mod:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;
defaultproperties
{
   GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

The above code, when saved in a file called &lt;code&gt;MyGame.uc&lt;/code&gt; will build a new game type. The only difference here is that we've changed the name to &quot;My Game.&quot; This new name will be reflected in many places: the ''Practice Session'' selection window, the [[Legacy:ScoreBoard|scoreboard]] header, and so forth. If you play this game, it'll play just like DeathMatchPlus... we haven't actually added any new behavior.

Like Mutators, we need to do a little .int file hacking in order to get the new game type to show up in the menus. Edit your package's .int file and add the following lines to the &lt;code&gt;[Public]&lt;/code&gt; section:

  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)
  Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

The practice session and start server menus look in all .int files for declared objects that have a MetaClass of Botpack.TournamentGameInfo. If you add these line to your package's .int file, you'll get an entry called &quot;My Game&quot; in the list of games. The name is taken from the GameName variable of your GameInfo class. The &lt;code&gt;Preferences&lt;/code&gt; line gives your game a configuration entry in the ''Advanced Options'' menu. You probably don't need to worry about that right now.

So now we have a simple game to start messing with. What do we do? Well lets look at a few of the methods available in GameInfo. Remember, you'll need to do a lot of research on your own. You'll only become a strong UnrealScript hacker if you spend time to acquaint yourself with the code at your fingertips.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]] &amp;ndash; '''Section 9 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]</text>
    </revision>
    <revision>
      <id>43321</id>
      <timestamp>2010-05-21T17:04:03Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve">Where to start, where to start? This is the meat. The big bone. Now we start getting into the hard stuff. [[Legacy:Mutator|Mutator]]s can do some cool stuff. They are pretty easy to understand and they can do a lot of things by interacting with the game. They can be mixed and matched to get even cooler effects... but they are ''not'' very powerful. If you want to make a new type of game (say a [[Legacy:Jailbreak|Jailbreak]] style mod) you can't do it with mutators. You need to have complete control over the game rules. That's where the [[Legacy:GameInfo (UT)|GameInfo (UT)]] series of classes come into play.

GameInfo is a class located in Engine. It is created by the game [http://www.bestessaytips.com best essay tips] engine and is the core of the game play rules. Unreal Tournament makes use of a series of GameInfo subclasses located in the Botpack package. [[Legacy:TournamentGameInfo|TournamentGameInfo]] contains code that is universal to all of Unreal Tournament's game types. [[Legacy:DeathMatchPlus|DeathMatchPlus]] contains the code for running a normal death match. [[Legacy:TeamGamePlus|TeamGamePlus]] contains code for team deathmatch as well as general team management code. [[Legacy:DOM|Domination]] and [[Legacy:AS|Assault]], which are subclasses of TeamGamePlus, implement those particular game types.

The first step in writing your new game type is to determine which class to subclass. If you are writing a team game, you'll want to subclass TeamGamePlus. If you are writing a game without teams, use DeathMatchPlus. If you are writing a game that departs significantly from any previously styled game type, use TournamentGameInfo. Subclassing is very beneficial... you immediately inherit all of the code in your parent classes.

Lets look at a very simple GameType mod:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;
defaultproperties
{
   GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

The above code, when saved in a file called &lt;code&gt;MyGame.uc&lt;/code&gt; will build a new game type. The only difference here is that we've changed the name to &quot;My Game.&quot; This new name will be reflected in many places: the ''Practice Session'' selection window, the [[Legacy:ScoreBoard|scoreboard]] header, and so forth. If you play this game, it'll play just like DeathMatchPlus... we haven't actually added any new behavior.

Like Mutators, we need to do a little .int file hacking in order to get the new game type to show up in the menus. Edit your package's .int file and add the following lines to the &lt;code&gt;[Public]&lt;/code&gt; section:

  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)
  Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

The practice session and start server menus look in all .int files for declared objects that have a MetaClass of Botpack.TournamentGameInfo. If you add these line to your package's .int file, you'll get an entry called &quot;My Game&quot; in the list of games. The name is taken from the GameName variable of your GameInfo class. The &lt;code&gt;Preferences&lt;/code&gt; line gives your game a configuration entry in the ''Advanced Options'' menu. You probably don't need to worry about that right now.

So now we have a simple game to start messing with. What do we do? Well lets look at a few of the methods available in GameInfo. Remember, you'll need to do a lot of research on your own. You'll only become a strong UnrealScript hacker if you spend time to acquaint yourself with the code at your fingertips.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]] &amp;ndash; '''Section 9 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]</text>
    </revision>
    <revision>
      <id>43335</id>
      <timestamp>2010-05-22T04:23:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">Where to start, where to start? This is the meat. The big bone. Now we start getting into the hard stuff. [[Legacy:Mutator|Mutator]]s can do some cool stuff. They are pretty easy to understand and they can do a lot of things by interacting with the game. They can be mixed and matched to get even cooler effects... but they are ''not'' very powerful. If you want to make a new type of game (say a [[Legacy:Jailbreak|Jailbreak]] style mod) you can't do it with mutators. You need to have complete control over the game rules. That's where the [[Legacy:GameInfo (UT)|GameInfo (UT)]] series of classes come into play.

GameInfo is a class located in Engine. It is created by the game engine and is the core of the game play rules. Unreal Tournament makes use of a series of GameInfo subclasses located in the Botpack package. [[Legacy:TournamentGameInfo|TournamentGameInfo]] contains code that is universal to all of Unreal Tournament's game types. [[Legacy:DeathMatchPlus|DeathMatchPlus]] contains the code for running a normal death match. [[Legacy:TeamGamePlus|TeamGamePlus]] contains code for team deathmatch as well as general team management code. [[Legacy:DOM|Domination]] and [[Legacy:AS|Assault]], which are subclasses of TeamGamePlus, implement those particular game types.

The first step in writing your new game type is to determine which class to subclass. If you are writing a team game, you'll want to subclass TeamGamePlus. If you are writing a game without teams, use DeathMatchPlus. If you are writing a game that departs significantly from any previously styled game type, use TournamentGameInfo. Subclassing is very beneficial... you immediately inherit all of the code in your parent classes.

Lets look at a very simple GameType mod:

&lt;uscript&gt;
class MyGame extends DeathMatchPlus;
defaultproperties
{
   GameName=&quot;My Game&quot;
}
&lt;/uscript&gt;

The above code, when saved in a file called &lt;code&gt;MyGame.uc&lt;/code&gt; will build a new game type. The only difference here is that we've changed the name to &quot;My Game.&quot; This new name will be reflected in many places: the ''Practice Session'' selection window, the [[Legacy:ScoreBoard|scoreboard]] header, and so forth. If you play this game, it'll play just like DeathMatchPlus... we haven't actually added any new behavior.

Like Mutators, we need to do a little .int file hacking in order to get the new game type to show up in the menus. Edit your package's .int file and add the following lines to the &lt;code&gt;[Public]&lt;/code&gt; section:

  Object=(Name=MyPackage.MyGame,Class=Class,MetaClass=Botpack.TournamentGameInfo)
  Preferences=(Caption=&quot;My Game&quot;,Parent=&quot;Game Types&quot;,Class=MyPackage.MyGame,Immediate=True)

The practice session and start server menus look in all .int files for declared objects that have a MetaClass of Botpack.TournamentGameInfo. If you add these line to your package's .int file, you'll get an entry called &quot;My Game&quot; in the list of games. The name is taken from the GameName variable of your GameInfo class. The &lt;code&gt;Preferences&lt;/code&gt; line gives your game a configuration entry in the ''Advanced Options'' menu. You probably don't need to worry about that right now.

So now we have a simple game to start messing with. What do we do? Well lets look at a few of the methods available in GameInfo. Remember, you'll need to do a lot of research on your own. You'll only become a strong UnrealScript hacker if you spend time to acquaint yourself with the code at your fingertips.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]] &amp;ndash; '''Section 9 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A First Look At GameInfo]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/Making A Mutator</title>
    <id>1794</id>
    <revision>
      <id>4403</id>
      <timestamp>2003-05-20T02:46:02Z</timestamp>
      <contributor>
        <ip>Alien8</ip>
      </contributor>
      <minor/>
      <comment>*Oh, the extending!</comment>
      <text xml:space="preserve">[[Legacy:Mutator|Mutator]]s are a great place to cut your teeth on UnrealScript because you are exposed to a limited, but powerful subset of the engine. As I said above, Mutators should only modify the game code in a relatively slight way. This increases the chances your mutator will work well when mixed with other mutators. (For example, you can play ''FatBoy'', ''InstaGib'', ''No Powerups'' deathmatch. A mix of 3 mutators).

All mutators descend from the Mutator base class either directly or indirectly. Let's make a Vampire mutator and see how it all works. Create a new file in your package classes directory called Vampire.uc. Drop the following code in there:

&lt;uscript&gt;
class Vampire extends Mutator;

var bool Initialized;

function PostBeginPlay()
{
	if (Initialized)
		return;
	Initialized = True;

	Level.Game.RegisterDamageMutator( Self );
}

function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation,
	out Vector Momentum, name DamageType)
{
	if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('PlayerPawn'))
	{
		InstigatedBy.Health += ActualDamage;
		if (InstigatedBy.Health &gt; 199)
			InstigatedBy.Health = 199;
	}
	if ( NextDamageMutator != None )
		NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType );
}
&lt;/uscript&gt;

The first line declares the class contained in this file. UnrealScript is like Java in that each file contains a separate class definition. We are saying that our class, Vampire, is a Mutator. It &quot;inherits&quot; all the properties of Mutator.

Next, we declare a class member. In UnrealScript, all class member variables must be declared before any functions (also called methods) are declared. The var keyword tells the compiler what we are doing. Here we have a boolean (true/false) value called Intialized.

Next we have a function called &lt;code&gt;PostBeginPlay&lt;/code&gt;. To someone who isn't experienced with object oriented programming, we have a bit of a puzzle. This object just declares functions, it doesn't seem to have any entry point! The &quot;entry point&quot; is inherited. Vampire is a Mutator, so it does everything Mutators can. Mutator is an Info, Info is an Actor, and an Actor is managed by the engine. In our case, we are overriding the function PostBeginPlay. PreBeginPlay, BeginPlay, and PostBeginPlay are called on every Actor in the level when the game starts. They are used to initialize the world.

Our PostBeginPlay function starts by setting initialized to true. Notice it'll return if initialized is already true. What's the point of that? Well, the problem is that the BeginPlay suite of functions get called twice on Mutators. Unfortunately, this is somewhat unavoidable. BeginPlay and its friends are called on Actors when they are spawned and when the game starts. Mutators, unlike other actors, are spawned before the game starts... so you get two calls. The Initialized check is to prevent the rest of PostBeginPlay from being executed twice.

The second part of PostBeginPlay is called RegisterDamageMutator, a method located in the [[Legacy:GameInfo (UT)|GameInfo (UT)]] class. Here we are accessing the &lt;code&gt;Level&lt;/code&gt; property that all [[Legacy:Actor|Actor]]s inherit. Then we access the &lt;code&gt;Game&lt;/code&gt; property of the [[Legacy:LevelInfo|LevelInfo]] class that &lt;code&gt;Level&lt;/code&gt; points to. Finally, we call the function from that reference, passing our &lt;code&gt;Self&lt;/code&gt; as the parameter.

&lt;code&gt;RegisterDamageMutator&lt;/code&gt; is a special method that tells the GameInfo to call MutatorTakeDamage on this mutator whenever a pawn takes damage. Because pawns take a lot of damage during the course of a normal game, we don't want to call this function on every mutator, that would be slow. RegisterDamageMutator allows us to limit the calls to only a subset of mutators. (By the way, in UT [[Legacy:Pawn (UT)|Pawn (UT)]]s consist primarily of [[Legacy:Bot (UT)|Bot (UT)]]s and [[Legacy:PlayerPawn|PlayerPawn]]s).

Next we have our implementation of &lt;code&gt;MutatorTakeDamage&lt;/code&gt;. This is the heart of our Mutator. We are making a Vampire mutator. The idea is simple: if a Pawn A does damage to another Pawn B, give the Pawn A health equal to the amount of damage. Players and bots will effectively suck life off of other players or bots. 

As I mentioned above, RegisterDamageMutator is called on our mutator whenever a player takes damage from another one. The pawns in question are passed to us in the variables.

We start by making sure we are only dealing with bots and playerpawns. There are pawns that are neither bots nor players and we don't want to deal with them. InstigatedBy refers to the player who dealt the damage. We do our core logic by adding to that pawn's health life equal to the damage dealt. RegisterDamageMutator always passes in an amount of damage ''after'' armor, so this is raw final damage. Finally, we don't want a player gaining so much life he becomes unkillable, so we limit the total life gain to 199 points.

To finish the function off, we call MutatorTakeDamage on the next damage mutator in the list. It is '''critical''' that you pass along method calls like this. If you fail to, damage mutators loaded after your own won't work right. There are other functions that need to be passed along, which we'll look at below.

So now you can save this file and rebuild your package. We aren't done yet, though, because the mutator won't show up in the menus without some more work. Open your package's .int file and add the following line to the &lt;code&gt;[Public]&lt;/code&gt; section (in a single line):

  Object=(Name=SemperFi.Vampire,Class=Class,MetaClass=Engine.Mutator,
    Description=&quot;Vampire,You gain life equal to the amount of damage you do to an enemy.&quot;)

When the game looks for mutators to list in the ''Add Mutators'' window, it searches all .int files for objects with a declared MetaClass of Engine.Mutator. We've also added a Description for the help bar. Now we are ready to run Unreal Tournament and load the mutator. Play around with it for a bit and you'll probably get ideas for your own mutators or ways of expanding Vampire.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]] &amp;ndash; '''Section 7 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]]</text>
    </revision>
    <revision>
      <id>4404</id>
      <timestamp>2003-02-22T03:22:39Z</timestamp>
      <contributor>
        <ip>Ool-43545d82.dyn.optonline.net</ip>
      </contributor>
      <comment>Code for player ID</comment>
      <text xml:space="preserve">[[Legacy:Mutator|Mutator]]s are a great place to cut your teeth on UnrealScript because you are exposed to a limited, but powerful subset of the engine. As I said above, Mutators should only modify the game code in a relatively slight way. This increases the chances your mutator will work well when mixed with other mutators. (For example, you can play ''FatBoy'', ''InstaGib'', ''No Powerups'' deathmatch. A mix of 3 mutators).

All mutators descend from the Mutator base class either directly or indirectly. Let's make a Vampire mutator and see how it all works. Create a new file in your package classes directory called Vampire.uc. Drop the following code in there:

&lt;uscript&gt;
class Vampire expands Mutator;

var bool Initialized;

function PostBeginPlay()
{
	if (Initialized)
		return;
	Initialized = True;

	Level.Game.RegisterDamageMutator( Self );
}

function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation,
	out Vector Momentum, name DamageType)
{
	if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('PlayerPawn'))
	{
		InstigatedBy.Health += ActualDamage;
		if (InstigatedBy.Health &gt; 199)
			InstigatedBy.Health = 199;
	}
	if ( NextDamageMutator != None )
		NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType );
}
&lt;/uscript&gt;

The first line declares the class contained in this file. UnrealScript is like Java in that each file contains a separate class definition. We are saying that our class, Vampire, is a Mutator. It &quot;inherits&quot; all the properties of Mutator.

Next, we declare a class member. In UnrealScript, all class member variables must be declared before any functions (also called methods) are declared. The var keyword tells the compiler what we are doing. Here we have a boolean (true/false) value called Intialized.

Next we have a function called &lt;code&gt;PostBeginPlay&lt;/code&gt;. To someone who isn't experienced with object oriented programming, we have a bit of a puzzle. This object just declares functions, it doesn't seem to have any entry point! The &quot;entry point&quot; is inherited. Vampire is a Mutator, so it does everything Mutators can. Mutator is an Info, Info is an Actor, and an Actor is managed by the engine. In our case, we are overriding the function PostBeginPlay. PreBeginPlay, BeginPlay, and PostBeginPlay are called on every Actor in the level when the game starts. They are used to initialize the world.

Our PostBeginPlay function starts by setting initialized to true. Notice it'll return if initialized is already true. What's the point of that? Well, the problem is that the BeginPlay suite of functions get called twice on Mutators. Unfortunately, this is somewhat unavoidable. BeginPlay and its friends are called on Actors when they are spawned and when the game starts. Mutators, unlike other actors, are spawned before the game starts... so you get two calls. The Initialized check is to prevent the rest of PostBeginPlay from being executed twice.

The second part of PostBeginPlay is called RegisterDamageMutator, a method located in the [[Legacy:GameInfo (UT)|GameInfo (UT)]] class. Here we are accessing the &lt;code&gt;Level&lt;/code&gt; property that all [[Legacy:Actor|Actor]]s inherit. Then we access the &lt;code&gt;Game&lt;/code&gt; property of the [[Legacy:LevelInfo|LevelInfo]] class that &lt;code&gt;Level&lt;/code&gt; points to. Finally, we call the function from that reference, passing our &lt;code&gt;Self&lt;/code&gt; as the parameter.

&lt;code&gt;RegisterDamageMutator&lt;/code&gt; is a special method that tells the GameInfo to call MutatorTakeDamage on this mutator whenever a pawn takes damage. Because pawns take a lot of damage during the course of a normal game, we don't want to call this function on every mutator, that would be slow. RegisterDamageMutator allows us to limit the calls to only a subset of mutators. (By the way, in UT [[Legacy:Pawn (UT)|Pawn (UT)]]s consist primarily of [[Legacy:Bot (UT)|Bot (UT)]]s and [[Legacy:PlayerPawn|PlayerPawn]]s).

Next we have our implementation of &lt;code&gt;MutatorTakeDamage&lt;/code&gt;. This is the heart of our Mutator. We are making a Vampire mutator. The idea is simple: if a Pawn A does damage to another Pawn B, give the Pawn A health equal to the amount of damage. Players and bots will effectively suck life off of other players or bots. 

As I mentioned above, RegisterDamageMutator is called on our mutator whenever a player takes damage from another one. The pawns in question are passed to us in the variables.

We start by making sure we are only dealing with bots and playerpawns. There are pawns that are neither bots nor players and we don't want to deal with them. InstigatedBy refers to the player who dealt the damage. We do our core logic by adding to that pawn's health life equal to the damage dealt. RegisterDamageMutator always passes in an amount of damage ''after'' armor, so this is raw final damage. Finally, we don't want a player gaining so much life he becomes unkillable, so we limit the total life gain to 199 points.

To finish the function off, we call RegisterDamageMutator on the next damage mutator in the list. It is '''critical''' that you pass along method calls like this. If you fail to, damage mutators loaded after your own won't work right. There are other functions that need to be passed along, which we'll look at below.

So now you can save this file and rebuild your package. We aren't done yet, though, because the mutator won't show up in the menus without some more work. Open your package's .int file and add the following line to the &lt;code&gt;[Public]&lt;/code&gt; section (in a single line):

  Object=(Name=SemperFi.Vampire,Class=Class,MetaClass=Engine.Mutator,
    Description=&quot;Vampire,You gain life equal to the amount of damage you do to an enemy.&quot;)

When the game looks for mutators to list in the ''Add Mutators'' window, it searches all .int files for objects with a declared MetaClass of Engine.Mutator. We've also added a Description for the help bar. Now we are ready to run Unreal Tournament and load the mutator. Play around with it for a bit and you'll probably get ideas for your own mutators or ways of expanding Vampire.

    If you want to use settings for individual players, use this code:
    Credit for this one goes to EpicGames.

//Variables Needed

var string				PlayerName;		// Player name, or blank if none.

var string				OldName;		// Temporary value.

var int					PlayerID;		// Unique id number.

var string				TeamName;		// Team name, or blank if none.

var byte				Team;			// Player Team, 255 = None for player.

var int					TeamID;			// Player position in team.

var float				Score;			// Player's current score.

var float				Deaths;			// Number of player's deaths.

var class&lt;VoicePack&gt;	                VoiceType;

var Decoration		                HasFlag;

var int					Ping;

var byte				PacketLoss;

var bool				bIsFemale;

var bool				bIsABot;

var bool				bFeigningDeath;

var bool				bIsSpectator;

var bool				bWaitingPlayer;

var bool				bAdmin;

var Texture				TalkTexture;

var ZoneInfo	                        PlayerZone;

var LocationID	                        PlayerLocation;

replication

{

	// Things the server should send to the client.

	reliable if ( Role == ROLE_Authority )

		PlayerName, OldName, PlayerID, TeamName, Team, TeamID, Score, Deaths, VoiceType,

		HasFlag, Ping, PacketLoss, bIsFemale, bIsABot, bFeigningDeath, bIsSpectator, bWaitingPlayer,

		bAdmin, TalkTexture, PlayerZone, PlayerLocation;

}

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]] &amp;ndash; '''Section 7 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]]</text>
    </revision>
    <revision>
      <id>4405</id>
      <timestamp>2003-04-22T16:27:11Z</timestamp>
      <contributor>
        <ip>Tom</ip>
      </contributor>
      <minor/>
      <comment>*  Fix the name of the function/method called at the end of a damage mutator</comment>
      <text xml:space="preserve">[[Legacy:Mutator|Mutator]]s are a great place to cut your teeth on UnrealScript because you are exposed to a limited, but powerful subset of the engine. As I said above, Mutators should only modify the game code in a relatively slight way. This increases the chances your mutator will work well when mixed with other mutators. (For example, you can play ''FatBoy'', ''InstaGib'', ''No Powerups'' deathmatch. A mix of 3 mutators).

All mutators descend from the Mutator base class either directly or indirectly. Let's make a Vampire mutator and see how it all works. Create a new file in your package classes directory called Vampire.uc. Drop the following code in there:

&lt;uscript&gt;
class Vampire expands Mutator;

var bool Initialized;

function PostBeginPlay()
{
	if (Initialized)
		return;
	Initialized = True;

	Level.Game.RegisterDamageMutator( Self );
}

function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation,
	out Vector Momentum, name DamageType)
{
	if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('PlayerPawn'))
	{
		InstigatedBy.Health += ActualDamage;
		if (InstigatedBy.Health &gt; 199)
			InstigatedBy.Health = 199;
	}
	if ( NextDamageMutator != None )
		NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType );
}
&lt;/uscript&gt;

The first line declares the class contained in this file. UnrealScript is like Java in that each file contains a separate class definition. We are saying that our class, Vampire, is a Mutator. It &quot;inherits&quot; all the properties of Mutator.

Next, we declare a class member. In UnrealScript, all class member variables must be declared before any functions (also called methods) are declared. The var keyword tells the compiler what we are doing. Here we have a boolean (true/false) value called Intialized.

Next we have a function called &lt;code&gt;PostBeginPlay&lt;/code&gt;. To someone who isn't experienced with object oriented programming, we have a bit of a puzzle. This object just declares functions, it doesn't seem to have any entry point! The &quot;entry point&quot; is inherited. Vampire is a Mutator, so it does everything Mutators can. Mutator is an Info, Info is an Actor, and an Actor is managed by the engine. In our case, we are overriding the function PostBeginPlay. PreBeginPlay, BeginPlay, and PostBeginPlay are called on every Actor in the level when the game starts. They are used to initialize the world.

Our PostBeginPlay function starts by setting initialized to true. Notice it'll return if initialized is already true. What's the point of that? Well, the problem is that the BeginPlay suite of functions get called twice on Mutators. Unfortunately, this is somewhat unavoidable. BeginPlay and its friends are called on Actors when they are spawned and when the game starts. Mutators, unlike other actors, are spawned before the game starts... so you get two calls. The Initialized check is to prevent the rest of PostBeginPlay from being executed twice.

The second part of PostBeginPlay is called RegisterDamageMutator, a method located in the [[Legacy:GameInfo (UT)|GameInfo (UT)]] class. Here we are accessing the &lt;code&gt;Level&lt;/code&gt; property that all [[Legacy:Actor|Actor]]s inherit. Then we access the &lt;code&gt;Game&lt;/code&gt; property of the [[Legacy:LevelInfo|LevelInfo]] class that &lt;code&gt;Level&lt;/code&gt; points to. Finally, we call the function from that reference, passing our &lt;code&gt;Self&lt;/code&gt; as the parameter.

&lt;code&gt;RegisterDamageMutator&lt;/code&gt; is a special method that tells the GameInfo to call MutatorTakeDamage on this mutator whenever a pawn takes damage. Because pawns take a lot of damage during the course of a normal game, we don't want to call this function on every mutator, that would be slow. RegisterDamageMutator allows us to limit the calls to only a subset of mutators. (By the way, in UT [[Legacy:Pawn (UT)|Pawn (UT)]]s consist primarily of [[Legacy:Bot (UT)|Bot (UT)]]s and [[Legacy:PlayerPawn|PlayerPawn]]s).

Next we have our implementation of &lt;code&gt;MutatorTakeDamage&lt;/code&gt;. This is the heart of our Mutator. We are making a Vampire mutator. The idea is simple: if a Pawn A does damage to another Pawn B, give the Pawn A health equal to the amount of damage. Players and bots will effectively suck life off of other players or bots. 

As I mentioned above, RegisterDamageMutator is called on our mutator whenever a player takes damage from another one. The pawns in question are passed to us in the variables.

We start by making sure we are only dealing with bots and playerpawns. There are pawns that are neither bots nor players and we don't want to deal with them. InstigatedBy refers to the player who dealt the damage. We do our core logic by adding to that pawn's health life equal to the damage dealt. RegisterDamageMutator always passes in an amount of damage ''after'' armor, so this is raw final damage. Finally, we don't want a player gaining so much life he becomes unkillable, so we limit the total life gain to 199 points.

To finish the function off, we call MutatorTakeDamage on the next damage mutator in the list. It is '''critical''' that you pass along method calls like this. If you fail to, damage mutators loaded after your own won't work right. There are other functions that need to be passed along, which we'll look at below.

So now you can save this file and rebuild your package. We aren't done yet, though, because the mutator won't show up in the menus without some more work. Open your package's .int file and add the following line to the &lt;code&gt;[Public]&lt;/code&gt; section (in a single line):

  Object=(Name=SemperFi.Vampire,Class=Class,MetaClass=Engine.Mutator,
    Description=&quot;Vampire,You gain life equal to the amount of damage you do to an enemy.&quot;)

When the game looks for mutators to list in the ''Add Mutators'' window, it searches all .int files for objects with a declared MetaClass of Engine.Mutator. We've also added a Description for the help bar. Now we are ready to run Unreal Tournament and load the mutator. Play around with it for a bit and you'll probably get ideas for your own mutators or ways of expanding Vampire.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]] &amp;ndash; '''Section 7 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Anatomy Of Mutator]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/Setting Up Your Project</title>
    <id>1795</id>
    <revision>
      <id>4406</id>
      <timestamp>2002-12-22T17:03:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Now its time to set up Unreal Tournament to build your project. First things first, you need to understand how UnrealScript uses packages.

Packages are collections of game resources. The resources can be anything, [[Legacy:Texture|Texture]]s, [[Legacy:Sound|sound]]s, [[Legacy:Music|music]], or compiled game code. The package format is the same for all resources and multiple resource types can be mixed in a package. For the sake of sanity, Unreal Tournament splits up packages into resources. The textures directory contains packages with textures, the sounds directory contains packages with sounds and so forth. Even though these packages have different suffixes (.utx, .uax, etc) they are still the same kind of file.

You are going to be dealing with .u files, or code packages. Code packages primarily contain compiled UnrealScript, but may also contain textures and sounds that the code depends on.

UnrealScript is an object oriented language. If you aren't familiar with [[Legacy:OOP|OOP]], now is a good time to take a detour and read my guide to object oriented programming. Here is the link: http://www.orangesmoothie.org/tuts/GM-OOtutorial.html. This document is fairly old, but still a good resource.

Since UnrealScript is object oriented, you won't be editing any of the original source. This is different from Quake, where you edit the original source and then distribute a new DLL. In UnrealScript, you will subclass the classes that shipped with Unreal Tournament, modifying them to suit your needs.

So lets make a package. I'm going to refer to our test package as &lt;code&gt;MyPackage&lt;/code&gt; but you will want to call it the name of your mod. Where I say &lt;code&gt;MyPackage&lt;/code&gt; you'll want to replace with your own package name. Make a directory in your Unreal Tournament directory called MyPackage. Underneath this directory, make a directory called Classes. The UnrealScript compiler looks in the Classes directory for source files to build.

Now, edit [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] and search for &lt;code&gt;EditPackages=&lt;/code&gt;. You'll see a list of all the Unreal Tournament packages. Add your package to the list:

  EditPackages=Core
  EditPackages=Engine
  EditPackages=Editor
  EditPackages=UWindow
  EditPackages=Fire
  EditPackages=IpDrv
  EditPackages=UWeb
  EditPackages=UBrowser
  EditPackages=UnrealShare
  EditPackages=UnrealI
  EditPackages=UMenu
  EditPackages=IpServer
  EditPackages=Botpack
  EditPackages=UTServerAdmin
  EditPackages=UTMenu
  EditPackages=UTBrowser
  EditPackages=MyPackage

Lets take a break and figure out what all those packages are for!

; Core : contains fundamental unrealscript classes. You won't need to look at the stuff in here much at all. Notice that Core, like many .u files, has a related DLL. The DLL contains the C++ part of the package.

; Engine : is where things get interesting. You'll soon become very familiar with the classes in engine. It contains the core definitions of many classes that will be central to your mod. GameInfo describes basic game rules. PlayerPawn describes basic player behavior. Actor describes the basic behavior of UnrealScript objects.

; Editor : contains classes relevant to the editor. You'll never need to mess with this, unless you become a totally elite hacker.

; UWindow : contains the basic classes relevant to the Unreal Tournament windowing system. This is a good place to research how the system works if you want to add complex windows and menus to your mod.

; Fire : contains the UnrealScript interface to the &quot;Fire Engine.&quot; The fire engine is the code that makes all the cool water and fire effects in UT.

; IpDrv : contains classes for putting a UDP or TCP interface into your mod. We use this for the IRC interface in the game, among other things.

; UWeb : contains classes for remote web administration.

; UBrowser : contains the core classes for the in game server browser.

; UnrealShare : contains all the code from the shareware version of Unreal. Nalis galore!

; UnrealI : contains all the code from the full version of Unreal. UnrealShare and UnrealI are included in UT because some UT code is based on classes in these packages. There is a LOT of content here you could use for your mod. 

; UMenu : contains any menus for UT that don't depend on Botpack.

; IpServer : contains the GameSpy querying interface.

; Botpack : is the soul of the new machine. It contains all of the game logic for Unreal Tournament. There are tons of kick ass toys to play with. This is where a lot of your research time will be spent.

; UTServerAdmin : contains Unreal Tournamnt specific web admin code.

; UTMenu : contains UT menus that require content from Botpack.

; UTBrowser : contains browser code that requires content from Botpack.

Notice that the order matters here. This is the order in which the compiler will load the packages. [[Legacy:TournamentGameInfo|TournamentGameInfo]] in Botpack is a [[Legacy:GameInfo (UT)|GameInfo (UT)]], so in order for the compiler to build that code, it needs to have Engine loaded. Your mod should go at the end of the list to benefit from all the code in the previous packages.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A Few Things To Watch Out For]] &amp;ndash; '''Section 5 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]]</text>
    </revision>
    <revision>
      <id>4407</id>
      <timestamp>2002-06-26T18:15:33Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Now its time to set up Unreal Tournament to build your project. First things first, you need to understand how UnrealScript uses packages.

Packages are collections of game resources. The resources can be anything, [[Legacy:Texture (UT)|Texture (UT)]]s, [[Legacy:Sound|sound]]s, [[Legacy:Music|music]], or compiled game code. The package format is the same for all resources and multiple resource types can be mixed in a package. For the sake of sanity, Unreal Tournament splits up packages into resources. The textures directory contains packages with textures, the sounds directory contains packages with sounds and so forth. Even though these packages have different suffixes (.utx, .uax, etc) they are still the same kind of file.

You are going to be dealing with .u files, or code packages. Code packages primarily contain compiled UnrealScript, but may also contain textures and sounds that the code depends on.

UnrealScript is an object oriented language. If you aren't familiar with [[Legacy:OOP|OOP]], now is a good time to take a detour and read my guide to object oriented programming. Here is the link: http://www.orangesmoothie.org/tuts/GM-OOtutorial.html. This document is fairly old, but still a good resource.

Since UnrealScript is object oriented, you won't be editing any of the original source. This is different from Quake, where you edit the original source and then distribute a new DLL. In UnrealScript, you will subclass the classes that shipped with Unreal Tournament, modifying them to suit your needs.

So lets make a package. I'm going to refer to our test package as &lt;code&gt;MyPackage&lt;/code&gt; but you will want to call it the name of your mod. Where I say &lt;code&gt;MyPackage&lt;/code&gt; you'll want to replace with your own package name. Make a directory in your Unreal Tournament directory called MyPackage. Underneath this directory, make a directory called Classes. The UnrealScript compiler looks in the Classes directory for source files to build.

Now, edit [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]] and search for &lt;code&gt;EditPackages=&lt;/code&gt;. You'll see a list of all the Unreal Tournament packages. Add your package to the list:

  EditPackages=Core
  EditPackages=Engine
  EditPackages=Editor
  EditPackages=UWindow
  EditPackages=Fire
  EditPackages=IpDrv
  EditPackages=UWeb
  EditPackages=UBrowser
  EditPackages=UnrealShare
  EditPackages=UnrealI
  EditPackages=UMenu
  EditPackages=IpServer
  EditPackages=Botpack
  EditPackages=UTServerAdmin
  EditPackages=UTMenu
  EditPackages=UTBrowser
  EditPackages=MyPackage

Lets take a break and figure out what all those packages are for!

; Core : contains fundamental unrealscript classes. You won't need to look at the stuff in here much at all. Notice that Core, like many .u files, has a related DLL. The DLL contains the C++ part of the package.

; Engine : is where things get interesting. You'll soon become very familiar with the classes in engine. It contains the core definitions of many classes that will be central to your mod. GameInfo describes basic game rules. PlayerPawn describes basic player behavior. Actor describes the basic behavior of UnrealScript objects.

; Editor : contains classes relevant to the editor. You'll never need to mess with this, unless you become a totally elite hacker.

; UWindow : contains the basic classes relevant to the Unreal Tournament windowing system. This is a good place to research how the system works if you want to add complex windows and menus to your mod.

; Fire : contains the UnrealScript interface to the &quot;Fire Engine.&quot; The fire engine is the code that makes all the cool water and fire effects in UT.

; IpDrv : contains classes for putting a UDP or TCP interface into your mod. We use this for the IRC interface in the game, among other things.

; UWeb : contains classes for remote web administration.

; UBrowser : contains the core classes for the in game server browser.

; UnrealShare : contains all the code from the shareware version of Unreal. Nalis galore!

; UnrealI : contains all the code from the full version of Unreal. UnrealShare and UnrealI are included in UT because some UT code is based on classes in these packages. There is a LOT of content here you could use for your mod. 

; UMenu : contains any menus for UT that don't depend on Botpack.

; IpServer : contains the GameSpy querying interface.

; Botpack : is the soul of the new machine. It contains all of the game logic for Unreal Tournament. There are tons of kick ass toys to play with. This is where a lot of your research time will be spent.

; UTServerAdmin : contains Unreal Tournamnt specific web admin code.

; UTMenu : contains UT menus that require content from Botpack.

; UTBrowser : contains browser code that requires content from Botpack.

Notice that the order matters here. This is the order in which the compiler will load the packages. [[Legacy:TournamentGameInfo|TournamentGameInfo]] in Botpack is a [[Legacy:GameInfo (UT)|GameInfo (UT)]], so in order for the compiler to build that code, it needs to have Engine loaded. Your mod should go at the end of the list to benefit from all the code in the previous packages.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A Few Things To Watch Out For]] &amp;ndash; '''Section 5 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/How To Build Your Package]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/Some Advice To Start With</title>
    <id>1796</id>
    <revision>
      <id>4408</id>
      <timestamp>2002-05-14T11:00:07Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">When you begin writing a mod you should start small. Don't plan to write a Total Conversion (TC) from the very start. If you set goals that are too hard to reach, you'll get frustrated in the process of working towards them. It is much better to set a series of small goals and work to each one in turn. Start with a simple idea that could be expanded into a larger game. Always work on small, managable chunks that could each be released in their own right. If you do undertake a large project, organize your features into a release schedule. If your game is going to have 5 new weapons, make a release with 3 while your work on the others. Pace yourself and think about the long term. 

Everyone is an idea man. Everybody thinks they have a revolutionary new game concept that no one else has ever thought of. Having cool ideas will rarely get you anywhere in the games industry. You have to be able to implement your ideas or provide some useful skill. This also applies to mod authoring. If you become a skilled or notable mod author, you will find people propositioning you to implement their ideas. Never join a project whose idea man or leader has no obvious development skills. Never join a project that only has a web designer. You have your own ideas. Focus on them carefully and in small chunks and you will be able to develop cool projects. 

Remember that developing a mod doesn't mean much if you never release it. Scale your task list so that you can release something quickly, adding and improving features as your mod matures. If you hold back your mod until everything is perfect, you'll find yourself never releasing anything.

Now that you have your idea, you need to choose what kind of Unreal Tournament mod type is right for you. There are basically three types of mods. We'll go over each one in brief and then focus on them all individually.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Lazy Man'S Guide]] &amp;ndash; '''Section 2 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/The Three Mod Types]]</text>
    </revision>
    <revision>
      <id>4409</id>
      <timestamp>2002-05-13T20:21:47Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">When you begin writing a mod you should start small. Don't plan to write a Total Conversion (TC) from the very start. If you set goals that are too hard to reach, you'll get frustrated in the process of working towards them. It is much better to set a series of small goals and work to each one in turn. Start with a simple idea that could be expanded into a larger game. Always work on small, managable chunks that could each be released in their own right. If you do undertake a large project, organize your features into a release schedule. If your game is going to have 5 new weapons, make a release with 3 while your work on the others. Pace yourself and think about the long term. 

Everyone is an idea man. Everybody thinks they have a revolutionary new game concept that no one else has ever thought of. Having cool ideas will rarely get you anywhere in the games industry. You have to be able to implement your ideas or provide some useful skill. This also applies to mod authoring. If you become a skilled or notable mod author, you will find people propositioning you to implement their ideas. Never join a project whose idea man or leader has no obvious development skills. Never join a project that only has a web designer. You have your own ideas. Focus on them carefully and in small chunks and you will be able to develop cool projects. 

Remember that developing a mod doesn't mean much if you never release it. Scale your task list so that you can release something quickly, adding and improving features as your mod matures. If you hold back your mod until everything is perfect, you'll find yourself never releasing anything.

Now that you have your idea, you need to choose what kind of Unreal Tournament mod type is right for you. There are basically three types of mods. We'll go over each one in brief and then focus on them all individually.

{|

|-
| style=&quot;text-align: left&quot; |''Next Page:'' [[Mod_Authoring/The_Three_Mod_Types
|The Three Mod Types]] 
|-
| style=&quot;text-align: left&quot; |'''''Section 2 of 12''''' 
|}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/The Anatomy Of Mutator</title>
    <id>1797</id>
    <revision>
      <id>4410</id>
      <timestamp>2002-05-14T11:32:47Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">So now you've had your first exposure to writing a simple UT mod. Clearly this isn't enough to shake the world or get a job in the industry. Let's take a close look at the methods inside the [[Legacy:Mutator|Mutator]] base class. This will give you a better idea of what you can do with them. It only scratches the surface, however, because you have the power to use a multitude of inherited functions as well as interact with other objects.

; ModifyPlayer : We'll skip the &lt;code&gt;PostRender&lt;/code&gt; function for now and look at &lt;code&gt;ModifyPlayer&lt;/code&gt;. This is called by the game whenever a [[Legacy:Pawn (UT)|Pawn (UT)]] is respawned. It gives you a chance to modify the pawn's variables or perform some game logic on the pawn. Remember to call &lt;code&gt;Super.ModifyPlayer()&lt;/code&gt; if you override this function. That will call the parent class' version of the function.

; ScoreKill : is called whenever a pawn kills another pawn. This lets you influence the score rules of the game, preventing point gains in certain situations or awarding more points in others. Remember to call &lt;code&gt;Super.ScoreKill()&lt;/code&gt; if you override this function.

; MutatedDefaultWeapon : gives you an opportunity to give a different default weapon to a player that enters a game or respawns. In UT, the default weapon is the Enforcer. If you just want to change the default weapon, you don't need to override this function. Instead, just add a DefaultWeapon definition to the defaultproperties of your mutator. (See the bottom of PulseArena for an example).

; MyDefaultWeapon, AddMutator : You don't need to mess with &lt;code&gt;MyDefaultWeapon&lt;/code&gt; or &lt;code&gt;AddMutator&lt;/code&gt;.

; ReplaceWith, AlwaysKeep : allow you to interdict objects that the game wants to add to the world. You can replace objects on the fly with other objects as they appear. The Botpack.Arena mutators are a great example of this. They take all the weapons in a game and replace them with one other weapon. If you are adding a new weapon to the game, you might want to add an Arena mutator for it.

; IsRelevant : is called when the game wants to add an object to the world. You can override it with special code and return true, to keep the object, or false, to reject it. If you say false, the object will be destroyed.

; Mutate : is cool. It lets your mutator define new commands that player's can bind to keys. If a player binds &quot;mutate givehealth&quot; to a key and then uses that key, every mutator will get a mutate call with a &quot;givehealth&quot; parameter. Your mutator might look for this string and give the player who sent the message some extra health.

; MutatorTakeDamage : as described above, is called on DamageMutators. It lets damage mutators do some kind of game logic based on a pawn taking damage. It also tells you where the pawn was hit, the type of damage, and how much force the damage imparted.

; RegisterHUDMutator : is used to tell the game that this mutator should get PostRender calls. PostRender passes you a Canvas every frame. You can use the Canvas to draw stuff on the HUD. Look in the Botpack.ChallengeHUD class for extensive examples of abusing the Canvas. Hehe.

The best way to learn mutators is to read the code in the mutators that ship with UT. In fact, you'll probably want to spend a lot of time just pooring over the massive amount of code that comes with the game. Trace execution paths and look at how the various classes override and interact with each other. It can be '''very intimidating''' at first, but with time you'll get more experienced with where things are and what things do. Don't be afraid to go online and ask questions either or read other mod authors code. If you spend the time it takes to learn, you will be rewarded with the ability to take on larger, more difficult projects.

----

Prev Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Making A Mutator]] &amp;ndash; '''Section 8 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Introduction To GameTypes]]</text>
    </revision>
    <revision>
      <id>4411</id>
      <timestamp>2002-05-13T19:55:17Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">So now you've had your first exposure to writing a simple UT mod. Clearly this isn't enough to shake the world or get a job in the industry. Let's take a close look at the methods inside the Mutator base class. This will give you a better idea of what you can do with them. It only scratches the surface, however, because you have the power to use a multitude of inherited functions as well as interact with other objects.

We'll skip the '''PostRender''' function for now and look at '''ModifyPlayer'''. This is called by the game whenever a pawn is respawned. It gives you a chance to modify the pawn's variables or perform some game logic on the pawn. Remember to call Super.ModifyPlayer() if you override this function. That will call the parent class' version of the function.

'''ScoreKill''' is called whenever a pawn kills another pawn. This lets you influence the score rules of the game, preventing point gains in certain situations or awarding more points in others. Remember to call Super.ScoreKill() if you override this function.

'''MutatedDefaultWeapon''' gives you an opportunity to give a different default weapon to a player that enters a game or respawns. In UT, the default weapon is the Enforcer. If you just want to change the default weapon, you don't need to override this function. Instead, just add a DefaultWeapon definition to the defaultproperties of your mutator. (See the bottom of PulseArena for an example).

You don't need to mess with '''MyDefaultWeapon''' or '''AddMutator'''.

'''ReplaceWith''' and '''AlwaysKeep''' allow you to interdict objects that the game wants to add to the world. You can replace objects on the fly with other objects as they appear. The Botpack.Arena mutators are a great example of this. They take all the weapons in a game and replace them with one other weapon. If you are adding a new weapon to the game, you might want to add an Arena mutator for it.

'''IsRelevant''' is called when the game wants to add an object to the world. You can override it with special code and return true, to keep the object, or false, to reject it. If you say false, the object will be destroyed.

'''Mutate''' is cool. It lets your mutator define new commands that player's can bind to keys. If a player binds &quot;mutate givehealth&quot; to a key and then uses that key, every mutator will get a mutate call with a &quot;givehealth&quot; parameter. Your mutator might look for this string and give the player who sent the message some extra health.

'''MutatorTakeDamage''', as described above, is called on DamageMutators. It lets damage mutators do some kind of game logic based on a pawn taking damage. It also tells you where the pawn was hit, the type of damage, and how much force the damage imparted.

'''RegisterHUDMutator''' is used to tell the game that this mutator should get PostRender calls. PostRender passes you a Canvas every frame. You can use the Canvas to draw stuff on the HUD. Look in the Botpack.ChallengeHUD class for extensive examples of abusing the Canvas. Hehe.

The best way to learn mutators is to read the code in the mutators that ship with UT. In fact, you'll probably want to spend a lot of time just pooring over the massive amount of code that comes with the game. Trace execution paths and look at how the various classes override and interact with each other. It can be '''very intimidating''' at first, but with time you'll get more experienced with where things are and what things do. Don't be afraid to go online and ask questions either or read other mod authors code. If you spend the time it takes to learn, you will be rewarded with the ability to take on larger, more difficult projects.

{|

|-
| colspan=&quot;2&quot; style=&quot;text-align: left&quot; |''Next Page:'' [[Mod_Authoring/Introduction_to_GameTypes
|Introduction to GameTypes]]
|
|}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/The Lazy Man's Guide</title>
    <id>1799</id>
    <revision>
      <id>4414</id>
      <timestamp>2002-05-14T10:59:43Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">So you want to get into UnrealScript hacking ''now now now''. This is what you should do:

#Export UnrealScript source files. Open UnrealEd, set the browser bar to ''Classes''. Hit ''Export All''. This dumps the UnrealScript source files to disk instantly creating your own SDK.
#Create a package directory and hack some code. Like this:&lt;pre&gt;
  mkdir MyPackage
  cd MyPackage
  mkdir Classes
  cd Classes
  edit MyScriptFile.uc&lt;/pre&gt;
#Add your package to the EditPackages list in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]].
#Build your files with ucc. First delete your &lt;code&gt;MyPackage.u&lt;/code&gt; if it exists. '''ucc make only rebuilds missing code packages.''' Then type &lt;code&gt;ucc make&lt;/code&gt; from the System directory of your Unreal Tournament install.

----

'''Section 1 of 12''' &amp;ndash; Next Page: [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Some Advice To Start With]]</text>
    </revision>
    <revision>
      <id>4415</id>
      <timestamp>2002-05-13T20:20:32Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">So you want to get into UnrealScript hacking NOW NOW NOW. This is what you should do:

#Export UnrealScript source files. Open UnrealED, set the Browser bar to Classes. Hit Export All. This dumps the UnrealScript source files to disk instantly creating your own SDK.
#Create a package directory and hack some code. Like this:
::&lt;TT&gt;mkdir MyPackage&lt;/TT&gt;
::&lt;TT&gt;cd MyPackage&lt;/TT&gt;
::&lt;TT&gt;mkdir Classes&lt;/TT&gt;
::&lt;TT&gt;cd Classes&lt;/TT&gt;
::&lt;TT&gt;edit MyScriptFile.uc&lt;/TT&gt;
#Add your package to the EditPackages list in UnrealTournament.ini
#Build your files with ucc. First delete your &quot;MyPackage.u&quot; if it exists. '''ucc make only rebuilds missing code packages.''' Then type &quot;ucc make&quot; from the System directory of your Unreal Tournamnt install.

{|

|-
| style=&quot;text-align: left&quot; |''Next Page:'' [[Mod_Authoring/Some_Advice_To_Start_With
|Some Advice to Start With]] 
|-
| style=&quot;text-align: left&quot; |'''''Section 1 of 12''''' 
|}</text>
    </revision>
    <revision>
      <id>4416</id>
      <timestamp>2002-05-13T21:45:17Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>linked some words</comment>
      <text xml:space="preserve">So you want to get into UnrealScript hacking NOW NOW NOW. This is what you should do:

#Export UnrealScript source files. Open UnrealED, set the Browser bar to Classes. Hit Export All. This dumps the UnrealScript source files to disk instantly creating your own SDK.
#
Create a package directory and hack some code. Like this:

&lt;uscript&gt;
mkdir MyPackage
cd MyPackage
mkdir Classes
cd Classes
edit MyScriptFile.uc&lt;/uscript&gt;

#Add your package to the EditPackages list in [[Legacy:UnrealTournament.Ini|UnrealTournament.ini]]
#Build your files with ucc. First delete your &quot;MyPackage.u&quot; if it exists. '''ucc make only rebuilds missing code packages.''' Then type &quot;ucc make&quot; from the System directory of your Unreal Tournamnt install.

{|

|-
| style=&quot;text-align: left&quot; |''Next Page:'' [[Mod_Authoring/Some_Advice_To_Start_With
|Some Advice to Start With]] 
|-
| style=&quot;text-align: left&quot; |'''''Section 1 of 12''''' 
|}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Authoring/The Three Mod Types</title>
    <id>1798</id>
    <revision>
      <id>4412</id>
      <timestamp>2002-05-14T11:06:02Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Mutators ===

[[Legacy:Mutator|Mutator]]s are mini-mods. They have limited functionality as defined by the Mutator class. Mutators should follow certain rules. If you can't follow these rules, you should probably work on a ''GameType'' mod.

The first rule is that Mutators should be able to work with any other Mutator. If you write a &quot;Vampire&quot; mutator that allows the player to drain life from an enemy he shoots, the mutator should work well if combined with one of the ''Arena'' mutators or the ''No Powerups'' mutator. This is one of the beneficial features of the Mutator system. They slightly change (or mutate) gameplay, allowing for interesting combinations.

The second rule is that Mutators should only change gameplay in a slight fashion. Although that's a vague way of putting it, you need to try and restrict your Mutator behavior. Careful mutator design will increase the chances of your mutator working with other mods and will decrease your support effort.

The third rule is that Mutators should share resources with other Mutators. If your Mutator implements the &lt;code&gt;ModifyPlayer&lt;/code&gt; function, you need to call &lt;code&gt;NextMutator.ModifyPlayer&lt;/code&gt; somewhere inside your version of the function. This ensures that any Mutator on the Mutator list after your mod gets a chance to deal with the function call. Failing to do this is poor programming style.

===GameTypes ===

GameTypes are a much larger class of mod. They do everything the [[Legacy:Mutator|Mutator]] can't and allow you access to a much larger range of functionality. If your idea can't be implemented within a Mutator, you should work on a GameType.

The drawback of a GameType is that it cannot be mixed with other GameTypes. For example, [[Legacy:CTF|Capture the Flag]] is a GameType in Unreal Tournament. It is a wholly different style of gameplay from [[Legacy:AS|Assault]] (another GameType).

GameTypes are implemented as subclasses of the [[Legacy:TournamentGameInfo|TournamentGameInfo]] class. There aren't any specific rules for GameTypes, other than some client-server issues that you should be aware of (and that we will discuss later).

===Everything Else ===

It is possible to write a mod that doesn't change gameplay through the [[Legacy:GameInfo (UT)|GameInfo (UT)]] or [[Legacy:Mutator|Mutator]] classes. These would include Player Plugin Models (PPM) or a new weapon. We'll talk about a few prime examples like [[Legacy:Weapon (UT)|Weapon (UT)]]s and [[Legacy:Pickup (UT)|Pickup (UT)]]s later. GameTypes will often include many new weapons, pickups, [[Legacy:Artificial Intelligence|AI]] features, or special actors that are separate from the game rules themselves.

----

Prev Page:  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Some Advice To Start With]] &amp;ndash; '''Section 3 of 12''' &amp;ndash; Next Page:  [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/A Few Things To Watch Out For]]</text>
    </revision>
    <revision>
      <id>4413</id>
      <timestamp>2002-05-13T20:23:14Z</timestamp>
      <contributor>
        <ip>WheatPuppet</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Mutators ===

Mutators are mini-mods. They have limited functionality as defined by the Mutator class. Mutators should follow certain rules. If you can't follow these rules, you should probably work on a ''GameType'' mod.

The first rule is that Mutators should be able to work with any other Mutator. If you write a &quot;Vampire&quot; mutator that allows the player to drain life from an enemy he shoots, the mutator should work well if combined with one of the Arena mutators or the No Powerups mutator. This is one of the beneficial features of the Mutator system. They slightly change (or mutate) gameplay, allowing for interesting combinations.

The second rule is that Mutators should only change gameplay in a slight fashion. Although that's a vague way of putting it, you need to try and restrict your Mutator behavior. Careful mutator design will increase the chances of your mutator working with other mods and will decrease your support effort.

The third rule is that Mutators should share resources with other Mutators. If your Mutator implements the &quot;ModifyPlayer&quot; function, you need to call &quot;NextMutator.ModifyPlayer&quot; somewhere inside your version of the function. This ensures that any Mutator on the Mutator list after your mod gets a chance to deal with the function call. Failing to do this is poor programming style.

===GameTypes ===

GameTypes are a much larger class of mod. They do everything the Mutator can't and allow you access to a much larger range of functionality. If your idea can't be implemented within a Mutator, you should work on a GameType.

The drawback of a GameType is that it cannot be mixed with other GameTypes. For example, Capture the Flag is a GameType in Unreal Tournament. It is a wholly different style of gameplay from Assault (another GameType).

GameTypes are implemented as subclasses of the &quot;TournamentGameInfo&quot; class. There aren't any specific rules for GameTypes, other than some client-server issues that you should be aware of (and that we will discuss later).

===Everything Else ===

It is possible to write a mod that doesn't change gameplay through the GameInfo or Mutator classes. These would include Player Plugin Models (PPM) or a new weapon. We'll talk about a few prime examples like Weapons and Pickups later. GameTypes will often include many new weapons, pickups, AI features, or special actors that are separate from the game rules themselves.

{|

|-
| style=&quot;text-align: left&quot; |''Next Page:'' [[Mod_Authoring/A_Few_Things_To_Watch_Out_For
|A Few Things to Watch Out For]] 
|-
| style=&quot;text-align: left&quot; |'''''Section 3 of 12''''' 
|}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Copyright</title>
    <id>2066</id>
    <revision>
      <id>5031</id>
      <timestamp>2005-12-03T03:08:10Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The more popular modding becomes, the more often one sees mods based on existing ideas:  movies, games, and so on.  However, there is one problem inherent to all such mods:  '''Copyrights.'''

==What's Copyright?==

Movies, games, mods, they're all copyrighted to somebody.  What does this mean?  The owner of the [[Wikipedia:copyright]] is guaranteed certain privileges to his material.  This includes:

* the exclusive right to '''reproduction''',
* the exclusive right to '''derivative works''',
* the exclusive right to '''distribution''' and
* the exclusive right to '''public performance and display'''.

The most important one, as far as mods go, is the &quot;exclusive right to derivative works.&quot;  A derivative work is anything based on the original copyrighted work.

A simple example:  You can't make an Unreal Tournament mod for Quake III.  The game, along with the content, is copyrighted to Epic Games.  Or... you couldn't make an ''Independence Day'' mod (you know, the movie...).

; &quot;But we are not making profit.&quot; : It doesn't matter.  The owner still retains the right to decide what is done with their material, and they even legally ''have to'' protect it in order not to create a precedent that may cause them to lose it when it ''really'' hurts.  (And they still potentially lose money due to your mod even if you don't make any.  But regardless of that, &quot;damage&quot; is not a concept that comes in where copyright is concerned.)

; &quot;What about fair use?&quot; :  Generally, [[Wikipedia:Fair use|fair use]] is limited to a reasonably small portion of a work.  The &quot;portion&quot; however depends on the work itself.  Using a quote from a book on a website wouldn't constitute copyright infringement as it's one sentence out of thousands; copying an entire article from that website and using it is a different matter though.

What it comes down to is '''explicit permission.'''  If you don't have it, you can't do it.  Some people and companies will grant it, others won't.  Nintendo, for example, is very strict with their quality assurance and doesn't grant permissions to mod developers.  On the other hand, I recall a mod based on Square's ''Final Fantasy'' characters, and they had in fact gotten permission to use them.  But you’re better off getting a letter refusing permission before you start a mod, than getting a cease-and-desist letter six months into development.

==Why Does This Matter?==

Besides being illegal there are several other consequences of copyright infringement to consider before starting a mod project. First of all, if you're reading this you're ''probably'' a coder, level designer, 3D artist, 2D artist, or have some other talent associated with game development. And, in the course of creating content, you will (or have) put in a huge amount of time and effort into your project. And, in the end, the '''only''' way of protecting your hard work from theft by others is copyright protection. So, with that in mind, let's consider a couple of scenarios.

; Scenario A : 


You and a group of other buddies have worked hard for over a year to produce a terrific mod. Then another group of developers comes along, rips off all your content, ports it over to a newer engine over the course of just a couple of months. And then, after it's release, this new mod slowly starts stealing away your fanbase.

How upset would you be? Wouldn't you invoke your rights as the owner of that content and do everything in your power to stop it?


; Scenario B : You ''own'' the copyright to a commerical game title that is your main source of income. You rely on that income to feed your family, pay your employees, and buy all your shiny new toys. Then, along comes another game that is a direct copy of your title. And, to top it all off, this new game is a mod, available for, gasp!, ''free'' to any person with an Internet connection. So instead of having to ''buy'' your game, gamers can download another game that's almost the same for ''free''. 

Now, is it any surprise why game companies won't hesitate to slap you with a &quot;cease and desist&quot; order? The newer the game, the greater the danger to mods copying that title of being stopped dead in their tracks. Obviously, this is less of a danger to mods based on older games, but not necessarily so. You never know when a company may be planning on, or is already developing, a sequel. And if that's the case, you better believe they'll come after you.

This is why the ''&quot;but nobody's making profit&quot;'' argument doesn't work. It doesn't matter that '''you're not making profit.''' What matters is that '''they're losing profit,''' and they may even lose their intellectual property rights if they don't protect them.

==How Does This Affect the Community?==

As a development community it is our collective responsibility to maintain its health. Not only is it in our best interests to share resources and insight, it is equally in our best interests to protect the property of its individual members. Tolerating the theft of others property by current mod teams encourages that behavior in fledgling teams. And who's to say it isn't ''your'' property that's stolen next?  

Another factor to consider is the simple fact that people with the Talents necessary to publish mods are in very short supply. The is only a finite number of mods that can be in developement at any one time. Now consider a mod that's assembled a team of three or four dedicated guys that have put in hundreds of man-hours of work into their project. Then, six months into their work, the receive the dreaded &quot;cease and desist&quot; order from the game they're copying. All those man-hours of work are now wasted, when they could have been used by a mod project that has a much better chance of reaching production.

Producing a mod is an ''incredibly'' difficult thing to do, and only a miniscule percent of mods that get started ever see the light of day. And starting a mod that's a copy of another game or movie only adds to that difficulty and further reduces you chances of ever releasing, since you're starting with a ''big'' strike against you. So, every developer that joins the doomed project is one less developer that could have been used elsewhere.

The simple fact is that starting, joining, or even tolerating, mods that violate copyright law is detrimental to the community as a whole. 

==Getting Permission==

The good news is that often the only thing necessary to receive the coveted &quot;permission&quot; is a letter to the orginal producer stating your intent to produce a mod based on thier work, and your reasons for doing so. When writing this letter, there are several recommendations to getting it noticed and receiving a positive answer.

When obtaining permission to use copyrighted material, get permission for an individual, not a team, to use the material. That way, if the mod team splits up, there is no ambiguity as to who has permission to continue use of the material.

===How to Write a Good Letter===

; Snail mail vs. email : That's a judgement call, and there's no way I can answer it. The only thing I can recommend, is to do your research. Find as much contact info as you can. Find out ''who'' you need to contact and what contact info this individual posts about themselves. Often times people will have a preference, so try and find out what that is. In either case, the rest of rules apply no matter what medium you choose.

; Professionalism : Be as professional as possible. Structure it as a business letter. Use your '''real name''', not your game nick. (Sincerely, ThunderFart does ''not'' look good on a business proposal.) Use correct grammar, spelling, and punctuation (see below). The quickest way to end up in the circular file is to send a letter that looks like it was written by a 12-year-old. So, if your ''are'' a 12-year-old, or just write like one, find a buddy to write the letter for you. 

; Language : Unless the original producer is located in a non-English speaking country ''and'' you are fluent in the language of that country, your letter should be in English. English is the international business language. If English is not your first language, find a buddy who speaks english fluently to avoid mistranslations. 

; Use compliments &amp;ndash; do not brown-nose! : But, do let them know that you picked their game or movie because you ''like'' it. It's fun and entertaining, and you want to continue that tradition with your new mod. This is especially effective for an older game or movie that is no longer in production.

; Not for profit : While being non-profit won't matter if you fail to ask for permission, if you do bother to ask often this is the ''key'' to getting that permission.

; Educational : Do ''not'' say that your project is for a school project unless that is the case. However you are more than welcome to say this project is for your &quot;personal&quot; education. This is another factor that might soften them up a bit.

; Credit : If you're going to copy the game, then copy the game. Make it completely obvious what game you are emulating and give the original producer full credit for the original game.

==Summary==

I hope that this article doesn't completely discourage you from making a mod from an existing game or movie. But, I do hope it discourages you from doing one without the ''permission'' of its original owner. Copyright law is there for a reason. And before you decide it's okay to be a thief, please think long and hard about the consequences of your actions, and how you would feel if it was you being stolen from.

==Related Links==
* [[Wikipedia:Copyright]] &amp;ndash; an overview
* http://www.copyright.gov/circs/circ1.html &amp;ndash; US Copyright Office, &quot;Copyright Basics&quot;
* http://www.patent.gov.uk/copy/ &amp;ndash; UK Patent Office (Copyrights Section)
* [[Legacy:OpenUnrealModLicense|OpenUnrealModLicense]] &amp;ndash; a GPL like license without the possible issues with the closed source runtime (UnrealEngine)
* [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]] &amp;ndash; the Lesser GPL like license
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''BM.Deathwind:'''  I do plan on revising/editing this.  So list your suggestions/questions.

'''Cookie:''' Excellent Deathwind. This article was desperately needed. I went ahead added a few more sections that I felt elaborated on the importance of this issue. Hope you don't mind.

'''BM.Deathwind:''' Impressive!! :) I really like what you did...

'''RegularX:''' Nicely written.  The &quot;not making profit&quot; myth really needs to be plastered around everywhere.  A lot of mod groups are fans of X, whether X be Jason movies or Alien movies or Starcraft, etc., and realizing such concepts might avoid a legal letter or two.

'''OverloadUT:''' What about the topic of the copyright of the mod being developed? I expected that to be covered here, but it's not.  What I mean is: If I release a mod and include a license that says &quot;You may not use this to make dirivative works or modify this code&quot; and then someone does, do I have grounds to press charges?  I wouldn't be surprised if you automatically give up all rights to your project because it's released for an engine to which you do not have a license. Does anybody know the answer to this?

'''Mychaeel:''' What's written here about other people's rights to their intellectual property naturally applies to mods as well.  I've changed the first paragraph to make that more obvious.  You actually don't even have to include a license that states that you own the copyright &amp;ndash; you do, by default.

'''OverloadUT:''' Okay, I've got a more tricky situation. I'll use a real life relevant scenario: I'm making a CTF4 mod, which adds four team support to UT2004.  This is nice because it allows anyone to make a 4 team mod by using my gameclass as a base. But if on release I said that no one is allowed to make a mod that uses my code as a base, does that hold?  The difference being that I have not created anything particuarly innovative.  &quot;4-team gameplay&quot; is probably not something I can copyright. And if someone makes a mod that sits on top of my code without actually changing my code or stealing any of my code, are they doing anything (legally) wrong? Please note that this is simply a question for the sake of knowing the answer. I don't really have an issue with someone using CTF4 as a base for another mod.

'''Foxpaw:''' It not being innovative or revolutionary is irrelevant. If you wrote a book that was essentially an age-old story rehased, you still have copyright over it - even if it's &quot;nothing new.&quot; Whether or not it's innovative is an issue that applies to patent law, which is not the same as copyright.

However: As for whether or not they are doing anything wrong if they derive off of your classes and don't include any code: That's a bit tricky, but I think it would be legal - after all, their code only makes reference to your work, much like Coles notes, or a book report might make reference to your work.

However, it's not quite the same, since one can still read (make use of) a book report without the book in question, while a person would not be able to use code that referenced your code without having your (compiled) work. In addition, one might logically argue that their package is linked to yours at runtime by the virtual machine and thus constitutes a derivative work, but I doubt many judges would understand what that means, so.. err, that might not work. ;)

You could, in that case, maybe argue that the license does not allow them to view your code, which would be required in order to derive from the class. (Unless they claim they just &quot;guessed&quot; the function names, etc. ;))

A person might also be able to include a clause specifically forbidding such use, (not sure how well that would stand up) and you could certainately restrict redistribution, though then they could still link and state that you had to download the CTF4 mod separate from theirs.

Hrm, and if you did that, you could change function and variable names with each new release, and if the license only allowed to most recent version to be mirrored, then I SUPPOSE you could prevent such behaviour that way. Though that's probrably not ideal.

In the end I think it would mostly come down to your (or your lawyers') ability to convince the judge. It seems like a person OUGHT TO have control over that sort of thing, but the challenge would lie in explaining OOP and how it relates to what the person has done.

'''Foxpaw:''' Err.. doh! Just thought when I put that edit in; console manufacturers like Nintendo have a legal ability to control what games are released for their platform: so there is some legal background to the notion that a copyright holder can have some control over what software is run on their platform - you would only have to argue that your copyrighted work is being used as a software platform for another piece of software.

'''Mychaeel:''' You can keep people from creating &quot;derivative works&quot; of your code (and what's a subclass if not, literally, a &quot;derivative work&quot;?).  However, you have no right on the &quot;four teams&quot; idea just because you implemented it first &amp;ndash; that's the difference between ''copyright'' and ''patents''.  You could (probably, sadly) ''patent'' the idea of having four teams instead of two fighting against each other, but you cannot ''copyright'' it &amp;ndash; just your code that implements it.  Anybody else can come up with the same idea and legally implement it on their own.

'''OverloadUT:''' Okay, that makes sense. Thanks for the answers! I think I was getting patents and copyrights confused.  I have another situation to ponder though: Let's say I wanted to add custom loading screens for my mod, based on what map is loading. To do this, I would remember that Jailbreak did that very thing, so I would look at that code and see how they did it.  If I implemented that code in to my mod without permission, is that copyright violation?  What if I asked for permission and they denied it? I mean, I've seen how the code works now, and I could &quot;rewrite&quot; the code but since their way is the best way to do it, it might end up looking like the exact same code. How does that work? Can you copyright the ''method'' that you used to implement a feature? That sounds more like a patent to me. And if you '''can''' copyright the method, how much code has to be copied before it's considered stealing the source? In this example, the loading thing is only about 5 lines of code. It hardly seems like copying, but I wouldn't have been able to come up with it myself. What if it were a much larger chunk of code, like the GUIHook system that Jailbreak uses?  (Can you tell I've learned a lot from Jailbreak? You guys are geniuses.)

'''Foxpaw:''' No. Once again, that's a patent which is different. However, I wrote up the necessary bits required to do that on the wiki long ago. If you copied the code from another mod, without permission, that might be a violation of copyright. If you decompiled or reverse engineered their code without permission that might also be a violation of copyright. (I say might because it will vary based on what sort of license the mod was released under, and the laws in your particular country.)

As for it ending up looking the same.. well, that's a bit of a tricky one. From a moral perspective I would say no. However, one has to consider: if you read a book, then wanted to write a book on that topic, but you wrote exactly what they wrote because you felt that was the best way to express it: would that be copyright infringement? It would, of course, so the same logic could probrably apply to this situation.

However, considering that I wrote up all the info you need almost a year ago on the wiki, one could reasonably argue that the methods are public knowledge. See [[Legacy:Vignette|Vignette]]. I didn't want to make it tutorial-like, so there isn't any &quot;hand holding&quot; per se, but all the information you should need is pretty plainly laid out.

'''Mychaeel:''' Being the one who made that Jailbreak JBGUIHook code, I assure you that [[Legacy:Vignette|Vignette]] has little to do with it. &amp;ndash; OverloadUT: If, just for the sake of the argument, the Jailbreak team didn't give you permission to use their code, copying their code would be exactly what copyright does ''not'' allow you to do.  The difference between a patent and copyright is just that copyright would allow you to re-invent the same technique on your own without copying it, while a patent means that even if you thought it up all by yourself and perhaps didn't even know about the patent, you still wouldn't be allowed to use it.

'''Foxpaw:''' Err, yes. I was referring to the custom loading screens. I don't know what the Jailbreak &quot;GUI hooks&quot; refers to.

'''Mychaeel:''' I'm confusing my own code here...  JBGUIHook is responsible for Jailbreak's custom menu music and the &quot;Add-Ons&quot; tab which is dynamically added to the game setup screen.  Jailbreak ''also'' replaces the loading screens by map-specific custom ones, and ''that'' code is what I was referring to as having little to do with the bit that's written up on [[Legacy:Vignette|Vignette]].

'''Foxpaw:''' Err. Hmm. May I look at the code for Jailbreak to see what you have done there? I don't see how else one could alter the loading screens without making use of the [[Legacy:Vignette|Vignette]] class, but I'd be interested to see what you have done there.

'''Mychaeel:''' Jailbreak integrates into the game as (yet another) game type and thus doesn't have it's own .ini file.  Thus, Jailbreak's implementation of the static GetLoadingHint function modifies the existing [[Legacy:UT2K4ServerLoading|UT2K4ServerLoading]] object (subclass of [[Legacy:Vignette|Vignette]]) to replace the default UT2004 loading screen rather than creating its own [[Legacy:Vignette|Vignette]] subclass and registering it in an .ini file.  (I'd link you to JDN for the code, but unfortunately it's down at the moment and I won't be able to look into that problem until later tonight.)

===Teams and Copyright Permission===

'''GRAF!K:''' What would happen if a mod team got permission to use copyrighted material, then broke up? Then you would have a bunch of modders fighting over the copyright permissions. What would be the legally correct thing to do?

I'm going to try and get permission from Hasbro to use Nerf&amp;copy; material in [[Legacy:Nytro|my mod]], but I thought I would consider this a bit first.

'''Mychaeel:''' Permission to use somebody's copyrighted material sticks with a certain mod concept.  So if some people of that team continue working on the very same project,the copyright holder won't even care.  However, if each faction of the team starts a new project only roughly along the lines of the old, you have to inquire for permission individually again.

'''Foxpaw:''' What if the team were to split in half, and both halves wanted to continue production from where they were before? Where does the copyright lie in this case? Do both parties retain copyright priviledges as they had the copyrights when they were part of the original team? Is the copyright retained by whichever team has the name that the copyright was originally assigned to, and thus belong to whichever team contains the person who founded the team?

'''RegularX:''' Most companies would have you sign a legal document that would explain exactly how they define the party being granted the license.  Quite possibly both would lose copyright privs, have to ask the holder again (who would probably just be annoyed and drop it at that point). Or it would be in the hands of one principal person (the mod founder).  Point is, a copyright license is a singular entity, it doesn't duplicate due to the number of people on a team, you can't re-divide it up after it's granted.

'''GRAF!K:''' The point is, though, that after a team split up, everyone would claim that ''they'' own the team and therefore the copyright.

'''Mychaeel:''' At the end of the day it's the copyright owner's decision who gets permission to use it for what purpose.  If two factions end up bickering about permission that was previously granted to the entire team for a certain project, chances are that the copyright owner behaves as RegularX suggests and makes clear that the original permission was only granted to the entire original team ''and'' project, not the two halves of it.  If in doubt, ask the only entity that has a say in this: the copyright holder.

'''Foxpaw:''' Okay, I have another question about teams and copyright: suppose you are working on a mod/game/whatever with a team and part of the team breaks off, including some of the coders. The code is mostly in the tweaking stage, so most of the code has been touched in some way by every coder. The coders on the part that has broken off then claim that the original team cannot use the code because it is, at least partially, their intellectual property. How does this work? Do the breakaway coders have a valid argument, or how would that be settled?

'''Mychaeel:''' In a real-life business relationship, there'd be a legal entity (the &quot;company&quot;) that owns the code, and all coders would have signed a contract that expressly states that the code they produce for the company becomes the company's property.  If a coder (or many coders) leave the company, the code ownership sticks with the company.  It'd be a separate question who the company itself would stick to; possibly one that'd have to be settled in a law suit.

Matters are obviously different in a mod team situation that was never formalized in any way.  Given the lack of any legally binding contract between the people from the original mod team, they all retain ownership of their own creations; and if part of the code has been worked on by several people, ''none'' of them has the right to individually use it without the other involved coders' permission.

'''Haral:''' The law will rarely factor into situations like this... Especially considering how incredibly hard it would be to prove who made what.  The only real standard for a situation like that is a moral one.  A decent argument could also be made that their work was made as part of that team, and became open for use amongst that team from the moment they sent the code out.  Kind of like posting code on a public forum.

Really though, when it comes to inner-team conflicts, the closest to law you might get is a daytime &quot;Judge&quot; show.

'''Uncommon:''' Don't forget [[Wikipedia:Trademark|trademarks]], and how that's different from copyright. People often confuse the two. The name &quot;Unreal Tournament&quot; is a trademark, while the content of the game is copyrighted. The characters in the game, and their names, may also be trademarks - particularly the more recognizable ones like Malcolm or Gorge. Copyright would apply to the actual skins and models of those chararcters.

'''Foxpaw:''' True, but I would expect that trademarks are fairly obvious - I can't see a a modder who respected copyright being unaware that they would need permission to use the term &quot;Quake&quot; as the title of their mod, or conversely a person worrying about whether or not they need permission to call their weapon mod, &quot;the BowFlex.&quot;

'''Draconx:''' You would have very little success trying to enforce trademarks on a game character name called &quot;Malcolm&quot;, reasonably common names like that having their trademarks enforced could end up with someone saying something like &quot;You are to cease using your name where other people can see/hear it&quot;.  But with a character name like Xan you likely would be able to enforce your trademarks on.

'''Foxpaw:''' But remember, that trademarks are only enforceable in the market to which they apply. So, for instance, if you did have the name Malcolm trademarked for video games, it would not invalidate a person's ability to be named Malcolm, or even another company from naming their products Malcolm, so long as it wasn't within the same market. So for instance a vacuum cleaner called &quot;Unreal&quot; would be perfectly legit.

However, it is probable that you couldn't trademark the name Malcolm, but you probrably could trademark the name Malcolm used in conjunction with the likeness of that character.

'''Uncommon:''' My point was just to call attention to the difference between the two. People often say copyright when they mean trademark.</text>
    </revision>
    <revision>
      <id>5032</id>
      <timestamp>2004-11-05T15:00:36Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The more popular modding becomes, the more often one sees mods based on existing ideas:  movies, games, and so on.  However, there is one problem inherent to all such mods:  '''Copyrights.'''

==What's Copyright?==

Movies, games, mods, they're all copyrighted to somebody.  What does this mean?  The owner of the [[Wikipedia:copyright]] is guaranteed certain privileges to his material.  This includes:

* the exclusive right to '''reproduction''',
* the exclusive right to '''derivative works''',
* the exclusive right to '''distribution''' and
* the exclusive right to '''public performance and display'''.

The most important one, as far as mods go, is the &quot;exclusive right to derivative works.&quot;  A derivative work is anything based on the original copyrighted work.

A simple example:  You can't make an Unreal Tournament mod for Quake III.  The game, along with the content, is copyrighted to Epic Games.  Or... you couldn't make an ''Independence Day'' mod (you know, the movie...).

; &quot;But we are not making profit.&quot; : It doesn't matter.  The owner still retains the right to decide what is done with their material, and they even legally ''have to'' protect it in order not to create a precedent that may cause them to lose it when it ''really'' hurts.  (And they still potentially lose money due to your mod even if you don't make any.  But regardless of that, &quot;damage&quot; is not a concept that comes in where copyright is concerned.)

; &quot;What about fair use?&quot; :  Generally, [[Wikipedia:Fair use|fair use]] is limited to a reasonably small portion of a work.  The &quot;portion&quot; however depends on the work itself.  Using a quote from a book on a website wouldn't constitute copyright infringement as it's one sentence out of thousands; copying an entire article from that website and using it is a different matter though.

What it comes down to is '''explicit permission.'''  If you don't have it, you can't do it.  Some people and companies will grant it, others won't.  Nintendo, for example, is very strict with their quality assurance and doesn't grant permissions to mod developers.  On the other hand, I recall a mod based on Square's ''Final Fantasy'' characters, and they had in fact gotten permission to use them.  But you’re better off getting a letter refusing permission before you start a mod, than getting a cease-and-desist letter six months into development.

==Why Does This Matter?==

Besides being illegal there are several other consequences of copyright infringement to consider before starting a mod project. First of all, if you're reading this you're ''probably'' a coder, level designer, 3D artist, 2D artist, or have some other talent associated with game development. And, in the course of creating content, you will (or have) put in a huge amount of time and effort into your project. And, in the end, the '''only''' way of protecting your hard work from theft by others is copyright protection. So, with that in mind, let's consider a couple of scenarios.

; Scenario A : 


You and a group of other buddies have worked hard for over a year to produce a terrific mod. Then another group of developers comes along, rips off all your content, ports it over to a newer engine over the course of just a couple of months. And then, after it's release, this new mod slowly starts stealing away your fanbase.

How upset would you be? Wouldn't you invoke your rights as the owner of that content and do everything in your power to stop it?


; Scenario B : You ''own'' the copyright to a commerical game title that is your main source of income. You rely on that income to feed your family, pay your employees, and buy all your shiny new toys. Then, along comes another game that is a direct copy of your title. And, to top it all off, this new game is a mod, available for, gasp!, ''free'' to any person with an Internet connection. So instead of having to ''buy'' your game, gamers can download another game that's almost the same for ''free''. 

Now, is it any surprise why game companies won't hesitate to slap you with a &quot;cease and desist&quot; order? The newer the game, the greater the danger to mods copying that title of being stopped dead in their tracks. Obviously, this is less of a danger to mods based on older games, but not necessarily so. You never know when a company may be planning on, or is already developing, a sequel. And if that's the case, you better believe they'll come after you.

This is why the ''&quot;but nobody's making profit&quot;'' argument doesn't work. It doesn't matter that '''you're not making profit.''' What matters is that '''they're losing profit,''' and they may even lose their intellectual property rights if they don't protect them.

==How Does This Affect the Community?==

As a development community it is our collective responsibility to maintain its health. Not only is it in our best interests to share resources and insight, it is equally in our best interests to protect the property of its individual members. Tolerating the theft of others property by current mod teams encourages that behavior in fledgling teams. And who's to say it isn't ''your'' property that's stolen next?  

Another factor to consider is the simple fact that people with the Talents necessary to publish mods are in very short supply. The is only a finite number of mods that can be in developement at any one time. Now consider a mod that's assembled a team of three or four dedicated guys that have put in hundreds of man-hours of work into their project. Then, six months into their work, the receive the dreaded &quot;cease and desist&quot; order from the game they're copying. All those man-hours of work are now wasted, when they could have been used by a mod project that has a much better chance of reaching production.

Producing a mod is an ''incredibly'' difficult thing to do, and only a miniscule percent of mods that get started ever see the light of day. And starting a mod that's a copy of another game or movie only adds to that difficulty and further reduces you chances of ever releasing, since you're starting with a ''big'' strike against you. So, every developer that joins the doomed project is one less developer that could have been used elsewhere.

The simple fact is that starting, joining, or even tolerating, mods that violate copyright law is detrimental to the community as a whole. 

==Getting Permission==

The good news is that often the only thing necessary to receive the coveted &quot;permission&quot; is a letter to the orginal producer stating your intent to produce a mod based on thier work, and your reasons for doing so. When writing this letter, there are several recommendations to getting it noticed and receiving a positive answer.

When obtaining permission to use copyrighted material, get permission for an individual, not a team, to use the material. That way, if the mod team splits up, there is no ambiguity as to who has permission to continue use of the material.

===How to Write a Good Letter===

; Snail mail vs. email : That's a judgement call, and there's no way I can answer it. The only thing I can recommend, is to do your research. Find as much contact info as you can. Find out ''who'' you need to contact and what contact info this individual posts about themselves. Often times people will have a preference, so try and find out what that is. In either case, the rest of rules apply no matter what medium you choose.

; Professionalism : Be as professional as possible. Structure it as a business letter. Use your '''real name''', not your game nick. (Sincerely, ThunderFart does ''not'' look good on a business proposal.) Use correct grammar, spelling, and punctuation (see below). The quickest way to end up in the circular file is to send a letter that looks like it was written by a 12-year-old. So, if your ''are'' a 12-year-old, or just write like one, find a buddy to write the letter for you. 

; Language : Unless the original producer is located in a non-English speaking country ''and'' you are fluent in the language of that country, your letter should be in English. English is the international business language. If English is not your first language, find a buddy who speaks english fluently to avoid mistranslations. 

; Use compliments &amp;ndash; do not brown-nose! : But, do let them know that you picked their game or movie because you ''like'' it. It's fun and entertaining, and you want to continue that tradition with your new mod. This is especially effective for an older game or movie that is no longer in production.

; Not for profit : While being non-profit won't matter if you fail to ask for permission, if you do bother to ask often this is the ''key'' to getting that permission.

; Educational : Do ''not'' say that your project is for a school project unless that is the case. However you are more than welcome to say this project is for your &quot;personal&quot; education. This is another factor that might soften them up a bit.

; Credit : If you're going to copy the game, then copy the game. Make it completely obvious what game you are emulating and give the original producer full credit for the original game.

==Summary==

I hope that this article doesn't completely discourage you from making a mod from an existing game or movie. But, I do hope it discourages you from doing one without the ''permission'' of its original owner. Copyright law is there for a reason. And before you decide it's okay to be a thief, please think long and hard about the consequences of your actions, and how you would feel if it was you being stolen from.

==Related Links==

* [[Wikipedia:Copyright]] &amp;ndash; an overview
* http://www.copyright.gov/circs/circ1.html &amp;ndash; US Copyright Office, &quot;Copyright Basics&quot;
* http://www.patent.gov.uk/copy/ &amp;ndash; UK Patent Office (Copyrights Section)

* [[Legacy:OpenUnrealModLicense|OpenUnrealModLicense]] &amp;ndash; a GPL like license without the possible issues with the closed source runtime (UnrealEngine)
* [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]] &amp;ndash; the Lesser GPL like license

==Comments==

'''BM.Deathwind:'''  I do plan on revising/editing this.  So list your suggestions/questions.

'''Cookie:''' Excellent Deathwind. This article was desperately needed. I went ahead added a few more sections that I felt elaborated on the importance of this issue. Hope you don't mind.

'''BM.Deathwind:''' Impressive!! :) I really like what you did...

'''RegularX:''' Nicely written.  The &quot;not making profit&quot; myth really needs to be plastered around everywhere.  A lot of mod groups are fans of X, whether X be Jason movies or Alien movies or Starcraft, etc., and realizing such concepts might avoid a legal letter or two.

'''OverloadUT:''' What about the topic of the copyright of the mod being developed? I expected that to be covered here, but it's not.  What I mean is: If I release a mod and include a license that says &quot;You may not use this to make dirivative works or modify this code&quot; and then someone does, do I have grounds to press charges?  I wouldn't be surprised if you automatically give up all rights to your project because it's released for an engine to which you do not have a license. Does anybody know the answer to this?

'''Mychaeel:''' What's written here about other people's rights to their intellectual property naturally applies to mods as well.  I've changed the first paragraph to make that more obvious.  You actually don't even have to include a license that states that you own the copyright &amp;ndash; you do, by default.

'''OverloadUT:''' Okay, I've got a more tricky situation. I'll use a real life relevant scenario: I'm making a CTF4 mod, which adds four team support to UT2004.  This is nice because it allows anyone to make a 4 team mod by using my gameclass as a base. But if on release I said that no one is allowed to make a mod that uses my code as a base, does that hold?  The difference being that I have not created anything particuarly innovative.  &quot;4-team gameplay&quot; is probably not something I can copyright. And if someone makes a mod that sits on top of my code without actually changing my code or stealing any of my code, are they doing anything (legally) wrong? Please note that this is simply a question for the sake of knowing the answer. I don't really have an issue with someone using CTF4 as a base for another mod.

'''Foxpaw:''' It not being innovative or revolutionary is irrelevant. If you wrote a book that was essentially an age-old story rehased, you still have copyright over it - even if it's &quot;nothing new.&quot; Whether or not it's innovative is an issue that applies to patent law, which is not the same as copyright.

However: As for whether or not they are doing anything wrong if they derive off of your classes and don't include any code: That's a bit tricky, but I think it would be legal - after all, their code only makes reference to your work, much like Coles notes, or a book report might make reference to your work.

However, it's not quite the same, since one can still read (make use of) a book report without the book in question, while a person would not be able to use code that referenced your code without having your (compiled) work. In addition, one might logically argue that their package is linked to yours at runtime by the virtual machine and thus constitutes a derivative work, but I doubt many judges would understand what that means, so.. err, that might not work. ;)

You could, in that case, maybe argue that the license does not allow them to view your code, which would be required in order to derive from the class. (Unless they claim they just &quot;guessed&quot; the function names, etc. ;))

A person might also be able to include a clause specifically forbidding such use, (not sure how well that would stand up) and you could certainately restrict redistribution, though then they could still link and state that you had to download the CTF4 mod separate from theirs.

Hrm, and if you did that, you could change function and variable names with each new release, and if the license only allowed to most recent version to be mirrored, then I SUPPOSE you could prevent such behaviour that way. Though that's probrably not ideal.

In the end I think it would mostly come down to your (or your lawyers') ability to convince the judge. It seems like a person OUGHT TO have control over that sort of thing, but the challenge would lie in explaining OOP and how it relates to what the person has done.

'''Foxpaw:''' Err.. doh! Just thought when I put that edit in; console manufacturers like Nintendo have a legal ability to control what games are released for their platform: so there is some legal background to the notion that a copyright holder can have some control over what software is run on their platform - you would only have to argue that your copyrighted work is being used as a software platform for another piece of software.

'''Mychaeel:''' You can keep people from creating &quot;derivative works&quot; of your code (and what's a subclass if not, literally, a &quot;derivative work&quot;?).  However, you have no right on the &quot;four teams&quot; idea just because you implemented it first &amp;ndash; that's the difference between ''copyright'' and ''patents''.  You could (probably, sadly) ''patent'' the idea of having four teams instead of two fighting against each other, but you cannot ''copyright'' it &amp;ndash; just your code that implements it.  Anybody else can come up with the same idea and legally implement it on their own.

'''OverloadUT:''' Okay, that makes sense. Thanks for the answers! I think I was getting patents and copyrights confused.  I have another situation to ponder though: Let's say I wanted to add custom loading screens for my mod, based on what map is loading. To do this, I would remember that Jailbreak did that very thing, so I would look at that code and see how they did it.  If I implemented that code in to my mod without permission, is that copyright violation?  What if I asked for permission and they denied it? I mean, I've seen how the code works now, and I could &quot;rewrite&quot; the code but since their way is the best way to do it, it might end up looking like the exact same code. How does that work? Can you copyright the ''method'' that you used to implement a feature? That sounds more like a patent to me. And if you '''can''' copyright the method, how much code has to be copied before it's considered stealing the source? In this example, the loading thing is only about 5 lines of code. It hardly seems like copying, but I wouldn't have been able to come up with it myself. What if it were a much larger chunk of code, like the GUIHook system that Jailbreak uses?  (Can you tell I've learned a lot from Jailbreak? You guys are geniuses.)

'''Foxpaw:''' No. Once again, that's a patent which is different. However, I wrote up the necessary bits required to do that on the wiki long ago. If you copied the code from another mod, without permission, that might be a violation of copyright. If you decompiled or reverse engineered their code without permission that might also be a violation of copyright. (I say might because it will vary based on what sort of license the mod was released under, and the laws in your particular country.)

As for it ending up looking the same.. well, that's a bit of a tricky one. From a moral perspective I would say no. However, one has to consider: if you read a book, then wanted to write a book on that topic, but you wrote exactly what they wrote because you felt that was the best way to express it: would that be copyright infringement? It would, of course, so the same logic could probrably apply to this situation.

However, considering that I wrote up all the info you need almost a year ago on the wiki, one could reasonably argue that the methods are public knowledge. See [[Legacy:Vignette|Vignette]]. I didn't want to make it tutorial-like, so there isn't any &quot;hand holding&quot; per se, but all the information you should need is pretty plainly laid out.

'''Mychaeel:''' Being the one who made that Jailbreak JBGUIHook code, I assure you that [[Legacy:Vignette|Vignette]] has little to do with it. &amp;ndash; OverloadUT: If, just for the sake of the argument, the Jailbreak team didn't give you permission to use their code, copying their code would be exactly what copyright does ''not'' allow you to do.  The difference between a patent and copyright is just that copyright would allow you to re-invent the same technique on your own without copying it, while a patent means that even if you thought it up all by yourself and perhaps didn't even know about the patent, you still wouldn't be allowed to use it.

'''Foxpaw:''' Err, yes. I was referring to the custom loading screens. I don't know what the Jailbreak &quot;GUI hooks&quot; refers to.

'''Mychaeel:''' I'm confusing my own code here...  JBGUIHook is responsible for Jailbreak's custom menu music and the &quot;Add-Ons&quot; tab which is dynamically added to the game setup screen.  Jailbreak ''also'' replaces the loading screens by map-specific custom ones, and ''that'' code is what I was referring to as having little to do with the bit that's written up on [[Legacy:Vignette|Vignette]].

'''Foxpaw:''' Err. Hmm. May I look at the code for Jailbreak to see what you have done there? I don't see how else one could alter the loading screens without making use of the [[Legacy:Vignette|Vignette]] class, but I'd be interested to see what you have done there.

'''Mychaeel:''' Jailbreak integrates into the game as (yet another) game type and thus doesn't have it's own .ini file.  Thus, Jailbreak's implementation of the static GetLoadingHint function modifies the existing [[Legacy:UT2K4ServerLoading|UT2K4ServerLoading]] object (subclass of [[Legacy:Vignette|Vignette]]) to replace the default UT2004 loading screen rather than creating its own [[Legacy:Vignette|Vignette]] subclass and registering it in an .ini file.  (I'd link you to JDN for the code, but unfortunately it's down at the moment and I won't be able to look into that problem until later tonight.)

===Teams and Copyright Permission===

'''GRAF!K:''' What would happen if a mod team got permission to use copyrighted material, then broke up? Then you would have a bunch of modders fighting over the copyright permissions. What would be the legally correct thing to do?

I'm going to try and get permission from Hasbro to use Nerf&amp;copy; material in [[Legacy:Nytro|my mod]], but I thought I would consider this a bit first.

'''Mychaeel:''' Permission to use somebody's copyrighted material sticks with a certain mod concept.  So if some people of that team continue working on the very same project,the copyright holder won't even care.  However, if each faction of the team starts a new project only roughly along the lines of the old, you have to inquire for permission individually again.

'''Foxpaw:''' What if the team were to split in half, and both halves wanted to continue production from where they were before? Where does the copyright lie in this case? Do both parties retain copyright priviledges as they had the copyrights when they were part of the original team? Is the copyright retained by whichever team has the name that the copyright was originally assigned to, and thus belong to whichever team contains the person who founded the team?

'''RegularX:''' Most companies would have you sign a legal document that would explain exactly how they define the party being granted the license.  Quite possibly both would lose copyright privs, have to ask the holder again (who would probably just be annoyed and drop it at that point). Or it would be in the hands of one principal person (the mod founder).  Point is, a copyright license is a singular entity, it doesn't duplicate due to the number of people on a team, you can't re-divide it up after it's granted.

'''GRAF!K:''' The point is, though, that after a team split up, everyone would claim that ''they'' own the team and therefore the copyright.

'''Mychaeel:''' At the end of the day it's the copyright owner's decision who gets permission to use it for what purpose.  If two factions end up bickering about permission that was previously granted to the entire team for a certain project, chances are that the copyright owner behaves as RegularX suggests and makes clear that the original permission was only granted to the entire original team ''and'' project, not the two halves of it.  If in doubt, ask the only entity that has a say in this: the copyright holder.

'''Foxpaw:''' Okay, I have another question about teams and copyright: suppose you are working on a mod/game/whatever with a team and part of the team breaks off, including some of the coders. The code is mostly in the tweaking stage, so most of the code has been touched in some way by every coder. The coders on the part that has broken off then claim that the original team cannot use the code because it is, at least partially, their intellectual property. How does this work? Do the breakaway coders have a valid argument, or how would that be settled?

'''Mychaeel:''' In a real-life business relationship, there'd be a legal entity (the &quot;company&quot;) that owns the code, and all coders would have signed a contract that expressly states that the code they produce for the company becomes the company's property.  If a coder (or many coders) leave the company, the code ownership sticks with the company.  It'd be a separate question who the company itself would stick to; possibly one that'd have to be settled in a law suit.

Matters are obviously different in a mod team situation that was never formalized in any way.  Given the lack of any legally binding contract between the people from the original mod team, they all retain ownership of their own creations; and if part of the code has been worked on by several people, ''none'' of them has the right to individually use it without the other involved coders' permission.

'''Haral:''' The law will rarely factor into situations like this... Especially considering how incredibly hard it would be to prove who made what.  The only real standard for a situation like that is a moral one.  A decent argument could also be made that their work was made as part of that team, and became open for use amongst that team from the moment they sent the code out.  Kind of like posting code on a public forum.

Really though, when it comes to inner-team conflicts, the closest to law you might get is a daytime &quot;Judge&quot; show.

'''Uncommon:''' Don't forget [[Wikipedia:Trademark|trademarks]], and how that's different from copyright. People often confuse the two. The name &quot;Unreal Tournament&quot; is a trademark, while the content of the game is copyrighted. The characters in the game, and their names, may also be trademarks - particularly the more recognizable ones like Malcolm or Gorge. Copyright would apply to the actual skins and models of those chararcters.

'''Foxpaw:''' True, but I would expect that trademarks are fairly obvious - I can't see a a modder who respected copyright being unaware that they would need permission to use the term &quot;Quake&quot; as the title of their mod, or conversely a person worrying about whether or not they need permission to call their weapon mod, &quot;the BowFlex.&quot;

'''Draconx:''' You would have very little success trying to enforce trademarks on a game character name called &quot;Malcolm&quot;, reasonably common names like that having their trademarks enforced could end up with someone saying something like &quot;You are to cease using your name where other people can see/hear it&quot;.  But with a character name like Xan you likely would be able to enforce your trademarks on.

'''Foxpaw:''' But remember, that trademarks are only enforceable in the market to which they apply. So, for instance, if you did have the name Malcolm trademarked for video games, it would not invalidate a person's ability to be named Malcolm, or even another company from naming their products Malcolm, so long as it wasn't within the same market. So for instance a vacuum cleaner called &quot;Unreal&quot; would be perfectly legit.

However, it is probable that you couldn't trademark the name Malcolm, but you probrably could trademark the name Malcolm used in conjunction with the likeness of that character.</text>
    </revision>
    <revision>
      <id>5033</id>
      <timestamp>2004-11-05T19:58:33Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>my point</comment>
      <text xml:space="preserve">The more popular modding becomes, the more often one sees mods based on existing ideas:  movies, games, and so on.  However, there is one problem inherent to all such mods:  '''Copyrights.'''

==What's Copyright?==

Movies, games, mods, they're all copyrighted to somebody.  What does this mean?  The owner of the [[Wikipedia:copyright]] is guaranteed certain privileges to his material.  This includes:

* the exclusive right to '''reproduction''',
* the exclusive right to '''derivative works''',
* the exclusive right to '''distribution''' and
* the exclusive right to '''public performance and display'''.

The most important one, as far as mods go, is the &quot;exclusive right to derivative works.&quot;  A derivative work is anything based on the original copyrighted work.

A simple example:  You can't make an Unreal Tournament mod for Quake III.  The game, along with the content, is copyrighted to Epic Games.  Or... you couldn't make an ''Independence Day'' mod (you know, the movie...).

; &quot;But we are not making profit.&quot; : It doesn't matter.  The owner still retains the right to decide what is done with their material, and they even legally ''have to'' protect it in order not to create a precedent that may cause them to lose it when it ''really'' hurts.  (And they still potentially lose money due to your mod even if you don't make any.  But regardless of that, &quot;damage&quot; is not a concept that comes in where copyright is concerned.)

; &quot;What about fair use?&quot; :  Generally, [[Wikipedia:Fair use|fair use]] is limited to a reasonably small portion of a work.  The &quot;portion&quot; however depends on the work itself.  Using a quote from a book on a website wouldn't constitute copyright infringement as it's one sentence out of thousands; copying an entire article from that website and using it is a different matter though.

What it comes down to is '''explicit permission.'''  If you don't have it, you can't do it.  Some people and companies will grant it, others won't.  Nintendo, for example, is very strict with their quality assurance and doesn't grant permissions to mod developers.  On the other hand, I recall a mod based on Square's ''Final Fantasy'' characters, and they had in fact gotten permission to use them.  But you’re better off getting a letter refusing permission before you start a mod, than getting a cease-and-desist letter six months into development.

==Why Does This Matter?==

Besides being illegal there are several other consequences of copyright infringement to consider before starting a mod project. First of all, if you're reading this you're ''probably'' a coder, level designer, 3D artist, 2D artist, or have some other talent associated with game development. And, in the course of creating content, you will (or have) put in a huge amount of time and effort into your project. And, in the end, the '''only''' way of protecting your hard work from theft by others is copyright protection. So, with that in mind, let's consider a couple of scenarios.

; Scenario A : 


You and a group of other buddies have worked hard for over a year to produce a terrific mod. Then another group of developers comes along, rips off all your content, ports it over to a newer engine over the course of just a couple of months. And then, after it's release, this new mod slowly starts stealing away your fanbase.

How upset would you be? Wouldn't you invoke your rights as the owner of that content and do everything in your power to stop it?


; Scenario B : You ''own'' the copyright to a commerical game title that is your main source of income. You rely on that income to feed your family, pay your employees, and buy all your shiny new toys. Then, along comes another game that is a direct copy of your title. And, to top it all off, this new game is a mod, available for, gasp!, ''free'' to any person with an Internet connection. So instead of having to ''buy'' your game, gamers can download another game that's almost the same for ''free''. 

Now, is it any surprise why game companies won't hesitate to slap you with a &quot;cease and desist&quot; order? The newer the game, the greater the danger to mods copying that title of being stopped dead in their tracks. Obviously, this is less of a danger to mods based on older games, but not necessarily so. You never know when a company may be planning on, or is already developing, a sequel. And if that's the case, you better believe they'll come after you.

This is why the ''&quot;but nobody's making profit&quot;'' argument doesn't work. It doesn't matter that '''you're not making profit.''' What matters is that '''they're losing profit,''' and they may even lose their intellectual property rights if they don't protect them.

==How Does This Affect the Community?==

As a development community it is our collective responsibility to maintain its health. Not only is it in our best interests to share resources and insight, it is equally in our best interests to protect the property of its individual members. Tolerating the theft of others property by current mod teams encourages that behavior in fledgling teams. And who's to say it isn't ''your'' property that's stolen next?  

Another factor to consider is the simple fact that people with the Talents necessary to publish mods are in very short supply. The is only a finite number of mods that can be in developement at any one time. Now consider a mod that's assembled a team of three or four dedicated guys that have put in hundreds of man-hours of work into their project. Then, six months into their work, the receive the dreaded &quot;cease and desist&quot; order from the game they're copying. All those man-hours of work are now wasted, when they could have been used by a mod project that has a much better chance of reaching production.

Producing a mod is an ''incredibly'' difficult thing to do, and only a miniscule percent of mods that get started ever see the light of day. And starting a mod that's a copy of another game or movie only adds to that difficulty and further reduces you chances of ever releasing, since you're starting with a ''big'' strike against you. So, every developer that joins the doomed project is one less developer that could have been used elsewhere.

The simple fact is that starting, joining, or even tolerating, mods that violate copyright law is detrimental to the community as a whole. 

==Getting Permission==

The good news is that often the only thing necessary to receive the coveted &quot;permission&quot; is a letter to the orginal producer stating your intent to produce a mod based on thier work, and your reasons for doing so. When writing this letter, there are several recommendations to getting it noticed and receiving a positive answer.

When obtaining permission to use copyrighted material, get permission for an individual, not a team, to use the material. That way, if the mod team splits up, there is no ambiguity as to who has permission to continue use of the material.

===How to Write a Good Letter===

; Snail mail vs. email : That's a judgement call, and there's no way I can answer it. The only thing I can recommend, is to do your research. Find as much contact info as you can. Find out ''who'' you need to contact and what contact info this individual posts about themselves. Often times people will have a preference, so try and find out what that is. In either case, the rest of rules apply no matter what medium you choose.

; Professionalism : Be as professional as possible. Structure it as a business letter. Use your '''real name''', not your game nick. (Sincerely, ThunderFart does ''not'' look good on a business proposal.) Use correct grammar, spelling, and punctuation (see below). The quickest way to end up in the circular file is to send a letter that looks like it was written by a 12-year-old. So, if your ''are'' a 12-year-old, or just write like one, find a buddy to write the letter for you. 

; Language : Unless the original producer is located in a non-English speaking country ''and'' you are fluent in the language of that country, your letter should be in English. English is the international business language. If English is not your first language, find a buddy who speaks english fluently to avoid mistranslations. 

; Use compliments &amp;ndash; do not brown-nose! : But, do let them know that you picked their game or movie because you ''like'' it. It's fun and entertaining, and you want to continue that tradition with your new mod. This is especially effective for an older game or movie that is no longer in production.

; Not for profit : While being non-profit won't matter if you fail to ask for permission, if you do bother to ask often this is the ''key'' to getting that permission.

; Educational : Do ''not'' say that your project is for a school project unless that is the case. However you are more than welcome to say this project is for your &quot;personal&quot; education. This is another factor that might soften them up a bit.

; Credit : If you're going to copy the game, then copy the game. Make it completely obvious what game you are emulating and give the original producer full credit for the original game.

==Summary==

I hope that this article doesn't completely discourage you from making a mod from an existing game or movie. But, I do hope it discourages you from doing one without the ''permission'' of its original owner. Copyright law is there for a reason. And before you decide it's okay to be a thief, please think long and hard about the consequences of your actions, and how you would feel if it was you being stolen from.

==Related Links==

* [[Wikipedia:Copyright]] &amp;ndash; an overview
* http://www.copyright.gov/circs/circ1.html &amp;ndash; US Copyright Office, &quot;Copyright Basics&quot;
* http://www.patent.gov.uk/copy/ &amp;ndash; UK Patent Office (Copyrights Section)

* [[Legacy:OpenUnrealModLicense|OpenUnrealModLicense]] &amp;ndash; a GPL like license without the possible issues with the closed source runtime (UnrealEngine)
* [[Legacy:LesserOpenUnrealModLicense|LesserOpenUnrealModLicense]] &amp;ndash; the Lesser GPL like license

==Comments==

'''BM.Deathwind:'''  I do plan on revising/editing this.  So list your suggestions/questions.

'''Cookie:''' Excellent Deathwind. This article was desperately needed. I went ahead added a few more sections that I felt elaborated on the importance of this issue. Hope you don't mind.

'''BM.Deathwind:''' Impressive!! :) I really like what you did...

'''RegularX:''' Nicely written.  The &quot;not making profit&quot; myth really needs to be plastered around everywhere.  A lot of mod groups are fans of X, whether X be Jason movies or Alien movies or Starcraft, etc., and realizing such concepts might avoid a legal letter or two.

'''OverloadUT:''' What about the topic of the copyright of the mod being developed? I expected that to be covered here, but it's not.  What I mean is: If I release a mod and include a license that says &quot;You may not use this to make dirivative works or modify this code&quot; and then someone does, do I have grounds to press charges?  I wouldn't be surprised if you automatically give up all rights to your project because it's released for an engine to which you do not have a license. Does anybody know the answer to this?

'''Mychaeel:''' What's written here about other people's rights to their intellectual property naturally applies to mods as well.  I've changed the first paragraph to make that more obvious.  You actually don't even have to include a license that states that you own the copyright &amp;ndash; you do, by default.

'''OverloadUT:''' Okay, I've got a more tricky situation. I'll use a real life relevant scenario: I'm making a CTF4 mod, which adds four team support to UT2004.  This is nice because it allows anyone to make a 4 team mod by using my gameclass as a base. But if on release I said that no one is allowed to make a mod that uses my code as a base, does that hold?  The difference being that I have not created anything particuarly innovative.  &quot;4-team gameplay&quot; is probably not something I can copyright. And if someone makes a mod that sits on top of my code without actually changing my code or stealing any of my code, are they doing anything (legally) wrong? Please note that this is simply a question for the sake of knowing the answer. I don't really have an issue with someone using CTF4 as a base for another mod.

'''Foxpaw:''' It not being innovative or revolutionary is irrelevant. If you wrote a book that was essentially an age-old story rehased, you still have copyright over it - even if it's &quot;nothing new.&quot; Whether or not it's innovative is an issue that applies to patent law, which is not the same as copyright.

However: As for whether or not they are doing anything wrong if they derive off of your classes and don't include any code: That's a bit tricky, but I think it would be legal - after all, their code only makes reference to your work, much like Coles notes, or a book report might make reference to your work.

However, it's not quite the same, since one can still read (make use of) a book report without the book in question, while a person would not be able to use code that referenced your code without having your (compiled) work. In addition, one might logically argue that their package is linked to yours at runtime by the virtual machine and thus constitutes a derivative work, but I doubt many judges would understand what that means, so.. err, that might not work. ;)

You could, in that case, maybe argue that the license does not allow them to view your code, which would be required in order to derive from the class. (Unless they claim they just &quot;guessed&quot; the function names, etc. ;))

A person might also be able to include a clause specifically forbidding such use, (not sure how well that would stand up) and you could certainately restrict redistribution, though then they could still link and state that you had to download the CTF4 mod separate from theirs.

Hrm, and if you did that, you could change function and variable names with each new release, and if the license only allowed to most recent version to be mirrored, then I SUPPOSE you could prevent such behaviour that way. Though that's probrably not ideal.

In the end I think it would mostly come down to your (or your lawyers') ability to convince the judge. It seems like a person OUGHT TO have control over that sort of thing, but the challenge would lie in explaining OOP and how it relates to what the person has done.

'''Foxpaw:''' Err.. doh! Just thought when I put that edit in; console manufacturers like Nintendo have a legal ability to control what games are released for their platform: so there is some legal background to the notion that a copyright holder can have some control over what software is run on their platform - you would only have to argue that your copyrighted work is being used as a software platform for another piece of software.

'''Mychaeel:''' You can keep people from creating &quot;derivative works&quot; of your code (and what's a subclass if not, literally, a &quot;derivative work&quot;?).  However, you have no right on the &quot;four teams&quot; idea just because you implemented it first &amp;ndash; that's the difference between ''copyright'' and ''patents''.  You could (probably, sadly) ''patent'' the idea of having four teams instead of two fighting against each other, but you cannot ''copyright'' it &amp;ndash; just your code that implements it.  Anybody else can come up with the same idea and legally implement it on their own.

'''OverloadUT:''' Okay, that makes sense. Thanks for the answers! I think I was getting patents and copyrights confused.  I have another situation to ponder though: Let's say I wanted to add custom loading screens for my mod, based on what map is loading. To do this, I would remember that Jailbreak did that very thing, so I would look at that code and see how they did it.  If I implemented that code in to my mod without permission, is that copyright violation?  What if I asked for permission and they denied it? I mean, I've seen how the code works now, and I could &quot;rewrite&quot; the code but since their way is the best way to do it, it might end up looking like the exact same code. How does that work? Can you copyright the ''method'' that you used to implement a feature? That sounds more like a patent to me. And if you '''can''' copyright the method, how much code has to be copied before it's considered stealing the source? In this example, the loading thing is only about 5 lines of code. It hardly seems like copying, but I wouldn't have been able to come up with it myself. What if it were a much larger chunk of code, like the GUIHook system that Jailbreak uses?  (Can you tell I've learned a lot from Jailbreak? You guys are geniuses.)

'''Foxpaw:''' No. Once again, that's a patent which is different. However, I wrote up the necessary bits required to do that on the wiki long ago. If you copied the code from another mod, without permission, that might be a violation of copyright. If you decompiled or reverse engineered their code without permission that might also be a violation of copyright. (I say might because it will vary based on what sort of license the mod was released under, and the laws in your particular country.)

As for it ending up looking the same.. well, that's a bit of a tricky one. From a moral perspective I would say no. However, one has to consider: if you read a book, then wanted to write a book on that topic, but you wrote exactly what they wrote because you felt that was the best way to express it: would that be copyright infringement? It would, of course, so the same logic could probrably apply to this situation.

However, considering that I wrote up all the info you need almost a year ago on the wiki, one could reasonably argue that the methods are public knowledge. See [[Legacy:Vignette|Vignette]]. I didn't want to make it tutorial-like, so there isn't any &quot;hand holding&quot; per se, but all the information you should need is pretty plainly laid out.

'''Mychaeel:''' Being the one who made that Jailbreak JBGUIHook code, I assure you that [[Legacy:Vignette|Vignette]] has little to do with it. &amp;ndash; OverloadUT: If, just for the sake of the argument, the Jailbreak team didn't give you permission to use their code, copying their code would be exactly what copyright does ''not'' allow you to do.  The difference between a patent and copyright is just that copyright would allow you to re-invent the same technique on your own without copying it, while a patent means that even if you thought it up all by yourself and perhaps didn't even know about the patent, you still wouldn't be allowed to use it.

'''Foxpaw:''' Err, yes. I was referring to the custom loading screens. I don't know what the Jailbreak &quot;GUI hooks&quot; refers to.

'''Mychaeel:''' I'm confusing my own code here...  JBGUIHook is responsible for Jailbreak's custom menu music and the &quot;Add-Ons&quot; tab which is dynamically added to the game setup screen.  Jailbreak ''also'' replaces the loading screens by map-specific custom ones, and ''that'' code is what I was referring to as having little to do with the bit that's written up on [[Legacy:Vignette|Vignette]].

'''Foxpaw:''' Err. Hmm. May I look at the code for Jailbreak to see what you have done there? I don't see how else one could alter the loading screens without making use of the [[Legacy:Vignette|Vignette]] class, but I'd be interested to see what you have done there.

'''Mychaeel:''' Jailbreak integrates into the game as (yet another) game type and thus doesn't have it's own .ini file.  Thus, Jailbreak's implementation of the static GetLoadingHint function modifies the existing [[Legacy:UT2K4ServerLoading|UT2K4ServerLoading]] object (subclass of [[Legacy:Vignette|Vignette]]) to replace the default UT2004 loading screen rather than creating its own [[Legacy:Vignette|Vignette]] subclass and registering it in an .ini file.  (I'd link you to JDN for the code, but unfortunately it's down at the moment and I won't be able to look into that problem until later tonight.)

===Teams and Copyright Permission===

'''GRAF!K:''' What would happen if a mod team got permission to use copyrighted material, then broke up? Then you would have a bunch of modders fighting over the copyright permissions. What would be the legally correct thing to do?

I'm going to try and get permission from Hasbro to use Nerf&amp;copy; material in [[Legacy:Nytro|my mod]], but I thought I would consider this a bit first.

'''Mychaeel:''' Permission to use somebody's copyrighted material sticks with a certain mod concept.  So if some people of that team continue working on the very same project,the copyright holder won't even care.  However, if each faction of the team starts a new project only roughly along the lines of the old, you have to inquire for permission individually again.

'''Foxpaw:''' What if the team were to split in half, and both halves wanted to continue production from where they were before? Where does the copyright lie in this case? Do both parties retain copyright priviledges as they had the copyrights when they were part of the original team? Is the copyright retained by whichever team has the name that the copyright was originally assigned to, and thus belong to whichever team contains the person who founded the team?

'''RegularX:''' Most companies would have you sign a legal document that would explain exactly how they define the party being granted the license.  Quite possibly both would lose copyright privs, have to ask the holder again (who would probably just be annoyed and drop it at that point). Or it would be in the hands of one principal person (the mod founder).  Point is, a copyright license is a singular entity, it doesn't duplicate due to the number of people on a team, you can't re-divide it up after it's granted.

'''GRAF!K:''' The point is, though, that after a team split up, everyone would claim that ''they'' own the team and therefore the copyright.

'''Mychaeel:''' At the end of the day it's the copyright owner's decision who gets permission to use it for what purpose.  If two factions end up bickering about permission that was previously granted to the entire team for a certain project, chances are that the copyright owner behaves as RegularX suggests and makes clear that the original permission was only granted to the entire original team ''and'' project, not the two halves of it.  If in doubt, ask the only entity that has a say in this: the copyright holder.

'''Foxpaw:''' Okay, I have another question about teams and copyright: suppose you are working on a mod/game/whatever with a team and part of the team breaks off, including some of the coders. The code is mostly in the tweaking stage, so most of the code has been touched in some way by every coder. The coders on the part that has broken off then claim that the original team cannot use the code because it is, at least partially, their intellectual property. How does this work? Do the breakaway coders have a valid argument, or how would that be settled?

'''Mychaeel:''' In a real-life business relationship, there'd be a legal entity (the &quot;company&quot;) that owns the code, and all coders would have signed a contract that expressly states that the code they produce for the company becomes the company's property.  If a coder (or many coders) leave the company, the code ownership sticks with the company.  It'd be a separate question who the company itself would stick to; possibly one that'd have to be settled in a law suit.

Matters are obviously different in a mod team situation that was never formalized in any way.  Given the lack of any legally binding contract between the people from the original mod team, they all retain ownership of their own creations; and if part of the code has been worked on by several people, ''none'' of them has the right to individually use it without the other involved coders' permission.

'''Haral:''' The law will rarely factor into situations like this... Especially considering how incredibly hard it would be to prove who made what.  The only real standard for a situation like that is a moral one.  A decent argument could also be made that their work was made as part of that team, and became open for use amongst that team from the moment they sent the code out.  Kind of like posting code on a public forum.

Really though, when it comes to inner-team conflicts, the closest to law you might get is a daytime &quot;Judge&quot; show.

'''Uncommon:''' Don't forget [[Wikipedia:Trademark|trademarks]], and how that's different from copyright. People often confuse the two. The name &quot;Unreal Tournament&quot; is a trademark, while the content of the game is copyrighted. The characters in the game, and their names, may also be trademarks - particularly the more recognizable ones like Malcolm or Gorge. Copyright would apply to the actual skins and models of those chararcters.

'''Foxpaw:''' True, but I would expect that trademarks are fairly obvious - I can't see a a modder who respected copyright being unaware that they would need permission to use the term &quot;Quake&quot; as the title of their mod, or conversely a person worrying about whether or not they need permission to call their weapon mod, &quot;the BowFlex.&quot;

'''Draconx:''' You would have very little success trying to enforce trademarks on a game character name called &quot;Malcolm&quot;, reasonably common names like that having their trademarks enforced could end up with someone saying something like &quot;You are to cease using your name where other people can see/hear it&quot;.  But with a character name like Xan you likely would be able to enforce your trademarks on.

'''Foxpaw:''' But remember, that trademarks are only enforceable in the market to which they apply. So, for instance, if you did have the name Malcolm trademarked for video games, it would not invalidate a person's ability to be named Malcolm, or even another company from naming their products Malcolm, so long as it wasn't within the same market. So for instance a vacuum cleaner called &quot;Unreal&quot; would be perfectly legit.

However, it is probable that you couldn't trademark the name Malcolm, but you probrably could trademark the name Malcolm used in conjunction with the likeness of that character.

'''Uncommon:''' My point was just to call attention to the difference between the two. People often say copyright when they mean trademark.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas</title>
    <id>2026</id>
    <revision>
      <id>4941</id>
      <timestamp>2008-01-26T11:22:49Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''Mod Ideas''' page is a place for suggesting and debating mod ideas for any [[Legacy:Unreal Engine|Unreal Engine]] based games.  Although the primary focus is on [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] this will change over time as more Unreal Engine games get released. It may even lead to new mods being created. This page grew out of a scratch pad of the stressed ramblings of [[Legacy:EntropicLqd|EntropicLqd]], father, or menagerie-keeper as he would style it.

This page is part of the [[Legacy:Project FAQ|Unreal Wiki]] site. That means anyone can add text or edit the material that is here. It's a collaborative environment, and newcomers should read [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] before making edits. To see what is new since your last visit, see [[Legacy:Recent Changes|Recent Changes]] or the '''(diff)''' and '''View other revisions''' links at the foot of this page. 

The guidelines for using this page are still rough, so open to suggestion.

; It's Open! : Firstly, when adding an idea to this page be aware that you are opening it up to comment from any casual passer by.  Be prepared to be met with stony silence or many suggestions.  As well as opening the idea up for comment you are also giving up some ownership of the mod &amp;ndash; someone else may write it before you.

; Commenting : When commenting on an idea, add your comments to the ''discussion'' section of the mod.  Allow the original owner of the idea to refactor their mod description to include your suggestion should they like it &amp;ndash; and be prepared for your suggestion to simply be ignored or rebuffed.  It's not personal.

; Expressing Interest : If you are interested in writing a mod, but haven't got time to do it right now, add your name to the ''Interested Scripters'' list.  Before you start work on a mod idea listed on this page you are responsible for checking to see if anyone else has started the mod before you.  The aim here is to contribute effort rather than duplicate effort.  If someone else has started the mod feel free to offer help, but again, be prepared for your offer to be turned down (some of these mods are way to small to be built by more than one person). You really also want to read [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] before starting ''any'' project...

; Delivery : Once you decide to go into &quot;delivery mode&quot; with an idea here make that fact plain within the ''Interested Scripters'' section.  It would also be nice if you added a journal page to the Wiki on [[:Category:Legacy Journal]]  for the mod.  The journal should read more like a tutorial rather than a diary and explain why you decided to do things the way you did, as well as how you did them.  A journal is by no means a requirement, but it would be nice.

There's also a corresponding [[Legacy:Map Ideas|Map Ideas]] page for ideas for mappers making maps.

'''Please''' only post a project idea here if you actually plan to work on it.

==Wider Reading ==

Other pages on the nature of mods, how to make them, and how to make them good.
* [[Legacy:Gameplay|Gameplay]] - what is gameplay? what makes ''good'' gameplay?
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; essential rant
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]
* ... and generally, the rest of the Unreal Wiki, maybe starting with [[Legacy:UnrealScript|UnrealScript]].
* and you can use the [[Legacy:ScratchPad|ScratchPad]] to work on code

==ONS Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirCombat]] &amp;ndash; Aerial dogfighting Onslaught style.

==CTF Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TurnCoat]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Balanced CTF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CarJack]] &amp;ndash; Steal all the cars on the map, and park them at your base.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CarryTheFlag]] &amp;ndash; Carry the flag home rather than simply touch it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cold War]] &amp;ndash; Collect, attack and defend parts for your nuke!
* [[Legacy:Mapping For DrawBridges|Mapping for DrawBridges]] &amp;ndash; Get control of a central room, lower your bridge at steal that flag!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ExpertCTF]] &amp;ndash; All weapons given, regen health and ammo and off-hand hook.  See www.planetquake.com/expert for details.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/LonelyFlag]] &amp;ndash; Two teams compete for a single flag.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiCTF]] &amp;ndash; Aka CTF+, CTF4, I'd like to get a combined mod going for this.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Reversed CTF]] &amp;ndash; Only a little modification make things more hectic
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TouchDown]] &amp;ndash; Effectively Bombing Run with an attacking and defending team that swap over.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealBallPool]] &amp;ndash; Collect the most balls at your flag base to win (Maybe Dom maps would work better?).

==DOM Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DestructionDOM]] &amp;ndash; Control points need to be destroyed to be captured.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dompendant]] &amp;ndash; You, i mean you, are by yourself!!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KOTH]] &amp;ndash; King of the Hill mod (one DOM point).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Power Domination]] &amp;ndash; Dominate the power nodes of an Onslaught map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RandomDOM]] &amp;ndash; 6+ Dom points but only a random 2 work
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Triple Domination]] &amp;ndash; 50% more domination than Double Domination!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealSprint]] &amp;ndash; Touch consecutive control points without dying to score points.

==New Game Types ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Anagram]] &amp;ndash; A team word game with big weapons.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CatchTheSmurf]] &amp;ndash; Catch that Smurf!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ColorfulWarriors]]&amp;ndash; A Flying Airboats Mod w/ Giant GreenNalis, 25-30 Colorful Warriors skins, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DaiymoDefense]] &amp;ndash; Everybody likes ninjas and samurai.  Think VIP Assassination with katanas, bows, and blowguns.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DownhillUT]] &amp;ndash; Bobsleding and Snowboarding meets Back To The Future meets Super Mario Kart meets UT2k3
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Extreme Co-Op]] &amp;ndash; Advanced UT2k3 Co-operative Mod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/False Prophets]] &amp;ndash; Defend your prophet or die trying
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FishFood]] &amp;ndash; Who can be the biggest fish in the pond then?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Gladiator]] &amp;ndash; Only the Gladiator can frag!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/IceClimbUT]] &amp;ndash; a single player mod that you have to climb obstacles and stay away from ice spikes. Inspired from the TI-83+ game ''IceClimb''.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KarmaCrossfire]] &amp;ndash; 2 players, 2 stationary guns, 2 goals, a Karma ball and lots of explosions
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KillingSpree]] &amp;ndash; a single player gametype focusing on killing sprees
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hoard]] &amp;ndash; Collect &quot;Hoard Orbs&quot; to score.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Magicans]] &amp;ndash; A magic teamgame :)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MonkeyKnifeFight]] &amp;ndash; Small dudes with knives!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Origiut]] &amp;ndash; The original UT weapons and playing!!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Pool]] &amp;ndash; Play pool (billiards) with a UT 2003 twist using karma.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Predator]] &amp;ndash; Destroy your opponents as the predator.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ProjectMassive]] &amp;ndash; A massively multiplayer roleplaying game for 2004. Most probably will be ported to UE3 once it comes out.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ringworld]]&amp;ndash; A Ringworld-Inspired Mod for UT2003
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RollercoasterRider]] &amp;ndash; Build coasters and ride them.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RoundUp]] &amp;ndash; Take members of the other team prisoner, lock em all up.  [UT]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RunningOfTheBulldogs]] &amp;ndash; AI/Human controlled bulldogs try to run over players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Soul Devourer]] &amp;ndash; 1 Ultra Powerful Demon VS Everyone.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spelling]] &amp;ndash; Recognise the picture then spell the word.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TheHunt]] &amp;ndash; Can you survive the Hunt?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team King Of The Hill]] &amp;ndash; King of the hill with teams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnRealMyst]] &amp;ndash; A mod to provide the groundwork for Myst style puzzle games
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Unreal Tower Defense]] &amp;ndash; A simple port of the popular Tower Defense flash game
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Virus]] &amp;ndash; Blow away virus in your own computer just like the original game. 
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WaterFight]] &amp;ndash; See who can get the most soakage.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/We'Ve Created A Monster]] &amp;ndash; Not your average Mutant variant.

==Miscellaneous Ideas==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deadman Launcher]] &amp;ndash; You know you love to see your character tumble like a ragdoll down the stairs...its unfortunate you have to die though (thats why I propose the Deadman Launcher).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Arms]] &amp;ndash; Play UT with ported weapons from other games like doom, quake, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced Vehicle Damage]] &amp;ndash; Destroy parts of vehicles such as wheels &amp; weapons
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BinkPlayer]] &amp;ndash; Plays .bik files on the 'new scriptedtextures' that appear to render level action on them.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bomberman]] &amp;ndash; You know that old game?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Buddy List]] &amp;ndash; For UT
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ChargingJumpBoots]] &amp;ndash; Jump boots with variable height.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Civilians]] &amp;ndash; people in the map who just get in the way
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CorpseRedemption]] &amp;ndash; Redeem a frag by killing your dead self.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dark Match]] &amp;ndash; Turn out the lights and run around with torches.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Decal Match]] &amp;ndash; Adds more decals to the game
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enhanced Spectator Camera]] &amp;ndash; A Truly ESPN worthy Spectator camera mode. 
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firestarter]] &amp;ndash; A combo/pickup that causes the player to set alight anyone who looks in his eyes
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Flame Shield]] &amp;ndash; A combo/pickup that protects the user from bullets and explosions that also damages nearby players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Helmet]] &amp;ndash; Play UT2003 through the eyes of your helmet. With vision filters.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HyperspaceButton]] &amp;ndash; Instant teleportation across the map (or maybe death).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hovercar]] &amp;ndash; Remember those cars buzzing around the UT intro? Drive them!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jedi]] &amp;ndash; To hell with unreal lets have some starwars.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jet Set Tournament 2003]] &amp;ndash; JSRF-style lock-strafing, with possible further conversions
* [[Legacy:Mind Reader|Mind Reader]] &amp;ndash; A UT2003 version of.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Minefield]] &amp;ndash; Run around with caution, you might step on something nasty.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MovementTrainer]] &amp;ndash; Practice moving, aiming, and generally grooving around.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Multi Team UT2003]] &amp;ndash; Models and interface support for 4 or maybe even 6 teams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MutatorShuffler]] &amp;ndash; Randomly selects mutators for use in the next map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NowWithWings]] &amp;ndash; Provides players with two modes of transport.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Possessed]] &amp;ndash; Fighting is easy once you have a body.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Real Terrain]] &amp;ndash; Deformable terrain as in Red Faction
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Riftwar]] &amp;ndash; Three team species/class based minimod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Smoke Bomb]] &amp;ndash; Dissapear in a puff of smoke.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spam Weapons]] &amp;ndash; Yeah, I know, spamming is bad. But in this case you don't have other options.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sticky Boots]] &amp;ndash; Run up walls and across ceilings.  These boots are amazing.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Talkative Bots]] &amp;ndash; Hey, the bots are talking back.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Splintercell Mod]] &amp;ndash; sneak around shadowy maps...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wipeout-Style Mod]] &amp;ndash; futuristic racing mod idea

==Total Conversions==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Block Wars]] &amp;ndash; Mayhem in the Judge Dredd universe.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cyberwars]] &amp;ndash; Cyborgs test their toys on each other ;)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod]] &amp;ndash; Remember that game where you used to fly around and, er, shoot robots and find the reactor and escape? The 360° of freedom one?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Freeloader]] &amp;ndash; Ever heard of Excape Velocity? try combining that with UT2k3...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Medieval-Fantasy]] &amp;ndash; In the vein of Rune/Dark Vengeance
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rocket Jockey]] &amp;ndash; A Rocket Jockey inspired game, in which players must ride rockets around an arena and launch cables at each other.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ShineMatch]] &amp;ndash; Super Mario Sunshine converion?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ski-Ing]] &amp;ndash; How about that?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/StarCraft]] &amp;ndash; SC Single player/multiplayer shooter.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stellar Conflict]] &amp;ndash; BF1942 meets space.....sorta

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TheMachine]] &amp;ndash; Single-player RPG mod on Mars.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UTroids]] &amp;ndash; I once saw Tetris for Uwindows... why not 3dAstroids?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Xenocide]] &amp;ndash; futuristic class-based warfare simulation with human, alien and robotic factions
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UTPortal]] &amp;ndash; For those of us who hate Steam, a Portal-like SP mod for UT

==Map Components ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ChangeMusicVolume]] &amp;ndash;  A volume in which the music changes to whatever the mapper designates when you walk into it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/GravityWell]] &amp;ndash; Add an area of gravitational effect to your map
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lightning]] &amp;ndash; Lightning that attaches to a player (like the red beam that attaches to a teamate with the link gun) like how static electricity would do, and does damage!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/LocalGravity]] &amp;ndash; Configure Gravity, and the orientation of players in your map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MeteorShower]] &amp;ndash; Add a meteor shower to your map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerMovementZone]] &amp;ndash; A zone that lets you tweak the player's speed (''Should probably be volume now'')
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ShockTower]] &amp;ndash; A point defense or DM feature
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Trampoline]] &amp;ndash; A jump pad you have to work at
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Unreal1Monsters]] &amp;ndash; your favorite baddies are back, with shiney new meshes and karma deaths ^_^
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/VelocityTrigger]] &amp;ndash; A diferent for of Targetkicker
* [[Legacy:SustainedDamageTrigger|SustainedDamageTrigger]] &amp;ndash; A trigger based upon total damage recieved rather than damage amount.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NoRotatingItems]] &amp;ndash; Disable rotating for some or all items in a map
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sunshadow]] &amp;ndash; Player shadows are adjusted based on which way the sunlight actor is pointing
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTFextras]] &amp;ndash; a few extra things to add more gameplay strategy and teamplay to CTF
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Switch UT]] &amp;ndash; a sort of team trigger that switches from team to team

==Weapons==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Instagib N Grapple]] &amp;ndash; An instagib rifle with a grappling hook as the secondary fire.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Charging Shock Rifle]] &amp;ndash; A weapon that does more damage the less you fire it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spiderman Gun]] &amp;ndash; Spiderman, spiderman, does whatever a spider can...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ablative Gun]] &amp;ndash; a gun thats only what your opponents make it!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Killstick]] &amp;ndash; Sniping weapon from Megatokyo.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bloodrifle]] &amp;ndash; Powered-up sniper/shock rifle variant.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SpiderHack]] &amp;ndash; Use spider mines to hack enemy vehicles
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manhack]] &amp;ndash; Manhacks from HL2

==Mutators ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Accelerating Rockets]] &amp;ndash; Rocket Launcher rounds accelerate until they run out of fuel.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bloodbath]] &amp;ndash; Infinate bloodbath (Optimized DecalStay)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BotReport]] &amp;ndash; run a botmatch and report what happens
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Chameleon]] &amp;ndash; Causes a players skin to be replaced with the walls texture.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CratePickups]] &amp;ndash; all pickups are in crates!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creeper Runes]] &amp;ndash; Think RealCTF's RealCreeper. or, Quake I's CreeperCTF
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DevTools]] &amp;ndash;0 Various Developer tools
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dodgeball]] &amp;ndash; Think Super Dodgeball for the NES.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ForcedLowGrav]] &amp;ndash; LowGrav mutator goes into effect for certain maps of your choosing otherwise regular gravity is in effect.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Heavy Items]] &amp;ndash; You'll be weighed down by your items.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/InfiniteAmmoCombo]] &amp;ndash; Adrenaline Combo that returns ammo when used / stops ammo drain
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/InstaVsSniper]] &amp;ndash; Arena mutator where Red team gets the Enhanded Shock Rifle and Blue team gets the Sniper Rifle.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iris]] &amp;ndash; your &quot;eyes&quot; adjust to changing light levels.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Kinetic Rifle]] &amp;ndash; modifies the Shield Gun primary fire to operate at range
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MarioUT]] &amp;ndash; Head bouncing ahoy!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mercury Missile InstaGib]] &amp;ndash; Descent II Mercury Missiles instead of energy beams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mini Bulldogs]] &amp;ndash; Replace players with miniature Bulldogs
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NukeRifles]] &amp;ndash; Combat with very dangerous nuclear sniper rifles!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OptOutDeathMessages]] &amp;ndash; No DeathMessages cluttering up the Chat area.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OptOutTauntPacks]] &amp;ndash; A way to avoid downloading taunt packs  without canceling server join.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Playthings]] &amp;ndash; A weapons mod with a nonviolent theme. A set of creative, non-lethal weapons could be very interesting.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RagDollPhysics]] &amp;ndash; Changing parameters on ragdoll physics.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Random Gravity]] &amp;ndash; Gravity changes at random intervals.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Really Random Spawn Points]] &amp;ndash; An end to spawn camping.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RegeneratingAmmo]] &amp;ndash; A mutator that regenerates ammo for weapons held.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SeasonsMultiMap]] &amp;ndash; Map assets change depending on the system date on the server.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Semigib Onslaught]] &amp;ndash; A half-hearted instagib mode for Onslaught.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SkinRelay]] &amp;ndash; Client-defined skins passed to all players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sorcery]] &amp;ndash; forget machine guns, rocket launchers and shock rifles, bring on the fireballs!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Synthesizer]] &amp;ndash; Uses normal ammo in combinations to create new attacks!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TacticalScreen]] &amp;ndash; one player of each team has a multiscreen showing every transloc-cam
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TeamWeaponArena]] &amp;ndash; Specify allowed weapons and pickups on a team by team basis.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sentry Weapons]] &amp;ndash; deploy a Sentry Weapon that would be a tripod with the weapon you have selected on top
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Variant Weapon]] &amp;ndash; A new weapon with the alt-fire configurable to the client to fire whatever he/she wants it to from a list.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/X-Ray]] - adrenaline combo to see through walls
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT2003 Jukebox]] - a concept I had to make something similar to a jukebox for 2003
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Upgrades]] - Inspired by excessive. Makes it so the weapons that your opponent drops are worth more then amo.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Yog-Sothoth]] &amp;ndash; adds the Great Old One to the map, who seeks to devour all

==Third-Party ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/U-Replay]] &amp;ndash; Takes Recorded Demofiles and Renders them as High-poly, High-res Video files

==Ideas for Other Unreal Engine Based Games ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Devastation Conquerors]] &amp;ndash; Multiplayer co-op across single mission maps.

==Vehicles ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dropship]] &amp;ndash; A flying vehicle capable of carrying four bulldogs inside itself
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Eclipse]] &amp;ndash; Heavy bomber, three crew
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Gliding_scorp]] &amp;ndash; The blades on the scorpian provide lift.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fury AKA Nemesis]] &amp;ndash; 4 metres long (~256UU in UT200X), it handles like a manta, but pressing [possibly B, like in the airpower mut)

it turns into a fighter, and handles as such.

----

==Related Topics ==
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Map Ideas|Map Ideas]]
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Testing Lab|Testing Lab]]

==Discussion ==

'''Kartoshka:''' Is it safe to delete those pages marked by the &quot;delete mark&quot; tag? There was a bit of a discussion before, and no real decision made. I'd like to tidy this up a bit, but I'm worried I'll end up marking for deletion some page that's still getting worked on...

'''EntropicLqd:''' If you check the page history I suspect the delete marks were added over a year ago, so I suggest you go ahead and delete them.  Happy cleaning.

'''Kartoshka:''' What about making one page for actively developing/finished stuff and one for just ideas? How often do people add stuff to this page anyway? I haven't seen anything new quite some time. Maybe when UT2007 rolls out, that will change...

'''Tarquin:''' I agree that we have a LOT of &quot;mod ideas&quot; pages that just aren't going anywhere. (Just taking a look at this page now and... HOLY CRAP that's a lot of pages just gathering dust.) But when you're marking pages for deletion, are you moving the material somewhere else?

'''Kartoshka:''' Do you think we should keep the old material somewhere? Most of the ideas that didn't go anywhere are already implemented somewhere, too complicated, or just not well thought out. IMO, we should dump that stuff. Right now, I'm keeping the pages that resemble a design document, or that have been worked on &quot;recently&quot; (in the past year or so).

'''Switch`:''' I'd archive the old ones somewhere, ie: in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived]]. Ideas don't have to be design docs, they can be random thoughts. Those random ideas can inspire people to create something fun and well though-out. IMO the more we have of them the better.

'''Tarquin:''' I agree. Make a judgement call (Kartoshka since you're workign on it, or whoever feels like helping :) and move the ones that are feasible and interesting to [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived]], all on a single page. Delete the ones that are too close to existing mods, totally crazy, or really lacking in their descriptions.

'''Kartoshka:''' For now I'll just tag the crazy ones for deletion, and leave the rest here. Then when Unreal Engine 3 games roll out, we can archive all the ideas that are here now and worth keeping. Sound good?
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4942</id>
      <timestamp>2008-01-24T04:09:48Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Mod Ideas''' page is a place for suggesting and debating mod ideas for any [[Legacy:Unreal Engine|Unreal Engine]] based games.  Although the primary focus is on [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] this will change over time as more Unreal Engine games get released. It may even lead to new mods being created. This page grew out of a scratch pad of the stressed ramblings of [[Legacy:EntropicLqd|EntropicLqd]], father, or menagerie-keeper as he would style it.

This page is part of the [[Legacy:Project FAQ|Unreal Wiki]] site. That means anyone can add text or edit the material that is here. It's a collaborative environment, and newcomers should read [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] before making edits. To see what is new since your last visit, see [[Legacy:Recent Changes|Recent Changes]] or the '''(diff)''' and '''View other revisions''' links at the foot of this page. 

The guidelines for using this page are still rough, so open to suggestion.

; It's Open! : Firstly, when adding an idea to this page be aware that you are opening it up to comment from any casual passer by.  Be prepared to be met with stony silence or many suggestions.  As well as opening the idea up for comment you are also giving up some ownership of the mod &amp;ndash; someone else may write it before you.

; Commenting : When commenting on an idea, add your comments to the ''discussion'' section of the mod.  Allow the original owner of the idea to refactor their mod description to include your suggestion should they like it &amp;ndash; and be prepared for your suggestion to simply be ignored or rebuffed.  It's not personal.

; Expressing Interest : If you are interested in writing a mod, but haven't got time to do it right now, add your name to the ''Interested Scripters'' list.  Before you start work on a mod idea listed on this page you are responsible for checking to see if anyone else has started the mod before you.  The aim here is to contribute effort rather than duplicate effort.  If someone else has started the mod feel free to offer help, but again, be prepared for your offer to be turned down (some of these mods are way to small to be built by more than one person). You really also want to read [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] before starting ''any'' project...

; Delivery : Once you decide to go into &quot;delivery mode&quot; with an idea here make that fact plain within the ''Interested Scripters'' section.  It would also be nice if you added a journal page to the Wiki on [[:Category:Legacy Journal]]  for the mod.  The journal should read more like a tutorial rather than a diary and explain why you decided to do things the way you did, as well as how you did them.  A journal is by no means a requirement, but it would be nice.

There's also a corresponding [[Legacy:Map Ideas|Map Ideas]] page for ideas for mappers making maps.

'''Please''' only post a project idea here if you actually plan to work on it.

==Wider Reading ==

Other pages on the nature of mods, how to make them, and how to make them good.
* [[Legacy:Gameplay|Gameplay]] - what is gameplay? what makes ''good'' gameplay?
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; essential rant
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]
* ... and generally, the rest of the Unreal Wiki, maybe starting with [[Legacy:UnrealScript|UnrealScript]].
* and you can use the [[Legacy:ScratchPad|ScratchPad]] to work on code

==ONS Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirCombat]] &amp;ndash; Aerial dogfighting Onslaught style.

==CTF Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TurnCoat]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Balanced CTF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CarJack]] &amp;ndash; Steal all the cars on the map, and park them at your base.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CarryTheFlag]] &amp;ndash; Carry the flag home rather than simply touch it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cold War]] &amp;ndash; Collect, attack and defend parts for your nuke!
* [[Legacy:Mapping For DrawBridges|Mapping for DrawBridges]] &amp;ndash; Get control of a central room, lower your bridge at steal that flag!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ExpertCTF]] &amp;ndash; All weapons given, regen health and ammo and off-hand hook.  See www.planetquake.com/expert for details.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/LonelyFlag]] &amp;ndash; Two teams compete for a single flag.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiCTF]] &amp;ndash; Aka CTF+, CTF4, I'd like to get a combined mod going for this.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Reversed CTF]] &amp;ndash; Only a little modification make things more hectic
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TouchDown]] &amp;ndash; Effectively Bombing Run with an attacking and defending team that swap over.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealBallPool]] &amp;ndash; Collect the most balls at your flag base to win (Maybe Dom maps would work better?).

==DOM Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DestructionDOM]] &amp;ndash; Control points need to be destroyed to be captured.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dompendant]] &amp;ndash; You, i mean you, are by yourself!!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KOTH]] &amp;ndash; King of the Hill mod (one DOM point).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Power Domination]] &amp;ndash; Dominate the power nodes of an Onslaught map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RandomDOM]] &amp;ndash; 6+ Dom points but only a random 2 work
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Triple Domination]] &amp;ndash; 50% more domination than Double Domination!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealSprint]] &amp;ndash; Touch consecutive control points without dying to score points.

==New Game Types ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Anagram]] &amp;ndash; A team word game with big weapons.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CatchTheSmurf]] &amp;ndash; Catch that Smurf!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ColorfulWarriors]]&amp;ndash; A Flying Airboats Mod w/ Giant GreenNalis, 25-30 Colorful Warriors skins, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DaiymoDefense]] &amp;ndash; Everybody likes ninjas and samurai.  Think VIP Assassination with katanas, bows, and blowguns.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DownhillUT]] &amp;ndash; Bobsleding and Snowboarding meets Back To The Future meets Super Mario Kart meets UT2k3
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Extreme Co-Op]] &amp;ndash; Advanced UT2k3 Co-operative Mod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/False Prophets]] &amp;ndash; Defend your prophet or die trying
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FishFood]] &amp;ndash; Who can be the biggest fish in the pond then?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Gladiator]] &amp;ndash; Only the Gladiator can frag!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/IceClimbUT]] &amp;ndash; a single player mod that you have to climb obstacles and stay away from ice spikes. Inspired from the TI-83+ game ''IceClimb''.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KarmaCrossfire]] &amp;ndash; 2 players, 2 stationary guns, 2 goals, a Karma ball and lots of explosions
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KillingSpree]] &amp;ndash; a single player gametype focusing on killing sprees
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hoard]] &amp;ndash; Collect &quot;Hoard Orbs&quot; to score.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Magicans]] &amp;ndash; A magic teamgame :)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MonkeyKnifeFight]] &amp;ndash; Small dudes with knives!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Origiut]] &amp;ndash; The original UT weapons and playing!!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Pool]] &amp;ndash; Play pool (billiards) with a UT 2003 twist using karma.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Predator]] &amp;ndash; Destroy your opponents as the predator.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ProjectMassive]] &amp;ndash; A massively multiplayer roleplaying game for 2004. Most probably will be ported to UE3 once it comes out.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ringworld]]&amp;ndash; A Ringworld-Inspired Mod for UT2003
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RollercoasterRider]] &amp;ndash; Build coasters and ride them.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RoundUp]] &amp;ndash; Take members of the other team prisoner, lock em all up.  [UT]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RunningOfTheBulldogs]] &amp;ndash; AI/Human controlled bulldogs try to run over players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Soul Devourer]] &amp;ndash; 1 Ultra Powerful Demon VS Everyone.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spelling]] &amp;ndash; Recognise the picture then spell the word.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TheHunt]] &amp;ndash; Can you survive the Hunt?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team King Of The Hill]] &amp;ndash; King of the hill with teams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnRealMyst]] &amp;ndash; A mod to provide the groundwork for Myst style puzzle games
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Unreal Tower Defense]] &amp;ndash; A simple port of the popular Tower Defense flash game
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Virus]] &amp;ndash; Blow away virus in your own computer just like the original game. 
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WaterFight]] &amp;ndash; See who can get the most soakage.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/We'Ve Created A Monster]] &amp;ndash; Not your average Mutant variant.

==Miscellaneous Ideas==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deadman Launcher]] &amp;ndash; You know you love to see your character tumble like a ragdoll down the stairs...its unfortunate you have to die though (thats why I propose the Deadman Launcher).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Arms]] &amp;ndash; Play UT with ported weapons from other games like doom, quake, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced Vehicle Damage]] &amp;ndash; Destroy parts of vehicles such as wheels &amp; weapons
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BinkPlayer]] &amp;ndash; Plays .bik files on the 'new scriptedtextures' that appear to render level action on them.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bomberman]] &amp;ndash; You know that old game?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Buddy List]] &amp;ndash; For UT
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ChargingJumpBoots]] &amp;ndash; Jump boots with variable height.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Civilians]] &amp;ndash; people in the map who just get in the way
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CorpseRedemption]] &amp;ndash; Redeem a frag by killing your dead self.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dark Match]] &amp;ndash; Turn out the lights and run around with torches.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Decal Match]] &amp;ndash; Adds more decals to the game
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enhanced Spectator Camera]] &amp;ndash; A Truly ESPN worthy Spectator camera mode. 
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firestarter]] &amp;ndash; A combo/pickup that causes the player to set alight anyone who looks in his eyes
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Flame Shield]] &amp;ndash; A combo/pickup that protects the user from bullets and explosions that also damages nearby players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Helmet]] &amp;ndash; Play UT2003 through the eyes of your helmet. With vision filters.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HyperspaceButton]] &amp;ndash; Instant teleportation across the map (or maybe death).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hovercar]] &amp;ndash; Remember those cars buzzing around the UT intro? Drive them!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jedi]] &amp;ndash; To hell with unreal lets have some starwars.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jet Set Tournament 2003]] &amp;ndash; JSRF-style lock-strafing, with possible further conversions
* [[Legacy:Mind Reader|Mind Reader]] &amp;ndash; A UT2003 version of.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Minefield]] &amp;ndash; Run around with caution, you might step on something nasty.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MovementTrainer]] &amp;ndash; Practice moving, aiming, and generally grooving around.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Multi Team UT2003]] &amp;ndash; Models and interface support for 4 or maybe even 6 teams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MutatorShuffler]] &amp;ndash; Randomly selects mutators for use in the next map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NowWithWings]] &amp;ndash; Provides players with two modes of transport.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Possessed]] &amp;ndash; Fighting is easy once you have a body.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Real Terrain]] &amp;ndash; Deformable terrain as in Red Faction
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Riftwar]] &amp;ndash; Three team species/class based minimod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Smoke Bomb]] &amp;ndash; Dissapear in a puff of smoke.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spam Weapons]] &amp;ndash; Yeah, I know, spamming is bad. But in this case you don't have other options.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sticky Boots]] &amp;ndash; Run up walls and across ceilings.  These boots are amazing.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Talkative Bots]] &amp;ndash; Hey, the bots are talking back.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Splintercell Mod]] &amp;ndash; sneak around shadowy maps...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wipeout-Style Mod]] &amp;ndash; futuristic racing mod idea

==Total Conversions==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Block Wars]] &amp;ndash; Mayhem in the Judge Dredd universe.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cyberwars]] &amp;ndash; Cyborgs test their toys on each other ;)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod]] &amp;ndash; Remember that game where you used to fly around and, er, shoot robots and find the reactor and escape? The 360° of freedom one?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Freeloader]] &amp;ndash; Ever heard of Excape Velocity? try combining that with UT2k3...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Medieval-Fantasy]] &amp;ndash; In the vein of Rune/Dark Vengeance
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rocket Jockey]] &amp;ndash; A Rocket Jockey inspired game, in which players must ride rockets around an arena and launch cables at each other.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ShineMatch]] &amp;ndash; Super Mario Sunshine converion?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ski-Ing]] &amp;ndash; How about that?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/StarCraft]] &amp;ndash; SC Single player/multiplayer shooter.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stellar Conflict]] &amp;ndash; BF1942 meets space.....sorta

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TheMachine]] &amp;ndash; Single-player RPG mod on Mars.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UTroids]] &amp;ndash; I once saw Tetris for Uwindows... why not 3dAstroids?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Xenocide]] &amp;ndash; futuristic class-based warfare simulation with human, alien and robotic factions

==Map Components ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ChangeMusicVolume]] &amp;ndash;  A volume in which the music changes to whatever the mapper designates when you walk into it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/GravityWell]] &amp;ndash; Add an area of gravitational effect to your map
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lightning]] &amp;ndash; Lightning that attaches to a player (like the red beam that attaches to a teamate with the link gun) like how static electricity would do, and does damage!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/LocalGravity]] &amp;ndash; Configure Gravity, and the orientation of players in your map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MeteorShower]] &amp;ndash; Add a meteor shower to your map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerMovementZone]] &amp;ndash; A zone that lets you tweak the player's speed (''Should probably be volume now'')
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ShockTower]] &amp;ndash; A point defense or DM feature
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Trampoline]] &amp;ndash; A jump pad you have to work at
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Unreal1Monsters]] &amp;ndash; your favorite baddies are back, with shiney new meshes and karma deaths ^_^
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/VelocityTrigger]] &amp;ndash; A diferent for of Targetkicker
* [[Legacy:SustainedDamageTrigger|SustainedDamageTrigger]] &amp;ndash; A trigger based upon total damage recieved rather than damage amount.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NoRotatingItems]] &amp;ndash; Disable rotating for some or all items in a map
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sunshadow]] &amp;ndash; Player shadows are adjusted based on which way the sunlight actor is pointing
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTFextras]] &amp;ndash; a few extra things to add more gameplay strategy and teamplay to CTF
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Switch UT]] &amp;ndash; a sort of team trigger that switches from team to team

==Weapons==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Instagib N Grapple]] &amp;ndash; An instagib rifle with a grappling hook as the secondary fire.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Charging Shock Rifle]] &amp;ndash; A weapon that does more damage the less you fire it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spiderman Gun]] &amp;ndash; Spiderman, spiderman, does whatever a spider can...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ablative Gun]] &amp;ndash; a gun thats only what your opponents make it!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Killstick]] &amp;ndash; Sniping weapon from Megatokyo.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bloodrifle]] &amp;ndash; Powered-up sniper/shock rifle variant.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SpiderHack]] &amp;ndash; Use spider mines to hack enemy vehicles
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manhack]] &amp;ndash; Manhacks from HL2

==Mutators ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Accelerating Rockets]] &amp;ndash; Rocket Launcher rounds accelerate until they run out of fuel.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bloodbath]] &amp;ndash; Infinate bloodbath (Optimized DecalStay)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BotReport]] &amp;ndash; run a botmatch and report what happens
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Chameleon]] &amp;ndash; Causes a players skin to be replaced with the walls texture.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CratePickups]] &amp;ndash; all pickups are in crates!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creeper Runes]] &amp;ndash; Think RealCTF's RealCreeper. or, Quake I's CreeperCTF
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DevTools]] &amp;ndash;0 Various Developer tools
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dodgeball]] &amp;ndash; Think Super Dodgeball for the NES.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ForcedLowGrav]] &amp;ndash; LowGrav mutator goes into effect for certain maps of your choosing otherwise regular gravity is in effect.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Heavy Items]] &amp;ndash; You'll be weighed down by your items.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/InfiniteAmmoCombo]] &amp;ndash; Adrenaline Combo that returns ammo when used / stops ammo drain
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/InstaVsSniper]] &amp;ndash; Arena mutator where Red team gets the Enhanded Shock Rifle and Blue team gets the Sniper Rifle.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iris]] &amp;ndash; your &quot;eyes&quot; adjust to changing light levels.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Kinetic Rifle]] &amp;ndash; modifies the Shield Gun primary fire to operate at range
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MarioUT]] &amp;ndash; Head bouncing ahoy!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mercury Missile InstaGib]] &amp;ndash; Descent II Mercury Missiles instead of energy beams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mini Bulldogs]] &amp;ndash; Replace players with miniature Bulldogs
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NukeRifles]] &amp;ndash; Combat with very dangerous nuclear sniper rifles!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OptOutDeathMessages]] &amp;ndash; No DeathMessages cluttering up the Chat area.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OptOutTauntPacks]] &amp;ndash; A way to avoid downloading taunt packs  without canceling server join.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Playthings]] &amp;ndash; A weapons mod with a nonviolent theme. A set of creative, non-lethal weapons could be very interesting.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RagDollPhysics]] &amp;ndash; Changing parameters on ragdoll physics.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Random Gravity]] &amp;ndash; Gravity changes at random intervals.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Really Random Spawn Points]] &amp;ndash; An end to spawn camping.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RegeneratingAmmo]] &amp;ndash; A mutator that regenerates ammo for weapons held.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SeasonsMultiMap]] &amp;ndash; Map assets change depending on the system date on the server.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Semigib Onslaught]] &amp;ndash; A half-hearted instagib mode for Onslaught.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SkinRelay]] &amp;ndash; Client-defined skins passed to all players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sorcery]] &amp;ndash; forget machine guns, rocket launchers and shock rifles, bring on the fireballs!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Synthesizer]] &amp;ndash; Uses normal ammo in combinations to create new attacks!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TacticalScreen]] &amp;ndash; one player of each team has a multiscreen showing every transloc-cam
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TeamWeaponArena]] &amp;ndash; Specify allowed weapons and pickups on a team by team basis.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sentry Weapons]] &amp;ndash; deploy a Sentry Weapon that would be a tripod with the weapon you have selected on top
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Variant Weapon]] &amp;ndash; A new weapon with the alt-fire configurable to the client to fire whatever he/she wants it to from a list.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/X-Ray]] - adrenaline combo to see through walls
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT2003 Jukebox]] - a concept I had to make something similar to a jukebox for 2003
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Upgrades]] - Inspired by excessive. Makes it so the weapons that your opponent drops are worth more then amo.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Yog-Sothoth]] &amp;ndash; adds the Great Old One to the map, who seeks to devour all

==Third-Party ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/U-Replay]] &amp;ndash; Takes Recorded Demofiles and Renders them as High-poly, High-res Video files

==Ideas for Other Unreal Engine Based Games ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Devastation Conquerors]] &amp;ndash; Multiplayer co-op across single mission maps.

==Vehicles ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dropship]] &amp;ndash; A flying vehicle capable of carrying four bulldogs inside itself
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Eclipse]] &amp;ndash; Heavy bomber, three crew
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Gliding_scorp]] &amp;ndash; The blades on the scorpian provide lift.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fury AKA Nemesis]] &amp;ndash; 4 metres long (~256UU in UT200X), it handles like a manta, but pressing [possibly B, like in the airpower mut)

it turns into a fighter, and handles as such.

----

==Related Topics ==
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Map Ideas|Map Ideas]]
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Testing Lab|Testing Lab]]

==Discussion ==

'''Kartoshka:''' Is it safe to delete those pages marked by the &quot;delete mark&quot; tag? There was a bit of a discussion before, and no real decision made. I'd like to tidy this up a bit, but I'm worried I'll end up marking for deletion some page that's still getting worked on...

'''EntropicLqd:''' If you check the page history I suspect the delete marks were added over a year ago, so I suggest you go ahead and delete them.  Happy cleaning.

'''Kartoshka:''' What about making one page for actively developing/finished stuff and one for just ideas? How often do people add stuff to this page anyway? I haven't seen anything new quite some time. Maybe when UT2007 rolls out, that will change...

'''Tarquin:''' I agree that we have a LOT of &quot;mod ideas&quot; pages that just aren't going anywhere. (Just taking a look at this page now and... HOLY CRAP that's a lot of pages just gathering dust.) But when you're marking pages for deletion, are you moving the material somewhere else?

'''Kartoshka:''' Do you think we should keep the old material somewhere? Most of the ideas that didn't go anywhere are already implemented somewhere, too complicated, or just not well thought out. IMO, we should dump that stuff. Right now, I'm keeping the pages that resemble a design document, or that have been worked on &quot;recently&quot; (in the past year or so).

'''Switch`:''' I'd archive the old ones somewhere, ie: in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived]]. Ideas don't have to be design docs, they can be random thoughts. Those random ideas can inspire people to create something fun and well though-out. IMO the more we have of them the better.

'''Tarquin:''' I agree. Make a judgement call (Kartoshka since you're workign on it, or whoever feels like helping :) and move the ones that are feasible and interesting to [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived]], all on a single page. Delete the ones that are too close to existing mods, totally crazy, or really lacking in their descriptions.

'''Kartoshka:''' For now I'll just tag the crazy ones for deletion, and leave the rest here. Then when Unreal Engine 3 games roll out, we can archive all the ideas that are here now and worth keeping. Sound good?
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4943</id>
      <timestamp>2008-01-25T22:00:30Z</timestamp>
      <contributor>
        <ip>Computergod666</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The '''Mod Ideas''' page is a place for suggesting and debating mod ideas for any [[Legacy:Unreal Engine|Unreal Engine]] based games.  Although the primary focus is on [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] this will change over time as more Unreal Engine games get released. It may even lead to new mods being created. This page grew out of a scratch pad of the stressed ramblings of [[Legacy:EntropicLqd|EntropicLqd]], father, or menagerie-keeper as he would style it.

This page is part of the [[Legacy:Project FAQ|Unreal Wiki]] site. That means anyone can add text or edit the material that is here. It's a collaborative environment, and newcomers should read [[Legacy:New Contributors Quick Start|New Contributors Quick Start]] before making edits. To see what is new since your last visit, see [[Legacy:Recent Changes|Recent Changes]] or the '''(diff)''' and '''View other revisions''' links at the foot of this page. 

The guidelines for using this page are still rough, so open to suggestion.

; It's Open! : Firstly, when adding an idea to this page be aware that you are opening it up to comment from any casual passer by.  Be prepared to be met with stony silence or many suggestions.  As well as opening the idea up for comment you are also giving up some ownership of the mod &amp;ndash; someone else may write it before you.

; Commenting : When commenting on an idea, add your comments to the ''discussion'' section of the mod.  Allow the original owner of the idea to refactor their mod description to include your suggestion should they like it &amp;ndash; and be prepared for your suggestion to simply be ignored or rebuffed.  It's not personal.

; Expressing Interest : If you are interested in writing a mod, but haven't got time to do it right now, add your name to the ''Interested Scripters'' list.  Before you start work on a mod idea listed on this page you are responsible for checking to see if anyone else has started the mod before you.  The aim here is to contribute effort rather than duplicate effort.  If someone else has started the mod feel free to offer help, but again, be prepared for your offer to be turned down (some of these mods are way to small to be built by more than one person). You really also want to read [[Legacy:Mychaeel/Modding Etiquette|Mychaeel/Modding Etiquette]] before starting ''any'' project...

; Delivery : Once you decide to go into &quot;delivery mode&quot; with an idea here make that fact plain within the ''Interested Scripters'' section.  It would also be nice if you added a journal page to the Wiki on [[:Category:Legacy Journal]]  for the mod.  The journal should read more like a tutorial rather than a diary and explain why you decided to do things the way you did, as well as how you did them.  A journal is by no means a requirement, but it would be nice.

There's also a corresponding [[Legacy:Map Ideas|Map Ideas]] page for ideas for mappers making maps.

'''Please''' only post a project idea here if you actually plan to work on it.

==Wider Reading ==

Other pages on the nature of mods, how to make them, and how to make them good.
* [[Legacy:Gameplay|Gameplay]] - what is gameplay? what makes ''good'' gameplay?
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]] &amp;ndash; essential rant
* Brandon Reinhart's [[Legacy:Mod Authoring|Mod Authoring]]
* ... and generally, the rest of the Unreal Wiki, maybe starting with [[Legacy:UnrealScript|UnrealScript]].
* and you can use the [[Legacy:ScratchPad|ScratchPad]] to work on code

==ONS Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/AirCombat]] &amp;ndash; Aerial dogfighting Onslaught style.

==CTF Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TurnCoat]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Balanced CTF]]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CarJack]] &amp;ndash; Steal all the cars on the map, and park them at your base.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CarryTheFlag]] &amp;ndash; Carry the flag home rather than simply touch it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cold War]] &amp;ndash; Collect, attack and defend parts for your nuke!
* [[Legacy:Mapping For DrawBridges|Mapping for DrawBridges]] &amp;ndash; Get control of a central room, lower your bridge at steal that flag!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ExpertCTF]] &amp;ndash; All weapons given, regen health and ammo and off-hand hook.  See www.planetquake.com/expert for details.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/LonelyFlag]] &amp;ndash; Two teams compete for a single flag.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MultiCTF]] &amp;ndash; Aka CTF+, CTF4, I'd like to get a combined mod going for this.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Reversed CTF]] &amp;ndash; Only a little modification make things more hectic
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TouchDown]] &amp;ndash; Effectively Bombing Run with an attacking and defending team that swap over.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealBallPool]] &amp;ndash; Collect the most balls at your flag base to win (Maybe Dom maps would work better?).

==DOM Variants ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DestructionDOM]] &amp;ndash; Control points need to be destroyed to be captured.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dompendant]] &amp;ndash; You, i mean you, are by yourself!!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KOTH]] &amp;ndash; King of the Hill mod (one DOM point).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Power Domination]] &amp;ndash; Dominate the power nodes of an Onslaught map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RandomDOM]] &amp;ndash; 6+ Dom points but only a random 2 work
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Triple Domination]] &amp;ndash; 50% more domination than Double Domination!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnrealSprint]] &amp;ndash; Touch consecutive control points without dying to score points.

==New Game Types ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Anagram]] &amp;ndash; A team word game with big weapons.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CatchTheSmurf]] &amp;ndash; Catch that Smurf!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ColorfulWarriors]]&amp;ndash; A Flying Airboats Mod w/ Giant GreenNalis, 25-30 Colorful Warriors skins, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DaiymoDefense]] &amp;ndash; Everybody likes ninjas and samurai.  Think VIP Assassination with katanas, bows, and blowguns.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DownhillUT]] &amp;ndash; Bobsleding and Snowboarding meets Back To The Future meets Super Mario Kart meets UT2k3
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Extreme Co-Op]] &amp;ndash; Advanced UT2k3 Co-operative Mod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/False Prophets]] &amp;ndash; Defend your prophet or die trying
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/FishFood]] &amp;ndash; Who can be the biggest fish in the pond then?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Gladiator]] &amp;ndash; Only the Gladiator can frag!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/IceClimbUT]] &amp;ndash; a single player mod that you have to climb obstacles and stay away from ice spikes. Inspired from the TI-83+ game ''IceClimb''.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KarmaCrossfire]] &amp;ndash; 2 players, 2 stationary guns, 2 goals, a Karma ball and lots of explosions
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/KillingSpree]] &amp;ndash; a single player gametype focusing on killing sprees
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hoard]] &amp;ndash; Collect &quot;Hoard Orbs&quot; to score.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Magicans]] &amp;ndash; A magic teamgame :)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MonkeyKnifeFight]] &amp;ndash; Small dudes with knives!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Origiut]] &amp;ndash; The original UT weapons and playing!!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Pool]] &amp;ndash; Play pool (billiards) with a UT 2003 twist using karma.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Predator]] &amp;ndash; Destroy your opponents as the predator.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ProjectMassive]] &amp;ndash; A massively multiplayer roleplaying game for 2004. Most probably will be ported to UE3 once it comes out.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ringworld]]&amp;ndash; A Ringworld-Inspired Mod for UT2003
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RollercoasterRider]] &amp;ndash; Build coasters and ride them.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RoundUp]] &amp;ndash; Take members of the other team prisoner, lock em all up.  [UT]
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RunningOfTheBulldogs]] &amp;ndash; AI/Human controlled bulldogs try to run over players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Soul Devourer]] &amp;ndash; 1 Ultra Powerful Demon VS Everyone.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spelling]] &amp;ndash; Recognise the picture then spell the word.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TheHunt]] &amp;ndash; Can you survive the Hunt?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team King Of The Hill]] &amp;ndash; King of the hill with teams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UnRealMyst]] &amp;ndash; A mod to provide the groundwork for Myst style puzzle games
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Unreal Tower Defense]] &amp;ndash; A simple port of the popular Tower Defense flash game
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Virus]] &amp;ndash; Blow away virus in your own computer just like the original game. 
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/WaterFight]] &amp;ndash; See who can get the most soakage.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/We'Ve Created A Monster]] &amp;ndash; Not your average Mutant variant.

==Miscellaneous Ideas==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Deadman Launcher]] &amp;ndash; You know you love to see your character tumble like a ragdoll down the stairs...its unfortunate you have to die though (thats why I propose the Deadman Launcher).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Arms]] &amp;ndash; Play UT with ported weapons from other games like doom, quake, etc.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Advanced Vehicle Damage]] &amp;ndash; Destroy parts of vehicles such as wheels &amp; weapons
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BinkPlayer]] &amp;ndash; Plays .bik files on the 'new scriptedtextures' that appear to render level action on them.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bomberman]] &amp;ndash; You know that old game?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Buddy List]] &amp;ndash; For UT
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ChargingJumpBoots]] &amp;ndash; Jump boots with variable height.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Civilians]] &amp;ndash; people in the map who just get in the way
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CorpseRedemption]] &amp;ndash; Redeem a frag by killing your dead self.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dark Match]] &amp;ndash; Turn out the lights and run around with torches.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Decal Match]] &amp;ndash; Adds more decals to the game
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Enhanced Spectator Camera]] &amp;ndash; A Truly ESPN worthy Spectator camera mode. 
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Firestarter]] &amp;ndash; A combo/pickup that causes the player to set alight anyone who looks in his eyes
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Flame Shield]] &amp;ndash; A combo/pickup that protects the user from bullets and explosions that also damages nearby players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Helmet]] &amp;ndash; Play UT2003 through the eyes of your helmet. With vision filters.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/HyperspaceButton]] &amp;ndash; Instant teleportation across the map (or maybe death).
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Hovercar]] &amp;ndash; Remember those cars buzzing around the UT intro? Drive them!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jedi]] &amp;ndash; To hell with unreal lets have some starwars.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Jet Set Tournament 2003]] &amp;ndash; JSRF-style lock-strafing, with possible further conversions
* [[Legacy:Mind Reader|Mind Reader]] &amp;ndash; A UT2003 version of.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Minefield]] &amp;ndash; Run around with caution, you might step on something nasty.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MovementTrainer]] &amp;ndash; Practice moving, aiming, and generally grooving around.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Multi Team UT2003]] &amp;ndash; Models and interface support for 4 or maybe even 6 teams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MutatorShuffler]] &amp;ndash; Randomly selects mutators for use in the next map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NowWithWings]] &amp;ndash; Provides players with two modes of transport.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Possessed]] &amp;ndash; Fighting is easy once you have a body.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Real Terrain]] &amp;ndash; Deformable terrain as in Red Faction
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Riftwar]] &amp;ndash; Three team species/class based minimod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Smoke Bomb]] &amp;ndash; Dissapear in a puff of smoke.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spam Weapons]] &amp;ndash; Yeah, I know, spamming is bad. But in this case you don't have other options.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sticky Boots]] &amp;ndash; Run up walls and across ceilings.  These boots are amazing.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Talkative Bots]] &amp;ndash; Hey, the bots are talking back.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Splintercell Mod]] &amp;ndash; sneak around shadowy maps...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wipeout-Style Mod]] &amp;ndash; futuristic racing mod idea

==Total Conversions==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Block Wars]] &amp;ndash; Mayhem in the Judge Dredd universe.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Cyberwars]] &amp;ndash; Cyborgs test their toys on each other ;)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod]] &amp;ndash; Remember that game where you used to fly around and, er, shoot robots and find the reactor and escape? The 360° of freedom one?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Freeloader]] &amp;ndash; Ever heard of Excape Velocity? try combining that with UT2k3...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Medieval-Fantasy]] &amp;ndash; In the vein of Rune/Dark Vengeance
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rocket Jockey]] &amp;ndash; A Rocket Jockey inspired game, in which players must ride rockets around an arena and launch cables at each other.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ShineMatch]] &amp;ndash; Super Mario Sunshine converion?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ski-Ing]] &amp;ndash; How about that?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/StarCraft]] &amp;ndash; SC Single player/multiplayer shooter.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Stellar Conflict]] &amp;ndash; BF1942 meets space.....sorta

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TheMachine]] &amp;ndash; Single-player RPG mod on Mars.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UTroids]] &amp;ndash; I once saw Tetris for Uwindows... why not 3dAstroids?
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Xenocide]] &amp;ndash; futuristic class-based warfare simulation with human, alien and robotic factions
* [[Legacy:Mod Ideas/UTPortal|Mod Ideas/UTPortal]] &amp;ndash; For those of us who hate Steam, a Portal-like SP mod for UT

==Map Components ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ChangeMusicVolume]] &amp;ndash;  A volume in which the music changes to whatever the mapper designates when you walk into it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/GravityWell]] &amp;ndash; Add an area of gravitational effect to your map
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Lightning]] &amp;ndash; Lightning that attaches to a player (like the red beam that attaches to a teamate with the link gun) like how static electricity would do, and does damage!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/LocalGravity]] &amp;ndash; Configure Gravity, and the orientation of players in your map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MeteorShower]] &amp;ndash; Add a meteor shower to your map.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/PlayerMovementZone]] &amp;ndash; A zone that lets you tweak the player's speed (''Should probably be volume now'')
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ShockTower]] &amp;ndash; A point defense or DM feature
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Trampoline]] &amp;ndash; A jump pad you have to work at
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Unreal1Monsters]] &amp;ndash; your favorite baddies are back, with shiney new meshes and karma deaths ^_^
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/VelocityTrigger]] &amp;ndash; A diferent for of Targetkicker
* [[Legacy:SustainedDamageTrigger|SustainedDamageTrigger]] &amp;ndash; A trigger based upon total damage recieved rather than damage amount.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NoRotatingItems]] &amp;ndash; Disable rotating for some or all items in a map
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sunshadow]] &amp;ndash; Player shadows are adjusted based on which way the sunlight actor is pointing
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CTFextras]] &amp;ndash; a few extra things to add more gameplay strategy and teamplay to CTF
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Team Switch UT]] &amp;ndash; a sort of team trigger that switches from team to team

==Weapons==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Instagib N Grapple]] &amp;ndash; An instagib rifle with a grappling hook as the secondary fire.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Charging Shock Rifle]] &amp;ndash; A weapon that does more damage the less you fire it.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Spiderman Gun]] &amp;ndash; Spiderman, spiderman, does whatever a spider can...
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Ablative Gun]] &amp;ndash; a gun thats only what your opponents make it!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Killstick]] &amp;ndash; Sniping weapon from Megatokyo.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bloodrifle]] &amp;ndash; Powered-up sniper/shock rifle variant.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SpiderHack]] &amp;ndash; Use spider mines to hack enemy vehicles
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Manhack]] &amp;ndash; Manhacks from HL2

==Mutators ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Accelerating Rockets]] &amp;ndash; Rocket Launcher rounds accelerate until they run out of fuel.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Bloodbath]] &amp;ndash; Infinate bloodbath (Optimized DecalStay)
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/BotReport]] &amp;ndash; run a botmatch and report what happens
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Chameleon]] &amp;ndash; Causes a players skin to be replaced with the walls texture.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/CratePickups]] &amp;ndash; all pickups are in crates!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Creeper Runes]] &amp;ndash; Think RealCTF's RealCreeper. or, Quake I's CreeperCTF
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/DevTools]] &amp;ndash;0 Various Developer tools
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dodgeball]] &amp;ndash; Think Super Dodgeball for the NES.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/ForcedLowGrav]] &amp;ndash; LowGrav mutator goes into effect for certain maps of your choosing otherwise regular gravity is in effect.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Heavy Items]] &amp;ndash; You'll be weighed down by your items.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/InfiniteAmmoCombo]] &amp;ndash; Adrenaline Combo that returns ammo when used / stops ammo drain
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/InstaVsSniper]] &amp;ndash; Arena mutator where Red team gets the Enhanded Shock Rifle and Blue team gets the Sniper Rifle.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Iris]] &amp;ndash; your &quot;eyes&quot; adjust to changing light levels.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Kinetic Rifle]] &amp;ndash; modifies the Shield Gun primary fire to operate at range
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MarioUT]] &amp;ndash; Head bouncing ahoy!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mercury Missile InstaGib]] &amp;ndash; Descent II Mercury Missiles instead of energy beams.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mini Bulldogs]] &amp;ndash; Replace players with miniature Bulldogs
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/NukeRifles]] &amp;ndash; Combat with very dangerous nuclear sniper rifles!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OptOutDeathMessages]] &amp;ndash; No DeathMessages cluttering up the Chat area.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/OptOutTauntPacks]] &amp;ndash; A way to avoid downloading taunt packs  without canceling server join.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Playthings]] &amp;ndash; A weapons mod with a nonviolent theme. A set of creative, non-lethal weapons could be very interesting.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RagDollPhysics]] &amp;ndash; Changing parameters on ragdoll physics.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Random Gravity]] &amp;ndash; Gravity changes at random intervals.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Really Random Spawn Points]] &amp;ndash; An end to spawn camping.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/RegeneratingAmmo]] &amp;ndash; A mutator that regenerates ammo for weapons held.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SeasonsMultiMap]] &amp;ndash; Map assets change depending on the system date on the server.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Semigib Onslaught]] &amp;ndash; A half-hearted instagib mode for Onslaught.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/SkinRelay]] &amp;ndash; Client-defined skins passed to all players
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sorcery]] &amp;ndash; forget machine guns, rocket launchers and shock rifles, bring on the fireballs!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Synthesizer]] &amp;ndash; Uses normal ammo in combinations to create new attacks!
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TacticalScreen]] &amp;ndash; one player of each team has a multiscreen showing every transloc-cam
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/TeamWeaponArena]] &amp;ndash; Specify allowed weapons and pickups on a team by team basis.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Sentry Weapons]] &amp;ndash; deploy a Sentry Weapon that would be a tripod with the weapon you have selected on top
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Variant Weapon]] &amp;ndash; A new weapon with the alt-fire configurable to the client to fire whatever he/she wants it to from a list.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/X-Ray]] - adrenaline combo to see through walls
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/UT2003 Jukebox]] - a concept I had to make something similar to a jukebox for 2003
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Upgrades]] - Inspired by excessive. Makes it so the weapons that your opponent drops are worth more then amo.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Yog-Sothoth]] &amp;ndash; adds the Great Old One to the map, who seeks to devour all

==Third-Party ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/U-Replay]] &amp;ndash; Takes Recorded Demofiles and Renders them as High-poly, High-res Video files

==Ideas for Other Unreal Engine Based Games ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Devastation Conquerors]] &amp;ndash; Multiplayer co-op across single mission maps.

==Vehicles ==
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Dropship]] &amp;ndash; A flying vehicle capable of carrying four bulldogs inside itself
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Eclipse]] &amp;ndash; Heavy bomber, three crew
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Gliding_scorp]] &amp;ndash; The blades on the scorpian provide lift.
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fury AKA Nemesis]] &amp;ndash; 4 metres long (~256UU in UT200X), it handles like a manta, but pressing [possibly B, like in the airpower mut)

it turns into a fighter, and handles as such.

----

==Related Topics ==
* [[Legacy:Making Mods|Making Mods]] and [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Map Ideas|Map Ideas]]
* [[Legacy:UnrealScript|UnrealScript]]
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]]
* [[Legacy:Testing Lab|Testing Lab]]

==Discussion ==

'''Kartoshka:''' Is it safe to delete those pages marked by the &quot;delete mark&quot; tag? There was a bit of a discussion before, and no real decision made. I'd like to tidy this up a bit, but I'm worried I'll end up marking for deletion some page that's still getting worked on...

'''EntropicLqd:''' If you check the page history I suspect the delete marks were added over a year ago, so I suggest you go ahead and delete them.  Happy cleaning.

'''Kartoshka:''' What about making one page for actively developing/finished stuff and one for just ideas? How often do people add stuff to this page anyway? I haven't seen anything new quite some time. Maybe when UT2007 rolls out, that will change...

'''Tarquin:''' I agree that we have a LOT of &quot;mod ideas&quot; pages that just aren't going anywhere. (Just taking a look at this page now and... HOLY CRAP that's a lot of pages just gathering dust.) But when you're marking pages for deletion, are you moving the material somewhere else?

'''Kartoshka:''' Do you think we should keep the old material somewhere? Most of the ideas that didn't go anywhere are already implemented somewhere, too complicated, or just not well thought out. IMO, we should dump that stuff. Right now, I'm keeping the pages that resemble a design document, or that have been worked on &quot;recently&quot; (in the past year or so).

'''Switch`:''' I'd archive the old ones somewhere, ie: in [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived]]. Ideas don't have to be design docs, they can be random thoughts. Those random ideas can inspire people to create something fun and well though-out. IMO the more we have of them the better.

'''Tarquin:''' I agree. Make a judgement call (Kartoshka since you're workign on it, or whoever feels like helping :) and move the ones that are feasible and interesting to [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Archived]], all on a single page. Delete the ones that are too close to existing mods, totally crazy, or really lacking in their descriptions.

'''Kartoshka:''' For now I'll just tag the crazy ones for deletion, and leave the rest here. Then when Unreal Engine 3 games roll out, we can archive all the ideas that are here now and worth keeping. Sound good?
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Ablative Gun</title>
    <id>1914</id>
    <revision>
      <id>4691</id>
      <timestamp>2006-08-13T11:58:43Z</timestamp>
      <contributor>
        <ip>DarkMan</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Interested&quot;</comment>
      <text xml:space="preserve">The ablative gun would be pretty simple really, if someone shoots you with a projectile weapon, the gun then fires that projectile untill your hit by another projectile. Alt fire would probably activate an amped version shieldgun's shield that deflects all projectiles. The gun would probably have the same ammo space as the shock rifle.

==Interested Scripters==

DarkMan

==Discussion ==</text>
    </revision>
    <revision>
      <id>4692</id>
      <timestamp>2003-04-27T21:50:49Z</timestamp>
      <contributor>
        <ip>Icedude</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The ablative gun would be pretty simple really, if someone shoots you with a projectile weapon, the gun then fires that projectile untill your hit by another projectile. Alt fire would probably activate an amped version shieldgun's shield that deflects all projectiles. The gun would probably have the same ammo space as the shock rifle.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Accelerating Rockets</title>
    <id>1967</id>
    <revision>
      <id>4814</id>
      <timestamp>2003-07-16T18:31:49Z</timestamp>
      <contributor>
        <ip>Slakkie</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Wanted one of these since quake 1. 

Makes long-range rocket sniping interesting.

Rocket at the beginning of its life: high splash (fuel plus warhead) but regular impact (no extra damage from speed)

Rocket near the end of its life: low splash (fuel gone, just warhead) but extra impact damage (high KE)

Rocket after burnout: a grenade with arc and tumble.

I like the way aiming this thing would work... all of the target lead would be for the first part of the flight.. the amount you would have to lead for longer distances would get smaller and smaller. 

If you really wanted to make leading a target hellish you could give the rocket a terminal speed and/or have the acelleration ramp off... making it so hard to lead that youd want to be closer to the target than usual... where the rocket speed is slow and the splash radius is big.

Might need more base damage to make up for the tough aiming.

-jeeptrash-

Yes please!! I am realy only interested in the accelerating part... It should start slow (default speed or maybe 

a bit slower than default but quickly gain a lot of speed like a real rocket! That would be cool and maybe balance the shock-combo 

a little... (It exists as a Q3A mutator) Can it be done, I wish I could do it myself!

Everybody knows that in reality a grenade or bullet slows down after firing and a rocket accelerates.

Er.. O yeah I am specificaly talking about UT(classic)...

-Somniloq-</text>
    </revision>
    <revision>
      <id>4815</id>
      <timestamp>2003-07-15T21:54:26Z</timestamp>
      <contributor>
        <ip>Node-d-4fae.a2000.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Wanted one of these since quake 1. 

Makes long-range rocket sniping interesting.

Rocket at the beginning of its life: high splash (fuel plus warhead) but regular impact (no extra damage from speed)

Rocket near the end of its life: low splash (fuel gone, just warhead) but extra impact damage (high KE)

Rocket after burnout: a grenade with arc and tumble.

I like the way aiming this thing would work... all of the target lead would be for the first part of the flight.. the amount you would have to lead for longer distances would get smaller and smaller. 

If you really wanted to make leading a target hellish you could give the rocket a terminal speed and/or have the acelleration ramp off... making it so hard to lead that youd want to be closer to the target than usual... where the rocket speed is slow and the splash radius is big.

Might need more base damage to make up for the tough aiming.

-jeeptrash-

Yes please!! I am realy only interested in the accelerating part... It should start slow (default speed or maybe 

a bit slower than default but quickly gain a lot of speed like a real rocket! That would be cool and maybe balance the shock-combo 

a little... (It exists as a Q3A mutator) Can it be done, I wish I could do it myself!

Everybody knows that in reality a grenade or bullet slows down after fireing and a rocket accelerates.

-Somniloq-</text>
    </revision>
    <revision>
      <id>4816</id>
      <timestamp>2003-07-15T22:00:32Z</timestamp>
      <contributor>
        <ip>Node-d-4fae.a2000.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Wanted one of these since quake 1. 

Makes long-range rocket sniping interesting.

Rocket at the beginning of its life: high splash (fuel plus warhead) but regular impact (no extra damage from speed)

Rocket near the end of its life: low splash (fuel gone, just warhead) but extra impact damage (high KE)

Rocket after burnout: a grenade with arc and tumble.

I like the way aiming this thing would work... all of the target lead would be for the first part of the flight.. the amount you would have to lead for longer distances would get smaller and smaller. 

If you really wanted to make leading a target hellish you could give the rocket a terminal speed and/or have the acelleration ramp off... making it so hard to lead that youd want to be closer to the target than usual... where the rocket speed is slow and the splash radius is big.

Might need more base damage to make up for the tough aiming.

-jeeptrash-

Yes please!! I am realy only interested in the accelerating part... It should start slow (default speed or maybe 

a bit slower than default but quickly gain a lot of speed like a real rocket! That would be cool and maybe balance the shock-combo 

a little... (It exists as a Q3A mutator) Can it be done, I wish I could do it myself!

Everybody knows that in reality a grenade or bullet slows down after fireing and a rocket accelerates.

Er.. O yeah I am specificaly talking about UT(classic)...

-Somniloq-</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Advanced Vehicle Damage</title>
    <id>2008</id>
    <revision>
      <id>4907</id>
      <timestamp>2005-08-20T22:09:16Z</timestamp>
      <contributor>
        <ip>Pcp0010138454pcs.dallas01.ga.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What this mod should allow you to do is destroy parts of vehicles without destroying the vehicle itself. Let's take a Scorpion for example. Currently, you can only destroy the blades seperately. Why not have the same for the wheels &amp; turret? I believe that the wheels &amp; turrets are mounted by &quot;bones&quot;. A simple &quot;if&quot; statement applied to the bones might work-if not, I can try editing the turrets &amp; wheels instead. Keep in mind that I just finished my DVD Edition's VTMs, so I may not understand everything.

To-Do List:

*Destroyable Turrets-They seem to work fine.
*Destroyable Weapons-I haven't found a way to make them work yet. I remember being able to destroy the Goliath cannon in my past exploits, but the code has since been lost.
*Destroyable Wheels-I haven't found a way to make them work, and it's much more difficult than the other two.

==Current Code==

==AVDONSPRV==

&lt;uscript&gt;
//-----------------------------------------------------------
// Advanced Vehicle Damage HellBender
//-----------------------------------------------------------
class AVDONSPRV extends ONSPRV;

DefaultProperties
{
	PassengerWeapons(1)=(WeaponPawnClass=class'AVD.AVDONSPRVRearGunPawn',WeaponBone=Dummy02);
}
&lt;/uscript&gt;

==AVDONSPRVRearGunPawn==

&lt;uscript&gt;
//-----------------------------------------------------------
// Advanced Vehicle Damage HellBender Rear Turret
//-----------------------------------------------------------
class AVDONSPRVRearGunPawn extends ONSPRVRearGunPawn;

DefaultProperties
	bHasOwnHealth=True
	bCollideActors=True
	bCollideWorld=True
	bBlockActors=True
	bProjTarget=True
	Health=300
	HealthMax=300
&lt;/uscript&gt;

'''Foxpaw:''' Hmm, this would be simpler with UT2003's vehicle code, but may still be plausable with UT2004's vehicle code. The wheels and turrets aren't &quot;attached&quot; by bones - they ARE bones. Basically, the entire vehicle is one mesh, simulated by Karma. Basically, a ragdoll with it's own internal forces and stuff acting on it's &quot;body parts.&quot; It should be possible to remove parts of it similar to how limbs are &quot;gibbed&quot; from a player when they become a ragdoll, however, I don't know how accessible the vehicle's turret code, etc. is and so I don't know if you could plausably remove the functionality of turrets and wheels and stuff.

'''NamelessPlayer:''' I found a bHasOwnHealth variable in the ONSWeapon class. I experimented with it, and while the rear turret of a Hellbender had 100 health instead of 600, no damage was taken when the turret was shot. I was on the same team that it was set, so I added some bots &amp; let them take it. A driver got in, later to be joined by a side gunner. I shot the turret to no avail-it destroyed the Hellbender, and a Manta too! :) I might have to set up a health system for this to work, but I'll try it after I test it when it's fully manned.

''' NamelessPlayer 5/4/2004:''' I don't think it's working. I have to either check the hitbox or do smoe more coding to get the turrets to work. Speaking of which, how do I edit hitboxes?

'''Foxpaw:''' There's a discussion on the collision info for Skeletal Meshes on [[Legacy:SVehicle|SVehicle]], though I don't know if you can edit the hitboxes after importing the mesh or if it must be done in the 3D modelling program.

'''NamelessPlayer:''' Been a while since I checked back, but I have it to the point where the Hellbender rear turret can be destroyed with a shot from any weapon. I didn't have to do any hitbox editing. I have problems setting the health, though, and you'll get 3 &quot;Accessed None&quot;s in your log when you enter it, shoot it, or switch to the rear turret seat when it's destroyed. I was mainly updating in the Atari Forums...

'''NamelessPlayer:''' Setting the health to 300 through DefaultProperties does NOTHING as far as the 1-shot-kill goes. I fired a Shock Rifle beam at it...damage recorded as 45, but the turret is destroyed anyway! A HellBender turret has to withstand more damage than THAT...

'''NamelessPlayer:''' Well, whaddaya know? I set it to destroy when Health &gt;1...when it should be &lt;1! I don't have time to test, because I don't usually get PC time on Mondays or Thursdays, so I'll have to wait 'til tomorrow to test this...

'''NamelessPlayer (5/7/2004):''' That didn't help. I'll try putting spaces at the beginning &amp; the end in-between the parentheses.

'''NamelessPlayer:''' That STILL doesn't work. I made it so that it logs health as well. Apparently, when shot, health is NOT deducted! It also only starts taking damage after it's entered. Maybe I turned on something that wasn't neccesary?

'''NamelessPlayer:''' I posted the code above. As you can see, it didn't change much. Adding the Died function simply prevents the rear turret from taking ANY damage, and removing it will enable you to destroy the turret-with one shot, regardless of health!

'''NamelessPlayer (5/9/2004):''' It was actually MUCH simpler than expected-all I had to do was set some default properties &amp; modify TakeDamage so that Health -= Damage! It works almost perfectly now-the only problem is, it ignores Friendly fire settings. But right now, I'm moving on to the other things.

'''NamelessPlayer:''' DOES ANYBODY ACTUALLY SEE THIS? Okay, I edited the weapons to be destroyed as well. The only thing left to do is add code to make wheels destroyable, but I can't compile my own subclass of SVehicleWheel. Maybe I'm not doing something right.

'''NamelessPlayer:''' Doesn't seem right when I'm mostly talking to myself here...

Okay, when I said the turrets were done, I got the Hellbender rear turret to act the way I wanted, but OTHER turrets get destroyed with one shot! Also, the Leviathan weapons don't seem to have any collision detection. I wonder what causes this...

'''WheatPuppet:''' I'm definitely paying attention to this. I'm defining the basics of creating a simple Battlezone mod for UT2k4 and sectored damage is an intersesting possibility to me. My guess (and it's just that) for why leviathan turrets don't have collision detection is becuause they weren't designed to take invividual damage (although neither was the hellbender's...). I don't know how plausible it would be to rewrite the Levi's collision code *shrug*.

'''NamelessPlayer:''' VERY BAD NEWS-MY UT 2004 INSTALLATION IS SCREWED! First, I started crashing when in windowed mode(a real pain in the ass when you're trying to use the log), then I tried un-installing &amp; re-installing-but in the middle of installation, I get a BLUE ERROR SCREEN TELLING ME TO RESTART! I've only had this game for a little over a month! Any clue to what's going on?

'''Mosquito:''' Upgrade to XP or 2000, tbh, just pirate it, microsoft is a company that can do without your money.

'''NamelessPlayer:''' I've been having XP. My UT 2004 installation is back, but the problem that I tried to fix by re-installing is still there-the windowed crash bug! It's annoying when you need to check your log on a detailed map, mainly because the engine has to re-load all the textures &amp; stuff before you can start playing again. Now, I've been having this strange bug-only the Hellbender rear turret seens to have its health working the way I want it to. I used the same code for pretty much everything-for weapons, I added &quot;var int Health&quot;, and the Goliath turret works fine, but everything else is destroyed with one shot, and the Leviathan weapons don't collide with anything.

'''NamelessPlayer:''' Okay, the log problem is gone. However, I still have yet to figure out a way to make ALL of the turrets &amp; weapons work properly!

'''Syntax Error:''' You should check in unreal ed if there are collision boxes for the leviathon turrets. to see the box, load the mesh and click view -&gt; collison

'''NamelessPlayer (8/19/2005):''' It's been a long time since I've got back to this. I've borrowed the TakeDamage code from class Vehicle, and it works fine as far as the HellBender rear turret is concerned-but it DOES take up a bit of space just to fit all of the TakeDamage code in. I've tried condensing the code to a simple &quot;event Destroyed()&quot; with the &quot;if (Health &lt;1), destroy()&quot;, but I get an &quot;infinite script recursion&quot; error if I do it that way when the rear turret is destroyed. The code posted is the working code for a destroyable HellBender rear turret.

'''MythOpus:'''  You're getting an infinite recursion because you're calling the 'Destroy()' function inside the 'destroyed' function.  So...  because it's health is lower than 1, it will keep calling itself over and over and over and over and over... and then you have an infinite recursion.

'''NamelessPlayer (8/20/2005):''' I can't believe I didn't notice this earlier. All I had to do was enter the DefaultProperties settings &amp; I'm done-no functions/events needed! Now all I have to do is find out how to destroy weapons &amp; wheels-I also want to find a way to not entirely remove the vehicle seat if I, say, destroyed the HellBender's side turret.</text>
    </revision>
    <revision>
      <id>4908</id>
      <timestamp>2005-08-20T08:34:14Z</timestamp>
      <contributor>
        <ip>64-110-209-175.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>response to infinite recursion</comment>
      <text xml:space="preserve">What this mod should allow you to do is destroy parts of vehicles without destroying the vehicle itself. Let's take a Scorpion for example. Currently, you can only destroy the blades seperately. Why not have the same for the wheels &amp; turret? I believe that the wheels &amp; turrets are mounted by &quot;bones&quot;. A simple &quot;if&quot; statement applied to the bones might work-if not, I can try editing the turrets &amp; wheels instead. Keep in mind that I just finished my DVD Edition's VTMs, so I may not understand everything.

To-Do List:

*Destroyable Turrets-HellBender rear turret works fine, but the code is a bit bloated-I have yet to test on other vehicle turrets
*Destroyable Weapons-I have yet to test this, working on destructible turrets
*Destroyable Wheels-See above

==Current Code==

==AVDONSPRV==

&lt;uscript&gt;
//-----------------------------------------------------------
// Advanced Vehicle Damage HellBender
//-----------------------------------------------------------
class AVDONSPRV extends ONSPRV;

DefaultProperties
{
	PassengerWeapons(1)=(WeaponPawnClass=class'AVD.AVDONSPRVRearGunPawn',WeaponBone=Dummy02);
}
&lt;/uscript&gt;

==AVDONSPRVRearGunPawn==

&lt;uscript&gt;
//-----------------------------------------------------------
// Advanced Vehicle Damage HellBender Rear Turret
//-----------------------------------------------------------
class AVDONSPRVRearGunPawn extends ONSPRVRearGunPawn;

function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
						Vector momentum, class&lt;DamageType&gt; damageType)
{
	local int ActualDamage;
	local Controller Killer;

	// Spawn Protection: Cannot be destroyed by a player until possessed
	if ( bSpawnProtected &amp;&amp; instigatedBy != None &amp;&amp; instigatedBy != Self )
		return;

	NetUpdateTime = Level.TimeSeconds - 1; // force quick net update

	if (DamageType != None)
	{
		if ((instigatedBy == None || instigatedBy.Controller == None) &amp;&amp; DamageType.default.bDelayedDamage &amp;&amp; DelayedDamageInstigatorController != None)
			instigatedBy = DelayedDamageInstigatorController.Pawn;

		Damage *= DamageType.default.VehicleDamageScaling;
		momentum *= DamageType.default.VehicleMomentumScaling * MomentumMult;

	        if (bShowDamageOverlay &amp;&amp; DamageType.default.DamageOverlayMaterial != None &amp;&amp; Damage &gt; 0 )
        	    SetOverlayMaterial( DamageType.default.DamageOverlayMaterial, DamageType.default.DamageOverlayTime, false );
	}

	if (bRemoteControlled &amp;&amp; Driver!=None)
	{
	    ActualDamage = Damage;
	    if (Weapon != None)
	        Weapon.AdjustPlayerDamage(ActualDamage, InstigatedBy, HitLocation, Momentum, DamageType );
	    if (InstigatedBy != None &amp;&amp; InstigatedBy.HasUDamage())
	        ActualDamage *= 2;

	    ActualDamage = Level.Game.ReduceDamage(ActualDamage, self, instigatedBy, HitLocation, Momentum, DamageType);

	    if (Health - ActualDamage &lt;= 0)
	       	KDriverLeave(false);
	}

    if ( Physics != PHYS_Karma )
	{
		super.TakeDamage(Damage,InstigatedBy,HitLocation,Momentum,DamageType);
		return;
	}

	if (Weapon != None)
	        Weapon.AdjustPlayerDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType );
	if (InstigatedBy != None &amp;&amp; InstigatedBy.HasUDamage())
		Damage *= 2;
	ActualDamage = Level.Game.ReduceDamage(Damage, self, instigatedBy, HitLocation, Momentum, DamageType);
	Health -= ActualDamage;

	PlayHit(actualDamage, InstigatedBy, hitLocation, damageType, Momentum);
	// The vehicle is dead!
	if ( Health &lt;= 0 )
	{

		if ( Driver!=None &amp;&amp; (bEjectDriver || bRemoteControlled) )
		{
			if ( bEjectDriver )
				EjectDriver();
			else
        		KDriverLeave( false );
		}

		// pawn died
		if ( instigatedBy != None )
			Killer = instigatedBy.GetKillerController();
		if ( Killer == None &amp;&amp; (DamageType != None) &amp;&amp; DamageType.Default.bDelayedDamage )
			Killer = DelayedDamageInstigatorController;
		Died(Killer, damageType, HitLocation);
	}
	else if ( Controller != None )
		Controller.NotifyTakeHit(instigatedBy, HitLocation, actualDamage, DamageType, Momentum);

	MakeNoise(1.0);

	if ( !bDeleteMe )
	{
		if ( Location.Z &gt; Level.StallZ )
			Momentum.Z = FMin(Momentum.Z, 0);
		KAddImpulse(Momentum, hitlocation);
	}
}

DefaultProperties
	bHasOwnHealth=True
	bCollideActors=True
	bCollideWorld=True
	bBlockActors=True
	bProjTarget=True
	Health=300
	HealthMax=300
&lt;/uscript&gt;

'''Foxpaw:''' Hmm, this would be simpler with UT2003's vehicle code, but may still be plausable with UT2004's vehicle code. The wheels and turrets aren't &quot;attached&quot; by bones - they ARE bones. Basically, the entire vehicle is one mesh, simulated by Karma. Basically, a ragdoll with it's own internal forces and stuff acting on it's &quot;body parts.&quot; It should be possible to remove parts of it similar to how limbs are &quot;gibbed&quot; from a player when they become a ragdoll, however, I don't know how accessible the vehicle's turret code, etc. is and so I don't know if you could plausably remove the functionality of turrets and wheels and stuff.

'''NamelessPlayer:''' I found a bHasOwnHealth variable in the ONSWeapon class. I experimented with it, and while the rear turret of a Hellbender had 100 health instead of 600, no damage was taken when the turret was shot. I was on the same team that it was set, so I added some bots &amp; let them take it. A driver got in, later to be joined by a side gunner. I shot the turret to no avail-it destroyed the Hellbender, and a Manta too! :) I might have to set up a health system for this to work, but I'll try it after I test it when it's fully manned.

''' NamelessPlayer 5/4/2004:''' I don't think it's working. I have to either check the hitbox or do smoe more coding to get the turrets to work. Speaking of which, how do I edit hitboxes?

'''Foxpaw:''' There's a discussion on the collision info for Skeletal Meshes on [[Legacy:SVehicle|SVehicle]], though I don't know if you can edit the hitboxes after importing the mesh or if it must be done in the 3D modelling program.

'''NamelessPlayer:''' Been a while since I checked back, but I have it to the point where the Hellbender rear turret can be destroyed with a shot from any weapon. I didn't have to do any hitbox editing. I have problems setting the health, though, and you'll get 3 &quot;Accessed None&quot;s in your log when you enter it, shoot it, or switch to the rear turret seat when it's destroyed. I was mainly updating in the Atari Forums...

'''NamelessPlayer:''' Setting the health to 300 through DefaultProperties does NOTHING as far as the 1-shot-kill goes. I fired a Shock Rifle beam at it...damage recorded as 45, but the turret is destroyed anyway! A HellBender turret has to withstand more damage than THAT...

'''NamelessPlayer:''' Well, whaddaya know? I set it to destroy when Health &gt;1...when it should be &lt;1! I don't have time to test, because I don't usually get PC time on Mondays or Thursdays, so I'll have to wait 'til tomorrow to test this...

'''NamelessPlayer (5/7/2004):''' That didn't help. I'll try putting spaces at the beginning &amp; the end in-between the parentheses.

'''NamelessPlayer:''' That STILL doesn't work. I made it so that it logs health as well. Apparently, when shot, health is NOT deducted! It also only starts taking damage after it's entered. Maybe I turned on something that wasn't neccesary?

'''NamelessPlayer:''' I posted the code above. As you can see, it didn't change much. Adding the Died function simply prevents the rear turret from taking ANY damage, and removing it will enable you to destroy the turret-with one shot, regardless of health!

'''NamelessPlayer (5/9/2004):''' It was actually MUCH simpler than expected-all I had to do was set some default properties &amp; modify TakeDamage so that Health -= Damage! It works almost perfectly now-the only problem is, it ignores Friendly fire settings. But right now, I'm moving on to the other things.

'''NamelessPlayer:''' DOES ANYBODY ACTUALLY SEE THIS? Okay, I edited the weapons to be destroyed as well. The only thing left to do is add code to make wheels destroyable, but I can't compile my own subclass of SVehicleWheel. Maybe I'm not doing something right.

'''NamelessPlayer:''' Doesn't seem right when I'm mostly talking to myself here...

Okay, when I said the turrets were done, I got the Hellbender rear turret to act the way I wanted, but OTHER turrets get destroyed with one shot! Also, the Leviathan weapons don't seem to have any collision detection. I wonder what causes this...

'''WheatPuppet:''' I'm definitely paying attention to this. I'm defining the basics of creating a simple Battlezone mod for UT2k4 and sectored damage is an intersesting possibility to me. My guess (and it's just that) for why leviathan turrets don't have collision detection is becuause they weren't designed to take invividual damage (although neither was the hellbender's...). I don't know how plausible it would be to rewrite the Levi's collision code *shrug*.

'''NamelessPlayer:''' VERY BAD NEWS-MY UT 2004 INSTALLATION IS SCREWED! First, I started crashing when in windowed mode(a real pain in the ass when you're trying to use the log), then I tried un-installing &amp; re-installing-but in the middle of installation, I get a BLUE ERROR SCREEN TELLING ME TO RESTART! I've only had this game for a little over a month! Any clue to what's going on?

'''Mosquito:''' Upgrade to XP or 2000, tbh, just pirate it, microsoft is a company that can do without your money.

'''NamelessPlayer:''' I've been having XP. My UT 2004 installation is back, but the problem that I tried to fix by re-installing is still there-the windowed crash bug! It's annoying when you need to check your log on a detailed map, mainly because the engine has to re-load all the textures &amp; stuff before you can start playing again. Now, I've been having this strange bug-only the Hellbender rear turret seens to have its health working the way I want it to. I used the same code for pretty much everything-for weapons, I added &quot;var int Health&quot;, and the Goliath turret works fine, but everything else is destroyed with one shot, and the Leviathan weapons don't collide with anything.

'''NamelessPlayer:''' Okay, the log problem is gone. However, I still have yet to figure out a way to make ALL of the turrets &amp; weapons work properly!

'''Syntax Error:''' You should check in unreal ed if there are collision boxes for the leviathon turrets. to see the box, load the mesh and click view -&gt; collison

'''NamelessPlayer (8/19/2005):''' It's been a long time since I've got back to this. I've borrowed the TakeDamage code from class Vehicle, and it works fine as far as the HellBender rear turret is concerned-but it DOES take up a bit of space just to fit all of the TakeDamage code in. I've tried condensing the code to a simple &quot;event Destroyed()&quot; with the &quot;if (Health &lt;1), destroy()&quot;, but I get an &quot;infinite script recursion&quot; error if I do it that way when the rear turret is destroyed. The code posted is the working code for a destroyable HellBender rear turret.

'''MythOpus:'''  You're getting an infinite recursion because you're calling the 'Destroy()' function inside the 'destroyed' function.  So...  because it's health is lower than 1, it will keep calling itself over and over and over and over and over... and then you have an infinite recursion.</text>
    </revision>
    <revision>
      <id>4909</id>
      <timestamp>2005-08-20T22:08:52Z</timestamp>
      <contributor>
        <ip>Pcp0010138454pcs.dallas01.ga.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">What this mod should allow you to do is destroy parts of vehicles without destroying the vehicle itself. Let's take a Scorpion for example. Currently, you can only destroy the blades seperately. Why not have the same for the wheels &amp; turret? I believe that the wheels &amp; turrets are mounted by &quot;bones&quot;. A simple &quot;if&quot; statement applied to the bones might work-if not, I can try editing the turrets &amp; wheels instead. Keep in mind that I just finished my DVD Edition's VTMs, so I may not understand everything.

To-Do List:

*Destroyable Turrets-They seem to work fine.
*Destroyable Weapons-I haven't found a way to make them work yet. I remember being able to destroy the Goliath cannon in my past exploits, but the code has since been lost.
*Destroyable Wheels-I haven't found a way to make them work, and it's much more difficult than the other two.

==Current Code==

==AVDONSPRV==

&lt;uscript&gt;
//-----------------------------------------------------------
// Advanced Vehicle Damage HellBender
//-----------------------------------------------------------
class AVDONSPRV extends ONSPRV;

DefaultProperties
{
	PassengerWeapons(1)=(WeaponPawnClass=class'AVD.AVDONSPRVRearGunPawn',WeaponBone=Dummy02);
}
&lt;/uscript&gt;

==AVDONSPRVRearGunPawn==

&lt;uscript&gt;
//-----------------------------------------------------------
// Advanced Vehicle Damage HellBender Rear Turret
//-----------------------------------------------------------
class AVDONSPRVRearGunPawn extends ONSPRVRearGunPawn;

DefaultProperties
	bHasOwnHealth=True
	bCollideActors=True
	bCollideWorld=True
	bBlockActors=True
	bProjTarget=True
	Health=300
	HealthMax=300
&lt;/uscript&gt;

'''Foxpaw:''' Hmm, this would be simpler with UT2003's vehicle code, but may still be plausable with UT2004's vehicle code. The wheels and turrets aren't &quot;attached&quot; by bones - they ARE bones. Basically, the entire vehicle is one mesh, simulated by Karma. Basically, a ragdoll with it's own internal forces and stuff acting on it's &quot;body parts.&quot; It should be possible to remove parts of it similar to how limbs are &quot;gibbed&quot; from a player when they become a ragdoll, however, I don't know how accessible the vehicle's turret code, etc. is and so I don't know if you could plausably remove the functionality of turrets and wheels and stuff.

'''NamelessPlayer:''' I found a bHasOwnHealth variable in the ONSWeapon class. I experimented with it, and while the rear turret of a Hellbender had 100 health instead of 600, no damage was taken when the turret was shot. I was on the same team that it was set, so I added some bots &amp; let them take it. A driver got in, later to be joined by a side gunner. I shot the turret to no avail-it destroyed the Hellbender, and a Manta too! :) I might have to set up a health system for this to work, but I'll try it after I test it when it's fully manned.

''' NamelessPlayer 5/4/2004:''' I don't think it's working. I have to either check the hitbox or do smoe more coding to get the turrets to work. Speaking of which, how do I edit hitboxes?

'''Foxpaw:''' There's a discussion on the collision info for Skeletal Meshes on [[Legacy:SVehicle|SVehicle]], though I don't know if you can edit the hitboxes after importing the mesh or if it must be done in the 3D modelling program.

'''NamelessPlayer:''' Been a while since I checked back, but I have it to the point where the Hellbender rear turret can be destroyed with a shot from any weapon. I didn't have to do any hitbox editing. I have problems setting the health, though, and you'll get 3 &quot;Accessed None&quot;s in your log when you enter it, shoot it, or switch to the rear turret seat when it's destroyed. I was mainly updating in the Atari Forums...

'''NamelessPlayer:''' Setting the health to 300 through DefaultProperties does NOTHING as far as the 1-shot-kill goes. I fired a Shock Rifle beam at it...damage recorded as 45, but the turret is destroyed anyway! A HellBender turret has to withstand more damage than THAT...

'''NamelessPlayer:''' Well, whaddaya know? I set it to destroy when Health &gt;1...when it should be &lt;1! I don't have time to test, because I don't usually get PC time on Mondays or Thursdays, so I'll have to wait 'til tomorrow to test this...

'''NamelessPlayer (5/7/2004):''' That didn't help. I'll try putting spaces at the beginning &amp; the end in-between the parentheses.

'''NamelessPlayer:''' That STILL doesn't work. I made it so that it logs health as well. Apparently, when shot, health is NOT deducted! It also only starts taking damage after it's entered. Maybe I turned on something that wasn't neccesary?

'''NamelessPlayer:''' I posted the code above. As you can see, it didn't change much. Adding the Died function simply prevents the rear turret from taking ANY damage, and removing it will enable you to destroy the turret-with one shot, regardless of health!

'''NamelessPlayer (5/9/2004):''' It was actually MUCH simpler than expected-all I had to do was set some default properties &amp; modify TakeDamage so that Health -= Damage! It works almost perfectly now-the only problem is, it ignores Friendly fire settings. But right now, I'm moving on to the other things.

'''NamelessPlayer:''' DOES ANYBODY ACTUALLY SEE THIS? Okay, I edited the weapons to be destroyed as well. The only thing left to do is add code to make wheels destroyable, but I can't compile my own subclass of SVehicleWheel. Maybe I'm not doing something right.

'''NamelessPlayer:''' Doesn't seem right when I'm mostly talking to myself here...

Okay, when I said the turrets were done, I got the Hellbender rear turret to act the way I wanted, but OTHER turrets get destroyed with one shot! Also, the Leviathan weapons don't seem to have any collision detection. I wonder what causes this...

'''WheatPuppet:''' I'm definitely paying attention to this. I'm defining the basics of creating a simple Battlezone mod for UT2k4 and sectored damage is an intersesting possibility to me. My guess (and it's just that) for why leviathan turrets don't have collision detection is becuause they weren't designed to take invividual damage (although neither was the hellbender's...). I don't know how plausible it would be to rewrite the Levi's collision code *shrug*.

'''NamelessPlayer:''' VERY BAD NEWS-MY UT 2004 INSTALLATION IS SCREWED! First, I started crashing when in windowed mode(a real pain in the ass when you're trying to use the log), then I tried un-installing &amp; re-installing-but in the middle of installation, I get a BLUE ERROR SCREEN TELLING ME TO RESTART! I've only had this game for a little over a month! Any clue to what's going on?

'''Mosquito:''' Upgrade to XP or 2000, tbh, just pirate it, microsoft is a company that can do without your money.

'''NamelessPlayer:''' I've been having XP. My UT 2004 installation is back, but the problem that I tried to fix by re-installing is still there-the windowed crash bug! It's annoying when you need to check your log on a detailed map, mainly because the engine has to re-load all the textures &amp; stuff before you can start playing again. Now, I've been having this strange bug-only the Hellbender rear turret seens to have its health working the way I want it to. I used the same code for pretty much everything-for weapons, I added &quot;var int Health&quot;, and the Goliath turret works fine, but everything else is destroyed with one shot, and the Leviathan weapons don't collide with anything.

'''NamelessPlayer:''' Okay, the log problem is gone. However, I still have yet to figure out a way to make ALL of the turrets &amp; weapons work properly!

'''Syntax Error:''' You should check in unreal ed if there are collision boxes for the leviathon turrets. to see the box, load the mesh and click view -&gt; collison

'''NamelessPlayer (8/19/2005):''' It's been a long time since I've got back to this. I've borrowed the TakeDamage code from class Vehicle, and it works fine as far as the HellBender rear turret is concerned-but it DOES take up a bit of space just to fit all of the TakeDamage code in. I've tried condensing the code to a simple &quot;event Destroyed()&quot; with the &quot;if (Health &lt;1), destroy()&quot;, but I get an &quot;infinite script recursion&quot; error if I do it that way when the rear turret is destroyed. The code posted is the working code for a destroyable HellBender rear turret.

'''MythOpus:'''  You're getting an infinite recursion because you're calling the 'Destroy()' function inside the 'destroyed' function.  So...  because it's health is lower than 1, it will keep calling itself over and over and over and over and over... and then you have an infinite recursion.

'''NamelessPlayer (8/20/2005):''' I can't believe I didn't notice this earlier. All I had to do was enter the DefaultProperties settings &amp; I'm done-no funcions/events needed! Now all I have to do is find out how to destroy weapons &amp; wheels-I also want to find a way to not entirely remove the vehicle seat if I, say, destroyed the HellBender's side turret.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Anagram</title>
    <id>1895</id>
    <revision>
      <id>4647</id>
      <timestamp>2004-12-08T08:48:14Z</timestamp>
      <contributor>
        <ip>Hide-sle.sharp.co.uk</ip>
      </contributor>
      <minor/>
      <comment>* Corrected formatting in discussion</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Anagrams and guns aka Spelling with attitude}}

==Description ==

This is a team game.  At the start of the game each team is given a 10 letter word to create.  The letters that make up the words given to the teams are then spawned randomly around the level.

Words are created by collecting the letters and taking them to a central point on the map where they can be deposited.  However, letters must be deposited in the correct order in order to count.  If a letter is deposited out of order it simply respawns randomly on the map.

Players collect letters by simply runnnig over them.  A player can only carry one letter at a time, and may carry any letter they wish, even if it's not in the word they need.  Players can also drop letters whenever they want.  If a letter is dropped into a &quot;pain zone&quot; or not picked up after 60 seconds it will respawn in a random location.  Players drop letters when they are killed.

The currently deposited letters (and required ones) will be displayed on the player's HUD.  Letters will be ''lit'' as they are collected.

The following features are also supported:
* Enable anagram mode - So the word is presented as an anagram to each team that they then have to solve.
* Length of word - from 8 to 12 (are there enough 12 letter words?)
* Time limit - Sets the time limit for the game.  The winning team is then the one with the most letters in their word.
* Penalise out of order drops.  If this option is enabled and a player deposits a letter out of order then the players team will lose one of their currently deposited letter (if any).  If they have no letters deposited then any letters any players within the team are carrying will respawn randomly around the level.

I see no obvious reason not to have up to four teams playing this game.  If this was the case then the length of the words may need to be shortened to keep the network bandwidth down.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  The mod could probably use BR maps and use the ball spawn point as the &quot;deposit point&quot;.

'''Birelli:''' Yeah, and that would also make it a type of &quot;King of the hill&quot; mod, because if you can completely control the deposit point, you can keep your opponent from getting any letters in, and even use ones they drop when you &quot;incercept&quot; them.

'''Anonymous:''' Alternatively, you could make a particular letter required by both players but in quantity enough that one team won't get one.  Then allow assaults on other bases to steal the last letter of their word.</text>
    </revision>
    <revision>
      <id>4648</id>
      <timestamp>2002-09-13T19:03:17Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Anagrams and guns aka Spelling with attitude}}

==Description ==

This is a team game.  At the start of the game each team is given a 10 letter word to create.  The letters that make up the words given to the teams are then spawned randomly around the level.

Words are created by collecting the letters and taking them to a central point on the map where they can be deposited.  However, letters must be deposited in the correct order in order to count.  If a letter is deposited out of order it simply respawns randomly on the map.

Players collect letters by simply runnnig over them.  A player can only carry one letter at a time, and may carry any letter they wish, even if it's not in the word they need.  Players can also drop letters whenever they want.  If a letter is dropped into a &quot;pain zone&quot; or not picked up after 60 seconds it will respawn in a random location.  Players drop letters when they are killed.

The currently deposited letters (and required ones) will be displayed on the player's HUD.  Letters will be ''lit'' as they are collected.

The following features are also supported:
* Enable anagram mode - So the word is presented as an anagram to each team that they then have to solve.
* Length of word - from 8 to 12 (are there enough 12 letter words?)
* Time limit - Sets the time limit for the game.  The winning team is then the one with the most letters in their word.
* Penalise out of order drops.  If this option is enabled and a player deposits a letter out of order then the players team will lose one of their currently deposited letter (if any).  If they have no letters deposited then any letters any players within the team are carrying will respawn randomly around the level.

I see no obvious reason not to have up to four teams playing this game.  If this was the case then the length of the words may need to be shortened to keep the network bandwidth down.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  The mod could probably use BR maps and use the ball spawn point as the &quot;deposit point&quot;.

'''Birelli:''' Yeah, and that would also make it a type of &quot;King of the hill&quot; mod, because if you can completely control the deposit point, you can keep your opponent from getting any letters in, and even use ones they drop when you &quot;incercept&quot; them.</text>
    </revision>
    <revision>
      <id>4649</id>
      <timestamp>2004-09-01T15:59:20Z</timestamp>
      <contributor>
        <ip>Ptd-204-210-79-191.maine.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Anagrams and guns aka Spelling with attitude}}

==Description ==

This is a team game.  At the start of the game each team is given a 10 letter word to create.  The letters that make up the words given to the teams are then spawned randomly around the level.

Words are created by collecting the letters and taking them to a central point on the map where they can be deposited.  However, letters must be deposited in the correct order in order to count.  If a letter is deposited out of order it simply respawns randomly on the map.

Players collect letters by simply runnnig over them.  A player can only carry one letter at a time, and may carry any letter they wish, even if it's not in the word they need.  Players can also drop letters whenever they want.  If a letter is dropped into a &quot;pain zone&quot; or not picked up after 60 seconds it will respawn in a random location.  Players drop letters when they are killed.

The currently deposited letters (and required ones) will be displayed on the player's HUD.  Letters will be ''lit'' as they are collected.

The following features are also supported:
* Enable anagram mode - So the word is presented as an anagram to each team that they then have to solve.
* Length of word - from 8 to 12 (are there enough 12 letter words?)
* Time limit - Sets the time limit for the game.  The winning team is then the one with the most letters in their word.
* Penalise out of order drops.  If this option is enabled and a player deposits a letter out of order then the players team will lose one of their currently deposited letter (if any).  If they have no letters deposited then any letters any players within the team are carrying will respawn randomly around the level.

I see no obvious reason not to have up to four teams playing this game.  If this was the case then the length of the words may need to be shortened to keep the network bandwidth down.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  The mod could probably use BR maps and use the ball spawn point as the &quot;deposit point&quot;.

'''Birelli:''' Yeah, and that would also make it a type of &quot;King of the hill&quot; mod, because if you can completely control the deposit point, you can keep your opponent from getting any letters in, and even use ones they drop when you &quot;incercept&quot; them.

'''Anonymous:''' Alternatively, you could make a particular letter required by both players but in quantity enough that one team won't get
 one.  Then allow assaults on other bases to steal the last letter of their word.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Arms</title>
    <id>1865</id>
    <revision>
      <id>4579</id>
      <timestamp>2005-05-04T17:38:01Z</timestamp>
      <contributor>
        <ip>Static24-72-1-67.reverse.accesscomm.ca</ip>
      </contributor>
      <comment>Yay weapons</comment>
      <text xml:space="preserve">Arms

Why not bring back the good old weapons from previous doom and quake games? Nailguns, BFG's, hyperblaster, etc. Lots of guns. Maybe divide the different guns into classes by firepower so that the player only can have one weapon for each class. Or maybe create a weapons weight system to limit the players weapons. Perhaps make the player slower the closer the total weapon weight is to the maximum.

Just an idea.

Note: This is illegal. Doing it means violating the program's EULA. 

/Jo Are By (soldahl@online.no)

'''Zygar:''' Illegal? What are you on about? If you don't use the original model or graphics it is perfectly legal to do so.

'''empty_other:''' Ill always wanted a HUGE weaponpack, with all weapons trough times of unrealistic/scifi firstperson shooters, usable for the mapper. That had been cool. But to much work...

But what i at least want is the Shrinking Ray and the Devastators (i think they was named, those Dual &quot;Rocketlauncers&quot; from Duke Nukem 3d). Ill vote for this mod.

'''Kirk:''' Haha, the shrinking ray in UT? That would be a funny sight for the player that gets shrunken... The Devastator would be awesome, it never had enough ammo in D3D. But all the weapons from D3D are pretty cool. Wouldn't mind some Deux Ex weapons (that would be easy, although illegal, to port :D) or some from SS2.

'''empty_other:''' Not illegal if we model it ourself, in an updated cool &quot;unreal&quot; look, and give it another name...:) Why dont we do it? Starts now? Hmm, maybe because i havent tried making weapons before...

'''MythOpus:''' Personally, I hate making weapons... it takes sooo long to make just a simple custom weapon!  but I'll vote for this :D</text>
    </revision>
    <revision>
      <id>4580</id>
      <timestamp>2005-05-04T09:42:56Z</timestamp>
      <contributor>
        <ip>139.164.130.171</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Arms

Why not bring back the good old weapons from previous doom and quake games? Nailguns, BFG's, hyperblaster, etc. Lots of guns. Maybe divide the different guns into classes by firepower so that the player only can have one weapon for each class. Or maybe create a weapons weight system to limit the players weapons. Perhaps make the player slower the closer the total weapon weight is to the maximum.

Just an idea.

Note: This is illegal. Doing it means violating the program's EULA. 

/Jo Are By (soldahl@online.no)

'''Zygar:''' Illegal? What are you on about? If you don't use the original model or graphics it is perfectly legal to do so.

'''empty_other:''' Ill always wanted a HUGE weaponpack, with all weapons trough times of unrealistic/scifi firstperson shooters, usable for the mapper. That had been cool. But to much work...

But what i at least want is the Shrinking Ray and the Devastators (i think they was named, those Dual &quot;Rocketlauncers&quot; from Duke Nukem 3d). Ill vote for this mod.

'''Kirk:''' Haha, the shrinking ray in UT? That would be a funny sight for the player that gets shrunken... The Devastator would be awesome, it never had enough ammo in D3D. But all the weapons from D3D are pretty cool. Wouldn't mind some Deux Ex weapons (that would be easy, although illegal, to port :D) or some from SS2.

'''empty_other:''' Not illegal if we model it ourself, in an updated cool &quot;unreal&quot; look, and give it another name...:) Why dont we do it? Starts now? Hmm, maybe because i havent tried making weapons before...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Artillery Towers</title>
    <id>2020</id>
    <revision>
      <id>4929</id>
      <timestamp>2007-08-10T02:13:29Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Artillery Towers ==

Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off [the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a room in the tower will open and a large bomb will appear in the ammo room of the other team, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

==Ammo ==

ammo is distributed from a console in the ammo room, the player walks up to the console and a screen opens up asking what ammo the person wants, the player selects it and then has to wait for the ammo to be created, this varies from ammo to ammo, some taking less than a second, others taking much longer.some ideas for ammo I have:

acid ammo, that burns the tower when it hits it for a while

interceptor ammo, little rockets that try to hit enemy ammo when they are shot out of the mortar

interceptor blocker, attracts all interceptor rockets(see above) in the area, even ones from the team that fired the blocker

umbra bomb, it explodes in midair between the towers and creates a large area of black energy that makes it so that nobody can see what's going on inside the area, designed to provide cover

napalm bomb, when it hits it sprays unlit napalm all over the place, which then ignites soon after

bombshell, basic ammo that makes a small explosion when it hits

scatter bomb, when it's hit by enemy fire it splits into smaller shells that do moderate damage

drone pod, when the pod hits the enemy tower it folds open and releases 3 drones, small robots that can stick to walls and armed with small heat beams, the pod itself doesn't do damage but the drones can if they don't have any players nearby to attack

dud ammo, looks like a random kind of ammo when shot and attracts interceptors but does no damage to towers it hits.

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)

===Interested Scriptors ===

==Discussion ==

'''MythOpus:''' I'd hate to be a bother Marduk but could you perhaps use some formatting to pretty this page up?

'''Marduk:''' sorry, I just started this site so I'm not to good at that.</text>
    </revision>
    <revision>
      <id>4930</id>
      <timestamp>2007-08-08T19:32:28Z</timestamp>
      <contributor>
        <ip>Dialup-4.252.154.250.Dial1.Chicago1.Level3.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off [the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a room in the tower will open and a large bomb will appear in the ammo room of the other team, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

ammo is distributed from a console in the ammo room, the player walks up to the console and a screen opens up asking what ammo the person wants, the player selects it and then has to wait for the ammo to be created, this varies from ammo to ammo, some taking less than a second, others taking much longer.some ideas for ammo I have:

acid ammo, that burns the tower when it hits it for a while

interceptor ammo, little rockets that try to hit enemy ammo when they are shot out of the mortar

interceptor blocker, attracts all interceptor rockets(see above) in the area, even ones from the team that fired the blocker

umbra bomb, it explodes in midair between the towers and creates a large area of black energy that makes it so that nobody can see what's going on inside the area, designed to provide cover

napalm bomb, when it hits it sprays unlit napalm all over the place, which then ignites soon after

bombshell, basic ammo that makes a small explosion when it hits

scatter bomb, when it's hit by enemy fire it splits into smaller shells that do moderate damage

drone pod, when the pod hits the enemy tower it folds open and releases 3 drones, small robots that can stick to walls and armed with small heat beams, the pod itself doesn't do damage but the drones can if they don't have any players nearby to attack

dud ammo, looks like a random kind of ammo when shot and attracts interceptors but does no damage to towers it hits.

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)

'''MythOpus:''' I'd hate to be a bother Marduk but could you perhaps use some formatting to pretty this page up?

'''Marduk:''' sorry, I just started this site so I'm not to good at that.</text>
    </revision>
    <revision>
      <id>4931</id>
      <timestamp>2007-08-08T23:42:27Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Artillery Towers ==

Okay, basically this mod it a team game, with teams of 2v2 up to 6v6. Both teams have an iron tower with various rooms in them, an ammo room where they can get ammo,a small room with a mounted turret to shoot down ammo but can't harm the tower, a hospital to heal themselves, and in the basement an engine room, this is where the mortars get their power, some kind of machine puts coal into the furnace to generate power, but as the tower gets damaged the machine can break, and then somebody has to either repair the machine, or take a shovel and start shoveling the coal himself. The players themselves are armed with a pistol of some sort, and a machine gun, a wrench to repair machines, and a shovel to use as a weapon or to shovel coal. The players can pick up ammo, which makes the player move a bit slower and makes their only attack to throw the ammo. When they bring the ammo to the mortar the throw it into the slot at the back of the mortar and can if they wish throw up to three ammos in the chute, then they must walk to the side of it and get on a small seat which gives them control of the mortar, they aim the turret and fire, after they fire off [the ammo in the chute they go back and get more ammo or do other things. When ammo hits a tower it damages it and adds any effects the ammo had along with it, such as acid shells burning the tower for a time or frag bombs shattering and spraying shrapnel everywhere. once the tower is at zero health a room in the tower will open and a large bomb will appear in the ammo room of the other team, it cannot be loaded into the mortar and must be carried by a player into the opposing tower, the player must plant the bomb and run before the bomb detonated, the opposing team can diffuse the bomb by pressing the USE key by it(or some other button) and the bomb will dissappear, then the other team must try again, the game goes on until one team manages to detonate the bomb in the opponents tower and destroy it.

==Ammo ==

ammo is distributed from a console in the ammo room, the player walks up to the console and a screen opens up asking what ammo the person wants, the player selects it and then has to wait for the ammo to be created, this varies from ammo to ammo, some taking less than a second, others taking much longer.some ideas for ammo I have:

acid ammo, that burns the tower when it hits it for a while

interceptor ammo, little rockets that try to hit enemy ammo when they are shot out of the mortar

interceptor blocker, attracts all interceptor rockets(see above) in the area, even ones from the team that fired the blocker

umbra bomb, it explodes in midair between the towers and creates a large area of black energy that makes it so that nobody can see what's going on inside the area, designed to provide cover

napalm bomb, when it hits it sprays unlit napalm all over the place, which then ignites soon after

bombshell, basic ammo that makes a small explosion when it hits

scatter bomb, when it's hit by enemy fire it splits into smaller shells that do moderate damage

drone pod, when the pod hits the enemy tower it folds open and releases 3 drones, small robots that can stick to walls and armed with small heat beams, the pod itself doesn't do damage but the drones can if they don't have any players nearby to attack

dud ammo, looks like a random kind of ammo when shot and attracts interceptors but does no damage to towers it hits.

(yes I'm aware that this setup is like a nintendo DS game, I watched my little brother play it and thought it was a good idea, for the record the base idea of this is made by nintendo NOT me)

'''MythOpus:''' I'd hate to be a bother Marduk but could you perhaps use some formatting to pretty this page up?

'''Marduk:''' sorry, I just started this site so I'm not to good at that.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/BinkPlayer</title>
    <id>1866</id>
    <revision>
      <id>4581</id>
      <timestamp>2007-05-16T21:14:17Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; BinkPlayer}}

==About BinkPlayer ==

Renders a .bik file onto to a surface - video-on-a-wall; perhaps best as part of [[Legacy:Screen|Screen]]?  Mychaeel?
 

==Comments ==

'''DJPaul:'''  Okay, maybe I should have picked a video format that is, at least, open source so I can get to the sdk/codecs (doh).  Concept remains, however.

'''Mychaeel:'''  Nice thought, but impossible to realize without using native code.  I'll keep it in mind for Screen 2003, in any case.

'''DJPaul:''' Looking at the UDN, it appears this is in a later build of the UT2003 engine.  Delete this page?

'''_Lynx''': well, I'might add that DeusEx2 uses such stuff with UEngine v897 (or 926, dont' remember exactly) but guys at Ion Storm reworked the renderer competely... Anyway we can try to look the code, how it was done.

'''Foxpaw:''' This hasn't been touched in a year.. is it dead?

'''EricBlade:''' I sent an email to some peoples (the bink people, the people responsible for land of the dead, and the epic people), and got back three responses all of &quot;i don't think it's possible with the normal bink code that most people use with unreal&quot;</text>
    </revision>
    <revision>
      <id>4582</id>
      <timestamp>2005-06-30T02:43:00Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; BinkPlayer}}

==About BinkPlayer ==

Renders a .bik file onto to a surface - video-on-a-wall; perhaps best as part of [[Legacy:Screen|Screen]]?  Mychaeel?
 

==Comments ==

'''DJPaul:'''  Okay, maybe I should have picked a video format that is, at least, open source so I can get to the sdk/codecs (doh).  Concept remains, however.

'''Mychaeel:'''  Nice thought, but impossible to realize without using native code.  I'll keep it in mind for Screen 2003, in any case.

'''DJPaul:''' Looking at the UDN, it appears this is in a later build of the UT2003 engine.  Delete this page?

'''_Lynx''': well, I'might add that DeusEx2 uses such stuff with UEngine v897 (or 926, dont' remember exactly) but guys at Ion Storm reworked the renderer competely... Anyway we can try to look the code, how it was done.

'''Foxpaw:''' This hasn't been touched in a year.. is it dead?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Bloodbath</title>
    <id>2010</id>
    <revision>
      <id>4912</id>
      <timestamp>2004-07-05T09:21:23Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Though making all decals stay would give an fps of .2 in the end, it would be cool if a certain amount of decals in a certain area would kill themselves and be replaced by one bigger decal. When the amount of bigger decals was enough they'd merge too, and at the end of a game the whole map would be red and packed with bullet holes!

'''Legal:''' Just got this idea, thought somebody might be bored enough to consider it. After all, the usual &quot;unhappy-fps&quot; versions just setting DecalStay to infinate are still being made. Maybe this could be a good replacement for the newbie coder?

'''dataangel:''': That makes sense for stuff like blood splotches, but bullet holes and the like wouldn't look right I think. You'd fire them in 3 different places, then the new decal would appear, but it would have to be generated on the fly for the bullet holes to be in the exact same place. Then again... if a mutator can make static meshes on the fly, maybe decals are possible.

'''Foxpaw:''' You COULD use a scripted texture, but I think the premise was that if an area was peppered with a bunch (like 20 or so bullet holes close together, not just a few) of bullet holes they could be consolidated into one &quot;hole-ridden&quot; texture.

However, I am interested by your mention of creating static meshes on the fly. How is that done?

'''LegalAssassin:''' Actually, I didn't mean the bullet holes would have to be in the same position. Simply fading the small decals out while the larger ones fade in, thus masking the process. But as Foxpaw said, please elaborate on the &quot;on the fly&quot;-creation. Do you mean creation or just spawning?</text>
    </revision>
    <revision>
      <id>4913</id>
      <timestamp>2004-07-05T06:33:14Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Though making all decals stay would give an fps of .2 in the end, it would be cool if a certain amount of decals in a certain area would kill themselves and be replaced by one bigger decal. When the amount of bigger decals was enough they'd merge too, and at the end of a game the whole map would be red and packed with bullet holes!

'''Legal:''' Just got this idea, thought somebody might be bored enough to consider it. After all, the usual &quot;unhappy-fps&quot; versions just setting DecalStay to infinate are still being made. Maybe this could be a good replacement for the newbie coder?

'''dataangel:''': That makes sense for stuff like blood splotches, but bullet holes and the like wouldn't look right I think. You'd fire them in 3 different places, then the new decal would appear, but it would have to be generated on the fly for the bullet holes to be in the exact same place. Then again... if a mutator can make static meshes on the fly, maybe decals are possible.

'''Foxpaw:''' You COULD use a scripted texture, but I think the premise was that if an area was peppered with a bunch (like 20 or so bullet holes close together, not just a few) of bullet holes they could be consolidated into one &quot;hole-ridden&quot; texture.

However, I am interested by your mention of creating static meshes on the fly. How is that done?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Bloodrifle</title>
    <id>2007</id>
    <revision>
      <id>4906</id>
      <timestamp>2004-04-26T20:28:16Z</timestamp>
      <contributor>
        <ip>C-24-98-112-169.atl.client2.attbi.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bloodrifle:

This is a modified version of the sniper/shock rifle. I've been working on it for a bit, but others are welcome to try their own implementations. If you got inspiration from this, I'd be much obliged if you added &quot;inspired by 5parrow's Bloodrifle idea&quot; somewhere in your readme, code or wherever.

Pri-fire does 50 damage as per sniper rifle and can headcap. It fires a hitscan beam which would probably be purple (?) in colour. 

Sec-fire is the zoom.

When zoomed in, the rifle does 95 points of damage, but knocks off somewhere between 10 and 25 (up to you) points of the firer's health per shot (&quot;draining the user's life force&quot; to fire). It also causes the firer to bleed. The beam in this case is red.

Ideally the firer should not &quot;take a hit&quot; (grunt, etc) when his health gets knocked down - just lose health and bleed.

Yes, you should be able to kill yourself with this weapon: &quot;Player donated too much blood.&quot;

I'm thinking that the weapon model should look something roughly like the 2K4 shock rifle, but with a spine, needle or spike protruding from the stock of the weapon (so when the firer wields it, the needle pierces into his shoulder - you could also claim that this helps to stabilize the weapon!). The 'purple' (or whatever colour the normal beam is) parts of the rifle should glow red (for other players to see) when the rifle is zoomed in.

-5parrow-</text>
    </revision>
    <revision>
      <id>4905</id>
      <timestamp>2004-04-26T21:38:20Z</timestamp>
      <contributor>
        <ip>5parrowhawk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Bloodrifle:

This is a modified version of the sniper/shock rifle. I've been working on it for a bit, but others are welcome to try their own implementations. If you got inspiration from this, I'd be much obliged if you added &quot;inspired by 5parrow's Bloodrifle idea&quot; somewhere in your readme, code or wherever your credits are. - Before I forget this, part of the design of the weapon came from the charge-up Shock Rifle idea.

Pri-fire does 50 damage as per sniper rifle and can headcap. It fires a hitscan beam which would probably be purple (?) in colour. 

Sec-fire is the zoom.

When zoomed in, the rifle does 95 points of damage, but knocks off somewhere between 10 and 25 (up to you) points of the firer's health per shot (&quot;draining the user's life force&quot; to fire). It also causes the firer to bleed. The beam in this case is red.

Ideally the firer should not &quot;take a hit&quot; (grunt, etc) when his health gets knocked down - just lose health and bleed.

Yes, you should be able to kill yourself with this weapon: &quot;Player donated too much blood.&quot;

I'm thinking that the weapon model should look something roughly like the 2K4 shock rifle, but with a spine, needle or spike protruding from the stock of the weapon (so when the firer wields it, the needle pierces into his shoulder - you could also claim that this helps to stabilize the weapon!). The 'purple' (or whatever colour the normal beam is) parts of the rifle should glow red (for other players to see) when the rifle is zoomed in.

-5parrow-</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Bomberman</title>
    <id>1957</id>
    <revision>
      <id>4792</id>
      <timestamp>2006-10-13T19:53:18Z</timestamp>
      <contributor>
        <ip>1Cust7120.an3.dca16.da.uu.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I guess you all know that old game where you can see some kind of maze from the top and you have to drop bombs to bomb your way. While doing so you can get upgrades that give your bombs longer ranges and stuff... Usually it is played with 2-4 players and you have to make sure you stay out of your enemys bomb-range ;)

I've got the idea from the team that does the &quot;truecombat&quot; total conversion based on Q3.

Things that need to be done:
* create timed bombs a player can put on the ground
** those bombs might only explode in &quot;two dimensions&quot;
* create pickups that modify the bombs settings
* make rocks explode nicely
* change the viewpoint of the cam looking at the player (to get a view from above)
* create maps with a lot rocks to bomb ;)
* many other things I did not think of yet...

some more:
* different types of bombs. (freeze, high explosive, jelly, laser, mines?)
* 3D, but still from birds eye view so two people can play on one keyboard.
* Much bigger maps, maybe zoom in on the players, so if they get closer together on the map, it will zoom in a bit more and if they move apart, the camera will zoom out to encompass them both.
* Better Special Effects.
* the bombermen MUST look basically the same!
* More immersive map editor, more settings like, being able to place objects on the map to affect gameplay, (i.e: mirrors to deflect laser bombs around corners. Laser bombs would pretty much be the &quot;goldflame&quot; of the game, putting out a high power beam in the four directions.)

and adjusting the size of the maps, like resolution settings, 30x50 or something.

maybe include a complicated bot programming system, like, setting how far they can see which objects and how they would respond.
* new, yet equally quacky remarks.

if you can think of more, please post them. ^__^</text>
    </revision>
    <revision>
      <id>4793</id>
      <timestamp>2003-02-16T16:25:14Z</timestamp>
      <contributor>
        <ip>Balu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I guess you all know that old game where you can see some kind of maze from the top and you have to drop bombs to bomb your way. While doing so you can get upgrades that give your bombs longer ranges and stuff... Usually it is played with 2-4 players and you have to make sure you stay out of your enemys bomb-range ;)

I've got the idea from the team that does the &quot;truecombat&quot; total conversion based on Q3.

Things that need to be done:
* create timed bombs a player can put on the ground
** those bombs might only explode in &quot;two dimensions&quot;
* create pickups that modify the bombs settings
* make rocks explode nicely
* change the viewpoint of the cam looking at the player (to get a view from above)
* create maps with a lot rocks to bomb ;)
* many other things I did not think of yet...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/BotReport</title>
    <id>1948</id>
    <revision>
      <id>4771</id>
      <timestamp>2003-01-23T19:38:26Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Description==

Bot Report is a mutator that runs a botmatch game for pathing and level balancing analysis. It's recommended that the user set a high capture limit so that all bots have ample time to &quot;run the map&quot;. At the end of the session, bot reporting is saved to a date and timestamped text file.

==Report Features==

The report might be best saved as a CSV file for easier analysis. Although a selfreferencing html page might be better. There's a map report which displays map stats and a bot report which breaks down the bots.

==Map Report==

This shows how much something on the map was utilized.

PathNodeN - # times utilized, % of time utilized

JumpSpotN  - # times utilized, % of time utilized, method of utilization (impactjump, transloc, jump, dbljump)

AssaultPathN - # times utilized, % of time utilized

InventorySpotN - # times pickedup, % of time utilized

PlayerStartN - # times someone spawned here, % of time utilized vs other playerstarts

==Error Report==

Bots that move between the same two nodes more than twice(?) 

Bots that translocate more than n times from the same pathnode (ie, missing their target)

Bots that jump more than n times at the same pathnode (ie, they can't get up onto something)

==Bot Report==

For each bot in the match, a breakdown of how the bots did. Lifetimes will be useful in determining if there's too many or not enough weapons/ammo/health.

BotN - team #, # damage dealt, # damage rcvd, # nodes visited, shortest time alive, longest time alive, avg time alive

If (BR, CTF or DD) then do Team Averages

==Map Data==

A list of all the relevant properties for the map. Perhaps a config file could come with the mutator so people could edit a text file and pick and choose which properties they want. Nice to have but certainly not necessary.

PathNodeN - forced path 1-4, proscribed path 1-4, ..

JumpSpotN - forced path 1-4, proscribed path 1-4, transloc only, hammerjump, ..

AssaultPathN - forced path 1-4, proscribed path 1-4, return only, ..

==Comments==

'''Kerlin:''' I'm sure it's just me but I'd LOVE to see someone with the &quot;skillz&quot; make something like this happen. Sure, you still have to WATCH a botmatch to see if they round corners appropriately and so on, but this would remove some of the more mundane bot watching and give you a sort of &quot;to do&quot; list.

'''LedZep:''' It's a good idea man, might really help mappers out, I think there is already a mutator used for watching botmatches, i think it would be best to incorporate this idea into it. nice thoughts though ;)

'''Kerlin:''' Agreed. It's a shoe-in for [[Legacy:Spectate Bots|Spectate Botmatch]] isn't it? After shipping, I wonder if Mychaeel is even interested in adding something like this. There's always that post-ship burnout. :)

'''Mychaeel:''' I could imagine those path node stats as floating beacons in the map above the (visible) path nodes themselves.  Maybe even in a top-down generated map overview (DrawPortal on ScriptedTexture).  Mmmh...  :)

'''EntropicLqd:''' I'd not bother with the top down view.  For maps with lots of Z it might turn into a nightmare trying to figure out which path is at what level.  However, having the stats hovering above each pathnode would be very cool.  Being able to &quot;zoom&quot; to nodes that have never been used (or are over used) would be a nice feature too.

'''Kerlin:''' You've taken a good idea and turned it into a really good idea. I was just looking for a quick &amp; dirty solution though the elegance you describe has my mouth watering. It could still write a log file, though, right? I can only offer to place my undying gratitude in the readme of all of the marginal maps I will create. ;)</text>
    </revision>
    <revision>
      <id>4772</id>
      <timestamp>2003-01-23T16:20:25Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description==

Bot Report is a mutator that runs a botmatch game for pathing and level balancing analysis. It's recommended that the user set a high capture limit so that all bots have ample time to &quot;run the map&quot;. At the end of the session, bot reporting is saved to a date and timestamped text file.

==Report Features==

The report might be best saved as a CSV file for easier analysis. Although a selfreferencing html page might be better. There's a map report which displays map stats and a bot report which breaks down the bots.

==Map Report==

This shows how much something on the map was utilized.

PathNodeN - # times utilized, % of time utilized

JumpSpotN  - # times utilized, % of time utilized, method of utilization (impactjump, transloc, jump, dbljump)

AssaultPathN - # times utilized, % of time utilized

InventorySpotN - # times pickedup, % of time utilized

PlayerStartN - # times someone spawned here, % of time utilized vs other playerstarts

==Error Report==

Bots that move between the same two nodes more than twice(?) 

Bots that translocate more than n times from the same pathnode (ie, missing their target)

Bots that jump more than n times at the same pathnode (ie, they can't get up onto something)

==Bot Report==

For each bot in the match, a breakdown of how the bots did. Lifetimes will be useful in determining if there's too many or not enough weapons/ammo/health.

BotN - team #, # damage dealt, # damage rcvd, # nodes visited, shortest time alive, longest time alive, avg time alive

If (BR, CTF or DD) then do Team Averages

==Map Data==

A list of all the relevant properties for the map. Perhaps a config file could come with the mutator so people could edit a text file and pick and choose which properties they want. Nice to have but certainly not necessary.

PathNodeN - forced path 1-4, proscribed path 1-4, ..

JumpSpotN - forced path 1-4, proscribed path 1-4, transloc only, hammerjump, ..

AssaultPathN - forced path 1-4, proscribed path 1-4, return only, ..

==Comments==

'''Kerlin:''' I'm sure it's just me but I'd LOVE to see someone with the &quot;skillz&quot; make something like this happen. Sure, you still have to WATCH a botmatch to see if they round corners appropriately and so on, but this would remove some of the more mundane bot watching and give you a sort of &quot;to do&quot; list.

'''LedZep:''' It's a good idea man, might really help mappers out, I think there is already a mutator used for watching botmatches, i think it would be best to incorporate this idea into it. nice thoughts though ;)

'''Kerlin:''' Agreed. It's a shoe-in for [[Legacy:Spectate Bots|Spectate Botmatch]] isn't it? After shipping, I wonder if Mychaeel is even interested in adding something like this. There's always that post-ship burnout. :)

'''Mychaeel:''' I could imagine those path node stats as floating beacons in the map above the (visible) path nodes themselves.  Maybe even in a top-down generated map overview (DrawPortal on ScriptedTexture).  Mmmh...  :)</text>
    </revision>
    <revision>
      <id>4773</id>
      <timestamp>2003-01-23T17:12:43Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>my 2p</comment>
      <text xml:space="preserve">==Description==

Bot Report is a mutator that runs a botmatch game for pathing and level balancing analysis. It's recommended that the user set a high capture limit so that all bots have ample time to &quot;run the map&quot;. At the end of the session, bot reporting is saved to a date and timestamped text file.

==Report Features==

The report might be best saved as a CSV file for easier analysis. Although a selfreferencing html page might be better. There's a map report which displays map stats and a bot report which breaks down the bots.

==Map Report==

This shows how much something on the map was utilized.

PathNodeN - # times utilized, % of time utilized

JumpSpotN  - # times utilized, % of time utilized, method of utilization (impactjump, transloc, jump, dbljump)

AssaultPathN - # times utilized, % of time utilized

InventorySpotN - # times pickedup, % of time utilized

PlayerStartN - # times someone spawned here, % of time utilized vs other playerstarts

==Error Report==

Bots that move between the same two nodes more than twice(?) 

Bots that translocate more than n times from the same pathnode (ie, missing their target)

Bots that jump more than n times at the same pathnode (ie, they can't get up onto something)

==Bot Report==

For each bot in the match, a breakdown of how the bots did. Lifetimes will be useful in determining if there's too many or not enough weapons/ammo/health.

BotN - team #, # damage dealt, # damage rcvd, # nodes visited, shortest time alive, longest time alive, avg time alive

If (BR, CTF or DD) then do Team Averages

==Map Data==

A list of all the relevant properties for the map. Perhaps a config file could come with the mutator so people could edit a text file and pick and choose which properties they want. Nice to have but certainly not necessary.

PathNodeN - forced path 1-4, proscribed path 1-4, ..

JumpSpotN - forced path 1-4, proscribed path 1-4, transloc only, hammerjump, ..

AssaultPathN - forced path 1-4, proscribed path 1-4, return only, ..

==Comments==

'''Kerlin:''' I'm sure it's just me but I'd LOVE to see someone with the &quot;skillz&quot; make something like this happen. Sure, you still have to WATCH a botmatch to see if they round corners appropriately and so on, but this would remove some of the more mundane bot watching and give you a sort of &quot;to do&quot; list.

'''LedZep:''' It's a good idea man, might really help mappers out, I think there is already a mutator used for watching botmatches, i think it would be best to incorporate this idea into it. nice thoughts though ;)

'''Kerlin:''' Agreed. It's a shoe-in for [[Legacy:Spectate Bots|Spectate Botmatch]] isn't it? After shipping, I wonder if Mychaeel is even interested in adding something like this. There's always that post-ship burnout. :)

'''Mychaeel:''' I could imagine those path node stats as floating beacons in the map above the (visible) path nodes themselves.  Maybe even in a top-down generated map overview (DrawPortal on ScriptedTexture).  Mmmh...  :)

'''EntropicLqd:''' I'd not bother with the top down view.  For maps with lots of Z it might turn into a nightmare trying to figure out which path is at what level.  However, having the stats hovering above each pathnode would be very cool.  Being able to &quot;zoom&quot; to nodes that have never been used (or are over used) would be a nice feature too.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Buddy List</title>
    <id>2006</id>
    <revision>
      <id>4903</id>
      <timestamp>2005-01-12T07:14:35Z</timestamp>
      <contributor>
        <ip>Bc18524.bendcable.com</ip>
      </contributor>
      <comment>* Refactored discussion ~Not Dead Ch3z~</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT Classic and UT2003 &amp;ndash; BuddyList}}

==Description ==

Gives the ability to store Buddy's in a list and edit (add/remove from) that list. 
;Find out what server your buddy is on: (if that data is allowed by buddy)
;Option to &quot;Follow&quot; buddy: makes you automatically join whatever server he/she goes to. (if that data is allowed by buddy)
;Be Followed: (Option not to be automatically &quot;Followed&quot;.)
;Option to PM: (private message) buddies.
;No PM's: (Option not to accept PM's. (at all))
;Ignore list: (accept no PM's from whoever also do not give out current-server-attended-information)
;Visible-To list: only allow PM's and current-server-attended-information to those in a list.
;Hide-From list: similar to Visible-To list, but allow PM's and current-server-attended-information to anyone who is NOT in the list.)

(Only ONE option, Visible-To OR Hide-From, will be used, by the client at a time. may end up being named Friends list and Shit list hehe.)

(add more features at will, not all will end up in the final.)

==Progress ==

Not started as of 5April04.

(already have some code to build a buddy list from a window via the mod menu item that has  a combolist object, an add button, and a remove button. All entries in the combolist object are stored in an ini file and load back up when the window is called up. works great, even ignores duplicates, code available upon request for use in this mod or any other.)

==Structure ==

I've been giving this some thought and have an idea of how it could be accomplished. Consideration has been given to avoid searching all the servers from the MasterServer list and then searching all those servers for a playername. That would take to long and would suck. This structure is proposed to only bombard with the MasterServer with no more than the heartbeat of just one more server.
;First of all, the server-side:

MasterPlayerServer: This is a ut dedicated server that recieves a heartbeat from all clients running the mod. The heartbeat includes Name, and IP address. The MasterPlayerServer will do only two things; track heartbeats and forward them upon requests. Everything else is done client-side once the client has gotten the ip address of his buddy.

The server itself runs a new gametype and sends a heartbeat to the masterserver in case the MasterPlayerServer (this server)'s ip address stored in the client-side ini file should ever change. Upon not finding the server at that address the client-side mod will query the MasterServer for the server running that new gametype and update the ip address in the ini file.

This server-side mod accepts no joins (could be as simple as a serverpackage set in the server ini file and allow downloads set to false, we don't want anyone to join this server). The new gametype can simply override the login function of GameInfo class to return False, then no one could log in.

Possibly all heartbeats are added to or appended in a dynamic array server-side. The information in that heartbeat (Client's IP address) is forwarded to the client that sent the query looking for that player.

I would consider the priveledge of hosting the MasterPlayerServer to be an honor, and already have a host in mind with unlimitted bandwidth. Upon completion of this mod I will present the opportunity to Ryan @ ShooterSGL.com. If for some reason he declines the offer I can only imagine there are plenty with the facilities to host it, and that they would be happy to. This mod should include in the interface a nice thank you to ie. &quot;ShooterSGL.com for hosting the MasterPlayerServer&quot;. See the appeal? This message is stored in the Client-side ini file and should the host ever change, this message would be updated from the Server-side mod to reflect the name of the current host as he would edit that line in the Server-Side ini. 

;Now, Client-side:

Clients running this mod will, upon launching UT, begin sending a heartbeat to the MasterPlayerServer every 60 seconds. 

Upon querying the MasterPlayerServer for a certain buddy, the dynamic array is searched for that player's name. If found that player's ip address is forwarded to the searching Client. If not found a confirmation is sent to that effect.

Upon finding a buddy, via matching his Name to that of a heartbeat, a query is sent to the buddy's client requesting the ip address of the server he is playing on. That way the buddy can control who tracks him via an ignore list or possible a visible-to list. PM's can now be sent.

The PM could even reach the buddy when he is on a server in the form a duplicate of the chat area drawn in the lower right of his screen. Or in the form of a &quot;left message&quot; depending on the buddy's set options reguarding incomming PM's.

The hearbeat could even be sent from a subclassed form of dedicated server and could remain active to recieve PM's without even running any other instance of UT. Then PM's would be pop-up windows instead. 

I'm thinking that the main interface for this information will be under a new tab on the serverbrowser window. At the mod menu item for this mod you will add and remove buddys to and from a combolist controle that is saved to an ini file upon change. Here you will set you preferences for ignore, visible-to, allow pm's in game, that sort of thing.

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*(name in link form, please specify engine version)
*(name in link form, please specify engine version)

==Discussion ==

'''Ch3z:''' Just throwing this idea out there. I have looked into some aspects of it, and so far have not coded any of it. The idea here is mold the structure into a plan before beginning to code it. Any and all usefull input is welcome here. I will come back perodically and factor the discussion into the structure section of this page until the plan becomes defined enough to continue. Don't let that stop you from starting the mod if you already have derived a direction to pull it off. The main goal here is that the mod becomes available. 

Discussion other than that below this line has already been refactored into the proposed structure above (as will the discussion below at some point).

Past discussion offered different methodology, but was not supported by any suggestion of implementation. Discussion is still open here for the purpose of defining the structure of this project.</text>
    </revision>
    <revision>
      <id>4904</id>
      <timestamp>2004-04-21T10:35:57Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>* more discussion on server-side language.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT Classic and UT2003 &amp;ndash; BuddyList}}

==Description ==

Gives the ability to store Buddy's in a list and edit (add/remove from) that list. 
;Find out what server your buddy is on: (if that data is allowed by buddy)
;Option to &quot;Follow&quot; buddy: makes you automatically join whatever server he/she goes to. (if that data is allowed by buddy)
;Be Followed: (Option not to be automatically &quot;Followed&quot;.)
;Option to PM: (private message) buddies.
;No PM's: (Option not to accept PM's. (at all))
;Ignore list: (accept no PM's from whoever also do not give out current-server-attended-information)
;Visible-To list: only allow PM's and current-server-attended-information to those in a list.
;Hide-From list: similar to Visible-To list, but allow PM's and current-server-attended-information to anyone who is NOT in the list.)

(Only ONE option, Visible-To OR Hide-From, will be used, by the client at a time. may end up being named Friends list and Shit list hehe.)

(add more features at will, not all will end up in the final.)

==Progress ==

Not started as of 5April04.

(already have some code to build a buddy list from a window via the mod menu item that has  a combolist object, an add button, and a remove button. All entries in the combolist object are stored in an ini file and load back up when the window is called up. works great, even ignores duplicates, code available upon request for use in this mod or any other.)

==Structure ==

I've been giving this some thought and have an idea of how it could be accomplished. Consideration has been given to avoid searching all the servers from the MasterServer list and then searching all those servers for a playername. That would take to long and would suck. This structure is proposed to only bombard with the MasterServer with no more than the heartbeat of just one more server.
;First of all, the server-side:

MasterPlayerServer: This is a ut dedicated server that recieves a heartbeat from all clients running the mod. The heartbeat includes Name, and IP address. The MasterPlayerServer will do only two things; track heartbeats and forward them upon requests. Everything else is done client-side once the client has gotten the ip address of his buddy.

The server itself runs a new gametype and sends a heartbeat to the masterserver in case the MasterPlayerServer (this server)'s ip address stored in the client-side ini file should ever change. Upon not finding the server at that address the client-side mod will query the MasterServer for the server running that new gametype and update the ip address in the ini file.

This server-side mod accepts no joins (could be as simple as a serverpackage set in the server ini file and allow downloads set to false, we don't want anyone to join this server).

Possibly all heartbeats are added to or appended in a dynamic array server-side. The information in that heartbeat (Client's IP address) is forwarded to the client that sent the query looking for that player.

I would consider the priveledge of hosting the MasterPlayerServer to be an honor, and already have a host in mind with unlimitted bandwidth. Upon completion of this mod I will present the opportunity to Ryan @ ShooterSGL.com. If for some reason he declines the offer I can only imagine there are plenty with the facilities to host it, and that they would be happy to. This mod should include in the interface a nice thank you to ie. &quot;ShooterSGL.com for hosting the MasterPlayerServer&quot;. See the appeal? This message is stored in the Client-side ini file and should the host ever change, this message would be updated from the Server-side mod to reflect the name of the current host as he would edit that line in the Server-Side ini. 

;Now, Client-side:

Clients running this mod will, upon launching UT, begin sending a heartbeat to the MasterPlayerServer every 60 seconds. 

Upon querying the MasterPlayerServer for a certain buddy, the dynamic array is searched for that player's name. If found that player's ip address is forwarded to the searching Client. If not found a confirmation is sent to that effect.

Upon finding a buddy, via matching his Name to that of a heartbeat, a query is sent to the buddy's client requesting the ip address of the server he is playing on. That way the buddy can control who tracks him via an ignore list or possible a visible-to list. PM's can now be sent.

The PM could even reach the buddy when he is on a server in the form a duplicate of the chat area drawn in the lower right of his screen. Or in the form of a &quot;left message&quot; depending on the buddy's set options reguarding incomming PM's.

The hearbeat could even be sent from a subclassed form of dedicated server and could remain active to recieve PM's without even running any other instance of UT. Then PM's would be pop-up windows instead. 

I'm thinking that the main interface for this information will be under a new tab on the serverbrowser window. At the mod menu item for this mod you will add and remove buddys to and from a combolist controle that is saved to an ini file upon change. Here you will set you preferences for ignore, visible-to, allow pm's in game, that sort of thing.

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*(name in link form, please specify engine version)
*(name in link form, please specify engine version)

==Discussion ==

'''Ch3z:''' Just throwing this idea out there. I have looked into some aspects of it, and so far have not coded any of it. The idea here is mold the structure into a plan before beginning to code it. Any and all usefull input is welcome here. I will come back perodically and factor the discussion into the structure section of this page until the plan becomes defined enough to continue. Don't let that stop you from starting the mod if you already have derived a direction to pull it off. The main goal here is that the mod becomes available. 

Discussion other than that below this line has already been refactored into the proposed structure above (as will the discussion below at some point).

'''Foxpaw:''' As for preventing people from joining the central server, this should be easily doable with a custom gametype - which I assume you would have anyway. Just return false in the PreLogin function to deny the login. (I think PreLogin is the one I'm thinking of.)

'''DJPaul:''' Instead of a masterplayerserver, a perl/php/java/whatever script running on a machine would be less overhead and more appropiate.

'''CH3Z:''' If someone interested in working on this mod would know how to write that and how to write that server and how to make the client-side mod interface with it that would be great.

'''Foxpaw:'''I don't know about a script running on a machine being more efficient. Unrealscript is faster than java and I'd expect PHP and perl as well.

'''DJPaul:''' I'm not believeing that for a second.  I'm not an expert at the ins-and-outs of unrealscript, but, for example, maniuplating or sorting through strings is VERY slow (try downloading a webpage and parsing it), so i'm hazarding a guess that a language that is not run on top of a renderer and other subsystems will be slower than a PHP or a perl or a java or a whatever script.

A PHP/Java/Perl script on a webserver is much less overhead than running a game (with associated subsystems) just for the express purposes of keeping track of what IP a player is connected to, even with the additional overhead of MySQLd (or PostgreSQLd, which is faster still).

Unrealscript might be more efficent in the context of a game than, say, PHP, but that is because it was written for and to exist in a game environment, where the others were not nearly as specific.

'''Foxpaw:''' Well, you can run Unrealscript without the renderer and stuff, if you want, though I'm not sure if you can use the networking stuff if you do that. However, Unrealscript code executes faster than Java, which, I believe, is itself faster than Perl or PHP. 

'''CH3Z:''' I'm inclined to think that the differences would be minute as far as getting the job done. As far as overhead, there would probably be less. But, I already know the code is established for UT to talk to UT and it even validates the server already. DoS attack prevention is already established with the new ipdrv. I don't want to reinvent the wheel, myself. But, if someone is proficient enough in another language to handle that end while coordinating with those working on the client-side then I'm for it. Otherwise, UT to UT isn't bad.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CTFextras</title>
    <id>1990</id>
    <revision>
      <id>4867</id>
      <timestamp>2004-01-19T23:25:10Z</timestamp>
      <contributor>
        <ip>Host217-42-146-178.range217-42.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">CTF Extras

im goin to be starting this for UT first

basically ctf extras are a set of new triggers/actors to enhance ctf games for mappers!

MultiTeamTrigger:

it have two droplists: teamnumberlist and teameventlist

if in slot 1 of teamnumberlist i put &quot;1&quot; and in teameventlist slot1 i put  &quot;woot&quot;

when someone of team 1 touches the trigger it will trigger event &quot;woot&quot; pretty basic

StartTeamChanger:

this sctor will contain one input where you will place a teams number eg. changeteamnum: 1

the event should be the tag of a playerstart actor eg. event: &quot;uber&quot;

when triggered by a multiteamtrigger all playerstart actors with the tag &quot;uber&quot; will change to team 1 so team1 spawns there only

there should also be a trigger for changing a teamcannons teamnumber so it will defend these little areas

how this will improve gameplay:

teams will need to work together to capture these small areas so they spawn closer to the enemy base

this could save player a long trip to the enemy base and making the flagrun shorter

teams will want to defend any additional playerstart areas near thier own base to stop enemy capturing it

the idea was inspired by unreal2 xmp

if there are any programmers out there who are intrested

please add your name to this list if your intrested

and drop me an email phoenix99@vgnmail.com

list:</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CarJack</title>
    <id>1983</id>
    <revision>
      <id>4848</id>
      <timestamp>2007-11-19T00:25:49Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; CarJack}}

==Project Status ==

Judging by the references to UT2003 on this page, this idea has been knocking around for years.  I've decided to have a crack at this.  Journal at [[Legacy:Sweavo/CarJack|sweavo/CarJack]].  Please come and join in!

==Original Description ==

by '''Kagato'''

Each team's base is a &quot;garage&quot;, a large area where vehicles can be parked (not necessarily enclosed). At the start of the game, a number of cars are spawned around the map. The goal of the game is to steal all the cars, and park them in your team's garage. Cars can be stolen from the garage as easily as anywhere else on the map, so your team must guard your garage as well as hunt down the vehicles.

If a team has every car parked in their garage for 10 seconds, or they hold the majority at timeout, they win the game. In the event of a tie at timeout, the game goes into &quot;sudden death&quot; mode, where any change in car balance between the teams (gained or lost) immediately determines the winner.

The cars should be designed to allow for a passenger, who can stand in the back and use weapons. This promotes the use of the cars to get to other cars (drive a second player out to the car, and drive both back to base), rather than just hoarding them. Ideally, the physics should be written such that if the car is jolted sufficiently, the occupants can be thrown out (ie, high-speed collisions send the occupants into ragdoll mode temporarily)... ramming is a valid technique for stealing currently-occupied vehicles. :)

The cars should be indestructible, such that there is always a constant number of vehicles in play. They should also be self-righting, so cars don't get abandoned upside-down and undriveable. In the event that a car does get stuck somehow, they should be just light enough that judicious application of the shield gun can nudge it back into play. (This also means that a potential way to quickly clear an opponent's garage is to hit it with a Redeemer, and send the cars flying :D)

Depending on map design, cars could either spawn at known points, or randomly throughout the map (if no points are assigned). The number of cars spawned is also a map design issue (with a game setting override), although should never be less than two. A mapper could, for example, design a map with four cars &amp;ndash; two already parked in each team's garage &amp;ndash; forcing an incursion into enemy territory...

[[Image:Legacy_kagato_carjack_sketch.jpeg|center|An example car concept]]

'''Kagato:''' I won't have the skills to work on this mod myself for some time, so I'll throw this one open.

==Required Work==

===CarJack Gametype===
* Subclasses xDeathmatch
* Enables vehicles
* Keeps kills from scoring

===GarageVolume===
* Scores specified team on &lt;tt&gt;Touch();&lt;/tt&gt; 

==Comments ==

'''GRAF1K:''' I don't know about the rest of you, but this sounds INCREDIBLY fun, and even if it was based on UnrealBallPool (which it wasn't) it would be a way better gametype in it's own right. Awesome idea Kagato. :tup: Doesn't sound too hard to script; I think I could do it myself in not too much time.

'''MeanFish:''' This is an amazing idea... when does it get released? :-P  Seriously... this one's got a lot of potential.  A couple important questions though:

'''Foxpaw:''' Well, it's quite possible that you could still have people inside a car able to be killed. In my mod it's already quite possible to hit the driver by shooting through windows, or potentially doors and such if your weapon is powerful enough. It appears that the vehicles in UT2004 are going to have the ability to hit the driver separately from the vehicle as well, though that's just speculation based on screenshots.

'''Kagato:''' I envision a 2-seater open-topped car, like a dune buggy with a rollcage. The occupants are exposed and can be shot at. (I guess a bit like Halo's Warthog, but smaller.) Is it possible to set the bone positions of a character? Ideally, you could put the driving player in a sitting pose, and &quot;attach&quot; him to the car &amp;ndash; maybe even have his arms move as the car steers. I have yet to develop my modelling skills, but I can post a sketch if you like. '''(sketch added)'''

'''Foxpaw:''' It is possible to set the bones of a character to make scripted animations, but it's not the best route. Many custom models will not animate properly due to a different bone structure. UT2004 has &quot;exposed&quot; drivers (at least, you can see them in the screenshots, don't know if they can be shot or not) so there is almost certainately going to be a standardized driving animation that people making models will include.

'''MeanFish:''' It seems to me that by making some alterations to the collsion volume for the vehicle mesh you could indeed shoot at the driver i.e. not have it include areas where you intend for the assailants to shoot through.

'''HSDanClark:''' I actually got to play UT2004 at the [[Legacy:Unreal_University|Unreal_University]] last weekend, so maybe I can settle a thing or two. When you're in a vehicle, whether it's an open vehicle or a closed vehicle, both the player and the vehicle take damage when shot at. In the lower left corner, both your health and the &quot;health&quot; of the vehicle are displayed. This being the case, the only way to hit the driver without hitting the vehicle is to use an accurate instant-hit weapon, like the lightning gun or the sniper rifle. Any other weapons will either cause splash damage to the vehicle or have (like the minigun) a spread that will spill over onto the vehicle. Don't worry about the need to kill a driver without damaging a vehicle &amp;ndash; vehicles can he repaired in the field by the alt-fire of the linkgun. If you want someone's vehicle and you damage it, you can just go up and &quot;heal&quot; it before 'jacking it. Also, and this might be a good launching point for modders, Onslaught is the only gametype that supports vehicles at ship time. Any CTF, DM, or other gametype maps that contain vehicles will have to be produced by the community &amp;ndash; and mods have to be scripted to allow things like flag carriers to get in a vehicle.

'''GRAF1K:''' This would have to be a custom gametype with custom maps anyhow. As for shooting players while driving:

=====Quote:=====

----
:Originally Posted by '''Kagato'''
:''The cars should be indestructible, such that there is always a constant number of vehicles in play.''

----

'''HSDanClark:''' That's fine... the cars ''can'' be indestructible. I haven't seen the vehicle UScript that comes with [[Legacy:UT2004|UT2004]], but I'm sure there will be a property to set for taking/not taking damage. Failing that, they can always be re-scripted &amp;ndash; it's about a two line fix to make them not take damage.

'''Foxpaw:''' I'm not sure that indestructable cars are the way to go. I would instead suggest something like respawning cars. Or maybe even have new cars drive on to the map with a non-combative AI driver who you'd have to cap before taking the vehicle. Then you could have them come in through a tunnel or something. I think that would be better than just having cars respawn from thin air.

Indestructable cars I don't really like the idea of because although being indestructable to shooting is reasonable enough, what if it gets driven off a cliff? There would be no way to get the vehicle back up onto the map. (Unless perhaps you had something like in Mario Kart where something picks up the car and puts it back onto the map somewhere.

'''GRAF1K:''' Hmmm. Suppose it doesn't accept weapon damage instead of ''all'' damage?

'''Foxpaw:''' Well, depending on how you destroy it when it goes off a cliff or whatever, when something surpasses the KillZ of the zone, I don't think it get's damaged, it just gets destroyed. I think. It destroys things like weapons and the camera, at least on my mod, so I think that it may just call destroy instead of takedamage.

However, having said that, it's still entirely possible that a vehicle could get stuck or trapped somehow, or alternatively the Karma system can suffer an internal error and that will result in either destruction of the karma object, or immediately ceasing simulation of it, depending on the setting of bDestroyOnSimError in the KParams.

So, I think that there should be some means of replacing vehicles that are destroyed, either by getting trapped, suffering a Simerror, or something else.

'''Kagato:''' Definitely need some way of handling car loss conditions (simply respawning the car where it started should do), but players shouldn't be able to deliberately destroy cars, in my opinion. If you can blow them up to spawn a fresh car, it takes away from the &quot;car theft&quot; gameplay a bit. I also think being able to snipe the driver is important to gameplay, so I hope that can be done.

A friend had an amusing suggestion for anchoring the driver; drop him into ragdoll mode and attach his hands to the wheel and feet to the pedals, and let physics sort out the rest. :P You'd end up with a pretty drunk looking driver, I think...

'''GRAF1K:'''
:&lt;font size = &quot;1&quot;&gt;Quote:&lt;/font&gt;

----
:Originally Posted by '''Kagato'''
:''You'd end up with a pretty drunk looking driver, I think...''

----

Not if you attach a few other things. That's actually a good idea. Imagine watching the player get thrown like he's getting whiplash as he does a doughnut manuever... :D

'''Foxpaw:''' You'd probrably also want to have a seatbelt if you were going to do that. However, having said that, the performance implications of having numerous players ragdolled and in constant contact with a karma vehicle will put a lot of stress on the physics engine.. I think you might have a problem with framerate if you have the ragdoll-driver thing.

'''GRAF1K:''' Now that 2K4 has been released, it's time to resurrect this page and get crackin' people! ;)

Apparently we've got our player being visible from outside the vehicle problem solved.

Shootable cars ought to be fine. They'll just respawn after being destroyed (and ONLY after). People will end up camping the vehicle respawn area like in BR. Hope no one gets annoyed by that.

The Raptor ought to be left out, as it'd be too easy to capture.

'''Darkwarrior:''' About the indestructable cars, what if you had it taking damage, but when its health gets to zero, it isnt destroyed. Instead it just kills the driver and resets its health. I think it would be possible...

'''Escher0:''' This sounds like a pretty good idea, partly because it's a simple one and could be picked up easily.  Might I suggest having different point values for different vehicles?  Like a Manta, because it's so fast, may only be worth 1 point but a Goliath might be worth 3.  Also, the Leviathon should probably also be left out if the only way to get someone else out is to flip the vehicle.  Of course, that could be avoided by making all new vehicles.  Is anyone working on this yet?

'''Tony:''' I know I'd definitely help out where I could... unfortunately, I'm only a mapper - I don't know much about UScript or any of the karma stuff. With the extra people on vehicles, could you un-equip the Scorpion and give the gun space properties akin to the Hellbender's secondary and tertiary guns? I mea, the weapon seems to be a player-controlled module on the vehicle. Is it possible to change that to a non-player-controlled slot for a player, if you see what I mean?

'''T1:''' All of this could be done. The part about attaching players to the seat would probobly be hard on CPU. You could make respawning cars an option you could turn on/off when you start up the match. To prevent car spawn camping, you could make it so that if you aren't in a garage for say, 1 minute, then you start taking damage (notice how I said &quot;a&quot; not your, it can be an enemy garage). For larger maps you could make controllable secondary garages that you could choose to respawn at and would keep you safe from the timer damage. You could also make the time limit for damage set by the map. Another thing would be useful [[Legacy:Mod_Ideas/Kinetic_Rifle|Mod_Ideas/Kinetic_Rifle]] so you could knock cars out of the enemy garage, and also to prevent enemies from entering your garage and forcing them to time-limit gib. Actually time-limit gibbing would be pretty cool in other game-types also.

'''Relix:''' I like the idea very much :). What would be nice is to have big maps (onslaught-style), with a couple of vehicles spawned randomly, so that the teams should go look for them. Perhaps both get a raptor to be able to spot the vehicles faster.

'''Mr.bob:''' Awsome idea! although one of the things you need to edit into the main text is how easy it is to kill someone inside a car. You should send thing to the UT staff, maybe they can incorporate it into the next realese of UT2004. They need to have some mods officalized and attached to the next retail releace, like chaos for example.

'''Doodle77:''' im also back, one idea about the extra people being in the veicle but they can get knocked out, you can just make it so that the vehicle has a cradle on top for people to stand on while the vehicle is moving. regular UT2004 physics would apply to these so if the veichle got hit while moving the people would get thrown off kind of like one manta stratagey(the people get on the sides of the manta and can attack from there). this would make it more like escorting the veicle back to your base in a convoy. rather than it just being one person doing all the work it would be teamwork, like in onslaught.

'''SyPTo:''' What if you make the vehicles auto-lock after 30 seconds, they will remain in your team but neither team will be able to use them , this will cause the teams to have to switch vehicles after ejecting it for more then 30 sec , also when a vehicle is left after 60 seconds it should either lock or auto destruct like a redeemer type damage if it's not in your teams garage.maybe even an mutator that if a vehicle is left the team leaving the vehicle can initiate an auto destruct sequence ?...this would make for some interesting strategies.

'''Sweavo:''' ONS vehicles have an attribute that allows the driver to take splash damage.  I think it's easy to stop vehicles taking damage themselves, yet passing it on to the driver.  I agree that it shouldn't be possible to just blow up vehicles and then go to the respawn-point.  How about there is a notion of vehicle health, but that it never results in destruction, just a proportional reduction of the vehicle's armour and power?  Thus you could shoot the heck out of a vehicle, making it harder to escape in, and you could use the link gun alt fire to heal it again to get more speed &amp; armour.

'''Sweavo:''' also, I've got a rough working Tractor Beam weapon at home, potential fun could be had with that... towing a wrecked scorp with a hellbender, anyone?  If someone can do meshes, we could rustle up an armoured tow-truck :-)

'''Kamek:''' Did this ever get anywhere? I stumbled upon this page recently and am curious as to fun it would actually be to try it in 2k4. I'd even be willing to code it myself and maybe convert a few onslaught and/or vctf maps for it.</text>
    </revision>
    <revision>
      <id>4849</id>
      <timestamp>2007-11-10T04:12:20Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <comment>Did this mod ever get anywhere?</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; CarJack}}

==Description ==

This concept is somewhat similar to [[Legacy:Mod Ideas/UnrealBallPool|Mod Ideas/UnrealBallPool]] &amp;ndash; but I came up with it separately, I swear :P

Each team's base is a &quot;garage&quot;, a large area where vehicles can be parked (not necessarily enclosed). At the start of the game, a number of cars are spawned around the map. The goal of the game is to steal all the cars, and park them in your team's garage. Cars can be stolen from the garage as easily as anywhere else on the map, so your team must guard your garage as well as hunt down the vehicles.

If a team has every car parked in their garage for 10 seconds, or they hold the majority at timeout, they win the game. In the event of a tie at timeout, the game goes into &quot;sudden death&quot; mode, where any change in car balance between the teams (gained or lost) immediately determines the winner.

The cars should be designed to allow for a passenger, who can stand in the back and use weapons. This promotes the use of the cars to get to other cars (drive a second player out to the car, and drive both back to base), rather than just hoarding them. Ideally, the physics should be written such that if the car is jolted sufficiently, the occupants can be thrown out (ie, high-speed collisions send the occupants into ragdoll mode temporarily)... ramming is a valid technique for stealing currently-occupied vehicles. :)

The cars should be indestructible, such that there is always a constant number of vehicles in play. They should also be self-righting, so cars don't get abandoned upside-down and undriveable. In the event that a car does get stuck somehow, they should be just light enough that judicious application of the shield gun can nudge it back into play. (This also means that a potential way to quickly clear an opponent's garage is to hit it with a Redeemer, and send the cars flying :D)

Depending on map design, cars could either spawn at known points, or randomly throughout the map (if no points are assigned). The number of cars spawned is also a map design issue (with a game setting override), although should never be less than two. A mapper could, for example, design a map with four cars &amp;ndash; two already parked in each team's garage &amp;ndash; forcing an incursion into enemy territory...

[[Image:Legacy_kagato_carjack_sketch.jpeg|center|An example car concept]]

'''Kagato:''' I won't have the skills to work on this mod myself for some time, so I'll throw this one open.

==Required Work==

===CarJack Gametype===
* Subclasses xDeathmatch
* Enables vehicles
* Keeps kills from scoring

===GarageVolume===
* Scores specified team on &lt;tt&gt;Touch();&lt;/tt&gt; 

==Comments ==

'''GRAF1K:''' I don't know about the rest of you, but this sounds INCREDIBLY fun, and even if it was based on UnrealBallPool (which it wasn't) it would be a way better gametype in it's own right. Awesome idea Kagato. :tup: Doesn't sound too hard to script; I think I could do it myself in not too much time.

'''Kagato:''' Thanks! Glad you like it :)

(I've realised this probably isn't ''really'' a CTF variant (despite similarities in gameplay) because the maps will have to be different. I'll move this to a different section if more appropriate.)

'''GRAF1K:''' No one really cares where you put it; it is somewhat like CTF. But if you'd like it somewhere else that's fine. :-)

'''MeanFish:''' This is an amazing idea... when does it get released? :-P  Seriously... this one's got a lot of potential.  A couple important questions though:

#  So if someone is in a car they are indestructible too?
#  How many people can fit into a car?
#  What kind of theme would you go with for the cars/maps?  

'''Foxpaw:''' Well, it's quite possible that you could still have people inside a car able to be killed. In my mod it's already quite possible to hit the driver by shooting through windows, or potentially doors and such if your weapon is powerful enough. It appears that the vehicles in UT2004 are going to have the ability to hit the driver separately from the vehicle as well, though that's just speculation based on screenshots.

'''Kagato:''' I envision a 2-seater open-topped car, like a dune buggy with a rollcage. The occupants are exposed and can be shot at. (I guess a bit like Halo's Warthog, but smaller.) Is it possible to set the bone positions of a character? Ideally, you could put the driving player in a sitting pose, and &quot;attach&quot; him to the car &amp;ndash; maybe even have his arms move as the car steers. I have yet to develop my modelling skills, but I can post a sketch if you like. '''(sketch added)'''

'''Foxpaw:''' It is possible to set the bones of a character to make scripted animations, but it's not the best route. Many custom models will not animate properly due to a different bone structure. UT2004 has &quot;exposed&quot; drivers (at least, you can see them in the screenshots, don't know if they can be shot or not) so there is almost certainately going to be a standardized driving animation that people making models will include.

'''MeanFish:''' It seems to me that by making some alterations to the collsion volume for the vehicle mesh you could indeed shoot at the driver i.e. not have it include areas where you intend for the assailants to shoot through.

'''HSDanClark:''' I actually got to play UT2004 at the [[Legacy:Unreal_University|Unreal_University]] last weekend, so maybe I can settle a thing or two. When you're in a vehicle, whether it's an open vehicle or a closed vehicle, both the player and the vehicle take damage when shot at. In the lower left corner, both your health and the &quot;health&quot; of the vehicle are displayed. This being the case, the only way to hit the driver without hitting the vehicle is to use an accurate instant-hit weapon, like the lightning gun or the sniper rifle. Any other weapons will either cause splash damage to the vehicle or have (like the minigun) a spread that will spill over onto the vehicle. Don't worry about the need to kill a driver without damaging a vehicle &amp;ndash; vehicles can he repaired in the field by the alt-fire of the linkgun. If you want someone's vehicle and you damage it, you can just go up and &quot;heal&quot; it before 'jacking it. Also, and this might be a good launching point for modders, Onslaught is the only gametype that supports vehicles at ship time. Any CTF, DM, or other gametype maps that contain vehicles will have to be produced by the community &amp;ndash; and mods have to be scripted to allow things like flag carriers to get in a vehicle.

'''GRAF1K:''' This would have to be a custom gametype with custom maps anyhow. As for shooting players while driving:

=====Quote:=====

----
:Originally Posted by '''Kagato'''
:''The cars should be indestructible, such that there is always a constant number of vehicles in play.''

----

'''HSDanClark:''' That's fine... the cars ''can'' be indestructible. I haven't seen the vehicle UScript that comes with [[Legacy:UT2004|UT2004]], but I'm sure there will be a property to set for taking/not taking damage. Failing that, they can always be re-scripted &amp;ndash; it's about a two line fix to make them not take damage.

'''Foxpaw:''' I'm not sure that indestructable cars are the way to go. I would instead suggest something like respawning cars. Or maybe even have new cars drive on to the map with a non-combative AI driver who you'd have to cap before taking the vehicle. Then you could have them come in through a tunnel or something. I think that would be better than just having cars respawn from thin air.

Indestructable cars I don't really like the idea of because although being indestructable to shooting is reasonable enough, what if it gets driven off a cliff? There would be no way to get the vehicle back up onto the map. (Unless perhaps you had something like in Mario Kart where something picks up the car and puts it back onto the map somewhere.

'''GRAF1K:''' Hmmm. Suppose it doesn't accept weapon damage instead of ''all'' damage?

'''Foxpaw:''' Well, depending on how you destroy it when it goes off a cliff or whatever, when something surpasses the KillZ of the zone, I don't think it get's damaged, it just gets destroyed. I think. It destroys things like weapons and the camera, at least on my mod, so I think that it may just call destroy instead of takedamage.

However, having said that, it's still entirely possible that a vehicle could get stuck or trapped somehow, or alternatively the Karma system can suffer an internal error and that will result in either destruction of the karma object, or immediately ceasing simulation of it, depending on the setting of bDestroyOnSimError in the KParams.

So, I think that there should be some means of replacing vehicles that are destroyed, either by getting trapped, suffering a Simerror, or something else.

'''Kagato:''' Definitely need some way of handling car loss conditions (simply respawning the car where it started should do), but players shouldn't be able to deliberately destroy cars, in my opinion. If you can blow them up to spawn a fresh car, it takes away from the &quot;car theft&quot; gameplay a bit. I also think being able to snipe the driver is important to gameplay, so I hope that can be done.

A friend had an amusing suggestion for anchoring the driver; drop him into ragdoll mode and attach his hands to the wheel and feet to the pedals, and let physics sort out the rest. :P You'd end up with a pretty drunk looking driver, I think...

'''GRAF1K:'''
:&lt;font size = &quot;1&quot;&gt;Quote:&lt;/font&gt;

----
:Originally Posted by '''Kagato'''
:''You'd end up with a pretty drunk looking driver, I think...''

----

Not if you attach a few other things. That's actually a good idea. Imagine watching the player get thrown like he's getting whiplash as he does a doughnut manuever... :D

'''Foxpaw:''' You'd probrably also want to have a seatbelt if you were going to do that. However, having said that, the performance implications of having numerous players ragdolled and in constant contact with a karma vehicle will put a lot of stress on the physics engine.. I think you might have a problem with framerate if you have the ragdoll-driver thing.

'''GRAF1K:''' Now that 2K4 has been released, it's time to resurrect this page and get crackin' people! ;)

Apparently we've got our player being visible from outside the vehicle problem solved.

Shootable cars ought to be fine. They'll just respawn after being destroyed (and ONLY after). People will end up camping the vehicle respawn area like in BR. Hope no one gets annoyed by that.

The Raptor ought to be left out, as it'd be too easy to capture.

'''Darkwarrior:''' About the indestructable cars, what if you had it taking damage, but when its health gets to zero, it isnt destroyed. Instead it just kills the driver and resets its health. I think it would be possible...

'''Escher0:''' This sounds like a pretty good idea, partly because it's a simple one and could be picked up easily.  Might I suggest having different point values for different vehicles?  Like a Manta, because it's so fast, may only be worth 1 point but a Goliath might be worth 3.  Also, the Leviathon should probably also be left out if the only way to get someone else out is to flip the vehicle.  Of course, that could be avoided by making all new vehicles.  Is anyone working on this yet?

'''Tony:''' I know I'd definitely help out where I could... unfortunately, I'm only a mapper - I don't know much about UScript or any of the karma stuff. With the extra people on vehicles, could you un-equip the Scorpion and give the gun space properties akin to the Hellbender's secondary and tertiary guns? I mea, the weapon seems to be a player-controlled module on the vehicle. Is it possible to change that to a non-player-controlled slot for a player, if you see what I mean?

'''T1:''' All of this could be done. The part about attaching players to the seat would probobly be hard on CPU. You could make respawning cars an option you could turn on/off when you start up the match. To prevent car spawn camping, you could make it so that if you aren't in a garage for say, 1 minute, then you start taking damage (notice how I said &quot;a&quot; not your, it can be an enemy garage). For larger maps you could make controllable secondary garages that you could choose to respawn at and would keep you safe from the timer damage. You could also make the time limit for damage set by the map. Another thing would be useful [[Legacy:Mod_Ideas/Kinetic_Rifle|Mod_Ideas/Kinetic_Rifle]] so you could knock cars out of the enemy garage, and also to prevent enemies from entering your garage and forcing them to time-limit gib. Actually time-limit gibbing would be pretty cool in other game-types also.

'''Relix:''' I like the idea very much :). What would be nice is to have big maps (onslaught-style), with a couple of vehicles spawned randomly, so that the teams should go look for them. Perhaps both get a raptor to be able to spot the vehicles faster.

'''Mr.bob:''' Awsome idea! although one of the things you need to edit into the main text is how easy it is to kill someone inside a car. You should send thing to the UT staff, maybe they can incorporate it into the next realese of UT2004. They need to have some mods officalized and attached to the next retail releace, like chaos for example.

'''Doodle77:''' im also back, one idea about the extra people being in the veicle but they can get knocked out, you can just make it so that the vehicle has a cradle on top for people to stand on while the vehicle is moving. regular UT2004 physics would apply to these so if the veichle got hit while moving the people would get thrown off kind of like one manta stratagey(the people get on the sides of the manta and can attack from there). this would make it more like escorting the veicle back to your base in a convoy. rather than it just being one person doing all the work it would be teamwork, like in onslaught.

'''SyPTo:''' What if you make the vehicles auto-lock after 30 seconds, they will remain in your team but neither team will be able to use them , this will cause the teams to have to switch vehicles after ejecting it for more then 30 sec , also when a vehicle is left after 60 seconds it should either lock or auto destruct like a redeemer type damage if it's not in your teams garage.maybe even an mutator that if a vehicle is left the team leaving the vehicle can initiate an auto destruct sequence ?...this would make for some interesting strategies.

'''Sweavo:''' ONS vehicles have an attribute that allows the driver to take splash damage.  I think it's easy to stop vehicles taking damage themselves, yet passing it on to the driver.  I agree that it shouldn't be possible to just blow up vehicles and then go to the respawn-point.  How about there is a notion of vehicle health, but that it never results in destruction, just a proportional reduction of the vehicle's armour and power?  Thus you could shoot the heck out of a vehicle, making it harder to escape in, and you could use the link gun alt fire to heal it again to get more speed &amp; armour.

'''Sweavo:''' also, I've got a rough working Tractor Beam weapon at home, potential fun could be had with that... towing a wrecked scorp with a hellbender, anyone?  If someone can do meshes, we could rustle up an armoured tow-truck :-)

'''Kamek:''' Did this ever get anywhere? I stumbled upon this page recently and am curious as to fun it would actually be to try it in 2k4. I'd even be willing to code it myself and maybe convert a few onslaught and/or vctf maps for it.</text>
    </revision>
    <revision>
      <id>4850</id>
      <timestamp>2007-11-15T18:33:02Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>call to arms!</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; CarJack}}

==Description ==

This concept is somewhat similar to [[Legacy:Mod Ideas/UnrealBallPool|Mod Ideas/UnrealBallPool]] &amp;ndash; but I came up with it separately, I swear :P

Each team's base is a &quot;garage&quot;, a large area where vehicles can be parked (not necessarily enclosed). At the start of the game, a number of cars are spawned around the map. The goal of the game is to steal all the cars, and park them in your team's garage. Cars can be stolen from the garage as easily as anywhere else on the map, so your team must guard your garage as well as hunt down the vehicles.

If a team has every car parked in their garage for 10 seconds, or they hold the majority at timeout, they win the game. In the event of a tie at timeout, the game goes into &quot;sudden death&quot; mode, where any change in car balance between the teams (gained or lost) immediately determines the winner.

The cars should be designed to allow for a passenger, who can stand in the back and use weapons. This promotes the use of the cars to get to other cars (drive a second player out to the car, and drive both back to base), rather than just hoarding them. Ideally, the physics should be written such that if the car is jolted sufficiently, the occupants can be thrown out (ie, high-speed collisions send the occupants into ragdoll mode temporarily)... ramming is a valid technique for stealing currently-occupied vehicles. :)

The cars should be indestructible, such that there is always a constant number of vehicles in play. They should also be self-righting, so cars don't get abandoned upside-down and undriveable. In the event that a car does get stuck somehow, they should be just light enough that judicious application of the shield gun can nudge it back into play. (This also means that a potential way to quickly clear an opponent's garage is to hit it with a Redeemer, and send the cars flying :D)

Depending on map design, cars could either spawn at known points, or randomly throughout the map (if no points are assigned). The number of cars spawned is also a map design issue (with a game setting override), although should never be less than two. A mapper could, for example, design a map with four cars &amp;ndash; two already parked in each team's garage &amp;ndash; forcing an incursion into enemy territory...

[[Image:Legacy_kagato_carjack_sketch.jpeg|center|An example car concept]]

'''Kagato:''' I won't have the skills to work on this mod myself for some time, so I'll throw this one open.

==Required Work==

===CarJack Gametype===
* Subclasses xDeathmatch
* Enables vehicles
* Keeps kills from scoring

===GarageVolume===
* Scores specified team on &lt;tt&gt;Touch();&lt;/tt&gt; 

==Comments ==

'''GRAF1K:''' I don't know about the rest of you, but this sounds INCREDIBLY fun, and even if it was based on UnrealBallPool (which it wasn't) it would be a way better gametype in it's own right. Awesome idea Kagato. :tup: Doesn't sound too hard to script; I think I could do it myself in not too much time.

'''Kagato:''' Thanks! Glad you like it :)

(I've realised this probably isn't ''really'' a CTF variant (despite similarities in gameplay) because the maps will have to be different. I'll move this to a different section if more appropriate.)

'''GRAF1K:''' No one really cares where you put it; it is somewhat like CTF. But if you'd like it somewhere else that's fine. :-)

'''MeanFish:''' This is an amazing idea... when does it get released? :-P  Seriously... this one's got a lot of potential.  A couple important questions though:

#  So if someone is in a car they are indestructible too?
#  How many people can fit into a car?
#  What kind of theme would you go with for the cars/maps?  

'''Foxpaw:''' Well, it's quite possible that you could still have people inside a car able to be killed. In my mod it's already quite possible to hit the driver by shooting through windows, or potentially doors and such if your weapon is powerful enough. It appears that the vehicles in UT2004 are going to have the ability to hit the driver separately from the vehicle as well, though that's just speculation based on screenshots.

'''Kagato:''' I envision a 2-seater open-topped car, like a dune buggy with a rollcage. The occupants are exposed and can be shot at. (I guess a bit like Halo's Warthog, but smaller.) Is it possible to set the bone positions of a character? Ideally, you could put the driving player in a sitting pose, and &quot;attach&quot; him to the car &amp;ndash; maybe even have his arms move as the car steers. I have yet to develop my modelling skills, but I can post a sketch if you like. '''(sketch added)'''

'''Foxpaw:''' It is possible to set the bones of a character to make scripted animations, but it's not the best route. Many custom models will not animate properly due to a different bone structure. UT2004 has &quot;exposed&quot; drivers (at least, you can see them in the screenshots, don't know if they can be shot or not) so there is almost certainately going to be a standardized driving animation that people making models will include.

'''MeanFish:''' It seems to me that by making some alterations to the collsion volume for the vehicle mesh you could indeed shoot at the driver i.e. not have it include areas where you intend for the assailants to shoot through.

'''HSDanClark:''' I actually got to play UT2004 at the [[Legacy:Unreal_University|Unreal_University]] last weekend, so maybe I can settle a thing or two. When you're in a vehicle, whether it's an open vehicle or a closed vehicle, both the player and the vehicle take damage when shot at. In the lower left corner, both your health and the &quot;health&quot; of the vehicle are displayed. This being the case, the only way to hit the driver without hitting the vehicle is to use an accurate instant-hit weapon, like the lightning gun or the sniper rifle. Any other weapons will either cause splash damage to the vehicle or have (like the minigun) a spread that will spill over onto the vehicle. Don't worry about the need to kill a driver without damaging a vehicle &amp;ndash; vehicles can he repaired in the field by the alt-fire of the linkgun. If you want someone's vehicle and you damage it, you can just go up and &quot;heal&quot; it before 'jacking it. Also, and this might be a good launching point for modders, Onslaught is the only gametype that supports vehicles at ship time. Any CTF, DM, or other gametype maps that contain vehicles will have to be produced by the community &amp;ndash; and mods have to be scripted to allow things like flag carriers to get in a vehicle.

'''GRAF1K:''' This would have to be a custom gametype with custom maps anyhow. As for shooting players while driving:

=====Quote:=====

----
:Originally Posted by '''Kagato'''
:''The cars should be indestructible, such that there is always a constant number of vehicles in play.''

----

'''HSDanClark:''' That's fine... the cars ''can'' be indestructible. I haven't seen the vehicle UScript that comes with [[Legacy:UT2004|UT2004]], but I'm sure there will be a property to set for taking/not taking damage. Failing that, they can always be re-scripted &amp;ndash; it's about a two line fix to make them not take damage.

'''Foxpaw:''' I'm not sure that indestructable cars are the way to go. I would instead suggest something like respawning cars. Or maybe even have new cars drive on to the map with a non-combative AI driver who you'd have to cap before taking the vehicle. Then you could have them come in through a tunnel or something. I think that would be better than just having cars respawn from thin air.

Indestructable cars I don't really like the idea of because although being indestructable to shooting is reasonable enough, what if it gets driven off a cliff? There would be no way to get the vehicle back up onto the map. (Unless perhaps you had something like in Mario Kart where something picks up the car and puts it back onto the map somewhere.

'''GRAF1K:''' Hmmm. Suppose it doesn't accept weapon damage instead of ''all'' damage?

'''Foxpaw:''' Well, depending on how you destroy it when it goes off a cliff or whatever, when something surpasses the KillZ of the zone, I don't think it get's damaged, it just gets destroyed. I think. It destroys things like weapons and the camera, at least on my mod, so I think that it may just call destroy instead of takedamage.

However, having said that, it's still entirely possible that a vehicle could get stuck or trapped somehow, or alternatively the Karma system can suffer an internal error and that will result in either destruction of the karma object, or immediately ceasing simulation of it, depending on the setting of bDestroyOnSimError in the KParams.

So, I think that there should be some means of replacing vehicles that are destroyed, either by getting trapped, suffering a Simerror, or something else.

'''Kagato:''' Definitely need some way of handling car loss conditions (simply respawning the car where it started should do), but players shouldn't be able to deliberately destroy cars, in my opinion. If you can blow them up to spawn a fresh car, it takes away from the &quot;car theft&quot; gameplay a bit. I also think being able to snipe the driver is important to gameplay, so I hope that can be done.

A friend had an amusing suggestion for anchoring the driver; drop him into ragdoll mode and attach his hands to the wheel and feet to the pedals, and let physics sort out the rest. :P You'd end up with a pretty drunk looking driver, I think...

'''GRAF1K:'''
:&lt;font size = &quot;1&quot;&gt;Quote:&lt;/font&gt;

----
:Originally Posted by '''Kagato'''
:''You'd end up with a pretty drunk looking driver, I think...''

----

Not if you attach a few other things. That's actually a good idea. Imagine watching the player get thrown like he's getting whiplash as he does a doughnut manuever... :D

'''Foxpaw:''' You'd probrably also want to have a seatbelt if you were going to do that. However, having said that, the performance implications of having numerous players ragdolled and in constant contact with a karma vehicle will put a lot of stress on the physics engine.. I think you might have a problem with framerate if you have the ragdoll-driver thing.

'''GRAF1K:''' Now that 2K4 has been released, it's time to resurrect this page and get crackin' people! ;)

Apparently we've got our player being visible from outside the vehicle problem solved.

Shootable cars ought to be fine. They'll just respawn after being destroyed (and ONLY after). People will end up camping the vehicle respawn area like in BR. Hope no one gets annoyed by that.

The Raptor ought to be left out, as it'd be too easy to capture.

'''Darkwarrior:''' About the indestructable cars, what if you had it taking damage, but when its health gets to zero, it isnt destroyed. Instead it just kills the driver and resets its health. I think it would be possible...

'''Escher0:''' This sounds like a pretty good idea, partly because it's a simple one and could be picked up easily.  Might I suggest having different point values for different vehicles?  Like a Manta, because it's so fast, may only be worth 1 point but a Goliath might be worth 3.  Also, the Leviathon should probably also be left out if the only way to get someone else out is to flip the vehicle.  Of course, that could be avoided by making all new vehicles.  Is anyone working on this yet?

'''Tony:''' I know I'd definitely help out where I could... unfortunately, I'm only a mapper - I don't know much about UScript or any of the karma stuff. With the extra people on vehicles, could you un-equip the Scorpion and give the gun space properties akin to the Hellbender's secondary and tertiary guns? I mea, the weapon seems to be a player-controlled module on the vehicle. Is it possible to change that to a non-player-controlled slot for a player, if you see what I mean?

'''T1:''' All of this could be done. The part about attaching players to the seat would probobly be hard on CPU. You could make respawning cars an option you could turn on/off when you start up the match. To prevent car spawn camping, you could make it so that if you aren't in a garage for say, 1 minute, then you start taking damage (notice how I said &quot;a&quot; not your, it can be an enemy garage). For larger maps you could make controllable secondary garages that you could choose to respawn at and would keep you safe from the timer damage. You could also make the time limit for damage set by the map. Another thing would be useful [[Legacy:Mod_Ideas/Kinetic_Rifle|Mod_Ideas/Kinetic_Rifle]] so you could knock cars out of the enemy garage, and also to prevent enemies from entering your garage and forcing them to time-limit gib. Actually time-limit gibbing would be pretty cool in other game-types also.

'''Relix:''' I like the idea very much :). What would be nice is to have big maps (onslaught-style), with a couple of vehicles spawned randomly, so that the teams should go look for them. Perhaps both get a raptor to be able to spot the vehicles faster.

'''Mr.bob:''' Awsome idea! although one of the things you need to edit into the main text is how easy it is to kill someone inside a car. You should send thing to the UT staff, maybe they can incorporate it into the next realese of UT2004. They need to have some mods officalized and attached to the next retail releace, like chaos for example.

'''Doodle77:''' im also back, one idea about the extra people being in the veicle but they can get knocked out, you can just make it so that the vehicle has a cradle on top for people to stand on while the vehicle is moving. regular UT2004 physics would apply to these so if the veichle got hit while moving the people would get thrown off kind of like one manta stratagey(the people get on the sides of the manta and can attack from there). this would make it more like escorting the veicle back to your base in a convoy. rather than it just being one person doing all the work it would be teamwork, like in onslaught.

'''SyPTo:''' What if you make the vehicles auto-lock after 30 seconds, they will remain in your team but neither team will be able to use them , this will cause the teams to have to switch vehicles after ejecting it for more then 30 sec , also when a vehicle is left after 60 seconds it should either lock or auto destruct like a redeemer type damage if it's not in your teams garage.maybe even an mutator that if a vehicle is left the team leaving the vehicle can initiate an auto destruct sequence ?...this would make for some interesting strategies.

'''Sweavo:''' ONS vehicles have an attribute that allows the driver to take splash damage.  I think it's easy to stop vehicles taking damage themselves, yet passing it on to the driver.  I agree that it shouldn't be possible to just blow up vehicles and then go to the respawn-point.  How about there is a notion of vehicle health, but that it never results in destruction, just a proportional reduction of the vehicle's armour and power?  Thus you could shoot the heck out of a vehicle, making it harder to escape in, and you could use the link gun alt fire to heal it again to get more speed &amp; armour.

'''Sweavo:''' also, I've got a rough working Tractor Beam weapon at home, potential fun could be had with that... towing a wrecked scorp with a hellbender, anyone?  If someone can do meshes, we could rustle up an armoured tow-truck :-)

'''Kamek:''' Did this ever get anywhere? I stumbled upon this page recently and am curious as to fun it would actually be to try it in 2k4. I'd even be willing to code it myself and maybe convert a few onslaught and/or vctf maps for it.

'''Sweavo:''' I'm thinking this is pretty dormant right now.  However, I have a lot of free time in December, so would love to make a first cut at this.  I'm OK with hacking vehicles but not played much with gametypes.  How's this for a plan?:

* Make a test map that looks like a carjack map.  Make it VCTF, nice and simple, with two garages, some terrain, and a lavapool or something (because we want to make sure we can't get vehs stuck forever)
* A GarageVolume actor needs to be created that can be placed in the maps and used to detect when a team has captured a veh
* CJ gametype to implement the rules
* CJ vehicles to start implementing indestructiblity and jackability

After that it should be a process of iteration and refinement.

Who's in?  My mapping skills are poor, coding rusty, but I feel like this could be done in a month.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CarryTheFlag</title>
    <id>1906</id>
    <revision>
      <id>4673</id>
      <timestamp>2003-09-16T22:18:51Z</timestamp>
      <contributor>
        <ip>Dsl081-204-056.nyc2.dsl.speakeasy.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Carry the Flag Mutator}}

==Description ==

Carry the Flag 2003 is an update to my original UT mod Carry the Flag. I'm basically porting it to UT2k3 with minimal changes, so this extract from the ReadMe should suffice to explain just what Carry the Flag is (Once it's working, I might add a few extra things I have in mind - any suggestions are welcome too):

====Original ReadMe.txt ====

Carry the Flag is CTF like it should have been. You can't return your flag by simply touching it, you have to carry it back to your base yourself. There are also a lot of extra options for changing the way CarryTF is played. You set these options from the rules menu, or alternatively from UnrealTournament/System/CarryTF2k3.ini. You should read these before you play, so you know what's happening.

====Dropcap ====

Turn this on and you can score by taking the enemy flag to your own flag, no matter where it is. For example, you could grab you own flag, drop it outside the enemy base, run in and get their flag, then run back out and capture the enemy flag by touching your own flag that is just lying there on the ground.

====Capture Without Flag ====

With this enabled, you can capture the enemy flag at your flagbase even if your flag is not there. (ie: like Team Fortress).

====Take Friendly Flag ====

If this is enabled, then you can take your own flag from it's base by pushing the Pickup/Drop Flag key (configured at the keyboard setup page), so you can run around with your own flag just for the hell of it. Or to try and dropcap.

====Bots Dropcap ====

With this enabled bots will attempt to dropcap, so don't be surprised if you see them taking their own flag and storming your base.

====Team Fortress mode ====

Check this to have CarryTF play like Team Fortress. You can't carry your own flag, there is no way to get it to return to base except for waiting for it to respawn. So you have to guard it from the enemy while you wait for it to get sent back to base.

====Dropped Flag Timeout ====

This is the number of seconds the flag can lie on the ground before it is automatically sent back to the base. Set it to zero to have the flag never get sent back... this might cause some problems if the flag gets dropped in an unreachable position.

====TF Timer Reset ====

If this is enabled, the timer (the dropped flag timeout) will reset when the flag is picked up by an enemy in Team Fortress mode.

====Send to PathNode ====

With this option checked, the flag will not return to base if it is dropped in lava or slime. Instead it will be moved to the nearest PathNode. Use this option to prevent people suiciding on maps like CTF-LavaGiant to instantly return their flag.

You have to set up the Drop Flag key if you want to use the Take Friendly Flag option (for UT2k3 I think this is actually in the new patch?). To do this just go to the keyboard setup window and scroll all the way to the bottom. The FlagToggle key will make you:
* drop a flag if you are holding one
* take the friendly flag if you are standing next to it
* return the friendly flag to base if you are standing near the base and you took the flag from the base (ie: you didn't get it from the enemy)

Some recommended options configurations:

''Carry the Flag''

Leave all options off, and set Dropped TimeOut to 0. This is just regular CTF without magic teleporting flags.

''Dropcap the Flag'' (Bad name, but what am I supposed to call it?)

Turn on Dropcap, Take friendly flag, Bot Dropcap and leave Dropped TimeOut at 0. This will create a faster paced and less base orientated CTF.

''Team Fortress CTF''

Team Fortress on (duh...), Cap without flag on, Dropped Timeout at 60. Pretend you are playing TFC.

==Discussion ==

'''EntropicLqd:'''  It seems better to make this functionality a mutator rather than part of a game type mod.  There's nothing stopping other CTF mods from subclassing from the flag here.  The downside is that the mutator would need to be shipped with the mod.  The upside is that they will get the &quot;carry the flag&quot; functionality for free.

'''Versix:''' When I started this mod for UT, I originally planned it as a mutator, but that didn't really work out. I think bot AI was the major problem that required a new gametype to deal with, and there was probably other issues too. I make no claims about the viability of this for UT2k3 though...

'''Versix:''' I just started this yesterday, and as of right now I have custom flags spawning into CTF games with a mutator. How much I can get done only overriding the CTFFlag class remains to be seen...

'''[21/12] Versix:''' All gameplay modifications are now complete, all that's left is bot AI and HUD extras. This is indeed possible to do with only a mutator, so hopefully Carry the Flag 2003 will work with CTF mode in other mods/TCs... hopefully.

'''[13/02] Versix:''' Wow, over a month with no work at all. Don't worry (...not that anyone is), I'm resuming this mod now... bot AI, HUD extras, and a few config things are all that's left to do. If the AI is anything like the original version it will take a while though...

'''Mosquiro:''' Flaghunter: When you have a flag, its usible as a weapon, like a spear!

'''[14/02] Versix:''' I don't think that would add much to the gameplay, or even be very appropriate for this mod... something else, perhaps. And please put all suggestions in this discussion section.

'''CheshireCat:''' I think the flag spear idea belongs, if anywhere, in a mutator.  As an extra weapon that the carrier has, I don't think it would do anything for gameplay, but it might work as the flag carrier's ''only'' weapon, which would make him very dependant on teammates for protection.  Think maps with a ''long'' run between the bases, and imagine teammates having to defend the flag carrier heavily, perhaps even crowding around him to act as human shields, because his flag-spear is a melee weapon (you can jab with it, but not throw - throwing the flag at an enemy would be, um, stupid).  I can see possibilities here...

'''[Apoc]Death:''' Just praying you finish this one... loved it in classic UT and really need it in 2k3...  Definitely the way CTF should be played...

'''Howitzer:''' Just wanted to echo [Apoc]Death's comments.. the Carry the Flag mod for UT was, bar none, my absolute favorite mod.  Such a simple concept, yet so completely changes all your strategy.  Playing CTF in UT2K3 seemes like a step backwards without it.

'''Jb:''' Versix how is the progress going? We have one of our members that really wanted to talk to you about this and we have thought about doing a version ourselves. So figured makes sense to tlak to you first. Thanks!

'''[Apoc]Famine:''' Ditto to the above. I was hoping that you'd port the mod to UT2003, because I was dreading doing the coding myself. We had CarryTF in the rotation about 4 nights a week in UT, and are looking forward to it in UT2003. Any updates? A beta release maybe? Because as Howitzer so elegently put it, playing CTF in UT2K3 seems like a step backwards without it. We've yet to even bother with CTF in UT2k3, because it's just not a fun game compared to CarryTF. Thanks for the UT mod, and if you need any help on the 2k3 version, let us know!

'''Mysterial:''' Is there any word on Versix completing this? As someone requested it and I got most of the way done before he decided to tell me it was already being worked on. I'll trash my version if necessary.

'''[05/05] Versix:''' I'm really sorry about disappearing on everyone, I've been really busy with uni lately. However now that I know people are waiting for CarryTF, I'll try to make some time to clean it up and get the AI done. Right now it's human playable, is there any interest in a human-only beta release?

'''Mysterial:''' Sorry, I went ahead and released. It has most (although not quite all) of the original UT features, and bot support. Feel free to release your own if you want, but please don't ask me to get rid of mine at this point, people kept asking and asking until I finally made it and released it.

'''[06/29] San9000:''' Where can I find Versix's version.  Mysterial's mute is nice, but still needs tweaking and hasn't been updated since 05/13/03.

'''Mysterial:''' Mysterial didn't know anyone wanted anything tweaked, since nobody bothered to email him. :P

'''[02/07] Versix:''' OK, I'll fix mine up and release it. It will be a complete port of the old version. I still have a few things to add to it (I kinda abandoned work on it when I found out Mysterial had already released a version) but it shouldn't take that long... a week maybe?

'''Mysterial:''' And this, boys and girls, is why you should never, ever port someone else's mod, no matter how much people beg you to do so.

'''Foxpaw:''' Wouldn't that be a violation of the original author's copyright anyway? (Unless they gave you permission or stated in the original release that such a thing was acceptable)

'''Dark Pulse:''' I doubt it. It'd violate it if you ripped off all the code and touted it as your own. Since porting to 2003 DOES take some work, the only way it'd violate any kind of copyright (If such a thing exists) is if it was stated not to be ported (It's different from modifying), or if the author requests you cease and desist and you fail to.

'''[03/07] Versix:''' Er, I just wanted to clarify that I have no problem with Mysterial's port. I mean, I did disappear for a while back there... I would have done the same in his position ;) Are you going to be working on your version at all in the future Mysterial? If you are, we should team up, or something. There's no point doing everything twice.

'''Dark Pulse:''' I figured that from the tone of your posts. Working together would be... interesting, to say the very least. Especially if one of you has a great idea, that the other can expand upon.

'''[03/07] Versix:''' Actually, thinking about it, I don't know how exactly two of us would work together on something small like Carry the Flag. Although I've never worked with someone on anything before, so what do I know..? 

'''Mysterial:''' Well if you wanted to I wouldn't have any real problem with it. Certainly better than simply abandoning my efforts. But the first question would be who's to base on. Mine has full bot support (don't know if yours does) but yours has all the features of the original while mine is missing a couple.

'''NickR:''' I'd be buggered if someone released a 4CTF gametype before I had released mine. Looking at you Mysterial! &gt;:(

'''[08/07] Versix:''' Mysterial, mine's got bot support as well, but there's more AI I want to add (like dropcapping). I've also added some things to the HUD like the original version (so you can tell which team is in possession of which flag)... so it seems we've already done all the same work twice. I don't think we should bother with trying to combine them becuase they're already pretty much the same thing anyway.

'''[09/15] san9000:''' Any news?  Please email me any release candidates you may have.  Email: san9000 -at- ugodz.com  Hope the project will be completed.</text>
    </revision>
    <revision>
      <id>4674</id>
      <timestamp>2003-07-08T02:59:25Z</timestamp>
      <contributor>
        <ip>Versix</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Carry the Flag Mutator}}

==Description ==

Carry the Flag 2003 is an update to my original UT mod Carry the Flag. I'm basically porting it to UT2k3 with minimal changes, so this extract from the ReadMe should suffice to explain just what Carry the Flag is (Once it's working, I might add a few extra things I have in mind - any suggestions are welcome too):

====Original ReadMe.txt ====

Carry the Flag is CTF like it should have been. You can't return your flag by simply touching it, you have to carry it back to your base yourself. There are also a lot of extra options for changing the way CarryTF is played. You set these options from the rules menu, or alternatively from UnrealTournament/System/CarryTF2k3.ini. You should read these before you play, so you know what's happening.

====Dropcap ====

Turn this on and you can score by taking the enemy flag to your own flag, no matter where it is. For example, you could grab you own flag, drop it outside the enemy base, run in and get their flag, then run back out and capture the enemy flag by touching your own flag that is just lying there on the ground.

====Capture Without Flag ====

With this enabled, you can capture the enemy flag at your flagbase even if your flag is not there. (ie: like Team Fortress).

====Take Friendly Flag ====

If this is enabled, then you can take your own flag from it's base by pushing the Pickup/Drop Flag key (configured at the keyboard setup page), so you can run around with your own flag just for the hell of it. Or to try and dropcap.

====Bots Dropcap ====

With this enabled bots will attempt to dropcap, so don't be surprised if you see them taking their own flag and storming your base.

====Team Fortress mode ====

Check this to have CarryTF play like Team Fortress. You can't carry your own flag, there is no way to get it to return to base except for waiting for it to respawn. So you have to guard it from the enemy while you wait for it to get sent back to base.

====Dropped Flag Timeout ====

This is the number of seconds the flag can lie on the ground before it is automatically sent back to the base. Set it to zero to have the flag never get sent back... this might cause some problems if the flag gets dropped in an unreachable position.

====TF Timer Reset ====

If this is enabled, the timer (the dropped flag timeout) will reset when the flag is picked up by an enemy in Team Fortress mode.

====Send to PathNode ====

With this option checked, the flag will not return to base if it is dropped in lava or slime. Instead it will be moved to the nearest PathNode. Use this option to prevent people suiciding on maps like CTF-LavaGiant to instantly return their flag.

You have to set up the Drop Flag key if you want to use the Take Friendly Flag option (for UT2k3 I think this is actually in the new patch?). To do this just go to the keyboard setup window and scroll all the way to the bottom. The FlagToggle key will make you:
* drop a flag if you are holding one
* take the friendly flag if you are standing next to it
* return the friendly flag to base if you are standing near the base and you took the flag from the base (ie: you didn't get it from the enemy)

Some recommended options configurations:

''Carry the Flag''

Leave all options off, and set Dropped TimeOut to 0. This is just regular CTF without magic teleporting flags.

''Dropcap the Flag'' (Bad name, but what am I supposed to call it?)

Turn on Dropcap, Take friendly flag, Bot Dropcap and leave Dropped TimeOut at 0. This will create a faster paced and less base orientated CTF.

''Team Fortress CTF''

Team Fortress on (duh...), Cap without flag on, Dropped Timeout at 60. Pretend you are playing TFC.

==Discussion ==

'''EntropicLqd:'''  It seems better to make this functionality a mutator rather than part of a game type mod.  There's nothing stopping other CTF mods from subclassing from the flag here.  The downside is that the mutator would need to be shipped with the mod.  The upside is that they will get the &quot;carry the flag&quot; functionality for free.

'''Versix:''' When I started this mod for UT, I originally planned it as a mutator, but that didn't really work out. I think bot AI was the major problem that required a new gametype to deal with, and there was probably other issues too. I make no claims about the viability of this for UT2k3 though...

'''Versix:''' I just started this yesterday, and as of right now I have custom flags spawning into CTF games with a mutator. How much I can get done only overriding the CTFFlag class remains to be seen...

'''[21/12] Versix:''' All gameplay modifications are now complete, all that's left is bot AI and HUD extras. This is indeed possible to do with only a mutator, so hopefully Carry the Flag 2003 will work with CTF mode in other mods/TCs... hopefully.

'''[13/02] Versix:''' Wow, over a month with no work at all. Don't worry (...not that anyone is), I'm resuming this mod now... bot AI, HUD extras, and a few config things are all that's left to do. If the AI is anything like the original version it will take a while though...

'''Mosquiro:''' Flaghunter: When you have a flag, its usible as a weapon, like a spear!

'''[14/02] Versix:''' I don't think that would add much to the gameplay, or even be very appropriate for this mod... something else, perhaps. And please put all suggestions in this discussion section.

'''CheshireCat:''' I think the flag spear idea belongs, if anywhere, in a mutator.  As an extra weapon that the carrier has, I don't think it would do anything for gameplay, but it might work as the flag carrier's ''only'' weapon, which would make him very dependant on teammates for protection.  Think maps with a ''long'' run between the bases, and imagine teammates having to defend the flag carrier heavily, perhaps even crowding around him to act as human shields, because his flag-spear is a melee weapon (you can jab with it, but not throw - throwing the flag at an enemy would be, um, stupid).  I can see possibilities here...

'''[Apoc]Death:''' Just praying you finish this one... loved it in classic UT and really need it in 2k3...  Definitely the way CTF should be played...

'''Howitzer:''' Just wanted to echo [Apoc]Death's comments.. the Carry the Flag mod for UT was, bar none, my absolute favorite mod.  Such a simple concept, yet so completely changes all your strategy.  Playing CTF in UT2K3 seemes like a step backwards without it.

'''Jb:''' Versix how is the progress going? We have one of our members that really wanted to talk to you about this and we have thought about doing a version ourselves. So figured makes sense to tlak to you first. Thanks!

'''[Apoc]Famine:''' Ditto to the above. I was hoping that you'd port the mod to UT2003, because I was dreading doing the coding myself. We had CarryTF in the rotation about 4 nights a week in UT, and are looking forward to it in UT2003. Any updates? A beta release maybe? Because as Howitzer so elegently put it, playing CTF in UT2K3 seems like a step backwards without it. We've yet to even bother with CTF in UT2k3, because it's just not a fun game compared to CarryTF. Thanks for the UT mod, and if you need any help on the 2k3 version, let us know!

'''Mysterial:''' Is there any word on Versix completing this? As someone requested it and I got most of the way done before he decided to tell me it was already being worked on. I'll trash my version if necessary.

'''[05/05] Versix:''' I'm really sorry about disappearing on everyone, I've been really busy with uni lately. However now that I know people are waiting for CarryTF, I'll try to make some time to clean it up and get the AI done. Right now it's human playable, is there any interest in a human-only beta release?

'''Mysterial:''' Sorry, I went ahead and released. It has most (although not quite all) of the original UT features, and bot support. Feel free to release your own if you want, but please don't ask me to get rid of mine at this point, people kept asking and asking until I finally made it and released it.

'''[06/29] San9000:''' Where can I find Versix's version.  Mysterial's mute is nice, but still needs tweaking and hasn't been updated since 05/13/03.

'''Mysterial:''' Mysterial didn't know anyone wanted anything tweaked, since nobody bothered to email him. :P

'''[02/07] Versix:''' OK, I'll fix mine up and release it. It will be a complete port of the old version. I still have a few things to add to it (I kinda abandoned work on it when I found out Mysterial had already released a version) but it shouldn't take that long... a week maybe?

'''Mysterial:''' And this, boys and girls, is why you should never, ever port someone else's mod, no matter how much people beg you to do so.

'''Foxpaw:''' Wouldn't that be a violation of the original author's copyright anyway? (Unless they gave you permission or stated in the original release that such a thing was acceptable)

'''Dark Pulse:''' I doubt it. It'd violate it if you ripped off all the code and touted it as your own. Since porting to 2003 DOES take some work, the only way it'd violate any kind of copyright (If such a thing exists) is if it was stated not to be ported (It's different from modifying), or if the author requests you cease and desist and you fail to.

'''[03/07] Versix:''' Er, I just wanted to clarify that I have no problem with Mysterial's port. I mean, I did disappear for a while back there... I would have done the same in his position ;) Are you going to be working on your version at all in the future Mysterial? If you are, we should team up, or something. There's no point doing everything twice.

'''Dark Pulse:''' I figured that from the tone of your posts. Working together would be... interesting, to say the very least. Especially if one of you has a great idea, that the other can expand upon.

'''[03/07] Versix:''' Actually, thinking about it, I don't know how exactly two of us would work together on something small like Carry the Flag. Although I've never worked with someone on anything before, so what do I know..? 

'''Mysterial:''' Well if you wanted to I wouldn't have any real problem with it. Certainly better than simply abandoning my efforts. But the first question would be who's to base on. Mine has full bot support (don't know if yours does) but yours has all the features of the original while mine is missing a couple.

'''NickR:''' I'd be buggered if someone released a 4CTF gametype before I had released mine. Looking at you Mysterial! &gt;:(

'''[08/07] Versix:''' Mysterial, mine's got bot support as well, but there's more AI I want to add (like dropcapping). I've also added some things to the HUD like the original version (so you can tell which team is in possession of which flag)... so it seems we've already done all the same work twice. I don't think we should bother with trying to combine them becuase they're already pretty much the same thing anyway.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CatchTheSmurf</title>
    <id>1900</id>
    <revision>
      <id>4658</id>
      <timestamp>2008-03-07T20:16:38Z</timestamp>
      <contributor>
        <ip>12.20.23.6</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Catch the Smurf ===

by [[Legacy:LegalAssassin|LegalAssassin]]

K, here's the deal:

====Basic ====

Everybody's running around like crazy trying to catch or kill one Smurf. The Smurf is a bot that moves really fast, at least when strafing and turning. The one who gets the Smurf wins the game. This can also be Team based, with x teams trying to get one Smurf, kinda like Tally-Ho, but with one Smurf instead of lots of monsters.

====Twist ====

You can also add multiple Smurfs, say 20 with the same properties. This way you can miss &quot;your&quot; Smurf but maybe get some other. The winner is the one with the most Smurfs in his bag at the end. Of course this can also be team based. In team games the Smurfs also run faster than the player, making 'em l33t in any move (The team benefits from working togheter, herding the Smurf(s))

====Maps ====

Maps should be different Smurfy scenarios, such as mushroom villages and.... uhm can't remember, but Smurfy anyway ;) There should be smurf bg music and perhaps the same llama system as in Tally-Ho (great mod, come to thinking of it)

==Discussion==

'''EntropicLqd:'''  That's a funny idea.  If you made it a team game then the Smurf could run faster than the normal player.  The smurf runs away from the nearest players which means you have to team up to &quot;herd&quot; the Smurf to one of the players on your team.

'''ZxAnPhOrIaN:''' What will the smurfs look like?

'''LegalAssassin''' Err... pretty much like Smurfs :rolleyes:

@ EntropicLqd: I forgot that part, thanks for the reminder *added*

'''ZxAnPhOrIaN:''' I bet that the AI will be hard to script!

'''xX)(Xx:''' Which UT is this gonna be for?

'''Anonymous:''' I guess you could probably implement this for any UT

'''SuperApe:''' See also, Lord_Simeon's OSM Adventure map OSM-SmurfMassacre2007, found on the OSM Adventure map archive at [http://www.unrealplayground.com/forums/downloads.php?do=cat&amp;id=18 UnrealPlayground].</text>
    </revision>
    <revision>
      <id>4659</id>
      <timestamp>2004-10-29T14:52:14Z</timestamp>
      <contributor>
        <ip>XX)(Xx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Catch the Smurf ===

by [[Legacy:LegalAssassin|LegalAssassin]]

K, here's the deal:

====Basic ====

Everybody's running around like crazy trying to catch or kill one Smurf. The Smurf is a bot that moves really fast, at least when strafing and turning. The one who gets the Smurf wins the game. This can also be Team based, with x teams trying to get one Smurf, kinda like Tally-Ho, but with one Smurf instead of lots of monsters.

====Twist ====

You can also add multiple Smurfs, say 20 with the same properties. This way you can miss &quot;your&quot; Smurf but maybe get some other. The winner is the one with the most Smurfs in his bag at the end. Of course this can also be team based. In team games the Smurfs also run faster than the player, making 'em l33t in any move (The team benefits from working togheter, herding the Smurf(s))

====Maps ====

Maps should be different Smurfy scenarios, such as mushroom villages and.... uhm can't remember, but Smurfy anyway ;) There should be smurf bg music and perhaps the same llama system as in Tally-Ho (great mod, come to thinking of it)

====Comments ====

'''EntropicLqd:'''  That's a funny idea.  If you made it a team game then the Smurf could run faster than the normal player.  The smurf runs away from the nearest players which means you have to team up to &quot;herd&quot; the Smurf to one of the players on your team.

'''ZxAnPhOrIaN:''' What will the smurfs look like?

'''LegalAssassin''' Err... pretty much like Smurfs :rolleyes:

@ EntropicLqd: I forgot that part, thanks for the reminder *added*

'''ZxAnPhOrIaN:''' I bet that the AI will be hard to script!

'''xX)(Xx:''' Which UT is this gonna be for?</text>
    </revision>
    <revision>
      <id>4660</id>
      <timestamp>2004-12-08T08:49:39Z</timestamp>
      <contributor>
        <ip>Hide-sle.sharp.co.uk</ip>
      </contributor>
      <comment>* Added some discussion</comment>
      <text xml:space="preserve">===Catch the Smurf ===

by [[Legacy:LegalAssassin|LegalAssassin]]

K, here's the deal:

====Basic ====

Everybody's running around like crazy trying to catch or kill one Smurf. The Smurf is a bot that moves really fast, at least when strafing and turning. The one who gets the Smurf wins the game. This can also be Team based, with x teams trying to get one Smurf, kinda like Tally-Ho, but with one Smurf instead of lots of monsters.

====Twist ====

You can also add multiple Smurfs, say 20 with the same properties. This way you can miss &quot;your&quot; Smurf but maybe get some other. The winner is the one with the most Smurfs in his bag at the end. Of course this can also be team based. In team games the Smurfs also run faster than the player, making 'em l33t in any move (The team benefits from working togheter, herding the Smurf(s))

====Maps ====

Maps should be different Smurfy scenarios, such as mushroom villages and.... uhm can't remember, but Smurfy anyway ;) There should be smurf bg music and perhaps the same llama system as in Tally-Ho (great mod, come to thinking of it)

====Comments ====

'''EntropicLqd:'''  That's a funny idea.  If you made it a team game then the Smurf could run faster than the normal player.  The smurf runs away from the nearest players which means you have to team up to &quot;herd&quot; the Smurf to one of the players on your team.

'''ZxAnPhOrIaN:''' What will the smurfs look like?

'''LegalAssassin''' Err... pretty much like Smurfs :rolleyes:

@ EntropicLqd: I forgot that part, thanks for the reminder *added*

'''ZxAnPhOrIaN:''' I bet that the AI will be hard to script!

'''xX)(Xx:''' Which UT is this gonna be for?

'''Anonymous:''' I guess you could probably implement this for any UT</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Chameleon</title>
    <id>1959</id>
    <revision>
      <id>4796</id>
      <timestamp>2004-10-27T04:48:50Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any ::UT:: ::UT2003:: &amp;ndash; Chameleon}}

==Description ==

This mutator will probably need to allow a console command that can be bound to a key, or be invoked by a pick-up (or still other ways).&lt;br /&gt;The effect the [[Legacy:Mutator|mutator]] would have would be that the player's model would no longer be drawn with its skin but rather covered by the texture that is on a wall. The wall who's texture will cover the player's model would be different on other players machines. If you looked at the player from one angle the appropriate wall texture would be chosen and applied to the model. If you rotated around or he circled you the texture selection would change respective to the wall that this player was in front of from your view. 

==How to make this mod ==

hehehe right. I'd just do it wouldn't I?? =P

'''CH3Z:''' okay, the [http://68.13.7.125:10080/filesrc/UT/Utils/UTPure53/VaPure.htm Valhalla Avatar Mod] may have some insight for this (scroll down to &quot;MeshSkinAllowChange=&lt;0|1|2&gt;&quot;). Or it may be possible to make this mutator work in conjuntion with that mod, but i think that violates the standard that mutators should work with any other mutators or combination of mutators, because that standard suggests that it should work alone as well.

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*[[Legacy:Jarronis, The Vampiric Unicorn|Jarronis, The Vampiric Unicorn]]
*(name in link form)

====Gameplay Tweaking ====

'''Jarronis, The Vampiric Unicorn:'''

Well, to be honest, i still have no idea how to tweak this one, but i can tell some of my Experience and ideas.

The Chameleon effect especialy works great in dark Maps like Curse3, making it nearly impossible to aim at long distance, dark corners or camping freaks :rolleyes:. Of course you have an better chance to hit an enemy, when he is moving, but when he is skilled, he can use the chameleon effect to fool you up and loose your track.

Since this is the &quot;real&quot; chameleon skill in my opinion there should be an anti-camper mechanism, 'cause i fear that too much people will simply sit aside a rock and wait for us damn Rush0rs to run in front of their guns. (okay i admit: I played too much Counterstrike). 

'''CH3Z:''' What I had in mind was more like a pick-up to trigger the effect or maybe the guy with the flag takes on the effect or someway that only one person uses it at a time. Maybe even something that times out. But if it is otherwise, still, a good mutator should work well with any other mutator and should therefore work fine with anticamper mutators. This is nice cause the server admin can choose to use the anticamper or not, maybe the ppl that go there would get off on everyone camping out with this effect on. It leaves it in the hands of the user.

'''MythOpus:''' For the chameleon affect I like the idea of a pickup... or even a combo will work.   However for the pickup, what do you have in mind to replace.  Double damage, the shields or keg'o' health? or amybe even have it randomly spawn around the map ?  * I'm making a pickup model as I speak ;) *

'''Ch3z:''' I myself wouldn't have much of an idea of what form wuold be best suited for 2k3. Ut Classic doesn't have all that stuff. That's why I was mostly thinking of pick-ups. It would be kind of interesting if you had to jump into a pool to get the effect, or something new. But Jarronis will be along eventually to give his take on that. Did you go about causing the effect in the same way as Jarronis? I hope you both get a chance to compare notes before you put something out. You gonna set up a test server at the [[Legacy:Testing Lab|Testing Lab]] when you get something to look at? (Not that I would be able to see it &amp;ndash;  no hardware T&amp;L)

Ohhh here's a thought, (more work though): How about making it so that the Server Admin can set it up to be a combo or pick-up or other way. Always nice to let the end user have some say.

'''Jarronis, The Vampiric Unicorn:'''

Well, i'm not much of a GUI-Coder :/ I'm sure it's only a question of mutator GUI's to create a mass of options Users/Admins can turn on or off.

My personal Idea of this is a Arena-Like type... You getting &quot;Chameleon-Points&quot; for running around without getting fragged, so sitting in a corner does not allow to hide yourself for long. hm.. just an idea...

'''ch3z:''' Prolly right, gotta keep the feature-creep to a minimum or you'll never turn anything out that works smoothly. 

==Discussion ==

'''CH3Z:''' I just want to ask you to keep in mind that the journal kept for a mod here on this Wiki is best if you can keep it in a tone of tutorial. When the mod is finished, being as it is open source, the journal will be great for anyone who expands on the idea or fixes a &quot;newly discovered feature&quot; that SOME people might take as a &quot;bug&quot; =P

'''ZxAnPhOrIaN:''' That looks like it will be really hard to do. Also, it would be an adreniline combination.

'''CH3Z:''' Ya it would be an adreniline combination for UT2003 i suppose. Different in other games.

'''Foxpaw:''' It would be fairly difficult to generate a texture in real-time that mimicked what was behind it.. and if you did it would have the same effect as not drawing the pawn at all. You could probrably create a semblance of this effect by setting the players draw &quot;style&quot; to transparent and making the skin be just like highlights.. kind of like the invisibility overlay but less visible.

'''Jarronis, The Vampiric Unicorn:''' Maybe I'm wrong, but i thought it is the clue of this mod, that the Chameleon effect is not just like ordinary invisibility. My Ideo of this, that the players change their skin according to their background. For example, if you are in front of an stonewall, you have a stoneskin.

'''CH3Z:''' Exactly, Jarronis. You wouldn't have to &quot;mimick&quot; anything persay. Just sub the texture name that is on the wall beyond the Chameleon from the client for the texture name of the Chameleon's current skin. It would be an art of the Chameleon to keep him/herself positioned correctly for the effect to be effective, and to know when to stand still and when to move along. Takes more skill that way then just invisible no matter what. And hunters of the Chameleon would have to develope skills to hinder the Chameleon's opportunity to take full advantage of the effect. Nice to see your name in the interested list. I hope you can pull this off. I'm not gonna be able to do anything on it for a while. Keep us posted, eh? =)

'''Mosquito[l5]:''' I had this idea 6 months back when I was designing my FTN mod.  It's actually a mod for Half-Life and I MAY move it to UT2003, or HL2 not sure.  But my idea was that a person could purchase armor that could use this ability.  and you guys explained it perfectly.  I just have to figure out how to do it with the HL engine.  Might be a lot harder.

'''Foxpaw:''' I don't know if there is a way to get the texture of a BSP surface from within UnrealScript. I may be wrong, but I can't see how it would be done unless maybe you implemented it natively - that's why I suggested invisibility.

'''Foxpaw:''' After looking on Jarronis' page I see that he may have found a way to do this after all. I stand corrected.

'''CH3Z:''' Yeah! He's gettin' it. [[Legacy:Jarronis, The Vampiric Unicorn|Jarronis, The Vampiric Unicorn]] If anyone wants to follow this.

'''Jarronis, The Vampiric Unicorn:''' I released the &quot;Testcode&quot; for my Chameleon-Version. It works good, but I have no possibility to test it in network-play. If anyone would be so kind...

'''CH3Z:''' If I had UT2003 I sure would. Someone will soon i'm sure.

'''Mosquito[l5]:''' Tell me a time and I'll try to be there, or come to my IRC channel on Gamesnet: #Level-5.  [irc://irc.gamesnet.net/level-5 Level 5 IRC]

'''Birelli:''' Doing network testing without even needing an internet connection is described in the &quot;network debugging&quot; section of [[Legacy:Debugging Techniques|Debugging Techniques]]. Of course there's nothing wrong with trying it out with another human being :).

'''Mosquito[l5]:''' 2 words, Projectors and Scriptedtextures... We can rebuild him, we have the technology, faster, stronger, better.

'''MythOpus:''' :cheesy:

'''Mosquito:''' Holy crap, I hate it when I read a page and think, wait, I never said this, then I remember my evil page pirating twin, don't mind me....</text>
    </revision>
    <revision>
      <id>4797</id>
      <timestamp>2004-10-23T21:54:47Z</timestamp>
      <contributor>
        <ip>Hsdbrg142-165-228-22.sasknet.sk.ca</ip>
      </contributor>
      <comment>Ugh... Old project that I stopped working on... Great progress I've seen though</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any ::UT:: ::UT2003:: &amp;ndash; Chameleon}}

==Description ==

This mutator will probably need to allow a console command that can be bound to a key, or be invoked by a pick-up (or still other ways).&lt;br /&gt;The effect the [[Legacy:Mutator|mutator]] would have would be that the player's model would no longer be drawn with its skin but rather covered by the texture that is on a wall. The wall who's texture will cover the player's model would be different on other players machines. If you looked at the player from one angle the appropriate wall texture would be chosen and applied to the model. If you rotated around or he circled you the texture selection would change respective to the wall that this player was in front of from your view. 

==How to make this mod ==

hehehe right. I'd just do it wouldn't I?? =P

'''CH3Z:''' okay, the [http://68.13.7.125:10080/filesrc/UT/Utils/UTPure53/VaPure.htm Valhalla Avatar Mod] may have some insight for this (scroll down to &quot;MeshSkinAllowChange=&lt;0|1|2&gt;&quot;). Or it may be possible to make this mutator work in conjuntion with that mod, but i think that violates the standard that mutators should work with any other mutators or combination of mutators, because that standard suggests that it should work alone as well.

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*[[Legacy:Jarronis, The Vampiric Unicorn|Jarronis, The Vampiric Unicorn]]
*(name in link form)

====Gameplay Tweaking ====

'''Jarronis, The Vampiric Unicorn:'''

Well, to be honest, i still have no idea how to tweak this one, but i can tell some of my Experience and ideas.

The Chameleon effect especialy works great in dark Maps like Curse3, making it nearly impossible to aim at long distance, dark corners or camping freaks :rolleyes:. Of course you have an better chance to hit an enemy, when he is moving, but when he is skilled, he can use the chameleon effect to fool you up and loose your track.

Since this is the &quot;real&quot; chameleon skill in my opinion there should be an anti-camper mechanism, 'cause i fear that too much people will simply sit aside a rock and wait for us damn Rush0rs to run in front of their guns. (okay i admit: I played too much Counterstrike). 

'''CH3Z:''' What I had in mind was more like a pick-up to trigger the effect or maybe the guy with the flag takes on the effect or someway that only one person uses it at a time. Maybe even something that times out. But if it is otherwise, still, a good mutator should work well with any other mutator and should therefore work fine with anticamper mutators. This is nice cause the server admin can choose to use the anticamper or not, maybe the ppl that go there would get off on everyone camping out with this effect on. It leaves it in the hands of the user.

'''MythOpus:''' For the chameleon affect I like the idea of a pickup... or even a combo will work.   However for the pickup, what do you have in mind to replace.  Double damage, the shields or keg'o' health? or amybe even have it randomly spawn around the map ?  * I'm making a pickup model as I speak ;) *

'''Ch3z:''' I myself wouldn't have much of an idea of what form wuold be best suited for 2k3. Ut Classic doesn't have all that stuff. That's why I was mostly thinking of pick-ups. It would be kind of interesting if you had to jump into a pool to get the effect, or something new. But Jarronis will be along eventually to give his take on that. Did you go about causing the effect in the same way as Jarronis? I hope you both get a chance to compare notes before you put something out. You gonna set up a test server at the [[Legacy:Testing Lab|Testing Lab]] when you get something to look at? (Not that I would be able to see it &amp;ndash;  no hardware T&amp;L)

Ohhh here's a thought, (more work though): How about making it so that the Server Admin can set it up to be a combo or pick-up or other way. Always nice to let the end user have some say.

'''Jarronis, The Vampiric Unicorn:'''

Well, i'm not much of a GUI-Coder :/ I'm sure it's only a question of mutator GUI's to create a mass of options Users/Admins can turn on or off.

My personal Idea of this is a Arena-Like type... You getting &quot;Chameleon-Points&quot; for running around without getting fragged, so sitting in a corner does not allow to hide yourself for long. hm.. just an idea...

'''ch3z:''' Prolly right, gotta keep the feature-creep to a minimum or you'll never turn anything out that works smoothly. 

==Discussion ==

'''CH3Z:''' I just want to ask you to keep in mind that the journal kept for a mod here on this Wiki is best if you can keep it in a tone of tutorial. When the mod is finished, being as it is open source, the journal will be great for anyone who expands on the idea or fixes a &quot;newly discovered feature&quot; that SOME people might take as a &quot;bug&quot; =P

'''ZxAnPhOrIaN:''' That looks like it will be really hard to do. Also, it would be an adreniline combination.

'''CH3Z:''' Ya it would be an adreniline combination for UT2003 i suppose. Different in other games.

'''Foxpaw:''' It would be fairly difficult to generate a texture in real-time that mimicked what was behind it.. and if you did it would have the same effect as not drawing the pawn at all. You could probrably create a semblance of this effect by setting the players draw &quot;style&quot; to transparent and making the skin be just like highlights.. kind of like the invisibility overlay but less visible.

'''Jarronis, The Vampiric Unicorn:''' Maybe I'm wrong, but i thought it is the clue of this mod, that the Chameleon effect is not just like ordinary invisibility. My Ideo of this, that the players change their skin according to their background. For example, if you are in front of an stonewall, you have a stoneskin.

'''CH3Z:''' Exactly, Jarronis. You wouldn't have to &quot;mimick&quot; anything persay. Just sub the texture name that is on the wall beyond the Chameleon from the client for the texture name of the Chameleon's current skin. It would be an art of the Chameleon to keep him/herself positioned correctly for the effect to be effective, and to know when to stand still and when to move along. Takes more skill that way then just invisible no matter what. And hunters of the Chameleon would have to develope skills to hinder the Chameleon's opportunity to take full advantage of the effect. Nice to see your name in the interested list. I hope you can pull this off. I'm not gonna be able to do anything on it for a while. Keep us posted, eh? =)

'''Mosquito:''' I had this idea 6 months back when I was designing my FTN mod.  It's actually a mod for Half-Life and I MAY move it to UT2003, or HL2 not sure.  But my idea was that a person could purchase armor that could use this ability.  and you guys explained it perfectly.  I just have to figure out how to do it with the HL engine.  Might be a lot harder.

'''Foxpaw:''' I don't know if there is a way to get the texture of a BSP surface from within UnrealScript. I may be wrong, but I can't see how it would be done unless maybe you implemented it natively - that's why I suggested invisibility.

'''Foxpaw:''' After looking on Jarronis' page I see that he may have found a way to do this after all. I stand corrected.

'''CH3Z:''' Yeah! He's gettin' it. [[Legacy:Jarronis, The Vampiric Unicorn|Jarronis, The Vampiric Unicorn]] If anyone wants to follow this.

'''Jarronis, The Vampiric Unicorn:''' I released the &quot;Testcode&quot; for my Chameleon-Version. It works good, but I have no possibility to test it in network-play. If anyone would be so kind...

'''CH3Z:''' If I had UT2003 I sure would. Someone will soon i'm sure.

'''Mosquito:''' Tell me a time and I'll try to be there, or come to my IRC channel on Gamesnet: #Level-5.  [irc://irc.gamesnet.net/level-5 Level 5 IRC]

'''Birelli:''' Doing network testing without even needing an internet connection is described in the &quot;network debugging&quot; section of [[Legacy:Debugging Techniques|Debugging Techniques]]. Of course there's nothing wrong with trying it out with another human being :).

'''Mosquito:''' 2 words, Projectors and Scriptedtextures... We can rebuild him, we have the technology, faster, stronger, better.

'''MythOpus:''' :cheesy:</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ChangeMusicVolume</title>
    <id>1939</id>
    <revision>
      <id>4749</id>
      <timestamp>2003-09-12T03:59:27Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

This is basically a custom volume in which when you walk or enter the volume, the music changes into the 

music the mapper designates. It would be like the trigger in the original UT.

==Interested Scripters ==

==Discussion ==

'''inio:''' counting the class and variable definitions and even the closing bracket, this would be a grand total of like 6LOC, right?</text>
    </revision>
    <revision>
      <id>4750</id>
      <timestamp>2002-12-06T21:07:42Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

This is basically a custom volume in which when you walk or enter the volume, the music changes into the 

music the mapper designates. It would be like the trigger in the original UT.

==Interested Scripters ==

==Discussion ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Charging Shock Rifle</title>
    <id>1868</id>
    <revision>
      <id>4585</id>
      <timestamp>2003-04-17T21:32:47Z</timestamp>
      <contributor>
        <ip>Clt74-18-158.carolina.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Charging Shock Rifle}}

==Description ==

This would be a small mutator that changes the way the shock rifle behaves.  Rather than do a fixed amount of damage, the damage is calculated based upon the amount of time between firings.  The smaller the time between firings the smaller the amount of damage.  A killing shot will take a require second of charge time.  The lowest damage shot will take a 10th of a second (maybe a 5th).  A minor HUD tweak will be necessary so players can see the charge state of their Shock Rifle.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

===Discussion ===

'''Birelli:''' 1 second seems too short to me. How about 3 seconds to charge up to 90 damage (1 second = 30 damage up to 90 (90 so one hit won't kill a newly spawned player)) and then a special &quot;overcharge&quot; blast at 5 seconds which is 1,000,000 damage or something ala instagib. That to me seems much more tactical, since players, when disengaged, will have a one-time chance at an insta-gib before launching into battle. (BTW there isn't a shock rifle any more is there? just a rail(lighting?)gun, but same principle). Of course all the times would need to be highly tweaked (maybe even down to minute detail like 3 damage per .1 seconds or something, with a counter that counts up 3,6,9,12 in rapid succession)

'''Mychaeel:'''  There's still the Shock Gun (the Lightning Gun is the gun formerly known as Sniper Rifle).  Secondary fire is slower than the Shock Rifle's, combos do less damage (or in a smaller radius), and the visual effects are a bit tweaked; otherwise it's the same.

'''EntropicLqd:'''  1 second is just a planning number (still feels like an eternity if you are waiting to fire though) &amp;ndash; it proably is to short.  Perhaps it should be configurable.  My idea was always to make the rifle should charge smoothly up to an instant kill irrespective of health and armour.  It's a bit like a cross between Shock Arena and Instagib.

'''Dade:'''  Hmm, interesting. I just now stumbled upon this post. I am currently working on a weapons mut for 2k3. One of the weapons, the Shadows rifle, does exactly what is being suggested in this post. It fires as fast as you can hit the button, and the damage dealt is less depending on the charge. Full charge is 100, and the charge decreases with each shot, as does the damage. the recharge rate is high enough to be tolerable, but low enough to encourage careful shot placement. If anyone is interested, let me know at Dade@carolina.rr.com</text>
    </revision>
    <revision>
      <id>4586</id>
      <timestamp>2002-07-30T08:24:42Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Charging Shock Rifle}}

==Description ==

This would be a small mutator that changes the way the shock rifle behaves.  Rather than do a fixed amount of damage, the damage is calculated based upon the amount of time between firings.  The smaller the time between firings the smaller the amount of damage.  A killing shot will take a require second of charge time.  The lowest damage shot will take a 10th of a second (maybe a 5th).  A minor HUD tweak will be necessary so players can see the charge state of their Shock Rifle.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

===Discussion ===

'''Birelli:''' 1 second seems too short to me. How about 3 seconds to charge up to 90 damage (1 second = 30 damage up to 90 (90 so one hit won't kill a newly spawned player)) and then a special &quot;overcharge&quot; blast at 5 seconds which is 1,000,000 damage or something ala instagib. That to me seems much more tactical, since players, when disengaged, will have a one-time chance at an insta-gib before launching into battle. (BTW there isn't a shock rifle any more is there? just a rail(lighting?)gun, but same principle). Of course all the times would need to be highly tweaked (maybe even down to minute detail like 3 damage per .1 seconds or something, with a counter that counts up 3,6,9,12 in rapid succession)

'''Mychaeel:'''  There's still the Shock Gun (the Lightning Gun is the gun formerly known as Sniper Rifle).  Secondary fire is slower than the Shock Rifle's, combos do less damage (or in a smaller radius), and the visual effects are a bit tweaked; otherwise it's the same.

'''EntropicLqd:'''  1 second is just a planning number (still feels like an eternity if you are waiting to fire though) &amp;ndash; it proably is to short.  Perhaps it should be configurable.  My idea was always to make the rifle should charge smoothly up to an instant kill irrespective of health and armour.  It's a bit like a cross between Shock Arena and Instagib.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ChargingJumpBoots</title>
    <id>1867</id>
    <revision>
      <id>4583</id>
      <timestamp>2002-07-28T20:17:21Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; A variable height jump match}}

==Description ==

This small mutator is really a logical extension to the UT JumpMatch mutator.  At the beginning of play every player is given a pair of charging jump boots.  The jump boots jump on release of the jump key rather than when it's pressed.  This allows them to be charged up for a mega-super-duper jump.  The longer the jump key is held down the higher the wearer will jump.  The boots will also eliminate falling damage completely.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.  Effort should never be duplicated, only contributed. (lol - what a slogan).

==Discussion ==

'''ZxAnPhOrIaN:'''  Could you do that in UT also?

'''EntropicLqd:'''  I don't see any reason why not.  I just don't have the time to do anything ''interesting'' at the moment in the evenings.  Remember - these pages are simply a dumping ground for ideas - they just happen to be ones that I don't have time to do anything with (from an implementation point of view) at the moment.  I'm hoping that will change in the future - we shall see.

'''DJPaul:'''  Sounds much like the jumping system in JK][, which would be not a bad idea to tie into another mod/mutator, because it's not really big enough on itself.  Unless it's a mutator.  Presuming I get this [[Legacy:DJPaul/TTS|DJPaul/TTS]] thing working/released soon, I think i'll have a look at making this as an UT mutator.

'''EntropicLqd:'''  Hmmm, not sure I agree with that.  The beauty of mutators is that you can stack them up.  This means that mutators that are &quot;atomic&quot; (provide only a single function) are preferable.  It's easier to get the otherwordly combination of effects you want if a mutator only does one thing.

'''DJPaul:''' What's not atomic, EntropicLqd?  Basically, in JK][, the longer you hold down the jump key, the higher you jump - which '''is''' the description of the mutator.

'''EntropicLqd:''' Hee hee - This is slightly different from the JK2 jump in that you jump ''on release'' of the jump button rather than while the jump key is down.  My comment on atomicity actually applies to your comment above, ''&quot;which would be not a bad idea to tie into another mod/mutator, because it's not really big enough on itself.&quot;''.  The idea is definately worthy of being its own mutator.

'''DJPaul:'''  Is &quot;atomicity&quot; a word?

'''EntropicLqd:'''  I have no idea - but it ought to be.  Languages are dynamic things right?</text>
    </revision>
    <revision>
      <id>4584</id>
      <timestamp>2002-07-28T17:30:50Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; A variable height jump match}}

==Description ==

This small mutator is really a logical extension to the UT JumpMatch mutator.  At the beginning of play every player is given a pair of charging jump boots.  The jump boots jump on release of the jump key rather than when it's pressed.  This allows them to be charged up for a mega-super-duper jump.  The longer the jump key is held down the higher the wearer will jump.  The boots will also eliminate falling damage completely.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.  Effort should never be duplicated, only contributed. (lol - what a slogan).

* [[Legacy:DJPaul|DJPaul]] - ''I think i'll have a look at making this as an UT mutator.''

==Discussion ==

'''ZxAnPhOrIaN:'''  Could you do that in UT also?

'''EntropicLqd:'''  I don't see any reason why not.  I just don't have the time to do anything ''interesting'' at the moment in the evenings.  Remember - these pages are simply a dumping ground for ideas - they just happen to be ones that I don't have time to do anything with (from an implementation point of view) at the moment.  I'm hoping that will change in the future - we shall see.

'''DJPaul:'''  Sounds much like the jumping system in JK][, which would be not a bad idea to tie into another mod/mutator, because it's not really big enough on itself.  Unless it's a mutator.  Presuming I get this [[Legacy:DJPaul/TTS|DJPaul/TTS]] thing working/released soon, I think i'll have a look at making this as an UT mutator.

'''EntropicLqd:'''  Hmmm, not sure I agree with that.  The beauty of mutators is that you can stack them up.  This means that mutators that are &quot;atomic&quot; (provide only a single function) are preferable.  It's easier to get the otherwordly combination of effects you want if a mutator only does one thing.

'''DJPaul:''' What's not atomic, EntropicLqd?  Basically, in JK][, the longer you hold down the jump key, the higher you jump - which '''is''' the description of the mutator.

'''EntropicLqd:''' Hee hee - This is slightly different from the JK2 jump in that you jump ''on release'' of the jump button rather than while the jump key is down.  My comment on atomicity actually applies to your comment above, ''&quot;which would be not a bad idea to tie into another mod/mutator, because it's not really big enough on itself.&quot;''.  The idea is definately worthy of being its own mutator.

'''DJPaul:'''  Is &quot;atomicity&quot; a word?

'''EntropicLqd:'''  I have no idea - but it ought to be.  Languages are dynamic things right?</text>
    </revision>
    <revision>
      <id>34385</id>
      <timestamp>2009-05-06T19:04:04Z</timestamp>
      <contributor>
        <username>Lord Farin</username>
        <id>909</id>
      </contributor>
      <minor/>
      <comment>taking on this project</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; A variable height jump match}}

==Description ==

This small mutator is really a logical extension to the UT JumpMatch mutator.  At the beginning of play every player is given a pair of charging jump boots.  The jump boots jump on release of the jump key rather than when it's pressed.  This allows them to be charged up for a mega-super-duper jump.  The longer the jump key is held down the higher the wearer will jump.  The boots will also eliminate falling damage completely.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.  Effort should never be duplicated, only contributed. (lol - what a slogan).

==Discussion ==

'''ZxAnPhOrIaN:'''  Could you do that in UT also?

'''EntropicLqd:'''  I don't see any reason why not.  I just don't have the time to do anything ''interesting'' at the moment in the evenings.  Remember - these pages are simply a dumping ground for ideas - they just happen to be ones that I don't have time to do anything with (from an implementation point of view) at the moment.  I'm hoping that will change in the future - we shall see.

'''DJPaul:'''  Sounds much like the jumping system in JK][, which would be not a bad idea to tie into another mod/mutator, because it's not really big enough on itself.  Unless it's a mutator.  Presuming I get this [[Legacy:DJPaul/TTS|DJPaul/TTS]] thing working/released soon, I think i'll have a look at making this as an UT mutator.

'''EntropicLqd:'''  Hmmm, not sure I agree with that.  The beauty of mutators is that you can stack them up.  This means that mutators that are &quot;atomic&quot; (provide only a single function) are preferable.  It's easier to get the otherwordly combination of effects you want if a mutator only does one thing.

'''DJPaul:''' What's not atomic, EntropicLqd?  Basically, in JK][, the longer you hold down the jump key, the higher you jump - which '''is''' the description of the mutator.

'''EntropicLqd:''' Hee hee - This is slightly different from the JK2 jump in that you jump ''on release'' of the jump button rather than while the jump key is down.  My comment on atomicity actually applies to your comment above, ''&quot;which would be not a bad idea to tie into another mod/mutator, because it's not really big enough on itself.&quot;''.  The idea is definately worthy of being its own mutator.

'''DJPaul:'''  Is &quot;atomicity&quot; a word?

'''EntropicLqd:'''  I have no idea - but it ought to be.  Languages are dynamic things right?

'''Lord_Farin:''' No idea if it'll work for UT2k3, but I will try and create this Mutator for UT2k4.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Civilians</title>
    <id>2018</id>
    <revision>
      <id>4926</id>
      <timestamp>2008-03-15T19:04:40Z</timestamp>
      <contributor>
        <ip>JeffMOD</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The idea here is that you can add atmosphere to realistic maps by having civilians going about their daily business.

These would be somewhat like bots, but would not have any aggression, and you don't score points for killing them, they just go about their business and potentially get shot.

This really comes out of playing on sniper servers in big empty towns.  Rather than adding movers into the map on the streets, it would be cooler to have bots and vehicles spawn out-of-map and just pass through.  They would, for example, run people over who stepped on the road or get in the way of a player trying to shoot at another.

The immediate question is whether it is possible to have more of these civilians than the server allows bots.  I think so, because I think the limit is on the number of players, not the number of controlled pawns.

In the long run of course it would be best to have a variety of civilian skins and animations, and civilian vehicles.  But for now, a bunch of brocks driving hellbenders would be cool.

'''Sweavo:''' I don't know enough about bots and vehicle pathing to even make a start on this yet, so I put it here rather than on my own page.

'''SuperApe:''' Sounds cool.  So, these would be NPCs?  You're right, the limit is on players, not pawns or controllers.  Looking ahead, although you describe driving civilians, it might be good to start with a fresh Controller, instead of Bot or xBot, just to avoid the overhead of unused combat code.  That said, there's plenty of useful code in Bots for navigation, etc.  Recently I've found it's the UnrealPawn PostBeginNetPlay() function that attempts to put the pawn on a roster; that's where the (player) limit would be.  If you can avoid that, you should be able to add as many as you need.  Coding the AI should be pretty fun.  Looking forward to it. :)

'''Moofed:''' This is exactly what I will be learning monster scripting for, SuperApe.  Civilian pedestrians and vehicles are needed to recreate the GTA2 feel.

'''SuperApe:''' Well, let's not hijack Sweavo's page, but that's good to know.  I thought you were interested in Monsters.  Let's continue discussion on another page.  [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]]?  [[Legacy:Moofed|Moofed]]? (PersonalPage)

'''Sweavo:''' no, please do hijack this.   This does sound like exactly what I'm talking about.  As I said, if I was able to go ahead and build this I would have it hanging off my page, not mod ideas.

'''SuperApe:''' LOL, very well.  I gave a few comments.  [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash;&gt; [[Legacy:Moofed|Moofed]]

'''JeffMOD:''' This is very easy to do, if you script it right. ;) Simply add some '''xPawns''', I've used duplicates of the one from the DM tut, and place nodes where you want the Civllians to walk. then, script it! use ACTION_MOVE_TO with AI scripts, you'll probably want at least 3 scripts, or it's not varied. Then, keep using ACTION_MOVE_TO, remembering to put the tags to tags on the Node's you want then to move to, and keep them going in circles, possibly around the block, in a building, out the building, cross the street, around '''that''' block, then go back to the first action. The only problem is that they don't respawn until you restart the level. '''OH. and a word of CAUTION! i'm not sure, but this may have stopped my copy of UED from loading before crashing. i'm not sure. please see [[Legacy:Crashing UED|Crashing UED]] for details on my problem, or [[Legacy:UED G0blin|UED G0blin]]. I put it on there too.'''</text>
    </revision>
    <revision>
      <id>4927</id>
      <timestamp>2006-01-30T17:20:07Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The idea here is that you can add atmosphere to realistic maps by having civilians going about their daily business.

These would be somewhat like bots, but would not have any aggression, and you don't score points for killing them, they just go about their business and potentially get shot.

This really comes out of playing on sniper servers in big empty towns.  Rather than adding movers into the map on the streets, it would be cooler to have bots and vehicles spawn out-of-map and just pass through.  They would, for example, run people over who stepped on the road or get in the way of a player trying to shoot at another.

The immediate question is whether it is possible to have more of these civilians than the server allows bots.  I think so, because I think the limit is on the number of players, not the number of controlled pawns.

In the long run of course it would be best to have a variety of civilian skins and animations, and civilian vehicles.  But for now, a bunch of brocks driving hellbenders would be cool.

'''Sweavo:''' I don't know enough about bots and vehicle pathing to even make a start on this yet, so I put it here rather than on my own page.

'''SuperApe:''' Sounds cool.  So, these would be NPCs?  You're right, the limit is on players, not pawns or controllers.  Looking ahead, although you describe driving civilians, it might be good to start with a fresh Controller, instead of Bot or xBot, just to avoid the overhead of unused combat code.  That said, there's plenty of useful code in Bots for navigation, etc.  Recently I've found it's the UnrealPawn PostBeginNetPlay() function that attempts to put the pawn on a roster; that's where the (player) limit would be.  If you can avoid that, you should be able to add as many as you need.  Coding the AI should be pretty fun.  Looking forward to it. :)

'''Moofed:''' This is exactly what I will be learning monster scripting for, SuperApe.  Civilian pedestrians and vehicles are needed to recreate the GTA2 feel.

'''SuperApe:''' Well, let's not hijack Sweavo's page, but that's good to know.  I thought you were interested in Monsters.  Let's continue discussion on another page.  [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]]?  [[Legacy:Moofed|Moofed]]? (PersonalPage)

'''Sweavo:''' no, please do hijack this.   This does sound like exactly what I'm talking about.  As I said, if I was able to go ahead and build this I would have it hanging off my page, not mod ideas.

'''SuperApe:''' LOL, very well.  I gave a few comments.  [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash;&gt; [[Legacy:Moofed|Moofed]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ColorfulWarriors</title>
    <id>1899</id>
    <revision>
      <id>4656</id>
      <timestamp>2002-09-21T23:50:10Z</timestamp>
      <contributor>
        <ip>K St TheJunior</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==A &quot;Colorful Warriors Mod&quot; for UT ==

==. . . . . . . . . . . . . . . . with Floating Airboats, Giant GreenNalis, and Vehicular Combat ==

Hi, this is K_St_theJunior. I have just completed a umod SkinPack consisting of most of my &quot;Colorful Warriors&quot; skins (25 so far, v.2, with 4 never yet appearing at SkinCity), and it's already about 23 mb of stuff. It includes my GreenNali and WhiteNali skins, and even a &quot;GreenNaliGiants&quot; mutator that I've almost got right. If Atif Riaz (&quot;eagleAR&quot;) is able to finish fixing it for me, I'll be posting this through SkinCity as a gigantic SkinPack in just a couple more days. (If he can't get it fixed for me, I may have to request help on that aspect from other coders.) Ralf at SkinCity in Germany has already sent me an e-mail indicating that he will be happy to post the gigantic ColorfulWarriors SkinPack for us, so this new mod I've envisioned already has a potential publisher at BeyondUnreal.com, I believe.

Anyway, I am visualizing the possibility of turning it into a mini-mod with the addition of my little mutator &amp;ndash; plus some flying vehicles, if someone volunteers to help! If some talented volunteer coder could assist me with the transformation, I'd like to also add one &quot;floating airboat&quot; model to it &amp;ndash; or better still, SEVERAL &quot;airboats&quot; of various sizes, ranging from small to larger. The smaller size would carry a player and maybe one bot aboard, visible in third-person view (via hotkey) with ChaosUT swords drawn and ready, or with ray-guns unholstered, letting them travel through the air, around any map, and attack from above whenever they come zooming down or jump off the airboat. The larger of the &quot;floating airboats&quot; (like big floating rafts or rowboats, but much more modern/futuristic in appearance) could hold maybe 5-10 players/bots aboard, all visible standing on the deck of the airboat with swords/ray-guns drawn and ready for action.

People seem to have a lot of fun using the Strangelove mutator to fly around, and the Quantum Fighter Jets mutator of Zencoder likewise, and they like the &quot;Mobile Forces&quot; idea of moving vehicles within UT. So I think this could be a lot of fun in a similar way, allowing fans to recreate the old &quot;pioneer s-f&quot; of the earliest s-f literature.

If Zencoder or anyone else would be interested in working on this for me (as volunteer work, for free) and sharing the credit, please contact me and let me know. This will be a free-giveaway mod, and I'm poorer than dirt right now, so your only real payment would be in appreciation from me and other UT fans. But let me know if you could help!

Anyone who submits a suitable-looking &quot;floating airboat&quot; mutator to me will be considered for inclusion within the future versions of the Colorful Warriors SkinPack/Mod, and I would be really happy to be able to include such flying vehicles within future versions of the umod. If you want some hints or pictures revealing more about what kind of appearance I'm aiming for in the desired airboats, I can send you that upon request.

Thanks in advance for any help that any coders or modelers out there might be able to provide.

Sincerely,

K_St_theJunior  Aug. 2, 2002

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''DJPaul:'''  What's the &quot;GreenNaliGiants&quot; mutator do?

'''K_St_theJunior:''' Right now there are actually 4 of them, &quot;GreenNaliGiants,&quot; &quot;GreenNaliGiants2x,&quot; &quot;GreenNaliGiants3x,&quot; and &quot;GreenNaliGiants4x.&quot; What it does basically is just to increase the size of all the Red Team bots while leaving all the Blue Team (and Green and Gold Teams) at normal size. By choosing only my GreenNali (or WhiteNali for that matter) skins in the Bot Selection window for all of the Red Team members, it lets you see Giant GreenNalis at 1.5x, 2x, 3x, 4x size. I'm a librarian, not a coder, but by playing around (&amp;ndash; is 10-20 hours of frustrating and unsuccessful labor &quot;playing around&quot;?) with various substitutions, I finally got it half-working. At first, in my &quot;alpha 1&quot; version, the giants were sinking into the ground because I didn't know the right code terms for setting the collision stuff. Later, after another day's work, I contrived a new version (&quot;alpha 2&quot;) that got the Giants working just fine; only problem is that the normal-size Blue Team members now float about 24 inches off the ground. That's what I've asked eagleAR to fix for me (since he's helped me once before with my Runebot skins), but he's not gotten back to me about it yet. EagleAR is Atif Riaz, by the way, and he's the ingenius fellow who created the Runebots mutator &amp;ndash; when Human Head Studios execs kept insisting that it was just too difficult to make any bots for Rune! Personally, I think he did a pretty darn good job of it!

'''K_St_theJunior (update):''' The Colorful Warriors SkinPack mod (v2.0) is currently available for download from SkinCity and the BeyondUnreal high-speed servers. The file is CW_v2-0_SkinPack_Umod.zip and it has 25 skins inside it, and it is 24.3 MB in size at the present time. I have the GreenNaliGiants mutators working correctly now, thanks to an assist from Atif Riaz. There are 16 mutators included in the Pack, which allow Giant GreenNalis of 4 different sizes (up to 400% of normal size) to be placed on either the Blue Team, Red Team, Green Team, or Gold Team. I continue to hope that someone will show an interest in devising, as well, some Floating Airboat mutators for this mod!

'''Ars-Magna:'''Hi, I looked over your mutator idea, and unlike some of the other ones floating around at this point, it actually seems &quot;doable.&quot; I'm no UScript coder though. I'd never much thought of the prospects of having bigger/smaller players. Would you make it so the player's view changes? Obviously a larger player would have a slightly different view than a smaller one would.

'''Tarquin:''' Just seen the new iterm on this on BU. Great to hear it's going well!

'''K_St_theJunior (to Ars-Magna):''' The bot-size mutator for teams (GreenNaliGiants) seems to be working fine now, so far as I know. My two sons and I have used it mostly with bots, where we usually put all the giants on the Red Team. As I recall, when you try playing as a character on the Red Team (with the Red Team GNG size mutator engaged, together with the right Xbots list), YOU DO GET the higher viewpoint of the giant character, in First Person view, and if you switch to Third Person view, you likewise see a giant version of your character. That part's already done, though. I hope what you were trying to suggest is that the Floating Airboats idea is &quot;doable,&quot; because I'm still trying to find some bright volunteer to invent/design that for the CW Mod.

'''K_St_theJunior (to Tarquin):''' I'm happy that the CW v3.0 Mod is starting to come together. It should include a few customized maps made by SabbathCat and Luggage, but I hope to find some other map contributers as well! If you know anyone who's done some good maps and they'd be willing to convert the skybox textures to a red sky for a CW Mod edition of the map, please have them contact me! Parser, who recently devised the &quot;WeaponMage&quot; weapons-pack, has recently volunteered to make a set of new s-f weapons for CW Mod, and I'm very happy about that too. I've been hanging around the Identity Crisis forums a lot lately, and started one thread under &quot;Models&quot; called &quot;Floating Airboats Needed For CW Mod,&quot; but so far no modeller/coder has jumped on board with a willingness to make the Floating Airboats for us. If anyone in the Wiki world is interested, I'm still hoping/dreaming that I can get someone to volunteer for this job... so let me know!</text>
    </revision>
    <revision>
      <id>4657</id>
      <timestamp>2002-09-13T20:16:34Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==A &quot;Colorful Warriors Mod&quot; for UT ==

==. . . . . . . . . . . . . . . . with Floating Airboats, Giant GreenNalis, and Vehicular Combat ==

Hi, this is K_St_theJunior. I have just completed a umod SkinPack consisting of most of my &quot;Colorful Warriors&quot; skins (25 so far, v.2, with 4 never yet appearing at SkinCity), and it's already about 23 mb of stuff. It includes my GreenNali and WhiteNali skins, and even a &quot;GreenNaliGiants&quot; mutator that I've almost got right. If Atif Riaz (&quot;eagleAR&quot;) is able to finish fixing it for me, I'll be posting this through SkinCity as a gigantic SkinPack in just a couple more days. (If he can't get it fixed for me, I may have to request help on that aspect from other coders.) Ralf at SkinCity in Germany has already sent me an e-mail indicating that he will be happy to post the gigantic ColorfulWarriors SkinPack for us, so this new mod I've envisioned already has a potential publisher at BeyondUnreal.com, I believe.

Anyway, I am visualizing the possibility of turning it into a mini-mod with the addition of my little mutator &amp;ndash; plus some flying vehicles, if someone volunteers to help! If some talented volunteer coder could assist me with the transformation, I'd like to also add one &quot;floating airboat&quot; model to it &amp;ndash; or better still, SEVERAL &quot;airboats&quot; of various sizes, ranging from small to larger. The smaller size would carry a player and maybe one bot aboard, visible in third-person view (via hotkey) with ChaosUT swords drawn and ready, or with ray-guns unholstered, letting them travel through the air, around any map, and attack from above whenever they come zooming down or jump off the airboat. The larger of the &quot;floating airboats&quot; (like big floating rafts or rowboats, but much more modern/futuristic in appearance) could hold maybe 5-10 players/bots aboard, all visible standing on the deck of the airboat with swords/ray-guns drawn and ready for action.

People seem to have a lot of fun using the Strangelove mutator to fly around, and the Quantum Fighter Jets mutator of Zencoder likewise, and they like the &quot;Mobile Forces&quot; idea of moving vehicles within UT. So I think this could be a lot of fun in a similar way, allowing fans to recreate the old &quot;pioneer s-f&quot; of the earliest s-f literature.

If Zencoder or anyone else would be interested in working on this for me (as volunteer work, for free) and sharing the credit, please contact me and let me know. This will be a free-giveaway mod, and I'm poorer than dirt right now, so your only real payment would be in appreciation from me and other UT fans. But let me know if you could help!

Anyone who submits a suitable-looking &quot;floating airboat&quot; mutator to me will be considered for inclusion within the future versions of the Colorful Warriors SkinPack/Mod, and I would be really happy to be able to include such flying vehicles within future versions of the umod. If you want some hints or pictures revealing more about what kind of appearance I'm aiming for in the desired airboats, I can send you that upon request.

Thanks in advance for any help that any coders or modelers out there might be able to provide.

Sincerely,

K_St_theJunior  Aug. 2, 2002

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''DJPaul:'''  What's the &quot;GreenNaliGiants&quot; mutator do?

'''K_St_theJunior:''' Right now there are actually 4 of them, &quot;GreenNaliGiants,&quot; &quot;GreenNaliGiants2x,&quot; &quot;GreenNaliGiants3x,&quot; and &quot;GreenNaliGiants4x.&quot; What it does basically is just to increase the size of all the Red Team bots while leaving all the Blue Team (and Green and Gold Teams) at normal size. By choosing only my GreenNali (or WhiteNali for that matter) skins in the Bot Selection window for all of the Red Team members, it lets you see Giant GreenNalis at 1.5x, 2x, 3x, 4x size. I'm a librarian, not a coder, but by playing around (&amp;ndash; is 10-20 hours of frustrating and unsuccessful labor &quot;playing around&quot;?) with various substitutions, I finally got it half-working. At first, in my &quot;alpha 1&quot; version, the giants were sinking into the ground because I didn't know the right code terms for setting the collision stuff. Later, after another day's work, I contrived a new version (&quot;alpha 2&quot;) that got the Giants working just fine; only problem is that the normal-size Blue Team members now float about 24 inches off the ground. That's what I've asked eagleAR to fix for me (since he's helped me once before with my Runebot skins), but he's not gotten back to me about it yet. EagleAR is Atif Riaz, by the way, and he's the ingenius fellow who created the Runebots mutator &amp;ndash; when Human Head Studios execs kept insisting that it was just too difficult to make any bots for Rune! Personally, I think he did a pretty darn good job of it!

'''K_St_theJunior (update):''' The Colorful Warriors SkinPack mod (v2.0) is currently available for download from SkinCity and the BeyondUnreal high-speed servers. The file is CW_v2-0_SkinPack_Umod.zip and it has 25 skins inside it, and it is 24.3 MB in size at the present time. I have the GreenNaliGiants mutators working correctly now, thanks to an assist from Atif Riaz. There are 16 mutators included in the Pack, which allow Giant GreenNalis of 4 different sizes (up to 400% of normal size) to be placed on either the Blue Team, Red Team, Green Team, or Gold Team. I continue to hope that someone will show an interest in devising, as well, some Floating Airboat mutators for this mod!

'''Ars-Magna:'''Hi, I looked over your mutator idea, and unlike some of the other ones floating around at this point, it actually seems &quot;doable.&quot; I'm no UScript coder though. I'd never much thought of the prospects of having bigger/smaller players. Would you make it so the player's view changes? Obviously a larger player would have a slightly different view than a smaller one would.

'''Tarquin:''' Just seen the new iterm on this on BU. Great to hear it's going well!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CorpseRedemption</title>
    <id>1991</id>
    <revision>
      <id>4868</id>
      <timestamp>2006-09-01T01:26:23Z</timestamp>
      <contributor>
        <ip>24-216-236-134.dhcp.mdfd.or.charter.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT / Fun little &quot;redeem your life&quot; mod. - By Olga}}

==Description ==

My idea is for some kind of modification that makes it so that after you die, you lose a frag and your corpse starts running around. If you frag your corpse, you redeem a frag. I don't know what to make this as, I'm thinking either a mut or a gametype though. Dunno what UT to make this for though.

UPDATE: I think I might actually start coding this old idea, which I forgot completely about.

-Olga-

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Sweavo:''' couple thoughts
# what if someone else kills your corpse?  Do they get an extra point?
# what if you die again before your corpse?  another corpse?
# How are you thinking of tackling this?  By spawning a bot?  In team games maybe the corpse should be on team 255 so it is hostile to everyone.

I don't know enough about non-player characters to add more</text>
    </revision>
    <revision>
      <id>4869</id>
      <timestamp>2005-11-14T09:30:15Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT / Fun little &quot;redeem your life&quot; mod. - By Erika 'Olga' Bal}}

==Description ==

My idea is for some kind of modification that makes it so that after you die, you lose a frag and your corpse starts running around. If you frag your corpse, you redeem a frag. I don't know what to make this as, I'm thinking either a mut or a gametype though. Dunno what UT to make this for though.

UPDATE: I think I might actually start coding this old idea, which I forgot completely about.

-Erika 'Olga' Bal-

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Sweavo:''' couple thoughts
# what if someone else kills your corpse?  Do they get an extra point?
# what if you die again before your corpse?  another corpse?
# How are you thinking of tackling this?  By spawning a bot?  In team games maybe the corpse should be on team 255 so it is hostile to everyone.

I don't know enough about non-player characters to add more</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CratePickups</title>
    <id>1908</id>
    <revision>
      <id>4677</id>
      <timestamp>2003-06-13T14:10:04Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">CratePickups - the pickups are in crates!

==Description==

The gist is simple: all and any pickups (minus weapons) are replaced by crates.

The crates, when shot, release whatever it is that they replaced and - here's the best part - those little polyestrene 8s fall out too!

If a crate is destroyed '''outside''', same behaviour as normal, but a chance of a crate falling from the sky, squishing the player.

The 8s, if jumped on, or destroyed, turn into lil' particles of polyestrene, and they cause the player to slide a bit.

----

====Interested Scripters/Contributers ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

*  [[Legacy:Luggage|Luggage]]

----

==Discussion==

'''DJPaul:'''  What pickups could we replace with boxes? -&gt; Adrenaline, Ammo, etc.

Also, my brother came up with an idea that sounds somewhat similar to some Q3 mod i've vaguely heard of - spawning boxes throughout the entire level; each box is worth one point, and a frag 3.  There's a timelimit, and the person who gets the most points, wins!

'''ZxAnPhOrIaN:''' It will be cool if those 8's would desinegrate (did I spell that right?) when they fall into water, slime, and lava like biodegradable peanuts. After they desinegrate, they will leave a cloudy, slippery mess.

'''EntropicLqd:''' In outdoor areas, when a create is destroyed, it should leave behind a pickup that doesn't respawn.  Instead, a crate should randomly fall from the sky (hopefully dquashing a player :) ).  It could do with a &quot;random contents&quot; option that spawns objects in the same ratio as they were added to the level.  An option to have the crates spawn randomly around the level would also be nice.

'''DJPaul:'''  Not sure about that &quot;random contents&quot; option - the point of these things is to contain items (such as health).  Should the crates respawn after the power-up is collected, but the wreckage of the old one remain?

Thinking about it, if we did let them respawn, I suppose you COULD choose the crates to respawn randomly.

'''EntropicLqd:''' The objects will have to respawn anyway.  If the crates themselves don't respawn then it makes sense to keep the crate wreckage around for those objects that have these new fangled platforms to sit on - maybe remove it for those that don't.  If you want to respawn the crates then you would want to get rid of the wreckage to prevent a big pile of destroyed crates from killing framerate.  And if you respawn the crates then it's only a small step to having randomly respawning crates with vanishing wreckage.

'''ZxAnPhOrIaN:''' The wreckage should dissapear when a new box regenerates.

'''DJPaul:''' Yes, the box &quot;wood&quot; will disappear, but the 8s are staying.

'''ZxAnPhOrIaN:''' Shouldn't the 8s dissapear when they fall into slime, lava, water, or being shot at?

'''EntropicLqd:''' Wonder if you can get the 8s to be &quot;pushed aside&quot; when a player runs through them.  That would be really cool.  You could simluate wind and get drifts of 8s ..... (I'll get me coat).

'''ZxAnPhOrIaN:''' You probably could, but what would be really cool is that there would be a sound that sounds like walking though them, like walking through autumn leaves!

'''DJPaul:''' There is wind built into UT, so i'm *very* confident you could get things to &quot;fly&quot; in them.

'''ZxAnPhOrIaN:''' I will be willing to create the decoration for the 8s!

'''DJPaul:''' Add your name to the Interested Scripters/Contributers section then

'''DJPaul:''' ZxAnPhOrIaN - please email me at djpaul@djgenerationx.com

'''ZxAnPhOrIaN:''' The .t3d file? O_o BTW: call me Zxan for short! :P

'''Guest:''' Don't email me any files, just email me for chrisstakes... i've got something to discuss.

'''ZxAnPhOrIaN:''' Chrisstakes?

'''G-LiTe:''': Sounds like a cool idea. :) If you'd like some more complication, you can also set a minimum and maximum for the amount of crates and just have them respawn every few seconds up till the maximum. Just as soon as the amount of crates drops below the minimum it'll immediatly spawn one. &lt;br /&gt;Maybe you can also have some sort of effect on the disappearing of the wood, like a fade like decals or add some karma to it and have it slowly lift up like dead bodies do.

'''L0sT:'''Insofar as random spawning, back in the Amah: UT days I did a little mut that replaced all the health with exploding Nalibunnies, I kept a MAXbunnies global int that was filled in postbeginplay as the health was replaced, and had every bunny fill the Bunnycount int, kept it on a timer, and if Bunnycount&lt;MAXbunnies spawn a new one on a random pathnode every ten seconds. I suppose the same could be done for the crates, though keeping pickup types in an array or struct or the like, the point is, I kept the number of bunnies on the map static, do the same with the random crates, and you don't unbalance gameplay!

'''DJPaul:'''  Hmm.. karma 8s.</text>
    </revision>
    <revision>
      <id>4678</id>
      <timestamp>2003-04-03T16:25:13Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">CratePickups - the pickups are in crates!

==Description==

The gist is simple: all and any pickups (minus weapons) are replaced by crates.

The crates, when shot, release whatever it is that they replaced and - here's the best part - those little polyestrene 8s fall out too!

If a crate is destroyed '''outside''', same behaviour as normal, but a chance of a crate falling from the sky, squishing the player.

The 8s, if jumped on, or destroyed, turn into lil' particles of polyestrene, and they cause the player to slide a bit.

----

====Interested Scripters/Contributers ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

*  [[Legacy:Luggage|Luggage]]
*  [[Legacy:ZxAnPhOrIaN|ZxAnPhOrIaN]] - For the '8s'

----

==Discussion==

'''DJPaul:'''  What pickups could we replace with boxes? -&gt; Adrenaline, Ammo, etc.

Also, my brother came up with an idea that sounds somewhat similar to some Q3 mod i've vaguely heard of - spawning boxes throughout the entire level; each box is worth one point, and a frag 3.  There's a timelimit, and the person who gets the most points, wins!

'''ZxAnPhOrIaN:''' It will be cool if those 8's would desinegrate (did I spell that right?) when they fall into water, slime, and lava like biodegradable peanuts. After they desinegrate, they will leave a cloudy, slippery mess.

'''EntropicLqd:''' In outdoor areas, when a create is destroyed, it should leave behind a pickup that doesn't respawn.  Instead, a crate should randomly fall from the sky (hopefully dquashing a player :) ).  It could do with a &quot;random contents&quot; option that spawns objects in the same ratio as they were added to the level.  An option to have the crates spawn randomly around the level would also be nice.

'''DJPaul:'''  Not sure about that &quot;random contents&quot; option - the point of these things is to contain items (such as health).  Should the crates respawn after the power-up is collected, but the wreckage of the old one remain?

Thinking about it, if we did let them respawn, I suppose you COULD choose the crates to respawn randomly.

'''EntropicLqd:''' The objects will have to respawn anyway.  If the crates themselves don't respawn then it makes sense to keep the crate wreckage around for those objects that have these new fangled platforms to sit on - maybe remove it for those that don't.  If you want to respawn the crates then you would want to get rid of the wreckage to prevent a big pile of destroyed crates from killing framerate.  And if you respawn the crates then it's only a small step to having randomly respawning crates with vanishing wreckage.

'''ZxAnPhOrIaN:''' The wreckage should dissapear when a new box regenerates.

'''DJPaul:''' Yes, the box &quot;wood&quot; will disappear, but the 8s are staying.

'''ZxAnPhOrIaN:''' Shouldn't the 8s dissapear when they fall into slime, lava, water, or being shot at?

'''EntropicLqd:''' Wonder if you can get the 8s to be &quot;pushed aside&quot; when a player runs through them.  That would be really cool.  You could simluate wind and get drifts of 8s ..... (I'll get me coat).

'''ZxAnPhOrIaN:''' You probably could, but what would be really cool is that there would be a sound that sounds like walking though them, like walking through autumn leaves!

'''DJPaul:''' There is wind built into UT, so i'm *very* confident you could get things to &quot;fly&quot; in them.

'''ZxAnPhOrIaN:''' I will be willing to create the decoration for the 8s!

'''DJPaul:''' Add your name to the Interested Scripters/Contributers section then

'''DJPaul:''' ZxAnPhOrIaN - please email me at djpaul@djgenerationx.com

'''ZxAnPhOrIaN:''' The .t3d file? O_o BTW: call me Zxan for short! :P

'''Guest:''' Don't email me any files, just email me for chrisstakes... i've got something to discuss.

'''ZxAnPhOrIaN:''' Chrisstakes?

'''G-LiTe:''': Sounds like a cool idea. :) If you'd like some more complication, you can also set a minimum and maximum for the amount of crates and just have them respawn every few seconds up till the maximum. Just as soon as the amount of crates drops below the minimum it'll immediatly spawn one. &lt;br /&gt;Maybe you can also have some sort of effect on the disappearing of the wood, like a fade like decals or add some karma to it and have it slowly lift up like dead bodies do.

'''L0sT:'''Insofar as random spawning, back in the Amah: UT days I did a little mut that replaced all the health with exploding Nalibunnies, I kept a MAXbunnies global int that was filled in postbeginplay as the health was replaced, and had every bunny fill the Bunnycount int, kept it on a timer, and if Bunnycount&lt;MAXbunnies spawn a new one on a random pathnode every ten seconds. I suppose the same could be done for the crates, though keeping pickup types in an array or struct or the like, the point is, I kept the number of bunnies on the map static, do the same with the random crates, and you don't unbalance gameplay!

'''DJPaul:'''  Hmm.. karma 8s.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Creeper Runes</title>
    <id>1926</id>
    <revision>
      <id>4717</id>
      <timestamp>2005-01-14T03:18:26Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Creeper Runes}}

==Description ==

Think RealCTF's RealCreeper. or, Quake I's CreeperCTF.  20 odd different runes (relics for the UT in you) that grant the players various powers from vampire effects to becoming tottaly invisible while holding your melee weapon, to regenerating ammo of allies, not being reduced below 1 health when a teammate is present, and more. 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==</text>
    </revision>
    <revision>
      <id>4718</id>
      <timestamp>2005-01-13T23:28:24Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/CrossfireFootball</title>
    <id>1869</id>
    <revision>
      <id>4587</id>
      <timestamp>2006-06-24T14:39:13Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Crossfire Football}}

==About Crossfire Football ==

This game is played with up to 4 teams on a large flat (but not necessairly open) arena.  In the center of the arena a large fairly massive ball will be spawned.  All players will spawn with a single weapon that fires a small sphere.  The longer the fire button is held down the faster (or mabye more massive) the sphere will be.  These weapons should be used to &quot;steer&quot; the ball into other teams goals to score.  Needless to say, players a squashed by the ball.

I'm undecided as to whether to allow players to kill each other with their weapons - the game may just turn into a deathmatch then.  I'm also considering whether placing &quot;ammo top up&quot; points near the team's goal mouth is sensible so players have to re-arm themselves rather than having unlimited ammution.

==Discussion ==

'''ZxAnPhOrIaN:''' Neat gametype! When you shoot someone with the balls, you and the person that you shot, will go back to where you respawn.

'''m.r.bob''' havent you heard of CarBall

'''Sabbathcat''' Sounds cool, especially big ball guns. Maybe alternate weapons, like an amped up sheild gun would be cool, where you could repel the ball if you were about to be squished, or place more acurate hits on the ball to create spin/backspin and do some curve shots (if it's possible with Karma).  Car ball is fun, but something about getting up close and personal on foot sounds less linear. :D</text>
    </revision>
    <revision>
      <id>4588</id>
      <timestamp>2004-09-18T22:44:37Z</timestamp>
      <contributor>
        <ip>SabbathCat</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Crossfire Football}}

==About Crossfire Football ==

This game is played with up to 4 teams on a large flat (but not necessairly open) arena.  In the center of the arena a large fairly massive ball will be spawned.  All players will spawn with a single weapon that fires a small sphere.  The longer the fire button is held down the faster (or mabye more massive) the sphere will be.  These weapons should be used to &quot;steer&quot; the ball into other teams goals to score.  Needless to say, players a squashed by the ball.

I'm undecided as to whether to allow players to kill each other with their weapons - the game may just turn into a deathmatch then.  I'm also considering whether placing &quot;ammo top up&quot; points near the team's goal mouth is sensible so players have to re-arm themselves rather than having unlimited ammution.

==Discussion ==

'''ZxAnPhOrIaN:''' Neat gametype! When you shoot someone with the balls, you and the person that you shot, will go back to where you respawn.

'''m.r.bob''' havent you heard of CarBall

'''Sabbathcat''' Sounds cool, especially big ball guns. Maybe alternate weapons, like an amped up sheild gun would be cool, where you could repel the ball if you were about to be squished, or place more acurate hits on the ball to create spin/backspin and do some curve shots (if it's possible with Karma).  Car ball is fun, but something about getting up close and personal on foot sounds less linear. :D</text>
    </revision>
    <revision>
      <id>4589</id>
      <timestamp>2006-06-23T16:22:36Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>delete</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Crossfire Football}}

==About Crossfire Football ==

This game is played with up to 4 teams on a large flat (but not necessairly open) arena.  In the center of the arena a large fairly massive ball will be spawned.  All players will spawn with a single weapon that fires a small sphere.  The longer the fire button is held down the faster (or mabye more massive) the sphere will be.  These weapons should be used to &quot;steer&quot; the ball into other teams goals to score.  Needless to say, players a squashed by the ball.

I'm undecided as to whether to allow players to kill each other with their weapons - the game may just turn into a deathmatch then.  I'm also considering whether placing &quot;ammo top up&quot; points near the team's goal mouth is sensible so players have to re-arm themselves rather than having unlimited ammution.

==Discussion ==

'''ZxAnPhOrIaN:''' Neat gametype! When you shoot someone with the balls, you and the person that you shot, will go back to where you respawn.

'''m.r.bob''' havent you heard of CarBall

'''Sabbathcat''' Sounds cool, especially big ball guns. Maybe alternate weapons, like an amped up sheild gun would be cool, where you could repel the ball if you were about to be squished, or place more acurate hits on the ball to create spin/backspin and do some curve shots (if it's possible with Karma).  Car ball is fun, but something about getting up close and personal on foot sounds less linear. :D
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Cyberwars</title>
    <id>1930</id>
    <revision>
      <id>4727</id>
      <timestamp>2003-06-28T16:01:54Z</timestamp>
      <contributor>
        <ip>PD9E4EE2B.dip.t-dialin.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Cyberwars}}

==Description ==

Ok, the concept may sound a bit shallow, but a complex mod could be built around the core concept. The main idea, however, is simple: Cyborgs with many different enhancements and weapons fight and find out who has the best setup.

I was thinking of an enhancement system where every player has a basic body with many 'slots' which can be filled with equipment. Some of this would be obligatory, like a power source, motors to move the limbs etc. but many would be optional, like you could trade a hand for a big implemented gun, use free slots to increase stability or stoe ammo... the possibilities are endless.

===Notes ===

The idea is inspired by Battle Angel Alita and ONI. I liked the game pretty much despite some flaws. I especially liked the combination of ranged and close combat. I liked the aiming system and the decidedly non-spammy weapons too.

I immediately thought how I'd love a mp game like this where I can shoot my opponents or kick their butt on close range.

I kinda thought of a combination of ONI and DeusEx.

===Features ===

====The Feature Categories ====

* '''The Chassis:'''&lt;br /&gt;Every Cyborg needs a basic chassis to attach the individual components. There are chassis of different stability and size. The chassis can have various properties such as size and possibly affect strength and agility of the Cyborg.
* '''Cyber Enhancements:'''&lt;br /&gt;What the mod is all about. The Enhancements can be anything that you can imagine. Weapons, tools, modifications of attributes like strenght, speed and jumping height.
* '''Armour:'''&lt;br /&gt;The idea to regard armour as its own category may be fancy, but I figured it IS pretty relevant, and armour can do so much more than just absorb some damage. Special armour types can protect against special damage or do something entirely different. I also had the idea to allow 3 (a number I found convenient) armour layers.
* '''Skills:'''&lt;br /&gt;The mark of the RPG. How good a player can do what. A skill can give a player a unique ability, or just make something easier or faster.
* '''Martial Arts:'''&lt;br /&gt;Technically skills, I found these worth of a special category, as they could be equal to weapons.
* '''Weapons:'''&lt;br /&gt;I'd almost forget. Not everyone prefers killing with bare hands.

====The Basic Setups ====

I thought it would be a good idea to give players a kind of basic selection, kinda like the classes in most RPGs. But these aren't strictly seperate classes, only different basic setups. Also, these basics setups aren't weak like in many RPGs, they are perfectly capable to put up a good fight with more advanced opponents. Which isn't saying they'd win.
* '''The Fighter:'''&lt;br /&gt;The fighter is the strongest starting configuarion, a heavy chassis with 2 medium layers of armour, armed with an automatic weapon.&lt;br /&gt;His fighting style is direct assault.
* '''The Ranger:'''&lt;br /&gt;The lightest of the standard setups has only a thin armour layer, but is equipped with a cyperoptic implant with integrated zoom. The Ranger's weapon is a rifle.&lt;br /&gt;The Ranger is a sharpshooter and relies on tactics to win. He will try to evade a direct confrontation, and ambush his opponent.
* '''The Scout:'''&lt;br /&gt;The Scout works as spy or assassin. His light chassis is protected by a medum armour, his strong motors allow not only fast movement but also hard attacks in close combat. His only weapon is a stunner, but he can easily kill with his hands of steel. The light absorbant layer over his armour allows the Scout to hide in shadowy corners.

====Feature List ====

* '''Enhancements:'''&lt;br /&gt;&amp;ndash; Artificial Muscles: to increase the strength of arms or legs&lt;br /&gt;&amp;ndash; Cyber Optic: basic system for using optical implants&lt;br /&gt;&amp;ndash; Auto Lock: locks in on enemies providing tergeting info, and can in combination with a smart gun make aiming a piece of cake&lt;br /&gt;&amp;ndash; Nightvision&lt;br /&gt;&amp;ndash; IR sight&lt;br /&gt;&amp;ndash; Radar&lt;br /&gt;&amp;ndash; Weapon Implant: a weapon can be implanted into the arm, making handling easier and with an automatical reload mechanism that can increase reload speed drastically&lt;br /&gt;&amp;ndash; Ammo Depot: ammo storage in the body&lt;br /&gt;&amp;ndash; Cloaking Device: a bulky attachment that consumes energy, more effective than camo skin&lt;br /&gt;&amp;ndash; Chassis Reinforcement: increases stability of the chassis&lt;br /&gt;&amp;ndash; Melee Weapon Implant: a special implant that adds effect to close combat, e.g. an inbuilt stunner that auto-activates when punching an opponent, or maybe just spiked knuckles.&lt;br /&gt;&amp;ndash; Hacking Tool

* '''Armour:'''&lt;br /&gt;&amp;ndash; Ballistic: Light, medium and heavy BA reduce most kinds of damage. BA is less effective against concussion damage, and in close combat.&lt;br /&gt;&amp;ndash; FlexPlast: This light armour is ineffective against bullets and other point attacks, but is absorbs concussion damage effectively and envelopes the chassis completly, protecting joints better which are weak spots in standard armour.&lt;br /&gt;&amp;ndash; EM Absorbant: This special armour absorbs EM radiation, protecting against microwave damage and making the cyborg invisible to radar. It's a favourite among Scouts and Rangers.&lt;br /&gt;&amp;ndash; HEAT: This insulating armour protects against heat damage from outside, but it also absorbs IR radiation, making the user practically invisible to IR sensors.&lt;br /&gt;&amp;ndash; Dynamic Camouflage Skin: A polymer layer with an integrated electronic network. The &quot;armour&quot; has sensors which can optically scan the surroundings and the polymer can change its colour to match this image. It's not perfect, but good enough on a distance, and the user is very hard to spot when the cyborg doesn't move. (Now you know why I wanted 3 layers. Enough for nearly perfect stealth, but not perfect stealth AND damage protection)

* '''Skills:'''&lt;br /&gt;&amp;ndash; Sharpshooter: This would increase weapon accuracy. W00t.&lt;br /&gt;&amp;ndash; Wired: You know how to break codes, hack into computer systems, open electronic locks. Of course you may need tools, but even more importantly, you know how to use them.&lt;br /&gt;&amp;ndash; Weapon Handling: You have years of experience using guns of all kinds. You can draw and reload faster than most. You are much less handicapped when using a gun you haven't specifically trained with than people who barely manage to use a single gun.&lt;br /&gt;&amp;ndash; Weapon Skills: Special training with a weapon. Most surprisingly, you cannot just pick up a weapon and use it like a pro. D'oh. Seriously, if you do not kno w a weapon, you may be able to handle it, but you will be slower and less accurate than someone who know how to use it.&lt;br /&gt;&amp;ndash; Stealth: The ability to move silently, appear unsuspicios, what you like.

* '''Martial Arts:'''&lt;br /&gt;I liked the special moves in ONI. I would like to see more of these, which can be done by introducing different combat styles. A base Brawling skill which affects damage and speed a little, and the arts for style.&lt;br /&gt;I am fascinated by the idea of an all-defensive style which relies on counter-attacks. It could be very powerful, but it would be rather ineffective against enemies uing ranged weapons. &lt;br /&gt;Like in ONI, martial arts techniques could include strikes, kicks, grips and throws. Different styles can specialize more or less.

* '''GameTypes:'''&lt;br /&gt;&amp;ndash; Mission: One or more cyborgs sent on a dangerous mission... kinda like in Syndicate maybe&lt;br /&gt;&amp;ndash; Deathmatch

===Interested Scriptors ===

==Discussion ==

'''Claw:''' This is not a complete list of course, just some starting ideas. This wasn't originally intended as a mod concept, just the sort of game I'l love to play.

----

'''ZxAnPhOrIaN:''' Uhh... You were talking about the skill sharpshooter, in the military, isn't Expert Marksman a higher rank than Sharpsooter??

'''Claw:''' Uhh... how do I know or care? You know what it is supposed to mean, that's all that matters. :rolleyes:

'''Foxpaw:''' This is a neat idea - I'd be interested to see how it turns out.</text>
    </revision>
    <revision>
      <id>4728</id>
      <timestamp>2002-10-26T10:09:42Z</timestamp>
      <contributor>
        <ip>Claw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Cyberwars}}

==Description ==

Ok, the concept may sound a bit shallow, but a complex mod could be built around the core concept. The main idea, however, is simple: Cyborgs with many different enhancements and weapons fight and find out who has the best setup.

I was thinking of an enhancement system where every player has a basic body with many 'slots' which can be filled with equipment. Some of this would be obligatory, like a power source, motors to move the limbs etc. but many would be optional, like you could trade a hand for a big implemented gun, use free slots to increase stability or stoe ammo... the possibilities are endless.

===Notes ===

The idea is inspired by Battle Angle Alita and ONI. I liked the game pretty much despite some flaws. I especially liked the combination of ranged and close combat. I liked the aiming system and the decidedly non-spammy weapons too.

I immediately thought how I'd love a mp game like this where I can shoot my opponents or kick their butt on close range.

I kinda thought of a combination of ONI and DeusEx.

===Features ===

====The Feature Categories ====

* '''The Chassis:'''&lt;br /&gt;Every Cyborg needs a basic chassis to attach the individual components. There are chassis of different stability and size. The chassis can have various properties such as size and possibly affect strength and agility of the Cyborg.
* '''Cyber Enhancements:'''&lt;br /&gt;What the mod is all about. The Enhancements can be anything that you can imagine. Weapons, tools, modifications of attributes like strenght, speed and jumping height.
* '''Armour:'''&lt;br /&gt;The idea to regard armour as its own category may be fancy, but I figured it IS pretty relevant, and armour can do so much more than just absorb some damage. Special armour types can protect against special damage or do something entirely different. I also had the idea to allow 3 (a number I found convenient) armour layers.
* '''Skills:'''&lt;br /&gt;The mark of the RPG. How good a player can do what. A skill can give a player a unique ability, or just make something easier or faster.
* '''Martial Arts:'''&lt;br /&gt;Technically skills, I found these worth of a special category, as they could be equal to weapons.
* '''Weapons:'''&lt;br /&gt;I'd almost forget. Not everyone prefers killing with bare hands.

====The Basic Setups ====

I thought it would be a good idea to give players a kind of basic selection, kinda like the classes in most RPGs. But these aren't strictly seperate classes, only different basic setups. Also, these basics setups aren't weak like in many RPGs, they are perfectly capable to put up a good fight with more advanced opponents. Which isn't saying they'd win.
* '''The Fighter:'''&lt;br /&gt;The fighter is the strongest starting configuarion, a heavy chassis with 2 medium layers of armour, armed with an automatic weapon.&lt;br /&gt;His fighting style is direct assault.
* '''The Ranger:'''&lt;br /&gt;The lightest of the standard setups has only a thin armour layer, but is equipped with a cyperoptic implant with integrated zoom. The Ranger's weapon is a rifle.&lt;br /&gt;The Ranger is a sharpshooter and relies on tactics to win. He will try to evade a direct confrontation, and ambush his opponent.
* '''The Scout:'''&lt;br /&gt;The Scout works as spy or assassin. His light chassis is protected by a medum armour, his strong motors allow not only fast movement but also hard attacks in close combat. His only weapon is a stunner, but he can easily kill with his hands of steel. The light absorbant layer over his armour allows the Scout to hide in shadowy corners.

====Feature List ====

* '''Enhancements:'''&lt;br /&gt;&amp;ndash; Artificial Muscles: to increase the strength of arms or legs&lt;br /&gt;&amp;ndash; Cyber Optic: basic system for using optical implants&lt;br /&gt;&amp;ndash; Auto Lock: locks in on enemies providing tergeting info, and can in combination with a smart gun make aiming a piece of cake&lt;br /&gt;&amp;ndash; Nightvision&lt;br /&gt;&amp;ndash; IR sight&lt;br /&gt;&amp;ndash; Radar&lt;br /&gt;&amp;ndash; Weapon Implant: a weapon can be implanted into the arm, making handling easier and with an automatical reload mechanism that can increase reload speed drastically&lt;br /&gt;&amp;ndash; Ammo Depot: ammo storage in the body&lt;br /&gt;&amp;ndash; Cloaking Device: a bulky attachment that consumes energy, more effective than camo skin&lt;br /&gt;&amp;ndash; Chassis Reinforcement: increases stability of the chassis&lt;br /&gt;&amp;ndash; Melee Weapon Implant: a special implant that adds effect to close combat, e.g. an inbuilt stunner that auto-activates when punching an opponent, or maybe just spiked knuckles.&lt;br /&gt;&amp;ndash; Hacking Tool

* '''Armour:'''&lt;br /&gt;&amp;ndash; Ballistic: Light, medium and heavy BA reduce most kinds of damage. BA is less effective against concussion damage, and in close combat.&lt;br /&gt;&amp;ndash; FlexPlast: This light armour is ineffective against bullets and other point attacks, but is absorbs concussion damage effectively and envelopes the chassis completly, protecting joints better which are weak spots in standard armour.&lt;br /&gt;&amp;ndash; EM Absorbant: This special armour absorbs EM radiation, protecting against microwave damage and making the cyborg invisible to radar. It's a favourite among Scouts and Rangers.&lt;br /&gt;&amp;ndash; HEAT: This insulating armour protects against heat damage from outside, but it also absorbs IR radiation, making the user pracitaclly invisible to IR sensors.&lt;br /&gt;&amp;ndash; Dynamic Camouflage Skin: A polymer layer with an integrated electronic network. The &quot;armour&quot; has sensors which can optically scan the surroundings and the polymer can change its colour to match this image. It's not perfect, but good enough on a distance, and the user is very hard to spot when the cyborg doesn't move. (Now you know why I wanted 3 layers. Enough for nearly perfect stealth, but not perfect stealth AND damage protection)

* '''Skills:'''&lt;br /&gt;&amp;ndash; Sharpshooter: This would increase weapon accuracy. W00t.&lt;br /&gt;&amp;ndash; Wired: You know how to break codes, hack into computer systems, open electronic locks. Of course you may need tools, but even more importantly, you know how to use them.&lt;br /&gt;&amp;ndash; Weapon Handling: You have years of experience using guns of all kinds. You can draw and reload faster than most. You are much less handicapped when using a gun you haven't specifically trained with than people who barely manage to use a single gun.&lt;br /&gt;&amp;ndash; Weapon Skills: Special training with a weapon. Most surprisingly, you cannot just pick up a weapon and use it like a pro. D'oh. Seriously, if you do not kno w a weapon, you may be able to handle it, but you will be slower and less accurate than someone who know how to use it.&lt;br /&gt;&amp;ndash; Stealth: The ability to move silently, appear unsuspicios, what you like.

* '''Martial Arts:'''&lt;br /&gt;I liked the special moves in ONI. I would like to see more of these, which can be done by introducing different combat styles. A base Brawling skill which affects damage and speed a little, and the arts for style.&lt;br /&gt;I am fascinated by the idea of an all-defensive style which relies on counter-attacks. It could be very powerful, but it would be rather ineffective against enemies uing ranged weapons. &lt;br /&gt;Like in ONI, martial arts techniques could include strikes, kicks, grips and throws. Different styles can specialize more or less.

* '''GameTypes:'''&lt;br /&gt;&amp;ndash; Mission: One or more cyborgs sent on a dangerous mission... kinda like in Syndicate maybe&lt;br /&gt;&amp;ndash; Deathmatch

===Interested Scriptors ===

==Discussion ==

'''Claw:''' This is not a complete list of course, just some starting ideas. This wasn't originally intended as a mod concept, just the sort of game I'l love to play.

----

'''ZxAnPhOrIaN:''' Uhh... You were talking about the skill sharpshooter, in the military, isn't Expert Marksman a higher rank than Sharpsooter??

'''Claw:''' Uhh... how do I know or care? You know what it is supposed to mean, that's all that matters. :rolleyes:</text>
    </revision>
    <revision>
      <id>4729</id>
      <timestamp>2003-05-12T05:44:43Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Cyberwars}}

==Description ==

Ok, the concept may sound a bit shallow, but a complex mod could be built around the core concept. The main idea, however, is simple: Cyborgs with many different enhancements and weapons fight and find out who has the best setup.

I was thinking of an enhancement system where every player has a basic body with many 'slots' which can be filled with equipment. Some of this would be obligatory, like a power source, motors to move the limbs etc. but many would be optional, like you could trade a hand for a big implemented gun, use free slots to increase stability or stoe ammo... the possibilities are endless.

===Notes ===

The idea is inspired by Battle Angle Alita and ONI. I liked the game pretty much despite some flaws. I especially liked the combination of ranged and close combat. I liked the aiming system and the decidedly non-spammy weapons too.

I immediately thought how I'd love a mp game like this where I can shoot my opponents or kick their butt on close range.

I kinda thought of a combination of ONI and DeusEx.

===Features ===

====The Feature Categories ====

* '''The Chassis:'''&lt;br /&gt;Every Cyborg needs a basic chassis to attach the individual components. There are chassis of different stability and size. The chassis can have various properties such as size and possibly affect strength and agility of the Cyborg.
* '''Cyber Enhancements:'''&lt;br /&gt;What the mod is all about. The Enhancements can be anything that you can imagine. Weapons, tools, modifications of attributes like strenght, speed and jumping height.
* '''Armour:'''&lt;br /&gt;The idea to regard armour as its own category may be fancy, but I figured it IS pretty relevant, and armour can do so much more than just absorb some damage. Special armour types can protect against special damage or do something entirely different. I also had the idea to allow 3 (a number I found convenient) armour layers.
* '''Skills:'''&lt;br /&gt;The mark of the RPG. How good a player can do what. A skill can give a player a unique ability, or just make something easier or faster.
* '''Martial Arts:'''&lt;br /&gt;Technically skills, I found these worth of a special category, as they could be equal to weapons.
* '''Weapons:'''&lt;br /&gt;I'd almost forget. Not everyone prefers killing with bare hands.

====The Basic Setups ====

I thought it would be a good idea to give players a kind of basic selection, kinda like the classes in most RPGs. But these aren't strictly seperate classes, only different basic setups. Also, these basics setups aren't weak like in many RPGs, they are perfectly capable to put up a good fight with more advanced opponents. Which isn't saying they'd win.
* '''The Fighter:'''&lt;br /&gt;The fighter is the strongest starting configuarion, a heavy chassis with 2 medium layers of armour, armed with an automatic weapon.&lt;br /&gt;His fighting style is direct assault.
* '''The Ranger:'''&lt;br /&gt;The lightest of the standard setups has only a thin armour layer, but is equipped with a cyperoptic implant with integrated zoom. The Ranger's weapon is a rifle.&lt;br /&gt;The Ranger is a sharpshooter and relies on tactics to win. He will try to evade a direct confrontation, and ambush his opponent.
* '''The Scout:'''&lt;br /&gt;The Scout works as spy or assassin. His light chassis is protected by a medum armour, his strong motors allow not only fast movement but also hard attacks in close combat. His only weapon is a stunner, but he can easily kill with his hands of steel. The light absorbant layer over his armour allows the Scout to hide in shadowy corners.

====Feature List ====

* '''Enhancements:'''&lt;br /&gt;&amp;ndash; Artificial Muscles: to increase the strength of arms or legs&lt;br /&gt;&amp;ndash; Cyber Optic: basic system for using optical implants&lt;br /&gt;&amp;ndash; Auto Lock: locks in on enemies providing tergeting info, and can in combination with a smart gun make aiming a piece of cake&lt;br /&gt;&amp;ndash; Nightvision&lt;br /&gt;&amp;ndash; IR sight&lt;br /&gt;&amp;ndash; Radar&lt;br /&gt;&amp;ndash; Weapon Implant: a weapon can be implanted into the arm, making handling easier and with an automatical reload mechanism that can increase reload speed drastically&lt;br /&gt;&amp;ndash; Ammo Depot: ammo storage in the body&lt;br /&gt;&amp;ndash; Cloaking Device: a bulky attachment that consumes energy, more effective than camo skin&lt;br /&gt;&amp;ndash; Chassis Reinforcement: increases stability of the chassis&lt;br /&gt;&amp;ndash; Melee Weapon Implant: a special implant that adds effect to close combat, e.g. an inbuilt stunner that auto-activates when punching an opponent, or maybe just spiked knuckles.&lt;br /&gt;&amp;ndash; Hacking Tool

* '''Armour:'''&lt;br /&gt;&amp;ndash; Ballistic: Light, medium and heavy BA reduce most kinds of damage. BA is less effective against concussion damage, and in close combat.&lt;br /&gt;&amp;ndash; FlexPlast: This light armour is ineffective against bullets and other point attacks, but is absorbs concussion damage effectively and envelopes the chassis completly, protecting joints better which are weak spots in standard armour.&lt;br /&gt;&amp;ndash; EM Absorbant: This special armour absorbs EM radiation, protecting against microwave damage and making the cyborg invisible to radar. It's a favourite among Scouts and Rangers.&lt;br /&gt;&amp;ndash; HEAT: This insulating armour protects against heat damage from outside, but it also absorbs IR radiation, making the user pracitaclly invisible to IR sensors.&lt;br /&gt;&amp;ndash; Dynamic Camouflage Skin: A polymer layer with an integrated electronic network. The &quot;armour&quot; has sensors which can optically scan the surroundings and the polymer can change its colour to match this image. It's not perfect, but good enough on a distance, and the user is very hard to spot when the cyborg doesn't move. (Now you know why I wanted 3 layers. Enough for nearly perfect stealth, but not perfect stealth AND damage protection)

* '''Skills:'''&lt;br /&gt;&amp;ndash; Sharpshooter: This would increase weapon accuracy. W00t.&lt;br /&gt;&amp;ndash; Wired: You know how to break codes, hack into computer systems, open electronic locks. Of course you may need tools, but even more importantly, you know how to use them.&lt;br /&gt;&amp;ndash; Weapon Handling: You have years of experience using guns of all kinds. You can draw and reload faster than most. You are much less handicapped when using a gun you haven't specifically trained with than people who barely manage to use a single gun.&lt;br /&gt;&amp;ndash; Weapon Skills: Special training with a weapon. Most surprisingly, you cannot just pick up a weapon and use it like a pro. D'oh. Seriously, if you do not kno w a weapon, you may be able to handle it, but you will be slower and less accurate than someone who know how to use it.&lt;br /&gt;&amp;ndash; Stealth: The ability to move silently, appear unsuspicios, what you like.

* '''Martial Arts:'''&lt;br /&gt;I liked the special moves in ONI. I would like to see more of these, which can be done by introducing different combat styles. A base Brawling skill which affects damage and speed a little, and the arts for style.&lt;br /&gt;I am fascinated by the idea of an all-defensive style which relies on counter-attacks. It could be very powerful, but it would be rather ineffective against enemies uing ranged weapons. &lt;br /&gt;Like in ONI, martial arts techniques could include strikes, kicks, grips and throws. Different styles can specialize more or less.

* '''GameTypes:'''&lt;br /&gt;&amp;ndash; Mission: One or more cyborgs sent on a dangerous mission... kinda like in Syndicate maybe&lt;br /&gt;&amp;ndash; Deathmatch

===Interested Scriptors ===

==Discussion ==

'''Claw:''' This is not a complete list of course, just some starting ideas. This wasn't originally intended as a mod concept, just the sort of game I'l love to play.

----

'''ZxAnPhOrIaN:''' Uhh... You were talking about the skill sharpshooter, in the military, isn't Expert Marksman a higher rank than Sharpsooter??

'''Claw:''' Uhh... how do I know or care? You know what it is supposed to mean, that's all that matters. :rolleyes:

'''Foxpaw:''' This is a neat idea - I'd be interested to see how it turns out.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/DaiymoDefense</title>
    <id>2002</id>
    <revision>
      <id>4894</id>
      <timestamp>2005-08-08T22:51:53Z</timestamp>
      <contributor>
        <ip>Lulolwen</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod idea for UT 2004 &amp;ndash; A VIP Defense Scenario Set to the Backdrop of Tokugawa Era Feudal Japan.}}

==Description ==

====Initiator ====

This mod is based on an idea by Araes.

====Concept ====

The basic idea of this mod is very similar in core application to the VIP defense scenario found in CS.  One team of players will represent Samurai loyal to a particular Daimyo.  Their task will be to defend this individual, represented by a chosen or voted player, from the assault of hired assassins (see Ninja), who are attempting to kill him.

====Teams ====

The two sides in this conflict would be fairly varied, with the Samurai being high health, very strong melee fighters, while the Ninja group would exemplify stealth, high damage single shot attacks, and high manuverability.  Interesting concepts which could be incorporated into their design would be things like the mutator for smoke bombs, spider climbing if it can be done, and maybe triangle jumping.

====Equipment ====

Samurai would most likely be equiped with the standard armament of Katana and Wakazashi, as well as Naginatas, Nagamakis, and Sasumatas (mancatchers) for special applications.  In certain scenarios they might also have access to bows and mounts like warhorses.  All Samurai would have the option for heavy armor.

Ninja armament would be composed of blow guns, bows, shurkiens, smoke bombs, Ninja-Tos, Kawanagas (Entangling grapples), and Nekode (climbing claws).  Possibly Kau-sin-kes (multi-part rods), caltrops, flashpowder, and Kusari-gamas for special applications.  All depends on how many features are wanted and balance issues.  Armor loadout would be quite light or non-existant for Ninja group.

====Map Ideas ====

Potential maps concepts would be things like:

Castle Escape

Convoy Ambush

Diplomatic Backstab

Turncoat Assassin (One samurai secretly an assassin)

Cooperative or Competetive Assassination against AI.  (Kind of like mass Tenchu game)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Foxpaw:''' Hmm, an interesting idea, but maybe you could change ninjas to bandits or something? Simple reason being, ninjas didn't snipe people and stuff like that, they snuck into your house and killed you in your sleep. And real ninjas (fairly rare these days, admittedly) get their panties in a bunch when people portray them as warriors of any description.

'''Araes:''' Maybe just assassins then, although I'm not sure whether any real ninjas probably pay attention to the Unreal community.  The image I was aiming for was simply that glamorized version of them put forth by anime and several other segments of the Japanese entertainment industry.  However, its pretty much up to whoever would want to make this.

'''Uncommon:''' Is it Daiymo or Daimyo?

'''Araes:''' Dictionary.com says that you are actually right and its Daimyo.

'''Paradox:''' I'd love to do this mod. If only I knew how... Anyone want to help me get started or pointed in the right direction? At this point, I've only followed a tutorial or two to get a weapon mod working. For example, how would one implement a sword?  Would be super-cool if it could include actual kenjutsu techniques, though that seems like it might be asking a bit much; especially from a beginner like me.

'''Lulolwen:''' Paradox, if you need weapon models, I've been working on an Oriental weapon set for a while now and have a few thrown together. No textures as of yet though.</text>
    </revision>
    <revision>
      <id>4895</id>
      <timestamp>2004-05-20T17:06:28Z</timestamp>
      <contributor>
        <ip>Paradox</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod idea for UT 2004 &amp;ndash; A VIP Defense Scenario Set to the Backdrop of Tokugawa Era Feudal Japan.}}

==Description ==

====Initiator ====

This mod is based on an idea by Araes.

====Concept ====

The basic idea of this mod is very similar in core application to the VIP defense scenario found in CS.  One team of players will represent Samurai loyal to a particular Daimyo.  Their task will be to defend this individual, represented by a chosen or voted player, from the assault of hired assassins (see Ninja), who are attempting to kill him.

====Teams ====

The two sides in this conflict would be fairly varied, with the Samurai being high health, very strong melee fighters, while the Ninja group would exemplify stealth, high damage single shot attacks, and high manuverability.  Interesting concepts which could be incorporated into their design would be things like the mutator for smoke bombs, spider climbing if it can be done, and maybe triangle jumping.

====Equipment ====

Samurai would most likely be equiped with the standard armament of Katana and Wakazashi, as well as Naginatas, Nagamakis, and Sasumatas (mancatchers) for special applications.  In certain scenarios they might also have access to bows and mounts like warhorses.  All Samurai would have the option for heavy armor.

Ninja armament would be composed of blow guns, bows, shurkiens, smoke bombs, Ninja-Tos, Kawanagas (Entangling grapples), and Nekode (climbing claws).  Possibly Kau-sin-kes (multi-part rods), caltrops, flashpowder, and Kusari-gamas for special applications.  All depends on how many features are wanted and balance issues.  Armor loadout would be quite light or non-existant for Ninja group.

====Map Ideas ====

Potential maps concepts would be things like:

Castle Escape

Convoy Ambush

Diplomatic Backstab

Turncoat Assassin (One samurai secretly an assassin)

Cooperative or Competetive Assassination against AI.  (Kind of like mass Tenchu game)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Foxpaw:''' Hmm, an interesting idea, but maybe you could change ninjas to bandits or something? Simple reason being, ninjas didn't snipe people and stuff like that, they snuck into your house and killed you in your sleep. And real ninjas (fairly rare these days, admittedly) get their panties in a bunch when people portray them as warriors of any description.

'''Araes:''' Maybe just assassins then, although I'm not sure whether any real ninjas probably pay attention to the Unreal community.  The image I was aiming for was simply that glamorized version of them put forth by anime and several other segments of the Japanese entertainment industry.  However, its pretty much up to whoever would want to make this.

'''Uncommon:''' Is it Daiymo or Daimyo?

'''Araes:''' Dictionary.com says that you are actually right and its Daimyo.

'''Paradox:''' I'd love to do this mod. If only I knew how... Anyone want to help me get started or pointed in the right direction? At this point, I've only followed a tutorial or two to get a weapon mod working. For example, how would one implement a sword?  Would be super-cool if it could include actual kenjutsu techniques, though that seems like it might be asking a bit much; especially from a beginner like me.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Dark Match</title>
    <id>1870</id>
    <revision>
      <id>4590</id>
      <timestamp>2006-01-25T22:50:02Z</timestamp>
      <contributor>
        <ip>DaWrecka</ip>
      </contributor>
      <comment>* Added comments only.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Darkmatch Tribute - because it rocks}}

==Description ==

Eavy's Darkmatch 3 is probably one of my favourite mods for UT.  Assuming Eavy doesn't beat me to it and ship a darkmatch mutator with UT2003, I'll write one.  It turns out the lights and gives every player a torch.  The following applies:
* The brightness of the torch is configurable.
* The radius of the torch light is configurable.
* An option can be enabled that will make players glow with their team colour.

I realise that I've removed the &quot;turn torch on/off&quot; options from the original but I never saw the point in it, and certainly when we tried it found that it made no difference to the game - in fact, it made it less exciting.

====Links ====

[http://mimesis.csc.ncsu.edu/ClassReference/UnrealI.DarkMatch.html the original DarkMatch code]

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; Oh yeah, Darkmatch rocks but too much will fritz your eyes.
* [[Legacy:AlphaOne|AlphaOne]] &amp;ndash; I wonder how 1337 will it be to play DarkMatch at night, in a dark room, with Surround sound!?

==Discussion ==

'''AlphaOne:''' Can anyone get the original code from UT?

Also, Is it better to have a mutator for darkmatch or a separate game type, or both?

Is it possible to use the fog (black in colour) in the game to speed up the rendering of invisible things?

By looking at the code it can be seen that the lights in the levels must have been turned OFF in the UED.

I want to add one more thing to this game type: Reduce the visibility of bots, or to make them see only very close to themselves. To simulate the darkness effect.

'''Wormbo:''' Black fog != no light. But a Fog Match would be interesting, too... ;)  For the code just download Eavy DarkMatch. The basic idea behind it was this little loop:

&lt;uscript&gt;
	ForEach AllActors(class'Engine.Light', L)
		L.LightType = LT_None;
&lt;/uscript&gt;

'''EntropicLqd:''' lol - Yeah - but he did have some other handling for sky boxes and stuff.  Hmmmm, a fog match.  That might be pretty weird.  Configurable min/max distances set across all the zones.  Should be easy.  It's better if you make the DarkMatch mod a mutator.  That way it can be used with all of the game types.  Are you likely to write this in the next couple of weeks?  My Mayhem mod has got a bit bogged down and I need to take a break from it.

'''AlphaOne:''' ''(to EntropicLqd)'' Ya, I'll start working on it, now that I have my Christmas break. I don't quite get what you mean by the last sentence you wrote.

BTW: I could not get the code of Eavy DarkMatch, UED crashed when I tried loading the package. It would be great if you could post the code on this page.

I was thinking about changing the visibility of the player to bots. There could be two ways to do it: reduce bots SightRadius (more like the fog effect), or make the player less noticable to bots based on the amount of light the carry (like Eavy DarkMatch)

One last thing: Why did Epic release the new .UC and debug .U files? Could ppl. get thouse by just exporting the scripts?

'''Mychaeel:''' The source code exporter is broken (doesn't properly export private objects in property defaults).  Recompiling the engine packages in debug mode is outright impossible (or at least very, very impractical).

'''AlphaOne:''' IC - starting to download it...

'''AlphaOne:''' Anyways, what's the best way to deal with bots?

'''EntropicLqd:''' RE: My last sentence - I'm working on a mod that (for the time being at least) has ground to a bit of a halt while I make a couple of decisions.  Rather than have it bug me I'll make the decision while working on something else, that's a bit smaller.  Darkmatch was at the top of the list :).  If you want the Eavy Darkmatch code then you can grab the UT mutator from the maps n mods section of http://www.snout-clan.co.uk, install it, and then export it.  Failing that, drop me an e-mail and I'll pass it on.
: In terms of bots the original darkmatch doesn't bother doing anything with them - which isn't so bad since they never turn their lights out.  However, I was considering tweaking the AI to effectively reduce their sight FOV (but still allow them to hear players).

'''AlphaOne:''' the http://www.snout-clan.co.uk/ doesn't have the mod any more (broken link). I don't like the idea of turning off the lights because it makes it toooooo easy to cheat (like invisibility).

If you want to code DarkMatch then go ahead. I'm not going to compete with you or anything.

'''EntropicLqd:''' Right then .. I've put the mod back on the site - dunno why it went away but thanks for letting me know it was broken :).  It's worth pulling down and playing with.  If you are sure you don't want to do it then I'll pick it up, but you have first shout.  I'm not short of small mod ideas.  Your call.  And you could always disable the adrenaline moves you know.

'''AlphaOne:''' OK. I'll work on the mod. If I get really stuck then I'll ask you (or anyone else) for help. (BTW: what do adrenaline moves have to do with anything?)

'''EntropicLqd:''' Invisibility is an Adrenaline move - disable adrenaline, disable invisibility.  You inferred above that going invisible in a darkmatch was ''cheating''.  It would give you a hell of an advantage for sure.  Don't worry about it - I won't :)

'''AlphaOne:''' I just ran into a problem: When I set the LightType to none, only the (indicated by green lines in RMODE 1) static meshes become black. The lightmaps are still visible on the BSP brushes (indicated by white lines in RMODE 1).

'''EntropicLqd:''' Hmmm.  Sounds icky.  I've been playing aroud with the &quot;Fog Match&quot; idea proposed by Wormbo and I have similar problems.  Antalus looks pap because the meshes suddenly appear and the sky is always visible (it seems to be more of an occlusion problem.  Asbestos looks OK.  I'll have a think about your problem though - One presumes that the lightmaps are properties of the brush - if they are not declared as constant you might be able to null them out.

'''EntropicLqd:''' Well, I've sorted my problem - just had to increase the amount of fog in the skyzone until the sky is simply occluded by the fog.  Works well.  Antalus now looks cool.  Just need to sort out the bots now - sigh.

'''AlphaOne:''' For bots, just change their SightRadius to make it equal to the fog end distance (where clipping happens). I spent an hour looking for this variable and found it in the Bot class.

I also looked for lightmap variables in brushes, but could not find much. For some reason UnDox skips a lot of vars!??

OH, and btw, include the option to change the colour and the distance of the fog!

'''EntropicLqd:''' Would it be part of the materials section?  I dunno - not looked at it at all.  Options to change the colour, min fog distance, max fog distance are already in there (no config screen yet though).  Might also be worth tweaking the AI such that at distances close to the max fog distance it's slightly random as to whether they see you or not.

'''Wormbo:''' I noticed this skyzone fog problem when I experimented with distance fog and the &quot;set&quot; command on DM-Antalus a while back. I guess the skyzone needs the same fog color as the other zones and a minimal fog distance to look good.
: '''EntropicLqd:''' Indeed - I set the fog start distance to 0 and the fog distance to 32 in all sky zones.  It solves the problem beautifully.  Asbestos really rocks with loads of fog.  Anyways - I'm on holiday now so I'm in a non-UT2003 environment, but I'll finish the mutator off when I get back off holiday.  Might be worth setting up a &quot;mutator pack project&quot; (although project is possibly far to grand a word for it) for &quot;environment&quot; type mutators.  Fog match, Dark match, and any others we come up with (no falling damage, high gravity, .... ).

'''ZxAnPhOrIaN:''' I thought that bFogZone couldn't change during gameplay, cause it is a constant? (or maybe im thinking about the original UT)
:'''Wormbo:''' bFogZone != bDistanceFog :P All the distance fog related variables can be changed from UnrealScript, while bFogZone enables volumetric lighting in the zone.

'''ZxAnPhOrIaN:''' So bFogZone and bDistanceFog are diffrent, RIGHT!!!

'''ZxAnPhOrIaN:''' Like wormbo said above, &quot;Black fog != no light.&quot;, look at DM-Plunge for example, it uses black fog!

----

'''ZxAnPhOrIaN:'''  This mod should have darkness and fogness :) incorperated into it, namechange, maybe?

'''EntropicLqd:'''  2 years ago I would have agreed.  However, I've come to the conclusion that it's better to have many atomic mutators than one monster one.  Configuration for the &quot;dumb user&quot; becomes less of an issue that way.

----

'''AlphaOne:''' I like the idea of darkess+fogness. However, I still cannot find a way to &quot;turn off&quot; all the lights!

'''Tahngarth:''' fogmatch- that sounds fun :) just set the fog so that you can barely see 5 feet in front of you :P

'''AlphaOne:''' I tried the fogmatch myself. It is no fun with bots.

'''ZxAnPhOrIaN:''' Why? Can the bots see though the fog? Is it like you cant see him, but he can see you, type of situation?

'''AlphaOne:''' Yep. They can see me throught fog. They even snipe me sometimes out of nowhere. I tried lowering the bot's SightRadius. As a result I had to go around the map and LOOK for bots because they didn't see me.

'''ZxAnPhOrIaN:''' LOL, make the fog so dense that you cant see a foot away from you and make a bot snipe you from a mile away!!!

----

'''EntropicLqd:''' Right, I've finished my FogMatch mutator - I've given up trying to get the bots to work right with it :(.  How's the DarkMatch mutator coming on?  Still got that light-map problem?

'''AlphaOne:''' Yep. I kind of abandoned the DarkMatch idea for now. Maybe you could give it a try?

'''EntropicLqd:''' Yeah - love to.  Would it be worth me taking on any code you've written already?  If you think it would be then e-mail it to me on entropic@snout-clan.co.uk.  If I don't hear anything in the next 2-4 days I'll start from scratch anyways.  Cheers.

'''Tarquin:''' hasn't this neem made? I got a huge pack of mutators from BU last week that had something with dark. not tested it tho. the xxxpak it's called

'''Wormbo:''' Yup, RegularX put a &quot;Night Watch&quot; mutator in his [http://inkless.com/xpak.html XXXPak]. (actually a combination of his previous XPak 1, 2 &amp; 3 mutator packs) I don't know about bot support, though.

'''Tarquin:''' NightWatch is not very good. Try it on DM-Antalus. Areas of terrain are too bright, and you don't feel like you're using a torch. There's NightVision in the same pack. Way too dark. I don't thie bots are affected by either.

'''EntropicLqd:''' Having the bots affected by darkness (or in my case fog) is a right bugger.  I still haven't worked out how to do it.  Every now and then I have a trawl through the code to see if I can find it but so far I've drawn a complete blank.  I have a couple of theories but none of them are particularly palatable (ie. damn hard to code around).  I've mailed DrSin to see if he can pass on the query to Steve Polge but not had anything back yet.  I'll have to check out the XXX mutator pack though.

'''Tarquin:''' How does fog affect bots?

'''Wormbo:''' They aren't affected at all, that's the problem.

'''EntropicLqd:''' Tarquin - check out the [[Legacy:Help Desk|Help Desk]] page.  I have an outstanding problem on there all about it.  It's a right teaser.

'''EntropicLqd''' I checked out Nightwatch .. I have exactly the same problem on Antalus.  I need to know how terrain works - and where the texture proerties come from.  I'm happy with the way my objects appear, I've got rid of all projectors (and possibly light maps), but the terrain .... arrrgh.  I guess it may not be possible to do a &quot;darkmatch&quot; in outside maps in UT2003 simply because of the way the engine works.  There's also some other funnies on Antalus - but I suspect it's where the lighting has been forced into the texture itself - and I really need to change the surface properties of the faces.  No chance of that in UScript.

'''RegularX:''' NightWatch appeared to be doomed on two fronts: 1) online at either the mutator or gametype level the changes to the lights didn't appear to replicate.  2) Certain lighting features (like on Antalus) didn't seem to be found no matter how many different things I tried to Zones, etc.  NightVision was meant to be it's simpler, more net friendly replacement since it basically is just a HUD interaction - but I didn't have time to put in all the options to customize it/special effects in before releasing for Xmas, hence the being stuck with the dreary blue.  And there is no bot support for either one - and in Nightwatch I didn't have time to adjust the Bot's view to line up the &quot;torch&quot;.

'''Foxpaw:''' I haven't seen the code you are using but I think that the problem you may be having with lights not being squelched may be related to the fact that an object does not have to be a &quot;light&quot; to light up. Any kind of actor can be lit as far as I know. Those leftover lights may be other actors set to have a light. Replication is indeed tricky, I had an idea but it isn't compatible with my idea on squelching non-&quot;light&quot; lights. To replicate the changes in lights I would recommend subclassing light and using the mutator to replace all instances of light with your altered light class. Once you have your own light class you should be able to replicate a variable to indicate the light's status, something like the Redeemer in UT. (How it replicates a copy of Location and Rotation, then applies it server-side. I think it's server-side. I didn't actually read that too thoroughly.) I also had an idea for bots but it's not the best programming style - you might be able to have an &quot;item&quot; attached to all players, which would be considered a desirable pickup for bots, it's desirability waning as the player went out of view. I don't know if that would work or not but it might help the bots find the players and each other if their sightradius is reduced.

'''EntropicLqd:''' As far as I could tell I managed to get the replication working OK.  The problem with the lights isn't with &quot;non-light&quot; light producing actors as such.  There seem to be light map areas explicitly coded into the level, and you can't get a reference to them.  Antalus is an excellent example of this.  The outside area cannot be made dark as far as I can tell.

'''AlphaOne:''' What if you project a BLACK texture on ALL surfaces in the level?

'''Mysterial:''' EntropicLqd: If you mean ambient light, you can find and presumably alter that in the LevelInfo.

'''EntropicLqd:''' ''AlphaOne:'' An interesting idea.  I'm confident it wouldn't work as the light's I have left don't seem to be sourced from projectors - they are coming from somewhere else (possibly baked right into the texture).  The other problem with projecting a black texture over everything is that you'd never know where you were - the flashlight at least gives you the possibility of recognising where you are from the wall, floor, and ceiling textures.
:''Mysterial:'' The ambient light was easy to kill.  You have to turn it off on a zone by zone basis though.
: I've come to the conclusion that the only way to do this would be to create levels that are dark all over.  Much like the original DarkMatch idea in Unreal.  Which is a shame.  I'll post a URL to the code that I've written once I've got it uploaded so that other people can have a look at it.

'''Mysterial:''' The ambient light in the LevelInfo controls zones without a ZoneInfo, which I *think* the outdoor area in Antalus is (sorry, I'm not able to check right now), so altering the LevelInfo's ambient light properties might fix your problem. (Sorry if you've already tried that - you mentioned playing with the ZoneInfos but not the LevelInfo)

'''oneirotekt:''' Hi folks, long time reader, first time contributor.  Until recently I worked at a company that licenses the Unreal tech, so I might have some helpful info.  Coding DarkMatch for UT2 is tough going because, as you've seen, setting every light in the level to LT_None doesn't work like it did in 436.  Staticmeshes are affected but terrain and BSP remain lit.

Useless trivia: There was some kinda change in the way terrain is drawn between builds 829 and 927, and ever after level designers lost the ability to paint colors in the RGB sections of a terrain layer (now only the alpha channel is used for layer opacity).  I have the feeling this has something to do with the new terrain system in which lighting is &quot;baked&quot; into the verts.

As for BSP surfaces (which are still very prevalent in UT2) there's no way to change the lightmap on-the-fly like there was in 436 (notice that most of the old LightEffect types don't work anymore).  I remember asking Andrew at one point if there was any way an LD or modder could access the level's lightmaps (because it really is just a DXT1, DXT3 or RGBA8 texture) and he said &quot;no, why would you want to do that?&quot;.  So that might be the final nail in DarkMatch's coffin.  However if you *could* figure out a way to access the lightmap, you could do something like replace it with a new Material that combines the old lightmap with a big black texture with Multiply blending.  That way shining a dynamic additive projector onto a BSP surface (I assume that's how you'd implement the spotlight) would reveal something instead of just remaining black.

Fundamental problems:
* Staticmeshes, Terrain and BSP are all lit in different ways
* Shining a nice bright additive projected texture onto something isn't the same as shining an Unreal light source onto it.
* There doesn't seem to be a way to change A) the level's BSP lightmap and B) the light values of terrain vertices.

mnyeah.

So right now the easy solution for DarkMatch seems to be, make new versions of the old levels (or new levels entirely) with no lighting at all, and then equip players with a nice little dynamic projector torch (a la the Bulldog headlight effect).  Opening up an existing UT2 map, removing the lights then recompiling and saving is trivial, but it means people would have to download new maps to play DarkMatch :(

'''RDGDanClark:''' This sounded interesting... I thought it might be cool to put it into a pickup that would turn all the lights dim for 30 seconds whenever you picked it up... so I was messing around and came up with this:

&lt;uscript&gt;
auto state Pickup
{
    function Touch( actor Other )
    {
        local xPawn P;
        local Light L;

        if ( ValidTouch(Other) )
        {
            foreach AllActors(class'Engine.Light', L)
            {
                    L.LightBrightness = 16;
            }
            AnnouncePickup(P);
            SetRespawn();
        }
    }
}
&lt;/uscript&gt;

...but it didn't work. The pickup appears, the message displays, but the lights don't go dim (and yes, I know I haven't put the 30 second limit in yet). I'm still kinda new, so if I'm missing something (and I must be), please let me know.

'''Foxpaw:''' The same problem that's been discussed all around here I think. Number 1, most lights are static &quot;I think&quot; so you can't really change settings on them. Number 2, the BSP isn't &quot;lit&quot; anymore per se. It's lit at map build time, and the lighting is saved into the level. Subsequent changes to the level's lighting has no effect on the BSPs lightmaps.

'''RDGDanClark:''' I see... okay, I knew there would be problems, I just thought I could try my hand at working through them. Someone slap me for not reading this entire page ::stupid::

'''RegularX:''' K, I'm cracking this back open for my new project - Defense Force Omega [http://forums.beyondunreal.com/showthread.php?t=120589 | WMP Forums].  So far, I'm having the most luck for using a static mesh (vs terrain) for large structures like mounds and buildings, and BSP for any large flat areas.  This avoids the basic problems of BSP in the new engine while also avoiding the vertex lighting issue of large static meshes.  Then I'm using the above idea of a black fog combined with ground that's actually somewhat lit.  Tossing the Flashlight from SquirrelZero, I've got a dark area in the background, with fairly lit area in the foreground, and projected light which lights most objects fairly well.  This is all custom maps, of course.  I'm still on the fence about the terrain vs. static mesh setup - but I also kinda hate the Terrain Editor, so I'm torn.  If I get something that really flies, I'll update here with the exact setup.

'''GRAF1K:''' I think you all are going at this in quite the wrong way &amp;ndash; wouldn't a player view fog similar to Screen Flashes do the job quite nicely? :-) You wouldn't need to make new maps, fiddle with existing ones, or anything like that. As for bot support, I had the same problem when I was coding an invisiblity pickup back in the days of UT, before the greatness that is UT2003. I never figured that out, but now there's the Invisibility adrenaline combo. You can find whatever that uses for bot support and ajust for distance by checking distance via the SightRadius property.

'''RegularX:''' NightVision of the xpaks does something similar with a HUD overlay, I think, that you'd get with a Screen Flash type effect.  It's not a bad approach, but it doesn't really come close to how the old Darkmatch used to look or feel.

'''GRAF1K:''' Hmmm... is that because it lacks distance to it?

'''RegularX:''' Yeah.  It's more of a lens than a light.  I mean, you can do some tricks to fade it out/etc.  NVision actually doubles up the sniper overlay so that the center is really clear but the edges get pretty hazy. Doc E has a tute on here that uses a slightly different, and probably more functional method. But it doesn't really replace dynamically lighting a dark room as you walk around.

'''GRAF1K:''' I think you misunderstand. I'm not talking about &quot;dynamically lighting a dark room&quot; as you put it, but simulating a dark/foggy room via a screen flash-type player-view fog. The torch would remain the same.

'''RegularX:''' Maybe I do misunderstand.  The torch/dynamic lighting is the big hurdle, and to get the same kinda of effect as Darkmatch, I think the dark room is a pre-req.  Adjusting the HUD can get results that do something similar still wouldn't look the same, I think.

'''Foxpaw:''' You are likely going to encounter a slight problem with using black fog or any kind of view modification. Black fog makes things farther from you appear darker. (However they may be silhouetted against the skybox depending on implementation.) However, you will not have players lit up in that sort of scenario. A player far away will not appear to have any light with them, they'll just be invisible in the darkness. So, although that allows you to see as if YOU had a light and were in the dark, there isn't really any way to make other players visible using that method. Also, if you use zone fog (as opposed to volume fog) you're going to end up clipping players who are out of view in the &quot;darkness&quot; anyway, so you wouldn't be able to see them even if you did have some way of &quot;lighting&quot; them.

Basically, I think that if you want to have a darkmatch kind of play, you will require either special pre-darkened maps to play it on, or you will need to do some native coding (and thus exclude linux and mac players) to remove the lightmaps on the BSP.

Or you could build your own software renderer from scratch within UnrealScript, but that would probrably be very slow.

'''GRAF1K:''' Our own software renderer? No thanks. :P Custom maps it is. :D

'''RegularX:''' Yeah, no kidding - anything with &quot;renderer&quot; in the phrase I leave up to the pros :).  You're right though, FP, the &quot;dark fog&quot; doesn't accurately portray dynamic lights outside your fog distance (I'm using a distance fog) - though this works OK for my DFO project as most of the things in the darkness will be monsters.  For players holding lights, I may give the light a corona just to have something &quot;shine&quot; in the darkness.

'''Foxpaw:''' What I actually meant by the type of fog is, you can have distance fog in volumes or zones in UT2003. If you make distance fog by setting the fog values in a volume, it colors things based on how far they are from the camera. Anything past the maximum fog distance is drawn completely the fog color, anything before the fog start is it's normal colors, and between the fog start and fog end it interpolates. With this setup, things will be silhouetted against the skybox. (not necessarily a bad thing)

You can also make fog by setting the fog values in the zones, in which case it clips things beyond the fog end distance. That's probrably bad if you want to use a corona to see distant players.

Personally, however, if it's an option I'd make custom maps with lower light levels on them. It will probrably look way better that way. (I'd think so anyway)

If you make the fog by 

'''RegularX:''' Oh, this is all custom map/gametype - no mutation here. Darkness isn't my problem, it's getting a good look and feel from lighting the darkness.  I will play with volume fog to compare/contrast with my current setup.

'''Foxpaw:''' Well, if seeing other players isn't really an issue, then black fog would work &quot;decent.&quot; However, it has it's disadvantages too, specifically that you wouldn't be able to see distant light sources. For the best effect I would think just using very few lights and some shadow projectors and such would be good. It would make a very &quot;aliens vs. predator&quot; kind of feel anyway. Once you start adding a flashlight into the mix it kind of takes away from the feeling of it. You could use a projector if it's like a tight-beam kind of flashlight, but for a spherical projection of light that wouldn't work as good.

'''RegularX:''' K, well I'm picking this back up again for my current stuff.  I've basically concurred that the best route is converted/custom maps.  At first I thought the best I could do to convert maps is open a map, save as, and then do a find on actor names to hunt down the lights.  No!  I was an idiot!  Experienced UnrealEd'rs will laugh at me and mock me and make fun of me in the streets!  You can delete all the lights in a map with just two console (that bar thingy at the bottom!):

ACTOR SELECT OFCLASS CLASS=Light

ACTOR DELETE

And bam.  No lights except for the ambient lighting of zones, etc.  I found it best to open the console window it self (that box thingy next to the white bar thingy), because that first command takes a while, so I kept thinking it wasn't working. But voila, instead of a buncha time to darken a map, this takes about a minute.  Thought I'd share for those who never got that intimate with the console functions.

'''T1:''' You don't need console commands for that... You can just click on a Light actor, right-click and choose &quot;Select all actors of class light&quot; or &quot;Select all light&quot; (I don't remember the exact wording) and then press delete.

'''OlympusMons:''' Hmm! Is there a way of making macro's for using unrealed using the console. Like make a file and read it in using unrealed. Forgive my stupidity I didnt know unrealed even had a console till a month or so ago. Ive been using it since ut2k3 :P

'''RegularX:''' [[Legacy:Binding_Editor_Commands|Binding_Editor_Commands]] is what you want.  And thanks, T1.  Figures gosh darnit that after figuring out the sneaky way that there is a SUPER sneaky way ;).  This is going to save me hours and hours.

'''MMIndustries:''' Hey. I have not posted here for a long time, but I thought I might share some insight on the darkmatch issue. A while ago I coded a darkmatch gametype. I found a few things to be evident:

1. you can't use pre-made levels. There is no way to remove the lighting from the entire level (bsp, terrain...) as far as I can tell.

2. If you do create cusom levels (since that is the only real solution) I found that using a dynamic projector as a flashlight worked best for a light. I coded the projector's rotation and other properties into the playercontroller, as well as an exec function to turn the light on and off. However, the dynamic projector approach has a few drawbacks: I looks fine on static meshes in the dark level, but once it pans over bsp that has no lights burned onto it during the final build in the editor, the effect is ruined. It seems that bsp that is not rendered with lights by the editor is stored as an ugly &quot;bleached out&quot; texture, ie. a complex yellow metal texture turns to a solid hue of yellow. I found that for the projector to effectively light the leve, I had to build exclusively with static meshes. I haven't tried this with terrain.

3. Maybe it's because I coded the projector into the playercontroller, but I found that during gameplay the framerates drop to next to nothing once you encounter a bot or (god forbid) fire up the minigun.

4. Despite my best efforts, I could not find a way to get the darn bots to cooperate with the darkmatch theme.

I'll check to see if I still even have the code if anyone wants a look at it.

'''RegularX:'''  I've stopped using projectors for a simple lit actor, set to DT_NONE, tied to the front of a trace.  It's much less code and seems more efficient, though I admit it lacks the pleasing look of a projector.  My bot code is shaping up, but I'm doing other things (like trying to set cover/hold points) which seem to be confusing it.  I seem to be straying away from a pure Darkmatch.  I might get bored and try to put a sample together with pure dark again.

'''DaWrecka:''' MMIndustries: I'd say building it into the PC probably is your problem. I've got a dynamic projector attached to an assault rifle, and in my DM-DK-Compressed (A version of DM-Compressed in which I painstakingly reduced every light actor's LightBrightness by a factor of 10 - yeah I know, I just thought it'd look better than deleting them all or setting them all to the same low LightBrightness - doesn't seem to be the case) I could point it at bots and there was no perceptible slowdown at all.</text>
    </revision>
    <revision>
      <id>4591</id>
      <timestamp>2005-01-04T14:31:58Z</timestamp>
      <contributor>
        <ip>Escorp1.crateandbarrel.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Darkmatch Tribute - because it rocks}}

==Description ==

Eavy's Darkmatch 3 is probably one of my favourite mods for UT.  Assuming Eavy doesn't beat me to it and ship a darkmatch mutator with UT2003, I'll write one.  It turns out the lights and gives every player a torch.  The following applies:
* The brightness of the torch is configurable.
* The radius of the torch light is configurable.
* An option can be enabled that will make players glow with their team colour.

I realise that I've removed the &quot;turn torch on/off&quot; options from the original but I never saw the point in it, and certainly when we tried it found that it made no difference to the game - in fact, it made it less exciting.

====Links ====

[http://mimesis.csc.ncsu.edu/ClassReference/UnrealI.DarkMatch.html the original DarkMatch code]

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; Oh yeah, Darkmatch rocks but too much will fritz your eyes.
* [[Legacy:AlphaOne|AlphaOne]] &amp;ndash; I wonder how 1337 will it be to play DarkMatch at night, in a dark room, with Surround sound!?

==Discussion ==

'''AlphaOne:''' Can anyone get the original code from UT?

Also, Is it better to have a mutator for darkmatch or a separate game type, or both?

Is it possible to use the fog (black in colour) in the game to speed up the rendering of invisible things?

By looking at the code it can be seen that the lights in the levels must have been turned OFF in the UED.

I want to add one more thing to this game type: Reduce the visibility of bots, or to make them see only very close to themselves. To simulate the darkness effect.

'''Wormbo:''' Black fog != no light. But a Fog Match would be interesting, too... ;)  For the code just download Eavy DarkMatch. The basic idea behind it was this little loop:

&lt;uscript&gt;
	ForEach AllActors(class'Engine.Light', L)
		L.LightType = LT_None;
&lt;/uscript&gt;

'''EntropicLqd:''' lol - Yeah - but he did have some other handling for sky boxes and stuff.  Hmmmm, a fog match.  That might be pretty weird.  Configurable min/max distances set across all the zones.  Should be easy.  It's better if you make the DarkMatch mod a mutator.  That way it can be used with all of the game types.  Are you likely to write this in the next couple of weeks?  My Mayhem mod has got a bit bogged down and I need to take a break from it.

'''AlphaOne:''' ''(to EntropicLqd)'' Ya, I'll start working on it, now that I have my Christmas break. I don't quite get what you mean by the last sentence you wrote.

BTW: I could not get the code of Eavy DarkMatch, UED crashed when I tried loading the package. It would be great if you could post the code on this page.

I was thinking about changing the visibility of the player to bots. There could be two ways to do it: reduce bots SightRadius (more like the fog effect), or make the player less noticable to bots based on the amount of light the carry (like Eavy DarkMatch)

One last thing: Why did Epic release the new .UC and debug .U files? Could ppl. get thouse by just exporting the scripts?

'''Mychaeel:''' The source code exporter is broken (doesn't properly export private objects in property defaults).  Recompiling the engine packages in debug mode is outright impossible (or at least very, very impractical).

'''AlphaOne:''' IC - starting to download it...

'''AlphaOne:''' Anyways, what's the best way to deal with bots?

'''EntropicLqd:''' RE: My last sentence - I'm working on a mod that (for the time being at least) has ground to a bit of a halt while I make a couple of decisions.  Rather than have it bug me I'll make the decision while working on something else, that's a bit smaller.  Darkmatch was at the top of the list :).  If you want the Eavy Darkmatch code then you can grab the UT mutator from the maps n mods section of http://www.snout-clan.co.uk, install it, and then export it.  Failing that, drop me an e-mail and I'll pass it on.
: In terms of bots the original darkmatch doesn't bother doing anything with them - which isn't so bad since they never turn their lights out.  However, I was considering tweaking the AI to effectively reduce their sight FOV (but still allow them to hear players).

'''AlphaOne:''' the http://www.snout-clan.co.uk/ doesn't have the mod any more (broken link). I don't like the idea of turning off the lights because it makes it toooooo easy to cheat (like invisibility).

If you want to code DarkMatch then go ahead. I'm not going to compete with you or anything.

'''EntropicLqd:''' Right then .. I've put the mod back on the site - dunno why it went away but thanks for letting me know it was broken :).  It's worth pulling down and playing with.  If you are sure you don't want to do it then I'll pick it up, but you have first shout.  I'm not short of small mod ideas.  Your call.  And you could always disable the adrenaline moves you know.

'''AlphaOne:''' OK. I'll work on the mod. If I get really stuck then I'll ask you (or anyone else) for help. (BTW: what do adrenaline moves have to do with anything?)

'''EntropicLqd:''' Invisibility is an Adrenaline move - disable adrenaline, disable invisibility.  You inferred above that going invisible in a darkmatch was ''cheating''.  It would give you a hell of an advantage for sure.  Don't worry about it - I won't :)

'''AlphaOne:''' I just ran into a problem: When I set the LightType to none, only the (indicated by green lines in RMODE 1) static meshes become black. The lightmaps are still visible on the BSP brushes (indicated by white lines in RMODE 1).

'''EntropicLqd:''' Hmmm.  Sounds icky.  I've been playing aroud with the &quot;Fog Match&quot; idea proposed by Wormbo and I have similar problems.  Antalus looks pap because the meshes suddenly appear and the sky is always visible (it seems to be more of an occlusion problem.  Asbestos looks OK.  I'll have a think about your problem though - One presumes that the lightmaps are properties of the brush - if they are not declared as constant you might be able to null them out.

'''EntropicLqd:''' Well, I've sorted my problem - just had to increase the amount of fog in the skyzone until the sky is simply occluded by the fog.  Works well.  Antalus now looks cool.  Just need to sort out the bots now - sigh.

'''AlphaOne:''' For bots, just change their SightRadius to make it equal to the fog end distance (where clipping happens). I spent an hour looking for this variable and found it in the Bot class.

I also looked for lightmap variables in brushes, but could not find much. For some reason UnDox skips a lot of vars!??

OH, and btw, include the option to change the colour and the distance of the fog!

'''EntropicLqd:''' Would it be part of the materials section?  I dunno - not looked at it at all.  Options to change the colour, min fog distance, max fog distance are already in there (no config screen yet though).  Might also be worth tweaking the AI such that at distances close to the max fog distance it's slightly random as to whether they see you or not.

'''Wormbo:''' I noticed this skyzone fog problem when I experimented with distance fog and the &quot;set&quot; command on DM-Antalus a while back. I guess the skyzone needs the same fog color as the other zones and a minimal fog distance to look good.
: '''EntropicLqd:''' Indeed - I set the fog start distance to 0 and the fog distance to 32 in all sky zones.  It solves the problem beautifully.  Asbestos really rocks with loads of fog.  Anyways - I'm on holiday now so I'm in a non-UT2003 environment, but I'll finish the mutator off when I get back off holiday.  Might be worth setting up a &quot;mutator pack project&quot; (although project is possibly far to grand a word for it) for &quot;environment&quot; type mutators.  Fog match, Dark match, and any others we come up with (no falling damage, high gravity, .... ).

'''ZxAnPhOrIaN:''' I thought that bFogZone couldn't change during gameplay, cause it is a constant? (or maybe im thinking about the original UT)
:'''Wormbo:''' bFogZone != bDistanceFog :P All the distance fog related variables can be changed from UnrealScript, while bFogZone enables volumetric lighting in the zone.

'''ZxAnPhOrIaN:''' So bFogZone and bDistanceFog are diffrent, RIGHT!!!

'''ZxAnPhOrIaN:''' Like wormbo said above, &quot;Black fog != no light.&quot;, look at DM-Plunge for example, it uses black fog!

----

'''ZxAnPhOrIaN:'''  This mod should have darkness and fogness :) incorperated into it, namechange, maybe?

'''EntropicLqd:'''  2 years ago I would have agreed.  However, I've come to the conclusion that it's better to have many atomic mutators than one monster one.  Configuration for the &quot;dumb user&quot; becomes less of an issue that way.

----

'''AlphaOne:''' I like the idea of darkess+fogness. However, I still cannot find a way to &quot;turn off&quot; all the lights!

'''Tahngarth:''' fogmatch- that sounds fun :) just set the fog so that you can barely see 5 feet in front of you :P

'''AlphaOne:''' I tried the fogmatch myself. It is no fun with bots.

'''ZxAnPhOrIaN:''' Why? Can the bots see though the fog? Is it like you cant see him, but he can see you, type of situation?

'''AlphaOne:''' Yep. They can see me throught fog. They even snipe me sometimes out of nowhere. I tried lowering the bot's SightRadius. As a result I had to go around the map and LOOK for bots because they didn't see me.

'''ZxAnPhOrIaN:''' LOL, make the fog so dense that you cant see a foot away from you and make a bot snipe you from a mile away!!!

----

'''EntropicLqd:''' Right, I've finished my FogMatch mutator - I've given up trying to get the bots to work right with it :(.  How's the DarkMatch mutator coming on?  Still got that light-map problem?

'''AlphaOne:''' Yep. I kind of abandoned the DarkMatch idea for now. Maybe you could give it a try?

'''EntropicLqd:''' Yeah - love to.  Would it be worth me taking on any code you've written already?  If you think it would be then e-mail it to me on entropic@snout-clan.co.uk.  If I don't hear anything in the next 2-4 days I'll start from scratch anyways.  Cheers.

'''Tarquin:''' hasn't this neem made? I got a huge pack of mutators from BU last week that had something with dark. not tested it tho. the xxxpak it's called

'''Wormbo:''' Yup, RegularX put a &quot;Night Watch&quot; mutator in his [http://inkless.com/xpak.html XXXPak]. (actually a combination of his previous XPak 1, 2 &amp; 3 mutator packs) I don't know about bot support, though.

'''Tarquin:''' NightWatch is not very good. Try it on DM-Antalus. Areas of terrain are too bright, and you don't feel like you're using a torch. There's NightVision in the same pack. Way too dark. I don't thie bots are affected by either.

'''EntropicLqd:''' Having the bots affected by darkness (or in my case fog) is a right bugger.  I still haven't worked out how to do it.  Every now and then I have a trawl through the code to see if I can find it but so far I've drawn a complete blank.  I have a couple of theories but none of them are particularly palatable (ie. damn hard to code around).  I've mailed DrSin to see if he can pass on the query to Steve Polge but not had anything back yet.  I'll have to check out the XXX mutator pack though.

'''Tarquin:''' How does fog affect bots?

'''Wormbo:''' They aren't affected at all, that's the problem.

'''EntropicLqd:''' Tarquin - check out the [[Legacy:Help Desk|Help Desk]] page.  I have an outstanding problem on there all about it.  It's a right teaser.

'''EntropicLqd''' I checked out Nightwatch .. I have exactly the same problem on Antalus.  I need to know how terrain works - and where the texture proerties come from.  I'm happy with the way my objects appear, I've got rid of all projectors (and possibly light maps), but the terrain .... arrrgh.  I guess it may not be possible to do a &quot;darkmatch&quot; in outside maps in UT2003 simply because of the way the engine works.  There's also some other funnies on Antalus - but I suspect it's where the lighting has been forced into the texture itself - and I really need to change the surface properties of the faces.  No chance of that in UScript.

'''RegularX:''' NightWatch appeared to be doomed on two fronts: 1) online at either the mutator or gametype level the changes to the lights didn't appear to replicate.  2) Certain lighting features (like on Antalus) didn't seem to be found no matter how many different things I tried to Zones, etc.  NightVision was meant to be it's simpler, more net friendly replacement since it basically is just a HUD interaction - but I didn't have time to put in all the options to customize it/special effects in before releasing for Xmas, hence the being stuck with the dreary blue.  And there is no bot support for either one - and in Nightwatch I didn't have time to adjust the Bot's view to line up the &quot;torch&quot;.

'''Foxpaw:''' I haven't seen the code you are using but I think that the problem you may be having with lights not being squelched may be related to the fact that an object does not have to be a &quot;light&quot; to light up. Any kind of actor can be lit as far as I know. Those leftover lights may be other actors set to have a light. Replication is indeed tricky, I had an idea but it isn't compatible with my idea on squelching non-&quot;light&quot; lights. To replicate the changes in lights I would recommend subclassing light and using the mutator to replace all instances of light with your altered light class. Once you have your own light class you should be able to replicate a variable to indicate the light's status, something like the Redeemer in UT. (How it replicates a copy of Location and Rotation, then applies it server-side. I think it's server-side. I didn't actually read that too thoroughly.) I also had an idea for bots but it's not the best programming style - you might be able to have an &quot;item&quot; attached to all players, which would be considered a desirable pickup for bots, it's desirability waning as the player went out of view. I don't know if that would work or not but it might help the bots find the players and each other if their sightradius is reduced.

'''EntropicLqd:''' As far as I could tell I managed to get the replication working OK.  The problem with the lights isn't with &quot;non-light&quot; light producing actors as such.  There seem to be light map areas explicitly coded into the level, and you can't get a reference to them.  Antalus is an excellent example of this.  The outside area cannot be made dark as far as I can tell.

'''AlphaOne:''' What if you project a BLACK texture on ALL surfaces in the level?

'''Mysterial:''' EntropicLqd: If you mean ambient light, you can find and presumably alter that in the LevelInfo.

'''EntropicLqd:''' ''AlphaOne:'' An interesting idea.  I'm confident it wouldn't work as the light's I have left don't seem to be sourced from projectors - they are coming from somewhere else (possibly baked right into the texture).  The other problem with projecting a black texture over everything is that you'd never know where you were - the flashlight at least gives you the possibility of recognising where you are from the wall, floor, and ceiling textures.
:''Mysterial:'' The ambient light was easy to kill.  You have to turn it off on a zone by zone basis though.
: I've come to the conclusion that the only way to do this would be to create levels that are dark all over.  Much like the original DarkMatch idea in Unreal.  Which is a shame.  I'll post a URL to the code that I've written once I've got it uploaded so that other people can have a look at it.

'''Mysterial:''' The ambient light in the LevelInfo controls zones without a ZoneInfo, which I *think* the outdoor area in Antalus is (sorry, I'm not able to check right now), so altering the LevelInfo's ambient light properties might fix your problem. (Sorry if you've already tried that - you mentioned playing with the ZoneInfos but not the LevelInfo)

'''oneirotekt:''' Hi folks, long time reader, first time contributor.  Until recently I worked at a company that licenses the Unreal tech, so I might have some helpful info.  Coding DarkMatch for UT2 is tough going because, as you've seen, setting every light in the level to LT_None doesn't work like it did in 436.  Staticmeshes are affected but terrain and BSP remain lit.

Useless trivia: There was some kinda change in the way terrain is drawn between builds 829 and 927, and ever after level designers lost the ability to paint colors in the RGB sections of a terrain layer (now only the alpha channel is used for layer opacity).  I have the feeling this has something to do with the new terrain system in which lighting is &quot;baked&quot; into the verts.

As for BSP surfaces (which are still very prevalent in UT2) there's no way to change the lightmap on-the-fly like there was in 436 (notice that most of the old LightEffect types don't work anymore).  I remember asking Andrew at one point if there was any way an LD or modder could access the level's lightmaps (because it really is just a DXT1, DXT3 or RGBA8 texture) and he said &quot;no, why would you want to do that?&quot;.  So that might be the final nail in DarkMatch's coffin.  However if you *could* figure out a way to access the lightmap, you could do something like replace it with a new Material that combines the old lightmap with a big black texture with Multiply blending.  That way shining a dynamic additive projector onto a BSP surface (I assume that's how you'd implement the spotlight) would reveal something instead of just remaining black.

Fundamental problems:
* Staticmeshes, Terrain and BSP are all lit in different ways
* Shining a nice bright additive projected texture onto something isn't the same as shining an Unreal light source onto it.
* There doesn't seem to be a way to change A) the level's BSP lightmap and B) the light values of terrain vertices.

mnyeah.

So right now the easy solution for DarkMatch seems to be, make new versions of the old levels (or new levels entirely) with no lighting at all, and then equip players with a nice little dynamic projector torch (a la the Bulldog headlight effect).  Opening up an existing UT2 map, removing the lights then recompiling and saving is trivial, but it means people would have to download new maps to play DarkMatch :(

'''RDGDanClark:''' This sounded interesting... I thought it might be cool to put it into a pickup that would turn all the lights dim for 30 seconds whenever you picked it up... so I was messing around and came up with this:

&lt;uscript&gt;
auto state Pickup
{
    function Touch( actor Other )
    {
        local xPawn P;
        local Light L;

        if ( ValidTouch(Other) )
        {
            foreach AllActors(class'Engine.Light', L)
            {
                    L.LightBrightness = 16;
            }
            AnnouncePickup(P);
            SetRespawn();
        }
    }
}
&lt;/uscript&gt;

...but it didn't work. The pickup appears, the message displays, but the lights don't go dim (and yes, I know I haven't put the 30 second limit in yet). I'm still kinda new, so if I'm missing something (and I must be), please let me know.

'''Foxpaw:''' The same problem that's been discussed all around here I think. Number 1, most lights are static &quot;I think&quot; so you can't really change settings on them. Number 2, the BSP isn't &quot;lit&quot; anymore per se. It's lit at map build time, and the lighting is saved into the level. Subsequent changes to the level's lighting has no effect on the BSPs lightmaps.

'''RDGDanClark:''' I see... okay, I knew there would be problems, I just thought I could try my hand at working through them. Someone slap me for not reading this entire page ::stupid::

'''RegularX:''' K, I'm cracking this back open for my new project - Defense Force Omega [http://forums.beyondunreal.com/showthread.php?t=120589 | WMP Forums].  So far, I'm having the most luck for using a static mesh (vs terrain) for large structures like mounds and buildings, and BSP for any large flat areas.  This avoids the basic problems of BSP in the new engine while also avoiding the vertex lighting issue of large static meshes.  Then I'm using the above idea of a black fog combined with ground that's actually somewhat lit.  Tossing the Flashlight from SquirrelZero, I've got a dark area in the background, with fairly lit area in the foreground, and projected light which lights most objects fairly well.  This is all custom maps, of course.  I'm still on the fence about the terrain vs. static mesh setup - but I also kinda hate the Terrain Editor, so I'm torn.  If I get something that really flies, I'll update here with the exact setup.

'''GRAF1K:''' I think you all are going at this in quite the wrong way &amp;ndash; wouldn't a player view fog similar to Screen Flashes do the job quite nicely? :-) You wouldn't need to make new maps, fiddle with existing ones, or anything like that. As for bot support, I had the same problem when I was coding an invisiblity pickup back in the days of UT, before the greatness that is UT2003. I never figured that out, but now there's the Invisibility adrenaline combo. You can find whatever that uses for bot support and ajust for distance by checking distance via the SightRadius property.

'''RegularX:''' NightVision of the xpaks does something similar with a HUD overlay, I think, that you'd get with a Screen Flash type effect.  It's not a bad approach, but it doesn't really come close to how the old Darkmatch used to look or feel.

'''GRAF1K:''' Hmmm... is that because it lacks distance to it?

'''RegularX:''' Yeah.  It's more of a lens than a light.  I mean, you can do some tricks to fade it out/etc.  NVision actually doubles up the sniper overlay so that the center is really clear but the edges get pretty hazy. Doc E has a tute on here that uses a slightly different, and probably more functional method. But it doesn't really replace dynamically lighting a dark room as you walk around.

'''GRAF1K:''' I think you misunderstand. I'm not talking about &quot;dynamically lighting a dark room&quot; as you put it, but simulating a dark/foggy room via a screen flash-type player-view fog. The torch would remain the same.

'''RegularX:''' Maybe I do misunderstand.  The torch/dynamic lighting is the big hurdle, and to get the same kinda of effect as Darkmatch, I think the dark room is a pre-req.  Adjusting the HUD can get results that do something similar still wouldn't look the same, I think.

'''Foxpaw:''' You are likely going to encounter a slight problem with using black fog or any kind of view modification. Black fog makes things farther from you appear darker. (However they may be silhouetted against the skybox depending on implementation.) However, you will not have players lit up in that sort of scenario. A player far away will not appear to have any light with them, they'll just be invisible in the darkness. So, although that allows you to see as if YOU had a light and were in the dark, there isn't really any way to make other players visible using that method. Also, if you use zone fog (as opposed to volume fog) you're going to end up clipping players who are out of view in the &quot;darkness&quot; anyway, so you wouldn't be able to see them even if you did have some way of &quot;lighting&quot; them.

Basically, I think that if you want to have a darkmatch kind of play, you will require either special pre-darkened maps to play it on, or you will need to do some native coding (and thus exclude linux and mac players) to remove the lightmaps on the BSP.

Or you could build your own software renderer from scratch within UnrealScript, but that would probrably be very slow.

'''GRAF1K:''' Our own software renderer? No thanks. :P Custom maps it is. :D

'''RegularX:''' Yeah, no kidding - anything with &quot;renderer&quot; in the phrase I leave up to the pros :).  You're right though, FP, the &quot;dark fog&quot; doesn't accurately portray dynamic lights outside your fog distance (I'm using a distance fog) - though this works OK for my DFO project as most of the things in the darkness will be monsters.  For players holding lights, I may give the light a corona just to have something &quot;shine&quot; in the darkness.

'''Foxpaw:''' What I actually meant by the type of fog is, you can have distance fog in volumes or zones in UT2003. If you make distance fog by setting the fog values in a volume, it colors things based on how far they are from the camera. Anything past the maximum fog distance is drawn completely the fog color, anything before the fog start is it's normal colors, and between the fog start and fog end it interpolates. With this setup, things will be silhouetted against the skybox. (not necessarily a bad thing)

You can also make fog by setting the fog values in the zones, in which case it clips things beyond the fog end distance. That's probrably bad if you want to use a corona to see distant players.

Personally, however, if it's an option I'd make custom maps with lower light levels on them. It will probrably look way better that way. (I'd think so anyway)

If you make the fog by 

'''RegularX:''' Oh, this is all custom map/gametype - no mutation here. Darkness isn't my problem, it's getting a good look and feel from lighting the darkness.  I will play with volume fog to compare/contrast with my current setup.

'''Foxpaw:''' Well, if seeing other players isn't really an issue, then black fog would work &quot;decent.&quot; However, it has it's disadvantages too, specifically that you wouldn't be able to see distant light sources. For the best effect I would think just using very few lights and some shadow projectors and such would be good. It would make a very &quot;aliens vs. predator&quot; kind of feel anyway. Once you start adding a flashlight into the mix it kind of takes away from the feeling of it. You could use a projector if it's like a tight-beam kind of flashlight, but for a spherical projection of light that wouldn't work as good.

'''RegularX:''' K, well I'm picking this back up again for my current stuff.  I've basically concurred that the best route is converted/custom maps.  At first I thought the best I could do to convert maps is open a map, save as, and then do a find on actor names to hunt down the lights.  No!  I was an idiot!  Experienced UnrealEd'rs will laugh at me and mock me and make fun of me in the streets!  You can delete all the lights in a map with just two console (that bar thingy at the bottom!):

ACTOR SELECT OFCLASS CLASS=Light

ACTOR DELETE

And bam.  No lights except for the ambient lighting of zones, etc.  I found it best to open the console window it self (that box thingy next to the white bar thingy), because that first command takes a while, so I kept thinking it wasn't working. But voila, instead of a buncha time to darken a map, this takes about a minute.  Thought I'd share for those who never got that intimate with the console functions.

'''T1:''' You don't need console commands for that... You can just click on a Light actor, right-click and choose &quot;Select all actors of class light&quot; or &quot;Select all light&quot; (I don't remember the exact wording) and then press delete.

'''OlympusMons:''' Hmm! Is there a way of making macro's for using unrealed using the console. Like make a file and read it in using unrealed. Forgive my stupidity I didnt know unrealed even had a console till a month or so ago. Ive been using it since ut2k3 :P

'''RegularX:''' [[Legacy:Binding_Editor_Commands|Binding_Editor_Commands]] is what you want.  And thanks, T1.  Figures gosh darnit that after figuring out the sneaky way that there is a SUPER sneaky way ;).  This is going to save me hours and hours.

'''MMIndustries:''' Hey. I have not posted here for a long time, but I thought I might share some insight on the darkmatch issue. A while ago I coded a darkmatch gametype. I found a few things to be evident:

1. you can't use pre-made levels. There is no way to remove the lighting from the entire level (bsp, terrain...) as far as I can tell.

2. If you do create cusom levels (since that is the only real solution) I found that using a dynamic projector as a flashlight worked best for a light. I coded the projector's rotation and other properties into the playercontroller, as well as an exec function to turn the light on and off. However, the dynamic projector approach has a few drawbacks: I looks fine on static meshes in the dark level, but once it pans over bsp that has no lights burned onto it during the final build in the editor, the effect is ruined. It seems that bsp that is not rendered with lights by the editor is stored as an ugly &quot;bleached out&quot; texture, ie. a complex yellow metal texture turns to a solid hue of yellow. I found that for the projector to effectively light the leve, I had to build exclusively with static meshes. I haven't tried this with terrain.

3. Maybe it's because I coded the projector into the playercontroller, but I found that during gameplay the framerates drop to next to nothing once you encounter a bot or (god forbid) fire up the minigun.

4. Despite my best efforts, I could not find a way to get the darn bots to cooperate with the darkmatch theme.

I'll check to see if I still even have the code if anyone wants a look at it.

'''RegularX:'''  I've stopped using projectors for a simple lit actor, set to DT_NONE, tied to the front of a trace.  It's much less code and seems more efficient, though I admit it lacks the pleasing look of a projector.  My bot code is shaping up, but I'm doing other things (like trying to set cover/hold points) which seem to be confusing it.  I seem to be straying away from a pure Darkmatch.  I might get bored and try to put a sample together with pure dark again.</text>
    </revision>
    <revision>
      <id>43613</id>
      <timestamp>2010-07-06T07:26:26Z</timestamp>
      <contributor>
        <username>Vsimon213</username>
        <id>2164</id>
      </contributor>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Darkmatch Tribute - because it rocks}}

==Description ==

Eavy's Darkmatch 3 is probably one of my favourite mods for UT.  Assuming Eavy doesn't beat me to it and ship a darkmatch mutator with UT2003, I'll write one.  It turns out the lights and gives every player a torch.  The following applies:
* The brightness of the torch is configurable.
* The radius of the torch light is configurable.
* An option can be enabled that will make players glow with their team colour.

I realise that I've removed the &quot;turn torch on/off&quot; options from the original but I never saw the point in it, and certainly when we tried it found that it made no difference to the game - in fact, it made it less exciting.

====Links ====

[http://mimesis.csc.ncsu.edu/ClassReference/UnrealI.DarkMatch.html the original DarkMatch code]

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; Oh yeah, Darkmatch rocks but too much will fritz your eyes.
* [[Legacy:AlphaOne|AlphaOne]] &amp;ndash; I wonder how 1337 will it be to play DarkMatch at night, in a dark room, with Surround sound!?

==Discussion ==

'''AlphaOne:''' Can anyone get the original code from UT?

Also, Is it better to have a mutator for darkmatch or a separate game type, or both?

Is it possible to use the fog (black in colour) in the game to speed up the rendering of invisible things?

By looking at the code it can be seen that the lights in the levels must have been turned OFF in the UED.

I want to add one more thing to this game type: Reduce the visibility of bots, or to make them see only very close to themselves. To simulate the darkness effect.

'''Wormbo:''' Black fog != no light. But a Fog Match would be interesting, too... ;)  For the code just download Eavy DarkMatch. The basic idea behind it was this little loop:

&lt;uscript&gt;
	ForEach AllActors(class'Engine.Light', L)
		L.LightType = LT_None;
&lt;/uscript&gt;

'''EntropicLqd:''' lol - Yeah - but he did have some other handling for sky boxes and stuff.  Hmmmm, a fog match.  That might be pretty weird.  Configurable min/max distances set across all the zones.  Should be easy.  It's better if you make the DarkMatch mod a mutator.  That way it can be used with all of the game types.  Are you likely to write this in the next couple of weeks?  My Mayhem mod has got a bit bogged down and I need to take a break from it.

'''AlphaOne:''' ''(to EntropicLqd)'' Ya, I'll start working on it, now that I have my Christmas break. I don't quite get what you mean by the last sentence you wrote.

BTW: I could not get the code of Eavy DarkMatch, UED crashed when I tried loading the package. It would be great if you could post the code on this page.

I was thinking about changing the visibility of the player to bots. There could be two ways to do it: reduce bots SightRadius (more like the fog effect), or make the player less noticable to bots based on the amount of light the carry (like Eavy DarkMatch)

One last thing: Why did Epic release the new .UC and debug .U files? Could ppl. get thouse by just exporting the scripts?

'''Mychaeel:''' The source code exporter is broken (doesn't properly export private objects in property defaults).  Recompiling the engine packages in debug mode is outright impossible (or at least very, very impractical).

'''AlphaOne:''' IC - starting to download it...

'''AlphaOne:''' Anyways, what's the best way to deal with bots?

'''EntropicLqd:''' RE: My last sentence - I'm working on a mod that (for the time being at least) has ground to a bit of a halt while I make a couple of decisions.  Rather than have it bug me I'll make the decision while working on something else, that's a bit smaller.  Darkmatch was at the top of the list :).  If you want the Eavy Darkmatch code then you can grab the UT mutator from the maps n mods section of http://www.snout-clan.co.uk, install it, and then export it.  Failing that, drop me an e-mail and I'll pass it on.
: In terms of bots the original darkmatch doesn't bother doing anything with them - which isn't so bad since they never turn their lights out.  However, I was considering tweaking the AI to effectively reduce their sight FOV (but still allow them to hear players).

'''AlphaOne:''' the http://www.snout-clan.co.uk/ doesn't have the mod any more (broken link). I don't like the idea of turning off the lights because it makes it toooooo easy to cheat (like invisibility).

If you want to code DarkMatch then go ahead. I'm not going to compete with you or anything.

'''EntropicLqd:''' Right then .. I've put the mod back on the site - dunno why it went away but thanks for letting me know it was broken :).  It's worth pulling down and playing with.  If you are sure you don't want to do it then I'll pick it up, but you have first shout.  I'm not short of small mod ideas.  Your call.  And you could always disable the adrenaline moves you know.

'''AlphaOne:''' OK. I'll work on the mod. If I get really stuck then I'll ask you (or anyone else) for help. (BTW: what do adrenaline moves have to do with anything?)

'''EntropicLqd:''' Invisibility is an Adrenaline move - disable adrenaline, disable invisibility.  You inferred above that going invisible in a darkmatch was ''cheating''.  It would give you a hell of an advantage for sure.  Don't worry about it - I won't :)

'''AlphaOne:''' I just ran into a problem: When I set the LightType to none, only the (indicated by green lines in RMODE 1) static meshes become black. The lightmaps are still visible on the BSP brushes (indicated by white lines in RMODE 1).

'''EntropicLqd:''' Hmmm.  Sounds icky.  I've been playing aroud with the &quot;Fog Match&quot; idea proposed by Wormbo and I have similar problems.  Antalus looks pap because the meshes suddenly appear and the sky is always visible (it seems to be more of an occlusion problem.  Asbestos looks OK.  I'll have a think about your problem though - One presumes that the lightmaps are properties of the brush - if they are not declared as constant you might be able to null them out.

'''EntropicLqd:''' Well, I've sorted my problem - just had to increase the amount of fog in the skyzone until the sky is simply occluded by the fog.  Works well.  Antalus now looks cool.  Just need to sort out the bots now - sigh.

'''AlphaOne:''' For bots, just change their SightRadius to make it equal to the fog end distance (where clipping happens). I spent an hour looking for this variable and found it in the Bot class.

I also looked for lightmap variables in brushes, but could not find much. For some reason UnDox skips a lot of vars!??

OH, and btw, include the option to change the colour and the distance of the fog!

'''EntropicLqd:''' Would it be part of the materials section?  I dunno - not looked at it at all.  Options to change the colour, min fog distance, max fog distance are already in there (no config screen yet though).  Might also be worth tweaking the AI such that at distances close to the max fog distance it's slightly random as to whether they see you or not.

'''Wormbo:''' I noticed this skyzone fog problem when I experimented with distance fog and the &quot;set&quot; command on DM-Antalus a while back. I guess the skyzone needs the same fog color as the other zones and a minimal fog distance to look good.
: '''EntropicLqd:''' Indeed - I set the fog start distance to 0 and the fog distance to 32 in all sky zones.  It solves the problem beautifully.  Asbestos really rocks with loads of fog.  Anyways - I'm on holiday now so I'm in a non-UT2003 environment, but I'll finish the mutator off when I get back off holiday.  Might be worth setting up a &quot;mutator pack project&quot; (although project is possibly far to grand a word for it) for &quot;environment&quot; type mutators.  Fog match, Dark match, and any others we come up with (no falling damage, high gravity, .... ).

'''ZxAnPhOrIaN:''' I thought that bFogZone couldn't change during gameplay, cause it is a constant? (or maybe im thinking about the original UT)
:'''Wormbo:''' bFogZone != bDistanceFog :P All the distance fog related variables can be changed from UnrealScript, while bFogZone enables volumetric lighting in the zone.

'''ZxAnPhOrIaN:''' So bFogZone and bDistanceFog are diffrent, RIGHT!!!

'''ZxAnPhOrIaN:''' Like wormbo said above, &quot;Black fog != no light.&quot;, look at DM-Plunge for example, it uses black fog!

----

'''ZxAnPhOrIaN:'''  This mod should have darkness and fogness :) incorperated into it, namechange, maybe?

'''EntropicLqd:'''  2 years ago I would have agreed.  However, I've come to the conclusion that it's better to have many atomic mutators than one monster one.  Configuration for the &quot;dumb user&quot; becomes less of an issue that way.

----

'''AlphaOne:''' I like the idea of darkess+fogness. However, I still cannot find a way to &quot;turn off&quot; all the lights!

'''Tahngarth:''' fogmatch- that sounds fun :) just set the fog so that you can barely see 5 feet in front of you :P

'''AlphaOne:''' I tried the fogmatch myself. It is no fun with bots.

'''ZxAnPhOrIaN:''' Why? Can the bots see though the fog? Is it like you cant see him, but he can see you, type of situation?

'''AlphaOne:''' Yep. They can see me throught fog. They even snipe me sometimes out of nowhere. I tried lowering the bot's SightRadius. As a result I had to go around the map and LOOK for bots because they didn't see me.

'''ZxAnPhOrIaN:''' LOL, make the fog so dense that you cant see a foot away from you and make a bot snipe you from a mile away!!!

----

'''EntropicLqd:''' Right, I've finished my FogMatch mutator - I've given up trying to get the bots to work right with it :(.  How's the DarkMatch mutator coming on?  Still got that light-map problem?

'''AlphaOne:''' Yep. I kind of abandoned the DarkMatch idea for now. Maybe you could give it a try?

'''EntropicLqd:''' Yeah - love to.  Would it be worth me taking on any code you've written already?  If you think it would be then e-mail it to me on entropic@snout-clan.co.uk.  If I don't hear anything in the next 2-4 days I'll start from scratch anyways.  Cheers.

'''Tarquin:''' hasn't this neem made? I got a huge pack of mutators from BU last week that had something with dark. not tested it tho. the xxxpak it's called

'''Wormbo:''' Yup, RegularX put a &quot;Night Watch&quot; mutator in his [http://inkless.com/xpak.html XXXPak]. (actually a combination of his previous XPak 1, 2 &amp; 3 mutator packs) I don't know about bot support, though.

'''Tarquin:''' NightWatch is not very good. Try it on DM-Antalus. Areas of terrain are too bright, and you don't feel like you're using a torch. There's NightVision in the same pack. Way too dark. I don't thie bots are affected by either.

'''EntropicLqd:''' Having the bots affected by darkness (or in my case fog) is a right bugger.  I still haven't worked out how to do it.  Every now and then I have a trawl through the code to see if I can find it but so far I've drawn a complete blank.  I have a couple of theories but none of them are particularly palatable (ie. damn hard to code around).  I've mailed DrSin to see if he can pass on the query to Steve Polge but not had anything back yet.  I'll have to check out the XXX mutator pack though.

'''Tarquin:''' How does fog affect bots?

'''Wormbo:''' They aren't affected at all, that's the problem.

'''EntropicLqd:''' Tarquin - check out the [[Legacy:Help Desk|Help Desk]] page.  I have an outstanding problem on there all about it.  It's a right teaser.

'''EntropicLqd''' I checked out Nightwatch .. I have exactly the same problem on Antalus.  I need to know how terrain works - and where the texture proerties come from.  I'm happy with the way my objects appear, I've got rid of all projectors (and possibly light maps), but the terrain .... arrrgh.  I guess it may not be possible to do a &quot;darkmatch&quot; in outside maps in UT2003 simply because of the way the engine works.  There's also some other funnies on Antalus - but I suspect it's where the lighting has been forced into the texture itself - and I really need to change the surface properties of the faces.  No chance of that in UScript.

'''RegularX:''' NightWatch appeared to be doomed on two fronts: 1) online at either the mutator or gametype level the changes to the lights didn't appear to replicate.  2) Certain lighting features (like on Antalus) didn't seem to be found no matter how many different things I tried to Zones, etc.  NightVision was meant to be it's simpler, more net friendly replacement since it basically is just a HUD interaction - but I didn't have time to put in all the options to customize it/special effects in before releasing for Xmas, hence the being stuck with the dreary blue.  And there is no bot support for either one - and in Nightwatch I didn't have time to adjust the Bot's view to line up the &quot;torch&quot;.

'''Foxpaw:''' I haven't seen the code you are using but I think that the problem you may be having with lights not being squelched may be related to the fact that an object does not have to be a &quot;light&quot; to light up. Any kind of actor can be lit as far as I know. Those leftover lights may be other actors set to have a light. Replication is indeed tricky, I had an idea but it isn't compatible with my idea on squelching non-&quot;light&quot; lights. To replicate the changes in lights I would recommend subclassing light and using the mutator to replace all instances of light with your altered light class. Once you have your own light class you should be able to replicate a variable to indicate the light's status, something like the Redeemer in UT. (How it replicates a copy of Location and Rotation, then applies it server-side. I think it's server-side. I didn't actually read that too thoroughly.) I also had an idea for bots but it's not the best programming style - you might be able to have an &quot;item&quot; attached to all players, which would be considered a desirable pickup for bots, it's desirability waning as the player went out of view. I don't know if that would work or not but it might help the bots find the players and each other if their sightradius is reduced.

'''EntropicLqd:''' As far as I could tell I managed to get the replication working OK.  The problem with the lights isn't with &quot;non-light&quot; light producing actors as such.  There seem to be light map areas explicitly coded into the level, and you can't get a reference to them.  Antalus is an excellent example of this.  The outside area cannot be made dark as far as I can tell.

'''AlphaOne:''' What if you project a BLACK texture on ALL surfaces in the level?

'''Mysterial:''' EntropicLqd: If you mean ambient light, you can find and presumably alter that in the LevelInfo.

'''EntropicLqd:''' ''AlphaOne:'' An interesting idea.  I'm confident it wouldn't work as the light's I have left don't seem to be sourced from projectors - they are coming from somewhere else (possibly baked right into the texture).  The other problem with projecting a black texture over everything is that you'd never know where you were - the flashlight at least gives you the possibility of recognising where you are from the wall, floor, and ceiling textures.
:''Mysterial:'' The ambient light was easy to kill.  You have to turn it off on a zone by zone basis though.
: I've come to the conclusion that the only way to do this would be to create levels that are dark all over.  Much like the original DarkMatch idea in Unreal.  Which is a shame.  I'll post a URL to the code that I've written once I've got it uploaded so that other people can have a look at it.

'''Mysterial:''' The ambient light in the LevelInfo controls zones without a ZoneInfo, which I *think* the outdoor area in Antalus is (sorry, I'm not able to check right now), so altering the LevelInfo's ambient light properties might fix your problem. (Sorry if you've already tried that - you mentioned playing with the ZoneInfos but not the LevelInfo)

'''oneirotekt:''' Hi folks, long time reader, first time contributor.  Until recently I worked at a company that licenses the Unreal tech, so I might have some helpful info.  Coding DarkMatch for UT2 is tough going because, as you've seen, setting every light in the level to LT_None doesn't work like it did in 436.  Staticmeshes are affected but terrain and BSP remain lit.

Useless trivia: There was some kinda change in the way terrain is drawn between builds 829 and 927, and ever after level designers lost the ability to paint colors in the RGB sections of a terrain layer (now only the alpha channel is used for layer opacity).  I have the feeling this has something to do with the new terrain system in which lighting is &quot;baked&quot; into the verts.

As for BSP surfaces (which are still very prevalent in UT2) there's no way to change the lightmap on-the-fly like there was in 436 (notice that most of the old LightEffect types don't work anymore).  I remember asking Andrew at one point if there was any way an LD or modder could access the level's lightmaps (because it really is just a DXT1, DXT3 or RGBA8 texture) and he said &quot;no, why would you want to do that?&quot;.  So that might be the final nail in DarkMatch's coffin.  However if you *could* figure out a way to access the lightmap, you could do something like replace it with a new Material that combines the old lightmap with a big black texture with Multiply blending.  That way shining a dynamic additive projector onto a BSP surface (I assume that's how you'd implement the spotlight) would reveal something instead of just remaining black.

Fundamental problems:
* Staticmeshes, Terrain and BSP are all lit in different ways
* Shining a nice bright additive projected texture onto something isn't the same as shining an Unreal light source onto it.
* There doesn't seem to be a way to change A) the level's BSP lightmap and B) the light values of terrain vertices.

mnyeah.

So right now the easy solution for DarkMatch seems to be, make new versions of the old levels (or new levels entirely) with no lighting at all, and then equip players with a nice little dynamic projector torch (a la the Bulldog headlight effect).  Opening up an existing UT2 map, removing the lights then recompiling and saving is trivial, but it means people would have to download new maps to play DarkMatch :(

'''RDGDanClark:''' This sounded interesting... I thought it might be cool to put it into a pickup that would turn all the lights dim for 30 seconds whenever you picked it up... so I was messing around and came up with this:

&lt;uscript&gt;
auto state Pickup
{
    function Touch( actor Other )
    {
        local xPawn P;
        local Light L;

        if ( ValidTouch(Other) )
        {
            foreach AllActors(class'Engine.Light', L)
            {
                    L.LightBrightness = 16;
            }
            AnnouncePickup(P);
            SetRespawn();
        }
    }
}
&lt;/uscript&gt;

...but it didn't work. The pickup appears, the message displays, but the lights don't go dim (and yes, I know I haven't put the 30 second limit in yet). I'm still kinda new, so if I'm missing something (and I must be), please let me know.

'''Foxpaw:''' The same problem that's been discussed all around here I think. Number 1, most lights are static &quot;I think&quot; so you can't really change settings on them. Number 2, the BSP isn't &quot;lit&quot; anymore per se. It's lit at map build time, and the lighting is saved into the level. Subsequent changes to the level's lighting has no effect on the BSPs lightmaps.

'''RDGDanClark:''' I see... okay, I knew there would be problems, I just thought I could try my hand at working through them. Someone slap me for not reading this entire page ::stupid::

'''RegularX:''' K, I'm cracking this back open for my new project - Defense Force Omega [http://forums.beyondunreal.com/showthread.php?t=120589 | WMP Forums].  So far, I'm having the most luck for using a static mesh (vs terrain) for large structures like mounds and buildings, and BSP for any large flat areas.  This avoids the basic problems of BSP in the new engine while also avoiding the vertex lighting issue of large static meshes.  Then I'm using the above idea of a black fog combined with ground that's actually somewhat lit.  Tossing the Flashlight from SquirrelZero, I've got a dark area in the background, with fairly lit area in the foreground, and projected light which lights most objects fairly well.  This is all custom maps, of course.  I'm still on the fence about the terrain vs. static mesh setup - but I also kinda hate the Terrain Editor, so I'm torn.  If I get something that really flies, I'll update here with the exact setup.

'''GRAF1K:''' I think you all are going at this in quite the wrong way &amp;ndash; wouldn't a player view fog similar to Screen Flashes do the job quite nicely? :-) You wouldn't need to make new maps, fiddle with existing ones, or anything like that. As for bot support, I had the same problem when I was coding an invisiblity pickup back in the days of UT, before the greatness that is UT2003. I never figured that out, but now there's the Invisibility adrenaline combo. You can find whatever that uses for bot support and ajust for distance by checking distance via the SightRadius property.

'''RegularX:''' NightVision of the xpaks does something similar with a HUD overlay, I think, that you'd get with a Screen Flash type effect.  It's not a bad approach, but it doesn't really come close to how the old Darkmatch used to look or feel.

'''GRAF1K:''' Hmmm... is that because it lacks distance to it?

'''RegularX:''' Yeah.  It's more of a lens than a light.  I mean, you can do some tricks to fade it out/etc.  NVision actually doubles up the sniper overlay so that the center is really clear but the edges get pretty hazy. Doc E has a tute on here that uses a slightly different, and probably more functional method. But it doesn't really replace dynamically lighting a dark room as you walk around.

'''GRAF1K:''' I think you misunderstand. I'm not talking about &quot;dynamically lighting a dark room&quot; as you put it, but simulating a dark/foggy room via a screen flash-type player-view fog. The torch would remain the same.

'''RegularX:''' Maybe I do misunderstand.  The torch/dynamic lighting is the big hurdle, and to get the same kinda of effect as Darkmatch, I think the dark room is a pre-req.  Adjusting the HUD can get results that do something similar still wouldn't look the same, I think.

'''Foxpaw:''' You are likely going to encounter a slight problem with using black fog or any kind of view modification. Black fog makes things farther from you appear darker. (However they may be silhouetted against the skybox depending on implementation.) However, you will not have players lit up in that sort of scenario. A player far away will not appear to have any light with them, they'll just be invisible in the darkness. So, although that allows you to see as if YOU had a light and were in the dark, there isn't really any way to make other players visible using that method. Also, if you use zone fog (as opposed to volume fog) you're going to end up clipping players who are out of view in the &quot;darkness&quot; anyway, so you wouldn't be able to see them even if you did have some way of &quot;lighting&quot; them.

Basically, I think that if you want to have a darkmatch kind of play, you will require either special pre-darkened maps to play it on, or you will need to do some native coding (and thus exclude linux and mac players) to remove the lightmaps on the BSP.

Or you could build your own software renderer from scratch within UnrealScript, but that would probrably be very slow.

'''GRAF1K:''' Our own software renderer? No thanks. :P Custom maps it is. :D

'''RegularX:''' Yeah, no kidding - anything with &quot;renderer&quot; in the phrase I leave up to the pros :).  You're right though, FP, the &quot;dark fog&quot; doesn't accurately portray dynamic lights outside your fog distance (I'm using a distance fog) - though this works OK for my DFO project as most of the things in the darkness will be monsters.  For players holding lights, I may give the light a corona just to have something &quot;shine&quot; in the darkness.

'''Foxpaw:''' What I actually meant by the type of fog is, you can have distance fog in volumes or zones in UT2003. If you make distance fog by setting the fog values in a volume, it colors things based on how far they are from the camera. Anything past the maximum fog distance is drawn completely the fog color, anything before the fog start is it's normal colors, and between the fog start and fog end it interpolates. With this setup, things will be silhouetted against the skybox. (not necessarily a bad thing)

You can also make fog by setting the fog values in the zones, in which case it clips things beyond the fog end distance. That's probrably bad if you want to use a corona to see distant players.

Personally, however, if it's an option I'd make custom maps with lower light levels on them. It will probrably look way better that way. (I'd think so anyway)

If you make the fog by 

'''RegularX:''' Oh, this is all custom map/gametype - no mutation here. Darkness isn't my problem, it's getting a good look and feel from lighting the darkness.  I will play with volume fog to compare/contrast with my current setup.

'''Foxpaw:''' Well, if seeing other players isn't really an issue, then black fog would work &quot;decent.&quot; However, it has it's disadvantages too, specifically that you wouldn't be able to see distant light sources. For the best effect I would think just using very few lights and some shadow projectors and such would be good. It would make a very &quot;aliens vs. predator&quot; kind of feel anyway. Once you start adding a flashlight into the mix it kind of takes away from the feeling of it. You could use a projector if it's like a tight-beam kind of flashlight, but for a spherical projection of light that wouldn't work as good.

'''RegularX:''' K, well I'm picking this back up again for my current stuff.  I've basically concurred that the best route is converted/custom maps.  At first I thought the best I could do to convert maps is open a map, save as, and then do a find on actor names to hunt down the lights.  No!  I was an idiot!  Experienced UnrealEd'rs will laugh at me and mock me and make fun of me in the streets!  You can delete all the lights in a map with just two console (that bar thingy at the bottom!):

ACTOR SELECT OFCLASS CLASS=Light

ACTOR DELETE

And bam.  No lights except for the ambient lighting of zones, etc.  I found it best to open the console window it self (that box thingy next to the white bar thingy), because that first command takes a while, so I kept thinking it wasn't working. But voila, instead of a buncha time to darken a map, this takes about a minute.  Thought I'd share for those who never got that intimate with the console functions.

'''T1:''' You don't need console commands for that... You can just click on a Light actor, right-click and choose &quot;Select all actors of class light&quot; or &quot;Select all light&quot; (I don't remember the exact wording) and then press delete.

'''OlympusMons:''' Hmm! Is there a way of making macro's for using unrealed using the console. Like make a file and read it in using unrealed. Forgive my stupidity I didnt know unrealed even had a console till a month or so ago. Ive been using it since ut2k3 :P

'''RegularX:''' [[Legacy:Binding_Editor_Commands|Binding_Editor_Commands]] is what you want.  And thanks, T1.  Figures gosh darnit that after figuring out the sneaky way that there is a SUPER sneaky way ;).  This is going to save me hours and hours.

'''MMIndustries:''' Hey. I have not posted here for a long time, but I thought I might share some insight on the darkmatch issue. A while ago I coded a darkmatch gametype. I found a few things to be evident:

1. you can't use pre-made levels. There is no way to remove the lighting from the entire level (bsp, terrain...) as far as I can tell.

2. If you do create cusom levels (since that is the only real solution) I found that using a dynamic projector as a flashlight worked best for a light. I coded the projector's rotation and other properties into the playercontroller, as well as an exec function to turn the light on and off. However, the dynamic projector approach has a few drawbacks: I looks fine on static meshes in the dark level, but once it pans over bsp that has no lights burned onto it during the final build in the editor, the effect is ruined. It seems that bsp that is not rendered with lights by the editor is stored as an ugly &quot;bleached out&quot; texture, ie. a complex yellow metal texture turns to a solid hue of yellow. I found that for the projector to effectively light the leve, I had to build exclusively with static meshes. I haven't tried this with terrain.

3. Maybe it's because I coded the projector into the playercontroller, but I found that during gameplay the framerates drop to next to nothing once you encounter a bot or (god forbid) fire up the minigun.

4. Despite my best efforts, I could not find a way to get the darn bots to cooperate with the darkmatch theme.

I'll check to see if I still even have the code if anyone wants a look at it.

'''RegularX:'''  I've stopped using projectors for a simple lit actor, set to DT_NONE, tied to the front of a trace.  It's much less code and seems more efficient, though I admit it lacks the pleasing look of a projector.  My bot code is shaping up, but I'm doing other things (like trying to set cover/hold points) which seem to be confusing it.  I seem to be straying away from a pure Darkmatch.  I might get bored and try to put a sample together with pure dark again.

'''DaWrecka:''' MMIndustries: I'd say building it into the PC probably is your problem. I've got a dynamic projector attached to an assault rifle, and in my DM-DK-Compressed (A version of DM-Compressed in which I painstakingly reduced every light actor's LightBrightness by a factor of 10 - yeah I know, I just thought it'd look better than deleting them all or setting them all to the same low LightBrightness - doesn't seem to be the case) I could point it at bots and there was no perceptible slowdown at all.

==Related Links==
[http://hellokittydigitalcamera.net/ '''hello kitty digital camera''']</text>
    </revision>
    <revision>
      <id>43614</id>
      <timestamp>2010-07-06T07:47:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Vsimon213|Vsimon213]] ([[User talk:Vsimon213|Talk]]) to last revision by [[User:DaWrecka|DaWrecka]]</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Darkmatch Tribute - because it rocks}}

==Description ==

Eavy's Darkmatch 3 is probably one of my favourite mods for UT.  Assuming Eavy doesn't beat me to it and ship a darkmatch mutator with UT2003, I'll write one.  It turns out the lights and gives every player a torch.  The following applies:
* The brightness of the torch is configurable.
* The radius of the torch light is configurable.
* An option can be enabled that will make players glow with their team colour.

I realise that I've removed the &quot;turn torch on/off&quot; options from the original but I never saw the point in it, and certainly when we tried it found that it made no difference to the game - in fact, it made it less exciting.

====Links ====

[http://mimesis.csc.ncsu.edu/ClassReference/UnrealI.DarkMatch.html the original DarkMatch code]

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; Oh yeah, Darkmatch rocks but too much will fritz your eyes.
* [[Legacy:AlphaOne|AlphaOne]] &amp;ndash; I wonder how 1337 will it be to play DarkMatch at night, in a dark room, with Surround sound!?

==Discussion ==

'''AlphaOne:''' Can anyone get the original code from UT?

Also, Is it better to have a mutator for darkmatch or a separate game type, or both?

Is it possible to use the fog (black in colour) in the game to speed up the rendering of invisible things?

By looking at the code it can be seen that the lights in the levels must have been turned OFF in the UED.

I want to add one more thing to this game type: Reduce the visibility of bots, or to make them see only very close to themselves. To simulate the darkness effect.

'''Wormbo:''' Black fog != no light. But a Fog Match would be interesting, too... ;)  For the code just download Eavy DarkMatch. The basic idea behind it was this little loop:

&lt;uscript&gt;
	ForEach AllActors(class'Engine.Light', L)
		L.LightType = LT_None;
&lt;/uscript&gt;

'''EntropicLqd:''' lol - Yeah - but he did have some other handling for sky boxes and stuff.  Hmmmm, a fog match.  That might be pretty weird.  Configurable min/max distances set across all the zones.  Should be easy.  It's better if you make the DarkMatch mod a mutator.  That way it can be used with all of the game types.  Are you likely to write this in the next couple of weeks?  My Mayhem mod has got a bit bogged down and I need to take a break from it.

'''AlphaOne:''' ''(to EntropicLqd)'' Ya, I'll start working on it, now that I have my Christmas break. I don't quite get what you mean by the last sentence you wrote.

BTW: I could not get the code of Eavy DarkMatch, UED crashed when I tried loading the package. It would be great if you could post the code on this page.

I was thinking about changing the visibility of the player to bots. There could be two ways to do it: reduce bots SightRadius (more like the fog effect), or make the player less noticable to bots based on the amount of light the carry (like Eavy DarkMatch)

One last thing: Why did Epic release the new .UC and debug .U files? Could ppl. get thouse by just exporting the scripts?

'''Mychaeel:''' The source code exporter is broken (doesn't properly export private objects in property defaults).  Recompiling the engine packages in debug mode is outright impossible (or at least very, very impractical).

'''AlphaOne:''' IC - starting to download it...

'''AlphaOne:''' Anyways, what's the best way to deal with bots?

'''EntropicLqd:''' RE: My last sentence - I'm working on a mod that (for the time being at least) has ground to a bit of a halt while I make a couple of decisions.  Rather than have it bug me I'll make the decision while working on something else, that's a bit smaller.  Darkmatch was at the top of the list :).  If you want the Eavy Darkmatch code then you can grab the UT mutator from the maps n mods section of http://www.snout-clan.co.uk, install it, and then export it.  Failing that, drop me an e-mail and I'll pass it on.
: In terms of bots the original darkmatch doesn't bother doing anything with them - which isn't so bad since they never turn their lights out.  However, I was considering tweaking the AI to effectively reduce their sight FOV (but still allow them to hear players).

'''AlphaOne:''' the http://www.snout-clan.co.uk/ doesn't have the mod any more (broken link). I don't like the idea of turning off the lights because it makes it toooooo easy to cheat (like invisibility).

If you want to code DarkMatch then go ahead. I'm not going to compete with you or anything.

'''EntropicLqd:''' Right then .. I've put the mod back on the site - dunno why it went away but thanks for letting me know it was broken :).  It's worth pulling down and playing with.  If you are sure you don't want to do it then I'll pick it up, but you have first shout.  I'm not short of small mod ideas.  Your call.  And you could always disable the adrenaline moves you know.

'''AlphaOne:''' OK. I'll work on the mod. If I get really stuck then I'll ask you (or anyone else) for help. (BTW: what do adrenaline moves have to do with anything?)

'''EntropicLqd:''' Invisibility is an Adrenaline move - disable adrenaline, disable invisibility.  You inferred above that going invisible in a darkmatch was ''cheating''.  It would give you a hell of an advantage for sure.  Don't worry about it - I won't :)

'''AlphaOne:''' I just ran into a problem: When I set the LightType to none, only the (indicated by green lines in RMODE 1) static meshes become black. The lightmaps are still visible on the BSP brushes (indicated by white lines in RMODE 1).

'''EntropicLqd:''' Hmmm.  Sounds icky.  I've been playing aroud with the &quot;Fog Match&quot; idea proposed by Wormbo and I have similar problems.  Antalus looks pap because the meshes suddenly appear and the sky is always visible (it seems to be more of an occlusion problem.  Asbestos looks OK.  I'll have a think about your problem though - One presumes that the lightmaps are properties of the brush - if they are not declared as constant you might be able to null them out.

'''EntropicLqd:''' Well, I've sorted my problem - just had to increase the amount of fog in the skyzone until the sky is simply occluded by the fog.  Works well.  Antalus now looks cool.  Just need to sort out the bots now - sigh.

'''AlphaOne:''' For bots, just change their SightRadius to make it equal to the fog end distance (where clipping happens). I spent an hour looking for this variable and found it in the Bot class.

I also looked for lightmap variables in brushes, but could not find much. For some reason UnDox skips a lot of vars!??

OH, and btw, include the option to change the colour and the distance of the fog!

'''EntropicLqd:''' Would it be part of the materials section?  I dunno - not looked at it at all.  Options to change the colour, min fog distance, max fog distance are already in there (no config screen yet though).  Might also be worth tweaking the AI such that at distances close to the max fog distance it's slightly random as to whether they see you or not.

'''Wormbo:''' I noticed this skyzone fog problem when I experimented with distance fog and the &quot;set&quot; command on DM-Antalus a while back. I guess the skyzone needs the same fog color as the other zones and a minimal fog distance to look good.
: '''EntropicLqd:''' Indeed - I set the fog start distance to 0 and the fog distance to 32 in all sky zones.  It solves the problem beautifully.  Asbestos really rocks with loads of fog.  Anyways - I'm on holiday now so I'm in a non-UT2003 environment, but I'll finish the mutator off when I get back off holiday.  Might be worth setting up a &quot;mutator pack project&quot; (although project is possibly far to grand a word for it) for &quot;environment&quot; type mutators.  Fog match, Dark match, and any others we come up with (no falling damage, high gravity, .... ).

'''ZxAnPhOrIaN:''' I thought that bFogZone couldn't change during gameplay, cause it is a constant? (or maybe im thinking about the original UT)
:'''Wormbo:''' bFogZone != bDistanceFog :P All the distance fog related variables can be changed from UnrealScript, while bFogZone enables volumetric lighting in the zone.

'''ZxAnPhOrIaN:''' So bFogZone and bDistanceFog are diffrent, RIGHT!!!

'''ZxAnPhOrIaN:''' Like wormbo said above, &quot;Black fog != no light.&quot;, look at DM-Plunge for example, it uses black fog!

----

'''ZxAnPhOrIaN:'''  This mod should have darkness and fogness :) incorperated into it, namechange, maybe?

'''EntropicLqd:'''  2 years ago I would have agreed.  However, I've come to the conclusion that it's better to have many atomic mutators than one monster one.  Configuration for the &quot;dumb user&quot; becomes less of an issue that way.

----

'''AlphaOne:''' I like the idea of darkess+fogness. However, I still cannot find a way to &quot;turn off&quot; all the lights!

'''Tahngarth:''' fogmatch- that sounds fun :) just set the fog so that you can barely see 5 feet in front of you :P

'''AlphaOne:''' I tried the fogmatch myself. It is no fun with bots.

'''ZxAnPhOrIaN:''' Why? Can the bots see though the fog? Is it like you cant see him, but he can see you, type of situation?

'''AlphaOne:''' Yep. They can see me throught fog. They even snipe me sometimes out of nowhere. I tried lowering the bot's SightRadius. As a result I had to go around the map and LOOK for bots because they didn't see me.

'''ZxAnPhOrIaN:''' LOL, make the fog so dense that you cant see a foot away from you and make a bot snipe you from a mile away!!!

----

'''EntropicLqd:''' Right, I've finished my FogMatch mutator - I've given up trying to get the bots to work right with it :(.  How's the DarkMatch mutator coming on?  Still got that light-map problem?

'''AlphaOne:''' Yep. I kind of abandoned the DarkMatch idea for now. Maybe you could give it a try?

'''EntropicLqd:''' Yeah - love to.  Would it be worth me taking on any code you've written already?  If you think it would be then e-mail it to me on entropic@snout-clan.co.uk.  If I don't hear anything in the next 2-4 days I'll start from scratch anyways.  Cheers.

'''Tarquin:''' hasn't this neem made? I got a huge pack of mutators from BU last week that had something with dark. not tested it tho. the xxxpak it's called

'''Wormbo:''' Yup, RegularX put a &quot;Night Watch&quot; mutator in his [http://inkless.com/xpak.html XXXPak]. (actually a combination of his previous XPak 1, 2 &amp; 3 mutator packs) I don't know about bot support, though.

'''Tarquin:''' NightWatch is not very good. Try it on DM-Antalus. Areas of terrain are too bright, and you don't feel like you're using a torch. There's NightVision in the same pack. Way too dark. I don't thie bots are affected by either.

'''EntropicLqd:''' Having the bots affected by darkness (or in my case fog) is a right bugger.  I still haven't worked out how to do it.  Every now and then I have a trawl through the code to see if I can find it but so far I've drawn a complete blank.  I have a couple of theories but none of them are particularly palatable (ie. damn hard to code around).  I've mailed DrSin to see if he can pass on the query to Steve Polge but not had anything back yet.  I'll have to check out the XXX mutator pack though.

'''Tarquin:''' How does fog affect bots?

'''Wormbo:''' They aren't affected at all, that's the problem.

'''EntropicLqd:''' Tarquin - check out the [[Legacy:Help Desk|Help Desk]] page.  I have an outstanding problem on there all about it.  It's a right teaser.

'''EntropicLqd''' I checked out Nightwatch .. I have exactly the same problem on Antalus.  I need to know how terrain works - and where the texture proerties come from.  I'm happy with the way my objects appear, I've got rid of all projectors (and possibly light maps), but the terrain .... arrrgh.  I guess it may not be possible to do a &quot;darkmatch&quot; in outside maps in UT2003 simply because of the way the engine works.  There's also some other funnies on Antalus - but I suspect it's where the lighting has been forced into the texture itself - and I really need to change the surface properties of the faces.  No chance of that in UScript.

'''RegularX:''' NightWatch appeared to be doomed on two fronts: 1) online at either the mutator or gametype level the changes to the lights didn't appear to replicate.  2) Certain lighting features (like on Antalus) didn't seem to be found no matter how many different things I tried to Zones, etc.  NightVision was meant to be it's simpler, more net friendly replacement since it basically is just a HUD interaction - but I didn't have time to put in all the options to customize it/special effects in before releasing for Xmas, hence the being stuck with the dreary blue.  And there is no bot support for either one - and in Nightwatch I didn't have time to adjust the Bot's view to line up the &quot;torch&quot;.

'''Foxpaw:''' I haven't seen the code you are using but I think that the problem you may be having with lights not being squelched may be related to the fact that an object does not have to be a &quot;light&quot; to light up. Any kind of actor can be lit as far as I know. Those leftover lights may be other actors set to have a light. Replication is indeed tricky, I had an idea but it isn't compatible with my idea on squelching non-&quot;light&quot; lights. To replicate the changes in lights I would recommend subclassing light and using the mutator to replace all instances of light with your altered light class. Once you have your own light class you should be able to replicate a variable to indicate the light's status, something like the Redeemer in UT. (How it replicates a copy of Location and Rotation, then applies it server-side. I think it's server-side. I didn't actually read that too thoroughly.) I also had an idea for bots but it's not the best programming style - you might be able to have an &quot;item&quot; attached to all players, which would be considered a desirable pickup for bots, it's desirability waning as the player went out of view. I don't know if that would work or not but it might help the bots find the players and each other if their sightradius is reduced.

'''EntropicLqd:''' As far as I could tell I managed to get the replication working OK.  The problem with the lights isn't with &quot;non-light&quot; light producing actors as such.  There seem to be light map areas explicitly coded into the level, and you can't get a reference to them.  Antalus is an excellent example of this.  The outside area cannot be made dark as far as I can tell.

'''AlphaOne:''' What if you project a BLACK texture on ALL surfaces in the level?

'''Mysterial:''' EntropicLqd: If you mean ambient light, you can find and presumably alter that in the LevelInfo.

'''EntropicLqd:''' ''AlphaOne:'' An interesting idea.  I'm confident it wouldn't work as the light's I have left don't seem to be sourced from projectors - they are coming from somewhere else (possibly baked right into the texture).  The other problem with projecting a black texture over everything is that you'd never know where you were - the flashlight at least gives you the possibility of recognising where you are from the wall, floor, and ceiling textures.
:''Mysterial:'' The ambient light was easy to kill.  You have to turn it off on a zone by zone basis though.
: I've come to the conclusion that the only way to do this would be to create levels that are dark all over.  Much like the original DarkMatch idea in Unreal.  Which is a shame.  I'll post a URL to the code that I've written once I've got it uploaded so that other people can have a look at it.

'''Mysterial:''' The ambient light in the LevelInfo controls zones without a ZoneInfo, which I *think* the outdoor area in Antalus is (sorry, I'm not able to check right now), so altering the LevelInfo's ambient light properties might fix your problem. (Sorry if you've already tried that - you mentioned playing with the ZoneInfos but not the LevelInfo)

'''oneirotekt:''' Hi folks, long time reader, first time contributor.  Until recently I worked at a company that licenses the Unreal tech, so I might have some helpful info.  Coding DarkMatch for UT2 is tough going because, as you've seen, setting every light in the level to LT_None doesn't work like it did in 436.  Staticmeshes are affected but terrain and BSP remain lit.

Useless trivia: There was some kinda change in the way terrain is drawn between builds 829 and 927, and ever after level designers lost the ability to paint colors in the RGB sections of a terrain layer (now only the alpha channel is used for layer opacity).  I have the feeling this has something to do with the new terrain system in which lighting is &quot;baked&quot; into the verts.

As for BSP surfaces (which are still very prevalent in UT2) there's no way to change the lightmap on-the-fly like there was in 436 (notice that most of the old LightEffect types don't work anymore).  I remember asking Andrew at one point if there was any way an LD or modder could access the level's lightmaps (because it really is just a DXT1, DXT3 or RGBA8 texture) and he said &quot;no, why would you want to do that?&quot;.  So that might be the final nail in DarkMatch's coffin.  However if you *could* figure out a way to access the lightmap, you could do something like replace it with a new Material that combines the old lightmap with a big black texture with Multiply blending.  That way shining a dynamic additive projector onto a BSP surface (I assume that's how you'd implement the spotlight) would reveal something instead of just remaining black.

Fundamental problems:
* Staticmeshes, Terrain and BSP are all lit in different ways
* Shining a nice bright additive projected texture onto something isn't the same as shining an Unreal light source onto it.
* There doesn't seem to be a way to change A) the level's BSP lightmap and B) the light values of terrain vertices.

mnyeah.

So right now the easy solution for DarkMatch seems to be, make new versions of the old levels (or new levels entirely) with no lighting at all, and then equip players with a nice little dynamic projector torch (a la the Bulldog headlight effect).  Opening up an existing UT2 map, removing the lights then recompiling and saving is trivial, but it means people would have to download new maps to play DarkMatch :(

'''RDGDanClark:''' This sounded interesting... I thought it might be cool to put it into a pickup that would turn all the lights dim for 30 seconds whenever you picked it up... so I was messing around and came up with this:

&lt;uscript&gt;
auto state Pickup
{
    function Touch( actor Other )
    {
        local xPawn P;
        local Light L;

        if ( ValidTouch(Other) )
        {
            foreach AllActors(class'Engine.Light', L)
            {
                    L.LightBrightness = 16;
            }
            AnnouncePickup(P);
            SetRespawn();
        }
    }
}
&lt;/uscript&gt;

...but it didn't work. The pickup appears, the message displays, but the lights don't go dim (and yes, I know I haven't put the 30 second limit in yet). I'm still kinda new, so if I'm missing something (and I must be), please let me know.

'''Foxpaw:''' The same problem that's been discussed all around here I think. Number 1, most lights are static &quot;I think&quot; so you can't really change settings on them. Number 2, the BSP isn't &quot;lit&quot; anymore per se. It's lit at map build time, and the lighting is saved into the level. Subsequent changes to the level's lighting has no effect on the BSPs lightmaps.

'''RDGDanClark:''' I see... okay, I knew there would be problems, I just thought I could try my hand at working through them. Someone slap me for not reading this entire page ::stupid::

'''RegularX:''' K, I'm cracking this back open for my new project - Defense Force Omega [http://forums.beyondunreal.com/showthread.php?t=120589 | WMP Forums].  So far, I'm having the most luck for using a static mesh (vs terrain) for large structures like mounds and buildings, and BSP for any large flat areas.  This avoids the basic problems of BSP in the new engine while also avoiding the vertex lighting issue of large static meshes.  Then I'm using the above idea of a black fog combined with ground that's actually somewhat lit.  Tossing the Flashlight from SquirrelZero, I've got a dark area in the background, with fairly lit area in the foreground, and projected light which lights most objects fairly well.  This is all custom maps, of course.  I'm still on the fence about the terrain vs. static mesh setup - but I also kinda hate the Terrain Editor, so I'm torn.  If I get something that really flies, I'll update here with the exact setup.

'''GRAF1K:''' I think you all are going at this in quite the wrong way &amp;ndash; wouldn't a player view fog similar to Screen Flashes do the job quite nicely? :-) You wouldn't need to make new maps, fiddle with existing ones, or anything like that. As for bot support, I had the same problem when I was coding an invisiblity pickup back in the days of UT, before the greatness that is UT2003. I never figured that out, but now there's the Invisibility adrenaline combo. You can find whatever that uses for bot support and ajust for distance by checking distance via the SightRadius property.

'''RegularX:''' NightVision of the xpaks does something similar with a HUD overlay, I think, that you'd get with a Screen Flash type effect.  It's not a bad approach, but it doesn't really come close to how the old Darkmatch used to look or feel.

'''GRAF1K:''' Hmmm... is that because it lacks distance to it?

'''RegularX:''' Yeah.  It's more of a lens than a light.  I mean, you can do some tricks to fade it out/etc.  NVision actually doubles up the sniper overlay so that the center is really clear but the edges get pretty hazy. Doc E has a tute on here that uses a slightly different, and probably more functional method. But it doesn't really replace dynamically lighting a dark room as you walk around.

'''GRAF1K:''' I think you misunderstand. I'm not talking about &quot;dynamically lighting a dark room&quot; as you put it, but simulating a dark/foggy room via a screen flash-type player-view fog. The torch would remain the same.

'''RegularX:''' Maybe I do misunderstand.  The torch/dynamic lighting is the big hurdle, and to get the same kinda of effect as Darkmatch, I think the dark room is a pre-req.  Adjusting the HUD can get results that do something similar still wouldn't look the same, I think.

'''Foxpaw:''' You are likely going to encounter a slight problem with using black fog or any kind of view modification. Black fog makes things farther from you appear darker. (However they may be silhouetted against the skybox depending on implementation.) However, you will not have players lit up in that sort of scenario. A player far away will not appear to have any light with them, they'll just be invisible in the darkness. So, although that allows you to see as if YOU had a light and were in the dark, there isn't really any way to make other players visible using that method. Also, if you use zone fog (as opposed to volume fog) you're going to end up clipping players who are out of view in the &quot;darkness&quot; anyway, so you wouldn't be able to see them even if you did have some way of &quot;lighting&quot; them.

Basically, I think that if you want to have a darkmatch kind of play, you will require either special pre-darkened maps to play it on, or you will need to do some native coding (and thus exclude linux and mac players) to remove the lightmaps on the BSP.

Or you could build your own software renderer from scratch within UnrealScript, but that would probrably be very slow.

'''GRAF1K:''' Our own software renderer? No thanks. :P Custom maps it is. :D

'''RegularX:''' Yeah, no kidding - anything with &quot;renderer&quot; in the phrase I leave up to the pros :).  You're right though, FP, the &quot;dark fog&quot; doesn't accurately portray dynamic lights outside your fog distance (I'm using a distance fog) - though this works OK for my DFO project as most of the things in the darkness will be monsters.  For players holding lights, I may give the light a corona just to have something &quot;shine&quot; in the darkness.

'''Foxpaw:''' What I actually meant by the type of fog is, you can have distance fog in volumes or zones in UT2003. If you make distance fog by setting the fog values in a volume, it colors things based on how far they are from the camera. Anything past the maximum fog distance is drawn completely the fog color, anything before the fog start is it's normal colors, and between the fog start and fog end it interpolates. With this setup, things will be silhouetted against the skybox. (not necessarily a bad thing)

You can also make fog by setting the fog values in the zones, in which case it clips things beyond the fog end distance. That's probrably bad if you want to use a corona to see distant players.

Personally, however, if it's an option I'd make custom maps with lower light levels on them. It will probrably look way better that way. (I'd think so anyway)

If you make the fog by 

'''RegularX:''' Oh, this is all custom map/gametype - no mutation here. Darkness isn't my problem, it's getting a good look and feel from lighting the darkness.  I will play with volume fog to compare/contrast with my current setup.

'''Foxpaw:''' Well, if seeing other players isn't really an issue, then black fog would work &quot;decent.&quot; However, it has it's disadvantages too, specifically that you wouldn't be able to see distant light sources. For the best effect I would think just using very few lights and some shadow projectors and such would be good. It would make a very &quot;aliens vs. predator&quot; kind of feel anyway. Once you start adding a flashlight into the mix it kind of takes away from the feeling of it. You could use a projector if it's like a tight-beam kind of flashlight, but for a spherical projection of light that wouldn't work as good.

'''RegularX:''' K, well I'm picking this back up again for my current stuff.  I've basically concurred that the best route is converted/custom maps.  At first I thought the best I could do to convert maps is open a map, save as, and then do a find on actor names to hunt down the lights.  No!  I was an idiot!  Experienced UnrealEd'rs will laugh at me and mock me and make fun of me in the streets!  You can delete all the lights in a map with just two console (that bar thingy at the bottom!):

ACTOR SELECT OFCLASS CLASS=Light

ACTOR DELETE

And bam.  No lights except for the ambient lighting of zones, etc.  I found it best to open the console window it self (that box thingy next to the white bar thingy), because that first command takes a while, so I kept thinking it wasn't working. But voila, instead of a buncha time to darken a map, this takes about a minute.  Thought I'd share for those who never got that intimate with the console functions.

'''T1:''' You don't need console commands for that... You can just click on a Light actor, right-click and choose &quot;Select all actors of class light&quot; or &quot;Select all light&quot; (I don't remember the exact wording) and then press delete.

'''OlympusMons:''' Hmm! Is there a way of making macro's for using unrealed using the console. Like make a file and read it in using unrealed. Forgive my stupidity I didnt know unrealed even had a console till a month or so ago. Ive been using it since ut2k3 :P

'''RegularX:''' [[Legacy:Binding_Editor_Commands|Binding_Editor_Commands]] is what you want.  And thanks, T1.  Figures gosh darnit that after figuring out the sneaky way that there is a SUPER sneaky way ;).  This is going to save me hours and hours.

'''MMIndustries:''' Hey. I have not posted here for a long time, but I thought I might share some insight on the darkmatch issue. A while ago I coded a darkmatch gametype. I found a few things to be evident:

1. you can't use pre-made levels. There is no way to remove the lighting from the entire level (bsp, terrain...) as far as I can tell.

2. If you do create cusom levels (since that is the only real solution) I found that using a dynamic projector as a flashlight worked best for a light. I coded the projector's rotation and other properties into the playercontroller, as well as an exec function to turn the light on and off. However, the dynamic projector approach has a few drawbacks: I looks fine on static meshes in the dark level, but once it pans over bsp that has no lights burned onto it during the final build in the editor, the effect is ruined. It seems that bsp that is not rendered with lights by the editor is stored as an ugly &quot;bleached out&quot; texture, ie. a complex yellow metal texture turns to a solid hue of yellow. I found that for the projector to effectively light the leve, I had to build exclusively with static meshes. I haven't tried this with terrain.

3. Maybe it's because I coded the projector into the playercontroller, but I found that during gameplay the framerates drop to next to nothing once you encounter a bot or (god forbid) fire up the minigun.

4. Despite my best efforts, I could not find a way to get the darn bots to cooperate with the darkmatch theme.

I'll check to see if I still even have the code if anyone wants a look at it.

'''RegularX:'''  I've stopped using projectors for a simple lit actor, set to DT_NONE, tied to the front of a trace.  It's much less code and seems more efficient, though I admit it lacks the pleasing look of a projector.  My bot code is shaping up, but I'm doing other things (like trying to set cover/hold points) which seem to be confusing it.  I seem to be straying away from a pure Darkmatch.  I might get bored and try to put a sample together with pure dark again.

'''DaWrecka:''' MMIndustries: I'd say building it into the PC probably is your problem. I've got a dynamic projector attached to an assault rifle, and in my DM-DK-Compressed (A version of DM-Compressed in which I painstakingly reduced every light actor's LightBrightness by a factor of 10 - yeah I know, I just thought it'd look better than deleting them all or setting them all to the same low LightBrightness - doesn't seem to be the case) I could point it at bots and there was no perceptible slowdown at all.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Deadman Launcher</title>
    <id>1928</id>
    <revision>
      <id>4721</id>
      <timestamp>2004-12-06T02:45:33Z</timestamp>
      <contributor>
        <ip>Camper At Heart</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Deadman launcher}}

==Description ==

Nothing much to explain I suppose, exept that you'd launch Ragdoll'ish dead bodies from guns to inflict damage on you opponent (according to the speed of the flailing limbs flying at you!), I dont know about you, but that sounds like fun.

'''C&amp;ndash;B:'''

'''Camper at Heart:''' Here's the BodyLauncher 1.0 from ZedLep...(ripped from the package by the only way I know how) I put it here because it's a good idea that I'd like to see work but it doesn't function. I put the error below in the discussion section.

&lt;uscript&gt;
class BodyFire extends FlakAltFire;

function projectile SpawnProjectile(Vector Start, Rotator Dir)
{
    local xPawn p;
    local vector vec;//, hitloc, hitnorm;
    local rotator dir1;

    Dir1=Dir;
    Dir1.Pitch=0;
    vec=Start+Vector(Dir1)*class'xPawn'.Default.CollisionRadius*BodyWeapon(Weapon).InitScale*1.07;
    
    p = Spawn(class'xPawn',,, vec, Dir);

    if( p == None )
        return None;

    AdjustPawn(p);
    
    P.Velocity=Vector(Dir)*BodyWeapon(Weapon).BodyLaunchVel+Weapon.Owner.Velocity;
    P.PlayDying(class'DamageType', vec);
    
    //AdjustPawn(p);
    return none;
}

function AdjustPawn(xpawn p)
{
	local DMRosterConfigured tDM;
	local xRosterEntry Chosen;
	local int i;
	
	i=Int(FRand()*tDM.Characters.Length);
	tDM = Spawn(class'DMRosterConfigured');
	Chosen = xRosterEntry(DeathMatch(Level.Game).EnemyRoster.ChooseBotClass(tDM.Characters[i]));
	tDM.Destroy();
	if(Chosen==None)
		Return;
	P.LinkMesh(Mesh(DynamicLoadObject(Chosen.PlrProfile.MeshName, class'Mesh')));
	P.Skins[0]=Texture(DynamicLoadObject(Chosen.PlrProfile.BodySkinName, class'Texture'));
	P.Skins[1]=Texture(DynamicLoadObject(Chosen.PlrProfile.FaceSkinName, class'Texture'));
	P.SoundGroupClass=None;
	P.RagDeathUpKick=150;
	P.RagdollLifeSpan=30;
	P.RagSpinScale=2.5;
	P.RagInvInertia=16;
	P.PhysicsVolume.TerminalVelocity=BodyWeapon(Weapon).BodyLaunchVel;
	P.AirSpeed=BodyWeapon(Weapon).BodyLaunchVel;
	P.WaterSpeed=BodyWeapon(Weapon).BodyLaunchVel;
	P.GroundSpeed=BodyWeapon(Weapon).BodyLaunchVel;
	P.AccelRate=BodyWeapon(Weapon).BodyLaunchVel;
}

simulated function bool AllowFire()
{
    return True;
}
&lt;/uscript&gt;

&lt;uscript&gt;
class BodyWeapon extends FlakCannon;

var float BodyLaunchVel, InitScale;

function PostBeginPlay()
{
	//local PhysicsVolume PV;
	
	Super.PostBeginPlay();
	Level.MaxRagdolls=32;
	/*
	ForEach AllActors(Class'PhysicsVolume',PV)
		PV.TerminalVelocity=20000;
	*/
}

function BLVChange()
{
	Level.Game.BroadcastHandler.Broadcast(None, &quot;Body Launch Velocity is now at&quot;@BodyLaunchVel);
}

          gUTF8_REPLACEMENTclass BodyFireSpeed extends ProjectileFire;

function projectile SpawnProjectile(Vector Start, Rotator Dir)
{
	BodyWeapon(Weapon).BodyLaunchVel+=2000;
	if(BodyWeapon(Weapon).BodyLaunchVel&gt;20000)
		BodyWeapon(Weapon).BodyLaunchVel=4000;
	BodyWeapon(Weapon).BLVChange();
	Return None;
}

simulated function bool AllowFire()
{
    return True;
}
&lt;/uscript&gt;

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''C&amp;ndash;B:''': Seeing as how I dont actually own UT2003, I wouldnt be able to really do anything, But I just think it would be a great thing to have (My name is supposed to be in lower-case, oh well.).

'''ZxAnPhOrIaN:''' ...thinks about the [[Wikipedia:Gary Larson]] ''The Far Side'' Cartoon about the Dobie-o-matic... ;)

'''DJPaul:''' I think this mod has been done or in development.  anyone got a URL?

'''Daid303:''' It's the body launcher, made by ZedLep, I found a link [http://www.unreality.dk/files/files_show.asp?mode=FileShow&amp;fileID=68 here]

'''Camper at Heart:''' ZedLep's bodylauncher doesn't appear to work in UT2K4. Gives me, at least, a general

protection fault when I attempt to use it. Anyone know enough to try to fix it or tell me I'm the only one

with a problem?

General protection fault!

History: UObject::ProcessEvent &lt;- (BodyFire DM-1on1-Albatross.BodyWeapon.BodyFire0, Function Engine.WeaponFire.ModeDoFire) &lt;- UWeaponFire::ModeTick &lt;- AActor::Tick &lt;- TickAllActors &lt;- ULevel::Tick &lt;- (NetMode=0) &lt;- TickLevel &lt;- UGameEngine::Tick &lt;- Level Albatross &lt;- UpdateWorld &lt;- MainLoop &lt;- FMallocWindows::Free &lt;- FMallocWindows::Realloc &lt;- 676F4C57 0 FArray &lt;- FArray::Realloc &lt;- 0*2 &lt;- FMallocWindows::Free</text>
    </revision>
    <revision>
      <id>4722</id>
      <timestamp>2004-12-05T23:34:13Z</timestamp>
      <contributor>
        <ip>Ool-43549b14.dyn.optonline.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Deadman launcher}}

==Description ==

Nothing much to explain I suppose, exept that you'd launch Ragdoll'ish dead bodies from guns to inflict damage on you opponent (according to the speed of the flailing limbs flying at you!), I dont know about you, but that sounds like fun.

'''C&amp;ndash;B:'''

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''C&amp;ndash;B:''': Seeing as how I dont actually own UT2003, I wouldnt be able to really do anything, But I just think it would be a great thing to have (My name is supposed to be in lower-case, oh well.).

'''ZxAnPhOrIaN:''' ...thinks about the [[Wikipedia:Gary Larson]] ''The Far Side'' Cartoon about the Dobie-o-matic... ;)

'''DJPaul:''' I think this mod has been done or in development.  anyone got a URL?

'''Daid303:''' It's the body launcher, made by ZedLep, I found a link [http://www.unreality.dk/files/files_show.asp?mode=FileShow&amp;fileID=68 here]

'''Anonymous:''' ZedLep's bodylauncher doesn't appear to work in UT2K4. Gives me, at least, a general

protection fault when I attempt to use it. Anyone know enough to try to fix it or tell me I'm the only one

with a problem?</text>
    </revision>
    <revision>
      <id>4723</id>
      <timestamp>2004-12-06T00:45:35Z</timestamp>
      <contributor>
        <ip>Camper At Heart</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Deadman launcher}}

==Description ==

Nothing much to explain I suppose, exept that you'd launch Ragdoll'ish dead bodies from guns to inflict damage on you opponent (according to the speed of the flailing limbs flying at you!), I dont know about you, but that sounds like fun.

'''C&amp;ndash;B:'''

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''C&amp;ndash;B:''': Seeing as how I dont actually own UT2003, I wouldnt be able to really do anything, But I just think it would be a great thing to have (My name is supposed to be in lower-case, oh well.).

'''ZxAnPhOrIaN:''' ...thinks about the [[Wikipedia:Gary Larson]] ''The Far Side'' Cartoon about the Dobie-o-matic... ;)

'''DJPaul:''' I think this mod has been done or in development.  anyone got a URL?

'''Daid303:''' It's the body launcher, made by ZedLep, I found a link [http://www.unreality.dk/files/files_show.asp?mode=FileShow&amp;fileID=68 here]

'''Camper at Heart:''' ZedLep's bodylauncher doesn't appear to work in UT2K4. Gives me, at least, a general

protection fault when I attempt to use it. Anyone know enough to try to fix it or tell me I'm the only one

with a problem?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Decal Match</title>
    <id>1943</id>
    <revision>
      <id>4758</id>
      <timestamp>2003-05-21T21:38:40Z</timestamp>
      <contributor>
        <ip>Mysterial</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

It gives more decals from weapons. Some weapons and projectiles don't produce decals. This will solve that. I WANT MY POCK MARKS BACK!!!

This mod will also prolong how long decals will stay on surfaces.

==Interested Scripters ==

==Discussion ==

'''DJPaul:''' Yes.  Well.  Great page..

'''Mysterial:''' I made a mutator a while back that adds decals from the assault rifle, minigun, and flak cannon: http://www.error691.com/mysterial/UTMods.htm</text>
    </revision>
    <revision>
      <id>4759</id>
      <timestamp>2003-04-03T15:59:09Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <comment>vubbishy page</comment>
      <text xml:space="preserve">==Description ==

It gives more decals from weapons. Some weapons and projectiles don't produce decals. This will solve that. I WANT MY POCK MARKS BACK!!!

This mod will also prolong how long decals will stay on surfaces.

==Interested Scripters ==

==Discussion ==

'''DJPaul:''' Yes.  Well.  Great page..</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Descent Mod</title>
    <id>1945</id>
    <revision>
      <id>4763</id>
      <timestamp>2005-10-27T23:37:14Z</timestamp>
      <contributor>
        <ip>208.247.adsl.brightview.com</ip>
      </contributor>
      <comment>Added more bloggyness</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.</text>
    </revision>
    <revision>
      <id>4764</id>
      <timestamp>2004-08-10T17:02:33Z</timestamp>
      <contributor>
        <ip>MjrHuRTz</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)</text>
    </revision>
    <revision>
      <id>42608</id>
      <timestamp>2010-03-10T01:11:40Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <comment>Another Unreal Descent Mod effort!</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have developing an independent 'Unreal Descent Mod: Frantic123' to incorporate all 3 versions, 1 &amp; 2 to be the classic game mode versions will 3 will be the main part of the mod.

===Planned Development===
 My hope is to design the team efforts to be open ended, with team members coming and going - and content servers with mirrors so new artists won't necessarily have to contact the previous developers to get access to adding content to the mod.
So if they have the resources, and want to help - they can repost the mod content on their or other site and post a link to it here so wiki members can see whats being done.</text>
    </revision>
    <revision>
      <id>42609</id>
      <timestamp>2010-03-10T01:13:07Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <minor/>
      <comment>/* Planned Development */</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have developing an independent 'Unreal Descent Mod: Frantic123' to incorporate all 3 versions, 1 &amp; 2 to be the classic game mode versions will 3 will be the main part of the mod.

===Planned Development===

My hope is to design the team efforts to be open ended, with team members
 coming and going - and content servers with mirrors so new artists won't
 necessarily have to contact the previous developers to get access to
 adding content to the mod.
So if they have the resources, and want to help - they can re-post the mod
 content on their or other site and post a link to it here so wiki members
 can see whats being done.</text>
    </revision>
    <revision>
      <id>42610</id>
      <timestamp>2010-03-10T01:14:23Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have been developing an independent 'Unreal Descent Mod: Frantic123' to incorporate all 3 versions, 1 &amp; 2 to be the classic game mode versions will 3 will be the main part of the mod.

===Planned Development===

My hope is to design the team efforts to be open ended, with team members
 coming and going - and content servers with mirrors so new artists won't
 necessarily have to contact the previous developers to get access to
 adding content to the mod.
So if they have the resources, and want to help - they can re-post the mod
 content on their or other site and post a link to it here so wiki members
 can see whats being done.</text>
    </revision>
    <revision>
      <id>42611</id>
      <timestamp>2010-03-10T01:17:05Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <comment>/* Planned Development */</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have been developing an independent 'Unreal Descent Mod: Frantic123' to incorporate all 3 versions, 1 &amp; 2 to be the classic game mode versions will 3 will be the main part of the mod.

===Planned Development===

My hope is to design the team efforts to be open ended, with team members
 coming and going - and content servers with mirrors so new artists won't
 necessarily have to contact the previous developers to get access to
 adding content to the mod.
So if they have the resources, and want to help - they can re-post the mod
 content on their or other site and post a link to it here so wiki members
 can see whats being done.
An extension to my efforts can be viewed on my xfire blog:
http://www.xfire.com/blog/1devilishdude/1744836/</text>
    </revision>
    <revision>
      <id>42636</id>
      <timestamp>2010-03-17T05:44:19Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <comment>/* Planned Development */</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have been developing an independent 'Unreal Descent Mod: Frantic123' to incorporate all 3 versions, 1 &amp; 2 to be the classic game mode versions will 3 will be the main part of the mod.

===Planned Development===
My hope is to design the team efforts as open ended, with team members coming and going - and content servers with mirrors so new artists won't necessarily have to contact the previous developers to get access to adding/editing and improving the content for the mod.
So if they have the resources, and want to help - they can re-post the mod content on their or other site and post a link to it here so wiki members can see whats being done.
An extension to my efforts can be viewed on my xfire blog: http://www.xfire.com/blog/1devilishdude/1744836/</text>
    </revision>
    <revision>
      <id>42637</id>
      <timestamp>2010-03-17T05:48:22Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <minor/>
      <comment>clean up</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy realocation and i have the ship Rolling about as if it was a plane, its really weird being able to roll in UT tell ya the truth... what i am left with now is the HUD and some minor replication problems. In the weapon's case i dont even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about settip up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we we would have people playing FreeSpace against eachother in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionallity such as rollling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant deside between them. What i said about replication not being finished, i only ment some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instand rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have been developing an 'Unreal Descent Mod: Frantic123' to incorporate all 3 versions, 1 &amp; 2 to be the classic game modes and 3 will be the main part of the mod.

===Planned Development===
My hope is to design the team efforts as open ended, with team members coming and going - and content servers with mirrors so new artists won't necessarily have to contact the previous developers to get access to adding/editing and improving the content for the mod.
So if they have the resources, and want to help - they can re-post the mod content on their or other site and post a link to it here so wiki members can see whats being done.
An extension to my efforts can be viewed on my xfire blog:
 http://www.xfire.com/blog/1devilishdude/1744836/</text>
    </revision>
    <revision>
      <id>44125</id>
      <timestamp>2010-11-24T02:54:08Z</timestamp>
      <contributor>
        <username>LiKeMiKeS</username>
        <id>1428</id>
      </contributor>
      <comment>/* Comments? */  Just fine tuning a few mentions and spell checking</comment>
      <text xml:space="preserve">==Idea ==

===Intro ===

Well, I was starting to get hooked to those old [http://www.planetdescent.com Descent] games again, and I thought about how great it would be if they looked better... :)

The basic idea is to re-create the interface and gameplay of the Descent games, starting with the player physics and interface and hopefully concluding with a fully featured TC with Robot AI, cool ship models and great Single &amp; Multiplayer maps.

===Why Descent? ===

Descent really was a milestone for me as a gamer... it required you to think in all three dimensions, keep track of what happened all around you. In today's ego shooters, you're mostly limited to front, back, sides and what people call Z-Axis. In Descent, there was no floor or ceiling. :) Think about what possibilities this offers for gameplay-oriented deathmatch mappers. Some may like it, some won't... but it'll definitely be original.

===Terrain ===

Descent 3's missions partly took place on the planet surfaces, unlike its two predecessors which took place entirely indoors. I think the Unreal Engine provides excellent tools to convert this feature. Many fans of the first two titles disapproved this feature though, because it took away the element of being confined, and the constant bumping into walls &amp;ndash; simply put, fighting outdoors was boring. But I can imagine some really cool Rebel Assault *cough* stlye canyon chases... could be fun. :)

===Plan ===

# Create a mutator with the full 360° rotation physics stuff and an appropriate (deathmatch) testmap to go with it.
# Create ship models &amp; skins, as well as weapons &amp; effects
# Proceed customization (hud &amp; other gametype adjustments) and add various features (headlights, guidebot, afterburner etc)
# TC-ifying phase:
#* Throw in enemies: Create simple Descent-like robot AI, but cooler models.
#* Add Gametypes: Singleplayer, Co-op, plus the UT standard stuff (CTF, DOM, BR... now that I think of it, BR Descent style sounds pretty neat :D)
#* Add original elements that go beyond Descent's features.

This is just a rough overview of how I imagine the development of this mod to progress, ideally. Each number represents a design goal in its own, starting with a small mutator, then getting more content creators on board, and making it grow as large as it will. This also means that the probable design team could call it quits after each step if it loses interest, because each of these steps represents a &quot;complete&quot; release. Oh well. Anyone have comments on this?

===Copyright violation? ===

Of course it is important to not violate any of Interplay's copyrights... So the design goal is to create something that carries on the spirit of Descent with a different style &amp;ndash; however Descent-inspired it may be ;) &amp;ndash; not another Descent clone. That also includes the need for a different name. Yeah, you're NOT the only one who thinks &quot;Descent Mod&quot; is a little unimaginative. ;)

==Interested Contributors ==

*Luggage &amp;ndash; Design, Code, LD, (Modeling), (2D art)
*Wormbo (with a really large &quot;maybe&quot; at this point) &amp;ndash; weapon coding and maybe other coding stuff, too
*EntropicLqd &amp;ndash; I can code, but I'll step forward for the GUI aspect of it - I don't have a lot of time due to real-life and the GUI is something that can be lived without till near the day of release.  My maps generally suck badly but I'm willing to have a go :).  I need to finish Wormbo's FogMatch mutator first (nearly done honest - just can't get the bots right).
*DJPaul &amp;ndash; Code.
*Jeeptrash &amp;ndash; mappingness.
*Fr0sT aka AstralizeR &amp;ndash; Maps (only if this goes big)

==Comments? ==

'''Wormbo:''' This is the greates mod idea I've seen around this place for a long time. Especially the total 3D-ness of Descent I &amp; II provides a lot of possibilities. I guess Descent is less based on movement than on awareness.

'''EntropicLqd:''' Hee hee - I've been thinking along the sames lines but I was waiting for a cool name to spring to mind.  The sheer 3Dness of Descent was awesome.

'''Jeeptrash:''' Remember that Ender's-Game-big-zero-g-arena bunch of maps that were around for U1 and UT? Really the main reason they aren't much fun is the lack of real 3d movement. The 360 degree movement mutator is really the core of this whole idea... the 360 movement mutator and maybe a I'm-flying-a-small-ship-like-descent mutator could be kept seperate so the same muts could give you zero-g marines, descent, and some silly matrix wall walking options. Sounds like a lot of fun.

'''Spark:''' I liked Descent as well. :) Descent 2 was rather boring too me though (nothing new) and I never played Descent 3. I would be interested to help a bit with a Descent-like mod. 

How exactly would the movement work? I believe that going for joysticks wouldn't be a good idea. I can't really remember how the mouse controls where. Moving around to look around is a no brainer... Forward and backward (i.e. w and s) to do exactly this. I believe that left and right (a and d) would be strafing, so the only important question is how to do roll. Two extra keys (q and e) or maybe a &quot;hold this key and rotate your mouse) attempt?

'''Wormbo:''' When I played Descent I used a/s/d as forward, afterburner, reverse. q/e were the roll controls before I got a 3-axes joystick and strafing (&quot;sliding&quot;) was bound to the joystick hat. Now I'd probably bind wasd for moving forward/back and strafe left/right while using a mouse. (up/down would be the jump/crouch keys, space/ctrl in my case) This still leaves room for the q/e roll keys since the translocator isn't part of the game. I believe a Descent mod should have joystick support, even though mouse look will probably be the prefered input method.

'''EntropicLqd:''' I used the numeric keypad to strafe around along with mouse-look.  I would hold the right mouse button down to roll.  I also dug out the concept piece I started to write before I decided it was getting a little complex.  Might want to take some of the ideas - might not want to bother :) [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Descent Mod (Quick Concept)]]

'''Spark:''' I think that one extra key for rolling (bRoll) would be the best solution because it would allow UT gamers to play the game without relearning and large reordering of their keys. Especially if only one firemode would be used, because then everyone would have one important key free for rolling (usually 2nd mouse or space). It should also be pretty straight forward to implement. Extending PlayerFlying and modifying aTurn to roll instead of turn when bRoll is held should do it. 

Uh forget what I wrote about rotation inertia (deleted), of course that's not needed.

I just played a bit with state PlayerFlying and it really rocks, I forgot how much fun flying can be. :) I got Roll working (it's really that easy), but yaw and pitch don't take roll into account yet, but that shouldn't be difficult to solve (it's a good reason for me to learn more about rotator maths ;)).

'''Wormbo:''' Don't forget, that you can fire up to four things at the same time in Descent: the primary weapon (lasers, Gauss Cannon, Fusion Cannon, etc.), the secondary weapon (different kinds of rockets), flares and countermesures (several kinds of mines, the Gunboy or other stuff)&lt;br /&gt;The PlayerFlying state is a good start, but I'm afraid this requires a bit more work. This little discussion I had with Luggage on IRC (before this page was created) states why:

&lt;pre&gt;[11:53:44] &lt;Wormbo&gt; the only difficult part would be the player physics, i.e. the ships
[11:54:10] &lt;Luggage&gt; yeah
[11:54:57] &lt;Luggage&gt; but free rotation should be possible, or not? I'd think so...
[11:55:10] &lt;Wormbo&gt; the 20 to 25 weapons would be easy after having a solid base
[11:55:18] &lt;Luggage&gt; hehe :)
[11:55:47] &lt;Wormbo&gt; yeah, free rotation is possible, but requires vector or quaternion math instead of the rotators
[11:55:55] &lt;Luggage&gt; I thought so
[11:56:04] * Luggage = n00b coder :)
[11:56:09] &lt;Wormbo&gt; :o)
(...)
[11:58:52] &lt;Luggage&gt; Wormbo... just an idea, but would you want to code that? :)
[11:59:18] &lt;Wormbo&gt; hmm... probably not
[11:59:30] &lt;Wormbo&gt; the weapons maybe
[11:59:37] &lt;DJPaul&gt; why would it rquire special rotation magic?
[11:59:43] &lt;DJPaul&gt; I'm not understanding
[11:59:47] &lt;Luggage&gt; pity :) ok, I'll see if I can do it
[12:00:27] &lt;Wormbo&gt; DJPaul: because Unreal's rotators are designed for players running around on the ground
[12:00:31] &lt;Luggage&gt; DJP: I figure because you don't have that specified 'down' axis that stays the same all the time... or so
[12:00:38] &lt;Luggage&gt; that's what I meant
[12:00:57] &lt;DJPaul&gt; ...?
[12:01:22] &lt;Wormbo&gt; for a Descent-like game it would be better to not have the Yaw-Pitch-Roll order, but Pitch-Yaw-Roll instead
[12:02:19] &lt;Luggage&gt; Isn't it like... roll doesn't really happen in the FPS sty,e
[12:02:36] &lt;Luggage&gt; gametype, but pitch is dependant of yaw or something?
[12:03:11] &lt;Wormbo&gt; yes, first yaw is applied and the resulting rotation is modified by pitch, then by roll
[12:03:31] &lt;Luggage&gt; ok, so that might result in a screwup :)
[12:04:26] &lt;Wormbo&gt; guide a redeemer straight up or down in UT and you'll notice the complete crappyness of that system for making aircrafts ;)
[12:04:47] &lt;Luggage&gt; hehe
&lt;/pre&gt;

'''Spark:''' Uh bummer. A good reason to try to understand quaternions, I always wanted to do that... ;) We will see.

As for the four firing buttons, we don't need to copy everything from Descent, do we? :) But maybe it's not a problem even when keeping the secondary fire. Currently I have roll on middle mousebutton and it feels fine. Some defensive thing could well be fired with a less important key and flares are probably not neccessary at all. Flying around the tree of ages is awesome btw and Deck17 almost feels and sounds like a Descent map. :)

'''Luggage:''' Wow, what a massive amount of responses! :) If any of you coders is really serious about this, I'll gently pull back from still trying to find out where the player input stuff is done in UT2k3 code... you'll have that mutator working before I even found out how I install UDE properly ;)

Regarding the rotation problem, the basic vector operation for player rotation would probably be something along the lines of this:

Two vectors (I was solely calculating with vectors here, no rotators involved) are definitely needed to determine ship rotation; Let's add the third axis for convenience. Once these are determined, player strafing can be handled by merely modifying the ship's position along the respective vector. Ship rotation then, independant from the world axis system, can be calculated by modifying the two vectors that lie in the plane of the occuring movement (i.e. for looking left, the side and front vector, the up vector isn't affected by this rotation movement) this way:

&lt;uscript&gt;''Removed due to wrongness''&lt;/uscript&gt;

Considering strafing and movement, it should be handled via acceleration, like it is done in Descent.

A discussion with Silencer in IRC brought up the very important problem of replication. The player movement prediction would basically have to be created from scratch, since we're introducing a custom physics model. He had the same problem with his Bellicose Void mod. Or at least that's what I gathered. :)

Options are to either attempt it, or to keep it single player / botplay. Dumb robot AI shouldn't be a problem at all, Descent's robots acted pretty predictably. If we were to use the pathing system, it would need severe overhaul too...

All in all, I think the main focus at the moment should be creating working ship physics, and see what comes after.

Btw, I used to play descent with keyboard only: WSADFC for strafing, numpad for rotation. Later I got Forsaken, where using a mouse was the better choice... then it was still WSADFC for strafing, QE for banking and mouselook for pitch/yaw.

It is interesting btw how small changes in Forsakens physics created a really different feeling... for example:
* Bumping into walls doesn't damage you, and it bounces you back rather heavily compared to Descent.
* View rotation didn't use an acceleration system, or maybe the acceleration was too fast, thus not giving you the feeling of your ship/bike's mass inertia. Combined with the wall bouncing, that really takes away from the experience and makes it feel less realistic

On the other hand, Forsaken had really cool weapons and other features, like a cool nitro effect that widened your FOV to increase the sensation of speed, or the many different bikes and their advantages and tradebacks. And the cool voices of course :)

Oh well. It would be sooo cool to see this mod turn into reality! :D

'''LedZep:''' Wow how did i miss this page? Anyway i got great news for you Luggage, I've been working on a FreeSpace mod for quiet a while now (if you call a half assed &quot;once a week&quot; working :D) and am glad to say that i got ALL the physics working! I have all you want, afterburner, energy(shields, weapons, engines), energy reallocation and i have the ship rolling about as if it was a plane, its really weird being able to roll in UT to tell ya the truth... what I am left with now is the HUD and some minor replication problems. In the weapon's case i don't even have weapons, just projectiles which i read all the important properties from, and they work great. I am practically in an Almost-Beta state now, i was thinking about starting to look for a team but since i have no website skills whatsoever i am not sure of how i should go about setting up a team. i wish i had a nice and shiny site to link people to... Anyway if anyone is interested in helping me out please email me at LedZepperus@Yahoo.com or PMing me in the BU forums, i put a lot of work into this mod, the concept is almost complete, all it needs now is a team and we would have people playing FreeSpace against each other in no time.

By the way i am willing to share my code with anyone who wants it, i also have a sort of &quot;Core&quot; class with only basic functionality such as rolling and directional/rotational acceleration, so on base of that people could also write Descent/Forsaken/whatever mods.

'''DJPaul:''' Sounds good, but have you solved the replication issue?  Have you even tested for it?  Did you manage to rework the vectors?  If you've done everything, great; could you put your &quot;Core&quot; classes up for download, so we can looksy?

'''LedZep:''' Yep ive tested it and it seems to work online pretty well, i have to different replication systems though, cant decide between them. What i said about replication not being finished, i only meant some annoying weapon effects and things like that, nothing major, the physics seem to work great online, i will modify my code to make it a bit more readable and post it here once im done: [[Legacy:KShip|KShip]] *edit* ok im done :)

'''Spark:''' Thanks a lot, that's great. :) I already thought about using KVehicle as a base, obviously this was the right thought. I will look for this now.

And Luggage, that's the stuff I deleted, the rotation inertia I mentioned. :) So I remembered correctly that Descend had this... However, when I played around with it it just felt so &quot;right&quot; without any inertia. Forsaken came to my mind, yes. :) I believe that Frontier (Elite 2) had similar controls, you could turn initially but the gravity wouldn't immediately turn your acceleration. I like this a lot. The free rotation helps to aim and makes the game more similar to UT deathmatch, while it still feels nice. However, not having instant rotation might reduce the efficiency of hitscan weapons and ping a bit which would be a good thing (not in everyone's mind of course), so I guess that both have it's pros. 

Maybe it would be worth doing both. A &quot;forsaken-like&quot; mutator which simply let's you play UT2003 deathmatch, CTF, etc with ships and a more complex total conversion with real Descent like physics (and a gameplay which is more than just about fragging).

'''LedZep:''' Well I already have a mod coded, the &quot;core&quot; code i posted is just a little pinch of it, i have almost everything coded there, input, energy (for shield, weapons and engines), weapons, effects, shields, a class system (5 classes: scout, heavy and light fighter, and heavy and light bomber, with unique characteristics each), i even have a gametype done, its a team game where each team is given a &quot;Mother Ship&quot; and their objective is to destroy the enemy's one, where teams have to work together, bombers bombing the mother ship, while fighters protecting them, and scouts going deep into enemy lines using their Cloaking device. (Note, im not working on this anymore, I finished with it a long time ago, please stop emailing me)

Cheers guys! i hope to hear from you, and hopefully we could get this mod rolling soon ;)

'''Foxpaw:''' Do you have a link to download it?

'''Spark:''' Sounds cool. :) I hope you find a good team. Did you think about using [http://www.moddb.com moddb]? This looks like a good starting place for mods, with such an interesting concept and already working code maybe you can spark some attention there. You could even link newssites or interested people to this place. Maybe I could help you a bit, but only with code and this seems to be the least thing you need atm. :)

As for the Descent mod, I gave up using this vehicle code. Not saying it's the wrong idea, I don't know, it's probably still the best idea for more complex Descent like physics but this is getting over my head. Maybe if your spaceship is working really well this could also be used for indoor missions. However, I will concentrate on more straight forward forsaken-like physics now. Using karma vehicles just to get free rotation working can't be the right thing to do... 

This means that I have to get this quaternion rotation stuff working, but I tried again and now it looks as if it would be almost working. :)

I will remove myself from the list of coders here and create a second page for this forsaken-like mutator, so it doesn't look as if I would want to &quot;hijack&quot; the Descent mod with Forsaken. If I get this working, maybe Descent-like rotation acceleration could be added as an alternative to using the KShip code. I will let luggage look at both and decide what's more appropriate then.

'''Spark:''' Yesterday my internet connection broke down and shortly later I got it working (quaternion rotation). :) The connection is still flakey, so I just wanted to leave a quick note before it goes down again.

'''Piglet:''' Just asking whats happening with the mod at the moment, having spent a good amount of time learning unreal script i would love to join in, and it would be good to know if its active, dormant or even (i hope not) extinct.

'''HarvesterUT''' I will just chime in here.  I am the lead for a mod called Stellar Conflict, which shares similarities with this

descent-esque mod.  Our vehicle class is starting to come along.  We removed the limitations on pitch and can roll, yaw the vehicle

no problem.  However we still have some issues with the Quaternion equations...but it is looking like it will be possible to create

a ship that can go in any direction and always have its own relative &quot;down&quot;......if you are interested in helping us on this mod please

read the other TC mod topic called Stellar Conflict

'''Foxpaw:''' I wouldn't even use the quaternions for this. As far as I can tell there's nothing they can do that vectors cannot. You can use GetAxes to keep your relative &quot;down&quot; and &quot;sides&quot; or you can use Vector &lt;&lt; Rotation. I think I put those brackets the right way anyway.

'''Mychaeel:''' Quaternions are there to replace rotators, not vectors (see [[Legacy:Quaternion Rotation|Quaternion Rotation]] for an explanation of &quot;gimbal lock&quot;).

'''Foxpaw:''' Yes, but you can replace rotators with vectors as well - then just cast the vector rotation as a rotator when you assign it to an actors rotation/rotationrate/etc.

'''Mychaeel:''' Apart from being far less efficient than using quaternion calculations, you lose at least a rotator's Roll component when using vectors as an intermediate step.

'''Kyouryuu:''' I would be SO for this mod.  You can put me down for doing mapping if you can come up with a good approach for the Descent physics and a ship.

'''Psion:''' I am working on getting a pyro model into UT, and I have independently started work on a Descent mod for UT. Seems to me we should be working together. contact me @ tsunamiken@hotmail.com

'''NetSapiens''' if what you're looking for is full 3d gaming in an online environment, do yourself a favor and check out [http://www.alleg.net allegiance...] You won't regret it... and if you incorporate some of the ideas from that game into a UT mod, then I won't regret it either :)

'''Jezinator''' Yep, sounds pretty awesome.  Can't wait to see how this turns out, especially considering the amount of incredible innovations to the unreal engine there haven't been in the past year or so.  I could probably help with the mapping side of things, just tell me whats different.  To be honest though i can't see how mapping for descent would be much different from mapping for UT2004, except obviously that the player can go anywhere.  Anyhoo, if any of you guys get this up and running, give me a e-mail at fruitbat@talesandtours.co.uk.  I'll be glad to help in any way I can.

'''LiKeMiKeS''' I too have been developing a 'Descent Mod' called Unreal Descension: Frantic123 to incorporate all 3 versions, 1 &amp; 2 to be the classic game modes and 3 will be the main part of the mod that players would ultimately be making maps and additional content for.

===Planned Development===
My hope is to design the team efforts as open ended, with team members coming and going - and content servers with mirrors so new artists won't necessarily have to contact the previous developers to get access to adding/editing and improving the content for the mod.
So if they have the resources, and want to help - they can re-post the mod content on their or other site and post a link to it here so wiki members can see whats being done.
An extension to my efforts can be viewed on my xfire blog:
 http://www.xfire.com/blog/1devilishdude/1744836/
Since [[Legacy:KShip|KShip]] has now been updated with more usable player controller code by:'BrolD9999' I believe the incentive for new ideas &amp; content is upon us.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Descent Mod (Quick Concept)</title>
    <id>1946</id>
    <revision>
      <id>4765</id>
      <timestamp>2004-12-23T23:50:00Z</timestamp>
      <contributor>
        <ip>Host217-44-152-152.range217-44.btcentralplus.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Remember Descent?  If not it was a ground breaking game in which you zoomed around a 3D map in a small spacecraft capable of movement along all 3 axis.  Indeed the concept of up and down was purely relative to your current orientation.  This mod idea is loosely based on this model.  The game is losely based on the descent game model only team game focused.

Players are split into different teams.  The standard team-game variants are up for grabs here (although whether DD would work or not I don't know).  In addition to the standard DD/CTF/BR modes of UT2K3 there are a couple of other game types (discussed later).

Players zoom around the map in a customised craft.  They can strafe in all three dimensions as well as roll and mouse-look type movement.

===Customising the Craft ===

Before the player enters the game he must first crate his own unique craft.  There are two types of &quot;hull&quot; available.  A small light hull, ideal for &quot;flag run&quot; type work and a heavier hull whos purpose is to fight.  Each hull has a set number of &quot;spaces&quot; (to be decided) that can be assigned to the following components:
* Shield generator (comes in 4 variations capable of storing 50, 100, 150, and 200 shield units and taking 1, 2, 3, and 4 spaces respectively).
* Power generator (Variations taking 1-4 spaces are available.  Powers to be decided)
* Engine (comes in 4 variations taking 1-4 spaces.  Respective powers to be determined)
* Weapons

Each filled space takes up a set amount of weight - this is used to determine how fast the craft can accelerate.

'''Wormbo:''' I'd probably suggest three types of hulls, think Phoenix (less armor, more speed), Pyro (medium/allround), Magnum (heavily armored, sloooow ;)) like in Descent 3.

===Power ===

All components of the craft require a base amount of power to function - so having a power generator that will support the components you've added to the craft is important.  Most components take time to recharge.  If there is spare power left over once all of the &quot;base power&quot; needs of the components have been satisfied the components within craft can recharge over time.  Players can set the order in which devices are recharged.  Spare power may also be used to repair any damage on the craft.  This will happen automatically if all components of the craft are at full charge.  Players can elect to turn weapon components (and the engine) off in order to make more power available.

Engines can store a limited amount of charge for a quick &quot;boost&quot;.  This boost simply doubles the acceleration the engine can provide for a short while and increases the maximum speed of the craft by 10%.

Weapons store power to enable them to fire.  Each shot uses up a set amount of energy.  Once the energy for a weapon has run out the weapon will not function until it has had a chance to recharge.

====Running Low on Power ====

Stuff doesn't work as well - things don't recharge.  Specifics still to be worked out.

'''UArchitect:''' mabey have a kind of percentage thing, to determine whether a shot is fired succesfully or does a blank, and makes some leet fizzy electric &quot;failed&quot; noise, so as the energy runs lower, the weapon tends to skip a bit, would make it seem like the weapon is really starting to fail on you from lack of power, and when all power is down you have to wait for recharging...

(not sure if i explained very well) :P just an idea

===The Weapons ===

The number of weapons has been kept fairly low deliberately.  Each weapon type comes in a few flavours that take up more space/power.  The laser weapons have variations that take up more power but use less space.
* Pulse Laser - A medium fire weapon that fires a single bolt of energy in a straight line.  These weapons are unique in that the base power requirement of the laser can be increased to boost the power without any additional increase in space usage.  Alternatively, the power of the laser can be increased by using more space without any additional cost in base energy use.  There are four levels of laser.  The level 4 laser does 4 times as much damage as the level 1 laser.
* Flash Laser - A rapid fire laser weapon that fires twice as fast as the Pulse laser.  All the same rules apply to the Flash laser as the Pulse laser.  The Flash laser has a base power rating twice that of the Pulse laser.
* Cannon - A rapid fire hit-scan weapon (the only one in the game).  There are four variations of this weapon (taking 2-5 spaces).  Version 1 does moderate damage and has a low energy store.  Version 2 has a small increase in damage but a larger (2x?) energy store.  Version 3 does twice as much damage as version 1 but has the same sized energy store.  Version 4 does slightly more damage than version 3 but has a larger (2x?) engery store.

Ideally it should be possible to tell from the look of the craft the sort of weaponry that has been attached (and maybe the type of power plant as well).
* Mines - These standard defensive weapons come in a few flavours, with each flavour requiring more base power, more space, or both.  The types of mine available are:
** Dumb mine - These mines float where they are put and explode on contact with any craft.  These mines will explode if they bump into walls.
** Rubber mine - These mines bounce off walls and only explode if they hit an enemy craft.  If the team mine variant of these mines is used.then &quot;friendly&quot; players can bump the mines to give them a bit of speed and send them off down a corridor.
** Proximity mine - These mines explode if any craft comes within a certain range
: Team aware mines (they don't explode when collided with by friendly players) can be produced by doubling the base power requirement.  Mines take a lot of energy to produce and last for up to a minute before self-destructing.

----

'''Mychaeel:''' There's no such thing as a sub-subpage.  :-)  I've renamed this page.

'''EntropicLqd:''' Thanks - I forgot and then my Internet connection went down (just got it back) so I popped on here to ask someone to rename it and you'd already done it.  The efficiency of this place is scary.

'''Mychaeel:''' It's massive multitasking.  ;-)

'''UArchitect:''' about the mines, mabey increase the mine lifespan, for defensive purposes but add a limit to how many mines max a team/player can have?

mabey have another kind of proximity mine which is magnetic/seeking with a small &quot;seek&quot; radius, when something comes near it slowly trundles towards the target...( homeworld2 style? they were fun...:P )</text>
    </revision>
    <revision>
      <id>4766</id>
      <timestamp>2003-01-07T13:50:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Remember Descent?  If not it was a ground breaking game in which you zoomed around a 3D map in a small spacecraft capable of movement along all 3 axis.  Indeed the concept of up and down was purely relative to your current orientation.  This mod idea is loosely based on this model.  The game is losely based on the descent game model only team game focused.

Players are split into different teams.  The standard team-game variants are up for grabs here (although whether DD would work or not I don't know).  In addition to the standard DD/CTF/BR modes of UT2K3 there are a couple of other game types (discussed later).

Players zoom around the map in a customised craft.  They can strafe in all three dimensions as well as roll and mouse-look type movement.

===Customising the Craft ===

Before the player enters the game he must first crate his own unique craft.  There are two types of &quot;hull&quot; available.  A small light hull, ideal for &quot;flag run&quot; type work and a heavier hull whos purpose is to fight.  Each hull has a set number of &quot;spaces&quot; (to be decided) that can be assigned to the following components:
* Shield generator (comes in 4 variations capable of storing 50, 100, 150, and 200 shield units and taking 1, 2, 3, and 4 spaces respectively).
* Power generator (Variations taking 1-4 spaces are available.  Powers to be decided)
* Engine (comes in 4 variations taking 1-4 spaces.  Respective powers to be determined)
* Weapons

Each filled space takes up a set amount of weight - this is used to determine how fast the craft can accelerate.

'''Wormbo:''' I'd probably suggest three types of hulls, think Phoenix (less armor, more speed), Pyro (medium/allround), Magnum (heavily armored, sloooow ;)) like in Descent 3.

===Power ===

All components of the craft require a base amount of power to function - so having a power generator that will support the components you've added to the craft is important.  Most components take time to recharge.  If there is spare power left over once all of the &quot;base power&quot; needs of the components have been satisfied the components within craft can recharge over time.  Players can set the order in which devices are recharged.  Spare power may also be used to repair any damage on the craft.  This will happen automatically if all components of the craft are at full charge.  Players can elect to turn weapon components (and the engine) off in order to make more power available.

Engines can store a limited amount of charge for a quick &quot;boost&quot;.  This boost simply doubles the acceleration the engine can provide for a short while and increases the maximum speed of the craft by 10%.

Weapons store power to enable them to fire.  Each shot uses up a set amount of energy.  Once the energy for a weapon has run out the weapon will not function until it has had a chance to recharge.

====Running Low on Power ====

Stuff doesn't work as well - things don't recharge.  Specifics still to be worked out.

===The Weapons ===

The number of weapons has been kept fairly low deliberately.  Each weapon type comes in a few flavours that take up more space/power.  The laser weapons have variations that take up more power but use less space.
* Pulse Laser - A medium fire weapon that fires a single bolt of energy in a straight line.  These weapons are unique in that the base power requirement of the laser can be increased to boost the power without any additional increase in space usage.  Alternatively, the power of the laser can be increased by using more space without any additional cost in base energy use.  There are four levels of laser.  The level 4 laser does 4 times as much damage as the level 1 laser.
* Flash Laser - A rapid fire laser weapon that fires twice as fast as the Pulse laser.  All the same rules apply to the Flash laser as the Pulse laser.  The Flash laser has a base power rating twice that of the Pulse laser.
* Cannon - A rapid fire hit-scan weapon (the only one in the game).  There are four variations of this weapon (taking 2-5 spaces).  Version 1 does moderate damage and has a low energy store.  Version 2 has a small increase in damage but a larger (2x?) energy store.  Version 3 does twice as much damage as version 1 but has the same sized energy store.  Version 4 does slightly more damage than version 3 but has a larger (2x?) engery store.

Ideally it should be possible to tell from the look of the craft the sort of weaponry that has been attached (and maybe the type of power plant as well).
* Mines - These standard defensive weapons come in a few flavours, with each flavour requiring more base power, more space, or both.  The types of mine available are:
** Dumb mine - These mines float where they are put and explode on contact with any craft.  These mines will explode if they bump into walls.
** Rubber mine - These mines bounce off walls and only explode if they hit an enemy craft.  If the team mine variant of these mines is used.then &quot;friendly&quot; players can bump the mines to give them a bit of speed and send them off down a corridor.
** Proximity mine - These mines explode if any craft comes within a certain range
: Team aware mines (they don't explode when collided with by friendly players) can be produced by doubling the base power requirement.  Mines take a lot of energy to produce and last for up to a minute before self-destructing.

----

'''Mychaeel:''' There's no such thing as a sub-subpage.  :-)  I've renamed this page.

'''EntropicLqd:''' Thanks - I forgot and then my Internet connection went down (just got it back) so I popped on here to ask someone to rename it and you'd already done it.  The efficiency of this place is scary.

'''Mychaeel:''' It's massive multitasking.  ;-)</text>
    </revision>
    <revision>
      <id>4767</id>
      <timestamp>2004-12-23T23:37:51Z</timestamp>
      <contributor>
        <ip>Host217-44-152-152.range217-44.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Remember Descent?  If not it was a ground breaking game in which you zoomed around a 3D map in a small spacecraft capable of movement along all 3 axis.  Indeed the concept of up and down was purely relative to your current orientation.  This mod idea is loosely based on this model.  The game is losely based on the descent game model only team game focused.

Players are split into different teams.  The standard team-game variants are up for grabs here (although whether DD would work or not I don't know).  In addition to the standard DD/CTF/BR modes of UT2K3 there are a couple of other game types (discussed later).

Players zoom around the map in a customised craft.  They can strafe in all three dimensions as well as roll and mouse-look type movement.

===Customising the Craft ===

Before the player enters the game he must first crate his own unique craft.  There are two types of &quot;hull&quot; available.  A small light hull, ideal for &quot;flag run&quot; type work and a heavier hull whos purpose is to fight.  Each hull has a set number of &quot;spaces&quot; (to be decided) that can be assigned to the following components:
* Shield generator (comes in 4 variations capable of storing 50, 100, 150, and 200 shield units and taking 1, 2, 3, and 4 spaces respectively).
* Power generator (Variations taking 1-4 spaces are available.  Powers to be decided)
* Engine (comes in 4 variations taking 1-4 spaces.  Respective powers to be determined)
* Weapons

Each filled space takes up a set amount of weight - this is used to determine how fast the craft can accelerate.

'''Wormbo:''' I'd probably suggest three types of hulls, think Phoenix (less armor, more speed), Pyro (medium/allround), Magnum (heavily armored, sloooow ;)) like in Descent 3.

===Power ===

All components of the craft require a base amount of power to function - so having a power generator that will support the components you've added to the craft is important.  Most components take time to recharge.  If there is spare power left over once all of the &quot;base power&quot; needs of the components have been satisfied the components within craft can recharge over time.  Players can set the order in which devices are recharged.  Spare power may also be used to repair any damage on the craft.  This will happen automatically if all components of the craft are at full charge.  Players can elect to turn weapon components (and the engine) off in order to make more power available.

Engines can store a limited amount of charge for a quick &quot;boost&quot;.  This boost simply doubles the acceleration the engine can provide for a short while and increases the maximum speed of the craft by 10%.

Weapons store power to enable them to fire.  Each shot uses up a set amount of energy.  Once the energy for a weapon has run out the weapon will not function until it has had a chance to recharge.

====Running Low on Power ====

Stuff doesn't work as well - things don't recharge.  Specifics still to be worked out.

'''UArchitect:''' mabey have a kind of percentage thing, to determine whether a shot is fired succesfully or does a blank, and makes some leet fizzy &quot;failed2 noise, so as the energy runs lower, the weapon tends to skip a bit, would make it seem like the energy is really starting to fail on you as power runs low, and when all power is down you have to wait for recharging...

(not sure if i explained very well) :P just an idea

===The Weapons ===

The number of weapons has been kept fairly low deliberately.  Each weapon type comes in a few flavours that take up more space/power.  The laser weapons have variations that take up more power but use less space.
* Pulse Laser - A medium fire weapon that fires a single bolt of energy in a straight line.  These weapons are unique in that the base power requirement of the laser can be increased to boost the power without any additional increase in space usage.  Alternatively, the power of the laser can be increased by using more space without any additional cost in base energy use.  There are four levels of laser.  The level 4 laser does 4 times as much damage as the level 1 laser.
* Flash Laser - A rapid fire laser weapon that fires twice as fast as the Pulse laser.  All the same rules apply to the Flash laser as the Pulse laser.  The Flash laser has a base power rating twice that of the Pulse laser.
* Cannon - A rapid fire hit-scan weapon (the only one in the game).  There are four variations of this weapon (taking 2-5 spaces).  Version 1 does moderate damage and has a low energy store.  Version 2 has a small increase in damage but a larger (2x?) energy store.  Version 3 does twice as much damage as version 1 but has the same sized energy store.  Version 4 does slightly more damage than version 3 but has a larger (2x?) engery store.

Ideally it should be possible to tell from the look of the craft the sort of weaponry that has been attached (and maybe the type of power plant as well).
* Mines - These standard defensive weapons come in a few flavours, with each flavour requiring more base power, more space, or both.  The types of mine available are:
** Dumb mine - These mines float where they are put and explode on contact with any craft.  These mines will explode if they bump into walls.
** Rubber mine - These mines bounce off walls and only explode if they hit an enemy craft.  If the team mine variant of these mines is used.then &quot;friendly&quot; players can bump the mines to give them a bit of speed and send them off down a corridor.
** Proximity mine - These mines explode if any craft comes within a certain range
: Team aware mines (they don't explode when collided with by friendly players) can be produced by doubling the base power requirement.  Mines take a lot of energy to produce and last for up to a minute before self-destructing.

----

'''Mychaeel:''' There's no such thing as a sub-subpage.  :-)  I've renamed this page.

'''EntropicLqd:''' Thanks - I forgot and then my Internet connection went down (just got it back) so I popped on here to ask someone to rename it and you'd already done it.  The efficiency of this place is scary.

'''Mychaeel:''' It's massive multitasking.  ;-)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/DevTools</title>
    <id>1973</id>
    <revision>
      <id>4826</id>
      <timestamp>2003-11-24T16:47:12Z</timestamp>
      <contributor>
        <ip>Pat611.ccs.yorku.ca</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is a growing collection of my own tools used to aid development of mods.

==Current Features==
* Shows the display debug for any pawn if the crosshair is on top of it

==Pieces Of Code==

===Display Debug fix!===

In my Interaction class:

&lt;uscript&gt;
function PostRender( canvas Canvas )
{
	local Actor p;
	local float a, b;
	local vector HitLocation, HitNormal;
	
	a = Canvas.CurYL;
	b = 0;

	mainTrace(HitLocation, HitNormal, p, 2048);
	
	if(Pawn(p) != none)
	{
	    p.DisplayDebug(Canvas, a, b);
	}
}
&lt;/uscript&gt;

MainTrace():

(obviously it is declared inside the Interaction class)

&lt;uscript&gt;
// ===========================================================================
// mainTrace
//
// This function traces for known actors that are RIGHT in front of the camera (under the crosshair)
// ===========================================================================
function mainTrace(out vector HitLocation, out vector HitNormal, out Actor aThing, float fDistance)
{
	local vector StartTrace, EndTrace;
	local PlayerController PlayerOwner;

	// Log(self$&quot;: before assigning the playerOwner&quot;); //DEBUG
	PlayerOwner = ViewportOwner.Actor;
	// Log(self$&quot;: after assigning the playerOwner&quot;); //DEBUG

	// important: find the REAL rotation of the camera - X and Y

	// Log(self$&quot;: before trace&quot;); // DEBUG
	// Perform a trace to find any colliding actors
	StartTrace = PlayerOwner.Pawn.Location;			// the beginning of the trace
	StartTrace.Z += PlayerOwner.Pawn.BaseEyeHeight;	// account for player's eye height
	// I call this the oblivion vector
	EndTrace = StartTrace + vector(PlayerOwner.Pawn.GetViewRotation()) * fDistance;
	// TODO: try fasttrace
	aThing = PlayerOwner.Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
}
&lt;/uscript&gt;

==Suggestions==

Please feel free to suggest any other features that could be included in this mod. Just try to stick to mutator functionality, so that it can be tested with other game types!

----

[http://www.yucc.yorku.ca/~plouj/DevTools.zip DevTools]

by [[Legacy:AlphaOne|AlphaOne]]

----

==Discussion==

'''Foxpaw:''' Is the mainTrace function a function you wrote yourself or is it included in the base UT2003 packages. I've never seen it called elsewhere.

'''AlphaOne:''' Oops! Forgot to mention that Yes it is one of my own.

'''Daemonica:''' I noticed the Todo line, I wouldn't try as FastTrace will only return a True/False if the trace hits World Geometry. On a side note I'm trying to implement a similar function within a PlayerController class and having little to no success, even though the code is the same ;)</text>
    </revision>
    <revision>
      <id>4827</id>
      <timestamp>2003-07-10T13:32:25Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <comment>MainTrace</comment>
      <text xml:space="preserve">This is a growing collection of my own tools used to aid development of mods.

==Current Features==
* Shows the display debug for any pawn if the crosshair is on top of it

==Pieces Of Code==

===Display Debug fix!===

In my Interaction class:

&lt;uscript&gt;
function PostRender( canvas Canvas )
{
	local Actor p;
	local float a, b;
	local vector HitLocation, HitNormal;
	
	a = Canvas.CurYL;
	b = 0;

	mainTrace(HitLocation, HitNormal, p, 2048);
	
	if(Pawn(p) != none)
	{
	    p.DisplayDebug(Canvas, a, b);
	}
}
&lt;/uscript&gt;

MainTrace():

(obviously it is declared inside the Interaction class)

&lt;uscript&gt;
// ===========================================================================
// mainTrace
//
// This function traces for known actors that are RIGHT in front of the camera (under the crosshair)
// ===========================================================================
function mainTrace(out vector HitLocation, out vector HitNormal, out Actor aThing, float fDistance)
{
	local vector StartTrace, EndTrace;
	local PlayerController PlayerOwner;

	// Log(self$&quot;: before assigning the playerOwner&quot;); //DEBUG
	PlayerOwner = ViewportOwner.Actor;
	// Log(self$&quot;: after assigning the playerOwner&quot;); //DEBUG

	// important: find the REAL rotation of the camera - X and Y

	// Log(self$&quot;: before trace&quot;); // DEBUG
	// Perform a trace to find any colliding actors
	StartTrace = PlayerOwner.Pawn.Location;			// the beginning of the trace
	StartTrace.Z += PlayerOwner.Pawn.BaseEyeHeight;	// account for player's eye height
	// I call this the oblivion vector
	EndTrace = StartTrace + vector(PlayerOwner.Pawn.GetViewRotation()) * fDistance;
	// TODO: try fasttrace
	aThing = PlayerOwner.Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
}
&lt;/uscript&gt;

==Suggestions==

Please feel free to suggest any other features that could be included in this mod. Just try to stick to mutator functionality, so that it can be tested with other game types!

----

[http://www.planetunreal.com/hackerz/pub/DevTools.zip DevTools]

by [[Legacy:AlphaOne|AlphaOne]]

----

==Discussion==

'''Foxpaw:''' Is the mainTrace function a function you wrote yourself or is it included in the base UT2003 packages. I've never seen it called elsewhere.

'''AlphaOne:''' Oops! Forgot to mention that Yes it is one of my own.</text>
    </revision>
    <revision>
      <id>4828</id>
      <timestamp>2003-11-24T01:58:54Z</timestamp>
      <contributor>
        <ip>Daemonica</ip>
      </contributor>
      <comment>Don't use FastTrace</comment>
      <text xml:space="preserve">This is a growing collection of my own tools used to aid development of mods.

==Current Features==
* Shows the display debug for any pawn if the crosshair is on top of it

==Pieces Of Code==

===Display Debug fix!===

In my Interaction class:

&lt;uscript&gt;
function PostRender( canvas Canvas )
{
	local Actor p;
	local float a, b;
	local vector HitLocation, HitNormal;
	
	a = Canvas.CurYL;
	b = 0;

	mainTrace(HitLocation, HitNormal, p, 2048);
	
	if(Pawn(p) != none)
	{
	    p.DisplayDebug(Canvas, a, b);
	}
}
&lt;/uscript&gt;

MainTrace():

(obviously it is declared inside the Interaction class)

&lt;uscript&gt;
// ===========================================================================
// mainTrace
//
// This function traces for known actors that are RIGHT in front of the camera (under the crosshair)
// ===========================================================================
function mainTrace(out vector HitLocation, out vector HitNormal, out Actor aThing, float fDistance)
{
	local vector StartTrace, EndTrace;
	local PlayerController PlayerOwner;

	// Log(self$&quot;: before assigning the playerOwner&quot;); //DEBUG
	PlayerOwner = ViewportOwner.Actor;
	// Log(self$&quot;: after assigning the playerOwner&quot;); //DEBUG

	// important: find the REAL rotation of the camera - X and Y

	// Log(self$&quot;: before trace&quot;); // DEBUG
	// Perform a trace to find any colliding actors
	StartTrace = PlayerOwner.Pawn.Location;			// the beginning of the trace
	StartTrace.Z += PlayerOwner.Pawn.BaseEyeHeight;	// account for player's eye height
	// I call this the oblivion vector
	EndTrace = StartTrace + vector(PlayerOwner.Pawn.GetViewRotation()) * fDistance;
	// TODO: try fasttrace
	aThing = PlayerOwner.Pawn.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
}
&lt;/uscript&gt;

==Suggestions==

Please feel free to suggest any other features that could be included in this mod. Just try to stick to mutator functionality, so that it can be tested with other game types!

----

[http://www.planetunreal.com/hackerz/pub/DevTools.zip DevTools]

by [[Legacy:AlphaOne|AlphaOne]]

----

==Discussion==

'''Foxpaw:''' Is the mainTrace function a function you wrote yourself or is it included in the base UT2003 packages. I've never seen it called elsewhere.

'''AlphaOne:''' Oops! Forgot to mention that Yes it is one of my own.

'''Daemonica:''' I noticed the Todo line, I wouldn't try as FastTrace will only return a True/False if the trace hits World Geometry. On a side note I'm trying to implement a similar function within a PlayerController class and having little to no success, even though the code is the same ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Devastation Conquerors</title>
    <id>1960</id>
    <revision>
      <id>4798</id>
      <timestamp>2006-01-12T19:40:32Z</timestamp>
      <contributor>
        <ip>Ragdoll</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Devastation &amp;ndash; Conquerors}}

==Overview ==

This mod brings co-operative multiplayer gaming into the Devastation world.  In a classic humans vs dumb (and hopefully not so dumb) computer controlled opponents game, humans compete not only for victory but also for the highest score.

Each map places the human players on the same team although the team the players are on is dependant upon the map.  Each map provides the human players with one or more objectives to complete to win the game.  An objectives could be as simple as simply destroying the enemy team's spawn point (and eradicating the enemy players), or as complex as starting up a number of generators, reaching a specific point on the map.

Each human player has a fixed number of lives.  When these lives run out the player is dropped into spectator mode, but can no longer take part within the game.  The computer controlled players will only have a single life (by default).  Computer controlled players will not be able to respawn if all of their &quot;spawn points&quot; are destroyed.

When a player first enters the game they will be supplied with a default set of weapons (as determined by the mapper) with full ammo, that are (hopefully) suitable for the mission at hand.  Other weapons can be placed on the map for players and Bots to collect and use.  Human players do not have destroyable points.

If the map is a particularly long one then player spawn points can be activated as certain points on the map are reached.

===Scoring ===
* A player gets 1 point for killing a Bot
* A player loses 5 points for getting killed
* A player gets 10 points for completing an objective.

===Configurable Options ===

The following options should be configurable within the game.
* Time Limit - This is expressed as a percentage of the game time set within the map and can be as low as 50% and as high as 200%.
* Player Lives - This determines the number of lives each human player has.  If it is set to 0 then human player's have an infinite number of lives.
* Enemy Lives - This sets the number of lives each Bot player has.  If it is set to 0 then the Bot has an infinite number of lives.

===Discussion ===

'''EntropicLqd:''' It's been a long time since I played a good co-op style game, and the Devastation weapons lend themselves to this style of game.

'''AJRAD:''' I have already done this, you can get the maps @ www.rtw.havokwh.com

'''Ragdoll:''' (slipstreams_65) i done a map where you had to destroy generators etc, not sure if it made it onto the servers though. I dont really play much anymore since my clan broke up and i got ut2004.</text>
    </revision>
    <revision>
      <id>4799</id>
      <timestamp>2003-04-02T12:10:14Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Devastation &amp;ndash; Conquerors}}

==Overview ==

This mod brings co-operative multiplayer gaming into the Devastation world.  In a classic humans vs dumb (and hopefully not so dumb) computer controlled opponents game, humans compete not only for victory but also for the highest score.

Each map places the human players on the same team although the team the players are on is dependant upon the map.  Each map provides the human players with one or more objectives to complete to win the game.  An objectives could be as simple as simply destroying the enemy team's spawn point (and eradicating the enemy players), or as complex as starting up a number of generators, reaching a specific point on the map.

Each human player has a fixed number of lives.  When these lives run out the player is dropped into spectator mode, but can no longer take part within the game.  The computer controlled players will only have a single life (by default).  Computer controlled players will not be able to respawn if all of their &quot;spawn points&quot; are destroyed.

When a player first enters the game they will be supplied with a default set of weapons (as determined by the mapper) with full ammo, that are (hopefully) suitable for the mission at hand.  Other weapons can be placed on the map for players and Bots to collect and use.  Human players do not have destroyable points.

If the map is a particularly long one then player spawn points can be activated as certain points on the map are reached.

===Scoring ===
* A player gets 1 point for killing a Bot
* A player loses 5 points for getting killed
* A player gets 10 points for completing an objective.

===Configurable Options ===

The following options should be configurable within the game.
* Time Limit - This is expressed as a percentage of the game time set within the map and can be as low as 50% and as high as 200%.
* Player Lives - This determines the number of lives each human player has.  If it is set to 0 then human player's have an infinite number of lives.
* Enemy Lives - This sets the number of lives each Bot player has.  If it is set to 0 then the Bot has an infinite number of lives.

===Discussion ===

'''EntropicLqd:''' It's been a long time since I played a good co-op style game, and the Devastation weapons lend themselves to this style of game.</text>
    </revision>
    <revision>
      <id>4800</id>
      <timestamp>2006-01-11T21:00:51Z</timestamp>
      <contributor>
        <ip>Bagu-cache-7.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Devastation &amp;ndash; Conquerors}}

==Overview ==

This mod brings co-operative multiplayer gaming into the Devastation world.  In a classic humans vs dumb (and hopefully not so dumb) computer controlled opponents game, humans compete not only for victory but also for the highest score.

Each map places the human players on the same team although the team the players are on is dependant upon the map.  Each map provides the human players with one or more objectives to complete to win the game.  An objectives could be as simple as simply destroying the enemy team's spawn point (and eradicating the enemy players), or as complex as starting up a number of generators, reaching a specific point on the map.

Each human player has a fixed number of lives.  When these lives run out the player is dropped into spectator mode, but can no longer take part within the game.  The computer controlled players will only have a single life (by default).  Computer controlled players will not be able to respawn if all of their &quot;spawn points&quot; are destroyed.

When a player first enters the game they will be supplied with a default set of weapons (as determined by the mapper) with full ammo, that are (hopefully) suitable for the mission at hand.  Other weapons can be placed on the map for players and Bots to collect and use.  Human players do not have destroyable points.

If the map is a particularly long one then player spawn points can be activated as certain points on the map are reached.

===Scoring ===
* A player gets 1 point for killing a Bot
* A player loses 5 points for getting killed
* A player gets 10 points for completing an objective.

===Configurable Options ===

The following options should be configurable within the game.
* Time Limit - This is expressed as a percentage of the game time set within the map and can be as low as 50% and as high as 200%.
* Player Lives - This determines the number of lives each human player has.  If it is set to 0 then human player's have an infinite number of lives.
* Enemy Lives - This sets the number of lives each Bot player has.  If it is set to 0 then the Bot has an infinite number of lives.

===Discussion ===

'''EntropicLqd:''' It's been a long time since I played a good co-op style game, and the Devastation weapons lend themselves to this style of game.

'''AJRAD:''' I have already done this, you can get the maps @ www.rtw.havokwh.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Dodgeball</title>
    <id>1921</id>
    <revision>
      <id>4707</id>
      <timestamp>2003-04-16T13:59:23Z</timestamp>
      <contributor>
        <ip>Appel.wur.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; UT Dodgeball}}

==Description ==

by Novacane

This is a rather simple idea. Each player joins the game with a dodgeball. That's the only weapon. You throw it, you have to go pick it up or get someone else's ball. This mod can be used on any type of game as it is just a different kind of weapon. The play mechanics would work like this. You have a ball. you can run around and just toss it at someone, and hitting them does some damage. Head shots do extra damage. If you hold the button down, you will stop moving and start to pull the ball back, charging up a power meter. The higher the meter is when you release the button, the harder you throw the ball and the more damage you do. There is no catching or deflecting of balls thrown at you (people could get too good at it and take away from the fun). This would be the basic version of the game. There would also be an option to put in powerups to take the place of normal pickups in the game. These powerups would give you the ability to perform different kinds of attacks, like a flaming dodgeball, exploding dodgeball, homing dodgeball, etc... the most common powerup would be the returning dodgeball, which would cause the ball to bounce back to you after hitting something. 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''C&amp;ndash;B:''' Sounds like a good idea, I'd definatly play it, especially in a wide open gym-like setting (Maybe some stuff to hide behind), one thing I didnt agree with though, were power-ups. Although I suppose that you could Have gameplay modes without them. Having the balls as an instant kill would be very fun. It could be played as classic dodgeball, you'd only have as many balls as half of your whole team (If there were 4 people on your team only 2 balls would spawn). I dunno, however its done, it would be fun. Especially with the Ragdoll physics :P 

'''ZxAnPhOrIaN:''' Shouldn't the translocator be in this???

'''Piglet:''' Hmm i think it would be much better one shot one kill (note: i didnt say instagib because it would be much cooler if you 'ragdolled' when your hit), the other thing you need to be carefull of (at least in a deatmatch setting) is when is a ball safe to pickup, is it when its on the ground, or when it has stopped moving or what???

'''Rens2Sea:''' Funney i just saw this :p I made a DodgeBall mod for the DeathBall mod for ut2003.&lt;br /&gt;http://dodgeball.fragwhore.com/</text>
    </revision>
    <revision>
      <id>4708</id>
      <timestamp>2003-01-28T09:39:32Z</timestamp>
      <contributor>
        <ip>Piglet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; UT Dodgeball}}

==Description ==

by Novacane

This is a rather simple idea. Each player joins the game with a dodgeball. That's the only weapon. You throw it, you have to go pick it up or get someone else's ball. This mod can be used on any type of game as it is just a different kind of weapon. The play mechanics would work like this. You have a ball. you can run around and just toss it at someone, and hitting them does some damage. Head shots do extra damage. If you hold the button down, you will stop moving and start to pull the ball back, charging up a power meter. The higher the meter is when you release the button, the harder you throw the ball and the more damage you do. There is no catching or deflecting of balls thrown at you (people could get too good at it and take away from the fun). This would be the basic version of the game. There would also be an option to put in powerups to take the place of normal pickups in the game. These powerups would give you the ability to perform different kinds of attacks, like a flaming dodgeball, exploding dodgeball, homing dodgeball, etc... the most common powerup would be the returning dodgeball, which would cause the ball to bounce back to you after hitting something. 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''C&amp;ndash;B:''' Sounds like a good idea, I'd definatly play it, especially in a wide open gym-like setting (Maybe some stuff to hide behind), one thing I didnt agree with though, were power-ups. Although I suppose that you could Have gameplay modes without them. Having the balls as an instant kill would be very fun. It could be played as classic dodgeball, you'd only have as many balls as half of your whole team (If there were 4 people on your team only 2 balls would spawn). I dunno, however its done, it would be fun. Especially with the Ragdoll physics :P 

'''ZxAnPhOrIaN:''' Shouldn't the translocator be in this???

'''Piglet:''' Hmm i think it would be much better one shot one kill (note: i didnt say instagib because it would be much cooler if you 'ragdolled' when your hit), the other thing you need to be carefull of (at least in a deatmatch setting) is when is a ball safe to pickup, is it when its on the ground, or when it has stopped moving or what???</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/DownhillUT</title>
    <id>1919</id>
    <revision>
      <id>4703</id>
      <timestamp>2007-11-02T22:41:30Z</timestamp>
      <contributor>
        <ip>Ip59936373.rubicom.hu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">DownhillUT - Bobsleing and Snowboarding meets Back To The Future meets Super Mario Kart meets UT2k3

==Description==

WARNING! Extensive description! Long Read!

====Basic Idea ====

Everyone races down a mountain to be first to the bottom... while blowing each other up... on hoverboards or in small one man hovering bobsleds.

====Scoring ====

While the race is a free-for-all to the finish, it actually counts on the best time.  You can cut 2 seconds from your time by fragging somebody, and you can cut more off with stunts of different dificulty. Beng fragged will not add any time to your score, but will set you down in the same spot 2 seconds after you die.

====Vehicles ====

Everyone either drives the Hoversled or the Hoverboard (player chooses which).

The Hoverboard is the faster of the two vehicles, but has no/very little armor and worse steering.  It is the only vehicle that can pull off stunts other than flips, and it can also jump higher.

The Hoversled is the slower of the two vehicles, but has good armor and good handling.  It is the only vehicle that can smash straight through static meshes (or if thats not possible, normal decorations). It handles landings slightly better too, but cannot pull off any stunts other than flips.

====Controls ====

Up = Mini boosters. Used on level ground to get some momentum.

Down = Reverse mini boosters. Also known as brakes.

Strafe Left = Turn left

Strafe Right = Turn right

Crouch = Activate currently selected powerup

Fire = Fires your weapon

Alt fire = Fires your weapon in alternate fire mode

Jump = Jump (duh)

Weapon Up = Next Powerup

Weapon Down = Previous powerup

====The Levels ====

All the levels are downhill ones, but dont have to be snow only, due to the fact that the vehicles hover, so you could have levels through a desert, down a long sunny stretch of grass, or even through very odd settings like the titanic, winding city streets, through the corridors of an ancient pyramid/temple, or some srange spaceship.

There would be a training level of course, with gates to stop you to explain the next area before setting the vehicle off again, showing the basic features of the game.

====The Terrain ====

'''Start Line''': An area of green textured ground where all the players spawn.  There can only be one though.

'''Guidance fences''': Come in 3 variations. The orange plastic stuff you get at the winter olympics, red forcefield beams, or a style of your choosing!  These are simply walls which instead of crashing your vehicle, turn it towards the centre of the track. Found in the tutorial level for aiming your vehicle at the pause gates.

'''Pause gates''': Blue boxes with a metal gate between them. Your vehicle pauses here in the tutorial mission to explain the next area. Could be found in other levels as an obsticle. Pause time varies according to what the level author chooses.

'''Kickers''': Your standard jump pads, probably for catching items in the air, or bouncing over walls into shortcuts or super weapons.

'''Jump ramps''': Handily marked in big blue (or red) letters saying the word JUMP, these are where you cut a second or two off your total time to give you the edge (and maybe even win the race). They can come in any shape colour or size, and my even be hidden down some shortcuts.

'''Red Inventory Boxes''': These give you basic weapons, such as missiles or mines, one of the most common types of boxes.

'''Yellow Inventory Crates''': These give you basic power-ups, such as speed boost or 1.5x damage, the other most common type of box.

'''Ghostly Inventory Crates''': These give you power-ups only for the Hoverboard, such as higher jumping, and faster stunts.

'''Steel Inventory Crates''': These give you power-ups only for the Hoversled, such as power ram or cutters.

'''Blue Inventory Crates''': w00t! these give you the super weapons, such as the redeemer, or the leader-seeker. Super rare.

'''Green Inventory Crates''':w00t! these give you the super power-ups, such as invincibility or quad damage. Super rare.

'''Gold inventory crates''': These drop your total time by about 5 seconds. Quite rare.

'''Teleports''': Your standard one way portal. Often used where you cant bounce over or break through something, or used at the end of a secret area to keep the location disclosed.

'''Trees/Cars/Logs/Statues/Low Walls''': These block the Hoverboard, but can be broken by a Hoversled.

'''Trains''': Watch out! These things can really ruin your day, because touching them &amp;ndash;&gt; fragged. Just look for the flashing red lights that tell you when the train's about to hit. Some other trains are so long, theyre there for the whole race, so use the nearby ramps!

'''Stop Watches''': Pause your time for about 1.5 seconds. Very useful, but rare.

'''Water''': Yo7ur vehicles float above water like it were solid ground, but if you fall into it from a height, you sink through, allowing you to land from very high up unharmed.

'''Finish line''': Signified by the classic chequered area on the floor, these are where the race ends, but there are also three special varients of the finish line.

'''Floating finish line:''' signified by a floating chequered pattern portal in mid air, these are usually found floating over the normal finish, and give half a second off your finish time.

'''Distance finish line''': similar to both the Normal finish and the floating finish. these are on the floor, but you have to jump into them, the further you jump into them, the more half-seconds are taken off your time. The zones are usually signified by diferent backround colours in the chequered area.

'''Super secret secret finish''': these take two seconds off your time, but are ultra rare, and found in secret areas near the end of the run.

====Weapons ====

'''Missiles''': These are your run of the mill projectiles. Most abundant weapon in the game. Fire shoots one missile forward. Alt fire attaches two missiles to the sides of your vehicles for a mini speed boost.

'''Homing missiles''': Same as the regular missiles, but with a bit more of a kick, and home in on the player in front. Fire launches one homing missile forwards. Alt fire is exactly the same as that of the regular misiles, but forces the player on a collision course with the player in front.

'''Mines''': Drop and forget. these are a nice welcome gift for the people behind you. Fire drops a mine which hovers just above the usual height of the vehicles. Alt fire drops a mine that rolls slowly downhill until it hits a wall, or hits a vehicle.

'''Amp mines''': Nice and explosive, other than that, they are exactly the same as normal mines.

'''EMP Mines''': Blue and glowy. Same fire modes as the other mines, but when they hit a person, they explode with an EMP, shutting off the anti-grav thingys in the vehicles for 2.5 seconds.

'''Machine Guns''': This is really just the assult rifle.

====Super Weapons ====

'''Teh 'deemer''': TEH 'DEMER! do i need to say any more?

'''Leader Seeker''': An instant frag missile that seeks out the leader in both fire modes. Unfortunately, if you are the leader, its a suicide weapon.

'''Insta-gib''': Teh insta gib rifle! do i need to say more?

'''Mini-gun''': Machine guns but twice as powerfull.

'''Black hole launcher''': have you ever messed around with the ChaosUT super weapons and came across the vortex launcher\? this could be a less buggy vesion of that. Fire launches a black hole missile, which upon impact, sucks in all nearby players. Alt fire drops a black hole mine.

====Power-ups ====

'''1.5x damage''': Multiplies the damage by 1.5. pretty nifty if you need to finish of someone further ahead. instant effect

'''Speed boost''': Doubles your speed for 5 seconds. perfect for getting that extra bit of free time from a distance finish. trigger when you want

'''Force field''': Gives you 75 armour, instant effect.

'''Translocator''': The translocator, one shot only.

====Super Power-ups ====

'''Invincibility''': Invincibility for 30 seconds. Instant effect.

'''Quad Damage''': Multiplies damage by 4. Instant effect.

'''NoS boost''': Quadruples speed for 5 seconds. Trigger when you want.

'''Teleport Rifle''': Instagib rifle except teleports you to the location of where it hit, one shot only

====Hoversled Only Power-ups ====

'''Power Ram''': Gives you the power to ram through anything destructible (including players) without loosing speed for 10 seconds. Instant effect.

'''Cutters''': Adds razor blades to the sides of the Hoversled, allowing you to cause damage to players if you bump into them from the side. Stays on for 4 bumps. Instant effect.

'''Streamlining''': Replaces the current shell of the Hoversled with a more streamlined version, incrasing your maximum speed. Lasts until the end of the race. Instant effect.

====Hoverboard Only Power-Ups ====

'''Power hopper''': Launches high pressure jets of air below the board, increasing jump height. Lasts for 3 jumps. Instant effect.

'''Improved control jets''': Launches high pressure jets of air from the board in all directions allowing faster stunts. Lasts for one jump. Instant Effect.

'''Spin jets''': Launches high pressure jets of air from the front nd aft sides of he board, allowing improved turning. Lasts until the race ends. Instant Effect.

====Stunts ====

'''Forward Flip''': Makes your vehicle flip over forwards in mid air. Both Vehicles. Takes 2 seconds off your time.

'''Back Flip''': Makes your vehicle flip over backwards in mid air. Both Vehicles. Takes 2 seconds off your time.

Umm. Cant think of any more tricks. If anyone has that Tony Hawk's like snowboarding game, can they mail me some of the tricks and what they do?

====Misc. Notes ====

All the weapons (except the machine gun) have a maximum one round.

The Machine Gun can fire for 5 seconds after the first bullet is fired

You can only hold one weapon at a time.

Inventory crates respawn 0.25 seconds after they are collected

Levels would be able to have more than one finishing area, and dont have to be in a straight line (un like most snowboarding games, which always have straight down tracks with minor turns.

By walls, any slope over 45 dgrees up from the current surface counts as a wall. 45 degrees or under counts as floor, so you could make loops and halfpipes.

----

==Interested Scripters==

Icedude (well, i'd be more of a mapper, cause i cant code to save my life)

Darkwarrior (Might be able to make some of the weapons)

----

==Discussion==

'''ZxAnPhOrIaN:''' WOW! This will be really cool! I look foreward to playing this mod!

'''ZxAnPhOrIaN:''' When the emp mines blows up, does it shut of the anit-grav things on the person who planted the bomb?

'''Icedude:''' No, mines dont affect the person who dropped them

'''ZxAnPhOrIaN:''' k.

'''ZxAnPhOrIaN:''' Have a cool effect with the cutters! You should have the cutters get damaged until it falls off.

'''Icedude:''' I got it! The staticmeshes that the hoversled can ram out of the way could be KActors, so instead of them being destroyed, they just get knocked out of the way!

'''Icedude:''' If you want to see what i mean, rent Sonic Adventure 2 Battle for the Gamecube (of you dont already own it) and play the first level for the heros, you'll see what i was thinking of

'''ProjectX:''' This looks cool, can't wait to see it, btw, the obvious tricks would be 360 degree turns, etc. and a mixture between a flip and a turn, you could have a sort of kick flip thing, i dunno, these are just brief ideas

'''Icedude:''' Maybe turning could be doneby turning the camear at the normal speed, and then the player turning around to face the same way as the camera (like in AirfightUT)

'''Piglet:''' Sounds a little like the hover race mod for Q1, could be cool but with a huge specification like that it's unlikely it will ever truly be made (sad but true) that said a simmilar but simpler mod along simmilar ideas may be more possible (say a hoverboard mutator or something)

'''Mosquito:''' Turning should be if you press a strafe key, it fires a revse thruster to the respective side, so for breaking you press both sides at once! that would be totally badass

'''Doodle77:''' Awesome idea, you might want to add a less crazy speed powerup type thing like in CarBall. also maybye an invisbilty powerup. you cant forget rolling as a trick , that could be done in a hoversled. would it always be downhill or would there be flat areas? how bout gravity mines, lay them after jumps and people just get pulled down so they cant do tricks.

'''amitakartok:''' How cool it would be if there were a superweapon which fires a rope-like energy barrier onto two enemies in front of you, ramming them into each other? Or giving you a speed boost (like the grappling hook in Lego Racers [hit enemy in front of you, he will stop and give his speed to you])?

----</text>
    </revision>
    <revision>
      <id>4704</id>
      <timestamp>2004-08-02T16:59:30Z</timestamp>
      <contributor>
        <ip>Mr.Bob</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">DownhillUT - Bobsleing and Snowboarding meets Back To The Future meets Super Mario Kart meets UT2k3

==Description==

WARNING! Extensive description! Long Read!

====Basic Idea ====

Everyone races down a mountain to be first to the bottom... while blowing each other up... on hoverboards or in small one man hovering bobsleds.

====Scoring ====

While the race is a free-for-all to the finish, it actually counts on the best time.  You can cut 2 seconds from your time by fragging somebody, and you can cut more off with stunts of different dificulty. Beng fragged will not add any time to your score, but will set you down in the same spot 2 seconds after you die.

====Vehicles ====

Everyone either drives the Hoversled or the Hoverboard (player chooses which).

The Hoverboard is the faster of the two vehicles, but has no/very little armor and worse steering.  It is the only vehicle that can pull off stunts other than flips, and it can also jump higher.

The Hoversled is the slower of the two vehicles, but has good armor and good handling.  It is the only vehicle that can smash straight through static meshes (or if thats not possible, normal decorations). It handles landings slightly better too, but cannot pull off any stunts other than flips.

====Controls ====

Up = Mini boosters. Used on level ground to get some momentum.

Down = Reverse mini boosters. Also known as brakes.

Strafe Left = Turn left

Strafe Right = Turn right

Crouch = Activate currently selected powerup

Fire = Fires your weapon

Alt fire = Fires your weapon in alternate fire mode

Jump = Jump (duh)

Weapon Up = Next Powerup

Weapon Down = Previous powerup

====The Levels ====

All the levels are downhill ones, but dont have to be snow only, due to the fact that the vehicles hover, so you could have levels through a desert, down a long sunny stretch of grass, or even through very odd settings like the titanic, winding city streets, through the corridors of an ancient pyramid/temple, or some srange spaceship.

There would be a training level of course, with gates to stop you to explain the next area before setting the vehicle off again, showing the basic features of the game.

====The Terrain ====

'''Start Line''': An area of green textured ground where all the players spawn.  There can only be one though.

'''Guidance fences''': Come in 3 variations. The orange plastic stuff you get at the winter olympics, red forcefield beams, or a style of your choosing!  These are simply walls which instead of crashing your vehicle, turn it towards the centre of the track. Found in the tutorial level for aiming your vehicle at the pause gates.

'''Pause gates''': Blue boxes with a metal gate between them. Your vehicle pauses here in the tutorial mission to explain the next area. Could be found in other levels as an obsticle. Pause time varies according to what the level author chooses.

'''Kickers''': Your standard jump pads, probably for catching items in the air, or bouncing over walls into shortcuts or super weapons.

'''Jump ramps''': Handily marked in big blue (or red) letters saying the word JUMP, these are where you cut a second or two off your total time to give you the edge (and maybe even win the race). They can come in any shape colour or size, and my even be hidden down some shortcuts.

'''Red Inventory Boxes''': These give you basic weapons, such as missiles or mines, one of the most common types of boxes.

'''Yellow Inventory Crates''': These give you basic power-ups, such as speed boost or 1.5x damage, the other most common type of box.

'''Ghostly Inventory Crates''': These give you power-ups only for the Hoverboard, such as higher jumping, and faster stunts.

'''Steel Inventory Crates''': These give you power-ups only for the Hoversled, such as power ram or cutters.

'''Blue Inventory Crates''': w00t! these give you the super weapons, such as the redeemer, or the leader-seeker. Super rare.

'''Green Inventory Crates''':w00t! these give you the super power-ups, such as invincibility or quad damage. Super rare.

'''Gold inventory crates''': These drop your total time by about 5 seconds. Quite rare.

'''Teleports''': Your standard one way portal. Often used where you cant bounce over or break through something, or used at the end of a secret area to keep the location disclosed.

'''Trees/Cars/Logs/Statues/Low Walls''': These block the Hoverboard, but can be broken by a Hoversled.

'''Trains''': Watch out! These things can really ruin your day, because touching them &amp;ndash;&gt; fragged. Just look for the flashing red lights that tell you when the train's about to hit. Some other trains are so long, theyre there for the whole race, so use the nearby ramps!

'''Stop Watches''': Pause your time for about 1.5 seconds. Very useful, but rare.

'''Water''': Yo7ur vehicles float above water like it were solid ground, but if you fall into it from a height, you sink through, allowing you to land from very high up unharmed.

'''Finish line''': Signified by the classic chequered area on the floor, these are where the race ends, but there are also three special varients of the finish line.

'''Floating finish line:''' signified by a floating chequered pattern portal in mid air, these are usually found floating over the normal finish, and give half a second off your finish time.

'''Distance finish line''': similar to both the Normal finish and the floating finish. these are on the floor, but you have to jump into them, the further you jump into them, the more half-seconds are taken off your time. The zones are usually signified by diferent backround colours in the chequered area.

'''Super secret secret finish''': these take two seconds off your time, but are ultra rare, and found in secret areas near the end of the run.

====Weapons ====

'''Missiles''': These are your run of the mill projectiles. Most abundant weapon in the game. Fire shoots one missile forward. Alt fire attaches two missiles to the sides of your vehicles for a mini speed boost.

'''Homing missiles''': Same as the regular missiles, but with a bit more of a kick, and home in on the player in front. Fire launches one homing missile forwards. Alt fire is exactly the same as that of the regular misiles, but forces the player on a collision course with the player in front.

'''Mines''': Drop and forget. these are a nice welcome gift for the people behind you. Fire drops a mine which hovers just above the usual height of the vehicles. Alt fire drops a mine that rolls slowly downhill until it hits a wall, or hits a vehicle.

'''Amp mines''': Nice and explosive, other than that, they are exactly the same as normal mines.

'''EMP Mines''': Blue and glowy. Same fire modes as the other mines, but when they hit a person, they explode with an EMP, shutting off the anti-grav thingys in the vehicles for 2.5 seconds.

'''Machine Guns''': This is really just the assult rifle.

====Super Weapons ====

'''Teh 'deemer''': TEH 'DEMER! do i need to say any more?

'''Leader Seeker''': An instant frag missile that seeks out the leader in both fire modes. Unfortunately, if you are the leader, its a suicide weapon.

'''Insta-gib''': Teh insta gib rifle! do i need to say more?

'''Mini-gun''': Machine guns but twice as powerfull.

'''Black hole launcher''': have you ever messed around with the ChaosUT super weapons and came across the vortex launcher\? this could be a less buggy vesion of that. Fire launches a black hole missile, which upon impact, sucks in all nearby players. Alt fire drops a black hole mine.

====Power-ups ====

'''1.5x damage''': Multiplies the damage by 1.5. pretty nifty if you need to finish of someone further ahead. instant effect

'''Speed boost''': Doubles your speed for 5 seconds. perfect for getting that extra bit of free time from a distance finish. trigger when you want

'''Force field''': Gives you 75 armour, instant effect.

'''Translocator''': The translocator, one shot only.

====Super Power-ups ====

'''Invincibility''': Invincibility for 30 seconds. Instant effect.

'''Quad Damage''': Multiplies damage by 4. Instant effect.

'''NoS boost''': Quadruples speed for 5 seconds. Trigger when you want.

'''Teleport Rifle''': Instagib rifle except teleports you to the location of where it hit, one shot only

====Hoversled Only Power-ups ====

'''Power Ram''': Gives you the power to ram through anything destructible (including players) without loosing speed for 10 seconds. Instant effect.

'''Cutters''': Adds razor blades to the sides of the Hoversled, allowing you to cause damage to players if you bump into them from the side. Stays on for 4 bumps. Instant effect.

'''Streamlining''': Replaces the current shell of the Hoversled with a more streamlined version, incrasing your maximum speed. Lasts until the end of the race. Instant effect.

====Hoverboard Only Power-Ups ====

'''Power hopper''': Launches high pressure jets of air below the board, increasing jump height. Lasts for 3 jumps. Instant effect.

'''Improved control jets''': Launches high pressure jets of air from the board in all directions allowing faster stunts. Lasts for one jump. Instant Effect.

'''Spin jets''': Launches high pressure jets of air from the front nd aft sides of he board, allowing improved turning. Lasts until the race ends. Instant Effect.

====Stunts ====

'''Forward Flip''': Makes your vehicle flip over forwards in mid air. Both Vehicles. Takes 2 seconds off your time.

'''Back Flip''': Makes your vehicle flip over backwards in mid air. Both Vehicles. Takes 2 seconds off your time.

Umm. Cant think of any more tricks. If anyone has that Tony Hawk's like snowboarding game, can they mail me some of the tricks and what they do?

====Misc. Notes ====

All the weapons (except the machine gun) have a maximum one round.

The Machine Gun can fire for 5 seconds after the first bullet is fired

You can only hold one weapon at a time.

Inventory crates respawn 0.25 seconds after they are collected

Levels would be able to have more than one finishing area, and dont have to be in a straight line (un like most snowboarding games, which always have straight down tracks with minor turns.

By walls, any slope over 45 dgrees up from the current surface counts as a wall. 45 degrees or under counts as floor, so you could make loops and halfpipes.

----

==Interested Scripters==

Icedude (well, i'd be more of a mapper, cause i cant code to save my life)

Darkwarrior (Might be able to make some of the weapons)

----

==Discussion==

'''ZxAnPhOrIaN:''' WOW! This will be really cool! I look foreward to playing this mod!

'''ZxAnPhOrIaN:''' When the emp mines blows up, does it shut of the anit-grav things on the person who planted the bomb?

'''Icedude:''' No, mines dont affect the person who dropped them

'''ZxAnPhOrIaN:''' k.

'''ZxAnPhOrIaN:''' Have a cool effect with the cutters! You should have the cutters get damaged until it falls off.

'''Icedude:''' I got it! The staticmeshes that the hoversled can ram out of the way could be KActors, so instead of them being destroyed, they just get knocked out of the way!

'''Icedude:''' If you want to see what i mean, rent Sonic Adventure 2 Battle for the Gamecube (of you dont already own it) and play the first level for the heros, you'll see what i was thinking of

'''ProjectX:''' This looks cool, can't wait to see it, btw, the obvious tricks would be 360 degree turns, etc. and a mixture between a flip and a turn, you could have a sort of kick flip thing, i dunno, these are just brief ideas

'''Icedude:''' Maybe turning could be doneby turning the camear at the normal speed, and then the player turning around to face the same way as the camera (like in AirfightUT)

'''Piglet:''' Sounds a little like the hover race mod for Q1, could be cool but with a huge specification like that it's unlikely it will ever truly be made (sad but true) that said a simmilar but simpler mod along simmilar ideas may be more possible (say a hoverboard mutator or something)

'''Mosquito:''' Turning should be if you press a strafe key, it fires a revse thruster to the respective side, so for breaking you press both sides at once! that would be totally badass

'''Doodle77:''' Awesome idea, you might want to add a less crazy speed powerup type thing like in CarBall. also maybye an invisbilty powerup. you cant forget rolling as a trick , that could be done in a hoversled. would it always be downhill or would there be flat areas? how bout gravity mines, lay them after jumps and people just get pulled down so they cant do tricks.

----</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/EB-Lobber</title>
    <id>1998</id>
    <revision>
      <id>4886</id>
      <timestamp>2004-02-18T16:15:53Z</timestamp>
      <contributor>
        <ip>H216n2fls34o984.telia.com</ip>
      </contributor>
      <comment>Damn UT2k4 tank's named Goliath &gt;_&lt;</comment>
      <text xml:space="preserve">==ElectroBall-Lobber ==

The EB-Lobber would be a heavy tank, like the one in the UT2k4 demo, but less square shaped. It should have a big tail that picks out huge energy balls and lobs them (catapult, sort of) far away. The driver would operate the tail and two lasers fixed forward. The second guy would have the same canon as on the UT2k4 tank.

This should be a (circular?) hovering tank. Thinking more of it, this sounds pretty much like a mix between the Federation tank in StarWars 1, mixed with the Gungan catapult. Hmm, seems like a rip off, but it would be cool! ;)

==Comments ==

'''Foxpaw:''' I don't think we need bigger, tougher vehicles. Right now there's a shaky balance between the vehicles. What advantage would the regular tank have over this - that is, why would anyone use the regular tank instead? Since the tank is already arguably the &quot;best&quot; vehicle in UT2004, I don't think that it would help gameplay to make something the same only even more powerful.

'''Mosquito:''' Foxpaw, thats not completely, afew well placed seeking missles at a Tank from a raptor does the trick

'''Foxpaw:''' Well, yes, I think that DE ensured that there was always something that could beat each vehicle. I merely think that the tank can beat more types of vehicle than any other type of vehicle. (Basically anything except a raptor, or possibly a hellbender if you have a few people in it. Though, if you have someone in the minigun turret, even raptors aren't a problem.)

'''Legal:''' The downside of this vehicle would be the slow speed and low ROF. The Raptor is rather useless, as a turret picks it down easily.

'''Foxpaw:''' Well, since it has a regular tank turret PLUS the ball launcher, it's combined ROF would have to be at least equal to the regular tank. And the regular tank is pretty slow already.

'''Legal:''' The turret I'm referring to is the small MG for the passenger, not the main gun ;)

Also, this tank would be very slow, not moving faster than a player can run. This would of course make it bad for close combat and travelling distances, but imagine the big purple ball striking the ground 300 meters away and sending out lightning bolts (same as Lightning Gun) in a 512 uu radius..

It'd be a sitting duck, apart from the minigun turret and the fixed short-range cannon, but the awesome power of the catapult would surely be worth it.

'''Foxpaw:''' Oh, so it'd be like artillery, instead of a tank? That could be a good thing then. It would, at the very least, force players to be more aggressive. (by forcing them to keep on the move)

'''Legal:''' Yeah, pretty much. Due to the low speed it wouldn't be able to turn fast enough to use its big CC guns or the catapult when attacked from the side, leaving the defence to the minigun turret. So really, it would be great for bombarding the opponents base, wreaking massive havoc, but it wouldn't last long without some backup. Though I doubt it'd matter much if you are moving, as it would be slow.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Eclipse</title>
    <id>1996</id>
    <revision>
      <id>4881</id>
      <timestamp>2004-02-15T21:49:35Z</timestamp>
      <contributor>
        <ip>H216n2fls34o984.telia.com</ip>
      </contributor>
      <comment>Heavy bomber (if not in UT2k4)</comment>
      <text xml:space="preserve">==Heavy bomber==

Moves slow, can't be damaged by any guns from under (except for superweapons). Three crew: One pilot, one bomber and one turret gunner. Massive bombload (think one playersized bomb per second) and the turret has two miniguns fireing Shockrifle-beams at the same rate as bullets.

The bombs should shake the earth where they land, 512 radius.

'''LegalAssassin:''' I'll make a model for this (for fun), perhaps someone would like to script it. We'll see ;)</text>
    </revision>
    <revision>
      <id>4882</id>
      <timestamp>2004-02-15T21:49:24Z</timestamp>
      <contributor>
        <ip>H216n2fls34o984.telia.com</ip>
      </contributor>
      <comment>Heavy bomber (if not in UT2k4)</comment>
      <text xml:space="preserve">==Heavy bomber==

Moves slow, can't be damaged by any guns from under (except for superweapons). Three crew: One pilot, one bomber and one turret gunner. Massive bombload (think one playersized bomb per second) and the turret has two miniguns fireing Shockrifle-beams at the same rate as bullets.

The bombs should shake the earth where they land, 512 radius.

''LegalAssassin:'' I'll make a model for this (for fun), perhaps someone would like to script it. We'll see ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Enhanced Spectator Camera</title>
    <id>1956</id>
    <revision>
      <id>4789</id>
      <timestamp>2003-12-29T03:51:08Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <minor/>
      <comment>Fixed up formatting a little bit.</comment>
      <text xml:space="preserve">{{classbox|Enhancing the Spectating Experience}}

==Disclaimer ==

Previously, this disclaimer described how I owned a Mac and lacked UT2003 and lacked UED.  That has all changed and now I have my very custom built PC and a copy of UT 2003.  So, I have been immersed in trying to learn the editor. I'm back to clean up this article a bit.  

Please leave the text I've written and add your comments at the bottom.

==The Basic Concept ==

I first had a very complicated idea for a HUD driven system which could eventually be expanded to have video effects and all sorts of insanity.  After playing a spectacular online round on CTF-Face, it dawned on me - the camera system should be simple and smooth. The viewer should be able to follow the action he/she wants and see it as if it were on ESPN... But it's not.  Its USN - Unreal Sports Network!   :D

====Basic Improvements ====

*Ability to store several bookmarks of your current camera placement.
*A way to cycle through saved camera coordinates
*A way to quickly jump between your bookmarks, free floating (&quot;own camera&quot;), 
*Zooming
*Add a few hotkeys for controling the cameras functions

====Special Enhancements ====

*Smooth the data from a server in regards to a camera's focal point.  Thus eleminating the nausea inducing jitters.
*Create a player follow mode which detects the nearest 'Saved camera' and switches the view to it.
*Have a special score display system that works like the sports tickers on CNN and ESPN
*Have a way to automaticly follow the most exciting action.
*Have a letterboxed mode
*Be able to save all camera settings per map from within the game.

===Basic Operation ===

====Saving Camera Coordinates ====

A simple keypress I should think? No?  It's simple, you enter a server and are automaticly viewing from 'own camera'.  Fly around and find a great vantage point, click left mouse.  Console feedback says: &quot;Camera001 Created&quot;  &amp;rarr; It should be that simple and functional.

====Cycling Saved Cameras ====

A touch of complexity here.  It's time to create viewing modes  There should be four viewing modes in total:

*Own Camera - The basic view, with total freedom.  Type 'ghost' in console to pass through walls and meshes.

*Bookmarked Cameras - The coordinates and settings of a previous perspective used by Own Camera.  Bookmarks can be locked or free.  They always start locked to prevent them from being accidentaly shifted. You will be able to move your view around, but not into the x/y/z/ planes.  Press the hotkey though and the camera will be free again. 

*Player Cameras - The view behind and following a player. You can spin the camera around the player like you can now.  

*TV Camera - The most dynamic of the new modes...Also the most complicated, so I'll explain in a seperate section.

If I click the left mouse button I should be able to cycle between those four modes, with the console feedback letting me know I did so.  The mouse wheel could now be used to cycle the Saved and Player cameras.  The Own Camera is unique and does not cycle.  

====Zooming ====

Self explanatory I should think.  I want to click that extra mouse button I have and zoom way into the watch, then zoom WAY out and watch from the blimp.  Zoom should be two keys (Zoom in/Out). Zoom should work from with in any camera mode... Just think Wayne's World meets CTF :D

==TV MODE ==

{{innerbox| What's this all about?!  Unreal Tournament got its own TV show??  No.  Not really, but maybe someday you'll see your virtual self on the radical sports network.  That's what I'd like this mode to feel like.  A radical sports presentation.  How would it work?  It's success, and any good sports coverage, is dependant on good camera placement.  Hence the idea of Saving camera coordinates.  But to REALLY make this work, you need to have premade camera layouts made by the folx at Epic for the custom levels, and by mappers for their own levels.  Each spectator could make their own... But come on!  Imagine watching the superbowl feed from some d00d in the nose bl33d section.  No, this needs to be done with style to really work.  

}}

TV Mode needs to be Un-Officialy Intelligent.  What I mean by that is:  The spectator should feel like they are enjoying the best the 'event' has to offer. 

How does that work???  SIMPLE!!!  Create a menu in preferences which lets you 'describe' the viewing experience you want.  

====TV Mode Preferences ====

*Follow Best players
*Follow Red/Blue team only
*Follow Players on streaks
*Follow Highest player density
*Follow Campers
*Follow Worst players
*Follow Game Objective (BR Ball, CTF Flag, DD Points) -[[Legacy:MythOpus|MythOpus]] 
*Add to this list

And so on and so forth. Of course, TV Mode is not without contol. Upon clicking the hotkey, the view immediatley returns to Own View.  That way action can be followed that the saved cameras can't see or that TV Mode isn't keeping up with.

====Closing  ====

It has been a few months since I originally posted this idea, and I see a few comments have even been added!  Plus, now I am actually building my own maps and digging into the new editing tools.  That being said, I think it would be fairly easy to code the &quot;Basic Enhanced Camera Mode&quot;.  TV Camera mode would be a large undertaking so I doubt it will ever see the light of day (although Epic would be wise to add it in UT 2005!) 

==Comments ==

'''Guest:'''  Great idea!  I am a veteran UT player since the game was first released.  I have created a couple of dozen maps for UT. How about adding a speed control for the camera, so that you can control the rate of movement speed? For example, a player with 100% adrenaline chooses speed mode; therefore he is able to run faster and you want to continue To follow him with the camera with camera speed rate control you will be able to increase the speed the camera is able to move, perhaps by using hot keys grey + and grey -.         

'''Guest:''' How about having the camera able to follow the Bombing Run Ball, or to be able to choose which CTF flag to follow, and following the winning player?

'''MythOpus:''' I Like. ^ He Likes.  We All Like :D And maybe (since this is such an ideal modification) at a program where a server Admin (or the host of a server) can set up a system where any player who doesn't wanna load UT/2K3 can just open up the program, connect to the server created by the admin and watch the game as a spectator ( Can/Can't Chat?) And add sounds like | WO ! | when the palyer drops the flag or ball , or | He's ON Fire ! | When some1 gets like 5 goals in a row or like 40 kills in a row. Just A Suggestion :)

'''MythOpus:''' Any1 interested in implementing this lil idea ?

'''The Twiggman:''' Lol, mint idea man. I think we need instant replays of say like multikills or something. That would be neat. Or have some audio so that you can have your annoncer talk more. Like for example &quot;Joe Blow just got a multikill&quot; or &quot;Joe Blow scored a goal&quot;. Doesn't the game already have sounds for the bots names anyways, so that can't be hard to code. Just got to get the speech inbetween to work.

'''Lev:''' My thought on how the ui/controls would work would be have alt fire as change camera mode and primary fire as loop available cameras for that mode (just like the current spectator mode) then for each camera mode you have your option menu accessible through the voice comms menu (&quot;V&quot; currently I think) That would allow you to add new cameras and do lots of different actions pretty intuitively. I’m going to look into this and if it’s within my ohso limited skills and be very interested in implementing the basic version at least.</text>
    </revision>
    <revision>
      <id>4790</id>
      <timestamp>2003-06-22T21:34:23Z</timestamp>
      <contributor>
        <ip>The Twiggman</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Enhancing the Spectating Experience}}

==Disclaimer ==

Previously, this disclaimer described how I owned a Mac and lacked UT2003 and lacked UED.  That has all changed 

and now I have my very custom built PC and a copy of UT 2003.  So, I have been immersed in trying to learn

the editor. I'm back to clean up this article a bit.  

Please leave the text I've written and add your comments at the bottom.

==The Basic Concept ==

I first had a very complicated idea for a HUD driven system which could eventually be expanded to have video effects and all sorts of insanity.  After playing a spectacular online round on CTF-Face, it dawned on me - the camera system should be simple and smooth. The viewer should be able to follow the action he/she wants and see it as if it were on ESPN... But it's not.  Its USN - Unreal Sports Network!   :D

====Basic Improvements ====

*Ability to store several bookmarks of your current camera placement.
*A way to cycle through saved camera coordinates
*A way to quickly jump between your bookmarks, free floating (&quot;own camera&quot;), 
*Zooming
*Add a few hotkeys for controling the cameras functions

====Special Enhancements ====

*Smooth the data from a server in regards to a camera's focal point.  Thus eleminating the nausea inducing jitters.
*Create a player follow mode which detects the nearest 'Saved camera' and switches the view to it.
*Have a special score display system that works like the sports tickers on CNN and ESPN
*Have a way to automaticly follow the most exciting action.
*Have a letterboxed mode
*Be able to save all camera settings per map from within the game.

===Basic Operation ===

====Saving Camera Coordinates ====

A simple keypress I should think? No?  It's simple, you enter a server and are automaticly viewing from 'own camera'.  Fly around and find a great vantage point, click left mouse.  Console feedback says: &quot;Camera001 Created&quot;  &amp;rarr; It should be that simple and functional.

====Cycling Saved Cameras ====

A touch of complexity here.  It's time to create viewing modes  There should be four viewing modes in total:

*Own Camera - The basic view, with total freedom.  Type 'ghost' in console to pass through walls and meshes.

*Bookmarked Cameras - The coordinates and settings of a previous perspective used by Own Camera.  Bookmarks can be locked or free.  They always start locked to prevent them from being accidentaly shifted. You will be able to move your view around, but not into the x/y/z/ planes.  Press the hotkey though and the camera will be free again. 

*Player Cameras - The view behind and following a player. You can spin the camera around the player like you can now.  

*TV Camera - The most dynamic of the new modes...Also the most complicated, so I'll explain in a seperate section.

If I click the left mouse button I should be able to cycle between those four modes, with the console feedback letting me know I did so.  The mouse wheel could now be used to cycle the Saved and Player cameras.  The Own Camera is unique and does not cycle.  

====Zooming ====

Self explanatory I should think.  I want to click that extra mouse button I have and zoom way into the watch, then zoom WAY out and watch from the blimp.  Zoom should be two keys (Zoom in/Out). Zoom should work from with in any camera mode... Just think Wayne's World meets CTF :D

==TV MODE ==

{{innerbox| What's this all about?!  Unreal Tournament got its own TV show??  No.  Not really, but maybe someday you'll see your virtual self on the radical sports network.  That's what I'd like this mode to feel like.  A radical sports presentation.  How would it work?  It's success, and any good sports coverage, is dependant on good camera placement.  Hence the idea of Saving camera coordinates.  But to REALLY make this work, you need to have premade camera layouts made by the folx at Epic for the custom levels, and by mappers for their own levels.  Each spectator could make their own... But come on!  Imagine watching the superbowl feed from some d00d in the nose bl33d section.  No, this needs to be done with style to really work.  

}}

TV Mode needs to be Un-Officialy Intelligent.  What I mean by that is:  The spectator should feel like they are enjoying the best the 'event' has to offer. 

How does that work???  SIMPLE!!!  Create a menu in preferences which lets you 'describe' the viewing experience you want.  

====TV Mode Preferences ====

*Follow Best players
*Follow Red/Blue team only
*Follow Players on streaks
*Follow Highest player density
*Follow Campers
*Follow Worst players
*Follow Game Objective (BR Ball, CTF Flag, DD Points) -[[Legacy:MythOpus|MythOpus]] 
*Add to this list

And so on and so forth. Of course, TV Mode is not without contol. Upon clicking the hotkey, the view immediatley returns to Own View.  That way action can be followed that the saved cameras can't see or that TV Mode isn't keeping up with.

====Closing  ====

It has been a few months since I originally posted this idea, and I see a few comments have even been added!  Plus, now I am actually building my own maps and

digging into the new editing tools.  That being said, I think it would be fairly easy to code the &quot;Basic Enhanced Camera Mode&quot;.  TV Camera mode would be a large

undertaking so I doubt it will ever see the light of day (although Epic would be wise to add it in UT 2005!) 

==Comments ==

'''Guest:'''  Great idea!  I am a veteran UT player since the game was first released.  I have created a couple of dozen maps for UT. How about adding a speed control for the camera, so that you can control the rate of movement speed? For example, a player with 100% adrenaline chooses speed mode; therefore he is able to run faster and you want to continue To follow him with the camera with camera speed rate control you will be able to increase the speed the camera is able to move, perhaps by using hot keys grey + and grey -.         

'''Guest:''' How about having the camera able to follow the Bombing Run Ball, or to be able to choose which CTF flag to follow, and following the winning player?

'''MythOpus:''' I Like. ^ He Likes.  We All Like :D And maybe (since this is such an ideal modification) at a program where a server Admin (or the host of a server) can set up a system where any player who doesn't wanna load UT/2K3 can just open up the program, connect to the server created by the admin and watch the game as a spectator ( Can/Can't Chat?) And add sounds like | WO ! | when the palyer drops the flag or ball , or | He's ON Fire ! | When some1 gets like 5 goals in a row or like 40 kills in a row. Just A Suggestion :)

'''MythOpus:''' Any1 interested in implementing this lil idea ?

'''The Twiggman:''' Lol, mint idea man. I think we need instant replays of say like multikills or something. That would be neat. Or have some audio so that you can have your annoncer talk more. Like for example &quot;Joe Blow just got a multikill&quot; or &quot;Joe Blow scored a goal&quot;. Doesn't the game already have sounds for the bots names anyways, so that can't be hard to code. Just got to get the speech inbetween to work.</text>
    </revision>
    <revision>
      <id>4791</id>
      <timestamp>2003-06-22T23:27:54Z</timestamp>
      <contributor>
        <ip>Lev</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Enhancing the Spectating Experience}}

==Disclaimer ==

Previously, this disclaimer described how I owned a Mac and lacked UT2003 and lacked UED.  That has all changed 

and now I have my very custom built PC and a copy of UT 2003.  So, I have been immersed in trying to learn

the editor. I'm back to clean up this article a bit.  

Please leave the text I've written and add your comments at the bottom.

==The Basic Concept ==

I first had a very complicated idea for a HUD driven system which could eventually be expanded to have video effects and all sorts of insanity.  After playing a spectacular online round on CTF-Face, it dawned on me - the camera system should be simple and smooth. The viewer should be able to follow the action he/she wants and see it as if it were on ESPN... But it's not.  Its USN - Unreal Sports Network!   :D

====Basic Improvements ====

*Ability to store several bookmarks of your current camera placement.
*A way to cycle through saved camera coordinates
*A way to quickly jump between your bookmarks, free floating (&quot;own camera&quot;), 
*Zooming
*Add a few hotkeys for controling the cameras functions

====Special Enhancements ====

*Smooth the data from a server in regards to a camera's focal point.  Thus eleminating the nausea inducing jitters.
*Create a player follow mode which detects the nearest 'Saved camera' and switches the view to it.
*Have a special score display system that works like the sports tickers on CNN and ESPN
*Have a way to automaticly follow the most exciting action.
*Have a letterboxed mode
*Be able to save all camera settings per map from within the game.

===Basic Operation ===

====Saving Camera Coordinates ====

A simple keypress I should think? No?  It's simple, you enter a server and are automaticly viewing from 'own camera'.  Fly around and find a great vantage point, click left mouse.  Console feedback says: &quot;Camera001 Created&quot;  &amp;rarr; It should be that simple and functional.

====Cycling Saved Cameras ====

A touch of complexity here.  It's time to create viewing modes  There should be four viewing modes in total:

*Own Camera - The basic view, with total freedom.  Type 'ghost' in console to pass through walls and meshes.

*Bookmarked Cameras - The coordinates and settings of a previous perspective used by Own Camera.  Bookmarks can be locked or free.  They always start locked to prevent them from being accidentaly shifted. You will be able to move your view around, but not into the x/y/z/ planes.  Press the hotkey though and the camera will be free again. 

*Player Cameras - The view behind and following a player. You can spin the camera around the player like you can now.  

*TV Camera - The most dynamic of the new modes...Also the most complicated, so I'll explain in a seperate section.

If I click the left mouse button I should be able to cycle between those four modes, with the console feedback letting me know I did so.  The mouse wheel could now be used to cycle the Saved and Player cameras.  The Own Camera is unique and does not cycle.  

====Zooming ====

Self explanatory I should think.  I want to click that extra mouse button I have and zoom way into the watch, then zoom WAY out and watch from the blimp.  Zoom should be two keys (Zoom in/Out). Zoom should work from with in any camera mode... Just think Wayne's World meets CTF :D

==TV MODE ==

{{innerbox| What's this all about?!  Unreal Tournament got its own TV show??  No.  Not really, but maybe someday you'll see your virtual self on the radical sports network.  That's what I'd like this mode to feel like.  A radical sports presentation.  How would it work?  It's success, and any good sports coverage, is dependant on good camera placement.  Hence the idea of Saving camera coordinates.  But to REALLY make this work, you need to have premade camera layouts made by the folx at Epic for the custom levels, and by mappers for their own levels.  Each spectator could make their own... But come on!  Imagine watching the superbowl feed from some d00d in the nose bl33d section.  No, this needs to be done with style to really work.  

}}

TV Mode needs to be Un-Officialy Intelligent.  What I mean by that is:  The spectator should feel like they are enjoying the best the 'event' has to offer. 

How does that work???  SIMPLE!!!  Create a menu in preferences which lets you 'describe' the viewing experience you want.  

====TV Mode Preferences ====

*Follow Best players
*Follow Red/Blue team only
*Follow Players on streaks
*Follow Highest player density
*Follow Campers
*Follow Worst players
*Follow Game Objective (BR Ball, CTF Flag, DD Points) -[[Legacy:MythOpus|MythOpus]] 
*Add to this list

And so on and so forth. Of course, TV Mode is not without contol. Upon clicking the hotkey, the view immediatley returns to Own View.  That way action can be followed that the saved cameras can't see or that TV Mode isn't keeping up with.

====Closing  ====

It has been a few months since I originally posted this idea, and I see a few comments have even been added!  Plus, now I am actually building my own maps and

digging into the new editing tools.  That being said, I think it would be fairly easy to code the &quot;Basic Enhanced Camera Mode&quot;.  TV Camera mode would be a large

undertaking so I doubt it will ever see the light of day (although Epic would be wise to add it in UT 2005!) 

==Comments ==

'''Guest:'''  Great idea!  I am a veteran UT player since the game was first released.  I have created a couple of dozen maps for UT. How about adding a speed control for the camera, so that you can control the rate of movement speed? For example, a player with 100% adrenaline chooses speed mode; therefore he is able to run faster and you want to continue To follow him with the camera with camera speed rate control you will be able to increase the speed the camera is able to move, perhaps by using hot keys grey + and grey -.         

'''Guest:''' How about having the camera able to follow the Bombing Run Ball, or to be able to choose which CTF flag to follow, and following the winning player?

'''MythOpus:''' I Like. ^ He Likes.  We All Like :D And maybe (since this is such an ideal modification) at a program where a server Admin (or the host of a server) can set up a system where any player who doesn't wanna load UT/2K3 can just open up the program, connect to the server created by the admin and watch the game as a spectator ( Can/Can't Chat?) And add sounds like | WO ! | when the palyer drops the flag or ball , or | He's ON Fire ! | When some1 gets like 5 goals in a row or like 40 kills in a row. Just A Suggestion :)

'''MythOpus:''' Any1 interested in implementing this lil idea ?

'''The Twiggman:''' Lol, mint idea man. I think we need instant replays of say like multikills or something. That would be neat. Or have some audio so that you can have your annoncer talk more. Like for example &quot;Joe Blow just got a multikill&quot; or &quot;Joe Blow scored a goal&quot;. Doesn't the game already have sounds for the bots names anyways, so that can't be hard to code. Just got to get the speech inbetween to work.

'''Lev:''' My thought on how the ui/controls would work would be have alt fire as change camera mode and primary fire as loop available cameras for that mode (just like the current spectator mode) then for each camera mode you have your option menu accessible through the voice comms menu (&quot;V&quot; currently I think) That would allow you to add new cameras and do lots of different actions pretty intuitively. I’m going to look into this and if it’s within my ohso limited skills and be very interested in implementing the basic version at least.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ExpertCTF</title>
    <id>1918</id>
    <revision>
      <id>4700</id>
      <timestamp>2006-06-24T14:36:28Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Expert CTF (the continuation of a great mod)}}

==Description ==

Expert CTF for Quake 1 and Quake 2 has been quite popular and still retains a die-hard base of about 100 players who play the Quake 2 variety regularly.  This community can be observed at http://www.thecgn.com/q2

===Gameplay ===

Expert pulls the focus away from item gathering to combat.  All players spawn on an equal playing field with 125 health and all weapons and ammo for them.  Levels of ammo are relatively low, but, like health, regen as play progresses.  Both health and ammo regen faster if the player is actively involved in combat.  Healt regens to a maximum of 160 and the levels of ammo appropriate for UT weapons is yet TBD.  Important to the development of this game, and probably the most difficult to develop is the off-hand grappling hook.  It is usable to hook to get the player anywhere (including hooking the sky) and creates a true 3-axis combat environment.  The hook moves the player in a straight line to where they hook, there is no swinging action like spider-man...  Its pull speed is about 15% faster than walking.  Throw speed is about the same.  In quake 1 and 2 it is made of particles making it easy to turn invisible (other than the hook head) for the player who cares to tweak that client-side setting.  

===Closing ===

Thanks for listening, UT folks.  If someone's interested in this idea, please contact us at the messageboard over at www.thecgn.com/q2 where we have a number of developers who have attempted ports to q3, but have been, so far, unsuccessful, though the Alliance mod for q3 did include a 'Combat' mode based on q2 Expert, the larger LMCTF community who dominates the primary mode of gameplay for that mod pretty much got rid of 'combat' mode...  Not to mention the fact that the q3 engine is just lame.. :)

====Interested Scripters ====

[[Legacy:Captain Kewl|Captain Kewl]] &amp;ndash; [[Legacy:Captain Kewl/Developer Journal|started 05 Oct 2002]].

==Discussion ==

'''EntropicLqd:'''  I took the liberty of placing it in the standard format I've adopted for these things - hope you don't mind.  That brings back memories.  My first (and last) mod for Quake was to take the ThreeWave CTF mod and merge it with the offhand grappling hook.  The resultant mod still wasn't quite what I was after so I tweaked all the weapons to death as well :).  The version of the hook I merged with the CTF code let you travel a good 20% faster I reckon - maybe even up to 30%.  The problem with building this for UT2003 (or UT) is that the &quot;sky&quot; tends to be really really high - out of reach of all but the infinitely long hooks.  Still, it's a nice idea.  I did like the offhand grapple.

'''Goner:'''  Great!  Sorry for not using the prescribed layout in my submission, but I AM at work and really ought to be working.. :)  Thanks for taking the time to go behind and fix it up!   as for the particulars of building this for UT2k3...  I've seen everything done already in mutators for UT in the form of NUIT (No-item UT) which provided the options needed to set up a server that did everything Expert does other than the hook.  In my searching I was never able to find an off-hand hook for UT.  As I understand it, making an item-based hook is the whole problem facing the coders...  It's a necessary thing to preserve the gameplay that Expert players have grown to love and the reason why we still play quake2 as much as we do (many hours per week) and have yet to find a newer engine that can capture the essence of Expert CTF.  Is an off-hand hook even possible with the tools available to an unreal developer?  

'''Goner:'''  One additional note on sky hooking..  While it might seem to be an alien concept, sky-hooking is integral to expert..  If you've ever played most any mod with a hook in it and had the experience of trying to hook around only to have your hook hit a sky brush (be it a small one in the roof of a mostly-indoor level or a large one in the middle of a giant level, you know it can be frustrating or even fatal when you make a leap and hook off to a direction and expect to get that pull in that direction only to have your hook impotently hit the sky brush and leave you falling to wherever is below you (often a pit of death, sich as in the demo ut2k3 ctf map)...  Sky hooking vs. no sky hooking is one major sticking point that the LMCTF community in quake never could embrace and it drove quite a wedge between the attempt to merge the two great Q2 mods into the single Alliance mod for Q3.  :(

'''EntropicLqd:''' Don't worry about not using the &quot;prescribed layout&quot;.  There isn't an official one.  Since I was editing it anyway I thought I might as well do a bit of reformatting.  I figured the sky-hooking thing would be an issue - which is why I raised it.  In Quake, the gap between the &quot;sky textures&quot; and the actual solid brush behind the sky was generally very very small.  In UT2003 it doesn't seem to be like that.  However - I have noticed that there are &quot;blocking brushes&quot; fairly low (to low for my liking) on BR-Anubis so it might be possible to hook onto those rather than the &quot;sky&quot;.  However, I don't know whether all levels are built that way - and community built levels definately won't be consistent in that way.  The problem is not allowing/disallowing sky hooking - it's simply one of distance.  The sky is a long long way away.  If the community was happy with completely custom maps then you could always add a visible &quot;mesh&quot; type affair around the edges of the level to grapple on to.  Either that or stick to indoor maps only - which is really all Quake was.  Personally I'd simply ignore the issue and simply have the hook able to latch onto any brush, where ever it was &amp;ndash; even on some Quake levels the sky was too far away to hook.  Someone wrote a form of grappling hook (called the beamer or something) in Unreal.  It never made it into UT for some reason, but would be possible to do.  Someone is bound to do it at some point.

'''Birelli:''' I think I remember a UT mod that had a hook in it, I forget what it was called though, I never d/led it. One reason that &quot;hook&quot; mutators in UT are sparse is that I just don't think people ''want'' a hook. The hook completely changes the dynamics of gameplay (at least it did for Q3A, which is the only Quake I've ever played). The translocator also changes this if people translocate-spam their way through a level, but there are definitely mods/mutators that set delays on it ([[Legacy:Jailbreak|Jailbreak]] for one)), which fixes that problem. Technically speaking making a hook for UT2003 should be even easier that it would have been for UT - with particle systems and such a Quake-looking hook should be quite possible. 

If a mod like this was made for UT2003, the community might be more receptive to it than the UT one was. The &quot;community&quot; of UT2003 is hard to define atm, there are just so many new people taking interest in it.

'''EntropicLqd:''' Also, the best way to use an off-hand grapple is with the right mouse button - which is used for the alternate fire mode of the weapons.  The alternate weapons fire is something you really don't want to lose.

'''Goner:''' Interesting thoughts.  And yes, map design plays into the gameplay of the hook a great deal.  I've built a couple of the maps that get regular play in Expert CTF for q2..  Protuding decorations like one sees a lot of in q3 are a big no-no...  Expert is meant to be a very high speed, 3-axis game and having things to get hung up on everywhere is no good.  For that reason there is a relatively short list of levels that the community plays on..  There are a number of mappers and even a few dedicated mapping teams who have produced a good supply of such maps..  So, any map-specific issues can be designed around, I'm sure.. :)  Thanks for the comments, Birelli.  If you were able to dig up the info on the off-hand hook you recall seeing, it might help out, since, frankly, that's the main difficult part of this whole deal... 

'''capt. k.''' Pencil me in.  Q2CTF is arguably the reason why I nearly flunked half my classes in college.  :)  Got this UTCTF mod buried on my hard drive somewhere with a working and bot supported Quake-style grapple which I just sorta lost interest in after concluding that no one else would be interested either...

'''Goner:''' Cool! :)  Is that hook a weapon-based or item-based hook?  In other words, can it be freely used at the same time as a weapon?

'''Mr.Mitchell:''' ChaosUT has a nice &quot;itembased&quot; grapplinghook.

'''capt. k.'''  It's a weapon, but in UT weapons *are* items, so it doesn't really matter.  Though I think it's best to just sit and wait a week or so for 2k3 to come out &amp;ndash; and just redo it all from scratch &amp;ndash; as there will be some changes in the 2k3 class hierarchy.

One thing: I'm wondering how much of this would be better suited for a series of mutators rather than a gametype.  2k3ctf already has a scoring system similar to threewave q2, I believe.  I'm betting that things like regeneration and no items may even come prepackaged &amp;ndash; if not, they'll be among the first mutators made.  Which really just leaves the grapple... which is just a single weapon replacement.

'''EntropicLqd:''' Actually, the grapple cannot be a weapon replacement - it's much closer in behaviour to an inventory item than a weapon.  The single most important feature of the grapple is that it's off-hand.  You hold down a key to grapple someplace, but at the same time you can be firing weapons, changing weapons, all that sort of stuff.  Think of it in terms of a flashlight.  The flashlight can be on or off, but doesn't affect your ability to do anything else in the game.  In order to get the bot AI working correctly you'd probably have to make it a new game type - you '''can''' change the AI using a mutator but there are limits on how much you can tweak.

'''capt.k.:'''  Obviously it's going to involve more than just making a working grapple, but I still think it's doable with just a mutator.  Again, I think it's best to wait for 2k3 to actually come out.

'''DEVIL(from Expert Q2) I just want to say that expert mod has always be the greatest mod i had ever seen invented, quake 3 was not a good game and i hope this mod gets quickly mod as i am eger to play it :)

'''captk:'''  btw, this somehow slipped my mind, but if anyone doesn't feel like waiting, RealTournament (http://www.planetunreal.com/realtournament/) has a CTF mode with an offhand grapple, though the mod allegedly doesn't work well online.  It's implemented as a weapon, incidentally... that's part of the reason why I'm being so stubborn about it &amp;ndash; it's not only doable, but has already been done since RealCTF; I'm not just trying to be difficult. :)  (The other part is that I'm actually personally not a big fan of the offhand grapple; thus I'd like to give admins the option of having a classic grapple instead.)

'''DEVIL''' I agree i think it should be a server side option as we like to have different options but keep the same rules for ladder reasons, also the real tournament maybe we can get the source code for the offhandhook then create around that. Ill do a little research this weekend.

'''Goner:''' Cap, you rock!  :)   thanks SO MUCH!</text>
    </revision>
    <revision>
      <id>4701</id>
      <timestamp>2002-10-28T02:45:55Z</timestamp>
      <contributor>
        <ip>Adsl-63-194-247-24.dsl.lsan03.pacbell.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Expert CTF (the continuation of a great mod)}}

==Description ==

Expert CTF for Quake 1 and Quake 2 has been quite popular and still retains a die-hard base of about 100 players who play the Quake 2 variety regularly.  This community can be observed at http://www.thecgn.com/q2

===Gameplay ===

Expert pulls the focus away from item gathering to combat.  All players spawn on an equal playing field with 125 health and all weapons and ammo for them.  Levels of ammo are relatively low, but, like health, regen as play progresses.  Both health and ammo regen faster if the player is actively involved in combat.  Healt regens to a maximum of 160 and the levels of ammo appropriate for UT weapons is yet TBD.  Important to the development of this game, and probably the most difficult to develop is the off-hand grappling hook.  It is usable to hook to get the player anywhere (including hooking the sky) and creates a true 3-axis combat environment.  The hook moves the player in a straight line to where they hook, there is no swinging action like spider-man...  Its pull speed is about 15% faster than walking.  Throw speed is about the same.  In quake 1 and 2 it is made of particles making it easy to turn invisible (other than the hook head) for the player who cares to tweak that client-side setting.  

===Closing ===

Thanks for listening, UT folks.  If someone's interested in this idea, please contact us at the messageboard over at www.thecgn.com/q2 where we have a number of developers who have attempted ports to q3, but have been, so far, unsuccessful, though the Alliance mod for q3 did include a 'Combat' mode based on q2 Expert, the larger LMCTF community who dominates the primary mode of gameplay for that mod pretty much got rid of 'combat' mode...  Not to mention the fact that the q3 engine is just lame.. :)

====Interested Scripters ====

[[Legacy:Captain Kewl|Captain Kewl]] &amp;ndash; [[Legacy:Captain Kewl/Developer Journal|started 05 Oct 2002]].

==Discussion ==

'''EntropicLqd:'''  I took the liberty of placing it in the standard format I've adopted for these things - hope you don't mind.  That brings back memories.  My first (and last) mod for Quake was to take the ThreeWave CTF mod and merge it with the offhand grappling hook.  The resultant mod still wasn't quite what I was after so I tweaked all the weapons to death as well :).  The version of the hook I merged with the CTF code let you travel a good 20% faster I reckon - maybe even up to 30%.  The problem with building this for UT2003 (or UT) is that the &quot;sky&quot; tends to be really really high - out of reach of all but the infinitely long hooks.  Still, it's a nice idea.  I did like the offhand grapple.

'''Goner:'''  Great!  Sorry for not using the prescribed layout in my submission, but I AM at work and really ought to be working.. :)  Thanks for taking the time to go behind and fix it up!   as for the particulars of building this for UT2k3...  I've seen everything done already in mutators for UT in the form of NUIT (No-item UT) which provided the options needed to set up a server that did everything Expert does other than the hook.  In my searching I was never able to find an off-hand hook for UT.  As I understand it, making an item-based hook is the whole problem facing the coders...  It's a necessary thing to preserve the gameplay that Expert players have grown to love and the reason why we still play quake2 as much as we do (many hours per week) and have yet to find a newer engine that can capture the essence of Expert CTF.  Is an off-hand hook even possible with the tools available to an unreal developer?  

'''Goner:'''  One additional note on sky hooking..  While it might seem to be an alien concept, sky-hooking is integral to expert..  If you've ever played most any mod with a hook in it and had the experience of trying to hook around only to have your hook hit a sky brush (be it a small one in the roof of a mostly-indoor level or a large one in the middle of a giant level, you know it can be frustrating or even fatal when you make a leap and hook off to a direction and expect to get that pull in that direction only to have your hook impotently hit the sky brush and leave you falling to wherever is below you (often a pit of death, sich as in the demo ut2k3 ctf map)...  Sky hooking vs. no sky hooking is one major sticking point that the LMCTF community in quake never could embrace and it drove quite a wedge between the attempt to merge the two great Q2 mods into the single Alliance mod for Q3.  :(

'''EntropicLqd:''' Don't worry about not using the &quot;prescribed layout&quot;.  There isn't an official one.  Since I was editing it anyway I thought I might as well do a bit of reformatting.  I figured the sky-hooking thing would be an issue - which is why I raised it.  In Quake, the gap between the &quot;sky textures&quot; and the actual solid brush behind the sky was generally very very small.  In UT2003 it doesn't seem to be like that.  However - I have noticed that there are &quot;blocking brushes&quot; fairly low (to low for my liking) on BR-Anubis so it might be possible to hook onto those rather than the &quot;sky&quot;.  However, I don't know whether all levels are built that way - and community built levels definately won't be consistent in that way.  The problem is not allowing/disallowing sky hooking - it's simply one of distance.  The sky is a long long way away.  If the community was happy with completely custom maps then you could always add a visible &quot;mesh&quot; type affair around the edges of the level to grapple on to.  Either that or stick to indoor maps only - which is really all Quake was.  Personally I'd simply ignore the issue and simply have the hook able to latch onto any brush, where ever it was &amp;ndash; even on some Quake levels the sky was too far away to hook.  Someone wrote a form of grappling hook (called the beamer or something) in Unreal.  It never made it into UT for some reason, but would be possible to do.  Someone is bound to do it at some point.

'''Birelli:''' I think I remember a UT mod that had a hook in it, I forget what it was called though, I never d/led it. One reason that &quot;hook&quot; mutators in UT are sparse is that I just don't think people ''want'' a hook. The hook completely changes the dynamics of gameplay (at least it did for Q3A, which is the only Quake I've ever played). The translocator also changes this if people translocate-spam their way through a level, but there are definitely mods/mutators that set delays on it ([[Legacy:Jailbreak|Jailbreak]] for one)), which fixes that problem. Technically speaking making a hook for UT2003 should be even easier that it would have been for UT - with particle systems and such a Quake-looking hook should be quite possible. 

If a mod like this was made for UT2003, the community might be more receptive to it than the UT one was. The &quot;community&quot; of UT2003 is hard to define atm, there are just so many new people taking interest in it.

'''EntropicLqd:''' Also, the best way to use an off-hand grapple is with the right mouse button - which is used for the alternate fire mode of the weapons.  The alternate weapons fire is something you really don't want to lose.

'''Goner:''' Interesting thoughts.  And yes, map design plays into the gameplay of the hook a great deal.  I've built a couple of the maps that get regular play in Expert CTF for q2..  Protuding decorations like one sees a lot of in q3 are a big no-no...  Expert is meant to be a very high speed, 3-axis game and having things to get hung up on everywhere is no good.  For that reason there is a relatively short list of levels that the community plays on..  There are a number of mappers and even a few dedicated mapping teams who have produced a good supply of such maps..  So, any map-specific issues can be designed around, I'm sure.. :)  Thanks for the comments, Birelli.  If you were able to dig up the info on the off-hand hook you recall seeing, it might help out, since, frankly, that's the main difficult part of this whole deal... 

'''capt. k.''' Pencil me in.  Q2CTF is arguably the reason why I nearly flunked half my classes in college.  :)  Got this UTCTF mod buried on my hard drive somewhere with a working and bot supported Quake-style grapple which I just sorta lost interest in after concluding that no one else would be interested either...

'''Goner:''' Cool! :)  Is that hook a weapon-based or item-based hook?  In other words, can it be freely used at the same time as a weapon?

'''Mr.Mitchell:''' ChaosUT has a nice &quot;itembased&quot; grapplinghook.

'''capt. k.'''  It's a weapon, but in UT weapons *are* items, so it doesn't really matter.  Though I think it's best to just sit and wait a week or so for 2k3 to come out &amp;ndash; and just redo it all from scratch &amp;ndash; as there will be some changes in the 2k3 class hierarchy.

One thing: I'm wondering how much of this would be better suited for a series of mutators rather than a gametype.  2k3ctf already has a scoring system similar to threewave q2, I believe.  I'm betting that things like regeneration and no items may even come prepackaged &amp;ndash; if not, they'll be among the first mutators made.  Which really just leaves the grapple... which is just a single weapon replacement.

'''EntropicLqd:''' Actually, the grapple cannot be a weapon replacement - it's much closer in behaviour to an inventory item than a weapon.  The single most important feature of the grapple is that it's off-hand.  You hold down a key to grapple someplace, but at the same time you can be firing weapons, changing weapons, all that sort of stuff.  Think of it in terms of a flashlight.  The flashlight can be on or off, but doesn't affect your ability to do anything else in the game.  In order to get the bot AI working correctly you'd probably have to make it a new game type - you '''can''' change the AI using a mutator but there are limits on how much you can tweak.

'''capt.k.:'''  Obviously it's going to involve more than just making a working grapple, but I still think it's doable with just a mutator.  Again, I think it's best to wait for 2k3 to actually come out.

'''DEVIL(from Expert Q2) I just want to say that expert mod has always be the greatest mod i had ever seen invented, quake 3 was not a good game and i hope this mod gets quickly mod as i am eger to play it :)

'''captk:'''  btw, this somehow slipped my mind, but if anyone doesn't feel like waiting, RealTournament (http://www.planetunreal.com/realtournament/) has a CTF mode with an offhand grapple, though the mod allegedly doesn't work well online.  It's implemented as a weapon, incidentally... that's part of the reason why I'm being so stubborn about it &amp;ndash; it's not only doable, but has already been done since RealCTF; I'm not just trying to be difficult. :)  (The other part is that I'm actually personally not a big fan of the offhand grapple; thus I'd like to give admins the option of having a classic grapple instead.)

'''DEVIL''' I agree i think it should be a server side option as we like to have different options but keep the same rules for ladder reasons, also the real tournament maybe we can get the source code for the offhandhook then create around that. Ill do a little research this weekend.

'''Goner:''' Cap, you rock!  :)   thanks SO MUCH!</text>
    </revision>
    <revision>
      <id>4702</id>
      <timestamp>2006-06-24T09:45:57Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>delete</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Expert CTF (the continuation of a great mod)}}

==Description ==

Expert CTF for Quake 1 and Quake 2 has been quite popular and still retains a die-hard base of about 100 players who play the Quake 2 variety regularly.  This community can be observed at http://www.thecgn.com/q2

===Gameplay ===

Expert pulls the focus away from item gathering to combat.  All players spawn on an equal playing field with 125 health and all weapons and ammo for them.  Levels of ammo are relatively low, but, like health, regen as play progresses.  Both health and ammo regen faster if the player is actively involved in combat.  Healt regens to a maximum of 160 and the levels of ammo appropriate for UT weapons is yet TBD.  Important to the development of this game, and probably the most difficult to develop is the off-hand grappling hook.  It is usable to hook to get the player anywhere (including hooking the sky) and creates a true 3-axis combat environment.  The hook moves the player in a straight line to where they hook, there is no swinging action like spider-man...  Its pull speed is about 15% faster than walking.  Throw speed is about the same.  In quake 1 and 2 it is made of particles making it easy to turn invisible (other than the hook head) for the player who cares to tweak that client-side setting.  

===Closing ===

Thanks for listening, UT folks.  If someone's interested in this idea, please contact us at the messageboard over at www.thecgn.com/q2 where we have a number of developers who have attempted ports to q3, but have been, so far, unsuccessful, though the Alliance mod for q3 did include a 'Combat' mode based on q2 Expert, the larger LMCTF community who dominates the primary mode of gameplay for that mod pretty much got rid of 'combat' mode...  Not to mention the fact that the q3 engine is just lame.. :)

====Interested Scripters ====

[[Legacy:Captain Kewl|Captain Kewl]] &amp;ndash; [[Legacy:Captain Kewl/Developer Journal|started 05 Oct 2002]].

==Discussion ==

'''EntropicLqd:'''  I took the liberty of placing it in the standard format I've adopted for these things - hope you don't mind.  That brings back memories.  My first (and last) mod for Quake was to take the ThreeWave CTF mod and merge it with the offhand grappling hook.  The resultant mod still wasn't quite what I was after so I tweaked all the weapons to death as well :).  The version of the hook I merged with the CTF code let you travel a good 20% faster I reckon - maybe even up to 30%.  The problem with building this for UT2003 (or UT) is that the &quot;sky&quot; tends to be really really high - out of reach of all but the infinitely long hooks.  Still, it's a nice idea.  I did like the offhand grapple.

'''Goner:'''  Great!  Sorry for not using the prescribed layout in my submission, but I AM at work and really ought to be working.. :)  Thanks for taking the time to go behind and fix it up!   as for the particulars of building this for UT2k3...  I've seen everything done already in mutators for UT in the form of NUIT (No-item UT) which provided the options needed to set up a server that did everything Expert does other than the hook.  In my searching I was never able to find an off-hand hook for UT.  As I understand it, making an item-based hook is the whole problem facing the coders...  It's a necessary thing to preserve the gameplay that Expert players have grown to love and the reason why we still play quake2 as much as we do (many hours per week) and have yet to find a newer engine that can capture the essence of Expert CTF.  Is an off-hand hook even possible with the tools available to an unreal developer?  

'''Goner:'''  One additional note on sky hooking..  While it might seem to be an alien concept, sky-hooking is integral to expert..  If you've ever played most any mod with a hook in it and had the experience of trying to hook around only to have your hook hit a sky brush (be it a small one in the roof of a mostly-indoor level or a large one in the middle of a giant level, you know it can be frustrating or even fatal when you make a leap and hook off to a direction and expect to get that pull in that direction only to have your hook impotently hit the sky brush and leave you falling to wherever is below you (often a pit of death, sich as in the demo ut2k3 ctf map)...  Sky hooking vs. no sky hooking is one major sticking point that the LMCTF community in quake never could embrace and it drove quite a wedge between the attempt to merge the two great Q2 mods into the single Alliance mod for Q3.  :(

'''EntropicLqd:''' Don't worry about not using the &quot;prescribed layout&quot;.  There isn't an official one.  Since I was editing it anyway I thought I might as well do a bit of reformatting.  I figured the sky-hooking thing would be an issue - which is why I raised it.  In Quake, the gap between the &quot;sky textures&quot; and the actual solid brush behind the sky was generally very very small.  In UT2003 it doesn't seem to be like that.  However - I have noticed that there are &quot;blocking brushes&quot; fairly low (to low for my liking) on BR-Anubis so it might be possible to hook onto those rather than the &quot;sky&quot;.  However, I don't know whether all levels are built that way - and community built levels definately won't be consistent in that way.  The problem is not allowing/disallowing sky hooking - it's simply one of distance.  The sky is a long long way away.  If the community was happy with completely custom maps then you could always add a visible &quot;mesh&quot; type affair around the edges of the level to grapple on to.  Either that or stick to indoor maps only - which is really all Quake was.  Personally I'd simply ignore the issue and simply have the hook able to latch onto any brush, where ever it was &amp;ndash; even on some Quake levels the sky was too far away to hook.  Someone wrote a form of grappling hook (called the beamer or something) in Unreal.  It never made it into UT for some reason, but would be possible to do.  Someone is bound to do it at some point.

'''Birelli:''' I think I remember a UT mod that had a hook in it, I forget what it was called though, I never d/led it. One reason that &quot;hook&quot; mutators in UT are sparse is that I just don't think people ''want'' a hook. The hook completely changes the dynamics of gameplay (at least it did for Q3A, which is the only Quake I've ever played). The translocator also changes this if people translocate-spam their way through a level, but there are definitely mods/mutators that set delays on it ([[Legacy:Jailbreak|Jailbreak]] for one)), which fixes that problem. Technically speaking making a hook for UT2003 should be even easier that it would have been for UT - with particle systems and such a Quake-looking hook should be quite possible. 

If a mod like this was made for UT2003, the community might be more receptive to it than the UT one was. The &quot;community&quot; of UT2003 is hard to define atm, there are just so many new people taking interest in it.

'''EntropicLqd:''' Also, the best way to use an off-hand grapple is with the right mouse button - which is used for the alternate fire mode of the weapons.  The alternate weapons fire is something you really don't want to lose.

'''Goner:''' Interesting thoughts.  And yes, map design plays into the gameplay of the hook a great deal.  I've built a couple of the maps that get regular play in Expert CTF for q2..  Protuding decorations like one sees a lot of in q3 are a big no-no...  Expert is meant to be a very high speed, 3-axis game and having things to get hung up on everywhere is no good.  For that reason there is a relatively short list of levels that the community plays on..  There are a number of mappers and even a few dedicated mapping teams who have produced a good supply of such maps..  So, any map-specific issues can be designed around, I'm sure.. :)  Thanks for the comments, Birelli.  If you were able to dig up the info on the off-hand hook you recall seeing, it might help out, since, frankly, that's the main difficult part of this whole deal... 

'''capt. k.''' Pencil me in.  Q2CTF is arguably the reason why I nearly flunked half my classes in college.  :)  Got this UTCTF mod buried on my hard drive somewhere with a working and bot supported Quake-style grapple which I just sorta lost interest in after concluding that no one else would be interested either...

'''Goner:''' Cool! :)  Is that hook a weapon-based or item-based hook?  In other words, can it be freely used at the same time as a weapon?

'''Mr.Mitchell:''' ChaosUT has a nice &quot;itembased&quot; grapplinghook.

'''capt. k.'''  It's a weapon, but in UT weapons *are* items, so it doesn't really matter.  Though I think it's best to just sit and wait a week or so for 2k3 to come out &amp;ndash; and just redo it all from scratch &amp;ndash; as there will be some changes in the 2k3 class hierarchy.

One thing: I'm wondering how much of this would be better suited for a series of mutators rather than a gametype.  2k3ctf already has a scoring system similar to threewave q2, I believe.  I'm betting that things like regeneration and no items may even come prepackaged &amp;ndash; if not, they'll be among the first mutators made.  Which really just leaves the grapple... which is just a single weapon replacement.

'''EntropicLqd:''' Actually, the grapple cannot be a weapon replacement - it's much closer in behaviour to an inventory item than a weapon.  The single most important feature of the grapple is that it's off-hand.  You hold down a key to grapple someplace, but at the same time you can be firing weapons, changing weapons, all that sort of stuff.  Think of it in terms of a flashlight.  The flashlight can be on or off, but doesn't affect your ability to do anything else in the game.  In order to get the bot AI working correctly you'd probably have to make it a new game type - you '''can''' change the AI using a mutator but there are limits on how much you can tweak.

'''capt.k.:'''  Obviously it's going to involve more than just making a working grapple, but I still think it's doable with just a mutator.  Again, I think it's best to wait for 2k3 to actually come out.

'''DEVIL(from Expert Q2) I just want to say that expert mod has always be the greatest mod i had ever seen invented, quake 3 was not a good game and i hope this mod gets quickly mod as i am eger to play it :)

'''captk:'''  btw, this somehow slipped my mind, but if anyone doesn't feel like waiting, RealTournament (http://www.planetunreal.com/realtournament/) has a CTF mode with an offhand grapple, though the mod allegedly doesn't work well online.  It's implemented as a weapon, incidentally... that's part of the reason why I'm being so stubborn about it &amp;ndash; it's not only doable, but has already been done since RealCTF; I'm not just trying to be difficult. :)  (The other part is that I'm actually personally not a big fan of the offhand grapple; thus I'd like to give admins the option of having a classic grapple instead.)

'''DEVIL''' I agree i think it should be a server side option as we like to have different options but keep the same rules for ladder reasons, also the real tournament maybe we can get the source code for the offhandhook then create around that. Ill do a little research this weekend.

'''Goner:''' Cap, you rock!  :)   thanks SO MUCH!
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Extreme Co-Op</title>
    <id>1974</id>
    <revision>
      <id>4829</id>
      <timestamp>2003-09-03T12:49:17Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description==

Most people have probably played Unreal 1 coop mode, or ONP coop, right? The basic idea was &quot;play single-player levelswith your friends&quot;.  This mod would take that a bit further, and improve on singleplayer while it's at it. Heres a fewbasic ideas for the coop levels:

* Multi-switch doors: these doors only open when both switches are pressed at the same time, so that means two people areneeded.
* Multi-position vehicles: wait, never mind, these are already in UT2k4
* Distractions: killing the monster guarding the switch will set of an alarm, and you need to press the switch, what do youdo? simple, have one guy get his attention, and sneak up on the switch SLOWLY so he cant hear you. just make sure yourfriend keeps him distracted long enough to escape.
* Human ladder: The UTJB feature strikes back, by standing on a friends shoulders, you can reach the switch to open a dooror such.
* 'Better' bosses: One thing annoying abut the Unreal 1 bosses was that they didnt have a pattern or anything, it was justshoot shoot shoot untill theyre dead. For this there could be bosses that can only be damaged by shooting their back, sodistractions are needed again. And of course he bosses who cant be hurt unless you do something in the boss arena (likepress a switch to turn of the bosses shield) or can only be hurt after doing a certain attack.
* Delayed lifts: Ah, lifts that move when you stand on them, i've spent a lot of my time in Unreal 1 coop waiting for thosethings to come back down so i can go up after someone. On really crowded srvers, you could get stuck at the first lift forages and not get to see the rest of the level at all because of someone finishing it. How about a new mover type that waitsa bit after someone stands on it before it moves, so more people can get on? How about using buttons like in real elevators to move the lifts up/down? (UT1999 has movers like this, UT2003 needs custom made for them)

==Interested Coders, Mappers, Whatevers==

==Discussion==

'''EntropicLqd:''' When cutting and pasting from notepad - make sure wordwrap is turned off - that way the line breaks are not inserted into the final content.

'''Mosquito:''' I was thinking about this too.. have fun.

'''Foxpaw:''' What's this about UT1999 mentioned above?

'''MadNad:''' You can delay a mover already with the movers supplied by ut2k3.  You can use triggers to for buttons for the doors.  I just managed to code a more complex mover with switches and doors that the bots actually use.  I do love the idea of co-op.  There are many games that I wished had multiplay co-op mode.  Good luck, sounds fun

'''Foxpaw:''' The only issue I could see would be that the puzzles and stuff would be easy to solve after the first time that you'd played the levels. Once you knew the &quot;tricks&quot; to the bosses they'd all be easy to beat. I think it would be hard to keep replay value in the levels.</text>
    </revision>
    <revision>
      <id>4830</id>
      <timestamp>2003-09-02T19:33:47Z</timestamp>
      <contributor>
        <ip>MadNad</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description==

Most people have probably played Unreal 1 coop mode, or ONP coop, right? The basic idea was &quot;play single-player levelswith your friends&quot;.  This mod would take that a bit further, and improve on singleplayer while it's at it. Heres a fewbasic ideas for the coop levels:

* Multi-switch doors: these doors only open when both switches are pressed at the same time, so that means two people areneeded.
* Multi-position vehicles: wait, never mind, these are already in UT2k4
* Distractions: killing the monster guarding the switch will set of an alarm, and you need to press the switch, what do youdo? simple, have one guy get his attention, and sneak up on the switch SLOWLY so he cant hear you. just make sure yourfriend keeps him distracted long enough to escape.
* Human ladder: The UTJB feature strikes back, by standing on a friends shoulders, you can reach the switch to open a dooror such.
* 'Better' bosses: One thing annoying abut the Unreal 1 bosses was that they didnt have a pattern or anything, it was justshoot shoot shoot untill theyre dead. For this there could be bosses that can only be damaged by shooting their back, sodistractions are needed again. And of course he bosses who cant be hurt unless you do something in the boss arena (likepress a switch to turn of the bosses shield) or can only be hurt after doing a certain attack.
* Delayed lifts: Ah, lifts that move when you stand on them, i've spent a lot of my time in Unreal 1 coop waiting for thosethings to come back down so i can go up after someone. On really crowded srvers, you could get stuck at the first lift forages and not get to see the rest of the level at all because of someone finishing it. How about a new mover type that waitsa bit after someone stands on it before it moves, so more people can get on? How about using buttons like in real elevators to move the lifts up/down? (UT1999 has movers like this, UT2003 needs custom made for them)

==Interested Coders, Mappers, Whatevers==

==Discussion==

'''EntropicLqd:''' When cutting and pasting from notepad - make sure wordwrap is turned off - that way the line breaks are not inserted into the final content.

'''Mosquito:''' I was thinking about this too.. have fun.

'''Foxpaw:''' What's this about UT1999 mentioned above?

'''MadNad:''' You can delay a mover already with the movers supplied by ut2k3.  You can use triggers to for buttons for the doors.  I just managed to code a more complex mover with switches and doors that the bots actually use.  I do love the idea of co-op.  There are many games that I wished had multiplay co-op mode.  Good luck, sounds fun</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/False Prophets</title>
    <id>1972</id>
    <revision>
      <id>4824</id>
      <timestamp>2003-09-18T04:32:27Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <text xml:space="preserve">==False Prophets==

Game type: Team Deathmatch

Concept: One player on each team is the &quot;false prophet&quot;. Each team competes to obliterate the infidel. The rest of the team protects their &quot;god&quot;.

Status: Completed...as best I can. :)

Download it [http://www.kerlinsoftworks.com/ut2k3/falseprophet here]

==Rules:==

* A false prophet (FP) is chosen at random at the start of the game
* The FP is armed only with his shield
* The FP's shield regenerates at 2x speed of the normal shield
* Team members within &lt;i&gt;n&lt;/i&gt; radius of the prophet regenerate health
* (alt) Team members within &lt;i&gt;n&lt;/i&gt; radius of the prophet have health leeched
* FP gets 1 adrenaline every second
* When the FP is destroyed, the highest (or lowest?) ranked team member becomes the false prophet
* Each time the FP is destroyed, the opposing team's score increases by 25 points
* Each time someone kills a member of the other team, his score increases by 1
* New FP automatically gets &lt;i&gt;n&lt;/i&gt; adrenaline for free

==Update==
* Dropped prophet ever getting adrenaline (pickup or otherwise) and gave prophet permanent slight speed/jump height increase
* Dropped prophet leeching/healing health for now
* Changed scoring to 1 kill of prophet = 1 point, period.
* First killer on team becomes prophet
* If prophet dies, the next &quot;first kill&quot; after the prophet's death becomes prophet

----

'''Kerlin:''' Sound like fun? :) Might be good on a CTF map, too, but I think a DM map offers more chaos. If it sounds like a Mutant variant, it is.

'''Kerlin:''' To do: TeamAI, SquadAI, Prophet FX

'''Mosquito:''' From how it sounds, the FP isn't so false (with all these divine powers and all)

'''Kerlin:''' Depends on your perspective, I guess. &quot;My god is real, yours is a false prophet.&quot; kinda thing. :)

'''Kerlin:''' It never happened. :)

'''Foxpaw:''' That sounds like a neat idea.. kind of like a dual escort kind of gametype. Anyways.. the only problem I can see with the scoring system as it stands is that people will probrably not WANT to be the prophet. The only way to score points is by killing people and the prophet is not particularly good at doing so, having only a shield gun. Sure, it's in the best interests of the team for a good player to be the prophet, but players like having big numbers beside their name on the scoreboard because the general impression is that it will impress the other players. How about something like the original domination - the prophet and the prophets team accumulate points as time passes, and the longer the prophet has been the same person, the faster those points will accumulate. That provides incentive to keep the prophet alive as long as possible. For instance, when a player first becomes the prophet, that player and the team accumulate points at a rate of, say, 1 per 3 seconds. After the prophet has been alive for, say, a minute, the team and that player would be accumulating points at a rate of say, 1 point per second. Or something. The numbers need tweaking, but I think it would make gameplay a bit more emotional and exciting, due to the increased stress and important of protecting/assasinating the opposing prophet as he/she/it becomes more venerable.

'''Kerlin:''' Some good ideas there, Fox. Since I'm new to scripting, I have to be flexible with what I think I can do vs what I can do.  It seems that I'm having problems with bot AI in that the prophet gets stuck trying to pick up health even though I've made sure that WantsPickups(Bot) returns false if the bot is the prophet. WantsPickups is apparently a hack that was implemented into AI for the Mutant gametype. As a result, I may have to come to a compromise that maybe the prophet isn't completely unarmed, but maybe he has less of an ammo capacity....and maybe his health is ticking away. That keeps him on the move and adds some stress. '''And maybe the idea of a &quot;false prophet&quot; is completely gone and the gametype should just be &quot;Team Marked Men&quot; or &quot;Team Bodyguard&quot;.''' :) Actually it would fix the problem you describe Fox, because prophets would be more lethal. Maybe even give them 2 points per kill. I feel like I'm bastardizing the gameplay now because I'm not quite the coder I need to be.

How about this?
# prophets have health ticking away
# prophets can use any weapons
# kill a prophet get 1 team point
# kill a prophet get 10 player points
# kill a player get 1 player point
# kill a player if you're a prophet, get 2 player points
# kill a prophet if you're a prophet, get 20 player points
# prophets have full access to pickups

OTOH, I really like the idea of the increased point accrual but I don't think I have the experience to work with states just yet. And if that's the case, there definitely needs to be an &quot;objective&quot; placed on the prophet. Hell, there might need to be anyway since I haven't yet done a Spectate BotMatch. Kind of a bummer that my lack of experience is causing the gameplay to suffer. I need a mentor. :)

'''Kerlin:''' WOW! Just had a breakthrough. I used the above changes and it &quot;feels&quot; so much better. Shortly after my teammate became the prophet, other team mates starting showing up and taking defensive positions. When the prophet moved, everyone else followed and pretty much surrounded him. An enemy showed up and the squad completely railed on him. Eventually an enemy became a prophet as well. Him and a few other of his squad were firing on me from a distance. I turned on god mode and ran straight for them. As I approached, a squad member and the prophet started retreating. Two of them held strong and didn't move until they were far enough from their prophet to catch back up with him. 

I'm going to do a LOT more testing and run it through spectate botmatch (thanks Mychaeel!!) and see what their orders/tactics are. Scoring has a bug. If I get this scoring bug fixed and come up with a better &quot;glow effect&quot; for my prophet, I think I'll be in business!

(hahah. see the above? that's was a brief moment when I thought it was MY ai that was working)

'''Kerlin:''' Thanks for your help everyone. I'm sure you'll find problems but I did my best. (Heck, even I found problems.)

'''Dark Pulse:''' Well I'll give it a run-through tonight. My Run-through will be more in-depth once I get my better vidcard in about 2 or so weeks.

'''Foxpaw:''' I did not &quot;torture test&quot; the gametype, but I did a few tests and found the following:

====Actual Bugs====
* Teams weren't loaded properly. The &quot;team set up&quot; option uses the &quot;no teams&quot;/deathmatch opponent selection instead of the team game opponent/teammate selection. It also nukes the &quot;game rules&quot; if you try to play a different gametype after playing false prophet. Both of these problems were the result of a slight error in the .int file. At any rate this line is in the distributed .int file:

&lt;uscript&gt;
Object=(Class=Class,MetaClass=Engine.GameInfo,Name=Prophet.Prophet,Description=&quot;DM|Team False Prophet|XInterface.MapListTeamDeathMatch|true&quot;)
&lt;/uscript&gt;

Which should read:

&lt;uscript&gt;
Object=(Class=Class,MetaClass=Engine.GameInfo,Name=Prophet.Prophet,Description=&quot;DM|Team False Prophet|xinterface.Tab_IATeamDeathMatch|xinterface.MapListTeamDeathMatch|true&quot;)
&lt;/uscript&gt;

'''Kerlin:''' Good catch. Damn...here I go again.... &quot;Thanks!&quot; :)

I tested it with the second line and both problems were fixed.

* The bots get killed rather easily. I understand that you had some difficulties with the AI, it probrably just needs playing around with. The bots clustered together in a ball and then the entire &quot;ball&quot; stormed into the enemy &quot;ball.&quot; Good leadership demonstrated on the part of the prophet, but results in rather high fatality rates for the prophet. :P The clustering also made the bots very vulnerable to massed weapons fire and especially area effect weapons like rockets. I'm not too sure about how the AI scripts work, but it might be possible to separate a team into a bodyguard group and a hunting group.

'''Kerlin:''' My AI is, in retrospect, horrible. It's just pathetic. Hindsight being what it is, I shouldn't have released. It's still playable but it feels like an amatuer mod. I have sections of AI code that just don't fire off properly.

* The scoreboard shows all bot's orders as &quot;sweeping.&quot; This probrably isn't hard to fix, but I haven't experimented with it yet so I couldn't tell you how it is done.

====Just Ideas====

* I didn't test it, but I'm not sure how well this gametype would operate with a &quot;max lives&quot; setting in the gamerules. This could maybe be changed so that it only counts as a &quot;life&quot; if you die while you are the prophet.. with &quot;Max Lives&quot; there isn't really any significance to who is the prophet since the winner is the team with people left on it.

* I pictured the glow being more like the one illustrated in the screenshot on the download page.. where Diva has a glowing breastplate. Also cool would be a &quot;halo&quot; around the person's head, but that might be too religeon-specific. I have a couple of ideas how the glow might be made better, but on the other hand maybe you like it just the way it is. Do you mind if I decompile the .u file and try some other effects to see what I can come up with?

'''Kerlin:''' So did I. That was a screenshot from a running game test. Then something got wacky with my emitters. They were sticking to the floor after death and the framerate was dropping to 30, 20, 8, 4, 1 FPS as the game went on. All the while, emitters are hanging around. :( Since I was literally compiling new versions every 10 minutes, I ended up losing the good code.

Eventually, it came down to crunch time and I mistakenly released a less than optimum mod so I could theoretically get in the MSU contest. I underestimated the competition and got a little burnt out working 6 hrs a night for the past two weeks. Yes, it's embarassing to admit it but TFP took a massive amount of time.

By all means, decompile. I'll warn you. It isn't pretty. I bastardized the following: xMutantPawn, xMutantGame, CTFGame, MutantGlow and a few more that will become apparent. I think my biggest mistake was &quot;TryToIntercept&quot;

My goal for October is to rework what I've done. Maybe start from scratch. I think the concept is a good one but was poorly delivered on. And there's so much that could be done:

* Random translocate when becoming prophet
* Announcements &amp; text display &quot;A new false prophet has risen&quot;, &quot;False prophet grows stronger&quot;
* Better, more custom HUD
* Combo: Eye of God (any visible enemies get hit with a lightning gun shot emenating from the prophet)
* Bring back emitter fx

I was a fool for thinking I could come up with a competitive mod in two weeks. Lesson learned. Still humble. :)

'''Kerlin:''' As part of the rewrite, I'm lopping out just about everything but the minimum required gameplay rules. I don't know how the game can even be played. I've got to tip my hat to Epic for filling in the gaps because there are some '''major''' problems with setting who the prophet is. My question is this: is there some way I can figure out what team a subclassed TeamAI and SquadAI are on? ProphetSquadAIs get created by ProphetTeamAI which is created by the Prophet class. But which Team is the squad on? Definitely need to figure that out before I can say who is an enemy and friendly prophet. :)

'''Foxpaw:''' Hmm. I couldn't say about the AIs, I don't use any of that AI scripting stuff in my mod. The emitter in that screenshot was very cool looking. I'm not sure how you got it to only come out of the breastplate like that, unless it was just a coincidence that it lined up like that. Anyways, if you have a problem with emitters sticking around it shouldn't be hard to fix, but I'd have to see it to be sure. I wouldn't worry too much about the MSU contest.. there's three phases anyway, and the first one isn't really a biggie. You'll be able to resubmit false prophet to the second one if it's improved a bunch anyway. The most important thing I think for that contest is that the mod has to be fun.. they probrably won't grade it based on how long it took to make or how complex it is, so I wouldn't worry about that. The best gametype one I can't foresee having that much competition anyway.

'''VonStrohmen:''' Both SquadAI and TeamAI have a 'Team' variable which points to the TeamInfo of that squad, which will tell you what team the bot is on by comparing to the TeamIndex variable (0 = red, 1=blue). In SquadAI, you can also call the function FriendlyToward to see if that squad will set another pawn as an enemy. You can also access the TeamAI associated with TeamInfo by using the AI variable in UnrealTeamInfo (since UnrealTeamInfo is subclass thats actually used anyways). Alternatively, if you have a subclass of Bot, you can just use the SameTeamAs function, or directly call Level.Game.IsOnTeam. In short, there are lots of ways to whether a Prophet is friendly towards/on the same team as one of your squads or bots.

'''Kerlin:''' Thanks VonStrohmen. As I said, I've been focusing on better understand what's going on rather than trying to modify an existing class (like CTFSquadAI). I'm more interested in doing it the right way (and understanding how/why) than just getting it done...time is on my side right now. With all of the places I can figure out what team someone is on I guess we can categorize this question under &quot;duh&quot;.

I'll dig up my code, Fox. I zipped up the entire directory five or six times during this whole fiasco and I think that I've got one saved where the emitter is working. I know my starting point was xMutantPawn and MutantGlow from the BonusPack directory. I believe I just changed the colors and the offsets. I'll dig for it and let you know, though. I figure it's the least I can do for all the help everyone's given me. :)

And yes, it was coincidence for the most part since I clearly don't know what I'm doing half the time. :P

'''Foxpaw:''' Hey Kerlin, are you still working on this? I was sitting around in the senior computer lab at university today and I didn't have the source for my mod there but I had UT2003 so I decided to play around and see if I could come up with something interesting. Then I remembered the emitter effect from this mod and thoughts I could whip up something. I'll probrably post the souce up here tomorrow, but I came up with a neat &quot;flaming halo&quot; emitter that  can go around the prophets head, and I could probrably add some more fanciness to it too. Anyways, I don't have classes tomorrow but if I stop by the university I;'ll post the source up here.</text>
    </revision>
    <revision>
      <id>4825</id>
      <timestamp>2003-07-17T15:56:27Z</timestamp>
      <contributor>
        <ip>Kerlin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==False Prophets==

Game type: Team Deathmatch

Concept: One player on each team is the &quot;false prophet&quot;. Each team competes to obliterate the infidel. The rest of the team protects their &quot;god&quot;.

Status: Completed...as best I can. :)

Download it [http://www.kerlinsoftworks.com/ut2k3/falseprophet here]

==Rules:==

* A false prophet (FP) is chosen at random at the start of the game
* The FP is armed only with his shield
* The FP's shield regenerates at 2x speed of the normal shield
* Team members within &lt;i&gt;n&lt;/i&gt; radius of the prophet regenerate health
* (alt) Team members within &lt;i&gt;n&lt;/i&gt; radius of the prophet have health leeched
* FP gets 1 adrenaline every second
* When the FP is destroyed, the highest (or lowest?) ranked team member becomes the false prophet
* Each time the FP is destroyed, the opposing team's score increases by 25 points
* Each time someone kills a member of the other team, his score increases by 1
* New FP automatically gets &lt;i&gt;n&lt;/i&gt; adrenaline for free

==Update==
* Dropped prophet ever getting adrenaline (pickup or otherwise) and gave prophet permanent slight speed/jump height increase
* Dropped prophet leeching/healing health for now
* Changed scoring to 1 kill of prophet = 1 point, period.
* First killer on team becomes prophet
* If prophet dies, the next &quot;first kill&quot; after the prophet's death becomes prophet

----

'''Kerlin:''' Sound like fun? :) Might be good on a CTF map, too, but I think a DM map offers more chaos. If it sounds like a Mutant variant, it is.

'''Kerlin:''' To do: TeamAI, SquadAI, Prophet FX

'''Mosquito:''' From how it sounds, the FP isn't so false (with all these divine powers and all)

'''Kerlin:''' Depends on your perspective, I guess. &quot;My god is real, yours is a false prophet.&quot; kinda thing. :)

'''Kerlin:''' It never happened. :)

'''Foxpaw:''' That sounds like a neat idea.. kind of like a dual escort kind of gametype. Anyways.. the only problem I can see with the scoring system as it stands is that people will probrably not WANT to be the prophet. The only way to score points is by killing people and the prophet is not particularly good at doing so, having only a shield gun. Sure, it's in the best interests of the team for a good player to be the prophet, but players like having big numbers beside their name on the scoreboard because the general impression is that it will impress the other players. How about something like the original domination - the prophet and the prophets team accumulate points as time passes, and the longer the prophet has been the same person, the faster those points will accumulate. That provides incentive to keep the prophet alive as long as possible. For instance, when a player first becomes the prophet, that player and the team accumulate points at a rate of, say, 1 per 3 seconds. After the prophet has been alive for, say, a minute, the team and that player would be accumulating points at a rate of say, 1 point per second. Or something. The numbers need tweaking, but I think it would make gameplay a bit more emotional and exciting, due to the increased stress and important of protecting/assasinating the opposing prophet as he/she/it becomes more venerable.

'''Kerlin:''' Some good ideas there, Fox. Since I'm new to scripting, I have to be flexible with what I think I can do vs what I can do.  It seems that I'm having problems with bot AI in that the prophet gets stuck trying to pick up health even though I've made sure that WantsPickups(Bot) returns false if the bot is the prophet. WantsPickups is apparently a hack that was implemented into AI for the Mutant gametype. As a result, I may have to come to a compromise that maybe the prophet isn't completely unarmed, but maybe he has less of an ammo capacity....and maybe his health is ticking away. That keeps him on the move and adds some stress. '''And maybe the idea of a &quot;false prophet&quot; is completely gone and the gametype should just be &quot;Team Marked Men&quot; or &quot;Team Bodyguard&quot;.''' :) Actually it would fix the problem you describe Fox, because prophets would be more lethal. Maybe even give them 2 points per kill. I feel like I'm bastardizing the gameplay now because I'm not quite the coder I need to be.

How about this?
# prophets have health ticking away
# prophets can use any weapons
# kill a prophet get 1 team point
# kill a prophet get 10 player points
# kill a player get 1 player point
# kill a player if you're a prophet, get 2 player points
# kill a prophet if you're a prophet, get 20 player points
# prophets have full access to pickups

OTOH, I really like the idea of the increased point accrual but I don't think I have the experience to work with states just yet. And if that's the case, there definitely needs to be an &quot;objective&quot; placed on the prophet. Hell, there might need to be anyway since I haven't yet done a Spectate BotMatch. Kind of a bummer that my lack of experience is causing the gameplay to suffer. I need a mentor. :)

'''Kerlin:''' WOW! Just had a breakthrough. I used the above changes and it &quot;feels&quot; so much better. Shortly after my teammate became the prophet, other team mates starting showing up and taking defensive positions. When the prophet moved, everyone else followed and pretty much surrounded him. An enemy showed up and the squad completely railed on him. Eventually an enemy became a prophet as well. Him and a few other of his squad were firing on me from a distance. I turned on god mode and ran straight for them. As I approached, a squad member and the prophet started retreating. Two of them held strong and didn't move until they were far enough from their prophet to catch back up with him. 

I'm going to do a LOT more testing and run it through spectate botmatch (thanks Mychaeel!!) and see what their orders/tactics are. Scoring has a bug. If I get this scoring bug fixed and come up with a better &quot;glow effect&quot; for my prophet, I think I'll be in business!

(hahah. see the above? that's was a brief moment when I thought it was MY ai that was working)

'''Kerlin:''' Thanks for your help everyone. I'm sure you'll find problems but I did my best. (Heck, even I found problems.)

'''Dark Pulse:''' Well I'll give it a run-through tonight. My Run-through will be more in-depth once I get my better vidcard in about 2 or so weeks.

'''Foxpaw:''' I did not &quot;torture test&quot; the gametype, but I did a few tests and found the following:

====Actual Bugs====
* Teams weren't loaded properly. The &quot;team set up&quot; option uses the &quot;no teams&quot;/deathmatch opponent selection instead of the team game opponent/teammate selection. It also nukes the &quot;game rules&quot; if you try to play a different gametype after playing false prophet. Both of these problems were the result of a slight error in the .int file. At any rate this line is in the distributed .int file:

&lt;uscript&gt;
Object=(Class=Class,MetaClass=Engine.GameInfo,Name=Prophet.Prophet,Description=&quot;DM|Team False Prophet|XInterface.MapListTeamDeathMatch|true&quot;)
&lt;/uscript&gt;

Which should read:

&lt;uscript&gt;
Object=(Class=Class,MetaClass=Engine.GameInfo,Name=Prophet.Prophet,Description=&quot;DM|Team False Prophet|xinterface.Tab_IATeamDeathMatch|xinterface.MapListTeamDeathMatch|true&quot;)
&lt;/uscript&gt;

'''Kerlin:''' Good catch. Damn...here I go again.... &quot;Thanks!&quot; :)

I tested it with the second line and both problems were fixed.

* The bots get killed rather easily. I understand that you had some difficulties with the AI, it probrably just needs playing around with. The bots clustered together in a ball and then the entire &quot;ball&quot; stormed into the enemy &quot;ball.&quot; Good leadership demonstrated on the part of the prophet, but results in rather high fatality rates for the prophet. :P The clustering also made the bots very vulnerable to massed weapons fire and especially area effect weapons like rockets. I'm not too sure about how the AI scripts work, but it might be possible to separate a team into a bodyguard group and a hunting group.

'''Kerlin:''' My AI is, in retrospect, horrible. It's just pathetic. Hindsight being what it is, I shouldn't have released. It's still playable but it feels like an amatuer mod. I have sections of AI code that just don't fire off properly.

* The scoreboard shows all bot's orders as &quot;sweeping.&quot; This probrably isn't hard to fix, but I haven't experimented with it yet so I couldn't tell you how it is done.

====Just Ideas====

* I didn't test it, but I'm not sure how well this gametype would operate with a &quot;max lives&quot; setting in the gamerules. This could maybe be changed so that it only counts as a &quot;life&quot; if you die while you are the prophet.. with &quot;Max Lives&quot; there isn't really any significance to who is the prophet since the winner is the team with people left on it.

* I pictured the glow being more like the one illustrated in the screenshot on the download page.. where Diva has a glowing breastplate. Also cool would be a &quot;halo&quot; around the person's head, but that might be too religeon-specific. I have a couple of ideas how the glow might be made better, but on the other hand maybe you like it just the way it is. Do you mind if I decompile the .u file and try some other effects to see what I can come up with?

'''Kerlin:''' So did I. That was a screenshot from a running game test. Then something got wacky with my emitters. They were sticking to the floor after death and the framerate was dropping to 30, 20, 8, 4, 1 FPS as the game went on. All the while, emitters are hanging around. :( Since I was literally compiling new versions every 10 minutes, I ended up losing the good code.

Eventually, it came down to crunch time and I mistakenly released a less than optimum mod so I could theoretically get in the MSU contest. I underestimated the competition and got a little burnt out working 6 hrs a night for the past two weeks. Yes, it's embarassing to admit it but TFP took a massive amount of time.

By all means, decompile. I'll warn you. It isn't pretty. I bastardized the following: xMutantPawn, xMutantGame, CTFGame, MutantGlow and a few more that will become apparent. I think my biggest mistake was &quot;TryToIntercept&quot;

My goal for October is to rework what I've done. Maybe start from scratch. I think the concept is a good one but was poorly delivered on. And there's so much that could be done:

* Random translocate when becoming prophet
* Announcements &amp; text display &quot;A new false prophet has risen&quot;, &quot;False prophet grows stronger&quot;
* Better, more custom HUD
* Combo: Eye of God (any visible enemies get hit with a lightning gun shot emenating from the prophet)
* Bring back emitter fx

I was a fool for thinking I could come up with a competitive mod in two weeks. Lesson learned. Still humble. :)

'''Kerlin:''' As part of the rewrite, I'm lopping out just about everything but the minimum required gameplay rules. I don't know how the game can even be played. I've got to tip my hat to Epic for filling in the gaps because there are some '''major''' problems with setting who the prophet is. My question is this: is there some way I can figure out what team a subclassed TeamAI and SquadAI are on? ProphetSquadAIs get created by ProphetTeamAI which is created by the Prophet class. But which Team is the squad on? Definitely need to figure that out before I can say who is an enemy and friendly prophet. :)

'''Foxpaw:''' Hmm. I couldn't say about the AIs, I don't use any of that AI scripting stuff in my mod. The emitter in that screenshot was very cool looking. I'm not sure how you got it to only come out of the breastplate like that, unless it was just a coincidence that it lined up like that. Anyways, if you have a problem with emitters sticking around it shouldn't be hard to fix, but I'd have to see it to be sure. I wouldn't worry too much about the MSU contest.. there's three phases anyway, and the first one isn't really a biggie. You'll be able to resubmit false prophet to the second one if it's improved a bunch anyway. The most important thing I think for that contest is that the mod has to be fun.. they probrably won't grade it based on how long it took to make or how complex it is, so I wouldn't worry about that. The best gametype one I can't foresee having that much competition anyway.

'''VonStrohmen:''' Both SquadAI and TeamAI have a 'Team' variable which points to the TeamInfo of that squad, which will tell you what team the bot is on by comparing to the TeamIndex variable (0 = red, 1=blue). In SquadAI, you can also call the function FriendlyToward to see if that squad will set another pawn as an enemy. You can also access the TeamAI associated with TeamInfo by using the AI variable in UnrealTeamInfo (since UnrealTeamInfo is subclass thats actually used anyways). Alternatively, if you have a subclass of Bot, you can just use the SameTeamAs function, or directly call Level.Game.IsOnTeam. In short, there are lots of ways to whether a Prophet is friendly towards/on the same team as one of your squads or bots.

'''Kerlin:''' Thanks VonStrohmen. As I said, I've been focusing on better understand what's going on rather than trying to modify an existing class (like CTFSquadAI). I'm more interested in doing it the right way (and understanding how/why) than just getting it done...time is on my side right now. With all of the places I can figure out what team someone is on I guess we can categorize this question under &quot;duh&quot;.

I'll dig up my code, Fox. I zipped up the entire directory five or six times during this whole fiasco and I think that I've got one saved where the emitter is working. I know my starting point was xMutantPawn and MutantGlow from the BonusPack directory. I believe I just changed the colors and the offsets. I'll dig for it and let you know, though. I figure it's the least I can do for all the help everyone's given me. :)

And yes, it was coincidence for the most part since I clearly don't know what I'm doing half the time. :P</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Firestarter</title>
    <id>2015</id>
    <revision>
      <id>4922</id>
      <timestamp>2005-08-25T06:28:49Z</timestamp>
      <contributor>
        <ip>Prospero</ip>
      </contributor>
      <comment>Add actual content to firestarter page</comment>
      <text xml:space="preserve">'''This is currently in production. All feedback is greatly appreciated.'''

====Design ====

The basic idea is that for 30 seconds any player who looks into the firestarter's eyes catches on fire and not so slowly burns to death. Players who catch on fire will start to spawn appropriate fiery particles and may have their vision distorted by the burning. Players who catch on fire will burn as long as the firestarter has charge. Fire damage will ignore armor and will not be put out by fire. To help balance this effect I think firestarters will not be able to use normal weapons for the duration of the effect. I'm pretty sure I can't make the model's eyes light up, but I may try to have the character leave behind burning footprints or somesuch.

The majority of this has to be done by the end of the quarter for my final at [http://www.aicasf.aii.edu/ Ai-SF], so we'll see how much gets done. =)

====Interested Scripters====

[[Legacy:Prospero|Prospero]]

====Comments====</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/FishFood</title>
    <id>1912</id>
    <revision>
      <id>4686</id>
      <timestamp>2002-09-05T08:56:48Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>Minor tweakage</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Eat me, Eat you.   aka Fish Food}}

==Description ==

Below the calm and tranquil surface of a lake a struggle for existence that's been going on since time began is revealed.  Big fishes eat small fishes, which in turn are trying to eat the big fishes.  In fact, every fish is trying to eat every oher fish.  It's bedlam.

Each player plays the part of a fish swimming in the pond.  Also within the pond are a few small minnows.  The object of the game is to be the biggest fish in the pond when the time limit runs out.

As players eat minnows or take bites out of other players their size increases.  As their size increases they move slower, but can stay in &quot;dart&quot; mode for longer (A fish in &quot;dart&quot; mode travels faster through the water (maybe a 25%-75% increase in speed).  The amount of time a fish can stay in dart mode should be shown as an energy bar at the bottom of the screen.  When in dart mode this bar reduces, and recovers gradually when swimming normally, and faster if the player is stationary.  The speed of reduction and recovery is dependant upon the size of the fish.

As bites get taken out of a player their size decreases.  This means that they swim faster, but cannot stay in &quot;dart&quot; as long.  The player fish has a minimum size, which if eaten, will cause the player to respawn back at the default size.  The player that caused the respawn will gain some bonus size.

A minnow is eaten, or a bite taken whenever a player collides face on with either a minnow or another player.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''ZxAnPhOrIaN:''' Cool, but wierd concept! What is the &quot;dart&quot; any way? Is it meandering back and forth?

'''EntropicLqd:''' lol.  I wanted to use the word &quot;sprint&quot;, but then I realised that fish don't really do that (and someone would be bound to comment on the ide of fish sprinting).  The &quot;dart&quot; function is simply a short burst of additional speed.  The smaller the fish the greater the percentage increase of speed, but the less time it lasts.  The bigger the fish the smaller the percentage increase in speed is, but the longer it can be sustained.</text>
    </revision>
    <revision>
      <id>4687</id>
      <timestamp>2002-09-04T20:54:47Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Eat me, Eat you.   aka Fish Food}}

==Description ==

Below the calm and tranquil surface of a lake a struggle for existence that's been going on since time began is revealed.  Big fishes eat small fishes, which in turn are trying to eat the big fishes.  In fact, every fish is trying to eat every oher fish.  It's bedlam.

Each player plays the part of a fish swimming in the pond.  Also within the pond are a few small minnows.  The object of the game is to be the biggest fish in the pond when the time limit runs out.

As players eat minnows or take bites out of other players their size increases.  As their size increases they move slower, but can stay in &quot;dart&quot; mode for longer (A fish in &quot;dart&quot; mode travels faster through the water (maybe a 25%-50% increase in speed).

As bites get taken out of a player their size decreases.  This means that they swim faster, but cannot stay in &quot;dart&quot; as long.  The player fish has a minimum size, which if eaten, will cause the player to respawn back at the default size.  The player that caused the respawn will gain some bonus size.

Minnows and Bites occur whenever a player collides face on with either a minnow or another player fish.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''ZxAnPhOrIaN:''' Cool, but wierd concept! What is the &quot;dart&quot; any way? Is it meandering back and forth?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Flame Shield</title>
    <id>2016</id>
    <revision>
      <id>4923</id>
      <timestamp>2005-08-25T06:38:59Z</timestamp>
      <contributor>
        <ip>Prospero</ip>
      </contributor>
      <comment>Content for fire shield page</comment>
      <text xml:space="preserve">----Design:----

For 30 seconds the user is immune to damage from physical objects such as bullets(they burn up) and from heat damage(you're already on fire) like rocket explosions. Also the player automatically damages anyone who gets too close. Energy weapons and falling would still do full damage and flames would partially block the user's vision. Water would probably cancel the effect. As an extra downside perhaps energy weapons actually do extra damage.

----Interested Scripters:----

----Comments:----

'''Prospero:''' I don't have the time for this one right now, but it seems like it could be fun to code. I'm curious to see if anyone has thoughts about a powerup having a downside. I think it makes gameplay a bit more interesting because it forces the player to make a decision, but it may not be 'fun'.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Flesh</title>
    <id>2005</id>
    <revision>
      <id>4901</id>
      <timestamp>2007-07-26T04:47:43Z</timestamp>
      <contributor>
        <ip>Ppp-69-106-133-183.dsl.frs2ca.pacbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Idea for UT2004 - Flesh}}

==Introduction==

I am making this game for fun. I plan to take over 1 year to get a fully complete version done, meaning all class and core features are implemented. I can do this all by myself but help will be appreciated in scripting.

Here is the style I will be using and yes they are mine.

&lt;img src=&quot;http://img261.imageshack.us/img261/1323/demoncompleteunrealzp4.png&quot; border=&quot;0&quot; alt=&quot;Image Hosted by ImageShack.us&quot;/&gt;

From here on is just my doc... Please comment and give advice or ask questions. I now have internet connection :).

==CREATURES==

{|

|-
|Demons
|300HP
|Demons lurk around in the dark and can manifest into physical form from shadows, when they are mad they can be very fast. 
|-
|Huge demons
|500HP
|See 'Demons'. 
|-
|Fiends
|500HP
|Fiends are like gods or demi gods. 
|-
|Huge Fiends
|900HP
|See 'Fiends'. 
|-
|Spirits
|500HP
|Opaqe beings, a form of life or energy. 
|-
|Zombies
|200HP
|Things that died recently and brought back to life by dark forces. 
|-
|Ghouls
|200HP
|Creatures that died in a situation that obstructed the proper way of dieing and are lost and stuck in a unseen realm. 
|-
|Huge Ghouls
|300hp
|See 'Ghouls'. 
|-
|Humans
|100HP
|Beings that are pitiful and ignorant X). 
|-
|Soilders
|100HP
|Most ignorant form of human ;\. 
|-
|Vagabonds
|100HP
|Lone wanderer. 
|-
|Rebels
|100HP
|One or many people going against the system. 
|-
|Wanderers
|100HP
|one or many people with no home. 
|-
|Bandits
|100HP
|One or many people who steal from others. 
|-
|Lonewolf
|-
|A respected lone wanderer. 
|-
|Shamans
|100HP
|Ancient art develope to protect humans from unseen unknown forces. 
|-
|Lions
|300HP
|Animal found mostly in Africa. 
|-
|Bears
|200HP
|Animal found near woods. 
|-
|Large bears
|300HP
|See 'Bears'. 
|-
|Dogs
|100HP
|Animal found in citys 'man's best friend'. 
|-
|Cats
|50HP
|Animal found in citys. 
|-
|Rats
|50HP
|Animal found in city sewers and anywhere. 
|-
|Birds
|30HP
|Animal found anywhere there is life or food, they are mostly found in trees and the sky where they roam. 
|-
|Mouse
|30HP
|Animal found near human homes. 
|}

==Controlling The Fighter==

{|

|-
|R1
|LOCK-ON
|Lock on to target, hold JUMP to sway in any desire direction (counter by attacking right after they attack), hold JUMP and INTERACT to roll out of the way, hold INTERACT to block (deflect by interacting apon contact, by deflecting you slow them down 2x for 1 sec)
|-
|L1+down
|SPECIAL ABILITY
|Press down while holding down L1 to select different ability catagorys and press right to select ability
|-
|L1+R1
|CAMERA CHANGE
|Switch between 3rd person or first person or dream view
|-
|L1+square
|THROW
|Throw things
|-
|L1+triangle
|PICK UP
|Pick up for 'hand' use or 'bag' storage
|-
|L2
|SWITCH RANGE
|Choose different range weapon
|-
|R2
|SWITCH MELEE
|Choose different melee weapon
|-
|square
|RANGE ATTACK
|Attack with range weapon
|-
|triangle
|MELEE ATTACK
|Attack with melee, hold on to any attack to add 20HP damage, the attack will charge and take 2x longer to execute - no SFX
|-
|circle
|INTERACT
|Open doors, talk, grab on edges, investigate/activate
|-
|x
|JUMP
|Jump up to 3 or 5 feet, rocketjet from walls, jump on wall to reach higher places, backflips and combinations
|-
|Select
|SELECT MODE
|Change controller mode
|}

==Damage Effect ==
*There are vital organs for target - brain, heart, jaw, private, liver, thigh, chest, and the nonvital parts.
*The first and third chance of Damage Effect is 10% each.

brain and heart shots - 50/200/300HP

jaw shots - 30/100/200HP

private and liver shots - 50/100/200HP

thigh and chest - 30/50/90HP

nonvital parts - 20/30/50HP

'''Gun Damage''' - HANDGUN, REVOLVER2x, SHOTGUN3x, RIFLE SMALL2x, RIFLE HUGE3x, SNIPER4x, EXTREME SNIPER5X, BAZOOKA7x+5, GRENADE5x, ROCKET10x+5x, MISSLE12X+5x|

==Gameplay==

{|

|-
|Realistic gameplay
|No double jumping, no running 35mph, no fake moves/movement that defy human physics. 
|-
|Realtime gameplay
|Inventory/option access, magic and summoning, fighting, interaction, choose weapon in realtime. 
|-
|Camera view
|First person camera will be right on player character's 2 eyes. third person and dream view can all be changed anytime during gameplay. 
|-
|LOCK-ON mode
|In first person camera it turns into zoom mode, you cant sprint. 
|-
|Multiple controller mode
|One for fighting, one for interacting, and one for driving. 
|-
|Hit walls
|Be careful of your surroundings, with barehands you will bleed and lose health, with weapons you will lose weapon quality. 
|-
|Limbs all over
|Cut and blow limbs apart. 
|}

==Interaction and Features==
*pick up limited bags to carry extra items
*real world interaction - climb, collusion, interact, and move just about anything, pick up, throw
*real world destruction - destroy just about anything
*special ability - spit, throw up, refuse, accept, good, bad
*store items anywhere - engine will remember where everything is and what stat it had. this data will be stored on HD or memory card
*equip unequip everything
*all traveling possibility, cars, bike, motocycle, helicopter, small plane, jet... horsy too

==Skills==

'''blacksmith''' - lets you restore nongun weapons and enchance your weapon

'''carsmith''' - lets you restore cars and enchance your car

'''gunsmith''' - lets you restore guns and create ammo and enchance either

==Discussion==

'''MythOpus:''' Could you please format this page up and possibly resize the pictures just a bit?

'''fleshsniper1''' I dont know the syntax/code for wikis, and i dont have internet access to learn it with my limited time. But in time i will fix it peace by peace. I just wanted to get it up for advice and comments. And i resized the picture smaller :) And i even tried to reformat it the best i can.

'''MythOpus:''' I took the time to format the best I can.  Please read over it to make sure everything is in good order, especially the 'Guns' heading.  When you have the time, I strongly suggest reading over [[Legacy:Wiki Markup|Wiki Markup]] as it shows you how to do things with the syntax and what not.  I was looking over your keys and realized they were for game controllers.  Will this mod be only available for PC users who have game controllers?  Please give more details :)

'''fleshsniper1''' X) Amazing! I was breathless to come back and find this great edit. Thanks so much MythOpus i will remember this great deed of yours :) No you dont need a controller, i just have a habit of using the PXS controller for layout. It will be for the keyboards too.</text>
    </revision>
    <revision>
      <id>4902</id>
      <timestamp>2007-07-12T16:05:31Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>that is correct &gt;_&gt;</comment>
      <text xml:space="preserve">{{classbox|Mod Idea for UT2004 - Flesh}}

==Introduction==

I am making this game for fun. This game will be big, it will one day be over 100GB. But for the beginning it will be very small with only a few available characters. I plan to take over 1 year to get a fully complete version done, meaning all class and core features are implemented. I can do this all by myself but help will be appreciated (mostly in scripting).

Here is the style I will be using and yes they are mine. I have many great concepts, over 20 char on paper but i dont have a scanner :(. This is an ambitious project if you hadn't noticed :)

&lt;img src=&quot;http://img221.imageshack.us/img221/5890/demon8eo0.png&quot; border=&quot;0&quot; alt=&quot;Image Hosted by ImageShack.us&quot;/&gt;

&lt;img src=&quot;http://img223.imageshack.us/img223/8530/demon3djo4.png&quot; border=&quot;0&quot; alt=&quot;Image Hosted by ImageShack.us&quot;/&gt;

Shot at 2007-07-10

From here on is just my doc... Please comment and give advice or ask questions. I dont have internet access so that is a problem :(

==CREATURES==

{|

|-
|Demons
|300HP
|Demons lurk around in the dark and can manifest into physical form from shadows, when they are mad they can be very fast. 
|-
|Huge demons
|500HP
|See 'Demons'. 
|-
|Fiends
|500HP
|Fiends are like gods or demi gods. 
|-
|Huge Fiends
|900HP
|See 'Fiends'. 
|-
|Spirits
|500HP
|Opaqe beings, a form of life or energy. 
|-
|Zombies
|200HP
|Things that died recently and brought back to life by dark forces. 
|-
|Ghouls
|200HP
|Creatures that died in a situation that obstructed the proper way of dieing and are lost and stuck in a unseen realm. 
|-
|Huge Ghouls
|300hp
|See 'Ghouls'. 
|-
|Humans
|100HP
|Beings that are pitiful and ignorant X). 
|-
|Soilders
|100HP
|Most ignorant form of human ;\. 
|-
|Vagabonds
|100HP
|Lone wanderer. 
|-
|Rebels
|100HP
|One or many people going against the system. 
|-
|Wanderers
|100HP
|one or many people with no home. 
|-
|Bandits
|100HP
|One or many people who steal from others. 
|-
|Lonewolf
|-
|A respected lone wanderer. 
|-
|Shamans
|100HP
|Ancient art develope to protect humans from unseen unknown forces. 
|-
|Lions
|300HP
|Animal found mostly in Africa. 
|-
|Bears
|200HP
|Animal found near woods. 
|-
|Large bears
|300HP
|See 'Bears'. 
|-
|Dogs
|100HP
|Animal found in citys 'man's best friend'. 
|-
|Cats
|50HP
|Animal found in citys. 
|-
|Rats
|50HP
|Animal found in city sewers and anywhere. 
|-
|Birds
|30HP
|Animal found anywhere there is life or food, they are mostly found in trees and the sky where they roam. 
|-
|Mouse
|30HP
|Animal found near human homes. 
|}

==Controlling The Fighter==

{|

|-
|R1
|LOCK-ON
|Lock on to target, hold JUMP to sway in any desire direction (counter by attacking right after they attack), hold JUMP and INTERACT to roll out of the way, hold INTERACT to block (deflect by interacting apon contact, by deflecting you slow them down 2x for 1 sec)
|-
|L1+down
|SPECIAL ABILITY
|Press down while holding down L1 to select different ability catagorys and press right to select ability
|-
|L1+R1
|CAMERA CHANGE
|Switch between 3rd person or first person or dream view
|-
|L1+square
|THROW
|Throw things
|-
|L1+triangle
|PICK UP
|Pick up for 'hand' use or 'bag' storage
|-
|L2
|SWITCH RANGE
|Choose different range weapon
|-
|R2
|SWITCH MELEE
|Choose different melee weapon
|-
|square
|RANGE ATTACK
|Attack with range weapon
|-
|triangle
|MELEE ATTACK
|Attack with melee, hold on to any attack to add 20HP damage, the attack will charge and take 2x longer to execute - no SFX
|-
|circle
|INTERACT
|Open doors, talk, grab on edges, investigate/activate
|-
|x
|JUMP
|Jump up to 3 or 5 feet, rocketjet from walls, jump on wall to reach higher places, backflips and combinations
|-
|Select
|SELECT MODE
|Change controller mode
|}

==Damage Effect ==
*There are vital organs for target - brain, heart, jaw, private, liver, thigh, chest, and the nonvital parts.
*The first and third chance of Damage Effect is 10% each.

brain and heart shots - 50/200/300HP

jaw shots - 30/100/200HP

private and liver shots - 50/100/200HP

thigh and chest - 30/50/90HP

nonvital parts - 20/30/50HP

'''Gun Damage''' - HANDGUN, REVOLVER2x, SHOTGUN3x, RIFLE SMALL2x, RIFLE HUGE3x, SNIPER4x, EXTREME SNIPER5X, BAZOOKA7x+5, GRENADE5x, ROCKET10x+5x, MISSLE12X+5x|

==Gameplay==

{|

|-
|Realistic gameplay
|No double jumping, no running 35mph, no fake moves/movement that defy human physics. 
|-
|Realtime gameplay
|Inventory/option access, magic and summoning, fighting, interaction, choose weapon in realtime. 
|-
|Camera view
|First person camera will be right on player character's 2 eyes. third person and dream view can all be changed anytime during gameplay. 
|-
|LOCK-ON mode
|In first person camera it turns into zoom mode, you cant sprint. 
|-
|Multiple controller mode
|One for fighting, one for interacting, and one for driving. 
|-
|Hit walls
|Be careful of your surroundings, with barehands you will bleed and lose health, with weapons you will lose weapon quality. 
|-
|Limbs all over
|Cut and blow limbs apart. 
|}

==Interaction and Features==
*pick up limited bags to carry extra items
*real world interaction - climb, collusion, interact, and move just about anything, pick up, throw
*real world destruction - destroy just about anything
*special ability - spit, throw up, refuse, accept, good, bad
*store items anywhere - engine will remember where everything is and what stat it had. this data will be stored on HD or memory card
*equip unequip everything
*all traveling possibility, cars, bike, motocycle, helicopter, small plane, jet... horsy too

==Skills==

'''blacksmith''' - lets you restore nongun weapons and enchance your weapon

'''carsmith''' - lets you restore cars and enchance your car

'''gunsmith''' - lets you restore guns and create ammo and enchance either

==Discussion==

'''MythOpus:''' Could you please format this page up and possibly resize the pictures just a bit?

'''fleshsniper1''' I dont know the syntax/code for wikis, and i dont have internet access to learn it with my limited time. But in time i will fix it peace by peace. I just wanted to get it up for advice and comments. And i resized the picture smaller :) And i even tried to reformat it the best i can.

'''MythOpus:''' I took the time to format the best I can.  Please read over it to make sure everything is in good order, especially the 'Guns' heading.  When you have the time, I strongly suggest reading over [[Legacy:Wiki Markup|Wiki Markup]] as it shows you how to do things with the syntax and what not.  I was looking over your keys and realized they were for game controllers.  Will this mod be only available for PC users who have game controllers?  Please give more details :)

'''fleshsniper1''' X) Amazing! I was breathless to come back and find this great edit. Thanks so much MythOpus i will remember this great deed of yours :) No you dont need a controller, i just have a habit of using the PXS controller for layout. It will be for the keyboards too.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ForcedLowGrav</title>
    <id>1980</id>
    <revision>
      <id>4842</id>
      <timestamp>2007-02-26T19:15:31Z</timestamp>
      <contributor>
        <ip>82-33-200-65.cable.ubr01.azte.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for any UT Engine Game &amp;ndash; ForcedLowGrav}}

==Description ==

This mutator runs maps in LowGrav according to how the map is named. Some maps are better played in LowGrav and others (like the ones with alot of indoor areas to tight for LowGrav manuevering) are better played without that mutator. This would give the choice of playing the LowGrav mutator or not and it just happens majically when the map is voted on or cycles into play.

==Method ==

Just take the LowGrav Mutator and add a test to parse the map's name. If the right 2 digits == LG then do what the mutator was going to do anyway. If the not, then test fails and the mutator does nothing. Now, the server admin just makes a copy of all the maps he/she wants this available in and renames the copy with LG affixed at the end. If in mapvote the LG version is voted on then its played in LowGrav, else if the originally named map wins then the mutator does nothing and regular gravity stays in effect. 

====Interested Scripters ====

If you are interested in developing this mod for any UT Engine Game then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* [[Legacy:CH3Z|CH3Z]](UT Version)

==Discussion ==

'''Ch3z:''' I will make this myself if someone doesn't come up with an idea so that it works without the labor of adding the copied and renamed maps. If that's the only way it can be done, then at least it can be done.

'''Foxpaw:''' The problem that I could see with this is, if it's going to have to be defined per-map anyway, why not just change the gravity settings on all the zoneinfos/physicsvolumes right in the map editor? Since the map will have a different name, the low-grav version is going to have to be downloaded by all the clients anyway.

'''Ch3z:''' Well, I did that with BadNeighbors_V2. I set all ZoneInfo's gravity vectors to (0,0,-200) i think it was and got rid of all jump boots. An exact duplication of the effect it would seem. But for some reason when trying to boost ppl across the map you would hit something invisiible just above the covered bridge and bounce down onto the roof really fast. I used find all ZoneInfo actors so i know i got them all. Besides that's so much more work for the server admin. What do you mean by &quot;defined per-map anyway&quot;? Once the map is in server's map folder with LG at the end of the name it will just happen anytime you play that map. Hmmm i wonder about UT's capabillity to copy and rename files. But if i get into all that, I'd just have a combo box for the server admin to pick maps that will use the effect. But then again, the other way there would be a LowGrav version of the map as well as a Regular grav version. My main focus on design here would be to automate it as much as possible to make it more user friendly. Any ideas there?

'''Ch3z:''' AhHa! console command to turn it off and on. =) Any ideas on how to do that without restarting the map? Maybe you would have to choose LowGrav before the next map loads. Either was is kinda clumbsy, but better than copying and renameing maps.

'''Foxpaw:''' Well, if you have the map name with LG at the end, that's going to force clients to download the LG version when they try to play, even though it's an identical map just with a different name. I'm not sure how one goes about making a GUI using the built in GUI systen, but the maps cycled/maps not cycled would likely be very close to what you want. You can store the list of which maps should have lowgrav in an ini file, the same way that the map lists store which maps to cycle.

'''Ch3z:''' Good stuff because we'd rather not force extra downloads. Still hoping not to force LowGrav on that map everytime it comes up. I'm leaning toward a setting saved in an ini file to enable or disable LowGrav via the console. I can't think of a better way for the end user choose unless its possible to cause a pop-up before each map loads that will time out if no choice is made. hmmmm now i'm wondering if it would be more worthwhile to do something that would be called MutVote ... like MapVote that would be avle add a mutator to the servers string but not remove any that weren't added via MutVote. I think would be over my head. (unless maybe MutVote extends MapVote then most of work is already done)

'''Daid303:''' How about doing a trace upwards from every pathnode, to see how high the ceiling is, then you can set the gravatie acording to that.

'''Ch3z:''' I dont' know if that applies here or not but it is a very interesting idea. Maybe you could pose that on [[Legacy:Map Ideas|Map Ideas]]. It would surely answer the issue of the negative LowGrav effects in confined spaces. And could maybe still be an extension of the LowGrav mutator for that purpose. But it doesn't answer the issue of LowGrav as an option on a per map basis. A very juicy thought though. =P &lt;br /&gt;I have a feeling this page will be refactored into multiple idea pages. Might be nice to save it as a subpage of one of those new pages as /Origination as a study in &quot;Feedback as an Aid to Idea Development&quot;. (or &quot;The Bulldozer Approach to Idea Deveopment&quot; hehe)

'''Daid303:''' Well, I just thought it up while reading this page. And it could apply to this idea, then you can throw away the whole maplist idea, I did a botamount mutator once, that just looked at the amount of pathnodes in a map and created PathnodeNum/40 bots, that works surprizingly well. People tend to forget about the usefullness of pathnodes :)

'''Ch3z:''' I recall tarq once half-jokingly describing this wiki as:

{{innerbox|&quot;...a massively collaborative document that sometimes breaks down to chatter and talks to itself.&quot;

}}

That was in the context of a discussion of the wiki being used as a forum. I'm not sure if that was a remark against a page like this or if that would make this a typical wiki page but it sure fits the bill. I'll need to make a decision on this page soon.

'''EntropicLqd:''' I like the idea of checking each of the pathnodes for the available height.  It probably wouldn't work on all maps though as not all of them are properly split into zones or volumes.  I haven't tested it in UT2003, but in UT you could change a fair few zone properties (gravity included) in UScript while the map was running.  Creating a mutator that would allow gravity to be set to &quot;normal&quot; via a console command should'nt be too hard.

'''nogginBasher:''' You could achieve this with MapVoteLA.  If you have for example CTF-BoostingMap and lgCTF-BoostingMap in your maplist, MapVoteLA can be set to add the LowGrav mutator whenever an lgCTF map is voted on.</text>
    </revision>
    <revision>
      <id>4843</id>
      <timestamp>2003-10-24T07:04:15Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>added 2p</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for any UT Engine Game &amp;ndash; ForcedLowGrav}}

==Description ==

This mutator runs maps in LowGrav according to how the map is named. Some maps are better played in LowGrav and others (like the ones with alot of indoor areas to tight for LowGrav manuevering) are better played without that mutator. This would give the choice of playing the LowGrav mutator or not and it just happens majically when the map is voted on or cycles into play.

==Method ==

Just take the LowGrav Mutator and add a test to parse the map's name. If the right 2 digits == LG then do what the mutator was going to do anyway. If the not, then test fails and the mutator does nothing. Now, the server admin just makes a copy of all the maps he/she wants this available in and renames the copy with LG affixed at the end. If in mapvote the LG version is voted on then its played in LowGrav, else if the originally named map wins then the mutator does nothing and regular gravity stays in effect. 

====Interested Scripters ====

If you are interested in developing this mod for any UT Engine Game then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* [[Legacy:CH3Z|CH3Z]](UT Version)

==Discussion ==

'''Ch3z:''' I will make this myself if someone doesn't come up with an idea so that it works without the labor of adding the copied and renamed maps. If that's the only way it can be done, then at least it can be done.

'''Foxpaw:''' The problem that I could see with this is, if it's going to have to be defined per-map anyway, why not just change the gravity settings on all the zoneinfos/physicsvolumes right in the map editor? Since the map will have a different name, the low-grav version is going to have to be downloaded by all the clients anyway.

'''Ch3z:''' Well, I did that with BadNeighbors_V2. I set all ZoneInfo's gravity vectors to (0,0,-200) i think it was and got rid of all jump boots. An exact duplication of the effect it would seem. But for some reason when trying to boost ppl across the map you would hit something invisiible just above the covered bridge and bounce down onto the roof really fast. I used find all ZoneInfo actors so i know i got them all. Besides that's so much more work for the server admin. What do you mean by &quot;defined per-map anyway&quot;? Once the map is in server's map folder with LG at the end of the name it will just happen anytime you play that map. Hmmm i wonder about UT's capabillity to copy and rename files. But if i get into all that, I'd just have a combo box for the server admin to pick maps that will use the effect. But then again, the other way there would be a LowGrav version of the map as well as a Regular grav version. My main focus on design here would be to automate it as much as possible to make it more user friendly. Any ideas there?

'''Ch3z:''' AhHa! console command to turn it off and on. =) Any ideas on how to do that without restarting the map? Maybe you would have to choose LowGrav before the next map loads. Either was is kinda clumbsy, but better than copying and renameing maps.

'''Foxpaw:''' Well, if you have the map name with LG at the end, that's going to force clients to download the LG version when they try to play, even though it's an identical map just with a different name. I'm not sure how one goes about making a GUI using the built in GUI systen, but the maps cycled/maps not cycled would likely be very close to what you want. You can store the list of which maps should have lowgrav in an ini file, the same way that the map lists store which maps to cycle.

'''Ch3z:''' Good stuff because we'd rather not force extra downloads. Still hoping not to force LowGrav on that map everytime it comes up. I'm leaning toward a setting saved in an ini file to enable or disable LowGrav via the console. I can't think of a better way for the end user choose unless its possible to cause a pop-up before each map loads that will time out if no choice is made. hmmmm now i'm wondering if it would be more worthwhile to do something that would be called MutVote ... like MapVote that would be avle add a mutator to the servers string but not remove any that weren't added via MutVote. I think would be over my head. (unless maybe MutVote extends MapVote then most of work is already done)

'''Daid303:''' How about doing a trace upwards from every pathnode, to see how high the ceiling is, then you can set the gravatie acording to that.

'''Ch3z:''' I dont' know if that applies here or not but it is a very interesting idea. Maybe you could pose that on [[Legacy:Map Ideas|Map Ideas]]. It would surely answer the issue of the negative LowGrav effects in confined spaces. And could maybe still be an extension of the LowGrav mutator for that purpose. But it doesn't answer the issue of LowGrav as an option on a per map basis. A very juicy thought though. =P &lt;br /&gt;I have a feeling this page will be refactored into multiple idea pages. Might be nice to save it as a subpage of one of those new pages as /Origination as a study in &quot;Feedback as an Aid to Idea Development&quot;. (or &quot;The Bulldozer Approach to Idea Deveopment&quot; hehe)

'''Daid303:''' Well, I just thought it up while reading this page. And it could apply to this idea, then you can throw away the whole maplist idea, I did a botamount mutator once, that just looked at the amount of pathnodes in a map and created PathnodeNum/40 bots, that works surprizingly well. People tend to forget about the usefullness of pathnodes :)

'''Ch3z:''' I recall tarq once half-jokingly describing this wiki as:

{{innerbox|&quot;...a massively collaborative document that sometimes breaks down to chatter and talks to itself.&quot;

}}

That was in the context of a discussion of the wiki being used as a forum. I'm not sure if that was a remark against a page like this or if that would make this a typical wiki page but it sure fits the bill. I'll need to make a decision on this page soon.

'''EntropicLqd:''' I like the idea of checking each of the pathnodes for the available height.  It probably wouldn't work on all maps though as not all of them are properly split into zones or volumes.  I haven't tested it in UT2003, but in UT you could change a fair few zone properties (gravity included) in UScript while the map was running.  Creating a mutator that would allow gravity to be set to &quot;normal&quot; via a console command should'nt be too hard.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Gladiator</title>
    <id>1958</id>
    <revision>
      <id>4794</id>
      <timestamp>2003-06-01T09:19:35Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Description===

In the beginning of a round, the gladiator's the one, who draws first blood.&lt;br /&gt;After that, everybody can kill, but only the gladiator gets score for it.&lt;br /&gt;This continues until someone else kills the gladiator and becomes him.&lt;br /&gt;To see him better, the Gladiator glows bright red/blue/yellow and appears&lt;br /&gt;in your radar-location thingy.

This is originated by a MP-mode in Time Splitters 2

Brought to u by AxeLarge :)

==Advanced==

There could be a feature if you get the gladiator, you get a good weapon (Choose in a Menu)

==Interested Scripters==

Somebody, please make this cool mod :)

==Discussion==

AxeLarge: Sorry 4 my English, folks ;)

'''Foxpaw:''' I think this is already essentially what the &quot;Mutation&quot; (or something. I don't recall the exact name) gametype in UT2K3 is.</text>
    </revision>
    <revision>
      <id>4795</id>
      <timestamp>2003-02-25T08:38:50Z</timestamp>
      <contributor>
        <ip>195.13.195.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Description===

In the beginning of a round, the gladiator's the one, who draws first blood.&lt;br /&gt;After that, everybody can kill, but only the gladiator gets score for it.&lt;br /&gt;This continues until someone else kills the gladiator and becomes him.&lt;br /&gt;To see him better, the Gladiator glows bright red/blue/yellow and appears&lt;br /&gt;in your radar-location thingy.

This is originated by a MP-mode in Time Splitters 2

Brought to u by AxeLarge :)

==Advanced==

There could be a feature if you get the gladiator, you get a good weapon (Choose in a Menu)

==Interested Scripters==

Somebody, please make this cool mod :)

==Discussion==

AxeLarge: Sorry 4 my English, folks ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Gliding Scorp</title>
    <id>2009</id>
    <revision>
      <id>4910</id>
      <timestamp>2006-08-29T05:11:01Z</timestamp>
      <contributor>
        <ip>Hil-102-151.Reshall.Berkeley.EDU</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">http://www.ataricommunity.com/forums/showthread.php?s=2955447e8215ded60078d1c12e94ae62&amp;threadid=387954

to mirror the post on the forums:

::The most awesome idea just came up in IRC 

[23:20] &lt;stex&gt; they should alter the scorpion so when you open the blades it turns into a glider 

[23:20] &lt;_Foo_&gt; lol that would ****ing own. 

[23:20] &lt;_Foo_&gt; hard. 

[23:20] &lt;_Foo_&gt; Jesus, that's actually a really, really good idea &gt;:E 

[23:20] &lt;stex&gt;  

[23:20] * _Foo_ smells a mutator 

[23:20] &lt;stex&gt; imagine taking down 4 people building a node by landing on them with blades open 

[23:20] &lt;_Foo_&gt; allow it to get a little pace up and take off 

[23:20] &lt;stex&gt; lol :-) 

[23:21] &lt;stex&gt; scorpion's chasing raptors 

Perhaps something to finally make the scorpion have its own distinctive edge on the battlefield. 

Dont get me wrong, it's a nice vehicle as it is.. any more firepower and it's OTT, but I think this idea would rule::

I didn't come up with this idea, I just saw it on a forum. If you scroll down you can see DrSin saying it was planed that the scorpion would glide with its wings extended but was forgotten.

Maybe not to much lift, just enough to cross ravines and get some airtime off a cliff. Why not implement a stall angle so if you go airborn at the wrong angle of attack the car stalls and you go plop.

==Interested scripters==

'''Foxpaw:''' That's an interesting idea. However, I can see a couple of potential problems with it. (other than the fact that the wings are way too small and since they're razors they're sharp at the front and expand toward the back which is pretty much the opposite of an aerofoil) Number one, the razors can be broken off. Number two, gliding serenely at a scorpions pace in a nice predictable path is going to be a lot more dangerous, not to mention slower (no traction to propel you) than driving.

'''Mosquito:''' I guess the idea is that its more of a way to bridge distances then to really fly. Like a slower fall. So if you have your razors out, you go farther on jumps.

'''craze:''' why not just replace the blades with big orange wing things that fold out or something cool like that?

'''T1:''' Turns out that I already did this with a mutator I'm working on that will give all the vehicles various fun abilities. Other things include giving the hellbender a speed boost with the fire buttons which you can use as many times as you want, but if you go too fast, chances are that you'll flip the vehicle. Also, I'm giving the Goliath a jump ability. Other vehicles are still in the works.

'''Missilemaster:''' You're not the only one. I'm doing something sort of similar, a simple pack-thing with wacky vehicles, and one I just finished is a flying Scorpion. It's very fun, but difficult, to fly around (you have to keep moving pretty fast or it falls...wouldn't make much sense to let it hover :P). It actually works by spawning (and tossing you into) a new vehicle subclassed off the Raptor when you take off, and puts you back in a regular Scorpion when you land; but you can't see any change (which is a good thing!). If this topic doesn't turn out to be dead, I might release the current version separately so you can try it out.

'''Missilemaster:''' Looks like it is dead, but in any case, here's the Flying Scorpion at last, almost exactly 2 years late: [http://ut2004.levels4you.com/downloads.l4y?review=14803&amp;cat=149 (insert description here)] It's been quite popular so far, considering how old UT2004 is. :)</text>
    </revision>
    <revision>
      <id>4911</id>
      <timestamp>2006-06-05T06:47:58Z</timestamp>
      <contributor>
        <ip>Ip-65-91-96-140.linkstarwireless.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">http://www.ataricommunity.com/forums/showthread.php?s=2955447e8215ded60078d1c12e94ae62&amp;threadid=387954

to mirror the post on the forums:

::The most awesome idea just came up in IRC 

[23:20] &lt;stex&gt; they should alter the scorpion so when you open the blades it turns into a glider 

[23:20] &lt;_Foo_&gt; lol that would ****ing own. 

[23:20] &lt;_Foo_&gt; hard. 

[23:20] &lt;_Foo_&gt; Jesus, that's actually a really, really good idea &gt;:E 

[23:20] &lt;stex&gt;  

[23:20] * _Foo_ smells a mutator 

[23:20] &lt;stex&gt; imagine taking down 4 people building a node by landing on them with blades open 

[23:20] &lt;_Foo_&gt; allow it to get a little pace up and take off 

[23:20] &lt;stex&gt; lol :-) 

[23:21] &lt;stex&gt; scorpion's chasing raptors 

Perhaps something to finally make the scorpion have its own distinctive edge on the battlefield. 

Dont get me wrong, it's a nice vehicle as it is.. any more firepower and it's OTT, but I think this idea would rule::

I didn't come up with this idea, I just saw it on a forum. If you scroll down you can see DrSin saying it was planed that the scorpion would glide with its wings extended but was forgotten.

Maybe not to much lift, just enough to cross ravines and get some airtime off a cliff. Why not implement a stall angle so if you go airborn at the wrong angle of attack the car stalls and you go plop.

==Interested scripters==

'''Foxpaw:''' That's an interesting idea. However, I can see a couple of potential problems with it. (other than the fact that the wings are way too small and since they're razors they're sharp at the front and expand toward the back which is pretty much the opposite of an aerofoil) Number one, the razors can be broken off. Number two, gliding serenely at a scorpions pace in a nice predictable path is going to be a lot more dangerous, not to mention slower (no traction to propel you) than driving.

'''Mosquito:''' I guess the idea is that its more of a way to bridge distances then to really fly. Like a slower fall. So if you have your razors out, you go farther on jumps.

'''craze:''' why not just replace the blades with big orange wing things that fold out or something cool like that?

'''T1:''' Turns out that I already did this with a mutator I'm working on that will give all the vehicles various fun abilities. Other things include giving the hellbender a speed boost with the fire buttons which you can use as many times as you want, but if you go too fast, chances are that you'll flip the vehicle. Also, I'm giving the Goliath a jump ability. Other vehicles are still in the works.

'''Missilemaster:''' You're not the only one. I'm doing something sort of similar, a simple pack-thing with wacky vehicles, and one I just finished is a flying Scorpion. It's very fun, but difficult, to fly around (you have to keep moving pretty fast or it falls...wouldn't make much sense to let it hover :P). It actually works by spawning (and tossing you into) a new vehicle subclassed off the Raptor when you take off, and puts you back in a regular Scorpion when you land; but you can't see any change (which is a good thing!). If this topic doesn't turn out to be dead, I might release the current version separately so you can try it out.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/GraviJump</title>
    <id>1950</id>
    <revision>
      <id>4776</id>
      <timestamp>2003-01-26T20:53:36Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>delete me - mutator finished and released.</comment>
      <text xml:space="preserve">'''EntropicLqd:''' Can be deleted.  Mutator written and released.  Available from the snout web site in the 2K3 maps and mods section.

http://www.snout-clan.co.uk/</text>
    </revision>
    <revision>
      <id>4777</id>
      <timestamp>2003-01-23T21:25:04Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>Zxan - got it in one.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; GraviJump - Leaps towards gravitaitonal alterations}}

==Description ==

This mod allow the player's jump height and gravity to be changed in combination with each other.  Essentially, players select the amount of gravity they wish to use within the game (from 25% to 400%) using a slider.  Players can then set the jump height from 25% through to 400%.

The nice thing about this mutator is that the jump height will be relative to the gravity.  So, if the amount of gravity is set to 50% and the jump height is set to 100%, players won't actually jump any higher than they would in a normal game.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EntropicLqd:''' I think I'll write this while I work through some DD mutator problems I have (like motivation &amp;ndash; sigh).

==Discussion ==

'''EntropicLqd:''' The name is a bit pap - any suggestions?

'''Eldhrin:''' call it 'Pubert'

'''ZxAnPhOrIaN:''' Cool, so you jump the same in normal gravity, but the projectiles (like the flak shell) go farther??

'''EntropicLqd:''' Indeed sir, you have hit the nail on the head.  I've also included options for dodging and double-jumping as well.
: Errr Eldhrin - why?</text>
    </revision>
    <revision>
      <id>4778</id>
      <timestamp>2003-01-23T21:38:51Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; GraviJump - Leaps towards gravitaitonal alterations}}

==Description ==

This mod allow the player's jump height and gravity to be changed in combination with each other.  Essentially, players select the amount of gravity they wish to use within the game (from 25% to 400%) using a slider.  Players can then set the jump height from 25% through to 400%.

The nice thing about this mutator is that the jump height will be relative to the gravity.  So, if the amount of gravity is set to 50% and the jump height is set to 100%, players won't actually jump any higher than they would in a normal game.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EntropicLqd:''' I think I'll write this while I work through some DD mutator problems I have (like motivation &amp;ndash; sigh).

==Discussion ==

'''EntropicLqd:''' The name is a bit pap - any suggestions?

'''Eldhrin:''' call it 'Pubert'

'''ZxAnPhOrIaN:''' Cool, so you jump the same in normal gravity, but the projectiles (like the flak shell) go farther??

'''EntropicLqd:''' Indeed sir, you have hit the nail on the head.  I've also included options for dodging and double-jumping as well.
: Errr Eldhrin - why?

'''ZxAnPhOrIaN:''' Is pubert a cross between poo and dilbert?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/GravityWell</title>
    <id>1897</id>
    <revision>
      <id>4652</id>
      <timestamp>2004-11-02T16:31:35Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Gravity well}}

==Description ==

This map component creates a gravity well somewhere on the map.  Designed for use in low grav areas to cause players to curve through the air.  The gravity will effect players within it's radius.  The gravitational effect can act both towards and away from the well.  As with real gravity, the effect will be stronger the closer the player is to the well.  At the point of touching the gravity well, the player will experience no gravity at all.

Options on the component are:
* Area of effect (the radius within which actors are affected)
* Gravity strength (Positive value for pull, negative value for push
* Gravity constant (Physiscists be prepared to be offended)
* Whether the effect is (strength * constant / r) or (strength / constant * r) or (strength * constant / r^2) or (strength / constant * r^2)

I'm not after a good simulation here, just one that's good enough to give the impression of gravity.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  I wonder what the replication implications of this component are.  It's quite possible that this idea is unworkable.

'''DJPaul:'''  No more than normal zone relpication info.  No idea if it will pull projectiles, which i doubt.  Hack0ring the Karma might be the way to go.

'''Papapishu''' Will it be able to twist the player 'feet down'?

That's be a cool way to make asteroid maps and such, just make asteroids and  put a gravity-vertex in each one of them, and you got small boulders you can walk all the way around, without having to use warp-portals...

'''Highlander:''' I made an actor which does this (Pulls pawns towards it) not sure if it is what you are looking for. I never did figure out how to turn the way your feet go. Made it for a map i was making, never actually used it :/. [[Legacy:Highlander/Gravitypack|Highlander/gravitypack]]  Its a bit raw as i only wrote it for my own use. But the basics are there feel free to modify it to your hearts content. 

'''Tarquin:''' You can paste in the code directly if you like, Highlander, either on this page or one of its own. Come to think of it, I need to clean up all the custom classes that are flying around this place...

'''Highlander:''' Changed the link to point to the actual code. Please dont laugh it was the first thing i wrote :)

'''Mortal Monkey:''' I'm also working on funky gravity (but for UT). I don't think replication and such is a problem as long as you only affect actors that have Physics of PHYS_Falling. As for the 'feet down' thing, it would require rescripting of the entire playerpawn movement code (I dare not even think about bots), and I would be very gratefull if someone besides me would do it.

'''Draconx:''' I've been trying to work this concept in UT.  It all works fine except when it comes to projectiles, where you get a desynchronization between client &amp; server on the projectiles (due to bNetTemporary being true on projectiles).  So basically my current plan of action is to use DeltaTime in tick to come up with a formula which can accurately calculate the position, orientation, and velocity of the projectile without any input from the server whatsoever.  I'm sure its possible, just fairly complicated.  Maybe my Calculus teacher will have some ideas, I'll ask him.

The current algorithm I'm employing works as follows:&lt;uscript&gt;V = Location - Other.Location;
Magnitude = VSize(V);
VNormal = Normal(V);
V = VNormal * abs(Magnitude - 256);

Other.Velocity = Other.Velocity + V;
Other.SetRotation(rotator(Other.Velocity));&lt;/uscript&gt;Works great except for it not being synchronized across different computers.  Also the SetRotation just looks wierd on rocket grenades, so a check should be done on that one.

'''Foxpaw:''' I didn't pay enough attention when we learned orbital mechanics in physics class, but that's probrably exactly what you're looking for. (some formula relating to orbital mechanics.)</text>
    </revision>
    <revision>
      <id>4653</id>
      <timestamp>2004-11-02T04:55:39Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Gravity well}}

==Description ==

This map component creates a gravity well somewhere on the map.  Designed for use in low grav areas to cause players to curve through the air.  The gravity will effect players within it's radius.  The gravitational effect can act both towards and away from the well.  As with real gravity, the effect will be stronger the closer the player is to the well.  At the point of touching the gravity well, the player will experience no gravity at all.

Options on the component are:
* Area of effect (the radius within which actors are affected)
* Gravity strength (Positive value for pull, negative value for push
* Gravity constant (Physiscists be prepared to be offended)
* Whether the effect is (strength * constant / r) or (strength / constant * r) or (strength * constant / r^2) or (strength / constant * r^2)

I'm not after a good simulation here, just one that's good enough to give the impression of gravity.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  I wonder what the replication implications of this component are.  It's quite possible that this idea is unworkable.

'''DJPaul:'''  No more than normal zone relpication info.  No idea if it will pull projectiles, which i doubt.  Hack0ring the Karma might be the way to go.

'''Papapishu''' Will it be able to twist the player 'feet down'?

That's be a cool way to make asteroid maps and such, just make asteroids and  put a gravity-vertex in each one of them, and you got small boulders you can walk all the way around, without having to use warp-portals...

'''Highlander:''' I made an actor which does this (Pulls pawns towards it) not sure if it is what you are looking for. I never did figure out how to turn the way your feet go. Made it for a map i was making, never actually used it :/. [[Legacy:Highlander/Gravitypack|Highlander/gravitypack]]  Its a bit raw as i only wrote it for my own use. But the basics are there feel free to modify it to your hearts content. 

'''Tarquin:''' You can paste in the code directly if you like, Highlander, either on this page or one of its own. Come to think of it, I need to clean up all the custom classes that are flying around this place...

'''Highlander:''' Changed the link to point to the actual code. Please dont laugh it was the first thing i wrote :)

'''Mortal Monkey:''' I'm also working on funky gravity (but for UT). I don't think replication and such is a problem as long as you only affect actors that have Physics of PHYS_Falling. As for the 'feet down' thing, it would require rescripting of the entire playerpawn movement code (I dare not even think about bots), and I would be very gratefull if someone besides me would do it.

'''Draconx:''' I've been trying to work this concept in UT.  It all works fine except when it comes to projectiles, where you get a desynchronization between client &amp; server on the projectiles (due to bNetTemporary being true on projectiles).  So basically my current plan of action is to use DeltaTime in tick to come up with a formula which can accurately calculate the position, orientation, and velocity of the projectile without any input from the server whatsoever.  I'm sure its possible, just fairly complicated.  Maybe my Calculus teacher will have some ideas, I'll ask him.

The current algorithm I'm employing works as follows:&lt;uscript&gt;V = Location - Other.Location;
Magnitude = VSize(V);
VNormal = Normal(V);
V = VNormal * abs(Magnitude - 256);

Other.Velocity = Other.Velocity + V;
Other.SetRotation(rotator(Other.Velocity));&lt;/uscript&gt;Works great except for it not being synchronized across different computers.  Also the SetRotation just looks wierd on rocket grenades, so a check should be done on that one.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/GunsAndShields</title>
    <id>1913</id>
    <revision>
      <id>4688</id>
      <timestamp>2006-06-24T14:33:15Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>message to entropic</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Guns and Shields (aka I need a better name)}}

==Description ==

Far the in the future arena combat has become a specator sport.  Gladiators armed with an energy shield and a laser pistol fight for supremacy in a no holds barred scrap.

The maps have ammunition (the shield and gun share ammo), and armour.  All players start with a laser gun and an energy shield.  The primary fire button is used to fire the laser gun, and the secondary fire is used to pop up the energy shield.  The shield drains energy with use, but if enemy fire is blocked by the shield then it converts the blast into additional energy, slowing the drain.

The laser blasts move reasonably slowly (slower than a rocket probaby) but do a significant amount of damage (3 hits and you are toast).  The shield should drain relatively quickly.

The winner is simply the last person left alive.

This style of play may also be cool for CTF, DD, and BR - who knows.  It may also benefit from different types of weapons - pistol, heavy blaster thingy, and ammo absorber.  The weapon and game dynamic should be kept fairly simply.  The two changes critical to the gameplay are the &quot;offhand shield&quot;, and the fact that none of the weapons should do any splash damage.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EnropicLqd:''' Work on this has started, check [[Legacy:Developer Journals/EntropicLqd|Developer Journals/EntropicLqd]] for the journal.

==Discussion ==

'''EntropicLqd:''' It now takes 4 hits to kill someone.

'''Kartoshka:''' Did this mod ever get finished? I can't seem to find it. I'll delete this page if it did.</text>
    </revision>
    <revision>
      <id>4689</id>
      <timestamp>2002-11-25T10:14:45Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>work in progress</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Guns and Shields (aka I need a better name)}}

==Description ==

Far the in the future arena combat has become a specator sport.  Gladiators armed with an energy shield and a laser pistol fight for supremacy in a no holds barred scrap.

The maps have ammunition (the shield and gun share ammo), and armour.  All players start with a laser gun and an energy shield.  The primary fire button is used to fire the laser gun, and the secondary fire is used to pop up the energy shield.  The shield drains energy with use, but if enemy fire is blocked by the shield then it converts the blast into additional energy, slowing the drain.

The laser blasts move reasonably slowly (slower than a rocket probaby) but do a significant amount of damage (3 hits and you are toast).  The shield should drain relatively quickly.

The winner is simply the last person left alive.

This style of play may also be cool for CTF, DD, and BR - who knows.  It may also benefit from different types of weapons - pistol, heavy blaster thingy, and ammo absorber.  The weapon and game dynamic should be kept fairly simply.  The two changes critical to the gameplay are the &quot;offhand shield&quot;, and the fact that none of the weapons should do any splash damage.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EnropicLqd:''' Work on this has started, check [[Legacy:Developer Journals/EntropicLqd|Developer Journals/EntropicLqd]] for the journal.

==Discussion ==

'''EntropicLqd:''' It now takes 4 hits to kill someone.</text>
    </revision>
    <revision>
      <id>4690</id>
      <timestamp>2006-06-23T16:29:30Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>delete</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Guns and Shields (aka I need a better name)}}

==Description ==

Far the in the future arena combat has become a specator sport.  Gladiators armed with an energy shield and a laser pistol fight for supremacy in a no holds barred scrap.

The maps have ammunition (the shield and gun share ammo), and armour.  All players start with a laser gun and an energy shield.  The primary fire button is used to fire the laser gun, and the secondary fire is used to pop up the energy shield.  The shield drains energy with use, but if enemy fire is blocked by the shield then it converts the blast into additional energy, slowing the drain.

The laser blasts move reasonably slowly (slower than a rocket probaby) but do a significant amount of damage (3 hits and you are toast).  The shield should drain relatively quickly.

The winner is simply the last person left alive.

This style of play may also be cool for CTF, DD, and BR - who knows.  It may also benefit from different types of weapons - pistol, heavy blaster thingy, and ammo absorber.  The weapon and game dynamic should be kept fairly simply.  The two changes critical to the gameplay are the &quot;offhand shield&quot;, and the fact that none of the weapons should do any splash damage.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EnropicLqd:''' Work on this has started, check [[Legacy:Developer Journals/EntropicLqd|Developer Journals/EntropicLqd]] for the journal.

==Discussion ==

'''EntropicLqd:''' It now takes 4 hits to kill someone.
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Heavy Items</title>
    <id>1872</id>
    <revision>
      <id>4594</id>
      <timestamp>2003-09-04T21:34:43Z</timestamp>
      <contributor>
        <ip>Host2.barrie.org</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Heavy Items}}

==Description ==

This mutator reduces the speed players can move (and the height they can jump) by examining the players inventory for weapons and objects.  The rules are as follows:

* For each weapon the player is carrying the player's speed is reduced by 1%.
* For each full amount of ammo the player's speed is reduced by 1% (in 0.1% increments).
* Each item carried (flag, ball, etc) reduced the player's speed by 1%.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''ZxAnPhOrIaN:''' When carrying an item, you should have decreased mobility such as cant look all the way up and down.

'''Dezro:''' 1% is a bit low. Also, the ball shouldn't count since the ball carrier is rendered helpless anyway.

'''ZxAnPhOrIaN:''' No, the ball should count, cause it has mass!! Also, shields and adreniline should count

'''ZxAnPhOrIaN:''' Also, 1% is reasonable, cause if the player has 11 weapons, all ammo maxed out, and has the flag or ball, you will be walking VERY slow!!

'''EntropicLqd:''' I deliberately left out the adrenaline and shield.  Adrenaline because I prefer to pretend it doeasn't exist (and builds up within the biological system so has no apparent weight), and sheild because it's an energy sheild rather than a real item of equipment.  Including shield would be moderately compelling, but 1% every 50 points of shield seems a bit high to me.  I'm with Zxan on the speed changes.  I did originally think that 2% or 3% would be a reasonable weight but a slight difference in speed will make a massive difference to vulnerability so I set it at 1%.  It might sound low ... but you try playing with it against people.

'''MrFixit:''' Seems simple enough to me, I have a mute that makes your speed percent depend on your health.  What your talking about sounds good, and seems fair enough.

'''ZxAnPhOrIaN:''' &gt; Little stuff builds up sooooo fast!!!

'''Random Guest';'' &gt; I know for a fact Deus Ex (built on unreal tournament tech.) uses a similar system, except the slowdown only occurs when you are activley holding a heavy weapon. Might want to check it out if anyone is making this mod.</text>
    </revision>
    <revision>
      <id>4595</id>
      <timestamp>2002-12-29T21:54:40Z</timestamp>
      <contributor>
        <ip>MrFixit</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Heavy Items}}

==Description ==

This mutator reduces the speed players can move (and the height they can jump) by examining the players inventory for weapons and objects.  The rules are as follows:

* For each weapon the player is carrying the player's speed is reduced by 1%.
* For each full amount of ammo the player's speed is reduced by 1% (in 0.1% increments).
* Each item carried (flag, ball, etc) reduced the player's speed by 1%.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''ZxAnPhOrIaN:''' When carrying an item, you should have decreased mobility such as cant look all the way up and down.

'''Dezro:''' 1% is a bit low. Also, the ball shouldn't count since the ball carrier is rendered helpless anyway.

'''ZxAnPhOrIaN:''' No, the ball should count, cause it has mass!! Also, shields and adreniline should count

'''ZxAnPhOrIaN:''' Also, 1% is reasonable, cause if the player has 11 weapons, all ammo maxed out, and has the flag or ball, you will be walking VERY slow!!

'''EntropicLqd:''' I deliberately left out the adrenaline and shield.  Adrenaline because I prefer to pretend it doeasn't exist (and builds up within the biological system so has no apparent weight), and sheild because it's an energy sheild rather than a real item of equipment.  Including shield would be moderately compelling, but 1% every 50 points of shield seems a bit high to me.  I'm with Zxan on the speed changes.  I did originally think that 2% or 3% would be a reasonable weight but a slight difference in speed will make a massive difference to vulnerability so I set it at 1%.  It might sound low ... but you try playing with it against people.

'''MrFixit:''' Seems simple enough to me, I have a mute that makes your speed percent depend on your health.  What your talking about sounds good, and seems fair enough.</text>
    </revision>
    <revision>
      <id>4596</id>
      <timestamp>2002-12-29T23:38:51Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Heavy Items}}

==Description ==

This mutator reduces the speed players can move (and the height they can jump) by examining the players inventory for weapons and objects.  The rules are as follows:

* For each weapon the player is carrying the player's speed is reduced by 1%.
* For each full amount of ammo the player's speed is reduced by 1% (in 0.1% increments).
* Each item carried (flag, ball, etc) reduced the player's speed by 1%.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''ZxAnPhOrIaN:''' When carrying an item, you should have decreased mobility such as cant look all the way up and down.

'''Dezro:''' 1% is a bit low. Also, the ball shouldn't count since the ball carrier is rendered helpless anyway.

'''ZxAnPhOrIaN:''' No, the ball should count, cause it has mass!! Also, shields and adreniline should count

'''ZxAnPhOrIaN:''' Also, 1% is reasonable, cause if the player has 11 weapons, all ammo maxed out, and has the flag or ball, you will be walking VERY slow!!

'''EntropicLqd:''' I deliberately left out the adrenaline and shield.  Adrenaline because I prefer to pretend it doeasn't exist (and builds up within the biological system so has no apparent weight), and sheild because it's an energy sheild rather than a real item of equipment.  Including shield would be moderately compelling, but 1% every 50 points of shield seems a bit high to me.  I'm with Zxan on the speed changes.  I did originally think that 2% or 3% would be a reasonable weight but a slight difference in speed will make a massive difference to vulnerability so I set it at 1%.  It might sound low ... but you try playing with it against people.

'''MrFixit:''' Seems simple enough to me, I have a mute that makes your speed percent depend on your health.  What your talking about sounds good, and seems fair enough.

'''ZxAnPhOrIaN:''' &gt; Little stuff builds up sooooo fast!!!</text>
    </revision>
    <revision>
      <id>33829</id>
      <timestamp>2008-12-29T21:59:26Z</timestamp>
      <contributor>
        <username>Elliot.AT</username>
        <id>1826</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Heavy Items}}

==Description ==

This mutator reduces the speed players can move (and the height they can jump) by examining the players inventory for weapons and objects.  The rules are as follows:

* For each weapon the player is carrying the player's speed is reduced by 1%.
* For each full amount of ammo the player's speed is reduced by 1% (in 0.1% increments).
* Each item carried (flag, ball, etc) reduced the player's speed by 1%.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''ZxAnPhOrIaN:''' When carrying an item, you should have decreased mobility such as cant look all the way up and down.

'''Dezro:''' 1% is a bit low. Also, the ball shouldn't count since the ball carrier is rendered helpless anyway.

'''ZxAnPhOrIaN:''' No, the ball should count, cause it has mass!! Also, shields and adreniline should count

'''ZxAnPhOrIaN:''' Also, 1% is reasonable, cause if the player has 11 weapons, all ammo maxed out, and has the flag or ball, you will be walking VERY slow!!

'''EntropicLqd:''' I deliberately left out the adrenaline and shield.  Adrenaline because I prefer to pretend it doeasn't exist (and builds up within the biological system so has no apparent weight), and sheild because it's an energy sheild rather than a real item of equipment.  Including shield would be moderately compelling, but 1% every 50 points of shield seems a bit high to me.  I'm with Zxan on the speed changes.  I did originally think that 2% or 3% would be a reasonable weight but a slight difference in speed will make a massive difference to vulnerability so I set it at 1%.  It might sound low ... but you try playing with it against people.

'''MrFixit:''' Seems simple enough to me, I have a mute that makes your speed percent depend on your health.  What your talking about sounds good, and seems fair enough.

'''ZxAnPhOrIaN:''' &gt; Little stuff builds up sooooo fast!!!

'''Random Guest';'' &gt; I know for a fact Deus Ex (built on unreal tournament tech.) uses a similar system, except the slowdown only occurs when you are activley holding a heavy weapon. Might want to check it out if anyone is making this mod.

'''ellioT:''' &gt; I like this idea. I should imagen something like the flag should be inconvenient to carry so it should slow you down 2% but everything else is fine as 1%. Also you could reintroduce body amour and have each piece of amour slow you down 1%. You could also have super-heavy amour which slows you down more but protects you more.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Helmet</title>
    <id>1968</id>
    <revision>
      <id>4817</id>
      <timestamp>2006-01-26T23:19:41Z</timestamp>
      <contributor>
        <ip>Brig-cache-5.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003 &amp;ndash; Helmet (by &quot;The Twiggman&quot;)}}

==Description ==

Just finished playing some 2K3 and got a crazy idea. What if we could have a view from out of a helmet?

I'd say that would be neat. Would make things a little different.

Also I could even have filters to say detect movement or infa-red. Or have a light switch. So many ideas.

If you've ever played aliens vs. predator there are alot of filters that are in use in that game.

Could possibly use some of the same things.

Maybe even a new hud, or targeting systems on the hud. That would be mint, like a grid or auto zoom onto enemys and stuff. That would be pro. Auto targeting, lasers and stuff. I think we need a mirror to see behind you too, why not make one of them, or maybe make it a camera so that it looks a bit grainy like how the opponents faces show up on the side. Ya that would be pro.

==Features ==
* A View Through A Helmet
* Infa-Red
* Light Perhaps?
* Would Make Gameplay More Cyberish
* New Hud
* Grid Lines
* Auto Zoom
* Lasers
* Auto Targeting (Or Targeting Help Depending On Your Weapon)
* Camera To Look Behind

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

Sounds kinda weird in a VERY cool way

'''Enigmatic:''' I had a helmet in a now-abandoned mod I was working on.  It didn't have all the features that this Mod (mutator?) is looking for, but it could prove interesting.  Let me think on it.

'''Swifty:''' Has somebody being playing Metroid Prime by any chance? If not, you should. Brillinat game + interesting inspiration. Still cool idea ^.^</text>
    </revision>
    <revision>
      <id>4818</id>
      <timestamp>2005-01-27T16:13:11Z</timestamp>
      <contributor>
        <ip>68.156.48.98</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003 &amp;ndash; Helmet (by &quot;The Twiggman&quot;)}}

==Description ==

Just finished playing some 2K3 and got a crazy idea. What if we could have a view from out of a helmet?

I'd say that would be neat. Would make things a little different.

Also I could even have filters to say detect movement or infa-red. Or have a light switch. So many ideas.

If you've ever played aliens vs. predator there are alot of filters that are in use in that game.

Could possibly use some of the same things.

Maybe even a new hud, or targeting systems on the hud. That would be mint, like a grid or auto zoom onto enemys and stuff. That would be pro. Auto targeting, lasers and stuff. I think we need a mirror to see behind you too, why not make one of them, or maybe make it a camera so that it looks a bit grainy like how the opponents faces show up on the side. Ya that would be pro.

==Features ==
* A View Through A Helmet
* Infa-Red
* Light Perhaps?
* Would Make Gameplay More Cyberish
* New Hud
* Grid Lines
* Auto Zoom
* Lasers
* Auto Targeting (Or Targeting Help Depending On Your Weapon)
* Camera To Look Behind

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

Sounds kinda weird in a VERY cool way

'''Enigmatic:''' I had a helmet in a now-abandoned mod I was working on.  It didn't have all the features that this Mod (mutator?) is looking for, but it could prove interesting.  Let me think on it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Hoard</title>
    <id>1893</id>
    <revision>
      <id>4643</id>
      <timestamp>2003-11-17T14:00:44Z</timestamp>
      <contributor>
        <ip>Kagato</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hoard}}

==Description ==

The gametype itself originally has been implemented in Descent 3. It's basically a Death Match mode. The difference is: You don't get points for fragging people but for collecting &quot;orbs&quot; killed players drop and bringing them to a &quot;Hoard Base&quot;.

When a player is killed he drops all orbs he was carrying at that time. If the kill was not a suicide then the player drops an additional orb. The general formula for calculating the scores in Descent 3 was:

&lt;pre&gt;
        orbs² + orbs
score = ------------
              2
&lt;/pre&gt;

This means:
* 1 orb -&gt; 1 point
* 2 orbs -&gt; 3 points
* 5 orbs -&gt; 15 points
* 10 orbs -&gt; 55 points

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Wormbo:''' I already did this for UT (it's played on DOM maps), but I'm not sure whether I want to redo it for UT2k3.

'''EntropicLqd:'''  Sounds very much like the ''Headz'' mod for Quake.  You collect peoples heads after you've killed them and take them to a &quot;pyre&quot; somewhere on the level to score.  The scoring was calculated in an identical manner.  I thought about suggesting it - but did wonder if a team based version played on DD or CTF maps would work better (where you take the enemy heads back to your control point/flag to score).

'''DJPaul:'''   It's like that level on ''Diddi Kong Racing'' (N64), where you have to return the ballons to the castle - minus the killing, of course.

'''Will:''' I am working on this, now.

'''Mysterial:''' I already did something almost identical (except for a different scoring calculation) called [http://www.error691.com/mysterial/Greed/ Greed].

'''Will:''' Well bugger. I just got it pretty much finished, too. Just had to test it fully.

----

'''Kagato:''' I had an idea along these lines, but is probably too similar to deserve its own topic.

Rather than inspired by Descent, I was inspired by Sonic the Hedgehog. :)

A (large) number of tokens are spawned throughout the map (one option would be to replace adrenaline). There is a constant number of tokens in play. The goal is to pick up, and hold, as many tokens as you can. You score, for example, 1 point per second for every token you hold. If a player is killed, he drops all his tokens; if he is hit for X damage, he drops one. (If tokens land in a kill volume &amp;ndash; eg lava &amp;ndash; they'd have to respawn elsewhere.)

Or, if you want to be ''really'' nasty, a player's score is exactly how many tokens he holds. Games run to a time limit, and (a bit like musical chairs) the player holding the most tokens at timeout wins.</text>
    </revision>
    <revision>
      <id>4644</id>
      <timestamp>2003-03-06T13:38:16Z</timestamp>
      <contributor>
        <ip>Pc-62-30-88-234-tr.blueyonder.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hoard}}

==Description ==

The gametype itself originally has been implemented in Descent 3. It's basically a Death Match mode. The difference is: You don't get points for fragging people but for collecting &quot;orbs&quot; killed players drop and bringing them to a &quot;Hoard Base&quot;.

When a player is killed he drops all orbs he was carrying at that time. If the kill was not a suicide then the player drops an additional orb. The general formula for calculating the scores in Descent 3 was:

&lt;pre&gt;
        orbs² + orbs
score = ------------
              2
&lt;/pre&gt;

This means:
* 1 orb -&gt; 1 point
* 2 orbs -&gt; 3 points
* 5 orbs -&gt; 15 points
* 10 orbs -&gt; 55 points

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Wormbo:''' I already did this for UT (it's played on DOM maps), but I'm not sure whether I want to redo it for UT2k3.

'''EntropicLqd:'''  Sounds very much like the ''Headz'' mod for Quake.  You collect peoples heads after you've killed them and take them to a &quot;pyre&quot; somewhere on the level to score.  The scoring was calculated in an identical manner.  I thought about suggesting it - but did wonder if a team based version played on DD or CTF maps would work better (where you take the enemy heads back to your control point/flag to score).

'''DJPaul:'''   It's like that level on ''Diddi Kong Racing'' (N64), where you have to return the ballons to the castle - minus the killing, of course.

'''Will:''' I am working on this, now.

'''Mysterial:''' I already did something almost identical (except for a different scoring calculation) called [http://www.error691.com/mysterial/Greed/ Greed].

'''Will:''' Well bugger. I just got it pretty much finished, too. Just had to test it fully.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Hovercar</title>
    <id>1937</id>
    <revision>
      <id>4743</id>
      <timestamp>2003-06-14T04:11:58Z</timestamp>
      <contributor>
        <ip>UTGamers</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hovercars}}

==Description ==

UT2003 is supposed to be set after UT, right? In UT they had these cool hovercars flying around the city in the intro sequence and you even got to see them on the ramp in DM-StalwartXL. so why does the only vehicle we see in UT2 have wheels?

With the new KVehicle class surely only a little modification would be required to allow the player to drive a hovercar? I've thought of the following issues:
* Up/down would need to be controlled by cruch/jump.
* A new volume could be used to define the ''ceiling'' height for these vehicles or maybe they could only fly at a maximum height above the nearest geometry.
* A police vehicle might even have weapons on it
* instead of wheels maybe use a simple particle emmitter exhaust to indicate movement?

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

(If you want a basic vehicle without wheels, and with controlls, contact me on sneakeye_@hotmail.com)

==Discussion ==

'''Flashman:''' I'd me more than happy to do the meshes for the cars for this if someone would write the code?

'''ZxAnPhOrIaN:''' Will the player be able to get in and get out of the car??

'''Sett:'''Ya that always bothered me too, why 'dumbdown' the technology.  There is a UT1 map CTF-ArticFighterJets?2?3 that had flyable car meshes along with flyable jet meshes. And I (pimp) made CTF-Roadkill that has a car spawner- if you are going to have cars why not add traffic? hmmm ...GTA-UT

'''Trystan:''' More fuel efficient?  Easier to carry large amounts of weight?  There's a lot of reasons to have wheels, but removing them isn't too hard. 

'''ZxAnPhOrIaN:''' You created Roadkill?? I have that maP! (with many others, around 460 maps for UT1!!!! ;))

'''Daid303:''' I did a hover vehicle myself, the controlls are simple, crouch for up, and jump to get out, it falls down automatic when you don't do anything.

'''Sir_Brizz:''' You will have to edit it away from the HoverBike code that is in the game now. It is horrible. The thing drags on the ground more than it stays in the air!! How annoying! If you got the physics right, it would actually be cool, although AirFightUT type of play wouldn't really be that entertaining IMO.

'''VOLTARXX-7:''' YEAH, Daid303, I HAVE &quot;Roadkill&quot;, good level. WOULD YOU PLEASE SEND ME YOUR HOVER VEHICLE [ script,file or whatever] for a test drive? e-mail me ------ VOLTMAN2003@AOL.COM               THANKS

'''UTGamer at UTGamers.org:''' Anyone interested in the development of a &quot;Hovercar&quot; should stop by our Qjet 2003 page. http://www.utgamers.org/qjets_2003.htm. We need cool coders and will contribute resources to any project that flys over the 2003 battlefield. Thanks.

'''Foxpaw:''' I reformatted the two comments above this because the first was spread out and causing funny formatting due to whitespace at the beginning of the line, and because the second was not in the &quot;standard&quot; format for the comments/discussion section. Anyways, the person who wrote the above comment, I wanted to say that you may have trouble simply trying to attach existing weapons to your aircraft, as part of the firing is handled natively. I have an alternative weapon implementation that is backwards compatible that you can use, however. It can be affixed to anything and handles all of the timing, etc.. all you have to do is pass it a boolean variable to tell it whether the thing that controls it wishes to fire or not. You are welcome to it if you'd like. Post a message here if you'd like me to send the relevant classes.

UTGamer: Cool, sounds like the best way to implement the weapons. I am new to mod making. I will start small &amp; work my way up. If you can send the code to UTgamers@hotmail(NO Spam).com, that would be grate.</text>
    </revision>
    <revision>
      <id>4744</id>
      <timestamp>2003-06-12T10:15:12Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hovercars}}

==Description ==

UT2003 is supposed to be set after UT, right? In UT they had these cool hovercars flying around the city in the intro sequence and you even got to see them on the ramp in DM-StalwartXL. so why does the only vehicle we see in UT2 have wheels?

With the new KVehicle class surely only a little modification would be required to allow the player to drive a hovercar? I've thought of the following issues:
* Up/down would need to be controlled by cruch/jump.
* A new volume could be used to define the ''ceiling'' height for these vehicles or maybe they could only fly at a maximum height above the nearest geometry.
* A police vehicle might even have weapons on it
* instead of wheels maybe use a simple particle emmitter exhaust to indicate movement?

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

(If you want a basic vehicle without wheels, and with controlls, contact me on sneakeye_@hotmail.com)

==Discussion ==

'''Flashman:''' I'd me more than happy to do the meshes for the cars for this if someone would write the code?

'''ZxAnPhOrIaN:''' Will the player be able to get in and get out of the car??

'''Sett:'''Ya that always bothered me too, why 'dumbdown' the technology.  There is a UT1 map CTF-ArticFighterJets?2?3 that had flyable car meshes along with flyable jet meshes. And I (pimp) made CTF-Roadkill that has a car spawner- if you are going to have cars why not add traffic? hmmm ...GTA-UT

'''Trystan:''' More fuel efficient?  Easier to carry large amounts of weight?  There's a lot of reasons to have wheels, but removing them isn't too hard. 

'''ZxAnPhOrIaN:''' You created Roadkill?? I have that maP! (with many others, around 460 maps for UT1!!!! ;))

'''Daid303:''' I did a hover vehicle myself, the controlls are simple, crouch for up, and jump to get out, it falls down automatic when you don't do anything.

'''Sir_Brizz:''' You will have to edit it away from the HoverBike code that is in the game now. It is horrible. The thing drags on the ground more than it stays in the air!! How annoying! If you got the physics right, it would actually be cool, although AirFightUT type of play wouldn't really be that entertaining IMO.

'''VOLTARXX-7:''' YEAH, Daid303, I HAVE &quot;Roadkill&quot;, good level. WOULD YOU PLEASE SEND ME YOUR HOVER VEHICLE [ script,file or whatever] for a test drive? e-mail me ------ VOLTMAN2003@AOL.COM               THANKS

'''UTGamer at UTGamers.org:''' Anyone interested in the development of a &quot;Hovercar&quot; should stop by our Qjet 2003 page. http://www.utgamers.org/qjets_2003.htm. We need cool coders and will contribute resources to any project that flys over the 2003 battlefield. Thanks.

'''Foxpaw:''' I reformatted the two comments above this because the first was spread out and causing funny formatting due to whitespace at the beginning of the line, and because the second was not in the &quot;standard&quot; format for the comments/discussion section. Anyways, the person who wrote the above comment, I wanted to say that you may have trouble simply trying to attach existing weapons to your aircraft, as part of the firing is handled natively. I have an alternative weapon implementation that is backwards compatible that you can use, however. It can be affixed to anything and handles all of the timing, etc.. all you have to do is pass it a boolean variable to tell it whether the thing that controls it wishes to fire or not. You are welcome to it if you'd like. Post a message here if you'd like me to send the relevant classes.</text>
    </revision>
    <revision>
      <id>4745</id>
      <timestamp>2003-06-14T04:11:23Z</timestamp>
      <contributor>
        <ip>UTGamers</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hovercars}}

==Description ==

UT2003 is supposed to be set after UT, right? In UT they had these cool hovercars flying around the city in the intro sequence and you even got to see them on the ramp in DM-StalwartXL. so why does the only vehicle we see in UT2 have wheels?

With the new KVehicle class surely only a little modification would be required to allow the player to drive a hovercar? I've thought of the following issues:
* Up/down would need to be controlled by cruch/jump.
* A new volume could be used to define the ''ceiling'' height for these vehicles or maybe they could only fly at a maximum height above the nearest geometry.
* A police vehicle might even have weapons on it
* instead of wheels maybe use a simple particle emmitter exhaust to indicate movement?

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

(If you want a basic vehicle without wheels, and with controlls, contact me on sneakeye_@hotmail.com)

==Discussion ==

'''Flashman:''' I'd me more than happy to do the meshes for the cars for this if someone would write the code?

'''ZxAnPhOrIaN:''' Will the player be able to get in and get out of the car??

'''Sett:'''Ya that always bothered me too, why 'dumbdown' the technology.  There is a UT1 map CTF-ArticFighterJets?2?3 that had flyable car meshes along with flyable jet meshes. And I (pimp) made CTF-Roadkill that has a car spawner- if you are going to have cars why not add traffic? hmmm ...GTA-UT

'''Trystan:''' More fuel efficient?  Easier to carry large amounts of weight?  There's a lot of reasons to have wheels, but removing them isn't too hard. 

'''ZxAnPhOrIaN:''' You created Roadkill?? I have that maP! (with many others, around 460 maps for UT1!!!! ;))

'''Daid303:''' I did a hover vehicle myself, the controlls are simple, crouch for up, and jump to get out, it falls down automatic when you don't do anything.

'''Sir_Brizz:''' You will have to edit it away from the HoverBike code that is in the game now. It is horrible. The thing drags on the ground more than it stays in the air!! How annoying! If you got the physics right, it would actually be cool, although AirFightUT type of play wouldn't really be that entertaining IMO.

'''VOLTARXX-7:''' YEAH, Daid303, I HAVE &quot;Roadkill&quot;, good level. WOULD YOU PLEASE SEND ME YOUR HOVER VEHICLE [ script,file or whatever] for a test drive? e-mail me ------ VOLTMAN2003@AOL.COM               THANKS

'''UTGamer at UTGamers.org:''' Anyone interested in the development of a &quot;Hovercar&quot; should stop by our Qjet 2003 page. http://www.utgamers.org/qjets_2003.htm. We need cool coders and will contribute resources to any project that flys over the 2003 battlefield. Thanks.

'''Foxpaw:''' I reformatted the two comments above this because the first was spread out and causing funny formatting due to whitespace at the beginning of the line, and because the second was not in the &quot;standard&quot; format for the comments/discussion section. Anyways, the person who wrote the above comment, I wanted to say that you may have trouble simply trying to attach existing weapons to your aircraft, as part of the firing is handled natively. I have an alternative weapon implementation that is backwards compatible that you can use, however. It can be affixed to anything and handles all of the timing, etc.. all you have to do is pass it a boolean variable to tell it whether the thing that controls it wishes to fire or not. You are welcome to it if you'd like. Post a message here if you'd like me to send the relevant classes.

UTGamer: Cool, sounds like the best way to implement the weapons.

I am new to mod making. I will start small &amp; work my way up.

If you can send the code to UTgamers@hotmail(NO Spam).com, that would be grate.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/HyperspaceButton</title>
    <id>1871</id>
    <revision>
      <id>4592</id>
      <timestamp>2006-09-11T18:24:06Z</timestamp>
      <contributor>
        <ip>159.191.12.24</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hyperspace or death?  You'll not know till you try}}

==Description ==

This small mod allows the user to hyperspace to a randomly selected navigation point on the current map - possibly dying in the process.

The mod works by giving each player an inventory item that keeps track of how many hyperspaces the player has used since the last re-spawn.  The first hyperspace has a 20% chance of killing the player.  The chance of death increases by 5% every time the player uses the hyperspace button.

Once the hyperspace button is used it requires a few seconds (10 or 20 would seem sensible) to re-charge before it can be used again.  A small HUD indicator should display the hyperspace status (charging or ready - chance of death should not be displayed).

In CTF games players will drop the flag at the point they hyperspace.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  Is the rate at which the hyperspace function becomes more dangerous too high?

'''Mychaeel:'''  Sounds a bit like the Personal Transporter pickup in Quake to me.  (That's not a bad thing.)  Just that the Personal Teleporter is a regular pickup that allows you to translocate to a random, but ''safe'' spot in the map.

'''EntropicLqd:'''  Never played with that one - I just happened to be thinking about Asteroids for some reason unknown to me and remembered about the hyperspace feature.  Plagarism-tastic :)

'''ZxAnPhOrIaN:'''  In CTF, when you hyperspace, the flag should fly high in the air, or go in a random direction for 240 (5 yards) UU's. ;)

'''Puppeteer Nessus:''' This sounds pretty fun... I'll play around with this idea when I get home tonight.</text>
    </revision>
    <revision>
      <id>4593</id>
      <timestamp>2003-04-03T16:01:17Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Hyperspace or death?  You'll not know till you try}}

==Description ==

This small mod allows the user to hyperspace to a randomly selected navigation point on the current map - possibly dying in the process.

The mod works by giving each player an inventory item that keeps track of how many hyperspaces the player has used since the last re-spawn.  The first hyperspace has a 20% chance of killing the player.  The chance of death increases by 5% every time the player uses the hyperspace button.

Once the hyperspace button is used it requires a few seconds (10 or 20 would seem sensible) to re-charge before it can be used again.  A small HUD indicator should display the hyperspace status (charging or ready - chance of death should not be displayed).

In CTF games players will drop the flag at the point they hyperspace.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  Is the rate at which the hyperspace function becomes more dangerous too high?

'''Mychaeel:'''  Sounds a bit like the Personal Transporter pickup in Quake to me.  (That's not a bad thing.)  Just that the Personal Teleporter is a regular pickup that allows you to translocate to a random, but ''safe'' spot in the map.

'''EntropicLqd:'''  Never played with that one - I just happened to be thinking about Asteroids for some reason unknown to me and remembered about the hyperspace feature.  Plagarism-tastic :)

'''ZxAnPhOrIaN:'''  In CTF, when you hyperspace, the flag should fly high in the air, or go in a random direction for 240 (5 yards) UU's. ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/InfiniteAmmoCombo</title>
    <id>1999</id>
    <revision>
      <id>4887</id>
      <timestamp>2007-11-19T16:48:40Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Infinite Ammo Combo===

====The Idea====

I am trying to make an adrenaline combo for the rapidly dying UT2003. When activated, it will either return any ammo used instantly or stop ammo from being used in firing.

I have tried some thing out but I can't get it to work:

&lt;uscript&gt;
class InfinAmmoCombo extends Combo;

var xEmitter Effect;
var xEmitter Effect2;
var Ammunition LastAmmo;


function StartEffect(xPawn P)
{
    if (P.Role == ROLE_Authority)
    {
        Effect = Spawn(class'OffensiveEffect', P,, P.Location, P.Rotation);
        Effect2 = Spawn(class'RegenCrosses', P,, P.Location, P.Rotation);
    }
    LastAmmo = Pawn(Owner).Weapon.Ammo[0];
//    AmmoHeal(P);
    SetTimer(0.01, true);
    Timer();
}


//function AmmoHeal(xPawn P)
function Timer()
{
    local Inventory Inv;

    if (Pawn(Owner).Role == ROLE_Authority)
    {
        if( inv.IsA('Weapon') &amp;&amp; (!inv.IsA('TransLauncher')) &amp;&amp; (!inv.IsA('ShieldGun')) &amp;&amp; (!inv.IsA('ShieldGun')) &amp;&amp; (!inv.IsA('ShieldGun')) )
        {
            if (LastAmmo != Pawn(Owner).Weapon.Ammo[0])
            {
               Pawn(Owner).Weapon.Ammo[0] = LastAmmo;
               Log(&quot;Ammo is good&quot;);
            }
           LastAmmo = Pawn(Owner).Inventory.Ammo[0];
        }
    }
}

function StopEffect(xPawn P)
{
    if ( Effect != None )
        Effect.Destroy();
}

defaultproperties
{
    ExecMessage=&quot;Infinite Ammo! Go Berserk!!&quot;
	ComboAnnouncement=sound'AnnouncerMain.Berzerk'
    keys(0)=1
    keys(1)=1
    keys(2)=2
    keys(3)=2
}
&lt;/uscript&gt;

====The Problem====

I'm not too good with UnrealScript and would like some advice on this matter. I have tried looking at mods and mutators which regenerate ammo but they work on all ammo. I just want it on the current weapon. If it does compile, nothing happens. Any ideas?

====Comments====

'''T1:''' First of all, could you provide some of the errors UCC gives you? And why do you check the shieldgun thrice? And Maybe a Shieldgun(Inv) != none would be faster (not sure about this, some of the other wiki people would have to confirm this).

Oh wait, I think I just found your problem. Inv isn't being given any values. You have to say somewhere Inv=Pawn(Owner).Inventory; or something like that. I'll go check in the wiki.

'''ShadowRaven:''' I got rid of the multiple Shield Gun calls, I was going to replace them with redeemer and ion painer ammo after I got the ammo system working itself. Common errors are (aside from syntax) Unrecognized member &quot;Ammo&quot; in &quot;Inventory and Unrecognized member &quot;AmmoAmount&quot; in Weapon&quot; (AmmoAmount worked in the StartEffect function, variable scope is stoppping me from using it in Timer().

I know Ammo[0] isn't it as the array indicates number of fire modes.

I'm thinking to have to call each weapon seperately however that loses the mod compatability.

'''porkmanii:''' Ammunition objects (as in Weapon.Ammo[]) store the amount of ammo, and usually don't change throughout the lifetime of a weapon.  I'm not sure about UT2003, but in UT2004 Ammunition generally isn't used.  Weapons have a property called &quot;bNoAmmoInstances&quot; which, if true (the default value), disables Ammunition and uses AmmoCharge (var int AmmoCharge[2]) instead.  If you want the amount of ammo to remain constant, you may have to record the value returned by Weapon.AmmoAmount(mode), and add back some amount to keep it at that level every time it changes.

One other problem I can see is that if the player changes weapons, your code assigns the Ammunition from the previous weapon.  If you implement this as an Inventory item, you could detect when the player changes weapons - an OwnerEvent() call where EventName == 'ChangedWeapon'.  Alternatively you could watch the weapon's ammo class, resetting the &quot;LastAmmo&quot; every time the class changes.  This would also allow compatibility with weapons with multiple ammo types, like ChaosUT's Crossbow.

Pawn.Inventory refers to the first Inventory item in the Pawn's inventory chain.  Even if Ammo[] was declared in Inventory and not Weapon, why would you want to use Pawn.Inventory's Ammo[] property?

'''Mad:''' I managed to get this combo working the way you intended to, where the current weapon the player is holding is the only weapon with infinite ammo. The problem is, I managed to get this working in UT2004, so I don't know of any differences within the code between 2003 and 2004. 

The xPawn class has access to the current weapon being used by calling xPawn.Weapon. Within the weapon class contains an array of WeaponFire classes called FireModeClasses. The WeaponFire classes handle the amount of ammo being used for a particular weapon. Use the function GetFireMode to obtain access to the specific Weapon's WeaponFire and adjust the AmmoPerFire accordingly. Here is the code that I used to make this work.

&lt;uscript&gt;
class ComboUnlimitedAmmo extends Combo;

var int nAmmoPerFireOne;         //For primary ammo
var int nAmmoPerFireTwo;         //For seondary ammo

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     nAmmoPerFireOne = P.Weapon.GetFireMode(0).AmmoPerFire;
     nAmmoPerFireTwo = P.Weapon.GetFireMode(1).AmmoPerFire;
     P.Weapon.GetFireMode(0).AmmoPerFire = 0;
     P.Weapon.GetFireMode(1).AmmoPerFire = 0;
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     P.Weapon.GetFireMode(0).AmmoPerFire = nAmmoPerFireOne;
     P.Weapon.GetFireMode(1).AmmoPerFire = nAmmoPerFireTwo;
}

defaultproperties
{
     nAmmoPerFireOne = 1;
     nAmmoPerFireTwo = 1;
     Duration = 20;
     ExecMessage = &quot;Unlimited Ammo!&quot;
     keys[0] = 4;//CK_LEFT;
     keys[1] = 8;//CK_RIGHT;
     keys[2] = 4;//CK_LEFT;
     keys[3] = 8;//CK_RIGHT;
}
&lt;/uscript&gt;

The problem with the code is, once the combo is initiated, the current gun the player is holding will only have unlimited ammo. Also, the ammo count will decrement by one before going to &quot;infinite&quot; mode. These are both an easy fix, and I will update the code once I figure out how. I hope this helps anyone out.

'''Eliot:''' ForEach maybe can fix this i havent tested it though :p, anyway this will work for everybody ingame:/ anyway its good for a mutator then.

&lt;uscript&gt;
function StartEffect(xPawn P)
{
    local Weapon W;

    ForEach DynamicActors( Class'Weapon', W )
    {
      //nAmmoPerFireOne = W.GetFireMode(0).AmmoPerFire;
      //nAmmoPerFireTwo = W.GetFireMode(1).AmmoPerFire;
        W.GetFireMode(0).AmmoPerFire = 0;
        W.GetFireMode(1).AmmoPerFire = 0;
    }
}

function StopEffect(xPawn P)
{
    local Weapon W;

    ForEach DynamicActors( Class'Weapon', W )
    {
        W.GetFireMode(0).AmmoPerFire = W.GetFireMode(0).Default.AmmoPerFire;
        W.GetFireMode(1).AmmoPerFire = W.GetFireMode(1).Default.AmmoPerFire;
    }
}

defaultproperties
{
    Duration = 20;
    ExecMessage = &quot;Unlimited Ammo!&quot;
    keys[0] = 4;//CK_LEFT;
    keys[1] = 8;//CK_RIGHT;
    keys[2] = 4;//CK_LEFT;
    keys[3] = 8;//CK_RIGHT;
}
&lt;/uscript&gt;

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4888</id>
      <timestamp>2007-01-27T00:11:03Z</timestamp>
      <contributor>
        <ip>Eliot</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Infinite Ammo Combo===

====The Idea====

I am trying to make an adrenaline combo for the rapidly dying UT2003. When activated, it will either return any ammo used instantly or stop ammo from being used in firing.

I have tried some thing out but I can't get it to work:

&lt;uscript&gt;
class InfinAmmoCombo extends Combo;

var xEmitter Effect;
var xEmitter Effect2;
var Ammunition LastAmmo;


function StartEffect(xPawn P)
{
    if (P.Role == ROLE_Authority)
    {
        Effect = Spawn(class'OffensiveEffect', P,, P.Location, P.Rotation);
        Effect2 = Spawn(class'RegenCrosses', P,, P.Location, P.Rotation);
    }
    LastAmmo = Pawn(Owner).Weapon.Ammo[0];
//    AmmoHeal(P);
    SetTimer(0.01, true);
    Timer();
}


//function AmmoHeal(xPawn P)
function Timer()
{
    local Inventory Inv;

    if (Pawn(Owner).Role == ROLE_Authority)
    {
        if( inv.IsA('Weapon') &amp;&amp; (!inv.IsA('TransLauncher')) &amp;&amp; (!inv.IsA('ShieldGun')) &amp;&amp; (!inv.IsA('ShieldGun')) &amp;&amp; (!inv.IsA('ShieldGun')) )
        {
            if (LastAmmo != Pawn(Owner).Weapon.Ammo[0])
            {
               Pawn(Owner).Weapon.Ammo[0] = LastAmmo;
               Log(&quot;Ammo is good&quot;);
            }
           LastAmmo = Pawn(Owner).Inventory.Ammo[0];
        }
    }
}

function StopEffect(xPawn P)
{
    if ( Effect != None )
        Effect.Destroy();
}

defaultproperties
{
    ExecMessage=&quot;Infinite Ammo! Go Berserk!!&quot;
	ComboAnnouncement=sound'AnnouncerMain.Berzerk'
    keys(0)=1
    keys(1)=1
    keys(2)=2
    keys(3)=2
}
&lt;/uscript&gt;

====The Problem====

I'm not too good with UnrealScript and would like some advice on this matter. I have tried looking at mods and mutators which regenerate ammo but they work on all ammo. I just want it on the current weapon. If it does compile, nothing happens. Any ideas?

====Comments====

'''T1:''' First of all, could you provide some of the errors UCC gives you? And why do you check the shieldgun thrice? And Maybe a Shieldgun(Inv) != none would be faster (not sure about this, some of the other wiki people would have to confirm this).

Oh wait, I think I just found your problem. Inv isn't being given any values. You have to say somewhere Inv=Pawn(Owner).Inventory; or something like that. I'll go check in the wiki.

'''ShadowRaven:''' I got rid of the multiple Shield Gun calls, I was going to replace them with redeemer and ion painer ammo after I got the ammo system working itself. Common errors are (aside from syntax) Unrecognized member &quot;Ammo&quot; in &quot;Inventory and Unrecognized member &quot;AmmoAmount&quot; in Weapon&quot; (AmmoAmount worked in the StartEffect function, variable scope is stoppping me from using it in Timer().

I know Ammo[0] isn't it as the array indicates number of fire modes.

I'm thinking to have to call each weapon seperately however that loses the mod compatability.

'''porkmanii:''' Ammunition objects (as in Weapon.Ammo[]) store the amount of ammo, and usually don't change throughout the lifetime of a weapon.  I'm not sure about UT2003, but in UT2004 Ammunition generally isn't used.  Weapons have a property called &quot;bNoAmmoInstances&quot; which, if true (the default value), disables Ammunition and uses AmmoCharge (var int AmmoCharge[2]) instead.  If you want the amount of ammo to remain constant, you may have to record the value returned by Weapon.AmmoAmount(mode), and add back some amount to keep it at that level every time it changes.

One other problem I can see is that if the player changes weapons, your code assigns the Ammunition from the previous weapon.  If you implement this as an Inventory item, you could detect when the player changes weapons - an OwnerEvent() call where EventName == 'ChangedWeapon'.  Alternatively you could watch the weapon's ammo class, resetting the &quot;LastAmmo&quot; every time the class changes.  This would also allow compatibility with weapons with multiple ammo types, like ChaosUT's Crossbow.

Pawn.Inventory refers to the first Inventory item in the Pawn's inventory chain.  Even if Ammo[] was declared in Inventory and not Weapon, why would you want to use Pawn.Inventory's Ammo[] property?

'''Mad:''' I managed to get this combo working the way you intended to, where the current weapon the player is holding is the only weapon with infinite ammo. The problem is, I managed to get this working in UT2004, so I don't know of any differences within the code between 2003 and 2004. 

The xPawn class has access to the current weapon being used by calling xPawn.Weapon. Within the weapon class contains an array of WeaponFire classes called FireModeClasses. The WeaponFire classes handle the amount of ammo being used for a particular weapon. Use the function GetFireMode to obtain access to the specific Weapon's WeaponFire and adjust the AmmoPerFire accordingly. Here is the code that I used to make this work.

&lt;uscript&gt;
class ComboUnlimitedAmmo extends Combo;

var int nAmmoPerFireOne;         //For primary ammo
var int nAmmoPerFireTwo;         //For seondary ammo

/*
This function will get called when right combination is entered.
*/
function StartEffect(xPawn P)
{
     nAmmoPerFireOne = P.Weapon.GetFireMode(0).AmmoPerFire;
     nAmmoPerFireTwo = P.Weapon.GetFireMode(1).AmmoPerFire;
     P.Weapon.GetFireMode(0).AmmoPerFire = 0;
     P.Weapon.GetFireMode(1).AmmoPerFire = 0;
}


/*
This function gets called when adrenaline is all gone.
*/
function StopEffect(xPawn P)
{
     P.Weapon.GetFireMode(0).AmmoPerFire = nAmmoPerFireOne;
     P.Weapon.GetFireMode(1).AmmoPerFire = nAmmoPerFireTwo;
}

defaultproperties
{
     nAmmoPerFireOne = 1;
     nAmmoPerFireTwo = 1;
     Duration = 20;
     ExecMessage = &quot;Unlimited Ammo!&quot;
     keys[0] = 4;//CK_LEFT;
     keys[1] = 8;//CK_RIGHT;
     keys[2] = 4;//CK_LEFT;
     keys[3] = 8;//CK_RIGHT;
}
&lt;/uscript&gt;

The problem with the code is, once the combo is initiated, the current gun the player is holding will only have unlimited ammo. Also, the ammo count will decrement by one before going to &quot;infinite&quot; mode. These are both an easy fix, and I will update the code once I figure out how. I hope this helps anyone out.

'''Eliot:''' ForEach maybe can fix this i havent tested it though :p, anyway this will work for everybody ingame:/ anyway its good for a mutator then.

&lt;uscript&gt;
function StartEffect(xPawn P)
{
    local Weapon W;

    ForEach DynamicActors( Class'Weapon', W )
    {
      //nAmmoPerFireOne = W.GetFireMode(0).AmmoPerFire;
      //nAmmoPerFireTwo = W.GetFireMode(1).AmmoPerFire;
        W.GetFireMode(0).AmmoPerFire = 0;
        W.GetFireMode(1).AmmoPerFire = 0;
    }
}

function StopEffect(xPawn P)
{
    local Weapon W;

    ForEach DynamicActors( Class'Weapon', W )
    {
        W.GetFireMode(0).AmmoPerFire = W.GetFireMode(0).Default.AmmoPerFire;
        W.GetFireMode(1).AmmoPerFire = W.GetFireMode(1).Default.AmmoPerFire;
    }
}

defaultproperties
{
    Duration = 20;
    ExecMessage = &quot;Unlimited Ammo!&quot;
    keys[0] = 4;//CK_LEFT;
    keys[1] = 8;//CK_RIGHT;
    keys[2] = 4;//CK_LEFT;
    keys[3] = 8;//CK_RIGHT;
}
&lt;/uscript&gt;

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/InstaVsSniper</title>
    <id>1979</id>
    <revision>
      <id>4840</id>
      <timestamp>2004-02-12T10:50:12Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>rar - very nice.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT Classic (Other versions open for discussion)&amp;ndash; InstaVsSniper}}

==Description ==

This is a mutator that gives the Red team the Sniper Rifle with 999 ammo, and gives the Blue team the Enhanced Shock Rifle. All pick-ups are removed from the maps.

Sniper fans can play Sniper, but now they have a new opponent with their own weapons. This is more like real life wars. Instagibers can enjoy a new opponent as well. Sniper fans and Instagib fans have alot in common and clans of each persuasion can come together in this merging of their favorite Arena mutators.

Earlier version I made of this mod was determined to be fair gameplay by the testers. It is, however, biased to one or the other weapon depending on range of attack or how close of quarters the fight takes place in. Cool. Sounds like UT to me.

==Progress ==

This version is finished for UT Classic. Call me a slob if you wish, I am fed up with trying to cator to the AI for this mod. I'll suffice it to say that this mod has minimal bot support because once in a while they get stupid and don't know where to go. I suppose they'll look retarded and then die. Sounds good to me. I'll leave the idea page up because it can still be done for other games. Besides, this mod came from the wiki. Most of it happened right here.

&lt;uscript&gt;
/*============================================================================
InstaVsSniper
By Ch3z 
This mod was created almost entirely by information I found at UnrealWiki.
                                                  (http://wiki.beyondunreal.com/wiki/Home_Page)
A simple Arena style mutator to give Sniper Rifle to Red Team (with 999 ammo) and Enhanced Shock Rifle to Blue Team
In non-TeamGames everyone has both weapons. All pickups are gone.
=============================================================================
*/

class InstaVsSniper extends Mutator;

function AddMutator(Mutator M)
{
	if ( M.IsA('Arena') )
	{
		log(M$&quot; not allowed (Arena mutator not compatible with existing mutator, InstaVsSniper)&quot;);
		return; // Arena Muator not added.
	}
	Super.AddMutator(M); // Allow next mutator to load otherwise.
}

function PostBeginPlay()
{
	local actor Other;

// Get rid of all pickups here otherwise they are gone as player inventory as well, which looses our weapons.
   	 foreach AllActors( class 'Actor', Other )
   	{
		if( Other.IsA('Pickup') || Other.IsA('Pickupbase' ) || Other.IsA('Weapon') || Other.IsA('Ammo'))
		{
			if( Inventory(Other).MyMarker != None)
			{
           				Other.Destroy();
			}
		}
    	}

	Super.PostBeginPlay();
}

function bool AlwaysKeep(Actor Other) // Keep CheckReplacement from removing some stuff from map that loads..
{
	if ( Other.IsA('SniperRifle') || Other.IsA('SuperShockRifle') ) // keep our 2 weapons.
	{
			Weapon(Other).PickupAmmoCount = 999; // Otherwise SniperRifle only gets 8 loads.
			Weapon(Other).bCanThrow = false; // so weapons aren't dropped and left when player is killed.
			return true;
	}

	if ( Other.IsA('BulletBox') || Other.IsA('SuperShockCore')  ) // Keep our 2 weapons' ammo.
	{
			Ammo(Other).AmmoAmount = 999; // Probably didn't need to raise this, but don't matter.
			return true;
	}

	Super.AlwaysKeep(Other);  // So that Mutator class can allow next mutator to use AlwaysKeep function.
	return false;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant) // Get rid of some stuff from map that loads.
{
	

	if ( Other.IsA('Weapon') )
	{
				return false;
	}


	super.CheckReplacement(Other, bSuperRelevant);
	return true;
}

function bool bIsATeamGame()
{

// Called in ModifyPlayer() and used to give weapons reguardless of team for DeathMatch and LastManStanding
	if(Level != None &amp;&amp; Level.Game != None )
		return Level.Game.bTeamGame;
}

function ModifyPlayer(Pawn Other)
{

// If teamgame give weapons per team else give both weapons to all

	if ( Other.PlayerReplicationInfo != None)
	{ 
		if ( Other.PlayerReplicationInfo.Team == 0 ||  !bIsATeamGame())
			Super(DeathMatchPlus).GiveWeapon(Other, &quot;Botpack.SniperRifle&quot;);
		if ( Other.PlayerReplicationInfo.Team == 1 || !bIsATeamGame())
			Super(DeathMatchPlus).GiveWeapon(Other, &quot;Botpack.SuperShockRifle&quot;);
	}

	Super.ModifyPlayer(Other); // So that Mutator class can allow next mutator to use ModifyPlayer function
}

defaultproperties
{
}

&lt;/uscript&gt;

Please stop by the [[Legacy:Testing Lab|Testing Lab]] and try this out on my test server. Let me know there if you see any problems. Thanks!

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list (Specify Version). Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*[[Legacy:CH3Z|CH3Z]](UT Version)
*(name in link form)

==Discussion ==

'''Ch3z:''' This &quot;Mod Idea&quot; page is serving as kind of a lab for now. It may be that it should be done in a journal, but my journal is a mess right now. =P I plan to move the working parts to a more appropriate place when I can.

'''Ch3z:''' I have learned sooo much making this mod! I first made it with brute force and got it to work. Finally, I went about it properly and with eligance. It is very well done in my less than humble opinion (proud of myself). With some help from Wormbo and Daid303 in answering a question for me in BuF, I have this mod finished working compatibly and with out errors or warnings. I am releasing it now. It will first be available only at [http://www.ShooterSGL.com http://www.ShooterSGL.com] in the Chaptor1 forum. Chaptor1 and Allied Snipers at that ladder were the inspiration for this mod and tested it for me. Thanks everyone for the help and support.

'''Ch3z:''' This mod causes a Accessed None warning to be logged when a player leaves the game and a bot comes into replace him. The bot doesn't know where to go or some crap. I'm tired of trying to fix it. I'm releasing it as it is. If you don't like it, don't have bots in the game, ignore the warning, or figure out the fix and i'll release the fixed version giving you credit. I won't work on that issue anymore even if i'm given a suggestion for the fix. Only if proven and compiled proof is given. I'm done with it.

'''Ch3z:''' Released as is. http://www.fileplanet.com/files/130000/136411.shtml

'''EntropicLqd:''' Nice.  A related mod would be [[Legacy:Mod Ideas/TeamWeaponArena|Mod Ideas/TeamWeaponArena]] which is all but done.  I just need to write the release note and it's all done and dusted.</text>
    </revision>
    <revision>
      <id>4841</id>
      <timestamp>2004-02-12T10:24:01Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>released at fileplanet. noted. linked.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT Classic (Other versions open for discussion)&amp;ndash; InstaVsSniper}}

==Description ==

This is a mutator that gives the Red team the Sniper Rifle with 999 ammo, and gives the Blue team the Enhanced Shock Rifle. All pick-ups are removed from the maps.

Sniper fans can play Sniper, but now they have a new opponent with their own weapons. This is more like real life wars. Instagibers can enjoy a new opponent as well. Sniper fans and Instagib fans have alot in common and clans of each persuasion can come together in this merging of their favorite Arena mutators.

Earlier version I made of this mod was determined to be fair gameplay by the testers. It is, however, biased to one or the other weapon depending on range of attack or how close of quarters the fight takes place in. Cool. Sounds like UT to me.

==Progress ==

This version is finished for UT Classic. Call me a slob if you wish, I am fed up with trying to cator to the AI for this mod. I'll suffice it to say that this mod has minimal bot support because once in a while they get stupid and don't know where to go. I suppose they'll look retarded and then die. Sounds good to me. I'll leave the idea page up because it can still be done for other games. Besides, this mod came from the wiki. Most of it happened right here.

&lt;uscript&gt;
/*============================================================================
InstaVsSniper
By Ch3z 
This mod was created almost entirely by information I found at UnrealWiki.
                                                  (http://wiki.beyondunreal.com/wiki/Home_Page)
A simple Arena style mutator to give Sniper Rifle to Red Team (with 999 ammo) and Enhanced Shock Rifle to Blue Team
In non-TeamGames everyone has both weapons. All pickups are gone.
=============================================================================
*/

class InstaVsSniper extends Mutator;

function AddMutator(Mutator M)
{
	if ( M.IsA('Arena') )
	{
		log(M$&quot; not allowed (Arena mutator not compatible with existing mutator, InstaVsSniper)&quot;);
		return; // Arena Muator not added.
	}
	Super.AddMutator(M); // Allow next mutator to load otherwise.
}

function PostBeginPlay()
{
	local actor Other;

// Get rid of all pickups here otherwise they are gone as player inventory as well, which looses our weapons.
   	 foreach AllActors( class 'Actor', Other )
   	{
		if( Other.IsA('Pickup') || Other.IsA('Pickupbase' ) || Other.IsA('Weapon') || Other.IsA('Ammo'))
		{
			if( Inventory(Other).MyMarker != None)
			{
           				Other.Destroy();
			}
		}
    	}

	Super.PostBeginPlay();
}

function bool AlwaysKeep(Actor Other) // Keep CheckReplacement from removing some stuff from map that loads..
{
	if ( Other.IsA('SniperRifle') || Other.IsA('SuperShockRifle') ) // keep our 2 weapons.
	{
			Weapon(Other).PickupAmmoCount = 999; // Otherwise SniperRifle only gets 8 loads.
			Weapon(Other).bCanThrow = false; // so weapons aren't dropped and left when player is killed.
			return true;
	}

	if ( Other.IsA('BulletBox') || Other.IsA('SuperShockCore')  ) // Keep our 2 weapons' ammo.
	{
			Ammo(Other).AmmoAmount = 999; // Probably didn't need to raise this, but don't matter.
			return true;
	}

	Super.AlwaysKeep(Other);  // So that Mutator class can allow next mutator to use AlwaysKeep function.
	return false;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant) // Get rid of some stuff from map that loads.
{
	

	if ( Other.IsA('Weapon') )
	{
				return false;
	}


	super.CheckReplacement(Other, bSuperRelevant);
	return true;
}

function bool bIsATeamGame()
{

// Called in ModifyPlayer() and used to give weapons reguardless of team for DeathMatch and LastManStanding
	if(Level != None &amp;&amp; Level.Game != None )
		return Level.Game.bTeamGame;
}

function ModifyPlayer(Pawn Other)
{

// If teamgame give weapons per team else give both weapons to all

	if ( Other.PlayerReplicationInfo != None)
	{ 
		if ( Other.PlayerReplicationInfo.Team == 0 ||  !bIsATeamGame())
			Super(DeathMatchPlus).GiveWeapon(Other, &quot;Botpack.SniperRifle&quot;);
		if ( Other.PlayerReplicationInfo.Team == 1 || !bIsATeamGame())
			Super(DeathMatchPlus).GiveWeapon(Other, &quot;Botpack.SuperShockRifle&quot;);
	}

	Super.ModifyPlayer(Other); // So that Mutator class can allow next mutator to use ModifyPlayer function
}

defaultproperties
{
}

&lt;/uscript&gt;

Please stop by the [[Legacy:Testing Lab|Testing Lab]] and try this out on my test server. Let me know there if you see any problems. Thanks!

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list (Specify Version). Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*[[Legacy:CH3Z|CH3Z]](UT Version)
*(name in link form)

==Discussion ==

'''Ch3z:''' This &quot;Mod Idea&quot; page is serving as kind of a lab for now. It may be that it should be done in a journal, but my journal is a mess right now. =P I plan to move the working parts to a more appropriate place when I can.

'''Ch3z:''' I have learned sooo much making this mod! I first made it with brute force and got it to work. Finally, I went about it properly and with eligance. It is very well done in my less than humble opinion (proud of myself). With some help from Wormbo and Daid303 in answering a question for me in BuF, I have this mod finished working compatibly and with out errors or warnings. I am releasing it now. It will first be available only at [http://www.ShooterSGL.com http://www.ShooterSGL.com] in the Chaptor1 forum. Chaptor1 and Allied Snipers at that ladder were the inspiration for this mod and tested it for me. Thanks everyone for the help and support.

'''Ch3z:''' This mod causes a Accessed None warning to be logged when a player leaves the game and a bot comes into replace him. The bot doesn't know where to go or some crap. I'm tired of trying to fix it. I'm releasing it as it is. If you don't like it, don't have bots in the game, ignore the warning, or figure out the fix and i'll release the fixed version giving you credit. I won't work on that issue anymore even if i'm given a suggestion for the fix. Only if proven and compiled proof is given. I'm done with it.

'''Ch3z:''' Released as is. http://www.fileplanet.com/files/130000/136411.shtml</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Instagib N Grapple</title>
    <id>1873</id>
    <revision>
      <id>4597</id>
      <timestamp>2002-10-08T16:59:25Z</timestamp>
      <contributor>
        <ip>166.109.133.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Instagib and Grapple}}

==Description ==

One of the greatest things I ever did for Quake was combine the Threewave CTF code with the Offhand grappling hook code.  It was tremendous - way more fun than having the grappling hook as a separate weapon.  This mod takes the idea of a so called &quot;offhand&quot; grapple and applies it to the Instagib rifle's secondary fire (I mean - you don't have anything else to do with it).  This means that you'll be able to swing from the walls and ceilings like spiderman on acid.  The grapple will behave in a similar manner to the original - fly in a straight line until it hits something solid, and then lift the player up towards the end point of the grapple.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

DEVIL: Umm sounds just like quake 2 expert ctf.</text>
    </revision>
    <revision>
      <id>4598</id>
      <timestamp>2002-07-30T06:13:57Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Instagib and Grapple}}

==Description ==

One of the greatest things I ever did for Quake was combine the Threewave CTF code with the Offhand grappling hook code.  It was tremendous - way more fun than having the grappling hook as a separate weapon.  This mod takes the idea of a so called &quot;offhand&quot; grapple and applies it to the Instagib rifle's secondary fire (I mean - you don't have anything else to do with it).  This means that you'll be able to swing from the walls and ceilings like spiderman on acid.  The grapple will behave in a similar manner to the original - fly in a straight line until it hits something solid, and then lift the player up towards the end point of the grapple.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/InstrumentsOnly</title>
    <id>1890</id>
    <revision>
      <id>4637</id>
      <timestamp>2006-06-24T14:27:03Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Instruments Only - A spammer's heaven or an Instagib nightmare}}

==Description ==

This mod makes every player completely and uttlerly invisible &amp;ndash; and I ''do'' mean that.  No pansying around with transparent skins here - we are talking total see-throughness.  Proper invisible man invisibleness.  The main features are summarised below.
* Every player is non visible.
* Whenever a player uses a weapon (including the translocator) they become visible for 1 10th of a second (or longer if it's a charged weapon e.g. the player loads three rockets or charges their sheild gun).
* Every player is given a beeper that bleeps faster the closer they are to someone (mush the same way as the ''I'm going to die'' indicator from AvP's Marine).
* The HUD is modified to show players on a radar screen as blobs - but only those directly within the field of view.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  The beeper should probably change tone if you are in another players field of vision.  The description isn't complete really and could do with fleshing out a little but the basic idea is there.

'''ZxAnPhOrIaN:''' Why did you name this mod InstrumentsOnly?

'''EntropicLqd:'''  It's taken from the flying term where you can't see owt and have to rely completely on your flight instruments to tell you where you are and what's going on.

'''ZxAnPhOrIaN:''' I see...

'''Mychaeel:''' I believe there's an Unreal Tournament mutator (recently reviewed by ModSquad) which goes part of that way:  It hides players, but not their weapon.  I've also heard that UT2003's invisibility pickup works a bit like what you described &amp;ndash; when a player shoots, he/she becomes visible briefly.  The rest would be implementing something along the lines of the [http://forums.beyondunreal.com/showthread.php?threadid=93135 ScreenPad]...</text>
    </revision>
    <revision>
      <id>4638</id>
      <timestamp>2006-06-23T18:57:53Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>nevermind  (O_o)</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Instruments Only - A spammer's heaven or an Instagib nightmare}}

==Description ==

This mod makes every player completely and uttlerly invisible &amp;ndash; and I ''do'' mean that.  No pansying around with transparent skins here - we are talking total see-throughness.  Proper invisible man invisibleness.  The main features are summarised below.
* Every player is non visible.
* Whenever a player uses a weapon (including the translocator) they become visible for 1 10th of a second (or longer if it's a charged weapon e.g. the player loads three rockets or charges their sheild gun).
* Every player is given a beeper that bleeps faster the closer they are to someone (mush the same way as the ''I'm going to die'' indicator from AvP's Marine).
* The HUD is modified to show players on a radar screen as blobs - but only those directly within the field of view.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  The beeper should probably change tone if you are in another players field of vision.  The description isn't complete really and could do with fleshing out a little but the basic idea is there.

'''ZxAnPhOrIaN:''' Why did you name this mod InstrumentsOnly?

'''EntropicLqd:'''  It's taken from the flying term where you can't see owt and have to rely completely on your flight instruments to tell you where you are and what's going on.

'''ZxAnPhOrIaN:''' I see...

'''Mychaeel:''' I believe there's an Unreal Tournament mutator (recently reviewed by ModSquad) which goes part of that way:  It hides players, but not their weapon.  I've also heard that UT2003's invisibility pickup works a bit like what you described &amp;ndash; when a player shoots, he/she becomes visible briefly.  The rest would be implementing something along the lines of the [http://forums.beyondunreal.com/showthread.php?threadid=93135 ScreenPad]...
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Iris</title>
    <id>1966</id>
    <revision>
      <id>4812</id>
      <timestamp>2003-05-07T08:51:51Z</timestamp>
      <contributor>
        <ip>Jeeptrash</ip>
      </contributor>
      <comment>*autoexposure</comment>
      <text xml:space="preserve">

Making the gamma adjust up or down based on the value of a few pixels seems pretty straightforward, so I assume there's some good reason it's never done. The best I've seen so far is Giants, which is mostly big sun coronas.

Still, it seems simple enough: take a few pixels from different parts of the screen, average the brightness, and gradually turn the brightness up or down. Depending on how often you updated and how many spots you used you could make it pretty gradual and smooth.

Is therea simple way to grab the brightness of a single point? 

Can the gamma and brightness settings be changed from a mutator during play?

-'''jeeptrash'''-</text>
    </revision>
    <revision>
      <id>4813</id>
      <timestamp>2003-05-07T08:51:05Z</timestamp>
      <contributor>
        <ip>Jeeptrash</ip>
      </contributor>
      <comment>*autoexposure</comment>
      <text xml:space="preserve">==Iris==

Making the gamma adjust up or down based on the value of a few pixels seems pretty straightforward, so I assume there's some good reason it's never done. The best I've seen so far is Giants, which is mostly big sun coronas.

Still, it seems simple enough: take a few pixels from different parts of the screen, average the brightness, and gradually turn the brightness up or down. Depending on how often you updated and how many spots you used you could make it pretty gradual and smooth.

Is therea simple way to grab the brightness of a single point? 

Can the gamma and brightness settings be changed from a mutator during play?

'''Jeeptrash:'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Jedi</title>
    <id>1874</id>
    <revision>
      <id>4599</id>
      <timestamp>2008-02-08T08:24:23Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003 &amp;ndash; Jedi (by &quot;The Twiggman&quot;)}}

==Description ==

You cant have the new unreal engine without a light saber mod. But I've got Ideas and It aint just no replacing the melee weapon anymore. Were talking star wars in your face action. BTW I got this idea from just watching starwars.

==Features ==
* Should be like a role playing game style where you can upgrade your speed, jump height, attack power as you destroy others.
* You light saber should be your primary weapon and should have various different attacks like a slash, stab, spin attack etc.
* All other weapons are taken over with force powers which you gain as you kill the other most dominant player.
* There should also be a teamplay variation where it's like the good guys vs. the bad dark force guys.
* Maybe there can even be different sabers like the double light saber on one hand thing depending on your amount of kills.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Mychaeel:'''  Saber fighting in  ''Jedi Knight: Jedi Outcast'' is awesome.  Anything short of that will probably be a bit disappointing to users...

'''EntropicLqd:'''  Nice to see someone else dropping a new idea in here.  Might be time to rename the page from ''EntropicMods'' to something else (maybe ''LightbulbBox'') - just to emphasise the lack of ownership of the ideas described.  I always found the Sabre fighting in Jedi Knight a little random - they really should have disassociated the movement from the attacks.  It was good fun though :)

'''DJPaul:'''  LucasArts be litigious - if any one tries this, be sure to ask them first.

'''Jb:'''  Slighlty of topic. Forgive me. I was never happy with our SA (Sword Arena for CUT) mode. I think this would be perfect fit for UT2003. My idea was to do something very simular to the Jedi Night'S Duel mode. Chaos already has a big long bastard sword so I wanted to use that. I wanted to make a new verison of SA that pits people one-on-one with our bastard swords, kind of a RA with only swords and only one arean (AKA like the duel mode of Jedi Knight). Maybe give the sword power ups (flame, lightning, vampaire, ect)....

'''Vajuras:''' The GODZ Team threw around the idea of implementing sword fighting. I don't think we're going to be supporting the feature because of the level of committment it would take animators, etc to fully implement this. Anyway, it would be kewl to see someone do this sort of mod.</text>
    </revision>
    <revision>
      <id>4600</id>
      <timestamp>2008-02-08T02:56:40Z</timestamp>
      <contributor>
        <ip>Cpe-75-80-151-39.san.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">asdfghhjk</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Jet Set Tournament 2003</title>
    <id>1951</id>
    <revision>
      <id>4779</id>
      <timestamp>2003-02-09T00:45:16Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>*MY Thoughts on the mod idea..... (also added sub-topic comments at end)</comment>
      <text xml:space="preserve">====Mod Idea: Jet Set/ Jet Set Radio Future ====

Anyone else familiar with the games Jet Set Radio, Jet Grind Radio, or Jet Set Radio Future?  You basically zip around on inline skates, pulling tricks, grinding on rails, and spraying graffiti for points.  The sequel game, Jet Set Radio Future, introduced a feature best described as &quot;lock strafing&quot;.  When you face an enemy within a certain range, a cursor appears on them, and pressing a button causes your view to lock to them, so that skating forward makes you follow them, and skating sideways makes you circle them.  I'm imagining this would be no fun at all with instant-hit weapons, so it probably requires a weapon mod, also, to provide weapons that are short-range, have slow projectiles, or work only as melee weapons.  In particular, slow-moving projectiles could make very interesting dodging.  I'd also be interested in different degrees of conversion - from just a lock strafing mutator, with possibly also Deathmatch based on the JSRF &quot;Tagger's Tag&quot; mode, where you have to paint opponents at very close range from behind, up to possibly full conversion, with maps that have rails, graffiti tag points, and everything.  The last option has amusing visual possibilities - consider, say, Gorge, grinding down a rail on inline skates, doing flips and other stunts ;-)  I'm also nowhere near being able to tackle such a project now, but I'm just putting the idea out there to see what others think of it, and maybe I'll start looking at it more seriously when I decide my current project is &quot;done&quot;.

===Comments ===

'''MythOpus:''' HEy, I don't kno bout any1 else but, Nice idea, I myself haven't palyed but I've seen the reviews and heard a lot from mah friends and, yea, it would be an awesum Idea 4 a mod !  If u eva get round to doing it, I'm first in line 4 beta testing !</text>
    </revision>
    <revision>
      <id>4780</id>
      <timestamp>2003-02-08T20:11:41Z</timestamp>
      <contributor>
        <ip>CheshireCat</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Anyone else familiar with the games Jet Set Radio, Jet Grind Radio, or Jet Set Radio Future?  You basically zip around on inline skates, pulling tricks, grinding on rails, and spraying graffiti for points.  The sequel game, Jet Set Radio Future, introduced a feature best described as &quot;lock strafing&quot;.  When you face an enemy within a certain range, a cursor appears on them, and pressing a button causes your view to lock to them, so that skating forward makes you follow them, and skating sideways makes you circle them.  I'm imagining this would be no fun at all with instant-hit weapons, so it probably requires a weapon mod, also, to provide weapons that are short-range, have slow projectiles, or work only as melee weapons.  In particular, slow-moving projectiles could make very interesting dodging.  I'd also be interested in different degrees of conversion - from just a lock strafing mutator, with possibly also Deathmatch based on the JSRF &quot;Tagger's Tag&quot; mode, where you have to paint opponents at very close range from behind, up to possibly full conversion, with maps that have rails, graffiti tag points, and everything.  The last option has amusing visual possibilities - consider, say, Gorge, grinding down a rail on inline skates, doing flips and other stunts ;-)  I'm also nowhere near being able to tackle such a project now, but I'm just putting the idea out there to see what others think of it, and maybe I'll start looking at it more seriously when I decide my current project is &quot;done&quot;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/KarmaCrossfire</title>
    <id>1922</id>
    <revision>
      <id>4709</id>
      <timestamp>2006-04-06T22:21:25Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">===Concept ===

The general idea of this mod is to have 2 players in stationary cannon turrets firing at a Karma ball (or other object) to push it into the enemy's goal. There should be different weapons to keep it fun, think of what Redeemer explosions would do to that poor little pill... 

===Interested Coders / Contributors ===

Anyone like modeling balls? Erm.

* '''Luggage''' (it was my idea after all...)

===Comments ===

'''Luggage:''' This should be pretty easy to code, as it mostly exploits Karma Physics... now it only needs a gametype, a PlayerPawn or whatever it will be in the new engine, and AI. Oh, AI isn't gonna be easy.

'''EntropicLqd:''' Heh - it was this idea that spawned the [[Legacy:Mod Ideas/CrossfireFootball|Mod Ideas/CrossfireFootball]] concept.  I figured it would be more interesting that the one above - lol.

'''Luggage:''' You think so? Think, shootable weapon powerups... mind-twisting arenas full of obstacles... strafeable and heigth-adjustable turrets... a gay sports announcer... and of course beautiful skyboxes, erm. What about a round-based mode too? It would be just like Good Ole' Worms, har har

'''EntropicLqd:''' It does say the turrets are staionary in the description.  hee hee.  The CrossfireFootball page was one of the first things to get written up when the page was still EntropicMods.  I see someone else used to have it as a kid too.  I was thinking of doing an air hockey one as well but I'm not sure it would work on anything other than a LAN unless the pitches were made fairly large (which may make the game too difficult).</text>
    </revision>
    <revision>
      <id>4710</id>
      <timestamp>2006-04-06T21:06:45Z</timestamp>
      <contributor>
        <ip>Mail.belltel.ph</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">===Concept ===

The general idea of this mod is to have 2 players in stationary cannon turrets firing at a Karma ball (or other object) to push it into the enemy's goal. There should be different weapons to keep it fun, think of what Redeemer explosions would do to that poor little pill... 

===Interested Coders / Contributors ===

Anyone like modeling balls? Erm.

* '''Luggage''' (it was my idea after all...)

===Comments ===

'''Luggage:''' This should be pretty easy to code, as it mostly exploits Karma Physics... now it only needs a gametype, a PlayerPawn or whatever it will be in the new engine, and AI. Oh, AI isn't gonna be easy.

'''EntropicLqd:''' Heh - it was this idea that spawned the [[Legacy:Mod Ideas/CrossfireFootball|Mod Ideas/CrossfireFootball]] concept.  I figured it would be more interesting that the one above - lol.

'''Luggage:''' You think so? Think, shootable weapon powerups... mind-twisting arenas full of obstacles... strafeable and heigth-adjustable turrets... a gay sports announcer... and of course beautiful skyboxes, erm. What about a round-based mode too? It would be just like Good Ole' Worms, har har

'''EntropicLqd:''' It does say the turrets are staionary in the description.  hee hee.  The CrossfireFootball page was one of the first things to get written up when the page was still EntropicMods.  I see someone else used to have it as a kid too.  I was thinking of doing an air hockey one as well but I'm not sure it would work on anything other than a LAN unless the pitches were made fairly large (which may make the game too difficult).

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/KillingSpree</title>
    <id>1934</id>
    <revision>
      <id>4736</id>
      <timestamp>2006-01-23T16:43:35Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>variation idea</comment>
      <text xml:space="preserve">KillingSpree is a single player gametype where you stand in a long hallway and you can't move, you have unlimited ammo and you are invulnerable.

When the game starts bots come running your way (fireing and stuff to annoy you or something), and you have to kill as many as possible within X minutes, the bots you don't kill just disappear. There should always be X number of bots.

It's kind of similar to Duck Hunt or NaliGames.

Of course, there should be powerups like extra time or instant death, or what ever.

Maybe it's a good idea to create an online version of this to tracks stats, and a offline for practice.

==Discussion==

'''ZxAnPhOrIaN:''' Similar to NaliGames?

'''El Muerte TDS:''' Well it's a bit like Nali Challange, except that you can't die and can use any weapon with unlimited ammo. The goal is to shoot as good to get the best score.

'''Legal:''' I liked DuckHunt, maybe use something like this?
 You'll need to drag-and-drop it in your adressbar :( FuX0rz GeoCities
 www.geocities.com/aqqt/rubberduck.gif

'''ZxAnPhOrIaN:''' lol

'''Legal:''' ''(@ school)'' Just threw it togheter :p

'''El Muerte TDS:''' well actually the idea is to have Bots run and shoot to/at you. But a duck would make a nice &quot;easter egg&quot; :)

'''Legal:''' That's what I'll use it for ;)

'''Sweavo:''' why would the bots shoot at you if you're invulnerable?

'''MythOpus:''' The bots only understand the concept of &quot;there's my target, I have to kill him&quot;.  So, they'll keep trying to kill him and not realizing that he just won't die.

'''Sweavo:''' O I see.  Just that it's easier to have them shooting at you than to not have them shooting at you!  Actually, a neato variation could be if you only have infinite ammo on the assault rifle, and the bots all carried different weapons, so when you killed them they threw it like they do in the regular game.  You wouldn't be able to run to pick up the weapon but if you killed a bot that was close enough to you, you would pick it up and use that for a while until it ran out of ammo.</text>
    </revision>
    <revision>
      <id>4737</id>
      <timestamp>2006-01-21T18:34:26Z</timestamp>
      <contributor>
        <ip>64-110-209-244.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>response</comment>
      <text xml:space="preserve">KillingSpree is a single player gametype where you stand in a long hallway and you can't move, you have unlimited ammo and you are invulnerable.

When the game starts bots come running your way (fireing and stuff to annoy you or something), and you have to kill as many as possible within X minutes, the bots you don't kill just disappear. There should always be X number of bots.

It's kind of similar to Duck Hunt or NaliGames.

Of course, there should be powerups like extra time or instant death, or what ever.

Maybe it's a good idea to create an online version of this to tracks stats, and a offline for practice.

==Discussion==

'''ZxAnPhOrIaN:''' Similar to NaliGames?

'''El Muerte TDS:''' Well it's a bit like Nali Challange, except that you can't die and can use any weapon with unlimited ammo. The goal is to shoot as good to get the best score.

'''Legal:''' I liked DuckHunt, maybe use something like this?
 You'll need to drag-and-drop it in your adressbar :( FuX0rz GeoCities
 www.geocities.com/aqqt/rubberduck.gif

'''ZxAnPhOrIaN:''' lol

'''Legal:''' ''(@ school)'' Just threw it togheter :p

'''El Muerte TDS:''' well actually the idea is to have Bots run and shoot to/at you. But a duck would make a nice &quot;easter egg&quot; :)

'''Legal:''' That's what I'll use it for ;)

'''Sweavo:''' why would the bots shoot at you if you're invulnerable?

'''MythOpus:''' The bots only understand the concept of &quot;there's my target, I have to kill him&quot;.  So, they'll keep trying to kill him and not realizing that he just won't die.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Killstick</title>
    <id>1992</id>
    <revision>
      <id>4870</id>
      <timestamp>2005-08-24T08:50:02Z</timestamp>
      <contributor>
        <ip>Prospero</ip>
      </contributor>
      <minor/>
      <text xml:space="preserve">===NOTE:===

Currently in the process of a complete recode, will post once complete

==Description==

The Killstick is based off of a weapon used in the online comic [http://www.megatokyo.com Megatokyo].

==How it works==

Here's the basics: this weapon works much like the normal sniper rifle. however, when this weapon is fully charged, it consumes all ammo to create a huge explosion, simmilar to the ion cannnon. To charge the weapon you hold the trigger, pull trigger normally for normal shots

==Unreal Script Code==

I already have the majority of the code for this down.

===General Description===

This weapons combines code from at least 4 different weapons in UT2003: the zoom super shock rifle, the sniper rifle, the shield gun (charging), and the redeemer/ion cannon. I started by extending my main weapon class from zoom super shock rifle so the gun could zoom, this also allowed me to use the shock rifle beam code for the fire effect. I then started working on adding the charge function by looking at the code for the shield gun and grabbing bits of what i needed. I attempted to use the code from the shield gun for the charge effect, but things got weird (see code once it's up). I then looked at the sniper rilfe code and found what lines enabled headshots and copied those. Finally, i found the [[Legacy:Mod_Ideas/NukeRifles|Mod_Ideas/NukeRifles]] here and liked how he did the spawning of a dummy projectile to get the redeemer explosion, and i did the same.

===Killstick.uc===

&lt;uscript&gt;
//Created by Syntax_Error
class Killstick extends ZoomSuperShockRifle
config(user); //So weapon preference settings are stored alongside all the standard weapons.

simulated function float ChargeBar()  //this sets what the charge bar measures
{
	return FMin(1,FireMode[0].HoldTime/KillstickFire(FireMode[0]).MaxHoldTime);
}
defaultproperties
{
    ItemName=&quot;Killstick&quot; //The text you see when you switch to the weapon and in various other places.
    IconMaterial=Material'InterfaceContent.Hud.SkinA' //Texture where the icon to be show in the weapon bar is.
    IconCoords=(X1=322,Y1=372,X2=444,Y2=462) //Position of icon in that texture.

    //vars for zoom reticle
    innerArrowsX=42.000000
    innerArrowsY=42.000000
    ArrowColor=(R=255,A=255)
    TargetColor=(B=255,G=255,R=255,A=255)
    NoTargetColor=(B=200,G=200,R=200,A=255)
    FocusColor=(B=126,G=90,R=71,A=215)
    ChargeColor=(B=255,G=255,R=255,A=255)
    RechargeOrigin=(X=600.000000,Y=330.000000)
    RechargeSize=(X=10.000000,Y=-180.000000)

    bShowChargingBar=True //shows charge bar
    FireModeClass(0)=KillstickFire
    FireModeClass(1)=KillstickZoom
    DrawScale=0.4
    Mesh=mesh'mtWeapon.killstick' //What you see in 1st person.
    BobDamping=2.3 //How much the weapon moves about as you walk.

    PickupClass=class'KillstickPickup'
    EffectOffset=(X=100,Y=10,Z=7.5) //Where effects are drawn. Used for start location of InstantFire beam effects.

    //animations
    SelectAnim=&quot;Select&quot;
    PutDownAnim=&quot;PutDown&quot;
    DisplayFOV=60

    PlayerViewOffset=(X=-3,Y=6,Z=-3) //Position of the weapon in 1st person
    PlayerViewPivot=(Pitch=0,Roll=0,Yaw=0) //Rotation of the model in 1st person.
    UV2Texture=Material'XGameShaders.WeaponEnvShader' //What does this do?

    AttachmentClass=class'KillstickAttachment'//third person mesh

    SelectSound=Sound'WeaponSounds.LinkGun.SwitchToLinkGun'
    SelectForce=&quot;SwitchToLightningGun&quot; //The various 'Force' variables are for force feedback mice etc.

    AIRating=0.69 //How much bots want to use this weapon.
    CurrentRating=0.69

    //priority of weapon
    Priority=13
    DefaultPriority=13

    InventoryGroup=9 //Which slot the weapon occupies.
    GroupOffset=4 //This must be different to all other weapons that occupy the same InventoryGroup.
}
&lt;/uscript&gt;

===KillstickFire.uc===

&lt;uscript&gt;
//Created by Syntax_Error
//::TODO:: bigger beam on charged shot, adjust damage on charged shot
//:::::::: no double charge/flash effects


class KillstickFire extends ShockBeamFire;

var sound ChargeSound;
var Emitter ChargeEmitter;

/********this is the code i used for the charge effect*********
simulated function DestroyEffects() //destorys effects
{
    if (chargingemitter != None)
    {
        chargingemitter.Destroy();
    }
	Super.DestroyEffects();
}

simulated function InitEffects() //initalises effects
{
	if ( Level.NetMode != NM_DedicatedServer )
	{
		ChargingEmitter= Spawn(class'KillstickChargeEffect');
		//chargingemitter.mRegenPause = true; //::part of xEffects::
	}
    Super.InitEffects();
}


function DrawMuzzleFlash(Canvas Canvas) //draws and places charge effect
{

    if (ChargeEmitter != None &amp;&amp; HoldTime &gt; 0.0 &amp;&amp; !bNowWaiting)
    {
		ChargeEmitter.SetLocation( Weapon.GetEffectStart() );
        Canvas.DrawActor( ChargeEmitter, false, false, Weapon.DisplayFOV );
    }

    if (FlashEmitter != None)
    {
        FlashEmitter.SetLocation( Weapon.GetEffectStart() );
        if ( Weapon.WeaponCentered() )
 			FlashEmitter.SetRotation(Weapon.Instigator.GetViewRotation());
        else
			FlashEmitter.SetRotation(Weapon.Rotation);
        Canvas.DrawActor( FlashEmitter, false, false, Weapon.DisplayFOV );
    }

    if ( (Instigator.AmbientSound == ChargeSound)
		&amp;&amp; ((HoldTime &lt;= 0.0) || bNowWaiting) )
        Instigator.AmbientSound = None;

}
********************************************************************/
function PlayPreFire() //this execs when the trigger is pulled
{
    Weapon.LoopAnim('Charge', 1, 0); //loop charging animation until trigger is released
    weapon.PlayOwnedSound(ChargeSound, SLOT_Interact, TransientSoundVolume,,,, false); //plays charging sound
}

function DoFireEffect()
{
    local Vector StartTrace;
    local Rotator R, Aim;


    Instigator.MakeNoise(1.0);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Instigator.Location + Instigator.EyePosition();
    Aim = AdjustAim(StartTrace, AimError);
	R = rotator(vector(Aim) + VRand()*FRand()*Spread);
    DoTrace(StartTrace, R);
}

function DoTrace(Vector Start, Rotator Dir)
{
	local Vector X;

	X = vector(Dir);


	TracePart(Start,Start+X*TraceRange,X,Dir,Instigator);
}

function bool AllowMultiHit()
{
	return false;
}

function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
    local float dist;


    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        if ( !Other.bWorldGeometry )
        {
            Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType);
            HitNormal = Vect(0,0,0);
            if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; AllowMultiHit() )
				TracePart(HitLocation,End,X,Dir,Pawn(Other));
        }
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
    SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
    	//headshot check and damage def
    if(Other.GetClosestBone( HitLocation, X, dist, 'head', 8 ) == 'head')
        Other.TakeDamage(70 * 2, Instigator, HitLocation, Momentum*X, Class'DamTypeKillstickHeadShot');

    if( Instigator.bDeleteMe != true )
    {
        if(HoldTime&gt;=2.4)           //spawn the dummy if weapon is fully charged
        {
           Spawn(class'KillstickDummy',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);
           Weapon.Ammo[0].UseAmmo(50,true); //consumes all ammo if fully charged
        }
    }
}

function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShockBeamEffect Beam;

    if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
	else
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
    if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
    Beam.AimAt(HitLocation, HitNormal);

}

function PlayFiring()  //this execs when trigger is released
{
    //DestroyEffects(); //destroy charging effect
    Super.PlayFiring();
}

defaultproperties
{

    BeamEffectClass=Class'KillstickFireEffect'
    //FireSound=Sound'WeaponSounds.TAGRifle.IonCannonBlast'
    ChargeSound=Sound'WeaponSounds.TAGRifle.TAGFireB'
    FireForce=&quot;LightningGunFire&quot;
    PreFireAnim=&quot;charge&quot;
    bFireOnRelease=True  //don't fire untill trigger is released
    MaxHoldTime=2.5 // how long trigger must be held to fully charge

    TraceRange=17000 //Maximum range of the weapon.
    Momentum=1000 //How much the victim is pushed when hit.
    AmmoClass=class'KillstickAmmo' //ammo class call
    AmmoPerFire=1 //how much ammo used per shot
    DamageType=class'DamTypeKillstick' //damage type class call
    DamageMin=70 //same damage as sniper rifle
    DamageMax=70

    FireRate=1.800000//How fast it fires. same rate as sniper rifle
    BotRefireRate=1.8 //How fast bots should try to fire.
    AimError=800 //How accurate bots are.
    bPawnRapidFireAnim=false

    //These settings controll how your view shakes when you fire.
    ShakeOffsetMag=(X=-15.0,Y=0.0,Z=10.0)
    ShakeOffsetRate=(X=-4000.0,Y=0.0,Z=4000.0)
    ShakeOffsetTime=1.6
    ShakeRotMag=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotRate=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotTime=2

    FlashEmitterClass=Class'KillstickFlash1st' //mussle flash effect

}
&lt;/uscript&gt;

===KillstickDummy.uc===

&lt;uscript&gt;
//Created by Syntax_Error
//dummy projectile class for spawning the explosion
//borrowed lotsa code from the redemmer
class KillstickDummy extends Projectile;

var	RedeemerTrail SmokeTrail;

// camera shakes //
var() vector ShakeRotMag;           // how far to rot view
var() vector ShakeRotRate;          // how fast to rot view
var() float  ShakeRotTime;          // how much time to rot the instigator's view
var() vector ShakeOffsetMag;        // max view offset vertically
var() vector ShakeOffsetRate;       // how fast to offset view vertically
var() float  ShakeOffsetTime;       // how much time to offset view
var bool bExploded;

auto state InstantBoom //go immediatly to explosion state
{
Begin:
	BlowUp(Location);
}

/**************commented out, not used****************
simulated function Destroyed()
{
	if ( SmokeTrail != None )
		SmokeTrail.Destroy();
	Super.Destroyed();
}

simulated function PostBeginPlay()
{
	local vector Dir;

	if ( bDeleteMe || IsInState('Dying') )
		return;

	Dir = vector(Rotation);
	Velocity = speed * Dir;

	if ( Level.NetMode != NM_DedicatedServer)
	{
		SmokeTrail = Spawn(class'RedeemerTrail',self,,Location - 40 * Dir);
		SmokeTrail.SetBase(self);
	}
}

event bool EncroachingOn( actor Other )
{
	if ( Other.bWorldGeometry )
		return true;

	return false;
}
**************************************************/

simulated function ProcessTouch (Actor Other, Vector HitLocation)
{
	if ( Other != instigator )
		Explode(HitLocation,Vect(0,0,1));
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
	BlowUp(HitLocation);
}

simulated function PhysicsVolumeChange( PhysicsVolume Volume )
{
}

simulated function Landed( vector HitNormal )
{
	BlowUp(Location);
}

simulated function HitWall(vector HitNormal, actor Wall)
{
	BlowUp(Location);
}

function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
							Vector momentum, class&lt;DamageType&gt; damageType)
{
	if ( Damage &gt; 0 )
	{
		if ( InstigatedBy == None )
			BlowUp(Location);
		else
		{
	 		Spawn(class'SmallRedeemerExplosion');
		    SetCollision(false,false,false);
		    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
		    Destroy();
		}
	}
}

simulated event FellOutOfWorld(eKillZType KillType)
{
	BlowUp(Location);
}

function BlowUp(vector HitLocation)
{
    Spawn(class'NewIonEffect',,, HitLocation - 100 * Normal(Velocity), Rot(0,16384,0));
	MakeNoise(1.0);
	SetPhysics(PHYS_None);
	bHidden = true;
    GotoState('Dying');
}

state Dying
{
	function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
							Vector momentum, class&lt;DamageType&gt; damageType) {}

    function BeginState()
    {
		bHidden = true;
		SetPhysics(PHYS_None);
		SetCollision(false,false,false);
		if ( !bExploded )
		{
			Spawn(class'IonCore',,, Location, Rotation);
			ShakeView();
		}
		InitialState = 'Dying';
		if ( SmokeTrail != None )
			SmokeTrail.Destroy();
    }

    function ShakeView()
    {
        local Controller C;
        local PlayerController PC;
        local float Dist, Scale;

        for ( C=Level.ControllerList; C!=None; C=C.NextController )
        {
            PC = PlayerController(C);
            if ( PC != None &amp;&amp; PC.ViewTarget != None )
            {
                Dist = VSize(Location - PC.ViewTarget.Location);
                if ( Dist &lt; DamageRadius * 2.0)
                {
                    if (Dist &lt; DamageRadius)
                        Scale = 1.0;
                    else
                        Scale = (DamageRadius*2.0 - Dist) / (DamageRadius);
                    C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime);
                }
            }
        }
    }

Begin:
    PlaySound(sound'WeaponSounds.TAGRifle.IonCannonBlast');
    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
    Sleep(0.5);
    HurtRadius(Damage, DamageRadius*0.300, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.475, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.650, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.825, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*1.000, MyDamageType, MomentumTransfer, Location);
    Destroy();
}

defaultproperties
{
     ShakeRotMag=(Z=250.000000)
     ShakeRotRate=(Z=2500.000000)
     ShakeRotTime=6.000000
     ShakeOffsetMag=(Z=10.000000)
     ShakeOffsetRate=(Z=200.000000)
     ShakeOffsetTime=10.000000
     Speed=1000.000000
     MaxSpeed=1000.000000
     Damage=250.000000
     DamageRadius=1500.000000
     MomentumTransfer=200000.000000
     MyDamageType=Class'DamTypeKillstick'
     LightType=LT_Steady
     LightEffect=LE_QuadraticNonIncidence
     LightBrightness=255.000000
     LightRadius=6.000000
     LightHue=28
     //DrawType=DT_StaticMesh  //removed mesh
     //StaticMesh=StaticMesh'WeaponStaticMesh.RedeemerMissile'
     bDynamicLight=True
     bNetTemporary=False
     //AmbientSound=Sound'WeaponSounds.Misc.redeemer_flight'
     DrawScale=0.500000
     AmbientGlow=96
     bUnlit=False
     SoundRadius=100.000000
     SoundVolume=255
     TransientSoundVolume=1.000000
     TransientSoundRadius=5000.000000
     CollisionRadius=24.000000
     CollisionHeight=12.000000
     bProjTarget=True
     bFixedRotationDir=True
     RotationRate=(Roll=50000)
     DesiredRotation=(Roll=30000)
     ForceType=FT_DragAlong
     ForceRadius=100.000000
     ForceScale=5.000000
}
&lt;/uscript&gt;

==TODO==

-charging effect either will not display or will spawn in the wrong location until weapon is charged '''&lt;&amp;ndash; Experiment with PlayerOffset and SmallWeaponOffset to align the effect up with the weapon'''

-damage adjustment for ammo on charged shot not yet implimented-

-larger beam for charged shot (is this possible?) &amp;ndash;done, spawning larger beam now and in the right direction :D

-texturing on all meshes &amp;ndash;started texturing, going inda slow for now

----

'''Syntax_Error'''

http://www.devildogsoft.com

==Discussion==

'''EntropicLqd:''' Sounds very similar to [[Legacy:Mod Ideas/Charging Shock Rifle|Mod Ideas/Charging Shock Rifle]]

'''Syntax_Error:''' It is, except it doesn't auto charge, you must hold the trigger to charge, much like the shield gun

lemme restate the charge effect problem: when the effect initializes, it auto spawns on the weapon base, and only attaches to the weapon when it is charged... weird huh O_o

still have not had a chance to get to my own computer yet &gt;_&lt; it'll put the code up as soon as i get a chance

'''Syntax_Error:''' Yeay, code is up, this isnt everything, but it's a start. I'll put up individual pages as soon as i can.

'''Syntax_Error:''' Sorry for the long time away, doing taxes isnt much fun. looking for the Special DVD ed. of 2004 now, and will transfer all MOD stuff to it.

'''Syntax_Error:''' Holy #$&amp;^ it has been a long time since i update here. Major changes to code, and most of the problems have been fixed. only annoying one left is the whole double charge/mussleflash effect (i'll get a screen up to show you) planning on putting in reload so if u have 50 ammo you can fire multiple large blasts (just not quickly ;)) also starting up the dual shotgun weapon, suggestions for alt-fire are welcome.

'''Foxpaw:''' For a shotgun weapon, there's a couple of things that come to mind for a secondary fire. Basically, shotguns are neat because there is a variety of ammunition available for them. Their lack of rifling allows for much more flexible ammunition. Anyways, although it wouldn't be entirely realistic, you could have primary fire be one type of ammo, while secondary fire was the other. For instance, one could be slugs and the other buckshot. Or one could fire &quot;less lethal&quot; beanbag rounds that would slow down or otherwise hinder your opponent to set up for another (more lethal) shot. Flares would be somewhat less useful. Flechette rounds are available, but would behave similar to buckshot in-game (only better!) Incendiary rounds are available, though I'm not really sure what they're for. I think smaller slug-bearing sabots may also be available.

Also you could have one fire be semi-auto and the other pump-action. Select fire shotguns have more power in pump-action mode because in semi-auto mode a significant amount of the expanding powder gases are used to cycle the weapon, leaving less to propel the projectile.

Anyways, just thought I'd toss out some ideas. A good secondary fire is essential to prevent it from being just a tracefire flak cannon.

'''Syntax_Error:''' Thanks for the suggestions, I really like the semi-auto and pump-aciton idea. That should work well with what i had planned for dual wielding: where primary fire is a powerful double shot, and alt is rapid, alternating single shots. If you only have one shotgun, primary would be pump, while alt would be the less powerful semi-auto. Would the spead change for each one? To say it another way, which type is more accurate? FYI, once I get this started I'll put up a seperate wiki page, and maybe start a page for my info.

'''Foxpaw:''' Hmm, that's a tough question. Pump action would have higher chamber pressures which would give the buckshot more momentum leaving the barrel. That might cause it to stay on course more, making it have less spread. On the other hand, the faster moving pump-action buckshot would be less stable in flight due to it's higher velocity. One of these factors would likely outweigh the other - but I don't know which one.</text>
    </revision>
    <revision>
      <id>4871</id>
      <timestamp>2004-07-07T00:58:47Z</timestamp>
      <contributor>
        <ip>Syntax Error</ip>
      </contributor>
      <comment>Response to Foxpaws comments, recoding Killstick</comment>
      <text xml:space="preserve">===NOTE:===

Currently in the process of a complete recode, will post once complete

==Description==

The Killstick is based off of a weapon used in the online comic [http://www.megatokyo.com Megatokyo].

==How it works==

Here's the basics: this weapon works much like the normal sniper rifle. however, when this weapon is fully charged, it consumes all ammo to create a huge explosion, simmilar to the ion cannnon. To charge the weapon you hold the trigger, pull trigger normally for normal shots

==Unreal Script Code==

I already have the majority of the code for this down.

===General Description===

This weapons combines code from at least 4 different weapons in UT2003: the zoom super shock rifle, the sniper rifle, the shield gun (charging), and the redeemer/ion cannon. I strated by extending my main weapon class from zoom super shock rifle so the gun could zoom, this also allowed me to use the shock rifle beam code for the fire effect. I then started working on adding the charge function by looking at the code for the shield gun and grabbing bits of what i needed. I attempted to use the code from the shield gun for the charge effect, but things got weird (see code once it's up). I then looked at the sniper rilfe code and found what lines enabled headshots and copied those. Finally, i found the [[Legacy:Mod_Ideas/NukeRifles|Mod_Ideas/NukeRifles]] here and liked how he did the spawning of a dummy projectile to get the redeemer explosion, and i did the same.

===Killstick.uc===

&lt;uscript&gt;
//Created by Syntax_Error
class Killstick extends ZoomSuperShockRifle
config(user); //So weapon preference settings are stored alongside all the standard weapons.

simulated function float ChargeBar()  //this sets what the charge bar measures
{
	return FMin(1,FireMode[0].HoldTime/KillstickFire(FireMode[0]).MaxHoldTime);
}
defaultproperties
{
    ItemName=&quot;Killstick&quot; //The text you see when you switch to the weapon and in various other places.
    IconMaterial=Material'InterfaceContent.Hud.SkinA' //Texture where the icon to be show in the weapon bar is.
    IconCoords=(X1=322,Y1=372,X2=444,Y2=462) //Position of icon in that texture.

    //vars for zoom reticle
    innerArrowsX=42.000000
    innerArrowsY=42.000000
    ArrowColor=(R=255,A=255)
    TargetColor=(B=255,G=255,R=255,A=255)
    NoTargetColor=(B=200,G=200,R=200,A=255)
    FocusColor=(B=126,G=90,R=71,A=215)
    ChargeColor=(B=255,G=255,R=255,A=255)
    RechargeOrigin=(X=600.000000,Y=330.000000)
    RechargeSize=(X=10.000000,Y=-180.000000)

    bShowChargingBar=True //shows charge bar
    FireModeClass(0)=KillstickFire
    FireModeClass(1)=KillstickZoom
    DrawScale=0.4
    Mesh=mesh'mtWeapon.killstick' //What you see in 1st person.
    BobDamping=2.3 //How much the weapon moves about as you walk.

    PickupClass=class'KillstickPickup'
    EffectOffset=(X=100,Y=10,Z=7.5) //Where effects are drawn. Used for start location of InstantFire beam effects.

    //animations
    SelectAnim=&quot;Select&quot;
    PutDownAnim=&quot;PutDown&quot;
    DisplayFOV=60

    PlayerViewOffset=(X=-3,Y=6,Z=-3) //Position of the weapon in 1st person
    PlayerViewPivot=(Pitch=0,Roll=0,Yaw=0) //Rotation of the model in 1st person.
    UV2Texture=Material'XGameShaders.WeaponEnvShader' //What does this do?

    AttachmentClass=class'KillstickAttachment'//third person mesh

    SelectSound=Sound'WeaponSounds.LinkGun.SwitchToLinkGun'
    SelectForce=&quot;SwitchToLightningGun&quot; //The various 'Force' variables are for force feedback mice etc.

    AIRating=0.69 //How much bots want to use this weapon.
    CurrentRating=0.69

    //priority of weapon
    Priority=13
    DefaultPriority=13

    InventoryGroup=9 //Which slot the weapon occupies.
    GroupOffset=4 //This must be different to all other weapons that occupy the same InventoryGroup.
}
&lt;/uscript&gt;

===KillstickFire.uc===

&lt;uscript&gt;
//Created by Syntax_Error
//::TODO:: bigger beam on charged shot, adjust damage on charged shot
//:::::::: no double charge/flash effects


class KillstickFire extends ShockBeamFire;

var sound ChargeSound;
var Emitter ChargeEmitter;

/********this is the code i used for the charge effect*********
simulated function DestroyEffects() //destorys effects
{
    if (chargingemitter != None)
    {
        chargingemitter.Destroy();
    }
	Super.DestroyEffects();
}

simulated function InitEffects() //initalises effects
{
	if ( Level.NetMode != NM_DedicatedServer )
	{
		ChargingEmitter= Spawn(class'KillstickChargeEffect');
		//chargingemitter.mRegenPause = true; //::part of xEffects::
	}
    Super.InitEffects();
}


function DrawMuzzleFlash(Canvas Canvas) //draws and places charge effect
{

    if (ChargeEmitter != None &amp;&amp; HoldTime &gt; 0.0 &amp;&amp; !bNowWaiting)
    {
		ChargeEmitter.SetLocation( Weapon.GetEffectStart() );
        Canvas.DrawActor( ChargeEmitter, false, false, Weapon.DisplayFOV );
    }

    if (FlashEmitter != None)
    {
        FlashEmitter.SetLocation( Weapon.GetEffectStart() );
        if ( Weapon.WeaponCentered() )
 			FlashEmitter.SetRotation(Weapon.Instigator.GetViewRotation());
        else
			FlashEmitter.SetRotation(Weapon.Rotation);
        Canvas.DrawActor( FlashEmitter, false, false, Weapon.DisplayFOV );
    }

    if ( (Instigator.AmbientSound == ChargeSound)
		&amp;&amp; ((HoldTime &lt;= 0.0) || bNowWaiting) )
        Instigator.AmbientSound = None;

}
********************************************************************/
function PlayPreFire() //this execs when the trigger is pulled
{
    Weapon.LoopAnim('Charge', 1, 0); //loop charging animation until trigger is released
    weapon.PlayOwnedSound(ChargeSound, SLOT_Interact, TransientSoundVolume,,,, false); //plays charging sound
}

function DoFireEffect()
{
    local Vector StartTrace;
    local Rotator R, Aim;


    Instigator.MakeNoise(1.0);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Instigator.Location + Instigator.EyePosition();
    Aim = AdjustAim(StartTrace, AimError);
	R = rotator(vector(Aim) + VRand()*FRand()*Spread);
    DoTrace(StartTrace, R);
}

function DoTrace(Vector Start, Rotator Dir)
{
	local Vector X;

	X = vector(Dir);


	TracePart(Start,Start+X*TraceRange,X,Dir,Instigator);
}

function bool AllowMultiHit()
{
	return false;
}

function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
    local float dist;


    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        if ( !Other.bWorldGeometry )
        {
            Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType);
            HitNormal = Vect(0,0,0);
            if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; AllowMultiHit() )
				TracePart(HitLocation,End,X,Dir,Pawn(Other));
        }
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
    SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
    	//headshot check and damage def
    if(Other.GetClosestBone( HitLocation, X, dist, 'head', 8 ) == 'head')
        Other.TakeDamage(70 * 2, Instigator, HitLocation, Momentum*X, Class'DamTypeKillstickHeadShot');

    if( Instigator.bDeleteMe != true )
    {
        if(HoldTime&gt;=2.4)           //spawn the dummy if weapon is fully charged
        {
           Spawn(class'KillstickDummy',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);
           Weapon.Ammo[0].UseAmmo(50,true); //consumes all ammo if fully charged
        }
    }
}

function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShockBeamEffect Beam;

    if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
	else
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
    if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
    Beam.AimAt(HitLocation, HitNormal);

}

function PlayFiring()  //this execs when trigger is released
{
    //DestroyEffects(); //destroy charging effect
    Super.PlayFiring();
}

defaultproperties
{

    BeamEffectClass=Class'KillstickFireEffect'
    //FireSound=Sound'WeaponSounds.TAGRifle.IonCannonBlast'
    ChargeSound=Sound'WeaponSounds.TAGRifle.TAGFireB'
    FireForce=&quot;LightningGunFire&quot;
    PreFireAnim=&quot;charge&quot;
    bFireOnRelease=True  //don't fire untill trigger is released
    MaxHoldTime=2.5 // how long trigger must be held to fully charge

    TraceRange=17000 //Maximum range of the weapon.
    Momentum=1000 //How much the victim is pushed when hit.
    AmmoClass=class'KillstickAmmo' //ammo class call
    AmmoPerFire=1 //how much ammo used per shot
    DamageType=class'DamTypeKillstick' //damage type class call
    DamageMin=70 //same damage as sniper rifle
    DamageMax=70

    FireRate=1.800000//How fast it fires. same rate as sniper rifle
    BotRefireRate=1.8 //How fast bots should try to fire.
    AimError=800 //How accurate bots are.
    bPawnRapidFireAnim=false

    //These settings controll how your view shakes when you fire.
    ShakeOffsetMag=(X=-15.0,Y=0.0,Z=10.0)
    ShakeOffsetRate=(X=-4000.0,Y=0.0,Z=4000.0)
    ShakeOffsetTime=1.6
    ShakeRotMag=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotRate=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotTime=2

    FlashEmitterClass=Class'KillstickFlash1st' //mussle flash effect

}
&lt;/uscript&gt;

===KillstickDummy.uc===

&lt;uscript&gt;
//Created by Syntax_Error
//dummy projectile class for spawning the explosion
//borrowed lotsa code from the redemmer
class KillstickDummy extends Projectile;

var	RedeemerTrail SmokeTrail;

// camera shakes //
var() vector ShakeRotMag;           // how far to rot view
var() vector ShakeRotRate;          // how fast to rot view
var() float  ShakeRotTime;          // how much time to rot the instigator's view
var() vector ShakeOffsetMag;        // max view offset vertically
var() vector ShakeOffsetRate;       // how fast to offset view vertically
var() float  ShakeOffsetTime;       // how much time to offset view
var bool bExploded;

auto state InstantBoom //go immediatly to explosion state
{
Begin:
	BlowUp(Location);
}

/**************commented out, not used****************
simulated function Destroyed()
{
	if ( SmokeTrail != None )
		SmokeTrail.Destroy();
	Super.Destroyed();
}

simulated function PostBeginPlay()
{
	local vector Dir;

	if ( bDeleteMe || IsInState('Dying') )
		return;

	Dir = vector(Rotation);
	Velocity = speed * Dir;

	if ( Level.NetMode != NM_DedicatedServer)
	{
		SmokeTrail = Spawn(class'RedeemerTrail',self,,Location - 40 * Dir);
		SmokeTrail.SetBase(self);
	}
}

event bool EncroachingOn( actor Other )
{
	if ( Other.bWorldGeometry )
		return true;

	return false;
}
**************************************************/

simulated function ProcessTouch (Actor Other, Vector HitLocation)
{
	if ( Other != instigator )
		Explode(HitLocation,Vect(0,0,1));
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
	BlowUp(HitLocation);
}

simulated function PhysicsVolumeChange( PhysicsVolume Volume )
{
}

simulated function Landed( vector HitNormal )
{
	BlowUp(Location);
}

simulated function HitWall(vector HitNormal, actor Wall)
{
	BlowUp(Location);
}

function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
							Vector momentum, class&lt;DamageType&gt; damageType)
{
	if ( Damage &gt; 0 )
	{
		if ( InstigatedBy == None )
			BlowUp(Location);
		else
		{
	 		Spawn(class'SmallRedeemerExplosion');
		    SetCollision(false,false,false);
		    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
		    Destroy();
		}
	}
}

simulated event FellOutOfWorld(eKillZType KillType)
{
	BlowUp(Location);
}

function BlowUp(vector HitLocation)
{
    Spawn(class'NewIonEffect',,, HitLocation - 100 * Normal(Velocity), Rot(0,16384,0));
	MakeNoise(1.0);
	SetPhysics(PHYS_None);
	bHidden = true;
    GotoState('Dying');
}

state Dying
{
	function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
							Vector momentum, class&lt;DamageType&gt; damageType) {}

    function BeginState()
    {
		bHidden = true;
		SetPhysics(PHYS_None);
		SetCollision(false,false,false);
		if ( !bExploded )
		{
			Spawn(class'IonCore',,, Location, Rotation);
			ShakeView();
		}
		InitialState = 'Dying';
		if ( SmokeTrail != None )
			SmokeTrail.Destroy();
    }

    function ShakeView()
    {
        local Controller C;
        local PlayerController PC;
        local float Dist, Scale;

        for ( C=Level.ControllerList; C!=None; C=C.NextController )
        {
            PC = PlayerController(C);
            if ( PC != None &amp;&amp; PC.ViewTarget != None )
            {
                Dist = VSize(Location - PC.ViewTarget.Location);
                if ( Dist &lt; DamageRadius * 2.0)
                {
                    if (Dist &lt; DamageRadius)
                        Scale = 1.0;
                    else
                        Scale = (DamageRadius*2.0 - Dist) / (DamageRadius);
                    C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime);
                }
            }
        }
    }

Begin:
    PlaySound(sound'WeaponSounds.TAGRifle.IonCannonBlast');
    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
    Sleep(0.5);
    HurtRadius(Damage, DamageRadius*0.300, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.475, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.650, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.825, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*1.000, MyDamageType, MomentumTransfer, Location);
    Destroy();
}

defaultproperties
{
     ShakeRotMag=(Z=250.000000)
     ShakeRotRate=(Z=2500.000000)
     ShakeRotTime=6.000000
     ShakeOffsetMag=(Z=10.000000)
     ShakeOffsetRate=(Z=200.000000)
     ShakeOffsetTime=10.000000
     Speed=1000.000000
     MaxSpeed=1000.000000
     Damage=250.000000
     DamageRadius=1500.000000
     MomentumTransfer=200000.000000
     MyDamageType=Class'DamTypeKillstick'
     LightType=LT_Steady
     LightEffect=LE_QuadraticNonIncidence
     LightBrightness=255.000000
     LightRadius=6.000000
     LightHue=28
     //DrawType=DT_StaticMesh  //removed mesh
     //StaticMesh=StaticMesh'WeaponStaticMesh.RedeemerMissile'
     bDynamicLight=True
     bNetTemporary=False
     //AmbientSound=Sound'WeaponSounds.Misc.redeemer_flight'
     DrawScale=0.500000
     AmbientGlow=96
     bUnlit=False
     SoundRadius=100.000000
     SoundVolume=255
     TransientSoundVolume=1.000000
     TransientSoundRadius=5000.000000
     CollisionRadius=24.000000
     CollisionHeight=12.000000
     bProjTarget=True
     bFixedRotationDir=True
     RotationRate=(Roll=50000)
     DesiredRotation=(Roll=30000)
     ForceType=FT_DragAlong
     ForceRadius=100.000000
     ForceScale=5.000000
}
&lt;/uscript&gt;

==TODO==

-charging effect either will not display or will spawn in the wrong location until weapon is charged '''&lt;&amp;ndash; Experiment with PlayerOffset and SmallWeaponOffset to align the effect up with the weapon'''

-damage adjustment for ammo on charged shot not yet implimented-

-larger beam for charged shot (is this possible?) &amp;ndash;done, spawning larger beam now and in the right direction :D

-texturing on all meshes &amp;ndash;started texturing, going inda slow for now

----

'''Syntax_Error'''

http://www.devildogsoft.com

==Discussion==

'''EntropicLqd:''' Sounds very similar to [[Legacy:Mod Ideas/Charging Shock Rifle|Mod Ideas/Charging Shock Rifle]]

'''Syntax_Error:''' It is, except it doesn't auto charge, you must hold the trigger to charge, much like the shield gun

lemme restate the charge effect problem: when the effect initializes, it auto spawns on the weapon base, and only attaches to the weapon when it is charged... weird huh O_o

still have not had a chance to get to my own computer yet &gt;_&lt; it'll put the code up as soon as i get a chance

'''Syntax_Error:''' Yeay, code is up, this isnt everything, but it's a start. I'll put up individual pages as soon as i can.

'''Syntax_Error:''' Sorry for the long time away, doing taxes isnt much fun. looking for the Special DVD ed. of 2004 now, and will transfer all MOD stuff to it.

'''Syntax_Error:''' Holy #$&amp;^ it has been a long time since i update here. Major changes to code, and most of the problems have been fixed. only annoying one left is the whole double charge/mussleflash effect (i'll get a screen up to show you) planning on putting in reload so if u have 50 ammo you can fire multiple large blasts (just not quickly ;)) also starting up the dual shotgun weapon, suggestions for alt-fire are welcome.

'''Foxpaw:''' For a shotgun weapon, there's a couple of things that come to mind for a secondary fire. Basically, shotguns are neat because there is a variety of ammunition available for them. Their lack of rifling allows for much more flexible ammunition. Anyways, although it wouldn't be entirely realistic, you could have primary fire be one type of ammo, while secondary fire was the other. For instance, one could be slugs and the other buckshot. Or one could fire &quot;less lethal&quot; beanbag rounds that would slow down or otherwise hinder your opponent to set up for another (more lethal) shot. Flares would be somewhat less useful. Flechette rounds are available, but would behave similar to buckshot in-game (only better!) Incendiary rounds are available, though I'm not really sure what they're for. I think smaller slug-bearing sabots may also be available.

Also you could have one fire be semi-auto and the other pump-action. Select fire shotguns have more power in pump-action mode because in semi-auto mode a significant amount of the expanding powder gases are used to cycle the weapon, leaving less to propel the projectile.

Anyways, just thought I'd toss out some ideas. A good secondary fire is essential to prevent it from being just a tracefire flak cannon.

'''Syntax_Error:''' Thanks for the suggestions, I really like the semi-auto and pump-aciton idea. That should work well with what i had planned for dual wielding: where primary fire is a powerful double shot, and alt is rapid, alternating single shots. If you only have one shotgun, primary would be pump, while alt would be the less powerful semi-auto. Would the spead change for each one? To say it another way, which type is more accurate? FYI, once I get this started I'll put up a seperate wiki page, and maybe start a page for my info.</text>
    </revision>
    <revision>
      <id>4872</id>
      <timestamp>2004-07-07T02:29:11Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NOTE:===

Currently in the process of a complete recode, will post once complete

==Description==

The Killstick is based off of a weapon used in the online comic [http://www.megatokyo.com Megatokyo].

==How it works==

Here's the basics: this weapon works much like the normal sniper rifle. however, when this weapon is fully charged, it consumes all ammo to create a huge explosion, simmilar to the ion cannnon. To charge the weapon you hold the trigger, pull trigger normally for normal shots

==Unreal Script Code==

I already have the majority of the code for this down.

===General Description===

This weapons combines code from at least 4 different weapons in UT2003: the zoom super shock rifle, the sniper rifle, the shield gun (charging), and the redeemer/ion cannon. I strated by extending my main weapon class from zoom super shock rifle so the gun could zoom, this also allowed me to use the shock rifle beam code for the fire effect. I then started working on adding the charge function by looking at the code for the shield gun and grabbing bits of what i needed. I attempted to use the code from the shield gun for the charge effect, but things got weird (see code once it's up). I then looked at the sniper rilfe code and found what lines enabled headshots and copied those. Finally, i found the [[Legacy:Mod_Ideas/NukeRifles|Mod_Ideas/NukeRifles]] here and liked how he did the spawning of a dummy projectile to get the redeemer explosion, and i did the same.

===Killstick.uc===

&lt;uscript&gt;
//Created by Syntax_Error
class Killstick extends ZoomSuperShockRifle
config(user); //So weapon preference settings are stored alongside all the standard weapons.

simulated function float ChargeBar()  //this sets what the charge bar measures
{
	return FMin(1,FireMode[0].HoldTime/KillstickFire(FireMode[0]).MaxHoldTime);
}
defaultproperties
{
    ItemName=&quot;Killstick&quot; //The text you see when you switch to the weapon and in various other places.
    IconMaterial=Material'InterfaceContent.Hud.SkinA' //Texture where the icon to be show in the weapon bar is.
    IconCoords=(X1=322,Y1=372,X2=444,Y2=462) //Position of icon in that texture.

    //vars for zoom reticle
    innerArrowsX=42.000000
    innerArrowsY=42.000000
    ArrowColor=(R=255,A=255)
    TargetColor=(B=255,G=255,R=255,A=255)
    NoTargetColor=(B=200,G=200,R=200,A=255)
    FocusColor=(B=126,G=90,R=71,A=215)
    ChargeColor=(B=255,G=255,R=255,A=255)
    RechargeOrigin=(X=600.000000,Y=330.000000)
    RechargeSize=(X=10.000000,Y=-180.000000)

    bShowChargingBar=True //shows charge bar
    FireModeClass(0)=KillstickFire
    FireModeClass(1)=KillstickZoom
    DrawScale=0.4
    Mesh=mesh'mtWeapon.killstick' //What you see in 1st person.
    BobDamping=2.3 //How much the weapon moves about as you walk.

    PickupClass=class'KillstickPickup'
    EffectOffset=(X=100,Y=10,Z=7.5) //Where effects are drawn. Used for start location of InstantFire beam effects.

    //animations
    SelectAnim=&quot;Select&quot;
    PutDownAnim=&quot;PutDown&quot;
    DisplayFOV=60

    PlayerViewOffset=(X=-3,Y=6,Z=-3) //Position of the weapon in 1st person
    PlayerViewPivot=(Pitch=0,Roll=0,Yaw=0) //Rotation of the model in 1st person.
    UV2Texture=Material'XGameShaders.WeaponEnvShader' //What does this do?

    AttachmentClass=class'KillstickAttachment'//third person mesh

    SelectSound=Sound'WeaponSounds.LinkGun.SwitchToLinkGun'
    SelectForce=&quot;SwitchToLightningGun&quot; //The various 'Force' variables are for force feedback mice etc.

    AIRating=0.69 //How much bots want to use this weapon.
    CurrentRating=0.69

    //priority of weapon
    Priority=13
    DefaultPriority=13

    InventoryGroup=9 //Which slot the weapon occupies.
    GroupOffset=4 //This must be different to all other weapons that occupy the same InventoryGroup.
}
&lt;/uscript&gt;

===KillstickFire.uc===

&lt;uscript&gt;
//Created by Syntax_Error
//::TODO:: bigger beam on charged shot, adjust damage on charged shot
//:::::::: no double charge/flash effects


class KillstickFire extends ShockBeamFire;

var sound ChargeSound;
var Emitter ChargeEmitter;

/********this is the code i used for the charge effect*********
simulated function DestroyEffects() //destorys effects
{
    if (chargingemitter != None)
    {
        chargingemitter.Destroy();
    }
	Super.DestroyEffects();
}

simulated function InitEffects() //initalises effects
{
	if ( Level.NetMode != NM_DedicatedServer )
	{
		ChargingEmitter= Spawn(class'KillstickChargeEffect');
		//chargingemitter.mRegenPause = true; //::part of xEffects::
	}
    Super.InitEffects();
}


function DrawMuzzleFlash(Canvas Canvas) //draws and places charge effect
{

    if (ChargeEmitter != None &amp;&amp; HoldTime &gt; 0.0 &amp;&amp; !bNowWaiting)
    {
		ChargeEmitter.SetLocation( Weapon.GetEffectStart() );
        Canvas.DrawActor( ChargeEmitter, false, false, Weapon.DisplayFOV );
    }

    if (FlashEmitter != None)
    {
        FlashEmitter.SetLocation( Weapon.GetEffectStart() );
        if ( Weapon.WeaponCentered() )
 			FlashEmitter.SetRotation(Weapon.Instigator.GetViewRotation());
        else
			FlashEmitter.SetRotation(Weapon.Rotation);
        Canvas.DrawActor( FlashEmitter, false, false, Weapon.DisplayFOV );
    }

    if ( (Instigator.AmbientSound == ChargeSound)
		&amp;&amp; ((HoldTime &lt;= 0.0) || bNowWaiting) )
        Instigator.AmbientSound = None;

}
********************************************************************/
function PlayPreFire() //this execs when the trigger is pulled
{
    Weapon.LoopAnim('Charge', 1, 0); //loop charging animation until trigger is released
    weapon.PlayOwnedSound(ChargeSound, SLOT_Interact, TransientSoundVolume,,,, false); //plays charging sound
}

function DoFireEffect()
{
    local Vector StartTrace;
    local Rotator R, Aim;


    Instigator.MakeNoise(1.0);

    // the to-hit trace always starts right in front of the eye
    StartTrace = Instigator.Location + Instigator.EyePosition();
    Aim = AdjustAim(StartTrace, AimError);
	R = rotator(vector(Aim) + VRand()*FRand()*Spread);
    DoTrace(StartTrace, R);
}

function DoTrace(Vector Start, Rotator Dir)
{
	local Vector X;

	X = vector(Dir);


	TracePart(Start,Start+X*TraceRange,X,Dir,Instigator);
}

function bool AllowMultiHit()
{
	return false;
}

function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
    local float dist;


    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        if ( !Other.bWorldGeometry )
        {
            Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType);
            HitNormal = Vect(0,0,0);
            if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; AllowMultiHit() )
				TracePart(HitLocation,End,X,Dir,Pawn(Other));
        }
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
    SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
    	//headshot check and damage def
    if(Other.GetClosestBone( HitLocation, X, dist, 'head', 8 ) == 'head')
        Other.TakeDamage(70 * 2, Instigator, HitLocation, Momentum*X, Class'DamTypeKillstickHeadShot');

    if( Instigator.bDeleteMe != true )
    {
        if(HoldTime&gt;=2.4)           //spawn the dummy if weapon is fully charged
        {
           Spawn(class'KillstickDummy',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);
           Weapon.Ammo[0].UseAmmo(50,true); //consumes all ammo if fully charged
        }
    }
}

function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShockBeamEffect Beam;

    if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
	else
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
    if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
    Beam.AimAt(HitLocation, HitNormal);

}

function PlayFiring()  //this execs when trigger is released
{
    //DestroyEffects(); //destroy charging effect
    Super.PlayFiring();
}

defaultproperties
{

    BeamEffectClass=Class'KillstickFireEffect'
    //FireSound=Sound'WeaponSounds.TAGRifle.IonCannonBlast'
    ChargeSound=Sound'WeaponSounds.TAGRifle.TAGFireB'
    FireForce=&quot;LightningGunFire&quot;
    PreFireAnim=&quot;charge&quot;
    bFireOnRelease=True  //don't fire untill trigger is released
    MaxHoldTime=2.5 // how long trigger must be held to fully charge

    TraceRange=17000 //Maximum range of the weapon.
    Momentum=1000 //How much the victim is pushed when hit.
    AmmoClass=class'KillstickAmmo' //ammo class call
    AmmoPerFire=1 //how much ammo used per shot
    DamageType=class'DamTypeKillstick' //damage type class call
    DamageMin=70 //same damage as sniper rifle
    DamageMax=70

    FireRate=1.800000//How fast it fires. same rate as sniper rifle
    BotRefireRate=1.8 //How fast bots should try to fire.
    AimError=800 //How accurate bots are.
    bPawnRapidFireAnim=false

    //These settings controll how your view shakes when you fire.
    ShakeOffsetMag=(X=-15.0,Y=0.0,Z=10.0)
    ShakeOffsetRate=(X=-4000.0,Y=0.0,Z=4000.0)
    ShakeOffsetTime=1.6
    ShakeRotMag=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotRate=(X=0.0,Y=0.0,Z=0.0)
    ShakeRotTime=2

    FlashEmitterClass=Class'KillstickFlash1st' //mussle flash effect

}
&lt;/uscript&gt;

===KillstickDummy.uc===

&lt;uscript&gt;
//Created by Syntax_Error
//dummy projectile class for spawning the explosion
//borrowed lotsa code from the redemmer
class KillstickDummy extends Projectile;

var	RedeemerTrail SmokeTrail;

// camera shakes //
var() vector ShakeRotMag;           // how far to rot view
var() vector ShakeRotRate;          // how fast to rot view
var() float  ShakeRotTime;          // how much time to rot the instigator's view
var() vector ShakeOffsetMag;        // max view offset vertically
var() vector ShakeOffsetRate;       // how fast to offset view vertically
var() float  ShakeOffsetTime;       // how much time to offset view
var bool bExploded;

auto state InstantBoom //go immediatly to explosion state
{
Begin:
	BlowUp(Location);
}

/**************commented out, not used****************
simulated function Destroyed()
{
	if ( SmokeTrail != None )
		SmokeTrail.Destroy();
	Super.Destroyed();
}

simulated function PostBeginPlay()
{
	local vector Dir;

	if ( bDeleteMe || IsInState('Dying') )
		return;

	Dir = vector(Rotation);
	Velocity = speed * Dir;

	if ( Level.NetMode != NM_DedicatedServer)
	{
		SmokeTrail = Spawn(class'RedeemerTrail',self,,Location - 40 * Dir);
		SmokeTrail.SetBase(self);
	}
}

event bool EncroachingOn( actor Other )
{
	if ( Other.bWorldGeometry )
		return true;

	return false;
}
**************************************************/

simulated function ProcessTouch (Actor Other, Vector HitLocation)
{
	if ( Other != instigator )
		Explode(HitLocation,Vect(0,0,1));
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
	BlowUp(HitLocation);
}

simulated function PhysicsVolumeChange( PhysicsVolume Volume )
{
}

simulated function Landed( vector HitNormal )
{
	BlowUp(Location);
}

simulated function HitWall(vector HitNormal, actor Wall)
{
	BlowUp(Location);
}

function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
							Vector momentum, class&lt;DamageType&gt; damageType)
{
	if ( Damage &gt; 0 )
	{
		if ( InstigatedBy == None )
			BlowUp(Location);
		else
		{
	 		Spawn(class'SmallRedeemerExplosion');
		    SetCollision(false,false,false);
		    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
		    Destroy();
		}
	}
}

simulated event FellOutOfWorld(eKillZType KillType)
{
	BlowUp(Location);
}

function BlowUp(vector HitLocation)
{
    Spawn(class'NewIonEffect',,, HitLocation - 100 * Normal(Velocity), Rot(0,16384,0));
	MakeNoise(1.0);
	SetPhysics(PHYS_None);
	bHidden = true;
    GotoState('Dying');
}

state Dying
{
	function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation,
							Vector momentum, class&lt;DamageType&gt; damageType) {}

    function BeginState()
    {
		bHidden = true;
		SetPhysics(PHYS_None);
		SetCollision(false,false,false);
		if ( !bExploded )
		{
			Spawn(class'IonCore',,, Location, Rotation);
			ShakeView();
		}
		InitialState = 'Dying';
		if ( SmokeTrail != None )
			SmokeTrail.Destroy();
    }

    function ShakeView()
    {
        local Controller C;
        local PlayerController PC;
        local float Dist, Scale;

        for ( C=Level.ControllerList; C!=None; C=C.NextController )
        {
            PC = PlayerController(C);
            if ( PC != None &amp;&amp; PC.ViewTarget != None )
            {
                Dist = VSize(Location - PC.ViewTarget.Location);
                if ( Dist &lt; DamageRadius * 2.0)
                {
                    if (Dist &lt; DamageRadius)
                        Scale = 1.0;
                    else
                        Scale = (DamageRadius*2.0 - Dist) / (DamageRadius);
                    C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime);
                }
            }
        }
    }

Begin:
    PlaySound(sound'WeaponSounds.TAGRifle.IonCannonBlast');
    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
    Sleep(0.5);
    HurtRadius(Damage, DamageRadius*0.300, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.475, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.650, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.825, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*1.000, MyDamageType, MomentumTransfer, Location);
    Destroy();
}

defaultproperties
{
     ShakeRotMag=(Z=250.000000)
     ShakeRotRate=(Z=2500.000000)
     ShakeRotTime=6.000000
     ShakeOffsetMag=(Z=10.000000)
     ShakeOffsetRate=(Z=200.000000)
     ShakeOffsetTime=10.000000
     Speed=1000.000000
     MaxSpeed=1000.000000
     Damage=250.000000
     DamageRadius=1500.000000
     MomentumTransfer=200000.000000
     MyDamageType=Class'DamTypeKillstick'
     LightType=LT_Steady
     LightEffect=LE_QuadraticNonIncidence
     LightBrightness=255.000000
     LightRadius=6.000000
     LightHue=28
     //DrawType=DT_StaticMesh  //removed mesh
     //StaticMesh=StaticMesh'WeaponStaticMesh.RedeemerMissile'
     bDynamicLight=True
     bNetTemporary=False
     //AmbientSound=Sound'WeaponSounds.Misc.redeemer_flight'
     DrawScale=0.500000
     AmbientGlow=96
     bUnlit=False
     SoundRadius=100.000000
     SoundVolume=255
     TransientSoundVolume=1.000000
     TransientSoundRadius=5000.000000
     CollisionRadius=24.000000
     CollisionHeight=12.000000
     bProjTarget=True
     bFixedRotationDir=True
     RotationRate=(Roll=50000)
     DesiredRotation=(Roll=30000)
     ForceType=FT_DragAlong
     ForceRadius=100.000000
     ForceScale=5.000000
}
&lt;/uscript&gt;

==TODO==

-charging effect either will not display or will spawn in the wrong location until weapon is charged '''&lt;&amp;ndash; Experiment with PlayerOffset and SmallWeaponOffset to align the effect up with the weapon'''

-damage adjustment for ammo on charged shot not yet implimented-

-larger beam for charged shot (is this possible?) &amp;ndash;done, spawning larger beam now and in the right direction :D

-texturing on all meshes &amp;ndash;started texturing, going inda slow for now

----

'''Syntax_Error'''

http://www.devildogsoft.com

==Discussion==

'''EntropicLqd:''' Sounds very similar to [[Legacy:Mod Ideas/Charging Shock Rifle|Mod Ideas/Charging Shock Rifle]]

'''Syntax_Error:''' It is, except it doesn't auto charge, you must hold the trigger to charge, much like the shield gun

lemme restate the charge effect problem: when the effect initializes, it auto spawns on the weapon base, and only attaches to the weapon when it is charged... weird huh O_o

still have not had a chance to get to my own computer yet &gt;_&lt; it'll put the code up as soon as i get a chance

'''Syntax_Error:''' Yeay, code is up, this isnt everything, but it's a start. I'll put up individual pages as soon as i can.

'''Syntax_Error:''' Sorry for the long time away, doing taxes isnt much fun. looking for the Special DVD ed. of 2004 now, and will transfer all MOD stuff to it.

'''Syntax_Error:''' Holy #$&amp;^ it has been a long time since i update here. Major changes to code, and most of the problems have been fixed. only annoying one left is the whole double charge/mussleflash effect (i'll get a screen up to show you) planning on putting in reload so if u have 50 ammo you can fire multiple large blasts (just not quickly ;)) also starting up the dual shotgun weapon, suggestions for alt-fire are welcome.

'''Foxpaw:''' For a shotgun weapon, there's a couple of things that come to mind for a secondary fire. Basically, shotguns are neat because there is a variety of ammunition available for them. Their lack of rifling allows for much more flexible ammunition. Anyways, although it wouldn't be entirely realistic, you could have primary fire be one type of ammo, while secondary fire was the other. For instance, one could be slugs and the other buckshot. Or one could fire &quot;less lethal&quot; beanbag rounds that would slow down or otherwise hinder your opponent to set up for another (more lethal) shot. Flares would be somewhat less useful. Flechette rounds are available, but would behave similar to buckshot in-game (only better!) Incendiary rounds are available, though I'm not really sure what they're for. I think smaller slug-bearing sabots may also be available.

Also you could have one fire be semi-auto and the other pump-action. Select fire shotguns have more power in pump-action mode because in semi-auto mode a significant amount of the expanding powder gases are used to cycle the weapon, leaving less to propel the projectile.

Anyways, just thought I'd toss out some ideas. A good secondary fire is essential to prevent it from being just a tracefire flak cannon.

'''Syntax_Error:''' Thanks for the suggestions, I really like the semi-auto and pump-aciton idea. That should work well with what i had planned for dual wielding: where primary fire is a powerful double shot, and alt is rapid, alternating single shots. If you only have one shotgun, primary would be pump, while alt would be the less powerful semi-auto. Would the spead change for each one? To say it another way, which type is more accurate? FYI, once I get this started I'll put up a seperate wiki page, and maybe start a page for my info.

'''Foxpaw:''' Hmm, that's a tough question. Pump action would have higher chamber pressures which would give the buckshot more momentum leaving the barrel. That might cause it to stay on course more, making it have less spread. On the other hand, the faster moving pump-action buckshot would be less stable in flight due to it's higher velocity. One of these factors would likely outweigh the other - but I don't know which one.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Kinetic Rifle</title>
    <id>1984</id>
    <revision>
      <id>4851</id>
      <timestamp>2004-12-17T00:37:44Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT 2003 &amp;ndash; Kinetic Rifle}}

==Description ==

This is a simple idea, in which the shield gun's impact attack is modified to operate at range as well. Instead of dealing any significant damage, however, its primary purpose is to impart kinetic energy to the target &amp;ndash; that is, knock it flying. (Think of the gun used in Minority Report.)

The weapon is of little use by itself; however, it could be handy to knock opponents off high walkways; or away from pickups/flags/control points; or into lava/fans/lasers/etc. If you were really tricky, you could use it on teammates for assisted jumps.

The real purpose behind this mod is for use in conjunction with the ragdoll-on-impact mod discussed in [[Legacy:Karma Ragdoll|Karma Ragdoll]]. Hit an opponent with the kinetic rifle, and send him tumbling through the air; switch to a more lethal weapon to finish the job. (That, and it would be pretty funny to shove people down hills on terrain maps. :D)

'''Kagato:''' This seems like a pretty basic weapon mod, so I intend to use it as a learning exercise. Don't let that stop anyone else, of course :)

==Download ==

http://mkeen.pwp.blueyonder.co.uk/KineticRifle.zip

==Comments ==

'''RDGDanClark:''' That sounds like fun, you should definitely post your progress. I would suggest giving the shield gun (SG) a beam fire akin to the beam fire of the shock rifle. Once you do that, all you need to do to the SG is change the damage to zero and the momentum to something huge. If you check out the [http://www.masteringunreal.com 3D Buzz Video Tutorials], the simple mutator they do modifies the shock rifle into a concussion rifle &amp;ndash; by altering the momentum like we're talking about here. If you'd like some pointers in the right direction, post a request here or you can contact me via email (listed on my [[Legacy:RDGDanClark|RDGDanClark]] personal page).

'''GRAF1K:''' I had the exact same idea. Ask MeanFish if you don't believe me. :D

'''T1:''' well I did this a few days ago actually. I also increased the size of the sheild though because you're really vulnerable using the gun due to the fact you aren't actually killing people. it's kind of funny to mess up people's aim while they are in vehicles too.

'''Tony:''' Care to share this with us? It sounds like a lot of fun...

'''T1:''' Well I think I fixed all the minor bugs... If someone could point me to a site I could upload it to then I would...

'''Tony:''' Well, I got some webspace... and I'll be getting a load omore off a friend eventually. Email it to me at '''bigmadtony''' ''at'' '''hotmail''' ''dot'' '''com''' and I can host it.

'''T1:''' Alright. It'll need some mutator like WoRM (you can get that over at wod.beyondunreal.com) to place it into the game as I didn't write a mutator to do that. (I'll do that soon).

'''Tony:''' Wow. It's taken me too long. Oh well. Link's at the top. I guess it's free to edit with, but don't take my word for it.

'''T1:''' Heheheh, by now I have webspace of my own (but the download speeds are very slow). And I finally wrote a mutator.</text>
    </revision>
    <revision>
      <id>4852</id>
      <timestamp>2004-12-16T21:51:59Z</timestamp>
      <contributor>
        <ip>Tony</ip>
      </contributor>
      <comment>*Omg! Download link!</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT 2003 &amp;ndash; Kinetic Rifle}}

==Description ==

This is a simple idea, in which the shield gun's impact attack is modified to operate at range as well. Instead of dealing any significant damage, however, its primary purpose is to impart kinetic energy to the target &amp;ndash; that is, knock it flying. (Think of the gun used in Minority Report.)

The weapon is of little use by itself; however, it could be handy to knock opponents off high walkways; or away from pickups/flags/control points; or into lava/fans/lasers/etc. If you were really tricky, you could use it on teammates for assisted jumps.

The real purpose behind this mod is for use in conjunction with the ragdoll-on-impact mod discussed in [[Legacy:Karma Ragdoll|Karma Ragdoll]]. Hit an opponent with the kinetic rifle, and send him tumbling through the air; switch to a more lethal weapon to finish the job. (That, and it would be pretty funny to shove people down hills on terrain maps. :D)

'''Kagato:''' This seems like a pretty basic weapon mod, so I intend to use it as a learning exercise. Don't let that stop anyone else, of course :)

==Download ==

http://mkeen.pwp.blueyonder.co.uk/KineticRifle.zip

==Comments ==

'''RDGDanClark:''' That sounds like fun, you should definitely post your progress. I would suggest giving the shield gun (SG) a beam fire akin to the beam fire of the shock rifle. Once you do that, all you need to do to the SG is change the damage to zero and the momentum to something huge. If you check out the [http://www.masteringunreal.com 3D Buzz Video Tutorials], the simple mutator they do modifies the shock rifle into a concussion rifle &amp;ndash; by altering the momentum like we're talking about here. If you'd like some pointers in the right direction, post a request here or you can contact me via email (listed on my [[Legacy:RDGDanClark|RDGDanClark]] personal page).

'''GRAF1K:''' I had the exact same idea. Ask MeanFish if you don't believe me. :D

'''T1:''' well I did this a few days ago actually. I also increased the size of the sheild though because you're really vulnerable using the gun due to the fact you aren't actually killing people. it's kind of funny to mess up people's aim while they are in vehicles too.

'''Tony:''' Care to share this with us? It sounds like a lot of fun...

'''T1:''' Well I think I fixed all the minor bugs... If someone could point me to a site I could upload it to then I would...

'''Tony:''' Well, I got some webspace... and I'll be getting a load omore off a friend eventually. Email it to me at '''bigmadtony''' ''at'' '''hotmail''' ''dot'' '''com''' and I can host it.

'''T1:''' Alright. It'll need some mutator like WoRM (you can get that over at wod.beyondunreal.com) to place it into the game as I didn't write a mutator to do that. (I'll do that soon).

'''Tony:''' Wow. It's taken me too long. Oh well. Link's at the top. I guess it's free to edit with, but don't take my word for it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Lightning</title>
    <id>1942</id>
    <revision>
      <id>4756</id>
      <timestamp>2007-07-04T03:37:38Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Q For AlphaOne (if he still comes here :| )</comment>
      <text xml:space="preserve">==Description ==

This would be a volume, zone, or actor which random jolts of lightning come out of. They would strike at random bsp or static meshes at random points, until a player or projectiles show up. It will search for them and with an increased probability, strike the victim or projectile. If the player is in water, the volume, zone, or actor will have a greater probability to get struck (like in real life). It would be wise for the person to be around more complex geometry than less, to decrease the risk of being struck. It would look and sound like real lightning. It would also strike in random intervals and intensity.

====Interested Scripters ====

'''AlphaOne''' I will start this after the weekend is over.

==Discussion ==

'''ZxAnPhOrIaN:''' I hope that someone would code this before I finish my current map!

'''Zxanphorian:''' Good luck AlphaOne!!

'''MythOpus:''' Has this component been made AlphaOne?  If so perhaps you could add it to the Custom Class pages so this page can be deleted :)</text>
    </revision>
    <revision>
      <id>4757</id>
      <timestamp>2006-04-23T03:53:26Z</timestamp>
      <contributor>
        <ip>S01060011950d0c99.vw.shawcable.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

This would be a volume, zone, or actor which random jolts of lightning come out of. They would strike at random bsp or static meshes at random points, until a player or projectiles show up. It will search for them and with an increased probability, strike the victim or projectile. If the player is in water, the volume, zone, or actor will have a greater probability to get struck (like in real life). It would be wise for the person to be around more complex geometry than less, to decrease the risk of being struck. It would look and sound like real lightning. It would also strike in random intervals and intensity.

====Interested Scripters ====

'''AlphaOne''' I will start this after the weekend is over.

==Discussion ==

'''ZxAnPhOrIaN:''' I hope that someone would code this before I finish my current map!

'''Zxanphorian:''' Good luck AlphaOne!!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/LocalGravity</title>
    <id>2013</id>
    <revision>
      <id>4918</id>
      <timestamp>2005-06-11T23:34:00Z</timestamp>
      <contributor>
        <ip>C-24-34-41-6.hsd1.ma.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Moved from my Personal Projects page

==Local Gravity==

===The Idea===

The Idea is to allow mappers greater control of the gravity in the map, allowing people to walk on walls, around a planet, or in general whatever can make a level more fun.

===The Progress===

My progress thus far has been with editing the PlayerSpidering state of the Playercontroller, and here is most of my code thus far.

&lt;UScript&gt;

//=============================================================================

// GravPlayer.uc

//=============================================================================

class GravPlayer extends xPlayer;

var float MaxAcceleration, AccelerationDampening;

function Possess(Pawn aPawn)

{

	Super.Possess(aPawn);

	GoToState('PlayerSpidering');

}

state PlayerSpidering

{

function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot)

{

	local vector OldAccel;

	OldAccel = Pawn.Acceleration;

	if ( Pawn.Acceleration != NewAccel )

		Pawn.Acceleration = NewAccel;

	if ( bPressedJump )

		DoJump(bUpdating);

}

//Should put in the Pawn if possible, to eaise bot Implementation.

function bool DoJump( bool bUpdating )

{
  if ( !Pawn.bIsCrouched &amp;&amp; !Pawn.bWantsToCrouch &amp;&amp; Pawn.Physics == PHYS_Spider )
  {
    if ( Pawn.Role == ROLE_Authority )
    {
      if ( (Level.Game != None) &amp;&amp; (Level.Game.GameDifficulty &gt; 2) )
        MakeNoise(0.1 * Level.Game.GameDifficulty);
      if ( Pawn.bCountJumps &amp;&amp; (Pawn.Inventory != None) )
        Pawn.Inventory.OwnerEvent('Jumped');
    }
    if ( Pawn.Physics == PHYS_Spider )
      Pawn.Velocity += Pawn.JumpZ * Pawn.Floor;
     if ( (Pawn.Base != None) &amp;&amp; !Pawn.Base.bWorldGeometry )
      Pawn.Velocity.Z += Pawn.Base.Velocity.Z;

	   Pawn.PhysicsVolume.Gravity = vect(0,0,0);
    Pawn.SetPhysics(PHYS_Falling);
        return true;
  }
    return false;

}

function UpdateRotation(float DeltaTime, float maxPitch)

{
  local rotator ViewRotation;
  local vector MyFloor, CrossDir, FwdDir, OldFwdDir, OldX, RealFloor, PawnX, PawnZ;

  if ( bInterpolating || Pawn.bInterpolating )
  {
      ViewShake(deltaTime);
      return;
  }

  TurnTarget = None;
  bRotateToDesired = false;
  bSetTurnRot = false;

  if ( (Pawn.Base == None) || (Pawn.Floor == vect(0,0,0)) )
  {
    if(OldFloor == vect(0,0,0))
    OldFloor = vect(0,0,1);
    MyFloor = OldFloor;
  }
  else
      MyFloor = Pawn.Floor;

  if ( MyFloor != OldFloor )
  {
      // smoothly change floor
      RealFloor = MyFloor;
      MyFloor = Normal(6*DeltaTime * MyFloor + (1 - 6*DeltaTime) * OldFloor);
      if ( (RealFloor Dot MyFloor) &gt; 0.999 )
          MyFloor = RealFloor;
      else
      {
      // translate view direction
        CrossDir = Normal(RealFloor Cross OldFloor);
        FwdDir = CrossDir Cross MyFloor;
        OldFwdDir = CrossDir Cross OldFloor;
        ViewX = MyFloor * (OldFloor Dot ViewX)
              + CrossDir * (CrossDir Dot ViewX)
              + FwdDir * (OldFwdDir Dot ViewX);
        ViewX = Normal(ViewX);

        ViewZ = MyFloor * (OldFloor Dot ViewZ)
              + CrossDir * (CrossDir Dot ViewZ)
              + FwdDir * (OldFwdDir Dot ViewZ);
        ViewZ = Normal(ViewZ);
        OldFloor = MyFloor;
        ViewY = Normal(MyFloor Cross ViewX);
      }
  }

  //Moved here because it is already calculated here
  //Pawn.FaceRotation(OrthoRotation(ViewX,ViewY,ViewZ), deltaTime );

  if ( (aTurn != 0) || (aLookUp != 0) )
  {
    // adjust Yaw based on aTurn
    if ( aTurn != 0 )
        ViewX = Normal(ViewX +  ViewY * Sin(0.0031*DeltaTime*aTurn));

    // adjust Pitch based on aLookUp
    if ( aLookUp != 0 )
    {
        OldX = ViewX;
        ViewX = Normal(ViewX +  ViewZ * Sin(0.0031*DeltaTime*aLookUp));
        ViewZ = Normal(ViewX Cross ViewY);

        //bound max pitch
        //Redo this now
        /*if ( (ViewZ Dot MyFloor) &lt; 0.1   )
        {
            OldX = Normal(OldX - MyFloor * (MyFloor Dot OldX));
            if ( (ViewX Dot MyFloor) &gt; 0)
                ViewX = Normal(OldX + MyFloor);
            else
                ViewX = Normal(OldX - MyFloor);

            ViewZ = Normal(ViewX Cross ViewY);
        }*/
    }

    // calculate new Y axis
    ViewY = Normal(MyFloor Cross ViewX);
  }
  ViewRotation =  OrthoRotation(ViewX,ViewY,ViewZ);
  SetRotation(ViewRotation);
  ViewShake(deltaTime);
  ViewFlash(deltaTime);
  PawnX = Normal(ViewY Cross MyFloor);
  PawnZ = Normal(PawnX Cross ViewY);
  Pawn.FaceRotation(OrthoRotation(PawnX,ViewY,PawnZ), deltaTime );
  //Pawn.FaceRotation(ViewRotation, deltaTime );

}

function PlayerTick(float DeltaTime)

{

	local Vector HitLocation, HitNormal, X, Y, Z;

	local Actor HitActor;

	Super.PlayerTick(DeltaTime);

	GetAxes(Pawn.Rotation, X, Y, Z);

	if(Pawn.Physics == PHYS_Falling)

	{

	  if(VSize(Pawn.Acceleration) &gt; MaxAcceleration)

	   Pawn.Acceleration = Normal(Pawn.Acceleration) * MaxAcceleration;

	  else

	   Pawn.Acceleration *= AccelerationDampening;

	  Pawn.Acceleration += Z * Pawn.PhysicsVolume.default.Gravity.Z;

	  Pawn.Velocity += Pawn.Acceleration*DeltaTime;

	  //Pawn.Acceleration = vect(0,0,0);

	  //Change 70 to something less, static.
      HitActor = Trace(HitLocation, HitNormal, Pawn.Location+Normal(Pawn.Velocity)*100, Pawn.Location);
      if(HitActor != None &amp;&amp; HitActor.bWorldGeometry)
      {
        Log(&quot;Here2&quot;);
        Pawn.SetPhysics(PHYS_Spider);
        Pawn.SetBase(HitActor , HitNormal);
      }

	}

}

}

defaultproperties

{
  AccelerationDampening=0.1
  MaxAcceleration=200
  PawnClass=class'LocalGravity.GravPawn'

}

&lt;/UScript&gt;

ProcessMove is overridden to use a DoJump in this class, will probally get rid of this when I move that code back to the Pawn.

UpdateRotation is mostly the same as in PlayerController.uc, except for a bit of math, that being in the middle of the function, no real way I could reuse it without copying it.

Now, what I would like some suggestions on, are in my PlayerTick. the Trace that I am doing has a static number in there, I kinda need a better way, this will make you stick to soon when falling straight down, or not at all when falling too diagonal.

Ohh yes, and we want to be able to get it into our map. So, an Actor!

&lt;UScript&gt;

//=============================================================================

// LocalGravActor.uc

//=============================================================================

class LocalGravActor extends Actor
  placeable;

var() Class&lt;PlayerController&gt; PCClass;

var() string PlayerClassName;

function PreBeginPlay()

{
  Level.Game.PlayerControllerClass = PCClass;
  Level.Game.DefaultPlayerClassName = PlayerClassName;

}

defaultproperties

{
  PCClass=class'LocalGravity.GravPlayer'
  PlayerClassName=&quot;LocalGravity.GravPawn&quot;
  bHidden=true

}

&lt;/UScript&gt;

===To Do===

The most pressing matters are finding a better way to see if we should be on something then

&lt;UScript&gt;
      HitActor = Trace(HitLocation, HitNormal, Pawn.Location+Normal(Pawn.Velocity)*100, Pawn.Location);
      if(HitActor != None &amp;&amp; HitActor.bWorldGeometry)
&lt;/UScript&gt;

Then fix thirdperson camera, allow more flexibality when creating the level, and giving bots the same flexibility 

===Comments===

'''Glacian:''' I am working on a similar mod, maybe we could combine forces....muwahaha!  I fixed the bounded view angle problem by substituting in quaternion rotation, and I've coded up some modified gravity, doublejumping, and dodging code to work at any angle.  I stuck only on the problem of getting the physics to allow the pawn to walk on the wall, and phys_spidering has some behaviors I don't like.  If you (or anyone else) are interested, my email is focusgir (at) yahoo (dot) com.</text>
    </revision>
    <revision>
      <id>4919</id>
      <timestamp>2005-04-07T08:34:55Z</timestamp>
      <contributor>
        <ip>Arelius</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Moved from my Personal Projects page

==Local Gravity==

===The Idea===

The Idea is to allow mappers greater control of the gravity in the map, allowing people to walk on walls, around a planet, or in general whatever can make a level more fun.

===The Progress===

My progress thus far has been with editing the PlayerSpidering state of the Playercontroller, and here is most of my code thus far.

&lt;UScript&gt;

//=============================================================================

// GravPlayer.uc

//=============================================================================

class GravPlayer extends xPlayer;

var float MaxAcceleration, AccelerationDampening;

function Possess(Pawn aPawn)

{

	Super.Possess(aPawn);

	GoToState('PlayerSpidering');

}

state PlayerSpidering

{

function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot)

{

	local vector OldAccel;

	OldAccel = Pawn.Acceleration;

	if ( Pawn.Acceleration != NewAccel )

		Pawn.Acceleration = NewAccel;

	if ( bPressedJump )

		DoJump(bUpdating);

}

//Should put in the Pawn if possible, to eaise bot Implementation.

function bool DoJump( bool bUpdating )

{
  if ( !Pawn.bIsCrouched &amp;&amp; !Pawn.bWantsToCrouch &amp;&amp; Pawn.Physics == PHYS_Spider )
  {
    if ( Pawn.Role == ROLE_Authority )
    {
      if ( (Level.Game != None) &amp;&amp; (Level.Game.GameDifficulty &gt; 2) )
        MakeNoise(0.1 * Level.Game.GameDifficulty);
      if ( Pawn.bCountJumps &amp;&amp; (Pawn.Inventory != None) )
        Pawn.Inventory.OwnerEvent('Jumped');
    }
    if ( Pawn.Physics == PHYS_Spider )
      Pawn.Velocity += Pawn.JumpZ * Pawn.Floor;
     if ( (Pawn.Base != None) &amp;&amp; !Pawn.Base.bWorldGeometry )
      Pawn.Velocity.Z += Pawn.Base.Velocity.Z;

	   Pawn.PhysicsVolume.Gravity = vect(0,0,0);
    Pawn.SetPhysics(PHYS_Falling);
        return true;
  }
    return false;

}

function UpdateRotation(float DeltaTime, float maxPitch)

{
  local rotator ViewRotation;
  local vector MyFloor, CrossDir, FwdDir, OldFwdDir, OldX, RealFloor, PawnX, PawnZ;

  if ( bInterpolating || Pawn.bInterpolating )
  {
      ViewShake(deltaTime);
      return;
  }

  TurnTarget = None;
  bRotateToDesired = false;
  bSetTurnRot = false;

  if ( (Pawn.Base == None) || (Pawn.Floor == vect(0,0,0)) )
  {
    if(OldFloor == vect(0,0,0))
    OldFloor = vect(0,0,1);
    MyFloor = OldFloor;
  }
  else
      MyFloor = Pawn.Floor;

  if ( MyFloor != OldFloor )
  {
      // smoothly change floor
      RealFloor = MyFloor;
      MyFloor = Normal(6*DeltaTime * MyFloor + (1 - 6*DeltaTime) * OldFloor);
      if ( (RealFloor Dot MyFloor) &gt; 0.999 )
          MyFloor = RealFloor;
      else
      {
      // translate view direction
        CrossDir = Normal(RealFloor Cross OldFloor);
        FwdDir = CrossDir Cross MyFloor;
        OldFwdDir = CrossDir Cross OldFloor;
        ViewX = MyFloor * (OldFloor Dot ViewX)
              + CrossDir * (CrossDir Dot ViewX)
              + FwdDir * (OldFwdDir Dot ViewX);
        ViewX = Normal(ViewX);

        ViewZ = MyFloor * (OldFloor Dot ViewZ)
              + CrossDir * (CrossDir Dot ViewZ)
              + FwdDir * (OldFwdDir Dot ViewZ);
        ViewZ = Normal(ViewZ);
        OldFloor = MyFloor;
        ViewY = Normal(MyFloor Cross ViewX);
      }
  }

  //Moved here because it is already calculated here
  //Pawn.FaceRotation(OrthoRotation(ViewX,ViewY,ViewZ), deltaTime );

  if ( (aTurn != 0) || (aLookUp != 0) )
  {
    // adjust Yaw based on aTurn
    if ( aTurn != 0 )
        ViewX = Normal(ViewX +  ViewY * Sin(0.0031*DeltaTime*aTurn));

    // adjust Pitch based on aLookUp
    if ( aLookUp != 0 )
    {
        OldX = ViewX;
        ViewX = Normal(ViewX +  ViewZ * Sin(0.0031*DeltaTime*aLookUp));
        ViewZ = Normal(ViewX Cross ViewY);

        //bound max pitch
        //Redo this now
        /*if ( (ViewZ Dot MyFloor) &lt; 0.1   )
        {
            OldX = Normal(OldX - MyFloor * (MyFloor Dot OldX));
            if ( (ViewX Dot MyFloor) &gt; 0)
                ViewX = Normal(OldX + MyFloor);
            else
                ViewX = Normal(OldX - MyFloor);

            ViewZ = Normal(ViewX Cross ViewY);
        }*/
    }

    // calculate new Y axis
    ViewY = Normal(MyFloor Cross ViewX);
  }
  ViewRotation =  OrthoRotation(ViewX,ViewY,ViewZ);
  SetRotation(ViewRotation);
  ViewShake(deltaTime);
  ViewFlash(deltaTime);
  PawnX = Normal(ViewY Cross MyFloor);
  PawnZ = Normal(PawnX Cross ViewY);
  Pawn.FaceRotation(OrthoRotation(PawnX,ViewY,PawnZ), deltaTime );
  //Pawn.FaceRotation(ViewRotation, deltaTime );

}

function PlayerTick(float DeltaTime)

{

	local Vector HitLocation, HitNormal, X, Y, Z;

	local Actor HitActor;

	Super.PlayerTick(DeltaTime);

	GetAxes(Pawn.Rotation, X, Y, Z);

	if(Pawn.Physics == PHYS_Falling)

	{

	  if(VSize(Pawn.Acceleration) &gt; MaxAcceleration)

	   Pawn.Acceleration = Normal(Pawn.Acceleration) * MaxAcceleration;

	  else

	   Pawn.Acceleration *= AccelerationDampening;

	  Pawn.Acceleration += Z * Pawn.PhysicsVolume.default.Gravity.Z;

	  Pawn.Velocity += Pawn.Acceleration*DeltaTime;

	  //Pawn.Acceleration = vect(0,0,0);

	  //Change 70 to something less, static.
      HitActor = Trace(HitLocation, HitNormal, Pawn.Location+Normal(Pawn.Velocity)*100, Pawn.Location);
      if(HitActor != None &amp;&amp; HitActor.bWorldGeometry)
      {
        Log(&quot;Here2&quot;);
        Pawn.SetPhysics(PHYS_Spider);
        Pawn.SetBase(HitActor , HitNormal);
      }

	}

}

}

defaultproperties

{
  AccelerationDampening=0.1
  MaxAcceleration=200
  PawnClass=class'LocalGravity.GravPawn'

}

&lt;/UScript&gt;

ProcessMove is overridden to use a DoJump in this class, will probally get rid of this when I move that code back to the Pawn.

UpdateRotation is mostly the same as in PlayerController.uc, except for a bit of math, that being in the middle of the function, no real way I could reuse it without copying it.

Now, what I would like some suggestions on, are in my PlayerTick. the Trace that I am doing has a static number in there, I kinda need a better way, this will make you stick to soon when falling straight down, or not at all when falling too diagonal.

Ohh yes, and we want to be able to get it into our map. So, an Actor!

&lt;UScript&gt;

//=============================================================================

// LocalGravActor.uc

//=============================================================================

class LocalGravActor extends Actor
  placeable;

var() Class&lt;PlayerController&gt; PCClass;

var() string PlayerClassName;

function PreBeginPlay()

{
  Level.Game.PlayerControllerClass = PCClass;
  Level.Game.DefaultPlayerClassName = PlayerClassName;

}

defaultproperties

{
  PCClass=class'LocalGravity.GravPlayer'
  PlayerClassName=&quot;LocalGravity.GravPawn&quot;
  bHidden=true

}

&lt;/UScript&gt;

===To Do===

The most pressing matters are finding a better way to see if we should be on something then

&lt;UScript&gt;
      HitActor = Trace(HitLocation, HitNormal, Pawn.Location+Normal(Pawn.Velocity)*100, Pawn.Location);
      if(HitActor != None &amp;&amp; HitActor.bWorldGeometry)
&lt;/UScript&gt;

Then fix thirdperson camera, allow more flexibality when creating the level, and giving bots the same flexibility 

===Comments===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/LonelyFlag</title>
    <id>1875</id>
    <revision>
      <id>4601</id>
      <timestamp>2006-06-21T04:29:12Z</timestamp>
      <contributor>
        <ip>WhiteNinja</ip>
      </contributor>
      <comment>*new discussion</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; The Lonely Flag}}

==About Lonely Flag ==

Played on standard CTF maps two teams compete for a single flag.  The flag spawns either randomly on the map, or at randomly selected navigation points tagged with a specific value (indicating a single flag start point).  A team scores points by finding the flag and carrying it back to their flag base.  For every 5 seconds the flag is at a teams flag base they get one point.  The team with the most points at the end of the time limit (or first team to the score limit) wins.  This mod will not support extra time.

Since this map is a team game, players will be able to use any Capture the Flag, Domination, or Bombing Run map.  In the case of Domination, the A control point will be replaced by a flag base for the red team, and the B control point will be replaced by a flag base for the blue team.  When a Bombing Run map is played the scoring hoops are replaced by flag bases.  It is left as an exercise for the players to determine which maps play most effectively in this game mode.

It may be possible to support DM maps by determining the locations of two navigation points at the extreme east/west or north/south and spawning flag bases there.

The flag bases must be touched by the flag carrier to deposit the flag.  In some BR maps the flag carrier may have to shield-gun jump to touch the flag base as it may hover above the ground in a very realistic and close to reality way.

====Other Features ====
* A web front end, and in game menu for easy administration will be provided.
* Full bot support for the game type.
* Multiple flag skins, selected randomly whenever the flag spawns (if it gets dropped into a lava pool for example).  This is more for the variation than anything else.

====Game Settings ====

The following are the customisable aspects of the mod from within the game menu.
* Score time.  This option allows the amount of time a flag must be on its flag base to gain a point.  This can be set to any integer value from 1 to 30.  The value is in seconds.
* Carry the flag.  This option allows players to decide whether they will have to carry the flag back to their flag base, or whether the flag will be placed there instantly when they touch it.  This option will be turned on by default (it generally makes for more exciting games).

====Map Thoughts ====

From experience with UT, maps which have open centers and bases that are very hard to defend work best.  B3PullTheTriggerBaby is a map that works well.  Niven is not a map that works well - unless the team size is small 1 or 2.  Generally maps that work well have more than one entrance into the base and are of small to medium size.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''I'm not going to write a CTF mod that directly supports more than two teams.  It generally requires more players than is available and the maps become very large (and laggy in some places).  If I can get find a way of tweaking the bot AI suitably from a mutator I may be able to provide the single flag mod as a mutator - for those people dead set on producing a multi-team CTF mod.

One oddity about single flag games is that it inherently copes better with smaller team sizes than a normal capture the flag.  As a general rule the entire team is either defending or attacking meaning everyone is involved in the action all of the time.  This is the one mod that I ''really'' want to write for UT.  In my opinion this was the most successful feature of the CTF+ mod I wrote (although I know people that disagree).

'''EntropcLqd:'''  I've dumped the extra-time option.  There really is no point in having extra time unless the score time is set to a large value and neither team can score.  In this case it should be a draw.  It also means that you don't wind up playing a map for an eternity with no team being able to get the advantage.

I may also drop the ''extra skins'' feature.  Not because it's hard to implement (under UT it's a snap) but becasue it will increase the download size needlessly.  It would be nice to be able to support additional textures though - just not held as part of the mod.

'''EntropicLqd:''' An interesting variation of this game type may be to use Bombing Run as the base and have the players hold the ball at their control-point, flag-base, scoring-hoop to score.  That way the ball could be thrown between players.  Personally, I think the BR maps will be too big.

'''EntropicLqd:''' I have come to the conclusion that I don't actually like the UT2003 game to want to write this mod anymore.  If anyone else wants to do it that's fine by me.  I'll maybe work on something else.

'''Daid303:''' We've added a One flag mode in our Ultimate survival mod (UT2003 http://mods.moddb.com/919/ ) it turned out quite nice not as advanced, with all those options here, but it works.

'''Mr.bob:''' LonelyFlag, aka steal the bacon.

'''WhiteNinja:''' Unfortunately I am new to a lot of this and I just found this page.  I have been working on a Hold the Flag gametype which is close to this.  I will post a link as soon as I am done.</text>
    </revision>
    <revision>
      <id>4602</id>
      <timestamp>2004-07-07T15:56:49Z</timestamp>
      <contributor>
        <ip>Alb-66-65-239-188.nycap.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; The Lonely Flag}}

==About Lonely Flag ==

Played on standard CTF maps two teams compete for a single flag.  The flag spawns either randomly on the map, or at randomly selected navigation points tagged with a specific value (indicating a single flag start point).  A team scores points by finding the flag and carrying it back to their flag base.  For every 5 seconds the flag is at a teams flag base they get one point.  The team with the most points at the end of the time limit (or first team to the score limit) wins.  This mod will not support extra time.

Since this map is a team game, players will be able to use any Capture the Flag, Domination, or Bombing Run map.  In the case of Domination, the A control point will be replaced by a flag base for the red team, and the B control point will be replaced by a flag base for the blue team.  When a Bombing Run map is played the scoring hoops are replaced by flag bases.  It is left as an exercise for the players to determine which maps play most effectively in this game mode.

It may be possible to support DM maps by determining the locations of two navigation points at the extreme east/west or north/south and spawning flag bases there.

The flag bases must be touched by the flag carrier to deposit the flag.  In some BR maps the flag carrier may have to shield-gun jump to touch the flag base as it may hover above the ground in a very realistic and close to reality way.

====Other Features ====
* A web front end, and in game menu for easy administration will be provided.
* Full bot support for the game type.
* Multiple flag skins, selected randomly whenever the flag spawns (if it gets dropped into a lava pool for example).  This is more for the variation than anything else.

====Game Settings ====

The following are the customisable aspects of the mod from within the game menu.
* Score time.  This option allows the amount of time a flag must be on its flag base to gain a point.  This can be set to any integer value from 1 to 30.  The value is in seconds.
* Carry the flag.  This option allows players to decide whether they will have to carry the flag back to their flag base, or whether the flag will be placed there instantly when they touch it.  This option will be turned on by default (it generally makes for more exciting games).

====Map Thoughts ====

From experience with UT, maps which have open centers and bases that are very hard to defend work best.  B3PullTheTriggerBaby is a map that works well.  Niven is not a map that works well - unless the team size is small 1 or 2.  Generally maps that work well have more than one entrance into the base and are of small to medium size.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''I'm not going to write a CTF mod that directly supports more than two teams.  It generally requires more players than is available and the maps become very large (and laggy in some places).  If I can get find a way of tweaking the bot AI suitably from a mutator I may be able to provide the single flag mod as a mutator - for those people dead set on producing a multi-team CTF mod.

One oddity about single flag games is that it inherently copes better with smaller team sizes than a normal capture the flag.  As a general rule the entire team is either defending or attacking meaning everyone is involved in the action all of the time.  This is the one mod that I ''really'' want to write for UT.  In my opinion this was the most successful feature of the CTF+ mod I wrote (although I know people that disagree).

'''EntropcLqd:'''  I've dumped the extra-time option.  There really is no point in having extra time unless the score time is set to a large value and neither team can score.  In this case it should be a draw.  It also means that you don't wind up playing a map for an eternity with no team being able to get the advantage.

I may also drop the ''extra skins'' feature.  Not because it's hard to implement (under UT it's a snap) but becasue it will increase the download size needlessly.  It would be nice to be able to support additional textures though - just not held as part of the mod.

'''EntropicLqd:''' An interesting variation of this game type may be to use Bombing Run as the base and have the players hold the ball at their control-point, flag-base, scoring-hoop to score.  That way the ball could be thrown between players.  Personally, I think the BR maps will be too big.

'''EntropicLqd:''' I have come to the conclusion that I don't actually like the UT2003 game to want to write this mod anymore.  If anyone else wants to do it that's fine by me.  I'll maybe work on something else.

'''Daid303:''' We've added a One flag mode in our Ultimate survival mod (UT2003 http://mods.moddb.com/919/ ) it turned out quite nice not as advanced, with all those options here, but it works.

'''Mr.bob:''' LonelyFlag, aka steal the bacon.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Magicans</title>
    <id>1901</id>
    <revision>
      <id>4661</id>
      <timestamp>2002-09-29T19:28:54Z</timestamp>
      <contributor>
        <ip>Claw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Magicans}}

==Description ==

In a scene like for example a wood, let there be 2 teams of magicans. Both belong to different clans. Both teams start out at their home bases which only they can enter. If they die, they will respawn in there. There are a few pots of gold in the map. And both teams of course will try to get them. There's only one problem: 

Every player has magical abilities ( which can be expanded but see later ) but the poor one who has to carry a pot can't use his powers. There's so much gold in there that he merely can carry it, and with both hands holding the pot and the heavy pot doesn't allow him to fly etc. . The pot's gold amounts will vary - so you will get much more gold if you carry an gold pot from your enemy to your base ( At last, it's still a magical pot of gold ;)  ).

If the team can bring the pot home, they will get the gold and the pot will respawn, maybe not in the same location as before, and maybe to immediatly, but it will respawn. Now comes the tricky part :p

Each team has a shared gold-store, and they can develop new spells which the players of the team can choose from. This of course is not cheap - and some heavier spells will be quiet expensive. They can also extend their mana - but this will really be expensive ;) The winner is not the team with the most frags or pot captures, but the team with the most gold in storage! Thus you have to decide how much gold you want to use for development.

Players have mana, while it slowly recharges within the level, it recharges fast in their bases. If a player gets killed, he will drop his left mana. Be aware that if you spent all your mana you will be ( due to slow recharging ) an easy kill for another player with more mana.

So, that's a mod-idea I had a few months ago, but I failed in beeing too lazy to code for a team and for my own project ;)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''DJPaul:''' Do we have rainbows, and can we run along them?

'''Dante:''' Uhm, there's a temporary solution: Take drugs, play UT. And you might also see some rainbows ;)

'''EntropicLqd:'''  That's a nice idea - I particularly like the fact that the gold carrier is crippled.  It seems like this particular game type would benefit from each map being played for an hour, to give each team time to afford the higher level spells.  The way the game currently stands any team that gets a lead will automatically gain an advantage over the other team (they can upgrade their spells).  It maye be worth having a few pots of gold on the map worth differing amounts just to even things up a little.  How about having one team with all the magic, and the other team with &quot;normal&quot; weapons and technology.  Balancing things would be difficult.  Does each player have a &quot;magic strength bar&quot; that recharges over time  - when they have no magic strength left they can't cast spells.

'''Dante:''' Yo, I made a few changes. Your ideas sound good. But I will leave the magic vs magic atm. If someone actually &quot;makes&quot; this mod, he can add an additional human-team with normal weapons. Actually I forgot to write about the mana stuff.

'''EntropicLqd:'''  Do the spells you have learnt and mana extensions propagate to the next level or not?  If they don't then there is no real driver to extend mana and gain new spells if the winning team is the one with the most gold (unless the new spells are significantly better than the default ones).  It might be worth assigning gold to each player whenever the pot is captured.  This prevents one player from spending all of the teams hard earned gold.  If player enhancements and learnt spells exist from one level to the next it may make a good single player game.

'''Dante:''' The new spells will be much more powerfull. And gold is compared after a given amount of time. Players won't be able to spend the money of the team, they should be able to vote in their base. And if enough people vote vor something, it will be developed.

'''EntropicLqd:''' So once a spell is ''developed'' it becomes available to the whole team rather than the individual?  If you have the time a more detailed description would be nice.

'''Claw:''' Hmm, this sounds like it could be a gametype for Dark Magic 2. Yes, it will come. There is nothing you can do about it. :)

'''Dante:''' I once wrote to Dark Magic, and someone replied that a similar idea is planned... But this was quiet some time ago.

'''Claw:''' Never heard of it... maybe Zed's time? It's been all haphazard in the last year anyway. Actually I am almost happy to be the only coder now. Only now I got to modify and tweak and fix stuff mostly done by others... annoying.

Anything new of relevance isn't likely to happen prior to DarkMagic2. At least it was a learning experience.

'''Icedude:''' The 4e Fortress magicians had a good magic system: Choose the type of magic you want to learn, and depending on your level, you can get better spells (Like under Dark Magic, it goes from Vampiric Blast as your first spell, to Spirit of MAX as the last one)

'''Claw:''' Dunno, while the system was pretty, it seemed impractical for a fast-paced multiplayer game. For singleplayer I'd have been great, but I spent too much time on selecting spells and even more on &quot;mapping&quot; them to keys.

In the new Dark Magic system, you start with several spells, and the system automatically assigns new spells when you level up. The assignment is based on your playing style, basically if you use Fire spells often, you get a new Fire spell. Etc. I think it's sweet. Too bad it's so late though. If we had started a year earlier there'd have been a working release well before UT2k3, and I wouldn't be itching to &quot;get over it&quot; and start on Xenocide instead.</text>
    </revision>
    <revision>
      <id>4662</id>
      <timestamp>2002-09-29T09:11:49Z</timestamp>
      <contributor>
        <ip>WebcacheB04a.cache.pol.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Magicans}}

==Description ==

In a scene like for example a wood, let there be 2 teams of magicans. Both belong to different clans. Both teams start out at their home bases which only they can enter. If they die, they will respawn in there. There are a few pots of gold in the map. And both teams of course will try to get them. There's only one problem: 

Every player has magical abilities ( which can be expanded but see later ) but the poor one who has to carry a pot can't use his powers. There's so much gold in there that he merely can carry it, and with both hands holding the pot and the heavy pot doesn't allow him to fly etc. . The pot's gold amounts will vary - so you will get much more gold if you carry an gold pot from your enemy to your base ( At last, it's still a magical pot of gold ;)  ).

If the team can bring the pot home, they will get the gold and the pot will respawn, maybe not in the same location as before, and maybe to immediatly, but it will respawn. Now comes the tricky part :p

Each team has a shared gold-store, and they can develop new spells which the players of the team can choose from. This of course is not cheap - and some heavier spells will be quiet expensive. They can also extend their mana - but this will really be expensive ;) The winner is not the team with the most frags or pot captures, but the team with the most gold in storage! Thus you have to decide how much gold you want to use for development.

Players have mana, while it slowly recharges within the level, it recharges fast in their bases. If a player gets killed, he will drop his left mana. Be aware that if you spent all your mana you will be ( due to slow recharging ) an easy kill for another player with more mana.

So, that's a mod-idea I had a few months ago, but I failed in beeing too lazy to code for a team and for my own project ;)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''DJPaul:''' Do we have rainbows, and can we run along them?

'''Dante:''' Uhm, there's a temporary solution: Take drugs, play UT. And you might also see some rainbows ;)

'''EntropicLqd:'''  That's a nice idea - I particularly like the fact that the gold carrier is crippled.  It seems like this particular game type would benefit from each map being played for an hour, to give each team time to afford the higher level spells.  The way the game currently stands any team that gets a lead will automatically gain an advantage over the other team (they can upgrade their spells).  It maye be worth having a few pots of gold on the map worth differing amounts just to even things up a little.  How about having one team with all the magic, and the other team with &quot;normal&quot; weapons and technology.  Balancing things would be difficult.  Does each player have a &quot;magic strength bar&quot; that recharges over time  - when they have no magic strength left they can't cast spells.

'''Dante:''' Yo, I made a few changes. Your ideas sound good. But I will leave the magic vs magic atm. If someone actually &quot;makes&quot; this mod, he can add an additional human-team with normal weapons. Actually I forgot to write about the mana stuff.

'''EntropicLqd:'''  Do the spells you have learnt and mana extensions propagate to the next level or not?  If they don't then there is no real driver to extend mana and gain new spells if the winning team is the one with the most gold (unless the new spells are significantly better than the default ones).  It might be worth assigning gold to each player whenever the pot is captured.  This prevents one player from spending all of the teams hard earned gold.  If player enhancements and learnt spells exist from one level to the next it may make a good single player game.

'''Dante:''' The new spells will be much more powerfull. And gold is compared after a given amount of time. Players won't be able to spend the money of the team, they should be able to vote in their base. And if enough people vote vor something, it will be developed.

'''EntropicLqd:''' So once a spell is ''developed'' it becomes available to the whole team rather than the individual?  If you have the time a more detailed description would be nice.

'''Claw:''' Hmm, this sounds like it could be a gametype for Dark Magic 2. Yes, it will come. There is nothing you can do about it. :)

'''Dante:''' I once wrote to Dark Magic, and someone replied that a similar idea is planned... But this was quiet some time ago.

'''Claw:''' Never heard of it... maybe Zed's time? It's been all haphazard in the last year anyway. Actually I am almost happy to be the only coder now. Only now I got to modify and tweak and fix stuff mostly done by others... annoying.

Anything new of relevance isn't likely to happen prior to DarkMagic2. At least it was a learning experience.

'''Icedude:''' The 4e Fortress magicians had a good magic system: Choose the type of magic you want to learn, and depending on your level, you can get better spells (Like under Darm Magic, it goes from Vampiric Blast as your first spell, to Spirit of MAX as the last one)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Manhack</title>
    <id>2017</id>
    <revision>
      <id>4924</id>
      <timestamp>2006-08-13T11:56:48Z</timestamp>
      <contributor>
        <ip>DarkMan</ip>
      </contributor>
      <text xml:space="preserve">=Manhack=

==Description==

An idea based off the manhacks from Half-Life 2. For those who don't know, manhacks are like flying circular saws, that you could grab out of the air and shoot back at other enemies.

I was thinking primary fire to shoot a manhack, secondary fire to catch it (or just deflect it? Keep the speed of the game up). Perhaps make this out of a custom ball/ball-launcher?

==Interested Scripters==

(Please put some names here... Pleeeeeeeease?)

==Discussion ==

'''DarkMan:''' Yes, I saw those things in HL2, but never thought of replicating them... But now that you mention it, it'd be a good idea. Mabye use similar code as bots with a melee weapon, except these guys would be 32-80 units above the floor? And for the gun, mabye replacing redeemer (or 50-50 chance instead of 'deemer), with 5-10 ammo? Primary fire = shoot, secondary either deflect or mabye even manual control? I'll see what I can do about it, but won't add my name under &quot;interested&quot; - yet.</text>
    </revision>
    <revision>
      <id>4925</id>
      <timestamp>2006-01-27T17:24:36Z</timestamp>
      <contributor>
        <ip>Brig-cache-5.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Manhack=

==Description==

An idea based off the manhacks from Half-Life 2. For those who don't know, manhacks are like flying circular saws, that you could grab out of the air and shoot back at other enemies.

I was thinking primary fire to shoot a manhack, secondary fire to catch it (or just deflect it? Keep the speed of the game up). Perhaps make this out of a custom ball/ball-launcher?

==Interested Scripters==

(Please put some names here... Pleeeeeeeease?)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/MarioUT</title>
    <id>1910</id>
    <revision>
      <id>4681</id>
      <timestamp>2004-10-28T17:02:59Z</timestamp>
      <contributor>
        <ip>XX)(Xx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Mario UT - Head bouncing ahoy!

==Description ==

This simple mutator would take out the guns, and give you better jumping powers.  The mutator would also shrink you to half the normal size.  The only way to kill people (in normal mode) is to jump on their heads (ala classic mario), and some new pickups would be added, like the star, which would let you kill anyone by touching them, and the flower, which would let you shoot fireballs, and of course the mushroom, which makes you normal sized.

----

====Interested Scripters ====

'''Dezro:''' For some reason, I'm working on this. Huh. I'm also adding the leaf from SMB 3, which gives you bunch of extra jumps, and the poison mushroom from the Japanese version of SMB 2, which, unlike the original, makes you even smaller for a while (more like the mini mushroom from Smash Brothers Melee and Mario Party 4, actually...)

'''PieOnCar:''':  Damn, I thought I was the first one to think this up&amp;ndash;but I was going to keep guns.  I was going to have a lower gravity for higher jumps, and have the better weapons come out of certain, normal brick blocks when you hit them, and of course there would be the classic question mark boxes.  You could even implement a coin system where you get an extra life (in limited number of lives games, of course) at 100 coins.  And there would be a bunch of warp pipes everywhere, and entering one would either pop you out a random warp pipe or maybe throw you into the &quot;dungeon&quot; sublevel.  If it were a bombing run level, a sweet mod would be having a koopa trooper shell for the ball...   And for the experienced coders out there, I have a few HUD mod ideas to go with this theme too: have a running total of the coins on top, a score that would increase with kills and coins collected, the timer, and &quot;World 1-1&quot; for the first version, 1-2 for the update, etc.  That's not even half the ideas I had for this.  Maybe we can work together, Dezro?  AIM me at PieOnCar, or email at pieoncar@yahoo.com.  I'm pretty new to the whole mod scene, but I'm fair at modeling and Photoshop.  I'd like to get some coding experience because I'm going to USC (socal, not south carolina) this fall to study computer science.  Plus it's summer now, and I've got nothing better to do. ^_^

----

==Discussion ==

'''Wormbo:''' Something like this was reviewed at modsquad a while ago. It's score wasn't very high.

'''ZxAnPhOrIaN:''' This would be cool!!!

'''EntropicLqd:''' You'd probably have to tweak the physics a little (more air control) and use a third person perspective to make it work cleanly.  It's a nice idea but I way prefer bubble bobble :).  You might have to build some special maps as well that have more &quot;open&quot; areas.  Still, a mario-esque bombing run might be quite fun - the guy with the ball isn't so defenceless all of a sudden.

'''G-LiTe:''': This'd simply be extremely funny and rock! I demand someone finishes this! :D &lt;br /&gt;Be sure to add the speed meter for the leaf powerup too, dezro! :D

'''G-LiTe:''': [http://www.planetunreal.com/modsquad/asp/breviews.asp?501 Stomp Match] at [http://www.planetunreal.com/modsquad ModSquad] &lt;br /&gt;It got rated 5 overall and is currently 6.6 user rating. It doesn't have the powerups though or the scaling and it seems to be UT 1. &lt;br /&gt;You should make an option for the scaling and maybe a slider for the amount everything is scaled. &lt;br /&gt;If nobody's going to do this I _might_ try it myself. I haven't coded in a while and I tend to not finish stuff I start. :S

'''Eldhrin:''' Sounds like fun, I wish I had more time for things like this! But I have to do coursework by priority.

'''Wormbo:''' What about the Super Mario Mutator [http://www.beyondunreal.com/daedalus/archive.php?month=June%2C+2003#3011 BU recently postet about]?

'''Icedude:''' Huzzah! someone actually made it!

You can get a mod somewhat like this for UT2K3 at AngelMapper.com

'''xX)(Xx:''' Heh, i saw a UT 99 map on Nali City done in Mario style, was pretty funny, check out Nali City and you should find it :)</text>
    </revision>
    <revision>
      <id>4682</id>
      <timestamp>2003-09-08T20:35:33Z</timestamp>
      <contributor>
        <ip>Bgp01072824bgs.vnburn01.mi.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Mario UT - Head bouncing ahoy!

==Description ==

This simple mutator would take out the guns, and give you better jumping powers.  The mutator would also shrink you to half the normal size.  The only way to kill people (in normal mode) is to jump on their heads (ala classic mario), and some new pickups would be added, like the star, which would let you kill anyone by touching them, and the flower, which would let you shoot fireballs, and of course the mushroom, which makes you normal sized.

----

====Interested Scripters ====

'''Dezro:''' For some reason, I'm working on this. Huh. I'm also adding the leaf from SMB 3, which gives you bunch of extra jumps, and the poison mushroom from the Japanese version of SMB 2, which, unlike the original, makes you even smaller for a while (more like the mini mushroom from Smash Brothers Melee and Mario Party 4, actually...)

'''PieOnCar:''':  Damn, I thought I was the first one to think this up&amp;ndash;but I was going to keep guns.  I was going to have a lower gravity for higher jumps, and have the better weapons come out of certain, normal brick blocks when you hit them, and of course there would be the classic question mark boxes.  You could even implement a coin system where you get an extra life (in limited number of lives games, of course) at 100 coins.  And there would be a bunch of warp pipes everywhere, and entering one would either pop you out a random warp pipe or maybe throw you into the &quot;dungeon&quot; sublevel.  If it were a bombing run level, a sweet mod would be having a koopa trooper shell for the ball...   And for the experienced coders out there, I have a few HUD mod ideas to go with this theme too: have a running total of the coins on top, a score that would increase with kills and coins collected, the timer, and &quot;World 1-1&quot; for the first version, 1-2 for the update, etc.  That's not even half the ideas I had for this.  Maybe we can work together, Dezro?  AIM me at PieOnCar, or email at pieoncar@yahoo.com.  I'm pretty new to the whole mod scene, but I'm fair at modeling and Photoshop.  I'd like to get some coding experience because I'm going to USC (socal, not south carolina) this fall to study computer science.  Plus it's summer now, and I've got nothing better to do. ^_^

----

==Discussion ==

'''Wormbo:''' Something like this was reviewed at modsquad a while ago. It's score wasn't very high.

'''ZxAnPhOrIaN:''' This would be cool!!!

'''EntropicLqd:''' You'd probably have to tweak the physics a little (more air control) and use a third person perspective to make it work cleanly.  It's a nice idea but I way prefer bubble bobble :).  You might have to build some special maps as well that have more &quot;open&quot; areas.  Still, a mario-esque bombing run might be quite fun - the guy with the ball isn't so defenceless all of a sudden.

'''G-LiTe:''': This'd simply be extremely funny and rock! I demand someone finishes this! :D &lt;br /&gt;Be sure to add the speed meter for the leaf powerup too, dezro! :D

'''G-LiTe:''': [http://www.planetunreal.com/modsquad/asp/breviews.asp?501 Stomp Match] at [http://www.planetunreal.com/modsquad ModSquad] &lt;br /&gt;It got rated 5 overall and is currently 6.6 user rating. It doesn't have the powerups though or the scaling and it seems to be UT 1. &lt;br /&gt;You should make an option for the scaling and maybe a slider for the amount everything is scaled. &lt;br /&gt;If nobody's going to do this I _might_ try it myself. I haven't coded in a while and I tend to not finish stuff I start. :S

'''Eldhrin:''' Sounds like fun, I wish I had more time for things like this! But I have to do coursework by priority.

'''Wormbo:''' What about the Super Mario Mutator [http://www.beyondunreal.com/daedalus/archive.php?month=June%2C+2003#3011 BU recently postet about]?

'''Icedude:''' Huzzah! someone actually made it!

You can get a mod somewhat like this for UT2K3 at AngelMapper.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Medieval-Fantasy</title>
    <id>1971</id>
    <revision>
      <id>4823</id>
      <timestamp>2003-06-17T18:03:04Z</timestamp>
      <contributor>
        <ip>Adsl-65-65-97-48.dsl.austtx.swbell.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">---Medieval/Fantasy MOD &amp;rarr;

the basic premise is making a game similar to Rune or Dark Vengeance.

The game is not a full RPG, rahter it is a battle game with factions,

medieval/fantasy weapons, and various gametypes.  I have seen alot of

talk about a game like this on various boards, but no mod aimed at this.

Gametypes could be Capture the Keep (similar to DDom), Siege (Assault),

and regular Battle (TDM).  I dont know if players would gather gold to

upgrade from available weapons/armor; or if players would just choose

what to use and then pick up better weapons from the map/orther players.

I have started to model several weapons to see if i can gather support

for this idea.  If you have any suggestions please feel free to comment.

HarvesterUT</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Mercury Missile InstaGib</title>
    <id>1935</id>
    <revision>
      <id>4738</id>
      <timestamp>2003-05-09T09:39:42Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>mod is released</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas For UT 2003 &amp;ndash; Mercury Missile InstaGib}}

==Description ==

The idea behind this mod originates from the mod Rockets UT.

The basic concept is that all players have a special rocket launcher that fires high-speed rockets. These rockets can penetrate unprotected opponents and even do headshots. (Not really important in the InstaGib version.)

====The Rocket Launcher====
; Primary Mode : Fires a single Mercury Missile.
; Secondary Mode : Activates zoom. The zoom mode can be configured:
;; Instant Zoom : If enabled, pressing the alt fire button zooms in, releasing it zooms out. Otherwise pressing the alt fire button toggles zoom.
;; Automatic Zoom Level : If enabled, the zoom level will be selected automatically, otherwise in instant zoom mode the zoom FOV is 30 and in toggle zoom mode the zoom works like the one of the Lightning Gun or the Zoom InstaGib Shockrifle.

====The Missile====
* can penetrate opponents when it travels at a higher speed (&gt;5000) and the opponent doesn't have a shield
* can do headshots
* has a small splash area (the damage in that area can be turned off and will always be deactivated in InstaGib mode)
* has a high momentum transfer for direct hits, but only a medium momentum transfer for splash hits

====The Mutators====

The mod comes with two mutators:
; Mercury InstaGib : A configurable arena mutator. The options are InstaGib Mode, Unlimited Ammo, No Splash Damage and No Zoom.
; Mercury Missiles : Replaces only the rocketlauncher with the Mrcury Missile Launcher. Options are No Splash Damage and No Zoom.

The arena mutator might also get an option for keeping the shield gun. The Translocator is always allowed.

==Interested Scripters==

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:Wormbo|Wormbo]] &amp;ndash; Work is finished, you may now start [http://www.koehler-homepage.de/Wormbo/download2k3.html downloading]... ;)
* [[Legacy:Eldhrin|Eldhrin]] &amp;ndash; I've got a simple Rocket InstaGib mutator going which just converts all rockets to instant-kill, but it'd be nice to do something a little more interesting with it.

==Comments ==

'''ZxAnPhOrIaN:''' I really like the RocketsUT weap mod for UT! The auto zoom level should have a keybinding, not regular alt fire. I would find it irritating seeing it go in and go out. Also, what if someone is fixed on me while i cant see him because he is out of my field of view.

'''Wormbo:''' I made the zoom quickly go to a FOV of 30, that's ok most of the time. The whole mutator already works quite well, and is even compatible to the Missile Cam mutator I wrote. (see &quot;Spare Parts&quot; on [[Legacy:Wormbo|my wiki page]])

'''Eldhrin:''' No doubt you don't need me at all, but I'm interested nonetheless due to the similarities with my own Rocket InstaGib mutator.

'''Wormbo:''' Hmm, I'm a bit stuck with the zoom scope, well not the functionality, but the HUD overlays for it. However, I have an idea for the automatic zoom level. The zoom level could be decided based on the target distance when starting the zoom. Changing the zoom level would be a matter of shortly releasing altfire and pressing it again.

'''RegularX:''' There's a sniper mute for UT somewhere that apparently had an excellent autozoom.  I'm planning on adding an autoscope as an weapon upgrade in FHNG.  My assumption was the same, that zoom level would alter based on a successful trace to towards the distance of the target (if the trace hits a pawn).  Tweaking it to feel natural would probably be the hardest part.

'''Wormbo:''' Some updates about my progress with this mod. I'm almost done, only the zoom HUD requires some more ideas. Currently it looks like this:

http://www.koehler-homepage.de/Wormbo/screenshots/mercuryinstagig/mercury-zoom1.jpg

I think my solution for the zoom mode is flexible enough to provide the right handling for everyone. It can be configured in-game by holding the alt fire button and pressing function keys. The two main options actually make up four different modes:
#Zoom in to an automatically selected FOV. Zoom out when alt fire is released.
#Zoom in to a fixed FOV of 30. Zoom out when alt fire is released.
#Zoom in to an automatically selected FOV and adjust the FOV based on the current target. Zoom out when alt fire is pressed again.
#Zoom in until alt fire is released or maximum zoom level is reached. Zoom out when alt fire is pressed again.</text>
    </revision>
    <revision>
      <id>4739</id>
      <timestamp>2003-02-03T15:26:44Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas For UT 2003 &amp;ndash; Mercury Missile InstaGib}}

==Description ==

The idea behind this mod originates from the mod Rockets UT.

The basic concept is that all players have a special rocket launcher that fires high-speed rockets. These rockets can penetrate unprotected opponents and even do headshots. (Not really important in the InstaGib version.)

====The Rocket Launcher====
; Primary Mode : Fires a single Mercury Missile.
; Secondary Mode : Activates zoom. Hold to keep zoom, release to deactivate zoom. (Maybe even automatic zoom level?)

====The Missile====
* can penetrate opponents when it travels at a higher speed (&gt;5000 ?) and the opponent doesn't have a shield
* can do headshots
* has a small splash area (the damage in that area can be turned off by using the mutator config window or InstaGib mode)
* has a high momentum transfer for direct hits, but only a medium momentum transfer for splash hits

====The Mutator====

The mutator should be configurable for two modes:
; InstaGib mode : Removes all weapons, health, armor and double damage. Missiles kill instantly, but don't have splash damage. (They have splash momentum, though.)
; Arena mode : Removes all weapons, but keeps health, armor and double damage. Missiles do normal damage (around 70-90 for direct hits?) and have splash damage.

The mutator might also have an option for keeping the shield gun.

==Interested Scripters==

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:Wormbo|Wormbo]] &amp;ndash; I already started, but this is the easiest way to get ideas from other people. :)
* [[Legacy:Eldhrin|Eldhrin]] &amp;ndash; I've got a simple Rocket InstaGib mutator going which just converts all rockets to instant-kill, but it'd be nice to do something a little more interesting with it.

==Comments ==

'''ZxAnPhOrIaN:''' I really like the RocketsUT weap mod for UT! The auto zoom level should have a keybinding, not regular alt fire. I would find it irritating seeing it go in and go out. Also, what if someone is fixed on me while i cant see him because he is out of my field of view.

'''Wormbo:''' I made the zoom quickly go to a FOV of 30, that's ok most of the time. The whole mutator already works quite well, and is even compatible to the Missile Cam mutator I wrote. (see &quot;Spare Parts&quot; on [[Legacy:Wormbo|my wiki page]])

'''Eldhrin:''' No doubt you don't need me at all, but I'm interested nonetheless due to the similarities with my own Rocket InstaGib mutator.

'''Wormbo:''' Hmm, I'm a bit stuck with the zoom scope, well not the functionality, but the HUD overlays for it. However, I have an idea for the automatic zoom level. The zoom level could be decided based on the target distance when starting the zoom. Changing the zoom level would be a matter of shortly releasing altfire and pressing it again.

'''RegularX:''' There's a sniper mute for UT somewhere that apparently had an excellent autozoom.  I'm planning on adding an autoscope as an weapon upgrade in FHNG.  My assumption was the same, that zoom level would alter based on a successful trace to towards the distance of the target (if the trace hits a pawn).  Tweaking it to feel natural would probably be the hardest part.</text>
    </revision>
    <revision>
      <id>4740</id>
      <timestamp>2003-02-20T02:35:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas For UT 2003 &amp;ndash; Mercury Missile InstaGib}}

==Description ==

The idea behind this mod originates from the mod Rockets UT.

The basic concept is that all players have a special rocket launcher that fires high-speed rockets. These rockets can penetrate unprotected opponents and even do headshots. (Not really important in the InstaGib version.)

====The Rocket Launcher====
; Primary Mode : Fires a single Mercury Missile.
; Secondary Mode : Activates zoom. The zoom mode can be configured:
;; Instant Zoom : If enabled, pressing the alt fire button zooms in, releasing it zooms out. Otherwise pressing the alt fire button toggles zoom.
;; Automatic Zoom Level : If enabled, the zoom level will be selected automatically, otherwise in instant zoom mode the zoom FOV is 30 and in toggle zoom mode the zoom works like the one of the Lightning Gun or the Zoom InstaGib Shockrifle.

====The Missile====
* can penetrate opponents when it travels at a higher speed (&gt;5000) and the opponent doesn't have a shield
* can do headshots
* has a small splash area (the damage in that area can be turned off and will always be deactivated in InstaGib mode)
* has a high momentum transfer for direct hits, but only a medium momentum transfer for splash hits

====The Mutators====

The mod comes with two mutators:
; Mercury InstaGib : A configurable arena mutator. The options are InstaGib Mode, Unlimited Ammo, No Splash Damage and No Zoom.
; Mercury Missiles : Replaces only the rocketlauncher with the Mrcury Missile Launcher. Options are No Splash Damage and No Zoom.

The arena mutator might also get an option for keeping the shield gun. The Translocator is always allowed.

==Interested Scripters==

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:Wormbo|Wormbo]] &amp;ndash; I already started, but this is the easiest way to get ideas from other people. :)
* [[Legacy:Eldhrin|Eldhrin]] &amp;ndash; I've got a simple Rocket InstaGib mutator going which just converts all rockets to instant-kill, but it'd be nice to do something a little more interesting with it.

==Comments ==

'''ZxAnPhOrIaN:''' I really like the RocketsUT weap mod for UT! The auto zoom level should have a keybinding, not regular alt fire. I would find it irritating seeing it go in and go out. Also, what if someone is fixed on me while i cant see him because he is out of my field of view.

'''Wormbo:''' I made the zoom quickly go to a FOV of 30, that's ok most of the time. The whole mutator already works quite well, and is even compatible to the Missile Cam mutator I wrote. (see &quot;Spare Parts&quot; on [[Legacy:Wormbo|my wiki page]])

'''Eldhrin:''' No doubt you don't need me at all, but I'm interested nonetheless due to the similarities with my own Rocket InstaGib mutator.

'''Wormbo:''' Hmm, I'm a bit stuck with the zoom scope, well not the functionality, but the HUD overlays for it. However, I have an idea for the automatic zoom level. The zoom level could be decided based on the target distance when starting the zoom. Changing the zoom level would be a matter of shortly releasing altfire and pressing it again.

'''RegularX:''' There's a sniper mute for UT somewhere that apparently had an excellent autozoom.  I'm planning on adding an autoscope as an weapon upgrade in FHNG.  My assumption was the same, that zoom level would alter based on a successful trace to towards the distance of the target (if the trace hits a pawn).  Tweaking it to feel natural would probably be the hardest part.

'''Wormbo:''' Some updates about my progress with this mod. I'm almost done, only the zoom HUD requires some more ideas. Currently it looks like this:

http://www.koehler-homepage.de/Wormbo/screenshots/mercuryinstagig/mercury-zoom1.jpg

I think my solution for the zoom mode is flexible enough to provide the right handling for everyone. It can be configured in-game by holding the alt fire button and pressing function keys. The two main options actually make up four different modes:
#Zoom in to an automatically selected FOV. Zoom out when alt fire is released.
#Zoom in to a fixed FOV of 30. Zoom out when alt fire is released.
#Zoom in to an automatically selected FOV and adjust the FOV based on the current target. Zoom out when alt fire is pressed again.
#Zoom in until alt fire is released or maximum zoom level is reached. Zoom out when alt fire is pressed again.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Minefield</title>
    <id>1876</id>
    <revision>
      <id>4603</id>
      <timestamp>2007-07-14T19:18:12Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>Response For Postal</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; It's a Minefield}}

==Description ==

This is a small mutator that spawns a configurable number of mines randomly within a level.  A mine is triggered when a player runs over it.  When triggered mines fire a small capsule into the air which spins for maybe 1/10th of a second before launching a &quot;lightning gun like spark&quot; at players within a pre-set radius at the point the mine was triggered.  If there are no players within the target radius then the &quot;capsule&quot; explodes.  The mines themselves don't do a lot of damage and have a fairly small blast radius, but what they do have is a nice kick to bonuce the player around a bit.
* The number of mines is expressed as a percentage of the number of navigation points on the level (between 5% and 50% &amp;ndash; 15% is probably a good default).
* Mines are always spawned at navigation points (to make life easy).
* Mines are always visible - but should be very difficult to see.
* Mines are spawned at the start of the level and never regenerate unless the respawn mines option is set.
* Mines can be triggered by shooting them.  In which case they behave in the same way as if they were triggered by a player.
* Team mines (for use in team games like BR, DD, and CTF) can be enabled/disabled.  If team mines are disabled ''all'' mines are hostile.  Otherwise all mines within the &quot;owning radius&quot; of the flag base, control point etc become &quot;owned&quot; by the team whose flag base it is.
* A respawn mines setting allows mines to respawn elswhere in the level when they are triggered - this keeps the number of mines on the level constant.
* The radius of ownership for team mines can be set to close (512 world units), near (1024 world units), far (2048 world units), and extreme (4096 world units).

===Team mine behaviour ===

Mines will behave differently when in team mode depending on the game type.  In capture the flag, when a mine falls within a certain radius of one or more flag bases it will be assigned to the owning team of the closest flag base.

In Domination the mines will all start as neutral, then, when a control point changes team all mines within the &quot;target&quot; radius of the control point become owned by that team.

In Bombing run, mines within a certain radius of the touchdown point and &quot;scoring hoop(s)&quot; become owned by the team whose touchdown point/scoring hoop it is.

In Team deathmatch and deathmatch all mines are hostile - effectively the ''team mines'' options have no effect.

Remember - players on the same team as the &quot;owning team&quot; of a mine do not trigger mines.

===Note on implementation ===

Given that Domination points change owners fairly often it's probably better to have a reference on the mine to the &quot;owning object&quot; be it flag base, control point, or touchdown point/scoring hoop.  This owning object is then interrogated at the point the mine is &quot;touched&quot; to see whether the mine should fire or not.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

*  [[Legacy:Kuhal|Kuhal]] - Can do in UT but no access to UT2003 as yet
*  [[Legacy:Postal|Postal]] - Allready working on something similar.

==Discussion ==

'''Delta:''' This idea is easily possible with a scripted trigger, some emitters, a trigger, and a projectile spawner. I try to make a prototype, and post how i made it... if needed :) Oh and this is a good solution for team mines... in Assault especially! And an amount of time can be set before making the mine active again... or just to trigger once only :) i try it im sure

'''EntropicLqd:'''  Should mines beep?

'''ZxAnPhOrIaN:'''  That would be a good idea. Also, mines should have a faint glow on them and explode when shot. In team games like CTF, you should have teamed mines so that you don't die when you have the flag in your base if you step on a mine.

'''EntropicLqd:'''  Do you not think that the teamed mines would only really be useful if you could actually deploy them yourself as a player?  Assuming the mines are still spawned randomly - would you change the owning team of the mines only within a certain radius of the flag, leaving an area in the middle of the map where all mines are dangerous?  I like the idea of being able to shoot them.  What about spawning more mid-game?

'''ZxAnPhOrIaN:'''  It should calculate how far the flags are apart, and divide it by 3. One third is red, another third is blue, and the last third is neutral.

'''EntropicLqd:'''  Hmmm, what about maps that have the flag bases back to back?  Could be interesting.  I'd prefer most of the map to have &quot;unfriendly&quot; mines tbh so I'd be inclined to set a fixed radius from the flag.  Still doesn't help with flag bases that are back to back though.

'''ZxAnPhOrIaN:'''  Lets forget about team mines.

'''EntropicLqd:'''  Hmmm, too eary to give up on that idea at the moment I think.  It's an appealing idea.  As for the back to back levels - there are not that many ... and it might be quite amusing :)

'''Birelli:''' Regardless of flag configuration, have the same radius around all flags, and where the fields interesect make the mine be the team of whichever flag is closest (Without some real mathematical analysis of that I'm not sure if it would ever be the case that mines could be in the opponent's base, but I think it would cover 99% of maps out there).

With that, make sure it supports searching for all flag bases so mods like CTF+ which support all kinds of wacky flag setups will still work.

Finally, it might be interesting to try it with Domination also, adds new meaning to having a defensive advantage :-).

'''ZxAnPhOrIaN:'''  Well, in DOM you have to configure the mines in a certain radius of the Domination checkpoint during gameplay to the team that owns the checkpoint. Also if the checkpoint is neutral, the mines will blow up EVERY player. :) On another note, you should put a mover or some sort of thing near the mine to blow a hole in the ground when the mine blows up.

'''EntropicLqd:'''  Not sure about the mover idea - what happens if the mine spawns on a grill?  Don't forget mines are spawned randomly across the map - they don't actually form part of the map.  I always thought movers made up part of the BSP tree.  I think I'd prefer to do a simple scorch mark on the ground when the mine explodes.  Anyways &amp;ndash; after all the refactoring any other comments?

'''ZxAnPhOrIaN:'''  The scorch mark is a good idea, it could be a smaller redeemer blast mark.

'''DJPaul:'''  Nice idea, could be fun.  I'll put a &quot;I might look in on this idea&quot;, just like i've done on a couple of the others.  If anyone wants to do this, however - go for it.

'''Mr.Mitchell:'''  I like the description of this mod. I was already planning on making a UT2003 version of my [http://home.ict.nl/~mweterin/unreal/projects/flakminecannon.html FlakMineCannon mutator] so it would be easy to also make this mutator since I am already playing around with mines. So I also add my name to the list.

'''DJPaul:'''  Dare I up against the might of Mr.Mitchell?  Anyway, I may not even do it like I say above.

'''Mr.Mitchell:''' Cause DJPaul al already started with it (I guess that is meant by &quot;delivery mode&quot;) I removed my name.

'''DJPaul:''' hi ho from somewhere in Canada.  Hope j00 all having fun.  Day before I left, I emailed what i've done with this to someone to continue - I was talking with them in #unrealwiki, but i've forgotten my name.  whoever you are, have you done any wokr?

'''Kuhal:''' I like the idea.  How can you be working on it for UT2K3 already?  Are some of you lucky enough to be included in pre-release Alpha trials or something?  Anyhow, the issue with who owns a mine is simply mitigated by having multiple ownership.  Basically, if the mine is within range of the emmitter (could be a new actor or just the flag/domination point etc) then that particular mine WILL explode if an opposing team comes near it.  If multiple teams own the mine then I'd suggest the mine does damage to all players in the radius if it explodes, and only the enemy players for the initial effect (was it lightning gun?).  You can possibly add to this later with the idea of a mobile emmitter and in so doing, you could have a tactical decision to make if you wanted to move your emitter to a different location.  Possibly also a number of mines can be laid (up to a map maximum) each few seconds.  Thus (like the board game stratego) you can set up your defenses as you please...  Lasyly, Direct hits or perhaps hits inflicting over a certain threshold of damage should be needed to explode an detected mine.  otherwise you clear a minefield easily with spam rockets/deemer...

'''DJPaul:''' No, i've done some code for UT.  You're welcome to it if you want.

'''Kuhal:''' Sure why not.  So you've done some UT code trusting that conversion won't be a major issue?  Sounds fine to me.  kuhal@win.co.nz

'''Postal:''' I'm working on a stand alone land mine, a simulation of the M16A1 Apers with M605 fuse.  Its mostly working for UT2k3, but I have 2 bugs to work out.  I have figured out a way to make bots avoid them.  Its a good bit more powerfull then what you guys are talking about, and it can be shot to be destroyed.  The UT verson was invisable unless you were near it, unfortunaly the ability to do that was cut from UT2k3.  I could easly make another verson of it which does less damage, beeps, and or can be safely passed with a Anti-Prox.  Postal@PlanetUnreal.com

'''MythOpus:''' You can spawn an AvoidMarker (NavigationPoint) on top of it when the mine is created.  And as far as the invisible until you're near it part goes, how was it cut from UT2003?  Remember you can do practically anything in more than one way :P</text>
    </revision>
    <revision>
      <id>4604</id>
      <timestamp>2007-07-13T11:12:32Z</timestamp>
      <contributor>
        <ip>Delta</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; It's a Minefield}}

==Description ==

This is a small mutator that spawns a configurable number of mines randomly within a level.  A mine is triggered when a player runs over it.  When triggered mines fire a small capsule into the air which spins for maybe 1/10th of a second before launching a &quot;lightning gun like spark&quot; at players within a pre-set radius at the point the mine was triggered.  If there are no players within the target radius then the &quot;capsule&quot; explodes.  The mines themselves don't do a lot of damage and have a fairly small blast radius, but what they do have is a nice kick to bonuce the player around a bit.
* The number of mines is expressed as a percentage of the number of navigation points on the level (between 5% and 50% &amp;ndash; 15% is probably a good default).
* Mines are always spawned at navigation points (to make life easy).
* Mines are always visible - but should be very difficult to see.
* Mines are spawned at the start of the level and never regenerate unless the respawn mines option is set.
* Mines can be triggered by shooting them.  In which case they behave in the same way as if they were triggered by a player.
* Team mines (for use in team games like BR, DD, and CTF) can be enabled/disabled.  If team mines are disabled ''all'' mines are hostile.  Otherwise all mines within the &quot;owning radius&quot; of the flag base, control point etc become &quot;owned&quot; by the team whose flag base it is.
* A respawn mines setting allows mines to respawn elswhere in the level when they are triggered - this keeps the number of mines on the level constant.
* The radius of ownership for team mines can be set to close (512 world units), near (1024 world units), far (2048 world units), and extreme (4096 world units).

===Team mine behaviour ===

Mines will behave differently when in team mode depending on the game type.  In capture the flag, when a mine falls within a certain radius of one or more flag bases it will be assigned to the owning team of the closest flag base.

In Domination the mines will all start as neutral, then, when a control point changes team all mines within the &quot;target&quot; radius of the control point become owned by that team.

In Bombing run, mines within a certain radius of the touchdown point and &quot;scoring hoop(s)&quot; become owned by the team whose touchdown point/scoring hoop it is.

In Team deathmatch and deathmatch all mines are hostile - effectively the ''team mines'' options have no effect.

Remember - players on the same team as the &quot;owning team&quot; of a mine do not trigger mines.

===Note on implementation ===

Given that Domination points change owners fairly often it's probably better to have a reference on the mine to the &quot;owning object&quot; be it flag base, control point, or touchdown point/scoring hoop.  This owning object is then interrogated at the point the mine is &quot;touched&quot; to see whether the mine should fire or not.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

*  [[Legacy:Kuhal|Kuhal]] - Can do in UT but no access to UT2003 as yet
*  [[Legacy:Postal|Postal]] - Allready working on something similar.

==Discussion ==

'''Delta:''' This idea is easily possible with a scripted trigger, some emitters, a trigger, and a projectile spawner. I try to make a prototype, and post how i made it... if needed :) Oh and this is a good solution for team mines... in Assault especially! And an amount of time can be set before making the mine active again... or just to trigger once only :) i try it im sure

'''EntropicLqd:'''  Should mines beep?

'''ZxAnPhOrIaN:'''  That would be a good idea. Also, mines should have a faint glow on them and explode when shot. In team games like CTF, you should have teamed mines so that you don't die when you have the flag in your base if you step on a mine.

'''EntropicLqd:'''  Do you not think that the teamed mines would only really be useful if you could actually deploy them yourself as a player?  Assuming the mines are still spawned randomly - would you change the owning team of the mines only within a certain radius of the flag, leaving an area in the middle of the map where all mines are dangerous?  I like the idea of being able to shoot them.  What about spawning more mid-game?

'''ZxAnPhOrIaN:'''  It should calculate how far the flags are apart, and divide it by 3. One third is red, another third is blue, and the last third is neutral.

'''EntropicLqd:'''  Hmmm, what about maps that have the flag bases back to back?  Could be interesting.  I'd prefer most of the map to have &quot;unfriendly&quot; mines tbh so I'd be inclined to set a fixed radius from the flag.  Still doesn't help with flag bases that are back to back though.

'''ZxAnPhOrIaN:'''  Lets forget about team mines.

'''EntropicLqd:'''  Hmmm, too eary to give up on that idea at the moment I think.  It's an appealing idea.  As for the back to back levels - there are not that many ... and it might be quite amusing :)

'''Birelli:''' Regardless of flag configuration, have the same radius around all flags, and where the fields interesect make the mine be the team of whichever flag is closest (Without some real mathematical analysis of that I'm not sure if it would ever be the case that mines could be in the opponent's base, but I think it would cover 99% of maps out there).

With that, make sure it supports searching for all flag bases so mods like CTF+ which support all kinds of wacky flag setups will still work.

Finally, it might be interesting to try it with Domination also, adds new meaning to having a defensive advantage :-).

'''ZxAnPhOrIaN:'''  Well, in DOM you have to configure the mines in a certain radius of the Domination checkpoint during gameplay to the team that owns the checkpoint. Also if the checkpoint is neutral, the mines will blow up EVERY player. :) On another note, you should put a mover or some sort of thing near the mine to blow a hole in the ground when the mine blows up.

'''EntropicLqd:'''  Not sure about the mover idea - what happens if the mine spawns on a grill?  Don't forget mines are spawned randomly across the map - they don't actually form part of the map.  I always thought movers made up part of the BSP tree.  I think I'd prefer to do a simple scorch mark on the ground when the mine explodes.  Anyways &amp;ndash; after all the refactoring any other comments?

'''ZxAnPhOrIaN:'''  The scorch mark is a good idea, it could be a smaller redeemer blast mark.

'''DJPaul:'''  Nice idea, could be fun.  I'll put a &quot;I might look in on this idea&quot;, just like i've done on a couple of the others.  If anyone wants to do this, however - go for it.

'''Mr.Mitchell:'''  I like the description of this mod. I was already planning on making a UT2003 version of my [http://home.ict.nl/~mweterin/unreal/projects/flakminecannon.html FlakMineCannon mutator] so it would be easy to also make this mutator since I am already playing around with mines. So I also add my name to the list.

'''DJPaul:'''  Dare I up against the might of Mr.Mitchell?  Anyway, I may not even do it like I say above.

'''Mr.Mitchell:''' Cause DJPaul al already started with it (I guess that is meant by &quot;delivery mode&quot;) I removed my name.

'''DJPaul:''' hi ho from somewhere in Canada.  Hope j00 all having fun.  Day before I left, I emailed what i've done with this to someone to continue - I was talking with them in #unrealwiki, but i've forgotten my name.  whoever you are, have you done any wokr?

'''Kuhal:''' I like the idea.  How can you be working on it for UT2K3 already?  Are some of you lucky enough to be included in pre-release Alpha trials or something?  Anyhow, the issue with who owns a mine is simply mitigated by having multiple ownership.  Basically, if the mine is within range of the emmitter (could be a new actor or just the flag/domination point etc) then that particular mine WILL explode if an opposing team comes near it.  If multiple teams own the mine then I'd suggest the mine does damage to all players in the radius if it explodes, and only the enemy players for the initial effect (was it lightning gun?).  You can possibly add to this later with the idea of a mobile emmitter and in so doing, you could have a tactical decision to make if you wanted to move your emitter to a different location.  Possibly also a number of mines can be laid (up to a map maximum) each few seconds.  Thus (like the board game stratego) you can set up your defenses as you please...  Lasyly, Direct hits or perhaps hits inflicting over a certain threshold of damage should be needed to explode an detected mine.  otherwise you clear a minefield easily with spam rockets/deemer...

'''DJPaul:''' No, i've done some code for UT.  You're welcome to it if you want.

'''Kuhal:''' Sure why not.  So you've done some UT code trusting that conversion won't be a major issue?  Sounds fine to me.  kuhal@win.co.nz

'''Postal:''' I'm working on a stand alone land mine, a simulation of the M16A1 Apers with M605 fuse.  Its mostly working for UT2k3, but I have 2 bugs to work out.  I have figured out a way to make bots avoid them.  Its a good bit more powerfull then what you guys are talking about, and it can be shot to be destroyed.  The UT verson was invisable unless you were near it, unfortunaly the ability to do that was cut from UT2k3.  I could easly make another verson of it which does less damage, beeps, and or can be safely passed with a Anti-Prox.  Postal@PlanetUnreal.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Mini Bulldogs</title>
    <id>1986</id>
    <revision>
      <id>4855</id>
      <timestamp>2006-01-05T06:18:11Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Mini Bulldogs}}

==Inspiration ==

I thought of this after seeing [[Legacy:Bulldog Player|Bulldog Player]] and [[Legacy:Mod Ideas/RunningOfTheBulldogs|Mod Ideas/RunningOfTheBulldogs]].

==Description ==

Rather than make a new game type, I thought it would be amusing to integrate this with other gametypes on standard maps.

When a player first spawns, he chooses whether to spawn as a human, or a Bulldog. (They can change their spawning preference later in the game.)

Player Bulldogs are scaled to be not much larger than humans are, so that they can fit through standard doorways and otherwise go most places humans can go. Whether they get the usual weapons or not (mounted as a turret that follows mouse view?) is a game balance choice, but Bulldogs can deal damage by ramming and running over opponents.

Bulldogs can also self-destruct. If the original Bulldog control code isn't changed much, they can roll and get stuck pretty easily (and the roll command doesn't seem to be reliable), so you need a way to start fresh; and if you don't allow the standard weapons, this provides another way to kill opponents. Of course, it counts against your kills, as suicide always does &amp;ndash; but you've got a better chance of taking someone else out with you. If you kill two or more opponents, you're in front. ;)

Bulldogs wouldn't be able to go everywhere humans can; they might not fit some lifts, or be able to negotiate some stairs; and ladders are out of the question. But they are faster than humans, a bit tougher, and fun to drive aggressively. It would be a matter of teamwork to balance Bulldogs with humans on your team.

In single player deathmatch, you'll just have to learn when to play Bulldog or human &amp;ndash; and if you choose poorly, you can always change your preference and self-destruct...

==Eye Candy ==

For self-destruct, a decent sized explosion leaving behind a couple of bouncing tyres would go down well.

Decals on the Bulldogs for bullet holes, smoke, and other damage indicators would be nice too.

==Related Topics==
* [[Legacy:Bulldog|Bulldog]]
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''GRAF1K:''' Sounds interesting. And may be as simple as &quot;Other.default.Drawscale = 0.5&quot;.

'''MythOpus:''' Nopers.  If you simply change the DrawScale, the tires and body will be misaligned.  You'll have to make a new BullDog Class :)

'''Foxpaw:''' To fix the tires being separate you would have to also change the following variables:

&lt;uscript&gt;
  WheelFrontAlong
  WheelFrontAcross
  WheelRearAlong
  WheelRearAcross
  WheelVert
  DustDrop
  HeadlightCoronaOffset
  DrivingTriggerOffset
  ExitPositions
  RocketFireOffset
&lt;/uscript&gt;

As well it probrably wouldn't hurt to scale the bulldog's mass, center of mass, and wheel torque appropriately. Not sure why DE didn't have those things all scaled by drawscale to begin with, but since they didn't, you'll have to do so manually.

And, for the record, the bulldog starts at drawscale 0.4, so making it 0.5 would actually make it larger - but I think we all knew what you meant anyway. :D

'''MythOpus:''' Making a new Bulldog class will be a lot more fun guys.  I suggest you do it that way ;)</text>
    </revision>
    <revision>
      <id>4856</id>
      <timestamp>2003-11-17T21:03:46Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Mini Bulldogs}}

==Inspiration ==

I thought of this after seeing [[Legacy:Bulldog Player|Bulldog Player]] and [[Legacy:Mod Ideas/RunningOfTheBulldogs|Mod Ideas/RunningOfTheBulldogs]].

==Description ==

Rather than make a new game type, I thought it would be amusing to integrate this with other gametypes on standard maps.

When a player first spawns, he chooses whether to spawn as a human, or a Bulldog. (They can change their spawning preference later in the game.)

Player Bulldogs are scaled to be not much larger than humans are, so that they can fit through standard doorways and otherwise go most places humans can go. Whether they get the usual weapons or not (mounted as a turret that follows mouse view?) is a game balance choice, but Bulldogs can deal damage by ramming and running over opponents.

Bulldogs can also self-destruct. If the original Bulldog control code isn't changed much, they can roll and get stuck pretty easily (and the roll command doesn't seem to be reliable), so you need a way to start fresh; and if you don't allow the standard weapons, this provides another way to kill opponents. Of course, it counts against your kills, as suicide always does &amp;ndash; but you've got a better chance of taking someone else out with you. If you kill two or more opponents, you're in front. ;)

Bulldogs wouldn't be able to go everywhere humans can; they might not fit some lifts, or be able to negotiate some stairs; and ladders are out of the question. But they are faster than humans, a bit tougher, and fun to drive aggressively. It would be a matter of teamwork to balance Bulldogs with humans on your team.

In single player deathmatch, you'll just have to learn when to play Bulldog or human &amp;ndash; and if you choose poorly, you can always change your preference and self-destruct...

==Eye Candy ==

For self-destruct, a decent sized explosion leaving behind a couple of bouncing tyres would go down well.

Decals on the Bulldogs for bullet holes, smoke, and other damage indicators would be nice too.

==Discussion==

'''GRAF1K:''' Sounds interesting. And may be as simple as &quot;Other.default.Drawscale = 0.5&quot;.

'''MythOpus:''' Nopers.  If you simply change the DrawScale, the tires and body will be misaligned.  You'll have to make a new BullDog Class :)

'''Foxpaw:''' To fix the tires being separate you would have to also change the following variables:

&lt;uscript&gt;
  WheelFrontAlong
  WheelFrontAcross
  WheelRearAlong
  WheelRearAcross
  WheelVert
  DustDrop
  HeadlightCoronaOffset
  DrivingTriggerOffset
  ExitPositions
  RocketFireOffset
&lt;/uscript&gt;

As well it probrably wouldn't hurt to scale the bulldog's mass, center of mass, and wheel torque appropriately. Not sure why DE didn't have those things all scaled by drawscale to begin with, but since they didn't, you'll have to do so manually.

And, for the record, the bulldog starts at drawscale 0.4, so making it 0.5 would actually make it larger - but I think we all knew what you meant anyway. :D</text>
    </revision>
    <revision>
      <id>4857</id>
      <timestamp>2003-11-18T01:34:50Z</timestamp>
      <contributor>
        <ip>Hsdbrg64-110-209-169.sasknet.sk.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Mini Bulldogs}}

==Inspiration ==

I thought of this after seeing [[Legacy:Bulldog Player|Bulldog Player]] and [[Legacy:Mod Ideas/RunningOfTheBulldogs|Mod Ideas/RunningOfTheBulldogs]].

==Description ==

Rather than make a new game type, I thought it would be amusing to integrate this with other gametypes on standard maps.

When a player first spawns, he chooses whether to spawn as a human, or a Bulldog. (They can change their spawning preference later in the game.)

Player Bulldogs are scaled to be not much larger than humans are, so that they can fit through standard doorways and otherwise go most places humans can go. Whether they get the usual weapons or not (mounted as a turret that follows mouse view?) is a game balance choice, but Bulldogs can deal damage by ramming and running over opponents.

Bulldogs can also self-destruct. If the original Bulldog control code isn't changed much, they can roll and get stuck pretty easily (and the roll command doesn't seem to be reliable), so you need a way to start fresh; and if you don't allow the standard weapons, this provides another way to kill opponents. Of course, it counts against your kills, as suicide always does &amp;ndash; but you've got a better chance of taking someone else out with you. If you kill two or more opponents, you're in front. ;)

Bulldogs wouldn't be able to go everywhere humans can; they might not fit some lifts, or be able to negotiate some stairs; and ladders are out of the question. But they are faster than humans, a bit tougher, and fun to drive aggressively. It would be a matter of teamwork to balance Bulldogs with humans on your team.

In single player deathmatch, you'll just have to learn when to play Bulldog or human &amp;ndash; and if you choose poorly, you can always change your preference and self-destruct...

==Eye Candy ==

For self-destruct, a decent sized explosion leaving behind a couple of bouncing tyres would go down well.

Decals on the Bulldogs for bullet holes, smoke, and other damage indicators would be nice too.

==Discussion==

'''GRAF1K:''' Sounds interesting. And may be as simple as &quot;Other.default.Drawscale = 0.5&quot;.

'''MythOpus:''' Nopers.  If you simply change the DrawScale, the tires and body will be misaligned.  You'll have to make a new BullDog Class :)

'''Foxpaw:''' To fix the tires being separate you would have to also change the following variables:

&lt;uscript&gt;
  WheelFrontAlong
  WheelFrontAcross
  WheelRearAlong
  WheelRearAcross
  WheelVert
  DustDrop
  HeadlightCoronaOffset
  DrivingTriggerOffset
  ExitPositions
  RocketFireOffset
&lt;/uscript&gt;

As well it probrably wouldn't hurt to scale the bulldog's mass, center of mass, and wheel torque appropriately. Not sure why DE didn't have those things all scaled by drawscale to begin with, but since they didn't, you'll have to do so manually.

And, for the record, the bulldog starts at drawscale 0.4, so making it 0.5 would actually make it larger - but I think we all knew what you meant anyway. :D

'''MythOpus:''' Making a new Bulldog class will be a lot more fun guys.  I suggest you do it that way ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Minions</title>
    <id>2021</id>
    <revision>
      <id>4932</id>
      <timestamp>2007-08-10T02:15:45Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Minions ==

==Description ==

Minions is a team-based multiplayer game. There are 2 teams, both of which are led by a Summoner who acts like a commander and orchestrates their attacks. The rest of the players are Minions, who are various monsters that act out(or not) the Summoners plan. The summoner is chosen at random(if set at random) and the rest of the players are split up evenly. Then the Minions choose their type and when everyone is decided, or the timers runs out the game begins.

==Objective and Gameplay ==

'''Summoner'''

The summoner is a medium speed human player who has a larger minimap and can see all of his team's players wherever they are on the map. The summoner only has one objective, to survive the opponent's Minions until his Minions can kill the other Summoner. The summoner has an area of healing around him that heals his own Minions and can use his staff to hurt opposing Minions in a pinch and can also place down an altar where Minions can respawn. The summoner can speak to all of his team mates at the same time or individually to coordinate them to attack his opponents.If the Summoner dies his team looses the game.

'''Minions'''

The Minions have a slightly easier job than the Summoner, they must either a:seek out the opposing Summoner or b:they guard their Summoner by killing opposing Minions. There are many types of Minions(detailed below)who all have different roles, weapons, strengths, and weaknesses. Minions can only talk to other Minions who are close to them and overall rely on the Summoner to direct them. When a Minion dies the player is put on a que to respawn and when the timer is up the Minion respawns at an altar that the Summoner has placed down.

==Minion Species(types) ==

The Minions are the Summoner's army and all have a role to fill, should a player not like the Minion they are using they can choose a new type when they respawn.

'''Orc'''

The Orc is the basic attack force of the Summoner's army, being strong and durable. The orc is well armored and has the most health of all the Minions. The Orc is equipped with a Battle Axe which can be used in fast, weak swings, or slow powerful swings,and a Crossbow which can fire from 1 to 5 bolts depending on how long the trigger is held.The Orc looks like your generic 6 foot tall, green-skinned man with red eyes and tusks and an axe, it also has spikes coming out of it's spine.

'''Imp'''

The imp is a small fast scout Minion with low health and a low profile. The Imp can jump very high and takes half as much falling damage as other Minions.The Imp has the special power to turn invisible for periods of time, although this uses mana, and can also do a lunging attack with it's claws to defend itself.The imp is a small gray demon-like creature with horns and ripped wings.

'''Gel Cube'''

The Gel Cube is a lumbering mass of blue gel in a roughly cubic shape(go figure). The Gel Cube is slow and well armored with slightly less health than the Orc, the Cube can also be walked through, albiet the Minion doing so will be slowed and damaged the further in it is. The Gel Cube has only one attack, it touches opposing Minions and damages them with digestive fluids, the fluids do more damage the further the Minion is in the cube, for example, a Minion touching it would take minor damage, whereas a unit in the center of the cube would be killed very quickly. The Gel Cube serves as a roadblock or a meat shield for weaker Minions.

'''Fury'''

The fury is this mod's version of a sniper. The fury is a lightly armored Minion that can shoot hitscan beams of fire from it's hands at a slow rate  or weaker fire blasts at a much faster rate, the Fury has only a limited supply of fire although, so it cannot fire constantly. The hitscan blast uses up a whole mana(firepower) bar while the fireblasts use only a small part.The fury looks like a female being made of fire in black wrappings that cover most of it's body.

'''Wisp'''

The Wisp is a small white orb of light with a see-through core and calm eyes that acts as a medic. The Wisp's first attack shoots a fast line of white healing energy forward that goes though Minions but not walls and heals allied Minions, the Wisp's second move it a short range 'pulse' healing that must be activated, this heals much more health that the beam but to get any healing out of it an allied Minion must be close to the Wisp. The wisp has low health and armor but moves as fast as the Imp so it can get out of harms way quickly.

'''Iron Golem'''

The Iron Golem is a large suit of black and red armor with a large black crossbow built into it's arm with lots of health and armor but slow movement. The Iron Golem serves as heavy artillery with it's crossbow which can fire either huge explosive bolts that can be seen in the air due to the firey effects and dodged by a competent player, or a faster slightly smaller ballista bolt that can kill in a single hit and impale multiple enemy Minions, or even the allied Minions if friendly fire is on. The Iron Golem will fall apart if it hits the ground from too high a cliff, if will rebuild itself but it will take time where it is an easy kill.

'''Necroshade'''

The Necroshade is a stealth Minion with useful abilities. The necroshade moves slightly slower than the Imp and Wisp but is invisible unless it is moving too fast, it's claw attack is an instant-kill if it hits an enemy Minion in the back.(doesn't work on the Summoner because he can see it no matter what)The Necroshade can also create two portals, the first is the entrance portal and takes half the Necroshade's mana to create, the second portal made is the exit portal. Portals cannot be made in the air and there can only be 2 portals per Necroshade at a time, the entrance and the exit portals. The Necroshade's mana does not regenerate but it can get back the mana used to create a portal by attacking it, this destroys both portals and gives the Necroshade a full Mana bar. The Necroshade looks like a large hunched-over humanoid figure with spindly arms and legs, the face is featureless except for 9 glowing red eyes and a mouth full of sharp teeth. The Necroshade leaves behind a wispy trail of black smoke behind it making it slightly easier to spot, it's eyes also glow in the dark.

==Variables ==

-friendly fire-

-random Summoner selection-

-base health/mana adjustment-

-damage/healing adjustment-

-respawn time and penalties for suicides-

-possible CTF mode where the Summoner holds his team's flag until he is killed and can respawn.-

-turning enemy use of Necroshade portals on/off-

-number of players 3v3 4v4 5v5 6v6 -

===Interested Scriptors ===

==Discussion ==</text>
    </revision>
    <revision>
      <id>4933</id>
      <timestamp>2007-08-10T01:53:43Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Minions ==

==Description ==

Minions is a team-based multiplayer game. There are 2 teams, both of which are led by a Summoner who acts like a commander and orchestrates their attacks. The rest of the players are Minions, who are various monsters that act out(or not) the Summoners plan. The summoner is chosen at random(if set at random) and the rest of the players are split up evenly. Then the Minions choose their type and when everyone is decided, or the timers runs out the game begins.

==Objective and Gameplay ==

'''Summoner'''

The summoner is a medium speed human player who has a larger minimap and can see all of his team's players wherever they are on the map. The summoner only has one objective, to survive the opponent's Minions until his Minions can kill the other Summoner. The summoner has an area of healing around him that heals his own Minions and can use his staff to hurt opposing Minions in a pinch and can also place down an altar where Minions can respawn. The summoner can speak to all of his team mates at the same time or individually to coordinate them to attack his opponents.If the Summoner dies his team looses the game.

'''Minions'''

The Minions have a slightly easier job than the Summoner, they must either a:seek out the opposing Summoner or b:they guard their Summoner by killing opposing Minions. There are many types of Minions(detailed below)who all have different roles, weapons, strengths, and weaknesses. Minions can only talk to other Minions who are close to them and overall rely on the Summoner to direct them. When a Minion dies the player is put on a que to respawn and when the timer is up the Minion respawns at an altar that the Summoner has placed down.

==Minion Species(types) ==

The Minions are the Summoner's army and all have a role to fill, should a player not like the Minion they are using they can choose a new type when they respawn.

'''Orc'''

The Orc is the basic attack force of the Summoner's army, being strong and durable. The orc is well armored and has the most health of all the Minions. The Orc is equipped with a Battle Axe which can be used in fast, weak swings, or slow powerful swings,and a Crossbow which can fire from 1 to 5 bolts depending on how long the trigger is held.The Orc looks like your generic 6 foot tall, green-skinned man with red eyes and tusks and an axe, it also has spikes coming out of it's spine.

'''Imp'''

The imp is a small fast scout Minion with low health and a low profile. The Imp can jump very high and takes half as much falling damage as other Minions.The Imp has the special power to turn invisible for periods of time, although this uses mana, and can also do a lunging attack with it's claws to defend itself.The imp is a small gray demon-like creature with horns and ripped wings.

'''Gel Cube'''

The Gel Cube is a lumbering mass of blue gel in a roughly cubic shape(go figure). The Gel Cube is slow and well armored with slightly less health than the Orc, the Cube can also be walked through, albiet the Minion doing so will be slowed and damaged the further in it is. The Gel Cube has only one attack, it touches opposing Minions and damages them with digestive fluids, the fluids do more damage the further the Minion is in the cube, for example, a Minion touching it would take minor damage, whereas a unit in the center of the cube would be killed very quickly. The Gel Cube serves as a roadblock or a meat shield for weaker Minions.

'''Fury'''

The fury is this mod's version of a sniper. The fury is a lightly armored Minion that can shoot hitscan beams of fire from it's hands at a slow rate  or weaker fire blasts at a much faster rate, the Fury has only a limited supply of fire although, so it cannot fire constantly. The hitscan blast uses up a whole mana(firepower) bar while the fireblasts use only a small part.The fury looks like a female being made of fire in black wrappings that cover most of it's body.

'''Wisp'''

The Wisp is a small white orb of light with a see-through core and calm eyes that acts as a medic. The Wisp's first attack shoots a fast line of white healing energy forward that goes though Minions but not walls and heals allied Minions, the Wisp's second move it a short range 'pulse' healing that must be activated, this heals much more health that the beam but to get any healing out of it an allied Minion must be close to the Wisp. The wisp has low health and armor but moves as fast as the Imp so it can get out of harms way quickly.

'''Iron Golem'''

The Iron Golem is a large suit of black and red armor with a large black crossbow built into it's arm with lots of health and armor but slow movement. The Iron Golem serves as heavy artillery with it's crossbow which can fire either huge explosive bolts that can be seen in the air due to the firey effects and dodged by a competent player, or a faster slightly smaller ballista bolt that can kill in a single hit and impale multiple enemy Minions, or even the allied Minions if friendly fire is on. The Iron Golem will fall apart if it hits the ground from too high a cliff, if will rebuild itself but it will take time where it is an easy kill.

'''Necroshade'''

The Necroshade is a stealth Minion with useful abilities. The necroshade moves slightly slower than the Imp and Wisp but is invisible unless it is moving too fast, it's claw attack is an instant-kill if it hits an enemy Minion in the back.(doesn't work on the Summoner because he can see it no matter what)The Necroshade can also create two portals, the first is the entrance portal and takes half the Necroshade's mana to create, the second portal made is the exit portal. Portals cannot be made in the air and there can only be 2 portals per Necroshade at a time, the entrance and the exit portals. The Necroshade's mana does not regenerate but it can get back the mana used to create a portal by attacking it, this destroys both portals and gives the Necroshade a full Mana bar. The Necroshade looks like a large hunched-over humanoid figure with spindly arms and legs, the face is featureless except for 9 glowing red eyes and a mouth full of sharp teeth. The Necroshade leaves behind a wispy trail of black smoke behind it making it slightly easier to spot, it's eyes also glow in the dark.

==Variables ==

-friendly fire-

-random Summoner selection-

-base health/mana adjustment-

-damage/healing adjustment-

-respawn time and penalties for suicides-

-possible CTF mode where the Summoner holds his team's flag until he is killed and can respawn.-

-turning enemy use of Necroshade portals on/off-

-number of players 3v3 4v4 5v5 6v6 -

if anyone would like to make this mod or models for it please post it on this page</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/MonkeyKnifeFight</title>
    <id>1961</id>
    <revision>
      <id>4801</id>
      <timestamp>2003-12-12T15:02:46Z</timestamp>
      <contributor>
        <ip>Dhcp024-208-195-138.indy.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This gametype would use normal DM maps and playermodels.  The only change is that the playermodels would be 1/4-1/2 normal size, jump about twice as high as normal (but quickly), and wield knives.  Ideally, this would be extremely bloody and violent, but also hilariously entertaining.

Roadmap:

0.10.x - Implement size, jumping, and melee weapon as separate mutators.

0.20.x - Combine into gametype.

0.30.x - New models?

===Comments ===

'''Legal:''' Me like! :)

'''Buddah Stalin:''' Simpsons did it!</text>
    </revision>
    <revision>
      <id>4802</id>
      <timestamp>2003-04-04T20:51:59Z</timestamp>
      <contributor>
        <ip>LegalAssassin</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This gametype would use normal DM maps and playermodels.  The only change is that the playermodels would be 1/4-1/2 normal size, jump about twice as high as normal (but quickly), and wield knives.  Ideally, this would be extremely bloody and violent, but also hilariously entertaining.

Roadmap:

0.10.x - Implement size, jumping, and melee weapon as separate mutators.

0.20.x - Combine into gametype.

0.30.x - New models?

===Comments ===

'''Legal:''' Me like! :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/MovementTrainer</title>
    <id>1877</id>
    <revision>
      <id>4605</id>
      <timestamp>2003-01-28T17:31:37Z</timestamp>
      <contributor>
        <ip>Piglet</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Movement and Weapons Trainer}}

==Description ==

The idea here is to allow people to practice their movement and aiming skills in a structured manner and provide feedback on how well they accomplished each of the &quot;training&quot; tasks.  The training tasks should include the following:
* All combinations of jumping (allegedly one jump, one dodge, jump-jump, jump-dodge, dodge-jump, dodge-dodge, wall jump)
* Firing all weapons at pop up/moving targets from a static (or small area)
* Firing all weapons at pop up/moving targets while on the move (including combo and headshot tasks).
* Teleportation practice (including double-teleporting).

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:''' Inspired by the Half-Life &quot;Hazard Course&quot;.  I wonder if you could create a team based ''assault course'' race where two teams have to complete a set course really quickly and eradicate all targets on the way (but not the opposition.

'''Piglet:''' To me the idea of a assault race is much more intresting, however i think it would be better if the two teams could shoot at each other etc on the way to their goal, as well as facing obstacles, they would 'run' the same path

'''EntropicLqd:''' If the players only had the default weapons (assault rifle and sheild gun), either with infinite ammo or ammo on route, that would probably work.  The Assault rifle does little damage and is fairly innefective, but can be used to inconvenience players on the other team.  I'm not sure running the &quot;same&quot; route would be a good idea.  Maybe having the routes side by side would work.

'''Piglet:''' I think you could have more weapons if you put some of them slightly off route, and i still think one route courses would work, you'd just need to be somewhat careful with the maps</text>
    </revision>
    <revision>
      <id>4606</id>
      <timestamp>2003-01-28T10:39:08Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>added to discussion</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Movement and Weapons Trainer}}

==Description ==

The idea here is to allow people to practice their movement and aiming skills in a structured manner and provide feedback on how well they accomplished each of the &quot;training&quot; tasks.  The training tasks should include the following:
* All combinations of jumping (allegedly one jump, one dodge, jump-jump, jump-dodge, dodge-jump, dodge-dodge, wall jump)
* Firing all weapons at pop up/moving targets from a static (or small area)
* Firing all weapons at pop up/moving targets while on the move (including combo and headshot tasks).
* Teleportation practice (including double-teleporting).

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:''' Inspired by the Half-Life &quot;Hazard Course&quot;.  I wonder if you could create a team based ''assault course'' race where two teams have to complete a set course really quickly and eradicate all targets on the way (but not the opposition.

'''Piglet:''' To me the idea of a assault race is much more intresting, however i think it would be better if the two teams could shoot at each other etc on the way to their goal, as well as facing obstacles, they would 'run' the same path

'''EntropicLqd:''' If the players only had the default weapons (assault rifle and sheild gun), either with infinite ammo or ammo on route, that would probably work.  The Assault rifle does little damage and is fairly innefective, but can be used to inconvenience players on the other team.  I'm not sure running the &quot;same&quot; route would be a good idea.  Maybe having the routes side by side would work.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Multi Team UT2003</title>
    <id>1931</id>
    <revision>
      <id>4730</id>
      <timestamp>2003-08-08T19:13:32Z</timestamp>
      <contributor>
        <ip>WebcacheH03a.cache.pol.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Mod ideas for UT 2003 – Multi-Team UT2003 ==

===Description ===

The basic concept here is to add support in UT2003 for up to, hopefully, 6 teams. The basic &quot;core&quot; mod might have the models/skins/whatever needed to actually display the characters, an interface setup, and then seperate GameType dependent code. It's possible basic DeathMatch code could be written which could be built upon by subsequent gametypes. HUD and other scoring issues for DeathMatch might be reusable as well, or maybe they wouldn't, I don't know enough about [[Legacy:UT2003|UT2003]] right now to know that.

Anyways, the whole idea here would be kind of similar to the OldSkool mod for UT: Additional mods can be built on top of the mod. Sort of like a utility mod, although it has its own basic elements that can be played on their own.

My idea for 6 team colors are:
# Red
# Blue
# Green
# Yellow/Gold
# Purple
# Orange

I suggest those colors just because they are the 3 primary pigment colors and their 3 products that every board game ever made is based on. Support for the &quot;None&quot; or &quot;Gray&quot; team might also be added for DeathMatch.

===Interested Scripters ===

If you are interested in developing this mod for UT2003 then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.

I'm [[Legacy:Spad-XIII|Spad-XIII]] willing to check it out. Right now I still have no knowledge of [[Legacy:UT2003|UT2003]] coding, but that will come soon enough. I think it'll be fun to learn the various parts of UT2k3 modding through this idea. If anyone is interested in lending a hand, let me know.

I'm [[Legacy:Daid303|Daid303]] and i'm willing to help you Spad-XIII, :)

Looks like [[Legacy:NickR|NickR]] made a version of 4 TDM

===Discussion ===

'''El Muerte TDS:''' Team support has been pretty much hardcoded in UT2003, so a lot of classes will need updating, since most team checking is done by !myTeam

'''Daid303:''' Yeah, and the HUD also supports 2 team colors, and those are Native Coded, so you would have to fix a way around that.

'''RegularX:''' Unfortunately, the gametype hierarchy isn't quite as clean as it seems, so you won't be able to just stack the changes on top of each other.  If you are tackling this, worry about TDM first, and then CTF, etc.  The mod project I'm working on, Freehold NG, is planning on at least one gt with 3 teams, and perhaps support for 4 on others.  I've only done some periphery look at it right now, but I may try getting a test working soon.  If I have any success I'll bundle it up into a non-FHNG package and let you guys know.

'''Icedude:''' the team support for bombing run is kind of there, if you set a goal's team to team 2 instead of 0 or 1, it says it's gold team's goal, and team 3 sets it to green team</text>
    </revision>
    <revision>
      <id>4731</id>
      <timestamp>2003-07-16T11:41:42Z</timestamp>
      <contributor>
        <ip>Spaddie.xs4all.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Mod ideas for UT 2003 – Multi-Team UT2003 ==

===Description ===

The basic concept here is to add support in UT2003 for up to, hopefully, 6 teams. The basic &quot;core&quot; mod might have the models/skins/whatever needed to actually display the characters, an interface setup, and then seperate GameType dependent code. It's possible basic DeathMatch code could be written which could be built upon by subsequent gametypes. HUD and other scoring issues for DeathMatch might be reusable as well, or maybe they wouldn't, I don't know enough about [[Legacy:UT2003|UT2003]] right now to know that.

Anyways, the whole idea here would be kind of similar to the OldSkool mod for UT: Additional mods can be built on top of the mod. Sort of like a utility mod, although it has its own basic elements that can be played on their own.

My idea for 6 team colors are:
# Red
# Blue
# Green
# Yellow/Gold
# Purple
# Orange

I suggest those colors just because they are the 3 primary pigment colors and their 3 products that every board game ever made is based on. Support for the &quot;None&quot; or &quot;Gray&quot; team might also be added for DeathMatch.

===Interested Scripters ===

If you are interested in developing this mod for UT2003 then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.

I'm [[Legacy:Spad-XIII|Spad-XIII]] willing to check it out. Right now I still have no knowledge of [[Legacy:UT2003|UT2003]] coding, but that will come soon enough. I think it'll be fun to learn the various parts of UT2k3 modding through this idea. If anyone is interested in lending a hand, let me know.

I'm [[Legacy:Daid303|Daid303]] and i'm willing to help you Spad-XIII, :)

Looks like [[Legacy:NickR|NickR]] made a version of 4 TDM

===Discussion ===

'''El Muerte TDS:''' Team support has been pretty much hardcoded in UT2003, so a lot of classes will need updating, since most team checking is done by !myTeam

'''Daid303:''' Yeah, and the HUD also supports 2 team colors, and those are Native Coded, so you would have to fix a way around that.

'''RegularX:''' Unfortunately, the gametype hierarchy isn't quite as clean as it seems, so you won't be able to just stack the changes on top of each other.  If you are tackling this, worry about TDM first, and then CTF, etc.  The mod project I'm working on, Freehold NG, is planning on at least one gt with 3 teams, and perhaps support for 4 on others.  I've only done some periphery look at it right now, but I may try getting a test working soon.  If I have any success I'll bundle it up into a non-FHNG package and let you guys know.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/MultiCTF</title>
    <id>1904</id>
    <revision>
      <id>4669</id>
      <timestamp>2004-11-30T23:02:13Z</timestamp>
      <contributor>
        <ip>Uncommon.dsl.xmission.com</ip>
      </contributor>
      <comment>linkage :)</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Multi-Team CTF}}

==Description ==

This mod was done by at least three different teams for Unreal Tournament. What I'd like to do for UT2003 is get one definitive mod so that we don't suffer a fractured and collapsed community like there was in UT.

The basic idea of the mod is quite simple, although some of the details about scoring and gameplay are a lot more complex. In essence, this is just capture the flag with an extra team or two. In UT the extra teams were Green and Gold, and it's reasonable to assume that UT2003 will have similar, if not exactly the same, team colors, so it shouldn't be too hard to do this. 

Scoring is probably the most complex part of having multiple teams. I'm not sure how CTF+ handled this, CTF4 handled this by just giving you every conceivable scoring option and letting people decide on their own. MCTF did this by having &quot;reverse&quot; scoring, when you cap you give a point to the team you capped on, and a team is out when they reach the &quot;cap limit&quot;. I propose that for a UT2003 mod we pick ''one and only one'' of these to do, because multiple options just splits up the (hopefully not too few) players the mod has.

Ok, to wrap it up the idea of this mod has already been much thought over, and obviously there are differences of opinion about how this should be handled. I think UT2003 is a great opportunity to take the seperate mods and combine them together, hopefully with everyone working together on it but at the very least only having one mod.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

===Discussion ===

'''Birelli:''' I don't know enough scripting to do this, if I did I'd be the first (ok maybe behind Ciggie) to jump in and code the mod. What me and Ciggie would like to do is run the website for uploading maps and a few reviews and stuff. Basically be the promotion/website guys. While I know a mod with &quot;only a website&quot; is a horrible thing, I know that Uncommon (made CTF4), Wyzard (made MCTF), and whoever all did CTF+, I'm not all that clear on that, are out there and might be interested in doing this.

'''Mychaeel:''' I heard (but can't confirm) that UT2003 doesn't support more than two teams in general.  If that's true, I don't know how much of that limitation is hard-coded into the game though.

'''EntropicLqd:'''
: I did CTF+.  There were two features in CTF+ that were very cool.  The first was the ability to mix 2, 3, and 4 team maps in the same map rotation.  The number of teams on each map always matched the number of flags.  The second feature was the single flag mode.  The scoring in CTF+ followed the traditional CTF scoring mechanism - the team with the most caps wins.
: The single flag mode is really worthy of its own game type as the maps in which it works well are way more open than traditional CTF maps - defending the base needs to be '''really''' hard.  There are also AI changes that need to be made to ensure the bots play like people.  I have a sneaky suspicion that the double domination maps will play better for single flag CTF as the control points are probably harder to defend (and more open) than the standard CTF ones.
: In terms of scoring I really didn't like the last-team-standing idea that MCTF used.  I hate being out of play in ''spectator'' mode - it's boring.  Although I vaguely remember an option to reassign players of a losing team to other teams still in play.
: AFAIK Uncommon has never been interested in a combined Multi-team CTF mod as he doesn't feel that there is enough work there to support more than one developer.  I'm still not completely convinced about the actual gameplay of a multi-team CTF mod.  It always seemed to me that the maps were too big for the number of players (typically 6-12) playing on the map, and more often that not it was simply a 4 way 2v2 CTF game.  I was always neve convinced about the HUD (but that was probably just a failing of CTF+).  However, your real problem with a multi-team CTF mod is figuring out which set of options to include and which set of options to drop.  There are so many different ways in which you could handle scoring and captures (including carry the flag, target captures etc) that working out the set to include is going to be very difficult.  Otherwise, as Birelli has already observed, the player base gets fractured into different segments who prefer different rule settings.

'''Tarquin:''' It's a difficult choice: if the team here choose one particular set of rules, another team may form to offer a variant. :(

'''DJPaul:'''  Could the &quot;core&quot; mod have a sort of sub-atomic wiki support, that changes the rule sets?

'''Mychaeel:''' What about creating some sort of plug-in architecture for scoring purposes?  Like mutators, server admins could run a certain set of scoring (and possibly other) rules with the base game type which all maps are compatible with.  Thinking further, creating a voting tool for those plug-ins wouldn't be an issue either.

'''EntropicLqd:'''  Do we know what other types of &quot;plugin&quot; classes are available in UT2003 besides mutators?  Having a set of mutators to turn scoring elements and game features on and off is a workable idea.  It would need some careful thought and you'd have to create your own mutator class with all of the callbacks you could conceivably need, but definately workable.

'''Wormbo:''' Mutators seem to have lost some of their power (I didn't see any DamageMutator, MessageMutator or HUD mutator functions), but there's a new class called GameRules which creates a linked list like the mutators. Some features of the mutators have been moved to this class, but there are also new ones. Those rules seem are added in &lt;code&gt;InitGame()&lt;/code&gt; right before the mutators are spawned. You should download the XIIIEd (the new UnrealEd) and export the classes. A lot of stuff has changed.

'''Mychaeel:''' Yes, you're right; they split the concept of mutators into a number of different similar concepts that take care of different aspects of the game each.

'''Birelli:''' Ok, I have relatives over and I haven't been online too much. If UT2003 doesn't have, for instance, skin colors for 4 different teams, or any kind of support for more than two teams at all, 4-way CTF would probably too much of a hassle to make work. Personally I liked the potential that DOM in UT has for multiple teams, I'd hate to see all of that go. Anyways, the thing about mutators and dropping things in and out isn't my problem with multiple scoring systems. The mod menu really isn't all that much different from a set of mutators (user-end anyways, I know that it's completely different code-wise). The problem with multiple scoring systems is the potential for having different servers with different settings (which UT had really no interface to communicate about through the server browser), and having that be a major online fragmentation, you need one package with essentially one set of rules, so that people not want to play on a server because it is as different from what they want to play as instagib is to normal weapons, which some of the scoring variations at least in CTF4 definitely had the potential to do. As Tarquin said though, if you don't make lots of options people will probably make other mods, as happened in UT. 

Anyways, I guess this mod is definitely on hold for even talk of development until UT2003 comes out, because of the potential that it will be virtually impossible to do anyways.

{{innerbox| '''Mychaeel:''' What about creating some sort of plug-in architecture for scoring purposes?  Like mutators...

}}

'''DJPaul:''' That's what I meant when I said: &quot;Could the &quot;core&quot; mod have a sort of sub-atomic wiki support, that changes the rule sets?&quot; - wiki was a typo for mutator :D

'''EntropicLqd:'''  The plug-in idea for scoring and rules is a nice one.  When we get the code we'll see how feasible it is.  Since UT2003 has completely ditched team coloured skins in favour of these shoulder carried lights adding support for multiple teams shouldn't be too hard.  It'll be the AI implications and the alternate path re-coding that might take a bit of work.  If we were going to do it I'd want to make the single flag mod compatable with the multiple team stuff - Probably wind up duplicating the code between the mods though :/

'''Birelli:''' I suppose the way this should be approached is first making a multi-team mod (maybe six with purple and orange too? If you make it work for four teams then six should be a pretty natural extension right? Anyways, this could be released as a complete mod package for use in DeathMatch and even DoubleDomination (although that might have to be an even additional mod what with control point logos and all). AI would probably have to be individual mod-based, but AI tends to be that way anyways. I'm thinking this multi-team mod would have the skins, models, whatever, and support for 6 colors in the &quot;player color&quot; menu etc. I'm sure there's some more interface stuff there as well. I guess I should make up a mod page for this.

Anyways, once that's up and running making mods such as this shouldn't be any harder than they were in UT.

'''Draconx:''' In my opinion, regardless - a multi-team CTF mod of any use to me would have to have a) At least some way to play with reverse scoring, and b) a carry flags back option.  BTW - is there better way to post these comments besides the Edit Text Of This Page button?

'''Wormbo:''' Nope, editing the page is the (only) Wiki way. :)

'''Draconx:''' Well - I'd say to get this mod running we should listen to Birelli, and start by creating a 4-team mod.  This is my area of non-expertise, my area is with creating map actors and mutators and the like.  For after a four-team mod has been launched, I've compiled a pack of textures for the green and gold flagbases. Hope thats helpful!

http://www.deadjunkie.com/~draconx/downloads/files/mctftex.zip

'''Draconx:''' I updated that file - it had a problem, which was, the flags didnt have any alpha.  That should be fixed now.

'''NickR:''' A CTF4 petition was start on the Atari Forums here - http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=302286 When I saw the post I decided to have a go and I have been sucessfull in creating a 4 team gamemode for UT2003. I haven't added new player skins for the Green and Yellow team, but I will change the enemy names that pop up on your corsshair to their team colour. Everything is done except for that and the Scoreboard. I plan to release a build when its done and hopefully enough people will play it and give me feedback on it as well as any bugs they happen to come across. Once that is done I'll start on 4 team capture the flag.

'''Foxpaw:''' I think that all of the above suggestions are implementable... The team thing is also quite readily possible but it requires rewriting almost all of the gameinfo - you couldn't do it easily by just subclassing CTFGame. The team index of a player would allow up to 255 teams, plus one for spectators. If you just use the pointer to that players team object, you could have a theoretically unlimited number of teams. Though since the number of players is limited, the value of this is questionable. :P The problem with adding more team color support to skins is that you would have to manually convert every skin you knew of and offer that for download - user made skins would still be using just the two team colors. Some don't even have those implemented due to the common belief that team skins no longer exist. (Which they do, they're just harder to see.) It may be possible to 'tint' the coloration of the entire skin, though I'm not sure if that would be the best solution. I am not a big fan of the shoulder coronas, in fact I don't like them at all, but they may be a better method of distiguishing teams.

'''RegularX:''' You could also force the members of a specific team to have the same mesh/skin which could likeise distinct them or at least cut down the workload of trying to create custom skins.  This was actually the reason that lead [[Legacy:Making_A_Class-Based_Mod | Riftwar]] to being class based.  Riftwar's code is, I'm assuming you know, free to download/drift through/borrow.

'''NickR:''' On the thread I posted Mr. Evil came up with a suggestion that might be able to get around the team skin problem. We could use the ColorModifier. You can use it just like FinalBlend and maybe with a mask or something we can just alter parts of a skins color and that would give us programming control over the skin colors, which would give us a wide color palette to choose from.

Anyway about the progress I'm making on the 4 team deathmatch mode. I'm working on a new custom bot config page and new player settings page to give the extra 2 team support. I only need to get the Linkgun and Shieldgun 4 team compatible aswell as make a better looking scoreboard which is just a deathmatch version with the team number info for each player. I'm still getting a lot of Accessed Nones with bot related functions. I believe this to be a Squad problem. I'm looking into it.

'''EntropicLqd:''' Don't forget about the team-coloured Instagib beams.

'''NickR:''' Thanks for the reminder. 

'''NickR:''' My 4tdm gametype &quot;Quad Team DeathMatch&quot; is now available. 

'''OverloadUT:''' [http://CTF4.apartment167.com CTF4 for UT2004] has been released, which is pretty much exactly what this Mod Idea is.  And believe me, almost EVERYTHING in UT2004 is hard coded to 2 teams.  I had to replace pretty much every major class to make this work.  (Pawn, PlayerController, Flags, HUD, AI, Console...)

'''Wormbo:''' I didn't check the sources yet, but did you create something like a generic four team support and base your gametypes off of that or did you only integrate it into your gametypes?

'''OverloadUT:''' Oh, I would never forgive myself if I had done it the latter way!  Yes, I build a gameclass that adds generic support for four teams, and then TDM4 and CTF4 are both subclasses of that class.  Uncommon is also developing [http://uncommonplace.com/games/br4.html BR4], which relies on the OLTeamGames (CTF4) code.  My goal from the beginning was to allow other mod developers to build 4 team gametypes on top of my code.

'''Birelli:''' Yeah, CTF4 is exactly what I was asking for with this. It's been a long time since I made this up in the hopes of getting a mod going for the new gen (before we even had UT2003), but it's nice to see the 4-way CTF gametype come through. Who knows, maybe I'll get some free time (heh) and do some mapping, it's where I started back in UT.</text>
    </revision>
    <revision>
      <id>4670</id>
      <timestamp>2004-11-30T22:41:01Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Multi-Team CTF}}

==Description ==

This mod was done by at least three different teams for Unreal Tournament. What I'd like to do for UT2003 is get one definitive mod so that we don't suffer a fractured and collapsed community like there was in UT.

The basic idea of the mod is quite simple, although some of the details about scoring and gameplay are a lot more complex. In essence, this is just capture the flag with an extra team or two. In UT the extra teams were Green and Gold, and it's reasonable to assume that UT2003 will have similar, if not exactly the same, team colors, so it shouldn't be too hard to do this. 

Scoring is probably the most complex part of having multiple teams. I'm not sure how CTF+ handled this, CTF4 handled this by just giving you every conceivable scoring option and letting people decide on their own. MCTF did this by having &quot;reverse&quot; scoring, when you cap you give a point to the team you capped on, and a team is out when they reach the &quot;cap limit&quot;. I propose that for a UT2003 mod we pick ''one and only one'' of these to do, because multiple options just splits up the (hopefully not too few) players the mod has.

Ok, to wrap it up the idea of this mod has already been much thought over, and obviously there are differences of opinion about how this should be handled. I think UT2003 is a great opportunity to take the seperate mods and combine them together, hopefully with everyone working together on it but at the very least only having one mod.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

===Discussion ===

'''Birelli:''' I don't know enough scripting to do this, if I did I'd be the first (ok maybe behind Ciggie) to jump in and code the mod. What me and Ciggie would like to do is run the website for uploading maps and a few reviews and stuff. Basically be the promotion/website guys. While I know a mod with &quot;only a website&quot; is a horrible thing, I know that Uncommon (made CTF4), Wyzard (made MCTF), and whoever all did CTF+, I'm not all that clear on that, are out there and might be interested in doing this.

'''Mychaeel:''' I heard (but can't confirm) that UT2003 doesn't support more than two teams in general.  If that's true, I don't know how much of that limitation is hard-coded into the game though.

'''EntropicLqd:'''
: I did CTF+.  There were two features in CTF+ that were very cool.  The first was the ability to mix 2, 3, and 4 team maps in the same map rotation.  The number of teams on each map always matched the number of flags.  The second feature was the single flag mode.  The scoring in CTF+ followed the traditional CTF scoring mechanism - the team with the most caps wins.
: The single flag mode is really worthy of its own game type as the maps in which it works well are way more open than traditional CTF maps - defending the base needs to be '''really''' hard.  There are also AI changes that need to be made to ensure the bots play like people.  I have a sneaky suspicion that the double domination maps will play better for single flag CTF as the control points are probably harder to defend (and more open) than the standard CTF ones.
: In terms of scoring I really didn't like the last-team-standing idea that MCTF used.  I hate being out of play in ''spectator'' mode - it's boring.  Although I vaguely remember an option to reassign players of a losing team to other teams still in play.
: AFAIK Uncommon has never been interested in a combined Multi-team CTF mod as he doesn't feel that there is enough work there to support more than one developer.  I'm still not completely convinced about the actual gameplay of a multi-team CTF mod.  It always seemed to me that the maps were too big for the number of players (typically 6-12) playing on the map, and more often that not it was simply a 4 way 2v2 CTF game.  I was always neve convinced about the HUD (but that was probably just a failing of CTF+).  However, your real problem with a multi-team CTF mod is figuring out which set of options to include and which set of options to drop.  There are so many different ways in which you could handle scoring and captures (including carry the flag, target captures etc) that working out the set to include is going to be very difficult.  Otherwise, as Birelli has already observed, the player base gets fractured into different segments who prefer different rule settings.

'''Tarquin:''' It's a difficult choice: if the team here choose one particular set of rules, another team may form to offer a variant. :(

'''DJPaul:'''  Could the &quot;core&quot; mod have a sort of sub-atomic wiki support, that changes the rule sets?

'''Mychaeel:''' What about creating some sort of plug-in architecture for scoring purposes?  Like mutators, server admins could run a certain set of scoring (and possibly other) rules with the base game type which all maps are compatible with.  Thinking further, creating a voting tool for those plug-ins wouldn't be an issue either.

'''EntropicLqd:'''  Do we know what other types of &quot;plugin&quot; classes are available in UT2003 besides mutators?  Having a set of mutators to turn scoring elements and game features on and off is a workable idea.  It would need some careful thought and you'd have to create your own mutator class with all of the callbacks you could conceivably need, but definately workable.

'''Wormbo:''' Mutators seem to have lost some of their power (I didn't see any DamageMutator, MessageMutator or HUD mutator functions), but there's a new class called GameRules which creates a linked list like the mutators. Some features of the mutators have been moved to this class, but there are also new ones. Those rules seem are added in &lt;code&gt;InitGame()&lt;/code&gt; right before the mutators are spawned. You should download the XIIIEd (the new UnrealEd) and export the classes. A lot of stuff has changed.

'''Mychaeel:''' Yes, you're right; they split the concept of mutators into a number of different similar concepts that take care of different aspects of the game each.

'''Birelli:''' Ok, I have relatives over and I haven't been online too much. If UT2003 doesn't have, for instance, skin colors for 4 different teams, or any kind of support for more than two teams at all, 4-way CTF would probably too much of a hassle to make work. Personally I liked the potential that DOM in UT has for multiple teams, I'd hate to see all of that go. Anyways, the thing about mutators and dropping things in and out isn't my problem with multiple scoring systems. The mod menu really isn't all that much different from a set of mutators (user-end anyways, I know that it's completely different code-wise). The problem with multiple scoring systems is the potential for having different servers with different settings (which UT had really no interface to communicate about through the server browser), and having that be a major online fragmentation, you need one package with essentially one set of rules, so that people not want to play on a server because it is as different from what they want to play as instagib is to normal weapons, which some of the scoring variations at least in CTF4 definitely had the potential to do. As Tarquin said though, if you don't make lots of options people will probably make other mods, as happened in UT. 

Anyways, I guess this mod is definitely on hold for even talk of development until UT2003 comes out, because of the potential that it will be virtually impossible to do anyways.

{{innerbox| '''Mychaeel:''' What about creating some sort of plug-in architecture for scoring purposes?  Like mutators...

}}

'''DJPaul:''' That's what I meant when I said: &quot;Could the &quot;core&quot; mod have a sort of sub-atomic wiki support, that changes the rule sets?&quot; - wiki was a typo for mutator :D

'''EntropicLqd:'''  The plug-in idea for scoring and rules is a nice one.  When we get the code we'll see how feasible it is.  Since UT2003 has completely ditched team coloured skins in favour of these shoulder carried lights adding support for multiple teams shouldn't be too hard.  It'll be the AI implications and the alternate path re-coding that might take a bit of work.  If we were going to do it I'd want to make the single flag mod compatable with the multiple team stuff - Probably wind up duplicating the code between the mods though :/

'''Birelli:''' I suppose the way this should be approached is first making a multi-team mod (maybe six with purple and orange too? If you make it work for four teams then six should be a pretty natural extension right? Anyways, this could be released as a complete mod package for use in DeathMatch and even DoubleDomination (although that might have to be an even additional mod what with control point logos and all). AI would probably have to be individual mod-based, but AI tends to be that way anyways. I'm thinking this multi-team mod would have the skins, models, whatever, and support for 6 colors in the &quot;player color&quot; menu etc. I'm sure there's some more interface stuff there as well. I guess I should make up a mod page for this.

Anyways, once that's up and running making mods such as this shouldn't be any harder than they were in UT.

'''Draconx:''' In my opinion, regardless - a multi-team CTF mod of any use to me would have to have a) At least some way to play with reverse scoring, and b) a carry flags back option.  BTW - is there better way to post these comments besides the Edit Text Of This Page button?

'''Wormbo:''' Nope, editing the page is the (only) Wiki way. :)

'''Draconx:''' Well - I'd say to get this mod running we should listen to Birelli, and start by creating a 4-team mod.  This is my area of non-expertise, my area is with creating map actors and mutators and the like.  For after a four-team mod has been launched, I've compiled a pack of textures for the green and gold flagbases. Hope thats helpful!

http://www.deadjunkie.com/~draconx/downloads/files/mctftex.zip

'''Draconx:''' I updated that file - it had a problem, which was, the flags didnt have any alpha.  That should be fixed now.

'''NickR:''' A CTF4 petition was start on the Atari Forums here - http://www.ina-community.com/forums/showthread.php?s=&amp;threadid=302286 When I saw the post I decided to have a go and I have been sucessfull in creating a 4 team gamemode for UT2003. I haven't added new player skins for the Green and Yellow team, but I will change the enemy names that pop up on your corsshair to their team colour. Everything is done except for that and the Scoreboard. I plan to release a build when its done and hopefully enough people will play it and give me feedback on it as well as any bugs they happen to come across. Once that is done I'll start on 4 team capture the flag.

'''Foxpaw:''' I think that all of the above suggestions are implementable... The team thing is also quite readily possible but it requires rewriting almost all of the gameinfo - you couldn't do it easily by just subclassing CTFGame. The team index of a player would allow up to 255 teams, plus one for spectators. If you just use the pointer to that players team object, you could have a theoretically unlimited number of teams. Though since the number of players is limited, the value of this is questionable. :P The problem with adding more team color support to skins is that you would have to manually convert every skin you knew of and offer that for download - user made skins would still be using just the two team colors. Some don't even have those implemented due to the common belief that team skins no longer exist. (Which they do, they're just harder to see.) It may be possible to 'tint' the coloration of the entire skin, though I'm not sure if that would be the best solution. I am not a big fan of the shoulder coronas, in fact I don't like them at all, but they may be a better method of distiguishing teams.

'''RegularX:''' You could also force the members of a specific team to have the same mesh/skin which could likeise distinct them or at least cut down the workload of trying to create custom skins.  This was actually the reason that lead [[Legacy:Making_A_Class-Based_Mod | Riftwar]] to being class based.  Riftwar's code is, I'm assuming you know, free to download/drift through/borrow.

'''NickR:''' On the thread I posted Mr. Evil came up with a suggestion that might be able to get around the team skin problem. We could use the ColorModifier. You can use it just like FinalBlend and maybe with a mask or something we can just alter parts of a skins color and that would give us programming control over the skin colors, which would give us a wide color palette to choose from.

Anyway about the progress I'm making on the 4 team deathmatch mode. I'm working on a new custom bot config page and new player settings page to give the extra 2 team support. I only need to get the Linkgun and Shieldgun 4 team compatible aswell as make a better looking scoreboard which is just a deathmatch version with the team number info for each player. I'm still getting a lot of Accessed Nones with bot related functions. I believe this to be a Squad problem. I'm looking into it.

'''EntropicLqd:''' Don't forget about the team-coloured Instagib beams.

'''NickR:''' Thanks for the reminder. 

'''NickR:''' My 4tdm gametype &quot;Quad Team DeathMatch&quot; is now available. 

'''OverloadUT:''' [http://CTF4.apartment167.com CTF4 for UT2004] has been released, which is pretty much exactly what this Mod Idea is.  And believe me, almost EVERYTHING in UT2004 is hard coded to 2 teams.  I had to replace pretty much every major class to make this work.  (Pawn, PlayerController, Flags, HUD, AI, Console...)

'''Wormbo:''' I didn't check the sources yet, but did you create something like a generic four team support and base your gametypes off of that or did you only integrate it into your gametypes?

'''OverloadUT:''' Oh, I would never forgive myself if I had done it the latter way!  Yes, I build a gameclass that adds generic support for four teams, and then TDM4 and CTF4 are both subclasses of that class.  Uncommon is also developing BR4, which relies on the OLTeamGames (CTF4) code.  My goal from the beginning was to allow other mod developers to build 4 team gametypes on top of my code.

'''Birelli:''' Yeah, CTF4 is exactly what I was asking for with this. It's been a long time since I made this up in the hopes of getting a mod going for the new gen (before we even had UT2003), but it's nice to see the 4-way CTF gametype come through. Who knows, maybe I'll get some free time (heh) and do some mapping, it's where I started back in UT.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/MutatorShuffler</title>
    <id>1878</id>
    <revision>
      <id>4607</id>
      <timestamp>2002-07-30T06:11:43Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; A Mutator to shuffle mutators}}

==Description ==

This mod is based on an idea by Twigstir from the official UT2003 discussion forum.

Essentially the mutator shuffler will change the mutators applied to a game on a map by map basis.  The mutator shuffler will (just before the start of the game) remove all current mutators, and then add new ones based upon some strange and otherworldy criteria dreamed up by a half-dunk monk separated from society for a few years.

Some ideas for mutator selection are:
; Map based selection. : Mutators are set based upon the name of the map.  So, low grav and jump match could be assigned to Face, and Instagib to Niven.  The actual interface required to set this up might be beyond the capabilities of the new user interface system though.
; Completely random selection : A random number of mutators (randomly selected) are added.  This has the problem observed by Mychaeel below - not all mutators work well in combination.
; List based selection. : Mutators are group into lists (e.g. Arena mutators, Size mutators, Inventory mutators) and one mutator is selected from each list.  It would then be up to the person setting the mutators in each of the lists to ensure that there were no conflicts.  &quot;no mutator from the list&quot; is also a possibility in this case.

Out of the three options specified above the last one &amp;ndash; List based selection &amp;ndash; is probably the easiest to implement.  The new User Interface ''should'' be adequate to the task of setting up the lists since you must be able to set map rotations and select mutators somehow.

I would like to propose support for 5 lists.  One list should contain zero or more mutators that are ''always'' applied to the game, and the other 4 lists should contain groups of mutators that can be randomly selected.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Wormbo:''' Nice idea. Here's what I think: You can move mutators to an &quot;optional mutators&quot; list and specify how many mutators from that list can be added to the game. A minimum and maximum number would be good.

'''Mychaeel:'''  Unfortunately not all mutators are cross-compatible, and even if they are technically they frequently don't work well together.  What about configuring a number of lists and the shuffler takes one mutator of every list?  (Like, a random relic, plus FatBoy or BigBoy, plus Strangelove or Matrix Moves or Low Grav.)

'''EntropicLqd:'''  Lol - I haven't even filled in the description and already I have comments.

'''Mychaeel:'''  The second and third option (&quot;completely random,&quot; &quot;list based&quot;) could be easily combined into a single one.

'''EntropicLqd:''' Only by reducing the number of mutators added, or, building in a certain amount of logic within the shuffler so that it at least has a chance of determining whether a mutator combination is going to conflict or not.  Or can you see an easier way?

'''Mychaeel:'''  I mean conceptually.  The &quot;completely random&quot; option is just a case of the &quot;list based&quot; one with a single list.  What I mean to express is that none of those options are mutually exclusive.  (The first one, &quot;map based,&quot; is just a modifier to the &quot;list based&quot; one too.)

'''The Twiggman''' Ah problems with cross compatablity can be resolved by including some program the will quickly test all possible mutator mix and matches and then sort into lists. (IM AN IDIOT BUT NOT A BAD IDEA)

'''EntropicLqd:'''  ''Mychaeel'' &amp;ndash; yes I see what you were getting at now.  I guess the only difference I would enforce for a completely random mutator combination based on the lists is that you'd only ever have 1 applied at a time to prevent conflicts.  Ultimately map based mutator configuration simply relies on the ability to handle a variable number of lists (persisting that could be a pain).  ''The Twiggman'' &amp;ndash; If you could figure out a way of doing it then it would be a nice idea.  I can think of a few ways of making it work under a small set of circumstances but all of the methods are flawed.

To be fair the reason I'm suggesting that only the list based selection one is supported is because it is possible to have a truly random mutator configuration applied to each map, simply by making the &quot;mandatory list&quot; empty, and populating one or more of the rest of the lists.  While I agree that map based selection is merely list based (with named lists instead of anonymous ones as it were) its the complexity of the user interface and persistence that I'd like to avoid.  That and the fact that I'm not sure people would use the functionality - gamers are a lazy bunch in my experience and very rarely ''play'' with all of the options available.

'''Mychaeel:'''  The trick is to make a bunch of complex options easy to grasp.  That's the goal of successful user interface design.

'''EntropicLqd:'''  Really?  That doesn't seem to be an industry standard point of view :)

'''Mychaeel:'''  Doesn't mean ''we'' don't have to do that either...  :-)</text>
    </revision>
    <revision>
      <id>4608</id>
      <timestamp>2002-07-25T10:20:44Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>lol</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; A Mutator to shuffle mutators}}

This mod is based on an idea by Twigstir from the official UT2003 discussion forum.

Essentially the mutator shuffler will change the mutators applied to a game on a map by map basis.  The mutator shuffler will (just before the start of the game) remove all current mutators, and then add new ones based upon some strange and otherworldy criteria dreamed up by a half-dunk monk separated from society for a few years.

Some ideas for mutator selection are:
; Map based selection. : Mutators are set based upon the name of the map.  So, low grav and jump match could be assigned to Face, and Instagib to Niven.  The actual interface required to set this up might be beyond the capabilities of the new user interface system though.
; Completely random selection : A random number of mutators (randomly selected) are added.  This has the problem observed by Mychaeel below - not all mutators work well in combination.
; List based selection. : Mutators are group into lists (e.g. Arena mutators, Size mutators, Inventory mutators) and one mutator is selected from each list.  It would then be up to the person setting the mutators in each of the lists to ensure that there were no conflicts.  &quot;no mutator from the list&quot; is also a possibility in this case.

Out of the three options specified above the last one &amp;ndash; List based selection &amp;ndash; is probably the easiest to implement.  The new User Interface ''should'' be adequate to the task of setting up the lists since you must be able to set map rotations and select mutators somehow.

I would like to propose support for 5 lists.  One list should contain zero or more mutators that are ''always'' applied to the game, and the other 4 lists should contain groups of mutators that can be randomly selected.

----

==Comments==

'''Wormbo:''' Nice idea. Here's what I think: You can move mutators to an &quot;optional mutators&quot; list and specify how many mutators from that list can be added to the game. A minimum and maximum number would be good.

'''Mychaeel:'''  Unfortunately not all mutators are cross-compatible, and even if they are technically they frequently don't work well together.  What about configuring a number of lists and the shuffler takes one mutator of every list?  (Like, a random relic, plus FatBoy or BigBoy, plus Strangelove or Matrix Moves or Low Grav.)

'''EntropicLqd:'''  Lol - I haven't even filled in the description and already I have comments.

'''Mychaeel:'''  The second and third option (&quot;completely random,&quot; &quot;list based&quot;) could be easily combined into a single one.

'''EntropicLqd:''' Only by reducing the number of mutators added, or, building in a certain amount of logic within the shuffler so that it at least has a chance of determining whether a mutator combination is going to conflict or not.  Or can you see an easier way?

'''Mychaeel:'''  I mean conceptually.  The &quot;completely random&quot; option is just a case of the &quot;list based&quot; one with a single list.  What I mean to express is that none of those options are mutually exclusive.  (The first one, &quot;map based,&quot; is just a modifier to the &quot;list based&quot; one too.)

'''The Twiggman''' Ah problems with cross compatablity can be resolved by including some program the will quickly test all possible mutator mix and matches and then sort into lists. (IM AN IDIOT BUT NOT A BAD IDEA)

'''EntropicLqd:'''  ''Mychaeel'' &amp;ndash; yes I see what you were getting at now.  I guess the only difference I would enforce for a completely random mutator combination based on the lists is that you'd only ever have 1 applied at a time to prevent conflicts.  Ultimately map based mutator configuration simply relies on the ability to handle a variable number of lists (persisting that could be a pain).  ''The Twiggman'' &amp;ndash; If you could figure out a way of doing it then it would be a nice idea.  I can think of a few ways of making it work under a small set of circumstances but all of the methods are flawed.

To be fair the reason I'm suggesting that only the list based selection one is supported is because it is possible to have a truly random mutator configuration applied to each map, simply by making the &quot;mandatory list&quot; empty, and populating one or more of the rest of the lists.  While I agree that map based selection is merely list based (with named lists instead of anonymous ones as it were) its the complexity of the user interface and persistence that I'd like to avoid.  That and the fact that I'm not sure people would use the functionality - gamers are a lazy bunch in my experience and very rarely ''play'' with all of the options available.

'''Mychaeel:'''  The trick is to make a bunch of complex options easy to grasp.  That's the goal of successful user interface design.

'''EntropicLqd:'''  Really?  That doesn't seem to be an industry standard point of view :)</text>
    </revision>
    <revision>
      <id>4609</id>
      <timestamp>2002-07-25T15:42:41Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; A Mutator to shuffle mutators}}

This mod is based on an idea by Twigstir from the official UT2003 discussion forum.

Essentially the mutator shuffler will change the mutators applied to a game on a map by map basis.  The mutator shuffler will (just before the start of the game) remove all current mutators, and then add new ones based upon some strange and otherworldy criteria dreamed up by a half-dunk monk separated from society for a few years.

Some ideas for mutator selection are:
; Map based selection. : Mutators are set based upon the name of the map.  So, low grav and jump match could be assigned to Face, and Instagib to Niven.  The actual interface required to set this up might be beyond the capabilities of the new user interface system though.
; Completely random selection : A random number of mutators (randomly selected) are added.  This has the problem observed by Mychaeel below - not all mutators work well in combination.
; List based selection. : Mutators are group into lists (e.g. Arena mutators, Size mutators, Inventory mutators) and one mutator is selected from each list.  It would then be up to the person setting the mutators in each of the lists to ensure that there were no conflicts.  &quot;no mutator from the list&quot; is also a possibility in this case.

Out of the three options specified above the last one &amp;ndash; List based selection &amp;ndash; is probably the easiest to implement.  The new User Interface ''should'' be adequate to the task of setting up the lists since you must be able to set map rotations and select mutators somehow.

I would like to propose support for 5 lists.  One list should contain zero or more mutators that are ''always'' applied to the game, and the other 4 lists should contain groups of mutators that can be randomly selected.

----

==Comments==

'''Wormbo:''' Nice idea. Here's what I think: You can move mutators to an &quot;optional mutators&quot; list and specify how many mutators from that list can be added to the game. A minimum and maximum number would be good.

'''Mychaeel:'''  Unfortunately not all mutators are cross-compatible, and even if they are technically they frequently don't work well together.  What about configuring a number of lists and the shuffler takes one mutator of every list?  (Like, a random relic, plus FatBoy or BigBoy, plus Strangelove or Matrix Moves or Low Grav.)

'''EntropicLqd:'''  Lol - I haven't even filled in the description and already I have comments.

'''Mychaeel:'''  The second and third option (&quot;completely random,&quot; &quot;list based&quot;) could be easily combined into a single one.

'''EntropicLqd:''' Only by reducing the number of mutators added, or, building in a certain amount of logic within the shuffler so that it at least has a chance of determining whether a mutator combination is going to conflict or not.  Or can you see an easier way?

'''Mychaeel:'''  I mean conceptually.  The &quot;completely random&quot; option is just a case of the &quot;list based&quot; one with a single list.  What I mean to express is that none of those options are mutually exclusive.  (The first one, &quot;map based,&quot; is just a modifier to the &quot;list based&quot; one too.)

'''The Twiggman''' Ah problems with cross compatablity can be resolved by including some program the will quickly test all possible mutator mix and matches and then sort into lists. (IM AN IDIOT BUT NOT A BAD IDEA)

'''EntropicLqd:'''  ''Mychaeel'' &amp;ndash; yes I see what you were getting at now.  I guess the only difference I would enforce for a completely random mutator combination based on the lists is that you'd only ever have 1 applied at a time to prevent conflicts.  Ultimately map based mutator configuration simply relies on the ability to handle a variable number of lists (persisting that could be a pain).  ''The Twiggman'' &amp;ndash; If you could figure out a way of doing it then it would be a nice idea.  I can think of a few ways of making it work under a small set of circumstances but all of the methods are flawed.

To be fair the reason I'm suggesting that only the list based selection one is supported is because it is possible to have a truly random mutator configuration applied to each map, simply by making the &quot;mandatory list&quot; empty, and populating one or more of the rest of the lists.  While I agree that map based selection is merely list based (with named lists instead of anonymous ones as it were) its the complexity of the user interface and persistence that I'd like to avoid.  That and the fact that I'm not sure people would use the functionality - gamers are a lazy bunch in my experience and very rarely ''play'' with all of the options available.

'''Mychaeel:'''  The trick is to make a bunch of complex options easy to grasp.  That's the goal of successful user interface design.

'''EntropicLqd:'''  Really?  That doesn't seem to be an industry standard point of view :)

'''Mychaeel:'''  Doesn't mean ''we'' don't have to do that either...  :-)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/NoRotatingItems</title>
    <id>1965</id>
    <revision>
      <id>4810</id>
      <timestamp>2007-07-04T03:47:25Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>delete me.</comment>
      <text xml:space="preserve">==Description==

I was thinking maybe a mutator that mappers could include in their maps. You could specify if you want to disable rotating for just all weapons or all items, or tag specific items in a map that this mutator will disable rotating for.

Atleast in UT2003 you can't disable rotating for weapons without scripting.

Related topics:

[[Legacy:Writing_And_Using_An_Embedded_Mutator|Writing_And_Using_An_Embedded_Mutator]]

==Comments==

'''Wormbo:''' You can place pickups directly in the map (without an [[Legacy:XPickUpBase|xPickUpBase]] actor) and set their [[Legacy:Actor/Movement|Actor/Movement]] -&gt; Physics property to PHYS_None to prevent them from rotating. But if you still want to use a pickup base instead of directly placing the pickup, you'd have to set its rotation by trial and error to get the correct pickup rotation. You can even set a custom rotation for the pickup (when placing it directly) by changing the Movement -&gt; RotationRate property of the pickup.

'''smattbac:''' Hmm, no. You can't add weapon pickups in UT2003 since they are not placeable. Unless there's bCanAddNotPlaceableActors in the editor you can toggle. But I forgot about the pickupbases though, so maybe it's just easier to subclass the weapons you want, make them placeable and disable the rotating.

'''Foxpaw:''' As I understand it bot's have a hard time finding weapons if they aren't on pickupbases.

'''MythOpus:''' [[:Category:Legacy Delete Me]]
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4811</id>
      <timestamp>2003-06-19T10:06:30Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description==

I was thinking maybe a mutator that mappers could include in their maps. You could specify if you want to disable rotating for just all weapons or all items, or tag specific items in a map that this mutator will disable rotating for.

Atleast in UT2003 you can't disable rotating for weapons without scripting.

Related topics:

[[Legacy:Writing_And_Using_An_Embedded_Mutator|Writing_And_Using_An_Embedded_Mutator]]

==Comments==

'''Wormbo:''' You can place pickups directly in the map (without an [[Legacy:XPickUpBase|xPickUpBase]] actor) and set their [[Legacy:Actor/Movement|Actor/Movement]] -&gt; Physics property to PHYS_None to prevent them from rotating. But if you still want to use a pickup base instead of directly placing the pickup, you'd have to set its rotation by trial and error to get the correct pickup rotation. You can even set a custom rotation for the pickup (when placing it directly) by changing the Movement -&gt; RotationRate property of the pickup.

'''smattbac:''' Hmm, no. You can't add weapon pickups in UT2003 since they are not placeable. Unless there's bCanAddNotPlaceableActors in the editor you can toggle. But I forgot about the pickupbases though, so maybe it's just easier to subclass the weapons you want, make them placeable and disable the rotating.

'''Foxpaw:''' As I understand it bot's have a hard time finding weapons if they aren't on pickupbases.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/NowWithWings</title>
    <id>1879</id>
    <revision>
      <id>4610</id>
      <timestamp>2003-04-23T22:57:01Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Players have two modes of transport, by foot, or by wing}}

==Description ==

When I came up with this one (1am this morning while failing to get to sleep) I thought it ought to be called ''Faeries''.  When I woke up this morning I decided that maybe Faeries wasn't such a good name after all.

OK, This mod provides players with two ways of getting around.  One is the usual run around on foot - no real change there.  The other mode of transport however is flight.  Each player is equipped with a pair of wings (probably ought to make it a jetpack to be honest - although beating wings would look way more cool) that allows them to fly.  The flight mode behaves in the following way.
* Players have free mouse-look when flying.
* Jump and crouch are used to gain and lose height.
* Forwards, backwards, strafe left and strafe right act as thrusters in the direction they are pressing.  These thrusters take a while for the player to get up to full speed (bit like having 50% air control really).
* The flight mode can be activated and de-activated at will.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

I must confess, it's very tempting to remove the free mouselook and have the player movement match something similar to that of the UT redeemer, so players can bank, climb, and dive.

'''Vajuras:''' This one has been implemented: http://modsquad.beyondunreal.com/review.php?id=55</text>
    </revision>
    <revision>
      <id>4611</id>
      <timestamp>2002-07-30T06:09:23Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Players have two modes of transport, by foot, or by wing}}

==Description ==

When I came up with this one (1am this morning while failing to get to sleep) I thought it ought to be called ''Faeries''.  When I woke up this morning I decided that maybe Faeries wasn't such a good name after all.

OK, This mod provides players with two ways of getting around.  One is the usual run around on foot - no real change there.  The other mode of transport however is flight.  Each player is equipped with a pair of wings (probably ought to make it a jetpack to be honest - although beating wings would look way more cool) that allows them to fly.  The flight mode behaves in the following way.
* Players have free mouse-look when flying.
* Jump and crouch are used to gain and lose height.
* Forwards, backwards, strafe left and strafe right act as thrusters in the direction they are pressing.  These thrusters take a while for the player to get up to full speed (bit like having 50% air control really).
* The flight mode can be activated and de-activated at will.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

I must confess, it's very tempting to remove the free mouselook and have the player movement match something similar to that of the UT redeemer, so players can bank, climb, and dive.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/NukeRifles</title>
    <id>1944</id>
    <revision>
      <id>4760</id>
      <timestamp>2006-07-18T19:56:47Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">===NukeRifles mutator ===

====Combat using modified Sniperifles that fire nuclear bullets! ====

Just as devastating as the Redeemer, but instant hit, and zoom too ;-)

Yes, I know it's totally silly, but it' good fun for about 5 minutes...

I'd like to do a version of it for UT2003, but am having trouble figuring out how the new Redeemer code works &amp;ndash; specifically it uses states to gradually move the damage  radius out as the shockwaves expand, so the victims get gibbed when the wave hits them.  Each time I try to use states, the compiler throws up some error or other... :-( So at the moment, in my mut they just get gibbed instantly, which looks really lame.  In good old UT, I could just spawn a ''Shockwave'' object, this did the whole lot automatically...  :-)

Thanks, \

'''Electric Mini:'''

----

Update... I've got it (mostly) working

I've managed to get it to work after poking around the Net all day :-)

I've had to spawn a custom class ''NukeRifleExplosion'', based on the ''RedeemerFire'' stuff.

This spawns a nuke explosion, which is allowed to have states, so I get the nice shockwaves and huge '''BOOM''' explosion noise...

But... I can't get the kills to register properly! Up until 10 minutes ago I couldn't score a single kill with this mut, only suicides were counted (DOH!). The only way I've found to do this so far is to call ''Other.TakeDamage'', this passes the ''Instigator'' along so kills are recorded for whichever victim you hit. But this sucks, 'cos it's instant, and you only get credit for killing the poor sucker the beam actually hits! 

Everyone else that dies gets counted as a suicide (ugh!).

The Redeemer code uses ''HurtRadius'', but I can't see how this gets info on who fired the thing to the victim (like ''Other.TakeDamage'' would).

Is there some easy way to hurt all the actors within a radius of a target, making sure that if they die the person who fired the shot gets the credit?

Am I just barking up the wrong tree here? Or am I just barking mad?  ;-)

P.S. If anyone wants the NukeRifles mut, put a comment here and I'll put it up on the www somewhere. Oh yes, I've now got zooming working too, like Zoom-Instagib.

P.P.S. I've also done NukeRifles for UT and a Nuclear-War mut for UT (replaces all weapons with 2-shot Redeemers... better run for cover).   Again, if anyone wants them, shout.

'''Electric Mini'''

----

'''Eldhrin:''' Use HurtRadius for initiating the damage &amp;ndash; I'm not sure how, but somehow it Just Works. Most of the time at least :-)

'''Electric Mini:''' That's what it does at the moment. I think the problem may be  that I just &quot;borrowed&quot; the Redeemer code, and that spawns the Redeemer missile as a separate Pawn, which then explodes when it hits something. My hack just spawns it, and it explodes immediately ( gross hack or what? ;-). 

So I think the kills are getting attributed to this Redeemer missile actor, rather than to the player who fired it (somewhere the chain of ownership is getting broken).

I guess I really should dig deeper and learn how the Redeemer stuff works, then think of a decent way to code it. A task to prove me worthy, eh?

'''Eldhrin:''' lol yes. However, it sounds like what you should really be doing is using a subclass of InstantFire, with code pulled out of the Redeemer's missile class in its hit-the-target routine. Or, have a look at the code in the Redeemer (or rather in one of its superclasses) which actually spawns the missile, and see if there's anything in that which looks like how the chain of ownership is preserved. It might be as simple as one of the optional parameters passed to Spawn.

'''Electric Mini:''' I've got it working properly now, I must have been doing something stupid before (no surprises there! ;-)).  I'm using the SuperShockRifle (a.k.a InstaGib Rifle) as the basis for the weapon, so it is a weird hybrid of an instant-hit weapon (InstaGib Rifle) and a projectile weapon (Redeemer).

I've modified the TracePart() routine so it won't recursively trace until it hits the level (that was how you could shoot through one enemy and kill a second one with just one shot) now it spawns a modified Redeemer projectile (no skins or static meshes, so it's invisible).

&lt;uscript&gt;
function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
    local NukeRifleProjectile big_bang;

    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        //if ( !Other.bWorldGeometry )
        //{
            HitNormal = Vect(0,0,0);
            //if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; Weapon.IsA('NukeRifle') )
			//	TracePart(HitLocation,End,X,Dir,Pawn(Other));
        //}
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
	SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
	if( Instigator.bDeleteMe != true )
		big_bang = Spawn(class'my_mod2.NukeRifleProjectile',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);                      
}
&lt;/uscript&gt;

Am I right about what I think ''TracePart()'' is doing? The commented-out bits are how it did the recursive tracing, right?

''NukeRifleProjectile'' is a copy of ''RedeemerProjectile'', with a few of the default properties changed. It also blows up with a full-sized nuke explosion if it is damaged, rather than a small explosion like the Redeemer missile does.

In my previous attempts this projectile would automatically go into the Dying state, but it'd only produce a pretty explosion if you directly shot someone. If you hit something else, you'd get the damage but no visual explosion (weird). 

This time, I've left its states alone, but I'm spawning it about 100 units back along the line of fire, so the projectile will slam into the target and explode normally.

Yeehaa! It works! :-)

It's also very deadly! :-) :-)

Now the real challenge is to see if it'll work over a network....

I can't test this &amp;ndash; haven't got a network, and my ISP won't allow servers to be run off their cablemodem connections (bummer).

I've put the whole of the [[Legacy:NukeRifles Code|NukeRifles Code]] up.

Thanks \

'''Electric Mini'''

'''Eldhrin:''' yes, you've commented out the bits that caused recursive tracing :-) Congratulations

'''Wormbo:''' There are several other pages belonging to this one: [[Legacy:MutNukeRifles|MutNukeRifles]], [[Legacy:NukeRifle|NukeRifle]], [[Legacy:NukeRifleFire|NukeRifleFire]], [[Legacy:NukeRiflePickup|NukeRiflePickup]] and [[Legacy:NukeRifleProjectile|NukeRifleProjectile]]. Those are custom class pages but not in the wiki's usualy class page format. What to do with those?</text>
    </revision>
    <revision>
      <id>4761</id>
      <timestamp>2006-07-16T22:36:36Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">===NukeRifles mutator ===

====Combat using modified Sniperifles that fire nuclear bullets! ====

Just as devastating as the Redeemer, but instant hit, and zoom too ;-)

Yes, I know it's totally silly, but it' good fun for about 5 minutes...

I'd like to do a version of it for UT2003, but am having trouble figuring out how the new Redeemer code works &amp;ndash; specifically it uses states to gradually move the damage  radius out as the shockwaves expand, so the victims get gibbed when the wave hits them.  Each time I try to use states, the compiler throws up some error or other... :-( So at the moment, in my mut they just get gibbed instantly, which looks really lame.  In good old UT, I could just spawn a ''Shockwave'' object, this did the whole lot automatically...  :-)

Thanks, \

'''Electric Mini:'''

----

Update... I've got it (mostly) working

I've managed to get it to work after poking around the Net all day :-)

I've had to spawn a custom class ''NukeRifleExplosion'', based on the ''RedeemerFire'' stuff.

This spawns a nuke explosion, which is allowed to have states, so I get the nice shockwaves and huge '''BOOM''' explosion noise...

But... I can't get the kills to register properly! Up until 10 minutes ago I couldn't score a single kill with this mut, only suicides were counted (DOH!). The only way I've found to do this so far is to call ''Other.TakeDamage'', this passes the ''Instigator'' along so kills are recorded for whichever victim you hit. But this sucks, 'cos it's instant, and you only get credit for killing the poor sucker the beam actually hits! 

Everyone else that dies gets counted as a suicide (ugh!).

The Redeemer code uses ''HurtRadius'', but I can't see how this gets info on who fired the thing to the victim (like ''Other.TakeDamage'' would).

Is there some easy way to hurt all the actors within a radius of a target, making sure that if they die the person who fired the shot gets the credit?

Am I just barking up the wrong tree here? Or am I just barking mad?  ;-)

P.S. If anyone wants the NukeRifles mut, put a comment here and I'll put it up on the www somewhere. Oh yes, I've now got zooming working too, like Zoom-Instagib.

P.P.S. I've also done NukeRifles for UT and a Nuclear-War mut for UT (replaces all weapons with 2-shot Redeemers... better run for cover).   Again, if anyone wants them, shout.

'''Electric Mini'''

----

'''Eldhrin:''' Use HurtRadius for initiating the damage &amp;ndash; I'm not sure how, but somehow it Just Works. Most of the time at least :-)

'''Electric Mini:''' That's what it does at the moment. I think the problem may be  that I just &quot;borrowed&quot; the Redeemer code, and that spawns the Redeemer missile as a separate Pawn, which then explodes when it hits something. My hack just spawns it, and it explodes immediately ( gross hack or what? ;-). 

So I think the kills are getting attributed to this Redeemer missile actor, rather than to the player who fired it (somewhere the chain of ownership is getting broken).

I guess I really should dig deeper and learn how the Redeemer stuff works, then think of a decent way to code it. A task to prove me worthy, eh?

'''Eldhrin:''' lol yes. However, it sounds like what you should really be doing is using a subclass of InstantFire, with code pulled out of the Redeemer's missile class in its hit-the-target routine. Or, have a look at the code in the Redeemer (or rather in one of its superclasses) which actually spawns the missile, and see if there's anything in that which looks like how the chain of ownership is preserved. It might be as simple as one of the optional parameters passed to Spawn.

'''Electric Mini:''' I've got it working properly now, I must have been doing something stupid before (no surprises there! ;-)).  I'm using the SuperShockRifle (a.k.a InstaGib Rifle) as the basis for the weapon, so it is a weird hybrid of an instant-hit weapon (InstaGib Rifle) and a projectile weapon (Redeemer).

I've modified the TracePart() routine so it won't recursively trace until it hits the level (that was how you could shoot through one enemy and kill a second one with just one shot) now it spawns a modified Redeemer projectile (no skins or static meshes, so it's invisible).

&lt;uscript&gt;
function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
    local NukeRifleProjectile big_bang;

    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        //if ( !Other.bWorldGeometry )
        //{
            HitNormal = Vect(0,0,0);
            //if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; Weapon.IsA('NukeRifle') )
			//	TracePart(HitLocation,End,X,Dir,Pawn(Other));
        //}
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
	SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
	if( Instigator.bDeleteMe != true )
		big_bang = Spawn(class'my_mod2.NukeRifleProjectile',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);                      
}
&lt;/uscript&gt;

Am I right about what I think ''TracePart()'' is doing? The commented-out bits are how it did the recursive tracing, right?

''NukeRifleProjectile'' is a copy of ''RedeemerProjectile'', with a few of the default properties changed. It also blows up with a full-sized nuke explosion if it is damaged, rather than a small explosion like the Redeemer missile does.

In my previous attempts this projectile would automatically go into the Dying state, but it'd only produce a pretty explosion if you directly shot someone. If you hit something else, you'd get the damage but no visual explosion (weird). 

This time, I've left its states alone, but I'm spawning it about 100 units back along the line of fire, so the projectile will slam into the target and explode normally.

Yeehaa! It works! :-)

It's also very deadly! :-) :-)

Now the real challenge is to see if it'll work over a network....

I can't test this &amp;ndash; haven't got a network, and my ISP won't allow servers to be run off their cablemodem connections (bummer).

I've put the whole of the [[Legacy:NukeRifles Code|NukeRifles Code]] up.

Thanks \

'''Electric Mini'''

'''Eldhrin:''' yes, you've commented out the bits that caused recursive tracing :-) Congratulations

'''Wormbo:''' There are several other pages belonging to this one: [[Legacy:MutNukeRifles|MutNukeRifles]], [[Legacy:NukeRifle|NukeRifle]], [[Legacy:NukeRifleFire|NukeRifleFire]], [[Legacy:NukeRiflePickup|NukeRiflePickup]] and [[Legacy:NukeRifleProjectile|NukeRifleProjectile]]. Those are custom class pages but not in the wiki's usualy class page format. What to do with those?</text>
    </revision>
    <revision>
      <id>4762</id>
      <timestamp>2006-07-18T18:51:01Z</timestamp>
      <contributor>
        <ip>211.162.62.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;u style=&quot;display: none;&quot;&gt;... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... &lt;a href='http://www.ringtones-dir.com'&gt;free ringtones&lt;/a&gt; : [http://www.ringtones-dir.com download ringtones] - [HTTP://www.ringtones-dir.com download ringtones] : [nokia ringtones|http://www.ringtones-dir.com] - [nokia ringtones|HTTP://www.ringtones-dir.com] : http://www.ringtones-dir.com/download/ : [[http://www.ringtones-dir.com ring tones]] : [[http://www.ringtones-dir.com | ringtones download]] : &quot;samsung ringtones&quot; http://www.ringtones-dir.com : [http://www.ringtones-dir.com|ringtones free] &lt;/u&gt;=== NukeRifles mutator ===

====Combat using modified Sniperifles that fire nuclear bullets! ====

Just as devastating as the Redeemer, but instant hit, and zoom too ;-)

Yes, I know it's totally silly, but it' good fun for about 5 minutes...

I'd like to do a version of it for UT2003, but am having trouble figuring out how the new Redeemer code works &amp;ndash; specifically it uses states to gradually move the damage  radius out as the shockwaves expand, so the victims get gibbed when the wave hits them.  Each time I try to use states, the compiler throws up some error or other... :-( So at the moment, in my mut they just get gibbed instantly, which looks really lame.  In good old UT, I could just spawn a ''Shockwave'' object, this did the whole lot automatically...  :-)

Thanks, 

'''Electric Mini:'''

----

Update... I've got it (mostly) working

I've managed to get it to work after poking around the Net all day :-)

I've had to spawn a custom class ''NukeRifleExplosion'', based on the ''RedeemerFire'' stuff.

This spawns a nuke explosion, which is allowed to have states, so I get the nice shockwaves and huge '''BOOM''' explosion noise...

But... I can't get the kills to register properly! Up until 10 minutes ago I couldn't score a single kill with this mut, only suicides were counted (DOH!). The only way I've found to do this so far is to call ''Other.TakeDamage'', this passes the ''Instigator'' along so kills are recorded for whichever victim you hit. But this sucks, 'cos it's instant, and you only get credit for killing the poor sucker the beam actually hits! 

Everyone else that dies gets counted as a suicide (ugh!).

The Redeemer code uses ''HurtRadius'', but I can't see how this gets info on who fired the thing to the victim (like ''Other.TakeDamage'' would).

Is there some easy way to hurt all the actors within a radius of a target, making sure that if they die the person who fired the shot gets the credit?

Am I just barking up the wrong tree here? Or am I just barking mad?  ;-)

P.S. If anyone wants the NukeRifles mut, put a comment here and I'll put it up on the www somewhere. Oh yes, I've now got zooming working too, like Zoom-Instagib.

P.P.S. I've also done NukeRifles for UT and a Nuclear-War mut for UT (replaces all weapons with 2-shot Redeemers... better run for cover).   Again, if anyone wants them, shout.

'''Electric Mini'''

----

'''Eldhrin:''' Use HurtRadius for initiating the damage &amp;ndash; I'm not sure how, but somehow it Just Works. Most of the time at least :-)

'''Electric Mini:''' That's what it does at the moment. I think the problem may be  that I just &quot;borrowed&quot; the Redeemer code, and that spawns the Redeemer missile as a separate Pawn, which then explodes when it hits something. My hack just spawns it, and it explodes immediately ( gross hack or what? ;-). 

So I think the kills are getting attributed to this Redeemer missile actor, rather than to the player who fired it (somewhere the chain of ownership is getting broken).

I guess I really should dig deeper and learn how the Redeemer stuff works, then think of a decent way to code it. A task to prove me worthy, eh?

'''Eldhrin:''' lol yes. However, it sounds like what you should really be doing is using a subclass of InstantFire, with code pulled out of the Redeemer's missile class in its hit-the-target routine. Or, have a look at the code in the Redeemer (or rather in one of its superclasses) which actually spawns the missile, and see if there's anything in that which looks like how the chain of ownership is preserved. It might be as simple as one of the optional parameters passed to Spawn.

'''Electric Mini:''' I've got it working properly now, I must have been doing something stupid before (no surprises there! ;-)).  I'm using the SuperShockRifle (a.k.a InstaGib Rifle) as the basis for the weapon, so it is a weird hybrid of an instant-hit weapon (InstaGib Rifle) and a projectile weapon (Redeemer).

I've modified the TracePart() routine so it won't recursively trace until it hits the level (that was how you could shoot through one enemy and kill a second one with just one shot) now it spawns a modified Redeemer projectile (no skins or static meshes, so it's invisible).

&lt;uscript&gt;
function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
    local NukeRifleProjectile big_bang;

    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        //if ( !Other.bWorldGeometry )
        //{
            HitNormal = Vect(0,0,0);
            //if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; Weapon.IsA('NukeRifle') )
			//	TracePart(HitLocation,End,X,Dir,Pawn(Other));
        //}
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
	SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
	if( Instigator.bDeleteMe != true )
		big_bang = Spawn(class'my_mod2.NukeRifleProjectile',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);                      
}
&lt;/uscript&gt;

Am I right about what I think ''TracePart()'' is doing? The commented-out bits are how it did the recursive tracing, right?

''NukeRifleProjectile'' is a copy of ''RedeemerProjectile'', with a few of the default properties changed. It also blows up with a full-sized nuke explosion if it is damaged, rather than a small explosion like the Redeemer missile does.

In my previous attempts this projectile would automatically go into the Dying state, but it'd only produce a pretty explosion if you directly shot someone. If you hit something else, you'd get the damage but no visual explosion (weird). 

This time, I've left its states alone, but I'm spawning it about 100 units back along the line of fire, so the projectile will slam into the target and explode normally.

Yeehaa! It works! :-)

It's also very deadly! :-) :-)

Now the real challenge is to see if it'll work over a network....

I can't test this &amp;ndash; haven't got a network, and my ISP won't allow servers to be run off their cablemodem connections (bummer).

I've put the whole of the [[Legacy:NukeRifles Code|NukeRifles Code]] up.

Thanks 

'''Electric Mini'''

'''Eldhrin:''' yes, you've commented out the bits that caused recursive tracing :-) Congratulations

'''Wormbo:''' There are several other pages belonging to this one: [[Legacy:MutNukeRifles|MutNukeRifles]], [[Legacy:NukeRifle|NukeRifle]], [[Legacy:NukeRifleFire|NukeRifleFire]], [[Legacy:NukeRiflePickup|NukeRiflePickup]] and [[Legacy:NukeRifleProjectile|NukeRifleProjectile]]. Those are custom class pages but not in the wiki's usualy class page format. What to do with those?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/OptOutDeathMessages</title>
    <id>1981</id>
    <revision>
      <id>4844</id>
      <timestamp>2003-11-16T06:23:59Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any ::UT:: ::UT2003:: &amp;ndash; OptOutDeathMessages}}

==Description ==

This mutator will eliminate all DeathMessages that show up in the Chat area. ie. &quot;SomePlayer electrified OtherPlayer with SomeElectricThing&quot; Who needs to see that? Well, this would make it possible for server admins to eliminate them. Maybe this could run client-side, but I don't know about anti-cheat software allowing it.

==How to make this mod ==

Any ideas on how this could be done?

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*(name in link form)
*(name in link form)
*(name in link form)

==Discussion ==

'''Chez:''' Just do it =)

'''GRAF1K:''' o_O Extemely easy to make. No Console Death Messages. :D

'''Ch3z:''' Made me look! Is that a UT2003 setting or something? I don't see anything in UT for it.

'''GRAF1K:''' Yes, UT2003. :-) If you want that feature, it costs about $20 at Best Buy. ;-) But wait for UT2004.</text>
    </revision>
    <revision>
      <id>4845</id>
      <timestamp>2003-10-28T06:29:07Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any ::UT:: ::UT2003:: &amp;ndash; OptOutDeathMessages}}

==Description ==

This mutator will eliminate all DeathMessages that show up in the Chat area. ie. &quot;SomePlayer electrified OtherPlayer with SomeElectricThing&quot; Who needs to see that? Well, this would make it possible for server admins to eliminate them. Maybe this could run client-side, but I don't know about anti-cheat software allowing it.

==How to make this mod ==

Any ideas on how this could be done?

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*(name in link form)
*(name in link form)
*(name in link form)

==Discussion ==

'''Chez:''' Just do it =)

'''GRAF1K:''' o_O Extemely easy to make. No Console Death Messages. :D

'''Ch3z:''' Made me look! Is that a UT2003 setting or something? I don't see anything in UT for it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/OptOutTauntPacks</title>
    <id>1982</id>
    <revision>
      <id>4846</id>
      <timestamp>2003-10-28T06:10:38Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any ::UT:: ::UT2003:: &amp;ndash; OptOutTauntPacks}}

==Description ==

This mutator will allow players to join a server that has taunt packs installed and have a choice not to download them all. They can see the name of the taunt played instead. Dial-Uppers are sometimes very put off by having them forced on them. I have no idea where to start with this. Should this be client or server side? Would it have to be both? Is it even possible?

==How to make this mod ==

Any ideas on how this could be done?

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*(name in link form)
*(name in link form)
*(name in link form)

==Discussion ==

'''Chez:''' Just do it =)

'''GRAF1K:''' I remember something about a BeyondUnreal news post about a SkinCity tutorial forcing download of skins. Or something. Ought to start there.

'''Ch3z:''' Sweet. I'll take a look. Ty

'''GRAF1K:''' Welcome. If you find it before I do, please post a link here. Thanks. :-)</text>
    </revision>
    <revision>
      <id>4847</id>
      <timestamp>2003-10-28T05:54:22Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>ty</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any ::UT:: ::UT2003:: &amp;ndash; OptOutTauntPacks}}

==Description ==

This mutator will allow players to join a server that has taunt packs installed and have a choice not to download them all. They can see the name of the taunt played instead. Dial-Uppers are sometimes very put off by having them forced on them. I have no idea where to start with this. Should this be client or server side? Would it have to be both? Is it even possible?

==How to make this mod ==

Any ideas on how this could be done?

====Interested Scripters ====

If you are interested in developing this mod for any UnrealTournament game then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started. 

*(name in link form)
*(name in link form)
*(name in link form)

==Discussion ==

'''Chez:''' Just do it =)

'''GRAF1K:''' I remember something about a BeyondUnreal news post about a SkinCity tutorial forcing download of skins. Or something. Ought to start there.

'''Ch3z:''' Sweet. I'll take a look. Ty</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Origiut</title>
    <id>1927</id>
    <revision>
      <id>4719</id>
      <timestamp>2005-01-14T03:12:26Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Description ==

Well, this is a gametype that is (well duh... :) ) the original UT! It plays and feels the same way in the original UT.

You may add to, and only add to this list of features below: If you want me to delete one of them, or move them, tell me with an adequate explanation in the discussion area of this page, please! ;)

===Gameplay Options ===

====Keep from UT2003 ====
* Karma physics
* Announcer

====Keep from UT ====
* Gibbed dead bodies, rather than the stupid green body floating to heaven.
* Blasted telefragger destination module (shooting it to the moon :) )
* Hud
* Cursor for [v] dialogue box. :)
* '''UWindows!!!''' :D

====Options that are configurable ====
* Weapons

===Gametype Options ===

====Assault ====

Well, for the assault lovers, and people who like the original UnrealTournament

==Interested Scripters ==

If you are interested in developing this mod for UT2003 then add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:''' One of my biggest hates with UT2003 is the HUD.  It stinks.  In UT the team messages were in a decent place, and your health and armour were co-located.  You could also tell how much ammo you had left for a weapon that you didn't have in your hands (the colours in UT2003 are too similar).

'''ZxAnPhOrIaN:''' Fixed that! When you stated that, i kinda hate the hud of UT2003 too! You cannot make the hud transparent!

'''ZxAnPhOrIaN:''' Also, I hate that you have to use the number keys for choosing messages in the [v] dialogue box!

'''EntropicLqd:''' Yeah.  If you use the voice menu ''a lot'' it is actually quicker to do it the way they have done it.  However, for occasional use (since I generally setup keybinds) the implementation is awful.  The other thing I find irritating is the fact that all messages are in upper case.  I know they were porting a TV console game, but come on ...

'''Mychaeel:''' Seems to me that it'd be a lot easier to port the announcer from UT2003 to Unreal Tournament than everything else from Unreal Tournament to UT2003.

'''EntropicLqd:''' lol - but where's the challenge in that?  I must confess, I prefer the UT2003 weapons over the UT ones.  My issues with UT2003 are more to do with the maps, diversity, and HUD.  Mostly the HUD to be honest.

'''ZxAnPhOrIaN:''' In Americas Army, the numbers for the radio are fine, because you don't need them as often in it.

'''DJPaul:''' very similar to the UTClassic mutator..

'''Darkwarrior:''' The announcer should be easy to make for UT2003 because of the support for custom announcers added with the epic bonus pack.</text>
    </revision>
    <revision>
      <id>4720</id>
      <timestamp>2005-01-13T23:26:19Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/PlayerMovementZone</title>
    <id>1894</id>
    <revision>
      <id>4645</id>
      <timestamp>2007-07-04T03:40:46Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>Custom Class created?</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Alter the player movement on a zone by zone basis}}

==Description ==

This is a new zone class (assuming such things exist in UT2003) that allows you to change the player's speed, air control, and jump height on a zone by zone basis.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; It's a nice small very easy to build component.  The UT version took me about 30 minutes.

==Discussion ==

'''Mychaeel:'''  The new Unreal engine relies on &quot;volumes&quot; rather than zones for things like that, and there is a PhysicsVolume class already that lets you change players' physics property when they're within it.  For that matter, see Unreal Tournament's [[Legacy:TarZone|TarZone]] for slowing players down and use any zone's ZoneGravity to influence the jump height.

'''EntropicLqd:'''  Indeed, but the reason the zone was created was to change the player's AirControl.  Altering the fluid friction didn't give the required effect apparently.  Tweaking zone gravity also changes the way projectiles and objects fall and that wasn't wanted.  With this zone these things would remain unchanged.  For example, I could have part of the map where players can jump 4 times higher than normal without changing the gravity, and also give them full air control.  Or I could have a long corridor through which players run twice as fast.  Or a combination of all three.

'''EntropicLqd:'''So how are volumes defined in the ''new world'' then?

'''Tarquin:'''  ah... They've got cars Big as bars They've got rivers of gold But the wind goes right through you It's no place for the old ...

'''Mychaeel:'''  Like special brushes.  They have actor/pawn entering/leaving notification events similar to zones on UnrealScript level.  Zones are much more than before used for map performance optimization only.

'''MythOpus:''' Has this class been created?  If it has and the source/files for it are intact, please put it up on the Custom Class pages so this page can be deleted?</text>
    </revision>
    <revision>
      <id>4646</id>
      <timestamp>2002-07-31T10:55:07Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Alter the player movement on a zone by zone basis}}

==Description ==

This is a new zone class (assuming such things exist in UT2003) that allows you to change the player's speed, air control, and jump height on a zone by zone basis.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; It's a nice small very easy to build component.  The UT version took me about 30 minutes.

==Discussion ==

'''Mychaeel:'''  The new Unreal engine relies on &quot;volumes&quot; rather than zones for things like that, and there is a PhysicsVolume class already that lets you change players' physics property when they're within it.  For that matter, see Unreal Tournament's [[Legacy:TarZone|TarZone]] for slowing players down and use any zone's ZoneGravity to influence the jump height.

'''EntropicLqd:'''  Indeed, but the reason the zone was created was to change the player's AirControl.  Altering the fluid friction didn't give the required effect apparently.  Tweaking zone gravity also changes the way projectiles and objects fall and that wasn't wanted.  With this zone these things would remain unchanged.  For example, I could have part of the map where players can jump 4 times higher than normal without changing the gravity, and also give them full air control.  Or I could have a long corridor through which players run twice as fast.  Or a combination of all three.

'''EntropicLqd:'''So how are volumes defined in the ''new world'' then?

'''Tarquin:'''  ah... They've got cars Big as bars They've got rivers of gold But the wind goes right through you It's no place for the old ...

'''Mychaeel:'''  Like special brushes.  They have actor/pawn entering/leaving notification events similar to zones on UnrealScript level.  Zones are much more than before used for map performance optimization only.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Playthings</title>
    <id>1994</id>
    <revision>
      <id>4876</id>
      <timestamp>2007-08-23T16:01:40Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The concept here is to come up with some creative ''non-lethal'' weapon ideas. The basic idea in most team-based games is just to achieve a goal &amp;ndash; like bringing an object to a particular place &amp;ndash; while preventing the opposing team from doing the same. Some of us aren't all that much into violence, so what if we got creative with the weapons? They're really just tools to help you achieve the goals of the game.

The ideas so far are based on the UT weapons, largely because I don't want to tackle the task of making new models. If anyone else wants to be more ambitious, then so much the better.

===Weapon Ideas===
; Bubble gun : Hitting enemies with this gun creates a bubble around them. The bubble is highly visible, and shooting the bubble has the same effect as shooting the enemy inside; this makes the enemy much easier to see and hit from a distance, even with non-zooming weapons. Primarily useful as a sniping weapon.
; Drop rifle : Shoot it at the flag/ball carrier, and they drop the object. This could server as a replacement for the lightning gun, probably because it should have a significant firing delay.
; Portal launcher : Fires a projectile which, on impact, creates a portal that teleports an enemy back to their base (without any flag or ball they might be carrying). The portals last for a few seconds before disappearing. This would be mainly a defensive weapon, where you create walls of portals to prevent your enemies from getting to your flag. A direct hit on an enemy might not be effective, since it would take a moment for the portal to appear. This would replace the rocket launcher.
; Gravity gun : A variation on the link gun, which causes enemies to float into the air for a time, probably in preparation for a combination attack. Shooting the altfire at a portal from the portal launcher would cause nearby enemies to get pulled into it, and make the portal last longer.
; Speed stasis gun : Causes the target to continue moving at its current speed and direction for a few seconds. A variation of the gravity gun, and could be its alt fire.
; Impulse rifle : A shock rifle that does nothing but knockback, but lots of it. The altfire would be a beam that pulls the enemy towards you, potentially into a portal.
; Glue gun : A fairly obvious variation on the bio rifle: enemies get stuck or slowed down.
; Swap gun : Fires a homing projectile that causes you and your target to swap places. Slow rate of fire, possibly one-shot. Maybe a slow-moving projectile, but faster when fired at flag carriers. Maybe flags should get dropped, or given to the other player.

Other possibilies include weapons that affect visibility. That of course is vulnerable to cheating, but what cheater is going to want to play this? :)  You can also do growth (too big to fit through the door) and shrinking, affecting speed (make them move unmanageably fast), hallucinations, and so on.

==Comments ==

'''Tarquin:''' Sounds fun!

'''Foxpaw:''' I think that the &quot;impulse rifle&quot; may defeat the purpose of making it non-violent, since you could easily use it to knock people off ledges to their doom, and all.

'''Uncommon:''' Yes, falling damage is an issue to be resolved. Of course it depends on what map you're playing. Anyway, &quot;falling to your doom&quot; could be replaced with &quot;falling until you get teleported back to your base&quot;. Being returned to your base is basically what replaces dying in this mod. The &quot;suicide&quot; key would become more of a &quot;retreat&quot; key, and it may become more useful since many of the weapons will be designed to incapacitate. You either wait for the effect to wear off, or give up and go home to try again.

'''Uncommon:''' Another idea I've had is that any time your falling speed is such that hitting the groud would cause you damage (perhaps above a certain threshold), you automatically get returned to base. It also occurred to me that games like StarCraft could be a good source of non-lethal weapon ideas. Imagine being able to use stuff like Hallucinations :)

'''Foogod:''' I like it!  Here's another idea:  Woozy Gun &amp;ndash; Hitting an opponent with this gun makes their view onscreen waver back and forth for a little while.. makes it really hard to run/shoot in a straight line. (for bots, just mess with their navigation/targetting AI)

'''Bullet:''' Just made the Impulse Rifle: If you hit ground you get knocked back, if you hit an enemy he gets knocked back even harder. The thing with pulling towards you could be easily implemented. But for now the weapon is build for learnings sake and I don't know wether the code is clean enough to publish it here...

'''T-1:''' Huh, wierd coincidence, I made the exact same weapon for my mod Slaughter, and I haven't even read this before. The pulling can be done with negative momentum transfer. My version doesn't knock the firer back though. It's perfect for killing stuff by pulling vehicles toward you and you jump out of the way but the person you're trying to hit with it probably won't even see the vehicle coming.

'''Bullet:''' Sounds great :D Need to try that!

'''Zxanphorian:''' I like this idea, but i think they should be kinda like relics or inventory, that you rotate through/use with different keys. The mesh would be on the opposite hand the weapon is in. I think this would get rid of being defenseless when you are attacked, until you switch to a normal weapon.

'''Bullet:''' To be honest I think CTF for example wouldn't be playable with this mod. Think of FaceClassic and the Impulse Gun which lets you travel from base to base in no time. Or the Drop Gun would make the game like Instagib! What do you think of what to do to balance it a bit better?

'''Uncommon:''' How would the impulse gun help you travel? Also, there's a big difference between the Drop Gun and Instagib: you can pick the flag up again. It just slows down your getaway, and gives your pursuers a chance to get the flag before you can retrieve it.

'''Bullet:''' Oops I just noticed that your definition of a Impulse Gun does NOT include pushing yourself forward if hitting ground instead of a player pawn :D

'''RabidZombie:''' What if you had a swap gun as a one shot superweapon. You fire and it will home on to the person within a distance of the crossair and when it arrives you swap possition with the other person. Lots of things could be achived and you wont be able to use it well at all times, it would add a real tactical (some reason I can't spell the word all of a sudden) edge, as you could jump off the edge then use it, swapping your seemingly doomful situation with your opp's peaceful walk.   Using it to get further means the enimy might be nearer to your base, so you got to use it at the righ time!

'''Uncommon:''' I like it :)

'''SoH_Ghost3021:''' Can i help? this looks like fun...

'''Uncommon:''' I don't know, can you? :)  I think the basic steps to getting this made are:
* Brainstorm some weapons
* Pick a well-rounded, well-balanced set from the brainstorming
* If talent is available, make custom models, skins, and sounds
* Make suitable HUD modifications, like hiding heath &amp; shields (or come up with a substitute)
* Lots of playtesting!

'''RabidZombie:''' Although i don't know how old this is, I HAVE thought of a new gun! It could be called the 'Nuts Gun'(altogth a name change is more than likely :P)  Basicly it randomly swaps round the primary and secondary movement controls(seperatly to avoid having 2 downs on the arrow buttons... maybie) and it will also swap the fires, jump and crouch buttons and also maybie give a nutty hud like the llama on JailBreak! Maybie another super weapon, Slow charge time, or a gun which could be toned down a touch... Wow, when I think about it, I can think of loads of unharmful guns...

Also another gun could be the double vision gun... The person affected sees double (or more) of people (and maybie items) around him, so he can't tell the real from the fake... 

Also the substitute for the Hud, maybie you could rearange it so you have a Charge area (maybie giving you ammo for the less power ful of the guns) a score indicator and maybie and friend radar (turn off-able by an option of course ;) )  

'''Uncommon:''' One complication with changing controls, vision, and stuff like that is it affects the player more than the game play, so bot support would be tricky. I think those debilitating-type weapons also need to be balanced with ones that are actually offensive or have other useful functions.

'''Marduk2:''' Umm, I got an idea for two items, Rocket Boots, they make you move super fast in one direction for a while, but if you hit anything you stop immediately and trip so you have to get back up.

and the Spy pad, it places a small black disc on teh ground that makes any player who steps on it look like a member of the opposite team, this could let them sabotage the enemy's efforts.

'''Marduk2:'''well for the brainstorming part, I could help if you'd like. I think I have some pretty good ideas.</text>
    </revision>
    <revision>
      <id>4877</id>
      <timestamp>2005-01-23T19:28:15Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The concept here is to come up with some creative ''non-lethal'' weapon ideas. The basic idea in most team-based games is just to achieve a goal &amp;ndash; like bringing an object to a particular place &amp;ndash; while preventing the opposing team from doing the same. Some of us aren't all that much into violence, so what if we got creative with the weapons? They're really just tools to help you achieve the goals of the game.

The ideas so far are based on the UT weapons, largely because I don't want to tackle the task of making new models. If anyone else wants to be more ambitious, then so much the better.

===Weapon Ideas===
; Bubble gun : Hitting enemies with this gun creates a bubble around them. The bubble is highly visible, and shooting the bubble has the same effect as shooting the enemy inside; this makes the enemy much easier to see and hit from a distance, even with non-zooming weapons. Primarily useful as a sniping weapon.
; Drop rifle : Shoot it at the flag/ball carrier, and they drop the object. This could server as a replacement for the lightning gun, probably because it should have a significant firing delay.
; Portal launcher : Fires a projectile which, on impact, creates a portal that teleports an enemy back to their base (without any flag or ball they might be carrying). The portals last for a few seconds before disappearing. This would be mainly a defensive weapon, where you create walls of portals to prevent your enemies from getting to your flag. A direct hit on an enemy might not be effective, since it would take a moment for the portal to appear. This would replace the rocket launcher.
; Gravity gun : A variation on the link gun, which causes enemies to float into the air for a time, probably in preparation for a combination attack. Shooting the altfire at a portal from the portal launcher would cause nearby enemies to get pulled into it, and make the portal last longer.
; Speed stasis gun : Causes the target to continue moving at its current speed and direction for a few seconds. A variation of the gravity gun, and could be its alt fire.
; Impulse rifle : A shock rifle that does nothing but knockback, but lots of it. The altfire would be a beam that pulls the enemy towards you, potentially into a portal.
; Glue gun : A fairly obvious variation on the bio rifle: enemies get stuck or slowed down.
; Swap gun : Fires a homing projectile that causes you and your target to swap places. Slow rate of fire, possibly one-shot. Maybe a slow-moving projectile, but faster when fired at flag carriers. Maybe flags should get dropped, or given to the other player.

Other possibilies include weapons that affect visibility. That of course is vulnerable to cheating, but what cheater is going to want to play this? :)  You can also do growth (too big to fit through the door) and shrinking, affecting speed (make them move unmanageably fast), hallucinations, and so on.

==Comments ==

'''Tarquin:''' Sounds fun!

'''Foxpaw:''' I think that the &quot;impulse rifle&quot; may defeat the purpose of making it non-violent, since you could easily use it to knock people off ledges to their doom, and all.

'''Uncommon:''' Yes, falling damage is an issue to be resolved. Of course it depends on what map you're playing. Anyway, &quot;falling to your doom&quot; could be replaced with &quot;falling until you get teleported back to your base&quot;. Being returned to your base is basically what replaces dying in this mod. The &quot;suicide&quot; key would become more of a &quot;retreat&quot; key, and it may become more useful since many of the weapons will be designed to incapacitate. You either wait for the effect to wear off, or give up and go home to try again.

'''Uncommon:''' Another idea I've had is that any time your falling speed is such that hitting the groud would cause you damage (perhaps above a certain threshold), you automatically get returned to base. It also occurred to me that games like StarCraft could be a good source of non-lethal weapon ideas. Imagine being able to use stuff like Hallucinations :)

'''Foogod:''' I like it!  Here's another idea:  Woozy Gun &amp;ndash; Hitting an opponent with this gun makes their view onscreen waver back and forth for a little while.. makes it really hard to run/shoot in a straight line. (for bots, just mess with their navigation/targetting AI)

'''Bullet:''' Just made the Impulse Rifle: If you hit ground you get knocked back, if you hit an enemy he gets knocked back even harder. The thing with pulling towards you could be easily implemented. But for now the weapon is build for learnings sake and I don't know wether the code is clean enough to publish it here...

'''T-1:''' Huh, wierd coincidence, I made the exact same weapon for my mod Slaughter, and I haven't even read this before. The pulling can be done with negative momentum transfer. My version doesn't knock the firer back though. It's perfect for killing stuff by pulling vehicles toward you and you jump out of the way but the person you're trying to hit with it probably won't even see the vehicle coming.

'''Bullet:''' Sounds great :D Need to try that!

'''Zxanphorian:''' I like this idea, but i think they should be kinda like relics or inventory, that you rotate through/use with different keys. The mesh would be on the opposite hand the weapon is in. I think this would get rid of being defenseless when you are attacked, until you switch to a normal weapon.

'''Bullet:''' To be honest I think CTF for example wouldn't be playable with this mod. Think of FaceClassic and the Impulse Gun which lets you travel from base to base in no time. Or the Drop Gun would make the game like Instagib! What do you think of what to do to balance it a bit better?

'''Uncommon:''' How would the impulse gun help you travel? Also, there's a big difference between the Drop Gun and Instagib: you can pick the flag up again. It just slows down your getaway, and gives your pursuers a chance to get the flag before you can retrieve it.

'''Bullet:''' Oops I just noticed that your definition of a Impulse Gun does NOT include pushing yourself forward if hitting ground instead of a player pawn :D

'''RabidZombie:''' What if you had a swap gun as a one shot superweapon. You fire and it will home on to the person within a distance of the crossair and when it arrives you swap possition with the other person. Lots of things could be achived and you wont be able to use it well at all times, it would add a real tactical (some reason I can't spell the word all of a sudden) edge, as you could jump off the edge then use it, swapping your seemingly doomful situation with your opp's peaceful walk.   Using it to get further means the enimy might be nearer to your base, so you got to use it at the righ time!

'''Uncommon:''' I like it :)

'''SoH_Ghost3021:''' Can i help? this looks like fun...

'''Uncommon:''' I don't know, can you? :)  I think the basic steps to getting this made are:
* Brainstorm some weapons
* Pick a well-rounded, well-balanced set from the brainstorming
* If talent is available, make custom models, skins, and sounds
* Make suitable HUD modifications, like hiding heath &amp; shields (or come up with a substitute)
* Lots of playtesting!

'''RabidZombie:''' Although i don't know how old this is, I HAVE thought of a new gun! It could be called the 'Nuts Gun'(altogth a name change is more than likely :P)  Basicly it randomly swaps round the primary and secondary movement controls(seperatly to avoid having 2 downs on the arrow buttons... maybie) and it will also swap the fires, jump and crouch buttons and also maybie give a nutty hud like the llama on JailBreak! Maybie another super weapon, Slow charge time, or a gun which could be toned down a touch... Wow, when I think about it, I can think of loads of unharmful guns...

Also another gun could be the double vision gun... The person affected sees double (or more) of people (and maybie items) around him, so he can't tell the real from the fake... 

Also the substitute for the Hud, maybie you could rearange it so you have a Charge area (maybie giving you ammo for the less power ful of the guns) a score indicator and maybie and friend radar (turn off-able by an option of course ;) )  

'''Uncommon:''' One complication with changing controls, vision, and stuff like that is it affects the player more than the game play, so bot support would be tricky. I think those debilitating-type weapons also need to be balanced with ones that are actually offensive or have other useful functions.</text>
    </revision>
    <revision>
      <id>4878</id>
      <timestamp>2007-08-21T22:45:35Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The concept here is to come up with some creative ''non-lethal'' weapon ideas. The basic idea in most team-based games is just to achieve a goal &amp;ndash; like bringing an object to a particular place &amp;ndash; while preventing the opposing team from doing the same. Some of us aren't all that much into violence, so what if we got creative with the weapons? They're really just tools to help you achieve the goals of the game.

The ideas so far are based on the UT weapons, largely because I don't want to tackle the task of making new models. If anyone else wants to be more ambitious, then so much the better.

===Weapon Ideas===
; Bubble gun : Hitting enemies with this gun creates a bubble around them. The bubble is highly visible, and shooting the bubble has the same effect as shooting the enemy inside; this makes the enemy much easier to see and hit from a distance, even with non-zooming weapons. Primarily useful as a sniping weapon.
; Drop rifle : Shoot it at the flag/ball carrier, and they drop the object. This could server as a replacement for the lightning gun, probably because it should have a significant firing delay.
; Portal launcher : Fires a projectile which, on impact, creates a portal that teleports an enemy back to their base (without any flag or ball they might be carrying). The portals last for a few seconds before disappearing. This would be mainly a defensive weapon, where you create walls of portals to prevent your enemies from getting to your flag. A direct hit on an enemy might not be effective, since it would take a moment for the portal to appear. This would replace the rocket launcher.
; Gravity gun : A variation on the link gun, which causes enemies to float into the air for a time, probably in preparation for a combination attack. Shooting the altfire at a portal from the portal launcher would cause nearby enemies to get pulled into it, and make the portal last longer.
; Speed stasis gun : Causes the target to continue moving at its current speed and direction for a few seconds. A variation of the gravity gun, and could be its alt fire.
; Impulse rifle : A shock rifle that does nothing but knockback, but lots of it. The altfire would be a beam that pulls the enemy towards you, potentially into a portal.
; Glue gun : A fairly obvious variation on the bio rifle: enemies get stuck or slowed down.
; Swap gun : Fires a homing projectile that causes you and your target to swap places. Slow rate of fire, possibly one-shot. Maybe a slow-moving projectile, but faster when fired at flag carriers. Maybe flags should get dropped, or given to the other player.

Other possibilies include weapons that affect visibility. That of course is vulnerable to cheating, but what cheater is going to want to play this? :)  You can also do growth (too big to fit through the door) and shrinking, affecting speed (make them move unmanageably fast), hallucinations, and so on.

==Comments ==

'''Tarquin:''' Sounds fun!

'''Foxpaw:''' I think that the &quot;impulse rifle&quot; may defeat the purpose of making it non-violent, since you could easily use it to knock people off ledges to their doom, and all.

'''Uncommon:''' Yes, falling damage is an issue to be resolved. Of course it depends on what map you're playing. Anyway, &quot;falling to your doom&quot; could be replaced with &quot;falling until you get teleported back to your base&quot;. Being returned to your base is basically what replaces dying in this mod. The &quot;suicide&quot; key would become more of a &quot;retreat&quot; key, and it may become more useful since many of the weapons will be designed to incapacitate. You either wait for the effect to wear off, or give up and go home to try again.

'''Uncommon:''' Another idea I've had is that any time your falling speed is such that hitting the groud would cause you damage (perhaps above a certain threshold), you automatically get returned to base. It also occurred to me that games like StarCraft could be a good source of non-lethal weapon ideas. Imagine being able to use stuff like Hallucinations :)

'''Foogod:''' I like it!  Here's another idea:  Woozy Gun &amp;ndash; Hitting an opponent with this gun makes their view onscreen waver back and forth for a little while.. makes it really hard to run/shoot in a straight line. (for bots, just mess with their navigation/targetting AI)

'''Bullet:''' Just made the Impulse Rifle: If you hit ground you get knocked back, if you hit an enemy he gets knocked back even harder. The thing with pulling towards you could be easily implemented. But for now the weapon is build for learnings sake and I don't know wether the code is clean enough to publish it here...

'''T-1:''' Huh, wierd coincidence, I made the exact same weapon for my mod Slaughter, and I haven't even read this before. The pulling can be done with negative momentum transfer. My version doesn't knock the firer back though. It's perfect for killing stuff by pulling vehicles toward you and you jump out of the way but the person you're trying to hit with it probably won't even see the vehicle coming.

'''Bullet:''' Sounds great :D Need to try that!

'''Zxanphorian:''' I like this idea, but i think they should be kinda like relics or inventory, that you rotate through/use with different keys. The mesh would be on the opposite hand the weapon is in. I think this would get rid of being defenseless when you are attacked, until you switch to a normal weapon.

'''Bullet:''' To be honest I think CTF for example wouldn't be playable with this mod. Think of FaceClassic and the Impulse Gun which lets you travel from base to base in no time. Or the Drop Gun would make the game like Instagib! What do you think of what to do to balance it a bit better?

'''Uncommon:''' How would the impulse gun help you travel? Also, there's a big difference between the Drop Gun and Instagib: you can pick the flag up again. It just slows down your getaway, and gives your pursuers a chance to get the flag before you can retrieve it.

'''Bullet:''' Oops I just noticed that your definition of a Impulse Gun does NOT include pushing yourself forward if hitting ground instead of a player pawn :D

'''RabidZombie:''' What if you had a swap gun as a one shot superweapon. You fire and it will home on to the person within a distance of the crossair and when it arrives you swap possition with the other person. Lots of things could be achived and you wont be able to use it well at all times, it would add a real tactical (some reason I can't spell the word all of a sudden) edge, as you could jump off the edge then use it, swapping your seemingly doomful situation with your opp's peaceful walk.   Using it to get further means the enimy might be nearer to your base, so you got to use it at the righ time!

'''Uncommon:''' I like it :)

'''SoH_Ghost3021:''' Can i help? this looks like fun...

'''Uncommon:''' I don't know, can you? :)  I think the basic steps to getting this made are:
* Brainstorm some weapons
* Pick a well-rounded, well-balanced set from the brainstorming
* If talent is available, make custom models, skins, and sounds
* Make suitable HUD modifications, like hiding heath &amp; shields (or come up with a substitute)
* Lots of playtesting!

'''RabidZombie:''' Although i don't know how old this is, I HAVE thought of a new gun! It could be called the 'Nuts Gun'(altogth a name change is more than likely :P)  Basicly it randomly swaps round the primary and secondary movement controls(seperatly to avoid having 2 downs on the arrow buttons... maybie) and it will also swap the fires, jump and crouch buttons and also maybie give a nutty hud like the llama on JailBreak! Maybie another super weapon, Slow charge time, or a gun which could be toned down a touch... Wow, when I think about it, I can think of loads of unharmful guns...

Also another gun could be the double vision gun... The person affected sees double (or more) of people (and maybie items) around him, so he can't tell the real from the fake... 

Also the substitute for the Hud, maybie you could rearange it so you have a Charge area (maybie giving you ammo for the less power ful of the guns) a score indicator and maybie and friend radar (turn off-able by an option of course ;) )  

'''Uncommon:''' One complication with changing controls, vision, and stuff like that is it affects the player more than the game play, so bot support would be tricky. I think those debilitating-type weapons also need to be balanced with ones that are actually offensive or have other useful functions.

'''Marduk2:''' Umm, I got an idea for two items, Rocket Boots, they make you move super fast in one direction for a while, but if you hit anything you stop immediately and trip so you have to get back up.

and the Spy pad, it places a small black disc on teh ground that makes any player who steps on it look like a member of the opposite team, this could let them sabotage the enemy's efforts.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Pool</title>
    <id>1909</id>
    <revision>
      <id>4679</id>
      <timestamp>2003-10-19T02:05:39Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Pool Table Game Type ==

This is based on billiards, known in the USA as &quot;pool&quot; and would be for UT 2003. The idea is to create karma sphere actors that would be pool balls. They would be on a pool table with pockets. It would be designed for two players (could be more I suppose). Somehow you would want it so that only the player whose turn it was could shoot. Each player would have an insta-gib shock rifle to shoot the balls with. I've done crude experiments with karma spheres and shooting them with the insta-gib rifle does work. The balls bounce off each other and walls very nicely, much like real pool balls. 

You would probably want it so that when a pool ball fell into a pocket it was destroyed and a point was recorded for that player. Whether or not to try an implement the standard rules of pool or make up new ones is a matter for debate. I see no reason though why the exact rules of real life pool would need to be used. Even a simple implementation would probably be very enjoyable. Also, there might be some interesting opportunity for adding combat between the players into the game, based somehow on the pool game. Perhaps the winner of the game gets to frag the other player or something. There are all kinds of variations of the concept that could be done. Let your imagination run wild!

This has been a random idea brought to you by RageMachine.

===Discussion===

'''Corran''' I'm planning on making a billiards game using the UnrealEngine2 Runtime. I haven't started yet as the source hasn't been released yet, but I'll be starting soon.

'''RDGDanClark:''' Seems to me that you could very easily modify Bombing Run for this kind of thing... put a bomb gate in each pocket, then give each ball the properties of the bombing run ball. The scoring system would have to be overhauled though. It would take a little time, but it sounds like fun.

'''Dragonmaw:''' The scoring system would be easy, since a player pawn isn't passing through the gate, you only need to change the line of code that states the score when a person shoots the ball in.</text>
    </revision>
    <revision>
      <id>4680</id>
      <timestamp>2003-10-19T00:32:25Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Pool Table Game Type ==

This is based on billiards, known in the USA as &quot;pool&quot; and would be for UT 2003. The idea is to create karma sphere actors that would be pool balls. They would be on a pool table with pockets. It would be designed for two players (could be more I suppose). Somehow you would want it so that only the player whose turn it was could shoot. Each player would have an insta-gib shock rifle to shoot the balls with. I've done crude experiments with karma spheres and shooting them with the insta-gib rifle does work. The balls bounce off each other and walls very nicely, much like real pool balls. 

You would probably want it so that when a pool ball fell into a pocket it was destroyed and a point was recorded for that player. Whether or not to try an implement the standard rules of pool or make up new ones is a matter for debate. I see no reason though why the exact rules of real life pool would need to be used. Even a simple implementation would probably be very enjoyable. Also, there might be some interesting opportunity for adding combat between the players into the game, based somehow on the pool game. Perhaps the winner of the game gets to frag the other player or something. There are all kinds of variations of the concept that could be done. Let your imagination run wild!

This has been a random idea brought to you by RageMachine.

===Discussion===

'''Corran''' I'm planning on making a billiards game using the UnrealEngine2 Runtime. I haven't started yet as the source hasn't been released yet, but I'll be starting soon.

'''RDGDanClark:''' Seems to me that you could very easily modify Bombing Run for this kind of thing... put a bomb gate in each pocket, then give each ball the properties of the bombing run ball. The scoring system would have to be overhauled though. It would take a little time, but it sounds like fun.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Possessed</title>
    <id>1936</id>
    <revision>
      <id>4741</id>
      <timestamp>2004-07-06T17:17:47Z</timestamp>
      <contributor>
        <ip>Outbound.rhpl.richmondhill.on.ca</ip>
      </contributor>
      <comment>someone wanna try this?</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Possessed.}}

==Description ==

This mod is an unusual take on a standard deathmatch.  Players spawn as ghosts and must zoom around the level attempting to find a body to inhabit.  Once in a body, the fragging can begin.  The player that stays within a body for the longest amount of time wins the game.

While in &quot;ghost mode&quot; a player will continually lose points at the rate of 1 point per half second.  In ghost mode players cannot collect objects although they can trigger doors and switches and travel through teleporters.  Upon collision with a body a player in ghost mode will enter the body and be able to play normally.  Ghost mode '''does not''' allow players to walk through walls and the like &amp;ndash; the level must be traversed normally.  Ghosts move 25% faster than normal players.

While inhabiting a body players interact with the objects and levels as they would normally.  If a player is killed they immediately become a ghost.  If the body was not gibbed then it simply lies on the floor awaiting a new inhabitant.  If it was gibbed then a new body is spawned somewhere around the level.  Players cannot enter the body they last inhabited.

Bodies are initially spawned randomly around the level.  There are always the same number of bodies available as there are players.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''AlphaOne''' I'm interested in this modification. Maybe some players should be allowed to overtake bodies of weaker owners - based on frags.

[[Legacy:AlphaOne/Developer Journal|AlphaOne/Developer Journal]]!

==Discussion ==

'''EntropicLqd:'''  A rather odd idea inspired by the PlayerController class and the Scooby Doo movie that my eldest inflicted upon me last night.

'''Tarquin:''' Cool idea, ent. watch bad films more often! :D

'''ZxAnPhOrIaN:''' Cool thing! 

'''Vajuras:''' I actually thought of a similar concept back in the day. It's a good idea but how bout adding some complexity like allowing the ghost to jump into a stronger body when they come across one. And you could give it a neat background.

'''Jeeptrash:''' Hey, neat; I like it too. Here's a suggestion: base the game type around the possesion/ghost thing but allow different variations... I like the ones above but I alos like the idea of having a set number of corpses, say 3x the players, that when gibbed are gone forever... musical ghost blood chairs....

'''Dark Pulse:''' This is a very, very interesting idea, and it's refreshingly original to boot. I look foward to playing it someday :)

'''Plouj:''' I've just played SlaveMaster and that game confused the heck out of me. The ever switching loyalty is not my type of fun. So, even though I enjoyed the basic idea of SlaveMaster, I think Possessed has more potential.</text>
    </revision>
    <revision>
      <id>4742</id>
      <timestamp>2003-08-11T00:33:19Z</timestamp>
      <contributor>
        <ip>AlphaOne</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Possessed.}}

==Description ==

This mod is an unusual take on a standard deathmatch.  Players spawn as ghosts and must zoom around the level attempting to find a body to inhabit.  Once in a body, the fragging can begin.  The player that stays within a body for the longest amount of time wins the game.

While in &quot;ghost mode&quot; a player will continually lose points at the rate of 1 point per half second.  In ghost mode players cannot collect objects although they can trigger doors and switches and travel through teleporters.  Upon collision with a body a player in ghost mode will enter the body and be able to play normally.  Ghost mode '''does not''' allow players to walk through walls and the like &amp;ndash; the level must be traversed normally.  Ghosts move 25% faster than normal players.

While inhabiting a body players interact with the objects and levels as they would normally.  If a player is killed they immediately become a ghost.  If the body was not gibbed then it simply lies on the floor awaiting a new inhabitant.  If it was gibbed then a new body is spawned somewhere around the level.  Players cannot enter the body they last inhabited.

Bodies are initially spawned randomly around the level.  There are always the same number of bodies available as there are players.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''AlphaOne''' I'm interested in this modification. Maybe some players should be allowed to overtake bodies of weaker owners - based on frags.

[[Legacy:AlphaOne/Developer Journal|AlphaOne/Developer Journal]]!

==Discussion ==

'''EntropicLqd:'''  A rather odd idea inspired by the PlayerController class and the Scooby Doo movie that my eldest inflicted upon me last night.

'''Tarquin:''' Cool idea, ent. watch bad films more often! :D

'''ZxAnPhOrIaN:''' Cool thing! 

'''Vajuras:''' I actually thought of a similar concept back in the day. It's a good idea but how bout adding some complexity like allowing the ghost to jump into a stronger body when they come across one. And you could give it a neat background.

'''Jeeptrash:''' Hey, neat; I like it too. Here's a suggestion: base the game type around the possesion/ghost thing but allow different variations... I like the ones above but I alos like the idea of having a set number of corpses, say 3x the players, that when gibbed are gone forever... musical ghost blood chairs....

'''Dark Pulse:''' This is a very, very interesting idea, and it's refreshingly original to boot. I look foward to playing it someday :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Power Domination</title>
    <id>2000</id>
    <revision>
      <id>4889</id>
      <timestamp>2004-08-25T00:05:07Z</timestamp>
      <contributor>
        <ip>Dark Ryder</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Power Domination will combine Domination with Onslaught thusly:

* Points are scored by holding the majority of power nodes for the duration of the countdown (maybe 20 seconds). Also, the countdown will only start when neighboring nodes are owned by opposing teams.
* Linked power nodes can be claimed (or stolen) instantly by touching them, whether the opposing team owns them or not. Vehicles still take the normal time to spawn, which can be hastened with the link gun.
* Shooting a power node has no effect. To take an enemy node you must get out of your vehicle and touch it.
* Isolated power nodes instantly become neutral.

That should add some more variety to the Onslaught landscape. It does take the focus away from the bases, but you can still get creative with links setups.

----

'''Dark Ryder:'''This idea has some real merit!  It sounds similar to &amp;rarr; and can be made even ''more'' similar to &amp;rarr; the scoring method used in Battlefield 1942.  Have each team start with their &quot;Power Core&quot; at the same level, which slowly drains at a rate equal to the ratio of the Power Nodes they control.  For example, if a team controls all the nodes, their &quot;Core&quot; doesn't drain at all and their opponents' drains at the maximum rate.  If both teams control half the Nodes, both &quot;Cores&quot; drain at one-half the maximum rate.  You could even change the stealing to occur after a certain amount of time within the &quot;radius&quot; of the Node.  (I know a lot of people who weren't very interested in UT2003 when it came out because they felt the gametypes were inferior to that of BF1942; I disagree, but a gametype like this would go a long way towards bridging that gap.)</text>
    </revision>
    <revision>
      <id>4890</id>
      <timestamp>2004-03-23T19:17:26Z</timestamp>
      <contributor>
        <ip>Uncommon.dsl.xmission.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Power Domination will combine Domination with Onslaught thusly:

* Points are scored by holding the majority of power nodes for the duration of the countdown (maybe 20 seconds). Also, the countdown will only start when neighboring nodes are owned by opposing teams.
* Linked power nodes can be claimed (or stolen) instantly by touching them, whether the opposing team owns them or not. Vehicles still take the normal time to spawn, which can be hastened with the link gun.
* Shooting a power node has no effect. To take an enemy node you must get out of your vehicle and touch it.
* Isolated power nodes instantly become neutral.

That should add some more variety to the Onslaught landscape. It does take the focus away from the bases, but you can still get creative with links setups.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Predator</title>
    <id>1924</id>
    <revision>
      <id>4713</id>
      <timestamp>2004-05-20T00:31:47Z</timestamp>
      <contributor>
        <ip>D204.p6.col.ru</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Predator ===

What is predator? Ever watch the movie and wish you were the predator stalking the defenceless humans. Well thats what this gametype is. Deadly ideas self!

====In depth Description ====

When the game starts a random person is choosen to be the predator. The predator should start with an instagib rifle and be partially invisible(WITHOUT IT RUNNING OUT BTW). Then the game seperates everybody on one team and the predator on the other. Everyone hunts the predator but get blown to pieces by the instagib rifle. When the predator gets killed the person who killed it becomes the new predator. You can only get points by being the predator. Thus meaning the winner is the one with the most points.

~The Twiggman~

====Comments ====

'''nomad:''' Sounds good, the only problem I see with it is the team switching thing. I've already tried this and the only way to switch teams is before the game starts. It's something to do with the new team system Epic have created. But it's not possible, and with a little work it could be pulled off.

'''Claw:''' Why switch teams at all? Just make it Deathmatch with one being the Predator, like so many similar mods for UT. I think that it would be cooler with more authentic weapons though. Shoulder cannon (with targeting help maybe :)) and wristblades. It would rock in big terrain maps.

'''_Lynx''' I suppose, that if you gonna make this stuff, all you need is just to rework usual Muatant gametype, just change the mutatnt effect, disable health draw, give only IG-rifle and again disable the Bottom Feeder.</text>
    </revision>
    <revision>
      <id>4714</id>
      <timestamp>2002-10-14T21:09:28Z</timestamp>
      <contributor>
        <ip>Claw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Predator ===

What is predator? Ever watch the movie and wish you were the predator stalking the defenceless humans. Well thats what this gametype is. Deadly ideas self!

====In depth Description ====

When the game starts a random person is choosen to be the predator. The predator should start with an instagib rifle and be partially invisible(WITHOUT IT RUNNING OUT BTW). Then the game seperates everybody on one team and the predator on the other. Everyone hunts the predator but get blown to pieces by the instagib rifle. When the predator gets killed the person who killed it becomes the new predator. You can only get points by being the predator. Thus meaning the winner is the one with the most points.

~The Twiggman~

====Comments ====

'''nomad:''' Sounds good, the only problem I see with it is the team switching thing. I've already tried this and the only way to switch teams is before the game starts. It's something to do with the new team system Epic have created. But it's not possible, and with a little work it could be pulled off.

'''Claw:''' Why switch teams at all? Just make it Deathmatch with one being the Predator, like so many similar mods for UT. I think that it would be cooler with more authentic weapons though. Shoulder cannon (with targeting help maybe :)) and wristblades. It would rock in big terrain maps.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ProjectMassive</title>
    <id>2012</id>
    <revision>
      <id>4916</id>
      <timestamp>2005-03-25T17:40:05Z</timestamp>
      <contributor>
        <ip>Pcp08984510pcs.trnrsv01.nj.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* By working on the project you will automatically be part of the first game test. There will be a poll (you obviously cannot vote for yourself) that will pick who gave the most for the project. The top 8-9 people (i'm still deciding if I would be one) will be team leaders. If you want to be part of the game you have to contribute!

Now, onto the project itself:
* It is called Project Massive. There is a planet with 9 moons. Each moon is like a planet of its own, each with it's own terrain, climate, and therefore mutators. Each team starts with a moon under their control. The planet is a neutral zone. There will be two winners. The first will be who manages to control 5 moons at one time. That team will become neutral until later (they can do whatever they want, if anything, they already won). Their moons will become unowned, open for capture. The next team to capture 5 moons is the other winner. The two winning teams will play one, just ONE, onslaught game for the championship.

CAPTURING:
* Each moon has two bases: the Capitol and the Bay. The Capitol holds an artifact that anyone can carry, multiple people at once as well. If someone (not the same team) gets the artifact, they may go to the planet and touch the artifact at the neutral base. If that happens, that team has successfully captured that moon.

The Bay is the base where you appear when you land on the planet (ala Landing Bay). It is positioned opposite of the Capitol. So, to get to the Capitol you must travel across the planet, then you must either hijack a ship or go all the way back to the Bay to get one.

THE PLANET:
* No name yet. On the planet there are colleseums, training warrooms, and just about anything else that MMORPGer would want. When you connect to the game, you are put on the planet. When you fly to a moon under your team's control, you land in the Capitol, not the Bay.

WEAPONS/ITEMS:
* You get weapons on the planet. Well, not weapons, weapon packages. Your character has a master weapon which can transform into any weapon in the game. By completing quests, winning tournaments, or even just getting twinked, you can get weapon packages which allow you to use that weapon. We will use some of the weapons from the game, but I plan on making tons exclusively for this.
* There will also be items, which will affect things like your HP, Starting Ammo, and other stats.
* Weapons also have levels, which will be explained next.

XP:
* First things first: There are no player levels. There is, however, XP. There is Total XP and then regular XP. Your total xp is more for comparison to other players, it is all the xp you've ever had, including what you have now. XP is used for everything. For example, some weapon packages require you to buy level upgrades with XP. Some actually start at level 0, so you have to upgrade for it to be functional.
* You gain XP by completing quests, winning games (collesseum), and just plain out fragging.

GAMES:
* There are several games, mostly in the collesseum (some special ones in quests and such). Most of the games (besides onslaught) are in the colleseum, as well as others which will be exclusive to this. There will only be the favorite levels in the colleseum, and only so many games at once (otherwise there would be way to much at once).

TRAVEL:
* Travel from moon to moon (to planet) is simple. You get in a space vehicle (I hate the ones included in the game, the ships will be completely redone) and fly to where you want to go. Just like in any part of this, you can attack others in space. However, the only way to land is to go to a landing bay, or the capitol if you own the moon.

DEATH:
* You do not lose XP for death. You lose it for losing at games, losing captured moons, etc. When you die in space, you are regenerated to the bay on the planet. When you die on the planet, you are regenerated to the pub (regen spot). When you die on a moon, you are regenerated to the Capitol or Bay if you own the moon or not, respectively.

STORYLINE:
* Though there is no storyline during the actual game, I am going to make a machinima to go along with it. All I really need is voice actors, as the rest will be done by me.

NOTES:
* This is like an MMORPG, each game will take place 1-3 months at a time. You can rejoin as many times as you want, but you will always be on the same team (the one you were picked to be on).

* I need members for this project! I will have a site up soon!

* Image Gallery: http://img129.exs.cx/gal.php?g=hud010tm.jpg</text>
    </revision>
    <revision>
      <id>4917</id>
      <timestamp>2005-03-25T17:39:08Z</timestamp>
      <contributor>
        <ip>Pcp08984510pcs.trnrsv01.nj.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">* By working on the project you will automatically be part of the first game test. There will be a poll (you obviously cannot vote for yourself) that will pick who gave the most for the project. The top 8-9 people (i'm still deciding if I would be one) will be team leaders. If you want to be part of the game you have to contribute!

Now, onto the project itself:
* It is called Project Massive. There is a planet with 9 moons. Each moon is like a planet of its own, each with it's own terrain, climate, and therefore mutators. Each team starts with a moon under their control. The planet is a neutral zone. There will be two winners. The first will be who manages to control 5 moons at one time. That team will become neutral until later (they can do whatever they want, if anything, they already won). Their moons will become unowned, open for capture. The next team to capture 5 moons is the other winner. The two winning teams will play one, just ONE, onslaught game for the championship.

CAPTURING:
* Each moon has two bases: the Capitol and the Bay. The Capitol holds an artifact that anyone can carry, multiple people at once as well. If someone (not the same team) gets the artifact, they may go to the planet and touch the artifact at the neutral base. If that happens, that team has successfully captured that moon.

The Bay is the base where you appear when you land on the planet (ala Landing Bay). It is positioned opposite of the Capitol. So, to get to the Capitol you must travel across the planet, then you must either hijack a ship or go all the way back to the Bay to get one.

THE PLANET:
* No name yet. On the planet there are colleseums, training warrooms, and just about anything else that MMORPGer would want. When you connect to the game, you are put on the planet. When you fly to a moon under your team's control, you land in the Capitol, not the Bay.

WEAPONS/ITEMS:
* You get weapons on the planet. Well, not weapons, weapon packages. Your character has a master weapon which can transform into any weapon in the game. By completing quests, winning tournaments, or even just getting twinked, you can get weapon packages which allow you to use that weapon. We will use some of the weapons from the game, but I plan on making tons exclusively for this.
* There will also be items, which will affect things like your HP, Starting Ammo, and other stats.
* Weapons also have levels, which will be explained next.

XP:
* First things first: There are no player levels. There is, however, XP. There is Total XP and then regular XP. Your total xp is more for comparison to other players, it is all the xp you've ever had, including what you have now. XP is used for everything. For example, some weapon packages require you to buy level upgrades with XP. Some actually start at level 0, so you have to upgrade for it to be functional.
* You gain XP by completing quests, winning games (collesseum), and just plain out fragging.

GAMES:
* There are several games, mostly in the collesseum (some special ones in quests and such). Most of the games (besides onslaught) are in the colleseum, as well as others which will be exclusive to this. There will only be the favorite levels in the colleseum, and only so many games at once (otherwise there would be way to much at once).

TRAVEL:
* Travel from moon to moon (to planet) is simple. You get in a space vehicle (I hate the ones included in the game, the ships will be completely redone) and fly to where you want to go. Just like in any part of this, you can attack others in space. However, the only way to land is to go to a landing bay, or the capitol if you own the moon.

DEATH:
* You do not lose XP for death. You lose it for losing at games, losing captured moons, etc. When you die in space, you are regenerated to the bay on the planet. When you die on the planet, you are regenerated to the pub (regen spot). When you die on a moon, you are regenerated to the Capitol or Bay if you own the moon or not, respectively.

STORYLINE:
* Though there is no storyline during the actual game, I am going to make a machinima to go along with it. All I really need is voice actors, as the rest will be done by me.

NOTES:
* This is like an MMORPG, each game will take place 1-3 months at a time. You can rejoin as many times as you want, but you will always be on the same team (the one you were picked to be on).

* I need members for this project! I will have a site up soon!

* [http://img129.exs.cx/gal.php?g=hud010tm.jpg Image Gallery]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/RacingSuicideMantas</title>
    <id>2004</id>
    <revision>
      <id>4899</id>
      <timestamp>2004-03-31T05:04:12Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This mutator changes all the Mantas in an ONS map into Racing Suicide Mantas, which are faster, weaker, and explode bigger.

Current:

0.10.1 - First public release, tested in Instant Action.  [http://www.bonzoesc.net/ut2004/RacingSuicideMantas.zip]

Roadmap:

0.1x.x - Bugfixes

0.20.x - New skins, maybe?

'''Foxpaw:''' Maybe just a nitpick, but should we have a different section for completed mods? Reason being, some mod &quot;idea&quot; pages have been finished and have download links, but are still subpages of Mod Ideas.</text>
    </revision>
    <revision>
      <id>4900</id>
      <timestamp>2004-03-31T02:35:13Z</timestamp>
      <contributor>
        <ip>BonzoESC</ip>
      </contributor>
      <comment>Page created, mutator posted.</comment>
      <text xml:space="preserve">This mutator changes all the Mantas in an ONS map into Racing Suicide Mantas, which are faster, weaker, and explode bigger.

Current:

0.10.1 - First public release, tested in Instant Action.  [http://www.bonzoesc.net/ut2004/RacingSuicideMantas.zip]

Roadmap:

0.1x.x - Bugfixes

0.20.x - New skins, maybe?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/RagDollPhysics</title>
    <id>2019</id>
    <revision>
      <id>4928</id>
      <timestamp>2006-03-03T05:11:25Z</timestamp>
      <contributor>
        <ip>Mad</ip>
      </contributor>
      <comment>*Start on RagDollPhysics mutator</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; Changing Ragdoll Physics parameters}}

==Description ==

This small mod allows the user to enter the configuration menu upon adding the mutator to the game, and changing various parameters to change the behavior on ragdolls in the game. Any ideas for enhancements or bug fixes are appreciated.

===Code ===

Here is the code for MutRagDollPhysics.uc.

&lt;uscript&gt;
/******************************************************************************************
     MutRagDollPhysics
     This mutator allows player to configure ragdoll properties.
******************************************************************************************/
class MutRagDollPhysics extends Mutator
      config;

//variable declarations
var globalconfig int nRagInvInertia;
var globalconfig int nRagSpinScale;
var globalconfig int nRagDeathUpKick;

//Gui properties
const PROPNUM = 3;
//Macros
const RAG_INV_INERTIA       = 0;
const RAG_SPIN_SCALE        = 1;
const RAG_DEATH_UP_KICK     = 2;

//widgets declaration
var localized string MutPropsDisplayText[PROPNUM];
var localized string MutDescText[PROPNUM];

function ModifyPlayer(Pawn Other)
{
     local xPawn x;
     x = xPawn(Other);
     if(x != None)
     {
          x.RagInvInertia     = nRagInvInertia;
          x.RagSpinScale      = nRagSpinScale;
          x.RagDeathUpKick    = nRagDeathUpKick;
     }
     Super.ModifyPlayer(Other);
}

/*
The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
of the config window.
*/
static event string GetDescriptionText(string PropName)
{
     switch (PropName)
     {
          case &quot;nRagInvInertia&quot;     :  return default.MutDescText[RAG_INV_INERTIA];
          case &quot;nRagSpinScale&quot;      :  return default.MutDescText[RAG_SPIN_SCALE];
          case &quot;nRagDeathUpKick&quot;    :  return default.MutDescText[RAG_DEATH_UP_KICK];
     }
     return Super.GetDescriptionText(PropName);
}

/*
This function is called to actually add the configuration options for the
mutator to the configuration window.
*/
static function FillPlayInfo(PlayInfo PlayInfo)
{
     Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
     //RagInvInertia property
     PlayInfo.AddSetting(default.GameGroup, &quot;nRagInvInertia&quot;, default.MutPropsDisplayText[RAG_INV_INERTIA], 0, 0, &quot;Text&quot;, &quot;8;0:500&quot;);
     //RagSpinScale
     PlayInfo.AddSetting(default.GameGroup, &quot;nRagSpinScale&quot;, default.MutPropsDisplayText[RAG_SPIN_SCALE], 0, 0, &quot;Text&quot;, &quot;8;0:100&quot;);
     //RagDeathUpKick
     PlayInfo.AddSetting(default.GameGroup, &quot;nRagDeathUpKick&quot;, default.MutPropsDisplayText[RAG_DEATH_UP_KICK], 0, 0, &quot;Text&quot;, &quot;8;150:800&quot;);
}

defaultproperties
{
     //Defaults
     nRagInvInertia = 4
     nRagSpinScale = 2.5
     nRagDeathUpKick = 150

     MutPropsDisplayText[RAG_INV_INERTIA] = &quot;Ragdoll Inertia&quot;
     MutDescText[RAG_INV_INERTIA] = &quot;This will change the inertia of which the ragdoll will achieve.&quot;
     //for some reason, the predefined values up top do not work in default properties when greater than 0.
     MutPropsDisplayText[1] = &quot;Ragdoll Spin Scale&quot;
     MutDescText[1] = &quot;This will determine the rate of spin on the ragdoll.&quot;

     MutPropsDisplayText[2] = &quot;Ragdoll Upwards Kick&quot;
     MutDescText[2] = &quot;This will determine upwards motion on death.&quot;

     ConfigMenuClassName = &quot;&quot;
     GroupName = &quot;Ragdoll&quot;
     FriendlyName = &quot;Ragdoll&quot;
     description = &quot;Allows you to change specific properties on ragdoll effects.&quot;
}
&lt;/uscript&gt;

==Enhancements/Bugs ==

'''Mad:''' Possibly add code to turn off gibbing of players.

==Discussion ==

'''Mad:''' I thought it was funny to see any non-gibbed ragdolls fly all over the place upon death, so I thought I would share it with you guys.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Random Gravity</title>
    <id>2001</id>
    <revision>
      <id>4891</id>
      <timestamp>2006-06-14T06:48:25Z</timestamp>
      <contributor>
        <ip>Ip-65-91-96-140.linkstarwireless.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for any UT Engine Game &amp;ndash; Random Gravity}}

==Description ==

This mutator would change the level's gravity at set or random intervals. One minute you'd be flying, the next you'd be nearly locked to the ground.

==Method ==

Simply modify the low-gravity mutator to accept different gravity settings, and then make a Timer that would randomly set new gravity between the two extremes.

====Interested Scripters ====

If you are interested in developing this mod for any UT Engine Game then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* [[Legacy:Kamek|Kamek]] (Postal 2 version)

==Discussion ==

'''Kamek:''' I'm going to make this for Postal 2, if anyone wants to make a UT flavor feel free.

'''xX)(Xx:''' Possibly as well as a mutator, a zone info variant? EG. Random Gravity Zone

'''Kamek:''' Totally possible, and would definately make for some wild maps. :)

'''iSlak:''' I'm pretty inexperienced to UT coding but here's my attempt at the UT2K4 version:

&lt;uscript&gt;
var float GravityZ;

event PreBeginPlay()
{
	SetTimer (10.0, true);
}

function Timer()
{
	local PhysicsVolume myPhysics;

	GravityZ = -(Rand(1800));

	foreach AllActors(class'PhysicsVolume', myPhysics)
	{
		myPhysics.Gravity.Z = GravityZ;
	}
}
&lt;/uscript&gt;

It worked well with single player, including vehicles in Onslaught. I'm not sure how this would run in  network play.

'''Missilemaster:''' Fixed a typo in there for you...it said &quot;myPysics&quot; (no &quot;h&quot;) before. :P</text>
    </revision>
    <revision>
      <id>4892</id>
      <timestamp>2005-08-09T20:27:33Z</timestamp>
      <contributor>
        <ip>ISlak</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for any UT Engine Game &amp;ndash; Random Gravity}}

==Description ==

This mutator would change the level's gravity at set or random intervals. One minute you'd be flying, the next you'd be nearly locked to the ground.

==Method ==

Simply modify the low-gravity mutator to accept different gravity settings, and then make a Timer that would randomly set new gravity between the two extremes.

====Interested Scripters ====

If you are interested in developing this mod for any UT Engine Game then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* [[Legacy:Kamek|Kamek]] (Postal 2 version)

==Discussion ==

'''Kamek:''' I'm going to make this for Postal 2, if anyone wants to make a UT flavor feel free.

'''xX)(Xx:''' Possibly as well as a mutator, a zone info variant? EG. Random Gravity Zone

'''Kamek:''' Totally possible, and would definately make for some wild maps. :)

'''iSlak:''' I'm pretty inexperienced to UT coding but here's my attempt at the UT2K4 version:

&lt;uscript&gt;
var float GravityZ;

event PreBeginPlay()
{
	SetTimer (10.0, true);
}

function Timer()
{
	local PhysicsVolume myPhysics;

	GravityZ = -(Rand(1800));

	foreach AllActors(class'PhysicsVolume', myPhysics)
	{
		myPysics.Gravity.Z = GravityZ;
	}
}
&lt;/uscript&gt;

It worked well with single player, including vehicles in Onslaught. I'm not sure how this would run in  network play.</text>
    </revision>
    <revision>
      <id>4893</id>
      <timestamp>2006-02-05T21:19:57Z</timestamp>
      <contributor>
        <ip>Ip-65-91-96-140.linkstarwireless.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for any UT Engine Game &amp;ndash; Random Gravity}}

==Description ==

This mutator would change the level's gravity at set or random intervals. One minute you'd be flying, the next you'd be nearly locked to the ground.

==Method ==

Simply modify the low-gravity mutator to accept different gravity settings, and then make a Timer that would randomly set new gravity between the two extremes.

====Interested Scripters ====

If you are interested in developing this mod for any UT Engine Game then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* [[Legacy:Kamek|Kamek]] (Postal 2 version)

==Discussion ==

'''Kamek:''' I'm going to make this for Postal 2, if anyone wants to make a UT flavor feel free.

'''xX)(Xx:''' Possibly as well as a mutator, a zone info variant? EG. Random Gravity Zone

'''Kamek:''' Totally possible, and would definately make for some wild maps. :)

'''iSlak:''' I'm pretty inexperienced to UT coding but here's my attempt at the UT2K4 version:

'''Missilemaster:''' Fixed a typo in there for you...it said &quot;myPysics&quot; (no &quot;h&quot;) before. :P

&lt;uscript&gt;
var float GravityZ;

event PreBeginPlay()
{
	SetTimer (10.0, true);
}

function Timer()
{
	local PhysicsVolume myPhysics;

	GravityZ = -(Rand(1800));

	foreach AllActors(class'PhysicsVolume', myPhysics)
	{
		myPhysics.Gravity.Z = GravityZ;
	}
}
&lt;/uscript&gt;

It worked well with single player, including vehicles in Onslaught. I'm not sure how this would run in  network play.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Real Terrain</title>
    <id>1978</id>
    <revision>
      <id>4838</id>
      <timestamp>2007-11-19T16:49:25Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Deforming Terrain in Real-Time==

UT2003 has a nifty feature built into the [[Legacy:TerrainInfo|TerrainInfo]] class, that interestingly is not used by the game itself. It allows you to modify the heightmap of the terrain during play. Note that this feature is unique to UT2003, and is not part of the stock Unreal Engine.

The ability to modify terrain in real-time makes it possible for you to have your weapons create craters and all sorts of other mayhem. It is similar to the GeoMod technology used in Red Faction, but does not work quite the same. This form of terrain modification works simply by altering the height of different points on the terrain, which means a couple of things:

# You can't bore a tunnel through terrain using this. It is more like blasting a hole, and then having that hole fill up with sand/dirt/whatever from above.
# It looks a bit strange if you use it on extremely steep cliffs, but only the steepest of cliffs (basically 90 degree cliffs) are affected by this.
# The holes that are created have pointy bottoms. If you fall into a deep crater you will be able to see &quot;outside the world&quot; because the bottom of the hole is just wide enough for your player to fit in, but not the camera.

Also note that because players are generally going to want to walk over the ground, and cannot do so reasonably when it's filled with craters and chasms. It is therefore important not to go overboard with terrain deformation. Also be aware of any gameplay issues that may arise, such as the only entrances to a flagbase being blocked off by chasms of deformed terrain.

There is also a limit to how deeply you can burrow, which I believe is the minimum height of the heightmap. This means that eventually, if you crater it enough, it will start to plateu at a much lower level.

===How you Deform the Terrain===

The heart of the terrain deformation lies in a function called '''PokeTerrain.''' it's definition can be found in the [[Legacy:TerrainInfo|TerrainInfo]] class, and looks like this:

&lt;uscript&gt;
native final function PokeTerrain( vector WorldLocation, int Radius, int MaxDepth );
&lt;/uscript&gt;

'''WorldLocation''' is the location that you want to make the crater. The height above the terrain does not seem to make any difference, but I don't believe it will work if the location specified is below the terrain. '''Radius''' specifies the radius  of the crater you want to make. '''MaxDepth''' specifies the depth of crater you would like to make. Interestingly enough, although in theory it should have been easy to implement, you cannot make a lump in the terrain by using a negative maxdepth. You can only use poketerrain to decrease the height of the terrain.

'''Solid Snake:'''Well, maybe they fixed this a while ago, but with the latest patch you may use a negative value to increase the height of the terrain.

Unfortunately, that function is a little buggy so some care is needed when using it. Generally you would call it from within your HitWall function of your projectile. (hitting terrain always calls HitWall instead of Landed) However, sometimes it will not work if you simply use your Location as the WorldLocation. Sometimes it will, and sometimes it won't - this seems to depend on the physical size of the projectile. (it's collision height and radius) If your projectile does not seem to be denting the terrain - this may be why. Fortunately, however, this can be easily worked around by setting bBounce to true. bBounce is native and basically forces the physics engine to keep this object from penetrating into the ground when it hits. That should ensure that the projectile's location is always above the terrain level and thus that the poketerrain always works.

'''Solid Snake:''' Another way to fix this problem is to alter the location of the PokeTerrain, by using something like this: HitLocation + 16 * Vector(HitNormal), that way the PokeTerrain should always be above where the projectile hit.

To complete the effect, you should put a decal inside the new crater to give it it's own texture. If you do not, it will have the same texture as the terrain had before, which can look a bit silly if your redeemer leaves a craterful of snow behind.

===Everything in Moderation===

This was stated above, but it's worth repeating: it may seem cool to have all your weapons deform terrain and make huge craters, but trust me - it's not as cool as it seems. The crater created by the weapon should be significantly smaller than the &quot;blast effect,&quot; for three reasons:

# There is no tweening on the deformation, and if it is not completely covered by your other visual effects, it will look like crap as a chunk of the world vanishes before your very eyes. Ideally your projectile should also spawn some rocks and junk to come out so it looks like the chunk you removed actually went somewhere.
# It's mentioned above, but very important - although cratering the crap out of everything will not particularly impact the framerate, it can inhibit gameplay. Craters can &quot;pile up&quot; and leave a deep chasm or hole that people can fall into. Usually, they won't fall far enough to die, but they'll still be stuck, and the camera will be outside the world, which is ugly. Though it may also seem neat to &quot;open up new gameplay options&quot; through the ability to deform terrain, a literally impassable moat doesn't do much for gameplay. Also, things that were formerly placed nicely can end up just hovering in space: static mesh lamp posts mounted on the terrain will not &quot;fall&quot; into your new crater, for instance. Terrain Decoration Layers usually conform to the new shape, but not always.
# It's just plain unrealistic. A redeemer would probrably make a hole about the size of a luxury car. Fragmentation rockets would do little more than scorch the surface of the ground. Heck, a hydrogen bomb only takes a bite out of a small island. The amount of actual material displaced by an explosion is generally quite small compared to the area peppered by shrapnel and singed by the flames.

===Suggested Usage===

-Scorched Earth clone [http://www.scorched3d.co.uk/ http://www.scorched3d.co.uk/]-

==Discussion==

'''Foxpaw:''' Refactored the discussion and whatnot into a description of how to do it, now that we've got it all figured out. It probrably wouldn't hurt to rename this page to &quot;Deformable Terrain&quot; or &quot;Creating Deformable Terrain&quot; or something along those lines.

'''EntropicLqd:''' Good job well done.  Have some bonus points or something :)

'''AlphaOne:''' I added that for one main reason: because I think pokeTerrain sucks for anything else.

'''Foxpaw:''' It can actually have a nice effect, but you have to use it very judiciouslly. I use it on my mod - a 105mm howitzer causes a small depression about the size of a GT40.

'''Solid Snake:''' I just tried it, and maybe they fixed it in a patch a while ago, but you can actually increase the terrain height by using a negative value.

'''Foxpaw:''' I didn't have any success with that, but if you got it to work, then the above text could be updated with that information.

'''RegularX:''' Has anyone tried to use this to make random terrain?  Or is that wack tinfoil stuff?

'''Foxpaw:''' That sounds like it should be easily doable, but I don't think anyone has tried.

'''Solid Snake:''' I've tried it already... some pretty crap results though. Certainly not ones to brag about.

'''Foxpaw:''' Crap results in what sense? As in, is there a finite granularity to PokeTerrain that forces poor results, or is it simply difficult to generate the appropriate values to pass to PokeTerrain?

'''Solid Snake:''' While you can generate the terrain dynamically and randomly the texturing of the terrain is the next issue. As it isn't possible to really dynamically alter the terrain (I have already tried to the Unrealscripted Texture route, it results in a very blurry texture) because the textures don't match the resultant terrain just doesn't look very good or very real.

'''RegularX:''' Hrm, thanks for the info.  I'll give it a go anyway, since this project isn't FPS I think some luxuries can be taken on the terrain looking good.  The replayability of random terrain should trump it.

'''FrozenCow''' I've made a picture of the result of PokeTerrain with MaxDepth=-512:

[[Image:Legacy_PokeTerrainExample.jpeg|center|PokeTerrain Example with MaxDepth=-512]]
[[Category:Legacy Journal|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4839</id>
      <timestamp>2005-03-20T13:51:33Z</timestamp>
      <contributor>
        <ip>J86234.upc-j.chello.nl</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Deforming Terrain in Real-Time==

UT2003 has a nifty feature built into the [[Legacy:TerrainInfo|TerrainInfo]] class, that interestingly is not used by the game itself. It allows you to modify the heightmap of the terrain during play. Note that this feature is unique to UT2003, and is not part of the stock Unreal Engine.

The ability to modify terrain in real-time makes it possible for you to have your weapons create craters and all sorts of other mayhem. It is similar to the GeoMod technology used in Red Faction, but does not work quite the same. This form of terrain modification works simply by altering the height of different points on the terrain, which means a couple of things:

# You can't bore a tunnel through terrain using this. It is more like blasting a hole, and then having that hole fill up with sand/dirt/whatever from above.
# It looks a bit strange if you use it on extremely steep cliffs, but only the steepest of cliffs (basically 90 degree cliffs) are affected by this.
# The holes that are created have pointy bottoms. If you fall into a deep crater you will be able to see &quot;outside the world&quot; because the bottom of the hole is just wide enough for your player to fit in, but not the camera.

Also note that because players are generally going to want to walk over the ground, and cannot do so reasonably when it's filled with craters and chasms. It is therefore important not to go overboard with terrain deformation. Also be aware of any gameplay issues that may arise, such as the only entrances to a flagbase being blocked off by chasms of deformed terrain.

There is also a limit to how deeply you can burrow, which I believe is the minimum height of the heightmap. This means that eventually, if you crater it enough, it will start to plateu at a much lower level.

===How you Deform the Terrain===

The heart of the terrain deformation lies in a function called '''PokeTerrain.''' it's definition can be found in the [[Legacy:TerrainInfo|TerrainInfo]] class, and looks like this:

&lt;uscript&gt;
native final function PokeTerrain( vector WorldLocation, int Radius, int MaxDepth );
&lt;/uscript&gt;

'''WorldLocation''' is the location that you want to make the crater. The height above the terrain does not seem to make any difference, but I don't believe it will work if the location specified is below the terrain. '''Radius''' specifies the radius  of the crater you want to make. '''MaxDepth''' specifies the depth of crater you would like to make. Interestingly enough, although in theory it should have been easy to implement, you cannot make a lump in the terrain by using a negative maxdepth. You can only use poketerrain to decrease the height of the terrain.

'''Solid Snake:'''Well, maybe they fixed this a while ago, but with the latest patch you may use a negative value to increase the height of the terrain.

Unfortunately, that function is a little buggy so some care is needed when using it. Generally you would call it from within your HitWall function of your projectile. (hitting terrain always calls HitWall instead of Landed) However, sometimes it will not work if you simply use your Location as the WorldLocation. Sometimes it will, and sometimes it won't - this seems to depend on the physical size of the projectile. (it's collision height and radius) If your projectile does not seem to be denting the terrain - this may be why. Fortunately, however, this can be easily worked around by setting bBounce to true. bBounce is native and basically forces the physics engine to keep this object from penetrating into the ground when it hits. That should ensure that the projectile's location is always above the terrain level and thus that the poketerrain always works.

'''Solid Snake:''' Another way to fix this problem is to alter the location of the PokeTerrain, by using something like this: HitLocation + 16 * Vector(HitNormal), that way the PokeTerrain should always be above where the projectile hit.

To complete the effect, you should put a decal inside the new crater to give it it's own texture. If you do not, it will have the same texture as the terrain had before, which can look a bit silly if your redeemer leaves a craterful of snow behind.

===Everything in Moderation===

This was stated above, but it's worth repeating: it may seem cool to have all your weapons deform terrain and make huge craters, but trust me - it's not as cool as it seems. The crater created by the weapon should be significantly smaller than the &quot;blast effect,&quot; for three reasons:

# There is no tweening on the deformation, and if it is not completely covered by your other visual effects, it will look like crap as a chunk of the world vanishes before your very eyes. Ideally your projectile should also spawn some rocks and junk to come out so it looks like the chunk you removed actually went somewhere.
# It's mentioned above, but very important - although cratering the crap out of everything will not particularly impact the framerate, it can inhibit gameplay. Craters can &quot;pile up&quot; and leave a deep chasm or hole that people can fall into. Usually, they won't fall far enough to die, but they'll still be stuck, and the camera will be outside the world, which is ugly. Though it may also seem neat to &quot;open up new gameplay options&quot; through the ability to deform terrain, a literally impassable moat doesn't do much for gameplay. Also, things that were formerly placed nicely can end up just hovering in space: static mesh lamp posts mounted on the terrain will not &quot;fall&quot; into your new crater, for instance. Terrain Decoration Layers usually conform to the new shape, but not always.
# It's just plain unrealistic. A redeemer would probrably make a hole about the size of a luxury car. Fragmentation rockets would do little more than scorch the surface of the ground. Heck, a hydrogen bomb only takes a bite out of a small island. The amount of actual material displaced by an explosion is generally quite small compared to the area peppered by shrapnel and singed by the flames.

===Suggested Usage===

-Scorched Earth clone [http://www.scorched3d.co.uk/ http://www.scorched3d.co.uk/]-

==Discussion==

'''Foxpaw:''' Refactored the discussion and whatnot into a description of how to do it, now that we've got it all figured out. It probrably wouldn't hurt to rename this page to &quot;Deformable Terrain&quot; or &quot;Creating Deformable Terrain&quot; or something along those lines.

'''EntropicLqd:''' Good job well done.  Have some bonus points or something :)

'''AlphaOne:''' I added that for one main reason: because I think pokeTerrain sucks for anything else.

'''Foxpaw:''' It can actually have a nice effect, but you have to use it very judiciouslly. I use it on my mod - a 105mm howitzer causes a small depression about the size of a GT40.

'''Solid Snake:''' I just tried it, and maybe they fixed it in a patch a while ago, but you can actually increase the terrain height by using a negative value.

'''Foxpaw:''' I didn't have any success with that, but if you got it to work, then the above text could be updated with that information.

'''RegularX:''' Has anyone tried to use this to make random terrain?  Or is that wack tinfoil stuff?

'''Foxpaw:''' That sounds like it should be easily doable, but I don't think anyone has tried.

'''Solid Snake:''' I've tried it already... some pretty crap results though. Certainly not ones to brag about.

'''Foxpaw:''' Crap results in what sense? As in, is there a finite granularity to PokeTerrain that forces poor results, or is it simply difficult to generate the appropriate values to pass to PokeTerrain?

'''Solid Snake:''' While you can generate the terrain dynamically and randomly the texturing of the terrain is the next issue. As it isn't possible to really dynamically alter the terrain (I have already tried to the Unrealscripted Texture route, it results in a very blurry texture) because the textures don't match the resultant terrain just doesn't look very good or very real.

'''RegularX:''' Hrm, thanks for the info.  I'll give it a go anyway, since this project isn't FPS I think some luxuries can be taken on the terrain looking good.  The replayability of random terrain should trump it.

'''FrozenCow''' I've made a picture of the result of PokeTerrain with MaxDepth=-512:

[[Image:Legacy_PokeTerrainExample.jpeg|center|PokeTerrain Example with MaxDepth=-512]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Really Random Spawn Points Source</title>
    <id>1891</id>
    <revision>
      <id>4639</id>
      <timestamp>2002-07-30T19:26:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Features:  &quot;randomises&quot; players' start location (only on death - not inital spawn).

'''DJPaul:''' Removed.  Please remove the page.

'''Tarquin:'''  Will do.</text>
    </revision>
    <revision>
      <id>4640</id>
      <timestamp>2002-07-30T18:55:27Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <comment>please delete this page</comment>
      <text xml:space="preserve">Features:  &quot;randomises&quot; players' start location (only on death - not inital spawn).

'''DJPaul:''' Removed.  Please remove the page.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/RegeneratingAmmo</title>
    <id>1915</id>
    <revision>
      <id>4693</id>
      <timestamp>2004-02-25T21:59:56Z</timestamp>
      <contributor>
        <ip>Cpe-66-87-25-112.ut.sprintbbd.net</ip>
      </contributor>
      <comment>added code for regenerating ammo</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Regenerating Ammunition}}

==Description ==

This small mod removes all ammunition (weapons and all other objects are still in play) from the level.  Ammunition for weapons held slowly regenerate back up to their full amount.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Ben2500:''' I have tried this before and havent been able to suceed.  This is what i tried

&lt;uscript&gt;              
function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
		if (C.Ammunition != None &amp;&amp; C.Ammunition.Ammo &lt; C.Pawn.AmmoMax )
        {
            C.Ammunition.Ammo = Min( C.Ammunition.Ammo+RegenPerSecond, C.Ammunition.AmmoMax );
        }
    }
}
&lt;/uscript&gt;

Instead of

&lt;uscript&gt;
function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
		if (C.Pawn != None &amp;&amp; C.Pawn.Health &lt; C.Pawn.HealthMax )
        {
            C.Pawn.Health = Min( C.Pawn.Health+RegenPerSecond, C.Pawn.HealthMax );
        }
    }
}
&lt;/uscript&gt;

'''MortalMonkey:''' Not exactly an expert on UT2k3, but shouldn't that be C.Pawn.Ammunition?

'''Uncommon:''' Perhaps you can tell us exactly what happens when you try to use that code? You could also look at the Excessive mod, since that has regenerating ammo.

'''RegularX:''' You can also grab the xpak code, which has regen ammo, off the [[Legacy:UTutes|UTutes]].

'''GRAF1K:''' Already been done: Shield Gun's shield ammo. :D Or am I missing something?

'''Ben2500:''' Thats not the exact code but It was something like this.  Definently not very good at Scripting. :D

'''Sir_Brizz:''' I did a better function of this in EvenGround. I will post the exact code later, because it is 100% efficient, fast and tested.

'''Ben2500:''' Anybody wanna rub my salt lick?

'''Sir_Brizz:''' Here is how I did it.

&lt;uscript&gt;
function Timer()
{ 
     local Inventory inv;
     local int count;
     local Controller C;
     
     if( (SomeOption) &amp;&amp; TimerCount &gt;= (put a recharge rate here)*2 )
     {
         for ( C=Level.ControllerList; C!=None; C=C.NextController )
         {
           if (C.pawn==None)
            continue;
           gp=xPawn(C.Pawn);

           for( inv=gp.Inventory;inv!=none;inv=inv.Inventory )
           {
              if( inv.IsA('Weapon') &amp;&amp; (!inv.IsA('TransLauncher')) &amp;&amp; (!inv.IsA('ShieldGun')) )
              {
                  if( Weapon(inv).Ammo[0].AmmoAmount &lt; Weapon(inv).Ammo[0].InitialAmount )
                  {
                      //Log( &quot;Timer #&quot;$TimerCount$&quot; Inv: &quot;$inv$&quot; Ammo: &quot;$Weapon(inv).Ammo[0].AmmoAmount );
                      TimerCount=0;
                      Weapon(inv).Ammo[0].AmmoAmount = Min( Weapon(inv).Ammo[0].AmmoAmount + 1,Weapon(inv).Ammo[0].InitialAmount );
                  }
              }
           }
         }
     }
     if( TimerCount == ((put a recharge rate here)*2)+1 )
         TimerCount = 0;
     TimerCount++;
}             
&lt;/uscript&gt;

It works for any weapon and it's moddable by changing the recharge rate. In my opinion it's perfect for a mutator that recharges your am on all of your guns.</text>
    </revision>
    <revision>
      <id>4694</id>
      <timestamp>2004-02-24T04:26:24Z</timestamp>
      <contributor>
        <ip>Ben2500</ip>
      </contributor>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Regenerating Ammunition}}

==Description ==

This small mod removes all ammunition (weapons and all other objects are still in play) from the level.  Ammunition for weapons held slowly regenerate back up to their full amount.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Ben2500:''' I have tried this before and havent been able to suceed.  This is what i tried

&lt;uscript&gt;              
function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
		if (C.Ammunition != None &amp;&amp; C.Ammunition.Ammo &lt; C.Pawn.AmmoMax )
        {
            C.Ammunition.Ammo = Min( C.Ammunition.Ammo+RegenPerSecond, C.Ammunition.AmmoMax );
        }
    }
}
&lt;/uscript&gt;

Instead of

&lt;uscript&gt;
function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
		if (C.Pawn != None &amp;&amp; C.Pawn.Health &lt; C.Pawn.HealthMax )
        {
            C.Pawn.Health = Min( C.Pawn.Health+RegenPerSecond, C.Pawn.HealthMax );
        }
    }
}
&lt;/uscript&gt;

'''MortalMonkey:''' Not exactly an expert on UT2k3, but shouldn't that be C.Pawn.Ammunition?

'''Uncommon:''' Perhaps you can tell us exactly what happens when you try to use that code? You could also look at the Excessive mod, since that has regenerating ammo.

'''RegularX:''' You can also grab the xpak code, which has regen ammo, off the [[Legacy:UTutes|UTutes]].

'''GRAF1K:''' Already been done: Shield Gun's shield ammo. :D Or am I missing something?

'''Ben2500:''' Thats not the exact code but It was something like this.  Definently not very good at Scripting. :D

'''Sir_Brizz:''' I did a better function of this in EvenGround. I will post the exact code later, because it is 100% efficient, fast and tested.

'''Ben2500:''' Anybody wanna rub my salt lick?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Resident MidEvil</title>
    <id>2022</id>
    <revision>
      <id>4934</id>
      <timestamp>2007-08-25T23:35:49Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Resident MidEvil ===

==Objective ==

The basic objective of this game is to survive. All players have to work together to reach their objective and survive enemy attacks. They must coordinate their efforts and share ammo and healing items.

==Gameplay ==

Before the game starts all players are given 10 points and a few minutes to use to equip themselves with weapons and items, and choose their character before the game starts. Once the timer runs out all players are placed in the designated start area and their mission appears on each players screen.Depending on the scenario this could be anything from killing a certain monster, to getting to a certain area in a certain amount of time. The monsters in this game will cooperate to kill the players so the players must likewise cooperate to survive. Ammo and healing items are scarce so players must decide who needs them the most, all players can see each others health and ammo to make that easier. Ammo can be thrown at other players to replenish their stock and the same applies to healing items, which have to be activated. The players also have a limited stock of items, which can be adjusted.

==Weapons, Items, and Player characters ==

===Weapons ===

''' Sword '''

The sword is the basic melee weapon, the primary fire swings it for medium damage and good speed, the secondary is a more powerful but slower stab. points:2 or 3?

''' Battle Hammer '''

A large two-handed hammer made of marble, does high damage and can even gib some weaker enemies instantly. It has a slow swing and the user cannot move while swinging it, it has no secondary fire. points:TBA

''' Bow '''

The bow is a fast and accurate ranged weapon. The primary fire shoots one arrow quickly, the secondary pulls the string back farther for a more powerful shot that can pierce through weaker enemies. It uses arrows for ammo. points:3?

''' Blunderbuss '''

The blunderbuss is an old-fashioned gun with a flared barrel and blackened iron. The blunderbuss's primary fire shoots a single bullet that does heavy damage that gibs with a headshot, the secondary fire is a shotgun blast that uses a little more ammo but does lots of damage at close range.

The blunderbuss uses bullets as ammo. points:5 or 6?

''' Liquid Flame Bottle '''

This bottle looks like a wide-bottomed vial with red liquid inside and a golden dragon head for a stopper. The primary fire lobs the bottle in front of the player, when it hits something it spills fire all over it and the surrounding area for lots of damage, there is no secondary fire. More bottles can be found to replenish the supply. points:TBA

===Items ===

Items are held like weapons but usually have effects other than damage.

''' Healing potion '''

A healing potion heals about one fourth of a players health, it looks like a bottle with blue liquid inside. points:4?

''' Big Healing Potion '''

This potion heals 3 fourths of a players health and looks like a regular healing potion, except glowing and larger. points:TBA

''' Stop Watch '''

The stop watch is only available for purchase before scenario's that are timed. The stop watch is a gold pocket watch with an hourglass symbol carved into it. Using the watch stops the timer for a while and also makes enemies move slower, perfect for quick escapes! points:7?

''' Flame Necklace '''

The necklace is a small band of red beads with a few red feathers attached to it. The necklace enchants the player's weapons with fire so they do more damage and can set enemies on fire.

''' Recall Ring '''

The ring looks like a small silver band on the players finger. When used the player gives a 'come here' gesture with his or hers hand and all other players receive a message saying the ring has been used, they can either press a specific key to teleport to the user's location or ignore it. The ring is probably going to be used to bring a group back together if they got split up.points:TBA

===Player Characters ===

As a side note any player can be any character, the difference is only cosmetic, and there can be more than one of a character.

''' Knight '''

A man in shining armor that totally covers his body.

''' Priest '''

A man in white robes with red trim and a cross around his neck.

''' Male Peasant '''

A strong-looking mad in patched gray clothes.

''' Female Peasant '''

A beautiful brunette in a black dress.

===Interested Scriptors ===

==Discussion ==</text>
    </revision>
    <revision>
      <id>4935</id>
      <timestamp>2007-08-22T22:29:25Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''' Resident MidEvil '''

==Objective ==

The basic objective of this game is to survive. All players have to work together to reach their objective and survive enemy attacks. They must coordinate their efforts and share ammo and healing items.

==Gameplay ==

Before the game starts all players are given 10 points and a few minutes to use to equip themselves with weapons and items, and choose their character before the game starts. Once the timer runs out all players are placed in the designated start area and their mission appears on each players screen.Depending on the scenario this could be anything from killing a certain monster, to getting to a certain area in a certain amount of time. The monsters in this game will cooperate to kill the players so the players must likewise cooperate to survive. Ammo and healing items are scarce so players must decide who needs them the most, all players can see each others health and ammo to make that easier. Ammo can be thrown at other players to replenish their stock and the same applies to healing items, which have to be activated. The players also have a limited stock of items, which can be adjusted.

==Weapons, Items, and Player characters ==

===Weapons ===

==Sword==

The sword is the basic melee weapon, the primary fire swings it for medium damage and good speed, the secondary is a more powerful but slower stab. points:2 or 3?

==Battle Hammer==

A large two-handed hammer made of marble, does high damage and can even gib some weaker enemies instantly. It has a slow swing and the user cannot move while swinging it, it has no secondary fire. points:TBA

==Bow==

The bow is a fast and accurate ranged weapon. The primary fire shoots one arrow quickly, the secondary pulls the string back farther for a more powerful shot that can pierce through weaker enemies. It uses arrows for ammo. points:3?

==Blunderbuss==

The blunderbuss is an old-fashioned gun with a flared barrel and blackened iron. The blunderbuss's primary fire shoots a single bullet that does heavy damage that gibs with a headshot, the secondary fire is a shotgun blast that uses a little more ammo but does lots of damage at close range.

The blunderbuss uses bullets as ammo. points:5 or 6?

==Liquid Flame Bottle==

This bottle looks like a wide-bottomed vial with red liquid inside and a golden dragon head for a stopper. The primary fire lobs the bottle in front of the player, when it hits something it spills fire all over it and the surrounding area for lots of damage, there is no secondary fire. More bottles can be found to replenish the supply. points:TBA

===Items ===

Items are held like weapons but usually have effects other than damage.

==Healing potion==

A healing potion heals about one fourth of a players health, it looks like a bottle with blue liquid inside. points:4?

==Big Healing Potion==

This potion heals 3 fourths of a players health and looks like a regular healing potion, except glowing and larger. points:TBA

==Stop Watch==

The stop watch is only available for purchase before scenario's that are timed. The stop watch is a gold pocket watch with an hourglass symbol carved into it. Using the watch stops the timer for a while and also makes enemies move slower, perfect for quick escapes! points:7?

==Flame Necklace==

The necklace is a small band of red beads with a few red feathers attached to it. The necklace enchants the player's weapons with fire so they do more damage and can set enemies on fire.

==Recall Ring==

The ring looks like a small silver band on the players finger. When used the player gives a 'come here' gesture with his or hers hand and all other players receive a message saying the ring has been used, they can either press a specific key to teleport to the user's location or ignore it. The ring is probably going to be used to bring a group back together if they got split up.points:TBA

===Player Characters ===

As a side note any player can be any character, the difference is only cosmetic, and there can be more than one of a character.

==Knight==

A man in shining armor that totally covers his body.

==Priest==

A man in white robes with red trim and a cross around his neck.

==Male Peasant==

A strong-looking mad in patched gray clothes.

==Female Peasant==

A beautiful brunette in a black dress.

===Interested Scriptors ===

==Discussion ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Reversed CTF</title>
    <id>1925</id>
    <revision>
      <id>4715</id>
      <timestamp>2006-01-25T22:04:35Z</timestamp>
      <contributor>
        <ip>DaWrecka</ip>
      </contributor>
      <comment>* Added comments only.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Reversed CTF}}

==Description ==

The rules are almost identical to regular CTF, with the important difference that the team must bring its own flag to the enemy base and touch the enemy flag there. If a flag is dropped and touched by an enemy, it's sent back to its base.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''Wormbo:''' I have started making this mod but got stuck with the bot AI. It is now available as a [http://www.koehler-homepage.de/Wormbo/spareparts.html Spare Part] from my homepage for others to use for (almost) whatever they want. (also see [[Legacy:Wormbo/Developer Journal|Wormbo/Developer Journal]])

===Discussion ===

'''Wormbo:''' It's basically like starting in the opposite bases, but that would have sounded boring. :)

'''EntropicLqd:''' hee hee.  Shouldn't be too hard to do either.  I wonder if you could do it using a mutator that simply swaps the teams of the player starts over.  The bot AI might not be smart enough to figure out what to do, but I see no reason why it wouldn't.

'''Wormbo:''' I'd like to have the team carry its own flag, so just switching starting points isn't enough.

'''EntropicLqd:''' Switching the start positions over is flawed anyway - because the starting base colour would be wrong.  What you'd need to do instead is swap the flag skins, and the flag's FlagBases.  I guess you'd have to tweak the HUD so it switched the flags around but I'm sure you could do it without touching any of the actual Flag code.  It's just a matter of creating the right illusion.

'''Wormbo:''' I think I'll rewrite some of the flag code, but I'll need to investigate the existing code a little more before making any bigger decisions.

'''Flashman:''' As for the bot stuff, if you create a normal ctf, and swap the flags (I know thats not what u want) then the bots know enough to pick up the flag and run.

'''ZxAnPhOrIaN:''' This seems easier than the original CTF!

'''Wormbo:''' It '''sounds''' easier because you start near the flag you have to pickup, but it could be harder than you think. Usually the enemy flag won't be there when you break into the enemy base for the capture. You'll have to rely on your team to return it just in time so it is either still there when you want to touch it or the enemy flag carrier is not too far away so you can &quot;solve that problem&quot; yourself.

'''ZxAnPhOrIaN:''' Okay... Look at the table:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |CTF Types
|
|-
| style=&quot;text-align: center&quot; |Regular
| style=&quot;text-align: center&quot; |Reversed(this mod) 
|-
|Respawns at base
|Respawns at base 
|-
|Picks up powerups
|Picks up powerups 
|-
|Gets the opponents flag
|Picks up own flag 
|-
|Heads Home
|Heads for apponents base 
|-
|Scores point for team
|Scores point for team 
|-
|Heads back to enemys base for stealing the flag, may get killed
|Suicides and ends up at base for easy flag taking 
|}

'''GeniusDex:''' It could be a better tactic to keep the enemy flag at their base once you've scored a point. Probably someone else is at your base to pick up the flag and run for the enemy base, but i doubt there will be much people in the enemy base if you score a point.

'''Wormbo:''' GeniusDex is right. Reversed CTF has much less free-for-all elements than regular CTF. You can't just grab the flag, rush to the enemy base and score. Usually the enemy team will run towards your base and now both teams have a problem: The flag is missing and nobody can score. The key now is to both protect the own flag carrier and kill the enemy flag at the same time.&lt;br /&gt;Your table is only a rough overview of the flow of the game, but nowhere near the individual bot's tasks. I think when somebody reaches the enemy base and eventually scores a point, then he/she should put up a tent near the flag and make sure it stays where it is, so the next teammate who arrives with the flag
#doesn't have to fight his/her way through the hoards of enemies all alone
#doesn't have to wait for the flag to be returned

'''Birelli:''' I imagine that in most cases the game will quickly have the flags switched over just like when both flags are out in regular CTF and the FC's are hiding back at base waiting for their own flag to be returned, with the crucial difference that the enemy is respawning in the base that the FC is in! Definitely a lot of heads-up teamwork needed for this one, this should be awesome. :-)

'''Blaaguuu:''' Seems to me, that it woudl be a good idea to make it so when the flag is return by ay fashion other than scoring, then thre shoudl be a 10 second delay before the owning team can grab the flag from the base. this would prevent base campers form crowdign around their own flag, and grabbign ti as soon as it is returned, leaving no time for the other team to score. sound good, no?

'''Wormbo:''' Nice idea. Development is on hold right now, though. Due to lack of time for bot support. :(

'''Col.ONeill''' Well, this is just a quick idea about how I would do this:

Um, let`s say you just have to change the textures of the flags, and the starting points of the teams, so that the blue team starts in the red base, but in the reed base is a blue flag that can be captured. So  the Bots are trying to capture it the normal way, but it seems like they are carrying their own flag. - Sorry, if this is a bit confusing, my english isn`t very good, but i think you know what I mean. This wouldn`t need any AI scripting or changes...^^

Well, I hope this short Idea may help you... Good luck.

'''Wormbo:''' This is ''almost'' what I do right now, but bots have no clue about team work.

'''Col.ONeill''' Do you realy need teamwork ? I mean, the only things that you need are some bots that are carrying the flag to the &quot;enemies&quot; base and some bots stayin' in their base to protect it. It can`t be that hard to do this, well I don`t know anything about scripting or AI tweaking, but I can`t believe that it`s so hard to teach these simple things to bots. They must be intelligent enought to learn this... 

'''Foxpaw:''' Instead of switching playerstarts, why not switch the flagbases? That way you will be in the base that is the right color. You may also have to switch the skins of the flags and possibly make a small modification to the HUD if you don't want it to constantly say that you are carrying the enemy flag/they have yours. The bots support seems simple to me: Defending bots attack the flag carrier if they have your flag. Attacking bots will do the same, but will attempt to carry the flag while doing so. The only thing that the bots will not do normally is cover you while you wait in the enemy base for the flag to be returned.. but they will do that if you set them to cover you.

'''Wormbo:''' I can't continue this mod. :( If anyone wants to, feel free to download it from the URL mentioned above.

'''UArchitect:''' i beleive all of this can be done WITHOUT any new scripts classes mutators or anything, and im so sure of it...im gonna go do it now and post it on nalicity when its done (CTF-Reversor)-keep a lookout

'''Wormbo:''' Well, making a new map is no biggy. The key is to make it work with ''any existing CTF map''. Reversed CTF itself works (you can get it from my Spare Parts page), only the bot AI is missing.

'''UArchitect:''' aah i see...well if im thinking strait it should be fairly simple....(not that i would know how to do it :P) if you made the mutator/mod to swap the flag positions, and also swap the flag colours

that should be the basics, i cant really see ai getting a big problem..the only problem i see is bots sitting defending the opposite bases flag (thinking its thiers)...which if you look at it another way...it is..but with a diff colour

so youl have to find a way round that...rest of it is fairly simple i should think..anyway im probably talkin rubbish so...zzip

'''DaWrecka:''' I think UArchitect might be on to something. While I was reading through the mod idea, I thought of this method myself, before I read what UArchitect had said. If it hasn't already been tried, it might be worth having a go at.</text>
    </revision>
    <revision>
      <id>4716</id>
      <timestamp>2004-01-20T11:43:53Z</timestamp>
      <contributor>
        <ip>Host217-42-146-178.range217-42.btcentralplus.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Reversed CTF}}

==Description ==

The rules are almost identical to regular CTF, with the important difference that the team must bring its own flag to the enemy base and touch the enemy flag there. If a flag is dropped and touched by an enemy, it's sent back to its base.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''Wormbo:''' I have started making this mod but got stuck with the bot AI. It is now available as a [http://www.koehler-homepage.de/Wormbo/spareparts.html Spare Part] from my homepage for others to use for (almost) whatever they want. (also see [[Legacy:Wormbo/Developer Journal|Wormbo/Developer Journal]])

===Discussion ===

'''Wormbo:''' It's basically like starting in the opposite bases, but that would have sounded boring. :)

'''EntropicLqd:''' hee hee.  Shouldn't be too hard to do either.  I wonder if you could do it using a mutator that simply swaps the teams of the player starts over.  The bot AI might not be smart enough to figure out what to do, but I see no reason why it wouldn't.

'''Wormbo:''' I'd like to have the team carry its own flag, so just switching starting points isn't enough.

'''EntropicLqd:''' Switching the start positions over is flawed anyway - because the starting base colour would be wrong.  What you'd need to do instead is swap the flag skins, and the flag's FlagBases.  I guess you'd have to tweak the HUD so it switched the flags around but I'm sure you could do it without touching any of the actual Flag code.  It's just a matter of creating the right illusion.

'''Wormbo:''' I think I'll rewrite some of the flag code, but I'll need to investigate the existing code a little more before making any bigger decisions.

'''Flashman:''' As for the bot stuff, if you create a normal ctf, and swap the flags (I know thats not what u want) then the bots know enough to pick up the flag and run.

'''ZxAnPhOrIaN:''' This seems easier than the original CTF!

'''Wormbo:''' It '''sounds''' easier because you start near the flag you have to pickup, but it could be harder than you think. Usually the enemy flag won't be there when you break into the enemy base for the capture. You'll have to rely on your team to return it just in time so it is either still there when you want to touch it or the enemy flag carrier is not too far away so you can &quot;solve that problem&quot; yourself.

'''ZxAnPhOrIaN:''' Okay... Look at the table:

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |CTF Types
|
|-
| style=&quot;text-align: center&quot; |Regular
| style=&quot;text-align: center&quot; |Reversed(this mod) 
|-
|Respawns at base
|Respawns at base 
|-
|Picks up powerups
|Picks up powerups 
|-
|Gets the opponents flag
|Picks up own flag 
|-
|Heads Home
|Heads for apponents base 
|-
|Scores point for team
|Scores point for team 
|-
|Heads back to enemys base for stealing the flag, may get killed
|Suicides and ends up at base for easy flag taking 
|}

'''GeniusDex:''' It could be a better tactic to keep the enemy flag at their base once you've scored a point. Probably someone else is at your base to pick up the flag and run for the enemy base, but i doubt there will be much people in the enemy base if you score a point.

'''Wormbo:''' GeniusDex is right. Reversed CTF has much less free-for-all elements than regular CTF. You can't just grab the flag, rush to the enemy base and score. Usually the enemy team will run towards your base and now both teams have a problem: The flag is missing and nobody can score. The key now is to both protect the own flag carrier and kill the enemy flag at the same time.&lt;br /&gt;Your table is only a rough overview of the flow of the game, but nowhere near the individual bot's tasks. I think when somebody reaches the enemy base and eventually scores a point, then he/she should put up a tent near the flag and make sure it stays where it is, so the next teammate who arrives with the flag
#doesn't have to fight his/her way through the hoards of enemies all alone
#doesn't have to wait for the flag to be returned

'''Birelli:''' I imagine that in most cases the game will quickly have the flags switched over just like when both flags are out in regular CTF and the FC's are hiding back at base waiting for their own flag to be returned, with the crucial difference that the enemy is respawning in the base that the FC is in! Definitely a lot of heads-up teamwork needed for this one, this should be awesome. :-)

'''Blaaguuu:''' Seems to me, that it woudl be a good idea to make it so when the flag is return by ay fashion other than scoring, then thre shoudl be a 10 second delay before the owning team can grab the flag from the base. this would prevent base campers form crowdign around their own flag, and grabbign ti as soon as it is returned, leaving no time for the other team to score. sound good, no?

'''Wormbo:''' Nice idea. Development is on hold right now, though. Due to lack of time for bot support. :(

'''Col.ONeill''' Well, this is just a quick idea about how I would do this:

Um, let`s say you just have to change the textures of the flags, and the starting points of the teams, so that the blue team starts in the red base, but in the reed base is a blue flag that can be captured. So  the Bots are trying to capture it the normal way, but it seems like they are carrying their own flag. - Sorry, if this is a bit confusing, my english isn`t very good, but i think you know what I mean. This wouldn`t need any AI scripting or changes...^^

Well, I hope this short Idea may help you... Good luck.

'''Wormbo:''' This is ''almost'' what I do right now, but bots have no clue about team work.

'''Col.ONeill''' Do you realy need teamwork ? I mean, the only things that you need are some bots that are carrying the flag to the &quot;enemies&quot; base and some bots stayin' in their base to protect it. It can`t be that hard to do this, well I don`t know anything about scripting or AI tweaking, but I can`t believe that it`s so hard to teach these simple things to bots. They must be intelligent enought to learn this... 

'''Foxpaw:''' Instead of switching playerstarts, why not switch the flagbases? That way you will be in the base that is the right color. You may also have to switch the skins of the flags and possibly make a small modification to the HUD if you don't want it to constantly say that you are carrying the enemy flag/they have yours. The bots support seems simple to me: Defending bots attack the flag carrier if they have your flag. Attacking bots will do the same, but will attempt to carry the flag while doing so. The only thing that the bots will not do normally is cover you while you wait in the enemy base for the flag to be returned.. but they will do that if you set them to cover you.

'''Wormbo:''' I can't continue this mod. :( If anyone wants to, feel free to download it from the URL mentioned above.

'''UArchitect:''' i beleive all of this can be done WITHOUT any new scripts classes mutators or anything, and im so sure of it...im gonna go do it now and post it on nalicity when its done (CTF-Reversor)-keep a lookout

'''Wormbo:''' Well, making a new map is no biggy. The key is to make it work with ''any existing CTF map''. Reversed CTF itself works (you can get it from my Spare Parts page), only the bot AI is missing.

'''UArchitect:''' aah i see...well if im thinking strait it should be fairly simple....(not that i would know how to do it :P) if you made the mutator/mod to swap the flag positions, and also swap the flag colours

that should be the basics, i cant really see ai getting a big problem..the only problem i see is bots sitting defending the opposite bases flag (thinking its thiers)...which if you look at it another way...it is..but with a diff colour

so youl have to find a way round that...rest of it is fairly simple i should think..anyway im probably talkin rubbish so...zzip</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Riftwar</title>
    <id>1954</id>
    <revision>
      <id>4784</id>
      <timestamp>2006-09-20T02:08:42Z</timestamp>
      <contributor>
        <ip>Ppp22-194.lns2.syd7.internode.on.net</ip>
      </contributor>
      <comment>*fixed link formatting, removed redundant discussion pointing out bad links</comment>
      <text xml:space="preserve">===Riftwar===

==Overview==

Riftwar is a small modification for Unreal Tournament 2003. It began as I tried to make some proof of concept gametypes for Freehold NG.

Basically, Riftwar is a partial conversion where three species battle it out. There are Undead, Alien and Human classes to play and during team games (usually Rift Control) all three teams fight each other at once, as opposed to the usual two team approach of games. I should note here that the original idea for a three team gametype was MoP's, Freehold's design lead.

When you enter the game, you'll be presented with a menu to pick your class. You can find detailed descriptions of the species and their classes in the &quot;EDF Field Report&quot; document under media. The short of it is, each class has a different look, stats (speed, armor, weapon skill, agility), starting weapon and &quot;powerup&quot;. Powerups are kind like combos, but they occur automatically when you hit 100 adrenaline. There are no other combos.

Riftwar: Campaigns brings the original Unreal Tournament 2003 partial conversion to the next logical level - a massive war campaign. No longer are games isolated incidents, now twelve maps have been divided between three different world to form one complete game. Defend your world and use the riftgates to take the battles to your opponent's. Take the capitol and you take the control of the world. The first to control all three worlds wins the Riftwar.

Campaigns combines Team DM and classic Domination as you travel across the 12 worlds of the Riftwar.  Maps without control points can be one by being the first team to get enough frags to satisfy a goal, whereas Rift Control maps are scored by holding onto the control points.

'''Author:''' [[Legacy:RegularX|RegularX]]

'''Website:''' [http://webcosa.com/riftwar/ webcosa.com]

'''Download:''' [http://webcosa.com/riftwar/download.html link]

'''EDF Central (Main Server): [http://inkless.com/edfcentral/ inkless.com/edfcentral/] ... you can get a status of the war from this page as well.

Current version: 148

I do still intend on making more tutorials based on the code, such as

* how to make an ingame menu when players enter the games
* how to use species to form different classes: [[Legacy:Making A Class-Based Mod|Making A Class-Based Mod]]
* how to tie custom skins/meshes to pawns
* working around the two team limitations of UT2003

==Recent Changelog ==

* Deathmatch and Domination play combined into one Campaign
* 3 teams each with 3 players classes = 9 different ways to play
* Win battles to find team items to help the war effort
* Top players and war status viewable from PHP script
* Offline campaign saves status so that you can go eat dinner
* Team items can be gained by winning battles
* Each map contains monstrous allies which defend the world
* DOM Monitors glow to indicate the correct controlling team
* Holographic flags indicate the current world's controlling team
* New Undead Weapons Pestilence Hypo and Hex Rifle added
* Aliens exclusively get Translocator and Shield Gun
* Updates to Minigun, Link Gun and more
* Undead HUD now a stylish yellow

==Known Bugs ==

* End screen occasionally shows wrong team
* On first connect, your mesh may not be set right for your class
* when your player account first gets setup, some information seems to get dropped

==Possible Enhancements ==

* Custom models/skins
* Custom maps
* Ammo and pickup modifications, perhaps team specific

==Post Mortem ==

Will be posted shortly.  Source code available from the site.

===Comments &amp; Critiques ===

[[Legacy:Critiques/Riftwar|Riftwar Critique Page]]

'''RegularX:''' People should feel free to post quick thoughts here, or add on to the critique page if they'd like to post something larger.

'''RegularX:''' Finally got around to updating this for the 148 version.</text>
    </revision>
    <revision>
      <id>4785</id>
      <timestamp>2006-09-05T04:07:56Z</timestamp>
      <contributor>
        <ip>Hil-102-151.Reshall.Berkeley.EDU</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Riftwar===

==Overview==

Riftwar is a small modification for Unreal Tournament 2003. It began as I tried to make some proof of concept gametypes for Freehold NG.

Basically, Riftwar is a partial conversion where three species battle it out. There are Undead, Alien and Human classes to play and during team games (usually Rift Control) all three teams fight each other at once, as opposed to the usual two team approach of games. I should note here that the original idea for a three team gametype was MoP's, Freehold's design lead.

When you enter the game, you'll be presented with a menu to pick your class. You can find detailed descriptions of the species and their classes in the &quot;EDF Field Report&quot; document under media. The short of it is, each class has a different look, stats (speed, armor, weapon skill, agility), starting weapon and &quot;powerup&quot;. Powerups are kind like combos, but they occur automatically when you hit 100 adrenaline. There are no other combos.

Riftwar: Campaigns brings the original Unreal Tournament 2003 partial conversion to the next logical level - a massive war campaign. No longer are games isolated incidents, now twelve maps have been divided between three different world to form one complete game. Defend your world and use the riftgates to take the battles to your opponent's. Take the capitol and you take the control of the world. The first to control all three worlds wins the Riftwar.

Campaigns combines Team DM and classic Domination as you travel across the 12 worlds of the Riftwar.  Maps without control points can be one by being the first team to get enough frags to satisfy a goal, whereas Rift Control maps are scored by holding onto the control points.

'''Author:''' [[Legacy:RegularX|RegularX]]

'''Website:''' [http://inkless.com/riftwar/   inkless.com/riftwar]

'''Download:''' [http://inkless.com/riftwar/download.html inkless.com/riftwar/download.html]

'''EDF Central (Main Server): [http://inkless.com/edfcentral/ inkless.com/edfcentral/] ... you can get a status of the war from this page as well.

Current version: 148

I do still intend on making more tutorials based on the code, such as

* how to make an ingame menu when players enter the games
* how to use species to form different classes: [[Legacy:Making A Class-Based Mod|Making A Class-Based Mod]]
* how to tie custom skins/meshes to pawns
* working around the two team limitations of UT2003

==Recent Changelog ==

* Deathmatch and Domination play combined into one Campaign
* 3 teams each with 3 players classes = 9 different ways to play
* Win battles to find team items to help the war effort
* Top players and war status viewable from PHP script
* Offline campaign saves status so that you can go eat dinner
* Team items can be gained by winning battles
* Each map contains monstrous allies which defend the world
* DOM Monitors glow to indicate the correct controlling team
* Holographic flags indicate the current world's controlling team
* New Undead Weapons Pestilence Hypo and Hex Rifle added
* Aliens exclusively get Translocator and Shield Gun
* Updates to Minigun, Link Gun and more
* Undead HUD now a stylish yellow

==Known Bugs ==

* End screen occasionally shows wrong team
* On first connect, your mesh may not be set right for your class
* when your player account first gets setup, some information seems to get dropped

==Possible Enhancements ==

* Custom models/skins
* Custom maps
* Ammo and pickup modifications, perhaps team specific

==Post Mortem ==

Will be posted shortly.  Source code available from the site.

===Comments &amp; Critiques ===

[[Legacy:Critiques/Riftwar|Riftwar Critique Page]]

'''RegularX:''' People should feel free to post quick thoughts here, or add on to the critique page if they'd like to post something larger.

'''DJPaul:''' But what precisly does Riftwar *do*?  You forgot to explain..

'''RegularX:''' Yeah, it was pretty shallow.  Updated.

'''RegularX:''' Finally got around to updating this for the 148 version.

'''Missilemaster:''' For some reason, all those links rederect you to &quot;www.zink.com&quot;...Riftwar seems to have been moved [http://webcosa.com/riftwar/ here].</text>
    </revision>
    <revision>
      <id>4786</id>
      <timestamp>2006-09-20T01:56:10Z</timestamp>
      <contributor>
        <ip>Ppp22-194.lns2.syd7.internode.on.net</ip>
      </contributor>
      <comment>*updated links, removed redundant discussion</comment>
      <text xml:space="preserve">===Riftwar===

==Overview==

Riftwar is a small modification for Unreal Tournament 2003. It began as I tried to make some proof of concept gametypes for Freehold NG.

Basically, Riftwar is a partial conversion where three species battle it out. There are Undead, Alien and Human classes to play and during team games (usually Rift Control) all three teams fight each other at once, as opposed to the usual two team approach of games. I should note here that the original idea for a three team gametype was MoP's, Freehold's design lead.

When you enter the game, you'll be presented with a menu to pick your class. You can find detailed descriptions of the species and their classes in the &quot;EDF Field Report&quot; document under media. The short of it is, each class has a different look, stats (speed, armor, weapon skill, agility), starting weapon and &quot;powerup&quot;. Powerups are kind like combos, but they occur automatically when you hit 100 adrenaline. There are no other combos.

Riftwar: Campaigns brings the original Unreal Tournament 2003 partial conversion to the next logical level - a massive war campaign. No longer are games isolated incidents, now twelve maps have been divided between three different world to form one complete game. Defend your world and use the riftgates to take the battles to your opponent's. Take the capitol and you take the control of the world. The first to control all three worlds wins the Riftwar.

Campaigns combines Team DM and classic Domination as you travel across the 12 worlds of the Riftwar.  Maps without control points can be one by being the first team to get enough frags to satisfy a goal, whereas Rift Control maps are scored by holding onto the control points.

'''Author:''' [[Legacy:RegularX|RegularX]]

'''Website:''' [http://webcosa.com/riftwar/]

'''Download:''' [http://webcosa.com/riftwar/download.html]

'''EDF Central (Main Server): [http://inkless.com/edfcentral/ inkless.com/edfcentral/] ... you can get a status of the war from this page as well.

Current version: 148

I do still intend on making more tutorials based on the code, such as

* how to make an ingame menu when players enter the games
* how to use species to form different classes: [[Legacy:Making A Class-Based Mod|Making A Class-Based Mod]]
* how to tie custom skins/meshes to pawns
* working around the two team limitations of UT2003

==Recent Changelog ==

* Deathmatch and Domination play combined into one Campaign
* 3 teams each with 3 players classes = 9 different ways to play
* Win battles to find team items to help the war effort
* Top players and war status viewable from PHP script
* Offline campaign saves status so that you can go eat dinner
* Team items can be gained by winning battles
* Each map contains monstrous allies which defend the world
* DOM Monitors glow to indicate the correct controlling team
* Holographic flags indicate the current world's controlling team
* New Undead Weapons Pestilence Hypo and Hex Rifle added
* Aliens exclusively get Translocator and Shield Gun
* Updates to Minigun, Link Gun and more
* Undead HUD now a stylish yellow

==Known Bugs ==

* End screen occasionally shows wrong team
* On first connect, your mesh may not be set right for your class
* when your player account first gets setup, some information seems to get dropped

==Possible Enhancements ==

* Custom models/skins
* Custom maps
* Ammo and pickup modifications, perhaps team specific

==Post Mortem ==

Will be posted shortly.  Source code available from the site.

===Comments &amp; Critiques ===

[[Legacy:Critiques/Riftwar|Riftwar Critique Page]]

'''RegularX:''' People should feel free to post quick thoughts here, or add on to the critique page if they'd like to post something larger.

'''RegularX:''' Finally got around to updating this for the 148 version.

'''Missilemaster:''' For some reason, all those links rederect you to &quot;www.zink.com&quot;...Riftwar seems to have been moved [http://webcosa.com/riftwar/ here].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Ringworld</title>
    <id>1898</id>
    <revision>
      <id>4654</id>
      <timestamp>2002-08-02T22:50:28Z</timestamp>
      <contributor>
        <ip>K St TheJunior</ip>
      </contributor>
      <text xml:space="preserve">==A Ringworld-Inspired Mod for UT2003 ==

Hollywood has been talking for several years about possibly making a movie based on Larry Niven's mind-boggling &quot;Ringworld&quot; concept, but they never have gotten it all together. I think the UT mappers out there have a great opportunity to create a first-visualization of the &quot;Ringworld&quot; idea as a set of expansive 3D maps for UT2003 or even for the old UT.

I'm imagining a great ring-shaped UT map which would be able to hold maybe 10 smaller location-maps within the circular interior side of the ring. I recently saw a great &quot;2001 Space Odyssey&quot; map that someone made which had two ring-shaped space stations within it for a CTF type game. The envisioned project would require a much bigger &quot;space station&quot; of a Ringworld-esque nature, rather like a mini-ringworld. I picture a gigantic map that incorporates 10 separate maps by 3 or 4 (or maybe by 10) different mappers, and it lets the player move quickly from one territorial map to the next as he travels along the inside of the ringworld.

If someone could make a generic ringword map as a base and then use some coding talent, maybe it could even become a new gametype for UT where you can pre-select 10 of your favorite UT maps to be placed upon the inside rim of the mini-ringworld model that someone puts together.

(By the way, my &quot;EarthWarrior&quot; skin might also fit in well with any mini-ringworld map-simulation's 3D adventures, since one of the characters in Niven's original novel was a heroic, ringworld-roaming adventurer named &quot;Seeker,&quot; and Niven has often maintained that he too is a big fan of the old &quot;pioneer s-f&quot; literature!)

      Idea submitted by K_St_theJunior on Aug. 2, 2002.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==</text>
    </revision>
    <revision>
      <id>4655</id>
      <timestamp>2002-08-02T22:29:04Z</timestamp>
      <contributor>
        <ip>K St TheJunior</ip>
      </contributor>
      <text xml:space="preserve">==A Ringworld-Inspired Mod for UT2003 ==

Hollywood has been talking for several years about possibly making a movie based on Larry Niven's mind-boggling &quot;Ringworld&quot; concept, but they never have gotten it all together. I think the UT mappers out there have a great opportunity to create a first-visualization of the &quot;Ringworld&quot; idea as a set of expansive 3D maps for UT2003 or even for the old UT.

I'm imagining a great ring-shaped UT map which would be able to hold maybe 10 smaller location-maps within the circular interior side of the ring. I recently saw a great &quot;2001 Space Odyssey&quot; map that someone made which had two ring-shaped space stations within it for a CTF type game. The envisioned project would require a much bigger &quot;space station&quot; of a Ringworld-esque nature, rather like a mini-ringworld. I picture a gigantic map that incorporates 10 separate maps by 3 or 4 (or maybe by 10) different mappers, and it lets the player move quickly from one territorial map to the next as he travels along the inside of the ringworld.

If someone could make a generic ringword map as a base and then use some coding talent, maybe it could even become a new gametype for UT where you can pre-select 10 of your favorite UT maps to be placed upon the inside rim of the mini-ringworld model that someone puts together.

(By the way, my &quot;EarthWarrior&quot; skin might also fit in well with any mini-ringworld map-simulation's 3D adventures, since one of the characters in Niven's original novel was a heroic, ringworld-roaming adventurer named &quot;Seeker,&quot; and Niven has often maintained that he too is a big fan of the old &quot;pioneer s-f&quot; literature!)

      Idea submitted by K_St_theJunior on Aug. 2, 2002.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Rocket Jockey</title>
    <id>1916</id>
    <revision>
      <id>4695</id>
      <timestamp>2007-07-04T03:31:08Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>?</comment>
      <text xml:space="preserve">==Rocket Jockey==

===Summary===

This is an idea that I have been bouncing around for a while, and I think would be quite feasible in the UT2003 engine. 

For those not in the know, Rocket Jockey was a game released several years ago, in which players ride rockets around an arena. Each rocket has cables you can launch, which can be used for a variety of purposes, the main goal being to knock out your opponents. Anyone can be knocked off their rocket, which obviously inflicts quite a large amount of damage against the player. Once you are off the rocket, people can drag you around with cables, tie you to posts, and beat up the player with some rather satisfying crunches and screams.

Note that there's probably lots of stuff I've left out, feel free to search Google or ask for more information, or add stuff if you've played the game.

===Gameplay===

Every player starts on their rocket, an announcer counts off, and the game starts.

====Mechanics====

While off the rocket, you are totally defenseless, thus the need to find a rocket to get back on. 

On the rocket, you have 2 cable launchers on each side at your disposal. Seeing as rockets go at a very high speed, the cables can be used to attach to a pole, which lets you spin around and change direction. You can also attach both cables together, so you can create trip wires, tie players/objects to posts, whatever you can think of. Once a player has been injured heavily enough, he is out of the game. The player with the most points at the end wins.

====Game Types====

=====Arena=====

Basically the maps are a large arena, with posts to swing off of, bombs and powerups to collect, and fences to navigate around. The goal of this is to knock out all your opponents using whatever means neccesary.

=====Racing=====

A circuit-style map, this should allow map-makers to have much more freedom in what to make. In this, players must pass through various goals in order, as they traverse around the course. Note that the original game only offered circuit maps, but once-through maps should be feasible as well.

=====Soccer=====

As the name implies, it's soccer, only on rockets. Two goals on each side, one ball in the center for the players to grab with cables. 

====Scoring====

In arena, different amounts of points are given depending on the difficultly of the maneuver. Points are awarded for inflicting damage upon the player or his rocket. 

----

===Team===

Planeguy - Programming/Modelling/Map Making

Naky - Designer

? - Sounds (Need a new sound d00d)

Naky - Modeller

Mr. P - Programming 

AxeManiac - Texture Artist

Zap! - Mapper

? - Animator (only need a couple of very small animations done, this would be an incredibly easy job)

Also, if anyone's experienced in creating UV maps, we could really use your help.  I'm doing them, but very slowly due to lack of time and skill ;-) Not a critical thing, I'll get them all done eventually, just a matter of when.

===Timeline===

Ok, obviously a lot of this is still up in the air, but here's what I think we should do based on what I've been hearing (feel free to make any changes)

#This is the initial stage. The focus should be on getting the basic gameplay mechanics coded, such as:
##Implementing a basic rocket
##Arena gametype
##Mechanics for players once off the rocket - nothing too complex, things like tripping and getting thrown around can be done later
##Simple HUD

#After we complete this stage, I'm thinking that the game should be more or less feature complete compared to the original game. Other things that should be done by now:
##Grappling onto players/objects - Possibly with Karma physics assuming that it's not too much of a hassle, otherwise we can delay it to a later stage.
##Soccer and Racing game types - If these don't delay things too much I think they could also be postponed, but I'd like to get them done.
##Maps - We should have at least some basic arena maps, enough that we could release something and it'd be fun.

#Focus on polishing, balancing, and fixing bugs. We should also start focusing on cosmetic stuff such as modeling/skinning and static meshes, but I think that the bulk of that could be delayed for future releases.

#This is the &quot;eye candy&quot; stage. By now we should have some modelers/skinners/animators and mapmakers, and we can focus on transitioning into something that looks purty.

===Modelling Tasks===

The stuff us modellers gotta do for phase 1.

=====Map Objects=====
* Basic Stub - '''Completed - Textured - DONE'''
* Basic Pole - '''Completed - Textured - DONE'''
* Net (long, low) - '''Completed - Not Ready for Texturing'''
* Net (short, high) - Incomplete
* Ball Ejection Port - Incomplete
* Claw Stub - Incomplete
* Power-up Ring - '''Completed - Not Ready for Texturing'''
* Cable-Changing Spool - Incomplete
* Billboard - Incomplete

=====Balls=====
* Soccer Ball - Incomplete
* Hover Tire - '''Completed - Not Ready for Texturing'''
* Steel Ball - '''Completed - Not Ready for Texturing'''
* Beach Ball - '''Completed - Not Ready for Texturing'''
* Bomb - '''Completed - Not Ready for Texturing'''

=====Rockets &amp; Rocket Related=====
* 2 rockets: 

- Rucinsky's Radical Rocket - '''Completed - Not Ready for Texturing'''

- Helm's XR-1 &quot;Conquerer&quot; - Incomplete

- Fusellier - '''Completed - Ready for Texturing'''

- Unlockable Rocket - '''Completed - Not Ready for Texturing'''
* 1 cable mesh with 2 different skins  - '''Completed - Not Ready for Texturing'''

===Programming Tasks===
* Extend KVehicle into a rocket class, using KCar as a guide (only simpler, since there's no wheels) - '''Petri:''' The rocket itself is pretty much complete. Some things need to be changed but that shouldn't be very hard.
* 3rd person viewpoint for players - '''Petri:''' Complete for player controllers, incomplete for vehicles.
* New Hud - Plane Guy: '''Complete'''. Things may be added in the future, but this has all the basics
* New Gametype or Mutator that removes weapons - '''Petri:''' Complete.

Phase 2 has begun! '''We're not dead yet!'''
* New PlayerPawn to account for vehicle hit damage and effects? - Incomplete
* Grappling hooks and tow cable effect - Plane Guy: '''86.7% Complete''' Now with 90% more KARMA
* Attach grapple hooks shooters to rocket - Incomplete
* Enable grappling rockets - Plane Guy: '''Complete''' Hehe, found out I can't aim down with P's behindview code, so I was just shooting over it
* Reveal Plane Guy is a retard - Plane Guy: '''Complete''' See above.
* Change gametype to spawn a rocket when a player logs in - Incomplete.

For now, we'll just drop a rocket or two in the level. Having a rocket spawn with the player only on his first spawn looks like a quite bit of work we don't want to get hung up on right now, especially when rockets are still in development.

----

===Comments===

'''xray:''' (3. october 2006) &amp;rarr;&gt; http://www.solar-ray.org

----

'''Grincer:''' (2nd of July 2005) I was trying to get some people together on http://rocketjockey.deviantart.com to work on a remake. As I see it now, this website is the most promising one. I can't seem to see any dates on the developments. It might be a good idea to have a bit of an overview on how the developments are going now. I'm no programmer, just a real big fan of this game. Because of the fantastic gameplay. I have posted a several links to this Wiki site, keep up the good work! If you have any questions you can contact me on grincerAThotmail.com (msn) or 11841021 (icq) or by mail at grincerATgmail.com. Just mention in the subject 'Rocket Jockey'.

----

Note that I have no experience whatsoever, I just thought that it's a shame that this game has not been done justice. 

'''Highlander:''' OMG i loved this game i never could find a copy of the full version but i played the demo too much. I agree this could be quite interesting on the ut2k3 engine. A fair amount of coding i think. Depends to what extent you could use karma to your advantage (the ropes). Quite the idea.

----

Highlander, go to http://www.the-underdogs.org/game.php?name=Rocket+Jockey

'''Highlander:''' Thank you for the link :). Unfortunately... it doesnt seem to like win2k... so i will proceed to install win95 on my laptop. 

----

I'd be willing to help code this. Let me know. &amp;ndash; Spike ICQ 3797129.

----

'''Naky:''' So it looks like a formal team has taken up this project now (goons, you know who you are).  We'll use this board to consolidate and talk about the project until we get our site up and running.

----

'''Plane Guy:''' Ok, so this is how I see it. We should get some rudimentary basics working soon, so that we can build on them at axemanic's afore-mentioned slow pace. I can see making working rockets and grapple hooks (sans tripwires) easily with placeholder models. The reason I want to get going is that people tend to sit around arguing about features and getting nothing done. No one can argue we don't need these features! :) Anyway, I'm off to have a closer look at that KVehicle....

----

'''Naky:''' Agreed.  Some of the basic tasks for programming should be:
* the adjustment of the camera:  this'll be a third person view mod just like the original... maybe eventually we can set something up where mousewheelup zooms in and mousewheeldown zooms out but for now, just a basic behind-the-rocket camera view will do
* tweaking of the kvehicle class: this function probably simulates a wheeled vehicle pretty well but I'm not sure if it'll &quot;feel&quot; right for flying a rocket
* firing the cables: just firing them for the moment, we can worry about how they'll interact with the environment later on

Once we get those things settled, we can add to the list.  Oh yeah, UT2K3 comes with 2 hover jetbike models.  They're inside VehicleMeshes.usx I think.  Both are a little under 900 polys and we can use those two as placeholder rockets for now.  Anyway, for me, I have to sit down either tonight or tomorrow and play the game a bunch so I can make a list of all the map models I need to make.  We might as well stay with the '20s theme for now too, even though it'll look weird with the default character models.  Something we can't help until we find a character modeller, I suppose.

----

'''Highlander:''' You gents need any help lemme know... Currently pre-occupied with a few projects but if I can pitch in I will. Have experience /w gametypes custom pawns / controllers etc. I put a lot of thought into how to implement this a while ago. One problem I see is the cables, specificly making them look good at arbitary lengths (do we build em out of segments? or perhaps a single mesh scaled?) Other issues are if you plan on using karma you need to work out the replication for that stuff.
* Camera adjustment: easy I can have something together in a few minutes if you want it.
* I think kVehicle is the best thing to subclass if you plan on using karma.

I *think* karma objects can only be joined to karma objects, also not sure if a karma object can be anchored to the world (so it doesnt move) but that would make the interactions easy.. just restrict the pylons to be KActors that are anchored to the world. 

----

'''Naky:''' Sure, I don't see why not.  This isn't a Something Awful goon project only.  What is your main thing?  Programming, mapping, modelling, skinning?  We have 2 programmers, 1 modeller, 1 texture artist, one sound designer and one designer who is the guy who started this thread on Wiki so far.  Right now we're mostly in the planning and preparation stage but starting to get the basics down in certain areas.  We're also keeping the scope small at first and expanding as we complete the tasks we outline so don't think bad of us as a result =P

----

'''Killmaster:''' Ok, I added Team section. I also added a basic Timeline, feel free to add things or modify it if you think anything needs to be changed.

----

'''Naky:''' Added in the modelling tasks and a section for the programmers.  Mr. P, who has decided to be a full member now (yay!) and Plane Guy can work out what they need to do with each other and list it, I guess.

----

'''Petri:''' Hay guys, I'm Mr. P.

'''MythOpus:''' Yo Mistah P ;)

----

'''Spike:''' Hey there...A few weeks ago someone contacted me about this project but I lost the info. Could you drop me a line again? I have a Web site with a bulletin board running, and I could create a mod dev team board for you (see http://amishrabbit.com/forums/viewforum.php?f=10), if you want to use something other than a Wiki to stay in touch (especially because someone could just delete the whole thing). Drop me an ICQ to 3797129 or AIM Spikescape.

----

'''Plane Guy''' We're not dead yet!

----

'''05-05-2003| Dodger_''' *pokes the body with a stick* '''Enable grappling rockets - Incomplete. &quot;Karma actors do not do collision&quot; :P''': If they don't do collision, then how does UT2k3 do the collision with the beams and stuff when you fall down the pit in that ball game?

----

'''Plane Guy:''' That's a karma actor (ragdoll) interacting with other karma actors (beams, etc.) Once an actor gets handed over to karma, it does not handle &quot;game collision&quot; events, at least not properly. Well, at least the grapple hook passes harmlessly through the rocket (karma controlled) when I take a pot-shot at it. Since it should grapple '''any''' actor, the only thing I can see different between the rocket any any other actor, is that I've handed control of it to Karma.

On a related note, it really pains me that I have to re-code th wheel on the towing physics. If I find something - have some sort of epiphany - I'd swicth over to Karma in a nanosecond. I don't trust the replication on it though. Karma seens to work on a differnt plane than the rest of the game, it's just that we get the priviledge to watch it's magic at work sometimes.

'''Foxpaw:''' This is partially true and partially not.. Karma does work independantly of the regular physics, however, it is possible to make it interact with other normal objects. Usually the beams and stuff that you hit are not &quot;karma objects&quot; per se. If you want an object to collide with Karma objects, you have to call KSetBlockkarma( true ) on that object. For &quot;towing&quot; you can use KAddImpulse, or even put a KBSJoint between the hook and the rocket. Then an impulse applied to the hook will cause a realistic &quot;tug&quot; on that point of the rocket.

----

'''Spike:''' Hey Plane Guy&amp;ndash;let me know if you'd like my help with audio. Contact info is in my previous post&amp;rarr;and the offer for a message board still stands, if you want it. (22 July 03)

----

'''MythOpus:''' Hey!  Is this mod still in the construction phase?  It seems to have stopped completely... or maybe someone hasn't had time to update progress?

----

'''Naky:''' We ain't dead, we just moved underground to focus on the two major ass problems we've been having with the Unreal engine.  We've got one of them nailed and the other one somewhat so.  www.rocketwars.com has been regged and we're about to move there soon, with our own forums.  Spike, if you're still interested in helping with sound or additional programming, you're more than welcome.  Sorry I haven't checked this page in such a long time, just been too busy with work, my stuff with the mod and in life in general =) My contact info is: MSN - nyquil_lover @ hotmail.com; ICQ - 216794516 or Email: naky @ rocketwars.com.  The forums should be up this weekend - August 1 or 2nd. 

----

'''Zap!:''' I'm not dead either!  Ok, I just kinda got really busy towards the end of school and kinda forgot about this.  I'm going to be working on my mapping skills (and texturing egad!).  I'll see what I can get done.  Since I'm a newbie with this stuff, I'll need to know what special parts we'll need for our maps, if any.

----

'''Plane Guy:''' Just verifying breathing status. We've done a lot, just not gone far. This is kind of a first for most of us. I know the rockets have been redone, and this is the another try at grappling hooks. I'm so happy Karma is involved now. It's so keen when it's not raping my houseplants.

----

'''Naky:''' Okay guys, www.rocketwars.com is all setup and ready to go.  The forums are setup and completed and once we start making our site, we'll have much less use for this board.  Even as it is, most of the info here is outdated =D  See you guys over there.

----

'''JeePeeEs&quot;gps&quot;'''

hey you guys still working on that site... i would like to see what progress ur making 3/27/06

good looking on revising RJ if i can do nething to help tell me &lt;even tho im useless on the programming front&gt; JeePeeEs on aim or Gmail ... godspeed

----

'''Guest:''' Hey people, I'm just a Rocket Jockey enthusiast and although I haven't got any (relevant) programming skills I fully back your efforts! Keep up the good work! Anyway the reason I wanted to post something is that you might want to have a look at this link http://www.imdb.com/title/tt0302981/fullcredits it has got details of the &quot;cast&quot; involved in making the original RJ and maybe (who knows!) if you contacted them they might be willing to help in some sort of way? Just thought you'd appreciate it...

Good luck!

'''MythOpus:''' Anyone know if there has been any progress with this mod?  The site seems to be gone so I'll either refactor some of it or ask for a [[:Category:Legacy Delete Me]] if the mod is just dead.
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4696</id>
      <timestamp>2006-10-03T11:44:44Z</timestamp>
      <contributor>
        <ip>Host-82-135-95-133.customer.m-online.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Rocket Jockey==

===Summary===

This is an idea that I have been bouncing around for a while, and I think would be quite feasible in the UT2003 engine. 

For those not in the know, Rocket Jockey was a game released several years ago, in which players ride rockets around an arena. Each rocket has cables you can launch, which can be used for a variety of purposes, the main goal being to knock out your opponents. Anyone can be knocked off their rocket, which obviously inflicts quite a large amount of damage against the player. Once you are off the rocket, people can drag you around with cables, tie you to posts, and beat up the player with some rather satisfying crunches and screams.

Note that there's probably lots of stuff I've left out, feel free to search Google or ask for more information, or add stuff if you've played the game.

===Gameplay===

Every player starts on their rocket, an announcer counts off, and the game starts.

====Mechanics====

While off the rocket, you are totally defenseless, thus the need to find a rocket to get back on. 

On the rocket, you have 2 cable launchers on each side at your disposal. Seeing as rockets go at a very high speed, the cables can be used to attach to a pole, which lets you spin around and change direction. You can also attach both cables together, so you can create trip wires, tie players/objects to posts, whatever you can think of. Once a player has been injured heavily enough, he is out of the game. The player with the most points at the end wins.

====Game Types====

=====Arena=====

Basically the maps are a large arena, with posts to swing off of, bombs and powerups to collect, and fences to navigate around. The goal of this is to knock out all your opponents using whatever means neccesary.

=====Racing=====

A circuit-style map, this should allow map-makers to have much more freedom in what to make. In this, players must pass through various goals in order, as they traverse around the course. Note that the original game only offered circuit maps, but once-through maps should be feasible as well.

=====Soccer=====

As the name implies, it's soccer, only on rockets. Two goals on each side, one ball in the center for the players to grab with cables. 

====Scoring====

In arena, different amounts of points are given depending on the difficultly of the maneuver. Points are awarded for inflicting damage upon the player or his rocket. 

----

===Team===

Planeguy - Programming/Modelling/Map Making

Naky - Designer

? - Sounds (Need a new sound d00d)

Naky - Modeller

Mr. P - Programming 

AxeManiac - Texture Artist

Zap! - Mapper

? - Animator (only need a couple of very small animations done, this would be an incredibly easy job)

Also, if anyone's experienced in creating UV maps, we could really use your help.  I'm doing them, but very slowly due to lack of time and skill ;-) Not a critical thing, I'll get them all done eventually, just a matter of when.

===Timeline===

Ok, obviously a lot of this is still up in the air, but here's what I think we should do based on what I've been hearing (feel free to make any changes)

#This is the initial stage. The focus should be on getting the basic gameplay mechanics coded, such as:
##Implementing a basic rocket
##Arena gametype
##Mechanics for players once off the rocket - nothing too complex, things like tripping and getting thrown around can be done later
##Simple HUD

#After we complete this stage, I'm thinking that the game should be more or less feature complete compared to the original game. Other things that should be done by now:
##Grappling onto players/objects - Possibly with Karma physics assuming that it's not too much of a hassle, otherwise we can delay it to a later stage.
##Soccer and Racing game types - If these don't delay things too much I think they could also be postponed, but I'd like to get them done.
##Maps - We should have at least some basic arena maps, enough that we could release something and it'd be fun.

#Focus on polishing, balancing, and fixing bugs. We should also start focusing on cosmetic stuff such as modeling/skinning and static meshes, but I think that the bulk of that could be delayed for future releases.

#This is the &quot;eye candy&quot; stage. By now we should have some modelers/skinners/animators and mapmakers, and we can focus on transitioning into something that looks purty.

===Modelling Tasks===

The stuff us modellers gotta do for phase 1.

=====Map Objects=====
* Basic Stub - '''Completed - Textured - DONE'''
* Basic Pole - '''Completed - Textured - DONE'''
* Net (long, low) - '''Completed - Not Ready for Texturing'''
* Net (short, high) - Incomplete
* Ball Ejection Port - Incomplete
* Claw Stub - Incomplete
* Power-up Ring - '''Completed - Not Ready for Texturing'''
* Cable-Changing Spool - Incomplete
* Billboard - Incomplete

=====Balls=====
* Soccer Ball - Incomplete
* Hover Tire - '''Completed - Not Ready for Texturing'''
* Steel Ball - '''Completed - Not Ready for Texturing'''
* Beach Ball - '''Completed - Not Ready for Texturing'''
* Bomb - '''Completed - Not Ready for Texturing'''

=====Rockets &amp; Rocket Related=====
* 2 rockets: 

- Rucinsky's Radical Rocket - '''Completed - Not Ready for Texturing'''

- Helm's XR-1 &quot;Conquerer&quot; - Incomplete

- Fusellier - '''Completed - Ready for Texturing'''

- Unlockable Rocket - '''Completed - Not Ready for Texturing'''
* 1 cable mesh with 2 different skins  - '''Completed - Not Ready for Texturing'''

===Programming Tasks===
* Extend KVehicle into a rocket class, using KCar as a guide (only simpler, since there's no wheels) - '''Petri:''' The rocket itself is pretty much complete. Some things need to be changed but that shouldn't be very hard.
* 3rd person viewpoint for players - '''Petri:''' Complete for player controllers, incomplete for vehicles.
* New Hud - Plane Guy: '''Complete'''. Things may be added in the future, but this has all the basics
* New Gametype or Mutator that removes weapons - '''Petri:''' Complete.

Phase 2 has begun! '''We're not dead yet!'''
* New PlayerPawn to account for vehicle hit damage and effects? - Incomplete
* Grappling hooks and tow cable effect - Plane Guy: '''86.7% Complete''' Now with 90% more KARMA
* Attach grapple hooks shooters to rocket - Incomplete
* Enable grappling rockets - Plane Guy: '''Complete''' Hehe, found out I can't aim down with P's behindview code, so I was just shooting over it
* Reveal Plane Guy is a retard - Plane Guy: '''Complete''' See above.
* Change gametype to spawn a rocket when a player logs in - Incomplete.

For now, we'll just drop a rocket or two in the level. Having a rocket spawn with the player only on his first spawn looks like a quite bit of work we don't want to get hung up on right now, especially when rockets are still in development.

----

===Comments===

'''xray:''' (3. october 2006) &amp;rarr;&gt; http://www.solar-ray.org

----

'''Grincer:''' (2nd of July 2005) I was trying to get some people together on http://rocketjockey.deviantart.com to work on a remake. As I see it now, this website is the most promising one. I can't seem to see any dates on the developments. It might be a good idea to have a bit of an overview on how the developments are going now. I'm no programmer, just a real big fan of this game. Because of the fantastic gameplay. I have posted a several links to this Wiki site, keep up the good work! If you have any questions you can contact me on grincerAThotmail.com (msn) or 11841021 (icq) or by mail at grincerATgmail.com. Just mention in the subject 'Rocket Jockey'.

----

Note that I have no experience whatsoever, I just thought that it's a shame that this game has not been done justice. 

'''Highlander:''' OMG i loved this game i never could find a copy of the full version but i played the demo too much. I agree this could be quite interesting on the ut2k3 engine. A fair amount of coding i think. Depends to what extent you could use karma to your advantage (the ropes). Quite the idea.

----

Highlander, go to http://www.the-underdogs.org/game.php?name=Rocket+Jockey

'''Highlander:''' Thank you for the link :). Unfortunately... it doesnt seem to like win2k... so i will proceed to install win95 on my laptop. 

----

I'd be willing to help code this. Let me know. &amp;ndash; Spike ICQ 3797129.

----

'''Naky:''' So it looks like a formal team has taken up this project now (goons, you know who you are).  We'll use this board to consolidate and talk about the project until we get our site up and running.

----

'''Plane Guy:''' Ok, so this is how I see it. We should get some rudimentary basics working soon, so that we can build on them at axemanic's afore-mentioned slow pace. I can see making working rockets and grapple hooks (sans tripwires) easily with placeholder models. The reason I want to get going is that people tend to sit around arguing about features and getting nothing done. No one can argue we don't need these features! :) Anyway, I'm off to have a closer look at that KVehicle....

----

'''Naky:''' Agreed.  Some of the basic tasks for programming should be:
* the adjustment of the camera:  this'll be a third person view mod just like the original... maybe eventually we can set something up where mousewheelup zooms in and mousewheeldown zooms out but for now, just a basic behind-the-rocket camera view will do
* tweaking of the kvehicle class: this function probably simulates a wheeled vehicle pretty well but I'm not sure if it'll &quot;feel&quot; right for flying a rocket
* firing the cables: just firing them for the moment, we can worry about how they'll interact with the environment later on

Once we get those things settled, we can add to the list.  Oh yeah, UT2K3 comes with 2 hover jetbike models.  They're inside VehicleMeshes.usx I think.  Both are a little under 900 polys and we can use those two as placeholder rockets for now.  Anyway, for me, I have to sit down either tonight or tomorrow and play the game a bunch so I can make a list of all the map models I need to make.  We might as well stay with the '20s theme for now too, even though it'll look weird with the default character models.  Something we can't help until we find a character modeller, I suppose.

----

'''Highlander:''' You gents need any help lemme know... Currently pre-occupied with a few projects but if I can pitch in I will. Have experience /w gametypes custom pawns / controllers etc. I put a lot of thought into how to implement this a while ago. One problem I see is the cables, specificly making them look good at arbitary lengths (do we build em out of segments? or perhaps a single mesh scaled?) Other issues are if you plan on using karma you need to work out the replication for that stuff.
* Camera adjustment: easy I can have something together in a few minutes if you want it.
* I think kVehicle is the best thing to subclass if you plan on using karma.

I *think* karma objects can only be joined to karma objects, also not sure if a karma object can be anchored to the world (so it doesnt move) but that would make the interactions easy.. just restrict the pylons to be KActors that are anchored to the world. 

----

'''Naky:''' Sure, I don't see why not.  This isn't a Something Awful goon project only.  What is your main thing?  Programming, mapping, modelling, skinning?  We have 2 programmers, 1 modeller, 1 texture artist, one sound designer and one designer who is the guy who started this thread on Wiki so far.  Right now we're mostly in the planning and preparation stage but starting to get the basics down in certain areas.  We're also keeping the scope small at first and expanding as we complete the tasks we outline so don't think bad of us as a result =P

----

'''Killmaster:''' Ok, I added Team section. I also added a basic Timeline, feel free to add things or modify it if you think anything needs to be changed.

----

'''Naky:''' Added in the modelling tasks and a section for the programmers.  Mr. P, who has decided to be a full member now (yay!) and Plane Guy can work out what they need to do with each other and list it, I guess.

----

'''Petri:''' Hay guys, I'm Mr. P.

'''MythOpus:''' Yo Mistah P ;)

----

'''Spike:''' Hey there...A few weeks ago someone contacted me about this project but I lost the info. Could you drop me a line again? I have a Web site with a bulletin board running, and I could create a mod dev team board for you (see http://amishrabbit.com/forums/viewforum.php?f=10), if you want to use something other than a Wiki to stay in touch (especially because someone could just delete the whole thing). Drop me an ICQ to 3797129 or AIM Spikescape.

----

'''Plane Guy''' We're not dead yet!

----

'''05-05-2003| Dodger_''' *pokes the body with a stick* '''Enable grappling rockets - Incomplete. &quot;Karma actors do not do collision&quot; :P''': If they don't do collision, then how does UT2k3 do the collision with the beams and stuff when you fall down the pit in that ball game?

----

'''Plane Guy:''' That's a karma actor (ragdoll) interacting with other karma actors (beams, etc.) Once an actor gets handed over to karma, it does not handle &quot;game collision&quot; events, at least not properly. Well, at least the grapple hook passes harmlessly through the rocket (karma controlled) when I take a pot-shot at it. Since it should grapple '''any''' actor, the only thing I can see different between the rocket any any other actor, is that I've handed control of it to Karma.

On a related note, it really pains me that I have to re-code th wheel on the towing physics. If I find something - have some sort of epiphany - I'd swicth over to Karma in a nanosecond. I don't trust the replication on it though. Karma seens to work on a differnt plane than the rest of the game, it's just that we get the priviledge to watch it's magic at work sometimes.

'''Foxpaw:''' This is partially true and partially not.. Karma does work independantly of the regular physics, however, it is possible to make it interact with other normal objects. Usually the beams and stuff that you hit are not &quot;karma objects&quot; per se. If you want an object to collide with Karma objects, you have to call KSetBlockkarma( true ) on that object. For &quot;towing&quot; you can use KAddImpulse, or even put a KBSJoint between the hook and the rocket. Then an impulse applied to the hook will cause a realistic &quot;tug&quot; on that point of the rocket.

----

'''Spike:''' Hey Plane Guy&amp;ndash;let me know if you'd like my help with audio. Contact info is in my previous post&amp;rarr;and the offer for a message board still stands, if you want it. (22 July 03)

----

'''MythOpus:''' Hey!  Is this mod still in the construction phase?  It seems to have stopped completely... or maybe someone hasn't had time to update progress?

----

'''Naky:''' We ain't dead, we just moved underground to focus on the two major ass problems we've been having with the Unreal engine.  We've got one of them nailed and the other one somewhat so.  www.rocketwars.com has been regged and we're about to move there soon, with our own forums.  Spike, if you're still interested in helping with sound or additional programming, you're more than welcome.  Sorry I haven't checked this page in such a long time, just been too busy with work, my stuff with the mod and in life in general =) My contact info is: MSN - nyquil_lover @ hotmail.com; ICQ - 216794516 or Email: naky @ rocketwars.com.  The forums should be up this weekend - August 1 or 2nd. 

----

'''Zap!:''' I'm not dead either!  Ok, I just kinda got really busy towards the end of school and kinda forgot about this.  I'm going to be working on my mapping skills (and texturing egad!).  I'll see what I can get done.  Since I'm a newbie with this stuff, I'll need to know what special parts we'll need for our maps, if any.

----

'''Plane Guy:''' Just verifying breathing status. We've done a lot, just not gone far. This is kind of a first for most of us. I know the rockets have been redone, and this is the another try at grappling hooks. I'm so happy Karma is involved now. It's so keen when it's not raping my houseplants.

----

'''Naky:''' Okay guys, www.rocketwars.com is all setup and ready to go.  The forums are setup and completed and once we start making our site, we'll have much less use for this board.  Even as it is, most of the info here is outdated =D  See you guys over there.

----

'''JeePeeEs&quot;gps&quot;'''

hey you guys still working on that site... i would like to see what progress ur making 3/27/06

good looking on revising RJ if i can do nething to help tell me &lt;even tho im useless on the programming front&gt; JeePeeEs on aim or Gmail ... godspeed

----

'''Guest:''' Hey people, I'm just a Rocket Jockey enthusiast and although I haven't got any (relevant) programming skills I fully back your efforts! Keep up the good work! Anyway the reason I wanted to post something is that you might want to have a look at this link http://www.imdb.com/title/tt0302981/fullcredits it has got details of the &quot;cast&quot; involved in making the original RJ and maybe (who knows!) if you contacted them they might be willing to help in some sort of way? Just thought you'd appreciate it...

Good luck!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/RollercoasterRider</title>
    <id>1907</id>
    <revision>
      <id>4675</id>
      <timestamp>2002-08-30T20:15:47Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>lol</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Rollercoaster Build and Ride}}

==Description ==

This mod allows people to easily build their very own rollercoaster and then ride it.  It is currently not known as to whether the mod will sit within the UT2003 editor, or within the UT2003 game itself.  Having the mod work within the UT2003 game is preferred (and is described below).

When the game starts, the player is effectively in spectator mode.  They can fly around the map they have loaded and bring up and hide the track editing menu.  The map itself must contain all terrain (tunnels included) and decoration around which the rollercoaster will be built.

When the player has selected a good starting point for the rollercoaster (should the coaster start/end platform be fixed in place?) they can display the coaster construction menu.  This menu allows them to add track pieces to the map.  The first track piece added to the map will be grid aligned horizontally, and by default sit on the floor.  The player can move the vertical position of the first piece up and down (by pre-set amounts) by clicking on a couple of buttons within the coaster construction menu.

Once the first piece of track has been placed, all other track selections simply extend the track.  The track sections as added are simply placed in position relative to the last piece placed.  So, if a straight (and flat) piece of track follows 45 degree twist, it will also be orientated at 45 degrees.  If a loop follows a 45 degree twist, the loop will be orientated at 45 degrees.  ''Question:'' Should players be allowed to add track pieces anywhere - and all we do is grid align them and allow them to extend the track?

All track sections are added by pressing/selecting the track section desired.  Each selection will add a single track section to the coaster.  A demolish button allows a track piece once placed to be removed.  The interface has been inspired by Rollercoaster Tycoon, although it does not allow the track to be built backwards - only forwards.

Track pieces may only be added to unoccupied space.  A track piece will take up more room vertically than it would appear as room for the coaster car must be allowed for.

A simple plugin architecture should be used for the track pieces such that new &quot;special&quot; peices can be added later - that have knowledge on how to restrict the track pieces that follow it.

The track pieces/features that should be available are:
* Platform/coaster starts here sections.
* Straight section (unlike RCT also used for slopes - the coasters don't have to be workable in real life)
* Concave curves (flat to up-hill transition) in 15 or 45 degree sections.
* Convex curves (flat to down-hill transition) in 15 or 45 degree sections.
* Clockwise/Anti-clockwise 45 degree twists (bank entry and exits).
* Banked curves - A selection of 3 types of curve.  Maybe added to the map in 15 or 45 degree sections.
* Up and down helix bends.
* Left and right loops.
* Half loop.
* 180 degree twist (should this be a 90 degree twist instead?).
* Half corkscrew.
* The ability to make straight pieces of track as &quot;lift hills&quot;.

Other elements worth considering (that could be added later)
* Booster - to make the coaster go faster.
* Powered launch.
* Hanging brake - to hold the coaster before it drops down a particularly large drop.
* Anything else that my brain is too foggy to remember right now.

===Track Construction ===

Because I am happy to ignore the effects of hanging people upside down for long periods of time, the only real constraint on the construction of the coaster is whether the ''cars'' complete the track or not.  Each track has an understanding of the track sections that can precede it and follow it.  Although this might sound like a nightmare it can be reduced to some very simple components.

Take a convex curve section.  If we say that the track section that can precede it is a straight, and the track section that can follow it is a straight it would appear that we have drastically reduced the flexibility of the coaster design.  However, all that really needs to happen is that the track exit type of the first piece must match the track entry type of the following piece.  This means that we can have a convex curve following a convex curve because the exit and entry types of these pieces are the same.

In the current design there are only two types of entry and exit pieces - a straight and a banked-curve entry.

The implication of this is that the orientation of the track elements is somewhat arbitrary.  There would be nothing to stop you from having a bank entry (essentially a 45 degree twist) followed by a loop.  The loop would be at 45 degrees and would look odd - but you could do it.  I guess the only real problem with this approach is that you have to make sure the coaster is the right way up to finish it.

Some way of saving a track should be devised.  The track data should at the very least reference the map in which it has been placed as particular map features may have been used to make the coaster more exciting - like a tunnel - that wouldn't exist on a different map.

===Riding the Finished Coaster ===

When riding the finished coaster, a rollercoaster car should be created at the coaster platform.  There should be one car per platform element (no more than 4 platforms elements need be supported).  The player can then either watch the car travel round the track, or, select a seat within the coaster train to ride in.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  Goodness only knows what the load on the engine is likely to be when spawning all of the meshes needed.  It may well be much more sensible to actually build this mod as an Editor extension so that all of the coaster track and scenery around the level are all handled as static meshes.  Maybe I've been playing too much Rollercoaster Tycoon recently :).

'''Birelli:''' There should be some way at least to save coaster designs, the simplest way I see to do this is simply to make them all maps, although it would be awesome if you could tweak them inside UT2k3 and have it overwrite the map, but I somehow doubt that's going to be technically possible. Anyways it would be cool to have some sort of website with a forums and a database ala NaliCity (auto-updates, no need for a hard-working admin to hand-upload everything) with user-made coasters :D.

'''ZxAnPhOrIaN:''' The coasters should be made into maps. What will the player move in, movers or interpolation points, or similar things in UT 2003?

'''EntropicLqd:'''
: The biggest benefit of making the coasters into real UT maps (as opposed to having a map and building the roller coaster) is that the final result will run faster (probably) and can be lit more effectively.  The downside to that is that only people brave enough to start up the map editor will want to create rollercoasters.  My personal preference would be to have the coaster built &quot;in game&quot; rather than &quot;in editor&quot; with a feature that allows coasters built &quot;in game&quot; to be imported into the editor for proper lighting and processing.
: In terms of what the players move in - I was hoping to be able to use the new vehicle class within UT as a base and attach the player to that.  With a bit of luck the vehicle could be constructed in such a way that the Karma physics stuff could be used to actually control the vehicle's falling (conceptually they ''fall'' down the track).
: As far as saving maps go there must be plenty of file handling code in UT.  It's just whether it's accessable or not.  If the route of using real UT2003 maps is taken then the coaster construction information could be held within a custom component on the map that simply contains a list of all of the different track pieces used.  If an &quot;in game&quot; approach is used and there is no file handling functions available then the track information could be written to the standard UT log and a small Java program used to parse the log file and extract it into it's raw form.  That's a really ugly solution but it would work.  It may be preferable to add some custom client side C++.  A more elegant solution but most likely to be more problematic.

'''Birelli:''' Would the mod allow the builder to go &quot;underground&quot; and just make a tunnel or would it be more practical to just add in checks that no piece of track can be below &quot;ground level&quot;.

'''EntropicLqd:'''  If the mod is purely for the editor then you could do whatever the hell you liked.  If the mod works &quot;in game&quot; then you'd either have to create tunnels on the fly (by creating fake terrain from non-static meshes) or add checks to prevent track pieces from entering anything solid.  For simplicities sake I think I favour having to build &quot;tunnels&quot; within the editor.

'''ZxAnPhOrIaN:''' The mod should include prefabs in .t3d format such as a curly track, dock, loop, etc. making mapping easier for this mod 

'''EntropicLqd:''' I think you've missed the point slightly.  The mod '''is''' the roller coaster builder - whether it sits within the editor or within the game itself.  If you've never played Roller Coaster Tycoon then I guess you can be forgiven for not quite understanding what I'm trying to get at here.  I've attempted to update the description of the mod to more accurately reflect the aim.

'''ZxAnPhOrIaN:''' Oooohhhhhhhh... Now I get it! ;) Also, I never played Roller Coaster Tycoon :( . BTW: Call me Zxan for short. :P</text>
    </revision>
    <revision>
      <id>4676</id>
      <timestamp>2002-08-30T19:49:36Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Update for Zxanthingumymebob.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Rollercoaster Build and Ride}}

==Description ==

This mod allows people to easily build their very own rollercoaster and then ride it.  It is currently not known as to whether the mod will sit within the UT2003 editor, or within the UT2003 game itself.  Having the mod work within the UT2003 game is preferred (and is described below).

When the game starts, the player is effectively in spectator mode.  They can fly around the map they have loaded and bring up and hide the track editing menu.  The map itself must contain all terrain (tunnels included) and decoration around which the rollercoaster will be built.

When the player has selected a good starting point for the rollercoaster (should the coaster start/end platform be fixed in place?) they can display the coaster construction menu.  This menu allows them to add track pieces to the map.  The first track piece added to the map will be grid aligned horizontally, and by default sit on the floor.  The player can move the vertical position of the first piece up and down (by pre-set amounts) by clicking on a couple of buttons within the coaster construction menu.

Once the first piece of track has been placed, all other track selections simply extend the track.  The track sections as added are simply placed in position relative to the last piece placed.  So, if a straight (and flat) piece of track follows 45 degree twist, it will also be orientated at 45 degrees.  If a loop follows a 45 degree twist, the loop will be orientated at 45 degrees.  ''Question:'' Should players be allowed to add track pieces anywhere - and all we do is grid align them and allow them to extend the track?

All track sections are added by pressing/selecting the track section desired.  Each selection will add a single track section to the coaster.  A demolish button allows a track piece once placed to be removed.  The interface has been inspired by Rollercoaster Tycoon, although it does not allow the track to be built backwards - only forwards.

Track pieces may only be added to unoccupied space.  A track piece will take up more room vertically than it would appear as room for the coaster car must be allowed for.

A simple plugin architecture should be used for the track pieces such that new &quot;special&quot; peices can be added later - that have knowledge on how to restrict the track pieces that follow it.

The track pieces/features that should be available are:
* Platform/coaster starts here sections.
* Straight section (unlike RCT also used for slopes - the coasters don't have to be workable in real life)
* Concave curves (flat to up-hill transition) in 15 or 45 degree sections.
* Convex curves (flat to down-hill transition) in 15 or 45 degree sections.
* Clockwise/Anti-clockwise 45 degree twists (bank entry and exits).
* Banked curves - A selection of 3 types of curve.  Maybe added to the map in 15 or 45 degree sections.
* Up and down helix bends.
* Left and right loops.
* Half loop.
* 180 degree twist (should this be a 90 degree twist instead?).
* Half corkscrew.
* The ability to make straight pieces of track as &quot;lift hills&quot;.

Other elements worth considering (that could be added later)
* Booster - to make the coaster go faster.
* Powered launch.
* Hanging brake - to hold the coaster before it drops down a particularly large drop.
* Anything else that my brain is too foggy to remember right now.

===Track Construction ===

Because I am happy to ignore the effects of hanging people upside down for long periods of time, the only real constraint on the construction of the coaster is whether the ''cars'' complete the track or not.  Each track has an understanding of the track sections that can precede it and follow it.  Although this might sound like a nightmare it can be reduced to some very simple components.

Take a convex curve section.  If we say that the track section that can precede it is a straight, and the track section that can follow it is a straight it would appear that we have drastically reduced the flexibility of the coaster design.  However, all that really needs to happen is that the track exit type of the first piece must match the track entry type of the following piece.  This means that we can have a convex curve following a convex curve because the exit and entry types of these pieces are the same.

In the current design there are only two types of entry and exit pieces - a straight and a banked-curve entry.

The implication of this is that the orientation of the track elements is somewhat arbitrary.  There would be nothing to stop you from having a bank entry (essentially a 45 degree twist) followed by a loop.  The loop would be at 45 degrees and would look odd - but you could do it.  I guess the only real problem with this approach is that you have to make sure the coaster is the right way up to finish it.

Some way of saving a track should be devised.  The track data should at the very least reference the map in which it has been placed as particular map features may have been used to make the coaster more exciting - like a tunnel - that wouldn't exist on a different map.

===Riding the Finished Coaster ===

When riding the finished coaster, a rollercoaster car should be created at the coaster platform.  There should be one car per platform element (no more than 4 platforms elements need be supported).  The player can then either watch the car travel round the track, or, select a seat within the coaster train to ride in.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  Goodness only knows what the load on the engine is likely to be when spawning all of the meshes needed.  It may well be much more sensible to actually build this mod as an Editor extension so that all of the coaster track and scenery around the level are all handled as static meshes.  Maybe I've been playing too much Rollercoaster Tycoon recently :).

'''Birelli:''' There should be some way at least to save coaster designs, the simplest way I see to do this is simply to make them all maps, although it would be awesome if you could tweak them inside UT2k3 and have it overwrite the map, but I somehow doubt that's going to be technically possible. Anyways it would be cool to have some sort of website with a forums and a database ala NaliCity (auto-updates, no need for a hard-working admin to hand-upload everything) with user-made coasters :D.

'''ZxAnPhOrIaN:''' The coasters should be made into maps. What will the player move in, movers or interpolation points, or similar things in UT 2003?

'''EntropicLqd:'''
: The biggest benefit of making the coasters into real UT maps (as opposed to having a map and building the roller coaster) is that the final result will run faster (probably) and can be lit more effectively.  The downside to that is that only people brave enough to start up the map editor will want to create rollercoasters.  My personal preference would be to have the coaster built &quot;in game&quot; rather than &quot;in editor&quot; with a feature that allows coasters built &quot;in game&quot; to be imported into the editor for proper lighting and processing.
: In terms of what the players move in - I was hoping to be able to use the new vehicle class within UT as a base and attach the player to that.  With a bit of luck the vehicle could be constructed in such a way that the Karma physics stuff could be used to actually control the vehicle's falling (conceptually they ''fall'' down the track).
: As far as saving maps go there must be plenty of file handling code in UT.  It's just whether it's accessable or not.  If the route of using real UT2003 maps is taken then the coaster construction information could be held within a custom component on the map that simply contains a list of all of the different track pieces used.  If an &quot;in game&quot; approach is used and there is no file handling functions available then the track information could be written to the standard UT log and a small Java program used to parse the log file and extract it into it's raw form.  That's a really ugly solution but it would work.  It may be preferable to add some custom client side C++.  A more elegant solution but most likely to be more problematic.

'''Birelli:''' Would the mod allow the builder to go &quot;underground&quot; and just make a tunnel or would it be more practical to just add in checks that no piece of track can be below &quot;ground level&quot;.

'''EntropicLqd:'''  If the mod is purely for the editor then you could do whatever the hell you liked.  If the mod works &quot;in game&quot; then you'd either have to create tunnels on the fly (by creating fake terrain from non-static meshes) or add checks to prevent track pieces from entering anything solid.  For simplicities sake I think I favour having to build &quot;tunnels&quot; within the editor.

'''ZxAnPhOrIaN:''' The mod should include prefabs in .t3d format such as a curly track, dock, loop, etc. making mapping easier for this mod 

'''EntropicLqd:''' I think you've missed the point slightly.  The mod '''is''' the roller coaster builder - whether it sits within the editor or within the game itself.  If you've never played Roller Coaster Tycoon then I guess you can be forgiven for not quite understanding what I'm trying to get at here.  I've attempted to update the description of the mod to more accurately reflect the aim.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/RoundUp</title>
    <id>1964</id>
    <revision>
      <id>4807</id>
      <timestamp>2003-05-05T02:47:02Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>Jumpin' the gun. ::UT::</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for ::UT::  &amp;ndash; RoundUp for ::UT::}}

==Description==

===Teamplay ===

Teams have a new weapon along with with whatever other weapons they are mutated to have. This weapon fires a FreezeRay at an opposing player. That player is now frozen but can turn around and can still teamsay for help. The only way this frozen player can move is when one of three things happen: 
* The effect of the weapon wears off
* One of his/her teammates touches him/her
* One of the other teams members touches frozen player.

When you are frozen and a member of the other team touches you, you become his/her prisoner. You can only look around, but where your captor travels, you are forced to follow. Captor will lead you to a holding cell at captor's base. If he screws around too long, you will become free and possibly take your captor captive. Once captor enters base with you, you are forced to walk into the holding cell. There you remain the durration (so games need to be fairly short timed). The team with the most captives at end of game time || has all opposing members captive before end of game wins.

===DeathMatch ===

In deathmatch if you are frozen you are subject to remain frozen until: 
* effect wears off
* you are taken captive.

The player with the most captives at end of game time || has all opposing members captive before end of game wins. hmmm where does he take 'em? Either base i guess, frags awarded on delivery??

===Weapon ===

Has no range limit, (like pulse) But its effect does have a timeout setting. The idea would be that you can freeze someone for your teammate enroute to pick up the captive, or you can freeze them and collect them yourself. But, if you can't get to them before the effect wears off || their teammate frees them, then you were just being rude i suppose. Unless it was to stop them from putting a chill on your teammate. Person frozen needs to appear to be effected other than just by standing still.&lt;br /&gt;Maybe teammates can use alt-fire on each other to thaw them out. 

===Map Considerations ===

Need to have holding cells inside of or attached to bases. Bases would be nice if they were located high with the holding cells positioned to where captives could at least watch the rest of the game. To make the mod able to use ctf maps the captive could be sent, and confined to other teams base. 

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''DJPaul:''' Sounds like [http://www.badgergoose.com/teamfreeze/index.html TeamFreeze].

'''CH3Z:'''     Sounds like the weapon and the way the player is idicated as being frozen are what i was thinking about. I don't play 2k3, but i didn't see a page like this for ::UT:: classic. I don't think [http://www.badgergoose.com/teamfreeze/index.html TeamFreeze]has a prisoner feature does it? Maybe this whole idea should be posed as suggestions for TF. That's what it's all about afterall, a suggestion. I would love to see it for ::UT::, but i might have to do it myself... long journey for me.&lt;br /&gt;     I think making the captor, follow, holding cell, and all that would be pretty easy for someone who has the modding experience. &quot;event Touch( Actor other )&quot; sounds like an easy one for the engine to watch for. Then the captive's position mimicks the captors poistion +/- X and +/- Y to make him follow or be pushed ahead of captor. I'm sure you could do it, Paul. Might even use stand in for the captive, that is a bot... hmmm that makes me think.&lt;br /&gt;     Anyway, i think the gameplay would be interesting and fun and it wouldn't be all THAT hard to code. If you don't do anything with the idea for TF, and maybe even if you do, I'm pretty sure to make this mod for ::UT::. But, like i said, &quot;long journey for me&quot;.
              

'''CH3Z:''' 

{{innerbox|Quote from [http://www.badgergoose.com/teamfreeze/TeamFreeze2003readme.html TeamFreeze/About] &quot;Bugs? They're undiscovered features!&quot;

}}

hehehe i love that =)

'''DJPaul:''' TF has already had a few releases.  I said i'd help Gerard with it *months ago*, but have neglected to get around to it yet, and G's been quiet lately :).  See http://mods.moddb.com/692/ and http://www.badgergoose.com/teamfreeze/index.html for a download URL.

'''CH3Z:''' I have designated this mod idea RoundUp for ::UT:: Classic now. But i think it would be a nice new gametype for TF still.

'''Gerard:''' I have the source for the mod lying around, with all the &quot;packaging&quot; stuff (the NSIS script). If anyone's interested in taking the project over, they can mail me from the project pages at either moddb, or from the project's homepage.</text>
    </revision>
    <revision>
      <id>4808</id>
      <timestamp>2003-04-30T20:10:20Z</timestamp>
      <contributor>
        <ip>H24-80-190-134.gv.shawcable.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">----

==RoundUp for UT Classic==

; Teamplay : 
          Teams have a new weapon along with with whatever other weapons they are mutated to have. This 
          weapon fires a FreezeRay at an opposing player. That player is now frozen but can turn around 
          and can still teamsay for help. The only way this frozen player can move is when one of three 
          things happen:
                   * The effect of the weapon wears off ||
                   * One of his/her teammates touches him/her ||
                   * One of the other teams members touches frozen player.
          When you are frozen and a member of the other team touches you, you become his/her prisoner. You
          can only look around, but where your captor travels, you are forced to follow. Captor will lead 
          you to a holding cell at captor's base. If he screws around too long, you will become free and 
          possibly take your captor captive. Once captor enters base with you, you are forced to walk into 
          the holding cell. There you remain the durration (so games need to be fairly short timed).
               The team with the most captives at end of game time || has all opposing members captive
          before end of game wins.  
; DeathMatch : 
          In deathmatch if you are frozen you are subject to remain frozen until effect wears off || you are
          taken captive. 
                The player with the most captives at end of game time || has all opposing members captive
          before end of game wins. hmmm where does he take 'em? Either base i guess, frags awarded on delivery?? 
; Weapon : 
          Has no range limit, (like pulse) But its effect does have a timeout setting. The idea would be that
          you can freeze someone for your teammate enroute to pick up the captive, or you can freeze them and
          collect them yourself. But, if you can't get to them before the effect wears off || their teammate 
          frees them, then you were just being rude i suppose. Unless it was to stop them from putting a chill
          on your teammate. Person frozen needs to appear to be effected other than just by standing still. 
          Maybe teammates can use alt-fire on each other to thaw them out. 
; Maps : 
          Need to have holding cells inside of or attached to bases. Bases would be nice if they were located 
          high with the holding cells positioned to where captives could at least watch the rest of the game. To 
          make the mod able to use ctf maps the captive could be sent, and confined to other teams 
          base. 

----

==Interested Scripters==

; &lt;u&gt;Full&lt;/u&gt; : 
*][c1][C|H|3|Z but i'm very new and i'll post here before i actually start. G'head, do it.
*...

; &lt;u&gt;Weapon&lt;/u&gt; :
*][c1][CH|3|Z If i start this is where i would start i think. Don't wait on me, just put your name and when you started. And log into the [[Legacy:Developer Journals/CH3Z|Developer Journals/CH3Z]] that you have joined the effort.
*...

; &lt;u&gt;Maps&lt;/u&gt; :
*...
*...

----

[[Legacy:Developer Journals/CH3Z|Developer Journals/CH3Z]]

----

==Comments==

'''DJPaul:''' Sounds like [http://www.badgergoose.com/teamfreeze/index.html TeamFreeze].

'''CH3Z:'''     Sounds like the weapon and the way the player is idicated as being frozen are what i was thinking about. I don't play 2k3, but i didn't see a page like this for UT classic. I don't think [http://www.badgergoose.com/teamfreeze/index.html TeamFreeze]has a prisoner feature does it? Maybe this whole idea should be posed as suggestions for TF. That's what it's all about afterall, a suggestion. I would love to see it for UT, but i might have to do it myself... long journey for me.&lt;br /&gt;     I think making the captor, follow, holding cell, and all that would be pretty easy for someone who has the modding experience. &quot;event Touch( Actor other )&quot; sounds like an easy one for the engine to watch for. Then the captive's position mimicks the captors poistion +/- X and +/- Y to make him follow or be pushed ahead of captor. I'm sure you could do it, Paul. Might even use stand in for the captive, that is a bot... hmmm that makes me think.&lt;br /&gt;     Anyway, i think the gameplay would be interesting and fun and it wouldn't be all THAT hard to code. If you don't do anything with the idea for TF, and maybe even if you do, I'm pretty sure to make this mod for UT. But, like i said, &quot;long journey for me&quot;.
              

'''CH3Z:''' 

{{innerbox|Quote from [http://www.badgergoose.com/teamfreeze/TeamFreeze2003readme.html TeamFreeze/About] &quot;Bugs? They're undiscovered features!&quot;

}}

hehehe i love that =)

'''DJPaul:''' TF has already had a few releases.  I said i'd help Gerard with it *months ago*, but have neglected to get around to it yet, and G's been quiet lately :).  See http://mods.moddb.com/692/ and http://www.badgergoose.com/teamfreeze/index.html for a download URL.

'''CH3Z:''' I have designated this mod idea RoundUp for UT Classic now. But i think it would be a nice new gametype for TF still.

'''Gerard:''' I have the source for the mod lying around, with all the &quot;packaging&quot; stuff (the NSIS script). If anyone's interested in taking the project over, they can mail me from the project pages at either moddb, or from the project's homepage.</text>
    </revision>
    <revision>
      <id>4809</id>
      <timestamp>2003-05-02T03:08:53Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>Converted entire page to match others in section</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT  &amp;ndash; RoundUp for UT Classic}}

==Description==

===Teamplay ===

Teams have a new weapon along with with whatever other weapons they are mutated to have. This weapon fires a FreezeRay at an opposing player. That player is now frozen but can turn around and can still teamsay for help. The only way this frozen player can move is when one of three things happen: 
* The effect of the weapon wears off
* One of his/her teammates touches him/her
* One of the other teams members touches frozen player.

When you are frozen and a member of the other team touches you, you become his/her prisoner. You can only look around, but where your captor travels, you are forced to follow. Captor will lead you to a holding cell at captor's base. If he screws around too long, you will become free and possibly take your captor captive. Once captor enters base with you, you are forced to walk into the holding cell. There you remain the durration (so games need to be fairly short timed). The team with the most captives at end of game time || has all opposing members captive before end of game wins.

===DeathMatch ===

In deathmatch if you are frozen you are subject to remain frozen until: 
* effect wears off
* you are taken captive.

The player with the most captives at end of game time || has all opposing members captive before end of game wins. hmmm where does he take 'em? Either base i guess, frags awarded on delivery??

===Weapon ===

Has no range limit, (like pulse) But its effect does have a timeout setting. The idea would be that you can freeze someone for your teammate enroute to pick up the captive, or you can freeze them and collect them yourself. But, if you can't get to them before the effect wears off || their teammate frees them, then you were just being rude i suppose. Unless it was to stop them from putting a chill on your teammate. Person frozen needs to appear to be effected other than just by standing still.&lt;br /&gt;Maybe teammates can use alt-fire on each other to thaw them out. 

===Map Considerations ===

Need to have holding cells inside of or attached to bases. Bases would be nice if they were located high with the holding cells positioned to where captives could at least watch the rest of the game. To make the mod able to use ctf maps the captive could be sent, and confined to other teams base. 

====Interested Scripters ====

If you are interested in developing this mod for UT then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''DJPaul:''' Sounds like [http://www.badgergoose.com/teamfreeze/index.html TeamFreeze].

'''CH3Z:'''     Sounds like the weapon and the way the player is idicated as being frozen are what i was thinking about. I don't play 2k3, but i didn't see a page like this for UT classic. I don't think [http://www.badgergoose.com/teamfreeze/index.html TeamFreeze]has a prisoner feature does it? Maybe this whole idea should be posed as suggestions for TF. That's what it's all about afterall, a suggestion. I would love to see it for UT, but i might have to do it myself... long journey for me.&lt;br /&gt;     I think making the captor, follow, holding cell, and all that would be pretty easy for someone who has the modding experience. &quot;event Touch( Actor other )&quot; sounds like an easy one for the engine to watch for. Then the captive's position mimicks the captors poistion +/- X and +/- Y to make him follow or be pushed ahead of captor. I'm sure you could do it, Paul. Might even use stand in for the captive, that is a bot... hmmm that makes me think.&lt;br /&gt;     Anyway, i think the gameplay would be interesting and fun and it wouldn't be all THAT hard to code. If you don't do anything with the idea for TF, and maybe even if you do, I'm pretty sure to make this mod for UT. But, like i said, &quot;long journey for me&quot;.
              

'''CH3Z:''' 

{{innerbox|Quote from [http://www.badgergoose.com/teamfreeze/TeamFreeze2003readme.html TeamFreeze/About] &quot;Bugs? They're undiscovered features!&quot;

}}

hehehe i love that =)

'''DJPaul:''' TF has already had a few releases.  I said i'd help Gerard with it *months ago*, but have neglected to get around to it yet, and G's been quiet lately :).  See http://mods.moddb.com/692/ and http://www.badgergoose.com/teamfreeze/index.html for a download URL.

'''CH3Z:''' I have designated this mod idea RoundUp for UT Classic now. But i think it would be a nice new gametype for TF still.

'''Gerard:''' I have the source for the mod lying around, with all the &quot;packaging&quot; stuff (the NSIS script). If anyone's interested in taking the project over, they can mail me from the project pages at either moddb, or from the project's homepage.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/SeasonsMultiMap</title>
    <id>1941</id>
    <revision>
      <id>4754</id>
      <timestamp>2004-11-15T19:48:09Z</timestamp>
      <contributor>
        <ip>Kungfu Hampster</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

The idea behind this mutator is to allow a map to have up to four different appearances depending on the system date set on the server. (maybe even more if the code were to extent to special days [eg. Christmas, Halloween, Easter, St. Patrick's, etc.] but just the four seasons for now.)

Almost like having four maps in one.

For example, we could make one of those giant-room maps with a desk that has a CD jewel case sitting on top. But depending on the season, a different &quot;CDCover&quot; texture would be shown on the CD jewel brush/object/etc (whatever it is ... I'm no mapper ;) ). 

Note in the texture set below, each texture begins with &quot;CDCover&quot; as a prefix but has the appropriate seasonal suffix. The mapper would just add the texture to the item as &quot;AryaMusic.CDCover&quot; [without the seasonal suffix] assuming that the UTX package is called AryaMusic.utx.

&lt;center&gt; [[Image:Legacy_MultiSeasons-Covers.jpeg|]] &lt;/center&gt;

If the mutator is enabled either by the user or forcely activated by the map, then when the map loads it'll load one of the four textures in that part, depending on the system date (eg. at the time this document was written [12/12/2002], it would load the Charlotte Church CD Cover texture).

However, the mutator shouldn't be limited to just swapping textures, it could be used for swapping static meshes, ambience sounds, etc ...

==Interested Scripters ==

==Discussion ==

'''Kirin:''' Okay ... I put my idea on the table on the table ... what do you think? :)

'''EntropicLqd:''' The idea has a certain appeal.  You'd have to have the map built especially for it though - rather than driving it from a mutator.  In terms of swapping meshes in and out of the map I'm not sure you could do that as static meshes form part of the BSP tree.  You could create some decorations to do it though - and possibly re-skin existing static meshes dynamically.  I do like the idea of having lights appear on a Christmas tree for a couple of weeks either side of Christmas.

'''ZxAnPhOrIaN:''' Cool aspect... One problem, you may have to make a special map for the mutator, and what if i don't want to play the map with the mutator, will it be playable?? Also, there could be a map that is like RocketArena like a haunted house in Halloween, a stable in Christmas, fireworks park on July 4th, etc. in one map. (thinks about a [[Legacy:Map Ideas|Map Ideas]]!)

'''Kirin:''' That's what I was thinking ... like Chaos maps could only be played with the Chaos mutator. However, unlike making it a requirement, if the mutator is not loaded, there could be a default texture in place which is the name of the texture prefix (eg. In the example I used above, the name of the texture would have to be &quot;CDCover&quot;) ... of course, that could be up to the mapper if he/she wants to make the mutator a requirement for the map to run.

'''KungFu Hampster:''' FYI, I'm having a heck of a time figuring out a way to swap textures in realtime with the engine.  Swapping them before the level loads should be fairly straightforeward (using the system clock and stuff).  However, if you're looking to find a way to swap them during gameplay, there's a suprising lack of info out there on how ta do this...</text>
    </revision>
    <revision>
      <id>4755</id>
      <timestamp>2002-12-22T02:35:33Z</timestamp>
      <contributor>
        <ip>Ilm26-160-209.ec.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

The idea behind this mutator is to allow a map to have up to four different appearances depending on the system date set on the server. (maybe even more if the code were to extent to special days [eg. Christmas, Halloween, Easter, St. Patrick's, etc.] but just the four seasons for now.)

Almost like having four maps in one.

For example, we could make one of those giant-room maps with a desk that has a CD jewel case sitting on top. But depending on the season, a different &quot;CDCover&quot; texture would be shown on the CD jewel brush/object/etc (whatever it is ... I'm no mapper ;) ). 

Note in the texture set below, each texture begins with &quot;CDCover&quot; as a prefix but has the appropriate seasonal suffix. The mapper would just add the texture to the item as &quot;AryaMusic.CDCover&quot; [without the seasonal suffix] assuming that the UTX package is called AryaMusic.utx.

&lt;center&gt; [[Image:Legacy_MultiSeasons-Covers.jpeg|]] &lt;/center&gt;

If the mutator is enabled either by the user or forcely activated by the map, then when the map loads it'll load one of the four textures in that part, depending on the system date (eg. at the time this document was written [12/12/2002], it would load the Charlotte Church CD Cover texture).

However, the mutator shouldn't be limited to just swapping textures, it could be used for swapping static meshes, ambience sounds, etc ...

==Interested Scripters ==

==Discussion ==

'''Kirin:''' Okay ... I put my idea on the table on the table ... what do you think? :)

'''EntropicLqd:''' The idea has a certain appeal.  You'd have to have the map built especially for it though - rather than driving it from a mutator.  In terms of swapping meshes in and out of the map I'm not sure you could do that as static meshes form part of the BSP tree.  You could create some decorations to do it though - and possibly re-skin existing static meshes dynamically.  I do like the idea of having lights appear on a Christmas tree for a couple of weeks either side of Christmas.

'''ZxAnPhOrIaN:''' Cool aspect... One problem, you may have to make a special map for the mutator, and what if i don't want to play the map with the mutator, will it be playable?? Also, there could be a map that is like RocketArena like a haunted house in Halloween, a stable in Christmas, fireworks park on July 4th, etc. in one map. (thinks about a [[Legacy:Map Ideas|Map Ideas]]!)

'''Kirin:''' That's what I was thinking ... like Chaos maps could only be played with the Chaos mutator. However, unlike making it a requirement, if the mutator is not loaded, there could be a default texture in place which is the name of the texture prefix (eg. In the example I used above, the name of the texture would have to be &quot;CDCover&quot;) ... of course, that could be up to the mapper if he/she wants to make the mutator a requirement for the map to run.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Semigib Onslaught</title>
    <id>1997</id>
    <revision>
      <id>4883</id>
      <timestamp>2004-05-18T13:35:35Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>Now with bot support!</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Semigib Onslaught}}

==Description ==

It bothers me that there is no instagib mode for Onslaught.  However, the reasons for disallowing an IG rifle are valid.  This mutator attempts to create a balanced instagib style game while conceding to the gametypes balance requirements.

Essentially this means that there is no true IG mode for Onslaught.  However it may be possible to get closer than it is already.  The following rules will apply.

* The link gun will be tweaked such that primary fire is an IG beam against people and a normal Shock Rifle against everything else.
* The link gun secondary fire will remain the same - both im terms of function and damage.
* The vehicle's weaponry will remain unchanged.
* All players will start with an Avril and some ammo.  Probably two - three rockets.

Given that standard IG rifles have infinite ammo I'm left with a choice.  Do I keep the ammo limitation on the IG element (link primary fire), or, do I give the players infinite ammo for all the weapons they are carrying.  Tis an interesting one.  At the moment I'm favouring ammo limitations.
 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''Enigmatic:''' If no one else has done anything with this, I will.  Starting a journal here: [[Legacy:Developer Journals/Enigmatic|Developer Journals/Enigmatic]]

'''Enigmatic:''' I may create a version 2 if the notion strikes me than toggles infinate ammo on.  Other than that, I think it's pretty solid

'''Enigmatic:''' OK, infinate ammo toggle &amp; bot support has been added.  I removed the above link since it's the outdated version.  Here's the new thing: http://enigmatic.shackspace.com/ut2k4/OnsInstagib.zip

==Discussion ==

'''EntropicLqd:''' Having played the demo even I have to admit that UT2004 is way better than UT2003.  Should I elect to buy the game I'll give this mod a crack.  Should take all of 30 minutes to create.</text>
    </revision>
    <revision>
      <id>4884</id>
      <timestamp>2004-02-16T14:12:12Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>created</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Semigib Onslaught}}

==Description ==

It bothers me that there is no instagib mode for Onslaught.  However, the reasons for disallowing an IG rifle are valid.  This mutator attempts to create a balanced instagib style game while conceding to the gametypes balance requirements.

Essentially this means that there is no true IG mode for Onslaught.  However it may be possible to get closer than it is already.  The following rules will apply.

* The link gun will be tweaked such that primary fire is an IG beam against people and a normal Shock Rifle against everything else.
* The link gun secondary fire will remain the same - both im terms of function and damage.
* The vehicle's weaponry will remain unchanged.
* All players will start with an Avril and some ammo.  Probably two - three rockets.

Given that standard IG rifles have infinite ammo I'm left with a choice.  Do I keep the ammo limitation on the IG element (link primary fire), or, do I give the players infinite ammo for all the weapons they are carrying.  Tis an interesting one.  At the moment I'm favouring ammo limitations.
 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:''' Having played the demo even I have to admit that UT2004 is way better than UT2003.  Should I elect to buy the game I'll give this mod a crack.  Should take all of 30 minutes to create.</text>
    </revision>
    <revision>
      <id>4885</id>
      <timestamp>2004-04-22T18:20:34Z</timestamp>
      <contributor>
        <ip>Enigmatic</ip>
      </contributor>
      <comment>Done!</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Semigib Onslaught}}

==Description ==

It bothers me that there is no instagib mode for Onslaught.  However, the reasons for disallowing an IG rifle are valid.  This mutator attempts to create a balanced instagib style game while conceding to the gametypes balance requirements.

Essentially this means that there is no true IG mode for Onslaught.  However it may be possible to get closer than it is already.  The following rules will apply.

* The link gun will be tweaked such that primary fire is an IG beam against people and a normal Shock Rifle against everything else.
* The link gun secondary fire will remain the same - both im terms of function and damage.
* The vehicle's weaponry will remain unchanged.
* All players will start with an Avril and some ammo.  Probably two - three rockets.

Given that standard IG rifles have infinite ammo I'm left with a choice.  Do I keep the ammo limitation on the IG element (link primary fire), or, do I give the players infinite ammo for all the weapons they are carrying.  Tis an interesting one.  At the moment I'm favouring ammo limitations.
 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''Enigmatic:''' If no one else has done anything with this, I will.  Starting a journal here: [[Legacy:Developer Journals/Enigmatic|Developer Journals/Enigmatic]]

'''Enigmatic:''' Download: http://www.fileshack.com/file.x?fid=4897

I may create a version 2 if the notion strikes me than toggles infinate ammo on.  Other than that, I think it's pretty solid

==Discussion ==

'''EntropicLqd:''' Having played the demo even I have to admit that UT2004 is way better than UT2003.  Should I elect to buy the game I'll give this mod a crack.  Should take all of 30 minutes to create.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Sentry Weapons</title>
    <id>1885</id>
    <revision>
      <id>4625</id>
      <timestamp>2007-08-13T14:23:09Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">==Description ==

A new exec function (bind) that deploys a little beacon. Several seconds after the beacon comes to rest on a surface it deploys a '''Sentry Weapon''' that would be a tripod with the weapon you had selected at tiem of deploying the beacon on top. it would then shoot at all of your enemies until it is destroyed.

==Features ==

; New Bind : A new bind that tosses a little beacon out infront of you, you deploys the Sentry Weapon after comign to rest.
; Weapon : The Weapon on the tripod would be the weapon you had selected when you tossed the beacon.
; AI : The Sentry Weapon would shoot at any of the deployer's enemies it sees (choosing one target at a time).
; Health : You can destroy a Sentry Weapon by shooting it with any weapon, just as you would harm an enemy pawn. By default a new Sentry Weaponwould have 50 health, and possibly have 2 other new binds for raising or lowering the next Sentry Weapon you deploy's health, in incriments of 25, but for each 25 health you give the Sentry Weapon, you loose 10 health (or shield if you have it) when you toss it.
; Hack? : Possibly an optional feature (on/off in config menu) to allow people to hack an enemy Sentry Weapon, turning it to their own team (or self in DM).
; Limits : To keep the game from becoming to insane and spammy, there could be limits implemented, like when you respawn you have # (number specified in mut config) Beacons that you can deploy. Plus, there could be other limits, like only # Sentry Weapons can be in the game at a time (once the limit is hit, nobody can use their beacons until an existing Sentry Weapon is destroyed), each team coudl have a limit of 2/3 of the game limit (or a unique number).
; Pickups : With the Beacon limit on respawn, people will want a way to get more beacons, im sure... so possibly when you die, if you have leftover beacons, they are scattered around your corpse as pickups for anybody to loot. These could also be used as respawnign pickups for mappers to use, to make a new mape more interesting.

==Notes ==

I ('''Blaaguuu''') may start coding on this in the near future... I wanted to post the idea here to see what you folks think of it, and mayeb get some good feedback and suggestions

==Comments ==

'''Mychaeel:''' Great idea.  Sounds like something that could be very useful in almost any sort of team game.

'''Tarquin:''' Yup!

'''MythOpus:''' LoL.  From ChaosUT no ?

'''Wormbo:''' Yup, Chaos UT has a &quot;turret launcher&quot; and AFAIK they are going to re-implement it in Chaos UT 2: Evolution.

'''MythOpus:''' Can you feel the love ? Ya, baby! :D

'''Blaaguuu:''' I have never played Chaos UT, so i have no idea how their sentry functioned... did it use the weapon you have selected, like this? Also, i have never tried coding anything quite like this... so anyone have suggestions on where to start? should i extend the actor class, or what? i waas thinkign maybe using a pawn for it... but i dunno if that woudl be best...

'''ZxAnPhOrIaN:''' Chaos UT is a 1337 mod with new weapons, powerups, etc. It even was included in the GOTY edition of UT!

'''dUc0N:''' Sounds good. Another couple ideas for you:
*''Make them sticky'' - Set it up where if you put it on the ground, it spawns a tripod-style weapon, but you could also shoot them onto ceilings and walls for a weapon that looks like it's meant to be there.
*''Limit ammo'' - I'd recommend setting an ammo limit per sentry. Maybe when a player destroys one it does no explosion damage, but if it shoots out all its ammo, then it explodes roughly the size of a standard rocket? shock combo? bigger?

'''Mr Evil:''' This isn't that far off what I did for the 'Sentinel' automatic cannons: http://www.cheese83.freeserve.co.uk/unreal/woe.htm

The Chaos UT2 team will be basing their turrets on this code too.

'''MythOpus:''' I was wondering if, you Mr Evil, or anyone else who has a working turret system can make a sort of tutorial on how to make a basic turret that fires on enemy players and such.  This shall be a great help to me, and anyone else who is trying to make their own turret...</text>
    </revision>
    <revision>
      <id>4626</id>
      <timestamp>2007-08-13T13:27:38Z</timestamp>
      <contributor>
        <ip>H-184-24.A189.cust.bahnhof.se</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

A new exec function (bind) that deploys a little beacon. Several seconds after the beacon comes to rest on a surface it deploys a '''Sentry Weapon''' that would be a tripod with the weapon you had selected at tiem of deploying the beacon on top. it would then shoot at all of your enemies until it is destroyed.

[http://www.bestessaytips.com essay tips]

==Features ==

; New Bind : A new bind that tosses a little beacon out infront of you, you deploys the Sentry Weapon after comign to rest.
; Weapon : The Weapon on the tripod would be the weapon you had selected when you tossed the beacon.
; AI : The Sentry Weapon would shoot at any of the deployer's enemies it sees (choosing one target at a time).
; Health : You can destroy a Sentry Weapon by shooting it with any weapon, just as you would harm an enemy pawn. By default a new Sentry Weaponwould have 50 health, and possibly have 2 other new binds for raising or lowering the next Sentry Weapon you deploy's health, in incriments of 25, but for each 25 health you give the Sentry Weapon, you loose 10 health (or shield if you have it) when you toss it.
; Hack? : Possibly an optional feature (on/off in config menu) to allow people to hack an enemy Sentry Weapon, turning it to their own team (or self in DM).
; Limits : To keep the game from becoming to insane and spammy, there could be limits implemented, like when you respawn you have # (number specified in mut config) Beacons that you can deploy. Plus, there could be other limits, like only # Sentry Weapons can be in the game at a time (once the limit is hit, nobody can use their beacons until an existing Sentry Weapon is destroyed), each team coudl have a limit of 2/3 of the game limit (or a unique number).
; Pickups : With the Beacon limit on respawn, people will want a way to get more beacons, im sure... so possibly when you die, if you have leftover beacons, they are scattered around your corpse as pickups for anybody to loot. These could also be used as respawnign pickups for mappers to use, to make a new mape more interesting.

==Notes ==

I ('''Blaaguuu''') may start coding on this in the near future... I wanted to post the idea here to see what you folks think of it, and mayeb get some good feedback and suggestions

==Comments ==

'''Mychaeel:''' Great idea.  Sounds like something that could be very useful in almost any sort of team game.

'''Tarquin:''' Yup!

'''MythOpus:''' LoL.  From ChaosUT no ?

'''Wormbo:''' Yup, Chaos UT has a &quot;turret launcher&quot; and AFAIK they are going to re-implement it in Chaos UT 2: Evolution.

'''MythOpus:''' Can you feel the love ? Ya, baby! :D

'''Blaaguuu:''' I have never played Chaos UT, so i have no idea how their sentry functioned... did it use the weapon you have selected, like this? Also, i have never tried coding anything quite like this... so anyone have suggestions on where to start? should i extend the actor class, or what? i waas thinkign maybe using a pawn for it... but i dunno if that woudl be best...

'''ZxAnPhOrIaN:''' Chaos UT is a 1337 mod with new weapons, powerups, etc. It even was included in the GOTY edition of UT!

'''dUc0N:''' Sounds good. Another couple ideas for you:
*''Make them sticky'' - Set it up where if you put it on the ground, it spawns a tripod-style weapon, but you could also shoot them onto ceilings and walls for a weapon that looks like it's meant to be there.
*''Limit ammo'' - I'd recommend setting an ammo limit per sentry. Maybe when a player destroys one it does no explosion damage, but if it shoots out all its ammo, then it explodes roughly the size of a standard rocket? shock combo? bigger?

'''Mr Evil:''' This isn't that far off what I did for the 'Sentinel' automatic cannons: http://www.cheese83.freeserve.co.uk/unreal/woe.htm

The Chaos UT2 team will be basing their turrets on this code too.

'''MythOpus:''' I was wondering if, you Mr Evil, or anyone else who has a working turret system can make a sort of tutorial on how to make a basic turret that fires on enemy players and such.  This shall be a great help to me, and anyone else who is trying to make their own turret...</text>
    </revision>
    <revision>
      <id>43327</id>
      <timestamp>2010-05-21T17:38:58Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <minor/>
      <text xml:space="preserve">==Description ==

A new exec function (bind) that deploys a little beacon. Several seconds after the beacon comes to rest on a surface it deploys a '''Sentry Weapon''' that would be a tripod with the weapon you had selected at tiem of deploying the beacon on top. it would then shoot at all of your enemies until it is destroyed.

==Features ==

; New Bind : A new bind that tosses a little beacon out infront of you, you deploys the Sentry Weapon after comign to rest.
; Weapon : The Weapon on the tripod would be the weapon you had selected when you tossed the beacon.
; AI : The Sentry Weapon would shoot at any of the deployer's enemies it sees (choosing one target at a time).
; Health : You can destroy a Sentry Weapon by shooting it with any weapon, just as you would harm an enemy pawn. By [http://www.bestessaytips.com essay tips] default a new Sentry Weaponwould have 50 health, and possibly have 2 other new binds for raising or lowering the next Sentry Weapon you deploy's health, in incriments of 25, but for each 25 health you give the Sentry Weapon, you loose 10 health (or shield if you have it) when you toss it.
; Hack? : Possibly an optional feature (on/off in config menu) to allow people to hack an enemy Sentry Weapon, turning it to their own team (or self in DM).
; Limits : To keep the game from becoming to insane and spammy, there could be limits implemented, like when you respawn you have # (number specified in mut config) Beacons that you can deploy. Plus, there could be other limits, like only # Sentry Weapons can be in the game at a time (once the limit is hit, nobody can use their beacons until an existing Sentry Weapon is destroyed), each team coudl have a limit of 2/3 of the game limit (or a unique number).
; Pickups : With the Beacon limit on respawn, people will want a way to get more beacons, im sure... so possibly when you die, if you have leftover beacons, they are scattered around your corpse as pickups for anybody to loot. These could also be used as respawnign pickups for mappers to use, to make a new mape more interesting.

==Notes ==

I ('''Blaaguuu''') may start coding on this in the near future... I wanted to post the idea here to see what you folks think of it, and mayeb get some good feedback and suggestions

==Comments ==

'''Mychaeel:''' Great idea.  Sounds like something that could be very useful in almost any sort of team game.

'''Tarquin:''' Yup!

'''MythOpus:''' LoL.  From ChaosUT no ?

'''Wormbo:''' Yup, Chaos UT has a &quot;turret launcher&quot; and AFAIK they are going to re-implement it in Chaos UT 2: Evolution.

'''MythOpus:''' Can you feel the love ? Ya, baby! :D

'''Blaaguuu:''' I have never played Chaos UT, so i have no idea how their sentry functioned... did it use the weapon you have selected, like this? Also, i have never tried coding anything quite like this... so anyone have suggestions on where to start? should i extend the actor class, or what? i waas thinkign maybe using a pawn for it... but i dunno if that woudl be best...

'''ZxAnPhOrIaN:''' Chaos UT is a 1337 mod with new weapons, powerups, etc. It even was included in the GOTY edition of UT!

'''dUc0N:''' Sounds good. Another couple ideas for you:
*''Make them sticky'' - Set it up where if you put it on the ground, it spawns a tripod-style weapon, but you could also shoot them onto ceilings and walls for a weapon that looks like it's meant to be there.
*''Limit ammo'' - I'd recommend setting an ammo limit per sentry. Maybe when a player destroys one it does no explosion damage, but if it shoots out all its ammo, then it explodes roughly the size of a standard rocket? shock combo? bigger?

'''Mr Evil:''' This isn't that far off what I did for the 'Sentinel' automatic cannons: http://www.cheese83.freeserve.co.uk/unreal/woe.htm

The Chaos UT2 team will be basing their turrets on this code too.

'''MythOpus:''' I was wondering if, you Mr Evil, or anyone else who has a working turret system can make a sort of tutorial on how to make a basic turret that fires on enemy players and such.  This shall be a great help to me, and anyone else who is trying to make their own turret...</text>
    </revision>
    <revision>
      <id>43339</id>
      <timestamp>2010-05-22T04:23:54Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:EntropicLqd|EntropicLqd]]</comment>
      <text xml:space="preserve">==Description ==

A new exec function (bind) that deploys a little beacon. Several seconds after the beacon comes to rest on a surface it deploys a '''Sentry Weapon''' that would be a tripod with the weapon you had selected at tiem of deploying the beacon on top. it would then shoot at all of your enemies until it is destroyed.

==Features ==

; New Bind : A new bind that tosses a little beacon out infront of you, you deploys the Sentry Weapon after comign to rest.
; Weapon : The Weapon on the tripod would be the weapon you had selected when you tossed the beacon.
; AI : The Sentry Weapon would shoot at any of the deployer's enemies it sees (choosing one target at a time).
; Health : You can destroy a Sentry Weapon by shooting it with any weapon, just as you would harm an enemy pawn. By default a new Sentry Weaponwould have 50 health, and possibly have 2 other new binds for raising or lowering the next Sentry Weapon you deploy's health, in incriments of 25, but for each 25 health you give the Sentry Weapon, you loose 10 health (or shield if you have it) when you toss it.
; Hack? : Possibly an optional feature (on/off in config menu) to allow people to hack an enemy Sentry Weapon, turning it to their own team (or self in DM).
; Limits : To keep the game from becoming to insane and spammy, there could be limits implemented, like when you respawn you have # (number specified in mut config) Beacons that you can deploy. Plus, there could be other limits, like only # Sentry Weapons can be in the game at a time (once the limit is hit, nobody can use their beacons until an existing Sentry Weapon is destroyed), each team coudl have a limit of 2/3 of the game limit (or a unique number).
; Pickups : With the Beacon limit on respawn, people will want a way to get more beacons, im sure... so possibly when you die, if you have leftover beacons, they are scattered around your corpse as pickups for anybody to loot. These could also be used as respawnign pickups for mappers to use, to make a new mape more interesting.

==Notes ==

I ('''Blaaguuu''') may start coding on this in the near future... I wanted to post the idea here to see what you folks think of it, and mayeb get some good feedback and suggestions

==Comments ==

'''Mychaeel:''' Great idea.  Sounds like something that could be very useful in almost any sort of team game.

'''Tarquin:''' Yup!

'''MythOpus:''' LoL.  From ChaosUT no ?

'''Wormbo:''' Yup, Chaos UT has a &quot;turret launcher&quot; and AFAIK they are going to re-implement it in Chaos UT 2: Evolution.

'''MythOpus:''' Can you feel the love ? Ya, baby! :D

'''Blaaguuu:''' I have never played Chaos UT, so i have no idea how their sentry functioned... did it use the weapon you have selected, like this? Also, i have never tried coding anything quite like this... so anyone have suggestions on where to start? should i extend the actor class, or what? i waas thinkign maybe using a pawn for it... but i dunno if that woudl be best...

'''ZxAnPhOrIaN:''' Chaos UT is a 1337 mod with new weapons, powerups, etc. It even was included in the GOTY edition of UT!

'''dUc0N:''' Sounds good. Another couple ideas for you:
*''Make them sticky'' - Set it up where if you put it on the ground, it spawns a tripod-style weapon, but you could also shoot them onto ceilings and walls for a weapon that looks like it's meant to be there.
*''Limit ammo'' - I'd recommend setting an ammo limit per sentry. Maybe when a player destroys one it does no explosion damage, but if it shoots out all its ammo, then it explodes roughly the size of a standard rocket? shock combo? bigger?

'''Mr Evil:''' This isn't that far off what I did for the 'Sentinel' automatic cannons: http://www.cheese83.freeserve.co.uk/unreal/woe.htm

The Chaos UT2 team will be basing their turrets on this code too.

'''MythOpus:''' I was wondering if, you Mr Evil, or anyone else who has a working turret system can make a sort of tutorial on how to make a basic turret that fires on enemy players and such.  This shall be a great help to me, and anyone else who is trying to make their own turret...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ShineMatch</title>
    <id>1938</id>
    <revision>
      <id>4746</id>
      <timestamp>2003-11-09T12:20:42Z</timestamp>
      <contributor>
        <ip>M629-mp1.cvx3-b.ltn.dial.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Shine Match=

===Description===

Oh great, i manages to do another long-read description :rolleyes:

(if you have the game, you can skim past the obvious points to paragraph 3 where all the UT2k3 version stuff comes in)

This mod would quite simply be a multiplayer version of Super Mario Sunshine, but with Juggernaughts, Robots and Anubians.  The idea is simple, each player has a powerfull multi-purpose backpack mounted water cannon, which, along with the usual spray forward, can do 3 other unique things:

* With the hover nozzle allows you to hover in the air for 3 seconds while shooting water downwatds
* The Boost nozzle forces you to run 5 times as fast while you hold down fire untill you run out of water
* The rocket nozzle charges, then launches you uber-high into the air

The aim of the game is simple, it is played out in eight rounds, and in each one you have one goal, collect a &quot;shine&quot; which scores you one point, and then the level resets, but with a different mission, so like the first mission could be getting to a hard to reach place, then the second one being a boss or something. The player with the most points after all eight rounds is the winner, then the server goes to the next map.

You can damage other players by jumping on them (obviously), and spraying them with the water cannon.  Collecting the yellow coins (found scattered around the level, have a line pattern on them, and dropped by dead enemies and players) restores 20 health, and gives you cash, so you can buy upgrades for the pump, which are stored in a file on your computer keeping your current coin total, upgrades, and lives (kind of like in an MMORPG). You can earn lives by finding 50 yellow coins, finding 10 blue coins (rare, and have a star pattern on them), getting 2 shines, or finding a mushroom (uber-rare).  If you run out of lives (dieing when you have none left), you lose half of your coins, and all your upgrades.

You can buy upgrades (such as napalm or acid tanks to replace water, but can be switched back with an assigned tank-switch button, or extra nozzle spaces for 200 coins a peice) in the buy menu in the 3 or so minuite wait at the begining of the round, or when you arent playing. Different nozzles can be found scattered around the level (in crates), and dont go away when you pick them up, so you can get the one you want even if someone reaches it before you.  The hover is in blue crates, speed is in grey crates, and rocket in red crates.

Water can be gotten in three ways:

A.) Firing while standing/swimming in a body of water

B.) Collecting water bottles

C.) Standing in/running through water jets

but acid or napalm would have to be bought pre-round, seeing as you wouldnt normally find bottles of acid or tanks of napalm just sitting around all the time (well, there may be acid/napalm/other ammo bottles lying around in maps where it fits in, but if you made a map for it, KEEP IT slightly REALISTIC).  I'm taking out yoshi oand the fruit and stuff, because it would probably be a bit hard to code.

There would also be AI enemies just milling around the level, waiting to kill/be killed.  Most are killed by water and jumping on them, others just by water, and other by jumping.  They are all weird, cartoony looking things that need to be wiped off the face of the earth. Doing so will earn you cash for the upgrades which you need to kill more enemies, players or bosses.  Some enemies can only be killed by special means, because they are too dangerous to approach or are not damaged by jumping on them or water.  Bosses would need a really good ass-kicking to beat, and it may be wise to team up with other players to beat a boss, before a mad fight over the shine.  Wen you kill another player, s/he drops 10 coins.

The translator from Unreal 1 could make a comeback, but in the form of reading signs or talking to people.  The use button would activate it, popping up the message.  This could be a useful way of finding hidden stuff, or getting free upgrades hidden in secret areas.

As well as extra tanks, you could buy/find water rockets and water balloons.  Water rockets, which if you havent mde one before, launch really fast from a high pressure inside it, forcing water out the back, these, upon contact with a player/enemy/surface, could burst causing splash damage (no pun intended) ovr a large area. The water ballons would be simmilar, but act more like grenades out of a grenade launcher.  Both would be launched by the pump, allowing variable levels of power to launch them with.

If i can think of anythin else, i will add it...

===Interested Coders===

===Map Ideas===

Go To: [[Legacy:Map Ideas|Map Ideas]]

===Discussion===

'''AlphaOne:''' I really like the idea of the multip purpose backpack. One thing though: (no offence)I think the actuall game would be a bit too childish (ie: cartoonish characters, jumping to kill someone). But I am not a mario fan, so you can understand. Anyways, it's not the content that makes it fun, but the gameplay! Good luck!

'''Foxpaw:''' If you were to store the player's equipment on the local harddrive it would be very easy for them to cheat and set arbitrary values. You would likely have to keep a list on the server of all players and their equipment.

'''inio:''' I like this idea, but I have a few issues:
# nobody's going to wait around 3 minutes for the match to start
# eight rounds will take a very long time to play
# storing anything on the local HD is asking to be hacked, and does the purchasing system really help the fun factor?
# still '''way''' to close to the copyrighted inspiration

So how do the following modifications sound:
* All players are going for all shines at the same time.
* player/team with the most points when the last shine is collected wins.
* collecting a shine gives you(r team) 10 points, collecting 50 coins gives you(r team) ~7 points, killing a player (on the other team) or enemy gives ''you'' 1 point (plus team points for &quot;boss&quot; enemies).
* divide the groups into two or more teams, shooting a member of your own team refills their tank.  shooting a member of the other team damages them.  teams are color-coded and shoot color-coded water.
* you start out with the cannon and hover nozzle, and can collect other nozzles which may only last a certain amount of time and are selected by the weapon select keys.  The specifics of the other nozzles would need to be changed for copyright reasons.  Some ideas: Sniper Jet (think super-high-powered-supersoaker), sprinkler (much wider range effect than standard nozzle, sorta like Flak normal fire but wider)
* take the lives stuff out entirely.
* &quot;shine&quot; would need to be changed, for copyright and/or trademark reasons.
* tank power-ups that work until the first time you refill your tank after collecting, such as: High Pressure (all weapons shoot twice as far and hover nozzle makes you gain significant altitude, tank also empties twice as fast).  Sticky Water (water sticks to surfaces and explodes with a small spray after a short period or when touched).  Muck (all nozzles shoot muck instead of water - players that come in contact with muck are slowed down, but the hover nozzle doesn't work as good with muck).
* no fixed number of shines in a map, but a HUD indicating how many there are and how many have been collected by each team.
* HUD that shows the direction to 3 shines randomly selected for each player by the server.  This way all shines are guaranteed to be collected on a reasonable time scale

And finally one idea that I'm not really sure of:
* Make players carry the shine they collected back to a team base.  This would be hard if you want to allow [i]n[/i] teams as mappers would have to construct enough bases.  Maybe something less significant like a team color coded teleporter thing that they need to run through.  Don't limit players to carrying only one shine though.  This would increase the tension and activity of the endgame significantly (especially if it's tied up between two teams), it would add more roles for players (shine drop defense &amp; opposing shine drop monitor/attacker), but it would make the first several shine captures take longer and thus slow down the beginning of games.

'''Icedude:''' Yeah, i like those ideas :) sounds like that'd make it better than the origional idea, but i dont really like the &quot;Carry the shines/whatevers to a base&quot; thing, makes it too close to CTF.  The muck idea is nice, could be improved by having water wash away muck, as well as diferent types of muck (fire muck, slippery muck, glow-in-the-dark electric muck, etc.) as well as having a different type of muck thats placed by the mapper that stays on the level untill it's washed away.

Those new nozzle ideas are good too, like the sniper one. That could slowly curve downwards, and do less damage the further away the target is. Maybe the rocket boost one combined with muck would make a muck cloud that you have to clear with water otherwise it hurts you?

And how about the mapper decides what the objectives are? like you could have fluffy animals in oe map, and machine parts in the next?</text>
    </revision>
    <revision>
      <id>4747</id>
      <timestamp>2003-08-24T21:30:48Z</timestamp>
      <contributor>
        <ip>Inio</ip>
      </contributor>
      <comment>some more ideas</comment>
      <text xml:space="preserve">=Shine Match=

===Description===

Oh great, i manages to do another long-read description :rolleyes:

(if you have the game, you can skim past the obvious points to paragraph 3 where all the UT2k3 version stuff comes in)

This mod would quite simply be a multiplayer version of Super Mario Sunshine, but with Juggernaughts, Robots and Anubians.  The idea is simple, each player has a powerfull multi-purpose backpack mounted water cannon, which, along with the usual spray forward, can do 3 other unique things:

* With the hover nozzle allows you to hover in the air for 3 seconds while shooting water downwatds
* The Boost nozzle forces you to run 5 times as fast while you hold down fire untill you run out of water
* The rocket nozzle charges, then launches you uber-high into the air

The aim of the game is simple, it is played out in eight rounds, and in each one you have one goal, collect a &quot;shine&quot; which scores you one point, and then the level resets, but with a different mission, so like the first mission could be getting to a hard to reach place, then the second one being a boss or something. The player with the most points after all eight rounds is the winner, then the server goes to the next map.

You can damage other players by jumping on them (obviously), and spraying them with the water cannon.  Collecting the yellow coins (found scattered around the level, have a line pattern on them, and dropped by dead enemies and players) restores 20 health, and gives you cash, so you can buy upgrades for the pump, which are stored in a file on your computer keeping your current coin total, upgrades, and lives (kind of like in an MMORPG). You can earn lives by finding 50 yellow coins, finding 10 blue coins (rare, and have a star pattern on them), getting 2 shines, or finding a mushroom (uber-rare).  If you run out of lives (dieing when you have none left), you lose half of your coins, and all your upgrades.

You can buy upgrades (such as napalm or acid tanks to replace water, but can be switched back with an assigned tank-switch button, or extra nozzle spaces for 200 coins a peice) in the buy menu in the 3 or so minuite wait at the begining of the round, or when you arent playing. Different nozzles can be found scattered around the level (in crates), and dont go away when you pick them up, so you can get the one you want even if someone reaches it before you.  The hover is in blue crates, speed is in grey crates, and rocket in red crates.

Water can be gotten in three ways:

A.) Firing while standing/swimming in a body of water

B.) Collecting water bottles

C.) Standing in/running through water jets

but acid or napalm would have to be bought pre-round, seeing as you wouldnt normally find bottles of acid or tanks of napalm just sitting around all the time (well, there may be acid/napalm/other ammo bottles lying around in maps where it fits in, but if you made a map for it, KEEP IT slightly REALISTIC).  I'm taking out yoshi oand the fruit and stuff, because it would probably be a bit hard to code.

There would also be AI enemies just milling around the level, waiting to kill/be killed.  Most are killed by water and jumping on them, others just by water, and other by jumping.  They are all weird, cartoony looking things that need to be wiped off the face of the earth. Doing so will earn you cash for the upgrades which you need to kill more enemies, players or bosses.  Some enemies can only be killed by special means, because they are too dangerous to approach or are not damaged by jumping on them or water.  Bosses would need a really good ass-kicking to beat, and it may be wise to team up with other players to beat a boss, before a mad fight over the shine.  Wen you kill another player, s/he drops 10 coins.

The translator from Unreal 1 could make a comeback, but in the form of reading signs or talking to people.  The use button would activate it, popping up the message.  This could be a useful way of finding hidden stuff, or getting free upgrades hidden in secret areas.

As well as extra tanks, you could buy/find water rockets and water balloons.  Water rockets, which if you havent mde one before, launch really fast from a high pressure inside it, forcing water out the back, these, upon contact with a player/enemy/surface, could burst causing splash damage (no pun intended) ovr a large area. The water ballons would be simmilar, but act more like grenades out of a grenade launcher.  Both would be launched by the pump, allowing variable levels of power to launch them with.

If i can think of anythin else, i will add it...

===Interested Coders===

===Map Ideas===

Go To: [[Legacy:Map Ideas|Map Ideas]]

===Discussion===

'''AlphaOne:''' I really like the idea of the multip purpose backpack. One thing though: (no offence)I think the actuall game would be a bit too childish (ie: cartoonish characters, jumping to kill someone). But I am not a mario fan, so you can understand. Anyways, it's not the content that makes it fun, but the gameplay! Good luck!

'''Foxpaw:''' If you were to store the player's equipment on the local harddrive it would be very easy for them to cheat and set arbitrary values. You would likely have to keep a list on the server of all players and their equipment.

'''inio:''' I like this idea, but I have a few issues:
# nobody's going to wait around 3 minutes for the match to start
# eight rounds will take a very long time to play
# storing anything on the local HD is asking to be hacked, and does the purchasing system really help the fun factor?
# still '''way''' to close to the copyrighted inspiration

So how do the following modifications sound:
* All players are going for all shines at the same time.
* player/team with the most points when the last shine is collected wins.
* collecting a shine gives you(r team) 10 points, collecting 50 coins gives you(r team) ~7 points, killing a player (on the other team) or enemy gives ''you'' 1 point (plus team points for &quot;boss&quot; enemies).
* divide the groups into two or more teams, shooting a member of your own team refills their tank.  shooting a member of the other team damages them.  teams are color-coded and shoot color-coded water.
* you start out with the cannon and hover nozzle, and can collect other nozzles which may only last a certain amount of time and are selected by the weapon select keys.  The specifics of the other nozzles would need to be changed for copyright reasons.  Some ideas: Sniper Jet (think super-high-powered-supersoaker), sprinkler (much wider range effect than standard nozzle, sorta like Flak normal fire but wider)
* take the lives stuff out entirely.
* &quot;shine&quot; would need to be changed, for copyright and/or trademark reasons.
* tank power-ups that work until the first time you refill your tank after collecting, such as: High Pressure (all weapons shoot twice as far and hover nozzle makes you gain significant altitude, tank also empties twice as fast).  Sticky Water (water sticks to surfaces and explodes with a small spray after a short period or when touched).  Muck (all nozzles shoot muck instead of water - players that come in contact with muck are slowed down, but the hover nozzle doesn't work as good with muck).
* no fixed number of shines in a map, but a HUD indicating how many there are and how many have been collected by each team.
* HUD that shows the direction to 3 shines randomly selected for each player by the server.  This way all shines are guaranteed to be collected on a reasonable time scale

And finally one idea that I'm not really sure of:
* Make players carry the shine they collected back to a team base.  This would be hard if you want to allow [i]n[/i] teams as mappers would have to construct enough bases.  Maybe something less significant like a team color coded teleporter thing that they need to run through.  Don't limit players to carrying only one shine though.  This would increase the tension and activity of the endgame significantly (especially if it's tied up between two teams), it would add more roles for players (shine drop defense &amp; opposing shine drop monitor/attacker), but it would make the first several shine captures take longer and thus slow down the beginning of games.</text>
    </revision>
    <revision>
      <id>4748</id>
      <timestamp>2003-11-09T12:15:36Z</timestamp>
      <contributor>
        <ip>M629-mp1.cvx3-b.ltn.dial.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Shine Match=

===Description===

Oh great, i manages to do another long-read description :rolleyes:

(if you have the game, you can skim past the obvious points to paragraph 3 where all the UT2k3 version stuff comes in)

This mod would quite simply be a multiplayer version of Super Mario Sunshine, but with Juggernaughts, Robots and Anubians.  The idea is simple, each player has a powerfull multi-purpose backpack mounted water cannon, which, along with the usual spray forward, can do 3 other unique things:

* With the hover nozzle allows you to hover in the air for 3 seconds while shooting water downwatds
* The Boost nozzle forces you to run 5 times as fast while you hold down fire untill you run out of water
* The rocket nozzle charges, then launches you uber-high into the air

The aim of the game is simple, it is played out in eight rounds, and in each one you have one goal, collect a &quot;shine&quot; which scores you one point, and then the level resets, but with a different mission, so like the first mission could be getting to a hard to reach place, then the second one being a boss or something. The player with the most points after all eight rounds is the winner, then the server goes to the next map.

You can damage other players by jumping on them (obviously), and spraying them with the water cannon.  Collecting the yellow coins (found scattered around the level, have a line pattern on them, and dropped by dead enemies and players) restores 20 health, and gives you cash, so you can buy upgrades for the pump, which are stored in a file on your computer keeping your current coin total, upgrades, and lives (kind of like in an MMORPG). You can earn lives by finding 50 yellow coins, finding 10 blue coins (rare, and have a star pattern on them), getting 2 shines, or finding a mushroom (uber-rare).  If you run out of lives (dieing when you have none left), you lose half of your coins, and all your upgrades.

You can buy upgrades (such as napalm or acid tanks to replace water, but can be switched back with an assigned tank-switch button, or extra nozzle spaces for 200 coins a peice) in the buy menu in the 3 or so minuite wait at the begining of the round, or when you arent playing. Different nozzles can be found scattered around the level (in crates), and dont go away when you pick them up, so you can get the one you want even if someone reaches it before you.  The hover is in blue crates, speed is in grey crates, and rocket in red crates.

Water can be gotten in three ways:

A.) Firing while standing/swimming in a body of water

B.) Collecting water bottles

C.) Standing in/running through water jets

but acid or napalm would have to be bought pre-round, seeing as you wouldnt normally find bottles of acid or tanks of napalm just sitting around all the time (well, there may be acid/napalm/other ammo bottles lying around in maps where it fits in, but if you made a map for it, KEEP IT slightly REALISTIC).  I'm taking out yoshi oand the fruit and stuff, because it would probably be a bit hard to code.

There would also be AI enemies just milling around the level, waiting to kill/be killed.  Most are killed by water and jumping on them, others just by water, and other by jumping.  They are all weird, cartoony looking things that need to be wiped off the face of the earth. Doing so will earn you cash for the upgrades which you need to kill more enemies, players or bosses.  Some enemies can only be killed by special means, because they are too dangerous to approach or are not damaged by jumping on them or water.  Bosses would need a really good ass-kicking to beat, and it may be wise to team up with other players to beat a boss, before a mad fight over the shine.  Wen you kill another player, s/he drops 10 coins.

The translator from Unreal 1 could make a comeback, but in the form of reading signs or talking to people.  The use button would activate it, popping up the message.  This could be a useful way of finding hidden stuff, or getting free upgrades hidden in secret areas.

As well as extra tanks, you could buy/find water rockets and water balloons.  Water rockets, which if you havent mde one before, launch really fast from a high pressure inside it, forcing water out the back, these, upon contact with a player/enemy/surface, could burst causing splash damage (no pun intended) ovr a large area. The water ballons would be simmilar, but act more like grenades out of a grenade launcher.  Both would be launched by the pump, allowing variable levels of power to launch them with.

If i can think of anythin else, i will add it...

===Interested Coders===

===Map Ideas===

Go To: [[Legacy:Map Ideas|Map Ideas]]

===Discussion===

'''AlphaOne:''' I really like the idea of the multip purpose backpack. One thing though: (no offence)I think the actuall game would be a bit too childish (ie: cartoonish characters, jumping to kill someone). But I am not a mario fan, so you can understand. Anyways, it's not the content that makes it fun, but the gameplay! Good luck!

'''Foxpaw:''' If you were to store the player's equipment on the local harddrive it would be very easy for them to cheat and set arbitrary values. You would likely have to keep a list on the server of all players and their equipment.

'''inio:''' I like this idea, but I have a few issues:
# nobody's going to wait around 3 minutes for the match to start
# eight rounds will take a very long time to play
# storing anything on the local HD is asking to be hacked, and does the purchasing system really help the fun factor?
# still '''way''' to close to the copyrighted inspiration

So how do the following modifications sound:
* All players are going for all shines at the same time.
* player/team with the most points when the last shine is collected wins.
* collecting a shine gives you(r team) 10 points, collecting 50 coins gives you(r team) ~7 points, killing a player (on the other team) or enemy gives ''you'' 1 point (plus team points for &quot;boss&quot; enemies).
* divide the groups into two or more teams, shooting a member of your own team refills their tank.  shooting a member of the other team damages them.  teams are color-coded and shoot color-coded water.
* you start out with the cannon and hover nozzle, and can collect other nozzles which may only last a certain amount of time and are selected by the weapon select keys.  The specifics of the other nozzles would need to be changed for copyright reasons.  Some ideas: Sniper Jet (think super-high-powered-supersoaker), sprinkler (much wider range effect than standard nozzle, sorta like Flak normal fire but wider)
* take the lives stuff out entirely.
* &quot;shine&quot; would need to be changed, for copyright and/or trademark reasons.
* tank power-ups that work until the first time you refill your tank after collecting, such as: High Pressure (all weapons shoot twice as far and hover nozzle makes you gain significant altitude, tank also empties twice as fast).  Sticky Water (water sticks to surfaces and explodes with a small spray after a short period or when touched).  Muck (all nozzles shoot muck instead of water - players that come in contact with muck are slowed down, but the hover nozzle doesn't work as good with muck).
* no fixed number of shines in a map, but a HUD indicating how many there are and how many have been collected by each team.
* HUD that shows the direction to 3 shines randomly selected for each player by the server.  This way all shines are guaranteed to be collected on a reasonable time scale

And finally one idea that I'm not really sure of:
* Make players carry the shine they collected back to a team base.  This would be hard if you want to allow [i]n[/i] teams as mappers would have to construct enough bases.  Maybe something less significant like a team color coded teleporter thing that they need to run through.  Don't limit players to carrying only one shine though.  This would increase the tension and activity of the endgame significantly (especially if it's tied up between two teams), it would add more roles for players (shine drop defense &amp; opposing shine drop monitor/attacker), but it would make the first several shine captures take longer and thus slow down the beginning of games.

'''Icedude:''' Yeah, i like those ideas :) sounds like that'd make it better than the origional idea, but i dont really like the &quot;Carry the shines/whatevers to a base&quot; thing, makes it too close to CTF.  The muck idea is nice, could be improved by having water wash away muck, as well as diferent types of muck (fire muck, slippery muck, glow-in-the-dark electric muck, etc.) as well as having a different type of muck thats placed by the mapper that stays on the level untill it's washed away.

Those new nozzle ideas are good too, like the sniper one. That could slowly curve downwards, and do less damage the further away the target is. Maybe the rocket boost one combined with muck would make a muck cloud that you have to clear with water otherwise it hurts you?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/ShockTower</title>
    <id>1892</id>
    <revision>
      <id>4641</id>
      <timestamp>2006-07-28T05:06:02Z</timestamp>
      <contributor>
        <ip>64.62.147.222</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Shock tower defense aka Neato DM Feature}}

==Description ==

This map component takes the form of a small pillar with a large glowing sphere (or some other suitable visual effect).  The pillar takes time to charge up.  When charged any enemy (in the case of a base defense) not on the same team as the pillar will get an electric shock (aka Lighting bolt) when they some within a specified radius of the pillar.  If multiple shock mode is on then all players (irrespective of team) within 1/2 radius of the player hit by the intial shock will also be shocked (forming a chain like effect) although they should receive less damage.  This &quot;chain shock&quot; effect is recursive so chain shocked players will shock other players within 1/4, or 1/8 etc of the current radius - even if the player has been chain shocked.  I must confess I described that really badly but hopefully you'll get the gist.

In DM mode the pillar should be placed into trigger mode, thereby allowing players to trigger the pillar's effect giving all the other people a shock (and hopefully picking up a few frags in the process).

The pillar should have at least the following customisable properties.
* Trigger
* Owning team
* Damage to players
* Recharge time
* Damage to destroy
* Time to repair after destruction (set to 0 to never repair)
* Chain shock mode
* Damage Radius

(The idea is based on the Tessla Coil from C&amp;C Red Alert if you hadn't already figured that out)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  Might need to kill the chain shock idea - I can see it using up a fair chunk of processing power if not handled correctly.

'''EntropicLqd:'''  It may also be worth being able to set the component up so that it's triggered (or area of effect) lie within a specified volume on the map.

'''EntropicLqd:''' Having played Onslaught, this might make a nice point defense for a power-node.  The tower would &quot;attack&quot; whichever team didn't own the power-node.  Alternatively place inside the base.  The lower the power within the power-core the less damage it does.

'''MythOpus:''' This would probably be relatively easy to do.  I might consider coding something like this for my mod and then share the code with the public?

'''Legal:''' Are you sure you mean Tesla coil? The linked mode is Prism tower... anyway, I could make a mesh for this if needed, just let me know.

'''EntropicLqd:''' I based the idea on the Tesla coil as I hadn't played C&amp;C Generals at that point in time.  The &quot;multiple shock mode&quot; is slightly different to the prism towers in that it uses it's targets to link to and the towers don't &quot;combine attacks&quot;.  Maybe they should :).  Thanks for the offer of a mesh.  I might just take you up on that.

'''Legal:''' So what you want is something looking like a Tesla Coil, rather than a Prism Tower? I'll pull something together... ;)

'''Foxpaw:''' Obelisk of light! That one looks neat.

'''Darkwarrior:''' I remember something from ONP...  In one of the maps there is a tesla coil that shock you if you get too close to it. Maybe you could take a look at the source code of it?

'''Missilemaster:''' I made something pretty much like that for UT99, and [http://ut.levels4you.com/downloads.l4y?cat=73&amp;review=14784 here] it is...though you'll need to register (for free) at that site to download it. It has all of those features and a few others, but it doesn't respawn.</text>
    </revision>
    <revision>
      <id>4642</id>
      <timestamp>2004-03-22T05:55:15Z</timestamp>
      <contributor>
        <ip>203-96-105-54.dialup.xtra.co.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Shock tower defense aka Neato DM Feature}}

==Description ==

This map component takes the form of a small pillar with a large glowing sphere (or some other suitable visual effect).  The pillar takes time to charge up.  When charged any enemy (in the case of a base defense) not on the same team as the pillar will get an electric shock (aka Lighting bolt) when they some within a specified radius of the pillar.  If multiple shock mode is on then all players (irrespective of team) within 1/2 radius of the player hit by the intial shock will also be shocked (forming a chain like effect) although they should receive less damage.  This &quot;chain shock&quot; effect is recursive so chain shocked players will shock other players within 1/4, or 1/8 etc of the current radius - even if the player has been chain shocked.  I must confess I described that really badly but hopefully you'll get the gist.

In DM mode the pillar should be placed into trigger mode, thereby allowing players to trigger the pillar's effect giving all the other people a shock (and hopefully picking up a few frags in the process).

The pillar should have at least the following customisable properties.
* Trigger
* Owning team
* Damage to players
* Recharge time
* Damage to destroy
* Time to repair after destruction (set to 0 to never repair)
* Chain shock mode
* Damage Radius

(The idea is based on the Tessla Coil from C&amp;C Red Alert if you hadn't already figured that out)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  Might need to kill the chain shock idea - I can see it using up a fair chunk of processing power if not handled correctly.

'''EntropicLqd:'''  It may also be worth being able to set the component up so that it's triggered (or area of effect) lie within a specified volume on the map.

'''EntropicLqd:''' Having played Onslaught, this might make a nice point defense for a power-node.  The tower would &quot;attack&quot; whichever team didn't own the power-node.  Alternatively place inside the base.  The lower the power within the power-core the less damage it does.

'''MythOpus:''' This would probably be relatively easy to do.  I might consider coding something like this for my mod and then share the code with the public?

'''Legal:''' Are you sure you mean Tesla coil? The linked mode is Prism tower... anyway, I could make a mesh for this if needed, just let me know.

'''EntropicLqd:''' I based the idea on the Tesla coil as I hadn't played C&amp;C Generals at that point in time.  The &quot;multiple shock mode&quot; is slightly different to the prism towers in that it uses it's targets to link to and the towers don't &quot;combine attacks&quot;.  Maybe they should :).  Thanks for the offer of a mesh.  I might just take you up on that.

'''Legal:''' So what you want is something looking like a Tesla Coil, rather than a Prism Tower? I'll pull something together... ;)

'''Foxpaw:''' Obelisk of light! That one looks neat.

'''Darkwarrior:''' I remember something from ONP...  In one of the maps there is a tesla coil that shock you if you get too close to it. Maybe you could take a look at the source code of it?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/SkinRelay</title>
    <id>1889</id>
    <revision>
      <id>4635</id>
      <timestamp>2005-03-16T12:42:12Z</timestamp>
      <contributor>
        <ip>80.168.208.70</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Motivation===

I learned how to skin characters last night.  It's very easy - see [[Legacy:Skinning|Skinning]]. Now I learn that it's unlikely that anyone else will get to see my character.  The problem is that the skin is local to my machine.  Other players can only see skins they have on their machines.  The documentation out there suggests you send your skin to your buddies so they can see you.  This doesn't really work in the world of broadband and global gaming, where you just show up to any server you can find and join in.  The result is that the cool skins are hosted on the web and server admins might download them ... or they might not.

Why can't the players in a game download one another's skins through the game server?  It seems that the answer to this is that it would be a significant download burden (someone out there said a typical skin with its model and textures would be about 12Mb, I've not verified this).  

Individual skins for individual players are thus limited to clans who have a friendly serveradmin.  This mod idea seeks to remedy this situation, so anyone with UPaint (that's everyone!) can put their face on their character and all the people they play with can see it.

http://www.sweavo.34sp.com/images/me-ut2004-1.jpg

----

===Log Book===

====2005-03-15 Initial Notes====

Let's assume we're going broadband, so we are making the decision not to accommodate dialuppers.  If it works for them great, if not, tough.  I'm thinking:

* On connect, handshake with the server to see whether the server knows your skin
* If not, sent a compressed version of it to the server
* The ''download'' of the skin takes place ''during gameplay'' - the clients see the fallback skin until the download is completed
* the ''upload'' of the skin takes place before gameplay - to encourage people to use efficiently-transmittable skins.

Outstanding questions are many:

* What does a server show if a player has a skin that doesn't exist on the server?
* Can I send arbitrary data across the net during gameplay?
* Can I send arbitrary data across the net during level load?
* Is this replication?
* What measures are necessary to stop skin-based server cracking?
** client must declare size
** server cancels transfer if oversize
** after successful upload, server checks class of upload.  (is this possible?  If it's a subclass can't it do anything it likes?!)

Future refinements would be cool:

* Since the textures are .png (or derived from png) is it possible to have them download progressively?

Possible fallbacks:

* If there are risks involved in uploading an entire character, how about just uploading headskins?  For this
** can you reassign head texture during server run?
** bandwidth required is less
** less potential for modeling tricks by cheaters or crackers

----

====2005-03-16 ====

I've been thinking more about the head skins idea and think this could be a goer - it's sketchy, since my knowledge of scripting is sketchy:

* Only head textures are transferred, thus the user must base their head on the mesh of a stock skin (or any skin on the server, though they lose portability that way).
* The skin has an assigned fallback, e.g. Brock in my case.
* The server subclasses all the skins that are in use and overrides the head texture with a scriptedtexture.
* Initially, the server draws the default head texture onto the scriptedtexture
* On connect, the server checks against the player's unrealid and if not found asks the client whether there is a face to be uploaded
* If yes, then the client uploads the texture while downloading the level
* In game, on the client, checkreplacement() looks to see whether the new face has downloaded.  If so, it writes it to the scriptedtexture, replacing the stock face

----

===Some exercises/experiments===

* Subclass playerpawn (? is it playerpawn) and cover its head with a scriptedtexture.

----

===resources:===

http://unreal.epicgames.com/UT2003/tutorials/push/

[[Legacy:Skinning|Skinning]]</text>
    </revision>
    <revision>
      <id>4636</id>
      <timestamp>2005-03-16T12:39:19Z</timestamp>
      <contributor>
        <ip>80.168.208.70</ip>
      </contributor>
      <comment>transferred from my personal wiki</comment>
      <text xml:space="preserve">===Motivation===

I learned how to skin characters last night.  It's very easy - see [[Legacy:Skinning|Skinning]]. Now I learn that it's unlikely that anyone else will get to see my character.  The problem is that the skin is local to my machine.  Other players can only see skins they have on their machines.  The documentation out there suggests you send your skin to your buddies so they can see you.  This doesn't really work in the world of broadband and global gaming, where you just show up to any server you can find and join in.  The result is that the cool skins are hosted on the web and server admins might download them ... or they might not.

Why can't the players in a game download one another's skins through the game server?  It seems that the answer to this is that it would be a significant download burden (someone out there said a typical skin with its model and textures would be about 12Mb, I've not verified this).  

Individual skins for individual players are thus limited to clans who have a friendly serveradmin.  This mod idea seeks to remedy this situation, so anyone with UPaint (that's everyone!) can put their face on their character and all the people they play with can see it.

http://www.sweavo.34sp.com/images/me-ut2004-1.jpg

----

===Log Book===

====2005-03-15 Initial Notes====

Let's assume we're going broadband, so we are making the decision not to accommodate dialuppers.  If it works for them great, if not, tough.  I'm thinking:

* On connect, handshake with the server to see whether the server knows your skin
* If not, sent a compressed version of it to the server
* The ''download'' of the skin takes place ''during gameplay'' - the clients see the fallback skin until the download is completed
* the ''upload'' of the skin takes place before gameplay - to encourage people to use efficiently-transmittable skins.

Outstanding questions are many:

* What does a server show if a player has a skin that doesn't exist on the server?
* Can I send arbitrary data across the net during gameplay?
* Can I send arbitrary data across the net during level load?
* Is this replication?
* What measures are necessary to stop skin-based server cracking?
** client must declare size
** server cancels transfer if oversize
** after successful upload, server checks class of upload.  (is this possible?  If it's a subclass can't it do anything it likes?!)

Future refinements would be cool:

* Since the textures are .png (or derived from png) is it possible to have them download progressively?

Possible fallbacks:

* If there are risks involved in uploading an entire character, how about just uploading headskins?  For this
** can you reassign head texture during server run?
** bandwidth required is less
** less potential for modeling tricks by cheaters or crackers

----

====2005-03-16 ====

I've been thinking more about the head skins idea and think this could be a goer - it's sketchy, since my knowledge of scripting is sketchy:

* Only head textures are transferred, thus the user must base their head on the mesh of a stock skin (or any skin on the server, though they lose portability that way).
* The skin has an assigned fallback, e.g. Brock in my case.
* The server subclasses all the skins that are in use and overrides the head texture with a scriptedtexture.
* Initially, the server draws the default head texture onto the scriptedtexture
* On connect, the server checks against the player's unrealid and if not found asks the client whether there is a face to be uploaded
* If yes, then the client uploads the texture while downloading the level
* In game, on the client, checkreplacement() looks to see whether the new face has downloaded.  If so, it writes it to the scriptedtexture, replacing the stock face

----

===Some exercises/experiments===

* Subclass playerpawn (? is it playerpawn) and cover its head with a scriptedtexture.

----

===resources:===

http://unreal.epicgames.com/UT2003/tutorials/push/</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Smoke Bomb</title>
    <id>1903</id>
    <revision>
      <id>4666</id>
      <timestamp>2006-01-26T23:27:38Z</timestamp>
      <contributor>
        <ip>Brig-cache-5.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Smoke Bombs (making escape easier)}}

==Description ==

This mod simply adds a new weapon to the already formidable UT arsenal.  Essentially the player gains the ability to drop smoke bombs to conceal the direction they are running in.

When a smoke bomb is fired a reasonably large cloud of smoke is generated instantly at the players position.  The cloud of smoke hangs around for about 5 seconds (maybe 10).

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  I guess the only real issue with this idea is that it could easily become a real frame-rate killer.

'''ZxAnPhOrIaN:''' Probably, but the smoke bomb might want to detect how fast the computer is, and then disperse as much smoke as the computer can handle.

'''Swifty:''' Only problem with that is that people with lower specs (or even just lower settings if you based it off that) may well be able to see through the smoke, defeating the point of it. It's like the ability to turn foliage off; It's all very well hiding in the long grass on a map until it turns out that someone's got foliage off and laughs at you just crouching there. Never liked that -.-</text>
    </revision>
    <revision>
      <id>4667</id>
      <timestamp>2002-08-21T13:26:02Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Smoke Bombs (making escape easier)}}

==Description ==

This mod simply adds a new weapon to the already formidable UT arsenal.  Essentially the player gains the ability to drop smoke bombs to conceal the direction they are running in.

When a smoke bomb is fired a reasonably large cloud of smoke is generated instantly at the players position.  The cloud of smoke hangs around for about 5 seconds (maybe 10).

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  I guess the only real issue with this idea is that it could easily become a real frame-rate killer.

'''ZxAnPhOrIaN:''' Probably, but the smoke bomb might want to detect how fast the computer is, and then disperse as much smoke as the computer can handle.</text>
    </revision>
    <revision>
      <id>4668</id>
      <timestamp>2006-01-26T23:27:24Z</timestamp>
      <contributor>
        <ip>Brig-cache-5.server.ntli.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Smoke Bombs (making escape easier)}}

==Description ==

This mod simply adds a new weapon to the already formidable UT arsenal.  Essentially the player gains the ability to drop smoke bombs to conceal the direction they are running in.

When a smoke bomb is fired a reasonably large cloud of smoke is generated instantly at the players position.  The cloud of smoke hangs around for about 5 seconds (maybe 10).

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  I guess the only real issue with this idea is that it could easily become a real frame-rate killer.

'''ZxAnPhOrIaN:''' Probably, but the smoke bomb might want to detect how fast the computer is, and then disperse as much smoke as the computer can handle.

'''Swifty:''' Only problem with that is that people with lower specs (or even jut lower settings if you based it off that) may well be able to see through the smoke, defeating the point of it. It's like the ability to turn foliage off; It's all very well hiding in the long grass on a map until it turns out that someone's got foliage off and laughs at you just crouching there. Never liked that -.-</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Sorcery</title>
    <id>1940</id>
    <revision>
      <id>4751</id>
      <timestamp>2003-04-24T21:09:20Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT2003 &amp;ndash; Sorcery}}

==Description ==

From my obsession with fantasy books and roleplaying comes the desire to ditch all the weapons and replace them with spells. This could probably be done with weapons alongside magic, but I'd like to leave that to one side for now. Adrenaline probably isn't much use in this unless some new combos can be implemented, because all the adrenaline stuff is really magic anyway.

===The Spells===

Basically implemented as new weapons, probably with a common ancestor class derived from a suitable Weapon base class (at risk of reimplementing projectile launching code). All spells would draw from the same mana pool, although differing amounts for each one of course. Mana pool implementation could be as simple as a new ammo type, connected to part of the mutator which replenishes it over time, and probably mana boost pickups as well. So far I'd definitely like to implement at least the following spells:
; Fireball : a nice classic one, which will hopefully end up looking so good people stand still to watch it coming for them
; Lightning bolt : probably not the same effect as the lightning gun, although no doubt it'll start out that way
; Chaser : attaches itself to a target and hunts them down (within limits), then explodes
; Heal : takes away some mana, gives you back some health
; Shield : short-term protection from offensive spells
; Lift : floats you upwards until your mana runs out. Primary fire - lift up. Secondary fire - slow your descent
; Drain : steals target's mana, gives you health
; Invisibility : like the adrenaline combo
; Teleport : reimplementation of the translocator as a spell, probably with a different targeting system (eventually at least)

Eventually, however, some more offensive spells will probably prove necessary to keep some variety going. Might be worth thinking about things which are less like conventional weapons - point and click 'make the ground here ignite' type spells perhaps - with suitable adjustment to make sure they're not too unfair on the people nearby that spot of course. It would also be fun to see about telekinetic manipulation of other players - push, pull, maybe even lifting or throwing. Could be fun in CTF-Face3 anyway :-) Obviously players would need a way to avoid or counter such spells being used to just throw them randomly off the edge.

==Interested Scripters ==

If you're interested in developing this mod for UT2003 please add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:Eldhrin|Eldhrin]] &amp;ndash; Have now started, see [[Legacy:Eldhrin/Developer Journal|Eldhrin/Developer Journal]]

==Comments ==

Anything to say? I don't care if everyone hates the idea as I'm going to do it anyway, but suggestions for improvement are always great.

[[Legacy:Vajuras|Vajuras]]: Personally just a straight magic mod doesn't get me too excited anymore. If this idea was integrated with that [[Legacy:Mod Ideas/Soul Devourer|Mod Ideas/Soul Devourer]] idea, it would get me excited :)</text>
    </revision>
    <revision>
      <id>4752</id>
      <timestamp>2002-12-23T20:44:45Z</timestamp>
      <contributor>
        <ip>Eldhrin</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT2003 &amp;ndash; Sorcery}}

==Description ==

From my obsession with fantasy books and roleplaying comes the desire to ditch all the weapons and replace them with spells. This could probably be done with weapons alongside magic, but I'd like to leave that to one side for now. Adrenaline probably isn't much use in this unless some new combos can be implemented, because all the adrenaline stuff is really magic anyway.

===The Spells===

Basically implemented as new weapons, probably with a common ancestor class derived from a suitable Weapon base class (at risk of reimplementing projectile launching code). All spells would draw from the same mana pool, although differing amounts for each one of course. Mana pool implementation could be as simple as a new ammo type, connected to part of the mutator which replenishes it over time, and probably mana boost pickups as well. So far I'd definitely like to implement at least the following spells:
; Fireball : a nice classic one, which will hopefully end up looking so good people stand still to watch it coming for them
; Lightning bolt : probably not the same effect as the lightning gun, although no doubt it'll start out that way
; Chaser : attaches itself to a target and hunts them down (within limits), then explodes
; Heal : takes away some mana, gives you back some health
; Shield : short-term protection from offensive spells
; Lift : floats you upwards until your mana runs out. Primary fire - lift up. Secondary fire - slow your descent
; Drain : steals target's mana, gives you health
; Invisibility : like the adrenaline combo
; Teleport : reimplementation of the translocator as a spell, probably with a different targeting system (eventually at least)

Eventually, however, some more offensive spells will probably prove necessary to keep some variety going. Might be worth thinking about things which are less like conventional weapons - point and click 'make the ground here ignite' type spells perhaps - with suitable adjustment to make sure they're not too unfair on the people nearby that spot of course. It would also be fun to see about telekinetic manipulation of other players - push, pull, maybe even lifting or throwing. Could be fun in CTF-Face3 anyway :-) Obviously players would need a way to avoid or counter such spells being used to just throw them randomly off the edge.

==Interested Scripters ==

If you're interested in developing this mod for UT2003 please add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:Eldhrin|Eldhrin]] &amp;ndash; Have now started, see [[Legacy:Eldhrin/Developer Journal|Eldhrin/Developer Journal]]

==Comments ==

Anything to say? I don't care if everyone hates the idea as I'm going to do it anyway, but suggestions for improvement are always great.</text>
    </revision>
    <revision>
      <id>4753</id>
      <timestamp>2003-04-24T21:08:33Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT2003 &amp;ndash; Sorcery}}

==Description ==

From my obsession with fantasy books and roleplaying comes the desire to ditch all the weapons and replace them with spells. This could probably be done with weapons alongside magic, but I'd like to leave that to one side for now. Adrenaline probably isn't much use in this unless some new combos can be implemented, because all the adrenaline stuff is really magic anyway.

===The Spells===

Basically implemented as new weapons, probably with a common ancestor class derived from a suitable Weapon base class (at risk of reimplementing projectile launching code). All spells would draw from the same mana pool, although differing amounts for each one of course. Mana pool implementation could be as simple as a new ammo type, connected to part of the mutator which replenishes it over time, and probably mana boost pickups as well. So far I'd definitely like to implement at least the following spells:
; Fireball : a nice classic one, which will hopefully end up looking so good people stand still to watch it coming for them
; Lightning bolt : probably not the same effect as the lightning gun, although no doubt it'll start out that way
; Chaser : attaches itself to a target and hunts them down (within limits), then explodes
; Heal : takes away some mana, gives you back some health
; Shield : short-term protection from offensive spells
; Lift : floats you upwards until your mana runs out. Primary fire - lift up. Secondary fire - slow your descent
; Drain : steals target's mana, gives you health
; Invisibility : like the adrenaline combo
; Teleport : reimplementation of the translocator as a spell, probably with a different targeting system (eventually at least)

Eventually, however, some more offensive spells will probably prove necessary to keep some variety going. Might be worth thinking about things which are less like conventional weapons - point and click 'make the ground here ignite' type spells perhaps - with suitable adjustment to make sure they're not too unfair on the people nearby that spot of course. It would also be fun to see about telekinetic manipulation of other players - push, pull, maybe even lifting or throwing. Could be fun in CTF-Face3 anyway :-) Obviously players would need a way to avoid or counter such spells being used to just throw them randomly off the edge.

==Interested Scripters ==

If you're interested in developing this mod for UT2003 please add your name to the list. Once you start development you should indicate that below (and hopefully include a link to a journal page). Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:Eldhrin|Eldhrin]] &amp;ndash; Have now started, see [[Legacy:Eldhrin/Developer Journal|Eldhrin/Developer Journal]]

==Comments ==

Anything to say? I don't care if everyone hates the idea as I'm going to do it anyway, but suggestions for improvement are always great.

'''Vajuras:''' Personally just a straight magic mod doesn't get me too excited anymore. If this idea was integrated with that [Mod Ideas/Soul Devourer] idea, it would get me excited :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Soul Devourer</title>
    <id>1920</id>
    <revision>
      <id>4705</id>
      <timestamp>2006-08-29T02:59:13Z</timestamp>
      <contributor>
        <ip>Solid Snake4</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Soul Devourer &amp;ndash; }}

==Description ==

by Novacane

1 Player is chosen to be the demon. To keep it simple, in the first version of the mod, he could just be a powered up player with extra speed, double damage, regenerating shields and such, and with some kind of glow to identify him, or make him really fat. In a more advanced version, he could be a choice of different demons, like a large and poweful monster that fires lightning bolts that send players flying, or a creature akin to the alien in aliens vs predator.

Either way, it's him versus the rest of the players. His powers should be scaled to the number of opponents. The way a typical game would start is that each side is assigned the same number of soul gems. The number of gems can vary, but let's say 3 for this instance. 3 would go to the demon, and 3 would be given to random players. The demon must try to kill the players who have the gems and collect them.  If demon collects all of the gems from the players then he has won.  The players must protect the gems (and the players carrying them) and try to kill the demon. The players have the ability to pass their soul gems to other players who are not carrying one. Each gem that the demon has is a life. If the demon is killed, he respawns and loses one gem (if the gem were to just fall off the demon, a game like this could go on for 2 years). Once the demon has no more soul gems, the opposing players win.

Once a game ends, a new player is chosen to be the demon. It wouldn't be random, but instead would favor those who joined the game the earliest. When a player is chosen, he is given the option to pass if he does not wish to be the demon. If he does not pass, he chooses his form (in the later version of the mod). The mod should be able to accept new demon forms created by other players so that the programmer doesn't have to make them all. 

I'm not sure how to score the game. I think it should simply have a winning team and no points, as they are quite pointless in this style game. 

The whole point of this mod is to create an intense and scary experience, and the flavor of fear is determined by the kind of demon. One that is like the alien in aliens vs predator gives the players a sense of tension and paranoia as it can climb walls, move quickly, and pounce from out of dark corners. A larger demon that fires lightning bolts that send you flying into the air and slamming into walls is a more intense experience. Large numbers of players battle him at the same time, firing away while bodies soar through the air and bounce off walls. Or how bout this... a wraith that moves rather slow, but has a very powerful close range attack with a large blade or claws, and has an inivisible translocator (with the camera in the translocator) that allows it to disappear and pop up behind people. Imagine how much fun you could have as that kind of demon. The possibilities are endless really. A giant scorpion, a mechwarrior, Slimer from Ghostbusters, a 6 foot tall hovering human head that spews sticky vomit that slows you down so he can bite you in half, Michael Jackson, Jason Vorhees, whatever scares ya.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

Solid_Snake4: I'm real keen on this one. I've only just started scripting and I'm a complete noob, but I'm learning pretty quickly, and a friend and I have started some concept art on some demon classes. Sorry, I havn't got a development journal yet.

==Discussion ==

'''EntropicLqd:'''  I took the liberty of placing it in the standard format I've adopted for these things - hope you don't mind.  I also correct a spelling mistake and made a few sentance tweaks.  It's a nice idea.  I'd be inclined to set the number of gems to the number of people playing - and then give half of the gems to the player team, and half of the gems to the demon.  I would also like an option to determine the winning team as the first &quot;team&quot; to collect all of the gems.  Even though it might take a while .. it would be good fun.  I suspect that the map would determine the type of demon chose - there's no point in being a predator type demon if you are on a map with so much &quot;stuff&quot; around the walls that you can't make use of them.  I would also be inclined to provide a couple of types of &quot;demon&quot; or &quot;special abilities&quot; with the first version of the mod rather than a simple powered up player.  I am complete agreement that the &quot;scores&quot; could be removed - as you say, they are irellevant.  Also, it may be worth selecting the demon based upon the most &quot;efficient&quot; player - or perhaps the one that damanged the demon the most.  Failing that .. make it random.  If you want to be realy evil about it, allow players to vote on who should be the demon.  One of the hardest things about this mod is going to be balancing the demon's strength/life with the number of players.  Unless you have re-charging &quot;powers&quot; for the demon - in which case you can reduce the number of &quot;power units&quot; the demon has.  It's a cool idea.

'''Novacane:''' Thanks for the input! Sorry if my format was messed up, I'm new to this web page. I've never seen a webpage like this, where anyone can just modify the entire layout at will. Most people try to find ways to &lt;i&gt;prevent&lt;/i&gt; hacking! 

Anyway, having an option to have to collect all the gems to win would certainly be acceptable, as long as there is a choice to go either way. I like a game that lasts, but a time limit would probably be necessary. I get a bit irritated after half an hour on the same map. Whoever has the most gems at the end of the map wins, if it's tied, just go into overtime until someone gets one. I'm not sure that the map should determine the demon, though. If this mod were to end up the way I envision it, there would be a variety of demons to choose from to suit whatever style the player likes, although you're probably right about the one example of the alien type demon (I'm guessing that's what you meant by predator), and that careful consideration would have to be paid to what kind of problems different map types might cause. Perhaps instead of having the map choose the demon, make certain demons prohibited on certain maps. Balancing would definitely be the tricky part, but in this type of game it doesn't have to be too precise, as there are no individual scores. You just want to be sure that the demon isn't a wimp, or that it isn't so powerful that the players don't have a fighting chance. I'm still a bit uncertain as to how the next demon should be chosen. I would hate for it to always go to the best player because then so many people would be left out. To me, it really seems like the poorer players would have more fun as the demon as it finally gives them a chance to wreak havoc and fear on other players! Voting wouldn't be a bad idea then, because if you want to win the game, chances are you'll pick the guy you think you can beat. 

As for the development of the mod, unfortunately I have no experience in this area. I've done some level design for the first UT, and did my own music for a map too, but I don't know the first thing about scripting. I would be willing to learn, but this might not be the best idea for a first project. I have another, simpler idea, which I think I'll post as well... UT DODGEBALL! But how hard is the actual scripting compare to, say, Lingo? Really, I think this project is best left for a more experienced programmer. I'd rather do some level design and perhaps model the demons. I would need to learn a bit on how to import models and animation, but that's probably a lot easier than learning the programming.

'''EntropicLqd:'''  My apologies for not explaining myself well.  I wasn't suggesting that certain types of demon were outlawed on some maps but not others, or that the type of demon be tied to the map.  I simply meant that some maps will be easier for some types of demon than others - you are right to give players the choice of demon (and I did mean alien rather than predator).  In terms of a voting system for players to choose who gets to play the demon, it would be a good idea to track the last few players that got voted in to prevent one person from being the demon all of the time.  Is a tricky one that.  Maybe just make it random in the first instance.
: I've never used Lingo so I don't know how it compares to UnrealScript &amp;ndash; think more in terms of Java and C++.  But yes, this mod is probably a little ambitious for a first project.  The Wiki does have some form of hack protection built into it - it stores all previous versions of a page.  When one gets blatted it's easy to simply restore an earlier version.  There's a page about it on the Wiki someplace [[Legacy:Wiki Protection|Wiki Protection]]</text>
    </revision>
    <revision>
      <id>4706</id>
      <timestamp>2006-08-28T00:13:38Z</timestamp>
      <contributor>
        <ip>Prx5.tnz.myschools.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Soul Devourer &amp;ndash; }}

==Description ==

by Novacane

1 Player is chosen to be the demon. To keep it simple, in the first version of the mod, he could just be a powered up player with extra speed, double damage, regenerating shields and such, and with some kind of glow to identify him, or make him really fat. In a more advanced version, he could be a choice of different demons, like a large and poweful monster that fires lightning bolts that send players flying, or a creature akin to the alien in aliens vs predator.

Either way, it's him versus the rest of the players. His powers should be scaled to the number of opponents. The way a typical game would start is that each side is assigned the same number of soul gems. The number of gems can vary, but let's say 3 for this instance. 3 would go to the demon, and 3 would be given to random players. The demon must try to kill the players who have the gems and collect them.  If demon collects all of the gems from the players then he has won.  The players must protect the gems (and the players carrying them) and try to kill the demon. The players have the ability to pass their soul gems to other players who are not carrying one. Each gem that the demon has is a life. If the demon is killed, he respawns and loses one gem (if the gem were to just fall off the demon, a game like this could go on for 2 years). Once the demon has no more soul gems, the opposing players win.

Once a game ends, a new player is chosen to be the demon. It wouldn't be random, but instead would favor those who joined the game the earliest. When a player is chosen, he is given the option to pass if he does not wish to be the demon. If he does not pass, he chooses his form (in the later version of the mod). The mod should be able to accept new demon forms created by other players so that the programmer doesn't have to make them all. 

I'm not sure how to score the game. I think it should simply have a winning team and no points, as they are quite pointless in this style game. 

The whole point of this mod is to create an intense and scary experience, and the flavor of fear is determined by the kind of demon. One that is like the alien in aliens vs predator gives the players a sense of tension and paranoia as it can climb walls, move quickly, and pounce from out of dark corners. A larger demon that fires lightning bolts that send you flying into the air and slamming into walls is a more intense experience. Large numbers of players battle him at the same time, firing away while bodies soar through the air and bounce off walls. Or how bout this... a wraith that moves rather slow, but has a very powerful close range attack with a large blade or claws, and has an inivisible translocator (with the camera in the translocator) that allows it to disappear and pop up behind people. Imagine how much fun you could have as that kind of demon. The possibilities are endless really. A giant scorpion, a mechwarrior, Slimer from Ghostbusters, a 6 foot tall hovering human head that spews sticky vomit that slows you down so he can bite you in half, Michael Jackson, Jason Vorhees, whatever scares ya.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

Solid_Snake4

==Discussion ==

'''EntropicLqd:'''  I took the liberty of placing it in the standard format I've adopted for these things - hope you don't mind.  I also correct a spelling mistake and made a few sentance tweaks.  It's a nice idea.  I'd be inclined to set the number of gems to the number of people playing - and then give half of the gems to the player team, and half of the gems to the demon.  I would also like an option to determine the winning team as the first &quot;team&quot; to collect all of the gems.  Even though it might take a while .. it would be good fun.  I suspect that the map would determine the type of demon chose - there's no point in being a predator type demon if you are on a map with so much &quot;stuff&quot; around the walls that you can't make use of them.  I would also be inclined to provide a couple of types of &quot;demon&quot; or &quot;special abilities&quot; with the first version of the mod rather than a simple powered up player.  I am complete agreement that the &quot;scores&quot; could be removed - as you say, they are irellevant.  Also, it may be worth selecting the demon based upon the most &quot;efficient&quot; player - or perhaps the one that damanged the demon the most.  Failing that .. make it random.  If you want to be realy evil about it, allow players to vote on who should be the demon.  One of the hardest things about this mod is going to be balancing the demon's strength/life with the number of players.  Unless you have re-charging &quot;powers&quot; for the demon - in which case you can reduce the number of &quot;power units&quot; the demon has.  It's a cool idea.

'''Novacane:''' Thanks for the input! Sorry if my format was messed up, I'm new to this web page. I've never seen a webpage like this, where anyone can just modify the entire layout at will. Most people try to find ways to &lt;i&gt;prevent&lt;/i&gt; hacking! 

Anyway, having an option to have to collect all the gems to win would certainly be acceptable, as long as there is a choice to go either way. I like a game that lasts, but a time limit would probably be necessary. I get a bit irritated after half an hour on the same map. Whoever has the most gems at the end of the map wins, if it's tied, just go into overtime until someone gets one. I'm not sure that the map should determine the demon, though. If this mod were to end up the way I envision it, there would be a variety of demons to choose from to suit whatever style the player likes, although you're probably right about the one example of the alien type demon (I'm guessing that's what you meant by predator), and that careful consideration would have to be paid to what kind of problems different map types might cause. Perhaps instead of having the map choose the demon, make certain demons prohibited on certain maps. Balancing would definitely be the tricky part, but in this type of game it doesn't have to be too precise, as there are no individual scores. You just want to be sure that the demon isn't a wimp, or that it isn't so powerful that the players don't have a fighting chance. I'm still a bit uncertain as to how the next demon should be chosen. I would hate for it to always go to the best player because then so many people would be left out. To me, it really seems like the poorer players would have more fun as the demon as it finally gives them a chance to wreak havoc and fear on other players! Voting wouldn't be a bad idea then, because if you want to win the game, chances are you'll pick the guy you think you can beat. 

As for the development of the mod, unfortunately I have no experience in this area. I've done some level design for the first UT, and did my own music for a map too, but I don't know the first thing about scripting. I would be willing to learn, but this might not be the best idea for a first project. I have another, simpler idea, which I think I'll post as well... UT DODGEBALL! But how hard is the actual scripting compare to, say, Lingo? Really, I think this project is best left for a more experienced programmer. I'd rather do some level design and perhaps model the demons. I would need to learn a bit on how to import models and animation, but that's probably a lot easier than learning the programming.

'''EntropicLqd:'''  My apologies for not explaining myself well.  I wasn't suggesting that certain types of demon were outlawed on some maps but not others, or that the type of demon be tied to the map.  I simply meant that some maps will be easier for some types of demon than others - you are right to give players the choice of demon (and I did mean alien rather than predator).  In terms of a voting system for players to choose who gets to play the demon, it would be a good idea to track the last few players that got voted in to prevent one person from being the demon all of the time.  Is a tricky one that.  Maybe just make it random in the first instance.
: I've never used Lingo so I don't know how it compares to UnrealScript &amp;ndash; think more in terms of Java and C++.  But yes, this mod is probably a little ambitious for a first project.  The Wiki does have some form of hack protection built into it - it stores all previous versions of a page.  When one gets blatted it's easy to simply restore an earlier version.  There's a page about it on the Wiki someplace [[Legacy:Wiki Protection|Wiki Protection]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Space Fighter Mod</title>
    <id>1864</id>
    <revision>
      <id>4577</id>
      <timestamp>2003-06-13T22:50:28Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It is the year 2319, and the Galaxy is on the brink of civil war...

Stellar Conflict is a total conversion mod for UT2003.  Players choose to ally themselves with one of two factions; the developed and desperate Humans, or the industrial and resource rich Terrans.

Gameplay will focus on team combat utilizing various space-based missions.  Players will choose and pilot various zero-grav fighters and compete in interstellar combat.  Each fighter will be unique, with various weapons systems and handling capabilities.  Fighters will be able to be flown in any direction, including strafing left/right and up/down.  The objective will be simple: engage and destroy the enemy force; whether they have battle fleets, space stations, or space-cities.

Players will have the option of boarding enemy battleships and stations and fight in small-arms combat while their wingmates are fighting in space.  Teamwork will be vital if the enemy forces are to be destroyed.

Please stop by our temporary website http://members.lycos.co.uk/stellarconflict/ to keep up-to-date on Stellar Conflict.

We are hard at work making models, maps, and code for this mod, however we still need some help.  Want to help out or join the team?  Read the website for more position info.  We have a few positions left....

-coder-

-modeler-

-2d/skinner-

please no mappers at this time!

Feel free to leave your feedback (good or bad)

-Stellar Conflict Team-

http://members.lycos.co.uk/stellarconflict/

'''Mosquito''': I had and idea like this too, but it was more Battleship based, most combat would be handled by the Starships, and the fighters where just support, the Ships crew would be maintance team, Captian (pilot the ship), Tactical officer (controls turrets and weapon systems) and Ship systems officer, (incharge of power grid, Shields, life support)

And the battles would be just disabling the other ship, either destroy it, or get them to surrender (making them floating pieces of metal)

I all ready have ship designs and stuff, email me at tom@pcraptor.net if your are interested.

'''HarvesterUT:''' I am interested in your ideas, and possibly your help...but i am really keen on the idea of having starfighters be the

main focus of the game.  the game will have large battleships and stuff, but they wont be able to be piloted or anything.  players can

only control weapons systems on the battleships and board enemy ships to capture them.  the main is goal is just to blast the hell outta

the other guys and destroy their ships.

'''RegularX:''' Definately a good idea at foot here, and I wouldn't underestimate the combination of vessels/people - done right you could have a powerful combination of Tribes and TF2.

'''Mosquito:''' arg, but the main forcus of my TC is based mostly around the starships... maybe we could do both...

'''RegularX:''' I'd flush out both sides of the idea, determine what is the most doable.  There seems to be open questions for both sides.  Like having boarding, but starfighters being the main focus, or having a class which only controls shields/repairs (interesting but insansely complicated technically).  Seems like it's the same start (space, ships) and end (ships blow up), it's just the stuff in the middle.

'''HarvesterUT:''' Well there are 2 other people currently helping me (both coders) and we all agree that the game should focus on the

individual starfighters and not controlling large battleships.  First, we dont think the idea is as good b/c the game is meant to be VERY

fast-paced and have an arcade feel to it.  Second, we dont know how the engine would handle so many large meshes zooming around.  It's just

not feasable to have EACH player control a hugh ship.  and the class idea of having just repair guys isnt the best IMHO.  Nobody wants

to join a game and be stuck playing the mechanic.  Like in Deathball, most people dont like being the goal-keeper.  why?  cuz they miss

all the action and get blamed when their team loses.  Everyone wants to be a hero, and everyone wants to pilot a fast, futuristic space

fighter.  we shouldnt make the game too complex by making &quot;mechanic classes&quot; and such.  If the idea is going to be expanded, it should

come at a later date after a beta has been released and the public gives us feedback.  Start simple, simple goals, see if they work,

then expand upon a good, solid idea.  So is there anyone who wants to help out?  We could really use some texture artists and skinners.

And maybe one modeler, too.  Send me an email or post here.

'''Mosquito:''' you guys still working on it? I'll help... ONLY if the fighters have a REALISTIC flight model!

'''Foxpaw:''' I don't think that's very feasable. I considered making a realistic flight model for the ships in my mod.. then realized that atmospheric aircraft already go quite quickly - futuristic space fighters would likely be pushing in excess of several thousand meters per second, and combat would be at ranges beyond human eyesight. For my mod I decided a more sci-fi space combat style was more appropriate. :P</text>
    </revision>
    <revision>
      <id>4578</id>
      <timestamp>2003-06-13T22:25:24Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">It is the year 2319, and the Galaxy is on the brink of civil war...

Stellar Conflict is a total conversion mod for UT2003.  Players choose to ally themselves with one of two factions; the developed and desperate Humans, or the industrial and resource rich Terrans.

Gameplay will focus on team combat utilizing various space-based missions.  Players will choose and pilot various zero-grav fighters and compete in interstellar combat.  Each fighter will be unique, with various weapons systems and handling capabilities.  Fighters will be able to be flown in any direction, including strafing left/right and up/down.  The objective will be simple: engage and destroy the enemy force; whether they have battle fleets, space stations, or space-cities.

Players will have the option of boarding enemy battleships and stations and fight in small-arms combat while their wingmates are fighting in space.  Teamwork will be vital if the enemy forces are to be destroyed.

Please stop by our temporary website http://members.lycos.co.uk/stellarconflict/ to keep up-to-date on Stellar Conflict.

We are hard at work making models, maps, and code for this mod, however we still need some help.  Want to help out or join the team?  Read the website for more position info.  We have a few positions left....

-coder-

-modeler-

-2d/skinner-

please no mappers at this time!

Feel free to leave your feedback (good or bad)

-Stellar Conflict Team-

http://members.lycos.co.uk/stellarconflict/

'''Mosquito''': I had and idea like this too, but it was more Battleship based, most combat would be handled by the Starships, and the fighters where just support, the Ships crew would be maintance team, Captian (pilot the ship), Tactical officer (controls turrets and weapon systems) and Ship systems officer, (incharge of power grid, Shields, life support)

And the battles would be just disabling the other ship, either destroy it, or get them to surrender (making them floating pieces of metal)

I all ready have ship designs and stuff, email me at tom@pcraptor.net if your are interested.

'''HarvesterUT:''' I am interested in your ideas, and possibly your help...but i am really keen on the idea of having starfighters be the

main focus of the game.  the game will have large battleships and stuff, but they wont be able to be piloted or anything.  players can

only control weapons systems on the battleships and board enemy ships to capture them.  the main is goal is just to blast the hell outta

the other guys and destroy their ships.

'''RegularX:''' Definately a good idea at foot here, and I wouldn't underestimate the combination of vessels/people - done right you could have a powerful combination of Tribes and TF2.

'''Mosquito:''' arg, but the main forcus of my TC is based mostly around the starships... maybe we could do both...

'''RegularX:''' I'd flush out both sides of the idea, determine what is the most doable.  There seems to be open questions for both sides.  Like having boarding, but starfighters being the main focus, or having a class which only controls shields/repairs (interesting but insansely complicated technically).  Seems like it's the same start (space, ships) and end (ships blow up), it's just the stuff in the middle.

'''HarvesterUT:''' Well there are 2 other people currently helping me (both coders) and we all agree that the game should focus on the

individual starfighters and not controlling large battleships.  First, we dont think the idea is as good b/c the game is meant to be VERY

fast-paced and have an arcade feel to it.  Second, we dont know how the engine would handle so many large meshes zooming around.  It's just

not feasable to have EACH player control a hugh ship.  and the class idea of having just repair guys isnt the best IMHO.  Nobody wants

to join a game and be stuck playing the mechanic.  Like in Deathball, most people dont like being the goal-keeper.  why?  cuz they miss

all the action and get blamed when their team loses.  Everyone wants to be a hero, and everyone wants to pilot a fast, futuristic space

fighter.  we shouldnt make the game too complex by making &quot;mechanic classes&quot; and such.  If the idea is going to be expanded, it should

come at a later date after a beta has been released and the public gives us feedback.  Start simple, simple goals, see if they work,

then expand upon a good, solid idea.  So is there anyone who wants to help out?  We could really use some texture artists and skinners.

And maybe one modeler, too.  Send me an email or post here.

'''Mosquito:''' you guys still working on it? I'll help... ONLY if the fighters have a REALISTIC flight model!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Spam Weapons</title>
    <id>1905</id>
    <revision>
      <id>4671</id>
      <timestamp>2005-01-14T03:28:24Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Spam Weapons}}

==Description ==

All weapons are replaced with a spammer's weapons of choice like the Ripper, the UT Flak Cannon (with its ever bouncing shapnel) and others.

And here is the problem: All those weapons can be dangerous to their owner. And another problem: You can't really stop firing. You have to fire at least once every three seconds or your weapon will fire on its own. To make things worse suicides will cause you to loose 10 points &amp;rarr; not very desirable in a death match.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''Wormbo:''' This I think this one will be my first real weapon mod for UT2k3, but I'm not sure yet.

==Discussion ==

'''EntropicLqd:''' Awesome idea.  It still makes me laugh whenever I look at it.

'''Wormbo:''' I sometimes get crazy or stupid ideas when I have to do boring stuff, and here you can see one of them. :)

'''smattbac:''' He he, sounds like it could be fun. I might be interested in making this, just for fun. :)

'''Kuhal:''' Unlimited ammo of course?  Otherwise it's a bit limiting.  Is it meant to me some sort of punishment for people who like ripper and flak cos if anything it will only make them rub their hands with delight....

Name=Spaminator and have that spam, spam, spam monty python chant(?) instead of monster kill or something :) -Githianki

'''Wormbo:''' Actually I was only thinking of new weapons, and the new class structure in UT2k3 makes it difficult to change messages.

'''ZxAnPhOrIaN:''' GREAT idea, lets make a spam weapon called the null weapon, that shoots ominous projectiles that dont do any harm but slow people down and decrease stability in primary fire. in secondary fire, there should be faint damage flak particles!

'''Githianki:''' I meant call the mod Spaminator.  And didn't you hear? ;) In the new patch you can have custom voicepacks for the Announcer.  That is what I meant, not a text message spamming the chat channel.  That would not be funny, no sir.</text>
    </revision>
    <revision>
      <id>4672</id>
      <timestamp>2005-01-13T23:32:40Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Spelling</title>
    <id>1880</id>
    <revision>
      <id>4612</id>
      <timestamp>2002-07-30T06:07:20Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Letters and Spelling}}

==Description ==

A mod for my 2 and 3 year old daughters - so that I don't have to keep saying &quot;no&quot; everytime they ask to play Half-Life or Jedi Knight 2 (particularly the 3 year old).

The whole mod is based around a single level.  The level itself has doors, ramps, jumps, etc etc but nothing that will actually kill the player or get them completely stuck.

In the center of the level are three slots for &quot;letter objects&quot;.  Above the slots is a big screen.  A Picture of an object is displayed on the screen (of say a dog).  The player has to navigate around the level and collect the right letters for the objects name (in this case d, o, and g) and place them in the central slots in the correct order.  Only one letter can be carried at a time.

It occurs to me that since my kids currently can't acutally recognise many letters that I probably ought to have a game mode where a ''voice'' simply asks for a letter.  They then have to find the letter being asked for, collect it and deposit it at a central point (maybe to get a Tweenies sample or something).

Letters are picked up automatically when they are walked over.  If the letter touched is not needed then they'll be told the name of the letter they just touched and then told that they don't need that one.

Letters are dropped when the correct slot for them is touched.  Letters can also be dropped at the press of the left mouse button.

The level structures for the mod need to be small, quite open and simple but yet look engaging.  There should be no tricky jumps or lifts as these things could confuse the target audience.  Slopes and steps are fine, as are doors.  The levels should also be fairly well lit and bright.  No sinister scary shadows here.  There should be no way the player can damage themselves in any way (by falling for example).

Letters should be spawned randomly around the map and will move every 60 seconds.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; I wouldn't mind a crack at this one - it'll keep my daughter happy in a non-violent way.

==Discussion ==

'''EntropicLqd:''' The actual implementation needs a little more thought but the basic idea seems to be sound.  It's also a cunning way of upgrading my &quot;other&quot; computer with the wife's blessing, &quot;It's educational dear&quot; :).

'''Tarquin:'''  That sounds like a cool idea. I'm afraid I can't resist the comedy idea that springs to mind (it's the polish ancestry, we can't resist a joke. that's my excuse anyway. what's the Polish definition of a 7-course meal? 6-pack of beer and a potato.) FPS aimed at kids could be a great new area of games: ''Sesame Street presents: Big Bird says &quot;die, bitch&quot;'' ... kidding :D

'''EntropicLqd:'''  lol.</text>
    </revision>
    <revision>
      <id>4613</id>
      <timestamp>2002-07-02T08:46:34Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Big Bird</comment>
      <text xml:space="preserve">==Spelling ==

A mod for my 2 and 3 year old daughters - so that I don't have to keep saying &quot;no&quot; everytime they ask to play Half-Life or Jedi Knight 2 (particularly the 3 year old).

The whole mod is based around a single level.  The level itself has doors, ramps, jumps, etc etc but nothing that will actually kill the player or get them completely stuck.

In the center of the level are three slots for &quot;letter objects&quot;.  Above the slots is a big screen.  A Picture of an object is displayed on the screen (of say a dog).  The player has to navigate around the level and collect the right letters for the objects name (in this case D, O, and G) and place them in the central slots in the correct order.  Only one letter can be carried at a time.

'''EntropicLqd:''' The actual implementation needs a little more thought but the basic idea seems to be sound.  It's also a cunning way of upgrading my &quot;other&quot; computer with the wife's blessing, &quot;It's educational dear&quot; :).  The player interaction with the letter objects needs consideration.  I'm currently thinking about having the left mouse button to pick the letter up, and the right mouse button to drop it, but they may be too complex.  Might need just one button to &quot;drop&quot; the letter.

'''Tarquin:'''  That sounds like a cool idea. I'm afraid I can't resist the comedy idea that springs to mind (it's the polish ancestry, we can't resist a joke. that's my excuse anyway. what's the Polish definition of a 7-course meal? 6-pack of beer and a potato.) FPS aimed at kids could be a great new area of games: ''Sesame Street presents: Big Bird says &quot;die, bitch&quot;'' ... kidding :D</text>
    </revision>
    <revision>
      <id>4614</id>
      <timestamp>2002-07-02T18:03:20Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Qukck update</comment>
      <text xml:space="preserve">==Spelling ==

A mod for my 2 and 3 year old daughters - so that I don't have to keep saying &quot;no&quot; everytime they ask to play Half-Life or Jedi Knight 2 (particularly the 3 year old).

The whole mod is based around a single level.  The level itself has doors, ramps, jumps, etc etc but nothing that will actually kill the player or get them completely stuck.

In the center of the level are three slots for &quot;letter objects&quot;.  Above the slots is a big screen.  A Picture of an object is displayed on the screen (of say a dog).  The player has to navigate around the level and collect the right letters for the objects name (in this case D, O, and G) and place them in the central slots in the correct order.  Only one letter can be carried at a time.

It occurs to me that since my kids currently can't acutally recognise many letters that I probably ought to have a game mode where a ''voice'' simply asks for a letter.  They then have to find the letter being asked for, collect it and deposit it at a central point (maybe to get a Tweenies sample or something).

Letters are picked up automatically when they are walked over.  If the letter touched is not needed then they'll be told the name of the letter they just touched and then told that they don't need that one.

Letters are dropped when the correct slot for them is touched.  Letters can also be dropped at the press of the left mouse button.

'''EntropicLqd:''' The actual implementation needs a little more thought but the basic idea seems to be sound.  It's also a cunning way of upgrading my &quot;other&quot; computer with the wife's blessing, &quot;It's educational dear&quot; :).

'''Tarquin:'''  That sounds like a cool idea. I'm afraid I can't resist the comedy idea that springs to mind (it's the polish ancestry, we can't resist a joke. that's my excuse anyway. what's the Polish definition of a 7-course meal? 6-pack of beer and a potato.) FPS aimed at kids could be a great new area of games: ''Sesame Street presents: Big Bird says &quot;die, bitch&quot;'' ... kidding :D

'''EntropicLqd:'''  lol.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/SpiderHack</title>
    <id>1932</id>
    <revision>
      <id>4732</id>
      <timestamp>2006-04-19T20:46:17Z</timestamp>
      <contributor>
        <ip>Defx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">=Spiderhack=

==Description==

Modification of the Spider Mines to stick to enemy vehicles and do &quot;something&quot; to them and self destroy after some time or until a player shoots it

&quot;something&quot; could mean
*making it go berserk
*giving an AI to it and act like a bot (from the spider owner team)
*activating a self destruct sequence

==Interested Scripters==</text>
    </revision>
    <revision>
      <id>4733</id>
      <timestamp>2006-01-08T14:31:22Z</timestamp>
      <contributor>
        <ip>Defx</ip>
      </contributor>
      <comment>added interested scripters subsection</comment>
      <text xml:space="preserve">=Spiderhack=

==Description==

Modification of the Spider Mines to stick to enemy vehicles and do &quot;something&quot; to them and self destroy after some time or until a player shoots it

&quot;something&quot; could mean
*making it go berserk
*giving an AI to it and act like a bot (from the spider owner team)
*activating a self destruct sequence

==Interested Scripters==</text>
    </revision>
    <revision>
      <id>4734</id>
      <timestamp>2006-01-13T14:10:20Z</timestamp>
      <contributor>
        <ip>201-34-189-241.bnut3703.dsl.brasiltelecom.net.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Spiderhack=

==Description==

Modification of the Spider Mines to stick to enemy vehicles and do &quot;something&quot; to them and self destroy after some time or until a player shoots it

&quot;something&quot; could mean
*making it go berserk
*giving an AI to it and act like a bot (from the spider owner team)
*activating a self destruct sequence

==Interested Scripters==

Myself - [[Legacy:Defx|Defx]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Spiderman Gun</title>
    <id>1911</id>
    <revision>
      <id>4683</id>
      <timestamp>2003-09-04T21:47:38Z</timestamp>
      <contributor>
        <ip>Host2.barrie.org</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Spiderman Gun &amp;ndash; Become spidey himself!

==Description==

The pickup mesh for this gun would be a spider, but the 3rd and 1st person views woild just be hands.  The weapon would allow the player to walk up walls and across ceilings.  Fire and Alt fire would shoot grapling hooks themed to look like webs, and they stay active untill the button is released, alowing you to swing across ceilings, and swing through long tal areas (like a city street for example)

----

====Interested Scripters ====

----

==Discussion==

'''DJPaul:'''  You mean a grappling hook.

'''TheRenegadeMaster:'''  I think he meant its a grappling hook when its fired, but the player can still walk up walls and across ceilings if he holding the weapon. I like the idea, would be cool.

'''Sett:''' Akimbo grapping hooks. Left and right hand. When the 2nd one makes contact the 1st lets go.

'''Rico:''' Worms-style grappling hook, yeah. So you can fire, and in mid air fire again, traversing the ceiling... :)

'''AlphaOne:''' I don't get the views part &amp;rarr; how can 3RD person view just be hands?

'''Iceman:''' I always wanted to do something like this.. Akimbo grapple hooks where you hold down primary to shoot the left hand, and secondary to shoot the right. When the button is let go the ropes are released. If the physics were done properly, I think you could get some interesting effects from being able to have both ropes active at the same time.

'''Random Guest:''' AlphaOne, simply assign a 3rd person weapon mesh a completly invisible (transparent) texture and you won't see it. Same goes for anything.</text>
    </revision>
    <revision>
      <id>4684</id>
      <timestamp>2002-10-20T23:36:59Z</timestamp>
      <contributor>
        <ip>Tor-58-26b-209197170014.3web.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Spiderman Gun &amp;ndash; Become spidey himself!

==Description==

The pickup mesh for this gun would be a spider, but the 3rd and 1st person views woild just be hands.  The weapon would allow the player to walk up walls and across ceilings.  Fire and Alt fire would shoot grapling hooks themed to look like webs, and they stay active untill the button is released, alowing you to swing across ceilings, and swing through long tal areas (like a city street for example)

----

====Interested Scripters ====

----

==Discussion==

'''DJPaul:'''  You mean a grappling hook.

'''TheRenegadeMaster:'''  I think he meant its a grappling hook when its fired, but the player can still walk up walls and across ceilings if he holding the weapon. I like the idea, would be cool.

'''Sett:''' Akimbo grapping hooks. Left and right hand. When the 2nd one makes contact the 1st lets go.

'''Rico:''' Worms-style grappling hook, yeah. So you can fire, and in mid air fire again, traversing the ceiling... :)

'''AlphaOne:''' I don't get the views part &amp;rarr; how can 3RD person view just be hands?</text>
    </revision>
    <revision>
      <id>4685</id>
      <timestamp>2003-04-18T15:03:12Z</timestamp>
      <contributor>
        <ip>Iceman</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Spiderman Gun &amp;ndash; Become spidey himself!

==Description==

The pickup mesh for this gun would be a spider, but the 3rd and 1st person views woild just be hands.  The weapon would allow the player to walk up walls and across ceilings.  Fire and Alt fire would shoot grapling hooks themed to look like webs, and they stay active untill the button is released, alowing you to swing across ceilings, and swing through long tal areas (like a city street for example)

----

====Interested Scripters ====

----

==Discussion==

'''DJPaul:'''  You mean a grappling hook.

'''TheRenegadeMaster:'''  I think he meant its a grappling hook when its fired, but the player can still walk up walls and across ceilings if he holding the weapon. I like the idea, would be cool.

'''Sett:''' Akimbo grapping hooks. Left and right hand. When the 2nd one makes contact the 1st lets go.

'''Rico:''' Worms-style grappling hook, yeah. So you can fire, and in mid air fire again, traversing the ceiling... :)

'''AlphaOne:''' I don't get the views part &amp;rarr; how can 3RD person view just be hands?

'''Iceman:''' I always wanted to do something like this.. Akimbo grapple hooks where you hold down primary to shoot the left hand, and secondary to shoot the right. When the button is let go the ropes are released. If the physics were done properly, I think you could get some interesting effects from being able to have both ropes active at the same time.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Splintercell Mod</title>
    <id>1962</id>
    <revision>
      <id>4803</id>
      <timestamp>2003-08-28T00:03:21Z</timestamp>
      <contributor>
        <ip>Daid303</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Idea ==

The idea of this mod is to eliminate as much violence as possible from the game and instead focus on sneaking and planning. As we are a group of people working on this mod we sometimes disagree and sometimes manage to agree. the project is just starting and we've probably got a lot of problems ahead that we aren't even aware of yet. one of these issues is wether or not to reprogramme the bots, or just leave them at a low level and make a lot of paths for them. to begin with we will chose the later, simply because we have a deadline, but in the future it would be interesting to try to learn the bots to run for some kind of alarm button etc. 

we have not come very far yet and have not even started any programming, we are still developing levels. we have come up with an idea for a couple of levels. the main idea is for a character to break out of a prison (when I say character i don't mean that there will be any kind of role-playing...). the prison is divided into five different sections for different reasons. first of all there are five of us in the group currently developing the mod, and secondly, if the mod were to be one big level we would have to use a huge amount of bots, which would strain any cpu. our solution provides a rather simple way of alowing a relatively large number of bots compared to maparea. any ideas on solving this are welcome of course! =)

now you are all up to date on what's going on! i will keep updating this page and when the mod is finished (for there will be a mod, although the quality of it may not be very good) i will post it here somewhere for playtesting and further development if anyone feels like it! 

==Comments==

'''DJPaul:''' This is a page for [[Legacy:Mod Ideas|Mod Ideas]]; this sounds as it will be more of a [[:Category:Legacy Journal|Developer Journal]].

'''Thinks:''' i thought it could stick here in case people found it interesting and might want to persue it themselves.

'''DJPaul:''' In that case refactor this page so it has more of a detailed idea, and fits the layout of the other [[Legacy:Mod Ideas|Mod Ideas]] page; you can then add yourself/your mod team under the &quot;interested people&quot; section, or whatever it is called.

'''Thinks:''' You are right. I will work on a more detailed description and then I will leave the page here.

'''Foxpaw:''' It is just me or would it be easier to make this a mod of Splinter Cell? Splinter Cell is itself an Unreal-Engine based game so the notion of making a mod to change the gameplay to be like that of Splinter Cell seems odd to me.

'''AlphaOne:''' I would suggest remaking thievery UT. It's just amazing for multiplayer/singleplayer!

'''Legal:''' Yes, there are some guys doing it, but it's anything but a team, more like several small parts... Start a team, you will probably have some luck. Unless you go to Splinter Cell with it... ;)

www.thieveryut.com - TUT site, btw!

'''Mosquito:''' Trust legal, TUT pretty much covers all the thieving madness... I played it alot afew months ago, since DoD has gone downhill pretty fast, and I still lack a good enough com to play UT2003 at all, I might pick it up again. Legal, have the uber bots been delt with, or do they still have the powers of god?

'''Mortal Monkey:''' Unfortunately, the latest patch made every skill level the same, so now all the bots are stuck on Uber. But they no longer fart tagbolts at least.

'''Daid303:''' Doh, and I thouged I was original with I started to work on a Metal Gear Solid like MOD.</text>
    </revision>
    <revision>
      <id>4804</id>
      <timestamp>2003-08-13T08:02:23Z</timestamp>
      <contributor>
        <ip>Mortal Monkey</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Idea ==

The idea of this mod is to eliminate as much violence as possible from the game and instead focus on sneaking and planning. As we are a group of people working on this mod we sometimes disagree and sometimes manage to agree. the project is just starting and we've probably got a lot of problems ahead that we aren't even aware of yet. one of these issues is wether or not to reprogramme the bots, or just leave them at a low level and make a lot of paths for them. to begin with we will chose the later, simply because we have a deadline, but in the future it would be interesting to try to learn the bots to run for some kind of alarm button etc. 

we have not come very far yet and have not even started any programming, we are still developing levels. we have come up with an idea for a couple of levels. the main idea is for a character to break out of a prison (when I say character i don't mean that there will be any kind of role-playing...). the prison is divided into five different sections for different reasons. first of all there are five of us in the group currently developing the mod, and secondly, if the mod were to be one big level we would have to use a huge amount of bots, which would strain any cpu. our solution provides a rather simple way of alowing a relatively large number of bots compared to maparea. any ideas on solving this are welcome of course! =)

now you are all up to date on what's going on! i will keep updating this page and when the mod is finished (for there will be a mod, although the quality of it may not be very good) i will post it here somewhere for playtesting and further development if anyone feels like it! 

==Comments==

'''DJPaul:''' This is a page for [[Legacy:Mod Ideas|Mod Ideas]]; this sounds as it will be more of a [[:Category:Legacy Journal|Developer Journal]].

'''Thinks:''' i thought it could stick here in case people found it interesting and might want to persue it themselves.

'''DJPaul:''' In that case refactor this page so it has more of a detailed idea, and fits the layout of the other [[Legacy:Mod Ideas|Mod Ideas]] page; you can then add yourself/your mod team under the &quot;interested people&quot; section, or whatever it is called.

'''Thinks:''' You are right. I will work on a more detailed description and then I will leave the page here.

'''Foxpaw:''' It is just me or would it be easier to make this a mod of Splinter Cell? Splinter Cell is itself an Unreal-Engine based game so the notion of making a mod to change the gameplay to be like that of Splinter Cell seems odd to me.

'''AlphaOne:''' I would suggest remaking thievery UT. It's just amazing for multiplayer/singleplayer!

'''Legal:''' Yes, there are some guys doing it, but it's anything but a team, more like several small parts... Start a team, you will probably have some luck. Unless you go to Splinter Cell with it... ;)

www.thieveryut.com - TUT site, btw!

'''Mosquito:''' Trust legal, TUT pretty much covers all the thieving madness... I played it alot afew months ago, since DoD has gone downhill pretty fast, and I still lack a good enough com to play UT2003 at all, I might pick it up again. Legal, have the uber bots been delt with, or do they still have the powers of god?

'''Mortal Monkey:''' Unfortunately, the latest patch made every skill level the same, so now all the bots are stuck on Uber. But they no longer fart tagbolts at least.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/StarCraft</title>
    <id>1902</id>
    <revision>
      <id>4663</id>
      <timestamp>2003-04-18T16:30:01Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; StarCraft}}

==Description ==

I'm sure a lot of people have played and enjoyed StarCraft, and for the other 3 of you out there, SC is an RTS made by Blizzard Entertainment.  There are 3 races, the Terran (human), the Protoss (big tough aliens), and the Zerg (small horde aliens).  I want to take this and make a shooter from it.

*Things I have decided:

*# &lt;u&gt;As of August 14, 2002, at 13:35 EST, this mod has been cancelled by me, Death Angyl.  I have not actually begun any work on it, and don't intend to, unless Blizzard contacts me and explicitly states that I can start.  Expect to see this page go to a different location on the site.&lt;/u&gt;
*# &lt;u&gt;However, I may make a mod using some of the ideas expressed here (e.g. futuristic space shooter), without using SC IP&amp;trade;.  It's impossible not to use some general concepts from SC (heck, Bungie basically copied everything with Halo, and they got away with it), but maybe a more generic space-age shooter is the way to go.  Currently, the rest of this stuff applies to the original SC shooter idea I had.  Expect a new page if I do make a SC-esque mod.&lt;/u&gt;
*# I will use 3ds max to make the character models.  I will try to get started on them right away, but you never know.  If anyone really objects to Max, or wants to help and suggests I use something else like Milkshape, I am open to suggestions, but currently it seems Max is simply more powerful, and it does have good tutorials for modeling/animating (I am new to modding/modeling/level design, but I do have a decent programming background and pick stuff up quickly.)
*# Obviously, I will use UnrealEd to make the levels, whichever version ships with the game.

*Things I need to decide:

*# Whether/how to make the mod multiplayer (i'm thinking right now about including a single player campaign, as well as DM, and Co-op multiplayer)

*# How to incorporate Zerg and Protoss as playable races (DM is no problem, but its hard/boring to make a campaign for Zerg where you are a Zergling the whole time, and changing characters between missions really isn't a great idea.  Same with Protoss.  Terran, the idea is that you start as a Marine, but you can get in vehicles, pick up SOME (NOT lots of) different weapons, even change classes (just climb in a Firebat suit, etc.)  I guess this is quite a bit like C&amp;C: Renegade.

*# Do I get sued by Blizzard?  I don't have a lot of legal experience, but I have two main thoughts: 1) If I'm not getting revenue from this, they aren't losing anything; 2) if I give them credit for the concepts, etc. taken from StarCraft, I'm not plagarizing.  If anyone has legal experience/just knows more about it than i do, feel free to post your thoughts.

*# Do I use the UT2k3 stuff, or wait until UT2?  The main issues are:
::&lt;strike&gt;--Which will release the source code, and when; although i'm not sure, maybe i can use UnrealScript and don't need to actually mess with the engine;--&lt;/strike&gt; 
::&amp;ndash;Which will reach more people;
::&amp;ndash;Which will be easier to use/edit;
::&amp;ndash;Which will be more powerful technologically

*Issues:
*#&lt;strike&gt;Already, I am seeing problems with skeletal animation on robotic models.  For example, you don't want the Goliath moving like a human; you need the animation to bend in very specific ways, so it looks robotic.  I don't actually have any models to demonstrate with, but if anyone familiar with 3ds max knows of a way to do frame-by-frame animation, or to make the skeletal animation NOT stretch and bend the model, please tell me.&lt;/strike&gt;  &lt;u&gt;I've discovered how to do vertex animation in Max (Thank God), so I can use skeletal animation for stuff that it suits, and robotic vertex animation for the stuff that needs that.&lt;/u&gt;

If anyone has suggestions, either post them here or email me @ warcraft_3_addict@hotmail.com.

Please leave a handle and a way to contact you.  I'm not sure how often i will check this page, but I will make an effort.

==Discussion ==

'''Mr.Mitchell:''' To stay more in the format with the other pages I added some extra headers. I got a few things on some of the topics mentioned. 

Remarks on point 3
# I don't think that the sourcecode will be released for either one of the versions. But you won't need it, you will be able to create such a mod with only UScript. 
# You won't be able to release a stand-alone mod. This requires you to distribute UT content and you can't do that. 
# I don't think there will be much difference between editing for UT2003 and U2.

Remarks on point 4: 
* There was a mod that was called StartcraftUT, Blizzard made them change the name to UnrealCraft and a few months(weeks??) later they were summoned to stop the mod. Google with unrealcraft and read the story on ModSquad to read a bit more about UnrealCraft. So by basing the mod on the Starcraft universe I think you have a chance of getting problems with Blizzard.

'''Death_Angyl:''' Thanks for the format stuff, after I made the page I realized all the cool things you can do with the markup :)
#I realized after looking into modding (is 'modding' a legitimate verb?) more that I wont need them to open source it, so that really isn't an issue.
#Not being able to release a stand-alone isn't a problem either, but it makes it more important to choose the game which is better suited to this kind of thing.  I think that, since U2 is going to be single-player, it might be easier to make a single player campaign from it, rather than convert a multiplayer gametype in UT2k3 to a single-player game.  But hey, others have done it.
#I'm not sure how Blizzard can ''make'' someone stop the mod, short of a court injunction.  Maybe I should look into it though, I dont have enough cash to get sued :)

'''Mychaeel:''' I guess they have any means to stop someone from making a mod that trespasses on their intellectual property, or what passes for it.  As long as you stay away from things that directly connect the mod with StarCraft, you'll probably be safe.  The generic real-time strategy game isn't a Blizzard trademark after all.  In any case I think you can save yourself a lot of trouble by being a bit... politically sensitive to start with.

'''Death_Angyl:''' I went and read the thingy at [http://www.planetunreal.com/modsquad/modman_3402.htm ModSquad], and if you go there and read it, be sure to notice the thing on Star Wars UT, right below the StarCraft one.  It says the guy basically tells George Lucas that he's not harming any Star Wars Intellectual Property©, and not taking any revenue from Lucas, so Lucas can't do anything.  I'm not sure whether Lucas ''couldn't'' do anything, or got ''too bored'' to do anything.  If it is the latter, I'm sure Blizzard will not respond in the same way.  I still don't think that they can order something stopped which doesn't actually hurt them in any way.

'''Mychaeel:''' It ''does'' hurt them if they want it to.  It's a common misbelief that copyright is in any way related to commerce.  If you have the copyright for something (like Blizzard has for StarCraft), it is yours to decide what can and cannot be done with your intellectual property.  Whether or not money is involved is of no relevance.

'''capt. k.''' Except that which you want to use to pay your lawyers to actually *enforce* the copyright.  :)

'''Mychaeel:''' I dare say that not creating a precedent might be worth Blizzard's money.  Besides, I suppose they (or rather their publishers) employ a whole legal department.

'''Death Angyl:''' Yeah, I see your point.  And while another company might let something like that slide, Blizzard has always taken the hard line against anyone wanting to do mod-like stuff with their products.  Which sucks for us.  I guess I need a new mod idea then; I'll just put this one on the 'future, if ever' list.  There's no sense in using a bunch of time to make a cool mod just to be ordered to stop.

'''Wormbo:''' How about thinking of different names for the mod and everything that has names in it? You could just make a mod that has weapons '''similar''' to those in StarCraft.

'''Claw:''' I am developing a UT2k3 mod that might pass as &quot;vaguely StarCraft-like&quot; although only very remotely if I am honest. I posted it on BUF &gt; UT2k3 &gt; Xenocide and consider adding it to the mod ideas here.

And &quot;developing&quot; in that context means that the concept is worked out to great detail, and a team is more or less working on the mod.

'''Shanus:''' Why not use the &quot;general&quot; idea of future Earth Marines fighting off alien invaders. And expand from that. The alien invaders are 1) Insectlike and/or 2) High science humanoid. The Earth Marines have the ability to use specific vehicle types (scout, ground and air support) and can be of multiple &quot;classes&quot; (Shock Troop, Recon/Spy, Fire team). The insect-like aliens can have equivilant &quot;classes&quot; aswell, in their case they can spontaneuosly &quot;evolve&quot; into the different types. THe insect-aliens can have special creatures that they use for as &quot;vehicles&quot;. The techno-aliens just have techno-alien versions of the &quot;classes&quot; and &quot;vehicles&quot;. The gameplay CAN be multiplayer with each player being a spectator that can either take &quot;possesion&quot; of a bot that is spawned by the engine or direct the bot to a specific point on the map (use special type of Spectator class that can use Interactions on the bots). Could also add resource gathering to the system so that it takes X number of resources to spawn another X type of bot/vehicle.

Just an idea that I have had about one of these. I can be contacted at shanus72@hotmail.com if anyone wants to discuss the idea furthur.

'''RegularX:''' There's probably enough history with copyright battles and mods to deserve it's own page at this point, but I think Bid For Power proved that possibly the best path is to do something &quot;like&quot; the license, but never mentioning the license itself.

'''Vajuras:''' That's the best way to do it but the downside is that starcraft fans won't recognize the product as starcraft unless you start out like bid for power did- meaning be a starcraft mod at first, build up your fan base, and then just switch. The Half Life mod 'Existence' did exactly this. They built up a huge fan base really fast.

----

'''DJPaul:''' This page is more about one person's experiance with this mod idea, as opposed to a [[Legacy:Mod_Ideas|Mod Idea]].. and creating a game based on someone else's IP is plain daft, not to mention illegal.

'''Tarquin:''' Delete page?</text>
    </revision>
    <revision>
      <id>4664</id>
      <timestamp>2003-04-03T16:21:07Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Delete page?</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; StarCraft}}

==Description ==

I'm sure a lot of people have played and enjoyed StarCraft, and for the other 3 of you out there, SC is an RTS made by Blizzard Entertainment.  There are 3 races, the Terran (human), the Protoss (big tough aliens), and the Zerg (small horde aliens).  I want to take this and make a shooter from it.

*Things I have decided:

*# &lt;u&gt;As of August 14, 2002, at 13:35 EST, this mod has been cancelled by me, Death Angyl.  I have not actually begun any work on it, and don't intend to, unless Blizzard contacts me and explicitly states that I can start.  Expect to see this page go to a different location on the site.&lt;/u&gt;
*# &lt;u&gt;However, I may make a mod using some of the ideas expressed here (e.g. futuristic space shooter), without using SC IP&amp;trade;.  It's impossible not to use some general concepts from SC (heck, Bungie basically copied everything with Halo, and they got away with it), but maybe a more generic space-age shooter is the way to go.  Currently, the rest of this stuff applies to the original SC shooter idea I had.  Expect a new page if I do make a SC-esque mod.&lt;/u&gt;
*# I will use 3ds max to make the character models.  I will try to get started on them right away, but you never know.  If anyone really objects to Max, or wants to help and suggests I use something else like Milkshape, I am open to suggestions, but currently it seems Max is simply more powerful, and it does have good tutorials for modeling/animating (I am new to modding/modeling/level design, but I do have a decent programming background and pick stuff up quickly.)
*# Obviously, I will use UnrealEd to make the levels, whichever version ships with the game.

*Things I need to decide:

*# Whether/how to make the mod multiplayer (i'm thinking right now about including a single player campaign, as well as DM, and Co-op multiplayer)

*# How to incorporate Zerg and Protoss as playable races (DM is no problem, but its hard/boring to make a campaign for Zerg where you are a Zergling the whole time, and changing characters between missions really isn't a great idea.  Same with Protoss.  Terran, the idea is that you start as a Marine, but you can get in vehicles, pick up SOME (NOT lots of) different weapons, even change classes (just climb in a Firebat suit, etc.)  I guess this is quite a bit like C&amp;C: Renegade.

*# Do I get sued by Blizzard?  I don't have a lot of legal experience, but I have two main thoughts: 1) If I'm not getting revenue from this, they aren't losing anything; 2) if I give them credit for the concepts, etc. taken from StarCraft, I'm not plagarizing.  If anyone has legal experience/just knows more about it than i do, feel free to post your thoughts.

*# Do I use the UT2k3 stuff, or wait until UT2?  The main issues are:
::&lt;strike&gt;--Which will release the source code, and when; although i'm not sure, maybe i can use UnrealScript and don't need to actually mess with the engine;--&lt;/strike&gt; 
::&amp;ndash;Which will reach more people;
::&amp;ndash;Which will be easier to use/edit;
::&amp;ndash;Which will be more powerful technologically

*Issues:
*#&lt;strike&gt;Already, I am seeing problems with skeletal animation on robotic models.  For example, you don't want the Goliath moving like a human; you need the animation to bend in very specific ways, so it looks robotic.  I don't actually have any models to demonstrate with, but if anyone familiar with 3ds max knows of a way to do frame-by-frame animation, or to make the skeletal animation NOT stretch and bend the model, please tell me.&lt;/strike&gt;  &lt;u&gt;I've discovered how to do vertex animation in Max (Thank God), so I can use skeletal animation for stuff that it suits, and robotic vertex animation for the stuff that needs that.&lt;/u&gt;

If anyone has suggestions, either post them here or email me @ warcraft_3_addict@hotmail.com.

Please leave a handle and a way to contact you.  I'm not sure how often i will check this page, but I will make an effort.

==Discussion ==

'''Mr.Mitchell:''' To stay more in the format with the other pages I added some extra headers. I got a few things on some of the topics mentioned. 

Remarks on point 3
# I don't think that the sourcecode will be released for either one of the versions. But you won't need it, you will be able to create such a mod with only UScript. 
# You won't be able to release a stand-alone mod. This requires you to distribute UT content and you can't do that. 
# I don't think there will be much difference between editing for UT2003 and U2.

Remarks on point 4: 
* There was a mod that was called StartcraftUT, Blizzard made them change the name to UnrealCraft and a few months(weeks??) later they were summoned to stop the mod. Google with unrealcraft and read the story on ModSquad to read a bit more about UnrealCraft. So by basing the mod on the Starcraft universe I think you have a chance of getting problems with Blizzard.

'''Death_Angyl:''' Thanks for the format stuff, after I made the page I realized all the cool things you can do with the markup :)
#I realized after looking into modding (is 'modding' a legitimate verb?) more that I wont need them to open source it, so that really isn't an issue.
#Not being able to release a stand-alone isn't a problem either, but it makes it more important to choose the game which is better suited to this kind of thing.  I think that, since U2 is going to be single-player, it might be easier to make a single player campaign from it, rather than convert a multiplayer gametype in UT2k3 to a single-player game.  But hey, others have done it.
#I'm not sure how Blizzard can ''make'' someone stop the mod, short of a court injunction.  Maybe I should look into it though, I dont have enough cash to get sued :)

'''Mychaeel:''' I guess they have any means to stop someone from making a mod that trespasses on their intellectual property, or what passes for it.  As long as you stay away from things that directly connect the mod with StarCraft, you'll probably be safe.  The generic real-time strategy game isn't a Blizzard trademark after all.  In any case I think you can save yourself a lot of trouble by being a bit... politically sensitive to start with.

'''Death_Angyl:''' I went and read the thingy at [http://www.planetunreal.com/modsquad/modman_3402.htm ModSquad], and if you go there and read it, be sure to notice the thing on Star Wars UT, right below the StarCraft one.  It says the guy basically tells George Lucas that he's not harming any Star Wars Intellectual Property©, and not taking any revenue from Lucas, so Lucas can't do anything.  I'm not sure whether Lucas ''couldn't'' do anything, or got ''too bored'' to do anything.  If it is the latter, I'm sure Blizzard will not respond in the same way.  I still don't think that they can order something stopped which doesn't actually hurt them in any way.

'''Mychaeel:''' It ''does'' hurt them if they want it to.  It's a common misbelief that copyright is in any way related to commerce.  If you have the copyright for something (like Blizzard has for StarCraft), it is yours to decide what can and cannot be done with your intellectual property.  Whether or not money is involved is of no relevance.

'''capt. k.''' Except that which you want to use to pay your lawyers to actually *enforce* the copyright.  :)

'''Mychaeel:''' I dare say that not creating a precedent might be worth Blizzard's money.  Besides, I suppose they (or rather their publishers) employ a whole legal department.

'''Death Angyl:''' Yeah, I see your point.  And while another company might let something like that slide, Blizzard has always taken the hard line against anyone wanting to do mod-like stuff with their products.  Which sucks for us.  I guess I need a new mod idea then; I'll just put this one on the 'future, if ever' list.  There's no sense in using a bunch of time to make a cool mod just to be ordered to stop.

'''Wormbo:''' How about thinking of different names for the mod and everything that has names in it? You could just make a mod that has weapons '''similar''' to those in StarCraft.

'''Claw:''' I am developing a UT2k3 mod that might pass as &quot;vaguely StarCraft-like&quot; although only very remotely if I am honest. I posted it on BUF &gt; UT2k3 &gt; Xenocide and consider adding it to the mod ideas here.

And &quot;developing&quot; in that context means that the concept is worked out to great detail, and a team is more or less working on the mod.

'''Shanus:''' Why not use the &quot;general&quot; idea of future Earth Marines fighting off alien invaders. And expand from that. The alien invaders are 1) Insectlike and/or 2) High science humanoid. The Earth Marines have the ability to use specific vehicle types (scout, ground and air support) and can be of multiple &quot;classes&quot; (Shock Troop, Recon/Spy, Fire team). The insect-like aliens can have equivilant &quot;classes&quot; aswell, in their case they can spontaneuosly &quot;evolve&quot; into the different types. THe insect-aliens can have special creatures that they use for as &quot;vehicles&quot;. The techno-aliens just have techno-alien versions of the &quot;classes&quot; and &quot;vehicles&quot;. The gameplay CAN be multiplayer with each player being a spectator that can either take &quot;possesion&quot; of a bot that is spawned by the engine or direct the bot to a specific point on the map (use special type of Spectator class that can use Interactions on the bots). Could also add resource gathering to the system so that it takes X number of resources to spawn another X type of bot/vehicle.

Just an idea that I have had about one of these. I can be contacted at shanus72@hotmail.com if anyone wants to discuss the idea furthur.

'''RegularX:''' There's probably enough history with copyright battles and mods to deserve it's own page at this point, but I think Bid For Power proved that possibly the best path is to do something &quot;like&quot; the license, but never mentioning the license itself.

----

'''DJPaul:''' This page is more about one person's experiance with this mod idea, as opposed to a [[Legacy:Mod_Ideas|Mod Idea]].. and creating a game based on someone else's IP is plain daft, not to mention illegal.

'''Tarquin:''' Delete page?</text>
    </revision>
    <revision>
      <id>4665</id>
      <timestamp>2003-04-18T16:28:38Z</timestamp>
      <contributor>
        <ip>Vajuras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; StarCraft}}

==Description ==

I'm sure a lot of people have played and enjoyed StarCraft, and for the other 3 of you out there, SC is an RTS made by Blizzard Entertainment.  There are 3 races, the Terran (human), the Protoss (big tough aliens), and the Zerg (small horde aliens).  I want to take this and make a shooter from it.

*Things I have decided:

*# &lt;u&gt;As of August 14, 2002, at 13:35 EST, this mod has been cancelled by me, Death Angyl.  I have not actually begun any work on it, and don't intend to, unless Blizzard contacts me and explicitly states that I can start.  Expect to see this page go to a different location on the site.&lt;/u&gt;
*# &lt;u&gt;However, I may make a mod using some of the ideas expressed here (e.g. futuristic space shooter), without using SC IP&amp;trade;.  It's impossible not to use some general concepts from SC (heck, Bungie basically copied everything with Halo, and they got away with it), but maybe a more generic space-age shooter is the way to go.  Currently, the rest of this stuff applies to the original SC shooter idea I had.  Expect a new page if I do make a SC-esque mod.&lt;/u&gt;
*# I will use 3ds max to make the character models.  I will try to get started on them right away, but you never know.  If anyone really objects to Max, or wants to help and suggests I use something else like Milkshape, I am open to suggestions, but currently it seems Max is simply more powerful, and it does have good tutorials for modeling/animating (I am new to modding/modeling/level design, but I do have a decent programming background and pick stuff up quickly.)
*# Obviously, I will use UnrealEd to make the levels, whichever version ships with the game.

*Things I need to decide:

*# Whether/how to make the mod multiplayer (i'm thinking right now about including a single player campaign, as well as DM, and Co-op multiplayer)

*# How to incorporate Zerg and Protoss as playable races (DM is no problem, but its hard/boring to make a campaign for Zerg where you are a Zergling the whole time, and changing characters between missions really isn't a great idea.  Same with Protoss.  Terran, the idea is that you start as a Marine, but you can get in vehicles, pick up SOME (NOT lots of) different weapons, even change classes (just climb in a Firebat suit, etc.)  I guess this is quite a bit like C&amp;C: Renegade.

*# Do I get sued by Blizzard?  I don't have a lot of legal experience, but I have two main thoughts: 1) If I'm not getting revenue from this, they aren't losing anything; 2) if I give them credit for the concepts, etc. taken from StarCraft, I'm not plagarizing.  If anyone has legal experience/just knows more about it than i do, feel free to post your thoughts.

*# Do I use the UT2k3 stuff, or wait until UT2?  The main issues are:
::&lt;strike&gt;--Which will release the source code, and when; although i'm not sure, maybe i can use UnrealScript and don't need to actually mess with the engine;--&lt;/strike&gt; 
::&amp;ndash;Which will reach more people;
::&amp;ndash;Which will be easier to use/edit;
::&amp;ndash;Which will be more powerful technologically

*Issues:
*#&lt;strike&gt;Already, I am seeing problems with skeletal animation on robotic models.  For example, you don't want the Goliath moving like a human; you need the animation to bend in very specific ways, so it looks robotic.  I don't actually have any models to demonstrate with, but if anyone familiar with 3ds max knows of a way to do frame-by-frame animation, or to make the skeletal animation NOT stretch and bend the model, please tell me.&lt;/strike&gt;  &lt;u&gt;I've discovered how to do vertex animation in Max (Thank God), so I can use skeletal animation for stuff that it suits, and robotic vertex animation for the stuff that needs that.&lt;/u&gt;

If anyone has suggestions, either post them here or email me @ warcraft_3_addict@hotmail.com.

Please leave a handle and a way to contact you.  I'm not sure how often i will check this page, but I will make an effort.

==Discussion ==

'''Mr.Mitchell:''' To stay more in the format with the other pages I added some extra headers. I got a few things on some of the topics mentioned. 

Remarks on point 3
# I don't think that the sourcecode will be released for either one of the versions. But you won't need it, you will be able to create such a mod with only UScript. 
# You won't be able to release a stand-alone mod. This requires you to distribute UT content and you can't do that. 
# I don't think there will be much difference between editing for UT2003 and U2.

Remarks on point 4: 
* There was a mod that was called StartcraftUT, Blizzard made them change the name to UnrealCraft and a few months(weeks??) later they were summoned to stop the mod. Google with unrealcraft and read the story on ModSquad to read a bit more about UnrealCraft. So by basing the mod on the Starcraft universe I think you have a chance of getting problems with Blizzard.

'''Death_Angyl:''' Thanks for the format stuff, after I made the page I realized all the cool things you can do with the markup :)
#I realized after looking into modding (is 'modding' a legitimate verb?) more that I wont need them to open source it, so that really isn't an issue.
#Not being able to release a stand-alone isn't a problem either, but it makes it more important to choose the game which is better suited to this kind of thing.  I think that, since U2 is going to be single-player, it might be easier to make a single player campaign from it, rather than convert a multiplayer gametype in UT2k3 to a single-player game.  But hey, others have done it.
#I'm not sure how Blizzard can ''make'' someone stop the mod, short of a court injunction.  Maybe I should look into it though, I dont have enough cash to get sued :)

'''Mychaeel:''' I guess they have any means to stop someone from making a mod that trespasses on their intellectual property, or what passes for it.  As long as you stay away from things that directly connect the mod with StarCraft, you'll probably be safe.  The generic real-time strategy game isn't a Blizzard trademark after all.  In any case I think you can save yourself a lot of trouble by being a bit... politically sensitive to start with.

'''Death_Angyl:''' I went and read the thingy at [http://www.planetunreal.com/modsquad/modman_3402.htm ModSquad], and if you go there and read it, be sure to notice the thing on Star Wars UT, right below the StarCraft one.  It says the guy basically tells George Lucas that he's not harming any Star Wars Intellectual Property©, and not taking any revenue from Lucas, so Lucas can't do anything.  I'm not sure whether Lucas ''couldn't'' do anything, or got ''too bored'' to do anything.  If it is the latter, I'm sure Blizzard will not respond in the same way.  I still don't think that they can order something stopped which doesn't actually hurt them in any way.

'''Mychaeel:''' It ''does'' hurt them if they want it to.  It's a common misbelief that copyright is in any way related to commerce.  If you have the copyright for something (like Blizzard has for StarCraft), it is yours to decide what can and cannot be done with your intellectual property.  Whether or not money is involved is of no relevance.

'''capt. k.''' Except that which you want to use to pay your lawyers to actually *enforce* the copyright.  :)

'''Mychaeel:''' I dare say that not creating a precedent might be worth Blizzard's money.  Besides, I suppose they (or rather their publishers) employ a whole legal department.

'''Death Angyl:''' Yeah, I see your point.  And while another company might let something like that slide, Blizzard has always taken the hard line against anyone wanting to do mod-like stuff with their products.  Which sucks for us.  I guess I need a new mod idea then; I'll just put this one on the 'future, if ever' list.  There's no sense in using a bunch of time to make a cool mod just to be ordered to stop.

'''Wormbo:''' How about thinking of different names for the mod and everything that has names in it? You could just make a mod that has weapons '''similar''' to those in StarCraft.

'''Vajuras:''' That's the best way to do it but the downside is that starcraft fans won't recognize the product as starcraft unless you start out like bid for power did- meaning be a starcraft mod at first, build up your fan base, and then just switch. The Half Life mod 'Existence' did exactly this. They built up a huge fan base really fast.

'''Claw:''' I am developing a UT2k3 mod that might pass as &quot;vaguely StarCraft-like&quot; although only very remotely if I am honest. I posted it on BUF &gt; UT2k3 &gt; Xenocide and consider adding it to the mod ideas here.

And &quot;developing&quot; in that context means that the concept is worked out to great detail, and a team is more or less working on the mod.

'''Shanus:''' Why not use the &quot;general&quot; idea of future Earth Marines fighting off alien invaders. And expand from that. The alien invaders are 1) Insectlike and/or 2) High science humanoid. The Earth Marines have the ability to use specific vehicle types (scout, ground and air support) and can be of multiple &quot;classes&quot; (Shock Troop, Recon/Spy, Fire team). The insect-like aliens can have equivilant &quot;classes&quot; aswell, in their case they can spontaneuosly &quot;evolve&quot; into the different types. THe insect-aliens can have special creatures that they use for as &quot;vehicles&quot;. The techno-aliens just have techno-alien versions of the &quot;classes&quot; and &quot;vehicles&quot;. The gameplay CAN be multiplayer with each player being a spectator that can either take &quot;possesion&quot; of a bot that is spawned by the engine or direct the bot to a specific point on the map (use special type of Spectator class that can use Interactions on the bots). Could also add resource gathering to the system so that it takes X number of resources to spawn another X type of bot/vehicle.

Just an idea that I have had about one of these. I can be contacted at shanus72@hotmail.com if anyone wants to discuss the idea furthur.

'''RegularX:''' There's probably enough history with copyright battles and mods to deserve it's own page at this point, but I think Bid For Power proved that possibly the best path is to do something &quot;like&quot; the license, but never mentioning the license itself.

----

'''DJPaul:''' This page is more about one person's experiance with this mod idea, as opposed to a [[Legacy:Mod_Ideas|Mod Idea]].. and creating a game based on someone else's IP is plain daft, not to mention illegal.

'''Tarquin:''' Delete page?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Sticky Boots</title>
    <id>1881</id>
    <revision>
      <id>4615</id>
      <timestamp>2005-09-27T13:14:40Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Sticky Boots}}

==Description ==

This little mutator will give everyone in the game sticky boots.  What this basically means is that the player will always be perpendicular to the surface they are standing on.  These wonderful little toys will also allow the wearer to run up walls and stick to ceilings.  It will almost certainly work best with curvy levels and it should be impossible to run up right angled walls.

I've not decided what to do about jumping yet - I'm inclined to disallow it as it raises all sorts of complicated issues - like do they travel at right angles to the surface they are standing on or fall (and rotate) in the direction the gravity is pointing.

As far as I could tell it couldn't be done in UT.  Admittedly I got side tracked by real life just as I was looking at this one, but it seemed tough to do.  And I'll have to go and re-learn all the vector maths I've forgotten over the last decade.  One of the few bits of maths I was good at.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Tarquin:''' I read somewhere that there's a PHYSICS_Spider thing somewhere in UT. Either that or its in a custom thing. Or I dreamt it. erm...

'''Mychaeel:'''  Indeed, there's PHYS_Spider built into the engine.  Allegedly it even works, but it's not quite as sophisticated as for instance AvP's wall crawling.  From what I read PHYS_Spider allows you to walk flat surfaces, but you'll fall down as soon as you reach a surface edge.

'''EntropicLqd:'''  Yeah - I found that and tried it out.  It sort of works but you wind up not being able to move and stuff - a right pain in the bum.  Shame really.

'''Jb:'''  According to the UDN UT2003 did not have the PHYS_Spider implemented yet. However that document was old so maybe they have by now?

'''Mychaeel:''' I frankly doubt it, unless they're using it in the game somewhere themselves.

'''Kuhal:''' If you stipulate that the boots work by some sort of anti-gravity &quot;magic&quot; and align themselves to the nearest hard surface, then you could allow jumping - even upside down.  If the work by some sort of sticky ozze or something (fun idea) then you can make it so that the player must keep walking (i.e. 1 foot always on the ground) to avoid falling.  The ooze evaporates rapidly which is the only way the player can move at all otherwise they would be stuck in place.  In such a scenario, if the player stops moving, then the ozze disappears and they fall victim to normal gravity again.  Could be very funny indeed.  Similar thing would apply to spider style sticky boots or gecko-style....

'''Claw:''' Mychaeel &amp;ndash;&gt; They do? Never heard of that, but it would be cool if it was supported. In UT, PHYS_Spider was only a remains of Unreal, where some pawns used it. But it wasn't meant for the players, and there were no controls written for it. A &quot;simple&quot; matter of writing a &quot;wall crawling&quot; state for player pawns (and bots).

'''[Apoc]Death:''' I'm writing Reactor4's MatrixMoves for UT2003...  Almost done too...  Just chiming in to say PHYS_Spider is implemented in an unused PlayerSpidering state in Engine.PlayerController, and does work decently well (only a few bugs on some static meshes, and it by default was climbing invisible blocking volumes, but that at least i could fix).  Writing my wall _running_ state has been anything but a simple matter though...  ;)

'''StormLord:''' The PlayerSpidering state also messes up aiming, since every time your floor normal vector changes, it rotates your view accordingly.  I changed it a bit so that it always conserves your aiming direction and smoothly interpolates your left-direction (Y-vector) to be perpendicular to the floor normal.  This way you can aim up and down and left and right, without your 'up-axis' causing problems, so you can stand on a wall and still fight.  Is there a good place somewhere for me to post the code, so that everybody can use it?  (Unfortunately I had to override the PlayerPawn class, so I had to create a new game type.  Maybe someone here knows how to do it with a mutator?)

'''Graphik:''' This mod has already been done elsewhere. I'll look for a link.

'''T1:''' Fraghouse mod team's Stunt Man mutator implements a toggle-able glue mode that works like this, among other things.

http://fraghouse.beyondunreal.com/ut2004work.php &lt;&amp;ndash; Scroll down till  you see Stunt Man.</text>
    </revision>
    <revision>
      <id>4616</id>
      <timestamp>2005-09-27T12:59:56Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Sticky Boots}}

==Description ==

This little mutator will give everyone in the game sticky boots.  What this basically means is that the player will always be perpendicular to the surface they are standing on.  These wonderful little toys will also allow the wearer to run up walls and stick to ceilings.  It will almost certainly work best with curvy levels and it should be impossible to run up right angled walls.

I've not decided what to do about jumping yet - I'm inclined to disallow it as it raises all sorts of complicated issues - like do they travel at right angles to the surface they are standing on or fall (and rotate) in the direction the gravity is pointing.

As far as I could tell it couldn't be done in UT.  Admittedly I got side tracked by real life just as I was looking at this one, but it seemed tough to do.  And I'll have to go and re-learn all the vector maths I've forgotten over the last decade.  One of the few bits of maths I was good at.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Tarquin:''' I read somewhere that there's a PHYSICS_Spider thing somewhere in UT. Either that or its in a custom thing. Or I dreamt it. erm...

'''Mychaeel:'''  Indeed, there's PHYS_Spider built into the engine.  Allegedly it even works, but it's not quite as sophisticated as for instance AvP's wall crawling.  From what I read PHYS_Spider allows you to walk flat surfaces, but you'll fall down as soon as you reach a surface edge.

'''EntropicLqd:'''  Yeah - I found that and tried it out.  It sort of works but you wind up not being able to move and stuff - a right pain in the bum.  Shame really.

'''Jb:'''  According to the UDN UT2003 did not have the PHYS_Spider implemented yet. However that document was old so maybe they have by now?

'''Mychaeel:''' I frankly doubt it, unless they're using it in the game somewhere themselves.

'''Kuhal:''' If you stipulate that the boots work by some sort of anti-gravity &quot;magic&quot; and align themselves to the nearest hard surface, then you could allow jumping - even upside down.  If the work by some sort of sticky ozze or something (fun idea) then you can make it so that the player must keep walking (i.e. 1 foot always on the ground) to avoid falling.  The ooze evaporates rapidly which is the only way the player can move at all otherwise they would be stuck in place.  In such a scenario, if the player stops moving, then the ozze disappears and they fall victim to normal gravity again.  Could be very funny indeed.  Similar thing would apply to spider style sticky boots or gecko-style....

'''Claw:''' Mychaeel &amp;ndash;&gt; They do? Never heard of that, but it would be cool if it was supported. In UT, PHYS_Spider was only a remains of Unreal, where some pawns used it. But it wasn't meant for the players, and there were no controls written for it. A &quot;simple&quot; matter of writing a &quot;wall crawling&quot; state for player pawns (and bots).

'''[Apoc]Death:''' I'm writing Reactor4's MatrixMoves for UT2003...  Almost done too...  Just chiming in to say PHYS_Spider is implemented in an unused PlayerSpidering state in Engine.PlayerController, and does work decently well (only a few bugs on some static meshes, and it by default was climbing invisible blocking volumes, but that at least i could fix).  Writing my wall _running_ state has been anything but a simple matter though...  ;)

'''StormLord:''' The PlayerSpidering state also messes up aiming, since every time your floor normal vector changes, it rotates your view accordingly.  I changed it a bit so that it always conserves your aiming direction and smoothly interpolates your left-direction (Y-vector) to be perpendicular to the floor normal.  This way you can aim up and down and left and right, without your 'up-axis' causing problems, so you can stand on a wall and still fight.  Is there a good place somewhere for me to post the code, so that everybody can use it?  (Unfortunately I had to override the PlayerPawn class, so I had to create a new game type.  Maybe someone here knows how to do it with a mutator?)

'''Graphik:''' This mod has already been done elsewhere. I'll look for a link.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Synthesizer</title>
    <id>1953</id>
    <revision>
      <id>4782</id>
      <timestamp>2004-08-31T03:48:24Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Synthesizer}}

==Description ==

by Howard_Stern

The synthesizer gun will use standard ammo to create new attacks. Secondary switches between the attacks used, and primary fires. Players would start with this weapons so no standard weapons would have to be replaced, but it can also be picked up (whichever). Any one of these attacks can be mods by themselves, but my idea is to have it all in one weapon. The attacks are limited only by the programmer's imagination, but here's what I had in mind:

'''''Link-2-All''''' - Link and all other ammo - Like the link gun's secondary, but can link up to and double the power of any weapon. It would use 1 link ammo + 1 ammo of which ever weapon is being boosted. For example, If I'm boosting someone with a rocket launcher and they fire a rocket, 1 link and 1 rocket ammo will drain from my inventory. The exception would be the minigun, where every 5 shots would drain 1 link and 5 mini ammo. If you run out of ammo while boosting, you'll stay linked up, but &quot;Not enough &lt;whatever&gt; ammo left&quot; would appear on the screen.

'''''Satellite Charge''''' - 1 ION Painter and 20 Rocket ammo - The user would have to be in the VAPOR cannon's range. When fired, the user would be forced to hold still while the Satellite fires on them. No explosion or damage done, but they'll do double damage for 45 seconds and their health would recover to 199. 

'''''Panzer''''' - Uses 1 Redeemer and 20 shock ammo - Think of a really large, long lasting and powerful shock beam - It would last for 10 seconds and kill instantly, but the user's speed would drop by 3/4 (due to the force of the beam). The beam would be 128 units wide (UnrealEd), and have an unlimited reach.

'''''Land Mines''''' - Uses 1 rocket and 1 grenade - Creates a landmine that explodes with a rocket's strength. The mine can stick to floors, walls, and ceilings, and will explode by walking over them, getting too close (maybe), or by being shot. Since grenades are uncommon, maps won't be littered with mines. The Translocator model can be used (looks kinda like a mine anyway.)

'''''Demi''''' - 1 Sniper and 5 Bio ammo - If you're ever played Final Fantasy you know that demi doesn't do a set amout of damage, but instead does a percentage of the target's health. This attack would be the basic lightning shot (with the slow firing rate) but when it hits it will cut your enemy's health in half. Getting hit by the smaller bolts would do 1/4 damage. Hitting someone with 199 health and 150 armor would do 174 damage (round down), but if they had 2 health you would only do 1 damage point (and if they had 1 health it would do squat). Great for attacking the heavily armored, but not so useful otherwise (since a sniper shot does 70, demi won't be practical unless the enemy has more than a 140 health/armor total). A nice tradeoff. A headshot with demi would do 3/4 damage. 

'''''Magnetism''''' - 3 Sniper and 1 Rocket ammo - Would fire heat-seeking rockets without the need for a hard-to-acheive lock.

'''''Miniflak''''' - 3 Mini and 1 flak ammo - The minigun's primary attack, but would shoot flak shards instead. For every 3 minigun bullets shot a flak ammo would be wasted.

'''''Gravity Shot''''' - 5 Shock, 5 Lightning and 10 Link ammo (energy weapons) - Would shoot a '''slow''' traveling shock sphere that would do 100 damage if you touch it, but the gravity will be lower the closer you get to it (to a reasonable degree). It'll float for a short period of time before dissapearing. If you switch to your shock rifle and strike the sphere with the SR primary, you'll perform a gravity shock combo - the area around the combo would have dramatically increased gravity and would cause a great deal of damage if you're even a short distance off the ground.

'''''Teleport''''' - 5 Translocator and 15 Shock ammo - The shock rifle's primary but wherever it hits, you'll be teleported to. Great for getting to the other side of a map fast (you'll still drop the flag with this). If you hit someone you'll telefrag them, so it could act as an instagib. If you hit a teammate you'll hear the &quot;Transloc fail&quot; sound...now that I think of it this &quot;idea&quot; must have seeped into my mind from a mod I played a long time ago, the telefrag gun. Don't give me credit for this, it isn't totally my idea.

'''''NULL''''' - Link and all other ammo - You'll link up to an ENEMY. When he fires it'll drain ammo from both his and your own inventory but won't cause any damage to anyone. The ammo will drain in the same manner as Link-2-All except the link ammo would constantly drain. If you don't have the ammo the enemy you're linked up to is firing, you'll stay linked up but &quot;Not enough &lt;whatever&gt; ammo left&quot; will appear on the bottom of your screen.

If you try to use an attack but don't have enough of a certain ammo, you'll see &quot;Not enough &lt;whatever&gt; ammo left&quot; on the bottom of your screen. The new attacks would add something new to the game without being so strong they make standard weapons useless. 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

Got something to say? You got your space right here. Please feel free to tweak the attacks I have here. If you want to add your own go ahead! Just make sure it doesn't look like I came up with your idea; put &quot;attack by - whoever&quot; next to it.

'''GRAF1K:''' I had this same idea a while back. Sounds good to me, though sort of a novelty with out much practical use. Still, good-looking maps are pointless, but everyone likes those. :)</text>
    </revision>
    <revision>
      <id>4783</id>
      <timestamp>2004-08-31T03:01:47Z</timestamp>
      <contributor>
        <ip>Robertsim007</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Synthesizer}}

==Description ==

by Howard_Stern

The synthesizer gun will use standard ammo to create new attacks. Secondary switches between the attacks used, and primary fires. Players would start with this weapons so no standard weapons would have to be replaced, but it can also be picked up (whichever). Any one of these attacks can be mods by themselves, but my idea is to have it all in one weapon. The attacks are limited only by the programmer's imagination, but here's what I had in mind:

'''''Link-2-All''''' - Link and all other ammo - Like the link gun's secondary, but can link up to and double the power of any weapon. It would use 1 link ammo + 1 ammo of which ever weapon is being boosted. For example, If I'm boosting someone with a rocket launcher and they fire a rocket, 1 link and 1 rocket ammo will drain from my inventory. The exception would be the minigun, where every 5 shots would drain 1 link and 5 mini ammo. If you run out of ammo while boosting, you'll stay linked up, but &quot;Not enough &lt;whatever&gt; ammo left&quot; would appear on the screen.

'''''Satellite Charge''''' - 1 ION Painter and 20 Rocket ammo - The user would have to be in the VAPOR cannon's range. When fired, the user would be forced to hold still while the Satellite fires on them. No explosion or damage done, but they'll do double damage for 45 seconds and their health would recover to 199. 

'''''Panzer''''' - Uses 1 Redeemer and 20 shock ammo - Think of a really large, long lasting and powerful shock beam - It would last for 10 seconds and kill instantly, but the user's speed would drop by 3/4 (due to the force of the beam). The beam would be 128 units wide (UnrealEd), and have an unlimited reach.

'''''Land Mines''''' - Uses 1 rocket and 1 grenade - Creates a landmine that explodes with a rocket's strength. The mine can stick to floors, walls, and ceilings, and will explode by walking over them, getting too close (maybe), or by being shot. Since grenades are uncommon, maps won't be littered with mines. The Translocator model can be used (looks kinda like a mine anyway.)

'''''Demi''''' - 1 Sniper and 5 Bio ammo - If you're ever played Final Fantasy you know that demi doesn't do a set amout of damage, but instead does a percentage of the target's health. This attack would be the basic lightning shot (with the slow firing rate) but when it hits it will cut your enemy's health in half. Getting hit by the smaller bolts would do 1/4 damage. Hitting someone with 199 health and 150 armor would do 174 damage (round down), but if they had 2 health you would only do 1 damage point (and if they had 1 health it would do squat). Great for attacking the heavily armored, but not so useful otherwise (since a sniper shot does 70, demi won't be practical unless the enemy has more than a 140 health/armor total). A nice tradeoff. A headshot with demi would do 3/4 damage. 

'''''Magnetism''''' - 3 Sniper and 1 Rocket ammo - Would fire heat-seeking rockets without the need for a hard-to-acheive lock.

'''''Miniflak''''' - 3 Mini and 1 flak ammo - The minigun's primary attack, but would shoot flak shards instead. For every 3 minigun bullets shot a flak ammo would be wasted.

'''''Gravity Shot''''' - 5 Shock, 5 Lightning and 10 Link ammo (energy weapons) - Would shoot a '''slow''' traveling shock sphere that would do 100 damage if you touch it, but the gravity will be lower the closer you get to it (to a reasonable degree). It'll float for a short period of time before dissapearing. If you switch to your shock rifle and strike the sphere with the SR primary, you'll perform a gravity shock combo - the area around the combo would have dramatically increased gravity and would cause a great deal of damage if you're even a short distance off the ground.

'''''Teleport''''' - 5 Translocator and 15 Shock ammo - The shock rifle's primary but wherever it hits, you'll be teleported to. Great for getting to the other side of a map fast (you'll still drop the flag with this). If you hit someone you'll telefrag them, so it could act as an instagib. If you hit a teammate you'll hear the &quot;Transloc fail&quot; sound...now that I think of it this &quot;idea&quot; must have seeped into my mind from a mod I played a long time ago, the telefrag gun. Don't give me credit for this, it isn't totally my idea.

'''''NULL''''' - Link and all other ammo - You'll link up to an ENEMY. When he fires it'll drain ammo from both his and your own inventory but won't cause any damage to anyone. The ammo will drain in the same manner as Link-2-All except the link ammo would constantly drain. If you don't have the ammo the enemy you're linked up to is firing, you'll stay linked up but &quot;Not enough &lt;whatever&gt; ammo left&quot; will appear on the bottom of your screen.

If you try to use an attack but don't have enough of a certain ammo, you'll see &quot;Not enough &lt;whatever&gt; ammo left&quot; on the bottom of your screen. The new attacks would add something new to the game without being so strong they make standard weapons useless. 

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

Got something to say? You got your space right here. Please feel free to tweak the attacks I have here. If you want to add your own go ahead! Just make sure it doesn't look like I came up with your idea; put &quot;attack by - whoever&quot; next to it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Synthesizer Gun</title>
    <id>1952</id>
    <revision>
      <id>4781</id>
      <timestamp>2003-02-09T01:16:04Z</timestamp>
      <contributor>
        <ip>Howard Stern</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A new weapon - the Synthesizer gun - can either be picked up or the player can start with it. It'll use the ammo that all the other weapons use, but in combinations to pull of new attacks

Land Mines - Uses 1 grenade and 1 rocket - Creates a landmine that will explode with a rocket's strength. Will explode when walked over or shot at. The can be placed wherever they hit: floors, walls, and ceilings. It uses grenade ammo since you're allowed a max of 8. Lets not have a map littered with mines. (Mabye the landmine can use the Translocator model)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TacticalScreen</title>
    <id>1947</id>
    <revision>
      <id>4768</id>
      <timestamp>2005-03-15T19:32:34Z</timestamp>
      <contributor>
        <ip>P54BCF143.dip.t-dialin.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===Description ===

Do you know the multiview-screen from rocketarena v0.82? Based on this multiscreening system, I want to create a mutator that enables a selected player on each team (red/blue), to view every transloc-cam placed by a teammate. Use for such a mutator is the observation of battles as a tactical supervisor. The selected player may activate the tactical screen and have a TEAMMESSAGE-based interface, with which he can send messages. (duh:)

In messages, that shall be activated by a minimal number of keys as possible (pre-defined messages), every disc can be given a user-defined name, (maybe built-in support for automatically renaming in relation to the playername of the player who set the cam or it's location, that would be &quot;PlayernameCAM&quot;, or &quot;Red Cave&quot;, etc.), which makes ist easier for the teammates to understand the location of the disc.

I am open for all ideas :)

===Comments ===

Good idea, there's something like it for UT, the wonderful [[Legacy:Screen|Screen]] by [[Legacy:Mychaeel|Mychaeel]].

'''Wormbo:''' The idea is nice, but this kind of multiple viewports only works with the Direct3D mode. OpenGL mode can't render them correctly. All Linux users and those who chose to use OpenGL under Windows are affected by this problem.</text>
    </revision>
    <revision>
      <id>4769</id>
      <timestamp>2003-01-12T21:57:09Z</timestamp>
      <contributor>
        <ip>Snickhouse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Description ===

do you know the multiview-screen from rocketarena v0.82? based on this multiscreening system, i want to create a mutator that enables a chosen player on each team (red/blue), to show every transloc-cam set by a teammate. use for such a muta is the observation of battles as a tactical supervisor. the chosen player may activate the tactical screen and have a TEAMMESSAGE-based interface, with which he can send messages. (duh:)

in messages, that shall be activated by a minimal number of keys as possible (pre-defined messages), every disc can be given a user-defined name, (maybe built-in support for automatically renaming in relation to the playername of the player who set the cam or it's location, that would be &quot;PlayernameCAM&quot;, or &quot;Red Cave&quot;, etc.), which makes ist easier for the teammates to understand the location of the disc.

i am open for all ideas :)

===Comments ===

Good idea, there's something like it for UT, the wonderfull [[Legacy:Screen|Screen]] by [[Legacy:Mychaeel|Mychaeel]]. Since when is Wiki multi-lingual :p ?

Need Swedish too?

'''Wormbo:''' I have no problem with German mod descriptions, but keep them grammatically correct, i.e. capitalization of nouns etc. :p Same goes for the English version, of course. I'd also like to add that this place it ''not'' meant for recruiting. Try forums like e.g. [http://unreal.ingame.de/forum/index.php inUnreal.de] (since you obviously are German) or BeyondUnreal [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=132 Recruitment] instead.</text>
    </revision>
    <revision>
      <id>4770</id>
      <timestamp>2003-01-13T11:56:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Description ===

Do you know the multiview-screen from rocketarena v0.82? Based on this multiscreening system, I want to create a mutator that enables a selected player on each team (red/blue), to view every transloc-cam placed by a teammate. Use for such a mutator is the observation of battles as a tactical supervisor. The selected player may activate the tactical screen and have a TEAMMESSAGE-based interface, with which he can send messages. (duh:)

In messages, that shall be activated by a minimal number of keys as possible (pre-defined messages), every disc can be given a user-defined name, (maybe built-in support for automatically renaming in relation to the playername of the player who set the cam or it's location, that would be &quot;PlayernameCAM&quot;, or &quot;Red Cave&quot;, etc.), which makes ist easier for the teammates to understand the location of the disc.

I am open for all ideas :)

===Comments ===

Good idea, there's something like it for UT, the wonderfull [[Legacy:Screen|Screen]] by [[Legacy:Mychaeel|Mychaeel]].

'''Wormbo:''' The idea is nice, but this kind of multiple viewports only works with the Direct3D mode. OpenGL mode can't render them correctly. All Linux users and those who chose to use OpenGL under Windows are affected by this problem.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Talkative Bots</title>
    <id>1882</id>
    <revision>
      <id>4617</id>
      <timestamp>2006-01-04T15:38:52Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003 &amp;ndash; When is a bot not a bot?  When it talks back}}

==Description ==

When you play on public servers for a while you realise that there are only a couple of things people every say, like &quot;gg&quot;, &quot;n1&quot;, &quot;gs&quot; etc etc and most of those are abbreviations.  This little mutator (probably a mutator anyway) will ensure that the bots all say &quot;gg&quot;, or &quot;well get ya next time&quot; at the end of the level.  If you type in &quot;n1&quot; or &quot;gs&quot; after being killed by a bot then the bot will reply with a &quot;ta :)&quot;.  There's probably a few other variations I can add in here, and those along with &quot;bot talking to bot&quot; interactions should make it rather more believable.  One thing I'm not going to add is anything even remotely abusive or offensive.  I'm aiming for a sort of &quot;friendly - smug&quot; kind of environment here.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Birelli:''' A few more exchanges for the bots:
#After every cap, teamate bots could say &quot;gj&quot; or &quot;nice cap&quot;
#If there are teamates nearby when a bot caps they could say &quot;thx for the cover&quot; and any nearby bot to that could say 3 seconds later &quot;np&quot;
#If there are more than 3 opponents within ~1024 world units of the flag and the bot dies while within that radius of the opponent's flag they could say &quot;someone pitch a tent&quot; :smile:
#If a player that kills them was within the same ~256 world unit radius for, say, 15 seconds, the bot could say something about campers (but it has to be something self-deprecating, it can't be a flame, I'm not sure exactly what)
#I'm not sure how well it would work but after the first minute or so of gameplay a couple random bots could say &quot;lo&quot; to any incoming player, or if a bot comes in to replace an outgoing player they could say &quot;lo all&quot; or &quot;hi all&quot;

All of these could use some variations like &quot;&gt;&gt;&gt;Nice Cap &quot;x&quot;&lt;&lt;&lt; with the name of the player who capped for instance, and of course randomness is a necessity, and the lower down a player is on the overall frag list the more likely they should be to chat or something like that, and the higher up the more likely to say &quot;thx for cover&quot; and &quot;nice cap&quot; and stuff. That's just the feeling I've gotten about who tends to say different things.

Also, the game should fake a ping for all the bots (something ~100 for bots doing well dropping off to ~300 for bots getting nailed a lot).

'''Birelli:''' I just had another though, the server could keep a list in a .ini file of different amounts of player times and top players could be met with bots saying &quot;oh darn, and we were winning too&quot;, or even (and this would be hilarious) &quot;I've got no chance against 'Player X', I'm out&quot; and be replaced by a different bot (that would have to have a VERY low chance of happening and only if the bot wasn't currently engaged). Players with just lots of minutes on the server could have bots say &quot;lo 'Player X'&quot; or some variation thereof.

'''EntropicLqd:'''  lol.  Very sweet ideas.  I love the idea of a bot bailing out just because a &quot;scary&quot; player comes on-line.  And faking a ping for them - hee hee.

'''The Twiggman''' Great idea. Just like quake 3. You can say something to a bot and they will chat back. Fun to get your rage out. Would be quite intresting to see bots behave much like players by bailing in and out of the game. You could maybe set an open game and the bots can pop in and out and pop caps at the same time.

'''JaFO :''' So other people have had the same idea ... I've been thinking about making a &quot;bitching Betty&quot;-type bot too.

Like Eliza-chatprograms (or is it Elisa ?) it reacts to player-messages and possibly add a few comments of its own. Perhaps even different personalities ...

'''Dezro:''' (Player): $uck 1t, b1tche$! (Bot): Why do you say $uck 1i, b1tche$? (Player): WTF? (Bot): I would appreciate it if you would continue. (Player): STFU, bitch! (Bot): Is it because of your sex life that you say STFU, bitch?

'''Piglet:''' Sounds like an intresting idea,  I think it could be 'fairly' intresting to program too.  However i dont really have the skills to setup the interface for the bots to talk through if you know what i mean.  It would also be nice to load text from some sort of .cht file or whatever, again i have no clue how this would be done :(

'''SabbathCat:''' Some guy made a talking Titan mod for DeathMatch levels in a couple of [[Legacy:UT|UT]] maps . Worked pretty well, looked good when you had 4 talking at once. There wasn't any Chat AI as such though, just a bunch of taunts called from a list randomly at regular intervals or after a frag/death. Would it be possible to parse previous player text and pick up on words and retort back, like JaFo talks about? 

'''Foxpaw:''' I think that would get a bit crazy if you play games with lots of bots. (over 10 a side sometimes) Making the bots seem more like human players would probrably be a good thing though.

'''Lev:''' I’m planning on something similar to this as an entry to the make something unreal contest. The talkative side would be a more minor feature in this thou. What I plan to do is take all the attributes of players that really ruin a game and modify a bot to act like that because that is what is really missing from offline botmatches the idiots! Called IdiBots they would do such things as in Bombing Run you would pass them the ball and they would start running to your own goal and pass the ball to the other team, in team matches (with FF off) would repeatable shoot you even thou it they can't hurt you and try to telefrag you with the translocator. The talkative side would come in when you tried talk to them, just like in real life they would start hurling mom put downs at you. Of course they would all have 3ll3t speak names and when they leave they would say something along the lines of “gtg my mom needs the computer.”

'''Kerlin:''' Something by the Drunken Snipers already does this, I think. It's called Bullshit. Sorry, don't have a link handy.

'''Lev:''' Yes i know of that by our very own [[Legacy:El_Muerte_TDS|El_Muerte_TDS]], link to Bullshit on his page :)

'''Sweavo:''' if you want to go teh hardcore, look up A.L.I.C.E. on teh net and build a full on A.I. conversation engine into the bot - and get banned from most servers for the ridiculous extra load :-)

'''T-1:''' I would recommend having a look at Markov Chains.</text>
    </revision>
    <revision>
      <id>4618</id>
      <timestamp>2006-01-04T14:28:31Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>glib comment added</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003 &amp;ndash; When is a bot not a bot?  When it talks back}}

==Description ==

When you play on public servers for a while you realise that there are only a couple of things people every say, like &quot;gg&quot;, &quot;n1&quot;, &quot;gs&quot; etc etc and most of those are abbreviations.  This little mutator (probably a mutator anyway) will ensure that the bots all say &quot;gg&quot;, or &quot;well get ya next time&quot; at the end of the level.  If you type in &quot;n1&quot; or &quot;gs&quot; after being killed by a bot then the bot will reply with a &quot;ta :)&quot;.  There's probably a few other variations I can add in here, and those along with &quot;bot talking to bot&quot; interactions should make it rather more believable.  One thing I'm not going to add is anything even remotely abusive or offensive.  I'm aiming for a sort of &quot;friendly - smug&quot; kind of environment here.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Birelli:''' A few more exchanges for the bots:
#After every cap, teamate bots could say &quot;gj&quot; or &quot;nice cap&quot;
#If there are teamates nearby when a bot caps they could say &quot;thx for the cover&quot; and any nearby bot to that could say 3 seconds later &quot;np&quot;
#If there are more than 3 opponents within ~1024 world units of the flag and the bot dies while within that radius of the opponent's flag they could say &quot;someone pitch a tent&quot; :smile:
#If a player that kills them was within the same ~256 world unit radius for, say, 15 seconds, the bot could say something about campers (but it has to be something self-deprecating, it can't be a flame, I'm not sure exactly what)
#I'm not sure how well it would work but after the first minute or so of gameplay a couple random bots could say &quot;lo&quot; to any incoming player, or if a bot comes in to replace an outgoing player they could say &quot;lo all&quot; or &quot;hi all&quot;

All of these could use some variations like &quot;&gt;&gt;&gt;Nice Cap &quot;x&quot;&lt;&lt;&lt; with the name of the player who capped for instance, and of course randomness is a necessity, and the lower down a player is on the overall frag list the more likely they should be to chat or something like that, and the higher up the more likely to say &quot;thx for cover&quot; and &quot;nice cap&quot; and stuff. That's just the feeling I've gotten about who tends to say different things.

Also, the game should fake a ping for all the bots (something ~100 for bots doing well dropping off to ~300 for bots getting nailed a lot).

'''Birelli:''' I just had another though, the server could keep a list in a .ini file of different amounts of player times and top players could be met with bots saying &quot;oh darn, and we were winning too&quot;, or even (and this would be hilarious) &quot;I've got no chance against 'Player X', I'm out&quot; and be replaced by a different bot (that would have to have a VERY low chance of happening and only if the bot wasn't currently engaged). Players with just lots of minutes on the server could have bots say &quot;lo 'Player X'&quot; or some variation thereof.

'''EntropicLqd:'''  lol.  Very sweet ideas.  I love the idea of a bot bailing out just because a &quot;scary&quot; player comes on-line.  And faking a ping for them - hee hee.

'''The Twiggman''' Great idea. Just like quake 3. You can say something to a bot and they will chat back. Fun to get your rage out. Would be quite intresting to see bots behave much like players by bailing in and out of the game. You could maybe set an open game and the bots can pop in and out and pop caps at the same time.

'''JaFO :''' So other people have had the same idea ... I've been thinking about making a &quot;bitching Betty&quot;-type bot too.

Like Eliza-chatprograms (or is it Elisa ?) it reacts to player-messages and possibly add a few comments of its own. Perhaps even different personalities ...

'''Dezro:''' (Player): $uck 1t, b1tche$! (Bot): Why do you say $uck 1i, b1tche$? (Player): WTF? (Bot): I would appreciate it if you would continue. (Player): STFU, bitch! (Bot): Is it because of your sex life that you say STFU, bitch?

'''Piglet:''' Sounds like an intresting idea,  I think it could be 'fairly' intresting to program too.  However i dont really have the skills to setup the interface for the bots to talk through if you know what i mean.  It would also be nice to load text from some sort of .cht file or whatever, again i have no clue how this would be done :(

'''SabbathCat:''' Some guy made a talking Titan mod for DeathMatch levels in a couple of [[Legacy:UT|UT]] maps . Worked pretty well, looked good when you had 4 talking at once. There wasn't any Chat AI as such though, just a bunch of taunts called from a list randomly at regular intervals or after a frag/death. Would it be possible to parse previous player text and pick up on words and retort back, like JaFo talks about? 

'''Foxpaw:''' I think that would get a bit crazy if you play games with lots of bots. (over 10 a side sometimes) Making the bots seem more like human players would probrably be a good thing though.

'''Lev:''' I’m planning on something similar to this as an entry to the make something unreal contest. The talkative side would be a more minor feature in this thou. What I plan to do is take all the attributes of players that really ruin a game and modify a bot to act like that because that is what is really missing from offline botmatches the idiots! Called IdiBots they would do such things as in Bombing Run you would pass them the ball and they would start running to your own goal and pass the ball to the other team, in team matches (with FF off) would repeatable shoot you even thou it they can't hurt you and try to telefrag you with the translocator. The talkative side would come in when you tried talk to them, just like in real life they would start hurling mom put downs at you. Of course they would all have 3ll3t speak names and when they leave they would say something along the lines of “gtg my mom needs the computer.”

'''Kerlin:''' Something by the Drunken Snipers already does this, I think. It's called Bullshit. Sorry, don't have a link handy.

'''Lev:''' Yes i know of that by our very own [[Legacy:El_Muerte_TDS|El_Muerte_TDS]], link to Bullshit on his page :)

'''Sweavo:''' if you want to go teh hardcore, look up A.L.I.C.E. on teh net and build a full on A.I. conversation engine into the bot - and get banned from most servers for the ridiculous extra load :-)</text>
    </revision>
    <revision>
      <id>33740</id>
      <timestamp>2008-12-20T04:19:44Z</timestamp>
      <contributor>
        <username>RicsiTleto</username>
        <id>1780</id>
      </contributor>
      <comment>lilierace</comment>
      <text xml:space="preserve">letodartroco
{{classbox|Mod ideas for UT2003 &amp;ndash; When is a bot not a bot?  When it talks back}}

==Description ==

When you play on public servers for a while you realise that there are only a couple of things people every say, like &quot;gg&quot;, &quot;n1&quot;, &quot;gs&quot; etc etc and most of those are abbreviations.  This little mutator (probably a mutator anyway) will ensure that the bots all say &quot;gg&quot;, or &quot;well get ya next time&quot; at the end of the level.  If you type in &quot;n1&quot; or &quot;gs&quot; after being killed by a bot then the bot will reply with a &quot;ta :)&quot;.  There's probably a few other variations I can add in here, and those along with &quot;bot talking to bot&quot; interactions should make it rather more believable.  One thing I'm not going to add is anything even remotely abusive or offensive.  I'm aiming for a sort of &quot;friendly - smug&quot; kind of environment here.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Birelli:''' A few more exchanges for the bots:
#After every cap, teamate bots could say &quot;gj&quot; or &quot;nice cap&quot;
#If there are teamates nearby when a bot caps they could say &quot;thx for the cover&quot; and any nearby bot to that could say 3 seconds later &quot;np&quot;
#If there are more than 3 opponents within ~1024 world units of the flag and the bot dies while within that radius of the opponent's flag they could say &quot;someone pitch a tent&quot; :smile:
#If a player that kills them was within the same ~256 world unit radius for, say, 15 seconds, the bot could say something about campers (but it has to be something self-deprecating, it can't be a flame, I'm not sure exactly what)
#I'm not sure how well it would work but after the first minute or so of gameplay a couple random bots could say &quot;lo&quot; to any incoming player, or if a bot comes in to replace an outgoing player they could say &quot;lo all&quot; or &quot;hi all&quot;

All of these could use some variations like &quot;&gt;&gt;&gt;Nice Cap &quot;x&quot;&lt;&lt;&lt; with the name of the player who capped for instance, and of course randomness is a necessity, and the lower down a player is on the overall frag list the more likely they should be to chat or something like that, and the higher up the more likely to say &quot;thx for cover&quot; and &quot;nice cap&quot; and stuff. That's just the feeling I've gotten about who tends to say different things.

Also, the game should fake a ping for all the bots (something ~100 for bots doing well dropping off to ~300 for bots getting nailed a lot).

'''Birelli:''' I just had another though, the server could keep a list in a .ini file of different amounts of player times and top players could be met with bots saying &quot;oh darn, and we were winning too&quot;, or even (and this would be hilarious) &quot;I've got no chance against 'Player X', I'm out&quot; and be replaced by a different bot (that would have to have a VERY low chance of happening and only if the bot wasn't currently engaged). Players with just lots of minutes on the server could have bots say &quot;lo 'Player X'&quot; or some variation thereof.

'''EntropicLqd:'''  lol.  Very sweet ideas.  I love the idea of a bot bailing out just because a &quot;scary&quot; player comes on-line.  And faking a ping for them - hee hee.

'''The Twiggman''' Great idea. Just like quake 3. You can say something to a bot and they will chat back. Fun to get your rage out. Would be quite intresting to see bots behave much like players by bailing in and out of the game. You could maybe set an open game and the bots can pop in and out and pop caps at the same time.

'''JaFO :''' So other people have had the same idea ... I've been thinking about making a &quot;bitching Betty&quot;-type bot too.

Like Eliza-chatprograms (or is it Elisa ?) it reacts to player-messages and possibly add a few comments of its own. Perhaps even different personalities ...

'''Dezro:''' (Player): $uck 1t, b1tche$! (Bot): Why do you say $uck 1i, b1tche$? (Player): WTF? (Bot): I would appreciate it if you would continue. (Player): STFU, bitch! (Bot): Is it because of your sex life that you say STFU, bitch?

'''Piglet:''' Sounds like an intresting idea,  I think it could be 'fairly' intresting to program too.  However i dont really have the skills to setup the interface for the bots to talk through if you know what i mean.  It would also be nice to load text from some sort of .cht file or whatever, again i have no clue how this would be done :(

'''SabbathCat:''' Some guy made a talking Titan mod for DeathMatch levels in a couple of [[Legacy:UT|UT]] maps . Worked pretty well, looked good when you had 4 talking at once. There wasn't any Chat AI as such though, just a bunch of taunts called from a list randomly at regular intervals or after a frag/death. Would it be possible to parse previous player text and pick up on words and retort back, like JaFo talks about? 

'''Foxpaw:''' I think that would get a bit crazy if you play games with lots of bots. (over 10 a side sometimes) Making the bots seem more like human players would probrably be a good thing though.

'''Lev:''' Iâm planning on something similar to this as an entry to the make something unreal contest. The talkative side would be a more minor feature in this thou. What I plan to do is take all the attributes of players that really ruin a game and modify a bot to act like that because that is what is really missing from offline botmatches the idiots! Called IdiBots they would do such things as in Bombing Run you would pass them the ball and they would start running to your own goal and pass the ball to the other team, in team matches (with FF off) would repeatable shoot you even thou it they can't hurt you and try to telefrag you with the translocator. The talkative side would come in when you tried talk to them, just like in real life they would start hurling mom put downs at you. Of course they would all have 3ll3t speak names and when they leave they would say something along the lines of âgtg my mom needs the computer.â

'''Kerlin:''' Something by the Drunken Snipers already does this, I think. It's called Bullshit. Sorry, don't have a link handy.

'''Lev:''' Yes i know of that by our very own [[Legacy:El_Muerte_TDS|El_Muerte_TDS]], link to Bullshit on his page :)

'''Sweavo:''' if you want to go teh hardcore, look up A.L.I.C.E. on teh net and build a full on A.I. conversation engine into the bot - and get banned from most servers for the ridiculous extra load :-)

'''T-1:''' I would recommend having a look at Markov Chains.</text>
    </revision>
    <revision>
      <id>33741</id>
      <timestamp>2008-12-20T06:04:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/RicsiTleto|RicsiTleto]] ([[User talk:RicsiTleto|Talk]]); changed back to last version by [[User:T1|T1]]</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003 &amp;ndash; When is a bot not a bot?  When it talks back}}

==Description ==

When you play on public servers for a while you realise that there are only a couple of things people every say, like &quot;gg&quot;, &quot;n1&quot;, &quot;gs&quot; etc etc and most of those are abbreviations.  This little mutator (probably a mutator anyway) will ensure that the bots all say &quot;gg&quot;, or &quot;well get ya next time&quot; at the end of the level.  If you type in &quot;n1&quot; or &quot;gs&quot; after being killed by a bot then the bot will reply with a &quot;ta :)&quot;.  There's probably a few other variations I can add in here, and those along with &quot;bot talking to bot&quot; interactions should make it rather more believable.  One thing I'm not going to add is anything even remotely abusive or offensive.  I'm aiming for a sort of &quot;friendly - smug&quot; kind of environment here.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Birelli:''' A few more exchanges for the bots:
#After every cap, teamate bots could say &quot;gj&quot; or &quot;nice cap&quot;
#If there are teamates nearby when a bot caps they could say &quot;thx for the cover&quot; and any nearby bot to that could say 3 seconds later &quot;np&quot;
#If there are more than 3 opponents within ~1024 world units of the flag and the bot dies while within that radius of the opponent's flag they could say &quot;someone pitch a tent&quot; :smile:
#If a player that kills them was within the same ~256 world unit radius for, say, 15 seconds, the bot could say something about campers (but it has to be something self-deprecating, it can't be a flame, I'm not sure exactly what)
#I'm not sure how well it would work but after the first minute or so of gameplay a couple random bots could say &quot;lo&quot; to any incoming player, or if a bot comes in to replace an outgoing player they could say &quot;lo all&quot; or &quot;hi all&quot;

All of these could use some variations like &quot;&gt;&gt;&gt;Nice Cap &quot;x&quot;&lt;&lt;&lt; with the name of the player who capped for instance, and of course randomness is a necessity, and the lower down a player is on the overall frag list the more likely they should be to chat or something like that, and the higher up the more likely to say &quot;thx for cover&quot; and &quot;nice cap&quot; and stuff. That's just the feeling I've gotten about who tends to say different things.

Also, the game should fake a ping for all the bots (something ~100 for bots doing well dropping off to ~300 for bots getting nailed a lot).

'''Birelli:''' I just had another though, the server could keep a list in a .ini file of different amounts of player times and top players could be met with bots saying &quot;oh darn, and we were winning too&quot;, or even (and this would be hilarious) &quot;I've got no chance against 'Player X', I'm out&quot; and be replaced by a different bot (that would have to have a VERY low chance of happening and only if the bot wasn't currently engaged). Players with just lots of minutes on the server could have bots say &quot;lo 'Player X'&quot; or some variation thereof.

'''EntropicLqd:'''  lol.  Very sweet ideas.  I love the idea of a bot bailing out just because a &quot;scary&quot; player comes on-line.  And faking a ping for them - hee hee.

'''The Twiggman''' Great idea. Just like quake 3. You can say something to a bot and they will chat back. Fun to get your rage out. Would be quite intresting to see bots behave much like players by bailing in and out of the game. You could maybe set an open game and the bots can pop in and out and pop caps at the same time.

'''JaFO :''' So other people have had the same idea ... I've been thinking about making a &quot;bitching Betty&quot;-type bot too.

Like Eliza-chatprograms (or is it Elisa ?) it reacts to player-messages and possibly add a few comments of its own. Perhaps even different personalities ...

'''Dezro:''' (Player): $uck 1t, b1tche$! (Bot): Why do you say $uck 1i, b1tche$? (Player): WTF? (Bot): I would appreciate it if you would continue. (Player): STFU, bitch! (Bot): Is it because of your sex life that you say STFU, bitch?

'''Piglet:''' Sounds like an intresting idea,  I think it could be 'fairly' intresting to program too.  However i dont really have the skills to setup the interface for the bots to talk through if you know what i mean.  It would also be nice to load text from some sort of .cht file or whatever, again i have no clue how this would be done :(

'''SabbathCat:''' Some guy made a talking Titan mod for DeathMatch levels in a couple of [[Legacy:UT|UT]] maps . Worked pretty well, looked good when you had 4 talking at once. There wasn't any Chat AI as such though, just a bunch of taunts called from a list randomly at regular intervals or after a frag/death. Would it be possible to parse previous player text and pick up on words and retort back, like JaFo talks about? 

'''Foxpaw:''' I think that would get a bit crazy if you play games with lots of bots. (over 10 a side sometimes) Making the bots seem more like human players would probrably be a good thing though.

'''Lev:''' I’m planning on something similar to this as an entry to the make something unreal contest. The talkative side would be a more minor feature in this thou. What I plan to do is take all the attributes of players that really ruin a game and modify a bot to act like that because that is what is really missing from offline botmatches the idiots! Called IdiBots they would do such things as in Bombing Run you would pass them the ball and they would start running to your own goal and pass the ball to the other team, in team matches (with FF off) would repeatable shoot you even thou it they can't hurt you and try to telefrag you with the translocator. The talkative side would come in when you tried talk to them, just like in real life they would start hurling mom put downs at you. Of course they would all have 3ll3t speak names and when they leave they would say something along the lines of “gtg my mom needs the computer.”

'''Kerlin:''' Something by the Drunken Snipers already does this, I think. It's called Bullshit. Sorry, don't have a link handy.

'''Lev:''' Yes i know of that by our very own [[Legacy:El_Muerte_TDS|El_Muerte_TDS]], link to Bullshit on his page :)

'''Sweavo:''' if you want to go teh hardcore, look up A.L.I.C.E. on teh net and build a full on A.I. conversation engine into the bot - and get banned from most servers for the ridiculous extra load :-)

'''T-1:''' I would recommend having a look at Markov Chains.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Team King Of The Hill</title>
    <id>2024</id>
    <revision>
      <id>4938</id>
      <timestamp>2007-08-31T16:14:57Z</timestamp>
      <contributor>
        <ip>Sopa De Letras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Team King of the Hill ==

Quick descriptio: Works the same way as it in Unreal 1, the only difference is that two teams can play it, each one having its own &quot;king&quot;.

'''Capture the King variant'''

Instead of scoring frags each team would need to kill the other team's king in order to score.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Team Switch UT</title>
    <id>1993</id>
    <revision>
      <id>4873</id>
      <timestamp>2004-01-29T20:29:43Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Team Switch (UT)==

Basicaly this works like the DOM control point. The trigger has 4 different outevents, one for each team.

I thought it may be usefull in domination but could be used for anything really.

===Here goes===

The trigger will change its outevent based on the team color of the last player to activate it.

So you could place it next to a DOM control point, which ever team is in possesion of the CP will also be in control of the trigger. Each CP has a TeamSwitch, linked up to a door or bridge or something to another area.

You have to get all of TeamSwith to your team color before the door will open.

===Script===

I'm still learning Uscript, its gonna be if/else, if/else

Need to see what the Uscript is for teams and such like.

Back soon

'''Ticalion''' :D</text>
    </revision>
    <revision>
      <id>4874</id>
      <timestamp>2004-01-29T14:04:50Z</timestamp>
      <contributor>
        <ip>Ticalion</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Team Switch (UT)==

Basicaly this works like the DOM control point. The trigger has 4 different outevents, one for each team.

I thought it may be usefull in domination but could be used for anything really.

===Here goes===

The triger will change its outevent based on the team color of the last player to activate it.

So you could palce it next to a DOM control point, which ever team is in possesion of the CP will also be in

control of the trigger. Each CP has a TeamSwitch, linked up to a door or bridge or something to another area.

You have to get all of TeamSwith to your team color before the door will open.

===Script===

I'm still learning Uscript, 

its gonna be if/else, if/else

Need to see what the Uscript is for teams and such like.

Back soon

[Ticalion] :D</text>
    </revision>
    <revision>
      <id>4875</id>
      <timestamp>2004-01-29T15:59:19Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Team Switch (UT)==

Basicaly this works like the DOM control point. The trigger has 4 different outevents, one for each team.

I thought it may be usefull in domination but could be used for anything really.

===Here goes===

The triger will change its outevent based on the team color of the last player to activate it.

So you could place it next to a DOM control point, which ever team is in possesion of the CP will also be in control of the trigger. Each CP has a TeamSwitch, linked up to a door or bridge or something to another area.

You have to get all of TeamSwith to your team color before the door will open.

===Script===

I'm still learning Uscript, its gonna be if/else, if/else

Need to see what the Uscript is for teams and such like.

Back soon

'''Ticalion''' :D</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TeamWeaponArena</title>
    <id>1988</id>
    <revision>
      <id>4861</id>
      <timestamp>2004-02-23T16:37:37Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <minor/>
      <comment>Typo</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; TeamWeaponArena}}

==Description ==

This mod was inspired by a Normal Weapons vs Instagib mutator.  It allows the following to be specified on a team by team basis:
* The weapons a player can start with
* The weapons a player can collect
* The items a player can collect

In addition to the above there is an option to allow all weapon and ammunition pickups to contain maximum ammunition.  It is also possible to specify which items are to be removed from the map altogether.

====Completed Versions====

{{classbox| UT:: The Unreal Tournament version of this mod is available here: http://www.snout-clan.co.uk/page.php?p=m}}

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EntropicLqd:''' I'll be working on a UT2004 version of this 

'''NickR:''' I'm might have a crack at this. Sounds like a fun mutator. Give me a week or so, my damn job gives me no decent time to work on my mods! :(

'''EntropicLqd:''' I feel (and share) your pain.

'''NickR:''' I've begun working on this now. I'll have the first version available soon.

'''EntropicLqd:''' Would you like a copy of the code for the UT version?

'''CH3Z:''' Ahh cool! This is what i would have done instead of InstaVsSniper, had I more experience in scripting. I would very much like to know when this is available. I'm very interested to see the code, and what all was involved. =) I'll be checking back here.

'''EntropicLqd:''' It's finished (as far as I can tell anyway) - I just haven't had time to actually release it.  I'll endevour to do that tonight.  There are a ton of improvements that could be made to it as the configuration is not as simple as I'd like.  I'm not to convinced about some of the code either but I can't think of a betterway of doing it at the moment.

'''EntropicLqd:''' Not going to be able to release it tonight.  Send me an email (entropic'''at'''snout-clan.co.uk) and I'll send you a copy.  I might even try and comment the code a bit more so you can see what's going on.  It's not that badly commented but could probably do with a bit of going over.

==Discussion ==</text>
    </revision>
    <revision>
      <id>4862</id>
      <timestamp>2004-02-22T13:56:25Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>UT version released - why doesn't the icon work?</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; TeamWeaponArena}}

==Description ==

This mod was inspired by a Normal Weapons vs Instagib mutator.  It allows the following to be specified on a team by team basis:
* The weapons a player can start with
* The weapons a player can collect
* The items a player can collect

In addition to the above there is an option to allow all weapon and ammunition pickups to contain maximum ammunition.  It is also possible to specify which items are to be removed from the map altogether.

====Completed Versions====
:ut: The Unreal Tournament version of this mod is available here: http://www.snout-clan.co.uk/page.php?p=m

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EntropicLqd:''' I'll be working on a UT2004 version of this 

'''NickR:''' I'm might have a crack at this. Sounds like a fun mutator. Give me a week or so, my damn job gives me no decent time to work on my mods! :(

'''EntropicLqd:''' I feel (and share) your pain.

'''NickR:''' I've begun working on this now. I'll have the first version available soon.

'''EntropicLqd:''' Would you like a copy of the code for the UT version?

'''CH3Z:''' Ahh cool! This is what i would have done instead of InstaVsSniper, had I more experience in scripting. I would very much like to know when this is available. I'm very interested to see the code, and what all was involved. =) I'll be checking back here.

'''EntropicLqd:''' It's finished (as far as I can tell anyway) - I just haven't had time to actually release it.  I'll endevour to do that tonight.  There are a ton of improvements that could be made to it as the configuration is not as simple as I'd like.  I'm not to convinced about some of the code either but I can't think of a betterway of doing it at the moment.

'''EntropicLqd:''' Not going to be able to release it tonight.  Send me an email (entropic'''at'''snout-clan.co.uk) and I'll send you a copy.  I might even try and comment the code a bit more so you can see what's going on.  It's not that badly commented but could probably do with a bit of going over.

==Discussion ==</text>
    </revision>
    <revision>
      <id>4863</id>
      <timestamp>2004-02-23T14:22:23Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>corrected markup.  Shame the emoticon syntax doesn't work</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; TeamWeaponArena}}

==Description ==

This mod was inspired by a Normal Weapons vs Instagib mutator.  It allows the following to be specified on a team by team basis:
* The weapons a player can start with
* The weapons a player can collect
* The items a player can collect

In addition to the above there is an option to allow all weapon and ammunition pickups to contain maximum ammunition.  It is also possible to specify which items are to be removed from the map altogether.

====Completed Versions====

{{classbox| UT:: The Unreal Tourmanet version of this mod is available here: http://www.snout-clan.co.uk/page.php?p=m}}

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''EntropicLqd:''' I'll be working on a UT2004 version of this 

'''NickR:''' I'm might have a crack at this. Sounds like a fun mutator. Give me a week or so, my damn job gives me no decent time to work on my mods! :(

'''EntropicLqd:''' I feel (and share) your pain.

'''NickR:''' I've begun working on this now. I'll have the first version available soon.

'''EntropicLqd:''' Would you like a copy of the code for the UT version?

'''CH3Z:''' Ahh cool! This is what i would have done instead of InstaVsSniper, had I more experience in scripting. I would very much like to know when this is available. I'm very interested to see the code, and what all was involved. =) I'll be checking back here.

'''EntropicLqd:''' It's finished (as far as I can tell anyway) - I just haven't had time to actually release it.  I'll endevour to do that tonight.  There are a ton of improvements that could be made to it as the configuration is not as simple as I'd like.  I'm not to convinced about some of the code either but I can't think of a betterway of doing it at the moment.

'''EntropicLqd:''' Not going to be able to release it tonight.  Send me an email (entropic'''at'''snout-clan.co.uk) and I'll send you a copy.  I might even try and comment the code a bit more so you can see what's going on.  It's not that badly commented but could probably do with a bit of going over.

==Discussion ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TheHunt</title>
    <id>1975</id>
    <revision>
      <id>4831</id>
      <timestamp>2005-07-22T19:24:28Z</timestamp>
      <contributor>
        <ip>64-110-208-223.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; TheHunt}}

==Description ==

Ok. The Hunt is simple. There are two teams, the Hunters and the Hunted. However, there is only one Hunted, the rest of the players are the Hunters. The Hunters try to hunt down and kill the Hunted. The Hunted has the same stats as the Hunters, except he has 1.1 times their run speed, has 2 times the jump height, has a translocator, and becomes invisible (total invisibility, not like the adrenaline combo.) if he doesn't run, strafe or jump, or fire for a few seconds. The invisibility wears off if the Hunted performs one of those actions. The Hunted's weapons are silent when fired, however, they still play impact sounds. The game is broken up into rounds, until either the time limit or the point limit is reached. The round ends when the Hunted are dead or when all of the Hunters are dead. The Hunted is chosen randomly, and the Hunters are NOT informed as to who they are hunting. The levels would be designed with lots of hiding places, with rafters to hide on, pillars and crates to hide behind, airvents to crawl through, shortcuts that only the Hunted or the Hunters can use (to prevent people from abusing this, the doors on both ends of the shortcut would stay open until everyone inside leaves.). The levels would have darker areas to hide in. There should be some rooms that have traps like a giant fan that sucks people in that you can activate with the push of a button, but there should be an advantage in there, like a powerup or it's a shortcut (like UT's the pressure room in DM-Pressure). There would be no team-chat channel, so the Hunted can see all conversations of the Hunters, however, the chat can only received if you're within a certain distance of the sender. You can't listen to chat across the level. Also, the Hunted has a timer that starts at 4 minutes, and when it reaches zero, he dies. The timer resets whenever the Hunted does damage to someone. Vehicles are allowed, however, not recommended.

There should be some new weapons:

Turret - Basically a portable link turret you can place. Smaller and less health than the full size one. dormant until  activated with secondary fire.

ammo per pickup: 1

max ammo: 3

Claymore - remote detonated explosive. black, so it's a little hard to see in a dark area.

ammo per pickup: 1

max ammo: 5

Warlord spawner - remote activated machine that spawns a Warlord in its position.

ammo per pickup: 1

max ammo: 2

Repulsor mines - remote activated mine that does tons of knockback, little damage. useful to push people into traps or to slow people down when fleeing.

ammo per pickup: 3

max ammo: 6

Flame claymore - remote detonated explosive. creates a large fire that does damage over time, takes something around 15 seconds to extinguish.

ammo per pickup: 1

max ammo: 5

Hologram -  No ammo. Can record and playback a fake version of your actions of up to 10 seconds. Toggle recording with primary fire, playback recorded actions with secondary fire (NOTE: this may be a bit hard to implement.). Good for a decoy.

The scoring works like this:

5 points for the Hunted killing a Hunter

However many kills (not points) the Hunted has gotten in that round points for a Hunter killing the Hunted, plus one.

1 point for a Hunter killing a turret or a warlord

For surviving the round you get as many points as the number of players.

==Discussion ==

'''T1:''' Discuss here.

'''Foxpaw:''' Are you sure this mod doesn't already exist? I recall making a suggestion at one point (which was not that different from this one) and someone remarked that it sounded like a &quot;hunted variant.&quot;

'''MythOpus:''' Indeed it does exist.  I've played it :|

'''T1:''' WHAT? Really? for once I thought I had an original idea. Ok, someone delete this, then. :(

'''MythOpus:''' Well, the actual mod isn't exactly like this... but I believe it is pretty similar.</text>
    </revision>
    <revision>
      <id>4832</id>
      <timestamp>2005-07-22T18:41:59Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>I believe &quot;Delete Me&quot; is the magic word...</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; TheHunt}}

==Description ==

Ok. The Hunt is simple. There are two teams, the Hunters and the Hunted. However, there is only one Hunted, the rest of the players are the Hunters. The Hunters try to hunt down and kill the Hunted. The Hunted has the same stats as the Hunters, except he has 1.1 times their run speed, has 2 times the jump height, has a translocator, and becomes invisible (total invisibility, not like the adrenaline combo.) if he doesn't run, strafe or jump, or fire for a few seconds. The invisibility wears off if the Hunted performs one of those actions. The Hunted's weapons are silent when fired, however, they still play impact sounds. The game is broken up into rounds, until either the time limit or the point limit is reached. The round ends when the Hunted are dead or when all of the Hunters are dead. The Hunted is chosen randomly, and the Hunters are NOT informed as to who they are hunting. The levels would be designed with lots of hiding places, with rafters to hide on, pillars and crates to hide behind, airvents to crawl through, shortcuts that only the Hunted or the Hunters can use (to prevent people from abusing this, the doors on both ends of the shortcut would stay open until everyone inside leaves.). The levels would have darker areas to hide in. There should be some rooms that have traps like a giant fan that sucks people in that you can activate with the push of a button, but there should be an advantage in there, like a powerup or it's a shortcut (like UT's the pressure room in DM-Pressure). There would be no team-chat channel, so the Hunted can see all conversations of the Hunters, however, the chat can only received if you're within a certain distance of the sender. You can't listen to chat across the level. Also, the Hunted has a timer that starts at 4 minutes, and when it reaches zero, he dies. The timer resets whenever the Hunted does damage to someone. Vehicles are allowed, however, not recommended.

There should be some new weapons:

Turret - Basically a portable link turret you can place. Smaller and less health than the full size one. dormant until  activated with secondary fire.

ammo per pickup: 1

max ammo: 3

Claymore - remote detonated explosive. black, so it's a little hard to see in a dark area.

ammo per pickup: 1

max ammo: 5

Warlord spawner - remote activated machine that spawns a Warlord in its position.

ammo per pickup: 1

max ammo: 2

Repulsor mines - remote activated mine that does tons of knockback, little damage. useful to push people into traps or to slow people down when fleeing.

ammo per pickup: 3

max ammo: 6

Flame claymore - remote detonated explosive. creates a large fire that does damage over time, takes something around 15 seconds to extinguish.

ammo per pickup: 1

max ammo: 5

Hologram -  No ammo. Can record and playback a fake version of your actions of up to 10 seconds. Toggle recording with primary fire, playback recorded actions with secondary fire (NOTE: this may be a bit hard to implement.). Good for a decoy.

The scoring works like this:

5 points for the Hunted killing a Hunter

However many kills (not points) the Hunted has gotten in that round points for a Hunter killing the Hunted, plus one.

1 point for a Hunter killing a turret or a warlord

For surviving the round you get as many points as the number of players.

==Discussion ==

'''T1:''' Discuss here.

'''Foxpaw:''' Are you sure this mod doesn't already exist? I recall making a suggestion at one point (which was not that different from this one) and someone remarked that it sounded like a &quot;hunted variant.&quot;

'''MythOpus:''' Indeed it does exist.  I've played it :|

'''T1:''' WHAT? Really? for once I thought I had an original idea. Ok, someone delete this, then. :(</text>
    </revision>
    <revision>
      <id>10781</id>
      <timestamp>2008-04-04T19:38:11Z</timestamp>
      <contributor>
        <username>MinisterFish</username>
        <id>86</id>
      </contributor>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; TheHunt}}

==Description ==

Ok. The Hunt is simple. There are two teams, the Hunters and the Hunted. However, there is only one Hunted, the rest of the players are the Hunters. The Hunters try to hunt down and kill the Hunted. The Hunted has the same stats as the Hunters, except he has 1.1 times their run speed, has 2 times the jump height, has a translocator, and becomes invisible (total invisibility, not like the adrenaline combo.) if he doesn't run, strafe or jump, or fire for a few seconds. The invisibility wears off if the Hunted performs one of those actions. The Hunted's weapons are silent when fired, however, they still play impact sounds. The game is broken up into rounds, until either the time limit or the point limit is reached. The round ends when the Hunted are dead or when all of the Hunters are dead. The Hunted is chosen randomly, and the Hunters are NOT informed as to who they are hunting. The levels would be designed with lots of hiding places, with rafters to hide on, pillars and crates to hide behind, airvents to crawl through, shortcuts that only the Hunted or the Hunters can use (to prevent people from abusing this, the doors on both ends of the shortcut would stay open until everyone inside leaves.). The levels would have darker areas to hide in. There should be some rooms that have traps like a giant fan that sucks people in that you can activate with the push of a button, but there should be an advantage in there, like a powerup or it's a shortcut (like UT's the pressure room in DM-Pressure). There would be no team-chat channel, so the Hunted can see all conversations of the Hunters, however, the chat can only received if you're within a certain distance of the sender. You can't listen to chat across the level. Also, the Hunted has a timer that starts at 4 minutes, and when it reaches zero, he dies. The timer resets whenever the Hunted does damage to someone. Vehicles are allowed, however, not recommended.

There should be some new weapons:

Turret - Basically a portable link turret you can place. Smaller and less health than the full size one. dormant until  activated with secondary fire.

ammo per pickup: 1

max ammo: 3

Claymore - remote detonated explosive. black, so it's a little hard to see in a dark area.

ammo per pickup: 1

max ammo: 5

Warlord spawner - remote activated machine that spawns a Warlord in its position.

ammo per pickup: 1

max ammo: 2

Repulsor mines - remote activated mine that does tons of knockback, little damage. useful to push people into traps or to slow people down when fleeing.

ammo per pickup: 3

max ammo: 6

Flame claymore - remote detonated explosive. creates a large fire that does damage over time, takes something around 15 seconds to extinguish.

ammo per pickup: 1

max ammo: 5

Hologram -  No ammo. Can record and playback a fake version of your actions of up to 10 seconds. Toggle recording with primary fire, playback recorded actions with secondary fire (NOTE: this may be a bit hard to implement.). Good for a decoy.

The scoring works like this:

5 points for the Hunted killing a Hunter

However many kills (not points) the Hunted has gotten in that round points for a Hunter killing the Hunted, plus one.

1 point for a Hunter killing a turret or a warlord

For surviving the round you get as many points as the number of players.

==Discussion ==

'''T1:''' Discuss here.

'''Foxpaw:''' Are you sure this mod doesn't already exist? I recall making a suggestion at one point (which was not that different from this one) and someone remarked that it sounded like a &quot;hunted variant.&quot;

'''MythOpus:''' Indeed it does exist.  I've played it :|

'''T1:''' WHAT? Really? for once I thought I had an original idea. Ok, someone delete this, then. :(

'''MythOpus:''' Well, the actual mod isn't exactly like this... but I believe it is pretty similar.
'''MinisterFish:''' I made a gametype for UT that was called TeamHunt. I went as far as having some people test it, but didn't finish polishing because most people have already moved on to the newer games. It does work and you can find more info at http://forums.beyondunreal.com/showthread.php?p=1454787 This is a little different than your idea though. I went through the thought of combining Team Deathmatch, Last Man Standing, and time based round objective like Assault for the game. There's a download at the link I posted and you can try it out.</text>
    </revision>
    <revision>
      <id>10782</id>
      <timestamp>2008-04-04T19:38:51Z</timestamp>
      <contributor>
        <username>MinisterFish</username>
        <id>86</id>
      </contributor>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2004 &amp;ndash; TheHunt}}

==Description ==

Ok. The Hunt is simple. There are two teams, the Hunters and the Hunted. However, there is only one Hunted, the rest of the players are the Hunters. The Hunters try to hunt down and kill the Hunted. The Hunted has the same stats as the Hunters, except he has 1.1 times their run speed, has 2 times the jump height, has a translocator, and becomes invisible (total invisibility, not like the adrenaline combo.) if he doesn't run, strafe or jump, or fire for a few seconds. The invisibility wears off if the Hunted performs one of those actions. The Hunted's weapons are silent when fired, however, they still play impact sounds. The game is broken up into rounds, until either the time limit or the point limit is reached. The round ends when the Hunted are dead or when all of the Hunters are dead. The Hunted is chosen randomly, and the Hunters are NOT informed as to who they are hunting. The levels would be designed with lots of hiding places, with rafters to hide on, pillars and crates to hide behind, airvents to crawl through, shortcuts that only the Hunted or the Hunters can use (to prevent people from abusing this, the doors on both ends of the shortcut would stay open until everyone inside leaves.). The levels would have darker areas to hide in. There should be some rooms that have traps like a giant fan that sucks people in that you can activate with the push of a button, but there should be an advantage in there, like a powerup or it's a shortcut (like UT's the pressure room in DM-Pressure). There would be no team-chat channel, so the Hunted can see all conversations of the Hunters, however, the chat can only received if you're within a certain distance of the sender. You can't listen to chat across the level. Also, the Hunted has a timer that starts at 4 minutes, and when it reaches zero, he dies. The timer resets whenever the Hunted does damage to someone. Vehicles are allowed, however, not recommended.

There should be some new weapons:

Turret - Basically a portable link turret you can place. Smaller and less health than the full size one. dormant until  activated with secondary fire.

ammo per pickup: 1

max ammo: 3

Claymore - remote detonated explosive. black, so it's a little hard to see in a dark area.

ammo per pickup: 1

max ammo: 5

Warlord spawner - remote activated machine that spawns a Warlord in its position.

ammo per pickup: 1

max ammo: 2

Repulsor mines - remote activated mine that does tons of knockback, little damage. useful to push people into traps or to slow people down when fleeing.

ammo per pickup: 3

max ammo: 6

Flame claymore - remote detonated explosive. creates a large fire that does damage over time, takes something around 15 seconds to extinguish.

ammo per pickup: 1

max ammo: 5

Hologram -  No ammo. Can record and playback a fake version of your actions of up to 10 seconds. Toggle recording with primary fire, playback recorded actions with secondary fire (NOTE: this may be a bit hard to implement.). Good for a decoy.

The scoring works like this:

5 points for the Hunted killing a Hunter

However many kills (not points) the Hunted has gotten in that round points for a Hunter killing the Hunted, plus one.

1 point for a Hunter killing a turret or a warlord

For surviving the round you get as many points as the number of players.

==Discussion ==

'''T1:''' Discuss here.

'''Foxpaw:''' Are you sure this mod doesn't already exist? I recall making a suggestion at one point (which was not that different from this one) and someone remarked that it sounded like a &quot;hunted variant.&quot;

'''MythOpus:''' Indeed it does exist.  I've played it :|

'''T1:''' WHAT? Really? for once I thought I had an original idea. Ok, someone delete this, then. :(

'''MythOpus:''' Well, the actual mod isn't exactly like this... but I believe it is pretty similar.

'''MinisterFish:''' I made a gametype for UT that was called TeamHunt. I went as far as having some people test it, but didn't finish polishing because most people have already moved on to the newer games. It does work and you can find more info at http://forums.beyondunreal.com/showthread.php?p=1454787 This is a little different than your idea though. I went through the thought of combining Team Deathmatch, Last Man Standing, and time based round objective like Assault for the game. There's a download at the link I posted and you can try it out.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TheMachine</title>
    <id>1963</id>
    <revision>
      <id>4805</id>
      <timestamp>2006-11-09T23:54:34Z</timestamp>
      <contributor>
        <ip>82-69-80-92.dsl.in-addr.zen.co.uk</ip>
      </contributor>
      <comment>Dead link</comment>
      <text xml:space="preserve">===The Machine===

====Design Treatment, Version 1.0====

====April 2003====

----

====Vacation Gone Bad====

&quot;Here take this and stick it up your nose,&quot; said a bloody man laying on the ship's floor.

Russel just stood there in confusion and wondering why he took a vacation to Mars. &quot;What the hell is this guy talking about? Damn, my heads hurts. Who in the hell hit me in the head? Why, oh why did I have to choose to go to Mars?,&quot; Russel thought to himself.

&quot;Hey, snap out of it! The pilot is dead and YOU need to take control over the ship. So, take this from me.&quot;

Russel was even more confused now. &quot;I can't fly a ship. I'm just an insurance salesman. I'm just trying to have a nice vacation. What do you mean the pilot is dead? Oh my god, we are all going to die!&quot;

&quot;Everybody else is already dead and I'm not far behind. If you want to be able to survive and avoid a permanent vacation, you need to take this from me and stick it up your nose.&quot;

&quot;What the hell are you talking about?&quot; asked Russel as he looked at something with two prong-like attachments protruding from a hand-sized box-shaped device.

----

====Basic Game Concept====

The Machine is an action/adventure role-playing game in which the player finds himself as a character stuck on Mars right in the mix of a confrontation between a Mars commercial/exploration corporation named Athena and an underground resistance movement with the acronym R.A.M. (Resistance Against the Machine). To get off Mars, the player must either help out Athena to put an end to the resistance movement or help the resistance movement topple the Athena Corporation.

----

====Series Structure and Gameplay====

The player will go through eight missions. Depending on a player's action, such as aligning with the resistance or with Athena, the goal of some of the missions will change accordingly. 

====ALMs====

Since the player's character is just an insurance salesman, he needs help to overcome the obstacles in his path to reach the goal of getting off Mars. A new technology called Advanced Learning Modules (ALM's) will help him to do this.

ALM's are devices that one can use by inserting the prongs of the device into one's nostrils, which then the device locates a nerve stem to the brain and then uploads or teaches the brain a new skill or other knowledge that one would normally have to spend many days learning. The player will either be given and/or have to find or purchase these ALM's throughout the game. Skill related ALMs acquired by the player will always be an upgrade if the player already has already acquired that skill. There are three skill levels per ALM except for the vehicle ALM given to the player's character in the opening movie sequence, which has only one. There is a limited amount (ten) of ALM's that the player can be able to use before his brain goes into overload. 

The list of ALMs skills are vehicle, weapons, explosives, environmental training, hacking, and infiltration.

====Weapons====

The weapons in the game will be mostly conventional weapons with a futuristic aspect to them. The weapon list includes a blaster pistol, stun-gun, shotgun, sniper rifle, assault rifle, and rocket launcher. The blaster pistol and stun-gun will be the only weapons that will not need ammo, but they have a charge limit and once that is reached they need to recharge before they can be used again. As the player increases his weapons skill with weapon ALMs, the more effective will the weapons be in damage.

====Explosives====

Explosives in the game can be used to destroy targets in the game or used to clear certain types of obstacles in the game. Explosives in the game will include C4-like explosives, EMP grenades, and conventional-type grenades. The higher level the explosive skill, the higher the effectiveness of the explosives.

====Environmental Training====

Some parts of the game will have hazardous areas that will require that the player use a hazard suit or compression suit to complete his missions. To be able to use these suits, the player will need an environmental training skill. The higher the skill, the longer the player can use the suits. For hazardous areas, such as rooms filled with gas or fire, the higher the skill will lessen the damage taken by the player while using a hazard suit.

====Hacking====

Some areas in the game will be secured by electronic security equipment in which can be bypassed if the player has a skilll in hacking. There is a chance that the player can fail in hacking a system and the failure rate is determined by the player's skill in hacking. The higher the skill, the less chance of failure.

====Infiltration====

For the player to be quieter and avoid being seen and heard, the infiltration skill can give the player an option other than brute force to help complete his missions. This skill will also allow the player to use a disguise kit and uniforms from NPC's to infiltrate an enemy's base. The higher the infiltration skill, the easier it is to avoid detection from enemies.

====The Missions====

'''Training''' - When the player's character first arrives at Mars, he will be informed of the situation between R.A.M and the Athena Corporation, which will explain why he was hit on the head and everybody on board the ship were killed. He then will be told that he can't leave Mars until the situation is under control. For his own safety, he will be given a blaster pistol and a weapons ALM, and the opportunity to test his new skill. This will allow the player to get used to the controls and the interface.

'''Tunnel''' - The player finds out that the tunnel from where he is at, the spaceport, to Athena's commercial district has been sabotaged and blocked. He is allowed the use of an old tunnel boring vehicle to unblock the tunnel. On the way to unblock the tunnel, the player will be met with some resistance from R.A.M. One of the resistors will have a rocket launcher, which could disable the vehicle. If this resistor is killed, the player can loot an explosive ALM from the resistor, which will allow the player to be able to still clear the tunnel.

'''Commercial District''' - After the player unblocks the tunnel, the player will be met by Athena's police chief. The police chief will give information to the player on how to contact a person in a shady part of the commercial district who has information on how to infiltrate the resistance group to find out who is the leader of the resistance movement. Once the player finds this person, he will have to perform a small mission to win this person's trust. Once this is done, this person will give the information on how to infiltrate R.A.M and will offer the player to purchase an infiltration ALM with a disguise kit, a weapons upgrade ALM, different types of weapons, and ammo.

'''R.A.M. Infiltration''' - To find out who the leader of the resistance movement is, the player will try to infiltrate R.A.M by sneaking in or by force. The leader, when found, will not trust the player if the player uses too much force and will escape.. If the player finds the leader without much force, the leader of the resistance movement will try to win the player over to his side. If the player chooses to side with the resistance, the leader will give the player his next mission. If not, the leader will escape.

'''Athena Police Station''' - If the player is now helping the resistance, his mission will be to release a R.A.M. member who is held by the police. If the player is still helping the Athena police, his mission is to go back to the station to report on what he found out about the leader of the resistance movement. In this case, the player will still meet with the prisoner who will also try to persuade the player into joining the resistance. This will give the player another chance to change his course. The player will also be given the information on what R.A.M. is planning on next, which is to destroy the solar power plant to allow the them to try to take over Athena's headquarters.

'''Solar Power Generator''' - If the player is helping R.A.M., the player will be given the mission to destroy a solar power generator, which is located outdoors with a Martian atmosphere. In this case, there will be Athena policeman protecting the generator. If the player is still aligned with the Athena Corporation, his mission will be to help protect the solar power generator from R.A.M.

'''Athena HQ''' - The player will either attack or defend the headquarters depending on which side he is on.

'''Boss''' - After the raid on the headquarters, the player will now have to fight against either the CEO of Athena or the leader of R.A.M. to be able to finally get off Mars and end the game.

----

====Cast of Characters====

'''Russel Paddock''' - This is the character that the player gets to play. Russ is an insurance salesman by trade and doesn't have the look of someone that could be a hero. His goal was to have a relaxing vacation on Mars before he was caught up in the conflict between R.A.M. and then Athena Corporation.

'''Peter Nelsen''' - Peter is the dying man on the same spaceship that Russel was on, which was hi-jacked by R.A.M. members. Peter was on his way back from a meeting on Earth with a company who has an interest in Athena's new technology, ALMs.

'''Paul Brocklesby''' - Paul is the spaceport officer who debriefs Russel about the situation on Mars. Paul is also responsible for the training mission if the player needs it to get used to the controls and interface of the game.

'''Chief Officer Lansky''' - No one calls ''the Chief'' by his first name. The player will meet Officer Lansky after clearing the tunnel.

'''Jake Nixon''' - Jake is the person that Russel searches to find out more information on R.A.M. Jake is an arms dealer by trade and a purveyor of stolen goods for fun.

'''William Emerson''' - Will is the resistance member being held by the Athena police. He is very loyal to the resistance movement but talks a little too much, which allows the police to know beforehand some of the events planned by R.A.M. 

'''Juan De Gauss''' - John, as his friends call him, is the leader of the resistance movement. He fears that Athena is using the new technology of ALMs to manipulate and control people.

'''Alexander Olsen''' - Alex is the CEO of Athena Corporation. Alex is responsible for the building of Athena. He is the Machine.

----

====Look and Feel====

The Machine will be in first person and will use a graphics engine suitable to first person shooters, the Unreal Engine. This will be a mod of an existent game, Unreal 2. The levels will have the look and feel of scenes from movies such as Blade Runner, Johnny Mnuemonic, Nick Fury, Total Recall, and other sci-fi and cyberpunk movies. Inventory, skill, and NPC conversation interface will be similar to that of Deus Ex.

----

====Target Audience====

This game will be suited for people who are interested in mods which extend the gameplay for Unreal 2. This will also be a game for those who like cyberpunk environments and games, such as Deus Ex.

----

Original Document written and updated by Chris &quot;MinisterFish&quot; Voyles at http://www.3dmappers.com/treatment.shtml [dead link]

cvoyles@3dmappers.com</text>
    </revision>
    <revision>
      <id>4806</id>
      <timestamp>2003-05-02T07:30:02Z</timestamp>
      <contributor>
        <ip>MinisterFish</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===The Machine===

====Design Treatment, Version 1.0====

====April 2003====

----

====Vacation Gone Bad====

&quot;Here take this and stick it up your nose,&quot; said a bloody man laying on the ship's floor.

Russel just stood there in confusion and wondering why he took a vacation to Mars. &quot;What the hell is this guy talking about? Damn, my heads hurts. Who in the hell hit me in the head? Why, oh why did I have to choose to go to Mars?,&quot; Russel thought to himself.

&quot;Hey, snap out of it! The pilot is dead and YOU need to take control over the ship. So, take this from me.&quot;

Russel was even more confused now. &quot;I can't fly a ship. I'm just an insurance salesman. I'm just trying to have a nice vacation. What do you mean the pilot is dead? Oh my god, we are all going to die!&quot;

&quot;Everybody else is already dead and I'm not far behind. If you want to be able to survive and avoid a permanent vacation, you need to take this from me and stick it up your nose.&quot;

&quot;What the hell are you talking about?&quot; asked Russel as he looked at something with two prong-like attachments protruding from a hand-sized box-shaped device.

----

====Basic Game Concept====

The Machine is an action/adventure role-playing game in which the player finds himself as a character stuck on Mars right in the mix of a confrontation between a Mars commercial/exploration corporation named Athena and an underground resistance movement with the acronym R.A.M. (Resistance Against the Machine). To get off Mars, the player must either help out Athena to put an end to the resistance movement or help the resistance movement topple the Athena Corporation.

----

====Series Structure and Gameplay====

The player will go through eight missions. Depending on a player's action, such as aligning with the resistance or with Athena, the goal of some of the missions will change accordingly. 

====ALMs====

Since the player's character is just an insurance salesman, he needs help to overcome the obstacles in his path to reach the goal of getting off Mars. A new technology called Advanced Learning Modules (ALM's) will help him to do this.

ALM's are devices that one can use by inserting the prongs of the device into one's nostrils, which then the device locates a nerve stem to the brain and then uploads or teaches the brain a new skill or other knowledge that one would normally have to spend many days learning. The player will either be given and/or have to find or purchase these ALM's throughout the game. Skill related ALMs acquired by the player will always be an upgrade if the player already has already acquired that skill. There are three skill levels per ALM except for the vehicle ALM given to the player's character in the opening movie sequence, which has only one. There is a limited amount (ten) of ALM's that the player can be able to use before his brain goes into overload. 

The list of ALMs skills are vehicle, weapons, explosives, environmental training, hacking, and infiltration.

====Weapons====

The weapons in the game will be mostly conventional weapons with a futuristic aspect to them. The weapon list includes a blaster pistol, stun-gun, shotgun, sniper rifle, assault rifle, and rocket launcher. The blaster pistol and stun-gun will be the only weapons that will not need ammo, but they have a charge limit and once that is reached they need to recharge before they can be used again. As the player increases his weapons skill with weapon ALMs, the more effective will the weapons be in damage.

====Explosives====

Explosives in the game can be used to destroy targets in the game or used to clear certain types of obstacles in the game. Explosives in the game will include C4-like explosives, EMP grenades, and conventional-type grenades. The higher level the explosive skill, the higher the effectiveness of the explosives.

====Environmental Training====

Some parts of the game will have hazardous areas that will require that the player use a hazard suit or compression suit to complete his missions. To be able to use these suits, the player will need an environmental training skill. The higher the skill, the longer the player can use the suits. For hazardous areas, such as rooms filled with gas or fire, the higher the skill will lessen the damage taken by the player while using a hazard suit.

====Hacking====

Some areas in the game will be secured by electronic security equipment in which can be bypassed if the player has a skilll in hacking. There is a chance that the player can fail in hacking a system and the failure rate is determined by the player's skill in hacking. The higher the skill, the less chance of failure.

====Infiltration====

For the player to be quieter and avoid being seen and heard, the infiltration skill can give the player an option other than brute force to help complete his missions. This skill will also allow the player to use a disguise kit and uniforms from NPC's to infiltrate an enemy's base. The higher the infiltration skill, the easier it is to avoid detection from enemies.

====The Missions====

'''Training''' - When the player's character first arrives at Mars, he will be informed of the situation between R.A.M and the Athena Corporation, which will explain why he was hit on the head and everybody on board the ship were killed. He then will be told that he can't leave Mars until the situation is under control. For his own safety, he will be given a blaster pistol and a weapons ALM, and the opportunity to test his new skill. This will allow the player to get used to the controls and the interface.

'''Tunnel''' - The player finds out that the tunnel from where he is at, the spaceport, to Athena's commercial district has been sabotaged and blocked. He is allowed the use of an old tunnel boring vehicle to unblock the tunnel. On the way to unblock the tunnel, the player will be met with some resistance from R.A.M. One of the resistors will have a rocket launcher, which could disable the vehicle. If this resistor is killed, the player can loot an explosive ALM from the resistor, which will allow the player to be able to still clear the tunnel.

'''Commercial District''' - After the player unblocks the tunnel, the player will be met by Athena's police chief. The police chief will give information to the player on how to contact a person in a shady part of the commercial district who has information on how to infiltrate the resistance group to find out who is the leader of the resistance movement. Once the player finds this person, he will have to perform a small mission to win this person's trust. Once this is done, this person will give the information on how to infiltrate R.A.M and will offer the player to purchase an infiltration ALM with a disguise kit, a weapons upgrade ALM, different types of weapons, and ammo.

'''R.A.M. Infiltration''' - To find out who the leader of the resistance movement is, the player will try to infiltrate R.A.M by sneaking in or by force. The leader, when found, will not trust the player if the player uses too much force and will escape.. If the player finds the leader without much force, the leader of the resistance movement will try to win the player over to his side. If the player chooses to side with the resistance, the leader will give the player his next mission. If not, the leader will escape.

'''Athena Police Station''' - If the player is now helping the resistance, his mission will be to release a R.A.M. member who is held by the police. If the player is still helping the Athena police, his mission is to go back to the station to report on what he found out about the leader of the resistance movement. In this case, the player will still meet with the prisoner who will also try to persuade the player into joining the resistance. This will give the player another chance to change his course. The player will also be given the information on what R.A.M. is planning on next, which is to destroy the solar power plant to allow the them to try to take over Athena's headquarters.

'''Solar Power Generator''' - If the player is helping R.A.M., the player will be given the mission to destroy a solar power generator, which is located outdoors with a Martian atmosphere. In this case, there will be Athena policeman protecting the generator. If the player is still aligned with the Athena Corporation, his mission will be to help protect the solar power generator from R.A.M.

'''Athena HQ''' - The player will either attack or defend the headquarters depending on which side he is on.

'''Boss''' - After the raid on the headquarters, the player will now have to fight against either the CEO of Athena or the leader of R.A.M. to be able to finally get off Mars and end the game.

----

====Cast of Characters====

'''Russel Paddock''' - This is the character that the player gets to play. Russ is an insurance salesman by trade and doesn't have the look of someone that could be a hero. His goal was to have a relaxing vacation on Mars before he was caught up in the conflict between R.A.M. and then Athena Corporation.

'''Peter Nelsen''' - Peter is the dying man on the same spaceship that Russel was on, which was hi-jacked by R.A.M. members. Peter was on his way back from a meeting on Earth with a company who has an interest in Athena's new technology, ALMs.

'''Paul Brocklesby''' - Paul is the spaceport officer who debriefs Russel about the situation on Mars. Paul is also responsible for the training mission if the player needs it to get used to the controls and interface of the game.

'''Chief Officer Lansky''' - No one calls ''the Chief'' by his first name. The player will meet Officer Lansky after clearing the tunnel.

'''Jake Nixon''' - Jake is the person that Russel searches to find out more information on R.A.M. Jake is an arms dealer by trade and a purveyor of stolen goods for fun.

'''William Emerson''' - Will is the resistance member being held by the Athena police. He is very loyal to the resistance movement but talks a little too much, which allows the police to know beforehand some of the events planned by R.A.M. 

'''Juan De Gauss''' - John, as his friends call him, is the leader of the resistance movement. He fears that Athena is using the new technology of ALMs to manipulate and control people.

'''Alexander Olsen''' - Alex is the CEO of Athena Corporation. Alex is responsible for the building of Athena. He is the Machine.

----

====Look and Feel====

The Machine will be in first person and will use a graphics engine suitable to first person shooters, the Unreal Engine. This will be a mod of an existent game, Unreal 2. The levels will have the look and feel of scenes from movies such as Blade Runner, Johnny Mnuemonic, Nick Fury, Total Recall, and other sci-fi and cyberpunk movies. Inventory, skill, and NPC conversation interface will be similar to that of Deus Ex.

----

====Target Audience====

This game will be suited for people who are interested in mods which extend the gameplay for Unreal 2. This will also be a game for those who like cyberpunk environments and games, such as Deus Ex.

----

Original Document written and updated by Chris &quot;MinisterFish&quot; Voyles at http://www.3dmappers.com/treatment.shtml

cvoyles@3dmappers.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TouchDown</title>
    <id>1883</id>
    <revision>
      <id>4619</id>
      <timestamp>2006-06-24T14:23:47Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Touchdown}}

==About Touchdown ==

In touchdown a flag/ball/strange object is spawned randomly on a normal CTF map.  One team is assigned to attack, and one team is assigned to defend.  Essentially, the attacking team must find the &quot;ball&quot; and place it at the defender's flag base.  Once this occurs the attacking team gain a point and the &quot;ball&quot; is respawned on the map.  If a defender touches the &quot;ball&quot; then it is simply respawned somewhere on the map.  This allows the defending team to clear the ball but not run off and hide with it.  After 5 minutes of play the teams are swapped over.  The team with the most points after the two 5 minute sessions wins the match.  There is no extra time, and draws are allowed.

==Comments ==

It's not likely that this mod will work well as it is too close to the ''Bombing Run'' gametype.  Would probably be OK for UT though. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

'''Foxpaw:''' I kind of like the idea personally.. the random respawning I think would set it apart. On the other hand, that could be implemented as a mutator for bombing run.

'''Phantasmagorium:''' I think that, while close to bombing run, it is different enough to merit a gametype. After all, it's like mixing assault (my favorite gametype in the original UT) with bombing run, and that is cool.

'''Foxpaw:''' It's certainately different, but I'd still say a mutator would be better if it's possible - I guess it's from my own belief that a mod should be as lightweight and non-intrusive as possible.</text>
    </revision>
    <revision>
      <id>4620</id>
      <timestamp>2003-08-18T23:57:45Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Touchdown}}

==About Touchdown ==

In touchdown a flag/ball/strange object is spawned randomly on a normal CTF map.  One team is assigned to attack, and one team is assigned to defend.  Essentially, the attacking team must find the &quot;ball&quot; and place it at the defender's flag base.  Once this occurs the attacking team gain a point and the &quot;ball&quot; is respawned on the map.  If a defender touches the &quot;ball&quot; then it is simply respawned somewhere on the map.  This allows the defending team to clear the ball but not run off and hide with it.  After 5 minutes of play the teams are swapped over.  The team with the most points after the two 5 minute sessions wins the match.  There is no extra time, and draws are allowed.

==Comments ==

It's not likely that this mod will work well as it is too close to the ''Bombing Run'' gametype.  Would probably be OK for UT though. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

'''Foxpaw:''' I kind of like the idea personally.. the random respawning I think would set it apart. On the other hand, that could be implemented as a mutator for bombing run.

'''Phantasmagorium:''' I think that, while close to bombing run, it is different enough to merit a gametype. After all, it's like mixing assault (my favorite gametype in the original UT) with bombing run, and that is cool.

'''Foxpaw:''' It's certainately different, but I'd still say a mutator would be better if it's possible - I guess it's from my own belief that a mod should be as lightweight and non-intrusive as possible.</text>
    </revision>
    <revision>
      <id>4621</id>
      <timestamp>2006-06-24T09:50:15Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>delete</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Touchdown}}

==About Touchdown ==

In touchdown a flag/ball/strange object is spawned randomly on a normal CTF map.  One team is assigned to attack, and one team is assigned to defend.  Essentially, the attacking team must find the &quot;ball&quot; and place it at the defender's flag base.  Once this occurs the attacking team gain a point and the &quot;ball&quot; is respawned on the map.  If a defender touches the &quot;ball&quot; then it is simply respawned somewhere on the map.  This allows the defending team to clear the ball but not run off and hide with it.  After 5 minutes of play the teams are swapped over.  The team with the most points after the two 5 minute sessions wins the match.  There is no extra time, and draws are allowed.

==Comments ==

It's not likely that this mod will work well as it is too close to the ''Bombing Run'' gametype.  Would probably be OK for UT though. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

'''Foxpaw:''' I kind of like the idea personally.. the random respawning I think would set it apart. On the other hand, that could be implemented as a mutator for bombing run.

'''Phantasmagorium:''' I think that, while close to bombing run, it is different enough to merit a gametype. After all, it's like mixing assault (my favorite gametype in the original UT) with bombing run, and that is cool.

'''Foxpaw:''' It's certainately different, but I'd still say a mutator would be better if it's possible - I guess it's from my own belief that a mod should be as lightweight and non-intrusive as possible.
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TriggeredZonePropertychanger</title>
    <id>1896</id>
    <revision>
      <id>4650</id>
      <timestamp>2006-12-01T00:13:21Z</timestamp>
      <contributor>
        <ip>Blurr</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Triggered zone property changer}}

==Description ==

This small map component allows the properties of a zone (e.g. gravity) to be changed when a trigger fires.  The zone property changer object simply contains attributes for each of the modifiable properties of the zone.  When triggered the values held on the zone property changer are simply copied directly to the target zone.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  It seems that zones will not exist in UT2003 - and be handled by &quot;Volumes&quot; (whatever that means).  In this case this component will work on the UT2003 equivalent.</text>
    </revision>
    <revision>
      <id>4651</id>
      <timestamp>2002-08-02T09:27:48Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Created</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Triggered zone property changer}}

==Description ==

This small map component allows the properties of a zone (e.g. gravity and) to be changed when a trigger fires.  The zone property changer object simply contains attributes for each of the modifiable properties of the zone.  When triggered the values held on the zone property changer are simply copied directly to the target zone.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''EntropicLqd:'''  It seems that zones will not exist in UT2003 - and be handled by &quot;Volumes&quot; (whatever that means).  In this case this component will work on the UT2003 equivalent.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Triple Domination</title>
    <id>1995</id>
    <revision>
      <id>4879</id>
      <timestamp>2004-12-09T06:28:05Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>scoring interval</comment>
      <text xml:space="preserve">Triple Domination is essentially Double Domination with a third control point. Scoring would work as in [http://www.uncommonplace.com/games/flagdom.html Flag Domination]:
* Control two points for 10 seconds to score a point.
* If you control all three points when the countdown ends, you get 2 points instead of 1.

Timed scoring, as in original UT [[Legacy:Domination|Domination]], would also be an option. The scoring interval should be adjustable, so you can have 1 second like the original, or 10 seconds. I think a higher interval could be more fun.

The game could work on various types of maps, with rules for placing the 3 control points:
* DOM - Use the existing two points, and find a suitable PathNode in the center for the third.
* CTF - Use the flag bases for the first two, and again place the third in the middle.
* BR - Each goal is a control point, and the third replaces the ball's spawning point.
* DM - Three PathNodes are chosen at random.
* TDOM - Custom maps have the three points placed explicitly.

It wouldn't be all that hard to code, although it would need a &quot;C&quot; mesh for the third point.

Cool points of this game type:
* It will work with a wide variety of maps.
* More control points would probably mean less people camping on a single control point. Your team is spread more thinly, and it's not as far between points.
* It would work better as a 4-team game. Four teams fighting over two points would take forever to score.

==Discussion==

'''Wormbo:''' Hmm, BR maps might not work too well. Many goals are in difficult to hold areas. In BR-Anubis you wouldn't even be able to touch the outer points without killing yourself.

'''Uncommon:''' Yeah, in some cases claiming a point means suicide. I guess you just have to make sure there are no enemies nearby first :)  I suppose you could also give it a list of maps where the BR goal is guaranteed suicide and have it bounce players back out so they can have a chance to land safely.

'''Haral:''' You know, I find this mod idea to be silly.  Once you've worked your way up to three, you might as well just allow for any number of control points.  It's not that hard anyway.

'''Uncommon:''' Actually having more than three would make a big difference, since then you could have both teams dominating at once. So I don't think it would be silly until you got to four or more.

'''Uncommon:''' Now that Classic Domination is out, I'm tempted to write this to work on cDOM maps.</text>
    </revision>
    <revision>
      <id>4880</id>
      <timestamp>2004-01-31T23:29:40Z</timestamp>
      <contributor>
        <ip>Uncommon</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Triple Domination is essentially Double Domination with a third control point. Scoring would work as in [http://www.uncommonplace.com/games/flagdom.html Flag Domination]:
* Control two points for 10 seconds to score a point.
* If you control all three points when the countdown ends, you get 2 points instead of 1.

Timed scoring, as in original UT [[Legacy:Domination|Domination]], would also be an option.

The game could work on various types of maps, with rules for placing the 3 control points:
* DOM - Use the existing two points, and find a suitable PathNode in the center for the third.
* CTF - Use the flag bases for the first two, and again place the third in the middle.
* BR - Each goal is a control point, and the third replaces the ball's spawning point.
* DM - Three PathNodes are chosen at random.
* TDOM - Custom maps have the three points placed explicitly.

It wouldn't be all that hard to code, although it would need a &quot;C&quot; mesh for the third point.

Cool points of this game type:
* It will work with a wide variety of maps.
* More control points would probably mean less people camping on a single control point. Your team is spread more thinly, and it's not as far between points.
* It would work better as a 4-team game. Four teams fighting over two points would take forever to score.

==Discussion==

'''Wormbo:''' Hmm, BR maps might not work too well. Many goals are in difficult to hold areas. In BR-Anubis you wouldn't even be able to touch the outer points without killing yourself.

'''Uncommon:''' Yeah, in some cases claiming a point means suicide. I guess you just have to make sure there are no enemies nearby first :)  I suppose you could also give it a list of maps where the BR goal is guaranteed suicide and have it bounce players back out so they can have a chance to land safely.

'''Haral:''' You know, I find this mod idea to be silly.  Once you've worked your way up to three, you might as well just allow for any number of control points.  It's not that hard anyway.

'''Uncommon:''' Actually having more than three would make a big difference, since then you could have both teams dominating at once. So I don't think it would be silly until you got to four or more.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/TurnCoat</title>
    <id>1969</id>
    <revision>
      <id>4819</id>
      <timestamp>2007-04-22T18:14:17Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>rv</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003/4 &amp;ndash; TurnCoat}}

The idea is a simple one: a pickup that switches team color skins. This would of course be for team games, and would be a mutator so as to work with CTF, BR, AS, etc. The idea would be that a player from the opposite team may confuse them for a teammate... that is, until the player stole the flag or  killed them.

==Discussion==

_Lynx|PZ

I've tried working on it, but got stuck. I've decided to do it not as a mutator, but as adrenaline combo instead. This will limit the time of skin switching, and will make it more unpredictable for the enemies, 'cause if it would be a pickup, everyone will notice that it's disappeared, and they'll start looking for a foo amongst them. First of all in StartEffect I'm getting player's team index, then change the shoulder lights' colour on it's opposite (it's simple, because they use permanent texture name), but with skins is's a whole new story. To support any skin, I need to make code versatile. I haven't found any function that changes skins depending on team color, so I tried to do this through string mumbo-jumbo, with replacing the last chracters of texture name from 1 to 0 and back. Ok, I got the name as a string, got the name, added new index and... got stuck. How do I assign the xPawn.skins[0] a value which a have as a string. So I've no idea....

'''Foxpaw:''' Have you considered walking through the Pawn list, picking a random player on the opposite team, and making the combo-using pawn mimic it? IE, set the &quot;turncoat&quot; to the enemy player's mesh and skins. Something like this:

&lt;uscript&gt;
simulated function Turncoat( Pawn TC )
{
  local Pawn Enemy;
  local array&lt;Pawn&gt; Enemies;

  // I'm guessing at names here, but these variables and structures do actually exist.
  // The names might be wrong though.
  Enemy = Level.Pawnlist;
  while( true )
  {
    if ( /* Do some check to see if the person is not on our team. */ )
    Enemies[Enemies.Length] = Enemy;
    Enemy = Enemy.NextPawn;

    // Don't recall if this is circularly linked or if it terminates with a none.
    // Replace with if ( Enemy == Level.Pawnlist ) as applicable.
    if ( Enemy == None )
      break;
  }

  Enemy = Enemies[Rand( Enemies.Length )];

  // Backup the turncoats mesh and junk here.
  // Whatever method you like.

  TC.LinkMesh( Enemy.Mesh );
  TC.Skins = Enemy.Skins; // Not sure if this is valid, you might have to do a for loop and set each one manually.
}

&lt;/uscript&gt;

_Lynx: That's me again! I did it by the price of one sleepless night!  But in the other way:

&lt;uscript&gt;
//=============================================================================
// ComboTeamChameleon.
// Copyright: Michael &quot;_Lynx&quot; Sokolkov ©2004
// unreal-pz@narod.ru
// senninha_r@mail.ru
//=============================================================================
class ComboTeamChameleon extends Combo;

var TeamInfo MyTeam;
var class&lt;PlayerReplicationInfo&gt; PlayerReplicationInfoClass;
var int i,NumSkins;
var string CharName;
var xPlayerReplicationInfo xPRI;
var string cBodySkinName,
		   SkinName,
		   SkinNameNotex,
		   TIndex;
var material cNewBodySkinName;
var xUtil.PlayerRecord rec;



function PreBeginPlay()
{
	CharName = xPawn(Owner).PlacedCharacterName;
	myTeam = xPawn(Owner).GetTeam();
}

function StartEffect(xPawn P)
{

	if (myTeam != none)
	{
//=======================================================
// If our player's team is red
// P.S. Values of TeamIndex
// 0 - the team is red
// 1 - the team is blue
//=======================================================

		if (myTeam.TeamIndex == 0)
		{	if ( P.LeftMarker != None &amp;&amp; !P.bInvis )
			{
				p.LeftMarker = Spawn(class'PlayerLight',P,,P.Location);
				if( !P.AttachToBone(P.LeftMarker,'lshoulder') )
				{
					log( &quot;Couldn't attach LeftMarker to lshoulder&quot;, 'Error' );
					P.LeftMarker.Destroy();
					return;
				}

				P.RightMarker = Spawn(class'PlayerLight',self,,Location);
				if( !P.AttachToBone(P.RightMarker,'rshoulder') )
				{
					log( &quot;Couldn't attach RightMarker to rshoulder&quot;, 'Error' );
					P.RightMarker.Destroy();
					return;
				}

				P.LeftMarker.SetRelativeLocation(P.LeftOffset);
				P.RightMarker.SetRelativeLocation(P.RightOffset);
				P.RightMarker.Texture = Texture'BlueMarker_t';
				p.LeftMarker.Texture = Texture'BlueMarker_t';
			}
		else if( P.LeftMarker != None &amp;&amp; P.bInvis )
		{
			P.LeftMarker.Destroy();
			P.RightMarker.Destroy();
		}
	//=======================================================
	// And now I'll try to create some skinchnage stuff
	// ah... let's go...
	//=======================================================
		cBodySkinName = string(P.Skins[0]);
		rec = class'xUtil'.static.FindPlayerRecord(CharName);
		SkinName = rec.BodySkinName$&quot;_&quot;$0;
		cNewBodySkinName = Material(DynamicLoadObject(SkinName, class'Material'));
		P.Skins[0] = cNewBodySkinName;
	}
//=======================================================
// If our player's team is blue
// P.S. Values of TeamIndex
// 1 - the team is red
// 0 - the team is blue
//=======================================================

		if (myTeam.TeamIndex == 1)
			if ( P.LeftMarker != None &amp;&amp; !P.bInvis )
			{
				p.LeftMarker = Spawn(class'PlayerLight',P,,P.Location);
				if( !P.AttachToBone(P.LeftMarker,'lshoulder') )
				{
					log( &quot;Couldn't attach LeftMarker to lshoulder&quot;, 'Error' );
					P.LeftMarker.Destroy();
					return;
				}

				P.RightMarker = Spawn(class'PlayerLight',self,,Location);
				if( !P.AttachToBone(P.RightMarker,'rshoulder') )
				{
					log( &quot;Couldn't attach RightMarker to rshoulder&quot;, 'Error' );
					P.RightMarker.Destroy();
					return;
				}

				P.LeftMarker.SetRelativeLocation(P.LeftOffset);
				P.RightMarker.SetRelativeLocation(P.RightOffset);
				P.RightMarker.Texture = Texture'RedMarker_t';
				p.LeftMarker.Texture = Texture'RedMarker_t';
			}
		else if( P.LeftMarker != None &amp;&amp; P.bInvis )
		{
			P.LeftMarker.Destroy();
			P.RightMarker.Destroy();
		}
		cBodySkinName = string(P.Skins[0]);
		rec = class'xUtil'.static.FindPlayerRecord(CharName);
		SkinName = rec.BodySkinName$&quot;_&quot;$1;
		cNewBodySkinName = Material(DynamicLoadObject(SkinName, class'Material'));
		P.Skins[0] = cNewBodySkinName;
	}
	else return;
}


function StopEffect(xPawn P)
{

	if (myTeam != none)
	{
//=======================================================
// If our player's team is red
// P.S. Values of TeamIndex
// 1 - the team is red
// 0 - the team is blue
//=======================================================

		if (myTeam.TeamIndex == 0)
		{	if ( P.LeftMarker != None &amp;&amp; !P.bInvis )
			{
				p.LeftMarker = Spawn(class'PlayerLight',P,,P.Location);
				if( !P.AttachToBone(P.LeftMarker,'lshoulder') )
				{
					log( &quot;Couldn't attach LeftMarker to lshoulder&quot;, 'Error' );
					P.LeftMarker.Destroy();
					return;
				}

				P.RightMarker = Spawn(class'PlayerLight',self,,Location);
				if( !P.AttachToBone(P.RightMarker,'rshoulder') )
				{
					log( &quot;Couldn't attach RightMarker to rshoulder&quot;, 'Error' );
					P.RightMarker.Destroy();
					return;
				}

				P.LeftMarker.SetRelativeLocation(P.LeftOffset);
				P.RightMarker.SetRelativeLocation(P.RightOffset);
				P.RightMarker.Texture = Texture'RedMarker_t';
				p.LeftMarker.Texture = Texture'RedMarker_t';
			}
		else if( P.LeftMarker != None &amp;&amp; P.bInvis )
		{
			P.LeftMarker.Destroy();
			P.RightMarker.Destroy();
		}
		cBodySkinName = string(P.Skins[0]);
		rec = class'xUtil'.static.FindPlayerRecord(CharName);
		SkinName = rec.BodySkinName$&quot;_&quot;$1;
		cNewBodySkinName = Material(DynamicLoadObject(SkinName, class'Material'));
		P.Skins[0] = cNewBodySkinName;

	}
//=======================================================
// If our player's team is blue
// P.S. Values of TeamIndex
// 1 - the team is red
// 0 - the team is blue
//=======================================================

		if (myTeam.TeamIndex == 1)
			if ( P.LeftMarker != None &amp;&amp; !P.bInvis )
			{
				p.LeftMarker = Spawn(class'PlayerLight',P,,P.Location);
				if( !P.AttachToBone(P.LeftMarker,'lshoulder') )
				{
					log( &quot;Couldn't attach LeftMarker to lshoulder&quot;, 'Error' );
					P.LeftMarker.Destroy();
					return;
				}

				P.RightMarker = Spawn(class'PlayerLight',self,,Location);
				if( !P.AttachToBone(P.RightMarker,'rshoulder') )
				{
					log( &quot;Couldn't attach RightMarker to rshoulder&quot;, 'Error' );
					P.RightMarker.Destroy();
					return;
				}

				P.LeftMarker.SetRelativeLocation(P.LeftOffset);
				P.RightMarker.SetRelativeLocation(P.RightOffset);
				P.RightMarker.Texture = Texture'BlueMarker_t';
				p.LeftMarker.Texture = Texture'BlueMarker_t';
			}
		else if( P.LeftMarker != None &amp;&amp; P.bInvis )
		{
			P.LeftMarker.Destroy();
			P.RightMarker.Destroy();
		}
		cBodySkinName = string(P.Skins[0]);
		rec = class'xUtil'.static.FindPlayerRecord(CharName);
		SkinName = rec.BodySkinName$&quot;_&quot;$0;
		cNewBodySkinName = Material(DynamicLoadObject(SkinName, class'Material'));
		P.Skins[0] = cNewBodySkinName;
	}
	else return;

}
&lt;/uscript&gt;

So, I used the standard way of settings skins via xUtil. I found it the best way. Now it works ok. Thanks for the idea of the mod! I'll try to add a link to the file in next 4-5 hours.

P.S. If anyone wants to use code from this script just notify me about it, I'm interested in what you'll be doing.

_Lynx|PZ:

Here's the link to the combo Use it for save as, this should work, if click you'll probably will be sent to the site of my hoster, and the page you'll see could be in Russian...

http://unreal-pz.narod.ru/Files/TeamChameleon.zip

P.S. And who's the author of the idea? Tell me your name!

'''GRAF1K:''' Heh, this hasn't been updated since January, but in case you check back, I wrote the idea. Glad you could use it. :)</text>
    </revision>
    <revision>
      <id>4820</id>
      <timestamp>2007-04-22T18:08:24Z</timestamp>
      <contributor>
        <ip>204.193.117.84</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT2003/4 &amp;ndash; TurnCoat}}

The idea is a simple one: a pickup that switches team color skins. This would of course be for team games, and would be a mutator so as to work with CTF, BR, AS, etc. The idea would be that a player from the opposite team may confuse them for a teammate... that is, until the player stole the flag or  killed them.

==Discussion==

_Lynx|PZ

I've tried working on it, but got stuck. I've decided to do it not as a mutator, but as adrenaline combo instead. This will limit the time of skin switching, and will make it more unpredictable for the enemies, 'cause if it would be a pickup, everyone will notice that it's disappeared, and they'll start looking for a foo amongst them. First of all in StartEffect I'm getting player's team index, then change the shoulder lights' colour on it's opposite (it's simple, because they use permanent texture name), but with skins is's a whole new story. To support any skin, I need to make code versatile. I haven't found any function that changes skins depending on team color, so I tried to do this through string mumbo-jumbo, with replacing the last chracters of texture name from 1 to 0 and back. Ok, I got the name as a string, got the name, added new index and... got stuck. How do I assign the xPawn.skins[0] a value which a have as a string. So I've no idea....

'''Foxpaw:''' Have you considered walking through the Pawn list, picking a random player on the opposite team, and making the combo-using pawn mimic it? IE, set the &quot;turncoat&quot; to the enemy player's mesh and skins. Something like this:

&lt;uscript&gt;

simulated function Turncoat( Pawn TC )

{
  local Pawn Enemy</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/U-Replay</title>
    <id>1923</id>
    <revision>
      <id>4711</id>
      <timestamp>2003-07-20T11:31:36Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Came up with a method to export actor info without recompiling actor.</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; U-Replay}}

==Description ==

by Flashman

This is a rather big idea, and if successful could make its way into the big LANs - its primary target. The Idea is this: UT Demo files (and I'm assuming UT2k3 ones too) store information about the game that took place. This information must (''Although I must admit my research in this area is poor at best'') contain a minimum amount of data such as Player model/skin, player position, current weapon, position of things like projectiles and status of triggers/movers. 

I beleive this data could be used in an external 3D application such as 3D Studio MAX to position higher poly models, and have high poly versions of the main maps too, to facilitate the creation of high detail animations of the recorded game. This could be rendered with any camera angle you want, using high-quality materials and effects the likes of which aren't possible with todays (Or even tomorrows) 3D cards. Think phong shading, bump maps on everything, raytraced reflection &amp; refraction... all effects would be customisable before the render, as the scene could be saved first and edited in the chosen 3D package.

Another feature I have in mind is on the inital read of the demo file, the U-Replay engine reads ahead in the list of actions for a player, and determines if they are slowing down, speeding up or jumping etc, and builds up to it accordingly, i.e. preparing to spring when jumping from a crouched position.

The code would need to be something like a bit of MAX Script, a plugin or external executable that references a set of resources:
: IK linked models for the players &lt;br /&gt;.max scenes for the Levels &lt;br /&gt;Meshes for the weapons 

This could be used to show highlights of Tournaments and matches or just for fun. It could also be used in the creation of cutscene movies for mod-makers.

This idea is admittedly an incredibly complex solution to get a ''nice idea'' but could have a lot of promise given a big enough development team and enough interest from the community.

Just picture a big silver-screen at the next LAN you go to, with your game playing for all to see in cinema-quality video! ;)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Zedsquared:'''   Nice idea but IIRC the demo data is basically a recording of the network data sent out to clients and really needs an unreal engine to decode it properly. It's not a frame by frame storage of what was where but a stream of function calls and variable values that the game plays back by pretending it all came from a server. Many actors will just be spawned and then do their own thing ( like flying off across the map if they are projectiles ) without any further data about them appearing in the recorded stream. So what you really need here is a way to spit out all that sort of data into some sort of huge log file which then gets post processed, the easiest way would be to recompile actor and put a bunch of log statements in tick (for position, animation state, etc) then playback with gametime slowed... Trouble is actor is a native class so again you need to be able to recompile the engine... so not one for mere mortal mod coders, unless anyone knows otherwise :-) 

'''Flashman:''' I would have thought that all was involved would be taking those function calls and using the rules passed to it to create a keyframe in your MAX animation, because every time something changes state or direction etc the engine will need notification, so it would be a case of creating some form of parser that could interpret the information the same way as unreal does, but instead storing keyframes on your high-q objects? Besides, no 3D animation package needs a value for where an object is EVERY frame, just when it's expected to chenge the rules, just the same as the data passed from a server in UT

'''Mychaeel:''' Unreal's demo playback mechanism heavily relies on the actors' script code (as Zedsquared said already), so building a stand-alone Unreal demo playback application would basically mean that you'd have to recreate most of the game content from scratch.  Some UT2003 actors perform rather complex actions on their own.

'''Githianki:''' With the exception of a lot of the high quality features you mention (bump mapping, phong, etc.) you could do what you are describing but in a far easier way.  Simply set up everything in UT2003! What you'd need is to create a duplicate set using the hi-res stuff.  If you were willing to sacrifice on the accuracy of the dynamic stuff, you could simply instruct the engine to render complete frames at whatever rate it takes and store the frame buffer results for compilation into a video.  The engine could theoretically handle huge files (texture and models) just not at playable rates.  If you could code a mod that made sure each frame was rendered complete you'd be set (it might only take vsync on to do this).  Of course you'd need to do the buffer capture too but I think there are programs for this.  The engine doesn't do some functions and you'd still need a low quality version to set up your previews.  When they were set you'd copy your triggers, etc. over into your hi-res version check all the names to match the hires assests and let it go.  Not sure what you'd gain other than you might find working with Unreal much easier than MAX.  The things you could do are hire res meshes, textures and animations.  A big issue though might be memory since I don't know how well the engine would actually accomodate huge file sizes.  If the engine is to last 5 years then by the time you have all your high quality assests ready to go, the engine might support some of the rendering features that you mention. Update: check out this link [[Legacy:Capturing Unreal Video|Capturing Unreal Video]]

'''Flashman:''' I like what you're saying but the one prob with this would be, once you've made a  high-res version of a level, high poly meshes etc, how do you then get the demo file to run properly? My impression is that getting a demo file from, say Curse ]|[, to run on UberHighDetail_Curse]|[ would be impossible. Anyone out there know otherwise? 

The other things not in UT2003 that would look cool in a Max-Cine quality render would be:
* Proper transparency, with index of refraction etc.
* Fur, hair, Cloth simulation. (Although require appropriate plugins)
* Procedural Textures... more when I get back :D

'''DJPaul:''' This might be doable if someone has a Unreal Engine license; and I doubt any of the people who'd look at this page (myself included) has a spare Unreal Engine license sitting around... ;)

'''Foxpaw:''' I think this is possible, though it would probrably involve a lot of work on the importing into max part. It is not only possible, but somewhat feasable if you had a beefy computer to do the grunt work. Here's how it could work:

# Play game while recording demo. You will have to have a special mutator loaded, but it won't do anything normally.
# Replay the recorded demo. Trigger the mutator which previously wasn't doing anything through the use of the Mutate function. The mutator then begins calling DynamicActors (or maybe AllActors, but I think DynamicActors would catch everything) every tick, and spewing a boatload of information into an internal data store. (Dynamic array, linked list, whichever you prefer) This data store contains the actors &quot;state,&quot; whatever info you feel is appropriate. I'm not sure what would happen if you altered the game speed with the mutator... slowing down the game's playback (not just slowing the framerate, but slowing the actual playback) would be good because then the resources being used for the mutator's dumping wouldn't cause as much havok with the playback.
# Use a second keyword in the Mutate function to cease information dumping. Information is then saved to the hard disk using either log statements or the handy-dandy... well, okay, I didn't name it, but the system I use for storing ship designs for my mod is capable of storing an arbitrary amount of information onto the hard drive, in pretty much whatever format you want.
# Read that information into MAX somehow. I'm not sure how you'd do that but I'm sure it can be done.

This is similar to the idea of recompiling actor, but it works external of actor so it wouldn't require you to recompile the actor class. Note that number 2 will cause some minor slowdown. Number 3 will cause the computer to &quot;freeze,&quot; but the harddrive will still be grinding away. You could maybe sacrifice resolution and use a capture rate lower than every tick.. that would save lots of time on the exporting/importing.</text>
    </revision>
    <revision>
      <id>4712</id>
      <timestamp>2003-04-03T16:38:47Z</timestamp>
      <contributor>
        <ip>DJPaul</ip>
      </contributor>
      <comment>delete me?</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; U-Replay}}

==Description ==

by Flashman

This is a rather big idea, and if successful could make its way into the big LANs - its primary target. The Idea is this: UT Demo files (and I'm assuming UT2k3 ones too) store information about the game that took place. This information must (''Although I must admit my research in this area is poor at best'') contain a minimum amount of data such as Player model/skin, player position, current weapon, position of things like projectiles and status of triggers/movers. 

I beleive this data could be used in an external 3D application such as 3D Studio MAX to position higher poly models, and have high poly versions of the main maps too, to facilitate the creation of high detail animations of the recorded game. This could be rendered with any camera angle you want, using high-quality materials and effects the likes of which aren't possible with todays (Or even tomorrows) 3D cards. Think phong shading, bump maps on everything, raytraced reflection &amp; refraction... all effects would be customisable before the render, as the scene could be saved first and edited in the chosen 3D package.

Another feature I have in mind is on the inital read of the demo file, the U-Replay engine reads ahead in the list of actions for a player, and determines if they are slowing down, speeding up or jumping etc, and builds up to it accordingly, i.e. preparing to spring when jumping from a crouched position.

The code would need to be something like a bit of MAX Script, a plugin or external executable that references a set of resources:
: IK linked models for the players &lt;br /&gt;.max scenes for the Levels &lt;br /&gt;Meshes for the weapons 

This could be used to show highlights of Tournaments and matches or just for fun. It could also be used in the creation of cutscene movies for mod-makers.

This idea is admittedly an incredibly complex solution to get a ''nice idea'' but could have a lot of promise given a big enough development team and enough interest from the community.

Just picture a big silver-screen at the next LAN you go to, with your game playing for all to see in cinema-quality video! ;)

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

'''Zedsquared:'''   Nice idea but IIRC the demo data is basically a recording of the network data sent out to clients and really needs an unreal engine to decode it properly. It's not a frame by frame storage of what was where but a stream of function calls and variable values that the game plays back by pretending it all came from a server. Many actors will just be spawned and then do their own thing ( like flying off across the map if they are projectiles ) without any further data about them appearing in the recorded stream. So what you really need here is a way to spit out all that sort of data into some sort of huge log file which then gets post processed, the easiest way would be to recompile actor and put a bunch of log statements in tick (for position, animation state, etc) then playback with gametime slowed... Trouble is actor is a native class so again you need to be able to recompile the engine... so not one for mere mortal mod coders, unless anyone knows otherwise :-) 

'''Flashman:''' I would have thought that all was involved would be taking those function calls and using the rules passed to it to create a keyframe in your MAX animation, because every time something changes state or direction etc the engine will need notification, so it would be a case of creating some form of parser that could interpret the information the same way as unreal does, but instead storing keyframes on your high-q objects? Besides, no 3D animation package needs a value for where an object is EVERY frame, just when it's expected to chenge the rules, just the same as the data passed from a server in UT

'''Mychaeel:''' Unreal's demo playback mechanism heavily relies on the actors' script code (as Zedsquared said already), so building a stand-alone Unreal demo playback application would basically mean that you'd have to recreate most of the game content from scratch.  Some UT2003 actors perform rather complex actions on their own.

'''Githianki:''' With the exception of a lot of the high quality features you mention (bump mapping, phong, etc.) you could do what you are describing but in a far easier way.  Simply set up everything in UT2003! What you'd need is to create a duplicate set using the hi-res stuff.  If you were willing to sacrifice on the accuracy of the dynamic stuff, you could simply instruct the engine to render complete frames at whatever rate it takes and store the frame buffer results for compilation into a video.  The engine could theoretically handle huge files (texture and models) just not at playable rates.  If you could code a mod that made sure each frame was rendered complete you'd be set (it might only take vsync on to do this).  Of course you'd need to do the buffer capture too but I think there are programs for this.  The engine doesn't do some functions and you'd still need a low quality version to set up your previews.  When they were set you'd copy your triggers, etc. over into your hi-res version check all the names to match the hires assests and let it go.  Not sure what you'd gain other than you might find working with Unreal much easier than MAX.  The things you could do are hire res meshes, textures and animations.  A big issue though might be memory since I don't know how well the engine would actually accomodate huge file sizes.  If the engine is to last 5 years then by the time you have all your high quality assests ready to go, the engine might support some of the rendering features that you mention. Update: check out this link [[Legacy:Capturing Unreal Video|Capturing Unreal Video]]

'''Flashman:''' I like what you're saying but the one prob with this would be, once you've made a  high-res version of a level, high poly meshes etc, how do you then get the demo file to run properly? My impression is that getting a demo file from, say Curse ]|[, to run on UberHighDetail_Curse]|[ would be impossible. Anyone out there know otherwise? 

The other things not in UT2003 that would look cool in a Max-Cine quality render would be:
* Proper transparency, with index of refraction etc.
* Fur, hair, Cloth simulation. (Although require appropriate plugins)
* Procedural Textures... more when I get back :D

'''DJPaul:''' This might be doable if someone has a Unreal Engine license; and I doubt any of the people who'd look at this page (myself included) has a spare Unreal Engine license sitting around... ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UT2003 Jukebox</title>
    <id>1976</id>
    <revision>
      <id>4833</id>
      <timestamp>2003-08-10T10:09:25Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Formatted and commented.</comment>
      <text xml:space="preserve">Hello there, i've got an idea for a mod for UT2003, similar to a jukebox, but for internet and LAN play. I was hoping to make it myself but have no uscript experience whatsoever.  Thank you for your time.

I was hoping to have a few features:
# gather or compile a collection of oggs to make a sort of serverside playlist
# randomly select a song, or maybe eventually add a voting option
# have the chosen song pushed to the clients

==Discussion==

'''Foxpaw:''' This doesn't sound like it would be too difficult. I believe that [[Legacy:Esc|Esc]] had something similar to this. My only concern would be that I can't foresee much interest in it's use.. why would players want their playlist dictated by the server when they could make their own? Kinda like listening to the radio when you have all the same songs in your CD changer...</text>
    </revision>
    <revision>
      <id>4834</id>
      <timestamp>2003-08-10T08:20:49Z</timestamp>
      <contributor>
        <ip>Madmansk</ip>
      </contributor>
      <comment>New Mod Idea, Serverside Jukebox for 2003</comment>
      <text xml:space="preserve">Hello there, i've got an idea for a mod for UT2003, similar to a jukebox, but for internet and LAN play

I was hoping to have a few features-

1.gather or compile a collection of oggs to make a sort of serverside playlist

2.randomly select a song, or maybe eventually add a voting option

3.have the chosen song pushed to the clients

I was hoping to make it myself but have no uscript experience whatsoever.  Thank you for your time.</text>
    </revision>
    <revision>
      <id>4835</id>
      <timestamp>2003-08-10T10:08:14Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hello there, i've got an idea for a mod for UT2003, similar to a jukebox, but for internet and LAN play

I was hoping to have a few features-

1.gather or compile a collection of oggs to make a sort of serverside playlist

2.randomly select a song, or maybe eventually add a voting option

3.have the chosen song pushed to the clients

I was hoping to make it myself but have no uscript experience whatsoever.  Thank you for your time.

'''Foxpaw:''' This doesn't sound like it would be too difficult. I believe that [[Legacy:Esc|Esc]] had something similar to this. My only concern would be that I can't foresee much interest in it's use.. why would players want their playlist dictated by the server when they could make their own? Kinda like listening to the radio when you have all the same songs in your CD changer...</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UTPortal</title>
    <id>2025</id>
    <revision>
      <id>4939</id>
      <timestamp>2008-02-01T01:23:55Z</timestamp>
      <contributor>
        <ip>129.19.1.147</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Sponsored by===

[[Legacy:Computergod666|computergod666]]

===Description===

This would be a single-player mod for Unreal Tournament that is something like VALVe Software's game 'Portal'. It would include all the same kinds of puzzles, sentryguns, and the notorious cubes. I won't make exact replicas of any Portal components for fear of copyright issues.

===Plot===

The game starts similarly to Portal, with the main character running an obstacle course that must be solved with the portal gun. You start the game with the 'gravity gun', similar to the one in HL2, which allows you to pick up cubes and complete puzzles, in addition to using the Portal gun, which you are given shortly after the beginning of the game. There are actually two portal guns in the game: one that is like the original Portal gun, and another, which I scripted myself, which fires portal projectiles instead of instant-hit portals. See my personal page [[Legacy:Computergod666|computergod666]] for more info. You get the UTPortal gun (the one I scripted) later in the game to help with some of the advanced puzzles. Toward the end of the course, you are supposed to use the gravity gun and portal guns to fight your way past a few monsters. Then, things go wrong, the monsters smash their way out of the course, and you are left to escape on your own. The computer voice that has been guiding you is now disabled, and you must use your own initiative to solve any puzzles you encounter. Toward the end of the game, you are teleported to an alien planet as the monsters try to escape from the Earth. You are left with only an enhanced gravity gun and the classic portal gun. The game ends when you use your portal gun to create a dimensional paradox that simultaneously closes the portal and teleports you back to earth.

===Progress===

So far, I have created all the necessary weapons. However, I have no idea how to make a portal that you can see through (I don't think that is actually possible in UT).

'''kiff:''' You might want to rename/move this...  UTPortal is a class in UT3 and this url will probably be used for it at some point.

'''Wormbo:''' I changed this to a subpage of [[Legacy:Mod Ideas|Mod Ideas]], so it won't collide and also fits with the naming scheme of the other mod ideas.

'''computergod666:''' Thanks guys. However, I have no idea how to move or rename a page.</text>
    </revision>
    <revision>
      <id>4940</id>
      <timestamp>2008-01-26T11:22:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>renamed</comment>
      <text xml:space="preserve">===Sponsored by===

[[Legacy:Computergod666|computergod666]]

===Description===

This would be a single-player mod for Unreal Tournament that is something like VALVe Software's game 'Portal'. It would include all the same kinds of puzzles, sentryguns, and the notorious cubes. I won't make exact replicas of any Portal components for fear of copyright issues.

===Plot===

The game starts similarly to Portal, with the main character running an obstacle course that must be solved with the portal gun. You start the game with the 'gravity gun', similar to the one in HL2, which allows you to pick up cubes and complete puzzles, in addition to using the Portal gun, which you are given shortly after the beginning of the game. There are actually two portal guns in the game: one that is like the original Portal gun, and another, which I scripted myself, which fires portal projectiles instead of instant-hit portals. See my personal page [[Legacy:Computergod666|computergod666]] for more info. You get the UTPortal gun (the one I scripted) later in the game to help with some of the advanced puzzles. Toward the end of the course, you are supposed to use the gravity gun and portal guns to fight your way past a few monsters. Then, things go wrong, the monsters smash their way out of the course, and you are left to escape on your own. The computer voice that has been guiding you is now disabled, and you must use your own initiative to solve any puzzles you encounter. Toward the end of the game, you are teleported to an alien planet as the monsters try to escape from the Earth...
 WORK IN PROGRESS.

'''kiff:''' You might want to rename/move this...  UTPortal is a class in UT3 and this url will probably be used for it at some point.

'''Wormbo:''' I changed this to a subpage of [[Legacy:Mod Ideas|Mod Ideas]], so it won't collide and also fits with the naming scheme of the other mod ideas.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UTroids</title>
    <id>1977</id>
    <revision>
      <id>4836</id>
      <timestamp>2003-09-11T14:44:22Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT &amp;ndash; UTroids}}

==Description ==

Ok, it's time to bring Astroids into the new century. Imagine Astroids in first-person and 3d. It wouldn't prolly be worth writing a whole game, but if the engine is already here... why not play UTroids on this engine? 3d astroids comming at you. You spin around and they are all around you. Your thumb moves in front of you to aim your guns with the POV Hat on the joystick in the cockpit if you hold one button down and pan with your mouse. But panning with the mouse otherwise steers the ship. Fire and bolts of energy fly out in front of you when they make contact with an astroid it blows up into smaller chunks of debrit that can still hit you. But little ones only add to your damage till your not able to spin or not able to thrust, or maybe stop. Of course once you hit a big one... BOOM! Clear a path in the astroid feild and you will get to land on the planet and of course... save the princess.  Hehehehe.

===Interested Scriptors ===

==Discussion ==

'''Foxpaw:''' This sounds like it would be pretty simple to make, I'd think. You'd need a class for the asteroids, (probrably subclass from Pawn so bots know that it's hostile.)

and you'd also need to make a vehicle for the ship. ([[Legacy:KShip|KShip]]) There was something on the [[Legacy:Inbox|Inbox]] page about making a vehicle be a player's pawn as well.

'''RegularX:''' A suggestion at my home forums has made me interested in something very similar, but I'll be awaiting UT2004's new toys before I really look at it.</text>
    </revision>
    <revision>
      <id>4837</id>
      <timestamp>2003-09-11T14:37:51Z</timestamp>
      <contributor>
        <ip>198.173.11.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT &amp;ndash; UTroids}}

==Description ==

Ok, it's time to bring Astroids into the new century. Imagine Astroids in first-person and 3d. It wouldn't prolly be worth writing a whole game, but if the engine is already here... why not play UTroids on this engine? 3d astroids comming at you. You spin around and they are all around you. Your thumb moves in front of you to aim your guns with the POV Hat on the joystick in the cockpit if you hold one button down and pan with your mouse. But panning with the mouse otherwise steers the ship. Fire and bolts of energy fly out in front of you when they make contact with an astroid it blows up into smaller chunks of debrit that can still hit you. But little ones only add to your damage till your not able to spin or not able to thrust, or maybe stop. Of course once you hit a big one... BOOM! Clear a path in the astroid feild and you will get to land on the planet and of course... save the princess.  Hehehehe.

===Interested Scriptors ===

==Discussion ==

'''Foxpaw:''' This sounds like it would be pretty simple to make, I'd think. You'd need a class for the asteroids, (probrably subclass from Pawn so bots know that it's hostile.)

and you'd also need to make a vehicle for the ship. ([[Legacy:KShip|KShip]]) There was something on the [[Legacy:Inbox|Inbox]] page about making a vehicle be a player's pawn as well.

'''RegularX:''' A suggestion at my home forums has made me interested in something very similar, but I'll be awaiting UT2004's new toys before I really look at it.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UnRealMyst</title>
    <id>2014</id>
    <revision>
      <id>4920</id>
      <timestamp>2005-08-22T22:58:42Z</timestamp>
      <contributor>
        <ip>Cf7.adnap.net.au</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 200X &amp;ndash; UnRealMyst}}

==Description ==

Single Player, non-violent

''This is a bit of a curious mod idea. It doesn't actually provide any real gameplay features itself (in fact, it removes some), but lays the groundwork for other games to be built on top.''

Ever since I first saw [http://pyzzle.sourceforge.net Pyzzle], I've thought about writing a Myst style puzzle game. Unfortunately, it looks like development has halted on Pyzzle. Recently I started thinking, what would be involved in writing a Myst game using the Unreal engine?

And the more I thought about it, the less it seemed needed to be done. Certainly, there is a great deal of work in creating a complete Myst game, with a lot of detailed mapping and event scripting; but most of that goes into creating the map itself. As far as developing the base game code (the sub-engine, if you will), only a few simple changes need to be made:

* No weapons
** One of the pleasant elements of the Myst games is that they are non-violent by nature. You don't physically interact with other people, and in most you actually spend most of your time totally alone, exploring the world.
** By default, the player has one &quot;non-weapon&quot; with a range of about an arm's reach (basically a &quot;Use&quot; function). When the player &quot;shoots&quot;, the weapon hitscans anything in the map within range, and if the target is scripted to react, it does so.
** The weapon slots could be used for 10 generic items that can be collected and used during the game. Items should be picked up by clicking them, not by walking over them. The map creator would need to provide map models, hud models and hud icons if he wanted to use them, but they could be used as tags to identify to event scripts whether to respond to the hitscan. (Lock &quot;shot&quot; with Gold Key, trigger Open event)

* No health
** Damage should be irrelevant to most games of this type, and even death can be considered optional. The player should never need to know how much health they have, and whether they can afford to safely do something. Kill zones could be used in some maps if appropriate.

* No HUD
** Beyond a cursor to show exactly where the player is pointing (which is important in this game type), there doesn't need to be anything else on the screen. If collectable items are included as above, then the currently collected items should be displayed, but that is all.

* Game Save / Checkpoint system
** This is the tricky part. A good puzzle level might take hours to finish, so ideally there should be a way to save your progress and return to the level later. I can't think of an easy way to achieve a complete save system, but one approach would be to use checkpoints. When you reach certain stages of the level, you are issued a code (which you should write down). When the game starts, you are prompted for a code (or leave it blank to start fresh). Checkpoint codes should only be issued at &quot;choke points&quot; in the game, where you must have acheived a precisely known set of tasks, otherwise you won't know what state to put the map in. Simpler again would be to put multiple points through your level which empty your inventory and prevent you from going back; then entering the code could simply start you at a different point in the level without having to set up the map state. It's up to the map maker to actually set those states based on the trigger event; all that is needed from the sub-engine is a way to enter the codes, and a standard way to issue them.

Pretty much everything else would be built into the map design. To a large degree, a Myst map could be built as a standard Unreal level, but the lack of a general purpose &quot;Use&quot; function would severely hamper the puzzle design, and the presence of Health could complicate things (falling damage, for example). Providing a base from which to start gives the level design a bit more focus, and removes the elements of Unreal that would distract from the intended nature of the game.

It also creates a special game type that clearly marks the purpose of the maps, each of which is actually its own self contained puzzle game.

==Discussion ==

'''Kagato:''' It's been well over a year since I was last here (prior to this entry), and I still haven't done any mod work myself. :(

I have, however, got myself a copy of ''Mastering Unreal Technology'', and intend to work my way through the whole book in my spare time (''hahahaha... &quot;spare time&quot;'').

It won't help me much with UnrealScript, but at least it'll finally get me into game content creation; and it fits well with this mod! :)</text>
    </revision>
    <revision>
      <id>4921</id>
      <timestamp>2005-08-22T08:43:40Z</timestamp>
      <contributor>
        <ip>Kagato</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 200X &amp;ndash; UnRealMyst}}

==Description ==

Single Player, non-violent

''This is a bit of a curious mod idea. It doesn't actually provide any real gameplay features itself (in fact, it removes some), but lays the groundwork for other games to be built on top.''

Ever since I first saw [http://pyzzle.sourceforge.net Pyzzle], I've thought about writing a Myst style puzzle game. Unfortunately, it looks like development has halted on Pyzzle. Recently I started thinking, what would be involved in writing a Myst game using the Unreal engine?

And the more I thought about it, the less it seemed needed to be done. Certainly, there is a great deal of work in creating a complete Myst game, with a lot of detailed mapping and event scripting; but most of that goes into creating the map itself. As far as developing the base game code (the sub-engine, if you will), only a few simple changes need to be made:

* No weapons
** One of the pleasant elements of the Myst games is that they are non-violent by nature. You don't physically interact with other people, and in most you actually spend most of your time totally alone, exploring the world.
** By default, the player has one &quot;non-weapon&quot; with a range of about an arm's reach (basically a &quot;Use&quot; function). When the player &quot;shoots&quot;, the weapon hitscans anything in the map within range, and if the target is scripted to react, it does so.
** The weapon slots could be used for 10 generic items that can be collected and used during the game. Items should be picked up by clicking them, not by walking over them. The map creator would need to provide map models, hud models and hud icons if he wanted to use them, but they could be used as tags to identify to event scripts whether to respond to the hitscan. (Lock &quot;shot&quot; with Gold Key, trigger Open event)

* No health
** Damage should be irrelevant to most games of this type, and even death can be considered optional. The player should never need to know how much health they have, and whether they can afford to safely do something. Kill zones could be used in some maps if appropriate.

* No HUD
** Beyond a cursor to show exactly where the player is pointing (which is important in this game type), there doesn't need to be anything else on the screen. If collectable items are included as above, then the currently collected items should be displayed, but that is all.

Pretty much everything else would be built into the map design. To a large degree, a Myst map could be built as a standard Unreal level, but the lack of a general purpose &quot;Use&quot; function would severely hamper the puzzle design, and the presence of Health could complicate things (falling damage, for example). Providing a base from which to start gives the level design a bit more focus, and removes the elements of Unreal that would distract from the intended nature of the game.

It also creates a special game type that clearly marks the purpose of the maps, each of which is actually its own self contained puzzle game.

==Discussion ==

'''Kagato:''' It's been well over a year since I was last here, and I still haven't done any mod work myself. :(

I have, however, got myself a copy of ''Mastering Unreal Technology'', and intend to work my way through the whole book in my spare time (''hahahaha... &quot;spare time&quot;'').

It won't help me much with UnrealScript, but at least it'll finally get me into game content creation; and it fits well with this mod! :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Unreal Tower Defense</title>
    <id>2023</id>
    <revision>
      <id>4936</id>
      <timestamp>2007-08-29T22:43:26Z</timestamp>
      <contributor>
        <ip>Marduk2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

There are many Tower Defense variants out there, in common the player has to place some turrets to prevent waves of incomming mobs from reaching the exit of any given map.

It would be the same in UT, U1 or UT2xxx, players would play the role as the turrets and would fight against waves of monsters in a somewhat Invasion gametype style. Players would need to earn and spend credits to upgrade their weapons and/or buy power ups. The monsters would have some weakness / strenghts to make matches a bit more interesting.

'''Marduk2:''' Veeeery good idea, I love the many tower defenses there are out there.</text>
    </revision>
    <revision>
      <id>4937</id>
      <timestamp>2007-08-29T20:07:43Z</timestamp>
      <contributor>
        <ip>Sopa De Letras</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Description ==

There are many Tower Defense variants out there, in common the player has to place some turrets to prevent waves of incomming mobs from reaching the exit of any given map.

It would be the same in UT, U1 or UT2xxx, players would play the role as the turrets and would fight against waves of monsters in a somewhat Invasion gametype style. Players would need to earn and spend credits to upgrade their weapons and/or buy power ups. The monsters would have some weakness / strenghts to make matches a bit more interesting.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UnrealBallPool</title>
    <id>1884</id>
    <revision>
      <id>4622</id>
      <timestamp>2006-06-24T14:23:05Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Unreal Ball Pool}}

==Description ==

The object of this game is to have more spheroids in your team's ''ball pool'' than the other them when the time runs out.  There is no score limit in this game, and extra time will not be allowed so draws are possible.

At the beginning of the game 21 (make it odd you fool) balls are spawned randomly across the map.  Each team must collect the balls and carry them back to their &quot;ball pool&quot;.  For the purposes of this mod the ball pool can either be a CTF [[Legacy:FlagBase|FlagBase]], a Domination [[Legacy:ControlPoint|ControlPoint]] (since there are now only two) or, a custom &quot;BallPool&quot; zone/object.  In the case of a Domination map the owning team's control point is determined by the first team to deposit a ball at a control point.

Players may only carry one ball at a time, and the behaviour is similar to the bombing run game.  There are two main differences.
# Players do not have their health regenerated while carrying a ball.
# Players can switch to other weapons while carrying a ball although they cannot pass the ball without switching to the &quot;ball gun&quot; (or whatever the things called).

If a player is killed while carrying a ball it is dropped where the player died (plus a bit of a random kick to make it interesting).  Balls are picked up by simply running over them.  Balls can be stolen from the opposing teams ball pool simply by running through a ball within the enemy team's pool.  It is not possible to pick up balls in your own pool.

If a team manages to get all of the balls into their pool then they automatically win the game.

'''Under consideration:'''  Abandon the idea of using DOM and CTF maps as the basis of the mod and use a custom ball pool volume.  Once this has been done force payers to actually &quot;fire&quot; the ball into the pool.  Then track the enter and exit volume events to add and remove the team's points.

'''Under consideration:'''  You could have certain balls with letters on them say E-M-P-T-Y, which when you get all of those balls in your ball pool the opposing team's pool is ''flushed'' of balls.  This would require the time limited ball carrying idea.

'''Under consideration:''' Allow the use of DD, CTF, and BR maps by keeping the BR &quot;goal&quot; on BR maps and spawning them on CTF and DD maps.  Balls are &quot;deposited&quot; for scoring by shooting it through the hoop a-la-Bombing Run.  As soon as a single ball is deposited it appears on the ground in front of the scoring hoop.  This can then be picked up by the other team.  When it has been picked up, if there are any more balls left within the team's &quot;ball pool&quot; then another ball is spawned at the same place.  Remember - only one ball can be carried at any one time.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; I may actually do this.  Someone else has done the single flag CTF mod.

===Discussion ===

'''Birelli:''' Sounds cool, just a couple suggestions on it though. First off a pointless note that there is no need to limit this to two teams, 3 or 4 would be fine too as far as I can see if the maps were there for it. I'm not sure about the technical aspects (I suppose at this point no one is), but for domination you could just disable the normal code and set the point to be as if one team was &quot;controlling&quot; it (only it would then be static). Another interesting twist would be in domination maps whoever gets a ball to either control point first gets that control point and then the other team is immediately assigned the other one. Finally, the games for this will be waaaay to quick if it's just gather up the lose balls and bring them in. How about something where if a player from the opposing team occupies your &quot;ball pool&quot; for, say 2-5 seconds, (whatever balances well), then they get one ball from it and can then dash it away to their base. Adds a bit of defensive strategy and longevity to the game. Also, because the game will still be very quick, it would probably be a good idea to treat each collection as a sort of &quot;cap&quot; (you probably were already thinking that, you just didn't mention it), and then respawn everything, first to a certain limit wins.

I'm not sure if I'll be able to learn the new engine code but if I can I'd be interested in designing this, although it might take the help of a modeller for some gametype-specific objects (like the pool itself).

'''EntropicLqd:''' Thanks for the comments &amp;ndash; much appreciated.  I've updated the description of the mod to more closely resemble my ideas for it.  As you can see, there is no ''cap limit'' as such, this is purely a time based game.  I did consider having players stand in the enemies ball pool for a ''while'' in order to steal a ball but felt that it might slow down the action a little too much and make it too hard to steal balls from the enemy.  I chickened out and went for the CTF pace basically.  I liked your suggestion of setting the ''owner'' of the Domination control points based upon who touches which one first.  I wonder if it could lead to some interesting race conditions ....

'''DJPaul:'''   Really really REALLY really like this idea.  I was working on a similar sort of gametype in my notebook;  guess i'll have to go back to it! :(

'''EntropicLqd:'''  I've noticed a definate convergence of ideas over the last few months which is a little worrying as that implies a lack of creativity on the &quot;mod scene&quot;.  I'd been thinking about this one for a few months before I put it on the Wiki page.  It ''feels'' like a really good idea, I just don't know whether it will really play that well.  If it looks like I'm going to be ''a while'' getting around to it I'll let you know.

'''ZxAnPhOrIaN:''' The ball should be picked up by crouching, not just running over it.

'''Phantasmagorium:''' This sounds really cool. I especially like the idea of emptying your opposition's goal, but do the balls return to the playing field or directly to your goal, or what? I think that the original gametype you have planned (from what I gather by reading), and one with a very small number of balls where dumping goes directly into your goal, (like shooting a regular shot into your opponents goal instead of collecting the EMPTY balls to cause the drain) dumps the balls into your goal, and is therefore slightly more combat-oriented, would be nice.</text>
    </revision>
    <revision>
      <id>4623</id>
      <timestamp>2003-08-27T17:03:40Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>tweaks</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Unreal Ball Pool}}

==Description ==

The object of this game is to have more spheroids in your team's ''ball pool'' than the other them when the time runs out.  There is no score limit in this game, and extra time will not be allowed so draws are possible.

At the beginning of the game 21 (make it odd you fool) balls are spawned randomly across the map.  Each team must collect the balls and carry them back to their &quot;ball pool&quot;.  For the purposes of this mod the ball pool can either be a CTF [[Legacy:FlagBase|FlagBase]], a Domination [[Legacy:ControlPoint|ControlPoint]] (since there are now only two) or, a custom &quot;BallPool&quot; zone/object.  In the case of a Domination map the owning team's control point is determined by the first team to deposit a ball at a control point.

Players may only carry one ball at a time, and the behaviour is similar to the bombing run game.  There are two main differences.
# Players do not have their health regenerated while carrying a ball.
# Players can switch to other weapons while carrying a ball although they cannot pass the ball without switching to the &quot;ball gun&quot; (or whatever the things called).

If a player is killed while carrying a ball it is dropped where the player died (plus a bit of a random kick to make it interesting).  Balls are picked up by simply running over them.  Balls can be stolen from the opposing teams ball pool simply by running through a ball within the enemy team's pool.  It is not possible to pick up balls in your own pool.

If a team manages to get all of the balls into their pool then they automatically win the game.

'''Under consideration:'''  Abandon the idea of using DOM and CTF maps as the basis of the mod and use a custom ball pool volume.  Once this has been done force payers to actually &quot;fire&quot; the ball into the pool.  Then track the enter and exit volume events to add and remove the team's points.

'''Under consideration:'''  You could have certain balls with letters on them say E-M-P-T-Y, which when you get all of those balls in your ball pool the opposing team's pool is ''flushed'' of balls.  This would require the time limited ball carrying idea.

'''Under consideration:''' Allow the use of DD, CTF, and BR maps by keeping the BR &quot;goal&quot; on BR maps and spawning them on CTF and DD maps.  Balls are &quot;deposited&quot; for scoring by shooting it through the hoop a-la-Bombing Run.  As soon as a single ball is deposited it appears on the ground in front of the scoring hoop.  This can then be picked up by the other team.  When it has been picked up, if there are any more balls left within the team's &quot;ball pool&quot; then another ball is spawned at the same place.  Remember - only one ball can be carried at any one time.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; I may actually do this.  Someone else has done the single flag CTF mod.

===Discussion ===

'''Birelli:''' Sounds cool, just a couple suggestions on it though. First off a pointless note that there is no need to limit this to two teams, 3 or 4 would be fine too as far as I can see if the maps were there for it. I'm not sure about the technical aspects (I suppose at this point no one is), but for domination you could just disable the normal code and set the point to be as if one team was &quot;controlling&quot; it (only it would then be static). Another interesting twist would be in domination maps whoever gets a ball to either control point first gets that control point and then the other team is immediately assigned the other one. Finally, the games for this will be waaaay to quick if it's just gather up the lose balls and bring them in. How about something where if a player from the opposing team occupies your &quot;ball pool&quot; for, say 2-5 seconds, (whatever balances well), then they get one ball from it and can then dash it away to their base. Adds a bit of defensive strategy and longevity to the game. Also, because the game will still be very quick, it would probably be a good idea to treat each collection as a sort of &quot;cap&quot; (you probably were already thinking that, you just didn't mention it), and then respawn everything, first to a certain limit wins.

I'm not sure if I'll be able to learn the new engine code but if I can I'd be interested in designing this, although it might take the help of a modeller for some gametype-specific objects (like the pool itself).

'''EntropicLqd:''' Thanks for the comments &amp;ndash; much appreciated.  I've updated the description of the mod to more closely resemble my ideas for it.  As you can see, there is no ''cap limit'' as such, this is purely a time based game.  I did consider having players stand in the enemies ball pool for a ''while'' in order to steal a ball but felt that it might slow down the action a little too much and make it too hard to steal balls from the enemy.  I chickened out and went for the CTF pace basically.  I liked your suggestion of setting the ''owner'' of the Domination control points based upon who touches which one first.  I wonder if it could lead to some interesting race conditions ....

'''DJPaul:'''   Really really REALLY really like this idea.  I was working on a similar sort of gametype in my notebook;  guess i'll have to go back to it! :(

'''EntropicLqd:'''  I've noticed a definate convergence of ideas over the last few months which is a little worrying as that implies a lack of creativity on the &quot;mod scene&quot;.  I'd been thinking about this one for a few months before I put it on the Wiki page.  It ''feels'' like a really good idea, I just don't know whether it will really play that well.  If it looks like I'm going to be ''a while'' getting around to it I'll let you know.

'''ZxAnPhOrIaN:''' The ball should be picked up by crouching, not just running over it.

'''Phantasmagorium:''' This sounds really cool. I especially like the idea of emptying your opposition's goal, but do the balls return to the playing field or directly to your goal, or what? I think that the original gametype you have planned (from what I gather by reading), and one with a very small number of balls where dumping goes directly into your goal, (like shooting a regular shot into your opponents goal instead of collecting the EMPTY balls to cause the drain) dumps the balls into your goal, and is therefore slightly more combat-oriented, would be nice.</text>
    </revision>
    <revision>
      <id>4624</id>
      <timestamp>2006-06-24T09:56:51Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>delete</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Unreal Ball Pool}}

==Description ==

The object of this game is to have more spheroids in your team's ''ball pool'' than the other them when the time runs out.  There is no score limit in this game, and extra time will not be allowed so draws are possible.

At the beginning of the game 21 (make it odd you fool) balls are spawned randomly across the map.  Each team must collect the balls and carry them back to their &quot;ball pool&quot;.  For the purposes of this mod the ball pool can either be a CTF [[Legacy:FlagBase|FlagBase]], a Domination [[Legacy:ControlPoint|ControlPoint]] (since there are now only two) or, a custom &quot;BallPool&quot; zone/object.  In the case of a Domination map the owning team's control point is determined by the first team to deposit a ball at a control point.

Players may only carry one ball at a time, and the behaviour is similar to the bombing run game.  There are two main differences.
# Players do not have their health regenerated while carrying a ball.
# Players can switch to other weapons while carrying a ball although they cannot pass the ball without switching to the &quot;ball gun&quot; (or whatever the things called).

If a player is killed while carrying a ball it is dropped where the player died (plus a bit of a random kick to make it interesting).  Balls are picked up by simply running over them.  Balls can be stolen from the opposing teams ball pool simply by running through a ball within the enemy team's pool.  It is not possible to pick up balls in your own pool.

If a team manages to get all of the balls into their pool then they automatically win the game.

'''Under consideration:'''  Abandon the idea of using DOM and CTF maps as the basis of the mod and use a custom ball pool volume.  Once this has been done force payers to actually &quot;fire&quot; the ball into the pool.  Then track the enter and exit volume events to add and remove the team's points.

'''Under consideration:'''  You could have certain balls with letters on them say E-M-P-T-Y, which when you get all of those balls in your ball pool the opposing team's pool is ''flushed'' of balls.  This would require the time limited ball carrying idea.

'''Under consideration:''' Allow the use of DD, CTF, and BR maps by keeping the BR &quot;goal&quot; on BR maps and spawning them on CTF and DD maps.  Balls are &quot;deposited&quot; for scoring by shooting it through the hoop a-la-Bombing Run.  As soon as a single ball is deposited it appears on the ground in front of the scoring hoop.  This can then be picked up by the other team.  When it has been picked up, if there are any more balls left within the team's &quot;ball pool&quot; then another ball is spawned at the same place.  Remember - only one ball can be carried at any one time.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.
* [[Legacy:EntropicLqd|EntropicLqd]] &amp;ndash; I may actually do this.  Someone else has done the single flag CTF mod.

===Discussion ===

'''Birelli:''' Sounds cool, just a couple suggestions on it though. First off a pointless note that there is no need to limit this to two teams, 3 or 4 would be fine too as far as I can see if the maps were there for it. I'm not sure about the technical aspects (I suppose at this point no one is), but for domination you could just disable the normal code and set the point to be as if one team was &quot;controlling&quot; it (only it would then be static). Another interesting twist would be in domination maps whoever gets a ball to either control point first gets that control point and then the other team is immediately assigned the other one. Finally, the games for this will be waaaay to quick if it's just gather up the lose balls and bring them in. How about something where if a player from the opposing team occupies your &quot;ball pool&quot; for, say 2-5 seconds, (whatever balances well), then they get one ball from it and can then dash it away to their base. Adds a bit of defensive strategy and longevity to the game. Also, because the game will still be very quick, it would probably be a good idea to treat each collection as a sort of &quot;cap&quot; (you probably were already thinking that, you just didn't mention it), and then respawn everything, first to a certain limit wins.

I'm not sure if I'll be able to learn the new engine code but if I can I'd be interested in designing this, although it might take the help of a modeller for some gametype-specific objects (like the pool itself).

'''EntropicLqd:''' Thanks for the comments &amp;ndash; much appreciated.  I've updated the description of the mod to more closely resemble my ideas for it.  As you can see, there is no ''cap limit'' as such, this is purely a time based game.  I did consider having players stand in the enemies ball pool for a ''while'' in order to steal a ball but felt that it might slow down the action a little too much and make it too hard to steal balls from the enemy.  I chickened out and went for the CTF pace basically.  I liked your suggestion of setting the ''owner'' of the Domination control points based upon who touches which one first.  I wonder if it could lead to some interesting race conditions ....

'''DJPaul:'''   Really really REALLY really like this idea.  I was working on a similar sort of gametype in my notebook;  guess i'll have to go back to it! :(

'''EntropicLqd:'''  I've noticed a definate convergence of ideas over the last few months which is a little worrying as that implies a lack of creativity on the &quot;mod scene&quot;.  I'd been thinking about this one for a few months before I put it on the Wiki page.  It ''feels'' like a really good idea, I just don't know whether it will really play that well.  If it looks like I'm going to be ''a while'' getting around to it I'll let you know.

'''ZxAnPhOrIaN:''' The ball should be picked up by crouching, not just running over it.

'''Phantasmagorium:''' This sounds really cool. I especially like the idea of emptying your opposition's goal, but do the balls return to the playing field or directly to your goal, or what? I think that the original gametype you have planned (from what I gather by reading), and one with a very small number of balls where dumping goes directly into your goal, (like shooting a regular shot into your opponents goal instead of collecting the EMPTY balls to cause the drain) dumps the balls into your goal, and is therefore slightly more combat-oriented, would be nice.
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UnrealKartTournament</title>
    <id>2003</id>
    <revision>
      <id>4896</id>
      <timestamp>2004-03-31T10:59:11Z</timestamp>
      <contributor>
        <ip>User-5119.l3.c4.dsl.pol.co.uk</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Concept==

Think Super Mario Kart, but instead of the Mushroom kingdom it's set in the Unreal Universe. Therefore instead of Bowser we have Xan, instead of Luigi we have Malcolm, etc.

The idea for the mod is to be fun, not realistic

The complete (evolving) design document can be found on [http://wiki.unrealkart.elmuerte.com this special wiki]

==Developers==
* Michiel '[[Legacy:El Muerte|El Muerte]]' Hendriks
* TNSe showed interest (actually, TNSe sort of came up with the idea)
* [[Legacy:AlphaOne|AlphaOne]] ... I just have to be here ...

''need more''
* mapper (racing track developers)
* modellers
* 2D artists
* programmers
* etc..

==Need==
* forum
* website

==Discussion==

'''El Muerte:''' Join this mod, because [http://www.weebls-stuff.com/toons/29/ we've got lions]

'''pgibbs:''' If you need (another) coder, I think i'd like to help since this looks nice.</text>
    </revision>
    <revision>
      <id>4897</id>
      <timestamp>2004-03-29T19:41:16Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Concept==

Think Super Mario Kart, but instead of the Mushroom kingdom it's set in the Unreal Universe. Therefore instead of Bowser we have Xan, instead of Luigi we have Malcolm, etc.

The idea for the mod is to be fun, not realistic

The complete (evolving) design document can be found on [http://wiki.unrealkart.elmuerte.com this special wiki]

==Developers==
* Michiel '[[Legacy:El Muerte|El Muerte]]' Hendriks
* TNSe showed interest (actually, I started this because of something he said)
* [[Legacy:AlphaOne|AlphaOne]] ... I just have to be here ...

''need more''
* mapper (racing track developers)
* modellers
* etc..

==Need==
* our own (protected) wiki for development
* forum
* website

==Discussion==</text>
    </revision>
    <revision>
      <id>4898</id>
      <timestamp>2004-03-31T10:10:19Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Concept==

Think Super Mario Kart, but instead of the Mushroom kingdom it's set in the Unreal Universe. Therefore instead of Bowser we have Xan, instead of Luigi we have Malcolm, etc.

The idea for the mod is to be fun, not realistic

The complete (evolving) design document can be found on [http://wiki.unrealkart.elmuerte.com this special wiki]

==Developers==
* Michiel '[[Legacy:El Muerte|El Muerte]]' Hendriks
* TNSe showed interest (actually, TNSe sort of came up with the idea)
* [[Legacy:AlphaOne|AlphaOne]] ... I just have to be here ...

''need more''
* mapper (racing track developers)
* modellers
* 2D artists
* programmers
* etc..

==Need==
* forum
* website

==Discussion==

'''El Muerte:''' Join this mod, because [http://www.weebls-stuff.com/toons/29/ we've got lions]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UnrealSprint</title>
    <id>1886</id>
    <revision>
      <id>4627</id>
      <timestamp>2004-04-27T19:20:38Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <comment>No time :-(</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Sprint for Points}}

==Description ==

This mod is designed to be played on Domination maps.  In order to score a points for your team you must touch two control points consecutively without being killed.  The number of points your team gets increases as more and more control points are touched consecutively.  So, to get 1 point for your team you must touch one control point and then touch the other without dying.  If you manage this then you can run back and touch the other control point to gain more points.  Touching the same control point more than once doesn't count.  The scor your team gets when you touch a control point in a sequence is calculated as 2 ^ (n-2) squared where n is the number of consecutive control points touched.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

It may be more sensible to have each match split into two halves with a 'runnnig'' and ''defending'' team that swap over.  It would add the game a little more structure. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

'''Mr.Mitchell:''': I am not sure about the 2 halves. I think the chaos might add to the game, we will see how it works out when implementing this.

'''Mr.Mitchell:''' I just can't spend enough time on this to be able to produce something usefull. I still think it is a good idea, but I am going to remove my name.</text>
    </revision>
    <revision>
      <id>4628</id>
      <timestamp>2002-07-30T06:02:14Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Sprint for Points}}

==Description ==

This mod is designed to be played on Domination maps.  In order to score a points for your team you must touch two control points consecutively without being killed.  The number of points your team gets increases as more and more control points are touched consecutively.  So, to get 1 point for your team you must touch one control point and then touch the other without dying.  If you manage this then you can run back and touch the other control point to gain more points.  Touching the same control point more than once doesn't count.  The scor your team gets when you touch a control point in a sequence is calculated as 2 ^ (n-2) squared where n is the number of consecutive control points touched.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==

It may be more sensible to have each match split into two halves with a 'runnnig'' and ''defending'' team that swap over.  It would add the game a little more structure. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]</text>
    </revision>
    <revision>
      <id>4629</id>
      <timestamp>2004-04-02T20:11:25Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <comment>I am going to do it</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Sprint for Points}}

==Description ==

This mod is designed to be played on Domination maps.  In order to score a points for your team you must touch two control points consecutively without being killed.  The number of points your team gets increases as more and more control points are touched consecutively.  So, to get 1 point for your team you must touch one control point and then touch the other without dying.  If you manage this then you can run back and touch the other control point to gain more points.  Touching the same control point more than once doesn't count.  The scor your team gets when you touch a control point in a sequence is calculated as 2 ^ (n-2) squared where n is the number of consecutive control points touched.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

'''Mr.Mitchell:''': This sounds like the perfect gametype to get myself familiar with UT2004. I am going to implement this gametype.

==Discussion ==

It may be more sensible to have each match split into two halves with a 'runnnig'' and ''defending'' team that swap over.  It would add the game a little more structure. &amp;ndash; [[Legacy:EntropicLqd|EntropicLqd]]

'''Mr.Mitchell:''': I am not sure about the 2 halves. I think the chaos might add to the game, we will see how it works out when implementing this.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/UnrealTanks</title>
    <id>1887</id>
    <revision>
      <id>4630</id>
      <timestamp>2006-06-24T14:22:39Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Unreal Tanks}}

==Description ==

I must confess, I loved the original Atari Tanks game.  It was ace.  Decidedly cheesy, very silly, but ace all the same.  Essentially, this is a tank game.  Tanks drive around an arena at a reasonable rate of knots firing their guns at each other scoring points by making other tanks go boom.  The unusual thing about this is that the tank requires a driver and a gunner - indeed - two players per tank.  Here's the details bullet point style.
* Each tank requires a driver and a gunner.  The number of players in the game != number of tanks (should it be?)
* When the player joins the game they are asked whether they wish to be the driver or the gunner.
* The driver has the ability to accelerate, brake, turn left and turn right.  There is a slow firing forward facing energy gun available to the driver - which takes time to recharge after each shot.  The driver also has a turbo available to him, which will make the tank move faster for a short period of time.  This also charges over time.
* The gunner controls the main tank gun (suprise suprise).  The main gun fires shells that behave according the laws of physics so elevation IS important.  As well as the main gun the driver can &quot;laser target&quot; and track another tank.  This has the effect of calculating the elevation and lead of the main gun, and sounds an alarm in the target tank.  Three guided missiles are also available which can be flown redeemer style.  The missiles travel faster, have a much smaller range, and will be harder to steer.
* Both the gunner and the driver will have a &quot;free look&quot; mode where they can look around fully without being constrained by their normal views (not sure this is a good idea - the driver might need it all the time though.).
* A bot will supply any missing people within the tank.
* There will be separate HUDs for the gunner and driver, but I haven't decided what they should be yet.

I'm thinking about having recharging shields as well.  This would also add potential for an option to give the driver the ability to decide where to use his energy - recharging the shields, powering the engines, or recharging the front cannon (or a bit of all three) - an X-wing style thingy.

Recharge stations are also an option but I'd rather keep the gameplay as simple as possible.  It's a lot less tactical and a lot more gung-ho then.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==
: Nice idea, but good luck on the net code for this one, imagine having a driver on the server and a gunner a few hundred milliseconds away... could get ugly... possible fix is to have projectiles with lots of splash damage so firing timing isn't so critical &amp;ndash; ''Zedsquared''

: &lt;i&gt; Good point, I must confess to not having considered the network implications in any great depth.  I'm hoping that the client side prediction algorythms will come to my rescue.  Tanks are not the fastest things in the world so having the gunner and driver in seperate time spaces may not be that much of an issue.  And tank shells are not renowned for having small explosions :).&lt;/i&gt;

: One of the things I was considering was making the tank shells invisible and have the server create a &quot;time bomb&quot; at the point on the ground where the shell would have landed set to go off when it would have landed.  That way shells always explode on the ground.  I've got a feeling that the code to do it this way would be pretty tricky and waste as much processing time as it would save.  Need to think on that one a little more.

'''Anozireth:''' This might be a good gametype mod for UT2004, there's already a tank built in and Epic has obviously solved any net problems with 2 players in one vehicle.  Some changes to what it specified here would be required, and it would probably require it's own maps (''maybe'' could use ONS maps).  Anyone have thoughts?

'''Foxpaw:''' I haven't played the UT2004 demo online, but from what I've heard, the problems with multiple people in one vehicle are far from solved, and multiple people in one vehicle is only workable on fast connections. But that's just what I heard.

'''EntropicLqd:''' Don't know tbh.  I've not ever had any problems with it at all but then I normally play on servers where I get &lt; 80 ping.  I guess that's a reasonably fast connection.  Maybe I'll stop by the INA feedback forum and do a search through the ONS thread and see what I can dig up.  I must confess I did think about this idea after I'd played ONS so it might resurect itself.  At least I like UT2004 as a game.  That should help some.</text>
    </revision>
    <revision>
      <id>4631</id>
      <timestamp>2004-02-26T20:41:33Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>I've not had any problems yet - but that doesn't mean much</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Unreal Tanks}}

==Description ==

I must confess, I loved the original Atari Tanks game.  It was ace.  Decidedly cheesy, very silly, but ace all the same.  Essentially, this is a tank game.  Tanks drive around an arena at a reasonable rate of knots firing their guns at each other scoring points by making other tanks go boom.  The unusual thing about this is that the tank requires a driver and a gunner - indeed - two players per tank.  Here's the details bullet point style.
* Each tank requires a driver and a gunner.  The number of players in the game != number of tanks (should it be?)
* When the player joins the game they are asked whether they wish to be the driver or the gunner.
* The driver has the ability to accelerate, brake, turn left and turn right.  There is a slow firing forward facing energy gun available to the driver - which takes time to recharge after each shot.  The driver also has a turbo available to him, which will make the tank move faster for a short period of time.  This also charges over time.
* The gunner controls the main tank gun (suprise suprise).  The main gun fires shells that behave according the laws of physics so elevation IS important.  As well as the main gun the driver can &quot;laser target&quot; and track another tank.  This has the effect of calculating the elevation and lead of the main gun, and sounds an alarm in the target tank.  Three guided missiles are also available which can be flown redeemer style.  The missiles travel faster, have a much smaller range, and will be harder to steer.
* Both the gunner and the driver will have a &quot;free look&quot; mode where they can look around fully without being constrained by their normal views (not sure this is a good idea - the driver might need it all the time though.).
* A bot will supply any missing people within the tank.
* There will be separate HUDs for the gunner and driver, but I haven't decided what they should be yet.

I'm thinking about having recharging shields as well.  This would also add potential for an option to give the driver the ability to decide where to use his energy - recharging the shields, powering the engines, or recharging the front cannon (or a bit of all three) - an X-wing style thingy.

Recharge stations are also an option but I'd rather keep the gameplay as simple as possible.  It's a lot less tactical and a lot more gung-ho then.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==
: Nice idea, but good luck on the net code for this one, imagine having a driver on the server and a gunner a few hundred milliseconds away... could get ugly... possible fix is to have projectiles with lots of splash damage so firing timing isn't so critical &amp;ndash; ''Zedsquared''

: &lt;i&gt; Good point, I must confess to not having considered the network implications in any great depth.  I'm hoping that the client side prediction algorythms will come to my rescue.  Tanks are not the fastest things in the world so having the gunner and driver in seperate time spaces may not be that much of an issue.  And tank shells are not renowned for having small explosions :).&lt;/i&gt;

: One of the things I was considering was making the tank shells invisible and have the server create a &quot;time bomb&quot; at the point on the ground where the shell would have landed set to go off when it would have landed.  That way shells always explode on the ground.  I've got a feeling that the code to do it this way would be pretty tricky and waste as much processing time as it would save.  Need to think on that one a little more.

'''Anozireth:''' This might be a good gametype mod for UT2004, there's already a tank built in and Epic has obviously solved any net problems with 2 players in one vehicle.  Some changes to what it specified here would be required, and it would probably require it's own maps (''maybe'' could use ONS maps).  Anyone have thoughts?

'''Foxpaw:''' I haven't played the UT2004 demo online, but from what I've heard, the problems with multiple people in one vehicle are far from solved, and multiple people in one vehicle is only workable on fast connections. But that's just what I heard.

'''EntropicLqd:''' Don't know tbh.  I've not ever had any problems with it at all but then I normally play on servers where I get &lt; 80 ping.  I guess that's a reasonably fast connection.  Maybe I'll stop by the INA feedback forum and do a search through the ONS thread and see what I can dig up.  I must confess I did think about this idea after I'd played ONS so it might resurect itself.  At least I like UT2004 as a game.  That should help some.</text>
    </revision>
    <revision>
      <id>4632</id>
      <timestamp>2006-06-23T16:27:39Z</timestamp>
      <contributor>
        <ip>Kartoshka</ip>
      </contributor>
      <comment>delete</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Unreal Tanks}}

==Description ==

I must confess, I loved the original Atari Tanks game.  It was ace.  Decidedly cheesy, very silly, but ace all the same.  Essentially, this is a tank game.  Tanks drive around an arena at a reasonable rate of knots firing their guns at each other scoring points by making other tanks go boom.  The unusual thing about this is that the tank requires a driver and a gunner - indeed - two players per tank.  Here's the details bullet point style.
* Each tank requires a driver and a gunner.  The number of players in the game != number of tanks (should it be?)
* When the player joins the game they are asked whether they wish to be the driver or the gunner.
* The driver has the ability to accelerate, brake, turn left and turn right.  There is a slow firing forward facing energy gun available to the driver - which takes time to recharge after each shot.  The driver also has a turbo available to him, which will make the tank move faster for a short period of time.  This also charges over time.
* The gunner controls the main tank gun (suprise suprise).  The main gun fires shells that behave according the laws of physics so elevation IS important.  As well as the main gun the driver can &quot;laser target&quot; and track another tank.  This has the effect of calculating the elevation and lead of the main gun, and sounds an alarm in the target tank.  Three guided missiles are also available which can be flown redeemer style.  The missiles travel faster, have a much smaller range, and will be harder to steer.
* Both the gunner and the driver will have a &quot;free look&quot; mode where they can look around fully without being constrained by their normal views (not sure this is a good idea - the driver might need it all the time though.).
* A bot will supply any missing people within the tank.
* There will be separate HUDs for the gunner and driver, but I haven't decided what they should be yet.

I'm thinking about having recharging shields as well.  This would also add potential for an option to give the driver the ability to decide where to use his energy - recharging the shields, powering the engines, or recharging the front cannon (or a bit of all three) - an X-wing style thingy.

Recharge stations are also an option but I'd rather keep the gameplay as simple as possible.  It's a lot less tactical and a lot more gung-ho then.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

==Discussion ==
: Nice idea, but good luck on the net code for this one, imagine having a driver on the server and a gunner a few hundred milliseconds away... could get ugly... possible fix is to have projectiles with lots of splash damage so firing timing isn't so critical &amp;ndash; ''Zedsquared''

: &lt;i&gt; Good point, I must confess to not having considered the network implications in any great depth.  I'm hoping that the client side prediction algorythms will come to my rescue.  Tanks are not the fastest things in the world so having the gunner and driver in seperate time spaces may not be that much of an issue.  And tank shells are not renowned for having small explosions :).&lt;/i&gt;

: One of the things I was considering was making the tank shells invisible and have the server create a &quot;time bomb&quot; at the point on the ground where the shell would have landed set to go off when it would have landed.  That way shells always explode on the ground.  I've got a feeling that the code to do it this way would be pretty tricky and waste as much processing time as it would save.  Need to think on that one a little more.

'''Anozireth:''' This might be a good gametype mod for UT2004, there's already a tank built in and Epic has obviously solved any net problems with 2 players in one vehicle.  Some changes to what it specified here would be required, and it would probably require it's own maps (''maybe'' could use ONS maps).  Anyone have thoughts?

'''Foxpaw:''' I haven't played the UT2004 demo online, but from what I've heard, the problems with multiple people in one vehicle are far from solved, and multiple people in one vehicle is only workable on fast connections. But that's just what I heard.

'''EntropicLqd:''' Don't know tbh.  I've not ever had any problems with it at all but then I normally play on servers where I get &lt; 80 ping.  I guess that's a reasonably fast connection.  Maybe I'll stop by the INA feedback forum and do a search through the ONS thread and see what I can dig up.  I must confess I did think about this idea after I'd played ONS so it might resurect itself.  At least I like UT2004 as a game.  That should help some.
[[Category:Legacy Delete Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Upgrades</title>
    <id>2011</id>
    <revision>
      <id>4914</id>
      <timestamp>2005-01-24T05:30:58Z</timestamp>
      <contributor>
        <ip>SyPTo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This mutator is inspired by mr.pants excessive for UT2004. With this mutator on when your opponent drops a weapon and you pick it up the weapon that he droped is upgraded. Like when your oponent drops an assault rifle the current assault rifle you have is &quot;upgraded&quot;. There are five levels that a gun goes through:
# Normal
# Double weapon, similer to the assult rifle, you hold and can fire a second weapon and you get all it's amo.
# Beserk, the power and firing rate of the (double) weapon increases as if you had the beserk adreniline. You also have the visual effects of beserk, but you aren't beserk if you switch weapons.
# Double damage, you weapons glow with a purple light, and the damage they deal is doubled.
# INSANE, be prepared to win. Visual effects the same as being fully upgraded in excessive

Naturally these are very powerful becasue it is very seldom that five opponents in a row drop flak cannons.

==Comments==

umm... bump?

-= SyPTo =-

Nice idea, you don't think you should ad a timer to it , so that you let's say only can be on insane for 30 seconds before it drops a level then a min before it drops another but not lower then level 3...thing is when a player drops it's not just dropping one weapon unless we make it randomly choose a weapon that it will drop on kill , otherwise if someone with a full arsenal gets killed  you could insta upgrade all your weapons , wich i think would make it a bit over the top. what about adding 50% more fire power on level 3 50% more health and 50% more ammo carry capability  and on level 4 that + let's say 25% more speed and 50% more shields.this would not only make the weapons stronger but also yourslef...</text>
    </revision>
    <revision>
      <id>4915</id>
      <timestamp>2005-01-23T18:11:58Z</timestamp>
      <contributor>
        <ip>User-0ccenae.cable.mindspring.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This mutator is inspired by mr.pants excessive for UT2004. With this mutator on when your opponent drops a weapon and you pick it up the weapon that he droped is upgraded. Like when your oponent drops an assault rifle the current assault rifle you have is &quot;upgraded&quot;. There are five levels that a gun goes through:
# Normal
# Double weapon, similer to the assult rifle, you hold and can fire a second weapon and you get all it's amo.
# Beserk, the power and firing rate of the (double) weapon increases as if you had the beserk adreniline. You also have the visual effects of beserk, but you aren't beserk if you switch weapons.
# Double damage, you weapons glow with a purple light, and the damage they deal is doubled.
# INSANE, be prepared to win. Visual effects the same as being fully upgraded in excessive

Naturally these are very powerful becasue it is very seldom that five opponents in a row drop flak cannons.

==Comments==

umm... bump?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Variant Weapon</title>
    <id>1970</id>
    <revision>
      <id>4821</id>
      <timestamp>2003-10-23T09:33:15Z</timestamp>
      <contributor>
        <ip>CH3Z</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any &amp;ndash; UT/UT2003 &amp;ndash; Variant Weapon}}

==Description ==

This could be a new weapon or just an option available for the client to modify any weapon at runtime to change the params of the alt-fire. If it's done in the latter fasion, each weapon would have its own list of options to choose from.

====Interested Scripters ====

If you are interested in developing this mod for UT/UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* (name in link form)
* (name in link form)

----

==Discussion ==

'''CH3Z:''' I don't know if this is possible or not. It may be that the client would have to make their choices after connected to the server, but before the level loads.

'''Foxpaw:''' I'm sure that it can be done - I'm curious though, what kind of parameters for the alternate fire did you have in mind?

'''CH3Z:''' I kinda left that open to the modder. Was thinking maybe what projectile, damage, not sure what all is possible.

'''Jarronis, The Vampiric Unicorn''' Well, in an experiment with a Experience Mutator, I also had a realtime Weapon adaption. So if you increased in level, you got also more flak-chunks, and the time for rocket-target-acquisition was lowered. This all, of course was only a change of the defaultproperties. As I'm quite inexperienced with Network - scripting in UT/UT2003 i don't know how this is replicated in network games.

'''Mysterial:''' Defaultproperties are not replicated automatically, you'd have to set them on each instance of the actor after it has spawned for it to work.

'''Ch3z:''' Couldn't you have a function, maybe ReplaceAmmo(class NewAmmo), that replaces the ammoclass with the passed class and call ReplaceAmmo(SelectedAmmo) from within the altfire function? &lt;br /&gt;For that matter, if altfire calls up that defaultproperty couldn't you just override the whole altfire function and call up the property that was selected by the user?</text>
    </revision>
    <revision>
      <id>4822</id>
      <timestamp>2003-05-23T04:04:48Z</timestamp>
      <contributor>
        <ip>Mysterial</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for Any &amp;ndash; UT/UT2003 &amp;ndash; Variant Weapon}}

==Description ==

This could be a new weapon or just an option available for the client to modify any weapon at runtime to change the params of the alt-fire. If it's done in the latter fasion, each weapon would have its own list of options to choose from.

====Interested Scripters ====

If you are interested in developing this mod for UT/UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

* (name in link form)
* (name in link form)

----

==Discussion ==

'''CH3Z:''' I don't know if this is possible or not. It may be that the client would have to make their choices after connected to the server, but before the level loads.

'''Foxpaw:''' I'm sure that it can be done - I'm curious though, what kind of parameters for the alternate fire did you have in mind?

'''CH3Z:''' I kinda left that open to the modder. Was thinking maybe what projectile, damage, not sure what all is possible.

'''Jarronis, The Vampiric Unicorn''' Well, in an experiment with a Experience Mutator, I also had a realtime Weapon adaption. So if you increased in level, you got also more flak-chunks, and the time for rocket-target-acquisition was lowered. This all, of course was only a change of the defaultproperties. As I'm quite inexperienced with Network - scripting in UT/UT2003 i don't know how this is replicated in network games.

'''Mysterial:''' Defaultproperties are not replicated automatically, you'd have to set them on each instance of the actor after it has spawned for it to work.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/VelocityTrigger</title>
    <id>1933</id>
    <revision>
      <id>4735</id>
      <timestamp>2002-10-31T21:03:50Z</timestamp>
      <contributor>
        <ip>WebcacheB09a.cache.pol.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Description ===

Pretty Much the same as the TargetKicker, but instead of a target, you put in a distance in UU, and instead of a time, you put in a velocity in X, Y, and Z amounts

===Interested Scripters ===

===Discussion ===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Virus</title>
    <id>1888</id>
    <revision>
      <id>4633</id>
      <timestamp>2003-06-01T09:26:42Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Virus? ==

Yes virus. I remember along time ago there was a game in which the purpose what to track down and find a virus (Which in that case was a ship)in your own computer. It was insane. You would be flying around and there would be bits of all your files on your computers on the walls and such. Like some of your document or sounds and music repeating in areas. It was quite the inventive game. I don't really know if anyone took notice of such a great Idea and maybe with the new Unreal engine someone can put some better use to the point.

==Gameplay ==

You tracking the virus in your own computer and exterminate them before they can get to the critical system files.I think it should play as a single player better.  It would only be suitable that way. Teamplay could work to. Two hunters vs. a virus or something. Could be intresting. I think you should start with all weapons to. 

==Features ==

*It should be walking around instead of flying in a ship like the other game. 
*I think this would need some of its own maps that could have some kind of scripted textures or something on the walls to produce what the developers of the original game did.
*Same thing goes for the ambiedient sounds. Scripted sounds sounds like how you should do it.
*On the side of the hud in the originally game was kind of a tree of all your folders and as you entered more rooms you would go deeper into the folder and you would see files from that folder. So that on the hud would really raise some thumbs.(Hopefully not middle fingers)
*There should be more than one type of virus like ones that spawn other virus. Spreading and so on. More violent viruses and then the stupid ones. Mix it up.

~The Twiggman~

==Comments ==

'''EntropicLqd:'''  And I thought it was going to be a conversion of ''Zarch'' the first game released for the Archimedes and later released on the ZX-Spectrum under the name ''Virus''.  Personally, I wouldn't install this mod if it used the real folders and files names off my hard disk.  It would feel far to much like a massive security hole.  By all means randomly generate them, but using the real names ... nooooo!.

'''Foxpaw:''' I'd have to agree with that.. not only is that kind of insecure.. the Unreal Engine isn't really friendly towards opening random files on your harddrive and reading them - it would be a lot of work and probrably need to be implemented natively if you wanted to load anything that wasn't in one of Epic's proprietary formats. (At least I think the formats are proprietary.) OGG music files could also be played.</text>
    </revision>
    <revision>
      <id>4634</id>
      <timestamp>2002-07-29T08:58:17Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Added comment</comment>
      <text xml:space="preserve">==Virus? ==

Yes virus. I remember along time ago there was a game in which the purpose what to track down and find a virus (Which in that case was a ship)in your own computer. It was insane. You would be flying around and there would be bits of all your files on your computers on the walls and such. Like some of your document or sounds and music repeating in areas. It was quite the inventive game. I don't really know if anyone took notice of such a great Idea and maybe with the new Unreal engine someone can put some better use to the point.

==Gameplay ==

You tracking the virus in your own computer and exterminate them before they can get to the critical system files.I think it should play as a single player better.  It would only be suitable that way. Teamplay could work to. Two hunters vs. a virus or something. Could be intresting. I think you should start with all weapons to. 

==Features ==

*It should be walking around instead of flying in a ship like the other game. 
*I think this would need some of its own maps that could have some kind of scripted textures or something on the walls to produce what the developers of the original game did.
*Same thing goes for the ambiedient sounds. Scripted sounds sounds like how you should do it.
*On the side of the hud in the originally game was kind of a tree of all your folders and as you entered more rooms you would go deeper into the folder and you would see files from that folder. So that on the hud would really raise some thumbs.(Hopefully not middle fingers)
*There should be more than one type of virus like ones that spawn other virus. Spreading and so on. More violent viruses and then the stupid ones. Mix it up.

~The Twiggman~

==Comments ==

'''EntropicLqd:'''  And I thought it was going to be a conversion of ''Zarch'' the first game released for the Archimedes and later released on the ZX-Spectrum under the name ''Virus''.  Personally, I wouldn't install this mod if it used the real folders and files names off my hard disk.  It would feel far to much like a massive security hole.  By all means randomly generate them, but using the real names ... nooooo!.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/WaterFight</title>
    <id>1949</id>
    <revision>
      <id>4774</id>
      <timestamp>2003-02-08T17:36:48Z</timestamp>
      <contributor>
        <ip>WebcacheB05a.cache.pol.co.uk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Water Fight}}

==Description ==

This mod is really designed for team games, but could make an interesting DM type game.  Rather than run around with big guns, player carry water pistols and have to soak each other to win.  All of the water pistols are fed from a single water tank carried on the players back.  That way only a single &quot;ammo store&quot; is required.  Measured in litres ofcourse :).

When full the player's water tank will reduce the speed of the player.  As the water is used, the tank becomes lighter and the players move faster.  Also, as the player gets &quot;soaked&quot; he will also start to move slower.  Once the player is soaked through to the skin then they are out of the game (their weapon stops working) until they can dry themselves out.

===Weapons ===

In order to keep the game very simple there will be very few weapons in the game.
* Pistol &amp;ndash; The default weapon.  It fires a small amount of water at short range.  It can fire very fast, but then it needs to.
* Pump Action Soaker &amp;ndash; This weapon fires a short burst of water from short to medium range.  Athough the fire rate isn't particularly great, the soakage is extreme.
* Streaming Soaker &amp;ndash; As it's name suggests the streaming soaker fires a continuous stream of water able to soak targets at long range.  The stream size itself is not particularly large, but accurate use of this weapon can soak someone in seconds.
* Water bombms &amp;ndash; These grenades will soak someone instantly if a direct hit is scored.  They also cause additional soakage if you get caught in the splash damage.
* Thermal grenade &amp;ndash; These intelligent team weapons can be used to dry members of your team out.  It creates a sphere of heat that will dry out any team members, as well as losing them up to 20% of their current water load.

===Map Components ===

There are some new map components for this:
* Water Filling Station &amp;ndash; This is where players can get their water tanks refilled.  There should be a few of these scattered around the map.
* Thermal Vent &amp;ndash; When standing on a vent a player will start to dry out.  The player will also start to lose water from their water tank (much more slowly than they dry out).

===New GameTypes ===
* Soakmatch &amp;ndash; Run around all players for themselves soakage fun.
* Fill the Bucket &amp;ndash; Players are split into two teams.  Each team is provided a large bucket that the other team tries to fill.  The team to fill their opponent's bucket (or has the least amount of water in it) wins the match.  Options to include allowing evaporating water should be present.

===Scoring ===

Players are scored based upon the amount of soakage they inflict on other players.  The more accurate a player is the more likely they are to get a high score.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

Zxan:(for the water drop textures (courtesy of Paint Shop Pro 7's water droplet picture tube)) [[Image:Legacy_Water_Drops.jpeg|]]

==Discussion ==

'''EntropicLqd:''' Based on an idea I saw a while back.  I finally decided to post it here.

'''Tarquin:''' Sounds fun. How is &quot;soakedness&quot; going to be displayed? Would drops water from playes be feasible (and would they look ok?) Could players leave a trail of wet footprints?

'''RegularX:''' Some must demand bikin clad models - it might as well be me.

'''Eldhrin:''' This sounds very interesting. I'd put myself down as interested but I have no time at present. Maybe later.

'''ZxAnPhOrIaN:''' hehehe... ''splash'' damage!! I will be glad to provide the water drops falling off the players. Also, if you fall into the water, will you get soaked, or will the water backpack fill up?

'''Icedude:''' Ever see that episode of Malcom In The Middle where they build that giant slingshot on the roof? Maybe there could be some of those in the maps so you can get x3 range with water balloons?  And what about pools of water? Could you fill your water tank in them, while they slowly soak you?</text>
    </revision>
    <revision>
      <id>4775</id>
      <timestamp>2003-01-23T23:21:59Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Water Fight}}

==Description ==

This mod is really designed for team games, but could make an interesting DM type game.  Rather than run around with big guns, player carry water pistols and have to soak each other to win.  All of the water pistols are fed from a single water tank carried on the players back.  That way only a single &quot;ammo store&quot; is required.  Measured in litres ofcourse :).

When full the player's water tank will reduce the speed of the player.  As the water is used, the tank becomes lighter and the players move faster.  Also, as the player gets &quot;soaked&quot; he will also start to move slower.  Once the player is soaked through to the skin then they are out of the game (their weapon stops working) until they can dry themselves out.

===Weapons ===

In order to keep the game very simple there will be very few weapons in the game.
* Pistol &amp;ndash; The default weapon.  It fires a small amount of water at short range.  It can fire very fast, but then it needs to.
* Pump Action Soaker &amp;ndash; This weapon fires a short burst of water from short to medium range.  Athough the fire rate isn't particularly great, the soakage is extreme.
* Streaming Soaker &amp;ndash; As it's name suggests the streaming soaker fires a continuous stream of water able to soak targets at long range.  The stream size itself is not particularly large, but accurate use of this weapon can soak someone in seconds.
* Water bombms &amp;ndash; These grenades will soak someone instantly if a direct hit is scored.  They also cause additional soakage if you get caught in the splash damage.
* Thermal grenade &amp;ndash; These intelligent team weapons can be used to dry members of your team out.  It creates a sphere of heat that will dry out any team members, as well as losing them up to 20% of their current water load.

===Map Components ===

There are some new map components for this:
* Water Filling Station &amp;ndash; This is where players can get their water tanks refilled.  There should be a few of these scattered around the map.
* Thermal Vent &amp;ndash; When standing on a vent a player will start to dry out.  The player will also start to lose water from their water tank (much more slowly than they dry out).

===New GameTypes ===
* Soakmatch &amp;ndash; Run around all players for themselves soakage fun.
* Fill the Bucket &amp;ndash; Players are split into two teams.  Each team is provided a large bucket that the other team tries to fill.  The team to fill their opponent's bucket (or has the least amount of water in it) wins the match.  Options to include allowing evaporating water should be present.

===Scoring ===

Players are scored based upon the amount of soakage they inflict on other players.  The more accurate a player is the more likely they are to get a high score.

====Interested Scripters ====

If you are interested in developing this mod for UT2003 then add your name to the list.  Once you start development you should indicate that below (and hopefully include a link to a journal page).  Before you start development you should also check this section to see if anyone else has started.

Zxan:(for the water drop textures (courtesy of Paint Shop Pro 7's water droplet picture tube)) [[Image:Legacy_Water_Drops.jpeg|]]

==Discussion ==

'''EntropicLqd:''' Based on an idea I saw a while back.  I finally decided to post it here.

'''Tarquin:''' Sounds fun. How is &quot;soakedness&quot; going to be displayed? Would drops water from playes be feasible (and would they look ok?) Could players leave a trail of wet footprints?

'''RegularX:''' Some must demand bikin clad models - it might as well be me.

'''Eldhrin:''' This sounds very interesting. I'd put myself down as interested but I have no time at present. Maybe later.

'''ZxAnPhOrIaN:''' hehehe... ''splash'' damage!! I will be glad to provide the water drops falling off the players. Also, if you fall into the water, will you get soaked, or will the water backpack fill up?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/We've Created A Monster</title>
    <id>1987</id>
    <revision>
      <id>4858</id>
      <timestamp>2006-08-13T12:10:18Z</timestamp>
      <contributor>
        <ip>DarkMan</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Discussion&quot; Title</comment>
      <text xml:space="preserve">==Firstly...==

This gametype has been adapted from an Airsoft Scenario on http://www.unconventional-airsoft.com.

==Overview==

This gametype is unique in that skills from three areas can be applied to it: deathmatch, team deathmatch, and last man standing skills all come into play. If you have an abundance of skill in one, that may offset a relatively low skill level in another.

==The Premise==

A group of scientists, while attempting to create a super soldier for the government, has gone FUBAR and the &quot;super soldier&quot; has turned into a crazed monster.

The labs security team must stop the monster. The scientists feel a certain paternal pride in their creation and must prevent the security team from killing their &quot;baby.&quot;

==Teams==

The game is played in &quot;rounds&quot; and players are rotated around three &quot;teams:&quot; The containment team/security guards, scientists, and the monster.

One player is the monster, and the remaining players are divided: one third of the remaining players are scientists, the rest are security guards. The teams rotate every round so every player spends the same number of rounds on any given team as any other given player.

; The MONSTER : Only one player is the monster at any given time. The monster is invulnerable to all weapons except the EXPERIMENTAL WEAPON(s). The monster gains one point for every person it kills, and it can kill either scientists or guards, though since the scientists will probrably be defending it, guards are a better target. When the monster dies, the round is over and teams are rotated. Being the MONSTER stresses deathmatch skills.

; The SCIENTISTS : Scientists gain one point for every guard that they kill, but gain no points for killing other scientists. When a scientist dies, they are out for the rest of the game. The scientists stress LAST MAN STANDING skills.

; The SECURITY GUARDS : Security guards cannot score points and thus should work together to bring down the monster and insane scientists as quickly as possible, to prevent them from gaining points. The security guards respawn when killed. Security guards stress TEAM DEATHMATCH skills.

==The Experimental Weapons==

The monster can ONLY be killed by the experimental weapons. There should be at least two experimental weapons spawned randomly on the level. (maybe more, could be configurable) There must be at least two to prevent the monster from camping on the experimental weapon.

The experimental weapon can ONLY be picked up by security guards. If it is destroyed somehow (falling into lava or whatever) it will respawn somewhere on the map.

==The Game Balance==

It should be obvious that the monster holds most of the cards, which is why players must rotate so each has a chance in each of the roles.

Security Guards minimize other players players point scoring ability by quickly and efficiently eliminating the monster.

Scientists make life hard for the security guards by harassing them as they try to find the experimental weapon. When the monster dies, they can no longer score points, so their primary interest is protection of the monster.

The monster is the position in which you score most of your points - but your time as the monster is limited.

==Discussion ==

'''EntropicLqd:''' Nice idea.  I assume that scientists are only really out for the &quot;round&quot; rather than the game.  It might be worth giving both the monster and scientists points for surviving the round without being killed should the round time-limit be reached ... at least I assume that there is a round time limit.

'''Foxpaw:''' Yes, the scientists are out until the round ends at which point they get rotated to another position. (possibly another position on the same team depending on the team size) I wasn't thinking of a time limit, but I suppose you could include one. I was thinking the rounds would be more like a &quot;round&quot; in Bombing Run. After the monster is killed, all players randomly respawn. I don't know if a round timer would even be necessary, as I don't think it would take too long for the security team to locate an experimental weapon.

'''Tarquin:''' I like this one! Just out of interest, how many of the mod ideas pages ACTUALLY get made? Should we start cleaning them up &amp; deleting some?

'''MythOpus:''' Agreed :)  We should start cleaning up!

'''EntropicLqd:''' And how would you decide which ones to delete?  I'm unlikely to ever build any of the mods I suggested as not only do I dislike 2K3 intensely, I foolishly agreed to participate in the creation of a new company so all my spare time is spent coding for that (go-live in Feb next year).  Does that mean they should simply expire?  Some of the ideas are pretty good.  Hmmm.  The Wiki needs a voting system or something similar.  And this discussion should probably be moved to the mod ideas page as well .....</text>
    </revision>
    <revision>
      <id>4859</id>
      <timestamp>2003-11-27T20:58:45Z</timestamp>
      <contributor>
        <ip>Static24-72-1-67.reverse.accesscomm.ca</ip>
      </contributor>
      <comment>Response From Good Ol' Myth Man</comment>
      <text xml:space="preserve">==Firstly...==

This gametype has been adapted from an Airsoft Scenario on http://www.unconventional-airsoft.com.

==Overview==

This gametype is unique in that skills from three areas can be applied to it: deathmatch, team deathmatch, and last man standing skills all come into play. If you have an abundance of skill in one, that may offset a relatively low skill level in another.

==The Premise==

A group of scientists, while attempting to create a super soldier for the government, has gone FUBAR and the &quot;super soldier&quot; has turned into a crazed monster.

The labs security team must stop the monster. The scientists feel a certain paternal pride in their creation and must prevent the security team from killing their &quot;baby.&quot;

==Teams==

The game is played in &quot;rounds&quot; and players are rotated around three &quot;teams:&quot; The containment team/security guards, scientists, and the monster.

One player is the monster, and the remaining players are divided: one third of the remaining players are scientists, the rest are security guards. The teams rotate every round so every player spends the same number of rounds on any given team as any other given player.

; The MONSTER : Only one player is the monster at any given time. The monster is invulnerable to all weapons except the EXPERIMENTAL WEAPON(s). The monster gains one point for every person it kills, and it can kill either scientists or guards, though since the scientists will probrably be defending it, guards are a better target. When the monster dies, the round is over and teams are rotated. Being the MONSTER stresses deathmatch skills.

; The SCIENTISTS : Scientists gain one point for every guard that they kill, but gain no points for killing other scientists. When a scientist dies, they are out for the rest of the game. The scientists stress LAST MAN STANDING skills.

; The SECURITY GUARDS : Security guards cannot score points and thus should work together to bring down the monster and insane scientists as quickly as possible, to prevent them from gaining points. The security guards respawn when killed. Security guards stress TEAM DEATHMATCH skills.

==The Experimental Weapons==

The monster can ONLY be killed by the experimental weapons. There should be at least two experimental weapons spawned randomly on the level. (maybe more, could be configurable) There must be at least two to prevent the monster from camping on the experimental weapon.

The experimental weapon can ONLY be picked up by security guards. If it is destroyed somehow (falling into lava or whatever) it will respawn somewhere on the map.

==The Game Balance==

It should be obvious that the monster holds most of the cards, which is why players must rotate so each has a chance in each of the roles.

Security Guards minimize other players players point scoring ability by quickly and efficiently eliminating the monster.

Scientists make life hard for the security guards by harassing them as they try to find the experimental weapon. When the monster dies, they can no longer score points, so their primary interest is protection of the monster.

The monster is the position in which you score most of your points - but your time as the monster is limited.

'''EntropicLqd:''' Nice idea.  I assume that scientists are only really out for the &quot;round&quot; rather than the game.  It might be worth giving both the monster and scientists points for surviving the round without being killed should the round time-limit be reached ... at least I assume that there is a round time limit.

'''Foxpaw:''' Yes, the scientists are out until the round ends at which point they get rotated to another position. (possibly another position on the same team depending on the team size) I wasn't thinking of a time limit, but I suppose you could include one. I was thinking the rounds would be more like a &quot;round&quot; in Bombing Run. After the monster is killed, all players randomly respawn. I don't know if a round timer would even be necessary, as I don't think it would take too long for the security team to locate an experimental weapon.

'''Tarquin:''' I like this one! Just out of interest, how many of the mod ideas pages ACTUALLY get made? Should we start cleaning them up &amp; deleting some?

'''MythOpus:''' Agreed :)  We should start cleaning up!</text>
    </revision>
    <revision>
      <id>4860</id>
      <timestamp>2003-11-28T11:34:33Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>my 2 paras</comment>
      <text xml:space="preserve">==Firstly...==

This gametype has been adapted from an Airsoft Scenario on http://www.unconventional-airsoft.com.

==Overview==

This gametype is unique in that skills from three areas can be applied to it: deathmatch, team deathmatch, and last man standing skills all come into play. If you have an abundance of skill in one, that may offset a relatively low skill level in another.

==The Premise==

A group of scientists, while attempting to create a super soldier for the government, has gone FUBAR and the &quot;super soldier&quot; has turned into a crazed monster.

The labs security team must stop the monster. The scientists feel a certain paternal pride in their creation and must prevent the security team from killing their &quot;baby.&quot;

==Teams==

The game is played in &quot;rounds&quot; and players are rotated around three &quot;teams:&quot; The containment team/security guards, scientists, and the monster.

One player is the monster, and the remaining players are divided: one third of the remaining players are scientists, the rest are security guards. The teams rotate every round so every player spends the same number of rounds on any given team as any other given player.

; The MONSTER : Only one player is the monster at any given time. The monster is invulnerable to all weapons except the EXPERIMENTAL WEAPON(s). The monster gains one point for every person it kills, and it can kill either scientists or guards, though since the scientists will probrably be defending it, guards are a better target. When the monster dies, the round is over and teams are rotated. Being the MONSTER stresses deathmatch skills.

; The SCIENTISTS : Scientists gain one point for every guard that they kill, but gain no points for killing other scientists. When a scientist dies, they are out for the rest of the game. The scientists stress LAST MAN STANDING skills.

; The SECURITY GUARDS : Security guards cannot score points and thus should work together to bring down the monster and insane scientists as quickly as possible, to prevent them from gaining points. The security guards respawn when killed. Security guards stress TEAM DEATHMATCH skills.

==The Experimental Weapons==

The monster can ONLY be killed by the experimental weapons. There should be at least two experimental weapons spawned randomly on the level. (maybe more, could be configurable) There must be at least two to prevent the monster from camping on the experimental weapon.

The experimental weapon can ONLY be picked up by security guards. If it is destroyed somehow (falling into lava or whatever) it will respawn somewhere on the map.

==The Game Balance==

It should be obvious that the monster holds most of the cards, which is why players must rotate so each has a chance in each of the roles.

Security Guards minimize other players players point scoring ability by quickly and efficiently eliminating the monster.

Scientists make life hard for the security guards by harassing them as they try to find the experimental weapon. When the monster dies, they can no longer score points, so their primary interest is protection of the monster.

The monster is the position in which you score most of your points - but your time as the monster is limited.

'''EntropicLqd:''' Nice idea.  I assume that scientists are only really out for the &quot;round&quot; rather than the game.  It might be worth giving both the monster and scientists points for surviving the round without being killed should the round time-limit be reached ... at least I assume that there is a round time limit.

'''Foxpaw:''' Yes, the scientists are out until the round ends at which point they get rotated to another position. (possibly another position on the same team depending on the team size) I wasn't thinking of a time limit, but I suppose you could include one. I was thinking the rounds would be more like a &quot;round&quot; in Bombing Run. After the monster is killed, all players randomly respawn. I don't know if a round timer would even be necessary, as I don't think it would take too long for the security team to locate an experimental weapon.

'''Tarquin:''' I like this one! Just out of interest, how many of the mod ideas pages ACTUALLY get made? Should we start cleaning them up &amp; deleting some?

'''MythOpus:''' Agreed :)  We should start cleaning up!

'''EntropicLqd:''' And how would you decide which ones to delete?  I'm unlikely to ever build any of the mods I suggested as not only do I dislike 2K3 intensely, I foolishly agreed to participate in the creation of a new company so all my spare time is spent coding for that (go-live in Feb next year).  Does that mean they should simply expire?  Some of the ideas are pretty good.  Hmmm.  The Wiki needs a voting system or something similar.  And this discussion should probably be moved to the mod ideas page as well .....</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Wipeout-Style Mod</title>
    <id>1989</id>
    <revision>
      <id>4864</id>
      <timestamp>2004-05-21T19:22:20Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">I finally figured out this place... Anyways:

I kind of hesitated posting here, but did it anyways... I've been looking around for a fast paced futuristic racer mod for UT2k3/4 but didn't find any. So I thought, maybe I should see if there are people interested in making one... I didn't know where to look for coders, so I'll post around and ask a few contacts to see if they know any.

I can skin, uvw map and do your usual 2d stuff. I know basic modeling too, but not *that* much.

The point isn't that I take all the credit for it like everyone thinks when someone makes a thread like this. I want to see such a mod, and I don't care if I do it or someone else does it. But since there aren't any mods out there that are like that, I don't think one's gonna get made if I sit around on my ass and wait for it to be made, so might as well try and see if I can find some people interested in making it.

What I think would be good about this mod is that it won't be a machine hog, and people with average computers will be able to play it without any slowdown.

So, if there are any people interested in this, especially coders, or wannabe coders who are learning and willing to learn, PM or e-mail (synista@tatu.us) me, and if there are enough people interested, might as well start something of it.  I've posted something similar on moddb, and there are people interested, but no coders so far.

I'm also in #tacticalops on gamesnet if anyone wants to talk about this. 

For those that don't know what type of mod I'm talking about_:

http://www.gamespot.com/pc/driving/wipeoutxl/screenindex.html

http://www.gamespot.com/ps2/driving/wipeoutfusion/index.html

http://www.gamespot.com/ps2/driving/extremeg3/screenindex.html

Thanks.

Here are some replies I got from other people:

http://sv2.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=54285

Please read the replies on that forum so we don't repeat ourselves here. :)

'''Foxpaw:''' I did go over to that forum thing, but instead of posting on there, I'll write what I think about it here:

The collision issue they raise is SOMEWHAT valid, but questionably so. First off I'll say, scaling down the world won't make a difference. The problem is the amount of distance stepped per tick relative to the size of the objects. IE, the problem in UnrealSpeed was moving from not colliding one tick to firmly planted the next tick. You're gonna have the same problem no matter the scale, you may be impaled by less UUs, but you're still gonna be impaled by just as much relative to the length of the vehicle. Plus, the Unreal Engine is not completely scale independant, things like sound and lighting still depend on scale. Also, speeding up the gamespeed won't fix anything - you still get the same number of ticks per real second, so if anything it would make the problem worse.

Also, the Unreal Engine is not a First Person Shooter engine. It's an all-around game engine.

Okay, now that I've said all that stuff... It's entirely possible to avoid the problems UnrealSpeed had. The fighter craft in my space combat mod can move at blistering rates and never have a problem with hitting things.

Karma does not automatically &quot;fix&quot; an object that becomes lodged in another object because it doesn't know whether that's what you wanted or not. It does provide an event, KImpact, that can be used in conjunction with KImpactThreshold. KImpact means you hit something. Then all you have to do is, inside that event, find out what you hit (Touchingactors iterator) and decide whether to blow yourself to smithereens, richochet off forcefully, take out the lamp post, etc. The Karma engine expects the programmer to do this, and it doesn't appear that the UnrealSpeed team did so. (not that I'm picking on UnrealSpeed, just stating my observations based on in-game behaviour and the problem they've had with stuff getting lodged like that.)

Anyways, just thought I'd share some info on that.

'''Synista:'''

Well I've set up a website and started recruiting people.  

I think this is the best way to get the idea out to the public, and hopefully something will happen.

Please visit:

http://www.mcontrol.2ya.com

'''T1:'''

As an update we have a few more people. (Synista, me, Ivy, 2fast, Jaxter) and have started work on this and have some code and stuff.</text>
    </revision>
    <revision>
      <id>4865</id>
      <timestamp>2004-01-13T03:42:44Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I finally figured out this place... Anyways:

I kind of hesitated posting here, but did it anyways... I've been looking around for a fast paced futuristic racer mod for UT2k3/4 but didn't find any. So I thought, maybe I should see if there are people interested in making one... I didn't know where to look for coders, so I'll post around and ask a few contacts to see if they know any.

I can skin, uvw map and do your usual 2d stuff. I know basic modeling too, but not *that* much.

The point isn't that I take all the credit for it like everyone thinks when someone makes a thread like this. I want to see such a mod, and I don't care if I do it or someone else does it. But since there aren't any mods out there that are like that, I don't think one's gonna get made if I sit around on my ass and wait for it to be made, so might as well try and see if I can find some people interested in making it.

What I think would be good about this mod is that it won't be a machine hog, and people with average computers will be able to play it without any slowdown.

So, if there are any people interested in this, especially coders, or wannabe coders who are learning and willing to learn, PM or e-mail (synista@tatu.us) me, and if there are enough people interested, might as well start something of it.  I've posted something similar on moddb, and there are people interested, but no coders so far.

I'm also in #tacticalops on gamesnet if anyone wants to talk about this. 

For those that don't know what type of mod I'm talking about_:

http://www.gamespot.com/pc/driving/wipeoutxl/screenindex.html

http://www.gamespot.com/ps2/driving/wipeoutfusion/index.html

http://www.gamespot.com/ps2/driving/extremeg3/screenindex.html

Thanks.

Here are some replies I got from other people:

http://sv2.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=54285

Please read the replies on that forum so we don't repeat ourselves here. :)

'''Foxpaw:''' I did go over to that forum thing, but instead of posting on there, I'll write what I think about it here:

The collision issue they raise is SOMEWHAT valid, but questionably so. First off I'll say, scaling down the world won't make a difference. The problem is the amount of distance stepped per tick relative to the size of the objects. IE, the problem in UnrealSpeed was moving from not colliding one tick to firmly planted the next tick. You're gonna have the same problem no matter the scale, you may be impaled by less UUs, but you're still gonna be impaled by just as much relative to the length of the vehicle. Plus, the Unreal Engine is not completely scale independant, things like sound and lighting still depend on scale. Also, speeding up the gamespeed won't fix anything - you still get the same number of ticks per real second, so if anything it would make the problem worse.

Also, the Unreal Engine is not a First Person Shooter engine. It's an all-around game engine.

Okay, now that I've said all that stuff... It's entirely possible to avoid the problems UnrealSpeed had. The fighter craft in my space combat mod can move at blistering rates and never have a problem with hitting things.

Karma does not automatically &quot;fix&quot; an object that becomes lodged in another object because it doesn't know whether that's what you wanted or not. It does provide an event, KImpact, that can be used in conjunction with KImpactThreshold. KImpact means you hit something. Then all you have to do is, inside that event, find out what you hit (Touchingactors iterator) and decide whether to blow yourself to smithereens, richochet off forcefully, take out the lamp post, etc. The Karma engine expects the programmer to do this, and it doesn't appear that the UnrealSpeed team did so. (not that I'm picking on UnrealSpeed, just stating my observations based on in-game behaviour and the problem they've had with stuff getting lodged like that.)

Anyways, just thought I'd share some info on that.</text>
    </revision>
    <revision>
      <id>4866</id>
      <timestamp>2004-02-02T01:26:36Z</timestamp>
      <contributor>
        <ip>Synista</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I finally figured out this place... Anyways:

I kind of hesitated posting here, but did it anyways... I've been looking around for a fast paced futuristic racer mod for UT2k3/4 but didn't find any. So I thought, maybe I should see if there are people interested in making one... I didn't know where to look for coders, so I'll post around and ask a few contacts to see if they know any.

I can skin, uvw map and do your usual 2d stuff. I know basic modeling too, but not *that* much.

The point isn't that I take all the credit for it like everyone thinks when someone makes a thread like this. I want to see such a mod, and I don't care if I do it or someone else does it. But since there aren't any mods out there that are like that, I don't think one's gonna get made if I sit around on my ass and wait for it to be made, so might as well try and see if I can find some people interested in making it.

What I think would be good about this mod is that it won't be a machine hog, and people with average computers will be able to play it without any slowdown.

So, if there are any people interested in this, especially coders, or wannabe coders who are learning and willing to learn, PM or e-mail (synista@tatu.us) me, and if there are enough people interested, might as well start something of it.  I've posted something similar on moddb, and there are people interested, but no coders so far.

I'm also in #tacticalops on gamesnet if anyone wants to talk about this. 

For those that don't know what type of mod I'm talking about_:

http://www.gamespot.com/pc/driving/wipeoutxl/screenindex.html

http://www.gamespot.com/ps2/driving/wipeoutfusion/index.html

http://www.gamespot.com/ps2/driving/extremeg3/screenindex.html

Thanks.

Here are some replies I got from other people:

http://sv2.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=54285

Please read the replies on that forum so we don't repeat ourselves here. :)

'''Foxpaw:''' I did go over to that forum thing, but instead of posting on there, I'll write what I think about it here:

The collision issue they raise is SOMEWHAT valid, but questionably so. First off I'll say, scaling down the world won't make a difference. The problem is the amount of distance stepped per tick relative to the size of the objects. IE, the problem in UnrealSpeed was moving from not colliding one tick to firmly planted the next tick. You're gonna have the same problem no matter the scale, you may be impaled by less UUs, but you're still gonna be impaled by just as much relative to the length of the vehicle. Plus, the Unreal Engine is not completely scale independant, things like sound and lighting still depend on scale. Also, speeding up the gamespeed won't fix anything - you still get the same number of ticks per real second, so if anything it would make the problem worse.

Also, the Unreal Engine is not a First Person Shooter engine. It's an all-around game engine.

Okay, now that I've said all that stuff... It's entirely possible to avoid the problems UnrealSpeed had. The fighter craft in my space combat mod can move at blistering rates and never have a problem with hitting things.

Karma does not automatically &quot;fix&quot; an object that becomes lodged in another object because it doesn't know whether that's what you wanted or not. It does provide an event, KImpact, that can be used in conjunction with KImpactThreshold. KImpact means you hit something. Then all you have to do is, inside that event, find out what you hit (Touchingactors iterator) and decide whether to blow yourself to smithereens, richochet off forcefully, take out the lamp post, etc. The Karma engine expects the programmer to do this, and it doesn't appear that the UnrealSpeed team did so. (not that I'm picking on UnrealSpeed, just stating my observations based on in-game behaviour and the problem they've had with stuff getting lodged like that.)

Anyways, just thought I'd share some info on that.

'''Synista:'''

Well I've set up a website and started recruiting people.  

I think this is the best way to get the idea out to the public, and hopefully something will happen.

Please visit:

http://www.mcontrol.2ya.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/X-Ray</title>
    <id>1955</id>
    <revision>
      <id>4787</id>
      <timestamp>2003-08-03T05:43:24Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>Proposed Implementation.</comment>
      <text xml:space="preserve">An adrenaline combo that lets the player see all other players, even through walls. Maybe as skeletons.

'''Haral:''' Sure.  You'd either use the map-&gt;screen function or just find the distance from your viewrotation (not too hard) to know where they are &quot;on your screen.&quot;  Then you'd just draw a widget scaled to the distance between your pawn and the other pawn for the whole &quot;skeleton&quot; thing.  An infrared view is on my todo and that's what I had in mind.

'''Mosquito:''' How about having the player's transpartent and have skeletons inside them, But what about custom models?

'''Foxpaw:''' The problem with drawing a widget is that it won't be in the same frame of animation as the actual pawn is. Canvas.Drawactor or Canvas.Drawscreenactor (One of these would work, I think) would work a lot better. I don't think you can even draw a mesh widget anyway, though I could be wrong about that. I like the idea of having the player's transparent, that would satisfy pretty much all custom models, as well. Technically a person COULD write their own skeleton and make all of the skeletal animations for it, and if it were radical enough compared to the built-in ones it might look a bit wierd, but so far I haven't seen anyone go to those lengths to make a new model. (This would only be necessary for things like quadrapedal models, etc.)

'''Haral:''' Err right.  I didn't look at it that closely yet.  Still, rather than doing anything so crazy as working with the skeleton or making a new one, you could just make a new texture that looks like an x-ray skeleton.  If you were going for the low-budget approach anyway... you'd probably need to enforce the mesh on the pawns as well.  Would alleviate work, anyway.

'''Foxpaw:''' Hold on, I had another idea. All species code has a skeleton variable that stores what mesh it should turn into if it gets skeletized, which I think only happens if you fall in lava or possibly from the ion cannon as well. LinkMesh is simulated, so you could have clients force them to change to that skeleton mesh without having actually been skeletized, without the server losing track of what the actual meshes are. This would also allow each client to see skeletons only when applicable. Canvas.Drawactor could be used to draw pawns on the screen maintaining their proper frame of animation.. that should satisfy all criteria. Remembering the skeletons from when you get skeletized was a real epiphany for me on this one. :P I hope that's descriptive enough, I think that actually solves all of the problems that I thought of before, even replication! I'll summarize in point form:

* Server spawns an actor at the beginning of the game to manage the X-Ray-ness.
* When the andrenaline combo is activated, the server sets some variables in an an array to tell all clients who just engaged the andrenaline combo. All pawns are also set to bAlwaysRelevant=true. (just in case)
* Upon reciept of this new element in the &quot;X-Ray array,&quot; each client scans the array to see if their name is in it.
* If a client does not find their name in the list, return and don't check again until the next time the list is updated.
* If we do find our name in the list, then:
** Store the meshes of all pawns in the game in a dynamic array, along with a pointer to that pawn.
** Link all pawn's mesh to the skeleton mesh of their respective speciestype class. If they have no speciestype or a skeleton is not specified, use default (male jugg) skeleton.
** Spawn an interaction and link it to the local interaction list of the local player.
** Said interaction will call C.DrawActor on every pawn, except itself, every tick.
* When andrenaline combo/pickup/whatever expires, the server updates the array and removes the applicable name from the array.
* Since the array has changed, all clients check the list again. If they are in X-Ray mode and their name is not on the list:
** Restore the original meshes from the dynamic array and remove the elements in said array.
** Destroy the interaction and remove it from the list.
* Return to the second bullet point.</text>
    </revision>
    <revision>
      <id>4788</id>
      <timestamp>2003-07-04T10:50:33Z</timestamp>
      <contributor>
        <ip>Gizmo.windwireless.net</ip>
      </contributor>
      <minor/>
      <comment>oops, signed as guest</comment>
      <text xml:space="preserve">An adrenaline combo that lets the player see all other players, even  through walls. Maybe as skeletons.

**

Is this seven possible without using native code?

'''Haral:''' Sure.  You'd either use the map-&gt;screen function or just find the distance from your viewrotation (not too hard) to know where they are &quot;on your screen.&quot;  Then you'd just draw a widget scaled to the distance between your pawn and the other pawn for the whole &quot;skeleton&quot; thing.  An infrared view is on my todo and that's what I had in mind.

'''Mosquito:''' How about having the player's transpartent and have skeletons inside them, But what about custom models?

'''Foxpaw:''' The problem with drawing a widget is that it won't be in the same frame of animation as the actual pawn is. Canvas.Drawactor or Canvas.Drawscreenactor (One of these would work, I think) would work a lot better. I don't think you can even draw a mesh widget anyway, though I could be wrong about that. I like the idea of having the player's transparent, that would satisfy pretty much all custom models, as well. Technically a person COULD write their own skeleton and make all of the skeletal animations for it, and if it were radical enough compared to the built-in ones it might look a bit wierd, but so far I haven't seen anyone go to those lengths to make a new model. (This would only be necessary for things like quadrapedal models, etc.)

'''Haral:''' Err right.  I didn't look at it that closely yet.  Still, rather than doing anything so crazy as working with the skeleton or making a new one, you could just make a new texture that looks like an x-ray skeleton.  If you were going for the low-budget approach anyway... you'd probably need to enforce the mesh on the pawns as well.  Would alleviate work, anyway.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Xenocide</title>
    <id>1917</id>
    <revision>
      <id>4697</id>
      <timestamp>2005-07-21T20:33:26Z</timestamp>
      <contributor>
        <ip>P5497D559.dip.t-dialin.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Xenocide}}

==Description ==
:A futuristic warfare simulation; a class based mod with elements of a realism mod. A major aspect are the different &quot;factions&quot; such as humans, robots and aliens, which offer a unique playing experience each.

===Mod Features ===

* '''Pseudo-Realistic Gameplay:'''&lt;br /&gt;These elements are meant to create a &quot;realistic&quot; gameplay - players that fear for their life and avoid unneccessary risks. At the same time, sacrificing your life becomes a powerful yet risky tool.&lt;br /&gt;On a sidenote - one thing that always annoyed me about Fortress mods was the apparent lack of usefulness of the medic - the gamplay was often too fast for him to apply his skills. Better to have an additional well armed class, be it in defense of offense. In the fast gameplay killing the enemy was always worth more than surviving. In Xenocide, the medic's ability to fully restore a player's health will hopefully make him a very useful class. He'll also be armed with more than just an excuse of a weapon.&lt;br /&gt;&amp;ndash; limited lives (1, maybe more, possible reinforcement system)&lt;br /&gt;&amp;ndash; sophisticated armour (damagetype-sensitive, variable penetration and more)&lt;br /&gt;&amp;ndash; locationalized and special damage (shock, posion etc.)&lt;br /&gt;&amp;ndash; bleeding&lt;br /&gt;&amp;ndash; deadly weapons (few hits can kill instantly, a single hit can cause slow death due to bleeding)&lt;br /&gt;&amp;ndash; stamina (running, jumping, aiming precision, unconsciousness)&lt;br /&gt;&amp;ndash; realistic aiming (weapon bob, weapon (and race) specific targeting systems)&lt;br /&gt;&amp;ndash; going prone
* '''Strategical Elements:'''&lt;br /&gt;&amp;ndash; weighted selection system (point value and/or automatic teamsize balance, allows for &quot;unbalanced&quot; classes/factions)&lt;br /&gt;&amp;ndash; leader units (special abilities, GUI for team management)&lt;br /&gt;&amp;ndash; special pawn units (units that can be added to the team like players, but are AI controlled and may not imitate &quot;human&quot; behaviour)
* '''Factions:''' (listed in ''vague'' order of priority):&lt;br /&gt;Each faction has different abilities and player classes, and a unique structure (i.e. the classes in different factions are not aequivalent)&lt;br /&gt;&amp;ndash; Rebels (futuristic human soldiers, classes similar to TFC, highly versatile)&lt;br /&gt;&amp;ndash; Aliens (technologically advanced yet physically weak aliens, hit-and-run tactics)&lt;br /&gt;&amp;ndash; Robots (powerful warmachines, slow and inflexible)&lt;br /&gt;&amp;ndash; Scavengers (rag-tag gang à la Mad Max, depending on fast vehicles and flexibility, rush and ambush tactics)&lt;br /&gt;&amp;ndash; Swarm (alien arachnoids, powerful in close combat but vulnerable over distance, rush and ambush tactics)&lt;br /&gt;&amp;ndash; and more...
* '''Vehicles:'''&lt;br /&gt;The focus in this mod is on player classes, not vehicles. While UT2k3 allows for larger terrain it has been emphasized often enough that a good looking map should not be too large... how much this is a technical restriction or simply matter of choice I cannot say... but I don't want maps like in Tribes. The maps should be big enough to allow limited use of vehicles... on some maps anyway.&lt;br /&gt;The vehicles in Xenocide will be mostly small and/or have the nature of an APC. Most teams will have the option to use vehicles as tactical element, and some are restricted to special classes, like the human scout.&lt;br /&gt;But following the idea of the mod, every faction may have slightly different uses for their vehicles...
* '''GameTypes:'''&lt;br /&gt;&amp;ndash; Team Deathmatch, CTF, DOM (well... the standard team gametypes, saves coding time, at least in the early stages)&lt;br /&gt;&amp;ndash; Strategic Domination (DOM variant with many control points, capturing all primary winning condition)&lt;br /&gt;&amp;ndash; Tactical Operation (Assault, hopefully less linear than the regular assault, taking the special abilities of the classes and factions into account)&lt;br /&gt;&amp;ndash; Campaign (a team of players against (an) AI controlled team(s), possibly with a series of maps to be played in order, details yet to be decided)

===Interested Scriptors ===

==Discussion ==</text>
    </revision>
    <revision>
      <id>4698</id>
      <timestamp>2002-09-14T17:45:22Z</timestamp>
      <contributor>
        <ip>PD9E4E59E.dip.t-dialin.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">=Xenocide =

by Claw

==Description ==
:A futuristic warfare simulation; a class based mod with elements of a realism mod. A major aspect are the different &quot;factions&quot; such as humans, robots and aliens, which offer a unique playing experience each.

===General Notes ===

* ''This mod concept is already being processed by Aeon Development.''
* This concept is of a theoretical and fundamental nature. It may be subject to change and inaccuracies, details are planned but not mentioned here.

===Mod Features ===

* '''Pseudo-Realistic Gameplay:'''&lt;br /&gt;These elements are meant to create a &quot;realistic&quot; gameplay - players that fear for their life and avoid unneccessary risks. At the same time, sacrificing your life becomes a powerful yet risky tool.&lt;br /&gt;On a sidenote - one thing that always annoyed me about Fortress mods was the apparent lack of usefulness of the medic - the gamplay was often too fast for him to apply his skills. Better to have an additional well armed class, be it in defense of offense. In the fast gameplay killing the enemy was always worth more than surviving. In Xenocide, the medic's ability to fully restore a player's health will hopefully make him a very useful class. He'll also be armed with more than just an excuse of a weapon.&lt;br /&gt;&amp;ndash; limited lives (1, maybe more, possible reinforcement system)&lt;br /&gt;&amp;ndash; sophisticated armour (damagetype-dependant handling, variable penetration and more)&lt;br /&gt;&amp;ndash; locationalized and special damage (shock, posion etc.)&lt;br /&gt;&amp;ndash; bleeding&lt;br /&gt;&amp;ndash; deadly weapons (few hits can kill instantly, a single hit can cause slow death due to bleeding)&lt;br /&gt;&amp;ndash; stamina (running, jumping, aiming precision, unconsciousness)&lt;br /&gt;&amp;ndash; going prone
* '''Strategical Elements:'''&lt;br /&gt;&amp;ndash; weighted selection system (point value and/or automatic teamsize balance, allows for &quot;unbalanced&quot; classes/factions)&lt;br /&gt;&amp;ndash; leader units (special abilities, GUI for team management)&lt;br /&gt;&amp;ndash; special pawn units (units that can be added to the team like players, but are AI controlled and may not imitate &quot;human&quot; behaviour)
* '''Factions:''' (listed in ''vague'' order of priority):&lt;br /&gt;Each faction has different abilities and player classes, and a unique structure (i.e. the classes in different factions are not aequivalent)&lt;br /&gt;&amp;ndash; Rebels (futuristic human soldiers, classes similar to TFC, highly versatile)&lt;br /&gt;&amp;ndash; Aliens (technologically advanced yet physically weak aliens, hit-and-run tactics)&lt;br /&gt;&amp;ndash; Robots (powerful warmachines, slow and inflexible)&lt;br /&gt;&amp;ndash; Scavengers (rag-tag gang à la Mad Max, depending on fast vehicles and flexibility, rush and ambush tactics)&lt;br /&gt;&amp;ndash; Swarm (alien arachnoids, powerful in close combat but vulnerable over distance, rush and ambush tactics)&lt;br /&gt;&amp;ndash; and more...
* '''Vehicles:'''&lt;br /&gt;The focus in this mod is on player classes, not vehicles. While UT2k3 allows for larger terrain it has been emphasized often enough that a good looking map should not be too large... how much this is a technical restriction or simply matter of choice I cannot say... but I don't want maps like in Tribes. The maps should be big enough to allow limited use of vehicles... on some maps anyway.&lt;br /&gt;The vehicles in Xenocide will be mostly small and/or have the nature of an APC. Most teams will have the option to use vehicles as tactical element, and some are restricted to special classes, like the human scout.&lt;br /&gt;But following the idea of the mod, every faction may have slightly different uses for their vehicles...
* '''GameTypes:'''&lt;br /&gt;&amp;ndash; Team Deathmatch, CTF, DOM (well... the standard team gametypes, saves coding time, at least in the early stages)&lt;br /&gt;&amp;ndash; Strategic Domination (DOM variant with many control points, capturing all primary winning condition)&lt;br /&gt;&amp;ndash; Tactical Operation (Assault, hopefully less linear than the regular assault, taking the special abilities of the classes and factions into account)&lt;br /&gt;&amp;ndash; Campaign (a team of players against (an) AI controlled team(s), possibly with a series of maps to be played in order, details yet to be decided)

===Interested Scriptors ===

:We hope interested developers (coders, mappers, modelers etc.) will join our team.&lt;br /&gt;You can find us on http://www.planetunreal.com/ucz and #darkmagic on ETG, or email me directly at kreydon@gmx.net.&lt;br /&gt;We especially need more coders and modelers, but anyone with skills in any part of the development process is welcome. It's a &quot;helluva&quot; project.

==Discussion ==</text>
    </revision>
    <revision>
      <id>4699</id>
      <timestamp>2002-09-29T20:12:12Z</timestamp>
      <contributor>
        <ip>Claw</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod ideas for UT 2003 &amp;ndash; Xenocide}}

==Description ==
:A futuristic warfare simulation; a class based mod with elements of a realism mod. A major aspect are the different &quot;factions&quot; such as humans, robots and aliens, which offer a unique playing experience each.

===General Notes ===

* ''This mod concept is already being processed by Aeon Development.''
* This concept is of a theoretical and fundamental nature. It may be subject to change and inaccuracies, details are planned but not mentioned here.

===Mod Features ===

* '''Pseudo-Realistic Gameplay:'''&lt;br /&gt;These elements are meant to create a &quot;realistic&quot; gameplay - players that fear for their life and avoid unneccessary risks. At the same time, sacrificing your life becomes a powerful yet risky tool.&lt;br /&gt;On a sidenote - one thing that always annoyed me about Fortress mods was the apparent lack of usefulness of the medic - the gamplay was often too fast for him to apply his skills. Better to have an additional well armed class, be it in defense of offense. In the fast gameplay killing the enemy was always worth more than surviving. In Xenocide, the medic's ability to fully restore a player's health will hopefully make him a very useful class. He'll also be armed with more than just an excuse of a weapon.&lt;br /&gt;&amp;ndash; limited lives (1, maybe more, possible reinforcement system)&lt;br /&gt;&amp;ndash; sophisticated armour (damagetype-sensitive, variable penetration and more)&lt;br /&gt;&amp;ndash; locationalized and special damage (shock, posion etc.)&lt;br /&gt;&amp;ndash; bleeding&lt;br /&gt;&amp;ndash; deadly weapons (few hits can kill instantly, a single hit can cause slow death due to bleeding)&lt;br /&gt;&amp;ndash; stamina (running, jumping, aiming precision, unconsciousness)&lt;br /&gt;&amp;ndash; realistic aiming (weapon bob, weapon(and race) specific targeting systems)&lt;br /&gt;&amp;ndash; going prone
* '''Strategical Elements:'''&lt;br /&gt;&amp;ndash; weighted selection system (point value and/or automatic teamsize balance, allows for &quot;unbalanced&quot; classes/factions)&lt;br /&gt;&amp;ndash; leader units (special abilities, GUI for team management)&lt;br /&gt;&amp;ndash; special pawn units (units that can be added to the team like players, but are AI controlled and may not imitate &quot;human&quot; behaviour)
* '''Factions:''' (listed in ''vague'' order of priority):&lt;br /&gt;Each faction has different abilities and player classes, and a unique structure (i.e. the classes in different factions are not aequivalent)&lt;br /&gt;&amp;ndash; Rebels (futuristic human soldiers, classes similar to TFC, highly versatile)&lt;br /&gt;&amp;ndash; Aliens (technologically advanced yet physically weak aliens, hit-and-run tactics)&lt;br /&gt;&amp;ndash; Robots (powerful warmachines, slow and inflexible)&lt;br /&gt;&amp;ndash; Scavengers (rag-tag gang à la Mad Max, depending on fast vehicles and flexibility, rush and ambush tactics)&lt;br /&gt;&amp;ndash; Swarm (alien arachnoids, powerful in close combat but vulnerable over distance, rush and ambush tactics)&lt;br /&gt;&amp;ndash; and more...
* '''Vehicles:'''&lt;br /&gt;The focus in this mod is on player classes, not vehicles. While UT2k3 allows for larger terrain it has been emphasized often enough that a good looking map should not be too large... how much this is a technical restriction or simply matter of choice I cannot say... but I don't want maps like in Tribes. The maps should be big enough to allow limited use of vehicles... on some maps anyway.&lt;br /&gt;The vehicles in Xenocide will be mostly small and/or have the nature of an APC. Most teams will have the option to use vehicles as tactical element, and some are restricted to special classes, like the human scout.&lt;br /&gt;But following the idea of the mod, every faction may have slightly different uses for their vehicles...
* '''GameTypes:'''&lt;br /&gt;&amp;ndash; Team Deathmatch, CTF, DOM (well... the standard team gametypes, saves coding time, at least in the early stages)&lt;br /&gt;&amp;ndash; Strategic Domination (DOM variant with many control points, capturing all primary winning condition)&lt;br /&gt;&amp;ndash; Tactical Operation (Assault, hopefully less linear than the regular assault, taking the special abilities of the classes and factions into account)&lt;br /&gt;&amp;ndash; Campaign (a team of players against (an) AI controlled team(s), possibly with a series of maps to be played in order, details yet to be decided)

===Interested Scriptors ===

:We hope interested developers (coders, mappers, modelers etc.) will join our team.&lt;br /&gt;You can find us on http://www.planetunreal.com/ucz and #darkmagic on ETG, or email me - Claw - directly at kreydon@gmx.net.&lt;br /&gt;We especially need more coders and modelers, but anyone with skills in any part of the development process is welcome. It's a &quot;helluva&quot; project.

==Discussion ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mod Ideas/Yog-Sothoth</title>
    <id>1985</id>
    <revision>
      <id>4853</id>
      <timestamp>2003-11-02T14:02:42Z</timestamp>
      <contributor>
        <ip>Kagato</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT 2003 &amp;ndash; Yog-Sothoth}}

==Description ==

Remember the original '''Alone in the Dark''' for the PC?

Remember the monster in the ballroom?

The big column of glowing spheres, that would hunt you down and kill you?

That was inspired by '''Yog-Sothoth''', one of the creatures from the &quot;Cthulhu Mythos&quot; created by [http://www.hplovecraft.com H.P. Lovecraft]. This mod will insert the Great Old One into the map, where He will seek out and devour any players He encounters.

The mod itself is quite simple. An Actor is inserted into the map that determines the nearest Player, and moves directly toward him. It only moves at a relatively slow pace (say, walking speed), but it ''ignores all obstacles'', including walls and terrains. If another Player moves closer, he becomes its new target. So you don't have to outrun Yog-Sothoth, you just have to outrun the guy next to you. ;)

When a Player is touched by Yog-Sothoth, he is instantly killed. (Maybe even turned into a skeleton, for effect.) Because it can move through walls, you may not be able to see it coming; but not to worry, as you'll know its presence by the mind-numbing roar it constantly emits. When it's really close, it is so overpowering that it causes your vision to shake as if caught in an earthquake. ''(if this can be done)''

The monster is itself indestructible, and cannot be stopped in any way.

If you're ''really'' mean, you could use the [[Legacy:Mod Ideas/Kinetic Rifle|Mod Ideas/Kinetic Rifle]] to shove opponents into Yog-Sothoth :)

This mutator should be suitable for all game types (I think).

[[Image:Legacy_kagato_yog-sothoth_mockup.jpeg|center|A mockup of Yog-Sothoth hunting down a player]]

==Comments ==

'''MythOpus:''' Myth Man Loves THis Idea :)  I wanted something like this for my MOR| project ([[Legacy:MythOpus/Developer_Journal|MythOpus/Developer_Journal]]) but didn't know what in what way I was going to do this... :D

'''Shuriken:''' Very interesting, and something I would love to play with.  Hmm... should be fairly easy to outrun, but if you get close, your should get thrown around so it's impossible to escape then.  Got any pictures of what sort of monster it is?

'''Kagato:''' I'm afraid not, but trust me, it's not from lack of trying. I couldn't find any screenshots at all of this monster. Perhaps its ''singularly horrific countenance was not meant to be witnessed by the likes of Man...'' ahem. Instead, I've added a mockup I threw together in GIMP. Admittedly, it looks a bit like a christmas tree here, but when it's spinning toward you, roaring '''OOOOUUUUOOOOUUUUOOOO''' it can get a bit tense :)</text>
    </revision>
    <revision>
      <id>4854</id>
      <timestamp>2003-11-01T18:18:10Z</timestamp>
      <contributor>
        <ip>Shuriken</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|Mod Ideas for UT 2003 &amp;ndash; Yog-Sothoth}}

==Description ==

Remember the original '''Alone in the Dark''' for the PC?

Remember the monster in the ballroom?

The big column of glowing spheres, that would hunt you down and kill you?

That was inspired by '''Yog-Sothoth''', one of the creatures from the &quot;Cthulhu Mythos&quot; created by [http://www.hplovecraft.com H.P. Lovecraft]. This mod will insert the Great Old One into the map, where He will seek out and devour any players He encounters.

The mod itself is quite simple. An Actor is inserted into the map that determines the nearest Player, and moves directly toward him. It only moves at a relatively slow pace (say, walking speed), but it ''ignores all obstacles'', including walls and terrains. If another Player moves closer, he becomes its new target. So you don't have to outrun Yog-Sothoth, you just have to outrun the guy next to you. ;)

When a Player is touched by Yog-Sothoth, he is instantly killed. (Maybe even turned into a skeleton, for effect.) Because it can move through walls, you may not be able to see it coming; but not to worry, as you'll know its presence by the mind-numbing roar it constantly emits. When it's really close, it is so overpowering that it causes your vision to shake as if caught in an earthquake. ''(if this can be done)''

The monster is itself indestructible, and cannot be stopped in any way.

If you're ''really'' mean, you could use the [[Legacy:Mod Ideas/Kinetic Rifle|Mod Ideas/Kinetic Rifle]] to shove opponents into Yog-Sothoth :)

This mutator should be suitable for all game types (I think).

==Comments ==

'''MythOpus:''' Myth Man Loves THis Idea :)  I wanted something like this for my MOR| project ([[Legacy:MythOpus/Developer_Journal|MythOpus/Developer_Journal]]) but didn't know what in what way I was going to do this... :D

'''Shuriken:''' Very interesting, and something I would love to play with.  Hmm... should be fairly easy to outrun, but if you get close, your should get thrown around so it's impossible to escape then.  Got any pictures of what sort of monster it is?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:ModPlug Tracker</title>
    <id>1787</id>
    <revision>
      <id>4384</id>
      <timestamp>2004-03-26T09:42:12Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''ModPlug Tracker''' is an [[Legacy:Application|application]] for creating module music files like those used in [[Legacy:Unreal|Unreal]] and [[Legacy:UT|UT]]. This type of music files can also be converted to OGG Vorbis so they can be used in [[Legacy:UT2003|UT2003]].

[http://www.modplug.com/modplug/tracker.php3 ModPlug Tracker Homepage]

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4385</id>
      <timestamp>2004-03-26T00:01:13Z</timestamp>
      <contributor>
        <ip>Dhcp065-024-216-025.insight.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==INFORMATION ==

----

==COMMENTS: ==

THERES NO LINK</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Model</title>
    <id>28513</id>
    <revision>
      <id>40214</id>
      <timestamp>2009-11-17T11:00:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Model Conversion Application</title>
    <id>2242</id>
    <revision>
      <id>5416</id>
      <timestamp>2007-02-01T08:42:35Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <text xml:space="preserve">Some very good model conversion applications are:

-[[Legacy:MilkShape|MilkShape]] 3d:-
  -Import model
  -Press Ctrl+T to use Texture Cordinate Editor
  -Name the material as the EXACT texture used.
  - Spaces in filenames usually are converted to underscores &quot; _ &quot; so point to this
  -EG: Material applied is &quot;grey block.tga&quot; then the name would be &quot;grey_block.tga&quot;
  -Press rename after you put in the name to finalize renaming
  -Rename is under the material list box
  -Select a material first tho

-Quick3d-
 -it is free if you register
 -it can convert easily but some older versions of models won't work

-[[Legacy:3D Studio Max|3D Studio Max]]-

 -commercial tool
 -it is powerful, but ver expensive ($1200)

----

'''Tarquin:''' Hi! Thanks for adding content, whoever you are. But please take a minute to learn [[Legacy:Wiki Markup|wiki markup]] so your pages are nicely formatted :)</text>
    </revision>
    <revision>
      <id>5417</id>
      <timestamp>2007-01-30T03:57:58Z</timestamp>
      <contributor>
        <ip>Abdlwibas01-pool2-a168.abdlwi.tds.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Some very good model conversion applications are:

-Milkshape 3d:-
  -Import model
  -Press Ctrl+T to use Texture Cordinate Editor
  -Name the material as the EXACT texture used.
  - Spaces in filenames usually are converted to underscores &quot; _ &quot; so point to this
  -EG: Material applied is &quot;grey block.tga&quot; then the name would be &quot;grey_block.tga&quot;
  -Press rename after you put in the name to finalize renaming
  -Rename is under the material list box
  -Select a material first tho

-Quick3d-
 -it is free if you register
 -it can convert easily but some older versions of models won't work

-3dsMax-

 -commercial tool
 -it is powerful, but ver expensive ($1200)</text>
    </revision>
    <revision>
      <id>5418</id>
      <timestamp>2007-02-01T08:41:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <text xml:space="preserve">Some very good model conversion applications are:

-[[Legacy:Milkshape 3d|Milkshape 3d]]:-
  -Import model
  -Press Ctrl+T to use Texture Cordinate Editor
  -Name the material as the EXACT texture used.
  - Spaces in filenames usually are converted to underscores &quot; _ &quot; so point to this
  -EG: Material applied is &quot;grey block.tga&quot; then the name would be &quot;grey_block.tga&quot;
  -Press rename after you put in the name to finalize renaming
  -Rename is under the material list box
  -Select a material first tho

-Quick3d-
 -it is free if you register
 -it can convert easily but some older versions of models won't work

-[[Legacy:3dsMax|3dsMax]]-

 -commercial tool
 -it is powerful, but ver expensive ($1200)

----

'''Tarquin:''' Hi! Thanks for adding content, whoever you are. But please take a minute to learn [[Legacy:Wiki Markup|wiki markup]] so your pages are nicely formatted :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modeling Application</title>
    <id>2104</id>
    <revision>
      <id>5127</id>
      <timestamp>2007-05-14T01:06:04Z</timestamp>
      <contributor>
        <ip>Cpe-76-168-77-153.socal.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Modeling Application''' &amp;ndash; an application used for creating 3D models.

==Model Creation==
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Blender|Blender]] (Free, Opensource)
* [[Legacy:Gmax|gmax]] (Free)
* [[Legacy:Lightwave|Lightwave]]
* [[Legacy:Maya|Maya]] and Maya PLE (Personal Learning Edition) (Free)
* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Rhinoceros|Rhinoceros]]
* [[Legacy:Softimage XSI|Softimage XSI]]
* [[Legacy:Truespace|Truespace]]
* [[Legacy:Wings3D|Wings3D]] (Free, Opensource)

==Model Conversion==
* [[Legacy:3ds2unr|3ds2unr]] &amp;ndash; Utility that takes a .3DS file and converts to Unreal format (*_d.3d and *_a.3d)
** [http://unreal.epicgames.com/Models.htm Unreal Model Importing] &amp;ndash; 3ds2unr tutorial
* [http://chimeric.beyondunreal.com/tools/u3d.zip Alternative to 3ds2unr that adds a few extras]
* [[Legacy:ActorX|ActorX]] &amp;ndash; A plugin used to export skeletal animations Available for [[Legacy:Maya|Maya]] 3, 4/[[Legacy:3D Studio Max|3D Studio Max]] 3.1, 4.0, 4.2 [[Legacy:Softimage XSI|Softimage XSI]] 4, 4.2, 5, 5.11
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; Converts UnrealEd [[Legacy:Prefab|prefab]]s to [[Legacy:Decoration|decoration]]s
* [http://www.unrealroc.com/Converter.html UnrealROC] &amp;ndash; Converts T3D to VRML/X3D/OBJ (textures,sounds,etc.)
* [[Legacy:UTExporter|UTExporter]] &amp;ndash; [[Legacy:3D Studio Max|3D Studio Max]] plugin for exporting Unreal format models
* [http://home.mindspring.com/~iclint/carraraplug.html Carrara 2 Unreal] &amp;ndash; export T3D, ASE, PSK and PSA from Eovia's Carrara 4

&amp;ndash;Links that no longer work &amp;ndash;
* [http://www.project-blender.onlinehome.de/USM%201.1%20Script.zip] &amp;ndash; Blender plugin for exporting Unreal format models

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]
* [[Legacy:Skinning|Skinning]] &amp;ndash; Applying textures to your model
* [[Legacy:Animation|Animation]] &amp;ndash; Making your model move

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5128</id>
      <timestamp>2007-02-09T18:23:33Z</timestamp>
      <contributor>
        <ip>Bob The Beheader</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Modeling Application''' &amp;ndash; an application used for creating 3D models.

==Model Creation==
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Blender|Blender]] (Free, Opensource)
* [[Legacy:Gmax|gmax]] (Free)
* [[Legacy:Lightwave|Lightwave]]
* [[Legacy:Maya|Maya]] and Maya PLE (Personal Learning Edition) (Free)
* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Rhinoceros|Rhinoceros]]
* [[Legacy:Softimage|Softimage]]
* [[Legacy:Truespace|Truespace]]
* [[Legacy:Wings3D|Wings3D]] (Free, Opensource)

==Model Conversion==
* [[Legacy:3ds2unr|3ds2unr]] &amp;ndash; Utility that takes a .3DS file and converts to Unreal format (*_d.3d and *_a.3d)
** [http://unreal.epicgames.com/Models.htm Unreal Model Importing] &amp;ndash; 3ds2unr tutorial
* [http://chimeric.beyondunreal.com/tools/u3d.zip Alternative to 3ds2unr that adds a few extras]
* [[Legacy:ActorX|ActorX]] &amp;ndash; A plugin used to export skeletal animations Available for [[Legacy:Maya|Maya]] 3, 4/[[Legacy:3D Studio Max|3D Studio Max]] 3.1, 4.0, 4.2
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; Converts UnrealEd [[Legacy:Prefab|prefab]]s to [[Legacy:Decoration|decoration]]s
* [http://www.unrealroc.com/Converter.html UnrealROC] &amp;ndash; Converts T3D to VRML/X3D/OBJ (textures,sounds,etc.)
* [[Legacy:UTExporter|UTExporter]] &amp;ndash; [[Legacy:3D Studio Max|3D Studio Max]] plugin for exporting Unreal format models
* [http://home.mindspring.com/~iclint/carraraplug.html Carrara 2 Unreal] &amp;ndash; export T3D, ASE, PSK and PSA from Eovia's Carrara 4

&amp;ndash;Links that no longer work &amp;ndash;
* [http://www.project-blender.onlinehome.de/USM%201.1%20Script.zip] &amp;ndash; Blender plugin for exporting Unreal format models

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]
* [[Legacy:Skinning|Skinning]] &amp;ndash; Applying textures to your model
* [[Legacy:Animation|Animation]] &amp;ndash; Making your model move

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5129</id>
      <timestamp>2007-05-13T20:25:05Z</timestamp>
      <contributor>
        <ip>Cpe-76-168-77-153.socal.res.rr.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Modeling Application''' &amp;ndash; an application used for creating 3D models.

==Model Creation==
* [[Legacy:3D Studio Max|3D Studio Max]]
* [[Legacy:Blender|Blender]] (Free, Opensource)
* [[Legacy:Gmax|gmax]] (Free)
* [[Legacy:Lightwave|Lightwave]]
* [[Legacy:Maya|Maya]] and Maya PLE (Personal Learning Edition) (Free)
* [[Legacy:MilkShape|MilkShape]]
* [[Legacy:Rhinoceros|Rhinoceros]]
* [[Legacy:Softimage XSI|Softimage XSI]]
* [[Legacy:Truespace|Truespace]]
* [[Legacy:Wings3D|Wings3D]] (Free, Opensource)

==Model Conversion==
* [[Legacy:3ds2unr|3ds2unr]] &amp;ndash; Utility that takes a .3DS file and converts to Unreal format (*_d.3d and *_a.3d)
** [http://unreal.epicgames.com/Models.htm Unreal Model Importing] &amp;ndash; 3ds2unr tutorial
* [http://chimeric.beyondunreal.com/tools/u3d.zip Alternative to 3ds2unr that adds a few extras]
* [[Legacy:ActorX|ActorX]] &amp;ndash; A plugin used to export skeletal animations Available for [[Legacy:Maya|Maya]] 3, 4/[[Legacy:3D Studio Max|3D Studio Max]] 3.1, 4.0, 4.2
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; Converts UnrealEd [[Legacy:Prefab|prefab]]s to [[Legacy:Decoration|decoration]]s
* [http://www.unrealroc.com/Converter.html UnrealROC] &amp;ndash; Converts T3D to VRML/X3D/OBJ (textures,sounds,etc.)
* [[Legacy:UTExporter|UTExporter]] &amp;ndash; [[Legacy:3D Studio Max|3D Studio Max]] plugin for exporting Unreal format models
* [http://home.mindspring.com/~iclint/carraraplug.html Carrara 2 Unreal] &amp;ndash; export T3D, ASE, PSK and PSA from Eovia's Carrara 4

&amp;ndash;Links that no longer work &amp;ndash;
* [http://www.project-blender.onlinehome.de/USM%201.1%20Script.zip] &amp;ndash; Blender plugin for exporting Unreal format models

==Related Topics==
* [[Legacy:Topics On Modeling|Topics On Modeling]]
* [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]]
* [[Legacy:Skinning|Skinning]] &amp;ndash; Applying textures to your model
* [[Legacy:Animation|Animation]] &amp;ndash; Making your model move

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modifier</title>
    <id>2063</id>
    <revision>
      <id>5025</id>
      <timestamp>2003-10-24T22:39:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; Modifier (Package: Engine)}}

==Properties ==
; [[Legacy:Material|Material]] Material : The material that should be modified.

==Methods ==

===Inherited From [[Legacy:Material|Material]] ===
; Reset ( ) : Resets the Material and the FallbackMaterial.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the Material and the FallbackMaterial.

==Known Subclasses ==
* [[Legacy:ColorModifier|ColorModifier]]
* [[Legacy:FinalBlend|FinalBlend]]
* [[Legacy:MaterialSequence|MaterialSequence]]
* [[Legacy:MaterialSwitch|MaterialSwitch]]
* [[Legacy:OpacityModifier|OpacityModifier]]
* [[Legacy:TexModifier|TexModifier]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5026</id>
      <timestamp>2003-02-18T06:01:32Z</timestamp>
      <contributor>
        <ip>Evolution</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Class (UT2003)]] 

{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Material|Material]] &gt;&gt; Modifier (Package: Engine)}}

==Properties ==
; [[Legacy:Material|Material]] Material : The material that should be modified.

==Methods ==

===Inherited From [[Legacy:Material|Material]] ===
; Reset ( ) : Resets the Material and the FallbackMaterial.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Actor|Actor]] EventInstigator) : Triggers the Material and the FallbackMaterial.

==Known Subclasses ==
* [[Legacy:ColorModifier|ColorModifier]]
* [[Legacy:FinalBlend|FinalBlend]]
* [[Legacy:MaterialSequence|MaterialSequence]]
* [[Legacy:MaterialSwitch|MaterialSwitch]]
* [[Legacy:OpacityModifier|OpacityModifier]]
* [[Legacy:TexModifier|TexModifier]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modify Mutator Tutorial</title>
    <id>2100</id>
    <revision>
      <id>5116</id>
      <timestamp>2004-12-28T23:39:31Z</timestamp>
      <contributor>
        <ip>RegularX</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This page is one of a series of [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].''

==UTute 2: A Modify Mute (Cooler)==

Now that you've been warned about OO and have created your own package and simple mutator, let's take a closer look at what a mutator really is and how to use them. For this, we're going to rip open the Cooler mutator from the original XPak. This little mute cools off [[Legacy:Adrenaline|adrenaline]] even if you aren't using it, forcing players to keep on their killing sprees to be able to really pull off those combos. 

{{innerbox|Quicknote on that last tutorial &amp;ndash; you might want to completely delete your MyPackage directory, .u and .int file. Why? Because not everyone can have a package of the same name. In fact, nobody can &amp;ndash; one MyPackage would simply overwrite over the other. Now would be a good time to create a new package with your own unique name. 

}}

The first question one should be asking is, &quot;How did Reg know how to make this mute?&quot; I don't work for Epic, never had any advanced look at the code, no classes, no manuals. Instead, the most common way you will find to learn how to do things in the Unreal engine is to compare it to something similar that is already functioning. In this case, I wanted a mutator that would lower the player's adrenaline about every second. That sounded like our old friend the Regeneration mutator, which raises the player's health about every second. So I hunted around the packages until I found the likely suspect of MutRegen. 

I don't want this to sound to rudimentary. Sure, for a really simple mutator like this, it seems obvious - but later on when you are trying to figure out how the trace function works to precisely land a shot with the InstantFire class, it might not seem so clear. In fact, if you ask questions on the forums and newsgroups, expect to get answers like &quot;Look in the RocketLauncherPickUp class&quot;. 

Now, here is the cooler class in full: 

&lt;uscript&gt;
//=============================================================================
// MutCooler - Lowers Adrenaline
//=============================================================================
class MutCooler extends Mutator;

#exec OBJ LOAD File=MutatorArt.utx

var() int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}

function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
	 	 if (C.Pawn != None &amp;&amp; C.Adrenaline &gt; 5 )
        {
            C.Adrenaline -= AdrenalineDecrease;
        }
    }
}

defaultproperties
{
     AdrenalineDecrease=2
     GroupName=&quot;Cooler&quot;
     FriendlyName=&quot;Cooler&quot;
     Description=&quot;Cools off adrenaline&quot;
}
&lt;/uscript&gt;

The top part is simply a comment block for describing things to the poor saps who might look at the code. The first real line of code is: 

&lt;uscript&gt;class MutCooler extends Mutator;&lt;/uscript&gt;

Which says that MutCooler is a child of Mutator, and inherits all its properties and methods (see [[Legacy:Class Syntax|Class syntax]] for more). Now, in order to make our specific mutator work, we simply extend Mutator's functionality by modifying or adding to those traits. 

&lt;uscript&gt;#exec OBJ LOAD File=MutatorArt.utx&lt;/uscript&gt;

[[Legacy:Exec Directive|Exec directive]]s like this one tell the engine to interact with real files, like models and textures and the like. This one is here pretty much only because it was in MutRegen. They become more important when you start trying to retexture existing models and the like. 

&lt;uscript&gt;var() int AdrenalineDecrease;&lt;/uscript&gt;

In UnrealScript, you define [[Legacy:UnrealScript_Language_Reference/Variables|global Variables]] before you define any methods or functions. While this is pretty standard for many languages, what may be weird to some is how you automatically define values (or instantiate) these variables

&lt;uscript&gt;
// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}
&lt;/uscript&gt;

Ah, one of my favorite parts of the mutator - because it looks like I was good and commented stuff. In reality, this was just something I copied from MutRegen. This redefines the event (events differ slightly from functions in how the native code sees them, but for the most part you can treat them the same) PreBeginPlay to start a timer. PreBeginPlay is called right after the object is created, but before gameplay begins. It and its similar function PostBeginPlay have a lot of usage when changing existing objects in the game. SetTimer has two variables - the first is the interval time for the timer, or how long to wait. The second is a boolean which sets the timer to repeat or not. Here, we set the timer to repeat about every second. 

&lt;uscript&gt;
function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
	 	 if (C.Pawn != None &amp;&amp; C.Adrenaline &gt; 5 )
        {
            C.Adrenaline -= AdrenalineDecrease;
        }
    }
}
&lt;/uscript&gt;

The function Timer is what is actually called when the timer is triggered. This creates a local variable to hold a [[Legacy:Controller|Controller]]. Controllers are new to UT2003, but could be easily described as the code which actually controls the pawn (player or bot) in the game. Pawns and Controllers work tightly together, allowing modders to modify distinct parts of them individually. Here, it runs through the current list of controllers (Level.ControllerList) and if that controller has a certain amount of adrenaline, it decreases it. 

{{innerbox|Quicknote about the &quot;C.Pawn != None&quot; test in the innermost if statement. For those familiar with java and similar languages, None in UScript is similar to null. It means that it won't perform the logic if that object isn't there. This is one of the most vital parts of scripting Unreal, because not catching instances where an object doesn't exist can not only break your code, but also slow down the entire game as the game logs the &quot;Accessed None&quot; error.

}}

&lt;uscript&gt;
defaultproperties
{
     AdrenalineDecrease=2
     GroupName=&quot;Cooler&quot;
     FriendlyName=&quot;Cooler&quot;
     Description=&quot;Cools off adrenaline&quot;
}
&lt;/uscript&gt;

Finally, the [[Legacy:Default Properties|default properties]] section. This defines some of the basic variables for the mutator. AdrenalineDecrease here is used in the timer to determine the amount of adrenaline to decrease, and if this mutator were configurable - that number could be changed to alter the mutator's effects without having to alter any code. The other three define the mutator for the game. The &quot;GroupName&quot; is the group the mutator belongs to. There can only be one mutator of a group brought into the game at one time. &quot;FriendlyName&quot; is the title placed into the mutator list and &quot;Description&quot; is what will go into the description block when the mutator is highlighted. 
 

{{innerbox|Quicknote about structuring the defaultproperties section - notice the lack of semicolons 

}}

There's the cooler class. Pretty simplistic, really. Now the only thing left is to open up the int file and add: 

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=XPak.MutCooler,Description=&quot;Cooler.&quot;)
&lt;/uscript&gt;

So that the game will recognize it. MetaClass here is the kind of object you are describing. In the next tute, you'll see how adding a weapon can be made to show on the Weapons Database dropdown. Name is the full name of the class, or Package.Class and description is simply a text description. Currently, I don't think UT2003 really uses description for mutes, but it's best to put one in. 

''This tutorial was originally part of [[Legacy:RegularX|RegularX]]'s [[Legacy:UTutes|UTutes]] series.''

==Related Topics ==
* [[Legacy:Weapon Mutator Tutorial|Weapon Mutator Tutorial]]: &amp;ndash; your recommended next step
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; all the UnrealScript tutorials
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; all the reference pages
* [[Legacy:Mutator Topics|Mutator Topics]] &amp;ndash; more on mutators
* [[Legacy:Making Mods|Making Mods]] &amp;ndash; more on the organizational and social aspects

==Comments ==

'''RegularX:''' It should be noted that the cooler class above is from the original xpak, and the code in the XXXPak has been updated (I think).

'''CorDharel:''' Question: Can I use the content of this tutorial for my own tutorial? I did one in german, and I think this way is really easy to understand. Would be great if i can.

'''RegularX:''' Certainly, just make all the usual acknowledgements/pointers back to the wiki.

'''CorDharel:''' I thank you, I did the acknowledgements and pointers. You can see the result on www.guc.ch.vu (sorry for propaganda), but I can't assure that you will understand it ;) 

'''CH3Z:''' Again, what if you are trying to mod for UT and don't have UT2003? This note extended from comment on [[Legacy:Regen Mutator|Regen Mutator]].

'''Heinz57:''' Hello all. This is my first edit at the Unreal Wiki. Regarding the mutators in XpakII, I had problems getting the SlipSuit.uc class to compile. The culprit seems to be the following code from the Tick function:

&lt;uscript&gt;
    if (OldAmmo &gt; RepAmmo)
        AmmoCharge -= 1.0;
    OldAmmo = RepAmmo;
&lt;/uscript&gt;

The variable OldAmmo is not declared locally for this method or at the class level. And, I followed the class hierarchy up through TransLauncher, Weapon, Inventory and Actor...  no declaration of this variable could be found. Perhaps I have an out of date version of the XpakII classes? If so, could someone please post a link within these tutes to the most up to date packages?

Thx

'''RegularX:''' Heya Heinz.  The copy of the Translauncher code I have here declares var int RepAmmo, OldAmmo in the same line.  That copy is a few patches old however and so Epic might have pulled a fast one and changed the class.  In fact, my non-photographic memory (more like a grease drawing) is thinking that I've seen something about OldAmmo in the logs recently - so I think that's likely.  If that's true (I can't confirm it on this computer), try replacing the Tick function with:

&lt;uscript&gt;
simulated function Tick(float dt)
{
  if ( Bot(Pawn(Owner).Controller) != none ){
		    if(FireMode[0].AllowFire()){
		    SlipSuitActivate(FireMode[0]).DoFireEffect();
						}
				}
Super.Tick(dt);
&lt;/uscript&gt;

And see if that compiles.  The SlipSuit uses the tick to trick the bots into triggering the Suit whenever they can, and that's probably the only portion of the function which needs to alter from the parent class.

I'm working on finalizing the next version of the xxxpak, but it might not be out for another &quot;two weeks&quot; or so.  If this continues to be a problem, email me at inkless@inkless.com.

'''Heinz57:''' Thanks for the quick response RegularX.  I've replaced the Tick() method code as you've shown (with the addition of a closing brace after the call to Super.Tick() - assuming all other code after was to be ignored), and this, of course, works great.  I'm afraid I can't test the change however (because I'm at work, and I have a feeling it would be frowned upon to fire up UT2K3 when I'm supposed to be happily coding ;-)). Is this a fix then, or just a workaround?

To confirm your suspicion re: variable declaration in the TransLauncher class, see the following snippet from the v2225 source:

&lt;uscript&gt;
var TransBeacon TransBeacon;
var() float     MaxCamDist;
var() float AmmoCharge;
var int RepAmmo;
var() float AmmoChargeMax;
var() float AmmoChargeRate;
var globalconfig bool bPrevWeaponSwitch;
&lt;/uscript&gt;

By the way, this was the only problem stopping me from compiling, so you should be golden, now.  Nice work, btw!

Cheers.

'''RegularX:''' Having the same work issue I can't confirm, but looking at the code it should be a fix, an improvement even, from the earlier SS class (because it won't let this happen again).  If it flies, I'll incorporate into the upcoming version.

'''DarthDevilous:''' Hi, only my second post here (forgot to put a name [[Legacy:Visual Studio 6|here]]). Anyway, what would happen if AdrenalineDecrease were bigger than 5?

'''RegularX:''' ... well, try it and find out ;)  Nothing will - in fact in a later version both Heater and Cooler had configs to alter that to anything.  So a larger number will just decrease the adrenaline that much faster.

'''T1:''' Just making sure, but does this code only work in UT2003? Because when I tried some of the XPak things on UT2004 they didn't work (GPFs)... It's been a while, so I don't remember if this mutator was one of the mutators UT2004 broke.

'''RegularX:''' I haven't tried these in UT2004 as I had always planned to recode them completely, so there might well be incompatibilities.  I would think this one would work.  The weapon ones won't.  I have new code for UXL which combines heater, cooler and the other adrenaline mutes into one.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5117</id>
      <timestamp>2004-12-28T17:38:10Z</timestamp>
      <contributor>
        <ip>T1</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This page is one of a series of [[Legacy:UnrealScript Lessons|UnrealScript Lessons]].''

==UTute 2: A Modify Mute (Cooler)==

Now that you've been warned about OO and have created your own package and simple mutator, let's take a closer look at what a mutator really is and how to use them. For this, we're going to rip open the Cooler mutator from the original XPak. This little mute cools off [[Legacy:Adrenaline|adrenaline]] even if you aren't using it, forcing players to keep on their killing sprees to be able to really pull off those combos. 

{{innerbox|Quicknote on that last tutorial &amp;ndash; you might want to completely delete your MyPackage directory, .u and .int file. Why? Because not everyone can have a package of the same name. In fact, nobody can &amp;ndash; one MyPackage would simply overwrite over the other. Now would be a good time to create a new package with your own unique name. 

}}

The first question one should be asking is, &quot;How did Reg know how to make this mute?&quot; I don't work for Epic, never had any advanced look at the code, no classes, no manuals. Instead, the most common way you will find to learn how to do things in the Unreal engine is to compare it to something similar that is already functioning. In this case, I wanted a mutator that would lower the player's adrenaline about every second. That sounded like our old friend the Regeneration mutator, which raises the player's health about every second. So I hunted around the packages until I found the likely suspect of MutRegen. 

I don't want this to sound to rudimentary. Sure, for a really simple mutator like this, it seems obvious - but later on when you are trying to figure out how the trace function works to precisely land a shot with the InstantFire class, it might not seem so clear. In fact, if you ask questions on the forums and newsgroups, expect to get answers like &quot;Look in the RocketLauncherPickUp class&quot;. 

Now, here is the cooler class in full: 

&lt;uscript&gt;
//=============================================================================
// MutCooler - Lowers Adrenaline
//=============================================================================
class MutCooler extends Mutator;

#exec OBJ LOAD File=MutatorArt.utx

var() int AdrenalineDecrease;

// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}

function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
	 	 if (C.Pawn != None &amp;&amp; C.Adrenaline &gt; 5 )
        {
            C.Adrenaline -= AdrenalineDecrease;
        }
    }
}

defaultproperties
{
     AdrenalineDecrease=2
     GroupName=&quot;Cooler&quot;
     FriendlyName=&quot;Cooler&quot;
     Description=&quot;Cools off adrenaline&quot;
}
&lt;/uscript&gt;

The top part is simply a comment block for describing things to the poor saps who might look at the code. The first real line of code is: 

&lt;uscript&gt;class MutCooler extends Mutator;&lt;/uscript&gt;

Which says that MutCooler is a child of Mutator, and inherits all its properties and methods (see [[Legacy:Class Syntax|Class syntax]] for more). Now, in order to make our specific mutator work, we simply extend Mutator's functionality by modifying or adding to those traits. 

&lt;uscript&gt;#exec OBJ LOAD File=MutatorArt.utx&lt;/uscript&gt;

[[Legacy:Exec Directive|Exec directive]]s like this one tell the engine to interact with real files, like models and textures and the like. This one is here pretty much only because it was in MutRegen. They become more important when you start trying to retexture existing models and the like. 

&lt;uscript&gt;var() int AdrenalineDecrease;&lt;/uscript&gt;

In UnrealScript, you define [[Legacy:UnrealScript_Language_Reference/Variables|global Variables]] before you define any methods or functions. While this is pretty standard for many languages, what may be weird to some is how you automatically define values (or instantiate) these variables

&lt;uscript&gt;
// Don't call Actor PreBeginPlay() for Mutator
event PreBeginPlay()
{
    SetTimer(1.0,true);
}
&lt;/uscript&gt;

Ah, one of my favorite parts of the mutator - because it looks like I was good and commented stuff. In reality, this was just something I copied from MutRegen. This redefines the event (events differ slightly from functions in how the native code sees them, but for the most part you can treat them the same) PreBeginPlay to start a timer. PreBeginPlay is called right after the object is created, but before gameplay begins. It and its similar function PostBeginPlay have a lot of usage when changing existing objects in the game. SetTimer has two variables - the first is the interval time for the timer, or how long to wait. The second is a boolean which sets the timer to repeat or not. Here, we set the timer to repeat about every second. 

&lt;uscript&gt;
function Timer()
{
    local Controller C;

    for (C = Level.ControllerList; C != None; C = C.NextController)
    {
	 	 if (C.Pawn != None &amp;&amp; C.Adrenaline &gt; 5 )
        {
            C.Adrenaline -= AdrenalineDecrease;
        }
    }
}
&lt;/uscript&gt;

The function Timer is what is actually called when the timer is triggered. This creates a local variable to hold a [[Legacy:Controller|Controller]]. Controllers are new to UT2003, but could be easily described as the code which actually controls the pawn (player or bot) in the game. Pawns and Controllers work tightly together, allowing modders to modify distinct parts of them individually. Here, it runs through the current list of controllers (Level.ControllerList) and if that controller has a certain amount of adrenaline, it decreases it. 

{{innerbox|Quicknote about the &quot;C.Pawn != None&quot; test in the innermost if statement. For those familiar with java and similar languages, None in UScript is similar to null. It means that it won't perform the logic if that object isn't there. This is one of the most vital parts of scripting Unreal, because not catching instances where an object doesn't exist can not only break your code, but also slow down the entire game as the game logs the &quot;Accessed None&quot; error.

}}

&lt;uscript&gt;
defaultproperties
{
     AdrenalineDecrease=2
     GroupName=&quot;Cooler&quot;
     FriendlyName=&quot;Cooler&quot;
     Description=&quot;Cools off adrenaline&quot;
}
&lt;/uscript&gt;

Finally, the [[Legacy:Default Properties|default properties]] section. This defines some of the basic variables for the mutator. AdrenalineDecrease here is used in the timer to determine the amount of adrenaline to decrease, and if this mutator were configurable - that number could be changed to alter the mutator's effects without having to alter any code. The other three define the mutator for the game. The &quot;GroupName&quot; is the group the mutator belongs to. There can only be one mutator of a group brought into the game at one time. &quot;FriendlyName&quot; is the title placed into the mutator list and &quot;Description&quot; is what will go into the description block when the mutator is highlighted. 
 

{{innerbox|Quicknote about structuring the defaultproperties section - notice the lack of semicolons 

}}

There's the cooler class. Pretty simplistic, really. Now the only thing left is to open up the int file and add: 

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=XPak.MutCooler,Description=&quot;Cooler.&quot;)
&lt;/uscript&gt;

So that the game will recognize it. MetaClass here is the kind of object you are describing. In the next tute, you'll see how adding a weapon can be made to show on the Weapons Database dropdown. Name is the full name of the class, or Package.Class and description is simply a text description. Currently, I don't think UT2003 really uses description for mutes, but it's best to put one in. 

''This tutorial was originally part of [[Legacy:RegularX|RegularX]]'s [[Legacy:UTutes|UTutes]] series.''

==Related Topics ==
* [[Legacy:Weapon Mutator Tutorial|Weapon Mutator Tutorial]]: &amp;ndash; your recommended next step
* [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] &amp;ndash; all the UnrealScript tutorials
* [[Legacy:UnrealScript|UnrealScript]] &amp;ndash; all the reference pages
* [[Legacy:Mutator Topics|Mutator Topics]] &amp;ndash; more on mutators
* [[Legacy:Making Mods|Making Mods]] &amp;ndash; more on the organizational and social aspects

==Comments ==

'''RegularX:''' It should be noted that the cooler class above is from the original xpak, and the code in the XXXPak has been updated (I think).

'''CorDharel:''' Question: Can I use the content of this tutorial for my own tutorial? I did one in german, and I think this way is really easy to understand. Would be great if i can.

'''RegularX:''' Certainly, just make all the usual acknowledgements/pointers back to the wiki.

'''CorDharel:''' I thank you, I did the acknowledgements and pointers. You can see the result on www.guc.ch.vu (sorry for propaganda), but I can't assure that you will understand it ;) 

'''CH3Z:''' Again, what if you are trying to mod for UT and don't have UT2003? This note extended from comment on [[Legacy:Regen Mutator|Regen Mutator]].

'''Heinz57:''' Hello all. This is my first edit at the Unreal Wiki. Regarding the mutators in XpakII, I had problems getting the SlipSuit.uc class to compile. The culprit seems to be the following code from the Tick function:

&lt;uscript&gt;
    if (OldAmmo &gt; RepAmmo)
        AmmoCharge -= 1.0;
    OldAmmo = RepAmmo;
&lt;/uscript&gt;

The variable OldAmmo is not declared locally for this method or at the class level. And, I followed the class hierarchy up through TransLauncher, Weapon, Inventory and Actor...  no declaration of this variable could be found. Perhaps I have an out of date version of the XpakII classes? If so, could someone please post a link within these tutes to the most up to date packages?

Thx

'''RegularX:''' Heya Heinz.  The copy of the Translauncher code I have here declares var int RepAmmo, OldAmmo in the same line.  That copy is a few patches old however and so Epic might have pulled a fast one and changed the class.  In fact, my non-photographic memory (more like a grease drawing) is thinking that I've seen something about OldAmmo in the logs recently - so I think that's likely.  If that's true (I can't confirm it on this computer), try replacing the Tick function with:

&lt;uscript&gt;
simulated function Tick(float dt)
{
  if ( Bot(Pawn(Owner).Controller) != none ){
		    if(FireMode[0].AllowFire()){
		    SlipSuitActivate(FireMode[0]).DoFireEffect();
						}
				}
Super.Tick(dt);
&lt;/uscript&gt;

And see if that compiles.  The SlipSuit uses the tick to trick the bots into triggering the Suit whenever they can, and that's probably the only portion of the function which needs to alter from the parent class.

I'm working on finalizing the next version of the xxxpak, but it might not be out for another &quot;two weeks&quot; or so.  If this continues to be a problem, email me at inkless@inkless.com.

'''Heinz57:''' Thanks for the quick response RegularX.  I've replaced the Tick() method code as you've shown (with the addition of a closing brace after the call to Super.Tick() - assuming all other code after was to be ignored), and this, of course, works great.  I'm afraid I can't test the change however (because I'm at work, and I have a feeling it would be frowned upon to fire up UT2K3 when I'm supposed to be happily coding ;-)). Is this a fix then, or just a workaround?

To confirm your suspicion re: variable declaration in the TransLauncher class, see the following snippet from the v2225 source:

&lt;uscript&gt;
var TransBeacon TransBeacon;
var() float     MaxCamDist;
var() float AmmoCharge;
var int RepAmmo;
var() float AmmoChargeMax;
var() float AmmoChargeRate;
var globalconfig bool bPrevWeaponSwitch;
&lt;/uscript&gt;

By the way, this was the only problem stopping me from compiling, so you should be golden, now.  Nice work, btw!

Cheers.

'''RegularX:''' Having the same work issue I can't confirm, but looking at the code it should be a fix, an improvement even, from the earlier SS class (because it won't let this happen again).  If it flies, I'll incorporate into the upcoming version.

'''DarthDevilous:''' Hi, only my second post here (forgot to put a name [[Legacy:Visual Studio 6|here]]). Anyway, what would happen if AdrenalineDecrease were bigger than 5?

'''RegularX:''' ... well, try it and find out ;)  Nothing will - in fact in a later version both Heater and Cooler had configs to alter that to anything.  So a larger number will just decrease the adrenaline that much faster.

'''T1:''' Just making sure, but does this code only work in UT2003? Because when I tried some of the XPak things on UT2004 they didn't work (GPFs)... It's been a while, so I don't remember if this mutator was one of the mutators UT2004 broke.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modifying The Bulldog</title>
    <id>2041</id>
    <revision>
      <id>4976</id>
      <timestamp>2006-05-01T21:13:15Z</timestamp>
      <contributor>
        <ip>HSE-Toronto-ppp3477733.sympatico.ca</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

A lot of people will want to play around with the demo vehicle that comes with [[Legacy:UT2003|UT2003]], the Bulldog. This page holds information about how to change certain aspects of the Bulldog.

The Bulldog in UT2004 is the same code, but due to the move of KVehicle from a subclass of Pawn to a subclass of Vehicle, and with all the other changes that took place for Vehicle support in UT2004, the Bulldog is broken.  To fix it, see the UT2004 Fix section on the [[Legacy:Bulldog|Bulldog]] page.

==Tutorials==

===Making the Bulldog drive faster===

This question was asked on the BU coding forum and is interesting because it needs general insight on how acceleration and speed are done on vehicles in general. To find out about this, an important function to observe is the following function taken from the [[Legacy:KCar|KCar]] class:

&lt;uscript&gt;
// Tell it your current throttle, and it will give you an output torque
// This is currently like an electric motor
function float Engine(float Throttle)
{
	local float torque;
    
	torque = Abs(Throttle) * Gear * InterpCurveEval(TorqueCurve, WheelSpinSpeed);

	GraphData(&quot;SpinSpeed&quot;, WheelSpinSpeed);
	GraphData(&quot;Torque&quot;, torque);

	return -1 * torque;
}
&lt;/uscript&gt;

It calculates the torque of the wheels using Throttle (player presses up or down), the gear (forwards or backwards) and the wheel spin speed in combination with a torque curve. The calculated torque is in its turn applied to the KMotorTorque property of the [[Legacy:KCarWheelJoint|KCarWheelJoint]] associated with every tire ([[Legacy:KTire|KTire]].WheelJoint). So to increase the maximum speed of the Bulldog or its acceleration, we only need to change the TorqueCurve. This can be done in the [[Legacy:Default Properties|Default Properties]] of a (user written) subclass by overriding the default value in the Bulldog class.

The default value for TorqueCurve in the Bulldog class is:

&lt;uscript&gt;
TorqueCurve=(Points=((InVal=0,OutVal=270),(InVal=200000,OutVal=270),(InVal=300000,OutVal=0)))
&lt;/uscript&gt;

:'''Note:''' If you are using UnrealEd you can't see the default properties section of the class in it's source. Instead, you can right-click the class in the class tree and choose 'Default Properties...'. The above value will be under the KCar rollout.

Basically this value of TorqueCurve means the acceleration will be constant while wheel spin speed is between 0 and 200000, and that it will linearly decrease between 200000 and 300000. For RPM, these values will probably need to be divided by 65535 (see [[udn2:KarmaReference]]). The InterpCurveEval function will probably work the three coordinates in a curve so the actual &quot;wheel-spin -&gt; torque&quot; relation will be a somewhat smoothed out version.

To '''increase the maximum speed''' of the Bulldog, you can simply make the torque last on higher wheel spin speeds by increasing the last two InVal numbers.

To '''increase the acceleration''' of the Bulldog, you can increase the value of the OutVal properties. This will not have a very noticable effect though, because the wheels will slid very much. But decreasing acceleration works very well.

Be carefull though, the Bulldog is not build on such high speeds. The front wheels will quickly lift from the air and make steering impossible, and you'll run into some rock eventually and fly miles away. Of course, the steering problem could in its turn be worked around by deviding the weight of the Bulldog to have more mass in the front. Something that could be covered in a tutorial on coding [[Legacy:Karma|Karma]] objects I think.

===Using the TorqueCurves for Gears===

'''Kaoh:''' I would like to add some info to the TorqueCurve info, first time so i hope I do it correctly ;).

'''Note''' To do this you need to subclass the Bulldog, you cant do this when you place a bulldog or something.

The Curve can be build with as much points as you want. All points consist of 2 pairs the InVal and OutVal as shown above. The Outval is the acceleration the vehicle will have, the Inval specify's the wheelspin range for what this OutVal is valid for. Check the above examples for more info on this.

This means that the acceleration will always be only attached to the wheelspin. With gears you want to simulate the loss of acceleration when the car drives too slow for that gear, this can't be done with one Curve.

Think of this as Gears in a car where you actually change the gear to get a better Curve for that speed.

The best way to do that is to specify multiple gear ratios.

&lt;uscript&gt;
TorqueCurve[1]=(Points=((InVal=0,OutVal=270),(InVal=200000,OutVal=270)))
TorqueCurve[2]=(Points=((InVal=0,OutVal=2),(InVal=200000,OutVal=270),(InVal=300000,OutVal=0)))
&lt;/uscript&gt;

This will make it so that in the first gear you can only go up to 200000 wheelspin but with good acceleration. In the second gear you will now accelerate really bad till you hit that 200000 wheelspin and then accelerate good up to 300000.

This is rather simple to implement to a vehicle with gears.

You can now simply change the code in the engine function to use the correct Curve and add some code that switches gears.

&lt;uscript&gt;
// Tell it your current throttle, and it will give you an output torque
// This is currently like an electric motor
function float Engine(float Throttle)
{
	local float torque;
    
	torque = Abs(Throttle) * Gear * InterpCurveEval(TorqueCurve[Gear], WheelSpinSpeed);

	GraphData(&quot;SpinSpeed&quot;, WheelSpinSpeed);
	GraphData(&quot;Torque&quot;, torque);

	return -1 * torque;
}
&lt;/uscript&gt;

As you can see I made of the TorqueCurve a Array so you can easely add more curves depending on the amount of gears you want.

This way you can let a fith gear accelerate almost to none but a first gear with good speed.

'''Note''' The actual speed of the vehicle is based primairly on the Torque that is genererated on the wheels. The second major factor is the size of the wheels. When you increase the size of the wheels and keep the torgue the same, you will drive faster because very simply the rotation stays the same.

I hope this helps some people.

Thanks to Bjorn for giving this info in the first place, helped me out a lot

'''Birelli:''' If I'm reading the above code right, it needs a slight tweak in that you can't both multiply by the current gear AND reference the correct torque curve with it, unless your torque curves are all going to take into account the fact that when you kick the bulldog into second gear you're going to automatically double the torque. I think if you actually used that code above it would be readily apparent that there was a problem with it the first time you shifted gears and your acceleration suddenly doubled ;).

'''Foxpaw:''' Actually the approximate speed of the vehicle is based on the rate at which the wheels are turning multiplied by their radius, multiplied by the &quot;coefficient of traction&quot; which is some mangled native version of the friction of the wheels on the ground. Torque causes the wheels to accelerate. They will cease accelerating when their torque and their angular resistance to acceleration reach equilibrium. If the same amount of torque continues higher, it will increase max speed, but only to a point. (The default bulldog does not reach the equlibrium.) You might also consider than the first curve in the above will allow you to get maximum torque at ANY wheel spin speed, you need to terminate it by having the last value be 0 or whatever amount you wanted for the wheels to reach the equilibrium point. I'll refactor this into the above someday. :P

===Adding Shadow to the Bulldog===

If you have driven around with the Bulldog you must have noticed that it didn't have any shadow. Adding shadow to the Bulldog would make blend much more realistically into its environment. There's a reason for not having shadow on the Bulldog though, it's because it is slow. It's even very slow when viewing the Bulldog from very close (only tested on Radeon 8500, needs confirmation for other cards). But slow or not, let's add it anyway.

[[Legacy:Create A Subclass|Create A Subclass]] of the Bulldog, eg &quot;MyBulldog&quot; in your own &quot;MyPackage&quot;. Once you've set that up, read on. In [[Legacy:UT2003|UT2003]], shadows are cast by [[Legacy:ShadowProjector|ShadowProjector]]s. Our own Bulldog will need a shadow projector associated with it so add this variable:

&lt;uscript&gt;
var ShadowProjector BulldogShadow;
&lt;/uscript&gt;

We only have to make sure that the shadow is spawned as soon as the Bulldog is spawned. This can be done in the function PostBeginPlay(). The spawned shadow will also need to be removed as soon as the Bulldog is removed. This can be done in the function Destroyed(). Here's the code to add to you MyBulldog class:

&lt;uscript&gt;
simulated function PostBeginPlay()
{
	Super.PostBeginPlay();

	if (Level.NetMode != NM_DedicatedServer)
	{
		BulldogShadow = Spawn(class'ShadowProjector', self, '', Location);
		BulldogShadow.ShadowActor = self;
		BulldogShadow.bBlobShadow = false;
		BulldogShadow.LightDirection = Normal(vect(1,1,6));
		BulldogShadow.LightDistance = 1200;
		BulldogShadow.MaxTraceDistance = 350;
		BulldogShadow.InitShadow();
	}
}

simulated function Destroyed()
{
	if (BulldogShadow != None) BulldogShadow.Destroy();
	Super.Destroyed();
}
&lt;/uscript&gt;

Notice that we don't need to update the shadow ourselves, the [[Legacy:ShadowProjector|ShadowProjector]] will take care of that in its Tick() function. At this stage only the chassis of the Bulldog will cast a shadow. Of course, this doesn't look quite right so we'll need to add shadow to the tires too. I'll leave it to your own practice to subclass BulldogTire with your own MyBulldogTire class and add shadow casting to it.

Now I assume you have created a MyBulldogTire class and added shadow casting to that one. We still have to make our MyBulldog class use those tires. [[Legacy:KCar|KCar]] has declared two variables for us to use for specifying the tires of any such vehicle:

&lt;uscript&gt;
var (KCar) class&lt;KTire&gt; FrontTireClass;
var (KCar) class&lt;KTire&gt; RearTireClass;
&lt;/uscript&gt;

Notice how the Bulldog class sets these to BulldogTire in its own defaultproperties. We will set them to our own tire class like this:

&lt;uscript&gt;
defaultproperties
{
	FrontTireClass=class'MyBulldogTire'
	RearTireClass=class'MyBulldogTire'
}
&lt;/uscript&gt;

And we're done. Our Bulldog and its tires will now be casting a nice shadow on the ground as well as on other static meshes like other Bulldogs. Here's a screenshot showing off the effect:

[[Image:Legacy_BulldogShadowOnCrop.jpeg|center|]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:KVehicle|KVehicle]]
** [[Legacy:KCar|KCar]]
*** [[Legacy:Bulldog|Bulldog]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
** [[Legacy:BulldogFactory|BulldogFactory]]

==Discussion==

'''Bjorn:''' Please comment. It's my first real addition to the Wiki so I would like to know if it's ok. Also, any requests on more info are welcome.

'''Highlander:''' Looks great, i was wondering if there was any bot support (ie: ai controlled vehicles) at all.

'''AZTEX:''' Very cool, I wonderd how to increase the Bulldog's mass to make it less like a fether and more like well a brick with weel's &quot;which it is!&quot; (aztex_original@hotmail)

'''Bjorn:''' Thanks for these suggestions. I'll look into the AI and weight, but I don't think AI will be easy if at all doable.

'''AlphaOne:''' I think there is a solution to fast spinning wheels. It was outlined in the Karma reference at UDN. It shows that for fast spinnig hinges there is a special value that can be set to TRUE to prevent calculation errors.

'''Bjorn:''' Thanks, I'll try this out.

'''Kaoh:''' I added some Gear for TorqueCurve info, I hope i did it correctly it is my first change on Wiki. If it doesnt have enough new value please feel free to remove it again.

'''Chema:''' To tweak the Bulldog on the fly, get on it and do a &quot;editobj bulldog&quot; in console (and, if you have not tryed before, give a look to &quot;editobj xPawn&quot; -player- and &quot;editobj LevelInfo0&quot; -wolrd-).  More [[Legacy:Console Commands/Debugging Console Commands|Console Commands/Debugging Console Commands]].

'''Foxpaw:''' This may not work for all parameters - the Karma physics are only updated if you call the relevant function after changing it's values. This will work fine for some things like the torque curves, however.

----

'''AlphaOne:''' About the 'Slow Shadows' &amp;rarr; to solve the problem just use proxy geometry to cast shadows. Use somthing low poly, such as the shapes used by '''KARMA''' to calculate collisions. That should increase the performance.

'''The_Watcher:''' Does anyone know how to go about using proxy geometry to cast shadows. I am a little confused. Thank you.

'''Solid Snake:''' What he means is that the Bulldog mesh itself has a lot of polygons and so on, which is probably not needed in creating a rather accurate yet blurry shadow. What he means is that when you want the shadow, spawn another actor which has a similiar shape to the Bulldog but a lot less polycounts and since that shape[aka 3D model] has less polys and then generate the shadow from that mesh and it will be much quicker.

----

'''Daid303:''' It is in the text above, but not very clear

If you want it faster: TorqueCurve=(Points=((InVal=0,OutVal=270),(InVal=400000,OutVal=270),(InVal=500000,OutVal=0)))

If you want it faster accalitation: TorqueCurve=(Points=((InVal=0,OutVal=500),(InVal=400000,OutVal=500),(InVal=500000,OutVal=0)))

'''Daid303:''' ProjectX if you are xtremely bored then help building up these pages: [[Legacy:Vehicles|Vehicles]] [[Legacy:KVehicle|KVehicle]] [[Legacy:KCar|KCar]]

'''ProjectX:''' I would but my train of thought is solely on mapping, get anywhere near coding and it de-rails, killing all the passengers (much like British rail really :) ) Anyway i really like what your doing, but is it possible to get a 1st person view camera inside that thing? would be well good. And a sort of system that if the bulldog was not used in, say, 1 minute, it is automatically destroyed, lowers fps and also, if you drive into a pit you cant get out of, you die, respawn and wait a bit for a new bulldog. (lets just say ive done that more than once, (and not just on UT2K3  either) thankyou AA).

'''Daid303:''' The 1 min no use time isn't that hard, the &quot;you're f*cked&quot; code is a lot harder.

'''ProjectX:''' What i meant was that you'd kill yourself with your own weapon and then respawn and wait

'''Daid303:'''A sort like, you press AltFire, and you hear. Tick....Tick....Tick.... And the next thing you remember is ariving at the gates of hell.

'''ProjectX:''' You could, or you could just get them to shoot themselves with a rocket launcher, would be much easier, you dont need to code anything for that. Just have to shoot yourself.

'''Chema:''' Using your shield gun is more fun, and sometimes you can actually get out of the hole hammer-jumping! Of course, for the purist scripter, a &quot;&lt;TAB&gt; suicide&quot; would seem more logical ;-)

----

'''Chimaira:''' If you are making a copy of the bulldog in uED (almost) all of the default-propeteries are diffrent from the original bulldog...in some places there is no value over all.

So...just open the default-propeteries of your car and the bulldog and &quot;copy&quot; all that is in the bulldog-DP.

After you´ve done that you want to save your car right? So... save the package you made your car in.

It´s just one big problem......when you try to save your class with your own car it says &quot;The file on disk(26,058)is larger than the file in memory(-1). Are you sure you want to overwrite it? 'yes/no'&quot; 

If you choose yes your file is deleted (-1 means nothing).

I´ve tested all the values that you need to change and i found out that it is the karma-value that messes up everything.

Does anyone know how i could prevent this error or(and) tell me about any other scripting-programs.

'''Daid303:''' Easy fix: Don't use UnrealEd (Use UCC make), it seems to messup as soon as you have InLine Objects (or how is that called?) After 1 rebuild with UCC make (with custom Objects in default properties), you can step back to UnrealEd (if you want, but there are much better tools out there)

----

'''ProjectX:''' Does anyone know where the Uscript for the bulldog is once uve exported the scripts, i cant find it to edit it in notepad!

'''BM.Deathwind:''' I suggest using UDE to edit code.  It should be in the UT2k3 &quot;System&quot; folder (Or you can get it from http://unreal.epicgames.com/ ).  It builds the class heirarchy too, so you can find it that way.

'''ProjectX;''' thanx, ive got that dun now, i only have one more problem, when i load the new bulldog in a level, it appears, but when i walk up to it, and press [use] i cant get in it. The code i've changed is on a separate page: [[Legacy:ProjectX/Code|ProjectX/Code]]

'''Kaoh:''' you need to change the triggers also, make a copy of the BulldogTrigger.uc and rename it, in there you can specify the correct class for you vehicle.

----

'''Chema:''' A question: to add shadow to the bulldog, you have to subclass it, and then change the Vehicles.Bulldogs in the map, or in Vehicles.BulldogFactory.VehicleClass, for MyPack.BulldogShadows.  Or, as I did first, modifying the original Bulldog instead of subclassing it (Larry Wall's fault!).  Of course, for VehicleDemo.ut2, the best way is to change Vehicles.BulldogFactory.VehicleClass, but what If I had several maps with spawned Bulldogs (but no factories)?  I could edit the map, but how could I add the shadow to the original Bulls, only with code?  Maybee with an intercepting function, like UT's SpawnNotify?  Or redefining (oscuring?) the Bulldog?  

Supose there is no nice (&quot;objetive&quot;) way to do such thing, but you know, its a subjetive doubt :-D

'''Foxpaw:''' You could use a mutator to do that. That would likely be the best way.

'''Chema:''' But what would I do in the mutator? Redefine/obscure the bulldog class?

'''Foxpaw:''' Mutators have an event called CheckReplacement and a function called ReplaceWith. This allows you to replace all instances of a given class with another class. It is used, for instance, in the Arena mutator to change all of the weapons. Likewise you could use the mutator to replace all instances of the Bulldog with your new, modified Bulldog. That way no maps would need to be modified, and backwards compatibility would also be retained if people wanted to play a map containing your modified bulldogs but would rather use the default bulldogs. The mutator could look something like the following, with &quot;NewBulldogClass&quot; replaced with whatever the class name of your modified bulldog is. It might not compile or work quite right, I didn't test it. But you get the idea:

&lt;uscript&gt;
// Replace all class instances of 'BullDog' with 'NewBulldogClass'.
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
  if ( Other.IsA( 'BullDog' ) &amp;&amp; !Other.IsA('NewBulldogClass') )
  {
    ReplaceWith( Other, NewBulldogClass );
    return false;
  }

  Super.CheckReplacement( Other, bSuperRelevant );
  return true;
}
&lt;/uscript&gt;

----

'''Chema:''' On a less bizarre side, I'm planning to finish the sound and force feedback code of the bullye.  Has anyone done it already?

'''Foxpaw:''' I don't have any force feedback devices so I haven't tested that but the sounds (at least the ones I played around with) work fine. There just isn't any sounds set into the sound variables. All of the function calls, etc. are already in place, you just need to add sounds in the defaultproperties.

'''Billy Boy:''' How would I go about making the Bulldog smaller? I want to half its size for a smaller indoor arena.

'''ProjectX (Finally decided to learn coding yay!!!):''' Billy, all you do is change the static mesh scale in the default properties. I suggest you start using an IDE such as conTEXT or UDE to do your coding since UnrealEd won' let you do advanced stuff like custom models.

'''Foxpaw:''' Actually you can, it's just not very convenient. I too would not recommend using UnrealEd to modify script though. I used to just use notepad, but now I use [[Legacy:TextPad|TextPad]].

'''Erdrik:''' I've been messing around with vehicle code for awhile(submited a hovertank code in the vehicles section), but I haven't really mess around with the wheels to much. I've been trying to make smaller wheels by simply scaling down the bulldog tires, but some odd things start happening. The collision and staticmesh are scaled down, as it actually looks smaller and I can bounce grenades around it accuratly. BUT, the wheel itself rest on the ground as if it were still as big as normal, making it look like the wheel is floating a bit off the ground. I'm assuming this is becuase the new scal isn't set properly in the Karma and was wondering if anyone new where I could go in the code to fix this?

'''MythOpus:''' I had some messings with vehicle code too.  Most of the stuff I did caused errors and locked my computer up.  Sigh...  Anyways, to fix your wheel problem, I imagine that you haven't changed the position of the wheels (relative to the vehicle of course :)) .  You'll have to experiment with this until you get what your looking for but if you look in the default properties and find a property called:

&lt;uscript&gt;
     WheelFrontAlong=-100.000000
     WheelFrontAcross=110.000000
     WheelRearAlong=115.000000
     WheelRearAcross=110.000000 
     WheelVert=-15.000000 // For vertical alignment I believe ;)
&lt;/uscript&gt;

'''Erdrik:''' No I already did that. I'm not having a problem with the wheels location. The problem is that even tho the graphic of the wheel is scaled down it still rolls on the ground as if it were bigger. the strange part is that weapon traces and projectiles collide properly!?

'''MythOpus:''' Well, did you make a new collision for the wheels?  It doesn't need one :)

'''Foxpaw:''' Well, since it's a KTire, it's magic for Karma purposes. The original bulldog tire has a Karma collision hull but also a traditional collisionradius and collisionheight - maybe one of those is being used for the tire simulation.

'''MythOpus:''' Are you sure that the KTire has a karma collision hull?  When you turn on that view karma collision button, it doesn't show an collision...

'''Foxpaw:''' Ah. That's because it has a &quot;Karma Primitive&quot; collision but no polygonal collision. You can use both, but the tire has only one. The &quot;Karma Primitive&quot; collision has to be specified in the modelling program, but allows you to do perfect spherical collision and cylinder collision. You can view these collision hulls by checking the &quot;Show Karma Primitives&quot; menu item.

'''MythOpus:''' I see :)  It all becomes clear at last.

'''WinterHummer:''' I like what you all the work for the bulldog but i'm having trouble getting it to drive faster in UT2004. I've done the fix but i've tried &quot;KMaxSpeed&quot; Nope

'''MythOpus:''' I don't really deal with the workings of vehicles (I believe they should be EASIER to code), but I think you're better off working with UT2004's version of the vehicle code.  It's more stable and works better.  I also remember the last time I spawned a bulldog in UT2004.  It moved for around 2 seconds then it just died and nothing could budge it.  

'''WinterHummer:''' You're probably right about just working with the ut2004 SVehicle Code but its missing something and that is drivesplit. You know like front wheel driver or rear wheel drive.I got the going faster to work but now I cant get the wheelspin above 100000 &amp; change. Oh and changing the torecurve is having no effect.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4977</id>
      <timestamp>2006-04-30T18:27:08Z</timestamp>
      <contributor>
        <ip>64-110-209-244.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>response</comment>
      <text xml:space="preserve">==Introduction==

A lot of people will want to play around with the demo vehicle that comes with [[Legacy:UT2003|UT2003]], the Bulldog. This page holds information about how to change certain aspects of the Bulldog.

The Bulldog in UT2004 is the same code, but due to the move of KVehicle from a subclass of Pawn to a subclass of Vehicle, and with all the other changes that took place for Vehicle support in UT2004, the Bulldog is broken.  To fix it, see the UT2004 Fix section on the [[Legacy:Bulldog|Bulldog]] page.

==Tutorials==

===Making the Bulldog drive faster===

This question was asked on the BU coding forum and is interesting because it needs general insight on how acceleration and speed are done on vehicles in general. To find out about this, an important function to observe is the following function taken from the [[Legacy:KCar|KCar]] class:

&lt;uscript&gt;
// Tell it your current throttle, and it will give you an output torque
// This is currently like an electric motor
function float Engine(float Throttle)
{
	local float torque;
    
	torque = Abs(Throttle) * Gear * InterpCurveEval(TorqueCurve, WheelSpinSpeed);

	GraphData(&quot;SpinSpeed&quot;, WheelSpinSpeed);
	GraphData(&quot;Torque&quot;, torque);

	return -1 * torque;
}
&lt;/uscript&gt;

It calculates the torque of the wheels using Throttle (player presses up or down), the gear (forwards or backwards) and the wheel spin speed in combination with a torque curve. The calculated torque is in its turn applied to the KMotorTorque property of the [[Legacy:KCarWheelJoint|KCarWheelJoint]] associated with every tire ([[Legacy:KTire|KTire]].WheelJoint). So to increase the maximum speed of the Bulldog or its acceleration, we only need to change the TorqueCurve. This can be done in the [[Legacy:Default Properties|Default Properties]] of a (user written) subclass by overriding the default value in the Bulldog class.

The default value for TorqueCurve in the Bulldog class is:

&lt;uscript&gt;
TorqueCurve=(Points=((InVal=0,OutVal=270),(InVal=200000,OutVal=270),(InVal=300000,OutVal=0)))
&lt;/uscript&gt;

:'''Note:''' If you are using UnrealEd you can't see the default properties section of the class in it's source. Instead, you can right-click the class in the class tree and choose 'Default Properties...'. The above value will be under the KCar rollout.

Basically this value of TorqueCurve means the acceleration will be constant while wheel spin speed is between 0 and 200000, and that it will linearly decrease between 200000 and 300000. For RPM, these values will probably need to be divided by 65535 (see [[udn2:KarmaReference]]). The InterpCurveEval function will probably work the three coordinates in a curve so the actual &quot;wheel-spin -&gt; torque&quot; relation will be a somewhat smoothed out version.

To '''increase the maximum speed''' of the Bulldog, you can simply make the torque last on higher wheel spin speeds by increasing the last two InVal numbers.

To '''increase the acceleration''' of the Bulldog, you can increase the value of the OutVal properties. This will not have a very noticable effect though, because the wheels will slid very much. But decreasing acceleration works very well.

Be carefull though, the Bulldog is not build on such high speeds. The front wheels will quickly lift from the air and make steering impossible, and you'll run into some rock eventually and fly miles away. Of course, the steering problem could in its turn be worked around by deviding the weight of the Bulldog to have more mass in the front. Something that could be covered in a tutorial on coding [[Legacy:Karma|Karma]] objects I think.

===Using the TorqueCurves for Gears===

'''Kaoh:''' I would like to add some info to the TorqueCurve info, first time so i hope I do it correctly ;).

'''Note''' To do this you need to subclass the Bulldog, you cant do this when you place a bulldog or something.

The Curve can be build with as much points as you want. All points consist of 2 pairs the InVal and OutVal as shown above. The Outval is the acceleration the vehicle will have, the Inval specify's the wheelspin range for what this OutVal is valid for. Check the above examples for more info on this.

This means that the acceleration will always be only attached to the wheelspin. With gears you want to simulate the loss of acceleration when the car drives too slow for that gear, this can't be done with one Curve.

Think of this as Gears in a car where you actually change the gear to get a better Curve for that speed.

The best way to do that is to specify multiple gear ratios.

&lt;uscript&gt;
TorqueCurve[1]=(Points=((InVal=0,OutVal=270),(InVal=200000,OutVal=270)))
TorqueCurve[2]=(Points=((InVal=0,OutVal=2),(InVal=200000,OutVal=270),(InVal=300000,OutVal=0)))
&lt;/uscript&gt;

This will make it so that in the first gear you can only go up to 200000 wheelspin but with good acceleration. In the second gear you will now accelerate really bad till you hit that 200000 wheelspin and then accelerate good up to 300000.

This is rather simple to implement to a vehicle with gears.

You can now simply change the code in the engine function to use the correct Curve and add some code that switches gears.

&lt;uscript&gt;
// Tell it your current throttle, and it will give you an output torque
// This is currently like an electric motor
function float Engine(float Throttle)
{
	local float torque;
    
	torque = Abs(Throttle) * Gear * InterpCurveEval(TorqueCurve[Gear], WheelSpinSpeed);

	GraphData(&quot;SpinSpeed&quot;, WheelSpinSpeed);
	GraphData(&quot;Torque&quot;, torque);

	return -1 * torque;
}
&lt;/uscript&gt;

As you can see I made of the TorqueCurve a Array so you can easely add more curves depending on the amount of gears you want.

This way you can let a fith gear accelerate almost to none but a first gear with good speed.

'''Note''' The actual speed of the vehicle is based primairly on the Torque that is genererated on the wheels. The second major factor is the size of the wheels. When you increase the size of the wheels and keep the torgue the same, you will drive faster because very simply the rotation stays the same.

I hope this helps some people.

Thanks to Bjorn for giving this info in the first place, helped me out a lot

'''Birelli:''' If I'm reading the above code right, it needs a slight tweak in that you can't both multiply by the current gear AND reference the correct torque curve with it, unless your torque curves are all going to take into account the fact that when you kick the bulldog into second gear you're going to automatically double the torque. I think if you actually used that code above it would be readily apparent that there was a problem with it the first time you shifted gears and your acceleration suddenly doubled ;).

'''Foxpaw:''' Actually the approximate speed of the vehicle is based on the rate at which the wheels are turning multiplied by their radius, multiplied by the &quot;coefficient of traction&quot; which is some mangled native version of the friction of the wheels on the ground. Torque causes the wheels to accelerate. They will cease accelerating when their torque and their angular resistance to acceleration reach equilibrium. If the same amount of torque continues higher, it will increase max speed, but only to a point. (The default bulldog does not reach the equlibrium.) You might also consider than the first curve in the above will allow you to get maximum torque at ANY wheel spin speed, you need to terminate it by having the last value be 0 or whatever amount you wanted for the wheels to reach the equilibrium point. I'll refactor this into the above someday. :P

===Adding Shadow to the Bulldog===

If you have driven around with the Bulldog you must have noticed that it didn't have any shadow. Adding shadow to the Bulldog would make blend much more realistically into its environment. There's a reason for not having shadow on the Bulldog though, it's because it is slow. It's even very slow when viewing the Bulldog from very close (only tested on Radeon 8500, needs confirmation for other cards). But slow or not, let's add it anyway.

[[Legacy:Create A Subclass|Create A Subclass]] of the Bulldog, eg &quot;MyBulldog&quot; in your own &quot;MyPackage&quot;. Once you've set that up, read on. In [[Legacy:UT2003|UT2003]], shadows are cast by [[Legacy:ShadowProjector|ShadowProjector]]s. Our own Bulldog will need a shadow projector associated with it so add this variable:

&lt;uscript&gt;
var ShadowProjector BulldogShadow;
&lt;/uscript&gt;

We only have to make sure that the shadow is spawned as soon as the Bulldog is spawned. This can be done in the function PostBeginPlay(). The spawned shadow will also need to be removed as soon as the Bulldog is removed. This can be done in the function Destroyed(). Here's the code to add to you MyBulldog class:

&lt;uscript&gt;
simulated function PostBeginPlay()
{
	Super.PostBeginPlay();

	if (Level.NetMode != NM_DedicatedServer)
	{
		BulldogShadow = Spawn(class'ShadowProjector', self, '', Location);
		BulldogShadow.ShadowActor = self;
		BulldogShadow.bBlobShadow = false;
		BulldogShadow.LightDirection = Normal(vect(1,1,6));
		BulldogShadow.LightDistance = 1200;
		BulldogShadow.MaxTraceDistance = 350;
		BulldogShadow.InitShadow();
	}
}

simulated function Destroyed()
{
	if (BulldogShadow != None) BulldogShadow.Destroy();
	Super.Destroyed();
}
&lt;/uscript&gt;

Notice that we don't need to update the shadow ourselves, the [[Legacy:ShadowProjector|ShadowProjector]] will take care of that in its Tick() function. At this stage only the chassis of the Bulldog will cast a shadow. Of course, this doesn't look quite right so we'll need to add shadow to the tires too. I'll leave it to your own practice to subclass BulldogTire with your own MyBulldogTire class and add shadow casting to it.

Now I assume you have created a MyBulldogTire class and added shadow casting to that one. We still have to make our MyBulldog class use those tires. [[Legacy:KCar|KCar]] has declared two variables for us to use for specifying the tires of any such vehicle:

&lt;uscript&gt;
var (KCar) class&lt;KTire&gt; FrontTireClass;
var (KCar) class&lt;KTire&gt; RearTireClass;
&lt;/uscript&gt;

Notice how the Bulldog class sets these to BulldogTire in its own defaultproperties. We will set them to our own tire class like this:

&lt;uscript&gt;
defaultproperties
{
	FrontTireClass=class'MyBulldogTire'
	RearTireClass=class'MyBulldogTire'
}
&lt;/uscript&gt;

And we're done. Our Bulldog and its tires will now be casting a nice shadow on the ground as well as on other static meshes like other Bulldogs. Here's a screenshot showing off the effect:

[[Image:Legacy_BulldogShadowOnCrop.jpeg|center|]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:KVehicle|KVehicle]]
** [[Legacy:KCar|KCar]]
*** [[Legacy:Bulldog|Bulldog]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
** [[Legacy:BulldogFactory|BulldogFactory]]

==Discussion==

'''Bjorn:''' Please comment. It's my first real addition to the Wiki so I would like to know if it's ok. Also, any requests on more info are welcome.

'''Highlander:''' Looks great, i was wondering if there was any bot support (ie: ai controlled vehicles) at all.

'''AZTEX:''' Very cool, I wonderd how to increase the Bulldog's mass to make it less like a fether and more like well a brick with weel's &quot;which it is!&quot; (aztex_original@hotmail)

'''Bjorn:''' Thanks for these suggestions. I'll look into the AI and weight, but I don't think AI will be easy if at all doable.

'''AlphaOne:''' I think there is a solution to fast spinning wheels. It was outlined in the Karma reference at UDN. It shows that for fast spinnig hinges there is a special value that can be set to TRUE to prevent calculation errors.

'''Bjorn:''' Thanks, I'll try this out.

'''Kaoh:''' I added some Gear for TorqueCurve info, I hope i did it correctly it is my first change on Wiki. If it doesnt have enough new value please feel free to remove it again.

'''Chema:''' To tweak the Bulldog on the fly, get on it and do a &quot;editobj bulldog&quot; in console (and, if you have not tryed before, give a look to &quot;editobj xPawn&quot; -player- and &quot;editobj LevelInfo0&quot; -wolrd-).  More [[Legacy:Console Commands/Debugging Console Commands|Console Commands/Debugging Console Commands]].

'''Foxpaw:''' This may not work for all parameters - the Karma physics are only updated if you call the relevant function after changing it's values. This will work fine for some things like the torque curves, however.

----

'''AlphaOne:''' About the 'Slow Shadows' &amp;rarr; to solve the problem just use proxy geometry to cast shadows. Use somthing low poly, such as the shapes used by '''KARMA''' to calculate collisions. That should increase the performance.

'''The_Watcher:''' Does anyone know how to go about using proxy geometry to cast shadows. I am a little confused. Thank you.

'''Solid Snake:''' What he means is that the Bulldog mesh itself has a lot of polygons and so on, which is probably not needed in creating a rather accurate yet blurry shadow. What he means is that when you want the shadow, spawn another actor which has a similiar shape to the Bulldog but a lot less polycounts and since that shape[aka 3D model] has less polys and then generate the shadow from that mesh and it will be much quicker.

----

'''Daid303:''' It is in the text above, but not very clear

If you want it faster: TorqueCurve=(Points=((InVal=0,OutVal=270),(InVal=400000,OutVal=270),(InVal=500000,OutVal=0)))

If you want it faster accalitation: TorqueCurve=(Points=((InVal=0,OutVal=500),(InVal=400000,OutVal=500),(InVal=500000,OutVal=0)))

'''Daid303:''' ProjectX if you are xtremely bored then help building up these pages: [[Legacy:Vehicles|Vehicles]] [[Legacy:KVehicle|KVehicle]] [[Legacy:KCar|KCar]]

'''ProjectX:''' I would but my train of thought is solely on mapping, get anywhere near coding and it de-rails, killing all the passengers (much like British rail really :) ) Anyway i really like what your doing, but is it possible to get a 1st person view camera inside that thing? would be well good. And a sort of system that if the bulldog was not used in, say, 1 minute, it is automatically destroyed, lowers fps and also, if you drive into a pit you cant get out of, you die, respawn and wait a bit for a new bulldog. (lets just say ive done that more than once, (and not just on UT2K3  either) thankyou AA).

'''Daid303:''' The 1 min no use time isn't that hard, the &quot;you're f*cked&quot; code is a lot harder.

'''ProjectX:''' What i meant was that you'd kill yourself with your own weapon and then respawn and wait

'''Daid303:'''A sort like, you press AltFire, and you hear. Tick....Tick....Tick.... And the next thing you remember is ariving at the gates of hell.

'''ProjectX:''' You could, or you could just get them to shoot themselves with a rocket launcher, would be much easier, you dont need to code anything for that. Just have to shoot yourself.

'''Chema:''' Using your shield gun is more fun, and sometimes you can actually get out of the hole hammer-jumping! Of course, for the purist scripter, a &quot;&lt;TAB&gt; suicide&quot; would seem more logical ;-)

----

'''Chimaira:''' If you are making a copy of the bulldog in uED (almost) all of the default-propeteries are diffrent from the original bulldog...in some places there is no value over all.

So...just open the default-propeteries of your car and the bulldog and &quot;copy&quot; all that is in the bulldog-DP.

After you´ve done that you want to save your car right? So... save the package you made your car in.

It´s just one big problem......when you try to save your class with your own car it says &quot;The file on disk(26,058)is larger than the file in memory(-1). Are you sure you want to overwrite it? 'yes/no'&quot; 

If you choose yes your file is deleted (-1 means nothing).

I´ve tested all the values that you need to change and i found out that it is the karma-value that messes up everything.

Does anyone know how i could prevent this error or(and) tell me about any other scripting-programs.

'''Daid303:''' Easy fix: Don't use UnrealEd (Use UCC make), it seems to messup as soon as you have InLine Objects (or how is that called?) After 1 rebuild with UCC make (with custom Objects in default properties), you can step back to UnrealEd (if you want, but there are much better tools out there)

----

'''ProjectX:''' Does anyone know where the Uscript for the bulldog is once uve exported the scripts, i cant find it to edit it in notepad!

'''BM.Deathwind:''' I suggest using UDE to edit code.  It should be in the UT2k3 &quot;System&quot; folder (Or you can get it from http://unreal.epicgames.com/ ).  It builds the class heirarchy too, so you can find it that way.

'''ProjectX;''' thanx, ive got that dun now, i only have one more problem, when i load the new bulldog in a level, it appears, but when i walk up to it, and press [use] i cant get in it. The code i've changed is on a separate page: [[Legacy:ProjectX/Code|ProjectX/Code]]

'''Kaoh:''' you need to change the triggers also, make a copy of the BulldogTrigger.uc and rename it, in there you can specify the correct class for you vehicle.

----

'''Chema:''' A question: to add shadow to the bulldog, you have to subclass it, and then change the Vehicles.Bulldogs in the map, or in Vehicles.BulldogFactory.VehicleClass, for MyPack.BulldogShadows.  Or, as I did first, modifying the original Bulldog instead of subclassing it (Larry Wall's fault!).  Of course, for VehicleDemo.ut2, the best way is to change Vehicles.BulldogFactory.VehicleClass, but what If I had several maps with spawned Bulldogs (but no factories)?  I could edit the map, but how could I add the shadow to the original Bulls, only with code?  Maybee with an intercepting function, like UT's SpawnNotify?  Or redefining (oscuring?) the Bulldog?  

Supose there is no nice (&quot;objetive&quot;) way to do such thing, but you know, its a subjetive doubt :-D

'''Foxpaw:''' You could use a mutator to do that. That would likely be the best way.

'''Chema:''' But what would I do in the mutator? Redefine/obscure the bulldog class?

'''Foxpaw:''' Mutators have an event called CheckReplacement and a function called ReplaceWith. This allows you to replace all instances of a given class with another class. It is used, for instance, in the Arena mutator to change all of the weapons. Likewise you could use the mutator to replace all instances of the Bulldog with your new, modified Bulldog. That way no maps would need to be modified, and backwards compatibility would also be retained if people wanted to play a map containing your modified bulldogs but would rather use the default bulldogs. The mutator could look something like the following, with &quot;NewBulldogClass&quot; replaced with whatever the class name of your modified bulldog is. It might not compile or work quite right, I didn't test it. But you get the idea:

&lt;uscript&gt;
// Replace all class instances of 'BullDog' with 'NewBulldogClass'.
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
  if ( Other.IsA( 'BullDog' ) &amp;&amp; !Other.IsA('NewBulldogClass') )
  {
    ReplaceWith( Other, NewBulldogClass );
    return false;
  }

  Super.CheckReplacement( Other, bSuperRelevant );
  return true;
}
&lt;/uscript&gt;

----

'''Chema:''' On a less bizarre side, I'm planning to finish the sound and force feedback code of the bullye.  Has anyone done it already?

'''Foxpaw:''' I don't have any force feedback devices so I haven't tested that but the sounds (at least the ones I played around with) work fine. There just isn't any sounds set into the sound variables. All of the function calls, etc. are already in place, you just need to add sounds in the defaultproperties.

'''Billy Boy:''' How would I go about making the Bulldog smaller? I want to half its size for a smaller indoor arena.

'''ProjectX (Finally decided to learn coding yay!!!):''' Billy, all you do is change the static mesh scale in the default properties. I suggest you start using an IDE such as conTEXT or UDE to do your coding since UnrealEd won' let you do advanced stuff like custom models.

'''Foxpaw:''' Actually you can, it's just not very convenient. I too would not recommend using UnrealEd to modify script though. I used to just use notepad, but now I use [[Legacy:TextPad|TextPad]].

'''Erdrik:''' I've been messing around with vehicle code for awhile(submited a hovertank code in the vehicles section), but I haven't really mess around with the wheels to much. I've been trying to make smaller wheels by simply scaling down the bulldog tires, but some odd things start happening. The collision and staticmesh are scaled down, as it actually looks smaller and I can bounce grenades around it accuratly. BUT, the wheel itself rest on the ground as if it were still as big as normal, making it look like the wheel is floating a bit off the ground. I'm assuming this is becuase the new scal isn't set properly in the Karma and was wondering if anyone new where I could go in the code to fix this?

'''MythOpus:''' I had some messings with vehicle code too.  Most of the stuff I did caused errors and locked my computer up.  Sigh...  Anyways, to fix your wheel problem, I imagine that you haven't changed the position of the wheels (relative to the vehicle of course :)) .  You'll have to experiment with this until you get what your looking for but if you look in the default properties and find a property called:

&lt;uscript&gt;
     WheelFrontAlong=-100.000000
     WheelFrontAcross=110.000000
     WheelRearAlong=115.000000
     WheelRearAcross=110.000000 
     WheelVert=-15.000000 // For vertical alignment I believe ;)
&lt;/uscript&gt;

'''Erdrik:''' No I already did that. I'm not having a problem with the wheels location. The problem is that even tho the graphic of the wheel is scaled down it still rolls on the ground as if it were bigger. the strange part is that weapon traces and projectiles collide properly!?

'''MythOpus:''' Well, did you make a new collision for the wheels?  It doesn't need one :)

'''Foxpaw:''' Well, since it's a KTire, it's magic for Karma purposes. The original bulldog tire has a Karma collision hull but also a traditional collisionradius and collisionheight - maybe one of those is being used for the tire simulation.

'''MythOpus:''' Are you sure that the KTire has a karma collision hull?  When you turn on that view karma collision button, it doesn't show an collision...

'''Foxpaw:''' Ah. That's because it has a &quot;Karma Primitive&quot; collision but no polygonal collision. You can use both, but the tire has only one. The &quot;Karma Primitive&quot; collision has to be specified in the modelling program, but allows you to do perfect spherical collision and cylinder collision. You can view these collision hulls by checking the &quot;Show Karma Primitives&quot; menu item.

'''MythOpus:''' I see :)  It all becomes clear at last.

'''WinterHummer:''' I like what you all the work for the bulldog but i'm having trouble getting it to drive faster in UT2004. I've done the fix but i've tried &quot;KMaxSpeed&quot; Nope

'''MythOpus:''' I don't really deal with the workings of vehicles (I believe they should be EASIER to code), but I think you're better off working with UT2004's version of the vehicle code.  It's more stable and works better.  I also remember the last time I spawned a bulldog in UT2004.  It moved for around 2 seconds then it just died and nothing could budge it.  

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4978</id>
      <timestamp>2006-05-01T21:12:31Z</timestamp>
      <contributor>
        <ip>HSE-Toronto-ppp3477733.sympatico.ca</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Introduction==

A lot of people will want to play around with the demo vehicle that comes with [[Legacy:UT2003|UT2003]], the Bulldog. This page holds information about how to change certain aspects of the Bulldog.

The Bulldog in UT2004 is the same code, but due to the move of KVehicle from a subclass of Pawn to a subclass of Vehicle, and with all the other changes that took place for Vehicle support in UT2004, the Bulldog is broken.  To fix it, see the UT2004 Fix section on the [[Legacy:Bulldog|Bulldog]] page.

==Tutorials==

===Making the Bulldog drive faster===

This question was asked on the BU coding forum and is interesting because it needs general insight on how acceleration and speed are done on vehicles in general. To find out about this, an important function to observe is the following function taken from the [[Legacy:KCar|KCar]] class:

&lt;uscript&gt;
// Tell it your current throttle, and it will give you an output torque
// This is currently like an electric motor
function float Engine(float Throttle)
{
	local float torque;
    
	torque = Abs(Throttle) * Gear * InterpCurveEval(TorqueCurve, WheelSpinSpeed);

	GraphData(&quot;SpinSpeed&quot;, WheelSpinSpeed);
	GraphData(&quot;Torque&quot;, torque);

	return -1 * torque;
}
&lt;/uscript&gt;

It calculates the torque of the wheels using Throttle (player presses up or down), the gear (forwards or backwards) and the wheel spin speed in combination with a torque curve. The calculated torque is in its turn applied to the KMotorTorque property of the [[Legacy:KCarWheelJoint|KCarWheelJoint]] associated with every tire ([[Legacy:KTire|KTire]].WheelJoint). So to increase the maximum speed of the Bulldog or its acceleration, we only need to change the TorqueCurve. This can be done in the [[Legacy:Default Properties|Default Properties]] of a (user written) subclass by overriding the default value in the Bulldog class.

The default value for TorqueCurve in the Bulldog class is:

&lt;uscript&gt;
TorqueCurve=(Points=((InVal=0,OutVal=270),(InVal=200000,OutVal=270),(InVal=300000,OutVal=0)))
&lt;/uscript&gt;

:'''Note:''' If you are using UnrealEd you can't see the default properties section of the class in it's source. Instead, you can right-click the class in the class tree and choose 'Default Properties...'. The above value will be under the KCar rollout.

Basically this value of TorqueCurve means the acceleration will be constant while wheel spin speed is between 0 and 200000, and that it will linearly decrease between 200000 and 300000. For RPM, these values will probably need to be divided by 65535 (see [[udn2:KarmaReference]]). The InterpCurveEval function will probably work the three coordinates in a curve so the actual &quot;wheel-spin -&gt; torque&quot; relation will be a somewhat smoothed out version.

To '''increase the maximum speed''' of the Bulldog, you can simply make the torque last on higher wheel spin speeds by increasing the last two InVal numbers.

To '''increase the acceleration''' of the Bulldog, you can increase the value of the OutVal properties. This will not have a very noticable effect though, because the wheels will slid very much. But decreasing acceleration works very well.

Be carefull though, the Bulldog is not build on such high speeds. The front wheels will quickly lift from the air and make steering impossible, and you'll run into some rock eventually and fly miles away. Of course, the steering problem could in its turn be worked around by deviding the weight of the Bulldog to have more mass in the front. Something that could be covered in a tutorial on coding [[Legacy:Karma|Karma]] objects I think.

===Using the TorqueCurves for Gears===

'''Kaoh:''' I would like to add some info to the TorqueCurve info, first time so i hope I do it correctly ;).

'''Note''' To do this you need to subclass the Bulldog, you cant do this when you place a bulldog or something.

The Curve can be build with as much points as you want. All points consist of 2 pairs the InVal and OutVal as shown above. The Outval is the acceleration the vehicle will have, the Inval specify's the wheelspin range for what this OutVal is valid for. Check the above examples for more info on this.

This means that the acceleration will always be only attached to the wheelspin. With gears you want to simulate the loss of acceleration when the car drives too slow for that gear, this can't be done with one Curve.

Think of this as Gears in a car where you actually change the gear to get a better Curve for that speed.

The best way to do that is to specify multiple gear ratios.

&lt;uscript&gt;
TorqueCurve[1]=(Points=((InVal=0,OutVal=270),(InVal=200000,OutVal=270)))
TorqueCurve[2]=(Points=((InVal=0,OutVal=2),(InVal=200000,OutVal=270),(InVal=300000,OutVal=0)))
&lt;/uscript&gt;

This will make it so that in the first gear you can only go up to 200000 wheelspin but with good acceleration. In the second gear you will now accelerate really bad till you hit that 200000 wheelspin and then accelerate good up to 300000.

This is rather simple to implement to a vehicle with gears.

You can now simply change the code in the engine function to use the correct Curve and add some code that switches gears.

&lt;uscript&gt;
// Tell it your current throttle, and it will give you an output torque
// This is currently like an electric motor
function float Engine(float Throttle)
{
	local float torque;
    
	torque = Abs(Throttle) * Gear * InterpCurveEval(TorqueCurve[Gear], WheelSpinSpeed);

	GraphData(&quot;SpinSpeed&quot;, WheelSpinSpeed);
	GraphData(&quot;Torque&quot;, torque);

	return -1 * torque;
}
&lt;/uscript&gt;

As you can see I made of the TorqueCurve a Array so you can easely add more curves depending on the amount of gears you want.

This way you can let a fith gear accelerate almost to none but a first gear with good speed.

'''Note''' The actual speed of the vehicle is based primairly on the Torque that is genererated on the wheels. The second major factor is the size of the wheels. When you increase the size of the wheels and keep the torgue the same, you will drive faster because very simply the rotation stays the same.

I hope this helps some people.

Thanks to Bjorn for giving this info in the first place, helped me out a lot

'''Birelli:''' If I'm reading the above code right, it needs a slight tweak in that you can't both multiply by the current gear AND reference the correct torque curve with it, unless your torque curves are all going to take into account the fact that when you kick the bulldog into second gear you're going to automatically double the torque. I think if you actually used that code above it would be readily apparent that there was a problem with it the first time you shifted gears and your acceleration suddenly doubled ;).

'''Foxpaw:''' Actually the approximate speed of the vehicle is based on the rate at which the wheels are turning multiplied by their radius, multiplied by the &quot;coefficient of traction&quot; which is some mangled native version of the friction of the wheels on the ground. Torque causes the wheels to accelerate. They will cease accelerating when their torque and their angular resistance to acceleration reach equilibrium. If the same amount of torque continues higher, it will increase max speed, but only to a point. (The default bulldog does not reach the equlibrium.) You might also consider than the first curve in the above will allow you to get maximum torque at ANY wheel spin speed, you need to terminate it by having the last value be 0 or whatever amount you wanted for the wheels to reach the equilibrium point. I'll refactor this into the above someday. :P

===Adding Shadow to the Bulldog===

If you have driven around with the Bulldog you must have noticed that it didn't have any shadow. Adding shadow to the Bulldog would make blend much more realistically into its environment. There's a reason for not having shadow on the Bulldog though, it's because it is slow. It's even very slow when viewing the Bulldog from very close (only tested on Radeon 8500, needs confirmation for other cards). But slow or not, let's add it anyway.

[[Legacy:Create A Subclass|Create A Subclass]] of the Bulldog, eg &quot;MyBulldog&quot; in your own &quot;MyPackage&quot;. Once you've set that up, read on. In [[Legacy:UT2003|UT2003]], shadows are cast by [[Legacy:ShadowProjector|ShadowProjector]]s. Our own Bulldog will need a shadow projector associated with it so add this variable:

&lt;uscript&gt;
var ShadowProjector BulldogShadow;
&lt;/uscript&gt;

We only have to make sure that the shadow is spawned as soon as the Bulldog is spawned. This can be done in the function PostBeginPlay(). The spawned shadow will also need to be removed as soon as the Bulldog is removed. This can be done in the function Destroyed(). Here's the code to add to you MyBulldog class:

&lt;uscript&gt;
simulated function PostBeginPlay()
{
	Super.PostBeginPlay();

	if (Level.NetMode != NM_DedicatedServer)
	{
		BulldogShadow = Spawn(class'ShadowProjector', self, '', Location);
		BulldogShadow.ShadowActor = self;
		BulldogShadow.bBlobShadow = false;
		BulldogShadow.LightDirection = Normal(vect(1,1,6));
		BulldogShadow.LightDistance = 1200;
		BulldogShadow.MaxTraceDistance = 350;
		BulldogShadow.InitShadow();
	}
}

simulated function Destroyed()
{
	if (BulldogShadow != None) BulldogShadow.Destroy();
	Super.Destroyed();
}
&lt;/uscript&gt;

Notice that we don't need to update the shadow ourselves, the [[Legacy:ShadowProjector|ShadowProjector]] will take care of that in its Tick() function. At this stage only the chassis of the Bulldog will cast a shadow. Of course, this doesn't look quite right so we'll need to add shadow to the tires too. I'll leave it to your own practice to subclass BulldogTire with your own MyBulldogTire class and add shadow casting to it.

Now I assume you have created a MyBulldogTire class and added shadow casting to that one. We still have to make our MyBulldog class use those tires. [[Legacy:KCar|KCar]] has declared two variables for us to use for specifying the tires of any such vehicle:

&lt;uscript&gt;
var (KCar) class&lt;KTire&gt; FrontTireClass;
var (KCar) class&lt;KTire&gt; RearTireClass;
&lt;/uscript&gt;

Notice how the Bulldog class sets these to BulldogTire in its own defaultproperties. We will set them to our own tire class like this:

&lt;uscript&gt;
defaultproperties
{
	FrontTireClass=class'MyBulldogTire'
	RearTireClass=class'MyBulldogTire'
}
&lt;/uscript&gt;

And we're done. Our Bulldog and its tires will now be casting a nice shadow on the ground as well as on other static meshes like other Bulldogs. Here's a screenshot showing off the effect:

[[Image:Legacy_BulldogShadowOnCrop.jpeg|center|]]

==Related Topics==
* [[Legacy:Vehicles|Vehicles]]
* [[Legacy:KVehicle|KVehicle]]
** [[Legacy:KCar|KCar]]
*** [[Legacy:Bulldog|Bulldog]]
* [[Legacy:KVehicleFactory|KVehicleFactory]]
** [[Legacy:BulldogFactory|BulldogFactory]]

==Discussion==

'''Bjorn:''' Please comment. It's my first real addition to the Wiki so I would like to know if it's ok. Also, any requests on more info are welcome.

'''Highlander:''' Looks great, i was wondering if there was any bot support (ie: ai controlled vehicles) at all.

'''AZTEX:''' Very cool, I wonderd how to increase the Bulldog's mass to make it less like a fether and more like well a brick with weel's &quot;which it is!&quot; (aztex_original@hotmail)

'''Bjorn:''' Thanks for these suggestions. I'll look into the AI and weight, but I don't think AI will be easy if at all doable.

'''AlphaOne:''' I think there is a solution to fast spinning wheels. It was outlined in the Karma reference at UDN. It shows that for fast spinnig hinges there is a special value that can be set to TRUE to prevent calculation errors.

'''Bjorn:''' Thanks, I'll try this out.

'''Kaoh:''' I added some Gear for TorqueCurve info, I hope i did it correctly it is my first change on Wiki. If it doesnt have enough new value please feel free to remove it again.

'''Chema:''' To tweak the Bulldog on the fly, get on it and do a &quot;editobj bulldog&quot; in console (and, if you have not tryed before, give a look to &quot;editobj xPawn&quot; -player- and &quot;editobj LevelInfo0&quot; -wolrd-).  More [[Legacy:Console Commands/Debugging Console Commands|Console Commands/Debugging Console Commands]].

'''Foxpaw:''' This may not work for all parameters - the Karma physics are only updated if you call the relevant function after changing it's values. This will work fine for some things like the torque curves, however.

----

'''AlphaOne:''' About the 'Slow Shadows' &amp;rarr; to solve the problem just use proxy geometry to cast shadows. Use somthing low poly, such as the shapes used by '''KARMA''' to calculate collisions. That should increase the performance.

'''The_Watcher:''' Does anyone know how to go about using proxy geometry to cast shadows. I am a little confused. Thank you.

'''Solid Snake:''' What he means is that the Bulldog mesh itself has a lot of polygons and so on, which is probably not needed in creating a rather accurate yet blurry shadow. What he means is that when you want the shadow, spawn another actor which has a similiar shape to the Bulldog but a lot less polycounts and since that shape[aka 3D model] has less polys and then generate the shadow from that mesh and it will be much quicker.

----

'''Daid303:''' It is in the text above, but not very clear

If you want it faster: TorqueCurve=(Points=((InVal=0,OutVal=270),(InVal=400000,OutVal=270),(InVal=500000,OutVal=0)))

If you want it faster accalitation: TorqueCurve=(Points=((InVal=0,OutVal=500),(InVal=400000,OutVal=500),(InVal=500000,OutVal=0)))

'''Daid303:''' ProjectX if you are xtremely bored then help building up these pages: [[Legacy:Vehicles|Vehicles]] [[Legacy:KVehicle|KVehicle]] [[Legacy:KCar|KCar]]

'''ProjectX:''' I would but my train of thought is solely on mapping, get anywhere near coding and it de-rails, killing all the passengers (much like British rail really :) ) Anyway i really like what your doing, but is it possible to get a 1st person view camera inside that thing? would be well good. And a sort of system that if the bulldog was not used in, say, 1 minute, it is automatically destroyed, lowers fps and also, if you drive into a pit you cant get out of, you die, respawn and wait a bit for a new bulldog. (lets just say ive done that more than once, (and not just on UT2K3  either) thankyou AA).

'''Daid303:''' The 1 min no use time isn't that hard, the &quot;you're f*cked&quot; code is a lot harder.

'''ProjectX:''' What i meant was that you'd kill yourself with your own weapon and then respawn and wait

'''Daid303:'''A sort like, you press AltFire, and you hear. Tick....Tick....Tick.... And the next thing you remember is ariving at the gates of hell.

'''ProjectX:''' You could, or you could just get them to shoot themselves with a rocket launcher, would be much easier, you dont need to code anything for that. Just have to shoot yourself.

'''Chema:''' Using your shield gun is more fun, and sometimes you can actually get out of the hole hammer-jumping! Of course, for the purist scripter, a &quot;&lt;TAB&gt; suicide&quot; would seem more logical ;-)

----

'''Chimaira:''' If you are making a copy of the bulldog in uED (almost) all of the default-propeteries are diffrent from the original bulldog...in some places there is no value over all.

So...just open the default-propeteries of your car and the bulldog and &quot;copy&quot; all that is in the bulldog-DP.

After you´ve done that you want to save your car right? So... save the package you made your car in.

It´s just one big problem......when you try to save your class with your own car it says &quot;The file on disk(26,058)is larger than the file in memory(-1). Are you sure you want to overwrite it? 'yes/no'&quot; 

If you choose yes your file is deleted (-1 means nothing).

I´ve tested all the values that you need to change and i found out that it is the karma-value that messes up everything.

Does anyone know how i could prevent this error or(and) tell me about any other scripting-programs.

'''Daid303:''' Easy fix: Don't use UnrealEd (Use UCC make), it seems to messup as soon as you have InLine Objects (or how is that called?) After 1 rebuild with UCC make (with custom Objects in default properties), you can step back to UnrealEd (if you want, but there are much better tools out there)

----

'''ProjectX:''' Does anyone know where the Uscript for the bulldog is once uve exported the scripts, i cant find it to edit it in notepad!

'''BM.Deathwind:''' I suggest using UDE to edit code.  It should be in the UT2k3 &quot;System&quot; folder (Or you can get it from http://unreal.epicgames.com/ ).  It builds the class heirarchy too, so you can find it that way.

'''ProjectX;''' thanx, ive got that dun now, i only have one more problem, when i load the new bulldog in a level, it appears, but when i walk up to it, and press [use] i cant get in it. The code i've changed is on a separate page: [[Legacy:ProjectX/Code|ProjectX/Code]]

'''Kaoh:''' you need to change the triggers also, make a copy of the BulldogTrigger.uc and rename it, in there you can specify the correct class for you vehicle.

----

'''Chema:''' A question: to add shadow to the bulldog, you have to subclass it, and then change the Vehicles.Bulldogs in the map, or in Vehicles.BulldogFactory.VehicleClass, for MyPack.BulldogShadows.  Or, as I did first, modifying the original Bulldog instead of subclassing it (Larry Wall's fault!).  Of course, for VehicleDemo.ut2, the best way is to change Vehicles.BulldogFactory.VehicleClass, but what If I had several maps with spawned Bulldogs (but no factories)?  I could edit the map, but how could I add the shadow to the original Bulls, only with code?  Maybee with an intercepting function, like UT's SpawnNotify?  Or redefining (oscuring?) the Bulldog?  

Supose there is no nice (&quot;objetive&quot;) way to do such thing, but you know, its a subjetive doubt :-D

'''Foxpaw:''' You could use a mutator to do that. That would likely be the best way.

'''Chema:''' But what would I do in the mutator? Redefine/obscure the bulldog class?

'''Foxpaw:''' Mutators have an event called CheckReplacement and a function called ReplaceWith. This allows you to replace all instances of a given class with another class. It is used, for instance, in the Arena mutator to change all of the weapons. Likewise you could use the mutator to replace all instances of the Bulldog with your new, modified Bulldog. That way no maps would need to be modified, and backwards compatibility would also be retained if people wanted to play a map containing your modified bulldogs but would rather use the default bulldogs. The mutator could look something like the following, with &quot;NewBulldogClass&quot; replaced with whatever the class name of your modified bulldog is. It might not compile or work quite right, I didn't test it. But you get the idea:

&lt;uscript&gt;
// Replace all class instances of 'BullDog' with 'NewBulldogClass'.
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
  if ( Other.IsA( 'BullDog' ) &amp;&amp; !Other.IsA('NewBulldogClass') )
  {
    ReplaceWith( Other, NewBulldogClass );
    return false;
  }

  Super.CheckReplacement( Other, bSuperRelevant );
  return true;
}
&lt;/uscript&gt;

----

'''Chema:''' On a less bizarre side, I'm planning to finish the sound and force feedback code of the bullye.  Has anyone done it already?

'''Foxpaw:''' I don't have any force feedback devices so I haven't tested that but the sounds (at least the ones I played around with) work fine. There just isn't any sounds set into the sound variables. All of the function calls, etc. are already in place, you just need to add sounds in the defaultproperties.

'''Billy Boy:''' How would I go about making the Bulldog smaller? I want to half its size for a smaller indoor arena.

'''ProjectX (Finally decided to learn coding yay!!!):''' Billy, all you do is change the static mesh scale in the default properties. I suggest you start using an IDE such as conTEXT or UDE to do your coding since UnrealEd won' let you do advanced stuff like custom models.

'''Foxpaw:''' Actually you can, it's just not very convenient. I too would not recommend using UnrealEd to modify script though. I used to just use notepad, but now I use [[Legacy:TextPad|TextPad]].

'''Erdrik:''' I've been messing around with vehicle code for awhile(submited a hovertank code in the vehicles section), but I haven't really mess around with the wheels to much. I've been trying to make smaller wheels by simply scaling down the bulldog tires, but some odd things start happening. The collision and staticmesh are scaled down, as it actually looks smaller and I can bounce grenades around it accuratly. BUT, the wheel itself rest on the ground as if it were still as big as normal, making it look like the wheel is floating a bit off the ground. I'm assuming this is becuase the new scal isn't set properly in the Karma and was wondering if anyone new where I could go in the code to fix this?

'''MythOpus:''' I had some messings with vehicle code too.  Most of the stuff I did caused errors and locked my computer up.  Sigh...  Anyways, to fix your wheel problem, I imagine that you haven't changed the position of the wheels (relative to the vehicle of course :)) .  You'll have to experiment with this until you get what your looking for but if you look in the default properties and find a property called:

&lt;uscript&gt;
     WheelFrontAlong=-100.000000
     WheelFrontAcross=110.000000
     WheelRearAlong=115.000000
     WheelRearAcross=110.000000 
     WheelVert=-15.000000 // For vertical alignment I believe ;)
&lt;/uscript&gt;

'''Erdrik:''' No I already did that. I'm not having a problem with the wheels location. The problem is that even tho the graphic of the wheel is scaled down it still rolls on the ground as if it were bigger. the strange part is that weapon traces and projectiles collide properly!?

'''MythOpus:''' Well, did you make a new collision for the wheels?  It doesn't need one :)

'''Foxpaw:''' Well, since it's a KTire, it's magic for Karma purposes. The original bulldog tire has a Karma collision hull but also a traditional collisionradius and collisionheight - maybe one of those is being used for the tire simulation.

'''MythOpus:''' Are you sure that the KTire has a karma collision hull?  When you turn on that view karma collision button, it doesn't show an collision...

'''Foxpaw:''' Ah. That's because it has a &quot;Karma Primitive&quot; collision but no polygonal collision. You can use both, but the tire has only one. The &quot;Karma Primitive&quot; collision has to be specified in the modelling program, but allows you to do perfect spherical collision and cylinder collision. You can view these collision hulls by checking the &quot;Show Karma Primitives&quot; menu item.

'''MythOpus:''' I see :)  It all becomes clear at last.

'''WinterHummer:''' I like what you all the work for the bulldog but i'm having trouble getting it to drive faster in UT2004. I've done the fix but i've tried &quot;KMaxSpeed&quot; Nope

'''MythOpus:''' I don't really deal with the workings of vehicles (I believe they should be EASIER to code), but I think you're better off working with UT2004's version of the vehicle code.  It's more stable and works better.  I also remember the last time I spawned a bulldog in UT2004.  It moved for around 2 seconds then it just died and nothing could budge it.  

'''WinterHummer:''' You're probably right about just working with the ut2004 SVehicle Code but its missing something and that is drivesplit. You know like front wheel driver or rear wheel drive.I got the going faster to work but now I cant get the wheelspin above 100000 &amp; change.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modifying Vehicle Weapons</title>
    <id>2219</id>
    <revision>
      <id>5371</id>
      <timestamp>2007-01-22T18:44:12Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is tutorial is for UT2004 and UEd3

I ([[Legacy:Blip2|blip2]]) have noticed how many people often ask who to change the weapons on a vehicle - I myself asked a similar question and after 25 replies managed to get a result - not perfect but OK. But anyhow i have decided to help unclog the forums and write a tutorial.

The going on this may be slow as it is quite hard and there are thousands of possibilities for weapon changes.

===Let's get started===

The only prerequisite for this tutorial is [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]. This tutorial assumes you have [[Legacy:UMake|UMake]] along with a basic [[Legacy:Text Editor|text editor]].

==Copying your vehicle==

First, [[Legacy:Set Up Package Folders|Set Up Package Folders]] for the project. For the purposes of this tutorial I will use the project I am working on, &quot;Shockmanta&quot;: this describes the weapon (shock balls) and the base vehicle (manta) and therefore is suitable. 

e.g:
 c:\UT2004&gt; mkdir MyPackage
 c:\UT2004&gt; mkdir MyPackage\Classes
 c:\UT2004&gt; cd MyPackage\Classes

Note: this is not a tutorial on creating a new vehicle.  We are simply taking a base vehicle and substituting its weapons for others that already exist in the game.  Choose your vehicle and get the class file for it, 

Read [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] for more information

A few points on where to find them
* The .uc files are within classes directories of the root folders
* A cheat sheet is a good place to start as the cheat goes 
 summon.(foldername).(classfile)

e.g.
 summon.onslaught.onshoverbike

...summons a manta

So copy the class file for the vehicle into the new folder

e.g: 
 c:\UT2004\MyPackage\Classes&gt; copy C:\UT2004\Onslaught\Classes\ONSHoverBike.uc .\ShockManta.uc

==Modifying the vehicle==

This is really just a case working it out yourself but i will give you a few guide lines to get you on your way

* Change the file name of the Vehicle you want to modify

eg.

ONSHoverBike.uc to ShockManta.uc

* At the top in the file there is a line that says:

class ONSHoverBike extends ONSHoverCraft

change it to:

class ShockManta extends ONSHoverBike

* You must set the class to the name of the .uc file otherwise it will not compile
* If you are only modifying the weapon it is probably best to extend the original vehicle (ONSHoverBike) but if you are going to do some serious modification you are best subclassing the [[Legacy:Vehicle Class|vehicle class]] and copying the code from a vehicle within it

eg.

class ShockManta extends ONSHoverCraft

Code from ONSHoverBike (which you can then modify)

==Modifying the vehicle weapon==

For weapons it is probably best to start with the ''default properties'' section (near the bottom)

You will find a line that starts with DriverWeapons(0)=

The Weaponclass is the code for the bit that fires (I will go on to this later) and the weaponbone is the bone in the sceletal mesh that the firing bit is attached to (don't change it unless you've make your own vehicle and know the bone names)

You could change it to something like this:

&lt;uscript&gt;DriverWeapons(0)=(WeaponClass=class'OnslaughtBP.ONSShockTankCannon',WeaponBone=PlasmaGunAttachment);&lt;/uscript&gt;

You're best off getting the WeaponClass from another vehicle (open the class and paste it into the new vehicle)

This is the primary weapons control for just about all vehicles (driver) and as you can probably see all I have done is replaced the manta weapon with the same bit in the ONSShocktank .uc file (OnslaughtBP folder if you are interested)

Passenger weapons are similar

&lt;uscript&gt;PassengerWeapons(0)=(WeaponPawnClass=class'ONSTankSecondaryTurretPawn',WeaponBone=MachineGunTurret)&lt;/uscript&gt;

I have used the Goliath mini gun as an example.

Multiple passengers have the similar properties e.g. the Leviathan

&lt;uscript&gt;
    DriverWeapons(0)=(WeaponClass=class'OnslaughtFull.ONSMASRocketPack',WeaponBone=RocketPackAttach);
    DriverWeapons(1)=(WeaponClass=class'OnslaughtFull.ONSMASCannon',WeaponBone=MainGunPostBase);
	PassengerWeapons(0)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=RightFrontGunAttach);
	PassengerWeapons(1)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=LeftFrontGunAttach);
	PassengerWeapons(2)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=RightRearGunAttach);
	PassengerWeapons(3)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=LeftRearGunAttach);
&lt;/uscript&gt;

Note that passenger weapons classes are a subclass of WeaponPawn whereas the main weapon is subclass of Weapon.

The driver's alt fire is different from vehicle to vehicle.  The manta crushes, the goliath zooms, the leviathan deploys.  Maybe the raptor is the place to start if you want the driver to be able to fire multiple weapons.  You are looking for something like:

&lt;uscript&gt;function AltFire&lt;/uscript&gt;

And again just copy the bits you need

* Don't forget the name of your .uc must match the classname of your modified vehicle.  NEVER EDIT THE ORIGINAL FILES or you will break network play.

==Compiling the scripts==

#Open UMake
#Put in C:\UT2004\(your folder name)
#Click 'compile'
#It will go through a list of packages
#If it fails, go up the list (in details) and find the bits in red (if you can't find any then it has probably compiled OK [please tell me if I'm wrong]) try to find the problem in the code (the red text may give a hint) and try to compile again - if the problem reoccurs try rewriting the code all over - you can also try the Atari forums (programming section) and PM me if you are really desperate (blip2)
#Once you're compiled go into UEd and in the actor browser open the .u file in the system directory with your modified vehicle's name in it you should then be able to get the vehicle by placing an ONSFactory (it doesn't matter which one [I used ONSArtilleryFactory completely at random] and changed the SVehicleFactory &gt;&gt; VehicleClass property to your vehicle (it should show up in the list if you did everything properly)

==Extending the changes==

Often just changing the basic weapon is not enough i.e. you want to change the power/speed etc. of the weapon so...

You do basically the same thing as you did with the first script. What you need to look for is in your first script (see above) for something that looks like the extention of the weapon, this will be found in the default properties under something like projectileclass etc.

You then find the script file for this (referred to as [rta] old file) and similar to above you change the file name and the internal class name at the top, save it ([rta]new file) and go back to your first script(the one above). Then change the place where you found the file name to your new file (don't forget to put the rootfolderofyourmod.thenewfilename in correctly), also make sure that all of the references of the old file are replaced with you new file. Wow it's complicated when you try to explain it (this probably means its hard to understand).

Again you either have the knack or you don't in which case I suggest getting someone to do it for you (I wish you luck :-D)

&amp;ndash;Turrets (ToDo)&amp;ndash;

==See also==
* [[Legacy:Vehicle Weapon Changer Gun|Vehicle Weapon Changer Gun]]

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Vehicles|Vehicles]]

==Discussion==

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5372</id>
      <timestamp>2007-01-01T14:24:44Z</timestamp>
      <contributor>
        <ip>C-68-38-175-113.hsd1.pa.comcast.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is tutorial is for UT2004 and UEd 3

I ([[Legacy:Blip2|blip2]]) have noticed how many people often ask who to change the weapons on a vehicle - I myself asked a similar question and after 25 replies managed to get a result - not perfect but OK. But anyhow i have decided to help unclog the forums and write a tutorial.

The going on this may be slow as it is quite hard and there are thousands of possibilities for weapon changes.

===Let's get started===

The only prerequisite for this tutorial is [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]. This tutorial assumes you have [[Legacy:UMake|UMake]] along with a basic [[Legacy:Text Editor|text editor]].

==Copying your vehicle==

First, [[Legacy:Set Up Package Folders|Set Up Package Folders]] for the project. For the purposes of this tutorial I will use the project I am working on, &quot;Shockmanta&quot;: this describes the weapon (shock balls) and the base vehicle (manta) and therefore is suitable. 

e.g:
 c:\UT2004&gt; mkdir MyPackage
 c:\UT2004&gt; mkdir MyPackage\Classes
 c:\UT2004&gt; cd MyPackage\Classes

Note: this is not a tutorial on creating a new vehicle.  We are simply taking a base vehicle and substituting its weapons for others that already exist in the game.  Choose your vehicle and get the class file for it, 

Read [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] for more information

A few points on where to find them
* The .uc files are within classes directories of the root folders
* A cheat sheet is a good place to start as the cheat goes 
 summon.(foldername).(classfile)

e.g.
 summon.onslaught.onshoverbike

...summons a manta

So copy the class file for the vehicle into the new folder

e.g: 
 c:\UT2004\MyPackage\Classes&gt; copy C:\UT2004\Onslaught\Classes\ONSHoverBike.uc .\ShockManta.uc

==Modifying the vehicle==

This is really just a case working it out yourself but i will give you a few guide lines to get you on your way

* Change the file name of the Vehicle you want to modify

eg.

ONSHoverBike.uc to ShockManta.uc

* At the top in the file there is a line that says:

class ONSHoverBike extends ONSHoverCraft

change it to:

class ShockManta extends ONSHoverBike

* You must set the class to the name of the .uc file otherwise it will not compile
* If you are only modifying the weapon it is probably best to extend the original vehicle (ONSHoverBike) but if you are going to do some serious modification you are best subclassing the [[Legacy:Vehicle Class|vehicle class]] and copying the code from a vehicle within it

eg.

class ShockManta extends ONSHoverCraft

Code from ONSHoverBike (which you can then modify)

==Modifying the vehicle weapon==

For weapons it is probably best to start with the ''default properties'' section (near the bottom)

You will find a line that starts with DriverWeapons(0)=

The Weaponclass is the code for the bit that fires (I will go on to this later) and the weaponbone is the bone in the sceletal mesh that the firing bit is attached to (don't change it unless you've make your own vehicle and know the bone names)

You could change it to something like this:

&lt;uscript&gt;DriverWeapons(0)=(WeaponClass=class'OnslaughtBP.ONSShockTankCannon',WeaponBone=PlasmaGunAttachment);&lt;/uscript&gt;

You're best off getting the WeaponClass from another vehicle (open the class and paste it into the new vehicle)

This is the primary weapons control for just about all vehicles (driver) and as you can probably see all I have done is replaced the manta weapon with the same bit in the ONSShocktank .uc file (OnslaughtBP folder if you are interested)

Passenger weapons are similar

&lt;uscript&gt;PassengerWeapons(0)=(WeaponPawnClass=class'ONSTankSecondaryTurretPawn',WeaponBone=MachineGunTurret)&lt;/uscript&gt;

I have used the Goliath mini gun as an example.

Multiple passengers have the similar properties e.g. the Leviathan

&lt;uscript&gt;
    DriverWeapons(0)=(WeaponClass=class'OnslaughtFull.ONSMASRocketPack',WeaponBone=RocketPackAttach);
    DriverWeapons(1)=(WeaponClass=class'OnslaughtFull.ONSMASCannon',WeaponBone=MainGunPostBase);
	PassengerWeapons(0)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=RightFrontGunAttach);
	PassengerWeapons(1)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=LeftFrontGunAttach);
	PassengerWeapons(2)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=RightRearGunAttach);
	PassengerWeapons(3)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=LeftRearGunAttach);
&lt;/uscript&gt;

Note that passenger weapons classes are a subclass of WeaponPawn whereas the main weapon is subclass of Weapon.

The driver's alt fire is different from vehicle to vehicle.  The manta crushes, the goliath zooms, the leviathan deploys.  Maybe the raptor is the place to start if you want the driver to be able to fire multiple weapons.  You are looking for something like:

&lt;uscript&gt;function AltFire&lt;/uscript&gt;

And again just copy the bits you need

* Don't forget the name of your .uc must match the classname of your modified vehicle.  NEVER EDIT THE ORIGINAL FILES or you will break network play.

==Compiling the scripts==

#Open UMake
#Put in C:\UT2004\(your folder name)
#Click 'compile'
#It will go through a list of packages
#If it fails, go up the list (in details) and find the bits in red (if you can't find any then it has probably compiled OK [please tell me if I'm wrong]) try to find the problem in the code (the red text may give a hint) and try to compile again - if the problem reoccurs try rewriting the code all over - you can also try the Atari forums (programming section) and PM me if you are really desperate (blip2)
#Once you're compiled go into UEd and in the actor browser open the .u file in the system directory with your modified vehicle's name in it you should then be able to get the vehicle by placing an ONSFactory (it doesn't matter which one [I used ONSArtilleryFactory completely at random] and changed the SVehicleFactory &gt;&gt; VehicleClass property to your vehicle (it should show up in the list if you did everything properly)

==Extending the changes==

Often just changing the basic weapon is not enough i.e. you want to change the power/speed etc. of the weapon so...

You do basically the same thing as you did with the first script. What you need to look for is in your first script (see above) for something that looks like the extention of the weapon, this will be found in the default properties under something like projectileclass etc.

You then find the script file for this (referred to as [rta] old file) and similar to above you change the file name and the internal class name at the top, save it ([rta]new file) and go back to your first script(the one above). Then change the place where you found the file name to your new file (don't forget to put the rootfolderofyourmod.thenewfilename in correctly), also make sure that all of the references of the old file are replaced with you new file. Wow it's complicated when you try to explain it (this probably means its hard to understand).

Again you either have the knack or you don't in which case I suggest getting someone to do it for you (I wish you luck :-D)

&amp;ndash;Turrets (working on this one)&amp;ndash;

P.S. Thanks to everyone whose helping :-)

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Vehicles|Vehicles]]

==Discussion==

===If anyone wants some examples of how to do vehicle related moding please suggest below.===

'''LionsPhil:''' Wouldn't subclassing the vehicle be a much better approach? I've now tested it, and you can do it with a very minimalist class &amp;ndash; here's a trivial one which defines a Scorpion with a Goliath's main gun (!):

&lt;uscript&gt;
class ONSRVArmouredCar extends ONSRV;
defaultproperties {
  DriverWeapons(0)=(WeaponClass=class'Onslaught.ONSHoverTankCannon',WeaponBone=ChainGunAttachment);
}
&lt;/uscript&gt;

Not only is this less work, it's the Right Thing from an OO perspective, and will continue to track any changes (bugfixes!) or additions Epic make to ONSRV.

'''Blip2:''' I agree, for small changes but bigger changes (and ones where you take out code) you would need to create a completely new vehicle - I will build it in later

'''Swifty:''' The above code didn't work when I tried it. Having been unable to summon it ingame, I tried placing it straight into a map in UnrealEd. It appeared fine in all views of UnrealEd, yet when I ran the map, it simply wasn't there. No collision, no shadow, no nothing. Any ideas why? Pretty sure I haven't mistyped the code or anythign dumb like that :P

'''Blip2:''' what were you typing to try to summon it? and how would you just place it - its code and is not placeable? or did you write an onsfactory for it too?

'''AlexKotsch:''' I'm new to the Wiki and Programming, but I still have a suggestion. You can make any primary vehicle weapon into a secondary (pawn), to do this, make a new file (eg. ONSHoverTankCannonPawn) copy this code and replace HoverTankCannon with the weapon name of your choice, and change the strings if you want.

&lt;uscript&gt;
//-----------------------------------------------------------
class ONSHoverTankCannonPawn extends ONSWeaponPawn;

defaultproperties
{
     GunClass=Class'MyPackage.ONSHoverTankCannon'
     CameraBone=&quot;TankTurret&quot;
     bDrawDriverInTP=False
     ExitPositions(0)=(Y=-365.000000,Z=200.000000)
     ExitPositions(1)=(Y=365.000000,Z=200.000000)
     ExitPositions(2)=(Y=-365.000000,Z=-100.000000)
     ExitPositions(3)=(Y=365.000000,Z=-100.000000)
     EntryPosition=(Z=-150.000000)
     EntryRadius=130.000000
     FPCamViewOffset=(X=5.000000,Z=35.000000)
     TPCamDistance=100.000000
     TPCamLookat=(X=0.000000,Z=110.000000)
     DriverDamageMult=0.100000
     VehiclePositionString=&quot;in a Tank Turret&quot;
     VehicleNameString=&quot;Tank Turret&quot;
}
&lt;/uscript&gt;

Also make the camera bone the same as the GunnerAttachmentBone in the ONSWeapon code (eg. ONSHoverTankCannon), which you have to add. The bone is the same as the YawBone and goes under default properties.

&lt;uscript&gt;
defaultproperties
{
     YawBone=&quot;TankTurret&quot;
     PitchBone=&quot;TankBarrel&quot;
     PitchUpLimit=6000
     PitchDownLimit=61500
     WeaponFireAttachmentBone=&quot;TankBarrel&quot;
     GunnerAttachmentBone=&quot;TankTurret&quot;          //make this one.
     WeaponFireOffset=200.000000
&lt;/uscript&gt;

Dont forget to save the edited ONSWeapon in a different file (eg. MyPackage/Classes).

It worked for me, I made a Hummer H5 Mad Max Version, it has a Goliath Cannon Turret on the top of it.

----

sample Submitted by {DDG}Vaptor vehicle weapon changer gun 

Note: this works and its from what im working on

&lt;uscript&gt;
//=============================================================================
// new allows to change the vehicle weapons
//=============================================================================
class mechGun extends xwoeweapone;

//Returns a sentinel belonging to the player, or a sentinel belonging to the same team if !bOnlyOwn, or any Sentinel if bAny.
var bot BodgedBot;
var int NextCheckTime, UpgradeCheckTime;
var vector MarkerLocations[5];
var int currentdefmode;
var bool bAllowUpgrades, bAllowTeamUpgrades,bdeploycars;
var array&lt; class&lt;onsWeapon&gt; &gt; driverUpgradeClasses;
var array&lt; class&lt;onsWeaponPawn&gt; &gt; PassengerUpgradeClasses;
var array&lt;string&gt; Descriptions;
var() xEmitter  chargeEmitter;
var Mutsentaddon myMut;
var name upgradebone;
var float upgraderange, repammo, nextgain;
var class&lt;onsvehicle&gt; upgradeVehicle;
var onsvehicle oldvehicle;
var() array&lt; class&lt;onsvehicle&gt; &gt; configvehiclelist;
var onsvehicle myVehicle;
//==============dynamic list for geting all weapons loaded on server======
var array&lt; class&lt;onsweapon&gt; &gt; vehadded;
var config array&lt; class&lt;onsweapon&gt; &gt; ConfigweaponList;
var array&lt; class&lt;onsweaponpawn&gt; &gt; weaponpawnList;
var array&lt; class&lt;onsweaponpawn&gt; &gt; ConfigweaponpawnList;
	Struct AmmoDivider
	{
	var() int FHP;
	var() int FSPd;
	Var() int fmass;
	};
Var Ammodivider mydiv;

replication
{
    reliable if (bNetOwner &amp;&amp; bNetDirty &amp;&amp; Role == ROLE_Authority)
	mydiv;

	reliable if(Role == ROLE_Authority)
		oldvehicle,AddToUpgradeList,bAllowUpgrades,bAllowTeamUpgrades,vehadded,configvehiclelist,bdeploycars;

	unreliable if(Role == ROLE_Authority)
		MarkerLocations,repammo,nextgain;

	reliable if(Role &lt; ROLE_Authority)
		killscan, DoUpgrade, driverUpgradeClasses, myVehicle, Checkupgrades,deploycar;

}

simulated function PreBeginPlay()
{
        SetTimer(1.0,true);

	Super.PreBeginPlay();

	NextCheckTime = Level.TimeSeconds + 1;
	UpgradeCheckTime = NextCheckTime;
}
function PostBeginPlay()
{
local int ic;

	Super.PostBeginPlay();

	if (myMut == None)
	{
	mymut=class'mutSentaddon'.static.GetsentMutator(Level.Game);
	}

	if (myMut != None)
	{
		if(mymut.vehAdded.length &gt; vehadded.length)
		{
        		if(vehadded.length &lt; mymut.vehAdded.length)
         		{ // reinforce data from client side
        		 vehadded.insert(0,mymut.vehadded.length);
        			}
				for(ic = 0; ic &lt; mymut.vehAdded.Length; ic++)
				{
            		vehadded[ic]=mymut.Vehadded[ic];
            		}

        	}
        	else
        	{
        	log(&quot;mutator preset parts&quot;);
        	}

		if(mymut.bdeploycars || bdeploycars)
		{
			bdeploycars=true;

			if(configvehiclelist.length &lt; mymut.configvehiclelist.length)
         	{ // reinforce data from client side
        		 configvehiclelist.insert(0,mymut.configvehiclelist.length);

				for(ic = 0; ic &lt; mymut.configvehiclelist.Length; ic++)
				{
            			configvehiclelist[ic]=mymut.configvehiclelist[ic];

				}

			}

		}
	}
	else
	{
    log(&quot;vehicle gun error no parts&quot;);
	}

	if((Role &lt; ROLE_Authority) &amp;&amp; (vehAdded.length &gt; 0))
		LoadUpgrades();

}

function Checkupgrades()
{
local int ic;

if (myMut == None)
{
mymut=class'mutSentaddon'.static.GetsentMutator(Level.Game);
}

	if (myMut != None)
	{
	 if(mymut.vehAdded.length &gt; vehadded.length)
	 {
        	 if(vehadded.length &lt; mymut.vehAdded.length)
         	 { // reinforce data from client side
          	 vehadded.insert(0,mymut.vehadded.length);
        	 }
		for(ic = 0; ic &lt; mymut.vehAdded.Length; ic++)
		{
        	vehadded[ic]=mymut.Vehadded[ic];
        	}
	 }
	if(mymut.bdeploycars || bdeploycars)
	{
	bdeploycars=true;
	}
			if(configvehiclelist.length &lt; mymut.configvehiclelist.length)
         		{ // reinforce data from client side
        		 configvehiclelist.insert(0,mymut.configvehiclelist.length);

				for(ic = 0; ic &lt; mymut.configvehiclelist.Length; ic++)
				{
            			configvehiclelist[ic]=mymut.configvehiclelist[ic];
				}
			}

	else
	{
   	log(&quot;vehicle gun error no parts&quot;);
	}

 }
}
function GiveTo(Pawn Other, optional Pickup Pickup)
{
	Super.GiveTo(Other, Pickup);

	if(Role == ROLE_Authority &amp;&amp; Instigator != None &amp;&amp; Instigator.Controller.IsA('Bot'))
	{
		NextCheckTime = Level.TimeSeconds + 5; //Never deploy right away.
		BodgedBot = Bot(Instigator.Controller);
	}
}
simulated function onsvehicle SentinelInRange(float Range, bool bOnlyOwn, optional bool bAny)
{
	local Vector HitLocation, HitNormal;
	local Actor A;
	local Vector X, Y, Z;

	local bool bSameTeam;

	GetViewAxes(X, Y, Z);
	foreach TraceActors(class'Actor', A, HitLocation, HitNormal, Instigator.Location + X * Range, Instigator.Location)
	{
		if(A == None)
			continue;

		if(A.bWorldGeometry)
			return None;

		if(A.IsA('onsvehicle'))
		{
			return onsvehicle(A);
		}
	}

	return None;
}

simulated function bool HasAmmo()
{
	return true;
}
//Make bots really want this.
//Bots should never try to wield the weapon.
function float GetAIRating()
{
	return 0;
}
// by vaptor we destroy the old car and eject the peeps so they don't die
// then we register a new old vehicle with the server
//Simulated Function RegisterOwner(Onsvehicle newvehicle)
//{
//}
//================ ok this is the hard part =========== works 100%
simulated function setupdriverweapon(onsvehicle upgradervehicle, class&lt;onsweapon&gt; newWeapon ,int i)
{
local name xb; // bone
local bool bkilled;

bkilled=false;

	if(upgradervehicle.Weapons[i] == none &amp;&amp; !bkilled)
	{
	Instigator.ReceiveLocalizedMessage(class'HELMessage', 8);
	return; // prevents it from applying to non existant slots
	}
	if(upgradervehicle.Weapons[i] != none &amp;&amp; !bkilled)
	{
	upgradervehicle.Weapons[i].destroy();
	bkilled=true;
	}
	// means there was a weapon that we destroyed
	if(bkilled)
	{
	XB=upgradervehicle.Default.DriverWeapons[i].WeaponBone;
            // Spawn the new Weapon
            upgradervehicle.Weapons[i] = upgradervehicle.spawn(newweapon, upgradervehicle,, upgradervehicle.Location, rot(0,0,0));
            upgradervehicle.AttachToBone(upgradervehicle.Weapons[i], XB);
        if (!upgradervehicle.Weapons[i].bAimable)
                upgradervehicle.Weapons[i].CurrentAim = rot(0,32768,0);
        }

    	if (upgradervehicle.ActiveWeapon &lt; upgradervehicle.Weapons.length)
    	{
            upgradervehicle.PitchUpLimit = upgradervehicle.Weapons[upgradervehicle.ActiveWeapon].PitchUpLimit;
            upgradervehicle.PitchDownLimit = upgradervehicle.Weapons[upgradervehicle.ActiveWeapon].PitchDownLimit;
    	}
	upgradervehicle.Weapons[i].team=Instigator.getTeamnum();
	upgradervehicle.SetTeamNum(Instigator.getTeamnum());
	upgradervehicle.TeamChanged();
}
//============== ok driver weapon setup is ready now this part gets messy ========
simulated function setuppasweapon(onsvehicle upgradervehicle, class&lt;onsweapon&gt; newpaswep, int i)
{
local bool bkilled;

bkilled=false;

	if(upgradervehicle.WeaponPawns[i] == none &amp;&amp; !bkilled)
	{
	Instigator.ReceiveLocalizedMessage(class'HELMessage', 8);
	return; // prevents it from applying to non existant slots
	}
	if(upgradervehicle.WeaponPawns[i].gun != none &amp;&amp; !bkilled)
	{
	upgradervehicle.WeaponPawns[i].gun.destroy();
	bkilled=true;
	}
        // Spawn the Passenger Weapons
            // Spawn WeaponPawn
	if(bkilled)
	{
            upgradervehicle.WeaponPawns[i].gun = upgradervehicle.WeaponPawns[i].spawn(newpaswep,upgradervehicle.WeaponPawns[i],,upgradervehicle.WeaponPawns[i].Location);
            upgradervehicle.WeaponPawns[i].AttachToVehicle(upgradervehicle,upgradervehicle.PassengerWeapons[i].WeaponBone);
            upgradervehicle.WeaponPawns[i].ObjectiveGetOutDist = upgradervehicle.ObjectiveGetOutDist;
	}
	upgradervehicle.WeaponPawns[i].gun.team=Instigator.getTeamnum();
	upgradervehicle.SetTeamNum(Instigator.getTeamnum());
	upgradervehicle.TeamChanged();
}
//Change ammo icon do indicate which type of Sentinel may be spawned.
simulated event WeaponTick(float dt)
{
	local int ViewPitch;
	local class&lt;Ammunition&gt; A;

	ViewPitch = Instigator.GetViewRotation().Pitch;

	if(level.timeseconds &gt; nextgain)
	{
	if(repammo &lt; 4)
		RepAmmo+=1;

	nextGain=level.timeseconds+2;
	}

	A = GetAmmoClass(0);

	if(A != None)
	{
		if(ViewPitch &gt; 1124 &amp;&amp; ViewPitch &lt; 31744)
		{
			A.Default.IconMaterial=Finalblend'ammoslothel';
			A.Default.IconCoords.X1 = 32;
			A.Default.IconCoords.Y1 = 32;
			A.Default.IconCoords.X2 = 96;
			A.Default.IconCoords.Y2 = 96;
		}
                else
		{
			A.Default.IconMaterial=FinalBlend'ammoslotsentNO';
			A.Default.IconCoords.X1 = 0;
			A.Default.IconCoords.y1 = 0;
			A.Default.IconCoords.x2 = 64;
			A.Default.IconCoords.y2 = 64;
		}
	}

}
simulated function PostnetBeginPlay()
{
	Super.PostBeginPlay();

	if(Role == ROLE_Authority)
		LoadUpgrades();
}
simulated Function Loadupgrades()
{
local int ic;
          if(vehadded.length &gt; driverUpgradeClasses.length)
         { // reinforce data from client side
         driverUpgradeClasses.insert(0,vehadded.length);
			for(ic = 0; ic &lt; vehAdded.Length; ic++)
			{
            		AddToUpgradeList(ic,vehadded[ic]);
            		}
        }
}
simulated function DoUpgrade( int i, optional class&lt;onsweapon&gt; driveUpgrade, optional class&lt;onsweapon&gt; pasUpgrade)
{
local onsvehicle SentinelToUpgrade;
	if(!bAllowUpgrades)
	{
		warn(&quot;Tried to add an upgrade but they are disabled.&quot;);
		return;
	}
	if(DriveUpgrade == None &amp;&amp; pasupgrade == none)
	{
		warn(&quot;Tried to add an upgrade that doesn't exist.&quot;);
		return;
	}
	SentinelToUpgrade = SentinelInRange(class'mechFire'.Default.UpgradeRange, true);
	if(SentinelToUpgrade == None)
	{
		Instigator.ReceiveLocalizedMessage(class'HELMessage', 9);
		return;
	}
	if(AmmoAmount(0) &lt; 20)
	{
		Instigator.ReceiveLocalizedMessage(class'HELMessage', 8);
		return;
	}
	if(driveupgrade == class'onslinkableweapon' || pasupgrade == class'onslinkableweapon' )
	{
	return;
	}

	if(driveupgrade != none)
	{
		if(AmmoAmount(0) &gt; 20)
		{
		setupdriverweapon(SentinelToUpgrade,driveUpgrade,I);
		ConsumeAmmo(0,20);
		}
	}
	else
	{
	    if(AmmoAmount(0) &gt; 20)
		{
		setuppasweapon(SentinelToUpgrade,pasUpgrade,I);
		ConsumeAmmo(0,20);
		}
	}
}
function Tick(float DeltaTime)
{
	local name BotState, BotOrders;

	if(Level.TimeSeconds &gt;= UpgradeCheckTime)
	{
		UpgradeCheckTime = Level.TimeSeconds + 1;
		mechFire(FireMode[0]).DoStuffe();
	}
	if(BodgedBot == None || Level.Game.bGameEnded)
		return;
	if(Level.TimeSeconds &gt;= NextCheckTime &amp;&amp; VSize(Instigator.Velocity) &lt; 1)
	{
	NextCheckTime = Level.TimeSeconds + 1;
	}
}
simulated Function DeployCar(class&lt;onsvehicle&gt; Type, int RequiredAmmo )
{
local int AmmoConsume;
local int zx;
local Vector X, Y, Z;
local Vector DeployLocation;

if ( !Level.Game.bAllowVehicles)
{
Level.Game.bAllowVehicles=true; 
}

GetViewAxes(X, Y, Z);
if(requiredammo &gt; 200)
{
requiredammo=150;
}
if(killscan(type.default.CollisionRadius) &amp;&amp; AmmoAmount(0) &gt;= RequiredAmmo)
{

 IF(oldVehicle != none)
 {
	if(oldvehicle.Driver != none)
	{
	oldVehicle.EjectDriver();

		if(oldvehicle.weaponpawns.length &gt; 0)
		{
			for (zx = 0; zx &lt; oldvehicle.WeaponPawns.length; zx++)
			{
			oldvehicle.WeaponPawns[zx].EjectDriver();
			oldvehicle.WeaponPawns[zx].Died(None, class'DamageType', oldvehicle.Location);
			}
		oldvehicle.WeaponPawns.length = 0;
		}

	oldvehicle.Died(None, class'DamageType', oldvehicle.Location);
	oldVehicle=none;
	}

 }

 if(oldvehicle == none)//seems to work but won't spawn
 {
 DeployLocation = Instigator.Location + (X * (20.0 + type.default.CollisionRadius)) + (z * type.default.collisionheight);
 OldVehicle= Spawn(type,,, DeployLocation, rot(0, -16384, 0));
 ConsumeAmmo(0,RequiredAmmo);
 }
}
}

simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos)
{
	local PlayerController PC;

	PC = PlayerController(Instigator.Controller);

	if(PC == None)
		return;

	HudBase(PC.myHUD).TargetMaterial = finalblend'Targetcores';

	HudBase(PC.myHUD).TargetMaterial = HudBase(PC.myHUD).Default.TargetMaterial;
}
//=============================================================================
// Utility functions:
//=============================================================================
//Upgrades are replicated to clients here.
simulated function AddToUpgradeList(int i, class&lt;onsweapon&gt; NextDriverClass)
{
	if(nextDriverClass != none)
		driverUpgradeClasses[i] = NextDriverClass; // found a way to make it only need this data!
}
static function int GetCost(class&lt;onsvehicle&gt; vehiclewanted,int total)
{
local int totalother;
local float divspd;

// use percentage logic crud this may be too much math
if(vehiclewanted != none)
{
totalother=vehiclewanted.default.GroundSpeed + vehiclewanted.default.airSpeed + vehiclewanted.default.mass + vehiclewanted.default.health;
}
divspd=total/200; // use to subtract from other values
//log(total);
return(totalother/divspd);
}
simulated function BringUp(optional Weapon PrevWeapon)
{
    Super.BringUp(PrevWeapon);
}
simulated function bool PutDown()
{
    if ( Super.PutDown() )
    {
		GotoState('');
		return true;
	}
	return false;
}

function bool killscan(int radu) // new code for telefragchecking by vaptor
{
local vector checklocation,scy;
local Vector X, Y, Z, HitLocation, HitNormal;
local actor victimizedactor;

	GetViewAxes(X, Y, Z);

	checkLocation = Instigator.Location + X * 100;
	scy.x=radu;
	scy.y=radu;
	scy.z=16;
	Victimizedactor = Trace(HitLocation, HitNormal, checkLocation, Instigator.Location , true, scy);

	 // set it false first

	if(victimizedActor != none)
	{
	 if(victimizedActor.isa('Pawn'))
	 {
		if(pawn(victimizedActor) != none)
		{
			if(pawn(victimizedActor).Controller.SameTeamAs(Instigator.Controller) ) // confirmed! stop them now!
			{
				return false;
			}
			else
			{
				return true;
			}
		}
		else
		{
			return true;
		}

	 }

	}
	return true;
}
defaultproperties
{
     bAllowUpgrades=True
     upgraderange=1200.000000
     FireModeClass(0)=Class'sentsv12.mechFire'
     FireModeClass(1)=Class'sentsv12.mechlaunchFire'
     IdleAnim=&quot;Idle&quot;
     SelectAnim=&quot;Select&quot;
     SelectSound=Sound'WeaponSounds.Misc.shieldgun_change'
     SelectForce=&quot;ShieldGun_change&quot;
     AIRating=1.500000
     CurrentRating=1.500000
     Description=&quot;NEW weapon technology useing thinking machines to provide general support for soldiers&quot;
     EffectOffset=(X=70.000000,Y=10.000000)
     SmallViewOffset=(X=23.000000,Y=6.000000,Z=-6.000000)
     CenteredOffsetY=-5.000000
     CenteredRoll=5000
     CenteredYaw=-300
     CustomCrosshair=31
     CustomCrossHairColor=(G=0,R=0)
     CustomCrossHairTextureName=&quot;AS_FX_TX.Icons.OBJ_Destroy_Tex&quot;
     InventoryGroup=8
     GroupOffset=158
     PlayerViewOffset=(X=11.000000)
     BobDamping=1.575000
     AttachmentClass=Class'sentsv12.mechAttach'
     IconMaterial=FinalBlend'AS_FX_TX.Icons.OBJ_HellBender_FB'
     IconCoords=(X2=64,Y2=64)
     ItemName=&quot;VehicleMechanic&quot;
     Mesh=SkeletalMesh'Weapons.BallLauncher_1st'
     DrawScale=0.400000
     Skins(0)=Combiner'sentsv12.Beams.ANGLETRAILxx'
     Skins(1)=FinalBlend'sentsv12.Beams.casedvortex'
     Skins(2)=Shader'sentsv12.Beams.coilshader'
}

&lt;/uscript&gt;
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5373</id>
      <timestamp>2007-01-22T18:40:44Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is tutorial is for UT2004 and UEd3

I ([[Legacy:Blip2|blip2]]) have noticed how many people often ask who to change the weapons on a vehicle - I myself asked a similar question and after 25 replies managed to get a result - not perfect but OK. But anyhow i have decided to help unclog the forums and write a tutorial.

The going on this may be slow as it is quite hard and there are thousands of possibilities for weapon changes.

===Let's get started===

The only prerequisite for this tutorial is [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]]. This tutorial assumes you have [[Legacy:UMake|UMake]] along with a basic [[Legacy:Text Editor|text editor]].

==Copying your vehicle==

First, [[Legacy:Set Up Package Folders|Set Up Package Folders]] for the project. For the purposes of this tutorial I will use the project I am working on, &quot;Shockmanta&quot;: this describes the weapon (shock balls) and the base vehicle (manta) and therefore is suitable. 

e.g:
 c:\UT2004&gt; mkdir MyPackage
 c:\UT2004&gt; mkdir MyPackage\Classes
 c:\UT2004&gt; cd MyPackage\Classes

Note: this is not a tutorial on creating a new vehicle.  We are simply taking a base vehicle and substituting its weapons for others that already exist in the game.  Choose your vehicle and get the class file for it, 

Read [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] for more information

A few points on where to find them
* The .uc files are within classes directories of the root folders
* A cheat sheet is a good place to start as the cheat goes 
 summon.(foldername).(classfile)

e.g.
 summon.onslaught.onshoverbike

...summons a manta

So copy the class file for the vehicle into the new folder

e.g: 
 c:\UT2004\MyPackage\Classes&gt; copy C:\UT2004\Onslaught\Classes\ONSHoverBike.uc .\ShockManta.uc

==Modifying the vehicle==

This is really just a case working it out yourself but i will give you a few guide lines to get you on your way

* Change the file name of the Vehicle you want to modify

eg.

ONSHoverBike.uc to ShockManta.uc

* At the top in the file there is a line that says:

class ONSHoverBike extends ONSHoverCraft

change it to:

class ShockManta extends ONSHoverBike

* You must set the class to the name of the .uc file otherwise it will not compile
* If you are only modifying the weapon it is probably best to extend the original vehicle (ONSHoverBike) but if you are going to do some serious modification you are best subclassing the [[Legacy:Vehicle Class|vehicle class]] and copying the code from a vehicle within it

eg.

class ShockManta extends ONSHoverCraft

Code from ONSHoverBike (which you can then modify)

==Modifying the vehicle weapon==

For weapons it is probably best to start with the ''default properties'' section (near the bottom)

You will find a line that starts with DriverWeapons(0)=

The Weaponclass is the code for the bit that fires (I will go on to this later) and the weaponbone is the bone in the sceletal mesh that the firing bit is attached to (don't change it unless you've make your own vehicle and know the bone names)

You could change it to something like this:

&lt;uscript&gt;DriverWeapons(0)=(WeaponClass=class'OnslaughtBP.ONSShockTankCannon',WeaponBone=PlasmaGunAttachment);&lt;/uscript&gt;

You're best off getting the WeaponClass from another vehicle (open the class and paste it into the new vehicle)

This is the primary weapons control for just about all vehicles (driver) and as you can probably see all I have done is replaced the manta weapon with the same bit in the ONSShocktank .uc file (OnslaughtBP folder if you are interested)

Passenger weapons are similar

&lt;uscript&gt;PassengerWeapons(0)=(WeaponPawnClass=class'ONSTankSecondaryTurretPawn',WeaponBone=MachineGunTurret)&lt;/uscript&gt;

I have used the Goliath mini gun as an example.

Multiple passengers have the similar properties e.g. the Leviathan

&lt;uscript&gt;
    DriverWeapons(0)=(WeaponClass=class'OnslaughtFull.ONSMASRocketPack',WeaponBone=RocketPackAttach);
    DriverWeapons(1)=(WeaponClass=class'OnslaughtFull.ONSMASCannon',WeaponBone=MainGunPostBase);
	PassengerWeapons(0)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=RightFrontGunAttach);
	PassengerWeapons(1)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=LeftFrontGunAttach);
	PassengerWeapons(2)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=RightRearGunAttach);
	PassengerWeapons(3)=(WeaponPawnClass=class'OnslaughtFull.ONSMASSideGunPawn',WeaponBone=LeftRearGunAttach);
&lt;/uscript&gt;

Note that passenger weapons classes are a subclass of WeaponPawn whereas the main weapon is subclass of Weapon.

The driver's alt fire is different from vehicle to vehicle.  The manta crushes, the goliath zooms, the leviathan deploys.  Maybe the raptor is the place to start if you want the driver to be able to fire multiple weapons.  You are looking for something like:

&lt;uscript&gt;function AltFire&lt;/uscript&gt;

And again just copy the bits you need

* Don't forget the name of your .uc must match the classname of your modified vehicle.  NEVER EDIT THE ORIGINAL FILES or you will break network play.

==Compiling the scripts==

#Open UMake
#Put in C:\UT2004\(your folder name)
#Click 'compile'
#It will go through a list of packages
#If it fails, go up the list (in details) and find the bits in red (if you can't find any then it has probably compiled OK [please tell me if I'm wrong]) try to find the problem in the code (the red text may give a hint) and try to compile again - if the problem reoccurs try rewriting the code all over - you can also try the Atari forums (programming section) and PM me if you are really desperate (blip2)
#Once you're compiled go into UEd and in the actor browser open the .u file in the system directory with your modified vehicle's name in it you should then be able to get the vehicle by placing an ONSFactory (it doesn't matter which one [I used ONSArtilleryFactory completely at random] and changed the SVehicleFactory &gt;&gt; VehicleClass property to your vehicle (it should show up in the list if you did everything properly)

==Extending the changes==

Often just changing the basic weapon is not enough i.e. you want to change the power/speed etc. of the weapon so...

You do basically the same thing as you did with the first script. What you need to look for is in your first script (see above) for something that looks like the extention of the weapon, this will be found in the default properties under something like projectileclass etc.

You then find the script file for this (referred to as [rta] old file) and similar to above you change the file name and the internal class name at the top, save it ([rta]new file) and go back to your first script(the one above). Then change the place where you found the file name to your new file (don't forget to put the rootfolderofyourmod.thenewfilename in correctly), also make sure that all of the references of the old file are replaced with you new file. Wow it's complicated when you try to explain it (this probably means its hard to understand).

Again you either have the knack or you don't in which case I suggest getting someone to do it for you (I wish you luck :-D)

&amp;ndash;Turrets (ToDo)&amp;ndash;

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]
* [[Legacy:Vehicles|Vehicles]]

==Discussion==

See [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]]

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modifying Vehicle Weapons/Discussion</title>
    <id>2241</id>
    <revision>
      <id>5414</id>
      <timestamp>2007-01-22T18:42:39Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''LionsPhil:''' Wouldn't subclassing the vehicle be a much better approach? I've now tested it, and you can do it with a very minimalist class &amp;ndash; here's a trivial one which defines a Scorpion with a Goliath's main gun (!):

&lt;uscript&gt;
class ONSRVArmouredCar extends ONSRV;
defaultproperties {
  DriverWeapons(0)=(WeaponClass=class'Onslaught.ONSHoverTankCannon',WeaponBone=ChainGunAttachment);
}
&lt;/uscript&gt;

Not only is this less work, it's the Right Thing from an OO perspective, and will continue to track any changes (bugfixes!) or additions Epic make to ONSRV.

'''Blip2:''' I agree, for small changes but bigger changes (and ones where you take out code) you would need to create a completely new vehicle - I will build it in later

'''Swifty:''' The above code didn't work when I tried it. Having been unable to summon it ingame, I tried placing it straight into a map in UnrealEd. It appeared fine in all views of UnrealEd, yet when I ran the map, it simply wasn't there. No collision, no shadow, no nothing. Any ideas why? Pretty sure I haven't mistyped the code or anythign dumb like that :P

'''Blip2:''' what were you typing to try to summon it? and how would you just place it - its code and is not placeable? or did you write an onsfactory for it too?

'''AlexKotsch:''' I'm new to the Wiki and Programming, but I still have a suggestion. You can make any primary vehicle weapon into a secondary (pawn), to do this, make a new file (eg. ONSHoverTankCannonPawn) copy this code and replace HoverTankCannon with the weapon name of your choice, and change the strings if you want.

&lt;uscript&gt;
//-----------------------------------------------------------
class ONSHoverTankCannonPawn extends ONSWeaponPawn;

defaultproperties
{
     GunClass=Class'MyPackage.ONSHoverTankCannon'
     CameraBone=&quot;TankTurret&quot;
     bDrawDriverInTP=False
     ExitPositions(0)=(Y=-365.000000,Z=200.000000)
     ExitPositions(1)=(Y=365.000000,Z=200.000000)
     ExitPositions(2)=(Y=-365.000000,Z=-100.000000)
     ExitPositions(3)=(Y=365.000000,Z=-100.000000)
     EntryPosition=(Z=-150.000000)
     EntryRadius=130.000000
     FPCamViewOffset=(X=5.000000,Z=35.000000)
     TPCamDistance=100.000000
     TPCamLookat=(X=0.000000,Z=110.000000)
     DriverDamageMult=0.100000
     VehiclePositionString=&quot;in a Tank Turret&quot;
     VehicleNameString=&quot;Tank Turret&quot;
}
&lt;/uscript&gt;

Also make the camera bone the same as the GunnerAttachmentBone in the ONSWeapon code (eg. ONSHoverTankCannon), which you have to add. The bone is the same as the YawBone and goes under default properties.

&lt;uscript&gt;
defaultproperties
{
     YawBone=&quot;TankTurret&quot;
     PitchBone=&quot;TankBarrel&quot;
     PitchUpLimit=6000
     PitchDownLimit=61500
     WeaponFireAttachmentBone=&quot;TankBarrel&quot;
     GunnerAttachmentBone=&quot;TankTurret&quot;          //make this one.
     WeaponFireOffset=200.000000
&lt;/uscript&gt;

Dont forget to save the edited ONSWeapon in a different file (eg. MyPackage/Classes).

It worked for me, I made a Hummer H5 Mad Max Version, it has a Goliath Cannon Turret on the top of it.</text>
    </revision>
    <revision>
      <id>5415</id>
      <timestamp>2007-01-22T18:39:34Z</timestamp>
      <contributor>
        <ip>Blip2</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''LionsPhil:''' Wouldn't subclassing the vehicle be a much better approach? I've now tested it, and you can do it with a very minimalist class &amp;ndash; here's a trivial one which defines a Scorpion with a Goliath's main gun (!):

&lt;uscript&gt;
class ONSRVArmouredCar extends ONSRV;
defaultproperties {
  DriverWeapons(0)=(WeaponClass=class'Onslaught.ONSHoverTankCannon',WeaponBone=ChainGunAttachment);
}
&lt;/uscript&gt;

Not only is this less work, it's the Right Thing from an OO perspective, and will continue to track any changes (bugfixes!) or additions Epic make to ONSRV.

'''Blip2:''' I agree, for small changes but bigger changes (and ones where you take out code) you would need to create a completely new vehicle - I will build it in later

'''Swifty:''' The above code didn't work when I tried it. Having been unable to summon it ingame, I tried placing it straight into a map in UnrealEd. It appeared fine in all views of UnrealEd, yet when I ran the map, it simply wasn't there. No collision, no shadow, no nothing. Any ideas why? Pretty sure I haven't mistyped the code or anythign dumb like that :P

'''Blip2:''' what were you typing to try to summon it? and how would you just place it - its code and is not placeable? or did you write an onsfactory for it too?

'''AlexKotsch:''' I'm new to the Wiki and Programming, but I still have a suggestion. You can make any primary vehicle weapon into a secondary (pawn), to do this, make a new file (eg. ONSHoverTankCannonPawn) copy this code and replace HoverTankCannon with the weapon name of your choice, and change the strings if you want.

&lt;uscript&gt;
//-----------------------------------------------------------
class ONSHoverTankCannonPawn extends ONSWeaponPawn;

defaultproperties
{
     GunClass=Class'MyPackage.ONSHoverTankCannon'
     CameraBone=&quot;TankTurret&quot;
     bDrawDriverInTP=False
     ExitPositions(0)=(Y=-365.000000,Z=200.000000)
     ExitPositions(1)=(Y=365.000000,Z=200.000000)
     ExitPositions(2)=(Y=-365.000000,Z=-100.000000)
     ExitPositions(3)=(Y=365.000000,Z=-100.000000)
     EntryPosition=(Z=-150.000000)
     EntryRadius=130.000000
     FPCamViewOffset=(X=5.000000,Z=35.000000)
     TPCamDistance=100.000000
     TPCamLookat=(X=0.000000,Z=110.000000)
     DriverDamageMult=0.100000
     VehiclePositionString=&quot;in a Tank Turret&quot;
     VehicleNameString=&quot;Tank Turret&quot;
}
&lt;/uscript&gt;

Also make the camera bone the same as the GunnerAttachmentBone in the ONSWeapon code (eg. ONSHoverTankCannon), which you have to add. The bone is the same as the YawBone and goes under default properties.

&lt;uscript&gt;
defaultproperties
{
     YawBone=&quot;TankTurret&quot;
     PitchBone=&quot;TankBarrel&quot;
     PitchUpLimit=6000
     PitchDownLimit=61500
     WeaponFireAttachmentBone=&quot;TankBarrel&quot;
     GunnerAttachmentBone=&quot;TankTurret&quot;          //make this one.
     WeaponFireOffset=200.000000
&lt;/uscript&gt;

Dont forget to save the edited ONSWeapon in a different file (eg. MyPackage/Classes).

It worked for me, I made a Hummer H5 Mad Max Version, it has a Goliath Cannon Turret on the top of it.

----

sample Submitted by {DDG}Vaptor vehicle weapon changer gun 

Note: this works and its from what im working on

&lt;uscript&gt;
//=============================================================================
// new allows to change the vehicle weapons
//=============================================================================
class mechGun extends xwoeweapone;

//Returns a sentinel belonging to the player, or a sentinel belonging to the same team if !bOnlyOwn, or any Sentinel if bAny.
var bot BodgedBot;
var int NextCheckTime, UpgradeCheckTime;
var vector MarkerLocations[5];
var int currentdefmode;
var bool bAllowUpgrades, bAllowTeamUpgrades,bdeploycars;
var array&lt; class&lt;onsWeapon&gt; &gt; driverUpgradeClasses;
var array&lt; class&lt;onsWeaponPawn&gt; &gt; PassengerUpgradeClasses;
var array&lt;string&gt; Descriptions;
var() xEmitter  chargeEmitter;
var Mutsentaddon myMut;
var name upgradebone;
var float upgraderange, repammo, nextgain;
var class&lt;onsvehicle&gt; upgradeVehicle;
var onsvehicle oldvehicle;
var() array&lt; class&lt;onsvehicle&gt; &gt; configvehiclelist;
var onsvehicle myVehicle;
//==============dynamic list for geting all weapons loaded on server======
var array&lt; class&lt;onsweapon&gt; &gt; vehadded;
var config array&lt; class&lt;onsweapon&gt; &gt; ConfigweaponList;
var array&lt; class&lt;onsweaponpawn&gt; &gt; weaponpawnList;
var array&lt; class&lt;onsweaponpawn&gt; &gt; ConfigweaponpawnList;
	Struct AmmoDivider
	{
	var() int FHP;
	var() int FSPd;
	Var() int fmass;
	};
Var Ammodivider mydiv;

replication
{
    reliable if (bNetOwner &amp;&amp; bNetDirty &amp;&amp; Role == ROLE_Authority)
	mydiv;

	reliable if(Role == ROLE_Authority)
		oldvehicle,AddToUpgradeList,bAllowUpgrades,bAllowTeamUpgrades,vehadded,configvehiclelist,bdeploycars;

	unreliable if(Role == ROLE_Authority)
		MarkerLocations,repammo,nextgain;

	reliable if(Role &lt; ROLE_Authority)
		killscan, DoUpgrade, driverUpgradeClasses, myVehicle, Checkupgrades,deploycar;

}

simulated function PreBeginPlay()
{
        SetTimer(1.0,true);

	Super.PreBeginPlay();

	NextCheckTime = Level.TimeSeconds + 1;
	UpgradeCheckTime = NextCheckTime;
}
function PostBeginPlay()
{
local int ic;

	Super.PostBeginPlay();

	if (myMut == None)
	{
	mymut=class'mutSentaddon'.static.GetsentMutator(Level.Game);
	}

	if (myMut != None)
	{
		if(mymut.vehAdded.length &gt; vehadded.length)
		{
        		if(vehadded.length &lt; mymut.vehAdded.length)
         		{ // reinforce data from client side
        		 vehadded.insert(0,mymut.vehadded.length);
        			}
				for(ic = 0; ic &lt; mymut.vehAdded.Length; ic++)
				{
            		vehadded[ic]=mymut.Vehadded[ic];
            		}

        	}
        	else
        	{
        	log(&quot;mutator preset parts&quot;);
        	}

		if(mymut.bdeploycars || bdeploycars)
		{
			bdeploycars=true;

			if(configvehiclelist.length &lt; mymut.configvehiclelist.length)
         	{ // reinforce data from client side
        		 configvehiclelist.insert(0,mymut.configvehiclelist.length);

				for(ic = 0; ic &lt; mymut.configvehiclelist.Length; ic++)
				{
            			configvehiclelist[ic]=mymut.configvehiclelist[ic];

				}

			}

		}
	}
	else
	{
    log(&quot;vehicle gun error no parts&quot;);
	}

	if((Role &lt; ROLE_Authority) &amp;&amp; (vehAdded.length &gt; 0))
		LoadUpgrades();

}

function Checkupgrades()
{
local int ic;

if (myMut == None)
{
mymut=class'mutSentaddon'.static.GetsentMutator(Level.Game);
}

	if (myMut != None)
	{
	 if(mymut.vehAdded.length &gt; vehadded.length)
	 {
        	 if(vehadded.length &lt; mymut.vehAdded.length)
         	 { // reinforce data from client side
          	 vehadded.insert(0,mymut.vehadded.length);
        	 }
		for(ic = 0; ic &lt; mymut.vehAdded.Length; ic++)
		{
        	vehadded[ic]=mymut.Vehadded[ic];
        	}
	 }
	if(mymut.bdeploycars || bdeploycars)
	{
	bdeploycars=true;
	}
			if(configvehiclelist.length &lt; mymut.configvehiclelist.length)
         		{ // reinforce data from client side
        		 configvehiclelist.insert(0,mymut.configvehiclelist.length);

				for(ic = 0; ic &lt; mymut.configvehiclelist.Length; ic++)
				{
            			configvehiclelist[ic]=mymut.configvehiclelist[ic];
				}
			}

	else
	{
   	log(&quot;vehicle gun error no parts&quot;);
	}

 }
}
function GiveTo(Pawn Other, optional Pickup Pickup)
{
	Super.GiveTo(Other, Pickup);

	if(Role == ROLE_Authority &amp;&amp; Instigator != None &amp;&amp; Instigator.Controller.IsA('Bot'))
	{
		NextCheckTime = Level.TimeSeconds + 5; //Never deploy right away.
		BodgedBot = Bot(Instigator.Controller);
	}
}
simulated function onsvehicle SentinelInRange(float Range, bool bOnlyOwn, optional bool bAny)
{
	local Vector HitLocation, HitNormal;
	local Actor A;
	local Vector X, Y, Z;

	local bool bSameTeam;

	GetViewAxes(X, Y, Z);
	foreach TraceActors(class'Actor', A, HitLocation, HitNormal, Instigator.Location + X * Range, Instigator.Location)
	{
		if(A == None)
			continue;

		if(A.bWorldGeometry)
			return None;

		if(A.IsA('onsvehicle'))
		{
			return onsvehicle(A);
		}
	}

	return None;
}

simulated function bool HasAmmo()
{
	return true;
}
//Make bots really want this.
//Bots should never try to wield the weapon.
function float GetAIRating()
{
	return 0;
}
// by vaptor we destroy the old car and eject the peeps so they don't die
// then we register a new old vehicle with the server
//Simulated Function RegisterOwner(Onsvehicle newvehicle)
//{
//}
//================ ok this is the hard part =========== works 100%
simulated function setupdriverweapon(onsvehicle upgradervehicle, class&lt;onsweapon&gt; newWeapon ,int i)
{
local name xb; // bone
local bool bkilled;

bkilled=false;

	if(upgradervehicle.Weapons[i] == none &amp;&amp; !bkilled)
	{
	Instigator.ReceiveLocalizedMessage(class'HELMessage', 8);
	return; // prevents it from applying to non existant slots
	}
	if(upgradervehicle.Weapons[i] != none &amp;&amp; !bkilled)
	{
	upgradervehicle.Weapons[i].destroy();
	bkilled=true;
	}
	// means there was a weapon that we destroyed
	if(bkilled)
	{
	XB=upgradervehicle.Default.DriverWeapons[i].WeaponBone;
            // Spawn the new Weapon
            upgradervehicle.Weapons[i] = upgradervehicle.spawn(newweapon, upgradervehicle,, upgradervehicle.Location, rot(0,0,0));
            upgradervehicle.AttachToBone(upgradervehicle.Weapons[i], XB);
        if (!upgradervehicle.Weapons[i].bAimable)
                upgradervehicle.Weapons[i].CurrentAim = rot(0,32768,0);
        }

    	if (upgradervehicle.ActiveWeapon &lt; upgradervehicle.Weapons.length)
    	{
            upgradervehicle.PitchUpLimit = upgradervehicle.Weapons[upgradervehicle.ActiveWeapon].PitchUpLimit;
            upgradervehicle.PitchDownLimit = upgradervehicle.Weapons[upgradervehicle.ActiveWeapon].PitchDownLimit;
    	}
	upgradervehicle.Weapons[i].team=Instigator.getTeamnum();
	upgradervehicle.SetTeamNum(Instigator.getTeamnum());
	upgradervehicle.TeamChanged();
}
//============== ok driver weapon setup is ready now this part gets messy ========
simulated function setuppasweapon(onsvehicle upgradervehicle, class&lt;onsweapon&gt; newpaswep, int i)
{
local bool bkilled;

bkilled=false;

	if(upgradervehicle.WeaponPawns[i] == none &amp;&amp; !bkilled)
	{
	Instigator.ReceiveLocalizedMessage(class'HELMessage', 8);
	return; // prevents it from applying to non existant slots
	}
	if(upgradervehicle.WeaponPawns[i].gun != none &amp;&amp; !bkilled)
	{
	upgradervehicle.WeaponPawns[i].gun.destroy();
	bkilled=true;
	}
        // Spawn the Passenger Weapons
            // Spawn WeaponPawn
	if(bkilled)
	{
            upgradervehicle.WeaponPawns[i].gun = upgradervehicle.WeaponPawns[i].spawn(newpaswep,upgradervehicle.WeaponPawns[i],,upgradervehicle.WeaponPawns[i].Location);
            upgradervehicle.WeaponPawns[i].AttachToVehicle(upgradervehicle,upgradervehicle.PassengerWeapons[i].WeaponBone);
            upgradervehicle.WeaponPawns[i].ObjectiveGetOutDist = upgradervehicle.ObjectiveGetOutDist;
	}
	upgradervehicle.WeaponPawns[i].gun.team=Instigator.getTeamnum();
	upgradervehicle.SetTeamNum(Instigator.getTeamnum());
	upgradervehicle.TeamChanged();
}
//Change ammo icon do indicate which type of Sentinel may be spawned.
simulated event WeaponTick(float dt)
{
	local int ViewPitch;
	local class&lt;Ammunition&gt; A;

	ViewPitch = Instigator.GetViewRotation().Pitch;

	if(level.timeseconds &gt; nextgain)
	{
	if(repammo &lt; 4)
		RepAmmo+=1;

	nextGain=level.timeseconds+2;
	}

	A = GetAmmoClass(0);

	if(A != None)
	{
		if(ViewPitch &gt; 1124 &amp;&amp; ViewPitch &lt; 31744)
		{
			A.Default.IconMaterial=Finalblend'ammoslothel';
			A.Default.IconCoords.X1 = 32;
			A.Default.IconCoords.Y1 = 32;
			A.Default.IconCoords.X2 = 96;
			A.Default.IconCoords.Y2 = 96;
		}
                else
		{
			A.Default.IconMaterial=FinalBlend'ammoslotsentNO';
			A.Default.IconCoords.X1 = 0;
			A.Default.IconCoords.y1 = 0;
			A.Default.IconCoords.x2 = 64;
			A.Default.IconCoords.y2 = 64;
		}
	}

}
simulated function PostnetBeginPlay()
{
	Super.PostBeginPlay();

	if(Role == ROLE_Authority)
		LoadUpgrades();
}
simulated Function Loadupgrades()
{
local int ic;
          if(vehadded.length &gt; driverUpgradeClasses.length)
         { // reinforce data from client side
         driverUpgradeClasses.insert(0,vehadded.length);
			for(ic = 0; ic &lt; vehAdded.Length; ic++)
			{
            		AddToUpgradeList(ic,vehadded[ic]);
            		}
        }
}
simulated function DoUpgrade( int i, optional class&lt;onsweapon&gt; driveUpgrade, optional class&lt;onsweapon&gt; pasUpgrade)
{
local onsvehicle SentinelToUpgrade;
	if(!bAllowUpgrades)
	{
		warn(&quot;Tried to add an upgrade but they are disabled.&quot;);
		return;
	}
	if(DriveUpgrade == None &amp;&amp; pasupgrade == none)
	{
		warn(&quot;Tried to add an upgrade that doesn't exist.&quot;);
		return;
	}
	SentinelToUpgrade = SentinelInRange(class'mechFire'.Default.UpgradeRange, true);
	if(SentinelToUpgrade == None)
	{
		Instigator.ReceiveLocalizedMessage(class'HELMessage', 9);
		return;
	}
	if(AmmoAmount(0) &lt; 20)
	{
		Instigator.ReceiveLocalizedMessage(class'HELMessage', 8);
		return;
	}
	if(driveupgrade == class'onslinkableweapon' || pasupgrade == class'onslinkableweapon' )
	{
	return;
	}

	if(driveupgrade != none)
	{
		if(AmmoAmount(0) &gt; 20)
		{
		setupdriverweapon(SentinelToUpgrade,driveUpgrade,I);
		ConsumeAmmo(0,20);
		}
	}
	else
	{
	    if(AmmoAmount(0) &gt; 20)
		{
		setuppasweapon(SentinelToUpgrade,pasUpgrade,I);
		ConsumeAmmo(0,20);
		}
	}
}
function Tick(float DeltaTime)
{
	local name BotState, BotOrders;

	if(Level.TimeSeconds &gt;= UpgradeCheckTime)
	{
		UpgradeCheckTime = Level.TimeSeconds + 1;
		mechFire(FireMode[0]).DoStuffe();
	}
	if(BodgedBot == None || Level.Game.bGameEnded)
		return;
	if(Level.TimeSeconds &gt;= NextCheckTime &amp;&amp; VSize(Instigator.Velocity) &lt; 1)
	{
	NextCheckTime = Level.TimeSeconds + 1;
	}
}
simulated Function DeployCar(class&lt;onsvehicle&gt; Type, int RequiredAmmo )
{
local int AmmoConsume;
local int zx;
local Vector X, Y, Z;
local Vector DeployLocation;

if ( !Level.Game.bAllowVehicles)
{
Level.Game.bAllowVehicles=true; 
}

GetViewAxes(X, Y, Z);
if(requiredammo &gt; 200)
{
requiredammo=150;
}
if(killscan(type.default.CollisionRadius) &amp;&amp; AmmoAmount(0) &gt;= RequiredAmmo)
{

 IF(oldVehicle != none)
 {
	if(oldvehicle.Driver != none)
	{
	oldVehicle.EjectDriver();

		if(oldvehicle.weaponpawns.length &gt; 0)
		{
			for (zx = 0; zx &lt; oldvehicle.WeaponPawns.length; zx++)
			{
			oldvehicle.WeaponPawns[zx].EjectDriver();
			oldvehicle.WeaponPawns[zx].Died(None, class'DamageType', oldvehicle.Location);
			}
		oldvehicle.WeaponPawns.length = 0;
		}

	oldvehicle.Died(None, class'DamageType', oldvehicle.Location);
	oldVehicle=none;
	}

 }

 if(oldvehicle == none)//seems to work but won't spawn
 {
 DeployLocation = Instigator.Location + (X * (20.0 + type.default.CollisionRadius)) + (z * type.default.collisionheight);
 OldVehicle= Spawn(type,,, DeployLocation, rot(0, -16384, 0));
 ConsumeAmmo(0,RequiredAmmo);
 }
}
}

simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos)
{
	local PlayerController PC;

	PC = PlayerController(Instigator.Controller);

	if(PC == None)
		return;

	HudBase(PC.myHUD).TargetMaterial = finalblend'Targetcores';

	HudBase(PC.myHUD).TargetMaterial = HudBase(PC.myHUD).Default.TargetMaterial;
}
//=============================================================================
// Utility functions:
//=============================================================================
//Upgrades are replicated to clients here.
simulated function AddToUpgradeList(int i, class&lt;onsweapon&gt; NextDriverClass)
{
	if(nextDriverClass != none)
		driverUpgradeClasses[i] = NextDriverClass; // found a way to make it only need this data!
}
static function int GetCost(class&lt;onsvehicle&gt; vehiclewanted,int total)
{
local int totalother;
local float divspd;

// use percentage logic crud this may be too much math
if(vehiclewanted != none)
{
totalother=vehiclewanted.default.GroundSpeed + vehiclewanted.default.airSpeed + vehiclewanted.default.mass + vehiclewanted.default.health;
}
divspd=total/200; // use to subtract from other values
//log(total);
return(totalother/divspd);
}
simulated function BringUp(optional Weapon PrevWeapon)
{
    Super.BringUp(PrevWeapon);
}
simulated function bool PutDown()
{
    if ( Super.PutDown() )
    {
		GotoState('');
		return true;
	}
	return false;
}

function bool killscan(int radu) // new code for telefragchecking by vaptor
{
local vector checklocation,scy;
local Vector X, Y, Z, HitLocation, HitNormal;
local actor victimizedactor;

	GetViewAxes(X, Y, Z);

	checkLocation = Instigator.Location + X * 100;
	scy.x=radu;
	scy.y=radu;
	scy.z=16;
	Victimizedactor = Trace(HitLocation, HitNormal, checkLocation, Instigator.Location , true, scy);

	 // set it false first

	if(victimizedActor != none)
	{
	 if(victimizedActor.isa('Pawn'))
	 {
		if(pawn(victimizedActor) != none)
		{
			if(pawn(victimizedActor).Controller.SameTeamAs(Instigator.Controller) ) // confirmed! stop them now!
			{
				return false;
			}
			else
			{
				return true;
			}
		}
		else
		{
			return true;
		}

	 }

	}
	return true;
}
defaultproperties
{
     bAllowUpgrades=True
     upgraderange=1200.000000
     FireModeClass(0)=Class'sentsv12.mechFire'
     FireModeClass(1)=Class'sentsv12.mechlaunchFire'
     IdleAnim=&quot;Idle&quot;
     SelectAnim=&quot;Select&quot;
     SelectSound=Sound'WeaponSounds.Misc.shieldgun_change'
     SelectForce=&quot;ShieldGun_change&quot;
     AIRating=1.500000
     CurrentRating=1.500000
     Description=&quot;NEW weapon technology useing thinking machines to provide general support for soldiers&quot;
     EffectOffset=(X=70.000000,Y=10.000000)
     SmallViewOffset=(X=23.000000,Y=6.000000,Z=-6.000000)
     CenteredOffsetY=-5.000000
     CenteredRoll=5000
     CenteredYaw=-300
     CustomCrosshair=31
     CustomCrossHairColor=(G=0,R=0)
     CustomCrossHairTextureName=&quot;AS_FX_TX.Icons.OBJ_Destroy_Tex&quot;
     InventoryGroup=8
     GroupOffset=158
     PlayerViewOffset=(X=11.000000)
     BobDamping=1.575000
     AttachmentClass=Class'sentsv12.mechAttach'
     IconMaterial=FinalBlend'AS_FX_TX.Icons.OBJ_HellBender_FB'
     IconCoords=(X2=64,Y2=64)
     ItemName=&quot;VehicleMechanic&quot;
     Mesh=SkeletalMesh'Weapons.BallLauncher_1st'
     DrawScale=0.400000
     Skins(0)=Combiner'sentsv12.Beams.ANGLETRAILxx'
     Skins(1)=FinalBlend'sentsv12.Beams.casedvortex'
     Skins(2)=Shader'sentsv12.Beams.coilshader'
}

&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Modular Mod</title>
    <id>2052</id>
    <revision>
      <id>5003</id>
      <timestamp>2005-12-03T02:37:28Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Modularity ==

The Unreal engine has been built modular, so you can extend the game with your own creations. This is a great feature and ofcourse used a lot.

So why don't you make your mod modular, besides giving other people the power to extend your mod without needing to recompile it completely, it will also be quite handy to categorise some functionality within your mod.

Not every mod can be made modular, you have to find out yourself if your mod lends itself to contain modules. Somethings that often can be build modular:
* command handling
* power-ups/bonusses
* ....

An example of a modular system in UT2003 is the new WebAdmin (module system is broken in 2136 and earlier tho). It will allow you to add extra pages to the system.

==Main class ==

In the main class you have to load and call the modules.

&lt;uscript&gt;
class MyModMod extends Info config;

var globalconfig array&lt;class&lt;MyModule&gt;&gt; MyModuleClasses;
var array&lt;MyModule&gt; MyModules;

function LoadModules()
{
  local int i, j, cnt;
  local MyModule MMI;
  local class&lt;MyModule&gt; MMC;

  cnt = 0;
  for (i=0; i &lt; MyModuleClasses.Length; i++)
  {
    MMC = MyModuleClasses[i];
    // Skip invalid classes;
    if (MMC != None)
    {
      // Make sure we dont have duplicate instance of the same class
      for (j=0;j&lt;TelnetHelpers.Length; j++)
      {
        if (MyModules[j].Class == MMC)
        {
          MMC = None;
          break;
        }
      }
      
      if (MMC != None)
      {
        MMI = new MMC;
        if (MMI != None)
        {
          if (MMI.Init())
          {
            MyModules.Length = MyModules.Length+1;
            MyModules[MyModules.Length - 1] = MMI;
          }
          else
          {
            Log(&quot;MyModule:&quot;@MMC@&quot;could not be initialized&quot;);
          }
        }
      }
    }
  }
}
&lt;/uscript&gt;

'''MythOpus:''' In the code above, I think there is a slight typo and I'm not sure how to fix it.  I'm not sure how to fix it...  anyways the typo is 'TelnetHelper' where you check for the duplicates.

As you can see above we have defined two variables, one of them is configurable: MyModuleClasses. In the config file we will define the Sub Classes of MyModule that we want to load:

&lt;uscript&gt;
[MyPackage.MyModMod]
MyModuleClasses=class'MyFirstModule'
MyModuleClasses=class'MySecondModule'
MyModuleClasses=class'MyExtras.AnotherModule'
etc...
&lt;/uscript&gt;

The method LoadModules() will load all module classes defined in the variable MyModuleClasses and place the instance handle in the var MyModules (this is what we use in the rest of the system). For every instance of MyModule it will class a method called Init() to allow the module to do some initialization. You should call the method LoadModules when your Mod starts.

Now we have loaded all modules we should call them when it's needed, for example:

&lt;uscript&gt;
function SomethingHappend(Controller C, string description)
{
  local int i;
  for (i = 0;  i &lt; MyModules.length; i++)
  { 
    // break loop when handled
    if (MyModules[i].DoSomething(C, description)) break;
  }
  // do some more
}
&lt;/uscript&gt;

When this function is called it will loop through the MyModules list and call the method DoSomething on every MyModule until it returns true. Breaking the loop when a MyModule has handled the method is something you usualy want to do. In some cases you want every module to perform some actions, like saving stuff. But most of the time you want to ask a module if it wants to do something with the currect aparameters or not.

Now that this is defined you need to program the Base Class of the Module.

==Base Module Class ==

&lt;uscript&gt;
class MyModule extends Object within MyModMod;

function bool Init()
{
  return true;
}

function bool DoSomething(Controller C, string description)
{
  return false;
}

function bool DoSomethingElse(Controller C1, Controller C2)
{
  return false;
}

function SaveStatus()
{
}
&lt;/uscript&gt;

The base class defines all methods that can be called on the module. The base class should not contain a lot of code, only code that is realy common to all modules.

Also on methods that return a bool to define if they handled it should return false by default. Init should return true by default.

The base class is defined to execute within the context of MyModMod, thus it should extend Object since it's already a sub class of whatever MyModMod is a subclass off.

===A module ===

Now that we have defined a base class we can create the modules.

&lt;uscript&gt;
class MyFirstModule extends MyModule;

function bool Init()
{
  log(&quot;MyFirstModule loaded succesfully&quot;);
  return true;
}

function bool DoSomething(Controller C, string description)
{
  if (description != &quot;&quot;)
  {
    Log(&quot;Dosomething called with an non empty description&quot;);
    return true;
  }
  return false;
}
&lt;/uscript&gt;

MyFirstModule implements the methods Init and DoSomething, the other methods are left to it's default. In Init we just say that we have loaded. 

In DoSomething we add a log line when the description is not empty, and return true. Because we return true we will prevent other Modules to be called. If description is not empty we will return false and give other modules a chance.

==Releasing a SDK ==

When you release your mod it's very wise to provide documentation on how the modules work and how somebody can extend them. Provide the source of the base class(es) with this documentation, document every function declared.

'''Solid Snake:''' This is what Chaos Engine is doing.

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]</text>
    </revision>
    <revision>
      <id>5004</id>
      <timestamp>2005-08-16T02:37:02Z</timestamp>
      <contributor>
        <ip>64-110-209-175.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>asking for code fix?</comment>
      <text xml:space="preserve">==Modularity ==

The Unreal engine has been built modular, so you can extend the game with your own creations. This is a great feature and ofcourse used a lot.

So why don't you make your mod modular, besides giving other people the power to extend your mod without needing to recompile it completely, it will also be quite handy to categorise some functionality within your mod.

Not every mod can be made modular, you have to find out yourself if your mod lends itself to contain modules. Somethings that often can be build modular:
* command handling
* power-ups/bonusses
* ....

An example of a modular system in UT2003 is the new WebAdmin (module system is broken in 2136 and earlier tho). It will allow you to add extra pages to the system.

==Main class ==

In the main class you have to load and call the modules.

&lt;uscript&gt;
class MyModMod extends Info config;

var globalconfig array&lt;class&lt;MyModule&gt;&gt; MyModuleClasses;
var array&lt;MyModule&gt; MyModules;

function LoadModules()
{
  local int i, j, cnt;
  local MyModule MMI;
  local class&lt;MyModule&gt; MMC;

  cnt = 0;
  for (i=0; i &lt; MyModuleClasses.Length; i++)
  {
    MMC = MyModuleClasses[i];
    // Skip invalid classes;
    if (MMC != None)
    {
      // Make sure we dont have duplicate instance of the same class
      for (j=0;j&lt;TelnetHelpers.Length; j++)
      {
        if (MyModules[j].Class == MMC)
        {
          MMC = None;
          break;
        }
      }
      
      if (MMC != None)
      {
        MMI = new MMC;
        if (MMI != None)
        {
          if (MMI.Init())
          {
            MyModules.Length = MyModules.Length+1;
            MyModules[MyModules.Length - 1] = MMI;
          }
          else
          {
            Log(&quot;MyModule:&quot;@MMC@&quot;could not be initialized&quot;);
          }
        }
      }
    }
  }
}
&lt;/uscript&gt;

'''MythOpus:''' In the code above, I think there is a slight typo and I'm not sure how to fix it.  I'm not sure how to fix it...  anyways the typo is 'TelnetHelper' where you check for the duplicates.

As you can see above we have defined two variables, one of them is configurable: MyModuleClasses. In the config file we will define the Sub Classes of MyModule that we want to load:

&lt;uscript&gt;
[MyPackage.MyModMod]
MyModuleClasses=class'MyFirstModule'
MyModuleClasses=class'MySecondModule'
MyModuleClasses=class'MyExtras.AnotherModule'
etc...
&lt;/uscript&gt;

The method LoadModules() will load all module classes defined in the variable MyModuleClasses and place the instance handle in the var MyModules (this is what we use in the rest of the system). For every instance of MyModule it will class a method called Init() to allow the module to do some initialization. You should call the method LoadModules when your Mod starts.

Now we have loaded all modules we should call them when it's needed, for example:

&lt;uscript&gt;
function SomethingHappend(Controller C, string description)
{
  local int i;
  for (i = 0;  i &lt; MyModules.length; i++)
  { 
    // break loop when handled
    if (MyModules[i].DoSomething(C, description)) break;
  }
  // do some more
}
&lt;/uscript&gt;

When this function is called it will loop through the MyModules list and call the method DoSomething on every MyModule until it returns true. Breaking the loop when a MyModule has handled the method is something you usualy want to do. In some cases you want every module to perform some actions, like saving stuff. But most of the time you want to ask a module if it wants to do something with the currect aparameters or not.

Now that this is defined you need to program the Base Class of the Module.

==Base Module Class ==

&lt;uscript&gt;
class MyModule extends Object within MyModMod;

function bool Init()
{
  return true;
}

function bool DoSomething(Controller C, string description)
{
  return false;
}

function bool DoSomethingElse(Controller C1, Controller C2)
{
  return false;
}

function SaveStatus()
{
}
&lt;/uscript&gt;

The base class defines all methods that can be called on the module. The base class should not contain a lot of code, only code that is realy common to all modules.

Also on methods that return a bool to define if they handled it should return false by default. Init should return true by default.

The base class is defined to execute within the context of MyModMod, thus it should extend Object since it's already a sub class of whatever MyModMod is a subclass off.

===A module ===

Now that we have defined a base class we can create the modules.

&lt;uscript&gt;
class MyFirstModule extends MyModule;

function bool Init()
{
  log(&quot;MyFirstModule loaded succesfully&quot;);
  return true;
}

function bool DoSomething(Controller C, string description)
{
  if (description != &quot;&quot;)
  {
    Log(&quot;Dosomething called with an non empty description&quot;);
    return true;
  }
  return false;
}
&lt;/uscript&gt;

MyFirstModule implements the methods Init and DoSomething, the other methods are left to it's default. In Init we just say that we have loaded. 

In DoSomething we add a log line when the description is not empty, and return true. Because we return true we will prevent other Modules to be called. If description is not empty we will return false and give other modules a chance.

==Releasing a SDK ==

When you release your mod it's very wise to provide documentation on how the modules work and how somebody can extend them. Provide the source of the base class(es) with this documentation, document every function declared.</text>
    </revision>
    <revision>
      <id>5005</id>
      <timestamp>2005-08-16T05:25:59Z</timestamp>
      <contributor>
        <ip>222-152-115-142.adsl.ihug.co.nz</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Modularity ==

The Unreal engine has been built modular, so you can extend the game with your own creations. This is a great feature and ofcourse used a lot.

So why don't you make your mod modular, besides giving other people the power to extend your mod without needing to recompile it completely, it will also be quite handy to categorise some functionality within your mod.

Not every mod can be made modular, you have to find out yourself if your mod lends itself to contain modules. Somethings that often can be build modular:
* command handling
* power-ups/bonusses
* ....

An example of a modular system in UT2003 is the new WebAdmin (module system is broken in 2136 and earlier tho). It will allow you to add extra pages to the system.

==Main class ==

In the main class you have to load and call the modules.

&lt;uscript&gt;
class MyModMod extends Info config;

var globalconfig array&lt;class&lt;MyModule&gt;&gt; MyModuleClasses;
var array&lt;MyModule&gt; MyModules;

function LoadModules()
{
  local int i, j, cnt;
  local MyModule MMI;
  local class&lt;MyModule&gt; MMC;

  cnt = 0;
  for (i=0; i &lt; MyModuleClasses.Length; i++)
  {
    MMC = MyModuleClasses[i];
    // Skip invalid classes;
    if (MMC != None)
    {
      // Make sure we dont have duplicate instance of the same class
      for (j=0;j&lt;TelnetHelpers.Length; j++)
      {
        if (MyModules[j].Class == MMC)
        {
          MMC = None;
          break;
        }
      }
      
      if (MMC != None)
      {
        MMI = new MMC;
        if (MMI != None)
        {
          if (MMI.Init())
          {
            MyModules.Length = MyModules.Length+1;
            MyModules[MyModules.Length - 1] = MMI;
          }
          else
          {
            Log(&quot;MyModule:&quot;@MMC@&quot;could not be initialized&quot;);
          }
        }
      }
    }
  }
}
&lt;/uscript&gt;

'''MythOpus:''' In the code above, I think there is a slight typo and I'm not sure how to fix it.  I'm not sure how to fix it...  anyways the typo is 'TelnetHelper' where you check for the duplicates.

As you can see above we have defined two variables, one of them is configurable: MyModuleClasses. In the config file we will define the Sub Classes of MyModule that we want to load:

&lt;uscript&gt;
[MyPackage.MyModMod]
MyModuleClasses=class'MyFirstModule'
MyModuleClasses=class'MySecondModule'
MyModuleClasses=class'MyExtras.AnotherModule'
etc...
&lt;/uscript&gt;

The method LoadModules() will load all module classes defined in the variable MyModuleClasses and place the instance handle in the var MyModules (this is what we use in the rest of the system). For every instance of MyModule it will class a method called Init() to allow the module to do some initialization. You should call the method LoadModules when your Mod starts.

Now we have loaded all modules we should call them when it's needed, for example:

&lt;uscript&gt;
function SomethingHappend(Controller C, string description)
{
  local int i;
  for (i = 0;  i &lt; MyModules.length; i++)
  { 
    // break loop when handled
    if (MyModules[i].DoSomething(C, description)) break;
  }
  // do some more
}
&lt;/uscript&gt;

When this function is called it will loop through the MyModules list and call the method DoSomething on every MyModule until it returns true. Breaking the loop when a MyModule has handled the method is something you usualy want to do. In some cases you want every module to perform some actions, like saving stuff. But most of the time you want to ask a module if it wants to do something with the currect aparameters or not.

Now that this is defined you need to program the Base Class of the Module.

==Base Module Class ==

&lt;uscript&gt;
class MyModule extends Object within MyModMod;

function bool Init()
{
  return true;
}

function bool DoSomething(Controller C, string description)
{
  return false;
}

function bool DoSomethingElse(Controller C1, Controller C2)
{
  return false;
}

function SaveStatus()
{
}
&lt;/uscript&gt;

The base class defines all methods that can be called on the module. The base class should not contain a lot of code, only code that is realy common to all modules.

Also on methods that return a bool to define if they handled it should return false by default. Init should return true by default.

The base class is defined to execute within the context of MyModMod, thus it should extend Object since it's already a sub class of whatever MyModMod is a subclass off.

===A module ===

Now that we have defined a base class we can create the modules.

&lt;uscript&gt;
class MyFirstModule extends MyModule;

function bool Init()
{
  log(&quot;MyFirstModule loaded succesfully&quot;);
  return true;
}

function bool DoSomething(Controller C, string description)
{
  if (description != &quot;&quot;)
  {
    Log(&quot;Dosomething called with an non empty description&quot;);
    return true;
  }
  return false;
}
&lt;/uscript&gt;

MyFirstModule implements the methods Init and DoSomething, the other methods are left to it's default. In Init we just say that we have loaded. 

In DoSomething we add a log line when the description is not empty, and return true. Because we return true we will prevent other Modules to be called. If description is not empty we will return false and give other modules a chance.

==Releasing a SDK ==

When you release your mod it's very wise to provide documentation on how the modules work and how somebody can extend them. Provide the source of the base class(es) with this documentation, document every function declared.

'''Solid Snake:''' This is what Chaos Engine is doing.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Monster</title>
    <id>2224</id>
    <revision>
      <id>5382</id>
      <timestamp>2007-01-27T15:22:45Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; Monster (Package: SkaarjPack)}}

This is the parent class for all NPC Monsters in UT200x.  These monsters are used in the [[Legacy:Invasion|Invasion]] gametype.

==Properties==

All properties are hidden.
; bool bMeleeFighter :
; bool bShotAnim :
; bool bCanDodge :
; bool bVictoryNext :
; bool bTryToWalk :
; bool bBoss :
; bool bAlwaysStrafe :
; float DodgeSkillAdjust :
; sound HitSound[4] :
; sound DeathSound[4] :
; sound ChallengeSound[4] :
; sound FireSound :
; class&lt;[[Legacy:Ammunition|Ammunition]]&gt; AmmunitionClass :
; [[Legacy:Ammunition|Ammunition]] MyAmmo :
; int ScoringValue :
; [[Legacy:FireProperties|FireProperties]] SavedFireProperties :

==Functions==

===Combat Interface===
; RangedAttack( [[Legacy:Actor|Actor]] A ) : EMPTY
; bool CanAttack( [[Legacy:Actor|Actor]] A ) : EMPTY
; StopFiring() : EMPTY
; bool SplashDamage() : EMPTY
; float GetDamageRadius() : EMPTY
; bool RecommendSplashDamage() : EMPTY

===Other===
; TurnOff() (simulated) : If Health is more than zero, set bVictoryNext to true (endgame?)
; bool ForceDefaultCharacter() (simulated) : Returns false to prevent replacing monsters with default character.
; bool IsHeadShot( vector loc, vector ray, float AdditionalScale ) : If &lt;tt&gt;Super.IsHeadShot()&lt;/tt&gt; returns true, this returns true if headshot. 
; Fire( optional float F ) : After finding the actor BestTarget through &lt;tt&gt;Controller.PickTarget()&lt;/tt&gt;, calls &lt;tt&gt;RangedAttack(BestTarget)&lt;/tt&gt;.
; bool PreferMelee() : Returns value of &lt;tt&gt;bMeleeFighter&lt;/tt&gt;.
; bool HasRangedAttack() : EMPTY
; float RangedAttackTime() : EMPTY
; vector GetFireStart( vector X, vector Y, vector Z ) : Returns the Location of the weapon fire start.
; FireProjectile() : Fills SavedFireProperties properties using MyAmmo as a base, then spawns the weapons fire and calls &lt;tt&gt;PlaySound(FireSound,SLOT_Interact)&lt;/tt&gt;.
; SpawnGiblet( class&lt;[[Legacy:Gib|Gib]]&gt; GibClass, vector Location, rotator Rotation, float GibPerterbation ) (simulated) : If GibClass exists and &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, spawns GibClass gibs, sets the gib scale and velocity.
; LandThump() : If Physics is PHYS_None, calls &lt;tt&gt;PlaySound(sound'Thump')&lt;/tt&gt;.
; bool SameSpeciesAs( [[Legacy:Pawn|Pawn]] P ) : Returns true if P and this Monster are of the same class (or subclass).
; AssignInitialPose() (simualted) : Calls &lt;tt&gt;TweenAnim(MovementAnims[0],0.0)&lt;/tt&gt;.
; PlayChallengeSound() : Calls &lt;tt&gt;PlaySound(ChallengeSound[Rand(4)],SLOT_Talk)&lt;/tt&gt;.
; Destroyed() : Destroys MyAmmo (if any) before calling &lt;tt&gt;Super.Destroyed()&lt;/tt&gt;.
; PlayVictory() : EMPTY
; AnimEnd( int Channel ) (simulated) : Calls &lt;tt&gt;PlayVictory()&lt;/tt&gt; if bVictoryNext is true and Physics is not PHYS_Falling, otherwise sets bShotAnim and Controller.bPreparingMove to false.  Calls &lt;tt&gt;Super.AnimEnd(Channel)&lt;/tt&gt;.
; SetMovementPhysics() : Calls &lt;tt&gt;SetPhysics(PHYS_Falling)&lt;/tt&gt;.
; bool IsPlayerPawn() : Returns true so it can use [[Legacy:Mover|Mover]]s.
; PlayTakeHit( vector HitLocation, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : If not sooner than MinTimeBetweenPainSounds, sets LastPainSound and calls &lt;tt&gt;PlaySound(HitSound[Rand(4)], SLOT_Pain,2*TransientSoundVolume,,400)&lt;/tt&gt;.
; PlayDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLoc ) (simulated) : Sets bCanTeleport and bReplicateMovement to false, sets bTearOff and bPlayedDeath to true.  Sets Lifespan to RagdollLifeSpan and switches state to &quot;Dying&quot;.  Adds TearOffMomentum to Velocity, sets default BaseEyeHeight, calls &lt;tt&gt;SetInvisibility(0.0)&lt;/tt&gt;, &lt;tt&gt;PlayDirectionalDeath(HitLoc)&lt;/tt&gt; and &lt;tt&gt;SetPhysics(PHYS_Falling)&lt;/tt&gt;.
; PlayDyingSound() : If bGibbed, calls &lt;tt&gt;PlaySound(GibGroupClass.static.GibSound(), SLOT_Pain,2.5*TransientSoundVolume,true,500)&lt;/tt&gt;.  Calls &lt;tt&gt;PlaySound(DeathSound[Rand(4)], SLOT_Pain,2.5*TransientSoundVolume, true,500)&lt;/tt&gt;.
;  bool MeleeDamageTarget( int hitdamage, vector pushdir ) : Uses a Trace function to determine if Controller.Target is within melee range and returns true if it is.
; PlayVictoryAnimation() : Sets bVictoryNext to true.
; CreateGib( name boneName, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, rotator r ) : If &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, fills HitFX[] properties with an additional array member.
; ProcessHitFX() (simulated) : If &lt;tt&gt;Level.NetMode&lt;/tt&gt; is not a DedicatedServer and &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, spawns gibs for each valid part of the Monster.
; StartDeRes() (simulated) : If &lt;tt&gt;Level.NetMode&lt;/tt&gt; is not a DedicatedServer, sets full AmbientGlow, zero MaxLights, Skins to DeResMat0 and DeResMat1, Collision to none, removes and disallows projectors, deactivates the player shadow, calls &lt;tt&gt;RemoveFlamingEffects()&lt;/tt&gt;, removes any material overlays and sets bDeRes to true.

==Events==
; PostBeginPlay() : After &lt;tt&gt;Super.PostBeginPlay()&lt;/tt&gt;, spawns Controller from ControllerClass, calls &lt;tt&gt;Controller.Possess(self)&lt;/tt&gt;, spawns MyAmmo from AmmunitionClass.
; SetAnimAction( name NewAction ) (simulated) : If bWaitForAnim is false and Level.NetMode is NM_Client, set AnimAction to NewAction and then if &lt;tt&gt;PlayAnim(AnimAction,,0.1)&lt;/tt&gt; returns true and &lt;tt&gt;(Physics != PHYS_None)&lt;/tt&gt;, then set bWaitForAnim to true.

==States==

===Dying===
: Ignores the following: AnimEnd, Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling and BreathTimer.

====Functions====
; Landed() : Calls &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt; and if &lt;tt&gt;IsAnimating(0)&lt;/tt&gt; returns false, calls LandThump() before calling &lt;tt&gt;Super.Landed(HitNormal)&lt;/tt&gt;.
; Timer() : Checks to see if &lt;tt&gt;PlayerCanSeeMe()&lt;/tt&gt; returns false to call &lt;tt&gt;Destroy()&lt;/tt&gt;, otherwise if &lt;tt&gt;(LifeSpan &lt;= DeResTime)&lt;/tt&gt; and bDeRes is false, it calls &lt;tt&gt;StartDeRes()&lt;/tt&gt;, otherwise is calls &lt;tt&gt;SetTimer(1.0, false)&lt;/tt&gt;.

==Known Subclasses==

'''Note:''' In UT, all Monsters are a subclass of [[Legacy:ScriptedPawn|ScriptedPawn]].

 Monster
     +- [[Legacy:Brute|Brute]]
     |    +- LesserBrute (UT only)
     |    +- [[Legacy:Behemoth|Behemoth]]
     +- [[Legacy:Gasbag|Gasbag]]
     +- [[Legacy:Krall|Krall]]
     |    +- [[Legacy:EliteKrall|EliteKrall]]
     +- [[Legacy:Manta|Manta]]
     +- [[Legacy:Fly|Fly]] (aka Razorfly)
     +- [[Legacy:Skaarj|Skaarj]]
     |    +- [[Legacy:FireSkaarj|FireSkaarj]] (UT2004 only)
     |    +- [[Legacy:IceSkaarj|IceSkaarj]] (UT2004 only)
     |    +- SkaarjTrooper (UT only)
     |    |   +- SkaarjGunner
     |    |   +- SkaarjInfantry
     |    |   +- SkaarjOfficer
     |    |   +- SkaarjSniper
     |    +- SkaarjWarrior (UT only)
     |        +- [[Legacy:IceSkaarj|IceSkaarj]]
     |        +- SkaarjAssassin
     |        +- SkaarjBeserker
     |        +- SkaarjLord
     |        +- SkaarjScout
     +- [[Legacy:Pupae|Pupae]] (aka SkaarjPupae)
     +- [[Legacy:Warlord|Warlord]]

==Related Topics==
* [[Legacy:MonsterController|MonsterController]]
* [[Legacy:Invasion|Invasion]] &amp;ndash; The [[Legacy:GameInfo|GameInfo]] class that handles Monsters in UT200x
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic for all AI (bots, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Hub for monster support
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Design and creation of custom NPCs

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5383</id>
      <timestamp>2005-12-03T01:29:29Z</timestamp>
      <contributor>
        <ip>192.251.69.54</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; Monster (Package: SkaarjPack)}}

This is the parent class for all NPC Monsters in UT2004.  These monsters are used in the [[Legacy:Invasion|Invasion]] gametype.

==Properties==

All properties are hidden.
; bool bMeleeFighter :
; bool bShotAnim :
; bool bCanDodge :
; bool bVictoryNext :
; bool bTryToWalk :
; bool bBoss :
; bool bAlwaysStrafe :
; float DodgeSkillAdjust :
; sound HitSound[4] :
; sound DeathSound[4] :
; sound ChallengeSound[4] :
; sound FireSound :
; class&lt;[[Legacy:Ammunition|Ammunition]]&gt; AmmunitionClass :
; [[Legacy:Ammunition|Ammunition]] MyAmmo :
; int ScoringValue :
; [[Legacy:FireProperties|FireProperties]] SavedFireProperties :

==Functions==

===Combat Interface===
; RangedAttack( [[Legacy:Actor|Actor]] A ) : EMPTY
; bool CanAttack( [[Legacy:Actor|Actor]] A ) : EMPTY
; StopFiring() : EMPTY
; bool SplashDamage() : EMPTY
; float GetDamageRadius() : EMPTY
; bool RecommendSplashDamage() : EMPTY

===Other===
; TurnOff() (simulated) : If Health is more than zero, set bVictoryNext to true (endgame?)
; bool ForceDefaultCharacter() (simulated) : Returns false to prevent replacing monsters with default character.
; bool IsHeadShot( vector loc, vector ray, float AdditionalScale ) : If &lt;tt&gt;Super.IsHeadShot()&lt;/tt&gt; returns true, this returns true if headshot. 
; Fire( optional float F ) : After finding the actor BestTarget through &lt;tt&gt;Controller.PickTarget()&lt;/tt&gt;, calls &lt;tt&gt;RangedAttack(BestTarget)&lt;/tt&gt;.
; bool PreferMelee() : Returns value of &lt;tt&gt;bMeleeFighter&lt;/tt&gt;.
; bool HasRangedAttack() : EMPTY
; float RangedAttackTime() : EMPTY
; vector GetFireStart( vector X, vector Y, vector Z ) : Returns the Location of the weapon fire start.
; FireProjectile() : Fills SavedFireProperties properties using MyAmmo as a base, then spawns the weapons fire and calls &lt;tt&gt;PlaySound(FireSound,SLOT_Interact)&lt;/tt&gt;.
; SpawnGiblet( class&lt;[[Legacy:Gib|Gib]]&gt; GibClass, vector Location, rotator Rotation, float GibPerterbation ) (simulated) : If GibClass exists and &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, spawns GibClass gibs, sets the gib scale and velocity.
; LandThump() : If Physics is PHYS_None, calls &lt;tt&gt;PlaySound(sound'Thump')&lt;/tt&gt;.
; bool SameSpeciesAs( [[Legacy:Pawn|Pawn]] P ) : Returns true if P and this Monster are of the same class (or subclass).
; AssignInitialPose() (simualted) : Calls &lt;tt&gt;TweenAnim(MovementAnims[0],0.0)&lt;/tt&gt;.
; PlayChallengeSound() : Calls &lt;tt&gt;PlaySound(ChallengeSound[Rand(4)],SLOT_Talk)&lt;/tt&gt;.
; Destroyed() : Destroys MyAmmo (if any) before calling &lt;tt&gt;Super.Destroyed()&lt;/tt&gt;.
; PlayVictory() : EMPTY
; AnimEnd( int Channel ) (simulated) : Calls &lt;tt&gt;PlayVictory()&lt;/tt&gt; if bVictoryNext is true and Physics is not PHYS_Falling, otherwise sets bShotAnim and Controller.bPreparingMove to false.  Calls &lt;tt&gt;Super.AnimEnd(Channel)&lt;/tt&gt;.
; SetMovementPhysics() : Calls &lt;tt&gt;SetPhysics(PHYS_Falling)&lt;/tt&gt;.
; bool IsPlayerPawn() : Returns true so it can use [[Legacy:Mover|Mover]]s.
; PlayTakeHit( vector HitLocation, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : If not sooner than MinTimeBetweenPainSounds, sets LastPainSound and calls &lt;tt&gt;PlaySound(HitSound[Rand(4)], SLOT_Pain,2*TransientSoundVolume,,400)&lt;/tt&gt;.
; PlayDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLoc ) (simulated) : Sets bCanTeleport and bReplicateMovement to false, sets bTearOff and bPlayedDeath to true.  Sets Lifespan to RagdollLifeSpan and switches state to &quot;Dying&quot;.  Adds TearOffMomentum to Velocity, sets default BaseEyeHeight, calls &lt;tt&gt;SetInvisibility(0.0)&lt;/tt&gt;, &lt;tt&gt;PlayDirectionalDeath(HitLoc)&lt;/tt&gt; and &lt;tt&gt;SetPhysics(PHYS_Falling)&lt;/tt&gt;.
; PlayDyingSound() : If bGibbed, calls &lt;tt&gt;PlaySound(GibGroupClass.static.GibSound(), SLOT_Pain,2.5*TransientSoundVolume,true,500)&lt;/tt&gt;.  Calls &lt;tt&gt;PlaySound(DeathSound[Rand(4)], SLOT_Pain,2.5*TransientSoundVolume, true,500)&lt;/tt&gt;.
;  bool MeleeDamageTarget( int hitdamage, vector pushdir ) : Uses a Trace function to determine if Controller.Target is within melee range and returns true if it is.
; PlayVictoryAnimation() : Sets bVictoryNext to true.
; CreateGib( name boneName, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, rotator r ) : If &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, fills HitFX[] properties with an additional array member.
; ProcessHitFX() (simulated) : If &lt;tt&gt;Level.NetMode&lt;/tt&gt; is not a DedicatedServer and &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, spawns gibs for each valid part of the Monster.
; StartDeRes() (simulated) : If &lt;tt&gt;Level.NetMode&lt;/tt&gt; is not a DedicatedServer, sets full AmbientGlow, zero MaxLights, Skins to DeResMat0 and DeResMat1, Collision to none, removes and disallows projectors, deactivates the player shadow, calls &lt;tt&gt;RemoveFlamingEffects()&lt;/tt&gt;, removes any material overlays and sets bDeRes to true.

==Events==
; PostBeginPlay() : After &lt;tt&gt;Super.PostBeginPlay()&lt;/tt&gt;, spawns Controller from ControllerClass, calls &lt;tt&gt;Controller.Possess(self)&lt;/tt&gt;, spawns MyAmmo from AmmunitionClass.
; SetAnimAction( name NewAction ) (simulated) : If bWaitForAnim is false and Level.NetMode is NM_Client, set AnimAction to NewAction and then if &lt;tt&gt;PlayAnim(AnimAction,,0.1)&lt;/tt&gt; returns true and &lt;tt&gt;(Physics != PHYS_None)&lt;/tt&gt;, then set bWaitForAnim to true.

==States==
; Dying : Ignores the following: AnimEnd, Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling and BreathTimer.
:: '''Landed()''' calls &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt; and if &lt;tt&gt;IsAnimating(0)&lt;/tt&gt; returns false, calls LandThump() before calling &lt;tt&gt;Super.Landed(HitNormal)&lt;/tt&gt;.
:: '''Timer()''' checks to see if &lt;tt&gt;PlayerCanSeeMe()&lt;/tt&gt; returns false to call &lt;tt&gt;Destroy()&lt;/tt&gt;, otherwise if &lt;tt&gt;(LifeSpan &lt;= DeResTime)&lt;/tt&gt; and bDeRes is false, it calls &lt;tt&gt;StartDeRes()&lt;/tt&gt;, otherwise is calls &lt;tt&gt;SetTimer(1.0, false)&lt;/tt&gt;.

==Known Subclasses==

'''Note:''' In UT, all Monsters are a subclass of [[Legacy:ScriptedPawn|ScriptedPawn]].

 Monster
     +- [[Legacy:Brute|Brute]]
     |    +- LesserBrute (UT only)
     |    +- [[Legacy:Behemoth|Behemoth]]
     +- [[Legacy:Gasbag|Gasbag]]
     +- [[Legacy:Krall|Krall]]
     |    +- [[Legacy:EliteKrall|EliteKrall]]
     +- [[Legacy:Manta|Manta]]
     +- [[Legacy:Razorfly|Razorfly]]
     +- [[Legacy:Skaarj|Skaarj]]
     |    +- [[Legacy:FireSkaarj|FireSkaarj]] (UT2004 only)
     |    +- [[Legacy:IceSkaarj|IceSkaarj]] (UT2004 only)
     |    +- SkaarjTrooper (UT only)
     |    |   +- SkaarjGunner
     |    |   +- SkaarjInfantry
     |    |   +- SkaarjOfficer
     |    |   +- SkaarjSniper
     |    +- SkaarjWarrior (UT only)
     |        +- [[Legacy:IceSkaarj|IceSkaarj]]
     |        +- SkaarjAssassin
     |        +- SkaarjBeserker
     |        +- SkaarjLord
     |        +- SkaarjScout
     +- [[Legacy:SkaarjPupae|SkaarjPupae]]
     +- [[Legacy:Warlord|Warlord]]

==Related Topics==
* [[Legacy:Invasion|Invasion]] &amp;ndash; The [[Legacy:GameInfo|GameInfo]] class that handles Monsters in UT2004
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic for all AI (bots, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Hub for monster support
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Design and creation of custom NPCs

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5384</id>
      <timestamp>2006-02-13T16:25:16Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn|Pawn]] &gt;&gt; [[Legacy:UnrealPawn|UnrealPawn]] &gt;&gt; [[Legacy:XPawn|xPawn]] &gt;&gt; Monster (Package: SkaarjPack)}}

This is the parent class for all NPC Monsters in UT2004.  These monsters are used in the [[Legacy:Invasion|Invasion]] gametype.

==Properties==

All properties are hidden.
; bool bMeleeFighter :
; bool bShotAnim :
; bool bCanDodge :
; bool bVictoryNext :
; bool bTryToWalk :
; bool bBoss :
; bool bAlwaysStrafe :
; float DodgeSkillAdjust :
; sound HitSound[4] :
; sound DeathSound[4] :
; sound ChallengeSound[4] :
; sound FireSound :
; class&lt;[[Legacy:Ammunition|Ammunition]]&gt; AmmunitionClass :
; [[Legacy:Ammunition|Ammunition]] MyAmmo :
; int ScoringValue :
; [[Legacy:FireProperties|FireProperties]] SavedFireProperties :

==Functions==

===Combat Interface===
; RangedAttack( [[Legacy:Actor|Actor]] A ) : EMPTY
; bool CanAttack( [[Legacy:Actor|Actor]] A ) : EMPTY
; StopFiring() : EMPTY
; bool SplashDamage() : EMPTY
; float GetDamageRadius() : EMPTY
; bool RecommendSplashDamage() : EMPTY

===Other===
; TurnOff() (simulated) : If Health is more than zero, set bVictoryNext to true (endgame?)
; bool ForceDefaultCharacter() (simulated) : Returns false to prevent replacing monsters with default character.
; bool IsHeadShot( vector loc, vector ray, float AdditionalScale ) : If &lt;tt&gt;Super.IsHeadShot()&lt;/tt&gt; returns true, this returns true if headshot. 
; Fire( optional float F ) : After finding the actor BestTarget through &lt;tt&gt;Controller.PickTarget()&lt;/tt&gt;, calls &lt;tt&gt;RangedAttack(BestTarget)&lt;/tt&gt;.
; bool PreferMelee() : Returns value of &lt;tt&gt;bMeleeFighter&lt;/tt&gt;.
; bool HasRangedAttack() : EMPTY
; float RangedAttackTime() : EMPTY
; vector GetFireStart( vector X, vector Y, vector Z ) : Returns the Location of the weapon fire start.
; FireProjectile() : Fills SavedFireProperties properties using MyAmmo as a base, then spawns the weapons fire and calls &lt;tt&gt;PlaySound(FireSound,SLOT_Interact)&lt;/tt&gt;.
; SpawnGiblet( class&lt;[[Legacy:Gib|Gib]]&gt; GibClass, vector Location, rotator Rotation, float GibPerterbation ) (simulated) : If GibClass exists and &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, spawns GibClass gibs, sets the gib scale and velocity.
; LandThump() : If Physics is PHYS_None, calls &lt;tt&gt;PlaySound(sound'Thump')&lt;/tt&gt;.
; bool SameSpeciesAs( [[Legacy:Pawn|Pawn]] P ) : Returns true if P and this Monster are of the same class (or subclass).
; AssignInitialPose() (simualted) : Calls &lt;tt&gt;TweenAnim(MovementAnims[0],0.0)&lt;/tt&gt;.
; PlayChallengeSound() : Calls &lt;tt&gt;PlaySound(ChallengeSound[Rand(4)],SLOT_Talk)&lt;/tt&gt;.
; Destroyed() : Destroys MyAmmo (if any) before calling &lt;tt&gt;Super.Destroyed()&lt;/tt&gt;.
; PlayVictory() : EMPTY
; AnimEnd( int Channel ) (simulated) : Calls &lt;tt&gt;PlayVictory()&lt;/tt&gt; if bVictoryNext is true and Physics is not PHYS_Falling, otherwise sets bShotAnim and Controller.bPreparingMove to false.  Calls &lt;tt&gt;Super.AnimEnd(Channel)&lt;/tt&gt;.
; SetMovementPhysics() : Calls &lt;tt&gt;SetPhysics(PHYS_Falling)&lt;/tt&gt;.
; bool IsPlayerPawn() : Returns true so it can use [[Legacy:Mover|Mover]]s.
; PlayTakeHit( vector HitLocation, int Damage, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType ) : If not sooner than MinTimeBetweenPainSounds, sets LastPainSound and calls &lt;tt&gt;PlaySound(HitSound[Rand(4)], SLOT_Pain,2*TransientSoundVolume,,400)&lt;/tt&gt;.
; PlayDying( class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, vector HitLoc ) (simulated) : Sets bCanTeleport and bReplicateMovement to false, sets bTearOff and bPlayedDeath to true.  Sets Lifespan to RagdollLifeSpan and switches state to &quot;Dying&quot;.  Adds TearOffMomentum to Velocity, sets default BaseEyeHeight, calls &lt;tt&gt;SetInvisibility(0.0)&lt;/tt&gt;, &lt;tt&gt;PlayDirectionalDeath(HitLoc)&lt;/tt&gt; and &lt;tt&gt;SetPhysics(PHYS_Falling)&lt;/tt&gt;.
; PlayDyingSound() : If bGibbed, calls &lt;tt&gt;PlaySound(GibGroupClass.static.GibSound(), SLOT_Pain,2.5*TransientSoundVolume,true,500)&lt;/tt&gt;.  Calls &lt;tt&gt;PlaySound(DeathSound[Rand(4)], SLOT_Pain,2.5*TransientSoundVolume, true,500)&lt;/tt&gt;.
;  bool MeleeDamageTarget( int hitdamage, vector pushdir ) : Uses a Trace function to determine if Controller.Target is within melee range and returns true if it is.
; PlayVictoryAnimation() : Sets bVictoryNext to true.
; CreateGib( name boneName, class&lt;[[Legacy:DamageType|DamageType]]&gt; DamageType, rotator r ) : If &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, fills HitFX[] properties with an additional array member.
; ProcessHitFX() (simulated) : If &lt;tt&gt;Level.NetMode&lt;/tt&gt; is not a DedicatedServer and &lt;tt&gt;GameInfo.UseLowGore()&lt;/tt&gt; returns false, spawns gibs for each valid part of the Monster.
; StartDeRes() (simulated) : If &lt;tt&gt;Level.NetMode&lt;/tt&gt; is not a DedicatedServer, sets full AmbientGlow, zero MaxLights, Skins to DeResMat0 and DeResMat1, Collision to none, removes and disallows projectors, deactivates the player shadow, calls &lt;tt&gt;RemoveFlamingEffects()&lt;/tt&gt;, removes any material overlays and sets bDeRes to true.

==Events==
; PostBeginPlay() : After &lt;tt&gt;Super.PostBeginPlay()&lt;/tt&gt;, spawns Controller from ControllerClass, calls &lt;tt&gt;Controller.Possess(self)&lt;/tt&gt;, spawns MyAmmo from AmmunitionClass.
; SetAnimAction( name NewAction ) (simulated) : If bWaitForAnim is false and Level.NetMode is NM_Client, set AnimAction to NewAction and then if &lt;tt&gt;PlayAnim(AnimAction,,0.1)&lt;/tt&gt; returns true and &lt;tt&gt;(Physics != PHYS_None)&lt;/tt&gt;, then set bWaitForAnim to true.

==States==

===Dying===
: Ignores the following: AnimEnd, Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling and BreathTimer.

====Functions====
; Landed() : Calls &lt;tt&gt;SetPhysics(PHYS_None)&lt;/tt&gt; and if &lt;tt&gt;IsAnimating(0)&lt;/tt&gt; returns false, calls LandThump() before calling &lt;tt&gt;Super.Landed(HitNormal)&lt;/tt&gt;.
; Timer() : Checks to see if &lt;tt&gt;PlayerCanSeeMe()&lt;/tt&gt; returns false to call &lt;tt&gt;Destroy()&lt;/tt&gt;, otherwise if &lt;tt&gt;(LifeSpan &lt;= DeResTime)&lt;/tt&gt; and bDeRes is false, it calls &lt;tt&gt;StartDeRes()&lt;/tt&gt;, otherwise is calls &lt;tt&gt;SetTimer(1.0, false)&lt;/tt&gt;.

==Known Subclasses==

'''Note:''' In UT, all Monsters are a subclass of [[Legacy:ScriptedPawn|ScriptedPawn]].

 Monster
     +- [[Legacy:Brute|Brute]]
     |    +- LesserBrute (UT only)
     |    +- [[Legacy:Behemoth|Behemoth]]
     +- [[Legacy:Gasbag|Gasbag]]
     +- [[Legacy:Krall|Krall]]
     |    +- [[Legacy:EliteKrall|EliteKrall]]
     +- [[Legacy:Manta|Manta]]
     +- [[Legacy:Fly|Fly]] (aka Razorfly)
     +- [[Legacy:Skaarj|Skaarj]]
     |    +- [[Legacy:FireSkaarj|FireSkaarj]] (UT2004 only)
     |    +- [[Legacy:IceSkaarj|IceSkaarj]] (UT2004 only)
     |    +- SkaarjTrooper (UT only)
     |    |   +- SkaarjGunner
     |    |   +- SkaarjInfantry
     |    |   +- SkaarjOfficer
     |    |   +- SkaarjSniper
     |    +- SkaarjWarrior (UT only)
     |        +- [[Legacy:IceSkaarj|IceSkaarj]]
     |        +- SkaarjAssassin
     |        +- SkaarjBeserker
     |        +- SkaarjLord
     |        +- SkaarjScout
     +- [[Legacy:Pupae|Pupae]] (aka SkaarjPupae)
     +- [[Legacy:Warlord|Warlord]]

==Related Topics==
* [[Legacy:MonsterController|MonsterController]]
* [[Legacy:Invasion|Invasion]] &amp;ndash; The [[Legacy:GameInfo|GameInfo]] class that handles Monsters in UT2004
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic for all AI (bots, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; Hub for monster support
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Design and creation of custom NPCs

==Discussion==

'''SuperApe:''' Created.

[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Monster Arena Mapping</title>
    <id>2208</id>
    <revision>
      <id>5346</id>
      <timestamp>2004-12-19T16:16:30Z</timestamp>
      <contributor>
        <ip>ACBE8A2B.ipt.aol.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Monster Arena is a part of Monsterhunt. You can download Monsterhunt from http://www.thegamebox.net/files/Unreal_Tournament/Mods/monsterhunt500.zip

===Mapping For Monster Arena===

===Taken From The Creators Website (Now Down)===

====Tips For Creating a Succesful MA map====

*The same rules that apply to Monster Hunt maps apply to Monster Arena maps as well, but there are a few more things to keep in mind: 

*Make sure you create a small protected area somewhere in the map that the players can safely spawn in, you can even seal it off by using a door. 

*You should provide the players with some guns in the protected area but don't give them too many and make sure the weapons suit the arena and the monster to be killed. 

*Place as much health and ammo around the arena as you like. 

*Give the players lots of place to move in, and make sure the boss can't get stuck anywhere. 

*Place a MonsterArenaEnd trigger in the map (found in the classes browser: Triggers -&gt; Trigger -&gt; MonsterEnd -&gt; MonsterArenaEnd) and set an Event for the boss and set the Tag of the MonsterArenaEnd to corrospond with the boss' Event. (IMPORTANT! - Make sure you add the trigger in the centre of the map using the Top View) 

----

See also, [[Legacy:Mapping For Monster Hunt|Mapping For Monster Hunt]]

----

====Category====
[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5347</id>
      <timestamp>2004-12-19T16:07:55Z</timestamp>
      <contributor>
        <ip>ACBE8A2B.ipt.aol.com</ip>
      </contributor>
      <comment>Created page showing how to create a succesful Monster Arena Map</comment>
      <text xml:space="preserve">Monster Arena is a part of Monsterhunt. You can download Monsterhunt from http://www.thegamebox.net/files/Unreal_Tournament/Mods/monsterhunt500.zip

===Mapping For Monster Arena===

===Taken From The Creators Website (Now Down)===

====Tips For Creating a Succesful MA map====

*The same rules that apply to Monster Hunt maps apply to Monster Arena maps as well, but there are a few more things to keep in mind: 

*Make sure you create a small protected area somewhere in the map that the players can safely spawn in, you can even seal it off by using a door. 

*You should provide the players with some guns in the protected area but don't give them too many and make sure the weapons suit the arena and the monster to be killed. 

*Place as much health and ammo around the arena as you like. 

*Give the players lots of place to move in, and make sure the boss can't get stuck anywhere. 

*Place a MonsterArenaEnd trigger in the map (found in the classes browser: Triggers -&gt; Trigger -&gt; MonsterEnd -&gt; MonsterArenaEnd) and set an Event for the boss and set the Tag of the MonsterArenaEnd to corrospond with the boss' Event. (IMPORTANT! - Make sure you add the trigger in the centre of the map using the Top View) 

----

See also, [[Legacy:Mapping For Monster Hunt|Mapping For Monster Hunt]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Monster Support</title>
    <id>2098</id>
    <revision>
      <id>5110</id>
      <timestamp>2006-09-26T23:40:48Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the main topic for Monster Support.  Monsters are defined as Non-Player Characters whose sole purpose is to hunt down and attack player enemies.

==Overview==

In UT, [[Legacy:ScriptedPawn|ScriptedPawn]]s handled the AI for NPCs, including Monsters.  In UT200x, this scheme was replaced with the coordination of a [[Legacy:Pawn|Pawn]] class and a Controller ([[Legacy:ScriptedController|ScriptedController]]) class.  In UT2004, Monsters (available in the [[Legacy:Invasion|Invasion]] gametype) are implemented with a [[Legacy:Monster|Monster]] subclass and a [[Legacy:MonsterController|MonsterController]].

==Tutorials==
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial that sets up a UT NPC (Monster) via ScriptedPawn.
* [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial to implement UT2004 Monsters for any gametype.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic on all AI (bots, NPCs, etc)
** [[Legacy:Bot Support (UT)|Bot Support (UT)]] &amp;ndash; ''There's some ScriptedPawn stuff on this page.''
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Design and creation of custom NPCs
* [[Legacy:ScriptedPawn|ScriptedPawn]]s (Unreal Monster parent class)
** [[Legacy:AlarmPoint|AlarmPoint]]
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; Exploration of a custom Monster AI construct
** [[Legacy:Basic Pawn Scripting Tutorial|Basic Pawn Scripting Tutorial]]
** [[Legacy:Pawn Scripting Reference|Pawn Scripting Reference]] and [[Legacy:AI Scripting Reference|AI Scripting Reference]] (identical pages)
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
** Using a [[Legacy:ScriptedSequence|ScriptedSequence]] to create MonsterFactories
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.
* [[Legacy:Monster|Monster]] (UT2004 Monster Pawn parent class)
** [[Legacy:MonsterController|MonsterController]] (UT2004 Controller class for Monsters)

===Custom Content===
* [[Legacy:SuperApe/Old_Skool_Monsta_Toolz|Old Skool Monsta Toolz]] &amp;ndash; A mod/mapping toolset for implementing complex monster behavior in UT2004.

==Discussion==

'''SuperApe:''' Reworked.  What do you think?

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; Lots of work to do. (see discussion above)
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5111</id>
      <timestamp>2005-12-15T20:23:30Z</timestamp>
      <contributor>
        <ip>192.251.69.127</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the main topic for Monster Support.  Monsters are defined as Non-Player Characters whose sole purpose is to hunt down and attack player enemies.

==Overview==

In UT, [[Legacy:ScriptedPawn|ScriptedPawn]]s handled the AI for NPCs, including Monsters.  In UT200x, this scheme was replaced with the coordination of a [[Legacy:Pawn|Pawn]] class and a Controller ([[Legacy:ScriptedController|ScriptedController]]) class.  In UT2004, Monsters (available in the [[Legacy:Invasion|Invasion]] gametype) are implemented with a [[Legacy:Monster|Monster]] subclass and a [[Legacy:MonsterController|MonsterController]].

==Tutorials==
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial that sets up a UT NPC (Monster) via ScriptedPawn.
* [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial to implement UT2004 Monsters for any gametype.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic on all AI (bots, NPCs, etc)
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Design and creation of custom NPCs
* [[Legacy:ScriptedPawn|ScriptedPawn]]s (Unreal Monster parent class)
** [[Legacy:AlarmPoint|AlarmPoint]]
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:AI Scripting Reference|AI Scripting Reference]]
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; Exploration of a custom Monster AI construct
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
** Using a [[Legacy:ScriptedSequence|ScriptedSequence]] to create MonsterFactories
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.
* [[Legacy:Monster|Monster]] (UT2004 Monster Pawn parent class)
** [[Legacy:MonsterController|MonsterController]] (UT2004 Controller class for Monsters)

==Discussion==

'''SuperApe:''' Wow, this pages needs ... everything.  I kinda wish someone who's worked with this in UT would write up the tutorial on [[Legacy:ScriptedPawn|ScriptedPawn]].

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; Lots of work to do. (see discussion above)
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5112</id>
      <timestamp>2006-01-09T18:10:41Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This is the main topic for Monster Support.  Monsters are defined as Non-Player Characters whose sole purpose is to hunt down and attack player enemies.

==Overview==

In UT, [[Legacy:ScriptedPawn|ScriptedPawn]]s handled the AI for NPCs, including Monsters.  In UT200x, this scheme was replaced with the coordination of a [[Legacy:Pawn|Pawn]] class and a Controller ([[Legacy:ScriptedController|ScriptedController]]) class.  In UT2004, Monsters (available in the [[Legacy:Invasion|Invasion]] gametype) are implemented with a [[Legacy:Monster|Monster]] subclass and a [[Legacy:MonsterController|MonsterController]].

==Tutorials==
* [[Legacy:Basic ScriptedPawn Tutorial|Basic ScriptedPawn Tutorial]] &amp;ndash; A tutorial that sets up a UT NPC (Monster) via ScriptedPawn.
* [[Legacy:A UT2004 Monster Tutorial|A UT2004 Monster Tutorial]] &amp;ndash; A tutorial to implement UT2004 Monsters for any gametype.

==Related Topics==
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; Super topic on all AI (bots, NPCs, etc)
** [[Legacy:Bot Support (UT)|Bot Support (UT)]] &amp;ndash; ''There's some ScriptedPawn stuff on this page.''
** [[Legacy:NPC Support|NPC Support]] &amp;ndash; Design and creation of custom NPCs
* [[Legacy:ScriptedPawn|ScriptedPawn]]s (Unreal Monster parent class)
** [[Legacy:AlarmPoint|AlarmPoint]]
** [[Legacy:Pawn (UT)/AI Functions|Pawn (UT)/AI Functions]]
** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; Exploration of a custom Monster AI construct
** [[Legacy:Basic Pawn Scripting Tutorial|Basic Pawn Scripting Tutorial]]
** [[Legacy:Pawn Scripting Reference|Pawn Scripting Reference]] and [[Legacy:AI Scripting Reference|AI Scripting Reference]] (identical pages)
* [[Legacy:AIScript|AIScript]]
** [[Legacy:ScriptedSequence|ScriptedSequence]]
** Using a [[Legacy:ScriptedSequence|ScriptedSequence]] to create MonsterFactories
*** [[Legacy:UnrealScriptedSequence|UnrealScriptedSequence]] &amp;ndash; Using ScriptedActions on Pawns
* [[Legacy:Creating And Using ScriptedActions|Creating and using ScriptedActions]]
* A complete list of [[Legacy:ScriptedAction|ScriptedAction]]s.
* [[Legacy:Monster|Monster]] (UT2004 Monster Pawn parent class)
** [[Legacy:MonsterController|MonsterController]] (UT2004 Controller class for Monsters)

==Discussion==

'''SuperApe:''' Wow, this pages needs ... everything.  I kinda wish someone who's worked with this in UT would write up the tutorial on [[Legacy:ScriptedPawn|ScriptedPawn]].

----

[[:Category:Legacy Mapping]]

[[:Category:Legacy To Do]] &amp;ndash; Lots of work to do. (see discussion above)
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MonsterController</title>
    <id>2223</id>
    <revision>
      <id>5380</id>
      <timestamp>2007-11-09T13:47:04Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <comment>removed comments on *bot* AI, as they are not the same as *monster* AI, -SuperApe</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; MonsterController (Package: SkaarjPack)}}

Simple AI that always hunts down players as enemies.

// note ut2004 monster controller code is just about identical

// but ut2004 has a problem a serious one the monsters jump though states too fast 

// and will crash the entire game by calling the find new enemy function untill the recursions exceed 10000

==Properties==

All MonsterController properties are hidden.

===Magic numbers===

(from remark in code) &quot;Distance based, so scale to bot speed/weapon range&quot;
; MAXSTAKEOUTDIST = 2000 (const)
; ENEMYLOCATIONFUZZ = 1200 (const)
; TACTICALHEIGHTADVANTAGE = 320 (const)
; MINSTRAFEDIST = 200 (const)
; MINVIEWDIST = 200 (const)

===Flags===
; bool bCanFire : Used by TacticalMove and Charging states
; bool bStrafeDir :
; bool bLeadTarget : Lead target with projectile attack
; bool bChangeDir : Tactical move boolean
; bool bEnemyIsVisible :
; bool bMustCharge :
; bool bJustLanded :
; bool bRecommendFastMove :
; bool bHasFired :
; bool bForcedDirection :

===Advanced AI===
; float AcquireTime : Time at which current enemy was acquired
; float LoseEnemyCheckTime : ''Not implemented.''
; float StartTacticalTime :
; vector HidingSpot :
; float ChallengeTime :

===Modifiable AI===
; float Accuracy : -1 to 1 (0 is default, higher is more accurate)
; float StrafingAbility : -1 to 1 (higher uses strafing more)
; float CombatStyle : -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee
; float ReactionTime :

===Team AI===
; string GoalString : For debugging - used to show what bot is thinking (with 'ShowDebug')
; string SoakString : For debugging - shows problem when soaking

===Used in ChooseAttackMode() State===
; int ChoosingAttackLevel :
; float ChooseAttackTime :
; int ChooseAttackCounter :
; float EnemyVisibilityTime :
; Pawn VisibleEnemy :
; Pawn OldEnemy :
; float StopStartTime :
; float LastRespawnTime :
; float FailedHuntTime :
; Pawn FailedHuntEnemy :

===Miscellaneous===
; int NumRandomJumps : Attempts to free monster from being stuck

==Functions==

(incomplete)
; Trigger( Actor Other, Pawn EventInstigator ) : If Other is a Pawn and &lt;tt&gt;Pawn.Health &gt;= 0&lt;/tt&gt;, calls &lt;tt&gt;SetEnemy( EventInstigator, true )&lt;/tt&gt;.
; FightEnemy( bool bCanCharge ) : Decides how to attack: Hunt, StakeOut, Melee, Ranged, etc.  Also performs a &quot;teleport&quot; ''(SetLocation() to a PlayerStart)'', if the &lt;tt&gt;FailedHuntTime&lt;/tt&gt; is reached and the controlled Pawn not currently seen by the enemy.
; ChooseAttackMode() : Handles tactical attacking state selection - choose which type of attack to do from here.
; bool FindBestPathToward( [[Legacy:Actor|Actor]] A, bool bCheckedReach, bool bAllowDetour ) : Assumes the desired destination is not directly reachable.  It tries to set Destination to the location of the best waypoint, and returns true if successful.
; bool NearWall( float walldist ) : Returns true if there is a nearby barrier at eyeheight, and changes FocalPoint to a suggested place to look.
; rotator AdjustAim( [[Legacy:FireProperties|FireProperties]] FiredAmmunition, vector projStart, int aimerror ) : Returns a rotation which is the direction the bot should aim - after introducing the appropriate aiming error.
; bool Formation() : Returns false.
; DoStakeOut() : Switches to state StakeOut.
; DoCharge() : If in WaterVolume and &lt;tt&gt;bCanSwim&lt;/tt&gt; is false or if &lt;tt&gt;bCanFly&lt;/tt&gt; and &lt;tt&gt;bCanWalk&lt;/tt&gt; are false, calls &lt;tt&gt;DoTacticalMove()&lt;/tt&gt;.  Otherwise, switches to state Charging.
; DoTacticalMove() : Switches to state TacticalMove.
; bool DefendMelee( float Dist ) : Return true if defending against melee attack.
; bool IsStrafing() : Returns false.
; bool IsHunting() : Returns false.
; bool Stopped() : Returns &lt;tt&gt;bPreparingMove&lt;/tt&gt;.
; GameHasEnded() : EMPTY

==States==

===NoGoal===
: EMPTY

===RestFormation===
: Ignores EnemyNotVisible().  Calls &lt;tt&gt;WaitForLanding()&lt;/tt&gt;.

====Functions====
; CancelCampFor( Controller C ) : Calls &lt;tt&gt;DirectedWander(Normal(Pawn.Location - C.Pawn.Location))&lt;/tt&gt;.
; bool Formation() : Returns true.
; Timer() : Calls &lt;tt&gt;&lt;/tt&gt; and enables NotifyBump.
; PickDestination() : If &lt;tt&gt;TestDirection(VRand(),Destination)&lt;/tt&gt;, return.  Otherwise, call &lt;tt&gt;TestDirection(VRand(),Destination)&lt;/tt&gt;.
; BeginState() : Sets &lt;tt&gt;Enemy = None&lt;/tt&gt;, &lt;tt&gt;Pawn.bCanJump = false&lt;/tt&gt;, &lt;tt&gt;Pawn.bAvoidLedges = true&lt;/tt&gt;, &lt;tt&gt;Pawn.bStopAtLedges = true&lt;/tt&gt;, calls &lt;tt&gt;Pawn.SetWalking(true)&lt;/tt&gt; and sets &lt;tt&gt;MinHitWall += 0.15&lt;/tt&gt;.
; EndState() : Sets &lt;tt&gt;MonitoredPawn = None&lt;/tt&gt; and &lt;tt&gt;MinHitWall -= 0.15&lt;/tt&gt;.  If &lt;tt&gt;Pawn != None&lt;/tt&gt;, sets &lt;tt&gt;Pawn.bStopAtLedges = false&lt;/tt&gt; and &lt;tt&gt;Pawn.bAvoidLedges = false&lt;/tt&gt;, calls &lt;tt&gt;Pawn.SetWalking(false)&lt;/tt&gt; and if &lt;tt&gt;Pawn.JumpZ &gt; 0&lt;/tt&gt;, sets &lt;tt&gt;Pawn.bCanJump = true&lt;/tt&gt;.

====Events====
; MonitoredPawnAlert() : Calls &lt;tt&gt;WhatToDoNext(6)&lt;/tt&gt;.
; '''''Begin''''' : Calls &lt;tt&gt;WaitForLanding();&lt;/tt&gt; ...
; '''''Camping''''' : Sets &lt;tt&gt;Pawn.Acceleration = vect(0,0,0)&lt;/tt&gt;, &lt;tt&gt;Focus = None&lt;/tt&gt;, &lt;tt&gt;FocalPoint = VRand()&lt;/tt&gt;.  Calls &lt;tt&gt;NearWall(MINVIEWDIST)&lt;/tt&gt;, &lt;tt&gt;FinishRotation()&lt;/tt&gt; and &lt;tt&gt;Sleep(3 + FRand())&lt;/tt&gt; ...
; '''''Moving''''' : Calls &lt;tt&gt;WaitForLanding()&lt;/tt&gt; and &lt;tt&gt;PickDestination()&lt;/tt&gt; ...
; '''''WaitForAnim''''' : If &lt;tt&gt;Monster(Pawn).bShotAnim&lt;/tt&gt;, calls &lt;tt&gt;Sleep(0.5)&lt;/tt&gt; and goes to WaitForAnim.  Calls &lt;tt&gt;MoveTo(Destination,,true)&lt;/tt&gt;.  If &lt;tt&gt;Pawn.bCanFly&lt;/tt&gt; and &lt;tt&gt;Physics == PHYS_Walking&lt;/tt&gt;, calls &lt;tt&gt;SetPhysics(PHYS_Flying)&lt;/tt&gt;.  Calls &lt;tt&gt;WhatToDoNext(8)&lt;/tt&gt;.  Goes to Begin.

===MoveToGoal===

===MoveToGoalNoEnemy extends MoveToGoal===
: EMPTY

===MoveToGoalWithEnemy extends MoveToGoal===
: When Timer() is called, calls &lt;tt&gt;TimedFireWeaponAtEnemy()&lt;/tt&gt;.

===Roaming extends MoveToGoalNoEnemy===
: Ignores EnemyNotVisible.
; '''''Begin''''' : Calls &lt;tt&gt;SwitchToBestWeapon()&lt;/tt&gt;, &lt;tt&gt;WaitForLanding()&lt;/tt&gt; and &lt;tt&gt;MoveToward(MoveTarget,FaceActor(1),,ShouldStrafeTo(MoveTarget))&lt;/tt&gt;.
; '''''DoneRoaming''''' :

===Charging extends MoveToGoalWithEnemy===
: Ignores SeePlayer and HearNoise.
; '''''Begin''''' :
; '''''WaitForAnim''''' :
; '''''Moving''''' :

===TacticalMove ===
: Ignores SeePlayer and HearNoise.
; '''''TacticalTick''''' :
; '''''Begin''''' :
; '''''DoMove''''' :
; '''''WaitForAnim''''' :
; '''''DoStrafeMove''''' :
; '''''RecoverEnemy''''' :
; '''''FinishedStrafe''''' :

===Hunting extends MoveToGoalWithEnemy ===
: Ignores EnemyNotVisible.
; '''''AdjustFromWall''''' :
; '''''Begin''''' :
; '''''WaitForAnim''''' :
; '''''SpecialNavig''''' : 

===StakeOut ===
: Ignores EnemyNotVisible. 
; '''''Begin''''' :

===RangedAttack ===
: Ignores SeePlayer, HearNoise and Bump.
; '''''Begin''''' :

===WaitForAnim ===
: Ignores SeePlayer, HearNoise, KilledBy, NotifyBump, HitWall, NotifyPhysicsVolumeChange, NotifyHeadVolumeChange, Falling, TakeDamage and ReceiveWarning.

====Events====
; AnimEnd( int Channel ) : Calls &lt;tt&gt;Pawn.AnimEnd(Channel)&lt;/tt&gt;.  If &lt;tt&gt;!Monster(Pawn).bShotAnim&lt;/tt&gt;, calls &lt;tt&gt;WhatToDoNext(99)&lt;/tt&gt;.

===WaitingForLanding===

====Functions====
; bool DoWaitForLanding() :
; bool NotifyLanded( vector HitNormal ) :
; Timer() : If &lt;tt&gt;Focus == Enemy&lt;/tt&gt;, call &lt;tt&gt;TimedFireWeaponAtEnemy()&lt;/tt&gt;, else call &lt;tt&gt;SetCombatTimer()&lt;/tt&gt;.
; BeginState() : Set &lt;tt&gt;bJustLanded = false&lt;/tt&gt;.  If &lt;tt&gt;MoveTarget != None&lt;/tt&gt; and &lt;tt&gt;Enemy == None&lt;/tt&gt; or &lt;tt&gt;Focus != Enemy&lt;/tt&gt;, set &lt;tt&gt;FaceActor(1.5)&lt;/tt&gt;.  If &lt;tt&gt;Enemy == None&lt;/tt&gt; or &lt;tt&gt;Focus != Enemy&lt;/tt&gt;, call &lt;tt&gt;StopFiring()&lt;/tt&gt;.

==Related Topics==
* [[Legacy:Monster|Monster]]
* [[Legacy:Controller Overview|Controller Overview]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] - Super topic for all AI (bots, Monsters, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]]

==Discussion==

'''SuperApe:''' Created.  Could use brief definitions of each state.  Rest of functions need to be added.

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Finish state definitions.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5381</id>
      <timestamp>2007-11-09T01:25:43Z</timestamp>
      <contributor>
        <ip>C-76-117-131-41.hsd1.pa.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Controller|Controller]] &gt;&gt; [[Legacy:AIController|AIController]] &gt;&gt; [[Legacy:ScriptedController|ScriptedController]] &gt;&gt; MonsterController (Package: SkaarjPack)}}

Simple AI that always hunts down players as enemies.

// note ut2004 monster controller code is just about identical

// but ut2004 has a problem a serious one the monsters jump though states too fast 

// and will crash the entire game by calling the find new enemy function untill the recursions exceed 10000

==Properties==

All MonsterController properties are hidden.

===Magic numbers===

(from remark in code) &quot;Distance based, so scale to bot speed/weapon range&quot;
; MAXSTAKEOUTDIST = 2000 (const)
; ENEMYLOCATIONFUZZ = 1200 (const)
; TACTICALHEIGHTADVANTAGE = 320 (const)
; MINSTRAFEDIST = 200 (const)
; MINVIEWDIST = 200 (const)

===Flags===
; bool bCanFire : Used by TacticalMove and Charging states
; bool bStrafeDir :
; bool bLeadTarget : Lead target with projectile attack
; bool bChangeDir : Tactical move boolean
; bool bEnemyIsVisible :
; bool bMustCharge :
; bool bJustLanded :
; bool bRecommendFastMove :
; bool bHasFired :
; bool bForcedDirection :

===Advanced AI===
; float AcquireTime : Time at which current enemy was acquired
; float LoseEnemyCheckTime : ''Not implemented.''
; float StartTacticalTime :
; vector HidingSpot :
; float ChallengeTime :

===Modifiable AI===
; float Accuracy : -1 to 1 (0 is default, higher is more accurate)
; float StrafingAbility : -1 to 1 (higher uses strafing more)
; float CombatStyle : -1 to 1 = low means tends to stay off and snipe, high means tends to charge and melee
; float ReactionTime :

===Team AI===
; string GoalString : For debugging - used to show what bot is thinking (with 'ShowDebug')
; string SoakString : For debugging - shows problem when soaking

===Used in ChooseAttackMode() State===
; int ChoosingAttackLevel :
; float ChooseAttackTime :
; int ChooseAttackCounter :
; float EnemyVisibilityTime :
; Pawn VisibleEnemy :
; Pawn OldEnemy :
; float StopStartTime :
; float LastRespawnTime :
; float FailedHuntTime :
; Pawn FailedHuntEnemy :

===Miscellaneous===
; int NumRandomJumps : Attempts to free monster from being stuck

==Functions==

(incomplete)
; Trigger( Actor Other, Pawn EventInstigator ) : If Other is a Pawn and &lt;tt&gt;Pawn.Health &gt;= 0&lt;/tt&gt;, calls &lt;tt&gt;SetEnemy( EventInstigator, true )&lt;/tt&gt;.
; FightEnemy( bool bCanCharge ) : Decides how to attack: Hunt, StakeOut, Melee, Ranged, etc.  Also performs a &quot;teleport&quot; ''(SetLocation() to a PlayerStart)'', if the &lt;tt&gt;FailedHuntTime&lt;/tt&gt; is reached and the controlled Pawn not currently seen by the enemy.
; ChooseAttackMode() : Handles tactical attacking state selection - choose which type of attack to do from here.
; bool FindBestPathToward( [[Legacy:Actor|Actor]] A, bool bCheckedReach, bool bAllowDetour ) : Assumes the desired destination is not directly reachable.  It tries to set Destination to the location of the best waypoint, and returns true if successful.
; bool NearWall( float walldist ) : Returns true if there is a nearby barrier at eyeheight, and changes FocalPoint to a suggested place to look.
; rotator AdjustAim( [[Legacy:FireProperties|FireProperties]] FiredAmmunition, vector projStart, int aimerror ) : Returns a rotation which is the direction the bot should aim - after introducing the appropriate aiming error.
; bool Formation() : Returns false.
; DoStakeOut() : Switches to state StakeOut.
; DoCharge() : If in WaterVolume and &lt;tt&gt;bCanSwim&lt;/tt&gt; is false or if &lt;tt&gt;bCanFly&lt;/tt&gt; and &lt;tt&gt;bCanWalk&lt;/tt&gt; are false, calls &lt;tt&gt;DoTacticalMove()&lt;/tt&gt;.  Otherwise, switches to state Charging.
; DoTacticalMove() : Switches to state TacticalMove.
; bool DefendMelee( float Dist ) : Return true if defending against melee attack.
; bool IsStrafing() : Returns false.
; bool IsHunting() : Returns false.
; bool Stopped() : Returns &lt;tt&gt;bPreparingMove&lt;/tt&gt;.
; GameHasEnded() : EMPTY

==States==

===NoGoal===
: EMPTY

===RestFormation===
: Ignores EnemyNotVisible().  Calls &lt;tt&gt;WaitForLanding()&lt;/tt&gt;.

note&gt;Vaptor: this state is used usally in bot class and is involved when theres nothing to do 

and its in a formation cancel camp is used to make them move as a group

====Functions====
; CancelCampFor( Controller C ) : Calls &lt;tt&gt;DirectedWander(Normal(Pawn.Location - C.Pawn.Location))&lt;/tt&gt;.
; bool Formation() : Returns true.
; Timer() : Calls &lt;tt&gt;&lt;/tt&gt; and enables NotifyBump.
; PickDestination() : If &lt;tt&gt;TestDirection(VRand(),Destination)&lt;/tt&gt;, return.  Otherwise, call &lt;tt&gt;TestDirection(VRand(),Destination)&lt;/tt&gt;.
; BeginState() : Sets &lt;tt&gt;Enemy = None&lt;/tt&gt;, &lt;tt&gt;Pawn.bCanJump = false&lt;/tt&gt;, &lt;tt&gt;Pawn.bAvoidLedges = true&lt;/tt&gt;, &lt;tt&gt;Pawn.bStopAtLedges = true&lt;/tt&gt;, calls &lt;tt&gt;Pawn.SetWalking(true)&lt;/tt&gt; and sets &lt;tt&gt;MinHitWall += 0.15&lt;/tt&gt;.
; EndState() : Sets &lt;tt&gt;MonitoredPawn = None&lt;/tt&gt; and &lt;tt&gt;MinHitWall -= 0.15&lt;/tt&gt;.  If &lt;tt&gt;Pawn != None&lt;/tt&gt;, sets &lt;tt&gt;Pawn.bStopAtLedges = false&lt;/tt&gt; and &lt;tt&gt;Pawn.bAvoidLedges = false&lt;/tt&gt;, calls &lt;tt&gt;Pawn.SetWalking(false)&lt;/tt&gt; and if &lt;tt&gt;Pawn.JumpZ &gt; 0&lt;/tt&gt;, sets &lt;tt&gt;Pawn.bCanJump = true&lt;/tt&gt;.

====Events====
; MonitoredPawnAlert() : Calls &lt;tt&gt;WhatToDoNext(6)&lt;/tt&gt;.
; '''''Begin''''' : Calls &lt;tt&gt;WaitForLanding();&lt;/tt&gt; ...
; '''''Camping''''' : Sets &lt;tt&gt;Pawn.Acceleration = vect(0,0,0)&lt;/tt&gt;, &lt;tt&gt;Focus = None&lt;/tt&gt;, &lt;tt&gt;FocalPoint = VRand()&lt;/tt&gt;.  Calls &lt;tt&gt;NearWall(MINVIEWDIST)&lt;/tt&gt;, &lt;tt&gt;FinishRotation()&lt;/tt&gt; and &lt;tt&gt;Sleep(3 + FRand())&lt;/tt&gt; ...
; '''''Moving''''' : Calls &lt;tt&gt;WaitForLanding()&lt;/tt&gt; and &lt;tt&gt;PickDestination()&lt;/tt&gt; ...
; '''''WaitForAnim''''' : If &lt;tt&gt;Monster(Pawn).bShotAnim&lt;/tt&gt;, calls &lt;tt&gt;Sleep(0.5)&lt;/tt&gt; and goes to WaitForAnim.  Calls &lt;tt&gt;MoveTo(Destination,,true)&lt;/tt&gt;.  If &lt;tt&gt;Pawn.bCanFly&lt;/tt&gt; and &lt;tt&gt;Physics == PHYS_Walking&lt;/tt&gt;, calls &lt;tt&gt;SetPhysics(PHYS_Flying)&lt;/tt&gt;.  Calls &lt;tt&gt;WhatToDoNext(8)&lt;/tt&gt;.  Goes to Begin.

===MoveToGoal===

===MoveToGoalNoEnemy extends MoveToGoal===
: EMPTY

===MoveToGoalWithEnemy extends MoveToGoal===
: When Timer() is called, calls &lt;tt&gt;TimedFireWeaponAtEnemy()&lt;/tt&gt;.

===Roaming extends MoveToGoalNoEnemy===
: Ignores EnemyNotVisible.
; '''''Begin''''' : Calls &lt;tt&gt;SwitchToBestWeapon()&lt;/tt&gt;, &lt;tt&gt;WaitForLanding()&lt;/tt&gt; and &lt;tt&gt;MoveToward(MoveTarget,FaceActor(1),,ShouldStrafeTo(MoveTarget))&lt;/tt&gt;.
; '''''DoneRoaming''''' :

===Charging extends MoveToGoalWithEnemy===
: Ignores SeePlayer and HearNoise.
; '''''Begin''''' :
; '''''WaitForAnim''''' :
; '''''Moving''''' :

===TacticalMove ===
: Ignores SeePlayer and HearNoise.
; '''''TacticalTick''''' :
; '''''Begin''''' :
; '''''DoMove''''' :
; '''''WaitForAnim''''' :
; '''''DoStrafeMove''''' :
; '''''RecoverEnemy''''' :
; '''''FinishedStrafe''''' :

===Hunting extends MoveToGoalWithEnemy ===
: Ignores EnemyNotVisible.
; '''''AdjustFromWall''''' :
; '''''Begin''''' :
; '''''WaitForAnim''''' :
; '''''SpecialNavig''''' : 

===StakeOut ===
: Ignores EnemyNotVisible. 
; '''''Begin''''' :

===RangedAttack ===
: Ignores SeePlayer, HearNoise and Bump.
; '''''Begin''''' :

===WaitForAnim ===
: Ignores SeePlayer, HearNoise, KilledBy, NotifyBump, HitWall, NotifyPhysicsVolumeChange, NotifyHeadVolumeChange, Falling, TakeDamage and ReceiveWarning.

====Events====
; AnimEnd( int Channel ) : Calls &lt;tt&gt;Pawn.AnimEnd(Channel)&lt;/tt&gt;.  If &lt;tt&gt;!Monster(Pawn).bShotAnim&lt;/tt&gt;, calls &lt;tt&gt;WhatToDoNext(99)&lt;/tt&gt;.

===WaitingForLanding===

====Functions====
; bool DoWaitForLanding() :
; bool NotifyLanded( vector HitNormal ) :
; Timer() : If &lt;tt&gt;Focus == Enemy&lt;/tt&gt;, call &lt;tt&gt;TimedFireWeaponAtEnemy()&lt;/tt&gt;, else call &lt;tt&gt;SetCombatTimer()&lt;/tt&gt;.
; BeginState() : Set &lt;tt&gt;bJustLanded = false&lt;/tt&gt;.  If &lt;tt&gt;MoveTarget != None&lt;/tt&gt; and &lt;tt&gt;Enemy == None&lt;/tt&gt; or &lt;tt&gt;Focus != Enemy&lt;/tt&gt;, set &lt;tt&gt;FaceActor(1.5)&lt;/tt&gt;.  If &lt;tt&gt;Enemy == None&lt;/tt&gt; or &lt;tt&gt;Focus != Enemy&lt;/tt&gt;, call &lt;tt&gt;StopFiring()&lt;/tt&gt;.

==Related Topics==
* [[Legacy:Monster|Monster]]
* [[Legacy:Controller Overview|Controller Overview]]
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] - Super topic for all AI (bots, Monsters, NPCs, etc)
** [[Legacy:Monster Support|Monster Support]]

==Discussion==

'''SuperApe:''' Created.  Could use brief definitions of each state.  Rest of functions need to be added.

----

[[:Category:Legacy Class (UT2003)]]

[[:Category:Legacy Class (UT2004)]]

[[:Category:Legacy To Do]] &amp;ndash; Finish state definitions.
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Monsto</title>
    <id>1769</id>
    <revision>
      <id>4340</id>
      <timestamp>2002-07-11T09:01:01Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Welcome to the Wiki.  :)  Feel free to add yourself to [[Legacy:Project Contributors|Project Contributors]].

'''ZxAnPhOrIaN:'''  Hey! Welcome to the wiki ;)

'''Tarquin:'''  Hi &amp; welcome. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4341</id>
      <timestamp>2002-07-10T23:23:55Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:'''  Welcome to the Wiki.  :)  Feel free to add yourself to [[Legacy:Project Contributors|Project Contributors]].

'''ZxAnPhOrIaN:'''  Hey! Welcome to the wiki ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Moo</title>
    <id>2216</id>
    <revision>
      <id>5364</id>
      <timestamp>2007-07-06T17:29:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted, some stupid kind of bot truncated page content</comment>
      <text xml:space="preserve">'''Moo''' is [[Legacy:Tarquin|Tarquin]]'s project for rewriting the wiki script in object-oriented perl.

It's got to the point where it looks like it could ''one day'' be viable, so I've moved it out of my personal space and removed the word 'lunatic' from the page name. It's still very early days though.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]] &amp;ndash; it runs, though it's not terribly useful
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Diary]]

----

'''Mychaeel:''' Within the next few days, a friend of mine, [[Legacy:Julian Mehnle|Julian Mehnle]], is going to release a wiki engine dubbed '''[http://www.bitshapers.com/thingy Thingy]''' on Debian which we both created on the basis of UseMod Wiki 1.0 and Wookee a while ago.

It's not a rewrite such as you are planning and implementing at the moment, and it doesn't have anything to do with the new wiki engine I've been pondering (under the working title '''Wiki++'''), but it contains a fair number of useful new functions not part of the UseMod original, including...

* Wookee (plus some extensions)
* display templates with embedded wiki pages for menu and toolbar (which users can individually override by their own subpages of their personal pages)
* a page creation template facility (with placeholders)
* a facility to integrate per-user write permissions with the webserver's authentication system
* an option to require people to set their user name before editing a page

I have, however, made Wookee along with quite a few extension modules (including WookeeModule which basically allows you to embed Perl classes into arbitrary pages) publicly available for that purpose:

: http://dev.bitshapers.com/svn/wookee/

This is now the &quot;official&quot; Wookee repository (not Unreal Wiki's CVS anymore).  Of course, feel free to take the modules from there yourself, and perhaps the WookeeModule concept will fit in nicely with Moo.  :-)

'''Tarquin:''' Nice! Sort of like Magic Pages, but... a whole lot better! It would fit very well into Moo. So far I had the vague idea of Generators that would do stuff like produce Recent Changes or Category lists, but I hadn't thought about how they would integrate with the markup module (and using #MAGIC only at the start of the markup is very primitive compared  to your system). Database is something I've not got very far on either. I've not planned beyond stuffing the code from UseMod into a class, and even that is something I keep putting off! What's your plan for a Subversion backend?

'''Mychaeel:''' Actually... I'm slowly moving away from that thought.  The Wiki++ concept is based on the fundamental idea of resources which are identified by a number of generic attributes, and only one of those is the page name (or URI, or whatever).  That means that several resources can have the same name (think &quot;page variants&quot; such as several languages translations; namespaces; engine versions; or any combination thereof), and that doesn't fit in well with the Subversion concept.  I'll set up a development wiki (a thingy, actually, once Julian has packed it up), and I'm going to start jotting down notes and ideas there shortly.

'''Tarquin:''' BTW, while you're still working on Wookee, could you take a look at WookeeTree please? I never worked out how to get Wookee to parse the text in the tree items for link for example. Feel free to use WookeeTree in your stuff if you like :)

'''Julian:''' Thingy has been released as version 1.100 and now has its own little [http://www.bitshapers.com/thingy website].  The latest version of Wookee is also there.  And Wookee's source code repository has moved to &lt;tt&gt;http://dev.bitshapers.com/svn/wookee/&lt;/tt&gt;.</text>
    </revision>
    <revision>
      <id>5365</id>
      <timestamp>2006-04-01T14:12:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">'''Moo''' is [[Legacy:Tarquin|Tarquin]]'s project for rewriting the wiki script in object-oriented perl.

It's got to the point where it looks like it could ''one day'' be viable, so I've moved it out of my personal space and removed the word 'lunatic' from the page name. It's still very early days though.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]] &amp;ndash; it runs, though it's not terribly useful
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Diary]]

----

'''Mychaeel:''' Within the next few days, a friend of mine, [[Legacy:Julian Mehnle|Julian Mehnle]], is going to release a wiki engine dubbed '''[http://www.mehnle.net/source/thingy/ Thingy]''' on Debian which we both created on the basis of UseMod Wiki 1.0 and Wookee a while ago.

It's not a rewrite such as you are planning and implementing at the moment, and it doesn't have anything to do with the new wiki engine I've been pondering (under the working title '''Wiki++'''), but it contains a fair number of useful new functions not part of the UseMod original, including...

* Wookee (plus some extensions)
* display templates with embedded wiki pages for menu and toolbar (which users can individually override by their own subpages of their personal pages)
* a page creation template facility (with placeholders)
* a facility to integrate per-user write permissions with the webserver's authentication system
* an option to require people to set their user name before editing a page

I have, however, made Wookee along with quite a few extension modules (including WookeeModule which basically allows you to embed Perl classes into arbitrary pages) publicly available for that purpose:

: http://home.buschbeck.net/svn/wookee/trunk/

This is now the &quot;official&quot; Wookee repository (not Unreal Wiki's CVS anymore).  Of course, feel free to take the modules from there yourself, and perhaps the WookeeModule concept will fit in nicely with Moo.  :-)

'''Tarquin:''' Nice! Sort of like Magic Pages, but... a whole lot better! It would fit very well into Moo. So far I had the vague idea of Generators that would do stuff like produce Recent Changes or Category lists, but I hadn't thought about how they would integrate with the markup module (and using #MAGIC only at the start of the markup is very primitive compared  to your system). Database is something I've not got very far on either. I've not planned beyond stuffing the code from UseMod into a class, and even that is something I keep putting off! What's your plan for a Subversion backend?

'''Mychaeel:''' Actually... I'm slowly moving away from that thought.  The Wiki++ concept is based on the fundamental idea of resources which are identified by a number of generic attributes, and only one of those is the page name (or URI, or whatever).  That means that several resources can have the same name (think &quot;page variants&quot; such as several languages translations; namespaces; engine versions; or any combination thereof), and that doesn't fit in well with the Subversion concept.  I'll set up a development wiki (a thingy, actually, once Julian has packed it up), and I'm going to start jotting down notes and ideas there shortly.

'''Tarquin:''' BTW, while you're still working on Wookee, could you take a look at WookeeTree please? I never worked out how to get Wookee to parse the text in the tree items for link for example. Feel free to use WookeeTree in your stuff if you like :)</text>
    </revision>
    <revision>
      <id>5366</id>
      <timestamp>2007-07-05T16:57:15Z</timestamp>
      <contributor>
        <ip>203.166.160.74</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Moo''' is [[Legacy:Tarquin|Tarquin]]'s project for rewriting the wiki script in object-oriented perl.

It's got to the point where it looks like it could ''one day'' be viable, so I've moved it out of my personal space and removed the word 'lunatic' from the page name. It's still very early days though.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Script]] &amp;ndash; it runs, though it's not terribly useful
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Diary]]

----

'''Mychaeel:''' Within the next few days, a friend of mine, [[Legacy:Julian Mehnle|Julian Mehnle]], is going to release a wiki engine dubbed '''[http://www.bitshapers.com/thingy Thingy]''' on Debian which we both created on the basis of UseMod Wiki 1.0 and Wookee a while ago.

It's not a rewrite such as you are planning and implementing at the moment, and it doesn't have anything to do with the new wiki engine I've been pondering (under the working title '''Wiki  '''), but it contains a fair number of useful new functions not part of the UseMod original, including...

* Wookee (plus some extensions)
* display templates with embedded wiki pages for menu and toolbar (which users can individually override by their own subpages of their personal pages)
* a page creation template facility (with placeholders)
* a facility to integrate per-user write permissions with the webserver's authentication system
* an option to require people to set their user name before editing a page

I have, however, made Wookee along with quite a few extension modules (including WookeeModule which basically allows you to embed Perl classes into arbitrary pages) publicly available for that purpose:

: http://dev.bitshapers.com/svn/wookee/

This is now the &quot;official&quot; Wookee repository (not Unreal Wiki's CVS anymore).  Of course, feel free to take the modules from there yourself, and perhaps the WookeeModule concept will fit in nicely with Moo.  :-)

'''Tarquin:''' Nice! Sort of like Magic Pages, but... a whole lot better! It would fit very well into Moo. So far I had the vague idea of Generators that would do stuff like produce Recent Changes or Category lists, but I hadn't thought about how they would integrate with the markup module (and using #MAGIC only at the start of the markup is very primitive compared  to your system). Database is something I've not got very far on either. I've not planned beyond stuffing the code from UseMod into a class, and even that is something I keep putting off! What's your plan for a Subversion backend?

'''Mychaeel:''' Actually... I'm slowly moving away from that thought.  The Wiki   concept is based on the fundamental idea of resources which are identified by a number of generic attributes, and only one of those is the page name (or URI, or whatever).  That means that several resources can have the same name (think &quot;page variants&quot; such as several languages translations</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Moo/Diary</title>
    <id>2217</id>
    <revision>
      <id>5367</id>
      <timestamp>2005-07-06T13:19:06Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==6 July 2005==

I went to take a look at [[MeatBall:InfiniteMonkey]]. Funny how you can miss totally obvious features, eg RSS output. This really amounts to a totally different output channel for the script. Then I read the bit about working with Wiki Clients, which adds a potential third channel.

So... do I add a level of abstraction in my Page hierarchy, like this:

+ Page

++ HtmlPage

+++ WikiHtmlPage

++++ usual classes

Or do I introduce Yet Another orthogonal class system of &quot;Output modules&quot; that provide wrapping to the Wiki output? These would be HTML and RSS initially, and WikiClient could be a plug-in later.

My gut instinct it to lean towards the 2nd option, even though it's a big change in how the script works and it's also a whole new class tree to think about. 

===HtmlPage class===

Pro:
* Relatively simple
* RssPage will have different children to a certain extent. Rss won't need things like a Diff page, or an Edit page and so on. So having a new branch of the Page class tree makes sense in this light. But...

Con:
* Some duplication of classes would occur: we'd basically have two RecentChangesPage classes. Would any other classes find themselves repeated? Certainly the ClientOutput would need things like old revisions and history list pages.

===New output classes===

Pro:
* Features such as site-wide linkbars or user-specific custom linkbars could be added as a new Output class. I have no idea how these could be plug-ins in current system.

Con:
* RssPage and other output methods will need some way of knowing that it can't do a Diff page, for example. This will need to be expansion-proof. 
* RSS outputs a completely different kind of markup. It's not just a wrapping of template and whatever around the formatted Wiki markup. Two RecentChangesPage classes actually make sense here.

Hmm.... 

==5 July 2005==

The really big thing that's still missing is the database. Things like edit conflict and diff too, but while these are core features, they're not totally essential. With a database system and the basic UseMod parser, Moo should at least be ok to run on a local system as a personal notepad.

Oh and a system for user registration!

My To Do list at the moment is mainly cleaning up tasks &amp;ndash; making variable names consistent and standardizing the way things are accessed. 

==1 July 2005==

'''Tarquin:''' Today I've taken a tentative look at the script for Moo. It runs. It doesn't have a markup parser or a database, but you can edit and save a page, and there's basic support in place for things like category page listings. I need to spend some time getting reacquainted with the script so I understand it again. Fortunately, I've caught Mych's habit of leaving LOTS of comments. There's even POD too!

==Old stuff==

Rough notes for the class structure

* Page
** PageWiki: pages that open a page from the server
*** Edit
**** Edit Conflict
*** Diff
*** History
*** PageWikiSpecial
**** RecentChanges (maybe this &amp; below given a base class, SpecialPage)
**** Search
**** Wanted Pages
**** RandomPage
**** Image Upload
** Preferences
** Login
** List all pages
** Admin-Only
*** Rename
*** Ban IP
*** Lock / unlock site
*** Lock / Unlock page

I had an idea to isolate behaviour for diff, edit, conflict, history in subclasses. The problem is that PageWikiSpecial children need that behavour too.

Possible solution: treat SpecialPages as a seperate tree of plug-in behaviours. (like bot brains). 

Aside: can a class's parent be set at runtime? I suppose it can, since it's just 
   our @ISA = Block;

which sets parentage. Nothing stopping a 

 if( pants ) {
  our @ISA = Block; }
 else {
  our @ISA = NotBlock;}

and thus

# indentify requirement as Browse, Edit, Diff, Etc
# determine if SpecialPage
# spawn object of (desired SpecialPage) as child of requirement in 1

Would that count as REALLY twisted though?

'''Mychaeel:'''  It can be done and is even documented as doable (in that the method inheritance namespace cache is documented to be cleared when it's done), but it's a last resort at most... if you can avoid stuff like that, do it.

'''Tarquin:'''  Doh! Diff &amp; Edit etc dont need to load in the generated content... just the saved wiki text. So if the object is if class &quot;Diff&quot; (say), then the fact that it doesnt load the generated behaviour is irrelevant!

====Admin Pages ====

Maybe make a base class for Admin-only pages. Hmm. maybe not, a simple Admin-only flag somewhere.

: http://c2.com/cgi/wiki?ShallowHierarchies  Let's have a class PageAdmin which handles checking the viewer's admin status &amp; displaying a message.

====Home Page====

slightly special because no page specified means go here... so not a class, but a special case in PageWiki

Actually, might as well make it a special case at the class level. The class for HomePage could be as simple as reading a config variable for which page to open.

====Diff &amp; History ====

not sure how to handle diff &amp; history. probably:
* Page
** PageWiki
*** History
*** Diff

The really clever thing to do would be to have History, Diff and EditConflict create a new PageWiki object that handles opening the second page.

This business that new() is non-special means that a class can have ''several'' creation functions, I suppose.

:'''Mychaeel:'''  Absolutely.  (Naming convention is C++-like, by the way &amp;ndash; start class names with capital letters, method names with lowercase letters.  You can structure either by using capital letters inbetween.)

That means page classes could have a NewPage() and a NewNested() (or whatever. names subject to improvement). If a nested page is needed for diff, history, edit conflict, etc, create a new instance of PageWiki, but the NewNested obviously doesn't need to make headers, it just needs to open a file &amp; display text.

==Main function ==

Pondering two approaches:

method 1:

&lt;uscript&gt;
sub doBrowse {
  print &amp;getHttpHeader();
  print &amp;getHtmlHeader();
  print &amp;getPageHeader();
  print &amp;getDocumentText();
  # etc
}


method 2:

&lt;uscript&gt;
sub doBrowse {
  getHttpHeader();
  getHtmlHeader();
  getPageHeader();
  getDocumentText();
  # etc
}
# each function handles its own printing.
&lt;/uscript&gt;

As I see it, the advantage of (2) is that I can choose whether to build up a $text and print in one go, or print pieces as it goes. 

'''Mychaeel:''' I strongly suggest you build the entire page in memory first, then print it at once if appropriate.  Just think of the [[Legacy:Offline Wiki|Offline Wiki]] (plus, you can send a decent &quot;Content-Length&quot; HTTP header so browsers know in advance how much content to expect and can display working progress bars while loading).

==New() ==

In wookee.pm, new() is only ever called with one argument. Therefore, is the second line in sub new() useful:

&lt;pre&gt;
    my $owner = shift;
&lt;/pre&gt;

It's causing me problems as I'm calling new( %PageVariables ) and the first piece of the hash gets eaten by it. Do i risk death or disaster by removing it?

'''Mychaeel:''' At one place in Wookee, new() takes a reference to an object's &quot;owner&quot; (to propagate information about embedded links and headers up the block nesting hierarchy).  That's not a Perl built-in, it's merely my own design.

----

'''Mychaeel:'''  Moo?  I like the name.  :-D

'''Tarquin:'''  :D

'''ZxAnPhOrIaN:'''  I like moo too. :D

----

  sub Browse {
    my $page          = ' ';
    # need to know:
    # URL params
    # User name and status
    
    my %browseParams  = ( page=&gt;'Home', action=&gt;'edit');
    
    # determine which class to set $page equal to...
    foreach $subclass ( @registered ) {
      $page = $subclass-&gt;ChildofPage($page, %browseParams );
      print &quot;checking... $page\n&quot;;
      # Page
      ## PageAdminTask
      ## PageWiki
      ## PageLogin
      ## PagePreferences
    }
    print $page-&gt;GenerateContent();
    #print scalar @registered;
  }

hmm.... not ideal. I'm trying to think if there's ever a situation where different tasks might both want to perform, given the input, and one should take precedence. If not, might as well have classes return nothing unless they want to take on the task, and use some sort of a &quot;while ...&quot; construction instead of &quot;foreach&quot;.</text>
    </revision>
    <revision>
      <id>5368</id>
      <timestamp>2005-07-05T09:56:26Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==5 July 2005==

The really big thing that's still missing is the database. Things like edit conflict and diff too, but while these are core features, they're not totally essential. With a database system and the basic UseMod parser, Moo should at least be ok to run on a local system as a personal notepad.

Oh and a system for user registration!

My To Do list at the moment is mainly cleaning up tasks &amp;ndash; making variable names consistent and standardizing the way things are accessed. 

==1 July 2005==

'''Tarquin:''' Today I've taken a tentative look at the script for Moo. It runs. It doesn't have a markup parser or a database, but you can edit and save a page, and there's basic support in place for things like category page listings. I need to spend some time getting reacquainted with the script so I understand it again. Fortunately, I've caught Mych's habit of leaving LOTS of comments. There's even POD too!

==Old stuff==

Rough notes for the class structure

* Page
** PageWiki: pages that open a page from the server
*** Edit
**** Edit Conflict
*** Diff
*** History
*** PageWikiSpecial
**** RecentChanges (maybe this &amp; below given a base class, SpecialPage)
**** Search
**** Wanted Pages
**** RandomPage
**** Image Upload
** Preferences
** Login
** List all pages
** Admin-Only
*** Rename
*** Ban IP
*** Lock / unlock site
*** Lock / Unlock page

I had an idea to isolate behaviour for diff, edit, conflict, history in subclasses. The problem is that PageWikiSpecial children need that behavour too.

Possible solution: treat SpecialPages as a seperate tree of plug-in behaviours. (like bot brains). 

Aside: can a class's parent be set at runtime? I suppose it can, since it's just 
   our @ISA = Block;

which sets parentage. Nothing stopping a 

 if( pants ) {
  our @ISA = Block; }
 else {
  our @ISA = NotBlock;}

and thus

# indentify requirement as Browse, Edit, Diff, Etc
# determine if SpecialPage
# spawn object of (desired SpecialPage) as child of requirement in 1

Would that count as REALLY twisted though?

'''Mychaeel:'''  It can be done and is even documented as doable (in that the method inheritance namespace cache is documented to be cleared when it's done), but it's a last resort at most... if you can avoid stuff like that, do it.

'''Tarquin:'''  Doh! Diff &amp; Edit etc dont need to load in the generated content... just the saved wiki text. So if the object is if class &quot;Diff&quot; (say), then the fact that it doesnt load the generated behaviour is irrelevant!

====Admin Pages ====

Maybe make a base class for Admin-only pages. Hmm. maybe not, a simple Admin-only flag somewhere.

: http://c2.com/cgi/wiki?ShallowHierarchies  Let's have a class PageAdmin which handles checking the viewer's admin status &amp; displaying a message.

====Home Page====

slightly special because no page specified means go here... so not a class, but a special case in PageWiki

Actually, might as well make it a special case at the class level. The class for HomePage could be as simple as reading a config variable for which page to open.

====Diff &amp; History ====

not sure how to handle diff &amp; history. probably:
* Page
** PageWiki
*** History
*** Diff

The really clever thing to do would be to have History, Diff and EditConflict create a new PageWiki object that handles opening the second page.

This business that new() is non-special means that a class can have ''several'' creation functions, I suppose.

:'''Mychaeel:'''  Absolutely.  (Naming convention is C++-like, by the way &amp;ndash; start class names with capital letters, method names with lowercase letters.  You can structure either by using capital letters inbetween.)

That means page classes could have a NewPage() and a NewNested() (or whatever. names subject to improvement). If a nested page is needed for diff, history, edit conflict, etc, create a new instance of PageWiki, but the NewNested obviously doesn't need to make headers, it just needs to open a file &amp; display text.

==Main function ==

Pondering two approaches:

method 1:

&lt;uscript&gt;
sub doBrowse {
  print &amp;getHttpHeader();
  print &amp;getHtmlHeader();
  print &amp;getPageHeader();
  print &amp;getDocumentText();
  # etc
}


method 2:

&lt;uscript&gt;
sub doBrowse {
  getHttpHeader();
  getHtmlHeader();
  getPageHeader();
  getDocumentText();
  # etc
}
# each function handles its own printing.
&lt;/uscript&gt;

As I see it, the advantage of (2) is that I can choose whether to build up a $text and print in one go, or print pieces as it goes. 

'''Mychaeel:''' I strongly suggest you build the entire page in memory first, then print it at once if appropriate.  Just think of the [[Legacy:Offline Wiki|Offline Wiki]] (plus, you can send a decent &quot;Content-Length&quot; HTTP header so browsers know in advance how much content to expect and can display working progress bars while loading).

==New() ==

In wookee.pm, new() is only ever called with one argument. Therefore, is the second line in sub new() useful:

&lt;pre&gt;
    my $owner = shift;
&lt;/pre&gt;

It's causing me problems as I'm calling new( %PageVariables ) and the first piece of the hash gets eaten by it. Do i risk death or disaster by removing it?

'''Mychaeel:''' At one place in Wookee, new() takes a reference to an object's &quot;owner&quot; (to propagate information about embedded links and headers up the block nesting hierarchy).  That's not a Perl built-in, it's merely my own design.

----

'''Mychaeel:'''  Moo?  I like the name.  :-D

'''Tarquin:'''  :D

'''ZxAnPhOrIaN:'''  I like moo too. :D

----

  sub Browse {
    my $page          = ' ';
    # need to know:
    # URL params
    # User name and status
    
    my %browseParams  = ( page=&gt;'Home', action=&gt;'edit');
    
    # determine which class to set $page equal to...
    foreach $subclass ( @registered ) {
      $page = $subclass-&gt;ChildofPage($page, %browseParams );
      print &quot;checking... $page\n&quot;;
      # Page
      ## PageAdminTask
      ## PageWiki
      ## PageLogin
      ## PagePreferences
    }
    print $page-&gt;GenerateContent();
    #print scalar @registered;
  }

hmm.... not ideal. I'm trying to think if there's ever a situation where different tasks might both want to perform, given the input, and one should take precedence. If not, might as well have classes return nothing unless they want to take on the task, and use some sort of a &quot;while ...&quot; construction instead of &quot;foreach&quot;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Moo/Script</title>
    <id>2218</id>
    <revision>
      <id>5369</id>
      <timestamp>2007-06-01T06:12:25Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <comment>zee revert... pweese lock?</comment>
      <text xml:space="preserve">&lt;pre&gt;
#!/usr/bin/perl
###############################################################################
# UseMOO
#
# $Id: moo.cgi,v 1.32 2005/07/05 09:23:47 tarquin Exp $
#
# a sort of perl disaster by Tarquin
# based on UseModWiki (C) 2000-2001 Clifford A. Adams
#    &lt;caadams@frontiernet.net&gt; or &lt;usemod@usemod.com&gt;
# ...which was based on
#    the GPLed AtisWiki 0.3  (C) 1998 Markus Denker
#    &lt;marcus@ira.uka.de&gt;
#    the LGPLed CVWiki CVS-patches (C) 1997 Peter Merel
#    and The Original WikiWikiWeb  (C) Ward Cunningham
#        &lt;ward@c2.com&gt; (code reused with permission)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the
#    Free Software Foundation, Inc.
#    59 Temple Place, Suite 330
#    Boston, MA 02111-1307 USA

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use strict 'refs';
use strict 'vars';

###############################################################################
#   POD: Intro
=head1 MooWiki=

UseMoo is a free wiki engine based on UseModWiki by Clifford A. Adams (in turn
based on AtisWiki, and so on back to Ward's Wiki). 

The core idea is that the code from UseModWiki is refactored to OO code, 
hence the name 'Moo' substituted for 'Mod'. 

I plan to bundle it with Mychaeel's Wookee wiki-to-html parser, 
which would make the name of the complete thing UseMooWookee. 
However, I'm not too fussed about names at this stage.

The goals for this script are:
* modularity
* extensibility
* reduce spaghetti code
* reduce tag soup
* compatibility with UseModWiki

=head2 Modularity=
This script should be able to run just like UseModWiki with one set of modules, 
and with some other modules use an SQL or XML database with
a modern XHTML-compatible parser.

=head2 Extensibility=
It should be easy to add extra functionality to the script, without delving 
too far into the existing script.
At the same time, the core script is self-contained, just as UseMod is. 
This file alone will run a wiki.

=head2 Despaghettification=
UseMod's code can be confusing to work with. A script of this complexity
is always going to involve the chain of execution being hard to follow, but it
is my hope that OO makes this less of an issue. 

=head2 Better and smarter HTML and XHTML=
Clean HTML is produced from Wiki source by the Wookee parser.
The OO approach makes it easier to wrap each part of the complete HTML page
in DIVs for easy formatting and layout with CSS.
Other features such as Accesskeys and LINK elements based on site-wide options 
and wiki page content are in the pipeline.

=cut=

###############################################################################
#   POD: Class hierarchy
=head1 Class hierarchy=

Moo uses several disjoint class hierarchies. The most important of these is 
the Page hierarchy. Others behave like modules that add functionality.

This list should also be available via the URL ?action=classreport (it partially is so far).

+ Database - abstract base class. implements database access
++ DatabaseMono - stupidly simple example
++ DatabaseFlat - all pages in a single flat file
++ DatabaseCliff - reworking of UseModWiki's DB system

+ Cache - cache system

+ Parser - wiki parser
++ ParserCliff - the UseModWiki parser
++ ParserWookee

+ Generator - classes that add generated content to wiki pages
++ GeneratorRecentChanges
++ GeneratorCategory

+ SaveAction - things that happen when a page is saved
++ SaveActionSpellcheck
++ SaveActionSpamcheck
++ SaveActionThankyou

+ Page - displays an HTML page
++ WikiPage - displays a wiki page from the database
+++ WikiPageHistory - displays the history list for a wiki page
+++ RevisionPage - displays a particular revision of a page
+++ WikiEdit - edits a wiki page
++++ WikiEditConflict
++++ WikiEditPreview
+++ WikiPageSave
+++ MagicPage
++++ RCPage
++ WikiAdmin - parent of admin pages
++ WikiVersion - shows script version number
++ PageClassReport - outputs the list of all loaded classes


=cut=

###############################################################################
#   POD: Bundled plug-in modules
=head1 Bundled plug-in modules=

Moo has a plug-in system. It will load any perl modules in the same directory
as itself whose names begin with 'moo-'. This allows the system's modularity 
to work at a different level to classes. You can choose whether to enable or 
not a set of features simply by whether a file is in your cgi directory or not.

The modules bundled with Moo are:

=head2 moo-debug.pm=
General debugging and testing tools. ModuleTestPage just tests that the module
has loaded. PageClassReport outputs the list of all loaded classes.

=head2 moo-generators.pm=
Generator classes that aren't core features.

=head2 moo-usemod.pm=
Set of classes for backwards-compatibility with UseModWiki.
This will include the UseMod database system, the UseMod parser, and support
for the action=rc type URLs.

=cut=

###############################################################################
#
#   class Database 
#
#   This is an abstract class. It serves only to set out the methods.
#   Subclasses must implement these in some appropriate manner.
#
#   Any instance of a Database must be owned by another object.
#   This will almost certainly be some sort of Page object.
#   A reference to the owner is set as SELF-&gt;{owner} on creation, provided the
#   constructor has been called correctly... like this:
#     Database-&gt;new($someobject)
#
#   Several things can go wrong when working with the database, and the DB
#   class needs to report these back to the Page instance so the user is alerted.

{
  package Database;
  
  ###########################################################
  #  Class properties
  
  our $initialized;
    # true if the DB system has been initialized
  
  sub isInitialized { 
    # accessor function for the $initialized property
    shift;
    $initialized = shift if @_;
    return $initialized;
    };

  ###########################################################
  #  Database Constructor and initializer
  #
  #   It is only necessary to initialize the DB system once;
  #   but we might need more than one DB instance (eg diff pages)
  #
  #   The new() method creates and returns a new DB instance and 
  #   takes responsibility for initializing the DB system if necessary
  #
  #   It returns a reference to the Database object if all goes well.
  #   Otherwise, returns a string containing the error message.
  #   Test the return of this with ref().
  #   (Note &amp;ndash; new() this tolerates a return of 1 from initDatabase() 
  #   as a success. This is a pre-emptive bug tolerance,
  #   since it's possible to forget the return statement and finish with
  #   setting isInitialized to 1)
  #
  #   The new() method should not be overridden in child classes. 
  #   Use the initDatabase() to do things specific to the database implementation.
  
  sub new {
    my $class = shift;
    my $owner = shift;
    
    my $result = $class-&gt;initDatabase()
      unless $class-&gt;isInitialized;
    
    # if $result is non-empty, an error has occured
    # (unless $result is 1, in which case a programmer is probably being lazy)
    return $result
      if $result and $result != 1;
      
    my $newDB = { owner =&gt; $owner };
    return bless $newDB, $class;
  }
  
  sub initDatabase {
    # unlike UseMod...
    # returns nothing if successful (but sets isInitialized to a TRUE value)
    # returns an explanation if something goes wrong
    
    my $class = shift;
    # Things the initializer should do:
    # check the datadir specified in config exists. 
    # If it is not found, try to create it.
    
    $class-&gt;isInitialized(1);
    return;
  }
  
  ###########################################################
  #  Access
  
  sub loadWikiFromDB {} 
    # loads the content of the wiki page into its owner
    
  sub saveWikiToDB {}  
    # saves the content of the wiki page from its owner
    
  sub fetchRClist { 'This Database system does not appear to support a Recent Changes list.' }
    # returns list of RC lines
    
  sub fetchHistory { 'This Database system does not appear to support page histories.' }
    # returns list of history lines
  
}

###############################################################################
#
#   class DatabaseMono 
#
#   DatabaseMono is a primitive database system that only loads one
#   page, no matter what title it is given.
#   This is just to see how it interacts with the rest of the script
#   Move this to moo.debug.pm eventually.

{
  package DatabaseMono;
  
  our @ISA = qw(Database);
  
  # for testing only
  our $filename = 'db.txt';
  
  ###########################################################
  #   DatabaseMono::initDatabase
  #
  
  sub initDatabase {
    my $self = shift;
    
    my $datadir = Page-&gt;getConfiguration('DataDir');
    
    unless ( -d $datadir || CreateDir($datadir) ) {
      return qq[Can't create directory $datadir]; 
      # return an error message
    }
    $self-&gt;isInitialized(1);
    return;
  }
  
  #--------------------------------------
  # these are not proper OO methods
  # from UseMod
  # consider moving these up to the base Database class to be inherited
  sub CreateDir {
    my $newdir = shift;
    mkdir($newdir, 0775)  if (!(-d $newdir)); # returns true if succeeds.
  }
  sub ReadFile {
    my $fileName = shift;
    my $data;
    local $/ = undef;   # Read complete files

    if (open(IN, '&lt;' . Page-&gt;getConfiguration('DataDir') . &quot;/$fileName&quot;)) {
      $data=&lt;IN&gt;;
      close IN;
      return (1, $data);
    }
    return (0, &quot;&quot;);
    # should be a more elegant way of doing this
    # return undef perhaps if data not found?
  }
  sub WriteStringToFile {
    my ($file, $string) = @_;

    open (OUT, '&gt;' . Page-&gt;getConfiguration('DataDir') . &quot;/$file&quot;) or 
      die(Ts('cant write %s', $file) . &quot;: $!&quot;);
    print OUT  $string;
    close(OUT);
  }
  #--------------------------------------
  # public methods
  
  ###########################################################
  #
  # DatabaseMono::loadWikiFromDB
  #
  # Consider interface:
  #   - for serious errors, stash an error message in $page-&gt;{error}
  #   - for no such page error, place '' in $page-&gt;{wiki}
  
  sub loadWikiFromDB {
    my $self      = shift;
    my $page      = $self-&gt;{owner};
    my $revision  = $page-&gt;{revision} || 0;
    
      #   could have a GiveMeDatabase method in Page that 
      #   calls new, hands over the owner object ref
      #   and sorts all this out &amp;ndash; then any child of Page that
      #   requires DB access just needs to say $self-&gt;GiveMeDatabase()
      
    my ($status, $data ) = ReadFile($filename);

    $page-&gt;{wiki} = $data;
      #join '',
      #$data || 'no data!'; #,
      #&quot;&lt;BR&gt;\n&quot;,     
      #'The name of this page is: ',
      #$page-&gt;{title},
      #&quot;&lt;BR&gt;\n&quot;,     
      #'The revision of this page is: ',
      #$revision
      #;
      
      # page not found scenarios are handled by Page children: just stash '' if there is no data 
      # NotFoundPg =&gt; 'PageDoesNotExist',
      # NewPageEdit =&gt; 'BlankEdit',
      
    return 1; # load successful        
  }
  sub saveWikiToDB {
    my $self = shift;
    my $data = shift;
    my $page = $self-&gt;{owner};
    
    $data = $page-&gt;wiki;
    
    #$self-&gt;initDatabase() or return 0;# unless $databaseIntialized;
    
    WriteStringToFile( $filename, $data);
    
  }
  
}

###############################################################################
#   POD: Generators
=head1 Generators=

Generators are classes that create content to display in wiki pages based on something other than wiki source.
A good example is the Category listing that Unreal Wiki uses.
Another example, though perhaps not an obvious one, is the Recent Changes page.

=cut=

###############################################################################
#
#   class Generator 
#
#   Base class to hold registry

{
  package Generator;

  our @registered;
  sub registeredChildClasses { @registered }

  ###########################################################
  #   Registration
  #
  #   Child classes call this method on themselves
  #   and are registered into an array
  
  sub register {

    my $class = shift;  $class = (ref $class or $class);
    
    push @registered, $class
      if $class-&gt;isa(Generator)
      and not grep /^\Q$class\E$/, @registered;
  }
}

###############################################################################
#
#   class GeneratorRecentChanges 
#
#   Lists Recent Changes to the wiki
#   It's up to the Database object to actually maintain and produce a list of recent changes
#   This class requests it and formats it nicely

{
  package GeneratorRecentChanges;
  
  ###########################################################
  #   Registration
  #
  our @ISA = Generator;
  GeneratorRecentChanges-&gt;register();
  
  sub propPlacement { 'foot' }
  
  sub generateText {
    my $self = shift;
    my $page = shift;
    
    return join '',
      '&lt;div class=&quot;rc&quot;&gt;',
      $page-&gt;DBref-&gt;fetchRClist,
      '&lt;/div&gt;';
  }
}

###############################################################################
#
#   class Page
#
#   The base class for pages. This is where most of the work happens.
#   This should:
#     open an HTML scaffold file
#     hold a default HTML page scaffold
#     determine what sort of page has been requested
{
  package Page;
  
  ###########################################################
  #  Static
  
  our @registered;
  sub registeredChildClasses { @registered }
  
  ###########################################################
  #   Registration
  #
  #   Child classes call this method on themselves
  #   and are registered into an array
  
  sub register {

    my $class = shift;  $class = (ref $class or $class);
    
    push @registered, $class
      if $class-&gt;isa(Page)
      and not grep /^\Q$class\E$/, @registered;
  }
  
  ###########################################################
  #  Class properties: inheritable defaults
  
  sub propConditions  { 0 }  # conditions a class must satisfy to handle a browse request. Returns false by default
  sub pageAccess      { 'user' } # user status required to view this class's page
  sub bodyCSSclass    { '' }     # the CSS class added to the BODY HTML tag for this class's page
  sub titlePrefix     { '' }     # prefix added to the displayed page name
  sub propPageTitle   {    }     # title if none supplied dynamically
  sub thisPageTools   { '' }
  #sub usesGenerators  { 0  }     # no good.
  
  ###########################################################
  #  Class properties: CGI
  sub getScriptName { $ENV{SCRIPT_NAME} } # Name used in links (absolute) &amp;ndash; Mychaeel

###############################################################################
#   POD: Configuration
=head1 Configuration=

Configuration options for Moo are set in a Big Fat Hash within the Page class.
They are accessed with the getConfiguration() method, which takes the name of the key.
If you don't yet have access to a Page object, then the dirty way to do it is
$Page::configuration{propertyname}, but this should only be an issue at the very start of
the UseMooWiki package, where a Page has not yet been created.

Configuration defaults are overridden in a seperate file that is executed when the Moo script loads.
A configuration file sample follows:
----
# do not touch this line:
%configuration = ( (%configuration),  

ConfigName =&gt; Number,
ConfigName =&gt; 'String',
ConfigName =&gt; [ list, list, list ],
and so on
do not forget the comma at the end of each line!
----

=cut=

  ###########################################################
  #  Configuration
  #
  # Default settings are overriden by the config file
  
  our %configuration = (
    ConfigFile  =&gt; 'configlist.pl',
    DataDir     =&gt; 'data',
    
    # site configuration
    SiteName    =&gt; 'Moo Wiki',
    HttpCharset =&gt; '',
    FreeLinks   =&gt; 1,
    FreeUpper   =&gt; 1, # put [[Legacy:Free Links|free links]] into [[Legacy:Title Case|Title Case]]
    
    # CGI
    RunCGI      =&gt; 1,
    
    # special pages names
    # these should be in the form the database uses, not the URL or the display
    HomePage      =&gt; 'WelcomePage',
    RecentChanges =&gt; 'RecentChanges',
    AccessDenied  =&gt; 'AccessDenied',
    NoSpam        =&gt; 'NoSpam',
    SampleLink    =&gt; 'TheWeatherInLondon',
    Search        =&gt; 'SearchResults', 
    NotFoundPg    =&gt; 'PageDoesNotExist', 
    NewPageEdit   =&gt; 'BlankEdit',
    
    # ugly. remove!
    BuiltInGenerators =&gt; { 
      RecentChanges =&gt; 'RecentChanges',
      
      },
    
    # LINK elements in HTML HEAD
    HtmlLinks =&gt; { },
    
    # appearance
    DefaultStyleSheet =&gt; '', # http://localhost/wiki-ext/moo/moodev.css', # for use with built-in template
    # replace this with built-in stylesheet and override it if this value is not ''
    
    PageTemplates =&gt; { },
    
    # user groups
    UserGroups =&gt; ['user', 'editor', 'admin'], 
      # place these in increasing order of authority
      
    # code modules
    Hello =&gt; 'HelloSub',
    
    # debug
    DebugMode =&gt; 1,
    
    );
    
  ###################
  # read in configuration file
  if ( $configuration{ConfigFile} ) { 
    do &quot;$configuration{ConfigFile}&quot;;
    
    # this does not yet report errors!
  }

  sub getConfiguration {
    # consider changing this to accept a list of keynames and 
    # return a list of values
    
    my $class     = shift; $class = (ref $class or $class);
    my $wantedkey = shift;
    
    return $configuration{$wantedkey};
  }

###############################################################################
#   POD: Built-in template

=head1 Built-in template=
The Moo script contains its own template for HTML pages. 
This should be sufficient for most uses: with a little CSS styling you can 
make your wiki pages distinctive if you so wish.
You can however supply your own: see configuration.

=cut=

  ###################
  # Built-in template
  our $builtInTemplate = &lt;&lt;&quot;EOT&quot;;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;  &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;title&gt;%windowtitle%&lt;/title&gt;
%styles%
%link%
&lt;/head&gt;
&lt;body class=&quot;%bodyclass%&quot;&gt;
&lt;h1&gt;%title%&lt;/h1&gt;
&lt;div class=&quot;wiki&quot;&gt;
%wiki%
&lt;/div&gt;
&lt;div class=&quot;footer&quot;&gt;
%footer%
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;    
EOT

  sub getTemplate {
    # do some config checking:
      # has the user requested a template?
      # does the config request a template?
      # do they exist?
    
    return $builtInTemplate;
    # consider embedding the template in this sub instead.
  }
  
  ###################
  # Built-in CSS
  
  # what would be terribly cunning might be to hide the two here-docs
  # behind a quick check of the relevant %configuration keys
  # so they're not even loaded if not required
  our $builtInStyles = &lt;&lt;&quot;EOT&quot;;
/* main structure */
div {
  border:solid 2px;
  margin:1em;
  padding:0.5em;
  
}
.footer {
  border-color:red;
}
.edit {
  border-color:green;
}
.preview {
  border-color:yellow;
}
.savemessage {
  border-color:#fb0;
}
.debug {
  border-color:red;
  border-style:dashed;
  
}
.debug h1 {
  margin:0em;
  padding:0em;
  font-size:1.5em;
}
.debug h2 {
  margin:0em;
  padding:0em;
  font-size:1.2em;
}

/* forms */
.editbutton {
  width: 5em; 
  height: 2em;
}
EOT

  sub getStyles {
    # return either a LINK to a stylesheet or a STYLE block of the built-in stylesheet
    # do some config checking:
    #&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;&quot;&gt;    
    
    return qq[&lt;style type=&quot;text/css&quot;&gt;$builtInStyles&lt;/style&gt;];
  }
  
  ###################
  # testing plugin modules
  
  sub DummyHello {
    #if (Page-&gt;can('HelloSub')) {}
      
    &amp;{ Page-&gt;can($configuration{'Hello'}) or 'HelloSub'}(@_)  
      
    #if (Page-&gt;can($configuration{'Hello'})) {
    #  &amp;{$configuration{'Hello'}}(@_);
    #}
  }
  sub HelloSub {
    # a fallback default module
    print &quot;Hello!!!!!\n&quot;;
  }
  #DummyHello();
  
  # end test
  ###################
    
  ###########################################################
  #   Instance properties
  #
  #   Accessors to these are generated with a closure.
  #   Use any of the following:
  #   - $object-&gt;name('value');  # assign and return
  #   - $object-&gt;name = 'value'; # lvalue assignment 
  #   - $object-&gt;name;           # plain return
  #
  #   These COULD BE capable of consulting the holder if no value is found
  #   However, this code is commented out because I think this could 
  #   lead to problems with embeddings that rely on a property NOT being there 
  #   to test something.
  #   Consider as an alternative to both this &quot;consulting the holder&quot; method
  #   and repetitive stuffing of an embedded instance with copies of vars:
  #   an &quot;embedding creator&quot; method, which takes a list of properties to 
  #   bestow upon the new object.
  
  # closure templates
  for my $field (qw[now cgiref DBref browserequest DBid 
      error holder embed 
      title wiki text revision generators]) {
    no strict 'refs'; # allow symbol table manipulation
    *$field = sub : lvalue {
      my $self = shift;
      
      # with input, set the property
      $self-&gt;{$field} = shift if @_;
      
      # if property empty, try holder
      #if( !$self-&gt;{$field} and $self-&gt;{holder} ) {
      #  return $self-&gt;{holder}-&gt;$field;
      #}
      
      $self-&gt;{$field};
    }
  }
  
###############################################################################
#   POD: Instance data
  
=head1 Instance data=

UseMoo stores data that relates to the current page as instance data.
This avoids globals, lengthy parameter lists passed to subroutines, 
and means that it's safe to create further instances as embedded pages, 
for example.

Here is the list of data stored, in approximate order of storage:
now   =&gt;  the time of the request
cgiref=&gt;  reference to a CGI object for HTML tag creation etc
DBref =&gt;  reference to a Database object
browserequest 
      =&gt;  a reference to the hash of the browse request variables 
          (instead of UseMod's &amp;GetParam)
DBid  =&gt;  name of page as the database will need to see it

embed =&gt;  embedded page (subject to refactoring)
holder
      =&gt;  for an embedded page, a reference to the page it is embedded within
      
title =&gt;  name of page as the user should see it in the browser
revision
      =&gt;  the requested revision number of a page
wiki  =&gt;  wiki source text
text  =&gt;  HTML text to be output to the browser
error =&gt;  holds error text passed around at various times. If true at page display time, requests debug mode.

=cut  =

  ###########################################################
  #  Instance properties: building up text
  # 
  # Text eventually output to the browser is stored as an instance variable
  # This makes it easily accessible
  # and specialized modules can access what earlier modules have stored (if needed)
  
  sub getText {
    my $self = shift;
    return unless ref $self; # this is only for instances, not classes
    
    return $self-&gt;{text};
  }
  
  sub appendText {
    my $self = shift;
    my $text = shift;
    return unless ref $self; # this is only for instances, not classes
    
    $self-&gt;{text} .= $text;
  }
  sub prependText {
    my $self = shift;
    my $text = shift;
    return unless ref $self; # this is only for instances, not classes
    
    $self-&gt;{text} = $text . $self-&gt;{text};
  }
  
  ###########################################################
  #  User access levels
  
  sub compareUserGroups {
    my ($self, $actualAbility, $requiredAbility) = @_;
    return 1 if ( $actualAbility eq $requiredAbility );

    # failsafe: what to do if the values received don't figure in the array?
    # not ideal but:
    # if actualAbility is bad, suppose user is LOW
      # $actualAbility = $groups[0];
    # if requiredAbility is bad, suppose actual ability is HIGH 

    foreach ( @{$self-&gt;getConfiguration('UserGroups')} ) {
      # walk through the UserGroups array 
      # and compare current user and requirement to each entry
      return 1 if ( $_ eq $requiredAbility);
        # we got to required ability first: user is overqualified
      return 0 if ( $_ eq $actualAbility);
        # we got to actual ability first: user is not up to it
    }
  }
  
###############################################################################
#   POD: Page Constructors
=head1 Page Constructors=

The constructor for Page objects isn't actually a constructor, it's a blesser, because it's given
a reference to bless (and return the blessed instance), rather than creating one from nothing.

The reason for this is that the soon-to-be instance sometimes needs to begin loading itself with data to 
find out what it will be. For example, this allows the wiki content to be loaded from the database and then examined 
to influence the choice of class to bless as. It could be done without stashing the loaded data inside 
the hash reference, but then we'd have two copies of the data floating around, and this seems messy.

(Other constructors, such as for the Database, are passed the reference of the Page
object that is to be their owner, but more on this elsewhere.)

The creation of a Page object begins in the UseMooWiki package, which creates a hash reference, puts
some values in it such as the time of the request, and passes it to Page::chooseClass.

=head2 Page::chooseClass =
Page::chooseClass is the principal constructor method. It does the following:

# tests each registered class against the browse parameters, trying to find a class whose conditions are satisfied
## if a suitable class is found, it tests the user access level required.
### if the user fails, the instance is blessed as WikiPage instead and goes to the 'AccessDenied' page
### if the user succeeds, the instance is passed to the blessPage method of the suitable class.
(The blessPage method will bless the instance and return it,
but may make its own decisions about what class to bless as!)
## if chooseClass has not found a suitable class, it blesses the reference as PageError
# the blessed reference is returned

UseMooWiki how has an instance of some class (WikiPage, for example).
It calls makePage on this instance, which and the prints the instance's text property.
That's it!

=head2 Page::blessPage =
This does pretty much nothing. It just blesses the reference.
The real work happens in WikiPage::blessPage, but Page::blessPage exists
so it can be inherited if need be.

=cut=
  #####################################
  #
  #   Page::chooseClass
  #
  #   Called by UseMooWiki. Begins the process of deciding which class
  #   to bless the passed reference as.
  #   Considers all the registered children of Page, evaluating and 
  #   testing the string propConditions for each one.
  #   This is done in *reverse* order of registration: this gives later classes
  #   the chance to specialize the conditions (eg RevisionPage specializes WikiPage).
  #   Classes also have the chance to 'intercept' and completely replace handling
  #   of a certain condition: see moo-delay.pm's WikiPageDelayed for an example.
  
  sub chooseClass {
    my $class             = shift; $class = (ref $class or $class);
    if ($class ne __PACKAGE__) { die 'Illegal subclass calling constructor'; }
    my $instance          = shift; # a ref we will be blessing
    my $browseParameters  = shift; # ref to hash
    
    # consider putting initDatabase here and making a PageError -
    # but we lose the feature of some actions not requiring the DB (eg version)
    
    ##############################
    # Cancel
    # catch Cancel button presses and clean up the parameters
    # this could be moved to a class that then calls Page::chooseClass 
    # a second time with new params
    
    if( $browseParameters-&gt;{Cancel} ) {
      my %acceptableParameters = map { $_, '' } qw( title );
        # may be a problem with id vs title params
      foreach (keys %$browseParameters) {
        delete $browseParameters-&gt;{$_}
          unless $acceptableParameters{$_};
      }
    }
    
    # dummy variables for testing
    my $userStatus = 'user';
    
    ##############################
    # Class testing
    #
    # Consider each child class in the registered list
    
    TESTCLASSES: foreach my $consideredclass ( reverse registeredChildClasses() ) {
      if( eval $consideredclass-&gt;propConditions ) { 
        # grab its condition statement
        if ( $class-&gt;compareUserGroups( $userStatus, $consideredclass-&gt;pageAccess )) {
          blessPage $consideredclass $instance, $browseParameters;

          #$childclass-&gt;childcreatePage( $instance, $browseParameters );
        }
        else {
          $$browseParameters{keywords} = $class-&gt;getConfiguration('AccessDenied'); 
          blessPage WikiPage $instance, $browseParameters;
        }
        last TESTCLASSES; # don't test anything else now we've found something
      }
    }
    if (ref $instance eq 'HASH') {
      # $instance is still unblessed?
      # if we get here then we've not properly handled the cases
      # PageError will tell us what went wrong
      blessPage PageError $instance, 
        q[No page type matched the parameters passed by the browser.];
    }
    
    
  }
  #####################################  
  # Page::blessPage
  # 
  # This is the generic blessing method for Page child classes.
  # This is never called directly, but some classes that do nothing
  # special here may inherit it.
  
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref to bless

    bless $instance, $class;
  }
  
  ###########################################################
  #   Making output text
  #   These methods produce HTML text for output
  #
  #   makePage 
  #     The main method. 
  #     Calls makePageContent and wrapPageContent to make all the html.
  #     Then adds HTTP headers to the front of the html text
  #
  #     makePageContent
  #       creates the dynamically-generated content and stores it
  #
  #     wrapPageContent
  #       wraps the stored text in a template, including 
  #       link footer and debug footer
  
  # consider more levels of OO here:
  #  Page
  #   +- HtmlPage
  #       +- TemplatedPage
  
  sub makePage {
    my $self = shift; # should verify $self is an instance if we're really being clean
    
    $self-&gt;makePageContent(); # create the dynamic stuff
    $self-&gt;wrapPageContent(); # wrap it up in template and header and footer etc
    
    # make HTTP header using the CGI object header method
    my @headerProperties = ( -Content_length =&gt; length $self-&gt;text );
    if (  1  ) { # if charset set 
      push @headerProperties, -type =&gt; 'text/html charset=$HttpCharset';
    }
    if (  0  ) { # if cookie need to be set
      push @headerProperties, -cookie =&gt; 'cookie!!!';
    }
    $self-&gt;prependText( $self-&gt;cgiref-&gt;header( @headerProperties ));
    return;
  }

  sub makePageContent {
    my $self = shift;
    
    $self-&gt;appendText(&quot;Default Page object\n&quot;); # we should never actually be here
    return;
  }
  
  sub makePageFooter {
    # The generic footer: a bar of site-wide links and a note about the engine.
    
    my $self = shift;

    my $text ;
    
    my $urlroot = $self-&gt;getScriptName;
    
    $text .= $self-&gt;cgiref-&gt;p(
      join ' | ',
      
      # this soup will be simplified with standard footer links system
      $self-&gt;cgiref-&gt;a({-href=&gt;$urlroot .'?' . $self-&gt;getConfiguration('RecentChanges')},'Recent Changes'),
      $self-&gt;cgiref-&gt;a({-href=&gt;$urlroot .'?' . $self-&gt;getConfiguration('HomePage')},'Home Page'),
      ( ( $self-&gt;getConfiguration('DebugMode') or $self-&gt;error ) 
        and $self-&gt;cgiref-&gt;a({-href=&gt;$urlroot .'?action=classreport'},'Class Listing' ) )
      
      );
    
    $text .= $self-&gt;cgiref-&gt;p(
      q[Footer Text: this site runs Moo! (And it's great!)&lt;/p&gt;]);
    
    $self-&gt;appendText($text);
    return;   
  }
  sub makePageDebugListing {
    my $self = shift;
    
    # some local copies of references to simplify the arrow soup
    my $tagmaker = $self-&gt;cgiref; # CGI object
    my $browserequest = $self-&gt;browserequest; # the hash of browser request params
    
    my $text = join '',
      $tagmaker-&gt;h1('Debug information'),
      $tagmaker-&gt;p(&quot;Class is $self&quot;),

      $tagmaker-&gt;h2('Browser parameters'),
      $tagmaker-&gt;ul(
         $tagmaker-&gt;li([ map {&quot;$_ =&gt; $browserequest-&gt;{$_}&quot;} keys %$browserequest ])
         ), # making an anonymous list makes li() distribute over it

      $tagmaker-&gt;h2('Instance data'),
      # note that we cheat and access instance properties directly
      $tagmaker-&gt;ul(
         $tagmaker-&gt;li([ map( {
            my $output = &quot;$_ =&gt; $self-&gt;{$_}&quot;;
            ref($self-&gt;{$_}) eq 'HASH' and
              $output .= &quot;; hash:  &quot; . join ',',  %{$self-&gt;{$_}};
            $output;
           } grep !/text|wiki/, keys %$self )])
         ), # we don't want to print $self-&gt;{text} or {wiki}
      ;
         
      if( $self-&gt;generators ) {
        $text .= join '',
          $tagmaker-&gt;h2('Generator parameters'),
          $tagmaker-&gt;ul(
            map { qq[&lt;LI&gt; @{$_} &lt;/LI&gt;] } @{$self-&gt;generators}
        );
      }
    $self-&gt;appendText(qq[&lt;DIV class=&quot;debug&quot;&gt;$text&lt;/DIV&gt;]);
    
  }
  sub wrapPageContent {
    my $self = shift;
    
    # gets a template, splits and wraps the text generated so far inside it.
    # a default template exists in this script
    
    # at this point, $self-&gt;{text} should contain:
    # * the rendered wiki text when we get here
    # * any 'magic' content
    
    my $template  = $self-&gt;getTemplate;
    my $pagetitle = ($self-&gt;titlePrefix . $self-&gt;title or $self-&gt;propPageTitle);
    
    # consider doing all these on $splittext[0]
    for ($template) {
      s[%styles%][$self-&gt;getStyles]e;
      s[%link%][]; # for now
      s[%windowtitle%]{join '' ,
        $self-&gt;getConfiguration('SiteName') , ' - ' , 
        $pagetitle}e; 
      s[%title%]{$pagetitle};
        #$self-&gt;titlePrefix . $self-&gt;title or $self-&gt;propPageTitle}e; # check precedence here!
      s[%bodyclass%]{
        $self-&gt;bodyCSSclass}e;# not yet fully implemented
    }
    my @splittext = split m[%wiki%|%footer%], $template;
    
    $self-&gt;prependText( $splittext[0] );
    $self-&gt;appendText( $splittext[1] );
    $self-&gt;makePageFooter();
    $self-&gt;makePageDebugListing()
       if $self-&gt;getConfiguration('DebugMode') or $self-&gt;error;
       # debug mode can be requested site-wide (by the developer)
       # or by the script if something goes wrong.
    $self-&gt;appendText( $splittext[2] );

  }
}

###############################################################################
#
#   class WikiPage
#
#   Base class for wiki pages. 
#   should:
#     load and parse wiki text
#     determine if extra elements are needed: preview, diff, etc

{
  package WikiPage;
  
  ###########################################################
  #  Static
  
  our @ISA = Page;
  our @registered;
  
  WikiPage-&gt;register();
  
  ###########################################################
  #   WikiPage Class conditions
  #
  
  sub propConditions { q[
    !%$browseParameters 
    or $browseParameters-&gt;{keywords}
    or $browseParameters-&gt;{action} eq 'browse'
    ] }
    # wiki.cgi - no parameters at all
    # wiki.cgi?pagename (works out as {keywords}=pagename)
    # wiki.cgi?action=browse
    
  ###########################################################
  #  WikiPage Class defaults
  #
  sub thisPageTools   { 'Edit this page', 'View other revisions' }
=pod  =
how does this work?
eg:
OldRevision page needs to change 'Edit this page' and 
add 'view current revision', but keep the last one

possibly use a pseudohash, so there is name access and also an order built-in?

=cut=

  sub displayTitleFromURL {
    my $class = shift;
    my $title = shift;
    
    $title =~ s/_/ /g;
    
    return $title;
    
  }
  
  
  ###########################################################
  #  Class constructor
  #
  #  WikiPage::blessPage
  
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift; # ref to hash
    
    bless $instance, $class;
    
    ##################
    # get the page id and title
    
    $instance-&gt;{DBid} = $browseParameters-&gt;{keywords} 
      || $browseParameters-&gt;{id}
      || $class-&gt;getConfiguration('HomePage');
    
    $instance-&gt;{title} = $class-&gt;displayTitleFromURL($instance-&gt;{DBid}); # but translated to human
      
    #unless  ( $instance-&gt;{DBid} ) {
    #  # no page specified? we want the HomePage
    #  $instance-&gt;{title} = $class-&gt;getConfiguration('HomePage');
    #  $instance-&gt;{DBid} = $instance-&gt;{title}; # but translated to DB
    #}
    
    ##################
    # Database object creation
    # Attempt to create a DB object (the Database-&gt;new method will initialize the DB if needed)
    # Then load text from the database, handle errors and mishaps
    # UNLESS the instance already holds some wiki text
    # (it will have been placed there by something embedding this instance eg Preview)
    
    unless ( $instance-&gt;{wiki} ) {
      # pass the page object to the Database constructor
      # 'new' is a REALLY BAD NAME to use!
      # the constructor will return an object or an error string
      my $database = DatabaseMono-&gt;new($instance);
      
      # new() has failed to create a DB object?
      ref $database or do {
        my $errormessage = $database
          || q[No details supplied.];
        blessPage PageError $instance, qq[Database initialization error: $errormessage];
        return;  
      }; 
      
      $instance-&gt;{DBref} = $database; # only put it in here once we know it's ok
      $database-&gt;loadWikiFromDB();
      
      # loadWikiFromDB() has stored an error message?
      $instance-&gt;error and do {
        blessPage PageError $instance, 
          q[Error loading the page from the database.];
        return;  
      };
      
      # the wiki text stored by loadWikiFromDB() is blank?
      $instance-&gt;wiki =~ /^\s*$/ and do {
        $instance-&gt;DBid( Page-&gt;getConfiguration('NotFoundPg'));
        $database-&gt;loadWikiFromDB();
      };
    }
    
    
    ##################
    # Generator request handling
    # handle MAGIC
    #
    
    if ($class eq __PACKAGE__ or 1 ) { 
      
      # only calls in WikiPage use Generators
      # consider the cleaner way of having WikiPage abstract 
      # and creating a WikiPageDisplay class
      
      # set up the array ref unless already there
      $instance-&gt;generators = []
        unless $instance-&gt;generators;
      
        # each entry in this array is itself an array, holding:
          # [0] - the name of the module
          # [1] - the parameter line
      
      # make a list of lowercased module names, with link to the real name
      my %registeredGenerators = map { lc $_, $_ } Generator-&gt;registeredChildClasses;
      
      my @magicrequestlines = $instance-&gt;wiki =~ m[^\#MAGIC\s+(.*)\s+\n]mg;
      
      MAGICLINES: foreach my $line ( @magicrequestlines ) {
        # separate module from params
        my ($modulename, $parameters) = split /\s+/, $line, 2;
        
        # discard a line that does not correspond to a Generator module in this script
        # and get the REAL module name from the hash (wiki text might have wrong case)
        $modulename = $registeredGenerators{lc qq[Generator$modulename]} or 
          next MAGICLINES;
        
        # checking output
        $instance-&gt;wiki .= qq[REAL GENERATOR:'$modulename'];
        
        push @{$instance-&gt;generators}, [$modulename, $parameters];
        
        #$modulename = qq[Generator$modulename];
        #$magicrequests{lc qq[Generator$key]} = $value;
        
        
      }
      
      # %magicrequests = { lowercased module name from wiki, rest of magic line }
      # %registeredGenerators = { lowercased registered class, real name of class }
      
      
      #foreach my $request (keys %magicrequests) {
      #  
      #  $registeredGenerators{$request} and do {
      #    $instance-&gt;wiki .= qq[REAL GENERATOR:'$request'];
      #    
      #  }
      #  
      #  
      #}
      #
      #${$instance-&gt;generators}{foo} = 'bnar' ;
      
      
      #push @{$instance-&gt;generators}, 'foo';
      
      # REPORT 
      
      
    }
    # strip initial #MAGIC lines, whatever the situation
    $instance-&gt;wiki =~ s/\A(\#MAGIC.*\n)+//m;
    
    
    # parse beginning of wiki text for ^#COMMAND eg #MAGIC or #REDIRECT
    # if  #REDIRECT:
      # change $instance = { title }
      # and store instance = { oldtitle }
    # if #MAGIC:
      # neuter the MAGIC parameters for security aspects
      # stash the MAGIC parameters in %$browseParameters 
      
    # look at the registered Generator Modules 
    
  }
    
  #####################################  
  # WikiPage content making  
  
  sub setupGenerators {
    my $self = shift;
    
    # This method draws up a list of any requested Generated Content Modules.
    # These can be requested:
    # - by the name of the page itself, eg 'RecentChanges'
    # - by the wiki content, eg '#MAGIC (modulename)' at the head of markup
    
=pod    =
    my $id = $self-&gt;DBid;
    
    # Check the configuration property BuiltInGenerators
    foreach my $foo ( values %{Page-&gt;getConfiguration('BuiltInGenerators')} ) {
      #$id eq $foo and push 
      
    }
    
=cut=

    #return 'foo';
  }
  
  
  sub makePageContent {
    my $self = shift;
    
    my $text;
    
    $self-&gt;runGenerators
      if $self-&gt;generators;
      
    $text .= $self-&gt;wiki;
    
      
    $self-&gt;appendText($text);
    
    
    return;
  }
  
  sub runGenerators {
    my $self = shift;
    
    for my $generator (@{$self-&gt;generators}) {
      $self-&gt;wiki .= $generator-&gt;[0]-&gt;generateText($self);
      
    }
    
  }
  
  
  sub makePageFooter {
    my $self = shift;
    my $text ;
    
    # stash some things locally to avoid many lookups
    my $tagmaker = $self-&gt;cgiref; # copy of ref to CGI object
    my $id = $self-&gt;DBid; # remember to mangle spaces etc
    my $urlroot = $self-&gt;getScriptName;
    
    $text = $tagmaker-&gt;p(
      join ' | ',
      $tagmaker-&gt;a({-href=&gt;$urlroot . &quot;?action=edit&amp;id=$id&quot;},'Edit this page'),
      $tagmaker-&gt;a({-href=&gt;$urlroot . &quot;?action=history&amp;id=$id&quot;},'View other revisions'),
      );
    $self-&gt;appendText($text);
    $self-&gt;SUPER::makePageFooter;
    return;   
  }
}

###############################################################################
#
#   class RevisionPage
#
#   Display an old revision of a page
#   how this class works really depends on the DB implementation
#
#   This should
#   * alter the &quot;edit&quot; link
#   * prefix the text with a notice giving the revision number

{
  package RevisionPage;
  
  our @ISA = WikiPage;
  RevisionPage-&gt;register();
  
  ###########################################################
  #  Class conditions
  
  sub propConditions { q[$browseParameters-&gt;{revision} ] }
  
  ###########################################################
  #   RevisionPage::blessPage
  #
  #   Check requested revision is a valid number
  
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift; # ref to hash
    
    $instance-&gt;{revision} = $browseParameters-&gt;{revision} ;
    
    unless ( $instance-&gt;{revision} =~ m/^\d+$/ ) {
        blessPage PageError $instance, 
          qq['$instance-&gt;{revision}' is not a valid revision number.];
        return;  
    }
    
    $class-&gt;SUPER::blessPage($instance, $browseParameters); # will bless
    
    # now check with the dabase that the number exists
    
  }
  
  ###########################################################
  #  RevisionPage::Content
  #
  sub makePageContent {
    my $self = shift;
    
    my $revision = $self-&gt;browserequest-&gt;{revision};
    my $text = join '',
      '&lt;p&gt;&lt;em&gt;',
      &quot;Showing revision $revision&quot;,
      '&lt;/em&gt;&lt;/p&gt;';
      
    $self-&gt;appendText($text);
    
    $self-&gt;SUPER::makePageContent;
      
  }
}

###############################################################################
#
#   class WikiPageHistory
#
#   Display the page history: the list of revisions
#   how this class works really depends on the DB implementation
#
#   This should

{
  package WikiPageHistory;
  
  our @ISA = Page;
  WikiPageHistory-&gt;register();
  
  ###########################################################
  #  Class conditions
  
  sub propConditions { q[$browseParameters-&gt;{action} eq 'history' ] }
  
  ###########################################################
  #  Class defaults
  
  sub titlePrefix {q[History of ]}
  
 
  #####################################  
  # WikiPageHistory::blessPage
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift;
  
    unless ( $$browseParameters{id} ) {
      # no id given! Error!
      blessPage PageError $instance,
        q[No id parameter given. Don't know which page's history to display.];
      return;
    }
    
    $instance-&gt;{title} = ( $$browseParameters{id} ); # move up!
      
    bless $instance, $class;
    return;
    }
    
  ###########################################################
  #  Content
  #  WikiPageHistory::makePageContent
  sub makePageContent {
    my $self = shift;
    
    my $revision = $self-&gt;browserequest-&gt;{revision};
    my $text = join '',
      '&lt;p&gt;&lt;em&gt;',
      &quot;History&quot;,
      '&lt;/em&gt;&lt;/p&gt;';
      
    $self-&gt;appendText($text);
    
  }
}


###############################################################################
#
#   class RecentChangesPage
#
# consider keeping this 
# as it's a lot easier than going through config in setupGenerators

{
  package RecentChangesPage;
  
  our @ISA = WikiPage;
  RecentChangesPage-&gt;register();
  
  ###########################################################
  #  Class conditions
  #
  # wiki pages have wiki.cgi?pagename or wiki.cgi/pagename
  # this works out as {keywords}=pagename or $ENV{PATH_INFO}
  
  #sub propConditions { q[$browseParameters-&gt;{keywords} eq 'RecentChangesPage'] }
  
  sub propConditions { q[$browseParameters-&gt;{keywords} eq $class-&gt;getConfiguration('RecentChanges')] }
  
  #####################################  
  # RecentChangesPage::blessPage
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift;
    
    bless $instance, $class;
    
    $instance-&gt;generators = []
      unless $instance-&gt;generators;
    
    push @{$instance-&gt;generators}, ['GeneratorRecentChanges', ''];
    
    $instance-&gt;SUPER::blessPage($instance,$browseParameters);
    
  }
  
  ###########################################################
  #  RecentChangesPage::Content#
=pod  =
  sub makePageContent {
    
    my $self = shift;
    my $text = join '',
      '&lt;div class=&quot;rc&quot;&gt;',
      $self-&gt;DBref-&gt;fetchRClist,
      '&lt;/div&gt;';
    
    $self-&gt;SUPER::makePageContent;
    
    $self-&gt;appendText($text);
    return;
  }
=cut  =
}

###############################################################################
#
#   class WikiAdmin
#
#   just some generic admin page to figure out how to handle user permissions


{
  package WikiAdmin;
  
  our @ISA = Page;
  WikiAdmin-&gt;register();
  
  ###########################################################
  #  Class conditions
  sub propConditions { q[$$browseParameters{action} eq 'admin'] }
  sub pageAccess { 'admin' }
  
  #####################################  
  # WikiAdmin::blessPage
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    $instance-&gt;{title} = 'An admin page';
    
    bless $instance, $class;
    }
  
    
  ###########################################################
  #  Content
  sub makePageContent {
    
    my $self = shift;
    
    $self-&gt;appendText(&quot;An admin page&quot;);
  }
  
}

###############################################################################
#
#   class WikiPageSave
#

{
  package WikiPageSave;
  
  our @ISA = Page; # is not WikiPage because it doesn't handle reading the DB
  WikiPageSave-&gt;register();
  
  ###########################################################
  #  Class conditions
  sub propConditions { q[$$browseParameters{Save} eq 'Save'] }
  
  #####################################  
  # WikiPageSave::blessPage
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift;
    
    # disallow creation of the sample link
    if ( $browseParameters-&gt;{title} eq $class-&gt;getConfiguration('SampleLink') ) {
      blessPage PageError $instance,
        q[That was just a link to show you how it's done. You can't create this page!];
        # even smarter would be auto-wipe it after x days
      return;
    }
    
    $instance-&gt;{wiki} = ( $browseParameters-&gt;{text} ); 
    
    # disallow spam text
    if ( $instance-&gt;{wiki} =~ m/spam/ ) {
      blessPage PageError $instance,
        q[Some of the text you entered contained phrases that matched our Spam Blacklist.];
      return;
    }
   
    # disallow blank page
    if ( $instance-&gt;{wiki} =~ m/^\s*$/ ) {
      blessPage PageError $instance,
        q(Please don't save a blank page. To delete a page, mark it with &quot;[[Legacy:DeletedPage|DeletedPage]]&quot;);
      return;
    }
    
    # also disallow saving of NewPageEdit text unchanged
    
    $instance-&gt;{title} = ( $browseParameters-&gt;{title} ); 
    
    bless $instance, $class;
  }
=pod=
page save is a little problematic.

embedding approach: 
* makePageContent creates an embedding. 
* This allows a &quot;save message&quot; which could later on become a spellchecker.
* unfortunately, we don't get the WikiPage footer 
  (unless we hack around and have this makepageFooter() call WikiPage-&gt;makepageFooter(),
  which is hard-coding a class...
  though we *COULD* call 
  $myembedding-&gt;makepageFooter()
  which is a nice way round it... nice we have access to a WikiPage class via the embedding
  that means we have to stash the embedding in instance data...
  $instance-&gt;{embedded} = $myembedding;
  so we can grab it later

recasting approach
* blessPage blesses as a WikiPage
* no further class content
* unfortunately, we don't get the save message

  #sub makePage {
    # override Page
    
    #doPost in some way
    
    #check for edit conflict
    #or should that be done at the new() stage?
    
    # reset title of $self
    # call make header
      
    # now display the result
    my %EmbeddedPageVariables = ... 
      # recreate page variables
    
      # create a new page object
      # note: can join the new() tree at WikiPage!
    
    $embeddedPage-&gt;makePage();
    my $embeddedText $embeddedPage-&gt;getText;
    $self-&gt;appendText($embeddedText);
=cut    =
    
  #}
  ###########################################################
  #  Content
  #  WikiPageSave::makePageContent
  sub makePageContent {
    
    my $self = shift;
    my $text;
    
    $self-&gt;DBref( DatabaseMono-&gt;new($self) ); # create a DB instance and store ref
    $self-&gt;DBref-&gt;saveWikiToDB(); # save wiki text
    
    
    # save message
    $text = q[&lt;DIV class=&quot;savemessage&quot;&gt;Your text has been saved and the result of your edit is shown below. Thanks for editing!&lt;/DIV&gt;];
      # consider making this text a config property, 
      # or better, stored in a wiki page
      # this could later do things like spellchecking
      
      # add a &quot;clear message&quot; link.
      
    # embed an instance of WikiPage to make the preview
    
    # fake some browser parameters
    my %embeddedParameters;
    $embeddedParameters{keywords} = $self-&gt;title;
    
    # create the instance here
    #my $displayInstance = {};
    
    # for later footer... stash the embedded instance WITHIN our main instance
    $self-&gt;{embed} = {}; # for OO niceness, should obtain an lvalue with a method
    my $displayInstance = $self-&gt;{embed};
    
    # give the embedding some of the references and data we have
    $displayInstance-&gt;{holder}  = $self;
    $displayInstance-&gt;{cgiref}  = $self-&gt;cgiref;
    $displayInstance-&gt;{DBref}   = $self-&gt;DBref;
    $displayInstance-&gt;{wiki}    = $self-&gt;wiki; # give it the save text
    
    blessPage WikiPage $displayInstance, \%embeddedParameters; # bless it
    $displayInstance-&gt;makePageContent; # have it work its stuff
    
    # now retrieve the text and put it into the &quot;real&quot; page
    $text .= $displayInstance-&gt;text;
    $self-&gt;appendText($text);
    
    return;
    
  }
  sub makePageFooter {
    my $self = shift;
    
    # some convoluted stuff to get the makePageFooter() of the embedded display instance
    # blank the text, get the embedding to make a footer and then grab it back.
    # this could be made a lot cleaner if makePageFooter() could detect context
    # and return text if defined wantarray, and embed text if not.
    
    $self-&gt;embed-&gt;text('');
    $self-&gt;embed-&gt;makePageFooter();
    
    my $text = $self-&gt;embed-&gt;text;
    $self-&gt;appendText($text);
    
    return;   
    
    
  }
}

###############################################################################
#
#   class WikiEdit
#
#   Displays a page for editing by the user.
#   An instance of this class checks wiki text stored in itself before 
#   accessing the database: text may have been placed there already 
#   (eg WikiEditPreview)

{
  package WikiEdit;
  
  our @ISA = Page; # might need to be child of WikiPage
  WikiEdit-&gt;register();
  
  ###########################################################
  #  Class conditions
  sub propConditions { q[$$browseParameters{action} eq 'edit'] }
  
  ###########################################################
  #  Class defaults
  sub titlePrefix {q[Editing ]}
  
  #####################################  
  # WikiEdit::blessPage
  sub blessPage {
    # this is an inheritable constructor
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift;
  
    bless $instance, $class;
    
    $instance-&gt;{title} = $browseParameters-&gt;{id}; 
    
    unless ( $instance-&gt;{title} ) {
      # no page title given! Error!
      blessPage PageError $instance,
        q[No 'id' parameter given. Don't know which page to edit.];
      return;
    }
    
    ##################
    # initialize DB, load text from it, handle errors and mishaps
    # UNLESS the instance already holds some wiki text
    # (it will have been placed there by something embedding this instance)
    
    unless ( $instance-&gt;wiki ) {
      my $database = $instance-&gt;{DBref} = DatabaseMono-&gt;new($instance);
      
      # new() has failed to create a DB object?
      ref $database or do {
        blessPage PageError $instance, 
          q[Unable to load the page database or create one.];
        return;  
        }; 
      
      $database-&gt;loadWikiFromDB();
      
      # loadWikiFromDB() has stored an error message?
      $instance-&gt;error and do {
        blessPage PageError $instance, 
          q[Error loading the page from the database.];
        return;  
      };
      
      # the wiki text stored by loadWikiFromDB() is blank?
      $instance-&gt;wiki =~ /^\s*$/ and do {
        $instance-&gt;title( Page-&gt;getConfiguration('NewPageEdit'));
          # TODO: correct value must be restored for save!
        $database-&gt;loadWikiFromDB();
      };
    }
  }
    
  ###########################################################
  #   Content
  #   WikiEdit::makePageContent
  #
  #   wiki content is already placed in the instance property
  
  sub makePageContent {
    
    my $self = shift;
    
    # this needs major work inserting variables and making better use of CGI methods
    my $editbox = &lt;&lt; &quot;EOT&quot;;
&lt;div class=&quot;edit&quot;&gt;
&lt;form method=&quot;post&quot; action=&quot;@{[$self-&gt;getScriptName]}&quot; 
  enctype=&quot;application/x-www-form-urlencoded&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;title&quot; value=&quot;@{[$self-&gt;title]}&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;oldtime&quot; value=&quot;&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;oldconflict&quot; value=&quot;0&quot;&gt;
&lt;textarea name=&quot;text&quot; 
rows=&quot;15&quot; cols=&quot;65&quot; style=&quot;width: 100%;&quot; accesskey=&quot;E&quot;
tabindex=&quot;1&quot;  wrap=&quot;virtual&quot;&gt;
@{[$self-&gt;wiki]}
&lt;/textarea&gt;

&lt;p&gt;
&lt;b&gt;Summary:&lt;/b&gt;
  &lt;input type=&quot;text&quot; name=&quot;summary&quot; value=&quot;*&quot; size=&quot;60&quot; maxlength=&quot;200&quot; tabindex=&quot;2&quot;&gt;&lt;br /&gt;
  &lt;input type=&quot;checkbox&quot; name=&quot;recent_edit&quot; value=&quot;on&quot;&gt;
This change is a minor edit. (Select this only for small changes like spelling or layout fixes.)
&lt;/p&gt;

&lt;p&gt;
&lt;input type=&quot;submit&quot; name=&quot;Save&quot; value=&quot;Save&quot; class=&quot;editbutton&quot; /&gt;
&lt;input type=&quot;submit&quot; name=&quot;Cancel&quot; value=&quot;Cancel&quot; class=&quot;editbutton&quot; /&gt;
&lt;input type=&quot;submit&quot; name=&quot;Preview&quot; value=&quot;Preview&quot; class=&quot;editbutton&quot; /&gt;

&lt;input type=&quot;hidden&quot; name=&quot;.cgifields&quot; value=&quot;recent_edit&quot;&gt;&lt;/form&gt;
&lt;/p&gt;

&lt;/div&gt;
EOT
    #$editbox .= $UseMooWiki::q-&gt;submit(-name=&gt;'Preview', -value=&gt;'Preview', -class=&gt;&quot;editbutton&quot;), &quot;\n&quot;;
    
    $self-&gt;appendText($editbox);
    return;
    
  }
}

###############################################################################
#
#   class WikiEditPreview
#
#   Displays the Preview of a page.
#   Uses the makePageContent() method of its parent, WikiEdit to make the edit
#   box, and then creates an embedded instance to display the preview 
#   (the instance is force-fed the wikisource and then fooled into thinking 
#   it is a real page).
#
#   BEWARE:
#   Due to weirdness, Preview uses 'title' and Edit uses 'id'.
#   This is a UseModWiki legacy glitch. According to Cliff it's a quirk :)

{
  package WikiEditPreview;
  
  our @ISA = WikiEdit;
  WikiEditPreview-&gt;register();
  
  ###########################################################
  #  Class conditions
  sub propConditions { q[$$browseParameters{Preview} eq 'Preview'] }
  
  ###########################################################
  #  Class defaults
  sub titlePrefix {q[Previewing ]}
  
  #####################################  
  #   WikiEditPreview::blessPage
  #
  #   Loads up the instance with the title and the wiki text
  #   for makePageContent to find.
  
  sub blessPage {
    my $class   = shift; $class = (ref $class or $class);
    my $instance = shift; # a ref we will be blessing
    my $browseParameters = shift;
    
    bless $instance, $class;
    
    $instance-&gt;{wiki}  = ( $browseParameters-&gt;{text} ); 
    $instance-&gt;{title} = ( $browseParameters-&gt;{title} );
    
    unless ( $instance-&gt;{title} ) {
      # no page title given! Error!
      # not even sure it's POSSIBLE to get here, since these are POST params.
      blessPage PageError $instance,
        q[No 'title' parameter given. Don't know which page to preview.];
      return;
    }
  }
  
  
  ###########################################################
  #  Content
  #  WikiEditPreview::makePageContent
  sub makePageContent {
    
    my $self = shift;
    
    # edit box and buttons
    $self-&gt;SUPER::makePageContent();
    
    # embed an instance of WikiPage to make the preview
    my %embeddedParameters;
    $embeddedParameters{keywords} = $self-&gt;title;
    # $embeddedParameters{embed} = 1;
      # this is probably not needed. 
      # Setting $previewInstance-&gt;{wiki} should suffice to indicate
      # that beatify is given an embedded instance
    
    my $previewInstance = {};
    
    # give the embedding some of the references and data we have
    $previewInstance-&gt;{holder}  = $self;
    $previewInstance-&gt;{cgiref}  = $self-&gt;cgiref;
    $previewInstance-&gt;{wiki}    = $self-&gt;wiki;
    
    blessPage WikiPage $previewInstance, \%embeddedParameters;
    
    # Preview does not need a database, but some previed pages might.
    # consider making it the responsibility of page objects to check
    # consider making the DBref accessor create a DB if none exists
    $previewInstance-&gt;{DBref}   = DatabaseMono-&gt;new($previewInstance);
    
    $previewInstance-&gt;makePageContent;
    
    my $previewText = $previewInstance-&gt;getText;
    
    $self-&gt;appendText('&lt;div class=&quot;preview&quot;&gt;');
    $self-&gt;appendText($previewText);
    $self-&gt;appendText('&lt;/div&gt;');
    
  }
}

###############################################################################
#
#   class WikiVersion
#   Displays the version of the script

{
  package WikiVersion;
  
  our @ISA = Page;
  WikiVersion-&gt;register();

  ###########################################################
  #  Class conditions
  sub propConditions { q[$$browseParameters{action} eq 'version'] }
  sub propPageTitle  { q[Version information] }
  
  ###########################################################
  #  Content
  sub makePageContent {
    
    my $self = shift;
    
    $self-&gt;appendText(q[&lt;p&gt;UseMOO version number&lt;/p&gt;]);
    return;
  }
}

###############################################################################
#
#   class PageError (non-registering)
#
#   The special error-reporting page. 
#   This displays an error message and forces debug output.

{
  package PageError;
  
  our @ISA = Page;
  
  ###########################################################
  #  Class conditions
  sub pageAccess    { 'user' } # shouldn't be called, but anyway...
  sub propPageTitle { q[Error page] }
  
  #####################################  
  # PageError::blessPage
  sub blessPage {
    my $class     = shift; $class = (ref $class or $class);
    my $instance  = shift; # a ref we will be blessing
    my $message   = shift; # error message passed to us
    
    $instance-&gt;{error} = $message ||
      q[Sorry, the lazy programmer hasn't even provided a decent error message to report!];
      
    $instance-&gt;{title} = ''; # forces use of propPageTitle later.
   
    bless $instance, $class;
    }
    
  ###########################################################
  #  Content
  sub makePageContent {
    my $self = shift;

    my $text = join '',
      $self-&gt;cgiref-&gt;p(
        q[Something's gone wrong with MooWiki.],
        q[There should be an explanation below followed by the browser parameters for debugging.],
        ),
      $self-&gt;cgiref-&gt;p(
        $self-&gt;cgiref-&gt;b(
          $self-&gt;error
          )
        );
    $self-&gt;appendText($text);
  }
  
}

###############################################################################
#
#   package UseMooWiki
#
#   The 'main' package. This:
#
#   reads in additional modules
#   initializes CGI
#   puts some values (such as the request time) into a hash reference to be blessed
#   sends it through the &quot;Blessing Chain&quot;
#   Calls MakePage() on the resulting object
#   prints to the browser the text property of the object

{
  package UseMooWiki ;
  use CGI;

  use vars qw( $q $MaxPost $ThisPage );
  
  #############################################################################
  #
  #   Load plug-ins 
  #
  #   Plug-ins for Moo are modules named moo-*.pm
  #   These should contain classes that should register themselves appropriately
  #
  #   Consider letting module filenames optionally say what type of classes
  #   they contain, eg moo-db-*.pm.
  #   Moo could then decide whether to load them or not later on.
  #   Consider allowing config to specify an order for certain modules... but YAGNI
  
  my @modulefiles = &lt;moo-*.pm&gt;;
  foreach (@modulefiles) {
    require $_;
  }
  
  #############################################################################
  #
  #   Log
  
  # open LOG, &quot;&gt;&gt; moologfile.txt&quot;  or die &quot;can't open logfile:  $!&quot;;

  #############################################################################
  #
  #   Handle CGI request
  
  do {
    # handle cache at this level, probably
    
    ##################################### 
    # Initialize CGI and get variables
    
    $q = new CGI;
    my %PageVariables = $q-&gt;Vars;
    
    if( $ENV{PATH_INFO} &amp;&amp; $ENV{PATH_INFO} ne '/' ) {
      $PageVariables{keywords} = substr($ENV{PATH_INFO}, 1);
      # stuff the path into the variables hash
      # but if the path is just '/' 
      #   DON'T bring the has into existence just for an empty string!
      #   this would muck up the !%$browseParameters condition in WikiPage
    }

###############################################################################
#   POD: Script URLs    
=head1 Script URLs=

Order of precedence for URL is as follows. 
The following go to the HomePage:
wiki.cgi 
wiki.cgi/ 
wiki.cgi/?(anything) &amp;ndash; because why put the / in unless you mean it?

The following go to the page named Foo
wiki.cgi/Foo?Bar &amp;ndash; again, why say /Foo if you don't mean it?
wiki.cgi/Foo?(any actions)
wiki.cgi?Foo
=cut=
#
###############################################################################

    # Equivalent (mostly) to UseMod's InitRequest
    # create a hash reference that will become the page object
    my $requestedPage = {
      now           =&gt; time,
      cgiref        =&gt; $q,
      browserequest =&gt; { $q-&gt;Vars }, 
        # consider accessing %PageVariables via this instead 
        # but remember the tweaking it undergoes for /
      };
      
    Page-&gt;chooseClass($requestedPage, \%PageVariables); # bless the reference
    $requestedPage-&gt;makePage(); # make Page content

    print $requestedPage-&gt;text;

 } if ($Page::configuration{RunCGI} &amp;&amp; ($_ ne 'nocgi')); 
   # see http://www.usemod.com/cgi-bin/wiki.pl?PersistentCGI
   # load the wiki without running it. This is useful for PersistentCGI environments like mod_perl.
}
# End of script. Bye!
&lt;/pre&gt;</text>
    </revision>
    <revision>
      <id>5370</id>
      <timestamp>2007-06-01T02:00:21Z</timestamp>
      <contributor>
        <ip>195.76.80.122</ip>
      </contributor>
      <text xml:space="preserve">[http://wc1.worldcrossing.com/WebX/.1de606d1 free verizon ringtones] verizon ringtones verizon ringtones free verizon ringtones [http://wc1.worldcrossing.com/WebX/.1de606d1 verizon ringtones]  [http://letovic.forumcommunity.net/?f=1056754 alltel ringtones] alltel ringtones alltel ringtones free alltel ringtones [http://letovic.forumcommunity.net/?f=1056754 alltel ringtones]  [http://dcc.syr.edu/dforum/message.asp?MessageID=49027 order alprazolam] alprazolam buy alprazolam alprazolam online [http://dcc.syr.edu/dforum/message.asp?MessageID=49027 buy alprazolam]  [http://sts.ucsd.edu/bugs/patch?patch_number=43&amp;download=1 meridia online] meridia buy meridia meridia online [http://sts.ucsd.edu/bugs/patch?patch_number=43&amp;download=1 buy meridia]  [http://dblife.cs.wisc.edu/markUpDBWorld.cgi?fileName=messages/2007-05/1178193878.html cheap carisoprodol] carisoprodol buy carisoprodol carisoprodol online [http://dblife.cs.wisc.edu/markUpDBWorld.cgi?fileName=messages/2007-05/1178193878.html carisoprodol online]  [http://grid.unimelb.edu.au/twiki/pub/Main/JamesMiller/pusug.htm diazepam online] diazepam buy diazepam diazepam online [http://grid.unimelb.edu.au/twiki/pub/Main/JamesMiller/pusug.htm diazepam online]  [http://www.csulb.edu/~d49er/lounge/messages/8970.html free motorola ringtones] motorola ringtones motorola ringtones free motorola ringtones [http://www.csulb.edu/~d49er/lounge/messages/8970.html motorola ringtones]  [http://shell.ce.sharif.edu/~taghi/nph-proxy.cgi/011100A/http/diving-deep.net/net/vicodin/n83 buy vicodin] vicodin cheap vicodin vicodin online [http://shell.ce.sharif.edu/~taghi/nph-proxy.cgi/011100A/http/diving-deep.net/net/vicodin/n83 cheap vicodin]  [http://pathology.jhu.edu/N/n.web?EP=N&amp;URL=/MCGI/SEND1^WEBUTLTY(200,832241) cheap soma] soma buy soma soma online [http://pathology.jhu.edu/N/n.web?EP=N&amp;URL=/M</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Moofed</title>
    <id>2227</id>
    <revision>
      <id>5390</id>
      <timestamp>2006-09-28T16:28:30Z</timestamp>
      <contributor>
        <ip>Moofed</ip>
      </contributor>
      <comment>Followup</comment>
      <text xml:space="preserve">==Moofed==

I'm a newer member of the Unreal modding community.  I've been a long time fan of the Unreal games (I had an Unreal hat at one time, but it has long since been lost), but only recently have had the time and skills to look at any unrealscript.

===Carjack===

'''Released!''' The results of the Carjack project, including a download of the mod, are available from http://spock.informatics.indiana.edu/~carjack

The performance in general is not that great because of the large amount of physics calculations and AI driver code from about 40 vehicles.  Not recommended for Internet play.  It would have been unplayable FPS-wise had we used an over-the-shoulder camera due to rendering an entire city's worth of static meshes.  The top-down viewpoint avoided that problem nicely.  But, it is fun with a couple friends on a LAN.  Enjoy!

----

Carjack is a mod I am working on to complete the capstone project for my Informatics degree from Indiana University.  It is an attempt to clone the multiplayer gameplay from Grand Theft Auto 2, while making use of the modern amenities found in UnrealEngine2.  My reason for this project is GTA2 has always been a blast to play at LAN parties, but it has certain limitations (such as using DirectPlay 6.1 for its netcode and being limited to 6 players) that make having fun playing it more difficult.

A video showcasing the progress of the project as of mid-Feburary 2006 is available:

https://www.slashtmp.iu.edu/public/download.php?FILE=dlpierce/94788r7kgDF

Yes, I do know that [[Legacy:Mod_Ideas/CarJack|Mod_Ideas/CarJack]] has the same name, but I didn't see that page until we had already started work.  Plus &quot;Carjack&quot; is only a working title for now, it may change.

====Civilians====

Part of what makes GTA2 so neat is there are hordes of civilians wondering the streets that pose no threat to the player.  I anticipate this feature to be one of the more difficult in developing the mod, and is why I am writing about it here.  What I want to make happen is
* Have civilian vehicles driving on city streets
** These drivers should stop when something is in front of them, and when they come to a (red) traffic light.
** They must drive on the streets, but will become spooked by gunshots and then drive erratically/aggressively or get out of the vehicle and run for their lives (effectively becoming a spooked pedestrian, see below).
** A predetermined number of civilian vehicles will exist in the game at any one time.  When one is destroyed, another is spawned at a random VehicleFactory location. Ideally, this will not be visible to the players.  I am imagining a garage with doors that open up and the new civilian drives out.  Only spawned civilians would be allowed out, no one allowed in.
* Have civilian pedestrians wandering the sidewalks.
** Pedestrians stay on the sidewalks unless spooked, at which point they run away from the player.
** There is a chance the pedestrian will not be a total pushover and will whip out a pistol and start shooting back.
** Killed pedestrians have a chance of dropping an item (weapon, health, whatever).

To do all this I think I will need three seperate bot paths, two for vehicles (one for each side of the road) and one for pedestrians, plus some extra pathnodes only available to bots (if I got that far) and spooked NPCs.  Spooked NPCs would also have the vehicle pathnodes at their disposal.  Functioning stop lights are also necessary to make a believable traffic simulation, but obviously add much more complexity to the problem.

'''Update:''' After much experimentation, I have decided that the NavigationPoint system is not suitable for what I want to do.  The autoconnecting behavior ruins any attempt to make  seperate paths from nodes in close proximity (such as the two lanes of a road).  

Instead I have made a custom network of Actor nodes that each have an array of nodes that the vehicle can go to next (randomly selected).  This has the advantage of allowing the mapper to precisely define the map's traffic behavior, and the disadvantages of not being automated like NavigationPoints are, and not having any lines displayed in UnrealEd.  I can display the network inside the game using HUD.Draw3DLine, but UnrealEd has no HUDs as far as I can tell (or any way to change anything actually).  I am thinking of making using a similar node network for civilian pedestrians, leaving the NavigationPoint network free to be dedicated to bots.

At first I was using MoveToward to make my vehicles move, but this again was insufficient.  MoveToward dis not control the steering acurately enough to stay on the correct side of the road, instead the drivers would drunkenly drift over the centerline or onto the sidewalks.  MoveToward also has no interface to control the vehicle's throttle, giving the all civilians a severe case of lead foot.  This is my current driver controller:

&lt;div class=&quot;hidden-block&quot;&gt;&lt;span class=&quot;hint&quot;&gt;&lt;uscript&gt;&lt;/span&gt;&lt;div class=&quot;hidden&quot;&gt;class CarjackDriver extends CarjackNPC;

var int NumRandomJumps;
var Actor RandDest;
var Actor TempPoint;
var CarjackRoadNode DestRoadNode;
var float DriverThrottle, DriverSteering; //Sets respective vehicle variables via Tick in the vehicle's code

function CarjackRoadNode FindRandomRoadNode()
{
	local array&lt;CarjackRoadNode&gt; NodeList;
	local CarjackRoadNode Node;
	local int i;
	
	foreach AllActors(class'CarjackRoadNode', Node)
	{
		NodeList[i] = Node;
		i++;
	}
	return NodeList[Rand(NodeList.Length)];
}

function CarjackRoadNode FindNearestRoadNode()
{
	local CarjackRoadNode Node, ClosestNode;
	local float Dist, ClosestDist;
	
	ClosestDist = 100000.0;
	
	foreach AllActors(class'CarjackRoadNode', Node)
	{
		Dist = VSize(Node.Location - Pawn.Location);
		if (Dist &lt; ClosestDist)
		{
			ClosestNode = Node;
			ClosestDist = Dist;
		}
	}
	return ClosestNode;
}

function CarjackRoadNode FindNextRoadNode(CarjackRoadNode CurrentNode)
{
	return CurrentNode.GetNextNode();
}

//Check for Pawns in the way.
function bool CheckObstruction()
{
	local vector HitLocation, HitNormal, ExtentSize;
	
	ExtentSize.X = CarjackVehicle(Pawn).VehicleWidth;
	ExtentSize.Y = CarjackVehicle(Pawn).VehicleWidth;
	
	if (Pawn(Trace(HitLocation, HitNormal, (vector(Pawn.Rotation) * 250) + Pawn.Location, Pawn.Location, true, ExtentSize)) != None)
	{
		return true;
	}
	return false;
}

auto state Driving
{
	function SetThrottle()
	{
		local Vehicle V;
		
		V = Vehicle(Pawn);
		
		if (VSize(V.Velocity) &gt; DestRoadNode.SpeedLimit)
		{
			DriverThrottle = 0.25;
		}
		else
		{
			DriverThrottle = 0.90;
		}
	}
	
	function SetSteering()
	{
		local float RadiansDelta, RightOrLeft, ForwardOrBackward;
		local Vehicle V;
		
		V = Vehicle(Pawn);
		
		RadiansDelta = Acos(Normal(vector(V.Rotation)) dot Normal(DestRoadNode.Location - V.Location));
		RightOrLeft = ((vector(V.Rotation)) cross vect(0,0,1)) dot Normal(DestRoadNode.Location - V.Location);
		ForwardOrBackward = vector(V.Rotation) dot Normal(DestRoadNode.Location - V.Location);
		
		if (RightOrLeft &lt; 0.0) // Turn Left
		{
			DriverSteering = FClamp(RadiansDelta, 0.0, 1.0) * -1;
		}
		else if (RightOrLeft &gt; 0.0) // Turn Right
		{
			DriverSteering = FClamp(RadiansDelta, 0.0, 1.0);
		}
		else
		{
			DriverSteering = 0.0;
		}
	}
	
Begin:
	if (DestRoadNode == None)
	{
		DestRoadNode = FindNearestRoadNode();
	}
	
	if (CheckObstruction())
	{
		GoToState('Obstructed');
	}
	
	if (VSize(DestRoadNode.Location - Pawn.Location) &lt; 200)
	{
		if (DestRoadNode.bStopTraffic)
		{
			GotoState('Stopped');
		}
		else
		{
			DestRoadNode = FindNextRoadNode(DestRoadNode);
		}
	}
	
	SetThrottle();
	SetSteering();
	
	Sleep(0.2);
	Goto('Begin');
}

state Stopped
{
	function SetThrottle()
	{
		DriverThrottle = 0;
	}
	
Begin:
	SetThrottle();
	if (!DestRoadNode.bStopTraffic)
	{
		GotoState('Driving');
	}
	Sleep(0.5);
	Goto('Begin');
}

state Obstructed
{
	function SetThrottle()
	{
		DriverThrottle = 0;
	}
	
Begin:
	SetThrottle();
	if (!CheckObstruction())
	{
		GotoState('Driving');
	}
	Sleep(0.5);
	Goto('Begin');
}
&lt;/uscript&gt;&lt;/div&gt;&lt;/div&gt;

Thoughts please.

==Discussion==

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Jimboh:''' Hmm...civilians are surprisingly easy. All you have to do is create a pawn...then create an AIController without the monster states - add the model, and PRESTO! Instant Civilian! Of course then you'd have to create some botpaths for your civvies. I remember in Tanus' Syndicate 2003 MOD he had a tutorial on NPC's...the site is down, so if anyone has the tutorial saved, it would be most helpful...

'''Sweavo:''' Hi there, I posted that [[Legacy:Mod Ideas/Civilians|Mod Ideas/Civilians]] page.  I'm interested in following progress and assisting in this mod.  I'm thinking off-map factories too.  See DM-Autoroute2 for a map that would really benefit from civilians.  I anticipate the '''hardest''' part of this is realistic AI, combining the &quot;milling about&quot; behaviour with the &quot;spooked&quot; to make the civilians look like they have a back-story, .  Once that bit's done, the '''most work''' would likely be coming up with meshes and textures for the pawns and vehicles.  I have no clue when it comes to modelling.  Maybe the unwheel project has spare vehicles that can be adapted.

'''SuperApe:''' Hi, Moofed. (Welcome :))  What Jimboh is saying is true.  It can be easy, but I agree with Sweavo too, in that you'd probably want a different kind of AI.  And I think different models, animations and skins are a good idea too. (animations without weapon-holding for example)  I suggest, because most of what makes up a Bot and xPawn are geared for combat, borrow what you can from them (perhaps use them for testing purposes too) and then begin to implement your own custom stuff.  You and Sweavo should take a look at the [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]], it should not be too hard to implement a custom civilian model and animation.  And, check out [[Legacy:NPC Support|NPC Support]] for ideas.  Can't wait to see what you guys come up with.  It sounds neat. :)

'''Moofed:''' Thanks for the warm welcome everyone! :cheesy:  I should mention that there are two other people working on the mod, one who is concentrating on building a cityscape map, the other is a modeler and is making a first set of real world vehicles to play with, not to mention some staticmeshes for the map.  I'm already using some of the skidmark code from UnWheel (with permission of course), so I might see about including some of their vehicles as well.  They've been a great help for resolving scaling issues already.  I'll try to get a basic pedestrian working tonight.

'''Tarquin:''' Hi, welcome. Interesting project!

'''Moofed:''' I thought this would be a simple task, but the FindRandomDest() function insists upon returning nothing but None.  If I extend from MonsterController the function works, but as already stated. we want to extend from Controller.  Help?

'''SuperApe:''' Sorry, FindRandomDest() is an EMPTY function.  It's actually used in a few places, but it's completely useless in stock Controller classes.  It must have been defined for subclass use.  But, no big deal.  Finding a ''random'' destination isn't much harder than picking a NavigationPoint that isn't &lt;tt&gt;taken&lt;/tt&gt;.  &lt;uscript&gt;function NavigationPoint FindRandomDest()
{
     local NavigationPoint N;
     local array&lt;NavigationPoint&gt; NP;
     local int i;

     NP.Insert(i,1);
     forEach AllActors( class'NavigationPoint', N )
          if ( !N.taken )
          {
               NP[i] = N;
               i++;
               NP.Insert(i,1);
          }
     return NP[ FRand() * i ];
}&lt;/uscript&gt;Re-define as necessary. :)

'''Moofed:''' Thanks!  I saw &lt;uscript&gt;native(525) final function NavigationPoint FindRandomDest();&lt;/uscript&gt; so I thought it couldn't be overridden and the source would not be available. Maybe it is overridden in yet more native code...

'''SuperApe:''' Well, whether there is some code to it now or not, I suppose you might as well try to override it for your custom purposes in the Pedestrian/Civilian controller.  If you can't override it, perhaps you can use this code anyway in a similar function.

'''Draconx:''' This is what I use in my mod for original UT... assuming it still works (Why wouldn't it...) it is much more efficient than the above foreach AllActors method.&lt;uscript&gt;for (N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint)&lt;/uscript&gt;

'''SuperApe:''' That's great! :)  I can use that too.  Thanks.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5391</id>
      <timestamp>2006-02-06T16:47:50Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Moofed==

I'm a newer member of the Unreal modding community.  I've been a long time fan of the Unreal games (I had an Unreal hat at one time, but it has long since been lost), but only recently have had the time and skills to look at any unrealscript.

===Carjack===

Carjack is a mod I am working on to complete the capstone project for my Informatics degree from Indiana University.  It is an attempt to clone the multiplayer gameplay from Grand Theft Auto 2, while making use of the modern amenities found in UnrealEngine2.  My reason for this project is GTA2 has always been a blast to play at LAN parties, but it has certain limitations (such as using DirectPlay 6.1 for its netcode and being limited to 6 players) that make having fun playing it more difficult.  

Yes, I do know that [[Legacy:Mod_Ideas/CarJack|Mod_Ideas/CarJack]] has the same name, but I didn't see that page until we had already started work.  Plus &quot;Carjack&quot; is only a working title for now, it may change.

====Civilians====

Part of what makes GTA2 so neat is there are hordes of civilians wondering the streets that pose no threat to the player.  I anticipate this feature to be one of the more difficult in developing the mod, and is why I am writing about it here.  What I want to make happen is
* Have civilian vehicles driving on city streets
** These drivers should stop when something is in front of them, and when they come to a (red) traffic light.
** They must drive on the streets, but will become spooked by gunshots and then drive erratically/aggressively or get out of the vehicle and run for their lives (effectively becoming a spooked pedestrian, see below).
** A predetermined number of civilian vehicles will exist in the game at any one time.  When one is destroyed, another is spawned at a random VehicleFactory location. Ideally, this will not be visible to the players.  I am imagining a garage with doors that open up and the new civilian drives out.  Only spawned civilians would be allowed out, no one allowed in.
* Have civilian pedestrians wandering the sidewalks.
** Pedestrians stay on the sidewalks unless spooked, at which point they run away from the player.
** There is a chance the pedestrian will not be a total pushover and will whip out a pistol and start shooting back.
** Killed pedestrians have a chance of dropping an item (weapon, health, whatever).

To do all this I think I will need three seperate bot paths, two for vehicles (one for each side of the road) and one for pedestrians, plus some extra pathnodes only available to bots (if I got that far) and spooked NPCs.  Spooked NPCs would also have the vehicle pathnodes at their disposal.  Functioning stop lights are also necessary to make a believable traffic simulation, but obviously add much more complexity to the problem.

Thoughts please.

==Discussion==

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Jimboh:''' Hmm...civilians are surprisingly easy. All you have to do is create a pawn...then create an AIController without the monster states - add the model, and PRESTO! Instant Civilian! Of course then you'd have to create some botpaths for your civvies. I remember in Tanus' Syndicate 2003 MOD he had a tutorial on NPC's...the site is down, so if anyone has the tutorial saved, it would be most helpful...

'''Sweavo:''' Hi there, I posted that [[Legacy:Mod Ideas/Civilians|Mod Ideas/Civilians]] page.  I'm interested in following progress and assisting in this mod.  I'm thinking off-map factories too.  See DM-Autoroute2 for a map that would really benefit from civilians.  I anticipate the '''hardest''' part of this is realistic AI, combining the &quot;milling about&quot; behaviour with the &quot;spooked&quot; to make the civilians look like they have a back-story, .  Once that bit's done, the '''most work''' would likely be coming up with meshes and textures for the pawns and vehicles.  I have no clue when it comes to modelling.  Maybe the unwheel project has spare vehicles that can be adapted.

'''SuperApe:''' Hi, Moofed. (Welcome :))  What Jimboh is saying is true.  It can be easy, but I agree with Sweavo too, in that you'd probably want a different kind of AI.  And I think different models, animations and skins are a good idea too. (animations without weapon-holding for example)  I suggest, because most of what makes up a Bot and xPawn are geared for combat, borrow what you can from them (perhaps use them for testing purposes too) and then begin to implement your own custom stuff.  You and Sweavo should take a look at the [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]], it should not be too hard to implement a custom civilian model and animation.  And, check out [[Legacy:NPC Support|NPC Support]] for ideas.  Can't wait to see what you guys come up with.  It sounds neat. :)

'''Moofed:''' Thanks for the warm welcome everyone! :cheesy:  I should mention that there are two other people working on the mod, one who is concentrating on building a cityscape map, the other is a modeler and is making a first set of real world vehicles to play with, not to mention some staticmeshes for the map.  I'm already using some of the skidmark code from UnWheel (with permission of course), so I might see about including some of their vehicles as well.  They've been a great help for resolving scaling issues already.  I'll try to get a basic pedestrian working tonight.

'''Tarquin:''' Hi, welcome. Interesting project!

'''Moofed:''' I thought this would be a simple task, but the FindRandomDest() function insists upon returning nothing but None.  If I extend from MonsterController the function works, but as already stated. we want to extend from Controller.  Help?

'''SuperApe:''' Sorry, FindRandomDest() is an EMPTY function.  It's actually used in a few places, but it's completely useless in stock Controller classes.  It must have been defined for subclass use.  But, no big deal.  Finding a ''random'' destination isn't much harder than picking a NavigationPoint that isn't &lt;tt&gt;taken&lt;/tt&gt;.  &lt;uscript&gt;function NavigationPoint FindRandomDest()
{
     local NavigationPoint N;
     local array&lt;NavigationPoint&gt; NP;
     local int i;

     NP.Insert(i,1);
     forEach AllActors( class'NavigationPoint', N )
          if ( !N.taken )
          {
               NP[i] = N;
               i++;
               NP.Insert(i,1);
          }
     return NP[ FRand() * i ];
}&lt;/uscript&gt;Re-define as necessary. :)

'''Moofed:''' Thanks!  I saw &lt;uscript&gt;native(525) final function NavigationPoint FindRandomDest();&lt;/uscript&gt; so I thought it couldn't be overridden and the source would not be available. Maybe it is overridden in yet more native code...

'''SuperApe:''' Well, whether there is some code to it now or not, I suppose you might as well try to override it for your custom purposes in the Pedestrian/Civilian controller.  If you can't override it, perhaps you can use this code anyway in a similar function.

'''Draconx:''' This is what I use in my mod for original UT... assuming it still works (Why wouldn't it...) it is much more efficient than the above foreach AllActors method.&lt;uscript&gt;for (N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint)&lt;/uscript&gt;

'''SuperApe:''' That's great! :)  I can use that too.  Thanks.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5392</id>
      <timestamp>2006-03-05T22:30:29Z</timestamp>
      <contributor>
        <ip>Moofed</ip>
      </contributor>
      <comment>Update</comment>
      <text xml:space="preserve">==Moofed==

I'm a newer member of the Unreal modding community.  I've been a long time fan of the Unreal games (I had an Unreal hat at one time, but it has long since been lost), but only recently have had the time and skills to look at any unrealscript.

===Carjack===

Carjack is a mod I am working on to complete the capstone project for my Informatics degree from Indiana University.  It is an attempt to clone the multiplayer gameplay from Grand Theft Auto 2, while making use of the modern amenities found in UnrealEngine2.  My reason for this project is GTA2 has always been a blast to play at LAN parties, but it has certain limitations (such as using DirectPlay 6.1 for its netcode and being limited to 6 players) that make having fun playing it more difficult.

A video showcasing the progress of the project as of mid-Feburary 2006 is available:

https://www.slashtmp.iu.edu/public/download.php?FILE=dlpierce/94788r7kgDF

Yes, I do know that [[Legacy:Mod_Ideas/CarJack|Mod_Ideas/CarJack]] has the same name, but I didn't see that page until we had already started work.  Plus &quot;Carjack&quot; is only a working title for now, it may change.

====Civilians====

Part of what makes GTA2 so neat is there are hordes of civilians wondering the streets that pose no threat to the player.  I anticipate this feature to be one of the more difficult in developing the mod, and is why I am writing about it here.  What I want to make happen is
* Have civilian vehicles driving on city streets
** These drivers should stop when something is in front of them, and when they come to a (red) traffic light.
** They must drive on the streets, but will become spooked by gunshots and then drive erratically/aggressively or get out of the vehicle and run for their lives (effectively becoming a spooked pedestrian, see below).
** A predetermined number of civilian vehicles will exist in the game at any one time.  When one is destroyed, another is spawned at a random VehicleFactory location. Ideally, this will not be visible to the players.  I am imagining a garage with doors that open up and the new civilian drives out.  Only spawned civilians would be allowed out, no one allowed in.
* Have civilian pedestrians wandering the sidewalks.
** Pedestrians stay on the sidewalks unless spooked, at which point they run away from the player.
** There is a chance the pedestrian will not be a total pushover and will whip out a pistol and start shooting back.
** Killed pedestrians have a chance of dropping an item (weapon, health, whatever).

To do all this I think I will need three seperate bot paths, two for vehicles (one for each side of the road) and one for pedestrians, plus some extra pathnodes only available to bots (if I got that far) and spooked NPCs.  Spooked NPCs would also have the vehicle pathnodes at their disposal.  Functioning stop lights are also necessary to make a believable traffic simulation, but obviously add much more complexity to the problem.

'''Update:''' After much experimentation, I have decided that the NavigationPoint system is not suitable for what I want to do.  The autoconnecting behavior ruins any attempt to make  seperate paths from nodes in close proximity (such as the two lanes of a road).  

Instead I have made a custom network of Actor nodes that each have an array of nodes that the vehicle can go to next (randomly selected).  This has the advantage of allowing the mapper to precisely define the map's traffic behavior, and the disadvantages of not being automated like NavigationPoints are, and not having any lines displayed in UnrealEd.  I can display the network inside the game using HUD.Draw3DLine, but UnrealEd has no HUDs as far as I can tell (or any way to change anything actually).  I am thinking of making using a similar node network for civilian pedestrians, leaving the NavigationPoint network free to be dedicated to bots.

At first I was using MoveToward to make my vehicles move, but this again was insufficient.  MoveToward dis not control the steering acurately enough to stay on the correct side of the road, instead the drivers would drunkenly drift over the centerline or onto the sidewalks.  MoveToward also has no interface to control the vehicle's throttle, giving the all civilians a severe case of lead foot.  This is my current driver controller:

&lt;uscript&gt;
class CarjackDriver extends CarjackNPC;

var int NumRandomJumps;
var Actor RandDest;
var Actor TempPoint;
var CarjackRoadNode DestRoadNode;
var float DriverThrottle, DriverSteering; //Sets respective vehicle variables via Tick in the vehicle's code

function CarjackRoadNode FindRandomRoadNode()
{
	local array&lt;CarjackRoadNode&gt; NodeList;
	local CarjackRoadNode Node;
	local int i;
	
	foreach AllActors(class'CarjackRoadNode', Node)
	{
		NodeList[i] = Node;
		i++;
	}
	return NodeList[Rand(NodeList.Length)];
}

function CarjackRoadNode FindNearestRoadNode()
{
	local CarjackRoadNode Node, ClosestNode;
	local float Dist, ClosestDist;
	
	ClosestDist = 100000.0;
	
	foreach AllActors(class'CarjackRoadNode', Node)
	{
		Dist = VSize(Node.Location - Pawn.Location);
		if (Dist &lt; ClosestDist)
		{
			ClosestNode = Node;
			ClosestDist = Dist;
		}
	}
	return ClosestNode;
}

function CarjackRoadNode FindNextRoadNode(CarjackRoadNode CurrentNode)
{
	return CurrentNode.GetNextNode();
}

//Check for Pawns in the way.
function bool CheckObstruction()
{
	local vector HitLocation, HitNormal, ExtentSize;
	
	ExtentSize.X = CarjackVehicle(Pawn).VehicleWidth;
	ExtentSize.Y = CarjackVehicle(Pawn).VehicleWidth;
	
	if (Pawn(Trace(HitLocation, HitNormal, (vector(Pawn.Rotation) * 250) + Pawn.Location, Pawn.Location, true, ExtentSize)) != None)
	{
		return true;
	}
	return false;
}

auto state Driving
{
	function SetThrottle()
	{
		local Vehicle V;
		
		V = Vehicle(Pawn);
		
		if (VSize(V.Velocity) &gt; DestRoadNode.SpeedLimit)
		{
			DriverThrottle = 0.25;
		}
		else
		{
			DriverThrottle = 0.90;
		}
	}
	
	function SetSteering()
	{
		local float RadiansDelta, RightOrLeft, ForwardOrBackward;
		local Vehicle V;
		
		V = Vehicle(Pawn);
		
		RadiansDelta = Acos(Normal(vector(V.Rotation)) dot Normal(DestRoadNode.Location - V.Location));
		RightOrLeft = ((vector(V.Rotation)) cross vect(0,0,1)) dot Normal(DestRoadNode.Location - V.Location);
		ForwardOrBackward = vector(V.Rotation) dot Normal(DestRoadNode.Location - V.Location);
		
		if (RightOrLeft &lt; 0.0) // Turn Left
		{
			DriverSteering = FClamp(RadiansDelta, 0.0, 1.0) * -1;
		}
		else if (RightOrLeft &gt; 0.0) // Turn Right
		{
			DriverSteering = FClamp(RadiansDelta, 0.0, 1.0);
		}
		else
		{
			DriverSteering = 0.0;
		}
	}
	
Begin:
	if (DestRoadNode == None)
	{
		DestRoadNode = FindNearestRoadNode();
	}
	
	if (CheckObstruction())
	{
		GoToState('Obstructed');
	}
	
	if (VSize(DestRoadNode.Location - Pawn.Location) &lt; 200)
	{
		if (DestRoadNode.bStopTraffic)
		{
			GotoState('Stopped');
		}
		else
		{
			DestRoadNode = FindNextRoadNode(DestRoadNode);
		}
	}
	
	SetThrottle();
	SetSteering();
	
	Sleep(0.2);
	Goto('Begin');
}

state Stopped
{
	function SetThrottle()
	{
		DriverThrottle = 0;
	}
	
Begin:
	SetThrottle();
	if (!DestRoadNode.bStopTraffic)
	{
		GotoState('Driving');
	}
	Sleep(0.5);
	Goto('Begin');
}

state Obstructed
{
	function SetThrottle()
	{
		DriverThrottle = 0;
	}
	
Begin:
	SetThrottle();
	if (!CheckObstruction())
	{
		GotoState('Driving');
	}
	Sleep(0.5);
	Goto('Begin');
}
&lt;/uscript&gt;

Thoughts please.

==Discussion==

'''Wormbo:''' Hi and welcome to the Wiki. :)

'''Jimboh:''' Hmm...civilians are surprisingly easy. All you have to do is create a pawn...then create an AIController without the monster states - add the model, and PRESTO! Instant Civilian! Of course then you'd have to create some botpaths for your civvies. I remember in Tanus' Syndicate 2003 MOD he had a tutorial on NPC's...the site is down, so if anyone has the tutorial saved, it would be most helpful...

'''Sweavo:''' Hi there, I posted that [[Legacy:Mod Ideas/Civilians|Mod Ideas/Civilians]] page.  I'm interested in following progress and assisting in this mod.  I'm thinking off-map factories too.  See DM-Autoroute2 for a map that would really benefit from civilians.  I anticipate the '''hardest''' part of this is realistic AI, combining the &quot;milling about&quot; behaviour with the &quot;spooked&quot; to make the civilians look like they have a back-story, .  Once that bit's done, the '''most work''' would likely be coming up with meshes and textures for the pawns and vehicles.  I have no clue when it comes to modelling.  Maybe the unwheel project has spare vehicles that can be adapted.

'''SuperApe:''' Hi, Moofed. (Welcome :))  What Jimboh is saying is true.  It can be easy, but I agree with Sweavo too, in that you'd probably want a different kind of AI.  And I think different models, animations and skins are a good idea too. (animations without weapon-holding for example)  I suggest, because most of what makes up a Bot and xPawn are geared for combat, borrow what you can from them (perhaps use them for testing purposes too) and then begin to implement your own custom stuff.  You and Sweavo should take a look at the [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]], it should not be too hard to implement a custom civilian model and animation.  And, check out [[Legacy:NPC Support|NPC Support]] for ideas.  Can't wait to see what you guys come up with.  It sounds neat. :)

'''Moofed:''' Thanks for the warm welcome everyone! :cheesy:  I should mention that there are two other people working on the mod, one who is concentrating on building a cityscape map, the other is a modeler and is making a first set of real world vehicles to play with, not to mention some staticmeshes for the map.  I'm already using some of the skidmark code from UnWheel (with permission of course), so I might see about including some of their vehicles as well.  They've been a great help for resolving scaling issues already.  I'll try to get a basic pedestrian working tonight.

'''Tarquin:''' Hi, welcome. Interesting project!

'''Moofed:''' I thought this would be a simple task, but the FindRandomDest() function insists upon returning nothing but None.  If I extend from MonsterController the function works, but as already stated. we want to extend from Controller.  Help?

'''SuperApe:''' Sorry, FindRandomDest() is an EMPTY function.  It's actually used in a few places, but it's completely useless in stock Controller classes.  It must have been defined for subclass use.  But, no big deal.  Finding a ''random'' destination isn't much harder than picking a NavigationPoint that isn't &lt;tt&gt;taken&lt;/tt&gt;.  &lt;uscript&gt;function NavigationPoint FindRandomDest()
{
     local NavigationPoint N;
     local array&lt;NavigationPoint&gt; NP;
     local int i;

     NP.Insert(i,1);
     forEach AllActors( class'NavigationPoint', N )
          if ( !N.taken )
          {
               NP[i] = N;
               i++;
               NP.Insert(i,1);
          }
     return NP[ FRand() * i ];
}&lt;/uscript&gt;Re-define as necessary. :)

'''Moofed:''' Thanks!  I saw &lt;uscript&gt;native(525) final function NavigationPoint FindRandomDest();&lt;/uscript&gt; so I thought it couldn't be overridden and the source would not be available. Maybe it is overridden in yet more native code...

'''SuperApe:''' Well, whether there is some code to it now or not, I suppose you might as well try to override it for your custom purposes in the Pedestrian/Civilian controller.  If you can't override it, perhaps you can use this code anyway in a similar function.

'''Draconx:''' This is what I use in my mod for original UT... assuming it still works (Why wouldn't it...) it is much more efficient than the above foreach AllActors method.&lt;uscript&gt;for (N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint)&lt;/uscript&gt;

'''SuperApe:''' That's great! :)  I can use that too.  Thanks.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MortarSpawner</title>
    <id>2073</id>
    <revision>
      <id>5049</id>
      <timestamp>2003-02-13T03:23:45Z</timestamp>
      <contributor>
        <ip>CPE0050ba4fe0fc-CM014270108706.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">A mortarSpawn is used to launch mortars, set the angle power etc, its really just trail and error</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito</title>
    <id>2074</id>
    <revision>
      <id>5050</id>
      <timestamp>2008-02-14T02:41:02Z</timestamp>
      <contributor>
        <ip>CPE00142a3858fa-CM001868e9f41a.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Just me deleting my own page. Brought here by google and no longer involved in the unreal scene</text>
    </revision>
    <revision>
      <id>5051</id>
      <timestamp>2006-12-11T10:20:11Z</timestamp>
      <contributor>
        <ip>CPE00142a3858fa-CM014270108706.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>Space fighter mod - anyone interested?</comment>
      <text xml:space="preserve">===Main===

Name: Tom &quot;Mosquito/Moz&quot; Hall

Occupation: Student

Contact:
* Gmail/MSN Tom.c.Hall@gmail.com

====UPDATE DEC 2006====

Mostly doing Red Orchestra Related Things.

Finished Projects:

The level [http://www.redorchestragame.com/forum/showthread.php?t=15159 Black Day in July] set around the battle of Kursk

* This Level landed 3rd place in a Red Orchestra Dev hosted mapping competition.

====thingies====
*My Journal [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Journal]]
*My Notebook of random garbage [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Notebook]]

===Discussion===

'''Mosquito:''' I been wanting to do a realistic Spacefighter oriented mod ever since I heard that RO had an extended view distance for ages now but there is a extremely tiny amount of people in the actually know how to use unreal script.

Is there anyone left on the desolate wiki that would be interested.

I posted up a limited design document on my [http://tom.c.hall.googlepages.com/facingworlds Google pages] months ago but the lack of coders caused it to fizzle quickly.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito.L5</title>
    <id>2115</id>
    <revision>
      <id>5152</id>
      <timestamp>2003-09-19T16:10:36Z</timestamp>
      <contributor>
        <ip>Mosquito.L5</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[http://www.teroldor.com/ The Legend of Teroldor] -  Dark ages UT2003 mod with swords and magic.</text>
    </revision>
    <revision>
      <id>5153</id>
      <timestamp>2003-09-19T16:09:12Z</timestamp>
      <contributor>
        <ip>Mosquito.L5</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[http://www.teroldor.com/|The Legend of Teroldor]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito.L5/Conquest Europe</title>
    <id>2183</id>
    <revision>
      <id>5295</id>
      <timestamp>2004-07-23T08:21:31Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview ==

; Info
:'''Status:''' Dormant
:'''Team Members:''' None
:'''Release Date:''' Unknown
:'''Moddb Link:''' http://mods.moddb.com/1107/?view=all

;Description

Conquest Europe is a total conversion for UT2003 and centers around teh conflicts of WWII.  What makes this mod different from other WWII mods for UT2003, is that CE is a superscience world where scientists were allowed to make all of their weird discoveries.  The world will see new weapons, not only man portable but machine portable too.  Tesla tanks, German rocket troops, and walking tanks.  The focus for this era is the tall 'Walkers'.  12 foot tall walking tanks that are used mostly for Infantry support.

;Features
* Realistic WWII weapons available.
* New superscience weapons available.
* Drive tanks and walkers.
* Class based.
* RPG based.
* Several modes of gameplay available.

==Discussion ==

==News ==

====May 23 : No News :P ====
: Still no news.  Actually, I move this from my main page to this page so I could have comments on it and post news.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito.L5/Developer Journal</title>
    <id>2182</id>
    <revision>
      <id>5294</id>
      <timestamp>2004-07-23T08:19:24Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This journal will be a record of my struggles and successes in developing my UT2003 mod, Operation: Homeworld, as well as my big project, Fate of Terra Nova, which is a total conversion for Halflife.  Please don't edit anything here but feel free to post comments and tell me if there are any spelling mistakes.

==Operation: Homeworld==

===May 19, 2003===

For my first entry, I will describe what I'd like to see in this mod.  Op-Homeworld is a total conversion that has 3 teams battling against eachother.  Now there are a couple mods out that that have this same idea, such as the Riftwar mod.  In my efforts to design this project, I have tried to find other mods that may be the same and move away from any familiarities.  I know that's important in trying to get interest for it.

So, there are 3 teams fighting for control of Earth.  You have the resident humans.  The humans are not going to look like the ones in UT2003.  I hope to have new models made.  Rather, they will look like modern military soldiers, like those that went to all those desert campaigns.  They will have camo shirts and pants with a flak vest.  The camo may be different depending on the map that is played, so that the players can take advantage of camoflauging themselves )if they're smart).  Human weaponry will be modern day weapons such as the FN P90 and several of the FN pistols.  However, there will also be certain superscience weaponry available, such as EMP weapons.

Well, as the story goes, the humans created an AI controlled entity, which for now we are called robots.  These robots turned against the humans because their AI got to smart.  The 'bots look more like those in the Terminator movies then the models that come with UT2003.  They won't have very many weapons and won't be able to pick up weapons.  All of their weapons are going to be attached to their bodies.  They will have special seeing modes, perhaps something like heat vision like the predators do on AvP.  Each 'bot comes with a melee weapon attached to 1 arm.  They will be slow moving but very hard for the humans to destroy (unless they use EMP weaponry)

The aliens are only called aliens because they don't come from Earth.  The aliens idea is overused, I know, but our aliens are different.  Think Tyranids from warhammer but more spider like.  Many appendages, like 4 legs and 4 arms.  Weapons are also attached to their bodies.  Their melee weapons '''are''' their bodies.  All of their weapons are going to be bio-based weaponry.  Examples include acid spit, spore guns, and larvae guns.

Each race will be able aquire weapons that work more effectively against each other race: Humans have the flamethrower for the aliens and the EMP for the 'bots.  Aliens have the larva gun for the humans and acid spit for the 'bots.  'Bots have a melee weapon that is good for both Humans and Aliens.

The naming conventions we have used are only temporary.  As we progress into our design phase, we will come up with new names for the aliens and the robots.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito.L5/Fate Of Terra Nova</title>
    <id>2181</id>
    <revision>
      <id>5293</id>
      <timestamp>2004-07-23T08:17:41Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview ==

; Info
:'''Status:''' Design/Development Phase
:'''Team Members:''' 4
:'''Release Date:''' Unknown
:'''Moddb Link:''' http://mods.moddb.com/499/?view=all

;Description

Conquest Europe is a total conversion for UT2003 and centers around teh conflicts of WWII.  What makes this mod different from other WWII mods for UT2003, is that CE is a superscience world where scientists were allowed to make all of their weird discoveries.  The world will see new weapons, not only man portable but machine portable too.  Tesla tanks, German rocket troops, and walking tanks.  The focus for this era is the tall 'Walkers'.  12 foot tall walking tanks that are used mostly for Infantry support.

;Features
* RPG based point system.
* Class play or not.  You decide.
* Tons of choices to make.
* Class based.
* RPG based.
* Several modes of gameplay available.

==Discussion ==

==News ==

====May 23 : No News :P ====
: Still no news.  Actually, I move this from my main page to this page so I could have comments on it and post news.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito.L5/Operation Homeworld</title>
    <id>2180</id>
    <revision>
      <id>5292</id>
      <timestamp>2004-07-23T08:14:57Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Overview ==

; Info
:'''Status:''' In Development
:'''Team Members:''' 3
:'''Release Date:''' Late 2004
:'''Moddb Link:''' http://mods.moddb.com/1217/?view=all

; Description

The year is 2010 and Earth is being invaded by non-bipedal aliens.  Humanity has perfected AI and has created a race of uber robots to help them defend against the alien menace.  Unfortunately, the AI becomes smarter and turns on their human creators.  Now there is a tri-species war to gain control of the planet.  Aliens want it to 'harvest' the human race.  The robots want it for complete dominion, all the see is destruction of everything living.  Humans want it... because it's their home and their will to survive is strongest of any living creature.

; Features
* All new weapons and player models.  No old models used.
* Modern weapons for humans such as FN p90 and FN pistols.
* Alien weapons are attached to their bodies and are all bio-weapons.
* Robots have very few weapons but are tough to kill.
* Possible classes for each race.
* Not enough people to carry the workload! er read below.

'''We &quot;really&quot; need help.  We need modellers especially.  We have a coder but could use more.  Read contact information above.'''

==Discussion ==

==News ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito/Evolution</title>
    <id>2094</id>
    <revision>
      <id>5101</id>
      <timestamp>2004-11-26T04:26:33Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">http://euro-gaming.net/moz/evolution.gif

nuff said.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito/Journal</title>
    <id>2096</id>
    <revision>
      <id>5105</id>
      <timestamp>2006-07-21T13:45:24Z</timestamp>
      <contributor>
        <ip>CPE00142a3858fa-CM014270108706.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is lacking? -2006

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5106</id>
      <timestamp>2005-06-20T03:47:15Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mosquito/Notebook</title>
    <id>2095</id>
    <revision>
      <id>5102</id>
      <timestamp>2006-07-21T13:44:46Z</timestamp>
      <contributor>
        <ip>CPE00142a3858fa-CM014270108706.cpe.net.cable.rogers.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==This page is a kind of graveyard of ideas, since I dont have the time or resources to making any of them work i just put them here to die. Feel free to take anything you want. '''-Mosquito'''==

===Captains!===

(Taken from an old discussion in one of foxpaws pages)

Mosquito: this is similar to one of my concepts, It nicknamed it &quot;Captains of Honour&quot; pretty much big ship combat (I mean juggernaughts and destroyer sizes) that are controlled similar to BF1942 but with z axis action, the idea was that there would be 1 flag ship, controlled by a Captain, and another player would control the bridge crew (assistance to the captain), then there would be smaller destroyers controlled by single players. The main flag ship would have a flight deck and any left over players would control the fighters, all ships are highly complex, with different systems and such that would need to be maintained by the captain or his crew, all ships are divided into 4 sections that have each there own health and systems assigned to them, the Commanders would have to not just kill the enemy ships, but keep there’s flying by rerouting power, assigning repair teams and prioritizing things, the ex: 

The shields are divided onto 4 sides, each with individual hit points that can be distributed across the board, the forward shields are almost down and the enemy flagship is charging dead head, the commanding staff reroute power from navigation to shields, then forward all available power to forward shields, another destroyer flanks the ship and takes out the port shield, if one shield fails, the whole grid shutdown, all shields need to be reset (takes about 20 seconds) so the enemy fleet bombards the ship with full fire power, the captain takes all power from shields to weapons and thrusters (since they're not going to last the 20 seconds or so for the shield to reset) the more power systems have, the more effective they are, so weapons with only 20% power will do 20% damage, navigation with only 30% will be only 30% effective range of target finding, repairing staff with 70% power can repair things at 70% of maximum rate, etc. The ship loses its front section completely and navigation and forward shield generator is gone, two systems no functional, usually the ship has 400% power to distribute to systems, but with 3/4 sections operative, they have only 300% to give around, and any % used in the lost systems are frozen until its repaired... which can't be done in the field, so boom, those % points in Nav and forward shields are dead, now the enemy flag ship sends fighters to strafe the flight deck, now the ship cannot launch fighters anymore, and once all the deployed fighters run out of ammo they can't re supply. One of the enemy destroyers get behind the ship and fires a torpedo into the number 2 engine, and causing an explosion and the whole rear of the ship goes to 30% health and is smoking badly, the Captian, with the last of the dying ship puts full power to number 1 engine and charges the enemy flagship... smashing into it and blowing away the shield, losing the center section and finally MASSIVE EXPLOSION, The ship is gone and the enemy flagship is dead in the water.

Those 2 players that died now must way until reinforcements before they can get there own destroyers, but once the flag ship is destroyed by an enemy, it doesn't respawn.

Thats just the idea, seems really confusing, I guess all systems would be controlled by window tabs, each system page shows where it is on the ship, its status, and would have a bar graph that you can drag right to increase power, which takes from your reserves, or drag left to decrease power, which goes to power reserves that you can give to different systems, critical systems have backups or more then one, so on shields tab, you have sub tabs that include forward, left, right, rear and backup shields, or weapons tab includes all the different weapons on the ship, so you would give power to the weapons tab, then give that power to the different weapons onboard.

If you have 2 people controlling, then one is the captain and the other is the commander, the captain can control the movement of the ship, all its systems and weapons, were the commander can only control systems, if the captain is an idiot, the team can call a vote to kick him off, then the commander takes his place, if the captain feels the commander is a idiot, he can just boot him and fiend for himself.

With the smaller destroyers, there is only a captain but the systems are less complex. This is just some ideas, sorry to hijack your page, if you want I'll move this to my page.

'''Mosquito:''' I was thinking, in light of UT2k4, having all the different functions of the ship as different seats in a vehicle, like in onslaught.

1 being the captain’s chair (telling everyone what to do)

2 being helm (steering)

3 being engineering (managing power to all the systems and dispatching repair teams)

4 being Tactical (weapon control)

5 being communications and navigation (communicating with other ships, and finding your way around space and such

6 being flight deck control (doing, flight deck stuff)

So on a full crew, the ship would have 6 people on duty, but the ship, very stressfully mind you, be controls by a single person. Captain would only be used if most of the other positions were filled, and the captain would be able to lead the fleet, instead of running around the bridge trying to keep the damn ship space worthy. 

Another idea is to have bot work with voice reg code, so the captain could go:

&quot;Helm, set heading to 2-7-5, 3/4 speed and increase Z 2-0-0 meters: Engage&quot;

And the bot would reply:

&quot;Setting heading to 2-7-5, increasing speed to 3/4 and increasing Z 2-0-0 meters

The Hud would display the order on screen, so the player could correct the order before saying &quot;Engage/Make it so/Mark&quot; which..errr, makes it happen (sorry, I'm a little low on sleep so my word finding abilities are... bad) So if you say&quot;

&quot;Full stops and bring up about&quot;

And the game reads it as

&quot;Full stern and bring me a boot&quot;

You can say &quot;correction&quot;

And restate the order.

Now wouldn't that be awesome.

Someone remind me to reformat this when I get up in the morning, its like it was written by a 4 year old with crayon.

----

Some Random game type idea I had for RO, someone might find it useful or something.

While sitting on the can I thought of this.

The Germans spawn at one end of the level which is a long twisting road going through any terrain (with choke points) and the Russians spawn randomly at one of the &quot;checkpoints&quot; and have 1 minute to set up an ambush with anti vehicle weapons, mines and of course, the mighty satchel charges. While they setup the Germans get into their vehicles which are:

2-4 Motorbikes with side pod thingy (technical speak lolz11)

1 The German officer car (containing the VIP)

1 Half track/truck (to carry any troops without a vehicle)

And possibly one tank support. (Depends on the map)

The VIP(s) would be an AI controlled bot which stays inside the car's backseat until its damaged immobilized or captured. (And will randomly swear and yell at the players because he’s an angry kraut)

The Russians job is to stop the escort and capture the officer. With the help of the satchel charges and mines they can create obstacles that the Germans much get around or remove. 

ex.

-Karma telephone poles that can be knocked over/pushed away with a half-track-tank

-Landmines which can be removed by troops-

-Karma ruins that can be knocked over (side of a house is a karma object that can be pushed over) -

-etc.-

Once the Russians time are up all the German vehicles start up and get moving. The Motorbikes job would be to scout out the road ahead, the half track would carry the support troops and the officer car would float somewhere in-between while the tank could brutally crush any and all resistance.

The Russians must get within x distance of the officer without any German players around him and he'll surrender and the Russians capture. Death of the officer means both teams lose. No/low reinforcements for anyone (depends on the map) so once the hold German team is dead the officer will come out and surrender on his own.

German players can use the standard bot commands to order the officer around

Follow

Hold

Freelance

the player must be standing near the officer.

The officer is armed with only a pistol (luger, mauser, etc) and wears an officer hat along with monocile and shiny boots. He will defend himself but not very a good shot.

They could be more officers as well (up to 3 can sit in the back of the car with multiple cars) and the Russians may only need to capture 2 of them, meaning if one is giving sass he's expendable (Germans would still lose if they killed an officer)

The Germans win by getting all or most (if there are multiple officers) to the other end of the level. Their could also be a time limit so the Germans wouldn't drive around at a turtle pace shooting every tree and inspecting every inch of road for mines.

==Just using this page to hammer out the details of my design doc for Thievery: Working title.==

Its a post modern concept of thieveryUT kind of gameplay.

please no discussion or editing of my page until I say I am done with it for the day.

Anything in italics are names for these concept actors/classes.

===Patroling===

Gameobjective actor (''Locationmaster'') that desiginates a location, area or object in the level in which when a bot is ordered to defend it will activate the asossiated AIscripted sequence to follow a set path of pathnodes, hold an area, activate something etc.

===Keypad doors===

A static mesh / mesh trigger (''Keypadtrigger'') (simplier for the mesh itself to be the actor instead of using a special trigger placed inside of a mesh/animation?) that calls events (for doors)

Lockatlvlzero=True/False

Lockatlvlone=True/False

Lockatlvltwo=True/False

Hackable=True/False

MinHacktime*=

Maxhacktime*=
* guards can open any locked door.

 * A random amount of time taken to hack the door to unlock it

===Elevator===

A special mover/vehicle/actor (''Elevatorcar'')that moves to special ''elevatorfloornodes'' and opens its doors controlled via GUI menu actived by pressing use on the button panel. With multiple Floors and if ''elevatorfloornode'' tag is called it will call the elevator to itself.

===Weapon Stances===

====Normal====

The weapon is holstered (pistol) or lowered (rifle)
* Guard can jump, climb, use objects, use their flashlight in this stance.

====Shoulder====

Clicking the secondary fire key brings up weapon to a shoulder firing position. Click again returns to normal.
* If Guard presses use, is in midair, is climbing a ladder, uses flashlight or stops moving for 5 seconds then stance is reset or Normal.

====Ironsight====

Holding down the secondary fire key brings the weapon's ironsight up and increases accuracy. Releasing resets to Shoulder oor doing anything that would reset to shoulder to normal reset to normal.

===Security levels===

There are 3 basic security levels.

====Zero: Nothing. All is clear.====

Guards cannot sound the alarm unless:
* Have seen the Thief at 70% or more visblity Within 512 unites of the thief
* Caught the thief in their flashlight for one second. Within 512 units of the thief
* major item stolen/missing/Destroyed (amount set by mapper)
* Found an unconicious guard or dead body

Once a guard has seen the theif a '''!''' appears over their head visble to all players aswell as the guard has a '''!''' on his hud indicating he can sound the alarm at many of the ''alarmpanelstrigger'' around the level. If any other guards come within 160 units of the guard with the '''!''', they also get a '''!''' and can also sound the alarm. Once the alarm is sounded the level goes to level ''one''. The '''!''' is so the thief can dispose of any guards that are able to sound the alarm if he is seen. If a guard is knocked unconicous and wakes up, he loses his '''!'''. 

(Maybe have a time limit of 30 seconds to the '''!''' so if the thief can confuse the guard long enough he is scott free)

====One: Security breach. All units to be on the lookout for anything.====

''SecurityWeaponlockers'' around the level are now usable to guards which upgrade with:
* Upper body armour
* Riot helmets
* Larger flood flashlights.
* Submachineguns or shotgun (set by mapper per locker)

Doors around the level lock and additional lights turn on.

Security terminals (not alarms) around the level can be hacked (time set by mapper) to lower the level and reset all the guards to default instantly.

====Two: Under Attack. Call in the big guns. (Also known as &quot;Thieves are fucked&quot;)====

To go to level 2 only afew things must apply.
* A set amount of guards are killed (set by mapper)
* A set amount of major items are Stolen/missing/destroyed (set by mapper)

When level two is called from a security room with the parmameters are met ''SecurityForcespawn'' actors around the level spawn additional ''Riotbots'' (amount set by mapper) in full black riot gear with gaskmasks and shoulder mounted flashlights swarm the level in hunt of the thieves. These super bots are always at full alert and can see the thieves at 30% visiblity or more and have incredible aim and move in groups of 3 (one AI to control each group?) They are resisted to gas, tranquilizers and melee. Aswell for outdoor areas an AI controlled ''Riotattackhelicopter'' will patrol with a machinegun shooting anything it catches in its sweeping spotlight following a set path via AIscript with the ''FlyingPathNodes''. Level two can only happen once and only lasts a set amount of time (by mapper). When the timer rounds out all ''Riotbots'' run to the nearest 'SecurityForcespawn'' actor and disappear or if they cannot reach one within 30 seconds they just disappear, when they are running away they do not engage thieves.

''Riotattackhelicopter'' will stay even after the timer has run out and can only be removed by destroying it. (the mapper has to set in the AI script of the helicopter to land on a helipad after partolling so it can be destroyed with explosives)

----

==Raptor Ball==

Very much like bombing run, there are 2 teams, one ball and 2 scoring volumes. Players are Raptors, modified to rise alittle better. The Raptor's weapon is a mechanical talon. Holding Primary Closes the talon.  When the talon is closed they player cannot pickup the ball. If the player closes their talon in proximity of another raptor they attach themselves, they can only be broken apart if they impact with something. When the player has the ball they press primary to launch it in whatever direction they are facing with some momentum transfer. if they reach max speed the ball then becomes a missile and when it impacts an enemy raptor it causes them to explode but still blocks the ball. 

The ball is not effected by gravity for 5 seconds untouched, after that, it falls to the ground and has to be snatched up. If the ball is untouched for 30 seconds it resets.

----

'''Sweavo:''' hello.  I was thunking about a big-ship game myself the other day.  I was thinking that the players could run around the ships in normal UT2004 style - imagine running thru deck17 then hopping in an elevator to the bridge...  The ships' controls and weapon systems are turrets like in UT.  Not sure how the outside works though.  I was thinking fighters would be vehicles.  It'd be great to be able to knock out the shields to the opposing ship's docking bay, land your craft there, and Deathmatch your way to their bridge.  Hmmm... maybe this is just a really bizarre ONS map idea...

'''Mosquito:''' Unfortunely the ship itself wouldn't be able to move around and would be static, it would make a neat AS-Mothership kind of assault level. 

This page is a kind of graveyard of ideas, since I dont have the time or resources to making any of them work i just put them here to die. Feel free to take anything you want.

'''Foxpaw:''' Actually, there is a way you can achieve what was just suggested. I don't remember who it was, but a long while ago there was a couple of other people visiting the wiki working on space combat mods. The ability to meander around on a moving ship in my mod was implemented with the use of custom physics and such, (this has since been removed as it was using far too many resources for something that's just a gimmick, really) but someone else had implemented it using regular UT2003/UT2004 levels.

Basically, each ship had a BSP &quot;inside&quot; which was in the world somewhere, and every ship was isolated from the other ships. Then, there was a big &quot;space&quot; area which was isolated from all of the ship interior BSP. So each ship really existed in two places - one was a Karma vehicle flying around and doing stuff, and another was a regular BSP area that people could walk around in. This is alot like the turret controls on AS-Mothership - you are controlling a &quot;vehicle&quot; that is elsewhere, without actually being inside that vehicle. When you &quot;leave&quot; the vehicle, you are at the controls inside the mothership. If you wanted to make it really fancy, you could probrably use ScriptedTextures to draw on the &quot;windows&quot; of the interior of the ship, and maybe have damage to parts of the (external) ship be reflected in the &quot;interior&quot; area of the level. (the part that represents the interior of the ship)

This fellows implementation was very similar, the only real difference being that if you died while piloting a spaceship, your pawn was killed too.

This only works if you have a finite number of ships, and the interior layout of the ships is predetermined, neither of which could have been assumed in my case - but it worked in his case and it might work in yours.

Anyways, I hope that wasn't confusing. Let me know if you need clarification on how it was implemented.

'''Sweavo:''' Sounds cool.  Similarly, I don't have teh skillz or teh time to do this.  I'm making reasonable progress on fixing up turrets for ONS though... see [[Legacy:Sweavo|Sweavo]] if that floats your boat.  I was also thinking that abusing zoneportals might be a way to get the illusion of the inside being attached to the outside.

'''Graphik:''' I should think that a camera actor that projected it's output onto a surface like a Skybox would do the trick. I think it was [[Legacy:Zxanphorian|Zxanphorian]] that got this working in UT200X.

'''Mosquito:''' man, this place is as old as time itself

''2006 update''

'''Mosquito:''' Man my spell and grammar is horrible.</text>
    </revision>
    <revision>
      <id>5103</id>
      <timestamp>2005-06-23T17:28:20Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==This page is a kind of graveyard of ideas, since I dont have the time or resources to making any of them work i just put them here to die. Feel free to take anything you want. '''-Mosquito'''==

===Captains!===

(taken from an old discussion in one of foxpaws pages)

Mosquito: this is simular to one of my concepts, It nicknamed it &quot;Captians of Honour&quot; pretty much big ship combat (I mean juggernaughts and destroyer sizes) that are controlled simular to BF1942 but with z axis action, the idea was that there would be 1 flag ship, controlled by a Captian, and another player would control the bridge crew (assitance to the captian), then there would be smaller destroyers controlled by single players. The main flag ship would have a flight deck and any left over players would control the fighters, all ships are highly complex, with different systems and such that would need to be maintained by the captian or his crew, all ships are divided into 4 sections that have each there own health and systems assigned to them, the Commanders would have to not just kill the enemy ships, but keep theres flying by rerouting power, assigning repair teams and prioritizing things, the ex: 

The shields are divided onto 4 sides, each with individual hitpoints that can be distibuted across the board, the forward shields are almost down and the enemy flagship is charging dead head, the commanding staff reroute power from navagation to shields, then forward all availible power to forward shields, another destroyer flanks the ship and takes out the port shield, if one shield fails, the whole grid shutdown, all shields need to be reset (takes about 20 seconds) so the enemy fleet bombards the ship with full fire power, the captian takes all power from shields to weapons and thrusters (since they're not gonna last the 20 seconds or so for the shield to reset) the more power systems have, the more effective they are, so weapons with only 20% power will do 20% damage, navagation with only 30% will be only 30% effective range of target finding, repairing staff with 70% power can repair things at 70% of maxium rate, etc. The ship loses its front section completely and navagation and forward shield generator is gone, two systems unoperatible, usually the ship has 400% power to distribute to systems, but with 3/4 sections operative, they have only 300% to give around, and any % used in the lost systems are frozen until its repaired... which can't be done in the field, so boom, those % points in Nav and forward shields are dead, now the enemy flag ship sends fighters to strafe the flight deck, now the ship cannot launch fighters anymore, and once all the deloyed fighters run out of ammo they can't resupply. One of the enemy destroyers get behind the ship and fires a tompedo into the number 2 engine, and causing an explosion and the whole rear of the ship goes to 30% health and is smoking badly, the Captian, with the last of the dying ship puts full power to number 1 engine and charges the enemy flagship... smashing into it and blowing away the shield, losting the center section and finally MASSIVE EXPLOSION, The ship is gone and the enemy flagship is dead in the water.

Those 2 players players that died now must way until renforcments before they can get there own destroyers, but once the flag ship is destroyed by an enemy, it doesn't respawn.

Thats just the idea, seems really confusing, I guess all systems would be controlled by window tabs, each system page shows where it is on the ship, its status, and would have a bar graph that you can drag right to increase power, which takes from your reserves, or drag left to decrease power, which goes to power reserves that you can give to different systems, critial systems have backups or more then one, so on shields tab, you have subtabs that include forward, left, right, rear and backup shields, or weapons tab includes all the different weapons on the ship, so you would give power to the weapons tab, then give that power to the different weapons onboard.

If you have 2 people controlling, then one is the captian and the other is the commander, the captian can control the movement of the ship, all its systems and weapons, were the commander can only control systems, if the captian is an idiot, the team can call a vote to kick him off, then the commander takes his place, if the captian feels the commander is a idiot, he can just boot him and fiend for himself.

With the smaller destroyers, there is only a captian but the systems are less complex. This is just some ideas, sorry to hijack your page, if you want I'll move this to my page.

'''Mosquito:''' I was thinking, in light of UT2k4, having all the different functions of the ship as different seats in a vehicle, like in onslaught.

1 being the captian's chair (telling everyone what to do)

2 being helm (steering)

3 being engineering (managing power to all the systems and dispatching repair teams)

4 being Tactical (weapon control)

5 being communications and navigation (communicating with other ships, and finding your way around space and such

6 being flight deck control (doing, flight deck stuff)

So on a full crew, the ship would have 6 people on duty, but the ship, very stressfully mind you, be controls by a single person. Captian would only be used if most of the other positions were filled, and the captian would be able to lead the fleet, instead of running around the bridge trying to keep the damn ship space worthy. 

Another idea is to have bot work with voice reg code, so the captian could go:

&quot;helm, set heading to 2-7-5, 3/4 speed and increase Z 2-0-0 meters: Engage&quot;

And the bot would reply:

&quot;Setting heading to 2-7-5, increasing speed to 3/4 and increasing Z 2-0-0 meters

The Hud would display the order on screen, so the player could correct the order before saying &quot;Engage/Make it so/Mark&quot; which ..errr, makes it happen (sorry, I'm alittle low on sleep so my word finding ablities are... bad) So if you say&quot;

&quot;full stop and bring up about&quot;

And the game reads it as

&quot;full stern and bring me a boot&quot;

You can say &quot;correction&quot;

And restate the order.

Now wouldn't that be awsome.

Someone remind me to reformat this when I get up in the morning, its like it was written by a 4 year old with crayon.

----

Some Random gametype idea I had for RO, someone might find it useful or something.

While sitting on the can I thought of this.

The germans spawn at one end of the level which is a long twisting road going through any terrain (with choke points) and the russians spawn randomly at one of the &quot;checkpoints&quot; and have 1 minute to set up an ambush with anti vehicle weapons, mines and ofcourse, the mighty satchel charges. While they setup the germans get into their vehicles which are:

2-4 Motorbikes with side pod thingy (techrical speek lolz11)

1 The German officer car (containing the VIP)

1 Half track/truck (to carry any troops without a vehicle)

and possibly one tank support. (depends on the map)

The VIP(s) would be an AI controlled bot which stays inside the car's backseat until its damaged immobilized or captured. (and will randomly swear and yell at the players because hes an angry kraut)

The Russians job is to stop the escort and capture the officer. WIth the help of the satchnel charges and mines they can create obsticles that the germans much get around or remove. 

ex.

-Karma telephone poles that can be knocked over/pushed away with a half-track-tank

-Landmines which can be removed by troops-

-Karma ruins that can be knocked over (side of a house is a karma object that can be pushed over) -

-etc.-

Once the russians time are up all the german vehicles start up and get moving. The Motorbikes job would be to scout out the road ahead, the half track would carry the support troops and the officer car would float somewhere inbetween. While the tank could brutally crush any and all resistance.

The russians must get within x distance of the officer without any german players around him and he'll surrender and the russians capture. Death of the officer means both teams lose. No/low reinforcements for anyone (depends on the map) so once the hold german team is dead the officer will come out and surrender on his own.

German players can use the standard bot commands to order the officer around

Follow

Hold

Freelance

but the player must be standing near the officer.

The officer is armed with only a pistol (luger, mauser, etc) and wears an officer hat along with monocile and shiny boots. He will defend himselve but not very a good shot.

They could be more officers aswell (up to 3 can sit in the back of the car with multiple cars) and the russians may only need to capture 2 of them, meaning if one is giving sass he's expendable (germans would still lose if they killed an officer)

The Germans win by getting all or most (if there's multiple officers) to the other end of the level. Their could also be a time limit so the germans wouldn't drive around at a turtle pace shooting every tree and inspecting every inch of road for mines.

==Just using this page to hammer out the details of my design doc for Thievery: Working title.==

Its a post modern concept of thieveryUT kind of gameplay.

please no discussion or editing of my page until I say I am done with it for the day.

Anything in italics are names for these concept actors/classes.

===Patroling===

Gameobjective actor (''Locationmaster'') that desiginates a location, area or object in the level in which when a bot is ordered to defend it will activate the asossiated AIscripted sequence to follow a set path of pathnodes, hold an area, activate something etc.

===Keypad doors===

A static mesh / mesh trigger (''Keypadtrigger'') (simplier for the mesh itself to be the actor instead of using a special trigger placed inside of a mesh/animation?) that calls events (for doors)

Lockatlvlzero=True/False

Lockatlvlone=True/False

Lockatlvltwo=True/False

Hackable=True/False

MinHacktime*=

Maxhacktime*=
* guards can open any locked door.

 * A random amount of time taken to hack the door to unlock it

===Elevator===

A special mover/vehicle/actor (''Elevatorcar'')that moves to special ''elevatorfloornodes'' and opens its doors controlled via GUI menu actived by pressing use on the button panel. With multiple Floors and if ''elevatorfloornode'' tag is called it will call the elevator to itself.

===Weapon Stances===

====Normal====

The weapon is holstered (pistol) or lowered (rifle)
* Guard can jump, climb, use objects, use their flashlight in this stance.

====Shoulder====

Clicking the secondary fire key brings up weapon to a shoulder firing position. Click again returns to normal.
* If Guard presses use, is in midair, is climbing a ladder, uses flashlight or stops moving for 5 seconds then stance is reset or Normal.

====Ironsight====

Holding down the secondary fire key brings the weapon's ironsight up and increases accuracy. Releasing resets to Shoulder oor doing anything that would reset to shoulder to normal reset to normal.

===Security levels===

There are 3 basic security levels.

====Zero: Nothing. All is clear.====

Guards cannot sound the alarm unless:
* Have seen the Thief at 70% or more visblity Within 512 unites of the thief
* Caught the thief in their flashlight for one second. Within 512 units of the thief
* major item stolen/missing/Destroyed (amount set by mapper)
* Found an unconicious guard or dead body

Once a guard has seen the theif a '''!''' appears over their head visble to all players aswell as the guard has a '''!''' on his hud indicating he can sound the alarm at many of the ''alarmpanelstrigger'' around the level. If any other guards come within 160 units of the guard with the '''!''', they also get a '''!''' and can also sound the alarm. Once the alarm is sounded the level goes to level ''one''. The '''!''' is so the thief can dispose of any guards that are able to sound the alarm if he is seen. If a guard is knocked unconicous and wakes up, he loses his '''!'''. 

(Maybe have a time limit of 30 seconds to the '''!''' so if the thief can confuse the guard long enough he is scott free)

====One: Security breach. All units to be on the lookout for anything.====

''SecurityWeaponlockers'' around the level are now usable to guards which upgrade with:
* Upper body armour
* Riot helmets
* Larger flood flashlights.
* Submachineguns or shotgun (set by mapper per locker)

Doors around the level lock and additional lights turn on.

Security terminals (not alarms) around the level can be hacked (time set by mapper) to lower the level and reset all the guards to default instantly.

====Two: Under Attack. Call in the big guns. (Also known as &quot;Thieves are fucked&quot;)====

To go to level 2 only afew things must apply.
* A set amount of guards are killed (set by mapper)
* A set amount of major items are Stolen/missing/destroyed (set by mapper)

When level two is called from a security room with the parmameters are met ''SecurityForcespawn'' actors around the level spawn additional ''Riotbots'' (amount set by mapper) in full black riot gear with gaskmasks and shoulder mounted flashlights swarm the level in hunt of the thieves. These super bots are always at full alert and can see the thieves at 30% visiblity or more and have incredible aim and move in groups of 3 (one AI to control each group?) They are resisted to gas, tranquilizers and melee. Aswell for outdoor areas an AI controlled ''Riotattackhelicopter'' will patrol with a machinegun shooting anything it catches in its sweeping spotlight following a set path via AIscript with the ''FlyingPathNodes''. Level two can only happen once and only lasts a set amount of time (by mapper). When the timer rounds out all ''Riotbots'' run to the nearest 'SecurityForcespawn'' actor and disappear or if they cannot reach one within 30 seconds they just disappear, when they are running away they do not engage thieves.

''Riotattackhelicopter'' will stay even after the timer has run out and can only be removed by destroying it. (the mapper has to set in the AI script of the helicopter to land on a helipad after partolling so it can be destroyed with explosives)

----

==Raptor Ball==

Very much like bombing run, there are 2 teams, one ball and 2 scoring volumes. Players are Raptors, modified to rise alittle better. The Raptor's weapon is a mechanical talon. Holding Primary Closes the talon.  When the talon is closed they player cannot pickup the ball. If the player closes their talon in proximity of another raptor they attach themselves, they can only be broken apart if they impact with something. When the player has the ball they press primary to launch it in whatever direction they are facing with some momentum transfer. if they reach max speed the ball then becomes a missile and when it impacts an enemy raptor it causes them to explode but still blocks the ball. 

The ball is not effected by gravity for 5 seconds untouched, after that, it falls to the ground and has to be snatched up. If the ball is untouched for 30 seconds it resets.

----

'''Sweavo:''' hello.  I was thunking about a big-ship game myself the other day.  I was thinking that the players could run around the ships in normal UT2004 style - imagine running thru deck17 then hopping in an elevator to the bridge...  The ships' controls and weapon systems are turrets like in UT.  Not sure how the outside works though.  I was thinking fighters would be vehicles.  It'd be great to be able to knock out the shields to the opposing ship's docking bay, land your craft there, and Deathmatch your way to their bridge.  Hmmm... maybe this is just a really bizarre ONS map idea...

'''Mosquito:''' Unfortunely the ship itself wouldn't be able to move around and would be static, it would make a neat AS-Mothership kind of assault level. 

This page is a kind of graveyard of ideas, since I dont have the time or resources to making any of them work i just put them here to die. Feel free to take anything you want.

'''Foxpaw:''' Actually, there is a way you can achieve what was just suggested. I don't remember who it was, but a long while ago there was a couple of other people visiting the wiki working on space combat mods. The ability to meander around on a moving ship in my mod was implemented with the use of custom physics and such, (this has since been removed as it was using far too many resources for something that's just a gimmick, really) but someone else had implemented it using regular UT2003/UT2004 levels.

Basically, each ship had a BSP &quot;inside&quot; which was in the world somewhere, and every ship was isolated from the other ships. Then, there was a big &quot;space&quot; area which was isolated from all of the ship interior BSP. So each ship really existed in two places - one was a Karma vehicle flying around and doing stuff, and another was a regular BSP area that people could walk around in. This is alot like the turret controls on AS-Mothership - you are controlling a &quot;vehicle&quot; that is elsewhere, without actually being inside that vehicle. When you &quot;leave&quot; the vehicle, you are at the controls inside the mothership. If you wanted to make it really fancy, you could probrably use ScriptedTextures to draw on the &quot;windows&quot; of the interior of the ship, and maybe have damage to parts of the (external) ship be reflected in the &quot;interior&quot; area of the level. (the part that represents the interior of the ship)

This fellows implementation was very similar, the only real difference being that if you died while piloting a spaceship, your pawn was killed too.

This only works if you have a finite number of ships, and the interior layout of the ships is predetermined, neither of which could have been assumed in my case - but it worked in his case and it might work in yours.

Anyways, I hope that wasn't confusing. Let me know if you need clarification on how it was implemented.

'''Sweavo:''' Sounds cool.  Similarly, I don't have teh skillz or teh time to do this.  I'm making reasonable progress on fixing up turrets for ONS though... see [[Legacy:Sweavo|Sweavo]] if that floats your boat.  I was also thinking that abusing zoneportals might be a way to get the illusion of the inside being attached to the outside.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5104</id>
      <timestamp>2005-06-23T19:01:58Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==This page is a kind of graveyard of ideas, since I dont have the time or resources to making any of them work i just put them here to die. Feel free to take anything you want. '''-Mosquito'''==

===Captains!===

(taken from an old discussion in one of foxpaws pages)

Mosquito: this is simular to one of my concepts, It nicknamed it &quot;Captians of Honour&quot; pretty much big ship combat (I mean juggernaughts and destroyer sizes) that are controlled simular to BF1942 but with z axis action, the idea was that there would be 1 flag ship, controlled by a Captian, and another player would control the bridge crew (assitance to the captian), then there would be smaller destroyers controlled by single players. The main flag ship would have a flight deck and any left over players would control the fighters, all ships are highly complex, with different systems and such that would need to be maintained by the captian or his crew, all ships are divided into 4 sections that have each there own health and systems assigned to them, the Commanders would have to not just kill the enemy ships, but keep theres flying by rerouting power, assigning repair teams and prioritizing things, the ex: 

The shields are divided onto 4 sides, each with individual hitpoints that can be distibuted across the board, the forward shields are almost down and the enemy flagship is charging dead head, the commanding staff reroute power from navagation to shields, then forward all availible power to forward shields, another destroyer flanks the ship and takes out the port shield, if one shield fails, the whole grid shutdown, all shields need to be reset (takes about 20 seconds) so the enemy fleet bombards the ship with full fire power, the captian takes all power from shields to weapons and thrusters (since they're not gonna last the 20 seconds or so for the shield to reset) the more power systems have, the more effective they are, so weapons with only 20% power will do 20% damage, navagation with only 30% will be only 30% effective range of target finding, repairing staff with 70% power can repair things at 70% of maxium rate, etc. The ship loses its front section completely and navagation and forward shield generator is gone, two systems unoperatible, usually the ship has 400% power to distribute to systems, but with 3/4 sections operative, they have only 300% to give around, and any % used in the lost systems are frozen until its repaired... which can't be done in the field, so boom, those % points in Nav and forward shields are dead, now the enemy flag ship sends fighters to strafe the flight deck, now the ship cannot launch fighters anymore, and once all the deloyed fighters run out of ammo they can't resupply. One of the enemy destroyers get behind the ship and fires a tompedo into the number 2 engine, and causing an explosion and the whole rear of the ship goes to 30% health and is smoking badly, the Captian, with the last of the dying ship puts full power to number 1 engine and charges the enemy flagship... smashing into it and blowing away the shield, losting the center section and finally MASSIVE EXPLOSION, The ship is gone and the enemy flagship is dead in the water.

Those 2 players players that died now must way until renforcments before they can get there own destroyers, but once the flag ship is destroyed by an enemy, it doesn't respawn.

Thats just the idea, seems really confusing, I guess all systems would be controlled by window tabs, each system page shows where it is on the ship, its status, and would have a bar graph that you can drag right to increase power, which takes from your reserves, or drag left to decrease power, which goes to power reserves that you can give to different systems, critial systems have backups or more then one, so on shields tab, you have subtabs that include forward, left, right, rear and backup shields, or weapons tab includes all the different weapons on the ship, so you would give power to the weapons tab, then give that power to the different weapons onboard.

If you have 2 people controlling, then one is the captian and the other is the commander, the captian can control the movement of the ship, all its systems and weapons, were the commander can only control systems, if the captian is an idiot, the team can call a vote to kick him off, then the commander takes his place, if the captian feels the commander is a idiot, he can just boot him and fiend for himself.

With the smaller destroyers, there is only a captian but the systems are less complex. This is just some ideas, sorry to hijack your page, if you want I'll move this to my page.

'''Mosquito:''' I was thinking, in light of UT2k4, having all the different functions of the ship as different seats in a vehicle, like in onslaught.

1 being the captian's chair (telling everyone what to do)

2 being helm (steering)

3 being engineering (managing power to all the systems and dispatching repair teams)

4 being Tactical (weapon control)

5 being communications and navigation (communicating with other ships, and finding your way around space and such

6 being flight deck control (doing, flight deck stuff)

So on a full crew, the ship would have 6 people on duty, but the ship, very stressfully mind you, be controls by a single person. Captian would only be used if most of the other positions were filled, and the captian would be able to lead the fleet, instead of running around the bridge trying to keep the damn ship space worthy. 

Another idea is to have bot work with voice reg code, so the captian could go:

&quot;helm, set heading to 2-7-5, 3/4 speed and increase Z 2-0-0 meters: Engage&quot;

And the bot would reply:

&quot;Setting heading to 2-7-5, increasing speed to 3/4 and increasing Z 2-0-0 meters

The Hud would display the order on screen, so the player could correct the order before saying &quot;Engage/Make it so/Mark&quot; which ..errr, makes it happen (sorry, I'm alittle low on sleep so my word finding ablities are... bad) So if you say&quot;

&quot;full stop and bring up about&quot;

And the game reads it as

&quot;full stern and bring me a boot&quot;

You can say &quot;correction&quot;

And restate the order.

Now wouldn't that be awsome.

Someone remind me to reformat this when I get up in the morning, its like it was written by a 4 year old with crayon.

----

Some Random gametype idea I had for RO, someone might find it useful or something.

While sitting on the can I thought of this.

The germans spawn at one end of the level which is a long twisting road going through any terrain (with choke points) and the russians spawn randomly at one of the &quot;checkpoints&quot; and have 1 minute to set up an ambush with anti vehicle weapons, mines and ofcourse, the mighty satchel charges. While they setup the germans get into their vehicles which are:

2-4 Motorbikes with side pod thingy (techrical speek lolz11)

1 The German officer car (containing the VIP)

1 Half track/truck (to carry any troops without a vehicle)

and possibly one tank support. (depends on the map)

The VIP(s) would be an AI controlled bot which stays inside the car's backseat until its damaged immobilized or captured. (and will randomly swear and yell at the players because hes an angry kraut)

The Russians job is to stop the escort and capture the officer. WIth the help of the satchnel charges and mines they can create obsticles that the germans much get around or remove. 

ex.

-Karma telephone poles that can be knocked over/pushed away with a half-track-tank

-Landmines which can be removed by troops-

-Karma ruins that can be knocked over (side of a house is a karma object that can be pushed over) -

-etc.-

Once the russians time are up all the german vehicles start up and get moving. The Motorbikes job would be to scout out the road ahead, the half track would carry the support troops and the officer car would float somewhere inbetween. While the tank could brutally crush any and all resistance.

The russians must get within x distance of the officer without any german players around him and he'll surrender and the russians capture. Death of the officer means both teams lose. No/low reinforcements for anyone (depends on the map) so once the hold german team is dead the officer will come out and surrender on his own.

German players can use the standard bot commands to order the officer around

Follow

Hold

Freelance

but the player must be standing near the officer.

The officer is armed with only a pistol (luger, mauser, etc) and wears an officer hat along with monocile and shiny boots. He will defend himselve but not very a good shot.

They could be more officers aswell (up to 3 can sit in the back of the car with multiple cars) and the russians may only need to capture 2 of them, meaning if one is giving sass he's expendable (germans would still lose if they killed an officer)

The Germans win by getting all or most (if there's multiple officers) to the other end of the level. Their could also be a time limit so the germans wouldn't drive around at a turtle pace shooting every tree and inspecting every inch of road for mines.

==Just using this page to hammer out the details of my design doc for Thievery: Working title.==

Its a post modern concept of thieveryUT kind of gameplay.

please no discussion or editing of my page until I say I am done with it for the day.

Anything in italics are names for these concept actors/classes.

===Patroling===

Gameobjective actor (''Locationmaster'') that desiginates a location, area or object in the level in which when a bot is ordered to defend it will activate the asossiated AIscripted sequence to follow a set path of pathnodes, hold an area, activate something etc.

===Keypad doors===

A static mesh / mesh trigger (''Keypadtrigger'') (simplier for the mesh itself to be the actor instead of using a special trigger placed inside of a mesh/animation?) that calls events (for doors)

Lockatlvlzero=True/False

Lockatlvlone=True/False

Lockatlvltwo=True/False

Hackable=True/False

MinHacktime*=

Maxhacktime*=
* guards can open any locked door.

 * A random amount of time taken to hack the door to unlock it

===Elevator===

A special mover/vehicle/actor (''Elevatorcar'')that moves to special ''elevatorfloornodes'' and opens its doors controlled via GUI menu actived by pressing use on the button panel. With multiple Floors and if ''elevatorfloornode'' tag is called it will call the elevator to itself.

===Weapon Stances===

====Normal====

The weapon is holstered (pistol) or lowered (rifle)
* Guard can jump, climb, use objects, use their flashlight in this stance.

====Shoulder====

Clicking the secondary fire key brings up weapon to a shoulder firing position. Click again returns to normal.
* If Guard presses use, is in midair, is climbing a ladder, uses flashlight or stops moving for 5 seconds then stance is reset or Normal.

====Ironsight====

Holding down the secondary fire key brings the weapon's ironsight up and increases accuracy. Releasing resets to Shoulder oor doing anything that would reset to shoulder to normal reset to normal.

===Security levels===

There are 3 basic security levels.

====Zero: Nothing. All is clear.====

Guards cannot sound the alarm unless:
* Have seen the Thief at 70% or more visblity Within 512 unites of the thief
* Caught the thief in their flashlight for one second. Within 512 units of the thief
* major item stolen/missing/Destroyed (amount set by mapper)
* Found an unconicious guard or dead body

Once a guard has seen the theif a '''!''' appears over their head visble to all players aswell as the guard has a '''!''' on his hud indicating he can sound the alarm at many of the ''alarmpanelstrigger'' around the level. If any other guards come within 160 units of the guard with the '''!''', they also get a '''!''' and can also sound the alarm. Once the alarm is sounded the level goes to level ''one''. The '''!''' is so the thief can dispose of any guards that are able to sound the alarm if he is seen. If a guard is knocked unconicous and wakes up, he loses his '''!'''. 

(Maybe have a time limit of 30 seconds to the '''!''' so if the thief can confuse the guard long enough he is scott free)

====One: Security breach. All units to be on the lookout for anything.====

''SecurityWeaponlockers'' around the level are now usable to guards which upgrade with:
* Upper body armour
* Riot helmets
* Larger flood flashlights.
* Submachineguns or shotgun (set by mapper per locker)

Doors around the level lock and additional lights turn on.

Security terminals (not alarms) around the level can be hacked (time set by mapper) to lower the level and reset all the guards to default instantly.

====Two: Under Attack. Call in the big guns. (Also known as &quot;Thieves are fucked&quot;)====

To go to level 2 only afew things must apply.
* A set amount of guards are killed (set by mapper)
* A set amount of major items are Stolen/missing/destroyed (set by mapper)

When level two is called from a security room with the parmameters are met ''SecurityForcespawn'' actors around the level spawn additional ''Riotbots'' (amount set by mapper) in full black riot gear with gaskmasks and shoulder mounted flashlights swarm the level in hunt of the thieves. These super bots are always at full alert and can see the thieves at 30% visiblity or more and have incredible aim and move in groups of 3 (one AI to control each group?) They are resisted to gas, tranquilizers and melee. Aswell for outdoor areas an AI controlled ''Riotattackhelicopter'' will patrol with a machinegun shooting anything it catches in its sweeping spotlight following a set path via AIscript with the ''FlyingPathNodes''. Level two can only happen once and only lasts a set amount of time (by mapper). When the timer rounds out all ''Riotbots'' run to the nearest 'SecurityForcespawn'' actor and disappear or if they cannot reach one within 30 seconds they just disappear, when they are running away they do not engage thieves.

''Riotattackhelicopter'' will stay even after the timer has run out and can only be removed by destroying it. (the mapper has to set in the AI script of the helicopter to land on a helipad after partolling so it can be destroyed with explosives)

----

==Raptor Ball==

Very much like bombing run, there are 2 teams, one ball and 2 scoring volumes. Players are Raptors, modified to rise alittle better. The Raptor's weapon is a mechanical talon. Holding Primary Closes the talon.  When the talon is closed they player cannot pickup the ball. If the player closes their talon in proximity of another raptor they attach themselves, they can only be broken apart if they impact with something. When the player has the ball they press primary to launch it in whatever direction they are facing with some momentum transfer. if they reach max speed the ball then becomes a missile and when it impacts an enemy raptor it causes them to explode but still blocks the ball. 

The ball is not effected by gravity for 5 seconds untouched, after that, it falls to the ground and has to be snatched up. If the ball is untouched for 30 seconds it resets.

----

'''Sweavo:''' hello.  I was thunking about a big-ship game myself the other day.  I was thinking that the players could run around the ships in normal UT2004 style - imagine running thru deck17 then hopping in an elevator to the bridge...  The ships' controls and weapon systems are turrets like in UT.  Not sure how the outside works though.  I was thinking fighters would be vehicles.  It'd be great to be able to knock out the shields to the opposing ship's docking bay, land your craft there, and Deathmatch your way to their bridge.  Hmmm... maybe this is just a really bizarre ONS map idea...

'''Mosquito:''' Unfortunely the ship itself wouldn't be able to move around and would be static, it would make a neat AS-Mothership kind of assault level. 

This page is a kind of graveyard of ideas, since I dont have the time or resources to making any of them work i just put them here to die. Feel free to take anything you want.

'''Foxpaw:''' Actually, there is a way you can achieve what was just suggested. I don't remember who it was, but a long while ago there was a couple of other people visiting the wiki working on space combat mods. The ability to meander around on a moving ship in my mod was implemented with the use of custom physics and such, (this has since been removed as it was using far too many resources for something that's just a gimmick, really) but someone else had implemented it using regular UT2003/UT2004 levels.

Basically, each ship had a BSP &quot;inside&quot; which was in the world somewhere, and every ship was isolated from the other ships. Then, there was a big &quot;space&quot; area which was isolated from all of the ship interior BSP. So each ship really existed in two places - one was a Karma vehicle flying around and doing stuff, and another was a regular BSP area that people could walk around in. This is alot like the turret controls on AS-Mothership - you are controlling a &quot;vehicle&quot; that is elsewhere, without actually being inside that vehicle. When you &quot;leave&quot; the vehicle, you are at the controls inside the mothership. If you wanted to make it really fancy, you could probrably use ScriptedTextures to draw on the &quot;windows&quot; of the interior of the ship, and maybe have damage to parts of the (external) ship be reflected in the &quot;interior&quot; area of the level. (the part that represents the interior of the ship)

This fellows implementation was very similar, the only real difference being that if you died while piloting a spaceship, your pawn was killed too.

This only works if you have a finite number of ships, and the interior layout of the ships is predetermined, neither of which could have been assumed in my case - but it worked in his case and it might work in yours.

Anyways, I hope that wasn't confusing. Let me know if you need clarification on how it was implemented.

'''Sweavo:''' Sounds cool.  Similarly, I don't have teh skillz or teh time to do this.  I'm making reasonable progress on fixing up turrets for ONS though... see [[Legacy:Sweavo|Sweavo]] if that floats your boat.  I was also thinking that abusing zoneportals might be a way to get the illusion of the inside being attached to the outside.

'''Graphik:''' I should think that a camera actor that projected it's output onto a surface like a Skybox would do the trick. I think it was [[Legacy:Zxanphorian|Zxanphorian]] that got this working in UT200X.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MotionBlur</title>
    <id>2235</id>
    <revision>
      <id>5403</id>
      <timestamp>2006-10-19T21:57:30Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:CameraEffect|CameraEffect]] &gt;&gt; MotionBlur}}

Applies a [[Wikipedia:motion blur]] effect to the screen.

Note that motion blur will chew up a good portion of the framerate. See [[Legacy:CameraEffect|CameraEffect]] for instructions on how to use motion blur correctly.

==Properties==
; byte BlurAlpha : Strength of the effect.

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mouse Control</title>
    <id>1802</id>
    <revision>
      <id>4422</id>
      <timestamp>2007-01-29T06:53:35Z</timestamp>
      <contributor>
        <ip>C-68-40-112-109.hsd1.mi.comcast.net</ip>
      </contributor>
      <comment>no actor dragselect in side/front view</comment>
      <text xml:space="preserve">Complete reference for using the mouse in UnrealEd 2.0 [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s. See also [[Legacy:UnrealEd Interface|UnrealEd interface]]. These should all work the same in UnrealEd 3.0.

==Camera movement==

===2D Viewport===

{|

|-
|'''mouse button
|'''up/down
|'''left/right
|-
|left
|slow pan
|slow pan
|-
|right
|fast pan
|fast pan
|-
|both
|zoom
|none
|}

===3D viewport===

{|

|-
|'''mouse button
|'''up/down
|'''left/right
|Note
|-
|left
|move forwards/backwards
|pan
|keeps the camera at a constant height
|-
|right
|pan
|pan
|
|-
|both
|elevator move up/down
|strafe/dolly
|viewing angle does not affect elevator mode
|}

===Troubleshooting the 3D camera===

If you ever find the 3D camera has been rotated too much and the view is confusing, do this to reset it:
# Find the Camera actor. It shows in 2D views as an eye. The quick way to locate it is this: 
## Open [[Legacy:Actor Search|Actor Search]]
## double-clicking any object name
## all viewpoint focus on that object. &lt;br /&gt;(The actual name depends on how your viewports are configured. By default it's (usually?) '''Camera2'''. Fascinating factoid: the Texture Browser has a Camera object. There's also a mysterious Camera4...
# Select the Camera actor
# Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Reset -&gt; Reset Rotation
# Move the Camera actor a little bit in a 2D viewport (otherwise, next time you work in the 3D view it will keep the orientation you're trying to get rid of)
# Click in the 3D viewport. Everything is happy :D

==Object Selection ==

===Actors ===

====Select ====

Left-click a single brush or actor icon to select it in any viewport. Note that other viewports don't update to reflect change in selection.

To select multiple actors hold CTRL and click actors to add to the current selection.

====Drag-select ====

In an orthogonal viewport, it's possible to drag-select: hold CTRL + ALT (or just ALT-GR), click in empty space and drag the red selection rectangle around the things you want to select. Note that brushes are selected according to where their [[Legacy:Pivot|pivot]] is situated. This method forgets what was selected before &amp;ndash; hold SHIFT down as well to add to what is currently selected. Note that you can only select brushes in the Front and Side view, whereas you can select brushes and Actors in the Top view.

====3D brush select ====

You can select the brush that a surface belongs to by SHIFT + left-clicking the surface in the 3D viewport. Note that if you have deleted that brush but the surface is still there because geometry hasn't been rebuilt, UnrealEd will probably crash.

===Surface selection ===

Left-click to select surfaces. CTRL+left-click to add to the current  selection (or remove if already selected).

ALT-right-click on a surface to make the texture on that surface current in the [[Legacy:Texture Browser|Texture browser]]. ALT-left-click to apply the current texture to a surface.

See also [[Legacy:Selecting Surfaces|Selecting Surfaces]] for further surface selection commands.

==Object movement ==

In most modes you can move selected brushes and actors by dragging with a modifier key:
* CTRL to move the selected objects instead of scrolling the view
* SHIFT to move objects and scroll with them.

In 2D viewports, use click &amp; drag with the left button and one of the above keys.&lt;br /&gt;In 3D viewports, use the following with either key:
* Left button, left &amp; right: x-axis
* Right button, left &amp; right: y-axis
* Both buttons, up &amp; down: z-axis

Performing a movement action when nothing is selected will automatically select the [[Legacy:Red Builder Brush|red builder brush]] and start moving it.

Hold ALT and left-click and drag to move a brush's [[Legacy:Pivot|pivot]] point.

==Adding Actors ==

Holding a specific key while left clicking will add the current selected actor from the [[Legacy:Actor Classes|Actor Classes]] browser. In 3D this will add the actor a short distance from the surface clicked on, in an orthogonal viewport the 3rd coordinate will be zero.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''actor type
|'''mouse button
|'''key
|
|-
| style=&quot;text-align: center&quot; |light
|left click
|L
|-
| style=&quot;text-align: center&quot; |selected [[Legacy:Actor|actor]]
|left click
|A
|}

==Miscellaneous==

To measure distances, hold shift and drag with the middle mouse button.

----

below is old stuff that will need salvaging at some point.

==Mode specifics ==

Needs major formatting...

===camera tool ===

[[Image:Legacy_button.mode.camera.gif|left|]]

{|

|-
| colspan=&quot;6&quot; |
===Mouse control===

|-
|'''function
|'''key
|'''left
|'''right
|'''drag
|-
|camera
|alt
|
|
|
|-
|camera pan
|
|&amp;radic;
|
|
|}

===click ===

ALT:

right: 

===click + drag ===

====plain ====

L: pan&lt;br /&gt;R: fast pan&lt;br /&gt;L+R: zoom (up|down)

====shift ====

L: move+pan&lt;br /&gt;R:rotate&amp;pan ??&lt;br /&gt;L+R: zoom (up|down)

====ctrl ====

l: move&lt;br /&gt;r:rotate (left/right)&lt;br /&gt;l+r: zoom(up/down)

====alt ====

l: move a brush's [[Legacy:Pivot|pivot]]&lt;br /&gt;r: nothing&lt;br /&gt;l+r: zoom 

====shift + ctrl ====

====alt + ctrl ====

LMB: drag-select: click empty space in an ortho [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] and drag to select multiple [[Legacy:Brush|brush]]es and [[Legacy:Actor|actor]]s. Note that brushes are selected according to where their [[Legacy:Pivot|pivot]] is situated.

'''Sobiwan:''' I'm thinking of organizing the tables by function rather than mouse or key because a person asks 'how do I move the camera' as opposed to 'what does the left mouse button with alt and shift do'?

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4423</id>
      <timestamp>2005-08-16T10:58:09Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Complete reference for using the mouse in UnrealEd 2.0 [[Legacy:UnrealEd Viewport|UnrealEd Viewport]]s. See also [[Legacy:UnrealEd Interface|UnrealEd interface]]. These should all work the same in UnrealEd 3.0.

==Camera movement==

===2D Viewport===

{|

|-
|'''mouse button
|'''up/down
|'''left/right
|-
|left
|slow pan
|slow pan
|-
|right
|fast pan
|fast pan
|-
|both
|zoom
|none
|}

===3D viewport===

{|

|-
|'''mouse button
|'''up/down
|'''left/right
|Note
|-
|left
|move forwards/backwards
|pan
|keeps the camera at a constant height
|-
|right
|pan
|pan
|
|-
|both
|elevator move up/down
|strafe/dolly
|viewing angle does not affect elevator mode
|}

===Troubleshooting the 3D camera===

If you ever find the 3D camera has been rotated too much and the view is confusing, do this to reset it:
# Find the Camera actor. It shows in 2D views as an eye. The quick way to locate it is this: 
## Open [[Legacy:Actor Search|Actor Search]]
## double-clicking any object name
## all viewpoint focus on that object. &lt;br /&gt;(The actual name depends on how your viewports are configured. By default it's (usually?) '''Camera2'''. Fascinating factoid: the Texture Browser has a Camera object. There's also a mysterious Camera4...
# Select the Camera actor
# Do [[Legacy:Actor Context Menu|Actor Context Menu]] -&gt; Reset -&gt; Reset Rotation
# Move the Camera actor a little bit in a 2D viewport (otherwise, next time you work in the 3D view it will keep the orientation you're trying to get rid of)
# Click in the 3D viewport. Everything is happy :D

==Object Selection ==

===Actors ===

====Select ====

Left-click a single brush or actor icon to select it in any viewport. Note that other viewports don't update to reflect change in selection.

To select multiple actors hold CTRL and click actors to add to the current selection.

====Drag-select ====

In an orthogonal viewport, it's possible to drag-select: hold CTRL + ALT (or just ALT-GR), click in empty space and drag the red selection rectangle around the things you want to select. Note that brushes are selected according to where their [[Legacy:Pivot|pivot]] is situated. This method forgets what was selected before &amp;ndash; hold SHIFT down as well to add to what is currently selected.

====3D brush select ====

You can select the brush that a surface belongs to by SHIFT + left-clicking the surface in the 3D viewport. Note that if you have deleted that brush but the surface is still there because geometry hasn't been rebuilt, UnrealEd will probably crash.

===Surface selection ===

Left-click to select surfaces. CTRL+left-click to add to the current  selection (or remove if already selected).

ALT-right-click on a surface to make the texture on that surface current in the [[Legacy:Texture Browser|Texture browser]]. ALT-left-click to apply the current texture to a surface.

See also [[Legacy:Selecting Surfaces|Selecting Surfaces]] for further surface selection commands.

==Object movement ==

In most modes you can move selected brushes and actors by dragging with a modifier key:
* CTRL to move the selected objects instead of scrolling the view
* SHIFT to move objects and scroll with them.

In 2D viewports, use click &amp; drag with the left button and one of the above keys.&lt;br /&gt;In 3D viewports, use the following with either key:
* Left button, left &amp; right: x-axis
* Right button, left &amp; right: y-axis
* Both buttons, up &amp; down: z-axis

Performing a movement action when nothing is selected will automatically select the [[Legacy:Red Builder Brush|red builder brush]] and start moving it.

Hold ALT and left-click and drag to move a brush's [[Legacy:Pivot|pivot]] point.

==Adding Actors ==

Holding a specific key while left clicking will add the current selected actor from the [[Legacy:Actor Classes|Actor Classes]] browser. In 3D this will add the actor a short distance from the surface clicked on, in an orthogonal viewport the 3rd coordinate will be zero.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''actor type
|'''mouse button
|'''key
|
|-
| style=&quot;text-align: center&quot; |light
|left click
|L
|-
| style=&quot;text-align: center&quot; |selected [[Legacy:Actor|actor]]
|left click
|A
|}

==Miscellaneous==

To measure distances, hold shift and drag with the middle mouse button.

----

below is old stuff that will need salvaging at some point.

==Mode specifics ==

Needs major formatting...

===camera tool ===

[[Image:Legacy_button.mode.camera.gif|left|]]

{|

|-
| colspan=&quot;6&quot; |
===Mouse control===

|-
|'''function
|'''key
|'''left
|'''right
|'''drag
|-
|camera
|alt
|
|
|
|-
|camera pan
|
|&amp;radic;
|
|
|}

===click ===

ALT:

right: 

===click + drag ===

====plain ====

L: pan&lt;br /&gt;R: fast pan&lt;br /&gt;L+R: zoom (up|down)

====shift ====

L: move+pan&lt;br /&gt;R:rotate&amp;pan ??&lt;br /&gt;L+R: zoom (up|down)

====ctrl ====

l: move&lt;br /&gt;r:rotate (left/right)&lt;br /&gt;l+r: zoom(up/down)

====alt ====

l: move a brush's [[Legacy:Pivot|pivot]]&lt;br /&gt;r: nothing&lt;br /&gt;l+r: zoom 

====shift + ctrl ====

====alt + ctrl ====

LMB: drag-select: click empty space in an ortho [[Legacy:UnrealEd Viewport|UnrealEd Viewport]] and drag to select multiple [[Legacy:Brush|brush]]es and [[Legacy:Actor|actor]]s. Note that brushes are selected according to where their [[Legacy:Pivot|pivot]] is situated.

'''Sobiwan:''' I'm thinking of organizing the tables by function rather than mouse or key because a person asks 'how do I move the camera' as opposed to 'what does the left mouse button with alt and shift do'?

==Related Topics==
* [[Legacy:UnrealEd Interface|UnrealEd Interface]]

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Troubleshooting|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Movable Actors</title>
    <id>2147</id>
    <revision>
      <id>5227</id>
      <timestamp>2006-04-04T01:28:59Z</timestamp>
      <contributor>
        <ip>84-45-226-149.no-dns-yet.enta.net</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial is how to make a movable actor.

'''Warning:''' Attaching an actor with bStatic defaulting to true will not work in netplay in most engine versions. Best-case scenario: it simply doesn't show up on the client. Worst-case: client crashes out with an assertion failure.

HOWEVER, if you subclass the actor class you want to attach and set bStatic=False in the defaultproperties, it will work just fine in netplay. But you cannot change the default value of bStatic in the editor, so you will need to create a new package outside of UnrealEd or use package 'mylevel'.

==Prerequisites==

Know how to...
* ...make a level. (Read the first section of the [[Legacy:Mapping Resources|Mapping Resources]] page to get a rough idea on how to create a level.)
* ...use the [[Legacy:UnrealEd Console|UnrealEd Console]].

==Setting up==

First, [[Legacy:Subtract A Space|subtract a space]], say a cubic 1024 room, and make a same-sized room far far away, but not too far. Next, place a [[Legacy:PlayerStart|PlayerStart]] and a [[Legacy:Light|Light]] (or [[Legacy:Actor|Actor]] in the first room, and [[Legacy:Rebuild|rebuild]]. 
 

You need to [[Legacy:Create A Mover|Create A Mover]] in the second room and then make the keys in a small to medium distance from key 0. Tweak the mover to your liking and then [[Legacy:Set The Following Properties|set the following properties]]:

* Object -&gt; InitialState = ConstantLoop

Now [[Legacy:Match These Tags|match these tags]]:
* the Mover's Events -&gt; Tag
* the Actors's Movement -&gt; AttachTag

==Tweaking hidden properties==

The crux of making the actor actually move is '''setting its bStatic property to False.'''  (By default it is set to True, which means that the actors are fixed at their initial position and cannot be moved.)  Unfortunately, the bStatic property is normally hidden. See [[Legacy:Actor Properties Window|Actor Properties Window]] to find out how to edit hidden properties.

==Final Touches==

You are now in the final stages of making the actor move. You may do any effect with the mover, actor, an added trigger, etc. This tutorial can also be used for weapons, volumes, etc.

In the next section, you will find examples of how to utilize this information.

==Example Utilizations==
* Energy rings moving through a tube.
* Rockets that launch.

==Test Maps==

You can download a [http://home.att.net/~tornado.f5/UTstuff/Movable_Lights_Zxan.zip test map] that utilizes this technique.

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Actor|Actor]]s
* [[Legacy:Mover|Mover]]s

==Discussion==

'''Ragdoll:'''I found out how to get lights to attach to movers without the bStatic netplay crash issue. Its very simple-'''Use a TriggerLight'''. it has bstatic as false by default. works well with coronas on trains/cars etc but can cause a SERIOUS impact on performance- before i attached corona light i was 90 FPS, after 20 FPS

'''SuperApe:''' Right.  That impact is due to the dynamic lighting eating up CPU cycles.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5228</id>
      <timestamp>2005-12-16T00:17:27Z</timestamp>
      <contributor>
        <ip>192.251.69.127</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial is how to make a movable actor.

'''Warning:''' Attaching an actor with bStatic defaulting to true will not work in netplay in most engine versions. Best-case scenario: it simply doesn't show up on the client. Worst-case: client crashes out with an assertion failure.

HOWEVER, if you subclass the actor class you want to attach and set bStatic=False in the defaultproperties, it will work just fine in netplay. But you cannot change the default value of bStatic in the editor, so you will need to create a new package outside of UnrealEd.

==Prerequisites==

Know how to...
* ...make a level. (Read the first section of the [[Legacy:Mapping Resources|Mapping Resources]] page to get a rough idea on how to create a level.)
* ...use the [[Legacy:UnrealEd Console|UnrealEd Console]].

==Setting up==

First, [[Legacy:Subtract A Space|subtract a space]], say a cubic 1024 room, and make a same-sized room far far away, but not too far. Next, place a [[Legacy:PlayerStart|PlayerStart]] and a [[Legacy:Light|Light]] (or [[Legacy:Actor|Actor]] in the first room, and [[Legacy:Rebuild|rebuild]]. 
 

You need to [[Legacy:Create A Mover|Create A Mover]] in the second room and then make the keys in a small to medium distance from key 0. Tweak the mover to your liking and then [[Legacy:Set The Following Properties|set the following properties]]:

* Object -&gt; InitialState = ConstantLoop

Now [[Legacy:Match These Tags|match these tags]]:
* the Mover's Events -&gt; Tag
* the Actors's Movement -&gt; AttachTag

==Tweaking hidden properties==

The crux of making the actor actually move is '''setting its bStatic property to False.'''  (By default it is set to True, which means that the actors are fixed at their initial position and cannot be moved.)  Unfortunately, the bStatic property is normally hidden. See [[Legacy:Actor Properties Window|Actor Properties Window]] to find out how to edit hidden properties.

==Final Touches==

You are now in the final stages of making the actor move. You may do any effect with the mover, actor, an added trigger, etc. This tutorial can also be used for weapons, volumes, etc.

In the next section, you will find examples of how to utilize this information.

==Example Utilizations==
* Energy rings moving through a tube.
* Rockets that launch.

==Test Maps==

You can download a [http://home.att.net/~tornado.f5/UTstuff/Movable_Lights_Zxan.zip test map] that utilizes this technique.

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Actor|Actor]]s
* [[Legacy:Mover|Mover]]s

==Discussion==

'''Ragdoll:'''I found out how to get lights to attach to movers without the bStatic netplay crash issue. Its very simple-'''Use a TriggerLight'''. it has bstatic as false by default. works well with coronas on trains/cars etc but can cause a SERIOUS impact on performance- before i attached corona light i was 90 FPS, after 20 FPS

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5229</id>
      <timestamp>2005-12-16T00:17:52Z</timestamp>
      <contributor>
        <ip>192.251.69.127</ip>
      </contributor>
      <comment>(SuperApe) : Reply about TriggerLights.</comment>
      <text xml:space="preserve">This tutorial is how to make a movable actor.

'''Warning:''' Attaching an actor with bStatic defaulting to true will not work in netplay in most engine versions. Best-case scenario: it simply doesn't show up on the client. Worst-case: client crashes out with an assertion failure.

HOWEVER, if you subclass the actor class you want to attach and set bStatic=False in the defaultproperties, it will work just fine in netplay. But you cannot change the default value of bStatic in the editor, so you will need to create a new package outside of UnrealEd.

==Prerequisites==

Know how to...
* ...make a level. (Read the first section of the [[Legacy:Mapping Resources|Mapping Resources]] page to get a rough idea on how to create a level.)
* ...use the [[Legacy:UnrealEd Console|UnrealEd Console]].

==Setting up==

First, [[Legacy:Subtract A Space|subtract a space]], say a cubic 1024 room, and make a same-sized room far far away, but not too far. Next, place a [[Legacy:PlayerStart|PlayerStart]] and a [[Legacy:Light|Light]] (or [[Legacy:Actor|Actor]] in the first room, and [[Legacy:Rebuild|rebuild]]. 
 

You need to [[Legacy:Create A Mover|Create A Mover]] in the second room and then make the keys in a small to medium distance from key 0. Tweak the mover to your liking and then [[Legacy:Set The Following Properties|set the following properties]]:

* Object -&gt; InitialState = ConstantLoop

Now [[Legacy:Match These Tags|match these tags]]:
* the Mover's Events -&gt; Tag
* the Actors's Movement -&gt; AttachTag

==Tweaking hidden properties==

The crux of making the actor actually move is '''setting its bStatic property to False.'''  (By default it is set to True, which means that the actors are fixed at their initial position and cannot be moved.)  Unfortunately, the bStatic property is normally hidden. See [[Legacy:Actor Properties Window|Actor Properties Window]] to find out how to edit hidden properties.

==Final Touches==

You are now in the final stages of making the actor move. You may do any effect with the mover, actor, an added trigger, etc. This tutorial can also be used for weapons, volumes, etc.

In the next section, you will find examples of how to utilize this information.

==Example Utilizations==
* Energy rings moving through a tube.
* Rockets that launch.

==Test Maps==

You can download a [http://home.att.net/~tornado.f5/UTstuff/Movable_Lights_Zxan.zip test map] that utilizes this technique.

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Actor|Actor]]s
* [[Legacy:Mover|Mover]]s

==Discussion==

'''Ragdoll:'''I found out how to get lights to attach to movers without the bStatic netplay crash issue. Its very simple-'''Use a TriggerLight'''. it has bstatic as false by default. works well with coronas on trains/cars etc but can cause a SERIOUS impact on performance- before i attached corona light i was 90 FPS, after 20 FPS

'''SuperApe:''' Right.  That impact is due to the dynamic lighting eating up CPU cycles.

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Movable Lights</title>
    <id>2081</id>
    <revision>
      <id>5065</id>
      <timestamp>2004-02-05T00:36:38Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Movable Actors|Movable Actors]]</text>
    </revision>
    <revision>
      <id>5066</id>
      <timestamp>2003-05-26T21:24:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial is how to make a movable light.

'''Note:'''  It hasn't been tested yet whether maps using this technique will work in online games too.  It may be that the movable lights won't move for clients in online game.  (If anybody finds out for sure, please update this paragraph.)

==Prerequisites==

Know how to...
* ...make a level. (Read the first section of the [[Legacy:Mapping Resources|Mapping Resources]] page to get a rough idea on how to create a level.)
* ...use the [[Legacy:UnrealEd Console|UnrealEd Console]].

==Setting up==

First, [[Legacy:Subtract A Space|subtract a space]], say a cubic 1024 room, and make a same-sized room far far away, but not too far. Next, place a [[Legacy:PlayerStart|PlayerStart]] and a [[Legacy:Light|Light]] in the first room, and [[Legacy:Rebuild|rebuild]]. 

[[Legacy:Add A Mover|Add a Mover]] in the second room and then make the keys in a small to medium distance from key 0. Tweak the mover to your liking and then [[Legacy:Set The Following Properties|set the following properties]]:

* Object -&gt; InitialState = ConstantLoop

Now [[Legacy:Match These Tags|match these tags]]:
* the Mover's Events -&gt; Tag
* the Light's Movement -&gt; AttachTag

==Tweaking hidden properties==

The crux of making the light actually move is '''setting its bStatic property to False.'''  (By default it is set to True, which means that the lights are fixed at their initial position and cannot be moved.)  Unfortunately, the bStatic property is normally hidden in the [[Legacy:Actor Properties Window|actor properties window]], so we have to find another way:

# Look up the Light's '''object name.'''  It is stored in the (non-editable) Object -&gt; Name property.  Normally, a Light's object name is along the lines of &quot;Light443&quot; (that's &quot;Light&quot; plus a number).
# In the [[Legacy:UnrealEd Console|UnrealEd console]], enter &quot;editobj Light443&quot; (substitute &quot;Light443&quot; with the object name of your Light actor).  This will pop up another window very similar to the normal [[Legacy:Actor Properties Window|actor properties window]].
# That new properties window has extra sections, that are normally hidden from view in UnrealEd. Set None -&gt; bStatic to False.

==Final Touches==

You are now in the final stages of making the light move. You may do any effect with the mover, light, an added trigger, etc. This tutorial can also be used for weapons, volumes, etc.

In the next section, you will find examples of how to utilize this information.

==Example Utilizations==
* Energy rings moving through a tube.
* Rockets that launch.

==Test Maps==

You can download a [http://home.att.net/~parkers/nick/UTstuff/Movable_Lights_Zxan.zip test map] that uses this technique.

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Mover|Mover]]s

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5067</id>
      <timestamp>2004-02-02T20:32:20Z</timestamp>
      <contributor>
        <ip>Zxanphorian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This tutorial is how to make a movable light.

'''Note:'''  It hasn't been tested yet whether maps using this technique will work in online games too.  It may be that the movable lights won't move for clients in online game.  (If anybody finds out for sure, please update this paragraph.)

==Prerequisites==

Know how to...
* ...make a level. (Read the first section of the [[Legacy:Mapping Resources|Mapping Resources]] page to get a rough idea on how to create a level.)
* ...use the [[Legacy:UnrealEd Console|UnrealEd Console]].

==Setting up==

First, [[Legacy:Subtract A Space|subtract a space]], say a cubic 1024 room, and make a same-sized room far far away, but not too far. Next, place a [[Legacy:PlayerStart|PlayerStart]] and a [[Legacy:Light|Light]] in the first room, and [[Legacy:Rebuild|rebuild]]. 

[[Legacy:Add A Mover|Add a Mover]] in the second room and then make the keys in a small to medium distance from key 0. Tweak the mover to your liking and then [[Legacy:Set The Following Properties|set the following properties]]:

* Object -&gt; InitialState = ConstantLoop

Now [[Legacy:Match These Tags|match these tags]]:
* the Mover's Events -&gt; Tag
* the Light's Movement -&gt; AttachTag

==Tweaking hidden properties==

The crux of making the light actually move is '''setting its bStatic property to False.'''  (By default it is set to True, which means that the lights are fixed at their initial position and cannot be moved.)  Unfortunately, the bStatic property is normally hidden in the [[Legacy:Actor Properties Window|actor properties window]], so we have to find another way:

# Look up the Light's '''object name.'''  It is stored in the (non-editable) Object -&gt; Name property.  Normally, a Light's object name is along the lines of &quot;Light443&quot; (that's &quot;Light&quot; plus a number).
# In the [[Legacy:UnrealEd Console|UnrealEd console]], enter &quot;editobj Light443&quot; (substitute &quot;Light443&quot; with the object name of your Light actor).  This will pop up another window very similar to the normal [[Legacy:Actor Properties Window|actor properties window]].
# That new properties window has extra sections, that are normally hidden from view in UnrealEd. Set None -&gt; bStatic to False.

==Final Touches==

You are now in the final stages of making the light move. You may do any effect with the mover, light, an added trigger, etc. This tutorial can also be used for weapons, volumes, etc.

In the next section, you will find examples of how to utilize this information.

==Example Utilizations==
* Energy rings moving through a tube.
* Rockets that launch.

==Test Maps==

You can download a [http://home.att.net/~tornado.f5/UTstuff/Movable_Lights_Zxan.zip test map] that utilizes this technique.

==Related Topics==
* [[Legacy:Lighting|Lighting]]
* [[Legacy:Dynamics|Dynamics]]
* [[Legacy:Mover|Mover]]s

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Movement Metrics (UT)</title>
    <id>2069</id>
    <revision>
      <id>5040</id>
      <timestamp>2006-05-15T17:48:06Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated link</comment>
      <text xml:space="preserve">Some Playtesting Values ([[Legacy:UT|UT]])

'''Wormbo:''' This is what I gathered with a little mutator at normal gravity. Note that in hardcore and turbo mode 1.1 seconds in game really are 1 second, so the raw speed values have to be multiplied by 1.1 to get the real speed (the value in parantheses). Also note that the player's collision radius (17 UU) can increase the longest possible jump by up to 34 UU. Walking and crouching speeds are the same.

Here's the mutator, in case someone wants to try and beat me (please do!): [http://www.koehler-homepage.de/Wormbo/unrealwiki.html#DW Distance Watcher]

'''''Translocator'''''

(values relative to starting point which is about 70 UU above the floor)

{|

|-
|
|'''regular throw'''
|'''with Impact Hammer'''
|'''with Shock Rifle combo''' 
|-
|Longest throw
| style=&quot;text-align: right&quot; |1603 UU
| style=&quot;text-align: right&quot; |5571 UU
| style=&quot;text-align: right&quot; |8166 UU 
|-
|Highest throw
| style=&quot;text-align: right&quot; |718 UU
| style=&quot;text-align: right&quot; |953 UU
| style=&quot;text-align: right&quot; |1805 UU 
|}

'''''Dodging'''''

(values are about the same for all directions)

{|

|-
|
| style=&quot;text-align: center&quot; |'''Hardcore/Classic'''
| style=&quot;text-align: center&quot; |'''Turbo'''     
|-
|height
| style=&quot;text-align: right&quot; |23 UU
| style=&quot;text-align: right&quot; |23 UU 
|-
|distance
| style=&quot;text-align: right&quot; |237 UU
| style=&quot;text-align: right&quot; |380 UU 
|-
|speed
| style=&quot;text-align: right&quot; |600 UU/s (660 UU/s)
| style=&quot;text-align: right&quot; |840 UU/s (924 UU/s) 
|}

====Hardcore Mode (default)====

(35% air control)

'''''Jumps without Impact Hammer'''''

{|

|-
|
| style=&quot;text-align: center&quot; |'''running'''
| style=&quot;text-align: center&quot; |'''walking'''
| style=&quot;text-align: center&quot; |'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |67 UU
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |500 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |311 UU
| style=&quot;text-align: right&quot; |221 UU
| style=&quot;text-align: right&quot; |893 UU 
|-
|speed
| style=&quot;text-align: right&quot; |400 UU/s (440 UU/s)
| style=&quot;text-align: right&quot; |120 UU/s (132 UU/s)
|}

'''''Jumps with Impact Hammer'''''

{|

|-
|
|'''without Jump Boots'''
|'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |489 UU
| style=&quot;text-align: right&quot; |862 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |1389 UU
| style=&quot;text-align: right&quot; |2073 UU 
|}

====Classic Mode====

(35% air control)

'''''Jumps without Impact Hammer'''''

{|

|-
|
| style=&quot;text-align: center&quot; |'''running'''
| style=&quot;text-align: center&quot; |'''walking'''
| style=&quot;text-align: center&quot; |'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |500 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |278 UU
| style=&quot;text-align: right&quot; |221 UU
| style=&quot;text-align: right&quot; |869 UU 
|-
|speed
| style=&quot;text-align: right&quot; |400 UU/s
| style=&quot;text-align: right&quot; |120 UU/s
|}

'''''Jumps with Impact Hammer'''''

{|

|-
|
|'''without Jump Boots'''
|'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |457 UU
| style=&quot;text-align: right&quot; |862 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |1329 UU
| style=&quot;text-align: right&quot; |2073 UU 
|}

====Turbo Mode====

(65% air control, this is somewhat similar to Hardcore mode + Relic of Speed)

'''''Jumps without Impact Hammer'''''

{|

|-
|
| style=&quot;text-align: center&quot; |'''running'''
| style=&quot;text-align: center&quot; |'''walking'''
| style=&quot;text-align: center&quot; |'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |80 UU
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |500 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |486 UU
| style=&quot;text-align: right&quot; |347 UU
| style=&quot;text-align: right&quot; |893 UU 
|-
|speed
| style=&quot;text-align: right&quot; |560 UU/s (616 UU/s)
| style=&quot;text-align: right&quot; |168 UU/s (185 UU/s)
|}

'''''Jumps with Impact Hammer'''''

{|

|-
|
|'''without Jump Boots'''
|'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |524 UU
| style=&quot;text-align: right&quot; |862 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |1777 UU
| style=&quot;text-align: right&quot; |2397 UU 
|}

----

* Minimum ceiling height clearance that a Player can jump to = 160 Units.
* Maximum horizontal distance a Player can jump = 320 Units
* Maximum height a Player can fall without taking damage = 640 Units.
* Maximum height that a player's feet can clear from an [[Legacy:HammerJump|impact hammer jump]] = 480 Units. (although you have to be pretty 1337 to achieve this in one try)
* Maximum velocity a player can move before taking damage on a sudden impact is 1100 UU/s

'''ZxAnPhOrIaN:'''  I achieved this jump in only one try! :D :P

'''JustaAverageKid:'''  So did I :D

'''Wormbo:''' You did? Prove it with the mutator. :P

'''Dorkorama:''' I figured out the max speed while having damageless falls. (1100 UU/s) Setting this as a ZoneInfo's TerminalVelocity would prevent anyone from taking falling damage. This may be an altervative to using low gravity for &quot;Me-Tiny&quot; maps as it doesn't change the timing of normal jumps, dodges, etc. Only long falls are affected. It could be slightly increased if you want some damage to be taken.

'''Fearless:''' Is this mutator still available somewhere ? The ZIP file seems to be no longer present on your website Wormbo. It would be nice to see it in action :) .

'''Wormbo:''' Fixed.

==Related Topics ==
* [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5041</id>
      <timestamp>2004-12-03T17:35:26Z</timestamp>
      <contributor>
        <ip>Fearless</ip>
      </contributor>
      <comment>comment added</comment>
      <text xml:space="preserve">Some Playtesting Values ([[Legacy:UT|UT]])

'''Wormbo:''' This is what I gathered with a little mutator at normal gravity. Note that in hardcore and turbo mode 1.1 seconds in game really are 1 second, so the raw speed values have to be multiplied by 1.1 to get the real speed (the value in parantheses). Also note that the player's collision radius (17 UU) can increase the longest possible jump by up to 34 UU. Walking and crouching speeds are the same.

Here's the mutator, in case someone wants to try and beat me. (please do :) )

http://www.koehler-homepage.de/Wormbo/downloads/DistanceWatcher.zip

'''''Translocator'''''

(values relative to starting point which is about 70 UU above the floor)

{|

|-
|
|'''regular throw'''
|'''with Impact Hammer'''
|'''with Shock Rifle combo''' 
|-
|Longest throw
| style=&quot;text-align: right&quot; |1603 UU
| style=&quot;text-align: right&quot; |5571 UU
| style=&quot;text-align: right&quot; |8166 UU 
|-
|Highest throw
| style=&quot;text-align: right&quot; |718 UU
| style=&quot;text-align: right&quot; |953 UU
| style=&quot;text-align: right&quot; |1805 UU 
|}

'''''Dodging'''''

(values are about the same for all directions)

{|

|-
|
| style=&quot;text-align: center&quot; |'''Hardcore/Classic'''
| style=&quot;text-align: center&quot; |'''Turbo'''     
|-
|height
| style=&quot;text-align: right&quot; |23 UU
| style=&quot;text-align: right&quot; |23 UU 
|-
|distance
| style=&quot;text-align: right&quot; |237 UU
| style=&quot;text-align: right&quot; |380 UU 
|-
|speed
| style=&quot;text-align: right&quot; |600 UU/s (660 UU/s)
| style=&quot;text-align: right&quot; |840 UU/s (924 UU/s) 
|}

====Hardcore Mode (default)====

(35% air control)

'''''Jumps without Impact Hammer'''''

{|

|-
|
| style=&quot;text-align: center&quot; |'''running'''
| style=&quot;text-align: center&quot; |'''walking'''
| style=&quot;text-align: center&quot; |'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |67 UU
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |500 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |311 UU
| style=&quot;text-align: right&quot; |221 UU
| style=&quot;text-align: right&quot; |893 UU 
|-
|speed
| style=&quot;text-align: right&quot; |400 UU/s (440 UU/s)
| style=&quot;text-align: right&quot; |120 UU/s (132 UU/s)
|}

'''''Jumps with Impact Hammer'''''

{|

|-
|
|'''without Jump Boots'''
|'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |489 UU
| style=&quot;text-align: right&quot; |862 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |1389 UU
| style=&quot;text-align: right&quot; |2073 UU 
|}

====Classic Mode====

(35% air control)

'''''Jumps without Impact Hammer'''''

{|

|-
|
| style=&quot;text-align: center&quot; |'''running'''
| style=&quot;text-align: center&quot; |'''walking'''
| style=&quot;text-align: center&quot; |'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |500 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |278 UU
| style=&quot;text-align: right&quot; |221 UU
| style=&quot;text-align: right&quot; |869 UU 
|-
|speed
| style=&quot;text-align: right&quot; |400 UU/s
| style=&quot;text-align: right&quot; |120 UU/s
|}

'''''Jumps with Impact Hammer'''''

{|

|-
|
|'''without Jump Boots'''
|'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |457 UU
| style=&quot;text-align: right&quot; |862 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |1329 UU
| style=&quot;text-align: right&quot; |2073 UU 
|}

====Turbo Mode====

(65% air control, this is somewhat similar to Hardcore mode + Relic of Speed)

'''''Jumps without Impact Hammer'''''

{|

|-
|
| style=&quot;text-align: center&quot; |'''running'''
| style=&quot;text-align: center&quot; |'''walking'''
| style=&quot;text-align: center&quot; |'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |80 UU
| style=&quot;text-align: right&quot; |55 UU
| style=&quot;text-align: right&quot; |500 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |486 UU
| style=&quot;text-align: right&quot; |347 UU
| style=&quot;text-align: right&quot; |893 UU 
|-
|speed
| style=&quot;text-align: right&quot; |560 UU/s (616 UU/s)
| style=&quot;text-align: right&quot; |168 UU/s (185 UU/s)
|}

'''''Jumps with Impact Hammer'''''

{|

|-
|
|'''without Jump Boots'''
|'''with Jump Boots''' 
|-
|highest jump
| style=&quot;text-align: right&quot; |524 UU
| style=&quot;text-align: right&quot; |862 UU 
|-
|longest jump
| style=&quot;text-align: right&quot; |1777 UU
| style=&quot;text-align: right&quot; |2397 UU 
|}

----

* Minimum ceiling height clearance that a Player can jump to = 160 Units.
* Maximum horizontal distance a Player can jump = 320 Units
* Maximum height a Player can fall without taking damage = 640 Units.
* Maximum height that a player's feet can clear from an [[Legacy:HammerJump|impact hammer jump]] = 480 Units. (although you have to be pretty 1337 to achieve this in one try)
* Maximum velocity a player can move before taking damage on a sudden impact is 1100 UU/s

'''ZxAnPhOrIaN:'''  I achieved this jump in only one try! :D :P

'''JustaAverageKid:'''  So did I :D

'''Wormbo:''' You did? Prove it with the mutator. :P

'''Dorkorama:''' I figured out the max speed while having damageless falls. (1100 UU/s) Setting this as a ZoneInfo's TerminalVelocity would prevent anyone from taking falling damage. This may be an altervative to using low gravity for &quot;Me-Tiny&quot; maps as it doesn't change the timing of normal jumps, dodges, etc. Only long falls are affected. It could be slightly increased if you want some damage to be taken.

'''Fearless:''' Is this mutator still available somewhere ? The ZIP file seems to be no longer present on your website Wormbo. It would be nice to see it in action :) .

==Related Topics ==
* [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Movement Metrics (UT2003)</title>
    <id>2068</id>
    <revision>
      <id>5037</id>
      <timestamp>2006-05-15T17:49:29Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated link</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2003|UT2003]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined from a mutator written by [[Legacy:Wormbo|Wormbo]], which displays statistics about the distances heights and speeds gained during gameplay.

Good maps to test on are BR-Anubis (because it has nice open and flat areas), DM-Asbestos (the boost dodge) and on W's very own DM-Cube16-][ ;) (more space than on Anubis and better wall dodge environment)

[http://www.koehler-homepage.de/Wormbo/unrealwiki.html#JS Jump Stats Mutator] (make sure you read the readme and don't blame me if it blows up your computer ;))

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge (90° away from the wall. When dodging 45° away from the wall you can get about 15% better distances when combined with jumping along the wall.)
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)
;BD : &quot;boost dodge&quot; / &quot;boost jump&quot; (a jump and a wall dodge at the same time; only really &quot;boosts&quot; in UT2003)

==Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |53 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |18 UU
| style=&quot;text-align: right&quot; |338 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |119 UU
| style=&quot;text-align: right&quot; |603 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |87 UU
| style=&quot;text-align: right&quot; |693 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |141 UU
| style=&quot;text-align: right&quot; |462 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |132 UU
| style=&quot;text-align: right&quot; |766 UU
|
|}

'''EntropicLqd:''' Is 2K3 VASTLY different from 2K4?  I've put a small map together that relies on a specific jump not being possible.  I'm currently clearing a distance of 1184UU with a J, WD, DJ combination.

'''Wormbo:''' We may have to start [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]. Differences in the walldodge implementation cause all values for walldodges and boostdodges in UT2003 to be quite a bit larger than in UT2004. The boostdodge has been degraded to a regular walldodge now because it nolonger adds the upward velocity of the jump to the doding velocity.

'''EntropicLqd:''' Would seem sensible.  I'll have a play this weekend and try and get some provisional figures down.  It'll be interesting to see how your mutator values line up with my own testing.  We might need a caveat around the player collision allowing the player to actually jump longer distances.  My impact jumping is pretty poor though.

'''GRAF1K:''' Groundspeed is apparently increased as well. Should the UT2004 metrics page duplicate the metrics unchanged since UT2003 or reference this page?

'''EntropicLqd:''' I would prefer all the unchanged (if any) metrics to be duplicated.  It keeps all the metrics for each version of ther game in one place which is a bit simpler for the users.

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       441 UU |&gt;         858 UU | |
;| ID          |&gt;       284 UU |&gt;        1073 UU | |
;| IJ, DJ      |&gt;       509 UU |&gt;        1107 UU | |
;| ID, DJ      |&gt;       363 UU |&gt;        1367 UU | |
;| IJ, DJ, WD  |&gt;       496 UU |&gt;         878 UU | |
;| IJ, WD, DJ  |&gt;       575 UU |&gt;        1395 UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       392 UU |&gt;        1157 UU | |
;| ID          |&gt;       172 UU |&gt;        1278 UU | |
;| IJ, DJ      |&gt;       454 UU |&gt;        1476 UU | |
;| ID, DJ      |&gt;       421 UU |&gt;        1839 UU | |
;| J, IWD, DJ  |&gt;       262 UU |&gt;        2020 UU | |
;| J, DJ, IWD  |&gt;       281 UU |&gt;        1580 UU | |

===Special trickjumps ===

Funky moves for extra distance or in special situations.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|BD
| style=&quot;text-align: right&quot; |140 UU
| style=&quot;text-align: right&quot; |836 UU
|more common distances are around 750-780 UU
|-
|BD, DJ
| style=&quot;text-align: right&quot; |210 UU
| style=&quot;text-align: right&quot; |1168 UU
|more common distances are around 1000-1060 UU
|}

Please suggest others and describe them a bit.

----

'''Kerlin:''' Speed Adrenaline modifies all of these, doesn't it? Ugh. Not to pile on more work or anything. :)

'''Wormbo:''' The Speed combo increases speed and jump height, so expect ''huge'' leaps in combination with impact jumping or other special combinations. I'll see about that right now, thanks for the reminder. :)

----

==With The Speed Combo ==

&lt;tt&gt;set ComboSpeed AdrenalineCost 0&lt;/tt&gt; gives enough time to test these jumps. :)

For some reason impact jump with the speed combo result in less height that normal impact jumps.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |134 UU
| style=&quot;text-align: right&quot; |674 UU
|
|-
|D
| style=&quot;text-align: right&quot; |22 UU
| style=&quot;text-align: right&quot; |425 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |284 UU
| style=&quot;text-align: right&quot; |1101 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |173 UU
| style=&quot;text-align: right&quot; |1359 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |325 UU
| style=&quot;text-align: right&quot; |1073 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |337 UU
| style=&quot;text-align: right&quot; |1711 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       337 UU |&gt;        1055 UU | |
;| ID          |&gt;       304 UU |&gt;        1513 UU | |
;| IJ, DJ      |&gt;       484 UU |&gt;        1517 UU | |
;| ID, DJ      |&gt;       ??? UU |&gt;        ???? UU | |
;| IJ, DJ, WD  |&gt;       ??? UU |&gt;        ???? UU | |
;| IJ, WD, DJ  |&gt;       572 UU |&gt;        2059 UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       290 UU |&gt;        1568 UU | |
;| ID          |&gt;       224 UU |&gt;        1793 UU | |
;| IJ, DJ      |&gt;       484 UU |&gt;        2277 UU | |
;| ID, DJ      |&gt;       ??? UU |&gt;        ???? UU | |
;| J, IWD, DJ  |&gt;       439 UU |&gt;        3224 UU | PH34R! :D
;| J, DJ, IWD  |&gt;       ??? UU |&gt;        ???? UU | |

===Special trickjumps ===

Funky moves for extra distance or in special situations.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|BD
| style=&quot;text-align: right&quot; |248 UU
| style=&quot;text-align: right&quot; |1503 UU
|
|-
|BD, DJ
| style=&quot;text-align: right&quot; |394 UU
| style=&quot;text-align: right&quot; |2287 UU
|
|}

----

All units are UEd3.0 units:

*  jump in length: 256 units (with speed, 768 units)
*  double-jump: 512 units (with speed 1152 units)
*  combo dodge/jump: 768 units (with speed 1280 units)
*  jump in height: 64 units (with speed 128 units)
*  double-jump in height: 128 units (with speed 256 units)
*  maximum height without taking damages: 768 units
*  dodge distance: 320 units (with speed 448 units)
*  wall dodge: 448 units (with speed 832 units)
*  wall-dodge/jump: 832 units (with speed 1600 units)
*  vertical shieldjump: 512 units (with berserk 1152 units)
*  horizontal shieldjump: 1024 (with speed 1280 units)
*  size of a character: 96 units (duck: 56 units)
*  minimal heights of a ceiling: 160 units (224 units for double* jump)
*  maximum height for a stair step: 40 units

'''Gui:''' Thx to Switch for the datas concerning shieldjumps and to Lord Simeon for the duck thing. Also, Qbic has posted some additionnal infos on BuF, but I didn't test them; here they are:

-dodgejump sideways while running forward: 832 (with speed, 1520)-

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

==Comments==

'''Foxpaw:''' Some information about the [[Legacy:Karma|Karma]] units would be a useful addition. To figure them out you may have to make a script to move two objects in sync, one with regular physics and one with Karma physics. That's just an idea as to how it might be measured, if anyone was willing to do the &quot;grunt work&quot; of figuring out the conversions it would be very useful.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5038</id>
      <timestamp>2004-09-01T23:23:19Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2003|UT2003]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined from a mutator written by [[Legacy:Wormbo|Wormbo]], which displays statistics about the distances heights and speeds gained during gameplay.

Good maps to test on are BR-Anubis (because it has nice open and flat areas), DM-Asbestos (the boost dodge) and on W's very own DM-Cube16-][ ;) (more space than on Anubis and better wall dodge environment)

[http://www.koehler-homepage.de/Wormbo/download2k3.html#TrickjumpTools Jump Stats Mutator] (make sure you read the readme and don't blame me if it blows up your computer ;))

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge (90° away from the wall. When dodging 45° away from the wall you can get about 15% better distances when combined with jumping along the wall.)
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)
;BD : &quot;boost dodge&quot; / &quot;boost jump&quot; (a jump and a wall dodge at the same time; only really &quot;boosts&quot; in UT2003)

==Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |53 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |18 UU
| style=&quot;text-align: right&quot; |338 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |119 UU
| style=&quot;text-align: right&quot; |603 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |87 UU
| style=&quot;text-align: right&quot; |693 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |141 UU
| style=&quot;text-align: right&quot; |462 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |132 UU
| style=&quot;text-align: right&quot; |766 UU
|
|}

'''EntropicLqd:''' Is 2K3 VASTLY different from 2K4?  I've put a small map together that relies on a specific jump not being possible.  I'm currently clearing a distance of 1184UU with a J, WD, DJ combination.

'''Wormbo:''' We may have to start [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]. Differences in the walldodge implementation cause all values for walldodges and boostdodges in UT2003 to be quite a bit larger than in UT2004. The boostdodge has been degraded to a regular walldodge now because it nolonger adds the upward velocity of the jump to the doding velocity.

'''EntropicLqd:''' Would seem sensible.  I'll have a play this weekend and try and get some provisional figures down.  It'll be interesting to see how your mutator values line up with my own testing.  We might need a caveat around the player collision allowing the player to actually jump longer distances.  My impact jumping is pretty poor though.

'''GRAF1K:''' Groundspeed is apparently increased as well. Should the UT2004 metrics page duplicate the metrics unchanged since UT2003 or reference this page?

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       441 UU |&gt;         858 UU | |
;| ID          |&gt;       284 UU |&gt;        1073 UU | |
;| IJ, DJ      |&gt;       509 UU |&gt;        1107 UU | |
;| ID, DJ      |&gt;       363 UU |&gt;        1367 UU | |
;| IJ, DJ, WD  |&gt;       496 UU |&gt;         878 UU | |
;| IJ, WD, DJ  |&gt;       575 UU |&gt;        1395 UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       392 UU |&gt;        1157 UU | |
;| ID          |&gt;       172 UU |&gt;        1278 UU | |
;| IJ, DJ      |&gt;       454 UU |&gt;        1476 UU | |
;| ID, DJ      |&gt;       421 UU |&gt;        1839 UU | |
;| J, IWD, DJ  |&gt;       262 UU |&gt;        2020 UU | |
;| J, DJ, IWD  |&gt;       281 UU |&gt;        1580 UU | |

===Special trickjumps ===

Funky moves for extra distance or in special situations.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|BD
| style=&quot;text-align: right&quot; |140 UU
| style=&quot;text-align: right&quot; |836 UU
|more common distances are around 750-780 UU
|-
|BD, DJ
| style=&quot;text-align: right&quot; |210 UU
| style=&quot;text-align: right&quot; |1168 UU
|more common distances are around 1000-1060 UU
|}

Please suggest others and describe them a bit.

----

'''Kerlin:''' Speed Adrenaline modifies all of these, doesn't it? Ugh. Not to pile on more work or anything. :)

'''Wormbo:''' The Speed combo increases speed and jump height, so expect ''huge'' leaps in combination with impact jumping or other special combinations. I'll see about that right now, thanks for the reminder. :)

----

==With The Speed Combo ==

&lt;tt&gt;set ComboSpeed AdrenalineCost 0&lt;/tt&gt; gives enough time to test these jumps. :)

For some reason impact jump with the speed combo result in less height that normal impact jumps.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |134 UU
| style=&quot;text-align: right&quot; |674 UU
|
|-
|D
| style=&quot;text-align: right&quot; |22 UU
| style=&quot;text-align: right&quot; |425 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |284 UU
| style=&quot;text-align: right&quot; |1101 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |173 UU
| style=&quot;text-align: right&quot; |1359 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |325 UU
| style=&quot;text-align: right&quot; |1073 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |337 UU
| style=&quot;text-align: right&quot; |1711 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       337 UU |&gt;        1055 UU | |
;| ID          |&gt;       304 UU |&gt;        1513 UU | |
;| IJ, DJ      |&gt;       484 UU |&gt;        1517 UU | |
;| ID, DJ      |&gt;       ??? UU |&gt;        ???? UU | |
;| IJ, DJ, WD  |&gt;       ??? UU |&gt;        ???? UU | |
;| IJ, WD, DJ  |&gt;       572 UU |&gt;        2059 UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       290 UU |&gt;        1568 UU | |
;| ID          |&gt;       224 UU |&gt;        1793 UU | |
;| IJ, DJ      |&gt;       484 UU |&gt;        2277 UU | |
;| ID, DJ      |&gt;       ??? UU |&gt;        ???? UU | |
;| J, IWD, DJ  |&gt;       439 UU |&gt;        3224 UU | PH34R! :D
;| J, DJ, IWD  |&gt;       ??? UU |&gt;        ???? UU | |

===Special trickjumps ===

Funky moves for extra distance or in special situations.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|BD
| style=&quot;text-align: right&quot; |248 UU
| style=&quot;text-align: right&quot; |1503 UU
|
|-
|BD, DJ
| style=&quot;text-align: right&quot; |394 UU
| style=&quot;text-align: right&quot; |2287 UU
|
|}

----

All units are UEd3.0 units:

*  jump in length: 256 units (with speed, 768 units)
*  double-jump: 512 units (with speed 1152 units)
*  combo dodge/jump: 768 units (with speed 1280 units)
*  jump in height: 64 units (with speed 128 units)
*  double-jump in height: 128 units (with speed 256 units)
*  maximum height without taking damages: 768 units
*  dodge distance: 320 units (with speed 448 units)
*  wall dodge: 448 units (with speed 832 units)
*  wall-dodge/jump: 832 units (with speed 1600 units)
*  vertical shieldjump: 512 units (with berserk 1152 units)
*  horizontal shieldjump: 1024 (with speed 1280 units)
*  size of a character: 96 units (duck: 56 units)
*  minimal heights of a ceiling: 160 units (224 units for double* jump)
*  maximum height for a stair step: 40 units

'''Gui:''' Thx to Switch for the datas concerning shieldjumps and to Lord Simeon for the duck thing. Also, Qbic has posted some additionnal infos on BuF, but I didn't test them; here they are:

-dodgejump sideways while running forward: 832 (with speed, 1520)-

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

==Comments==

'''Foxpaw:''' Some information about the [[Legacy:Karma|Karma]] units would be a useful addition. To figure them out you may have to make a script to move two objects in sync, one with regular physics and one with Karma physics. That's just an idea as to how it might be measured, if anyone was willing to do the &quot;grunt work&quot; of figuring out the conversions it would be very useful.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5039</id>
      <timestamp>2004-09-02T06:44:34Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>duplicate the metrics</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2003|UT2003]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined from a mutator written by [[Legacy:Wormbo|Wormbo]], which displays statistics about the distances heights and speeds gained during gameplay.

Good maps to test on are BR-Anubis (because it has nice open and flat areas), DM-Asbestos (the boost dodge) and on W's very own DM-Cube16-][ ;) (more space than on Anubis and better wall dodge environment)

[http://www.koehler-homepage.de/Wormbo/download2k3.html#TrickjumpTools Jump Stats Mutator] (make sure you read the readme and don't blame me if it blows up your computer ;))

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge (90° away from the wall. When dodging 45° away from the wall you can get about 15% better distances when combined with jumping along the wall.)
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)
;BD : &quot;boost dodge&quot; / &quot;boost jump&quot; (a jump and a wall dodge at the same time; only really &quot;boosts&quot; in UT2003)

==Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |53 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |18 UU
| style=&quot;text-align: right&quot; |338 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |119 UU
| style=&quot;text-align: right&quot; |603 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |87 UU
| style=&quot;text-align: right&quot; |693 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |141 UU
| style=&quot;text-align: right&quot; |462 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |132 UU
| style=&quot;text-align: right&quot; |766 UU
|
|}

'''EntropicLqd:''' Is 2K3 VASTLY different from 2K4?  I've put a small map together that relies on a specific jump not being possible.  I'm currently clearing a distance of 1184UU with a J, WD, DJ combination.

'''Wormbo:''' We may have to start [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]. Differences in the walldodge implementation cause all values for walldodges and boostdodges in UT2003 to be quite a bit larger than in UT2004. The boostdodge has been degraded to a regular walldodge now because it nolonger adds the upward velocity of the jump to the doding velocity.

'''EntropicLqd:''' Would seem sensible.  I'll have a play this weekend and try and get some provisional figures down.  It'll be interesting to see how your mutator values line up with my own testing.  We might need a caveat around the player collision allowing the player to actually jump longer distances.  My impact jumping is pretty poor though.

'''GRAF1K:''' Groundspeed is apparently increased as well. Should the UT2004 metrics page duplicate the metrics unchanged since UT2003 or reference this page?

'''EntropicLqd:''' I would prefer all the unchanged (if any) metrics to be duplicated.  It keeps all the metrics for each version of ther game in one place which is a bit simpler for the users.

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       441 UU |&gt;         858 UU | |
;| ID          |&gt;       284 UU |&gt;        1073 UU | |
;| IJ, DJ      |&gt;       509 UU |&gt;        1107 UU | |
;| ID, DJ      |&gt;       363 UU |&gt;        1367 UU | |
;| IJ, DJ, WD  |&gt;       496 UU |&gt;         878 UU | |
;| IJ, WD, DJ  |&gt;       575 UU |&gt;        1395 UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       392 UU |&gt;        1157 UU | |
;| ID          |&gt;       172 UU |&gt;        1278 UU | |
;| IJ, DJ      |&gt;       454 UU |&gt;        1476 UU | |
;| ID, DJ      |&gt;       421 UU |&gt;        1839 UU | |
;| J, IWD, DJ  |&gt;       262 UU |&gt;        2020 UU | |
;| J, DJ, IWD  |&gt;       281 UU |&gt;        1580 UU | |

===Special trickjumps ===

Funky moves for extra distance or in special situations.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|BD
| style=&quot;text-align: right&quot; |140 UU
| style=&quot;text-align: right&quot; |836 UU
|more common distances are around 750-780 UU
|-
|BD, DJ
| style=&quot;text-align: right&quot; |210 UU
| style=&quot;text-align: right&quot; |1168 UU
|more common distances are around 1000-1060 UU
|}

Please suggest others and describe them a bit.

----

'''Kerlin:''' Speed Adrenaline modifies all of these, doesn't it? Ugh. Not to pile on more work or anything. :)

'''Wormbo:''' The Speed combo increases speed and jump height, so expect ''huge'' leaps in combination with impact jumping or other special combinations. I'll see about that right now, thanks for the reminder. :)

----

==With The Speed Combo ==

&lt;tt&gt;set ComboSpeed AdrenalineCost 0&lt;/tt&gt; gives enough time to test these jumps. :)

For some reason impact jump with the speed combo result in less height that normal impact jumps.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |134 UU
| style=&quot;text-align: right&quot; |674 UU
|
|-
|D
| style=&quot;text-align: right&quot; |22 UU
| style=&quot;text-align: right&quot; |425 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |284 UU
| style=&quot;text-align: right&quot; |1101 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |173 UU
| style=&quot;text-align: right&quot; |1359 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |325 UU
| style=&quot;text-align: right&quot; |1073 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |337 UU
| style=&quot;text-align: right&quot; |1711 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       337 UU |&gt;        1055 UU | |
;| ID          |&gt;       304 UU |&gt;        1513 UU | |
;| IJ, DJ      |&gt;       484 UU |&gt;        1517 UU | |
;| ID, DJ      |&gt;       ??? UU |&gt;        ???? UU | |
;| IJ, DJ, WD  |&gt;       ??? UU |&gt;        ???? UU | |
;| IJ, WD, DJ  |&gt;       572 UU |&gt;        2059 UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       290 UU |&gt;        1568 UU | |
;| ID          |&gt;       224 UU |&gt;        1793 UU | |
;| IJ, DJ      |&gt;       484 UU |&gt;        2277 UU | |
;| ID, DJ      |&gt;       ??? UU |&gt;        ???? UU | |
;| J, IWD, DJ  |&gt;       439 UU |&gt;        3224 UU | PH34R! :D
;| J, DJ, IWD  |&gt;       ??? UU |&gt;        ???? UU | |

===Special trickjumps ===

Funky moves for extra distance or in special situations.

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|BD
| style=&quot;text-align: right&quot; |248 UU
| style=&quot;text-align: right&quot; |1503 UU
|
|-
|BD, DJ
| style=&quot;text-align: right&quot; |394 UU
| style=&quot;text-align: right&quot; |2287 UU
|
|}

----

All units are UEd3.0 units:

*  jump in length: 256 units (with speed, 768 units)
*  double-jump: 512 units (with speed 1152 units)
*  combo dodge/jump: 768 units (with speed 1280 units)
*  jump in height: 64 units (with speed 128 units)
*  double-jump in height: 128 units (with speed 256 units)
*  maximum height without taking damages: 768 units
*  dodge distance: 320 units (with speed 448 units)
*  wall dodge: 448 units (with speed 832 units)
*  wall-dodge/jump: 832 units (with speed 1600 units)
*  vertical shieldjump: 512 units (with berserk 1152 units)
*  horizontal shieldjump: 1024 (with speed 1280 units)
*  size of a character: 96 units (duck: 56 units)
*  minimal heights of a ceiling: 160 units (224 units for double* jump)
*  maximum height for a stair step: 40 units

'''Gui:''' Thx to Switch for the datas concerning shieldjumps and to Lord Simeon for the duck thing. Also, Qbic has posted some additionnal infos on BuF, but I didn't test them; here they are:

-dodgejump sideways while running forward: 832 (with speed, 1520)-

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2004)|Movement Metrics (UT2004)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

==Comments==

'''Foxpaw:''' Some information about the [[Legacy:Karma|Karma]] units would be a useful addition. To figure them out you may have to make a script to move two objects in sync, one with regular physics and one with Karma physics. That's just an idea as to how it might be measured, if anyone was willing to do the &quot;grunt work&quot; of figuring out the conversions it would be very useful.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Movement Metrics (UT2004)</title>
    <id>2187</id>
    <revision>
      <id>5302</id>
      <timestamp>2006-05-15T17:49:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>updated link</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2004|UT2004]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined with the help of the Jump Stats feature in [http://www.koehler-homepage.de/Wormbo/unrealwiki.html#MD Multi Dodging 2k4 v3] (written by [[Legacy:Wormbo|Wormbo]]), which displays statistics about the distances heights and speeds gained during gameplay. (Make sure you disable everything but the &quot;Gather movement stats&quot; option.)

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)

Moves that include dodging can be performed from standing still or running. Values here list standing dodges first, followed by values for a dodge performed orthogonally to the running direction.

Moves that include walldodging can be performed by jumping upwards without moving horizontally and then dodging away from the wall (listed as first value) or by jumping along the wall and dodging 45° away from it in the same direction as the jump. (listed as second value)

Height differences between standing and moving dodges might be an inaccuracy in the jump stats mutator.

==Jump Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |54 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |19 / 20 UU
| style=&quot;text-align: right&quot; |292 / 351 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |126 UU
| style=&quot;text-align: right&quot; |608 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |90 / 91 UU
| style=&quot;text-align: right&quot; |742 / 857 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |149 / 143 UU
| style=&quot;text-align: right&quot; |516 / 965 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |150 / 145 UU
| style=&quot;text-align: right&quot; |787 / 1047 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       455 UU |&gt;         878 UU | |
;| ID          |&gt; 270 / ??? UU |&gt; 1051 / ???? UU | |
;| IJ, DJ      |&gt;       513 UU |&gt;        1104 UU | |
;| ID, DJ      |&gt; 347 / ??? UU |&gt; 1392 / ???? UU | |
;| IJ, DJ, WD  |&gt; 533 / ??? UU |&gt;  861 / ???? UU | |
;| IJ, WD, DJ  |&gt; 513 / ??? UU |&gt; 1139 / ???? UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       302 UU |&gt;        1342 UU | |
;| ID          |&gt; 200 / ??? UU |&gt; 1302 / ???? UU | |
;| IJ, DJ      |&gt;       422 UU |&gt;        1745 UU | |
;| ID, DJ      |&gt; 288 / ??? UU |&gt; 1818 / ???? UU | |
;| J, IWD, DJ  |&gt; 307 / ??? UU |&gt; 1537 / ???? UU | |
;| J, DJ, IWD  |&gt; 353 / ??? UU |&gt; 2004 / ???? UU | |

==With The Speed Combo ==

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |130 UU
| style=&quot;text-align: right&quot; |675 UU
|
|-
|D
| style=&quot;text-align: right&quot; |21 / 21 UU
| style=&quot;text-align: right&quot; |419 / 495 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |279 UU
| style=&quot;text-align: right&quot; |1228 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |170 / 172 UU
| style=&quot;text-align: right&quot; |1333 / 1587 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |303 / 300 UU
| style=&quot;text-align: right&quot; |962 / 1648 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |306 / 301 UU
| style=&quot;text-align: right&quot; |1504 / 1999 UU
|I don't think I pulled the long one off the best way, yet.
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       326 UU |&gt;        1048 UU | |
;| ID          |&gt; 258 / ??? UU |&gt; 1461 / ???? UU | |
;| IJ, DJ      |&gt;       479 UU |&gt;        1571 UU | |
;| ID, DJ      |&gt; 430 / ??? UU |&gt; 2241 / ???? UU | |
;| IJ, DJ, WD  |&gt; 507 / ??? UU |&gt; 1181 / ???? UU | |
;| IJ, WD, DJ  |&gt; 505 / ??? UU |&gt; 1755 / ???? UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       461 UU |&gt;        2392 UU | |
;| ID          |&gt; 171 / ??? UU |&gt; 1642 / ???? UU | |
;| IJ, DJ      |&gt;       451 UU |&gt;        2395 UU | |
;| ID, DJ      |&gt; 369 / ??? UU |&gt; 2728 / ???? UU | |
;| J, IWD, DJ  |&gt; 419 / ??? UU |&gt; 2144 / ???? UU | Could be done way better.
;| J, DJ, IWD  |&gt; 417 / ??? UU |&gt; 2943 / ???? UU | I gave up while testing this one. (was the last thing to test) Values way over 3000 UU are definately possible here.

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5303</id>
      <timestamp>2004-09-01T17:22:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2004|UT2004]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined with the help of the Jump Stats feature in [http://www.koehler-homepage.de/Wormbo/download2k4.html#MD Multi Dodging 2k4 v3] (written by [[Legacy:Wormbo|Wormbo]], not yet available for download), which displays statistics about the distances heights and speeds gained during gameplay. (Make sure you disable everything but the &quot;Gather movement stats&quot; option.)

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)

Moves that include dodging can be performed from standing still or running. Values here list standing dodges first, followed by values for a dodge performed orthogonally to the running direction.

Moves that include walldodging can be performed by jumping upwards without moving horizontally and then dodging away from the wall (listed as first value) or by jumping along the wall and dodging 45° away from it in the same direction as the jump. (listed as second value)

Height differences between standing and moving dodges might be an inaccuracy in the jump stats mutator.

==Jump Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |54 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |19 / 20 UU
| style=&quot;text-align: right&quot; |292 / 351 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |126 UU
| style=&quot;text-align: right&quot; |608 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |90 / 91 UU
| style=&quot;text-align: right&quot; |742 / 857 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |149 / 143 UU
| style=&quot;text-align: right&quot; |516 / 965 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |150 / 145 UU
| style=&quot;text-align: right&quot; |787 / 1047 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       455 UU |&gt;         878 UU | |
;| ID          |&gt; 270 / ??? UU |&gt; 1051 / ???? UU | |
;| IJ, DJ      |&gt;       513 UU |&gt;        1104 UU | |
;| ID, DJ      |&gt; 347 / ??? UU |&gt; 1392 / ???? UU | |
;| IJ, DJ, WD  |&gt; 533 / ??? UU |&gt;  861 / ???? UU | |
;| IJ, WD, DJ  |&gt; 513 / ??? UU |&gt; 1139 / ???? UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       302 UU |&gt;        1342 UU | |
;| ID          |&gt; 200 / ??? UU |&gt; 1302 / ???? UU | |
;| IJ, DJ      |&gt;       422 UU |&gt;        1745 UU | |
;| ID, DJ      |&gt; 288 / ??? UU |&gt; 1818 / ???? UU | |
;| J, IWD, DJ  |&gt; 307 / ??? UU |&gt; 1537 / ???? UU | |
;| J, DJ, IWD  |&gt; 353 / ??? UU |&gt; 2004 / ???? UU | |

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |130 UU
| style=&quot;text-align: right&quot; |675 UU
|
|-
|D
| style=&quot;text-align: right&quot; |21 / 21 UU
| style=&quot;text-align: right&quot; |419 / 495 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |279 UU
| style=&quot;text-align: right&quot; |1228 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |170 / 172 UU
| style=&quot;text-align: right&quot; |1333 / 1587 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |303 / 300 UU
| style=&quot;text-align: right&quot; |962 / 1648 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |306 / 301 UU
| style=&quot;text-align: right&quot; |1504 / 1999 UU
|I don't think I pulled the long one off the best way, yet.
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       326 UU |&gt;        1048 UU | |
;| ID          |&gt; 258 / ??? UU |&gt; 1461 / ???? UU | |
;| IJ, DJ      |&gt;       479 UU |&gt;        1571 UU | |
;| ID, DJ      |&gt; 430 / ??? UU |&gt; 2241 / ???? UU | |
;| IJ, DJ, WD  |&gt; 507 / ??? UU |&gt; 1181 / ???? UU | |
;| IJ, WD, DJ  |&gt; 505 / ??? UU |&gt; 1755 / ???? UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       461 UU |&gt;        2392 UU | |
;| ID          |&gt; 171 / ??? UU |&gt; 1642 / ???? UU | |
;| IJ, DJ      |&gt;       451 UU |&gt;        2395 UU | |
;| ID, DJ      |&gt; 369 / ??? UU |&gt; 2728 / ???? UU | |
;| J, IWD, DJ  |&gt; 419 / ??? UU |&gt; 2144 / ???? UU | Could be done way better.
;| J, DJ, IWD  |&gt; 417 / ??? UU |&gt; 2943 / ???? UU | I gave up while testing this one. (was the last thing to test) Values way over 3000 UU are definately possible here.

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5304</id>
      <timestamp>2005-03-17T17:32:47Z</timestamp>
      <contributor>
        <ip>Adsl-64-167-98-224.dsl.snfc21.pacbell.net</ip>
      </contributor>
      <minor/>
      <comment>inserted heading, hope it's correct</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2004|UT2004]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined with the help of the Jump Stats feature in [http://www.koehler-homepage.de/Wormbo/download2k4.html#MD Multi Dodging 2k4 v3] (written by [[Legacy:Wormbo|Wormbo]]), which displays statistics about the distances heights and speeds gained during gameplay. (Make sure you disable everything but the &quot;Gather movement stats&quot; option.)

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)

Moves that include dodging can be performed from standing still or running. Values here list standing dodges first, followed by values for a dodge performed orthogonally to the running direction.

Moves that include walldodging can be performed by jumping upwards without moving horizontally and then dodging away from the wall (listed as first value) or by jumping along the wall and dodging 45° away from it in the same direction as the jump. (listed as second value)

Height differences between standing and moving dodges might be an inaccuracy in the jump stats mutator.

==Jump Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |54 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |19 / 20 UU
| style=&quot;text-align: right&quot; |292 / 351 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |126 UU
| style=&quot;text-align: right&quot; |608 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |90 / 91 UU
| style=&quot;text-align: right&quot; |742 / 857 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |149 / 143 UU
| style=&quot;text-align: right&quot; |516 / 965 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |150 / 145 UU
| style=&quot;text-align: right&quot; |787 / 1047 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       455 UU |&gt;         878 UU | |
;| ID          |&gt; 270 / ??? UU |&gt; 1051 / ???? UU | |
;| IJ, DJ      |&gt;       513 UU |&gt;        1104 UU | |
;| ID, DJ      |&gt; 347 / ??? UU |&gt; 1392 / ???? UU | |
;| IJ, DJ, WD  |&gt; 533 / ??? UU |&gt;  861 / ???? UU | |
;| IJ, WD, DJ  |&gt; 513 / ??? UU |&gt; 1139 / ???? UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       302 UU |&gt;        1342 UU | |
;| ID          |&gt; 200 / ??? UU |&gt; 1302 / ???? UU | |
;| IJ, DJ      |&gt;       422 UU |&gt;        1745 UU | |
;| ID, DJ      |&gt; 288 / ??? UU |&gt; 1818 / ???? UU | |
;| J, IWD, DJ  |&gt; 307 / ??? UU |&gt; 1537 / ???? UU | |
;| J, DJ, IWD  |&gt; 353 / ??? UU |&gt; 2004 / ???? UU | |

==With The Speed Combo ==

===Without Shield Gun ===

{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |'''Move'''
| style=&quot;text-align: center&quot; |'''Height'''
| style=&quot;text-align: center&quot; |'''Distance'''
| style=&quot;text-align: center&quot; |'''Notes''' 
|-
|J
| style=&quot;text-align: right&quot; |130 UU
| style=&quot;text-align: right&quot; |675 UU
|
|-
|D
| style=&quot;text-align: right&quot; |21 / 21 UU
| style=&quot;text-align: right&quot; |419 / 495 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |279 UU
| style=&quot;text-align: right&quot; |1228 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |170 / 172 UU
| style=&quot;text-align: right&quot; |1333 / 1587 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |303 / 300 UU
| style=&quot;text-align: right&quot; |962 / 1648 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |306 / 301 UU
| style=&quot;text-align: right&quot; |1504 / 1999 UU
|I don't think I pulled the long one off the best way, yet.
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       326 UU |&gt;        1048 UU | |
;| ID          |&gt; 258 / ??? UU |&gt; 1461 / ???? UU | |
;| IJ, DJ      |&gt;       479 UU |&gt;        1571 UU | |
;| ID, DJ      |&gt; 430 / ??? UU |&gt; 2241 / ???? UU | |
;| IJ, DJ, WD  |&gt; 507 / ??? UU |&gt; 1181 / ???? UU | |
;| IJ, WD, DJ  |&gt; 505 / ??? UU |&gt; 1755 / ???? UU | |

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
;|^ '''Move''' |^ '''Height''' |^ '''Distance''' |^ '''Notes''' |
;| IJ          |&gt;       461 UU |&gt;        2392 UU | |
;| ID          |&gt; 171 / ??? UU |&gt; 1642 / ???? UU | |
;| IJ, DJ      |&gt;       451 UU |&gt;        2395 UU | |
;| ID, DJ      |&gt; 369 / ??? UU |&gt; 2728 / ???? UU | |
;| J, IWD, DJ  |&gt; 419 / ??? UU |&gt; 2144 / ???? UU | Could be done way better.
;| J, DJ, IWD  |&gt; 417 / ??? UU |&gt; 2943 / ???? UU | I gave up while testing this one. (was the last thing to test) Values way over 3000 UU are definately possible here.

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43349</id>
      <timestamp>2010-05-22T22:07:13Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed table markup</comment>
      <text xml:space="preserve">Distances that the player in [[Legacy:UT2004|UT2004]] can jump or dodge. All units are [[Legacy:UU|UU]].

Many of these have been determined with the help of the Jump Stats feature in [http://www.koehler-homepage.de/Wormbo/unrealwiki.html#MD Multi Dodging 2k4 v3] (written by [[Legacy:Wormbo|Wormbo]]), which displays statistics about the distances heights and speeds gained during gameplay. (Make sure you disable everything but the &quot;Gather movement stats&quot; option.)

==Abbreviations==
;J : Jump from the ground
;D : Dodge from the ground
;DJ : Double Jump
;WD : Wall Dodge
;IJ : Impact Jump
;ID : Impact Dodge (like Impact Jump, but instead of the jump a dodge is performed)
;IWD : Impact Wall Dodge (a wall dodge boosted by the shield gun)

Moves that include dodging can be performed from standing still or running. Values here list standing dodges first, followed by values for a dodge performed orthogonally to the running direction.

Moves that include walldodging can be performed by jumping upwards without moving horizontally and then dodging away from the wall (listed as first value) or by jumping along the wall and dodging 45° away from it in the same direction as the jump. (listed as second value)

Height differences between standing and moving dodges might be an inaccuracy in the jump stats mutator.

==Jump Without Any Modification ==

The following values have been gathered without any speed/jump modifying additions, i.e. default gravity, no adrenaline combos and no physics-altering mutators.

===Without Shield Gun ===

{| class=&quot;wikitable&quot;
|-
! Move !! Height !! Distance !! Notes
|-
|J
| style=&quot;text-align: right&quot; |54 UU
| style=&quot;text-align: right&quot; |315 UU
|
|-
|D
| style=&quot;text-align: right&quot; |19 / 20 UU
| style=&quot;text-align: right&quot; |292 / 351 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |126 UU
| style=&quot;text-align: right&quot; |608 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |90 / 91 UU
| style=&quot;text-align: right&quot; |742 / 857 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |149 / 143 UU
| style=&quot;text-align: right&quot; |516 / 965 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |150 / 145 UU
| style=&quot;text-align: right&quot; |787 / 1047 UU
|
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height
{|
! Move !! Height !! Distance !! Notes
|-
| IJ
| style=&quot;text-align: right&quot; |455 UU
| style=&quot;text-align: right&quot; |878 UU
|
|-
| ID
| style=&quot;text-align: right&quot; |270 / ??? UU
| style=&quot;text-align: right&quot; |1051 / ???? UU
|
|-
| IJ, DJ
| style=&quot;text-align: right&quot; |513 UU
| style=&quot;text-align: right&quot; |1104 UU
|
|-
| ID, DJ
| style=&quot;text-align: right&quot; |347 / ??? UU
| style=&quot;text-align: right&quot; |1392 / ???? UU
|
|-
| IJ, DJ, WD
| style=&quot;text-align: right&quot; |533 / ??? UU
| style=&quot;text-align: right&quot; |861 / ???? UU
|
|-
| IJ, WD, DJ
| style=&quot;text-align: right&quot; |513 / ??? UU
| style=&quot;text-align: right&quot; |1139 / ???? UU
|
|}

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
{|
! Move !! Height !! Distance !! Notes
|-
| IJ
| style=&quot;text-align: right&quot; |302 UU
| style=&quot;text-align: right&quot; |1342 UU
|
|-
| ID
| style=&quot;text-align: right&quot; |200 / ??? UU
| style=&quot;text-align: right&quot; |1302 / ???? UU
|
|-
| IJ, DJ
| style=&quot;text-align: right&quot; |422 UU
| style=&quot;text-align: right&quot; |1745 UU
|
|-
| ID, DJ
| style=&quot;text-align: right&quot; |288 / ??? UU
| style=&quot;text-align: right&quot; |1818 / ???? UU
|
|-
| J, IWD, DJ
| style=&quot;text-align: right&quot; |307 / ??? UU
| style=&quot;text-align: right&quot; |1537 / ???? UU
|
|-
| J, DJ, IWD
| style=&quot;text-align: right&quot; |353 / ??? UU
| style=&quot;text-align: right&quot; |2004 / ???? UU
|
|}

==With The Speed Combo ==

===Without Shield Gun ===

{| class=&quot;wikitable&quot;
|-
! Move !! Height !! Distance !! Notes
|-
|J
| style=&quot;text-align: right&quot; |130 UU
| style=&quot;text-align: right&quot; |675 UU
|
|-
|D
| style=&quot;text-align: right&quot; |21 / 21 UU
| style=&quot;text-align: right&quot; |419 / 495 UU
|
|-
|J, DJ
| style=&quot;text-align: right&quot; |279 UU
| style=&quot;text-align: right&quot; |1228 UU
|
|-
|D, DJ
| style=&quot;text-align: right&quot; |170 / 172 UU
| style=&quot;text-align: right&quot; |1333 / 1587 UU
|
|-
|J, DJ, WD
| style=&quot;text-align: right&quot; |303 / 300 UU
| style=&quot;text-align: right&quot; |962 / 1648 UU
|
|-
|J, WD, DJ
| style=&quot;text-align: right&quot; |306 / 301 UU
| style=&quot;text-align: right&quot; |1504 / 1999 UU
|I don't think I pulled the long one off the best way, yet.
|}

===Shield Gun Jumps ===
; Shield Gun aimed straight down for maximum height :
{|
! Move !! Height !! Distance !! Notes
|-
| IJ
| style=&quot;text-align: right&quot; |326 UU
| style=&quot;text-align: right&quot; |1048 UU
|
|-
| ID
| style=&quot;text-align: right&quot; |258 / ??? UU
| style=&quot;text-align: right&quot; |1461 / ???? UU
|
|-
| IJ, DJ
| style=&quot;text-align: right&quot; |479 UU
| style=&quot;text-align: right&quot; |1571 UU
|
|-
| ID, DJ
| style=&quot;text-align: right&quot; |430 / ??? UU
| style=&quot;text-align: right&quot; |2241 / ???? UU
|
|-
| IJ, DJ, WD
| style=&quot;text-align: right&quot; |507 / ??? UU
| style=&quot;text-align: right&quot; |1181 / ???? UU
|
|-
| IJ, WD, DJ
| style=&quot;text-align: right&quot; |505 / ??? UU
| style=&quot;text-align: right&quot; |1755 / ???? UU
|
|}

; Shield Gun aimed 45° down on ground or at a wall for maximum distance :
{|
! Move !! Height !! Distance !! Notes
|-
| IJ
| style=&quot;text-align: right&quot; |461 UU
| style=&quot;text-align: right&quot; |2392 UU
|
|-
| ID
| style=&quot;text-align: right&quot; |171 / ??? UU
| style=&quot;text-align: right&quot; |1642 / ???? UU
|
|-
| IJ, DJ
| style=&quot;text-align: right&quot; |451 UU
| style=&quot;text-align: right&quot; |2395 UU
|
|-
| ID, DJ
| style=&quot;text-align: right&quot; |369 / ??? UU
| style=&quot;text-align: right&quot; |2728 / ???? UU
|
|-
| J, IWD, DJ
| style=&quot;text-align: right&quot; |419 / ??? UU
| style=&quot;text-align: right&quot; |2144 / ???? UU
| Could be done way better.
|-
| J, DJ, IWD
| style=&quot;text-align: right&quot; |417 / ??? UU
| style=&quot;text-align: right&quot; |2943 / ???? UU
| I gave up while testing this one. (was the last thing to test) Values way over 3000 UU are definately possible here.
|}

==Related Topics ==
* [[Legacy:Movement Metrics (UT)|Movement Metrics (UT)]]
* [[Legacy:Movement Metrics (UT2003)|Movement Metrics (UT2003)]]
* [[Legacy:General Scale And Dimensions|General Scale And Dimensions]]

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mover</title>
    <id>1803</id>
    <revision>
      <id>4424</id>
      <timestamp>2007-12-17T09:43:34Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>movers in UT3</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; Mover (Package: Engine)}}

A [[Legacy:StaticMesh|StaticMesh]] actor that can move between predefined key positions and rotations.

See [[Legacy:Mover (UT)|Mover (UT)]] for the UT version of this class, which uses a [[Legacy:Brush|brush]] instead of a StaticMesh.

In [[Legacy:UT3|UT3]] movers have been replaced by [[Legacy:InterpActor|InterpActor]]s in combination with Kismet for activation control and Matinee for movement path definition.

==Properties==

===Main===
; name AntiPortalTag : Tag of attached [[Legacy:AntiPortalActor|AntiPortalActor]].
; bool bDamageTriggered : Triggered by taking damage  
; bool bDynamicLightMover : Apply dynamic lighting to mover.  
; bool bOscillatingLoop : Goes from 0 up to X then back down to 0  
; byte BrushRaytraceKey : Raytrace the brush here.  
; bool bSlave : This brush is a slave.  
; bool bToggleDirection : If this Mover is in the RotatingMover state, toggle directions between &quot;Triggerings&quot;.
; bool bTriggerOnceOnly : Go dormant after first trigger.  
; name BumpEvent : Optional event to cause when any valid bumper bumps the mover.  
; EBumpType BumpType : Determines what actors can bump-trigger the mover (see declaration for EBumpType below).
; bool bUseShortestRotation : Rot by -90 instead of +270, etc.  If end key was 360 and start key is 0, this means it won't have to rotate at all. 
; bool bUseTriggered : This Mover is Triggered by any Touching player who presses the &quot;Use&quot; key.
; float DamageThreshold : Minimum damage to trigger  
; float DelayTime : Delay before starting to open  
; int EncroachDamage : How much to damage encroached actors.  ''Note: This damage is taken by encroached actors before any &lt;tt&gt;MoverEncroachType&lt;/tt&gt; reaction is applied.''
; byte KeyNum : Current or destination keyframe.  
; EMoverEncroachType MoverEncroachType : Determines how the mover reacts if encroached by another actor (see declaration for EMoverEncroachType below).
; EMoverGlideType MoverGlideType : GlideByTime will interpolate between keys by starting out slow, building speed to the halfway point, then slowing down until stopped at the next key.  MoveByTime will interpolate linearly, at a constant speed between keys.
; float MoveTime : Time to spend moving between keyframes.  
; byte NumKeys : Number of keyframes in total (0-3).  
; float OtherTime : TriggerPound's StayOpenTime.
; name PlayerBumpEvent : Optional event to cause when the player bumps the mover.  
; float StayOpenTime : How long to remain open before closing. ''(unless TriggerPound is used, see OtherTime)''
; byte WorldRaytraceKey : Raytrace the world with the brush here.  

===AI===
; bool bAutoDoor : Automatically setup Door NavigationPoint for this mover  
; bool bNoAIRelevance : Don't warn about this mover during path review  

===MoverEvents===
; name ClosedEvent : Event to cause when closed  
; name ClosingEvent : Event to cause when closing  
; name LoopEvent : Event to cause when the mover loops  
; name OpenedEvent : Event to cause when opened  
; name OpeningEvent : Event to cause when opening  

===MoverSounds===
; sound ClosedSound : When finish closing.  
; sound ClosingSound : When start closing.  
; sound LoopSound : Played on Loop  
; sound MoveAmbientSound : Optional ambient sound when moving.  
; sound OpenedSound : When finished opening.  
; sound OpeningSound : When start opening.  

===ReturnGroup===
; bool bIsLeader : This Mover is the leader of a return group of movers.
; name ReturnGroup : The return group this mover belongs to. All movers in a return group form a [[Legacy:Linked List|linked list]] of &quot;followers&quot; with each mover's &lt;tt&gt;Leader&lt;/tt&gt; pointing to the main mover that should be triggered, bumped, or otherwise activated. The leading mover will tell its &lt;tt&gt;Follower&lt;/tt&gt; to open/close whenever it opens or closes itself. The follower in turn will do the same with its own follower, and so on. Make sure only one mover in a return group is flagged as the leader, otherwise you might experience weird stuff including &quot;Infinite Script Recursion&quot; crashes.

===Hidden===
; KeyRot[24] :  
; KeyPos[24] :  
; array&lt;[[Legacy:AntiPortalActor|AntiPortalActor]]&gt; AntiPortals :  
; vector BasePos :  
; rotator BaseRot :  
; bool bClientPause :  
; bool bDelaying :  
; bool bOpening :  
; bool bPlayerOnly :  
; int ClientUpdate :  
; Mover Follower : Next mover in the [[Legacy:Linked List|linked list]] of movers belonging to a &quot;return group&quot;.
; Mover Leader : The primary mover of a &quot;return group&quot;.
; [[Legacy:NavigationPoint|NavigationPoint]] myMarker :  
; int numTriggerEvents : Number of times triggered ( count down to untrigger )  
; vector OldPos :  
; vector OldPrePivot :  
; rotator OldRot :  
; float PhysRate : Interpolation rate per second.  
; byte PrevKeyNum : Previous keyframe.  
; vector RealPosition :  
; rotator RealRotation :  
; vector SavedPos :  
; rotator SavedRot :  
; [[Legacy:Actor|Actor]] SavedTrigger : The Actor that triggered this Mover.
; vector SimInterpolate :  
; vector SimOldPos :  
; int SimOldRotPitch :  
; int SimOldRotRoll :  
; int SimOldRotYaw :  

==States==
; OpenTimedMover : Master State for OpenTimed mover states (for movers that open and close between two keys)
; StandOpenTimed (extends OpenTimedMover) : Open when stood on, wait, then close.
; BumpOpenTimed (extends OpenTimedMover) : Open when bumped, wait, then close.
; TriggerOpenTimed (extends OpenTimedMover) : When triggered, open, wait, then close.
; LoopMove : When triggered, the mover keeps looping through each of the keys until it gets untriggered.  It will go to the first key after the last key.
; TriggerToggle : Toggle between two keys when triggered.
; TriggerControl : Start opening immediately when Triggered, begin closing immediately if UnTriggered.  Keep a constant speed, which is based on the MoveTime and the distance between the two keys.
; TriggerPound : Can be thought of as acting like the [http://www.twisterdisplay.com/twister/products/easyStriker/index.htm &quot;Ring The Bell&quot;] carnival attraction.  You &quot;pound&quot; (trigger) it to the top (open key) and it will fall back down. (closed key)  When triggered, begin to Open immediately, and if left alone, Open completely and stay open for OtherTime, not StayOpenTime.  If Untriggered, begin to Close immediately, similar to TriggerControl, and as if the &quot;pound&quot; didn't have enough strength to make to the top and ring the bell.  Unlike TriggerControl which keeps a constant speed, TriggerPound will always use the MoveTime no matter where the Mover is between keys.  So, if Triggered while closing or if UnTriggered in the midst of opening, it will reverse direction and move more slowly to the next key. ''(Note: Although the code appears to indicate that a TriggerPound Mover can loop from a fully Closed key after StayOpenTime if more Trigger events have been sent to it than UnTrigger events, it doesn't appear to loop in any situation tested.)''
; TriggerAdvance : (UT200x only?) When Triggered, move toward the Open key.  If UnTriggered, stop moving.
; BumpButton : Open when bumped, close when reset.
; ConstantLoop : Loop this mover from the moment we begin.  It will go to the first key after the last key.
; LeadInOutLooper : A Looping move that goes from 0 to 1 when trigger, loops 1-x then returns to 0 when triggered again.

(For Scripters: Goes to state LeadInOutLooping when triggered and back to LeadInOutLooper when triggered again.)
; RotatingMover : Uses Movement -&gt; RotationRate.  It rotates when triggered and stops rotating when untriggered.  If bToggleDirection is true, it toggles rotation directions when triggered.

==Enums==

===EMoverEncroachType===
; ME_StopWhenEncroach : Stop when the mover hit an actor.
; ME_ReturnWhenEncroach : Return to previous position when the mover hit an actor.
; ME_CrushWhenEncroach : Crush the poor helpless actor.
; ME_IgnoreWhenEncroach : Ignore encroached actors.

===EMoverGlideType===
; MV_MoveByTime : Move linearly; a constant speed determined by the distance between the keys and the MoveTime.
; MV_GlideByTime : Move with smooth acceleration; starting out slow, building speed towards the half way point, then slowing down to a stop at the next key, all within the MoveTime.

===EBumpType===
; BT_PlayerBump : Can only be bumped by player.
; BT_PawnBump : Can be bumped by any [[Legacy:Pawn|Pawn]].
; BT_AnyBump : Can be bumped by any solid actor.

==Known Subclasses==
* [[Legacy:ClientMover|ClientMover]]
* [[Legacy:DamageTriggerMover|DamageTriggerMover]] (custom)
* SuperApe's [[Legacy:VariableTimedMover|VariableTimedMover]] (custom)
* [[Legacy:VitalOverdose/VariableTimedMover|VitalOverdose/VariableTimedMover]] (custom)
* [[JDN:JBMoverDualDestination]] (custom)

==Related Topics==
* The [[Legacy:Mover Topics|Mover Topics]] page
* [[Legacy:Types Of Trigger|Types of Trigger]] and [[Legacy:Event|Event]]

==Discussion==

'''EricBlade:''' A question.  In Land of the Dead (UE 2226, roughly UT2003 base code, it seems), movers do not replicate properly.  I see there is a bunch of code in Mover, ActionableMover, and DestructableMover to accomodate replication, but it all doesn't seem to work.  Would anyone be interested in taking a look at the code, to see if there's something that can be done to fix it without subclassing and reworking every single mover in the entire codebase? 

'''SuperApe:''' From what I know, it seems that the bNoDelete setting is the primary reason for proper Mover replication.  This sets the Mover object itself to replicate to all Clients.  So besides the replication block in Mover, you may need to confirm that your engine version is set up to act the same way in that regard.

'''EricBlade:''' It turns out, that apparently the actual location/rotation of these movers is not replicated properly.. what the effect is, say you have a door that opens and closes.  If the door's normal state is closed, but you open that door .. then another player logs in, they get the door in the original position on their client, even though it is in the open position on the server.  This gives you a door that appears open, but is actually closed.  Except that it's actually appearing in a third position, the exact opposite of it's normal rotation. It's very weird.

'''Xian:''' Well bNoDelete Actors will not be Spawned or Destroyed by the script. It is not responsible for replication DIRECTLY, as is bNetOptional for example, or Role/RemoteRole properties, but apparently the server will delete Server-Side only actors from the Client on game start (not sure if in the PostBeginPlay() session of Engine.GameInfo or earlier. bNoDelete will make the Engine assign the necessary Role/RemoteRole value on Client and Server. Yeah I guess I see what you mean now, you can say it is responsible for replication, but wouldn't say it's the primary reason. You can just as well use bStatic I guess, although apparently Movers don't seem to want it (even though a Brush is bStatic...)

What EricBlade said makes sense, but I am curious how long it takes. I am not that interested in UE2, but in UE1 Timer() is responsible for updating the Client to the Server position, so the first few seconds you join will have a wrong position, although it should be updated later on. Perhaps doing a ClientSetLocation() where you set the position and rotation would be helpful in this case, but I do admit I am too lazy to test, and since I don't have an UE2 dev folder it will be kinda difficult, but I suggest you try it :)

'''SuperApe:''' Thank you for elaborating the long answer for me. :)

'''EricBlade:''' Not to bring up an oldish subject, but I didn't notice there were some answers here.  Although the code for Mover says &quot;Movers default to bNoDelete==true&quot;, that was not the case in my actual code.  I set bNoDelete=true to the Door movers in the game, and now they appear in the right place when you load the level, but then a few moments later, they either completely disappear, or jump to FSM-only-knows where in the world, apparently on the timer when the position is replicated.  Weeeeird.

----

'''Sweavo:''' &quot;Pound Open when triggered.  Pound Closed when untriggered.&quot; what on earth does it mean &quot;to pound&quot;?  There is no other reference to pounding in this context on the wiki

'''Tarquin:''' yeah, the TriggerPound stuff is a mystery

'''Xian:''' Rough skimming tells me that one difference is that there is no [[Legacy:Trigger|Trigger]] notification (i.e. calling EndEvent() on the triggering actor) and that the movement loops. Also, you can see that there is no ''Stop'' command after ''Open'', but there is, however, a ''Sleep'', and there is a ''GoTo'' command after ''Close'' which calls the ''Open'' label (making a looping session). Although I am really lazy to make a test map (or edit one) to check it, to me it seems like once a Mover with this state is triggered it will cause an Open-Close, Open-Close, Open-Close loop &quot;animation&quot;. Considering it belong to UnrealI, I never played it, but I assume one use could be, for example, in a factory, where you have those crushing thingies, f.e. a conveyor belt, and at a point stuff on the belt gets smashed by this, then incinerated or whatever, like a trap-quest, and you'd have to find the right timing to get past it (which explains the name ''Pound''). Just a thought, but if any of you kind people would test, I might get a confirmation :) I'm not sure but these are all assumptions after checking the code.

'''SuperApe:''' Making a test map to test TriggerPound took all of two minutes.  That and after looking through the code more carefully, I think the best way to consider this Mover state is like that of a carinval attraction: &quot;Ring the Bell&quot; or [http://www.twisterdisplay.com/twister/products/easyStriker/index.htm &quot;High Striker&quot;].  This is where you use a large mallet to strike a see-saw to propel a weight up a pole, trying to get it to the top to hit a bell. (thus, &quot;Pound&quot;)  When a Mover set to TriggerPound is triggered, it will Open and Close and stop ''(like you hit the weight hard enough to go to the top, ring the bell and fall back down)''.  If it is Untriggered during this sequence is will begin to Close immediately, like TriggerControl ''(also like if you didn't hit the weight hard enough to go to the top of the pole)''.  Unlike TriggerControl, TriggerPound will use the same MoveTime and alter it's Speed to travel whatever distance it needs to Open when triggered, or to Close when Untriggered.  IOW, TriggerControl will always move at a constant Speed when Opening or Closing, no matter where it is in that movement between the keys, but TriggerPound will move more slowly to the Open key if it is triggered inbetween the keys, as if you added extra force (&quot;pound&quot;) during it's Close movement and you interrupted it's momentum to send it back Open.  TriggerPound uses a method of recording how many Trigger and Untrigger events it recieves.

'''Xian:''' Except that it loops (or should according to the code). What is IOW btw ? Well I am sorry if my description was not 100% accurate (except maybe 15%-20%), but it's better that you tested.

'''SuperApe:''' A Mover set to TriggerPound does not loop.  It works as I describe above.  It was tested as well as confirmed in the code.  IOW = In Other Words.

'''Xian:''' According to this...

&lt;uscript&gt;
Open:
	Disable ('Trigger');
	DoOpen();
	FinishInterpolation();
	FinishedOpening();

	// If the next key frame is not the last, then
	// keep playing back the frames.
	//
	if (Keynum &lt; NumKeys-1) {
		GotoState ('GradualTriggerOpenTimed', 'Open');
	}
Close:
	Disable ('Trigger');
	DoClose();
	FinishInterpolation();
	FinishedClosing();	// throw the current Event, if exists

	if (KeyNum &gt; 0) 		// Still more key-frames to go through
		GotoState ('GradualTriggerOpenTimed', 'Close');

	Sleep(StayOpenTime);
	if( bTriggerOnceOnly )
	{
		AmbientSound = None;
		GotoState('');
	}
	if( SavedTrigger != None )
		goto 'Open';
}
&lt;/uscript&gt;

... it does. At least in theory. As you can see, if the pointer to the SavedTrigger is still there, it loops to Open. Perhaps because it was not triggered using both params (Other and Instigator) it didn't loop in your case, but rest assured, it does loop. :) There are situations of calling Trigger(None,X) (where X is the Instigator) so I am not surprised if it doesn't happen in all cases.

'''SuperApe:''' We're obviously looking at two different versions of code.  In UT200x, a Mover has no &quot;GradualTriggerOpenTimed&quot; state and the only time Trigger() is disabled is after a &lt;tt&gt;bTriggerOnceOnly&lt;/tt&gt; check has been made.  ''(Incidentally, I see minor differences between the code in UT2003 and UT2004 to accomodate a Reset() function, but it behaves the same way in both.)''  I found nothing in the UT200x Mover code that matches the code block you posted.  But regardless, the SavedTrigger is simply allowing the Mover to keep track of multiple Trigger and UnTrigger events sent to it.  When Triggered, SavedTrigger = something, when UnTriggered an equal number of times, SavedTrigger = None.  But that does not seem to allow a fully Closed Mover set to TriggerPound to loop back Open in any case, whether Triggered by a NormalTrigger or via &lt;tt&gt;causeevent&lt;/tt&gt; console command (which gives the Mover more Trigger events than Untrigger events).  The description I state above is based on both my interpretation of the UT200x code ''and'' the results of an empirical test of the Mover state in Ued.  It wasn't a guess or theorem.  Didn't you ''ask'' for a confirmation of your intial assesment?

'''Xian:''' I did :) It was pasted from UT. If you'll check the code there you'll see that, as I pasted, the movement gets looped If the SavedTrigger is still referenced (as we both said via triggering). Unfortunately code changed a lot it seems over versions, though I appologize for the confusion.

'''SuperApe:''' During a long drive, I had time to think about this and I was bothered by the code that seemed to loop, but didn't in my tests.  Then I remembered the weird thing TriggerPound does with the timing properties: OtherTime is used in place of StayOpenTime with TriggerPound, and StayOpenTime is used as shown above, to sleep after the Mover is Closed all the way.  I'm convinced you're right, it must loop.  Although I am not at a machine I can test this, I'll bet I just didn't wait the default 4 seconds after it Closed to see it loop.  However, it should only loop if the Mover was given more Trigger events than Untrigger events, either by &lt;tt&gt;causeevent&lt;/tt&gt; console command, ACTION_TriggerEvent from an AIScript subclass, UseTrigger or the like.  A single NormalTrigger will always give the Mover an equal number of Trigger and Untrigger events, so in that case it would never loop.  I apologize for the confusion.  I think we should be able to refactor this Mover state now.

'''Xian:'''

{{innerbox|However, it should only loop if the Mover was given more Trigger events than Untrigger events

}}

My point exactly :) Yeah np, I must have confused you a bit as well with the code above (forgetting to mention it is UT). Well trial and error is the key :) Hopefully we'll both get to the bottom of this.

'''SuperApe:''' Well, whattaya know.  I did more testing, waited extra long times to be sure, but it actually never loops from the fully Closed key.  Whether you give it more Trigger events than UnTrigger events, or not.  Go figure.  I am a little confused by the code now; it seems like it should loop in some instance, but it never appears to do so.  So, I guess my analogy of the &quot;ring the bell&quot; carnival attraction describes the TriggerPound Mover state the best.

'''Xian:''' OK double checked both UE1 and UE2 and they are the same in the Close session. That is weird indeed. According to the code as long as one SavedTrigger pointer exists (as you said one extra trigger event, which most likely seems to be caused the easiest by CauseEvent) would cause it to loop. I do trust that you did it properly so I am confused as well now... the code makes my analogy correct but the way it works makes yours correct. I think I'll do some testing in UT once I get some free time... &quot;this is too weird for school&quot; as they say :)

'''SuperApe:''' I agree, the way the code makes it look, it is confusing.  On the other hand, to me TriggerPound sounds like the way it is behaving, it sounds like a &quot;ring the bell&quot; attraction.  BTW, it appears that a NormalTrigger is the only way to always get an even number of Trigger and UnTrigger events, but there are several ways a Mover can get just Trigger events along with the &lt;tt&gt;causeevent&lt;/tt&gt; console command: ACTION_TriggerEvent, UseTrigger, other Mover Events, etc.

'''Sweavo:''' wow, great work guys!  All I can offer is &quot;is bTriggerOnceOnly set?&quot;  hope I'm not insulting you but it's all too common to miss something like that when you're too close to the task!  I'm not able to get to the source at the moment to look for myself...

'''SuperApe:''' Not sure what you're asking, Sweavo.  Anyway, this page has been refactored in terms of TriggerPound/TriggerControl (and TriggerAdvance), see above descriptions.  We can probably remove this part of the discussion at least, if everyone is satisfied.

'''Xian:''' He's right. He means that if bTriggerOnceOnly was set then they won't react to other triggering effects. According to the code, if that is set it leaves that state completely. Would you mind testing with and without that var just to see why the code says one thing and the way it behaves is different?

'''Sweavo:''' You are saying &quot;according to the code it should loop, but I don't see it looping&quot;... so I added &quot;the code doesn't loop if bTriggerOnceOnly is set,&quot; as Xian also said just there.  Trouble is, I don't see bTriggerOnceOnly in the default properties for Mover or an of its super- or sub-classes.  Weird.

'''SuperApe:''' My tests were with the default setting &lt;tt&gt;bTriggerOnceOnly=false&lt;/tt&gt;.  &lt;tt&gt;bTriggerOnceOnly=true&lt;/tt&gt; does what you'd expect it to: that is, Trigger (and Untrigger, if Untriggered) once and immediately go to a dormant state no matter what Mover state you're using.  Tests confirmed this.

'''Sweavo:''' OK so that's a blind alley then.  As another aside I wonder why that default doesn't show up in my uscript refernece source tree.

'''SuperApe:''' Booleans are false by default.  There's no need to declare that in defaultproperties.

'''Mychaeel:''' ...unless, of course, you're overriding the default inherited from some superclass (or making sure that you don't accidentally inherit some default other than &lt;code&gt;false&lt;/code&gt;).

'''Xian:''' Unfortunately this is not the case since this is the parent/base class.

'''Kirk:''' Looks like ConstantLoop doesn't honor StayOpenTime :/

[[:Category:Legacy Refactor Me]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4425</id>
      <timestamp>2007-08-10T06:53:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; Mover (Package: Engine)}}

A [[Legacy:StaticMesh|StaticMesh]] actor that can move between predefined key positions and rotations.

See [[Legacy:Mover (UT)|Mover (UT)]] for the UT version of this class, which uses a [[Legacy:Brush|brush]] instead of a StaticMesh.

==Properties==

===Main===
; name AntiPortalTag : Tag of attached [[Legacy:AntiPortalActor|AntiPortalActor]].
; bool bDamageTriggered : Triggered by taking damage  
; bool bDynamicLightMover : Apply dynamic lighting to mover.  
; bool bOscillatingLoop : Goes from 0 up to X then back down to 0  
; byte BrushRaytraceKey : Raytrace the brush here.  
; bool bSlave : This brush is a slave.  
; bool bToggleDirection : If this Mover is in the RotatingMover state, toggle directions between &quot;Triggerings&quot;.
; bool bTriggerOnceOnly : Go dormant after first trigger.  
; name BumpEvent : Optional event to cause when any valid bumper bumps the mover.  
; EBumpType BumpType : Determines what actors can bump-trigger the mover (see declaration for EBumpType below).
; bool bUseShortestRotation : Rot by -90 instead of +270, etc.  If end key was 360 and start key is 0, this means it won't have to rotate at all. 
; bool bUseTriggered : This Mover is Triggered by any Touching player who presses the &quot;Use&quot; key.
; float DamageThreshold : Minimum damage to trigger  
; float DelayTime : Delay before starting to open  
; int EncroachDamage : How much to damage encroached actors.  ''Note: This damage is taken by encroached actors before any &lt;tt&gt;MoverEncroachType&lt;/tt&gt; reaction is applied.''
; byte KeyNum : Current or destination keyframe.  
; EMoverEncroachType MoverEncroachType : Determines how the mover reacts if encroached by another actor (see declaration for EMoverEncroachType below).
; EMoverGlideType MoverGlideType : GlideByTime will interpolate between keys by starting out slow, building speed to the halfway point, then slowing down until stopped at the next key.  MoveByTime will interpolate linearly, at a constant speed between keys.
; float MoveTime : Time to spend moving between keyframes.  
; byte NumKeys : Number of keyframes in total (0-3).  
; float OtherTime : TriggerPound's StayOpenTime.
; name PlayerBumpEvent : Optional event to cause when the player bumps the mover.  
; float StayOpenTime : How long to remain open before closing. ''(unless TriggerPound is used, see OtherTime)''
; byte WorldRaytraceKey : Raytrace the world with the brush here.  

===AI===
; bool bAutoDoor : Automatically setup Door NavigationPoint for this mover  
; bool bNoAIRelevance : Don't warn about this mover during path review  

===MoverEvents===
; name ClosedEvent : Event to cause when closed  
; name ClosingEvent : Event to cause when closing  
; name LoopEvent : Event to cause when the mover loops  
; name OpenedEvent : Event to cause when opened  
; name OpeningEvent : Event to cause when opening  

===MoverSounds===
; sound ClosedSound : When finish closing.  
; sound ClosingSound : When start closing.  
; sound LoopSound : Played on Loop  
; sound MoveAmbientSound : Optional ambient sound when moving.  
; sound OpenedSound : When finished opening.  
; sound OpeningSound : When start opening.  

===ReturnGroup===
; bool bIsLeader : This Mover is the leader of a return group of movers.
; name ReturnGroup : The return group this mover belongs to. All movers in a return group form a [[Legacy:Linked List|linked list]] of &quot;followers&quot; with each mover's &lt;tt&gt;Leader&lt;/tt&gt; pointing to the main mover that should be triggered, bumped, or otherwise activated. The leading mover will tell its &lt;tt&gt;Follower&lt;/tt&gt; to open/close whenever it opens or closes itself. The follower in turn will do the same with its own follower, and so on. Make sure only one mover in a return group is flagged as the leader, otherwise you might experience weird stuff including &quot;Infinite Script Recursion&quot; crashes.

===Hidden===
; KeyRot[24] :  
; KeyPos[24] :  
; array&lt;[[Legacy:AntiPortalActor|AntiPortalActor]]&gt; AntiPortals :  
; vector BasePos :  
; rotator BaseRot :  
; bool bClientPause :  
; bool bDelaying :  
; bool bOpening :  
; bool bPlayerOnly :  
; int ClientUpdate :  
; Mover Follower : Next mover in the [[Legacy:Linked List|linked list]] of movers belonging to a &quot;return group&quot;.
; Mover Leader : The primary mover of a &quot;return group&quot;.
; [[Legacy:NavigationPoint|NavigationPoint]] myMarker :  
; int numTriggerEvents : Number of times triggered ( count down to untrigger )  
; vector OldPos :  
; vector OldPrePivot :  
; rotator OldRot :  
; float PhysRate : Interpolation rate per second.  
; byte PrevKeyNum : Previous keyframe.  
; vector RealPosition :  
; rotator RealRotation :  
; vector SavedPos :  
; rotator SavedRot :  
; [[Legacy:Actor|Actor]] SavedTrigger : The Actor that triggered this Mover.
; vector SimInterpolate :  
; vector SimOldPos :  
; int SimOldRotPitch :  
; int SimOldRotRoll :  
; int SimOldRotYaw :  

==States==
; OpenTimedMover : Master State for OpenTimed mover states (for movers that open and close between two keys)
; StandOpenTimed (extends OpenTimedMover) : Open when stood on, wait, then close.
; BumpOpenTimed (extends OpenTimedMover) : Open when bumped, wait, then close.
; TriggerOpenTimed (extends OpenTimedMover) : When triggered, open, wait, then close.
; LoopMove : When triggered, the mover keeps looping through each of the keys until it gets untriggered.  It will go to the first key after the last key.
; TriggerToggle : Toggle between two keys when triggered.
; TriggerControl : Start opening immediately when Triggered, begin closing immediately if UnTriggered.  Keep a constant speed, which is based on the MoveTime and the distance between the two keys.
; TriggerPound : Can be thought of as acting like the [http://www.twisterdisplay.com/twister/products/easyStriker/index.htm &quot;Ring The Bell&quot;] carnival attraction.  You &quot;pound&quot; (trigger) it to the top (open key) and it will fall back down. (closed key)  When triggered, begin to Open immediately, and if left alone, Open completely and stay open for OtherTime, not StayOpenTime.  If Untriggered, begin to Close immediately, similar to TriggerControl, and as if the &quot;pound&quot; didn't have enough strength to make to the top and ring the bell.  Unlike TriggerControl which keeps a constant speed, TriggerPound will always use the MoveTime no matter where the Mover is between keys.  So, if Triggered while closing or if UnTriggered in the midst of opening, it will reverse direction and move more slowly to the next key. ''(Note: Although the code appears to indicate that a TriggerPound Mover can loop from a fully Closed key after StayOpenTime if more Trigger events have been sent to it than UnTrigger events, it doesn't appear to loop in any situation tested.)''
; TriggerAdvance : (UT200x only?) When Triggered, move toward the Open key.  If UnTriggered, stop moving.
; BumpButton : Open when bumped, close when reset.
; ConstantLoop : Loop this mover from the moment we begin.  It will go to the first key after the last key.
; LeadInOutLooper : A Looping move that goes from 0 to 1 when trigger, loops 1-x then returns to 0 when triggered again.

(For Scripters: Goes to state LeadInOutLooping when triggered and back to LeadInOutLooper when triggered again.)
; RotatingMover : Uses Movement -&gt; RotationRate.  It rotates when triggered and stops rotating when untriggered.  If bToggleDirection is true, it toggles rotation directions when triggered.

==Enums==

===EMoverEncroachType===
; ME_StopWhenEncroach : Stop when the mover hit an actor.
; ME_ReturnWhenEncroach : Return to previous position when the mover hit an actor.
; ME_CrushWhenEncroach : Crush the poor helpless actor.
; ME_IgnoreWhenEncroach : Ignore encroached actors.

===EMoverGlideType===
; MV_MoveByTime : Move linearly; a constant speed determined by the distance between the keys and the MoveTime.
; MV_GlideByTime : Move with smooth acceleration; starting out slow, building speed towards the half way point, then slowing down to a stop at the next key, all within the MoveTime.

===EBumpType===
; BT_PlayerBump : Can only be bumped by player.
; BT_PawnBump : Can be bumped by any [[Legacy:Pawn|Pawn]].
; BT_AnyBump : Can be bumped by any solid actor.

==Known Subclasses==
* [[Legacy:ClientMover|ClientMover]]
* [[Legacy:DamageTriggerMover|DamageTriggerMover]] (custom)
* SuperApe's [[Legacy:VariableTimedMover|VariableTimedMover]] (custom)
* [[Legacy:VitalOverdose/VariableTimedMover|VitalOverdose/VariableTimedMover]] (custom)
* [[JDN:JBMoverDualDestination]] (custom)

==Related Topics==
* The [[Legacy:Mover Topics|Mover Topics]] page
* [[Legacy:Types Of Trigger|Types of Trigger]] and [[Legacy:Event|Event]]

==Discussion==

'''EricBlade:''' A question.  In Land of the Dead (UE 2226, roughly UT2003 base code, it seems), movers do not replicate properly.  I see there is a bunch of code in Mover, ActionableMover, and DestructableMover to accomodate replication, but it all doesn't seem to work.  Would anyone be interested in taking a look at the code, to see if there's something that can be done to fix it without subclassing and reworking every single mover in the entire codebase? 

'''SuperApe:''' From what I know, it seems that the bNoDelete setting is the primary reason for proper Mover replication.  This sets the Mover object itself to replicate to all Clients.  So besides the replication block in Mover, you may need to confirm that your engine version is set up to act the same way in that regard.

'''EricBlade:''' It turns out, that apparently the actual location/rotation of these movers is not replicated properly.. what the effect is, say you have a door that opens and closes.  If the door's normal state is closed, but you open that door .. then another player logs in, they get the door in the original position on their client, even though it is in the open position on the server.  This gives you a door that appears open, but is actually closed.  Except that it's actually appearing in a third position, the exact opposite of it's normal rotation. It's very weird.

'''Xian:''' Well bNoDelete Actors will not be Spawned or Destroyed by the script. It is not responsible for replication DIRECTLY, as is bNetOptional for example, or Role/RemoteRole properties, but apparently the server will delete Server-Side only actors from the Client on game start (not sure if in the PostBeginPlay() session of Engine.GameInfo or earlier. bNoDelete will make the Engine assign the necessary Role/RemoteRole value on Client and Server. Yeah I guess I see what you mean now, you can say it is responsible for replication, but wouldn't say it's the primary reason. You can just as well use bStatic I guess, although apparently Movers don't seem to want it (even though a Brush is bStatic...)

What EricBlade said makes sense, but I am curious how long it takes. I am not that interested in UE2, but in UE1 Timer() is responsible for updating the Client to the Server position, so the first few seconds you join will have a wrong position, although it should be updated later on. Perhaps doing a ClientSetLocation() where you set the position and rotation would be helpful in this case, but I do admit I am too lazy to test, and since I don't have an UE2 dev folder it will be kinda difficult, but I suggest you try it :)

'''SuperApe:''' Thank you for elaborating the long answer for me. :)

'''EricBlade:''' Not to bring up an oldish subject, but I didn't notice there were some answers here.  Although the code for Mover says &quot;Movers default to bNoDelete==true&quot;, that was not the case in my actual code.  I set bNoDelete=true to the Door movers in the game, and now they appear in the right place when you load the level, but then a few moments later, they either completely disappear, or jump to FSM-only-knows where in the world, apparently on the timer when the position is replicated.  Weeeeird.

----

'''Sweavo:''' &quot;Pound Open when triggered.  Pound Closed when untriggered.&quot; what on earth does it mean &quot;to pound&quot;?  There is no other reference to pounding in this context on the wiki

'''Tarquin:''' yeah, the TriggerPound stuff is a mystery

'''Xian:''' Rough skimming tells me that one difference is that there is no [[Legacy:Trigger|Trigger]] notification (i.e. calling EndEvent() on the triggering actor) and that the movement loops. Also, you can see that there is no ''Stop'' command after ''Open'', but there is, however, a ''Sleep'', and there is a ''GoTo'' command after ''Close'' which calls the ''Open'' label (making a looping session). Although I am really lazy to make a test map (or edit one) to check it, to me it seems like once a Mover with this state is triggered it will cause an Open-Close, Open-Close, Open-Close loop &quot;animation&quot;. Considering it belong to UnrealI, I never played it, but I assume one use could be, for example, in a factory, where you have those crushing thingies, f.e. a conveyor belt, and at a point stuff on the belt gets smashed by this, then incinerated or whatever, like a trap-quest, and you'd have to find the right timing to get past it (which explains the name ''Pound''). Just a thought, but if any of you kind people would test, I might get a confirmation :) I'm not sure but these are all assumptions after checking the code.

'''SuperApe:''' Making a test map to test TriggerPound took all of two minutes.  That and after looking through the code more carefully, I think the best way to consider this Mover state is like that of a carinval attraction: &quot;Ring the Bell&quot; or [http://www.twisterdisplay.com/twister/products/easyStriker/index.htm &quot;High Striker&quot;].  This is where you use a large mallet to strike a see-saw to propel a weight up a pole, trying to get it to the top to hit a bell. (thus, &quot;Pound&quot;)  When a Mover set to TriggerPound is triggered, it will Open and Close and stop ''(like you hit the weight hard enough to go to the top, ring the bell and fall back down)''.  If it is Untriggered during this sequence is will begin to Close immediately, like TriggerControl ''(also like if you didn't hit the weight hard enough to go to the top of the pole)''.  Unlike TriggerControl, TriggerPound will use the same MoveTime and alter it's Speed to travel whatever distance it needs to Open when triggered, or to Close when Untriggered.  IOW, TriggerControl will always move at a constant Speed when Opening or Closing, no matter where it is in that movement between the keys, but TriggerPound will move more slowly to the Open key if it is triggered inbetween the keys, as if you added extra force (&quot;pound&quot;) during it's Close movement and you interrupted it's momentum to send it back Open.  TriggerPound uses a method of recording how many Trigger and Untrigger events it recieves.

'''Xian:''' Except that it loops (or should according to the code). What is IOW btw ? Well I am sorry if my description was not 100% accurate (except maybe 15%-20%), but it's better that you tested.

'''SuperApe:''' A Mover set to TriggerPound does not loop.  It works as I describe above.  It was tested as well as confirmed in the code.  IOW = In Other Words.

'''Xian:''' According to this...

&lt;uscript&gt;
Open:
	Disable ('Trigger');
	DoOpen();
	FinishInterpolation();
	FinishedOpening();

	// If the next key frame is not the last, then
	// keep playing back the frames.
	//
	if (Keynum &lt; NumKeys-1) {
		GotoState ('GradualTriggerOpenTimed', 'Open');
	}
Close:
	Disable ('Trigger');
	DoClose();
	FinishInterpolation();
	FinishedClosing();	// throw the current Event, if exists

	if (KeyNum &gt; 0) 		// Still more key-frames to go through
		GotoState ('GradualTriggerOpenTimed', 'Close');

	Sleep(StayOpenTime);
	if( bTriggerOnceOnly )
	{
		AmbientSound = None;
		GotoState('');
	}
	if( SavedTrigger != None )
		goto 'Open';
}
&lt;/uscript&gt;

... it does. At least in theory. As you can see, if the pointer to the SavedTrigger is still there, it loops to Open. Perhaps because it was not triggered using both params (Other and Instigator) it didn't loop in your case, but rest assured, it does loop. :) There are situations of calling Trigger(None,X) (where X is the Instigator) so I am not surprised if it doesn't happen in all cases.

'''SuperApe:''' We're obviously looking at two different versions of code.  In UT200x, a Mover has no &quot;GradualTriggerOpenTimed&quot; state and the only time Trigger() is disabled is after a &lt;tt&gt;bTriggerOnceOnly&lt;/tt&gt; check has been made.  ''(Incidentally, I see minor differences between the code in UT2003 and UT2004 to accomodate a Reset() function, but it behaves the same way in both.)''  I found nothing in the UT200x Mover code that matches the code block you posted.  But regardless, the SavedTrigger is simply allowing the Mover to keep track of multiple Trigger and UnTrigger events sent to it.  When Triggered, SavedTrigger = something, when UnTriggered an equal number of times, SavedTrigger = None.  But that does not seem to allow a fully Closed Mover set to TriggerPound to loop back Open in any case, whether Triggered by a NormalTrigger or via &lt;tt&gt;causeevent&lt;/tt&gt; console command (which gives the Mover more Trigger events than Untrigger events).  The description I state above is based on both my interpretation of the UT200x code ''and'' the results of an empirical test of the Mover state in Ued.  It wasn't a guess or theorem.  Didn't you ''ask'' for a confirmation of your intial assesment?

'''Xian:''' I did :) It was pasted from UT. If you'll check the code there you'll see that, as I pasted, the movement gets looped If the SavedTrigger is still referenced (as we both said via triggering). Unfortunately code changed a lot it seems over versions, though I appologize for the confusion.

'''SuperApe:''' During a long drive, I had time to think about this and I was bothered by the code that seemed to loop, but didn't in my tests.  Then I remembered the weird thing TriggerPound does with the timing properties: OtherTime is used in place of StayOpenTime with TriggerPound, and StayOpenTime is used as shown above, to sleep after the Mover is Closed all the way.  I'm convinced you're right, it must loop.  Although I am not at a machine I can test this, I'll bet I just didn't wait the default 4 seconds after it Closed to see it loop.  However, it should only loop if the Mover was given more Trigger events than Untrigger events, either by &lt;tt&gt;causeevent&lt;/tt&gt; console command, ACTION_TriggerEvent from an AIScript subclass, UseTrigger or the like.  A single NormalTrigger will always give the Mover an equal number of Trigger and Untrigger events, so in that case it would never loop.  I apologize for the confusion.  I think we should be able to refactor this Mover state now.

'''Xian:'''

{{innerbox|However, it should only loop if the Mover was given more Trigger events than Untrigger events

}}

My point exactly :) Yeah np, I must have confused you a bit as well with the code above (forgetting to mention it is UT). Well trial and error is the key :) Hopefully we'll both get to the bottom of this.

'''SuperApe:''' Well, whattaya know.  I did more testing, waited extra long times to be sure, but it actually never loops from the fully Closed key.  Whether you give it more Trigger events than UnTrigger events, or not.  Go figure.  I am a little confused by the code now; it seems like it should loop in some instance, but it never appears to do so.  So, I guess my analogy of the &quot;ring the bell&quot; carnival attraction describes the TriggerPound Mover state the best.

'''Xian:''' OK double checked both UE1 and UE2 and they are the same in the Close session. That is weird indeed. According to the code as long as one SavedTrigger pointer exists (as you said one extra trigger event, which most likely seems to be caused the easiest by CauseEvent) would cause it to loop. I do trust that you did it properly so I am confused as well now... the code makes my analogy correct but the way it works makes yours correct. I think I'll do some testing in UT once I get some free time... &quot;this is too weird for school&quot; as they say :)

'''SuperApe:''' I agree, the way the code makes it look, it is confusing.  On the other hand, to me TriggerPound sounds like the way it is behaving, it sounds like a &quot;ring the bell&quot; attraction.  BTW, it appears that a NormalTrigger is the only way to always get an even number of Trigger and UnTrigger events, but there are several ways a Mover can get just Trigger events along with the &lt;tt&gt;causeevent&lt;/tt&gt; console command: ACTION_TriggerEvent, UseTrigger, other Mover Events, etc.

'''Sweavo:''' wow, great work guys!  All I can offer is &quot;is bTriggerOnceOnly set?&quot;  hope I'm not insulting you but it's all too common to miss something like that when you're too close to the task!  I'm not able to get to the source at the moment to look for myself...

'''SuperApe:''' Not sure what you're asking, Sweavo.  Anyway, this page has been refactored in terms of TriggerPound/TriggerControl (and TriggerAdvance), see above descriptions.  We can probably remove this part of the discussion at least, if everyone is satisfied.

'''Xian:''' He's right. He means that if bTriggerOnceOnly was set then they won't react to other triggering effects. According to the code, if that is set it leaves that state completely. Would you mind testing with and without that var just to see why the code says one thing and the way it behaves is different?

'''Sweavo:''' You are saying &quot;according to the code it should loop, but I don't see it looping&quot;... so I added &quot;the code doesn't loop if bTriggerOnceOnly is set,&quot; as Xian also said just there.  Trouble is, I don't see bTriggerOnceOnly in the default properties for Mover or an of its super- or sub-classes.  Weird.

'''SuperApe:''' My tests were with the default setting &lt;tt&gt;bTriggerOnceOnly=false&lt;/tt&gt;.  &lt;tt&gt;bTriggerOnceOnly=true&lt;/tt&gt; does what you'd expect it to: that is, Trigger (and Untrigger, if Untriggered) once and immediately go to a dormant state no matter what Mover state you're using.  Tests confirmed this.

'''Sweavo:''' OK so that's a blind alley then.  As another aside I wonder why that default doesn't show up in my uscript refernece source tree.

'''SuperApe:''' Booleans are false by default.  There's no need to declare that in defaultproperties.

'''Mychaeel:''' ...unless, of course, you're overriding the default inherited from some superclass (or making sure that you don't accidentally inherit some default other than &lt;code&gt;false&lt;/code&gt;).

'''Xian:''' Unfortunately this is not the case since this is the parent/base class.

[[:Category:Legacy Refactor Me]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4426</id>
      <timestamp>2007-12-16T10:02:31Z</timestamp>
      <contributor>
        <ip>Kirk</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; Mover (Package: Engine)}}

A [[Legacy:StaticMesh|StaticMesh]] actor that can move between predefined key positions and rotations.

See [[Legacy:Mover (UT)|Mover (UT)]] for the UT version of this class, which uses a [[Legacy:Brush|brush]] instead of a StaticMesh.

==Properties==

===Main===
; name AntiPortalTag : Tag of attached [[Legacy:AntiPortalActor|AntiPortalActor]].
; bool bDamageTriggered : Triggered by taking damage  
; bool bDynamicLightMover : Apply dynamic lighting to mover.  
; bool bOscillatingLoop : Goes from 0 up to X then back down to 0  
; byte BrushRaytraceKey : Raytrace the brush here.  
; bool bSlave : This brush is a slave.  
; bool bToggleDirection : If this Mover is in the RotatingMover state, toggle directions between &quot;Triggerings&quot;.
; bool bTriggerOnceOnly : Go dormant after first trigger.  
; name BumpEvent : Optional event to cause when any valid bumper bumps the mover.  
; EBumpType BumpType : Determines what actors can bump-trigger the mover (see declaration for EBumpType below).
; bool bUseShortestRotation : Rot by -90 instead of +270, etc.  If end key was 360 and start key is 0, this means it won't have to rotate at all. 
; bool bUseTriggered : This Mover is Triggered by any Touching player who presses the &quot;Use&quot; key.
; float DamageThreshold : Minimum damage to trigger  
; float DelayTime : Delay before starting to open  
; int EncroachDamage : How much to damage encroached actors.  ''Note: This damage is taken by encroached actors before any &lt;tt&gt;MoverEncroachType&lt;/tt&gt; reaction is applied.''
; byte KeyNum : Current or destination keyframe.  
; EMoverEncroachType MoverEncroachType : Determines how the mover reacts if encroached by another actor (see declaration for EMoverEncroachType below).
; EMoverGlideType MoverGlideType : GlideByTime will interpolate between keys by starting out slow, building speed to the halfway point, then slowing down until stopped at the next key.  MoveByTime will interpolate linearly, at a constant speed between keys.
; float MoveTime : Time to spend moving between keyframes.  
; byte NumKeys : Number of keyframes in total (0-3).  
; float OtherTime : TriggerPound's StayOpenTime.
; name PlayerBumpEvent : Optional event to cause when the player bumps the mover.  
; float StayOpenTime : How long to remain open before closing. ''(unless TriggerPound is used, see OtherTime)''
; byte WorldRaytraceKey : Raytrace the world with the brush here.  

===AI===
; bool bAutoDoor : Automatically setup Door NavigationPoint for this mover  
; bool bNoAIRelevance : Don't warn about this mover during path review  

===MoverEvents===
; name ClosedEvent : Event to cause when closed  
; name ClosingEvent : Event to cause when closing  
; name LoopEvent : Event to cause when the mover loops  
; name OpenedEvent : Event to cause when opened  
; name OpeningEvent : Event to cause when opening  

===MoverSounds===
; sound ClosedSound : When finish closing.  
; sound ClosingSound : When start closing.  
; sound LoopSound : Played on Loop  
; sound MoveAmbientSound : Optional ambient sound when moving.  
; sound OpenedSound : When finished opening.  
; sound OpeningSound : When start opening.  

===ReturnGroup===
; bool bIsLeader : This Mover is the leader of a return group of movers.
; name ReturnGroup : The return group this mover belongs to. All movers in a return group form a [[Legacy:Linked List|linked list]] of &quot;followers&quot; with each mover's &lt;tt&gt;Leader&lt;/tt&gt; pointing to the main mover that should be triggered, bumped, or otherwise activated. The leading mover will tell its &lt;tt&gt;Follower&lt;/tt&gt; to open/close whenever it opens or closes itself. The follower in turn will do the same with its own follower, and so on. Make sure only one mover in a return group is flagged as the leader, otherwise you might experience weird stuff including &quot;Infinite Script Recursion&quot; crashes.

===Hidden===
; KeyRot[24] :  
; KeyPos[24] :  
; array&lt;[[Legacy:AntiPortalActor|AntiPortalActor]]&gt; AntiPortals :  
; vector BasePos :  
; rotator BaseRot :  
; bool bClientPause :  
; bool bDelaying :  
; bool bOpening :  
; bool bPlayerOnly :  
; int ClientUpdate :  
; Mover Follower : Next mover in the [[Legacy:Linked List|linked list]] of movers belonging to a &quot;return group&quot;.
; Mover Leader : The primary mover of a &quot;return group&quot;.
; [[Legacy:NavigationPoint|NavigationPoint]] myMarker :  
; int numTriggerEvents : Number of times triggered ( count down to untrigger )  
; vector OldPos :  
; vector OldPrePivot :  
; rotator OldRot :  
; float PhysRate : Interpolation rate per second.  
; byte PrevKeyNum : Previous keyframe.  
; vector RealPosition :  
; rotator RealRotation :  
; vector SavedPos :  
; rotator SavedRot :  
; [[Legacy:Actor|Actor]] SavedTrigger : The Actor that triggered this Mover.
; vector SimInterpolate :  
; vector SimOldPos :  
; int SimOldRotPitch :  
; int SimOldRotRoll :  
; int SimOldRotYaw :  

==States==
; OpenTimedMover : Master State for OpenTimed mover states (for movers that open and close between two keys)
; StandOpenTimed (extends OpenTimedMover) : Open when stood on, wait, then close.
; BumpOpenTimed (extends OpenTimedMover) : Open when bumped, wait, then close.
; TriggerOpenTimed (extends OpenTimedMover) : When triggered, open, wait, then close.
; LoopMove : When triggered, the mover keeps looping through each of the keys until it gets untriggered.  It will go to the first key after the last key.
; TriggerToggle : Toggle between two keys when triggered.
; TriggerControl : Start opening immediately when Triggered, begin closing immediately if UnTriggered.  Keep a constant speed, which is based on the MoveTime and the distance between the two keys.
; TriggerPound : Can be thought of as acting like the [http://www.twisterdisplay.com/twister/products/easyStriker/index.htm &quot;Ring The Bell&quot;] carnival attraction.  You &quot;pound&quot; (trigger) it to the top (open key) and it will fall back down. (closed key)  When triggered, begin to Open immediately, and if left alone, Open completely and stay open for OtherTime, not StayOpenTime.  If Untriggered, begin to Close immediately, similar to TriggerControl, and as if the &quot;pound&quot; didn't have enough strength to make to the top and ring the bell.  Unlike TriggerControl which keeps a constant speed, TriggerPound will always use the MoveTime no matter where the Mover is between keys.  So, if Triggered while closing or if UnTriggered in the midst of opening, it will reverse direction and move more slowly to the next key. ''(Note: Although the code appears to indicate that a TriggerPound Mover can loop from a fully Closed key after StayOpenTime if more Trigger events have been sent to it than UnTrigger events, it doesn't appear to loop in any situation tested.)''
; TriggerAdvance : (UT200x only?) When Triggered, move toward the Open key.  If UnTriggered, stop moving.
; BumpButton : Open when bumped, close when reset.
; ConstantLoop : Loop this mover from the moment we begin.  It will go to the first key after the last key.
; LeadInOutLooper : A Looping move that goes from 0 to 1 when trigger, loops 1-x then returns to 0 when triggered again.

(For Scripters: Goes to state LeadInOutLooping when triggered and back to LeadInOutLooper when triggered again.)
; RotatingMover : Uses Movement -&gt; RotationRate.  It rotates when triggered and stops rotating when untriggered.  If bToggleDirection is true, it toggles rotation directions when triggered.

==Enums==

===EMoverEncroachType===
; ME_StopWhenEncroach : Stop when the mover hit an actor.
; ME_ReturnWhenEncroach : Return to previous position when the mover hit an actor.
; ME_CrushWhenEncroach : Crush the poor helpless actor.
; ME_IgnoreWhenEncroach : Ignore encroached actors.

===EMoverGlideType===
; MV_MoveByTime : Move linearly; a constant speed determined by the distance between the keys and the MoveTime.
; MV_GlideByTime : Move with smooth acceleration; starting out slow, building speed towards the half way point, then slowing down to a stop at the next key, all within the MoveTime.

===EBumpType===
; BT_PlayerBump : Can only be bumped by player.
; BT_PawnBump : Can be bumped by any [[Legacy:Pawn|Pawn]].
; BT_AnyBump : Can be bumped by any solid actor.

==Known Subclasses==
* [[Legacy:ClientMover|ClientMover]]
* [[Legacy:DamageTriggerMover|DamageTriggerMover]] (custom)
* SuperApe's [[Legacy:VariableTimedMover|VariableTimedMover]] (custom)
* [[Legacy:VitalOverdose/VariableTimedMover|VitalOverdose/VariableTimedMover]] (custom)
* [[JDN:JBMoverDualDestination]] (custom)

==Related Topics==
* The [[Legacy:Mover Topics|Mover Topics]] page
* [[Legacy:Types Of Trigger|Types of Trigger]] and [[Legacy:Event|Event]]

==Discussion==

'''EricBlade:''' A question.  In Land of the Dead (UE 2226, roughly UT2003 base code, it seems), movers do not replicate properly.  I see there is a bunch of code in Mover, ActionableMover, and DestructableMover to accomodate replication, but it all doesn't seem to work.  Would anyone be interested in taking a look at the code, to see if there's something that can be done to fix it without subclassing and reworking every single mover in the entire codebase? 

'''SuperApe:''' From what I know, it seems that the bNoDelete setting is the primary reason for proper Mover replication.  This sets the Mover object itself to replicate to all Clients.  So besides the replication block in Mover, you may need to confirm that your engine version is set up to act the same way in that regard.

'''EricBlade:''' It turns out, that apparently the actual location/rotation of these movers is not replicated properly.. what the effect is, say you have a door that opens and closes.  If the door's normal state is closed, but you open that door .. then another player logs in, they get the door in the original position on their client, even though it is in the open position on the server.  This gives you a door that appears open, but is actually closed.  Except that it's actually appearing in a third position, the exact opposite of it's normal rotation. It's very weird.

'''Xian:''' Well bNoDelete Actors will not be Spawned or Destroyed by the script. It is not responsible for replication DIRECTLY, as is bNetOptional for example, or Role/RemoteRole properties, but apparently the server will delete Server-Side only actors from the Client on game start (not sure if in the PostBeginPlay() session of Engine.GameInfo or earlier. bNoDelete will make the Engine assign the necessary Role/RemoteRole value on Client and Server. Yeah I guess I see what you mean now, you can say it is responsible for replication, but wouldn't say it's the primary reason. You can just as well use bStatic I guess, although apparently Movers don't seem to want it (even though a Brush is bStatic...)

What EricBlade said makes sense, but I am curious how long it takes. I am not that interested in UE2, but in UE1 Timer() is responsible for updating the Client to the Server position, so the first few seconds you join will have a wrong position, although it should be updated later on. Perhaps doing a ClientSetLocation() where you set the position and rotation would be helpful in this case, but I do admit I am too lazy to test, and since I don't have an UE2 dev folder it will be kinda difficult, but I suggest you try it :)

'''SuperApe:''' Thank you for elaborating the long answer for me. :)

'''EricBlade:''' Not to bring up an oldish subject, but I didn't notice there were some answers here.  Although the code for Mover says &quot;Movers default to bNoDelete==true&quot;, that was not the case in my actual code.  I set bNoDelete=true to the Door movers in the game, and now they appear in the right place when you load the level, but then a few moments later, they either completely disappear, or jump to FSM-only-knows where in the world, apparently on the timer when the position is replicated.  Weeeeird.

----

'''Sweavo:''' &quot;Pound Open when triggered.  Pound Closed when untriggered.&quot; what on earth does it mean &quot;to pound&quot;?  There is no other reference to pounding in this context on the wiki

'''Tarquin:''' yeah, the TriggerPound stuff is a mystery

'''Xian:''' Rough skimming tells me that one difference is that there is no [[Legacy:Trigger|Trigger]] notification (i.e. calling EndEvent() on the triggering actor) and that the movement loops. Also, you can see that there is no ''Stop'' command after ''Open'', but there is, however, a ''Sleep'', and there is a ''GoTo'' command after ''Close'' which calls the ''Open'' label (making a looping session). Although I am really lazy to make a test map (or edit one) to check it, to me it seems like once a Mover with this state is triggered it will cause an Open-Close, Open-Close, Open-Close loop &quot;animation&quot;. Considering it belong to UnrealI, I never played it, but I assume one use could be, for example, in a factory, where you have those crushing thingies, f.e. a conveyor belt, and at a point stuff on the belt gets smashed by this, then incinerated or whatever, like a trap-quest, and you'd have to find the right timing to get past it (which explains the name ''Pound''). Just a thought, but if any of you kind people would test, I might get a confirmation :) I'm not sure but these are all assumptions after checking the code.

'''SuperApe:''' Making a test map to test TriggerPound took all of two minutes.  That and after looking through the code more carefully, I think the best way to consider this Mover state is like that of a carinval attraction: &quot;Ring the Bell&quot; or [http://www.twisterdisplay.com/twister/products/easyStriker/index.htm &quot;High Striker&quot;].  This is where you use a large mallet to strike a see-saw to propel a weight up a pole, trying to get it to the top to hit a bell. (thus, &quot;Pound&quot;)  When a Mover set to TriggerPound is triggered, it will Open and Close and stop ''(like you hit the weight hard enough to go to the top, ring the bell and fall back down)''.  If it is Untriggered during this sequence is will begin to Close immediately, like TriggerControl ''(also like if you didn't hit the weight hard enough to go to the top of the pole)''.  Unlike TriggerControl, TriggerPound will use the same MoveTime and alter it's Speed to travel whatever distance it needs to Open when triggered, or to Close when Untriggered.  IOW, TriggerControl will always move at a constant Speed when Opening or Closing, no matter where it is in that movement between the keys, but TriggerPound will move more slowly to the Open key if it is triggered inbetween the keys, as if you added extra force (&quot;pound&quot;) during it's Close movement and you interrupted it's momentum to send it back Open.  TriggerPound uses a method of recording how many Trigger and Untrigger events it recieves.

'''Xian:''' Except that it loops (or should according to the code). What is IOW btw ? Well I am sorry if my description was not 100% accurate (except maybe 15%-20%), but it's better that you tested.

'''SuperApe:''' A Mover set to TriggerPound does not loop.  It works as I describe above.  It was tested as well as confirmed in the code.  IOW = In Other Words.

'''Xian:''' According to this...

&lt;uscript&gt;
Open:
	Disable ('Trigger');
	DoOpen();
	FinishInterpolation();
	FinishedOpening();

	// If the next key frame is not the last, then
	// keep playing back the frames.
	//
	if (Keynum &lt; NumKeys-1) {
		GotoState ('GradualTriggerOpenTimed', 'Open');
	}
Close:
	Disable ('Trigger');
	DoClose();
	FinishInterpolation();
	FinishedClosing();	// throw the current Event, if exists

	if (KeyNum &gt; 0) 		// Still more key-frames to go through
		GotoState ('GradualTriggerOpenTimed', 'Close');

	Sleep(StayOpenTime);
	if( bTriggerOnceOnly )
	{
		AmbientSound = None;
		GotoState('');
	}
	if( SavedTrigger != None )
		goto 'Open';
}
&lt;/uscript&gt;

... it does. At least in theory. As you can see, if the pointer to the SavedTrigger is still there, it loops to Open. Perhaps because it was not triggered using both params (Other and Instigator) it didn't loop in your case, but rest assured, it does loop. :) There are situations of calling Trigger(None,X) (where X is the Instigator) so I am not surprised if it doesn't happen in all cases.

'''SuperApe:''' We're obviously looking at two different versions of code.  In UT200x, a Mover has no &quot;GradualTriggerOpenTimed&quot; state and the only time Trigger() is disabled is after a &lt;tt&gt;bTriggerOnceOnly&lt;/tt&gt; check has been made.  ''(Incidentally, I see minor differences between the code in UT2003 and UT2004 to accomodate a Reset() function, but it behaves the same way in both.)''  I found nothing in the UT200x Mover code that matches the code block you posted.  But regardless, the SavedTrigger is simply allowing the Mover to keep track of multiple Trigger and UnTrigger events sent to it.  When Triggered, SavedTrigger = something, when UnTriggered an equal number of times, SavedTrigger = None.  But that does not seem to allow a fully Closed Mover set to TriggerPound to loop back Open in any case, whether Triggered by a NormalTrigger or via &lt;tt&gt;causeevent&lt;/tt&gt; console command (which gives the Mover more Trigger events than Untrigger events).  The description I state above is based on both my interpretation of the UT200x code ''and'' the results of an empirical test of the Mover state in Ued.  It wasn't a guess or theorem.  Didn't you ''ask'' for a confirmation of your intial assesment?

'''Xian:''' I did :) It was pasted from UT. If you'll check the code there you'll see that, as I pasted, the movement gets looped If the SavedTrigger is still referenced (as we both said via triggering). Unfortunately code changed a lot it seems over versions, though I appologize for the confusion.

'''SuperApe:''' During a long drive, I had time to think about this and I was bothered by the code that seemed to loop, but didn't in my tests.  Then I remembered the weird thing TriggerPound does with the timing properties: OtherTime is used in place of StayOpenTime with TriggerPound, and StayOpenTime is used as shown above, to sleep after the Mover is Closed all the way.  I'm convinced you're right, it must loop.  Although I am not at a machine I can test this, I'll bet I just didn't wait the default 4 seconds after it Closed to see it loop.  However, it should only loop if the Mover was given more Trigger events than Untrigger events, either by &lt;tt&gt;causeevent&lt;/tt&gt; console command, ACTION_TriggerEvent from an AIScript subclass, UseTrigger or the like.  A single NormalTrigger will always give the Mover an equal number of Trigger and Untrigger events, so in that case it would never loop.  I apologize for the confusion.  I think we should be able to refactor this Mover state now.

'''Xian:'''

{{innerbox|However, it should only loop if the Mover was given more Trigger events than Untrigger events

}}

My point exactly :) Yeah np, I must have confused you a bit as well with the code above (forgetting to mention it is UT). Well trial and error is the key :) Hopefully we'll both get to the bottom of this.

'''SuperApe:''' Well, whattaya know.  I did more testing, waited extra long times to be sure, but it actually never loops from the fully Closed key.  Whether you give it more Trigger events than UnTrigger events, or not.  Go figure.  I am a little confused by the code now; it seems like it should loop in some instance, but it never appears to do so.  So, I guess my analogy of the &quot;ring the bell&quot; carnival attraction describes the TriggerPound Mover state the best.

'''Xian:''' OK double checked both UE1 and UE2 and they are the same in the Close session. That is weird indeed. According to the code as long as one SavedTrigger pointer exists (as you said one extra trigger event, which most likely seems to be caused the easiest by CauseEvent) would cause it to loop. I do trust that you did it properly so I am confused as well now... the code makes my analogy correct but the way it works makes yours correct. I think I'll do some testing in UT once I get some free time... &quot;this is too weird for school&quot; as they say :)

'''SuperApe:''' I agree, the way the code makes it look, it is confusing.  On the other hand, to me TriggerPound sounds like the way it is behaving, it sounds like a &quot;ring the bell&quot; attraction.  BTW, it appears that a NormalTrigger is the only way to always get an even number of Trigger and UnTrigger events, but there are several ways a Mover can get just Trigger events along with the &lt;tt&gt;causeevent&lt;/tt&gt; console command: ACTION_TriggerEvent, UseTrigger, other Mover Events, etc.

'''Sweavo:''' wow, great work guys!  All I can offer is &quot;is bTriggerOnceOnly set?&quot;  hope I'm not insulting you but it's all too common to miss something like that when you're too close to the task!  I'm not able to get to the source at the moment to look for myself...

'''SuperApe:''' Not sure what you're asking, Sweavo.  Anyway, this page has been refactored in terms of TriggerPound/TriggerControl (and TriggerAdvance), see above descriptions.  We can probably remove this part of the discussion at least, if everyone is satisfied.

'''Xian:''' He's right. He means that if bTriggerOnceOnly was set then they won't react to other triggering effects. According to the code, if that is set it leaves that state completely. Would you mind testing with and without that var just to see why the code says one thing and the way it behaves is different?

'''Sweavo:''' You are saying &quot;according to the code it should loop, but I don't see it looping&quot;... so I added &quot;the code doesn't loop if bTriggerOnceOnly is set,&quot; as Xian also said just there.  Trouble is, I don't see bTriggerOnceOnly in the default properties for Mover or an of its super- or sub-classes.  Weird.

'''SuperApe:''' My tests were with the default setting &lt;tt&gt;bTriggerOnceOnly=false&lt;/tt&gt;.  &lt;tt&gt;bTriggerOnceOnly=true&lt;/tt&gt; does what you'd expect it to: that is, Trigger (and Untrigger, if Untriggered) once and immediately go to a dormant state no matter what Mover state you're using.  Tests confirmed this.

'''Sweavo:''' OK so that's a blind alley then.  As another aside I wonder why that default doesn't show up in my uscript refernece source tree.

'''SuperApe:''' Booleans are false by default.  There's no need to declare that in defaultproperties.

'''Mychaeel:''' ...unless, of course, you're overriding the default inherited from some superclass (or making sure that you don't accidentally inherit some default other than &lt;code&gt;false&lt;/code&gt;).

'''Xian:''' Unfortunately this is not the case since this is the parent/base class.

'''Kirk:''' Looks like ConstantLoop doesn't honor StayOpenTime :/

[[:Category:Legacy Refactor Me]]

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mover (UT)</title>
    <id>2050</id>
    <revision>
      <id>4997</id>
      <timestamp>2006-04-10T11:01:38Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; Mover  (Package: Engine)}}

(see [[Legacy:Mover|Mover]] for the UT2003 version of this class)

In UT '''Movers''' are brushes that move. They are not part of the [[Legacy:BSP|BSP]], but look as if they are to the player.  Use them to create doors, elevators and other parts of dynamic level geometry. This page describes the class in detail. 

Terminology: A mover is said to &quot;open&quot; when it moves from key 0 to the last defined key (''NumKeys-1'' for the technically-minded). Movement in the opposite direction is called &quot;closing&quot;. Some subclasses of mover have the ability to open partially.

==Properties==

===Mover Group===
; bool bDamageTriggered : The mover is triggered by taking damage. Use for doors that open when you shoot then, for example.
; bool bDynamicLightMover : Setting this to True will cause the mover to change the way it is lit as it moves. This is very useful when a mover is going between areas with different brightnesses or colors of light. Note that BrushRayTraceKey is unused if the mover is dynamically lit.&lt;br /&gt;The process isn't perfect by any means, and often has dirty shadows and flickering between different lightings on the brush. However, it does eliminate the annoying black patches on the undersides of lifts and the sides of doors. In addition this takes quite a bit more CPU power than normal. Use this only in areas where it is needed to make the mover look decent and processing power can be spared.
; byte BrushRaytraceKey (const) : This should be set to the number of a keyframe. When the map's lighting is rebuilt, the polys of the mover will always be lit as if it is in this position. (Naturally, this property is irrelevant if you have bDynamicLightMover = True.)
; bool bSlave : This mover is a slave. It will follow another mover. See [[Legacy:Compound Movers|Compound Movers]].
; bool bTriggerOnceOnly : Go dormant after first trigger. Note that this doesn't work for all states (see ''Mover States'' below).
; name BumpEvent : The name of an [[Legacy:Event|event]] to fire when any something bumps this mover. This allows you to have movers that can be either triggered or bumped: you have the BumpEvent trigger the mover's own Tag.
; EBumpType BumpType : Determines what sort of things are counted as bumping this mover. Other things that bump it will be ignored.
; bool bUseTriggered : This mover will be triggered by player grab.
; float DamageThreshold : Minimum damage to trigger. Works with bDamageTriggered.
; float DelayTime : Delay before starting to open.
; int EncroachDamage : How much to damage encroached actors.
; byte KeyNum : The number of the key that the mover is curently set to. Using the [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Key command is the same as changing this value. See [[Legacy:Keyframe|Keyframe]] for more on this.
; EMoverEncroachType MoverEncroachType : Tells the mover what to do when it hits an actor while trying to move. For example, when a lift returns to the low position and hits a player's head. (see ''EMoverEncroachType'' enum below)
; EMoverGlideType MoverGlideType : How the mover moves from one position to another. (see ''EMoverGlideType'' enum below)
; float MoveTime : Time to spend moving between keyframes.
; byte NumKeys (const) : This is the number of different positions (known as ''keys'') that the mover has. The maximum possible value seems to be 64.
; float OtherTime : TriggerPound stay-open time.
; name PlayerBumpEvent : Optional event to cause when the player bumps the mover.
; name ReturnGroup : if none, same as tag
; float StayOpenTime : How long to remain open before closing.
; byte WorldRaytraceKey (const) : Set this to the number of the key you want the mover to affect the world at. Basically, whatever you set this to is where the mover will block light. A neat trick you can do with this property is to set it to an unused key which you have positioned somewhere outside your map. That way the mover will not cast a shadow at all. This can alleviate the annoying problem of black patches underneath movers.

===MoverSounds Group ===

The properties in this section set the sounds played by the mover as it travels.
; Sound ClosedSound : When finish closing.
; Sound ClosingSound : When start closing.
; Sound MoveAmbientSound : Optional ambient sound when moving.
; Sound OpenedSound : When finished opening.
; Sound OpeningSound : When start opening.

The sounds in UT packages like DoorsMod are designed with this system in mind, and are usually found in sets of 3, eg &quot;md2start&quot;, &quot;md2loop&quot;, &quot;md2end&quot;. Use start sounds with Opening, end sounds with Opened and loop with ambient.

Only MoveAmbientSound is affected by the value of Sounds -&gt; SoundVolume. The others play at full volume. (Some scripting would probably fix this for a custom class, since the Mover calls PlaySound, and this has an optional volume parameter.)

===UnrealScript-Only Properties===
; byte PrevKeyNum : Previous keyframe.
; [[Legacy:Actor (UT)|Actor (UT)]] SavedTrigger : Who we were triggered by.
; int numTriggerEvents : Number of times triggered (count down to untrigger)
; Mover Leader
; Mover Follower : For having multiple movers return together. (see [[Legacy:Compound Movers|Compound Movers]])
; vector KeyPos[8] : 
; rotator KeyRot[8] : 
; vector BasePos, OldPos, OldPrePivot, SavedPos : 
; rotator BaseRot, OldRot, SavedRot : 
; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] myMarker : 
; [[Legacy:Actor (UT)|Actor (UT)]] TriggerActor : 
; [[Legacy:Actor (UT)|Actor (UT)]] TriggerActor2 : 
; [[Legacy:Pawn (UT)|Pawn (UT)]] WaitingPawn : 
; bool bOpening, bDelaying, bClientPause : 
; bool bPlayerOnly : 
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : 
; vector SimOldPos : 
; int SimOldRotPitch, SimOldRotYaw, SimOldRotRoll : 
; vector SimInterpolate : 
; vector RealPosition : 
; rotator RealRotation : 
; int ClientUpdate : 

==Enums ==

===EMoverEncroachType ===
; ME_StopWhenEncroach : Stop when we hit an actor.
; ME_ReturnWhenEncroach : Return to previous position when we hit an actor.
; ME_CrushWhenEncroach : Crush the poor helpless actor.
; ME_IgnoreWhenEncroach : Ignore encroached actors.

===EMoverGlideType ===
; MV_MoveByTime : Move linearly.
; MV_GlideByTime : Move with smooth acceleration.

===EBumpType ===
; BT_PlayerBump : Can only be bumped by player.
; BT_PawnBump : Can be bumped by any pawn.
; BT_AnyBump : Cany be bumped by any solid actor.

==States==

The mover states, set in the [[Legacy:InitialState|InitialState]] property determine:
* how the mover is activated
* how it behaves once it has been activated

Note that other settings affect activation behavior too:
* the BumpType property affects ''who'' can activate it 
* bDamageTriggered .....
* bUseTriggered ....

The &quot;OpenTimed&quot; states open the mover (from key 0 to the last key), wait then close and sleep again. Only the states with &quot;Trigger&quot; in the name respond to triggering.

;None: The mover will not move through its keys, unless it is a slave.

;BumpButton: 
This is very similar to BumpOpenTimed, but designed to be used for a button which controls another mover which is set to TriggerOpenTimed (a door, for example). 

Use the button mover's '''BumpEvent''' property to tie it to the door mover's Events -&gt; Tag. When the button is bumped, it moves and so does the door. The button is then frozen, and it will only return when the door has successfully closed. This is pretty much just a nice cosmetic touch: the button won't return until it can be used again.

In brief:

* The button mover's StayOpenTime is ignored. 
* If the door is prevented from closing (by a player, say), the button will not return
* Once the door mover has finished closing, the button mover is closed.


;BumpOpenTimed: The mover reacts to being touched. Set '''BumpType''' to determine what counts as touching it. Used for buttons (though see BumpButton for special cases). Can be used for doors, although TriggerControl is better.

;StandOpenTimed: The mover reacts when the engine detects a player has stood on it. Used for lifts.

;TriggerControl: 
The mover opens while the trigger is active, and closes when unTriggered &amp;ndash; ie if set up with a simple Trigger actor, as soon as the player steps out from the Trigger's radius the mover will start closing again. 

Example: the door to the redeemer area in UT's DM-StalwartXL and CTF-Gauntlet. (note to anyone reading this: the [[Legacy:Event|Event]] page needs to explain that events can last for a duration, as in this case &amp;ndash; there's an UnTrigger function too when a player steps out of a Trigger actor's radius.)


;TriggerOpenTimed: When triggered, the mover opens fully, waits and closes again. For related topics on triggering see the links section below.

;TriggerPound:
Similar to TriggerControl, but used for movers that open and close continuously. As soon as the corresponding trigger is activated, a mover using this state will begin the following cycle:

# Opens as usual, with its speed determined by the MoveTime property.
# Pauses for a time equal to the OtherTime property.
# Closes as usual, with its speed determined by the MoveTime property.
# Pauses for a time equal to the StayOpenTime property.

The mover loops through these actions until whatever activated the trigger leaves the trigger's collision area. When this happens, the mover immediately closes and remains at rest until triggered again.


;TriggerToggle: The mover will open when triggered and stop at the open position (the last keyframe). The next time it is triggered, it will close, and so on. Note that bTriggerOnceOnly has no effect in this state.

==Discussion==

'''Xian:''' while trying to see how I can misuse brushes in a better and more efficient way since I don't like the way Epic coded UT as a whole, I found this code in Engine.Mover.FindTriggerActor():

&lt;uscript&gt;
	ForEach AllActors(class 'Actor', A)
		if ( (A.Event == Tag) &amp;&amp; (A.IsA('Trigger') || A.IsA('Mover')) )
		{
			if ( A.IsA('Counter') || A.IsA('Pawn') )
			{
				bPlayerOnly = true;
				return; //FIXME - handle counters
			}
                      [...]
		}
&lt;/uscript&gt;

How can a Trigger/Mover be a Pawn ? This seems like a nice logical error. Although the consequences may not be huge (since altogether the main triggering mechanism is done by movers/trigger classes), I just don't see how they could miss this... although it is trivial, check the next part:

&lt;uscript&gt;
	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
&lt;/uscript&gt;

My guess is the correct version is: 

&lt;uscript&gt;
	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
                // Xian correction: TriggerActor to TriggerActor2 :)
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor2).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
&lt;/uscript&gt;

Again the code as a whole works, but let's face it, the rule of ''ntars'' should NOT apply here and this SHOULD be fixed imo. Perhaps people who wish to take advantage of custom Mover classes which are dependant on Triggers and TriggerActor(2) pointers should rewrite this function to fix it accordingly. Any thoughts ?

'''Graphik:''' I understand the trivial bit, but unfortunately not the useful part. I mean, I'm assuming there is one.

'''Xian:''' In my opinon, the code needs a lot of optimization and checks (for example in most parts it does iterations to all Actors with their Event matching the current Tag, while proper way of doing it, is to check if the Actor has an Event set, but most importantly to not iterate at all if there is no Tag set; true it does it only in PBP, but still). This was just a code-related discussion, and I assumed coders that would create custom Movers for UT would find this interesting. If you want a useful side of it, let me put it this way: assuming I am right (and to me it looks like I am), I have yet to see a correction of logical errors which is not useful :)

'''Graphik:''' OK cool.

'''Xian:''' ok so an optimized version imo:

&lt;uscript&gt;
function FindTriggerActor()
{
	local Actor A;

	TriggerActor = None;
	TriggerActor2 = None;

        // Xian: if there is no tag at all, why bother ?
        if (Tag == '')
             return;

	foreach AllActors(class 'Actor', A)
		if ((A.Event != '') &amp;&amp; (A.Event == Tag) &amp;&amp; (A.IsA('Trigger') || A.IsA('Mover')) )
		{
			if ( A.IsA('Counter') )
			{
				bPlayerOnly = true;
				return; //FIXME - handle counters
			}
			if (TriggerActor == None)
				TriggerActor = A;
			else if ( TriggerActor2 == None )
				TriggerActor2 = A;
		}

	if ( TriggerActor == None )
	{
		bPlayerOnly = (BumpType == BT_PlayerBump);
		return;
	}

	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
                // Xian: fixed TriggerActor to TriggerActor2
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor2).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
}
&lt;/uscript&gt;

&lt;uscript&gt;
function PostBeginPlay()
{
	local mover M;

	//brushes can't be deleted, so if not relevant, make it invisible and non-colliding
	if ( !Level.Game.IsRelevant(self) )
	{
		SetCollision(false, false, false);
                bCollideWorld = False;  // Xian: :)
		SetLocation(Location + vect(0,0,20000)); // temp since still in bsp
		bHidden = true;
	}
	else
	{
		FindTriggerActor();
		// Initialize all slaves.
		if( !bSlave &amp;&amp; (Tag != '')) )    // Xian: tag check
		{
			foreach AllActors( class 'Mover', M, Tag )
			{
				if( M.bSlave )
				{
					M.GotoState('');
					M.SetBase( Self );
				}
			}
		}
		if ( Leader == None )
		{	
			Leader = self;

			if (ReturnGroup != '')   // Xian: tag check again
			{
				foreach AllActors( class'Mover', M )
				{
					if ( (M != self) &amp;&amp; (M.ReturnGroup == ReturnGroup) )
					{
						M.Leader = self;
						M.Follower = Follower;
						Follower = M;
					}
				}
			}
		}
	}
}
&lt;/uscript&gt;

&lt;uscript&gt;
function FinishNotify()
{
	local Pawn P;

	if (WaitingPawn == None)
		return;			// Xian: don't iterate unless needed

// Note: this does kinda upsets the blanace of Bot decission in case they assigned the current
// instance of the Mover as their special destination, but in most cases it's all about online play; 
// although this is not something I recommend for UT as a whole, these changes should help for 
// player-only mods that require online gameplay and is made for informative purposes

	if ( StandingCount &gt; 0 )
		for ( P=Level.PawnList; P!=None; P=P.nextPawn )
			if ( P.Base == self)
			{
// Xian: is it even relevant to execute code for players since they're aware of mover states ?
				if (P.IsA('Bot'))
				{
					P.StopWaiting();

					if ( (P.SpecialGoal == self) || (P.SpecialGoal == myMarker) )
						P.SpecialGoal = None; 
				}

				if ( P == WaitingPawn )
					WaitingPawn = None;
			}

	if ( WaitingPawn != None )
	{
		if (WaitingPawn.IsA('Bot'))
		{
			WaitingPawn.StopWaiting();
			if ( (WaitingPawn.SpecialGoal == self) || (WaitingPawn.SpecialGoal == myMarker) )
				WaitingPawn.SpecialGoal = None; 
		}

		WaitingPawn = None;
	}
}
&lt;/uscript&gt;

This is how it should all be in my opinion :) The code should execute faster. Not tested but in theory, it should be better.

==Subclasses==
* [[Legacy:Types Of Mover|Types of Mover]] is a quick overview of the different classes of mover 
* [[Legacy:AssertMover|AssertMover]]
* [[Legacy:AttachMover|AttachMover]]
* [[Legacy:ElevatorMover|ElevatorMover]]
* [[Legacy:GradualMover|GradualMover]]
* [[Legacy:LoopMover|LoopMover]]
* [[Legacy:MixMover|MixMover]]
* [[Legacy:RotatingMover|RotatingMover]]
* [[Legacy:FixedMover|FixedMover]] &amp;ndash; custom class that fixes network bugs with movers than rotate in the process of opening or closing

It's possible to change the class of a mover after it's been created, but it requires [[Legacy:Brush Hacking|Brush Hacking]].

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]] is the hub for all related articles &amp; tutorials on making specific movers
* [[Legacy:Types Of Trigger|Types of Trigger]]
* [[Legacy:Event|Event]]

==Mover Tutorials==
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]
* [[Legacy:Activating A Mover|Activating a Mover]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4998</id>
      <timestamp>2006-04-10T02:36:38Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; Mover  (Package: Engine)}}

(see [[Legacy:Mover|Mover]] for the UT2003 version of this class)

In UT '''Movers''' are brushes that move. They are not part of the [[Legacy:BSP|BSP]], but look as if they are to the player.  Use them to create doors, elevators and other parts of dynamic level geometry. This page describes the class in detail. 

Terminology: A mover is said to &quot;open&quot; when it moves from key 0 to the last defined key (''NumKeys-1'' for the technically-minded). Movement in the opposite direction is called &quot;closing&quot;. Some subclasses of mover have the ability to open partially.

==Properties==

===Mover Group===
; bool bDamageTriggered : The mover is triggered by taking damage. Use for doors that open when you shoot then, for example.
; bool bDynamicLightMover : Setting this to True will cause the mover to change the way it is lit as it moves. This is very useful when a mover is going between areas with different brightnesses or colors of light. Note that BrushRayTraceKey is unused if the mover is dynamically lit.&lt;br /&gt;The process isn't perfect by any means, and often has dirty shadows and flickering between different lightings on the brush. However, it does eliminate the annoying black patches on the undersides of lifts and the sides of doors. In addition this takes quite a bit more CPU power than normal. Use this only in areas where it is needed to make the mover look decent and processing power can be spared.
; byte BrushRaytraceKey (const) : This should be set to the number of a keyframe. When the map's lighting is rebuilt, the polys of the mover will always be lit as if it is in this position. (Naturally, this property is irrelevant if you have bDynamicLightMover = True.)
; bool bSlave : This mover is a slave. It will follow another mover. See [[Legacy:Compound Movers|Compound Movers]].
; bool bTriggerOnceOnly : Go dormant after first trigger. Note that this doesn't work for all states (see ''Mover States'' below).
; name BumpEvent : The name of an [[Legacy:Event|event]] to fire when any something bumps this mover. This allows you to have movers that can be either triggered or bumped: you have the BumpEvent trigger the mover's own Tag.
; EBumpType BumpType : Determines what sort of things are counted as bumping this mover. Other things that bump it will be ignored.
; bool bUseTriggered : This mover will be triggered by player grab.
; float DamageThreshold : Minimum damage to trigger. Works with bDamageTriggered.
; float DelayTime : Delay before starting to open.
; int EncroachDamage : How much to damage encroached actors.
; byte KeyNum : The number of the key that the mover is curently set to. Using the [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Key command is the same as changing this value. See [[Legacy:Keyframe|Keyframe]] for more on this.
; EMoverEncroachType MoverEncroachType : Tells the mover what to do when it hits an actor while trying to move. For example, when a lift returns to the low position and hits a player's head. (see ''EMoverEncroachType'' enum below)
; EMoverGlideType MoverGlideType : How the mover moves from one position to another. (see ''EMoverGlideType'' enum below)
; float MoveTime : Time to spend moving between keyframes.
; byte NumKeys (const) : This is the number of different positions (known as ''keys'') that the mover has. The maximum possible value seems to be 64.
; float OtherTime : TriggerPound stay-open time.
; name PlayerBumpEvent : Optional event to cause when the player bumps the mover.
; name ReturnGroup : if none, same as tag
; float StayOpenTime : How long to remain open before closing.
; byte WorldRaytraceKey (const) : Set this to the number of the key you want the mover to affect the world at. Basically, whatever you set this to is where the mover will block light. A neat trick you can do with this property is to set it to an unused key which you have positioned somewhere outside your map. That way the mover will not cast a shadow at all. This can alleviate the annoying problem of black patches underneath movers.

===MoverSounds Group ===

The properties in this section set the sounds played by the mover as it travels.
; Sound ClosedSound : When finish closing.
; Sound ClosingSound : When start closing.
; Sound MoveAmbientSound : Optional ambient sound when moving.
; Sound OpenedSound : When finished opening.
; Sound OpeningSound : When start opening.

The sounds in UT packages like DoorsMod are designed with this system in mind, and are usually found in sets of 3, eg &quot;md2start&quot;, &quot;md2loop&quot;, &quot;md2end&quot;. Use start sounds with Opening, end sounds with Opened and loop with ambient.

Only MoveAmbientSound is affected by the value of Sounds -&gt; SoundVolume. The others play at full volume. (Some scripting would probably fix this for a custom class, since the Mover calls PlaySound, and this has an optional volume parameter.)

===UnrealScript-Only Properties===
; byte PrevKeyNum : Previous keyframe.
; [[Legacy:Actor (UT)|Actor (UT)]] SavedTrigger : Who we were triggered by.
; int numTriggerEvents : Number of times triggered (count down to untrigger)
; Mover Leader
; Mover Follower : For having multiple movers return together. (see [[Legacy:Compound Movers|Compound Movers]])
; vector KeyPos[8] : 
; rotator KeyRot[8] : 
; vector BasePos, OldPos, OldPrePivot, SavedPos : 
; rotator BaseRot, OldRot, SavedRot : 
; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] myMarker : 
; [[Legacy:Actor (UT)|Actor (UT)]] TriggerActor : 
; [[Legacy:Actor (UT)|Actor (UT)]] TriggerActor2 : 
; [[Legacy:Pawn (UT)|Pawn (UT)]] WaitingPawn : 
; bool bOpening, bDelaying, bClientPause : 
; bool bPlayerOnly : 
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : 
; vector SimOldPos : 
; int SimOldRotPitch, SimOldRotYaw, SimOldRotRoll : 
; vector SimInterpolate : 
; vector RealPosition : 
; rotator RealRotation : 
; int ClientUpdate : 

==Enums ==

===EMoverEncroachType ===
; ME_StopWhenEncroach : Stop when we hit an actor.
; ME_ReturnWhenEncroach : Return to previous position when we hit an actor.
; ME_CrushWhenEncroach : Crush the poor helpless actor.
; ME_IgnoreWhenEncroach : Ignore encroached actors.

===EMoverGlideType ===
; MV_MoveByTime : Move linearly.
; MV_GlideByTime : Move with smooth acceleration.

===EBumpType ===
; BT_PlayerBump : Can only be bumped by player.
; BT_PawnBump : Can be bumped by any pawn.
; BT_AnyBump : Cany be bumped by any solid actor.

==States==

The mover states, set in the [[Legacy:InitialState|InitialState]] property determine:
* how the mover is activated
* how it behaves once it has been activated

Note that other settings affect activation behavior too:
* the BumpType property affects ''who'' can activate it 
* bDamageTriggered .....
* bUseTriggered ....

The &quot;OpenTimed&quot; states open the mover (from key 0 to the last key), wait then close and sleep again. Only the states with &quot;Trigger&quot; in the name respond to triggering.

;None: The mover will not move through its keys, unless it is a slave.

;BumpButton: 
This is very similar to BumpOpenTimed, but designed to be used for a button which controls another mover which is set to TriggerOpenTimed (a door, for example). 

Use the button mover's '''BumpEvent''' property to tie it to the door mover's Events -&gt; Tag. When the button is bumped, it moves and so does the door. The button is then frozen, and it will only return when the door has successfully closed. This is pretty much just a nice cosmetic touch: the button won't return until it can be used again.

In brief:

* The button mover's StayOpenTime is ignored. 
* If the door is prevented from closing (by a player, say), the button will not return
* Once the door mover has finished closing, the button mover is closed.


;BumpOpenTimed: The mover reacts to being touched. Set '''BumpType''' to determine what counts as touching it. Used for buttons (though see BumpButton for special cases). Can be used for doors, although TriggerControl is better.

;StandOpenTimed: The mover reacts when the engine detects a player has stood on it. Used for lifts.

;TriggerControl: 
The mover opens while the trigger is active, and closes when unTriggered &amp;ndash; ie if set up with a simple Trigger actor, as soon as the player steps out from the Trigger's radius the mover will start closing again. 

Example: the door to the redeemer area in UT's DM-StalwartXL and CTF-Gauntlet. (note to anyone reading this: the [[Legacy:Event|Event]] page needs to explain that events can last for a duration, as in this case &amp;ndash; there's an UnTrigger function too when a player steps out of a Trigger actor's radius.)


;TriggerOpenTimed: When triggered, the mover opens fully, waits and closes again. For related topics on triggering see the links section below.

;TriggerPound:
Similar to TriggerControl, but used for movers that open and close continuously. As soon as the corresponding trigger is activated, a mover using this state will begin the following cycle:

# Opens as usual, with its speed determined by the MoveTime property.
# Pauses for a time equal to the OtherTime property.
# Closes as usual, with its speed determined by the MoveTime property.
# Pauses for a time equal to the StayOpenTime property.

The mover loops through these actions until whatever activated the trigger leaves the trigger's collision area. When this happens, the mover immediately closes and remains at rest until triggered again.


;TriggerToggle: The mover will open when triggered and stop at the open position (the last keyframe). The next time it is triggered, it will close, and so on. Note that bTriggerOnceOnly has no effect in this state.

==Discussion==

'''Xian:''' while trying to see how I can misuse brushes in a better and more efficient way since I don't like the way Epic coded UT as a whole, I found this code in Engine.Mover.FindTriggerActor():

&lt;uscript&gt;
	ForEach AllActors(class 'Actor', A)
		if ( (A.Event == Tag) &amp;&amp; (A.IsA('Trigger') || A.IsA('Mover')) )
		{
			if ( A.IsA('Counter') || A.IsA('Pawn') )
			{
				bPlayerOnly = true;
				return; //FIXME - handle counters
			}
                      [...]
		}
&lt;/uscript&gt;

How can a Trigger/Mover be a Pawn ? This seems like a nice logical error. Although the consequences may not be huge (since altogether the main triggering mechanism is done by movers/trigger classes), I just don't see how they could miss this... although it is trivial, check the next part:

&lt;uscript&gt;
	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
&lt;/uscript&gt;

My guess is the correct version is: 

&lt;uscript&gt;
	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
                // Xian correction: TriggerActor to TriggerActor2 :)
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor2).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
&lt;/uscript&gt;

Again the code as a whole works, but let's face it, the rule of ''ntars'' should NOT apply here and this SHOULD be fixed imo. Perhaps people who wish to take advantage of custom Mover classes which are dependant on Triggers and TriggerActor(2) pointers should rewrite this function to fix it accordingly. Any thoughts ?

'''Graphik:''' I understand the trivial bit, but unfortunately not the useful part. I mean, I'm assuming there is one.

'''Xian:''' In my opinon, the code needs a lot of optimization and checks (for example in most parts it does iterations to all Actors with their Event matching the current Tag, while proper way of doing it, is to check if the Actor has an Event set, but most importantly to not iterate at all if there is no Tag set; true it does it only in PBP, but still). This was just a code-related discussion, and I assumed coders that would create custom Movers for UT would find this interesting. If you want a useful side of it, let me put it this way: assuming I am right (and to me it looks like I am), I have yet to see a correction of logical errors which is not useful :)

'''Graphik:''' OK cool.

==Subclasses==
* [[Legacy:Types Of Mover|Types of Mover]] is a quick overview of the different classes of mover 
* [[Legacy:AssertMover|AssertMover]]
* [[Legacy:AttachMover|AttachMover]]
* [[Legacy:ElevatorMover|ElevatorMover]]
* [[Legacy:GradualMover|GradualMover]]
* [[Legacy:LoopMover|LoopMover]]
* [[Legacy:MixMover|MixMover]]
* [[Legacy:RotatingMover|RotatingMover]]
* [[Legacy:FixedMover|FixedMover]] &amp;ndash; custom class that fixes network bugs with movers than rotate in the process of opening or closing

It's possible to change the class of a mover after it's been created, but it requires [[Legacy:Brush Hacking|Brush Hacking]].

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]] is the hub for all related articles &amp; tutorials on making specific movers
* [[Legacy:Types Of Trigger|Types of Trigger]]
* [[Legacy:Event|Event]]

==Mover Tutorials==
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]
* [[Legacy:Activating A Mover|Activating a Mover]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4999</id>
      <timestamp>2006-04-10T03:05:34Z</timestamp>
      <contributor>
        <ip>Xian</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Brush|Brush]] &gt;&gt; Mover  (Package: Engine)}}

(see [[Legacy:Mover|Mover]] for the UT2003 version of this class)

In UT '''Movers''' are brushes that move. They are not part of the [[Legacy:BSP|BSP]], but look as if they are to the player.  Use them to create doors, elevators and other parts of dynamic level geometry. This page describes the class in detail. 

Terminology: A mover is said to &quot;open&quot; when it moves from key 0 to the last defined key (''NumKeys-1'' for the technically-minded). Movement in the opposite direction is called &quot;closing&quot;. Some subclasses of mover have the ability to open partially.

==Properties==

===Mover Group===
; bool bDamageTriggered : The mover is triggered by taking damage. Use for doors that open when you shoot then, for example.
; bool bDynamicLightMover : Setting this to True will cause the mover to change the way it is lit as it moves. This is very useful when a mover is going between areas with different brightnesses or colors of light. Note that BrushRayTraceKey is unused if the mover is dynamically lit.&lt;br /&gt;The process isn't perfect by any means, and often has dirty shadows and flickering between different lightings on the brush. However, it does eliminate the annoying black patches on the undersides of lifts and the sides of doors. In addition this takes quite a bit more CPU power than normal. Use this only in areas where it is needed to make the mover look decent and processing power can be spared.
; byte BrushRaytraceKey (const) : This should be set to the number of a keyframe. When the map's lighting is rebuilt, the polys of the mover will always be lit as if it is in this position. (Naturally, this property is irrelevant if you have bDynamicLightMover = True.)
; bool bSlave : This mover is a slave. It will follow another mover. See [[Legacy:Compound Movers|Compound Movers]].
; bool bTriggerOnceOnly : Go dormant after first trigger. Note that this doesn't work for all states (see ''Mover States'' below).
; name BumpEvent : The name of an [[Legacy:Event|event]] to fire when any something bumps this mover. This allows you to have movers that can be either triggered or bumped: you have the BumpEvent trigger the mover's own Tag.
; EBumpType BumpType : Determines what sort of things are counted as bumping this mover. Other things that bump it will be ignored.
; bool bUseTriggered : This mover will be triggered by player grab.
; float DamageThreshold : Minimum damage to trigger. Works with bDamageTriggered.
; float DelayTime : Delay before starting to open.
; int EncroachDamage : How much to damage encroached actors.
; byte KeyNum : The number of the key that the mover is curently set to. Using the [[Legacy:Brush Context Menu|Brush Context Menu]] -&gt; Mover -&gt; Key command is the same as changing this value. See [[Legacy:Keyframe|Keyframe]] for more on this.
; EMoverEncroachType MoverEncroachType : Tells the mover what to do when it hits an actor while trying to move. For example, when a lift returns to the low position and hits a player's head. (see ''EMoverEncroachType'' enum below)
; EMoverGlideType MoverGlideType : How the mover moves from one position to another. (see ''EMoverGlideType'' enum below)
; float MoveTime : Time to spend moving between keyframes.
; byte NumKeys (const) : This is the number of different positions (known as ''keys'') that the mover has. The maximum possible value seems to be 64.
; float OtherTime : TriggerPound stay-open time.
; name PlayerBumpEvent : Optional event to cause when the player bumps the mover.
; name ReturnGroup : if none, same as tag
; float StayOpenTime : How long to remain open before closing.
; byte WorldRaytraceKey (const) : Set this to the number of the key you want the mover to affect the world at. Basically, whatever you set this to is where the mover will block light. A neat trick you can do with this property is to set it to an unused key which you have positioned somewhere outside your map. That way the mover will not cast a shadow at all. This can alleviate the annoying problem of black patches underneath movers.

===MoverSounds Group ===

The properties in this section set the sounds played by the mover as it travels.
; Sound ClosedSound : When finish closing.
; Sound ClosingSound : When start closing.
; Sound MoveAmbientSound : Optional ambient sound when moving.
; Sound OpenedSound : When finished opening.
; Sound OpeningSound : When start opening.

The sounds in UT packages like DoorsMod are designed with this system in mind, and are usually found in sets of 3, eg &quot;md2start&quot;, &quot;md2loop&quot;, &quot;md2end&quot;. Use start sounds with Opening, end sounds with Opened and loop with ambient.

Only MoveAmbientSound is affected by the value of Sounds -&gt; SoundVolume. The others play at full volume. (Some scripting would probably fix this for a custom class, since the Mover calls PlaySound, and this has an optional volume parameter.)

===UnrealScript-Only Properties===
; byte PrevKeyNum : Previous keyframe.
; [[Legacy:Actor (UT)|Actor (UT)]] SavedTrigger : Who we were triggered by.
; int numTriggerEvents : Number of times triggered (count down to untrigger)
; Mover Leader
; Mover Follower : For having multiple movers return together. (see [[Legacy:Compound Movers|Compound Movers]])
; vector KeyPos[8] : 
; rotator KeyRot[8] : 
; vector BasePos, OldPos, OldPrePivot, SavedPos : 
; rotator BaseRot, OldRot, SavedRot : 
; [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] myMarker : 
; [[Legacy:Actor (UT)|Actor (UT)]] TriggerActor : 
; [[Legacy:Actor (UT)|Actor (UT)]] TriggerActor2 : 
; [[Legacy:Pawn (UT)|Pawn (UT)]] WaitingPawn : 
; bool bOpening, bDelaying, bClientPause : 
; bool bPlayerOnly : 
; [[Legacy:Trigger|Trigger]] RecommendedTrigger : 
; vector SimOldPos : 
; int SimOldRotPitch, SimOldRotYaw, SimOldRotRoll : 
; vector SimInterpolate : 
; vector RealPosition : 
; rotator RealRotation : 
; int ClientUpdate : 

==Enums ==

===EMoverEncroachType ===
; ME_StopWhenEncroach : Stop when we hit an actor.
; ME_ReturnWhenEncroach : Return to previous position when we hit an actor.
; ME_CrushWhenEncroach : Crush the poor helpless actor.
; ME_IgnoreWhenEncroach : Ignore encroached actors.

===EMoverGlideType ===
; MV_MoveByTime : Move linearly.
; MV_GlideByTime : Move with smooth acceleration.

===EBumpType ===
; BT_PlayerBump : Can only be bumped by player.
; BT_PawnBump : Can be bumped by any pawn.
; BT_AnyBump : Cany be bumped by any solid actor.

==States==

The mover states, set in the [[Legacy:InitialState|InitialState]] property determine:
* how the mover is activated
* how it behaves once it has been activated

Note that other settings affect activation behavior too:
* the BumpType property affects ''who'' can activate it 
* bDamageTriggered .....
* bUseTriggered ....

The &quot;OpenTimed&quot; states open the mover (from key 0 to the last key), wait then close and sleep again. Only the states with &quot;Trigger&quot; in the name respond to triggering.

;None: The mover will not move through its keys, unless it is a slave.

;BumpButton: 
This is very similar to BumpOpenTimed, but designed to be used for a button which controls another mover which is set to TriggerOpenTimed (a door, for example). 

Use the button mover's '''BumpEvent''' property to tie it to the door mover's Events -&gt; Tag. When the button is bumped, it moves and so does the door. The button is then frozen, and it will only return when the door has successfully closed. This is pretty much just a nice cosmetic touch: the button won't return until it can be used again.

In brief:

* The button mover's StayOpenTime is ignored. 
* If the door is prevented from closing (by a player, say), the button will not return
* Once the door mover has finished closing, the button mover is closed.


;BumpOpenTimed: The mover reacts to being touched. Set '''BumpType''' to determine what counts as touching it. Used for buttons (though see BumpButton for special cases). Can be used for doors, although TriggerControl is better.

;StandOpenTimed: The mover reacts when the engine detects a player has stood on it. Used for lifts.

;TriggerControl: 
The mover opens while the trigger is active, and closes when unTriggered &amp;ndash; ie if set up with a simple Trigger actor, as soon as the player steps out from the Trigger's radius the mover will start closing again. 

Example: the door to the redeemer area in UT's DM-StalwartXL and CTF-Gauntlet. (note to anyone reading this: the [[Legacy:Event|Event]] page needs to explain that events can last for a duration, as in this case &amp;ndash; there's an UnTrigger function too when a player steps out of a Trigger actor's radius.)


;TriggerOpenTimed: When triggered, the mover opens fully, waits and closes again. For related topics on triggering see the links section below.

;TriggerPound:
Similar to TriggerControl, but used for movers that open and close continuously. As soon as the corresponding trigger is activated, a mover using this state will begin the following cycle:

# Opens as usual, with its speed determined by the MoveTime property.
# Pauses for a time equal to the OtherTime property.
# Closes as usual, with its speed determined by the MoveTime property.
# Pauses for a time equal to the StayOpenTime property.

The mover loops through these actions until whatever activated the trigger leaves the trigger's collision area. When this happens, the mover immediately closes and remains at rest until triggered again.


;TriggerToggle: The mover will open when triggered and stop at the open position (the last keyframe). The next time it is triggered, it will close, and so on. Note that bTriggerOnceOnly has no effect in this state.

==Discussion==

'''Xian:''' while trying to see how I can misuse brushes in a better and more efficient way since I don't like the way Epic coded UT as a whole, I found this code in Engine.Mover.FindTriggerActor():

&lt;uscript&gt;
	ForEach AllActors(class 'Actor', A)
		if ( (A.Event == Tag) &amp;&amp; (A.IsA('Trigger') || A.IsA('Mover')) )
		{
			if ( A.IsA('Counter') || A.IsA('Pawn') )
			{
				bPlayerOnly = true;
				return; //FIXME - handle counters
			}
                      [...]
		}
&lt;/uscript&gt;

How can a Trigger/Mover be a Pawn ? This seems like a nice logical error. Although the consequences may not be huge (since altogether the main triggering mechanism is done by movers/trigger classes), I just don't see how they could miss this... although it is trivial, check the next part:

&lt;uscript&gt;
	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
&lt;/uscript&gt;

My guess is the correct version is: 

&lt;uscript&gt;
	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
                // Xian correction: TriggerActor to TriggerActor2 :)
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor2).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
&lt;/uscript&gt;

Again the code as a whole works, but let's face it, the rule of ''ntars'' should NOT apply here and this SHOULD be fixed imo. Perhaps people who wish to take advantage of custom Mover classes which are dependant on Triggers and TriggerActor(2) pointers should rewrite this function to fix it accordingly. Any thoughts ?

'''Graphik:''' I understand the trivial bit, but unfortunately not the useful part. I mean, I'm assuming there is one.

'''Xian:''' In my opinon, the code needs a lot of optimization and checks (for example in most parts it does iterations to all Actors with their Event matching the current Tag, while proper way of doing it, is to check if the Actor has an Event set, but most importantly to not iterate at all if there is no Tag set; true it does it only in PBP, but still). This was just a code-related discussion, and I assumed coders that would create custom Movers for UT would find this interesting. If you want a useful side of it, let me put it this way: assuming I am right (and to me it looks like I am), I have yet to see a correction of logical errors which is not useful :)

'''Graphik:''' OK cool.

'''Xian:''' ok so an optimized version imo:

&lt;uscript&gt;
function FindTriggerActor()
{
	local Actor A;

	TriggerActor = None;
	TriggerActor2 = None;

        // Xian: if there is no tag at all, why bother ?
        if (Tag == '')
             return;

	foreach AllActors(class 'Actor', A)
		if ((A.Event != '') &amp;&amp; (A.Event == Tag) &amp;&amp; (A.IsA('Trigger') || A.IsA('Mover')) )
		{
			if ( A.IsA('Counter') )
			{
				bPlayerOnly = true;
				return; //FIXME - handle counters
			}
			if (TriggerActor == None)
				TriggerActor = A;
			else if ( TriggerActor2 == None )
				TriggerActor2 = A;
		}

	if ( TriggerActor == None )
	{
		bPlayerOnly = (BumpType == BT_PlayerBump);
		return;
	}

	bPlayerOnly = ( TriggerActor.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor).TriggerType == TT_PlayerProximity) );
	if ( bPlayerOnly &amp;&amp; ( TriggerActor2 != None) )
	{
                // Xian: fixed TriggerActor to TriggerActor2
		bPlayerOnly = ( TriggerActor2.IsA('Trigger') &amp;&amp; (Trigger(TriggerActor2).TriggerType == TT_PlayerProximity) );
		if ( !bPlayerOnly )
		{
			A = TriggerActor;
			TriggerActor = TriggerActor2;
			TriggerActor2 = A;
		}
	}
}
&lt;/uscript&gt;

&lt;uscript&gt;
function PostBeginPlay()
{
	local mover M;

	//brushes can't be deleted, so if not relevant, make it invisible and non-colliding
	if ( !Level.Game.IsRelevant(self) )
	{
		SetCollision(false, false, false);
                bCollideWorld = False;  // Xian: :)
		SetLocation(Location + vect(0,0,20000)); // temp since still in bsp
		bHidden = true;
	}
	else
	{
		FindTriggerActor();
		// Initialize all slaves.
		if( !bSlave &amp;&amp; (Tag != '')) )    // Xian: tag check
		{
			foreach AllActors( class 'Mover', M, Tag )
			{
				if( M.bSlave )
				{
					M.GotoState('');
					M.SetBase( Self );
				}
			}
		}
		if ( Leader == None )
		{	
			Leader = self;

			if (ReturnGroup != '')   // Xian: tag check again
			{
				foreach AllActors( class'Mover', M )
				{
					if ( (M != self) &amp;&amp; (M.ReturnGroup == ReturnGroup) )
					{
						M.Leader = self;
						M.Follower = Follower;
						Follower = M;
					}
				}
			}
		}
	}
}
&lt;/uscript&gt;

&lt;uscript&gt;
function FinishNotify()
{
	local Pawn P;

	if ( StandingCount &gt; 0 )
		for ( P=Level.PawnList; P!=None; P=P.nextPawn )
// Xian: is it even relevant to execute code for players since they're aware of mover states ?
			if ( P.Base == self &amp;&amp; P.IsA('Bot'))
			{
				P.StopWaiting();
				if ( (P.SpecialGoal == self) || (P.SpecialGoal == myMarker) )
					P.SpecialGoal = None; 
				if ( P == WaitingPawn )
					WaitingPawn = None;
			}

	if ( WaitingPawn != None )
	{
		WaitingPawn.StopWaiting();
		if ( (WaitingPawn.SpecialGoal == self) || (WaitingPawn.SpecialGoal == myMarker) )
			WaitingPawn.SpecialGoal = None; 
		WaitingPawn = None;
	}
}
&lt;/uscript&gt;

This is how it should all be in my opinion :) The code should execute faster. Not tested but in theory, it should be better.

==Subclasses==
* [[Legacy:Types Of Mover|Types of Mover]] is a quick overview of the different classes of mover 
* [[Legacy:AssertMover|AssertMover]]
* [[Legacy:AttachMover|AttachMover]]
* [[Legacy:ElevatorMover|ElevatorMover]]
* [[Legacy:GradualMover|GradualMover]]
* [[Legacy:LoopMover|LoopMover]]
* [[Legacy:MixMover|MixMover]]
* [[Legacy:RotatingMover|RotatingMover]]
* [[Legacy:FixedMover|FixedMover]] &amp;ndash; custom class that fixes network bugs with movers than rotate in the process of opening or closing

It's possible to change the class of a mover after it's been created, but it requires [[Legacy:Brush Hacking|Brush Hacking]].

==Related Topics==
* [[Legacy:Mover Topics|Mover Topics]] is the hub for all related articles &amp; tutorials on making specific movers
* [[Legacy:Types Of Trigger|Types of Trigger]]
* [[Legacy:Event|Event]]

==Mover Tutorials==
* [[Legacy:Create A Mover|Create A Mover]]
* [[Legacy:Keyframe|Keyframe]]
* [[Legacy:Activating A Mover|Activating a Mover]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mover Topics</title>
    <id>1820</id>
    <revision>
      <id>4466</id>
      <timestamp>2007-06-25T10:09:30Z</timestamp>
      <contributor>
        <ip>Ambershee</ip>
      </contributor>
      <comment>Reverted. Again.</comment>
      <text xml:space="preserve">This is the main page for anything about movers.

==Reference==
* The [[Legacy:Mover|Mover]] class and its properties
* [[Legacy:Custom Mover|Custom Mover]]s &amp;ndash; making these for [[Legacy:UT2003|UT2003]]
* [[Legacy:Types Of Mover|Types of Mover]] &amp;ndash; Summary of the  types of mover in UT and what they are used for

==Topics==

There's a ton of stuff to cover here. Here's a rough list of things to cover. Feel free to add to it, or start a topic, or re-arrange stuff here.

===Basic Tutorial===

This tutorial should be able to guide a beginner through the steps involved in making a mover. If it doesn't, please improve it.
# [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Making the mover shape and adding it
# [[Legacy:Keyframe|Keyframe]] &amp;ndash; Setting keyframes for a mover
# [[Legacy:Activating A Mover|Activating a mover]] &amp;ndash; Triggering, movement types and move times

===Moving On===
* [[Legacy:Making Doors|Making Doors]]
* [[Legacy:Rotating And Swinging Doors|Rotating And Swinging Doors]]
* Doors and Gates, [[Legacy:Making Lifts|Lifts]] and Elevators 
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* Special Effects
* How to make Mover interpolate through an ObjectPath
* Using movers that move instantly to make stuff appear or disappear
* [[Legacy:ExplodingWall|ExplodingWall]] and glass
* Glass and masked textures in movers
* [[Legacy:Proximity Doors|Proximity Doors]]

Specifics like using the [[Legacy:ElevatorMover|ElevatorMover]] can maybe go under the class definition?

===Multi-Component Stuff===
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Multi-part doors with the 2D editor ([[Legacy:UT|UT]])
* [[Legacy:Attaching Actors|Attaching Actors]] to movers
* [[Legacy:Compound Movers|Compound Movers]] &amp;ndash; Using slave movers and attaching movers to movers
* [[Legacy:Movers With More Than 8 Keys|Movers with more than 8 keys]]
* Fancy stuff like locks and keys
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered Doors]] &amp;ndash; Quake3-style doors in [[Legacy:UT2004|UT2004]]
* [[Legacy:Moving Power Cores|Moving Power Cores]] - Without Breaking Bot Support.

===Custom Movers===
* [[Legacy:Scripting Movers|Scripting Movers]] &amp;ndash; Making your own mover
* [[Legacy:VariableTimedMover|VariableTimedMover]] &amp;ndash; Allows variable timing with any number of keys and any Mover State.

===Bots and Movers===
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Doors With Triggers|Doors with triggers]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Other bot-related topics

==Related Topics==
* [[Legacy:Triggering Sounds|Triggering Sounds]] &amp;ndash; Using hidden movers to trigger sounds 
* [[Legacy:Dynamics|Dynamics]] topic page

==External Links==
* [http://www.planetunreal.com/lode/movers/movers.html Lode's All About Movers Tutorial]

==Discussion==

'''LionsPhil:''' Mention should probably be made somewhere that, for things like fans, setting Movement.bFixedRotationDir to true, Object.IntialState to None, and setting up a Movement.RotationRate (Unreal rotation units per second, so try powers of two in the thousands) is a lot easier than keyframe-based movement. Especially as it avoids the &quot;rewinding&quot; you'll get from ConstantLoop.

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; add more UnrealEngine2 info!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4467</id>
      <timestamp>2007-06-25T10:04:13Z</timestamp>
      <contributor>
        <ip>Ip8-111.tvmax-fiber-1.hou.ygnition.net</ip>
      </contributor>
      <comment>http://intra.som.umass.edu/mannino/_disc1/00003908.htm</comment>
      <text xml:space="preserve">&lt;a href=&quot;http://intra.som.umass.edu/mannino/_disc1/00003908.htm&quot;&gt;&lt;h1&gt;Cialis&lt;/h1&gt;&lt;/a&gt; [url=http://intra.som.umass.edu/mannino/_disc1/00003908.htm]Cialis[/url]  &lt;a href=&quot;http://intra.som.umass.edu/mannino/_disc1/00003909.htm&quot;&gt;&lt;h1&gt;Cheap Cialis&lt;/h1&gt;&lt;/a&gt;     [url=http://intra.som.umass.edu/mannino/_disc1/00003909.htm]Cheap Cialis[/url]</text>
    </revision>
    <revision>
      <id>34395</id>
      <timestamp>2009-05-09T11:40:00Z</timestamp>
      <contributor>
        <ip>78.27.11.245</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">This is the main page for anything about movers.

==Reference==
* The [[Legacy:Mover|Mover]] class and its properties
* [[Legacy:Custom Mover|Custom Mover]]s &amp;ndash; making these for [[Legacy:UT2003|UT2003]]
* [[Legacy:Types Of Mover|Types of Mover]] &amp;ndash; Summary of the  types of mover in UT and what they are used for

==Topics==

There's a ton of stuff to cover here. Here's a rough list of things to cover. Feel free to add to it, or start a topic, or re-arrange stuff here.

===Basic Tutorial===

This tutorial should be able to guide a beginner through the steps involved in making a mover. If it doesn't, please improve it.
# [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Making the mover shape and adding it
# [[Legacy:Keyframe|Keyframe]] &amp;ndash; Setting keyframes for a mover
# [[Legacy:Activating A Mover|Activating a mover]] &amp;ndash; Triggering, movement types and move times

===Moving On===
* [[Legacy:Making Doors|Making Doors]]
* [[Legacy:Rotating And Swinging Doors|Rotating And Swinging Doors]]
* Doors and Gates, [[Legacy:Making Lifts|Lifts]] and Elevators 
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* Special Effects
* How to make Mover interpolate through an ObjectPath
* Using movers that move instantly to make stuff appear or disappear
* [[Legacy:ExplodingWall|ExplodingWall]] and glass
* Glass and masked textures in movers
* [[Legacy:Proximity Doors|Proximity Doors]]

Specifics like using the [[Legacy:ElevatorMover|ElevatorMover]] can maybe go under the class definition?

===Multi-Component Stuff===
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Multi-part doors with the 2D editor ([[Legacy:UT|UT]])
* [[Legacy:Attaching Actors|Attaching Actors]] to movers
* [[Legacy:Compound Movers|Compound Movers]] &amp;ndash; Using slave movers and attaching movers to movers
* [[Legacy:Movers With More Than 8 Keys|Movers with more than 8 keys]]
* Fancy stuff like locks and keys
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered Doors]] &amp;ndash; Quake3-style doors in [[Legacy:UT2004|UT2004]]
* [[Legacy:Moving Power Cores|Moving Power Cores]] - Without Breaking Bot Support.

===Custom Movers===
* [[Legacy:Scripting Movers|Scripting Movers]] &amp;ndash; Making your own mover
* [[Legacy:VariableTimedMover|VariableTimedMover]] &amp;ndash; Allows variable timing with any number of keys and any Mover State.

===Bots and Movers===
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Doors With Triggers|Doors with triggers]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Other bot-related topics

==Related Topics==
* [[Legacy:Triggering Sounds|Triggering Sounds]] &amp;ndash; Using hidden movers to trigger sounds 
* [[Legacy:Dynamics|Dynamics]] topic page

==External Links==
* [http://www.planetunreal.com/lode/movers/movers.html Lode's All About Movers Tutorial]

==Discussion==

'''LionsPhil:''' Mention should probably be made somewhere that, for things like fans, setting Movement.bFixedRotationDir to true, Object.IntialState to None, and setting up a Movement.RotationRate (Unreal rotation units per second, so try powers of two in the thousands) is a lot easier than keyframe-based movement. Especially as it avoids the &quot;rewinding&quot; you'll get from ConstantLoop.
'''Spinal:''' I think it's worth mentioning that a mover is added at the center of the red brush, not in the center of the current viewport or something. This caused me a few minutes of thinking &quot;why doesn't my mover show up?&quot;

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; add more UnrealEngine2 info!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34396</id>
      <timestamp>2009-05-09T11:41:41Z</timestamp>
      <contributor>
        <ip>78.27.11.245</ip>
      </contributor>
      <comment>/* Discussion */ break</comment>
      <text xml:space="preserve">This is the main page for anything about movers.

==Reference==
* The [[Legacy:Mover|Mover]] class and its properties
* [[Legacy:Custom Mover|Custom Mover]]s &amp;ndash; making these for [[Legacy:UT2003|UT2003]]
* [[Legacy:Types Of Mover|Types of Mover]] &amp;ndash; Summary of the  types of mover in UT and what they are used for

==Topics==

There's a ton of stuff to cover here. Here's a rough list of things to cover. Feel free to add to it, or start a topic, or re-arrange stuff here.

===Basic Tutorial===

This tutorial should be able to guide a beginner through the steps involved in making a mover. If it doesn't, please improve it.
# [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Making the mover shape and adding it
# [[Legacy:Keyframe|Keyframe]] &amp;ndash; Setting keyframes for a mover
# [[Legacy:Activating A Mover|Activating a mover]] &amp;ndash; Triggering, movement types and move times

===Moving On===
* [[Legacy:Making Doors|Making Doors]]
* [[Legacy:Rotating And Swinging Doors|Rotating And Swinging Doors]]
* Doors and Gates, [[Legacy:Making Lifts|Lifts]] and Elevators 
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* Special Effects
* How to make Mover interpolate through an ObjectPath
* Using movers that move instantly to make stuff appear or disappear
* [[Legacy:ExplodingWall|ExplodingWall]] and glass
* Glass and masked textures in movers
* [[Legacy:Proximity Doors|Proximity Doors]]

Specifics like using the [[Legacy:ElevatorMover|ElevatorMover]] can maybe go under the class definition?

===Multi-Component Stuff===
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Multi-part doors with the 2D editor ([[Legacy:UT|UT]])
* [[Legacy:Attaching Actors|Attaching Actors]] to movers
* [[Legacy:Compound Movers|Compound Movers]] &amp;ndash; Using slave movers and attaching movers to movers
* [[Legacy:Movers With More Than 8 Keys|Movers with more than 8 keys]]
* Fancy stuff like locks and keys
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered Doors]] &amp;ndash; Quake3-style doors in [[Legacy:UT2004|UT2004]]
* [[Legacy:Moving Power Cores|Moving Power Cores]] - Without Breaking Bot Support.

===Custom Movers===
* [[Legacy:Scripting Movers|Scripting Movers]] &amp;ndash; Making your own mover
* [[Legacy:VariableTimedMover|VariableTimedMover]] &amp;ndash; Allows variable timing with any number of keys and any Mover State.

===Bots and Movers===
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Doors With Triggers|Doors with triggers]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Other bot-related topics

==Related Topics==
* [[Legacy:Triggering Sounds|Triggering Sounds]] &amp;ndash; Using hidden movers to trigger sounds 
* [[Legacy:Dynamics|Dynamics]] topic page

==External Links==
* [http://www.planetunreal.com/lode/movers/movers.html Lode's All About Movers Tutorial]

==Discussion==

'''LionsPhil:''' Mention should probably be made somewhere that, for things like fans, setting Movement.bFixedRotationDir to true, Object.IntialState to None, and setting up a Movement.RotationRate (Unreal rotation units per second, so try powers of two in the thousands) is a lot easier than keyframe-based movement. Especially as it avoids the &quot;rewinding&quot; you'll get from ConstantLoop.

'''Spinal:''' I think it's worth mentioning that a mover is added at the center of the red brush, not in the center of the current viewport or something. This caused me a few minutes of thinking &quot;why doesn't my mover show up?&quot;

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; add more UnrealEngine2 info!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34415</id>
      <timestamp>2009-05-20T05:59:57Z</timestamp>
      <contributor>
        <username>Seditious</username>
        <id>1838</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">This is the main page for anything about movers.

==Reference==
* The [[Legacy:Mover|Mover]] class and its properties
* [[Legacy:Custom Mover|Custom Mover]]s &amp;ndash; making these for [[Legacy:UT2003|UT2003]]
* [[Legacy:Types Of Mover|Types of Mover]] &amp;ndash; Summary of the  types of mover in UT and what they are used for

==Topics==

There's a ton of stuff to cover here. Here's a rough list of things to cover. Feel free to add to it, or start a topic, or re-arrange stuff here.

===Basic Tutorial===

This tutorial should be able to guide a beginner through the steps involved in making a mover. If it doesn't, please improve it.
# [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Making the mover shape and adding it
# [[Legacy:Keyframe|Keyframe]] &amp;ndash; Setting keyframes for a mover
# [[Legacy:Activating A Mover|Activating a mover]] &amp;ndash; Triggering, movement types and move times

===Moving On===
* [[Legacy:Making Doors|Making Doors]]
* [[Legacy:Rotating And Swinging Doors|Rotating And Swinging Doors]]
* Doors and Gates, [[Legacy:Making Lifts|Lifts]] and Elevators 
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* Special Effects
* How to make Mover interpolate through an ObjectPath
* Using movers that move instantly to make stuff appear or disappear
* [[Legacy:ExplodingWall|ExplodingWall]] and glass
* Glass and masked textures in movers
* [[Legacy:Proximity Doors|Proximity Doors]]

Specifics like using the [[Legacy:ElevatorMover|ElevatorMover]] can maybe go under the class definition?

===Multi-Component Stuff===
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Multi-part doors with the 2D editor ([[Legacy:UT|UT]])
* [[Legacy:Attaching Actors|Attaching Actors]] to movers
* [[Legacy:Compound Movers|Compound Movers]] &amp;ndash; Using slave movers and attaching movers to movers
* [[Legacy:Movers With More Than 8 Keys|Movers with more than 8 keys]]
* Fancy stuff like locks and keys
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered Doors]] &amp;ndash; Quake3-style doors in [[Legacy:UT2004|UT2004]]
* [[Legacy:Moving Power Cores|Moving Power Cores]] - Without Breaking Bot Support.

===Custom Movers===
* [[Legacy:Scripting Movers|Scripting Movers]] &amp;ndash; Making your own mover
* [[Legacy:VariableTimedMover|VariableTimedMover]] &amp;ndash; Allows variable timing with any number of keys and any Mover State.

===Bots and Movers===
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Doors With Triggers|Doors with triggers]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Other bot-related topics

==Related Topics==
* [[Legacy:Triggering Sounds|Triggering Sounds]] &amp;ndash; Using hidden movers to trigger sounds 
* [[Legacy:Dynamics|Dynamics]] topic page

==External Links==
* [http://www.planetunreal.com/lode/movers/movers.html Lode's All About Movers Tutorial]

==Discussion==

'''LionsPhil:''' Mention should probably be made somewhere that, for things like fans, setting Movement.bFixedRotationDir to true, Object.IntialState to None, and setting up a Movement.RotationRate (Unreal rotation units per second, so try powers of two in the thousands) is a lot easier than keyframe-based movement. Especially as it avoids the &quot;rewinding&quot; you'll get from ConstantLoop.

'''Spinal:''' I think it's worth mentioning that a mover is added at the center of the red brush, not in the center of the current viewport or something. This caused me a few minutes of thinking &quot;why doesn't my mover show up?&quot;

'''Seditious:''' Thanks LionsPhil, that just cured my frustration. I wonder why ConstantLoop acts more like Triggerpound than LoopMove. All I wanted first is a rotating decoration, so I haven't tried the triggered states yet, but UDN's doc is vague about this...

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; add more UnrealEngine2 info!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43728</id>
      <timestamp>2010-07-21T01:03:53Z</timestamp>
      <contributor>
        <ip>65.13.77.24</ip>
      </contributor>
      <comment>/* External Links */</comment>
      <text xml:space="preserve">This is the main page for anything about movers.

==Reference==
* The [[Legacy:Mover|Mover]] class and its properties
* [[Legacy:Custom Mover|Custom Mover]]s &amp;ndash; making these for [[Legacy:UT2003|UT2003]]
* [[Legacy:Types Of Mover|Types of Mover]] &amp;ndash; Summary of the  types of mover in UT and what they are used for

==Topics==

There's a ton of stuff to cover here. Here's a rough list of things to cover. Feel free to add to it, or start a topic, or re-arrange stuff here.

===Basic Tutorial===

This tutorial should be able to guide a beginner through the steps involved in making a mover. If it doesn't, please improve it.
# [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Making the mover shape and adding it
# [[Legacy:Keyframe|Keyframe]] &amp;ndash; Setting keyframes for a mover
# [[Legacy:Activating A Mover|Activating a mover]] &amp;ndash; Triggering, movement types and move times

===Moving On===
* [[Legacy:Making Doors|Making Doors]]
* [[Legacy:Rotating And Swinging Doors|Rotating And Swinging Doors]]
* Doors and Gates, [[Legacy:Making Lifts|Lifts]] and Elevators 
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* Special Effects
* How to make Mover interpolate through an ObjectPath
* Using movers that move instantly to make stuff appear or disappear
* [[Legacy:ExplodingWall|ExplodingWall]] and glass
* Glass and masked textures in movers
* [[Legacy:Proximity Doors|Proximity Doors]]

Specifics like using the [[Legacy:ElevatorMover|ElevatorMover]] can maybe go under the class definition?

===Multi-Component Stuff===
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Multi-part doors with the 2D editor ([[Legacy:UT|UT]])
* [[Legacy:Attaching Actors|Attaching Actors]] to movers
* [[Legacy:Compound Movers|Compound Movers]] &amp;ndash; Using slave movers and attaching movers to movers
* [[Legacy:Movers With More Than 8 Keys|Movers with more than 8 keys]]
* Fancy stuff like locks and keys
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered Doors]] &amp;ndash; Quake3-style doors in [[Legacy:UT2004|UT2004]]
* [[Legacy:Moving Power Cores|Moving Power Cores]] - Without Breaking Bot Support.

===Custom Movers===
* [[Legacy:Scripting Movers|Scripting Movers]] &amp;ndash; Making your own mover
* [[Legacy:VariableTimedMover|VariableTimedMover]] &amp;ndash; Allows variable timing with any number of keys and any Mover State.

===Bots and Movers===
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Doors With Triggers|Doors with triggers]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Other bot-related topics

==Related Topics==
* [[Legacy:Triggering Sounds|Triggering Sounds]] &amp;ndash; Using hidden movers to trigger sounds 
* [[Legacy:Dynamics|Dynamics]] topic page

==External Links==
* [http://www.planetunreal.com/lode/movers/movers.html Lode's All About Movers Tutorial]
* [http://www.crowleyautotransport.com/ car transport]

==Discussion==

'''LionsPhil:''' Mention should probably be made somewhere that, for things like fans, setting Movement.bFixedRotationDir to true, Object.IntialState to None, and setting up a Movement.RotationRate (Unreal rotation units per second, so try powers of two in the thousands) is a lot easier than keyframe-based movement. Especially as it avoids the &quot;rewinding&quot; you'll get from ConstantLoop.

'''Spinal:''' I think it's worth mentioning that a mover is added at the center of the red brush, not in the center of the current viewport or something. This caused me a few minutes of thinking &quot;why doesn't my mover show up?&quot;

'''Seditious:''' Thanks LionsPhil, that just cured my frustration. I wonder why ConstantLoop acts more like Triggerpound than LoopMove. All I wanted first is a rotating decoration, so I haven't tried the triggered states yet, but UDN's doc is vague about this...

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; add more UnrealEngine2 info!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43729</id>
      <timestamp>2010-07-21T07:13:37Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/65.13.77.24|65.13.77.24]] ([[User talk:65.13.77.24|Talk]]) to last revision by [[User:Seditious|Seditious]]</comment>
      <text xml:space="preserve">This is the main page for anything about movers.

==Reference==
* The [[Legacy:Mover|Mover]] class and its properties
* [[Legacy:Custom Mover|Custom Mover]]s &amp;ndash; making these for [[Legacy:UT2003|UT2003]]
* [[Legacy:Types Of Mover|Types of Mover]] &amp;ndash; Summary of the  types of mover in UT and what they are used for

==Topics==

There's a ton of stuff to cover here. Here's a rough list of things to cover. Feel free to add to it, or start a topic, or re-arrange stuff here.

===Basic Tutorial===

This tutorial should be able to guide a beginner through the steps involved in making a mover. If it doesn't, please improve it.
# [[Legacy:Create A Mover|Create A Mover]] &amp;ndash; Making the mover shape and adding it
# [[Legacy:Keyframe|Keyframe]] &amp;ndash; Setting keyframes for a mover
# [[Legacy:Activating A Mover|Activating a mover]] &amp;ndash; Triggering, movement types and move times

===Moving On===
* [[Legacy:Making Doors|Making Doors]]
* [[Legacy:Rotating And Swinging Doors|Rotating And Swinging Doors]]
* Doors and Gates, [[Legacy:Making Lifts|Lifts]] and Elevators 
* [[Legacy:How To Make Elevators With Doors That Follow The Lift|How to make Elevators with Doors That follow the Lift]]
* Special Effects
* How to make Mover interpolate through an ObjectPath
* Using movers that move instantly to make stuff appear or disappear
* [[Legacy:ExplodingWall|ExplodingWall]] and glass
* Glass and masked textures in movers
* [[Legacy:Proximity Doors|Proximity Doors]]

Specifics like using the [[Legacy:ElevatorMover|ElevatorMover]] can maybe go under the class definition?

===Multi-Component Stuff===
* [[Legacy:Making Complex Doors|Making Complex Doors]] &amp;ndash; Multi-part doors with the 2D editor ([[Legacy:UT|UT]])
* [[Legacy:Attaching Actors|Attaching Actors]] to movers
* [[Legacy:Compound Movers|Compound Movers]] &amp;ndash; Using slave movers and attaching movers to movers
* [[Legacy:Movers With More Than 8 Keys|Movers with more than 8 keys]]
* Fancy stuff like locks and keys
* [[Legacy:Making Multi-Story Elevators|Making Multi-Story Elevators]]
* [[Legacy:Proximity- And Damage-Triggered Doors|Proximity- and damage-triggered Doors]] &amp;ndash; Quake3-style doors in [[Legacy:UT2004|UT2004]]
* [[Legacy:Moving Power Cores|Moving Power Cores]] - Without Breaking Bot Support.

===Custom Movers===
* [[Legacy:Scripting Movers|Scripting Movers]] &amp;ndash; Making your own mover
* [[Legacy:VariableTimedMover|VariableTimedMover]] &amp;ndash; Allows variable timing with any number of keys and any Mover State.

===Bots and Movers===
* [[Legacy:Pathing Lifts|Pathing Lifts]]
* [[Legacy:Doors With Triggers|Doors with triggers]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Other bot-related topics

==Related Topics==
* [[Legacy:Triggering Sounds|Triggering Sounds]] &amp;ndash; Using hidden movers to trigger sounds 
* [[Legacy:Dynamics|Dynamics]] topic page

==External Links==
* [http://www.planetunreal.com/lode/movers/movers.html Lode's All About Movers Tutorial]

==Discussion==

'''LionsPhil:''' Mention should probably be made somewhere that, for things like fans, setting Movement.bFixedRotationDir to true, Object.IntialState to None, and setting up a Movement.RotationRate (Unreal rotation units per second, so try powers of two in the thousands) is a lot easier than keyframe-based movement. Especially as it avoids the &quot;rewinding&quot; you'll get from ConstantLoop.

'''Spinal:''' I think it's worth mentioning that a mover is added at the center of the red brush, not in the center of the current viewport or something. This caused me a few minutes of thinking &quot;why doesn't my mover show up?&quot;

'''Seditious:''' Thanks LionsPhil, that just cured my frustration. I wonder why ConstantLoop acts more like Triggerpound than LoopMove. All I wanted first is a rotating decoration, so I haven't tried the triggered states yet, but UDN's doc is vague about this...

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; add more UnrealEngine2 info!
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Movers With More Than 8 Keys</title>
    <id>2043</id>
    <revision>
      <id>4981</id>
      <timestamp>2007-12-13T22:25:40Z</timestamp>
      <contributor>
        <ip>C-24-1-84-192.hsd1.il.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''''This is a work around for''''' [[Legacy:UT|UT]].

[[Legacy:UT2003|UT2003]], [[Legacy:UT2004|UT2004]], [[Legacy:UE2|UE2]], '''and likely''' [[Legacy:U2|U2]] '''support up to 256 keyframes.  8 can be set from the right-click menu, the rest must be set using Mover Properties.'''
 

==Overview: How to make a Monorail ==

By '''Pitboy'''

Until Epic, or someone in the mapping community clever enough to code a script to allow movers to have more than 7(+1) keys, we are stuck with this limitation. There is a way around it however. It just takes a little patience and some simple math...

The mover that you create (monorail, helicopter, ect.) has NO key points itself.

What we are going to do is make a few other mini movers I call 'MoverGuides' and attach the mover to the first of these.

==The main mover ==

Create a large room (say, 256x1024x1024) and Re-build Geometry. 

[[Legacy:Create A Mover|Create a mover]] the usual way, maybe just a platform (16x64x128). 

[[Legacy:Set The Following Properties|Set the following Properties]] for your mover:

* Movement -&gt; Attach Tag = 'MG1' 
* Mover -&gt; MoverEncroachType = 'IgnoreWhenEncroach'
* Object -&gt; InitialState = 'None'

==The mover guides==

Select a unique texture not used elsewhere in your new room. Make a cube 2x4x4 and add it to your level. Cut the rectangle into a triangle. Using a triangle helps you keep track of the direction it's heading in. Make this triangle into a mover the usual way (just do not delete the blue triangle when you're done). 

Note: Just make a regular mover, NOT an Attach Mover. I find it's easy to make about 10 MoverGuides at this time (just click the mover button 10 times) if you don't know yet how many total keys you want, or if you later screw one up. Delete the leftovers when you're done. In this example, we will use six of them.

At this point, in the Top View, I will arrange all the MoverGuides into a neat row to make changing each of their properties quicker. Move the blue triangle to the side where you can later easily select it.

Select ALL of the MoverGuides, and change their following properties... 

*Events &gt; Tag... 'MG'
*Movement &gt; Attach Tag... 'MG'
*Mover &gt; MoverGlideType... 'MV_MoveByTime'
*Mover &gt; NumKeys... '8'
*Object &gt; InitialState... TriggerOpenedTimed

Now to adjust each one...

Go to the first one and change...

Event &gt; Tag to 'MG1'

Movement &gt; Attach Tag... 'MG2' 

Go to the second one and change...

Event &gt; Tag to 'MG2'

Movement &gt; Attach Tag... 'MG3' 

Go to the third one and change...

Event &gt; Tag to 'MG3'

Movement &gt; Attach Tag... 'MG4' 

Go to the fourth one and change...

Event &gt; Tag to 'MG4'

Movement &gt; Attach Tag... 'MG5'' 

Go to the fifth one and change...

Event &gt; Tag to 'MG5'

Movement &gt; Attach Tag... 'MG6'

The final one will be a little different...

Go to the sixth one and change...

Event &gt; Tag to 'MG6'

BUT leave Movement &gt; Attach Tag... to 'None'

Also, while they are all selected, right click on one of them and select 'Movers &gt; Show Polys. They should now all be visible in the 3-D window. Right click on one of it's sides (make sure it has that unique texture) and select 'Select Surfaces' &gt; 'Matching Textures' (or use Shift + T). All the Mover Guide's surfaces should now be highlighted. Hit F5 (Surface Properties) and on the Flags tab tick off 'Invisible' and 'Unlit'. I'm assuming this saves the game engine a bit of stress, not having to draw or light these. Go back to Top View and select all the MoverGuides (if they aren't already), the platform mover and the blue triangle. Right click on one of the highlighted brushes (should be 12 of them) and select Transform &gt;Transform Permanently (you could also do these separately, this way is quicker) 

Re-build Geometry and save. 

Move the platform mover just off the ground somewhere in the room. From the Top View, place the first Mover Guide (MG1) AND the blue triangle to the same spot in the middle of the platform. Make sure they are pointing towards the front of the mover in the direction it will head. From a side 2D view, lower MG1 so it's somewhere below your level (underground). At this point I will move all the other MG's to the same Z axis (height) below ground as MG1. Switch back to the top view. As you created MG1 after the added brush, MG1 should cover up the triangle.

For this example, have MG1 point to the right while looking through the Top View. You should stay in Top View from this point on. 

NOTE: Every time you select one of the MG's, make sure its pivot point the dot in the middle, or the front tip. 

Right click MG1 and select Movers &gt; Key 1.

It is important to keep in mind that the MG's should be placed (roughly) equally apart. Otherwise, your mover will speed up and slow down while traveling (unless this is what you want). Now, select the mover, triangle and MG1 (I usually just Left Control and draw a box around all three) and drag them 256 units to the right. 

Left click MG1 so it is the only thing highlighted, Now, right click it and select Movers &gt; Key 2. MG1 should snap back to its original position (Key1). Drag it so it's back over top of the blue triangle. Select all three again, and drag them to the right 128 units and up 128 units. Now rotate them (Left CTRL + Right mouse button) so that they are angled 45 degrees up. We are going to go around a corner, so they will be next be heading up. 

Again left click MG1 so it is the only thing highlighted, Right click it and select Movers &gt; Key 3. After it snaps back, drag it on top of the triangle again. Make sure it is angled correctly as well. The reason we take the blue triangle along for all of this is that it not only makes it easy to find the center of the mover, but also the current angle of the mover.

Drag all three 128 units right and 128 units up. Angle them another 45 degrees up (now facing straight up) and Left click MG1 so it is the only thing highlighted, then right click and select Key 4. Drag MG1 back over top the triangle...

To keep this from being 80 pages long, continue to move all three around to where you want... right clicking MG1 and setting the next key point, then drag it back on top of the triangle and moving all three to the next spot. Assuming you've set them up to key 7, move them to one last point somewhere, and select MG1, and set this spot as Key 0 (base). After it snaps back, leave it there.

Grab MG2 and place it on top of the blue triangle, (and angle it so it's pointing in the same direction) so the blue triangle is hidden beneath. Right click MG2 and select Movers &gt; Key 1. At this spot, MG1 stops moving and MG2 takes over. Move your mover, the triangle and MG2 through 7 more key frames. ('1' is where the previous mover ended, '0 (Base)' is where the next MoverGuide will start). To quickly finish up our example, continue using this method till you have used up 6 of the MoverGuides. Make MG6's final key point (0 Base) is lined up back on top of MG1 to complete the route (before MG6 snaps back to its starting position).

Add into your map one regular trigger (Actor &gt; Triggers &gt; +Trigger) and two dispatchers (Actor &gt; Triggers &gt; Dispatcher) 

Place the trigger on the platform so it can be activated when someone stands on it. Set in the trigger's Properties...

Events &gt; Event to 'Mdisp1' 

Trigger &gt; TriggerOnlyOnce to 'True'.

Give the first dispatcher a tag of 'Mdisp1'. 

Give the second dispatcher a tag of 'Mdisp2'.

It doesn't matter where they are placed.

Now for the math...

We left all the MG's Properties &gt; Mover &gt; MoveTime at '1' (one second). So we know it will reach the spot where MG2 is in 7 seconds.

Select Mdisp1 and open Properties &gt; Dispatcher, and expand OutDelays and OutEvents. 

Type in OutDelays... 

(0) '0'

(1) '7'

(2) '7'

(3) '7'

(4) '7'

(5) '7'

(6) '63'

(7) '0''

Type in OutEvents... 

(0) 'MG1'

(1) 'MG2'

(2) 'MG3'

(3) 'MG4'

(4) 'MG5'

(5) 'MG6'

(6) 'Disp2'

(7) 'None'

When a player stands on the platform, it will activate the trigger, which calls whatever is in its 'Event', in this case the dispatcher Mdisp1. Mdisp1 one will look at its OutDelays, wait the appropriate time, and then activate what is in line (1) of its OutEvents. Because we want it to start right away, we left OutEvents (1) at '0'.

Each MoverGuide needs to be activated 7 seconds later, so we put '7' in lines (2) through (5) of OutDelays.

So now, the player gets on the platform, activates the trigger which calls Mdisp1 which activates MG1. It will go through its 7 key frames and stop on top of MG2, (taking the platform with it because the platforms AttachTag is MG1). At this exact moment Mdisp1 activates MG2, and MG2 heads off on its key frames, taking MG1 with it because its AttachTag is MG2. This continues till the last MoverGuide (MG6) lands on the spot where we started out.

Next we have to set each of the following MoverGuides Properties &gt; Mover &gt; StayOpenTime. We left this till now because this number depends on the amount of MoverGuides we used (6), and the MoveTimes of them (1 sec)

Select the last MoverGuide we used (MG6), and set its StayOpenTime to '7'

Select MG5 and set its StayOpenTime to '21'

Select MG4 and set its StayOpenTime to '35'

Select MG3 and set its StayOpenTime to '49'

Select MG2 and set its StayOpenTime to '63'

Select MG1 and set its StayOpenTime to '77'

See the pattern? 

The last thing to do is figure out when line 6 of Disp2 should be called to make it an endless loop (so the platform keeps moving). Dispatchers can't call (activate) themselves, but they can call a second dispatcher, which in turn can call the first dispatcher (in 0.0 seconds!). As you may have noted, the DelayTimes in dispatchers count up from 0 at each OutEvent they come to. So...

After MG6 is called, we have to start counting. It takes...

7 seconds to get to its last key (0 base - also the starting point of the monorail)

7 seconds to stay there (its StayOpenTime)

7 seconds to get back to its first key

7 seconds to for MG5 to travel back to its first key

7 seconds to for MG4 to travel back to its first key

7 seconds to for MG3 to travel back to its first key

7 seconds to for MG2 to travel back to its first key

7 seconds for MG1 to get to its first key (also the starting point of the monorail)

7 seconds for it to wait before you have it go again 

This adds up to 63. So we put in '63' at line (6) of Mdisp1's OutDelays

Now select Mdisp2 and open Properties &gt; Dispatcher, and expand OutDelays and OutEvents. 

Set line (0) of OutDelays to '0'

Set line (0) of OutEvents to 'Mdisp1'

So after the platform has gone around it route, paused, and returned... Mdisp1 activates Mdisp2 which in turn activates Mdisp1 and the platform heads off again.

If you look at the small sample map, you can see the MoverGuides in action. 

If you open the Monorail map, you'll see there are two monorails, blue and red. I first laid out the blue monorail's MoverGuides (BMONO1-8). When I added in the red monorails MoverGuides (RMONO1-8) opposite the first one, I put its first MoverGuide on top of the blue Monorail1's 5th key frame. (Each of these monorails have 8 MoverGuides, and the 5th key frame is the halfway point). 

You can download this tutorial, a small monorail map, and the tutorial map here...

http://www.planetunreal.com/prefabl...ailtutorial.zip

==Coments ==

'''Sett:''' : I posted this tute' on Pitboy's behalf.

More to come!

'''SabbathCat:''' : The download link is broken. Can't find on google. Anyone from prefablab got fileplanet access? :)

'''Ticalion:''' : Your gonna love me '''SabbathCat''' we have it hosted over at UTmaniac :) the link to the Download is 

'''[D2]_Boss....''' : There's an easier way to go over 8 key points.  Set NumKeys to any value that'll determine how many keypoints you are doing.  Do your first seven keypoints normally.  Position your mover to the 8th one.  Open the mover's properties, look for KeyNum (not NumKey).  Type in 8 for the 8th keyframe.  Once that is done, your mover should return to the original position.  You can have up to 255 keyframes which should be more than enough than what you need.  The highest I went to is up to 25. =)

http://www.utmaniac.com/sitestuff/ut2k3featured/monorailfiles/monorailtutorial.zip

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; format this page
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4982</id>
      <timestamp>2006-04-06T22:08:02Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*revert</comment>
      <text xml:space="preserve">'''''This is a work around for''''' [[Legacy:UT|UT]].

[[Legacy:UT2003|UT2003]], [[Legacy:UT2004|UT2004]], [[Legacy:UE2|UE2]], '''and likely''' [[Legacy:U2|U2]] '''support up to 256 keyframes.  8 can be set from the right-click menu, the rest must be set using Mover Properties.'''
 

==Overview: How to make a Monorail ==

By '''Pitboy'''

Until Epic, or someone in the mapping community clever enough to code a script to allow movers to have more than 7(+1) keys, we are stuck with this limitation. There is a way around it however. It just takes a little patience and some simple math...

The mover that you create (monorail, helicopter, ect.) has NO key points itself.

What we are going to do is make a few other mini movers I call 'MoverGuides' and attach the mover to the first of these.

==The main mover ==

Create a large room (say, 256x1024x1024) and Re-build Geometry. 

[[Legacy:Create A Mover|Create a mover]] the usual way, maybe just a platform (16x64x128). 

[[Legacy:Set The Following Properties|Set the following Properties]] for your mover:

* Movement -&gt; Attach Tag = 'MG1' 
* Mover -&gt; MoverEncroachType = 'IgnoreWhenEncroach'
* Object -&gt; InitialState = 'None'

==The mover guides==

Select a unique texture not used elsewhere in your new room. Make a cube 2x4x4 and add it to your level. Cut the rectangle into a triangle. Using a triangle helps you keep track of the direction it's heading in. Make this triangle into a mover the usual way (just do not delete the blue triangle when you're done). 

Note: Just make a regular mover, NOT an Attach Mover. I find it's easy to make about 10 MoverGuides at this time (just click the mover button 10 times) if you don't know yet how many total keys you want, or if you later screw one up. Delete the leftovers when you're done. In this example, we will use six of them.

At this point, in the Top View, I will arrange all the MoverGuides into a neat row to make changing each of their properties quicker. Move the blue triangle to the side where you can later easily select it.

Select ALL of the MoverGuides, and change their following properties... 

*Events &gt; Tag... 'MG'
*Movement &gt; Attach Tag... 'MG'
*Mover &gt; MoverGlideType... 'MV_MoveByTime'
*Mover &gt; NumKeys... '8'
*Object &gt; InitialState... TriggerOpenedTimed

Now to adjust each one...

Go to the first one and change...

Event &gt; Tag to 'MG1'

Movement &gt; Attach Tag... 'MG2' 

Go to the second one and change...

Event &gt; Tag to 'MG2'

Movement &gt; Attach Tag... 'MG3' 

Go to the third one and change...

Event &gt; Tag to 'MG3'

Movement &gt; Attach Tag... 'MG4' 

Go to the fourth one and change...

Event &gt; Tag to 'MG4'

Movement &gt; Attach Tag... 'MG5'' 

Go to the fifth one and change...

Event &gt; Tag to 'MG5'

Movement &gt; Attach Tag... 'MG6'

The final one will be a little different...

Go to the sixth one and change...

Event &gt; Tag to 'MG6'

BUT leave Movement &gt; Attach Tag... to 'None'

Also, while they are all selected, right click on one of them and select 'Movers &gt; Show Polys. They should now all be visible in the 3-D window. Right click on one of it's sides (make sure it has that unique texture) and select 'Select Surfaces' &gt; 'Matching Textures' (or use Shift + T). All the Mover Guide's surfaces should now be highlighted. Hit F5 (Surface Properties) and on the Flags tab tick off 'Invisible' and 'Unlit'. I'm assuming this saves the game engine a bit of stress, not having to draw or light these. Go back to Top View and select all the MoverGuides (if they aren't already), the platform mover and the blue triangle. Right click on one of the highlighted brushes (should be 12 of them) and select Transform &gt;Transform Permanently (you could also do these separately, this way is quicker) 

Re-build Geometry and save. 

Move the platform mover just off the ground somewhere in the room. From the Top View, place the first Mover Guide (MG1) AND the blue triangle to the same spot in the middle of the platform. Make sure they are pointing towards the front of the mover in the direction it will head. From a side 2D view, lower MG1 so it's somewhere below your level (underground). At this point I will move all the other MG's to the same Z axis (height) below ground as MG1. Switch back to the top view. As you created MG1 after the added brush, MG1 should cover up the triangle.

For this example, have MG1 point to the right while looking through the Top View. You should stay in Top View from this point on. 

NOTE: Every time you select one of the MG's, make sure its pivot point the dot in the middle, or the front tip. 

Right click MG1 and select Movers &gt; Key 1.

It is important to keep in mind that the MG's should be placed (roughly) equally apart. Otherwise, your mover will speed up and slow down while traveling (unless this is what you want). Now, select the mover, triangle and MG1 (I usually just Left Control and draw a box around all three) and drag them 256 units to the right. 

Left click MG1 so it is the only thing highlighted, Now, right click it and select Movers &gt; Key 2. MG1 should snap back to its original position (Key1). Drag it so it's back over top of the blue triangle. Select all three again, and drag them to the right 128 units and up 128 units. Now rotate them (Left CTRL + Right mouse button) so that they are angled 45 degrees up. We are going to go around a corner, so they will be next be heading up. 

Again left click MG1 so it is the only thing highlighted, Right click it and select Movers &gt; Key 3. After it snaps back, drag it on top of the triangle again. Make sure it is angled correctly as well. The reason we take the blue triangle along for all of this is that it not only makes it easy to find the center of the mover, but also the current angle of the mover.

Drag all three 128 units right and 128 units up. Angle them another 45 degrees up (now facing straight up) and Left click MG1 so it is the only thing highlighted, then right click and select Key 4. Drag MG1 back over top the triangle...

To keep this from being 80 pages long, continue to move all three around to where you want... right clicking MG1 and setting the next key point, then drag it back on top of the triangle and moving all three to the next spot. Assuming you've set them up to key 7, move them to one last point somewhere, and select MG1, and set this spot as Key 0 (base). After it snaps back, leave it there.

Grab MG2 and place it on top of the blue triangle, (and angle it so it's pointing in the same direction) so the blue triangle is hidden beneath. Right click MG2 and select Movers &gt; Key 1. At this spot, MG1 stops moving and MG2 takes over. Move your mover, the triangle and MG2 through 7 more key frames. ('1' is where the previous mover ended, '0 (Base)' is where the next MoverGuide will start). To quickly finish up our example, continue using this method till you have used up 6 of the MoverGuides. Make MG6's final key point (0 Base) is lined up back on top of MG1 to complete the route (before MG6 snaps back to its starting position).

Add into your map one regular trigger (Actor &gt; Triggers &gt; +Trigger) and two dispatchers (Actor &gt; Triggers &gt; Dispatcher) 

Place the trigger on the platform so it can be activated when someone stands on it. Set in the trigger's Properties...

Events &gt; Event to 'Mdisp1' 

Trigger &gt; TriggerOnlyOnce to 'True'.

Give the first dispatcher a tag of 'Mdisp1'. 

Give the second dispatcher a tag of 'Mdisp2'.

It doesn't matter where they are placed.

Now for the math...

We left all the MG's Properties &gt; Mover &gt; MoveTime at '1' (one second). So we know it will reach the spot where MG2 is in 7 seconds.

Select Mdisp1 and open Properties &gt; Dispatcher, and expand OutDelays and OutEvents. 

Type in OutDelays... 

(0) '0'

(1) '7'

(2) '7'

(3) '7'

(4) '7'

(5) '7'

(6) '63'

(7) '0''

Type in OutEvents... 

(0) 'MG1'

(1) 'MG2'

(2) 'MG3'

(3) 'MG4'

(4) 'MG5'

(5) 'MG6'

(6) 'Disp2'

(7) 'None'

When a player stands on the platform, it will activate the trigger, which calls whatever is in its 'Event', in this case the dispatcher Mdisp1. Mdisp1 one will look at its OutDelays, wait the appropriate time, and then activate what is in line (1) of its OutEvents. Because we want it to start right away, we left OutEvents (1) at '0'.

Each MoverGuide needs to be activated 7 seconds later, so we put '7' in lines (2) through (5) of OutDelays.

So now, the player gets on the platform, activates the trigger which calls Mdisp1 which activates MG1. It will go through its 7 key frames and stop on top of MG2, (taking the platform with it because the platforms AttachTag is MG1). At this exact moment Mdisp1 activates MG2, and MG2 heads off on its key frames, taking MG1 with it because its AttachTag is MG2. This continues till the last MoverGuide (MG6) lands on the spot where we started out.

Next we have to set each of the following MoverGuides Properties &gt; Mover &gt; StayOpenTime. We left this till now because this number depends on the amount of MoverGuides we used (6), and the MoveTimes of them (1 sec)

Select the last MoverGuide we used (MG6), and set its StayOpenTime to '7'

Select MG5 and set its StayOpenTime to '21'

Select MG4 and set its StayOpenTime to '35'

Select MG3 and set its StayOpenTime to '49'

Select MG2 and set its StayOpenTime to '63'

Select MG1 and set its StayOpenTime to '77'

See the pattern? 

The last thing to do is figure out when line 6 of Disp2 should be called to make it an endless loop (so the platform keeps moving). Dispatchers can't call (activate) themselves, but they can call a second dispatcher, which in turn can call the first dispatcher (in 0.0 seconds!). As you may have noted, the DelayTimes in dispatchers count up from 0 at each OutEvent they come to. So...

After MG6 is called, we have to start counting. It takes...

7 seconds to get to its last key (0 base - also the starting point of the monorail)

7 seconds to stay there (its StayOpenTime)

7 seconds to get back to its first key

7 seconds to for MG5 to travel back to its first key

7 seconds to for MG4 to travel back to its first key

7 seconds to for MG3 to travel back to its first key

7 seconds to for MG2 to travel back to its first key

7 seconds for MG1 to get to its first key (also the starting point of the monorail)

7 seconds for it to wait before you have it go again 

This adds up to 63. So we put in '63' at line (6) of Mdisp1's OutDelays

Now select Mdisp2 and open Properties &gt; Dispatcher, and expand OutDelays and OutEvents. 

Set line (0) of OutDelays to '0'

Set line (0) of OutEvents to 'Mdisp1'

So after the platform has gone around it route, paused, and returned... Mdisp1 activates Mdisp2 which in turn activates Mdisp1 and the platform heads off again.

If you look at the small sample map, you can see the MoverGuides in action. 

If you open the Monorail map, you'll see there are two monorails, blue and red. I first laid out the blue monorail's MoverGuides (BMONO1-8). When I added in the red monorails MoverGuides (RMONO1-8) opposite the first one, I put its first MoverGuide on top of the blue Monorail1's 5th key frame. (Each of these monorails have 8 MoverGuides, and the 5th key frame is the halfway point). 

You can download this tutorial, a small monorail map, and the tutorial map here...

http://www.planetunreal.com/prefabl...ailtutorial.zip

==Coments ==

'''Sett:''' : I posted this tute' on Pitboy's behalf.

More to come!

'''SabbathCat:''' : The download link is broken. Can't find on google. Anyone from prefablab got fileplanet access? :)

'''Ticalion:''' : Your gonna love me '''SabbathCat''' we have it hosted over at UTmaniac :) the link to the Download is 

http://www.utmaniac.com/sitestuff/ut2k3featured/monorailfiles/monorailtutorial.zip

----

[[:Category:Legacy Mapping]] &lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; format this page
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mr Evil</title>
    <id>1833</id>
    <revision>
      <id>4500</id>
      <timestamp>2003-10-29T23:49:55Z</timestamp>
      <contributor>
        <ip>Shuriken</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Finally joined the Wiki!

I've dabbled with UScript since Unreal, but only really got into it with UT2003.

You can see all the mods and things I have done on my website: http://come.to/MrEvil (in the 'Unreal/UT' section).

I suppose there's not much point having this page unless I put stuff on it, so here goes:

==Unreal==

It all started with mapping for Unreal. Here's a quick list of Unreal maps I made, which may still be around somewhere:
; DM3BedroomDetachedHouse
; DMConcentric
; DMMorning
; DMPetShop
; DMRelativity
; DMRelativityU4E (for the U4E mod)
; DMToS
; DMVertiginous

==UT==

Continued mapping when UT came out. Again, I haven't kept these available to the public anywhere, but they're bound to still exist out there somewhere:
; CTF-Hamster
; CTF-Morning
; DM-Concentric][
; DM-Hamster
; DM-Relativity][
; DM-Vertiginous][
; DOM-Hamster

==UT2003==

===Maps===

Did more mapping when UT2003 appeared, but decided to give it up because it requires modelling/skinning skills which I don't have.
; [http://www.cheese83.freeserve.co.uk/unreal/dm-serenity.htm DM-Serenity] The first one, made just as an experiment.
; [http://www.cheese83.freeserve.co.uk/unreal/ctf-brokengorge.htm CTF-BrokenGorge] Made using fractals. Quite successful actually.
; [http://www.cheese83.freeserve.co.uk/unreal/br-brokengorge.htm BR-BrokenGorge] BR version, because I like BR.

===Mods/Mutators===

Realizing that mapping is now too much like hard work, I put my meagre programming ability to use and put some effort into learning UScript properly, and it's turned out quite well (I get several thousand downloads of my mods per month from my site alone, and thousands more from places like UT2003HQ, and of course I enjoy making this stuff).. Anyway, here's a list:
; [http://www.cheese83.freeserve.co.uk/unreal/bootsofjumping.htm Boots of Jumping] The first bit of UT2003 scripting I did. Made so that mappers can make more authentic remakes of Unreal/UT maps.
; [http://www.cheese83.freeserve.co.uk/unreal/triggerflags.htm Trigger Flags] More stuff for mappers, to allow stuff to be triggered when the flag is taken/returned (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/nali_bricks.htm Nali Bricks] Breakout clone!
; [http://www.cheese83.freeserve.co.uk/unreal/gibalicious.htm Gibalicious] Increases gore to sickening levels (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/radiation_poisoning.htm Radiation Poisoning] Redemmer Arena (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/aerialview.htm Aerial View] A combination of three previous mutators, giving players the ability to fly with a pair of wings, a proper 3rd person view and a jump arena (gives everyone the jump boots listed above).
; [http://www.cheese83.freeserve.co.uk/unreal/woe.htm Weapons of Evil] A complete weapon replacement mod, plus the Sentinel automatic cannon. I made a weapon early on, and enjoyed it so much I made ten more.

===Other stuff===
; [http://www.lawdogs-mod.com/ LawDogs] I'm a coder for this mod.

===Disscussion ===

'''Mosquito:''' seems like you're becoming the Angelheart of coding. :D

'''Foxpaw:''' I read the readme on your map CTF-BrokenGorge and it asked for feedback, so I thought I'd post some here. I thought it was pretty good, I'm quite a fan of &quot;terrain maps&quot; even though a lot of people bash them. All around I like it but if you would like me to nitpick there was two things that kind of bugged me:
* The start points all (or at least most) faced you toward the link gun near your base, then you have to turn to go toward your base. I felt that the &quot;flow&quot; of the map wanted to carry me forward after picking up the link gun instead of turning and I often ended up running into the dead end there.
* Sometimes I had a hard time finding my way around, and I'd just stumble around in the jungle for ages without seeing a base, friendly or the enemies. I think I was going around in circles.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4501</id>
      <timestamp>2003-09-24T18:01:05Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Finally joined the Wiki!

I've dabbled with UScript since Unreal, but only really got into it with UT2003.

You can see all the mods and things I have done on my website: http://come.to/MrEvil (in the 'Unreal/UT' section).

I suppose there's not much point having this page unless I put stuff on it, so here goes:

==Unreal==

It all started with mapping for Unreal. Here's a quick list of Unreal maps I made, which may still be around somewhere:
; DM3BedroomDetachedHouse
; DMConcentric
; DMMorning
; DMPetShop
; DMRelativity
; DMRelativityU4E (for the U4E mod)
; DMToS
; DMVertiginous

==UT==

Continued mapping when UT came out. Again, I haven't kept these available to the public anywhere, but they're bound to still exist out there somewhere:
; CTF-Hamster
; CTF-Morning
; DM-Concentric][
; DM-Hamster
; DM-Relativity][
; DM-Vertiginous][
; DOM-Hamster

==UT2003==

===Maps===

Did more mapping when UT2003 appeared, but decided to give it up because it requires modelling/skinning skills which I don't have.
; [http://www.cheese83.freeserve.co.uk/unreal/dm-serenity.htm DM-Serenity] The first one, made just as an experiment.
; [http://www.cheese83.freeserve.co.uk/unreal/ctf-brokengorge.htm CTF-BrokenGorge] Made using fractals. Quite successful actually.
; [http://www.cheese83.freeserve.co.uk/unreal/br-brokengorge.htm BR-BrokenGorge] BR version, because I like BR.

===Mods/Mutators===

Realizing that mapping is now too much like hard work, I put my meagre programming ability to use and put some effort into learning UScript properly, and it's turned out quite well (I get several thousand downloads of my mods per month from my site alone, and thousands more from places like UT2003HQ, and of course I enjoy making this stuff).. Anyway, here's a list:
; [http://www.cheese83.freeserve.co.uk/unreal/bootsofjumping.htm Boots of Jumping] The first bit of UT2003 scripting I did. Made so that mappers can make more authentic remakes of Unreal/UT maps.
; [http://www.cheese83.freeserve.co.uk/unreal/triggerflags.htm Trigger flags] More stuff for mappers, to allow stuff to be triggered when the flag is taken/returned (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/nali_bricks.htm Nali Bricks] Breakout clone!
; [http://www.cheese83.freeserve.co.uk/unreal/gibalicious.htm Giablicious] Increases gore to sickening levels (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/radiation_poisoning.htm Radiation Poisoning] Redemmer Arena (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/aerialview.htm Aerial View] A combination of three previous mutators, giving players the ability to fly with a pair of wings, a proper 3rd person view and a jump arena (gives everyone the jump boots listed above).
; [http://www.cheese83.freeserve.co.uk/unreal/woe.htm Weapons of Evil] A complete weapon replacement mod, plus the Sentinel automatic cannon. I made a weapon early on, and enjoyed it so much I made ten more.

===Other stuff===
; [http://www.lawdogs-mod.com/ LawDogs] I'm a coder for this mod.

===Disscussion ===

'''Mosquito:''' seems like you're becoming the Angelheart of coding. :D
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4502</id>
      <timestamp>2003-09-26T01:29:28Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Finally joined the Wiki!

I've dabbled with UScript since Unreal, but only really got into it with UT2003.

You can see all the mods and things I have done on my website: http://come.to/MrEvil (in the 'Unreal/UT' section).

I suppose there's not much point having this page unless I put stuff on it, so here goes:

==Unreal==

It all started with mapping for Unreal. Here's a quick list of Unreal maps I made, which may still be around somewhere:
; DM3BedroomDetachedHouse
; DMConcentric
; DMMorning
; DMPetShop
; DMRelativity
; DMRelativityU4E (for the U4E mod)
; DMToS
; DMVertiginous

==UT==

Continued mapping when UT came out. Again, I haven't kept these available to the public anywhere, but they're bound to still exist out there somewhere:
; CTF-Hamster
; CTF-Morning
; DM-Concentric][
; DM-Hamster
; DM-Relativity][
; DM-Vertiginous][
; DOM-Hamster

==UT2003==

===Maps===

Did more mapping when UT2003 appeared, but decided to give it up because it requires modelling/skinning skills which I don't have.
; [http://www.cheese83.freeserve.co.uk/unreal/dm-serenity.htm DM-Serenity] The first one, made just as an experiment.
; [http://www.cheese83.freeserve.co.uk/unreal/ctf-brokengorge.htm CTF-BrokenGorge] Made using fractals. Quite successful actually.
; [http://www.cheese83.freeserve.co.uk/unreal/br-brokengorge.htm BR-BrokenGorge] BR version, because I like BR.

===Mods/Mutators===

Realizing that mapping is now too much like hard work, I put my meagre programming ability to use and put some effort into learning UScript properly, and it's turned out quite well (I get several thousand downloads of my mods per month from my site alone, and thousands more from places like UT2003HQ, and of course I enjoy making this stuff).. Anyway, here's a list:
; [http://www.cheese83.freeserve.co.uk/unreal/bootsofjumping.htm Boots of Jumping] The first bit of UT2003 scripting I did. Made so that mappers can make more authentic remakes of Unreal/UT maps.
; [http://www.cheese83.freeserve.co.uk/unreal/triggerflags.htm Trigger flags] More stuff for mappers, to allow stuff to be triggered when the flag is taken/returned (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/nali_bricks.htm Nali Bricks] Breakout clone!
; [http://www.cheese83.freeserve.co.uk/unreal/gibalicious.htm Giablicious] Increases gore to sickening levels (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/radiation_poisoning.htm Radiation Poisoning] Redemmer Arena (made on request).
; [http://www.cheese83.freeserve.co.uk/unreal/aerialview.htm Aerial View] A combination of three previous mutators, giving players the ability to fly with a pair of wings, a proper 3rd person view and a jump arena (gives everyone the jump boots listed above).
; [http://www.cheese83.freeserve.co.uk/unreal/woe.htm Weapons of Evil] A complete weapon replacement mod, plus the Sentinel automatic cannon. I made a weapon early on, and enjoyed it so much I made ten more.

===Other stuff===
; [http://www.lawdogs-mod.com/ LawDogs] I'm a coder for this mod.

===Disscussion ===

'''Mosquito:''' seems like you're becoming the Angelheart of coding. :D

'''Foxpaw:''' I read the readme on your map CTF-BrokenGorge and it asked for feedback, so I thought I'd post some here. I thought it was pretty good, I'm quite a fan of &quot;terrain maps&quot; even though a lot of people bash them. All around I like it but if you would like me to nitpick there was two things that kind of bugged me:
* The start points all (or at least most) faced you toward the link gun near your base, then you have to turn to go toward your base. I felt that the &quot;flow&quot; of the map wanted to carry me forward after picking up the link gun instead of turning and I often ended up running into the dead end there.
* Sometimes I had a hard time finding my way around, and I'd just stumble around in the jungle for ages without seeing a base, friendly or the enemies. I think I was going around in circles.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mr. SlackPants</title>
    <id>2145</id>
    <revision>
      <id>5223</id>
      <timestamp>2004-01-28T16:31:08Z</timestamp>
      <contributor>
        <ip>Mr. SlackPants</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Mr. SlackPants. 

Yeah i also created the MrSlackPants page, but i really find those login ID's very annoying, forgat the one i had. :) 

http://www22.brinkster.com/mrslackpants/

marvinraymakers@hotmail.com if for any reason you want to contact me.

Greetings and enjoy,

Mr. SlackPants</text>
    </revision>
    <revision>
      <id>5224</id>
      <timestamp>2004-01-28T15:48:54Z</timestamp>
      <contributor>
        <ip>Mr. SlackPants</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Mr. SlackPants. 

Yeah i also created the MrSlackPants page, but i really find those login ID's very annoying, forgat the one i had. :) 

http://www22.brinkster.com/mrslackpants/

Greetings and enjoy,

Mr. SlackPants</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mr.Bob</title>
    <id>2171</id>
    <revision>
      <id>5277</id>
      <timestamp>2004-06-22T15:28:51Z</timestamp>
      <contributor>
        <ip>165.155.128.xxx</ip>
      </contributor>
      <comment>*added link</comment>
      <text xml:space="preserve">My name is not Bob, but I want you to call me that

I have no website, but my 10 year old brother does (the site is http://home.earthlink.net/~doodlethe1/ &lt;tt&gt;&lt;---- there&lt;tt&gt;

I recently made a .zip addition to the [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] page

I am a newb, however I'm getting better

Becuase my goal on this wiki is to help out newbs you can address me as the &quot;newb master&quot;

Will someone please please please :D make a page that will tell me how to make a mutator GUI for UT2004

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Brother]]'s page

----

Write whatever you want here:

'''EntropicLqd:'''  I believe the page you are looking for is [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]].  You may also find [[Legacy:Power Core Volume Control Mutator|Power Core Volume Control Mutator]] useful (maybe).  Welcome to the Wiki btw.  Hope you enjoy your stay here :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5278</id>
      <timestamp>2004-06-20T19:15:14Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Welcome to the wiki.</comment>
      <text xml:space="preserve">My name is not Bob, but I want you to call me that

I have no website, but my 10 year old brother does (the site is http://home.earthlink.net/~doodlethe1/ &lt;tt&gt;&lt;---- there&lt;tt&gt;

I recently made a .zip addition to the [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] page

I am a newb, however I'm getting better

Becuase my goal on this wiki is to help out newbs you can address me as the &quot;newb master&quot;

Will someone please please please :D make a page that will tell me how to make a mutator GUI for UT2004

----

Write whatever you want here:

'''EntropicLqd:'''  I believe the page you are looking for is [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]].  You may also find [[Legacy:Power Core Volume Control Mutator|Power Core Volume Control Mutator]] useful (maybe).  Welcome to the Wiki btw.  Hope you enjoy your stay here :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mr.Bob/Brother</title>
    <id>2173</id>
    <revision>
      <id>5281</id>
      <timestamp>2004-06-22T15:24:40Z</timestamp>
      <contributor>
        <ip>165.155.160.xxx</ip>
      </contributor>
      <comment>*creationnnnnn</comment>
      <text xml:space="preserve">I am Mr.Bob's brother,Doodle77.

Unrealscript is my first compiled language but i already know HTML, Javascript, some Python, and MS DOS batch files. suprisingly i am only 11. i am not good at writing alot so im going to stop soon. other games i play are: Mitown Madness 2, Starcraft, Warcraft III and SimTower(dont ask). 
 

===Comments...===</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mr.Mitchell</title>
    <id>2112</id>
    <revision>
      <id>5145</id>
      <timestamp>2005-07-03T16:30:25Z</timestamp>
      <contributor>
        <ip>Ip24-254-243-107.hr.hr.cox.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">I finally made my own page on the Wiki. Just to show a bit of my UT history.

===Mods I worked/working on===
*[http://www..html DoubleJumpUT] - Brings DoubleJumping from UT2003 to UT. 
*[http://home.ict.nl/~mweterin/unreal/projects/serverutils.html ServerUtils] - A few utilities that help me running my server. 
**MutatorAdder - Allows you to add mutators through the UT.ini file. Very helpfull when you don't have acces to the server commandline.
**ForceGamtype - When my server crashes and reboots it always starts with DeathMatch. If you want it to come up with another gametype (and have no acces to the servers commandline) this is the mutator you are looking for.
**BotAdder - Adds bots to the level based on the amount of players recommended by the mapper.
*[http://home.ict.nl/~mweterin/unreal/projects/dimthelights.html Dim the Lights] - Allows to dim or brighten the lights in a level. 
*[http://home.ict.nl/~mweterin/unreal/projects/flakminecannon.html FlakmineCannon]- A modified FlakCannon which shoots mines that stick to walls and explode when shot at or when someone comes to close.
*[http://home.ict.nl/~mweterin/unreal/projects/playerspeedmutator.html PlayerSpeed] - Allows you to change the walkingspeed, swimmingspeed and jumpspeed of all players.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5146</id>
      <timestamp>2003-12-22T11:57:46Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">I finally made my own page on the Wiki. Just to show a bit of my UT history.

===Mods I worked/working on===
*[http://www.planetunreal.com/airfight AirfightUT] Flightsim mod for UT.
*[http://www.esconline.org/ Esc] The nightclub mod for UT.
*[http://www.unrealbadlands.com Unreal Badlands] The western mod for UT. 

===My own projects===

These projects can be found on [http://home.ict.nl/~mweterin/unreal/ my site]

The links below link to the corresponding section on my site.
*[http://home.ict.nl/~mweterin/unreal/projects/doublejumput.html DoubleJumpUT] - Brings DoubleJumping from UT2003 to UT. 
*[http://home.ict.nl/~mweterin/unreal/projects/serverutils.html ServerUtils] - A few utilities that help me running my server. 
**MutatorAdder - Allows you to add mutators through the UT.ini file. Very helpfull when you don't have acces to the server commandline.
**ForceGamtype - When my server crashes and reboots it always starts with DeathMatch. If you want it to come up with another gametype (and have no acces to the servers commandline) this is the mutator you are looking for.
**BotAdder - Adds bots to the level based on the amount of players recommended by the mapper.
*[http://home.ict.nl/~mweterin/unreal/projects/dimthelights.html Dim the Lights] - Allows to dim or brighten the lights in a level. 
*[http://home.ict.nl/~mweterin/unreal/projects/flakminecannon.html FlakmineCannon]- A modified FlakCannon which shoots mines that stick to walls and explode when shot at or when someone comes to close.
*[http://home.ict.nl/~mweterin/unreal/projects/playerspeedmutator.html PlayerSpeed] - Allows you to change the walkingspeed, swimmingspeed and jumpspeed of all players.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mr.Mitchell/Developer Journal</title>
    <id>2113</id>
    <revision>
      <id>5147</id>
      <timestamp>2003-12-22T11:53:53Z</timestamp>
      <contributor>
        <ip>Mr.Mitchell</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==2003-08-04==

Since this journal start halfway the development I will give a shot explanation.

DoubleJumpUT brings doublejumping from UT2003 to UT. After I played UT2003 and returned to UT I missed the doublejumping. I know that the MatrixMoves mutator has DoubleJumping, but it changes the playerclass and thus makes it incompatible with mods. The mutator will support Double, Triple, Quad and EndlessJump with the following jumpmodes AtApex, UpAndAtApex and Always. The design is so that will not use a special playerpawn but will somehow get access to the Jump keys.

Right now everything works in singleplayer, I just have to get things working on-line.

OK, I finally figured out that the functionreplication to the client only works when the function is simulated. Now I only have to figure out why the functionreplication to the server won't work.

----

The Wiki doesn't seem to like the . in my nick :-) since I am really sure that I did NOT type Mr.Developer Journal

'''Corran:''' Mr.DeveloperJournal is a good name for it anyway. :D

'''Foxpaw:''' You might want to consider using a replicated variable instead of a function. Functions make more sense logically but sometimes a replicated function call can get lost and they can be a bit flaky at times.

----

Hmmm, keeping this page up-to-date did not work out. I recently looked at my harddisk and found some unfinished mods. I finished DoubleJumpUT, so you can get it at my site.
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5148</id>
      <timestamp>2003-09-04T23:26:49Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==2003-08-04==

Since this journal start halfway the development I will give a shot explanation.

DoubleJumpUT brings doublejumping from UT2003 to UT. After I played UT2003 and returned to UT I missed the doublejumping. I know that the MatrixMoves mutator has DoubleJumping, but it changes the playerclass and thus makes it incompatible with mods. The mutator will support Double, Triple, Quad and EndlessJump with the following jumpmodes AtApex, UpAndAtApex and Always. The design is so that will not use a special playerpawn but will somehow get access to the Jump keys.

Right now everything works in singleplayer, I just have to get things working on-line.

OK, I finally figured out that the functionreplication to the client only works when the function is simulated. Now I only have to figure out why the functionreplication to the server won't work.

----

The Wiki doesn't seem to like the . in my nick :-) since I am really sure that I did NOT type Mr.Developer Journal

'''Corran:''' Mr.DeveloperJournal is a good name for it anyway. :D

'''Foxpaw:''' You might want to consider using a replicated variable instead of a function. Functions make more sense logically but sometimes a replicated function call can get lost and they can be a bit flaky at times.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MrSlackPants</title>
    <id>2088</id>
    <revision>
      <id>5086</id>
      <timestamp>2003-10-17T21:42:40Z</timestamp>
      <contributor>
        <ip>MrSlackPants</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Mr. SlackPants, that would be me. 

Currently (29 - 04 - 2003) i'm mapping for the mod UnrealSpeed, a racing mod for UT2K3. 

You can find the mod at http://www.planetunreal.com/unrealspeed

Also if you want a little more info on what i'm working on at the moment you can go to my website.

Just go to http://smarf3.tripod.com

Greetings and enjoy,

Mr. SlackPants

----

'''Wormbo:''' Why didn't anyone notice the new guy? Anyway, welcome to the Wiki. :)

'''Mosquito:''' Hey, welcome.  That map you got on hold... It looks amazing.  Can't wait to try it.

Mr. SlackPants: Phew been a while, didn't expext anyone would end up on this page. Kinda needs to get used to this &quot;i-can-change-everything&quot; type of website. Anyway thanks for the welcome. (although it was probaly 4 months ago ;) )

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5087</id>
      <timestamp>2003-05-23T15:19:44Z</timestamp>
      <contributor>
        <ip>Mosquito</ip>
      </contributor>
      <comment>Comments</comment>
      <text xml:space="preserve">Mr. SlackPants, that would be me. 

Currently (29 - 04 - 2003) i'm mapping for the mod UnrealSpeed, a racing mod for UT2K3. 

You can find the mod at http://www.planetunreal.com/unrealspeed

Also if you want a little more info on what i'm working on at the moment you can go to my website.

Just go to http://smarf3.tripod.com

Greetings and enjoy,

Mr. SlackPants

----

'''Wormbo:''' Why didn't anyone notice the new guy? Anyway, welcome to the Wiki. :)

'''Mosquito:''' Hey, welcome.  That map you got on hold... It looks amazing.  Can't wait to try it.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MtTracer</title>
    <id>2114</id>
    <revision>
      <id>5149</id>
      <timestamp>2004-08-28T01:20:54Z</timestamp>
      <contributor>
        <ip>MtTracer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

There's not much to tell about me.

I am a german guy who is addicted to the UnrealEngine.

With UT2003 I started scripting weapons and gimmicks for my

own fun. For a short time I was a member of the french UT2k3 Stargate SG1

mod-team.

Now I started my own TotalConversation called LastBattle.

As long as I am not finished with the website which is neccesary to

get a good team, I am working on this mod alone with my mate.

Any questions? ;)

Who are you!?

'''RDGDanClark:''' I am I. Who are you?&lt;br /&gt;   Welcome to the Wiki. What's up?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5150</id>
      <timestamp>2003-09-08T07:12:49Z</timestamp>
      <contributor>
        <ip>RDGDanClark</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Who are you!?

'''RDGDanClark:''' I am I. Who are you?&lt;br /&gt;   Welcome to the Wiki. What's up?</text>
    </revision>
    <revision>
      <id>5151</id>
      <timestamp>2004-08-28T01:15:03Z</timestamp>
      <contributor>
        <ip>MtTracer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About Me===

There's not much to tell about me.

I am a german guy who is addicted to the UnrealEngine.

With UT2003 I started scripting weapons and gimmicks for my

own fun. For a short time I was a member of the french UT2k3 Stargate SG1

mod-team.

Now I started my own TotalConversation called LastBattle.

As long as I am not finished with the website which is neccesary to

get a good tea, I am working on this mod alone with my mate.

Any questions? ;)

Who are you!?

'''RDGDanClark:''' I am I. Who are you?&lt;br /&gt;   Welcome to the Wiki. What's up?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44079</id>
      <timestamp>2010-10-24T13:46:40Z</timestamp>
      <contributor>
        <ip>178.25.85.205</ip>
      </contributor>
      <comment>Replaced content with 'removed by author'</comment>
      <text xml:space="preserve">removed by author</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MuiTsai</title>
    <id>2092</id>
    <revision>
      <id>5096</id>
      <timestamp>2004-10-06T14:45:11Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>reverted (not that there was any content here before anyway, but meh.)</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki, MuiTsai. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5097</id>
      <timestamp>2004-10-06T14:03:13Z</timestamp>
      <contributor>
        <ip>E0.cache02.davidson.tn.ena.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">weeeee</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mulch D</title>
    <id>2178</id>
    <revision>
      <id>5289</id>
      <timestamp>2005-02-22T21:03:57Z</timestamp>
      <contributor>
        <ip>Mulch D</ip>
      </contributor>
      <comment>I got older :P</comment>
      <text xml:space="preserve">Hey my name is really '''Mulch_D''' (Note the underscore) so could an admin please fix this up in the page's title?

===About Me===

====How I got here====

I have been using the Wiki for about a year now, but only as a resource, so I never had anything to add. But lately I have been experimenting with the new engine a bit more and have found some things to add, so here I am.

====Who I am====

My name is Mulch_D online or Jakob Arundel in real life, I'm 16 years old and live in Melbourne, Australia. I'm obsessed with the Unreal series, and they are easily my &lt;strike&gt;favorite&lt;/strike&gt; favourite computer games.

I'm currently in year 11 (VCE) at school and hope to become an &lt;strike&gt;Archetect&lt;/strike&gt; Architect when I am older (I also want to be bigger ;)).

====What I do====

I'm a low to medium level mapper, I also spend a lot of my time testing the work of others (whether they asked me to or not), so If you have anything you want tested just  [http://wiki.beyondunreal.com/wiki/Mulch_D#0.0.1.5 get in touch with me].

====Past Works====

I have never actually finished a map or anything but I have one in the works now, but it is in it's very early stages (as in amazing ly early design), so I can't say much.

====How to contact me====

My website is at http://www.freewebs.com/mulch_d/ but this is still being worked on.

My e-mail address is mulch AT swiftdsl DOT com DOT au

My MSN is jakea23@hotmail.com

This is my usually forum Avatar. -&gt; http://www.alphalink.com.au/~justina/jake/MulchAvartar.gif
 
;Note: I can't spell, so it would be greatly &lt;strike&gt;apreaciated&lt;/strike&gt; appreciated if someone could read over the pages I edit for spelling errors (I once got 15 out of 50 on a spelling test :()

----

==Comments ==

'''LegalAssassin:''' Welcome to the Wiki!

'''Mulch_D:''' Thanks.

'''Tomo:''' Cool, you can edit this. hey mulch :D:D:D

'''Mulch_D:''' Hey Tomo

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5290</id>
      <timestamp>2005-02-15T00:03:52Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">Hey my name is really '''Mulch_D''' (Note the underscore) so could an admin please fix this up in the page's title?

===About Me===

====How I got here====

I have been using the Wiki for about a year now, but only as a resource, so I never had anything to add. But lately I have been experimenting with the new engine a bit more and have found some things to add, so here I am.

====Who I am====

My name is Mulch_D online or Jakob Arundel in real life, I'm 15 (almost 16 :D) years old and live in Melbourne, Australia. I'm obsessed with the Unreal series, and they are easily my &lt;strike&gt;favorite&lt;/strike&gt; favourite computer games.

I'm currently in year 11 (VCE) at school and hope to become an &lt;strike&gt;Archetect&lt;/strike&gt; Architect when I am older (I also want to be bigger ;)).

====What I do====

I'm a low to medium level mapper, I also spend a lot of my time testing the work of others (whether they asked me to or not), so If you have anything you want tested just  [http://wiki.beyondunreal.com/wiki/Mulch_D#0.0.1.5 get in touch with me].

====Past Works====

I have never actually finished a map or anything but I have one in the works now, but it is in it's very early stages (as in amazing ly early design), so I can't say much.

====How to contact me====

My website is at http://www.freewebs.com/mulch_d/ but this is still being worked on.

My e-mail address is mulch AT swiftdsl DOT com DOT au

My MSN is jakea23@hotmail.com

This is my usually forum Avatar. -&gt; http://www.alphalink.com.au/~justina/jake/MulchAvartar.gif
 
;Note: I can't spell, so it would be greatly &lt;strike&gt;apreaciated&lt;/strike&gt; appreciated if someone could read over the pages I edit for spelling errors (I once got 15 out of 50 on a spelling test :()

----

==Comments ==

'''LegalAssassin:''' Welcome to the Wiki!

'''Mulch_D:''' Thanks.

'''Tomo:''' Cool, you can edit this. hey mulch :D:D:D

'''Mulch_D:''' Hey Tomo

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MultiItem</title>
    <id>1828</id>
    <revision>
      <id>4485</id>
      <timestamp>2007-11-19T16:50:03Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; MultiItem (Package: ChaosUT)}}

A special actor used in Chaos UT maps which cycles through a list of up to four actor classes and spawns them.

See [[Legacy:MultiPickupBase|MultiPickupBase]] for a UT2003 version of this class.

(Information below is based on Chaos UT Beta 4.)

==Properties ==

====MultiItem group ====
; class&lt;[[Legacy:Actor|Actor]]&gt; Item1, Item2, Item3, Item4 : The classes which should be spawned.
; float Duration1, Duration2, Duration3, Duration4 : The time each item stays on the map before the next one is spawned.
; vector LocationOffset1, LocationOffset2, LocationOffset3, LocationOffset4 : An offset value for the spawned actor's location.
; int NumItems : The actual number of item slots used.
; int StartOffset : Aditional time for the first item ever spawned.

====Script-only ====
; bool bWeaponsStay :
; bool bStarted :
; [[Legacy:Actor|Actor]] CurItem :
; vector SpawnLoc :
; Sound EffectSound :

==Similar Classes ==
* [[Legacy:EnhancedItems|MultiPickupPlus]] class in the [[Legacy:EnhancedItems|EnhancedItems]] package
* [[Legacy:MultiPickupBase|MultiPickupBase]]

[[Category:Legacy Custom Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4486</id>
      <timestamp>2002-08-19T15:07:12Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; MultiItem}}

A special actor used in Chaos UT maps which cycles through a list of up to four actor classes and spawns them.

(Information below is based on Chaos UT Beta 4.)

==Properties ==

====MultiItem group ====
; class&lt;[[Legacy:Actor|Actor]]&gt; Item1, Item2, Item3, Item4 : The classes which should be spawned.
; float Duration1, Duration2, Duration3, Duration4 : The time each item stays on the map before the next one is spawned.
; vector LocationOffset1, LocationOffset2, LocationOffset3, LocationOffset4 : An offset value for the spawned actor's location.
; int NumItems : The actual number of item slots used.
; int StartOffset : Aditional time for the first item ever spawned.

====Script-only ====
; bool bWeaponsStay :
; bool bStarted :
; [[Legacy:Actor|Actor]] CurItem :
; vector SpawnLoc :
; Sound EffectSound :

==Related topics ==
* [[Legacy:EnhancedItems|MultiPickupPlus]] class in the [[Legacy:EnhancedItems|EnhancedItems]] package

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4487</id>
      <timestamp>2003-05-25T14:49:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Inventory (UT)|Inventory (UT)]] &gt;&gt; MultiItem (Package: ChaosUT)}}

A special actor used in Chaos UT maps which cycles through a list of up to four actor classes and spawns them.

See [[Legacy:MultiPickupBase|MultiPickupBase]] for a UT2003 version of this class.

(Information below is based on Chaos UT Beta 4.)

==Properties ==

====MultiItem group ====
; class&lt;[[Legacy:Actor|Actor]]&gt; Item1, Item2, Item3, Item4 : The classes which should be spawned.
; float Duration1, Duration2, Duration3, Duration4 : The time each item stays on the map before the next one is spawned.
; vector LocationOffset1, LocationOffset2, LocationOffset3, LocationOffset4 : An offset value for the spawned actor's location.
; int NumItems : The actual number of item slots used.
; int StartOffset : Aditional time for the first item ever spawned.

====Script-only ====
; bool bWeaponsStay :
; bool bStarted :
; [[Legacy:Actor|Actor]] CurItem :
; vector SpawnLoc :
; Sound EffectSound :

==Similar Classes ==
* [[Legacy:EnhancedItems|MultiPickupPlus]] class in the [[Legacy:EnhancedItems|EnhancedItems]] package
* [[Legacy:MultiPickupBase|MultiPickupBase]]

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MultiKillMessage</title>
    <id>28366</id>
    <revision>
      <id>40034</id>
      <timestamp>2009-11-15T07:55:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MultiPickup</title>
    <id>2194</id>
    <revision>
      <id>5321</id>
      <timestamp>2004-10-17T06:55:32Z</timestamp>
      <contributor>
        <ip>Kamek</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Postal 2|Postal 2]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pickup|Pickup]] &gt;&gt; [[Legacy:P2PowerupPickup|P2PowerupPickup]] &gt;&gt; MultiPickup (Package: Inventory)}}

A pickup that cycles through a list of different pickups. For example, it could be a rocket launcher, then a health pipe, then some kevlar.

==Properties==

===Main===
; array&lt; class&lt;[[Legacy:Pickup|Pickup]]&gt; &gt; PickupClasses : List of pickup classes to cycle through. Set by the mapmaker in UnrealEd.
; bool bRandomize : True to pick random pickups, false to go in order.

===Hidden===
; array&lt;Pickup&gt; PickupList
; int CurrentIndex

==Important Functions==
; SwapClass(class&lt;[[Legacy:Pickup|Pickup]]&gt; RemoveThis, class&lt;[[Legacy:Pickup|Pickup]]&gt; Replacer) : Allows you to replace certain classes within the MultiPickup. This should be called within your [[Legacy:Mutator|mutator]] if you replace pickup classes.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]

[[Category:Legacy Class (P2)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MultiPickupBase</title>
    <id>2093</id>
    <revision>
      <id>5098</id>
      <timestamp>2007-11-19T16:51:04Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:XPickUpBase|xPickUpBase]] &gt;&gt; MultiPickupBase (Package: MultiPickup)}}

The MultiPickupBase is an [[Legacy:XPickUpBase|xPickUpBase]] subclass similar to the [[Legacy:WildcardBase|WildcardBase]] which can spawn different types of [[Legacy:Pickup|pickup]]s.

It was made for Chaos UT 2: Evolution by [[Legacy:Wormbo|Wormbo]] to replace the limited [[Legacy:MultiItem|MultiItem]] used in the UT version and add features similar to those available in the [[Legacy:EnhancedItems|MultiPickupPlus]] class. All pickup types are supported and you can add as many as you like.

By default the first pickups is selected randomly, but you can also specify one of the pickups in the list. A new pickup will always be spawned after the current one has been picked up (after that pickup's RespawnTime), but you can also enable respawning after a certain time interval. In this case every pickup can have its own interval or use the default interval. The pickups can either be spawned in sequential or random order. In random order every pickup can have different chances to spawn. Pickups with a higher rating will spawn more often than those with a lower rating.

The MultiPickupBase is designed to work when placed in a map and when created by a mutator. See ''Using the MultiPickupBase In A Mutator'' below.

==Download==

Just extract the files to your UT2003\System directory and you're ready to use it.

http://www.koehler-homepage.de/Wormbo/downloads/UT2003/MultiPickup.zip (15 kB)

==Properties ==

===PickUpBase Group (inherited from [[Legacy:XPickUpBase|xPickUpBase]])===
; class&lt;[[Legacy:Pickup|Pickup]]&gt; PowerUp : The initial value of this property is not used by the MultiPickupBase.
; float SpawnHeight : With bNoVisibleBase=False pickups are spawned this distance above the pickup base. With bNoVisibleBase=True pickups are spawned this distance ''plus their CollisionHeight'' above the base.
; class&lt;[[Legacy:Emitter|Emitter]]&gt; SpiralEmitter : This emitter is spawned for the pickup base unless bNoVisibleBase is set to True.

===MultiPickupBase Group===
; bool bAllowReset : Advanced. Allows the gametype to reset the MultiPickupBase to its initial state when it resets the map.
; bool bChangeOnlyOnPickup (protected) : Setting this to True will cause a behavior similar to the WildcardBase: A new pickup will only be spawned after the previous one was picked up. Setting it to False means that the pickup will be replaced after a certain amount of time if it didn't get picked up.
; bool bNoVisibleBase : Hides the MultiPickupBase. Setting this to true causes the MultiPickupBase to be invisible and the SpiralEmitter will not be used. Also SpawnHeight works a bit differently. (see above)
; bool bRandomAfterPickup : If set to True this will override the bSequential property if the previous pickup was picked up by a player. The next pickup will be selected randomly then. Using this only makes sense when bChangeOnlyOnPickup is set to False.
; bool bSequential : This specifies whether new pickups should be spawned in the order they were listed. This doesn't affect the first pickup spawned.
; bool bTriggerable : Allows the mapper to trigger this MultiPickupBase. It will spawn a new pickup when triggered, regardless whether the previous pickup is still there (that pickup will be removed first) or was picked up.
; float DefaultDuration : The default duration for each pickup to stay around before another pickup is spawned. This has no effect if bChangeOnlyOnPickup is set to True.
; float DefaultSpawnRating : The default spawn rating for each pickup. This will affect both the random initial pickup selection and the random selection after pickup or timeout.
; array&lt;PickupType&gt; PickupTypes : Contains a list of pickups to spawn. You can set the PickupClass, Duration and SpawnRating for each pickup in the list. Both Duration and SpawnRating can be set to 0 to use the default duration or spawn rating respectively. See PickupType struct below.
; class&lt;[[Legacy:Actor|Actor]]&gt; RespawnEffectClass : This Actor will be spawned right before a new pickup is spawned. The default is UT2003's default respawn effect for pickups.
; float RespawnEffectTime : After spawning the respawn effect the MultiPickupBase will wait for this amount of time to pass before actually spawning the pickup.
; int StartingItem : Specifies, which pickup from the list is spawned when the map starts. Setting this to a negative value will randomly select a pickup from the list.

===Internal Variables===
; float AdditionalRespawnWait (protected) : Used to store the remaining sleeping time of the old pickup if it is in Sleeping state when it should be replaced. 
; bool bDebugMode (localized) : The MultiPickupBase has a built-in debug mode which causes log file output for its more important functionality. To enable this mode simply create or open the file MultiPickup.int in your UT2003\System directory and put the following two lines in it:&lt;pre&gt;
[MultiPickupBase]
bDebugMode=True&lt;/pre&gt;
; bool bInitialized (protected) : Whether the first pickup was spawned.
; bool bWasPickedUp (protected) : Set to true if the pickup should be replaced but was picked up already.
; int CurrentClass (protected) : Currently selected pickup list index.
; int NumClasses (protected) : Number of classes in the pickup list.
; [[Legacy:Pickup|Pickup]] oldPickup (protected) : Temporary reference to the old pickup before it gets destroyed.

==Structs==

===PickupType===
; float Duration : This specifies the duration in seconds the pickup stays available before it is replaced by another pickup if the MultiPickupBase is in &quot;timed pickup change&quot; mode. (bChangeOnlyOnPickup = False) Leave this 0 to use the DefaultDuration.
; class&lt;[[Legacy:Pickup|Pickup]]&gt; PickupClass : The Pickup class to spawn.
; float SpawnRating : A value greater than 0 that specifies, how often the pickup should be selected. A higher value (relative to the SpawnRatings of other pickups) means &quot;spawn more often&quot;. Set this to 0 to use the DefaultSpawnRating.

==Methods==

===Static Methods===

These functions are designed to be called from other classes, e.g. [[Legacy:Mutator|Mutator]]s, to create a new MultiPickupBase.
; MultiPickupBase ConvertToMPB ([[Legacy:Actor|Actor]] Other, optional string MPBClassName) [final] : Takes a Pickup or xPickupBase actor and converts it into a MultiPickupBase, which is returned. If the name of a MultiPickupBase class is specified, then that MultiPickupBase class is spawned and the original Pickup or the content of the xPickupBase is added to the new MultiPickupBase. This also works with a WildcardBase.&lt;br /&gt;If no MultiPickupBase class is specified, then a MultiPickup.xMultiPickupBase is spawned.
; MultiPickupBase ReplaceWithMPB ([[Legacy:Actor|Actor]] Other, optional string MPBClassName) [final] : Takes a Pickup or xPickupBase actor and replaces it with a MultiPickupBase, which is returned. If the name of a MultiPickupBase class is specified, then that MultiPickupBase class is spawned, otherwise a MultiPickup.xMultiPickupBase is spawned.&lt;br /&gt;If no MultiPickupBase class is specified, then a MultiPickup.xMultiPickupBase is spawned.

===Public Methods===
; bool AddPickup (coerce string NewClassName, optional float NewDuration, optional float NewRating) : Adds an item to this MultiPickupBase. A new item will only be added if it isn't present in the list.&lt;br /&gt;Returns true if the item already was in the list or was added successfully. (Used by mutators.)
; bool ItemIsIn (class&lt;[[Legacy:Pickup|Pickup]]&gt; TestClass) : Returns, whether a pickup class is already in this MultiPickupBase's list. Can be used by mutators to prevent adding items twice.
; SetChangeOnlyOnPickup (bool bNewChangeMode)&lt;br /&gt;bool GetChangeOnlyOnPickup ( ) : Accessor methods for bChangeOnlyOnPickup.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator) : Inherited from [[Legacy:Actor|Actor]]. The MultiPickupBase can be triggered to immediately spawn a new pickup.
; Reset ( ) : Inherited from [[Legacy:Actor|Actor]]. Resets the MultiPickupBase to its initial state.

==Using the MultiPickupBase==

===...in a Map===

First make sure the MultiPickup package is loaded by either adding it to the EditPackage list in UT2003.ini or by manualy loading MultiPickup.u from the [[Legacy:Actor Classes|Actor Classes]] browser.

To use MultiPickupBase just place it in the map like you would place any other pickup base. Unlike the [[Legacy:WildcardBase|WildcardBase]] a MultiPickupBase initialy doesn't have any pickups in its list, so open its [[Legacy:Actor Properties|Actor Properties]] and go to the MultiPickupBase group to add pickups and change other options.

===...in a Mutator===

MultiPickupBases have their bStatic property set to true, i.e. they can't be spawned from a mutator. The MultiPickup package offers a special notplaceable subclass (xMultiPickupBase) with bStatic set to false which can be spawned from mutators, but won't work if directly placed in a map.

You should extract the MultiPickup package's source code and have a look at the MPBMutator class. The functions CheckPickupBase and CheckPickup illustrate the usage of basic features of the MultiPickupBase class. You can see that the MultiPickupBase can also be used for pickups that didn't have a pickup base.

To test the MPBMutator just create or open the file MultiPickup.int in your UT2003\System directory and add&lt;pre&gt;[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MultiPickup.MPBMutator)&lt;/pre&gt;to make the mutator appear in the mutator list. It will change three things:
* Add the Redeemer to the pickup base spawning the Ion Painter
* Minigun ammo and grenade ammo will both spawn at both pickups' locations
* The Shock Rifle will also spawn at the Link Gun's location (to demonstrate WeaponsStay behavior)

You might want to enable the MultiPickupBase's debug mode when making mods using the MultiPickupBase to get additional information about what's going on.

==Known Subclasses==
* xMultiPickupBase (only used for mutators)

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5099</id>
      <timestamp>2005-01-13T23:27:00Z</timestamp>
      <contributor>
        <ip>209-242-139-200.cox-sd.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://glucose-monitor.newmail.ru/ blood glucose monitor]
*[http://paper-cut-shredder.hotmail.ru/ paper shredder] 
*[http://shredder-paper.boom.ru/ paper shredder] 
*[http://shredder-for-paper.hotmail.ru/ paper shredder] 
*[http://paper5shredder.chat.ru/ paper shredder] 
*[http://papr-shredder.boom.ru/ paper shredder] 
*[http://paper-best-shredder.hotmail.ru/ paper shredder] 
*[http://shredder4paper.chat.ru/ paper shredder] 
*[http://shredder-4paper.boom.ru/ paper shredder] 
*[http://shredder-4-paper.hotmail.ru/ paper shredder] 
*[http://paper1shredder.chat.ru/ paper shredder] 
*[http://paper&amp;ndash;shredder.boom.ru/ paper shredder] 
*[http://paper-shredder.hotmail.ru/ paper shredder] 
*[http://skin1care.chat.ru/ skin care] 
*[http://skin1-care.boom.ru/ sothys skin care] 
*[http://skin-care.hotmail.ru/ skin care] 
*[http://dry1skin.chat.ru/ dry skin] 
*[http://dry-skin.boom.ru/ dry skin] 
*[http://dry-skin.hotmail.ru/ dry skin] 
*[http://serious-skin.boom.ru/ serious skin care] 
*[http://serious-skin-care.hotmail.ru/ serious skin care] 
*[http://skin1tip4care.chat.ru/ skin care tip] 
*[http://skin-care-tip.boom.ru/ skin care tip] 
*[http://skin-care-tip.hotmail.ru/ skin care tip] 
*[http://skin1disease.chat.ru/ skin disease] 
*[http://skin-diseas.boom.ru/ skin disease] 
*[http://skin-disease.hotmail.ru/ skin disease] 
*[http://skin1treatment.chat.ru/ skin treatment] 
*[http://skin-treatm.boom.ru/ skin treatment] 
*[http://skin-treatment.hotmail.ru/ skin treatment] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://tires.newmail.ru/ tires] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://didrex1.chat.ru/ didrex] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://cr-defense-attorney.newmail.ru/ criminal defense attorney] 
*[http://brain-injury-attorne.newmail.ru/ brain injury attorney] 
*[http://criminal-attorney.newmail.ru/ criminal attorney] 
*[http://dallas-attorney.newmail.ru/ dallas attorney] 
*[http://new-york-attorney.newmail.ru/ new york attorney] 
*[http://illinois-attorney.newmail.ru/ illinois attorney] 
*[http://florida-attorney.newmail.ru/ florida attorney] 
*[http://california-attorney.newmail.ru/ california attorney] 
*[http://san-diego-attorney.newmail.ru/ san diego attorney] 
*[http://malpractice-attorney.newmail.ru/ malpractice attorney] 
*[http://pers-injury-attorney.newmail.ru/ personal injury attorney] 
*[http://michigan-attorney.hotmail.ru/ michigan attorney] 
*[http://la-attorney.newmail.ru/ los angeles attorney] 
*[http://s-francisco-attorney.newmail.ru/ san francisco attorney] 
*[http://galveston-cruises.newmail.ru/ galveston cruises] 
*[http://carnival-cruise-ship.newmail.ru/ carnival cruise ship] 
*[http://caribbean-cruise-lin.newmail.ru/ caribbean cruise line] 
*[http://nile-cruises.newmail.ru/ nile cruises] 
*[http://disney-cruise-line.newmail.ru/ disney cruise line] 
*[http://cruise-review.newmail.ru/ cruise review] 
*[http://holl-america-cruises.newmail.ru/ holland america cruises] 
*[http://bahamas-cruise.newmail.ru/ bahamas cruise] 
*[http://celebrity-cruise.newmail.ru/ celebrity cruise] 
*[http://mexico-cruise.newmail.ru/ mexico cruise] 
*[http://disney-cruise.newmail.ru/ disney cruise] 
*[http://hawaiian-cruises.newmail.ru/ hawaiian cruises] 
*[http://new-york-cruises.newmail.ru/ new york cruises] 
*[http://europe-cruise.newmail.ru/ europe cruise] 
*[http://last-minute-cruise.newmail.ru/ last minute cruise] 
*[http://cruise-travel.newmail.ru/ cruise travel] 
*[http://alaska-cruise.newmail.ru/ alaska cruise] 
*[http://cruise-special.newmail.ru/ cruise special] 
*[http://discount-cruises.newmail.ru/ discount cruises] 
*[http://honeymoon-cruise.newmail.ru/ honeymoon cruise] 
*[http://mediterranean-cruise.newmail.ru/ mediterranean cruise] 
*[http://cheap-cruise.newmail.ru/ cheap cruise] 
*[http://cruise-princess.newmail.ru/ cruise princess] 
*[http://norwegian-cruise-lin.newmail.ru/ norwegian cruise line] 
*[http://cruise-line.newmail.ru/ cruise line] 
*[http://cruise-european.newmail.ru/ cruise european] 
*[http://norwegian-cruise.newmail.ru/ norwegian cruise] 
*[http://cruise-deal.newmail.ru/ cruise deal] 
*[http://costa-cruises.newmail.ru/ costa cruises] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://carnival-cruise.newmail.ru/ carnival cruise] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://hawaii-cruise.newmail.ru/ hawaii cruise] 
*[http://bermuda-cruise.newmail.ru/ bermuda cruise] 
*[http://princess-cruise-line.newmail.ru/ princess cruise line] 
*[http://crystal-cruise.newmail.ru/ crystal cruise] 
*[http://radisson-cruise.newmail.ru/ radisson cruise] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://cruise-package.newmail.ru/ cruise package] 
*[http://cruise-ship.newmail.ru/ cruise ship] 
*[http://cruise-vacation.newmail.ru/ cruise vacation] 
*[http://caribbean-cruise.newmail.ru/ caribbean cruise] 
*[http://luxury-cruise.newmail.ru/ luxury cruise] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://wholesale-cigarette.newmail.ru/ wholesale cigarette] 
*[http://cigarette-tobacco.newmail.ru/ cigarette tobacco] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
    <revision>
      <id>5100</id>
      <timestamp>2005-10-18T21:30:27Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>fixed the download link fix</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:XPickUpBase|xPickUpBase]] &gt;&gt; MultiPickupBase (Package: MultiPickup)}}

The MultiPickupBase is an [[Legacy:XPickUpBase|xPickUpBase]] subclass similar to the [[Legacy:WildcardBase|WildcardBase]] which can spawn different types of [[Legacy:Pickup|pickup]]s.

It was made for Chaos UT 2: Evolution by [[Legacy:Wormbo|Wormbo]] to replace the limited [[Legacy:MultiItem|MultiItem]] used in the UT version and add features similar to those available in the [[Legacy:EnhancedItems|MultiPickupPlus]] class. All pickup types are supported and you can add as many as you like.

By default the first pickups is selected randomly, but you can also specify one of the pickups in the list. A new pickup will always be spawned after the current one has been picked up (after that pickup's RespawnTime), but you can also enable respawning after a certain time interval. In this case every pickup can have its own interval or use the default interval. The pickups can either be spawned in sequential or random order. In random order every pickup can have different chances to spawn. Pickups with a higher rating will spawn more often than those with a lower rating.

The MultiPickupBase is designed to work when placed in a map and when created by a mutator. See ''Using the MultiPickupBase In A Mutator'' below.

==Download==

Just extract the files to your UT2003\System directory and you're ready to use it.

http://www.koehler-homepage.de/Wormbo/downloads/UT2003/MultiPickup.zip (15 kB)

==Properties ==

===PickUpBase Group (inherited from [[Legacy:XPickUpBase|xPickUpBase]])===
; class&lt;[[Legacy:Pickup|Pickup]]&gt; PowerUp : The initial value of this property is not used by the MultiPickupBase.
; float SpawnHeight : With bNoVisibleBase=False pickups are spawned this distance above the pickup base. With bNoVisibleBase=True pickups are spawned this distance ''plus their CollisionHeight'' above the base.
; class&lt;[[Legacy:Emitter|Emitter]]&gt; SpiralEmitter : This emitter is spawned for the pickup base unless bNoVisibleBase is set to True.

===MultiPickupBase Group===
; bool bAllowReset : Advanced. Allows the gametype to reset the MultiPickupBase to its initial state when it resets the map.
; bool bChangeOnlyOnPickup (protected) : Setting this to True will cause a behavior similar to the WildcardBase: A new pickup will only be spawned after the previous one was picked up. Setting it to False means that the pickup will be replaced after a certain amount of time if it didn't get picked up.
; bool bNoVisibleBase : Hides the MultiPickupBase. Setting this to true causes the MultiPickupBase to be invisible and the SpiralEmitter will not be used. Also SpawnHeight works a bit differently. (see above)
; bool bRandomAfterPickup : If set to True this will override the bSequential property if the previous pickup was picked up by a player. The next pickup will be selected randomly then. Using this only makes sense when bChangeOnlyOnPickup is set to False.
; bool bSequential : This specifies whether new pickups should be spawned in the order they were listed. This doesn't affect the first pickup spawned.
; bool bTriggerable : Allows the mapper to trigger this MultiPickupBase. It will spawn a new pickup when triggered, regardless whether the previous pickup is still there (that pickup will be removed first) or was picked up.
; float DefaultDuration : The default duration for each pickup to stay around before another pickup is spawned. This has no effect if bChangeOnlyOnPickup is set to True.
; float DefaultSpawnRating : The default spawn rating for each pickup. This will affect both the random initial pickup selection and the random selection after pickup or timeout.
; array&lt;PickupType&gt; PickupTypes : Contains a list of pickups to spawn. You can set the PickupClass, Duration and SpawnRating for each pickup in the list. Both Duration and SpawnRating can be set to 0 to use the default duration or spawn rating respectively. See PickupType struct below.
; class&lt;[[Legacy:Actor|Actor]]&gt; RespawnEffectClass : This Actor will be spawned right before a new pickup is spawned. The default is UT2003's default respawn effect for pickups.
; float RespawnEffectTime : After spawning the respawn effect the MultiPickupBase will wait for this amount of time to pass before actually spawning the pickup.
; int StartingItem : Specifies, which pickup from the list is spawned when the map starts. Setting this to a negative value will randomly select a pickup from the list.

===Internal Variables===
; float AdditionalRespawnWait (protected) : Used to store the remaining sleeping time of the old pickup if it is in Sleeping state when it should be replaced. 
; bool bDebugMode (localized) : The MultiPickupBase has a built-in debug mode which causes log file output for its more important functionality. To enable this mode simply create or open the file MultiPickup.int in your UT2003\System directory and put the following two lines in it:&lt;pre&gt;
[MultiPickupBase]
bDebugMode=True&lt;/pre&gt;
; bool bInitialized (protected) : Whether the first pickup was spawned.
; bool bWasPickedUp (protected) : Set to true if the pickup should be replaced but was picked up already.
; int CurrentClass (protected) : Currently selected pickup list index.
; int NumClasses (protected) : Number of classes in the pickup list.
; [[Legacy:Pickup|Pickup]] oldPickup (protected) : Temporary reference to the old pickup before it gets destroyed.

==Structs==

===PickupType===
; float Duration : This specifies the duration in seconds the pickup stays available before it is replaced by another pickup if the MultiPickupBase is in &quot;timed pickup change&quot; mode. (bChangeOnlyOnPickup = False) Leave this 0 to use the DefaultDuration.
; class&lt;[[Legacy:Pickup|Pickup]]&gt; PickupClass : The Pickup class to spawn.
; float SpawnRating : A value greater than 0 that specifies, how often the pickup should be selected. A higher value (relative to the SpawnRatings of other pickups) means &quot;spawn more often&quot;. Set this to 0 to use the DefaultSpawnRating.

==Methods==

===Static Methods===

These functions are designed to be called from other classes, e.g. [[Legacy:Mutator|Mutator]]s, to create a new MultiPickupBase.
; MultiPickupBase ConvertToMPB ([[Legacy:Actor|Actor]] Other, optional string MPBClassName) [final] : Takes a Pickup or xPickupBase actor and converts it into a MultiPickupBase, which is returned. If the name of a MultiPickupBase class is specified, then that MultiPickupBase class is spawned and the original Pickup or the content of the xPickupBase is added to the new MultiPickupBase. This also works with a WildcardBase.&lt;br /&gt;If no MultiPickupBase class is specified, then a MultiPickup.xMultiPickupBase is spawned.
; MultiPickupBase ReplaceWithMPB ([[Legacy:Actor|Actor]] Other, optional string MPBClassName) [final] : Takes a Pickup or xPickupBase actor and replaces it with a MultiPickupBase, which is returned. If the name of a MultiPickupBase class is specified, then that MultiPickupBase class is spawned, otherwise a MultiPickup.xMultiPickupBase is spawned.&lt;br /&gt;If no MultiPickupBase class is specified, then a MultiPickup.xMultiPickupBase is spawned.

===Public Methods===
; bool AddPickup (coerce string NewClassName, optional float NewDuration, optional float NewRating) : Adds an item to this MultiPickupBase. A new item will only be added if it isn't present in the list.&lt;br /&gt;Returns true if the item already was in the list or was added successfully. (Used by mutators.)
; bool ItemIsIn (class&lt;[[Legacy:Pickup|Pickup]]&gt; TestClass) : Returns, whether a pickup class is already in this MultiPickupBase's list. Can be used by mutators to prevent adding items twice.
; SetChangeOnlyOnPickup (bool bNewChangeMode)&lt;br /&gt;bool GetChangeOnlyOnPickup ( ) : Accessor methods for bChangeOnlyOnPickup.
; Trigger ([[Legacy:Actor|Actor]] Other, [[Legacy:Pawn|Pawn]] EventInstigator) : Inherited from [[Legacy:Actor|Actor]]. The MultiPickupBase can be triggered to immediately spawn a new pickup.
; Reset ( ) : Inherited from [[Legacy:Actor|Actor]]. Resets the MultiPickupBase to its initial state.

==Using the MultiPickupBase==

===...in a Map===

First make sure the MultiPickup package is loaded by either adding it to the EditPackage list in UT2003.ini or by manualy loading MultiPickup.u from the [[Legacy:Actor Classes|Actor Classes]] browser.

To use MultiPickupBase just place it in the map like you would place any other pickup base. Unlike the [[Legacy:WildcardBase|WildcardBase]] a MultiPickupBase initialy doesn't have any pickups in its list, so open its [[Legacy:Actor Properties|Actor Properties]] and go to the MultiPickupBase group to add pickups and change other options.

===...in a Mutator===

MultiPickupBases have their bStatic property set to true, i.e. they can't be spawned from a mutator. The MultiPickup package offers a special notplaceable subclass (xMultiPickupBase) with bStatic set to false which can be spawned from mutators, but won't work if directly placed in a map.

You should extract the MultiPickup package's source code and have a look at the MPBMutator class. The functions CheckPickupBase and CheckPickup illustrate the usage of basic features of the MultiPickupBase class. You can see that the MultiPickupBase can also be used for pickups that didn't have a pickup base.

To test the MPBMutator just create or open the file MultiPickup.int in your UT2003\System directory and add&lt;pre&gt;[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MultiPickup.MPBMutator)&lt;/pre&gt;to make the mutator appear in the mutator list. It will change three things:
* Add the Redeemer to the pickup base spawning the Ion Painter
* Minigun ammo and grenade ammo will both spawn at both pickups' locations
* The Shock Rifle will also spawn at the Link Gun's location (to demonstrate WeaponsStay behavior)

You might want to enable the MultiPickupBase's debug mode when making mods using the MultiPickupBase to get additional information about what's going on.

==Known Subclasses==
* xMultiPickupBase (only used for mutators)

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MultiSkyBox</title>
    <id>1806</id>
    <revision>
      <id>4431</id>
      <timestamp>2007-11-19T16:53:46Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''MultiSkyBox'' makes multiple skyboxes possible in a single map.

More information and download: [http://www.planetunreal.com/slick/v2_custom_scripts.htm Slick Willy's Custom Scripts]

Created by [[Legacy:SlickWilly|SlickWilly]].

==Quick Tutorial==
# Set up multiple skyboxes for your map with a SkyZoneInfo actor in each skybox.
# Set up Zones for each area that will view a different skybox. (only one per zone)
# Create a subclass of ZoneInfo in MyLevel called &quot;MultiSkyboxZoneInfo&quot;
# Remove the default code, insert the code seen on the [[Legacy:MultiSkyboxZoneInfo|MultiSkyboxZoneInfo]] page.
# Compile it.
# Place a MultiSkyboxZoneInfo actor in each zone. (Idiot proof note: Do not place the multiskyboxzoneinfo actor in the skybox zone itself!)
# Set some unique name to both MultiSkyBoxZoneInfo -&gt; event and SkyZoneInfo -&gt; Tag.

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

----

==Discussion==

'''Tester:''' I made some parts of the quick tutorial clearer ;)

'''&lt;unknown&gt;''' Has anyone figured this thing out? Maybe they could write a tute for us less technically abled...:D

'''inio:''' That looks like a classic UT component.  For UT2003 I have a working rig in my [http://www.inio.org/~inio/DM-StupidSkyboxTricks.zip StupidSkyboxTricks] map, that also does scaled skybox movement.  In 2k3 you can't have zones with different skyboxes visible at once though, it'll cause problems.  That's why the zoning setup in that map is so funky.

'''SuperApe:''' I've been looking for something like this.  Of course, it on the wiki. :D  Looks pretty straight forward.  Edit: with quick tut that I haven't tested yet.

'''Cup Of Squirrels:''' Hmm I can't seem to get the actor to save when I compile. Am I doing something wrong?

'''MythOpus:''' Well if you're talking about an error when you try to compile it, try taking out the numbes on the left hand side of the code.  I don't think the compiler likes those there.

----

[[:Category:Legacy Custom Class (UT2003)]]

[[:Category:Legacy Broken Links]]

[[:Category:Legacy To Do]] &amp;ndash; That StupidSkyBoxTricks map, if the link works, should get its own page, and this page be relegated to just being Category Broken Links.
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Broken Links|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4432</id>
      <timestamp>2007-08-10T12:19:25Z</timestamp>
      <contributor>
        <ip>C951cbaf.virtua.com.br</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''MultiSkyBox'' makes multiple skyboxes possible in a single map.

More information and download: [http://www.planetunreal.com/slick/v2_custom_scripts.htm Slick Willy's Custom Scripts]

Created by [[Legacy:SlickWilly|SlickWilly]].

==Quick Tutorial==
# Set up multiple skyboxes for your map with a SkyZoneInfo actor in each skybox.
# Set up Zones for each area that will view a different skybox. (only one per zone)
# Create a subclass of ZoneInfo in MyLevel called &quot;MultiSkyboxZoneInfo&quot;
# Remove the default code, insert the code seen on the [[Legacy:MultiSkyboxZoneInfo|MultiSkyboxZoneInfo]] page.
# Compile it.
# Place a MultiSkyboxZoneInfo actor in each zone. (Idiot proof note: Do not place the multiskyboxzoneinfo actor in the skybox zone itself!)
# Set some unique name to both MultiSkyBoxZoneInfo -&gt; event and SkyZoneInfo -&gt; Tag.

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

----

==Discussion==

'''Tester:''' I made some parts of the quick tutorial clearer ;)

'''&lt;unknown&gt;''' Has anyone figured this thing out? Maybe they could write a tute for us less technically abled...:D

'''inio:''' That looks like a classic UT component.  For UT2003 I have a working rig in my [http://www.inio.org/~inio/DM-StupidSkyboxTricks.zip StupidSkyboxTricks] map, that also does scaled skybox movement.  In 2k3 you can't have zones with different skyboxes visible at once though, it'll cause problems.  That's why the zoning setup in that map is so funky.

'''SuperApe:''' I've been looking for something like this.  Of course, it on the wiki. :D  Looks pretty straight forward.  Edit: with quick tut that I haven't tested yet.

'''Cup Of Squirrels:''' Hmm I can't seem to get the actor to save when I compile. Am I doing something wrong?

'''MythOpus:''' Well if you're talking about an error when you try to compile it, try taking out the numbes on the left hand side of the code.  I don't think the compiler likes those there.

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42884</id>
      <timestamp>2010-04-11T12:51:40Z</timestamp>
      <contributor>
        <ip>95.89.189.79</ip>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">''MultiSkyBox'' makes multiple skyboxes possible in a single map.

More information and download: [http://www.planetunreal.com/slick/v2_custom_scripts.htm Slick Willy's Custom Scripts]

Created by [[Legacy:SlickWilly|SlickWilly]].

==Quick Tutorial==
# Set up multiple skyboxes for your map with a SkyZoneInfo actor in each skybox.
# Set up Zones for each area that will view a different skybox. (only one per zone)
# Create a subclass of ZoneInfo in MyLevel called &quot;MultiSkyboxZoneInfo&quot;
# Remove the default code, insert the code seen on the [[Legacy:MultiSkyboxZoneInfo|MultiSkyboxZoneInfo]] page.
# Compile it.
# Place a MultiSkyboxZoneInfo actor in each zone. (Idiot proof note: Do not place the multiskyboxzoneinfo actor in the skybox zone itself!)
# Set some unique name to both MultiSkyBoxZoneInfo -&gt; event and SkyZoneInfo -&gt; Tag.

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

----

==Discussion==

'''Tester:''' I made some parts of the quick tutorial clearer ;)

'''&lt;unknown&gt;''' Has anyone figured this thing out? Maybe they could write a tute for us less technically abled...:D

'''inio:''' That looks like a classic UT component.  For UT2003 I have a working rig in my [http://www.inio.org/~inio/DM-StupidSkyboxTricks.zip StupidSkyboxTricks] map, that also does scaled skybox movement.  In 2k3 you can't have zones with different skyboxes visible at once though, it'll cause problems.  That's why the zoning setup in that map is so funky.

'''SuperApe:''' I've been looking for something like this.  Of course, it on the wiki. :D  Looks pretty straight forward.  Edit: with quick tut that I haven't tested yet.

'''Cup Of Squirrels:''' Hmm I can't seem to get the actor to save when I compile. Am I doing something wrong?

'''MythOpus:''' Well if you're talking about an error when you try to compile it, try taking out the numbes on the left hand side of the code.  I don't think the compiler likes those there.

'''Che''' Both codes work for me, but only for 2 different skyboxes :(
If i try to use a third skybox for a third terrain, the first terrain always shows the sky of the third skybox.
Anyone got a solution to fix this?
----

[[:Category:Legacy Custom Class (UT2003)]]

[[:Category:Legacy Broken Links]]

[[:Category:Legacy To Do]] &amp;ndash; That StupidSkyBoxTricks map, if the link works, should get its own page, and this page be relegated to just being Category Broken Links.
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Broken Links|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>42885</id>
      <timestamp>2010-04-11T13:11:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moved discussion to talk page</comment>
      <text xml:space="preserve">''MultiSkyBox'' makes multiple skyboxes possible in a single map.

More information and download: [http://www.planetunreal.com/slick/v2_custom_scripts.htm Slick Willy's Custom Scripts]

Created by [[Legacy:SlickWilly|SlickWilly]].

==Quick Tutorial==
# Set up multiple skyboxes for your map with a SkyZoneInfo actor in each skybox.
# Set up Zones for each area that will view a different skybox. (only one per zone)
# Create a subclass of ZoneInfo in MyLevel called &quot;MultiSkyboxZoneInfo&quot;
# Remove the default code, insert the code seen on the [[Legacy:MultiSkyboxZoneInfo|MultiSkyboxZoneInfo]] page.
# Compile it.
# Place a MultiSkyboxZoneInfo actor in each zone. (Idiot proof note: Do not place the multiskyboxzoneinfo actor in the skybox zone itself!)
# Set some unique name to both MultiSkyBoxZoneInfo -&gt; event and SkyZoneInfo -&gt; Tag.

==Related Topics==
* [[Legacy:Third-Party Components|Third-Party Components]]

----
[[:Category:Legacy To Do]] &amp;ndash; That StupidSkyBoxTricks map, if the link works, should get its own page, and this page be relegated to just being Category Broken Links.
[[Category:Legacy Custom Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Broken Links|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MultiSkyboxZoneInfo</title>
    <id>2067</id>
    <revision>
      <id>5034</id>
      <timestamp>2006-01-26T19:59:04Z</timestamp>
      <contributor>
        <ip>C906a28e.virtua.com.br</ip>
      </contributor>
      <minor/>
      <comment>* This version is inside the multisky example map, dunno what the difference</comment>
      <text xml:space="preserve">==UT2003 Version==

&lt;uscript line&gt;
//=============================================================================
// MultiSkyboxZoneInfo.
// Input the tag of the skybox you want the fake backdrop surfaces of the zone to display
//
// (c) Zxanphorian 2002
// tornado.f5@worldnet.att.net
//=============================================================================
class MultiSkyboxZoneInfo extends ZoneInfo
	placeable;



var() name SkyZoneTag;



simulated function LinkToSkybox()
{
	local SkyZoneInfo Skybox;

	Super.LinkToSkybox();
	foreach AllActors( class 'SkyZoneInfo', Skybox, SkyZoneTag )
	{
		SkyZone = Skybox;
	}


}
&lt;/uscript&gt;

==UT Version==

&lt;uscript line&gt;
class SelectiveSkyZoneInfo expands ZoneInfo;

var() name SelectedSky;

simulated function LinkToSkybox()
{
	local skyzoneinfo TempSkyZone;

	if(SelectedSky != 'None')
	{
		foreach AllActors(class'SkyZoneInfo', TempSkyZone, SelectedSky)
		{
			SkyZone = TempSkyZone;
			return;
		}
	}

	foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' )
		SkyZone = TempSkyZone;

	foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' )
		if( TempSkyZone.bHighDetail == Level.bHighDetailMode )
			SkyZone = TempSkyZone;
}
&lt;/uscript&gt;

==UT version (alternate version?)==

&lt;uscript&gt;
class MultiSkyZoneInfo expands ZoneInfo;

simulated function LinkToSkybox()
{
	local skyzoneinfo Sky;

	Super.LinkToSkybox();

	foreach AllActors( class 'SkyZoneInfo', Sky, Event )
	{
		SkyZone = Sky;
	}
}
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>5035</id>
      <timestamp>2004-05-05T03:19:14Z</timestamp>
      <contributor>
        <ip>Tddlard</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==UT2003 Version==

&lt;uscript line&gt;
//=============================================================================
// MultiSkyboxZoneInfo.
// Input the tag of the skybox you want the fake backdrop surfaces of the zone to display
//
// (c) Zxanphorian 2002
// tornado.f5@worldnet.att.net
//=============================================================================
class MultiSkyboxZoneInfo extends ZoneInfo
	placeable;



var() name SkyZoneTag;



simulated function LinkToSkybox()
{
	local SkyZoneInfo Skybox;

	Super.LinkToSkybox();
	foreach AllActors( class 'SkyZoneInfo', Skybox, SkyZoneTag )
	{
		SkyZone = Skybox;
	}


}
&lt;/uscript&gt;

==UT Version==

&lt;uscript line&gt;
class SelectiveSkyZoneInfo expands ZoneInfo;

var() name SelectedSky;

simulated function LinkToSkybox()
{
	local skyzoneinfo TempSkyZone;

	if(SelectedSky != 'None')
	{
		foreach AllActors(class'SkyZoneInfo', TempSkyZone, SelectedSky)
		{
			SkyZone = TempSkyZone;
			return;
		}
	}

	foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' )
		SkyZone = TempSkyZone;

	foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' )
		if( TempSkyZone.bHighDetail == Level.bHighDetailMode )
			SkyZone = TempSkyZone;
}
&lt;/uscript&gt;

'''Tddlard:''' I have found that in UT that if you use a multiskyboxinfo and different sky boxes then you can avoid the HOM effect with warpzones. I don't know if this works in UT2003, but then again from what I have read warpzones don't work as well in UT2003 as UT.</text>
    </revision>
    <revision>
      <id>5036</id>
      <timestamp>2004-05-05T03:48:44Z</timestamp>
      <contributor>
        <ip>Tddlard</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==UT2003 Version==

&lt;uscript line&gt;
//=============================================================================
// MultiSkyboxZoneInfo.
// Input the tag of the skybox you want the fake backdrop surfaces of the zone to display
//
// (c) Zxanphorian 2002
// tornado.f5@worldnet.att.net
//=============================================================================
class MultiSkyboxZoneInfo extends ZoneInfo
	placeable;



var() name SkyZoneTag;



simulated function LinkToSkybox()
{
	local SkyZoneInfo Skybox;

	Super.LinkToSkybox();
	foreach AllActors( class 'SkyZoneInfo', Skybox, SkyZoneTag )
	{
		SkyZone = Skybox;
	}


}
&lt;/uscript&gt;

==UT Version==

&lt;uscript line&gt;
class SelectiveSkyZoneInfo expands ZoneInfo;

var() name SelectedSky;

simulated function LinkToSkybox()
{
	local skyzoneinfo TempSkyZone;

	if(SelectedSky != 'None')
	{
		foreach AllActors(class'SkyZoneInfo', TempSkyZone, SelectedSky)
		{
			SkyZone = TempSkyZone;
			return;
		}
	}

	foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' )
		SkyZone = TempSkyZone;

	foreach AllActors( class 'SkyZoneInfo', TempSkyZone, '' )
		if( TempSkyZone.bHighDetail == Level.bHighDetailMode )
			SkyZone = TempSkyZone;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Multiammo Weapons</title>
    <id>2107</id>
    <revision>
      <id>5135</id>
      <timestamp>2005-07-02T07:04:14Z</timestamp>
      <contributor>
        <ip>Zugy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The last two versions of  the ChaosUT mods have made use of weapons that have multiple types of ammo. In the UT version we made a new weapon for each ammo type. Then when you picked up one of these weapons, we gave the user all of the other weapons based on the ammo types just with out any ammo. Once a user found a different ammo type in a map, that version of the weapon now had ammo which the user now could use. This help to create the illusion of one weapon that can fire different ammo types. However this method was not fool proof. For example if you dropped the weapon or die with these weapons then only the standard weapon ammo type could be picked up. 

UT2003 provided us with a way to correct the issues and truly make one weapon that can support more than 2 ammo types. I will attempt to walk you through how we did it for a Grenade Launcher. Keep in mind that this code is what worked. Its not the best code and I am sure there are other ways that are more elegant in handling this task. This is my first tut so forgive a few mistakes as I try to learn how to write these better. I will to post at first the key functions then the complete source at the end. But with that out of the way lets start.

==Requirements of Grenade Launcher ==

Here is a list of what we want our Grenade Launcher to do:
* The Grenade Launcher must support at least four types of Grenades. Standard, Poison, Napalm and Flash. 
* The user can switch ammo any time they have another ammo type to use in the Grenade Launcher
* The Grenade Launcher should have a timed Grenade as one fire type and an instant hit/explosion as the other fire type for each style of grenade
* The Grenade Launcher should have an visible indicator (new skin on weapon mesh) on which ammo type you have loaded other than the Ammo Counter

Now that we have a design goal lets see how this can be done. 

The basic plan of attack is like so:
* We will add new fire mode(s) to handle the new each of the new ammo types  
* Each ammo will have two fire modes one for the timed grenade another for the instant grenade
* We will reset the attachment and pickup classes to the players viewing this weapon (or if it was dropped) so anyone can see what ammo is currently loaded into the weapon
* We will use an EXEC in the weapon class to do the ammo changing
* We will need a separate weapon pickup and attachment class for each ammo type

==Needed Functions ==

The main part we need is to do the actual swapping of the ammo types. We should use a variable to store which ammo is currently loaded (we will use var int Count for that). This should be a global and not a local function for reasons we will get to later. The basics are first we check to see if we have any ammo. Then we should not allow an ammo change if we are firing the weapon. We start at our current count and then look at the next available ammo type. If we have ammo of that type we will try to change to it. We do this by removing the current fire class. Spawning a new fire class for the new ammo type. We then change the ammo to that type. We repeat this process so we change both the current firing modes. Then we remove the current attachment and pickup classes and replace them with correct ones. We do this so that the 3rd player views and the dropped pickups will have the right skin and ammo types

&lt;uscript&gt;
// manual key function to swich ammo out
exec function ChangeAmmo()
{
    local Inventory Inv;

    // Check to see if they even have ammo to switch
    if (!HasAmmo())
      return;

    // dont let them chang ammo if they are firing
    if (FireMode[0].bIsFiring || FireMode[1].bIsFiring)
       return;

    while (!bChangedAmmo)
    {

      if (Count == 0)
      {
         Count += 1;

         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_napalm', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass =class'GrenadeAmmoNapalm';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_napalm', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass = class'GrenadeAmmonapalm';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_NapalmAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_NapalmPickup';
             Break;
         }
      }
      if (Count == 1)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_flash', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoFlash';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_flash', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoFlash';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_FlashAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_FlashPickup';
             Break;
         }
      }
      if (Count == 2)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_poison', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoPoison';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_poison', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmopoison';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_PoisonAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_PoisonPickup';
             Break;
         }
      }
      if (Count == 3)
      {
         count = 0;  // reset counter on last type of ammo
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
                 DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_Attachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_Pickup';
             Break;
         }
      }
    }
    bChangedAmmo=false; // set to flase as we have changed ammo at this point and need to reset the flag
}
&lt;/uscript&gt;

The next key function is the ammo check. The default HasAmmo only looks at the current fire types. With a weapon that has more than one, this is no good. We changed ours to look for the inventory types of each possible ammo type:

&lt;uscript&gt;
// needed to overide the weapons call as we have a multi-ammo weapon
simulated function bool HasAmmo()
{
       local Inventory Inv;

       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       return false; // if we got this far no ammo for nade launcher
}
&lt;/uscript&gt;

The next function we needed to change was the Outofammo(). The reason for this change is that the standard Outofammo function is not aware that you have more than one ammo type. So it should check to see if you have any of the other ammotypes in your current inventory. If it does not find any you are truly out of ammo. If it does, then you should change ammo types:

&lt;uscript&gt;
// needed to add this check for a multi-ammo weapon
simulated function OutOfAmmo()
{

   if (Level.NetMode == NM_Standalone &amp;&amp; !Instigator.IsLocallyControlled())
      return;

    if ((Ammo[0] != None &amp;&amp; FireMode[0] != None &amp;&amp; Ammo[0].AmmoAmount &gt;= FireMode[0].AmmoPerFire) || (Ammo[1] != none &amp;&amp; FireMode[1] != none &amp;&amp; Ammo[1].AmmoAmount &gt;= FireMode[1].AmmoPerFire) )
    {
        return; // we have ammo return
    }
    else
    {
        if (HasAmmo())
        {
            ChangeAmmo(); // meaning we have some type of nade ammo change to it
        }
        else
        {
            //if we have gotten to this point we are really out of ammo...better swich weapons
            DoAutoSwitch();
        }
     }
}
&lt;/uscript&gt;

That is the basics you will need. What if your new ammo type required a 1st person view mesh change? If you pickup up a dropped version what skin/mesh will be displayed on your screen? What about network replications? How does the animations play? What happens when a users tries to fire during an ammo change? What happens if you run out of ammo while your firing? This is where we have to get a bit ugly as the code above will have all of these are issues. 

==Complete Code ==

Since we have more than one weapon that supports multi-ammo types we decided to use a parent class and place in some specific code to help with network replication, changing of the mesh/skins and animations.

The parent class of the weapon is this:

&lt;uscript&gt;
//=============================================================================
// ChaosWeapon
//=============================================================================
class ChaosWeapon extends Weapon abstract;

var int count;                        // use this to keep track of the current selected ammo and replicate this to clients
var bool bChangedAmmo;      // use this flag to break out of loop  in change ammo functions and replicate this to clients
var Int OldCount;                   // used to tell us when to play the &quot;changeammo&quot; function and do not replicate this to clients
var bool bPlayChangeAmmo; // used by the Animnotify to tell use when to change mesh/skins and do not replicate this to clients

replication
{
    // Things the server should send to the client.
    reliable if( Role==ROLE_Authority )
        count, bChangedAmmo;

    // functions called by client on server
    reliable if( Role&lt;ROLE_Authority )
        ChangeAmmo;
}

//---
// ChangeAmmo
//   *Switches ammo types.
//   *Implemented in subclasses.
// ---
exec function ChangeAmmo()
{
}

//---
// Timer
//   * This is needed to help us prevent playing animations client side during a relaod.
// ---
Simulated function Timer ()
{
   super.Timer();          // call to super
   if (bPlayChangeAmmo)    // dont play the animtions if we are reloading
     bPlayChangeAmmo=false;

}


//---
// PutDown()
//   * This is needed to help prevent ANs for multi-ammo weapons.
// ---
simulated function bool PutDown()
{
    local int Mode;

    if (ClientState == WS_BringUp || ClientState == WS_ReadyToFire)
    {
        // For our multi-ammo weapons Instigator.PendingWeapon maybe none so check for that
        if (Instigator.PendingWeapon != None &amp;&amp; !Instigator.PendingWeapon.bForceSwitch)
        {
            for (Mode = 0; Mode &lt; NUM_FIRE_MODES; Mode++)
            {
                if (FireMode[Mode].bFireOnRelease &amp;&amp; FireMode[Mode].bIsFiring)
                    return false;
            }
        }

        if (Instigator.IsLocallyControlled())
        {
            for (Mode = 0; Mode &lt; NUM_FIRE_MODES; Mode++)
            {
                if (FireMode[Mode].bIsFiring)
                    ClientStopFire(Mode);
            }

            if (ClientState != WS_BringUp &amp;&amp; HasAnim(PutDownAnim))
                PlayAnim(PutDownAnim, PutDownAnimRate, 0.0);
        }
        ClientState = WS_PutDown;

        SetTimer(0.3, false);
    }
    for (Mode = 0; Mode &lt; NUM_FIRE_MODES; Mode++)
    {
  FireMode[Mode].bServerDelayStartFire = false;
  FireMode[Mode].bServerDelayStopFire = false;
 }
    Instigator.AmbientSound = None;
    OldWeapon = None;
    return true; // return false if preventing weapon switch
}


//---
// State WaitforAmmoChange
// This state helps to pause the guns unitl so that
// We can switch ammos
// ---
Simulated State WaitforAmmoChange
{
   Ignores ServerStartFire, ServerStopFire, ClientWeaponSet, Fire, ClientStopFire,ClientStartFire;


 Begin:
       // put the fire modes to &quot;sleep&quot; while we run the ammo chaning animations
       if (FireMode[0] != none)
            FireMode[0].GotoState('ChangeAmmo');
       if (FireMode[1] != none)
            FireMode[1].GotoState('ChangeAmmo');
       if (Level.NetMode == NM_DedicatedServer)
         Sleep(1.75);
       // Ok back to normal
       GotoState('');
}
&lt;/uscript&gt;

Let me touch on a few parts of the above code. The count var became useful to replicate to the clients. We can use that to display client message when your changing ammo as well as help figure out which mesh/skin to change to. The next three, bChangedAmmo, OldCount, bPlayChangeAmmo were all used to help avoid network animation issues. Basically they help to tell the client when then need to change skins/mesh for the new ammo types as well as help syncing of animations in network play. The modify PutDown() was needed to help avoid AN in the logs. The only weirdo thing their is the WaitforAmmoChange state. We needed to disallow people from playing firing animations. In on-line games you would hit the change ammo key and as soon as the animation started to play you could spam the fire key. This would cause the fire animations to play however no new projectile would be spawned. Thus it looked like a bug. Using this we help to lock out user fire commands during the ammo switch and this allows the animations to play with out being interrupted. The Sleep(1.75) is an ugly hack but this cause the weapon to sleep during the reloading. Again maybe a cleaner way to do this. But it accomplishes the effect and disallows any firing during the ammo change.

You also probably saw that FireMode[0].GotoState('ChangeAmmo') command. And you should realize that that is not a standard state in the weapon fire class. You are correct. With multi ammo we have some issues to work around in the fire class. Again these basically help to avoid the user from firing during an ammo change. As well as they help to address when you the ammo changes and weapon changes happen automatically. Here is the parent class we use for all changing ammo fire modes:

&lt;uscript&gt;
//==============================================================================
// CUT_ProjectileFire - by DJPaul
//   *$Id: CUT_ProjectileFire.uc,v 1.4 2003/07/01 12:32:54 Wormbo Exp $
//   *All variable ammo types should derive from this class.
//==============================================================================
class CUT_ProjectileFire extends ProjectileFire abstract;

// This function below will handle the automatic reload of the weapon
// if we have another ammo type when the current one runes out
function StopFiring()
{
     if ( Weapon.Ammo[ThisModeNum].AmmoAmount &lt;= 0 )
       GotoState('ChangeAmmo');
}


// This function will disallow at the playing of the client side animation
// During a reload
simulated function bool AllowFire()
{
 return Super.AllowFire() &amp;&amp; !ChaosWeapon(Weapon).bPlayChangeAmmo;
}



// We need this state to previent the client side fire animations
// to play while the &quot;reload&quot; animations are playing
State ChangeAmmo
{
 Ignores PlayFireEnd, PlayFiring, PlayStartHold, PlayPreFire;


  Begin:
     Sleep(0.5);         // Wait for current firing animation to finnish
     Weapon.OutOfAmmo();   // change the ammo
     Sleep(1.50);         // lets the animations play before we try to fire
     GotoState('');        // ok ready to rock...
}

function StartBerserk()
{
    FireRate = default.FireRate * 0.75;
    FireAnimRate = default.FireAnimRate / 0.75;
}
&lt;/uscript&gt;

You can see now why we replicated the bPlayChangeAmmo to help avoid the issues of animations in network play. 

Now for the complete GenadeLauncher code we used:

&lt;uscript&gt;
//=============================================================================
// GrenadeLauncher - by DJPaul
// $Id: GrenadeLauncher.uc,v 1.34 2003/07/13 01:03:23 jb Exp $
//=============================================================================
class GrenadeLauncher extends ChaosWeapon config(user);

var sound Nadelauncher_select1;


// AI Interface
function float GetAIRating()
{
 local Bot B;
 local float EnemyDist;
 local vector EnemyDir;

 B = Bot(Instigator.Controller);
 if ( (B == None) || (B.Enemy == None) )
  return AIRating;

 EnemyDir = B.Enemy.Location - Instigator.Location;
 EnemyDist = VSize(EnemyDir);
 if ( EnemyDist &gt; 750 )
 {
  if ( EnemyDist &gt; 2000 )
  {
   if ( EnemyDist &gt; 3500 )
    return 0.2;
   return (AIRating - 0.3);
  }
  if ( EnemyDir.Z &lt; -0.5 * EnemyDist )
   return (AIRating - 0.3);
 }
 else if ( (B.Enemy.Weapon != None) &amp;&amp; B.Enemy.Weapon.bMeleeWeapon )
  return (AIRating + 0.35);
 else if ( EnemyDist &lt; 400 )
  return (AIRating + 0.2);
 return FMax(AIRating + 0.2 - (EnemyDist - 400) * 0.0008, 0.2);
}

/* BestMode()
choose between regular or alt-fire
*/
function byte BestMode()
{
 local vector EnemyDir;
 local float EnemyDist;
 local bot B;

 B = Bot(Instigator.Controller);
 if ( (B == None) || (B.Enemy == None) )
  return 0;

 EnemyDir = B.Enemy.Location - Instigator.Location;
 EnemyDist = VSize(EnemyDir);
 if ( EnemyDist &gt; 700 )
   return 1;
 else if ( (B.Enemy.Weapon != None) &amp;&amp; B.Enemy.Weapon.bMeleeWeapon )
  return 0;
 else if ( (EnemyDist &lt; 400) || (EnemyDir.Z &gt; 30) )
  return 0;
 else if ( FRand() &lt; 0.65 )
  return 1;
 return 0;
}

function float SuggestAttackStyle()
{
 if ( (AIController(Instigator.Controller) != None)
  &amp;&amp; (AIController(Instigator.Controller).Skill &lt; 3) )
  return 0.4;
    return 0.8;
}

function float SuggestDefenseStyle()
{
    return -0.4;
}
// End AI Interface


// charge is used to both increase volecity and for the time delay if app,
simulated function float ChargeBar()
{
    if (FireMode[1].bIsFiring)
       return FMin(1,FireMode[1].HoldTime/GrenadeLauncher_SecondaryFireModeAbstract(FireMode[1]).MaxStrength);
    else
       return 0.0;
}

simulated function tick (float dt)
{
   // check for an ammo change and if so...change the 1st view skin..
   // and play a reloading animation
    if (OldCount != Count)
 {
        OldCount = Count;
        bPlayChangeAmmo=True;
        PlayChangeAmmo();
    }
}

Simulated function PlayChangeAmmo()
{
     // Because we have to swtich the skin we will have the animation call (via an amin notify)
     // the PlayAmmoMeshSwitch() function to ensure we are snyced as we dont want to swtich the
     // skin until we have finnshed playing the AmmoDown animation

     // use this timer to let animtions finnish playing 
     SetTimer(2.0, true);
     // Play the down animations here
     PlayAnim('AmmoDown', 1.25, 0.3);
}

simulated function PlayAmmoMeshSwitch()
{
   // The animnotify will fire off this function when the weapon is playing the Ammodown animation at the 9th frame
   // and the bPlayChangeAmmo flag is used to know that we are indeed in a changing of ammo sequnce
    if (bPlayChangeAmmo)
    {
        // Change 1st Skin here
        Skins[0]=Texture'ChaosTex_001.Nades.Chaos_Nadelauncher_id1';
        Switch (Count) {
        Case 1:
            Skins[1]= Texture'ChaosTex_001.Nades.Chaos_NadeFlame';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= FinalBlend'XEffectMat.Shield.RedShell';
            if (PlayerController(Instigator.Controller) != none)
                  PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'NapalmAmmoChangeNotification', 0, none, none, FireMode[0].Class);
            PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
            break;
        Case 2:
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeflash';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellFlash';
            Skins[3]= Shader'XGameShaders.PlayerShaders.LightningHit';
            if (PlayerController(Instigator.Controller) != none)
                 PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'FlashAmmoChangeNotification', 0, none, none, FireMode[0].Class);
            PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
            break;
        Case 3:
             Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadepoison';
             Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellPoison';
             Skins[3]= FinalBlend'XEffectMat.goop.GoopFB';
             if (PlayerController(Instigator.Controller) != none)
                 PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'PoisonAmmoChangeNotification', 0, none, none, FireMode[0].Class);
             PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
             break;
        default:
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeexplo';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= Texture'WeaponSkins.Skins.GrenadeTex';
            if (PlayerController(Instigator.Controller) != none)
                  PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'ExplosiveAmmoChangeNotification', 0, none, none, FireMode[0].Class);
            PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
            break;
        }
        // now we have changed the skins on the 1st views play the Ammoup animation
        Playanim('AmmoUp', 1.2, 0.3);
     }
}


// needed to overide the weapons call as we have a multi-ammo weapon
simulated function bool HasAmmo()
{
       local Inventory Inv;

       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       return false; // if we got this far no ammo for nade launcher
}

// needed to add this check for a multi-ammo weapon
simulated function BringUp(optional Weapon PrevWeapon)
{
    OutOfAmmo();  // check to make sure we have some type of ammo
    // Make sure we load the right skin... but don't wast server time with this...
    If(Level.NetMode != NM_DedicatedServer)
    {
        Skins[0]=Texture'ChaosTex_001.Nades.Chaos_Nadelauncher_id1';
        if (Count == 1)
        {
            Skins[1]= Texture'ChaosTex_001.Nades.Chaos_NadeFlame';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= FinalBlend'XEffectMat.Shield.RedShell';
        }
        else if (Count == 2)
        {
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeflash';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellFlash';
            Skins[3]= Shader'XGameShaders.PlayerShaders.LightningHit';
        }
        else if (Count == 3)
        {
             Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadepoison';
             Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellPoison';
             Skins[3]= FinalBlend'XEffectMat.goop.GoopFB';
        }
        else
        {
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeexplo';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= Texture'WeaponSkins.Skins.GrenadeTex';
        }
     }
     Super.BringUp();
}

// needed to add this check for a multi-ammo weapon
simulated function OutOfAmmo()
{

   if (Level.NetMode == NM_Standalone &amp;&amp; !Instigator.IsLocallyControlled())
      return;

    if ((Ammo[0] != None &amp;&amp; FireMode[0] != None &amp;&amp; Ammo[0].AmmoAmount &gt;= FireMode[0].AmmoPerFire) || (Ammo[1] != none &amp;&amp; FireMode[1] != none &amp;&amp; Ammo[1].AmmoAmount &gt;= FireMode[1].AmmoPerFire) )
    {
        return; // we have ammo return
    }
    else
    {
        if (HasAmmo())
        {
            ChangeAmmo(); // meaning we have some type of nade ammo change to it
        }
        else
        {
            //if we have gotten to this point we are really out of ammo...better swich weapons
            DoAutoSwitch();
        }
     }
}


// manual key function to swich ammo out
exec function ChangeAmmo()
{
   local Inventory Inv;

   // Check to see if they even have ammo to switch
   if (!HasAmmo())
     return;

   // dont let them chang ammo if they are firing
   if (FireMode[0].bIsFiring || FireMode[1].bIsFiring)
       return;

   //DJP: Stops stuff firing when the type switches (when out of ammo).
   if (Pawn(Owner) != none &amp;&amp; Pawn(Owner).Controller != none)
   {
        Pawn(Owner).Controller.bFire = 0;
        Pawn(Owner).Controller.bAltFire = 0;
   }


    while (!bChangedAmmo)
    {

      if (Count == 0)
      {
         Count += 1;

         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_napalm', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass =class'GrenadeAmmoNapalm';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_napalm', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass = class'GrenadeAmmonapalm';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_NapalmAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_NapalmPickup';
             Break;
         }
      }
      if (Count == 1)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_flash', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoFlash';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_flash', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoFlash';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_FlashAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_FlashPickup';
             Break;
         }
      }
      if (Count == 2)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_poison', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoPoison';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_poison', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmopoison';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_PoisonAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_PoisonPickup';
             Break;
         }
      }
      if (Count == 3)
      {
         count = 0;  // reset counter on last type of ammo
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
                 DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_Attachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_Pickup';
             Break;
         }
      }
    }
    bChangedAmmo=false; // set to flase as we have changed ammo at this point and need to reset the flag
    GoToState('WaitforAmmoChange'); // &quot;Pauses&quot; the gun so that the player can load the new ammo
}


function GiveTo(Pawn Other, optional Pickup Pickup)
{
 local Inventory Inv;

 Super.GiveTo(Other, Pickup);

 // add empty ammo for player (for Mutant, Last Man Standing and AllAmmo)
 if ( !bDeleteMe ) {
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoStandard');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoNapalm');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoPoison');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoFlash');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
 }
}
&lt;/uscript&gt;

Whew. Big and ugly. Again I should touch on a few key points. In the tick we needed to modify it to tell the client that we have changed ammo and we need to play the changeammo animations as well as change the skin. That's where the vars from the ChaosWeapon were used. The PlayChangeAmmo() was used to kick off the animation of the changing of the ammo. However we uses different skins for the different ammo type loaded into the 1st view of the weapon. So we needed to change the skins. We want to wait until the 1st model is out of view before we change the skin. We used an AnimNotify in the animation file to do this. We broke the animation up into two parts, an Ammodown then and Ammoup. Ammodown plays the &quot;unloading&quot; part. At the 2nd to the last frame of that AmmoDown animation we set up the AnimNotify to call the PlayAmmoMeshSwitch() function. This function will then change to the new skin (or mesh) and then play the up animation. Thus the skin/mesh changing all happens out of view of the player and when see the AmmoUp animation play its playing with the correct skin (or mesh). Please note that for this example we just changed the skin. In the other weapons we had to change the weapon mesh and did that in the PlayAmmoMeshSwitch() as well. We also play to the client a change ammo message. This is not needed. The BringUp() function needed to be modify to handle the dropped weapons. With out a check for the skins (or mesh) you would get the default skin/mesh of the weapon and not the current loaded ammo skin/mesh. The rest is more or less standard &quot;stuff'.

A couple of things I should mention.
* Using this method you will may need a new attachment class for each of the other ammo types. This attachment class can be a subclass of the default attachment class you use in your weapon. Nothing special is need here just change any skins/mesh in this attachment class if it applies. 
* You will also need to have a new weapon pickup for each of the other ammo type that you have. This handles the case of you having a different ammo type loaded when you toss your weapon or die. If you did not add a new pickup, then the person that picks up your dropped weapon is left with the original ammo and not the ammo you have it loaded with. Here is an example of one:

&lt;uscript&gt;
//=============================================================================
// GrenadeLauncher_Napalmpickup
// $Id: GrenadeLauncher_Napalmpickup.uc,v 1.9 2003/07/12 20:48:44 jb Exp $
//=============================================================================
class GrenadeLauncher_Napalmpickup extends GrenadeLauncher_pickup;

//over ride this to give out proper ammo to Nade (Napalm ammo)
function inventory SpawnCopy( pawn Other )
{
 local inventory Copy;
        local Weapon W;
    local GrenadeLauncher GL;

 if ( Inventory != None )
 {
  Copy = Inventory;
  Inventory = None;
 }
 else
  Copy = spawn(InventoryType,Other,,,rot(0,0,0));

    // add in the Napalm nade stuff here
    W = Weapon(copy);
    // Clean up &quot;old&quot; fire mode(s)
    // primary fire
    if (W.FireMode[0] != none)
      W.FireMode[0].Destroy();
    // Set Primary Fire to Napalm Stuff
    W.FireMode[0] = Spawn(class'GrenadeLauncher_Primary_napalm', self);
    W.FireMode[0].ThisModeNum = 0;
    W.FireMode[0].Weapon = W;
    W.FireMode[0].Instigator = Other;
    W.FireMode[0].AmmoClass =class'GrenadeAmmoNapalm';    // need these two to change the ammo
    W.Ammo[0] = Ammunition(Other.FindInventoryType(W.FireMode[0].AmmoClass));

    // secondary fire
    if (W.FireMode[1] != none)
       W.FireMode[1].Destroy();
    // Set secondary Fire to Napalm Stuff
    W.FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_napalm', self);
    W.FireMode[1].ThisModeNum = 1;
    W.FireMode[1].Weapon = W;
    W.FireMode[1].Instigator = Other;
    W.FireMode[1].AmmoClass = class'GrenadeAmmonapalm';
    W.Ammo[1] = Ammunition(Other.FindInventoryType(w.FireMode[1].AmmoClass));
    W.PickupClass=class'GrenadeLauncher_NapalmPickup';
    W.AttachmentClass=class'GrenadeLauncher_NapalmAttachment';

    // Finally set the Count of the nade launcher to Napalm and give it to em :)
    GL = GrenadeLauncher(copy);
    if (GL != none)
       GL.Count=1;

 Copy.GiveTo( Other, self );

 return Copy;
}
&lt;/uscript&gt;

This ammo pickup looks a lot like our change ammo function and its very simular to that other than a few tweaks. So did you make it through this tut? I hope that this gives you the basics on how to handle a weapon that can fire more than one ammo types. It also should avoid all of the issues with animations, network play and handle out of ammo, change ammo and droppen weapon issues. Thanks for your time.

'''Jb:''' Fixed an error that produced AN on the weapon pickup class. Sorry saw it only a few times and never had a chance to go back and fix it till now.

'''Zer0:''' This needs updating for UT2004, there are some weird issues with FireModes in 2k4. I can't get firemodes to change at all in 04, various type mismatch/destroy is not a member of Firemode/bad or missing etc errors.

'''zugy:''' Hmmm...Is there a way to get this working in 2k4? It'd help out a LOT for the grenade code I'm working on for Project Torlan...

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5136</id>
      <timestamp>2004-06-23T16:56:42Z</timestamp>
      <contributor>
        <ip>Ppp-0-152.leic-b-1.access.uk.tiscali.com</ip>
      </contributor>
      <text xml:space="preserve">The last two versions of  the ChaosUT mods have made use of weapons that have multiple types of ammo. In the UT version we made a new weapon for each ammo type. Then when you picked up one of these weapons, we gave the user all of the other weapons based on the ammo types just with out any ammo. Once a user found a different ammo type in a map, that version of the weapon now had ammo which the user now could use. This help to create the illusion of one weapon that can fire different ammo types. However this method was not fool proof. For example if you dropped the weapon or die with these weapons then only the standard weapon ammo type could be picked up. 

UT2003 provided us with a way to correct the issues and truly make one weapon that can support more than 2 ammo types. I will attempt to walk you through how we did it for a Grenade Launcher. Keep in mind that this code is what worked. Its not the best code and I am sure there are other ways that are more elegant in handling this task. This is my first tut so forgive a few mistakes as I try to learn how to write these better. I will to post at first the key functions then the complete source at the end. But with that out of the way lets start.

==Requirements of Grenade Launcher ==

Here is a list of what we want our Grenade Launcher to do:
* The Grenade Launcher must support at least four types of Grenades. Standard, Poison, Napalm and Flash. 
* The user can switch ammo any time they have another ammo type to use in the Grenade Launcher
* The Grenade Launcher should have a timed Grenade as one fire type and an instant hit/explosion as the other fire type for each style of grenade
* The Grenade Launcher should have an visible indicator (new skin on weapon mesh) on which ammo type you have loaded other than the Ammo Counter

Now that we have a design goal lets see how this can be done. 

The basic plan of attack is like so:
* We will add new fire mode(s) to handle the new each of the new ammo types  
* Each ammo will have two fire modes one for the timed grenade another for the instant grenade
* We will reset the attachment and pickup classes to the players viewing this weapon (or if it was dropped) so anyone can see what ammo is currently loaded into the weapon
* We will use an EXEC in the weapon class to do the ammo changing
* We will need a separate weapon pickup and attachment class for each ammo type

==Needed Functions ==

The main part we need is to do the actual swapping of the ammo types. We should use a variable to store which ammo is currently loaded (we will use var int Count for that). This should be a global and not a local function for reasons we will get to later. The basics are first we check to see if we have any ammo. Then we should not allow an ammo change if we are firing the weapon. We start at our current count and then look at the next available ammo type. If we have ammo of that type we will try to change to it. We do this by removing the current fire class. Spawning a new fire class for the new ammo type. We then change the ammo to that type. We repeat this process so we change both the current firing modes. Then we remove the current attachment and pickup classes and replace them with correct ones. We do this so that the 3rd player views and the dropped pickups will have the right skin and ammo types

&lt;uscript&gt;
// manual key function to swich ammo out
exec function ChangeAmmo()
{
    local Inventory Inv;

    // Check to see if they even have ammo to switch
    if (!HasAmmo())
      return;

    // dont let them chang ammo if they are firing
    if (FireMode[0].bIsFiring || FireMode[1].bIsFiring)
       return;

    while (!bChangedAmmo)
    {

      if (Count == 0)
      {
         Count += 1;

         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_napalm', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass =class'GrenadeAmmoNapalm';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_napalm', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass = class'GrenadeAmmonapalm';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_NapalmAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_NapalmPickup';
             Break;
         }
      }
      if (Count == 1)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_flash', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoFlash';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_flash', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoFlash';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_FlashAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_FlashPickup';
             Break;
         }
      }
      if (Count == 2)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_poison', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoPoison';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_poison', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmopoison';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_PoisonAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_PoisonPickup';
             Break;
         }
      }
      if (Count == 3)
      {
         count = 0;  // reset counter on last type of ammo
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
                 DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_Attachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_Pickup';
             Break;
         }
      }
    }
    bChangedAmmo=false; // set to flase as we have changed ammo at this point and need to reset the flag
}
&lt;/uscript&gt;

The next key function is the ammo check. The default HasAmmo only looks at the current fire types. With a weapon that has more than one, this is no good. We changed ours to look for the inventory types of each possible ammo type:

&lt;uscript&gt;
// needed to overide the weapons call as we have a multi-ammo weapon
simulated function bool HasAmmo()
{
       local Inventory Inv;

       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       return false; // if we got this far no ammo for nade launcher
}
&lt;/uscript&gt;

The next function we needed to change was the Outofammo(). The reason for this change is that the standard Outofammo function is not aware that you have more than one ammo type. So it should check to see if you have any of the other ammotypes in your current inventory. If it does not find any you are truly out of ammo. If it does, then you should change ammo types:

&lt;uscript&gt;
// needed to add this check for a multi-ammo weapon
simulated function OutOfAmmo()
{

   if (Level.NetMode == NM_Standalone &amp;&amp; !Instigator.IsLocallyControlled())
      return;

    if ((Ammo[0] != None &amp;&amp; FireMode[0] != None &amp;&amp; Ammo[0].AmmoAmount &gt;= FireMode[0].AmmoPerFire) || (Ammo[1] != none &amp;&amp; FireMode[1] != none &amp;&amp; Ammo[1].AmmoAmount &gt;= FireMode[1].AmmoPerFire) )
    {
        return; // we have ammo return
    }
    else
    {
        if (HasAmmo())
        {
            ChangeAmmo(); // meaning we have some type of nade ammo change to it
        }
        else
        {
            //if we have gotten to this point we are really out of ammo...better swich weapons
            DoAutoSwitch();
        }
     }
}
&lt;/uscript&gt;

That is the basics you will need. What if your new ammo type required a 1st person view mesh change? If you pickup up a dropped version what skin/mesh will be displayed on your screen? What about network replications? How does the animations play? What happens when a users tries to fire during an ammo change? What happens if you run out of ammo while your firing? This is where we have to get a bit ugly as the code above will have all of these are issues. 

==Complete Code ==

Since we have more than one weapon that supports multi-ammo types we decided to use a parent class and place in some specific code to help with network replication, changing of the mesh/skins and animations.

The parent class of the weapon is this:

&lt;uscript&gt;
//=============================================================================
// ChaosWeapon
//=============================================================================
class ChaosWeapon extends Weapon abstract;

var int count;                        // use this to keep track of the current selected ammo and replicate this to clients
var bool bChangedAmmo;      // use this flag to break out of loop  in change ammo functions and replicate this to clients
var Int OldCount;                   // used to tell us when to play the &quot;changeammo&quot; function and do not replicate this to clients
var bool bPlayChangeAmmo; // used by the Animnotify to tell use when to change mesh/skins and do not replicate this to clients

replication
{
    // Things the server should send to the client.
    reliable if( Role==ROLE_Authority )
        count, bChangedAmmo;

    // functions called by client on server
    reliable if( Role&lt;ROLE_Authority )
        ChangeAmmo;
}

//---
// ChangeAmmo
//   *Switches ammo types.
//   *Implemented in subclasses.
// ---
exec function ChangeAmmo()
{
}

//---
// Timer
//   * This is needed to help us prevent playing animations client side during a relaod.
// ---
Simulated function Timer ()
{
   super.Timer();          // call to super
   if (bPlayChangeAmmo)    // dont play the animtions if we are reloading
     bPlayChangeAmmo=false;

}


//---
// PutDown()
//   * This is needed to help prevent ANs for multi-ammo weapons.
// ---
simulated function bool PutDown()
{
    local int Mode;

    if (ClientState == WS_BringUp || ClientState == WS_ReadyToFire)
    {
        // For our multi-ammo weapons Instigator.PendingWeapon maybe none so check for that
        if (Instigator.PendingWeapon != None &amp;&amp; !Instigator.PendingWeapon.bForceSwitch)
        {
            for (Mode = 0; Mode &lt; NUM_FIRE_MODES; Mode++)
            {
                if (FireMode[Mode].bFireOnRelease &amp;&amp; FireMode[Mode].bIsFiring)
                    return false;
            }
        }

        if (Instigator.IsLocallyControlled())
        {
            for (Mode = 0; Mode &lt; NUM_FIRE_MODES; Mode++)
            {
                if (FireMode[Mode].bIsFiring)
                    ClientStopFire(Mode);
            }

            if (ClientState != WS_BringUp &amp;&amp; HasAnim(PutDownAnim))
                PlayAnim(PutDownAnim, PutDownAnimRate, 0.0);
        }
        ClientState = WS_PutDown;

        SetTimer(0.3, false);
    }
    for (Mode = 0; Mode &lt; NUM_FIRE_MODES; Mode++)
    {
  FireMode[Mode].bServerDelayStartFire = false;
  FireMode[Mode].bServerDelayStopFire = false;
 }
    Instigator.AmbientSound = None;
    OldWeapon = None;
    return true; // return false if preventing weapon switch
}


//---
// State WaitforAmmoChange
// This state helps to pause the guns unitl so that
// We can switch ammos
// ---
Simulated State WaitforAmmoChange
{
   Ignores ServerStartFire, ServerStopFire, ClientWeaponSet, Fire, ClientStopFire,ClientStartFire;


 Begin:
       // put the fire modes to &quot;sleep&quot; while we run the ammo chaning animations
       if (FireMode[0] != none)
            FireMode[0].GotoState('ChangeAmmo');
       if (FireMode[1] != none)
            FireMode[1].GotoState('ChangeAmmo');
       if (Level.NetMode == NM_DedicatedServer)
         Sleep(1.75);
       // Ok back to normal
       GotoState('');
}
&lt;/uscript&gt;

Let me touch on a few parts of the above code. The count var became useful to replicate to the clients. We can use that to display client message when your changing ammo as well as help figure out which mesh/skin to change to. The next three, bChangedAmmo, OldCount, bPlayChangeAmmo were all used to help avoid network animation issues. Basically they help to tell the client when then need to change skins/mesh for the new ammo types as well as help syncing of animations in network play. The modify PutDown() was needed to help avoid AN in the logs. The only weirdo thing their is the WaitforAmmoChange state. We needed to disallow people from playing firing animations. In on-line games you would hit the change ammo key and as soon as the animation started to play you could spam the fire key. This would cause the fire animations to play however no new projectile would be spawned. Thus it looked like a bug. Using this we help to lock out user fire commands during the ammo switch and this allows the animations to play with out being interrupted. The Sleep(1.75) is an ugly hack but this cause the weapon to sleep during the reloading. Again maybe a cleaner way to do this. But it accomplishes the effect and disallows any firing during the ammo change.

You also probably saw that FireMode[0].GotoState('ChangeAmmo') command. And you should realize that that is not a standard state in the weapon fire class. You are correct. With multi ammo we have some issues to work around in the fire class. Again these basically help to avoid the user from firing during an ammo change. As well as they help to address when you the ammo changes and weapon changes happen automatically. Here is the parent class we use for all changing ammo fire modes:

&lt;uscript&gt;
//==============================================================================
// CUT_ProjectileFire - by DJPaul
//   *$Id: CUT_ProjectileFire.uc,v 1.4 2003/07/01 12:32:54 Wormbo Exp $
//   *All variable ammo types should derive from this class.
//==============================================================================
class CUT_ProjectileFire extends ProjectileFire abstract;

// This function below will handle the automatic reload of the weapon
// if we have another ammo type when the current one runes out
function StopFiring()
{
     if ( Weapon.Ammo[ThisModeNum].AmmoAmount &lt;= 0 )
       GotoState('ChangeAmmo');
}


// This function will disallow at the playing of the client side animation
// During a reload
simulated function bool AllowFire()
{
 return Super.AllowFire() &amp;&amp; !ChaosWeapon(Weapon).bPlayChangeAmmo;
}



// We need this state to previent the client side fire animations
// to play while the &quot;reload&quot; animations are playing
State ChangeAmmo
{
 Ignores PlayFireEnd, PlayFiring, PlayStartHold, PlayPreFire;


  Begin:
     Sleep(0.5);         // Wait for current firing animation to finnish
     Weapon.OutOfAmmo();   // change the ammo
     Sleep(1.50);         // lets the animations play before we try to fire
     GotoState('');        // ok ready to rock...
}

function StartBerserk()
{
    FireRate = default.FireRate * 0.75;
    FireAnimRate = default.FireAnimRate / 0.75;
}
&lt;/uscript&gt;

You can see now why we replicated the bPlayChangeAmmo to help avoid the issues of animations in network play. 

Now for the complete GenadeLauncher code we used:

&lt;uscript&gt;
//=============================================================================
// GrenadeLauncher - by DJPaul
// $Id: GrenadeLauncher.uc,v 1.34 2003/07/13 01:03:23 jb Exp $
//=============================================================================
class GrenadeLauncher extends ChaosWeapon config(user);

var sound Nadelauncher_select1;


// AI Interface
function float GetAIRating()
{
 local Bot B;
 local float EnemyDist;
 local vector EnemyDir;

 B = Bot(Instigator.Controller);
 if ( (B == None) || (B.Enemy == None) )
  return AIRating;

 EnemyDir = B.Enemy.Location - Instigator.Location;
 EnemyDist = VSize(EnemyDir);
 if ( EnemyDist &gt; 750 )
 {
  if ( EnemyDist &gt; 2000 )
  {
   if ( EnemyDist &gt; 3500 )
    return 0.2;
   return (AIRating - 0.3);
  }
  if ( EnemyDir.Z &lt; -0.5 * EnemyDist )
   return (AIRating - 0.3);
 }
 else if ( (B.Enemy.Weapon != None) &amp;&amp; B.Enemy.Weapon.bMeleeWeapon )
  return (AIRating + 0.35);
 else if ( EnemyDist &lt; 400 )
  return (AIRating + 0.2);
 return FMax(AIRating + 0.2 - (EnemyDist - 400) * 0.0008, 0.2);
}

/* BestMode()
choose between regular or alt-fire
*/
function byte BestMode()
{
 local vector EnemyDir;
 local float EnemyDist;
 local bot B;

 B = Bot(Instigator.Controller);
 if ( (B == None) || (B.Enemy == None) )
  return 0;

 EnemyDir = B.Enemy.Location - Instigator.Location;
 EnemyDist = VSize(EnemyDir);
 if ( EnemyDist &gt; 700 )
   return 1;
 else if ( (B.Enemy.Weapon != None) &amp;&amp; B.Enemy.Weapon.bMeleeWeapon )
  return 0;
 else if ( (EnemyDist &lt; 400) || (EnemyDir.Z &gt; 30) )
  return 0;
 else if ( FRand() &lt; 0.65 )
  return 1;
 return 0;
}

function float SuggestAttackStyle()
{
 if ( (AIController(Instigator.Controller) != None)
  &amp;&amp; (AIController(Instigator.Controller).Skill &lt; 3) )
  return 0.4;
    return 0.8;
}

function float SuggestDefenseStyle()
{
    return -0.4;
}
// End AI Interface


// charge is used to both increase volecity and for the time delay if app,
simulated function float ChargeBar()
{
    if (FireMode[1].bIsFiring)
       return FMin(1,FireMode[1].HoldTime/GrenadeLauncher_SecondaryFireModeAbstract(FireMode[1]).MaxStrength);
    else
       return 0.0;
}

simulated function tick (float dt)
{
   // check for an ammo change and if so...change the 1st view skin..
   // and play a reloading animation
    if (OldCount != Count)
 {
        OldCount = Count;
        bPlayChangeAmmo=True;
        PlayChangeAmmo();
    }
}

Simulated function PlayChangeAmmo()
{
     // Because we have to swtich the skin we will have the animation call (via an amin notify)
     // the PlayAmmoMeshSwitch() function to ensure we are snyced as we dont want to swtich the
     // skin until we have finnshed playing the AmmoDown animation

     // use this timer to let animtions finnish playing 
     SetTimer(2.0, true);
     // Play the down animations here
     PlayAnim('AmmoDown', 1.25, 0.3);
}

simulated function PlayAmmoMeshSwitch()
{
   // The animnotify will fire off this function when the weapon is playing the Ammodown animation at the 9th frame
   // and the bPlayChangeAmmo flag is used to know that we are indeed in a changing of ammo sequnce
    if (bPlayChangeAmmo)
    {
        // Change 1st Skin here
        Skins[0]=Texture'ChaosTex_001.Nades.Chaos_Nadelauncher_id1';
        Switch (Count) {
        Case 1:
            Skins[1]= Texture'ChaosTex_001.Nades.Chaos_NadeFlame';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= FinalBlend'XEffectMat.Shield.RedShell';
            if (PlayerController(Instigator.Controller) != none)
                  PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'NapalmAmmoChangeNotification', 0, none, none, FireMode[0].Class);
            PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
            break;
        Case 2:
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeflash';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellFlash';
            Skins[3]= Shader'XGameShaders.PlayerShaders.LightningHit';
            if (PlayerController(Instigator.Controller) != none)
                 PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'FlashAmmoChangeNotification', 0, none, none, FireMode[0].Class);
            PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
            break;
        Case 3:
             Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadepoison';
             Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellPoison';
             Skins[3]= FinalBlend'XEffectMat.goop.GoopFB';
             if (PlayerController(Instigator.Controller) != none)
                 PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'PoisonAmmoChangeNotification', 0, none, none, FireMode[0].Class);
             PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
             break;
        default:
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeexplo';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= Texture'WeaponSkins.Skins.GrenadeTex';
            if (PlayerController(Instigator.Controller) != none)
                  PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'ExplosiveAmmoChangeNotification', 0, none, none, FireMode[0].Class);
            PlayOwnedSound(Nadelauncher_select1, SLOT_Interact,,,,, false);
            break;
        }
        // now we have changed the skins on the 1st views play the Ammoup animation
        Playanim('AmmoUp', 1.2, 0.3);
     }
}


// needed to overide the weapons call as we have a multi-ammo weapon
simulated function bool HasAmmo()
{
       local Inventory Inv;

       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
       if (inv != none  &amp;&amp; Ammunition(inv).HasAmmo())
         return true;
       return false; // if we got this far no ammo for nade launcher
}

// needed to add this check for a multi-ammo weapon
simulated function BringUp(optional Weapon PrevWeapon)
{
    OutOfAmmo();  // check to make sure we have some type of ammo
    // Make sure we load the right skin... but don't wast server time with this...
    If(Level.NetMode != NM_DedicatedServer)
    {
        Skins[0]=Texture'ChaosTex_001.Nades.Chaos_Nadelauncher_id1';
        if (Count == 1)
        {
            Skins[1]= Texture'ChaosTex_001.Nades.Chaos_NadeFlame';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= FinalBlend'XEffectMat.Shield.RedShell';
        }
        else if (Count == 2)
        {
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeflash';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellFlash';
            Skins[3]= Shader'XGameShaders.PlayerShaders.LightningHit';
        }
        else if (Count == 3)
        {
             Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadepoison';
             Skins[2]= Texture'ChaosTex_001.Nades.Chaos_NadeshellPoison';
             Skins[3]= FinalBlend'XEffectMat.goop.GoopFB';
        }
        else
        {
            Skins[1]= Texture'ChaosTex_001.Nades.chaos_nadeexplo';
            Skins[2]= Texture'ChaosTex_001.Nades.Chaos_Nadeshell';
            Skins[3]= Texture'WeaponSkins.Skins.GrenadeTex';
        }
     }
     Super.BringUp();
}

// needed to add this check for a multi-ammo weapon
simulated function OutOfAmmo()
{

   if (Level.NetMode == NM_Standalone &amp;&amp; !Instigator.IsLocallyControlled())
      return;

    if ((Ammo[0] != None &amp;&amp; FireMode[0] != None &amp;&amp; Ammo[0].AmmoAmount &gt;= FireMode[0].AmmoPerFire) || (Ammo[1] != none &amp;&amp; FireMode[1] != none &amp;&amp; Ammo[1].AmmoAmount &gt;= FireMode[1].AmmoPerFire) )
    {
        return; // we have ammo return
    }
    else
    {
        if (HasAmmo())
        {
            ChangeAmmo(); // meaning we have some type of nade ammo change to it
        }
        else
        {
            //if we have gotten to this point we are really out of ammo...better swich weapons
            DoAutoSwitch();
        }
     }
}


// manual key function to swich ammo out
exec function ChangeAmmo()
{
   local Inventory Inv;

   // Check to see if they even have ammo to switch
   if (!HasAmmo())
     return;

   // dont let them chang ammo if they are firing
   if (FireMode[0].bIsFiring || FireMode[1].bIsFiring)
       return;

   //DJP: Stops stuff firing when the type switches (when out of ammo).
   if (Pawn(Owner) != none &amp;&amp; Pawn(Owner).Controller != none)
   {
        Pawn(Owner).Controller.bFire = 0;
        Pawn(Owner).Controller.bAltFire = 0;
   }


    while (!bChangedAmmo)
    {

      if (Count == 0)
      {
         Count += 1;

         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_napalm', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass =class'GrenadeAmmoNapalm';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_napalm', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass = class'GrenadeAmmonapalm';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_NapalmAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_NapalmPickup';
             Break;
         }
      }
      if (Count == 1)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_flash', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoFlash';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_flash', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoFlash';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_FlashAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_FlashPickup';
             Break;
         }
      }
      if (Count == 2)
      {
         Count += 1;
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo() )
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary_poison', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoPoison';    // need these two to change the ammo
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_poison', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmopoison';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
               DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_PoisonAttachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_PoisonPickup';
             Break;
         }
      }
      if (Count == 3)
      {
         count = 0;  // reset counter on last type of ammo
         Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
         if (Inv  != none  &amp;&amp; Ammunition(inv).HasAmmo())
         {
             bChangedAmmo=true;
             // Remove old fire mode 0
             if (FireMode[0] != none)
                 FireMode[0].Destroy();
             // primary fire
             FireMode[0] = Spawn(class'GrenadeLauncher_Primary', self);
             FireMode[0].ThisModeNum = 0;
             FireMode[0].Weapon = self;
             FireMode[0].Instigator = Instigator;
             FireMode[0].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[0] = Ammunition(Instigator.FindInventoryType(FireMode[0].AmmoClass));
             // Remove old fire mode 1
             if (FireMode[1] != none)
                 FireMode[1].Destroy();
             // secondary fire
             FireMode[1] = Spawn(class'GrenadeLauncher_Secondary', self);
             FireMode[1].ThisModeNum = 1;
             FireMode[1].Weapon = self;
             FireMode[1].Instigator = Instigator;
             FireMode[1].AmmoClass=class'GrenadeAmmoStandard';
             Ammo[1] = Ammunition(Instigator.FindInventoryType(FireMode[1].AmmoClass));

             // Remove old Attchment and spawn new one with correct skin
             if ( AttachmentClass != none)
                 DetachFromPawn(instigator);
             AttachmentClass=class'GrenadeLauncher_Attachment';
             AttachToPawn(Instigator);
             PickupClass=class'GrenadeLauncher_Pickup';
             Break;
         }
      }
    }
    bChangedAmmo=false; // set to flase as we have changed ammo at this point and need to reset the flag
    GoToState('WaitforAmmoChange'); // &quot;Pauses&quot; the gun so that the player can load the new ammo
}


function GiveTo(Pawn Other, optional Pickup Pickup)
{
 local Inventory Inv;

 Super.GiveTo(Other, Pickup);

 // add empty ammo for player (for Mutant, Last Man Standing and AllAmmo)
 if ( !bDeleteMe ) {
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoStandard');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoStandard');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoNapalm');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoNapalm');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoPoison');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoPoison');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
  Inv = Pawn(Owner).FindInventoryType(class'GrenadeAmmoFlash');
  if ( Inv == None ) {
   Inv = Spawn(class'GrenadeAmmoFlash');
   Ammunition(Inv).AmmoAmount = 0;
   Inv.GiveTo(Other);
  }
 }
}
&lt;/uscript&gt;

Whew. Big and ugly. Again I should touch on a few key points. In the tick we needed to modify it to tell the client that we have changed ammo and we need to play the changeammo animations as well as change the skin. That's where the vars from the ChaosWeapon were used. The PlayChangeAmmo() was used to kick off the animation of the changing of the ammo. However we uses different skins for the different ammo type loaded into the 1st view of the weapon. So we needed to change the skins. We want to wait until the 1st model is out of view before we change the skin. We used an AnimNotify in the animation file to do this. We broke the animation up into two parts, an Ammodown then and Ammoup. Ammodown plays the &quot;unloading&quot; part. At the 2nd to the last frame of that AmmoDown animation we set up the AnimNotify to call the PlayAmmoMeshSwitch() function. This function will then change to the new skin (or mesh) and then play the up animation. Thus the skin/mesh changing all happens out of view of the player and when see the AmmoUp animation play its playing with the correct skin (or mesh). Please note that for this example we just changed the skin. In the other weapons we had to change the weapon mesh and did that in the PlayAmmoMeshSwitch() as well. We also play to the client a change ammo message. This is not needed. The BringUp() function needed to be modify to handle the dropped weapons. With out a check for the skins (or mesh) you would get the default skin/mesh of the weapon and not the current loaded ammo skin/mesh. The rest is more or less standard &quot;stuff'.

A couple of things I should mention.
* Using this method you will may need a new attachment class for each of the other ammo types. This attachment class can be a subclass of the default attachment class you use in your weapon. Nothing special is need here just change any skins/mesh in this attachment class if it applies. 
* You will also need to have a new weapon pickup for each of the other ammo type that you have. This handles the case of you having a different ammo type loaded when you toss your weapon or die. If you did not add a new pickup, then the person that picks up your dropped weapon is left with the original ammo and not the ammo you have it loaded with. Here is an example of one:

&lt;uscript&gt;
//=============================================================================
// GrenadeLauncher_Napalmpickup
// $Id: GrenadeLauncher_Napalmpickup.uc,v 1.9 2003/07/12 20:48:44 jb Exp $
//=============================================================================
class GrenadeLauncher_Napalmpickup extends GrenadeLauncher_pickup;

//over ride this to give out proper ammo to Nade (Napalm ammo)
function inventory SpawnCopy( pawn Other )
{
 local inventory Copy;
        local Weapon W;
    local GrenadeLauncher GL;

 if ( Inventory != None )
 {
  Copy = Inventory;
  Inventory = None;
 }
 else
  Copy = spawn(InventoryType,Other,,,rot(0,0,0));

    // add in the Napalm nade stuff here
    W = Weapon(copy);
    // Clean up &quot;old&quot; fire mode(s)
    // primary fire
    if (W.FireMode[0] != none)
      W.FireMode[0].Destroy();
    // Set Primary Fire to Napalm Stuff
    W.FireMode[0] = Spawn(class'GrenadeLauncher_Primary_napalm', self);
    W.FireMode[0].ThisModeNum = 0;
    W.FireMode[0].Weapon = W;
    W.FireMode[0].Instigator = Other;
    W.FireMode[0].AmmoClass =class'GrenadeAmmoNapalm';    // need these two to change the ammo
    W.Ammo[0] = Ammunition(Other.FindInventoryType(W.FireMode[0].AmmoClass));

    // secondary fire
    if (W.FireMode[1] != none)
       W.FireMode[1].Destroy();
    // Set secondary Fire to Napalm Stuff
    W.FireMode[1] = Spawn(class'GrenadeLauncher_Secondary_napalm', self);
    W.FireMode[1].ThisModeNum = 1;
    W.FireMode[1].Weapon = W;
    W.FireMode[1].Instigator = Other;
    W.FireMode[1].AmmoClass = class'GrenadeAmmonapalm';
    W.Ammo[1] = Ammunition(Other.FindInventoryType(w.FireMode[1].AmmoClass));
    W.PickupClass=class'GrenadeLauncher_NapalmPickup';
    W.AttachmentClass=class'GrenadeLauncher_NapalmAttachment';

    // Finally set the Count of the nade launcher to Napalm and give it to em :)
    GL = GrenadeLauncher(copy);
    if (GL != none)
       GL.Count=1;

 Copy.GiveTo( Other, self );

 return Copy;
}
&lt;/uscript&gt;

This ammo pickup looks a lot like our change ammo function and its very simular to that other than a few tweaks. So did you make it through this tut? I hope that this gives you the basics on how to handle a weapon that can fire more than one ammo types. It also should avoid all of the issues with animations, network play and handle out of ammo, change ammo and droppen weapon issues. Thanks for your time.

'''Jb:''' Fixed an error that produced AN on the weapon pickup class. Sorry saw it only a few times and never had a chance to go back and fix it till now.

'''Zer0:''' This needs updating for UT2004, there are some weird issues with FireModes in 2k4. I can't get firemodes to change at all in 04, various type mismatch/destroy is not a member of Firemode/bad or missing etc errors.

[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Music</title>
    <id>1807</id>
    <revision>
      <id>4433</id>
      <timestamp>2007-12-09T21:07:09Z</timestamp>
      <contributor>
        <ip>Hellkeeper</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox|The following sub-pages are hereby proposed:

[[Legacy:File Formats Overview And History|File Formats Overview and History]] .. or  [[Legacy:Music File Format|Music file format]]

[[Legacy:Creating Music|Creating Music]]

[[Legacy:Importing/Using Music In Unreal Engine Games|Importing/Using Music in Unreal Engine Games]] ... or [[Legacy:Importing Music|Importing Music]]

}}

----

Music can be one of the most important factors in your map. Setting the right music can create an awesome atmosphere and improve [[Legacy:Gameplay|gameplay]]. This section covers almost everything that's related to adding music to your map.  The official information regarding Unreal/UT music files is available at http://unreal.epicgames.com/music.htm.

==File Formats ==

The [[Legacy:Unreal Engine|Unreal engine]] has used a number of different file formats over its many incarnations. These fall into two groups:
; track formats : a bit like a MIDI file bundled with samples to play: these are a combination of short sound clips and instructions on when to play them
; audio formats : an exact audio recording of the entire piece of music

===Early Unreal Engine's Music Formats ===

The music tracks in [[Legacy:Unreal Engine|Unreal engine]] 1 games are all in [[Legacy:UMX File|UMX file]] formats. Basically, a umx file doesn't contain anything special except for the music track itself which was imported into this umx (this is not entirely true). So which music formats can be used to create umx files?

Games that use the earlier Unreal Engine builds (like Unreal, UT and Deus Ex) support ''Direct music'' (MID, MIDI and RMI) and [[Legacy:Music Modules|Music Modules]] - usually shortened to &quot;MOD&quot;, but ''not'' to be mistaken with a game mod! Modules can have different formats, like .s3m, .xm, .it, .mod.

Also, CD audio can be used as music in maps. However, CDA files don't need to be imported into a umx. You can just assign a track number to your map. This is rather pointless though, as the chances that someone will have the same CD you do in their drive when they play the map is practically null. In practice, you'll want to export the music from the CD and then import it into the editor seperately.

'''Hellkeeper:''' .UMX are &quot;packages&quot; of musics, usually containing 2 or 3 tracks (in Unreal 1, not in UT) : if you set a SongSection) in the level propreties or a MusicEvent trigger, you can switch between the differents section. In the original Unreal, this was used to change the music while fighting or when special events took place.

===Latest Unreal Engine's Music Formats ===

OGG is the new music format used in UnrealEngine2. ''Ogg Vorbis'' format is an open source encoding format and has a higher compression rate than MP3. This means that the same quality of music will have a smaller .OGG file than the same quality .MP3 file. Put differently, if you have a .OGG file and a .MP3 file of the same size, the .OGG file will have a higher quality.

More info about ogg vorbis at: 
* [http://www.vorbis.com/ Vorbis.com] - Main site
* [http://www.xiph.org/ogg/] - Definition of &quot;Ogg projects&quot;. Related page: [http://www.xiph.org/about.html]
* [http://www.xiph.org/ogg/vorbis/index.html] - More info
* And there's an ogg vorbis encoder/decoder available for [http://www.winamp.com./ Winamp Music Player].

==Adding Music to Maps ==

The procedure for [[Legacy:Assigning Music To Maps|Assigning Music to Maps]] is the same regardless of what version of the engine you are using. However, as noted above, different engines (and even different licensed games using the same engine) have different formats that they support, so the procedure for [[Legacy:Importing Music|Importing Music]] and what file formats can be imported may vary.

==OGG Vorbis Discussion ==

Normally You would import the music into Your map but in this case, You convert it into OGG, place into correct directory and give the file name (without suffix) in the LevelProperties-&gt;Audio-&gt;Song. There are a few caveartes in this though:

- the OGG player does not obey the PATHS= settings in the UT2003.ini file so if You have a separate directory for map developement, You won't hear Your music - for some reason it has to be placed in the same folder as the rest of the OGG files.

- trying to play the OGG in the editor will crash-boom-bang

Now, to create the OGG files You need an OGG capable converter. One that is freeware and works can be found [http://www.dbpoweramp.com/ here].

It is not recommended to rip music off of music CD's - instead You can create/use MIDI and convert it to WAV using [http://www.modplug.com/index.php3 ModPlug tracker]. The WAV is then again easy to convert into OGG.
:&lt;b&gt;Note:&lt;/b&gt; this is completely unnecessary. If you want to use a piece of music on a CD, run it through WinAmp and output it to OGG format. Done deal. MIDI is extremely unreliable, as the sounds you hear on one computer can vary widely from the sounds you hear on another, and converting to WAV is an unnecessary step.

A more widely used alternative is the Oggdrop utility. Download it [http://www.vorbis.com/download_win.psp here]. Start it and just drag the wav file onto it and it will encode it for you. Right click on it to alter options like bitrate, quality, mono/stereo etc. I (Hawkeye) prefer OggdropXPD myself which is the exact same tool but with more options. Highly recommended for it's speed, versatility and ease of use.

* some more stuff... (Ogg Vorbis links etc.)

To be edited:
* How to import MIDIs &amp;ndash; &lt;i&gt;GAH!  I'm wetting my pants in anticipation!  Using Midis would be FANTASTIC for this thing I'm working on.  &amp;ndash; Cap&lt;/i&gt;
:Heh, as far as I know, UEd supports MODs, so importing a MIDI into a MOD should work. But when I do this, the music won't play, because the samples aren't imported. This used to work with previous MPT versions... There's a discussion about this at the [http://forums.beyondunreal.com/showthread.php?threadid=112412 BuF Music board], so I'm just gonna ask those people about it &amp;ndash; &lt;i&gt;The Alien&lt;/i&gt;

&lt;i&gt;Hmm, maybe this page should be divided to stop it from getting too long. I'll see if it needs dividing in the future... &amp;ndash; The Alien&lt;/i&gt;
:yup, splitting it might be necesssary soon, especially if you're thinking of importing your tute.  &amp;ndash; ''Tarquin'' 
::&lt;i&gt;Well, I don't care if the tute is imported here or not. :) It's there on my site, and that's what I wanted. =) If you think it would be good to have it here, I'll be happy to import it ;) &amp;ndash; The Alien&lt;/i&gt;
: &lt;i&gt;P.S. Sorry for the self-pimpage :D :p ;) &amp;ndash; The Alien&lt;/i&gt;

:: bah. If you can't pimp yourself, who can you? :)
:: True. :D

==Comments==

'''bmw5002:''' I converted a collection of the old UT tracker style music into Ogg format so you can use it in your UT2003/2004 maps for a little reminiscing :-) Mail me at bmw5002 at optonline dot net if you want 'em.

'''Wormbo:''' I just found out you could import music into .U files with this line in a .UC file:&lt;uscript&gt;
#exec NEW MUSICFACTORY FILE=&quot;...&quot; NAME=&quot;...&quot;&lt;/uscript&gt;

'''Birelli:''' I think we should split this page by first paraphrasing everything into a quick and clean explanation of how to do things, and then link to pages with some of this &quot;''extremely'' in-depth info&quot; ;-).

'''Wormbo:''' This page definately needs some work.

'''RDGDanClark:''' I'm not a total expert on music in Unreal Engine games, but I'll see what I can do here.

'''Foxpaw:''' This page has a lot of repetition and redundancy. I'll add the [[:Category:Legacy Refactor Me]].

'''Nuleo:''' The Ogg Vorbis format really sucks.  Even though it has a higher compression ratio, even at the highest quality, it sounds muffled, scratchy, and less bright than mp3s or wavs and I have composed about 12 minutes of music so far for a UT2003 Total Conversion.  I think this is part of the reason why the UT2003 soundtrack isn't very good.

'''Foxpaw:''' In theory, Ogg Vorbis is a lossless compression format so it shouldn't sound any different. It's possible that the decoder built in to UT2003 is not very good. In UT at least, there was a major difference between the music in-game and the same music files played using Winamp or Sonique, so maybe this is kind of the same deal.

'''MythOpus:'''  Well, are you refering to the add-on music player in ut2k3 or some other thing ?

'''Foxpaw:''' No, I mean that UT did not produce a completely faithful playback of the actual MOD file that was supposedly being played as music. This was not a flaw in the format, simply a consequence of UT's playback mechanism. Similarly, the Ogg Vorbis files may sounds bad in UT2003, but I highly, highly doubt that it is the fault of the format. As far as I know, an Ogg Vorbis file decoded should be completely identical to the source waveform.

'''Nuleo:''' Ogg files are not completely identical to their source (.wav or other) files.  And the quality of the ogg files is still worse than the mp3s even when played in Winamp.  Probably cause the mp3 format has been around longer so better mp3 encoders are available.

'''Wormbo:''' It all depends on the bitrate used. At the same bitrate an OGG sounds better than an MP3. Try e.g. 64kb/s, you'll definately notice the effect.

'''Hawkeye:''' Ogg Vorbis is much better than mp3 at equal bitrate. This is true at both low (32-64) and high (192-up) bitrates.

Trust me on this. I ripped 500 Audio CD's first in mp3 and changed to ogg because they sound much better than mp3 at equal or slightly lower bitrates.

'''Graphik:''' I cleaned a little before realizing the futility. This page needs a complete rewrite.

'''Birelli:''' Ok, I moved the info on [[Legacy:Music Modules|Music Modules]] to it's own page. This makes the page a lot easier to read, and really all that info belongs on it's own page. I think next is to re-write the &quot;assigning music to maps&quot; and move it towards the top of the page. Maybe even it's own page, this is really the only info most people care about.

'''Birelli:''' Alright, I think I've finally got things in at least somewhat working order. Nowhere on this page was there a description of how to import a music file into your map. The [[Legacy:Importing Music|Importing Music]] page has what used to be the &quot;Importing Music&quot; section of this page, but it doesn't seem to actually instruct how to import music. Probably that page's content should be moved to another page about the different formats available and replaced with a nice tutorial about how to import a music file into the music browser.

Anyway, is everyone happy with this current structure? If so let's work inside it to polish things up. It's not done yet, but it's at least understandable. In particular the discussion of the OGG file format needs to be cleaned up and probably moved up under the &quot;latest engine file formats&quot; or even onto its own page about the OGG format.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4434</id>
      <timestamp>2004-11-25T20:54:13Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>edit to the OGG discussion header</comment>
      <text xml:space="preserve">{{innerbox|The following sub-pages are hereby proposed:

[[Legacy:File Formats Overview And History|File Formats Overview and History]] .. or  [[Legacy:Music File Format|Music file format]]

[[Legacy:Creating Music|Creating Music]]

[[Legacy:Importing/Using Music In Unreal Engine Games|Importing/Using Music in Unreal Engine Games]] ... or [[Legacy:Importing Music|Importing Music]]

}}

----

Music can be one of the most important factors in your map. Setting the right music can create an awesome atmosphere and improve [[Legacy:Gameplay|gameplay]]. This section covers almost everything that's related to adding music to your map.  The official information regarding Unreal/UT music files is available at http://unreal.epicgames.com/music.htm.

==File Formats ==

The [[Legacy:Unreal Engine|Unreal engine]] has used a number of different file formats over its many incarnations. These fall into two groups:
; track formats : a bit like a MIDI file bundled with samples to play: these are a combination of short sound clips and instructions on when to play them
; audio formats : an exact audio recording of the entire piece of music

===Early Unreal Engine's Music Formats ===

The music tracks in [[Legacy:Unreal Engine|Unreal engine]] 1 games are all in [[Legacy:UMX File|UMX file]] formats. Basically, a umx file doesn't contain anything special except for the music track itself which was imported into this umx (this is not entirely true). So which music formats can be used to create umx files?

Games that use the earlier Unreal Engine builds (like Unreal, UT and Deus Ex) support ''Direct music'' (MID, MIDI and RMI) and [[Legacy:Music Modules|Music Modules]] - usually shortened to &quot;MOD&quot;, but ''not'' to be mistaken with a game mod! Modules can have different formats, like .s3m, .xm, .it, .mod.

Also, CD audio can be used as music in maps. However, CDA files don't need to be imported into a umx. You can just assign a track number to your map. This is rather pointless though, as the chances that someone will have the same CD you do in their drive when they play the map is practically null. In practice, you'll want to export the music from the CD and then import it into the editor seperately.

===Latest Unreal Engine's Music Formats ===

OGG is the new music format used in UnrealEngine2. ''Ogg Vorbis'' format is an open source encoding format and has a higher compression rate than MP3. This means that the same quality of music will have a smaller .OGG file than the same quality .MP3 file. Put differently, if you have a .OGG file and a .MP3 file of the same size, the .OGG file will have a higher quality.

More info about ogg vorbis at: 
* [http://www.vorbis.com/ Vorbis.com] - Main site
* [http://www.xiph.org/ogg/] - Definition of &quot;Ogg projects&quot;. Related page: [http://www.xiph.org/about.html]
* [http://www.xiph.org/ogg/vorbis/index.html] - More info
* And there's an ogg vorbis encoder/decoder available for [http://www.winamp.com./ Winamp Music Player].

==Adding Music to Maps ==

The procedure for [[Legacy:Assigning Music To Maps|Assigning Music to Maps]] is the same regardless of what version of the engine you are using. However, as noted above, different engines (and even different licensed games using the same engine) have different formats that they support, so the procedure for [[Legacy:Importing Music|Importing Music]] and what file formats can be imported may vary.

==OGG Vorbis Discussion ==

Normally You would import the music into Your map but in this case, You convert it into OGG, place into correct directory and give the file name (without suffix) in the LevelProperties-&gt;Audio-&gt;Song. There are a few caveartes in this though:

- the OGG player does not obey the PATHS= settings in the UT2003.ini file so if You have a separate directory for map developement, You won't hear Your music - for some reason it has to be placed in the same folder as the rest of the OGG files.

- trying to play the OGG in the editor will crash-boom-bang

Now, to create the OGG files You need an OGG capable converter. One that is freeware and works can be found [http://www.dbpoweramp.com/ here].

It is not recommended to rip music off of music CD's - instead You can create/use MIDI and convert it to WAV using [http://www.modplug.com/index.php3 ModPlug tracker]. The WAV is then again easy to convert into OGG.
:&lt;b&gt;Note:&lt;/b&gt; this is completely unnecessary. If you want to use a piece of music on a CD, run it through WinAmp and output it to OGG format. Done deal. MIDI is extremely unreliable, as the sounds you hear on one computer can vary widely from the sounds you hear on another, and converting to WAV is an unnecessary step.

A more widely used alternative is the Oggdrop utility. Download it [http://www.vorbis.com/download_win.psp here]. Start it and just drag the wav file onto it and it will encode it for you. Right click on it to alter options like bitrate, quality, mono/stereo etc. I (Hawkeye) prefer OggdropXPD myself which is the exact same tool but with more options. Highly recommended for it's speed, versatility and ease of use.

* some more stuff... (Ogg Vorbis links etc.)

To be edited:
* How to import MIDIs &amp;ndash; &lt;i&gt;GAH!  I'm wetting my pants in anticipation!  Using Midis would be FANTASTIC for this thing I'm working on.  &amp;ndash; Cap&lt;/i&gt;
:Heh, as far as I know, UEd supports MODs, so importing a MIDI into a MOD should work. But when I do this, the music won't play, because the samples aren't imported. This used to work with previous MPT versions... There's a discussion about this at the [http://forums.beyondunreal.com/showthread.php?threadid=112412 BuF Music board], so I'm just gonna ask those people about it &amp;ndash; &lt;i&gt;The Alien&lt;/i&gt;

&lt;i&gt;Hmm, maybe this page should be divided to stop it from getting too long. I'll see if it needs dividing in the future... &amp;ndash; The Alien&lt;/i&gt;
:yup, splitting it might be necesssary soon, especially if you're thinking of importing your tute.  &amp;ndash; ''Tarquin'' 
::&lt;i&gt;Well, I don't care if the tute is imported here or not. :) It's there on my site, and that's what I wanted. =) If you think it would be good to have it here, I'll be happy to import it ;) &amp;ndash; The Alien&lt;/i&gt;
: &lt;i&gt;P.S. Sorry for the self-pimpage :D :p ;) &amp;ndash; The Alien&lt;/i&gt;

:: bah. If you can't pimp yourself, who can you? :)
:: True. :D

==Comments==

'''bmw5002:''' I converted a collection of the old UT tracker style music into Ogg format so you can use it in your UT2003/2004 maps for a little reminiscing :-) Mail me at bmw5002 at optonline dot net if you want 'em.

'''Wormbo:''' I just found out you could import music into .U files with this line in a .UC file:&lt;uscript&gt;
#exec NEW MUSICFACTORY FILE=&quot;...&quot; NAME=&quot;...&quot;&lt;/uscript&gt;

'''Birelli:''' I think we should split this page by first paraphrasing everything into a quick and clean explanation of how to do things, and then link to pages with some of this &quot;''extremely'' in-depth info&quot; ;-).

'''Wormbo:''' This page definately needs some work.

'''RDGDanClark:''' I'm not a total expert on music in Unreal Engine games, but I'll see what I can do here.

'''Foxpaw:''' This page has a lot of repetition and redundancy. I'll add the [[:Category:Legacy Refactor Me]].

'''Nuleo:''' The Ogg Vorbis format really sucks.  Even though it has a higher compression ratio, even at the highest quality, it sounds muffled, scratchy, and less bright than mp3s or wavs and I have composed about 12 minutes of music so far for a UT2003 Total Conversion.  I think this is part of the reason why the UT2003 soundtrack isn't very good.

'''Foxpaw:''' In theory, Ogg Vorbis is a lossless compression format so it shouldn't sound any different. It's possible that the decoder built in to UT2003 is not very good. In UT at least, there was a major difference between the music in-game and the same music files played using Winamp or Sonique, so maybe this is kind of the same deal.

'''MythOpus:'''  Well, are you refering to the add-on music player in ut2k3 or some other thing ?

'''Foxpaw:''' No, I mean that UT did not produce a completely faithful playback of the actual MOD file that was supposedly being played as music. This was not a flaw in the format, simply a consequence of UT's playback mechanism. Similarly, the Ogg Vorbis files may sounds bad in UT2003, but I highly, highly doubt that it is the fault of the format. As far as I know, an Ogg Vorbis file decoded should be completely identical to the source waveform.

'''Nuleo:''' Ogg files are not completely identical to their source (.wav or other) files.  And the quality of the ogg files is still worse than the mp3s even when played in Winamp.  Probably cause the mp3 format has been around longer so better mp3 encoders are available.

'''Wormbo:''' It all depends on the bitrate used. At the same bitrate an OGG sounds better than an MP3. Try e.g. 64kb/s, you'll definately notice the effect.

'''Hawkeye:''' Ogg Vorbis is much better than mp3 at equal bitrate. This is true at both low (32-64) and high (192-up) bitrates.

Trust me on this. I ripped 500 Audio CD's first in mp3 and changed to ogg because they sound much better than mp3 at equal or slightly lower bitrates.

'''Graphik:''' I cleaned a little before realizing the futility. This page needs a complete rewrite.

'''Birelli:''' Ok, I moved the info on [[Legacy:Music Modules|Music Modules]] to it's own page. This makes the page a lot easier to read, and really all that info belongs on it's own page. I think next is to re-write the &quot;assigning music to maps&quot; and move it towards the top of the page. Maybe even it's own page, this is really the only info most people care about.

'''Birelli:''' Alright, I think I've finally got things in at least somewhat working order. Nowhere on this page was there a description of how to import a music file into your map. The [[Legacy:Importing Music|Importing Music]] page has what used to be the &quot;Importing Music&quot; section of this page, but it doesn't seem to actually instruct how to import music. Probably that page's content should be moved to another page about the different formats available and replaced with a nice tutorial about how to import a music file into the music browser.

Anyway, is everyone happy with this current structure? If so let's work inside it to polish things up. It's not done yet, but it's at least understandable. In particular the discussion of the OGG file format needs to be cleaned up and probably moved up under the &quot;latest engine file formats&quot; or even onto its own page about the OGG format.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Music Browser</title>
    <id>2078</id>
    <revision>
      <id>5058</id>
      <timestamp>2007-12-07T15:51:57Z</timestamp>
      <contributor>
        <ip>Captain Kewl</ip>
      </contributor>
      <comment>If it's not related, why is it there?</comment>
      <text xml:space="preserve">The '''Music Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

Uses of the browser:
* None in UT2003 since it doesn't use music packages anymore. Instead .OGG [[Legacy:Music|music]] files are used, but those aren't Unreal packages.

[[Image:Legacy_interface-Ed3-musicbrowser.png|center|The Music Browser in its complete uselessness...]]

==Opening ==

The Music Browser is accessed in two ways: 
* Select [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Music Browser
* Press the Music Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window

----

''UnrealEd 2 stuff:''

UnrealEd's Music Browser displays all loaded [[Legacy:Music|music]] [[Legacy:Package|package]]s (UMX) and allows you to listen to those files. This browser is not used in [[Legacy:UnrealEd|UnrealEd]] 3 although it is still there.

UMX files are Unreal [[Legacy:Package|Package]]s just like UAX or UTX. They contain exactly one module [[Legacy:Music|music]] file (.S3M, .IT or .XM) which can be exported via UnrealEd or [[Legacy:BatchExportCommandlet|UCC BatchExport]].

There is a freeware player called UMXPlayer.exe, that will play .UMX music files. However, it doesn't run on all systems. It has been discovered that Goldwave version 5 will read .UMX and .OGG music files perfectly; they can then be Saved As... any file format that Goldwave supports - including .MP3 (you can then use an app like TotalRecorder to edit the MP3 file's tags, for display in media players).

There's also a Winamp 2.x plugin for playing UMX files and the ModPlug Player supports them, too. They are nothing more than wrapped module music after all.

----

==Related Topics==
* [[Legacy:UnrealEd 2|UnrealEd 2]]
* [[Legacy:Music|Music]]
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Sounds|Sounds]]

----

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Group Browser|Group Browser]] | [[Legacy:Sound Browser|Sound Browser]] '''Next &gt;'''

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; the UEd 2 part needs work
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5059</id>
      <timestamp>2007-12-02T20:56:50Z</timestamp>
      <contributor>
        <ip>40.84-48-210.nextgentel.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">The '''Music Browser''' is one of several [[Legacy:Resource Browser|Resource Browser]]s in the [[Legacy:UnrealEd Interface|UnrealEd Interface]]. By default it is docked in the [[Legacy:Master Browser|Master Browser]].

Uses of the browser:
* None in UT2003 since it doesn't use music packages anymore. Instead .OGG [[Legacy:Music|music]] files are used, but those aren't Unreal packages.

[[Image:Legacy_interface-Ed3-musicbrowser.png|center|The Music Browser in its complete uselessness...]]

==Opening ==

The Music Browser is accessed in two ways: 
* Select [[Legacy:UnrealEd Main Menu|UnrealEd Main Menu]] -&gt; View -&gt; Music Browser
* Press the Music Browser button in the middle of the [[Legacy:Toolbar|toolbar]] at the top of the Editor window

----

''UnrealEd 2 stuff:''

UnrealEd's Music Browser displays all loaded [[Legacy:Music|music]] [[Legacy:Package|package]]s (UMX) and allows you to listen to those files. This browser is not used in [[Legacy:UnrealEd|UnrealEd]] 3 although it is still there.

UMX files are Unreal [[Legacy:Package|Package]]s just like UAX or UTX. They contain exactly one module [[Legacy:Music|music]] file (.S3M, .IT or .XM) which can be exported via UnrealEd or [[Legacy:BatchExportCommandlet|UCC BatchExport]].

There is a freeware player called UMXPlayer.exe, that will play .UMX music files. However, it doesn't run on all systems. It has been discovered that Goldwave version 5 will read .UMX and .OGG music files perfectly; they can then be Saved As... any file format that Goldwave supports - including .MP3 (you can then use an app like TotalRecorder to edit the MP3 file's tags, for display in media players).

There's also a Winamp 2.x plugin for playing UMX files and the ModPlug Player supports them, too. They are nothing more than wrapped module music after all.

----

==Related Topics==
* [[Legacy:UnrealEd 2|UnrealEd 2]]
* [[Legacy:Music|Music]]
* [[Legacy:Package Extension Catalog|Package Extension Catalog]]
* [[Legacy:Sounds|Sounds]]
* The non-related Music Browser at sourceforge: http://musicbrowser.sf.net/

----

==Navigation ==

'''&lt;&lt; Main''' [[Legacy:UnrealEd Interface|UnrealEd Interface]]

'''&lt; Previous''' [[Legacy:Group Browser|Group Browser]] | [[Legacy:Sound Browser|Sound Browser]] '''Next &gt;'''

----

[[:Category:Legacy Mapping]]&lt;br /&gt;[[:Category:Legacy To Do]] &amp;ndash; the UEd 2 part needs work
[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Music Modules</title>
    <id>2198</id>
    <revision>
      <id>5328</id>
      <timestamp>2004-11-26T09:45:56Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Music Modules (MODs) are a mix of streaming audio and direct music. MODs work a lot like MIDIs. They tell when, how long and at what pitch each instrument should play. However, unlike direct music files, MODs do ''not'' get their instrument sounds from &lt;i&gt;your&lt;/i&gt; sound card. Instead, they have an ''independent'' instrument library, which was imported into the MODs when they were created. So for example, someone imports a custom piano sound into a MOD. The program to create MODs now has added the sound to the sound library of this particular MOD. Now, by changing the pitch of the sound, the program can create from this one piano sound a whole range of piano sounds, all at a different note! By manually adding loop start &amp; end points, you can make the piano sound loop so you can play this sound as long as you'd like. And that's basically how a MOD is made. See also: [http://www.modplug.com/mods/whatisamod.php3 What is a Mod?]

==Creating Modules ==

With this knowledge, you now may want to know how to create MODs. OK, for that you need some programs to create music modules. These are called ''tracking programs''. I recommend using the ''ModPlug Tracker'', because it's a Windows based program and very easy to understand. You can download the ModPlug Tracker (''MPT'') at [http://www.modplug.com ModPlug.com]. Explaining the whole process of creating a module would be pointless here, since it is all explained on [http://www.zolaweb.com/Zola/trax/MPTracker/MPT.html this] page. I'll just give a brief summary of how a MOD is created:
# Find the audio samples (instrument sounds) that you're going to use in the MOD and import them into MPT. (samples tab)
# Create loops and instruments from the samples, if needed. (samples tab + instruments tab)
# Switch to the patterns tab and hit the keys on your keyboard - almost every key produces a different tone of the selected instrument.
# Insert the notes (by hitting keys) for your song in the appropriate order from top to bottom. 
# Each instrument should be assigned to a different channel (column). Click play and listen how it sounds. You may need to adjust the speed in the Global tab.
# Tweak with the track until you have the desired melody.

I suggest you start by creating the basic of every song, which is adding the rhythm by importing some drum samples and creating the rhythm. You can then copy this block of rhythm and paste it again and again so you get a drum loop. You now have the fundation of the song and you can expand it by adding other instruments.

&lt;br /&gt;Creating MODs is not easy for everyone. Like learning UEd, it requires a lot of time to become a good tracker. If you really want to create your own music, I suggest you don't give up easily. 

===Information and Help Resources ===

There's much more involved in creating and understanding MODs. Following is a list of sources where you can acquire knowledge on music modules. 
* [http://www.modplug.com/resources/index.php3?session= This] ModPlug page has a list of music module resources. Virtually everything you need to know about MODs is linked there.
* Don't forget that MPT has a ''help file'' where the functions of MPT are explained in. 
* You can ask questions about MODs at the [http://www.modplug.com/community/index.php3?session= ModPlug Community Forums]. 
* There's always [http://www.google.nl/search?hl=nl&amp;q=%22music+modules%22&amp;btnG=Google+zoeken&amp;lr= Google.com] that can provide you with info on MODs.

Don't forget that there are other tracking programs. You should get the one you feel the most comfortable with. I've added links on MPT, just because ''I'' use it. Doesn't mean there aren't any other tracking programs with their own help resources...&lt;br&gt;For exmaple, I know there's [http://www.starbreeze.com/ FastTracker], [http://www.noisemusic.org/it/ Impulse Tracker] &amp; ProTracker

Any other suggestions anyone? 

Here are a couple of sites with sound samples and wave editors, should you need them to create music modules:
:''Wave Editors:''
* [http://www.goldwave.com/ Goldwave.com] - ''Goldwave'' is usually &lt;i&gt;the&lt;/i&gt; editor for people who want to do some serious wave editing. Licence: shareware.
* [http://www.waschbusch.com/ Waschbusch.com] - Here you can find a wave editor called ''Encounter 2000''. It has many features and a good interface. Licence: freeware.
* [http://audacity.sourceforge.net/ Audacity.sourceforge.net] - ''Audacity'' is an open source wave editor with basic features as well as more advanced. The program is continuously under progress. Licence: open source.

:''Musical instrument samples:''
* [http://www.findsounds.com/ FindSounds.com] - The site has a pretty advanced search engine to search for virtually any sound. 
* [http://www.samplenet.co.uk/ Samplenet.co.uk] - Many people's favourite instrument sample database. Features a huge instrument sample database.
* [http://www.arturia.com/ Arturia.com]
* [http://www.modarchive.com/waveworld/ ModArchive.com] - Has many instrument samples. Many from professional musical keyboards.
* [http://www.soundproz.com/ SoundProz.com] - Has a decent collection of instrument samples. 
* [http://www.samplearena.com/ SampleArena.com] - The site has a long list of samples. 

===Finding and Downloading Modules ===

If you don't want to create MODs yourself, there's always the option of downloading MODs, made by other users and using it in your map. 

&lt;br&gt;Following is a list of sites where you can download music modules (for free). I've got only two sites that have a database of MODs. They're BIG ones though. I'm hoping to add more.
*[http://www.modplug.com/mods/nrelease.php3?session= ModPlug.com MOD download section]
*[http://www.modarchive.com/ ModArchive.com]

'''Attention:''' Before you download loads of MODs for your maps, please read the copyright &amp; credits terms below. Also, note that there's a maximum sound quality in modules that the Unreal Engine supports. I'll be adding this after the copyright notice.

{{innerbox| '''Copyright Issues and Credits'''

 When you download modules from the Internet, be sure to read the readme file (if there is one) which is included! Sometimes, the person who has created the module doesn't want his module to be used in any project or map. Or sometimes, this person wants you to explicitly mention his (nick-)name in your readme file when you distribute the map/project. Adding someone's music to your map without any permission or mentioning his name is simply considered as ''wrong''. You should always make clear that it was not ''you'' who created the music for the map and report who &lt;i&gt;did&lt;/i&gt; create the music. Even if this is not claimed in the readme file included with the module. 

 '''Always mention the (nick-)name of the person who created the module in your readme file!'''

 So give credits to that person. Not that you'll get sued the minute you don't, but by doing this, you indicate who made it, so people will know who was responsible for the music and maybe try out some other modules of that person. Also, you'll be showing this person respect by including his/her name in your readme file and this in turn will make you more respected...

}}

==Comments ==

'''Birelli:''' This page is all content moved from the [[Legacy:Music|Music]] page. It's relevant, but it's very general and could apply to anything (not just UT), so it fits nicely on its own page.</text>
    </revision>
    <revision>
      <id>5329</id>
      <timestamp>2004-11-25T20:45:49Z</timestamp>
      <contributor>
        <ip>Birelli</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Music Modules ==

Music Modules (MODs) are a mix of streaming audio and direct music. MODs work a lot like MIDIs. They tell when, how long &amp; at what pitch each instrument should play. However, unlike direct music files, MODs do ''not'' get their instrument sounds from &lt;i&gt;your&lt;/i&gt; sound card. Instead, they have an ''independent'' instrument library, which was imported into the MODs when they were created. So for example, someone imports a custom piano sound into a MOD. The program to create MODs now has added the sound to the sound library of this particular MOD. Now, by changing the pitch of the sound, the program can create from this one piano sound a whole range of piano sounds, all at a different note! By manually adding loop start &amp; end points, you can make the piano sound loop so you can play this sound as long as you'd like. And that's basically how a MOD is made. See also: [http://www.modplug.com/mods/whatisamod.php3 What is a Mod?]

===Creating Modules ===

With this knowledge, you now may want to know how to create MODs. OK, for that you need some programs to create music modules. These are called ''tracking programs''. I recommend using the ''ModPlug Tracker'', because it's a Windows based program and very easy to understand. You can download the ModPlug Tracker (''MPT'') at [http://www.modplug.com ModPlug.com]. Explaining the whole process of creating a module would be pointless here, since it is all explained on [http://www.zolaweb.com/Zola/trax/MPTracker/MPT.html this] page. I'll just give a brief summary of how a MOD is created:
# Find the audio samples (instrument sounds) that you're going to use in the MOD and import them into MPT. (samples tab)
# Create loops and instruments from the samples, if needed. (samples tab + instruments tab)
# Switch to the patterns tab and hit the keys on your keyboard - almost every key produces a different tone of the selected instrument.
# Insert the notes (by hitting keys) for your song in the appropriate order from top to bottom. 
# Each instrument should be assigned to a different channel (column). Click play and listen how it sounds. You may need to adjust the speed in the Global tab.
# Tweak with the track until you have the desired melody.

I suggest you start by creating the basic of every song, which is adding the rhythm by importing some drum samples and creating the rhythm. You can then copy this block of rhythm and paste it again and again so you get a drum loop. You now have the fundation of the song and you can expand it by adding other instruments.

&lt;br /&gt;Creating MODs is not easy for everyone. Like learning UEd, it requires a lot of time to become a good tracker. If you really want to create your own music, I suggest you don't give up easily. 

===Information and Help Resources ===

There's much more involved in creating and understanding MODs. Following is a list of sources where you can acquire knowledge on music modules. 
* [http://www.modplug.com/resources/index.php3?session= This] ModPlug page has a list of music module resources. Virtually everything you need to know about MODs is linked there.
* Don't forget that MPT has a ''help file'' where the functions of MPT are explained in. 
* You can ask questions about MODs at the [http://www.modplug.com/community/index.php3?session= ModPlug Community Forums]. 
* There's always [http://www.google.nl/search?hl=nl&amp;q=%22music+modules%22&amp;btnG=Google+zoeken&amp;lr= Google.com] that can provide you with info on MODs.

Don't forget that there are other tracking programs. You should get the one you feel the most comfortable with. I've added links on MPT, just because ''I'' use it. Doesn't mean there aren't any other tracking programs with their own help resources...&lt;br&gt;For exmaple, I know there's [http://www.starbreeze.com/ FastTracker], [http://www.noisemusic.org/it/ Impulse Tracker] &amp; ProTracker

Any other suggestions anyone? 

Here are a couple of sites with sound samples and wave editors, should you need them to create music modules:
:''Wave Editors:''
* [http://www.goldwave.com/ Goldwave.com] - ''Goldwave'' is usually &lt;i&gt;the&lt;/i&gt; editor for people who want to do some serious wave editing. Licence: shareware.
* [http://www.waschbusch.com/ Waschbusch.com] - Here you can find a wave editor called ''Encounter 2000''. It has many features and a good interface. Licence: freeware.
* [http://audacity.sourceforge.net/ Audacity.sourceforge.net] - ''Audacity'' is an open source wave editor with basic features as well as more advanced. The program is continuously under progress. Licence: open source.

:''Musical instrument samples:''
* [http://www.findsounds.com/ FindSounds.com] - The site has a pretty advanced search engine to search for virtually any sound. 
* [http://www.samplenet.co.uk/ Samplenet.co.uk] - Many people's favourite instrument sample database. Features a huge instrument sample database.
* [http://www.arturia.com/ Arturia.com]
* [http://www.modarchive.com/waveworld/ ModArchive.com] - Has many instrument samples. Many from professional musical keyboards.
* [http://www.soundproz.com/ SoundProz.com] - Has a decent collection of instrument samples. 
* [http://www.samplearena.com/ SampleArena.com] - The site has a long list of samples. 

===Finding and Downloading Modules ===

If you don't want to create MODs yourself, there's always the option of downloading MODs, made by other users and using it in your map. 

&lt;br&gt;Following is a list of sites where you can download music modules (for free). I've got only two sites that have a database of MODs. They're BIG ones though. I'm hoping to add more.
*[http://www.modplug.com/mods/nrelease.php3?session= ModPlug.com MOD download section]
*[http://www.modarchive.com/ ModArchive.com]

'''Attention:''' Before you download loads of MODs for your maps, please read the copyright &amp; credits terms below. Also, note that there's a maximum sound quality in modules that the Unreal Engine supports. I'll be adding this after the copyright notice.

{{innerbox| '''Copyright Issues and Credits'''

 When you download modules from the Internet, be sure to read the readme file (if there is one) which is included! Sometimes, the person who has created the module doesn't want his module to be used in any project or map. Or sometimes, this person wants you to explicitly mention his (nick-)name in your readme file when you distribute the map/project. Adding someone's music to your map without any permission or mentioning his name is simply considered as ''wrong''. You should always make clear that it was not ''you'' who created the music for the map and report who &lt;i&gt;did&lt;/i&gt; create the music. Even if this is not claimed in the readme file included with the module. 

 '''Always mention the (nick-)name of the person who created the module in your readme file!'''

 So give credits to that person. Not that you'll get sued the minute you don't, but by doing this, you indicate who made it, so people will know who was responsible for the music and maybe try out some other modules of that person. Also, you'll be showing this person respect by including his/her name in your readme file and this in turn will make you more respected...

}}

==Comments ==

'''Birelli:''' This page is all content moved from the [[Legacy:Music|Music]] page. It's relevant, but it's very general and could apply to anything (not just UT), so it fits nicely on it's own page.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MusicEvent</title>
    <id>1808</id>
    <revision>
      <id>4435</id>
      <timestamp>2003-01-06T03:40:42Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; MusicEvent}}

A MusicEvent actor is designed to change the music that players in the game hear when it's triggered.  There are a number of configurable variables that can affect this change.

==Properties ==
; bool bAffectAllPlayers :If set to True, then every player in the level will hear the transition. If set to False, then only the player that triggered the actor will hear it.
; bool bOnceOnly  :If set to True, then after the MusicEvent has been triggered once, it cannot be triggered again.
; bool bSilence :If set to True, then the MusicEvent actor override its settings for song and CD Track and simply bring the music to a halt. The various Transition types still apply.
; byte CdTrack :This integer value specifies the track of an audio CD in the computer's CD-ROM drive. When triggered, the MusicEvent will cause this track on an audio CD to begin playing. The default value of 255 means that it will ignore this statement and default to the listed Song. 
; Music Song :This specifies the location of the music resource to access and begin playing (package and resource name).
; byte SongSection :This number specifies the pattern to begin at when the Song starts to play.  (Look further down the page for more information.)
; EMusicTransition Transition : This value determines how the music should change between the current music to the piece of music defined in this actor.&lt;br /&gt;The EMusicTransition enum is declared in the [[Legacy:Actor|Actor]] class and can be set to one of these values:
;;MTRAN_None : the music will not make a successful transition.
;;MTRAN_Instant : the music will change instantly. 
;;MTRAN_Segue : the two pieces of music will almost seem to overlap due to the quickness of the change.
;;MTRAN_Fade : the first piece of music will fade out before the second one begins.
;;MTRAN_FastFade : like MTRAN_Fade, but the first piece of music takes less time to fade out.
;;MTRAN_SlowFade : like MTRAN_Fade, but the first piece of music takes longer to fade out.

==Tutorial ==

To test this actor, all you need is a basic room with a [[Legacy:Trigger|Trigger]] and a MusicEvent in it. The room needs to be large enough that the player can move around freely without inadvertently touching the trigger. Set the Trigger's [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the MusicEvent, and put the Trigger in a place where you'll be able to both find it and avoid it (give it [[Legacy:Actor (UT)/Lighting|light]] properties, for example). You can put the MusicEvent actor anywhere you want because its location is entirely irrelevant. However, most mappers put such actors in an area that is relevant to the actor's function, such as near the Trigger that causes it to work. 

Once you have set up the room with all of the necessities, and the Trigger and MusicEvent properties are set up as you would like them, test this mini-map in Unreal or UT. You will notice that when you set off the Trigger, the music starts to play. Also, if you left bOnceOnly to false, then you can set off the Trigger again and the music will start over when you do.

==Troubleshooting Questions ==

There are some music files in the original Unreal that don't play the tempo of some of their songs properly at times. I am not sure of the actual mechanics of the problem, but I do know both the cause of the problem and a viable solution. To more easily understand this fix, I suggest that you look up the [[Legacy:Dispatcher|Dispatcher]] tutorial in this guide. 

To hear the problem more plainly for yourself, start by choosing a certain music package from Unreal. A few of the music packages that I have found this problem in are Nali.umx, UTemple.umx, and WarGate.umx. (Nali and UTemple have 2 songs each, while WarGate has 3 songs.) Choose one of these music packages for your MusicEvent actor, and choose SongSection 1 for it. When you test it, you will hear a noticeable drag in the tempo. Now, I'll introduce a method to correct it. 

Leave the room set up as before, but remove the Event and Tag names on the Trigger and MusicEvent. Now, add a Dispatcher and a second MusicEvent actor to the world. In the second MusicEvent, use the same song as before, but choose SongSection 0 for it. Set the Transition property of this &quot;Section 0&quot; actor to whatever it was in your other one, and then change the Transition type for the &quot;Section 1&quot; actor to MTRAN_Instant or MTRAN_Segue. 

Now enter the Dispatcher's properties and set up the first two OutEvents names to your &quot;Section 0&quot; tag and &quot;Section 1&quot; tags, whatever they are. Then go into OutDelays, and in the same place as the &quot;Section 1&quot; tag, change the number to 0.01 seconds. Before you leave, give the Dispatcher a unique Tag name. Close the Dispatcher's properties, and open your ordinary Trigger's properties. All you need to do here is make the Trigger's Event name the same as the Dispatcher's Tag name, so that the Trigger will go to the Dispatcher instead of the MusicEvent when it's triggered. 

When you test the map and set off the Trigger, you might hear a small glitch at the beginning, but it's better than having the whole song ruined. Now I'll answer your question: &quot;What did we do and why did it work?&quot; The game won't play section 1 of these files incorrectly if section 0 is playing beforehand, so we make it do so. When the Trigger is set off, it goes to the Dispatcher. The first thing it does is trigger the MusicEvent set up to play section 0, but 1/100th of a second later, the Dispatcher triggers the MusicEvent set up to play section 1. The result is that the music at section 1 recieves the benefit of a proper tempo, since section 0 was playing beforehand.

'''Ike Bart:''' I tried using the CD track with the music event with one of my music CDs in Unreal Tournament and all I got was the default song in the level properties to play.  

'''Ike Bart:''' After browsing through the advanced options, I found something under the audio section called &quot;UseCDMusic.&quot;  I enabled that and got the CD audio to work.  The only problem is that the default song in the level properties plays at the same time.

==About SongSection ==

Music files that are tracked for the Unreal engine will sometimes contain more than one song. This setting is used to determine where in the file the actor should begin playing the music. In the music file, the patterns (phrases of music) from one song are kept separate from the others by using loop points. Usually, the patterns will be arranged so that the first patter of each song in the file is one of the first patterns in the file (i.e. patterns 0, 1, and 2, if there are three songs). Something to remember:  the first pattern in any music file is always pattern 0. 

Here's an example of SongSection that you should be familiar with if you've played any part of the Unreal SinglePlayer game. In the first Rrajigar Mines level, the first song you hear is SongSection 2 of DigSh.umx. After you cut the power to the force field, the music fades out into silence. A MusicEvent actor was used for this effect. When you face the first Skaarj Warrior in the game, the music instantly begins playing SongSection 1 of DigSh.umx. The music then continues through most of the level until it changes again to a quieter song, which would be SongSection 0 of DigSh.umx. 

Also, there is currently no way to listen to all songs in a music package from within UnrealEd. To hear the entire contents of a music package, I suggest downloading a copy of ModPlug Player from [http://www.modplug.com ModPlug's site]. If you have any interest in tracking music yourself, I would also suggest downloading ModPlug Tracker from the same location. 

==Related Topics ==
* [[Legacy:Music|Music]]</text>
    </revision>
    <revision>
      <id>4436</id>
      <timestamp>2002-09-09T10:04:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>formatting</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; MusicEvent}}

A MusicEvent actor is designed to change the music that players in the game hear when it's triggered.  There are a number of configurable variables that can affect this change.

==Properties ==
; bool bAffectAllPlayers :If set to True, then every player in the level will hear the transition. If set to False, then only the player that triggered the actor will hear it.
; bool bOnceOnly  :If set to True, then after the MusicEvent has been triggered once, it cannot be triggered again.
; bool bSilence :If set to True, then the MusicEvent actor override its settings for song and CD Track and simply bring the music to a halt. The various Transition types still apply.
; byte CdTrack :This integer value specifies the track of an audio CD in the computer's CD-ROM drive. When triggered, the MusicEvent will cause this track on an audio CD to begin playing. The default value of 255 means that it will ignore this statement and default to the listed Song. 
; Music Song :This specifies the location of the music resource to access and begin playing (package and resource name).
; byte SongSection :This number specifies the pattern to begin at when the Song starts to play.  (Look further down the page for more information.)
; EMusicTransition Transition : This value determines how the music should change between the current music to the piece of music defined in this actor.&lt;br /&gt;The EMusicTransition enum is declared in the [[Legacy:Actor|Actor]] class and can be set to one of these values:
;;MTRAN_None : the music will not make a successful transition.
;;MTRAN_Instant : the music will change instantly. 
;;MTRAN_Segue : the two pieces of music will almost seem to overlap due to the quickness of the change.
;;MTRAN_Fade : the first piece of music will fade out before the second one begins.
;;MTRAN_FastFade : like MTRAN_Fade, but the first piece of music takes less time to fade out.
;;MTRAN_SlowFade : like MTRAN_Fade, but the first piece of music takes longer to fade out.

==Tutorial ==

To test this actor, all you need is a basic room with a [[Legacy:Trigger|Trigger]] and a MusicEvent in it. The room needs to be large enough that the player can move around freely without inadvertently touching the trigger. Set the Trigger's [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the MusicEvent, and put the Trigger in a place where you'll be able to both find it and avoid it (give it [[Legacy:Actor (UT)/Lighting|light]] properties, for example). You can put the MusicEvent actor anywhere you want because its location is entirely irrelevant. However, most mappers put such actors in an area that is relevant to the actor's function, such as near the Trigger that causes it to work. 

Once you have set up the room with all of the necessities, and the Trigger and MusicEvent properties are set up as you would like them, test this mini-map in Unreal or UT. You will notice that when you set off the Trigger, the music starts to play. Also, if you left bOnceOnly to false, then you can set off the Trigger again and the music will start over when you do.

==Troubleshooting Questions ==

There are some music files in the original Unreal that don't play the tempo of some of their songs properly at times. I am not sure of the actual mechanics of the problem, but I do know both the cause of the problem and a viable solution. To more easily understand this fix, I suggest that you look up the [[Legacy:Dispatcher|Dispatcher]] tutorial in this guide. 

To hear the problem more plainly for yourself, start by choosing a certain music package from Unreal. A few of the music packages that I have found this problem in are Nali.umx, UTemple.umx, and WarGate.umx. (Nali and UTemple have 2 songs each, while WarGate has 3 songs.) Choose one of these music packages for your MusicEvent actor, and choose SongSection 1 for it. When you test it, you will hear a noticeable drag in the tempo. Now, I'll introduce a method to correct it. 

Leave the room set up as before, but remove the Event and Tag names on the Trigger and MusicEvent. Now, add a Dispatcher and a second MusicEvent actor to the world. In the second MusicEvent, use the same song as before, but choose SongSection 0 for it. Set the Transition property of this &quot;Section 0&quot; actor to whatever it was in your other one, and then change the Transition type for the &quot;Section 1&quot; actor to MTRAN_Instant or MTRAN_Segue. 

Now enter the Dispatcher's properties and set up the first two OutEvents names to your &quot;Section 0&quot; tag and &quot;Section 1&quot; tags, whatever they are. Then go into OutDelays, and in the same place as the &quot;Section 1&quot; tag, change the number to 0.01 seconds. Before you leave, give the Dispatcher a unique Tag name. Close the Dispatcher's properties, and open your ordinary Trigger's properties. All you need to do here is make the Trigger's Event name the same as the Dispatcher's Tag name, so that the Trigger will go to the Dispatcher instead of the MusicEvent when it's triggered. 

When you test the map and set off the Trigger, you might hear a small glitch at the beginning, but it's better than having the whole song ruined. Now I'll answer your question: &quot;What did we do and why did it work?&quot; The game won't play section 1 of these files incorrectly if section 0 is playing beforehand, so we make it do so. When the Trigger is set off, it goes to the Dispatcher. The first thing it does is trigger the MusicEvent set up to play section 0, but 1/100th of a second later, the Dispatcher triggers the MusicEvent set up to play section 1. The result is that the music at section 1 recieves the benefit of a proper tempo, since section 0 was playing beforehand.

==About SongSection ==

Music files that are tracked for the Unreal engine will sometimes contain more than one song. This setting is used to determine where in the file the actor should begin playing the music. In the music file, the patterns (phrases of music) from one song are kept separate from the others by using loop points. Usually, the patterns will be arranged so that the first patter of each song in the file is one of the first patterns in the file (i.e. patterns 0, 1, and 2, if there are three songs). Something to remember:  the first pattern in any music file is always pattern 0. 

Here's an example of SongSection that you should be familiar with if you've played any part of the Unreal SinglePlayer game. In the first Rrajigar Mines level, the first song you hear is SongSection 2 of DigSh.umx. After you cut the power to the force field, the music fades out into silence. A MusicEvent actor was used for this effect. When you face the first Skaarj Warrior in the game, the music instantly begins playing SongSection 1 of DigSh.umx. The music then continues through most of the level until it changes again to a quieter song, which would be SongSection 0 of DigSh.umx. 

Also, there is currently no way to listen to all songs in a music package from within UnrealEd. To hear the entire contents of a music package, I suggest downloading a copy of ModPlug Player from [http://www.modplug.com ModPlug's site]. If you have any interest in tracking music yourself, I would also suggest downloading ModPlug Tracker from the same location. 

==Related Topics ==
* [[Legacy:Music|Music]]</text>
    </revision>
    <revision>
      <id>4437</id>
      <timestamp>2003-01-06T02:40:37Z</timestamp>
      <contributor>
        <ip>Ike Bart</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Triggers (UT)|Triggers (UT)]] &gt;&gt; MusicEvent}}

A MusicEvent actor is designed to change the music that players in the game hear when it's triggered.  There are a number of configurable variables that can affect this change.

==Properties ==
; bool bAffectAllPlayers :If set to True, then every player in the level will hear the transition. If set to False, then only the player that triggered the actor will hear it.
; bool bOnceOnly  :If set to True, then after the MusicEvent has been triggered once, it cannot be triggered again.
; bool bSilence :If set to True, then the MusicEvent actor override its settings for song and CD Track and simply bring the music to a halt. The various Transition types still apply.
; byte CdTrack :This integer value specifies the track of an audio CD in the computer's CD-ROM drive. When triggered, the MusicEvent will cause this track on an audio CD to begin playing. The default value of 255 means that it will ignore this statement and default to the listed Song. 
; Music Song :This specifies the location of the music resource to access and begin playing (package and resource name).
; byte SongSection :This number specifies the pattern to begin at when the Song starts to play.  (Look further down the page for more information.)
; EMusicTransition Transition : This value determines how the music should change between the current music to the piece of music defined in this actor.&lt;br /&gt;The EMusicTransition enum is declared in the [[Legacy:Actor|Actor]] class and can be set to one of these values:
;;MTRAN_None : the music will not make a successful transition.
;;MTRAN_Instant : the music will change instantly. 
;;MTRAN_Segue : the two pieces of music will almost seem to overlap due to the quickness of the change.
;;MTRAN_Fade : the first piece of music will fade out before the second one begins.
;;MTRAN_FastFade : like MTRAN_Fade, but the first piece of music takes less time to fade out.
;;MTRAN_SlowFade : like MTRAN_Fade, but the first piece of music takes longer to fade out.

==Tutorial ==

To test this actor, all you need is a basic room with a [[Legacy:Trigger|Trigger]] and a MusicEvent in it. The room needs to be large enough that the player can move around freely without inadvertently touching the trigger. Set the Trigger's [[Legacy:Event|Event]] to the [[Legacy:Tag|Tag]] of the MusicEvent, and put the Trigger in a place where you'll be able to both find it and avoid it (give it [[Legacy:Actor (UT)/Lighting|light]] properties, for example). You can put the MusicEvent actor anywhere you want because its location is entirely irrelevant. However, most mappers put such actors in an area that is relevant to the actor's function, such as near the Trigger that causes it to work. 

Once you have set up the room with all of the necessities, and the Trigger and MusicEvent properties are set up as you would like them, test this mini-map in Unreal or UT. You will notice that when you set off the Trigger, the music starts to play. Also, if you left bOnceOnly to false, then you can set off the Trigger again and the music will start over when you do.

==Troubleshooting Questions ==

There are some music files in the original Unreal that don't play the tempo of some of their songs properly at times. I am not sure of the actual mechanics of the problem, but I do know both the cause of the problem and a viable solution. To more easily understand this fix, I suggest that you look up the [[Legacy:Dispatcher|Dispatcher]] tutorial in this guide. 

To hear the problem more plainly for yourself, start by choosing a certain music package from Unreal. A few of the music packages that I have found this problem in are Nali.umx, UTemple.umx, and WarGate.umx. (Nali and UTemple have 2 songs each, while WarGate has 3 songs.) Choose one of these music packages for your MusicEvent actor, and choose SongSection 1 for it. When you test it, you will hear a noticeable drag in the tempo. Now, I'll introduce a method to correct it. 

Leave the room set up as before, but remove the Event and Tag names on the Trigger and MusicEvent. Now, add a Dispatcher and a second MusicEvent actor to the world. In the second MusicEvent, use the same song as before, but choose SongSection 0 for it. Set the Transition property of this &quot;Section 0&quot; actor to whatever it was in your other one, and then change the Transition type for the &quot;Section 1&quot; actor to MTRAN_Instant or MTRAN_Segue. 

Now enter the Dispatcher's properties and set up the first two OutEvents names to your &quot;Section 0&quot; tag and &quot;Section 1&quot; tags, whatever they are. Then go into OutDelays, and in the same place as the &quot;Section 1&quot; tag, change the number to 0.01 seconds. Before you leave, give the Dispatcher a unique Tag name. Close the Dispatcher's properties, and open your ordinary Trigger's properties. All you need to do here is make the Trigger's Event name the same as the Dispatcher's Tag name, so that the Trigger will go to the Dispatcher instead of the MusicEvent when it's triggered. 

When you test the map and set off the Trigger, you might hear a small glitch at the beginning, but it's better than having the whole song ruined. Now I'll answer your question: &quot;What did we do and why did it work?&quot; The game won't play section 1 of these files incorrectly if section 0 is playing beforehand, so we make it do so. When the Trigger is set off, it goes to the Dispatcher. The first thing it does is trigger the MusicEvent set up to play section 0, but 1/100th of a second later, the Dispatcher triggers the MusicEvent set up to play section 1. The result is that the music at section 1 recieves the benefit of a proper tempo, since section 0 was playing beforehand.

'''Ike Bart:''' I tried using the CD track with the music event with one of my music CDs in Unreal Tournament and all I got was the default song in the level properties to play.  Does the CD in question have to be the Unreal CD or can it be any old music CD?

==About SongSection ==

Music files that are tracked for the Unreal engine will sometimes contain more than one song. This setting is used to determine where in the file the actor should begin playing the music. In the music file, the patterns (phrases of music) from one song are kept separate from the others by using loop points. Usually, the patterns will be arranged so that the first patter of each song in the file is one of the first patterns in the file (i.e. patterns 0, 1, and 2, if there are three songs). Something to remember:  the first pattern in any music file is always pattern 0. 

Here's an example of SongSection that you should be familiar with if you've played any part of the Unreal SinglePlayer game. In the first Rrajigar Mines level, the first song you hear is SongSection 2 of DigSh.umx. After you cut the power to the force field, the music fades out into silence. A MusicEvent actor was used for this effect. When you face the first Skaarj Warrior in the game, the music instantly begins playing SongSection 1 of DigSh.umx. The music then continues through most of the level until it changes again to a quieter song, which would be SongSection 0 of DigSh.umx. 

Also, there is currently no way to listen to all songs in a music package from within UnrealEd. To hear the entire contents of a music package, I suggest downloading a copy of ModPlug Player from [http://www.modplug.com ModPlug's site]. If you have any interest in tracking music yourself, I would also suggest downloading ModPlug Tracker from the same location. 

==Related Topics ==
* [[Legacy:Music|Music]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MusicTrigger</title>
    <id>28453</id>
    <revision>
      <id>40150</id>
      <timestamp>2009-11-17T10:09:20Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Musicalglass</title>
    <id>2140</id>
    <revision>
      <id>5210</id>
      <timestamp>2003-11-26T22:11:52Z</timestamp>
      <contributor>
        <ip>Musicalglass</ip>
      </contributor>
      <comment>*Added a bio and link to my website</comment>
      <text xml:space="preserve">What can I say? I've had a strange life. I've slept in mansions and I've slept in gutters.

I never knew who my father was. My mother was decapitated in a car accident when I was 4. I was raised by my bickering alcoholic grandparents in complete isolation in a rundown shack in the middle of some Illinois cornfields, miles from anyone. I almost died of pnuemonia from neglect.

When I was a kid, I was dropped on the seesaw by my cousin and have only recently discovered that the constant back pain I have experienced all my life is the result of my tailbone being jammed up behind my lower vertabrae.

To escape Illinois, on my step brother's encouragement, I moved to Texas seeking work just in time for a major dip in oil prices and an economic recession. I ended up being framed for stealing a ham, ironically though I don't even eat pork, and spent time in the Texas penitentiary.

Then on the other side of the coin:

I moved to New Orleans where I discovered the art of street performing. Upon discovering this new means of self sufficiency, I tried a number of gigs including playing the 5 string banjo and taking photographs of tourists on Bourbon St. One day I discovered the art of playing music on wineglasses and set out to build my own set. After learning a simple song, I went out to rehearse in public and immediately discovered the hypnotic effect glass music has on the listener. People would stop dead in their tracks and be drawn in like a magnet with their jaws hanging open. Students would empty their pockets, giving me every penny they had, wishing they had more to give. Hell's Angels would be standing next to old ladies, both in tears. People would literally get down on their knees and psuedo worship me. I got movie and recording offers and a whole string of wanna-be producers trying to take advantage of me and ended up on international TV shows and have been seen by over 200 million people. I've played at billionaire's homes and have played at both the Bohemian Club and Bohemian Grove, a highly prestigious and fairly secretive club like the Masons consisting of heads of state from around the world including every republican president and people like Kissinger, etc. supposedly where they all go to relax and decide on matters of world policy. I got to jam with a number of famous musicians like Mickey Hart from the Grateful Dead and Steve Smith from Journey and have entertained a number of famous celebrities as well.

You can check out some glass playing samples on my webpage:

http://home.earthlink.net/~musicalglass/

Any internet based recording isn't going to do justice to the effect of live glass music, but you'll get the idea.

'''Wormbo:''' Welcome to the Wiki. :)

'''GRAF1K:''' Welcome. :tup:

'''Musicalglass:''' Thanks Folks. Accidentally clicked on my name and there you were. Nice to meetcha

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5211</id>
      <timestamp>2003-11-14T06:54:06Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki. :)

'''GRAF1K:''' Welcome. :tup:

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5212</id>
      <timestamp>2003-11-14T19:45:52Z</timestamp>
      <contributor>
        <ip>Musicalglass</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Wormbo:''' Welcome to the Wiki. :)

'''GRAF1K:''' Welcome. :tup:

'''Musicalglass:''' Thanks Folks. Accidentally clicked on my name and there you were. Nice to meetcha

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutInstaGib</title>
    <id>2226</id>
    <revision>
      <id>5387</id>
      <timestamp>2005-12-19T05:31:34Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; MutInstaGib (Package: XGame)}}

{{innerbox|''all hits are instant kill! old sk00l''

}}

==Properties==

===Hidden===
; name WeaponName :
; name AmmoName :
; string WeaponString :
; string AmmoString :
; bool bAllowTranslocator (config) :
; bool bAllowBoost (config) :
; string TranslocDisplayText (localized) :
; string BoostDisplayText (localized) :
; string TranslocDescText (localized) :
; string BoostDescText (localized) :

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5388</id>
      <timestamp>2005-12-19T05:18:08Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:MutInstaGib|MutInstaGib]] }}

{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:MutInstaGib|MutInstaGib]] }}

==Properties ==

===Hidden ===
; name AmmoName :  
; string AmmoString :  
; bool bAllowBoost :  
; bool bAllowTranslocator :  
; string BoostDescText :  
; string BoostDisplayText :  
; string TranslocDescText :  
; string TranslocDisplayText :  
; name WeaponName :  
; string WeaponString :  

==Instagib: the popular mutator==

WIP. Some sort of spiel about the mutator here.</text>
    </revision>
    <revision>
      <id>5389</id>
      <timestamp>2005-12-19T05:30:55Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>class markup fixes</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; MutInstaGib (Package: XGame)}}

''all hits are instant kill! old sk00l''

==Properties==

===Hidden===
; name WeaponName :
; name AmmoName :
; string WeaponString :
; string AmmoString :
; bool bAllowTranslocator (config) :
; bool bAllowBoost (config) :
; string TranslocDisplayText (localized) :
; string BoostDisplayText (localized) :
; string TranslocDescText (localized) :
; string BoostDescText (localized) :

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutNukeRifles</title>
    <id>2065</id>
    <revision>
      <id>5029</id>
      <timestamp>2003-02-13T08:52:19Z</timestamp>
      <contributor>
        <ip>Omega</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles ===

====MutNukeRifles ====

&lt;uscript&gt;
//=============================================================================
// Nuke Rifles
//=============================================================================
class MutNukeRifles extends Mutator;

var name WeaponName, AmmoName;
var string WeaponString, AmmoString;
var bool bAllowTranslocator;


function string RecommendCombo(string ComboName)
{
	if ( (ComboName != &quot;xGame.ComboSpeed&quot;) &amp;&amp; (ComboName != &quot;xGame.ComboInvis&quot;) )
	{
		if ( FRand() &lt; 0.65 )
			ComboName = &quot;xGame.ComboInvis&quot;;
		else
			ComboName = &quot;xGame.ComboSpeed&quot;;
	}
	if ( NextMutator != None )
		return NextMutator.RecommendCombo(ComboName);
	return ComboName;
}

function bool AlwaysKeep(Actor Other)
{
	if ( Other.IsA(WeaponName) || Other.IsA(AmmoName) )
		return true;

	if ( NextMutator != None )
		return ( NextMutator.AlwaysKeep(Other) );
	return false;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
	if ( Other.IsA('Weapon') )
	{
        if ( Other.IsA('BallLauncher') )
        {
            bSuperRelevant = 0;
            return true;
        }

		if ( Other.IsA('TransLauncher') &amp;&amp; bAllowTranslocator )
		{
            bSuperRelevant = 0;
            return true;
        }

		if ( !Other.IsA(WeaponName) )
		{
			Level.Game.bWeaponStay = false;
			return false;
		}
	}

	if ( Other.IsA('SniperRifle') )
		return false;

//	if ( Other.IsA('xPickupBase') )
//		Other.bHidden = true;
		
	bSuperRelevant = 0;
	return true;
}

defaultproperties
{
	AmmoName=ShockAmmo
	AmmoString=&quot;xWeapons.ShockAmmo&quot;
	WeaponName=NukeRifle
	WeaponString=&quot;my_mod2.ZoomNukeRifle&quot;
	DefaultWeaponName=&quot;my_mod2.ZoomNukeRifle&quot;

    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;&quot;
    GroupName=&quot;Arena&quot;
    FriendlyName=&quot;Zoom NukeRifles!&quot;
    Description=&quot;Very dangerous long-range combat using zoom rifles that fire nuclear projectiles! he he he&quot;
}
&lt;/uscript&gt;

&amp;ndash;..&amp;ndash;

I tried it,but it din't work.please help,this is a brilliant idea,and right now i'm trying to make enforcers which fire ripper blades in primary fire and sniper rifle guided bullets in secondary fire.Any suggestions?</text>
    </revision>
    <revision>
      <id>5030</id>
      <timestamp>2003-01-05T21:40:11Z</timestamp>
      <contributor>
        <ip>Electric Mini</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles ===

====MutNukeRifles ====

&lt;uscript&gt;
//=============================================================================
// Nuke Rifles
//=============================================================================
class MutNukeRifles extends Mutator;

var name WeaponName, AmmoName;
var string WeaponString, AmmoString;
var bool bAllowTranslocator;


function string RecommendCombo(string ComboName)
{
	if ( (ComboName != &quot;xGame.ComboSpeed&quot;) &amp;&amp; (ComboName != &quot;xGame.ComboInvis&quot;) )
	{
		if ( FRand() &lt; 0.65 )
			ComboName = &quot;xGame.ComboInvis&quot;;
		else
			ComboName = &quot;xGame.ComboSpeed&quot;;
	}
	if ( NextMutator != None )
		return NextMutator.RecommendCombo(ComboName);
	return ComboName;
}

function bool AlwaysKeep(Actor Other)
{
	if ( Other.IsA(WeaponName) || Other.IsA(AmmoName) )
		return true;

	if ( NextMutator != None )
		return ( NextMutator.AlwaysKeep(Other) );
	return false;
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
	if ( Other.IsA('Weapon') )
	{
        if ( Other.IsA('BallLauncher') )
        {
            bSuperRelevant = 0;
            return true;
        }

		if ( Other.IsA('TransLauncher') &amp;&amp; bAllowTranslocator )
		{
            bSuperRelevant = 0;
            return true;
        }

		if ( !Other.IsA(WeaponName) )
		{
			Level.Game.bWeaponStay = false;
			return false;
		}
	}

	if ( Other.IsA('SniperRifle') )
		return false;

//	if ( Other.IsA('xPickupBase') )
//		Other.bHidden = true;
		
	bSuperRelevant = 0;
	return true;
}

defaultproperties
{
	AmmoName=ShockAmmo
	AmmoString=&quot;xWeapons.ShockAmmo&quot;
	WeaponName=NukeRifle
	WeaponString=&quot;my_mod2.ZoomNukeRifle&quot;
	DefaultWeaponName=&quot;my_mod2.ZoomNukeRifle&quot;

    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;&quot;
    GroupName=&quot;Arena&quot;
    FriendlyName=&quot;Zoom NukeRifles!&quot;
    Description=&quot;Very dangerous long-range combat using zoom rifles that fire nuclear projectiles! he he he&quot;
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutTutorial</title>
    <id>2176</id>
    <revision>
      <id>5285</id>
      <timestamp>2006-04-06T22:17:25Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">This Unreal Tournament 2004 Tutorial will take you through the basic process of creating a mutator that allows you to alter a players health and the number of multi-jumps they can perform.

You can download the code from [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName.zip], but it might not be as up to date as the code on this page. For the original page check out [[Legacy:MutTutorial Code|MutTutorial code]].

==Before You Start==

As with the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial we need to create a directory to hold our mutator code.  The name of the directory determines the name of the package into which your code will be compiled.  To that end you need to [[Legacy:Set Up Package Folders|Set Up Package Folders]]:

# Create a directory &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; within your UT2004 directory
# Create a directory &lt;CODE&gt;Classes&lt;/CODE&gt; within the &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; you just created.

You should have the following folder tree:

+ UT2004 

++ MutNeedBetterName

+++ Classes

The '''Mut''' prefix is used as a convention within UT2004 to indicate all packages and classes that relate to mutators.  It is not mandatory to do this and we could have called our package (and therefore the directory) &lt;CODE&gt;NeedBetterName&lt;/CODE&gt;.  It is recommended that you use the conventional Mut prefix though for organisations sake.

==Writing the Mutator==

Now to actually write some code that can be compiled.

Within your &lt;CODE&gt;/UT2004/MutNeedBetterName/Classes&lt;/CODE&gt; directory create a file called &lt;CODE&gt;MutNeedBetterName.uc&lt;/CODE&gt;.  All Unreal Script class files have an extension of '''.uc'''.  They '''must''' also be named after the class file they are contained within.

Add the following code to the file.  The code is described after each logical block.

&lt;uscript&gt;
class MutNeedBetterName extends Mutator;
&lt;/uscript&gt;

This is the class declaration.  We are essentially telling the game that this is a new class called &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; and that it is a type of (it extends, or subclasses) [[Legacy:Mutator|Mutator]]. And finally, like all good things in life, the class declaration is terminated with a semi-colon.  You can see [[Legacy:Class Syntax|Class Syntax]] for more information.

&lt;uscript&gt;
var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth, SuperDuberMaximumHealth; // The number of multi-jumps allowed
//The boost the player gets from a multi-jump and the player's starting health
&lt;/uscript&gt;

The section above defines three variables (all integers - see [[Legacy:Variable Type|Variable Type]]s) that are all properties of the class being defined.

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  local xPawn x; //x is a variable
  x = xPawn(Other); 
  if (x != None)
  {
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth;
    x.SuperHealthMax = SuperDuberMaximumHealth;
  }
  // YOU FORGOT TO CALL THE SUPERCLASS! THIS BREAKS THE MUTATOR CHAIN

}
&lt;/uscript&gt;

The first line declares the function (see [[Legacy:Function Syntax|Function Syntax]]).  This is the function that actually updates the player's attributes.  Because our class is a type of Mutator the &lt;CODE&gt;ModifyPlayer()&lt;/CODE&gt; function will be called automatically for every player in the game as they spawn.

The next two lines of code (ignoring the braces) do the following.
* Declare a local (only visible within the function) variable of type xPawn ([[Legacy:XPawn|xPawn]] is a type of [[Legacy:Pawn|Pawn]], and can be found in the xGame package).
* Assign a value to our local variable after [[Legacy:Typecasting|Typecasting]] the value passed in the &lt;CODE&gt;Other&lt;/CODE&gt; function parameter.  Note that if &lt;CODE&gt;Other&lt;/CODE&gt; is not a type of (or subclass) xPawn our local variable will contain &lt;CODE&gt;None&lt;/CODE&gt;.

The &lt;CODE&gt;if&lt;/CODE&gt; statement checks to see if the local variable has a value by comparing it to the &quot;empty value&quot; &lt;CODE&gt;None&lt;/CODE&gt; using the not equal to (&lt;CODE&gt;!=&lt;/CODE&gt;) operator.  See [[Legacy:Operators|Operators]] for more information.  Remember - if the object referenced by &lt;CODE&gt;Other&lt;/CODE&gt; is not an xPawn our local variable will be equal to (&lt;CODE&gt;----&lt;/CODE&gt;) None.

The block of code within the &lt;CODE&gt;if&lt;/CODE&gt; statement adjusts the player's jump and health properties using the values from our mutator's configurable properties.

&lt;uscript&gt;
defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  SuperDuberMaximumHealth=500
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;
}
&lt;/uscript&gt;

This block of code allows you to specify default values for all of your class properties.  If a class property is declared as configurable then the value within the mutator's ini file will be used if available instead of the value specified here.  The [[Legacy:Default Properties|Default Properties]] page contains much more information about how default values should be specified.

==Compiling and Using the Mutator==

Next add this code to the file UT2004.ini: &quot;EditPackages=MutNeedBetterName&quot;

Move the folder MutNeedBetterName into C:\UT2004 (or where ever you installed UT2004)

Move the file MutNeedBetterName.int into UT2004\system

Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under mutators Mutation Tutorial.

==Adding a Configuration Window==

If you want to allow your mutator's configurable parameters to be changed from the standard UT2004 mutator config window then please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference.

==Useful Pages==
* [[Legacy:Compiler Errors|Compiler Errors]]

----

==Conclusion==

You should now have code that looks like this (without the comments): [[Legacy:MutTutorial Code|MutTutorial Code]]

==Discussion==

'''Tarquin:''' I don't understand what this is trying to show, or why there is no text on that page, only script. Secondly, in your script comments there are a number of questions you've left, and a few misconceptions. I suggest you get wait for feedback on it first before adding it to the chain of lessons.

'''EntropicLqd:''' Imagine you are completely new to Unreal Script.  Is this page going to actually help you in [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] or how to [[Legacy:Set Up Package Folders|Set Up Package Folders]].  There's no set of pre-requisites mentioned anywhere or even any real explanation of what is going on (note to self - must add them to my tut. page).  To my mind the worst thing about the tutorial is that you've assumed that someone has downloaded your code.  Try and fit your tutorial into a similar structure to the other tutorials on the Wiki.  At least that way all of the tutorials will be in a similar form.  Also one of your stated commands will not work under Windows XP, and one of them is redundant - but maybe I'm just being picky in my old age.

'''Mr.bob''' Uhhhhhhhhhh... what are pre-requisites (I mean in  ucode context). Also that is kind of weird because I just used this mut in windows xp and it compiled and then worked flawlessly. Also what does redundant mean. About the prompt command I think you are talking about, I'm surprised it didn't work. Maybe I misspelled it but when I type &quot;prompt $1 into command line in windows XP it gives me a blank prompt which is what I want. Finally there is a smiley I've been wanting to try out...&lt;br /&gt; :stupid:

Oh ya, most importantly this tutorial was not meant for reading, it was meant for downloading as folders a .uc file and a .int file. However that didn't seem to work out. In response to Tarquin (who seems to really enjoy messing with and moving around my things ... this gives me an idea :cheesy: ) this code is trying to give newbs some code that they can mess around with and understand. The very first step people do when they are learning to mess with code is to do things like replace the word health with shield, and this code lets them do that.

Later: Just discovered that all the links I had previously posted to the .zip file were broken. Here is one that has to work: [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName THE FILE]

Tarquin, why don't you tell me what the misconceptions are so I can fix them, you people should really give me a lot more input, although the problem is you can't because there are no links to this page.

'''Tarquin:''' things like &quot;says that there is a local variable that applies only to Xpawns, and that varaible is x.&quot; Please also take care to spell correctly. And please remove your tutorial from the list &amp;ndash; you can put the link further down the page if you like. You can get it linked by addding a category tag to this page.

'''EntropicLqd:''' The redundant command is indeed the prompt one.  You might not like to see where you are in the directory structure but I'm betting most people (like me) do.  Not only that, but the command is irrelevant.  You don't need it to compile any Unreal Script at all - but that's not explained.
: The one I thought wouldn't work under XP was running &quot;command&quot;.  It does work but gives you the old Win9x DOS shell.  The XP version (like NT) is ''cmd''.
: Pre-requisites in Unreal Script terms are the basic things someone needs to know before they can starting writing code.  I linked to them in my previous post.  Also, simply downloading some code and then tweaking the values to see what they do is a very inefficient way of learning.  A good tutorial does the following:
: * Explains what the tutorial will cover and what the person is supposed to learn from doing it.
: * Explains what the person doing the tutorial needs to know in order to complete it.  That is - the assumed ''base knowledge'' or as we like to say ''prerequisites''.
: * Explain in simple steps what must be done to accomplish the goal of the tutorial.  At this point explaining why things are done (in this case why ModifyPlayer() was used) in a lot of detail is necessary.  Your description of ModifyPlayer() is somewhat vague &amp;ndash; and could even be misleading.  And also, you should never ever leave questions unanswered in a tutorial.
: * Conclude with a summary of what the person is supposed to have learned from the tutorial.
: So to reiterate my original point, simply providing people with some code they can mess about with is not a tutorial.  It's also unlikely to help them write their own code in the future as it provides no method for understanding why something was done in a specific way.

'''Mr.bob:''' At this point I am once again forced to admit to my newbishness (is that even a word?) and bow down to your superior knowledge. Putting the tutorial on the front page was reckless and hasty (what do you expect, I'm 14). I will delete it from the front page and start working on one worthy of this terrific site, thx for the advice [[Legacy:EntropicLqd|EntropicLqd]] and sorry for bugging you by posting so much junk [[Legacy:Tarquin|Tarquin]]. A few more points, command, while not as good a cmd still works, but thx anyway for the update. Just saying it would help if you included a description of what modify player does, considering my description was very incorrect.

Growing up in the age of spell checkers has severely damaged my spelling capabilities.

My brother is insisting that I keep the things in progress section intact with my link in it, but I'm telling him [[Legacy:Tarquin|Tarquin]] isn't going to be happy.

Whew, that should do it, the tutorial isn't perfect yet, but it is much better then before. It is still not in traditional tutorial format, but I don't really like the traditional tutorial format.

'''Foxpaw:''' I put some more comments in there to explain some stuff that was a bit misleading. However, as you can now see, the comments take up so much space it's hard to see the code. What you might consider doing is listing the code in it's entirety (without the play by play comments) and then below that take each line and show it dissected.

'''Tarquin:''' &quot;I was sick of lessons like the regeneration mutator that would tell you to modify some code you found without telling you what that code meant.&quot; &amp;ndash; I think that is an ''excellent'' point! We should look into adding a &quot;How it works&quot; or &quot;What's going on&quot; section to our scripting tutorial pages!

'''Mr.Bob's brother:'''  a simple note about the prompt $1 thing. we use it because in Windows XP home edition you start in this part of the directory structure: &lt;tt&gt;C:/Documents and settings/~username&gt;&lt;/tt&gt; and the UT2004 directory is &lt;tt&gt;C:/UT2004&lt;/tt&gt; so we need to make the directory structure become blank to go down to C:/.

PS. call me Doodle77 because it is my username for a bunch of games

'''EntropicLqd:''' The ''prompt'' command simply changes the DOS prompt.  It ''does not'' change the directory you are in.  I suspect you actually meant &lt;CODE&gt;cd c:\UT2004&lt;/CODE&gt;.  If you wanted to make the directory structure blank then &lt;CODE&gt;format C:\&lt;/CODE&gt; is the command you are after.

'''Mr.bob:''' Never mind, you can type in the file path without typing in prompt $1 first, i have changed the script apropratly in light of this new discovery.

Wow this tutorial is really something now. Now i think it can add it to the chain. I will update the .zip file with the new code, and add it to the top of the Uscript lessons. The full exspanation of what the code means will REALLY help out people who are compleate newbs to programing.

'''Tarquin:''' Please could you:
* make links in your text
* add a few headings perhaps
* fix spelling mistakes
* explain what the variables you have modified mean
* I think it would be better to remove the explanations from the script entirely, it would make then easier to read &amp;ndash; instead of comments within script, a section of text with script extracts within it.

'''EntropicLqd:''' Right then Mr.Bob.  Please finish off your tutorial in the style it has started in.  If you do a good job maybe I'll come back and extend it with information regarding constructing a configuration GUI for it.

'''Mr.bob:''' This is what I like about the wiki, it is not me writing this tutorial anymore, it is the whole wiki community. It's very much like open source code, that is what makes open source programs so good and flawless, there is a large amount of people who can look at the code and change things.

'''EntropicLqd:''' Maybe, maybe not.  I'm just showing you how you should have written it in the first place.  I won't be finishing it off for you (and I doubt whether anyone else will) as I don't have time.  I certainly won't be restructuing any more of your tutorials if they are presented in the manner similar to the way this one was.

'''RegularX:''' While I like that more verbal tutes like this are getting written - it should be noted that because this is the wiki, tutes like Regen mutator can be appended to describe the inner workings of the tutorial itself...

'''Mr.bob:''' You said that you wouldn't be finishing it off. Personally I have seen much less polished tutorials then this. I think it is finished, what more does it need?

arg i read it and there is some sloppy coding, i changed it, Please don't change it back, it is acutally really bad. And this is a newb telling you this. First of all the config part is junk, second of all you repeated a lot of parts you didn't have to repeat, third of all the pre-requisites are MUCH steeper then what i had in mind ... ok it is so bad i am sequencering (&lt;-spelling bad) the whole new section and making one that doesn't suck so much later. Please don't put it back, the code is very misleading and wasteful. I can't do anything too soon becuase my mouse is broken, sry.

'''EntropicLqd:'''
: Firstly - Thanks Foxpaw.  I was in a hurry and didn't bother to read what I'd actually written.  Apologies to Mr Bob. for introducing ''junk'' into his perfect tutorial, and also to Foxpaw for making him come in here and fix it.
: Mr Bob, just because there are much less polished tutorials than this doesn't mean that is one is finished.  It just means that the other tutorials are not as good.  While I agree I repeated a lot of the stuff that is covered within the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial I felt it was necessary to make the tutorial complete.  You could also argue that this would be a better ''Hello World'' style tutorial than the existing one as it actually does something.
: Yes I agree the pre-requisites are fairly heavy.  However there is actually a fair amount of stuff that you need to know, and get right before you even start writing any code.
: I'm also fairly sure that the code is broken around the &quot;health&quot; area but I've not had time to actually compile it and check (I'm relatively sure the player's health will get reset to 100 should thep layer actually run over a standard health pickup).
: I've essentially left the compilation and use section for you to complete.  When that's done I'll add the GUI elements unless you also fill those in.

'''Mr.bob:''' New tutorial, in traditional format (me don't like tradition) and the coding is awful, I will make a major revision after I get my mouse fixed. I'm just glad entropiclqd didn't delete anything important. I thought he was skilled, and maybe he is, but it looks like he was trying to make a 2004 GUI and didn't quite complete it. You should know that when changing a public page you don't present new incomplete code that you haven't even complied and tested. If I complied this code, it probably would compile and even if it did, it would be very sloppy wasteful code that might glitch the program in a worst case scenario. I don't like the traditional format that much, but if you people insist that my tutorial look like everyone else's then it shall be. If you complete the 2004 GUI soon enough I will forgive you entopiclqd, but if you don't, I'm scraping all your work, or at least sequestering it.

One more point, the pre-requisites are completely ridiculous, you don't need the unreal script source code, you don't need to have read any of those pages, and I haven't glanced at the terminology page. The installed UT2004/3 on your computer is way too obvious. I also don't like how you changed it to MutPlayerTweak. NO ONE CHANGE THE ORIGANAL PAGE SECTION, good I made my self clear.

I just turned 15 today :)

'''EntropicLqd:'''
* This isn't a public page yet.
* Tutorials should be written for people to follow and understand.  Tradition has nothing to do with it.
* Thankyou for scrapping all my work. I look forward to seeing your alternative offering.
* MutTutorial is a crap name for the muator.
* I am indeed an ''old geezer''.
* Happy birthday.
* Oh dear - I just changed the original page section.

'''Mr.bob:''' Damn, i thought I deleted the old geezer part, (I did, you just looked at the history) i was in a bad mood. Your right, both the names are stupid, we need a good name. And I didn't scrap all your work yet, i will in five minutes. Your right about the part about tradition, the whole time i've been trying to create a downloadable tutorial, so you don't need to copy and paste too much, that is what my origanal structure was about. Thank you for the happy birthday. Now to look at the origanal page section ... YOU DELETED IT!!! :Pissed: that is very annoying, now I need to harvest it from the history. Are you mad at me for calling you an old geezer :cheesy: (i deleted it i tell you). But comeon, that was just pointless. Now to scrap most of your changes (i was going to wait a while, but you deleted the origanal page, and i have nothing better to do).

&quot;sigh&quot;, you could have just taken the compiling instructions from the origanal code, but i seems that you were too lazy.

I didn't compleatly scrap everything and a lot of the things you said were pretty good, all i ask is that you make a seperate page for the 2004 GUI, although i really want you to make one.

'''Tarquin:''' We can leave the GUI part out &amp;ndash; the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] tutorial should be generic enough to work with any mutator (and should be tweaked so it works like that). MrBob, if people are too lazy to copy &amp; paste instead of downloading, then modding ''really isn't for them''. :D I really don't think it's much of a timesaver, you still need to compile, and it's harder for us to maintain it here.

'''Mr.bob:''' Ok fine I'll take the download part out.

Entopiclqd, if you are interested in making a GUI for 2004 then look at this .uc file, if you have UT2004 then you probably have it, but for your convinance you can download it here: [http://home.earthlink.net/~theultimatebob/air_control.zip Air Control]. As you can tell the file is the air control mutator for UT2004, which is vaguly similer to the mutator above. I was not able to make any sense of it, or figure out how to tweak it enough to work with health instead of air control, but you know much more about Uscript then I do.

'''EntropicLqd:''' Please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference page for instructions on how to add GUI configuration to your mutator.  I will add a discussion section at the bottom of that page should you have additional questions.  If you find youself struggling with the page then I suggest referring to the set of pre-requisites I originally added to the tutorial.  Calling me an ''old geezer'' is in no way offensive - I am over twice you age.

'''Mr.bob:''' Kewl, about the whole GUI thing, the above link doesn't help me, makes no sense at all. Also the volume control mutator, helped a bit more, but doesn't have enough comments in the GUI section. So far my most useful resource has been air control.

'''Tarquin:''' Like I said above, [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] should give you a template to create a GUI for any given mutator, I hope. Since I don't have UT2004 I can't try it for myself. Now as for this page's name.... I have altered the listing on the Lessons page to be a bit clearer, and I want to do the same to the name. Since the main thing this does is alter jumping, how about &quot;SuperJump Mutator Tutorial&quot;?

'''Tarquin:''' Message for ppp-62-235-110-208.tiscali.be &amp;ndash; thanks for your typo corrections, much appreciated! But please don't introduce &quot;smart quotes&quot; into the wiki text (the &amp;amp;#8217; things) &amp;ndash; either turn them off in MS Word or use a text editor. Thanks!

'''Random Guest:''' Sorry about that.. I don't know how that happened, maybe because i'm using IE 5.0. Anyway, this script isn't working when I try to compile it. Says MaxHealth isn't a member of xPawn. The code-page doesn't use MaxHealth. Maybe this page, or the other needs some updating. I deleted the maxhealth thing, since it didn't work. There's HealthMax in Pawn, but setting Other.HealtMax gives me another error. I don't know why, I'm a newbie. I also had to take it out of the defaultproperties. Now it works.

'''MythOpus:'''  I don't have the time to test this Mut out but...  have you tried x.HealthMax instead of just deleteing it completely?  I think it's a critical part in the mutator...  I think without changing the HealthMax property, the health can't be set over it's max... which is... 199 I believe?  And why use Other when you can use x :) 

'''Tarquin:''' The variable I think you want is [[Legacy:Pawn|Pawn]].HealthMax. MrBob, did you actually TEST this????

'''Mr.bob:''' Ya, i tested it, three times, but not sense the most recent changes. sry. I'll test it now, and update the zip file.

Yay it compiled :), now to update the zip file.

Wait those aren't the problem. I see the problem now. The problem is that it is &quot;healthmax&quot;, not &quot;maxhealth&quot;. I have edited the code.

'''Random Guest:''' That was indeed the problem. The code as it is now works, but there's one small problem. Taking health vials (the +5 things) only boosts your health till 199, not till 250 of whatever. Regular health packs do get you to 250! Therefore, i would propose this code:

&lt;uscript&gt;
    x.Health = StartingHealth;
    x.HealthMax = StartingHealth;
    x.SuperHealthMax = HealthMax;
&lt;/uscript&gt;

This sets the paws starting health, as discussed before, says the normal health you can reach is the same starting health, and the super health (normally 199) is set to the maximum.

I also made gui-code (mutator settings in the configuration-screen), should i post them or is that overkill for this example?

'''EntropicLqd:''' It's a little overkill for this example.  Also, if the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page isn't good enough then it is that page that should be updated.  In terms of the smart-quotes - if you edit the tutorial text in Word, they will be added in automatically.  And if you use Notepad remember to turn ''wordwrap'' off.

'''Mr.bob:''' Greetings from saratoga! I've been on vacation and i havn't had acess to a computer. Right now I am using the library computer, unfortanatly I don't have a apointment and i'm in the childrens section computers (the adult comps were full). So they could kick me off at any time.

Ok, I'm going to change the code so there is super health max. Also random guest, if you have this mut with the GUI zip the .uc file(s), put them on your website (you have a website right?) and put a link to them. You can also make an extention tutorial on the wiki that tells you how to add a GUI to this mutator. Put it under the currently existing &quot;Adding a Configuration Window&quot; heading.

arg the : p_i_s_s_e_d : (ignore the underscores, they have a bunch of wierd filtering software on this computer which makes it so I can't write words like p_i_s_s. just don't ask) smily is broke! (or is it the filtering software on the kidy computers?).

'''Tarquin:''' I don't think SuperHealthMax = SuperMaxHealth is  a good choice of variable names.........

'''Mr.bob:''' Greating from independent lake camp! Can't think of a better var name sry. Also when is random guest going to show me how to make a GUI? Hope it is soon :)

'''Tarquin:''' well TRY. Having variables called SuperHealthMax and SuperMaxHealth  is just horribly confusing. What is the difference between these two vars? How do their names tell me of this difference? If you're going to write tutorials, you HAVE to think of this. Also, I don't think this tute should contain the GUI &amp;ndash; see what Ent said above.

'''MythOpus:''' Instead of using 'x' as a variable.  Couldn't you make life easier by using:

&lt;uscript&gt;
if (xPawn(Other) != None)
{
            xPawn(Other).MaxMultiJump = MultiJumpCount;
            xPawn(Other).MultiJumpBoost = MultiJumpBoost;
}

Other.Health = StartingHealth;
Other.HealthMax = MaximumHealth
Other.SuperHealthMax = SuperMaxHealth
&lt;/uscript&gt;

'''EntropicLqd:''' Mr Bob have you not read what has been written in the comments section?  RandomGuest has been specifically asked not to add a section on creating a GUI for the mutator as this is covered on the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page.  If you do not understand the information on that page then you should post some questions there.

'''Mr.bob:''' You said that he shouldn't add it on to this &lt;u&gt;page&lt;/u&gt;. I am asking him to make a seperate page. I know you are proud of the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page. But I have looked at it and tried some things and ....

'''EntropicLqd:'''....Comments moved to [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page as originally requested....

'''Mr.bob:''' :confused: I didn't request it to be moved to that page :confused: .

Random guest, at some point I would like to see this mut customized with a GUI somewhere. Don't worry, I wo't get inpatiant until I get back to NYC.

'''Random Guest:''' I've already put it on the wiki, but i haven't linked yet, since i don't know if i may, it's at [[Legacy:MutTutorial Code With GUI|MutTutorial Code With GUI]]. Read the [[Legacy:Recent Changes|Recent Changes]] ;)

'''Tarquin:''' MR Bob, have you actually read the comments above? Have you read my note about variable names? If you want to have a hand in writing a tutorial here, please take note of these things instead of asking for more help. 

'''Mr.bob:''' Sorry about my laziness tarquin. I'll change the bad var name now.

You are the coolest random guest. Thank you so much. :D :) :D

I tested the mutator with the GUI, it works perfectly. After I tweak it and make it bigger, i'm going to make a tutorial for it (unless random guest wants to first).

'''Tarquin:''' I thought this tutorial was meant to be '''simple'''.

'''Random Guest:''' Be my guest Mr. bob, make all you like. I don't like typing tutorials :-) You can use wotgreal (don't know the link to the page), that expands a menu when you type a dot.

'''Mr.bob:''' I meant I would make a different tutorial for this, one that would say that it was harder.

Does anyone know what other modifiable things are a part of the class Xpawn, besides the ones used above?

'''Mr.bob:''' It's been about 2 months, and the Mut turorial code with GUI hasn't been updated. And no one ahs responded to my question. :(

The mut tutorial with GUI has some confusing variable names, for example multijumpboost = multijumpboost and healthmax = healthmax , and superhealthmax = superhealthmax. They should be changed, in my opinion at least, (Behind my back my brother is compaining that those names make it easier and i'm wrong.

'''GRAF1K:''' Your question either is confusingly stated or assumes something incorrect, so people are unlikely to respond. Rephrase it and you'll have better luck.

'''Tarquin:''' With the variable names, I think you need to adopt a scheme that makes it clear which xPawn variable it relates to. Eg, 
 x.MultiJumpBoost = myMultiJumpBoost ;

and so on.

'''SuperApe:''' I'm just guessing by the sheer volume of discussion entries that this page needs a RefactorMe tag.  If not, (or if refactored) please remove.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5286</id>
      <timestamp>2006-04-06T21:07:02Z</timestamp>
      <contributor>
        <ip>212.103.209.6</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">This Unreal Tournament 2004 Tutorial will take you through the basic process of creating a mutator that allows you to alter a players health and the number of multi-jumps they can perform.

You can download the code from [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName.zip], but it might not be as up to date as the code on this page. For the original page check out [[Legacy:MutTutorial Code|MutTutorial code]].

==Before You Start==

As with the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial we need to create a directory to hold our mutator code.  The name of the directory determines the name of the package into which your code will be compiled.  To that end you need to [[Legacy:Set Up Package Folders|Set Up Package Folders]]:

# Create a directory &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; within your UT2004 directory
# Create a directory &lt;CODE&gt;Classes&lt;/CODE&gt; within the &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; you just created.

You should have the following folder tree:

+ UT2004 

++ MutNeedBetterName

+++ Classes

The '''Mut''' prefix is used as a convention within UT2004 to indicate all packages and classes that relate to mutators.  It is not mandatory to do this and we could have called our package (and therefore the directory) &lt;CODE&gt;NeedBetterName&lt;/CODE&gt;.  It is recommended that you use the conventional Mut prefix though for organisations sake.

==Writing the Mutator==

Now to actually write some code that can be compiled.

Within your &lt;CODE&gt;/UT2004/MutNeedBetterName/Classes&lt;/CODE&gt; directory create a file called &lt;CODE&gt;MutNeedBetterName.uc&lt;/CODE&gt;.  All Unreal Script class files have an extension of '''.uc'''.  They '''must''' also be named after the class file they are contained within.

Add the following code to the file.  The code is described after each logical block.

&lt;uscript&gt;
class MutNeedBetterName extends Mutator;
&lt;/uscript&gt;

This is the class declaration.  We are essentially telling the game that this is a new class called &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; and that it is a type of (it extends, or subclasses) [[Legacy:Mutator|Mutator]]. And finally, like all good things in life, the class declaration is terminated with a semi-colon.  You can see [[Legacy:Class Syntax|Class Syntax]] for more information.

&lt;uscript&gt;
var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth, SuperDuberMaximumHealth; // The number of multi-jumps allowed
//The boost the player gets from a multi-jump and the player's starting health
&lt;/uscript&gt;

The section above defines three variables (all integers - see [[Legacy:Variable Type|Variable Type]]s) that are all properties of the class being defined.

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  local xPawn x; //x is a variable
  x = xPawn(Other); 
  if (x != None)
  {
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth;
    x.SuperHealthMax = SuperDuberMaximumHealth;
  }
  // YOU FORGOT TO CALL THE SUPERCLASS! THIS BREAKS THE MUTATOR CHAIN

}
&lt;/uscript&gt;

The first line declares the function (see [[Legacy:Function Syntax|Function Syntax]]).  This is the function that actually updates the player's attributes.  Because our class is a type of Mutator the &lt;CODE&gt;ModifyPlayer()&lt;/CODE&gt; function will be called automatically for every player in the game as they spawn.

The next two lines of code (ignoring the braces) do the following.
* Declare a local (only visible within the function) variable of type xPawn ([[Legacy:XPawn|xPawn]] is a type of [[Legacy:Pawn|Pawn]], and can be found in the xGame package).
* Assign a value to our local variable after [[Legacy:Typecasting|Typecasting]] the value passed in the &lt;CODE&gt;Other&lt;/CODE&gt; function parameter.  Note that if &lt;CODE&gt;Other&lt;/CODE&gt; is not a type of (or subclass) xPawn our local variable will contain &lt;CODE&gt;None&lt;/CODE&gt;.

The &lt;CODE&gt;if&lt;/CODE&gt; statement checks to see if the local variable has a value by comparing it to the &quot;empty value&quot; &lt;CODE&gt;None&lt;/CODE&gt; using the not equal to (&lt;CODE&gt;!=&lt;/CODE&gt;) operator.  See [[Legacy:Operators|Operators]] for more information.  Remember - if the object referenced by &lt;CODE&gt;Other&lt;/CODE&gt; is not an xPawn our local variable will be equal to (&lt;CODE&gt;----&lt;/CODE&gt;) None.

The block of code within the &lt;CODE&gt;if&lt;/CODE&gt; statement adjusts the player's jump and health properties using the values from our mutator's configurable properties.

&lt;uscript&gt;
defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  SuperDuberMaximumHealth=500
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;
}
&lt;/uscript&gt;

This block of code allows you to specify default values for all of your class properties.  If a class property is declared as configurable then the value within the mutator's ini file will be used if available instead of the value specified here.  The [[Legacy:Default Properties|Default Properties]] page contains much more information about how default values should be specified.

==Compiling and Using the Mutator==

Next add this code to the file UT2004.ini: &quot;EditPackages=MutNeedBetterName&quot;

Move the folder MutNeedBetterName into C:\UT2004 (or where ever you installed UT2004)

Move the file MutNeedBetterName.int into UT2004\system

Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under mutators Mutation Tutorial.

==Adding a Configuration Window==

If you want to allow your mutator's configurable parameters to be changed from the standard UT2004 mutator config window then please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference.

==Useful Pages==
* [[Legacy:Compiler Errors|Compiler Errors]]

----

==Conclusion==

You should now have code that looks like this (without the comments): [[Legacy:MutTutorial Code|MutTutorial Code]]

==Discussion==

'''Tarquin:''' I don't understand what this is trying to show, or why there is no text on that page, only script. Secondly, in your script comments there are a number of questions you've left, and a few misconceptions. I suggest you get wait for feedback on it first before adding it to the chain of lessons.

'''EntropicLqd:''' Imagine you are completely new to Unreal Script.  Is this page going to actually help you in [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] or how to [[Legacy:Set Up Package Folders|Set Up Package Folders]].  There's no set of pre-requisites mentioned anywhere or even any real explanation of what is going on (note to self - must add them to my tut. page).  To my mind the worst thing about the tutorial is that you've assumed that someone has downloaded your code.  Try and fit your tutorial into a similar structure to the other tutorials on the Wiki.  At least that way all of the tutorials will be in a similar form.  Also one of your stated commands will not work under Windows XP, and one of them is redundant - but maybe I'm just being picky in my old age.

'''Mr.bob''' Uhhhhhhhhhh... what are pre-requisites (I mean in  ucode context). Also that is kind of weird because I just used this mut in windows xp and it compiled and then worked flawlessly. Also what does redundant mean. About the prompt command I think you are talking about, I'm surprised it didn't work. Maybe I misspelled it but when I type &quot;prompt $1 into command line in windows XP it gives me a blank prompt which is what I want. Finally there is a smiley I've been wanting to try out...&lt;br /&gt; :stupid:

Oh ya, most importantly this tutorial was not meant for reading, it was meant for downloading as folders a .uc file and a .int file. However that didn't seem to work out. In response to Tarquin (who seems to really enjoy messing with and moving around my things ... this gives me an idea :cheesy: ) this code is trying to give newbs some code that they can mess around with and understand. The very first step people do when they are learning to mess with code is to do things like replace the word health with shield, and this code lets them do that.

Later: Just discovered that all the links I had previously posted to the .zip file were broken. Here is one that has to work: [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName THE FILE]

Tarquin, why don't you tell me what the misconceptions are so I can fix them, you people should really give me a lot more input, although the problem is you can't because there are no links to this page.

'''Tarquin:''' things like &quot;says that there is a local variable that applies only to Xpawns, and that varaible is x.&quot; Please also take care to spell correctly. And please remove your tutorial from the list &amp;ndash; you can put the link further down the page if you like. You can get it linked by addding a category tag to this page.

'''EntropicLqd:''' The redundant command is indeed the prompt one.  You might not like to see where you are in the directory structure but I'm betting most people (like me) do.  Not only that, but the command is irrelevant.  You don't need it to compile any Unreal Script at all - but that's not explained.
: The one I thought wouldn't work under XP was running &quot;command&quot;.  It does work but gives you the old Win9x DOS shell.  The XP version (like NT) is ''cmd''.
: Pre-requisites in Unreal Script terms are the basic things someone needs to know before they can starting writing code.  I linked to them in my previous post.  Also, simply downloading some code and then tweaking the values to see what they do is a very inefficient way of learning.  A good tutorial does the following:
: * Explains what the tutorial will cover and what the person is supposed to learn from doing it.
: * Explains what the person doing the tutorial needs to know in order to complete it.  That is - the assumed ''base knowledge'' or as we like to say ''prerequisites''.
: * Explain in simple steps what must be done to accomplish the goal of the tutorial.  At this point explaining why things are done (in this case why ModifyPlayer() was used) in a lot of detail is necessary.  Your description of ModifyPlayer() is somewhat vague &amp;ndash; and could even be misleading.  And also, you should never ever leave questions unanswered in a tutorial.
: * Conclude with a summary of what the person is supposed to have learned from the tutorial.
: So to reiterate my original point, simply providing people with some code they can mess about with is not a tutorial.  It's also unlikely to help them write their own code in the future as it provides no method for understanding why something was done in a specific way.

'''Mr.bob:''' At this point I am once again forced to admit to my newbishness (is that even a word?) and bow down to your superior knowledge. Putting the tutorial on the front page was reckless and hasty (what do you expect, I'm 14). I will delete it from the front page and start working on one worthy of this terrific site, thx for the advice [[Legacy:EntropicLqd|EntropicLqd]] and sorry for bugging you by posting so much junk [[Legacy:Tarquin|Tarquin]]. A few more points, command, while not as good a cmd still works, but thx anyway for the update. Just saying it would help if you included a description of what modify player does, considering my description was very incorrect.

Growing up in the age of spell checkers has severely damaged my spelling capabilities.

My brother is insisting that I keep the things in progress section intact with my link in it, but I'm telling him [[Legacy:Tarquin|Tarquin]] isn't going to be happy.

Whew, that should do it, the tutorial isn't perfect yet, but it is much better then before. It is still not in traditional tutorial format, but I don't really like the traditional tutorial format.

'''Foxpaw:''' I put some more comments in there to explain some stuff that was a bit misleading. However, as you can now see, the comments take up so much space it's hard to see the code. What you might consider doing is listing the code in it's entirety (without the play by play comments) and then below that take each line and show it dissected.

'''Tarquin:''' &quot;I was sick of lessons like the regeneration mutator that would tell you to modify some code you found without telling you what that code meant.&quot; &amp;ndash; I think that is an ''excellent'' point! We should look into adding a &quot;How it works&quot; or &quot;What's going on&quot; section to our scripting tutorial pages!

'''Mr.Bob's brother:'''  a simple note about the prompt $1 thing. we use it because in Windows XP home edition you start in this part of the directory structure: &lt;tt&gt;C:/Documents and settings/~username&gt;&lt;/tt&gt; and the UT2004 directory is &lt;tt&gt;C:/UT2004&lt;/tt&gt; so we need to make the directory structure become blank to go down to C:/.

PS. call me Doodle77 because it is my username for a bunch of games

'''EntropicLqd:''' The ''prompt'' command simply changes the DOS prompt.  It ''does not'' change the directory you are in.  I suspect you actually meant &lt;CODE&gt;cd c:\UT2004&lt;/CODE&gt;.  If you wanted to make the directory structure blank then &lt;CODE&gt;format C:\&lt;/CODE&gt; is the command you are after.

'''Mr.bob:''' Never mind, you can type in the file path without typing in prompt $1 first, i have changed the script apropratly in light of this new discovery.

Wow this tutorial is really something now. Now i think it can add it to the chain. I will update the .zip file with the new code, and add it to the top of the Uscript lessons. The full exspanation of what the code means will REALLY help out people who are compleate newbs to programing.

'''Tarquin:''' Please could you:
* make links in your text
* add a few headings perhaps
* fix spelling mistakes
* explain what the variables you have modified mean
* I think it would be better to remove the explanations from the script entirely, it would make then easier to read &amp;ndash; instead of comments within script, a section of text with script extracts within it.

'''EntropicLqd:''' Right then Mr.Bob.  Please finish off your tutorial in the style it has started in.  If you do a good job maybe I'll come back and extend it with information regarding constructing a configuration GUI for it.

'''Mr.bob:''' This is what I like about the wiki, it is not me writing this tutorial anymore, it is the whole wiki community. It's very much like open source code, that is what makes open source programs so good and flawless, there is a large amount of people who can look at the code and change things.

'''EntropicLqd:''' Maybe, maybe not.  I'm just showing you how you should have written it in the first place.  I won't be finishing it off for you (and I doubt whether anyone else will) as I don't have time.  I certainly won't be restructuing any more of your tutorials if they are presented in the manner similar to the way this one was.

'''RegularX:''' While I like that more verbal tutes like this are getting written - it should be noted that because this is the wiki, tutes like Regen mutator can be appended to describe the inner workings of the tutorial itself...

'''Mr.bob:''' You said that you wouldn't be finishing it off. Personally I have seen much less polished tutorials then this. I think it is finished, what more does it need?

arg i read it and there is some sloppy coding, i changed it, Please don't change it back, it is acutally really bad. And this is a newb telling you this. First of all the config part is junk, second of all you repeated a lot of parts you didn't have to repeat, third of all the pre-requisites are MUCH steeper then what i had in mind ... ok it is so bad i am sequencering (&lt;-spelling bad) the whole new section and making one that doesn't suck so much later. Please don't put it back, the code is very misleading and wasteful. I can't do anything too soon becuase my mouse is broken, sry.

'''EntropicLqd:'''
: Firstly - Thanks Foxpaw.  I was in a hurry and didn't bother to read what I'd actually written.  Apologies to Mr Bob. for introducing ''junk'' into his perfect tutorial, and also to Foxpaw for making him come in here and fix it.
: Mr Bob, just because there are much less polished tutorials than this doesn't mean that is one is finished.  It just means that the other tutorials are not as good.  While I agree I repeated a lot of the stuff that is covered within the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial I felt it was necessary to make the tutorial complete.  You could also argue that this would be a better ''Hello World'' style tutorial than the existing one as it actually does something.
: Yes I agree the pre-requisites are fairly heavy.  However there is actually a fair amount of stuff that you need to know, and get right before you even start writing any code.
: I'm also fairly sure that the code is broken around the &quot;health&quot; area but I've not had time to actually compile it and check (I'm relatively sure the player's health will get reset to 100 should thep layer actually run over a standard health pickup).
: I've essentially left the compilation and use section for you to complete.  When that's done I'll add the GUI elements unless you also fill those in.

'''Mr.bob:''' New tutorial, in traditional format (me don't like tradition) and the coding is awful, I will make a major revision after I get my mouse fixed. I'm just glad entropiclqd didn't delete anything important. I thought he was skilled, and maybe he is, but it looks like he was trying to make a 2004 GUI and didn't quite complete it. You should know that when changing a public page you don't present new incomplete code that you haven't even complied and tested. If I complied this code, it probably would compile and even if it did, it would be very sloppy wasteful code that might glitch the program in a worst case scenario. I don't like the traditional format that much, but if you people insist that my tutorial look like everyone else's then it shall be. If you complete the 2004 GUI soon enough I will forgive you entopiclqd, but if you don't, I'm scraping all your work, or at least sequestering it.

One more point, the pre-requisites are completely ridiculous, you don't need the unreal script source code, you don't need to have read any of those pages, and I haven't glanced at the terminology page. The installed UT2004/3 on your computer is way too obvious. I also don't like how you changed it to MutPlayerTweak. NO ONE CHANGE THE ORIGANAL PAGE SECTION, good I made my self clear.

I just turned 15 today :)

'''EntropicLqd:'''
* This isn't a public page yet.
* Tutorials should be written for people to follow and understand.  Tradition has nothing to do with it.
* Thankyou for scrapping all my work. I look forward to seeing your alternative offering.
* MutTutorial is a crap name for the muator.
* I am indeed an ''old geezer''.
* Happy birthday.
* Oh dear - I just changed the original page section.

'''Mr.bob:''' Damn, i thought I deleted the old geezer part, (I did, you just looked at the history) i was in a bad mood. Your right, both the names are stupid, we need a good name. And I didn't scrap all your work yet, i will in five minutes. Your right about the part about tradition, the whole time i've been trying to create a downloadable tutorial, so you don't need to copy and paste too much, that is what my origanal structure was about. Thank you for the happy birthday. Now to look at the origanal page section ... YOU DELETED IT!!! :Pissed: that is very annoying, now I need to harvest it from the history. Are you mad at me for calling you an old geezer :cheesy: (i deleted it i tell you). But comeon, that was just pointless. Now to scrap most of your changes (i was going to wait a while, but you deleted the origanal page, and i have nothing better to do).

&quot;sigh&quot;, you could have just taken the compiling instructions from the origanal code, but i seems that you were too lazy.

I didn't compleatly scrap everything and a lot of the things you said were pretty good, all i ask is that you make a seperate page for the 2004 GUI, although i really want you to make one.

'''Tarquin:''' We can leave the GUI part out &amp;ndash; the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] tutorial should be generic enough to work with any mutator (and should be tweaked so it works like that). MrBob, if people are too lazy to copy &amp; paste instead of downloading, then modding ''really isn't for them''. :D I really don't think it's much of a timesaver, you still need to compile, and it's harder for us to maintain it here.

'''Mr.bob:''' Ok fine I'll take the download part out.

Entopiclqd, if you are interested in making a GUI for 2004 then look at this .uc file, if you have UT2004 then you probably have it, but for your convinance you can download it here: [http://home.earthlink.net/~theultimatebob/air_control.zip Air Control]. As you can tell the file is the air control mutator for UT2004, which is vaguly similer to the mutator above. I was not able to make any sense of it, or figure out how to tweak it enough to work with health instead of air control, but you know much more about Uscript then I do.

'''EntropicLqd:''' Please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference page for instructions on how to add GUI configuration to your mutator.  I will add a discussion section at the bottom of that page should you have additional questions.  If you find youself struggling with the page then I suggest referring to the set of pre-requisites I originally added to the tutorial.  Calling me an ''old geezer'' is in no way offensive - I am over twice you age.

'''Mr.bob:''' Kewl, about the whole GUI thing, the above link doesn't help me, makes no sense at all. Also the volume control mutator, helped a bit more, but doesn't have enough comments in the GUI section. So far my most useful resource has been air control.

'''Tarquin:''' Like I said above, [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] should give you a template to create a GUI for any given mutator, I hope. Since I don't have UT2004 I can't try it for myself. Now as for this page's name.... I have altered the listing on the Lessons page to be a bit clearer, and I want to do the same to the name. Since the main thing this does is alter jumping, how about &quot;SuperJump Mutator Tutorial&quot;?

'''Tarquin:''' Message for ppp-62-235-110-208.tiscali.be &amp;ndash; thanks for your typo corrections, much appreciated! But please don't introduce &quot;smart quotes&quot; into the wiki text (the &amp;amp;#8217; things) &amp;ndash; either turn them off in MS Word or use a text editor. Thanks!

'''Random Guest:''' Sorry about that.. I don't know how that happened, maybe because i'm using IE 5.0. Anyway, this script isn't working when I try to compile it. Says MaxHealth isn't a member of xPawn. The code-page doesn't use MaxHealth. Maybe this page, or the other needs some updating. I deleted the maxhealth thing, since it didn't work. There's HealthMax in Pawn, but setting Other.HealtMax gives me another error. I don't know why, I'm a newbie. I also had to take it out of the defaultproperties. Now it works.

'''MythOpus:'''  I don't have the time to test this Mut out but...  have you tried x.HealthMax instead of just deleteing it completely?  I think it's a critical part in the mutator...  I think without changing the HealthMax property, the health can't be set over it's max... which is... 199 I believe?  And why use Other when you can use x :) 

'''Tarquin:''' The variable I think you want is [[Legacy:Pawn|Pawn]].HealthMax. MrBob, did you actually TEST this????

'''Mr.bob:''' Ya, i tested it, three times, but not sense the most recent changes. sry. I'll test it now, and update the zip file.

Yay it compiled :), now to update the zip file.

Wait those aren't the problem. I see the problem now. The problem is that it is &quot;healthmax&quot;, not &quot;maxhealth&quot;. I have edited the code.

'''Random Guest:''' That was indeed the problem. The code as it is now works, but there's one small problem. Taking health vials (the +5 things) only boosts your health till 199, not till 250 of whatever. Regular health packs do get you to 250! Therefore, i would propose this code:

&lt;uscript&gt;
    x.Health = StartingHealth;
    x.HealthMax = StartingHealth;
    x.SuperHealthMax = HealthMax;
&lt;/uscript&gt;

This sets the paws starting health, as discussed before, says the normal health you can reach is the same starting health, and the super health (normally 199) is set to the maximum.

I also made gui-code (mutator settings in the configuration-screen), should i post them or is that overkill for this example?

'''EntropicLqd:''' It's a little overkill for this example.  Also, if the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page isn't good enough then it is that page that should be updated.  In terms of the smart-quotes - if you edit the tutorial text in Word, they will be added in automatically.  And if you use Notepad remember to turn ''wordwrap'' off.

'''Mr.bob:''' Greetings from saratoga! I've been on vacation and i havn't had acess to a computer. Right now I am using the library computer, unfortanatly I don't have a apointment and i'm in the childrens section computers (the adult comps were full). So they could kick me off at any time.

Ok, I'm going to change the code so there is super health max. Also random guest, if you have this mut with the GUI zip the .uc file(s), put them on your website (you have a website right?) and put a link to them. You can also make an extention tutorial on the wiki that tells you how to add a GUI to this mutator. Put it under the currently existing &quot;Adding a Configuration Window&quot; heading.

arg the : p_i_s_s_e_d : (ignore the underscores, they have a bunch of wierd filtering software on this computer which makes it so I can't write words like p_i_s_s. just don't ask) smily is broke! (or is it the filtering software on the kidy computers?).

'''Tarquin:''' I don't think SuperHealthMax = SuperMaxHealth is  a good choice of variable names.........

'''Mr.bob:''' Greating from independent lake camp! Can't think of a better var name sry. Also when is random guest going to show me how to make a GUI? Hope it is soon :)

'''Tarquin:''' well TRY. Having variables called SuperHealthMax and SuperMaxHealth  is just horribly confusing. What is the difference between these two vars? How do their names tell me of this difference? If you're going to write tutorials, you HAVE to think of this. Also, I don't think this tute should contain the GUI &amp;ndash; see what Ent said above.

'''MythOpus:''' Instead of using 'x' as a variable.  Couldn't you make life easier by using:

&lt;uscript&gt;
if (xPawn(Other) != None)
{
            xPawn(Other).MaxMultiJump = MultiJumpCount;
            xPawn(Other).MultiJumpBoost = MultiJumpBoost;
}

Other.Health = StartingHealth;
Other.HealthMax = MaximumHealth
Other.SuperHealthMax = SuperMaxHealth
&lt;/uscript&gt;

'''EntropicLqd:''' Mr Bob have you not read what has been written in the comments section?  RandomGuest has been specifically asked not to add a section on creating a GUI for the mutator as this is covered on the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page.  If you do not understand the information on that page then you should post some questions there.

'''Mr.bob:''' You said that he shouldn't add it on to this &lt;u&gt;page&lt;/u&gt;. I am asking him to make a seperate page. I know you are proud of the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page. But I have looked at it and tried some things and ....

'''EntropicLqd:'''....Comments moved to [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page as originally requested....

'''Mr.bob:''' :confused: I didn't request it to be moved to that page :confused: .

Random guest, at some point I would like to see this mut customized with a GUI somewhere. Don't worry, I wo't get inpatiant until I get back to NYC.

'''Random Guest:''' I've already put it on the wiki, but i haven't linked yet, since i don't know if i may, it's at [[Legacy:MutTutorial Code With GUI|MutTutorial Code With GUI]]. Read the [[Legacy:Recent Changes|Recent Changes]] ;)

'''Tarquin:''' MR Bob, have you actually read the comments above? Have you read my note about variable names? If you want to have a hand in writing a tutorial here, please take note of these things instead of asking for more help. 

'''Mr.bob:''' Sorry about my laziness tarquin. I'll change the bad var name now.

You are the coolest random guest. Thank you so much. :D :) :D

I tested the mutator with the GUI, it works perfectly. After I tweak it and make it bigger, i'm going to make a tutorial for it (unless random guest wants to first).

'''Tarquin:''' I thought this tutorial was meant to be '''simple'''.

'''Random Guest:''' Be my guest Mr. bob, make all you like. I don't like typing tutorials :-) You can use wotgreal (don't know the link to the page), that expands a menu when you type a dot.

'''Mr.bob:''' I meant I would make a different tutorial for this, one that would say that it was harder.

Does anyone know what other modifiable things are a part of the class Xpawn, besides the ones used above?

'''Mr.bob:''' It's been about 2 months, and the Mut turorial code with GUI hasn't been updated. And no one ahs responded to my question. :(

The mut tutorial with GUI has some confusing variable names, for example multijumpboost = multijumpboost and healthmax = healthmax , and superhealthmax = superhealthmax. They should be changed, in my opinion at least, (Behind my back my brother is compaining that those names make it easier and i'm wrong.

'''GRAF1K:''' Your question either is confusingly stated or assumes something incorrect, so people are unlikely to respond. Rephrase it and you'll have better luck.

'''Tarquin:''' With the variable names, I think you need to adopt a scheme that makes it clear which xPawn variable it relates to. Eg, 
 x.MultiJumpBoost = myMultiJumpBoost ;

and so on.

'''SuperApe:''' I'm just guessing by the sheer volume of discussion entries that this page needs a RefactorMe tag.  If not, (or if refactored) please remove.

----

[[:Category:Legacy Refactor Me]]

[[:Category:Legacy Tutorial]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32311</id>
      <timestamp>2008-06-06T16:24:26Z</timestamp>
      <contributor>
        <username>Metabollica</username>
        <id>702</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">This Unreal Tournament 2004 Tutorial will take you through the basic process of creating a mutator that allows you to alter a players health and the number of multi-jumps they can perform.

You can download the code from [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName.zip], but it might not be as up to date as the code on this page. For the original page check out [[Legacy:MutTutorial Code|MutTutorial code]].

==Before You Start==

As with the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial we need to create a directory to hold our mutator code.  The name of the directory determines the name of the package into which your code will be compiled.  To that end you need to [[Legacy:Set Up Package Folders|Set Up Package Folders]]:

# Create a directory &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; within your UT2004 directory
# Create a directory &lt;CODE&gt;Classes&lt;/CODE&gt; within the &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; you just created.

You should have the following folder tree:

+ UT2004 

++ MutNeedBetterName

+++ Classes

The '''Mut''' prefix is used as a convention within UT2004 to indicate all packages and classes that relate to mutators.  It is not mandatory to do this and we could have called our package (and therefore the directory) &lt;CODE&gt;NeedBetterName&lt;/CODE&gt;.  It is recommended that you use the conventional Mut prefix though for organisations sake.

==Writing the Mutator==

Now to actually write some code that can be compiled.

Within your &lt;CODE&gt;/UT2004/MutNeedBetterName/Classes&lt;/CODE&gt; directory create a file called &lt;CODE&gt;MutNeedBetterName.uc&lt;/CODE&gt;.  All Unreal Script class files have an extension of '''.uc'''.  They '''must''' also be named after the class file they are contained within.

Add the following code to the file.  The code is described after each logical block.

&lt;uscript&gt;
class MutNeedBetterName extends Mutator;
&lt;/uscript&gt;

This is the class declaration.  We are essentially telling the game that this is a new class called &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; and that it is a type of (it extends, or subclasses) [[Legacy:Mutator|Mutator]]. And finally, like all good things in life, the class declaration is terminated with a semi-colon.  You can see [[Legacy:Class Syntax|Class Syntax]] for more information.

&lt;uscript&gt;
var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth, SuperDuberMaximumHealth; // The number of multi-jumps allowed
//The boost the player gets from a multi-jump and the player's starting health
&lt;/uscript&gt;

The section above defines three variables (all integers - see [[Legacy:Variable Type|Variable Type]]s) that are all properties of the class being defined.

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  local xPawn x; //x is a variable
  x = xPawn(Other); 
  if (x != None)
  {
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth;
    x.SuperHealthMax = SuperDuberMaximumHealth;
  }
  // YOU FORGOT TO CALL THE SUPERCLASS! THIS BREAKS THE MUTATOR CHAIN

}
&lt;/uscript&gt;

The first line declares the function (see [[Legacy:Function Syntax|Function Syntax]]).  This is the function that actually updates the player's attributes.  Because our class is a type of Mutator the &lt;CODE&gt;ModifyPlayer()&lt;/CODE&gt; function will be called automatically for every player in the game as they spawn.

The next two lines of code (ignoring the braces) do the following.
* Declare a local (only visible within the function) variable of type xPawn ([[Legacy:XPawn|xPawn]] is a type of [[Legacy:Pawn|Pawn]], and can be found in the xGame package).
* Assign a value to our local variable after [[Legacy:Typecasting|Typecasting]] the value passed in the &lt;CODE&gt;Other&lt;/CODE&gt; function parameter.  Note that if &lt;CODE&gt;Other&lt;/CODE&gt; is not a type of (or subclass) xPawn our local variable will contain &lt;CODE&gt;None&lt;/CODE&gt;.

The &lt;CODE&gt;if&lt;/CODE&gt; statement checks to see if the local variable has a value by comparing it to the &quot;empty value&quot; &lt;CODE&gt;None&lt;/CODE&gt; using the not equal to (&lt;CODE&gt;!=&lt;/CODE&gt;) operator.  See [[Legacy:Operators|Operators]] for more information.  Remember - if the object referenced by &lt;CODE&gt;Other&lt;/CODE&gt; is not an xPawn our local variable will be equal to (&lt;CODE&gt;----&lt;/CODE&gt;) None.

The block of code within the &lt;CODE&gt;if&lt;/CODE&gt; statement adjusts the player's jump and health properties using the values from our mutator's configurable properties.

&lt;uscript&gt;
defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  SuperDuberMaximumHealth=500
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;
}
&lt;/uscript&gt;

This block of code allows you to specify default values for all of your class properties.  If a class property is declared as configurable then the value within the mutator's ini file will be used if available instead of the value specified here.  The [[Legacy:Default Properties|Default Properties]] page contains much more information about how default values should be specified.

==Compiling and Using the Mutator==

Next add this code to the file UT2004.ini: &quot;EditPackages=MutNeedBetterName&quot;

Move the folder MutNeedBetterName into C:\UT2004 (or where ever you installed UT2004)

Move the file MutNeedBetterName.int into UT2004\system

Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under mutators Mutation Tutorial.

==Adding a Configuration Window==

If you want to allow your mutator's configurable parameters to be changed from the standard UT2004 mutator config window then please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference.

==Useful Pages==
* [[Legacy:Compiler Errors|Compiler Errors]]

----

==Conclusion==

You should now have code that looks like this (without the comments): [[Legacy:MutTutorial Code|MutTutorial Code]]

==Discussion==

'''Tarquin:''' I don't understand what this is trying to show, or why there is no text on that page, only script. Secondly, in your script comments there are a number of questions you've left, and a few misconceptions. I suggest you get wait for feedback on it first before adding it to the chain of lessons.

'''EntropicLqd:''' Imagine you are completely new to Unreal Script.  Is this page going to actually help you in [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]] or how to [[Legacy:Set Up Package Folders|Set Up Package Folders]].  There's no set of pre-requisites mentioned anywhere or even any real explanation of what is going on (note to self - must add them to my tut. page).  To my mind the worst thing about the tutorial is that you've assumed that someone has downloaded your code.  Try and fit your tutorial into a similar structure to the other tutorials on the Wiki.  At least that way all of the tutorials will be in a similar form.  Also one of your stated commands will not work under Windows XP, and one of them is redundant - but maybe I'm just being picky in my old age.

'''Mr.bob''' Uhhhhhhhhhh... what are pre-requisites (I mean in  ucode context). Also that is kind of weird because I just used this mut in windows xp and it compiled and then worked flawlessly. Also what does redundant mean. About the prompt command I think you are talking about, I'm surprised it didn't work. Maybe I misspelled it but when I type &quot;prompt $1 into command line in windows XP it gives me a blank prompt which is what I want. Finally there is a smiley I've been wanting to try out...&lt;br /&gt; :stupid:

Oh ya, most importantly this tutorial was not meant for reading, it was meant for downloading as folders a .uc file and a .int file. However that didn't seem to work out. In response to Tarquin (who seems to really enjoy messing with and moving around my things ... this gives me an idea :cheesy: ) this code is trying to give newbs some code that they can mess around with and understand. The very first step people do when they are learning to mess with code is to do things like replace the word health with shield, and this code lets them do that.

Later: Just discovered that all the links I had previously posted to the .zip file were broken. Here is one that has to work: [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName THE FILE]

Tarquin, why don't you tell me what the misconceptions are so I can fix them, you people should really give me a lot more input, although the problem is you can't because there are no links to this page.

'''Tarquin:''' things like &quot;says that there is a local variable that applies only to Xpawns, and that varaible is x.&quot; Please also take care to spell correctly. And please remove your tutorial from the list &amp;ndash; you can put the link further down the page if you like. You can get it linked by addding a category tag to this page.

'''EntropicLqd:''' The redundant command is indeed the prompt one.  You might not like to see where you are in the directory structure but I'm betting most people (like me) do.  Not only that, but the command is irrelevant.  You don't need it to compile any Unreal Script at all - but that's not explained.
: The one I thought wouldn't work under XP was running &quot;command&quot;.  It does work but gives you the old Win9x DOS shell.  The XP version (like NT) is ''cmd''.
: Pre-requisites in Unreal Script terms are the basic things someone needs to know before they can starting writing code.  I linked to them in my previous post.  Also, simply downloading some code and then tweaking the values to see what they do is a very inefficient way of learning.  A good tutorial does the following:
: * Explains what the tutorial will cover and what the person is supposed to learn from doing it.
: * Explains what the person doing the tutorial needs to know in order to complete it.  That is - the assumed ''base knowledge'' or as we like to say ''prerequisites''.
: * Explain in simple steps what must be done to accomplish the goal of the tutorial.  At this point explaining why things are done (in this case why ModifyPlayer() was used) in a lot of detail is necessary.  Your description of ModifyPlayer() is somewhat vague &amp;ndash; and could even be misleading.  And also, you should never ever leave questions unanswered in a tutorial.
: * Conclude with a summary of what the person is supposed to have learned from the tutorial.
: So to reiterate my original point, simply providing people with some code they can mess about with is not a tutorial.  It's also unlikely to help them write their own code in the future as it provides no method for understanding why something was done in a specific way.

'''Mr.bob:''' At this point I am once again forced to admit to my newbishness (is that even a word?) and bow down to your superior knowledge. Putting the tutorial on the front page was reckless and hasty (what do you expect, I'm 14). I will delete it from the front page and start working on one worthy of this terrific site, thx for the advice [[Legacy:EntropicLqd|EntropicLqd]] and sorry for bugging you by posting so much junk [[Legacy:Tarquin|Tarquin]]. A few more points, command, while not as good a cmd still works, but thx anyway for the update. Just saying it would help if you included a description of what modify player does, considering my description was very incorrect.

Growing up in the age of spell checkers has severely damaged my spelling capabilities.

My brother is insisting that I keep the things in progress section intact with my link in it, but I'm telling him [[Legacy:Tarquin|Tarquin]] isn't going to be happy.

Whew, that should do it, the tutorial isn't perfect yet, but it is much better then before. It is still not in traditional tutorial format, but I don't really like the traditional tutorial format.

'''Foxpaw:''' I put some more comments in there to explain some stuff that was a bit misleading. However, as you can now see, the comments take up so much space it's hard to see the code. What you might consider doing is listing the code in it's entirety (without the play by play comments) and then below that take each line and show it dissected.

'''Tarquin:''' &quot;I was sick of lessons like the regeneration mutator that would tell you to modify some code you found without telling you what that code meant.&quot; &amp;ndash; I think that is an ''excellent'' point! We should look into adding a &quot;How it works&quot; or &quot;What's going on&quot; section to our scripting tutorial pages!

'''Mr.Bob's brother:'''  a simple note about the prompt $1 thing. we use it because in Windows XP home edition you start in this part of the directory structure: &lt;tt&gt;C:/Documents and settings/~username&gt;&lt;/tt&gt; and the UT2004 directory is &lt;tt&gt;C:/UT2004&lt;/tt&gt; so we need to make the directory structure become blank to go down to C:/.

PS. call me Doodle77 because it is my username for a bunch of games

'''EntropicLqd:''' The ''prompt'' command simply changes the DOS prompt.  It ''does not'' change the directory you are in.  I suspect you actually meant &lt;CODE&gt;cd c:\UT2004&lt;/CODE&gt;.  If you wanted to make the directory structure blank then &lt;CODE&gt;format C:\&lt;/CODE&gt; is the command you are after.

'''Mr.bob:''' Never mind, you can type in the file path without typing in prompt $1 first, i have changed the script apropratly in light of this new discovery.

Wow this tutorial is really something now. Now i think it can add it to the chain. I will update the .zip file with the new code, and add it to the top of the Uscript lessons. The full exspanation of what the code means will REALLY help out people who are compleate newbs to programing.

'''Tarquin:''' Please could you:
* make links in your text
* add a few headings perhaps
* fix spelling mistakes
* explain what the variables you have modified mean
* I think it would be better to remove the explanations from the script entirely, it would make then easier to read &amp;ndash; instead of comments within script, a section of text with script extracts within it.

'''EntropicLqd:''' Right then Mr.Bob.  Please finish off your tutorial in the style it has started in.  If you do a good job maybe I'll come back and extend it with information regarding constructing a configuration GUI for it.

'''Mr.bob:''' This is what I like about the wiki, it is not me writing this tutorial anymore, it is the whole wiki community. It's very much like open source code, that is what makes open source programs so good and flawless, there is a large amount of people who can look at the code and change things.

'''EntropicLqd:''' Maybe, maybe not.  I'm just showing you how you should have written it in the first place.  I won't be finishing it off for you (and I doubt whether anyone else will) as I don't have time.  I certainly won't be restructuing any more of your tutorials if they are presented in the manner similar to the way this one was.

'''RegularX:''' While I like that more verbal tutes like this are getting written - it should be noted that because this is the wiki, tutes like Regen mutator can be appended to describe the inner workings of the tutorial itself...

'''Mr.bob:''' You said that you wouldn't be finishing it off. Personally I have seen much less polished tutorials then this. I think it is finished, what more does it need?

arg i read it and there is some sloppy coding, i changed it, Please don't change it back, it is acutally really bad. And this is a newb telling you this. First of all the config part is junk, second of all you repeated a lot of parts you didn't have to repeat, third of all the pre-requisites are MUCH steeper then what i had in mind ... ok it is so bad i am sequencering (&lt;-spelling bad) the whole new section and making one that doesn't suck so much later. Please don't put it back, the code is very misleading and wasteful. I can't do anything too soon becuase my mouse is broken, sry.

'''EntropicLqd:'''
: Firstly - Thanks Foxpaw.  I was in a hurry and didn't bother to read what I'd actually written.  Apologies to Mr Bob. for introducing ''junk'' into his perfect tutorial, and also to Foxpaw for making him come in here and fix it.
: Mr Bob, just because there are much less polished tutorials than this doesn't mean that is one is finished.  It just means that the other tutorials are not as good.  While I agree I repeated a lot of the stuff that is covered within the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial I felt it was necessary to make the tutorial complete.  You could also argue that this would be a better ''Hello World'' style tutorial than the existing one as it actually does something.
: Yes I agree the pre-requisites are fairly heavy.  However there is actually a fair amount of stuff that you need to know, and get right before you even start writing any code.
: I'm also fairly sure that the code is broken around the &quot;health&quot; area but I've not had time to actually compile it and check (I'm relatively sure the player's health will get reset to 100 should thep layer actually run over a standard health pickup).
: I've essentially left the compilation and use section for you to complete.  When that's done I'll add the GUI elements unless you also fill those in.

'''Mr.bob:''' New tutorial, in traditional format (me don't like tradition) and the coding is awful, I will make a major revision after I get my mouse fixed. I'm just glad entropiclqd didn't delete anything important. I thought he was skilled, and maybe he is, but it looks like he was trying to make a 2004 GUI and didn't quite complete it. You should know that when changing a public page you don't present new incomplete code that you haven't even complied and tested. If I complied this code, it probably would compile and even if it did, it would be very sloppy wasteful code that might glitch the program in a worst case scenario. I don't like the traditional format that much, but if you people insist that my tutorial look like everyone else's then it shall be. If you complete the 2004 GUI soon enough I will forgive you entopiclqd, but if you don't, I'm scraping all your work, or at least sequestering it.

One more point, the pre-requisites are completely ridiculous, you don't need the unreal script source code, you don't need to have read any of those pages, and I haven't glanced at the terminology page. The installed UT2004/3 on your computer is way too obvious. I also don't like how you changed it to MutPlayerTweak. NO ONE CHANGE THE ORIGANAL PAGE SECTION, good I made my self clear.

I just turned 15 today :)

'''EntropicLqd:'''
* This isn't a public page yet.
* Tutorials should be written for people to follow and understand.  Tradition has nothing to do with it.
* Thankyou for scrapping all my work. I look forward to seeing your alternative offering.
* MutTutorial is a crap name for the muator.
* I am indeed an ''old geezer''.
* Happy birthday.
* Oh dear - I just changed the original page section.

'''Mr.bob:''' Damn, i thought I deleted the old geezer part, (I did, you just looked at the history) i was in a bad mood. Your right, both the names are stupid, we need a good name. And I didn't scrap all your work yet, i will in five minutes. Your right about the part about tradition, the whole time i've been trying to create a downloadable tutorial, so you don't need to copy and paste too much, that is what my origanal structure was about. Thank you for the happy birthday. Now to look at the origanal page section ... YOU DELETED IT!!! :Pissed: that is very annoying, now I need to harvest it from the history. Are you mad at me for calling you an old geezer :cheesy: (i deleted it i tell you). But comeon, that was just pointless. Now to scrap most of your changes (i was going to wait a while, but you deleted the origanal page, and i have nothing better to do).

&quot;sigh&quot;, you could have just taken the compiling instructions from the origanal code, but i seems that you were too lazy.

I didn't compleatly scrap everything and a lot of the things you said were pretty good, all i ask is that you make a seperate page for the 2004 GUI, although i really want you to make one.

'''Tarquin:''' We can leave the GUI part out &amp;ndash; the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] tutorial should be generic enough to work with any mutator (and should be tweaked so it works like that). MrBob, if people are too lazy to copy &amp; paste instead of downloading, then modding ''really isn't for them''. :D I really don't think it's much of a timesaver, you still need to compile, and it's harder for us to maintain it here.

'''Mr.bob:''' Ok fine I'll take the download part out.

Entopiclqd, if you are interested in making a GUI for 2004 then look at this .uc file, if you have UT2004 then you probably have it, but for your convinance you can download it here: [http://home.earthlink.net/~theultimatebob/air_control.zip Air Control]. As you can tell the file is the air control mutator for UT2004, which is vaguly similer to the mutator above. I was not able to make any sense of it, or figure out how to tweak it enough to work with health instead of air control, but you know much more about Uscript then I do.

'''EntropicLqd:''' Please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference page for instructions on how to add GUI configuration to your mutator.  I will add a discussion section at the bottom of that page should you have additional questions.  If you find youself struggling with the page then I suggest referring to the set of pre-requisites I originally added to the tutorial.  Calling me an ''old geezer'' is in no way offensive - I am over twice you age.

'''Mr.bob:''' Kewl, about the whole GUI thing, the above link doesn't help me, makes no sense at all. Also the volume control mutator, helped a bit more, but doesn't have enough comments in the GUI section. So far my most useful resource has been air control.

'''Tarquin:''' Like I said above, [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] should give you a template to create a GUI for any given mutator, I hope. Since I don't have UT2004 I can't try it for myself. Now as for this page's name.... I have altered the listing on the Lessons page to be a bit clearer, and I want to do the same to the name. Since the main thing this does is alter jumping, how about &quot;SuperJump Mutator Tutorial&quot;?

'''Tarquin:''' Message for ppp-62-235-110-208.tiscali.be &amp;ndash; thanks for your typo corrections, much appreciated! But please don't introduce &quot;smart quotes&quot; into the wiki text (the &amp;amp;#8217; things) &amp;ndash; either turn them off in MS Word or use a text editor. Thanks!

'''Random Guest:''' Sorry about that.. I don't know how that happened, maybe because i'm using IE 5.0. Anyway, this script isn't working when I try to compile it. Says MaxHealth isn't a member of xPawn. The code-page doesn't use MaxHealth. Maybe this page, or the other needs some updating. I deleted the maxhealth thing, since it didn't work. There's HealthMax in Pawn, but setting Other.HealtMax gives me another error. I don't know why, I'm a newbie. I also had to take it out of the defaultproperties. Now it works.

'''MythOpus:'''  I don't have the time to test this Mut out but...  have you tried x.HealthMax instead of just deleteing it completely?  I think it's a critical part in the mutator...  I think without changing the HealthMax property, the health can't be set over it's max... which is... 199 I believe?  And why use Other when you can use x :) 

'''Tarquin:''' The variable I think you want is [[Legacy:Pawn|Pawn]].HealthMax. MrBob, did you actually TEST this????

'''Mr.bob:''' Ya, i tested it, three times, but not sense the most recent changes. sry. I'll test it now, and update the zip file.

Yay it compiled :), now to update the zip file.

Wait those aren't the problem. I see the problem now. The problem is that it is &quot;healthmax&quot;, not &quot;maxhealth&quot;. I have edited the code.

'''Random Guest:''' That was indeed the problem. The code as it is now works, but there's one small problem. Taking health vials (the +5 things) only boosts your health till 199, not till 250 of whatever. Regular health packs do get you to 250! Therefore, i would propose this code:

&lt;uscript&gt;
    x.Health = StartingHealth;
    x.HealthMax = StartingHealth;
    x.SuperHealthMax = HealthMax;
&lt;/uscript&gt;

This sets the paws starting health, as discussed before, says the normal health you can reach is the same starting health, and the super health (normally 199) is set to the maximum.

I also made gui-code (mutator settings in the configuration-screen), should i post them or is that overkill for this example?

'''EntropicLqd:''' It's a little overkill for this example.  Also, if the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page isn't good enough then it is that page that should be updated.  In terms of the smart-quotes - if you edit the tutorial text in Word, they will be added in automatically.  And if you use Notepad remember to turn ''wordwrap'' off.

'''Mr.bob:''' Greetings from saratoga! I've been on vacation and i havn't had acess to a computer. Right now I am using the library computer, unfortanatly I don't have a apointment and i'm in the childrens section computers (the adult comps were full). So they could kick me off at any time.

Ok, I'm going to change the code so there is super health max. Also random guest, if you have this mut with the GUI zip the .uc file(s), put them on your website (you have a website right?) and put a link to them. You can also make an extention tutorial on the wiki that tells you how to add a GUI to this mutator. Put it under the currently existing &quot;Adding a Configuration Window&quot; heading.

arg the : p_i_s_s_e_d : (ignore the underscores, they have a bunch of wierd filtering software on this computer which makes it so I can't write words like p_i_s_s. just don't ask) smily is broke! (or is it the filtering software on the kidy computers?).

'''Tarquin:''' I don't think SuperHealthMax = SuperMaxHealth is  a good choice of variable names.........

'''Mr.bob:''' Greating from independent lake camp! Can't think of a better var name sry. Also when is random guest going to show me how to make a GUI? Hope it is soon :)

'''Tarquin:''' well TRY. Having variables called SuperHealthMax and SuperMaxHealth  is just horribly confusing. What is the difference between these two vars? How do their names tell me of this difference? If you're going to write tutorials, you HAVE to think of this. Also, I don't think this tute should contain the GUI &amp;ndash; see what Ent said above.

'''MythOpus:''' Instead of using 'x' as a variable.  Couldn't you make life easier by using:

&lt;uscript&gt;
if (xPawn(Other) != None)
{
            xPawn(Other).MaxMultiJump = MultiJumpCount;
            xPawn(Other).MultiJumpBoost = MultiJumpBoost;
}

Other.Health = StartingHealth;
Other.HealthMax = MaximumHealth
Other.SuperHealthMax = SuperMaxHealth
&lt;/uscript&gt;

'''EntropicLqd:''' Mr Bob have you not read what has been written in the comments section?  RandomGuest has been specifically asked not to add a section on creating a GUI for the mutator as this is covered on the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page.  If you do not understand the information on that page then you should post some questions there.

'''Mr.bob:''' You said that he shouldn't add it on to this &lt;u&gt;page&lt;/u&gt;. I am asking him to make a seperate page. I know you are proud of the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page. But I have looked at it and tried some things and ....

'''EntropicLqd:'''....Comments moved to [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] page as originally requested....

'''Mr.bob:''' :confused: I didn't request it to be moved to that page :confused: .

Random guest, at some point I would like to see this mut customized with a GUI somewhere. Don't worry, I wo't get inpatiant until I get back to NYC.

'''Random Guest:''' I've already put it on the wiki, but i haven't linked yet, since i don't know if i may, it's at [[Legacy:MutTutorial Code With GUI|MutTutorial Code With GUI]]. Read the [[Legacy:Recent Changes|Recent Changes]] ;)

'''Tarquin:''' MR Bob, have you actually read the comments above? Have you read my note about variable names? If you want to have a hand in writing a tutorial here, please take note of these things instead of asking for more help. 

'''Mr.bob:''' Sorry about my laziness tarquin. I'll change the bad var name now.

You are the coolest random guest. Thank you so much. :D :) :D

I tested the mutator with the GUI, it works perfectly. After I tweak it and make it bigger, i'm going to make a tutorial for it (unless random guest wants to first).

'''Tarquin:''' I thought this tutorial was meant to be '''simple'''.

'''Random Guest:''' Be my guest Mr. bob, make all you like. I don't like typing tutorials :-) You can use wotgreal (don't know the link to the page), that expands a menu when you type a dot.

'''Mr.bob:''' I meant I would make a different tutorial for this, one that would say that it was harder.

Does anyone know what other modifiable things are a part of the class Xpawn, besides the ones used above?

'''Mr.bob:''' It's been about 2 months, and the Mut turorial code with GUI hasn't been updated. And no one ahs responded to my question. :(

The mut tutorial with GUI has some confusing variable names, for example multijumpboost = multijumpboost and healthmax = healthmax , and superhealthmax = superhealthmax. They should be changed, in my opinion at least, (Behind my back my brother is compaining that those names make it easier and i'm wrong.

'''GRAF1K:''' Your question either is confusingly stated or assumes something incorrect, so people are unlikely to respond. Rephrase it and you'll have better luck.

'''Tarquin:''' With the variable names, I think you need to adopt a scheme that makes it clear which xPawn variable it relates to. Eg, 
 x.MultiJumpBoost = myMultiJumpBoost ;

and so on.

'''SuperApe:''' I'm just guessing by the sheer volume of discussion entries that this page needs a RefactorMe tag.  If not, (or if refactored) please remove.

'''Metabollica:''' Ok i've tried this out and i can't get it to compile. I'm a complete noob at this also and honestly this tutorial must need a lot of pre-requisites. Because i understand very little of what is being asked. The error i get is that it doesn't recognise type xPawn, i thought maybe it was a typo so i copy and pasted but nothing changed.

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>32312</id>
      <timestamp>2008-06-06T17:21:50Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>moving discussion to talk page</comment>
      <text xml:space="preserve">This Unreal Tournament 2004 Tutorial will take you through the basic process of creating a mutator that allows you to alter a players health and the number of multi-jumps they can perform.

You can download the code from [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName.zip], but it might not be as up to date as the code on this page. For the original page check out [[Legacy:MutTutorial Code|MutTutorial code]].

==Before You Start==

As with the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial we need to create a directory to hold our mutator code.  The name of the directory determines the name of the package into which your code will be compiled.  To that end you need to [[Legacy:Set Up Package Folders|Set Up Package Folders]]:

# Create a directory &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; within your UT2004 directory
# Create a directory &lt;CODE&gt;Classes&lt;/CODE&gt; within the &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; you just created.

You should have the following folder tree:

+ UT2004 

++ MutNeedBetterName

+++ Classes

The '''Mut''' prefix is used as a convention within UT2004 to indicate all packages and classes that relate to mutators.  It is not mandatory to do this and we could have called our package (and therefore the directory) &lt;CODE&gt;NeedBetterName&lt;/CODE&gt;.  It is recommended that you use the conventional Mut prefix though for organisations sake.

==Writing the Mutator==

Now to actually write some code that can be compiled.

Within your &lt;CODE&gt;/UT2004/MutNeedBetterName/Classes&lt;/CODE&gt; directory create a file called &lt;CODE&gt;MutNeedBetterName.uc&lt;/CODE&gt;.  All Unreal Script class files have an extension of '''.uc'''.  They '''must''' also be named after the class file they are contained within.

Add the following code to the file.  The code is described after each logical block.

&lt;uscript&gt;
class MutNeedBetterName extends Mutator;
&lt;/uscript&gt;

This is the class declaration.  We are essentially telling the game that this is a new class called &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; and that it is a type of (it extends, or subclasses) [[Legacy:Mutator|Mutator]]. And finally, like all good things in life, the class declaration is terminated with a semi-colon.  You can see [[Legacy:Class Syntax|Class Syntax]] for more information.

&lt;uscript&gt;
var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth, SuperDuberMaximumHealth; // The number of multi-jumps allowed
//The boost the player gets from a multi-jump and the player's starting health
&lt;/uscript&gt;

The section above defines three variables (all integers - see [[Legacy:Variable Type|Variable Type]]s) that are all properties of the class being defined.

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  local xPawn x; //x is a variable
  x = xPawn(Other); 
  if (x != None)
  {
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth;
    x.SuperHealthMax = SuperDuberMaximumHealth;
  }
  // YOU FORGOT TO CALL THE SUPERCLASS! THIS BREAKS THE MUTATOR CHAIN

}
&lt;/uscript&gt;

The first line declares the function (see [[Legacy:Function Syntax|Function Syntax]]).  This is the function that actually updates the player's attributes.  Because our class is a type of Mutator the &lt;CODE&gt;ModifyPlayer()&lt;/CODE&gt; function will be called automatically for every player in the game as they spawn.

The next two lines of code (ignoring the braces) do the following.
* Declare a local (only visible within the function) variable of type xPawn ([[Legacy:XPawn|xPawn]] is a type of [[Legacy:Pawn|Pawn]], and can be found in the xGame package).
* Assign a value to our local variable after [[Legacy:Typecasting|Typecasting]] the value passed in the &lt;CODE&gt;Other&lt;/CODE&gt; function parameter.  Note that if &lt;CODE&gt;Other&lt;/CODE&gt; is not a type of (or subclass) xPawn our local variable will contain &lt;CODE&gt;None&lt;/CODE&gt;.

The &lt;CODE&gt;if&lt;/CODE&gt; statement checks to see if the local variable has a value by comparing it to the &quot;empty value&quot; &lt;CODE&gt;None&lt;/CODE&gt; using the not equal to (&lt;CODE&gt;!=&lt;/CODE&gt;) operator.  See [[Legacy:Operators|Operators]] for more information.  Remember - if the object referenced by &lt;CODE&gt;Other&lt;/CODE&gt; is not an xPawn our local variable will be equal to (&lt;CODE&gt;----&lt;/CODE&gt;) None.

The block of code within the &lt;CODE&gt;if&lt;/CODE&gt; statement adjusts the player's jump and health properties using the values from our mutator's configurable properties.

&lt;uscript&gt;
defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  SuperDuberMaximumHealth=500
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;
}
&lt;/uscript&gt;

This block of code allows you to specify default values for all of your class properties.  If a class property is declared as configurable then the value within the mutator's ini file will be used if available instead of the value specified here.  The [[Legacy:Default Properties|Default Properties]] page contains much more information about how default values should be specified.

==Compiling and Using the Mutator==

Next add this code to the file UT2004.ini: &quot;EditPackages=MutNeedBetterName&quot;

Move the folder MutNeedBetterName into C:\UT2004 (or where ever you installed UT2004)

Move the file MutNeedBetterName.int into UT2004\system

Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under mutators Mutation Tutorial.

==Adding a Configuration Window==

If you want to allow your mutator's configurable parameters to be changed from the standard UT2004 mutator config window then please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference.

==Useful Pages==
* [[Legacy:Compiler Errors|Compiler Errors]]

----

==Conclusion==

You should now have code that looks like this (without the comments): [[Legacy:MutTutorial Code|MutTutorial Code]]

==Discussion==
See [[{{TALKPAGENAME}}]].

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34502</id>
      <timestamp>2009-06-18T05:50:34Z</timestamp>
      <contributor>
        <ip>70.24.14.46</ip>
      </contributor>
      <comment>/* Writing the Mutator */</comment>
      <text xml:space="preserve">This Unreal Tournament 2004 Tutorial will take you through the basic process of creating a mutator that allows you to alter a players health and the number of multi-jumps they can perform.

You can download the code from [http://www.home.earthlink.net/~doodlethe1/MutNeedBetterName.zip], but it might not be as up to date as the code on this page. For the original page check out [[Legacy:MutTutorial Code|MutTutorial code]].

==Before You Start==

As with the [[Legacy:UnrealScript Hello World|UnrealScript Hello World]] tutorial we need to create a directory to hold our mutator code.  The name of the directory determines the name of the package into which your code will be compiled.  To that end you need to [[Legacy:Set Up Package Folders|Set Up Package Folders]]:

# Create a directory &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; within your UT2004 directory
# Create a directory &lt;CODE&gt;Classes&lt;/CODE&gt; within the &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; you just created.

You should have the following folder tree:

+ UT2004 

++ MutNeedBetterName

+++ Classes

The '''Mut''' prefix is used as a convention within UT2004 to indicate all packages and classes that relate to mutators.  It is not mandatory to do this and we could have called our package (and therefore the directory) &lt;CODE&gt;NeedBetterName&lt;/CODE&gt;.  It is recommended that you use the conventional Mut prefix though for organisations sake.

==Writing the Mutator==

Now to actually write some code that can be compiled.

Within your &lt;CODE&gt;/UT2004/MutNeedBetterName/Classes&lt;/CODE&gt; directory create a file called &lt;CODE&gt;MutNeedBetterName.uc&lt;/CODE&gt;.  All Unreal Script class files have an extension of '''.uc'''.  They '''must''' also be named after the class file they are contained within.

Add the following code to the file.  The code is described after each logical block.

&lt;uscript&gt;
class MutNeedBetterName extends Mutator;
&lt;/uscript&gt;

This is the class declaration.  We are essentially telling the game that this is a new class called &lt;CODE&gt;MutNeedBetterName&lt;/CODE&gt; and that it is a type of (it extends, or subclasses) [[Legacy:Mutator|Mutator]]. And finally, like all good things in life, the class declaration is terminated with a semi-colon.  You can see [[Legacy:Class Syntax|Class Syntax]] for more information.

&lt;uscript&gt;
var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth, SuperDuberMaximumHealth; // The number of multi-jumps allowed
//The boost the player gets from a multi-jump and the player's starting health
&lt;/uscript&gt;

The section above defines three variables (all integers - see [[Legacy:Variable Type|Variable Type]]s) that are all properties of the class being defined.

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  local xPawn x; //x is a variable
  x = xPawn(Other); 
  if (x != None)
  {
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth;
    x.SuperHealthMax = SuperDuberMaximumHealth;
  }
  // YOU FORGOT TO CALL THE SUPERCLASS! THIS BREAKS THE MUTATOR CHAIN

  // Tested this code with the Superclass below and it was not recognized (UT2K4)
  // Super.ModifyPlayer( Pawn Other );

}
&lt;/uscript&gt;

The first line declares the function (see [[Legacy:Function Syntax|Function Syntax]]).  This is the function that actually updates the player's attributes.  Because our class is a type of Mutator the &lt;CODE&gt;ModifyPlayer()&lt;/CODE&gt; function will be called automatically for every player in the game as they spawn.

The next two lines of code (ignoring the braces) do the following.
* Declare a local (only visible within the function) variable of type xPawn ([[Legacy:XPawn|xPawn]] is a type of [[Legacy:Pawn|Pawn]], and can be found in the xGame package).
* Assign a value to our local variable after [[Legacy:Typecasting|Typecasting]] the value passed in the &lt;CODE&gt;Other&lt;/CODE&gt; function parameter.  Note that if &lt;CODE&gt;Other&lt;/CODE&gt; is not a type of (or subclass) xPawn our local variable will contain &lt;CODE&gt;None&lt;/CODE&gt;.

The &lt;CODE&gt;if&lt;/CODE&gt; statement checks to see if the local variable has a value by comparing it to the &quot;empty value&quot; &lt;CODE&gt;None&lt;/CODE&gt; using the not equal to (&lt;CODE&gt;!=&lt;/CODE&gt;) operator.  See [[Legacy:Operators|Operators]] for more information.  Remember - if the object referenced by &lt;CODE&gt;Other&lt;/CODE&gt; is not an xPawn our local variable will be equal to (&lt;CODE&gt;----&lt;/CODE&gt;) None.

The block of code within the &lt;CODE&gt;if&lt;/CODE&gt; statement adjusts the player's jump and health properties using the values from our mutator's configurable properties.

&lt;uscript&gt;
defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  SuperDuberMaximumHealth=500
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;
}
&lt;/uscript&gt;

This block of code allows you to specify default values for all of your class properties.  If a class property is declared as configurable then the value within the mutator's ini file will be used if available instead of the value specified here.  The [[Legacy:Default Properties|Default Properties]] page contains much more information about how default values should be specified.

==Compiling and Using the Mutator==

Next add this code to the file UT2004.ini: &quot;EditPackages=MutNeedBetterName&quot;

Move the folder MutNeedBetterName into C:\UT2004 (or where ever you installed UT2004)

Move the file MutNeedBetterName.int into UT2004\system

Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under mutators Mutation Tutorial.

==Adding a Configuration Window==

If you want to allow your mutator's configurable parameters to be changed from the standard UT2004 mutator config window then please see the [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] reference.

==Useful Pages==
* [[Legacy:Compiler Errors|Compiler Errors]]

----

==Conclusion==

You should now have code that looks like this (without the comments): [[Legacy:MutTutorial Code|MutTutorial Code]]

==Discussion==
See [[{{TALKPAGENAME}}]].

[[Category:Legacy Refactor Me|{{PAGENAME}}]]
[[Category:Legacy Tutorial|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutTutorial Code</title>
    <id>2172</id>
    <revision>
      <id>5279</id>
      <timestamp>2006-05-04T15:51:50Z</timestamp>
      <contributor>
        <ip>Ip-139-77.station.sony.com</ip>
      </contributor>
      <comment>*the script wouldn't compile because of missing ; in line 62</comment>
      <text xml:space="preserve">THIS PAGE HAS MOVED TO [[Legacy:MutTutorial|MutTutorial]]!

&lt;Uscript&gt;

class MutNeedBetterName extends Mutator;

//creates a new class for your mutator and makes it an extension of the mutator class.

//This makes it so it follows all the rules a mutator does.

var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth; // The number of multi-jumps allowed

//The boost the player gets from a multi-jump and the player's starting health

// The var keyword prefixes a variable declaration.

// A variable declaration tells the engine what information this

// object needs to store and what kind of information it is.

// The type of information in this declaration is int, short

// for integer. An integer is a whole number, either positive

// or negative.

// The () puts these variables in a group and makes them

// visible in UnrealEds property browser. Since this is a

// mutator and likely won't be placed in a map, the () is

// probrably unnecessary.

Function Modifyplayer(pawn other)

//A function (set of actions, in the case of Uscript often predefined) that will modify the avatars/bots (pawns).

// Other is a variable that stores a reference to the player

// that we are modifying. The function uses this information

// to find the player amidst all the other things in the game

// world.

//I am using modify player because I want to change the properties of a player, in this case the MultiJumping power.

{
   // Local is just like the Var keyword - it tells the engine
   // that we need to store some information, and what type of
   // information to store. However, Local declarations go away
   // at the end of the function, while Var ones stay around
   // until this object is destroyed. (Since it's a mutator,
   // it will be destroyed when the level changes.)
   Local Xpawn x; //Xpawn = changeable guy

   // This stores the information we had in Other, in X as well.
   // We cast Other to an xPawn (which is what X is) because an
   // xPawn is a type of Pawn. (which is what Other is) Since
   // every xPawn is a Pawn, but not all Pawns are xPawns, we
   // have to tell the engine that the Pawn in Other is actually
   // an xPawn.
   X = xPawn(other);
   
   // Now we check to see if X holds valid information or not.
   // If it was a reference to a player that didn't actually
   // exist, or if the statement before this one (where we told
   // the engine that our Pawn (Other) was an xPawn turned out
   // to be untrue, then X might not hold valid information.
   // Most of the time it will hold valid information, but this
   // line checks just to be sure.
   if (X != None)
   {
      // Make X's MaxMultiJump equal to XMultiJump etc.
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth;

   }

}

defaultproperties

{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;

}

//Next add this code to the file UT2004.ini: &quot;EditPackages=MutTutorial&quot;

//Move the folder MutTutorial into C:\UT2004 (or where ever you installed UT2004)

//Move the file MutTutorial.int into UT2004\system

//Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

//type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

//Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

//Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under muators Mutation Tutorial
&lt;/Uscript&gt;</text>
    </revision>
    <revision>
      <id>5280</id>
      <timestamp>2004-06-28T18:31:42Z</timestamp>
      <contributor>
        <ip>Mr.Bob</ip>
      </contributor>
      <comment>*changed code</comment>
      <text xml:space="preserve">THIS PAGE HAS MOVED TO [[Legacy:MutTutorial|MutTutorial]]!

&lt;Uscript&gt;

class MutNeedBetterName extends Mutator;

//creates a new class for your mutator and makes it an extension of the mutator class.

//This makes it so it follows all the rules a mutator does.

var int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth; // The number of multi-jumps allowed

//The boost the player gets from a multi-jump and the player's starting health

// The var keyword prefixes a variable declaration.

// A variable declaration tells the engine what information this

// object needs to store and what kind of information it is.

// The type of information in this declaration is int, short

// for integer. An integer is a whole number, either positive

// or negative.

// The () puts these variables in a group and makes them

// visible in UnrealEds property browser. Since this is a

// mutator and likely won't be placed in a map, the () is

// probrably unnecessary.

Function Modifyplayer(pawn other)

//A function (set of actions, in the case of Uscript often predefined) that will modify the avatars/bots (pawns).

// Other is a variable that stores a reference to the player

// that we are modifying. The function uses this information

// to find the player amidst all the other things in the game

// world.

//I am using modify player because I want to change the properties of a player, in this case the MultiJumping power.

{
   // Local is just like the Var keyword - it tells the engine
   // that we need to store some information, and what type of
   // information to store. However, Local declarations go away
   // at the end of the function, while Var ones stay around
   // until this object is destroyed. (Since it's a mutator,
   // it will be destroyed when the level changes.)
   Local Xpawn x; //Xpawn = changeable guy

   // This stores the information we had in Other, in X as well.
   // We cast Other to an xPawn (which is what X is) because an
   // xPawn is a type of Pawn. (which is what Other is) Since
   // every xPawn is a Pawn, but not all Pawns are xPawns, we
   // have to tell the engine that the Pawn in Other is actually
   // an xPawn.
   X = xPawn(other);
   
   // Now we check to see if X holds valid information or not.
   // If it was a reference to a player that didn't actually
   // exist, or if the statement before this one (where we told
   // the engine that our Pawn (Other) was an xPawn turned out
   // to be untrue, then X might not hold valid information.
   // Most of the time it will hold valid information, but this
   // line checks just to be sure.
   if (X != None)
   {
      // Make X's MaxMultiJump equal to XMultiJump etc.
    x.MaxMultiJump = MultiJumpCount;
    x.MultiJumpBoost = MultiJumpBoost;
    x.Health = StartingHealth;
    x.HealthMax = MaximumHealth

   }

}

defaultproperties

{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;What ever you want the Mutator to be called&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;

}

//Next add this code to the file UT2004.ini: &quot;EditPackages=MutTutorial&quot;

//Move the folder MutTutorial into C:\UT2004 (or where ever you installed UT2004)

//Move the file MutTutorial.int into UT2004\system

//Open Command line (a quick way to do this is to open &quot;run&quot; and type cmd)

//type in &quot;C:\UT2004\System\ucc make&quot; press enter and wait.

//Ucc will go through all the folders and if you edited your UT2004[or 3 i think].ini right it should go through your folder.

//Hopefully it will say success, there were no errors. If it does run Unreal Tourney and you will see under muators Mutation Tutorial
&lt;/Uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutTutorial Code With GUI</title>
    <id>2177</id>
    <revision>
      <id>5287</id>
      <timestamp>2005-01-09T21:30:19Z</timestamp>
      <contributor>
        <ip>Nc-69-69-216-171.dyn.sprint-hsd.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class MutNeedBetterName extends Mutator config (MutNeedBetterName);

var config int MultiJumpCount, MultiJumpBoost, StartingHealth, MaximumHealth, SuperDuberMaximumHealth;
// The number of multi-jumps allowed, the boost the player gets from a multi-jump,
// the player's starting health, the maximum health and the maximum super health

var localized string MultiJumpCountDisplayText, MultiJumpBoostDisplayText, StartingHealthDisplayText, HealthMaxDisplayText, SuperHealthMaxDisplayText,
                     MultiJumpCountDescText, MultiJumpBoostDescText, StartingHealthDescText, HealthMaxDescText, SuperHealthMaxDescText;

function ModifyPlayer(Pawn Other) {
	local xPawn x; //x is a variable
	x = xPawn(Other);
	if (x != None) {
		x.MaxMultiJump = MultiJumpCount;
		x.MultiJumpBoost = MultiJumpBoost;
		x.Health = StartingHealth;
		x.HealthMax = MaximumHealth;
		x.SuperHealthMax = SuperDuberMaximumHealth;
	}
}

static function FillPlayInfo(PlayInfo PlayInfo) {
	Super.FillPlayInfo(PlayInfo);

	PlayInfo.AddSetting(default.RulesGroup, &quot;MultiJumpCount&quot;, default.MultiJumpCountDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;MultiJumpBoost&quot;, default.MultiJumpBoostDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;StartingHealth&quot;, default.StartingHealthDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;MaximumHealth&quot;, default.HealthMaxDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;SuperDuberMaximumHealth&quot;, default.SuperHealthMaxDisplayText, 0, 1, &quot;Text&quot;);

}

static event string GetDescriptionText(string PropName) {
	switch (PropName) {
		case &quot;MultiJumpCount&quot;:	        return default.MultiJumpCountDescText;
		case &quot;MultiJumpBoost&quot;:          return default.MultiJumpBoostDescText;
		case &quot;StartingHealth&quot;:          return default.StartingHealthDescText;
		case &quot;MaximumHealth&quot;:           return default.HealthMaxDescText;
		case &quot;SuperDuberMaximumHealth&quot;: return default.SuperHealthMaxDescText;
	}

	return Super.GetDescriptionText(PropName);
}

static function string GetDisplayText(string PropName) {
  switch (PropName) {
    case &quot;MultiJumpCount&quot;:           return default.MultiJumpCountDisplayText;
    case &quot;MultiJumpBoost&quot;:           return default.MultiJumpBoostDisplayText;
    case &quot;StartingHealth&quot;:           return default.StartingHealthDisplayText;
    case &quot;MaximumHealth&quot;:            return default.HealthMaxDisplayText;
    case &quot;SuperDuberMaximumHealth&quot;:  return default.SuperHealthMaxDisplayText;
  }
}

defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  MaximumHealth=250
  SuperDuberMaximumHealth=300
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;Player Tweaker&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial/max health and multi-jumping ability.&quot;

  MultiJumpCountDisplayText=&quot;Multi-Jump Count&quot;
  MultiJumpBoostDisplayText=&quot;Multi-Jump Boost&quot;
  StartingHealthDisplayText=&quot;Starting Health&quot;
  HealthMaxDisplayText=&quot;Maximum Health&quot;
  SuperHealthMaxDisplayText=&quot;Maximum SuperHealth&quot;

  MultiJumpCountDescText=&quot;The number of times you can multi-jump.&quot;
  MultiJumpBoostDescText=&quot;The boost you get with each multi-jump.&quot;
  StartingHealthDescText=&quot;The starting health for the game.&quot;
  HealthMaxDescText=&quot;The maximum health for the game.&quot;
  SuperHealthMaxDescText=&quot;The maximum superhealth for the game.&quot;
}
&lt;/uscript&gt;

'''mr.bob:''' :D I wish i could test compile this, but the camp computers don't have the full verson of UT204 yet. YThere is this mut that makes it so that health and shield pickups give you more or less stuff. Good combo with this mutator.

This could obiously use some work, comments and such, but I can tell that it is a rough draft and you are working on it. Now it is only a matter of months before I realace a mutator that people will actually download. Unfortanatly it will be a long time before i have enough skillz to create this mutator: [[Legacy:Mod Ideas/Upgrades|mod ideas/upgrades]].

'''Geist:''' Just added ''config (MutNeedBetterName)'' (so the vars would be saved to MutNeedBetterName.ini) to the class declaration, and renamed a couple vars for readibility as they were renamed in the original tutorial.  I have compiled this, and it works.</text>
    </revision>
    <revision>
      <id>5288</id>
      <timestamp>2004-07-15T15:57:28Z</timestamp>
      <contributor>
        <ip>63.163.108.xxx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">&lt;uscript&gt;
class MutNeedBetterName extends Mutator;

var config int MultiJumpCount, MultiJumpBoost, StartingHealth, HealthMax, SuperHealthMax;
// The number of multi-jumps allowed, the boost the player gets from a multi-jump,
// the player's starting health, the maximum health and the maximum super health

var localized string MultiJumpCountDisplayText, MultiJumpBoostDisplayText, StartingHealthDisplayText, HealthMaxDisplayText, SuperHealthMaxDisplayText,
                     MultiJumpCountDescText, MultiJumpBoostDescText, StartingHealthDescText, HealthMaxDescText, SuperHealthMaxDescText;

function ModifyPlayer(Pawn Other) {
	local xPawn x; //x is a variable
	x = xPawn(Other);
	if (x != None) {
		x.MaxMultiJump = MultiJumpCount;
		x.MultiJumpBoost = MultiJumpBoost;
		x.Health = StartingHealth;
		x.HealthMax = HealthMax;
		x.SuperHealthMax = SuperHealthMax;
	}
}

static function FillPlayInfo(PlayInfo PlayInfo) {
	Super.FillPlayInfo(PlayInfo);

	PlayInfo.AddSetting(default.RulesGroup, &quot;MultiJumpCount&quot;, default.MultiJumpCountDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;MultiJumpBoost&quot;, default.MultiJumpBoostDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;StartingHealth&quot;, default.StartingHealthDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;HealthMax&quot;, default.HealthMaxDisplayText, 0, 1, &quot;Text&quot;);
	PlayInfo.AddSetting(default.RulesGroup, &quot;SuperHealthMax&quot;, default.SuperHealthMaxDisplayText, 0, 1, &quot;Text&quot;);

}

static event string GetDescriptionText(string PropName) {
	switch (PropName) {
		case &quot;MultiJumpCount&quot;:	        return default.MultiJumpCountDescText;
		case &quot;MultiJumpBoost&quot;:          return default.MultiJumpBoostDescText;
		case &quot;StartingHealth&quot;:          return default.StartingHealthDescText;
		case &quot;HealthMax&quot;:               return default.HealthMaxDescText;
		case &quot;SuperHealthMax&quot;:          return default.SuperHealthMaxDescText;
	}

	return Super.GetDescriptionText(PropName);
}

static function string GetDisplayText(string PropName) {
  switch (PropName) {
    case &quot;MultiJumpCount&quot;:  return default.MultiJumpCountDisplayText;
    case &quot;MultiJumpBoost&quot;:  return default.MultiJumpBoostDisplayText;
    case &quot;StartingHealth&quot;:  return default.StartingHealthDisplayText;
    case &quot;HealthMax&quot;:       return default.HealthMaxDisplayText;
    case &quot;SuperHealthMax&quot;:  return default.SuperHealthMaxDisplayText;
  }
}

defaultproperties
{
  MultiJumpCount=10
  MultiJumpBoost=50
  StartingHealth=250
  HealthMax=250
  SuperHealthMax=300
  GroupName=&quot;MutNeedBetterName&quot;
  FriendlyName=&quot;Player Tweaker&quot; //This is the name of the Mutator that will display in game
  Description=&quot;Changes your initial health and Multi-Jumping ability&quot;
  MultiJumpCountDisplayText=&quot;Multi Jump-count&quot;
  MultiJumpBoostDisplayText=&quot;Multi Jump boost&quot;
  StartingHealthDisplayText=&quot;Starting Health&quot;
  HealthMaxDisplayText=&quot;Maximum health&quot;
  SuperHealthMaxDisplayText=&quot;Maximum superhealth&quot;
  MultiJumpCountDescText=&quot;The number of times you can Multi Jump&quot;
  MultiJumpBoostDescText=&quot;The boost you get with each Multi Jump&quot;
  StartingHealthDescText=&quot;The starting health for the game&quot;
  HealthMaxDescText=&quot;The maximum health for the game&quot;
  SuperHealthMaxDescText=&quot;The maximum superhealth for the game&quot;
}
&lt;/uscript&gt;

'''mr.bob:''' :D I wish i could test compile this, but the camp computers don't have the full verson of UT204 yet. YThere is this mut that makes it so that health and shield pickups give you more or less stuff. Good combo with this mutator.

This could obiously use some work, comments and such, but I can tell that it is a rough draft and you are working on it. Now it is only a matter of months before I realace a mutator that people will actually download. Unfortanatly it will be a long time before i have enough skillz to create this mutator: [[Legacy:Mod Ideas/Upgrades|mod ideas/upgrades]].</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutTutorial Code/Source Code</title>
    <id>2175</id>
    <revision>
      <id>5284</id>
      <timestamp>2004-06-24T21:15:20Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Unchanged Source Code block from MutTutorial.==

&lt;uscript&gt;
Class MutTutorial extends mutator;

//creates a new class for your mutator and makes it an extension of the mutator class.
//This makes it so it follows all the rules a mutator does.

Var() int XMultiJump, XBoost, XHealth;

// The var keyword prefixes a variable declaration.
// A variable declaration tells the engine what information this
// object needs to store and what kind of information it is.
// The type of information in this declaration is int, short
// for integer. An integer is a whole number, either positive
// or negative.

// The () puts these variables in a group and makes them
// visible in UnrealEds property browser. Since this is a
// mutator and likely won't be placed in a map, the () is
// probrably unnecessary.

Function Modifyplayer(pawn other)

//A function (set of actions, in the case of Uscript often predefined) that will modify the avatars/bots (pawns).
// Other is a variable that stores a reference to the player
// that we are modifying. The function uses this information
// to find the player amidst all the other things in the game
// world.
//I am using modify player because I want to change the properties of a player, in this case the MultiJumping power.

{
   // Local is just like the Var keyword - it tells the engine
   // that we need to store some information, and what type of
   // information to store. However, Local declarations go away
   // at the end of the function, while Var ones stay around
   // until this object is destroyed. (Since it's a mutator,
   // it will be destroyed when the level changes.)
   Local Xpawn x; //Xpawn = changeable guy

   // This stores the information we had in Other, in X as well.
   // We cast Other to an xPawn (which is what X is) because an
   // xPawn is a type of Pawn. (which is what Other is) Since
   // every xPawn is a Pawn, but not all Pawns are xPawns, we
   // have to tell the engine that the Pawn in Other is actually
   // an xPawn.
   X = xPawn(other);
   
   // Now we check to see if X holds valid information or not.
   // If it was a reference to a player that didn't actually
   // exist, or if the statement before this one (where we told
   // the engine that our Pawn (Other) was an xPawn turned out
   // to be untrue, then X might not hold valid information.
   // Most of the time it will hold valid information, but this
   // line checks just to be sure.
   if (X != None)
   {
      // Make X's MaxMultiJump equal to XMultiJump etc.
      X.MaxMultiJump = XMultiJump;
      X.MultiJumpBoost = XBoost;
      X.Health = XHealth;
   }
}

defaultproperties
{
   GroupName=&quot;MutTutorial&quot;
   FriendlyName=&quot;Mutation Tutorial&quot; //Important, this is what will display in the game when you are selecting Mutators.
   Description=&quot;Changes your health and MultiJumping ability&quot;
   XMultiJump=10
   XBoost=50
   XHealth=250
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutZoomInstagib</title>
    <id>2225</id>
    <revision>
      <id>5385</id>
      <timestamp>2005-12-19T05:37:15Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>Comment</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:MutInstaGib|MutInstaGib]] &gt;&gt; MutZoomInstaGib (Package: XGame)}}

==Functions==
; bool MutatorIsAllowed() : Returns true.

==Related Topics==
* [[Legacy:InstaGib CTF|InstaGib CTF]]

==Discussion==

'''Nick89''': ADMIN HELP.  Please change page name to InstaGib with a capital &quot;G&quot;.  Thanks.

'''SuperApe:''' I'm hot on your heels, Nick. ;)

'''Nick89:''' At least I'll never make these mistakes again ;)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5386</id>
      <timestamp>2005-12-19T05:34:54Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; [[Legacy:MutInstaGib|MutInstaGib]] &gt;&gt; MutZoomInstaGib (Package: XGame)}}

==Functions==
; bool MutatorIsAllowed() : Returns true.

==Related Topics==
* [[Legacy:InstaGib CTF|InstaGib CTF]]

==Discussion==

'''Nick89''': ADMIN HELP.  Please change page name to InstaGib with a capital &quot;G&quot;.  Thanks.

'''SuperApe:''' I'm hot on your heels, Nick. ;)

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MutantGameReplicationInfo</title>
    <id>28833</id>
    <revision>
      <id>42760</id>
      <timestamp>2010-03-30T16:11:31Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>m</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator</title>
    <id>1809</id>
    <revision>
      <id>4438</id>
      <timestamp>2007-09-20T22:00:37Z</timestamp>
      <contributor>
        <ip>91.84.94.154</ip>
      </contributor>
      <comment>improve description of bAddToServerPackages</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system works, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Mutator (UT)|Mutator (UT)]] for the UT version of this class.

'''Note:''' In UT2003 many functions of UT's Mutator class are either no longer available or have been moved to the [[Legacy:GameRules|GameRules]] class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; class&lt;[[Legacy:Weapon|Weapon]]&gt; DefaultWeapon : 
; string DefaultWeaponName : 
; bool bUserAdded : This mutator was added by the user either from the commandline when starting a server, in the &quot;open&quot; console command or via the mutator list.
; bool bAddToServerPackages : if true, the package this mutator is in will be added to serverpackages at load time.  This property should be set to true to enabled in order for clients to download the mutator.  An alternative is to add the package name to ServerPackages in UT2004.ini, but this is discouraged.
; string IconMaterialName : 
; string ConfigMenuClassName : A GUI class that serves as this mutator's config window.
; string GroupName : Only mutators from different groups are allowed in the mutator list. Use the same group name for mutators what will not work together, e.g. the Arena mutator and InstaGib/Zoom InstaGib use the group name &quot;Arena&quot;.
; string FriendlyName (localized) : The display name of the mutator. Use this or the mutator won't show up in the selection list, even if you correctly create its [[Legacy:INT File|INT File]].
; string Description (localized) : This is the description displayed for the mutator. Use a pipe symbol &quot;|&quot; to create a line break.

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PreBeginPlay ( ) : Checks whether the mutator is allowed (&lt;code&gt;MutatorIsAllowed&lt;/code&gt; function) and destroys it if the check shows, that it isn't.
; Destroyed ( ) : Removes the mutator from the [[Legacy:GameInfo|GameInfo]]'s [[Legacy:Linked List|linked list]] of mutators.

===BaseMutator Functions ===

These functions are only called for the first mutator in the list so if you override them they may not always be executed depending on the order any other mutators were added to the game by the user.

===Mutator Chain Functions ===

These functions should call the same function of the next mutator in the [[Legacy:Linked List|linked list]] of mutators. This can usually be done by calling the superclass. For example:

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  // do stuff here

  Super.ModifyPlayer(Other); // this will call the next mutator in the chain
}
&lt;/uscript&gt;

Of course, since you have no control over the order of loaded mutators, you could just as easily call the Super function at the top of the function. It's traditional to put it at the bottom, but sometimes easier at the top.

For functions that return a value, you have to use your judgement on how to combine what you want to return with what other mutators might want to do.

;function Mutate(string Command, PlayerController Sender): Called when a player enters &quot;mutate &lt;command&gt;&quot; at the game console.

;function string RecommendCombo(string ComboName): This function can be used to recommend a combo (presumably to a bot) that works well with your mutator.  This function will typically select a combo and then pass that selection on to the next mutator in the chain.  The later the mutator is within the mutator chain the more likely that mutator's combo will be used.  See the XGame.MutInstaGib class for an example.

;function bool AlwaysKeep(Actor Other): If this function returns true then the game will keep the actor passed from being destroyed - even if other actors wish to remove it.  It's best to force the game to keep as few actors as possible as this ensures mod compatibility, so only return true from this function if you really really mean it.  This function is called from CheckRelevance().  The default return value for this function is ''false''.  If you wish to avoid duplicating the mutator chain-walk code then at the end of your overridden method simply add the following line: ''return bKeepActor | Super.AlwaysKeep(Other);'' where bKeepActor is a local variable that contains true or false depending on whether your mutator wants to keep this actor or not.

;function bool IsRelevant(Actor Other, out byte bSuperRelevant): 

;function ModifyPlayer(Pawn Other): This function is called whenever a player spawns. It can be used to update the player's inventory, speed, and other attributes. This function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

;function string GetInventoryClassOverride(string InventoryClassName): This function is much like checkreplacement, but is specific to items added to an actor's Inventory chain. The function is called with the proposed inventory actor's class as an argument. If the string returned differs from the argument (you return the name of a different class) an actor of the class whos name was returned will be added to the Inventory chain instead of the original proposed actor.\\'''Foxpaw:''' The above is mostly speculative and derived from the way a function posted on the [[Legacy:Help Desk|Help Desk]] appears to operate. Some confirmation that that is actually what it is doing would be nice.

; function ModifyLogin(out string Portal, out string Options ): modify player login parameters.

'''Poltomb:''' In some mutators, you may need to retrieve data from the Options string.  The easiest way to do this is to use Level.Game.ParseOption(Options,OptionParameter) function ie:

&lt;uscript&gt;
PlayerName = Level.Game.ParseOption(Options,&quot;Name&quot;);
&lt;/uscript&gt;

===Other Functions ===
;function AddMutator(Mutator M): If a mutator has already been added to the game then this function may be used to add an additional mutator at the end of the mutator chain.  Make sure that the Level.Game.BaseMutator reference actually points to a mutator before calling this function though.

;function bool CheckReplacement(Actor Other, out byte bSuperRelevant): This function should return true if the actor passed to the function can be replaced within the game.  It is very similar to the AlwaysKeep() function except that it doesn't walk the mutator chain.  By default this function returns ''true''.  This function can also be used if you want to change the attributes of an Actor on the map - simply increasing the amount of ammunition in ammo packs for example.  If used for this purpose the Actor passed in is never replaced and the function should always return true.

==Related Topics ==
* [[Legacy:GameRules|GameRules]] class
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]
* [[Legacy:Mutators/GameInfos|Mutators/GameInfos]] : The difference

==Discussion ==

'''Wormbo:''' I'm not sure, how exactly the functions should be grouped. This page should be a kind of starting point for people who want to learn more about mutator functions.

'''Trystan:''' How many functions are there, really?  I guess what I'm saying is are there a large enough number of them of varying degrees of change to necessitate heavy categorization?

'''Wormbo:''' Well, we could cut it down to functions that are meant to be overridden and those that shouldn't be touched if that would be neccessary. There are 22 functions in Engine.Mutator, including the one already listed here. Stuff like CheckReplacement should be overridden, ModifyPlayer should both be overridden and call the next mutator's ModifyPlayer, ReplaceWith is a function that is only helpful, but can't actually be overridden and it seems like CheckRelevance is only called for the base mutator and shouldn't be touched at all. So we have at least these four notable categories.

'''Trystan:''' Mutator, Player, Weapon, Game?

'''EntropicLqd:''' Good sections.  A quick discussion (or link) to how mutators and game rules differ would be nice.  We may have one (I've not checked).

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4439</id>
      <timestamp>2007-09-20T21:56:10Z</timestamp>
      <contributor>
        <ip>81-86-106-14.dsl.pipex.com</ip>
      </contributor>
      <comment>Importance of bAddToServerPackages</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system works, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Mutator (UT)|Mutator (UT)]] for the UT version of this class.

'''Note:''' In UT2003 many functions of UT's Mutator class are either no longer available or have been moved to the [[Legacy:GameRules|GameRules]] class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; class&lt;[[Legacy:Weapon|Weapon]]&gt; DefaultWeapon : 
; string DefaultWeaponName : 
; bool bUserAdded : This mutator was added by the user either from the commandline when starting a server, in the &quot;open&quot; console command or via the mutator list.
; bool bAddToServerPackages : if true, the package this mutator is in will be added to serverpackages at load time. This is necessary to make it work correctly automatically in multiplayer for clients other than the host, without having to mung INI files.
; string IconMaterialName : 
; string ConfigMenuClassName : A GUI class that serves as this mutator's config window.
; string GroupName : Only mutators from different groups are allowed in the mutator list. Use the same group name for mutators what will not work together, e.g. the Arena mutator and InstaGib/Zoom InstaGib use the group name &quot;Arena&quot;.
; string FriendlyName (localized) : The display name of the mutator. Use this or the mutator won't show up in the selection list, even if you correctly create its [[Legacy:INT File|INT File]].
; string Description (localized) : This is the description displayed for the mutator. Use a pipe symbol &quot;|&quot; to create a line break.

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PreBeginPlay ( ) : Checks whether the mutator is allowed (&lt;code&gt;MutatorIsAllowed&lt;/code&gt; function) and destroys it if the check shows, that it isn't.
; Destroyed ( ) : Removes the mutator from the [[Legacy:GameInfo|GameInfo]]'s [[Legacy:Linked List|linked list]] of mutators.

===BaseMutator Functions ===

These functions are only called for the first mutator in the list so if you override them they may not always be executed depending on the order any other mutators were added to the game by the user.

===Mutator Chain Functions ===

These functions should call the same function of the next mutator in the [[Legacy:Linked List|linked list]] of mutators. This can usually be done by calling the superclass. For example:

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  // do stuff here

  Super.ModifyPlayer(Other); // this will call the next mutator in the chain
}
&lt;/uscript&gt;

Of course, since you have no control over the order of loaded mutators, you could just as easily call the Super function at the top of the function. It's traditional to put it at the bottom, but sometimes easier at the top.

For functions that return a value, you have to use your judgement on how to combine what you want to return with what other mutators might want to do.

;function Mutate(string Command, PlayerController Sender): Called when a player enters &quot;mutate &lt;command&gt;&quot; at the game console.

;function string RecommendCombo(string ComboName): This function can be used to recommend a combo (presumably to a bot) that works well with your mutator.  This function will typically select a combo and then pass that selection on to the next mutator in the chain.  The later the mutator is within the mutator chain the more likely that mutator's combo will be used.  See the XGame.MutInstaGib class for an example.

;function bool AlwaysKeep(Actor Other): If this function returns true then the game will keep the actor passed from being destroyed - even if other actors wish to remove it.  It's best to force the game to keep as few actors as possible as this ensures mod compatibility, so only return true from this function if you really really mean it.  This function is called from CheckRelevance().  The default return value for this function is ''false''.  If you wish to avoid duplicating the mutator chain-walk code then at the end of your overridden method simply add the following line: ''return bKeepActor | Super.AlwaysKeep(Other);'' where bKeepActor is a local variable that contains true or false depending on whether your mutator wants to keep this actor or not.

;function bool IsRelevant(Actor Other, out byte bSuperRelevant): 

;function ModifyPlayer(Pawn Other): This function is called whenever a player spawns. It can be used to update the player's inventory, speed, and other attributes. This function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

;function string GetInventoryClassOverride(string InventoryClassName): This function is much like checkreplacement, but is specific to items added to an actor's Inventory chain. The function is called with the proposed inventory actor's class as an argument. If the string returned differs from the argument (you return the name of a different class) an actor of the class whos name was returned will be added to the Inventory chain instead of the original proposed actor.\\'''Foxpaw:''' The above is mostly speculative and derived from the way a function posted on the [[Legacy:Help Desk|Help Desk]] appears to operate. Some confirmation that that is actually what it is doing would be nice.

; function ModifyLogin(out string Portal, out string Options ): modify player login parameters.

'''Poltomb:''' In some mutators, you may need to retrieve data from the Options string.  The easiest way to do this is to use Level.Game.ParseOption(Options,OptionParameter) function ie:

&lt;uscript&gt;
PlayerName = Level.Game.ParseOption(Options,&quot;Name&quot;);
&lt;/uscript&gt;

===Other Functions ===
;function AddMutator(Mutator M): If a mutator has already been added to the game then this function may be used to add an additional mutator at the end of the mutator chain.  Make sure that the Level.Game.BaseMutator reference actually points to a mutator before calling this function though.

;function bool CheckReplacement(Actor Other, out byte bSuperRelevant): This function should return true if the actor passed to the function can be replaced within the game.  It is very similar to the AlwaysKeep() function except that it doesn't walk the mutator chain.  By default this function returns ''true''.  This function can also be used if you want to change the attributes of an Actor on the map - simply increasing the amount of ammunition in ammo packs for example.  If used for this purpose the Actor passed in is never replaced and the function should always return true.

==Related Topics ==
* [[Legacy:GameRules|GameRules]] class
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]
* [[Legacy:Mutators/GameInfos|Mutators/GameInfos]] : The difference

==Discussion ==

'''Wormbo:''' I'm not sure, how exactly the functions should be grouped. This page should be a kind of starting point for people who want to learn more about mutator functions.

'''Trystan:''' How many functions are there, really?  I guess what I'm saying is are there a large enough number of them of varying degrees of change to necessitate heavy categorization?

'''Wormbo:''' Well, we could cut it down to functions that are meant to be overridden and those that shouldn't be touched if that would be neccessary. There are 22 functions in Engine.Mutator, including the one already listed here. Stuff like CheckReplacement should be overridden, ModifyPlayer should both be overridden and call the next mutator's ModifyPlayer, ReplaceWith is a function that is only helpful, but can't actually be overridden and it seems like CheckRelevance is only called for the base mutator and shouldn't be touched at all. So we have at least these four notable categories.

'''Trystan:''' Mutator, Player, Weapon, Game?

'''EntropicLqd:''' Good sections.  A quick discussion (or link) to how mutators and game rules differ would be nice.  We may have one (I've not checked).

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35373</id>
      <timestamp>2009-08-28T00:13:11Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <comment>/* Mutator Chain Functions */</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system works, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Mutator (UT)|Mutator (UT)]] for the UT version of this class.

'''Note:''' In UT2003 many functions of UT's Mutator class are either no longer available or have been moved to the [[Legacy:GameRules|GameRules]] class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; class&lt;[[Legacy:Weapon|Weapon]]&gt; DefaultWeapon : 
; string DefaultWeaponName : 
; bool bUserAdded : This mutator was added by the user either from the commandline when starting a server, in the &quot;open&quot; console command or via the mutator list.
; bool bAddToServerPackages : if true, the package this mutator is in will be added to serverpackages at load time.  This property should be set to true to enabled in order for clients to download the mutator.  An alternative is to add the package name to ServerPackages in UT2004.ini, but this is discouraged.
; string IconMaterialName : 
; string ConfigMenuClassName : A GUI class that serves as this mutator's config window.
; string GroupName : Only mutators from different groups are allowed in the mutator list. Use the same group name for mutators what will not work together, e.g. the Arena mutator and InstaGib/Zoom InstaGib use the group name &quot;Arena&quot;.
; string FriendlyName (localized) : The display name of the mutator. Use this or the mutator won't show up in the selection list, even if you correctly create its [[Legacy:INT File|INT File]].
; string Description (localized) : This is the description displayed for the mutator. Use a pipe symbol &quot;|&quot; to create a line break.

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PreBeginPlay ( ) : Checks whether the mutator is allowed (&lt;code&gt;MutatorIsAllowed&lt;/code&gt; function) and destroys it if the check shows, that it isn't.
; Destroyed ( ) : Removes the mutator from the [[Legacy:GameInfo|GameInfo]]'s [[Legacy:Linked List|linked list]] of mutators.

===BaseMutator Functions ===

These functions are only called for the first mutator in the list so if you override them they may not always be executed depending on the order any other mutators were added to the game by the user.

===Mutator Chain Functions ===

These functions should call the same function of the next mutator in the [[Legacy:Linked List|linked list]] of mutators. This can usually be done by calling the superclass. For example:

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  // do stuff here

  Super.ModifyPlayer(Other); // this will call the next mutator in the chain
}
&lt;/uscript&gt;

Of course, since you have no control over the order of loaded mutators, you could just as easily call the Super function at the top of the function. It's traditional to put it at the bottom, but sometimes easier at the top.

For functions that return a value, you have to use your judgement on how to combine what you want to return with what other mutators might want to do.

;function Mutate(string Command, PlayerController Sender): Called when a player enters &quot;mutate &lt;command&gt;&quot; at the game console.

;function string RecommendCombo(string ComboName): This function can be used to recommend a combo (presumably to a bot) that works well with your mutator.  This function will typically select a combo and then pass that selection on to the next mutator in the chain.  The later the mutator is within the mutator chain the more likely that mutator's combo will be used.  See the XGame.MutInstaGib class for an example.

;function bool AlwaysKeep(Actor Other): If this function returns true then the game will keep the actor passed from being destroyed - even if other actors wish to remove it.  It's best to force the game to keep as few actors as possible as this ensures mod compatibility, so only return true from this function if you really really mean it.  This function is called from CheckRelevance().  The default return value for this function is ''false''.  If you wish to avoid duplicating the mutator chain-walk code then at the end of your overridden method simply add the following line: ''return bKeepActor || Super.AlwaysKeep(Other);'' where bKeepActor is a local variable that contains true or false depending on whether your mutator wants to keep this actor or not.

;function bool IsRelevant(Actor Other, out byte bSuperRelevant): 

;function ModifyPlayer(Pawn Other): This function is called whenever a player spawns. It can be used to update the player's inventory, speed, and other attributes. This function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

;function string GetInventoryClassOverride(string InventoryClassName): This function is much like checkreplacement, but is specific to items added to an actor's Inventory chain. The function is called with the proposed inventory actor's class as an argument. If the string returned differs from the argument (you return the name of a different class) an actor of the class whos name was returned will be added to the Inventory chain instead of the original proposed actor.\\'''Foxpaw:''' The above is mostly speculative and derived from the way a function posted on the [[Legacy:Help Desk|Help Desk]] appears to operate. Some confirmation that that is actually what it is doing would be nice.

; function ModifyLogin(out string Portal, out string Options ): modify player login parameters.

'''Poltomb:''' In some mutators, you may need to retrieve data from the Options string.  The easiest way to do this is to use Level.Game.ParseOption(Options,OptionParameter) function ie:

&lt;uscript&gt;
PlayerName = Level.Game.ParseOption(Options,&quot;Name&quot;);
&lt;/uscript&gt;

===Other Functions ===
;function AddMutator(Mutator M): If a mutator has already been added to the game then this function may be used to add an additional mutator at the end of the mutator chain.  Make sure that the Level.Game.BaseMutator reference actually points to a mutator before calling this function though.

;function bool CheckReplacement(Actor Other, out byte bSuperRelevant): This function should return true if the actor passed to the function can be replaced within the game.  It is very similar to the AlwaysKeep() function except that it doesn't walk the mutator chain.  By default this function returns ''true''.  This function can also be used if you want to change the attributes of an Actor on the map - simply increasing the amount of ammunition in ammo packs for example.  If used for this purpose the Actor passed in is never replaced and the function should always return true.

==Related Topics ==
* [[Legacy:GameRules|GameRules]] class
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]
* [[Legacy:Mutators/GameInfos|Mutators/GameInfos]] : The difference

==Discussion ==

'''Wormbo:''' I'm not sure, how exactly the functions should be grouped. This page should be a kind of starting point for people who want to learn more about mutator functions.

'''Trystan:''' How many functions are there, really?  I guess what I'm saying is are there a large enough number of them of varying degrees of change to necessitate heavy categorization?

'''Wormbo:''' Well, we could cut it down to functions that are meant to be overridden and those that shouldn't be touched if that would be neccessary. There are 22 functions in Engine.Mutator, including the one already listed here. Stuff like CheckReplacement should be overridden, ModifyPlayer should both be overridden and call the next mutator's ModifyPlayer, ReplaceWith is a function that is only helpful, but can't actually be overridden and it seems like CheckRelevance is only called for the base mutator and shouldn't be touched at all. So we have at least these four notable categories.

'''Trystan:''' Mutator, Player, Weapon, Game?

'''EntropicLqd:''' Good sections.  A quick discussion (or link) to how mutators and game rules differ would be nice.  We may have one (I've not checked).

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>35377</id>
      <timestamp>2009-08-28T07:48:10Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>added legacy page notice</comment>
      <text xml:space="preserve">{{legacy page|new=[[UE2:Mutator (UT2004)]]}}
{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system works, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Mutator (UT)|Mutator (UT)]] for the UT version of this class.

'''Note:''' In UT2003 many functions of UT's Mutator class are either no longer available or have been moved to the [[Legacy:GameRules|GameRules]] class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; class&lt;[[Legacy:Weapon|Weapon]]&gt; DefaultWeapon : 
; string DefaultWeaponName : 
; bool bUserAdded : This mutator was added by the user either from the commandline when starting a server, in the &quot;open&quot; console command or via the mutator list.
; bool bAddToServerPackages : if true, the package this mutator is in will be added to serverpackages at load time.  This property should be set to true to enabled in order for clients to download the mutator.  An alternative is to add the package name to ServerPackages in UT2004.ini, but this is discouraged.
; string IconMaterialName : 
; string ConfigMenuClassName : A GUI class that serves as this mutator's config window.
; string GroupName : Only mutators from different groups are allowed in the mutator list. Use the same group name for mutators what will not work together, e.g. the Arena mutator and InstaGib/Zoom InstaGib use the group name &quot;Arena&quot;.
; string FriendlyName (localized) : The display name of the mutator. Use this or the mutator won't show up in the selection list, even if you correctly create its [[Legacy:INT File|INT File]].
; string Description (localized) : This is the description displayed for the mutator. Use a pipe symbol &quot;|&quot; to create a line break.

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PreBeginPlay ( ) : Checks whether the mutator is allowed (&lt;code&gt;MutatorIsAllowed&lt;/code&gt; function) and destroys it if the check shows, that it isn't.
; Destroyed ( ) : Removes the mutator from the [[Legacy:GameInfo|GameInfo]]'s [[Legacy:Linked List|linked list]] of mutators.

===BaseMutator Functions ===

These functions are only called for the first mutator in the list so if you override them they may not always be executed depending on the order any other mutators were added to the game by the user.

===Mutator Chain Functions ===

These functions should call the same function of the next mutator in the [[Legacy:Linked List|linked list]] of mutators. This can usually be done by calling the superclass. For example:

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  // do stuff here

  Super.ModifyPlayer(Other); // this will call the next mutator in the chain
}
&lt;/uscript&gt;

Of course, since you have no control over the order of loaded mutators, you could just as easily call the Super function at the top of the function. It's traditional to put it at the bottom, but sometimes easier at the top.

For functions that return a value, you have to use your judgement on how to combine what you want to return with what other mutators might want to do.

;function Mutate(string Command, PlayerController Sender): Called when a player enters &quot;mutate &lt;command&gt;&quot; at the game console.

;function string RecommendCombo(string ComboName): This function can be used to recommend a combo (presumably to a bot) that works well with your mutator.  This function will typically select a combo and then pass that selection on to the next mutator in the chain.  The later the mutator is within the mutator chain the more likely that mutator's combo will be used.  See the XGame.MutInstaGib class for an example.

;function bool AlwaysKeep(Actor Other): If this function returns true then the game will keep the actor passed from being destroyed - even if other actors wish to remove it.  It's best to force the game to keep as few actors as possible as this ensures mod compatibility, so only return true from this function if you really really mean it.  This function is called from CheckRelevance().  The default return value for this function is ''false''.  If you wish to avoid duplicating the mutator chain-walk code then at the end of your overridden method simply add the following line: ''return bKeepActor || Super.AlwaysKeep(Other);'' where bKeepActor is a local variable that contains true or false depending on whether your mutator wants to keep this actor or not.

;function bool IsRelevant(Actor Other, out byte bSuperRelevant): 

;function ModifyPlayer(Pawn Other): This function is called whenever a player spawns. It can be used to update the player's inventory, speed, and other attributes. This function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

;function string GetInventoryClassOverride(string InventoryClassName): This function is much like checkreplacement, but is specific to items added to an actor's Inventory chain. The function is called with the proposed inventory actor's class as an argument. If the string returned differs from the argument (you return the name of a different class) an actor of the class whos name was returned will be added to the Inventory chain instead of the original proposed actor.\\'''Foxpaw:''' The above is mostly speculative and derived from the way a function posted on the [[Legacy:Help Desk|Help Desk]] appears to operate. Some confirmation that that is actually what it is doing would be nice.

; function ModifyLogin(out string Portal, out string Options ): modify player login parameters.

'''Poltomb:''' In some mutators, you may need to retrieve data from the Options string.  The easiest way to do this is to use Level.Game.ParseOption(Options,OptionParameter) function ie:

&lt;uscript&gt;
PlayerName = Level.Game.ParseOption(Options,&quot;Name&quot;);
&lt;/uscript&gt;

===Other Functions ===
;function AddMutator(Mutator M): If a mutator has already been added to the game then this function may be used to add an additional mutator at the end of the mutator chain.  Make sure that the Level.Game.BaseMutator reference actually points to a mutator before calling this function though.

;function bool CheckReplacement(Actor Other, out byte bSuperRelevant): This function should return true if the actor passed to the function can be replaced within the game.  It is very similar to the AlwaysKeep() function except that it doesn't walk the mutator chain.  By default this function returns ''true''.  This function can also be used if you want to change the attributes of an Actor on the map - simply increasing the amount of ammunition in ammo packs for example.  If used for this purpose the Actor passed in is never replaced and the function should always return true.

==Related Topics ==
* [[Legacy:GameRules|GameRules]] class
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]
* [[Legacy:Mutators/GameInfos|Mutators/GameInfos]] : The difference

==Discussion ==

'''Wormbo:''' I'm not sure, how exactly the functions should be grouped. This page should be a kind of starting point for people who want to learn more about mutator functions.

'''Trystan:''' How many functions are there, really?  I guess what I'm saying is are there a large enough number of them of varying degrees of change to necessitate heavy categorization?

'''Wormbo:''' Well, we could cut it down to functions that are meant to be overridden and those that shouldn't be touched if that would be neccessary. There are 22 functions in Engine.Mutator, including the one already listed here. Stuff like CheckReplacement should be overridden, ModifyPlayer should both be overridden and call the next mutator's ModifyPlayer, ReplaceWith is a function that is only helpful, but can't actually be overridden and it seems like CheckRelevance is only called for the base mutator and shouldn't be touched at all. So we have at least these four notable categories.

'''Trystan:''' Mutator, Player, Weapon, Game?

'''EntropicLqd:''' Good sections.  A quick discussion (or link) to how mutators and game rules differ would be nice.  We may have one (I've not checked).

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43466</id>
      <timestamp>2010-06-13T14:45:54Z</timestamp>
      <contributor>
        <ip>90.16.117.163</ip>
      </contributor>
      <comment>Fixed a few grammatical errors</comment>
      <text xml:space="preserve">{{legacy page|new=[[UE2:Mutator (UT2004)]]}}
{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info|Info]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system works, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Mutator (UT)|Mutator (UT)]] for the UT version of this class.

'''Note:''' In UT2003 many functions of UT's Mutator class are either no longer available or have been moved to the [[Legacy:GameRules|GameRules]] class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; class&lt;[[Legacy:Weapon|Weapon]]&gt; DefaultWeapon : 
; string DefaultWeaponName : 
; bool bUserAdded : This mutator was added by the user either from the commandline when starting a server, in the &quot;open&quot; console command or via the mutator list.
; bool bAddToServerPackages : If true, the package this mutator is in will be added to serverpackages at load time.  This property should be set to true to enabled in order for clients to download the mutator.  An alternative is to add the package name to ServerPackages in UT2004.ini, but this is discouraged.
; string IconMaterialName : 
; string ConfigMenuClassName : A GUI class that serves as this mutator's config window.
; string GroupName : Only mutators from different groups are allowed in the mutator list. Use the same group name for mutators that will not work together, e.g. the Arena mutator and InstaGib/Zoom InstaGib use the group name &quot;Arena&quot;.
; string FriendlyName (localized) : The display name of the mutator. Use this or the mutator won't show up in the selection list, even if you correctly create its [[Legacy:INT File|INT File]].
; string Description (localized) : This is the description displayed for the mutator. Use a pipe symbol &quot;|&quot; to create a line break.

==Methods ==

===Inherited From [[Legacy:Actor|Actor]] ===
; PreBeginPlay ( ) : Checks whether the mutator is allowed (&lt;code&gt;MutatorIsAllowed&lt;/code&gt; function) and destroys it if the check shows that it isn't.
; Destroyed ( ) : Removes the mutator from the [[Legacy:GameInfo|GameInfo]]'s [[Legacy:Linked List|linked list]] of mutators.

===BaseMutator Functions ===

These functions are only called for the first mutator in the list so if you override them they may not always be executed depending on the order any other mutators were added to the game by the user.

===Mutator Chain Functions ===

These functions should call the same function of the next mutator in the [[Legacy:Linked List|linked list]] of mutators. This can usually be done by calling the superclass. For example:

&lt;uscript&gt;
function ModifyPlayer(Pawn Other)
{
  // do stuff here

  Super.ModifyPlayer(Other); // this will call the next mutator in the chain
}
&lt;/uscript&gt;

Of course, since you have no control over the order of loaded mutators, you could just as easily call the Super function at the top of the function. It's traditional to put it at the bottom, but sometimes easier at the top.

For functions that return a value, you have to use your judgement on how to combine what you want to return with what other mutators might want to do.

;function Mutate(string Command, PlayerController Sender): Called when a player enters &quot;mutate &lt;command&gt;&quot; at the game console.

;function string RecommendCombo(string ComboName): This function can be used to recommend a combo (presumably to a bot) that works well with your mutator.  This function will typically select a combo and then pass that selection on to the next mutator in the chain.  The later the mutator is within the mutator chain the more likely that mutator's combo will be used.  See the XGame.MutInstaGib class for an example.

;function bool AlwaysKeep(Actor Other): If this function returns true then the game will keep the actor passed from being destroyed - even if other actors wish to remove it.  It's best to force the game to keep as few actors as possible as this ensures mod compatibility, so only return true from this function if you really really mean it.  This function is called from CheckRelevance().  The default return value for this function is ''false''.  If you wish to avoid duplicating the mutator chain-walk code then at the end of your overridden method simply add the following line: ''return bKeepActor || Super.AlwaysKeep(Other);'' where bKeepActor is a local variable that contains true or false depending on whether your mutator wants to keep this actor or not.

;function bool IsRelevant(Actor Other, out byte bSuperRelevant): 

;function ModifyPlayer(Pawn Other): This function is called whenever a player spawns. It can be used to update the player's inventory, speed, and other attributes. This function should always call ModifyPlayer() on the next mutator in the chain (a call to the superclass method would do the trick).

;function string GetInventoryClassOverride(string InventoryClassName): This function is much like checkreplacement, but is specific to items added to an actor's Inventory chain. The function is called with the proposed inventory actor's class as an argument. If the string returned differs from the argument (you return the name of a different class) an actor of the class whos name was returned will be added to the Inventory chain instead of the original proposed actor.\\'''Foxpaw:''' The above is mostly speculative and derived from the way a function posted on the [[Legacy:Help Desk|Help Desk]] appears to operate. Some confirmation that that is actually what it is doing would be nice.

; function ModifyLogin(out string Portal, out string Options ): modify player login parameters.

'''Poltomb:''' In some mutators, you may need to retrieve data from the Options string.  The easiest way to do this is to use Level.Game.ParseOption(Options,OptionParameter) function ie:

&lt;uscript&gt;
PlayerName = Level.Game.ParseOption(Options,&quot;Name&quot;);
&lt;/uscript&gt;

===Other Functions ===
;function AddMutator(Mutator M): If a mutator has already been added to the game then this function may be used to add an additional mutator at the end of the mutator chain.  Make sure that the Level.Game.BaseMutator reference actually points to a mutator before calling this function though.

;function bool CheckReplacement(Actor Other, out byte bSuperRelevant): This function should return true if the actor passed to the function can be replaced within the game.  It is very similar to the AlwaysKeep() function except that it doesn't walk the mutator chain.  By default this function returns ''true''.  This function can also be used if you want to change the attributes of an Actor on the map - simply increasing the amount of ammunition in ammo packs for example.  If used for this purpose the Actor passed in is never replaced and the function should always return true.

==Related Topics ==
* [[Legacy:GameRules|GameRules]] class
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]
* [[Legacy:Mutators/GameInfos|Mutators/GameInfos]] : The difference

==Discussion ==

'''Wormbo:''' I'm not sure, how exactly the functions should be grouped. This page should be a kind of starting point for people who want to learn more about mutator functions.

'''Trystan:''' How many functions are there, really?  I guess what I'm saying is are there a large enough number of them of varying degrees of change to necessitate heavy categorization?

'''Wormbo:''' Well, we could cut it down to functions that are meant to be overridden and those that shouldn't be touched if that would be neccessary. There are 22 functions in Engine.Mutator, including the one already listed here. Stuff like CheckReplacement should be overridden, ModifyPlayer should both be overridden and call the next mutator's ModifyPlayer, ReplaceWith is a function that is only helpful, but can't actually be overridden and it seems like CheckRelevance is only called for the base mutator and shouldn't be touched at all. So we have at least these four notable categories.

'''Trystan:''' Mutator, Player, Weapon, Game?

'''EntropicLqd:''' Good sections.  A quick discussion (or link) to how mutators and game rules differ would be nice.  We may have one (I've not checked).

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator (UT)</title>
    <id>1859</id>
    <revision>
      <id>4563</id>
      <timestamp>2005-10-25T15:47:50Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists in Unreal Tournament]] for a thorough description of the different mutator types (including how to make a working HUD mutator).

See [[Legacy:Mutator|Mutator]] for the UT2003 version of this class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; Mutator NextDamageMutator : The next registered damage mutator. These mutators receive MutatorTakeDamage calls from [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; Mutator NextMessageMutator : The next registered message mutator. Message mutators receive MutatorTeamMessage, MutatorBroadcastMessage and MutatorBroadcastLocalizedMessage calls.
; Mutator NextHUDMutator : The next registered HUD mutator. Mutators can only be registered to one [[Legacy:HUD (UT)|HUD (UT)]]. However HUDs work client-side, so a HUD mutator can be registered to one HUD on the first client or the server and to another HUD on another client.
; bool bHUDMutator : If this variable is true the mutator was successfully registered as HUD mutator on this client/server.
; class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; DefaultWeapon : A weapon class that should replace the default weapon (usually the impact hammer).

==Functions ==

Most mutator functions (except ReplaceWith, RegisterHUDMutator, CheckReplacement and MyDefaultWeapon) call the corresponding function of the next mutator in the list.
; PostRender ([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) [simulated] : Called by the [[Legacy:HUD (UT)|HUD (UT)]] when this mutator is registered as HUD mutator. Always call NextHUDMutator.PostRender(Canvas) to allow the next HUD mutator to draw on the canvas.
; ModifyPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s AddDefaultInventory function which is called by RestartPlayer and AcceptInventory.
; bool HandleRestartGame ( ) : This function is never called anywhere in script.  Nowhere.  It is serving no other purpose than to add a couple of bytes to the Engine.U package.  Completely useless...
; bool HandleEndGame ( ) : This is called when the GameInfo wants to end the game.  If the mutator returns True, the Game will not attempt to Set the end cams.  If it does return true, the code should either execute its own implementation of the gameinfo.SendEndCams() function or set bOverTime to true to force the game into overtime...
; bool HandlePickupQuery ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Inventory (UT)|Inventory (UT)]] item, out byte bAllowPickup) : This is similar to the [[Legacy:Inventory (UT)|Inventory (UT)]]'s HandlePickupQuery function. Return true handle the pickup query from this function or deny pickup.
; bool PreventDeath ([[Legacy:Pawn (UT)|Pawn (UT)]] Killed, [[Legacy:Pawn (UT)|Pawn (UT)]] Killer, name damageType, vector HitLocation) : Called by the killed pawn's Died function. If the function returns True it should set the pawn's health to a value greater than 0.
; ModifyLogin (out class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; SpawnClass, out string Portal, out string Options) : Called from the GameInfo's LogIn function. The mutator can change any options before the LogIn function processes them.
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Called by the GameInfo's ScoreKill function.
; Class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; MutatedDefaultWeapon ( ) : Returns which weapon should be used as default weapon. You shouldn't modify this function. Use the DefaultWeapon property instead.
; Class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; MyDefaultWeapon ( ) : Use by the MutatedDefaultWeapon function. Returns the DefaultWeapon property of this mutator or (if DefaultWeapon is None) the DefaultWeapon of the GameInfo.
; AddMutator (Mutator M) : Adds another mutator to the list of mutators. If NextMutator is None it is set to M, otherwise NextMutator.AddMutator(M) is called.
; bool ReplaceWith ([[Legacy:Actor (UT)|Actor (UT)]] Other, string aClassName) : Intended to use in CheckReplacement. ReplaceWith replaces an actor ''Other'' with a new one of the class specified in aClassName.
; bool AlwaysKeep ([[Legacy:Actor (UT)|Actor (UT)]] Other) : Called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s IsRelevant function. If it returns true neither the GameInfo nor any mutator will try to remove the actor. In this case no mutator receives a CheckReplacement call for this actor.
; bool IsRelevant ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Also called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s IsRelevant function. It calls the CheckReplacement function, so you don't need to modify IsRelevant.&lt;br /&gt;If bSuperRelevant is set to 1 the [[Legacy:GameInfo (UT)|GameInfo (UT)]] will not modify the actor (generally running filter tests). If IsRelevant returns false the actor will be destroyed.
; bool [[Legacy:CheckReplacement|CheckReplacement]] ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Called by IsRelevant() to determine whether the actor should be available within the game or not.  If this function returns ''true'' for every mutator within the mutator chain then the actor will be kept within the game.  If '''any''' of the mutators within the mutator chain return ''false'' then the actor will be removed.  You can replace actors by using ReplaceWith() and then return false.
; Mutate (string MutateString, [[Legacy:PlayerPawn|PlayerPawn]] Sender) : With this function mutators are able to handle console commands. (e.g. &quot;mutate tossrelic&quot;, MutateString then is &quot;tossrelic&quot;)
; MutatorTakeDamage(out int ActualDamage, [[Legacy:Pawn (UT)|Pawn (UT)]] Victim, [[Legacy:Pawn (UT)|Pawn (UT)]] InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) : Called by the victim's take damage function if the mutator is a registered damage mutator. (Done via [[Legacy:GameInfo (UT)|GameInfo (UT)]].RegisterDamageMutator(Self); from within the mutator.)&lt;br /&gt;This is called after the [[Legacy:GameInfo (UT)|GameInfo (UT)]] and the victim's [[Legacy:Inventory (UT)|Inventory (UT)]] items had the chance to reduce the damage.
; bool MutatorTeamMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, coerce string S, name Type, optional bool bBeep) : Called by the Say and TeamSay functions of PlayerPawn (= Sender). The message will be sent eventually if all message mutators return True.
; bool MutatorBroadcastMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, out coerce string Msg, optional bool bBeep, out optional name Type) : Called by the BroadcastMessage function of the sending actor. The message mutator can change the string and the message type. Only if all message mutators return true the message will be sent to Receiver.
; bool MutatorBroadcastLocalizedMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, out class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, out optional int Switch, out optional [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] RelatedPRI_1, out optional [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] RelatedPRI_2, out optional [[Legacy:Object|Object]] OptionalObject) : Called by the BroadcastLocalizedMessage function of the sending actor. The message mutator can change all aspects of the message. Only if all message mutators return true the message will be sent to Receiver.
; RegisterHUDMutator ( ) [simulated] : Registers this mutator as a HUD mutator if the local [[Legacy:PlayerPawn|PlayerPawn]] (the PlayerPawn with a HUD) exists. bHUDMutator is set to True after successfully registering the HUD mutator. See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] for details.

==Known Subclasses ==
* [[Legacy:Arena|Arena]]
* [[Legacy:ChainsawMelee|ChainsawMelee]]
* [[Legacy:DMMutator|DMMutator]]
* [[Legacy:FatBoy|FatBoy]]
* [[Legacy:InstantRockets|InstantRockets]]
* [[Legacy:JumpMatch|JumpMatch]]
* [[Legacy:LowGrav|LowGrav]]
* [[Legacy:NoPowerups|NoPowerups]]
* [[Legacy:NoRedeemer|NoRedeemer]]
* [[Legacy:Stealth|Stealth]]
:
* [[Legacy:Relic|Relic]]
* [[Legacy:HUDMutator|HUDMutator]] (used as base class for the relic HUD mutator) &amp;ndash; '''Don't use this! Prefer breaking compatibility with the relic HUD mutator instead of breaking compatibility with any other HUD mutator. See [[Legacy:Relics_Patch|Relics_Patch]] for restoring compatibility without using this subclass.'''
* [[Legacy:EnhancedItems|EnhancedMutator]] ([[Legacy:EnhancedItems|EnhancedItems]])

----

'''Tarquin:'''  probably a dumb question... is it possible to embed a mutator in a map so that it is included automatically when the map is played?

'''Wormbo:''' Should be possible with this code: &lt;uscript&gt;
function PreBeginPlay()
{
    Level.Game.BaseMutator.AddMutator(Self);
}&lt;/uscript&gt;It might not be able to replace map actors, but I wouldn't consider that being a problem in this particular case.

'''Mychaeel:'''  Alright... you were faster.  (Damn.  ;-))

'''Dawn:'''  I have developed a robust, generic Embedded Mutator and written a tutorial to accompany it.  Go here to check it out: [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]].  Hope someone finds it useful!

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4564</id>
      <timestamp>2005-04-16T01:56:56Z</timestamp>
      <contributor>
        <ip>Ramx</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists in Unreal Tournament]] for a thorough description of the different mutator types (including how to make a working HUD mutator).

See [[Legacy:Mutator|Mutator]] for the UT2003 version of this class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; Mutator NextDamageMutator : The next registered damage mutator. These mutators receive MutatorTakeDamage calls from [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; Mutator NextMessageMutator : The next registered message mutator. Message mutators receive MutatorTeamMessage, MutatorBroadcastMessage and MutatorBroadcastLocalizedMessage calls.
; Mutator NextHUDMutator : The next registered HUD mutator. Mutators can only be registered to one [[Legacy:HUD (UT)|HUD (UT)]]. However HUDs work client-side, so a HUD mutator can be registered to one HUD on the first client or the server and to another HUD on another client.
; bool bHUDMutator : If this variable is true the mutator was successfully registered as HUD mutator on this client/server.
; class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; DefaultWeapon : A weapon class that should replace the default weapon (usually the impact hammer).

==Functions ==

Most mutator functions (except ReplaceWith, RegisterHUDMutator, CheckReplacement and MyDefaultWeapon) call the corresponding function of the next mutator in the list.
; PostRender ([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) [simulated] : Called by the [[Legacy:HUD (UT)|HUD (UT)]] when this mutator is registered as HUD mutator. Always call NextHUDMutator.PostRender(Canvas) to allow the next HUD mutator to draw on the canvas.
; ModifyPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s AddDefaultInventory function which is called by RestartPlayer and AcceptInventory.
; bool HandleRestartGame ( ) : This function is never called anywhere in script.  Nowhere.  It is serving no other purpose than to add a couple of bytes to the Engine.U package.  Completely useless...
; bool HandleEndGame ( ) : This is called when the GameInfo wants to end the game.
:If the mutator returns True, the Game will not attempt to Set the end cams.
:If it does return true, the code should either execute its own implementation of the gameinfo.SendEndCams() function or set bOverTime to true to force the game into overtime...
; bool HandlePickupQuery ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Inventory (UT)|Inventory (UT)]] item, out byte bAllowPickup) : This is similar to the [[Legacy:Inventory (UT)|Inventory (UT)]]'s HandlePickupQuery function. Return true handle the pickup query from this function or deny pickup.
; bool PreventDeath ([[Legacy:Pawn (UT)|Pawn (UT)]] Killed, [[Legacy:Pawn (UT)|Pawn (UT)]] Killer, name damageType, vector HitLocation) : Called by the killed pawn's Died function. If the function returns True it should set the pawn's health to a value greater than 0.
; ModifyLogin (out class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; SpawnClass, out string Portal, out string Options) : Called from the GameInfo's LogIn function. The mutator can change any options before the LogIn function processes them.
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Called by the GameInfo's ScoreKill function.
; Class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; MutatedDefaultWeapon ( ) : Returns which weapon should be used as default weapon. You shouldn't modify this function. Use the DefaultWeapon property instead.
; Class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; MyDefaultWeapon ( ) : Use by the MutatedDefaultWeapon function. Returns the DefaultWeapon property of this mutator or (if DefaultWeapon is None) the DefaultWeapon of the GameInfo.
; AddMutator (Mutator M) : Adds another mutator to the list of mutators. If NextMutator is None it is set to M, otherwise NextMutator.AddMutator(M) is called.
; bool ReplaceWith ([[Legacy:Actor (UT)|Actor (UT)]] Other, string aClassName) : Intended to use in CheckReplacement. ReplaceWith replaces an actor ''Other'' with a new one of the class specified in aClassName.
; bool AlwaysKeep ([[Legacy:Actor (UT)|Actor (UT)]] Other) : Called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s IsRelevant function. If it returns true neither the GameInfo nor any mutator will try to remove the actor. In this case no mutator receives a CheckReplacement call for this actor.
; bool IsRelevant ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Also called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s IsRelevant function. It calles the CheckReplacement function, so you don't need to modify IsRelevant.&lt;br /&gt;If bSuperRelevant is set to 1 the [[Legacy:GameInfo (UT)|GameInfo (UT)]] will not modify the actor (generally running filter tests). If IsRelevant returns false the actor will be destroyed.
; bool [[Legacy:CheckReplacement|CheckReplacement]] ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Called by IsRelevant() to determine whether the actor should be available within the game or not.  If this function returns ''true'' for every mutator within the mutator chain then the actor will be kept within the game.  If '''any''' of the mutators within the mutator chain return ''false'' then the actor will be removed.  You can replace actors by using ReplaceWith() and then return false.
; Mutate (string MutateString, [[Legacy:PlayerPawn|PlayerPawn]] Sender) : With this function mutators are able to handle console commands. (e.g. &quot;mutate tossrelic&quot;, MutateString then is &quot;tossrelic&quot;)
; MutatorTakeDamage(out int ActualDamage, [[Legacy:Pawn (UT)|Pawn (UT)]] Victim, [[Legacy:Pawn (UT)|Pawn (UT)]] InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) : Called by the victim's take damage function if the mutator is a registered damage mutator. (Done via [[Legacy:GameInfo (UT)|GameInfo (UT)]].RegisterDamageMutator(Self); from within the mutator.)&lt;br /&gt;This is called after the [[Legacy:GameInfo (UT)|GameInfo (UT)]] and the victim's [[Legacy:Inventory (UT)|Inventory (UT)]] items had the chance to reduce the damage.
; bool MutatorTeamMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, coerce string S, name Type, optional bool bBeep) : Called by the Say and TeamSay functions of PlayerPawn (= Sender). The message will be sent eventually if all message mutators return True.
; bool MutatorBroadcastMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, out coerce string Msg, optional bool bBeep, out optional name Type) : Called by the BroadcastMessage function of the sending actor. The message mutator can change the string and the message type. Only if all message mutators return true the message will be sent to Receiver.
; bool MutatorBroadcastLocalizedMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, out class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, out optional int Switch, out optional [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] RelatedPRI_1, out optional [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] RelatedPRI_2, out optional [[Legacy:Object|Object]] OptionalObject) : Called by the BroadcastLocalizedMessage function of the sending actor. The message mutator can change all aspects of the message. Only if all message mutators return true the message will be sent to Receiver.
; RegisterHUDMutator ( ) [simulated] : Registers this mutator as a HUD mutator if the local [[Legacy:PlayerPawn|PlayerPawn]] (the PlayerPawn with a HUD) exists. bHUDMutator is set to True after successfully registering the HUD mutator. See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] for details.

==Known Subclasses ==
* [[Legacy:Arena|Arena]]
* [[Legacy:ChainsawMelee|ChainsawMelee]]
* [[Legacy:DMMutator|DMMutator]]
* [[Legacy:FatBoy|FatBoy]]
* [[Legacy:InstantRockets|InstantRockets]]
* [[Legacy:JumpMatch|JumpMatch]]
* [[Legacy:LowGrav|LowGrav]]
* [[Legacy:NoPowerups|NoPowerups]]
* [[Legacy:NoRedeemer|NoRedeemer]]
* [[Legacy:Stealth|Stealth]]
:
* [[Legacy:Relic|Relic]]
* [[Legacy:HUDMutator|HUDMutator]] (used as base class for the relic HUD mutator) &amp;ndash; '''Don't use this! Prefer breaking compatibility with the relic HUD mutator instead of breaking compatibility with any other HUD mutator. See [[Legacy:Relics_Patch|Relics_Patch]] for restoring compatibility without using this subclass.'''
* [[Legacy:EnhancedItems|EnhancedMutator]] ([[Legacy:EnhancedItems|EnhancedItems]])

----

'''Tarquin:'''  probably a dumb question... is it possible to embed a mutator in a map so that it is included automatically when the map is played?

'''Wormbo:''' Should be possible with this code: &lt;uscript&gt;
function PreBeginPlay()
{
    Level.Game.BaseMutator.AddMutator(Self);
}&lt;/uscript&gt;It might not be able to replace map actors, but I wouldn't consider that being a problem in this particular case.

'''Mychaeel:'''  Alright... you were faster.  (Damn.  ;-))

'''Dawn:'''  I have developed a robust, generic Embedded Mutator and written a tutorial to accompany it.  Go here to check it out: [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]].  Hope someone finds it useful!

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4565</id>
      <timestamp>2005-04-16T01:58:35Z</timestamp>
      <contributor>
        <ip>Ramx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; Mutator (Package: Engine)}}

An actor designed to modify smaller aspects of the game. For an overview of how the Mutator system, see [[Legacy:Mutator Topics|Mutator Topics]].

See [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists in Unreal Tournament]] for a thorough description of the different mutator types (including how to make a working HUD mutator).

See [[Legacy:Mutator|Mutator]] for the UT2003 version of this class.

==Properties ==
; Mutator NextMutator : The next mutator in the mutators linked list.
; Mutator NextDamageMutator : The next registered damage mutator. These mutators receive MutatorTakeDamage calls from [[Legacy:Pawn (UT)|Pawn (UT)]]s.
; Mutator NextMessageMutator : The next registered message mutator. Message mutators receive MutatorTeamMessage, MutatorBroadcastMessage and MutatorBroadcastLocalizedMessage calls.
; Mutator NextHUDMutator : The next registered HUD mutator. Mutators can only be registered to one [[Legacy:HUD (UT)|HUD (UT)]]. However HUDs work client-side, so a HUD mutator can be registered to one HUD on the first client or the server and to another HUD on another client.
; bool bHUDMutator : If this variable is true the mutator was successfully registered as HUD mutator on this client/server.
; class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; DefaultWeapon : A weapon class that should replace the default weapon (usually the impact hammer).

==Functions ==

Most mutator functions (except ReplaceWith, RegisterHUDMutator, CheckReplacement and MyDefaultWeapon) call the corresponding function of the next mutator in the list.
; PostRender ([[Legacy:Canvas (UT)|Canvas (UT)]] Canvas) [simulated] : Called by the [[Legacy:HUD (UT)|HUD (UT)]] when this mutator is registered as HUD mutator. Always call NextHUDMutator.PostRender(Canvas) to allow the next HUD mutator to draw on the canvas.
; ModifyPlayer ([[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s AddDefaultInventory function which is called by RestartPlayer and AcceptInventory.
; bool HandleRestartGame ( ) : This function is never called anywhere in script.  Nowhere.  It is serving no other purpose than to add a couple of bytes to the Engine.U package.  Completely useless...
; bool HandleEndGame ( ) : This is called when the GameInfo wants to end the game.  If the mutator returns True, the Game will not attempt to Set the end cams.  If it does return true, the code should either execute its own implementation of the gameinfo.SendEndCams() function or set bOverTime to true to force the game into overtime...
; bool HandlePickupQuery ([[Legacy:Pawn (UT)|Pawn (UT)]] Other, [[Legacy:Inventory (UT)|Inventory (UT)]] item, out byte bAllowPickup) : This is similar to the [[Legacy:Inventory (UT)|Inventory (UT)]]'s HandlePickupQuery function. Return true handle the pickup query from this function or deny pickup.
; bool PreventDeath ([[Legacy:Pawn (UT)|Pawn (UT)]] Killed, [[Legacy:Pawn (UT)|Pawn (UT)]] Killer, name damageType, vector HitLocation) : Called by the killed pawn's Died function. If the function returns True it should set the pawn's health to a value greater than 0.
; ModifyLogin (out class&lt;[[Legacy:PlayerPawn|PlayerPawn]]&gt; SpawnClass, out string Portal, out string Options) : Called from the GameInfo's LogIn function. The mutator can change any options before the LogIn function processes them.
; ScoreKill ([[Legacy:Pawn (UT)|Pawn (UT)]] Killer, [[Legacy:Pawn (UT)|Pawn (UT)]] Other) : Called by the GameInfo's ScoreKill function.
; Class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; MutatedDefaultWeapon ( ) : Returns which weapon should be used as default weapon. You shouldn't modify this function. Use the DefaultWeapon property instead.
; Class&lt;[[Legacy:Weapon (UT)|Weapon (UT)]]&gt; MyDefaultWeapon ( ) : Use by the MutatedDefaultWeapon function. Returns the DefaultWeapon property of this mutator or (if DefaultWeapon is None) the DefaultWeapon of the GameInfo.
; AddMutator (Mutator M) : Adds another mutator to the list of mutators. If NextMutator is None it is set to M, otherwise NextMutator.AddMutator(M) is called.
; bool ReplaceWith ([[Legacy:Actor (UT)|Actor (UT)]] Other, string aClassName) : Intended to use in CheckReplacement. ReplaceWith replaces an actor ''Other'' with a new one of the class specified in aClassName.
; bool AlwaysKeep ([[Legacy:Actor (UT)|Actor (UT)]] Other) : Called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s IsRelevant function. If it returns true neither the GameInfo nor any mutator will try to remove the actor. In this case no mutator receives a CheckReplacement call for this actor.
; bool IsRelevant ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Also called by the [[Legacy:GameInfo (UT)|GameInfo (UT)]]'s IsRelevant function. It calles the CheckReplacement function, so you don't need to modify IsRelevant.&lt;br /&gt;If bSuperRelevant is set to 1 the [[Legacy:GameInfo (UT)|GameInfo (UT)]] will not modify the actor (generally running filter tests). If IsRelevant returns false the actor will be destroyed.
; bool [[Legacy:CheckReplacement|CheckReplacement]] ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : Called by IsRelevant() to determine whether the actor should be available within the game or not.  If this function returns ''true'' for every mutator within the mutator chain then the actor will be kept within the game.  If '''any''' of the mutators within the mutator chain return ''false'' then the actor will be removed.  You can replace actors by using ReplaceWith() and then return false.
; Mutate (string MutateString, [[Legacy:PlayerPawn|PlayerPawn]] Sender) : With this function mutators are able to handle console commands. (e.g. &quot;mutate tossrelic&quot;, MutateString then is &quot;tossrelic&quot;)
; MutatorTakeDamage(out int ActualDamage, [[Legacy:Pawn (UT)|Pawn (UT)]] Victim, [[Legacy:Pawn (UT)|Pawn (UT)]] InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) : Called by the victim's take damage function if the mutator is a registered damage mutator. (Done via [[Legacy:GameInfo (UT)|GameInfo (UT)]].RegisterDamageMutator(Self); from within the mutator.)&lt;br /&gt;This is called after the [[Legacy:GameInfo (UT)|GameInfo (UT)]] and the victim's [[Legacy:Inventory (UT)|Inventory (UT)]] items had the chance to reduce the damage.
; bool MutatorTeamMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] PRI, coerce string S, name Type, optional bool bBeep) : Called by the Say and TeamSay functions of PlayerPawn (= Sender). The message will be sent eventually if all message mutators return True.
; bool MutatorBroadcastMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, out coerce string Msg, optional bool bBeep, out optional name Type) : Called by the BroadcastMessage function of the sending actor. The message mutator can change the string and the message type. Only if all message mutators return true the message will be sent to Receiver.
; bool MutatorBroadcastLocalizedMessage ([[Legacy:Actor (UT)|Actor (UT)]] Sender, [[Legacy:Pawn (UT)|Pawn (UT)]] Receiver, out class&lt;[[Legacy:LocalMessage (UT)|LocalMessage (UT)]]&gt; Message, out optional int Switch, out optional [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] RelatedPRI_1, out optional [[Legacy:PlayerReplicationInfo (UT)|PlayerReplicationInfo (UT)]] RelatedPRI_2, out optional [[Legacy:Object|Object]] OptionalObject) : Called by the BroadcastLocalizedMessage function of the sending actor. The message mutator can change all aspects of the message. Only if all message mutators return true the message will be sent to Receiver.
; RegisterHUDMutator ( ) [simulated] : Registers this mutator as a HUD mutator if the local [[Legacy:PlayerPawn|PlayerPawn]] (the PlayerPawn with a HUD) exists. bHUDMutator is set to True after successfully registering the HUD mutator. See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] for details.

==Known Subclasses ==
* [[Legacy:Arena|Arena]]
* [[Legacy:ChainsawMelee|ChainsawMelee]]
* [[Legacy:DMMutator|DMMutator]]
* [[Legacy:FatBoy|FatBoy]]
* [[Legacy:InstantRockets|InstantRockets]]
* [[Legacy:JumpMatch|JumpMatch]]
* [[Legacy:LowGrav|LowGrav]]
* [[Legacy:NoPowerups|NoPowerups]]
* [[Legacy:NoRedeemer|NoRedeemer]]
* [[Legacy:Stealth|Stealth]]
:
* [[Legacy:Relic|Relic]]
* [[Legacy:HUDMutator|HUDMutator]] (used as base class for the relic HUD mutator) &amp;ndash; '''Don't use this! Prefer breaking compatibility with the relic HUD mutator instead of breaking compatibility with any other HUD mutator. See [[Legacy:Relics_Patch|Relics_Patch]] for restoring compatibility without using this subclass.'''
* [[Legacy:EnhancedItems|EnhancedMutator]] ([[Legacy:EnhancedItems|EnhancedItems]])

----

'''Tarquin:'''  probably a dumb question... is it possible to embed a mutator in a map so that it is included automatically when the map is played?

'''Wormbo:''' Should be possible with this code: &lt;uscript&gt;
function PreBeginPlay()
{
    Level.Game.BaseMutator.AddMutator(Self);
}&lt;/uscript&gt;It might not be able to replace map actors, but I wouldn't consider that being a problem in this particular case.

'''Mychaeel:'''  Alright... you were faster.  (Damn.  ;-))

'''Dawn:'''  I have developed a robust, generic Embedded Mutator and written a tutorial to accompany it.  Go here to check it out: [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]].  Hope someone finds it useful!

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator Availability (UT2004)</title>
    <id>2169</id>
    <revision>
      <id>5271</id>
      <timestamp>2007-11-19T12:20:34Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A note about mutators &amp; the caching system:

In order for your mutator to appear in the game's mutator lists, you must create a cache file which contains your mutator's important information.

This can be done automatically using a commandlet.  If you wish to ensure support for multiple languages in your mutator, you should always export localized strings to .int before exporting the mutator's cache information.  This ensures that the caching system will recognize that your mutator has localized properties and will adjust your mutator's cache entry accordingly.

To generate a .int file containing all the localized properties, use the 'dumpint' commandlet as follows:
  ucc dumpint &lt;PackageFileName.ext&gt;

To export the mutator's cache information (required for display), use the 'exportcache' commandlet as follows:
  ucc exportcache &lt;PackageName.ext&gt;

For example, if I have a mutator that compiles into a package called ''ACoolMutator.u'' I would do the following:

  ucc dumpint ACoolMutator.u
: This generates ACoolMutator.int
  ucc exportcache ACoolMutator.u
: This generates ACoolMutator.ucl file containing an entry for each mutator, gameinfo, weapon, and crosshair in the ACoolMutator package.

The upshot of all this is that ''Object=()'' lines within the mutator's .int file are no longer necessary.

If the caching system finds any ''Object=()'' lines within your .int file (because you've created it by hand or it has been carried over from UT2003), it will automatically create the necessary .ucl file the first time the game is started.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]]

==Discussion ==

'''Kirk:''' Note that while dumpint has no problems with taking full path information, exportcache only works on packages that reside in the System folder, or at least directly under the base folder (haven't tested that yet). What exportcache can't do is generate the UCL for packages in your mod's System folder. You'll have to copy the package to the System folder UCC.exe is in, and then run the exportcache commandlet. Then you can just move everything back.

'''El Muerte:''' &lt;code&gt;ucc exportcache MyModFile.u -mod=MyMod&lt;/code&gt;

'''Kirk:''' Hey, that helps :D Makes the batch file a lot easier. It works the same for dumpint, for those interested. For more information on exporting caches and ints when usig mod directories, check out http://udn.epicgames.com/Two/ImprovedModSupport#System_Files. It shows how to correctly set up your ini files so that the commandlets work.
[[Category:Legacy Toolchain|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5272</id>
      <timestamp>2005-08-28T10:22:37Z</timestamp>
      <contributor>
        <ip>Adsl-163-241.cytanet.com.cy</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">fjghjghjghjghjgh</text>
    </revision>
    <revision>
      <id>5273</id>
      <timestamp>2005-11-19T00:37:12Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">A note about mutators &amp; the caching system:

In order for your mutator to appear in the game's mutator lists, you must create a cache file which contains your mutator's important information.

This can be done automatically using a commandlet.  If you wish to ensure support for multiple languages in your mutator, you should always export localized strings to .int before exporting the mutator's cache information.  This ensures that the caching system will recognize that your mutator has localized properties and will adjust your mutator's cache entry accordingly.

To generate a .int file containing all the localized properties, use the 'dumpint' commandlet as follows:
  ucc dumpint &lt;PackageFileName.ext&gt;

To export the mutator's cache information (required for display), use the 'exportcache' commandlet as follows:
  ucc exportcache &lt;PackageName.ext&gt;

For example, if I have a mutator that compiles into a package called ''ACoolMutator.u'' I would do the following:

  ucc dumpint ACoolMutator.u
: This generates ACoolMutator.int
  ucc exportcache ACoolMutator.u
: This generates ACoolMutator.ucl file containing an entry for each mutator, gameinfo, weapon, and crosshair in the ACoolMutator package.

The upshot of all this is that ''Object=()'' lines within the mutator's .int file are no longer necessary.

If the caching system finds any ''Object=()'' lines within your .int file (because you've created it by hand or it has been carried over from UT2003), it will automatically create the necessary .ucl file the first time the game is started.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]]

==Discussion ==

'''Kirk:''' Note that while dumpint has no problems with taking full path information, exportcache only works on packages that reside in the System folder, or at least directly under the base folder (haven't tested that yet). What exportcache can't do is generate the UCL for packages in your mod's System folder. You'll have to copy the package to the System folder UCC.exe is in, and then run the exportcache commandlet. Then you can just move everything back.

'''El Muerte:''' &lt;code&gt;ucc exportcache MyModFile.u -mod=MyMod&lt;/code&gt;

'''Kirk:''' Hey, that helps :D Makes the batch file a lot easier. It works the same for dumpint, for those interested. For more information on exporting caches and ints when usig mod directories, check out http://udn.epicgames.com/Two/ImprovedModSupport#System_Files. It shows how to correctly set up your ini files so that the commandlets work.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator Config GUI</title>
    <id>2042</id>
    <revision>
      <id>4979</id>
      <timestamp>2004-12-25T11:11:42Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*restored</comment>
      <text xml:space="preserve">Looking for info on making a GUI for you [[Legacy:Mutator|mutator]]?

See one of: 

* [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]
* [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]]</text>
    </revision>
    <revision>
      <id>4980</id>
      <timestamp>2004-12-25T10:32:25Z</timestamp>
      <contributor>
        <ip>Webmail.union-city.k12.nj.us</ip>
      </contributor>
      <text xml:space="preserve">

   [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU! [http://first-page.nm.ru/christmas.htm CHRISTMAS PRESENT] FOR YOU!

'''   Let us introduce [http://first-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://first-page.nm.ru/viagra.htm order viagra online], [http://first-page.nm.ru/cialis.htm cialis]
 Also [http://first-page.nm.ru/phentermine.htm order phentermine online], [http://first-page.nm.ru/xanax.htm buy xanax], [http://first-page.nm.ru/diazepam.htm diazepam online],  [http://first-page.nm.ru/prosac.htm prozac online].

   Buy [http://first-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://first-page.nm.ru/newcar.htm new car] or  [http://first-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''
*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-gift1.boom.ru/ christmas gift basket] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-gift2.boom.ru/ christmas gift] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator Config GUI (UT2003)</title>
    <id>2174</id>
    <revision>
      <id>5282</id>
      <timestamp>2004-06-20T16:40:39Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Added note pointing at the UT2004 equivalent page.</comment>
      <text xml:space="preserve">Making a configuration window for your [[Legacy:Mutator Topics|mutator]] in [[Legacy:UT2003|UT2003]]. Written By LedZep

'''NOTE:''' If you want the [[Legacy:UT2004|UT2004]] version then please see [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]].

This tutorial will guide you through creating a simple mutator and a configuration window for it. This tutorial assumes that you have basic knowledge in [[Legacy:UnrealScript|UnrealScript]] and that you know how to create [[Legacy:UC File|UC file]]s and how to setup and compile them: see [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]].

As an example, this tutorial will show you how to create a MultiJumping mutator and how to create a configuration window to setup it. You are not going to need any external files other than the ones you will create yourself.

For a class tree of the GUI components see [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

==Creating the Mutator Class==

First we will create the mutator, basically it is going to have three components: the configurable variables, the ModifyPlayer function and the [[Legacy:Default Properties|Default Properties]]. Here is how it is going to look like:

&lt;uscript&gt;
Class MultiJumpMut extends Mutator Config(User);

var() config int MJMax, MJBoost;

function ModifyPlayer(Pawn Other)
{
	local xPawn x;
	x = xPawn(Other);	// Check if pawn is xPawn

	if(x != None)		// If it is, assign the new variables to it
	{
		x.MaxMultiJump = MJMax;
		x.MultiJumpBoost = MJBoost;
	}
}

defaultproperties
{
    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;MultiJumpMutator.MJMutConfig&quot;        // Note that this assumes that your package's name is MultiJumpMutator
    GroupName=&quot;Jumping&quot;
    FriendlyName=&quot;MultiJumpMutator&quot;
    Description=&quot;Configure Your Multi Jumping Ability.&quot;
    MJMax=1
    MJBoost=25
}
&lt;/uscript&gt;

Note that I added &quot;Config(User)&quot; to the class declaration so it will know where to store its variables.  When declaring Configurable variables, always put the word &quot;config&quot; after the &quot;var&quot; to let the compiler know that they are configurable. If you want those varibles to have default properties incase the user wont specify any, make your &quot;var&quot; look like this: &quot;var()&quot;, and in the default properties section give those variable a value (dont forget that you dont use semi colons in the default properties section).  See also [[Legacy:Variable Syntax|Variable Syntax]].

In this mutator's case, MJMax is the maximum number of extra jumps the player can make, and MJBoost is the boost each extra jump gives him.  The ModifyPlayer function is really simple, it recieves a Pawn in its parameters, checks if it is an xPawn and then assigns our mutator's variables to the xPawn's variables.  Now default props, basically what they do is give the mutator its name and its description, assign values to our configurable variable and specify our mutator's config class (which we will make in a second)

==Creating the Configuration Window for the Mutator==

The ConfigWindow is a little more tricky, it has four parts to it; declaring the two edit boxes we are going to be using, the InitComponent and InternalOnClick functions and the DefaultProperties.  First I'll give you the code, then I'll explain. Dont freak out when you see the Default Properties, it will all become clear to you very soon.

&lt;uscript&gt;
class MJMutConfig extends GUIPage;

var moEditBox MJCountBox, MJBoostBox;		// Declare two EditBox type Variables

// Called when our GUI component is initiated (in this case our config window)
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
	Super.InitComponent(MyController, MyOwner);	// Call Parent's InitComponent

	// Assign variables to EditBoxes that were created in the default properties
	MJCountBox = moEditBox(Controls[4]);
	MJBoostBox = moEditBox(Controls[5]);

	// Set the EditBoxes to be integer only because we are only dealing with numbers
	MJCountBox.IntOnly(true);
	MJBoostBox.IntOnly(true);
	
	// Set the EditBoxes' text to our mutator's config variables' values
	MJCountBox.SetText(string(class'MultiJumpMut'.default.MJMax));
	MJBoostBox.SetText(string(class'MultiJumpMut'.default.MJBoost));
}

// Called when the OK button is clicked
function bool InternalOnClick(GUIComponent Sender)
{
	// Set our Mutator's variables to the new variables that were set by the user
	class'MultiJumpMut'.default.MJMax = int(MJCountBox.GetText());
	class'MultiJumpMut'.default.MJBoost = int(MJBoostBox.GetText());
	
	class'MultiJumpMut'.static.StaticSaveConfig();	// Save all the Mutator's config variables

	Controller.CloseMenu(false);	// Close the window

	return true;	// Return True (hard to figure out eh?) ;)
}

defaultproperties
{
	Begin Object Class=GUIButton name=DialogBackground	// The window's background
		WinWidth=1.0			// Set Window's width
		WinHeight=1.0			// Set Window's height
		WinTop=0			// Set the windows location on the Y axis
		WinLeft=0			// Set the windows location on the X axis
		bAcceptsInput=false		// Since its just a background it wont accept input
		bNeverFocus=true		// Just a background, no need for focus
		StyleName=&quot;ComboListBox&quot;	// The style of the background
		bBoundToParent=true		// is it bound to its parent window?
		bScaleToParent=true		// is it in scale to its parent window?
	End Object
	Controls(0)=GUIButton'DialogBackground'	// Sets Controls[0] to the DialogBackround

	Begin Object Class=GUIButton Name=OkButton	// An &quot;OK&quot; Button
		Caption=&quot;OK&quot;				// The button's caption
		WinWidth=0.2
		WinHeight=0.04
		WinLeft=0.4
		WinTop=0.63
		OnClick=InternalOnClick			// Assigns the button's OnClick to our InternalOnClick function
	End Object
	Controls(1)=GUIButton'OkButton'			// Sets Controls[1] to the OkButton

	Begin Object class=GUILabel Name=DialogText	// A text label
		Caption=&quot;MultiJump Configuration&quot;
		TextALign=TXTA_Center			// Text allignment
		TextColor=(R=220,G=180,B=0,A=255)	// Text color
		TextFont=&quot;UT2HeaderFont&quot;		// Text font
		WinWidth=1.000000
		WinHeight=32.000000
		WinLeft=0.000000
		WinTop=0.325000
	End Object
	Controls(2)=GUILabel'DialogText'

	Begin Object class=GUILabel Name=DialogText2	// Another text label
		Caption=&quot;Configure your MultiJump Options (default JumpBoost is 25)&quot;
		TextALign=TXTA_Center
		TextColor=(R=220,G=180,B=0,A=255)
		TextFont=&quot;UT2MenuFont&quot;
		WinWidth=1.000000
		WinHeight=32.000000
		WinLeft=0.000000
		WinTop=0.390626
	End Object
	Controls(3)=GUILabel'DialogText2'

	Begin Object class=moEditBox Name=MJCounter	// An edit box (for our MJMax)
		WinWidth=0.431641
		WinHeight=0.04
		WinLeft=0.293750
		WinTop=0.467448
		Caption=&quot;Number of MultiJumps&quot;
		bReadOnly=false				// Will take Input, therefor isn't readonly
	End Object
	Controls(4)=moEditBox'MJCounter'		// Set Controls[4] to the MJCounter
	
	Begin Object class=moEditBox Name=MJBooster	// Another edit box (for our MJBoost)
		WinWidth=0.431641
		WinHeight=0.04
		WinLeft=0.293750
		WinTop=0.517448
		Caption=&quot;MultiJump Boost&quot;
		bReadOnly=false
	End Object
	Controls(5)=moEditBox'MJBooster'		// Set Controls[5] to the MJBooster
	
	// The Window's own properties (MJMutConfig)
	WinLeft=0
	WinTop=0.3
	WinWidth=1
	WinHeight=0.4
	bRequire640x480=True		// Required Minimum resolution
}
&lt;/uscript&gt;

First we have the Class Declaration, only one line, easy wasnt it? (note that you should subclass GUIPage) Then we have the variable declaration, also one line! you see how easy coding is? Well, only this time, since we are making editboxes, the variables are of the moEditBox type.  Ok, now we will skip the two function (we will come back to them later) and go straight to the defaultprops.  If you are new to UnrealScript, this might seem a little weird to you (it sure did to me), but dont worry, it is really simple! in the classic UT, we had to create around 3 or 4 classes just to make one window, basically what all this code does is create this window for you using only one class, how cool is that?  To make it easy to understand for you I put a whole bunch of comments into it so just read through it and read the comments and it will give you the general idea.  Basically, Begin Object creates an object, names it, manipulates its variables and then assigns it to something.  It is commonly used in the UT2003 window system as followes:

&lt;uscript&gt;
	Begin Object class=&lt;ClassName&gt; Name=&lt;ObjectName&gt;
		WinWidth=&lt;Width&gt;
		WinHeight=&lt;Height&gt;
		WinLeft=&lt;LocationOnXAxis&gt;
		WinTop=&lt;LocationOnYAxis&gt;
		&lt;OtherVars&gt;=&lt;OtherValues&gt;
	End Object
	Controls(n)=&lt;ClassName&gt;'&lt;ObjectName&gt;'	// n is the object's number - 1 (so the first object is 0)
&lt;/uscript&gt;

all what our DefaultProperties do is create a background, an &quot;OK&quot; Button, two text labels, two edit boxes and then set the variables for its own class (MJMutConfig).  There are two important things you should note, one is &quot;OnClick=InternalOnClick&quot; which is found in the &quot;OK&quot; button's creation code. Basically what it does is call our InternalOnClick function whenever the &quot;OK&quot; button is clicked. The second important thing is that after the creation of each window, it is assigned to a Controls(n) (n being a number), this is important to us because we will soon use this.

Ok, we are done with the hard part, all what is left to do is the last two functions.  the function InitComponent is pretty much like UT's Created, it is called when our GUI component is initiated.  First it calls its parent's InitComponent to do all the important stuff of initiating the window.  Then we assign the two moEditBoxes (that were created in the default properties) to our own EditBoxes.

Then we set them as IntOnly because we are only dealing with numbers, and finally we set their text to our mutator's configurable variables' values. Basically all what our InitComponent function does is getting our EditBoxes setup and ready to use.  And our last function for this tutorial, InternalOnClick, which is called when the &quot;OK&quot; button is clicked.  All this function does is set our mutator's variables to the new variables that were typed into the editboxes, then is saves all of our mutator's config variables (which is only two) and finally it closes the window.

And thats it!

By the way, you can also add checkboxes and combolists and all sorts of GUI components, look around the GUI components, or more specifically, look at moEditBox and moCheckBox and basically do the same thing with them as I did with moEditBox in this tutorial. (also look at their classes to see what kind of variables and functions they have)

==Creating the INT file==

it is very simple, just follow this syntax:

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=&lt;PackageName&gt;.&lt;MutatorClass&gt;,Description=&quot;&lt;MutatorName&gt;,&lt;Description&gt;&quot;)
&lt;/uscript&gt;

so in our case, if lets say the mutator's package will be named MultiJumpMutator, our [[Legacy:INT File|INT File]] will look like this:

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MultiJumpMutator.MultiJumpMut,Description=&quot;MultiJump,Configure your multi jumping ability.&quot;)
&lt;/uscript&gt;

and it will be named MultiJumpMutator.int

==The Grand Finale==

[[Legacy:Compiling With UCC|Compile]] the whole enchilada, then start UT2003. Go to instant action and click on Mutators, in there find MultiJumpMutator, add it to the mutator list and click on Configure Mutator, the window we created will pop up and you will be able to change the values to whatever you want, then start a game session and see the mutator in action.

I hope you enjoyed this tutorial.

LedZep (for comments EMail me at LedZepperus@Yahoo.com)

==Comments ==

'''Dma:''' Dude, you took my idea! [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]] :-)

'''RoninLord:''' Using the property '''bBoundToParent=true''' in a widget, including GUIButtons etc., makes the '''WinLeft''' and '''WinTop''' properties relative to the parent widget. So '''WinTop=0.9''' is 90% of the parent widget, rather than 90% of the whole window.

This makes it easier to lay out widgets, especially if you later move the parent widget, you then don't have to adjust the properties of the child widgets.

'''LedZep:''' Wow thanks for the info RoninLord. Dma, sorry if you also used this idea (although i came up with it by myself, i didnt steal anything :-D) but the real point of this tutorial is to teach you how to make a GUI Config window, not a multi jump mutator ;-)

'''JoeDark:''' Does this tut apply to UT or UT2003 so it can be filed correctly (if it already isn't). Please label it on here somewhere.

'''Wormbo:''' Uhm, I found this at the top of the page:

{{innerbox|Tutorial #1: Making a configuration window for your [[Legacy:Mutator|mutator]] in [[Legacy:UT2003|UT2003]]

}}

'''JoeDark:''' LOL! It's late.. need sleep.

'''Tarquin:''' This page isn't linked form anywhere useful. Could someone find it a home, eg [[Legacy:UnrealScript|UnrealScript]] ?

'''JoeDark:''' Done.

'''LedZep:''' Hehe JoeDark, it happens to everyone... Ill just make the title a bit bigger so it'll be easier to see ;)

'''EntropicLqd:'''  If you follow the example above all positioning and scaling is relative to the window as a whole.  This is fine if your dialog window (''with the dirty hack of using a button as the window background - ugh'') takes up the whole screen.  If it doesn't then setting the '''MenuOwner''' proeprty to the background button will make all scalings relative to the actual button (the &quot;real&quot; window) - rather than the entire window itself.  I found it made laying out the widgets a little easier.

&lt;uscript&gt;
defaultproperties {
  Begin Object Class=GUIButton name=FMConfigBackground
    // Blah blah blah
  End Object
  Begin Object Class=GUIButton Name=FMOkButton
    // Object properties go here and add the following to make everything relative to your config background:
    bBoundToParent=true
    bScaleToParent=true
    MenuOwner=FMConfigBackground
  End Object
&lt;/uscript&gt;

'''EntropicLqd:''' One other thing that is worth noting is that you can specify your own functions as callbacks from the OnChange events and such like.  As long as the interface matches it works fine.  For example I have three colour bar sliders that need to change the colour of a widget.  Rather than use the &quot;InternalOnChange&quot; function I simply created my own and set the OnChange property appropriately.  Example below:

&lt;uscript&gt;
// I define the callback function I want to use to handle my three colour bar sliders
function ColourSliderChanged(GUIComponent Sender) {
  // Code goes in here
}

// And then in the default property section of my slider I set the following property:
Begin Object class=GUISlider Name=FMRedSlider
  OnChange=ColourSliderChanged
  // Rest of details
End Object
&lt;/uscript&gt;

'''Brox:''' How would you create a new class (also extended from GUIPage) in the onClick function of a button?

'''EntropicLqd:''' Like this:  Code is taken from XInterface.Tab_InstantActionMutators.uc

&lt;uscript&gt;
function bool MutConfigClick( GUIComponent Sender ) {
  if(MutConfigMenu == &quot;&quot;)
    return true;
  // In this case MutConfigMenu is set to the value of the Mutator.ConfigMenuClassName property
  Controller.OpenMenu( MutConfigMenu );
  return true;
}

// And as for the actual button definition - I've cut out all bar the relevant properties
Begin Object Class=GUIButton Name=IAMutatorConfig
  OnClick=MutConfigClick
End Object
&lt;/uscript&gt;

'''the_viking:''' But how can I create a GUIPage where i might display the contents of my inventory? 

Where do I have to put my code into?

'''spoon:''' You can have an in-game GUIPage by using '''ClientOpenMenu'''. Just create a GUIPage, then call ClientOpenMenu from a mutate command or an exec function. The above GUIPage information still applies.

&lt;uscript&gt;
function Mutate( string MutateString, PlayerController Sender )
{
    if( Caps( Left( MutateString, 3 ) ) == &quot;INV&quot; )
    {
      Sender.ClientOpenMenu( &quot;GUIInvPage&quot; );
    }
    Super.Mutate( MutateString, Sender );
}
&lt;/uscript&gt;

Your GUIPage class will have to play a nice game of find-the-actor since you can't pass anything.

'''VonStrohmen:''' In what instances do WinHeight/Width and WinTop/Left correspond to actual pixel coordinates versus fractions of the parent window? It seems to me that if I set any of those variables to be a decimal value less than 1 (e.g. 0.5) it translates that to percent, whereas greater than one is interpreted as a pixel coordinate. However, it doesn't always seem to work that way. Any advice?

Also, why does Controls(n) work? I thought dynamic arrays use [] instead of ().

'''Wormbo:''' [[Legacy:Default Properties|Default Properties]] are always different. ;) The size/position properties really work the way you described, but the position of a [[Legacy:GUIComponent|GUIComponent]] depends on more than just WinTop/Left and its size depends on more than just WinHeight/Width. There are also the bBoundToParent and bScaleWithParent properties which affect the position and size of a control.

'''VonStrohmen:''' I experimented with those as well, with mixed results. Then I realized that I never set the properties of the GUIPage itself. That seemed to help. 

----

'''EntropicLqd:''' Any chance someone could rename this page to [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]?

'''Mr.bob:''' Help out a poor newb here, You said &quot;The second important thing is that after the creation of each window, it is assigned to a Controls(n) (n being a number), this is important to us because we will soon use this.&quot;

And then you never used it? What does control(n) do anyway?

I have another problem. I took the text that was shown, copied an pasted it into a .uc file. Then it tired to compile it, everything went fine until it said:

Parsing MultiJumpMut

C;\UT2004\MultijumpMut\ClassesMultiJumpMut.uc&lt;20&gt; : Error Unexpected 'class'

Complie aborted due to errors.

Failure - 1 error, 0 warnings

Yes I did change the code so it knew that it was MultiJumpMut instead of MultiJumpMutator, also you may have noticed that I have Unreal Tourny 2004. I have never had 2003

'''Tarquin:''' I am not sure it is useful for this tutorial page to include an actual mutator &amp;ndash; it rather detracts from the point, doesn't it?

'''M.r.bob:''' I see what you mean, but I exspected to see what this code did, and then change it so it did something else, and that way figure out how code like this worked. Anyway I found out my problem, GUI's work very different in 2004 then in 2003.

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5283</id>
      <timestamp>2004-06-20T13:06:36Z</timestamp>
      <contributor>
        <ip>Mr.Bob</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Making a configuration window for your [[Legacy:Mutator Topics|mutator]] in [[Legacy:UT2003|UT2003]]. Written By LedZep

This tutorial will guide you through creating a simple mutator and a configuration window for it. This tutorial assumes that you have basic knowledge in [[Legacy:UnrealScript|UnrealScript]] and that you know how to create [[Legacy:UC File|UC file]]s and how to setup and compile them: see [[Legacy:Setting Up UnrealScript|Setting Up UnrealScript]].

As an example, this tutorial will show you how to create a MultiJumping mutator and how to create a configuration window to setup it. You are not going to need any external files other than the ones you will create yourself.

For a class tree of the GUI components see [[Legacy:GUI Class Hierarchy|GUI Class Hierarchy]].

==Creating the Mutator Class==

First we will create the mutator, basically it is going to have three components: the configurable variables, the ModifyPlayer function and the [[Legacy:Default Properties|Default Properties]]. Here is how it is going to look like:

&lt;uscript&gt;
Class MultiJumpMut extends Mutator Config(User);

var() config int MJMax, MJBoost;

function ModifyPlayer(Pawn Other)
{
	local xPawn x;
	x = xPawn(Other);	// Check if pawn is xPawn

	if(x != None)		// If it is, assign the new variables to it
	{
		x.MaxMultiJump = MJMax;
		x.MultiJumpBoost = MJBoost;
	}
}

defaultproperties
{
    IconMaterialName=&quot;MutatorArt.nosym&quot;
    ConfigMenuClassName=&quot;MultiJumpMutator.MJMutConfig&quot;        // Note that this assumes that your package's name is MultiJumpMutator
    GroupName=&quot;Jumping&quot;
    FriendlyName=&quot;MultiJumpMutator&quot;
    Description=&quot;Configure Your Multi Jumping Ability.&quot;
    MJMax=1
    MJBoost=25
}
&lt;/uscript&gt;

Note that I added &quot;Config(User)&quot; to the class declaration so it will know where to store its variables.  When declaring Configurable variables, always put the word &quot;config&quot; after the &quot;var&quot; to let the compiler know that they are configurable. If you want those varibles to have default properties incase the user wont specify any, make your &quot;var&quot; look like this: &quot;var()&quot;, and in the default properties section give those variable a value (dont forget that you dont use semi colons in the default properties section).  See also [[Legacy:Variable Syntax|Variable Syntax]].

In this mutator's case, MJMax is the maximum number of extra jumps the player can make, and MJBoost is the boost each extra jump gives him.  The ModifyPlayer function is really simple, it recieves a Pawn in its parameters, checks if it is an xPawn and then assigns our mutator's variables to the xPawn's variables.  Now default props, basically what they do is give the mutator its name and its description, assign values to our configurable variable and specify our mutator's config class (which we will make in a second)

==Creating the Configuration Window for the Mutator==

The ConfigWindow is a little more tricky, it has four parts to it; declaring the two edit boxes we are going to be using, the InitComponent and InternalOnClick functions and the DefaultProperties.  First I'll give you the code, then I'll explain. Dont freak out when you see the Default Properties, it will all become clear to you very soon.

&lt;uscript&gt;
class MJMutConfig extends GUIPage;

var moEditBox MJCountBox, MJBoostBox;		// Declare two EditBox type Variables

// Called when our GUI component is initiated (in this case our config window)
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
	Super.InitComponent(MyController, MyOwner);	// Call Parent's InitComponent

	// Assign variables to EditBoxes that were created in the default properties
	MJCountBox = moEditBox(Controls[4]);
	MJBoostBox = moEditBox(Controls[5]);

	// Set the EditBoxes to be integer only because we are only dealing with numbers
	MJCountBox.IntOnly(true);
	MJBoostBox.IntOnly(true);
	
	// Set the EditBoxes' text to our mutator's config variables' values
	MJCountBox.SetText(string(class'MultiJumpMut'.default.MJMax));
	MJBoostBox.SetText(string(class'MultiJumpMut'.default.MJBoost));
}

// Called when the OK button is clicked
function bool InternalOnClick(GUIComponent Sender)
{
	// Set our Mutator's variables to the new variables that were set by the user
	class'MultiJumpMut'.default.MJMax = int(MJCountBox.GetText());
	class'MultiJumpMut'.default.MJBoost = int(MJBoostBox.GetText());
	
	class'MultiJumpMut'.static.StaticSaveConfig();	// Save all the Mutator's config variables

	Controller.CloseMenu(false);	// Close the window

	return true;	// Return True (hard to figure out eh?) ;)
}

defaultproperties
{
	Begin Object Class=GUIButton name=DialogBackground	// The window's background
		WinWidth=1.0			// Set Window's width
		WinHeight=1.0			// Set Window's height
		WinTop=0			// Set the windows location on the Y axis
		WinLeft=0			// Set the windows location on the X axis
		bAcceptsInput=false		// Since its just a background it wont accept input
		bNeverFocus=true		// Just a background, no need for focus
		StyleName=&quot;ComboListBox&quot;	// The style of the background
		bBoundToParent=true		// is it bound to its parent window?
		bScaleToParent=true		// is it in scale to its parent window?
	End Object
	Controls(0)=GUIButton'DialogBackground'	// Sets Controls[0] to the DialogBackround

	Begin Object Class=GUIButton Name=OkButton	// An &quot;OK&quot; Button
		Caption=&quot;OK&quot;				// The button's caption
		WinWidth=0.2
		WinHeight=0.04
		WinLeft=0.4
		WinTop=0.63
		OnClick=InternalOnClick			// Assigns the button's OnClick to our InternalOnClick function
	End Object
	Controls(1)=GUIButton'OkButton'			// Sets Controls[1] to the OkButton

	Begin Object class=GUILabel Name=DialogText	// A text label
		Caption=&quot;MultiJump Configuration&quot;
		TextALign=TXTA_Center			// Text allignment
		TextColor=(R=220,G=180,B=0,A=255)	// Text color
		TextFont=&quot;UT2HeaderFont&quot;		// Text font
		WinWidth=1.000000
		WinHeight=32.000000
		WinLeft=0.000000
		WinTop=0.325000
	End Object
	Controls(2)=GUILabel'DialogText'

	Begin Object class=GUILabel Name=DialogText2	// Another text label
		Caption=&quot;Configure your MultiJump Options (default JumpBoost is 25)&quot;
		TextALign=TXTA_Center
		TextColor=(R=220,G=180,B=0,A=255)
		TextFont=&quot;UT2MenuFont&quot;
		WinWidth=1.000000
		WinHeight=32.000000
		WinLeft=0.000000
		WinTop=0.390626
	End Object
	Controls(3)=GUILabel'DialogText2'

	Begin Object class=moEditBox Name=MJCounter	// An edit box (for our MJMax)
		WinWidth=0.431641
		WinHeight=0.04
		WinLeft=0.293750
		WinTop=0.467448
		Caption=&quot;Number of MultiJumps&quot;
		bReadOnly=false				// Will take Input, therefor isn't readonly
	End Object
	Controls(4)=moEditBox'MJCounter'		// Set Controls[4] to the MJCounter
	
	Begin Object class=moEditBox Name=MJBooster	// Another edit box (for our MJBoost)
		WinWidth=0.431641
		WinHeight=0.04
		WinLeft=0.293750
		WinTop=0.517448
		Caption=&quot;MultiJump Boost&quot;
		bReadOnly=false
	End Object
	Controls(5)=moEditBox'MJBooster'		// Set Controls[5] to the MJBooster
	
	// The Window's own properties (MJMutConfig)
	WinLeft=0
	WinTop=0.3
	WinWidth=1
	WinHeight=0.4
	bRequire640x480=True		// Required Minimum resolution
}
&lt;/uscript&gt;

First we have the Class Declaration, only one line, easy wasnt it? (note that you should subclass GUIPage) Then we have the variable declaration, also one line! you see how easy coding is? Well, only this time, since we are making editboxes, the variables are of the moEditBox type.  Ok, now we will skip the two function (we will come back to them later) and go straight to the defaultprops.  If you are new to UnrealScript, this might seem a little weird to you (it sure did to me), but dont worry, it is really simple! in the classic UT, we had to create around 3 or 4 classes just to make one window, basically what all this code does is create this window for you using only one class, how cool is that?  To make it easy to understand for you I put a whole bunch of comments into it so just read through it and read the comments and it will give you the general idea.  Basically, Begin Object creates an object, names it, manipulates its variables and then assigns it to something.  It is commonly used in the UT2003 window system as followes:

&lt;uscript&gt;
	Begin Object class=&lt;ClassName&gt; Name=&lt;ObjectName&gt;
		WinWidth=&lt;Width&gt;
		WinHeight=&lt;Height&gt;
		WinLeft=&lt;LocationOnXAxis&gt;
		WinTop=&lt;LocationOnYAxis&gt;
		&lt;OtherVars&gt;=&lt;OtherValues&gt;
	End Object
	Controls(n)=&lt;ClassName&gt;'&lt;ObjectName&gt;'	// n is the object's number - 1 (so the first object is 0)
&lt;/uscript&gt;

all what our DefaultProperties do is create a background, an &quot;OK&quot; Button, two text labels, two edit boxes and then set the variables for its own class (MJMutConfig).  There are two important things you should note, one is &quot;OnClick=InternalOnClick&quot; which is found in the &quot;OK&quot; button's creation code. Basically what it does is call our InternalOnClick function whenever the &quot;OK&quot; button is clicked. The second important thing is that after the creation of each window, it is assigned to a Controls(n) (n being a number), this is important to us because we will soon use this.

Ok, we are done with the hard part, all what is left to do is the last two functions.  the function InitComponent is pretty much like UT's Created, it is called when our GUI component is initiated.  First it calls its parent's InitComponent to do all the important stuff of initiating the window.  Then we assign the two moEditBoxes (that were created in the default properties) to our own EditBoxes.

Then we set them as IntOnly because we are only dealing with numbers, and finally we set their text to our mutator's configurable variables' values. Basically all what our InitComponent function does is getting our EditBoxes setup and ready to use.  And our last function for this tutorial, InternalOnClick, which is called when the &quot;OK&quot; button is clicked.  All this function does is set our mutator's variables to the new variables that were typed into the editboxes, then is saves all of our mutator's config variables (which is only two) and finally it closes the window.

And thats it!

By the way, you can also add checkboxes and combolists and all sorts of GUI components, look around the GUI components, or more specifically, look at moEditBox and moCheckBox and basically do the same thing with them as I did with moEditBox in this tutorial. (also look at their classes to see what kind of variables and functions they have)

==Creating the INT file==

it is very simple, just follow this syntax:

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=&lt;PackageName&gt;.&lt;MutatorClass&gt;,Description=&quot;&lt;MutatorName&gt;,&lt;Description&gt;&quot;)
&lt;/uscript&gt;

so in our case, if lets say the mutator's package will be named MultiJumpMutator, our [[Legacy:INT File|INT File]] will look like this:

&lt;uscript&gt;
[Public]
Object=(Class=Class,MetaClass=Engine.Mutator,Name=MultiJumpMutator.MultiJumpMut,Description=&quot;MultiJump,Configure your multi jumping ability.&quot;)
&lt;/uscript&gt;

and it will be named MultiJumpMutator.int

==The Grand Finale==

[[Legacy:Compiling With UCC|Compile]] the whole enchilada, then start UT2003. Go to instant action and click on Mutators, in there find MultiJumpMutator, add it to the mutator list and click on Configure Mutator, the window we created will pop up and you will be able to change the values to whatever you want, then start a game session and see the mutator in action.

I hope you enjoyed this tutorial.

LedZep (for comments EMail me at LedZepperus@Yahoo.com)

==Comments ==

'''Dma:''' Dude, you took my idea! [[Legacy:Dma/MutMultiJump|dma/MutMultiJump]] :-)

'''RoninLord:''' Using the property '''bBoundToParent=true''' in a widget, including GUIButtons etc., makes the '''WinLeft''' and '''WinTop''' properties relative to the parent widget. So '''WinTop=0.9''' is 90% of the parent widget, rather than 90% of the whole window.

This makes it easier to lay out widgets, especially if you later move the parent widget, you then don't have to adjust the properties of the child widgets.

'''LedZep:''' Wow thanks for the info RoninLord. Dma, sorry if you also used this idea (although i came up with it by myself, i didnt steal anything :-D) but the real point of this tutorial is to teach you how to make a GUI Config window, not a multi jump mutator ;-)

'''JoeDark:''' Does this tut apply to UT or UT2003 so it can be filed correctly (if it already isn't). Please label it on here somewhere.

'''Wormbo:''' Uhm, I found this at the top of the page:

{{innerbox|Tutorial #1: Making a configuration window for your [[Legacy:Mutator|mutator]] in [[Legacy:UT2003|UT2003]]

}}

'''JoeDark:''' LOL! It's late.. need sleep.

'''Tarquin:''' This page isn't linked form anywhere useful. Could someone find it a home, eg [[Legacy:UnrealScript|UnrealScript]] ?

'''JoeDark:''' Done.

'''LedZep:''' Hehe JoeDark, it happens to everyone... Ill just make the title a bit bigger so it'll be easier to see ;)

'''EntropicLqd:'''  If you follow the example above all positioning and scaling is relative to the window as a whole.  This is fine if your dialog window (''with the dirty hack of using a button as the window background - ugh'') takes up the whole screen.  If it doesn't then setting the '''MenuOwner''' proeprty to the background button will make all scalings relative to the actual button (the &quot;real&quot; window) - rather than the entire window itself.  I found it made laying out the widgets a little easier.

&lt;uscript&gt;
defaultproperties {
  Begin Object Class=GUIButton name=FMConfigBackground
    // Blah blah blah
  End Object
  Begin Object Class=GUIButton Name=FMOkButton
    // Object properties go here and add the following to make everything relative to your config background:
    bBoundToParent=true
    bScaleToParent=true
    MenuOwner=FMConfigBackground
  End Object
&lt;/uscript&gt;

'''EntropicLqd:''' One other thing that is worth noting is that you can specify your own functions as callbacks from the OnChange events and such like.  As long as the interface matches it works fine.  For example I have three colour bar sliders that need to change the colour of a widget.  Rather than use the &quot;InternalOnChange&quot; function I simply created my own and set the OnChange property appropriately.  Example below:

&lt;uscript&gt;
// I define the callback function I want to use to handle my three colour bar sliders
function ColourSliderChanged(GUIComponent Sender) {
  // Code goes in here
}

// And then in the default property section of my slider I set the following property:
Begin Object class=GUISlider Name=FMRedSlider
  OnChange=ColourSliderChanged
  // Rest of details
End Object
&lt;/uscript&gt;

'''Brox:''' How would you create a new class (also extended from GUIPage) in the onClick function of a button?

'''EntropicLqd:''' Like this:  Code is taken from XInterface.Tab_InstantActionMutators.uc

&lt;uscript&gt;
function bool MutConfigClick( GUIComponent Sender ) {
  if(MutConfigMenu == &quot;&quot;)
    return true;
  // In this case MutConfigMenu is set to the value of the Mutator.ConfigMenuClassName property
  Controller.OpenMenu( MutConfigMenu );
  return true;
}

// And as for the actual button definition - I've cut out all bar the relevant properties
Begin Object Class=GUIButton Name=IAMutatorConfig
  OnClick=MutConfigClick
End Object
&lt;/uscript&gt;

'''the_viking:''' But how can I create a GUIPage where i might display the contents of my inventory? 

Where do I have to put my code into?

'''spoon:''' You can have an in-game GUIPage by using '''ClientOpenMenu'''. Just create a GUIPage, then call ClientOpenMenu from a mutate command or an exec function. The above GUIPage information still applies.

&lt;uscript&gt;
function Mutate( string MutateString, PlayerController Sender )
{
    if( Caps( Left( MutateString, 3 ) ) == &quot;INV&quot; )
    {
      Sender.ClientOpenMenu( &quot;GUIInvPage&quot; );
    }
    Super.Mutate( MutateString, Sender );
}
&lt;/uscript&gt;

Your GUIPage class will have to play a nice game of find-the-actor since you can't pass anything.

'''VonStrohmen:''' In what instances do WinHeight/Width and WinTop/Left correspond to actual pixel coordinates versus fractions of the parent window? It seems to me that if I set any of those variables to be a decimal value less than 1 (e.g. 0.5) it translates that to percent, whereas greater than one is interpreted as a pixel coordinate. However, it doesn't always seem to work that way. Any advice?

Also, why does Controls(n) work? I thought dynamic arrays use [] instead of ().

'''Wormbo:''' [[Legacy:Default Properties|Default Properties]] are always different. ;) The size/position properties really work the way you described, but the position of a [[Legacy:GUIComponent|GUIComponent]] depends on more than just WinTop/Left and its size depends on more than just WinHeight/Width. There are also the bBoundToParent and bScaleWithParent properties which affect the position and size of a control.

'''VonStrohmen:''' I experimented with those as well, with mixed results. Then I realized that I never set the properties of the GUIPage itself. That seemed to help. 

----

'''EntropicLqd:''' Any chance someone could rename this page to [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]?

'''Mr.bob:''' Help out a poor newb here, You said &quot;The second important thing is that after the creation of each window, it is assigned to a Controls(n) (n being a number), this is important to us because we will soon use this.&quot;

And then you never used it? What does control(n) do anyway?

I have another problem. I took the text that was shown, copied an pasted it into a .uc file. Then it tired to compile it, everything went fine until it said:

Parsing MultiJumpMut

C;\UT2004\MultijumpMut\ClassesMultiJumpMut.uc&lt;20&gt; : Error Unexpected 'class'

Complie aborted due to errors.

Failure - 1 error, 0 warnings

Yes I did change the code so it knew that it was MultiJumpMut instead of MultiJumpMutator, also you may have noticed that I have Unreal Tourny 2004. I have never had 2003

'''Tarquin:''' I am not sure it is useful for this tutorial page to include an actual mutator &amp;ndash; it rather detracts from the point, doesn't it?

'''M.r.bob:''' I see what you mean, but I exspected to see what this code did, and then change it so it did something else, and that way figure out how code like this worked. Anyway I found out my problem, GUI's work very different in 2004 then in 2003.

[[Category:Legacy Tutorial|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator Config GUI (UT2004)</title>
    <id>2170</id>
    <revision>
      <id>5274</id>
      <timestamp>2006-02-19T03:00:47Z</timestamp>
      <contributor>
        <ip>Cpe-066-057-080-067.nc.res.rr.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addtion to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits beore you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;

  //Group these components when other mutator components are configurable
  GroupName = &quot;HitAndScore&quot;
  //Display of mutator in mutator list
  FriendlyName = &quot;Hit And Score&quot;
  //Description of mutator appearing in GUI
  description = &quot;mutator that counts the hits taken and resets the player's score after a certain threshold is reached.&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it. Note that on patch 3355, GetDisplayText will cause a compile error, so you do not need this function when compiling for that environment.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to do this to prevent some of the default settings descriptions from disappearing in the UI.  Also, these functions are not limited to mutators, but can also be used in custom gametype classes.  Another thing you may want to mention here is if you have a lot of configurable options, you can create separate configuration sections by doing the following in FillPlayInfo()...

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local string MyGroup;

  Super.FillPlayInfo(PlayInfo);

  MyGroup=&quot;My Config Section&quot;;
  PlayInfo.AddSetting(MyGroup, &quot;bAddEffect&quot;, GetDisplayText(&quot;bAddEffect&quot;), 0, 1, &quot;Check&quot;);
  // code snipped
}
&lt;/uscript&gt;

'''mad:''' Added some lines to show how to change what is displayed in the mutator list. The above code by Bitty will also pretty much do the same thing. Also, when I tried to add GetDisplayText function to my mutator, there was a compile error. I have patch 3355, so this may be the reason why I get compilation errors. I added a note about this below the main class code up top.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5275</id>
      <timestamp>2005-11-26T17:08:08Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addtion to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits beore you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to prevent some of the default settings descriptions from disappearing in the UI, especially when using this function in a custom gametype.

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5276</id>
      <timestamp>2005-11-26T17:21:19Z</timestamp>
      <contributor>
        <ip>Bitty</ip>
      </contributor>
      <minor/>
      <comment>* formatting in my comment</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addtion to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits beore you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to do this to prevent some of the default settings descriptions from disappearing in the UI.  Also, these functions are not limited to mutators, but can also be used in custom gametype classes.  Another thing you may want to mention here is if you have a lot of configurable options, you can create separate configuration sections by doing the following in FillPlayInfo()...

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local string MyGroup;

  Super.FillPlayInfo(PlayInfo);

  MyGroup=&quot;My Config Section&quot;;
  PlayInfo.AddSetting(MyGroup, &quot;bAddEffect&quot;, GetDisplayText(&quot;bAddEffect&quot;), 0, 1, &quot;Check&quot;);
  // code snipped
}
&lt;/uscript&gt;

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11768</id>
      <timestamp>2008-05-08T23:17:07Z</timestamp>
      <contributor>
        <username>LuisG</username>
        <id>488</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addtion to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits beore you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;

  //Group these components when other mutator components are configurable
  GroupName = &quot;HitAndScore&quot;
  //Display of mutator in mutator list
  FriendlyName = &quot;Hit And Score&quot;
  //Description of mutator appearing in GUI
  description = &quot;mutator that counts the hits taken and resets the player's score after a certain threshold is reached.&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it. Note that on patch 3355, GetDisplayText will cause a compile error, so you do not need this function when compiling for that environment.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to do this to prevent some of the default settings descriptions from disappearing in the UI.  Also, these functions are not limited to mutators, but can also be used in custom gametype classes.  Another thing you may want to mention here is if you have a lot of configurable options, you can create separate configuration sections by doing the following in FillPlayInfo()...

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local string MyGroup;

  Super.FillPlayInfo(PlayInfo);

  MyGroup=&quot;My Config Section&quot;;
  PlayInfo.AddSetting(MyGroup, &quot;bAddEffect&quot;, GetDisplayText(&quot;bAddEffect&quot;), 0, 1, &quot;Check&quot;);
  // code snipped
}
&lt;/uscript&gt;

'''mad:''' Added some lines to show how to change what is displayed in the mutator list. The above code by Bitty will also pretty much do the same thing. Also, when I tried to add GetDisplayText function to my mutator, there was a compile error. I have patch 3355, so this may be the reason why I get compilation errors. I added a note about this below the main class code up top.
'''me:'''Any ways to change a guns prop(Damage) with a guid page, if so how?

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11769</id>
      <timestamp>2008-05-08T23:17:33Z</timestamp>
      <contributor>
        <username>LuisG</username>
        <id>488</id>
      </contributor>
      <comment>/* Discussion */</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addtion to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits beore you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;

  //Group these components when other mutator components are configurable
  GroupName = &quot;HitAndScore&quot;
  //Display of mutator in mutator list
  FriendlyName = &quot;Hit And Score&quot;
  //Description of mutator appearing in GUI
  description = &quot;mutator that counts the hits taken and resets the player's score after a certain threshold is reached.&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it. Note that on patch 3355, GetDisplayText will cause a compile error, so you do not need this function when compiling for that environment.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to do this to prevent some of the default settings descriptions from disappearing in the UI.  Also, these functions are not limited to mutators, but can also be used in custom gametype classes.  Another thing you may want to mention here is if you have a lot of configurable options, you can create separate configuration sections by doing the following in FillPlayInfo()...

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local string MyGroup;

  Super.FillPlayInfo(PlayInfo);

  MyGroup=&quot;My Config Section&quot;;
  PlayInfo.AddSetting(MyGroup, &quot;bAddEffect&quot;, GetDisplayText(&quot;bAddEffect&quot;), 0, 1, &quot;Check&quot;);
  // code snipped
}
&lt;/uscript&gt;

'''mad:''' Added some lines to show how to change what is displayed in the mutator list. The above code by Bitty will also pretty much do the same thing. Also, when I tried to add GetDisplayText function to my mutator, there was a compile error. I have patch 3355, so this may be the reason why I get compilation errors. I added a note about this below the main class code up top.


'''me:'''Any ways to change a guns prop(Damage) with a guid page, if so how?

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34180</id>
      <timestamp>2009-03-31T02:20:04Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <comment>/* Mutator GUI Properties */</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addition to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits beore you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;

  //Group these components when other mutator components are configurable
  GroupName = &quot;HitAndScore&quot;
  //Display of mutator in mutator list
  FriendlyName = &quot;Hit And Score&quot;
  //Description of mutator appearing in GUI
  description = &quot;mutator that counts the hits taken and resets the player's score after a certain threshold is reached.&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it. Note that on patch 3355, GetDisplayText will cause a compile error, so you do not need this function when compiling for that environment.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to do this to prevent some of the default settings descriptions from disappearing in the UI.  Also, these functions are not limited to mutators, but can also be used in custom gametype classes.  Another thing you may want to mention here is if you have a lot of configurable options, you can create separate configuration sections by doing the following in FillPlayInfo()...

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local string MyGroup;

  Super.FillPlayInfo(PlayInfo);

  MyGroup=&quot;My Config Section&quot;;
  PlayInfo.AddSetting(MyGroup, &quot;bAddEffect&quot;, GetDisplayText(&quot;bAddEffect&quot;), 0, 1, &quot;Check&quot;);
  // code snipped
}
&lt;/uscript&gt;

'''mad:''' Added some lines to show how to change what is displayed in the mutator list. The above code by Bitty will also pretty much do the same thing. Also, when I tried to add GetDisplayText function to my mutator, there was a compile error. I have patch 3355, so this may be the reason why I get compilation errors. I added a note about this below the main class code up top.


'''me:'''Any ways to change a guns prop(Damage) with a guid page, if so how?

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34181</id>
      <timestamp>2009-03-31T02:29:47Z</timestamp>
      <contributor>
        <ip>128.151.80.181</ip>
      </contributor>
      <comment>/* Example Code */</comment>
      <text xml:space="preserve">Mutator configuration within [[Legacy:UT2004|UT2004]] is handled very differently from that in previous games (see [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]]).  Rather than have a separate config window for each mutator all [[Legacy:Mutator|mutator]]s share the same configuration.

==Basic Requirements==

These are the basic elements needed to include configurable options for a mutator. 

===Mutator GUI Functions ===

Each mutator has the option to add its configuration options as a separate ''group'' to an existing configuration group.  This is handled by adding the following [[Legacy:Static Function|static function]]s to the mutator you are writing.

; static function FillPlayInfo(PlayInfo PlayInfo) : Responsible for actually creating the GUI widgets used to configure each option.
; static event string GetDescriptionText(string PropName) : Responsible for returning &quot;long&quot; descriptions of each of the options.
; static function string GetDisplayText(string PropName) : Repsonsible for returning the displayed menu name of each of the options.  This function is not strictly required but it keeps things consistent with the GameInfo configuration code.

===Mutator GUI Properties===

In addition to the above functions your mutator will also have the following array properties.  The number of elements within the array should equal the number of configurable items your mutator has.

For example, if your mutator has two configuration options the the following arrays should be declared.  The size of the arrays should match the number of properties you are attempting to configure.

&lt;uscript&gt;
class HitAndScore extends Mutator config (MutHitAndScore);

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// If you have any drop lists then you will want to add a localized array
// variable whose element count matches the number of selections within the drop list.
var localized string GUISelectOptions[2];
&lt;/uscript&gt;

===Example Code===

The following is some example code of GUI support for a mutator that counts the hits taken and resets the player's score after a certain threshold is reached.

&lt;uscript&gt;
var config int HitCount;  // A counter for the number of hits taken
var config int MaxHits;   // Number of hits before you lose your score

var localized string GUIDisplayText[2]; // Config property label names
var localized string GUIDescText[2];    // Config property long descriptions

// Mutator code and class definition snipped for clarity

// The function used to obtain the text that will be displayed within the
// config window.
static function string GetDisplayText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDisplayText[0];
    case &quot;MaxHits&quot;:  return default.GUIDisplayText[1];
  }
  return Super.GetDisplayText(PropName);
}

// The function used to obtain the &quot;hint&quot; text that is displayed at the bottom
// of the config window.
static event string GetDescriptionText(string PropName) {
  // The value of PropName passed to the function should match the variable name
  // being configured.
  switch (PropName) {
    case &quot;HitCount&quot;:  return default.GUIDescText[0];
    case &quot;MaxHits&quot;:  return default.GUIDescText[1];
  }
  return Super.GetDescriptionText(PropName);
}

// This function is called to actually add the configuration options for the
// mutator to the configuration window.
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent

  // The following function calls actually cause the configuration options to be
  // added to the mutator config window.  See below for a description of how to
  // use the PlayInfo.AddSetting() function.
  PlayInfo.AddSetting(default.GameGroup, &quot;HitCount&quot;, GetDisplayText(&quot;HitCount&quot;), 0, 2, &quot;Text&quot;, &quot;3;0:32&quot;, &quot;&quot;, True, True);

  PlayInfo.AddSetting(default.GameGroup, &quot;MaxHits&quot;, GetDisplayText(&quot;MaxHits&quot;), 0, 0, &quot;Text&quot;, &quot;3;0:999&quot;);

  // Note that the second parameter, and the value passed to the GetDisplayText()
  // within the calls to the AddSetting() function above matches the
  // name of the attribute we want to configure as declared within the class defintion
}

defaultproperties {
  HitCount=8
  MaxHits=500
  GUIDisplayText[0]=&quot;Hit Count&quot;
  GUIDisplayText[1]=&quot;Max Hits&quot;
  GUIDescText[0]=&quot;The number of hits each player can take&quot;
  GUIDescText[1]=&quot;The number of hits that a player can take before their score is reset&quot;

  //Group these components when other mutator components are configurable
  GroupName = &quot;HitAndScore&quot;
  //Display of mutator in mutator list
  FriendlyName = &quot;Hit And Score&quot;
  //Description of mutator appearing in GUI
  description = &quot;mutator that counts the hits taken and resets the player's score after a certain threshold is reached.&quot;
}
&lt;/uscript&gt;

'''Note:''' If you are subclassing from an existing mutator, or from the [[Legacy:GameInfo|GameInfo]] class then your GetDisplayText() and GetDescriptionText() functions should include a call to the method defined within the superclass.  Be aware that the inclusion of a GetDisplayText() function is considered good practice rather than being mandatory so check that the function is defined within the superclass before calling it. Note that on patch 3355, GetDisplayText will cause a compile error, so you do not need this function when compiling for that environment.

==The PlayInfo.AddSetting() Function==

The PlayInfo.AddSetting() function is defined as shown below.

&lt;uscript&gt;
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
&lt;/uscript&gt;

===AddSetting() Function Parameters===

What follows is a description of each of the parameters to the AddSetting() function.

; Group : This is the group the setting falls into.  Within the mutator config window this setting has no effect.  It is used primarily to group similar properties together within the main &quot;game&quot; and &quot;game rules&quot; windows.  The values used by the default UT2004 code are defined within the /Engine/Info class and are as follows:
; * default.RulesGroup (&quot;Rules&quot;)
; * default.ServerGroup (&quot;Server&quot;)
; * default.BotsGroup (&quot;Bots&quot;)
; * default.GameGroup (&quot;Game&quot;)
; * default.ChatGroup (&quot;Chat&quot;)
; * default.MapVoteGroup (&quot;Map Voting&quot;)
; * default.KickVoteGroup (&quot;Kick Voting&quot;)
; PropertyName : This is the name of the property that this setting relates to.  It must match exactly the name of the class configuration attribute that this menu setting relates to.
; Description : This is the label that will be used when the configuration option is displayed within the GUI window.
; SecLevel : This is the security level of the setting.  Values greater than zero may require the user to be logged on (''Is this used more at the Web-Admin level?'').  For a mutator it will generally be passed as 0.
; Weight : This is simply an value used to order the configuration options within the group.  For the purposes of the Mutator config screen it can be set to 0.
; RenderType : This is the type of widget to be used to alter the value of the property being configured.  The allowed values are listed below.
; * &quot;Check&quot;  Used when a check boxes is required.
; * &quot;Text&quot; - Used when a standard entry field is required.
; * &quot;Select&quot; - Used when a drop list is needed.
; * &quot;Custom&quot; - Used when an advanced configuration page (new window) is needed.  This value cannot be used within a mutator configuration setting.
; Extras : This parameter is used in conjunction with the RenderType parameter to determine what is actually displayed.  The format for the string is described below.
; ; Check : Ignored.
; ; Text : This parameter can be in a number of different forms
; ; * &quot;value&quot; for the default value of the Text Edit box. 
; ; * &quot;width;value&quot; for a Text Edit box with a given width and default value.
; ; * &quot;width;lowest:highest&quot; for a Ranged Edit box that allows values between the lowest and highest to be entered.  If the range is a float then the values should be specified with a decimal point.
; ; Select : The paramter should be a semi-colon delimited list of value and name pairs.  For example &quot;value1;name1;value2;name2;value3;name3&quot;.
; ; Custom : This configuration type cannot be used in a mutator configuration.  However values are of the form: '''&quot;##;Package.WebHandlerClass;Package.CustomConfigPage&quot;'''  &lt;br /&gt;The first part generally indicates an optional width.  The second part allows to specify the class that should handle rendering this property in webadmin.  The third part is the classname of a custom GUI page for this property.  All three parts are optional. &lt;br /&gt;Couple of notes:
; ; * The semi-colons are only required if you are using the second or third part of the field.  So valid values could be '''&quot;255&quot;''', '''&quot;255;;GUI2K4.MOTDConfigPage&quot;''' or '''&quot;;;GUI2K4.MOTDConfigPage&quot;'''.
; ; * The second part (webadmin support) is currently not implemented, so any value you put here will be ignored.
; ; * If you specify a custom config page, your property will appear in the GUI list as a button.  Clicking this button opens the page you've specified.  You'd normally only need to do this for more complex properties, such as structs.
; ExtraPrivs : Used to specify any additional privileges that are required in order for an admin to modify the value of this property from e.g. webadmin.  You'd only use this field if have custom privilege classes (i.e. subclasses of xPrivilegeBase), and then only in cases where you'd like the property to appear in the same group as other properties, but only for certain admins.&lt;br /&gt;&lt;br /&gt;Expected values would be the abbreviation for the corresponding privilege type as listed in the SubPrivs value of your custom privilege class.  In order to require multiple privileges for this property, use the pipe character as a delimiter. &lt;br /&gt;For example, to have a property appear on the Game page, but only if the admin also has the ability to kick players, you could specify &quot;Game&quot; for the Group parameter, and &quot;Kp&quot; for this parameter.
; bMultiPlayerOnly : This parameter should be set to True if the configuration option only applies within a mutliplayer game.
; bAdvanced : This parameter should be set to True if the configuration option should only be displayed when the &quot;Advanced&quot; options checkbox is checked.

==Advanced Configuration Support==

If you need to pass on the PlayInfo object to other '''Info subclasses''' then after the call to &lt;tt&gt;FillPlayInfo&lt;/tt&gt; you should call the &lt;tt&gt;PlayInfo.PopClass()&lt;/tt&gt; function.  An example is given below.

&lt;uscript&gt;
// Example take from Engine/GameInfo.uc FillPlayInfo() function
static function FillPlayInfo(PlayInfo PlayInfo) {
  Super.FillPlayInfo(PlayInfo);  // Always begin with calling parent
// code snipped
  if (default.GameReplicationInfoClass != None) {
    default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo);
    PlayInfo.PopClass();
  }
// code snipped
}
&lt;/uscript&gt;

The call to &lt;tt&gt;Super.FillPlayInfo()&lt;/tt&gt; performs an AddClass().  Not popping the class off the stack will result in a different number of classes being held within the PlayInfo's class stack on function exit than on function entry.

==Related Topics==
* [[Legacy:Mutator Topics|Mutator Topics]]
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]]

==Discussion==

'''EntropicLqd:''' Reset discussion and added real property names.

'''GnaM:''' Maybe it's just me, but this lesson seems pretty vague on how to actually use the 'extras' parameters. After reading it, I understand that that I need to use a list of names and values for &quot;select&quot;, but I have no idea how to use those values to actiate changes within the game. Perhaps a small simple example of how to use each type of extra in the code would help. Anyway, it's also kind of hard to find this lesson from the UScript topics page. It seems to me a link right under the other mutator tutorials would be apropriate. Thanks.

'''Foxpaw:''' Just one minor point: this tutorial would likely be hard to follow, as it is not a tutorial. ;) It's a reference, probrably aimed at people who already have a general idea of what to do and are looking for specifics.

'''Geist:''' Remember, you need to declare your configurable vars with the ''config'' keyword.  Otherwise, they wont appear in the Configure Mutator dialog, and you'll get runtime warnings in the log like &quot; Warning: Property 'HitCount' not found in class 'Class MutHitAndScore.HitAndScore' &quot; when opening that dialog.  This was very confusing at first, since HitCount is definitely there, but it just wasn't a ''configurable property'' (slightly misleading warning message, I guess).  I've made the corrections in the script above.

'''LionsHeart:''' I have a slight confusion on what I should do...I'm not sure what I should do with the PropName string.  Do I set it equal to something?  If would would like to give me a hand quickly, email me at LionsHeart455@hotmail.com.  Thanks!

'''Geist:''' Take a look at how ''PropName'' is used the functions.  ''PropName'' is used in the switch() of both GetDisplayText() and GetDescriptionText() as a key to what strings to return.  These strings are then displayed in the ''Mutator Configuration'' screen in the game.

'''Devi:''' I found this pretty helpful, I managed to add a config window to my mutator in about 20 minutes with it =)

'''Sir_Brizz:''' Shouldn't we add the ability to create a seperate Config Page to this page as well?

'''SuperApe:''' I added the following line to the end of the GetDescriptionText() event code above...&lt;uscript&gt;return Super.GetDescriptionText(PropName);&lt;/uscript&gt;...It appears to be necessary.  And am I correct in assuming that while the GetDisplayText() function can be called whatever, the GetDescriptionText() event must be explicitly named so? (Please correct me if I'm wrong on any of this.) My question is this: How can I have a checkbox property ''enable'' another PlayInfo setting?  IOW, a main option &quot;Allow Foo&quot; check box is available, but a greyed out (or non-existant) sub-option &quot;Start with Foo&quot; check box will not be available unless the &quot;Allow Foo&quot; box is checked.  Is something like that possible with the UT2004 GUI system?

'''Wormbo:''' GetDisplayText() is only a helper function for this class, but GetDescriptionText() is an engine event.

'''SuperApe:''' That's what I figured.  Thank you.  Now, about my question of enabling/disabling Mutator config option widgets: I see an example of what I'm looking for in the standard game config for bots.  If you select Bot Mode: &quot;Specify Number&quot; (as opposed to &quot;Use Map Defaults&quot;), the &quot;Number of Bots&quot; widget is enabled.  That is what I'm looking for and it's not apparent to me, in the code, how this works.  Is this functionality even available to Mutator configs?

'''Wormbo:''' This information can't be stored in [[Legacy:PlayInfo|PlayInfo]], so the functionality is not available in [[Legacy:PlayInfo|PlayInfo]]-generated config menus like the mutator configuration.

'''SuperApe:''' Thank you for clearing that up, Wormbo.

'''Bitty:''' Added the following to GetDisplayText()...

&lt;uscript&gt;return Super.GetDisplayText(PropName);&lt;/uscript&gt;

It's necessary to do this to prevent some of the default settings descriptions from disappearing in the UI.  Also, these functions are not limited to mutators, but can also be used in custom gametype classes.  Another thing you may want to mention here is if you have a lot of configurable options, you can create separate configuration sections by doing the following in FillPlayInfo()...

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local string MyGroup;

  Super.FillPlayInfo(PlayInfo);

  MyGroup=&quot;My Config Section&quot;;
  PlayInfo.AddSetting(MyGroup, &quot;bAddEffect&quot;, GetDisplayText(&quot;bAddEffect&quot;), 0, 1, &quot;Check&quot;);
  // code snipped
}
&lt;/uscript&gt;

'''mad:''' Added some lines to show how to change what is displayed in the mutator list. The above code by Bitty will also pretty much do the same thing. Also, when I tried to add GetDisplayText function to my mutator, there was a compile error. I have patch 3355, so this may be the reason why I get compilation errors. I added a note about this below the main class code up top.


'''me:'''Any ways to change a guns prop(Damage) with a guid page, if so how?

[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mutator Topics</title>
    <id>2046</id>
    <revision>
      <id>4987</id>
      <timestamp>2007-03-19T21:34:19Z</timestamp>
      <contributor>
        <ip>Mstram</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is the topic page for Mutator related information. For a general look at mods and mutators, see [[Legacy:Making Mods|Making Mods]]. (There's also an introduction into how mutators work at [[Legacy:Mod Authoring/Making A Mutator|Mod Authoring/Making A Mutator]], but bear in mind that it is a UT guide and is not fully applicable for UT2003.)

==What is a mutator?==

Mutators are a way to implement a modification, but they are not the ''only'' way. Mutators have to follow some important guidelines, which do not apply to new gametypes or total conversions (TCs), the other two types of [[Legacy:Mod|mod]] in Unreal.
* Mutators should work with any [[Legacy:Gametype|gametype]]. (However, there are mutators which were written only for certain game types, e.g. the Jail Fight mutator for UT [[Legacy:Jailbreak|Jailbreak]].)
* Mutators should work with each other, that means any other mutator that someone might make. (Of course, two arena mutators won't work together, but nobody would expect that.)

Roughly, mutators make a small difference to the game: they change settings such as speed or gravity, they add a weapon or a power-up and so on. The player should be able to set and configure mutators as if they were just extra game options.

==UT==
* [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] &amp;ndash; Making HUD mutators, destroying mutators, and functions for replacing items and giving weapons to players
* [[Legacy:INT File|INT File]] &amp;ndash; Syntax of the .INT file

==UT2003==
* [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] &amp;ndash; Creating a config screen for your mutator
* [[Legacy:INT File|INT File]] &amp;ndash; Syntax of the .INT file
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]

==UT2004==
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]] &amp;ndash; Ensuring your mutator is available in the game's mutator lists
* [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] &amp;ndash; Adding your mutator config to the default GUI window.

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''HunterKiller:'''How can this page and [[Legacy:Mutator|Mutator]] can be merged ? They talk about the same thing. I dont feel safe to do it by myself...

'''Tarquin:''' This is a topic page, for overview &amp; links. [[Legacy:Mutator|Mutator]] is a class spec page :)

'''DJPaul:''' Rename this to [[Legacy:UT2003 Engine Overview/Mutator|UT2003 Engine Overview/Mutator]]?

'''Tarquin:''' I folded [[Legacy:UT2003 Engine Overview|UT2003 Engine Overview]] into [[Legacy:Unreal Engine|Unreal Engine]]. Or I was going to. I forget.

'''Ch3z''' But there are two topics called mutator. One is the class module; The other is a type of mod. This page is about the mod type, mutator. Not the class.

{{innerbox| You don't always know that you're going to like a given mod, and you don't know that until you play it, and half of the time when you connect to a server these days it just starts sending you ten or so megs of bullshit that you may or may not appreciate. The practical upshot of this is that the community online is highly fractured. Virtually any server you connect to is packed to the gills with bots, and when you do find a server with people on it, they're probably playing some mod, mutator, or gametype that is distasteful to you. &amp;ndash;  [http://www.penny-arcade.com/news.php3?date=2004-01-21 Tycho on Penny-Arcade]

}}

'''Tarquin:''' curious what you guys think of the above.

'''Uncommon:''' This strays from the topic of mutators, but I think what should happen is when you try to connect to a server that will require you to download various files, it should give you a summary of what needs to be downloaded so you can decide if it's worth it. Otherwise you sit there downloading file after file, never knowing when it will end...

'''EntropicLqd:''' The problem is also excacerbated by the way in which the ServerPackages entries work.  If something is listed there then you have to download it - even if it's not actually being used in the current game.  I agree with Uncommon - it would be nice to see just how much crap you are going to have to download before you have to download it.

'''MadNad''' We have been told this will be fixed for ut2004

'''EntropicLqd:''' It kind of is.  There is an &quot;bAddToServerPackages&quot; property than can be set on a mutator which means that it is only sent to game clients when the mutator itself is in use.  I've no idea whether gametypes are handled in a similar way (although in UT you didn't need to add the new gametype packages to the ServerPackages list for it to be pushed to clients when running.

'''Stewart:''' This page does not do much to explain what the mutator is.  Does not give much of a breakdown of mutator's.  Nor does it list the necessary components involved in a mutator.  For a wiki, it seems to be written with the lot of a assumed prior knowledge.

'''Tarquin:''' Add a link to [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] somewhere. There are some simple mutator tutorials there.</text>
    </revision>
    <revision>
      <id>4988</id>
      <timestamp>2006-08-15T11:36:25Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is the topic page for Mutator related information. For a general look at mods and mutators, see [[Legacy:Making Mods|Making Mods]]. (There's also an introduction into how mutators work at [[Legacy:Mod Authoring/Making A Mutator|Mod Authoring/Making A Mutator]], but bear in mind that it is a UT guide and is not fully applicable for UT2003.)

==What is a mutator?==

Mutators are a way to implement a modification, but they are not the ''only'' way. Mutators have to follow some important guidelines, which do not apply to new gametypes or total conversions (TCs), the other two types of [[Legacy:Mod|mod]] in Unreal.
* Mutators should work with any [[Legacy:Gametype|gametype]]. (However, there are mutators which were written only for certain game types, e.g. the Jail Fight mutator for UT [[Legacy:Jailbreak|Jailbreak]].)
* Mutators should work with each other, that means any other mutator that someone might make. (Of course, two arena mutators won't work together, but nobody would expect that.)

Roughly, mutators make a small difference to the game: they change settings such as speed or gravity, they add a weapon or a power-up and so on. The player should be able to set and configure mutators as if they were just extra game options.

==UT==
* [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] &amp;ndash; Making HUD mutators, destroying mutators, and functions for replacing items and giving weapons to players
* [[Legacy:INT File|INT File]] &amp;ndash; Syntax of the .INT file

==UT2003==
* [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] &amp;ndash; Creating a config screen for your mutator
* [[Legacy:INT File|INT File]] &amp;ndash; Syntax of the .INT file
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]

==UT2004==
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]] &amp;ndash; Ensuring your mutator is available in the game's mutator lists
* [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] &amp;ndash; Adding your mutator config to the default GUI window.

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''HunterKiller:'''How can this page and [[Legacy:Mutator|Mutator]] can be merged ? They talk about the same thing. I dont feel safe to do it by myself...

'''Tarquin:''' This is a topic page, for overview &amp; links. [[Legacy:Mutator|Mutator]] is a class spec page :)

'''DJPaul:''' Rename this to [[Legacy:UT2003 Engine Overview/Mutator|UT2003 Engine Overview/Mutator]]?

'''Tarquin:''' I folded [[Legacy:UT2003 Engine Overview|UT2003 Engine Overview]] into [[Legacy:Unreal Engine|Unreal Engine]]. Or I was going to. I forget.

'''Ch3z''' But there are two topics called mutator. One is the class module; The other is a type of mod. This page is about the mod type, mutator. Not the class.

{{innerbox| You don't always know that you're going to like a given mod, and you don't know that until you play it, and half of the time when you connect to a server these days it just starts sending you ten or so megs of bullshit that you may or may not appreciate. The practical upshot of this is that the community online is highly fractured. Virtually any server you connect to is packed to the gills with bots, and when you do find a server with people on it, they're probably playing some mod, mutator, or gametype that is distasteful to you. &amp;ndash;  [http://www.penny-arcade.com/news.php3?date=2004-01-21 Tycho on Penny-Arcade]

}}

'''Tarquin:''' curious what you guys think of the above.

'''Uncommon:''' This strays from the topic of mutators, but I think what should happen is when you try to connect to a server that will require you to download various files, it should give you a summary of what needs to be downloaded so you can decide if it's worth it. Otherwise you sit there downloading file after file, never knowing when it will end...

'''EntropicLqd:''' The problem is also excacerbated by the way in which the ServerPackages entries work.  If something is listed there then you have to download it - even if it's not actually being used in the current game.  I agree with Uncommon - it would be nice to see just how much crap you are going to have to download before you have to download it.

'''MadNad''' We have been told this will be fixed for ut2004

'''EntropicLqd:''' It kind of is.  There is an &quot;bAddToServerPackages&quot; property than can be set on a mutator which means that it is only sent to game clients when the mutator itself is in use.  I've no idea whether gametypes are handled in a similar way (although in UT you didn't need to add the new gametype packages to the ServerPackages list for it to be pushed to clients when running.

'''Stewart:''' This page does not do much to explain what the mutator is.  Does not give much of a breakdown of mutator's.  Nor does it list the necessary components involved in a mutator.  For a wiki, it seems to be written with the lot of a assumed prior knowledge.

'''Tarquin:''' Add a link to [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] somewhere. There are some simple mutator tutorials there.</text>
    </revision>
    <revision>
      <id>4989</id>
      <timestamp>2007-03-18T20:29:42Z</timestamp>
      <contributor>
        <ip>Mstram</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page is the topic page for Mutator related information. For a general look at mods and mutators, see [[Legacy:Making Mods|Making Mods]]. (There's also an introduction into how mutators work at [[Legacy:Mod Authoring/Making A Mutator|Mod Authoring/Making A Mutator]], but bear in mind that it is a UT guide and is not fully applicable for UT2003.)

==What is a mutator?==

Mutators are a way to implement a modification, but they are not the ''only'' way. Mutators have to follow some important guidelines, which do not apply to new gametypes or total conversions (TCs), the other two types of [[Legacy:Mod|mod]] in Unreal.
* Mutators should work with any [[Legacy:Gametype|gametype]]. (However, there are mutators which were written only for certain game types, e.g. the Jail Fight mutator for UT [[Legacy:Jailbreak|Jailbreak]].)
* Mutators should work with each other, that means any other mutator that someone might make. (Of course, two arena mutators won't work together, but nobody would expect that.)

Roughly, mutators make a small difference to the game: they change settings such as speed or gravity, they add a weapon or a power-up and so on. The player should be able to set and configure mutators as if they were just extra game options.

==UT==
* [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] &amp;ndash; Making HUD mutators, destroying mutators, and functions for replacing items and giving weapons to players
* [[Legacy:INT File|INT File]] &amp;ndash; Syntax of the .INT file

==UT2003==
* [[Legacy:Mutator Config GUI (UT2003)|Mutator Config GUI (UT2003)]] &amp;ndash; Creating a config screen for your mutator
* [[Legacy:INT File|INT File]] &amp;ndash; Syntax of the .INT file
* [[Legacy:Maintaining Compatibility|Maintaining Compatibility]]
* [[Legacy:Writing And Using An Embedded Mutator|Writing and Using an Embedded Mutator]]

==UT2004==
* [[Legacy:Mutator Availability (UT2004)|Mutator Availability (UT2004)]] &amp;ndash; Ensuring your mutator is available in the game's mutator lists
* [[Legacy:Mutator Config GUI (UT2004)|Mutator Config GUI (UT2004)]] &amp;ndash; Adding your mutator config to the default GUI window.

==Related Topics==
* [[Legacy:Making Mods|Making Mods]]

==Discussion==

'''Mstram:''' Are mutators applicable to the UnrealEngine2 Runtime? I'm trying to do the the &quot;UnrealScript Hello World&quot; tutor (http://wiki.beyondunreal.com/wiki/UnrealScript_Hello_World) and can't find the &quot;mutator page&quot; (&quot;Start up Unreal Tournament and go to the mutator page  ...)

'''HunterKiller:'''How can this page and [[Legacy:Mutator|Mutator]] can be merged ? They talk about the same thing. I dont feel safe to do it by myself...

'''Tarquin:''' This is a topic page, for overview &amp; links. [[Legacy:Mutator|Mutator]] is a class spec page :)

'''DJPaul:''' Rename this to [[Legacy:UT2003 Engine Overview/Mutator|UT2003 Engine Overview/Mutator]]?

'''Tarquin:''' I folded [[Legacy:UT2003 Engine Overview|UT2003 Engine Overview]] into [[Legacy:Unreal Engine|Unreal Engine]]. Or I was going to. I forget.

'''Ch3z''' But there are two topics called mutator. One is the class module; The other is a type of mod. This page is about the mod type, mutator. Not the class.

{{innerbox| You don't always know that you're going to like a given mod, and you don't know that until you play it, and half of the time when you connect to a server these days it just starts sending you ten or so megs of bullshit that you may or may not appreciate. The practical upshot of this is that the community online is highly fractured. Virtually any server you connect to is packed to the gills with bots, and when you do find a server with people on it, they're probably playing some mod, mutator, or gametype that is distasteful to you. &amp;ndash;  [http://www.penny-arcade.com/news.php3?date=2004-01-21 Tycho on Penny-Arcade]

}}

'''Tarquin:''' curious what you guys think of the above.

'''Uncommon:''' This strays from the topic of mutators, but I think what should happen is when you try to connect to a server that will require you to download various files, it should give you a summary of what needs to be downloaded so you can decide if it's worth it. Otherwise you sit there downloading file after file, never knowing when it will end...

'''EntropicLqd:''' The problem is also excacerbated by the way in which the ServerPackages entries work.  If something is listed there then you have to download it - even if it's not actually being used in the current game.  I agree with Uncommon - it would be nice to see just how much crap you are going to have to download before you have to download it.

'''MadNad''' We have been told this will be fixed for ut2004

'''EntropicLqd:''' It kind of is.  There is an &quot;bAddToServerPackages&quot; property than can be set on a mutator which means that it is only sent to game clients when the mutator itself is in use.  I've no idea whether gametypes are handled in a similar way (although in UT you didn't need to add the new gametype packages to the ServerPackages list for it to be pushed to clients when running.

'''Stewart:''' This page does not do much to explain what the mutator is.  Does not give much of a breakdown of mutator's.  Nor does it list the necessary components involved in a mutator.  For a wiki, it seems to be written with the lot of a assumed prior knowledge.

'''Tarquin:''' Add a link to [[Legacy:UnrealScript Lessons|UnrealScript Lessons]] somewhere. There are some simple mutator tutorials there.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MyLevel</title>
    <id>1811</id>
    <revision>
      <id>4443</id>
      <timestamp>2008-01-08T03:00:08Z</timestamp>
      <contributor>
        <ip>LiKeMiKeS</ip>
      </contributor>
      <minor/>
      <comment>Question: About UED's resource handling</comment>
      <text xml:space="preserve">'''MyLevel''' is a special [[Legacy:Package|package]] name in [[Legacy:UnrealEd|UnrealEd]]. If an [[Legacy:Unreal Resource|Unreal resource]] such as a texture or static mesh is listed as being in the package &quot;MyLevel&quot;, that means it is embedded in the map, and not in a package file on your hard drive. The MyLevel file doesn't actually exist. The word &quot;MyLevel&quot; is a magic keyword that works as an alias for your map file itself. &quot;MyLevel&quot; is often called a ''pseudopackage''.  

It is in the MyLevel pseudo-package that you must import the [[Legacy:Level Screenshot|level screenshot]] that the game displays in the map browser.

==Overview==

===Pros===
* Easier to distribute a map as a single file. Reduces confusion and makes your map easy to install
* Reduces clutter in the separate folders: this is by far the best solution if you just want one or two new textures for a map, instead of adding new files with each map with the increased possibility of errors.
* Reduces File Size slightly:
;Zip file with a 255,0,0 color (pure red) 64x64 texture Mylevel package on the default cube builder : 1.85 K 
;Zip file with a 255,0,0 color (pure red) 64x64 texture in a separate package on the default cube builder : 2.06 K
* Removes the risk of texture package name/contents clashes.

===Cons===
* If you have custom textures used in a lot of maps, every map would have to include the textures again. 
** Can be tricky to reuse textures in a new map (in theory it should be possible by just opening the maps in sequence but the support in unrealed for this is a little buggy)
** Duplication between maps will waste bandwidth time and disk space.
* The download system in UT does not support resume, therefore smaller sizes for individual files result in less wastage from incomplete downloads and more chances of eventually getting connected to the server.
* This does not work for sounds in Ravenshield.  It will just create a file in /sounds named MyLevel.sbo.  This might work for 22khz mono and lower, but seriously 22khz?  This isn't Duke Nukem 3D.

==Instructions==

===Embedding new resources ===

# Create or import a new resource in UnrealEd, like a sound, a texture, or a class. When you are asked to give a package name, put &quot;MyLevel&quot;. The case doesn't matter, so &quot;mylevel&quot;, &quot;MYLEVEL&quot;, &quot;mYlEvEl&quot;, etc are all the same thing.
# Use the new resource somewhere in the current map or UnrealEd will discard it when the map is saved.  If you embed a resource in the Mylevel virtual package and close UnrealEd without using it somewhere in your map, your unused resources will be lost. Ued will automatically get rid of unused resources to save space and memory.
# Save the map.
# '''''DON'T save the MyLevel package.''''' If you save it, bad things happen! 

If you have a resource already used in a map, but residing in an existing package, moving it to MyLevel is somewhat harder. You generally need to export it and re-import it.

===Embedding resources from existing packages ===

See [[Legacy:Embedding Code|Embedding Code]].  The same also works with .utx, .uax, or, .umx files.

For textures which are already used in a map:
# export each one to PCX
# reimport

# use the Texture Replace tool, or SHIFT+T to select all surfaces of the same texture 
# reapply the MyLevel version of the same texture

===Embedding resources from another map's MyLevel===

If another map has a resource embedded, you can copy this to your own map.

Do not quit UnrealEd at any point in the following.

# Open the other map
# Open your map
# Select the resource in the appropriate [[Legacy:Resource Browser|resource browser]]
# Place it in your map
# Save your map

===Referring to resources in another map's MyLevel===

You can use a resource that is embedded in another map's MyLevel without copying it to yours. This saves on filesize, but you must be certain that anyone using your map has the resource map too.

# Open your map
# Open the appropriate [[Legacy:Resource Browser|resource browser]]
# Go to load a new package
# In the file chooser, navigate out of the current folder and into the maps folder
# Open the map file whose resource you want
# Place the resource in your map

==Related Topics ==
* See [[Legacy:Package|Package]] for more on resources and packages in general.
* [[Legacy:Import The Texture|Import The Texture]]
* [[Legacy:Level Screenshot|Level Screenshot]]

==Discussion==

----

[[:Category:Legacy Mapping]]

==Unreal Resource Handling==

===Some quick questions:===
# Is anyone familiar with the internal workings of how UED handles the assets mentioned above? If so please add a reference/search link to the relevant code pages, as I am currently working on a mod that requires editor functionality ingame and need more information.
# Is there some way to stop UED from creating bogus packages? ie. Package0, Package1 etc. Maybe flushing a buffer or something?
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4444</id>
      <timestamp>2007-12-10T15:57:51Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>Okay.  Then this is an extension to the embedding steps already provided.  Cleaned up and integrated into page.</comment>
      <text xml:space="preserve">'''MyLevel''' is a special [[Legacy:Package|package]] name in [[Legacy:UnrealEd|UnrealEd]]. If an [[Legacy:Unreal Resource|Unreal resource]] such as a texture or static mesh is listed as being in the package &quot;MyLevel&quot;, that means it is embedded in the map, and not in a package file on your hard drive. The MyLevel file doesn't actually exist. The word &quot;MyLevel&quot; is a magic keyword that works as an alias for your map file itself. &quot;MyLevel&quot; is often called a ''pseudopackage''.  

It is in the MyLevel pseudo-package that you must import the [[Legacy:Level Screenshot|level screenshot]] that the game displays in the map browser.

==Overview==

===Pros===
* Easier to distribute a map as a single file. Reduces confusion and makes your map easy to install
* Reduces clutter in the separate folders: this is by far the best solution if you just want one or two new textures for a map, instead of adding new files with each map with the increased possibility of errors.
* Reduces File Size slightly:
;Zip file with a 255,0,0 color (pure red) 64x64 texture Mylevel package on the default cube builder : 1.85 K 
;Zip file with a 255,0,0 color (pure red) 64x64 texture in a separate package on the default cube builder : 2.06 K
* Removes the risk of texture package name/contents clashes.

===Cons===
* If you have custom textures used in a lot of maps, every map would have to include the textures again. 
** Can be tricky to reuse textures in a new map (in theory it should be possible by just opening the maps in sequence but the support in unrealed for this is a little buggy)
** Duplication between maps will waste bandwidth time and disk space.
* The download system in UT does not support resume, therefore smaller sizes for individual files result in less wastage from incomplete downloads and more chances of eventually getting connected to the server.
* This does not work for sounds in Ravenshield.  It will just create a file in /sounds named MyLevel.sbo.  This might work for 22khz mono and lower, but seriously 22khz?  This isn't Duke Nukem 3D.

==Instructions==

===Embedding new resources ===

# Create or import a new resource in UnrealEd, like a sound, a texture, or a class. When you are asked to give a package name, put &quot;MyLevel&quot;. The case doesn't matter, so &quot;mylevel&quot;, &quot;MYLEVEL&quot;, &quot;mYlEvEl&quot;, etc are all the same thing.
# Use the new resource somewhere in the current map.  If this is not done, UnrealEd will discard it when the map is saved. ''(See Warning below)''
# Save the map.
# '''''DON'T save the MyLevel package.''''' If you save it, bad things happen! 

If you have a resource already used in a map, but residing in an existing package, moving it to MyLevel is somewhat harder. You generally need to export it and re-import it.

====Warning====

If you embed a resource in the Mylevel virtual package and close UnrealEd without using it somewhere in your map, your unused resources will be lost. Ued will automatically get rid of unused resources to save space and memory.

===Embedding resources from existing packages ===

See [[Legacy:Embedding Code|Embedding Code]].  The same also works with .utx, .uax, or, .umx files.

For textures which are already used in a map:
# export each one to PCX
# reimport

# use the Texture Replace tool, or SHIFT+T to select all surfaces of the same texture 
# reapply the MyLevel version of the same texture

===Embedding resources from another map's MyLevel===

If another map has a resource embedded, you can copy this to your own map.

Do not quit UnrealEd at any point in the following.

# Open the other map
# Open your map
# Select the resource in the appropriate [[Legacy:Resource Browser|resource browser]]
# Place it in your map
# Save your map

===Referring to resources in another map's MyLevel===

You can use a resource that is embedded in another map's MyLevel without copying it to yours. This saves on filesize, but you must be certain that anyone using your map has the resource map too.

# Open your map
# Open the appropriate [[Legacy:Resource Browser|resource browser]]
# Go to load a new package
# In the file chooser, navigate out of the current folder and into the maps folder
# Open the map file whose resource you want
# Place the resource in your map

==Related Topics ==
* See [[Legacy:Package|Package]] for more on resources and packages in general.
* [[Legacy:Import The Texture|Import The Texture]]
* [[Legacy:Level Screenshot|Level Screenshot]]

==Discussion==

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4445</id>
      <timestamp>2007-12-11T15:04:24Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''MyLevel''' is a special [[Legacy:Package|package]] name in [[Legacy:UnrealEd|UnrealEd]]. If an [[Legacy:Unreal Resource|Unreal resource]] such as a texture or static mesh is listed as being in the package &quot;MyLevel&quot;, that means it is embedded in the map, and not in a package file on your hard drive. The MyLevel file doesn't actually exist. The word &quot;MyLevel&quot; is a magic keyword that works as an alias for your map file itself. &quot;MyLevel&quot; is often called a ''pseudopackage''.  

It is in the MyLevel pseudo-package that you must import the [[Legacy:Level Screenshot|level screenshot]] that the game displays in the map browser.

==Overview==

===Pros===
* Easier to distribute a map as a single file. Reduces confusion and makes your map easy to install
* Reduces clutter in the separate folders: this is by far the best solution if you just want one or two new textures for a map, instead of adding new files with each map with the increased possibility of errors.
* Reduces File Size slightly:
;Zip file with a 255,0,0 color (pure red) 64x64 texture Mylevel package on the default cube builder : 1.85 K 
;Zip file with a 255,0,0 color (pure red) 64x64 texture in a separate package on the default cube builder : 2.06 K
* Removes the risk of texture package name/contents clashes.

===Cons===
* If you have custom textures used in a lot of maps, every map would have to include the textures again. 
** Can be tricky to reuse textures in a new map (in theory it should be possible by just opening the maps in sequence but the support in unrealed for this is a little buggy)
** Duplication between maps will waste bandwidth time and disk space.
* The download system in UT does not support resume, therefore smaller sizes for individual files result in less wastage from incomplete downloads and more chances of eventually getting connected to the server.
* This does not work for sounds in Ravenshield.  It will just create a file in /sounds named MyLevel.sbo.  This might work for 22khz mono and lower, but seriously 22khz?  This isn't Duke Nukem 3D.

==Instructions==

===Embedding new resources ===

# Create or import a new resource in UnrealEd, like a sound, a texture, or a class. When you are asked to give a package name, put &quot;MyLevel&quot;. The case doesn't matter, so &quot;mylevel&quot;, &quot;MYLEVEL&quot;, &quot;mYlEvEl&quot;, etc are all the same thing.
# Use the new resource somewhere in the current map or UnrealEd will discard it when the map is saved.  If you embed a resource in the Mylevel virtual package and close UnrealEd without using it somewhere in your map, your unused resources will be lost. Ued will automatically get rid of unused resources to save space and memory.
# Save the map.
# '''''DON'T save the MyLevel package.''''' If you save it, bad things happen! 

If you have a resource already used in a map, but residing in an existing package, moving it to MyLevel is somewhat harder. You generally need to export it and re-import it.

===Embedding resources from existing packages ===

See [[Legacy:Embedding Code|Embedding Code]].  The same also works with .utx, .uax, or, .umx files.

For textures which are already used in a map:
# export each one to PCX
# reimport

# use the Texture Replace tool, or SHIFT+T to select all surfaces of the same texture 
# reapply the MyLevel version of the same texture

===Embedding resources from another map's MyLevel===

If another map has a resource embedded, you can copy this to your own map.

Do not quit UnrealEd at any point in the following.

# Open the other map
# Open your map
# Select the resource in the appropriate [[Legacy:Resource Browser|resource browser]]
# Place it in your map
# Save your map

===Referring to resources in another map's MyLevel===

You can use a resource that is embedded in another map's MyLevel without copying it to yours. This saves on filesize, but you must be certain that anyone using your map has the resource map too.

# Open your map
# Open the appropriate [[Legacy:Resource Browser|resource browser]]
# Go to load a new package
# In the file chooser, navigate out of the current folder and into the maps folder
# Open the map file whose resource you want
# Place the resource in your map

==Related Topics ==
* See [[Legacy:Package|Package]] for more on resources and packages in general.
* [[Legacy:Import The Texture|Import The Texture]]
* [[Legacy:Level Screenshot|Level Screenshot]]

==Discussion==

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mychaeel</title>
    <id>1810</id>
    <revision>
      <id>4440</id>
      <timestamp>2006-12-12T17:23:55Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel''', or commonly called '''Mych''' for short.  In real life, Michael Buschbeck.

Reachable via mychaeel@planetunreal.com or mychaeel@beyondunreal.com, or sometimes in #utjb or #unrealwiki on irc.enterthegame.com.

'''Don't write me emails with generic coding or mapping questions.'''  If at all, you will likely get a reply that doesn't go beyond a friendly pointer to BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development] forums and the [[Legacy:Home Page|Unreal Wiki]].  I'm a regular at both places.

If you choose to ignore this warning and send me such an email anyway, at least make sure it's '''plain text''', uses '''proper spelling and grammar''' and observes the minimum requirements of '''common courtesy''' such as a friendly greeting and a mention of your (nick)name.  That still doesn't guarantee that I won't simply ignore it, but the chances are slightly higher that I don't.

==UnrealScript==




{{innerbox| Mych said he wants to completely rewrite Jailbreak. And when Mych says &quot;completely rewrite&quot; &amp;ndash; duck! Flying code!

 : ''[[Legacy:Tarquin|tarquin]]''

}}






{{innerbox| My first version code is ''really'' ugly. I said this once to Mych, he took a look and said &quot;I see what you mean,&quot; which is Mych-speak for &quot;Dear God, man, did you write that or did your cat jump on the keyboard? How could you let such code live? Can't you see it's ''suffering''?&quot;

 : ''[[Legacy:Tarquin|tarquin]]''

}}



Started UnrealScripting in early April 2001 with a small mutator called '''JBPickups''' for UT [[Legacy:Jailbreak|Jailbreak]].  Next was '''JBMadmen''', another small Jailbreak mutator, and cooperation with Daikiki for the Jailbreak 205 patch.  Started working on the '''[[Legacy:Screen|Screen]]''' component and stumbled over the mystery that is replication for the first time, and released the first version of Screen end-April 2001.  Got involved in creating '''[[Legacy:Jailbreak|UTJB 205]]''' and '''[[Legacy:Jailbreak|Jailbreak III]]''' and was invited to join '''0fus''', the creators of '''Strangelove'''.  Released '''[[Legacy:MeshMaker|MeshMaker]]''', a Windows tool for converting UnrealEd prefabs to decorations, in December 2001, and a small actor for Duke Nukem-like cameras called '''[[Legacy:CameraSpot|CameraSpot]]''' shortly after.

==Ramblings==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modding Etiquette]] &amp;ndash; how to make people ''like'' your mod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod Startups]] &amp;ndash; why many mod ideas are doomed in the moment they're made public, and how to prevent that

==Related Links==

===Projects===

* [http://www.planetjailbreak.com PlanetJailbreak] &amp;ndash; home of Jailbreak and its community (UT, UT2003)
* [http://www.0fus.com 0fus] &amp;ndash; the creators of Strangelove (UT) ''(link dead as of 03.29.04 &amp;ndash;12B)''
* [http://www.planetunreal.com/teamvortex/ Team Vortex] &amp;ndash; the creators of Deathball (UT2003)

===Tools and Add-Ons===

* [[Legacy:UMake|UMake]] &amp;ndash; wraps the process of compiling an Unreal project up in a slick user interface (UT, UT2003)
* [[Legacy:Spectate Bots|Spectate Botmatch]] &amp;ndash; provides botmatch spectating capabilities with some extra goodies (UT2003)
* [[Legacy:Screen|Screen]] &amp;ndash; a new dimension in dynamic textures for Unreal mappers (UT)
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; converts UnrealEd prefabs to decorations (UT)
* [[Legacy:CameraSpot|CameraSpot]] &amp;ndash; provides the functionality of Duke Nukem-like surveillance cameras (UT)

===More Talk===




{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson|Samuel Johnson]]''

}}



* [[Legacy:A Bug'S Life|A Bug's Life]] &amp;ndash; trying to explain why a good bug report should look like what a good bug report looks like
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal|Developer Journal]] &amp;ndash; thoughts that popped up during Jailbreak development

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4441</id>
      <timestamp>2006-12-01T03:11:36Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel''', or commonly called '''Mych''' for short.  In real life, Michael Buschbeck.

Reachable via mychaeel@planetunreal.com or mychaeel@beyondunreal.com, or sometimes in #utjb or #unrealwiki on irc.enterthegame.com.

'''Don't write me emails with generic coding or mapping questions.'''  If at all, you will likely get a reply that doesn't go beyond a friendly pointer to BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development] forums and the [[Legacy:Home Page|Unreal Wiki]].  I'm a regular at both places.

If you choose to ignore this warning and send me such an email anyway, at least make sure it's '''plain text''', uses '''proper spelling and grammar''' and observes the minimum requirements of '''common courtesy''' such as a friendly greeting and a mention of your (nick)name.  That still doesn't guarantee that I won't simply ignore it, but the chances are slightly higher that I don't.

==UnrealScript==




{{innerbox| Mych said he wants to completely rewrite Jailbreak. And when Mych says &quot;completely rewrite&quot; &amp;ndash; duck! Flying code!

 : ''[[Legacy:Tarquin|tarquin]]''

}}






{{innerbox| My first version code is ''really'' ugly. I said this once to Mych, he took a look and said &quot;I see what you mean,&quot; which is Mych-speak for &quot;Dear God, man, did you write that or did your cat jump on the keyboard? How could you let such code live? Can't you see it's ''suffering''?&quot;

 : ''[[Legacy:Tarquin|tarquin]]''

}}



Started UnrealScripting in early April 2001 with a small mutator called '''JBPickups''' for UT [[Legacy:Jailbreak|Jailbreak]].  Next was '''JBMadmen''', another small Jailbreak mutator, and cooperation with Daikiki for the Jailbreak 205 patch.  Started working on the '''[[Legacy:Screen|Screen]]''' component and stumbled over the mystery that is replication for the first time, and released the first version of Screen end-April 2001.  Got involved in creating '''[[Legacy:Jailbreak|UTJB 205]]''' and '''[[Legacy:Jailbreak|Jailbreak III]]''' and was invited to join '''0fus''', the creators of '''Strangelove'''.  Released '''[[Legacy:MeshMaker|MeshMaker]]''', a Windows tool for converting UnrealEd prefabs to decorations, in December 2001, and a small actor for Duke Nukem-like cameras called '''[[Legacy:CameraSpot|CameraSpot]]''' shortly after.

==Ramblings==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modding Etiquette]] &amp;ndash; how to make people ''like'' your mod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod Startups]] &amp;ndash; why many mod ideas are doomed in the moment they're made public, and how to prevent that

==Related Links==

===Projects===

* [http://www.planetjailbreak.com PlanetJailbreak] &amp;ndash; home of Jailbreak and its community (UT, UT2003)
* [http://www.0fus.com 0fus] &amp;ndash; the creators of Strangelove (UT) ''(link dead as of 03.29.04 &amp;ndash;12B)''
* [http://www.planetunreal.com/teamvortex/ Team Vortex] &amp;ndash; the creators of Deathball (UT2003)

===Tools and Add-Ons===

* [[Legacy:UMake|UMake]] &amp;ndash; wraps the process of compiling an Unreal project up in a slick user interface (UT, UT2003)
* [[Legacy:Spectate Bots|Spectate Botmatch]] &amp;ndash; provides botmatch spectating capabilities with some extra goodies (UT2003)
* [[Legacy:Screen|Screen]] &amp;ndash; a new dimension in dynamic textures for Unreal mappers (UT)
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; converts UnrealEd prefabs to decorations (UT)
* [[Legacy:CameraSpot|CameraSpot]] &amp;ndash; provides the functionality of Duke Nukem-like surveillance cameras (UT)

===More Talk===




{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson|Samuel Johnson]]''

}}



* [[Legacy:A Bug'S Life|A Bug's Life]] &amp;ndash; trying to explain why a good bug report should look like what a good bug report looks like
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal|Developer Journal]] &amp;ndash; thoughts that popped up during Jailbreak development

----

[[:Category:Legacy Personal Page]]

----

'''Blip2:''' Would it be possible for me to get a copy of the wiki.pl to have a look at (without admin pass etc.) tarquin has a dead hard drive and said to ask you?

'''Jrubzjeknf:''' Mych, get your ass over at the Jailbreak forums! I've been trying to get in touch with you for months, but you're not reacting! WE NEED YOU! :)

{{innerbox|&quot;What a strange person.&quot;

}}

&gt;'''&amp;mdash;Sir Galahad, Knight of the Round Table'''
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4442</id>
      <timestamp>2006-12-12T16:22:53Z</timestamp>
      <contributor>
        <ip>Jrubzjeknf</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel''', or commonly called '''Mych''' for short.  In real life, Michael Buschbeck.

Reachable via mychaeel@planetunreal.com or mychaeel@beyondunreal.com, or sometimes in #utjb or #unrealwiki on irc.enterthegame.com.

'''Don't write me emails with generic coding or mapping questions.'''  If at all, you will likely get a reply that doesn't go beyond a friendly pointer to BeyondUnreal's [http://forums.beyondunreal.com/forumdisplay.php?forumid=13 Unreal Development] forums and the [[Legacy:Home Page|Unreal Wiki]].  I'm a regular at both places.

If you choose to ignore this warning and send me such an email anyway, at least make sure it's '''plain text''', uses '''proper spelling and grammar''' and observes the minimum requirements of '''common courtesy''' such as a friendly greeting and a mention of your (nick)name.  That still doesn't guarantee that I won't simply ignore it, but the chances are slightly higher that I don't.

==UnrealScript==




{{innerbox| Mych said he wants to completely rewrite Jailbreak. And when Mych says &quot;completely rewrite&quot; &amp;ndash; duck! Flying code!

 : ''[[Legacy:Tarquin|tarquin]]''

}}






{{innerbox| My first version code is ''really'' ugly. I said this once to Mych, he took a look and said &quot;I see what you mean,&quot; which is Mych-speak for &quot;Dear God, man, did you write that or did your cat jump on the keyboard? How could you let such code live? Can't you see it's ''suffering''?&quot;

 : ''[[Legacy:Tarquin|tarquin]]''

}}



Started UnrealScripting in early April 2001 with a small mutator called '''JBPickups''' for UT [[Legacy:Jailbreak|Jailbreak]].  Next was '''JBMadmen''', another small Jailbreak mutator, and cooperation with Daikiki for the Jailbreak 205 patch.  Started working on the '''[[Legacy:Screen|Screen]]''' component and stumbled over the mystery that is replication for the first time, and released the first version of Screen end-April 2001.  Got involved in creating '''[[Legacy:Jailbreak|UTJB 205]]''' and '''[[Legacy:Jailbreak|Jailbreak III]]''' and was invited to join '''0fus''', the creators of '''Strangelove'''.  Released '''[[Legacy:MeshMaker|MeshMaker]]''', a Windows tool for converting UnrealEd prefabs to decorations, in December 2001, and a small actor for Duke Nukem-like cameras called '''[[Legacy:CameraSpot|CameraSpot]]''' shortly after.

==Ramblings==

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modding Etiquette]] &amp;ndash; how to make people ''like'' your mod
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Mod Startups]] &amp;ndash; why many mod ideas are doomed in the moment they're made public, and how to prevent that

==Related Links==

===Projects===

* [http://www.planetjailbreak.com PlanetJailbreak] &amp;ndash; home of Jailbreak and its community (UT, UT2003)
* [http://www.0fus.com 0fus] &amp;ndash; the creators of Strangelove (UT) ''(link dead as of 03.29.04 &amp;ndash;12B)''
* [http://www.planetunreal.com/teamvortex/ Team Vortex] &amp;ndash; the creators of Deathball (UT2003)

===Tools and Add-Ons===

* [[Legacy:UMake|UMake]] &amp;ndash; wraps the process of compiling an Unreal project up in a slick user interface (UT, UT2003)
* [[Legacy:Spectate Bots|Spectate Botmatch]] &amp;ndash; provides botmatch spectating capabilities with some extra goodies (UT2003)
* [[Legacy:Screen|Screen]] &amp;ndash; a new dimension in dynamic textures for Unreal mappers (UT)
* [[Legacy:MeshMaker|MeshMaker]] &amp;ndash; converts UnrealEd prefabs to decorations (UT)
* [[Legacy:CameraSpot|CameraSpot]] &amp;ndash; provides the functionality of Duke Nukem-like surveillance cameras (UT)

===More Talk===




{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson|Samuel Johnson]]''

}}



* [[Legacy:A Bug'S Life|A Bug's Life]] &amp;ndash; trying to explain why a good bug report should look like what a good bug report looks like
* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer Journal|Developer Journal]] &amp;ndash; thoughts that popped up during Jailbreak development

----

[[:Category:Legacy Personal Page]]

----

'''Blip2:''' Would it be possible for me to get a copy of the wiki.pl to have a look at (without admin pass etc.) tarquin has a dead hard drive and said to ask you?

'''Jrubzjeknf:''' Mych, get your ass over at the Jailbreak forums! I've been trying to get in touch with you for months, but you're not reacting! WE NEED YOU! :)

{{innerbox|&quot;What a strange person.&quot;

'''&amp;mdash;Sir Galahad, Knight of the Round Table'''

}}

'''Jrubzjeknf:''' Ok, if a comment on your personal page won't cut it, then I guess I'll have to go for a whole page. Perhaps something called [[Legacy:MYCH|MYCH]]!!
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mychaeel/Developer Journal</title>
    <id>1764</id>
    <revision>
      <id>4328</id>
      <timestamp>2006-07-15T16:52:28Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries, but feel free to add comments.''

}}

==December 14, 2002==

{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson]]''

}}

No effort is wasted if you've learned something from it.  (Though that doesn't mean that the same time couldn't have been spent more effectively.)

Occasionally I'm stuck in a dead end of my own design and can't seem to find my way out of it.  The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on.  So I linger a bit longer and cudgel my brains for some ''other'' way to reach my goal than backing up.

Deleting an evening's worth of good code requires an effort, but if it relieves me of a week's worth of trying not to scratch it, it's worth it.

===Comments===

'''Tarquin:'''  &quot;The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on. &quot; &amp;ndash; I do that all the time in mapping. I end up with multiple copies of the same area, each one trying a different solution...  What usually happens is I eventually work up the courage to start from scratch.

'''Mychaeel:''' That's exactly what happens to me too.  :-)  Realizing when it's better to scratch a few good ideas in favor of an entirely different approach (maybe even one with a slightly different outcome than what I originally figured) is a learning process.

==December 20, 2002==

Note to self:  Not assuming that other people's contributions to a testing environment are free of bugs can be a huge time saver.

==January 17, 2003==

Incidentally I dug out the code I scratched in the first entry on this page and used it for a related, but different purpose where it actually fits in.  (Good thing I never really delete something for good unless I'm ''absolutely'' sure it won't ever be of any use anymore.)

The code is part of Jailbreak's bot support and is supposed to let bots make an educated guess where an enemy player is currently located after the enemy gave his position away by triggering a release switch.  Naturally, if there's only a single relase switch, all that boils down to a single possible location.  Where it gets interesting is if there are ''multiple'' release switches and the bots actually have to ''guess'' which one the player triggered.

My code does that based on the last known location of a player (directly after a round starts, or after a spawn in freedom after winning an arena match, or after being released from jail), the walking distance (using the path network) to all of the release switches and the time that passed since the player's location was known last.  With that and a more or less arbitrarily chosen probability distribution for a player's distance from his starting point after a given amount of time (something based on half a Gaussian) bots take a random guess weighed by the respective probability of the enemy being at any of the possible switches.

==January 18, 2003==

Wrote about [[Legacy:A Bug'S Life|A Bug's Life]] hoping that it'll inspire our bug hunters to posting better bug reports than they occasionally did for Jailbreak III.

==January 23, 2003==

UT2003's speech menu redefines the terms &quot;non-extensible&quot; and &quot;hard-coded.&quot;  I'm sure there's a way into it though &amp;ndash; I just haven't worked it out yet.  (Subclassing [[Legacy:ExtendedConsole|ExtendedConsole]] is, hardly surprising, not an option.)

==January 24, 2003==

[[Image:Legacy_speechmenuhack-ordermenu.jpeg|left|]]

Apparently there ''is'' a way.  The &quot;Team tactics&quot; menu item here opens a submenu where you can select one of a set of tactics for your team.  (All other menu items open a list of players you can order.)

Getting it to display your own entries is the easy part, to be sure &amp;ndash; being notified when the player selects one of the entries requires some more code insight.  It is possible though, and I'm just about to implement it.

If this works out, I'll describe the hack in detail somewhere on the Wiki.

==January 25, 2003==

[[Image:Legacy_speechmenuhack-tacticsmenu.jpeg|right|]]

It works.  When you select one of the entries in the tactics menu displayed to the right, SetOrders in [[Legacy:TeamAI|TeamAI]] is notified and gets a chance to intercept the selection.  The default implementation of SetOrders puts the following message into the log:

  ScriptLog: Team New orders TacticsNormal JB-IronMan.xPlayer0

TacticsNormal is a label I assigned to that menu item; everything else in that message is from Epic's own code.  Any unwanted cosmetic side effects can be controlled by overwriting SetOrders with your own code.

There's relatively little code involved in the whole hack:  One piece of code that's executed in some actor's client-side Tick (I used Tick in our [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]] subclass, but it could be anywhere) that modifies the speech menu's behavior; and a piece of code that modifies some properties of [[Legacy:Bot|Bot]]s when they're spawned.  And, of course, the code in SetOrders in [[Legacy:TeamAI|TeamAI]] that does whatever you want your custom menu item to do.

Modifying the speech menu that way has its limitations, of course.  There are only very few &quot;slots&quot; left for custom notifications (exactly nine), and custom submenus like my &quot;Team Tactics&quot; menu are only possible for menu items in the &quot;Orders&quot; submenu.  Details to follow.

==February 3, 2003==

So little time, and so much to do... but I don't regret spending the last weekend skiing in Tyrol.  ;-)

[[Legacy:UMake|UMake]] should be updated and released in version 1.2.  [[Legacy:Spectate Bots|Spectate Botmatch]] has a host of new functionality to be implemented, despite Epic refitting a &quot;Spectate&quot; button in the Instant Action dialog with the last patch.  Deathball needs some small code tweaks on my part.  [[Legacy:Jailbreak|Jailbreak]] development must continue.  And in addition to that there's some Perl coding work I'll actually get paid for and whose deadline is approaching sometime in mid-February.

==February 10, 2003==

If you want to make ''absolutely sure'' that a certain thread in a forum remains undiscovered, stick it to the top and place the words &quot;Read this before posting&quot; in its subject.

==February 14, 2003==

Bots in jail (in Jailbreak) should idly walk around, occasionally lie down and sleep, and engage in hammer fights if there's an eligible opponent.

It seems to me that maybe the best way to achieve all this is creating several custom [[Legacy:ScriptedSequence|ScriptedSequence]] subclasses, one for &quot;walking around&quot; (to select roam destinations in jail only), one for &quot;lying down and sleeping&quot; and one for &quot;engage in jail fight (and stop when the opponent opts out)&quot;.  The latter two will probably require custom scripted ''actions'' too:  &quot;start sleeping,&quot; &quot;wait and occasionally snore&quot; and &quot;stand up&quot;; and whatever is required to make a bot attack an opponent with an arbitrary melee or non-melee weapon.

Sounds like I'll better release alpha 4 ''before'' tackling that...

==February 15, 2003==

UT2003 bots don't really support being animated by means of a [[Legacy:ScriptedSequence|ScriptedSequence]] &amp;ndash; even if you manage to make them play a certain animation, the [[Legacy:XPawn|xPawn]] reverts to an idling pose as soon as that animation has ended.  In addition, those idling animations are natively &quot;physics controlled.&quot;

What's possible though is temporarily resetting the ''names'' of the idling animations to refer to non-existent animations.  That's a pretty heavy-handed approach, but it works (and puts a bunch of warning messages into the log).

'''Update:'''  ZappyAd pointed me to the bPhysicsAnimUpdate flag in class [[Legacy:Pawn|Pawn]].  Setting it to False disables the native &quot;physics-controlled&quot; animations, and indeed, it works well.

==February 17, 2003==

Scratched sleeping bots.  Implemented bots that hammer-fight in jail with human players instead.  Much more fun and rewarding.

==February 24, 2003==

I figured out the hard way that even custom game types can't simply replace the game's [[Legacy:TeamInfo|TeamInfo]] actors by subclassing [[Legacy:XTeamRoster|xTeamRoster]].  One of our bug hunters reported that setting up a game with custom bots broke crucial parts of the gameplay, and a look into the log revealed that UT2003 didn't use Jailbreak's custom TeamInfo subclass as configured in the the game type's DefaultEnemyRosterClass variable but instances of [[Legacy:TeamBlueConfigured|TeamBlueConfigured]] and [[Legacy:TeamRedConfigured|TeamRedConfigured]] instead.

So, once more, I'm ending up ''attaching'' an actor of mine to a stock UT2003 actor instead of replacing the stock actor's class by my own.  Jailbreak did so with several other gameplay-relevant classes (not just TeamInfo) before already &amp;ndash; PlayerReplicationInfo, for one, instead of introducing a custom PlayerReplicationInfo subclass.

In Unreal Tournament &quot;attaching&quot; an actor to another actor was more or less limited to the possibility of setting the attached actor's owner to the actor it was attached to and then using the ChildActors iterator to retrieve the attached actor when requested.  (Or any variant of that, though those that come into my mind are all equally inefficient.)

In UT2003 however every actor can have its own inventory by means of the Inventory variable which is declared in class [[Legacy:Actor|Actor]].  Traveling an actor's inventory chain is fast and efficient compared to using an iterator, so I implemented a generic abstract superclass for info actors that are &quot;attached&quot; to another actor, including code that automatically sets up a linked list of all &quot;actor tag&quot; actors of the same class and a mechanism that, if so desired, communicates registration and unregistration of an &quot;actor tag&quot; to all clients even during its lifetime.

Well, anyway, the TeamInfo problem was quickly fixed thanks to that mechanism.

===Comments===

'''Wormbo:''' Actually the inventory chain was available to all actors in Unreal v205 already. (Yes, I really have that code here... :D)

'''Mychaeel:''' Hmm.  I don't, but I do have the Unreal Tournament sources and... behold, you're right.  Oh well.  :-)

==March 17, 2003==

When I was implementing a new feature yesterday I noticed that I had to change a remotely related part of the code in order to avoid some small lag in a visual effect &amp;ndash; no big deal, but something that deserved to be fixed.  So I opened the class responsible for the delay, found the place where I had not anticipated the need for some direct connection between two pieces of code in my original design, and added it.

Then I realized that this was the third or fourth time I had added a bit of code at that place to accommodate a new requirement that had popped up since I had initially designed that class.  Each time I had addressed a small particular problem, each time I had added a bit of code to fix it; and while each of those changes were small and simple, the whole code grew more complicated and less elegant with every change I applied to it.

Time to scratch that part of the code and rethink its design with all old ''and'' new requirements in mind.

Changing, fixing and tweaking code a small part at a time inevitably leads to bloated, unelegant, bug-prone constructions sooner or later.  That's commonly called [http://info.astrian.net/jargon/terms/f/feature_creep.html feature creep] &amp;ndash; and after a time any software suffering from it becomes so unmaintainable that adding, testing and debugging a new feature becomes almost as much work as rewriting everything from scratch.  It's a developer's nightmare.

So sometimes it really pays off to start redesigning parts of a program before feature creep sets in.  The difficult part is to realize that before it's too late; and even more so for people not directly involved in the development process who can't relate to the idea of elegant, straightforward and bug-resistant program design.  Coding for a mod whose development is being slowly ground to a halt by somebody in charge adding more and more features that were never part of the original design can be a pretty frustrating experience.

==May 4, 2003==

ElapsedTime and RemainingTime in [[Legacy:GameReplicationInfo|GameReplicationInfo]] aren't replicated all the time in [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] &amp;ndash; that's for saving bandwidth, I suppose, and that must be a good thing.

Bad thing is that it doesn't work too well.  The idea is that ElapsedTime and RemainingTime are replicated ''once'' when the whole GameReplicationInfo actor is initially replicated to the client, and then the client increases ElapsedTime and decreases RemainingTime once per second all by itself.  Sounds simple enough, but somehow the initial value replication doesn't seem to work &amp;ndash; and that's not just in Jailbreak, it's exactly the same in vanilla Deathmatch.  Consequently, the time display in the scoreboard is out of sync with the actual game time.

The programmer who thought that up at Digital Extremes or Epic must have anticipated some of those problems though, because it actually gets a bit more complicated than what I described above.  In addition to ElapsedTime and RemainingTime there's a variable called RemainingMinute that is replicated every time it is changed.  The Timer event in [[Legacy:DeathMatch|DeathMatch]] sets it to the current value of RemainingTime every full minute.  GameReplicationInfo in turn picks it up and copies the replicated value of RemainingMinute to the client's local RemainingTime, thus re-syncronizing RemainingTime with the game's actual time.

Since I'd like Jailbreak's spiffy game time clock in the scoreboard to show the right time at ''all'' times though I guess I'll have to look for a fix.

'''Update:'''  Two distinct problems there:  Firstly, the initially replicated value of RemainingMinute always resets RemainingTime to the last full minute on mid-game connect; secondly, there can be an almost arbitrary delay for precaching textures and other content between PostNetBeginPlay (when the values for ElapsedTime and RemainingTime have just been replicated) and the first call of Timer (where they're updated client-side).

==May 7, 2003==

...so in Jailbreak the client sends a replicated function call to the server which directly responds by sending another replicated function call back to the client along with the current server time.  The client calculates a time offset between itself and the server; and if it also takes the time into account it took the response function to be called on the client after the synchronization request had been issued, it's possible to synchronize client and server time to a precision of approximately a tenth of a second.

That happens once a client has finished loading and precaching the game.  [[Legacy:GameReplicationInfo|GameReplicationInfo]] only replicates the server time the match started, and determines ElapsedTime and RemainingTime based on the current client time and its offset to the server time.

===Comments===

'''Kuhal:''' I am interested in the replication behaviour you have discovered here.  It may lead to an explanation of some behaviour I am getting during a pause in a network game.  The client's countdown clock rapidly counts down the seconds that have passed while the match was paused.  While I am certain the remaining time on the server has indeed been paused, it seems that the client thinks it knows better and catches up.  The weird thing is that the game ends &quot;on time&quot; when the client ramaining time reaches 00:00.  Are there any more references to how these attributes work in UT?

==May 22, 2003==

&quot;All you can eat&quot; for 5 ? in the uni's cafeteria today.  Burp.

Jailbreak's [http://www.planetjailbreak.com/misc/jailbreak2003-scores-5.jpg?link scoreboard] displays a minimap showing the current locations of your teammates.  In network games that means that those positions have to be replicated to all clients.  That leads to jerky movement of the dots on the minimap because the locations are updated only every couple of frames, not every (client-side) frame.

That problem can be somewhat relieved by using the [[Legacy:Pawn|Pawn]]s' actual positions when they happen to be present on the respective client; but the other player positions still jerk.  Some sort of motion prediction or motion interpolation should be built in; and preferably in a way that does not multiply the bandwidth requirements of the whole separate location replication business &amp;ndash; my bandwidth conscience is striking already without that.  That rules out simply replicating the player's velocity along with their position.

Since the minimap is by design mini, the updates usually don't go beyond a movement of a couple of pixels each time; and it's more to show the players' rough current whereabouts anyway, not their precise locations.  Maybe an algorithm that &quot;learns&quot; about the frequency of the position updates and interpolates between the ''last two'' replicated known points (and beyond if the next update isn't received in time) might yield smooth and reasonably accurate results.

Unrelated to that I also wonder whether I should keep up the splines connecting the player names to their location dots on the minimap.  I'm starting to think that simply attaching a small tag with the player's name and possibly a health bar would be nicer.

==May 24, 2003==

The principle works, but the movement is still jerky.  Motion prediction doesn't work well because the time that passes between a replicated variable being set on server-side and its new value being received client-side varies wildly:  So even when the player is moving in a straight line at a constant velocity, the client-side predicted location has to be corrected with every update.

Now I'm pursuing a different idea &amp;ndash; adding the received location updates to a client-side list and trying to have the client interpolate along that list of locations, choosing its velocity independently as to keep up with the succession of new locations that are added to the list.

When the client-side interpolated location information reaches the last known location in the list and the player is not known to have stopped moving server-side, it extrapolates the player's movement using the last known direction and velocity.  That can even be used to save bandwidth:  The server only sends another update when it expects the client-side extrapolation to have deviated from the player's actual location too much.

==May 25, 2003==

To my mild surprise what I've implemented now works much better than I had dared to hope.

The server sends occasional location updates to all clients; and in addition to that, the absolute value of the player's movement velocity.  The ''direction'' of the player's movement is derived from the succession of location updates; as described in the previous entry it's impractical to derive the velocity as well from the location updates because time differences can't be relied upon when network replication is concerned.

Using the absolute value of the player's velocity instead of the velocity vector itself saves some bandwidth &amp;ndash; two thirds in the size of the replicated data item alone (vector consists of three floats, its absolute value of only one), and it's also much less likely to change (the absolute value remains the same even when the player changes his movement direction or strafes).

Still, with every location update there's bound to be a small deviation between the client-side extrapolated location and the updated absolute location sent by the server.  Client-side, that deviation is simply smoothed out on a short time scale &amp;ndash; that way the client-side motion simulation never suffers of any jerking motions, only small variations in movement speed which are virtually impossible to notice.

What I haven't implemented yet is the aforementioned optimization of location updates when a player keeps moving on a straight line for a while, thus making the client-side linear extrapolation sufficiently accurate even for longer periods between updates.  No actual player does that in a firefight, of course; but it's not all that unlikely to happen in general, especially given that without that optimization location updates would be sent with a frequency of about five times per second.

'''Update:'''  Reducing the number of location updates that way works fine as well.  When moving on a straight line several seconds may pass between two location updates while the client-side minimap location indicator still accurately shows the moving player's constantly changing location, smoothly picking up a later change in the player's movement direction.

==May 26, 2003==

Would it still be fun if there weren't always more problems awaiting a solution?

When reading my code again I realized that it wasn't at all robust against server-side updates that never reached a particular client.  While the mechanism doesn't rely on the time between two received updates anymore, it still assumes that the client gets to see every update the server sends &amp;ndash; and that may not necessarily be the case.  If the client misses one update, the client's idea of the player's movement direction will be completely off, especially since the server already sends only the minimum amount of updates that can be used to derive the direction.

So I have to make sure that the engine itself takes care that all clients always have a consistent set of information &amp;ndash; the engine must know that if a client misses one or several updates it is necessary to send the last ''two'' location updates to that client next time.  The easiest way to achieve that is by having two replicated location variables that are alternatingly set to the player's most current location &amp;ndash; the other one then contains the location one step earlier.

However, the problem isn't completely solved already by that.  Since those two variables (a two-element array, actually) are set alternatingly server-side (so that on each step only one of the values changes and has to be replicated), the client has no way to know which of the two replicated locations is the most current one &amp;ndash; and so it can only derive the axis on which the player is moving, but not whether the player is moving &quot;forward&quot; or &quot;backward&quot; on that axis.  The client needs one bit of extra information to resolve that ambiguity.

It's not as trivial as it may sound to derive a consistent notion of &quot;forward&quot; or &quot;backward&quot; for any given non-zero vector.  Simply trying to define &quot;forward&quot; and &quot;backward&quot; in respect to a certain fixed direction is ambiguous as soon as a vector is lying in the plane perpendicular to the chosen direction; so that won't work (or rather, it will, but only in ''almost'' all cases, which is unfortunately not enough &amp;ndash; Murphy knows).  So, the method I've chosen to define &quot;forward&quot; and &quot;backward&quot; takes the signum of the first vector component (X, Y, or Z, in that order) that is not zero &amp;ndash; that's guaranteed to be non-zero for any non-zero vector, and the resultant value changes its own sign when the vector does.

To sum it up, the client now has ''two'' replicated location values without knowing which one is the most current one; so it calculates the vector difference between those two and applies the notion of &quot;forward&quot; or &quot;backward&quot; on it (described above), checks it against the separately replicated bit of information sent by the server and changes the vector's sign if necessary.  And Bob's your uncle.  (See what Terry Pratchett does to one's vocabulary?)

But... wouldn't it have been much easier and just as effective if I had simply replicated an extra bit of information telling the client which of the two locations is the most current one, instead of laboriously introducing weird notions of &quot;forward&quot; and &quot;backward&quot; vectors? &amp;ndash; Easier it would be but not as effective.  That bit would have to be changed every single time the server does an update even if the player only made a slight correction in his movement direction; the method I've chosen only changes that bit when the player's movement direction changes from &quot;forward&quot; to &quot;backward&quot; (in the special absolute sense described above), so it only ''occasionally'' requires a change instead of ''always''.

'''Addendum:'''  I actually have it implemented by replicating that extra bit of orientation information as ''the velocity's signum'' &amp;ndash; in an attempt to save bandwidth when both velocity and orientation change at the same time (and it also wouldn't take any more bandwidth when the velocity alone changes).  Upon writing about it here it suddenly occurred to me that this maybe wasn't all that smart after all &amp;ndash; if ''only'' the orientation changes but the velocity doesn't, the engine still has to replicate an entire float value even though only a single bit changed.  Would it be more efficient to go the straightforward way and use a separately replicated bool variable?  I'll keep a close eye on which updates actually need to be sent by the server in a real-game situation and decide then...

(And that's also why writing in this &quot;developer journal&quot; is worth the effort even if nobody's actually reading it &amp;ndash; it makes me critically review what I've coded.  It's a one-person code audit, so to speak.)

==May 30, 2003==

So, at last, the scoreboard is feature-complete.  Phew.  I dread writing the log for the CVS commit and getting JDN up to date... but the sooner I start, the sooner I'll be finished.

Showing the Jailbreak scoreboard has a noticeable impact on framerate at the moment &amp;ndash; I haven't been able to spot a certain, single part of the code that's responsible for the majority of the framerate hit.  Disabling certain scoreboard elements one at the time shows that the clock takes as much performance as the dotted splines do, and the code that updates the scoreboard's state with the game's live information isn't far behind.  The performance hit seems to be evenly spread over most the code.

Especially something like the clock could benefit from some sort of graphics cache &amp;ndash; it changes only once per second, but has to be rendered every frame.  If I could draw the clock on a [[Legacy:ScriptedTexture|ScriptedTexture]] and then on the screen, and update the ScriptedTexture only once per second, that might save several milliseconds per frame... given that I'd manage to get alpha transparency to work on a ScriptedTexture; I wouldn't like the clock to be displayed on a rectangular black background, not even for performance's sake.

Maybe there is a way to use alpha transparency on a ScriptedTexture.  During my experiments around drawing a map screenshot on a ScriptedTexture for the scoreboard minimap I noticed that the ScriptedTexture's DrawPortal function did, somehow, alter the ScriptedTexture's alpha plane &amp;ndash; it seems that wherever DrawPortal renders a normal solid texture, the ScriptedTexture will be completely transparent, but where an alpha-masked texture is drawn on the ScriptedTexture by DrawPortal the ScriptedTexture adopts its alpha mask there.  It's all pretty strange.

I also remember that in Unreal Tournament a ScriptedTexture could have a &quot;background texture&quot; that was used to initialize the ScriptedTexture canvas every frame.  I haven't found a corresponding property in UT2003's ScriptedTexture class, but maybe it's reusing an inherited property for that purpose &amp;ndash; FallbackMaterial maybe?  Gotta try that when I'm home.

==May 31, 2003==

I've finally decided that the manual implementation docs I had put on JDN have outlived their purpose &amp;ndash; they originally were the detailed specifications for the code before UT2003 was released, but after the classes were actually created there's little point in still keeping the specs around and manually up-to-date.

I tried [[Legacy:UnCodeX|UnCodeX]]'s HTML export, and while it works fine, it's information overflow.  I think people interested in Jailbreak 2003 implementation details do better with syntax-highlighted source code alone &amp;ndash; I tried to document it well after all.

The Wiki script running JDN now supports an extra parameter for the &lt;code&gt;&lt;uscript&gt;&lt;/code&gt; tag that directly takes the sources from the CVS repository and renders them on the page.  It looks pretty neat and saves me lots of time keeping the specs consistent with the code.  Maybe I'll later add a DHTML feature for &quot;collapsing&quot; function bodys to keep only the comment headers visible by default.

'''Update:'''  Oh, and FallbackMaterial as a [[ScriptedTexture]]'s background texture does not work.  Guess I'm out of luck.


== June 4, 2003

I want to keep players from using their translocator to get out of jail the easy way, and I don't want them to be able to telefrag Bonus Pack monsters.

Unreal Tournament had a handy AllowTranslocation query function in [[DeathMatchPlus]] for that.  Whenever anybody, player or bot, tried to translocate, this function was called and had the opportunity to prevent the translocation attempt.

Unfortunately, there's nothing like that left in UT2003.  The only thing that remains is a function in [[SquadAI]] that's queried for whether a bot will try to translocate.  The code that prevents players from telefragging teammates is buried in the Translocate function in class [[TransRecall]] -- it's basically a hard-coded check whether two players' collision cylinders impinge.


The only ''possible'' way into this code is via the SameTeamAs function (class [[Controller]]) used there that in turn calls IsOnTeam (class [[GameInfo]]).  The game could pretend that monsters are on the same team as any player trying to telefrag them, but SameTeamAs is used by other parts of the game code as well, which makes (ab)using it to prevent monster telefrags not straightforward.

And it still leaves me with the question how to prevent players from translocating out of jail...

'''Update:'''  I've ended up with removing the translocator from jailed players' inventories.  It's not all that messy after all.

=== Comments

'''ZxAnPhOrIaN:''' Maybe make an actor or volume that kills the translocator beakon when you try to teleport out, killing the person.

'''ZedSquared''' (from a UT classic point of view, dunno if any of this is feasable in 2003) Have a spawnnotify that catches transloctargets and modifies their velocity to kick them back to the owner (or the middle of jail) if they're in the jail zone perhaps ... or maybe subclass translocator, give the modified one as default inv, and override the fire function to not work in jail ... probably duff ideas, just thinking aloud late at night :)

'''Mychaeel:''' I'd rather try not to replace the normal translocator to achieve the effect I'm looking for (plus, there's nothing like SpawnNotify in UT2003)... and I'd also like not to require mappers to put in special zones or volumes.  (Right now jails work with any volume or zone a mapper places -- [[match these tags|attaching]] them to a JBInfoJail actor makes them part of a jail.) -- I could simply take a player's translocator away when he enters jail and give it back when he leaves jail, but that seems a bit messy.

'''Foxpaw:''' I don't see the problem - can't you just disallow translocator use in jail like in Jailbreak for UT?

'''Wormbo:''' That's exactly the problem, there is no AllowTranslocation function like in UT which allows the gametype to prevent translocation or add various other effects like flagdrop etc.

'''Foxpaw:''' Well, in that case why not allow translocation in jail, and just have surfaces that make up the jail solid? That way the translocator beacon would not be able to be launched out of the prison so a player couldn't escape merely by translocating.

'''Mychaeel:''' That would be a mapper-based solution, but the past (Jailbreak III) has shown that even in jails that were meant to be airtight (and must have been in editor terms since there a jail was defined by a distinct zone) occasionally had collision &quot;gaps&quot; in them that allowed players to shoot or, possibly, throw a translocator target outside (JB-Raid).  Even if a jail really is airtight it may be possible to place the translocator target so that translocating to it will place the player outside jail (JB-Antipody).  Besides, some jails are meant to have open windows to the outside or escape routes that players should be able to walk, but not translocate through.


== June 6, 2003

The Jailbreak core to-do list has become pretty short.  Maybe, maybe, in a few weeks...


== June 8, 2003

BeyondUnreal's forum breakdown will leave Jailbreak's development forums completely empty when they're back up.  Most of the hundreds of postings in there I'd have liked to keep mainly to keep a history of Jailbreak 2003 development; but some of them were ongoing discussions and long-term documentation.

Unrelated to that, early this afternoon my personal computer at home broke down as well; that leaves the CVS server and Jailbreak Developer Network offline too.  Fortunately the data itself wasn't lost; just my computer won't work.  If I'm lucky it's only either the power supply or the mainboard.  The bad thing is that tomorrow is a holiday here, so I'll need to stick with this notebook as a temporary measure till I have a chance to buy replacement parts.

=== Comments

'''Tarquin:''' I'll do my best to remember what's been going on. [[Jailbreak rescue]]

'''Mychaeel:''' That's a great idea.

'''Tarquin:''' Maybe I shouldn't put code dev topics on a public wiki though. I can just scribble a text file, or on the JDN

'''Mychaeel:''' JDN is down along with my computer, I'm afraid.  Tahngarth has set up a temporary Core Dev forum at http://www.planetjailbreak.com/tempforum/ -- register there and meet Tahngarth or me in chat to get access.


== June 9, 2003

After finishing some Perl coding work (which I'm actually getting paid for) I'll see that my computer is restored to working order or that I at least find out which component exactly needs to be replaced.

'''Update:'''  The computer boots up with an old PCI video card; but as soon as I replace it by a AGP video card (either my current GeForce 4400 Ti or an older GeForce 2 MX), I only get either a strange creaking sound from the PC speaker or nothing at all.  Only the fans work.

A friend of mine who's professionally dealing quite frequently with broken PCs suggests that it might be either the power supply that doesn't manage the AGP cards' load anymore, or the mainboard for some reason doesn't like AGP cards anymore.  Unfortunately I don't have a spare ATX power supply at hand, so I won't be able to test that theory until tomorrow at the earliest.

In case it's the mainboard I'll at least use the opportunity to upgrade my old Athlon 800 MHz to whatever it is you can currently still get in a regular computer hardware shop -- apparently it's hard to find anything slower than 2.0 GHz nowadays.


== June 10, 2003

My computer is up and working again.  I was surprised that for not more than about 180 ? I got a new processor (Athlon XP 2000+) along with a mainboard, silent cooler and memory (512 MB).  I could even keep my previous 235 W power supply.  By accident the processor is currently underclocked to 1.25 GHz (its normal clock rate would be 1.67 GHz) -- I'm not even sure whether I can be bothered to open the case once more and set the jumpers correctly.

So far the system seems to be stable.  Time will tell.


== June 11, 2003

Bots should simply try to avoid being killed when &quot;evasive&quot; team tactics are selected.  (Useful when a team has a narrow lead shortly before the time limit runs out.)

I got that to work reasonably well with relatively little effort, code-wise:  Set the bots' aggressiveness to a really low value to ensure they don't feel inclined to engage in fights; then overwrite PickRetreatDestination and make it react in a suitably cowardly manner if the bot is seeing an enemy.  Right now they simply pick the [[NavigationPoint]] among their current MoveTarget's [[ReachSpec]]s that's farthest away from the enemy, or the closest one that provides cover.  Effectively that makes bots run away from an approaching enemy and make turns in order to move out of the enemy's firing line.

While it's fun (for a while) to chase bots around in a test map, I've come across one or two situations where bots are effectively stuck and too easy a prey to approaching enemies.  First I'll have to have bots detect this; then I'll have to have them react to it suitably, for instance by either simply choosing another way out or by acting like a cornered beast and falling back to normal dogfighting tactics until they're either dead or the threat is gone.  (Tomorrow more -- I'm tired.)


== June 13, 2003

I found one reproducible situation in which bots are stuck in a tight loop of pathnodes they visit:  A bot sees an enemy, turns to flee, runs into cover; arrived there it wonders what to do next and decides to go on an inventory hunt, which leads it back into the enemy's sight -- ad inf.

The bad thing is that bots (or rather the native function FindBestInventoryPath in [[Controller]]) are not smart enough to check whether they even have the chance to pick up the inventory when they've reached it -- otherwise they wouldn't even try to reach it more than once in a row, and my problem would be a non-issue.


== June 14, 2003

A comment in [[Bot]] hints that Epic meant to add a function called FindPathAwayFrom at some time -- alas, they didn't yet.  That leaves me with either sticking to my simple escaping algorithm from above (and its flaws) or creating a path finding function myself, in UnrealScript.

I've started giving the latter a try.  The idea is to recursively search the path network for [[NavigationPoint]]s that provide cover from the enemy, starting at the bot's current MoveTarget.  Some first test runs seem to indicate that it works, and it seems to have negligible impact on the performance so far.  (The Clock/UnClock mechanism described on [[Code Optimization]] proves pretty useful for such profiling.)

'''Update:'''  If a bot doesn't find cover nearby and realizes that the enemy must have seen it (because it isn't looking the other way right now), the bot panics and reverts to normal attack mode until the enemy is dead or out of sight.  I've put all that into CheckSquadObjectives now, and it seems to work pretty well testing it with a single masterful bot.


== June 16, 2003

Hmm.  Why on earth does the game rules tab maintain its settings in separate config variables instead of taking and storing them in the game type's own configuration?


== June 17, 2003

Why does filling the mutator list box on the &quot;Mutators&quot; tab involve two other separate classes?  Why is reading a list of available mutators a native function?

=== Comments
'''Wormbo:''' I guess it's supposed to speed up loading of mutator classes, but it's not really that much of a boost compared to the &quot;old&quot; GetNextInt(Desc) method because now the mutators' code packages have to be loaded in order to find the mutators' names, descriptions and groups.

'''Mychaeel:''' I wonder whether that native function (GetMutatorList in [[xUtil]]) does indeed load the mutator name to get the mutator name and description -- a comment says it does ''not'' fill in the MutClass element of the MutatorRecord structure, which would make little sense if the class is loaded anyway.  (Unless GetMutatorList was internally &quot;optimized&quot; only to look up the class's default properties without loading the class; but I'd be a bit sceptical as to the wisdom of ''that'' optimization.  But maybe it has to do with cheat protection validating all loaded code...?  Gah.) -- There's an UnrealScript function LoadClasses in [[xMutatorList]] that would load the mutator classes, but it doesn't seem to be actually used.

'''Wormbo:''' It's not the only questionable optimization. (Still remember &quot;&lt;code&gt;// FIXME THIS SUCKS&lt;/code&gt;&quot;?) [[GUIController]].GetWeaponList also is a native function and it definately loads and returns weapon classes. I can't see any real optimization over Unreal's or UT's code here.


== June 18, 2003

I'd like to intercept when somebody is clicking on a checkbox -- not just the part with the check mark but its label.

It took a while until I figured out that the bAcceptsInput flag must be set to True for any of a [[GUIComponent]]'s delegates to be called.  (Mmph.)


== June 23, 2003

The OnDraw delegate is called for custom [[GUIPanel]] subclasses but not for direct subclasses of its parent class, [[GUIMultiComponent]].  Does that have a deeper sense or did just somebody forget to add a call to the delegate in [[GUIMultiComponent]]'s native Draw implementation?

'''Update:'''  Is it just me or does setting the TextFont property in [[GUILabel]] (and, thus, the LabelFont property in [[GUIMenuOption]]) have no effect at all?  (Obsoleted by the introduction of [[GUIStyles]] maybe?)  All labels in the game seem to have the same font, even those where Epic's own UnrealScript code decrees otherwise by setting TextFont.


== June 28, 2003

This one has me baffled (in a [[WebApplication]] subclass):

&lt;uscript&gt;
function QuerySomething(WebResponse WebResponse) {
  local string ResultTemplate;
  ResultTemplate = &quot;should be overwritten by the next statement&quot;;
  ResultTemplate = WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
  }
&lt;/uscript&gt;

Now I'd expect ResultTemplate to contain the result of parsing the file something.inc... right?  And so it does, but '''appended to the previous value of the variable.'''  The resultant value of ResultTemplate is something like this:

  should be overwritten by the next statementContents of something.inc

Is that an engine bug?  Some arcane feature?  How can using LoadParsedUHTM on the right side of an assignment change the way the assignment operator works (given that the return value of LoadParsedUHTM is a mere string)?

However, the following workaround solves the problem:

&lt;uscript&gt;
  ResultTemplate = &quot;&quot; $ WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
&lt;/uscript&gt;

Trying to cast the right side to string in an attempt to do the same ironically yields a &quot;No need to cast StrProperty to itself&quot; compiler error.

==July 3, 2003==

Working on an HTML parser and formatter in UnrealScript again.  This time it'll be standalone and not part of [[Legacy:Screen|Screen]], even though I intend to use it for that end as well; and this time it's possible to use it on both [[Legacy:ScriptedTexture|ScriptedTexture]]s and a regular [[Legacy:Canvas|Canvas]].

I hope I'll get around to implementing tables and floating images as well this time.  The base architecture I'm currently designing and coding takes the requirements for those features into account already, so it should be straightfoward to even follow W3C's specification of [http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 calculating the width of columns] according to the standard.

==July 5, 2003==

The native Split and Divide functions turn out to be extremely handy for the kind of text parsing I'm doing at the moment.  (But I still want my native regular expression support in UnrealScript... mmph.)

===Comments===

'''El Muerte TDS:''' Nah, regular expression suck for text parsing, they are only useful for match (and replace). Using a [[Legacy:Tokenizer|tokenizer]] is much better for text parsing. It would be better if the native tokenizer was available in uscript.

'''Mychaeel:''' I dare say that depends on how you'd use regular expressions.  The _nextToken function in your tokenizer could be formulated much more efficiently using regular expressions, for instance.  (Though I agree that the availability of regular expressions might lead some people to creating terribly inefficient parsers.)

For that matter, my prime concern about this HTML parser is its performance, so parsing through the input stream character by character in UnrealScript is something I'm determined to avoid.  (The first version of [[Legacy:Screen|Screen]]'s ScreenSlidePage HTML parser did that, and it was slow as hell for anything exceeding ''very'' few kilobytes of input text.)

==July 6, 2003==

The HTML parser works like a charm since yesterday and nicely dumps the structure of a parsed HTML file, though I haven't made any performance evaluations yet; but in any case there's even some potential for optimization still (like identifying a tag's handler class by something faster than the sequential search I've settled for until the rest works, like binary search &amp;ndash; did I mention that native hash support would be a great addition to UnrealScript too?).

===Comments===

'''El Muerte TDS:''' There is a type called map, but it's only native atm (just like dynamic array used to be).

==July 9, 2003==

As usual it's not the ''normal'' case that makes implementing something a challenge; it's the ''pathological'' cases that do.

The obvious step after implementing an HTML parser is creating a formatter for the parsed HTML element tree.  The old one I made for [[Legacy:Screen|Screen]] (one of my first UnrealScript projects altogether) has no concept of tables or floating boxes, but this time I'm determined to add support for those and so I have to deal with the conceptual odds and ends that come with it.

A floating box is actually a pretty straightforward concept:  It's a rectangle that's placed at the left or right edge of the containing box starting at the vertical position of the text line it's defined in.  That technique is most commonly used to have text flow around an image on a website.

Normally, a web designer adds floating elements at the very start of a paragraph so the boxes are placed already when the formatter starts wrapping lines between them.

The beginning of a paragraph is, however, not the only valid place for floating boxes:  They can just as well be defined in the middle of a line, and that's where the trouble starts.  As long as the current line is short enough to fit next to the box, everything is still fine; just add the floating box and shorten the line box accordingly.

But what if the floating box is too wide to fit next to the text line where it's defined in?  The HTML standards document says that the box is then to start directly ''below'' the line it is defined in; that's simple enough to implement... but subsequent text after the definition of the floating box is still to be added to the very same line ''above'' the box, and according to Murphy's law somebody is bound to have some item in that line after the floating box definition that increases its line height.  That means, basically, that the absolute position of the floating box may not be completely determined at the time it is added.  Consequently, it may be necessary to shift the box down ''after'' it has been rendered.

==July 14, 2003==

I just realized that I failed to enter [[Legacy:UMake|UMake]] for the contest.  Ah well &amp;ndash; it sorely needs an update anyway given the huge list of pending fixes and improvements, and there's a lot of time till the deadline of phase two.

It's a bit of a pity that [[Legacy:MeshMaker|MeshMaker]] isn't eligible.  It might have had a chance to win something.

===Comments===

'''Haral:''' FYI, the deadline for the contest is tomorrow.  You can still enter, I do think.

'''Mychaeel:''' It is?  Well &amp;ndash; hardly enough time to give it the overhaul it deserves unless I was ''really'' desperate to enter it in phase one, but since there are two more phases to go, I think I'll just target phase two for now.  But thanks for the correction.  :-)

'''Haral:''' Those were my sentiments as well.  There's a lot of work to do on my mod, playable as it might be, before I'll feel it's ready for any sort of release.  Thanks for moving that comment btw, my brain doesn't exactly work well while I'm at work.  Anyway, time to get back at it, if I want to be ready by October.

==July 16, 2003==

Trying to read a binary file in UnrealScript.

The LoadParsedUHTM function in a freshly created [[Legacy:WebResponse|WebResponse]] object does well enough for text files, but I ran against a fundamental problem of UnrealScript's string data type here:  Obviously it's not as high-level as it should be in a language like UnrealScript and doesn't handle embedded null bytes (&lt;code&gt;Chr(0)&lt;/code&gt;) well.  A null byte terminates a string for all UnrealScript-related intents and purposes; so the content of the binary file I read is clipped off after a few bytes when the first null byte appears.

The only solution for that I can currently think of is briefly opening a TCP link from the game to itself, serving the binary file using the IncludeBinaryFile function in WebResponse and receiving it with a simultaneously spawned [[Legacy:TCPLink|TCPLink]] in binary mode.  But that's not only quite cumbersome, there's also a chance that some people's personal firewalls might complain about it (even though it's nothing but a local intra-process connection)...

===Comments===

'''Wormbo:''' AFAIK Quake 3 only works like this, even a single player game connects to a local game server, and when playing a skirmish game with open slots other players could join it, expanding it to a network game.

'''Nytro:''' I ''think'' this now constitutes more than &quot;short thoughts that popped up during Jailbreak development.&quot; o_O

'''Mychaeel:''' You're right.  I've scratched the &quot;short&quot; part in the description.

'''Nytrogen:''' I hate to continue to bother you... I don't own UT, and I can't find a decent description of [[Legacy:Screen|Screen]]. Would you mind giving me a link or quick 'Screen overview' blurb?

'''Wormbo:''' You just linked to it. There are links to the Screen website and forum. You should find any information you need there.

'''Birelli:''' Specifically the &quot;about&quot; page: http://www.planetunreal.com/screen/about.html on the Screen website.

==October 1, 2003==

This morning I officially handed in three copies of the physics diploma thesis I had been working on for the last year (and which had kept me off anything Unreal-related for the last two months).  For those interested, it's about ''Metal-Induced Crystallization of Silicon-Germanium Layers'' &amp;ndash; fundamental research for the next ('third') generation of solar cells which will be far more efficient and much cheaper to produce than what's currently on the market.

Well.  ''[takes a deep breath]''  This concludes more than half a decade of studies of mine at the Technische Universität München (I recently learned that they attach great importance to not being called &quot;Technical University Munich&quot; or something like that even on the cover sheet of English-language publications such as my thesis).  I guess it'll take a couple of days until I have really, deeply grasped the significance of this.  Right now, I'm mostly just relieved, happy, and tired.

One thing is sure, though:  I'm ready to get back into the Unreal community.  Even though I had been preoccupied by other things, I've really missed it.  :-)  It'll take me a few days to catch up, however, and there's also a lot more in my life which somewhat suffered during the last few weeks and which I have to catch up with, so be gentle.

===Comments===

'''Sobiwan:''' Solar cells: nice.  Enough of this fossil fuel baloney.  I hope your thesis helps push research and/or development further.  

'''Tarquin:''' Yay! Welcome back Mych. Good work saving the planet :)

'''El Muerte TDS:''' heh, it's not like this is the only planet we have ;) About the uni name, ofcourse they want it to be the german names, the english name is too easy to write, it doesn't have ä and ü. They want you to put effort in typing the name.

'''Mychaeel:''' Well, I got a German keyboard here, so effort is not an issue. &amp;ndash; The [http://www.wsi.tum.de/E25/research/theses.htm Walter Schottky Institute] where I worked, on the other hand, does not have any problems with officially allowing the English name ''Walter Schottky Institute for Fundamental Research in Semiconductor Electronics''. &amp;ndash; But then again, its name doesn't have any äs and üs in it, so your argument still holds.  ;-)

'''Tahngarth:''' Well I hope you get an A (or whatever the best grade is) :)

'''GRAF1K:''' Good, NOW GET TO WORK ON JAILBREAK!!! :P Glad you're back. :-) 

==March 1, 2004==

''* Mychaeel blows the dust from his developer journal, opens it and continues writing.''

Just checked in some actual, new, original Jailbreak code again yesterday.  Quite an elevating feeling.

It's a facility for our audio announcements.  We noticed that the number of distinct announcements grew exponentially as we thought of more and more situations in which one would make sense.  Some documentation of the system is available on [http://www.planetjailbreak.com/jdn/JBSpeechClient JDN: JBSpeechClient].

===Comments===

'''Tarquin:''' Wow! :) Looks cool!

==April 1, 2004==

Short of a few rather small features and known bugs, Jailbreak 2003 is finally feature-complete.  Yay!

The transition from UT2003 to UT2004 has put a big item on our to-do list again, though.  Epic has broken source code compatibility on several places, and other problems seem to stem from binary incompatibility (the &lt;code&gt;Ping&lt;/code&gt; variable in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] suddenly transmogrified from an int to a byte, which breaks the score display in our scoreboard).

It's strange, yet interesting and somewhat impressive, that UT2004 manages to load and run the game anyway.  At the surface, Jailbreak 2003 runs well under UT2004 already, even though it ''looks'' like Jailbreak 2003, at least HUD-wise.  Of course we're going to make Jailbreak 2004 blend in with UT2004 as well as Jailbreak 2003 does with UT2003.

If possible without too much pain I'd very much like to release Jailbreak 200x as a combined UT2003/UT2004 release.  The changes are small enough that it would be a shame to abandon all UT2003 users who didn't have the chance or the money to upgrade to UT2004 yet.

I'm looking into the details of [[Legacy:CVS|CVS]] branching right now.  Our &quot;main line of development&quot; will become UT2004, but we'll keep a UT2003 branch and take care to merge any generic changes into it.  ...if that works the way I hope it does.

==April 23, 2004==

The Jailbreak to-do list is empty, and I'm out of work.  (You bet.)  Guess it's beta time now.  Yay!  :-)

Currently working on a Perl script that automatically updates all required modules from CVS, checks for uncommitted changes, rebuilds them if necessary and automatically creates the distribution packages.  I hope to be done with that sometime tonight.  My girlfriend made us a spiffy installer logo &amp;ndash; I'm looking forward to hearing what the others say about it...

===Comments===

'''Corran:''' That's great news (for us anyway :D).  I can't wait for this.

'''GRAF1K:''' What he said. My mouth is watering. :D

BTW, did you know that UW is integated with the UT2004 UDE? Click on the Documentation tab in the code editing area and and there's unDox and Unreal Wiki. Sweet. :)

'''Corran:''' Yeah, it's been integrated into WotGreal fo a while now.

'''GRAF1K:''' Who cares about WOTgreal... UDE is official. :D

'''DJPaul:''' WOTgreal ''is'' the UDE.

'''Guest:''' Like the core of the application changes anything whatsoever... O_o

'''Wormbo:''' c-24-7-171-253.client.comcast.net (Guest above), will you ''please'' stop deleting Murphy from this page?

==May 17, 2004==

Let it never be said again that modifying the mid-game menu in UT2003 requires a custom [[Legacy:PlayerController|PlayerController]] subclass...

[[Image:Legacy_mychaeel-ut2003midgamemenu.jpeg|center|]]

==May 19, 2004==

I'm practically out of ideas what else could be added to Jailbreak &amp;ndash; almost time to release now...

Last thing we implemented were custom loading screens &amp;ndash; it's actually pretty straightforward to replace the default images displayed while a map loads by custom ones at runtime.

We've even managed to create one loading screen per bundled map and have the corresponding screen shown when the map loads &amp;ndash; and I've added a means for mappers to [http://www.planetjailbreak.com/jdn/Loading_Screen embed a custom loading screens into their map] which is displayed when that map loads.  Given that the necessary information is all there and is just being ignored by UT2004 stock code, I wonder why Epic didn't do that themselves...

===Comments===

'''GRAF1K:''' Epic wanted to include their uber-1337 Photoshop lensflares though! ;)

Looks like a ''very'' nice release coming up from you guys over at Jailbreak. I'd count off the minutes if I only knew when...

'''Note:''' I am indeed the M*rphy killer. Buggy 3rd-party software... :pissed: I'll get it fixed. For now though, I can't even replace the M*rphy's once I've killed them. Just revert once you see this.

'''Mychaeel:''' Argh... what kind of bug would ''specifically'' replace occurrences of the string &quot;Murphy&quot; in a text...?  o_O

'''GRAF1K:''' Well, it's not the bug directly that's doing that. The bug is me not being able to turn the feature off. The feature in question is a privacy feature that blocks sending of personal info (like the owner's name).

'''Mychaeel:''' So is it safe to deduce that your name is Murphy?  (Way to go for a privacy feature... :-p)

'''GRAF1K:''' LOL. I was going to disable that feature anyhow. The app does a lot more than that. Besides, my last name isn't Mürphy, but the account is under someone who's is. :)

==May 20, 2004==

Naturally, any display of hubris such as making the statement &quot;I'm out of bugs&quot; angers the Gods, so the to-do list has a few more now.  Fortunately, they're all pretty small yet, and I'm out to squish them before they get any bigger...  ;-)

==May 23, 2004==

You have no idea how glad I am that we're making a UT2003/UT2004 release of Jailbreak &amp;ndash; if only for the reason that on both my desktop computer and my notebook with their measly 512 MB of RAM starting UT2004 (or even UT2004 server and client at the same time) takes ''ages'' while the system swaps like crazy &amp;ndash; and loading UT2003, even server and client, works without any swapping at all.  UT2004 is a monster...

===Comments===

'''El Muerte:''' I don't have any swap issues when running UT2004 on my laptop (512MB ram). Haven't done much client+server testing, but the client takes quite some time to join the server (/me blames slow laptop HD). On my desktop I can run a server and two clients without any serious problems (1GB ram). I think windows is to blame :P

==May 27, 2004==

Jailbreak is out.  We assume full responsibility for all bugs that were left in.  :-p

Seriously though &amp;ndash; everything went reasonably smoothly, and while there ''are'' some bugs we'll have to fix, nothing really serious has popped up yet.  Feedback is very positive; feels good.  :-)

I've submitted Jailbreak 2004 for the MSU contest.  Perhaps we'll win something.

==May 29, 2004==

There's a known issue in UT2004 which prevents anybody who ever selected a third-party gametype in the server browser from joining any other game of a different gametype.

This happens since, when a gametype is selected, its [[Legacy:GameInfo|GameInfo]] class is loaded and its static FillPlayInfo function is called.  After adding its settings to the [[Legacy:PlayInfo|PlayInfo]] object, the GameInfo class remains loaded in memory (probably because it's somehow still referenced by the PlayInfo object and thus cannot be garbage-collected), and when the player tries joining a server running a different gametype, that'll fail because the third-party gametype's package is still loaded.

I haven't been able yet to find out ''why'' exactly FillPlayInfo is called at this point by the server browser and which part of the code does anything with the data saved in the PlayInfo object referenced by the &lt;code&gt;FilterInfo&lt;/code&gt; variable.  However, simply avoiding to actually add anything to the PlayInfo object seems to solve the problem without any noticable side effect, so the following chunk of code makes everything work as it should:

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local UT2K4ServerBrowser UT2K4ServerBrowser;

  // check whether we are called from a server browser
  foreach Default.Class.AllObjects(Class'UT2K4ServerBrowser', UT2K4ServerBrowser)
    if (UT2K4ServerBrowser.FilterInfo == PlayInfo)
      return;  // ignore because called from server browser

  // now do the usual stuff
  Super.FillPlayInfo(PlayInfo);

  PlayInfo.AddSetting(Default.GameGroup, ...);
  PlayInfo.AddSetting(Default.GameGroup, ...);
}
&lt;/uscript&gt;

==May 31, 2004==

While fixing some netcode I found out that in one of my classes a certain variable was constantly, over and over again, replicated to all clients &amp;ndash; several times per second; that class had &lt;code&gt;bNetNotify&lt;/code&gt; activated, and PostNetReceive was called every other tick.

What baffled me was that this variable wasn't even changed server-side; nor did it change on client side.

It took me a while to find out what was happening:  This variable which was replicated over and over again was a [[Legacy:Pawn|Pawn]] reference.  As soon as the Pawn it pointed to was destroyed, the variable was duly set to &lt;code&gt;None&lt;/code&gt; on both server and client &amp;ndash; but the server kept replicating its value to the clients.  And at the end of the day, the follwing slightly weird piece of code fixed it all:

&lt;uscript&gt;
// fixes replicating over and over when referenced actor has been destroyed
if (PawnObjectiveGuessed == None)
  PawnObjectiveGuessed = None;
&lt;/uscript&gt;

The Unreal engine is full of mysteries...

===Comments===

'''Mysterial:''' That works because UnrealScript returns &lt;code&gt;None&lt;/code&gt; when accessing a property pointing to an [[Legacy:Actor|Actor]] with bDeleteMe == true. Internally, the [[Legacy:Actor|Actor]] is in fact still referenced by that property until the [[Legacy:Actor|Actor]] is truly deleted. It getting continually replicated might be a bug in the engine. Can you try to create a small reproduction case and send it to me?

'''Mychaeel:''' Will do.  :-)

'''Mychaeel:''' Hrmph... making a simple test case is not as straightforward as I thought.  Then again, if it was an obvious bug, it probably wouldn't be in there...  ;-)

==May 31, 2004==

Argh!  People report server crashes, and every single crash log has the following lines at its end:

&lt;pre&gt;
  Critical: UObject::ProcessEvent
  Critical: (JBCameraArena JB-Heights.JBCameraArena, Function Jailbreak.JBCameraArena.Tick)
  Critical: AActor::Tick
  Critical: TickAllActors
  Critical: ULevel::Tick
  Critical: (NetMode=1)
  Critical: TickLevel
  Critical: UGameEngine::Tick
  Critical: Level Abandoned Heights
  Critical: UpdateWorld
  Critical: UServerCommandlet::Main
  Exit: Executing UObject::StaticShutdownAfterError
  Exit: Exiting.&lt;/pre&gt;

That Tick event in question doesn't do anything special that I'd be aware of &amp;ndash; it certainly doesn't destroy the actor or anything like that.  And I cannot reproduce it at all in a local client/server testing environment, and it only happens infrequently on other servers anyway.

There may be one thing:  The Tick event calls a function within an [[Legacy:Editinline|editinline]] object (which was created along with the JBCamera actor as a [[Legacy:Subobject|subobject]]).  Perhaps, when JBCameraArena.Destroy() is called, that subobject reference somehow becomes invalid and crash-prone under certain circumstances?

: '''Update:'''  I just found out that all my JBCameraArena actors '''share the same subobject''' &amp;ndash; unlike what I expected, seeing that spawning [[Legacy:Emitter|Emitter]] subclasses creates ''distinct'' instances of their [[Legacy:ParticleEmitter|ParticleEmitter]] subobjects.  While I'm not sure whether that's responsible for the crashes, it's definitely not what I had in mind and it's a bug when more than one JBCameraArena is active at the same time.

To make it worse, those error messages don't really indicate what ''kind'' of error happened (the lines preceding them are different and nothing out of the usual in every case &amp;ndash; such as players joining or leaving; unfortunately I have no indication whether there's a temporal relationship between the events logged before the error and the error, but I believe there's not).

Is there anyone out there with Unreal-engine insight who might be able to tell me which kinds of errors would trigger those server log messages?

==June 2, 2004==

Phew.  The Jailbreak server crashes are '''fixed''' (and stress-tested successfully on MyUnreal's ever-full server), and so are the &quot;web admin does not come up again after level change&quot; and &quot;server does not react to UDP requests after a while&quot; bugs.  Those were the toughest ones to crack, mostly because I was fixing in the dark; the others were, while partly annoying, peanuts.

In retrospect it seems that the latter two bugs stemmed from the engine not fully cleaning up the previous level; and that, in turn, was apparently due to my storing some actor references in the ''class default'' values of a class &amp;ndash; I did that only to compare the stored references to given ones for caching a function's return value over subsequent calls.  Even if the actors were destroyed between two calls, I'd expect a comparison simply to fail.

After I worked around that problem (by storing the actors' locations in the cache &amp;ndash; in this case that worked just as well), suddenly those both bugs (web server not coming up again, UdpGameSpyQuery failing to bind its port after a while) were gone all by themselves.  So, note for the future:  '''Never store actor references in default properties!'''

===Comments===

'''Foxpaw:''' That's interesting. I've stored actor references in default properties lots. (For instance, any actor can get a reference to the level's backdrop in my case by accessing class'Base.Backdrop'.default.Reference. Perhaps this behaviour is limited to certain classes?

'''Mychaeel:''' Perhaps, but I don't think so.  The effect of doing that is hardly noticable in local testing conditions, in any case (otherwise I'd have seen it a lot earlier) &amp;ndash; as I wrote, the most noticable effect was that the web admin [[Legacy:WebServer|WebServer]] didn't get cleaned up on level change and that &amp;ndash; after many level changes &amp;ndash; a server just didn't respond to UDP requests anymore.  Otherwise, everything worked great.

'''Mysterial:''' Since classes are non-Actor objects, the usual issues with storing [[Legacy:Actor|Actor]] references in them apply. I'm somewhat surprised it didn't crash. Perhaps because the engine doesn't actually destroy the class objects as it would most other objects you'd store references in, since you're playing another Jailbreak game so it wouldn't ever unload the resources.

'''Mychaeel:''' Frankly, I wasn't ever aware of &quot;the usual issues&quot; with storing Actor references in non-Actor objects &amp;ndash; Jailbreak code still does that on several occasions ([[Legacy:LevelInfo|LevelInfo]] and [[Legacy:TeamInfo|TeamInfo]] references in the non-Actor objects which represent the small player icons on the HUD, and in at least one other place too).  Are you saying that referencing an Actor from a non-Actor object is always crash-prone and not supported by the engine?

'''Mysterial:''' [[Legacy:Actor|Actor]] references in non-Actor subclasses don't get automatically cleaned up by the engine, so they work just like C++ pointers in that accessing them after they've been deleted has horrible, unpredictable effects (generally crashing). Additionally, since part of garbage collection is traversing every object reference property that exists, you need to clean up any such references before a level change or you'll either get frequent serialization crashes or prevent the previous level from unloading, creating huge memory leaks, as you unfortunately found out.

==June 8, 2004==

With the stress of releasing Jailbreak over, I'm free to look into some of my old mutator ideas again.  One of them is '''SprayPaint''' &amp;ndash; a simple idea actually, borrowed from Half Life where the ability to spray-paint your clan logo on walls was built-in functionality.  I want to port that idea to UT2004.

This would be pretty straight-forward and quite uninteresting if I hadn't put it into my mind that it should be possible to customize the spray-painted images by simply dropping a BMP file (1-bit, 64x64 pixels) into a directory; and, if that's done by a client in a network game, all other clients should be able to see the same image too.  The latter is just some replication acrobatics; the former is where I saw my challenge.

Reading arbitrary files in UnrealScript isn't really supported, but if you need to do it for text files, instantiating a [[Legacy:WebResponse|WebResponse]] object and using its LoadParsedUHTM function works quite well.  However, UnrealScript strings aren't binary safe &amp;ndash; null bytes act as end-of-string tokens and thus cannot be included in a string.  Attempting to load a binary file such as a BMP image with LoadParsedUHTM results in a byte string truncated at the first null byte.

I've worked around that problem now by spawning a local [[Legacy:WebServer|WebServer]] listening on a random free port, delivering files as &quot;application/octet-stream&quot; with WebResponse's function IncludeBinaryFile, and a [[Legacy:TcpLink|TcpLink]] operating in MODE_Binary to receive the binary data from the local web server.  In theory this setup is able to read the contents of any binary file within the UT2004 directory hierarchy into an UnrealScript byte array, and it's working great for my purposes.

===Comments===

'''EntropicLqd:''' Can you see outside of the UT2004 directory structure with that technique?  Cunning solution btw

'''Mychaeel:''' Frighteningly enough, I can read ''any'' file that way.  (I had actually &amp;ndash; and perhaps naively &amp;ndash; assumed that the IncludePath in WebResponse would not allow UnrealScript code to travel beyond the UT2004 base directory...) &amp;ndash; Perhaps it'd be best to let Epic know about this and to remove this last &quot;Developer Journal&quot; entry for the time being...

'''EntropicLqd:''' I'd definitely let Epic know about it (I guess you have already).  Allowing access above the 2K4 root directory is an astonishing lapse on Epics part.  I was expecting a ''ho ho ho ofcourse not'' response.  Wonder if you could write a remote file browser...

'''Mychaeel:''' Without having a way to generically get full directory listings, I'm afraid (or rather, glad) that's not possible &amp;ndash; [[Legacy:StreamInterface|StreamInterface]] only provides a way to list directories (and a limited set of other file types, though I haven't been able to get that to work for anything except said directories and .mp3 files).

'''Mychaeel:''' The LoadParsedUHTM method works on any file on a given partition too, given the right IncludePath setting (e.g. &quot;C:/&quot;) in a subclass and without all the local web server hassle.

'''Mychaeel:''' I've sent a mail to Joe Wilcox.

==July 12, 2004==

Jailbreak 2004 is one of the gametype finalists in the MSU contest.  That's nice and I hope we'll win something too, but I find it more notable that Jailbreak got a honorable mention in the &quot;FPS Mod&quot; category.  I didn't check that box when I entered Jailbreak 2004 into the contest; it must have been the judges' decision to put it there too...

In completely unrelated news, I've been turning some of my spare attention to attempting to write a couple of extensions for Thunderbird to make my life easier (on the long run; you know, that &quot;impatience, hubris&quot; part that occasionally pops up in a Larry Wall quote at the bottom of an Unreal Wiki page).  Phew.  If you ever thought that UnrealScript was a humongous, complex and for the most part poorly documented heap of code already, do look at http://lxr.mozilla.org for an upgrade.

===Comments===

'''Tarquin:''' I don't know about you, but I am finding the Jailbreak community very quiet these days. I'm sure there was way more activity (posts, maps, discussion) in the days of JBIII. But I suppose that was the 3rd release and we are only on the first. BTW, if you have some spare time, do you think you could look at the Wookee class tree generator? It would be nice if the text of the tree was parsed for wiki links, so we could use it for Unreal classes here &amp;ndash; but I'm afraid I've not been able to work out how to do it. It's WookeeTree.pm in your CVS. :) 

==July 14, 2004==

My support for Opera 6 has finally broken down after the last vBulletin 3 update which made &lt;code&gt;[code]&lt;/code&gt; tags unreadable, and I've made the switch to Firefox.  I'm loving it already.

It has gone quite a long way since the last time I gave it a try (must have been around version 0.6), and most of the reasons I didn't want to switch to it then have gone meanwhile.  I'm especially fond of the ability to selectively skin websites with custom CSS (using the &quot;uriid&quot; extension and a specially crafted userContent.css), and I just ''have'' to love a program which allows me to tweak its user interface appearance by editing a CSS file...

In completely unrelated news, Fraunhofer IGD (whom I had sent an unsolicited application about three months ago and never heard back of) has offered me a job... working on a project in Seoul, South Korea.  Imagine my surprise.  I might even have considered it if I hadn't found another job in the meantime already ''and'' if I didn't specifically want to move closer to my girlfriend in the Frankfurt area.  Still, quite interesting...

(Is this developer journal turning into a blog...?)

===Comments===

'''Tarquin:''' Bwahahahaha! I knew we'd convert you in the end.... :P

'''MythOpus:''' Consider this a reminder from the entire wiki to update the Wookee download zip ;)

==August 20, 2004==

When you think you're finally out of bugs, Atari QA will come and send you a new bunch of them.  :-p

No, actually, it's not that bad.  It boils down to one actual code bug and a bunch of map-related things in the order of &quot;graphic seams flicker in and out around the pipelines.&quot;  Still, I was surprised when I got that mail...

===Comments===

'''GRAF1K:''' Why would Atari be interested in sending you bug reports?

'''Wormbo:''' One code bug and one code thing I wouldn't call a bug. (no weapon in celebration screen)&lt;br /&gt;They most likely sent the reports because they tested Jailbreak 2004. ;)

'''Mychaeel:''' ...and they tested Jailbreak 2004 because they want to include it in the Editor's Choice Edition.  Sorry, I kinda implied this.  ;-)

'''Guest:''' I figured ECE was the reason but wasn't sure. Congrats then. :D

==September 5, 2004==

Picking up my old SprayPaint mutator idea again.  To reiterate, it's about being able to spray logos on walls &amp;ndash; the logos must be provided as monochrome bitmaps (i.e. bitmaps with 1-bit color depth) in a certain UT2004 subdirectory, and you can spray them on walls in a color of your choice; and the best thing is that other players on the server would see the exact same thing even though they don't have the source bitmap on their system.  On the long run I even want the sprayed images to persist across matches.

There's a bit of replication acrobatics involved in making that work, but so far it works nicely &amp;ndash; the data is loaded client-side, transmitted to the server via a replicated function in &quot;bunches&quot; of no more than 64 bytes a tick, and then left to the engine to be replicated back to all (non-bNetOwner) clients.

Two things I noticed doing that were that, firstly, the engine only replicates the first 256 bytes of an array of 512 byte values (where I don't know exactly whether it's the number of elements or their total size which is limited by the engine); and secondly, that passing a byte array via a replicated function call will only actually replicate the first value of that array, not the entire array.  However, if the array is part of a struct which is passed through the replicated function, everything works fine (hence my &quot;bunches&quot; of data).

The user interface for that thing is keeping me thinking.  Right now I figure that pressing your usual &quot;talk&quot; key (&quot;T&quot;, for instance) quickly twice in a row (like a double-click) would pop up a window where you could select which image to spray (using the mouse or arrow/movement keys), but that idea is subject to change.  For now, the &quot;mutate SprayImage &lt;filename&gt; &lt;color&gt;&quot; console command does the trick.

==November 17, 2004==

I've moved into my new apartment last Sunday, and today I got ISDN and DSL activated.  Thus, JDN is up again &amp;ndash; whatever caused my computer to break down two weeks ago is mysterious to me.  Maybe my video card overheated after all after having been running non-stop for months without a monitor attached to it... still, not really a satisfactory explanation.

Now that my home computer has been hosting CVS, an Apache webserver with JDN and other services and an ISDN calling machine and fax server for quite a while and across several hardware updates, I've been thinking &amp;ndash; it's getting harder and harder to keep the noise level coming from this machine at a level I'm willing to bear in my living room.  Plus, most of the time the computer is merely converting electric power into noise and heat via a video card and processor which are ridiculously overpowered for something acting as a web/fax/CVS server most of the time.

...so &amp;ndash; *drumroll* &amp;ndash; I've got that fabulous idea of building a small machine out of spare parts mostly left over from hardware upgrades of my main PC over the years.  I've got two mainboards/processors to choose from (a Pentium 200 MHz and an Athlon 800 MHz which I could underclock to 500 MHz), some left-over RAM, an ethernet card (my latest mainboard had that on-board) and a simple video card (an ATI XPert@Work sporting a 3D chipset with the staggering amount of 8 MB VRAM).  I also have a midi-tower computer case somewhere.  What I need is a silent power supply and &amp;ndash; probably &amp;ndash; a new harddisk (especially if this thing is to act as a file server as well) unless I find a suitable one in my pile of used hardware.

I figure I'll install Debian Linux on it &amp;ndash; with that awesome 3 MBit/s downstream I've got I can even download it without much hassle.

'''Update:'''  Wow.  Silent 80 GB harddisks come for less than 60 EUR these days?  o_O

==March 8, 2005==

&lt;nowiki&gt;*blows dust off this page*&lt;/nowiki&gt;

&lt;nowiki&gt;*cough*&lt;/nowiki&gt; &lt;br /&gt;&lt;nowiki&gt;*cough*&lt;/nowiki&gt;

Remember the Palpable mutator for Unreal Tournament?  Probably not, because I never actually released it, and the BuF mess-up two years ago ate all remaining evidence for it.

Basically, it allowed the user to see stereo 3D by displaying two versions of the current scene rendered from slightly different points of view.  You had to squint to see the effect, just like for [http://www.brossco.fi/janne/eclipse99/budapest/bu_3d.html these photos].

I tried to implement the same thing for UT2004 on Sunday.  To the degree that two viewports were rendered on the screen next to each other, it was a piece of cake; but, having the HUD render within one of those viewports prove to be impossible.  In Unreal Tournament, it was basically just a matter of setting [[Legacy:Canvas|Canvas]].OrgX/OrgY and ClipX/ClipY right &amp;ndash; but UT2004's HUD makes heavy use of the native DrawSpriteWidget function which, while honoring OrgX/OrgY and ClipX/ClipY, doesn't take the reduced size of a viewport defined through those properties into account when positioning and scaling the widgets.

So, no way.  Well, it was just an experiment anyway.  The 3D effect itself is pretty cool, though, even if it strains the eyes to squint that way for an extended period of time...

In other news, after a period of consideration, I bought a digital piano today &amp;ndash; a [http://www.rolandus.com/products/ck_details.asp?CatID=11&amp;SubCatID=45&amp;ProdID=HP-101 Roland HP-101].  I played the piano for years before leaving my parents' home to go to university, and I want to pick this hobby up again.  And, wow, those digital pianos nowadays really do sound and feel like the real thing &amp;ndash; down to subtle details like the slight resonance you hear after releasing a key, or that the keys for the deep tones react with slightly more resistance to being pressed down than the high-pitched keys...

===Comments===

'''Birelli:''' I remember Palpable, I think a couple of us on IRC tested it for you one time. It's definitely a cool effect, but it gave me a headache after about 15 minutes of playing. Probably not something people want to use all the time. Also it takes a bit of practice before you can train your mind into not forcing one eye dominant over the other, so at first it's basically impossible to run in a straight line.

==April 19, 2005==

Those who have followed [http://www.planetjailbreak.com/?news=275 PlanetJailbreak news] are aware of what I've been working on recently: the visuals of freezing and shattering a player model.  Part of the problem is to overlay the player model and the weapon it holds with an &quot;ice&quot; texture that gradually fades in.

My first idea was creating a [[Legacy:Shader|Shader]], setting its &lt;code&gt;Diffuse&lt;/code&gt; material to the player's skin texture, the &lt;code&gt;Specular&lt;/code&gt; material to my alpha-blended &quot;ice&quot; texture and use a [[Legacy:ConstantColor|ConstantColor]] as its &lt;code&gt;SpecularityMask&lt;/code&gt; material to control the fading.  That works fine for the player model, but utterly fails for the weapon &amp;ndash; the weapon's textures are implicitly defined through the mesh, and there's no way UnrealScript code can get hold of them (not even anything similar to [[Legacy:Dynamicly Accessing Original Static Mesh Textures|this method]]).

So, that approach fell somewhat short of what I had envisioned.

But there's &lt;code&gt;OverlayMaterial&lt;/code&gt; defined in [[Legacy:Actor|Actor]], along with a &lt;code&gt;SetOverlayMaterial&lt;/code&gt; method, which is used (among others) by the UDamage to produce that &quot;energy&quot; overlay effect on players and weapons.  I had previously found out already that using a plain texture as &lt;code&gt;OverlayMaterial&lt;/code&gt; will simply replace the model's skin by that texture (instead of overlaying it) &amp;ndash; not what I intended, so I had put that approach aside.  Now, I picked it up again.

After some lucky experimentation, I found that I was able to use a [[Legacy:Shader|Shader]] as an &lt;code&gt;OverlayMaterial&lt;/code&gt; whose &lt;code&gt;Specular&lt;/code&gt; material was set to my &quot;ice&quot; texture.  Funnily, I noted that:

* The &lt;code&gt;Diffuse&lt;/code&gt; material I tried to set was automatically overwritten with a reference to the overlaid actor's skin (the skin part with the highest ordinal number in the meshmap, I guess).  So, here's a way to find the original skins of a non-static mesh if you need to.

* The &lt;code&gt;A&lt;/code&gt; (alpha) member of the &lt;code&gt;Color&lt;/code&gt; property of a [[Legacy:ConstantColor|ConstantColor]] material I tried to use as the shader's &lt;code&gt;SpecularityMask&lt;/code&gt; was immediately reset to zero whenever I attempted to set it to something different.  Why would the engine do such a thing...?

So, that didn't work the way I had it intended to.  Neither did any attempts to replace the plain &quot;ice&quot; texture in the &lt;code&gt;Specular&lt;/code&gt; slot by a [[Legacy:Modifier|Modifier]] of any kind.

Then, in a last futile attempt, I tried using a [[Legacy:FadeColor|FadeColor]] in the &lt;code&gt;SpecularityMask&lt;/code&gt; slot (instead of a [[Legacy:ConstantColor|ConstantColor]] as before), and lo!, when I set its &lt;code&gt;FadePeriod&lt;/code&gt; to something other than the default, zero, it worked!  Well, of course I had a pulsing overlay now, but setting both &lt;code&gt;Color1&lt;/code&gt; and &lt;code&gt;Color2&lt;/code&gt; to the same color fixed that.

So, now I've got a texture overlay on both player and weapon which I can smoothly fade in (and out, if there was any need) and which still lets the original textures shine through.

===Comments===

'''Wormbo:''' Interesting hack. :) The engine uses the ConstantColor in the SpecularityMask slot to fade out the overlay effect when the actor's overlay timer drops below 1 or so.

==May 1, 2005==

Microsoft has a pretty good reputation on IDEs, but ''Microsoft eMbedded Visual C++'' really has at least one major quirk which makes working with it a pain unless you either know how to avoid it or unwittingly got around it by failing to customize your workspace too much.  I didn't fall into the second group, and it took me until today to become part of the first.

I'm developing a small smartphone application to remote-control MP3 playback on the Linux server which sits quietly in my closet via Bluetooth.

The ''Smartphone 2003 SDK'' comes with a smartphone emulator.  That's very nice, but it becomes pretty frustrating once it stops working &amp;ndash; which, for me, happened basically whenever I started the IDE for the second time after installing it:  Whenever I wanted to run my program, I got an error dialog telling me one of the following things:

{{innerbox| Cannot find a default device. Please create one or more from the Platform Manager.

}}

&lt;nowiki&gt;&lt;/nowiki&gt;

{{innerbox| There is no device installed. Please go to Configure Platform Manager to add a device.

}}

Obviously there were still the same devices as the last time, and I certainly hadn't changed configurations since last successfully running the program in the emulator.  So, almost each time I wanted to work on my project, I had to uninstall the entire IDE and reinstall all of it &amp;ndash; two installers, one of them badly made, and a service pack; half an hour work just to get the IDE to work again.  Needless to say, I didn't do that very often.

Of course, I googled for a solution.  Nothing to find except for two postings from people with the same problem without any replies to them.  At least I wasn't alone; little consolation there, though.

Today, I got that second error message from above for the first time, and that was my luck.  Googling for ''that'' finally led me to a newsgroup message with the solution:  If you disable the WCE Configuration toolbar, the (unlabeled) &quot;default device&quot; drop-down box (the rightmost one) '''will automatically revert to &quot;Smartphone 2003 Device.&quot;'''  Set it back to &quot;Smartphone 2003 Emulator&quot; and everything works again.  There's no menu command for that option.

&quot;Son of a gun!&quot;, to say it in the original newsgroup poster's words.  What an unnecessary annoyance.

==November 3, 2005==

Today at around 11:15 AM, I successfully completed my twenty-ninth year of life (for a suitable definition of &quot;successfully&quot; :-P), heading into the thirtieth without hesitation. Happy birthday to me ;-)

===Comments===

'''El Muerte:''' damn you're old ;)

'''EntropicLqd:''' Happy birthday youngster (for a given value of young).  Give it another few years and you'll feel like you are falling apart :)

'''Sweavo:''' phew it's not just me then Entropic :-)

'''Tarquin:''' Happy birthday Mych! The big 30 next year ;) It's not as awful as it sounds :)

'''Mychaeel:''' Hehe, thanks y'all :-)

'''MythOpus:''' I saw it awhile ago, but I was always on my dads Linux computer so I haven't been able to... WISH YOU A HAPPY BIRTHDAY!

'''Mychaeel:''' I'll take good wishes at any time, so: thank you as well :-D

'''Sweavo:''' in that case, have had a happy birthday :-)

==April 24, 2006==

Setting a data structure element of a replicated array element won't actually make the engine replicate that array element.  You'll have to set the ''whole'' array element to make the engine notice that it has changed:

&lt;uscript&gt;
function TouchElement(int iElement)
{
  local TElement ElementTemp;

  ElementTemp = Elements[iElement];
  Elements[iElement] = ElementTemp;  // prod!
}
&lt;/uscript&gt;

Has anybody else ever had that problem?

===Comments===

'''EricBlade:''' I haven't personally had a reason to make an array of structs yet, but it sounds like it could be related somehow to the problem of not being able to replicate -just- a struct, without some other var?

'''Wormbo:''' That seems to be a general problem of struct replication, not only structs as array elements. The code &lt;code&gt;Elements[iElement] = Elements[iElement]&lt;/code&gt; seems to be enough to cause replication though, whether anything actually changed or not.

'''Mychaeel:''' Yes, I also realized that the detour over a temporary local variable probably wasn't necessary at all &amp;ndash; I was still under the influence of the &lt;code&gt;SwapElements&lt;/code&gt; function which actually ''needed'' one.  I've occasionally replicated (individual instances of) structs without problems, though &amp;ndash; you only have to be aware that changing any struct element will cause the entire struct to be replicated.  (Actually, I've used that as a feature occasionally.)

==July 15, 2006==

I found the following function in [http://mychaeel.no-ip.com/source/Jailbreak/Jailbreak/Classes/JBTagPlayer.uc?rev=1.58&amp;view=auto some source code] I had written years ago:

&lt;uscript&gt;
// ============================================================================
// CalcOrientation
//
// Calculates and returns an artificial value representing the orientation of
// a vector. The returned value has the following properties:
//
//   * Non-zero for any non-zero vector. Zero for the zero vector.
//   * Negating the argument yields the negative result.
//
// Those properties allow to use this function to make any difference between
// two given points in space unambiguous by passing a single additional binary
// bit of information.
// ============================================================================

simulated function float CalcOrientation(vector VectorInput)
{
  local vector VectorTranslated;

  VectorTranslated.X = VectorInput dot vect(1, 1, 0);  if (VectorTranslated.X != 0.0) return VectorTranslated.X;
  VectorTranslated.Y = VectorInput dot vect(1,-1, 0);  if (VectorTranslated.Y != 0.0) return VectorTranslated.Y;
  VectorTranslated.Z = VectorInput dot vect(0, 0, 1);  if (VectorTranslated.Z != 0.0) return VectorTranslated.Z;

  return 0.0;
}
&lt;/uscript&gt;

It's part of Jailbreak's player movement extrapolation code which is designed to provide a smooth client-side representation of a player's position with as little network traffic as possible.  The extrapolated player position is used by the [http://mychaeel.no-ip.com/jailbreak/JBPanorama scoreboard minimap] and [http://mychaeel.no-ip.com/jailbreak/JBScreen JBScreen].

Well, what the ''heck'' was I thinking?

Obviously, instead of using a local vector variable, I could have used a simple float; the function calculates each component of the local vector, immediately uses it, and then never uses it again.  Plus, looking more closely at what's actually done there, it looks as if I could simply have used the original vector's components instead of (sloppily) translating it into a rotated coordinate system first.

It took me a while to get behind what I had thought several years ago.  I should comment more.

Using a local vector instead of a float was halfway between being an artifact of the way my mind had gone before arriving at this code and being self-documenting code.  (Sure enough the latter could have been achieved just as well with less bytecode overhead by just adding a comment.)

Translating the input vector into a coordinate system rotated 45° away from the main axes was done to make changes in the signum of the return value less common.  If there's any directional bias in a player's movement at all, it's usually along the main axes, following a hallway a mapper will generally have aligned along the coordinate system.  Strafing left and right even just a bit while moving along one of the coordinate axes (say, the Y axis), would change the signum of one of the other coordinate components (the X component) frequently.

If the axes are rotated 45° about the vertical (Z) axis, chances are better that you stay &quot;left&quot; or &quot;right&quot; of an axis while moving, leaving the signum of the return value of this function unchanged.  Any change in the signum needs to be replicated to all clients (as the signum of the scalar player velocity they use to extrapolate the player's position); so this coordinate rotation reduces the frequency of updates required to send to the clients.

Phew.

I remember experimenting with different replication and extrapolation mechanisms, using some of UT2003's more obscure logging parameters to get network traffic detail into UT2003.log.  This optimization actually ''did'' reduce the amount of updates sent across the network for this detail.  I never got around to actually measuring whether it made any relevant difference in the ''total'' amount of network traffic, though.  I suppose this could be just one of the cases where I indulged in premature optimization just for the fun of it.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4329</id>
      <timestamp>2006-04-24T07:47:09Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries, but feel free to add comments.''

}}

==December 14, 2002==

{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson]]''

}}

No effort is wasted if you've learned something from it.  (Though that doesn't mean that the same time couldn't have been spent more effectively.)

Occasionally I'm stuck in a dead end of my own design and can't seem to find my way out of it.  The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on.  So I linger a bit longer and cudgel my brains for some ''other'' way to reach my goal than backing up.

Deleting an evening's worth of good code requires an effort, but if it relieves me of a week's worth of trying not to scratch it, it's worth it.

===Comments===

'''Tarquin:'''  &quot;The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on. &quot; &amp;ndash; I do that all the time in mapping. I end up with multiple copies of the same area, each one trying a different solution...  What usually happens is I eventually work up the courage to start from scratch.

'''Mychaeel:''' That's exactly what happens to me too.  :-)  Realizing when it's better to scratch a few good ideas in favor of an entirely different approach (maybe even one with a slightly different outcome than what I originally figured) is a learning process.

==December 20, 2002==

Note to self:  Not assuming that other people's contributions to a testing environment are free of bugs can be a huge time saver.

==January 17, 2003==

Incidentally I dug out the code I scratched in the first entry on this page and used it for a related, but different purpose where it actually fits in.  (Good thing I never really delete something for good unless I'm ''absolutely'' sure it won't ever be of any use anymore.)

The code is part of Jailbreak's bot support and is supposed to let bots make an educated guess where an enemy player is currently located after the enemy gave his position away by triggering a release switch.  Naturally, if there's only a single relase switch, all that boils down to a single possible location.  Where it gets interesting is if there are ''multiple'' release switches and the bots actually have to ''guess'' which one the player triggered.

My code does that based on the last known location of a player (directly after a round starts, or after a spawn in freedom after winning an arena match, or after being released from jail), the walking distance (using the path network) to all of the release switches and the time that passed since the player's location was known last.  With that and a more or less arbitrarily chosen probability distribution for a player's distance from his starting point after a given amount of time (something based on half a Gaussian) bots take a random guess weighed by the respective probability of the enemy being at any of the possible switches.

==January 18, 2003==

Wrote about [[Legacy:A Bug'S Life|A Bug's Life]] hoping that it'll inspire our bug hunters to posting better bug reports than they occasionally did for Jailbreak III.

==January 23, 2003==

UT2003's speech menu redefines the terms &quot;non-extensible&quot; and &quot;hard-coded.&quot;  I'm sure there's a way into it though &amp;ndash; I just haven't worked it out yet.  (Subclassing [[Legacy:ExtendedConsole|ExtendedConsole]] is, hardly surprising, not an option.)

==January 24, 2003==

[[Image:Legacy_speechmenuhack-ordermenu.jpeg|left|]]

Apparently there ''is'' a way.  The &quot;Team tactics&quot; menu item here opens a submenu where you can select one of a set of tactics for your team.  (All other menu items open a list of players you can order.)

Getting it to display your own entries is the easy part, to be sure &amp;ndash; being notified when the player selects one of the entries requires some more code insight.  It is possible though, and I'm just about to implement it.

If this works out, I'll describe the hack in detail somewhere on the Wiki.

==January 25, 2003==

[[Image:Legacy_speechmenuhack-tacticsmenu.jpeg|right|]]

It works.  When you select one of the entries in the tactics menu displayed to the right, SetOrders in [[Legacy:TeamAI|TeamAI]] is notified and gets a chance to intercept the selection.  The default implementation of SetOrders puts the following message into the log:

  ScriptLog: Team New orders TacticsNormal JB-IronMan.xPlayer0

TacticsNormal is a label I assigned to that menu item; everything else in that message is from Epic's own code.  Any unwanted cosmetic side effects can be controlled by overwriting SetOrders with your own code.

There's relatively little code involved in the whole hack:  One piece of code that's executed in some actor's client-side Tick (I used Tick in our [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]] subclass, but it could be anywhere) that modifies the speech menu's behavior; and a piece of code that modifies some properties of [[Legacy:Bot|Bot]]s when they're spawned.  And, of course, the code in SetOrders in [[Legacy:TeamAI|TeamAI]] that does whatever you want your custom menu item to do.

Modifying the speech menu that way has its limitations, of course.  There are only very few &quot;slots&quot; left for custom notifications (exactly nine), and custom submenus like my &quot;Team Tactics&quot; menu are only possible for menu items in the &quot;Orders&quot; submenu.  Details to follow.

==February 3, 2003==

So little time, and so much to do... but I don't regret spending the last weekend skiing in Tyrol.  ;-)

[[Legacy:UMake|UMake]] should be updated and released in version 1.2.  [[Legacy:Spectate Bots|Spectate Botmatch]] has a host of new functionality to be implemented, despite Epic refitting a &quot;Spectate&quot; button in the Instant Action dialog with the last patch.  Deathball needs some small code tweaks on my part.  [[Legacy:Jailbreak|Jailbreak]] development must continue.  And in addition to that there's some Perl coding work I'll actually get paid for and whose deadline is approaching sometime in mid-February.

==February 10, 2003==

If you want to make ''absolutely sure'' that a certain thread in a forum remains undiscovered, stick it to the top and place the words &quot;Read this before posting&quot; in its subject.

==February 14, 2003==

Bots in jail (in Jailbreak) should idly walk around, occasionally lie down and sleep, and engage in hammer fights if there's an eligible opponent.

It seems to me that maybe the best way to achieve all this is creating several custom [[Legacy:ScriptedSequence|ScriptedSequence]] subclasses, one for &quot;walking around&quot; (to select roam destinations in jail only), one for &quot;lying down and sleeping&quot; and one for &quot;engage in jail fight (and stop when the opponent opts out)&quot;.  The latter two will probably require custom scripted ''actions'' too:  &quot;start sleeping,&quot; &quot;wait and occasionally snore&quot; and &quot;stand up&quot;; and whatever is required to make a bot attack an opponent with an arbitrary melee or non-melee weapon.

Sounds like I'll better release alpha 4 ''before'' tackling that...

==February 15, 2003==

UT2003 bots don't really support being animated by means of a [[Legacy:ScriptedSequence|ScriptedSequence]] &amp;ndash; even if you manage to make them play a certain animation, the [[Legacy:XPawn|xPawn]] reverts to an idling pose as soon as that animation has ended.  In addition, those idling animations are natively &quot;physics controlled.&quot;

What's possible though is temporarily resetting the ''names'' of the idling animations to refer to non-existent animations.  That's a pretty heavy-handed approach, but it works (and puts a bunch of warning messages into the log).

'''Update:'''  ZappyAd pointed me to the bPhysicsAnimUpdate flag in class [[Legacy:Pawn|Pawn]].  Setting it to False disables the native &quot;physics-controlled&quot; animations, and indeed, it works well.

==February 17, 2003==

Scratched sleeping bots.  Implemented bots that hammer-fight in jail with human players instead.  Much more fun and rewarding.

==February 24, 2003==

I figured out the hard way that even custom game types can't simply replace the game's [[Legacy:TeamInfo|TeamInfo]] actors by subclassing [[Legacy:XTeamRoster|xTeamRoster]].  One of our bug hunters reported that setting up a game with custom bots broke crucial parts of the gameplay, and a look into the log revealed that UT2003 didn't use Jailbreak's custom TeamInfo subclass as configured in the the game type's DefaultEnemyRosterClass variable but instances of [[Legacy:TeamBlueConfigured|TeamBlueConfigured]] and [[Legacy:TeamRedConfigured|TeamRedConfigured]] instead.

So, once more, I'm ending up ''attaching'' an actor of mine to a stock UT2003 actor instead of replacing the stock actor's class by my own.  Jailbreak did so with several other gameplay-relevant classes (not just TeamInfo) before already &amp;ndash; PlayerReplicationInfo, for one, instead of introducing a custom PlayerReplicationInfo subclass.

In Unreal Tournament &quot;attaching&quot; an actor to another actor was more or less limited to the possibility of setting the attached actor's owner to the actor it was attached to and then using the ChildActors iterator to retrieve the attached actor when requested.  (Or any variant of that, though those that come into my mind are all equally inefficient.)

In UT2003 however every actor can have its own inventory by means of the Inventory variable which is declared in class [[Legacy:Actor|Actor]].  Traveling an actor's inventory chain is fast and efficient compared to using an iterator, so I implemented a generic abstract superclass for info actors that are &quot;attached&quot; to another actor, including code that automatically sets up a linked list of all &quot;actor tag&quot; actors of the same class and a mechanism that, if so desired, communicates registration and unregistration of an &quot;actor tag&quot; to all clients even during its lifetime.

Well, anyway, the TeamInfo problem was quickly fixed thanks to that mechanism.

===Comments===

'''Wormbo:''' Actually the inventory chain was available to all actors in Unreal v205 already. (Yes, I really have that code here... :D)

'''Mychaeel:''' Hmm.  I don't, but I do have the Unreal Tournament sources and... behold, you're right.  Oh well.  :-)

==March 17, 2003==

When I was implementing a new feature yesterday I noticed that I had to change a remotely related part of the code in order to avoid some small lag in a visual effect &amp;ndash; no big deal, but something that deserved to be fixed.  So I opened the class responsible for the delay, found the place where I had not anticipated the need for some direct connection between two pieces of code in my original design, and added it.

Then I realized that this was the third or fourth time I had added a bit of code at that place to accommodate a new requirement that had popped up since I had initially designed that class.  Each time I had addressed a small particular problem, each time I had added a bit of code to fix it; and while each of those changes were small and simple, the whole code grew more complicated and less elegant with every change I applied to it.

Time to scratch that part of the code and rethink its design with all old ''and'' new requirements in mind.

Changing, fixing and tweaking code a small part at a time inevitably leads to bloated, unelegant, bug-prone constructions sooner or later.  That's commonly called [http://info.astrian.net/jargon/terms/f/feature_creep.html feature creep] &amp;ndash; and after a time any software suffering from it becomes so unmaintainable that adding, testing and debugging a new feature becomes almost as much work as rewriting everything from scratch.  It's a developer's nightmare.

So sometimes it really pays off to start redesigning parts of a program before feature creep sets in.  The difficult part is to realize that before it's too late; and even more so for people not directly involved in the development process who can't relate to the idea of elegant, straightforward and bug-resistant program design.  Coding for a mod whose development is being slowly ground to a halt by somebody in charge adding more and more features that were never part of the original design can be a pretty frustrating experience.

==May 4, 2003==

ElapsedTime and RemainingTime in [[Legacy:GameReplicationInfo|GameReplicationInfo]] aren't replicated all the time in [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] &amp;ndash; that's for saving bandwidth, I suppose, and that must be a good thing.

Bad thing is that it doesn't work too well.  The idea is that ElapsedTime and RemainingTime are replicated ''once'' when the whole GameReplicationInfo actor is initially replicated to the client, and then the client increases ElapsedTime and decreases RemainingTime once per second all by itself.  Sounds simple enough, but somehow the initial value replication doesn't seem to work &amp;ndash; and that's not just in Jailbreak, it's exactly the same in vanilla Deathmatch.  Consequently, the time display in the scoreboard is out of sync with the actual game time.

The programmer who thought that up at Digital Extremes or Epic must have anticipated some of those problems though, because it actually gets a bit more complicated than what I described above.  In addition to ElapsedTime and RemainingTime there's a variable called RemainingMinute that is replicated every time it is changed.  The Timer event in [[Legacy:DeathMatch|DeathMatch]] sets it to the current value of RemainingTime every full minute.  GameReplicationInfo in turn picks it up and copies the replicated value of RemainingMinute to the client's local RemainingTime, thus re-syncronizing RemainingTime with the game's actual time.

Since I'd like Jailbreak's spiffy game time clock in the scoreboard to show the right time at ''all'' times though I guess I'll have to look for a fix.

'''Update:'''  Two distinct problems there:  Firstly, the initially replicated value of RemainingMinute always resets RemainingTime to the last full minute on mid-game connect; secondly, there can be an almost arbitrary delay for precaching textures and other content between PostNetBeginPlay (when the values for ElapsedTime and RemainingTime have just been replicated) and the first call of Timer (where they're updated client-side).

==May 7, 2003==

...so in Jailbreak the client sends a replicated function call to the server which directly responds by sending another replicated function call back to the client along with the current server time.  The client calculates a time offset between itself and the server; and if it also takes the time into account it took the response function to be called on the client after the synchronization request had been issued, it's possible to synchronize client and server time to a precision of approximately a tenth of a second.

That happens once a client has finished loading and precaching the game.  [[Legacy:GameReplicationInfo|GameReplicationInfo]] only replicates the server time the match started, and determines ElapsedTime and RemainingTime based on the current client time and its offset to the server time.

===Comments===

'''Kuhal:''' I am interested in the replication behaviour you have discovered here.  It may lead to an explanation of some behaviour I am getting during a pause in a network game.  The client's countdown clock rapidly counts down the seconds that have passed while the match was paused.  While I am certain the remaining time on the server has indeed been paused, it seems that the client thinks it knows better and catches up.  The weird thing is that the game ends &quot;on time&quot; when the client ramaining time reaches 00:00.  Are there any more references to how these attributes work in UT?

==May 22, 2003==

&quot;All you can eat&quot; for 5 ? in the uni's cafeteria today.  Burp.

Jailbreak's [http://www.planetjailbreak.com/misc/jailbreak2003-scores-5.jpg?link scoreboard] displays a minimap showing the current locations of your teammates.  In network games that means that those positions have to be replicated to all clients.  That leads to jerky movement of the dots on the minimap because the locations are updated only every couple of frames, not every (client-side) frame.

That problem can be somewhat relieved by using the [[Legacy:Pawn|Pawn]]s' actual positions when they happen to be present on the respective client; but the other player positions still jerk.  Some sort of motion prediction or motion interpolation should be built in; and preferably in a way that does not multiply the bandwidth requirements of the whole separate location replication business &amp;ndash; my bandwidth conscience is striking already without that.  That rules out simply replicating the player's velocity along with their position.

Since the minimap is by design mini, the updates usually don't go beyond a movement of a couple of pixels each time; and it's more to show the players' rough current whereabouts anyway, not their precise locations.  Maybe an algorithm that &quot;learns&quot; about the frequency of the position updates and interpolates between the ''last two'' replicated known points (and beyond if the next update isn't received in time) might yield smooth and reasonably accurate results.

Unrelated to that I also wonder whether I should keep up the splines connecting the player names to their location dots on the minimap.  I'm starting to think that simply attaching a small tag with the player's name and possibly a health bar would be nicer.

==May 24, 2003==

The principle works, but the movement is still jerky.  Motion prediction doesn't work well because the time that passes between a replicated variable being set on server-side and its new value being received client-side varies wildly:  So even when the player is moving in a straight line at a constant velocity, the client-side predicted location has to be corrected with every update.

Now I'm pursuing a different idea &amp;ndash; adding the received location updates to a client-side list and trying to have the client interpolate along that list of locations, choosing its velocity independently as to keep up with the succession of new locations that are added to the list.

When the client-side interpolated location information reaches the last known location in the list and the player is not known to have stopped moving server-side, it extrapolates the player's movement using the last known direction and velocity.  That can even be used to save bandwidth:  The server only sends another update when it expects the client-side extrapolation to have deviated from the player's actual location too much.

==May 25, 2003==

To my mild surprise what I've implemented now works much better than I had dared to hope.

The server sends occasional location updates to all clients; and in addition to that, the absolute value of the player's movement velocity.  The ''direction'' of the player's movement is derived from the succession of location updates; as described in the previous entry it's impractical to derive the velocity as well from the location updates because time differences can't be relied upon when network replication is concerned.

Using the absolute value of the player's velocity instead of the velocity vector itself saves some bandwidth &amp;ndash; two thirds in the size of the replicated data item alone (vector consists of three floats, its absolute value of only one), and it's also much less likely to change (the absolute value remains the same even when the player changes his movement direction or strafes).

Still, with every location update there's bound to be a small deviation between the client-side extrapolated location and the updated absolute location sent by the server.  Client-side, that deviation is simply smoothed out on a short time scale &amp;ndash; that way the client-side motion simulation never suffers of any jerking motions, only small variations in movement speed which are virtually impossible to notice.

What I haven't implemented yet is the aforementioned optimization of location updates when a player keeps moving on a straight line for a while, thus making the client-side linear extrapolation sufficiently accurate even for longer periods between updates.  No actual player does that in a firefight, of course; but it's not all that unlikely to happen in general, especially given that without that optimization location updates would be sent with a frequency of about five times per second.

'''Update:'''  Reducing the number of location updates that way works fine as well.  When moving on a straight line several seconds may pass between two location updates while the client-side minimap location indicator still accurately shows the moving player's constantly changing location, smoothly picking up a later change in the player's movement direction.

==May 26, 2003==

Would it still be fun if there weren't always more problems awaiting a solution?

When reading my code again I realized that it wasn't at all robust against server-side updates that never reached a particular client.  While the mechanism doesn't rely on the time between two received updates anymore, it still assumes that the client gets to see every update the server sends &amp;ndash; and that may not necessarily be the case.  If the client misses one update, the client's idea of the player's movement direction will be completely off, especially since the server already sends only the minimum amount of updates that can be used to derive the direction.

So I have to make sure that the engine itself takes care that all clients always have a consistent set of information &amp;ndash; the engine must know that if a client misses one or several updates it is necessary to send the last ''two'' location updates to that client next time.  The easiest way to achieve that is by having two replicated location variables that are alternatingly set to the player's most current location &amp;ndash; the other one then contains the location one step earlier.

However, the problem isn't completely solved already by that.  Since those two variables (a two-element array, actually) are set alternatingly server-side (so that on each step only one of the values changes and has to be replicated), the client has no way to know which of the two replicated locations is the most current one &amp;ndash; and so it can only derive the axis on which the player is moving, but not whether the player is moving &quot;forward&quot; or &quot;backward&quot; on that axis.  The client needs one bit of extra information to resolve that ambiguity.

It's not as trivial as it may sound to derive a consistent notion of &quot;forward&quot; or &quot;backward&quot; for any given non-zero vector.  Simply trying to define &quot;forward&quot; and &quot;backward&quot; in respect to a certain fixed direction is ambiguous as soon as a vector is lying in the plane perpendicular to the chosen direction; so that won't work (or rather, it will, but only in ''almost'' all cases, which is unfortunately not enough &amp;ndash; Murphy knows).  So, the method I've chosen to define &quot;forward&quot; and &quot;backward&quot; takes the signum of the first vector component (X, Y, or Z, in that order) that is not zero &amp;ndash; that's guaranteed to be non-zero for any non-zero vector, and the resultant value changes its own sign when the vector does.

To sum it up, the client now has ''two'' replicated location values without knowing which one is the most current one; so it calculates the vector difference between those two and applies the notion of &quot;forward&quot; or &quot;backward&quot; on it (described above), checks it against the separately replicated bit of information sent by the server and changes the vector's sign if necessary.  And Bob's your uncle.  (See what Terry Pratchett does to one's vocabulary?)

But... wouldn't it have been much easier and just as effective if I had simply replicated an extra bit of information telling the client which of the two locations is the most current one, instead of laboriously introducing weird notions of &quot;forward&quot; and &quot;backward&quot; vectors? &amp;ndash; Easier it would be but not as effective.  That bit would have to be changed every single time the server does an update even if the player only made a slight correction in his movement direction; the method I've chosen only changes that bit when the player's movement direction changes from &quot;forward&quot; to &quot;backward&quot; (in the special absolute sense described above), so it only ''occasionally'' requires a change instead of ''always''.

'''Addendum:'''  I actually have it implemented by replicating that extra bit of orientation information as ''the velocity's signum'' &amp;ndash; in an attempt to save bandwidth when both velocity and orientation change at the same time (and it also wouldn't take any more bandwidth when the velocity alone changes).  Upon writing about it here it suddenly occurred to me that this maybe wasn't all that smart after all &amp;ndash; if ''only'' the orientation changes but the velocity doesn't, the engine still has to replicate an entire float value even though only a single bit changed.  Would it be more efficient to go the straightforward way and use a separately replicated bool variable?  I'll keep a close eye on which updates actually need to be sent by the server in a real-game situation and decide then...

(And that's also why writing in this &quot;developer journal&quot; is worth the effort even if nobody's actually reading it &amp;ndash; it makes me critically review what I've coded.  It's a one-person code audit, so to speak.)

==May 30, 2003==

So, at last, the scoreboard is feature-complete.  Phew.  I dread writing the log for the CVS commit and getting JDN up to date... but the sooner I start, the sooner I'll be finished.

Showing the Jailbreak scoreboard has a noticeable impact on framerate at the moment &amp;ndash; I haven't been able to spot a certain, single part of the code that's responsible for the majority of the framerate hit.  Disabling certain scoreboard elements one at the time shows that the clock takes as much performance as the dotted splines do, and the code that updates the scoreboard's state with the game's live information isn't far behind.  The performance hit seems to be evenly spread over most the code.

Especially something like the clock could benefit from some sort of graphics cache &amp;ndash; it changes only once per second, but has to be rendered every frame.  If I could draw the clock on a [[Legacy:ScriptedTexture|ScriptedTexture]] and then on the screen, and update the ScriptedTexture only once per second, that might save several milliseconds per frame... given that I'd manage to get alpha transparency to work on a ScriptedTexture; I wouldn't like the clock to be displayed on a rectangular black background, not even for performance's sake.

Maybe there is a way to use alpha transparency on a ScriptedTexture.  During my experiments around drawing a map screenshot on a ScriptedTexture for the scoreboard minimap I noticed that the ScriptedTexture's DrawPortal function did, somehow, alter the ScriptedTexture's alpha plane &amp;ndash; it seems that wherever DrawPortal renders a normal solid texture, the ScriptedTexture will be completely transparent, but where an alpha-masked texture is drawn on the ScriptedTexture by DrawPortal the ScriptedTexture adopts its alpha mask there.  It's all pretty strange.

I also remember that in Unreal Tournament a ScriptedTexture could have a &quot;background texture&quot; that was used to initialize the ScriptedTexture canvas every frame.  I haven't found a corresponding property in UT2003's ScriptedTexture class, but maybe it's reusing an inherited property for that purpose &amp;ndash; FallbackMaterial maybe?  Gotta try that when I'm home.

==May 31, 2003==

I've finally decided that the manual implementation docs I had put on JDN have outlived their purpose &amp;ndash; they originally were the detailed specifications for the code before UT2003 was released, but after the classes were actually created there's little point in still keeping the specs around and manually up-to-date.

I tried [[Legacy:UnCodeX|UnCodeX]]'s HTML export, and while it works fine, it's information overflow.  I think people interested in Jailbreak 2003 implementation details do better with syntax-highlighted source code alone &amp;ndash; I tried to document it well after all.

The Wiki script running JDN now supports an extra parameter for the &lt;code&gt;&lt;uscript&gt;&lt;/code&gt; tag that directly takes the sources from the CVS repository and renders them on the page.  It looks pretty neat and saves me lots of time keeping the specs consistent with the code.  Maybe I'll later add a DHTML feature for &quot;collapsing&quot; function bodys to keep only the comment headers visible by default.

'''Update:'''  Oh, and FallbackMaterial as a [[ScriptedTexture]]'s background texture does not work.  Guess I'm out of luck.


== June 4, 2003

I want to keep players from using their translocator to get out of jail the easy way, and I don't want them to be able to telefrag Bonus Pack monsters.

Unreal Tournament had a handy AllowTranslocation query function in [[DeathMatchPlus]] for that.  Whenever anybody, player or bot, tried to translocate, this function was called and had the opportunity to prevent the translocation attempt.

Unfortunately, there's nothing like that left in UT2003.  The only thing that remains is a function in [[SquadAI]] that's queried for whether a bot will try to translocate.  The code that prevents players from telefragging teammates is buried in the Translocate function in class [[TransRecall]] -- it's basically a hard-coded check whether two players' collision cylinders impinge.


The only ''possible'' way into this code is via the SameTeamAs function (class [[Controller]]) used there that in turn calls IsOnTeam (class [[GameInfo]]).  The game could pretend that monsters are on the same team as any player trying to telefrag them, but SameTeamAs is used by other parts of the game code as well, which makes (ab)using it to prevent monster telefrags not straightforward.

And it still leaves me with the question how to prevent players from translocating out of jail...

'''Update:'''  I've ended up with removing the translocator from jailed players' inventories.  It's not all that messy after all.

=== Comments

'''ZxAnPhOrIaN:''' Maybe make an actor or volume that kills the translocator beakon when you try to teleport out, killing the person.

'''ZedSquared''' (from a UT classic point of view, dunno if any of this is feasable in 2003) Have a spawnnotify that catches transloctargets and modifies their velocity to kick them back to the owner (or the middle of jail) if they're in the jail zone perhaps ... or maybe subclass translocator, give the modified one as default inv, and override the fire function to not work in jail ... probably duff ideas, just thinking aloud late at night :)

'''Mychaeel:''' I'd rather try not to replace the normal translocator to achieve the effect I'm looking for (plus, there's nothing like SpawnNotify in UT2003)... and I'd also like not to require mappers to put in special zones or volumes.  (Right now jails work with any volume or zone a mapper places -- [[match these tags|attaching]] them to a JBInfoJail actor makes them part of a jail.) -- I could simply take a player's translocator away when he enters jail and give it back when he leaves jail, but that seems a bit messy.

'''Foxpaw:''' I don't see the problem - can't you just disallow translocator use in jail like in Jailbreak for UT?

'''Wormbo:''' That's exactly the problem, there is no AllowTranslocation function like in UT which allows the gametype to prevent translocation or add various other effects like flagdrop etc.

'''Foxpaw:''' Well, in that case why not allow translocation in jail, and just have surfaces that make up the jail solid? That way the translocator beacon would not be able to be launched out of the prison so a player couldn't escape merely by translocating.

'''Mychaeel:''' That would be a mapper-based solution, but the past (Jailbreak III) has shown that even in jails that were meant to be airtight (and must have been in editor terms since there a jail was defined by a distinct zone) occasionally had collision &quot;gaps&quot; in them that allowed players to shoot or, possibly, throw a translocator target outside (JB-Raid).  Even if a jail really is airtight it may be possible to place the translocator target so that translocating to it will place the player outside jail (JB-Antipody).  Besides, some jails are meant to have open windows to the outside or escape routes that players should be able to walk, but not translocate through.


== June 6, 2003

The Jailbreak core to-do list has become pretty short.  Maybe, maybe, in a few weeks...


== June 8, 2003

BeyondUnreal's forum breakdown will leave Jailbreak's development forums completely empty when they're back up.  Most of the hundreds of postings in there I'd have liked to keep mainly to keep a history of Jailbreak 2003 development; but some of them were ongoing discussions and long-term documentation.

Unrelated to that, early this afternoon my personal computer at home broke down as well; that leaves the CVS server and Jailbreak Developer Network offline too.  Fortunately the data itself wasn't lost; just my computer won't work.  If I'm lucky it's only either the power supply or the mainboard.  The bad thing is that tomorrow is a holiday here, so I'll need to stick with this notebook as a temporary measure till I have a chance to buy replacement parts.

=== Comments

'''Tarquin:''' I'll do my best to remember what's been going on. [[Jailbreak rescue]]

'''Mychaeel:''' That's a great idea.

'''Tarquin:''' Maybe I shouldn't put code dev topics on a public wiki though. I can just scribble a text file, or on the JDN

'''Mychaeel:''' JDN is down along with my computer, I'm afraid.  Tahngarth has set up a temporary Core Dev forum at http://www.planetjailbreak.com/tempforum/ -- register there and meet Tahngarth or me in chat to get access.


== June 9, 2003

After finishing some Perl coding work (which I'm actually getting paid for) I'll see that my computer is restored to working order or that I at least find out which component exactly needs to be replaced.

'''Update:'''  The computer boots up with an old PCI video card; but as soon as I replace it by a AGP video card (either my current GeForce 4400 Ti or an older GeForce 2 MX), I only get either a strange creaking sound from the PC speaker or nothing at all.  Only the fans work.

A friend of mine who's professionally dealing quite frequently with broken PCs suggests that it might be either the power supply that doesn't manage the AGP cards' load anymore, or the mainboard for some reason doesn't like AGP cards anymore.  Unfortunately I don't have a spare ATX power supply at hand, so I won't be able to test that theory until tomorrow at the earliest.

In case it's the mainboard I'll at least use the opportunity to upgrade my old Athlon 800 MHz to whatever it is you can currently still get in a regular computer hardware shop -- apparently it's hard to find anything slower than 2.0 GHz nowadays.


== June 10, 2003

My computer is up and working again.  I was surprised that for not more than about 180 ? I got a new processor (Athlon XP 2000+) along with a mainboard, silent cooler and memory (512 MB).  I could even keep my previous 235 W power supply.  By accident the processor is currently underclocked to 1.25 GHz (its normal clock rate would be 1.67 GHz) -- I'm not even sure whether I can be bothered to open the case once more and set the jumpers correctly.

So far the system seems to be stable.  Time will tell.


== June 11, 2003

Bots should simply try to avoid being killed when &quot;evasive&quot; team tactics are selected.  (Useful when a team has a narrow lead shortly before the time limit runs out.)

I got that to work reasonably well with relatively little effort, code-wise:  Set the bots' aggressiveness to a really low value to ensure they don't feel inclined to engage in fights; then overwrite PickRetreatDestination and make it react in a suitably cowardly manner if the bot is seeing an enemy.  Right now they simply pick the [[NavigationPoint]] among their current MoveTarget's [[ReachSpec]]s that's farthest away from the enemy, or the closest one that provides cover.  Effectively that makes bots run away from an approaching enemy and make turns in order to move out of the enemy's firing line.

While it's fun (for a while) to chase bots around in a test map, I've come across one or two situations where bots are effectively stuck and too easy a prey to approaching enemies.  First I'll have to have bots detect this; then I'll have to have them react to it suitably, for instance by either simply choosing another way out or by acting like a cornered beast and falling back to normal dogfighting tactics until they're either dead or the threat is gone.  (Tomorrow more -- I'm tired.)


== June 13, 2003

I found one reproducible situation in which bots are stuck in a tight loop of pathnodes they visit:  A bot sees an enemy, turns to flee, runs into cover; arrived there it wonders what to do next and decides to go on an inventory hunt, which leads it back into the enemy's sight -- ad inf.

The bad thing is that bots (or rather the native function FindBestInventoryPath in [[Controller]]) are not smart enough to check whether they even have the chance to pick up the inventory when they've reached it -- otherwise they wouldn't even try to reach it more than once in a row, and my problem would be a non-issue.


== June 14, 2003

A comment in [[Bot]] hints that Epic meant to add a function called FindPathAwayFrom at some time -- alas, they didn't yet.  That leaves me with either sticking to my simple escaping algorithm from above (and its flaws) or creating a path finding function myself, in UnrealScript.

I've started giving the latter a try.  The idea is to recursively search the path network for [[NavigationPoint]]s that provide cover from the enemy, starting at the bot's current MoveTarget.  Some first test runs seem to indicate that it works, and it seems to have negligible impact on the performance so far.  (The Clock/UnClock mechanism described on [[Code Optimization]] proves pretty useful for such profiling.)

'''Update:'''  If a bot doesn't find cover nearby and realizes that the enemy must have seen it (because it isn't looking the other way right now), the bot panics and reverts to normal attack mode until the enemy is dead or out of sight.  I've put all that into CheckSquadObjectives now, and it seems to work pretty well testing it with a single masterful bot.


== June 16, 2003

Hmm.  Why on earth does the game rules tab maintain its settings in separate config variables instead of taking and storing them in the game type's own configuration?


== June 17, 2003

Why does filling the mutator list box on the &quot;Mutators&quot; tab involve two other separate classes?  Why is reading a list of available mutators a native function?

=== Comments
'''Wormbo:''' I guess it's supposed to speed up loading of mutator classes, but it's not really that much of a boost compared to the &quot;old&quot; GetNextInt(Desc) method because now the mutators' code packages have to be loaded in order to find the mutators' names, descriptions and groups.

'''Mychaeel:''' I wonder whether that native function (GetMutatorList in [[xUtil]]) does indeed load the mutator name to get the mutator name and description -- a comment says it does ''not'' fill in the MutClass element of the MutatorRecord structure, which would make little sense if the class is loaded anyway.  (Unless GetMutatorList was internally &quot;optimized&quot; only to look up the class's default properties without loading the class; but I'd be a bit sceptical as to the wisdom of ''that'' optimization.  But maybe it has to do with cheat protection validating all loaded code...?  Gah.) -- There's an UnrealScript function LoadClasses in [[xMutatorList]] that would load the mutator classes, but it doesn't seem to be actually used.

'''Wormbo:''' It's not the only questionable optimization. (Still remember &quot;&lt;code&gt;// FIXME THIS SUCKS&lt;/code&gt;&quot;?) [[GUIController]].GetWeaponList also is a native function and it definately loads and returns weapon classes. I can't see any real optimization over Unreal's or UT's code here.


== June 18, 2003

I'd like to intercept when somebody is clicking on a checkbox -- not just the part with the check mark but its label.

It took a while until I figured out that the bAcceptsInput flag must be set to True for any of a [[GUIComponent]]'s delegates to be called.  (Mmph.)


== June 23, 2003

The OnDraw delegate is called for custom [[GUIPanel]] subclasses but not for direct subclasses of its parent class, [[GUIMultiComponent]].  Does that have a deeper sense or did just somebody forget to add a call to the delegate in [[GUIMultiComponent]]'s native Draw implementation?

'''Update:'''  Is it just me or does setting the TextFont property in [[GUILabel]] (and, thus, the LabelFont property in [[GUIMenuOption]]) have no effect at all?  (Obsoleted by the introduction of [[GUIStyles]] maybe?)  All labels in the game seem to have the same font, even those where Epic's own UnrealScript code decrees otherwise by setting TextFont.


== June 28, 2003

This one has me baffled (in a [[WebApplication]] subclass):

&lt;uscript&gt;
function QuerySomething(WebResponse WebResponse) {
  local string ResultTemplate;
  ResultTemplate = &quot;should be overwritten by the next statement&quot;;
  ResultTemplate = WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
  }
&lt;/uscript&gt;

Now I'd expect ResultTemplate to contain the result of parsing the file something.inc... right?  And so it does, but '''appended to the previous value of the variable.'''  The resultant value of ResultTemplate is something like this:

  should be overwritten by the next statementContents of something.inc

Is that an engine bug?  Some arcane feature?  How can using LoadParsedUHTM on the right side of an assignment change the way the assignment operator works (given that the return value of LoadParsedUHTM is a mere string)?

However, the following workaround solves the problem:

&lt;uscript&gt;
  ResultTemplate = &quot;&quot; $ WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
&lt;/uscript&gt;

Trying to cast the right side to string in an attempt to do the same ironically yields a &quot;No need to cast StrProperty to itself&quot; compiler error.

==July 3, 2003==

Working on an HTML parser and formatter in UnrealScript again.  This time it'll be standalone and not part of [[Legacy:Screen|Screen]], even though I intend to use it for that end as well; and this time it's possible to use it on both [[Legacy:ScriptedTexture|ScriptedTexture]]s and a regular [[Legacy:Canvas|Canvas]].

I hope I'll get around to implementing tables and floating images as well this time.  The base architecture I'm currently designing and coding takes the requirements for those features into account already, so it should be straightfoward to even follow W3C's specification of [http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 calculating the width of columns] according to the standard.

==July 5, 2003==

The native Split and Divide functions turn out to be extremely handy for the kind of text parsing I'm doing at the moment.  (But I still want my native regular expression support in UnrealScript... mmph.)

===Comments===

'''El Muerte TDS:''' Nah, regular expression suck for text parsing, they are only useful for match (and replace). Using a [[Legacy:Tokenizer|tokenizer]] is much better for text parsing. It would be better if the native tokenizer was available in uscript.

'''Mychaeel:''' I dare say that depends on how you'd use regular expressions.  The _nextToken function in your tokenizer could be formulated much more efficiently using regular expressions, for instance.  (Though I agree that the availability of regular expressions might lead some people to creating terribly inefficient parsers.)

For that matter, my prime concern about this HTML parser is its performance, so parsing through the input stream character by character in UnrealScript is something I'm determined to avoid.  (The first version of [[Legacy:Screen|Screen]]'s ScreenSlidePage HTML parser did that, and it was slow as hell for anything exceeding ''very'' few kilobytes of input text.)

==July 6, 2003==

The HTML parser works like a charm since yesterday and nicely dumps the structure of a parsed HTML file, though I haven't made any performance evaluations yet; but in any case there's even some potential for optimization still (like identifying a tag's handler class by something faster than the sequential search I've settled for until the rest works, like binary search &amp;ndash; did I mention that native hash support would be a great addition to UnrealScript too?).

===Comments===

'''El Muerte TDS:''' There is a type called map, but it's only native atm (just like dynamic array used to be).

==July 9, 2003==

As usual it's not the ''normal'' case that makes implementing something a challenge; it's the ''pathological'' cases that do.

The obvious step after implementing an HTML parser is creating a formatter for the parsed HTML element tree.  The old one I made for [[Legacy:Screen|Screen]] (one of my first UnrealScript projects altogether) has no concept of tables or floating boxes, but this time I'm determined to add support for those and so I have to deal with the conceptual odds and ends that come with it.

A floating box is actually a pretty straightforward concept:  It's a rectangle that's placed at the left or right edge of the containing box starting at the vertical position of the text line it's defined in.  That technique is most commonly used to have text flow around an image on a website.

Normally, a web designer adds floating elements at the very start of a paragraph so the boxes are placed already when the formatter starts wrapping lines between them.

The beginning of a paragraph is, however, not the only valid place for floating boxes:  They can just as well be defined in the middle of a line, and that's where the trouble starts.  As long as the current line is short enough to fit next to the box, everything is still fine; just add the floating box and shorten the line box accordingly.

But what if the floating box is too wide to fit next to the text line where it's defined in?  The HTML standards document says that the box is then to start directly ''below'' the line it is defined in; that's simple enough to implement... but subsequent text after the definition of the floating box is still to be added to the very same line ''above'' the box, and according to Murphy's law somebody is bound to have some item in that line after the floating box definition that increases its line height.  That means, basically, that the absolute position of the floating box may not be completely determined at the time it is added.  Consequently, it may be necessary to shift the box down ''after'' it has been rendered.

==July 14, 2003==

I just realized that I failed to enter [[Legacy:UMake|UMake]] for the contest.  Ah well &amp;ndash; it sorely needs an update anyway given the huge list of pending fixes and improvements, and there's a lot of time till the deadline of phase two.

It's a bit of a pity that [[Legacy:MeshMaker|MeshMaker]] isn't eligible.  It might have had a chance to win something.

===Comments===

'''Haral:''' FYI, the deadline for the contest is tomorrow.  You can still enter, I do think.

'''Mychaeel:''' It is?  Well &amp;ndash; hardly enough time to give it the overhaul it deserves unless I was ''really'' desperate to enter it in phase one, but since there are two more phases to go, I think I'll just target phase two for now.  But thanks for the correction.  :-)

'''Haral:''' Those were my sentiments as well.  There's a lot of work to do on my mod, playable as it might be, before I'll feel it's ready for any sort of release.  Thanks for moving that comment btw, my brain doesn't exactly work well while I'm at work.  Anyway, time to get back at it, if I want to be ready by October.

==July 16, 2003==

Trying to read a binary file in UnrealScript.

The LoadParsedUHTM function in a freshly created [[Legacy:WebResponse|WebResponse]] object does well enough for text files, but I ran against a fundamental problem of UnrealScript's string data type here:  Obviously it's not as high-level as it should be in a language like UnrealScript and doesn't handle embedded null bytes (&lt;code&gt;Chr(0)&lt;/code&gt;) well.  A null byte terminates a string for all UnrealScript-related intents and purposes; so the content of the binary file I read is clipped off after a few bytes when the first null byte appears.

The only solution for that I can currently think of is briefly opening a TCP link from the game to itself, serving the binary file using the IncludeBinaryFile function in WebResponse and receiving it with a simultaneously spawned [[Legacy:TCPLink|TCPLink]] in binary mode.  But that's not only quite cumbersome, there's also a chance that some people's personal firewalls might complain about it (even though it's nothing but a local intra-process connection)...

===Comments===

'''Wormbo:''' AFAIK Quake 3 only works like this, even a single player game connects to a local game server, and when playing a skirmish game with open slots other players could join it, expanding it to a network game.

'''Nytro:''' I ''think'' this now constitutes more than &quot;short thoughts that popped up during Jailbreak development.&quot; o_O

'''Mychaeel:''' You're right.  I've scratched the &quot;short&quot; part in the description.

'''Nytrogen:''' I hate to continue to bother you... I don't own UT, and I can't find a decent description of [[Legacy:Screen|Screen]]. Would you mind giving me a link or quick 'Screen overview' blurb?

'''Wormbo:''' You just linked to it. There are links to the Screen website and forum. You should find any information you need there.

'''Birelli:''' Specifically the &quot;about&quot; page: http://www.planetunreal.com/screen/about.html on the Screen website.

==October 1, 2003==

This morning I officially handed in three copies of the physics diploma thesis I had been working on for the last year (and which had kept me off anything Unreal-related for the last two months).  For those interested, it's about ''Metal-Induced Crystallization of Silicon-Germanium Layers'' &amp;ndash; fundamental research for the next ('third') generation of solar cells which will be far more efficient and much cheaper to produce than what's currently on the market.

Well.  ''[takes a deep breath]''  This concludes more than half a decade of studies of mine at the Technische Universität München (I recently learned that they attach great importance to not being called &quot;Technical University Munich&quot; or something like that even on the cover sheet of English-language publications such as my thesis).  I guess it'll take a couple of days until I have really, deeply grasped the significance of this.  Right now, I'm mostly just relieved, happy, and tired.

One thing is sure, though:  I'm ready to get back into the Unreal community.  Even though I had been preoccupied by other things, I've really missed it.  :-)  It'll take me a few days to catch up, however, and there's also a lot more in my life which somewhat suffered during the last few weeks and which I have to catch up with, so be gentle.

===Comments===

'''Sobiwan:''' Solar cells: nice.  Enough of this fossil fuel baloney.  I hope your thesis helps push research and/or development further.  

'''Tarquin:''' Yay! Welcome back Mych. Good work saving the planet :)

'''El Muerte TDS:''' heh, it's not like this is the only planet we have ;) About the uni name, ofcourse they want it to be the german names, the english name is too easy to write, it doesn't have ä and ü. They want you to put effort in typing the name.

'''Mychaeel:''' Well, I got a German keyboard here, so effort is not an issue. &amp;ndash; The [http://www.wsi.tum.de/E25/research/theses.htm Walter Schottky Institute] where I worked, on the other hand, does not have any problems with officially allowing the English name ''Walter Schottky Institute for Fundamental Research in Semiconductor Electronics''. &amp;ndash; But then again, its name doesn't have any äs and üs in it, so your argument still holds.  ;-)

'''Tahngarth:''' Well I hope you get an A (or whatever the best grade is) :)

'''GRAF1K:''' Good, NOW GET TO WORK ON JAILBREAK!!! :P Glad you're back. :-) 

==March 1, 2004==

''* Mychaeel blows the dust from his developer journal, opens it and continues writing.''

Just checked in some actual, new, original Jailbreak code again yesterday.  Quite an elevating feeling.

It's a facility for our audio announcements.  We noticed that the number of distinct announcements grew exponentially as we thought of more and more situations in which one would make sense.  Some documentation of the system is available on [http://www.planetjailbreak.com/jdn/JBSpeechClient JDN: JBSpeechClient].

===Comments===

'''Tarquin:''' Wow! :) Looks cool!

==April 1, 2004==

Short of a few rather small features and known bugs, Jailbreak 2003 is finally feature-complete.  Yay!

The transition from UT2003 to UT2004 has put a big item on our to-do list again, though.  Epic has broken source code compatibility on several places, and other problems seem to stem from binary incompatibility (the &lt;code&gt;Ping&lt;/code&gt; variable in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] suddenly transmogrified from an int to a byte, which breaks the score display in our scoreboard).

It's strange, yet interesting and somewhat impressive, that UT2004 manages to load and run the game anyway.  At the surface, Jailbreak 2003 runs well under UT2004 already, even though it ''looks'' like Jailbreak 2003, at least HUD-wise.  Of course we're going to make Jailbreak 2004 blend in with UT2004 as well as Jailbreak 2003 does with UT2003.

If possible without too much pain I'd very much like to release Jailbreak 200x as a combined UT2003/UT2004 release.  The changes are small enough that it would be a shame to abandon all UT2003 users who didn't have the chance or the money to upgrade to UT2004 yet.

I'm looking into the details of [[Legacy:CVS|CVS]] branching right now.  Our &quot;main line of development&quot; will become UT2004, but we'll keep a UT2003 branch and take care to merge any generic changes into it.  ...if that works the way I hope it does.

==April 23, 2004==

The Jailbreak to-do list is empty, and I'm out of work.  (You bet.)  Guess it's beta time now.  Yay!  :-)

Currently working on a Perl script that automatically updates all required modules from CVS, checks for uncommitted changes, rebuilds them if necessary and automatically creates the distribution packages.  I hope to be done with that sometime tonight.  My girlfriend made us a spiffy installer logo &amp;ndash; I'm looking forward to hearing what the others say about it...

===Comments===

'''Corran:''' That's great news (for us anyway :D).  I can't wait for this.

'''GRAF1K:''' What he said. My mouth is watering. :D

BTW, did you know that UW is integated with the UT2004 UDE? Click on the Documentation tab in the code editing area and and there's unDox and Unreal Wiki. Sweet. :)

'''Corran:''' Yeah, it's been integrated into WotGreal fo a while now.

'''GRAF1K:''' Who cares about WOTgreal... UDE is official. :D

'''DJPaul:''' WOTgreal ''is'' the UDE.

'''Guest:''' Like the core of the application changes anything whatsoever... O_o

'''Wormbo:''' c-24-7-171-253.client.comcast.net (Guest above), will you ''please'' stop deleting Murphy from this page?

==May 17, 2004==

Let it never be said again that modifying the mid-game menu in UT2003 requires a custom [[Legacy:PlayerController|PlayerController]] subclass...

[[Image:Legacy_mychaeel-ut2003midgamemenu.jpeg|center|]]

==May 19, 2004==

I'm practically out of ideas what else could be added to Jailbreak &amp;ndash; almost time to release now...

Last thing we implemented were custom loading screens &amp;ndash; it's actually pretty straightforward to replace the default images displayed while a map loads by custom ones at runtime.

We've even managed to create one loading screen per bundled map and have the corresponding screen shown when the map loads &amp;ndash; and I've added a means for mappers to [http://www.planetjailbreak.com/jdn/Loading_Screen embed a custom loading screens into their map] which is displayed when that map loads.  Given that the necessary information is all there and is just being ignored by UT2004 stock code, I wonder why Epic didn't do that themselves...

===Comments===

'''GRAF1K:''' Epic wanted to include their uber-1337 Photoshop lensflares though! ;)

Looks like a ''very'' nice release coming up from you guys over at Jailbreak. I'd count off the minutes if I only knew when...

'''Note:''' I am indeed the M*rphy killer. Buggy 3rd-party software... :pissed: I'll get it fixed. For now though, I can't even replace the M*rphy's once I've killed them. Just revert once you see this.

'''Mychaeel:''' Argh... what kind of bug would ''specifically'' replace occurrences of the string &quot;Murphy&quot; in a text...?  o_O

'''GRAF1K:''' Well, it's not the bug directly that's doing that. The bug is me not being able to turn the feature off. The feature in question is a privacy feature that blocks sending of personal info (like the owner's name).

'''Mychaeel:''' So is it safe to deduce that your name is Murphy?  (Way to go for a privacy feature... :-p)

'''GRAF1K:''' LOL. I was going to disable that feature anyhow. The app does a lot more than that. Besides, my last name isn't Mürphy, but the account is under someone who's is. :)

==May 20, 2004==

Naturally, any display of hubris such as making the statement &quot;I'm out of bugs&quot; angers the Gods, so the to-do list has a few more now.  Fortunately, they're all pretty small yet, and I'm out to squish them before they get any bigger...  ;-)

==May 23, 2004==

You have no idea how glad I am that we're making a UT2003/UT2004 release of Jailbreak &amp;ndash; if only for the reason that on both my desktop computer and my notebook with their measly 512 MB of RAM starting UT2004 (or even UT2004 server and client at the same time) takes ''ages'' while the system swaps like crazy &amp;ndash; and loading UT2003, even server and client, works without any swapping at all.  UT2004 is a monster...

===Comments===

'''El Muerte:''' I don't have any swap issues when running UT2004 on my laptop (512MB ram). Haven't done much client+server testing, but the client takes quite some time to join the server (/me blames slow laptop HD). On my desktop I can run a server and two clients without any serious problems (1GB ram). I think windows is to blame :P

==May 27, 2004==

Jailbreak is out.  We assume full responsibility for all bugs that were left in.  :-p

Seriously though &amp;ndash; everything went reasonably smoothly, and while there ''are'' some bugs we'll have to fix, nothing really serious has popped up yet.  Feedback is very positive; feels good.  :-)

I've submitted Jailbreak 2004 for the MSU contest.  Perhaps we'll win something.

==May 29, 2004==

There's a known issue in UT2004 which prevents anybody who ever selected a third-party gametype in the server browser from joining any other game of a different gametype.

This happens since, when a gametype is selected, its [[Legacy:GameInfo|GameInfo]] class is loaded and its static FillPlayInfo function is called.  After adding its settings to the [[Legacy:PlayInfo|PlayInfo]] object, the GameInfo class remains loaded in memory (probably because it's somehow still referenced by the PlayInfo object and thus cannot be garbage-collected), and when the player tries joining a server running a different gametype, that'll fail because the third-party gametype's package is still loaded.

I haven't been able yet to find out ''why'' exactly FillPlayInfo is called at this point by the server browser and which part of the code does anything with the data saved in the PlayInfo object referenced by the &lt;code&gt;FilterInfo&lt;/code&gt; variable.  However, simply avoiding to actually add anything to the PlayInfo object seems to solve the problem without any noticable side effect, so the following chunk of code makes everything work as it should:

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local UT2K4ServerBrowser UT2K4ServerBrowser;

  // check whether we are called from a server browser
  foreach Default.Class.AllObjects(Class'UT2K4ServerBrowser', UT2K4ServerBrowser)
    if (UT2K4ServerBrowser.FilterInfo == PlayInfo)
      return;  // ignore because called from server browser

  // now do the usual stuff
  Super.FillPlayInfo(PlayInfo);

  PlayInfo.AddSetting(Default.GameGroup, ...);
  PlayInfo.AddSetting(Default.GameGroup, ...);
}
&lt;/uscript&gt;

==May 31, 2004==

While fixing some netcode I found out that in one of my classes a certain variable was constantly, over and over again, replicated to all clients &amp;ndash; several times per second; that class had &lt;code&gt;bNetNotify&lt;/code&gt; activated, and PostNetReceive was called every other tick.

What baffled me was that this variable wasn't even changed server-side; nor did it change on client side.

It took me a while to find out what was happening:  This variable which was replicated over and over again was a [[Legacy:Pawn|Pawn]] reference.  As soon as the Pawn it pointed to was destroyed, the variable was duly set to &lt;code&gt;None&lt;/code&gt; on both server and client &amp;ndash; but the server kept replicating its value to the clients.  And at the end of the day, the follwing slightly weird piece of code fixed it all:

&lt;uscript&gt;
// fixes replicating over and over when referenced actor has been destroyed
if (PawnObjectiveGuessed == None)
  PawnObjectiveGuessed = None;
&lt;/uscript&gt;

The Unreal engine is full of mysteries...

===Comments===

'''Mysterial:''' That works because UnrealScript returns &lt;code&gt;None&lt;/code&gt; when accessing a property pointing to an [[Legacy:Actor|Actor]] with bDeleteMe == true. Internally, the [[Legacy:Actor|Actor]] is in fact still referenced by that property until the [[Legacy:Actor|Actor]] is truly deleted. It getting continually replicated might be a bug in the engine. Can you try to create a small reproduction case and send it to me?

'''Mychaeel:''' Will do.  :-)

'''Mychaeel:''' Hrmph... making a simple test case is not as straightforward as I thought.  Then again, if it was an obvious bug, it probably wouldn't be in there...  ;-)

==May 31, 2004==

Argh!  People report server crashes, and every single crash log has the following lines at its end:

&lt;pre&gt;
  Critical: UObject::ProcessEvent
  Critical: (JBCameraArena JB-Heights.JBCameraArena, Function Jailbreak.JBCameraArena.Tick)
  Critical: AActor::Tick
  Critical: TickAllActors
  Critical: ULevel::Tick
  Critical: (NetMode=1)
  Critical: TickLevel
  Critical: UGameEngine::Tick
  Critical: Level Abandoned Heights
  Critical: UpdateWorld
  Critical: UServerCommandlet::Main
  Exit: Executing UObject::StaticShutdownAfterError
  Exit: Exiting.&lt;/pre&gt;

That Tick event in question doesn't do anything special that I'd be aware of &amp;ndash; it certainly doesn't destroy the actor or anything like that.  And I cannot reproduce it at all in a local client/server testing environment, and it only happens infrequently on other servers anyway.

There may be one thing:  The Tick event calls a function within an [[Legacy:Editinline|editinline]] object (which was created along with the JBCamera actor as a [[Legacy:Subobject|subobject]]).  Perhaps, when JBCameraArena.Destroy() is called, that subobject reference somehow becomes invalid and crash-prone under certain circumstances?

: '''Update:'''  I just found out that all my JBCameraArena actors '''share the same subobject''' &amp;ndash; unlike what I expected, seeing that spawning [[Legacy:Emitter|Emitter]] subclasses creates ''distinct'' instances of their [[Legacy:ParticleEmitter|ParticleEmitter]] subobjects.  While I'm not sure whether that's responsible for the crashes, it's definitely not what I had in mind and it's a bug when more than one JBCameraArena is active at the same time.

To make it worse, those error messages don't really indicate what ''kind'' of error happened (the lines preceding them are different and nothing out of the usual in every case &amp;ndash; such as players joining or leaving; unfortunately I have no indication whether there's a temporal relationship between the events logged before the error and the error, but I believe there's not).

Is there anyone out there with Unreal-engine insight who might be able to tell me which kinds of errors would trigger those server log messages?

==June 2, 2004==

Phew.  The Jailbreak server crashes are '''fixed''' (and stress-tested successfully on MyUnreal's ever-full server), and so are the &quot;web admin does not come up again after level change&quot; and &quot;server does not react to UDP requests after a while&quot; bugs.  Those were the toughest ones to crack, mostly because I was fixing in the dark; the others were, while partly annoying, peanuts.

In retrospect it seems that the latter two bugs stemmed from the engine not fully cleaning up the previous level; and that, in turn, was apparently due to my storing some actor references in the ''class default'' values of a class &amp;ndash; I did that only to compare the stored references to given ones for caching a function's return value over subsequent calls.  Even if the actors were destroyed between two calls, I'd expect a comparison simply to fail.

After I worked around that problem (by storing the actors' locations in the cache &amp;ndash; in this case that worked just as well), suddenly those both bugs (web server not coming up again, UdpGameSpyQuery failing to bind its port after a while) were gone all by themselves.  So, note for the future:  '''Never store actor references in default properties!'''

===Comments===

'''Foxpaw:''' That's interesting. I've stored actor references in default properties lots. (For instance, any actor can get a reference to the level's backdrop in my case by accessing class'Base.Backdrop'.default.Reference. Perhaps this behaviour is limited to certain classes?

'''Mychaeel:''' Perhaps, but I don't think so.  The effect of doing that is hardly noticable in local testing conditions, in any case (otherwise I'd have seen it a lot earlier) &amp;ndash; as I wrote, the most noticable effect was that the web admin [[Legacy:WebServer|WebServer]] didn't get cleaned up on level change and that &amp;ndash; after many level changes &amp;ndash; a server just didn't respond to UDP requests anymore.  Otherwise, everything worked great.

'''Mysterial:''' Since classes are non-Actor objects, the usual issues with storing [[Legacy:Actor|Actor]] references in them apply. I'm somewhat surprised it didn't crash. Perhaps because the engine doesn't actually destroy the class objects as it would most other objects you'd store references in, since you're playing another Jailbreak game so it wouldn't ever unload the resources.

'''Mychaeel:''' Frankly, I wasn't ever aware of &quot;the usual issues&quot; with storing Actor references in non-Actor objects &amp;ndash; Jailbreak code still does that on several occasions ([[Legacy:LevelInfo|LevelInfo]] and [[Legacy:TeamInfo|TeamInfo]] references in the non-Actor objects which represent the small player icons on the HUD, and in at least one other place too).  Are you saying that referencing an Actor from a non-Actor object is always crash-prone and not supported by the engine?

'''Mysterial:''' [[Legacy:Actor|Actor]] references in non-Actor subclasses don't get automatically cleaned up by the engine, so they work just like C++ pointers in that accessing them after they've been deleted has horrible, unpredictable effects (generally crashing). Additionally, since part of garbage collection is traversing every object reference property that exists, you need to clean up any such references before a level change or you'll either get frequent serialization crashes or prevent the previous level from unloading, creating huge memory leaks, as you unfortunately found out.

==June 8, 2004==

With the stress of releasing Jailbreak over, I'm free to look into some of my old mutator ideas again.  One of them is '''SprayPaint''' &amp;ndash; a simple idea actually, borrowed from Half Life where the ability to spray-paint your clan logo on walls was built-in functionality.  I want to port that idea to UT2004.

This would be pretty straight-forward and quite uninteresting if I hadn't put it into my mind that it should be possible to customize the spray-painted images by simply dropping a BMP file (1-bit, 64x64 pixels) into a directory; and, if that's done by a client in a network game, all other clients should be able to see the same image too.  The latter is just some replication acrobatics; the former is where I saw my challenge.

Reading arbitrary files in UnrealScript isn't really supported, but if you need to do it for text files, instantiating a [[Legacy:WebResponse|WebResponse]] object and using its LoadParsedUHTM function works quite well.  However, UnrealScript strings aren't binary safe &amp;ndash; null bytes act as end-of-string tokens and thus cannot be included in a string.  Attempting to load a binary file such as a BMP image with LoadParsedUHTM results in a byte string truncated at the first null byte.

I've worked around that problem now by spawning a local [[Legacy:WebServer|WebServer]] listening on a random free port, delivering files as &quot;application/octet-stream&quot; with WebResponse's function IncludeBinaryFile, and a [[Legacy:TcpLink|TcpLink]] operating in MODE_Binary to receive the binary data from the local web server.  In theory this setup is able to read the contents of any binary file within the UT2004 directory hierarchy into an UnrealScript byte array, and it's working great for my purposes.

===Comments===

'''EntropicLqd:''' Can you see outside of the UT2004 directory structure with that technique?  Cunning solution btw

'''Mychaeel:''' Frighteningly enough, I can read ''any'' file that way.  (I had actually &amp;ndash; and perhaps naively &amp;ndash; assumed that the IncludePath in WebResponse would not allow UnrealScript code to travel beyond the UT2004 base directory...) &amp;ndash; Perhaps it'd be best to let Epic know about this and to remove this last &quot;Developer Journal&quot; entry for the time being...

'''EntropicLqd:''' I'd definitely let Epic know about it (I guess you have already).  Allowing access above the 2K4 root directory is an astonishing lapse on Epics part.  I was expecting a ''ho ho ho ofcourse not'' response.  Wonder if you could write a remote file browser...

'''Mychaeel:''' Without having a way to generically get full directory listings, I'm afraid (or rather, glad) that's not possible &amp;ndash; [[Legacy:StreamInterface|StreamInterface]] only provides a way to list directories (and a limited set of other file types, though I haven't been able to get that to work for anything except said directories and .mp3 files).

'''Mychaeel:''' The LoadParsedUHTM method works on any file on a given partition too, given the right IncludePath setting (e.g. &quot;C:/&quot;) in a subclass and without all the local web server hassle.

'''Mychaeel:''' I've sent a mail to Joe Wilcox.

==July 12, 2004==

Jailbreak 2004 is one of the gametype finalists in the MSU contest.  That's nice and I hope we'll win something too, but I find it more notable that Jailbreak got a honorable mention in the &quot;FPS Mod&quot; category.  I didn't check that box when I entered Jailbreak 2004 into the contest; it must have been the judges' decision to put it there too...

In completely unrelated news, I've been turning some of my spare attention to attempting to write a couple of extensions for Thunderbird to make my life easier (on the long run; you know, that &quot;impatience, hubris&quot; part that occasionally pops up in a Larry Wall quote at the bottom of an Unreal Wiki page).  Phew.  If you ever thought that UnrealScript was a humongous, complex and for the most part poorly documented heap of code already, do look at http://lxr.mozilla.org for an upgrade.

===Comments===

'''Tarquin:''' I don't know about you, but I am finding the Jailbreak community very quiet these days. I'm sure there was way more activity (posts, maps, discussion) in the days of JBIII. But I suppose that was the 3rd release and we are only on the first. BTW, if you have some spare time, do you think you could look at the Wookee class tree generator? It would be nice if the text of the tree was parsed for wiki links, so we could use it for Unreal classes here &amp;ndash; but I'm afraid I've not been able to work out how to do it. It's WookeeTree.pm in your CVS. :) 

==July 14, 2004==

My support for Opera 6 has finally broken down after the last vBulletin 3 update which made &lt;code&gt;[code]&lt;/code&gt; tags unreadable, and I've made the switch to Firefox.  I'm loving it already.

It has gone quite a long way since the last time I gave it a try (must have been around version 0.6), and most of the reasons I didn't want to switch to it then have gone meanwhile.  I'm especially fond of the ability to selectively skin websites with custom CSS (using the &quot;uriid&quot; extension and a specially crafted userContent.css), and I just ''have'' to love a program which allows me to tweak its user interface appearance by editing a CSS file...

In completely unrelated news, Fraunhofer IGD (whom I had sent an unsolicited application about three months ago and never heard back of) has offered me a job... working on a project in Seoul, South Korea.  Imagine my surprise.  I might even have considered it if I hadn't found another job in the meantime already ''and'' if I didn't specifically want to move closer to my girlfriend in the Frankfurt area.  Still, quite interesting...

(Is this developer journal turning into a blog...?)

===Comments===

'''Tarquin:''' Bwahahahaha! I knew we'd convert you in the end.... :P

'''MythOpus:''' Consider this a reminder from the entire wiki to update the Wookee download zip ;)

==August 20, 2004==

When you think you're finally out of bugs, Atari QA will come and send you a new bunch of them.  :-p

No, actually, it's not that bad.  It boils down to one actual code bug and a bunch of map-related things in the order of &quot;graphic seams flicker in and out around the pipelines.&quot;  Still, I was surprised when I got that mail...

===Comments===

'''GRAF1K:''' Why would Atari be interested in sending you bug reports?

'''Wormbo:''' One code bug and one code thing I wouldn't call a bug. (no weapon in celebration screen)&lt;br /&gt;They most likely sent the reports because they tested Jailbreak 2004. ;)

'''Mychaeel:''' ...and they tested Jailbreak 2004 because they want to include it in the Editor's Choice Edition.  Sorry, I kinda implied this.  ;-)

'''Guest:''' I figured ECE was the reason but wasn't sure. Congrats then. :D

==September 5, 2004==

Picking up my old SprayPaint mutator idea again.  To reiterate, it's about being able to spray logos on walls &amp;ndash; the logos must be provided as monochrome bitmaps (i.e. bitmaps with 1-bit color depth) in a certain UT2004 subdirectory, and you can spray them on walls in a color of your choice; and the best thing is that other players on the server would see the exact same thing even though they don't have the source bitmap on their system.  On the long run I even want the sprayed images to persist across matches.

There's a bit of replication acrobatics involved in making that work, but so far it works nicely &amp;ndash; the data is loaded client-side, transmitted to the server via a replicated function in &quot;bunches&quot; of no more than 64 bytes a tick, and then left to the engine to be replicated back to all (non-bNetOwner) clients.

Two things I noticed doing that were that, firstly, the engine only replicates the first 256 bytes of an array of 512 byte values (where I don't know exactly whether it's the number of elements or their total size which is limited by the engine); and secondly, that passing a byte array via a replicated function call will only actually replicate the first value of that array, not the entire array.  However, if the array is part of a struct which is passed through the replicated function, everything works fine (hence my &quot;bunches&quot; of data).

The user interface for that thing is keeping me thinking.  Right now I figure that pressing your usual &quot;talk&quot; key (&quot;T&quot;, for instance) quickly twice in a row (like a double-click) would pop up a window where you could select which image to spray (using the mouse or arrow/movement keys), but that idea is subject to change.  For now, the &quot;mutate SprayImage &lt;filename&gt; &lt;color&gt;&quot; console command does the trick.

==November 17, 2004==

I've moved into my new apartment last Sunday, and today I got ISDN and DSL activated.  Thus, JDN is up again &amp;ndash; whatever caused my computer to break down two weeks ago is mysterious to me.  Maybe my video card overheated after all after having been running non-stop for months without a monitor attached to it... still, not really a satisfactory explanation.

Now that my home computer has been hosting CVS, an Apache webserver with JDN and other services and an ISDN calling machine and fax server for quite a while and across several hardware updates, I've been thinking &amp;ndash; it's getting harder and harder to keep the noise level coming from this machine at a level I'm willing to bear in my living room.  Plus, most of the time the computer is merely converting electric power into noise and heat via a video card and processor which are ridiculously overpowered for something acting as a web/fax/CVS server most of the time.

...so &amp;ndash; *drumroll* &amp;ndash; I've got that fabulous idea of building a small machine out of spare parts mostly left over from hardware upgrades of my main PC over the years.  I've got two mainboards/processors to choose from (a Pentium 200 MHz and an Athlon 800 MHz which I could underclock to 500 MHz), some left-over RAM, an ethernet card (my latest mainboard had that on-board) and a simple video card (an ATI XPert@Work sporting a 3D chipset with the staggering amount of 8 MB VRAM).  I also have a midi-tower computer case somewhere.  What I need is a silent power supply and &amp;ndash; probably &amp;ndash; a new harddisk (especially if this thing is to act as a file server as well) unless I find a suitable one in my pile of used hardware.

I figure I'll install Debian Linux on it &amp;ndash; with that awesome 3 MBit/s downstream I've got I can even download it without much hassle.

'''Update:'''  Wow.  Silent 80 GB harddisks come for less than 60 EUR these days?  o_O

==March 8, 2005==

&lt;nowiki&gt;*blows dust off this page*&lt;/nowiki&gt;

&lt;nowiki&gt;*cough*&lt;/nowiki&gt; &lt;br /&gt;&lt;nowiki&gt;*cough*&lt;/nowiki&gt;

Remember the Palpable mutator for Unreal Tournament?  Probably not, because I never actually released it, and the BuF mess-up two years ago ate all remaining evidence for it.

Basically, it allowed the user to see stereo 3D by displaying two versions of the current scene rendered from slightly different points of view.  You had to squint to see the effect, just like for [http://www.brossco.fi/janne/eclipse99/budapest/bu_3d.html these photos].

I tried to implement the same thing for UT2004 on Sunday.  To the degree that two viewports were rendered on the screen next to each other, it was a piece of cake; but, having the HUD render within one of those viewports prove to be impossible.  In Unreal Tournament, it was basically just a matter of setting [[Legacy:Canvas|Canvas]].OrgX/OrgY and ClipX/ClipY right &amp;ndash; but UT2004's HUD makes heavy use of the native DrawSpriteWidget function which, while honoring OrgX/OrgY and ClipX/ClipY, doesn't take the reduced size of a viewport defined through those properties into account when positioning and scaling the widgets.

So, no way.  Well, it was just an experiment anyway.  The 3D effect itself is pretty cool, though, even if it strains the eyes to squint that way for an extended period of time...

In other news, after a period of consideration, I bought a digital piano today &amp;ndash; a [http://www.rolandus.com/products/ck_details.asp?CatID=11&amp;SubCatID=45&amp;ProdID=HP-101 Roland HP-101].  I played the piano for years before leaving my parents' home to go to university, and I want to pick this hobby up again.  And, wow, those digital pianos nowadays really do sound and feel like the real thing &amp;ndash; down to subtle details like the slight resonance you hear after releasing a key, or that the keys for the deep tones react with slightly more resistance to being pressed down than the high-pitched keys...

===Comments===

'''Birelli:''' I remember Palpable, I think a couple of us on IRC tested it for you one time. It's definitely a cool effect, but it gave me a headache after about 15 minutes of playing. Probably not something people want to use all the time. Also it takes a bit of practice before you can train your mind into not forcing one eye dominant over the other, so at first it's basically impossible to run in a straight line.

==April 19, 2005==

Those who have followed [http://www.planetjailbreak.com/?news=275 PlanetJailbreak news] are aware of what I've been working on recently: the visuals of freezing and shattering a player model.  Part of the problem is to overlay the player model and the weapon it holds with an &quot;ice&quot; texture that gradually fades in.

My first idea was creating a [[Legacy:Shader|Shader]], setting its &lt;code&gt;Diffuse&lt;/code&gt; material to the player's skin texture, the &lt;code&gt;Specular&lt;/code&gt; material to my alpha-blended &quot;ice&quot; texture and use a [[Legacy:ConstantColor|ConstantColor]] as its &lt;code&gt;SpecularityMask&lt;/code&gt; material to control the fading.  That works fine for the player model, but utterly fails for the weapon &amp;ndash; the weapon's textures are implicitly defined through the mesh, and there's no way UnrealScript code can get hold of them (not even anything similar to [[Legacy:Dynamicly Accessing Original Static Mesh Textures|this method]]).

So, that approach fell somewhat short of what I had envisioned.

But there's &lt;code&gt;OverlayMaterial&lt;/code&gt; defined in [[Legacy:Actor|Actor]], along with a &lt;code&gt;SetOverlayMaterial&lt;/code&gt; method, which is used (among others) by the UDamage to produce that &quot;energy&quot; overlay effect on players and weapons.  I had previously found out already that using a plain texture as &lt;code&gt;OverlayMaterial&lt;/code&gt; will simply replace the model's skin by that texture (instead of overlaying it) &amp;ndash; not what I intended, so I had put that approach aside.  Now, I picked it up again.

After some lucky experimentation, I found that I was able to use a [[Legacy:Shader|Shader]] as an &lt;code&gt;OverlayMaterial&lt;/code&gt; whose &lt;code&gt;Specular&lt;/code&gt; material was set to my &quot;ice&quot; texture.  Funnily, I noted that:

* The &lt;code&gt;Diffuse&lt;/code&gt; material I tried to set was automatically overwritten with a reference to the overlaid actor's skin (the skin part with the highest ordinal number in the meshmap, I guess).  So, here's a way to find the original skins of a non-static mesh if you need to.

* The &lt;code&gt;A&lt;/code&gt; (alpha) member of the &lt;code&gt;Color&lt;/code&gt; property of a [[Legacy:ConstantColor|ConstantColor]] material I tried to use as the shader's &lt;code&gt;SpecularityMask&lt;/code&gt; was immediately reset to zero whenever I attempted to set it to something different.  Why would the engine do such a thing...?

So, that didn't work the way I had it intended to.  Neither did any attempts to replace the plain &quot;ice&quot; texture in the &lt;code&gt;Specular&lt;/code&gt; slot by a [[Legacy:Modifier|Modifier]] of any kind.

Then, in a last futile attempt, I tried using a [[Legacy:FadeColor|FadeColor]] in the &lt;code&gt;SpecularityMask&lt;/code&gt; slot (instead of a [[Legacy:ConstantColor|ConstantColor]] as before), and lo!, when I set its &lt;code&gt;FadePeriod&lt;/code&gt; to something other than the default, zero, it worked!  Well, of course I had a pulsing overlay now, but setting both &lt;code&gt;Color1&lt;/code&gt; and &lt;code&gt;Color2&lt;/code&gt; to the same color fixed that.

So, now I've got a texture overlay on both player and weapon which I can smoothly fade in (and out, if there was any need) and which still lets the original textures shine through.

===Comments===

'''Wormbo:''' Interesting hack. :) The engine uses the ConstantColor in the SpecularityMask slot to fade out the overlay effect when the actor's overlay timer drops below 1 or so.

==May 1, 2005==

Microsoft has a pretty good reputation on IDEs, but ''Microsoft eMbedded Visual C++'' really has at least one major quirk which makes working with it a pain unless you either know how to avoid it or unwittingly got around it by failing to customize your workspace too much.  I didn't fall into the second group, and it took me until today to become part of the first.

I'm developing a small smartphone application to remote-control MP3 playback on the Linux server which sits quietly in my closet via Bluetooth.

The ''Smartphone 2003 SDK'' comes with a smartphone emulator.  That's very nice, but it becomes pretty frustrating once it stops working &amp;ndash; which, for me, happened basically whenever I started the IDE for the second time after installing it:  Whenever I wanted to run my program, I got an error dialog telling me one of the following things:

{{innerbox| Cannot find a default device. Please create one or more from the Platform Manager.

}}

&lt;nowiki&gt;&lt;/nowiki&gt;

{{innerbox| There is no device installed. Please go to Configure Platform Manager to add a device.

}}

Obviously there were still the same devices as the last time, and I certainly hadn't changed configurations since last successfully running the program in the emulator.  So, almost each time I wanted to work on my project, I had to uninstall the entire IDE and reinstall all of it &amp;ndash; two installers, one of them badly made, and a service pack; half an hour work just to get the IDE to work again.  Needless to say, I didn't do that very often.

Of course, I googled for a solution.  Nothing to find except for two postings from people with the same problem without any replies to them.  At least I wasn't alone; little consolation there, though.

Today, I got that second error message from above for the first time, and that was my luck.  Googling for ''that'' finally led me to a newsgroup message with the solution:  If you disable the WCE Configuration toolbar, the (unlabeled) &quot;default device&quot; drop-down box (the rightmost one) '''will automatically revert to &quot;Smartphone 2003 Device.&quot;'''  Set it back to &quot;Smartphone 2003 Emulator&quot; and everything works again.  There's no menu command for that option.

&quot;Son of a gun!&quot;, to say it in the original newsgroup poster's words.  What an unnecessary annoyance.

==November 3, 2005==

Today at around 11:15 AM, I successfully completed my twenty-ninth year of life (for a suitable definition of &quot;successfully&quot; :-P), heading into the thirtieth without hesitation. Happy birthday to me ;-)

===Comments===

'''El Muerte:''' damn you're old ;)

'''EntropicLqd:''' Happy birthday youngster (for a given value of young).  Give it another few years and you'll feel like you are falling apart :)

'''Sweavo:''' phew it's not just me then Entropic :-)

'''Tarquin:''' Happy birthday Mych! The big 30 next year ;) It's not as awful as it sounds :)

'''Mychaeel:''' Hehe, thanks y'all :-)

'''MythOpus:''' I saw it awhile ago, but I was always on my dads Linux computer so I haven't been able to... WISH YOU A HAPPY BIRTHDAY!

'''Mychaeel:''' I'll take good wishes at any time, so: thank you as well :-D

'''Sweavo:''' in that case, have had a happy birthday :-)

==April 24, 2006==

Setting a data structure element of a replicated array element won't actually make the engine replicate that array element.  You'll have to set the ''whole'' array element to make the engine notice that it has changed:

&lt;uscript&gt;
function TouchElement(int iElement)
{
  local TElement ElementTemp;

  ElementTemp = Elements[iElement];
  Elements[iElement] = ElementTemp;  // prod!
}
&lt;/uscript&gt;

Has anybody else ever had that problem?

===Comments ===

'''EricBlade:''' I haven't personally had a reason to make an array of structs yet, but it sounds like it could be related somehow to the problem of not being able to replicate -just- a struct, without some other var?

'''Wormbo:''' That seems to be a general problem of struct replication, not only structs as array elements. The code &lt;code&gt;Elements[iElement] = Elements[iElement]&lt;/code&gt; seems to be enough to cause replication though, whether anything actually changed or not.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4330</id>
      <timestamp>2006-04-24T08:51:04Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries, but feel free to add comments.''

}}

==December 14, 2002==

{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson]]''

}}

No effort is wasted if you've learned something from it.  (Though that doesn't mean that the same time couldn't have been spent more effectively.)

Occasionally I'm stuck in a dead end of my own design and can't seem to find my way out of it.  The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on.  So I linger a bit longer and cudgel my brains for some ''other'' way to reach my goal than backing up.

Deleting an evening's worth of good code requires an effort, but if it relieves me of a week's worth of trying not to scratch it, it's worth it.

===Comments===

'''Tarquin:'''  &quot;The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on. &quot; &amp;ndash; I do that all the time in mapping. I end up with multiple copies of the same area, each one trying a different solution...  What usually happens is I eventually work up the courage to start from scratch.

'''Mychaeel:''' That's exactly what happens to me too.  :-)  Realizing when it's better to scratch a few good ideas in favor of an entirely different approach (maybe even one with a slightly different outcome than what I originally figured) is a learning process.

==December 20, 2002==

Note to self:  Not assuming that other people's contributions to a testing environment are free of bugs can be a huge time saver.

==January 17, 2003==

Incidentally I dug out the code I scratched in the first entry on this page and used it for a related, but different purpose where it actually fits in.  (Good thing I never really delete something for good unless I'm ''absolutely'' sure it won't ever be of any use anymore.)

The code is part of Jailbreak's bot support and is supposed to let bots make an educated guess where an enemy player is currently located after the enemy gave his position away by triggering a release switch.  Naturally, if there's only a single relase switch, all that boils down to a single possible location.  Where it gets interesting is if there are ''multiple'' release switches and the bots actually have to ''guess'' which one the player triggered.

My code does that based on the last known location of a player (directly after a round starts, or after a spawn in freedom after winning an arena match, or after being released from jail), the walking distance (using the path network) to all of the release switches and the time that passed since the player's location was known last.  With that and a more or less arbitrarily chosen probability distribution for a player's distance from his starting point after a given amount of time (something based on half a Gaussian) bots take a random guess weighed by the respective probability of the enemy being at any of the possible switches.

==January 18, 2003==

Wrote about [[Legacy:A Bug'S Life|A Bug's Life]] hoping that it'll inspire our bug hunters to posting better bug reports than they occasionally did for Jailbreak III.

==January 23, 2003==

UT2003's speech menu redefines the terms &quot;non-extensible&quot; and &quot;hard-coded.&quot;  I'm sure there's a way into it though &amp;ndash; I just haven't worked it out yet.  (Subclassing [[Legacy:ExtendedConsole|ExtendedConsole]] is, hardly surprising, not an option.)

==January 24, 2003==

[[Image:Legacy_speechmenuhack-ordermenu.jpeg|left|]]

Apparently there ''is'' a way.  The &quot;Team tactics&quot; menu item here opens a submenu where you can select one of a set of tactics for your team.  (All other menu items open a list of players you can order.)

Getting it to display your own entries is the easy part, to be sure &amp;ndash; being notified when the player selects one of the entries requires some more code insight.  It is possible though, and I'm just about to implement it.

If this works out, I'll describe the hack in detail somewhere on the Wiki.

==January 25, 2003==

[[Image:Legacy_speechmenuhack-tacticsmenu.jpeg|right|]]

It works.  When you select one of the entries in the tactics menu displayed to the right, SetOrders in [[Legacy:TeamAI|TeamAI]] is notified and gets a chance to intercept the selection.  The default implementation of SetOrders puts the following message into the log:

  ScriptLog: Team New orders TacticsNormal JB-IronMan.xPlayer0

TacticsNormal is a label I assigned to that menu item; everything else in that message is from Epic's own code.  Any unwanted cosmetic side effects can be controlled by overwriting SetOrders with your own code.

There's relatively little code involved in the whole hack:  One piece of code that's executed in some actor's client-side Tick (I used Tick in our [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]] subclass, but it could be anywhere) that modifies the speech menu's behavior; and a piece of code that modifies some properties of [[Legacy:Bot|Bot]]s when they're spawned.  And, of course, the code in SetOrders in [[Legacy:TeamAI|TeamAI]] that does whatever you want your custom menu item to do.

Modifying the speech menu that way has its limitations, of course.  There are only very few &quot;slots&quot; left for custom notifications (exactly nine), and custom submenus like my &quot;Team Tactics&quot; menu are only possible for menu items in the &quot;Orders&quot; submenu.  Details to follow.

==February 3, 2003==

So little time, and so much to do... but I don't regret spending the last weekend skiing in Tyrol.  ;-)

[[Legacy:UMake|UMake]] should be updated and released in version 1.2.  [[Legacy:Spectate Bots|Spectate Botmatch]] has a host of new functionality to be implemented, despite Epic refitting a &quot;Spectate&quot; button in the Instant Action dialog with the last patch.  Deathball needs some small code tweaks on my part.  [[Legacy:Jailbreak|Jailbreak]] development must continue.  And in addition to that there's some Perl coding work I'll actually get paid for and whose deadline is approaching sometime in mid-February.

==February 10, 2003==

If you want to make ''absolutely sure'' that a certain thread in a forum remains undiscovered, stick it to the top and place the words &quot;Read this before posting&quot; in its subject.

==February 14, 2003==

Bots in jail (in Jailbreak) should idly walk around, occasionally lie down and sleep, and engage in hammer fights if there's an eligible opponent.

It seems to me that maybe the best way to achieve all this is creating several custom [[Legacy:ScriptedSequence|ScriptedSequence]] subclasses, one for &quot;walking around&quot; (to select roam destinations in jail only), one for &quot;lying down and sleeping&quot; and one for &quot;engage in jail fight (and stop when the opponent opts out)&quot;.  The latter two will probably require custom scripted ''actions'' too:  &quot;start sleeping,&quot; &quot;wait and occasionally snore&quot; and &quot;stand up&quot;; and whatever is required to make a bot attack an opponent with an arbitrary melee or non-melee weapon.

Sounds like I'll better release alpha 4 ''before'' tackling that...

==February 15, 2003==

UT2003 bots don't really support being animated by means of a [[Legacy:ScriptedSequence|ScriptedSequence]] &amp;ndash; even if you manage to make them play a certain animation, the [[Legacy:XPawn|xPawn]] reverts to an idling pose as soon as that animation has ended.  In addition, those idling animations are natively &quot;physics controlled.&quot;

What's possible though is temporarily resetting the ''names'' of the idling animations to refer to non-existent animations.  That's a pretty heavy-handed approach, but it works (and puts a bunch of warning messages into the log).

'''Update:'''  ZappyAd pointed me to the bPhysicsAnimUpdate flag in class [[Legacy:Pawn|Pawn]].  Setting it to False disables the native &quot;physics-controlled&quot; animations, and indeed, it works well.

==February 17, 2003==

Scratched sleeping bots.  Implemented bots that hammer-fight in jail with human players instead.  Much more fun and rewarding.

==February 24, 2003==

I figured out the hard way that even custom game types can't simply replace the game's [[Legacy:TeamInfo|TeamInfo]] actors by subclassing [[Legacy:XTeamRoster|xTeamRoster]].  One of our bug hunters reported that setting up a game with custom bots broke crucial parts of the gameplay, and a look into the log revealed that UT2003 didn't use Jailbreak's custom TeamInfo subclass as configured in the the game type's DefaultEnemyRosterClass variable but instances of [[Legacy:TeamBlueConfigured|TeamBlueConfigured]] and [[Legacy:TeamRedConfigured|TeamRedConfigured]] instead.

So, once more, I'm ending up ''attaching'' an actor of mine to a stock UT2003 actor instead of replacing the stock actor's class by my own.  Jailbreak did so with several other gameplay-relevant classes (not just TeamInfo) before already &amp;ndash; PlayerReplicationInfo, for one, instead of introducing a custom PlayerReplicationInfo subclass.

In Unreal Tournament &quot;attaching&quot; an actor to another actor was more or less limited to the possibility of setting the attached actor's owner to the actor it was attached to and then using the ChildActors iterator to retrieve the attached actor when requested.  (Or any variant of that, though those that come into my mind are all equally inefficient.)

In UT2003 however every actor can have its own inventory by means of the Inventory variable which is declared in class [[Legacy:Actor|Actor]].  Traveling an actor's inventory chain is fast and efficient compared to using an iterator, so I implemented a generic abstract superclass for info actors that are &quot;attached&quot; to another actor, including code that automatically sets up a linked list of all &quot;actor tag&quot; actors of the same class and a mechanism that, if so desired, communicates registration and unregistration of an &quot;actor tag&quot; to all clients even during its lifetime.

Well, anyway, the TeamInfo problem was quickly fixed thanks to that mechanism.

===Comments===

'''Wormbo:''' Actually the inventory chain was available to all actors in Unreal v205 already. (Yes, I really have that code here... :D)

'''Mychaeel:''' Hmm.  I don't, but I do have the Unreal Tournament sources and... behold, you're right.  Oh well.  :-)

==March 17, 2003==

When I was implementing a new feature yesterday I noticed that I had to change a remotely related part of the code in order to avoid some small lag in a visual effect &amp;ndash; no big deal, but something that deserved to be fixed.  So I opened the class responsible for the delay, found the place where I had not anticipated the need for some direct connection between two pieces of code in my original design, and added it.

Then I realized that this was the third or fourth time I had added a bit of code at that place to accommodate a new requirement that had popped up since I had initially designed that class.  Each time I had addressed a small particular problem, each time I had added a bit of code to fix it; and while each of those changes were small and simple, the whole code grew more complicated and less elegant with every change I applied to it.

Time to scratch that part of the code and rethink its design with all old ''and'' new requirements in mind.

Changing, fixing and tweaking code a small part at a time inevitably leads to bloated, unelegant, bug-prone constructions sooner or later.  That's commonly called [http://info.astrian.net/jargon/terms/f/feature_creep.html feature creep] &amp;ndash; and after a time any software suffering from it becomes so unmaintainable that adding, testing and debugging a new feature becomes almost as much work as rewriting everything from scratch.  It's a developer's nightmare.

So sometimes it really pays off to start redesigning parts of a program before feature creep sets in.  The difficult part is to realize that before it's too late; and even more so for people not directly involved in the development process who can't relate to the idea of elegant, straightforward and bug-resistant program design.  Coding for a mod whose development is being slowly ground to a halt by somebody in charge adding more and more features that were never part of the original design can be a pretty frustrating experience.

==May 4, 2003==

ElapsedTime and RemainingTime in [[Legacy:GameReplicationInfo|GameReplicationInfo]] aren't replicated all the time in [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] &amp;ndash; that's for saving bandwidth, I suppose, and that must be a good thing.

Bad thing is that it doesn't work too well.  The idea is that ElapsedTime and RemainingTime are replicated ''once'' when the whole GameReplicationInfo actor is initially replicated to the client, and then the client increases ElapsedTime and decreases RemainingTime once per second all by itself.  Sounds simple enough, but somehow the initial value replication doesn't seem to work &amp;ndash; and that's not just in Jailbreak, it's exactly the same in vanilla Deathmatch.  Consequently, the time display in the scoreboard is out of sync with the actual game time.

The programmer who thought that up at Digital Extremes or Epic must have anticipated some of those problems though, because it actually gets a bit more complicated than what I described above.  In addition to ElapsedTime and RemainingTime there's a variable called RemainingMinute that is replicated every time it is changed.  The Timer event in [[Legacy:DeathMatch|DeathMatch]] sets it to the current value of RemainingTime every full minute.  GameReplicationInfo in turn picks it up and copies the replicated value of RemainingMinute to the client's local RemainingTime, thus re-syncronizing RemainingTime with the game's actual time.

Since I'd like Jailbreak's spiffy game time clock in the scoreboard to show the right time at ''all'' times though I guess I'll have to look for a fix.

'''Update:'''  Two distinct problems there:  Firstly, the initially replicated value of RemainingMinute always resets RemainingTime to the last full minute on mid-game connect; secondly, there can be an almost arbitrary delay for precaching textures and other content between PostNetBeginPlay (when the values for ElapsedTime and RemainingTime have just been replicated) and the first call of Timer (where they're updated client-side).

==May 7, 2003==

...so in Jailbreak the client sends a replicated function call to the server which directly responds by sending another replicated function call back to the client along with the current server time.  The client calculates a time offset between itself and the server; and if it also takes the time into account it took the response function to be called on the client after the synchronization request had been issued, it's possible to synchronize client and server time to a precision of approximately a tenth of a second.

That happens once a client has finished loading and precaching the game.  [[Legacy:GameReplicationInfo|GameReplicationInfo]] only replicates the server time the match started, and determines ElapsedTime and RemainingTime based on the current client time and its offset to the server time.

===Comments===

'''Kuhal:''' I am interested in the replication behaviour you have discovered here.  It may lead to an explanation of some behaviour I am getting during a pause in a network game.  The client's countdown clock rapidly counts down the seconds that have passed while the match was paused.  While I am certain the remaining time on the server has indeed been paused, it seems that the client thinks it knows better and catches up.  The weird thing is that the game ends &quot;on time&quot; when the client ramaining time reaches 00:00.  Are there any more references to how these attributes work in UT?

==May 22, 2003==

&quot;All you can eat&quot; for 5 ? in the uni's cafeteria today.  Burp.

Jailbreak's [http://www.planetjailbreak.com/misc/jailbreak2003-scores-5.jpg?link scoreboard] displays a minimap showing the current locations of your teammates.  In network games that means that those positions have to be replicated to all clients.  That leads to jerky movement of the dots on the minimap because the locations are updated only every couple of frames, not every (client-side) frame.

That problem can be somewhat relieved by using the [[Legacy:Pawn|Pawn]]s' actual positions when they happen to be present on the respective client; but the other player positions still jerk.  Some sort of motion prediction or motion interpolation should be built in; and preferably in a way that does not multiply the bandwidth requirements of the whole separate location replication business &amp;ndash; my bandwidth conscience is striking already without that.  That rules out simply replicating the player's velocity along with their position.

Since the minimap is by design mini, the updates usually don't go beyond a movement of a couple of pixels each time; and it's more to show the players' rough current whereabouts anyway, not their precise locations.  Maybe an algorithm that &quot;learns&quot; about the frequency of the position updates and interpolates between the ''last two'' replicated known points (and beyond if the next update isn't received in time) might yield smooth and reasonably accurate results.

Unrelated to that I also wonder whether I should keep up the splines connecting the player names to their location dots on the minimap.  I'm starting to think that simply attaching a small tag with the player's name and possibly a health bar would be nicer.

==May 24, 2003==

The principle works, but the movement is still jerky.  Motion prediction doesn't work well because the time that passes between a replicated variable being set on server-side and its new value being received client-side varies wildly:  So even when the player is moving in a straight line at a constant velocity, the client-side predicted location has to be corrected with every update.

Now I'm pursuing a different idea &amp;ndash; adding the received location updates to a client-side list and trying to have the client interpolate along that list of locations, choosing its velocity independently as to keep up with the succession of new locations that are added to the list.

When the client-side interpolated location information reaches the last known location in the list and the player is not known to have stopped moving server-side, it extrapolates the player's movement using the last known direction and velocity.  That can even be used to save bandwidth:  The server only sends another update when it expects the client-side extrapolation to have deviated from the player's actual location too much.

==May 25, 2003==

To my mild surprise what I've implemented now works much better than I had dared to hope.

The server sends occasional location updates to all clients; and in addition to that, the absolute value of the player's movement velocity.  The ''direction'' of the player's movement is derived from the succession of location updates; as described in the previous entry it's impractical to derive the velocity as well from the location updates because time differences can't be relied upon when network replication is concerned.

Using the absolute value of the player's velocity instead of the velocity vector itself saves some bandwidth &amp;ndash; two thirds in the size of the replicated data item alone (vector consists of three floats, its absolute value of only one), and it's also much less likely to change (the absolute value remains the same even when the player changes his movement direction or strafes).

Still, with every location update there's bound to be a small deviation between the client-side extrapolated location and the updated absolute location sent by the server.  Client-side, that deviation is simply smoothed out on a short time scale &amp;ndash; that way the client-side motion simulation never suffers of any jerking motions, only small variations in movement speed which are virtually impossible to notice.

What I haven't implemented yet is the aforementioned optimization of location updates when a player keeps moving on a straight line for a while, thus making the client-side linear extrapolation sufficiently accurate even for longer periods between updates.  No actual player does that in a firefight, of course; but it's not all that unlikely to happen in general, especially given that without that optimization location updates would be sent with a frequency of about five times per second.

'''Update:'''  Reducing the number of location updates that way works fine as well.  When moving on a straight line several seconds may pass between two location updates while the client-side minimap location indicator still accurately shows the moving player's constantly changing location, smoothly picking up a later change in the player's movement direction.

==May 26, 2003==

Would it still be fun if there weren't always more problems awaiting a solution?

When reading my code again I realized that it wasn't at all robust against server-side updates that never reached a particular client.  While the mechanism doesn't rely on the time between two received updates anymore, it still assumes that the client gets to see every update the server sends &amp;ndash; and that may not necessarily be the case.  If the client misses one update, the client's idea of the player's movement direction will be completely off, especially since the server already sends only the minimum amount of updates that can be used to derive the direction.

So I have to make sure that the engine itself takes care that all clients always have a consistent set of information &amp;ndash; the engine must know that if a client misses one or several updates it is necessary to send the last ''two'' location updates to that client next time.  The easiest way to achieve that is by having two replicated location variables that are alternatingly set to the player's most current location &amp;ndash; the other one then contains the location one step earlier.

However, the problem isn't completely solved already by that.  Since those two variables (a two-element array, actually) are set alternatingly server-side (so that on each step only one of the values changes and has to be replicated), the client has no way to know which of the two replicated locations is the most current one &amp;ndash; and so it can only derive the axis on which the player is moving, but not whether the player is moving &quot;forward&quot; or &quot;backward&quot; on that axis.  The client needs one bit of extra information to resolve that ambiguity.

It's not as trivial as it may sound to derive a consistent notion of &quot;forward&quot; or &quot;backward&quot; for any given non-zero vector.  Simply trying to define &quot;forward&quot; and &quot;backward&quot; in respect to a certain fixed direction is ambiguous as soon as a vector is lying in the plane perpendicular to the chosen direction; so that won't work (or rather, it will, but only in ''almost'' all cases, which is unfortunately not enough &amp;ndash; Murphy knows).  So, the method I've chosen to define &quot;forward&quot; and &quot;backward&quot; takes the signum of the first vector component (X, Y, or Z, in that order) that is not zero &amp;ndash; that's guaranteed to be non-zero for any non-zero vector, and the resultant value changes its own sign when the vector does.

To sum it up, the client now has ''two'' replicated location values without knowing which one is the most current one; so it calculates the vector difference between those two and applies the notion of &quot;forward&quot; or &quot;backward&quot; on it (described above), checks it against the separately replicated bit of information sent by the server and changes the vector's sign if necessary.  And Bob's your uncle.  (See what Terry Pratchett does to one's vocabulary?)

But... wouldn't it have been much easier and just as effective if I had simply replicated an extra bit of information telling the client which of the two locations is the most current one, instead of laboriously introducing weird notions of &quot;forward&quot; and &quot;backward&quot; vectors? &amp;ndash; Easier it would be but not as effective.  That bit would have to be changed every single time the server does an update even if the player only made a slight correction in his movement direction; the method I've chosen only changes that bit when the player's movement direction changes from &quot;forward&quot; to &quot;backward&quot; (in the special absolute sense described above), so it only ''occasionally'' requires a change instead of ''always''.

'''Addendum:'''  I actually have it implemented by replicating that extra bit of orientation information as ''the velocity's signum'' &amp;ndash; in an attempt to save bandwidth when both velocity and orientation change at the same time (and it also wouldn't take any more bandwidth when the velocity alone changes).  Upon writing about it here it suddenly occurred to me that this maybe wasn't all that smart after all &amp;ndash; if ''only'' the orientation changes but the velocity doesn't, the engine still has to replicate an entire float value even though only a single bit changed.  Would it be more efficient to go the straightforward way and use a separately replicated bool variable?  I'll keep a close eye on which updates actually need to be sent by the server in a real-game situation and decide then...

(And that's also why writing in this &quot;developer journal&quot; is worth the effort even if nobody's actually reading it &amp;ndash; it makes me critically review what I've coded.  It's a one-person code audit, so to speak.)

==May 30, 2003==

So, at last, the scoreboard is feature-complete.  Phew.  I dread writing the log for the CVS commit and getting JDN up to date... but the sooner I start, the sooner I'll be finished.

Showing the Jailbreak scoreboard has a noticeable impact on framerate at the moment &amp;ndash; I haven't been able to spot a certain, single part of the code that's responsible for the majority of the framerate hit.  Disabling certain scoreboard elements one at the time shows that the clock takes as much performance as the dotted splines do, and the code that updates the scoreboard's state with the game's live information isn't far behind.  The performance hit seems to be evenly spread over most the code.

Especially something like the clock could benefit from some sort of graphics cache &amp;ndash; it changes only once per second, but has to be rendered every frame.  If I could draw the clock on a [[Legacy:ScriptedTexture|ScriptedTexture]] and then on the screen, and update the ScriptedTexture only once per second, that might save several milliseconds per frame... given that I'd manage to get alpha transparency to work on a ScriptedTexture; I wouldn't like the clock to be displayed on a rectangular black background, not even for performance's sake.

Maybe there is a way to use alpha transparency on a ScriptedTexture.  During my experiments around drawing a map screenshot on a ScriptedTexture for the scoreboard minimap I noticed that the ScriptedTexture's DrawPortal function did, somehow, alter the ScriptedTexture's alpha plane &amp;ndash; it seems that wherever DrawPortal renders a normal solid texture, the ScriptedTexture will be completely transparent, but where an alpha-masked texture is drawn on the ScriptedTexture by DrawPortal the ScriptedTexture adopts its alpha mask there.  It's all pretty strange.

I also remember that in Unreal Tournament a ScriptedTexture could have a &quot;background texture&quot; that was used to initialize the ScriptedTexture canvas every frame.  I haven't found a corresponding property in UT2003's ScriptedTexture class, but maybe it's reusing an inherited property for that purpose &amp;ndash; FallbackMaterial maybe?  Gotta try that when I'm home.

==May 31, 2003==

I've finally decided that the manual implementation docs I had put on JDN have outlived their purpose &amp;ndash; they originally were the detailed specifications for the code before UT2003 was released, but after the classes were actually created there's little point in still keeping the specs around and manually up-to-date.

I tried [[Legacy:UnCodeX|UnCodeX]]'s HTML export, and while it works fine, it's information overflow.  I think people interested in Jailbreak 2003 implementation details do better with syntax-highlighted source code alone &amp;ndash; I tried to document it well after all.

The Wiki script running JDN now supports an extra parameter for the &lt;code&gt;&lt;uscript&gt;&lt;/code&gt; tag that directly takes the sources from the CVS repository and renders them on the page.  It looks pretty neat and saves me lots of time keeping the specs consistent with the code.  Maybe I'll later add a DHTML feature for &quot;collapsing&quot; function bodys to keep only the comment headers visible by default.

'''Update:'''  Oh, and FallbackMaterial as a [[ScriptedTexture]]'s background texture does not work.  Guess I'm out of luck.


== June 4, 2003

I want to keep players from using their translocator to get out of jail the easy way, and I don't want them to be able to telefrag Bonus Pack monsters.

Unreal Tournament had a handy AllowTranslocation query function in [[DeathMatchPlus]] for that.  Whenever anybody, player or bot, tried to translocate, this function was called and had the opportunity to prevent the translocation attempt.

Unfortunately, there's nothing like that left in UT2003.  The only thing that remains is a function in [[SquadAI]] that's queried for whether a bot will try to translocate.  The code that prevents players from telefragging teammates is buried in the Translocate function in class [[TransRecall]] -- it's basically a hard-coded check whether two players' collision cylinders impinge.


The only ''possible'' way into this code is via the SameTeamAs function (class [[Controller]]) used there that in turn calls IsOnTeam (class [[GameInfo]]).  The game could pretend that monsters are on the same team as any player trying to telefrag them, but SameTeamAs is used by other parts of the game code as well, which makes (ab)using it to prevent monster telefrags not straightforward.

And it still leaves me with the question how to prevent players from translocating out of jail...

'''Update:'''  I've ended up with removing the translocator from jailed players' inventories.  It's not all that messy after all.

=== Comments

'''ZxAnPhOrIaN:''' Maybe make an actor or volume that kills the translocator beakon when you try to teleport out, killing the person.

'''ZedSquared''' (from a UT classic point of view, dunno if any of this is feasable in 2003) Have a spawnnotify that catches transloctargets and modifies their velocity to kick them back to the owner (or the middle of jail) if they're in the jail zone perhaps ... or maybe subclass translocator, give the modified one as default inv, and override the fire function to not work in jail ... probably duff ideas, just thinking aloud late at night :)

'''Mychaeel:''' I'd rather try not to replace the normal translocator to achieve the effect I'm looking for (plus, there's nothing like SpawnNotify in UT2003)... and I'd also like not to require mappers to put in special zones or volumes.  (Right now jails work with any volume or zone a mapper places -- [[match these tags|attaching]] them to a JBInfoJail actor makes them part of a jail.) -- I could simply take a player's translocator away when he enters jail and give it back when he leaves jail, but that seems a bit messy.

'''Foxpaw:''' I don't see the problem - can't you just disallow translocator use in jail like in Jailbreak for UT?

'''Wormbo:''' That's exactly the problem, there is no AllowTranslocation function like in UT which allows the gametype to prevent translocation or add various other effects like flagdrop etc.

'''Foxpaw:''' Well, in that case why not allow translocation in jail, and just have surfaces that make up the jail solid? That way the translocator beacon would not be able to be launched out of the prison so a player couldn't escape merely by translocating.

'''Mychaeel:''' That would be a mapper-based solution, but the past (Jailbreak III) has shown that even in jails that were meant to be airtight (and must have been in editor terms since there a jail was defined by a distinct zone) occasionally had collision &quot;gaps&quot; in them that allowed players to shoot or, possibly, throw a translocator target outside (JB-Raid).  Even if a jail really is airtight it may be possible to place the translocator target so that translocating to it will place the player outside jail (JB-Antipody).  Besides, some jails are meant to have open windows to the outside or escape routes that players should be able to walk, but not translocate through.


== June 6, 2003

The Jailbreak core to-do list has become pretty short.  Maybe, maybe, in a few weeks...


== June 8, 2003

BeyondUnreal's forum breakdown will leave Jailbreak's development forums completely empty when they're back up.  Most of the hundreds of postings in there I'd have liked to keep mainly to keep a history of Jailbreak 2003 development; but some of them were ongoing discussions and long-term documentation.

Unrelated to that, early this afternoon my personal computer at home broke down as well; that leaves the CVS server and Jailbreak Developer Network offline too.  Fortunately the data itself wasn't lost; just my computer won't work.  If I'm lucky it's only either the power supply or the mainboard.  The bad thing is that tomorrow is a holiday here, so I'll need to stick with this notebook as a temporary measure till I have a chance to buy replacement parts.

=== Comments

'''Tarquin:''' I'll do my best to remember what's been going on. [[Jailbreak rescue]]

'''Mychaeel:''' That's a great idea.

'''Tarquin:''' Maybe I shouldn't put code dev topics on a public wiki though. I can just scribble a text file, or on the JDN

'''Mychaeel:''' JDN is down along with my computer, I'm afraid.  Tahngarth has set up a temporary Core Dev forum at http://www.planetjailbreak.com/tempforum/ -- register there and meet Tahngarth or me in chat to get access.


== June 9, 2003

After finishing some Perl coding work (which I'm actually getting paid for) I'll see that my computer is restored to working order or that I at least find out which component exactly needs to be replaced.

'''Update:'''  The computer boots up with an old PCI video card; but as soon as I replace it by a AGP video card (either my current GeForce 4400 Ti or an older GeForce 2 MX), I only get either a strange creaking sound from the PC speaker or nothing at all.  Only the fans work.

A friend of mine who's professionally dealing quite frequently with broken PCs suggests that it might be either the power supply that doesn't manage the AGP cards' load anymore, or the mainboard for some reason doesn't like AGP cards anymore.  Unfortunately I don't have a spare ATX power supply at hand, so I won't be able to test that theory until tomorrow at the earliest.

In case it's the mainboard I'll at least use the opportunity to upgrade my old Athlon 800 MHz to whatever it is you can currently still get in a regular computer hardware shop -- apparently it's hard to find anything slower than 2.0 GHz nowadays.


== June 10, 2003

My computer is up and working again.  I was surprised that for not more than about 180 ? I got a new processor (Athlon XP 2000+) along with a mainboard, silent cooler and memory (512 MB).  I could even keep my previous 235 W power supply.  By accident the processor is currently underclocked to 1.25 GHz (its normal clock rate would be 1.67 GHz) -- I'm not even sure whether I can be bothered to open the case once more and set the jumpers correctly.

So far the system seems to be stable.  Time will tell.


== June 11, 2003

Bots should simply try to avoid being killed when &quot;evasive&quot; team tactics are selected.  (Useful when a team has a narrow lead shortly before the time limit runs out.)

I got that to work reasonably well with relatively little effort, code-wise:  Set the bots' aggressiveness to a really low value to ensure they don't feel inclined to engage in fights; then overwrite PickRetreatDestination and make it react in a suitably cowardly manner if the bot is seeing an enemy.  Right now they simply pick the [[NavigationPoint]] among their current MoveTarget's [[ReachSpec]]s that's farthest away from the enemy, or the closest one that provides cover.  Effectively that makes bots run away from an approaching enemy and make turns in order to move out of the enemy's firing line.

While it's fun (for a while) to chase bots around in a test map, I've come across one or two situations where bots are effectively stuck and too easy a prey to approaching enemies.  First I'll have to have bots detect this; then I'll have to have them react to it suitably, for instance by either simply choosing another way out or by acting like a cornered beast and falling back to normal dogfighting tactics until they're either dead or the threat is gone.  (Tomorrow more -- I'm tired.)


== June 13, 2003

I found one reproducible situation in which bots are stuck in a tight loop of pathnodes they visit:  A bot sees an enemy, turns to flee, runs into cover; arrived there it wonders what to do next and decides to go on an inventory hunt, which leads it back into the enemy's sight -- ad inf.

The bad thing is that bots (or rather the native function FindBestInventoryPath in [[Controller]]) are not smart enough to check whether they even have the chance to pick up the inventory when they've reached it -- otherwise they wouldn't even try to reach it more than once in a row, and my problem would be a non-issue.


== June 14, 2003

A comment in [[Bot]] hints that Epic meant to add a function called FindPathAwayFrom at some time -- alas, they didn't yet.  That leaves me with either sticking to my simple escaping algorithm from above (and its flaws) or creating a path finding function myself, in UnrealScript.

I've started giving the latter a try.  The idea is to recursively search the path network for [[NavigationPoint]]s that provide cover from the enemy, starting at the bot's current MoveTarget.  Some first test runs seem to indicate that it works, and it seems to have negligible impact on the performance so far.  (The Clock/UnClock mechanism described on [[Code Optimization]] proves pretty useful for such profiling.)

'''Update:'''  If a bot doesn't find cover nearby and realizes that the enemy must have seen it (because it isn't looking the other way right now), the bot panics and reverts to normal attack mode until the enemy is dead or out of sight.  I've put all that into CheckSquadObjectives now, and it seems to work pretty well testing it with a single masterful bot.


== June 16, 2003

Hmm.  Why on earth does the game rules tab maintain its settings in separate config variables instead of taking and storing them in the game type's own configuration?


== June 17, 2003

Why does filling the mutator list box on the &quot;Mutators&quot; tab involve two other separate classes?  Why is reading a list of available mutators a native function?

=== Comments
'''Wormbo:''' I guess it's supposed to speed up loading of mutator classes, but it's not really that much of a boost compared to the &quot;old&quot; GetNextInt(Desc) method because now the mutators' code packages have to be loaded in order to find the mutators' names, descriptions and groups.

'''Mychaeel:''' I wonder whether that native function (GetMutatorList in [[xUtil]]) does indeed load the mutator name to get the mutator name and description -- a comment says it does ''not'' fill in the MutClass element of the MutatorRecord structure, which would make little sense if the class is loaded anyway.  (Unless GetMutatorList was internally &quot;optimized&quot; only to look up the class's default properties without loading the class; but I'd be a bit sceptical as to the wisdom of ''that'' optimization.  But maybe it has to do with cheat protection validating all loaded code...?  Gah.) -- There's an UnrealScript function LoadClasses in [[xMutatorList]] that would load the mutator classes, but it doesn't seem to be actually used.

'''Wormbo:''' It's not the only questionable optimization. (Still remember &quot;&lt;code&gt;// FIXME THIS SUCKS&lt;/code&gt;&quot;?) [[GUIController]].GetWeaponList also is a native function and it definately loads and returns weapon classes. I can't see any real optimization over Unreal's or UT's code here.


== June 18, 2003

I'd like to intercept when somebody is clicking on a checkbox -- not just the part with the check mark but its label.

It took a while until I figured out that the bAcceptsInput flag must be set to True for any of a [[GUIComponent]]'s delegates to be called.  (Mmph.)


== June 23, 2003

The OnDraw delegate is called for custom [[GUIPanel]] subclasses but not for direct subclasses of its parent class, [[GUIMultiComponent]].  Does that have a deeper sense or did just somebody forget to add a call to the delegate in [[GUIMultiComponent]]'s native Draw implementation?

'''Update:'''  Is it just me or does setting the TextFont property in [[GUILabel]] (and, thus, the LabelFont property in [[GUIMenuOption]]) have no effect at all?  (Obsoleted by the introduction of [[GUIStyles]] maybe?)  All labels in the game seem to have the same font, even those where Epic's own UnrealScript code decrees otherwise by setting TextFont.


== June 28, 2003

This one has me baffled (in a [[WebApplication]] subclass):

&lt;uscript&gt;
function QuerySomething(WebResponse WebResponse) {
  local string ResultTemplate;
  ResultTemplate = &quot;should be overwritten by the next statement&quot;;
  ResultTemplate = WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
  }
&lt;/uscript&gt;

Now I'd expect ResultTemplate to contain the result of parsing the file something.inc... right?  And so it does, but '''appended to the previous value of the variable.'''  The resultant value of ResultTemplate is something like this:

  should be overwritten by the next statementContents of something.inc

Is that an engine bug?  Some arcane feature?  How can using LoadParsedUHTM on the right side of an assignment change the way the assignment operator works (given that the return value of LoadParsedUHTM is a mere string)?

However, the following workaround solves the problem:

&lt;uscript&gt;
  ResultTemplate = &quot;&quot; $ WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
&lt;/uscript&gt;

Trying to cast the right side to string in an attempt to do the same ironically yields a &quot;No need to cast StrProperty to itself&quot; compiler error.

==July 3, 2003==

Working on an HTML parser and formatter in UnrealScript again.  This time it'll be standalone and not part of [[Legacy:Screen|Screen]], even though I intend to use it for that end as well; and this time it's possible to use it on both [[Legacy:ScriptedTexture|ScriptedTexture]]s and a regular [[Legacy:Canvas|Canvas]].

I hope I'll get around to implementing tables and floating images as well this time.  The base architecture I'm currently designing and coding takes the requirements for those features into account already, so it should be straightfoward to even follow W3C's specification of [http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 calculating the width of columns] according to the standard.

==July 5, 2003==

The native Split and Divide functions turn out to be extremely handy for the kind of text parsing I'm doing at the moment.  (But I still want my native regular expression support in UnrealScript... mmph.)

===Comments===

'''El Muerte TDS:''' Nah, regular expression suck for text parsing, they are only useful for match (and replace). Using a [[Legacy:Tokenizer|tokenizer]] is much better for text parsing. It would be better if the native tokenizer was available in uscript.

'''Mychaeel:''' I dare say that depends on how you'd use regular expressions.  The _nextToken function in your tokenizer could be formulated much more efficiently using regular expressions, for instance.  (Though I agree that the availability of regular expressions might lead some people to creating terribly inefficient parsers.)

For that matter, my prime concern about this HTML parser is its performance, so parsing through the input stream character by character in UnrealScript is something I'm determined to avoid.  (The first version of [[Legacy:Screen|Screen]]'s ScreenSlidePage HTML parser did that, and it was slow as hell for anything exceeding ''very'' few kilobytes of input text.)

==July 6, 2003==

The HTML parser works like a charm since yesterday and nicely dumps the structure of a parsed HTML file, though I haven't made any performance evaluations yet; but in any case there's even some potential for optimization still (like identifying a tag's handler class by something faster than the sequential search I've settled for until the rest works, like binary search &amp;ndash; did I mention that native hash support would be a great addition to UnrealScript too?).

===Comments===

'''El Muerte TDS:''' There is a type called map, but it's only native atm (just like dynamic array used to be).

==July 9, 2003==

As usual it's not the ''normal'' case that makes implementing something a challenge; it's the ''pathological'' cases that do.

The obvious step after implementing an HTML parser is creating a formatter for the parsed HTML element tree.  The old one I made for [[Legacy:Screen|Screen]] (one of my first UnrealScript projects altogether) has no concept of tables or floating boxes, but this time I'm determined to add support for those and so I have to deal with the conceptual odds and ends that come with it.

A floating box is actually a pretty straightforward concept:  It's a rectangle that's placed at the left or right edge of the containing box starting at the vertical position of the text line it's defined in.  That technique is most commonly used to have text flow around an image on a website.

Normally, a web designer adds floating elements at the very start of a paragraph so the boxes are placed already when the formatter starts wrapping lines between them.

The beginning of a paragraph is, however, not the only valid place for floating boxes:  They can just as well be defined in the middle of a line, and that's where the trouble starts.  As long as the current line is short enough to fit next to the box, everything is still fine; just add the floating box and shorten the line box accordingly.

But what if the floating box is too wide to fit next to the text line where it's defined in?  The HTML standards document says that the box is then to start directly ''below'' the line it is defined in; that's simple enough to implement... but subsequent text after the definition of the floating box is still to be added to the very same line ''above'' the box, and according to Murphy's law somebody is bound to have some item in that line after the floating box definition that increases its line height.  That means, basically, that the absolute position of the floating box may not be completely determined at the time it is added.  Consequently, it may be necessary to shift the box down ''after'' it has been rendered.

==July 14, 2003==

I just realized that I failed to enter [[Legacy:UMake|UMake]] for the contest.  Ah well &amp;ndash; it sorely needs an update anyway given the huge list of pending fixes and improvements, and there's a lot of time till the deadline of phase two.

It's a bit of a pity that [[Legacy:MeshMaker|MeshMaker]] isn't eligible.  It might have had a chance to win something.

===Comments===

'''Haral:''' FYI, the deadline for the contest is tomorrow.  You can still enter, I do think.

'''Mychaeel:''' It is?  Well &amp;ndash; hardly enough time to give it the overhaul it deserves unless I was ''really'' desperate to enter it in phase one, but since there are two more phases to go, I think I'll just target phase two for now.  But thanks for the correction.  :-)

'''Haral:''' Those were my sentiments as well.  There's a lot of work to do on my mod, playable as it might be, before I'll feel it's ready for any sort of release.  Thanks for moving that comment btw, my brain doesn't exactly work well while I'm at work.  Anyway, time to get back at it, if I want to be ready by October.

==July 16, 2003==

Trying to read a binary file in UnrealScript.

The LoadParsedUHTM function in a freshly created [[Legacy:WebResponse|WebResponse]] object does well enough for text files, but I ran against a fundamental problem of UnrealScript's string data type here:  Obviously it's not as high-level as it should be in a language like UnrealScript and doesn't handle embedded null bytes (&lt;code&gt;Chr(0)&lt;/code&gt;) well.  A null byte terminates a string for all UnrealScript-related intents and purposes; so the content of the binary file I read is clipped off after a few bytes when the first null byte appears.

The only solution for that I can currently think of is briefly opening a TCP link from the game to itself, serving the binary file using the IncludeBinaryFile function in WebResponse and receiving it with a simultaneously spawned [[Legacy:TCPLink|TCPLink]] in binary mode.  But that's not only quite cumbersome, there's also a chance that some people's personal firewalls might complain about it (even though it's nothing but a local intra-process connection)...

===Comments===

'''Wormbo:''' AFAIK Quake 3 only works like this, even a single player game connects to a local game server, and when playing a skirmish game with open slots other players could join it, expanding it to a network game.

'''Nytro:''' I ''think'' this now constitutes more than &quot;short thoughts that popped up during Jailbreak development.&quot; o_O

'''Mychaeel:''' You're right.  I've scratched the &quot;short&quot; part in the description.

'''Nytrogen:''' I hate to continue to bother you... I don't own UT, and I can't find a decent description of [[Legacy:Screen|Screen]]. Would you mind giving me a link or quick 'Screen overview' blurb?

'''Wormbo:''' You just linked to it. There are links to the Screen website and forum. You should find any information you need there.

'''Birelli:''' Specifically the &quot;about&quot; page: http://www.planetunreal.com/screen/about.html on the Screen website.

==October 1, 2003==

This morning I officially handed in three copies of the physics diploma thesis I had been working on for the last year (and which had kept me off anything Unreal-related for the last two months).  For those interested, it's about ''Metal-Induced Crystallization of Silicon-Germanium Layers'' &amp;ndash; fundamental research for the next ('third') generation of solar cells which will be far more efficient and much cheaper to produce than what's currently on the market.

Well.  ''[takes a deep breath]''  This concludes more than half a decade of studies of mine at the Technische Universität München (I recently learned that they attach great importance to not being called &quot;Technical University Munich&quot; or something like that even on the cover sheet of English-language publications such as my thesis).  I guess it'll take a couple of days until I have really, deeply grasped the significance of this.  Right now, I'm mostly just relieved, happy, and tired.

One thing is sure, though:  I'm ready to get back into the Unreal community.  Even though I had been preoccupied by other things, I've really missed it.  :-)  It'll take me a few days to catch up, however, and there's also a lot more in my life which somewhat suffered during the last few weeks and which I have to catch up with, so be gentle.

===Comments===

'''Sobiwan:''' Solar cells: nice.  Enough of this fossil fuel baloney.  I hope your thesis helps push research and/or development further.  

'''Tarquin:''' Yay! Welcome back Mych. Good work saving the planet :)

'''El Muerte TDS:''' heh, it's not like this is the only planet we have ;) About the uni name, ofcourse they want it to be the german names, the english name is too easy to write, it doesn't have ä and ü. They want you to put effort in typing the name.

'''Mychaeel:''' Well, I got a German keyboard here, so effort is not an issue. &amp;ndash; The [http://www.wsi.tum.de/E25/research/theses.htm Walter Schottky Institute] where I worked, on the other hand, does not have any problems with officially allowing the English name ''Walter Schottky Institute for Fundamental Research in Semiconductor Electronics''. &amp;ndash; But then again, its name doesn't have any äs and üs in it, so your argument still holds.  ;-)

'''Tahngarth:''' Well I hope you get an A (or whatever the best grade is) :)

'''GRAF1K:''' Good, NOW GET TO WORK ON JAILBREAK!!! :P Glad you're back. :-) 

==March 1, 2004==

''* Mychaeel blows the dust from his developer journal, opens it and continues writing.''

Just checked in some actual, new, original Jailbreak code again yesterday.  Quite an elevating feeling.

It's a facility for our audio announcements.  We noticed that the number of distinct announcements grew exponentially as we thought of more and more situations in which one would make sense.  Some documentation of the system is available on [http://www.planetjailbreak.com/jdn/JBSpeechClient JDN: JBSpeechClient].

===Comments===

'''Tarquin:''' Wow! :) Looks cool!

==April 1, 2004==

Short of a few rather small features and known bugs, Jailbreak 2003 is finally feature-complete.  Yay!

The transition from UT2003 to UT2004 has put a big item on our to-do list again, though.  Epic has broken source code compatibility on several places, and other problems seem to stem from binary incompatibility (the &lt;code&gt;Ping&lt;/code&gt; variable in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] suddenly transmogrified from an int to a byte, which breaks the score display in our scoreboard).

It's strange, yet interesting and somewhat impressive, that UT2004 manages to load and run the game anyway.  At the surface, Jailbreak 2003 runs well under UT2004 already, even though it ''looks'' like Jailbreak 2003, at least HUD-wise.  Of course we're going to make Jailbreak 2004 blend in with UT2004 as well as Jailbreak 2003 does with UT2003.

If possible without too much pain I'd very much like to release Jailbreak 200x as a combined UT2003/UT2004 release.  The changes are small enough that it would be a shame to abandon all UT2003 users who didn't have the chance or the money to upgrade to UT2004 yet.

I'm looking into the details of [[Legacy:CVS|CVS]] branching right now.  Our &quot;main line of development&quot; will become UT2004, but we'll keep a UT2003 branch and take care to merge any generic changes into it.  ...if that works the way I hope it does.

==April 23, 2004==

The Jailbreak to-do list is empty, and I'm out of work.  (You bet.)  Guess it's beta time now.  Yay!  :-)

Currently working on a Perl script that automatically updates all required modules from CVS, checks for uncommitted changes, rebuilds them if necessary and automatically creates the distribution packages.  I hope to be done with that sometime tonight.  My girlfriend made us a spiffy installer logo &amp;ndash; I'm looking forward to hearing what the others say about it...

===Comments===

'''Corran:''' That's great news (for us anyway :D).  I can't wait for this.

'''GRAF1K:''' What he said. My mouth is watering. :D

BTW, did you know that UW is integated with the UT2004 UDE? Click on the Documentation tab in the code editing area and and there's unDox and Unreal Wiki. Sweet. :)

'''Corran:''' Yeah, it's been integrated into WotGreal fo a while now.

'''GRAF1K:''' Who cares about WOTgreal... UDE is official. :D

'''DJPaul:''' WOTgreal ''is'' the UDE.

'''Guest:''' Like the core of the application changes anything whatsoever... O_o

'''Wormbo:''' c-24-7-171-253.client.comcast.net (Guest above), will you ''please'' stop deleting Murphy from this page?

==May 17, 2004==

Let it never be said again that modifying the mid-game menu in UT2003 requires a custom [[Legacy:PlayerController|PlayerController]] subclass...

[[Image:Legacy_mychaeel-ut2003midgamemenu.jpeg|center|]]

==May 19, 2004==

I'm practically out of ideas what else could be added to Jailbreak &amp;ndash; almost time to release now...

Last thing we implemented were custom loading screens &amp;ndash; it's actually pretty straightforward to replace the default images displayed while a map loads by custom ones at runtime.

We've even managed to create one loading screen per bundled map and have the corresponding screen shown when the map loads &amp;ndash; and I've added a means for mappers to [http://www.planetjailbreak.com/jdn/Loading_Screen embed a custom loading screens into their map] which is displayed when that map loads.  Given that the necessary information is all there and is just being ignored by UT2004 stock code, I wonder why Epic didn't do that themselves...

===Comments===

'''GRAF1K:''' Epic wanted to include their uber-1337 Photoshop lensflares though! ;)

Looks like a ''very'' nice release coming up from you guys over at Jailbreak. I'd count off the minutes if I only knew when...

'''Note:''' I am indeed the M*rphy killer. Buggy 3rd-party software... :pissed: I'll get it fixed. For now though, I can't even replace the M*rphy's once I've killed them. Just revert once you see this.

'''Mychaeel:''' Argh... what kind of bug would ''specifically'' replace occurrences of the string &quot;Murphy&quot; in a text...?  o_O

'''GRAF1K:''' Well, it's not the bug directly that's doing that. The bug is me not being able to turn the feature off. The feature in question is a privacy feature that blocks sending of personal info (like the owner's name).

'''Mychaeel:''' So is it safe to deduce that your name is Murphy?  (Way to go for a privacy feature... :-p)

'''GRAF1K:''' LOL. I was going to disable that feature anyhow. The app does a lot more than that. Besides, my last name isn't Mürphy, but the account is under someone who's is. :)

==May 20, 2004==

Naturally, any display of hubris such as making the statement &quot;I'm out of bugs&quot; angers the Gods, so the to-do list has a few more now.  Fortunately, they're all pretty small yet, and I'm out to squish them before they get any bigger...  ;-)

==May 23, 2004==

You have no idea how glad I am that we're making a UT2003/UT2004 release of Jailbreak &amp;ndash; if only for the reason that on both my desktop computer and my notebook with their measly 512 MB of RAM starting UT2004 (or even UT2004 server and client at the same time) takes ''ages'' while the system swaps like crazy &amp;ndash; and loading UT2003, even server and client, works without any swapping at all.  UT2004 is a monster...

===Comments===

'''El Muerte:''' I don't have any swap issues when running UT2004 on my laptop (512MB ram). Haven't done much client+server testing, but the client takes quite some time to join the server (/me blames slow laptop HD). On my desktop I can run a server and two clients without any serious problems (1GB ram). I think windows is to blame :P

==May 27, 2004==

Jailbreak is out.  We assume full responsibility for all bugs that were left in.  :-p

Seriously though &amp;ndash; everything went reasonably smoothly, and while there ''are'' some bugs we'll have to fix, nothing really serious has popped up yet.  Feedback is very positive; feels good.  :-)

I've submitted Jailbreak 2004 for the MSU contest.  Perhaps we'll win something.

==May 29, 2004==

There's a known issue in UT2004 which prevents anybody who ever selected a third-party gametype in the server browser from joining any other game of a different gametype.

This happens since, when a gametype is selected, its [[Legacy:GameInfo|GameInfo]] class is loaded and its static FillPlayInfo function is called.  After adding its settings to the [[Legacy:PlayInfo|PlayInfo]] object, the GameInfo class remains loaded in memory (probably because it's somehow still referenced by the PlayInfo object and thus cannot be garbage-collected), and when the player tries joining a server running a different gametype, that'll fail because the third-party gametype's package is still loaded.

I haven't been able yet to find out ''why'' exactly FillPlayInfo is called at this point by the server browser and which part of the code does anything with the data saved in the PlayInfo object referenced by the &lt;code&gt;FilterInfo&lt;/code&gt; variable.  However, simply avoiding to actually add anything to the PlayInfo object seems to solve the problem without any noticable side effect, so the following chunk of code makes everything work as it should:

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local UT2K4ServerBrowser UT2K4ServerBrowser;

  // check whether we are called from a server browser
  foreach Default.Class.AllObjects(Class'UT2K4ServerBrowser', UT2K4ServerBrowser)
    if (UT2K4ServerBrowser.FilterInfo == PlayInfo)
      return;  // ignore because called from server browser

  // now do the usual stuff
  Super.FillPlayInfo(PlayInfo);

  PlayInfo.AddSetting(Default.GameGroup, ...);
  PlayInfo.AddSetting(Default.GameGroup, ...);
}
&lt;/uscript&gt;

==May 31, 2004==

While fixing some netcode I found out that in one of my classes a certain variable was constantly, over and over again, replicated to all clients &amp;ndash; several times per second; that class had &lt;code&gt;bNetNotify&lt;/code&gt; activated, and PostNetReceive was called every other tick.

What baffled me was that this variable wasn't even changed server-side; nor did it change on client side.

It took me a while to find out what was happening:  This variable which was replicated over and over again was a [[Legacy:Pawn|Pawn]] reference.  As soon as the Pawn it pointed to was destroyed, the variable was duly set to &lt;code&gt;None&lt;/code&gt; on both server and client &amp;ndash; but the server kept replicating its value to the clients.  And at the end of the day, the follwing slightly weird piece of code fixed it all:

&lt;uscript&gt;
// fixes replicating over and over when referenced actor has been destroyed
if (PawnObjectiveGuessed == None)
  PawnObjectiveGuessed = None;
&lt;/uscript&gt;

The Unreal engine is full of mysteries...

===Comments===

'''Mysterial:''' That works because UnrealScript returns &lt;code&gt;None&lt;/code&gt; when accessing a property pointing to an [[Legacy:Actor|Actor]] with bDeleteMe == true. Internally, the [[Legacy:Actor|Actor]] is in fact still referenced by that property until the [[Legacy:Actor|Actor]] is truly deleted. It getting continually replicated might be a bug in the engine. Can you try to create a small reproduction case and send it to me?

'''Mychaeel:''' Will do.  :-)

'''Mychaeel:''' Hrmph... making a simple test case is not as straightforward as I thought.  Then again, if it was an obvious bug, it probably wouldn't be in there...  ;-)

==May 31, 2004==

Argh!  People report server crashes, and every single crash log has the following lines at its end:

&lt;pre&gt;
  Critical: UObject::ProcessEvent
  Critical: (JBCameraArena JB-Heights.JBCameraArena, Function Jailbreak.JBCameraArena.Tick)
  Critical: AActor::Tick
  Critical: TickAllActors
  Critical: ULevel::Tick
  Critical: (NetMode=1)
  Critical: TickLevel
  Critical: UGameEngine::Tick
  Critical: Level Abandoned Heights
  Critical: UpdateWorld
  Critical: UServerCommandlet::Main
  Exit: Executing UObject::StaticShutdownAfterError
  Exit: Exiting.&lt;/pre&gt;

That Tick event in question doesn't do anything special that I'd be aware of &amp;ndash; it certainly doesn't destroy the actor or anything like that.  And I cannot reproduce it at all in a local client/server testing environment, and it only happens infrequently on other servers anyway.

There may be one thing:  The Tick event calls a function within an [[Legacy:Editinline|editinline]] object (which was created along with the JBCamera actor as a [[Legacy:Subobject|subobject]]).  Perhaps, when JBCameraArena.Destroy() is called, that subobject reference somehow becomes invalid and crash-prone under certain circumstances?

: '''Update:'''  I just found out that all my JBCameraArena actors '''share the same subobject''' &amp;ndash; unlike what I expected, seeing that spawning [[Legacy:Emitter|Emitter]] subclasses creates ''distinct'' instances of their [[Legacy:ParticleEmitter|ParticleEmitter]] subobjects.  While I'm not sure whether that's responsible for the crashes, it's definitely not what I had in mind and it's a bug when more than one JBCameraArena is active at the same time.

To make it worse, those error messages don't really indicate what ''kind'' of error happened (the lines preceding them are different and nothing out of the usual in every case &amp;ndash; such as players joining or leaving; unfortunately I have no indication whether there's a temporal relationship between the events logged before the error and the error, but I believe there's not).

Is there anyone out there with Unreal-engine insight who might be able to tell me which kinds of errors would trigger those server log messages?

==June 2, 2004==

Phew.  The Jailbreak server crashes are '''fixed''' (and stress-tested successfully on MyUnreal's ever-full server), and so are the &quot;web admin does not come up again after level change&quot; and &quot;server does not react to UDP requests after a while&quot; bugs.  Those were the toughest ones to crack, mostly because I was fixing in the dark; the others were, while partly annoying, peanuts.

In retrospect it seems that the latter two bugs stemmed from the engine not fully cleaning up the previous level; and that, in turn, was apparently due to my storing some actor references in the ''class default'' values of a class &amp;ndash; I did that only to compare the stored references to given ones for caching a function's return value over subsequent calls.  Even if the actors were destroyed between two calls, I'd expect a comparison simply to fail.

After I worked around that problem (by storing the actors' locations in the cache &amp;ndash; in this case that worked just as well), suddenly those both bugs (web server not coming up again, UdpGameSpyQuery failing to bind its port after a while) were gone all by themselves.  So, note for the future:  '''Never store actor references in default properties!'''

===Comments===

'''Foxpaw:''' That's interesting. I've stored actor references in default properties lots. (For instance, any actor can get a reference to the level's backdrop in my case by accessing class'Base.Backdrop'.default.Reference. Perhaps this behaviour is limited to certain classes?

'''Mychaeel:''' Perhaps, but I don't think so.  The effect of doing that is hardly noticable in local testing conditions, in any case (otherwise I'd have seen it a lot earlier) &amp;ndash; as I wrote, the most noticable effect was that the web admin [[Legacy:WebServer|WebServer]] didn't get cleaned up on level change and that &amp;ndash; after many level changes &amp;ndash; a server just didn't respond to UDP requests anymore.  Otherwise, everything worked great.

'''Mysterial:''' Since classes are non-Actor objects, the usual issues with storing [[Legacy:Actor|Actor]] references in them apply. I'm somewhat surprised it didn't crash. Perhaps because the engine doesn't actually destroy the class objects as it would most other objects you'd store references in, since you're playing another Jailbreak game so it wouldn't ever unload the resources.

'''Mychaeel:''' Frankly, I wasn't ever aware of &quot;the usual issues&quot; with storing Actor references in non-Actor objects &amp;ndash; Jailbreak code still does that on several occasions ([[Legacy:LevelInfo|LevelInfo]] and [[Legacy:TeamInfo|TeamInfo]] references in the non-Actor objects which represent the small player icons on the HUD, and in at least one other place too).  Are you saying that referencing an Actor from a non-Actor object is always crash-prone and not supported by the engine?

'''Mysterial:''' [[Legacy:Actor|Actor]] references in non-Actor subclasses don't get automatically cleaned up by the engine, so they work just like C++ pointers in that accessing them after they've been deleted has horrible, unpredictable effects (generally crashing). Additionally, since part of garbage collection is traversing every object reference property that exists, you need to clean up any such references before a level change or you'll either get frequent serialization crashes or prevent the previous level from unloading, creating huge memory leaks, as you unfortunately found out.

==June 8, 2004==

With the stress of releasing Jailbreak over, I'm free to look into some of my old mutator ideas again.  One of them is '''SprayPaint''' &amp;ndash; a simple idea actually, borrowed from Half Life where the ability to spray-paint your clan logo on walls was built-in functionality.  I want to port that idea to UT2004.

This would be pretty straight-forward and quite uninteresting if I hadn't put it into my mind that it should be possible to customize the spray-painted images by simply dropping a BMP file (1-bit, 64x64 pixels) into a directory; and, if that's done by a client in a network game, all other clients should be able to see the same image too.  The latter is just some replication acrobatics; the former is where I saw my challenge.

Reading arbitrary files in UnrealScript isn't really supported, but if you need to do it for text files, instantiating a [[Legacy:WebResponse|WebResponse]] object and using its LoadParsedUHTM function works quite well.  However, UnrealScript strings aren't binary safe &amp;ndash; null bytes act as end-of-string tokens and thus cannot be included in a string.  Attempting to load a binary file such as a BMP image with LoadParsedUHTM results in a byte string truncated at the first null byte.

I've worked around that problem now by spawning a local [[Legacy:WebServer|WebServer]] listening on a random free port, delivering files as &quot;application/octet-stream&quot; with WebResponse's function IncludeBinaryFile, and a [[Legacy:TcpLink|TcpLink]] operating in MODE_Binary to receive the binary data from the local web server.  In theory this setup is able to read the contents of any binary file within the UT2004 directory hierarchy into an UnrealScript byte array, and it's working great for my purposes.

===Comments===

'''EntropicLqd:''' Can you see outside of the UT2004 directory structure with that technique?  Cunning solution btw

'''Mychaeel:''' Frighteningly enough, I can read ''any'' file that way.  (I had actually &amp;ndash; and perhaps naively &amp;ndash; assumed that the IncludePath in WebResponse would not allow UnrealScript code to travel beyond the UT2004 base directory...) &amp;ndash; Perhaps it'd be best to let Epic know about this and to remove this last &quot;Developer Journal&quot; entry for the time being...

'''EntropicLqd:''' I'd definitely let Epic know about it (I guess you have already).  Allowing access above the 2K4 root directory is an astonishing lapse on Epics part.  I was expecting a ''ho ho ho ofcourse not'' response.  Wonder if you could write a remote file browser...

'''Mychaeel:''' Without having a way to generically get full directory listings, I'm afraid (or rather, glad) that's not possible &amp;ndash; [[Legacy:StreamInterface|StreamInterface]] only provides a way to list directories (and a limited set of other file types, though I haven't been able to get that to work for anything except said directories and .mp3 files).

'''Mychaeel:''' The LoadParsedUHTM method works on any file on a given partition too, given the right IncludePath setting (e.g. &quot;C:/&quot;) in a subclass and without all the local web server hassle.

'''Mychaeel:''' I've sent a mail to Joe Wilcox.

==July 12, 2004==

Jailbreak 2004 is one of the gametype finalists in the MSU contest.  That's nice and I hope we'll win something too, but I find it more notable that Jailbreak got a honorable mention in the &quot;FPS Mod&quot; category.  I didn't check that box when I entered Jailbreak 2004 into the contest; it must have been the judges' decision to put it there too...

In completely unrelated news, I've been turning some of my spare attention to attempting to write a couple of extensions for Thunderbird to make my life easier (on the long run; you know, that &quot;impatience, hubris&quot; part that occasionally pops up in a Larry Wall quote at the bottom of an Unreal Wiki page).  Phew.  If you ever thought that UnrealScript was a humongous, complex and for the most part poorly documented heap of code already, do look at http://lxr.mozilla.org for an upgrade.

===Comments===

'''Tarquin:''' I don't know about you, but I am finding the Jailbreak community very quiet these days. I'm sure there was way more activity (posts, maps, discussion) in the days of JBIII. But I suppose that was the 3rd release and we are only on the first. BTW, if you have some spare time, do you think you could look at the Wookee class tree generator? It would be nice if the text of the tree was parsed for wiki links, so we could use it for Unreal classes here &amp;ndash; but I'm afraid I've not been able to work out how to do it. It's WookeeTree.pm in your CVS. :) 

==July 14, 2004==

My support for Opera 6 has finally broken down after the last vBulletin 3 update which made &lt;code&gt;[code]&lt;/code&gt; tags unreadable, and I've made the switch to Firefox.  I'm loving it already.

It has gone quite a long way since the last time I gave it a try (must have been around version 0.6), and most of the reasons I didn't want to switch to it then have gone meanwhile.  I'm especially fond of the ability to selectively skin websites with custom CSS (using the &quot;uriid&quot; extension and a specially crafted userContent.css), and I just ''have'' to love a program which allows me to tweak its user interface appearance by editing a CSS file...

In completely unrelated news, Fraunhofer IGD (whom I had sent an unsolicited application about three months ago and never heard back of) has offered me a job... working on a project in Seoul, South Korea.  Imagine my surprise.  I might even have considered it if I hadn't found another job in the meantime already ''and'' if I didn't specifically want to move closer to my girlfriend in the Frankfurt area.  Still, quite interesting...

(Is this developer journal turning into a blog...?)

===Comments===

'''Tarquin:''' Bwahahahaha! I knew we'd convert you in the end.... :P

'''MythOpus:''' Consider this a reminder from the entire wiki to update the Wookee download zip ;)

==August 20, 2004==

When you think you're finally out of bugs, Atari QA will come and send you a new bunch of them.  :-p

No, actually, it's not that bad.  It boils down to one actual code bug and a bunch of map-related things in the order of &quot;graphic seams flicker in and out around the pipelines.&quot;  Still, I was surprised when I got that mail...

===Comments===

'''GRAF1K:''' Why would Atari be interested in sending you bug reports?

'''Wormbo:''' One code bug and one code thing I wouldn't call a bug. (no weapon in celebration screen)&lt;br /&gt;They most likely sent the reports because they tested Jailbreak 2004. ;)

'''Mychaeel:''' ...and they tested Jailbreak 2004 because they want to include it in the Editor's Choice Edition.  Sorry, I kinda implied this.  ;-)

'''Guest:''' I figured ECE was the reason but wasn't sure. Congrats then. :D

==September 5, 2004==

Picking up my old SprayPaint mutator idea again.  To reiterate, it's about being able to spray logos on walls &amp;ndash; the logos must be provided as monochrome bitmaps (i.e. bitmaps with 1-bit color depth) in a certain UT2004 subdirectory, and you can spray them on walls in a color of your choice; and the best thing is that other players on the server would see the exact same thing even though they don't have the source bitmap on their system.  On the long run I even want the sprayed images to persist across matches.

There's a bit of replication acrobatics involved in making that work, but so far it works nicely &amp;ndash; the data is loaded client-side, transmitted to the server via a replicated function in &quot;bunches&quot; of no more than 64 bytes a tick, and then left to the engine to be replicated back to all (non-bNetOwner) clients.

Two things I noticed doing that were that, firstly, the engine only replicates the first 256 bytes of an array of 512 byte values (where I don't know exactly whether it's the number of elements or their total size which is limited by the engine); and secondly, that passing a byte array via a replicated function call will only actually replicate the first value of that array, not the entire array.  However, if the array is part of a struct which is passed through the replicated function, everything works fine (hence my &quot;bunches&quot; of data).

The user interface for that thing is keeping me thinking.  Right now I figure that pressing your usual &quot;talk&quot; key (&quot;T&quot;, for instance) quickly twice in a row (like a double-click) would pop up a window where you could select which image to spray (using the mouse or arrow/movement keys), but that idea is subject to change.  For now, the &quot;mutate SprayImage &lt;filename&gt; &lt;color&gt;&quot; console command does the trick.

==November 17, 2004==

I've moved into my new apartment last Sunday, and today I got ISDN and DSL activated.  Thus, JDN is up again &amp;ndash; whatever caused my computer to break down two weeks ago is mysterious to me.  Maybe my video card overheated after all after having been running non-stop for months without a monitor attached to it... still, not really a satisfactory explanation.

Now that my home computer has been hosting CVS, an Apache webserver with JDN and other services and an ISDN calling machine and fax server for quite a while and across several hardware updates, I've been thinking &amp;ndash; it's getting harder and harder to keep the noise level coming from this machine at a level I'm willing to bear in my living room.  Plus, most of the time the computer is merely converting electric power into noise and heat via a video card and processor which are ridiculously overpowered for something acting as a web/fax/CVS server most of the time.

...so &amp;ndash; *drumroll* &amp;ndash; I've got that fabulous idea of building a small machine out of spare parts mostly left over from hardware upgrades of my main PC over the years.  I've got two mainboards/processors to choose from (a Pentium 200 MHz and an Athlon 800 MHz which I could underclock to 500 MHz), some left-over RAM, an ethernet card (my latest mainboard had that on-board) and a simple video card (an ATI XPert@Work sporting a 3D chipset with the staggering amount of 8 MB VRAM).  I also have a midi-tower computer case somewhere.  What I need is a silent power supply and &amp;ndash; probably &amp;ndash; a new harddisk (especially if this thing is to act as a file server as well) unless I find a suitable one in my pile of used hardware.

I figure I'll install Debian Linux on it &amp;ndash; with that awesome 3 MBit/s downstream I've got I can even download it without much hassle.

'''Update:'''  Wow.  Silent 80 GB harddisks come for less than 60 EUR these days?  o_O

==March 8, 2005==

&lt;nowiki&gt;*blows dust off this page*&lt;/nowiki&gt;

&lt;nowiki&gt;*cough*&lt;/nowiki&gt; &lt;br /&gt;&lt;nowiki&gt;*cough*&lt;/nowiki&gt;

Remember the Palpable mutator for Unreal Tournament?  Probably not, because I never actually released it, and the BuF mess-up two years ago ate all remaining evidence for it.

Basically, it allowed the user to see stereo 3D by displaying two versions of the current scene rendered from slightly different points of view.  You had to squint to see the effect, just like for [http://www.brossco.fi/janne/eclipse99/budapest/bu_3d.html these photos].

I tried to implement the same thing for UT2004 on Sunday.  To the degree that two viewports were rendered on the screen next to each other, it was a piece of cake; but, having the HUD render within one of those viewports prove to be impossible.  In Unreal Tournament, it was basically just a matter of setting [[Legacy:Canvas|Canvas]].OrgX/OrgY and ClipX/ClipY right &amp;ndash; but UT2004's HUD makes heavy use of the native DrawSpriteWidget function which, while honoring OrgX/OrgY and ClipX/ClipY, doesn't take the reduced size of a viewport defined through those properties into account when positioning and scaling the widgets.

So, no way.  Well, it was just an experiment anyway.  The 3D effect itself is pretty cool, though, even if it strains the eyes to squint that way for an extended period of time...

In other news, after a period of consideration, I bought a digital piano today &amp;ndash; a [http://www.rolandus.com/products/ck_details.asp?CatID=11&amp;SubCatID=45&amp;ProdID=HP-101 Roland HP-101].  I played the piano for years before leaving my parents' home to go to university, and I want to pick this hobby up again.  And, wow, those digital pianos nowadays really do sound and feel like the real thing &amp;ndash; down to subtle details like the slight resonance you hear after releasing a key, or that the keys for the deep tones react with slightly more resistance to being pressed down than the high-pitched keys...

===Comments===

'''Birelli:''' I remember Palpable, I think a couple of us on IRC tested it for you one time. It's definitely a cool effect, but it gave me a headache after about 15 minutes of playing. Probably not something people want to use all the time. Also it takes a bit of practice before you can train your mind into not forcing one eye dominant over the other, so at first it's basically impossible to run in a straight line.

==April 19, 2005==

Those who have followed [http://www.planetjailbreak.com/?news=275 PlanetJailbreak news] are aware of what I've been working on recently: the visuals of freezing and shattering a player model.  Part of the problem is to overlay the player model and the weapon it holds with an &quot;ice&quot; texture that gradually fades in.

My first idea was creating a [[Legacy:Shader|Shader]], setting its &lt;code&gt;Diffuse&lt;/code&gt; material to the player's skin texture, the &lt;code&gt;Specular&lt;/code&gt; material to my alpha-blended &quot;ice&quot; texture and use a [[Legacy:ConstantColor|ConstantColor]] as its &lt;code&gt;SpecularityMask&lt;/code&gt; material to control the fading.  That works fine for the player model, but utterly fails for the weapon &amp;ndash; the weapon's textures are implicitly defined through the mesh, and there's no way UnrealScript code can get hold of them (not even anything similar to [[Legacy:Dynamicly Accessing Original Static Mesh Textures|this method]]).

So, that approach fell somewhat short of what I had envisioned.

But there's &lt;code&gt;OverlayMaterial&lt;/code&gt; defined in [[Legacy:Actor|Actor]], along with a &lt;code&gt;SetOverlayMaterial&lt;/code&gt; method, which is used (among others) by the UDamage to produce that &quot;energy&quot; overlay effect on players and weapons.  I had previously found out already that using a plain texture as &lt;code&gt;OverlayMaterial&lt;/code&gt; will simply replace the model's skin by that texture (instead of overlaying it) &amp;ndash; not what I intended, so I had put that approach aside.  Now, I picked it up again.

After some lucky experimentation, I found that I was able to use a [[Legacy:Shader|Shader]] as an &lt;code&gt;OverlayMaterial&lt;/code&gt; whose &lt;code&gt;Specular&lt;/code&gt; material was set to my &quot;ice&quot; texture.  Funnily, I noted that:

* The &lt;code&gt;Diffuse&lt;/code&gt; material I tried to set was automatically overwritten with a reference to the overlaid actor's skin (the skin part with the highest ordinal number in the meshmap, I guess).  So, here's a way to find the original skins of a non-static mesh if you need to.

* The &lt;code&gt;A&lt;/code&gt; (alpha) member of the &lt;code&gt;Color&lt;/code&gt; property of a [[Legacy:ConstantColor|ConstantColor]] material I tried to use as the shader's &lt;code&gt;SpecularityMask&lt;/code&gt; was immediately reset to zero whenever I attempted to set it to something different.  Why would the engine do such a thing...?

So, that didn't work the way I had it intended to.  Neither did any attempts to replace the plain &quot;ice&quot; texture in the &lt;code&gt;Specular&lt;/code&gt; slot by a [[Legacy:Modifier|Modifier]] of any kind.

Then, in a last futile attempt, I tried using a [[Legacy:FadeColor|FadeColor]] in the &lt;code&gt;SpecularityMask&lt;/code&gt; slot (instead of a [[Legacy:ConstantColor|ConstantColor]] as before), and lo!, when I set its &lt;code&gt;FadePeriod&lt;/code&gt; to something other than the default, zero, it worked!  Well, of course I had a pulsing overlay now, but setting both &lt;code&gt;Color1&lt;/code&gt; and &lt;code&gt;Color2&lt;/code&gt; to the same color fixed that.

So, now I've got a texture overlay on both player and weapon which I can smoothly fade in (and out, if there was any need) and which still lets the original textures shine through.

===Comments===

'''Wormbo:''' Interesting hack. :) The engine uses the ConstantColor in the SpecularityMask slot to fade out the overlay effect when the actor's overlay timer drops below 1 or so.

==May 1, 2005==

Microsoft has a pretty good reputation on IDEs, but ''Microsoft eMbedded Visual C++'' really has at least one major quirk which makes working with it a pain unless you either know how to avoid it or unwittingly got around it by failing to customize your workspace too much.  I didn't fall into the second group, and it took me until today to become part of the first.

I'm developing a small smartphone application to remote-control MP3 playback on the Linux server which sits quietly in my closet via Bluetooth.

The ''Smartphone 2003 SDK'' comes with a smartphone emulator.  That's very nice, but it becomes pretty frustrating once it stops working &amp;ndash; which, for me, happened basically whenever I started the IDE for the second time after installing it:  Whenever I wanted to run my program, I got an error dialog telling me one of the following things:

{{innerbox| Cannot find a default device. Please create one or more from the Platform Manager.

}}

&lt;nowiki&gt;&lt;/nowiki&gt;

{{innerbox| There is no device installed. Please go to Configure Platform Manager to add a device.

}}

Obviously there were still the same devices as the last time, and I certainly hadn't changed configurations since last successfully running the program in the emulator.  So, almost each time I wanted to work on my project, I had to uninstall the entire IDE and reinstall all of it &amp;ndash; two installers, one of them badly made, and a service pack; half an hour work just to get the IDE to work again.  Needless to say, I didn't do that very often.

Of course, I googled for a solution.  Nothing to find except for two postings from people with the same problem without any replies to them.  At least I wasn't alone; little consolation there, though.

Today, I got that second error message from above for the first time, and that was my luck.  Googling for ''that'' finally led me to a newsgroup message with the solution:  If you disable the WCE Configuration toolbar, the (unlabeled) &quot;default device&quot; drop-down box (the rightmost one) '''will automatically revert to &quot;Smartphone 2003 Device.&quot;'''  Set it back to &quot;Smartphone 2003 Emulator&quot; and everything works again.  There's no menu command for that option.

&quot;Son of a gun!&quot;, to say it in the original newsgroup poster's words.  What an unnecessary annoyance.

==November 3, 2005==

Today at around 11:15 AM, I successfully completed my twenty-ninth year of life (for a suitable definition of &quot;successfully&quot; :-P), heading into the thirtieth without hesitation. Happy birthday to me ;-)

===Comments===

'''El Muerte:''' damn you're old ;)

'''EntropicLqd:''' Happy birthday youngster (for a given value of young).  Give it another few years and you'll feel like you are falling apart :)

'''Sweavo:''' phew it's not just me then Entropic :-)

'''Tarquin:''' Happy birthday Mych! The big 30 next year ;) It's not as awful as it sounds :)

'''Mychaeel:''' Hehe, thanks y'all :-)

'''MythOpus:''' I saw it awhile ago, but I was always on my dads Linux computer so I haven't been able to... WISH YOU A HAPPY BIRTHDAY!

'''Mychaeel:''' I'll take good wishes at any time, so: thank you as well :-D

'''Sweavo:''' in that case, have had a happy birthday :-)

==April 24, 2006==

Setting a data structure element of a replicated array element won't actually make the engine replicate that array element.  You'll have to set the ''whole'' array element to make the engine notice that it has changed:

&lt;uscript&gt;
function TouchElement(int iElement)
{
  local TElement ElementTemp;

  ElementTemp = Elements[iElement];
  Elements[iElement] = ElementTemp;  // prod!
}
&lt;/uscript&gt;

Has anybody else ever had that problem?

===Comments ===

'''EricBlade:''' I haven't personally had a reason to make an array of structs yet, but it sounds like it could be related somehow to the problem of not being able to replicate -just- a struct, without some other var?

'''Wormbo:''' That seems to be a general problem of struct replication, not only structs as array elements. The code &lt;code&gt;Elements[iElement] = Elements[iElement]&lt;/code&gt; seems to be enough to cause replication though, whether anything actually changed or not.

'''Mychaeel:''' Yes, I also realized that the detour over a temporary local variable probably wasn't necessary at all &amp;ndash; I was still under the influence of the &lt;code&gt;SwapElements&lt;/code&gt; function which actually ''needed'' one.  I've occasionally replicated (individual instances of) structs without problems, though &amp;ndash; you only have to be aware that changing any struct element will cause the entire struct to be replicated.  (Actually, I've used that as a feature occasionally.)

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>34475</id>
      <timestamp>2009-06-05T11:31:45Z</timestamp>
      <contributor>
        <ip>203.32.87.50</ip>
      </contributor>
      <comment>formatting fixes</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries, but feel free to add comments.''

}}

==December 14, 2002==

{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson]]''

}}

No effort is wasted if you've learned something from it.  (Though that doesn't mean that the same time couldn't have been spent more effectively.)

Occasionally I'm stuck in a dead end of my own design and can't seem to find my way out of it.  The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on.  So I linger a bit longer and cudgel my brains for some ''other'' way to reach my goal than backing up.

Deleting an evening's worth of good code requires an effort, but if it relieves me of a week's worth of trying not to scratch it, it's worth it.

===Comments===

'''Tarquin:'''  &quot;The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on. &quot; &amp;ndash; I do that all the time in mapping. I end up with multiple copies of the same area, each one trying a different solution...  What usually happens is I eventually work up the courage to start from scratch.

'''Mychaeel:''' That's exactly what happens to me too.  :-)  Realizing when it's better to scratch a few good ideas in favor of an entirely different approach (maybe even one with a slightly different outcome than what I originally figured) is a learning process.

==December 20, 2002==

Note to self:  Not assuming that other people's contributions to a testing environment are free of bugs can be a huge time saver.

==January 17, 2003==

Incidentally I dug out the code I scratched in the first entry on this page and used it for a related, but different purpose where it actually fits in.  (Good thing I never really delete something for good unless I'm ''absolutely'' sure it won't ever be of any use anymore.)

The code is part of Jailbreak's bot support and is supposed to let bots make an educated guess where an enemy player is currently located after the enemy gave his position away by triggering a release switch.  Naturally, if there's only a single relase switch, all that boils down to a single possible location.  Where it gets interesting is if there are ''multiple'' release switches and the bots actually have to ''guess'' which one the player triggered.

My code does that based on the last known location of a player (directly after a round starts, or after a spawn in freedom after winning an arena match, or after being released from jail), the walking distance (using the path network) to all of the release switches and the time that passed since the player's location was known last.  With that and a more or less arbitrarily chosen probability distribution for a player's distance from his starting point after a given amount of time (something based on half a Gaussian) bots take a random guess weighed by the respective probability of the enemy being at any of the possible switches.

==January 18, 2003==

Wrote about [[Legacy:A Bug'S Life|A Bug's Life]] hoping that it'll inspire our bug hunters to posting better bug reports than they occasionally did for Jailbreak III.

==January 23, 2003==

UT2003's speech menu redefines the terms &quot;non-extensible&quot; and &quot;hard-coded.&quot;  I'm sure there's a way into it though &amp;ndash; I just haven't worked it out yet.  (Subclassing [[Legacy:ExtendedConsole|ExtendedConsole]] is, hardly surprising, not an option.)

==January 24, 2003==

[[Image:Legacy_speechmenuhack-ordermenu.jpeg|left|]]

Apparently there ''is'' a way.  The &quot;Team tactics&quot; menu item here opens a submenu where you can select one of a set of tactics for your team.  (All other menu items open a list of players you can order.)

Getting it to display your own entries is the easy part, to be sure &amp;ndash; being notified when the player selects one of the entries requires some more code insight.  It is possible though, and I'm just about to implement it.

If this works out, I'll describe the hack in detail somewhere on the Wiki.

==January 25, 2003==

[[Image:Legacy_speechmenuhack-tacticsmenu.jpeg|right|]]

It works.  When you select one of the entries in the tactics menu displayed to the right, SetOrders in [[Legacy:TeamAI|TeamAI]] is notified and gets a chance to intercept the selection.  The default implementation of SetOrders puts the following message into the log:

  ScriptLog: Team New orders TacticsNormal JB-IronMan.xPlayer0

TacticsNormal is a label I assigned to that menu item; everything else in that message is from Epic's own code.  Any unwanted cosmetic side effects can be controlled by overwriting SetOrders with your own code.

There's relatively little code involved in the whole hack:  One piece of code that's executed in some actor's client-side Tick (I used Tick in our [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]] subclass, but it could be anywhere) that modifies the speech menu's behavior; and a piece of code that modifies some properties of [[Legacy:Bot|Bot]]s when they're spawned.  And, of course, the code in SetOrders in [[Legacy:TeamAI|TeamAI]] that does whatever you want your custom menu item to do.

Modifying the speech menu that way has its limitations, of course.  There are only very few &quot;slots&quot; left for custom notifications (exactly nine), and custom submenus like my &quot;Team Tactics&quot; menu are only possible for menu items in the &quot;Orders&quot; submenu.  Details to follow.

==February 3, 2003==

So little time, and so much to do... but I don't regret spending the last weekend skiing in Tyrol.  ;-)

[[Legacy:UMake|UMake]] should be updated and released in version 1.2.  [[Legacy:Spectate Bots|Spectate Botmatch]] has a host of new functionality to be implemented, despite Epic refitting a &quot;Spectate&quot; button in the Instant Action dialog with the last patch.  Deathball needs some small code tweaks on my part.  [[Legacy:Jailbreak|Jailbreak]] development must continue.  And in addition to that there's some Perl coding work I'll actually get paid for and whose deadline is approaching sometime in mid-February.

==February 10, 2003==

If you want to make ''absolutely sure'' that a certain thread in a forum remains undiscovered, stick it to the top and place the words &quot;Read this before posting&quot; in its subject.

==February 14, 2003==

Bots in jail (in Jailbreak) should idly walk around, occasionally lie down and sleep, and engage in hammer fights if there's an eligible opponent.

It seems to me that maybe the best way to achieve all this is creating several custom [[Legacy:ScriptedSequence|ScriptedSequence]] subclasses, one for &quot;walking around&quot; (to select roam destinations in jail only), one for &quot;lying down and sleeping&quot; and one for &quot;engage in jail fight (and stop when the opponent opts out)&quot;.  The latter two will probably require custom scripted ''actions'' too:  &quot;start sleeping,&quot; &quot;wait and occasionally snore&quot; and &quot;stand up&quot;; and whatever is required to make a bot attack an opponent with an arbitrary melee or non-melee weapon.

Sounds like I'll better release alpha 4 ''before'' tackling that...

==February 15, 2003==

UT2003 bots don't really support being animated by means of a [[Legacy:ScriptedSequence|ScriptedSequence]] &amp;ndash; even if you manage to make them play a certain animation, the [[Legacy:XPawn|xPawn]] reverts to an idling pose as soon as that animation has ended.  In addition, those idling animations are natively &quot;physics controlled.&quot;

What's possible though is temporarily resetting the ''names'' of the idling animations to refer to non-existent animations.  That's a pretty heavy-handed approach, but it works (and puts a bunch of warning messages into the log).

'''Update:'''  ZappyAd pointed me to the bPhysicsAnimUpdate flag in class [[Legacy:Pawn|Pawn]].  Setting it to False disables the native &quot;physics-controlled&quot; animations, and indeed, it works well.

==February 17, 2003==

Scratched sleeping bots.  Implemented bots that hammer-fight in jail with human players instead.  Much more fun and rewarding.

==February 24, 2003==

I figured out the hard way that even custom game types can't simply replace the game's [[Legacy:TeamInfo|TeamInfo]] actors by subclassing [[Legacy:XTeamRoster|xTeamRoster]].  One of our bug hunters reported that setting up a game with custom bots broke crucial parts of the gameplay, and a look into the log revealed that UT2003 didn't use Jailbreak's custom TeamInfo subclass as configured in the the game type's DefaultEnemyRosterClass variable but instances of [[Legacy:TeamBlueConfigured|TeamBlueConfigured]] and [[Legacy:TeamRedConfigured|TeamRedConfigured]] instead.

So, once more, I'm ending up ''attaching'' an actor of mine to a stock UT2003 actor instead of replacing the stock actor's class by my own.  Jailbreak did so with several other gameplay-relevant classes (not just TeamInfo) before already &amp;ndash; PlayerReplicationInfo, for one, instead of introducing a custom PlayerReplicationInfo subclass.

In Unreal Tournament &quot;attaching&quot; an actor to another actor was more or less limited to the possibility of setting the attached actor's owner to the actor it was attached to and then using the ChildActors iterator to retrieve the attached actor when requested.  (Or any variant of that, though those that come into my mind are all equally inefficient.)

In UT2003 however every actor can have its own inventory by means of the Inventory variable which is declared in class [[Legacy:Actor|Actor]].  Traveling an actor's inventory chain is fast and efficient compared to using an iterator, so I implemented a generic abstract superclass for info actors that are &quot;attached&quot; to another actor, including code that automatically sets up a linked list of all &quot;actor tag&quot; actors of the same class and a mechanism that, if so desired, communicates registration and unregistration of an &quot;actor tag&quot; to all clients even during its lifetime.

Well, anyway, the TeamInfo problem was quickly fixed thanks to that mechanism.

===Comments===

'''Wormbo:''' Actually the inventory chain was available to all actors in Unreal v205 already. (Yes, I really have that code here... :D)

'''Mychaeel:''' Hmm.  I don't, but I do have the Unreal Tournament sources and... behold, you're right.  Oh well.  :-)

==March 17, 2003==

When I was implementing a new feature yesterday I noticed that I had to change a remotely related part of the code in order to avoid some small lag in a visual effect &amp;ndash; no big deal, but something that deserved to be fixed.  So I opened the class responsible for the delay, found the place where I had not anticipated the need for some direct connection between two pieces of code in my original design, and added it.

Then I realized that this was the third or fourth time I had added a bit of code at that place to accommodate a new requirement that had popped up since I had initially designed that class.  Each time I had addressed a small particular problem, each time I had added a bit of code to fix it; and while each of those changes were small and simple, the whole code grew more complicated and less elegant with every change I applied to it.

Time to scratch that part of the code and rethink its design with all old ''and'' new requirements in mind.

Changing, fixing and tweaking code a small part at a time inevitably leads to bloated, unelegant, bug-prone constructions sooner or later.  That's commonly called [http://info.astrian.net/jargon/terms/f/feature_creep.html feature creep] &amp;ndash; and after a time any software suffering from it becomes so unmaintainable that adding, testing and debugging a new feature becomes almost as much work as rewriting everything from scratch.  It's a developer's nightmare.

So sometimes it really pays off to start redesigning parts of a program before feature creep sets in.  The difficult part is to realize that before it's too late; and even more so for people not directly involved in the development process who can't relate to the idea of elegant, straightforward and bug-resistant program design.  Coding for a mod whose development is being slowly ground to a halt by somebody in charge adding more and more features that were never part of the original design can be a pretty frustrating experience.

==May 4, 2003==

ElapsedTime and RemainingTime in [[Legacy:GameReplicationInfo|GameReplicationInfo]] aren't replicated all the time in [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] &amp;ndash; that's for saving bandwidth, I suppose, and that must be a good thing.

Bad thing is that it doesn't work too well.  The idea is that ElapsedTime and RemainingTime are replicated ''once'' when the whole GameReplicationInfo actor is initially replicated to the client, and then the client increases ElapsedTime and decreases RemainingTime once per second all by itself.  Sounds simple enough, but somehow the initial value replication doesn't seem to work &amp;ndash; and that's not just in Jailbreak, it's exactly the same in vanilla Deathmatch.  Consequently, the time display in the scoreboard is out of sync with the actual game time.

The programmer who thought that up at Digital Extremes or Epic must have anticipated some of those problems though, because it actually gets a bit more complicated than what I described above.  In addition to ElapsedTime and RemainingTime there's a variable called RemainingMinute that is replicated every time it is changed.  The Timer event in [[Legacy:DeathMatch|DeathMatch]] sets it to the current value of RemainingTime every full minute.  GameReplicationInfo in turn picks it up and copies the replicated value of RemainingMinute to the client's local RemainingTime, thus re-syncronizing RemainingTime with the game's actual time.

Since I'd like Jailbreak's spiffy game time clock in the scoreboard to show the right time at ''all'' times though I guess I'll have to look for a fix.

'''Update:'''  Two distinct problems there:  Firstly, the initially replicated value of RemainingMinute always resets RemainingTime to the last full minute on mid-game connect; secondly, there can be an almost arbitrary delay for precaching textures and other content between PostNetBeginPlay (when the values for ElapsedTime and RemainingTime have just been replicated) and the first call of Timer (where they're updated client-side).

==May 7, 2003==

...so in Jailbreak the client sends a replicated function call to the server which directly responds by sending another replicated function call back to the client along with the current server time.  The client calculates a time offset between itself and the server; and if it also takes the time into account it took the response function to be called on the client after the synchronization request had been issued, it's possible to synchronize client and server time to a precision of approximately a tenth of a second.

That happens once a client has finished loading and precaching the game.  [[Legacy:GameReplicationInfo|GameReplicationInfo]] only replicates the server time the match started, and determines ElapsedTime and RemainingTime based on the current client time and its offset to the server time.

===Comments===

'''Kuhal:''' I am interested in the replication behaviour you have discovered here.  It may lead to an explanation of some behaviour I am getting during a pause in a network game.  The client's countdown clock rapidly counts down the seconds that have passed while the match was paused.  While I am certain the remaining time on the server has indeed been paused, it seems that the client thinks it knows better and catches up.  The weird thing is that the game ends &quot;on time&quot; when the client ramaining time reaches 00:00.  Are there any more references to how these attributes work in UT?

==May 22, 2003==

&quot;All you can eat&quot; for 5 ? in the uni's cafeteria today.  Burp.

Jailbreak's [http://www.planetjailbreak.com/misc/jailbreak2003-scores-5.jpg?link scoreboard] displays a minimap showing the current locations of your teammates.  In network games that means that those positions have to be replicated to all clients.  That leads to jerky movement of the dots on the minimap because the locations are updated only every couple of frames, not every (client-side) frame.

That problem can be somewhat relieved by using the [[Legacy:Pawn|Pawn]]s' actual positions when they happen to be present on the respective client; but the other player positions still jerk.  Some sort of motion prediction or motion interpolation should be built in; and preferably in a way that does not multiply the bandwidth requirements of the whole separate location replication business &amp;ndash; my bandwidth conscience is striking already without that.  That rules out simply replicating the player's velocity along with their position.

Since the minimap is by design mini, the updates usually don't go beyond a movement of a couple of pixels each time; and it's more to show the players' rough current whereabouts anyway, not their precise locations.  Maybe an algorithm that &quot;learns&quot; about the frequency of the position updates and interpolates between the ''last two'' replicated known points (and beyond if the next update isn't received in time) might yield smooth and reasonably accurate results.

Unrelated to that I also wonder whether I should keep up the splines connecting the player names to their location dots on the minimap.  I'm starting to think that simply attaching a small tag with the player's name and possibly a health bar would be nicer.

==May 24, 2003==

The principle works, but the movement is still jerky.  Motion prediction doesn't work well because the time that passes between a replicated variable being set on server-side and its new value being received client-side varies wildly:  So even when the player is moving in a straight line at a constant velocity, the client-side predicted location has to be corrected with every update.

Now I'm pursuing a different idea &amp;ndash; adding the received location updates to a client-side list and trying to have the client interpolate along that list of locations, choosing its velocity independently as to keep up with the succession of new locations that are added to the list.

When the client-side interpolated location information reaches the last known location in the list and the player is not known to have stopped moving server-side, it extrapolates the player's movement using the last known direction and velocity.  That can even be used to save bandwidth:  The server only sends another update when it expects the client-side extrapolation to have deviated from the player's actual location too much.

==May 25, 2003==

To my mild surprise what I've implemented now works much better than I had dared to hope.

The server sends occasional location updates to all clients; and in addition to that, the absolute value of the player's movement velocity.  The ''direction'' of the player's movement is derived from the succession of location updates; as described in the previous entry it's impractical to derive the velocity as well from the location updates because time differences can't be relied upon when network replication is concerned.

Using the absolute value of the player's velocity instead of the velocity vector itself saves some bandwidth &amp;ndash; two thirds in the size of the replicated data item alone (vector consists of three floats, its absolute value of only one), and it's also much less likely to change (the absolute value remains the same even when the player changes his movement direction or strafes).

Still, with every location update there's bound to be a small deviation between the client-side extrapolated location and the updated absolute location sent by the server.  Client-side, that deviation is simply smoothed out on a short time scale &amp;ndash; that way the client-side motion simulation never suffers of any jerking motions, only small variations in movement speed which are virtually impossible to notice.

What I haven't implemented yet is the aforementioned optimization of location updates when a player keeps moving on a straight line for a while, thus making the client-side linear extrapolation sufficiently accurate even for longer periods between updates.  No actual player does that in a firefight, of course; but it's not all that unlikely to happen in general, especially given that without that optimization location updates would be sent with a frequency of about five times per second.

'''Update:'''  Reducing the number of location updates that way works fine as well.  When moving on a straight line several seconds may pass between two location updates while the client-side minimap location indicator still accurately shows the moving player's constantly changing location, smoothly picking up a later change in the player's movement direction.

==May 26, 2003==

Would it still be fun if there weren't always more problems awaiting a solution?

When reading my code again I realized that it wasn't at all robust against server-side updates that never reached a particular client.  While the mechanism doesn't rely on the time between two received updates anymore, it still assumes that the client gets to see every update the server sends &amp;ndash; and that may not necessarily be the case.  If the client misses one update, the client's idea of the player's movement direction will be completely off, especially since the server already sends only the minimum amount of updates that can be used to derive the direction.

So I have to make sure that the engine itself takes care that all clients always have a consistent set of information &amp;ndash; the engine must know that if a client misses one or several updates it is necessary to send the last ''two'' location updates to that client next time.  The easiest way to achieve that is by having two replicated location variables that are alternatingly set to the player's most current location &amp;ndash; the other one then contains the location one step earlier.

However, the problem isn't completely solved already by that.  Since those two variables (a two-element array, actually) are set alternatingly server-side (so that on each step only one of the values changes and has to be replicated), the client has no way to know which of the two replicated locations is the most current one &amp;ndash; and so it can only derive the axis on which the player is moving, but not whether the player is moving &quot;forward&quot; or &quot;backward&quot; on that axis.  The client needs one bit of extra information to resolve that ambiguity.

It's not as trivial as it may sound to derive a consistent notion of &quot;forward&quot; or &quot;backward&quot; for any given non-zero vector.  Simply trying to define &quot;forward&quot; and &quot;backward&quot; in respect to a certain fixed direction is ambiguous as soon as a vector is lying in the plane perpendicular to the chosen direction; so that won't work (or rather, it will, but only in ''almost'' all cases, which is unfortunately not enough &amp;ndash; Murphy knows).  So, the method I've chosen to define &quot;forward&quot; and &quot;backward&quot; takes the signum of the first vector component (X, Y, or Z, in that order) that is not zero &amp;ndash; that's guaranteed to be non-zero for any non-zero vector, and the resultant value changes its own sign when the vector does.

To sum it up, the client now has ''two'' replicated location values without knowing which one is the most current one; so it calculates the vector difference between those two and applies the notion of &quot;forward&quot; or &quot;backward&quot; on it (described above), checks it against the separately replicated bit of information sent by the server and changes the vector's sign if necessary.  And Bob's your uncle.  (See what Terry Pratchett does to one's vocabulary?)

But... wouldn't it have been much easier and just as effective if I had simply replicated an extra bit of information telling the client which of the two locations is the most current one, instead of laboriously introducing weird notions of &quot;forward&quot; and &quot;backward&quot; vectors? &amp;ndash; Easier it would be but not as effective.  That bit would have to be changed every single time the server does an update even if the player only made a slight correction in his movement direction; the method I've chosen only changes that bit when the player's movement direction changes from &quot;forward&quot; to &quot;backward&quot; (in the special absolute sense described above), so it only ''occasionally'' requires a change instead of ''always''.

'''Addendum:'''  I actually have it implemented by replicating that extra bit of orientation information as ''the velocity's signum'' &amp;ndash; in an attempt to save bandwidth when both velocity and orientation change at the same time (and it also wouldn't take any more bandwidth when the velocity alone changes).  Upon writing about it here it suddenly occurred to me that this maybe wasn't all that smart after all &amp;ndash; if ''only'' the orientation changes but the velocity doesn't, the engine still has to replicate an entire float value even though only a single bit changed.  Would it be more efficient to go the straightforward way and use a separately replicated bool variable?  I'll keep a close eye on which updates actually need to be sent by the server in a real-game situation and decide then...

(And that's also why writing in this &quot;developer journal&quot; is worth the effort even if nobody's actually reading it &amp;ndash; it makes me critically review what I've coded.  It's a one-person code audit, so to speak.)

==May 30, 2003==

So, at last, the scoreboard is feature-complete.  Phew.  I dread writing the log for the CVS commit and getting JDN up to date... but the sooner I start, the sooner I'll be finished.

Showing the Jailbreak scoreboard has a noticeable impact on framerate at the moment &amp;ndash; I haven't been able to spot a certain, single part of the code that's responsible for the majority of the framerate hit.  Disabling certain scoreboard elements one at the time shows that the clock takes as much performance as the dotted splines do, and the code that updates the scoreboard's state with the game's live information isn't far behind.  The performance hit seems to be evenly spread over most the code.

Especially something like the clock could benefit from some sort of graphics cache &amp;ndash; it changes only once per second, but has to be rendered every frame.  If I could draw the clock on a [[Legacy:ScriptedTexture|ScriptedTexture]] and then on the screen, and update the ScriptedTexture only once per second, that might save several milliseconds per frame... given that I'd manage to get alpha transparency to work on a ScriptedTexture; I wouldn't like the clock to be displayed on a rectangular black background, not even for performance's sake.

Maybe there is a way to use alpha transparency on a ScriptedTexture.  During my experiments around drawing a map screenshot on a ScriptedTexture for the scoreboard minimap I noticed that the ScriptedTexture's DrawPortal function did, somehow, alter the ScriptedTexture's alpha plane &amp;ndash; it seems that wherever DrawPortal renders a normal solid texture, the ScriptedTexture will be completely transparent, but where an alpha-masked texture is drawn on the ScriptedTexture by DrawPortal the ScriptedTexture adopts its alpha mask there.  It's all pretty strange.

I also remember that in Unreal Tournament a ScriptedTexture could have a &quot;background texture&quot; that was used to initialize the ScriptedTexture canvas every frame.  I haven't found a corresponding property in UT2003's ScriptedTexture class, but maybe it's reusing an inherited property for that purpose &amp;ndash; FallbackMaterial maybe?  Gotta try that when I'm home.

==May 31, 2003==

I've finally decided that the manual implementation docs I had put on JDN have outlived their purpose &amp;ndash; they originally were the detailed specifications for the code before UT2003 was released, but after the classes were actually created there's little point in still keeping the specs around and manually up-to-date.

I tried [[Legacy:UnCodeX|UnCodeX]]'s HTML export, and while it works fine, it's information overflow.  I think people interested in Jailbreak 2003 implementation details do better with syntax-highlighted source code alone &amp;ndash; I tried to document it well after all.

The Wiki script running JDN now supports an extra parameter for the &lt;tt&gt;&amp;lt;uscript&gt;&lt;/tt&gt; tag that directly takes the sources from the CVS repository and renders them on the page.  It looks pretty neat and saves me lots of time keeping the specs consistent with the code.  Maybe I'll later add a DHTML feature for &quot;collapsing&quot; function bodys to keep only the comment headers visible by default.

'''Update:'''  Oh, and FallbackMaterial as a [[ScriptedTexture]]'s background texture does not work.  Guess I'm out of luck.


==June 4, 2003==

I want to keep players from using their translocator to get out of jail the easy way, and I don't want them to be able to telefrag Bonus Pack monsters.

Unreal Tournament had a handy AllowTranslocation query function in [[DeathMatchPlus]] for that.  Whenever anybody, player or bot, tried to translocate, this function was called and had the opportunity to prevent the translocation attempt.

Unfortunately, there's nothing like that left in UT2003.  The only thing that remains is a function in [[SquadAI]] that's queried for whether a bot will try to translocate.  The code that prevents players from telefragging teammates is buried in the Translocate function in class [[TransRecall]] -- it's basically a hard-coded check whether two players' collision cylinders impinge.


The only ''possible'' way into this code is via the SameTeamAs function (class [[Controller]]) used there that in turn calls IsOnTeam (class [[GameInfo]]).  The game could pretend that monsters are on the same team as any player trying to telefrag them, but SameTeamAs is used by other parts of the game code as well, which makes (ab)using it to prevent monster telefrags not straightforward.

And it still leaves me with the question how to prevent players from translocating out of jail...

'''Update:'''  I've ended up with removing the translocator from jailed players' inventories.  It's not all that messy after all.

===Comments===

'''ZxAnPhOrIaN:''' Maybe make an actor or volume that kills the translocator beakon when you try to teleport out, killing the person.

'''ZedSquared''' (from a UT classic point of view, dunno if any of this is feasable in 2003) Have a spawnnotify that catches transloctargets and modifies their velocity to kick them back to the owner (or the middle of jail) if they're in the jail zone perhaps ... or maybe subclass translocator, give the modified one as default inv, and override the fire function to not work in jail ... probably duff ideas, just thinking aloud late at night :)

'''Mychaeel:''' I'd rather try not to replace the normal translocator to achieve the effect I'm looking for (plus, there's nothing like SpawnNotify in UT2003)... and I'd also like not to require mappers to put in special zones or volumes.  (Right now jails work with any volume or zone a mapper places -- [[match these tags|attaching]] them to a JBInfoJail actor makes them part of a jail.) -- I could simply take a player's translocator away when he enters jail and give it back when he leaves jail, but that seems a bit messy.

'''Foxpaw:''' I don't see the problem - can't you just disallow translocator use in jail like in Jailbreak for UT?

'''Wormbo:''' That's exactly the problem, there is no AllowTranslocation function like in UT which allows the gametype to prevent translocation or add various other effects like flagdrop etc.

'''Foxpaw:''' Well, in that case why not allow translocation in jail, and just have surfaces that make up the jail solid? That way the translocator beacon would not be able to be launched out of the prison so a player couldn't escape merely by translocating.

'''Mychaeel:''' That would be a mapper-based solution, but the past (Jailbreak III) has shown that even in jails that were meant to be airtight (and must have been in editor terms since there a jail was defined by a distinct zone) occasionally had collision &quot;gaps&quot; in them that allowed players to shoot or, possibly, throw a translocator target outside (JB-Raid).  Even if a jail really is airtight it may be possible to place the translocator target so that translocating to it will place the player outside jail (JB-Antipody).  Besides, some jails are meant to have open windows to the outside or escape routes that players should be able to walk, but not translocate through.


==June 6, 2003==

The Jailbreak core to-do list has become pretty short.  Maybe, maybe, in a few weeks...


==June 8, 2003==

BeyondUnreal's forum breakdown will leave Jailbreak's development forums completely empty when they're back up.  Most of the hundreds of postings in there I'd have liked to keep mainly to keep a history of Jailbreak 2003 development; but some of them were ongoing discussions and long-term documentation.

Unrelated to that, early this afternoon my personal computer at home broke down as well; that leaves the CVS server and Jailbreak Developer Network offline too.  Fortunately the data itself wasn't lost; just my computer won't work.  If I'm lucky it's only either the power supply or the mainboard.  The bad thing is that tomorrow is a holiday here, so I'll need to stick with this notebook as a temporary measure till I have a chance to buy replacement parts.

===Comments===

'''Tarquin:''' I'll do my best to remember what's been going on. [[Jailbreak rescue]]

'''Mychaeel:''' That's a great idea.

'''Tarquin:''' Maybe I shouldn't put code dev topics on a public wiki though. I can just scribble a text file, or on the JDN

'''Mychaeel:''' JDN is down along with my computer, I'm afraid.  Tahngarth has set up a temporary Core Dev forum at http://www.planetjailbreak.com/tempforum/ -- register there and meet Tahngarth or me in chat to get access.


==June 9, 2003==

After finishing some Perl coding work (which I'm actually getting paid for) I'll see that my computer is restored to working order or that I at least find out which component exactly needs to be replaced.

'''Update:'''  The computer boots up with an old PCI video card; but as soon as I replace it by a AGP video card (either my current GeForce 4400 Ti or an older GeForce 2 MX), I only get either a strange creaking sound from the PC speaker or nothing at all.  Only the fans work.

A friend of mine who's professionally dealing quite frequently with broken PCs suggests that it might be either the power supply that doesn't manage the AGP cards' load anymore, or the mainboard for some reason doesn't like AGP cards anymore.  Unfortunately I don't have a spare ATX power supply at hand, so I won't be able to test that theory until tomorrow at the earliest.

In case it's the mainboard I'll at least use the opportunity to upgrade my old Athlon 800 MHz to whatever it is you can currently still get in a regular computer hardware shop -- apparently it's hard to find anything slower than 2.0 GHz nowadays.


==June 10, 2003==

My computer is up and working again.  I was surprised that for not more than about 180 ? I got a new processor (Athlon XP 2000+) along with a mainboard, silent cooler and memory (512 MB).  I could even keep my previous 235 W power supply.  By accident the processor is currently underclocked to 1.25 GHz (its normal clock rate would be 1.67 GHz) -- I'm not even sure whether I can be bothered to open the case once more and set the jumpers correctly.

So far the system seems to be stable.  Time will tell.


==June 11, 2003==

Bots should simply try to avoid being killed when &quot;evasive&quot; team tactics are selected.  (Useful when a team has a narrow lead shortly before the time limit runs out.)

I got that to work reasonably well with relatively little effort, code-wise:  Set the bots' aggressiveness to a really low value to ensure they don't feel inclined to engage in fights; then overwrite PickRetreatDestination and make it react in a suitably cowardly manner if the bot is seeing an enemy.  Right now they simply pick the [[NavigationPoint]] among their current MoveTarget's [[ReachSpec]]s that's farthest away from the enemy, or the closest one that provides cover.  Effectively that makes bots run away from an approaching enemy and make turns in order to move out of the enemy's firing line.

While it's fun (for a while) to chase bots around in a test map, I've come across one or two situations where bots are effectively stuck and too easy a prey to approaching enemies.  First I'll have to have bots detect this; then I'll have to have them react to it suitably, for instance by either simply choosing another way out or by acting like a cornered beast and falling back to normal dogfighting tactics until they're either dead or the threat is gone.  (Tomorrow more -- I'm tired.)


==June 13, 2003==

I found one reproducible situation in which bots are stuck in a tight loop of pathnodes they visit:  A bot sees an enemy, turns to flee, runs into cover; arrived there it wonders what to do next and decides to go on an inventory hunt, which leads it back into the enemy's sight -- ad inf.

The bad thing is that bots (or rather the native function FindBestInventoryPath in [[Controller]]) are not smart enough to check whether they even have the chance to pick up the inventory when they've reached it -- otherwise they wouldn't even try to reach it more than once in a row, and my problem would be a non-issue.


==June 14, 2003==

A comment in [[Bot]] hints that Epic meant to add a function called FindPathAwayFrom at some time -- alas, they didn't yet.  That leaves me with either sticking to my simple escaping algorithm from above (and its flaws) or creating a path finding function myself, in UnrealScript.

I've started giving the latter a try.  The idea is to recursively search the path network for [[NavigationPoint]]s that provide cover from the enemy, starting at the bot's current MoveTarget.  Some first test runs seem to indicate that it works, and it seems to have negligible impact on the performance so far.  (The Clock/UnClock mechanism described on [[Code Optimization]] proves pretty useful for such profiling.)

'''Update:'''  If a bot doesn't find cover nearby and realizes that the enemy must have seen it (because it isn't looking the other way right now), the bot panics and reverts to normal attack mode until the enemy is dead or out of sight.  I've put all that into CheckSquadObjectives now, and it seems to work pretty well testing it with a single masterful bot.


== June 16, 2003==

Hmm.  Why on earth does the game rules tab maintain its settings in separate config variables instead of taking and storing them in the game type's own configuration?


== June 17, 2003==

Why does filling the mutator list box on the &quot;Mutators&quot; tab involve two other separate classes?  Why is reading a list of available mutators a native function?

=== Comments===
'''Wormbo:''' I guess it's supposed to speed up loading of mutator classes, but it's not really that much of a boost compared to the &quot;old&quot; GetNextInt(Desc) method because now the mutators' code packages have to be loaded in order to find the mutators' names, descriptions and groups.

'''Mychaeel:''' I wonder whether that native function (GetMutatorList in [[xUtil]]) does indeed load the mutator name to get the mutator name and description -- a comment says it does ''not'' fill in the MutClass element of the MutatorRecord structure, which would make little sense if the class is loaded anyway.  (Unless GetMutatorList was internally &quot;optimized&quot; only to look up the class's default properties without loading the class; but I'd be a bit sceptical as to the wisdom of ''that'' optimization.  But maybe it has to do with cheat protection validating all loaded code...?  Gah.) -- There's an UnrealScript function LoadClasses in [[xMutatorList]] that would load the mutator classes, but it doesn't seem to be actually used.

'''Wormbo:''' It's not the only questionable optimization. (Still remember &quot;&lt;code&gt;// FIXME THIS SUCKS&lt;/code&gt;&quot;?) [[GUIController]].GetWeaponList also is a native function and it definately loads and returns weapon classes. I can't see any real optimization over Unreal's or UT's code here.


== June 18, 2003==

I'd like to intercept when somebody is clicking on a checkbox -- not just the part with the check mark but its label.

It took a while until I figured out that the bAcceptsInput flag must be set to True for any of a [[GUIComponent]]'s delegates to be called.  (Mmph.)


== June 23, 2003==

The OnDraw delegate is called for custom [[GUIPanel]] subclasses but not for direct subclasses of its parent class, [[GUIMultiComponent]].  Does that have a deeper sense or did just somebody forget to add a call to the delegate in [[GUIMultiComponent]]'s native Draw implementation?

'''Update:'''  Is it just me or does setting the TextFont property in [[GUILabel]] (and, thus, the LabelFont property in [[GUIMenuOption]]) have no effect at all?  (Obsoleted by the introduction of [[GUIStyles]] maybe?)  All labels in the game seem to have the same font, even those where Epic's own UnrealScript code decrees otherwise by setting TextFont.


== June 28, 2003==

This one has me baffled (in a [[WebApplication]] subclass):

&lt;uscript&gt;
function QuerySomething(WebResponse WebResponse) {
  local string ResultTemplate;
  ResultTemplate = &quot;should be overwritten by the next statement&quot;;
  ResultTemplate = WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
  }
&lt;/uscript&gt;

Now I'd expect ResultTemplate to contain the result of parsing the file something.inc... right?  And so it does, but '''appended to the previous value of the variable.'''  The resultant value of ResultTemplate is something like this:

  should be overwritten by the next statementContents of something.inc

Is that an engine bug?  Some arcane feature?  How can using LoadParsedUHTM on the right side of an assignment change the way the assignment operator works (given that the return value of LoadParsedUHTM is a mere string)?

However, the following workaround solves the problem:

&lt;uscript&gt;
  ResultTemplate = &quot;&quot; $ WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
&lt;/uscript&gt;

Trying to cast the right side to string in an attempt to do the same ironically yields a &quot;No need to cast StrProperty to itself&quot; compiler error.

==July 3, 2003==

Working on an HTML parser and formatter in UnrealScript again.  This time it'll be standalone and not part of [[Legacy:Screen|Screen]], even though I intend to use it for that end as well; and this time it's possible to use it on both [[Legacy:ScriptedTexture|ScriptedTexture]]s and a regular [[Legacy:Canvas|Canvas]].

I hope I'll get around to implementing tables and floating images as well this time.  The base architecture I'm currently designing and coding takes the requirements for those features into account already, so it should be straightfoward to even follow W3C's specification of [http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 calculating the width of columns] according to the standard.

==July 5, 2003==

The native Split and Divide functions turn out to be extremely handy for the kind of text parsing I'm doing at the moment.  (But I still want my native regular expression support in UnrealScript... mmph.)

===Comments===

'''El Muerte TDS:''' Nah, regular expression suck for text parsing, they are only useful for match (and replace). Using a [[Legacy:Tokenizer|tokenizer]] is much better for text parsing. It would be better if the native tokenizer was available in uscript.

'''Mychaeel:''' I dare say that depends on how you'd use regular expressions.  The _nextToken function in your tokenizer could be formulated much more efficiently using regular expressions, for instance.  (Though I agree that the availability of regular expressions might lead some people to creating terribly inefficient parsers.)

For that matter, my prime concern about this HTML parser is its performance, so parsing through the input stream character by character in UnrealScript is something I'm determined to avoid.  (The first version of [[Legacy:Screen|Screen]]'s ScreenSlidePage HTML parser did that, and it was slow as hell for anything exceeding ''very'' few kilobytes of input text.)

==July 6, 2003==

The HTML parser works like a charm since yesterday and nicely dumps the structure of a parsed HTML file, though I haven't made any performance evaluations yet; but in any case there's even some potential for optimization still (like identifying a tag's handler class by something faster than the sequential search I've settled for until the rest works, like binary search &amp;ndash; did I mention that native hash support would be a great addition to UnrealScript too?).

===Comments===

'''El Muerte TDS:''' There is a type called map, but it's only native atm (just like dynamic array used to be).

==July 9, 2003==

As usual it's not the ''normal'' case that makes implementing something a challenge; it's the ''pathological'' cases that do.

The obvious step after implementing an HTML parser is creating a formatter for the parsed HTML element tree.  The old one I made for [[Legacy:Screen|Screen]] (one of my first UnrealScript projects altogether) has no concept of tables or floating boxes, but this time I'm determined to add support for those and so I have to deal with the conceptual odds and ends that come with it.

A floating box is actually a pretty straightforward concept:  It's a rectangle that's placed at the left or right edge of the containing box starting at the vertical position of the text line it's defined in.  That technique is most commonly used to have text flow around an image on a website.

Normally, a web designer adds floating elements at the very start of a paragraph so the boxes are placed already when the formatter starts wrapping lines between them.

The beginning of a paragraph is, however, not the only valid place for floating boxes:  They can just as well be defined in the middle of a line, and that's where the trouble starts.  As long as the current line is short enough to fit next to the box, everything is still fine; just add the floating box and shorten the line box accordingly.

But what if the floating box is too wide to fit next to the text line where it's defined in?  The HTML standards document says that the box is then to start directly ''below'' the line it is defined in; that's simple enough to implement... but subsequent text after the definition of the floating box is still to be added to the very same line ''above'' the box, and according to Murphy's law somebody is bound to have some item in that line after the floating box definition that increases its line height.  That means, basically, that the absolute position of the floating box may not be completely determined at the time it is added.  Consequently, it may be necessary to shift the box down ''after'' it has been rendered.

==July 14, 2003==

I just realized that I failed to enter [[Legacy:UMake|UMake]] for the contest.  Ah well &amp;ndash; it sorely needs an update anyway given the huge list of pending fixes and improvements, and there's a lot of time till the deadline of phase two.

It's a bit of a pity that [[Legacy:MeshMaker|MeshMaker]] isn't eligible.  It might have had a chance to win something.

===Comments===

'''Haral:''' FYI, the deadline for the contest is tomorrow.  You can still enter, I do think.

'''Mychaeel:''' It is?  Well &amp;ndash; hardly enough time to give it the overhaul it deserves unless I was ''really'' desperate to enter it in phase one, but since there are two more phases to go, I think I'll just target phase two for now.  But thanks for the correction.  :-)

'''Haral:''' Those were my sentiments as well.  There's a lot of work to do on my mod, playable as it might be, before I'll feel it's ready for any sort of release.  Thanks for moving that comment btw, my brain doesn't exactly work well while I'm at work.  Anyway, time to get back at it, if I want to be ready by October.

==July 16, 2003==

Trying to read a binary file in UnrealScript.

The LoadParsedUHTM function in a freshly created [[Legacy:WebResponse|WebResponse]] object does well enough for text files, but I ran against a fundamental problem of UnrealScript's string data type here:  Obviously it's not as high-level as it should be in a language like UnrealScript and doesn't handle embedded null bytes (&lt;code&gt;Chr(0)&lt;/code&gt;) well.  A null byte terminates a string for all UnrealScript-related intents and purposes; so the content of the binary file I read is clipped off after a few bytes when the first null byte appears.

The only solution for that I can currently think of is briefly opening a TCP link from the game to itself, serving the binary file using the IncludeBinaryFile function in WebResponse and receiving it with a simultaneously spawned [[Legacy:TCPLink|TCPLink]] in binary mode.  But that's not only quite cumbersome, there's also a chance that some people's personal firewalls might complain about it (even though it's nothing but a local intra-process connection)...

===Comments===

'''Wormbo:''' AFAIK Quake 3 only works like this, even a single player game connects to a local game server, and when playing a skirmish game with open slots other players could join it, expanding it to a network game.

'''Nytro:''' I ''think'' this now constitutes more than &quot;short thoughts that popped up during Jailbreak development.&quot; o_O

'''Mychaeel:''' You're right.  I've scratched the &quot;short&quot; part in the description.

'''Nytrogen:''' I hate to continue to bother you... I don't own UT, and I can't find a decent description of [[Legacy:Screen|Screen]]. Would you mind giving me a link or quick 'Screen overview' blurb?

'''Wormbo:''' You just linked to it. There are links to the Screen website and forum. You should find any information you need there.

'''Birelli:''' Specifically the &quot;about&quot; page: http://www.planetunreal.com/screen/about.html on the Screen website.

==October 1, 2003==

This morning I officially handed in three copies of the physics diploma thesis I had been working on for the last year (and which had kept me off anything Unreal-related for the last two months).  For those interested, it's about ''Metal-Induced Crystallization of Silicon-Germanium Layers'' &amp;ndash; fundamental research for the next ('third') generation of solar cells which will be far more efficient and much cheaper to produce than what's currently on the market.

Well.  ''[takes a deep breath]''  This concludes more than half a decade of studies of mine at the Technische Universität München (I recently learned that they attach great importance to not being called &quot;Technical University Munich&quot; or something like that even on the cover sheet of English-language publications such as my thesis).  I guess it'll take a couple of days until I have really, deeply grasped the significance of this.  Right now, I'm mostly just relieved, happy, and tired.

One thing is sure, though:  I'm ready to get back into the Unreal community.  Even though I had been preoccupied by other things, I've really missed it.  :-)  It'll take me a few days to catch up, however, and there's also a lot more in my life which somewhat suffered during the last few weeks and which I have to catch up with, so be gentle.

===Comments===

'''Sobiwan:''' Solar cells: nice.  Enough of this fossil fuel baloney.  I hope your thesis helps push research and/or development further.  

'''Tarquin:''' Yay! Welcome back Mych. Good work saving the planet :)

'''El Muerte TDS:''' heh, it's not like this is the only planet we have ;) About the uni name, ofcourse they want it to be the german names, the english name is too easy to write, it doesn't have ä and ü. They want you to put effort in typing the name.

'''Mychaeel:''' Well, I got a German keyboard here, so effort is not an issue. &amp;ndash; The [http://www.wsi.tum.de/E25/research/theses.htm Walter Schottky Institute] where I worked, on the other hand, does not have any problems with officially allowing the English name ''Walter Schottky Institute for Fundamental Research in Semiconductor Electronics''. &amp;ndash; But then again, its name doesn't have any äs and üs in it, so your argument still holds.  ;-)

'''Tahngarth:''' Well I hope you get an A (or whatever the best grade is) :)

'''GRAF1K:''' Good, NOW GET TO WORK ON JAILBREAK!!! :P Glad you're back. :-) 

==March 1, 2004==

''* Mychaeel blows the dust from his developer journal, opens it and continues writing.''

Just checked in some actual, new, original Jailbreak code again yesterday.  Quite an elevating feeling.

It's a facility for our audio announcements.  We noticed that the number of distinct announcements grew exponentially as we thought of more and more situations in which one would make sense.  Some documentation of the system is available on [http://www.planetjailbreak.com/jdn/JBSpeechClient JDN: JBSpeechClient].

===Comments===

'''Tarquin:''' Wow! :) Looks cool!

==April 1, 2004==

Short of a few rather small features and known bugs, Jailbreak 2003 is finally feature-complete.  Yay!

The transition from UT2003 to UT2004 has put a big item on our to-do list again, though.  Epic has broken source code compatibility on several places, and other problems seem to stem from binary incompatibility (the &lt;code&gt;Ping&lt;/code&gt; variable in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] suddenly transmogrified from an int to a byte, which breaks the score display in our scoreboard).

It's strange, yet interesting and somewhat impressive, that UT2004 manages to load and run the game anyway.  At the surface, Jailbreak 2003 runs well under UT2004 already, even though it ''looks'' like Jailbreak 2003, at least HUD-wise.  Of course we're going to make Jailbreak 2004 blend in with UT2004 as well as Jailbreak 2003 does with UT2003.

If possible without too much pain I'd very much like to release Jailbreak 200x as a combined UT2003/UT2004 release.  The changes are small enough that it would be a shame to abandon all UT2003 users who didn't have the chance or the money to upgrade to UT2004 yet.

I'm looking into the details of [[Legacy:CVS|CVS]] branching right now.  Our &quot;main line of development&quot; will become UT2004, but we'll keep a UT2003 branch and take care to merge any generic changes into it.  ...if that works the way I hope it does.

==April 23, 2004==

The Jailbreak to-do list is empty, and I'm out of work.  (You bet.)  Guess it's beta time now.  Yay!  :-)

Currently working on a Perl script that automatically updates all required modules from CVS, checks for uncommitted changes, rebuilds them if necessary and automatically creates the distribution packages.  I hope to be done with that sometime tonight.  My girlfriend made us a spiffy installer logo &amp;ndash; I'm looking forward to hearing what the others say about it...

===Comments===

'''Corran:''' That's great news (for us anyway :D).  I can't wait for this.

'''GRAF1K:''' What he said. My mouth is watering. :D

BTW, did you know that UW is integated with the UT2004 UDE? Click on the Documentation tab in the code editing area and and there's unDox and Unreal Wiki. Sweet. :)

'''Corran:''' Yeah, it's been integrated into WotGreal fo a while now.

'''GRAF1K:''' Who cares about WOTgreal... UDE is official. :D

'''DJPaul:''' WOTgreal ''is'' the UDE.

'''Guest:''' Like the core of the application changes anything whatsoever... O_o

'''Wormbo:''' c-24-7-171-253.client.comcast.net (Guest above), will you ''please'' stop deleting Murphy from this page?

==May 17, 2004==

Let it never be said again that modifying the mid-game menu in UT2003 requires a custom [[Legacy:PlayerController|PlayerController]] subclass...

[[Image:Legacy_mychaeel-ut2003midgamemenu.jpeg|center|]]

==May 19, 2004==

I'm practically out of ideas what else could be added to Jailbreak &amp;ndash; almost time to release now...

Last thing we implemented were custom loading screens &amp;ndash; it's actually pretty straightforward to replace the default images displayed while a map loads by custom ones at runtime.

We've even managed to create one loading screen per bundled map and have the corresponding screen shown when the map loads &amp;ndash; and I've added a means for mappers to [http://www.planetjailbreak.com/jdn/Loading_Screen embed a custom loading screens into their map] which is displayed when that map loads.  Given that the necessary information is all there and is just being ignored by UT2004 stock code, I wonder why Epic didn't do that themselves...

===Comments===

'''GRAF1K:''' Epic wanted to include their uber-1337 Photoshop lensflares though! ;)

Looks like a ''very'' nice release coming up from you guys over at Jailbreak. I'd count off the minutes if I only knew when...

'''Note:''' I am indeed the M*rphy killer. Buggy 3rd-party software... :pissed: I'll get it fixed. For now though, I can't even replace the M*rphy's once I've killed them. Just revert once you see this.

'''Mychaeel:''' Argh... what kind of bug would ''specifically'' replace occurrences of the string &quot;Murphy&quot; in a text...?  o_O

'''GRAF1K:''' Well, it's not the bug directly that's doing that. The bug is me not being able to turn the feature off. The feature in question is a privacy feature that blocks sending of personal info (like the owner's name).

'''Mychaeel:''' So is it safe to deduce that your name is Murphy?  (Way to go for a privacy feature... :-p)

'''GRAF1K:''' LOL. I was going to disable that feature anyhow. The app does a lot more than that. Besides, my last name isn't Mürphy, but the account is under someone who's is. :)

==May 20, 2004==

Naturally, any display of hubris such as making the statement &quot;I'm out of bugs&quot; angers the Gods, so the to-do list has a few more now.  Fortunately, they're all pretty small yet, and I'm out to squish them before they get any bigger...  ;-)

==May 23, 2004==

You have no idea how glad I am that we're making a UT2003/UT2004 release of Jailbreak &amp;ndash; if only for the reason that on both my desktop computer and my notebook with their measly 512 MB of RAM starting UT2004 (or even UT2004 server and client at the same time) takes ''ages'' while the system swaps like crazy &amp;ndash; and loading UT2003, even server and client, works without any swapping at all.  UT2004 is a monster...

===Comments===

'''El Muerte:''' I don't have any swap issues when running UT2004 on my laptop (512MB ram). Haven't done much client+server testing, but the client takes quite some time to join the server (/me blames slow laptop HD). On my desktop I can run a server and two clients without any serious problems (1GB ram). I think windows is to blame :P

==May 27, 2004==

Jailbreak is out.  We assume full responsibility for all bugs that were left in.  :-p

Seriously though &amp;ndash; everything went reasonably smoothly, and while there ''are'' some bugs we'll have to fix, nothing really serious has popped up yet.  Feedback is very positive; feels good.  :-)

I've submitted Jailbreak 2004 for the MSU contest.  Perhaps we'll win something.

==May 29, 2004==

There's a known issue in UT2004 which prevents anybody who ever selected a third-party gametype in the server browser from joining any other game of a different gametype.

This happens since, when a gametype is selected, its [[Legacy:GameInfo|GameInfo]] class is loaded and its static FillPlayInfo function is called.  After adding its settings to the [[Legacy:PlayInfo|PlayInfo]] object, the GameInfo class remains loaded in memory (probably because it's somehow still referenced by the PlayInfo object and thus cannot be garbage-collected), and when the player tries joining a server running a different gametype, that'll fail because the third-party gametype's package is still loaded.

I haven't been able yet to find out ''why'' exactly FillPlayInfo is called at this point by the server browser and which part of the code does anything with the data saved in the PlayInfo object referenced by the &lt;code&gt;FilterInfo&lt;/code&gt; variable.  However, simply avoiding to actually add anything to the PlayInfo object seems to solve the problem without any noticable side effect, so the following chunk of code makes everything work as it should:

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local UT2K4ServerBrowser UT2K4ServerBrowser;

  // check whether we are called from a server browser
  foreach Default.Class.AllObjects(Class'UT2K4ServerBrowser', UT2K4ServerBrowser)
    if (UT2K4ServerBrowser.FilterInfo == PlayInfo)
      return;  // ignore because called from server browser

  // now do the usual stuff
  Super.FillPlayInfo(PlayInfo);

  PlayInfo.AddSetting(Default.GameGroup, ...);
  PlayInfo.AddSetting(Default.GameGroup, ...);
}
&lt;/uscript&gt;

==May 31, 2004==

While fixing some netcode I found out that in one of my classes a certain variable was constantly, over and over again, replicated to all clients &amp;ndash; several times per second; that class had &lt;code&gt;bNetNotify&lt;/code&gt; activated, and PostNetReceive was called every other tick.

What baffled me was that this variable wasn't even changed server-side; nor did it change on client side.

It took me a while to find out what was happening:  This variable which was replicated over and over again was a [[Legacy:Pawn|Pawn]] reference.  As soon as the Pawn it pointed to was destroyed, the variable was duly set to &lt;code&gt;None&lt;/code&gt; on both server and client &amp;ndash; but the server kept replicating its value to the clients.  And at the end of the day, the follwing slightly weird piece of code fixed it all:

&lt;uscript&gt;
// fixes replicating over and over when referenced actor has been destroyed
if (PawnObjectiveGuessed == None)
  PawnObjectiveGuessed = None;
&lt;/uscript&gt;

The Unreal engine is full of mysteries...

===Comments===

'''Mysterial:''' That works because UnrealScript returns &lt;code&gt;None&lt;/code&gt; when accessing a property pointing to an [[Legacy:Actor|Actor]] with bDeleteMe == true. Internally, the [[Legacy:Actor|Actor]] is in fact still referenced by that property until the [[Legacy:Actor|Actor]] is truly deleted. It getting continually replicated might be a bug in the engine. Can you try to create a small reproduction case and send it to me?

'''Mychaeel:''' Will do.  :-)

'''Mychaeel:''' Hrmph... making a simple test case is not as straightforward as I thought.  Then again, if it was an obvious bug, it probably wouldn't be in there...  ;-)

==May 31, 2004==

Argh!  People report server crashes, and every single crash log has the following lines at its end:

&lt;pre&gt;
  Critical: UObject::ProcessEvent
  Critical: (JBCameraArena JB-Heights.JBCameraArena, Function Jailbreak.JBCameraArena.Tick)
  Critical: AActor::Tick
  Critical: TickAllActors
  Critical: ULevel::Tick
  Critical: (NetMode=1)
  Critical: TickLevel
  Critical: UGameEngine::Tick
  Critical: Level Abandoned Heights
  Critical: UpdateWorld
  Critical: UServerCommandlet::Main
  Exit: Executing UObject::StaticShutdownAfterError
  Exit: Exiting.&lt;/pre&gt;

That Tick event in question doesn't do anything special that I'd be aware of &amp;ndash; it certainly doesn't destroy the actor or anything like that.  And I cannot reproduce it at all in a local client/server testing environment, and it only happens infrequently on other servers anyway.

There may be one thing:  The Tick event calls a function within an [[Legacy:Editinline|editinline]] object (which was created along with the JBCamera actor as a [[Legacy:Subobject|subobject]]).  Perhaps, when JBCameraArena.Destroy() is called, that subobject reference somehow becomes invalid and crash-prone under certain circumstances?

: '''Update:'''  I just found out that all my JBCameraArena actors '''share the same subobject''' &amp;ndash; unlike what I expected, seeing that spawning [[Legacy:Emitter|Emitter]] subclasses creates ''distinct'' instances of their [[Legacy:ParticleEmitter|ParticleEmitter]] subobjects.  While I'm not sure whether that's responsible for the crashes, it's definitely not what I had in mind and it's a bug when more than one JBCameraArena is active at the same time.

To make it worse, those error messages don't really indicate what ''kind'' of error happened (the lines preceding them are different and nothing out of the usual in every case &amp;ndash; such as players joining or leaving; unfortunately I have no indication whether there's a temporal relationship between the events logged before the error and the error, but I believe there's not).

Is there anyone out there with Unreal-engine insight who might be able to tell me which kinds of errors would trigger those server log messages?

==June 2, 2004==

Phew.  The Jailbreak server crashes are '''fixed''' (and stress-tested successfully on MyUnreal's ever-full server), and so are the &quot;web admin does not come up again after level change&quot; and &quot;server does not react to UDP requests after a while&quot; bugs.  Those were the toughest ones to crack, mostly because I was fixing in the dark; the others were, while partly annoying, peanuts.

In retrospect it seems that the latter two bugs stemmed from the engine not fully cleaning up the previous level; and that, in turn, was apparently due to my storing some actor references in the ''class default'' values of a class &amp;ndash; I did that only to compare the stored references to given ones for caching a function's return value over subsequent calls.  Even if the actors were destroyed between two calls, I'd expect a comparison simply to fail.

After I worked around that problem (by storing the actors' locations in the cache &amp;ndash; in this case that worked just as well), suddenly those both bugs (web server not coming up again, UdpGameSpyQuery failing to bind its port after a while) were gone all by themselves.  So, note for the future:  '''Never store actor references in default properties!'''

===Comments===

'''Foxpaw:''' That's interesting. I've stored actor references in default properties lots. (For instance, any actor can get a reference to the level's backdrop in my case by accessing class'Base.Backdrop'.default.Reference. Perhaps this behaviour is limited to certain classes?

'''Mychaeel:''' Perhaps, but I don't think so.  The effect of doing that is hardly noticable in local testing conditions, in any case (otherwise I'd have seen it a lot earlier) &amp;ndash; as I wrote, the most noticable effect was that the web admin [[Legacy:WebServer|WebServer]] didn't get cleaned up on level change and that &amp;ndash; after many level changes &amp;ndash; a server just didn't respond to UDP requests anymore.  Otherwise, everything worked great.

'''Mysterial:''' Since classes are non-Actor objects, the usual issues with storing [[Legacy:Actor|Actor]] references in them apply. I'm somewhat surprised it didn't crash. Perhaps because the engine doesn't actually destroy the class objects as it would most other objects you'd store references in, since you're playing another Jailbreak game so it wouldn't ever unload the resources.

'''Mychaeel:''' Frankly, I wasn't ever aware of &quot;the usual issues&quot; with storing Actor references in non-Actor objects &amp;ndash; Jailbreak code still does that on several occasions ([[Legacy:LevelInfo|LevelInfo]] and [[Legacy:TeamInfo|TeamInfo]] references in the non-Actor objects which represent the small player icons on the HUD, and in at least one other place too).  Are you saying that referencing an Actor from a non-Actor object is always crash-prone and not supported by the engine?

'''Mysterial:''' [[Legacy:Actor|Actor]] references in non-Actor subclasses don't get automatically cleaned up by the engine, so they work just like C++ pointers in that accessing them after they've been deleted has horrible, unpredictable effects (generally crashing). Additionally, since part of garbage collection is traversing every object reference property that exists, you need to clean up any such references before a level change or you'll either get frequent serialization crashes or prevent the previous level from unloading, creating huge memory leaks, as you unfortunately found out.

==June 8, 2004==

With the stress of releasing Jailbreak over, I'm free to look into some of my old mutator ideas again.  One of them is '''SprayPaint''' &amp;ndash; a simple idea actually, borrowed from Half Life where the ability to spray-paint your clan logo on walls was built-in functionality.  I want to port that idea to UT2004.

This would be pretty straight-forward and quite uninteresting if I hadn't put it into my mind that it should be possible to customize the spray-painted images by simply dropping a BMP file (1-bit, 64x64 pixels) into a directory; and, if that's done by a client in a network game, all other clients should be able to see the same image too.  The latter is just some replication acrobatics; the former is where I saw my challenge.

Reading arbitrary files in UnrealScript isn't really supported, but if you need to do it for text files, instantiating a [[Legacy:WebResponse|WebResponse]] object and using its LoadParsedUHTM function works quite well.  However, UnrealScript strings aren't binary safe &amp;ndash; null bytes act as end-of-string tokens and thus cannot be included in a string.  Attempting to load a binary file such as a BMP image with LoadParsedUHTM results in a byte string truncated at the first null byte.

I've worked around that problem now by spawning a local [[Legacy:WebServer|WebServer]] listening on a random free port, delivering files as &quot;application/octet-stream&quot; with WebResponse's function IncludeBinaryFile, and a [[Legacy:TcpLink|TcpLink]] operating in MODE_Binary to receive the binary data from the local web server.  In theory this setup is able to read the contents of any binary file within the UT2004 directory hierarchy into an UnrealScript byte array, and it's working great for my purposes.

===Comments===

'''EntropicLqd:''' Can you see outside of the UT2004 directory structure with that technique?  Cunning solution btw

'''Mychaeel:''' Frighteningly enough, I can read ''any'' file that way.  (I had actually &amp;ndash; and perhaps naively &amp;ndash; assumed that the IncludePath in WebResponse would not allow UnrealScript code to travel beyond the UT2004 base directory...) &amp;ndash; Perhaps it'd be best to let Epic know about this and to remove this last &quot;Developer Journal&quot; entry for the time being...

'''EntropicLqd:''' I'd definitely let Epic know about it (I guess you have already).  Allowing access above the 2K4 root directory is an astonishing lapse on Epics part.  I was expecting a ''ho ho ho ofcourse not'' response.  Wonder if you could write a remote file browser...

'''Mychaeel:''' Without having a way to generically get full directory listings, I'm afraid (or rather, glad) that's not possible &amp;ndash; [[Legacy:StreamInterface|StreamInterface]] only provides a way to list directories (and a limited set of other file types, though I haven't been able to get that to work for anything except said directories and .mp3 files).

'''Mychaeel:''' The LoadParsedUHTM method works on any file on a given partition too, given the right IncludePath setting (e.g. &quot;C:/&quot;) in a subclass and without all the local web server hassle.

'''Mychaeel:''' I've sent a mail to Joe Wilcox.

==July 12, 2004==

Jailbreak 2004 is one of the gametype finalists in the MSU contest.  That's nice and I hope we'll win something too, but I find it more notable that Jailbreak got a honorable mention in the &quot;FPS Mod&quot; category.  I didn't check that box when I entered Jailbreak 2004 into the contest; it must have been the judges' decision to put it there too...

In completely unrelated news, I've been turning some of my spare attention to attempting to write a couple of extensions for Thunderbird to make my life easier (on the long run; you know, that &quot;impatience, hubris&quot; part that occasionally pops up in a Larry Wall quote at the bottom of an Unreal Wiki page).  Phew.  If you ever thought that UnrealScript was a humongous, complex and for the most part poorly documented heap of code already, do look at http://lxr.mozilla.org for an upgrade.

===Comments===

'''Tarquin:''' I don't know about you, but I am finding the Jailbreak community very quiet these days. I'm sure there was way more activity (posts, maps, discussion) in the days of JBIII. But I suppose that was the 3rd release and we are only on the first. BTW, if you have some spare time, do you think you could look at the Wookee class tree generator? It would be nice if the text of the tree was parsed for wiki links, so we could use it for Unreal classes here &amp;ndash; but I'm afraid I've not been able to work out how to do it. It's WookeeTree.pm in your CVS. :) 

==July 14, 2004==

My support for Opera 6 has finally broken down after the last vBulletin 3 update which made &lt;code&gt;[code]&lt;/code&gt; tags unreadable, and I've made the switch to Firefox.  I'm loving it already.

It has gone quite a long way since the last time I gave it a try (must have been around version 0.6), and most of the reasons I didn't want to switch to it then have gone meanwhile.  I'm especially fond of the ability to selectively skin websites with custom CSS (using the &quot;uriid&quot; extension and a specially crafted userContent.css), and I just ''have'' to love a program which allows me to tweak its user interface appearance by editing a CSS file...

In completely unrelated news, Fraunhofer IGD (whom I had sent an unsolicited application about three months ago and never heard back of) has offered me a job... working on a project in Seoul, South Korea.  Imagine my surprise.  I might even have considered it if I hadn't found another job in the meantime already ''and'' if I didn't specifically want to move closer to my girlfriend in the Frankfurt area.  Still, quite interesting...

(Is this developer journal turning into a blog...?)

===Comments===

'''Tarquin:''' Bwahahahaha! I knew we'd convert you in the end.... :P

'''MythOpus:''' Consider this a reminder from the entire wiki to update the Wookee download zip ;)

==August 20, 2004==

When you think you're finally out of bugs, Atari QA will come and send you a new bunch of them.  :-p

No, actually, it's not that bad.  It boils down to one actual code bug and a bunch of map-related things in the order of &quot;graphic seams flicker in and out around the pipelines.&quot;  Still, I was surprised when I got that mail...

===Comments===

'''GRAF1K:''' Why would Atari be interested in sending you bug reports?

'''Wormbo:''' One code bug and one code thing I wouldn't call a bug. (no weapon in celebration screen)&lt;br /&gt;They most likely sent the reports because they tested Jailbreak 2004. ;)

'''Mychaeel:''' ...and they tested Jailbreak 2004 because they want to include it in the Editor's Choice Edition.  Sorry, I kinda implied this.  ;-)

'''Guest:''' I figured ECE was the reason but wasn't sure. Congrats then. :D

==September 5, 2004==

Picking up my old SprayPaint mutator idea again.  To reiterate, it's about being able to spray logos on walls &amp;ndash; the logos must be provided as monochrome bitmaps (i.e. bitmaps with 1-bit color depth) in a certain UT2004 subdirectory, and you can spray them on walls in a color of your choice; and the best thing is that other players on the server would see the exact same thing even though they don't have the source bitmap on their system.  On the long run I even want the sprayed images to persist across matches.

There's a bit of replication acrobatics involved in making that work, but so far it works nicely &amp;ndash; the data is loaded client-side, transmitted to the server via a replicated function in &quot;bunches&quot; of no more than 64 bytes a tick, and then left to the engine to be replicated back to all (non-bNetOwner) clients.

Two things I noticed doing that were that, firstly, the engine only replicates the first 256 bytes of an array of 512 byte values (where I don't know exactly whether it's the number of elements or their total size which is limited by the engine); and secondly, that passing a byte array via a replicated function call will only actually replicate the first value of that array, not the entire array.  However, if the array is part of a struct which is passed through the replicated function, everything works fine (hence my &quot;bunches&quot; of data).

The user interface for that thing is keeping me thinking.  Right now I figure that pressing your usual &quot;talk&quot; key (&quot;T&quot;, for instance) quickly twice in a row (like a double-click) would pop up a window where you could select which image to spray (using the mouse or arrow/movement keys), but that idea is subject to change.  For now, the &quot;mutate SprayImage &lt;filename&gt; &lt;color&gt;&quot; console command does the trick.

==November 17, 2004==

I've moved into my new apartment last Sunday, and today I got ISDN and DSL activated.  Thus, JDN is up again &amp;ndash; whatever caused my computer to break down two weeks ago is mysterious to me.  Maybe my video card overheated after all after having been running non-stop for months without a monitor attached to it... still, not really a satisfactory explanation.

Now that my home computer has been hosting CVS, an Apache webserver with JDN and other services and an ISDN calling machine and fax server for quite a while and across several hardware updates, I've been thinking &amp;ndash; it's getting harder and harder to keep the noise level coming from this machine at a level I'm willing to bear in my living room.  Plus, most of the time the computer is merely converting electric power into noise and heat via a video card and processor which are ridiculously overpowered for something acting as a web/fax/CVS server most of the time.

...so &amp;ndash; *drumroll* &amp;ndash; I've got that fabulous idea of building a small machine out of spare parts mostly left over from hardware upgrades of my main PC over the years.  I've got two mainboards/processors to choose from (a Pentium 200 MHz and an Athlon 800 MHz which I could underclock to 500 MHz), some left-over RAM, an ethernet card (my latest mainboard had that on-board) and a simple video card (an ATI XPert@Work sporting a 3D chipset with the staggering amount of 8 MB VRAM).  I also have a midi-tower computer case somewhere.  What I need is a silent power supply and &amp;ndash; probably &amp;ndash; a new harddisk (especially if this thing is to act as a file server as well) unless I find a suitable one in my pile of used hardware.

I figure I'll install Debian Linux on it &amp;ndash; with that awesome 3 MBit/s downstream I've got I can even download it without much hassle.

'''Update:'''  Wow.  Silent 80 GB harddisks come for less than 60 EUR these days?  o_O

==March 8, 2005==

&lt;nowiki&gt;*blows dust off this page*&lt;/nowiki&gt;

&lt;nowiki&gt;*cough*&lt;/nowiki&gt; &lt;br /&gt;&lt;nowiki&gt;*cough*&lt;/nowiki&gt;

Remember the Palpable mutator for Unreal Tournament?  Probably not, because I never actually released it, and the BuF mess-up two years ago ate all remaining evidence for it.

Basically, it allowed the user to see stereo 3D by displaying two versions of the current scene rendered from slightly different points of view.  You had to squint to see the effect, just like for [http://www.brossco.fi/janne/eclipse99/budapest/bu_3d.html these photos].

I tried to implement the same thing for UT2004 on Sunday.  To the degree that two viewports were rendered on the screen next to each other, it was a piece of cake; but, having the HUD render within one of those viewports prove to be impossible.  In Unreal Tournament, it was basically just a matter of setting [[Legacy:Canvas|Canvas]].OrgX/OrgY and ClipX/ClipY right &amp;ndash; but UT2004's HUD makes heavy use of the native DrawSpriteWidget function which, while honoring OrgX/OrgY and ClipX/ClipY, doesn't take the reduced size of a viewport defined through those properties into account when positioning and scaling the widgets.

So, no way.  Well, it was just an experiment anyway.  The 3D effect itself is pretty cool, though, even if it strains the eyes to squint that way for an extended period of time...

In other news, after a period of consideration, I bought a digital piano today &amp;ndash; a [http://www.rolandus.com/products/ck_details.asp?CatID=11&amp;SubCatID=45&amp;ProdID=HP-101 Roland HP-101].  I played the piano for years before leaving my parents' home to go to university, and I want to pick this hobby up again.  And, wow, those digital pianos nowadays really do sound and feel like the real thing &amp;ndash; down to subtle details like the slight resonance you hear after releasing a key, or that the keys for the deep tones react with slightly more resistance to being pressed down than the high-pitched keys...

===Comments===

'''Birelli:''' I remember Palpable, I think a couple of us on IRC tested it for you one time. It's definitely a cool effect, but it gave me a headache after about 15 minutes of playing. Probably not something people want to use all the time. Also it takes a bit of practice before you can train your mind into not forcing one eye dominant over the other, so at first it's basically impossible to run in a straight line.

==April 19, 2005==

Those who have followed [http://www.planetjailbreak.com/?news=275 PlanetJailbreak news] are aware of what I've been working on recently: the visuals of freezing and shattering a player model.  Part of the problem is to overlay the player model and the weapon it holds with an &quot;ice&quot; texture that gradually fades in.

My first idea was creating a [[Legacy:Shader|Shader]], setting its &lt;code&gt;Diffuse&lt;/code&gt; material to the player's skin texture, the &lt;code&gt;Specular&lt;/code&gt; material to my alpha-blended &quot;ice&quot; texture and use a [[Legacy:ConstantColor|ConstantColor]] as its &lt;code&gt;SpecularityMask&lt;/code&gt; material to control the fading.  That works fine for the player model, but utterly fails for the weapon &amp;ndash; the weapon's textures are implicitly defined through the mesh, and there's no way UnrealScript code can get hold of them (not even anything similar to [[Legacy:Dynamicly Accessing Original Static Mesh Textures|this method]]).

So, that approach fell somewhat short of what I had envisioned.

But there's &lt;code&gt;OverlayMaterial&lt;/code&gt; defined in [[Legacy:Actor|Actor]], along with a &lt;code&gt;SetOverlayMaterial&lt;/code&gt; method, which is used (among others) by the UDamage to produce that &quot;energy&quot; overlay effect on players and weapons.  I had previously found out already that using a plain texture as &lt;code&gt;OverlayMaterial&lt;/code&gt; will simply replace the model's skin by that texture (instead of overlaying it) &amp;ndash; not what I intended, so I had put that approach aside.  Now, I picked it up again.

After some lucky experimentation, I found that I was able to use a [[Legacy:Shader|Shader]] as an &lt;code&gt;OverlayMaterial&lt;/code&gt; whose &lt;code&gt;Specular&lt;/code&gt; material was set to my &quot;ice&quot; texture.  Funnily, I noted that:

* The &lt;code&gt;Diffuse&lt;/code&gt; material I tried to set was automatically overwritten with a reference to the overlaid actor's skin (the skin part with the highest ordinal number in the meshmap, I guess).  So, here's a way to find the original skins of a non-static mesh if you need to.

* The &lt;code&gt;A&lt;/code&gt; (alpha) member of the &lt;code&gt;Color&lt;/code&gt; property of a [[Legacy:ConstantColor|ConstantColor]] material I tried to use as the shader's &lt;code&gt;SpecularityMask&lt;/code&gt; was immediately reset to zero whenever I attempted to set it to something different.  Why would the engine do such a thing...?

So, that didn't work the way I had it intended to.  Neither did any attempts to replace the plain &quot;ice&quot; texture in the &lt;code&gt;Specular&lt;/code&gt; slot by a [[Legacy:Modifier|Modifier]] of any kind.

Then, in a last futile attempt, I tried using a [[Legacy:FadeColor|FadeColor]] in the &lt;code&gt;SpecularityMask&lt;/code&gt; slot (instead of a [[Legacy:ConstantColor|ConstantColor]] as before), and lo!, when I set its &lt;code&gt;FadePeriod&lt;/code&gt; to something other than the default, zero, it worked!  Well, of course I had a pulsing overlay now, but setting both &lt;code&gt;Color1&lt;/code&gt; and &lt;code&gt;Color2&lt;/code&gt; to the same color fixed that.

So, now I've got a texture overlay on both player and weapon which I can smoothly fade in (and out, if there was any need) and which still lets the original textures shine through.

===Comments===

'''Wormbo:''' Interesting hack. :) The engine uses the ConstantColor in the SpecularityMask slot to fade out the overlay effect when the actor's overlay timer drops below 1 or so.

==May 1, 2005==

Microsoft has a pretty good reputation on IDEs, but ''Microsoft eMbedded Visual C++'' really has at least one major quirk which makes working with it a pain unless you either know how to avoid it or unwittingly got around it by failing to customize your workspace too much.  I didn't fall into the second group, and it took me until today to become part of the first.

I'm developing a small smartphone application to remote-control MP3 playback on the Linux server which sits quietly in my closet via Bluetooth.

The ''Smartphone 2003 SDK'' comes with a smartphone emulator.  That's very nice, but it becomes pretty frustrating once it stops working &amp;ndash; which, for me, happened basically whenever I started the IDE for the second time after installing it:  Whenever I wanted to run my program, I got an error dialog telling me one of the following things:

{{innerbox| Cannot find a default device. Please create one or more from the Platform Manager.

}}

&lt;nowiki&gt;&lt;/nowiki&gt;

{{innerbox| There is no device installed. Please go to Configure Platform Manager to add a device.

}}

Obviously there were still the same devices as the last time, and I certainly hadn't changed configurations since last successfully running the program in the emulator.  So, almost each time I wanted to work on my project, I had to uninstall the entire IDE and reinstall all of it &amp;ndash; two installers, one of them badly made, and a service pack; half an hour work just to get the IDE to work again.  Needless to say, I didn't do that very often.

Of course, I googled for a solution.  Nothing to find except for two postings from people with the same problem without any replies to them.  At least I wasn't alone; little consolation there, though.

Today, I got that second error message from above for the first time, and that was my luck.  Googling for ''that'' finally led me to a newsgroup message with the solution:  If you disable the WCE Configuration toolbar, the (unlabeled) &quot;default device&quot; drop-down box (the rightmost one) '''will automatically revert to &quot;Smartphone 2003 Device.&quot;'''  Set it back to &quot;Smartphone 2003 Emulator&quot; and everything works again.  There's no menu command for that option.

&quot;Son of a gun!&quot;, to say it in the original newsgroup poster's words.  What an unnecessary annoyance.

==November 3, 2005==

Today at around 11:15 AM, I successfully completed my twenty-ninth year of life (for a suitable definition of &quot;successfully&quot; :-P), heading into the thirtieth without hesitation. Happy birthday to me ;-)

===Comments===

'''El Muerte:''' damn you're old ;)

'''EntropicLqd:''' Happy birthday youngster (for a given value of young).  Give it another few years and you'll feel like you are falling apart :)

'''Sweavo:''' phew it's not just me then Entropic :-)

'''Tarquin:''' Happy birthday Mych! The big 30 next year ;) It's not as awful as it sounds :)

'''Mychaeel:''' Hehe, thanks y'all :-)

'''MythOpus:''' I saw it awhile ago, but I was always on my dads Linux computer so I haven't been able to... WISH YOU A HAPPY BIRTHDAY!

'''Mychaeel:''' I'll take good wishes at any time, so: thank you as well :-D

'''Sweavo:''' in that case, have had a happy birthday :-)

==April 24, 2006==

Setting a data structure element of a replicated array element won't actually make the engine replicate that array element.  You'll have to set the ''whole'' array element to make the engine notice that it has changed:

&lt;uscript&gt;
function TouchElement(int iElement)
{
  local TElement ElementTemp;

  ElementTemp = Elements[iElement];
  Elements[iElement] = ElementTemp;  // prod!
}
&lt;/uscript&gt;

Has anybody else ever had that problem?

===Comments===

'''EricBlade:''' I haven't personally had a reason to make an array of structs yet, but it sounds like it could be related somehow to the problem of not being able to replicate -just- a struct, without some other var?

'''Wormbo:''' That seems to be a general problem of struct replication, not only structs as array elements. The code &lt;code&gt;Elements[iElement] = Elements[iElement]&lt;/code&gt; seems to be enough to cause replication though, whether anything actually changed or not.

'''Mychaeel:''' Yes, I also realized that the detour over a temporary local variable probably wasn't necessary at all &amp;ndash; I was still under the influence of the &lt;code&gt;SwapElements&lt;/code&gt; function which actually ''needed'' one.  I've occasionally replicated (individual instances of) structs without problems, though &amp;ndash; you only have to be aware that changing any struct element will cause the entire struct to be replicated.  (Actually, I've used that as a feature occasionally.)

==July 15, 2006==

I found the following function in [http://mychaeel.no-ip.com/source/Jailbreak/Jailbreak/Classes/JBTagPlayer.uc?rev=1.58&amp;view=auto some source code] I had written years ago:

&lt;uscript&gt;
// ============================================================================
// CalcOrientation
//
// Calculates and returns an artificial value representing the orientation of
// a vector. The returned value has the following properties:
//
//   * Non-zero for any non-zero vector. Zero for the zero vector.
//   * Negating the argument yields the negative result.
//
// Those properties allow to use this function to make any difference between
// two given points in space unambiguous by passing a single additional binary
// bit of information.
// ============================================================================

simulated function float CalcOrientation(vector VectorInput)
{
  local vector VectorTranslated;

  VectorTranslated.X = VectorInput dot vect(1, 1, 0);  if (VectorTranslated.X != 0.0) return VectorTranslated.X;
  VectorTranslated.Y = VectorInput dot vect(1,-1, 0);  if (VectorTranslated.Y != 0.0) return VectorTranslated.Y;
  VectorTranslated.Z = VectorInput dot vect(0, 0, 1);  if (VectorTranslated.Z != 0.0) return VectorTranslated.Z;

  return 0.0;
}
&lt;/uscript&gt;

It's part of Jailbreak's player movement extrapolation code which is designed to provide a smooth client-side representation of a player's position with as little network traffic as possible.  The extrapolated player position is used by the [http://mychaeel.no-ip.com/jailbreak/JBPanorama scoreboard minimap] and [http://mychaeel.no-ip.com/jailbreak/JBScreen JBScreen].

Well, what the ''heck'' was I thinking?

Obviously, instead of using a local vector variable, I could have used a simple float; the function calculates each component of the local vector, immediately uses it, and then never uses it again.  Plus, looking more closely at what's actually done there, it looks as if I could simply have used the original vector's components instead of (sloppily) translating it into a rotated coordinate system first.

It took me a while to get behind what I had thought several years ago.  I should comment more.

Using a local vector instead of a float was halfway between being an artifact of the way my mind had gone before arriving at this code and being self-documenting code.  (Sure enough the latter could have been achieved just as well with less bytecode overhead by just adding a comment.)

Translating the input vector into a coordinate system rotated 45° away from the main axes was done to make changes in the signum of the return value less common.  If there's any directional bias in a player's movement at all, it's usually along the main axes, following a hallway a mapper will generally have aligned along the coordinate system.  Strafing left and right even just a bit while moving along one of the coordinate axes (say, the Y axis), would change the signum of one of the other coordinate components (the X component) frequently.

If the axes are rotated 45° about the vertical (Z) axis, chances are better that you stay &quot;left&quot; or &quot;right&quot; of an axis while moving, leaving the signum of the return value of this function unchanged.  Any change in the signum needs to be replicated to all clients (as the signum of the scalar player velocity they use to extrapolate the player's position); so this coordinate rotation reduces the frequency of updates required to send to the clients.

Phew.

I remember experimenting with different replication and extrapolation mechanisms, using some of UT2003's more obscure logging parameters to get network traffic detail into UT2003.log.  This optimization actually ''did'' reduce the amount of updates sent across the network for this detail.  I never got around to actually measuring whether it made any relevant difference in the ''total'' amount of network traffic, though.  I suppose this could be just one of the cases where I indulged in premature optimization just for the fun of it.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40307</id>
      <timestamp>2009-12-03T13:52:25Z</timestamp>
      <contributor>
        <username>Epsix</username>
        <id>2063</id>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries, but feel free to add comments.''

}}

==December 14, 2002==

{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson]]''

}}

No effort is wasted if you've learned something from it.  (Though that doesn't mean that the same time couldn't have been spent more effectively.)

Occasionally I'm stuck in a dead end of my own design and can't seem to find my way out of it.  The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on.  So I linger a bit longer and cudgel my brains for some ''other'' way to reach my goal than backing up.

Deleting an evening's worth of good code requires an effort, but if it relieves me of a week's worth of trying not to scratch it, it's worth it.

===Comments===

'''Tarquin:'''  &quot;The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on. &quot; &amp;ndash; I do that all the time in mapping. I end up with multiple copies of the same area, each one trying a different solution...  What usually happens is I eventually work up the courage to start from scratch.

'''Mychaeel:''' That's exactly what happens to me too.  :-)  Realizing when it's better to scratch a few good ideas in favor of an entirely different approach (maybe even one with a slightly different outcome than what I originally figured) is a learning process.

==December 20, 2002==

Note to self:  Not assuming that other people's contributions to a testing environment are free of bugs can be a huge time saver.

==January 17, 2003==

Incidentally I dug out the code I scratched in the first entry on this page and used it for a related, but different purpose where it actually fits in.  (Good thing I never really delete something for good unless I'm ''absolutely'' sure it won't ever be of any use anymore.)

The code is part of Jailbreak's bot support and is supposed to let bots make an educated guess where an enemy player is currently located after the enemy gave his position away by triggering a release switch.  Naturally, if there's only a single relase switch, all that boils down to a single possible location.  Where it gets interesting is if there are ''multiple'' release switches and the bots actually have to ''guess'' which one the player triggered.

My code does that based on the last known location of a player (directly after a round starts, or after a spawn in freedom after winning an arena match, or after being released from jail), the walking distance (using the path network) to all of the release switches and the time that passed since the player's location was known last.  With that and a more or less arbitrarily chosen probability distribution for a player's distance from his starting point after a given amount of time (something based on half a Gaussian) bots take a random guess weighed by the respective probability of the enemy being at any of the possible switches.

==January 18, 2003==

Wrote about [[Legacy:A Bug'S Life|A Bug's Life]] hoping that it'll inspire our bug hunters to posting better bug reports than they occasionally did for Jailbreak III.

==January 23, 2003==

UT2003's speech menu redefines the terms &quot;non-extensible&quot; and &quot;hard-coded.&quot;  I'm sure there's a way into it though &amp;ndash; I just haven't worked it out yet.  (Subclassing [[Legacy:ExtendedConsole|ExtendedConsole]] is, hardly surprising, not an option.)

==January 24, 2003==

[[Image:Legacy_speechmenuhack-ordermenu.jpeg|left|]]

Apparently there ''is'' a way.  The &quot;Team tactics&quot; menu item here opens a submenu where you can select one of a set of tactics for your team.  (All other menu items open a list of players you can order.)

Getting it to display your own entries is the easy part, to be sure &amp;ndash; being notified when the player selects one of the entries requires some more code insight.  It is possible though, and I'm just about to implement it.

If this works out, I'll describe the hack in detail somewhere on the Wiki.

==January 25, 2003==

[[Image:Legacy_speechmenuhack-tacticsmenu.jpeg|right|]]

It works.  When you select one of the entries in the tactics menu displayed to the right, SetOrders in [[Legacy:TeamAI|TeamAI]] is notified and gets a chance to intercept the selection.  The default implementation of SetOrders puts the following message into the log:

  ScriptLog: Team New orders TacticsNormal JB-IronMan.xPlayer0

TacticsNormal is a label I assigned to that menu item; everything else in that message is from Epic's own code.  Any unwanted cosmetic side effects can be controlled by overwriting SetOrders with your own code.

There's relatively little code involved in the whole hack:  One piece of code that's executed in some actor's client-side Tick (I used Tick in our [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]] subclass, but it could be anywhere) that modifies the speech menu's behavior; and a piece of code that modifies some properties of [[Legacy:Bot|Bot]]s when they're spawned.  And, of course, the code in SetOrders in [[Legacy:TeamAI|TeamAI]] that does whatever you want your custom menu item to do.

Modifying the speech menu that way has its limitations, of course.  There are only very few &quot;slots&quot; left for custom notifications (exactly nine), and custom submenus like my &quot;Team Tactics&quot; menu are only possible for menu items in the &quot;Orders&quot; submenu.  Details to follow.

==February 3, 2003==

So little time, and so much to do... but I don't regret spending the last weekend skiing in Tyrol.  ;-)

[[Legacy:UMake|UMake]] should be updated and released in version 1.2.  [[Legacy:Spectate Bots|Spectate Botmatch]] has a host of new functionality to be implemented, despite Epic refitting a &quot;Spectate&quot; button in the Instant Action dialog with the last patch.  Deathball needs some small code tweaks on my part.  [[Legacy:Jailbreak|Jailbreak]] development must continue.  And in addition to that there's some Perl coding work I'll actually get paid for and whose deadline is approaching sometime in mid-February.

==February 10, 2003==

If you want to make ''absolutely sure'' that a certain thread in a forum remains undiscovered, stick it to the top and place the words &quot;Read this before posting&quot; in its subject.

==February 14, 2003==

Bots in jail (in Jailbreak) should idly walk around, occasionally lie down and sleep, and engage in hammer fights if there's an eligible opponent.

It seems to me that maybe the best way to achieve all this is creating several custom [[Legacy:ScriptedSequence|ScriptedSequence]] subclasses, one for &quot;walking around&quot; (to select roam destinations in jail only), one for &quot;lying down and sleeping&quot; and one for &quot;engage in jail fight (and stop when the opponent opts out)&quot;.  The latter two will probably require custom scripted ''actions'' too:  &quot;start sleeping,&quot; &quot;wait and occasionally snore&quot; and &quot;stand up&quot;; and whatever is required to make a bot attack an opponent with an arbitrary melee or non-melee weapon.

Sounds like I'll better release alpha 4 ''before'' tackling that...

==February 15, 2003==

UT2003 bots don't really support being animated by means of a [[Legacy:ScriptedSequence|ScriptedSequence]] &amp;ndash; even if you manage to make them play a certain animation, the [[Legacy:XPawn|xPawn]] reverts to an idling pose as soon as that animation has ended.  In addition, those idling animations are natively &quot;physics controlled.&quot;

What's possible though is temporarily resetting the ''names'' of the idling animations to refer to non-existent animations.  That's a pretty heavy-handed approach, but it works (and puts a bunch of warning messages into the log).

'''Update:'''  ZappyAd pointed me to the bPhysicsAnimUpdate flag in class [[Legacy:Pawn|Pawn]].  Setting it to False disables the native &quot;physics-controlled&quot; animations, and indeed, it works well.

==February 17, 2003==

Scratched sleeping bots.  Implemented bots that hammer-fight in jail with human players instead.  Much more fun and rewarding.

==February 24, 2003==

I figured out the hard way that even custom game types can't simply replace the game's [[Legacy:TeamInfo|TeamInfo]] actors by subclassing [[Legacy:XTeamRoster|xTeamRoster]].  One of our bug hunters reported that setting up a game with custom bots broke crucial parts of the gameplay, and a look into the log revealed that UT2003 didn't use Jailbreak's custom TeamInfo subclass as configured in the the game type's DefaultEnemyRosterClass variable but instances of [[Legacy:TeamBlueConfigured|TeamBlueConfigured]] and [[Legacy:TeamRedConfigured|TeamRedConfigured]] instead.

So, once more, I'm ending up ''attaching'' an actor of mine to a stock UT2003 actor instead of replacing the stock actor's class by my own.  Jailbreak did so with several other gameplay-relevant classes (not just TeamInfo) before already &amp;ndash; PlayerReplicationInfo, for one, instead of introducing a custom PlayerReplicationInfo subclass.

In Unreal Tournament &quot;attaching&quot; an actor to another actor was more or less limited to the possibility of setting the attached actor's owner to the actor it was attached to and then using the ChildActors iterator to retrieve the attached actor when requested.  (Or any variant of that, though those that come into my mind are all equally inefficient.)

In UT2003 however every actor can have its own inventory by means of the Inventory variable which is declared in class [[Legacy:Actor|Actor]].  Traveling an actor's inventory chain is fast and efficient compared to using an iterator, so I implemented a generic abstract superclass for info actors that are &quot;attached&quot; to another actor, including code that automatically sets up a linked list of all &quot;actor tag&quot; actors of the same class and a mechanism that, if so desired, communicates registration and unregistration of an &quot;actor tag&quot; to all clients even during its lifetime.

Well, anyway, the TeamInfo problem was quickly fixed thanks to that mechanism.

===Comments===

'''Wormbo:''' Actually the inventory chain was available to all actors in Unreal v205 already. (Yes, I really have that code here... :D)

'''Mychaeel:''' Hmm.  I don't, but I do have the Unreal Tournament sources and... behold, you're right.  Oh well.  :-)

==March 17, 2003==

When I was implementing a new feature yesterday I noticed that I had to change a remotely related part of the code in order to avoid some small lag in a visual effect &amp;ndash; no big deal, but something that deserved to be fixed.  So I opened the class responsible for the delay, found the place where I had not anticipated the need for some direct connection between two pieces of code in my original design, and added it.

Then I realized that this was the third or fourth time I had added a bit of code at that place to accommodate a new requirement that had popped up since I had initially designed that class.  Each time I had addressed a small particular problem, each time I had added a bit of code to fix it; and while each of those changes were small and simple, the whole code grew more complicated and less elegant with every change I applied to it.

Time to scratch that part of the code and rethink its design with all old ''and'' new requirements in mind.

Changing, fixing and tweaking code a small part at a time inevitably leads to bloated, unelegant, bug-prone constructions sooner or later.  That's commonly called [http://info.astrian.net/jargon/terms/f/feature_creep.html feature creep] &amp;ndash; and after a time any software suffering from it becomes so unmaintainable that adding, testing and debugging a new feature becomes almost as much work as rewriting everything from scratch.  It's a developer's nightmare.

So sometimes it really pays off to start redesigning parts of a program before feature creep sets in.  The difficult part is to realize that before it's too late; and even more so for people not directly involved in the development process who can't relate to the idea of elegant, straightforward and bug-resistant program design.  Coding for a mod whose development is being slowly ground to a halt by somebody in charge adding more and more features that were never part of the original design can be a pretty frustrating experience.

==May 4, 2003==

ElapsedTime and RemainingTime in [[Legacy:GameReplicationInfo|GameReplicationInfo]] aren't replicated all the time in [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] &amp;ndash; that's for saving bandwidth, I suppose, and that must be a good thing.

Bad thing is that it doesn't work too well.  The idea is that ElapsedTime and RemainingTime are replicated ''once'' when the whole GameReplicationInfo actor is initially replicated to the client, and then the client increases ElapsedTime and decreases RemainingTime once per second all by itself.  Sounds simple enough, but somehow the initial value replication doesn't seem to work &amp;ndash; and that's not just in Jailbreak, it's exactly the same in vanilla Deathmatch.  Consequently, the time display in the scoreboard is out of sync with the actual game time.

The programmer who thought that up at Digital Extremes or Epic must have anticipated some of those problems though, because it actually gets a bit more complicated than what I described above.  In addition to ElapsedTime and RemainingTime there's a variable called RemainingMinute that is replicated every time it is changed.  The Timer event in [[Legacy:DeathMatch|DeathMatch]] sets it to the current value of RemainingTime every full minute.  GameReplicationInfo in turn picks it up and copies the replicated value of RemainingMinute to the client's local RemainingTime, thus re-syncronizing RemainingTime with the game's actual time.

Since I'd like Jailbreak's spiffy game time clock in the scoreboard to show the right time at ''all'' times though I guess I'll have to look for a fix.

'''Update:'''  Two distinct problems there:  Firstly, the initially replicated value of RemainingMinute always resets RemainingTime to the last full minute on mid-game connect; secondly, there can be an almost arbitrary delay for precaching textures and other content between PostNetBeginPlay (when the values for ElapsedTime and RemainingTime have just been replicated) and the first call of Timer (where they're updated client-side).

==May 7, 2003==

...so in Jailbreak the client sends a replicated function call to the server which directly responds by sending another replicated function call back to the client along with the current server time.  The client calculates a time offset between itself and the server; and if it also takes the time into account it took the response function to be called on the client after the synchronization request had been issued, it's possible to synchronize client and server time to a precision of approximately a tenth of a second.

That happens once a client has finished loading and precaching the game.  [[Legacy:GameReplicationInfo|GameReplicationInfo]] only replicates the server time the match started, and determines ElapsedTime and RemainingTime based on the current client time and its offset to the server time.

===Comments===

'''Kuhal:''' I am interested in the replication behaviour you have discovered here.  It may lead to an explanation of some behaviour I am getting during a pause in a network game.  The client's countdown clock rapidly counts down the seconds that have passed while the match was paused.  While I am certain the remaining time on the server has indeed been paused, it seems that the client thinks it knows better and catches up.  The weird thing is that the game ends &quot;on time&quot; when the client ramaining time reaches 00:00.  Are there any more references to how these attributes work in UT?

==May 22, 2003==

&quot;All you can eat&quot; for 5 ? in the uni's cafeteria today.  Burp.

Jailbreak's [http://www.planetjailbreak.com/misc/jailbreak2003-scores-5.jpg?link scoreboard] displays a minimap showing the current locations of your teammates.  In network games that means that those positions have to be replicated to all clients.  That leads to jerky movement of the dots on the minimap because the locations are updated only every couple of frames, not every (client-side) frame.

That problem can be somewhat relieved by using the [[Legacy:Pawn|Pawn]]s' actual positions when they happen to be present on the respective client; but the other player positions still jerk.  Some sort of motion prediction or motion interpolation should be built in; and preferably in a way that does not multiply the bandwidth requirements of the whole separate location replication business &amp;ndash; my bandwidth conscience is striking already without that.  That rules out simply replicating the player's velocity along with their position.

Since the minimap is by design mini, the updates usually don't go beyond a movement of a couple of pixels each time; and it's more to show the players' rough current whereabouts anyway, not their precise locations.  Maybe an algorithm that &quot;learns&quot; about the frequency of the position updates and interpolates between the ''last two'' replicated known points (and beyond if the next update isn't received in time) might yield smooth and reasonably accurate results.

Unrelated to that I also wonder whether I should keep up the splines connecting the player names to their location dots on the minimap.  I'm starting to think that simply attaching a small tag with the player's name and possibly a health bar would be nicer.

==May 24, 2003==

The principle works, but the movement is still jerky.  Motion prediction doesn't work well because the time that passes between a replicated variable being set on server-side and its new value being received client-side varies wildly:  So even when the player is moving in a straight line at a constant velocity, the client-side predicted location has to be corrected with every update.

Now I'm pursuing a different idea &amp;ndash; adding the received location updates to a client-side list and trying to have the client interpolate along that list of locations, choosing its velocity independently as to keep up with the succession of new locations that are added to the list.

When the client-side interpolated location information reaches the last known location in the list and the player is not known to have stopped moving server-side, it extrapolates the player's movement using the last known direction and velocity.  That can even be used to save bandwidth:  The server only sends another update when it expects the client-side extrapolation to have deviated from the player's actual location too much.

==May 25, 2003==

To my mild surprise what I've implemented now works much better than I had dared to hope.

The server sends occasional location updates to all clients; and in addition to that, the absolute value of the player's movement velocity.  The ''direction'' of the player's movement is derived from the succession of location updates; as described in the previous entry it's impractical to derive the velocity as well from the location updates because time differences can't be relied upon when network replication is concerned.

Using the absolute value of the player's velocity instead of the velocity vector itself saves some bandwidth &amp;ndash; two thirds in the size of the replicated data item alone (vector consists of three floats, its absolute value of only one), and it's also much less likely to change (the absolute value remains the same even when the player changes his movement direction or strafes).

Still, with every location update there's bound to be a small deviation between the client-side extrapolated location and the updated absolute location sent by the server.  Client-side, that deviation is simply smoothed out on a short time scale &amp;ndash; that way the client-side motion simulation never suffers of any jerking motions, only small variations in movement speed which are virtually impossible to notice.

What I haven't implemented yet is the aforementioned optimization of location updates when a player keeps moving on a straight line for a while, thus making the client-side linear extrapolation sufficiently accurate even for longer periods between updates.  No actual player does that in a firefight, of course; but it's not all that unlikely to happen in general, especially given that without that optimization location updates would be sent with a frequency of about five times per second.

'''Update:'''  Reducing the number of location updates that way works fine as well.  When moving on a straight line several seconds may pass between two location updates while the client-side minimap location indicator still accurately shows the moving player's constantly changing location, smoothly picking up a later change in the player's movement direction.

==May 26, 2003==

Would it still be fun if there weren't always more problems awaiting a solution?

When reading my code again I realized that it wasn't at all robust against server-side updates that never reached a particular client.  While the mechanism doesn't rely on the time between two received updates anymore, it still assumes that the client gets to see every update the server sends &amp;ndash; and that may not necessarily be the case.  If the client misses one update, the client's idea of the player's movement direction will be completely off, especially since the server already sends only the minimum amount of updates that can be used to derive the direction.

So I have to make sure that the engine itself takes care that all clients always have a consistent set of information &amp;ndash; the engine must know that if a client misses one or several updates it is necessary to send the last ''two'' location updates to that client next time.  The easiest way to achieve that is by having two replicated location variables that are alternatingly set to the player's most current location &amp;ndash; the other one then contains the location one step earlier.

However, the problem isn't completely solved already by that.  Since those two variables (a two-element array, actually) are set alternatingly server-side (so that on each step only one of the values changes and has to be replicated), the client has no way to know which of the two replicated locations is the most current one &amp;ndash; and so it can only derive the axis on which the player is moving, but not whether the player is moving &quot;forward&quot; or &quot;backward&quot; on that axis.  The client needs one bit of extra information to resolve that ambiguity.

It's not as trivial as it may sound to derive a consistent notion of &quot;forward&quot; or &quot;backward&quot; for any given non-zero vector.  Simply trying to define &quot;forward&quot; and &quot;backward&quot; in respect to a certain fixed direction is ambiguous as soon as a vector is lying in the plane perpendicular to the chosen direction; so that won't work (or rather, it will, but only in ''almost'' all cases, which is unfortunately not enough &amp;ndash; Murphy knows).  So, the method I've chosen to define &quot;forward&quot; and &quot;backward&quot; takes the signum of the first vector component (X, Y, or Z, in that order) that is not zero &amp;ndash; that's guaranteed to be non-zero for any non-zero vector, and the resultant value changes its own sign when the vector does.

To sum it up, the client now has ''two'' replicated location values without knowing which one is the most current one; so it calculates the vector difference between those two and applies the notion of &quot;forward&quot; or &quot;backward&quot; on it (described above), checks it against the separately replicated bit of information sent by the server and changes the vector's sign if necessary.  And Bob's your uncle.  (See what Terry Pratchett does to one's vocabulary?)

But... wouldn't it have been much easier and just as effective if I had simply replicated an extra bit of information telling the client which of the two locations is the most current one, instead of laboriously introducing weird notions of &quot;forward&quot; and &quot;backward&quot; vectors? &amp;ndash; Easier it would be but not as effective.  That bit would have to be changed every single time the server does an update even if the player only made a slight correction in his movement direction; the method I've chosen only changes that bit when the player's movement direction changes from &quot;forward&quot; to &quot;backward&quot; (in the special absolute sense described above), so it only ''occasionally'' requires a change instead of ''always''.

'''Addendum:'''  I actually have it implemented by replicating that extra bit of orientation information as ''the velocity's signum'' &amp;ndash; in an attempt to save bandwidth when both velocity and orientation change at the same time (and it also wouldn't take any more bandwidth when the velocity alone changes).  Upon writing about it here it suddenly occurred to me that this maybe wasn't all that smart after all &amp;ndash; if ''only'' the orientation changes but the velocity doesn't, the engine still has to replicate an entire float value even though only a single bit changed.  Would it be more efficient to go the straightforward way and use a separately replicated bool variable?  I'll keep a close eye on which updates actually need to be sent by the server in a real-game situation and decide then...

(And that's also why writing in this &quot;developer journal&quot; is worth the effort even if nobody's actually reading it &amp;ndash; it makes me critically review what I've coded.  It's a one-person code audit, so to speak.)

==May 30, 2003==

So, at last, the scoreboard is feature-complete.  Phew.  I dread writing the log for the CVS commit and getting JDN up to date... but the sooner I start, the sooner I'll be finished.

Showing the Jailbreak scoreboard has a noticeable impact on framerate at the moment &amp;ndash; I haven't been able to spot a certain, single part of the code that's responsible for the majority of the framerate hit.  Disabling certain scoreboard elements one at the time shows that the clock takes as much performance as the dotted splines do, and the code that updates the scoreboard's state with the game's live information isn't far behind.  The performance hit seems to be evenly spread over most the code.

Especially something like the clock could benefit from some sort of graphics cache &amp;ndash; it changes only once per second, but has to be rendered every frame.  If I could draw the clock on a [[Legacy:ScriptedTexture|ScriptedTexture]] and then on the screen, and update the ScriptedTexture only once per second, that might save several milliseconds per frame... given that I'd manage to get alpha transparency to work on a ScriptedTexture; I wouldn't like the clock to be displayed on a rectangular black background, not even for performance's sake.

Maybe there is a way to use alpha transparency on a ScriptedTexture.  During my experiments around drawing a map screenshot on a ScriptedTexture for the scoreboard minimap I noticed that the ScriptedTexture's DrawPortal function did, somehow, alter the ScriptedTexture's alpha plane &amp;ndash; it seems that wherever DrawPortal renders a normal solid texture, the ScriptedTexture will be completely transparent, but where an alpha-masked texture is drawn on the ScriptedTexture by DrawPortal the ScriptedTexture adopts its alpha mask there.  It's all pretty strange.

I also remember that in Unreal Tournament a ScriptedTexture could have a &quot;background texture&quot; that was used to initialize the ScriptedTexture canvas every frame.  I haven't found a corresponding property in UT2003's ScriptedTexture class, but maybe it's reusing an inherited property for that purpose &amp;ndash; FallbackMaterial maybe?  Gotta try that when I'm home.

==May 31, 2003==

I've finally decided that the manual implementation docs I had put on JDN have outlived their purpose &amp;ndash; they originally were the detailed specifications for the code before UT2003 was released, but after the classes were actually created there's little point in still keeping the specs around and manually up-to-date.

I tried [[Legacy:UnCodeX|UnCodeX]]'s HTML export, and while it works fine, it's information overflow.  I think people interested in Jailbreak 2003 implementation details do better with syntax-highlighted source code alone &amp;ndash; I tried to document it well after all.

The Wiki script running JDN now supports an extra parameter for the &lt;tt&gt;&amp;lt;uscript&gt;&lt;/tt&gt; tag that directly takes the sources from the CVS repository and renders them on the page.  It looks pretty neat and saves me lots of time keeping the specs consistent with the code.  Maybe I'll later add a DHTML feature for &quot;collapsing&quot; function bodys to keep only the comment headers visible by default.

'''Update:'''  Oh, and FallbackMaterial as a [[ScriptedTexture]]'s background texture does not work.  Guess I'm out of luck.


==June 4, 2003==

I want to keep players from using their translocator to get out of jail the easy way, and I don't want them to be able to telefrag Bonus Pack monsters.

Unreal Tournament had a handy AllowTranslocation query function in [[DeathMatchPlus]] for that.  Whenever anybody, player or bot, tried to translocate, this function was called and had the opportunity to prevent the translocation attempt.

Unfortunately, there's nothing like that left in UT2003.  The only thing that remains is a function in [[SquadAI]] that's queried for whether a bot will try to translocate.  The code that prevents players from telefragging teammates is buried in the Translocate function in class [[TransRecall]] -- it's basically a hard-coded check whether two players' collision cylinders impinge.


The only ''possible'' way into this code is via the SameTeamAs function (class [[Controller]]) used there that in turn calls IsOnTeam (class [[GameInfo]]).  The game could pretend that monsters are on the same team as any player trying to telefrag them, but SameTeamAs is used by other parts of the game code as well, which makes (ab)using it to prevent monster telefrags not straightforward.

And it still leaves me with the question how to prevent players from translocating out of jail...

'''Update:'''  I've ended up with removing the translocator from jailed players' inventories.  It's not all that messy after all.

===Comments===

'''ZxAnPhOrIaN:''' Maybe make an actor or volume that kills the translocator beakon when you try to teleport out, killing the person.

'''ZedSquared''' (from a UT classic point of view, dunno if any of this is feasable in 2003) Have a spawnnotify that catches transloctargets and modifies their velocity to kick them back to the owner (or the middle of jail) if they're in the jail zone perhaps ... or maybe subclass translocator, give the modified one as default inv, and override the fire function to not work in jail ... probably duff ideas, just thinking aloud late at night :)

'''Mychaeel:''' I'd rather try not to replace the normal translocator to achieve the effect I'm looking for (plus, there's nothing like SpawnNotify in UT2003)... and I'd also like not to require mappers to put in special zones or volumes.  (Right now jails work with any volume or zone a mapper places -- [[match these tags|attaching]] them to a JBInfoJail actor makes them part of a jail.) -- I could simply take a player's translocator away when he enters jail and give it back when he leaves jail, but that seems a bit messy.

'''Foxpaw:''' I don't see the problem - can't you just disallow translocator use in jail like in Jailbreak for UT?

'''Wormbo:''' That's exactly the problem, there is no AllowTranslocation function like in UT which allows the gametype to prevent translocation or add various other effects like flagdrop etc.

'''Foxpaw:''' Well, in that case why not allow translocation in jail, and just have surfaces that make up the jail solid? That way the translocator beacon would not be able to be launched out of the prison so a player couldn't escape merely by translocating.

'''Mychaeel:''' That would be a mapper-based solution, but the past (Jailbreak III) has shown that even in jails that were meant to be airtight (and must have been in editor terms since there a jail was defined by a distinct zone) occasionally had collision &quot;gaps&quot; in them that allowed players to shoot or, possibly, throw a translocator target outside (JB-Raid).  Even if a jail really is airtight it may be possible to place the translocator target so that translocating to it will place the player outside jail (JB-Antipody).  Besides, some jails are meant to have open windows to the outside or escape routes that players should be able to walk, but not translocate through.


==June 6, 2003==

The Jailbreak core to-do list has become pretty short.  Maybe, maybe, in a few weeks...


==June 8, 2003==

BeyondUnreal's forum breakdown will leave Jailbreak's development forums completely empty when they're back up.  Most of the hundreds of postings in there I'd have liked to keep mainly to keep a history of Jailbreak 2003 development; but some of them were ongoing discussions and long-term documentation.

Unrelated to that, early this afternoon my personal computer at home broke down as well; that leaves the CVS server and Jailbreak Developer Network offline too.  Fortunately the data itself wasn't lost; just my computer won't work.  If I'm lucky it's only either the power supply or the mainboard.  The bad thing is that tomorrow is a holiday here, so I'll need to stick with this notebook as a temporary measure till I have a chance to buy replacement parts.

===Comments===

'''Tarquin:''' I'll do my best to remember what's been going on. [[Jailbreak rescue]]

'''Mychaeel:''' That's a great idea.

'''Tarquin:''' Maybe I shouldn't put code dev topics on a public wiki though. I can just scribble a text file, or on the JDN

'''Mychaeel:''' JDN is down along with my computer, I'm afraid.  Tahngarth has set up a temporary Core Dev forum at http://www.planetjailbreak.com/tempforum/ -- register there and meet Tahngarth or me in chat to get access.


==June 9, 2003==

After finishing some Perl coding work (which I'm actually getting paid for) I'll see that my computer is restored to working order or that I at least find out which component exactly needs to be replaced.

'''Update:'''  The computer boots up with an old PCI video card; but as soon as I replace it by a AGP video card (either my current GeForce 4400 Ti or an older GeForce 2 MX), I only get either a strange creaking sound from the PC speaker or nothing at all.  Only the fans work.

A friend of mine who's professionally dealing quite frequently with broken PCs suggests that it might be either the power supply that doesn't manage the AGP cards' load anymore, or the mainboard for some reason doesn't like AGP cards anymore.  Unfortunately I don't have a spare ATX power supply at hand, so I won't be able to test that theory until tomorrow at the earliest.

In case it's the mainboard I'll at least use the opportunity to upgrade my old Athlon 800 MHz to whatever it is you can currently still get in a regular computer hardware shop -- apparently it's hard to find anything slower than 2.0 GHz nowadays.


==June 10, 2003==

My computer is up and working again.  I was surprised that for not more than about 180 ? I got a new processor (Athlon XP 2000+) along with a mainboard, silent cooler and memory (512 MB).  I could even keep my previous 235 W power supply.  By accident the processor is currently underclocked to 1.25 GHz (its normal clock rate would be 1.67 GHz) -- I'm not even sure whether I can be bothered to open the case once more and set the jumpers correctly.

So far the system seems to be stable.  Time will tell.


==June 11, 2003==

Bots should simply try to avoid being killed when &quot;evasive&quot; team tactics are selected.  (Useful when a team has a narrow lead shortly before the time limit runs out.)

I got that to work reasonably well with relatively little effort, code-wise:  Set the bots' aggressiveness to a really low value to ensure they don't feel inclined to engage in fights; then overwrite PickRetreatDestination and make it react in a suitably cowardly manner if the bot is seeing an enemy.  Right now they simply pick the [[NavigationPoint]] among their current MoveTarget's [[ReachSpec]]s that's farthest away from the enemy, or the closest one that provides cover.  Effectively that makes bots run away from an approaching enemy and make turns in order to move out of the enemy's firing line.

While it's fun (for a while) to chase bots around in a test map, I've come across one or two situations where bots are effectively stuck and too easy a prey to approaching enemies.  First I'll have to have bots detect this; then I'll have to have them react to it suitably, for instance by either simply choosing another way out or by acting like a cornered beast and falling back to normal dogfighting tactics until they're either dead or the threat is gone.  (Tomorrow more -- I'm tired.)


==June 13, 2003==

I found one reproducible situation in which bots are stuck in a tight loop of pathnodes they visit:  A bot sees an enemy, turns to flee, runs into cover; arrived there it wonders what to do next and decides to go on an inventory hunt, which leads it back into the enemy's sight -- ad inf.

The bad thing is that bots (or rather the native function FindBestInventoryPath in [[Controller]]) are not smart enough to check whether they even have the chance to pick up the inventory when they've reached it -- otherwise they wouldn't even try to reach it more than once in a row, and my problem would be a non-issue.


==June 14, 2003==

A comment in [[Bot]] hints that Epic meant to add a function called FindPathAwayFrom at some time -- alas, they didn't yet.  That leaves me with either sticking to my simple escaping algorithm from above (and its flaws) or creating a path finding function myself, in UnrealScript.

I've started giving the latter a try.  The idea is to recursively search the path network for [[NavigationPoint]]s that provide cover from the enemy, starting at the bot's current MoveTarget.  Some first test runs seem to indicate that it works, and it seems to have negligible impact on the performance so far.  (The Clock/UnClock mechanism described on [[Code Optimization]] proves pretty useful for such profiling.)

'''Update:'''  If a bot doesn't find cover nearby and realizes that the enemy must have seen it (because it isn't looking the other way right now), the bot panics and reverts to normal attack mode until the enemy is dead or out of sight.  I've put all that into CheckSquadObjectives now, and it seems to work pretty well testing it with a single masterful bot.


== June 16, 2003==

Hmm.  Why on earth does the game rules tab maintain its settings in separate config variables instead of taking and storing them in the game type's own configuration?


== June 17, 2003==

Why does filling the mutator list box on the &quot;Mutators&quot; tab involve two other separate classes?  Why is reading a list of available mutators a native function?

=== Comments===
'''Wormbo:''' I guess it's supposed to speed up loading of mutator classes, but it's not really that much of a boost compared to the &quot;old&quot; GetNextInt(Desc) method because now the mutators' code packages have to be loaded in order to find the mutators' names, descriptions and groups.

'''Mychaeel:''' I wonder whether that native function (GetMutatorList in [[xUtil]]) does indeed load the mutator name to get the mutator name and description -- a comment says it does ''not'' fill in the MutClass element of the MutatorRecord structure, which would make little sense if the class is loaded anyway.  (Unless GetMutatorList was internally &quot;optimized&quot; only to look up the class's default properties without loading the class; but I'd be a bit sceptical as to the wisdom of ''that'' optimization.  But maybe it has to do with cheat protection validating all loaded code...?  Gah.) -- There's an UnrealScript function LoadClasses in [[xMutatorList]] that would load the mutator classes, but it doesn't seem to be actually used.

'''Wormbo:''' It's not the only questionable optimization. (Still remember &quot;&lt;code&gt;// FIXME THIS SUCKS&lt;/code&gt;&quot;?) [[GUIController]].GetWeaponList also is a native function and it definately loads and returns weapon classes. I can't see any real optimization over Unreal's or UT's code here.


== June 18, 2003==

I'd like to intercept when somebody is clicking on a checkbox -- not just the part with the check mark but its label.

It took a while until I figured out that the bAcceptsInput flag must be set to True for any of a [[GUIComponent]]'s delegates to be called.  (Mmph.)


== June 23, 2003==

The OnDraw delegate is called for custom [[GUIPanel]] subclasses but not for direct subclasses of its parent class, [[GUIMultiComponent]].  Does that have a deeper sense or did just somebody forget to add a call to the delegate in [[GUIMultiComponent]]'s native Draw implementation?

'''Update:'''  Is it just me or does setting the TextFont property in [[GUILabel]] (and, thus, the LabelFont property in [[GUIMenuOption]]) have no effect at all?  (Obsoleted by the introduction of [[GUIStyles]] maybe?)  All labels in the game seem to have the same font, even those where Epic's own UnrealScript code decrees otherwise by setting TextFont.


== June 28, 2003==

This one has me baffled (in a [[WebApplication]] subclass):

&lt;uscript&gt;
function QuerySomething(WebResponse WebResponse) {
  local string ResultTemplate;
  ResultTemplate = &quot;should be overwritten by the next statement&quot;;
  ResultTemplate = WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
  }
&lt;/uscript&gt;

Now I'd expect ResultTemplate to contain the result of parsing the file something.inc... right?  And so it does, but '''appended to the previous value of the variable.'''  The resultant value of ResultTemplate is something like this:

  should be overwritten by the next statementContents of something.inc

Is that an engine bug?  Some arcane feature?  How can using LoadParsedUHTM on the right side of an assignment change the way the assignment operator works (given that the return value of LoadParsedUHTM is a mere string)?

However, the following workaround solves the problem:

&lt;uscript&gt;
  ResultTemplate = &quot;&quot; $ WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
&lt;/uscript&gt;

Trying to cast the right side to string in an attempt to do the same ironically yields a &quot;No need to cast StrProperty to itself&quot; compiler error.

==July 3, 2003==

Working on an HTML parser and formatter in UnrealScript again.  This time it'll be standalone and not part of [[Legacy:Screen|Screen]], even though I intend to use it for that end as well; and this time it's possible to use it on both [[Legacy:ScriptedTexture|ScriptedTexture]]s and a regular [[Legacy:Canvas|Canvas]].

I hope I'll get around to implementing tables and floating images as well this time.  The base architecture I'm currently designing and coding takes the requirements for those features into account already, so it should be straightfoward to even follow W3C's specification of [http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 calculating the width of columns] according to the standard.

==July 5, 2003==

The native Split and Divide functions turn out to be extremely handy for the kind of text parsing I'm doing at the moment.  (But I still want my native regular expression support in UnrealScript... mmph.)

===Comments===

'''El Muerte TDS:''' Nah, regular expression suck for text parsing, they are only useful for match (and replace). Using a [[Legacy:Tokenizer|tokenizer]] is much better for text parsing. It would be better if the native tokenizer was available in uscript.

'''Mychaeel:''' I dare say that depends on how you'd use regular expressions.  The _nextToken function in your tokenizer could be formulated much more efficiently using regular expressions, for instance.  (Though I agree that the availability of regular expressions might lead some people to creating terribly inefficient parsers.)

For that matter, my prime concern about this HTML parser is its performance, so parsing through the input stream character by character in UnrealScript is something I'm determined to avoid.  (The first version of [[Legacy:Screen|Screen]]'s ScreenSlidePage HTML parser did that, and it was slow as hell for anything exceeding ''very'' few kilobytes of input text.)

==July 6, 2003==

The HTML parser works like a charm since yesterday and nicely dumps the structure of a parsed HTML file, though I haven't made any performance evaluations yet; but in any case there's even some potential for optimization still (like identifying a tag's handler class by something faster than the sequential search I've settled for until the rest works, like binary search &amp;ndash; did I mention that native hash support would be a great addition to UnrealScript too?).

===Comments===

'''El Muerte TDS:''' There is a type called map, but it's only native atm (just like dynamic array used to be).

==July 9, 2003==

As usual it's not the ''normal'' case that makes implementing something a challenge; it's the ''pathological'' cases that do.

The obvious step after implementing an HTML parser is creating a formatter for the parsed HTML element tree.  The old one I made for [[Legacy:Screen|Screen]] (one of my first UnrealScript projects altogether) has no concept of tables or floating boxes, but this time I'm determined to add support for those and so I have to deal with the conceptual odds and ends that come with it.

A floating box is actually a pretty straightforward concept:  It's a rectangle that's placed at the left or right edge of the containing box starting at the vertical position of the text line it's defined in.  That technique is most commonly used to have text flow around an image on a website.

Normally, a web designer adds floating elements at the very start of a paragraph so the boxes are placed already when the formatter starts wrapping lines between them.

The beginning of a paragraph is, however, not the only valid place for floating boxes:  They can just as well be defined in the middle of a line, and that's where the trouble starts.  As long as the current line is short enough to fit next to the box, everything is still fine; just add the floating box and shorten the line box accordingly.

But what if the floating box is too wide to fit next to the text line where it's defined in?  The HTML standards document says that the box is then to start directly ''below'' the line it is defined in; that's simple enough to implement... but subsequent text after the definition of the floating box is still to be added to the very same line ''above'' the box, and according to Murphy's law somebody is bound to have some item in that line after the floating box definition that increases its line height.  That means, basically, that the absolute position of the floating box may not be completely determined at the time it is added.  Consequently, it may be necessary to shift the box down ''after'' it has been rendered.

==July 14, 2003==

I just realized that I failed to enter [[Legacy:UMake|UMake]] for the contest.  Ah well &amp;ndash; it sorely needs an update anyway given the huge list of pending fixes and improvements, and there's a lot of time till the deadline of phase two.

It's a bit of a pity that [[Legacy:MeshMaker|MeshMaker]] isn't eligible.  It might have had a chance to win something.

===Comments===

'''Haral:''' FYI, the deadline for the contest is tomorrow.  You can still enter, I do think.

'''Mychaeel:''' It is?  Well &amp;ndash; hardly enough time to give it the overhaul it deserves unless I was ''really'' desperate to enter it in phase one, but since there are two more phases to go, I think I'll just target phase two for now.  But thanks for the correction.  :-)

'''Haral:''' Those were my sentiments as well.  There's a lot of work to do on my mod, playable as it might be, before I'll feel it's ready for any sort of release.  Thanks for moving that comment btw, my brain doesn't exactly work well while I'm at work.  Anyway, time to get back at it, if I want to be ready by October.

==July 16, 2003==

Trying to read a binary file in UnrealScript.

The LoadParsedUHTM function in a freshly created [[Legacy:WebResponse|WebResponse]] object does well enough for text files, but I ran against a fundamental problem of UnrealScript's string data type here:  Obviously it's not as high-level as it should be in a language like UnrealScript and doesn't handle embedded null bytes (&lt;code&gt;Chr(0)&lt;/code&gt;) well.  A null byte terminates a string for all UnrealScript-related intents and purposes; so the content of the binary file I read is clipped off after a few bytes when the first null byte appears.

The only solution for that I can currently think of is briefly opening a TCP link from the game to itself, serving the binary file using the IncludeBinaryFile function in WebResponse and receiving it with a simultaneously spawned [[Legacy:TCPLink|TCPLink]] in binary mode.  But that's not only quite cumbersome, there's also a chance that some people's personal firewalls might complain about it (even though it's nothing but a local intra-process connection)...

===Comments===

'''Wormbo:''' AFAIK Quake 3 only works like this, even a single player game connects to a local game server, and when playing a skirmish game with open slots other players could join it, expanding it to a network game.

'''Nytro:''' I ''think'' this now constitutes more than &quot;short thoughts that popped up during Jailbreak development.&quot; o_O

'''Mychaeel:''' You're right.  I've scratched the &quot;short&quot; part in the description.

'''Nytrogen:''' I hate to continue to bother you... I don't own UT, and I can't find a decent description of [[Legacy:Screen|Screen]]. Would you mind giving me a link or quick 'Screen overview' blurb?

'''Wormbo:''' You just linked to it. There are links to the Screen website and forum. You should find any information you need there.

'''Birelli:''' Specifically the &quot;about&quot; page: http://www.planetunreal.com/screen/about.html on the Screen website.

==October 1, 2003==

This morning I officially handed in three copies of the physics diploma thesis I had been working on for the last year (and which had kept me off anything Unreal-related for the last two months).  For those interested, it's about ''Metal-Induced Crystallization of Silicon-Germanium Layers'' &amp;ndash; fundamental research for the next ('third') generation of solar cells which will be far more efficient and much cheaper to produce than what's currently on the market.

Well.  ''[takes a deep breath]''  This concludes more than half a decade of studies of mine at the Technische Universität München (I recently learned that they attach great importance to not being called &quot;Technical University Munich&quot; or something like that even on the cover sheet of English-language publications such as my thesis).  I guess it'll take a couple of days until I have really, deeply grasped the significance of this.  Right now, I'm mostly just relieved, happy, and tired.

One thing is sure, though:  I'm ready to get back into the Unreal community.  Even though I had been preoccupied by other things, I've really missed it.  :-)  It'll take me a few days to catch up, however, and there's also a lot more in my life which somewhat suffered during the last few weeks and which I have to catch up with, so be gentle.

===Comments===

'''Sobiwan:''' Solar cells: nice.  Enough of this fossil fuel baloney.  I hope your thesis helps push research and/or development further.  

'''Tarquin:''' Yay! Welcome back Mych. Good work saving the planet :)

'''El Muerte TDS:''' heh, it's not like this is the only planet we have ;) About the uni name, ofcourse they want it to be the german names, the english name is too easy to write, it doesn't have ä and ü. They want you to put effort in typing the name.

'''Mychaeel:''' Well, I got a German keyboard here, so effort is not an issue. &amp;ndash; The [http://www.wsi.tum.de/E25/research/theses.htm Walter Schottky Institute] where I worked, on the other hand, does not have any problems with officially allowing the English name ''Walter Schottky Institute for Fundamental Research in Semiconductor Electronics''. &amp;ndash; But then again, its name doesn't have any äs and üs in it, so your argument still holds.  ;-)

'''Tahngarth:''' Well I hope you get an A (or whatever the best grade is) :)

'''GRAF1K:''' Good, NOW GET TO WORK ON JAILBREAK!!! :P Glad you're back. :-) 

==March 1, 2004==

''* Mychaeel blows the dust from his developer journal, opens it and continues writing.''

Just checked in some actual, new, original Jailbreak code again yesterday.  Quite an elevating feeling.

It's a facility for our audio announcements.  We noticed that the number of distinct announcements grew exponentially as we thought of more and more situations in which one would make sense.  Some documentation of the system is available on [http://www.planetjailbreak.com/jdn/JBSpeechClient JDN: JBSpeechClient].

===Comments===

'''Tarquin:''' Wow! :) Looks cool!

==April 1, 2004==

Short of a few rather small features and known bugs, Jailbreak 2003 is finally feature-complete.  Yay!

The transition from UT2003 to UT2004 has put a big item on our to-do list again, though.  Epic has broken source code compatibility on several places, and other problems seem to stem from binary incompatibility (the &lt;code&gt;Ping&lt;/code&gt; variable in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] suddenly transmogrified from an int to a byte, which breaks the score display in our scoreboard).

It's strange, yet interesting and somewhat impressive, that UT2004 manages to load and run the game anyway.  At the surface, Jailbreak 2003 runs well under UT2004 already, even though it ''looks'' like Jailbreak 2003, at least HUD-wise.  Of course we're going to make Jailbreak 2004 blend in with UT2004 as well as Jailbreak 2003 does with UT2003.

If possible without too much pain I'd very much like to release Jailbreak 200x as a combined UT2003/UT2004 release.  The changes are small enough that it would be a shame to abandon all UT2003 users who didn't have the chance or the money to upgrade to UT2004 yet.

I'm looking into the details of [[Legacy:CVS|CVS]] branching right now.  Our &quot;main line of development&quot; will become UT2004, but we'll keep a UT2003 branch and take care to merge any generic changes into it.  ...if that works the way I hope it does.

==April 23, 2004==

The Jailbreak to-do list is empty, and I'm out of work.  (You bet.)  Guess it's beta time now.  Yay!  :-)

Currently working on a Perl script that automatically updates all required modules from CVS, checks for uncommitted changes, rebuilds them if necessary and automatically creates the distribution packages.  I hope to be done with that sometime tonight.  My girlfriend made us a spiffy installer logo &amp;ndash; I'm looking forward to hearing what the others say about it...

===Comments===

'''Corran:''' That's great news (for us anyway :D).  I can't wait for this.

'''GRAF1K:''' What he said. My mouth is watering. :D

BTW, did you know that UW is integated with the UT2004 UDE? Click on the Documentation tab in the code editing area and and there's unDox and Unreal Wiki. Sweet. :)

'''Corran:''' Yeah, it's been integrated into WotGreal fo a while now.

'''GRAF1K:''' Who cares about WOTgreal... UDE is official. :D

'''DJPaul:''' WOTgreal ''is'' the UDE.

'''Guest:''' Like the core of the application changes anything whatsoever... O_o

'''Wormbo:''' c-24-7-171-253.client.comcast.net (Guest above), will you ''please'' stop deleting Murphy from this page?

==May 17, 2004==

Let it never be said again that modifying the mid-game menu in UT2003 requires a custom [[Legacy:PlayerController|PlayerController]] subclass...

[[Image:Legacy_mychaeel-ut2003midgamemenu.jpeg|center|]]

==May 19, 2004==

I'm practically out of ideas what else could be added to Jailbreak &amp;ndash; almost time to release now...

Last thing we implemented were custom loading screens &amp;ndash; it's actually pretty straightforward to replace the default images displayed while a map loads by custom ones at runtime.

We've even managed to create one loading screen per bundled map and have the corresponding screen shown when the map loads &amp;ndash; and I've added a means for mappers to [http://www.planetjailbreak.com/jdn/Loading_Screen embed a custom loading screens into their map] which is displayed when that map loads.  Given that the necessary information is all there and is just being ignored by UT2004 stock code, I wonder why Epic didn't do that themselves...

===Comments===

'''GRAF1K:''' Epic wanted to include their uber-1337 Photoshop lensflares though! ;)

Looks like a ''very'' nice release coming up from you guys over at Jailbreak. I'd count off the minutes if I only knew when...

'''Note:''' I am indeed the M*rphy killer. Buggy 3rd-party software... :pissed: I'll get it fixed. For now though, I can't even replace the M*rphy's once I've killed them. Just revert once you see this.

'''Mychaeel:''' Argh... what kind of bug would ''specifically'' replace occurrences of the string &quot;Murphy&quot; in a text...?  o_O

'''GRAF1K:''' Well, it's not the bug directly that's doing that. The bug is me not being able to turn the feature off. The feature in question is a privacy feature that blocks sending of personal info (like the owner's name).

'''Mychaeel:''' So is it safe to deduce that your name is Murphy?  (Way to go for a privacy feature... :-p)

'''GRAF1K:''' LOL. I was going to disable that feature anyhow. The app does a lot more than that. Besides, my last name isn't Mürphy, but the account is under someone who's is. :)

==May 20, 2004==

Naturally, any display of hubris such as making the statement &quot;I'm out of bugs&quot; angers the Gods, so the to-do list has a few more now.  Fortunately, they're all pretty small yet, and I'm out to squish them before they get any bigger...  ;-)

==May 23, 2004==

You have no idea how glad I am that we're making a UT2003/UT2004 release of Jailbreak &amp;ndash; if only for the reason that on both my desktop computer and my notebook with their measly 512 MB of RAM starting UT2004 (or even UT2004 server and client at the same time) takes ''ages'' while the system swaps like crazy &amp;ndash; and loading UT2003, even server and client, works without any swapping at all.  UT2004 is a monster...

===Comments===

'''El Muerte:''' I don't have any swap issues when running UT2004 on my laptop (512MB ram). Haven't done much client+server testing, but the client takes quite some time to join the server (/me blames slow laptop HD). On my desktop I can run a server and two clients without any serious problems (1GB ram). I think windows is to blame :P

==May 27, 2004==

Jailbreak is out.  We assume full responsibility for all bugs that were left in.  :-p

Seriously though &amp;ndash; everything went reasonably smoothly, and while there ''are'' some bugs we'll have to fix, nothing really serious has popped up yet.  Feedback is very positive; feels good.  :-)

I've submitted Jailbreak 2004 for the MSU contest.  Perhaps we'll win something.

==May 29, 2004==

There's a known issue in UT2004 which prevents anybody who ever selected a third-party gametype in the server browser from joining any other game of a different gametype.

This happens since, when a gametype is selected, its [[Legacy:GameInfo|GameInfo]] class is loaded and its static FillPlayInfo function is called.  After adding its settings to the [[Legacy:PlayInfo|PlayInfo]] object, the GameInfo class remains loaded in memory (probably because it's somehow still referenced by the PlayInfo object and thus cannot be garbage-collected), and when the player tries joining a server running a different gametype, that'll fail because the third-party gametype's package is still loaded.

I haven't been able yet to find out ''why'' exactly FillPlayInfo is called at this point by the server browser and which part of the code does anything with the data saved in the PlayInfo object referenced by the &lt;code&gt;FilterInfo&lt;/code&gt; variable.  However, simply avoiding to actually add anything to the PlayInfo object seems to solve the problem without any noticable side effect, so the following chunk of code makes everything work as it should:

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local UT2K4ServerBrowser UT2K4ServerBrowser;

  // check whether we are called from a server browser
  foreach Default.Class.AllObjects(Class'UT2K4ServerBrowser', UT2K4ServerBrowser)
    if (UT2K4ServerBrowser.FilterInfo == PlayInfo)
      return;  // ignore because called from server browser

  // now do the usual stuff
  Super.FillPlayInfo(PlayInfo);

  PlayInfo.AddSetting(Default.GameGroup, ...);
  PlayInfo.AddSetting(Default.GameGroup, ...);
}
&lt;/uscript&gt;

==May 31, 2004==

While fixing some netcode I found out that in one of my classes a certain variable was constantly, over and over again, replicated to all clients &amp;ndash; several times per second; that class had &lt;code&gt;bNetNotify&lt;/code&gt; activated, and PostNetReceive was called every other tick.

What baffled me was that this variable wasn't even changed server-side; nor did it change on client side.

It took me a while to find out what was happening:  This variable which was replicated over and over again was a [[Legacy:Pawn|Pawn]] reference.  As soon as the Pawn it pointed to was destroyed, the variable was duly set to &lt;code&gt;None&lt;/code&gt; on both server and client &amp;ndash; but the server kept replicating its value to the clients.  And at the end of the day, the follwing slightly weird piece of code fixed it all:

&lt;uscript&gt;
// fixes replicating over and over when referenced actor has been destroyed
if (PawnObjectiveGuessed == None)
  PawnObjectiveGuessed = None;
&lt;/uscript&gt;

The Unreal engine is full of mysteries...

===Comments===

'''Mysterial:''' That works because UnrealScript returns &lt;code&gt;None&lt;/code&gt; when accessing a property pointing to an [[Legacy:Actor|Actor]] with bDeleteMe == true. Internally, the [[Legacy:Actor|Actor]] is in fact still referenced by that property until the [[Legacy:Actor|Actor]] is truly deleted. It getting continually replicated might be a bug in the engine. Can you try to create a small reproduction case and send it to me?

'''Mychaeel:''' Will do.  :-)

'''Mychaeel:''' Hrmph... making a simple test case is not as straightforward as I thought.  Then again, if it was an obvious bug, it probably wouldn't be in there...  ;-)

==May 31, 2004==

Argh!  People report server crashes, and every single crash log has the following lines at its end:

&lt;pre&gt;
  Critical: UObject::ProcessEvent
  Critical: (JBCameraArena JB-Heights.JBCameraArena, Function Jailbreak.JBCameraArena.Tick)
  Critical: AActor::Tick
  Critical: TickAllActors
  Critical: ULevel::Tick
  Critical: (NetMode=1)
  Critical: TickLevel
  Critical: UGameEngine::Tick
  Critical: Level Abandoned Heights
  Critical: UpdateWorld
  Critical: UServerCommandlet::Main
  Exit: Executing UObject::StaticShutdownAfterError
  Exit: Exiting.&lt;/pre&gt;

That Tick event in question doesn't do anything special that I'd be aware of &amp;ndash; it certainly doesn't destroy the actor or anything like that.  And I cannot reproduce it at all in a local client/server testing environment, and it only happens infrequently on other servers anyway.

There may be one thing:  The Tick event calls a function within an [[Legacy:Editinline|editinline]] object (which was created along with the JBCamera actor as a [[Legacy:Subobject|subobject]]).  Perhaps, when JBCameraArena.Destroy() is called, that subobject reference somehow becomes invalid and crash-prone under certain circumstances?

: '''Update:'''  I just found out that all my JBCameraArena actors '''share the same subobject''' &amp;ndash; unlike what I expected, seeing that spawning [[Legacy:Emitter|Emitter]] subclasses creates ''distinct'' instances of their [[Legacy:ParticleEmitter|ParticleEmitter]] subobjects.  While I'm not sure whether that's responsible for the crashes, it's definitely not what I had in mind and it's a bug when more than one JBCameraArena is active at the same time.

To make it worse, those error messages don't really indicate what ''kind'' of error happened (the lines preceding them are different and nothing out of the usual in every case &amp;ndash; such as players joining or leaving; unfortunately I have no indication whether there's a temporal relationship between the events logged before the error and the error, but I believe there's not).

Is there anyone out there with Unreal-engine insight who might be able to tell me which kinds of errors would trigger those server log messages?

==June 2, 2004==

Phew.  The Jailbreak server crashes are '''fixed''' (and stress-tested successfully on MyUnreal's ever-full server), and so are the &quot;web admin does not come up again after level change&quot; and &quot;server does not react to UDP requests after a while&quot; bugs.  Those were the toughest ones to crack, mostly because I was fixing in the dark; the others were, while partly annoying, peanuts.

In retrospect it seems that the latter two bugs stemmed from the engine not fully cleaning up the previous level; and that, in turn, was apparently due to my storing some actor references in the ''class default'' values of a class &amp;ndash; I did that only to compare the stored references to given ones for caching a function's return value over subsequent calls.  Even if the actors were destroyed between two calls, I'd expect a comparison simply to fail.

After I worked around that problem (by storing the actors' locations in the cache &amp;ndash; in this case that worked just as well), suddenly those both bugs (web server not coming up again, UdpGameSpyQuery failing to bind its port after a while) were gone all by themselves.  So, note for the future:  '''Never store actor references in default properties!'''

===Comments===

'''Foxpaw:''' That's interesting. I've stored actor references in default properties lots. (For instance, any actor can get a reference to the level's backdrop in my case by accessing class'Base.Backdrop'.default.Reference. Perhaps this behaviour is limited to certain classes?

'''Mychaeel:''' Perhaps, but I don't think so.  The effect of doing that is hardly noticable in local testing conditions, in any case (otherwise I'd have seen it a lot earlier) &amp;ndash; as I wrote, the most noticable effect was that the web admin [[Legacy:WebServer|WebServer]] didn't get cleaned up on level change and that &amp;ndash; after many level changes &amp;ndash; a server just didn't respond to UDP requests anymore.  Otherwise, everything worked great.

'''Mysterial:''' Since classes are non-Actor objects, the usual issues with storing [[Legacy:Actor|Actor]] references in them apply. I'm somewhat surprised it didn't crash. Perhaps because the engine doesn't actually destroy the class objects as it would most other objects you'd store references in, since you're playing another Jailbreak game so it wouldn't ever unload the resources.

'''Mychaeel:''' Frankly, I wasn't ever aware of &quot;the usual issues&quot; with storing Actor references in non-Actor objects &amp;ndash; Jailbreak code still does that on several occasions ([[Legacy:LevelInfo|LevelInfo]] and [[Legacy:TeamInfo|TeamInfo]] references in the non-Actor objects which represent the small player icons on the HUD, and in at least one other place too).  Are you saying that referencing an Actor from a non-Actor object is always crash-prone and not supported by the engine?

'''Mysterial:''' [[Legacy:Actor|Actor]] references in non-Actor subclasses don't get automatically cleaned up by the engine, so they work just like C++ pointers in that accessing them after they've been deleted has horrible, unpredictable effects (generally crashing). Additionally, since part of garbage collection is traversing every object reference property that exists, you need to clean up any such references before a level change or you'll either get frequent serialization crashes or prevent the previous level from unloading, creating huge memory leaks, as you unfortunately found out.

==June 8, 2004==

With the stress of releasing Jailbreak over, I'm free to look into some of my old mutator ideas again.  One of them is '''SprayPaint''' &amp;ndash; a simple idea actually, borrowed from Half Life where the ability to spray-paint your clan logo on walls was built-in functionality.  I want to port that idea to UT2004.

This would be pretty straight-forward and quite uninteresting if I hadn't put it into my mind that it should be possible to customize the spray-painted images by simply dropping a BMP file (1-bit, 64x64 pixels) into a directory; and, if that's done by a client in a network game, all other clients should be able to see the same image too.  The latter is just some replication acrobatics; the former is where I saw my challenge.

Reading arbitrary files in UnrealScript isn't really supported, but if you need to do it for text files, instantiating a [[Legacy:WebResponse|WebResponse]] object and using its LoadParsedUHTM function works quite well.  However, UnrealScript strings aren't binary safe &amp;ndash; null bytes act as end-of-string tokens and thus cannot be included in a string.  Attempting to load a binary file such as a BMP image with LoadParsedUHTM results in a byte string truncated at the first null byte.

I've worked around that problem now by spawning a local [[Legacy:WebServer|WebServer]] listening on a random free port, delivering files as &quot;application/octet-stream&quot; with WebResponse's function IncludeBinaryFile, and a [[Legacy:TcpLink|TcpLink]] operating in MODE_Binary to receive the binary data from the local web server.  In theory this setup is able to read the contents of any binary file within the UT2004 directory hierarchy into an UnrealScript byte array, and it's working great for my purposes.

===Comments===

'''EntropicLqd:''' Can you see outside of the UT2004 directory structure with that technique?  Cunning solution btw

'''Mychaeel:''' Frighteningly enough, I can read ''any'' file that way.  (I had actually &amp;ndash; and perhaps naively &amp;ndash; assumed that the IncludePath in WebResponse would not allow UnrealScript code to travel beyond the UT2004 base directory...) &amp;ndash; Perhaps it'd be best to let Epic know about this and to remove this last &quot;Developer Journal&quot; entry for the time being...

'''EntropicLqd:''' I'd definitely let Epic know about it (I guess you have already).  Allowing access above the 2K4 root directory is an astonishing lapse on Epics part.  I was expecting a ''ho ho ho ofcourse not'' response.  Wonder if you could write a remote file browser...

'''Mychaeel:''' Without having a way to generically get full directory listings, I'm afraid (or rather, glad) that's not possible &amp;ndash; [[Legacy:StreamInterface|StreamInterface]] only provides a way to list directories (and a limited set of other file types, though I haven't been able to get that to work for anything except said directories and .mp3 files).

'''Mychaeel:''' The LoadParsedUHTM method works on any file on a given partition too, given the right IncludePath setting (e.g. &quot;C:/&quot;) in a subclass and without all the local web server hassle.

'''Mychaeel:''' I've sent a mail to Joe Wilcox.

==July 12, 2004==

Jailbreak 2004 is one of the gametype finalists in the MSU contest.  That's nice and I hope we'll win something too, but I find it more notable that Jailbreak got a honorable mention in the &quot;FPS Mod&quot; category.  I didn't check that box when I entered Jailbreak 2004 into the contest; it must have been the judges' decision to put it there too...

In completely unrelated news, I've been turning some of my spare attention to attempting to write a couple of extensions for Thunderbird to make my life easier (on the long run; you know, that &quot;impatience, hubris&quot; part that occasionally pops up in a Larry Wall quote at the bottom of an Unreal Wiki page).  Phew.  If you ever thought that UnrealScript was a humongous, complex and for the most part poorly documented heap of code already, do look at http://lxr.mozilla.org for an upgrade.

===Comments===

'''Tarquin:''' I don't know about you, but I am finding the Jailbreak community very quiet these days. I'm sure there was way more activity (posts, maps, discussion) in the days of JBIII. But I suppose that was the 3rd release and we are only on the first. BTW, if you have some spare time, do you think you could look at the Wookee class tree generator? It would be nice if the text of the tree was parsed for wiki links, so we could use it for Unreal classes here &amp;ndash; but I'm afraid I've not been able to work out how to do it. It's WookeeTree.pm in your CVS. :) 

==July 14, 2004==

My support for Opera 6 has finally broken down after the last vBulletin 3 update which made &lt;code&gt;[code]&lt;/code&gt; tags unreadable, and I've made the switch to Firefox.  I'm loving it already.

It has gone quite a long way since the last time I gave it a try (must have been around version 0.6), and most of the reasons I didn't want to switch to it then have gone meanwhile.  I'm especially fond of the ability to selectively skin websites with custom CSS (using the &quot;uriid&quot; extension and a specially crafted userContent.css), and I just ''have'' to love a program which allows me to tweak its user interface appearance by editing a CSS file...

In completely unrelated news, Fraunhofer IGD (whom I had sent an unsolicited application about three months ago and never heard back of) has offered me a job... working on a project in Seoul, South Korea.  Imagine my surprise.  I might even have considered it if I hadn't found another job in the meantime already ''and'' if I didn't specifically want to move closer to my girlfriend in the Frankfurt area.  Still, quite interesting...

(Is this developer journal turning into a blog...?)

===Comments===

'''Tarquin:''' Bwahahahaha! I knew we'd convert you in the end.... :P

'''MythOpus:''' Consider this a reminder from the entire wiki to update the Wookee download zip ;)

==August 20, 2004==

When you think you're finally out of bugs, Atari QA will come and send you a new bunch of them.  :-p

No, actually, it's not that bad.  It boils down to one actual code bug and a bunch of map-related things in the order of &quot;graphic seams flicker in and out around the pipelines.&quot;  Still, I was surprised when I got that mail...

===Comments===

'''GRAF1K:''' Why would Atari be interested in sending you bug reports?

'''Wormbo:''' One code bug and one code thing I wouldn't call a bug. (no weapon in celebration screen)&lt;br /&gt;They most likely sent the reports because they tested Jailbreak 2004. ;)

'''Mychaeel:''' ...and they tested Jailbreak 2004 because they want to include it in the Editor's Choice Edition.  Sorry, I kinda implied this.  ;-)

'''Guest:''' I figured ECE was the reason but wasn't sure. Congrats then. :D

==September 5, 2004==

Picking up my old SprayPaint mutator idea again.  To reiterate, it's about being able to spray logos on walls &amp;ndash; the logos must be provided as monochrome bitmaps (i.e. bitmaps with 1-bit color depth) in a certain UT2004 subdirectory, and you can spray them on walls in a color of your choice; and the best thing is that other players on the server would see the exact same thing even though they don't have the source bitmap on their system.  On the long run I even want the sprayed images to persist across matches.

There's a bit of replication acrobatics involved in making that work, but so far it works nicely &amp;ndash; the data is loaded client-side, transmitted to the server via a replicated function in &quot;bunches&quot; of no more than 64 bytes a tick, and then left to the engine to be replicated back to all (non-bNetOwner) clients.

Two things I noticed doing that were that, firstly, the engine only replicates the first 256 bytes of an array of 512 byte values (where I don't know exactly whether it's the number of elements or their total size which is limited by the engine); and secondly, that passing a byte array via a replicated function call will only actually replicate the first value of that array, not the entire array.  However, if the array is part of a struct which is passed through the replicated function, everything works fine (hence my &quot;bunches&quot; of data).

The user interface for that thing is keeping me thinking.  Right now I figure that pressing your usual &quot;talk&quot; key (&quot;T&quot;, for instance) quickly twice in a row (like a double-click) would pop up a window where you could select which image to spray (using the mouse or arrow/movement keys), but that idea is subject to change.  For now, the &quot;mutate SprayImage &lt;filename&gt; &lt;color&gt;&quot; console command does the trick.

==November 17, 2004==

I've moved into my new apartment last Sunday, and today I got ISDN and DSL activated.  Thus, JDN is up again &amp;ndash; whatever caused my computer to break down two weeks ago is mysterious to me.  Maybe my video card overheated after all after having been running non-stop for months without a monitor attached to it... still, not really a satisfactory explanation.

Now that my home computer has been hosting CVS, an Apache webserver with JDN and other services and an ISDN calling machine and fax server for quite a while and across several hardware updates, I've been thinking &amp;ndash; it's getting harder and harder to keep the noise level coming from this machine at a level I'm willing to bear in my living room.  Plus, most of the time the computer is merely converting electric power into noise and heat via a video card and processor which are ridiculously overpowered for something acting as a web/fax/CVS server most of the time.

...so &amp;ndash; *drumroll* &amp;ndash; I've got that fabulous idea of building a small machine out of spare parts mostly left over from hardware upgrades of my main PC over the years.  I've got two mainboards/processors to choose from (a Pentium 200 MHz and an Athlon 800 MHz which I could underclock to 500 MHz), some left-over RAM, an ethernet card (my latest mainboard had that on-board) and a simple video card (an ATI XPert@Work sporting a 3D chipset with the staggering amount of 8 MB VRAM).  I also have a midi-tower computer case somewhere.  What I need is a silent power supply and &amp;ndash; probably &amp;ndash; a new harddisk (especially if this thing is to act as a file server as well) unless I find a suitable one in my pile of used hardware.

I figure I'll install Debian Linux on it &amp;ndash; with that awesome 3 MBit/s downstream I've got I can even download it without much hassle.

'''Update:'''  Wow.  Silent 80 GB harddisks come for less than 60 EUR these days?  o_O

==March 8, 2005==

&lt;nowiki&gt;*blows dust off this page*&lt;/nowiki&gt;

&lt;nowiki&gt;*cough*&lt;/nowiki&gt; &lt;br /&gt;&lt;nowiki&gt;*cough*&lt;/nowiki&gt;

Remember the Palpable mutator for Unreal Tournament?  Probably not, because I never actually released it, and the BuF mess-up two years ago ate all remaining evidence for it.

Basically, it allowed the user to see stereo 3D by displaying two versions of the current scene rendered from slightly different points of view.  You had to squint to see the effect, just like for [http://www.brossco.fi/janne/eclipse99/budapest/bu_3d.html these photos].

I tried to implement the same thing for UT2004 on Sunday.  To the degree that two viewports were rendered on the screen next to each other, it was a piece of cake; but, having the HUD render within one of those viewports prove to be impossible.  In Unreal Tournament, it was basically just a matter of setting [[Legacy:Canvas|Canvas]].OrgX/OrgY and ClipX/ClipY right &amp;ndash; but UT2004's HUD makes heavy use of the native DrawSpriteWidget function which, while honoring OrgX/OrgY and ClipX/ClipY, doesn't take the reduced size of a viewport defined through those properties into account when positioning and scaling the widgets.

So, no way.  Well, it was just an experiment anyway.  The 3D effect itself is pretty cool, though, even if it strains the eyes to squint that way for an extended period of time...

In other news, after a period of consideration, I bought a digital piano today &amp;ndash; a [http://www.rolandus.com/products/ck_details.asp?CatID=11&amp;SubCatID=45&amp;ProdID=HP-101 Roland HP-101].  I played the piano for years before leaving my parents' home to go to university, and I want to pick this hobby up again.  And, wow, those digital pianos nowadays really do sound and feel like the real thing &amp;ndash; down to subtle details like the slight resonance you hear after releasing a key, or that the keys for the deep tones react with slightly more resistance to being pressed down than the high-pitched keys...

===Comments===

'''Birelli:''' I remember Palpable, I think a couple of us on IRC tested it for you one time. It's definitely a cool effect, but it gave me a headache after about 15 minutes of playing. Probably not something people want to use all the time. Also it takes a bit of practice before you can train your mind into not forcing one eye dominant over the other, so at first it's basically impossible to run in a straight line.

'''Epsix:''' Any chance I can get the source code to the UT2004 version of Palpable? We've succesfully created a CaveUT setup here with 3 walls + 1 floor and we want to add stereoscopy and headtracking next. Since we want stereoscopy on all 4 screens we can't use drivers that do this automatically since we only have 1 viewing direction rather than 4. Basically what I need is UT2004 to run on 2560x1024 with left and right eye split on either half of the screen. (so 2x 1280x1024 next to eachother). I understand that palpable does just this? I've been looking at the source of Palpable for UT99 for several hours now trying to get it to work with UT2k4, but I simply lack the familiarity with either API to get anything done. Hell, you're from Holland right? If you help me out on this, I'll let you have a look ;)

==April 19, 2005==

Those who have followed [http://www.planetjailbreak.com/?news=275 PlanetJailbreak news] are aware of what I've been working on recently: the visuals of freezing and shattering a player model.  Part of the problem is to overlay the player model and the weapon it holds with an &quot;ice&quot; texture that gradually fades in.

My first idea was creating a [[Legacy:Shader|Shader]], setting its &lt;code&gt;Diffuse&lt;/code&gt; material to the player's skin texture, the &lt;code&gt;Specular&lt;/code&gt; material to my alpha-blended &quot;ice&quot; texture and use a [[Legacy:ConstantColor|ConstantColor]] as its &lt;code&gt;SpecularityMask&lt;/code&gt; material to control the fading.  That works fine for the player model, but utterly fails for the weapon &amp;ndash; the weapon's textures are implicitly defined through the mesh, and there's no way UnrealScript code can get hold of them (not even anything similar to [[Legacy:Dynamicly Accessing Original Static Mesh Textures|this method]]).

So, that approach fell somewhat short of what I had envisioned.

But there's &lt;code&gt;OverlayMaterial&lt;/code&gt; defined in [[Legacy:Actor|Actor]], along with a &lt;code&gt;SetOverlayMaterial&lt;/code&gt; method, which is used (among others) by the UDamage to produce that &quot;energy&quot; overlay effect on players and weapons.  I had previously found out already that using a plain texture as &lt;code&gt;OverlayMaterial&lt;/code&gt; will simply replace the model's skin by that texture (instead of overlaying it) &amp;ndash; not what I intended, so I had put that approach aside.  Now, I picked it up again.

After some lucky experimentation, I found that I was able to use a [[Legacy:Shader|Shader]] as an &lt;code&gt;OverlayMaterial&lt;/code&gt; whose &lt;code&gt;Specular&lt;/code&gt; material was set to my &quot;ice&quot; texture.  Funnily, I noted that:

* The &lt;code&gt;Diffuse&lt;/code&gt; material I tried to set was automatically overwritten with a reference to the overlaid actor's skin (the skin part with the highest ordinal number in the meshmap, I guess).  So, here's a way to find the original skins of a non-static mesh if you need to.

* The &lt;code&gt;A&lt;/code&gt; (alpha) member of the &lt;code&gt;Color&lt;/code&gt; property of a [[Legacy:ConstantColor|ConstantColor]] material I tried to use as the shader's &lt;code&gt;SpecularityMask&lt;/code&gt; was immediately reset to zero whenever I attempted to set it to something different.  Why would the engine do such a thing...?

So, that didn't work the way I had it intended to.  Neither did any attempts to replace the plain &quot;ice&quot; texture in the &lt;code&gt;Specular&lt;/code&gt; slot by a [[Legacy:Modifier|Modifier]] of any kind.

Then, in a last futile attempt, I tried using a [[Legacy:FadeColor|FadeColor]] in the &lt;code&gt;SpecularityMask&lt;/code&gt; slot (instead of a [[Legacy:ConstantColor|ConstantColor]] as before), and lo!, when I set its &lt;code&gt;FadePeriod&lt;/code&gt; to something other than the default, zero, it worked!  Well, of course I had a pulsing overlay now, but setting both &lt;code&gt;Color1&lt;/code&gt; and &lt;code&gt;Color2&lt;/code&gt; to the same color fixed that.

So, now I've got a texture overlay on both player and weapon which I can smoothly fade in (and out, if there was any need) and which still lets the original textures shine through.

===Comments===

'''Wormbo:''' Interesting hack. :) The engine uses the ConstantColor in the SpecularityMask slot to fade out the overlay effect when the actor's overlay timer drops below 1 or so.

==May 1, 2005==

Microsoft has a pretty good reputation on IDEs, but ''Microsoft eMbedded Visual C++'' really has at least one major quirk which makes working with it a pain unless you either know how to avoid it or unwittingly got around it by failing to customize your workspace too much.  I didn't fall into the second group, and it took me until today to become part of the first.

I'm developing a small smartphone application to remote-control MP3 playback on the Linux server which sits quietly in my closet via Bluetooth.

The ''Smartphone 2003 SDK'' comes with a smartphone emulator.  That's very nice, but it becomes pretty frustrating once it stops working &amp;ndash; which, for me, happened basically whenever I started the IDE for the second time after installing it:  Whenever I wanted to run my program, I got an error dialog telling me one of the following things:

{{innerbox| Cannot find a default device. Please create one or more from the Platform Manager.

}}

&lt;nowiki&gt;&lt;/nowiki&gt;

{{innerbox| There is no device installed. Please go to Configure Platform Manager to add a device.

}}

Obviously there were still the same devices as the last time, and I certainly hadn't changed configurations since last successfully running the program in the emulator.  So, almost each time I wanted to work on my project, I had to uninstall the entire IDE and reinstall all of it &amp;ndash; two installers, one of them badly made, and a service pack; half an hour work just to get the IDE to work again.  Needless to say, I didn't do that very often.

Of course, I googled for a solution.  Nothing to find except for two postings from people with the same problem without any replies to them.  At least I wasn't alone; little consolation there, though.

Today, I got that second error message from above for the first time, and that was my luck.  Googling for ''that'' finally led me to a newsgroup message with the solution:  If you disable the WCE Configuration toolbar, the (unlabeled) &quot;default device&quot; drop-down box (the rightmost one) '''will automatically revert to &quot;Smartphone 2003 Device.&quot;'''  Set it back to &quot;Smartphone 2003 Emulator&quot; and everything works again.  There's no menu command for that option.

&quot;Son of a gun!&quot;, to say it in the original newsgroup poster's words.  What an unnecessary annoyance.

==November 3, 2005==

Today at around 11:15 AM, I successfully completed my twenty-ninth year of life (for a suitable definition of &quot;successfully&quot; :-P), heading into the thirtieth without hesitation. Happy birthday to me ;-)

===Comments===

'''El Muerte:''' damn you're old ;)

'''EntropicLqd:''' Happy birthday youngster (for a given value of young).  Give it another few years and you'll feel like you are falling apart :)

'''Sweavo:''' phew it's not just me then Entropic :-)

'''Tarquin:''' Happy birthday Mych! The big 30 next year ;) It's not as awful as it sounds :)

'''Mychaeel:''' Hehe, thanks y'all :-)

'''MythOpus:''' I saw it awhile ago, but I was always on my dads Linux computer so I haven't been able to... WISH YOU A HAPPY BIRTHDAY!

'''Mychaeel:''' I'll take good wishes at any time, so: thank you as well :-D

'''Sweavo:''' in that case, have had a happy birthday :-)

==April 24, 2006==

Setting a data structure element of a replicated array element won't actually make the engine replicate that array element.  You'll have to set the ''whole'' array element to make the engine notice that it has changed:

&lt;uscript&gt;
function TouchElement(int iElement)
{
  local TElement ElementTemp;

  ElementTemp = Elements[iElement];
  Elements[iElement] = ElementTemp;  // prod!
}
&lt;/uscript&gt;

Has anybody else ever had that problem?

===Comments===

'''EricBlade:''' I haven't personally had a reason to make an array of structs yet, but it sounds like it could be related somehow to the problem of not being able to replicate -just- a struct, without some other var?

'''Wormbo:''' That seems to be a general problem of struct replication, not only structs as array elements. The code &lt;code&gt;Elements[iElement] = Elements[iElement]&lt;/code&gt; seems to be enough to cause replication though, whether anything actually changed or not.

'''Mychaeel:''' Yes, I also realized that the detour over a temporary local variable probably wasn't necessary at all &amp;ndash; I was still under the influence of the &lt;code&gt;SwapElements&lt;/code&gt; function which actually ''needed'' one.  I've occasionally replicated (individual instances of) structs without problems, though &amp;ndash; you only have to be aware that changing any struct element will cause the entire struct to be replicated.  (Actually, I've used that as a feature occasionally.)

==July 15, 2006==

I found the following function in [http://mychaeel.no-ip.com/source/Jailbreak/Jailbreak/Classes/JBTagPlayer.uc?rev=1.58&amp;view=auto some source code] I had written years ago:

&lt;uscript&gt;
// ============================================================================
// CalcOrientation
//
// Calculates and returns an artificial value representing the orientation of
// a vector. The returned value has the following properties:
//
//   * Non-zero for any non-zero vector. Zero for the zero vector.
//   * Negating the argument yields the negative result.
//
// Those properties allow to use this function to make any difference between
// two given points in space unambiguous by passing a single additional binary
// bit of information.
// ============================================================================

simulated function float CalcOrientation(vector VectorInput)
{
  local vector VectorTranslated;

  VectorTranslated.X = VectorInput dot vect(1, 1, 0);  if (VectorTranslated.X != 0.0) return VectorTranslated.X;
  VectorTranslated.Y = VectorInput dot vect(1,-1, 0);  if (VectorTranslated.Y != 0.0) return VectorTranslated.Y;
  VectorTranslated.Z = VectorInput dot vect(0, 0, 1);  if (VectorTranslated.Z != 0.0) return VectorTranslated.Z;

  return 0.0;
}
&lt;/uscript&gt;

It's part of Jailbreak's player movement extrapolation code which is designed to provide a smooth client-side representation of a player's position with as little network traffic as possible.  The extrapolated player position is used by the [http://mychaeel.no-ip.com/jailbreak/JBPanorama scoreboard minimap] and [http://mychaeel.no-ip.com/jailbreak/JBScreen JBScreen].

Well, what the ''heck'' was I thinking?

Obviously, instead of using a local vector variable, I could have used a simple float; the function calculates each component of the local vector, immediately uses it, and then never uses it again.  Plus, looking more closely at what's actually done there, it looks as if I could simply have used the original vector's components instead of (sloppily) translating it into a rotated coordinate system first.

It took me a while to get behind what I had thought several years ago.  I should comment more.

Using a local vector instead of a float was halfway between being an artifact of the way my mind had gone before arriving at this code and being self-documenting code.  (Sure enough the latter could have been achieved just as well with less bytecode overhead by just adding a comment.)

Translating the input vector into a coordinate system rotated 45° away from the main axes was done to make changes in the signum of the return value less common.  If there's any directional bias in a player's movement at all, it's usually along the main axes, following a hallway a mapper will generally have aligned along the coordinate system.  Strafing left and right even just a bit while moving along one of the coordinate axes (say, the Y axis), would change the signum of one of the other coordinate components (the X component) frequently.

If the axes are rotated 45° about the vertical (Z) axis, chances are better that you stay &quot;left&quot; or &quot;right&quot; of an axis while moving, leaving the signum of the return value of this function unchanged.  Any change in the signum needs to be replicated to all clients (as the signum of the scalar player velocity they use to extrapolate the player's position); so this coordinate rotation reduces the frequency of updates required to send to the clients.

Phew.

I remember experimenting with different replication and extrapolation mechanisms, using some of UT2003's more obscure logging parameters to get network traffic detail into UT2003.log.  This optimization actually ''did'' reduce the amount of updates sent across the network for this detail.  I never got around to actually measuring whether it made any relevant difference in the ''total'' amount of network traffic, though.  I suppose this could be just one of the cases where I indulged in premature optimization just for the fun of it.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40308</id>
      <timestamp>2009-12-03T13:57:09Z</timestamp>
      <contributor>
        <ip>145.93.21.27</ip>
      </contributor>
      <comment>/* Comments */</comment>
      <text xml:space="preserve">{{innerbox| ''Don't edit my journal entries, but feel free to add comments.''

}}

==December 14, 2002==

{{innerbox| Read over your compositions, and wherever you meet with a passage which you think is particularly fine, strike it out.

 : ''[[Wikipedia:Samuel Johnson]]''

}}

No effort is wasted if you've learned something from it.  (Though that doesn't mean that the same time couldn't have been spent more effectively.)

Occasionally I'm stuck in a dead end of my own design and can't seem to find my way out of it.  The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on.  So I linger a bit longer and cudgel my brains for some ''other'' way to reach my goal than backing up.

Deleting an evening's worth of good code requires an effort, but if it relieves me of a week's worth of trying not to scratch it, it's worth it.

===Comments===

'''Tarquin:'''  &quot;The way in there is plastered with a few truly elegant thoughts and implementations that I don't want to tread on. &quot; &amp;ndash; I do that all the time in mapping. I end up with multiple copies of the same area, each one trying a different solution...  What usually happens is I eventually work up the courage to start from scratch.

'''Mychaeel:''' That's exactly what happens to me too.  :-)  Realizing when it's better to scratch a few good ideas in favor of an entirely different approach (maybe even one with a slightly different outcome than what I originally figured) is a learning process.

==December 20, 2002==

Note to self:  Not assuming that other people's contributions to a testing environment are free of bugs can be a huge time saver.

==January 17, 2003==

Incidentally I dug out the code I scratched in the first entry on this page and used it for a related, but different purpose where it actually fits in.  (Good thing I never really delete something for good unless I'm ''absolutely'' sure it won't ever be of any use anymore.)

The code is part of Jailbreak's bot support and is supposed to let bots make an educated guess where an enemy player is currently located after the enemy gave his position away by triggering a release switch.  Naturally, if there's only a single relase switch, all that boils down to a single possible location.  Where it gets interesting is if there are ''multiple'' release switches and the bots actually have to ''guess'' which one the player triggered.

My code does that based on the last known location of a player (directly after a round starts, or after a spawn in freedom after winning an arena match, or after being released from jail), the walking distance (using the path network) to all of the release switches and the time that passed since the player's location was known last.  With that and a more or less arbitrarily chosen probability distribution for a player's distance from his starting point after a given amount of time (something based on half a Gaussian) bots take a random guess weighed by the respective probability of the enemy being at any of the possible switches.

==January 18, 2003==

Wrote about [[Legacy:A Bug'S Life|A Bug's Life]] hoping that it'll inspire our bug hunters to posting better bug reports than they occasionally did for Jailbreak III.

==January 23, 2003==

UT2003's speech menu redefines the terms &quot;non-extensible&quot; and &quot;hard-coded.&quot;  I'm sure there's a way into it though &amp;ndash; I just haven't worked it out yet.  (Subclassing [[Legacy:ExtendedConsole|ExtendedConsole]] is, hardly surprising, not an option.)

==January 24, 2003==

[[Image:Legacy_speechmenuhack-ordermenu.jpeg|left|]]

Apparently there ''is'' a way.  The &quot;Team tactics&quot; menu item here opens a submenu where you can select one of a set of tactics for your team.  (All other menu items open a list of players you can order.)

Getting it to display your own entries is the easy part, to be sure &amp;ndash; being notified when the player selects one of the entries requires some more code insight.  It is possible though, and I'm just about to implement it.

If this works out, I'll describe the hack in detail somewhere on the Wiki.

==January 25, 2003==

[[Image:Legacy_speechmenuhack-tacticsmenu.jpeg|right|]]

It works.  When you select one of the entries in the tactics menu displayed to the right, SetOrders in [[Legacy:TeamAI|TeamAI]] is notified and gets a chance to intercept the selection.  The default implementation of SetOrders puts the following message into the log:

  ScriptLog: Team New orders TacticsNormal JB-IronMan.xPlayer0

TacticsNormal is a label I assigned to that menu item; everything else in that message is from Epic's own code.  Any unwanted cosmetic side effects can be controlled by overwriting SetOrders with your own code.

There's relatively little code involved in the whole hack:  One piece of code that's executed in some actor's client-side Tick (I used Tick in our [[Legacy:HudBTeamDeathMatch|HudBTeamDeathMatch]] subclass, but it could be anywhere) that modifies the speech menu's behavior; and a piece of code that modifies some properties of [[Legacy:Bot|Bot]]s when they're spawned.  And, of course, the code in SetOrders in [[Legacy:TeamAI|TeamAI]] that does whatever you want your custom menu item to do.

Modifying the speech menu that way has its limitations, of course.  There are only very few &quot;slots&quot; left for custom notifications (exactly nine), and custom submenus like my &quot;Team Tactics&quot; menu are only possible for menu items in the &quot;Orders&quot; submenu.  Details to follow.

==February 3, 2003==

So little time, and so much to do... but I don't regret spending the last weekend skiing in Tyrol.  ;-)

[[Legacy:UMake|UMake]] should be updated and released in version 1.2.  [[Legacy:Spectate Bots|Spectate Botmatch]] has a host of new functionality to be implemented, despite Epic refitting a &quot;Spectate&quot; button in the Instant Action dialog with the last patch.  Deathball needs some small code tweaks on my part.  [[Legacy:Jailbreak|Jailbreak]] development must continue.  And in addition to that there's some Perl coding work I'll actually get paid for and whose deadline is approaching sometime in mid-February.

==February 10, 2003==

If you want to make ''absolutely sure'' that a certain thread in a forum remains undiscovered, stick it to the top and place the words &quot;Read this before posting&quot; in its subject.

==February 14, 2003==

Bots in jail (in Jailbreak) should idly walk around, occasionally lie down and sleep, and engage in hammer fights if there's an eligible opponent.

It seems to me that maybe the best way to achieve all this is creating several custom [[Legacy:ScriptedSequence|ScriptedSequence]] subclasses, one for &quot;walking around&quot; (to select roam destinations in jail only), one for &quot;lying down and sleeping&quot; and one for &quot;engage in jail fight (and stop when the opponent opts out)&quot;.  The latter two will probably require custom scripted ''actions'' too:  &quot;start sleeping,&quot; &quot;wait and occasionally snore&quot; and &quot;stand up&quot;; and whatever is required to make a bot attack an opponent with an arbitrary melee or non-melee weapon.

Sounds like I'll better release alpha 4 ''before'' tackling that...

==February 15, 2003==

UT2003 bots don't really support being animated by means of a [[Legacy:ScriptedSequence|ScriptedSequence]] &amp;ndash; even if you manage to make them play a certain animation, the [[Legacy:XPawn|xPawn]] reverts to an idling pose as soon as that animation has ended.  In addition, those idling animations are natively &quot;physics controlled.&quot;

What's possible though is temporarily resetting the ''names'' of the idling animations to refer to non-existent animations.  That's a pretty heavy-handed approach, but it works (and puts a bunch of warning messages into the log).

'''Update:'''  ZappyAd pointed me to the bPhysicsAnimUpdate flag in class [[Legacy:Pawn|Pawn]].  Setting it to False disables the native &quot;physics-controlled&quot; animations, and indeed, it works well.

==February 17, 2003==

Scratched sleeping bots.  Implemented bots that hammer-fight in jail with human players instead.  Much more fun and rewarding.

==February 24, 2003==

I figured out the hard way that even custom game types can't simply replace the game's [[Legacy:TeamInfo|TeamInfo]] actors by subclassing [[Legacy:XTeamRoster|xTeamRoster]].  One of our bug hunters reported that setting up a game with custom bots broke crucial parts of the gameplay, and a look into the log revealed that UT2003 didn't use Jailbreak's custom TeamInfo subclass as configured in the the game type's DefaultEnemyRosterClass variable but instances of [[Legacy:TeamBlueConfigured|TeamBlueConfigured]] and [[Legacy:TeamRedConfigured|TeamRedConfigured]] instead.

So, once more, I'm ending up ''attaching'' an actor of mine to a stock UT2003 actor instead of replacing the stock actor's class by my own.  Jailbreak did so with several other gameplay-relevant classes (not just TeamInfo) before already &amp;ndash; PlayerReplicationInfo, for one, instead of introducing a custom PlayerReplicationInfo subclass.

In Unreal Tournament &quot;attaching&quot; an actor to another actor was more or less limited to the possibility of setting the attached actor's owner to the actor it was attached to and then using the ChildActors iterator to retrieve the attached actor when requested.  (Or any variant of that, though those that come into my mind are all equally inefficient.)

In UT2003 however every actor can have its own inventory by means of the Inventory variable which is declared in class [[Legacy:Actor|Actor]].  Traveling an actor's inventory chain is fast and efficient compared to using an iterator, so I implemented a generic abstract superclass for info actors that are &quot;attached&quot; to another actor, including code that automatically sets up a linked list of all &quot;actor tag&quot; actors of the same class and a mechanism that, if so desired, communicates registration and unregistration of an &quot;actor tag&quot; to all clients even during its lifetime.

Well, anyway, the TeamInfo problem was quickly fixed thanks to that mechanism.

===Comments===

'''Wormbo:''' Actually the inventory chain was available to all actors in Unreal v205 already. (Yes, I really have that code here... :D)

'''Mychaeel:''' Hmm.  I don't, but I do have the Unreal Tournament sources and... behold, you're right.  Oh well.  :-)

==March 17, 2003==

When I was implementing a new feature yesterday I noticed that I had to change a remotely related part of the code in order to avoid some small lag in a visual effect &amp;ndash; no big deal, but something that deserved to be fixed.  So I opened the class responsible for the delay, found the place where I had not anticipated the need for some direct connection between two pieces of code in my original design, and added it.

Then I realized that this was the third or fourth time I had added a bit of code at that place to accommodate a new requirement that had popped up since I had initially designed that class.  Each time I had addressed a small particular problem, each time I had added a bit of code to fix it; and while each of those changes were small and simple, the whole code grew more complicated and less elegant with every change I applied to it.

Time to scratch that part of the code and rethink its design with all old ''and'' new requirements in mind.

Changing, fixing and tweaking code a small part at a time inevitably leads to bloated, unelegant, bug-prone constructions sooner or later.  That's commonly called [http://info.astrian.net/jargon/terms/f/feature_creep.html feature creep] &amp;ndash; and after a time any software suffering from it becomes so unmaintainable that adding, testing and debugging a new feature becomes almost as much work as rewriting everything from scratch.  It's a developer's nightmare.

So sometimes it really pays off to start redesigning parts of a program before feature creep sets in.  The difficult part is to realize that before it's too late; and even more so for people not directly involved in the development process who can't relate to the idea of elegant, straightforward and bug-resistant program design.  Coding for a mod whose development is being slowly ground to a halt by somebody in charge adding more and more features that were never part of the original design can be a pretty frustrating experience.

==May 4, 2003==

ElapsedTime and RemainingTime in [[Legacy:GameReplicationInfo|GameReplicationInfo]] aren't replicated all the time in [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] &amp;ndash; that's for saving bandwidth, I suppose, and that must be a good thing.

Bad thing is that it doesn't work too well.  The idea is that ElapsedTime and RemainingTime are replicated ''once'' when the whole GameReplicationInfo actor is initially replicated to the client, and then the client increases ElapsedTime and decreases RemainingTime once per second all by itself.  Sounds simple enough, but somehow the initial value replication doesn't seem to work &amp;ndash; and that's not just in Jailbreak, it's exactly the same in vanilla Deathmatch.  Consequently, the time display in the scoreboard is out of sync with the actual game time.

The programmer who thought that up at Digital Extremes or Epic must have anticipated some of those problems though, because it actually gets a bit more complicated than what I described above.  In addition to ElapsedTime and RemainingTime there's a variable called RemainingMinute that is replicated every time it is changed.  The Timer event in [[Legacy:DeathMatch|DeathMatch]] sets it to the current value of RemainingTime every full minute.  GameReplicationInfo in turn picks it up and copies the replicated value of RemainingMinute to the client's local RemainingTime, thus re-syncronizing RemainingTime with the game's actual time.

Since I'd like Jailbreak's spiffy game time clock in the scoreboard to show the right time at ''all'' times though I guess I'll have to look for a fix.

'''Update:'''  Two distinct problems there:  Firstly, the initially replicated value of RemainingMinute always resets RemainingTime to the last full minute on mid-game connect; secondly, there can be an almost arbitrary delay for precaching textures and other content between PostNetBeginPlay (when the values for ElapsedTime and RemainingTime have just been replicated) and the first call of Timer (where they're updated client-side).

==May 7, 2003==

...so in Jailbreak the client sends a replicated function call to the server which directly responds by sending another replicated function call back to the client along with the current server time.  The client calculates a time offset between itself and the server; and if it also takes the time into account it took the response function to be called on the client after the synchronization request had been issued, it's possible to synchronize client and server time to a precision of approximately a tenth of a second.

That happens once a client has finished loading and precaching the game.  [[Legacy:GameReplicationInfo|GameReplicationInfo]] only replicates the server time the match started, and determines ElapsedTime and RemainingTime based on the current client time and its offset to the server time.

===Comments===

'''Kuhal:''' I am interested in the replication behaviour you have discovered here.  It may lead to an explanation of some behaviour I am getting during a pause in a network game.  The client's countdown clock rapidly counts down the seconds that have passed while the match was paused.  While I am certain the remaining time on the server has indeed been paused, it seems that the client thinks it knows better and catches up.  The weird thing is that the game ends &quot;on time&quot; when the client ramaining time reaches 00:00.  Are there any more references to how these attributes work in UT?

==May 22, 2003==

&quot;All you can eat&quot; for 5 ? in the uni's cafeteria today.  Burp.

Jailbreak's [http://www.planetjailbreak.com/misc/jailbreak2003-scores-5.jpg?link scoreboard] displays a minimap showing the current locations of your teammates.  In network games that means that those positions have to be replicated to all clients.  That leads to jerky movement of the dots on the minimap because the locations are updated only every couple of frames, not every (client-side) frame.

That problem can be somewhat relieved by using the [[Legacy:Pawn|Pawn]]s' actual positions when they happen to be present on the respective client; but the other player positions still jerk.  Some sort of motion prediction or motion interpolation should be built in; and preferably in a way that does not multiply the bandwidth requirements of the whole separate location replication business &amp;ndash; my bandwidth conscience is striking already without that.  That rules out simply replicating the player's velocity along with their position.

Since the minimap is by design mini, the updates usually don't go beyond a movement of a couple of pixels each time; and it's more to show the players' rough current whereabouts anyway, not their precise locations.  Maybe an algorithm that &quot;learns&quot; about the frequency of the position updates and interpolates between the ''last two'' replicated known points (and beyond if the next update isn't received in time) might yield smooth and reasonably accurate results.

Unrelated to that I also wonder whether I should keep up the splines connecting the player names to their location dots on the minimap.  I'm starting to think that simply attaching a small tag with the player's name and possibly a health bar would be nicer.

==May 24, 2003==

The principle works, but the movement is still jerky.  Motion prediction doesn't work well because the time that passes between a replicated variable being set on server-side and its new value being received client-side varies wildly:  So even when the player is moving in a straight line at a constant velocity, the client-side predicted location has to be corrected with every update.

Now I'm pursuing a different idea &amp;ndash; adding the received location updates to a client-side list and trying to have the client interpolate along that list of locations, choosing its velocity independently as to keep up with the succession of new locations that are added to the list.

When the client-side interpolated location information reaches the last known location in the list and the player is not known to have stopped moving server-side, it extrapolates the player's movement using the last known direction and velocity.  That can even be used to save bandwidth:  The server only sends another update when it expects the client-side extrapolation to have deviated from the player's actual location too much.

==May 25, 2003==

To my mild surprise what I've implemented now works much better than I had dared to hope.

The server sends occasional location updates to all clients; and in addition to that, the absolute value of the player's movement velocity.  The ''direction'' of the player's movement is derived from the succession of location updates; as described in the previous entry it's impractical to derive the velocity as well from the location updates because time differences can't be relied upon when network replication is concerned.

Using the absolute value of the player's velocity instead of the velocity vector itself saves some bandwidth &amp;ndash; two thirds in the size of the replicated data item alone (vector consists of three floats, its absolute value of only one), and it's also much less likely to change (the absolute value remains the same even when the player changes his movement direction or strafes).

Still, with every location update there's bound to be a small deviation between the client-side extrapolated location and the updated absolute location sent by the server.  Client-side, that deviation is simply smoothed out on a short time scale &amp;ndash; that way the client-side motion simulation never suffers of any jerking motions, only small variations in movement speed which are virtually impossible to notice.

What I haven't implemented yet is the aforementioned optimization of location updates when a player keeps moving on a straight line for a while, thus making the client-side linear extrapolation sufficiently accurate even for longer periods between updates.  No actual player does that in a firefight, of course; but it's not all that unlikely to happen in general, especially given that without that optimization location updates would be sent with a frequency of about five times per second.

'''Update:'''  Reducing the number of location updates that way works fine as well.  When moving on a straight line several seconds may pass between two location updates while the client-side minimap location indicator still accurately shows the moving player's constantly changing location, smoothly picking up a later change in the player's movement direction.

==May 26, 2003==

Would it still be fun if there weren't always more problems awaiting a solution?

When reading my code again I realized that it wasn't at all robust against server-side updates that never reached a particular client.  While the mechanism doesn't rely on the time between two received updates anymore, it still assumes that the client gets to see every update the server sends &amp;ndash; and that may not necessarily be the case.  If the client misses one update, the client's idea of the player's movement direction will be completely off, especially since the server already sends only the minimum amount of updates that can be used to derive the direction.

So I have to make sure that the engine itself takes care that all clients always have a consistent set of information &amp;ndash; the engine must know that if a client misses one or several updates it is necessary to send the last ''two'' location updates to that client next time.  The easiest way to achieve that is by having two replicated location variables that are alternatingly set to the player's most current location &amp;ndash; the other one then contains the location one step earlier.

However, the problem isn't completely solved already by that.  Since those two variables (a two-element array, actually) are set alternatingly server-side (so that on each step only one of the values changes and has to be replicated), the client has no way to know which of the two replicated locations is the most current one &amp;ndash; and so it can only derive the axis on which the player is moving, but not whether the player is moving &quot;forward&quot; or &quot;backward&quot; on that axis.  The client needs one bit of extra information to resolve that ambiguity.

It's not as trivial as it may sound to derive a consistent notion of &quot;forward&quot; or &quot;backward&quot; for any given non-zero vector.  Simply trying to define &quot;forward&quot; and &quot;backward&quot; in respect to a certain fixed direction is ambiguous as soon as a vector is lying in the plane perpendicular to the chosen direction; so that won't work (or rather, it will, but only in ''almost'' all cases, which is unfortunately not enough &amp;ndash; Murphy knows).  So, the method I've chosen to define &quot;forward&quot; and &quot;backward&quot; takes the signum of the first vector component (X, Y, or Z, in that order) that is not zero &amp;ndash; that's guaranteed to be non-zero for any non-zero vector, and the resultant value changes its own sign when the vector does.

To sum it up, the client now has ''two'' replicated location values without knowing which one is the most current one; so it calculates the vector difference between those two and applies the notion of &quot;forward&quot; or &quot;backward&quot; on it (described above), checks it against the separately replicated bit of information sent by the server and changes the vector's sign if necessary.  And Bob's your uncle.  (See what Terry Pratchett does to one's vocabulary?)

But... wouldn't it have been much easier and just as effective if I had simply replicated an extra bit of information telling the client which of the two locations is the most current one, instead of laboriously introducing weird notions of &quot;forward&quot; and &quot;backward&quot; vectors? &amp;ndash; Easier it would be but not as effective.  That bit would have to be changed every single time the server does an update even if the player only made a slight correction in his movement direction; the method I've chosen only changes that bit when the player's movement direction changes from &quot;forward&quot; to &quot;backward&quot; (in the special absolute sense described above), so it only ''occasionally'' requires a change instead of ''always''.

'''Addendum:'''  I actually have it implemented by replicating that extra bit of orientation information as ''the velocity's signum'' &amp;ndash; in an attempt to save bandwidth when both velocity and orientation change at the same time (and it also wouldn't take any more bandwidth when the velocity alone changes).  Upon writing about it here it suddenly occurred to me that this maybe wasn't all that smart after all &amp;ndash; if ''only'' the orientation changes but the velocity doesn't, the engine still has to replicate an entire float value even though only a single bit changed.  Would it be more efficient to go the straightforward way and use a separately replicated bool variable?  I'll keep a close eye on which updates actually need to be sent by the server in a real-game situation and decide then...

(And that's also why writing in this &quot;developer journal&quot; is worth the effort even if nobody's actually reading it &amp;ndash; it makes me critically review what I've coded.  It's a one-person code audit, so to speak.)

==May 30, 2003==

So, at last, the scoreboard is feature-complete.  Phew.  I dread writing the log for the CVS commit and getting JDN up to date... but the sooner I start, the sooner I'll be finished.

Showing the Jailbreak scoreboard has a noticeable impact on framerate at the moment &amp;ndash; I haven't been able to spot a certain, single part of the code that's responsible for the majority of the framerate hit.  Disabling certain scoreboard elements one at the time shows that the clock takes as much performance as the dotted splines do, and the code that updates the scoreboard's state with the game's live information isn't far behind.  The performance hit seems to be evenly spread over most the code.

Especially something like the clock could benefit from some sort of graphics cache &amp;ndash; it changes only once per second, but has to be rendered every frame.  If I could draw the clock on a [[Legacy:ScriptedTexture|ScriptedTexture]] and then on the screen, and update the ScriptedTexture only once per second, that might save several milliseconds per frame... given that I'd manage to get alpha transparency to work on a ScriptedTexture; I wouldn't like the clock to be displayed on a rectangular black background, not even for performance's sake.

Maybe there is a way to use alpha transparency on a ScriptedTexture.  During my experiments around drawing a map screenshot on a ScriptedTexture for the scoreboard minimap I noticed that the ScriptedTexture's DrawPortal function did, somehow, alter the ScriptedTexture's alpha plane &amp;ndash; it seems that wherever DrawPortal renders a normal solid texture, the ScriptedTexture will be completely transparent, but where an alpha-masked texture is drawn on the ScriptedTexture by DrawPortal the ScriptedTexture adopts its alpha mask there.  It's all pretty strange.

I also remember that in Unreal Tournament a ScriptedTexture could have a &quot;background texture&quot; that was used to initialize the ScriptedTexture canvas every frame.  I haven't found a corresponding property in UT2003's ScriptedTexture class, but maybe it's reusing an inherited property for that purpose &amp;ndash; FallbackMaterial maybe?  Gotta try that when I'm home.

==May 31, 2003==

I've finally decided that the manual implementation docs I had put on JDN have outlived their purpose &amp;ndash; they originally were the detailed specifications for the code before UT2003 was released, but after the classes were actually created there's little point in still keeping the specs around and manually up-to-date.

I tried [[Legacy:UnCodeX|UnCodeX]]'s HTML export, and while it works fine, it's information overflow.  I think people interested in Jailbreak 2003 implementation details do better with syntax-highlighted source code alone &amp;ndash; I tried to document it well after all.

The Wiki script running JDN now supports an extra parameter for the &lt;tt&gt;&amp;lt;uscript&gt;&lt;/tt&gt; tag that directly takes the sources from the CVS repository and renders them on the page.  It looks pretty neat and saves me lots of time keeping the specs consistent with the code.  Maybe I'll later add a DHTML feature for &quot;collapsing&quot; function bodys to keep only the comment headers visible by default.

'''Update:'''  Oh, and FallbackMaterial as a [[ScriptedTexture]]'s background texture does not work.  Guess I'm out of luck.


==June 4, 2003==

I want to keep players from using their translocator to get out of jail the easy way, and I don't want them to be able to telefrag Bonus Pack monsters.

Unreal Tournament had a handy AllowTranslocation query function in [[DeathMatchPlus]] for that.  Whenever anybody, player or bot, tried to translocate, this function was called and had the opportunity to prevent the translocation attempt.

Unfortunately, there's nothing like that left in UT2003.  The only thing that remains is a function in [[SquadAI]] that's queried for whether a bot will try to translocate.  The code that prevents players from telefragging teammates is buried in the Translocate function in class [[TransRecall]] -- it's basically a hard-coded check whether two players' collision cylinders impinge.


The only ''possible'' way into this code is via the SameTeamAs function (class [[Controller]]) used there that in turn calls IsOnTeam (class [[GameInfo]]).  The game could pretend that monsters are on the same team as any player trying to telefrag them, but SameTeamAs is used by other parts of the game code as well, which makes (ab)using it to prevent monster telefrags not straightforward.

And it still leaves me with the question how to prevent players from translocating out of jail...

'''Update:'''  I've ended up with removing the translocator from jailed players' inventories.  It's not all that messy after all.

===Comments===

'''ZxAnPhOrIaN:''' Maybe make an actor or volume that kills the translocator beakon when you try to teleport out, killing the person.

'''ZedSquared''' (from a UT classic point of view, dunno if any of this is feasable in 2003) Have a spawnnotify that catches transloctargets and modifies their velocity to kick them back to the owner (or the middle of jail) if they're in the jail zone perhaps ... or maybe subclass translocator, give the modified one as default inv, and override the fire function to not work in jail ... probably duff ideas, just thinking aloud late at night :)

'''Mychaeel:''' I'd rather try not to replace the normal translocator to achieve the effect I'm looking for (plus, there's nothing like SpawnNotify in UT2003)... and I'd also like not to require mappers to put in special zones or volumes.  (Right now jails work with any volume or zone a mapper places -- [[match these tags|attaching]] them to a JBInfoJail actor makes them part of a jail.) -- I could simply take a player's translocator away when he enters jail and give it back when he leaves jail, but that seems a bit messy.

'''Foxpaw:''' I don't see the problem - can't you just disallow translocator use in jail like in Jailbreak for UT?

'''Wormbo:''' That's exactly the problem, there is no AllowTranslocation function like in UT which allows the gametype to prevent translocation or add various other effects like flagdrop etc.

'''Foxpaw:''' Well, in that case why not allow translocation in jail, and just have surfaces that make up the jail solid? That way the translocator beacon would not be able to be launched out of the prison so a player couldn't escape merely by translocating.

'''Mychaeel:''' That would be a mapper-based solution, but the past (Jailbreak III) has shown that even in jails that were meant to be airtight (and must have been in editor terms since there a jail was defined by a distinct zone) occasionally had collision &quot;gaps&quot; in them that allowed players to shoot or, possibly, throw a translocator target outside (JB-Raid).  Even if a jail really is airtight it may be possible to place the translocator target so that translocating to it will place the player outside jail (JB-Antipody).  Besides, some jails are meant to have open windows to the outside or escape routes that players should be able to walk, but not translocate through.


==June 6, 2003==

The Jailbreak core to-do list has become pretty short.  Maybe, maybe, in a few weeks...


==June 8, 2003==

BeyondUnreal's forum breakdown will leave Jailbreak's development forums completely empty when they're back up.  Most of the hundreds of postings in there I'd have liked to keep mainly to keep a history of Jailbreak 2003 development; but some of them were ongoing discussions and long-term documentation.

Unrelated to that, early this afternoon my personal computer at home broke down as well; that leaves the CVS server and Jailbreak Developer Network offline too.  Fortunately the data itself wasn't lost; just my computer won't work.  If I'm lucky it's only either the power supply or the mainboard.  The bad thing is that tomorrow is a holiday here, so I'll need to stick with this notebook as a temporary measure till I have a chance to buy replacement parts.

===Comments===

'''Tarquin:''' I'll do my best to remember what's been going on. [[Jailbreak rescue]]

'''Mychaeel:''' That's a great idea.

'''Tarquin:''' Maybe I shouldn't put code dev topics on a public wiki though. I can just scribble a text file, or on the JDN

'''Mychaeel:''' JDN is down along with my computer, I'm afraid.  Tahngarth has set up a temporary Core Dev forum at http://www.planetjailbreak.com/tempforum/ -- register there and meet Tahngarth or me in chat to get access.


==June 9, 2003==

After finishing some Perl coding work (which I'm actually getting paid for) I'll see that my computer is restored to working order or that I at least find out which component exactly needs to be replaced.

'''Update:'''  The computer boots up with an old PCI video card; but as soon as I replace it by a AGP video card (either my current GeForce 4400 Ti or an older GeForce 2 MX), I only get either a strange creaking sound from the PC speaker or nothing at all.  Only the fans work.

A friend of mine who's professionally dealing quite frequently with broken PCs suggests that it might be either the power supply that doesn't manage the AGP cards' load anymore, or the mainboard for some reason doesn't like AGP cards anymore.  Unfortunately I don't have a spare ATX power supply at hand, so I won't be able to test that theory until tomorrow at the earliest.

In case it's the mainboard I'll at least use the opportunity to upgrade my old Athlon 800 MHz to whatever it is you can currently still get in a regular computer hardware shop -- apparently it's hard to find anything slower than 2.0 GHz nowadays.


==June 10, 2003==

My computer is up and working again.  I was surprised that for not more than about 180 ? I got a new processor (Athlon XP 2000+) along with a mainboard, silent cooler and memory (512 MB).  I could even keep my previous 235 W power supply.  By accident the processor is currently underclocked to 1.25 GHz (its normal clock rate would be 1.67 GHz) -- I'm not even sure whether I can be bothered to open the case once more and set the jumpers correctly.

So far the system seems to be stable.  Time will tell.


==June 11, 2003==

Bots should simply try to avoid being killed when &quot;evasive&quot; team tactics are selected.  (Useful when a team has a narrow lead shortly before the time limit runs out.)

I got that to work reasonably well with relatively little effort, code-wise:  Set the bots' aggressiveness to a really low value to ensure they don't feel inclined to engage in fights; then overwrite PickRetreatDestination and make it react in a suitably cowardly manner if the bot is seeing an enemy.  Right now they simply pick the [[NavigationPoint]] among their current MoveTarget's [[ReachSpec]]s that's farthest away from the enemy, or the closest one that provides cover.  Effectively that makes bots run away from an approaching enemy and make turns in order to move out of the enemy's firing line.

While it's fun (for a while) to chase bots around in a test map, I've come across one or two situations where bots are effectively stuck and too easy a prey to approaching enemies.  First I'll have to have bots detect this; then I'll have to have them react to it suitably, for instance by either simply choosing another way out or by acting like a cornered beast and falling back to normal dogfighting tactics until they're either dead or the threat is gone.  (Tomorrow more -- I'm tired.)


==June 13, 2003==

I found one reproducible situation in which bots are stuck in a tight loop of pathnodes they visit:  A bot sees an enemy, turns to flee, runs into cover; arrived there it wonders what to do next and decides to go on an inventory hunt, which leads it back into the enemy's sight -- ad inf.

The bad thing is that bots (or rather the native function FindBestInventoryPath in [[Controller]]) are not smart enough to check whether they even have the chance to pick up the inventory when they've reached it -- otherwise they wouldn't even try to reach it more than once in a row, and my problem would be a non-issue.


==June 14, 2003==

A comment in [[Bot]] hints that Epic meant to add a function called FindPathAwayFrom at some time -- alas, they didn't yet.  That leaves me with either sticking to my simple escaping algorithm from above (and its flaws) or creating a path finding function myself, in UnrealScript.

I've started giving the latter a try.  The idea is to recursively search the path network for [[NavigationPoint]]s that provide cover from the enemy, starting at the bot's current MoveTarget.  Some first test runs seem to indicate that it works, and it seems to have negligible impact on the performance so far.  (The Clock/UnClock mechanism described on [[Code Optimization]] proves pretty useful for such profiling.)

'''Update:'''  If a bot doesn't find cover nearby and realizes that the enemy must have seen it (because it isn't looking the other way right now), the bot panics and reverts to normal attack mode until the enemy is dead or out of sight.  I've put all that into CheckSquadObjectives now, and it seems to work pretty well testing it with a single masterful bot.


== June 16, 2003==

Hmm.  Why on earth does the game rules tab maintain its settings in separate config variables instead of taking and storing them in the game type's own configuration?


== June 17, 2003==

Why does filling the mutator list box on the &quot;Mutators&quot; tab involve two other separate classes?  Why is reading a list of available mutators a native function?

=== Comments===
'''Wormbo:''' I guess it's supposed to speed up loading of mutator classes, but it's not really that much of a boost compared to the &quot;old&quot; GetNextInt(Desc) method because now the mutators' code packages have to be loaded in order to find the mutators' names, descriptions and groups.

'''Mychaeel:''' I wonder whether that native function (GetMutatorList in [[xUtil]]) does indeed load the mutator name to get the mutator name and description -- a comment says it does ''not'' fill in the MutClass element of the MutatorRecord structure, which would make little sense if the class is loaded anyway.  (Unless GetMutatorList was internally &quot;optimized&quot; only to look up the class's default properties without loading the class; but I'd be a bit sceptical as to the wisdom of ''that'' optimization.  But maybe it has to do with cheat protection validating all loaded code...?  Gah.) -- There's an UnrealScript function LoadClasses in [[xMutatorList]] that would load the mutator classes, but it doesn't seem to be actually used.

'''Wormbo:''' It's not the only questionable optimization. (Still remember &quot;&lt;code&gt;// FIXME THIS SUCKS&lt;/code&gt;&quot;?) [[GUIController]].GetWeaponList also is a native function and it definately loads and returns weapon classes. I can't see any real optimization over Unreal's or UT's code here.


== June 18, 2003==

I'd like to intercept when somebody is clicking on a checkbox -- not just the part with the check mark but its label.

It took a while until I figured out that the bAcceptsInput flag must be set to True for any of a [[GUIComponent]]'s delegates to be called.  (Mmph.)


== June 23, 2003==

The OnDraw delegate is called for custom [[GUIPanel]] subclasses but not for direct subclasses of its parent class, [[GUIMultiComponent]].  Does that have a deeper sense or did just somebody forget to add a call to the delegate in [[GUIMultiComponent]]'s native Draw implementation?

'''Update:'''  Is it just me or does setting the TextFont property in [[GUILabel]] (and, thus, the LabelFont property in [[GUIMenuOption]]) have no effect at all?  (Obsoleted by the introduction of [[GUIStyles]] maybe?)  All labels in the game seem to have the same font, even those where Epic's own UnrealScript code decrees otherwise by setting TextFont.


== June 28, 2003==

This one has me baffled (in a [[WebApplication]] subclass):

&lt;uscript&gt;
function QuerySomething(WebResponse WebResponse) {
  local string ResultTemplate;
  ResultTemplate = &quot;should be overwritten by the next statement&quot;;
  ResultTemplate = WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
  }
&lt;/uscript&gt;

Now I'd expect ResultTemplate to contain the result of parsing the file something.inc... right?  And so it does, but '''appended to the previous value of the variable.'''  The resultant value of ResultTemplate is something like this:

  should be overwritten by the next statementContents of something.inc

Is that an engine bug?  Some arcane feature?  How can using LoadParsedUHTM on the right side of an assignment change the way the assignment operator works (given that the return value of LoadParsedUHTM is a mere string)?

However, the following workaround solves the problem:

&lt;uscript&gt;
  ResultTemplate = &quot;&quot; $ WebResponse.LoadParsedUHTM(&quot;something.inc&quot;);
&lt;/uscript&gt;

Trying to cast the right side to string in an attempt to do the same ironically yields a &quot;No need to cast StrProperty to itself&quot; compiler error.

==July 3, 2003==

Working on an HTML parser and formatter in UnrealScript again.  This time it'll be standalone and not part of [[Legacy:Screen|Screen]], even though I intend to use it for that end as well; and this time it's possible to use it on both [[Legacy:ScriptedTexture|ScriptedTexture]]s and a regular [[Legacy:Canvas|Canvas]].

I hope I'll get around to implementing tables and floating images as well this time.  The base architecture I'm currently designing and coding takes the requirements for those features into account already, so it should be straightfoward to even follow W3C's specification of [http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 calculating the width of columns] according to the standard.

==July 5, 2003==

The native Split and Divide functions turn out to be extremely handy for the kind of text parsing I'm doing at the moment.  (But I still want my native regular expression support in UnrealScript... mmph.)

===Comments===

'''El Muerte TDS:''' Nah, regular expression suck for text parsing, they are only useful for match (and replace). Using a [[Legacy:Tokenizer|tokenizer]] is much better for text parsing. It would be better if the native tokenizer was available in uscript.

'''Mychaeel:''' I dare say that depends on how you'd use regular expressions.  The _nextToken function in your tokenizer could be formulated much more efficiently using regular expressions, for instance.  (Though I agree that the availability of regular expressions might lead some people to creating terribly inefficient parsers.)

For that matter, my prime concern about this HTML parser is its performance, so parsing through the input stream character by character in UnrealScript is something I'm determined to avoid.  (The first version of [[Legacy:Screen|Screen]]'s ScreenSlidePage HTML parser did that, and it was slow as hell for anything exceeding ''very'' few kilobytes of input text.)

==July 6, 2003==

The HTML parser works like a charm since yesterday and nicely dumps the structure of a parsed HTML file, though I haven't made any performance evaluations yet; but in any case there's even some potential for optimization still (like identifying a tag's handler class by something faster than the sequential search I've settled for until the rest works, like binary search &amp;ndash; did I mention that native hash support would be a great addition to UnrealScript too?).

===Comments===

'''El Muerte TDS:''' There is a type called map, but it's only native atm (just like dynamic array used to be).

==July 9, 2003==

As usual it's not the ''normal'' case that makes implementing something a challenge; it's the ''pathological'' cases that do.

The obvious step after implementing an HTML parser is creating a formatter for the parsed HTML element tree.  The old one I made for [[Legacy:Screen|Screen]] (one of my first UnrealScript projects altogether) has no concept of tables or floating boxes, but this time I'm determined to add support for those and so I have to deal with the conceptual odds and ends that come with it.

A floating box is actually a pretty straightforward concept:  It's a rectangle that's placed at the left or right edge of the containing box starting at the vertical position of the text line it's defined in.  That technique is most commonly used to have text flow around an image on a website.

Normally, a web designer adds floating elements at the very start of a paragraph so the boxes are placed already when the formatter starts wrapping lines between them.

The beginning of a paragraph is, however, not the only valid place for floating boxes:  They can just as well be defined in the middle of a line, and that's where the trouble starts.  As long as the current line is short enough to fit next to the box, everything is still fine; just add the floating box and shorten the line box accordingly.

But what if the floating box is too wide to fit next to the text line where it's defined in?  The HTML standards document says that the box is then to start directly ''below'' the line it is defined in; that's simple enough to implement... but subsequent text after the definition of the floating box is still to be added to the very same line ''above'' the box, and according to Murphy's law somebody is bound to have some item in that line after the floating box definition that increases its line height.  That means, basically, that the absolute position of the floating box may not be completely determined at the time it is added.  Consequently, it may be necessary to shift the box down ''after'' it has been rendered.

==July 14, 2003==

I just realized that I failed to enter [[Legacy:UMake|UMake]] for the contest.  Ah well &amp;ndash; it sorely needs an update anyway given the huge list of pending fixes and improvements, and there's a lot of time till the deadline of phase two.

It's a bit of a pity that [[Legacy:MeshMaker|MeshMaker]] isn't eligible.  It might have had a chance to win something.

===Comments===

'''Haral:''' FYI, the deadline for the contest is tomorrow.  You can still enter, I do think.

'''Mychaeel:''' It is?  Well &amp;ndash; hardly enough time to give it the overhaul it deserves unless I was ''really'' desperate to enter it in phase one, but since there are two more phases to go, I think I'll just target phase two for now.  But thanks for the correction.  :-)

'''Haral:''' Those were my sentiments as well.  There's a lot of work to do on my mod, playable as it might be, before I'll feel it's ready for any sort of release.  Thanks for moving that comment btw, my brain doesn't exactly work well while I'm at work.  Anyway, time to get back at it, if I want to be ready by October.

==July 16, 2003==

Trying to read a binary file in UnrealScript.

The LoadParsedUHTM function in a freshly created [[Legacy:WebResponse|WebResponse]] object does well enough for text files, but I ran against a fundamental problem of UnrealScript's string data type here:  Obviously it's not as high-level as it should be in a language like UnrealScript and doesn't handle embedded null bytes (&lt;code&gt;Chr(0)&lt;/code&gt;) well.  A null byte terminates a string for all UnrealScript-related intents and purposes; so the content of the binary file I read is clipped off after a few bytes when the first null byte appears.

The only solution for that I can currently think of is briefly opening a TCP link from the game to itself, serving the binary file using the IncludeBinaryFile function in WebResponse and receiving it with a simultaneously spawned [[Legacy:TCPLink|TCPLink]] in binary mode.  But that's not only quite cumbersome, there's also a chance that some people's personal firewalls might complain about it (even though it's nothing but a local intra-process connection)...

===Comments===

'''Wormbo:''' AFAIK Quake 3 only works like this, even a single player game connects to a local game server, and when playing a skirmish game with open slots other players could join it, expanding it to a network game.

'''Nytro:''' I ''think'' this now constitutes more than &quot;short thoughts that popped up during Jailbreak development.&quot; o_O

'''Mychaeel:''' You're right.  I've scratched the &quot;short&quot; part in the description.

'''Nytrogen:''' I hate to continue to bother you... I don't own UT, and I can't find a decent description of [[Legacy:Screen|Screen]]. Would you mind giving me a link or quick 'Screen overview' blurb?

'''Wormbo:''' You just linked to it. There are links to the Screen website and forum. You should find any information you need there.

'''Birelli:''' Specifically the &quot;about&quot; page: http://www.planetunreal.com/screen/about.html on the Screen website.

==October 1, 2003==

This morning I officially handed in three copies of the physics diploma thesis I had been working on for the last year (and which had kept me off anything Unreal-related for the last two months).  For those interested, it's about ''Metal-Induced Crystallization of Silicon-Germanium Layers'' &amp;ndash; fundamental research for the next ('third') generation of solar cells which will be far more efficient and much cheaper to produce than what's currently on the market.

Well.  ''[takes a deep breath]''  This concludes more than half a decade of studies of mine at the Technische Universität München (I recently learned that they attach great importance to not being called &quot;Technical University Munich&quot; or something like that even on the cover sheet of English-language publications such as my thesis).  I guess it'll take a couple of days until I have really, deeply grasped the significance of this.  Right now, I'm mostly just relieved, happy, and tired.

One thing is sure, though:  I'm ready to get back into the Unreal community.  Even though I had been preoccupied by other things, I've really missed it.  :-)  It'll take me a few days to catch up, however, and there's also a lot more in my life which somewhat suffered during the last few weeks and which I have to catch up with, so be gentle.

===Comments===

'''Sobiwan:''' Solar cells: nice.  Enough of this fossil fuel baloney.  I hope your thesis helps push research and/or development further.  

'''Tarquin:''' Yay! Welcome back Mych. Good work saving the planet :)

'''El Muerte TDS:''' heh, it's not like this is the only planet we have ;) About the uni name, ofcourse they want it to be the german names, the english name is too easy to write, it doesn't have ä and ü. They want you to put effort in typing the name.

'''Mychaeel:''' Well, I got a German keyboard here, so effort is not an issue. &amp;ndash; The [http://www.wsi.tum.de/E25/research/theses.htm Walter Schottky Institute] where I worked, on the other hand, does not have any problems with officially allowing the English name ''Walter Schottky Institute for Fundamental Research in Semiconductor Electronics''. &amp;ndash; But then again, its name doesn't have any äs and üs in it, so your argument still holds.  ;-)

'''Tahngarth:''' Well I hope you get an A (or whatever the best grade is) :)

'''GRAF1K:''' Good, NOW GET TO WORK ON JAILBREAK!!! :P Glad you're back. :-) 

==March 1, 2004==

''* Mychaeel blows the dust from his developer journal, opens it and continues writing.''

Just checked in some actual, new, original Jailbreak code again yesterday.  Quite an elevating feeling.

It's a facility for our audio announcements.  We noticed that the number of distinct announcements grew exponentially as we thought of more and more situations in which one would make sense.  Some documentation of the system is available on [http://www.planetjailbreak.com/jdn/JBSpeechClient JDN: JBSpeechClient].

===Comments===

'''Tarquin:''' Wow! :) Looks cool!

==April 1, 2004==

Short of a few rather small features and known bugs, Jailbreak 2003 is finally feature-complete.  Yay!

The transition from UT2003 to UT2004 has put a big item on our to-do list again, though.  Epic has broken source code compatibility on several places, and other problems seem to stem from binary incompatibility (the &lt;code&gt;Ping&lt;/code&gt; variable in [[Legacy:PlayerReplicationInfo|PlayerReplicationInfo]] suddenly transmogrified from an int to a byte, which breaks the score display in our scoreboard).

It's strange, yet interesting and somewhat impressive, that UT2004 manages to load and run the game anyway.  At the surface, Jailbreak 2003 runs well under UT2004 already, even though it ''looks'' like Jailbreak 2003, at least HUD-wise.  Of course we're going to make Jailbreak 2004 blend in with UT2004 as well as Jailbreak 2003 does with UT2003.

If possible without too much pain I'd very much like to release Jailbreak 200x as a combined UT2003/UT2004 release.  The changes are small enough that it would be a shame to abandon all UT2003 users who didn't have the chance or the money to upgrade to UT2004 yet.

I'm looking into the details of [[Legacy:CVS|CVS]] branching right now.  Our &quot;main line of development&quot; will become UT2004, but we'll keep a UT2003 branch and take care to merge any generic changes into it.  ...if that works the way I hope it does.

==April 23, 2004==

The Jailbreak to-do list is empty, and I'm out of work.  (You bet.)  Guess it's beta time now.  Yay!  :-)

Currently working on a Perl script that automatically updates all required modules from CVS, checks for uncommitted changes, rebuilds them if necessary and automatically creates the distribution packages.  I hope to be done with that sometime tonight.  My girlfriend made us a spiffy installer logo &amp;ndash; I'm looking forward to hearing what the others say about it...

===Comments===

'''Corran:''' That's great news (for us anyway :D).  I can't wait for this.

'''GRAF1K:''' What he said. My mouth is watering. :D

BTW, did you know that UW is integated with the UT2004 UDE? Click on the Documentation tab in the code editing area and and there's unDox and Unreal Wiki. Sweet. :)

'''Corran:''' Yeah, it's been integrated into WotGreal fo a while now.

'''GRAF1K:''' Who cares about WOTgreal... UDE is official. :D

'''DJPaul:''' WOTgreal ''is'' the UDE.

'''Guest:''' Like the core of the application changes anything whatsoever... O_o

'''Wormbo:''' c-24-7-171-253.client.comcast.net (Guest above), will you ''please'' stop deleting Murphy from this page?

==May 17, 2004==

Let it never be said again that modifying the mid-game menu in UT2003 requires a custom [[Legacy:PlayerController|PlayerController]] subclass...

[[Image:Legacy_mychaeel-ut2003midgamemenu.jpeg|center|]]

==May 19, 2004==

I'm practically out of ideas what else could be added to Jailbreak &amp;ndash; almost time to release now...

Last thing we implemented were custom loading screens &amp;ndash; it's actually pretty straightforward to replace the default images displayed while a map loads by custom ones at runtime.

We've even managed to create one loading screen per bundled map and have the corresponding screen shown when the map loads &amp;ndash; and I've added a means for mappers to [http://www.planetjailbreak.com/jdn/Loading_Screen embed a custom loading screens into their map] which is displayed when that map loads.  Given that the necessary information is all there and is just being ignored by UT2004 stock code, I wonder why Epic didn't do that themselves...

===Comments===

'''GRAF1K:''' Epic wanted to include their uber-1337 Photoshop lensflares though! ;)

Looks like a ''very'' nice release coming up from you guys over at Jailbreak. I'd count off the minutes if I only knew when...

'''Note:''' I am indeed the M*rphy killer. Buggy 3rd-party software... :pissed: I'll get it fixed. For now though, I can't even replace the M*rphy's once I've killed them. Just revert once you see this.

'''Mychaeel:''' Argh... what kind of bug would ''specifically'' replace occurrences of the string &quot;Murphy&quot; in a text...?  o_O

'''GRAF1K:''' Well, it's not the bug directly that's doing that. The bug is me not being able to turn the feature off. The feature in question is a privacy feature that blocks sending of personal info (like the owner's name).

'''Mychaeel:''' So is it safe to deduce that your name is Murphy?  (Way to go for a privacy feature... :-p)

'''GRAF1K:''' LOL. I was going to disable that feature anyhow. The app does a lot more than that. Besides, my last name isn't Mürphy, but the account is under someone who's is. :)

==May 20, 2004==

Naturally, any display of hubris such as making the statement &quot;I'm out of bugs&quot; angers the Gods, so the to-do list has a few more now.  Fortunately, they're all pretty small yet, and I'm out to squish them before they get any bigger...  ;-)

==May 23, 2004==

You have no idea how glad I am that we're making a UT2003/UT2004 release of Jailbreak &amp;ndash; if only for the reason that on both my desktop computer and my notebook with their measly 512 MB of RAM starting UT2004 (or even UT2004 server and client at the same time) takes ''ages'' while the system swaps like crazy &amp;ndash; and loading UT2003, even server and client, works without any swapping at all.  UT2004 is a monster...

===Comments===

'''El Muerte:''' I don't have any swap issues when running UT2004 on my laptop (512MB ram). Haven't done much client+server testing, but the client takes quite some time to join the server (/me blames slow laptop HD). On my desktop I can run a server and two clients without any serious problems (1GB ram). I think windows is to blame :P

==May 27, 2004==

Jailbreak is out.  We assume full responsibility for all bugs that were left in.  :-p

Seriously though &amp;ndash; everything went reasonably smoothly, and while there ''are'' some bugs we'll have to fix, nothing really serious has popped up yet.  Feedback is very positive; feels good.  :-)

I've submitted Jailbreak 2004 for the MSU contest.  Perhaps we'll win something.

==May 29, 2004==

There's a known issue in UT2004 which prevents anybody who ever selected a third-party gametype in the server browser from joining any other game of a different gametype.

This happens since, when a gametype is selected, its [[Legacy:GameInfo|GameInfo]] class is loaded and its static FillPlayInfo function is called.  After adding its settings to the [[Legacy:PlayInfo|PlayInfo]] object, the GameInfo class remains loaded in memory (probably because it's somehow still referenced by the PlayInfo object and thus cannot be garbage-collected), and when the player tries joining a server running a different gametype, that'll fail because the third-party gametype's package is still loaded.

I haven't been able yet to find out ''why'' exactly FillPlayInfo is called at this point by the server browser and which part of the code does anything with the data saved in the PlayInfo object referenced by the &lt;code&gt;FilterInfo&lt;/code&gt; variable.  However, simply avoiding to actually add anything to the PlayInfo object seems to solve the problem without any noticable side effect, so the following chunk of code makes everything work as it should:

&lt;uscript&gt;
static function FillPlayInfo(PlayInfo PlayInfo)
{
  local UT2K4ServerBrowser UT2K4ServerBrowser;

  // check whether we are called from a server browser
  foreach Default.Class.AllObjects(Class'UT2K4ServerBrowser', UT2K4ServerBrowser)
    if (UT2K4ServerBrowser.FilterInfo == PlayInfo)
      return;  // ignore because called from server browser

  // now do the usual stuff
  Super.FillPlayInfo(PlayInfo);

  PlayInfo.AddSetting(Default.GameGroup, ...);
  PlayInfo.AddSetting(Default.GameGroup, ...);
}
&lt;/uscript&gt;

==May 31, 2004==

While fixing some netcode I found out that in one of my classes a certain variable was constantly, over and over again, replicated to all clients &amp;ndash; several times per second; that class had &lt;code&gt;bNetNotify&lt;/code&gt; activated, and PostNetReceive was called every other tick.

What baffled me was that this variable wasn't even changed server-side; nor did it change on client side.

It took me a while to find out what was happening:  This variable which was replicated over and over again was a [[Legacy:Pawn|Pawn]] reference.  As soon as the Pawn it pointed to was destroyed, the variable was duly set to &lt;code&gt;None&lt;/code&gt; on both server and client &amp;ndash; but the server kept replicating its value to the clients.  And at the end of the day, the follwing slightly weird piece of code fixed it all:

&lt;uscript&gt;
// fixes replicating over and over when referenced actor has been destroyed
if (PawnObjectiveGuessed == None)
  PawnObjectiveGuessed = None;
&lt;/uscript&gt;

The Unreal engine is full of mysteries...

===Comments===

'''Mysterial:''' That works because UnrealScript returns &lt;code&gt;None&lt;/code&gt; when accessing a property pointing to an [[Legacy:Actor|Actor]] with bDeleteMe == true. Internally, the [[Legacy:Actor|Actor]] is in fact still referenced by that property until the [[Legacy:Actor|Actor]] is truly deleted. It getting continually replicated might be a bug in the engine. Can you try to create a small reproduction case and send it to me?

'''Mychaeel:''' Will do.  :-)

'''Mychaeel:''' Hrmph... making a simple test case is not as straightforward as I thought.  Then again, if it was an obvious bug, it probably wouldn't be in there...  ;-)

==May 31, 2004==

Argh!  People report server crashes, and every single crash log has the following lines at its end:

&lt;pre&gt;
  Critical: UObject::ProcessEvent
  Critical: (JBCameraArena JB-Heights.JBCameraArena, Function Jailbreak.JBCameraArena.Tick)
  Critical: AActor::Tick
  Critical: TickAllActors
  Critical: ULevel::Tick
  Critical: (NetMode=1)
  Critical: TickLevel
  Critical: UGameEngine::Tick
  Critical: Level Abandoned Heights
  Critical: UpdateWorld
  Critical: UServerCommandlet::Main
  Exit: Executing UObject::StaticShutdownAfterError
  Exit: Exiting.&lt;/pre&gt;

That Tick event in question doesn't do anything special that I'd be aware of &amp;ndash; it certainly doesn't destroy the actor or anything like that.  And I cannot reproduce it at all in a local client/server testing environment, and it only happens infrequently on other servers anyway.

There may be one thing:  The Tick event calls a function within an [[Legacy:Editinline|editinline]] object (which was created along with the JBCamera actor as a [[Legacy:Subobject|subobject]]).  Perhaps, when JBCameraArena.Destroy() is called, that subobject reference somehow becomes invalid and crash-prone under certain circumstances?

: '''Update:'''  I just found out that all my JBCameraArena actors '''share the same subobject''' &amp;ndash; unlike what I expected, seeing that spawning [[Legacy:Emitter|Emitter]] subclasses creates ''distinct'' instances of their [[Legacy:ParticleEmitter|ParticleEmitter]] subobjects.  While I'm not sure whether that's responsible for the crashes, it's definitely not what I had in mind and it's a bug when more than one JBCameraArena is active at the same time.

To make it worse, those error messages don't really indicate what ''kind'' of error happened (the lines preceding them are different and nothing out of the usual in every case &amp;ndash; such as players joining or leaving; unfortunately I have no indication whether there's a temporal relationship between the events logged before the error and the error, but I believe there's not).

Is there anyone out there with Unreal-engine insight who might be able to tell me which kinds of errors would trigger those server log messages?

==June 2, 2004==

Phew.  The Jailbreak server crashes are '''fixed''' (and stress-tested successfully on MyUnreal's ever-full server), and so are the &quot;web admin does not come up again after level change&quot; and &quot;server does not react to UDP requests after a while&quot; bugs.  Those were the toughest ones to crack, mostly because I was fixing in the dark; the others were, while partly annoying, peanuts.

In retrospect it seems that the latter two bugs stemmed from the engine not fully cleaning up the previous level; and that, in turn, was apparently due to my storing some actor references in the ''class default'' values of a class &amp;ndash; I did that only to compare the stored references to given ones for caching a function's return value over subsequent calls.  Even if the actors were destroyed between two calls, I'd expect a comparison simply to fail.

After I worked around that problem (by storing the actors' locations in the cache &amp;ndash; in this case that worked just as well), suddenly those both bugs (web server not coming up again, UdpGameSpyQuery failing to bind its port after a while) were gone all by themselves.  So, note for the future:  '''Never store actor references in default properties!'''

===Comments===

'''Foxpaw:''' That's interesting. I've stored actor references in default properties lots. (For instance, any actor can get a reference to the level's backdrop in my case by accessing class'Base.Backdrop'.default.Reference. Perhaps this behaviour is limited to certain classes?

'''Mychaeel:''' Perhaps, but I don't think so.  The effect of doing that is hardly noticable in local testing conditions, in any case (otherwise I'd have seen it a lot earlier) &amp;ndash; as I wrote, the most noticable effect was that the web admin [[Legacy:WebServer|WebServer]] didn't get cleaned up on level change and that &amp;ndash; after many level changes &amp;ndash; a server just didn't respond to UDP requests anymore.  Otherwise, everything worked great.

'''Mysterial:''' Since classes are non-Actor objects, the usual issues with storing [[Legacy:Actor|Actor]] references in them apply. I'm somewhat surprised it didn't crash. Perhaps because the engine doesn't actually destroy the class objects as it would most other objects you'd store references in, since you're playing another Jailbreak game so it wouldn't ever unload the resources.

'''Mychaeel:''' Frankly, I wasn't ever aware of &quot;the usual issues&quot; with storing Actor references in non-Actor objects &amp;ndash; Jailbreak code still does that on several occasions ([[Legacy:LevelInfo|LevelInfo]] and [[Legacy:TeamInfo|TeamInfo]] references in the non-Actor objects which represent the small player icons on the HUD, and in at least one other place too).  Are you saying that referencing an Actor from a non-Actor object is always crash-prone and not supported by the engine?

'''Mysterial:''' [[Legacy:Actor|Actor]] references in non-Actor subclasses don't get automatically cleaned up by the engine, so they work just like C++ pointers in that accessing them after they've been deleted has horrible, unpredictable effects (generally crashing). Additionally, since part of garbage collection is traversing every object reference property that exists, you need to clean up any such references before a level change or you'll either get frequent serialization crashes or prevent the previous level from unloading, creating huge memory leaks, as you unfortunately found out.

==June 8, 2004==

With the stress of releasing Jailbreak over, I'm free to look into some of my old mutator ideas again.  One of them is '''SprayPaint''' &amp;ndash; a simple idea actually, borrowed from Half Life where the ability to spray-paint your clan logo on walls was built-in functionality.  I want to port that idea to UT2004.

This would be pretty straight-forward and quite uninteresting if I hadn't put it into my mind that it should be possible to customize the spray-painted images by simply dropping a BMP file (1-bit, 64x64 pixels) into a directory; and, if that's done by a client in a network game, all other clients should be able to see the same image too.  The latter is just some replication acrobatics; the former is where I saw my challenge.

Reading arbitrary files in UnrealScript isn't really supported, but if you need to do it for text files, instantiating a [[Legacy:WebResponse|WebResponse]] object and using its LoadParsedUHTM function works quite well.  However, UnrealScript strings aren't binary safe &amp;ndash; null bytes act as end-of-string tokens and thus cannot be included in a string.  Attempting to load a binary file such as a BMP image with LoadParsedUHTM results in a byte string truncated at the first null byte.

I've worked around that problem now by spawning a local [[Legacy:WebServer|WebServer]] listening on a random free port, delivering files as &quot;application/octet-stream&quot; with WebResponse's function IncludeBinaryFile, and a [[Legacy:TcpLink|TcpLink]] operating in MODE_Binary to receive the binary data from the local web server.  In theory this setup is able to read the contents of any binary file within the UT2004 directory hierarchy into an UnrealScript byte array, and it's working great for my purposes.

===Comments===

'''EntropicLqd:''' Can you see outside of the UT2004 directory structure with that technique?  Cunning solution btw

'''Mychaeel:''' Frighteningly enough, I can read ''any'' file that way.  (I had actually &amp;ndash; and perhaps naively &amp;ndash; assumed that the IncludePath in WebResponse would not allow UnrealScript code to travel beyond the UT2004 base directory...) &amp;ndash; Perhaps it'd be best to let Epic know about this and to remove this last &quot;Developer Journal&quot; entry for the time being...

'''EntropicLqd:''' I'd definitely let Epic know about it (I guess you have already).  Allowing access above the 2K4 root directory is an astonishing lapse on Epics part.  I was expecting a ''ho ho ho ofcourse not'' response.  Wonder if you could write a remote file browser...

'''Mychaeel:''' Without having a way to generically get full directory listings, I'm afraid (or rather, glad) that's not possible &amp;ndash; [[Legacy:StreamInterface|StreamInterface]] only provides a way to list directories (and a limited set of other file types, though I haven't been able to get that to work for anything except said directories and .mp3 files).

'''Mychaeel:''' The LoadParsedUHTM method works on any file on a given partition too, given the right IncludePath setting (e.g. &quot;C:/&quot;) in a subclass and without all the local web server hassle.

'''Mychaeel:''' I've sent a mail to Joe Wilcox.

==July 12, 2004==

Jailbreak 2004 is one of the gametype finalists in the MSU contest.  That's nice and I hope we'll win something too, but I find it more notable that Jailbreak got a honorable mention in the &quot;FPS Mod&quot; category.  I didn't check that box when I entered Jailbreak 2004 into the contest; it must have been the judges' decision to put it there too...

In completely unrelated news, I've been turning some of my spare attention to attempting to write a couple of extensions for Thunderbird to make my life easier (on the long run; you know, that &quot;impatience, hubris&quot; part that occasionally pops up in a Larry Wall quote at the bottom of an Unreal Wiki page).  Phew.  If you ever thought that UnrealScript was a humongous, complex and for the most part poorly documented heap of code already, do look at http://lxr.mozilla.org for an upgrade.

===Comments===

'''Tarquin:''' I don't know about you, but I am finding the Jailbreak community very quiet these days. I'm sure there was way more activity (posts, maps, discussion) in the days of JBIII. But I suppose that was the 3rd release and we are only on the first. BTW, if you have some spare time, do you think you could look at the Wookee class tree generator? It would be nice if the text of the tree was parsed for wiki links, so we could use it for Unreal classes here &amp;ndash; but I'm afraid I've not been able to work out how to do it. It's WookeeTree.pm in your CVS. :) 

==July 14, 2004==

My support for Opera 6 has finally broken down after the last vBulletin 3 update which made &lt;code&gt;[code]&lt;/code&gt; tags unreadable, and I've made the switch to Firefox.  I'm loving it already.

It has gone quite a long way since the last time I gave it a try (must have been around version 0.6), and most of the reasons I didn't want to switch to it then have gone meanwhile.  I'm especially fond of the ability to selectively skin websites with custom CSS (using the &quot;uriid&quot; extension and a specially crafted userContent.css), and I just ''have'' to love a program which allows me to tweak its user interface appearance by editing a CSS file...

In completely unrelated news, Fraunhofer IGD (whom I had sent an unsolicited application about three months ago and never heard back of) has offered me a job... working on a project in Seoul, South Korea.  Imagine my surprise.  I might even have considered it if I hadn't found another job in the meantime already ''and'' if I didn't specifically want to move closer to my girlfriend in the Frankfurt area.  Still, quite interesting...

(Is this developer journal turning into a blog...?)

===Comments===

'''Tarquin:''' Bwahahahaha! I knew we'd convert you in the end.... :P

'''MythOpus:''' Consider this a reminder from the entire wiki to update the Wookee download zip ;)

==August 20, 2004==

When you think you're finally out of bugs, Atari QA will come and send you a new bunch of them.  :-p

No, actually, it's not that bad.  It boils down to one actual code bug and a bunch of map-related things in the order of &quot;graphic seams flicker in and out around the pipelines.&quot;  Still, I was surprised when I got that mail...

===Comments===

'''GRAF1K:''' Why would Atari be interested in sending you bug reports?

'''Wormbo:''' One code bug and one code thing I wouldn't call a bug. (no weapon in celebration screen)&lt;br /&gt;They most likely sent the reports because they tested Jailbreak 2004. ;)

'''Mychaeel:''' ...and they tested Jailbreak 2004 because they want to include it in the Editor's Choice Edition.  Sorry, I kinda implied this.  ;-)

'''Guest:''' I figured ECE was the reason but wasn't sure. Congrats then. :D

==September 5, 2004==

Picking up my old SprayPaint mutator idea again.  To reiterate, it's about being able to spray logos on walls &amp;ndash; the logos must be provided as monochrome bitmaps (i.e. bitmaps with 1-bit color depth) in a certain UT2004 subdirectory, and you can spray them on walls in a color of your choice; and the best thing is that other players on the server would see the exact same thing even though they don't have the source bitmap on their system.  On the long run I even want the sprayed images to persist across matches.

There's a bit of replication acrobatics involved in making that work, but so far it works nicely &amp;ndash; the data is loaded client-side, transmitted to the server via a replicated function in &quot;bunches&quot; of no more than 64 bytes a tick, and then left to the engine to be replicated back to all (non-bNetOwner) clients.

Two things I noticed doing that were that, firstly, the engine only replicates the first 256 bytes of an array of 512 byte values (where I don't know exactly whether it's the number of elements or their total size which is limited by the engine); and secondly, that passing a byte array via a replicated function call will only actually replicate the first value of that array, not the entire array.  However, if the array is part of a struct which is passed through the replicated function, everything works fine (hence my &quot;bunches&quot; of data).

The user interface for that thing is keeping me thinking.  Right now I figure that pressing your usual &quot;talk&quot; key (&quot;T&quot;, for instance) quickly twice in a row (like a double-click) would pop up a window where you could select which image to spray (using the mouse or arrow/movement keys), but that idea is subject to change.  For now, the &quot;mutate SprayImage &lt;filename&gt; &lt;color&gt;&quot; console command does the trick.

==November 17, 2004==

I've moved into my new apartment last Sunday, and today I got ISDN and DSL activated.  Thus, JDN is up again &amp;ndash; whatever caused my computer to break down two weeks ago is mysterious to me.  Maybe my video card overheated after all after having been running non-stop for months without a monitor attached to it... still, not really a satisfactory explanation.

Now that my home computer has been hosting CVS, an Apache webserver with JDN and other services and an ISDN calling machine and fax server for quite a while and across several hardware updates, I've been thinking &amp;ndash; it's getting harder and harder to keep the noise level coming from this machine at a level I'm willing to bear in my living room.  Plus, most of the time the computer is merely converting electric power into noise and heat via a video card and processor which are ridiculously overpowered for something acting as a web/fax/CVS server most of the time.

...so &amp;ndash; *drumroll* &amp;ndash; I've got that fabulous idea of building a small machine out of spare parts mostly left over from hardware upgrades of my main PC over the years.  I've got two mainboards/processors to choose from (a Pentium 200 MHz and an Athlon 800 MHz which I could underclock to 500 MHz), some left-over RAM, an ethernet card (my latest mainboard had that on-board) and a simple video card (an ATI XPert@Work sporting a 3D chipset with the staggering amount of 8 MB VRAM).  I also have a midi-tower computer case somewhere.  What I need is a silent power supply and &amp;ndash; probably &amp;ndash; a new harddisk (especially if this thing is to act as a file server as well) unless I find a suitable one in my pile of used hardware.

I figure I'll install Debian Linux on it &amp;ndash; with that awesome 3 MBit/s downstream I've got I can even download it without much hassle.

'''Update:'''  Wow.  Silent 80 GB harddisks come for less than 60 EUR these days?  o_O

==March 8, 2005==

&lt;nowiki&gt;*blows dust off this page*&lt;/nowiki&gt;

&lt;nowiki&gt;*cough*&lt;/nowiki&gt; &lt;br /&gt;&lt;nowiki&gt;*cough*&lt;/nowiki&gt;

Remember the Palpable mutator for Unreal Tournament?  Probably not, because I never actually released it, and the BuF mess-up two years ago ate all remaining evidence for it.

Basically, it allowed the user to see stereo 3D by displaying two versions of the current scene rendered from slightly different points of view.  You had to squint to see the effect, just like for [http://www.brossco.fi/janne/eclipse99/budapest/bu_3d.html these photos].

I tried to implement the same thing for UT2004 on Sunday.  To the degree that two viewports were rendered on the screen next to each other, it was a piece of cake; but, having the HUD render within one of those viewports prove to be impossible.  In Unreal Tournament, it was basically just a matter of setting [[Legacy:Canvas|Canvas]].OrgX/OrgY and ClipX/ClipY right &amp;ndash; but UT2004's HUD makes heavy use of the native DrawSpriteWidget function which, while honoring OrgX/OrgY and ClipX/ClipY, doesn't take the reduced size of a viewport defined through those properties into account when positioning and scaling the widgets.

So, no way.  Well, it was just an experiment anyway.  The 3D effect itself is pretty cool, though, even if it strains the eyes to squint that way for an extended period of time...

In other news, after a period of consideration, I bought a digital piano today &amp;ndash; a [http://www.rolandus.com/products/ck_details.asp?CatID=11&amp;SubCatID=45&amp;ProdID=HP-101 Roland HP-101].  I played the piano for years before leaving my parents' home to go to university, and I want to pick this hobby up again.  And, wow, those digital pianos nowadays really do sound and feel like the real thing &amp;ndash; down to subtle details like the slight resonance you hear after releasing a key, or that the keys for the deep tones react with slightly more resistance to being pressed down than the high-pitched keys...

===Comments===

'''Birelli:''' I remember Palpable, I think a couple of us on IRC tested it for you one time. It's definitely a cool effect, but it gave me a headache after about 15 minutes of playing. Probably not something people want to use all the time. Also it takes a bit of practice before you can train your mind into not forcing one eye dominant over the other, so at first it's basically impossible to run in a straight line.

'''Epsix:''' Any chance I can get the source code to the UT2004 version of Palpable? We've succesfully created a CaveUT setup here with 3 walls + 1 floor and we want to add stereoscopy and headtracking next. Since we want stereoscopy on all 4 screens we can't use drivers that do this automatically since we only have 1 viewing direction rather than 4. Basically what I need is UT2004 to run on 2560x1024 with left and right eye split on either half of the screen. (so 2x 1280x1024 next to eachother). I understand that palpable does just this? I've been looking at the source of Palpable for UT99 for several hours now trying to get it to work with UT2k4, but I simply lack the familiarity with either API to get anything done. Hell, you're close to Holland right? If you help me out on this, I'll let you have a look ;)

==April 19, 2005==

Those who have followed [http://www.planetjailbreak.com/?news=275 PlanetJailbreak news] are aware of what I've been working on recently: the visuals of freezing and shattering a player model.  Part of the problem is to overlay the player model and the weapon it holds with an &quot;ice&quot; texture that gradually fades in.

My first idea was creating a [[Legacy:Shader|Shader]], setting its &lt;code&gt;Diffuse&lt;/code&gt; material to the player's skin texture, the &lt;code&gt;Specular&lt;/code&gt; material to my alpha-blended &quot;ice&quot; texture and use a [[Legacy:ConstantColor|ConstantColor]] as its &lt;code&gt;SpecularityMask&lt;/code&gt; material to control the fading.  That works fine for the player model, but utterly fails for the weapon &amp;ndash; the weapon's textures are implicitly defined through the mesh, and there's no way UnrealScript code can get hold of them (not even anything similar to [[Legacy:Dynamicly Accessing Original Static Mesh Textures|this method]]).

So, that approach fell somewhat short of what I had envisioned.

But there's &lt;code&gt;OverlayMaterial&lt;/code&gt; defined in [[Legacy:Actor|Actor]], along with a &lt;code&gt;SetOverlayMaterial&lt;/code&gt; method, which is used (among others) by the UDamage to produce that &quot;energy&quot; overlay effect on players and weapons.  I had previously found out already that using a plain texture as &lt;code&gt;OverlayMaterial&lt;/code&gt; will simply replace the model's skin by that texture (instead of overlaying it) &amp;ndash; not what I intended, so I had put that approach aside.  Now, I picked it up again.

After some lucky experimentation, I found that I was able to use a [[Legacy:Shader|Shader]] as an &lt;code&gt;OverlayMaterial&lt;/code&gt; whose &lt;code&gt;Specular&lt;/code&gt; material was set to my &quot;ice&quot; texture.  Funnily, I noted that:

* The &lt;code&gt;Diffuse&lt;/code&gt; material I tried to set was automatically overwritten with a reference to the overlaid actor's skin (the skin part with the highest ordinal number in the meshmap, I guess).  So, here's a way to find the original skins of a non-static mesh if you need to.

* The &lt;code&gt;A&lt;/code&gt; (alpha) member of the &lt;code&gt;Color&lt;/code&gt; property of a [[Legacy:ConstantColor|ConstantColor]] material I tried to use as the shader's &lt;code&gt;SpecularityMask&lt;/code&gt; was immediately reset to zero whenever I attempted to set it to something different.  Why would the engine do such a thing...?

So, that didn't work the way I had it intended to.  Neither did any attempts to replace the plain &quot;ice&quot; texture in the &lt;code&gt;Specular&lt;/code&gt; slot by a [[Legacy:Modifier|Modifier]] of any kind.

Then, in a last futile attempt, I tried using a [[Legacy:FadeColor|FadeColor]] in the &lt;code&gt;SpecularityMask&lt;/code&gt; slot (instead of a [[Legacy:ConstantColor|ConstantColor]] as before), and lo!, when I set its &lt;code&gt;FadePeriod&lt;/code&gt; to something other than the default, zero, it worked!  Well, of course I had a pulsing overlay now, but setting both &lt;code&gt;Color1&lt;/code&gt; and &lt;code&gt;Color2&lt;/code&gt; to the same color fixed that.

So, now I've got a texture overlay on both player and weapon which I can smoothly fade in (and out, if there was any need) and which still lets the original textures shine through.

===Comments===

'''Wormbo:''' Interesting hack. :) The engine uses the ConstantColor in the SpecularityMask slot to fade out the overlay effect when the actor's overlay timer drops below 1 or so.

==May 1, 2005==

Microsoft has a pretty good reputation on IDEs, but ''Microsoft eMbedded Visual C++'' really has at least one major quirk which makes working with it a pain unless you either know how to avoid it or unwittingly got around it by failing to customize your workspace too much.  I didn't fall into the second group, and it took me until today to become part of the first.

I'm developing a small smartphone application to remote-control MP3 playback on the Linux server which sits quietly in my closet via Bluetooth.

The ''Smartphone 2003 SDK'' comes with a smartphone emulator.  That's very nice, but it becomes pretty frustrating once it stops working &amp;ndash; which, for me, happened basically whenever I started the IDE for the second time after installing it:  Whenever I wanted to run my program, I got an error dialog telling me one of the following things:

{{innerbox| Cannot find a default device. Please create one or more from the Platform Manager.

}}

&lt;nowiki&gt;&lt;/nowiki&gt;

{{innerbox| There is no device installed. Please go to Configure Platform Manager to add a device.

}}

Obviously there were still the same devices as the last time, and I certainly hadn't changed configurations since last successfully running the program in the emulator.  So, almost each time I wanted to work on my project, I had to uninstall the entire IDE and reinstall all of it &amp;ndash; two installers, one of them badly made, and a service pack; half an hour work just to get the IDE to work again.  Needless to say, I didn't do that very often.

Of course, I googled for a solution.  Nothing to find except for two postings from people with the same problem without any replies to them.  At least I wasn't alone; little consolation there, though.

Today, I got that second error message from above for the first time, and that was my luck.  Googling for ''that'' finally led me to a newsgroup message with the solution:  If you disable the WCE Configuration toolbar, the (unlabeled) &quot;default device&quot; drop-down box (the rightmost one) '''will automatically revert to &quot;Smartphone 2003 Device.&quot;'''  Set it back to &quot;Smartphone 2003 Emulator&quot; and everything works again.  There's no menu command for that option.

&quot;Son of a gun!&quot;, to say it in the original newsgroup poster's words.  What an unnecessary annoyance.

==November 3, 2005==

Today at around 11:15 AM, I successfully completed my twenty-ninth year of life (for a suitable definition of &quot;successfully&quot; :-P), heading into the thirtieth without hesitation. Happy birthday to me ;-)

===Comments===

'''El Muerte:''' damn you're old ;)

'''EntropicLqd:''' Happy birthday youngster (for a given value of young).  Give it another few years and you'll feel like you are falling apart :)

'''Sweavo:''' phew it's not just me then Entropic :-)

'''Tarquin:''' Happy birthday Mych! The big 30 next year ;) It's not as awful as it sounds :)

'''Mychaeel:''' Hehe, thanks y'all :-)

'''MythOpus:''' I saw it awhile ago, but I was always on my dads Linux computer so I haven't been able to... WISH YOU A HAPPY BIRTHDAY!

'''Mychaeel:''' I'll take good wishes at any time, so: thank you as well :-D

'''Sweavo:''' in that case, have had a happy birthday :-)

==April 24, 2006==

Setting a data structure element of a replicated array element won't actually make the engine replicate that array element.  You'll have to set the ''whole'' array element to make the engine notice that it has changed:

&lt;uscript&gt;
function TouchElement(int iElement)
{
  local TElement ElementTemp;

  ElementTemp = Elements[iElement];
  Elements[iElement] = ElementTemp;  // prod!
}
&lt;/uscript&gt;

Has anybody else ever had that problem?

===Comments===

'''EricBlade:''' I haven't personally had a reason to make an array of structs yet, but it sounds like it could be related somehow to the problem of not being able to replicate -just- a struct, without some other var?

'''Wormbo:''' That seems to be a general problem of struct replication, not only structs as array elements. The code &lt;code&gt;Elements[iElement] = Elements[iElement]&lt;/code&gt; seems to be enough to cause replication though, whether anything actually changed or not.

'''Mychaeel:''' Yes, I also realized that the detour over a temporary local variable probably wasn't necessary at all &amp;ndash; I was still under the influence of the &lt;code&gt;SwapElements&lt;/code&gt; function which actually ''needed'' one.  I've occasionally replicated (individual instances of) structs without problems, though &amp;ndash; you only have to be aware that changing any struct element will cause the entire struct to be replicated.  (Actually, I've used that as a feature occasionally.)

==July 15, 2006==

I found the following function in [http://mychaeel.no-ip.com/source/Jailbreak/Jailbreak/Classes/JBTagPlayer.uc?rev=1.58&amp;view=auto some source code] I had written years ago:

&lt;uscript&gt;
// ============================================================================
// CalcOrientation
//
// Calculates and returns an artificial value representing the orientation of
// a vector. The returned value has the following properties:
//
//   * Non-zero for any non-zero vector. Zero for the zero vector.
//   * Negating the argument yields the negative result.
//
// Those properties allow to use this function to make any difference between
// two given points in space unambiguous by passing a single additional binary
// bit of information.
// ============================================================================

simulated function float CalcOrientation(vector VectorInput)
{
  local vector VectorTranslated;

  VectorTranslated.X = VectorInput dot vect(1, 1, 0);  if (VectorTranslated.X != 0.0) return VectorTranslated.X;
  VectorTranslated.Y = VectorInput dot vect(1,-1, 0);  if (VectorTranslated.Y != 0.0) return VectorTranslated.Y;
  VectorTranslated.Z = VectorInput dot vect(0, 0, 1);  if (VectorTranslated.Z != 0.0) return VectorTranslated.Z;

  return 0.0;
}
&lt;/uscript&gt;

It's part of Jailbreak's player movement extrapolation code which is designed to provide a smooth client-side representation of a player's position with as little network traffic as possible.  The extrapolated player position is used by the [http://mychaeel.no-ip.com/jailbreak/JBPanorama scoreboard minimap] and [http://mychaeel.no-ip.com/jailbreak/JBScreen JBScreen].

Well, what the ''heck'' was I thinking?

Obviously, instead of using a local vector variable, I could have used a simple float; the function calculates each component of the local vector, immediately uses it, and then never uses it again.  Plus, looking more closely at what's actually done there, it looks as if I could simply have used the original vector's components instead of (sloppily) translating it into a rotated coordinate system first.

It took me a while to get behind what I had thought several years ago.  I should comment more.

Using a local vector instead of a float was halfway between being an artifact of the way my mind had gone before arriving at this code and being self-documenting code.  (Sure enough the latter could have been achieved just as well with less bytecode overhead by just adding a comment.)

Translating the input vector into a coordinate system rotated 45° away from the main axes was done to make changes in the signum of the return value less common.  If there's any directional bias in a player's movement at all, it's usually along the main axes, following a hallway a mapper will generally have aligned along the coordinate system.  Strafing left and right even just a bit while moving along one of the coordinate axes (say, the Y axis), would change the signum of one of the other coordinate components (the X component) frequently.

If the axes are rotated 45° about the vertical (Z) axis, chances are better that you stay &quot;left&quot; or &quot;right&quot; of an axis while moving, leaving the signum of the return value of this function unchanged.  Any change in the signum needs to be replicated to all clients (as the signum of the scalar player velocity they use to extrapolate the player's position); so this coordinate rotation reduces the frequency of updates required to send to the clients.

Phew.

I remember experimenting with different replication and extrapolation mechanisms, using some of UT2003's more obscure logging parameters to get network traffic detail into UT2003.log.  This optimization actually ''did'' reduce the amount of updates sent across the network for this detail.  I never got around to actually measuring whether it made any relevant difference in the ''total'' amount of network traffic, though.  I suppose this could be just one of the cases where I indulged in premature optimization just for the fun of it.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mychaeel/Mod Startups</title>
    <id>1763</id>
    <revision>
      <id>4326</id>
      <timestamp>2007-10-03T06:22:36Z</timestamp>
      <contributor>
        <ip>UltraHyperCode</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''The following expresses my personal opinion and not necessarily anybody else's.  Do not edit, but feel free to comment in the comments section at the bottom of the page.''

}}

{{innerbox| ''The opinions stated here are subject to change without notice.''

}}

----

'''Before you start reading,''' here are a few common misunderstandings about this page I'd like to avoid.

* I'm not talking about ''your'' mod or mod concept in particular here, and some parts of this article might not even apply to you.

* Neither I nor the person posting a link to this article are trying to offend you.

* It is not sufficient to read the parts in boldface to understand this article.  (If it was, I wouldn't have bothered with writing the parts in-between.)  Especially if you think you don't need this advice, please at least read the ''entire'' article and ponder it in order to make that an educated decision, not just an offended retort.

...and a '''request to people linking to this page:'''  Please be polite and constructive.  Your advice, although probably well-meant, is unrequested and most likely unasked for.  If you really want to help, be kind.

==Mod Startups ==

I'm writing this in anticipation of a surge of calls for new mod teams as soon as [[Legacy:UT2003|UT2003]] is released to the public.  Already now, a couple of weeks before the release and still before the demo is officially available, many people are posting in forums with their mod ideas in search for a team to make them reality.

Unfortunately, many of those calls are doomed to start with.  Why?  Read on.

===Mod Ideas ===

[[Image:Legacy_userfriendly-modstartups-ideas.gif|center|]]

{{innerbox| Everyone is an idea man. Everybody thinks they have a revolutionary new game concept that no one else has ever thought of. Having cool ideas will rarely get you anywhere in the games industry. You have to be able to implement your ideas or provide some useful skill. This also applies to mod authoring. If you become a skilled or notable mod author, you will find people propositioning you to implement their ideas.

}}

{{innerbox| Never join a project whose idea man or leader has no obvious development skills. Never join a project that only has a web designer. You have your own ideas. Focus on them carefully and in small chunks and you will be able to develop cool projects.

}}

{{innerbox| : ''Brandon Reinhart, [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring]]''

}}

There's nothing wrong with enthusiasm or having great ideas that go beyond things that already exist.  But enthusiasm and ideas alone don't make a mod; you need skilled people for that.  Of course everybody who calls for a mod team realizes that.  Only few people realize what such a call takes to be attractive though.  Ask yourself:

* '''Why should anybody be interested in joining your team?'''  Don't presume that anybody will be awestruck by your idea.  Everybody is an idea man; rarely a mod fails because the people making it ran out of ideas.  Good coders, mappers, modellers, animators, skinners wouldn't be that way if they hadn't a whole bunch of ideas of their own.  Especially if your idea just marginally improves on an existing idea (like the n-th Counter Strike clone, or what appears as one to the casual reader), it's hard to communicate the point of your venture to the people who might be able to realize it.  Besides, people that are good at their respective trade are notoriously busy with either their own projects or other team projects they're in.

* '''What do you add to the project yourself?'''  Why would anybody want to sacrifice their independence to work with you?  If it's just your mod idea, it'd better be a damn good one.  Wanting to make a website and PR work won't do.  I'm by no means underestimating the value of an attractive website and great PR work, but on the priority list of things crucial to creating a good mod those items are still ranking below technical skills like modelling, skinning, coding and mapping.  On the other hand, if you sort that list by how easy it is to find someone who fills those positions, it's exactly upside-down:  If you ''have'' a mod, it's not a big deal to do the PR work and a website for it.

* '''Isn't there already another team that does the same?'''  Certainly not ''exactly'' the same, but close enough.  Be realistic:  You'll have a better chance to end up with a finished thing to be proud of if you're working together with other people rather than splitting the (usually small) community that's interested in ideas like yours into very small fractions each of which hardly has a chance to ever get something with the scope of your (and their) ideas done.  You don't have to abandon your own ideas by joining another project.  If your ideas are good (and the team you're joining is good), they'll be open to what you're saying, if you do it in nice way.  Keep in mind:  You won't get any recognition at all if you're the leader of a team of one and your mod never goes beyond the state of a flashy website.

* '''What kind of working relationship do you offer?'''  People (especially those that know that you need their help) are hardly inclined to join a team as a mere subject to a leader's every whim.  The people you're looking for expect to be treated as equals in a team where everybody's opinions are valued.  (Besides, a good team doesn't need an official &quot;lead&quot; position at all.)

Last, but by no means least:  '''Respect the rules of the community you're approaching.'''  Yeah, it's obvious, but experience tells that it's unfortunately not obvious to everyone.  If you're posting in a forum system with many individual forums on different topics, don't spam your posting into more than one of those forums.  All you'll achieve is that people get mad at you before they've even read your posting.  It's hard to get somebody to help you who's mad at you to start with.  For that matter (if common courtesy isn't enough reason already), don't belittle other people or projects in the process of advertising your mod.

If you don't believe ''me'' on that, read what Pxtl has to say on [http://forums.beyondunreal.com/showthread.php?postid=1423141#post1423141 Team Fortress mods].

===Concept ===

[[Image:Legacy_userfriendly-modstartups-concept.gif|center|]]

If you're still confident that there's a good chance that somebody might be interested in your mod when you advertise it in a forum posting, '''make a concept.'''  Your concept is your mod idea's advertisement; you're about to sell your mod idea to other people, so posting something along the lines of &quot;I have a great idea, send me a message if you want to know more&quot; is completely ineffective.  Forum regulars have seen dozens of idea people already, and reading your forum posting is the peak of what you'll get of their attention at this time.  You have to grab them at this time, or you'll lose them forever.

Your concept doesn't need to be finished to the last detail, but it should show that you understand the scope of what you're venturing.  Be realistic, not overly enthusiastic.

Don't waste your time with designing an intricate internal hierarchy of team members; I've seen mod concepts where that part took as much room as the technical concept of the mod itself.  Assign a lead coder or lead mapper when you ''have'' those people already and find that you need them to efficiently channel your team's organization.  Many teams work very well without an internal hierarchy.  In fact, teams frequently work ''better'' if everybody feels that they're on an equal footing with the rest of the people they work with, and with nobody to scratch their ideas and objections with just a shrug and a decree.  (Then again, that really only works with the right people; but wait until you find out what kind of internal organization works best for your team before you attempt to design one artificially.)

You can't ''decree'' that your mod is going to be quality; stating so in your concept is just a display of hubris (don't you think every mod team tries to make a quality mod?).  Making a quality mod is a lot of work, some of which is far from being outright fun.  See the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modding Etiquette|Modding Etiquette]] for a glimpse of it.

==Comments ==

'''Mychaeel:'''  I'm tired of ranting the same over and over again, each time somebody posts about his/her ideas for a cool new project in forums in a way that will hardly yield any positive result.  Any thoughts on the content?

'''Luggage:''' Interesting read. :) I'm just working on a concept paper myself, so it was really interesting. This seems to be aimed at community outsiders though, I think that only applies to maybe 20-30% of mod makers. Still it was pretty interesting to me. :)

'''Mychaeel:'''  Incidentally, it appears that most people posting a request for team members for their new mod ''are'' indeed community outsiders.  In any case, they're mostly ''modding'' community outsiders, and many of them make the same mistakes:  Thinking that the fact alone that they've got an idea will spark everybody's interest, and that technically skilled modders are just sitting idly and waiting for an opportunity to join somebody with a mod idea (but, in too many cases, hardly any mod making skills) because they're out of ideas themselves.

'''Luggage:''' Hehe, true. With the concept I spoke of, I'm now trying to get a playable ''interesting'' core version done of what will hopefully evolve into a UT2k3 TC. I have the whole project in my head and I'm in the process of writing it all up in a concept paper, but I'm starting out with the core element of gameplay. The other stuff that is planned enhances this further and adds more to the gameplay. Damn, this could really work out :)

'''BesigedB:''' The unrealed goblin is coming to get you

'''Jb:''' I agree with your thoughts Mychaeel. Its nice to see that the people out there have ideas. Speaking of that, with all the new features that engine in UT2003 will support I can see a lot more creative ideas coming...How about a Tribe2 UT version that works :) heheh j/k

'''Will:''' interesting read, Mychaeel, it seems many people who post on forums asking for a mod team should really read this first.

'''Tarquin:''' Mych takes (almost) sadistic delight in posting a link to this page on such threads. (though if he didn't, I would. And I'd enjoy it more... bwahaha!) ;)

'''Mychaeel:''' That's what I wrote it for, after all.  Much more efficient than ranting anew each and every time.  ;-)  Sadly enough, posting the link frequently doesn't cause people to read this text, let alone understand it.

'''autocol:''' As someone just beginning to take an interest in modifying games (coming from a 3DS animation background) I think the best advice for 99% of the people that really need to read this is: if you haven't got the skills, don't even bother! The number of people that entertain thoughts of being a professional footballer would make the mind boggle, but how many make it? As a percentage, close enough to zero. I think the number of people who entertain thoughts of creating a sweet mod, when compared to the number of people with the talent, vision, skills and tenacity to actually create a playable mod, when expressed as a percentage, is again, basically zero. I've got an awesome idea for a mod, but I think I'll start by creating the SIMPLEST mutator I can think of... I think most of the guys that post these &quot;team requests&quot; should do the same.

'''Kuhal:''' '''reply to autocol'''  Your analogy is flawed IMO.  The fact that very few people achieve something is not good grounds for not trying in the first place.  If everyone stopped trying, then there would never be any successes right?  And if people without the technical ability don't try...they will never get the techincal ability.  If you meant people without '''''potential''''' then that's even worse because who can judge someone's potential without having spent alot of time with them?  10 years ago it was unheard of for people in their own homes to be modelling 3D animations.  It was unheard of for coders to be writing a few lines of code and effecting such huge changes to a complex game like UT.  Yet today, we have topics dedicated to helping new entrants to the modding community to rationalise their chances of success or failure.  I think this is great progress.  Success of an industry can be measured by it's failures as well as it's triumphs.  The more people that try, fail and try again the better IMO.  It all adds to a richer community.  I applaud this Wiki for attempting to help the majority of would be modders who do not ''yet'' have the technical ability but want to try.  BTW, there is absolutely no ill intent in this message.  Just my rant on Mych's rant triggerd by your comments :)  Cheers

'''autocol:''' Fair enough... Strangely, I think we actually agree with each other but perhaps I expressed myself poorly. As a relative newbie to the idea of modifying games, I've found the Wiki - and various other tutorial sites - absolutely invaluable resources in starting to consider creating my own game content. Without these resources there's not a snowballs chance in hades I would have figured it out. I'm certainly not saying that people should just give up and take up knitting, which is perhaps how my original comment may have read. What I '''am''' saying is that these people that make requests should '''TRY''' some simple mutators, practise some coding/mapping/skinning/whatever-ing BEFORE they make these open requests for loads of experienced coders/mappers/skinners/whatever-ers to join their mod and make them the gaming equivalent of Bill Gates. I agree that &quot;the more people that try, fail and try again the better.&quot; (Myself, I'm doing a lot of the &quot;failing&quot; at this point :)) My rant was really directed at those people that can't be bothered with the &quot;try&quot; part...

'''Kuhal:''' Yep we do agree then.  

'''Githianki:''' Good advice, though a tad &quot;discouraging&quot; in the intro.  I understand the frustration you are trying to prevent but since this is mostly a problem with those new to the scene, the advice needs to come in a tone less preachy at the start or people won't read the (rather lengthy) entire article.  I know you probably didn't mean it to be preachy but context is going to vary with the reader's experience level.  Those who are familiar with the mod scene will have patience and see the wisdom in the advice you have laid out.  On the other hand, those new to the scene might say &quot;He says he isn't talking about me but then he says to me 'You are here because I or someone else think I do need to talk to you'&quot;.  There is a conflicted message to the reader there.  If new modders are impatient (and needing the advice the most), will they bother to continue reading after that intro?  Maybe.  The article is good but it could be improved with regards to its intended audience. Go for greatness! You are quite clearly capable of it as evidenced by your words across this wiki. BTW -its Reinhart not Reinhard, just edited little typo away :) 

'''Wormbo:''' Does anyone think it's worth mentioning the [http://mep.beyondunreal.com/mymod.html SUPER UBER COOL MOD]? ;)

'''Tarquin:''' yup!

'''Legal:''' Damn you Wormbo, I was just about to!

'''ZxAnPhOrIaN:''' Tisk, Tisk, Tisk... Even i, a newbie to uscript, could make a better description than them. Their mod is destined to SUFFER!!!

'''Cookie:''' One thing this page is lacking is a paragragh on copyright laws. It's kinda scary how many mod startups think it's perfectly OK to unabashedly rip off another game. Especially one that's still in production. People simply DO NOT UNDERSTAND (or care about) Copyright Law. (But then they will complain violently about people ripping off 'their' ideas.) I would write the article but frankly I just don't have the time. Could someone please write something about this issue for the benefit of all the new UT2k3 start ups?

'''BM.Deathwind:''' @Cookie ... having sorta &quot;been there done that&quot; before, I could write up an article about copyrights, fair use, etc...  I'm not formally educated in Copyright law, so if there's someone around here who is, it might be better off in their hands.  But if nothing else, I could certainly create a basic explaination, which would typically be enough for those in the mod community.

'''Mychaeel:''' I believe that copyright and &quot;fair use&quot; issues warrant an article of their own (and I'll be happy to link to it from here).  When I wrote this rant I didn't even think it'd be necessary to expressly tell people to respect other people's intellectual property.

'''Tarquin:''' move &amp; refactor tor  [[Legacy:Mod Copyright|Mod copyright]]?

'''Cookie:''' Yeah, you're probably right about the copyright issue needing its own discussion Mychaeel. Especially when every other Mod-Startup asking for help over on BuF is a straight rip-off of another movie or game. I think the biggest problem is the oft-stated misconception that's its perfectly OK to steal intellectual property, as long as its for &quot;non-commercial&quot; use.

'''Legal:''' This page should contain this, but where?: Do send emails signed [your mod] but do not use [mod's name] as your forum account name.

And something about spelling, punctation and h4x0rz $p34k.

'''Dante:''' I don't know if it fits well in here, but there's a very good post on &quot;how to recruit a programmer&quot; on http://www.ina-community.com/forums/showthread.php?threadid=266017.

'''Mychaeel:''' See [[Legacy:How To Recruit A Programmer|How to Recruit a Programmer]].

'''Dante:''' Maybe I should've tried the &quot;search&quot; feature on this wiki... ;)

'''Mosquito:'''  Very nice read Mych, but I think there's a couple things you need to add.  People need to know how realistic making a mod is and getting a team together.  It's like finding a job.  You have to put previous work on your resume to get a better chance of getting the job.  You should add in that the best way to get team members, is to already have worked on either a REALLY nice mod where your work was top notch, or you've done important work for 3 or 4 other mods.  That way people can not only see that there's proof that you're capable, they can also see the quality of your work.  Mod developers look for competent leaders that can take the brunt of the work.  It's important that you know how to do more then just 1 thing for the mod, however coders seem to get the interest these days.  Your right that there is a skill ladder, where webpage design is at the bottom and everything else above it.  But what if your only skill is mapping? or design map textures?  Where's the mod going to go with those skills?  Anyways, that's my comments.

'''Sordith:''' Nice read.  Something every new mod developer/indy game developer should read.  Another thing you might want to add is an example of a design doc.  Some tutorials can be found here:

http://www.gamedev.net/reference/list.asp?categoryid=23

'''Pendulum:''' I've read this entire document.  I guess you could call me one of those outsiders.  I'm however not going to try and recruit anyone until I absolutely need some help.  I'm going to try and do everything I can on my own.  I'm not worried about getting my mod done in some specified amount of time (even though having the chance to win some of the money in the new contest would be nice), so I'm going to learn everything I can and do everything I possibly can on my own.  I believe this is the way for me to get the experience I need, learn anything and everything.  I'm no artist so that is my weak point, but good quality textures and skins aren't the most important thing in my opinion, they can wait till closer to the end.  I'm sure everyone else has different ideas on this.

'''Swift Viper:''' That page that Wormbo linked to was funny! I don't know what is worse, that page or saying New Mod, e-mail me for more information. I hate when people do that and they get upset when people ask what the mod is (I'm allow to link to threads in the main UT2k3 fourms right?). Those are the kind of mod team I would not join. I'm confused about one thing, how much do you need to know (besides Programming) before asking for help? I don't want to miss up someday.

'''EntropicLqd:''' It's not a question of how much you need to know .. it's more a question of what you've done already.  For example if you've made a really cool looking weapon, modelled, animated, and skinned it - and can't code up the weapon code yourself - then asking for a coder's help about the time you are animating the weapon would be good.

'''Foxpaw:''' I agree, you don't have to know how to program or anything, but you do need to have done enough to demonstrate that you don't expect everyone else to do it for you. If, in Entropic's example above, you ask a coder to join you right when you start, then he/she/it is ready to start testing and your model is not ready, the programmer may become frustrated and unmotivated. Likewise, if you are the programmer, and you ask someone to model the weapon for you, they may be disappointed when they are finished and can't see their model in the game because you aren't finished yet.

'''Swift Viper:''' So in other words I could program the whole weapon and have it working and everything? Is that good enough, so they will only have to make the model and import it, then everything is in place? What about the maps? As for the model, do I have to make a basic low poly model so someone else can get the idea of what it should look like and finish it up and skin it? I'm trying to make sure I get it right for when the time comes and not mess up and look dumb, but that won't be anytime soon. BTW I might become a programmer, so having working code and the ideas done will be enough right? Sorry if anything has already been answered or if any questions have been repeated, want to make sure I get it right the FIRST time (and reading the page a good few times).

'''EntropicLqd:''' Firstly, don't worry about getting the balance right the first few times.  People make mistakes - the trick is to learn from them.  Secondly - all people really want is for you to demonstrate some ability in terms of actually doing the work to create the mod.  It doesn't matter how much (or little) you get done before asking for help - the fact that you have done something towards the effort needed to create the mod is enough to at least overcome people's initial wariness.
: There are plenty of people who come up with a mod idea, throw a web-site together and expect other people to actually do the work (making the models, cutting the code, doing the maps).  Those type of people are the ones to avoid - they have no knowledge or ability in the work of creating the mod.  And often they don't want to be involved at all - apart from as an overseer.

'''Swift Viper:''' Thanks for the help, I already got a lot of ideas/plans in a text file and keep adding more and more ideas. Soon I should learn programming (hopefully). Is this good enough to say:

&quot;I'm making a new mod called (name) and information can be found (website). The ideas and some of the programming is already done, I'll need # 2D artists, # of 3D artists, # mappers and maybe another programmer. If you would like to help e-mail me at (address).&quot;

Is that good enough? Again, I won't have to worry about this for awhile as I have very little skills in those areas anyway. I don't want to be one of those people that &quot;Can you make this mod for me?&quot;, but one of the ones that &quot;I'm working on this mod and I got some stuff done and would anyone be willing to help me please?&quot;. I really want to make my dreams come true, because if someone else did it (as in me doing nothing, not team help), it would not feel right. I think the best thing to do now is the planning till I get any skills in anything.

'''Foxpaw:''' I'd include a little bit about it in the message, like a good novel you'll need to catch the person's interest in the beginning if you want them to read more. Due to the frequency of people looking for a team, I don't think everyone will go to the website to read about it. You certainately don't have to put the whole design document in the message, but enough to catch their interest. I'd think so anyway.

*****UltraHyperCode***** Hey sup every1 i hade been thinking bout trying to make a new modd for ut2004 where every1 could beable to use it and have some fun with it i hope maybe ya and so i guess you could say it kindda would be like those really old megaman games that came out for the nes system over 14 years ago now and it would have some other newer stuff and things added to it also that would make it i hope look really kool to play all the time and one of the maps or levels would be called ULTRA-WARZ. so i am not really sure how long it would take me to try and finish everything since i am just a beginner and just starting out with all this modding stuff here, so every1 just let me wat you all think bout this idea i hade here ok and thanks every1 bye.... 

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4327</id>
      <timestamp>2003-08-02T19:25:13Z</timestamp>
      <contributor>
        <ip>Foxpaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{innerbox| ''The following expresses my personal opinion and not necessarily anybody else's.  Do not edit, but feel free to comment in the comments section at the bottom of the page.''

}}

{{innerbox| ''The opinions stated here are subject to change without notice.''

}}

----

'''Before you start reading,''' here are a few common misunderstandings about this page I'd like to avoid.

* I'm not talking about ''your'' mod or mod concept in particular here, and some parts of this article might not even apply to you.

* Neither I nor the person posting a link to this article are trying to offend you.

* It is not sufficient to read the parts in boldface to understand this article.  (If it was, I wouldn't have bothered with writing the parts in-between.)  Especially if you think you don't need this advice, please at least read the ''entire'' article and ponder it in order to make that an educated decision, not just an offended retort.

...and a '''request to people linking to this page:'''  Please be polite and constructive.  Your advice, although probably well-meant, is unrequested and most likely unasked for.  If you really want to help, be kind.

==Mod Startups ==

I'm writing this in anticipation of a surge of calls for new mod teams as soon as [[Legacy:UT2003|UT2003]] is released to the public.  Already now, a couple of weeks before the release and still before the demo is officially available, many people are posting in forums with their mod ideas in search for a team to make them reality.

Unfortunately, many of those calls are doomed to start with.  Why?  Read on.

===Mod Ideas ===

[[Image:Legacy_userfriendly-modstartups-ideas.gif|center|]]

{{innerbox| Everyone is an idea man. Everybody thinks they have a revolutionary new game concept that no one else has ever thought of. Having cool ideas will rarely get you anywhere in the games industry. You have to be able to implement your ideas or provide some useful skill. This also applies to mod authoring. If you become a skilled or notable mod author, you will find people propositioning you to implement their ideas.

}}

{{innerbox| Never join a project whose idea man or leader has no obvious development skills. Never join a project that only has a web designer. You have your own ideas. Focus on them carefully and in small chunks and you will be able to develop cool projects.

}}

{{innerbox| : ''Brandon Reinhart, [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring]]''

}}

There's nothing wrong with enthusiasm or having great ideas that go beyond things that already exist.  But enthusiasm and ideas alone don't make a mod; you need skilled people for that.  Of course everybody who calls for a mod team realizes that.  Only few people realize what such a call takes to be attractive though.  Ask yourself:

* '''Why should anybody be interested in joining your team?'''  Don't presume that anybody will be awestruck by your idea.  Everybody is an idea man; rarely a mod fails because the people making it ran out of ideas.  Good coders, mappers, modellers, animators, skinners wouldn't be that way if they hadn't a whole bunch of ideas of their own.  Especially if your idea just marginally improves on an existing idea (like the n-th Counter Strike clone, or what appears as one to the casual reader), it's hard to communicate the point of your venture to the people who might be able to realize it.  Besides, people that are good at their respective trade are notoriously busy with either their own projects or other team projects they're in.

* '''What do you add to the project yourself?'''  Why would anybody want to sacrifice their independence to work with you?  If it's just your mod idea, it'd better be a damn good one.  Wanting to make a website and PR work won't do.  I'm by no means underestimating the value of an attractive website and great PR work, but on the priority list of things crucial to creating a good mod those items are still ranking below technical skills like modelling, skinning, coding and mapping.  On the other hand, if you sort that list by how easy it is to find someone who fills those positions, it's exactly upside-down:  If you ''have'' a mod, it's not a big deal to do the PR work and a website for it.

* '''Isn't there already another team that does the same?'''  Certainly not ''exactly'' the same, but close enough.  Be realistic:  You'll have a better chance to end up with a finished thing to be proud of if you're working together with other people rather than splitting the (usually small) community that's interested in ideas like yours into very small fractions each of which hardly has a chance to ever get something with the scope of your (and their) ideas done.  You don't have to abandon your own ideas by joining another project.  If your ideas are good (and the team you're joining is good), they'll be open to what you're saying, if you do it in nice way.  Keep in mind:  You won't get any recognition at all if you're the leader of a team of one and your mod never goes beyond the state of a flashy website.

* '''What kind of working relationship do you offer?'''  People (especially those that know that you need their help) are hardly inclined to join a team as a mere subject to a leader's every whim.  The people you're looking for expect to be treated as equals in a team where everybody's opinions are valued.  (Besides, a good team doesn't need an official &quot;lead&quot; position at all.)

Last, but by no means least:  '''Respect the rules of the community you're approaching.'''  Yeah, it's obvious, but experience tells that it's unfortunately not obvious to everyone.  If you're posting in a forum system with many individual forums on different topics, don't spam your posting into more than one of those forums.  All you'll achieve is that people get mad at you before they've even read your posting.  It's hard to get somebody to help you who's mad at you to start with.  For that matter (if common courtesy isn't enough reason already), don't belittle other people or projects in the process of advertising your mod.

If you don't believe ''me'' on that, read what Pxtl has to say on [http://forums.beyondunreal.com/showthread.php?postid=1423141#post1423141 Team Fortress mods].

===Concept ===

[[Image:Legacy_userfriendly-modstartups-concept.gif|center|]]

If you're still confident that there's a good chance that somebody might be interested in your mod when you advertise it in a forum posting, '''make a concept.'''  Your concept is your mod idea's advertisement; you're about to sell your mod idea to other people, so posting something along the lines of &quot;I have a great idea, send me a message if you want to know more&quot; is completely ineffective.  Forum regulars have seen dozens of idea people already, and reading your forum posting is the peak of what you'll get of their attention at this time.  You have to grab them at this time, or you'll lose them forever.

Your concept doesn't need to be finished to the last detail, but it should show that you understand the scope of what you're venturing.  Be realistic, not overly enthusiastic.

Don't waste your time with designing an intricate internal hierarchy of team members; I've seen mod concepts where that part took as much room as the technical concept of the mod itself.  Assign a lead coder or lead mapper when you ''have'' those people already and find that you need them to efficiently channel your team's organization.  Many teams work very well without an internal hierarchy.  In fact, teams frequently work ''better'' if everybody feels that they're on an equal footing with the rest of the people they work with, and with nobody to scratch their ideas and objections with just a shrug and a decree.  (Then again, that really only works with the right people; but wait until you find out what kind of internal organization works best for your team before you attempt to design one artificially.)

You can't ''decree'' that your mod is going to be quality; stating so in your concept is just a display of hubris (don't you think every mod team tries to make a quality mod?).  Making a quality mod is a lot of work, some of which is far from being outright fun.  See the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modding Etiquette|Modding Etiquette]] for a glimpse of it.

==Comments ==

'''Mychaeel:'''  I'm tired of ranting the same over and over again, each time somebody posts about his/her ideas for a cool new project in forums in a way that will hardly yield any positive result.  Any thoughts on the content?

'''Luggage:''' Interesting read. :) I'm just working on a concept paper myself, so it was really interesting. This seems to be aimed at community outsiders though, I think that only applies to maybe 20-30% of mod makers. Still it was pretty interesting to me. :)

'''Mychaeel:'''  Incidentally, it appears that most people posting a request for team members for their new mod ''are'' indeed community outsiders.  In any case, they're mostly ''modding'' community outsiders, and many of them make the same mistakes:  Thinking that the fact alone that they've got an idea will spark everybody's interest, and that technically skilled modders are just sitting idly and waiting for an opportunity to join somebody with a mod idea (but, in too many cases, hardly any mod making skills) because they're out of ideas themselves.

'''Luggage:''' Hehe, true. With the concept I spoke of, I'm now trying to get a playable ''interesting'' core version done of what will hopefully evolve into a UT2k3 TC. I have the whole project in my head and I'm in the process of writing it all up in a concept paper, but I'm starting out with the core element of gameplay. The other stuff that is planned enhances this further and adds more to the gameplay. Damn, this could really work out :)

'''BesigedB:''' The unrealed goblin is coming to get you

'''Jb:''' I agree with your thoughts Mychaeel. Its nice to see that the people out there have ideas. Speaking of that, with all the new features that engine in UT2003 will support I can see a lot more creative ideas coming...How about a Tribe2 UT version that works :) heheh j/k

'''Will:''' interesting read, Mychaeel, it seems many people who post on forums asking for a mod team should really read this first.

'''Tarquin:''' Mych takes (almost) sadistic delight in posting a link to this page on such threads. (though if he didn't, I would. And I'd enjoy it more... bwahaha!) ;)

'''Mychaeel:''' That's what I wrote it for, after all.  Much more efficient than ranting anew each and every time.  ;-)  Sadly enough, posting the link frequently doesn't cause people to read this text, let alone understand it.

'''autocol:''' As someone just beginning to take an interest in modifying games (coming from a 3DS animation background) I think the best advice for 99% of the people that really need to read this is: if you haven't got the skills, don't even bother! The number of people that entertain thoughts of being a professional footballer would make the mind boggle, but how many make it? As a percentage, close enough to zero. I think the number of people who entertain thoughts of creating a sweet mod, when compared to the number of people with the talent, vision, skills and tenacity to actually create a playable mod, when expressed as a percentage, is again, basically zero. I've got an awesome idea for a mod, but I think I'll start by creating the SIMPLEST mutator I can think of... I think most of the guys that post these &quot;team requests&quot; should do the same.

'''Kuhal:''' '''reply to autocol'''  Your analogy is flawed IMO.  The fact that very few people achieve something is not good grounds for not trying in the first place.  If everyone stopped trying, then there would never be any successes right?  And if people without the technical ability don't try...they will never get the techincal ability.  If you meant people without '''''potential''''' then that's even worse because who can judge someone's potential without having spent alot of time with them?  10 years ago it was unheard of for people in their own homes to be modelling 3D animations.  It was unheard of for coders to be writing a few lines of code and effecting such huge changes to a complex game like UT.  Yet today, we have topics dedicated to helping new entrants to the modding community to rationalise their chances of success or failure.  I think this is great progress.  Success of an industry can be measured by it's failures as well as it's triumphs.  The more people that try, fail and try again the better IMO.  It all adds to a richer community.  I applaud this Wiki for attempting to help the majority of would be modders who do not ''yet'' have the technical ability but want to try.  BTW, there is absolutely no ill intent in this message.  Just my rant on Mych's rant triggerd by your comments :)  Cheers

'''autocol:''' Fair enough... Strangely, I think we actually agree with each other but perhaps I expressed myself poorly. As a relative newbie to the idea of modifying games, I've found the Wiki - and various other tutorial sites - absolutely invaluable resources in starting to consider creating my own game content. Without these resources there's not a snowballs chance in hades I would have figured it out. I'm certainly not saying that people should just give up and take up knitting, which is perhaps how my original comment may have read. What I '''am''' saying is that these people that make requests should '''TRY''' some simple mutators, practise some coding/mapping/skinning/whatever-ing BEFORE they make these open requests for loads of experienced coders/mappers/skinners/whatever-ers to join their mod and make them the gaming equivalent of Bill Gates. I agree that &quot;the more people that try, fail and try again the better.&quot; (Myself, I'm doing a lot of the &quot;failing&quot; at this point :)) My rant was really directed at those people that can't be bothered with the &quot;try&quot; part...

'''Kuhal:''' Yep we do agree then.  

'''Githianki:''' Good advice, though a tad &quot;discouraging&quot; in the intro.  I understand the frustration you are trying to prevent but since this is mostly a problem with those new to the scene, the advice needs to come in a tone less preachy at the start or people won't read the (rather lengthy) entire article.  I know you probably didn't mean it to be preachy but context is going to vary with the reader's experience level.  Those who are familiar with the mod scene will have patience and see the wisdom in the advice you have laid out.  On the other hand, those new to the scene might say &quot;He says he isn't talking about me but then he says to me 'You are here because I or someone else think I do need to talk to you'&quot;.  There is a conflicted message to the reader there.  If new modders are impatient (and needing the advice the most), will they bother to continue reading after that intro?  Maybe.  The article is good but it could be improved with regards to its intended audience. Go for greatness! You are quite clearly capable of it as evidenced by your words across this wiki. BTW -its Reinhart not Reinhard, just edited little typo away :) 

'''Wormbo:''' Does anyone think it's worth mentioning the [http://mep.beyondunreal.com/mymod.html SUPER UBER COOL MOD]? ;)

'''Tarquin:''' yup!

'''Legal:''' Damn you Wormbo, I was just about to!

'''ZxAnPhOrIaN:''' Tisk, Tisk, Tisk... Even i, a newbie to uscript, could make a better description than them. Their mod is destined to SUFFER!!!

'''Cookie:''' One thing this page is lacking is a paragragh on copyright laws. It's kinda scary how many mod startups think it's perfectly OK to unabashedly rip off another game. Especially one that's still in production. People simply DO NOT UNDERSTAND (or care about) Copyright Law. (But then they will complain violently about people ripping off 'their' ideas.) I would write the article but frankly I just don't have the time. Could someone please write something about this issue for the benefit of all the new UT2k3 start ups?

'''BM.Deathwind:''' @Cookie ... having sorta &quot;been there done that&quot; before, I could write up an article about copyrights, fair use, etc...  I'm not formally educated in Copyright law, so if there's someone around here who is, it might be better off in their hands.  But if nothing else, I could certainly create a basic explaination, which would typically be enough for those in the mod community.

'''Mychaeel:''' I believe that copyright and &quot;fair use&quot; issues warrant an article of their own (and I'll be happy to link to it from here).  When I wrote this rant I didn't even think it'd be necessary to expressly tell people to respect other people's intellectual property.

'''Tarquin:''' move &amp; refactor tor  [[Legacy:Mod Copyright|Mod copyright]]?

'''Cookie:''' Yeah, you're probably right about the copyright issue needing its own discussion Mychaeel. Especially when every other Mod-Startup asking for help over on BuF is a straight rip-off of another movie or game. I think the biggest problem is the oft-stated misconception that's its perfectly OK to steal intellectual property, as long as its for &quot;non-commercial&quot; use.

'''Legal:''' This page should contain this, but where?: Do send emails signed [your mod] but do not use [mod's name] as your forum account name.

And something about spelling, punctation and h4x0rz $p34k.

'''Dante:''' I don't know if it fits well in here, but there's a very good post on &quot;how to recruit a programmer&quot; on http://www.ina-community.com/forums/showthread.php?threadid=266017.

'''Mychaeel:''' See [[Legacy:How To Recruit A Programmer|How to Recruit a Programmer]].

'''Dante:''' Maybe I should've tried the &quot;search&quot; feature on this wiki... ;)

'''Mosquito:'''  Very nice read Mych, but I think there's a couple things you need to add.  People need to know how realistic making a mod is and getting a team together.  It's like finding a job.  You have to put previous work on your resume to get a better chance of getting the job.  You should add in that the best way to get team members, is to already have worked on either a REALLY nice mod where your work was top notch, or you've done important work for 3 or 4 other mods.  That way people can not only see that there's proof that you're capable, they can also see the quality of your work.  Mod developers look for competent leaders that can take the brunt of the work.  It's important that you know how to do more then just 1 thing for the mod, however coders seem to get the interest these days.  Your right that there is a skill ladder, where webpage design is at the bottom and everything else above it.  But what if your only skill is mapping? or design map textures?  Where's the mod going to go with those skills?  Anyways, that's my comments.

'''Sordith:''' Nice read.  Something every new mod developer/indy game developer should read.  Another thing you might want to add is an example of a design doc.  Some tutorials can be found here:

http://www.gamedev.net/reference/list.asp?categoryid=23

'''Pendulum:''' I've read this entire document.  I guess you could call me one of those outsiders.  I'm however not going to try and recruit anyone until I absolutely need some help.  I'm going to try and do everything I can on my own.  I'm not worried about getting my mod done in some specified amount of time (even though having the chance to win some of the money in the new contest would be nice), so I'm going to learn everything I can and do everything I possibly can on my own.  I believe this is the way for me to get the experience I need, learn anything and everything.  I'm no artist so that is my weak point, but good quality textures and skins aren't the most important thing in my opinion, they can wait till closer to the end.  I'm sure everyone else has different ideas on this.

'''Swift Viper:''' That page that Wormbo linked to was funny! I don't know what is worse, that page or saying New Mod, e-mail me for more information. I hate when people do that and they get upset when people ask what the mod is (I'm allow to link to threads in the main UT2k3 fourms right?). Those are the kind of mod team I would not join. I'm confused about one thing, how much do you need to know (besides Programming) before asking for help? I don't want to miss up someday.

'''EntropicLqd:''' It's not a question of how much you need to know .. it's more a question of what you've done already.  For example if you've made a really cool looking weapon, modelled, animated, and skinned it - and can't code up the weapon code yourself - then asking for a coder's help about the time you are animating the weapon would be good.

'''Foxpaw:''' I agree, you don't have to know how to program or anything, but you do need to have done enough to demonstrate that you don't expect everyone else to do it for you. If, in Entropic's example above, you ask a coder to join you right when you start, then he/she/it is ready to start testing and your model is not ready, the programmer may become frustrated and unmotivated. Likewise, if you are the programmer, and you ask someone to model the weapon for you, they may be disappointed when they are finished and can't see their model in the game because you aren't finished yet.

'''Swift Viper:''' So in other words I could program the whole weapon and have it working and everything? Is that good enough, so they will only have to make the model and import it, then everything is in place? What about the maps? As for the model, do I have to make a basic low poly model so someone else can get the idea of what it should look like and finish it up and skin it? I'm trying to make sure I get it right for when the time comes and not mess up and look dumb, but that won't be anytime soon. BTW I might become a programmer, so having working code and the ideas done will be enough right? Sorry if anything has already been answered or if any questions have been repeated, want to make sure I get it right the FIRST time (and reading the page a good few times).

'''EntropicLqd:''' Firstly, don't worry about getting the balance right the first few times.  People make mistakes - the trick is to learn from them.  Secondly - all people really want is for you to demonstrate some ability in terms of actually doing the work to create the mod.  It doesn't matter how much (or little) you get done before asking for help - the fact that you have done something towards the effort needed to create the mod is enough to at least overcome people's initial wariness.
: There are plenty of people who come up with a mod idea, throw a web-site together and expect other people to actually do the work (making the models, cutting the code, doing the maps).  Those type of people are the ones to avoid - they have no knowledge or ability in the work of creating the mod.  And often they don't want to be involved at all - apart from as an overseer.

'''Swift Viper:''' Thanks for the help, I already got a lot of ideas/plans in a text file and keep adding more and more ideas. Soon I should learn programming (hopefully). Is this good enough to say:

&quot;I'm making a new mod called (name) and information can be found (website). The ideas and some of the programming is already done, I'll need # 2D artists, # of 3D artists, # mappers and maybe another programmer. If you would like to help e-mail me at (address).&quot;

Is that good enough? Again, I won't have to worry about this for awhile as I have very little skills in those areas anyway. I don't want to be one of those people that &quot;Can you make this mod for me?&quot;, but one of the ones that &quot;I'm working on this mod and I got some stuff done and would anyone be willing to help me please?&quot;. I really want to make my dreams come true, because if someone else did it (as in me doing nothing, not team help), it would not feel right. I think the best thing to do now is the planning till I get any skills in anything.

'''Foxpaw:''' I'd include a little bit about it in the message, like a good novel you'll need to catch the person's interest in the beginning if you want them to read more. Due to the frequency of people looking for a team, I don't think everyone will go to the website to read about it. You certainately don't have to put the whole design document in the message, but enough to catch their interest. I'd think so anyway. 

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>40318</id>
      <timestamp>2009-12-07T00:11:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>formatting fixes</comment>
      <text xml:space="preserve">{{innerbox|''The following expresses my personal opinion and not necessarily anybody else's.  Do not edit, but feel free to comment in the comments section at the bottom of the page.''
&lt;br&gt;
''The opinions stated here are subject to change without notice.''}}

----

'''Before you start reading,''' here are a few common misunderstandings about this page I'd like to avoid.

* I'm not talking about ''your'' mod or mod concept in particular here, and some parts of this article might not even apply to you.

* Neither I nor the person posting a link to this article are trying to offend you.

* It is not sufficient to read the parts in boldface to understand this article.  (If it was, I wouldn't have bothered with writing the parts in-between.)  Especially if you think you don't need this advice, please at least read the ''entire'' article and ponder it in order to make that an educated decision, not just an offended retort.

...and a '''request to people linking to this page:'''  Please be polite and constructive.  Your advice, although probably well-meant, is unrequested and most likely unasked for.  If you really want to help, be kind.

==Mod Startups ==

I'm writing this in anticipation of a surge of calls for new mod teams as soon as [[Legacy:UT2003|UT2003]] is released to the public.  Already now, a couple of weeks before the release and still before the demo is officially available, many people are posting in forums with their mod ideas in search for a team to make them reality.

Unfortunately, many of those calls are doomed to start with.  Why?  Read on.

===Mod Ideas ===

[[Image:Legacy_userfriendly-modstartups-ideas.gif|center|]]

{{innerbox| Everyone is an idea man. Everybody thinks they have a revolutionary new game concept that no one else has ever thought of. Having cool ideas will rarely get you anywhere in the games industry. You have to be able to implement your ideas or provide some useful skill. This also applies to mod authoring. If you become a skilled or notable mod author, you will find people propositioning you to implement their ideas.
&lt;br&gt;
Never join a project whose idea man or leader has no obvious development skills. Never join a project that only has a web designer. You have your own ideas. Focus on them carefully and in small chunks and you will be able to develop cool projects.
&lt;br&gt;
: ''Brandon Reinhart, [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring]]''}}

There's nothing wrong with enthusiasm or having great ideas that go beyond things that already exist.  But enthusiasm and ideas alone don't make a mod; you need skilled people for that.  Of course everybody who calls for a mod team realizes that.  Only few people realize what such a call takes to be attractive though.  Ask yourself:

* '''Why should anybody be interested in joining your team?'''  Don't presume that anybody will be awestruck by your idea.  Everybody is an idea man; rarely a mod fails because the people making it ran out of ideas.  Good coders, mappers, modellers, animators, skinners wouldn't be that way if they hadn't a whole bunch of ideas of their own.  Especially if your idea just marginally improves on an existing idea (like the n-th Counter Strike clone, or what appears as one to the casual reader), it's hard to communicate the point of your venture to the people who might be able to realize it.  Besides, people that are good at their respective trade are notoriously busy with either their own projects or other team projects they're in.

* '''What do you add to the project yourself?'''  Why would anybody want to sacrifice their independence to work with you?  If it's just your mod idea, it'd better be a damn good one.  Wanting to make a website and PR work won't do.  I'm by no means underestimating the value of an attractive website and great PR work, but on the priority list of things crucial to creating a good mod those items are still ranking below technical skills like modelling, skinning, coding and mapping.  On the other hand, if you sort that list by how easy it is to find someone who fills those positions, it's exactly upside-down:  If you ''have'' a mod, it's not a big deal to do the PR work and a website for it.

* '''Isn't there already another team that does the same?'''  Certainly not ''exactly'' the same, but close enough.  Be realistic:  You'll have a better chance to end up with a finished thing to be proud of if you're working together with other people rather than splitting the (usually small) community that's interested in ideas like yours into very small fractions each of which hardly has a chance to ever get something with the scope of your (and their) ideas done.  You don't have to abandon your own ideas by joining another project.  If your ideas are good (and the team you're joining is good), they'll be open to what you're saying, if you do it in nice way.  Keep in mind:  You won't get any recognition at all if you're the leader of a team of one and your mod never goes beyond the state of a flashy website.

* '''What kind of working relationship do you offer?'''  People (especially those that know that you need their help) are hardly inclined to join a team as a mere subject to a leader's every whim.  The people you're looking for expect to be treated as equals in a team where everybody's opinions are valued.  (Besides, a good team doesn't need an official &quot;lead&quot; position at all.)

Last, but by no means least:  '''Respect the rules of the community you're approaching.'''  Yeah, it's obvious, but experience tells that it's unfortunately not obvious to everyone.  If you're posting in a forum system with many individual forums on different topics, don't spam your posting into more than one of those forums.  All you'll achieve is that people get mad at you before they've even read your posting.  It's hard to get somebody to help you who's mad at you to start with.  For that matter (if common courtesy isn't enough reason already), don't belittle other people or projects in the process of advertising your mod.

If you don't believe ''me'' on that, read what Pxtl has to say on [http://forums.beyondunreal.com/showthread.php?postid=1423141#post1423141 Team Fortress mods].

===Concept ===

[[Image:Legacy_userfriendly-modstartups-concept.gif|center|]]

If you're still confident that there's a good chance that somebody might be interested in your mod when you advertise it in a forum posting, '''make a concept.'''  Your concept is your mod idea's advertisement; you're about to sell your mod idea to other people, so posting something along the lines of &quot;I have a great idea, send me a message if you want to know more&quot; is completely ineffective.  Forum regulars have seen dozens of idea people already, and reading your forum posting is the peak of what you'll get of their attention at this time.  You have to grab them at this time, or you'll lose them forever.

Your concept doesn't need to be finished to the last detail, but it should show that you understand the scope of what you're venturing.  Be realistic, not overly enthusiastic.

Don't waste your time with designing an intricate internal hierarchy of team members; I've seen mod concepts where that part took as much room as the technical concept of the mod itself.  Assign a lead coder or lead mapper when you ''have'' those people already and find that you need them to efficiently channel your team's organization.  Many teams work very well without an internal hierarchy.  In fact, teams frequently work ''better'' if everybody feels that they're on an equal footing with the rest of the people they work with, and with nobody to scratch their ideas and objections with just a shrug and a decree.  (Then again, that really only works with the right people; but wait until you find out what kind of internal organization works best for your team before you attempt to design one artificially.)

You can't ''decree'' that your mod is going to be quality; stating so in your concept is just a display of hubris (don't you think every mod team tries to make a quality mod?).  Making a quality mod is a lot of work, some of which is far from being outright fun.  See the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Modding Etiquette|Modding Etiquette]] for a glimpse of it.

==Comments ==

'''Mychaeel:'''  I'm tired of ranting the same over and over again, each time somebody posts about his/her ideas for a cool new project in forums in a way that will hardly yield any positive result.  Any thoughts on the content?

'''Luggage:''' Interesting read. :) I'm just working on a concept paper myself, so it was really interesting. This seems to be aimed at community outsiders though, I think that only applies to maybe 20-30% of mod makers. Still it was pretty interesting to me. :)

'''Mychaeel:'''  Incidentally, it appears that most people posting a request for team members for their new mod ''are'' indeed community outsiders.  In any case, they're mostly ''modding'' community outsiders, and many of them make the same mistakes:  Thinking that the fact alone that they've got an idea will spark everybody's interest, and that technically skilled modders are just sitting idly and waiting for an opportunity to join somebody with a mod idea (but, in too many cases, hardly any mod making skills) because they're out of ideas themselves.

'''Luggage:''' Hehe, true. With the concept I spoke of, I'm now trying to get a playable ''interesting'' core version done of what will hopefully evolve into a UT2k3 TC. I have the whole project in my head and I'm in the process of writing it all up in a concept paper, but I'm starting out with the core element of gameplay. The other stuff that is planned enhances this further and adds more to the gameplay. Damn, this could really work out :)

'''BesigedB:''' The unrealed goblin is coming to get you

'''Jb:''' I agree with your thoughts Mychaeel. Its nice to see that the people out there have ideas. Speaking of that, with all the new features that engine in UT2003 will support I can see a lot more creative ideas coming...How about a Tribe2 UT version that works :) heheh j/k

'''Will:''' interesting read, Mychaeel, it seems many people who post on forums asking for a mod team should really read this first.

'''Tarquin:''' Mych takes (almost) sadistic delight in posting a link to this page on such threads. (though if he didn't, I would. And I'd enjoy it more... bwahaha!) ;)

'''Mychaeel:''' That's what I wrote it for, after all.  Much more efficient than ranting anew each and every time.  ;-)  Sadly enough, posting the link frequently doesn't cause people to read this text, let alone understand it.

'''autocol:''' As someone just beginning to take an interest in modifying games (coming from a 3DS animation background) I think the best advice for 99% of the people that really need to read this is: if you haven't got the skills, don't even bother! The number of people that entertain thoughts of being a professional footballer would make the mind boggle, but how many make it? As a percentage, close enough to zero. I think the number of people who entertain thoughts of creating a sweet mod, when compared to the number of people with the talent, vision, skills and tenacity to actually create a playable mod, when expressed as a percentage, is again, basically zero. I've got an awesome idea for a mod, but I think I'll start by creating the SIMPLEST mutator I can think of... I think most of the guys that post these &quot;team requests&quot; should do the same.

'''Kuhal:''' '''reply to autocol'''  Your analogy is flawed IMO.  The fact that very few people achieve something is not good grounds for not trying in the first place.  If everyone stopped trying, then there would never be any successes right?  And if people without the technical ability don't try...they will never get the techincal ability.  If you meant people without '''''potential''''' then that's even worse because who can judge someone's potential without having spent alot of time with them?  10 years ago it was unheard of for people in their own homes to be modelling 3D animations.  It was unheard of for coders to be writing a few lines of code and effecting such huge changes to a complex game like UT.  Yet today, we have topics dedicated to helping new entrants to the modding community to rationalise their chances of success or failure.  I think this is great progress.  Success of an industry can be measured by it's failures as well as it's triumphs.  The more people that try, fail and try again the better IMO.  It all adds to a richer community.  I applaud this Wiki for attempting to help the majority of would be modders who do not ''yet'' have the technical ability but want to try.  BTW, there is absolutely no ill intent in this message.  Just my rant on Mych's rant triggerd by your comments :)  Cheers

'''autocol:''' Fair enough... Strangely, I think we actually agree with each other but perhaps I expressed myself poorly. As a relative newbie to the idea of modifying games, I've found the Wiki - and various other tutorial sites - absolutely invaluable resources in starting to consider creating my own game content. Without these resources there's not a snowballs chance in hades I would have figured it out. I'm certainly not saying that people should just give up and take up knitting, which is perhaps how my original comment may have read. What I '''am''' saying is that these people that make requests should '''TRY''' some simple mutators, practise some coding/mapping/skinning/whatever-ing BEFORE they make these open requests for loads of experienced coders/mappers/skinners/whatever-ers to join their mod and make them the gaming equivalent of Bill Gates. I agree that &quot;the more people that try, fail and try again the better.&quot; (Myself, I'm doing a lot of the &quot;failing&quot; at this point :)) My rant was really directed at those people that can't be bothered with the &quot;try&quot; part...

'''Kuhal:''' Yep we do agree then.  

'''Githianki:''' Good advice, though a tad &quot;discouraging&quot; in the intro.  I understand the frustration you are trying to prevent but since this is mostly a problem with those new to the scene, the advice needs to come in a tone less preachy at the start or people won't read the (rather lengthy) entire article.  I know you probably didn't mean it to be preachy but context is going to vary with the reader's experience level.  Those who are familiar with the mod scene will have patience and see the wisdom in the advice you have laid out.  On the other hand, those new to the scene might say &quot;He says he isn't talking about me but then he says to me 'You are here because I or someone else think I do need to talk to you'&quot;.  There is a conflicted message to the reader there.  If new modders are impatient (and needing the advice the most), will they bother to continue reading after that intro?  Maybe.  The article is good but it could be improved with regards to its intended audience. Go for greatness! You are quite clearly capable of it as evidenced by your words across this wiki. BTW -its Reinhart not Reinhard, just edited little typo away :) 

'''Wormbo:''' Does anyone think it's worth mentioning the [http://mep.beyondunreal.com/mymod.html SUPER UBER COOL MOD]? ;)

'''Tarquin:''' yup!

'''Legal:''' Damn you Wormbo, I was just about to!

'''ZxAnPhOrIaN:''' Tisk, Tisk, Tisk... Even i, a newbie to uscript, could make a better description than them. Their mod is destined to SUFFER!!!

'''Cookie:''' One thing this page is lacking is a paragragh on copyright laws. It's kinda scary how many mod startups think it's perfectly OK to unabashedly rip off another game. Especially one that's still in production. People simply DO NOT UNDERSTAND (or care about) Copyright Law. (But then they will complain violently about people ripping off 'their' ideas.) I would write the article but frankly I just don't have the time. Could someone please write something about this issue for the benefit of all the new UT2k3 start ups?

'''BM.Deathwind:''' @Cookie ... having sorta &quot;been there done that&quot; before, I could write up an article about copyrights, fair use, etc...  I'm not formally educated in Copyright law, so if there's someone around here who is, it might be better off in their hands.  But if nothing else, I could certainly create a basic explaination, which would typically be enough for those in the mod community.

'''Mychaeel:''' I believe that copyright and &quot;fair use&quot; issues warrant an article of their own (and I'll be happy to link to it from here).  When I wrote this rant I didn't even think it'd be necessary to expressly tell people to respect other people's intellectual property.

'''Tarquin:''' move &amp; refactor tor  [[Legacy:Mod Copyright|Mod copyright]]?

'''Cookie:''' Yeah, you're probably right about the copyright issue needing its own discussion Mychaeel. Especially when every other Mod-Startup asking for help over on BuF is a straight rip-off of another movie or game. I think the biggest problem is the oft-stated misconception that's its perfectly OK to steal intellectual property, as long as its for &quot;non-commercial&quot; use.

'''Legal:''' This page should contain this, but where?: Do send emails signed [your mod] but do not use [mod's name] as your forum account name.

And something about spelling, punctation and h4x0rz $p34k.

'''Dante:''' I don't know if it fits well in here, but there's a very good post on &quot;how to recruit a programmer&quot; on http://www.ina-community.com/forums/showthread.php?threadid=266017.

'''Mychaeel:''' See [[Legacy:How To Recruit A Programmer|How to Recruit a Programmer]].

'''Dante:''' Maybe I should've tried the &quot;search&quot; feature on this wiki... ;)

'''Mosquito:'''  Very nice read Mych, but I think there's a couple things you need to add.  People need to know how realistic making a mod is and getting a team together.  It's like finding a job.  You have to put previous work on your resume to get a better chance of getting the job.  You should add in that the best way to get team members, is to already have worked on either a REALLY nice mod where your work was top notch, or you've done important work for 3 or 4 other mods.  That way people can not only see that there's proof that you're capable, they can also see the quality of your work.  Mod developers look for competent leaders that can take the brunt of the work.  It's important that you know how to do more then just 1 thing for the mod, however coders seem to get the interest these days.  Your right that there is a skill ladder, where webpage design is at the bottom and everything else above it.  But what if your only skill is mapping? or design map textures?  Where's the mod going to go with those skills?  Anyways, that's my comments.

'''Sordith:''' Nice read.  Something every new mod developer/indy game developer should read.  Another thing you might want to add is an example of a design doc.  Some tutorials can be found here:

http://www.gamedev.net/reference/list.asp?categoryid=23

'''Pendulum:''' I've read this entire document.  I guess you could call me one of those outsiders.  I'm however not going to try and recruit anyone until I absolutely need some help.  I'm going to try and do everything I can on my own.  I'm not worried about getting my mod done in some specified amount of time (even though having the chance to win some of the money in the new contest would be nice), so I'm going to learn everything I can and do everything I possibly can on my own.  I believe this is the way for me to get the experience I need, learn anything and everything.  I'm no artist so that is my weak point, but good quality textures and skins aren't the most important thing in my opinion, they can wait till closer to the end.  I'm sure everyone else has different ideas on this.

'''Swift Viper:''' That page that Wormbo linked to was funny! I don't know what is worse, that page or saying New Mod, e-mail me for more information. I hate when people do that and they get upset when people ask what the mod is (I'm allow to link to threads in the main UT2k3 fourms right?). Those are the kind of mod team I would not join. I'm confused about one thing, how much do you need to know (besides Programming) before asking for help? I don't want to miss up someday.

'''EntropicLqd:''' It's not a question of how much you need to know .. it's more a question of what you've done already.  For example if you've made a really cool looking weapon, modelled, animated, and skinned it - and can't code up the weapon code yourself - then asking for a coder's help about the time you are animating the weapon would be good.

'''Foxpaw:''' I agree, you don't have to know how to program or anything, but you do need to have done enough to demonstrate that you don't expect everyone else to do it for you. If, in Entropic's example above, you ask a coder to join you right when you start, then he/she/it is ready to start testing and your model is not ready, the programmer may become frustrated and unmotivated. Likewise, if you are the programmer, and you ask someone to model the weapon for you, they may be disappointed when they are finished and can't see their model in the game because you aren't finished yet.

'''Swift Viper:''' So in other words I could program the whole weapon and have it working and everything? Is that good enough, so they will only have to make the model and import it, then everything is in place? What about the maps? As for the model, do I have to make a basic low poly model so someone else can get the idea of what it should look like and finish it up and skin it? I'm trying to make sure I get it right for when the time comes and not mess up and look dumb, but that won't be anytime soon. BTW I might become a programmer, so having working code and the ideas done will be enough right? Sorry if anything has already been answered or if any questions have been repeated, want to make sure I get it right the FIRST time (and reading the page a good few times).

'''EntropicLqd:''' Firstly, don't worry about getting the balance right the first few times.  People make mistakes - the trick is to learn from them.  Secondly - all people really want is for you to demonstrate some ability in terms of actually doing the work to create the mod.  It doesn't matter how much (or little) you get done before asking for help - the fact that you have done something towards the effort needed to create the mod is enough to at least overcome people's initial wariness.
: There are plenty of people who come up with a mod idea, throw a web-site together and expect other people to actually do the work (making the models, cutting the code, doing the maps).  Those type of people are the ones to avoid - they have no knowledge or ability in the work of creating the mod.  And often they don't want to be involved at all - apart from as an overseer.

'''Swift Viper:''' Thanks for the help, I already got a lot of ideas/plans in a text file and keep adding more and more ideas. Soon I should learn programming (hopefully). Is this good enough to say:

&quot;I'm making a new mod called (name) and information can be found (website). The ideas and some of the programming is already done, I'll need # 2D artists, # of 3D artists, # mappers and maybe another programmer. If you would like to help e-mail me at (address).&quot;

Is that good enough? Again, I won't have to worry about this for awhile as I have very little skills in those areas anyway. I don't want to be one of those people that &quot;Can you make this mod for me?&quot;, but one of the ones that &quot;I'm working on this mod and I got some stuff done and would anyone be willing to help me please?&quot;. I really want to make my dreams come true, because if someone else did it (as in me doing nothing, not team help), it would not feel right. I think the best thing to do now is the planning till I get any skills in anything.

'''Foxpaw:''' I'd include a little bit about it in the message, like a good novel you'll need to catch the person's interest in the beginning if you want them to read more. Due to the frequency of people looking for a team, I don't think everyone will go to the website to read about it. You certainately don't have to put the whole design document in the message, but enough to catch their interest. I'd think so anyway.

*****UltraHyperCode***** Hey sup every1 i hade been thinking bout trying to make a new modd for ut2004 where every1 could beable to use it and have some fun with it i hope maybe ya and so i guess you could say it kindda would be like those really old megaman games that came out for the nes system over 14 years ago now and it would have some other newer stuff and things added to it also that would make it i hope look really kool to play all the time and one of the maps or levels would be called ULTRA-WARZ. so i am not really sure how long it would take me to try and finish everything since i am just a beginner and just starting out with all this modding stuff here, so every1 just let me wat you all think bout this idea i hade here ok and thanks every1 bye.... 

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mychaeel/Modding Etiquette</title>
    <id>1762</id>
    <revision>
      <id>4323</id>
      <timestamp>2006-04-07T07:48:56Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">{{innerbox| ''This page is a collection of ramblings of mine.  Do not edit, but feel free to comment.  (Scroll down for comments.)''

}}

{{innerbox| ''I might change my mind on the matters discussed on this page without notice.  Part of the reason I'm writing them down is that I want to validate them for myself; that's much easier if I have to reflect on how to put them in words.''

}}

==Modding Etiquette ==

'''So you want to make a mod?'''  Great!  Welcome to the modding community.

First of all, there is a variety of ways you can learn things &amp;ndash; the hard way, or by listening to advice of people who have been there.  Nobody expects you to take that advice without reflection or by anybody's (actual or self-proclaimed) authority.  Just think about it.  When you actually start thinking about the stuff people more experienced than you are telling you, you might end up realizing that there's some truth in them.

This article is not about the technicals of modding &amp;ndash; I'm assuming that you're familiar with them or know how to become that way.  It's about the '''Etiquette of Modding''' &amp;ndash; how to make people ''like'' your mod.

===Understand Your Audience ===

The key to making people ''like'' your creation is looking at it from their point of view, not yours.

Yes, I know you have put hard work and lots of dedication into your mod, without getting any revenue from it.  And most people don't care; that's a simple truth.  But then again, they don't owe you anything &amp;ndash; you have no deal with them; they didn't hire you or promise you anything.

Now that your mod is released, the people out there are spending time and effort downloading and installing it.  It might be negligible effort compared with what you put into creating the mod, but that comparison doesn't apply &amp;ndash; as I said, they don't owe you anything to start with.  Only in the moment they're actually trying out your mod, you're starting to have a deal with them:  They invested time and work in attempting to try out your mod, so '''you better make it worthwhile.'''

That simple realization immediately leads to a couple of points:

====Don't Raise False Expectations ====

More than obviously misleading statements the ''lack'' of a statement can lead people to fall back to default expectations that don't apply for your mod.  The only thing you can gain by people believing in promises that your creation can't keep is a mob of disappointed, flaming users.  That is something you should avoid.

* '''Public alpha and beta versions''' have their place, but that place is equipped with big flashing red warning sign.  (Don't take this literally; any sort of unmistakable warning suffices.)  That means, everywhere, not just hidden somewhere on the download page and in the readme file.  Your audience should never even start believing that they're dealing with a release-quality product if they aren't.  If you're ashamed of admitting that your release is just a beta yet, don't release it.  (I'll pick that up later again.)

* Unreal Tournament mods are, by default, '''platform-independent.'''  Thus, if you don't expressly state otherwise, your users will expect nothing else; so the same big red flashing warning thing applies as well if you release a mod that is, for instance, Windows-only &amp;ndash; be it because you put some native code in or just released your mod in shape of an .exe installer.  Mac and Linux users will hate you if they click on a download link in happy anticipation just to learn that they've been purposely left out.  If that realization occurs only after an hour-long download, even worse.  (And would you blame them?)

* People expect mods to '''work both online and with bots.'''  See to it.

====Make Your Mod User-Friendly ====

The average user will neither read a FAQ, nor a readme file, nor a manual unless he or she is hard pressed to or highly motivated.  You can assume neither to start with.  The best way to deal with that is making reading FAQs, readmes and manuals optional &amp;ndash; in other words, spend some time to design your mod in a way that works as the user expects it to.  If you're unsure whether that extra design time of yours is worthwhile, just think of all the time you'll save yourself by not having to groan &quot;Read the FAQ&quot; or &quot;It's all in the manual.&quot;

* '''Use existing facilities''' the user is familiar with rather than inventing your own, even if you think that you could do it marginally better.  Stick to UMod installers and plain zipped distributions if you can help it.  Use the built-in mod launcher instead of creating your own flashy external launcher the user first has to look for (after reading the manual) in the System directory.  Plug your server browser tab into Unreal Tournament's built-in server browser.  Make in-game controls work as users are used to them.

* '''Don't impose arbitrary restrictions''' on how your mod works.  Mutators, for instance, are by design and by default cross-compatible to each other; but of course that doesn't mean that it's impossible for you to create a mutator that won't play well with others (by subclassing PlayerPawn, for instance).  If there's an actual need for such a restriction, make it inherently obvious.  Otherwise, investing time in coding something a less straightforward way to achieve the same goal while keeping compatibility is time very well spent.  An arbitrary restriction mentioned in a FAQ or readme file will just shift people's perception of it from &quot;bug&quot; to &quot;known bug,&quot; nothing else.

* '''Actively provide guidance''' for things that aren't obvious.  Don't assume people have read the manual and know that pressing this-or-that button will pop up a menu crucial for gameplay &amp;ndash; put that information somewhere on the HUD, for instance, at a reasonably unobtrusive, but visible location.  (And add an option for advanced users to switch that extra help off.)  Strangelove does that for its flight controls, Jailbreak for scoreboard sorting options.

* '''Provide a convenient and thorough uninstaller''' for your mod, and make sure it works as advertised.  If people are unsure whether your mod is worth a try, they'll be much more inclined to give it a chance if they know that they can quickly get it off their harddisk again in case they don't like it.  Also, if somebody wants to uninstall your mod but can't figure out how (and possibly ends up reinstalling the game in order to get rid of it) that's a surefire way to make certain he or she will never try any future version of your mod again.

====Be True To Yourself ====

{{innerbox| I've actually come to think that a team's chance of success is inversely proportional to the amount of time spent on the web site.

 : ''fragbert''

}}

If people get the impression that you're overrating your work, they'll be much less inclined to add to all the credit you're already giving yourself.

* '''Keep the hype at a reasonable level.'''  That goes hand-in-hand with the &quot;don't raise false expectations&quot; issue mentioned above.

* Don't fancy yourself of making a '''Total Conversion''' if the differences to what you're converting don't justify it.  There's no less honor in making a great mutator or a fun game type as there is in making a Total Conversion.  All those mod types have their place and uses, but thinking of a Total Conversion as the epitome of a game modification is simply wrong.  If you ever try to deal with the issues imposed by people's expectations of a game type mod or a mutator (for instance, cross-compatibility with other types of custom game content), you'll be left without any doubt of that assessment.  The demands of making a Total Conversion are ''different'', but not necessarily ''more sophisticated''.

* A custom launcher, splash screen, look-and-feel '''don't make your mod look professional''' &amp;ndash; just like smoking doesn't make you look cool.  (Generously quoting luquado from Nali City, &quot;that only works for cool people&quot; &amp;ndash; or professional mods, for that matter.)  Add those things as fancy final touches if you must, but don't think of them as a requirement for your mod's professional appearance.

===Dealing With Critics ===

After your mod is released, you'll get all sorts of feedback &amp;ndash; both positive and negative.  You can reduce the negative feedback to a minimum by following the advice in the section above (keep in mind: disappointed users will be the least forgiving ones), but even then there'll still be people who just don't like your mod, or some aspects of it.

First off, '''ignore the trolls''' among them.  You can recognize them by their habitat and their behavior; since their goal is to provoke an (offended) reaction, they'll say their piece where a lot of people can read it, and it will be designed to insult you.  Just ignore trolls.  They're perfectly aware of what they're doing, and what they want you to do, and you're in no position to insult them by questioning their statement's validity.  Mock them, gently, with a smile on your face, if you like &amp;ndash; that'll drive them mad.  Just by no means take them seriously or behave that way.

But not everybody publicly bashing your work is a troll; be very careful before you dismiss somebody's criticism as simple trolling.  (It's all too easy to go that way rather than facing the fact that people are genuinely unhappy with your mod.)  There's practically no other reason for somebody not liking your mod and expressing it in your face than being disappointed by it.  Disappointment is the result of expectations that weren't met.  And there are two ways you can deal with that:  Either lower the expectations (won't help people who already had them), or meet them.

There are a couple of things you should ''never'' tell people criticising your work:

* '''&quot;Do it better.&quot;'''  The different roles of developers and users are clearly defined:  You (the developer) are investing time in order to get a positive response; the user is investing time in order to be entertained.  If your mod fails to deliver the latter to the user, you can't expect the user to deliver the first to you.  It's not a matter of switching roles.

* '''&quot;It's just a beta/an alpha.&quot;'''  Alpha and beta versions shouldn't be released to the general public in the first place (see below).  In any case, that your released product is still in alpha or beta stage certainly doesn't invalidate users' complaints or make the developers any less responsible for it, so pointing out that &quot;it's just a beta&quot; is a pointless thing to do.

* '''&quot;You didn't pay; you're not entitled to complain.&quot;'''  Remember what I wrote above about having a deal with your users &amp;ndash; they don't owe you, you don't owe them, until they invest time and work in trying to get your mod up and running.  They have every right to complain if that investment turns out to be wasted.  (If you actually do deliver what you promised though, it's your turn to have a right to get a positive response from them.)

===Public Alphas and Betas ===

Alpha and beta versions are by definition unfinished and should in fact never see a release to the general public.  Looking around in the Unreal modding community you could almost think exactly the opposite was true, though:  Mods are in &quot;public beta&quot; stage for ''years'', and mostly without an actual release on the horizon too.

Quoting somebody else [http://www.isbc.com/business/com_jargon.cfm]:

{{innerbox| ; Alpha : Software undergoes alpha testing as a first step in getting user feedback. Alpha is Latin for &quot;doesn't work.&quot;

 ; Beta : Software undergoes beta testing shortly before it's released. Beta is Latin for &quot;still doesn't work.&quot;

}}

So you're releasing software that doesn't work?  If you are, do yourself a favor and do it to a limited test crew that's steeled as to what's expecting them.  Saying &quot;But it's just a beta!&quot; in a hurt (or annoyed) voice to end users that bicker about your bug-ridden beta version isn't going to make anything better.  Besides, end users are notoriously bad bug reporters &amp;ndash; if you'd like to get useful bug reports, you can brief your beta tester crew, but you won't succeed in doing that with a mob of end users.

In fact, most of the time developers seem to misunderstand what &quot;alpha&quot; and &quot;beta&quot; actually refers to.  &quot;Alpha&quot; and &quot;beta&quot; are indicators for a release's ''quality'', not its completeness in regard to what the development team envisioned as the ultimate goal.  (Note:  That's to be differed from the notion of feature-completeness.  The latter is subject to what you defined to belong on the current release's feature list.)

It's very understandable that development teams, especially those not expecting any other revenue than (positive) user feedback, are yearning to get their product out as soon as possible.  '''Cutting the mod's quality is certainly an ill-advised choice though.'''  If you see that you can't complete your mod to the full extent of what you envision it to be in the timeframe you want to keep, take smaller steps:  Define subsets of that full feature list that make sense on their own.  If you plan a Total Conversion (see above) with five game types, you could restrict a first public release to a single game type.  But make it work in a quality as if it was a mod of its own.

{{innerbox| When you begin writing a mod you should start small. Don't plan to write a Total Conversion from the very start. If you set goals that are too hard to reach, you'll get frustrated in the process of working towards them. It is much better to set a series of small goals and work to each one in turn. Start with a simple idea that could be expanded into a larger game.

 Always work on small, managable chunks that could each be released in their own right. If you do undertake a large project, organize your features into a release schedule. If your game is going to have five new weapons, make a release with three while your work on the others. Pace yourself and think about the long term.

 : ''Brandon Reinhart, [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring]]''

}}

Those intermediate releases deserve an alpha and a beta stage in their own right.  There's no need to label the finished intermediate releases &quot;beta&quot; when they aren't.  It's perfectly possible to make them just as feature-complete and bug-free as any other release.  Time you spend making intermediate releases post-beta quality won't be lost when you continue working on your larger goal.

In any case, if you release intermediate versions, make them ''quality'' and '''don't call them beta.'''

==Related Topics ==

RegularX's ModSquad column:

[http://www.planetunreal.com/modsquad/ucc_make_14.htm ucc make (1.4): Patching the Beta]

[http://www.planetunreal.com/modsquad/ucc_make_15.htm ucc make (1.5): Fixing &quot;Patching the Beta&quot;]

==Comments ==

'''Mychaeel:'''  My intention here, as stated above, is trying to find out whether my stated notions make sense or not.  If they do, I strive to present them in a kindly, reasonable way that doesn't make anybody who's reading this feel as if I was saying &quot;You're an idiot for not doing it ''that'' way.&quot; &amp;ndash; I'm obviously stating my own opinion here and am not likely to feel offended by it, but what do other people think &amp;ndash; from a user's and a developer's point alike?

'''Tarquin:'''  They make sense to me. A very valuable addition to &quot;never join a mod with only a website&quot;.

'''Mychaeel:'''  Thanks for your opinion.  I ''had'' to get this off my chest sometime...

'''Tarquin:'''  okay, two criticisms about this page: it's too cleanly structured to be a ramble &amp; it's too rationally thought-out to be a rant ;)

'''Mychaeel:'''  Damn.  Gotta practice harder rambling and ranting.  ;-)

'''EntropicLqd:'''   Good page.  Very well written &amp;ndash; I can hear the restraining chains in the background though :).  About the only thing I'd be inclined to add is that if you do release intermediate versions give the packages their own release numbers (e.g. CTFPlus100.u, CTFPlus150.u).  I wished I'd done it after I wound up with 4 seperate versions of the mod on my HD and the only way to tell them apart was buy looking at the CTFPlusGame.uc file - duh!

'''Birelli:'''  Yeah, very nicely written Mych. Some of the things you pointed out kind of shaped into one statement my general feelings on things like alpha/beta releases and especially responses to critics. I witnessed the utter disaster that EV:Nova was (a mac-only game from Ambrosia). I saw a lot of &quot;do it better&quot; responses from the development team, which was assaulted by an angry mob of disappointed fans who had been being hyped up about the game for years. I didn't end up buying the game, and have never regretted the decision, as the game needed a lot of work that the development team wasn't willing to admit it did and the public was bashing them for not doing. Basically, the largest revenue source of a great gaming company was dashed because the developers they hired didn't follow these rules, so nice writing :-)

'''Tarquin:'''  Completely unrelated, but it's an equally well-written set of sensible guidelines that many people don't follow: Mac osX commandments: http://www.panic.com/audion/rights.html (nice screenies too)

'''Anonymous:''' This is almost a list of all the things Team Orbit did / does wrong. Don't quote me.

'''Dante:''' Very good. But I don't share the same opinion with alpha/betas. Even if &quot;they&quot; meant something else, they are even published by commercials. If you make a mod and your final product will take a looong time, but you want to hand something out earlier, a &quot;beta&quot; stamp does fit very well. People will understand, if they find any bugs. But if you didn't test it enough ( and so, almost always ), and you say it's 1.0 - and people find bugs in there, they won't be as forgiving. I remember, when I worked in Front Line Assault ( 2001 ) and the team was small, and developers were rare ( as they still are ) - we finally published an alpha. That was, because some members were lazy, some had too much RL. It was really crap, much bugs, and netplay ( omg I'm ashamed I did it ) was uhm - nm ;) But the point is, that all people who have spoken too me said &quot;Yeah, it's buggy, but it's really cool for an alpha&quot;. We also got reviewed, and got a good rating. So I would suggest, only release things non-alpha/beta which really fit your design doc and don't have much &quot;known&quot; bugs.

'''Mychaeel:''' My basic point is:  Don't publicly release buggy software.  Never.  For me, as a developer, that's a matter of professional attitude; and for me, as a user, it's something I simply expect from developers with professional attitude.  An annoying bug doesn't get the least bit less annoying just because the developers said &quot;it's just a beta.&quot;

'''Dante:''' ''Don't release buggy software'', that's impossible ;) Today, I share your opinion. But, I think, better have an annoying bug than no game at all. If you have the resources to finish a project off, then you should finish it before releasing it. But if you don't know if you can finish it as you wish, and people keep beggin for a release, it's very hard to say ''No''.

'''Mychaeel:''' Public alpha and beta releases are the equivalent to websites with &quot;Under Construction!&quot; signs everywhere.

'''Dante:''' There's a big difference imho. &quot;Under Construction!&quot; means ''Dead''. You maybe don't like public alpha and beta releases, but it's still a lot of work to get there, and it shows that you've done something.

'''Mychaeel:''' &quot;Under Construction&quot; doesn't mean &quot;dead,&quot; it means &quot;prematurely released.&quot;  (The fact that things that are released prematurely frequently never get completed is a different matter.)  The very idea of having an alpha and a beta stage is to do quality assurance ''before'' the product is publicly released so that it can be of high quality ''when'' it is released.  Publicly releasing alpha and beta versions completely defeats the point of having them in the first place.  If you have an alpha- or beta-quality product and release it publicly, it doesn't become a &quot;public alpha/beta version&quot; but a &quot;release version with alpha-/beta-quality.&quot;  I have yet to see when a premature release of a product, ''especially'' a highly anticipated one, yielded anything positive at long sight.

'''Dante:''' Even if I don't like it, but - Counterstrike. It had tons of betas, and IIRC many bugs in it's first stages. But now it's played by most of the community. Yo, I've really tried to tell them that CS is shit (j/k I would be dead afterwards)

'''Mychaeel:''' Alleged third-party authority makes a bad argument.  I'd rather say that Counter Strike is popular ''despite'' being initially released with tons of bugs, not ''because of it''.  For that matter, look at CSHP and UTPure &amp;ndash; they're still labeled &quot;Release Candidate,&quot; even though they're most obviously released already.  It just makes no sense.

To me, releasing alpha or beta versions can mean either of the following things (or both):  The team didn't bother with making their product release quality before releasing it; or they're using the alpha/beta label as a shield against user feedback.  &quot;It's just a beta.&quot;  Or: &quot;It's pretty good, for a beta.&quot;  Releasing a product as a public alpha or beta is something a mod team does solely for its ''own'' sake, not for the users', and it's entirely unrelated to the actual notion of the alpha and beta stages ''every'' good product goes through (just not publicly).

'''Dante:''' I didn't say that it's so popular ''because of it'' being released as beta initially. And you wanted an example, so my arguments fits in really good. Yes, mod teams, which release betas etc., do this for their own sake. Calling something RC and publishing it is wrong, there's where I share your opinion. But still, releasing a public beta is different. 

I on my own think of a beta, as a snapshot of their actual development. Of course a public beta shouldn't be too buggy. But if I like a mod, and the developers say &quot;Hey, we could release a public beta. We got most of the bugs we found out. There's only one bigger thing: you'll need to rejoin after each round. Should we fix all bugs and release later instead?&quot;, I wouldn't open my mouth and say &quot;go on, fix everything, I don't want it now&quot;...

'''Mychaeel:''' Without continuing this discussion much further, I'd like to remove everything from it except your first statement; this is, after all, a &quot;Comments&quot; section and not a &quot;Discussion&quot; one.  :-)  Any objections?  We can carry on with this discussion somewhere else if you like.  (Besides, a Wiki isn't the ideal place for such discussions anyway.)

'''capt. k.:''' grrr.  I had this big long comment all written up and ready to post.  :P

'''Mychaeel:''' If it's a ''comment'' relating to the article, feel free to post it.  :-)

'''Dante:''' Nevermind, just remove it. I'm still happy with the overall ''Etiquette''.

'''ExTReMe:''' My favorite phrase: My software doesn't have bugs. It just develops random features :)

'''Aphelion:'''  I think this article is very good.  However, it seems a little hazy in regard to talking about prereleases.  The impression I get at times is: don't release anything until you're finished&quot; while at others it is &quot;if you do release, never CALL it beta or alpha&quot; with some qualifying remarks and an injunction never to release at least very buggy mods.  Firstly, this seems a bit confused to me.  Secondly, it doesn't really deal with people who want to play your mod from the word go and want to see what you're doing in bringing them this mod that, they hope, will fufill their expectations once it is complete.  I saw a lot of this in Unreal Fortress, a conversion mod of the fortress gamestyle where people were openly wanting a UT Fortress mod and prepared to take time and effort to get it.

'''Mychaeel:''' It's a bit of both, actually.  Firstly, it seems to be somewhat fashionable among mod teams to call their releases &quot;betas&quot; without thinking much about that; even if they were actually able to release a full-fledged, high-quality, bug-free product.  At the same time this attitude makes them procrastinate any decent quality control (that a beta stage should take care of, actually), which results in low-quality &quot;public beta&quot; releases for no other reason than that the team simply couldn't be bothered with ''actually'' going through a beta stage.  (A beta stage doesn't sound like fun, I know.)  And people who want to play buggy mods should be (internal) beta testers.  There's really no need to subject ''everybody'' to that.

'''Mychaeel:''' Have a look at [http://forums.beyondunreal.com/showthread.php?postid=1427867#post1427867 this posting of mine] over in BuF.  I'm trying to explain the importance of internal beta testing there.

'''Jesco:''' Err, Mychaeel, you never had latin in school, did you? Or ancient greek? I could live with the explanation of 'alpha' and 'beta', but they are greek letters and no latin words, man. :p ;)

'''Mychaeel:''' That's a quote, Jesco (see the sentence before).  I'm also aware that &quot;alpha&quot; doesn't, in fact, is properly translate as &quot;doesn't work.&quot;  ;-)

'''Dante:''' I might have explained myself above a bit wrong... But I still think &quot;alpha&quot; works fine for &quot;many bugs, don't release&quot;. It's just a subjective opinion of how to call your internal version. And I still think releasing a beta is good. Again, it's just your own decision if you call it beta, demo or whatever. But, and that's also right, you should never release anything with known bugs. I, and most players, except beta's to miss some things of the &quot;final&quot; version. ( In the case of UT2003, which I consider beta/demo, the redeemer ie. ). Of course bugs in any public version are the way to death of your mod. 

'''You:''' I wish to argue with the above Beta argument as well. IMO, an alpha is strictly internal, it is used for any piece of code which compiles, but still has several (sometimes hard to find) logical bugs. After that, a Closed Beta should be administered to a test audience (mostly the developers, but other peopel too... sometimes developers subcosciously stray from behavior that would break a mod). After the closed beta comes the Open Beta, where it is practically a demo. Any problems that users encounter at this stage shoul dbe taken to heart, and revisions should be frequent/etc... The reasoning behind this is that there are several bugs that you won't be able to find with a small test group, or subtle flaws in gameplay issues that you may disreguard, but others find annoying. A good example of this is the &quot;Fatigue&quot; system in Counterstrike... It was a novel solution, and it *did* work, but was quite annoying. I heard that they recently removed it because of that.

'''Githianki:''' Mychaeel is perfectly right to criticize modders who think that software is beta because they have 5 out of ten eventual &quot;planned&quot; features implemented.  In the modding community Alpha and Beta are pretty loosely used terms, but there are more precise definitions (which vary from company to company :)).  I have even seen a misuse indicating the user thought that Alpha was a higher degree of completion. I guess this was based on believing Alpha is 'higher' than Beta in the alphabet.  For most companies, Alpha means feature complete, with all features locked down, placeholder art/sounds in place, and all levels/quests playable.  From there it is on to testing and optimizing and putting in final assets.  This is in fact how several developers have described alpha and beta in various interviews and articles.  

I think that Mychaeel has laid down some good advice on this page and in others.  It should be made the basis for a set of open pages on the subject (respecting that these are Mychaeels's opinions and he wishes them to be labelled as such).  

Also, I made an edit to fix Brandon's name (Reinhart not Reinhard).

'''AlphaOne:''' I just want to say that I've downloaded your bot spectator mod. The thing that amazed me is the fact that you've included a directory structure in the zip file. It's so much easier to install the mod that way. When installing other mods I sometimes confuse .uax with .usx. Great job! To others - '''include a subdirectory structure of your mod in your zip file!!!!!!!!!!!!!!!!!!'''

'''Spark:''' I completely agree... Coming from the Quake world, it amazed me how lazy most Unreal developers are when it comes to packaging their mods and maps. I could barely believe my eyes when I downloaded a popular mod and read &quot;installation instructions&quot;, telling me where to place each of a plethora of files. This isn't 1998 anymore, users should (allowed to) be lazy, not developers. :)

'''Mecha:''' Strictly speaking, that's the entire point of a [[Legacy:UMOD|UMOD]] file&amp;ndash;to autoinstall everything for you. I thought I heard they had some teething problems when UT2k3 was released, but Wormbo's seem to work OK, so there's no real excuse there anymore.

'''Mychaeel:''' ...just that some people still don't have the latest patch installed, still aren't entirely comfortable with them and there still are a few subtle bugs happening for people using other language localizations than the default international one.  I will ''always'' provide a plain .zip distribution even if I make a .ut2mod installer ''as well'', but for something as small as the [[Legacy:Spectate Bots|Spectate Botmatch]] mutator I felt making a .ut2mod installer was more hassle than worth for everyone.

'''Chazums:''' A very interesting piece and i igree with pretty much all of it, although i feel that the mod comunity has effectily re-defined the term Beta as something related to time.  Purhaps you'd like to add something about using release candidates as an alternate method.  Something else that would be good etiquette would be organised version numbering so users know what sort of update to expect compared with the last version.

'''ZxAnPhOrIaN:''' Err.. that was twenty cents, not two cents!! :P

'''Piglet:''' I can appreciate your want to close down this discussion. However i cant help but add my views.  Pesonally i agree with the definition of alpha versions, and agree that there release is normally a very unwise thing to do. However i disagree with your views on beta.  If alpha means 'Doesn't Work' then i feel beta should be defined as 'Nearly Works'.  In short whilst alpha's should never be released, beta's should be ''considered'' for release.  If a beta isn't ready for ''partial'' release then it isn't a beta yet, it's still a beta.  Just my views, but hey :)

'''Mychaeel:''' I've had some time to think about my stance on that since I wrote this article.  I think what actually bothers me when I see a mod team releasing a &quot;public beta&quot; is the following:  Too many mod teams use the term &quot;beta&quot; for indefinite lengths of time to avoid having to tackle the more annoying parts of development (such as fixing bugs) and as a shield against criticism &amp;ndash; &quot;Hey, it's just a beta!&quot;  On the other hand, a serious limited-time public beta is fine with me, provided the software ''really'' is in beta stage already and the team doesn't sell its public beta to the general public like an actual release.

'''RegularX:''' There is no real difference between a beta and a release candidate other than with an RC you are making the guess that it might be production worthy. Public Betas/Demos/Previews are also pretty much the same thing.  It's an agreement that someone gets to look at an early version, but knows it's not necessarily production code.

As Mychaeel is saying, it's not kosher to just continually release betas, particularly to form the response 'Well, it doesn't work right because it's beta'.  And if it is a beta, or a demo - then label it clearly that it's a beta, or a preview, or a demo.  When someone sends out an news blast three times in as many weeks, that mod release better not be a preview.  Likewise, when I download something and end up say, falling through a map three times in my first dry run of it - don't call it ready for the public.

Basically, beta is a stage in development - not an excuse.

'''MadNad:''' I just wanted to mention that I used an alpha test to catch early bugs in the multiplayer code, however, this alpha test was not a public test.  I ran a private beta test later...accomplishing the same thing.  When I finally did have a public Beta test, I had removed most of the bugs and gotten the gameplay about where I wanted it.  This test was to get feedback and to test the MOD on a server loaded with people.  Again giving me a better understanding of what the public wanted to see in my MOD, and what sort of requirements I may have to specify for running the mod.

They were very beneficial to me, but I was very careful not to let it out too early giving everyone false impressions of what the final version will be.

'''Mychaeel:''' ...and I hope this public beta was soon followed by a release.  Was it?  :-)

'''Mozzie:''' Great Stuff! I'll go post a link to on my Mod's Development Forums... And whats a Good way to Recruit people when you have NO product, my Team is 3 people, Mapper/;write (me), A Writer/Voice Actor, and a Webesigner/Quality Control.. AND NONE OF US EVEN HAVE THE GAME YET!! (U2) How the Hell I'm a gonna Muster Support? ITS SO CONFUSING! &gt;:@ Nice Page MyChaeel.

'''MadNad:''' Yes, it was released after about a month and a half after those tests.  http://planetquake.com/excessive  I released it last Sunday 2-23-03.

'''Koosh:''' I think alpha means &quot;It works, but it has bugs&quot; and beta means &quot;There aer few if any bugs, and we want your opinion&quot; and a numbered release means &quot;We showed it to people and they liked it.

'''Mychaeel:''' See?  There's the misconception.  &quot;Alpha&quot; and &quot;beta&quot; have fixed meanings.  &quot;Alpha&quot; means &quot;feature-incomplete,&quot; and &quot;beta&quot; means &quot;feature-complete, in testing.&quot;  Since testing and bug-fixing is nothing end users should ever be subjected to, beta versions should never be publicly released unless the public is made ''very'' well aware that they're dealing with program that hasn't been thoroughly tested yet.

'''RegularX:''' Alphas are intended to test out basic gameplay ideas.  They are buggy, incomplete and evil.  Anyone playing something marked &quot;alpha&quot; should know they are buggy, incomplete and evil or walk away from playing/testing them.  Betas are also buggy and evil, but are supposed to represent what the game is actually going to be.  I then actually distinct between beta and a Release Candidate. An RC should be innocent and good, but maybe have some hidden bugs.  Semantics aside (since nobody understands the terms anyway) - I think the moral of the story is to test the (expletive) out of your stuff and don't expect your players to be so wowed by a fancy model/skin/weapon/HUD to excuse the fact that they just fell through the floor of your map and into the void of BSP.

'''Foxpaw:''' There certainately are a number of various conceptions of what alpha and beta mean - it seems to be fairly agreed upon that alpha is an early &quot;proof of concept&quot; kind of stage, not feature complete but enough to tell if the game is going to be fun or not.. Beta seems more debated, I would say that a beta should happen directly before a release and should have no known bugs - simply a stage to try to find any bugs that may have been missed by the alpha testing group. (Like the duping bug in Diablo - this was probrably not apparent to the programmers, and is the sort of thing beta testing is intended to find out about.) That's my definition anyway.

'''Mychaeel:''' I'm simply fed up of mod developers not even ''wanting'' to get past &quot;beta&quot; with their mod.  Instead, they think as soon as they have reached something they can call &quot;beta&quot; they're ready for a grand public release and it's time to focus on a new version of their mod instead of finishing ''this'' version first.

'''Draconx:''' I like this quote:  There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.

'''Mysterial:''' Re: the uninstaller, not only should they PROVIDE an uninstaller, they should TEST the uninstaller. Especially with convenient and automated (in theory) uninstallers like the Unreal one for UMODs a lot of groups don't even bother to test it to see if it works. I've lost count of the number of uninstallers that either a) failed to actually delete anything, b) left files behind, or c) deleted too much and took files required for other things with it.

'''Mychaeel:''' You have a point.  Then again, a mod team should test ''everything'' before releasing it.  :-)  (Sadly enough we both know that isn't true, especially given the number of alpha- and beta-stage mods that are publicly released.)

'''Dirk Fist:''' I agree with Mychaeel, No matter how you try to define it BETA means NOT DONE. And Releasing something with a BIG RED NOT FINISHED on it is just wrong. If its solid enough for release then its version 1. 

'''W0RF:''' Two shining examples of this kind of behavior in the community: &lt;br /&gt;[http://modsquad.beyondunreal.com/review.php?id=117 Apocalypse Weapons] is a great example of why you shouldn't release early beta work publicly.  The first beta of Apocalypse Weapons was the first mod / mutator in the history of ModSquad to actually receive a rating of 0.  That's right, 0.  It was that bad.  Subsequent releases saw marked improvement, and by the time it got to around beta 5 or 6 it was one of the best weapons muts available for UT.  So at least it had a happy ending.  But any mut that receives a zero isn't erady for public consumption, and there's really no reason to submit the same mut to a review site seven times.

[http://mychaeel.no-ip.com/jailbreak/ Jailbreak] was the polar opposite.  It was constructed in a modular fashion, so it could be completed (and tested) in pieces, it's extraordinarily well-documented, and oh yeah, it's one of the most popular gametypes ever.  And I'm not just saying that because it's Mychaeel's project.  ;)

'''Ryan:''' Mychaeel is absolutely right in this article, it's not fair to expect people to put up with shoddy work.  Missing features are one thing but bugs are another.  The audience for mods includes the casual gamer as well as the script master general.  To widely release suggests some level of completeness, at least not obviously bugged.  The cry of &quot;it's only a beta&quot; cuts no ice. Either the developers knew of the bugs or they didn't.  If they did, shame on them.  If they didn't accept it and fix it.

For perspective, I'm a total newbie modder.  My background is commercial software for financial institutions.  I'm just coming to the end of a very long (18 month) beta trial of a system I wrote with a client.  They've found bugs but they knew what was going on and are very supportive.  In the end it all goes back to audience again.  The system will not go out for general consumption (other banks) until we're all satisfied with it.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4324</id>
      <timestamp>2005-07-29T21:59:23Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>revert</comment>
      <text xml:space="preserve">{{innerbox| ''This page is a collection of ramblings of mine.  Do not edit, but feel free to comment.  (Scroll down for comments.)''

}}

{{innerbox| ''I might change my mind on the matters discussed on this page without notice.  Part of the reason I'm writing them down is that I want to validate them for myself; that's much easier if I have to reflect on how to put them in words.''

}}

==Modding Etiquette ==

'''So you want to make a mod?'''  Great!  Welcome to the modding community.

First of all, there is a variety of ways you can learn things &amp;ndash; the hard way, or by listening to advice of people who have been there.  Nobody expects you to take that advice without reflection or by anybody's (actual or self-proclaimed) authority.  Just think about it.  When you actually start thinking about the stuff people more experienced than you are telling you, you might end up realizing that there's some truth in them.

This article is not about the technicals of modding &amp;ndash; I'm assuming that you're familiar with them or know how to become that way.  It's about the '''Etiquette of Modding''' &amp;ndash; how to make people ''like'' your mod.

===Understand Your Audience ===

The key to making people ''like'' your creation is looking at it from their point of view, not yours.

Yes, I know you have put hard work and lots of dedication into your mod, without getting any revenue from it.  And most people don't care; that's a simple truth.  But then again, they don't owe you anything &amp;ndash; you have no deal with them; they didn't hire you or promise you anything.

Now that your mod is released, the people out there are spending time and effort downloading and installing it.  It might be negligible effort compared with what you put into creating the mod, but that comparison doesn't apply &amp;ndash; as I said, they don't owe you anything to start with.  Only in the moment they're actually trying out your mod, you're starting to have a deal with them:  They invested time and work in attempting to try out your mod, so '''you better make it worthwhile.'''

That simple realization immediately leads to a couple of points:

====Don't Raise False Expectations ====

More than obviously misleading statements the ''lack'' of a statement can lead people to fall back to default expectations that don't apply for your mod.  The only thing you can gain by people believing in promises that your creation can't keep is a mob of disappointed, flaming users.  That is something you should avoid.

* '''Public alpha and beta versions''' have their place, but that place is equipped with big flashing red warning sign.  (Don't take this literally; any sort of unmistakable warning suffices.)  That means, everywhere, not just hidden somewhere on the download page and in the readme file.  Your audience should never even start believing that they're dealing with a release-quality product if they aren't.  If you're ashamed of admitting that your release is just a beta yet, don't release it.  (I'll pick that up later again.)

* Unreal Tournament mods are, by default, '''platform-independent.'''  Thus, if you don't expressly state otherwise, your users will expect nothing else; so the same big red flashing warning thing applies as well if you release a mod that is, for instance, Windows-only &amp;ndash; be it because you put some native code in or just released your mod in shape of an .exe installer.  Mac and Linux users will hate you if they click on a download link in happy anticipation just to learn that they've been purposely left out.  If that realization occurs only after an hour-long download, even worse.  (And would you blame them?)

* People expect mods to '''work both online and with bots.'''  See to it.

====Make Your Mod User-Friendly ====

The average user will neither read a FAQ, nor a readme file, nor a manual unless he or she is hard pressed to or highly motivated.  You can assume neither to start with.  The best way to deal with that is making reading FAQs, readmes and manuals optional &amp;ndash; in other words, spend some time to design your mod in a way that works as the user expects it to.  If you're unsure whether that extra design time of yours is worthwhile, just think of all the time you'll save yourself by not having to groan &quot;Read the FAQ&quot; or &quot;It's all in the manual.&quot;

* '''Use existing facilities''' the user is familiar with rather than inventing your own, even if you think that you could do it marginally better.  Stick to UMod installers and plain zipped distributions if you can help it.  Use the built-in mod launcher instead of creating your own flashy external launcher the user first has to look for (after reading the manual) in the System directory.  Plug your server browser tab into Unreal Tournament's built-in server browser.  Make in-game controls work as users are used to them.

* '''Don't impose arbitrary restrictions''' on how your mod works.  Mutators, for instance, are by design and by default cross-compatible to each other; but of course that doesn't mean that it's impossible for you to create a mutator that won't play well with others (by subclassing PlayerPawn, for instance).  If there's an actual need for such a restriction, make it inherently obvious.  Otherwise, investing time in coding something a less straightforward way to achieve the same goal while keeping compatibility is time very well spent.  An arbitrary restriction mentioned in a FAQ or readme file will just shift people's perception of it from &quot;bug&quot; to &quot;known bug,&quot; nothing else.

* '''Actively provide guidance''' for things that aren't obvious.  Don't assume people have read the manual and know that pressing this-or-that button will pop up a menu crucial for gameplay &amp;ndash; put that information somewhere on the HUD, for instance, at a reasonably unobtrusive, but visible location.  (And add an option for advanced users to switch that extra help off.)  Strangelove does that for its flight controls, Jailbreak for scoreboard sorting options.

* '''Provide a convenient and thorough uninstaller''' for your mod, and make sure it works as advertised.  If people are unsure whether your mod is worth a try, they'll be much more inclined to give it a chance if they know that they can quickly get it off their harddisk again in case they don't like it.  Also, if somebody wants to uninstall your mod but can't figure out how (and possibly ends up reinstalling the game in order to get rid of it) that's a surefire way to make certain he or she will never try any future version of your mod again.

====Be True To Yourself ====

{{innerbox| I've actually come to think that a team's chance of success is inversely proportional to the amount of time spent on the web site.

 : ''fragbert''

}}

If people get the impression that you're overrating your work, they'll be much less inclined to add to all the credit you're already giving yourself.

* '''Keep the hype at a reasonable level.'''  That goes hand-in-hand with the &quot;don't raise false expectations&quot; issue mentioned above.

* Don't fancy yourself of making a '''Total Conversion''' if the differences to what you're converting don't justify it.  There's no less honor in making a great mutator or a fun game type as there is in making a Total Conversion.  All those mod types have their place and uses, but thinking of a Total Conversion as the epitome of a game modification is simply wrong.  If you ever try to deal with the issues imposed by people's expectations of a game type mod or a mutator (for instance, cross-compatibility with other types of custom game content), you'll be left without any doubt of that assessment.  The demands of making a Total Conversion are ''different'', but not necessarily ''more sophisticated''.

* A custom launcher, splash screen, look-and-feel '''don't make your mod look professional''' &amp;ndash; just like smoking doesn't make you look cool.  (Generously quoting luquado from Nali City, &quot;that only works for cool people&quot; &amp;ndash; or professional mods, for that matter.)  Add those things as fancy final touches if you must, but don't think of them as a requirement for your mod's professional appearance.

===Dealing With Critics ===

After your mod is released, you'll get all sorts of feedback &amp;ndash; both positive and negative.  You can reduce the negative feedback to a minimum by following the advice in the section above (keep in mind: disappointed users will be the least forgiving ones), but even then there'll still be people who just don't like your mod, or some aspects of it.

First off, '''ignore the trolls''' among them.  You can recognize them by their habitat and their behavior; since their goal is to provoke an (offended) reaction, they'll say their piece where a lot of people can read it, and it will be designed to insult you.  Just ignore trolls.  They're perfectly aware of what they're doing, and what they want you to do, and you're in no position to insult them by questioning their statement's validity.  Mock them, gently, with a smile on your face, if you like &amp;ndash; that'll drive them mad.  Just by no means take them seriously or behave that way.

But not everybody publicly bashing your work is a troll; be very careful before you dismiss somebody's criticism as simple trolling.  (It's all too easy to go that way rather than facing the fact that people are genuinely unhappy with your mod.)  There's practically no other reason for somebody not liking your mod and expressing it in your face than being disappointed by it.  Disappointment is the result of expectations that weren't met.  And there are two ways you can deal with that:  Either lower the expectations (won't help people who already had them), or meet them.

There are a couple of things you should ''never'' tell people criticising your work:

* '''&quot;Do it better.&quot;'''  The different roles of developers and users are clearly defined:  You (the developer) are investing time in order to get a positive response; the user is investing time in order to be entertained.  If your mod fails to deliver the latter to the user, you can't expect the user to deliver the first to you.  It's not a matter of switching roles.

* '''&quot;It's just a beta/an alpha.&quot;'''  Alpha and beta versions shouldn't be released to the general public in the first place (see below).  In any case, that your released product is still in alpha or beta stage certainly doesn't invalidate users' complaints or make the developers any less responsible for it, so pointing out that &quot;it's just a beta&quot; is a pointless thing to do.

* '''&quot;You didn't pay; you're not entitled to complain.&quot;'''  Remember what I wrote above about having a deal with your users &amp;ndash; they don't owe you, you don't owe them, until they invest time and work in trying to get your mod up and running.  They have every right to complain if that investment turns out to be wasted.  (If you actually do deliver what you promised though, it's your turn to have a right to get a positive response from them.)

===Public Alphas and Betas ===

Alpha and beta versions are by definition unfinished and should in fact never see a release to the general public.  Looking around in the Unreal modding community you could almost think exactly the opposite was true, though:  Mods are in &quot;public beta&quot; stage for ''years'', and mostly without an actual release on the horizon too.

Quoting somebody else [http://www.isbc.com/business/com_jargon.cfm]:

{{innerbox| ; Alpha : Software undergoes alpha testing as a first step in getting user feedback. Alpha is Latin for &quot;doesn't work.&quot;

 ; Beta : Software undergoes beta testing shortly before it's released. Beta is Latin for &quot;still doesn't work.&quot;

}}

So you're releasing software that doesn't work?  If you are, do yourself a favor and do it to a limited test crew that's steeled as to what's expecting them.  Saying &quot;But it's just a beta!&quot; in a hurt (or annoyed) voice to end users that bicker about your bug-ridden beta version isn't going to make anything better.  Besides, end users are notoriously bad bug reporters &amp;ndash; if you'd like to get useful bug reports, you can brief your beta tester crew, but you won't succeed in doing that with a mob of end users.

In fact, most of the time developers seem to misunderstand what &quot;alpha&quot; and &quot;beta&quot; actually refers to.  &quot;Alpha&quot; and &quot;beta&quot; are indicators for a release's ''quality'', not its completeness in regard to what the development team envisioned as the ultimate goal.  (Note:  That's to be differed from the notion of feature-completeness.  The latter is subject to what you defined to belong on the current release's feature list.)

It's very understandable that development teams, especially those not expecting any other revenue than (positive) user feedback, are yearning to get their product out as soon as possible.  '''Cutting the mod's quality is certainly an ill-advised choice though.'''  If you see that you can't complete your mod to the full extent of what you envision it to be in the timeframe you want to keep, take smaller steps:  Define subsets of that full feature list that make sense on their own.  If you plan a Total Conversion (see above) with five game types, you could restrict a first public release to a single game type.  But make it work in a quality as if it was a mod of its own.

{{innerbox| When you begin writing a mod you should start small. Don't plan to write a Total Conversion from the very start. If you set goals that are too hard to reach, you'll get frustrated in the process of working towards them. It is much better to set a series of small goals and work to each one in turn. Start with a simple idea that could be expanded into a larger game.

 Always work on small, managable chunks that could each be released in their own right. If you do undertake a large project, organize your features into a release schedule. If your game is going to have five new weapons, make a release with three while your work on the others. Pace yourself and think about the long term.

 : ''Brandon Reinhart, [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring]]''

}}

Those intermediate releases deserve an alpha and a beta stage in their own right.  There's no need to label the finished intermediate releases &quot;beta&quot; when they aren't.  It's perfectly possible to make them just as feature-complete and bug-free as any other release.  Time you spend making intermediate releases post-beta quality won't be lost when you continue working on your larger goal.

In any case, if you release intermediate versions, make them ''quality'' and '''don't call them beta.'''

==Related Topics ==

RegularX's ModSquad column:

[http://www.planetunreal.com/modsquad/ucc_make_14.htm ucc make (1.4): Patching the Beta]

[http://www.planetunreal.com/modsquad/ucc_make_15.htm ucc make (1.5): Fixing &quot;Patching the Beta&quot;]

==Comments ==

'''Mychaeel:'''  My intention here, as stated above, is trying to find out whether my stated notions make sense or not.  If they do, I strive to present them in a kindly, reasonable way that doesn't make anybody who's reading this feel as if I was saying &quot;You're an idiot for not doing it ''that'' way.&quot; &amp;ndash; I'm obviously stating my own opinion here and am not likely to feel offended by it, but what do other people think &amp;ndash; from a user's and a developer's point alike?

'''Tarquin:'''  They make sense to me. A very valuable addition to &quot;never join a mod with only a website&quot;.

'''Mychaeel:'''  Thanks for your opinion.  I ''had'' to get this off my chest sometime...

'''Tarquin:'''  okay, two criticisms about this page: it's too cleanly structured to be a ramble &amp; it's too rationally thought-out to be a rant ;)

'''Mychaeel:'''  Damn.  Gotta practice harder rambling and ranting.  ;-)

'''EntropicLqd:'''   Good page.  Very well written &amp;ndash; I can hear the restraining chains in the background though :).  About the only thing I'd be inclined to add is that if you do release intermediate versions give the packages their own release numbers (e.g. CTFPlus100.u, CTFPlus150.u).  I wished I'd done it after I wound up with 4 seperate versions of the mod on my HD and the only way to tell them apart was buy looking at the CTFPlusGame.uc file - duh!

'''Birelli:'''  Yeah, very nicely written Mych. Some of the things you pointed out kind of shaped into one statement my general feelings on things like alpha/beta releases and especially responses to critics. I witnessed the utter disaster that EV:Nova was (a mac-only game from Ambrosia). I saw a lot of &quot;do it better&quot; responses from the development team, which was assaulted by an angry mob of disappointed fans who had been being hyped up about the game for years. I didn't end up buying the game, and have never regretted the decision, as the game needed a lot of work that the development team wasn't willing to admit it did and the public was bashing them for not doing. Basically, the largest revenue source of a great gaming company was dashed because the developers they hired didn't follow these rules, so nice writing :-)

'''Tarquin:'''  Completely unrelated, but it's an equally well-written set of sensible guidelines that many people don't follow: Mac osX commandments: http://www.panic.com/audion/rights.html (nice screenies too)

'''Anonymous:''' This is almost a list of all the things Team Orbit did / does wrong. Don't quote me.

'''Dante:''' Very good. But I don't share the same opinion with alpha/betas. Even if &quot;they&quot; meant something else, they are even published by commercials. If you make a mod and your final product will take a looong time, but you want to hand something out earlier, a &quot;beta&quot; stamp does fit very well. People will understand, if they find any bugs. But if you didn't test it enough ( and so, almost always ), and you say it's 1.0 - and people find bugs in there, they won't be as forgiving. I remember, when I worked in Front Line Assault ( 2001 ) and the team was small, and developers were rare ( as they still are ) - we finally published an alpha. That was, because some members were lazy, some had too much RL. It was really crap, much bugs, and netplay ( omg I'm ashamed I did it ) was uhm - nm ;) But the point is, that all people who have spoken too me said &quot;Yeah, it's buggy, but it's really cool for an alpha&quot;. We also got reviewed, and got a good rating. So I would suggest, only release things non-alpha/beta which really fit your design doc and don't have much &quot;known&quot; bugs.

'''Mychaeel:''' My basic point is:  Don't publicly release buggy software.  Never.  For me, as a developer, that's a matter of professional attitude; and for me, as a user, it's something I simply expect from developers with professional attitude.  An annoying bug doesn't get the least bit less annoying just because the developers said &quot;it's just a beta.&quot;

'''Dante:''' ''Don't release buggy software'', that's impossible ;) Today, I share your opinion. But, I think, better have an annoying bug than no game at all. If you have the resources to finish a project off, then you should finish it before releasing it. But if you don't know if you can finish it as you wish, and people keep beggin for a release, it's very hard to say ''No''.

'''Mychaeel:''' Public alpha and beta releases are the equivalent to websites with &quot;Under Construction!&quot; signs everywhere.

'''Dante:''' There's a big difference imho. &quot;Under Construction!&quot; means ''Dead''. You maybe don't like public alpha and beta releases, but it's still a lot of work to get there, and it shows that you've done something.

'''Mychaeel:''' &quot;Under Construction&quot; doesn't mean &quot;dead,&quot; it means &quot;prematurely released.&quot;  (The fact that things that are released prematurely frequently never get completed is a different matter.)  The very idea of having an alpha and a beta stage is to do quality assurance ''before'' the product is publicly released so that it can be of high quality ''when'' it is released.  Publicly releasing alpha and beta versions completely defeats the point of having them in the first place.  If you have an alpha- or beta-quality product and release it publicly, it doesn't become a &quot;public alpha/beta version&quot; but a &quot;release version with alpha-/beta-quality.&quot;  I have yet to see when a premature release of a product, ''especially'' a highly anticipated one, yielded anything positive at long sight.

'''Dante:''' Even if I don't like it, but - Counterstrike. It had tons of betas, and IIRC many bugs in it's first stages. But now it's played by most of the community. Yo, I've really tried to tell them that CS is shit (j/k I would be dead afterwards)

'''Mychaeel:''' Alleged third-party authority makes a bad argument.  I'd rather say that Counter Strike is popular ''despite'' being initially released with tons of bugs, not ''because of it''.  For that matter, look at CSHP and UTPure &amp;ndash; they're still labeled &quot;Release Candidate,&quot; even though they're most obviously released already.  It just makes no sense.

To me, releasing alpha or beta versions can mean either of the following things (or both):  The team didn't bother with making their product release quality before releasing it; or they're using the alpha/beta label as a shield against user feedback.  &quot;It's just a beta.&quot;  Or: &quot;It's pretty good, for a beta.&quot;  Releasing a product as a public alpha or beta is something a mod team does solely for its ''own'' sake, not for the users', and it's entirely unrelated to the actual notion of the alpha and beta stages ''every'' good product goes through (just not publicly).

'''Dante:''' I didn't say that it's so popular ''because of it'' being released as beta initially. And you wanted an example, so my arguments fits in really good. Yes, mod teams, which release betas etc., do this for their own sake. Calling something RC and publishing it is wrong, there's where I share your opinion. But still, releasing a public beta is different. 

I on my own think of a beta, as a snapshot of their actual development. Of course a public beta shouldn't be too buggy. But if I like a mod, and the developers say &quot;Hey, we could release a public beta. We got most of the bugs we found out. There's only one bigger thing: you'll need to rejoin after each round. Should we fix all bugs and release later instead?&quot;, I wouldn't open my mouth and say &quot;go on, fix everything, I don't want it now&quot;...

'''Mychaeel:''' Without continuing this discussion much further, I'd like to remove everything from it except your first statement; this is, after all, a &quot;Comments&quot; section and not a &quot;Discussion&quot; one.  :-)  Any objections?  We can carry on with this discussion somewhere else if you like.  (Besides, a Wiki isn't the ideal place for such discussions anyway.)

'''capt. k.:''' grrr.  I had this big long comment all written up and ready to post.  :P

'''Mychaeel:''' If it's a ''comment'' relating to the article, feel free to post it.  :-)

'''Dante:''' Nevermind, just remove it. I'm still happy with the overall ''Etiquette''.

'''ExTReMe:''' My favorite phrase: My software doesn't have bugs. It just develops random features :)

'''Aphelion:'''  I think this article is very good.  However, it seems a little hazy in regard to talking about prereleases.  The impression I get at times is: don't release anything until you're finished&quot; while at others it is &quot;if you do release, never CALL it beta or alpha&quot; with some qualifying remarks and an injunction never to release at least very buggy mods.  Firstly, this seems a bit confused to me.  Secondly, it doesn't really deal with people who want to play your mod from the word go and want to see what you're doing in bringing them this mod that, they hope, will fufill their expectations once it is complete.  I saw a lot of this in Unreal Fortress, a conversion mod of the fortress gamestyle where people were openly wanting a UT Fortress mod and prepared to take time and effort to get it.

'''Mychaeel:''' It's a bit of both, actually.  Firstly, it seems to be somewhat fashionable among mod teams to call their releases &quot;betas&quot; without thinking much about that; even if they were actually able to release a full-fledged, high-quality, bug-free product.  At the same time this attitude makes them procrastinate any decent quality control (that a beta stage should take care of, actually), which results in low-quality &quot;public beta&quot; releases for no other reason than that the team simply couldn't be bothered with ''actually'' going through a beta stage.  (A beta stage doesn't sound like fun, I know.)  And people who want to play buggy mods should be (internal) beta testers.  There's really no need to subject ''everybody'' to that.

'''Mychaeel:''' Have a look at [http://forums.beyondunreal.com/showthread.php?postid=1427867#post1427867 this posting of mine] over in BuF.  I'm trying to explain the importance of internal beta testing there.

'''Jesco:''' Err, Mychaeel, you never had latin in school, did you? Or ancient greek? I could live with the explanation of 'alpha' and 'beta', but they are greek letters and no latin words, man. :p ;)

'''Mychaeel:''' That's a quote, Jesco (see the sentence before).  I'm also aware that &quot;alpha&quot; doesn't, in fact, is properly translate as &quot;doesn't work.&quot;  ;-)

'''Dante:''' I might have explained myself above a bit wrong... But I still think &quot;alpha&quot; works fine for &quot;many bugs, don't release&quot;. It's just a subjective opinion of how to call your internal version. And I still think releasing a beta is good. Again, it's just your own decision if you call it beta, demo or whatever. But, and that's also right, you should never release anything with known bugs. I, and most players, except beta's to miss some things of the &quot;final&quot; version. ( In the case of UT2003, which I consider beta/demo, the redeemer ie. ). Of course bugs in any public version are the way to death of your mod. 

'''You:''' I wish to argue with the above Beta argument as well. IMO, an alpha is strictly internal, it is used for any piece of code which compiles, but still has several (sometimes hard to find) logical bugs. After that, a Closed Beta should be administered to a test audience (mostly the developers, but other peopel too... sometimes developers subcosciously stray from behavior that would break a mod). After the closed beta comes the Open Beta, where it is practically a demo. Any problems that users encounter at this stage shoul dbe taken to heart, and revisions should be frequent/etc... The reasoning behind this is that there are several bugs that you won't be able to find with a small test group, or subtle flaws in gameplay issues that you may disreguard, but others find annoying. A good example of this is the &quot;Fatigue&quot; system in Counterstrike... It was a novel solution, and it *did* work, but was quite annoying. I heard that they recently removed it because of that.

'''Githianki:''' Mychaeel is perfectly right to criticize modders who think that software is beta because they have 5 out of ten eventual &quot;planned&quot; features implemented.  In the modding community Alpha and Beta are pretty loosely used terms, but there are more precise definitions (which vary from company to company :)).  I have even seen a misuse indicating the user thought that Alpha was a higher degree of completion. I guess this was based on believing Alpha is 'higher' than Beta in the alphabet.  For most companies, Alpha means feature complete, with all features locked down, placeholder art/sounds in place, and all levels/quests playable.  From there it is on to testing and optimizing and putting in final assets.  This is in fact how several developers have described alpha and beta in various interviews and articles.  

I think that Mychaeel has laid down some good advice on this page and in others.  It should be made the basis for a set of open pages on the subject (respecting that these are Mychaeels's opinions and he wishes them to be labelled as such).  

Also, I made an edit to fix Brandon's name (Reinhart not Reinhard).

'''AlphaOne:''' I just want to say that I've downloaded your bot spectator mod. The thing that amazed me is the fact that you've included a directory structure in the zip file. It's so much easier to install the mod that way. When installing other mods I sometimes confuse .uax with .usx. Great job! To others - '''include a subdirectory structure of your mod in your zip file!!!!!!!!!!!!!!!!!!'''

'''Spark:''' I completely agree... Coming from the Quake world, it amazed me how lazy most Unreal developers are when it comes to packaging their mods and maps. I could barely believe my eyes when I downloaded a popular mod and read &quot;installation instructions&quot;, telling me where to place each of a plethora of files. This isn't 1998 anymore, users should (allowed to) be lazy, not developers. :)

'''Mecha:''' Strictly speaking, that's the entire point of a [[Legacy:UMOD|UMOD]] file&amp;ndash;to autoinstall everything for you. I thought I heard they had some teething problems when UT2k3 was released, but Wormbo's seem to work OK, so there's no real excuse there anymore.

'''Mychaeel:''' ...just that some people still don't have the latest patch installed, still aren't entirely comfortable with them and there still are a few subtle bugs happening for people using other language localizations than the default international one.  I will ''always'' provide a plain .zip distribution even if I make a .ut2mod installer ''as well'', but for something as small as the [[Legacy:Spectate Bots|Spectate Botmatch]] mutator I felt making a .ut2mod installer was more hassle than worth for everyone.

'''Chazums:''' A very interesting piece and i igree with pretty much all of it, although i feel that the mod comunity has effectily re-defined the term Beta as something related to time.  Purhaps you'd like to add something about using release candidates as an alternate method.  Something else that would be good etiquette would be organised version numbering so users know what sort of update to expect compared with the last version.

'''ZxAnPhOrIaN:''' Err.. that was twenty cents, not two cents!! :P

'''Piglet:''' I can appreciate your want to close down this discussion. However i cant help but add my views.  Pesonally i agree with the definition of alpha versions, and agree that there release is normally a very unwise thing to do. However i disagree with your views on beta.  If alpha means 'Doesn't Work' then i feel beta should be defined as 'Nearly Works'.  In short whilst alpha's should never be released, beta's should be ''considered'' for release.  If a beta isn't ready for ''partial'' release then it isn't a beta yet, it's still a beta.  Just my views, but hey :)

'''Mychaeel:''' I've had some time to think about my stance on that since I wrote this article.  I think what actually bothers me when I see a mod team releasing a &quot;public beta&quot; is the following:  Too many mod teams use the term &quot;beta&quot; for indefinite lengths of time to avoid having to tackle the more annoying parts of development (such as fixing bugs) and as a shield against criticism &amp;ndash; &quot;Hey, it's just a beta!&quot;  On the other hand, a serious limited-time public beta is fine with me, provided the software ''really'' is in beta stage already and the team doesn't sell its public beta to the general public like an actual release.

'''RegularX:''' There is no real difference between a beta and a release candidate other than with an RC you are making the guess that it might be production worthy. Public Betas/Demos/Previews are also pretty much the same thing.  It's an agreement that someone gets to look at an early version, but knows it's not necessarily production code.

As Mychaeel is saying, it's not kosher to just continually release betas, particularly to form the response 'Well, it doesn't work right because it's beta'.  And if it is a beta, or a demo - then label it clearly that it's a beta, or a preview, or a demo.  When someone sends out an news blast three times in as many weeks, that mod release better not be a preview.  Likewise, when I download something and end up say, falling through a map three times in my first dry run of it - don't call it ready for the public.

Basically, beta is a stage in development - not an excuse.

'''MadNad:''' I just wanted to mention that I used an alpha test to catch early bugs in the multiplayer code, however, this alpha test was not a public test.  I ran a private beta test later...accomplishing the same thing.  When I finally did have a public Beta test, I had removed most of the bugs and gotten the gameplay about where I wanted it.  This test was to get feedback and to test the MOD on a server loaded with people.  Again giving me a better understanding of what the public wanted to see in my MOD, and what sort of requirements I may have to specify for running the mod.

They were very beneficial to me, but I was very careful not to let it out too early giving everyone false impressions of what the final version will be.

'''Mychaeel:''' ...and I hope this public beta was soon followed by a release.  Was it?  :-)

'''Mozzie:''' Great Stuff! I'll go post a link to on my Mod's Development Forums... And whats a Good way to Recruit people when you have NO product, my Team is 3 people, Mapper/;write (me), A Writer/Voice Actor, and a Webesigner/Quality Control.. AND NONE OF US EVEN HAVE THE GAME YET!! (U2) How the Hell I'm a gonna Muster Support? ITS SO CONFUSING! &gt;:@ Nice Page MyChaeel.

'''MadNad:''' Yes, it was released after about a month and a half after those tests.  http://planetquake.com/excessive  I released it last Sunday 2-23-03.

'''Koosh:''' I think alpha means &quot;It works, but it has bugs&quot; and beta means &quot;There aer few if any bugs, and we want your opinion&quot; and a numbered release means &quot;We showed it to people and they liked it.

'''Mychaeel:''' See?  There's the misconception.  &quot;Alpha&quot; and &quot;beta&quot; have fixed meanings.  &quot;Alpha&quot; means &quot;feature-incomplete,&quot; and &quot;beta&quot; means &quot;feature-complete, in testing.&quot;  Since testing and bug-fixing is nothing end users should ever be subjected to, beta versions should never be publicly released unless the public is made ''very'' well aware that they're dealing with program that hasn't been thoroughly tested yet.

'''RegularX:''' Alphas are intended to test out basic gameplay ideas.  They are buggy, incomplete and evil.  Anyone playing something marked &quot;alpha&quot; should know they are buggy, incomplete and evil or walk away from playing/testing them.  Betas are also buggy and evil, but are supposed to represent what the game is actually going to be.  I then actually distinct between beta and a Release Candidate. An RC should be innocent and good, but maybe have some hidden bugs.  Semantics aside (since nobody understands the terms anyway) - I think the moral of the story is to test the (expletive) out of your stuff and don't expect your players to be so wowed by a fancy model/skin/weapon/HUD to excuse the fact that they just fell through the floor of your map and into the void of BSP.

'''Foxpaw:''' There certainately are a number of various conceptions of what alpha and beta mean - it seems to be fairly agreed upon that alpha is an early &quot;proof of concept&quot; kind of stage, not feature complete but enough to tell if the game is going to be fun or not.. Beta seems more debated, I would say that a beta should happen directly before a release and should have no known bugs - simply a stage to try to find any bugs that may have been missed by the alpha testing group. (Like the duping bug in Diablo - this was probrably not apparent to the programmers, and is the sort of thing beta testing is intended to find out about.) That's my definition anyway.

'''Mychaeel:''' I'm simply fed up of mod developers not even ''wanting'' to get past &quot;beta&quot; with their mod.  Instead, they think as soon as they have reached something they can call &quot;beta&quot; they're ready for a grand public release and it's time to focus on a new version of their mod instead of finishing ''this'' version first.

'''Draconx:''' I like this quote:  There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.

'''Mysterial:''' Re: the uninstaller, not only should they PROVIDE an uninstaller, they should TEST the uninstaller. Especially with convenient and automated (in theory) uninstallers like the Unreal one for UMODs a lot of groups don't even bother to test it to see if it works. I've lost count of the number of uninstallers that either a) failed to actually delete anything, b) left files behind, or c) deleted too much and took files required for other things with it.

'''Mychaeel:''' You have a point.  Then again, a mod team should test ''everything'' before releasing it.  :-)  (Sadly enough we both know that isn't true, especially given the number of alpha- and beta-stage mods that are publicly released.)

'''Dirk Fist:''' I agree with Mychaeel, No matter how you try to define it BETA means NOT DONE. And Releasing something with a BIG RED NOT FINISHED on it is just wrong. If its solid enough for release then its version 1. 

'''W0RF:''' Two shining examples of this kind of behavior in the community: &lt;br /&gt;[http://modsquad.beyondunreal.com/review.php?id=117 Apocalypse Weapons] is a great example of why you shouldn't release early beta work publicly.  The first beta of Apocalypse Weapons was the first mod / mutator in the history of ModSquad to actually receive a rating of 0.  That's right, 0.  It was that bad.  Subsequent releases saw marked improvement, and by the time it got to around beta 5 or 6 it was one of the best weapons muts available for UT.  So at least it had a happy ending.  But any mut that receives a zero isn't erady for public consumption, and there's really no reason to submit the same mut to a review site seven times.

[http://mychaeel.no-ip.com/jailbreak/ Jailbreak] was the polar opposite.  It was constructed in a modular fashion, so it could be completed (and tested) in pieces, it's extraordinarily well-documented, and oh yeah, it's one of the most popular gametypes ever.  And I'm not just saying that because it's Mychaeel's project.  ;)

'''Ryan:''' Mychaeel is absolutely right in this article, it's not fair to expect people to put up with shoddy work.  Missing features are one thing but bugs are another.  The audience for mods includes the casual gamer as well as the script master general.  To widely release suggests some level of completeness, at least not obviously bugged.  The cry of &quot;it's only a beta&quot; cuts no ice. Either the developers knew of the bugs or they didn't.  If they did, shame on them.  If they didn't accept it and fix it.

For perspective, I'm a total newbie modder.  My background is commercial software for financial institutions.  I'm just coming to the end of a very long (18 month) beta trial of a system I wrote with a client.  They've found bugs but they knew what was going on and are very supportive.  In the end it all goes back to audience again.  The system will not go out for general consumption (other banks) until we're all satisfied with it.

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4325</id>
      <timestamp>2006-04-07T01:11:34Z</timestamp>
      <contributor>
        <ip>59.10.184.123</ip>
      </contributor>
      <comment>http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org</comment>
      <text xml:space="preserve">{{innerbox| ''This page is a collection of ramblings of mine.  Do not edit, but feel free to comment.  (Scroll down for comments.)''

}}

{{innerbox| ''I might change my mind on the matters discussed on this page without notice.  Part of the reason I'm writing them down is that I want to validate them for myself; that's much easier if I have to reflect on how to put them in words.''

}}

==Modding Etiquette ==

'''So you want to make a mod?'''  Great!  Welcome to the modding community.

First of all, there is a variety of ways you can learn things &amp;ndash; the hard way, or by listening to advice of people who have been there.  Nobody expects you to take that advice without reflection or by anybody's (actual or self-proclaimed) authority.  Just think about it.  When you actually start thinking about the stuff people more experienced than you are telling you, you might end up realizing that there's some truth in them.

This article is not about the technicals of modding &amp;ndash; I'm assuming that you're familiar with them or know how to become that way.  It's about the '''Etiquette of Modding''' &amp;ndash; how to make people ''like'' your mod.

===Understand Your Audience ===

The key to making people ''like'' your creation is looking at it from their point of view, not yours.

Yes, I know you have put hard work and lots of dedication into your mod, without getting any revenue from it.  And most people don't care; that's a simple truth.  But then again, they don't owe you anything &amp;ndash; you have no deal with them; they didn't hire you or promise you anything.

Now that your mod is released, the people out there are spending time and effort downloading and installing it.  It might be negligible effort compared with what you put into creating the mod, but that comparison doesn't apply &amp;ndash; as I said, they don't owe you anything to start with.  Only in the moment they're actually trying out your mod, you're starting to have a deal with them:  They invested time and work in attempting to try out your mod, so '''you better make it worthwhile.'''

That simple realization immediately leads to a couple of points:

====Don't Raise False Expectations ====

More than obviously misleading statements the ''lack'' of a statement can lead people to fall back to default expectations that don't apply for your mod.  The only thing you can gain by people believing in promises that your creation can't keep is a mob of disappointed, flaming users.  That is something you should avoid.

* '''Public alpha and beta versions''' have their place, but that place is equipped with big flashing red warning sign.  (Don't take this literally; any sort of unmistakable warning suffices.)  That means, everywhere, not just hidden somewhere on the download page and in the readme file.  Your audience should never even start believing that they're dealing with a release-quality product if they aren't.  If you're ashamed of admitting that your release is just a beta yet, don't release it.  (I'll pick that up later again.)

* Unreal Tournament mods are, by default, '''platform-independent.'''  Thus, if you don't expressly state otherwise, your users will expect nothing else; so the same big red flashing warning thing applies as well if you release a mod that is, for instance, Windows-only &amp;ndash; be it because you put some native code in or just released your mod in shape of an .exe installer.  Mac and Linux users will hate you if they click on a download link in happy anticipation just to learn that they've been purposely left out.  If that realization occurs only after an hour-long download, even worse.  (And would you blame them?)

* People expect mods to '''work both online and with bots.'''  See to it.

====Make Your Mod User-Friendly ====

The average user will neither read a FAQ, nor a readme file, nor a manual unless he or she is hard pressed to or highly motivated.  You can assume neither to start with.  The best way to deal with that is making reading FAQs, readmes and manuals optional &amp;ndash; in other words, spend some time to design your mod in a way that works as the user expects it to.  If you're unsure whether that extra design time of yours is worthwhile, just think of all the time you'll save yourself by not having to groan &quot;Read the FAQ&quot; or &quot;It's all in the manual.&quot;

* '''Use existing facilities''' the user is familiar with rather than inventing your own, even if you think that you could do it marginally better.  Stick to UMod installers and plain zipped distributions if you can help it.  Use the built-in mod launcher instead of creating your own flashy external launcher the user first has to look for (after reading the manual) in the System directory.  Plug your server browser tab into Unreal Tournament's built-in server browser.  Make in-game controls work as users are used to them.

* '''Don't impose arbitrary restrictions''' on how your mod works.  Mutators, for instance, are by design and by default cross-compatible to each other; but of course that doesn't mean that it's impossible for you to create a mutator that won't play well with others (by subclassing PlayerPawn, for instance).  If there's an actual need for such a restriction, make it inherently obvious.  Otherwise, investing time in coding something a less straightforward way to achieve the same goal while keeping compatibility is time very well spent.  An arbitrary restriction mentioned in a FAQ or readme file will just shift people's perception of it from &quot;bug&quot; to &quot;known bug,&quot; nothing else.

* '''Actively provide guidance''' for things that aren't obvious.  Don't assume people have read the manual and know that pressing this-or-that button will pop up a menu crucial for gameplay &amp;ndash; put that information somewhere on the HUD, for instance, at a reasonably unobtrusive, but visible location.  (And add an option for advanced users to switch that extra help off.)  Strangelove does that for its flight controls, Jailbreak for scoreboard sorting options.

* '''Provide a convenient and thorough uninstaller''' for your mod, and make sure it works as advertised.  If people are unsure whether your mod is worth a try, they'll be much more inclined to give it a chance if they know that they can quickly get it off their harddisk again in case they don't like it.  Also, if somebody wants to uninstall your mod but can't figure out how (and possibly ends up reinstalling the game in order to get rid of it) that's a surefire way to make certain he or she will never try any future version of your mod again.

====Be True To Yourself ====

{{innerbox| I've actually come to think that a team's chance of success is inversely proportional to the amount of time spent on the web site.

 : ''fragbert''

}}

If people get the impression that you're overrating your work, they'll be much less inclined to add to all the credit you're already giving yourself.

* '''Keep the hype at a reasonable level.'''  That goes hand-in-hand with the &quot;don't raise false expectations&quot; issue mentioned above.

* Don't fancy yourself of making a '''Total Conversion''' if the differences to what you're converting don't justify it.  There's no less honor in making a great mutator or a fun game type as there is in making a Total Conversion.  All those mod types have their place and uses, but thinking of a Total Conversion as the epitome of a game modification is simply wrong.  If you ever try to deal with the issues imposed by people's expectations of a game type mod or a mutator (for instance, cross-compatibility with other types of custom game content), you'll be left without any doubt of that assessment.  The demands of making a Total Conversion are ''different'', but not necessarily ''more sophisticated''.

* A custom launcher, splash screen, look-and-feel '''don't make your mod look professional''' &amp;ndash; just like smoking doesn't make you look cool.  (Generously quoting luquado from Nali City, &quot;that only works for cool people&quot; &amp;ndash; or professional mods, for that matter.)  Add those things as fancy final touches if you must, but don't think of them as a requirement for your mod's professional appearance.

===Dealing With Critics ===

After your mod is released, you'll get all sorts of feedback &amp;ndash; both positive and negative.  You can reduce the negative feedback to a minimum by following the advice in the section above (keep in mind: disappointed users will be the least forgiving ones), but even then there'll still be people who just don't like your mod, or some aspects of it.

First off, '''ignore the trolls''' among them.  You can recognize them by their habitat and their behavior; since their goal is to provoke an (offended) reaction, they'll say their piece where a lot of people can read it, and it will be designed to insult you.  Just ignore trolls.  They're perfectly aware of what they're doing, and what they want you to do, and you're in no position to insult them by questioning their statement's validity.  Mock them, gently, with a smile on your face, if you like &amp;ndash; that'll drive them mad.  Just by no means take them seriously or behave that way.

But not everybody publicly bashing your work is a troll; be very careful before you dismiss somebody's criticism as simple trolling.  (It's all too easy to go that way rather than facing the fact that people are genuinely unhappy with your mod.)  There's practically no other reason for somebody not liking your mod and expressing it in your face than being disappointed by it.  Disappointment is the result of expectations that weren't met.  And there are two ways you can deal with that:  Either lower the expectations (won't help people who already had them), or meet them.

There are a couple of things you should ''never'' tell people criticising your work:

* '''&quot;Do it better.&quot;'''  The different roles of developers and users are clearly defined:  You (the developer) are investing time in order to get a positive response; the user is investing time in order to be entertained.  If your mod fails to deliver the latter to the user, you can't expect the user to deliver the first to you.  It's not a matter of switching roles.

* '''&quot;It's just a beta/an alpha.&quot;'''  Alpha and beta versions shouldn't be released to the general public in the first place (see below).  In any case, that your released product is still in alpha or beta stage certainly doesn't invalidate users' complaints or make the developers any less responsible for it, so pointing out that &quot;it's just a beta&quot; is a pointless thing to do.

* '''&quot;You didn't pay; you're not entitled to complain.&quot;'''  Remember what I wrote above about having a deal with your users &amp;ndash; they don't owe you, you don't owe them, until they invest time and work in trying to get your mod up and running.  They have every right to complain if that investment turns out to be wasted.  (If you actually do deliver what you promised though, it's your turn to have a right to get a positive response from them.)

===Public Alphas and Betas ===

Alpha and beta versions are by definition unfinished and should in fact never see a release to the general public.  Looking around in the Unreal modding community you could almost think exactly the opposite was true, though:  Mods are in &quot;public beta&quot; stage for ''years'', and mostly without an actual release on the horizon too.

Quoting somebody else [http://www.isbc.com/business/com_jargon.cfm]:

{{innerbox| ; Alpha : Software undergoes alpha testing as a first step in getting user feedback. Alpha is Latin for &quot;doesn't work.&quot;

 ; Beta : Software undergoes beta testing shortly before it's released. Beta is Latin for &quot;still doesn't work.&quot;

}}

So you're releasing software that doesn't work?  If you are, do yourself a favor and do it to a limited test crew that's steeled as to what's expecting them.  Saying &quot;But it's just a beta!&quot; in a hurt (or annoyed) voice to end users that bicker about your bug-ridden beta version isn't going to make anything better.  Besides, end users are notoriously bad bug reporters &amp;ndash; if you'd like to get useful bug reports, you can brief your beta tester crew, but you won't succeed in doing that with a mob of end users.

In fact, most of the time developers seem to misunderstand what &quot;alpha&quot; and &quot;beta&quot; actually refers to.  &quot;Alpha&quot; and &quot;beta&quot; are indicators for a release's ''quality'', not its completeness in regard to what the development team envisioned as the ultimate goal.  (Note:  That's to be differed from the notion of feature-completeness.  The latter is subject to what you defined to belong on the current release's feature list.)

It's very understandable that development teams, especially those not expecting any other revenue than (positive) user feedback, are yearning to get their product out as soon as possible.  '''Cutting the mod's quality is certainly an ill-advised choice though.'''  If you see that you can't complete your mod to the full extent of what you envision it to be in the timeframe you want to keep, take smaller steps:  Define subsets of that full feature list that make sense on their own.  If you plan a Total Conversion (see above) with five game types, you could restrict a first public release to a single game type.  But make it work in a quality as if it was a mod of its own.

{{innerbox| When you begin writing a mod you should start small. Don't plan to write a Total Conversion from the very start. If you set goals that are too hard to reach, you'll get frustrated in the process of working towards them. It is much better to set a series of small goals and work to each one in turn. Start with a simple idea that could be expanded into a larger game.

 Always work on small, managable chunks that could each be released in their own right. If you do undertake a large project, organize your features into a release schedule. If your game is going to have five new weapons, make a release with three while your work on the others. Pace yourself and think about the long term.

 : ''Brandon Reinhart, [[Legacy:Mod Authoring/Some Advice To Start With|Mod Authoring]]''

}}

Those intermediate releases deserve an alpha and a beta stage in their own right.  There's no need to label the finished intermediate releases &quot;beta&quot; when they aren't.  It's perfectly possible to make them just as feature-complete and bug-free as any other release.  Time you spend making intermediate releases post-beta quality won't be lost when you continue working on your larger goal.

In any case, if you release intermediate versions, make them ''quality'' and '''don't call them beta.'''

==Related Topics ==

RegularX's ModSquad column:

[http://www.planetunreal.com/modsquad/ucc_make_14.htm ucc make (1.4): Patching the Beta]

[http://www.planetunreal.com/modsquad/ucc_make_15.htm ucc make (1.5): Fixing &quot;Patching the Beta&quot;]

==Comments ==

'''Mychaeel:'''  My intention here, as stated above, is trying to find out whether my stated notions make sense or not.  If they do, I strive to present them in a kindly, reasonable way that doesn't make anybody who's reading this feel as if I was saying &quot;You're an idiot for not doing it ''that'' way.&quot; &amp;ndash; I'm obviously stating my own opinion here and am not likely to feel offended by it, but what do other people think &amp;ndash; from a user's and a developer's point alike?

'''Tarquin:'''  They make sense to me. A very valuable addition to &quot;never join a mod with only a website&quot;.

'''Mychaeel:'''  Thanks for your opinion.  I ''had'' to get this off my chest sometime...

'''Tarquin:'''  okay, two criticisms about this page: it's too cleanly structured to be a ramble &amp; it's too rationally thought-out to be a rant ;)

'''Mychaeel:'''  Damn.  Gotta practice harder rambling and ranting.  ;-)

'''EntropicLqd:'''   Good page.  Very well written &amp;ndash; I can hear the restraining chains in the background though :).  About the only thing I'd be inclined to add is that if you do release intermediate versions give the packages their own release numbers (e.g. CTFPlus100.u, CTFPlus150.u).  I wished I'd done it after I wound up with 4 seperate versions of the mod on my HD and the only way to tell them apart was buy looking at the CTFPlusGame.uc file - duh!

'''Birelli:'''  Yeah, very nicely written Mych. Some of the things you pointed out kind of shaped into one statement my general feelings on things like alpha/beta releases and especially responses to critics. I witnessed the utter disaster that EV:Nova was (a mac-only game from Ambrosia). I saw a lot of &quot;do it better&quot; responses from the development team, which was assaulted by an angry mob of disappointed fans who had been being hyped up about the game for years. I didn't end up buying the game, and have never regretted the decision, as the game needed a lot of work that the development team wasn't willing to admit it did and the public was bashing them for not doing. Basically, the largest revenue source of a great gaming company was dashed because the developers they hired didn't follow these rules, so nice writing :-)

'''Tarquin:'''  Completely unrelated, but it's an equally well-written set of sensible guidelines that many people don't follow: Mac osX commandments: http://www.panic.com/audion/rights.html (nice screenies too)

'''Anonymous:''' This is almost a list of all the things Team Orbit did / does wrong. Don't quote me.

'''Dante:''' Very good. But I don't share the same opinion with alpha/betas. Even if &quot;they&quot; meant something else, they are even published by commercials. If you make a mod and your final product will take a looong time, but you want to hand something out earlier, a &quot;beta&quot; stamp does fit very well. People will understand, if they find any bugs. But if you didn't test it enough ( and so, almost always ), and you say it's 1.0 - and people find bugs in there, they won't be as forgiving. I remember, when I worked in Front Line Assault ( 2001 ) and the team was small, and developers were rare ( as they still are ) - we finally published an alpha. That was, because some members were lazy, some had too much RL. It was really crap, much bugs, and netplay ( omg I'm ashamed I did it ) was uhm - nm ;) But the point is, that all people who have spoken too me said &quot;Yeah, it's buggy, but it's really cool for an alpha&quot;. We also got reviewed, and got a good rating. So I would suggest, only release things non-alpha/beta which really fit your design doc and don't have much &quot;known&quot; bugs.

'''Mychaeel:''' My basic point is:  Don't publicly release buggy software.  Never.  For me, as a developer, that's a matter of professional attitude; and for me, as a user, it's something I simply expect from developers with professional attitude.  An annoying bug doesn't get the least bit less annoying just because the developers said &quot;it's just a beta.&quot;

'''Dante:''' ''Don't release buggy software'', that's impossible ;) Today, I share your opinion. But, I think, better have an annoying bug than no game at all. If you have the resources to finish a project off, then you should finish it before releasing it. But if you don't know if you can finish it as you wish, and people keep beggin for a release, it's very hard to say ''No''.

'''Mychaeel:''' Public alpha and beta releases are the equivalent to websites with &quot;Under Construction!&quot; signs everywhere.

'''Dante:''' There's a big difference imho. &quot;Under Construction!&quot; means ''Dead''. You maybe don't like public alpha and beta releases, but it's still a lot of work to get there, and it shows that you've done something.

'''Mychaeel:''' &quot;Under Construction&quot; doesn't mean &quot;dead,&quot; it means &quot;prematurely released.&quot;  (The fact that things that are released prematurely frequently never get completed is a different matter.)  The very idea of having an alpha and a beta stage is to do quality assurance ''before'' the product is publicly released so that it can be of high quality ''when'' it is released.  Publicly releasing alpha and beta versions completely defeats the point of having them in the first place.  If you have an alpha- or beta-quality product and release it publicly, it doesn't become a &quot;public alpha/beta version&quot; but a &quot;release version with alpha-/beta-quality.&quot;  I have yet to see when a premature release of a product, ''especially'' a highly anticipated one, yielded anything positive at long sight.

'''Dante:''' Even if I don't like it, but - Counterstrike. It had tons of betas, and IIRC many bugs in it's first stages. But now it's played by most of the community. Yo, I've really tried to tell them that CS is shit (j/k I would be dead afterwards)

'''Mychaeel:''' Alleged third-party authority makes a bad argument.  I'd rather say that Counter Strike is popular ''despite'' being initially released with tons of bugs, not ''because of it''.  For that matter, look at CSHP and UTPure &amp;ndash; they're still labeled &quot;Release Candidate,&quot; even though they're most obviously released already.  It just makes no sense.

To me, releasing alpha or beta versions can mean either of the following things (or both):  The team didn't bother with making their product release quality before releasing it; or they're using the alpha/beta label as a shield against user feedback.  &quot;It's just a beta.&quot;  Or: &quot;It's pretty good, for a beta.&quot;  Releasing a product as a public alpha or beta is something a mod team does solely for its ''own'' sake, not for the users', and it's entirely unrelated to the actual notion of the alpha and beta stages ''every'' good product goes through (just not publicly).

'''Dante:''' I didn't say that it's so popular ''because of it'' being released as beta initially. And you wanted an example, so my arguments fits in really good. Yes, mod teams, which release betas etc., do this for their own sake. Calling something RC and publishing it is wrong, there's where I share your opinion. But still, releasing a public beta is different. 

I on my own think of a beta, as a snapshot of their actual development. Of course a public beta shouldn't be too buggy. But if I like a mod, and the developers say &quot;Hey, we could release a public beta. We got most of the bugs we found out. There's only one bigger thing: you'll need to rejoin after each round. Should we fix all bugs and release later instead?&quot;, I wouldn't open my mouth and say &quot;go on, fix everything, I don't want it now&quot;...

'''Mychaeel:''' Without continuing this discussion much further, I'd like to remove everything from it except your first statement; this is, after all, a &quot;Comments&quot; section and not a &quot;Discussion&quot; one.  :-)  Any objections?  We can carry on with this discussion somewhere else if you like.  (Besides, a Wiki isn't the ideal place for such discussions anyway.)

'''capt. k.:''' grrr.  I had this big long comment all written up and ready to post.  :P

'''Mychaeel:''' If it's a ''comment'' relating to the article, feel free to post it.  :-)

'''Dante:''' Nevermind, just remove it. I'm still happy with the overall ''Etiquette''.

'''ExTReMe:''' My favorite phrase: My software doesn't have bugs. It just develops random features :)

'''Aphelion:'''  I think this article is very good.  However, it seems a little hazy in regard to talking about prereleases.  The impression I get at times is: don't release anything until you're finished&quot; while at others it is &quot;if you do release, never CALL it beta or alpha&quot; with some qualifying remarks and an injunction never to release at least very buggy mods.  Firstly, this seems a bit confused to me.  Secondly, it doesn't really deal with people who want to play your mod from the word go and want to see what you're doing in bringing them this mod that, they hope, will fufill their expectations once it is complete.  I saw a lot of this in Unreal Fortress, a conversion mod of the fortress gamestyle where people were openly wanting a UT Fortress mod and prepared to take time and effort to get it.

'''Mychaeel:''' It's a bit of both, actually.  Firstly, it seems to be somewhat fashionable among mod teams to call their releases &quot;betas&quot; without thinking much about that; even if they were actually able to release a full-fledged, high-quality, bug-free product.  At the same time this attitude makes them procrastinate any decent quality control (that a beta stage should take care of, actually), which results in low-quality &quot;public beta&quot; releases for no other reason than that the team simply couldn't be bothered with ''actually'' going through a beta stage.  (A beta stage doesn't sound like fun, I know.)  And people who want to play buggy mods should be (internal) beta testers.  There's really no need to subject ''everybody'' to that.

'''Mychaeel:''' Have a look at [http://forums.beyondunreal.com/showthread.php?postid=1427867#post1427867 this posting of mine] over in BuF.  I'm trying to explain the importance of internal beta testing there.

'''Jesco:''' Err, Mychaeel, you never had latin in school, did you? Or ancient greek? I could live with the explanation of 'alpha' and 'beta', but they are greek letters and no latin words, man. :p ;)

'''Mychaeel:''' That's a quote, Jesco (see the sentence before).  I'm also aware that &quot;alpha&quot; doesn't, in fact, is properly translate as &quot;doesn't work.&quot;  ;-)

'''Dante:''' I might have explained myself above a bit wrong... But I still think &quot;alpha&quot; works fine for &quot;many bugs, don't release&quot;. It's just a subjective opinion of how to call your internal version. And I still think releasing a beta is good. Again, it's just your own decision if you call it beta, demo or whatever. But, and that's also right, you should never release anything with known bugs. I, and most players, except beta's to miss some things of the &quot;final&quot; version. ( In the case of UT2003, which I consider beta/demo, the redeemer ie. ). Of course bugs in any public version are the way to death of your mod. 

'''You:''' I wish to argue with the above Beta argument as well. IMO, an alpha is strictly internal, it is used for any piece of code which compiles, but still has several (sometimes hard to find) logical bugs. After that, a Closed Beta should be administered to a test audience (mostly the developers, but other peopel too... sometimes developers subcosciously stray from behavior that would break a mod). After the closed beta comes the Open Beta, where it is practically a demo. Any problems that users encounter at this stage shoul dbe taken to heart, and revisions should be frequent/etc... The reasoning behind this is that there are several bugs that you won't be able to find with a small test group, or subtle flaws in gameplay issues that you may disreguard, but others find annoying. A good example of this is the &quot;Fatigue&quot; system in Counterstrike... It was a novel solution, and it *did* work, but was quite annoying. I heard that they recently removed it because of that.

'''Githianki:''' Mychaeel is perfectly right to criticize modders who think that software is beta because they have 5 out of ten eventual &quot;planned&quot; features implemented.  In the modding community Alpha and Beta are pretty loosely used terms, but there are more precise definitions (which vary from company to company :)).  I have even seen a misuse indicating the user thought that Alpha was a higher degree of completion. I guess this was based on believing Alpha is 'higher' than Beta in the alphabet.  For most companies, Alpha means feature complete, with all features locked down, placeholder art/sounds in place, and all levels/quests playable.  From there it is on to testing and optimizing and putting in final assets.  This is in fact how several developers have described alpha and beta in various interviews and articles.  

I think that Mychaeel has laid down some good advice on this page and in others.  It should be made the basis for a set of open pages on the subject (respecting that these are Mychaeels's opinions and he wishes them to be labelled as such).  

Also, I made an edit to fix Brandon's name (Reinhart not Reinhard).

'''AlphaOne:''' I just want to say that I've downloaded your bot spectator mod. The thing that amazed me is the fact that you've included a directory structure in the zip file. It's so much easier to install the mod that way. When installing other mods I sometimes confuse .uax with .usx. Great job! To others - '''include a subdirectory structure of your mod in your zip file!!!!!!!!!!!!!!!!!!'''

'''Spark:''' I completely agree... Coming from the Quake world, it amazed me how lazy most Unreal developers are when it comes to packaging their mods and maps. I could barely believe my eyes when I downloaded a popular mod and read &quot;installation instructions&quot;, telling me where to place each of a plethora of files. This isn't 1998 anymore, users should (allowed to) be lazy, not developers. :)

'''Mecha:''' Strictly speaking, that's the entire point of a [[Legacy:UMOD|UMOD]] file&amp;ndash;to autoinstall everything for you. I thought I heard they had some teething problems when UT2k3 was released, but Wormbo's seem to work OK, so there's no real excuse there anymore.

'''Mychaeel:''' ...just that some people still don't have the latest patch installed, still aren't entirely comfortable with them and there still are a few subtle bugs happening for people using other language localizations than the default international one.  I will ''always'' provide a plain .zip distribution even if I make a .ut2mod installer ''as well'', but for something as small as the [[Legacy:Spectate Bots|Spectate Botmatch]] mutator I felt making a .ut2mod installer was more hassle than worth for everyone.

'''Chazums:''' A very interesting piece and i igree with pretty much all of it, although i feel that the mod comunity has effectily re-defined the term Beta as something related to time.  Purhaps you'd like to add something about using release candidates as an alternate method.  Something else that would be good etiquette would be organised version numbering so users know what sort of update to expect compared with the last version.

'''ZxAnPhOrIaN:''' Err.. that was twenty cents, not two cents!! :P

'''Piglet:''' I can appreciate your want to close down this discussion. However i cant help but add my views.  Pesonally i agree with the definition of alpha versions, and agree that there release is normally a very unwise thing to do. However i disagree with your views on beta.  If alpha means 'Doesn't Work' then i feel beta should be defined as 'Nearly Works'.  In short whilst alpha's should never be released, beta's should be ''considered'' for release.  If a beta isn't ready for ''partial'' release then it isn't a beta yet, it's still a beta.  Just my views, but hey :)

'''Mychaeel:''' I've had some time to think about my stance on that since I wrote this article.  I think what actually bothers me when I see a mod team releasing a &quot;public beta&quot; is the following:  Too many mod teams use the term &quot;beta&quot; for indefinite lengths of time to avoid having to tackle the more annoying parts of development (such as fixing bugs) and as a shield against criticism &amp;ndash; &quot;Hey, it's just a beta!&quot;  On the other hand, a serious limited-time public beta is fine with me, provided the software ''really'' is in beta stage already and the team doesn't sell its public beta to the general public like an actual release.

'''RegularX:''' There is no real difference between a beta and a release candidate other than with an RC you are making the guess that it might be production worthy. Public Betas/Demos/Previews are also pretty much the same thing.  It's an agreement that someone gets to look at an early version, but knows it's not necessarily production code.

As Mychaeel is saying, it's not kosher to just continually release betas, particularly to form the response 'Well, it doesn't work right because it's beta'.  And if it is a beta, or a demo - then label it clearly that it's a beta, or a preview, or a demo.  When someone sends out an news blast three times in as many weeks, that mod release better not be a preview.  Likewise, when I download something and end up say, falling through a map three times in my first dry run of it - don't call it ready for the public.

Basically, beta is a stage in development - not an excuse.

'''MadNad:''' I just wanted to mention that I used an alpha test to catch early bugs in the multiplayer code, however, this alpha test was not a public test.  I ran a private beta test later...accomplishing the same thing.  When I finally did have a public Beta test, I had removed most of the bugs and gotten the gameplay about where I wanted it.  This test was to get feedback and to test the MOD on a server loaded with people.  Again giving me a better understanding of what the public wanted to see in my MOD, and what sort of requirements I may have to specify for running the mod.

They were very beneficial to me, but I was very careful not to let it out too early giving everyone false impressions of what the final version will be.

'''Mychaeel:''' ...and I hope this public beta was soon followed by a release.  Was it?  :-)

'''Mozzie:''' Great Stuff! I'll go post a link to on my Mod's Development Forums... And whats a Good way to Recruit people when you have NO product, my Team is 3 people, Mapper/;write (me), A Writer/Voice Actor, and a Webesigner/Quality Control.. AND NONE OF US EVEN HAVE THE GAME YET!! (U2) How the Hell I'm a gonna Muster Support? ITS SO CONFUSING! &gt;:@ Nice Page MyChaeel.

'''MadNad:''' Yes, it was released after about a month and a half after those tests.  http://planetquake.com/excessive  I released it last Sunday 2-23-03.

'''Koosh:''' I think alpha means &quot;It works, but it has bugs&quot; and beta means &quot;There aer few if any bugs, and we want your opinion&quot; and a numbered release means &quot;We showed it to people and they liked it.

'''Mychaeel:''' See?  There's the misconception.  &quot;Alpha&quot; and &quot;beta&quot; have fixed meanings.  &quot;Alpha&quot; means &quot;feature-incomplete,&quot; and &quot;beta&quot; means &quot;feature-complete, in testing.&quot;  Since testing and bug-fixing is nothing end users should ever be subjected to, beta versions should never be publicly released unless the public is made ''very'' well aware that they're dealing with program that hasn't been thoroughly tested yet.

'''RegularX:''' Alphas are intended to test out basic gameplay ideas.  They are buggy, incomplete and evil.  Anyone playing something marked &quot;alpha&quot; should know they are buggy, incomplete and evil or walk away from playing/testing them.  Betas are also buggy and evil, but are supposed to represent what the game is actually going to be.  I then actually distinct between beta and a Release Candidate. An RC should be innocent and good, but maybe have some hidden bugs.  Semantics aside (since nobody understands the terms anyway) - I think the moral of the story is to test the (expletive) out of your stuff and don't expect your players to be so wowed by a fancy model/skin/weapon/HUD to excuse the fact that they just fell through the floor of your map and into the void of BSP.

'''Foxpaw:''' There certainately are a number of various conceptions of what alpha and beta mean - it seems to be fairly agreed upon that alpha is an early &quot;proof of concept&quot; kind of stage, not feature complete but enough to tell if the game is going to be fun or not.. Beta seems more debated, I would say that a beta should happen directly before a release and should have no known bugs - simply a stage to try to find any bugs that may have been missed by the alpha testing group. (Like the duping bug in Diablo - this was probrably not apparent to the programmers, and is the sort of thing beta testing is intended to find out about.) That's my definition anyway.

'''Mychaeel:''' I'm simply fed up of mod developers not even ''wanting'' to get past &quot;beta&quot; with their mod.  Instead, they think as soon as they have reached something they can call &quot;beta&quot; they're ready for a grand public release and it's time to focus on a new version of their mod instead of finishing ''this'' version first.

'''Draconx:''' I like this quote:  There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.

'''Mysterial:''' Re: the uninstaller, not only should they PROVIDE an uninstaller, they should TEST the uninstaller. Especially with convenient and automated (in theory) uninstallers like the Unreal one for UMODs a lot of groups don't even bother to test it to see if it works. I've lost count of the number of uninstallers that either a) failed to actually delete anything, b) left files behind, or c) deleted too much and took files required for other things with it.

'''Mychaeel:''' You have a point.  Then again, a mod team should test ''everything'' before releasing it.  :-)  (Sadly enough we both know that isn't true, especially given the number of alpha- and beta-stage mods that are publicly released.)

'''Dirk Fist:''' I agree with Mychaeel, No matter how you try to define it BETA means NOT DONE. And Releasing something with a BIG RED NOT FINISHED on it is just wrong. If its solid enough for release then its version 1. 

'''W0RF:''' Two shining examples of this kind of behavior in the community: &lt;br /&gt;[http://modsquad.beyondunreal.com/review.php?id=117 Apocalypse Weapons] is a great example of why you shouldn't release early beta work publicly.  The first beta of Apocalypse Weapons was the first mod / mutator in the history of ModSquad to actually receive a rating of 0.  That's right, 0.  It was that bad.  Subsequent releases saw marked improvement, and by the time it got to around beta 5 or 6 it was one of the best weapons muts available for UT.  So at least it had a happy ending.  But any mut that receives a zero isn't erady for public consumption, and there's really no reason to submit the same mut to a review site seven times.

[http://mychaeel.no-ip.com/jailbreak/ Jailbreak] was the polar opposite.  It was constructed in a modular fashion, so it could be completed (and tested) in pieces, it's extraordinarily well-documented, and oh yeah, it's one of the most popular gametypes ever.  And I'm not just saying that because it's Mychaeel's project.  ;)

'''Ryan:''' Mychaeel is absolutely right in this article, it's not fair to expect people to put up with shoddy work.  Missing features are one thing but bugs are another.  The audience for mods includes the casual gamer as well as the script master general.  To widely release suggests some level of completeness, at least not obviously bugged.  The cry of &quot;it's only a beta&quot; cuts no ice. Either the developers knew of the bugs or they didn't.  If they did, shame on them.  If they didn't accept it and fix it.

For perspective, I'm a total newbie modder.  My background is commercial software for financial institutions.  I'm just coming to the end of a very long (18 month) beta trial of a system I wrote with a client.  They've found bugs but they knew what was going on and are very supportive.  In the end it all goes back to audience again.  The system will not go out for general consumption (other banks) until we're all satisfied with it.

----

[[:Category:Legacy Rant]]

[[http://cgi.w3.org/cgi-bin/tidy?docAddr=http://phentermine.buy-here.org phentermine]]
[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Mysterial</title>
    <id>2077</id>
    <revision>
      <id>5056</id>
      <timestamp>2003-07-10T00:17:34Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Info ===

I've written various UT2003 mods. Probably the most known of them is [http://www.error691.com/mysterial/Greed/ Greed], but you can find the rest of them at [http://www.error691.com/mysterial/ my UT2003 mods site].

One of these days I'll get around to writing a Wiki page on how the [[Legacy:Bot|bot]] code in UT2003 works (or is there already one?), since I've spent way too much time staring at it. It's a wonder I can still think coherently. It's right up there with [[Legacy:Replication|replication]] in difficulty to follow.

I like feedback on my stuff, even if it's bad. My contact info is:

ICQ: 105042378

AIM: Mysterial2

Email: [mailto:mysterial@comcast.net click here]

===Other Stuff ===

I write mods/programs for lots of other games. Most of them have been small, because anything large requires graphics, and I'm kinda afraid of starting/joining a mod group because it seems they have a higher chance of failing than marriages in America.

I suck at names. I don't know why.

I'm a big Linux fan. Wish Epic had given UT2003 a full Linux port (or at least had ported [[Legacy:Ucc|ucc]] make). On the other hand, it could've been worse *cough* Bioware *cough*. Sorry, had to do that. :D

I love random things, as you can see on my mods page. It probably comes from playing too much Doom 2 with the D!Zone program (which had an excellent and very customizable map item randomizer).

'''How I know I'm a hardcore programmer:''' When the Epic Bonus Pack for UT2003 came out, I found config variables in the Invasion code, located them in UT2003.ini, and posted the info to the official forums. An amused poster then replied, educating me to the presence of the menu controlling those options in Invasion's game rules tab, which I had missed because I had played online and then went straight to the code. :o

'''GRAF!K:''' I'm constantly getting bit by the same thing. On [[Legacy:Graphik|my mod project]] I spent hours trying to eliminate screen flashes. Found out it's in the menu. :rolleyes: :D

----

'''Tarquin:''' Hi there! welcome to the site :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5057</id>
      <timestamp>2003-03-12T04:42:50Z</timestamp>
      <contributor>
        <ip>Mysterial</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===Info ===

I've written various UT2003 mods. Probably the most known of them is [http://www.error691.com/mysterial/Greed/ Greed], but you can find the rest of them at [http://www.error691.com/mysterial/ my UT2003 mods site].

One of these days I'll get around to writing a Wiki page on how the [[Legacy:Bot|bot]] code in UT2003 works (or is there already one?), since I've spent way too much time staring at it. It's a wonder I can still think coherently. It's right up there with [[Legacy:Replication|replication]] in difficulty to follow.

I like feedback on my stuff, even if it's bad. My contact info is:

ICQ: 105042378

AIM: Mysterial2

Email: [mailto:mysterial@comcast.net click here]

===Other Stuff ===

I write mods/programs for lots of other games. Most of them have been small, because anything large requires graphics, and I'm kinda afraid of starting/joining a mod group because it seems they have a higher chance of failing than marriages in America.

I suck at names. I don't know why.

I'm a big Linux fan. Wish Epic had given UT2003 a full Linux port (or at least had ported [[Legacy:Ucc|ucc]] make). On the other hand, it could've been worse *cough* Bioware *cough*. Sorry, had to do that. :D

I love random things, as you can see on my mods page. It probably comes from playing too much Doom 2 with the D!Zone program (which had an excellent and very customizable map item randomizer).

'''How I know I'm a hardcore programmer:''' When the Epic Bonus Pack for UT2003 came out, I found config variables in the Invasion code, located them in UT2003.ini, and posted the info to the official forums. An amused poster then replied, educating me to the presence of the menu controlling those options in Invasion's game rules tab, which I had missed because I had played online and then went straight to the code. :o

----

'''Tarquin:''' Hi there! welcome to the site :D

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MythOpus</title>
    <id>2072</id>
    <revision>
      <id>5046</id>
      <timestamp>2008-02-07T18:08:13Z</timestamp>
      <contributor>
        <ip>142-165-95-83.msjw.static.sasknet.sk.ca</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">=MythOpus=

{|

|-
|Name:
|Dalin Seivewright
|-
|Age:
|18
|-
|E-Mail:
|dalin.seivewright[DELETEME]@yahoo.ca
|}

==Subpages==
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]

==Completed/Released Projects==

===Anti-TTF Mutator===

====About====

This mutator stopped players from being able to tele-frag other players on their team.  Contrary to popular believe, TFing someone on the other team is not the same as TFing someone on your own team is the result of what I can only describe as a bug in the engine that is only account for by killing someone due to tele-fragging.  There are if I remember correctly 3 types of telefragging damage types.  one is used to describe normal telefragging, the other two are special cases the engine uses.  Anyways, this mutator in theory and in practice prevents that from happening.  Instead of dying, the player who would have died will remain untouched as the player who tried to telefrag them will be either respawned at a player start or actually killed.  There is an option to choose either way you prefer for your server.  It has been tested with bots (who are notorious for this) and online.

'''Also, many many many other mutators which are either so common that they need not be released, have been lost due to computer complications, or have been branded with the &quot;I made this and it serves no purpose to me or anyone!&quot; and thus, deleted.'''

==Postponed/Cancelled Projects==

===Icarus===

====About====

I'm working on a custom AI which I am totally codenaming &quot;Icraus&quot;.  It is my attempts at a custom AI coded bottom up from scratch.  Most likely to only be used in Deathmatch situations, Icarus bots will not use the AI systems implemented in UT2004 so NavigationPoints will not be used.  This also means that the bots will not be omnipresent so they won't know the location of all enemy players until they actually see them, they won't know locations of weapons unless they've been that weapon pickup and eventually, they will play, learn and eventually improve themselves and how they play.  It is an attempt to make a more 'real' opponent because I was getting tired of getting one-shot killed (InstaGib) after jumping from the top of a tower in CTF-FaceClassic and other such maps.  When its done, it will be released as open-source with a license of some sort.

====Background====

It was derived from a concept for a sort of total conversion that involved, 3rd person view, restricted movement (i.e. only up,down,left,right and all 45 degree diagonal movements), and some other things A-la Metal Gear Solid.  That plan was recently scrapped however as my interest grew with regards to the AI that I was coding from scratch for the mod.

====Implementation====

The bots will be implemented into the game most likely through a custom gametype.  Because the AI does not extend from the usual AI tree in UT2004, it can't be linked into a normal UT game without excess code.  My plans for implementing may change however.  Another idea was to use a mutator to change the bots that are spawned but even that would take awhile to work out.  Gametypes can be unforgiving when you don't do things the way that it wants you to.

'''And then many many many 'large' scale projects and mutators which either haven't gotten off the ground or were near completion but were stopped for whatever reason.'''

===Daedalus===

Daedalus was a server bot designed to punish people for swearing and team killing.  It also featured some user commands that could be 'said' rather than typed into the console for the command to be executed.  The only real testing for it happened on a server that was part of a Guild I was with a long time ago.  The source and the actual bot itself is lost.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5047</id>
      <timestamp>2007-08-17T16:50:51Z</timestamp>
      <contributor>
        <ip>Graphik</ip>
      </contributor>
      <minor/>
      <comment>The silent markup assassin strikes again...</comment>
      <text xml:space="preserve">=MythOpus=

{|

|-
|Name:
|Dalin Seivewright
|-
|Age:
|18
|-
|E-Mail:
|mythopus[DELETEME]@hotmail.com
|}

==Subpages==
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]

==Current Projects==

===Icarus===

====About====

I'm working on a custom AI which I am totally codenaming &quot;Icraus&quot;.  It is my attempts at a custom AI coded bottom up from scratch.  Most likely to only be used in Deathmatch situations, Icarus bots will not use the AI systems implemented in UT2004 so NavigationPoints will not be used.  This also means that the bots will not be omnipresent so they won't know the location of all enemy players until they actually see them, they won't know locations of weapons unless they've been that weapon pickup and eventually, they will play, learn and eventually improve themselves and how they play.  It is an attempt to make a more 'real' opponent because I was getting tired of getting one-shot killed (InstaGib) after jumping from the top of a tower in CTF-FaceClassic and other such maps.  When its done, it will be released as open-source with a license of some sort.

====Background====

It was derived from a concept for a sort of total conversion that involved, 3rd person view, restricted movement (i.e. only up,down,left,right and all 45 degree diagonal movements), and some other things A-la Metal Gear Solid.  That plan was recently scrapped however as my interest grew with regards to the AI that I was coding from scratch for the mod.

====Implementation====

The bots will be implemented into the game most likely through a custom gametype.  Because the AI does not extend from the usual AI tree in UT2004, it can't be linked into a normal UT game without excess code.  My plans for implementing may change however.  Another idea was to use a mutator to change the bots that are spawned but even that would take awhile to work out.  Gametypes can be unforgiving when you don't do things the way that it wants you to.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5048</id>
      <timestamp>2008-01-26T21:04:17Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">=MythOpus=

{|

|-
|Name:
|Dalin Seivewright
|-
|Age:
|18
|-
|E-Mail:
|mythopus[DELETEME]@hotmail.com
|}

==Subpages==
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]

==Completed/Released Projects==

===Anti-TTF Mutator===

====About====

This mutator stopped players from being able to tele-frag other players on their team.  Contrary to popular believe, TFing someone on the other team is not the same as TFing someone on your own team is the result of what I can only describe as a bug in the engine that is only account for by killing someone due to tele-fragging.  There are if I remember correctly 3 types of telefragging damage types.  one is used to describe normal telefragging, the other two are special cases the engine uses.  Anyways, this mutator in theory and in practice prevents that from happening.  Instead of dying, the player who would have died will remain untouched as the player who tried to telefrag them will be either respawned at a player start or actually killed.  There is an option to choose either way you prefer for your server.  It has been tested with bots (who are notorious for this) and online.

'''Also, many many many other mutators which are either so common that they need not be released, have been lost due to computer complications, or have been branded with the &quot;I made this and it serves no purpose to me or anyone!&quot; and thus, deleted.'''

==Postponed/Cancelled Projects==

===Icarus===

====About====

I'm working on a custom AI which I am totally codenaming &quot;Icraus&quot;.  It is my attempts at a custom AI coded bottom up from scratch.  Most likely to only be used in Deathmatch situations, Icarus bots will not use the AI systems implemented in UT2004 so NavigationPoints will not be used.  This also means that the bots will not be omnipresent so they won't know the location of all enemy players until they actually see them, they won't know locations of weapons unless they've been that weapon pickup and eventually, they will play, learn and eventually improve themselves and how they play.  It is an attempt to make a more 'real' opponent because I was getting tired of getting one-shot killed (InstaGib) after jumping from the top of a tower in CTF-FaceClassic and other such maps.  When its done, it will be released as open-source with a license of some sort.

====Background====

It was derived from a concept for a sort of total conversion that involved, 3rd person view, restricted movement (i.e. only up,down,left,right and all 45 degree diagonal movements), and some other things A-la Metal Gear Solid.  That plan was recently scrapped however as my interest grew with regards to the AI that I was coding from scratch for the mod.

====Implementation====

The bots will be implemented into the game most likely through a custom gametype.  Because the AI does not extend from the usual AI tree in UT2004, it can't be linked into a normal UT game without excess code.  My plans for implementing may change however.  Another idea was to use a mutator to change the bots that are spawned but even that would take awhile to work out.  Gametypes can be unforgiving when you don't do things the way that it wants you to.

'''And then many many many 'large' scale projects and mutators which either haven't gotten off the ground or were near completion but were stopped for whatever reason.'''

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10684</id>
      <timestamp>2008-04-01T17:06:11Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>Delete Me - No point on having this now then :)</comment>
      <text xml:space="preserve">[[DeleteMe]]
=MythOpus=

{|

|-
|Name:
|Dalin Seivewright
|-
|Age:
|18
|-
|E-Mail:
|dalin.seivewright[DELETEME]@yahoo.ca
|}

==Subpages==
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]

==Completed/Released Projects==

===Anti-TTF Mutator===

====About====

This mutator stopped players from being able to tele-frag other players on their team.  Contrary to popular believe, TFing someone on the other team is not the same as TFing someone on your own team is the result of what I can only describe as a bug in the engine that is only account for by killing someone due to tele-fragging.  There are if I remember correctly 3 types of telefragging damage types.  one is used to describe normal telefragging, the other two are special cases the engine uses.  Anyways, this mutator in theory and in practice prevents that from happening.  Instead of dying, the player who would have died will remain untouched as the player who tried to telefrag them will be either respawned at a player start or actually killed.  There is an option to choose either way you prefer for your server.  It has been tested with bots (who are notorious for this) and online.

'''Also, many many many other mutators which are either so common that they need not be released, have been lost due to computer complications, or have been branded with the &quot;I made this and it serves no purpose to me or anyone!&quot; and thus, deleted.'''

==Postponed/Cancelled Projects==

===Icarus===

====About====

I'm working on a custom AI which I am totally codenaming &quot;Icraus&quot;.  It is my attempts at a custom AI coded bottom up from scratch.  Most likely to only be used in Deathmatch situations, Icarus bots will not use the AI systems implemented in UT2004 so NavigationPoints will not be used.  This also means that the bots will not be omnipresent so they won't know the location of all enemy players until they actually see them, they won't know locations of weapons unless they've been that weapon pickup and eventually, they will play, learn and eventually improve themselves and how they play.  It is an attempt to make a more 'real' opponent because I was getting tired of getting one-shot killed (InstaGib) after jumping from the top of a tower in CTF-FaceClassic and other such maps.  When its done, it will be released as open-source with a license of some sort.

====Background====

It was derived from a concept for a sort of total conversion that involved, 3rd person view, restricted movement (i.e. only up,down,left,right and all 45 degree diagonal movements), and some other things A-la Metal Gear Solid.  That plan was recently scrapped however as my interest grew with regards to the AI that I was coding from scratch for the mod.

====Implementation====

The bots will be implemented into the game most likely through a custom gametype.  Because the AI does not extend from the usual AI tree in UT2004, it can't be linked into a normal UT game without excess code.  My plans for implementing may change however.  Another idea was to use a mutator to change the bots that are spawned but even that would take awhile to work out.  Gametypes can be unforgiving when you don't do things the way that it wants you to.

'''And then many many many 'large' scale projects and mutators which either haven't gotten off the ground or were near completion but were stopped for whatever reason.'''

===Daedalus===

Daedalus was a server bot designed to punish people for swearing and team killing.  It also featured some user commands that could be 'said' rather than typed into the console for the command to be executed.  The only real testing for it happened on a server that was part of a Guild I was with a long time ago.  The source and the actual bot itself is lost.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>10690</id>
      <timestamp>2008-04-01T17:33:22Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <text xml:space="preserve">{{delete}}
=MythOpus=

{|

|-
|Name:
|Dalin Seivewright
|-
|Age:
|18
|-
|E-Mail:
|dalin.seivewright[DELETEME]@yahoo.ca
|}

==Subpages==
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Rants]]
;[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]

==Completed/Released Projects==

===Anti-TTF Mutator===

====About====

This mutator stopped players from being able to tele-frag other players on their team.  Contrary to popular believe, TFing someone on the other team is not the same as TFing someone on your own team is the result of what I can only describe as a bug in the engine that is only account for by killing someone due to tele-fragging.  There are if I remember correctly 3 types of telefragging damage types.  one is used to describe normal telefragging, the other two are special cases the engine uses.  Anyways, this mutator in theory and in practice prevents that from happening.  Instead of dying, the player who would have died will remain untouched as the player who tried to telefrag them will be either respawned at a player start or actually killed.  There is an option to choose either way you prefer for your server.  It has been tested with bots (who are notorious for this) and online.

'''Also, many many many other mutators which are either so common that they need not be released, have been lost due to computer complications, or have been branded with the &quot;I made this and it serves no purpose to me or anyone!&quot; and thus, deleted.'''

==Postponed/Cancelled Projects==

===Icarus===

====About====

I'm working on a custom AI which I am totally codenaming &quot;Icraus&quot;.  It is my attempts at a custom AI coded bottom up from scratch.  Most likely to only be used in Deathmatch situations, Icarus bots will not use the AI systems implemented in UT2004 so NavigationPoints will not be used.  This also means that the bots will not be omnipresent so they won't know the location of all enemy players until they actually see them, they won't know locations of weapons unless they've been that weapon pickup and eventually, they will play, learn and eventually improve themselves and how they play.  It is an attempt to make a more 'real' opponent because I was getting tired of getting one-shot killed (InstaGib) after jumping from the top of a tower in CTF-FaceClassic and other such maps.  When its done, it will be released as open-source with a license of some sort.

====Background====

It was derived from a concept for a sort of total conversion that involved, 3rd person view, restricted movement (i.e. only up,down,left,right and all 45 degree diagonal movements), and some other things A-la Metal Gear Solid.  That plan was recently scrapped however as my interest grew with regards to the AI that I was coding from scratch for the mod.

====Implementation====

The bots will be implemented into the game most likely through a custom gametype.  Because the AI does not extend from the usual AI tree in UT2004, it can't be linked into a normal UT game without excess code.  My plans for implementing may change however.  Another idea was to use a mutator to change the bots that are spawned but even that would take awhile to work out.  Gametypes can be unforgiving when you don't do things the way that it wants you to.

'''And then many many many 'large' scale projects and mutators which either haven't gotten off the ground or were near completion but were stopped for whatever reason.'''

===Daedalus===

Daedalus was a server bot designed to punish people for swearing and team killing.  It also featured some user commands that could be 'said' rather than typed into the console for the command to be executed.  The only real testing for it happened on a server that was part of a Guild I was with a long time ago.  The source and the actual bot itself is lost.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MythOpus/Developer Journal</title>
    <id>4750</id>
    <revision>
      <id>10686</id>
      <timestamp>2008-04-01T17:10:46Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <comment>[[Legacy:MythOpus/Developer Journal]] moved to [[User:DalinSeivewright/Developer Journal]]: Need to keep this</comment>
      <text xml:space="preserve">#REDIRECT [[User:DalinSeivewright/Developer Journal]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MythOpus/MyMappingRant</title>
    <id>2047</id>
    <revision>
      <id>4990</id>
      <timestamp>2003-04-12T15:38:29Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>#REDIRECT [[Map Planning]]</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Map Planning|Map Planning]]</text>
    </revision>
    <revision>
      <id>4991</id>
      <timestamp>2003-04-12T15:19:56Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===MythOpus' Map Planning Rant To Battle Zxan's===

Ok.  Zxan seems to think you absolutely need to have a plan before you start mapping.  I think he's wrong.  (you should to if you know what's good for you ;) )  Anyways...  When I get an idea for a map.  I go straight to my computer, turn it on, open Unreal Ed, crash it, restart computer again, open up Unreal Ed, and then I start putting ALL my ideas, whether they apply to the map or not, from my head, and into the .ut2 file that we call maps.  Then, I save (if I haven't done before hand from fear of UED crashing ;)) and then I start to texture the stuff I have (remember, the most basic of all basic stuff. Meaning, cubes, cylinders, thats all that I make in the map for now.) the way I want it.  Then, once thats done,  I start deleting|taking out the stuff I don't want, or that doesn't feel right.  Then I start getting more advanced with my architecture.  Then I add everything else that I need|want in my map.  That basically sums it all up and the finished product is ussually some sort of kick ass map.  Proving that not EVERYONE should use the ' plan your map idea a piece of paper ' plan.  However, I must confess, if your a BIG NOOB to mapping, I suggest that you might want to start planning for the first few maps you make ;)

'''Tarquin:''' let's merge these two pages to [[Legacy:Map Planning|Map Planning]], mmmkay? Fight it out together, and maybe we'll get a neat tutorial out of it at the end.

'''ZxAnPhOrIaN:''' this sounds logical! '''*not!*''' If you are the 1337est mapper, you still have to plan it out.

{{innerbox|Then, once thats done,  I start deleting|taking out the stuff I don't want, or that doesn't feel right.

}}

When you plan, you can get rid of stuff that you don't like before you waste the time doing that. In my map, CTF-Afterlife, my '''PLANNING''' had lots of scribble marks and i used up about 10 sheets doing that. Also, think that you are an architect, do you start building the house with the ideas in your head, '''''NO!!!''''' The house will fall over and no one will want to buy it. That is what blueprints are for. (I should put this into my rant :muahauauhauauahaua:)

&lt;Zxandone&gt;

'''ZxAnPhOrIaN:''' Also, why do you claim to be a great mapper, and you don't kow that you don't need to use a zone portal for volumes! :P

'''MythOpus:''' Wut the hey man ? lol, I do so know that you don't NEED zone portals for volumes, but before FluidSurfaceInfo didn't work for me so I didnt wanna even try.  I didn't say I was a great mapper did I ? O_o Well, If i did, I'm sorry, the info is incorrect ;)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:MythOpus/Rants</title>
    <id>2049</id>
    <revision>
      <id>4994</id>
      <timestamp>2007-06-02T20:00:35Z</timestamp>
      <contributor>
        <ip>71-17-22-38.regn.hsdb.sasknet.sk.ca</ip>
      </contributor>
      <minor/>
      <comment>added category</comment>
      <text xml:space="preserve">==='''MY''' Rants!===

This page is where my rants will be.  Most likely about my life, campers, cheaters, and the general idiot who always tends to find you when you playing a joyful game :) (CONTENT TO BE ADDED)

==Rant # 1==

I don't know if it's just me, but it seems that lately people in the gaming comunity ( I say '''Gaming''' comunity becasue I haven't noticed behaviour like this offline ;) ) people have become, lazy, imature, ignorant and full of disrespect.  I don't know why this is, nor do I care for the reason.  All I care about is trying to change it.  Here is an example, from the Atari Forum.

{{innerbox| &lt;Person 1&gt;: I am having trouble with my secondary fire mode.  I have tried everthing to make it work but I just can't seem to get it to compile.

 &lt;Person 2&gt;: Person 1, you should consider finding some documentation oon the subject of UScript or get ahole of the source code of whatever game your making the secondary fire for.  If you still can't figure out the problem, post the code that is giving you a hard time.

 &lt;Person 1&gt;: Do you have any f****** Idea who I am?  I have worked for years with the code from Deus Ex!  Do you know how f***** hard it is to work with?  Documentation is so hard to find!

}}

I have lost the actual link to the actal thread so this isn't exactly what was posted.  &quot; Person 1 &quot; first posted the question in a way that said &quot; Hi.  I'm a newbie.  Please help.&quot;  I would have responded in close resemblance to how &quot; Person 2 &quot; replied.  Person 2 was trying to help Person 1 by giving him suggestions on how to solve his problem on his own.  Why would someone blow up on someone who is trying to help like that?

Here is another example:

{{innerbox| &lt;Player 1&gt;: How do you guys shoot so good.  Headshots everywhere!

 &lt;Player 2&gt;: OMG you newbie!  STFU!

}}

An innocent question from a new player followed by a response from an experienced player.  So what if Player 1 is a newbie?  Why do you have to put him down?  Weren't we all newbie's at one time in our lives?  First time playing a game.  First time programming.  Instead of helping out Player 1 out, people just yell, swear and critisize him.  IMO, that's the stupidest thing that you can ever do.  A little known fact: Helping people is a '''GOOD''' thing.  Why not teach him that in counter-strike, you shouldn't &quot; Spray and Pray &quot; as most call it, but you should fire in spurts.  In UT2003, tell them to practice a lot with their favorite weapon.  It's not that hard to go out of your way to help someone.

'''GRAF1K:''' Yo Myth Man. Long time no see. :)

It seems everyone everywhere agrees whith what you're saying. As soon as you join an online game, or look at a non-let's-all-debate-why-everyone's-a-jerk thread though, the reality sets in. Where have all the sensible people gone? Still debating this problem on BuF? :D

Really though, everyone debates this and no one actually looks for a solution. So here's your solution: Live by what you just said, and encourage others to follow. Don't rant about it in forums, tell people ingame. I'm not saying it'll work miracles, but in my experience it calms stuff down.

'''MythOpus:''' I have been looking for a miracle for some time now.  I haven't found it :(  And yes, long time no see!  How is Laser War doing?

'''GRAF1K:''' LaserWar is completely different. :)

I'm using most weapons now instead of modified shock rifle, cause it's not a &quot;conventional&quot; laser tag, more futuristic. Weapons like the Flak I've modified the projectiles of to be mini eletric laser balls, etc. My goal in LaserWar was never to alter gameplay, but to make UT2003 non-violent and fun-and-happy-like. :cheesy:

When depowered I've got that uber-1337 (:rolleyes:) effect-spawning thingy in place (remember, the thing we couldn't figure out but Foxpaw showed us ;)), as well as spawning a large battery that serves as 10+ health and points.

So in other words, coming along nicely. :)

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>4995</id>
      <timestamp>2004-02-21T18:26:01Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>Response</comment>
      <text xml:space="preserve">==='''MY''' Rants!===

This page is where my rants will be.  Most likely about my life, campers, cheaters, and the general idiot who always tends to find you when you playing a joyful game :) (CONTENT TO BE ADDED)

==Rant # 1==

I don't know if it's just me, but it seems that lately people in the gaming comunity ( I say '''Gaming''' comunity becasue I haven't noticed behaviour like this offline ;) ) people have become, lazy, imature, ignorant and full of disrespect.  I don't know why this is, nor do I care for the reason.  All I care about is trying to change it.  Here is an example, from the Atari Forum.

{{innerbox| &lt;Person 1&gt;: I am having trouble with my secondary fire mode.  I have tried everthing to make it work but I just can't seem to get it to compile.

 &lt;Person 2&gt;: Person 1, you should consider finding some documentation oon the subject of UScript or get ahole of the source code of whatever game your making the secondary fire for.  If you still can't figure out the problem, post the code that is giving you a hard time.

 &lt;Person 1&gt;: Do you have any f****** Idea who I am?  I have worked for years with the code from Deus Ex!  Do you know how f***** hard it is to work with?  Documentation is so hard to find!

}}

I have lost the actual link to the actal thread so this isn't exactly what was posted.  &quot; Person 1 &quot; first posted the question in a way that said &quot; Hi.  I'm a newbie.  Please help.&quot;  I would have responded in close resemblance to how &quot; Person 2 &quot; replied.  Person 2 was trying to help Person 1 by giving him suggestions on how to solve his problem on his own.  Why would someone blow up on someone who is trying to help like that?

Here is another example:

{{innerbox| &lt;Player 1&gt;: How do you guys shoot so good.  Headshots everywhere!

 &lt;Player 2&gt;: OMG you newbie!  STFU!

}}

An innocent question from a new player followed by a response from an experienced player.  So what if Player 1 is a newbie?  Why do you have to put him down?  Weren't we all newbie's at one time in our lives?  First time playing a game.  First time programming.  Instead of helping out Player 1 out, people just yell, swear and critisize him.  IMO, that's the stupidest thing that you can ever do.  A little known fact: Helping people is a '''GOOD''' thing.  Why not teach him that in counter-strike, you shouldn't &quot; Spray and Pray &quot; as most call it, but you should fire in spurts.  In UT2003, tell them to practice a lot with their favorite weapon.  It's not that hard to go out of your way to help someone.

'''GRAF1K:''' Yo Myth Man. Long time no see. :)

It seems everyone everywhere agrees whith what you're saying. As soon as you join an online game, or look at a non-let's-all-debate-why-everyone's-a-jerk thread though, the reality sets in. Where have all the sensible people gone? Still debating this problem on BuF? :D

Really though, everyone debates this and no one actually looks for a solution. So here's your solution: Live by what you just said, and encourage others to follow. Don't rant about it in forums, tell people ingame. I'm not saying it'll work miracles, but in my experience it calms stuff down.

'''MythOpus:''' I have been looking for a miracle for some time now.  I haven't found it :(  And yes, long time no see!  How is Laser War doing?

'''GRAF1K:''' LaserWar is completely different. :)

I'm using most weapons now instead of modified shock rifle, cause it's not a &quot;conventional&quot; laser tag, more futuristci. Weapons like the Flak I've modified the projectiles of to be mini eletric laser balls, etc. My goal in LaserWar was never to alter gameplay, but to make UT2003 non-violent and fun-and-happy-like. :cheesy:

When depowered I've got that uber-1337 (:rolleyes:) effect-spawning thingy in place (remember, the thing we couldn't figure out but Foxpaw showed us ;)), as well as spawning a large battery that serves as 10+ health and points.

So in other words, coming along nicely. :)</text>
    </revision>
    <revision>
      <id>4996</id>
      <timestamp>2004-02-21T18:26:36Z</timestamp>
      <contributor>
        <ip>GRAF1K</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==='''MY''' Rants!===

This page is where my rants will be.  Most likely about my life, campers, cheaters, and the general idiot who always tends to find you when you playing a joyful game :) (CONTENT TO BE ADDED)

==Rant # 1==

I don't know if it's just me, but it seems that lately people in the gaming comunity ( I say '''Gaming''' comunity becasue I haven't noticed behaviour like this offline ;) ) people have become, lazy, imature, ignorant and full of disrespect.  I don't know why this is, nor do I care for the reason.  All I care about is trying to change it.  Here is an example, from the Atari Forum.

{{innerbox| &lt;Person 1&gt;: I am having trouble with my secondary fire mode.  I have tried everthing to make it work but I just can't seem to get it to compile.

 &lt;Person 2&gt;: Person 1, you should consider finding some documentation oon the subject of UScript or get ahole of the source code of whatever game your making the secondary fire for.  If you still can't figure out the problem, post the code that is giving you a hard time.

 &lt;Person 1&gt;: Do you have any f****** Idea who I am?  I have worked for years with the code from Deus Ex!  Do you know how f***** hard it is to work with?  Documentation is so hard to find!

}}

I have lost the actual link to the actal thread so this isn't exactly what was posted.  &quot; Person 1 &quot; first posted the question in a way that said &quot; Hi.  I'm a newbie.  Please help.&quot;  I would have responded in close resemblance to how &quot; Person 2 &quot; replied.  Person 2 was trying to help Person 1 by giving him suggestions on how to solve his problem on his own.  Why would someone blow up on someone who is trying to help like that?

Here is another example:

{{innerbox| &lt;Player 1&gt;: How do you guys shoot so good.  Headshots everywhere!

 &lt;Player 2&gt;: OMG you newbie!  STFU!

}}

An innocent question from a new player followed by a response from an experienced player.  So what if Player 1 is a newbie?  Why do you have to put him down?  Weren't we all newbie's at one time in our lives?  First time playing a game.  First time programming.  Instead of helping out Player 1 out, people just yell, swear and critisize him.  IMO, that's the stupidest thing that you can ever do.  A little known fact: Helping people is a '''GOOD''' thing.  Why not teach him that in counter-strike, you shouldn't &quot; Spray and Pray &quot; as most call it, but you should fire in spurts.  In UT2003, tell them to practice a lot with their favorite weapon.  It's not that hard to go out of your way to help someone.

'''GRAF1K:''' Yo Myth Man. Long time no see. :)

It seems everyone everywhere agrees whith what you're saying. As soon as you join an online game, or look at a non-let's-all-debate-why-everyone's-a-jerk thread though, the reality sets in. Where have all the sensible people gone? Still debating this problem on BuF? :D

Really though, everyone debates this and no one actually looks for a solution. So here's your solution: Live by what you just said, and encourage others to follow. Don't rant about it in forums, tell people ingame. I'm not saying it'll work miracles, but in my experience it calms stuff down.

'''MythOpus:''' I have been looking for a miracle for some time now.  I haven't found it :(  And yes, long time no see!  How is Laser War doing?

'''GRAF1K:''' LaserWar is completely different. :)

I'm using most weapons now instead of modified shock rifle, cause it's not a &quot;conventional&quot; laser tag, more futuristic. Weapons like the Flak I've modified the projectiles of to be mini eletric laser balls, etc. My goal in LaserWar was never to alter gameplay, but to make UT2003 non-violent and fun-and-happy-like. :cheesy:

When depowered I've got that uber-1337 (:rolleyes:) effect-spawning thingy in place (remember, the thing we couldn't figure out but Foxpaw showed us ;)), as well as spawning a large battery that serves as 10+ health and points.

So in other words, coming along nicely. :)</text>
    </revision>
    <revision>
      <id>10691</id>
      <timestamp>2008-04-01T17:33:47Z</timestamp>
      <contributor>
        <username>DalinSeivewright</username>
        <id>23</id>
      </contributor>
      <text xml:space="preserve">{{delete}}
==='''MY''' Rants!===

This page is where my rants will be.  Most likely about my life, campers, cheaters, and the general idiot who always tends to find you when you playing a joyful game :) (CONTENT TO BE ADDED)

==Rant # 1==

I don't know if it's just me, but it seems that lately people in the gaming comunity ( I say '''Gaming''' comunity becasue I haven't noticed behaviour like this offline ;) ) people have become, lazy, imature, ignorant and full of disrespect.  I don't know why this is, nor do I care for the reason.  All I care about is trying to change it.  Here is an example, from the Atari Forum.

{{innerbox| &lt;Person 1&gt;: I am having trouble with my secondary fire mode.  I have tried everthing to make it work but I just can't seem to get it to compile.

 &lt;Person 2&gt;: Person 1, you should consider finding some documentation oon the subject of UScript or get ahole of the source code of whatever game your making the secondary fire for.  If you still can't figure out the problem, post the code that is giving you a hard time.

 &lt;Person 1&gt;: Do you have any f****** Idea who I am?  I have worked for years with the code from Deus Ex!  Do you know how f***** hard it is to work with?  Documentation is so hard to find!

}}

I have lost the actual link to the actal thread so this isn't exactly what was posted.  &quot; Person 1 &quot; first posted the question in a way that said &quot; Hi.  I'm a newbie.  Please help.&quot;  I would have responded in close resemblance to how &quot; Person 2 &quot; replied.  Person 2 was trying to help Person 1 by giving him suggestions on how to solve his problem on his own.  Why would someone blow up on someone who is trying to help like that?

Here is another example:

{{innerbox| &lt;Player 1&gt;: How do you guys shoot so good.  Headshots everywhere!

 &lt;Player 2&gt;: OMG you newbie!  STFU!

}}

An innocent question from a new player followed by a response from an experienced player.  So what if Player 1 is a newbie?  Why do you have to put him down?  Weren't we all newbie's at one time in our lives?  First time playing a game.  First time programming.  Instead of helping out Player 1 out, people just yell, swear and critisize him.  IMO, that's the stupidest thing that you can ever do.  A little known fact: Helping people is a '''GOOD''' thing.  Why not teach him that in counter-strike, you shouldn't &quot; Spray and Pray &quot; as most call it, but you should fire in spurts.  In UT2003, tell them to practice a lot with their favorite weapon.  It's not that hard to go out of your way to help someone.

'''GRAF1K:''' Yo Myth Man. Long time no see. :)

It seems everyone everywhere agrees whith what you're saying. As soon as you join an online game, or look at a non-let's-all-debate-why-everyone's-a-jerk thread though, the reality sets in. Where have all the sensible people gone? Still debating this problem on BuF? :D

Really though, everyone debates this and no one actually looks for a solution. So here's your solution: Live by what you just said, and encourage others to follow. Don't rant about it in forums, tell people ingame. I'm not saying it'll work miracles, but in my experience it calms stuff down.

'''MythOpus:''' I have been looking for a miracle for some time now.  I haven't found it :(  And yes, long time no see!  How is Laser War doing?

'''GRAF1K:''' LaserWar is completely different. :)

I'm using most weapons now instead of modified shock rifle, cause it's not a &quot;conventional&quot; laser tag, more futuristic. Weapons like the Flak I've modified the projectiles of to be mini eletric laser balls, etc. My goal in LaserWar was never to alter gameplay, but to make UT2003 non-violent and fun-and-happy-like. :cheesy:

When depowered I've got that uber-1337 (:rolleyes:) effect-spawning thingy in place (remember, the thing we couldn't figure out but Foxpaw showed us ;)), as well as spawning a large battery that serves as 10+ health and points.

So in other words, coming along nicely. :)

[[Category:Legacy Rant|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NPC Support</title>
    <id>2306</id>
    <revision>
      <id>5564</id>
      <timestamp>2008-03-19T02:19:27Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is a hub for support of '''Non-Player Characters (NPCs)''': any artificially intelligent agent or character that is &lt;u&gt;not&lt;/u&gt; meant to act as a player.  NPCs can be ambient creatures, various animals, character &quot;extras&quot;, neutral individuals, helpful characters, etc.  NPCs use a custom AI construct that will serve their unique goals and tasks, whether that be self-preservation, conversation, navigation, etc.

Monsters can be easily considered a specific variety of NPC whose sole purpose is to hunt down and attack players.  See [[Legacy:Monster Support|Monster Support]].  This page, however, will focus on custom non-monster NPCs.

The NPC is created to support the game world, to enrich it and either give the player a stronger sense of realism within it or to support the player in their game objectives.  For this reason, each NPC class is a product of the game world it lives in; a unique entity whose purpose is directly tied to that world.  

==Design==

===Purpose===

The NPC must have a reason to exist in the game.  They may provide the players with information, inventory or immersion in the game.  The purpose is normally dictated by the [[Legacy:Gameplay|gameplay]] itself; the goals of the game, the theme, the rules, etc.  Keep in mind those elements and concepts of gameplay, such as Balance and Chance, as you design the NPC.

====Immersion====

This purpose is simply to support the believability of the game world by existing within it.  The NPC &quot;lives&quot; in this world and therefore adds to the illusion that this game world is a real one that the player live in as well.  Ambient creatures and other animals can serve this purpose well as they will follow their own rules within this world and largely ignore the goals of the player, but still give the player plenty of opportunity for interaction.  But, another common example is citizen NPCs that live out their own lives, but do not interact with the players in a way that impact their gameplay.

====Information====

Here the NPC's reason to exist is loosely tied to the goals of the player.  Through some combonation of conditions, the player may recieve information from this NPC that will impact their gameplay.  Some common examples of this are the &quot;guide&quot; characters that provide the novice player with the most basic instructions for this particular game (where to buy food or weapons in town, who can heal you, how to save your progress), or the character who will give you critical information to allow progress in the game (after paying them a bribe, they tell you where to find the entrance to the dungeon).  

====Inventory====

This purpose is directly tied to the player's gameplay, where the NPC is to give the player a key piece of inventory, which gives them extra ability.  A very common example of this might be the storekeeper who sells you weapons for a price.  Another example could be the &quot;sage&quot; character, who can give you a special item that can protect you during the next stage of the game or a key that unlocks the next series of tasks to perform.

===Behavior===

The NPC behavior will be designed to serve it's unique purpose.  Their behavior may be simple, as in the actions of a song bird, or complex, as in a mentor who directs the player's progress from beginner through mastery.  Designing the behavior for your NPC can be difficult, as all possible conditions and posibilities should be considered and factored into the design.  Common ways to keep it simple include limiting the behavior to it's essential purpose and limiting the conditions the NPC will have to face.  For example, a barkeep who tells local gossip for a price might be a great NPC to give your players information about their game world, but designing a behavior that would be able to believably answer any question the player might ask is virutally impossible.  The barkeep's behavior can be limited to just talking about the most probable questions it will be asked.  The conditions that the barkeep will engage in conversation can be limited as well by telling the player, &quot;I'm busy right now, come back later.&quot;, or, &quot;Hey, I'm just a simple barkeep, I don't know everything.&quot;

====Self-Preservation====

The most basic NPC behavior to consider is self-preservation.  Animals, characters, and just about every other living thing is capable of this behavior.  A defense mechanism such as stealth, evasion, or protection should be considered first.  Is this the type of creature to run if startled or will it roll up into a ball and show spikes on it's back for defense?  Offensive behavior is common, most creatures have some means of attacking in self-defense, even herbavores.  Does this character throw a punch if backed into a corner?

====Navigation====

The Unreal engine already has a well-designed method of allowing AI agents to navigate: the bot path network. (See also [[Legacy:Bot Pathing|Bot Pathing]])  However, because the bot path network is designed for bot players, many NPCs will have a purpose that dictates they use another way to navigate; away from the combat or one that allows movement to any space, not just spaces defined by the mapper.  While it is possible to design a new method of intelligent navigation; one that doesn't use the bot path network, it will most likely be much more work than the rest of the behavior.  It's recommended that navigation behavior be simplified, using any existing methods (such as the bot path network or some simple variation) as much as possible.

====Conversation====

As mentioned above, this can be an incredibly complex behavior to design, if all possible situations and conditions are accounted for.  The design should be complex enough to carry the illusion of intelligent speech with the NPC, but simple enough that the designer isn't wasting effort on situations or conditions that are rarely met or will not yield a relevant result.  For example, you'll want a damsel in distress to yell, &quot;Help!&quot;, at the appropriate time, as the train approaches, and to say, &quot;My hero!&quot;, once saved by the player, but you'd want to avoid designing her behavior to account for her her response to an obscure question like, &quot;What kind of music do you like?&quot;.  Again, by limiting the NPC's behavior and at the same time limiting the conditions the NPC will have to face, you avoid having to design too much.  Once the damsel is saved, she may insist that she run home, which conveniently avoids any further conversation.

====Special Behavior====

This is a unique task this NPC performs.  It will most likely be tied directly to the story of the game and the main purpose for this NPC to exist.  Perhaps this NPC character is the catburglar that the player is supposed to track down, so their unique behavior is to sneak around at night, steal stuff and leave clues.  Maybe this NPC critter is a pack rat that steals a key item from the player at a critical point in the game.  The special behavior is less likely to be as simplified as the other major (more common) behaviors, and that's to be expected.  The designer may spend the most time developing this behavior.

===Appearance===

This is the visual design of the NPC.  It should be in line with the overall visual design of the game, the player characters and the other NPCs.  It's best to have the tone of the visual design suggest the NPCs purpose and behavior.  For example, a simple forest creature's visual design might be basic, with no extra-ordinary consideration, while a unique NPC, critical to the advancement of the game, such as the hostage character the player is to escort through enemy territory, should appear obviously unarmed or hurt, have distinctive facial features or clothing and should generally stand out from the look of other NPCs, player characters and enemies.

===Movement and Sound===

The movement and sound design is the acting of the NPC.  Will it act like a real animal?  Does this NPC character call attention to himself by having an odd voice or moving in a unique way or do they blend into the crowd?  Is this NPC subtle, like the bluffing gambler in the saloon, or over the top, like the cartoonish side-kick robot that gives you game hints when the player is stuck.  The movement and sound design will be closely tied it's visual design and should likewise suggest both the NPC's purpose and behavior.

===Effects, Props and Vehicles===

It is possible for an NPC to have unique effects, props or vehicles in addition to their base design.  These are extra pieces to the design, parts that are separate from the NPC itself.  By in large, these elements will be spawned or emitted from the NPC (effect), attached to the NPC (prop) or the NPC will be attached to the object (vehicle).  Any abilities that the NPC gains by these items would be dependent on their availablity.  A gunslinger might have a black hat that falls off once the player has killed him.  An ogre may carry an oversized club that he lays down when he sleeps.  A gnome may ride a cat or bird.  A Egyptian god may drive a charriot made of gold mist.  While it's concievable that a player may also use these props or vehicles, by making them unique to the NPC (either too small, too large or otherwise unavailble to the player), the designer can avoid the extra work of creating new player items that may also throw off the game balance.

==Construction==

Once a design is formulated, it's time to begin to bring it to life.  The physical appearance is achieved through modeling, the acting is achieved through animation and the behavior and special actions are achieved through coding.

===Modeling===

Modeling is the process of creating a [[Legacy:Mesh|Mesh]] or [[Legacy:Skeletal Mesh|Skeletal Mesh]] for a character design.  This will be the visual representation of that character and the basis for its animations.  The model is made up of several triangle polygons (or Faces) that are oriented in 3D space to make up the whole shape of the character.  That polygon Mesh also contains the information necessary to properly display one or more Skins (or materials, textures) over the surface of the character model, which is typically called UV mapping.

There are several Third-Party Applications that can handle creation of the polygon model and it's UV mapping, including [[Legacy:Maya|Maya]]PLE, a free Personal Learning Edition of a professional 3D modeling and animation program, which is included with Unreal Tournament 2003 and beyond.

See also [[Legacy:Player Modeling|Player Modeling]] and [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]].

===Rigging===

Rigging is the process of setting up the polygonal model for animation.  Depending on the animation requirements of the character's design, each model will have unique rigging requirements with varying levels of complexity.  Generally, a character model will be rigged using a Skeleton deformer (sometimes called, Joints, Bones, etc.) to deform the polygon mesh as if it had an internal skeletal structure with hinged connections.  A Skeletal deformer allows basic character model manipulation, such as bending of arms and legs, as well as complex manipulation, such as a tail or spine.  The individual joints (or bones) of the Skeleton deformer can be connected to create an overal skeletal hierachy, with each appendage (and sub-appendages) recieving inherited movement from it's parent joint.

Rigging models can also use other deformer tools such as Shape deformers, Spline deformers, Lattice deformers, etc., depending on the tools available in the Third-Party Application used.  The common element in all these deformer tools is that they will move the individual points that make up the connecting polygonal faces, thereby changing the shape of the overall model.

===Animating===

Animating is the process of manipulating the rigging of the character model within a timeline to create a series of sequences that represent various actions the character can make.  Typically, the character rigging (skeletal hierarchy or the like) will be positioned and &quot;keyed&quot; at various points in the timeline, just like the keys of a [[Legacy:Mover|Mover]].  As the animator moves (or &quot;scrubs&quot;) along the timeline, the keyed animation will be played back and the model's rigging will animate the character.

Although the basic premise is the same, depending on the Third-Party Application used, the process of keying positions and saving animated sequences will differ slightly.  The main idea is to make sure that the character model moves appropriately in terms of timing, attitude and acting for each animation sequence.  Once animation is completed, these series of sequences, that represent each possible action the character can make, will be exported from the Third-Party Application to the Unreal Editor's [[Legacy:Animation Browser|Animation Browser]].

See also [[Legacy:Animation|Animation]].

===Coding===

Based on the design of the character's behavior and the character's abilities, the coding will entail a unique degree of complexity, in order to believably represent the chatacter's Artificial Intelligence as well as it's movements, combat abilities, special effects, etc.  Once the character animations are available to the Unreal Editor, various Object classes can be created to use those sequences to display the character's existance and behavior.  Typically, simple characters can use one class, a [[Legacy:Pawn|Pawn]] subclass, to represent that character.  The Pawn classes are specifically designed to represent characters in the Unreal gamespace, handling Movement, Damage, Dying and other typical character functions as well as the inherited Animation, Physics and Sound functions from [[Legacy:Actor|Actor]].  More complex characters (like Player Characters) will require extra Object classes to complete their behavior and potential actions, such as [[Legacy:Controller|Controller]]s, [[Legacy:Weapon|Weapon]]s, [[Legacy:InventoryAttachment|InventoryAttachment]]s, etc.

====Controllers====

UT2003 introduced the use of Controllers in collaboration with Pawns to represent all characters, including AI controlled entities, whereas UT used [[Legacy:ScriptedPawn|ScriptedPawn]]s alone (or in conjunction with a [[Legacy:ScriptedSequence|ScriptedSequence]] for special control of individual characters per map).  Controller classes are used to dictate the actions of a Pawn and handle it's non-physical elements.  While the Pawn is the visual and physical representation of a character, the Controller is the &quot;mind&quot; or &quot;soul&quot; of the character; both the decision making element and the entity that persists if that character Pawn is killed and respawned.

See also [[Legacy:Controller Overview|Controller Overview]].

==Testing and Integration==

Once your NPC is available, begin to itegrate it into the game world and among the other players and NPCs.  Test it thoroughly to ensure it will serve it's purpose adequately, behave properly under all possible considitions and situations it might face, and will appear, move and sound appropriate to it's purpose and behavior.

==Tutorials==
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] &amp;ndash; A tutorial covering modeling, rigging, animation and import of skeletal mesh characters.
* [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)creation of the NaliCow NPC for UT2004.

==Examples==
* [[Legacy:Nali|Nali]] and [[Legacy:Cow|Cow]] &amp;ndash; Stock non-Monster NPCs for UT
* [[Legacy:TankVictim|TankVictim]] &amp;ndash; A stock NPC for UT200x found in DM-Insidious
* The [http://wiki.beyondunreal.com/wiki/SuperApe#0.2.4 ROOs] &amp;ndash; Kangaroo Non-Player Characters for UT2004 mappers.  And the [http://unrealplayground.com/forums/showthread.php?t=36679 ROOtator] : A mutator designed to populate any map with ROOs; also includes the Australian RooLette and RooHunt minigames.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]] &amp;ndash; Concepts and elements of satisfying game design.
* [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; The parent UT class for NPCs
* [[Legacy:XIntroPawn|xIntroPawn]] &amp;ndash; UT200x NPC Pawns used to act in intro scenes, cut scenes, etc.
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, etc.)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for monster support
*** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; Exploration of a custom monster AI construct.

===Custom Content===
* [[Legacy:SuperApe/Old_Skool_Monsta_Toolz|Old Skool Monsta Toolz]] &amp;ndash; A mod/mapping toolset for implementing complex monster/NPC behavior in UT2004.

==Discussion==

'''SuperApe:''' This page is in progress.  It will contain information on creating custom NPCs in the unreal engine. (critters, neutral individuals, helpful NPCs, etc.)  &lt;u&gt;The idea will be to give general concepts (not a tutorial) and to link to any relevant pages.&lt;/u&gt;  Working...

'''SuperApe:''' The structure of this page is complete.  Please give your thoughts here.</text>
    </revision>
    <revision>
      <id>5565</id>
      <timestamp>2005-12-19T18:53:26Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is a hub for support of '''Non-Player Characters (NPCs)''': any artificially intelligent agent or character that is &lt;u&gt;not&lt;/u&gt; meant to act as a player.  NPCs can be ambient creatures, various animals, character &quot;extras&quot;, neutral individuals, helpful characters, etc.  NPCs use a custom AI construct that will serve their unique goals and tasks, whether that be self-preservation, conversation, navigation, etc.

Monsters can be easily considered a specific variety of NPC whose sole purpose is to hunt down and attack players.  See [[Legacy:Monster Support|Monster Support]].  This page, however, will focus on custom non-monster NPCs.

The NPC is created to support the game world, to enrich it and either give the player a stronger sense of realism within it or to support the player in their game objectives.  For this reason, each NPC class is a product of the game world it lives in; a unique entity whose purpose is directly tied to that world.  

==Design==

===Purpose===

The NPC must have a reason to exist in the game.  They may provide the players with information, inventory or immersion in the game.  The purpose is normally dictated by the [[Legacy:Gameplay|gameplay]] itself; the goals of the game, the theme, the rules, etc.  Keep in mind those elements and concepts of gameplay, such as Balance and Chance, as you design the NPC.

====Immersion====

This purpose is simply to support the believability of the game world by existing within it.  The NPC &quot;lives&quot; in this world and therefore adds to the illusion that this game world is a real one that the player live in as well.  Ambient creatures and other animals can serve this purpose well as they will follow their own rules within this world and largely ignore the goals of the player, but still give the player plenty of opportunity for interaction.  But, another common example is citizen NPCs that live out their own lives, but do not interact with the players in a way that impact their gameplay.

====Information====

Here the NPC's reason to exist is loosely tied to the goals of the player.  Through some combonation of conditions, the player may recieve information from this NPC that will impact their gameplay.  Some common examples of this are the &quot;guide&quot; characters that provide the novice player with the most basic instructions for this particular game (where to buy food or weapons in town, who can heal you, how to save your progress), or the character who will give you critical information to allow progress in the game (after paying them a bribe, they tell you where to find the entrance to the dungeon).  

====Inventory====

This purpose is directly tied to the player's gameplay, where the NPCs is to give the player a key piece of inventory, which gives them extra ability.  A very common example of this might be the storekeeper who sells you weapons for a price.  Another example could be the &quot;sage&quot; character, who can give you a special item that can protect you during the next stage of the game or a key that unlocks the next series of tasks to perform.

===Behavior===

The NPC behavior will be designed to serve it's unique purpose.  Their behavior may be simple, as in the actions of a song bird, or complex, as in a mentor who directs the player's progress from beginner through mastery.  Designing the behavior for your NPC can be difficult, as all possible conditions and posibilities should be considered and factored into the design.  Common ways to keep it simple include limiting the behavior to it's essential purpose and limiting the conditions the NPC will have to face.  For example, a barkeep who tells local gossip for a price might be a great NPC to give your players information about their game world, but designing a behavior that would be able to believably answer any question the player might ask is virutally impossible.  The barkeep's behavior can be limited to just talking about the most probable questions it will be asked.  The conditions that the barkeep will engage in conversation can be limited as well by telling the player, &quot;I'm busy right now, come back later.&quot;, or, &quot;Hey, I'm just a simple barkeep, I don't know everything.&quot;

====Self-Preservation====

The most basic NPC behavior to consider is self-preservation.  Animals, characters, and just about every other living thing is capable of this behavior.  A defense mechanism such as stealth, evasion, or protection should be considered first.  Is this the type of creature to run if startled or will it roll up into a ball and show spikes on it's back for defense?  Offensive behavior is common, most creatures have some means of attacking in self-defense, even herbavores.  Does this character throw a punch if backed into a corner?

====Navigation====

The Unreal engine already has a well-designed method of allowing AI agents to navigate: the bot path network. (See also [[Legacy:Bot Pathing|Bot Pathing]])  However, because the bot path network is designed for bot players, many NPCs will have a purpose that dictates they use another way to navigate; away from the combat or one that allows movement to any space, not just spaces defined by the mapper.  While it is possible to design a new method of intelligent navigation; one that doesn't use the bot path network, it will most likely be much more work than the rest of the behavior.  It's recommended that navigation behavior be simplified, using any existing methods (such as the bot path network or some simple variation) as much as possible.

====Conversation====

As mentioned above, this can be an incredibly complex behavior to design, if all possible situations and conditions are accounted for.  The design should be complex enough to carry the illusion of intelligent speech with the NPC, but simple enough that the designer isn't wasting effort on situations or conditions that are rarely met or will not yield a relevant result.  For example, you'll want a damsel in distress to yell, &quot;Help!&quot;, at the appropriate time, as the train approaches, and to say, &quot;My hero!&quot;, once saved by the player, but you'd want to avoid designing her behavior to account for her her response to an obscure question like, &quot;What kind of music do you like?&quot;.  Again, by limiting the NPC's behavior and at the same time limiting the conditions the NPC will have to face, you avoid having to design too much.  Once the damsel is saved, she may insist that she run home, which conveniently avoids any further conversation.

====Special Behavior====

This is a unique task this NPC performs.  It will most likely be tied directly to the story of the game and the main purpose for this NPC to exist.  Perhaps this NPC character is the catburglar that the player is supposed to track down, so their unique behavior is to sneak around at night, steal stuff and leave clues.  Maybe this NPC critter is a pack rat that steals a key item from the player at a critical point in the game.  The special behavior is less likely to be as simplified as the other major (more common) behaviors, and that's to be expected.  The designer may spend the most time developing this behavior.

===Appearance===

This is the visual design of the NPC.  It should be in line with the overall visual design of the game, the player characters and the other NPCs.  It's best to have the tone of the visual design suggest the NPCs purpose and behavior.  For example, a simple forest creature's visual design might be basic, with no extra-ordinary consideration, while a unique NPC, critical to the advancement of the game, such as the hostage character the player is to escort through enemy territory, should appear obviously unarmed or hurt, have distinctive facial features or clothing and should generally stand out from the look of other NPCs, player characters and enemies.

===Movement and Sound===

The movement and sound design is the acting of the NPC.  Will it act like a real animal?  Does this NPC character call attention to himself by having an odd voice or moving in a unique way or do they blend into the crowd?  Is this NPC subtle, like the bluffing gambler in the saloon, or over the top, like the cartoonish side-kick robot that gives you game hints when the player is stuck.  The movement and sound design will be closely tied it's visual design and should likewise suggest both the NPC's purpose and behavior.

===Effects, Props and Vehicles===

It is possible for an NPC to have unique effects, props or vehicles in addition to their base design.  These are extra pieces to the design, parts that are separate from the NPC itself.  By in large, these elements will be spawned or emitted from the NPC (effect), attached to the NPC (prop) or the NPC will be attached to the object (vehicle).  Any abilities that the NPC gains by these items would be dependent on their availablity.  A gunslinger might have a black hat that falls off once the player has killed him.  An ogre may carry an oversized club that he lays down when he sleeps.  A gnome may ride a cat or bird.  A Egyptian god may drive a charriot made of gold mist.  While it's concievable that a player may also use these props or vehicles, by making them unique to the NPC (either too small, too large or otherwise unavailble to the player), the designer can avoid the extra work of creating new player items that may also throw off the game balance.

==Construction==

Once a design is formulated, it's time to begin to bring it to life.  The physical appearance is achieved through modeling, the acting is achieved through animation and the behavior and special actions are achieved through coding.

===Modeling===

Modeling is the process of creating a [[Legacy:Mesh|Mesh]] or [[Legacy:Skeletal Mesh|Skeletal Mesh]] for a character design.  This will be the visual representation of that character and the basis for its animations.  The model is made up of several triangle polygons (or Faces) that are oriented in 3D space to make up the whole shape of the character.  That polygon Mesh also contains the information necessary to properly display one or more Skins (or materials, textures) over the surface of the character model, which is typically called UV mapping.

There are several Third-Party Applications that can handle creation of the polygon model and it's UV mapping, including [[Legacy:Maya PLE|Maya PLE]], a free Personal Learning Edition of a professional 3D modeling and animation program, which is included with Unreal Tournament 2003 and beyond.

See also [[Legacy:Player Modeling|Player Modeling]] and [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]].

===Rigging===

Rigging is the process of setting up the polygonal model for animation.  Depending on the animation requirements of the character's design, each model will have unique rigging requirements with varying levels of complexity.  Generally, a character model will be rigged using a Skeleton deformer (sometimes called, Joints, Bones, etc.) to deform the polygon mesh as if it had an internal skeletal structure with hinged connections.  A Skeletal deformer allows basic character model manipulation, such as bending of arms and legs, as well as complex manipulation, such as a tail or spine.  The individual joints (or bones) of the Skeleton deformer can be connected to create an overal skeletal hierachy, with each appendage (and sub-appendages) recieving inherited movement from it's parent joint.

Rigging models can also use other deformer tools such as Shape deformers, Spline deformers, Lattice deformers, etc., depending on the tools available in the Third-Party Application used.  The common element in all these deformer tools is that they will move the individual points that make up the connecting polygonal faces, thereby changing the shape of the overall model.

===Animating===

Animating is the process of manipulating the rigging of the character model within a timeline to create a series of sequences that represent various actions the character can make.  Typically, the character rigging (skeletal hierarchy or the like) will be positioned and &quot;keyed&quot; at various points in the timeline, just like the keys of a [[Legacy:Mover|Mover]].  As the animator moves (or &quot;scrubs&quot;) along the timeline, the keyed animation will be played back and the model's rigging will animate the character.

Although the basic premise is the same, depending on the Third-Party Application used, the process of keying positions and saving animated sequences will differ slightly.  The main idea is to make sure that the character model moves appropriately in terms of timing, attitude and acting for each animation sequence.  Once animation is completed, these series of sequences, that represent each possible action the character can make, will be exported from the Third-Party Application to the Unreal Editor's [[Legacy:Animation Browser|Animation Browser]].

See also [[Legacy:Animation|Animation]].

===Coding===

Based on the design of the character's behavior and the character's abilities, the coding will entail a unique degree of complexity, in order to believably represent the chatacter's Artificial Intelligence as well as it's movements, combat abilities, special effects, etc.  Once the character animations are available to the Unreal Editor, various Object classes can be created to use those sequences to display the character's existance and behavior.  Typically, simple characters can use one class, a [[Legacy:Pawn|Pawn]] subclass, to represent that character.  The Pawn classes are specifically designed to represent characters in the Unreal gamespace, handling Movement, Damage, Dying and other typical character functions as well as the inherited Animation, Physics and Sound functions from [[Legacy:Actor|Actor]].  More complex characters (like Player Characters) will require extra Object classes to complete their behavior and potential actions, such as [[Legacy:Controller|Controller]]s, [[Legacy:Weapon|Weapon]]s, [[Legacy:InventoryAttachment|InventoryAttachment]]s, etc.

====Controllers====

UT2003 introduced the use of Controllers in collaboration with Pawns to represent all characters, including AI controlled entities, whereas UT used [[Legacy:ScriptedPawn|ScriptedPawn]]s alone (or in conjunction with a [[Legacy:ScriptedSequence|ScriptedSequence]] for special control of individual characters per map).  Controller classes are used to dictate the actions of a Pawn and handle it's non-physical elements.  While the Pawn is the visual and physical representation of a character, the Controller is the &quot;mind&quot; or &quot;soul&quot; of the character; both the decision making element and the entity that persists if that character Pawn is killed and respawned.

See also [[Legacy:Controller Overview|Controller Overview]].

==Testing and Integration==

Once your NPC is available, begin to itegrate it into the game world and among the other players and NPCs.  Test it thoroughly to ensure it will serve it's purpose adequately, behave properly under all possible considitions and situations it might face, and will appear, move and sound appropriate to it's purpose and behavior.

==Tutorials==
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] &amp;ndash; A tutorial covering modeling, rigging, animation and import of skeletal mesh characters.
* [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)creation of the NaliCow NPC for UT2004.

==Examples==
* [[Legacy:Nali|Nali]] and [[Legacy:Cow|Cow]] &amp;ndash; Stock non-Monster NPCs for UT
* [[Legacy:TankVictim|TankVictim]] &amp;ndash; A stock NPC for UT200x found in DM-Insidious
* The [http://wiki.beyondunreal.com/wiki/SuperApe#0.2.4 ROOs] &amp;ndash; Kangaroo Non-Player Characters for UT2004 mappers.  And the [http://forums.unrealplayground.com/showthread.php?t=36679 ROOtator] : A mutator designed to populate any map with ROOs; also includes the Australian RooLette and RooHunt minigames.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]] &amp;ndash; Concepts and elements of satisfying game design.
* [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; The parent UT class for NPCs
* [[Legacy:XIntroPawn|xIntroPawn]] &amp;ndash; UT200x NPC Pawns used to act in intro scenes, cut scenes, etc.
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, etc.)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for monster support
*** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; Exploration of a custom monster AI construct.

==Discussion==

'''SuperApe:''' This page is in progress.  It will contain information on creating custom NPCs in the unreal engine. (critters, neutral individuals, helpful NPCs, etc.)  &lt;u&gt;The idea will be to give general concepts (not a tutorial) and to link to any relevant pages.&lt;/u&gt;  Working...</text>
    </revision>
    <revision>
      <id>5566</id>
      <timestamp>2007-06-19T15:06:19Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">This page is a hub for support of '''Non-Player Characters (NPCs)''': any artificially intelligent agent or character that is &lt;u&gt;not&lt;/u&gt; meant to act as a player.  NPCs can be ambient creatures, various animals, character &quot;extras&quot;, neutral individuals, helpful characters, etc.  NPCs use a custom AI construct that will serve their unique goals and tasks, whether that be self-preservation, conversation, navigation, etc.

Monsters can be easily considered a specific variety of NPC whose sole purpose is to hunt down and attack players.  See [[Legacy:Monster Support|Monster Support]].  This page, however, will focus on custom non-monster NPCs.

The NPC is created to support the game world, to enrich it and either give the player a stronger sense of realism within it or to support the player in their game objectives.  For this reason, each NPC class is a product of the game world it lives in; a unique entity whose purpose is directly tied to that world.  

==Design==

===Purpose===

The NPC must have a reason to exist in the game.  They may provide the players with information, inventory or immersion in the game.  The purpose is normally dictated by the [[Legacy:Gameplay|gameplay]] itself; the goals of the game, the theme, the rules, etc.  Keep in mind those elements and concepts of gameplay, such as Balance and Chance, as you design the NPC.

====Immersion====

This purpose is simply to support the believability of the game world by existing within it.  The NPC &quot;lives&quot; in this world and therefore adds to the illusion that this game world is a real one that the player live in as well.  Ambient creatures and other animals can serve this purpose well as they will follow their own rules within this world and largely ignore the goals of the player, but still give the player plenty of opportunity for interaction.  But, another common example is citizen NPCs that live out their own lives, but do not interact with the players in a way that impact their gameplay.

====Information====

Here the NPC's reason to exist is loosely tied to the goals of the player.  Through some combonation of conditions, the player may recieve information from this NPC that will impact their gameplay.  Some common examples of this are the &quot;guide&quot; characters that provide the novice player with the most basic instructions for this particular game (where to buy food or weapons in town, who can heal you, how to save your progress), or the character who will give you critical information to allow progress in the game (after paying them a bribe, they tell you where to find the entrance to the dungeon).  

====Inventory====

This purpose is directly tied to the player's gameplay, where the NPC is to give the player a key piece of inventory, which gives them extra ability.  A very common example of this might be the storekeeper who sells you weapons for a price.  Another example could be the &quot;sage&quot; character, who can give you a special item that can protect you during the next stage of the game or a key that unlocks the next series of tasks to perform.

===Behavior===

The NPC behavior will be designed to serve it's unique purpose.  Their behavior may be simple, as in the actions of a song bird, or complex, as in a mentor who directs the player's progress from beginner through mastery.  Designing the behavior for your NPC can be difficult, as all possible conditions and posibilities should be considered and factored into the design.  Common ways to keep it simple include limiting the behavior to it's essential purpose and limiting the conditions the NPC will have to face.  For example, a barkeep who tells local gossip for a price might be a great NPC to give your players information about their game world, but designing a behavior that would be able to believably answer any question the player might ask is virutally impossible.  The barkeep's behavior can be limited to just talking about the most probable questions it will be asked.  The conditions that the barkeep will engage in conversation can be limited as well by telling the player, &quot;I'm busy right now, come back later.&quot;, or, &quot;Hey, I'm just a simple barkeep, I don't know everything.&quot;

====Self-Preservation====

The most basic NPC behavior to consider is self-preservation.  Animals, characters, and just about every other living thing is capable of this behavior.  A defense mechanism such as stealth, evasion, or protection should be considered first.  Is this the type of creature to run if startled or will it roll up into a ball and show spikes on it's back for defense?  Offensive behavior is common, most creatures have some means of attacking in self-defense, even herbavores.  Does this character throw a punch if backed into a corner?

====Navigation====

The Unreal engine already has a well-designed method of allowing AI agents to navigate: the bot path network. (See also [[Legacy:Bot Pathing|Bot Pathing]])  However, because the bot path network is designed for bot players, many NPCs will have a purpose that dictates they use another way to navigate; away from the combat or one that allows movement to any space, not just spaces defined by the mapper.  While it is possible to design a new method of intelligent navigation; one that doesn't use the bot path network, it will most likely be much more work than the rest of the behavior.  It's recommended that navigation behavior be simplified, using any existing methods (such as the bot path network or some simple variation) as much as possible.

====Conversation====

As mentioned above, this can be an incredibly complex behavior to design, if all possible situations and conditions are accounted for.  The design should be complex enough to carry the illusion of intelligent speech with the NPC, but simple enough that the designer isn't wasting effort on situations or conditions that are rarely met or will not yield a relevant result.  For example, you'll want a damsel in distress to yell, &quot;Help!&quot;, at the appropriate time, as the train approaches, and to say, &quot;My hero!&quot;, once saved by the player, but you'd want to avoid designing her behavior to account for her her response to an obscure question like, &quot;What kind of music do you like?&quot;.  Again, by limiting the NPC's behavior and at the same time limiting the conditions the NPC will have to face, you avoid having to design too much.  Once the damsel is saved, she may insist that she run home, which conveniently avoids any further conversation.

====Special Behavior====

This is a unique task this NPC performs.  It will most likely be tied directly to the story of the game and the main purpose for this NPC to exist.  Perhaps this NPC character is the catburglar that the player is supposed to track down, so their unique behavior is to sneak around at night, steal stuff and leave clues.  Maybe this NPC critter is a pack rat that steals a key item from the player at a critical point in the game.  The special behavior is less likely to be as simplified as the other major (more common) behaviors, and that's to be expected.  The designer may spend the most time developing this behavior.

===Appearance===

This is the visual design of the NPC.  It should be in line with the overall visual design of the game, the player characters and the other NPCs.  It's best to have the tone of the visual design suggest the NPCs purpose and behavior.  For example, a simple forest creature's visual design might be basic, with no extra-ordinary consideration, while a unique NPC, critical to the advancement of the game, such as the hostage character the player is to escort through enemy territory, should appear obviously unarmed or hurt, have distinctive facial features or clothing and should generally stand out from the look of other NPCs, player characters and enemies.

===Movement and Sound===

The movement and sound design is the acting of the NPC.  Will it act like a real animal?  Does this NPC character call attention to himself by having an odd voice or moving in a unique way or do they blend into the crowd?  Is this NPC subtle, like the bluffing gambler in the saloon, or over the top, like the cartoonish side-kick robot that gives you game hints when the player is stuck.  The movement and sound design will be closely tied it's visual design and should likewise suggest both the NPC's purpose and behavior.

===Effects, Props and Vehicles===

It is possible for an NPC to have unique effects, props or vehicles in addition to their base design.  These are extra pieces to the design, parts that are separate from the NPC itself.  By in large, these elements will be spawned or emitted from the NPC (effect), attached to the NPC (prop) or the NPC will be attached to the object (vehicle).  Any abilities that the NPC gains by these items would be dependent on their availablity.  A gunslinger might have a black hat that falls off once the player has killed him.  An ogre may carry an oversized club that he lays down when he sleeps.  A gnome may ride a cat or bird.  A Egyptian god may drive a charriot made of gold mist.  While it's concievable that a player may also use these props or vehicles, by making them unique to the NPC (either too small, too large or otherwise unavailble to the player), the designer can avoid the extra work of creating new player items that may also throw off the game balance.

==Construction==

Once a design is formulated, it's time to begin to bring it to life.  The physical appearance is achieved through modeling, the acting is achieved through animation and the behavior and special actions are achieved through coding.

===Modeling===

Modeling is the process of creating a [[Legacy:Mesh|Mesh]] or [[Legacy:Skeletal Mesh|Skeletal Mesh]] for a character design.  This will be the visual representation of that character and the basis for its animations.  The model is made up of several triangle polygons (or Faces) that are oriented in 3D space to make up the whole shape of the character.  That polygon Mesh also contains the information necessary to properly display one or more Skins (or materials, textures) over the surface of the character model, which is typically called UV mapping.

There are several Third-Party Applications that can handle creation of the polygon model and it's UV mapping, including [[Legacy:Maya|Maya]]PLE, a free Personal Learning Edition of a professional 3D modeling and animation program, which is included with Unreal Tournament 2003 and beyond.

See also [[Legacy:Player Modeling|Player Modeling]] and [[Legacy:Unreal Modeling FAQ|Unreal Modeling FAQ]].

===Rigging===

Rigging is the process of setting up the polygonal model for animation.  Depending on the animation requirements of the character's design, each model will have unique rigging requirements with varying levels of complexity.  Generally, a character model will be rigged using a Skeleton deformer (sometimes called, Joints, Bones, etc.) to deform the polygon mesh as if it had an internal skeletal structure with hinged connections.  A Skeletal deformer allows basic character model manipulation, such as bending of arms and legs, as well as complex manipulation, such as a tail or spine.  The individual joints (or bones) of the Skeleton deformer can be connected to create an overal skeletal hierachy, with each appendage (and sub-appendages) recieving inherited movement from it's parent joint.

Rigging models can also use other deformer tools such as Shape deformers, Spline deformers, Lattice deformers, etc., depending on the tools available in the Third-Party Application used.  The common element in all these deformer tools is that they will move the individual points that make up the connecting polygonal faces, thereby changing the shape of the overall model.

===Animating===

Animating is the process of manipulating the rigging of the character model within a timeline to create a series of sequences that represent various actions the character can make.  Typically, the character rigging (skeletal hierarchy or the like) will be positioned and &quot;keyed&quot; at various points in the timeline, just like the keys of a [[Legacy:Mover|Mover]].  As the animator moves (or &quot;scrubs&quot;) along the timeline, the keyed animation will be played back and the model's rigging will animate the character.

Although the basic premise is the same, depending on the Third-Party Application used, the process of keying positions and saving animated sequences will differ slightly.  The main idea is to make sure that the character model moves appropriately in terms of timing, attitude and acting for each animation sequence.  Once animation is completed, these series of sequences, that represent each possible action the character can make, will be exported from the Third-Party Application to the Unreal Editor's [[Legacy:Animation Browser|Animation Browser]].

See also [[Legacy:Animation|Animation]].

===Coding===

Based on the design of the character's behavior and the character's abilities, the coding will entail a unique degree of complexity, in order to believably represent the chatacter's Artificial Intelligence as well as it's movements, combat abilities, special effects, etc.  Once the character animations are available to the Unreal Editor, various Object classes can be created to use those sequences to display the character's existance and behavior.  Typically, simple characters can use one class, a [[Legacy:Pawn|Pawn]] subclass, to represent that character.  The Pawn classes are specifically designed to represent characters in the Unreal gamespace, handling Movement, Damage, Dying and other typical character functions as well as the inherited Animation, Physics and Sound functions from [[Legacy:Actor|Actor]].  More complex characters (like Player Characters) will require extra Object classes to complete their behavior and potential actions, such as [[Legacy:Controller|Controller]]s, [[Legacy:Weapon|Weapon]]s, [[Legacy:InventoryAttachment|InventoryAttachment]]s, etc.

====Controllers====

UT2003 introduced the use of Controllers in collaboration with Pawns to represent all characters, including AI controlled entities, whereas UT used [[Legacy:ScriptedPawn|ScriptedPawn]]s alone (or in conjunction with a [[Legacy:ScriptedSequence|ScriptedSequence]] for special control of individual characters per map).  Controller classes are used to dictate the actions of a Pawn and handle it's non-physical elements.  While the Pawn is the visual and physical representation of a character, the Controller is the &quot;mind&quot; or &quot;soul&quot; of the character; both the decision making element and the entity that persists if that character Pawn is killed and respawned.

See also [[Legacy:Controller Overview|Controller Overview]].

==Testing and Integration==

Once your NPC is available, begin to itegrate it into the game world and among the other players and NPCs.  Test it thoroughly to ensure it will serve it's purpose adequately, behave properly under all possible considitions and situations it might face, and will appear, move and sound appropriate to it's purpose and behavior.

==Tutorials==
* [[Legacy:Maya PLE Character Model Tutorial|Maya PLE Character Model Tutorial]] &amp;ndash; A tutorial covering modeling, rigging, animation and import of skeletal mesh characters.
* [[Legacy:Basic AI Scripting Tutorial|Basic AI Scripting Tutorial]] &amp;ndash; A tutorial detailing the (re)creation of the NaliCow NPC for UT2004.

==Examples==
* [[Legacy:Nali|Nali]] and [[Legacy:Cow|Cow]] &amp;ndash; Stock non-Monster NPCs for UT
* [[Legacy:TankVictim|TankVictim]] &amp;ndash; A stock NPC for UT200x found in DM-Insidious
* The [http://wiki.beyondunreal.com/wiki/SuperApe#0.2.4 ROOs] &amp;ndash; Kangaroo Non-Player Characters for UT2004 mappers.  And the [http://forums.unrealplayground.com/showthread.php?t=36679 ROOtator] : A mutator designed to populate any map with ROOs; also includes the Australian RooLette and RooHunt minigames.

==Related Topics==
* [[Legacy:Gameplay|Gameplay]] &amp;ndash; Concepts and elements of satisfying game design.
* [[Legacy:ScriptedPawn|ScriptedPawn]] &amp;ndash; The parent UT class for NPCs
* [[Legacy:XIntroPawn|xIntroPawn]] &amp;ndash; UT200x NPC Pawns used to act in intro scenes, cut scenes, etc.
* [[Legacy:Artificial Intelligence|Artificial Intelligence]] &amp;ndash; A super topic for all AI (bots, monsters, etc.)
** [[Legacy:Monster Support|Monster Support]] &amp;ndash; A hub for monster support
*** [[Legacy:An AI Concept|An AI Concept]] &amp;ndash; Exploration of a custom monster AI construct.

===Custom Content===
* [[Legacy:SuperApe/Old_Skool_Monsta_Toolz|Old Skool Monsta Toolz]] &amp;ndash; A mod/mapping toolset for implementing complex monster/NPC behavior in UT2004.

==Discussion==

'''SuperApe:''' This page is in progress.  It will contain information on creating custom NPCs in the unreal engine. (critters, neutral individuals, helpful NPCs, etc.)  &lt;u&gt;The idea will be to give general concepts (not a tutorial) and to link to any relevant pages.&lt;/u&gt;  Working...

'''SuperApe:''' The structure of this page is complete.  Please give your thoughts here.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NVerxion</title>
    <id>2271</id>
    <revision>
      <id>5493</id>
      <timestamp>2002-08-19T15:08:24Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Wiki, NVerxion.  :-)

'''ZxAnPhOrIaN:''' Hey NVerxion! :) :tup:

'''Tarquin:''' Hi there. Sorry I didn't spot you earlier. Hope the natives haven't scared you away. We don't bit. Much. ;)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5494</id>
      <timestamp>2002-08-05T17:16:02Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Mychaeel:''' Welcome to the Wiki, NVerxion.  :-)

'''ZxAnPhOrIaN:''' Hey NVerxion! :) :tup:</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nachimir</title>
    <id>2258</id>
    <revision>
      <id>5463</id>
      <timestamp>2002-07-06T13:55:46Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Erm...

I make maps, and have a site here:

&lt;br /&gt;[http://www.planetunreal.com/fragadelic/nachimir/ Nachimir's Hole]

I avoided UnrealWiki for ages. But now I see the error of my ways. It's a &lt;i&gt;super&lt;/i&gt; idea. I think hosted sites are especially inconvenient with regard to tutorials.

:&lt;i&gt;Welcome to the Wiki then.  :-)  Forgive my curiosity:  &lt;/i&gt;Why&lt;i&gt; did you (actively, I take it) avoid the Wiki so long?  Maybe there's a public misconception we could possibly clear up...  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

''Nachimir'' Thanks. It was just slightly scary, the thought of everyone else being able to... &lt;i&gt;handle&lt;/i&gt; stuff. Stupid of me to be so precious. I think this could be one of the biggest assets of the Unreal community.

&lt;br&gt;&lt;i&gt;&quot;This is a Local Wiki, for Local people. ARGH, stop! They're touching the precious things!&quot;&lt;br /&gt;&quot;not now tubbs!&quot;&lt;/i&gt;

: I know what you mean. I find the best way to get around that is to write in a different style: instead of carefully crafting a single page, write quick notes and save the page. Come back to it whenever you think of something to add, and let it grow bit by bit. Think of it as chain-writing. Welcome aboard! BTW added you to the [[:Category:Legacy Personal Page]] page &amp;ndash; ''Tarquin'' 

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5464</id>
      <timestamp>2002-04-14T20:23:20Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Erm...

I make maps, and have a site here:

&lt;br /&gt;[http://www.planetunreal.com/fragadelic/nachimir/ Nachimir's Hole]

I avoided UnrealWiki for ages. But now I see the error of my ways. It's a &lt;i&gt;super&lt;/i&gt; idea. I think hosted sites are especially inconvenient with regard to tutorials.

:&lt;i&gt;Welcome to the Wiki then.  :-)  Forgive my curiosity:  &lt;/i&gt;Why&lt;i&gt; did you (actively, I take it) avoid the Wiki so long?  Maybe there's a public misconception we could possibly clear up...  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

''Nachimir'' Thanks. It was just slightly scary, the thought of everyone else being able to... &lt;i&gt;handle&lt;/i&gt; stuff. Stupid of me to be so precious. I think this could be one of the biggest assets of the Unreal community.

&lt;br&gt;&lt;i&gt;&quot;This is a Local Wiki, for Local people. ARGH, stop! They're touching the precious things!&quot;&lt;/i&gt;

: I know what you mean. I find the best way to get around that is to write in a different style: instead of carefully crafting a single page, write quick notes and save the page. Come back to it whenever you think of something to add, and let it grow bit by bit. Think of it as chain-writing. Welcome aboard!  &amp;ndash; ''Tarquin''</text>
    </revision>
    <revision>
      <id>5465</id>
      <timestamp>2002-04-14T20:42:28Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Erm...

I make maps, and have a site here:

&lt;br /&gt;[http://www.planetunreal.com/fragadelic/nachimir/ Nachimir's Hole]

I avoided UnrealWiki for ages. But now I see the error of my ways. It's a &lt;i&gt;super&lt;/i&gt; idea. I think hosted sites are especially inconvenient with regard to tutorials.

:&lt;i&gt;Welcome to the Wiki then.  :-)  Forgive my curiosity:  &lt;/i&gt;Why&lt;i&gt; did you (actively, I take it) avoid the Wiki so long?  Maybe there's a public misconception we could possibly clear up...  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;

''Nachimir'' Thanks. It was just slightly scary, the thought of everyone else being able to... &lt;i&gt;handle&lt;/i&gt; stuff. Stupid of me to be so precious. I think this could be one of the biggest assets of the Unreal community.

&lt;br&gt;&lt;i&gt;&quot;This is a Local Wiki, for Local people. ARGH, stop! They're touching the precious things!&quot;&lt;br /&gt;&quot;not now tubbs!&quot;&lt;/i&gt;

: I know what you mean. I find the best way to get around that is to write in a different style: instead of carefully crafting a single page, write quick notes and save the page. Come back to it whenever you think of something to add, and let it grow bit by bit. Think of it as chain-writing. Welcome aboard! BTW added you to the [[:Category:Legacy Personal Page]] page &amp;ndash; ''Tarquin'' 
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nali</title>
    <id>2259</id>
    <revision>
      <id>5466</id>
      <timestamp>2005-12-06T21:15:43Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Nali}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Nali &gt;&gt; NaliPriest}}

[[Image:Legacy_scriptedpawn.nali.jpeg|center|&lt;i&gt;A meditating Nali on the left, with a Nali Priest on the right who is displaying his colorful body art.&lt;/i&gt;]]

The Nali are the basic benevolent creatures of the Unreal world.  SinglePlayer mappers who put them in their maps are usually trying to demonstrate that not everything in the game is out to kill the player.  Nali Priests are usually the kind of Nali that players find in temple-like areas, or they might just be considered to be Nali of a higher station in their society.

Nali are particularly good when mappers give them AlarmTags.  A mapper might use an [[Legacy:AlarmPoint|AlarmPoint]] to get a Nali to show him some plot-relevant location, a Nali might lead the player to a powerful item, or he might open a locked door that the player needs to get past.

==Properties==
; bNeverBow: Used to tell a variable to not stop and bow when it's retreating from someone or something.  However, it's very buggy, and should only be used in the most well-tested of cases.  Also, the Nali should have a [[Legacy:HomeBase|HomeBase]] if the mapper wants to use bNeverBow with the Nali.
; Tool: Used to get the Nali to hold a weapon.  However, this feature was never implemented, and it should be ignored.

==Orders ==

Since Nali don't normally engage in combat, a couple of their combat-oriented orders make them do different things.
; Guarding : Make a Nali stand and pray, occasionally bowing.
; Ambushing : Make a Nali meditate in mid-air.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5467</id>
      <timestamp>2002-10-21T02:41:18Z</timestamp>
      <contributor>
        <ip>TechnoJF</ip>
      </contributor>
      <minor/>
      <comment>Nali's orders.</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Nali}}

{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Nali &gt;&gt; NaliPriest}}

&lt;br /&gt;

[[Image:Legacy_scriptedpawn.nali.jpeg|center|&lt;i&gt;A meditating Nali on the left, with a Nali Priest on the right who is displaying his colorful body art.&lt;/i&gt;]]

&lt;br&gt;

The Nali are the basic benevolent creatures of the Unreal world.  SinglePlayer mappers who put them in their maps are usually trying to demonstrate that not everything in the game is out to kill the player.  Nali Priests are usually the kind of Nali that players find in temple-like areas, or they might just be considered to be Nali of a higher station in their society.

Nali are particularly good when mappers give them AlarmTags.  A mapper might use an [[Legacy:AlarmPoint|AlarmPoint]] to get a Nali to show him some plot-relevant location, a Nali might lead the player to a powerful item, or he might open a locked door that the player needs to get past.

==Variables ==

Nali have two new variables: 

; bNeverBow : used to tell a variable to not stop and bow when it's retreating from someone or something.  However, it's very buggy, and should only be used in the most well-tested of cases.  Also, the Nali should have a [[Legacy:HomeBase|HomeBase]] if the mapper wants to use bNeverBow with the Nali.
; Tool : used to get the Nali to hold a weapon.  However, this feature was never implemented, and it should be ignored.

==Orders ==

Since Nali don't normally engage in combat, then a couple of their combat-oriented orders make them do different things.

*To make a Nali stand and pray, occasionally bowing, use the '''Guarding''' order with no OrderTag.
*To make a Nali meditate in mid-air, use the '''Ambushing''' order.</text>
    </revision>
    <revision>
      <id>5468</id>
      <timestamp>2004-05-20T01:01:47Z</timestamp>
      <contributor>
        <ip>64-216-188-176.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>Added &quot;Category Class (UT)&quot; reference</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Nali}}

{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Pawn (UT)|Pawn (UT)]] &gt;&gt; [[Legacy:ScriptedPawn|ScriptedPawn]] &gt;&gt; Nali &gt;&gt; NaliPriest}}

&lt;br /&gt;

[[Image:Legacy_scriptedpawn.nali.jpeg|center|&lt;i&gt;A meditating Nali on the left, with a Nali Priest on the right who is displaying his colorful body art.&lt;/i&gt;]]

&lt;br&gt;

The Nali are the basic benevolent creatures of the Unreal world.  SinglePlayer mappers who put them in their maps are usually trying to demonstrate that not everything in the game is out to kill the player.  Nali Priests are usually the kind of Nali that players find in temple-like areas, or they might just be considered to be Nali of a higher station in their society.

Nali are particularly good when mappers give them AlarmTags.  A mapper might use an [[Legacy:AlarmPoint|AlarmPoint]] to get a Nali to show him some plot-relevant location, a Nali might lead the player to a powerful item, or he might open a locked door that the player needs to get past.

==Variables ==

Nali have two new variables: 

; bNeverBow: used to tell a variable to not stop and bow when it's retreating from someone or something.  However, it's very buggy, and should only be used in the most well-tested of cases.  Also, the Nali should have a [[Legacy:HomeBase|HomeBase]] if the mapper wants to use bNeverBow with the Nali.
; Tool: used to get the Nali to hold a weapon.  However, this feature was never implemented, and it should be ignored.

==Orders ==

Since Nali don't normally engage in combat, then a couple of their combat-oriented orders make them do different things.

*To make a Nali stand and pray, occasionally bowing, use the '''Guarding''' order with no OrderTag.
*To make a Nali meditate in mid-air, use the '''Ambushing''' order.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NaliFruit</title>
    <id>28350</id>
    <revision>
      <id>40017</id>
      <timestamp>2009-11-14T20:19:36Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Name</title>
    <id>2296</id>
    <revision>
      <id>5543</id>
      <timestamp>2004-05-14T01:28:52Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>Does UEd clean up unused names?</comment>
      <text xml:space="preserve">'''Name''' is a variable type in [[Legacy:UnrealScript|UnrealScript]]. They are used to identify and tag [[Legacy:Actor|actor]]s, [[Legacy:Object|object]]s, [[Legacy:Resource|resource]]s and [[Legacy:Package|package]]s in various ways.

Names look like strings in [[Legacy:UnrealEd|UnrealEd]]. In UnrealScript, they are enclosed in single quotes rather than double:

&lt;uscript&gt;
 Mystring = &quot;string&quot;;
 MyName   = 'name';
&lt;/uscript&gt;

They don't behave like strings though... you can't do much by way of combining them (though it's possible). They are also limited to 31 characters.

Names are stored internally in some sort of table. They are case-insensitive, but case is stored. This produces the &quot;name case jump effect&quot; in UnrealEd:
# Type &quot;MyName&quot; in one actor's Tag
# Type &quot;myname&quot; in another actor's Tag. When you hit return, you'll see the lowercase &quot;myname&quot; jump to &quot;MyName&quot;, because the name was first stored as &quot;MyName&quot;.

This effect is a useful confirmation that you've correctly matched names. See [[Legacy:Match These Tags|Match These Tags]] for more on this.

==Questions==

Does UEd clean up unused names?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NamelessPlayer</title>
    <id>2295</id>
    <revision>
      <id>5541</id>
      <timestamp>2004-05-01T21:16:11Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

I don't feel like giving out my personal info yet.

==Goals==
* To have fun
* To explore the possibilities of Unreal Script
* To implement my ideas using the Unreal Engine
* To compete in the &quot;Make Something Unreal&quot; contest

==Projects==

I just finished the UnrealScript portion of the UT 2004 DVD Edition's VTMs, and I want to start by making an advanced damage system for vehicles. What this does is allow you to destroy parts of vehicles, like wheels &amp; weapons. Problem is, I don't know what keeps wheels &amp; turrets attached to vehicles. I'm also not used to creating web pages on a wiki, so I'll just post things here.

'''Tarquin:''' Hi! Welcome! Wiki has auto-wrap, by the way :) and creating new pages is very simple.</text>
    </revision>
    <revision>
      <id>5542</id>
      <timestamp>2004-05-01T19:05:28Z</timestamp>
      <contributor>
        <ip>NamelessPlayer</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Bio==

I don't feel like giving out my personal info yet.

==Goals==
* To have fun
* To explore the possibilities of Unreal Script
* To implement my ideas using the Unreal Engine
* To compete in the &quot;Make Something Unreal&quot; contest

==Projects==

I just finished the UnrealScript portion of the UT 2004 DVD Edition's VTMs, and I want to start by making

an advanced damage system for vehicles. What this does is allow you to destroy parts of vehicles, like

wheels &amp; weapons. Problem is, I don't know what keeps wheels &amp; turrets attached to vehicles. I'm also not

used to creating web pages on a wiki, so I'll just post things here.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Namespaces</title>
    <id>2266</id>
    <revision>
      <id>5482</id>
      <timestamp>2006-11-29T08:02:43Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Namespaces will probably be implemented by the time UT2003 and U2 are concurrent. Until then see [[Legacy:UT2003|UT2003]] for how to deal with new pages.'''

----

==Proposals ==

'''Mychaeel:'''  I've kept thinking about this, and I'm suggesting the following (not claiming it hasn't been mentioned before):

* Introduce technical support for namespaces.
* Create namespaces for the various games, not by engine version but by game name: U, UT, UT2003, UE2, DX...
* As soon as the class structure of UT2003 is known, move all UT classes that have no UT2003 counterpart, or whose UT2003 counterpart of the same name has a different meaning or a sufficiently different implementation to justify a separate page, into the UT namespace. Create pages on classes only present in UT2003 (see above) in the UT2003 namespace.

Unqualified page links will automatically lead to pages in the current namespace if possible, or to pages in the global namespace otherwise, or open a &quot;new page&quot; edit field within the current namespace.

The only pages that remain in the global namespace are those that apply to all engine versions.

==Old Discussion ==

to set the scene...

'''Tarquin:'''  Implement some heavy Wiki techology such as namespaces so the global namespace is the latest version of the engine, and for example current page Actor becomes UT:Actor. Would require major scripting.

'''Mychaeel:''' ...but is ''definitely'' the preferable way. Everything else is bound to lead to major confusion.

'''Tarquin:'''  urg. But do we simply fool the current system into accepting names like &quot;UT:actor&quot; by using some sort of escape character and then detect it in the GetLink subs, or do we have to majorly hack the way the data is stored? Or even somehow hijack the built-in InterWiki links &amp;ndash; they work like this: Wikipedia:Pagename AFAIK, but I haven't implemented them.

'''Mychaeel:''' We could make it upside-down:  Not consider the namespace a new top-level branch but a page-level distinction (as if we were to provide each page in different languages).  Then all versions of a page could even be stored in the same file without having to mess around with the whole data storage code.  If you are viewing a certain flavor of a given page, all links would default to the same flavor of other pages in case they're present. 

'''EntropicLqd:''' That's not a bad idea.  Conceptually you could argue that the next gen Unreal engine stuff is really another language.  It's stretching the metaphor a little but sounds easier than creating a whole new namespace.  However, thinking ahead to Christmas we'll probably need some Unreal 2 specific stuff as well - but goodness knows just how similar UT2K3 and U2 will be. 

'''Mychaeel:'''  I'm meanwhile strongly in favor of real namespaces.

'''Tarquin:'''  yup, I think we have to go for some sort of technical namespace thingy. My display idea for the class thing has gone all wrong BTW: if I use SPAN instead of TABLE it won't work on more than one line :(

----

==Technical Implementation ==

'''Tarquin:'''  whether we use a top-level change so Wiki can use pagenames like &quot;UT:Bot&quot;, or the flavour system, I think different namespace pages of the same name should behave to the user as different pages. 

Showing all versions together for editing &amp; using new tags could have advantages (eg a tutorial like [[Legacy:Making Waterfalls|Making Waterfalls]] might have only minor differences between engines) but I think it could be very confusing when editing. Some pages (Bot, for example) may be completely different in each engine.

'''Mychaeel:'''  As it happens, [[Legacy:Making Waterfalls|Making Waterfalls]] will have to undergo some changes for the new engine &amp;ndash; due to a couple of fundamental changes in how things like, for instance, panning textures are done in the new engine.  In any case there should be a clear indication of the current namespace on every page and a way to switch to a different namespace easily.

'''Tarquin:'''  Agreed. The title of a page should be &quot;UT:Bot&quot; for example. Are you still planning on putting the different versions of a page in the one file &amp; using UMW's superscript 3 seperator somehow?

'''Mychaeel:'''  No &amp;ndash; actually I'm thinking more along the lines of branching the subdirectory structure directly below the level of wiki-data/page and wiki-data/keep.

==Interface ==

Suggestions for how it should work for the user:

* Within Global namespace:
** plain page links stay in global
** namespace links go to that namespace
** plan page that doesn't exist edits the new page in Global

* within a namespace
** namespace links (another namespace of &quot;global:Bot&quot;) go to that namespace
** the tricky issue is what to do for the plain name:
*** if the page in the same namespace exists, go there
*** if the page doesn't exist in that namespace... 

'''Mychaeel:''' ...jump to that page in the global namespace if it exists there, or create a new page within the current namespace otherwise.  (That accommodates best Wiki growth as the engine grows.) &amp;ndash; The behavior in the global namespace suggested above is just a special case of this behavior, by the way.

'''Tarquin:'''  that's probably the best thing.

==Usage ==

'''Tarquin:'''  Are namespaces just for classes and script differences? Are things about mapping in general going to be in global?

'''Mychaeel:'''  Umm, anything that is specific to a particular engine version.  Particle emitters should be something in the UT2003 namespace, for instance.

Suggestions for namespaces...

==Feb 2003 ==

'''Tarquin:''' I had a funny thought the other day. It seems to me we've just about implemented namespaces by the back door. The &quot;Page (UT)&quot;, &quot;Page (ut2003)&quot; syntax is pretty much a namespace system. The only thing that's missing is the &quot;smart&quot; links as discussed above.

'''Mychaeel:''' Yes, you're right... but it turns out to have just the problems that made me think of namespaces as a somewhat untidy solution.  (Plus a few more that come from our rather crude implementation of them by adding a page name suffix.)

The main problem is that namespaces put every page into one single category, and that they have a granularity of pages rather than parts of pages.  Some things are naturally exclusive to one category, like [[:Category:Legacy Personal Page|personal pages]]; other things like the [[Legacy:Actor|Actor]] class in UT and UT2003 are actually the result of an evolution where most of the content is shared, but some things are particular to either UT or UT2003.

An optimal solution would allow us to assign categories to ''parts'' of pages without disrupting the reading flow when viewing the content of one category.  (If I look at a page in &quot;UT2003 mode&quot; I'd like to see all content that applies to UT2003 even if it partly overlaps with UT or U2 content.)

On the other hand, some things like UT's and UT2002's [[Legacy:Bot|Bot]] class differ in more things than they have in common to a degree that warrants a distinct page for UT and UT2003 each.

Something's on my mind that might solve that dilemma, but it's too vague yet to be put into words...

----

'''Fyfe:''' Can I poke this topic back into life :D Are we going about the grouping of pages wrong here? At the moment we are splitting it by game, and this mainly comes down to [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] ([[Legacy:Unreal Tournament 3|Unreal Tournament 3]] will open this can of worms again when it arrives). 

The result is 
* [[Legacy:Triggers|Triggers]]
* [[Legacy:Triggers (UT)|Triggers (UT)]]
* [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]
* [[Legacy:Triggers (UT2004)|Triggers (UT2004)]] (Marked for deletion)

and ghost links to 
* [Triggers (U2)]
* [Triggers (UE2)]

Now some people have wrongly assumed that because we have a page for [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] we need one for every game (eg [[Legacy:Triggers (UT2004)|Triggers (UT2004)]]). When in reality [[Legacy:UT|UT]] represents Unreal Engine 1, [[Legacy:UT2003|UT2003]] represents UE 2, [[Legacy:UT2004|UT2004]] represent UE 2.5 and [[Legacy:Unreal Tournament 3|Unreal Tournament 3]] will represent UE 3.

So would it not make more sense to split the wiki by engine version?? There are exceptions where a game will implement new features that we want to document in  the wiki.

'''''Same topic, different question''''', and using [[Legacy:Triggers|Triggers]] as an example would the following layout be better...
* [[Legacy:Triggers (UT)|Triggers (UT)]] &amp;ndash; As is UT specific info
* [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &amp;ndash; As is UT2003 specific info
* [[Legacy:Triggers|Triggers]] &amp;ndash; This redirects to the latest version, in this case [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]

Then when [[Legacy:Unreal Tournament 3|Unreal Tournament 3]] comes along we create (if it's needed) [Triggers (UT2007)] and [[Legacy:Triggers|Triggers]] is changed to point at [Triggers (UT2007)].

Comments????

'''EricBlade:''' It seems to me that potentially each game could have an Actor class, such as [Land of the Dead/Actor]. Or any other class, or any other topic.  If you compared Postal 2, to whatever Unreal game was from a similar build of it's engine, I doubt you'd even be able to recognise that their UC files came from the same source.  I'd wonder if it would be best to do it like that, with each page referring back to what it is most similar to, and then detailing the differences..  hmm...</text>
    </revision>
    <revision>
      <id>5483</id>
      <timestamp>2006-11-28T05:35:22Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <comment>Comments...???</comment>
      <text xml:space="preserve">'''Namespaces will probably be implemented by the time UT2003 and U2 are concurrent. Until then see [[Legacy:UT2003|UT2003]] for how to deal with new pages.'''

----

==Proposals ==

'''Mychaeel:'''  I've kept thinking about this, and I'm suggesting the following (not claiming it hasn't been mentioned before):

* Introduce technical support for namespaces.
* Create namespaces for the various games, not by engine version but by game name: U, UT, UT2003, UE2, DX...
* As soon as the class structure of UT2003 is known, move all UT classes that have no UT2003 counterpart, or whose UT2003 counterpart of the same name has a different meaning or a sufficiently different implementation to justify a separate page, into the UT namespace. Create pages on classes only present in UT2003 (see above) in the UT2003 namespace.

Unqualified page links will automatically lead to pages in the current namespace if possible, or to pages in the global namespace otherwise, or open a &quot;new page&quot; edit field within the current namespace.

The only pages that remain in the global namespace are those that apply to all engine versions.

==Old Discussion ==

to set the scene...

'''Tarquin:'''  Implement some heavy Wiki techology such as namespaces so the global namespace is the latest version of the engine, and for example current page Actor becomes UT:Actor. Would require major scripting.

'''Mychaeel:''' ...but is ''definitely'' the preferable way. Everything else is bound to lead to major confusion.

'''Tarquin:'''  urg. But do we simply fool the current system into accepting names like &quot;UT:actor&quot; by using some sort of escape character and then detect it in the GetLink subs, or do we have to majorly hack the way the data is stored? Or even somehow hijack the built-in InterWiki links &amp;ndash; they work like this: Wikipedia:Pagename AFAIK, but I haven't implemented them.

'''Mychaeel:''' We could make it upside-down:  Not consider the namespace a new top-level branch but a page-level distinction (as if we were to provide each page in different languages).  Then all versions of a page could even be stored in the same file without having to mess around with the whole data storage code.  If you are viewing a certain flavor of a given page, all links would default to the same flavor of other pages in case they're present. 

'''EntropicLqd:''' That's not a bad idea.  Conceptually you could argue that the next gen Unreal engine stuff is really another language.  It's stretching the metaphor a little but sounds easier than creating a whole new namespace.  However, thinking ahead to Christmas we'll probably need some Unreal 2 specific stuff as well - but goodness knows just how similar UT2K3 and U2 will be. 

'''Mychaeel:'''  I'm meanwhile strongly in favor of real namespaces.

'''Tarquin:'''  yup, I think we have to go for some sort of technical namespace thingy. My display idea for the class thing has gone all wrong BTW: if I use SPAN instead of TABLE it won't work on more than one line :(

----

==Technical Implementation ==

'''Tarquin:'''  whether we use a top-level change so Wiki can use pagenames like &quot;UT:Bot&quot;, or the flavour system, I think different namespace pages of the same name should behave to the user as different pages. 

Showing all versions together for editing &amp; using new tags could have advantages (eg a tutorial like [[Legacy:Making Waterfalls|Making Waterfalls]] might have only minor differences between engines) but I think it could be very confusing when editing. Some pages (Bot, for example) may be completely different in each engine.

'''Mychaeel:'''  As it happens, [[Legacy:Making Waterfalls|Making Waterfalls]] will have to undergo some changes for the new engine &amp;ndash; due to a couple of fundamental changes in how things like, for instance, panning textures are done in the new engine.  In any case there should be a clear indication of the current namespace on every page and a way to switch to a different namespace easily.

'''Tarquin:'''  Agreed. The title of a page should be &quot;UT:Bot&quot; for example. Are you still planning on putting the different versions of a page in the one file &amp; using UMW's superscript 3 seperator somehow?

'''Mychaeel:'''  No &amp;ndash; actually I'm thinking more along the lines of branching the subdirectory structure directly below the level of wiki-data/page and wiki-data/keep.

==Interface ==

Suggestions for how it should work for the user:

* Within Global namespace:
** plain page links stay in global
** namespace links go to that namespace
** plan page that doesn't exist edits the new page in Global

* within a namespace
** namespace links (another namespace of &quot;global:Bot&quot;) go to that namespace
** the tricky issue is what to do for the plain name:
*** if the page in the same namespace exists, go there
*** if the page doesn't exist in that namespace... 

'''Mychaeel:''' ...jump to that page in the global namespace if it exists there, or create a new page within the current namespace otherwise.  (That accommodates best Wiki growth as the engine grows.) &amp;ndash; The behavior in the global namespace suggested above is just a special case of this behavior, by the way.

'''Tarquin:'''  that's probably the best thing.

==Usage ==

'''Tarquin:'''  Are namespaces just for classes and script differences? Are things about mapping in general going to be in global?

'''Mychaeel:'''  Umm, anything that is specific to a particular engine version.  Particle emitters should be something in the UT2003 namespace, for instance.

Suggestions for namespaces...

==Feb 2003 ==

'''Tarquin:''' I had a funny thought the other day. It seems to me we've just about implemented namespaces by the back door. The &quot;Page (UT)&quot;, &quot;Page (ut2003)&quot; syntax is pretty much a namespace system. The only thing that's missing is the &quot;smart&quot; links as discussed above.

'''Mychaeel:''' Yes, you're right... but it turns out to have just the problems that made me think of namespaces as a somewhat untidy solution.  (Plus a few more that come from our rather crude implementation of them by adding a page name suffix.)

The main problem is that namespaces put every page into one single category, and that they have a granularity of pages rather than parts of pages.  Some things are naturally exclusive to one category, like [[:Category:Legacy Personal Page|personal pages]]; other things like the [[Legacy:Actor|Actor]] class in UT and UT2003 are actually the result of an evolution where most of the content is shared, but some things are particular to either UT or UT2003.

An optimal solution would allow us to assign categories to ''parts'' of pages without disrupting the reading flow when viewing the content of one category.  (If I look at a page in &quot;UT2003 mode&quot; I'd like to see all content that applies to UT2003 even if it partly overlaps with UT or U2 content.)

On the other hand, some things like UT's and UT2002's [[Legacy:Bot|Bot]] class differ in more things than they have in common to a degree that warrants a distinct page for UT and UT2003 each.

Something's on my mind that might solve that dilemma, but it's too vague yet to be put into words...

----

'''Fyfe:''' Can I poke this topic back into life :D Are we going about the grouping of pages wrong here? At the moment we are splitting it by game, and this mainly comes down to [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] ([[Legacy:Unreal Tournament 3|Unreal Tournament 3]] will open this can of worms again when it arrives). 

The result is 
* [[Legacy:Triggers|Triggers]]
* [[Legacy:Triggers (UT)|Triggers (UT)]]
* [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]
* [[Legacy:Triggers (UT2004)|Triggers (UT2004)]] (Marked for deletion)

and ghost links to 
* [Triggers (U2)]
* [Triggers (UE2)]

Now some people have wrongly assumed that because we have a page for [[Legacy:UT|UT]] and [[Legacy:UT2003|UT2003]] we need one for every game (eg [[Legacy:Triggers (UT2004)|Triggers (UT2004)]]). When in reality [[Legacy:UT|UT]] represents Unreal Engine 1, [[Legacy:UT2003|UT2003]] represents UE 2, [[Legacy:UT2004|UT2004]] represent UE 2.5 and [[Legacy:Unreal Tournament 3|Unreal Tournament 3]] will represent UE 3.

So would it not make more sense to split the wiki by engine version?? There are exceptions where a game will implement new features that we want to document in  the wiki.

'''''Same topic, different question''''', and using [[Legacy:Triggers|Triggers]] as an example would the following layout be better...
* [[Legacy:Triggers (UT)|Triggers (UT)]] &amp;ndash; As is UT specific info
* [[Legacy:Triggers (UT2003)|Triggers (UT2003)]] &amp;ndash; As is UT2003 specific info
* [[Legacy:Triggers|Triggers]] &amp;ndash; This redirects to the latest version, in this case [[Legacy:Triggers (UT2003)|Triggers (UT2003)]]

Then when [[Legacy:Unreal Tournament 3|Unreal Tournament 3]] comes along we create (if it's needed) [Triggers (UT2007)] and [[Legacy:Triggers|Triggers]] is changed to point at [Triggers (UT2007)].

Comments????</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Namu</title>
    <id>2248</id>
    <revision>
      <id>5439</id>
      <timestamp>2002-07-06T13:56:02Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Hi Namu, welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5440</id>
      <timestamp>2002-03-22T13:14:54Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi Namu, welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Native Coding</title>
    <id>2265</id>
    <revision>
      <id>5480</id>
      <timestamp>2008-01-25T21:08:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>locked</comment>
      <text xml:space="preserve">In the [[Legacy:Unreal Engine|Unreal Engine]], Native Coding is anything related to using the Unreal Engine headers and libraries to create (in C++) DLL files.  This includes native UnrealScript classes, as well as purely native classes (commandlets, drivers, etc.)

==UT==

*[[Legacy:Setting Up VC++|Setting Up VC++]]
*[[Legacy:Library Reference|Library Reference]]

* http://web.archive.org/web/20010305143725/http://www.sleepwalkertc.com/members/blitz/native/native.html 
** Tom &quot;Blitz&quot; Conder (blitz@sleepwalkertc.com) &amp;ndash; Blitz is programmer for the SleepWalker TC, a total conversion by Arkham Laboratories.
*** http://gazpacho.net/ is where he lives now!
*** http://www.esconline.org/Resources/native.html has a reference.  I think one of the [[Legacy:Esc|Esc]] people comes here.
** Carlos &quot;c0mpi1e&quot; Cuello (ccuello@ccs.neu.edu) &amp;ndash; c0mpi1e is team leader, designer and lead programmer for Unloaded, a partial conversion by Outhouse Productions.
* http://web.archive.org/web/20000818105116/http://www.chessmess.com/musqa-0500.htm 
* http://mimesis.csc.ncsu.edu/resources/scripters/lispTutorial/mimesis_native_tutorial.html &lt;&amp;ndash; Mainly a re-hash of the first link.

==Unreal Tournament 2003==

Native coding for UT2K3 isn't currently possible unless you're a licensee of the engine.  Epic has not released nor have they mentioned any plans of releasing the headers for builds 2107+ of the engine.

(Note: If you wish to create native code, you may wish to email epic and request the headers, even if you are not a licensee.  You will need to sign a few forms, but not necessarily pay anything).

Documentation on how the native code in the engine initiates UnrealScript events and function calls can be found in [[Legacy:Game Event Flow|Game Event Flow]]

==Unreal Tournament 2004==

Native headers are not available for this game either. However, there are some native code snippets, including most of the native Onslaught vehicle code in the downloadable [[Legacy:UnrealScript Source|UnrealScript Source]] files.

==Deus Ex==

'''TheSheep:''' In fact, the Deus Ex headers and libraries can be found in the SDK. They are not automatically extracted but if you unzip the SDK package they are in DxHeaders.zip and DxLibs.zip

==Comments ==

'''Tarquin:'''  are any of the authors of the above still around? Anyone feel like contacting them to ask permision to import into the Wiki?

'''Lalo:''' is it at all possible to compile native stuff on Linux? I'm having a lot of headache with this, and with the ucc bug it seems not to be possible at all (see [[Legacy:Native Coding On Linux|Native Coding On Linux]])

'''TheRenegadeMaster:''' The headers for DeusEx can be found over at http://www.edgefiles.com/index.php/file?id=2907. The libraries have not been publicly released by Ion Storm though...

'''Çðrrð§ïðñ:'''  This is sweet... I always wanted to make my own native code since I have a great deal of experience in C++.

'''Trystan:''' I didn't create a new page because the amount of information regarding native coding for both UT and UT2K3 is fairly sparse here.

'''Crawl:''' TheRenegadeMaster's link is dead.

'''TheSheep:''' In fact, the Deus Ex headers and libraries can be found in the SDK. They are not automatically extracted but if you unzip the SDK package they are in DxHeaders.zip and DxLibs.zip

'''TheSmarch:''' i followed the tutorial at http://www.esconline.org/Resources/nativetut.html exactly but i get a load of errors when compiling like &quot;'AhzTest' : is not a class or namespace name&quot; and &quot;'StaticClass' : undeclared identifier&quot; this is my first time trying native code and i dont know any other tutorials apart from that one :P anyone have any ideas why these errors are appearing?

'''Nemesisd:''' got headers of Unreal Tournament 2003? 

'''Shambler:''' UT2k3 has no public headers

'''Raven:''' Changed to Revision 62, since someone deleted all content and paste spam here.

'''Wormbo:''' I've locked this page now. If you want to add anything, create [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Discussion]] or a similar subpage.</text>
    </revision>
    <revision>
      <id>5481</id>
      <timestamp>2008-01-25T20:09:38Z</timestamp>
      <contributor>
        <ip>Raven</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In the [[Legacy:Unreal Engine|Unreal Engine]], Native Coding is anything related to using the Unreal Engine headers and libraries to create (in C++) DLL files.  This includes native UnrealScript classes, as well as purely native classes (commandlets, drivers, etc.)

==UT==

*[[Legacy:Setting Up VC++|Setting Up VC++]]
*[[Legacy:Library Reference|Library Reference]]

* http://web.archive.org/web/20010305143725/http://www.sleepwalkertc.com/members/blitz/native/native.html 
** Tom &quot;Blitz&quot; Conder (blitz@sleepwalkertc.com) &amp;ndash; Blitz is programmer for the SleepWalker TC, a total conversion by Arkham Laboratories.
*** http://gazpacho.net/ is where he lives now!
*** http://www.esconline.org/Resources/native.html has a reference.  I think one of the [[Legacy:Esc|Esc]] people comes here.
** Carlos &quot;c0mpi1e&quot; Cuello (ccuello@ccs.neu.edu) &amp;ndash; c0mpi1e is team leader, designer and lead programmer for Unloaded, a partial conversion by Outhouse Productions.
* http://web.archive.org/web/20000818105116/http://www.chessmess.com/musqa-0500.htm 
* http://mimesis.csc.ncsu.edu/resources/scripters/lispTutorial/mimesis_native_tutorial.html &lt;&amp;ndash; Mainly a re-hash of the first link.

==Unreal Tournament 2003==

Native coding for UT2K3 isn't currently possible unless you're a licensee of the engine.  Epic has not released nor have they mentioned any plans of releasing the headers for builds 2107+ of the engine.

(Note: If you wish to create native code, you may wish to email epic and request the headers, even if you are not a licensee.  You will need to sign a few forms, but not necessarily pay anything).

Documentation on how the native code in the engine initiates UnrealScript events and function calls can be found in [[Legacy:Game Event Flow|Game Event Flow]]

==Unreal Tournament 2004==

Native headers are not available for this game either. However, there are some native code snippets, including most of the native Onslaught vehicle code in the downloadable [[Legacy:UnrealScript Source|UnrealScript Source]] files.

==Deus Ex==

'''TheSheep:''' In fact, the Deus Ex headers and libraries can be found in the SDK. They are not automatically extracted but if you unzip the SDK package they are in DxHeaders.zip and DxLibs.zip

==Comments ==

'''Tarquin:'''  are any of the authors of the above still around? Anyone feel like contacting them to ask permision to import into the Wiki?

'''Lalo:''' is it at all possible to compile native stuff on Linux? I'm having a lot of headache with this, and with the ucc bug it seems not to be possible at all (see [[Legacy:Native Coding On Linux|Native Coding On Linux]])

'''TheRenegadeMaster:''' The headers for DeusEx can be found over at http://www.edgefiles.com/index.php/file?id=2907. The libraries have not been publicly released by Ion Storm though...

'''Çðrrð§ïðñ:'''  This is sweet... I always wanted to make my own native code since I have a great deal of experience in C++.

'''Trystan:''' I didn't create a new page because the amount of information regarding native coding for both UT and UT2K3 is fairly sparse here.

'''Crawl:''' TheRenegadeMaster's link is dead.

'''TheSheep:''' In fact, the Deus Ex headers and libraries can be found in the SDK. They are not automatically extracted but if you unzip the SDK package they are in DxHeaders.zip and DxLibs.zip

'''TheSmarch:''' i followed the tutorial at http://www.esconline.org/Resources/nativetut.html exactly but i get a load of errors when compiling like &quot;'AhzTest' : is not a class or namespace name&quot; and &quot;'StaticClass' : undeclared identifier&quot; this is my first time trying native code and i dont know any other tutorials apart from that one :P anyone have any ideas why these errors are appearing?

'''Nemesisd:''' got headers of Unreal Tournament 2003? 

'''Shambler:''' UT2k3 has no public headers

'''Raven:''' Changed to Revision 62, since someone deleted all content and paste spam here.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Native Coding On Linux</title>
    <id>2272</id>
    <revision>
      <id>5495</id>
      <timestamp>2005-01-11T15:24:55Z</timestamp>
      <contributor>
        <ip>Strider</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Here's how I (almost) managed to compile native code for Linux UT. '''''WARNING''''': this does not work for me, the final result segfaults - but then again, linux ut likes to segfault anyway.

Requirements: you need both a Linux and Windows systems, with latest UT and source distribution. I find it easier to use two machines, but if you can, you can try wine, Plex86 or (last resort) dual-boot. In this text I'll assume you have two machines, if you don't, make the necessary mental adjustments.

I couldn't compile successfully using Epic's source distribution; there were some problems with the Un*.h header files. I fetched over [[Legacy:UnGnuG.H|UnGnuG.h]] from [[Legacy:OpenUT|OpenUT]] and fixed a few things, my file is at [[Legacy:UnGnuG.H|UnGnuG.h]] if you need it. I believe you could try compiling with the full [[Legacy:OpenUT|OpenUT]] sources instead of the source distribution, but it would probably segfault if your UT binary is not built from [[Legacy:OpenUT|OpenUT]] (some variables are double in one version and float in the other, for example).

I'm using the tutorial linked from [[Legacy:Native_Coding|Native_Coding]], which builds a mod named Hazard.

# first, create the directory tree as described in the tutorial, in both machines. Alternatively, use some form of file sharing to have a single source tree for both; in this case disregard all &quot;copy over&quot; instructions

# create the .uc file in one machine and copy it over to the other one

# run &quot;ucc make&quot; on the *Windows* machine

# copy over the resulting HazardClasses.h to Linux

# create the source files in Src

# on a shell prompt, go to Hazard/Src

# compile: gcc -c -O2 -Werror -fomit-frame-pointer -mpentium -D_REENTRANT -o Hazard.o -I  ../../Core/Inc -I ../../Engine/Inc -I ../Inc -D __LINUX_X86__ -D__STATIC_LINK=0 -fno-for-scope hzTest.cpp

# link: ld -shared -o ../../System/Hazard.so Hazard.o ../../System/Core.so ../../System/Engine.so

# fabricate the .dll file on Windows like the tutorial says, then run &quot;ucc make&quot; (on Windows) again to bind the .u file to the dll.

# get the bound .u file to Linux.

# test it as the tutorial says. Should work. For me it segfaults :-(

'''Foxpaw:''' Epic says that native coding under Linux doesn't work and to my knowledge they don't plan to fix it it anytime soon. That may be why it's having a segmentation fault.</text>
    </revision>
    <revision>
      <id>5496</id>
      <timestamp>2005-01-11T15:03:44Z</timestamp>
      <contributor>
        <ip>196-28-48-100.prtc.net</ip>
      </contributor>
      <text xml:space="preserve">*[http://camel-cigarettes.newmail.ru/ camel cigarettes]
 *[http://valoan.chat.ru/ va loan]
*[http://acne2scar.chat.ru/ acne scar treatment] 
*[http://acn-scar.boom.ru/ acne scar treatment] 
*[http://acne-care.hotmail.ru/ acne adult care skin] 
*[http://care-acn.boom.ru/ acne adult care skin] 
*[http://acn-care.boom.ru/ acne care] 
*[http://acne1care4skin.chat.ru/ acne skin care product] 
*[http://acne1solution.chat.ru/ acne solution] 
*[http://acn-solution.boom.ru/ acne solution] 
*[http://acne1control.chat.ru/ acne control] 
*[http://acne-control.hotmail.ru/ acne control] 
*[http://acn-control.boom.ru/ acne control] 
*[http://acne-best-treatment.newmail.ru/ murad acne treatment] 
*[http://acn-treatm.boom.ru/ murad acne treatment] 
*[http://product2acne.chat.ru/ acne product] 
*[http://acn1-product.boom.ru/ acne product] 
*[http://acne-product.hotmail.ru/ acne product] 
*[http://murad1acne.chat.ru/ murad acne] 
*[http://dr-murad-acne.hotmail.ru/ murad acne] 
*[http://murad-acn.boom.ru/ murad acne] 
*[http://adlt-acn.boom.ru/ adult acne] 
*[http://adult1-acne.hotmail.ru/ adult acne] 
*[http://acne-cure.newmail.ru/ acne best cure] 
*[http://adult-acne.hotmail.ru/ adult acne treatment] 
*[http://cheap-cigarettes.nightmail.ru/ cheap discount cigarettes] 
*[http://hawaii-hotel.newmail.ru/ Hawaii hotels] 
*[http://hawaii-hot.boom.ru/ hawaii hotel] 
*[http://hawai-hotel.boom.ru/ hawaii hotel] 
*[http://acn-treat.boom.ru/ acne treatment] 
*[http://marlboro-cigarettes.newmail.ru/ marlboro cigarettes] 
*[http://acne1product.chat.ru/ acne product] 
*[http://cigarettes2u.chat.ru/ cheap discount cigarettes] 
*[http://cigarettes2u.chat.ru/newport_cigarette_706.htm wholesale newport cigarettes] 
*[http://body1acne.chat.ru/ body acne] 
*[http://adult1acne.chat.ru/ adult acne] 
*[http://acne1scar.chat.ru/ acne scar] 
*[http://acne1rosacea.chat.ru/ acne rosacea] 
*[http://acne1medicine.chat.ru/ acne medicine] 
*[http://acne1treatment.chat.ru/ acne treatment] 
*[http://body-acne.newmail.ru/ body acne] 
*[http://body-acne.boom.ru/ body acne] 
*[http://adult-acne.newmail.ru/ adult acne] 
*[http://adlt-acne.boom.ru/ adult acne] 
*[http://acne-scar.newmail.ru/ acne scar] 
*[http://acne-scar.boom.ru/ acne scar] 
*[http://acne-rosacea.newmail.ru/ acne rosacea] 
*[http://acne-rosacea.boom.ru/ acne rosacea] 
*[http://acne-product.newmail.ru/ acne product] 
*[http://acne-product.boom.ru/ acne product] 
*[http://acne-medicine.newmail.ru/ acne medicine] 
*[http://acne-medicine.boom.ru/ acne medicine] 
*[http://acne-treatment.newmail.ru/ acne treatment] 
*[http://acne-treatment.boom.ru/ acne treatment] 
*[http://wine-gift.newmail.ru/ wine gift] 
*[http://wine-gift.boom.ru/ wine gift] 
*[http://wine-clubs.newmail.ru/ wine clubs] 
*[http://wine-clubs.boom.ru/ wine clubs] 
*[http://mon-wine-club.newmail.ru/ monthly wine club] 
*[http://wine-club.boom.ru/ wine club] 
*[http://wine-1club.newmail.ru/ wine club] 
*[http://sauna-heater.boom.ru/ sauna heater] 
*[http://sauna-heater.newmail.ru/ sauna heater] 
*[http://sauna-room.boom.ru/ sauna room] 
*[http://sauna-room.newmail.ru/ sauna room] 
*[http://home-sauna.boom.ru/ home sauna] 
*[http://home-sauna.newmail.ru/ home sauna] 
*[http://sauna-kit.newmail.ru/ sauna kit] 
*[http://sauna-kit.boom.ru/ sauna kit] 
*[http://sauna-eq.boom.ru/ sauna equipment] 
*[http://sauna-eq.newmail.ru/ sauna equipment] 
*[http://paper-s.boom.ru/ paper shredder] 
*[http://pp-shredd.boom.ru/ paper shredder] 
*[http://paper-shredder.newmail.ru/ paper shredder] 
*[http://paper1-shredder.boom.ru/ paper shredder] 
*[http://skin1-disease.newmail.ru/ skin disease] 
*[http://skin1-disease.boom.ru/ skin disease] 
*[http://skin-trt.boom.ru/ skin treatment] 
*[http://skin-treat.newmail.ru/ skin treatment] 
*[http://skin-treat.boom.ru/ skin treatment] 
*[http://skin-treatment.nm.ru/ skin treatment] 
*[http://wrinkle.newmail.ru/ wrinkle cream] 
*[http://wrinkle.boom.ru/ anti wrinkle cream] 
*[http://chp-ciga.newmail.ru/ cheap cigarette] 
*[http://chp-ciga.boom.ru/ cheap cigarette] 
*[http://disc-ciga.newmail.ru/ cigarette discount] 
*[http://disc-ciga.boom.ru/ cigarette discount] 
*[http://marlb-ciga.newmail.ru/ marlboro cigarette] 
*[http://marlb-ciga.boom.ru/ marlboro cigarettes] 
*[http://cheap1-cigarettes.newmail.ru/ cheap cigarettes] 
*[http://glucometer.newmail.ru/ blood glucose monitor] 
*[http://gluc-mon.boom.ru/ blood glucose monitor] 
*[http://blood-monitor.newmail.ru/ blood glucose monitor] 
*[http://blglmon.boom.ru/ blood glucose monitor] 
*[http://shredder.boom.ru/ paper shredder] 
*[http://skin-treatment.newmail.ru/ skin treatment] 
*[http://skin-disease.newmail.ru/ skin disease] 
*[http://skin-treatment.boom.ru/ skin treatment] 
*[http://skin-disease.boom.ru/ skin disease] 
*[http://paper-shredders.newmail.ru/ paper shredder] 
*[http://club-month.boom.ru/ club month] 
*[http://glucose1monitor.chat.ru/ blood glucose monitor] 
*[http://glucose-monitor.boom.ru/ blood glucose monitor] 
*[http://glucose-monitor.newmail.ru/ blood glucose monitor] 
*[http://smoke-now.boom.ru/ cheap cigarettes] 
*[http://michigan-attorney.lbgo.com/ Michigan attorney] 
*[http://zt-marlb.boom.ru/ discount cigarettes] 
*[http://web100.boom.ru/ marlboro cigarettes] 
*[http://z100.boom.ru/ marlboro cigarettes] 
*[http://buy-cig.boom.ru/ buy cigarettes] 
*[http://newport-cig.boom.ru/ newport cigarettes] 
*[http://camel-cig.boom.ru/ camel cigarettes] 
*[http://online-cig.boom.ru/ online cigarettes] 
*[http://marlb-cig.boom.ru/ marlboro cigarettes] 
*[http://discount-cig.boom.ru/ discount cigarettes] 
*[http://christmas-idea1.boom.ru/ christmas gift idea] 
*[http://christmas-idea.boom.ru/ christmas idea] 
*[http://christmas-shop.boom.ru/ christmas shopping] 
*[http://christmas-prsnt.boom.ru/ christmas present] 
*[http://cigarettes-all.lbgo.com/ cheap cigarettes] 
*[http://unique-gift.newmail.ru/ unique gift] 
*[http://man-gift.newmail.ru/ the man the gift] 
*[http://gift-idea.newmail.ru/ gift idea] 
*[http://corporate-gift.newmail.ru/ corporate gift] 
*[http://gift-idea-man.newmail.ru/ gift idea for man] 
*[http://christmas-gift.newmail.ru/ christmas gift] 
*[http://business-gift.newmail.ru/ business gift] 
*[http://gift-fruit.newmail.ru/ gift fruit] 
*[http://food-gift-b.newmail.ru/ food gift basket] 
*[http://gift-box.newmail.ru/ gift box] 
*[http://corporate-gift-b.newmail.ru/ corporate gift basket] 
*[http://golf-gift.newmail.ru/ golf gift] 
*[http://gift-for-man.newmail.ru/ gift for man] 
*[http://holiday-gift.newmail.ru/ holiday gift] 
*[http://gift-bag.newmail.ru/ gift bag] 
*[http://promotional-gift.newmail.ru/ promotional gift] 
*[http://baby-gift.newmail.ru/ baby gift] 
*[http://kool-cig.boom.ru/ kool cigarettes] 
*[http://free-cig.newmail.ru/ free cigarettes] 
*[http://cigarette-store.newmail.ru/ cigarettes store] 
*[http://newport-cig.newmail.ru/ newport cigarettes] 
*[http://winston-cig.newmail.ru/ winston cigarettes] 
*[http://online-cig.newmail.ru/ online cigarettes] 
*[http://marlb-cigarette.newmail.ru/ marlboro cigarettes] 
*[http://camel-cig.newmail.ru/ camel cigarettes] 
*[http://yt15.boom.ru/ discount cigarettes] 
*[http://xw0.boom.ru/ cheap cigarettes] 
*[http://newport-cigarette.newmail.ru/ newport cigarette] 
*[http://kool-cigarette.newmail.ru/ kool cigarette] 
*[http://salem-cigarette.newmail.ru/ salem cigarette] 
*[http://wholesale-cigarette.nm.ru/ wholesale cigarette] 
*[http://tax-free-cigarette.newmail.ru/ tax free cigarette] 
*[http://parliament-cigarette.nm.ru/ parliament cigarettes] 
*[http://all-cigarette.nm.ru/ cigarettes] 
*[http://my-cigarette.nm.ru/ cigarettes] 
*[http://tires.newmail.ru/ tires] 
*[http://best-cigarette.nm.ru/ cigarettes] 
*[http://best-cigarette.newmail.ru/ cigarettes] 
*[http://all-cigarette.newmail.ru/ cigarettes] 
*[http://new-cigarette.newmail.ru/ cigarettes] 
*[http://cigarette-new.newmail.ru/ cigarettes] 
*[http://all-cigarettes.newmail.ru/ cigarettes] 
*[http://new-cigarettes.nm.ru/ cigarettes] 
*[http://all-cigarettes.nm.ru/ cigarettes] 
*[http://cheap-cigarettes.hotmail.ru/ cigarettes] 
*[http://cheap-cigarettes.nm.ru/ cigarettes] 
*[http://cigarettes.nightmail.ru/ cigarettes] 
*[http://parliament-cigar.boom.ru/ parliament cigarettes] 
*[http://best-attorney.boom.ru/ attorney] 
*[http://online-prozac.boom.ru/ prozac] 
*[http://cigarette4all.chat.ru/ cigarette] 
*[http://cigarette4u.chat.ru/ cigarettes] 
*[http://cigarettes4u.chat.ru/ cigarettes] 
*[http://didrex1.chat.ru/ didrex] 
*[http://cigarettes4free.chat.ru/ cigarettes] 
*[http://cigarettes1.chat.ru/ cigarettes] 
*[http://divorceuncont.chat.ru/ divorce uncontested] 
*[http://nydivorce.chat.ru/ divorce new york] 
*[http://divorce1advice.chat.ru/ advice divorce] 
*[http://divorce1form.chat.ru/ divorce form] 
*[http://divorce1help.chat.ru/ divorce help] 
*[http://ncarolinadivorce.chat.ru/ carolina divorce north] 
*[http://floridadivorce.chat.ru/ divorce florida] 
*[http://camelcigarette.chat.ru/ camel cigarette] 
*[http://onlinecigarette.chat.ru/ online cigarette] 
*[http://free1cigarette.chat.ru/ duty free cigarette] 
*[http://discount1cigaret.chat.ru/ cigarette discount] 
*[http://marlb1cigarette.chat.ru/ marlboro cigarette] 
*[http://cheap1cigarette.chat.ru/ cheap cigarette] 
*[http://wmutualmortgage.chat.ru/ washington mutual mortgage] 
*[http://calif1mortgage.chat.ru/ california mortgage] 
*[http://mortgage1lead.chat.ru/ mortgage lead] 
*[http://ameriqmortgage.chat.ru/ ameriquest mortgage] 
*[http://lowmortgagerate.chat.ru/ lowest mortgage rate] 
*[http://disney1vacation.chat.ru/ disney vacation] 
*[http://coloradovacation.chat.ru/ colorado vacation] 
*[http://califvacation.chat.ru/ california vacation] 
*[http://vacationpackage.chat.ru/ package vacation] 
*[http://italyvacation.chat.ru/ italy vacation] 
*[http://skivacation.chat.ru/ ski vacation] 
*[http://alaskavacation.chat.ru/ alaska vacation] 
*[http://resortvacation.chat.ru/ resort vacation] 
*[http://tropicalvacation.chat.ru/ tropical vacation] 
*[http://spavacation.chat.ru/ spa vacation] 
*[http://disneyvacation.chat.ru/ disney vacation world] 
*[http://floridavacation.chat.ru/ florida vacation] 
*[http://jamaicavacation.chat.ru/ jamaica vacation] 
*[http://cruise1vacation.chat.ru/ cruise vacation] 
*[http://golfvacation.chat.ru/ golf vacation] 
*[http://caribbeanvac.chat.ru/ caribbean vacation] 
*[http://tennesseevac.chat.ru/ tennessee vacation] 
*[http://vacationvermont.chat.ru/ vacation vermont] 
*[http://canadavacation.chat.ru/ canada vacation] 
*[http://arizonavacation.chat.ru/ arizona vacation] 
*[http://cheapvacation.chat.ru/ cheap vacation] 
*[http://ncarolinvacation.chat.ru/ carolina north vacation] 
*[http://bahamasvacation.chat.ru/ bahamas vacation] 
*[http://beachvacation.chat.ru/ beach vacation] 
*[http://mexicovacation.chat.ru/ mexico vacation] 
*[http://orlandovacation.chat.ru/ orlando vacation] 
*[http://laketahoevac.chat.ru/ lake rental tahoe vacation] 
*[http://homevacation.chat.ru/ home vacation] 
*[http://vacationvegas.chat.ru/ vacation vegas] 
*[http://hawaiivacation.chat.ru/ hawaii vacation] 
*[http://homeequityloanr.chat.ru/ home equity loan rate] 
*[http://fastloan.chat.ru/ fast loan] 
*[http://carloan.chat.ru/ car loan] 
*[http://bcrloanmortgage.chat.ru/ bad credit loan mortgage] 
*[http://fastcashloan.chat.ru/ fast cash loan] 
*[http://debtconsloan.chat.ru/ debt consolidation loan] 
*[http://cashloan.chat.ru/ cash loan] 
*[http://bcreditautoloan.chat.ru/ bad credit auto loan] 
*[http://personalloan.chat.ru/ personal loan] 
*[http://vahomeloan.chat.ru/ va home loan] 
*[http://homeloanmortgage.chat.ru/ a home loan mortgage] 
*[http://cashadvanceloan.chat.ru/ cash advance loan] 
*[http://unsecuredploan.chat.ru/ unsecured personal loan] 
*[http://improvementloan.chat.ru/ home improvement loan] 
*[http://bcreditcarloan.chat.ru/ bad credit car loan] 
*[http://badcreditloan1.chat.ru/ bad credit loan] 
*[http://badcreditloan.chat.ru/ bad credit loan] 
*[http://pdloanonline.chat.ru/ payday loan online] 
*[http://fhaloan.chat.ru/ fha loan] 
*[http://mortgageloan.chat.ru/ mortgage loan] 
*[http://nfpaydayloan.chat.ru/ no faxing payday loan] 
*[http://floridahomeloan.chat.ru/ florida home loan] 
*[http://consolidloan.chat.ru/ consolidation loan] 
*[http://countryhomeloan.chat.ru/ countrywide home loan] 
*[http://refinanceloan.chat.ru/ refinance loan] 
*[http://valoan.chat.ru/ va loan] 
*[http://chomeloan.chat.ru/ california home loan] 
*[http://homeequityloan.chat.ru/ home equity loan] 
*[http://eloancom.chat.ru/ e loan] 
*[http://travel2mexico.chat.ru/ travel to mexico] 
*[http://travelinsurance.chat.ru/ travel insurance] 
*[http://studenttravel.chat.ru/ student travel] 
*[http://traveleurope.chat.ru/ travel europe] 
*[http://travel2hawaii.chat.ru/ travel to hawaii] 
*[http://caribbeantravel.chat.ru/ caribbean travel] 
*[http://traveldeal.chat.ru/ travel deal] 
*[http://budgettravel.chat.ru/ budget travel] 
*[http://discounttravel.chat.ru/ discount travel] 
*[http://travelsite.chat.ru/ travel site] 
*[http://businesstravel.chat.ru/ business travel] 
*[http://world1travel.chat.ru/ world travel] 
*[http://intertravel.chat.ru/ international travel] 
*[http://travel1agency.chat.ru/ travel agency] 
*[http://travelreservatio.chat.ru/ travel reservation] 
*[http://cheaptravel.chat.ru/ cheap travel] 
*[http://lastminutetravel.chat.ru/ last minute travel] 
*[http://airlinetravel.chat.ru/ airline travel] 
*[http://travelnursing.chat.ru/ travel nursing] 
*[http://italytravel.chat.ru/ italy travel] 
*[http://cruise1travel.chat.ru/ cruise travel] 
*[http://travel2costarica.chat.ru/ travel to costa rica] 
*[http://travelagent.chat.ru/ travel agent] 
*[http://cruiseholiday.chat.ru/ cruise holiday] 
*[http://starcruise.chat.ru/ star cruise] 
*[http://galvestoncruises.chat.ru/ galveston cruises] 
*[http://celebritycruisel.chat.ru/ celebrity cruise line] 
*[http://neworleanscruise.chat.ru/ new orleans cruises] 
*[http://luxurycruise.chat.ru/ luxury cruise] 
*[http://nilecruises.chat.ru/ nile cruises] 
*[http://disneycruisel.chat.ru/ disney cruise line] 
*[http://carnivalcruisel.chat.ru/ carnival cruise line] 
*[http://cruisereview.chat.ru/ cruise review] 
*[http://cruisepackage.chat.ru/ cruise package] 
*[http://caribbeancruisel.chat.ru/ caribbean cruise line] 
*[http://europecruise.chat.ru/ europe cruise] 
*[http://bermudacruise.chat.ru/ bermuda cruise] 
*[http://mexicocruise.chat.ru/ mexico cruise] 
*[http://bahamascruise.chat.ru/ bahamas cruise] 
*[http://familycruises.chat.ru/ family cruises] 
*[http://hamericacruises.chat.ru/ holland america cruises] 
*[http://disneycruise.chat.ru/ disney cruise] 
*[http://cruisevacation.chat.ru/ cruise vacation] 
*[http://hawaiicruises.chat.ru/ hawaii cruise] 
*[http://cheapcruise.chat.ru/ cheap cruise] 
*[http://newyorkcruises.chat.ru/ new york cruises] 
*[http://carnivalcruises.chat.ru/ carnival cruise ship] 
*[http://alaskacruise.chat.ru/ alaska cruise] 
*[http://cruisespecial.chat.ru/ cruise special] 
*[http://lastminutecruise.chat.ru/ last minute cruise] 
*[http://celebritycruise.chat.ru/ celebrity cruise] 
*[http://cruiseeuropean.chat.ru/ cruise european] 
*[http://honeymooncruise.chat.ru/ honeymoon cruise] 
*[http://discountcruises.chat.ru/ discount cruises] 
*[http://cruiseship.chat.ru/ cruise ship] 
*[http://cruiseline.chat.ru/ cruise line] 
*[http://norwegiancruise.chat.ru/ norwegian cruise] 
*[http://cruiseprincess.chat.ru/ cruise princess] 
*[http://cruisedeal.chat.ru/ cruise deal] 
*[http://norwegiancruisel.chat.ru/ norwegian cruise line] 
*[http://carnivalcruise.chat.ru/ carnival cruise] 
*[http://caribbeancruise.chat.ru/ caribbean cruise] 
*[http://cruisetravel.chat.ru/ cruise travel] 
*[http://pcruiseline.chat.ru/ princess cruise line] 
*[http://panama1cruise.chat.ru/ panama canal cruise] 
*[http://medit1cruise.chat.ru/ mediterranean cruise] 
*[http://radissoncruise.chat.ru/ radisson cruise] 
*[http://costacruises.chat.ru/ costa cruises] 
*[http://crystal1cruise.chat.ru/ crystal cruise] 
*[http://bloodmpressure.boom.ru/ blood medication pressure] 
*[http://blood-opressure.boom.ru/ blood omron pressure] 
*[http://bloodlpressure.boom.ru/ blood lower pressure] 
*[http://career-nursing.boom.ru/ career nursing] 
*[http://blood-pressure-m.boom.ru/ blood monitor pressure] 
*[http://blood-h-pressure.boom.ru/ blood diet high pressure] 
*[http://degree-nursing.boom.ru/ degree nursing] 
*[http://college-nursing.boom.ru/ college nursing] 
*[http://healthinsurances.chat.ru/ self employed health insurance] 
*[http://auto1insuranceo.chat.ru/ auto insurance online] 
*[http://ahealthinsurance.chat.ru/ affordable health insurance] 
*[http://lifeinsurancer.chat.ru/ life insurance rate] 
*[http://lifeinsurancec.chat.ru/ life insurance company] 
*[http://cautoinsurance1.chat.ru/ cheap auto insurance] 
*[http://lifeinsurancep.chat.ru/ life insurance policy] 
*[http://tlifeinsuranceq.chat.ru/ term life insurance quote] 
*[http://car1insurances.chat.ru/ car insurance company] 
*[http://life1insuranceq.chat.ru/ life insurance quote] 
*[http://healthiplan.chat.ru/ health insurance plan] 
*[http://mercuryinsurance.chat.ru/ mercury insurance] 
*[http://home1insurance.chat.ru/ homeowner insurance] 
*[http://health2insurance.chat.ru/ health insurance coverage] 
*[http://ainsurancerate.chat.ru/ auto insurance rate] 
*[http://carinsurrate.chat.ru/ car insurance rate] 
*[http://cautoinsurance.chat.ru/ california auto insurance] 
*[http://cigarettes1com.chat.ru/ ] 
*[http://rentersinsurance.chat.ru/ renters insurance] 
*[http://insurance5.chat.ru/ online life insurance] 
*[http://hinsurancelead.chat.ru/ health insurance lead] 
*[http://lcost1insurance.chat.ru/ low cost health insurance] 
*[http://healthinsuranceq.chat.ru/ health insurance quote] 
*[http://health1insurance.chat.ru/ california health insurance] 
*[http://dallasattorney.chat.ru/ dallas attorney] 
*[http://nyattorney.chat.ru/ new york attorney] 
*[http://illinoisattorney.chat.ru/ illinois attorney] 
*[http://floridaattorney.chat.ru/ florida attorney] 
*[http://califattorney.chat.ru/ california attorney] 
*[http://sdiego1attorney.chat.ru/ san diego attorney] 
*[http://malpattorney.chat.ru/ malpractice attorney] 
*[http://personal4attorne.chat.ru/ personal injury attorney] 
*[http://la1attorney.chat.ru/ los angeles attorney] 
*[http://sanfr1attorney.chat.ru/ san francisco attorney] 
*[http://michiganattorney.chat.ru/ michigan attorney] 
*[http://duiattorney.chat.ru/ dui attorney] 
*[http://ciga4discount.chat.ru/ cigarette discount] 
*[http://c-auto-insh.boom.ru/ california auto insurance] 
*[http://chealth-insur.boom.ru/ california health insurance] 
*[http://cig-sale.boom.ru/ cigarette sale] 
*[http://cheapcigarettes.chat.ru/ cheap cigarette] 
*[http://marlborocigarett.chat.ru/ marlboro cigarette] 
*[http://dui-attorney.boom.ru/ dui attorney] 
*[http://send-flower.boom.ru/ send flower] 
*[http://order-flower.boom.ru/ order flower] 
*[http://flower-arrange.boom.ru/ flower arrangement] 
*[http://birthday-flower.boom.ru/ birthday flower] 
*[http://flower-shop.boom.ru/ flower shop] 
*[http://a-1-800-flower.boom.ru/ 1 800 flower] 
*[http://flower-delivery.boom.ru/ flower delivery] 
*[http://toyota-tundra.boom.ru/ toyota tundra] 
*[http://toyota-sequoia.boom.ru/ toyota sequoia] 
*[http://toyotalandcruise.boom.ru/ toyota land cruiser] 
*[http://toyota-sienna.boom.ru/ toyota sienna] 
*[http://toyota-prius.boom.ru/ toyota prius] 
*[http://toyotadealership.boom.ru/ toyota dealership] 
*[http://toyota-dealer.boom.ru/ toyota dealerships] 
*[http://mexico-cruise.boom.ru/ mexico cruise] 
*[http://ny-cruises.boom.ru/ new york cruises] 
*[http://travel-francisco.boom.ru/ travel to san francisco] 
*[http://travel-to-alaska.boom.ru/ travel to alaska] 
*[http://travel-trailer.boom.ru/ travel trailer] 
*[http://travel-package.boom.ru/ travel package] 
*[http://ireland-travel.boom.ru/ ireland travel] 
*[http://firstclasstravel.boom.ru/ first class travel] 
*[http://student-travel.boom.ru/ student travel] 
*[http://adventuretravel.boom.ru/ adventure travel] 
*[http://travel-europe.boom.ru/ travel europe] 
*[http://luxury-travel.boom.ru/ luxury travel] 
*[http://vegas-travel.boom.ru/ vegas travel] 
*[http://travel-guide.boom.ru/ travel guide] 
*[http://inter-travel.boom.ru/ international travel] 
*[http://tire-plus.boom.ru/ tire plus] 
*[http://motorcycle-tire.boom.ru/ motorcycle tire] 
*[http://off-road-tire.boom.ru/ off road tire] 
*[http://tire-wh-package.boom.ru/ tire and wheel package] 
*[http://yokohama-tire.boom.ru/ yokohama tire] 
*[http://tire-dealer.boom.ru/ tire dealer] 
*[http://nitto-tire.boom.ru/ nitto tire] 
*[http://discount-tire.boom.ru/ discount tire] 
*[http://car-tire.boom.ru/ car tire] 
*[http://atv-tire.boom.ru/ atv tire] 
*[http://truck-tire.boom.ru/ truck tire] 
*[http://firestone-tire.boom.ru/ firestone tire] 
*[http://trailer-tire.boom.ru/ trailer tire] 
*[http://goodrich-tire.boom.ru/ bf goodrich tire] 
*[http://bridgestone-tire.boom.ru/ bridgestone tire] 
*[http://goodyear-tire.boom.ru/ goodyear tire] 
*[http://tire-wheels.boom.ru/ tire wheels] 
*[http://tire-rim.boom.ru/ tire rim] 
*[http://michelin-tire.boom.ru/ michelin tire] 
*[http://tire-rack.boom.ru/ tire rack] 
*[http://lastminutetrav.boom.ru/ last minute travel deal] 
*[http://travel-deal.boom.ru/ travel deal] 
*[http://sb-finance.boom.ru/ small business finance] 
*[http://budget-travel.boom.ru/ budget travel] 
*[http://travel-services.boom.ru/ travel services] 
*[http://sb-marketing.boom.ru/ small business marketing] 
*[http://sb-consultant.boom.ru/ small business consultant] 
*[http://sb-tool.boom.ru/ small business tool] 
*[http://travel-site.boom.ru/ travel site] 
*[http://sb-hosting.boom.ru/ small business hosting] 
*[http://travel-hotel.boom.ru/ travel hotel] 
*[http://tragency.boom.ru/ travel agency] 
*[http://travel-reserv.boom.ru/ travel reservation] 
*[http://caribbean-travel.boom.ru/ caribbean travel] 
*[http://sb-owner.boom.ru/ small business owner] 
*[http://sb-web-design.boom.ru/ small business web design] 
*[http://sb-development.boom.ru/ small business development] 
*[http://sb-idea.boom.ru/ small business idea] 
*[http://home-based-sb.boom.ru/ home based small business] 
*[http://small&amp;ndash;business.boom.ru/ small home business] 
*[http://sb-accounting.boom.ru/ small business accounting] 
*[http://gg-for-sb.boom.ru/ government grants for small business] 
*[http://sb-for-sale.boom.ru/ small business for sale] 
*[http://sb-credit.boom.ru/ small business credit] 
*[http://sb-plan.boom.ru/ small business plan] 
*[http://sb-grants.boom.ru/ small business grants] 
*[http://sb-start-up.boom.ru/ small business start up] 
*[http://sb-credit-card.boom.ru/ small business credit card] 
*[http://sb-franchise.boom.ru/ small business franchise] 
*[http://sb-startup.boom.ru/ small business startup] 
*[http://lastminutetravel.boom.ru/ last minute travel] 
*[http://sb-information.boom.ru/ small business information] 
*[http://sb-opportunity.boom.ru/ small business opportunity] 
*[http://sb-resource.boom.ru/ small business resource] 
*[http://web-hosting-sb.boom.ru/ web hosting small business] 
*[http://travel-agent.boom.ru/ travel agent] 
*[http://italytravel.boom.ru/ italy travel] 
*[http://sb-web-site.boom.ru/ small business web site] 
*[http://airline-travel.boom.ru/ airline travel] 
*[http://sb-solution.boom.ru/ small business solution] 
*[http://mso-sb.boom.ru/ microsoft office small business] 
*[http://travel-nursing.boom.ru/ travel nursing] 
*[http://sb-software.boom.ru/ small business software] 
*[http://discount-travel.boom.ru/ discount travel] 
*[http://starting-a-sb.boom.ru/ starting a small business] 
*[http://travel-to-hawaii.boom.ru/ travel to hawaii] 
*[http://how-start-sb.boom.ru/ how to start a small business] 
*[http://im-sb.boom.ru/ internet marketing for small business] 
*[http://sb-server.boom.ru/ small business server] 
*[http://sb-services.boom.ru/ small business services] 
*[http://sb-management.boom.ru/ small business management] 
*[http://callaway-ball.boom.ru/ callaway golf ball] 
*[http://callaway-bag.boom.ru/ callaway golf bag] 
*[http://callaway-steel.boom.ru/ callaway steelhead] 
*[http://callaway-golf.boom.ru/ callaway golf club] 
*[http://corelle-callaway.boom.ru/ corelle callaway] 
*[http://galvestoncruises.boom.ru/ galveston cruises] 
*[http://mediterranean.boom.ru/ mediterranean cruise] 
*[http://family-cruises.boom.ru/ family cruises] 
*[http://ccruise-ship.boom.ru/ carnival cruise ship] 
*[http://new-o-cruises.boom.ru/ new orleans cruises] 
*[http://italy-cruise.boom.ru/ italy cruise] 
*[http://cruise-review.boom.ru/ cruise review] 
*[http://caribbeancruisel.boom.ru/ caribbean cruise line] 
*[http://nile-cruises.boom.ru/ nile cruises] 
*[http://disney-cruisel.boom.ru/ disney cruise line] 
*[http://hawaii-cruise.boom.ru/ hawaii cruise] 
*[http://bahamas-cruise.boom.ru/ bahamas cruise] 
*[http://bermuda-cruise.boom.ru/ bermuda cruise] 
*[http://cruise-package.boom.ru/ cruise package] 
*[http://europe-cruise.boom.ru/ europe cruise] 
*[http://travel-costarica.boom.ru/ travel to costa rica] 
*[http://cruise-european.boom.ru/ cruise european] 
*[http://ha-cruises.boom.ru/ holland america cruises] 
*[http://luxury-cruise.boom.ru/ luxury cruise] 
*[http://lminute-cruise.boom.ru/ last minute cruise] 
*[http://cruise-special.boom.ru/ cruise special] 
*[http://hawaiian-cruises.boom.ru/ hawaiian cruises] 
*[http://honeymooncruise.boom.ru/ honeymoon cruise] 
*[http://n-cruise-line.boom.ru/ norwegian cruise line] 
*[http://cruise-line.boom.ru/ cruise line] 
*[http://norwegian-cruise.boom.ru/ norwegian cruise] 
*[http://carnival-cruisel.boom.ru/ carnival cruise line] 
*[http://p-cruise-line.boom.ru/ princess cruise line] 
*[http://cruise-deal.boom.ru/ cruise deal] 
*[http://re-advertising.boom.ru/ real estate advertising] 
*[http://costa-cruises.boom.ru/ costa cruises] 
*[http://carnival-cruise.boom.ru/ carnival cruise] 
*[http://caribbeancruise.boom.ru/ caribbean cruise] 
*[http://scuba-equipment.boom.ru/ scuba equipment] 
*[http://heavy-equipment.boom.ru/ heavy equipment] 
*[http://home-fitness-eq.boom.ru/ home fitness equipment] 
*[http://exe-equipment.boom.ru/ exercise equipment] 
*[http://eq-leasing.boom.ru/ equipment leasing] 
*[http://construction-eq.boom.ru/ construction equipment] 
*[http://surv-equipment.boom.ru/ surveillance equipment] 

'''   Let us introduce [http://final-page.nm.ru/pharmacy.htm Online Pharmacy] #1 on the web: [http://final-page.nm.ru/viagra.htm order VIAGRA online], [http://final-page.nm.ru/cialis.htm cialis]
 Also [http://final-page.nm.ru/phentermine.htm order phentermine online], [http://final-page.nm.ru/xanax.htm buy xanax], [http://final-page.nm.ru/diazepam.htm diazepam online],  [http://final-page.nm.ru/prosac.htm prozac online].

   Buy [http://final-page.nm.ru/cigarettes.htm Cheap cigarettes] online!

 Find your [http://final-page.nm.ru/newcar.htm new car] or  [http://final-page.nm.ru/usedcar.htm used car] online!

    Best searches: [http://first-page.nm.ru/hiq.htm Health insurance quotes], [http://first-page.nm.ru/ihi.htm Individual health insurance],  [http://first-page.nm.ru/ciq.htm Car insurance quotes], [http://first-page.nm.ru/sml.htm Second mortgage loan]

   Our [http://first-page.nm.ru/skin.htm skin treatment] tips and [http://first-page.nm.ru/wrinkle.htm anti wrinkle cream]!

'''</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Navboy</title>
    <id>2249</id>
    <revision>
      <id>5441</id>
      <timestamp>2002-07-30T15:55:15Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">--navboy :: Team Fragadelic &amp;ndash;

http://www.planetunreal.com/fragadelic/navboy/ 

http://www.planetunreal.com/fragadelic/ 

(I'ved moved the above from another page &amp;ndash; Tarquin)

Hi Navboy, welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.  &amp;ndash; ''Tarquin''

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5442</id>
      <timestamp>2002-07-06T13:56:15Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>Category Personal Page</comment>
      <text xml:space="preserve">Hi Navboy, welcome to the project :-)

I've added your name to the [[:Category:Legacy Personal Page]] page.  &amp;ndash; ''Tarquin''

[[Category:Legacy Personal Page|{{PAGENAME}}]]
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NavigationPoint</title>
    <id>2250</id>
    <revision>
      <id>5443</id>
      <timestamp>2007-07-27T13:39:07Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; NavigationPoint (Package: Engine)}}

''See also [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] for the Unreal Tournament class.''

Children of this class form the bot AI navigation system. During the compilation process, two navigation points get linked by paths if one of them is in the line of view of a bot which is located at the position of the other one and the bot could go there at least in one direction. Each [[Legacy:Pickup|Pickup]] and [[Legacy:PlayerStart|PlayerStart]] has its own NavigationPoint. The most common NavigationPoints are the [[Legacy:PathNode|PathNode]]s which simply are NavigationPoints which have a texture which makes it possible to put them in a map where the PathNodes build the backbone of the maps navigation system.

See the super topic page [[Legacy:Artificial Intelligence|Artificial Intelligence]], and the [[Legacy:Bot Support|Bot Support]] and [[Legacy:Bot Pathing|Bot Pathing]] pages for a technical overview.

==Properties==

===NavigationPoint Group===
; bool bAlwaysUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bBlocked : This path is currently unuseable.
; bool bNeverUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bOneWayPath : Reachspecs from this path only in the direction the path is facing. (180 degrees)
; bool bPropagatesSound : This navigation point can be used for sound propagation. (around corners)
; int ExtraCost : Extra weight added by level designer. Use this property to let the bots think a path is longer than it actually is.
; name ForcedPaths[4] : List of names of NavigationPoints which should always be connected from this path.
; name ProscribedPaths[4] : List of names of NavigationPoints which should never be connected from this path.

====UT2004:====
; bool bNoSuperSize: Hack for Leviathans, which pretend to be smaller than they really are to use the path network - this forces them not to use a path
; bool bVehicleDestination: If true, forced paths to this node will have max width to accomodate vehicles
; bool bMakeSourceOnly: When building paths, this navigation point will only act as a source, i.e. there are only paths away from it and none towards it.

===Hidden===
; bool bAutoBuilt (const) : Placed during execution of &quot;PATHS BUILD&quot;.
; bool bDestinationOnly : Used by path building &amp;ndash; means no automatically generated paths are sourced from this node.
; bool bEndPoint (transient) : used by C++ navigation code
; int bestPathWeight (const) : 
; bool bForceNoStrafing (const) : Override any level designer changes to bNeverUseStrafing.
; bool bMustBeReachable : Used for PathReview code.
; bool bNoAutoConnect : Don't connect this path to others except with special conditions. (used by LiftCenter, for example)
; bool bNotBased (const) : Used by path builder &amp;ndash; if true, no error is reported if node doesn't have a valid base.
; bool bPathsChanged (const) : Used for incremental path rebuilding in the editor.
; bool bSourceOnly : Used by path building &amp;ndash; means this node is not the destination of any automatically generated path.
; bool bSpecialForced : Paths that are forced should call the SpecialCost() and SuggestMovePreparation() functions.
; bool bSpecialMove : If true, pawn will call SuggestMovePreparation() when moving toward this node.
; bool bTransientEndPoint (transient) : Set right before a path finding attempt, cleared afterward.
; int cost : Added cost to visit this pathnode.
; int FearCost (transient) : Extra weight diminishing over time. (used for example, to mark path where bot died)
; [[Legacy:Pickup|Pickup]] InventoryCache : Used to point to dropped weapons.
; float InventoryDist : 
; NavigationPoint nextNavigationPoint (const) : 
; NavigationPoint nextOrdered (const) : for internal use during route searches
; array&lt;[[Legacy:ReachSpec|ReachSpec]]&gt; PathList (const) : Index of reachspecs. (used by C++ Navigation code)
; NavigationPoint previousPath (const) : 
; NavigationPoint prevOrdered (const) : for internal use during route searches
; bool taken : Set when a creature is occupying this spot
; int TransientCost (transient) : Added right before a path finding attempt, cleared afterward.
; int visitedWeight : 

====UT2004:====
; bool bFlyingPreferred : Preferred by flying creatures
; bool bForcedOnly : Only connect forced paths to this NavigationPoint
; bool bBlockable : True if path can become blocked (used by pruning during path building)
; bool bMayCausePain : Set in C++ if in PhysicsVolume that may cause pain
; bool bReceivePlayerToucherDiedNotify :
; bool bAlreadyVisited : Internal use (Used in path building?)
; byte BaseVisible[2] : Used by some team game types &amp;ndash; whether this point is visible from red/blue base or defense points
; float LastDetourWeight (const) :
; float BaseDist[2] : Used by some team game types &amp;ndash; distance to red/blue base
; bool bCanReach (transient) : Used during paths review in editor
; bool bHideEditorPaths (transient) : Don't show paths to this node in the editor
; vector MaxPathSize : Maximum distance to any other navigation point on the map.

==Methods==

===Inherited from [[Legacy:Actor|Actor]]===
;  PostBeginPlay ( ) : Ensures that ExtraCost is greater than 0.  [[Legacy:UT2004|UT2004]]: Sets MaxPathSize.

===New Methods===
; bool Accept ([[Legacy:Actor|Actor]] Incoming, [[Legacy:Actor|Actor]] Source) [event] : Accept an actor that has teleported in. Used for random spawning and initial placement of creatures.
; float DetourWeight ([[Legacy:Pawn|Pawn]] Other, float PathWeight) [event] : Value of this path to take a quick detour. (usually 0, used when on route to distant objective, but want to grab inventory for example)
; MoverClosed ( ) : Used by NavigationPoints associated with [[Legacy:Mover|mover]]s.
; MoverOpened ( ) : Used by NavigationPoints associated with [[Legacy:Mover|mover]]s.
; bool ProceedWithMove ([[Legacy:Pawn|Pawn]] Other) : Called by [[Legacy:Controller|Controller]] to see if move is now possible when a mover reports to the waiting pawn that it has completed its move.
; int SpecialCost ([[Legacy:Pawn|Pawn]] Seeker, ReachSpec Path) [event] : 
; bool SuggestMovePreparation ([[Legacy:Pawn|Pawn]] Other) [event] : Optionally tell Pawn any special instructions to prepare for moving to this goal. (called by Pawn.PrepareForMove() if this node's bSpecialMove==true)

====UT2004 ====
; SetBaseDistance (int BaseNum) [native, final] : (set BaseDist property?)
; SetBaseVisibility (int BaseNum) : Go through all NavigationPoints in the level and set their BaseVisible properties depending on whether the BaseNum base can be seen from that point.
; PlayerToucherDied ([[Legacy:Pawn|Pawn]] P) : Called when a pawn which was touching this NavigationPoint dies (Needed for HoldObjectives)

==Known Subclasses==
 NavigationPoint
  +- [[Legacy:AssaultPath|AssaultPath]]
  +- [[Legacy:BlockedPath|BlockedPath]]
  +- [[Legacy:Door|Door]]
  |   +- AutoDoor
  +- [[Legacy:JumpDest|JumpDest]]
  |   +- [[Legacy:JumpSpot|JumpSpot]]
  |       +- [[Legacy:GameObjective|GameObjective]]
  |           +- [[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]] (UT2004 only)
  |           +- [[Legacy:CTFBase|CTFBase]]
  |           |   +- [[Legacy:XRealCTFBase|xRealCTFBase]]
  |           |       +- [[Legacy:XBlueFlagBase|xBlueFlagBase]]
  |           |       +- [[Legacy:XRedFlagBase|xRedFlagBase]]
  |           +- [[Legacy:DestroyableObjective|DestroyableObjective]]
  |               +- [[Legacy:DestroyableObjective_SM|DestroyableObjective_SM]] (UT2004 only)
  |               +- [[Legacy:ONSPowerCore|ONSPowerCore]] (UT2004 only)
  |                   +- [[Legacy:ONSPowerCoreBlue|ONSPowerCoreBlue]]
  |                   +- [[Legacy:ONSPowerCoreRed|ONSPowerCoreRed]]
  |                   +- [[Legacy:ONSPowerNode|ONSPowerNode]]
  |                       +- [[Legacy:ONSPowerNodeNeutral|ONSPowerNodeNeutral]]
  |           +- [[Legacy:DominationPoint|DominationPoint]]
  |           |   +- [[Legacy:XDomPoint|xDomPoint]]
  |           |       +- [[Legacy:XDomPointA|xDomPointA]]
  |           |       +- [[Legacy:XDomPointB|xDomPointB]]
  |           +- [[Legacy:LockedObjective|LockedObjective]] (UT2003 only)
  |           +- [[Legacy:ProximityObjective|ProximityObjective]] (UT2004 only)
  |               +- [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]]
  |               +- [[Legacy:HoldObjective|HoldObjective]]
  |               +- [[Legacy:LockedObjective|LockedObjective]]
  |               +- [[Legacy:UseObjective|UseObjective]]
  |           +- [[Legacy:TriggeredObjective|TriggeredObjective]]
  |           +- [[Legacy:XBombDelivery|xBombDelivery]]
  |           +- [[Legacy:XBombSpawn|xBombSpawn]]
  +- [[Legacy:JumpPad|JumpPad]]
  |   +- [[Legacy:UTJumpPad|UTJumpPad]]
  +- [[Legacy:LiftCenter|LiftCenter]]
  +- [[Legacy:LiftExit|LiftExit]]
  +- [[Legacy:PathNode|PathNode]]
  |   +- [[Legacy:FlyingPathNode|FlyingPathNode]] (UT2004)
  |   +- [[Legacy:RoadPathNode|RoadPathNode]] (UT2004)
  |       +- [[Legacy:HoverPathNode|HoverPathNode]] (UT2004)
  |       +- [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] (UT2004)
  +- [[Legacy:ShootSpot|ShootSpot]]
  |   +- [[Legacy:BlueShootSpot|BlueShootSpot]]
  |   +- [[Legacy:RedShootSpot|RedShootSpot]]
  +- SmallNavigationPoint ''(abstract, no additional properties)''
      +- [[Legacy:AIMarker|AIMarker]]
      +- [[Legacy:InventorySpot|InventorySpot]]
      +- [[Legacy:Ladder|Ladder]]
      |   +- AutoLadder
      +- [[Legacy:PlayerStart|PlayerStart]]
      |   +- [[Legacy:TriggeredPlayerStart|TriggeredPlayerStart]]
      |   +- [[Legacy:XFieldPlayerStart|xFieldPlayerStart]]
      +- [[Legacy:Teleporter|Teleporter]]
      +- [[Legacy:WarpZoneMarker|WarpZoneMarker]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of the bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Placing PlayerStart|Placing PlayerStart]]
* [[Legacy:Inventory Item Placement|Inventory Item Placement]]
* [[Legacy:Map Design|Map Design]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5444</id>
      <timestamp>2005-11-22T20:23:38Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>no need to document changes on the page itself</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; NavigationPoint (Package: Engine)}}

''See also [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]]''

Children of this class form the bot AI navigation system. During the compilation process, two navigation points get linked by paths if one of them is in the line of view of a bot which is located at the position of the other one and the bot could go there at least in one direction. Each [[Legacy:Pickup (UT)|Pickup (UT)]] and [[Legacy:PlayerStart|PlayerStart]] has its own NavigationPoint. The most common NavigationPoints are the [[Legacy:PathNode|PathNode]]s which simply are NavigationPoints which have a texture which makes it possible to put them in a map where the PathNodes build the backbone of the maps navigation system.

See the super topic page [[Legacy:Artificial Intelligence|Artificial Intelligence]], and the [[Legacy:Bot Support|Bot Support]] and [[Legacy:Bot Pathing|Bot Pathing]] pages for a technical overview.

==Properties==

===NavigationPoint Group===
; bool bAlwaysUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bBlocked : This path is currently unuseable.
; bool bNeverUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bOneWayPath : Reachspecs from this path only in the direction the path is facing. (180 degrees)
; bool bPropagatesSound : This navigation point can be used for sound propagation. (around corners)
; int ExtraCost : Extra weight added by level designer. Use this property to let the bots think a path is longer than it actually is.
; name ForcedPaths[4] : List of names of NavigationPoints which should always be connected from this path.
; name ProscribedPaths[4] : List of names of NavigationPoints which should never be connected from this path.

====UT2004:====
; bool bNoSuperSize: Hack for Leviathans, which pretend to be smaller than they really are to use the path network - this forces them not to use a path
; bool bVehicleDestination: If true, forced paths to this node will have max width to accomodate vehicles
; bool bMakeSourceOnly: When building paths, this navigation point will only act as a source, i.e. there are only paths away from it and none towards it.

===Hidden===
; bool bAutoBuilt (const) : Placed during execution of &quot;PATHS BUILD&quot;.
; bool bDestinationOnly : Used by path building &amp;ndash; means no automatically generated paths are sourced from this node.
; bool bEndPoint (transient) : used by C++ navigation code
; int bestPathWeight (const) : 
; bool bForceNoStrafing (const) : Override any level designer changes to bNeverUseStrafing.
; bool bMustBeReachable : Used for PathReview code.
; bool bNoAutoConnect : Don't connect this path to others except with special conditions. (used by LiftCenter, for example)
; bool bNotBased (const) : Used by path builder &amp;ndash; if true, no error is reported if node doesn't have a valid base.
; bool bPathsChanged (const) : Used for incremental path rebuilding in the editor.
; bool bSourceOnly : Used by path building &amp;ndash; means this node is not the destination of any automatically generated path.
; bool bSpecialForced : Paths that are forced should call the SpecialCost() and SuggestMovePreparation() functions.
; bool bSpecialMove : If true, pawn will call SuggestMovePreparation() when moving toward this node.
; bool bTransientEndPoint (transient) : Set right before a path finding attempt, cleared afterward.
; int cost : Added cost to visit this pathnode.
; int FearCost (transient) : Extra weight diminishing over time. (used for example, to mark path where bot died)
; Pickup InventoryCache : Used to point to dropped weapons.
; float InventoryDist : 
; NavigationPoint nextNavigationPoint (const) : 
; NavigationPoint nextOrdered (const) : for internal use during route searches
; array&lt;ReachSpec&gt; PathList (const) : Index of reachspecs. (used by C++ Navigation code)
; NavigationPoint previousPath (const) : 
; NavigationPoint prevOrdered (const) : for internal use during route searches
; bool taken : Set when a creature is occupying this spot
; int TransientCost (transient) : Added right before a path finding attempt, cleared afterward.
; int visitedWeight : 

====UT2004:====
; bool bFlyingPreferred : Preferred by flying creatures
; bool bForcedOnly : Only connect forced paths to this NavigationPoint
; bool bBlockable : True if path can become blocked (used by pruning during path building)
; bool bMayCausePain : Set in C++ if in PhysicsVolume that may cause pain
; bool bReceivePlayerToucherDiedNotify :
; bool bAlreadyVisited : Internal use (Used in path building?)
; byte BaseVisible[2] : Used by some team game types &amp;ndash; whether this point is visible from red/blue base or defense points
; float LastDetourWeight (const) :
; float BaseDist[2] : Used by some team game types &amp;ndash; distance to red/blue base
; bool bCanReach (transient) : Used during paths review in editor
; bool bHideEditorPaths (transient) : Don't show paths to this node in the editor
; vector MaxPathSize : Maximum distance to any other navigation point on the map.

==Methods==

===Inherited from [[Legacy:Actor|Actor]]===
;  PostBeginPlay ( ) : Ensures that ExtraCost is greater than 0.  [[Legacy:UT2004|UT2004]]: Sets MaxPathSize.

===New Methods===
; bool Accept ([[Legacy:Actor|Actor]] Incoming, [[Legacy:Actor|Actor]] Source) [event] : Accept an actor that has teleported in. Used for random spawning and initial placement of creatures.
; float DetourWeight ([[Legacy:Pawn|Pawn]] Other, float PathWeight) [event] : Value of this path to take a quick detour. (usually 0, used when on route to distant objective, but want to grab inventory for example)
; MoverClosed ( ) : Used by NavigationPoints associated with [[Legacy:Mover|mover]]s.
; MoverOpened ( ) : Used by NavigationPoints associated with [[Legacy:Mover|mover]]s.
; bool ProceedWithMove ([[Legacy:Pawn|Pawn]] Other) : Called by [[Legacy:Controller|Controller]] to see if move is now possible when a mover reports to the waiting pawn that it has completed its move.
; int SpecialCost ([[Legacy:Pawn|Pawn]] Seeker, ReachSpec Path) [event] : 
; bool SuggestMovePreparation ([[Legacy:Pawn|Pawn]] Other) [event] : Optionally tell Pawn any special instructions to prepare for moving to this goal. (called by Pawn.PrepareForMove() if this node's bSpecialMove==true)

====UT2004 ====
; SetBaseDistance (int BaseNum) [native] [final] : (set BaseDist property?)
; SetBaseVisibility (int BaseNum) : Go through all NavigationPoints in the level and set their BaseVisible properties depending on whether the BaseNum base can be seen from that point.
; PlayerToucherDied ([[Legacy:Pawn|Pawn]] P) : Called when a pawn which was touching this NavigationPoint dies (Needed for HoldObjectives)

==Known Subclasses==
 NavigationPoint
  +- [[Legacy:AssaultPath|AssaultPath]]
  +- [[Legacy:BlockedPath|BlockedPath]]
  +- [[Legacy:Door|Door]]
  |   +- [[Legacy:AutoDoor|AutoDoor]]
  +- [[Legacy:JumpDest|JumpDest]]
  |   +- [[Legacy:JumpSpot|JumpSpot]]
  |       +- [[Legacy:GameObjective|GameObjective]]
  |           +- [[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]] (UT2004 only)
  |           +- [[Legacy:CTFBase|CTFBase]]
  |           |   +- [[Legacy:XRealCTFBase|xRealCTFBase]]
  |           |       +- [[Legacy:XBlueFlagBase|xBlueFlagBase]]
  |           |       +- [[Legacy:XRedFlagBase|xRedFlagBase]]
  |           +- [[Legacy:DestroyableObjective|DestroyableObjective]]
  |               +- [[Legacy:DestroyableObjective_SM|DestroyableObjective_SM]] (UT2004 only)
  |               +- [[Legacy:ONSPowerCore|ONSPowerCore]] (UT2004 only)
  |                   +- [[Legacy:ONSPowerCoreBlue|ONSPowerCoreBlue]]
  |                   +- [[Legacy:ONSPowerCoreRed|ONSPowerCoreRed]]
  |                   +- [[Legacy:ONSPowerNode|ONSPowerNode]]
  |                       +- [[Legacy:ONSPowerNodeNeutral|ONSPowerNodeNeutral]]
  |           +- [[Legacy:DominationPoint|DominationPoint]]
  |           |   +- [[Legacy:XDomPoint|xDomPoint]]
  |           |       +- [[Legacy:XDomPointA|xDomPointA]]
  |           |       +- [[Legacy:XDomPointB|xDomPointB]]
  |           +- [[Legacy:LockedObjective|LockedObjective]] (UT2003 only)
  |           +- [[Legacy:ProximityObjective|ProximityObjective]] (UT2004 only)
  |               +- [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]]
  |               +- [[Legacy:HoldObjective|HoldObjective]]
  |               +- [[Legacy:LockedObjective|LockedObjective]]
  |               +- [[Legacy:UseObjective|UseObjective]]
  |           +- [[Legacy:TriggeredObjective|TriggeredObjective]]
  |           +- [[Legacy:XBombDelivery|xBombDelivery]]
  |           +- [[Legacy:XBombSpawn|xBombSpawn]]
  +- [[Legacy:JumpPad|JumpPad]]
  |   +- [[Legacy:UTJumpPad|UTJumpPad]]
  +- [[Legacy:LiftCenter|LiftCenter]]
  +- [[Legacy:LiftExit (UT)|LiftExit (UT)]]
  +- [[Legacy:PathNode|PathNode]]
  |   +- [[Legacy:FlyingPathNode|FlyingPathNode]] (UT2004)
  |   +- [[Legacy:RoadPathNode|RoadPathNode]] (UT2004)
  |       +- [[Legacy:HoverPathNode|HoverPathNode]] (UT2004)
  |       +- [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] (UT2004)
  +- [[Legacy:ShootSpot|ShootSpot]]
  |   +- [[Legacy:BlueShootSpot|BlueShootSpot]]
  |   +- [[Legacy:RedShootSpot|RedShootSpot]]
  +- [[Legacy:SmallNavigationPoint|SmallNavigationPoint]]
      +- [[Legacy:AIMarker|AIMarker]]
      +- [[Legacy:InventorySpot|InventorySpot]]
      +- [[Legacy:Ladder (UT)|Ladder (UT)]]
      |   +- [[Legacy:AutoLadder|AutoLadder]]
      +- [[Legacy:PlayerStart|PlayerStart]]
      |   +- [[Legacy:TriggeredPlayerStart|TriggeredPlayerStart]]
      |   +- [[Legacy:XFieldPlayerStart|xFieldPlayerStart]]
      +- [[Legacy:Teleporter|Teleporter]]
      +- [[Legacy:WarpZoneMarker|WarpZoneMarker]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of the bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Placing PlayerStart|Placing PlayerStart]]
* [[Legacy:Inventory Item Placement|Inventory Item Placement]]
* [[Legacy:Map Design|Map Design]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5445</id>
      <timestamp>2006-09-12T21:30:21Z</timestamp>
      <contributor>
        <ip>192.251.69.13</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; NavigationPoint (Package: Engine)}}

''See also [[Legacy:NavigationPoint (UT)|NavigationPoint (UT)]] for the Unreal Tournament class.''

Children of this class form the bot AI navigation system. During the compilation process, two navigation points get linked by paths if one of them is in the line of view of a bot which is located at the position of the other one and the bot could go there at least in one direction. Each [[Legacy:Pickup|Pickup]] and [[Legacy:PlayerStart|PlayerStart]] has its own NavigationPoint. The most common NavigationPoints are the [[Legacy:PathNode|PathNode]]s which simply are NavigationPoints which have a texture which makes it possible to put them in a map where the PathNodes build the backbone of the maps navigation system.

See the super topic page [[Legacy:Artificial Intelligence|Artificial Intelligence]], and the [[Legacy:Bot Support|Bot Support]] and [[Legacy:Bot Pathing|Bot Pathing]] pages for a technical overview.

==Properties==

===NavigationPoint Group===
; bool bAlwaysUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bBlocked : This path is currently unuseable.
; bool bNeverUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bOneWayPath : Reachspecs from this path only in the direction the path is facing. (180 degrees)
; bool bPropagatesSound : This navigation point can be used for sound propagation. (around corners)
; int ExtraCost : Extra weight added by level designer. Use this property to let the bots think a path is longer than it actually is.
; name ForcedPaths[4] : List of names of NavigationPoints which should always be connected from this path.
; name ProscribedPaths[4] : List of names of NavigationPoints which should never be connected from this path.

====UT2004:====
; bool bNoSuperSize: Hack for Leviathans, which pretend to be smaller than they really are to use the path network - this forces them not to use a path
; bool bVehicleDestination: If true, forced paths to this node will have max width to accomodate vehicles
; bool bMakeSourceOnly: When building paths, this navigation point will only act as a source, i.e. there are only paths away from it and none towards it.

===Hidden===
; bool bAutoBuilt (const) : Placed during execution of &quot;PATHS BUILD&quot;.
; bool bDestinationOnly : Used by path building &amp;ndash; means no automatically generated paths are sourced from this node.
; bool bEndPoint (transient) : used by C++ navigation code
; int bestPathWeight (const) : 
; bool bForceNoStrafing (const) : Override any level designer changes to bNeverUseStrafing.
; bool bMustBeReachable : Used for PathReview code.
; bool bNoAutoConnect : Don't connect this path to others except with special conditions. (used by LiftCenter, for example)
; bool bNotBased (const) : Used by path builder &amp;ndash; if true, no error is reported if node doesn't have a valid base.
; bool bPathsChanged (const) : Used for incremental path rebuilding in the editor.
; bool bSourceOnly : Used by path building &amp;ndash; means this node is not the destination of any automatically generated path.
; bool bSpecialForced : Paths that are forced should call the SpecialCost() and SuggestMovePreparation() functions.
; bool bSpecialMove : If true, pawn will call SuggestMovePreparation() when moving toward this node.
; bool bTransientEndPoint (transient) : Set right before a path finding attempt, cleared afterward.
; int cost : Added cost to visit this pathnode.
; int FearCost (transient) : Extra weight diminishing over time. (used for example, to mark path where bot died)
; [[Legacy:Pickup|Pickup]] InventoryCache : Used to point to dropped weapons.
; float InventoryDist : 
; NavigationPoint nextNavigationPoint (const) : 
; NavigationPoint nextOrdered (const) : for internal use during route searches
; array&lt;[[Legacy:ReachSpec|ReachSpec]]&gt; PathList (const) : Index of reachspecs. (used by C++ Navigation code)
; NavigationPoint previousPath (const) : 
; NavigationPoint prevOrdered (const) : for internal use during route searches
; bool taken : Set when a creature is occupying this spot
; int TransientCost (transient) : Added right before a path finding attempt, cleared afterward.
; int visitedWeight : 

====UT2004:====
; bool bFlyingPreferred : Preferred by flying creatures
; bool bForcedOnly : Only connect forced paths to this NavigationPoint
; bool bBlockable : True if path can become blocked (used by pruning during path building)
; bool bMayCausePain : Set in C++ if in PhysicsVolume that may cause pain
; bool bReceivePlayerToucherDiedNotify :
; bool bAlreadyVisited : Internal use (Used in path building?)
; byte BaseVisible[2] : Used by some team game types &amp;ndash; whether this point is visible from red/blue base or defense points
; float LastDetourWeight (const) :
; float BaseDist[2] : Used by some team game types &amp;ndash; distance to red/blue base
; bool bCanReach (transient) : Used during paths review in editor
; bool bHideEditorPaths (transient) : Don't show paths to this node in the editor
; vector MaxPathSize : Maximum distance to any other navigation point on the map.

==Methods==

===Inherited from [[Legacy:Actor|Actor]]===
;  PostBeginPlay ( ) : Ensures that ExtraCost is greater than 0.  [[Legacy:UT2004|UT2004]]: Sets MaxPathSize.

===New Methods===
; bool Accept ([[Legacy:Actor|Actor]] Incoming, [[Legacy:Actor|Actor]] Source) [event] : Accept an actor that has teleported in. Used for random spawning and initial placement of creatures.
; float DetourWeight ([[Legacy:Pawn|Pawn]] Other, float PathWeight) [event] : Value of this path to take a quick detour. (usually 0, used when on route to distant objective, but want to grab inventory for example)
; MoverClosed ( ) : Used by NavigationPoints associated with [[Legacy:Mover|mover]]s.
; MoverOpened ( ) : Used by NavigationPoints associated with [[Legacy:Mover|mover]]s.
; bool ProceedWithMove ([[Legacy:Pawn|Pawn]] Other) : Called by [[Legacy:Controller|Controller]] to see if move is now possible when a mover reports to the waiting pawn that it has completed its move.
; int SpecialCost ([[Legacy:Pawn|Pawn]] Seeker, ReachSpec Path) [event] : 
; bool SuggestMovePreparation ([[Legacy:Pawn|Pawn]] Other) [event] : Optionally tell Pawn any special instructions to prepare for moving to this goal. (called by Pawn.PrepareForMove() if this node's bSpecialMove==true)

====UT2004 ====
; SetBaseDistance (int BaseNum) [native, final] : (set BaseDist property?)
; SetBaseVisibility (int BaseNum) : Go through all NavigationPoints in the level and set their BaseVisible properties depending on whether the BaseNum base can be seen from that point.
; PlayerToucherDied ([[Legacy:Pawn|Pawn]] P) : Called when a pawn which was touching this NavigationPoint dies (Needed for HoldObjectives)

==Known Subclasses==
 NavigationPoint
  +- [[Legacy:AssaultPath|AssaultPath]]
  +- [[Legacy:BlockedPath|BlockedPath]]
  +- [[Legacy:Door|Door]]
  |   +- [[Legacy:AutoDoor|AutoDoor]]
  +- [[Legacy:JumpDest|JumpDest]]
  |   +- [[Legacy:JumpSpot|JumpSpot]]
  |       +- [[Legacy:GameObjective|GameObjective]]
  |           +- [[Legacy:ASOBJ_EnergyCore_Spawn|ASOBJ_EnergyCore_Spawn]] (UT2004 only)
  |           +- [[Legacy:CTFBase|CTFBase]]
  |           |   +- [[Legacy:XRealCTFBase|xRealCTFBase]]
  |           |       +- [[Legacy:XBlueFlagBase|xBlueFlagBase]]
  |           |       +- [[Legacy:XRedFlagBase|xRedFlagBase]]
  |           +- [[Legacy:DestroyableObjective|DestroyableObjective]]
  |               +- [[Legacy:DestroyableObjective_SM|DestroyableObjective_SM]] (UT2004 only)
  |               +- [[Legacy:ONSPowerCore|ONSPowerCore]] (UT2004 only)
  |                   +- [[Legacy:ONSPowerCoreBlue|ONSPowerCoreBlue]]
  |                   +- [[Legacy:ONSPowerCoreRed|ONSPowerCoreRed]]
  |                   +- [[Legacy:ONSPowerNode|ONSPowerNode]]
  |                       +- [[Legacy:ONSPowerNodeNeutral|ONSPowerNodeNeutral]]
  |           +- [[Legacy:DominationPoint|DominationPoint]]
  |           |   +- [[Legacy:XDomPoint|xDomPoint]]
  |           |       +- [[Legacy:XDomPointA|xDomPointA]]
  |           |       +- [[Legacy:XDomPointB|xDomPointB]]
  |           +- [[Legacy:LockedObjective|LockedObjective]] (UT2003 only)
  |           +- [[Legacy:ProximityObjective|ProximityObjective]] (UT2004 only)
  |               +- [[Legacy:ASOBJ_EnergyCore_Delivery|ASOBJ_EnergyCore_Delivery]]
  |               +- [[Legacy:HoldObjective|HoldObjective]]
  |               +- [[Legacy:LockedObjective|LockedObjective]]
  |               +- [[Legacy:UseObjective|UseObjective]]
  |           +- [[Legacy:TriggeredObjective|TriggeredObjective]]
  |           +- [[Legacy:XBombDelivery|xBombDelivery]]
  |           +- [[Legacy:XBombSpawn|xBombSpawn]]
  +- [[Legacy:JumpPad|JumpPad]]
  |   +- [[Legacy:UTJumpPad|UTJumpPad]]
  +- [[Legacy:LiftCenter|LiftCenter]]
  +- [[Legacy:LiftExit|LiftExit]]
  +- [[Legacy:PathNode|PathNode]]
  |   +- [[Legacy:FlyingPathNode|FlyingPathNode]] (UT2004)
  |   +- [[Legacy:RoadPathNode|RoadPathNode]] (UT2004)
  |       +- [[Legacy:HoverPathNode|HoverPathNode]] (UT2004)
  |       +- [[Legacy:SpecialVehicleObjective|SpecialVehicleObjective]] (UT2004)
  +- [[Legacy:ShootSpot|ShootSpot]]
  |   +- [[Legacy:BlueShootSpot|BlueShootSpot]]
  |   +- [[Legacy:RedShootSpot|RedShootSpot]]
  +- [[Legacy:SmallNavigationPoint|SmallNavigationPoint]]
      +- [[Legacy:AIMarker|AIMarker]]
      +- [[Legacy:InventorySpot|InventorySpot]]
      +- [[Legacy:Ladder (UT)|Ladder (UT)]]
      |   +- [[Legacy:AutoLadder|AutoLadder]]
      +- [[Legacy:PlayerStart|PlayerStart]]
      |   +- [[Legacy:TriggeredPlayerStart|TriggeredPlayerStart]]
      |   +- [[Legacy:XFieldPlayerStart|xFieldPlayerStart]]
      +- [[Legacy:Teleporter|Teleporter]]
      +- [[Legacy:WarpZoneMarker|WarpZoneMarker]]

==Related Topics==
* [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Bot Support|Bot Support]] &amp;ndash; Main hub for bot support
** [[Legacy:Bot Pathing|Bot Pathing]] &amp;ndash; Concepts and elements of the bot path network
*** [[Legacy:Basic Bot Pathing|Basic Bot Pathing]] &amp;ndash; A tutorial on basic bot pathing
** [[Legacy:Strategic Bots|Strategic Bots]] &amp;ndash; Advanced bot support
** [[Legacy:Bot Mind|Bot Mind]] &amp;ndash; Understanding the bots
** [[Legacy:Testing Botplay|Testing Botplay]] &amp;ndash; Ensuring reliable bot support
* [[Legacy:Placing PlayerStart|Placing PlayerStart]]
* [[Legacy:Inventory Item Placement|Inventory Item Placement]]
* [[Legacy:Map Design|Map Design]]

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]
[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NavigationPoint (UT)</title>
    <id>2280</id>
    <revision>
      <id>5511</id>
      <timestamp>2005-11-17T02:02:35Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; NavigationPoint (Package: Engine)}}

Children of this class form the bot AI navigation system. During the compilation process, two navigation points get linked by paths if one of them is in the line of view of a bot which is located at the position of the other one and the bot could go there at least in one direction. Each [[Legacy:Pickup (UT)|Pickup (UT)]] and [[Legacy:PlayerStart|PlayerStart]] has its own NavigationPoint. The most common NavigationPoints are the [[Legacy:PathNode|PathNode]]s which simply are NavigationPoints which have a texture which makes it possible to put them in a map where the PathNodes build the backbone of the maps navigation system.

See [[Legacy:NavigationPoint|NavigationPoint]] for the UT200x version of this class.

See the super topic page [[Legacy:Artificial Intelligence|Artificial Intelligence]], and [[Legacy:Bot Support|Bot Support]] and [[Legacy:Bot Pathing|Bot Pathing]] for a technical overview.

[[Image:Legacy_NavigationPointExamples.jpeg|center|Different types of NavigationPoint with the paths between them showing in UnrealEd]]

==Properties ==

===NavigationPoint Group===
; bool bNeverUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bOneWayPath : Reachspecs from this path only in the direction the path is facing. (180 degrees)
; bool bPlayerOnly : Only players should use this path.
; int ExtraCost : 
; name ownerTeam : Creature clan owning this area. (area visible from this point)

===Hidden===
; bool bAutoBuilt : Placed during execution of &quot;PATHS BUILD&quot;.
; bool bEndPoint : Used by C++ navigation code.
; bool bEndPointOnly : Only used as an endpoint in routing network.
; int bestPathWeight (const) : 
; bool bSpecialCost : If true, navigation code will call SpecialCost function for this navigation point.
; bool bTwoWay : Hacked here to fix CTF problems post release. (used by Botpack.[[Legacy:AlternatePath|AlternatePath]])
; int cost : Added cost to visit this pathnode.
; NavigationPoint nextNavigationPoint (const) : Next NavigationPoint in the [[Legacy:Linked List|Linked List]] of the map's NavigationPoints.
; NavigationPoint nextOrdered (const) : 
; int Paths[16] : Holds indices of paths (reachspecs) that lead from this node directly to another node. (Used by C++ Navigation code.)
; NavigationPoint previousPath (const) : 
; NavigationPoint prevOrdered (const) : 
; int PrunedPaths[16] : Appears to hold indices of paths that are not displayed in the editor because they are not significantly more efficient than a series of shorter paths. For instance, consider three nodes &amp;ndash; PathNode0, PathNode1, and PathNode2 &amp;ndash; placed in a straight-line formation, with PathNode1 at the center. Although PathNode2 may be close enough that it could be directly reached from PathNode0, in practice a bot would go from PathNode0 first to PathNode1, then on to PathNode2. Thus the path from PathNode0 to PathNode1 will go into the former's Paths[] array, while the path from PathNode0 to PathNode2 will go into the PrunedPaths[] array. I'm not sure at the moment exactly how these paths are used, as opposed to how standard Paths[] are used, because there aren't any references to PrunedPaths[] in UnrealScript, except to define the array. It's only used by the C++ navigation code.
; [[Legacy:Actor|Actor]] routeCache : 
; NavigationPoint startPath (const) : 
; bool taken : Set when a creature is occupying this spot.
; int upstreamPaths[16] : Holds indices of paths that lead to this node directly from another node. (Used by C++ navigation code.)
; int visitedWeight : 
; NavigationPoint VisNoReachPaths[16] : Paths that are visible but not directly reachable.

==Methods==
; bool Accept ([[Legacy:Actor|Actor]] Incoming, [[Legacy:Actor|Actor]] Source) [event] : Accept an actor that has teleported in. Used for random spawning and initial placement of creatures.
; describeSpec (int iSpec, out [[Legacy:Actor|Actor]] Start, out [[Legacy:Actor|Actor]] End, out int ReachFlags, out int Distance) [native, final] : 
; PlayTeleportEffect ([[Legacy:Actor|Actor]] Incoming, bool bOut) : 
; int SpecialCost ([[Legacy:Pawn|Pawn]] Seeker) [event] : 

==Known subclasses ==

For a list of these grouped by usage with a summary, see [[Legacy:NavigationPoint|NavigationPoint]].
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:AmbushPoint|AmbushPoint]]
** [[Legacy:DefensePoint|DefensePoint]]
* [[Legacy:AssaultRandomizer|AssaultRandomizer]]
* [[Legacy:BlockedPath|BlockedPath]]
* ''ButtonMarker'' &amp;ndash; Broken actor; don't use.
* [[Legacy:ControlPoint|ControlPoint]]
* [[Legacy:FlagBase|FlagBase]]
* [[Legacy:HomeBase|HomeBase]]
* [[Legacy:InventorySpot|InventorySpot]] &amp;ndash; Automatically placed by the game; don't use.
* [[Legacy:LiftCenter (UT)|LiftCenter (UT)]]
** [[Legacy:JumpSpot (UT)|JumpSpot (UT)]]
** [[Legacy:PainPath|PainPath]]
** [[Legacy:TranslocDest|TranslocDest]]
* [[Legacy:LiftExit (UT)|LiftExit (UT)]]
** [[Legacy:TranslocStart|TranslocStart]]
* [[Legacy:PathNode|PathNode]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:PlayerStart|PlayerStart]]
* [[Legacy:QueenDest|QueenDest]]
* [[Legacy:SpawnPoint|SpawnPoint]]
* [[Legacy:Teleporter|Teleporter]]
** [[Legacy:DelayedTeleporter|DelayedTeleporter]] (custom class)
** [[Legacy:FavoritesTeleporter|FavoritesTeleporter]]
** [[Legacy:VisibleTeleporter|VisibleTeleporter]]
** [[Legacy:YawTeleporter|YawTeleporter]] (custom class)
* [[Legacy:Transporter|Transporter]]
* ''TriggerMarker'' &amp;ndash; Broken actor; don't use.
* ''WarpZoneMarker'' &amp;ndash; Automatically placed by the game; don't use.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5512</id>
      <timestamp>2004-03-15T10:22:54Z</timestamp>
      <contributor>
        <ip>64-216-188-86.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>LiftCenter link no longer leads to UT2003's LiftCenter.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; NavigationPoint (Package: Engine)}}

Children of this class form the bot AI navigation system. During the compilation process, two navigation points get linked by paths if one of them is in the line of view of a bot which is located at the position of the other one and the bot could go there at least in one direction. Each [[Legacy:Pickup (UT)|Pickup (UT)]] and [[Legacy:PlayerStart|PlayerStart]] has its own NavigationPoint. The most common NavigationPoints are the [[Legacy:PathNode|PathNode]]s which simply are NavigationPoints which have a texture which makes it possible to put them in a map where the PathNodes build the backbone of the maps navigation system.

See the main [[Legacy:Artificial Intelligence|Artificial Intelligence]] topic page, and [[Legacy:Bot Navigation|bot navigation]] for a technical overview.

See [[Legacy:NavigationPoint|NavigationPoint]] for the UT2003 version of this class.

[[Image:Legacy_NavigationPointExamples.jpeg|center|Different types of NavigationPoint with the paths between them showing in UnrealEd]]

==Properties ==

===NavigationPoint Group===
; bool bNeverUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bOneWayPath : Reachspecs from this path only in the direction the path is facing. (180 degrees)
; bool bPlayerOnly : Only players should use this path.
; int ExtraCost : 
; name ownerTeam : Creature clan owning this area. (area visible from this point)

===Hidden===
; bool bAutoBuilt : Placed during execution of &quot;PATHS BUILD&quot;.
; bool bEndPoint : Used by C++ navigation code.
; bool bEndPointOnly : Only used as an endpoint in routing network.
; int bestPathWeight (const) : 
; bool bSpecialCost : If true, navigation code will call SpecialCost function for this navigation point.
; bool bTwoWay : Hacked here to fix CTF problems post release. (used by Botpack.[[Legacy:AlternatePath|AlternatePath]])
; int cost : Added cost to visit this pathnode.
; NavigationPoint nextNavigationPoint (const) : Next NavigationPoint in the [[Legacy:Linked List|Linked List]] of the map's NavigationPoints.
; NavigationPoint nextOrdered (const) : 
; int Paths[16] : Index of reachspecs (used by C++ Navigation code)
; NavigationPoint previousPath (const) : 
; NavigationPoint prevOrdered (const) : 
; int PrunedPaths[16] : 
; [[Legacy:Actor|Actor]] routeCache : 
; NavigationPoint startPath (const) : 
; bool taken : Set when a creature is occupying this spot.
; int upstreamPaths[16] : 
; int visitedWeight : 
; NavigationPoint VisNoReachPaths[16] : Paths that are visible but not directly reachable.

==Methods==
; bool Accept ([[Legacy:Actor|Actor]] Incoming, [[Legacy:Actor|Actor]] Source) [event] : Accept an actor that has teleported in. Used for random spawning and initial placement of creatures.
; describeSpec (int iSpec, out [[Legacy:Actor|Actor]] Start, out [[Legacy:Actor|Actor]] End, out int ReachFlags, out int Distance) [native, final] : 
; PlayTeleportEffect ([[Legacy:Actor|Actor]] Incoming, bool bOut) : 
; int SpecialCost ([[Legacy:Pawn|Pawn]] Seeker) [event] : 

==Known subclasses ==

For a list of these grouped by usage with a summary, see [[Legacy:Types Of Pathnode|Types of Pathnode]].
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:AmbushPoint|AmbushPoint]]
** [[Legacy:DefensePoint|DefensePoint]]
* [[Legacy:AssaultRandomizer|AssaultRandomizer]]
* [[Legacy:BlockedPath|BlockedPath]]
* ''ButtonMarker'' &amp;ndash; Broken actor; don't use.
* [[Legacy:ControlPoint|ControlPoint]]
* [[Legacy:FlagBase|FlagBase]]
* [[Legacy:HomeBase|HomeBase]]
* [[Legacy:InventorySpot|InventorySpot]] &amp;ndash; Automatically placed by the game; don't use.
* [[Legacy:LiftCenter (UT)|LiftCenter (UT)]]
** [[Legacy:JumpSpot|JumpSpot]]
** [[Legacy:PainPath|PainPath]]
** [[Legacy:TranslocDest|TranslocDest]]
* [[Legacy:LiftExit (UT)|LiftExit (UT)]]
** [[Legacy:TranslocStart|TranslocStart]]
* [[Legacy:PathNode|PathNode]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:PlayerStart|PlayerStart]]
* [[Legacy:QueenDest|QueenDest]]
* [[Legacy:SpawnPoint|SpawnPoint]]
* [[Legacy:Teleporter|Teleporter]]
** [[Legacy:DelayedTeleporter|DelayedTeleporter]] (custom class)
** [[Legacy:FavoritesTeleporter|FavoritesTeleporter]]
** [[Legacy:VisibleTeleporter|VisibleTeleporter]]
** [[Legacy:YawTeleporter|YawTeleporter]] (custom class)
* [[Legacy:Transporter|Transporter]]
* ''TriggerMarker'' &amp;ndash; Broken actor; don't use.
* ''WarpZoneMarker'' &amp;ndash; Automatically placed by the game; don't use.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5513</id>
      <timestamp>2004-06-22T10:15:25Z</timestamp>
      <contributor>
        <ip>64-216-188-204.ded.swbell.net</ip>
      </contributor>
      <minor/>
      <comment>&quot;JumpSpot&quot; is now a link to a UT class.</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; NavigationPoint (Package: Engine)}}

Children of this class form the bot AI navigation system. During the compilation process, two navigation points get linked by paths if one of them is in the line of view of a bot which is located at the position of the other one and the bot could go there at least in one direction. Each [[Legacy:Pickup (UT)|Pickup (UT)]] and [[Legacy:PlayerStart|PlayerStart]] has its own NavigationPoint. The most common NavigationPoints are the [[Legacy:PathNode|PathNode]]s which simply are NavigationPoints which have a texture which makes it possible to put them in a map where the PathNodes build the backbone of the maps navigation system.

See the main [[Legacy:Artificial Intelligence|Artificial Intelligence]] topic page, and [[Legacy:Bot Navigation|bot navigation]] for a technical overview.

See [[Legacy:NavigationPoint|NavigationPoint]] for the UT2003 version of this class.

[[Image:Legacy_NavigationPointExamples.jpeg|center|Different types of NavigationPoint with the paths between them showing in UnrealEd]]

==Properties ==

===NavigationPoint Group===
; bool bNeverUseStrafing : Shouldn't use bAdvancedTactics going to this point.
; bool bOneWayPath : Reachspecs from this path only in the direction the path is facing. (180 degrees)
; bool bPlayerOnly : Only players should use this path.
; int ExtraCost : 
; name ownerTeam : Creature clan owning this area. (area visible from this point)

===Hidden===
; bool bAutoBuilt : Placed during execution of &quot;PATHS BUILD&quot;.
; bool bEndPoint : Used by C++ navigation code.
; bool bEndPointOnly : Only used as an endpoint in routing network.
; int bestPathWeight (const) : 
; bool bSpecialCost : If true, navigation code will call SpecialCost function for this navigation point.
; bool bTwoWay : Hacked here to fix CTF problems post release. (used by Botpack.[[Legacy:AlternatePath|AlternatePath]])
; int cost : Added cost to visit this pathnode.
; NavigationPoint nextNavigationPoint (const) : Next NavigationPoint in the [[Legacy:Linked List|Linked List]] of the map's NavigationPoints.
; NavigationPoint nextOrdered (const) : 
; int Paths[16] : Holds indices of paths (reachspecs) that lead from this node directly to another node. (Used by C++ Navigation code.)
; NavigationPoint previousPath (const) : 
; NavigationPoint prevOrdered (const) : 
; int PrunedPaths[16] : Appears to hold indices of paths that are not displayed in the editor because they are not significantly more efficient than a series of shorter paths. For instance, consider three nodes &amp;ndash; PathNode0, PathNode1, and PathNode2 &amp;ndash; placed in a straight-line formation, with PathNode1 at the center. Although PathNode2 may be close enough that it could be directly reached from PathNode0, in practice a bot would go from PathNode0 first to PathNode1, then on to PathNode2. Thus the path from PathNode0 to PathNode1 will go into the former's Paths[] array, while the path from PathNode0 to PathNode2 will go into the PrunedPaths[] array. I'm not sure at the moment exactly how these paths are used, as opposed to how standard Paths[] are used, because there aren't any references to PrunedPaths[] in UnrealScript, except to define the array. It's only used by the C++ navigation code.
; [[Legacy:Actor|Actor]] routeCache : 
; NavigationPoint startPath (const) : 
; bool taken : Set when a creature is occupying this spot.
; int upstreamPaths[16] : Holds indices of paths that lead to this node directly from another node. (Used by C++ navigation code.)
; int visitedWeight : 
; NavigationPoint VisNoReachPaths[16] : Paths that are visible but not directly reachable.

==Methods==
; bool Accept ([[Legacy:Actor|Actor]] Incoming, [[Legacy:Actor|Actor]] Source) [event] : Accept an actor that has teleported in. Used for random spawning and initial placement of creatures.
; describeSpec (int iSpec, out [[Legacy:Actor|Actor]] Start, out [[Legacy:Actor|Actor]] End, out int ReachFlags, out int Distance) [native, final] : 
; PlayTeleportEffect ([[Legacy:Actor|Actor]] Incoming, bool bOut) : 
; int SpecialCost ([[Legacy:Pawn|Pawn]] Seeker) [event] : 

==Known subclasses ==

For a list of these grouped by usage with a summary, see [[Legacy:Types Of Pathnode|Types of Pathnode]].
* [[Legacy:AlarmPoint|AlarmPoint]]
* [[Legacy:AlternatePath|AlternatePath]]
* [[Legacy:AmbushPoint|AmbushPoint]]
** [[Legacy:DefensePoint|DefensePoint]]
* [[Legacy:AssaultRandomizer|AssaultRandomizer]]
* [[Legacy:BlockedPath|BlockedPath]]
* ''ButtonMarker'' &amp;ndash; Broken actor; don't use.
* [[Legacy:ControlPoint|ControlPoint]]
* [[Legacy:FlagBase|FlagBase]]
* [[Legacy:HomeBase|HomeBase]]
* [[Legacy:InventorySpot|InventorySpot]] &amp;ndash; Automatically placed by the game; don't use.
* [[Legacy:LiftCenter (UT)|LiftCenter (UT)]]
** [[Legacy:JumpSpot (UT)|JumpSpot (UT)]]
** [[Legacy:PainPath|PainPath]]
** [[Legacy:TranslocDest|TranslocDest]]
* [[Legacy:LiftExit (UT)|LiftExit (UT)]]
** [[Legacy:TranslocStart|TranslocStart]]
* [[Legacy:PathNode|PathNode]]
* [[Legacy:PatrolPoint|PatrolPoint]]
* [[Legacy:PlayerStart|PlayerStart]]
* [[Legacy:QueenDest|QueenDest]]
* [[Legacy:SpawnPoint|SpawnPoint]]
* [[Legacy:Teleporter|Teleporter]]
** [[Legacy:DelayedTeleporter|DelayedTeleporter]] (custom class)
** [[Legacy:FavoritesTeleporter|FavoritesTeleporter]]
** [[Legacy:VisibleTeleporter|VisibleTeleporter]]
** [[Legacy:YawTeleporter|YawTeleporter]] (custom class)
* [[Legacy:Transporter|Transporter]]
* ''TriggerMarker'' &amp;ndash; Broken actor; don't use.
* ''WarpZoneMarker'' &amp;ndash; Automatically placed by the game; don't use.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]
[[Category:Legacy Class Tree|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nemesisd</title>
    <id>2311</id>
    <revision>
      <id>5573</id>
      <timestamp>2006-12-17T13:43:42Z</timestamp>
      <contributor>
        <ip>Nemesisd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Personal Page]]

'''''Name:''''' Yuriy Slobodyanyuk

'''''Nickname:''''' Nemesisd

'''''Age:''''' 18

'''''Country:''''' Ukraine

'''''Languages:''''' Ukrainian, Russian, English, Poland

'''''STATUS:''''' now working on a Total Conversion of Unreal Tournament 2004 - [http://blackghost.g2mods.net Black Ghost: War Of One], as modeller, 2d artist and lead designer. 

'''''My mail:''''' aknemes@yahoo.com and earndaru@rambler.ru

'''''ICQ:''''' 242-640-326

Some of my maps (soon released):
* DM-HazmatArena it's a big cube with 4 floors and big hole in a center.
* DM-Monk when I'd creating this map I looked on Deck-16.
* CTF-Lima6 formated lava.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5574</id>
      <timestamp>2006-12-10T10:19:59Z</timestamp>
      <contributor>
        <ip>Nemesisd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[:Category:Legacy Personal Page]]

'''''Name:''''' Yuriy Slobodyanyuk

'''''Nickname:''''' Nemesisd

'''''Age:''''' 18

'''''Country:''''' Ukraine

'''''Languages:''''' Ukrainian, Russian, English, Poland

'''''STATUS:''''' now working on a Total Conversion of [http://blackghost.g2mods.net S.W.A.T. 4 - Black Ghost: War Of One], as modeller, 2d artist and lead designer. 

'''''My mail:''''' aknemes@yahoo.com and earndaru@rambler.ru

'''''ICQ:''''' 242-640-326
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Neo Reloaded</title>
    <id>2297</id>
    <revision>
      <id>5544</id>
      <timestamp>2006-10-01T19:46:10Z</timestamp>
      <contributor>
        <ip>NeoReloaded</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Yo...
  I've been making maps for UT2003 for a while now . I've started out with the 

DM-Quadroid tutorial and later turned it into a larger map. I also created DM-Omega, and am now working on CTF-Coret (a UT2003 remake). I'm learning new mapping techniques while I make maps, and I think I'll become a great mapper. 

AIM:BobbleHeadJB

UT2003 Name:{F.U.}(Fraggers United, the clan that I manage)Neo_Reloaded

'''EntropicLqd:''' Hi welcome to the Wiki - enjoy your stay.  I hope you found the DM-Quadroid tutorials useful.  I apologise now for never finishing them.  Some of the ''mapping theory'' topics on the Wiki are excellent reads.

'''Neo Reloaded:''' Thanks.

'''NeoReloaded''' Wow...it's been a looong time lol.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5545</id>
      <timestamp>2004-05-20T16:24:30Z</timestamp>
      <contributor>
        <ip>Neo Reloaded</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Yo...
  I've been making maps for UT2003 for a while now . I've started out with the 

DM-Quadroid tutorial and later turned it into a larger map. I also created DM-Omega, and am now working on CTF-Coret (a UT2003 remake). I'm learning new mapping techniques while I make maps, and I think I'll become a great mapper. 

AIM:BobbleHeadJB

UT2003 Name:{F.U.}(Fraggers United, the clan that I manage)Neo_Reloaded

'''EntropicLqd:''' Hi welcome to the Wiki - enjoy your stay.  I hope you found the DM-Quadroid tutorials useful.  I apologise now for never finishing them.  Some of the ''mapping theory'' topics on the Wiki are excellent reads.

----

[[:Category:Legacy Personal Page]]

'''Neo Reloaded:''' Thanks.
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NeoLuTioN/Developer Journal</title>
    <id>2289</id>
    <revision>
      <id>5529</id>
      <timestamp>2003-08-05T09:51:58Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">===NeoLuTioN===

'''&quot;Reality is that which when we stop believing fails to go away&quot;'''

----

==Me==

To start off with i'm completely new to unreal scripting

I've done my fair share of c++, java, python, etc. but i've never really made a game beyond simple tetris (a gruelling school project in c++ that was completely annoying). However a group of my friends and I have been planning a mod for sometime and as soon as we got a hold of UT2003 it just clicked and we began work. 

In terms of who I am, I'm currently in high school and planning on goint to MIT for college. My school offers ''zero'' in the way of useful tech courses so i've been stuck learning everything on my own.

==Criminal Uprising==

'''Criminal Uprising''' is the total conversion for UT2003 mod that i'm currently working on. It will be team based combat with real world weapons, etc. It will entail compltely overhauling unreal with new weapons, models, animations, physics, etc. At this time there we have no site online, but have models and preliminary coding done, not to mention about 100+ pages of typed research and goals.

==Why This DevPage is Here==

Basically as we get more coding done I will post it up here. I will also try and post any aspects of making this mod that do not already exist on Wiki. Like I said i'm new to unreal script, but this game looks like a very interesting and promising challenge that i look forward too.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5530</id>
      <timestamp>2003-04-18T21:31:51Z</timestamp>
      <contributor>
        <ip>NeoLuTion</ip>
      </contributor>
      <comment>NeoLuTionDeveloperPage 4/18</comment>
      <text xml:space="preserve">===NeoLuTioN===

'''&quot;Reality is that which when we stop believing fails to go away&quot;'''

----

==Me==

To start off with i'm completely new to unreal scripting

I've done my fair share of c++, java, python, etc. but i've never really made a game beyond simple tetris (a gruelling school project in c++ that was completely annoying). However a group of my friends and I have been planning a mod for sometime and as soon as we got a hold of UT2003 it just clicked and we began work. 

In terms of who I am, I'm currently in high school and planning on goint to MIT for college. My school offers ''zero'' in the way of useful tech courses so i've been stuck learning everything on my own.

==Criminal Uprising==

'''Criminal Uprising''' is the total conversion for UT2003 mod that i'm currently working on. It will be team based combat with real world weapons, etc. It will entail compltely overhauling unreal with new weapons, models, animations, physics, etc. At this time there we have no site online, but have models and preliminary coding done, not to mention about 100+ pages of typed research and goals.

==Why This DevPage is Here==
:: Basically as we get more coding done I will post it up here. I will also try and post any aspects of making this mod that do not already exist on Wiki. Like I said i'm new to unreal script, but this game looks like a very interesting and promising challenge that i look forward too.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NeoReloaded</title>
    <id>2309</id>
    <revision>
      <id>5569</id>
      <timestamp>2006-10-01T21:50:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==&lt;b&gt;_-^-_-^-_-^-Neo_Reloaded-^-_-^-_-^-_&lt;/b&gt;==

Hello, it's been a while since I've last been here. I lost my old account lol but it's alright.

I've messed around with C++ and enjoyed it, as well as mastering IRC scripting (lol).

I'm now into UScript in addition to mapping. It's pretty fun stuff.

&lt;tr&gt;

====&lt;b&gt;Top 5 Favorite UT Mods&lt;/b&gt;====

1. Operation Na Pali

2. Infiltration 2.9

3. NextGen Weapons

4. Monster Hunt

5. AgentX

I've always wanted to play Siege, but I can't find a link for it :\. I also enjoy Binslayer when I'm playing online. I hope to create a mod similar to Operation: Na Pali, since it's my favorite mod. UT99 is definitely my favorite of the UT series.

My AIM: BobbleHeadJB

'''Tarquin:''' Your old account number is 7562. You can see it in the history list for your old user page.</text>
    </revision>
    <revision>
      <id>5570</id>
      <timestamp>2006-10-01T20:10:53Z</timestamp>
      <contributor>
        <ip>NeoReloaded</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==&lt;b&gt;_-^-_-^-_-^-Neo_Reloaded-^-_-^-_-^-_&lt;/b&gt;==

Hello, it's been a while since I've last been here. I lost my old account lol but it's alright.

I've messed around with C++ and enjoyed it, as well as mastering IRC scripting (lol).

I'm now into UScript in addition to mapping. It's pretty fun stuff.

&lt;tr&gt;

====&lt;b&gt;Top 5 Favorite UT Mods&lt;/b&gt;====

1. Operation Na Pali

2. Infiltration 2.9

3. NextGen Weapons

4. Monster Hunt

5. AgentX

I've always wanted to play Siege, but I can't find a link for it :\. I also enjoy Binslayer when I'm playing online. I hope to create a mod similar to Operation: Na Pali, since it's my favorite mod. UT99 is definitely my favorite of the UT series.

My AIM: BobbleHeadJB</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nercury</title>
    <id>2268</id>
    <revision>
      <id>5486</id>
      <timestamp>2007-08-08T10:45:04Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>reverted</comment>
      <text xml:space="preserve">'''Contacts:'''
*irc GameSurge channels: #utxmp, #BBF

&amp;ndash;Contributions to Wiki:&amp;ndash;
* [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]
* [[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP Map To UTXMP]]
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping Brushes Snapped To The Grid]]

&amp;ndash; 2004-11

'''Nercury:''' I am beginner mapper, i have released only three maps so far, all for U2XMP. 

First one, '''XMP-NRK-Trainstation''', was the map which helped me learn lots of things. It has no terrain, also there are no trains in Trainstation, and also i found players confused about map layout. It turned out to be &quot;I hate it&quot; or &quot;I love it&quot; map. Well, i didnt expected it to keep on server rotation half year.

I knew that i want map with sky, not somewhere under ground, so i started my second map making unique skybox. '''XMP-CXP-HeavenlyHell-RC''' was a map for CXP (Community eXpansion Pack) map pack, ant was a map which helped me learn lots of optimization, zoning and planning. Beta version of this map had very bad fps issues, also not effective static meshes, but with lots of experimenting i managed to reach huge fps boost, also learned to make good looking visuals with lower fps requirements.

Also i have made one mutator, which removes one particular U2XMP exploit. I have learned using replicated functions and some things about unreal networking architecture.

Now i started [[Legacy:Mapping For UTXMP|Mapping for UTXMP]], total UT2004 conversion of U2XMP. My first map already prepared for UTXMP is HeavenlyHell. I am also working with several new maps, but they are mostly experimenting with different styles and are not candidates to be released. Now i am concentrated to making unique static meshes and combining them with BSP geometry.

&amp;ndash; 2006-02

'''Nercury:''' I guess i made some break both for playing and mapping. But well, i just had to return. Now i have made some heavy optimisations to heavenly hell. Also, i have recently released new map for U2XMP: XMP-PyramidBeta2. Well, community is not big here, but it is still alive and i dont see any reason to stop mapping ;). Now i am going to make some duel map in near future.

I have lost my &quot;prepared&quot; version of HeavenlyHell for UTXMP. And i see really small player base here compared to U2XMP, so i dont think it is worth to port. Well, i may change my mind... Who knows.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5487</id>
      <timestamp>2006-03-06T00:13:01Z</timestamp>
      <contributor>
        <ip>Nat4-31.iti.lt</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Contacts:'''
*irc GameSurge channels: #utxmp, #BBF

&amp;ndash;Contributions to Wiki:&amp;ndash;
* [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]
* [[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP Map To UTXMP]]
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping Brushes Snapped To The Grid]]

&amp;ndash; 2004-11

'''Nercury:''' I am beginner mapper, i have released only three maps so far, all for U2XMP. 

First one, '''XMP-NRK-Trainstation''', was the map which helped me learn lots of things. It has no terrain, also there are no trains in Trainstation, and also i found players confused about map layout. It turned out to be &quot;I hate it&quot; or &quot;I love it&quot; map. Well, i didnt expected it to keep on server rotation half year.

I knew that i want map with sky, not somewhere under ground, so i started my second map making unique skybox. '''XMP-CXP-HeavenlyHell-RC''' was a map for CXP (Community eXpansion Pack) map pack, ant was a map which helped me learn lots of optimization, zoning and planning. Beta version of this map had very bad fps issues, also not effective static meshes, but with lots of experimenting i managed to reach huge fps boost, also learned to make good looking visuals with lower fps requirements.

Also i have made one mutator, which removes one particular U2XMP exploit. I have learned using replicated functions and some things about unreal networking architecture.

Now i started [[Legacy:Mapping For UTXMP|Mapping for UTXMP]], total UT2004 conversion of U2XMP. My first map already prepared for UTXMP is HeavenlyHell. I am also working with several new maps, but they are mostly experimenting with different styles and are not candidates to be released. Now i am concentrated to making unique static meshes and combining them with BSP geometry.

&amp;ndash; 2006-02

'''Nercury:''' I guess i made some break both for playing and mapping. But well, i just had to return. Now i have made some heavy optimisations to heavenly hell. Also, i have recently released new map for U2XMP: XMP-PyramidBeta2. Well, community is not big here, but it is still alive and i dont see any reason to stop mapping ;). Now i am going to make some duel map in near future.

I have lost my &quot;prepared&quot; version of HeavenlyHell for UTXMP. And i see really small player base here compared to U2XMP, so i dont think it is worth to port. Well, i may change my mind... Who knows.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5488</id>
      <timestamp>2007-08-08T10:24:19Z</timestamp>
      <contributor>
        <ip>Sarkozy.a-s-s.info</ip>
      </contributor>
      <comment>*Nercury</comment>
      <text xml:space="preserve">'''Contacts:'''
*irc GameSurge channels: #utxmp, #BBF

&amp;ndash;Contributions to Wiki:&amp;ndash;
* [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]
* [[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP Map To UTXMP]]
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping Brushes Snapped To The Grid]]

&amp;ndash; 2004-11

'''Nercury:''' I am beginner mapper, i have released only three [http://www.resumesplanet.com/ cv editing] maps so far, all for U2XMP. 

First one, '''XMP-NRK-Trainstation''', was the map which helped me learn lots of things. It has no terrain, also there are no trains in Trainstation, and also i found players confused about map layout. It turned out to be &quot;I hate it&quot; or &quot;I love it&quot; map. Well, i didnt expected it to keep on server rotation half year.

I knew that i want map with sky, not somewhere under ground, so i started my second map making unique skybox. '''XMP-CXP-HeavenlyHell-RC''' was a map for CXP (Community eXpansion Pack) map pack, ant was a map which helped me learn lots of optimization, zoning and planning. Beta version of this map had very bad fps issues, also not effective static meshes, but with lots of experimenting i managed to reach huge fps boost, also learned to make good looking visuals with lower fps requirements.

Also i have made one mutator, which removes one particular U2XMP exploit. I have learned using replicated functions and some things about unreal networking architecture.

Now i started [[Legacy:Mapping For UTXMP|Mapping for UTXMP]], total UT2004 conversion of U2XMP. My first map already prepared for UTXMP is HeavenlyHell. I am also working with several new maps, but they are mostly experimenting with different styles and are not candidates to be released. Now i am concentrated to making unique static meshes and combining them with BSP geometry.

&amp;ndash; 2006-02

'''Nercury:''' I guess i made some break both for playing and mapping. But well, i just had to return. Now i have made some heavy optimisations to heavenly hell. Also, i have recently released new map for U2XMP: XMP-PyramidBeta2. Well, community is not big here, but it is still alive and i dont see any reason to stop mapping ;). Now i am going to make some duel map in near future.

I have lost my &quot;prepared&quot; version of HeavenlyHell for UTXMP. And i see really small player base here compared to U2XMP, so i dont think it is worth to port. Well, i may change my mind... Who knows.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43322</id>
      <timestamp>2010-05-21T17:04:08Z</timestamp>
      <contributor>
        <username>Jinmartt</username>
        <id>2148</id>
      </contributor>
      <text xml:space="preserve">'''Contacts:'''
*irc GameSurge channels: #utxmp, #BBF

&amp;ndash;Contributions to Wiki:&amp;ndash;
* [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]
* [[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP Map To UTXMP]]
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping Brushes Snapped To The Grid]]

&amp;ndash; 2004-11

'''Nercury:''' I am beginner mapper, i have released only three maps so far, all for U2XMP. 

First one, '''XMP-NRK-Trainstation''', was the map which helped me learn lots of things. It has [http://www.resumesplanet.com cv editing] no terrain, also there are no trains in Trainstation, and also i found players confused about map layout. It turned out to be &quot;I hate it&quot; or &quot;I love it&quot; map. Well, i didnt expected it to keep on server rotation half year.

I knew that i want map with sky, not somewhere under ground, so i started my second map making unique skybox. '''XMP-CXP-HeavenlyHell-RC''' was a map for CXP (Community eXpansion Pack) map pack, ant was a map which helped me learn lots of optimization, zoning and planning. Beta version of this map had very bad fps issues, also not effective static meshes, but with lots of experimenting i managed to reach huge fps boost, also learned to make good looking visuals with lower fps requirements.

Also i have made one mutator, which removes one particular U2XMP exploit. I have learned using replicated functions and some things about unreal networking architecture.

Now i started [[Legacy:Mapping For UTXMP|Mapping for UTXMP]], total UT2004 conversion of U2XMP. My first map already prepared for UTXMP is HeavenlyHell. I am also working with several new maps, but they are mostly experimenting with different styles and are not candidates to be released. Now i am concentrated to making unique static meshes and combining them with BSP geometry.

&amp;ndash; 2006-02

'''Nercury:''' I guess i made some break both for playing and mapping. But well, i just had to return. Now i have made some heavy optimisations to heavenly hell. Also, i have recently released new map for U2XMP: XMP-PyramidBeta2. Well, community is not big here, but it is still alive and i dont see any reason to stop mapping ;). Now i am going to make some duel map in near future.

I have lost my &quot;prepared&quot; version of HeavenlyHell for UTXMP. And i see really small player base here compared to U2XMP, so i dont think it is worth to port. Well, i may change my mind... Who knows.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43334</id>
      <timestamp>2010-05-22T04:23:48Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>Reverted edits by [[Special:Contributions/Jinmartt|Jinmartt]] ([[User talk:Jinmartt|Talk]]) to last revision by [[User:Wormbo|Wormbo]]</comment>
      <text xml:space="preserve">'''Contacts:'''
*irc GameSurge channels: #utxmp, #BBF

&amp;ndash;Contributions to Wiki:&amp;ndash;
* [[Legacy:Mapping For UTXMP|Mapping for UTXMP]]
* [[Legacy:Converting U2XMP Map To UTXMP|Converting U2XMP Map To UTXMP]]
* [[Legacy:Keeping Brushes Snapped To The Grid|Keeping Brushes Snapped To The Grid]]

&amp;ndash; 2004-11

'''Nercury:''' I am beginner mapper, i have released only three maps so far, all for U2XMP. 

First one, '''XMP-NRK-Trainstation''', was the map which helped me learn lots of things. It has no terrain, also there are no trains in Trainstation, and also i found players confused about map layout. It turned out to be &quot;I hate it&quot; or &quot;I love it&quot; map. Well, i didnt expected it to keep on server rotation half year.

I knew that i want map with sky, not somewhere under ground, so i started my second map making unique skybox. '''XMP-CXP-HeavenlyHell-RC''' was a map for CXP (Community eXpansion Pack) map pack, ant was a map which helped me learn lots of optimization, zoning and planning. Beta version of this map had very bad fps issues, also not effective static meshes, but with lots of experimenting i managed to reach huge fps boost, also learned to make good looking visuals with lower fps requirements.

Also i have made one mutator, which removes one particular U2XMP exploit. I have learned using replicated functions and some things about unreal networking architecture.

Now i started [[Legacy:Mapping For UTXMP|Mapping for UTXMP]], total UT2004 conversion of U2XMP. My first map already prepared for UTXMP is HeavenlyHell. I am also working with several new maps, but they are mostly experimenting with different styles and are not candidates to be released. Now i am concentrated to making unique static meshes and combining them with BSP geometry.

&amp;ndash; 2006-02

'''Nercury:''' I guess i made some break both for playing and mapping. But well, i just had to return. Now i have made some heavy optimisations to heavenly hell. Also, i have recently released new map for U2XMP: XMP-PyramidBeta2. Well, community is not big here, but it is still alive and i dont see any reason to stop mapping ;). Now i am going to make some duel map in near future.

I have lost my &quot;prepared&quot; version of HeavenlyHell for UTXMP. And i see really small player base here compared to U2XMP, so i dont think it is worth to port. Well, i may change my mind... Who knows.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NetConnection</title>
    <id>2267</id>
    <revision>
      <id>5484</id>
      <timestamp>2002-09-10T05:13:26Z</timestamp>
      <contributor>
        <ip>Krash</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Object|Object]] &gt;&gt; [[Legacy:Player|Player]] &gt;&gt; NetConnection}}

This class represents a Player playing remotely (i.e. connected to the server Unreal is running on).  Also used for Demo Recording.  Useful if you wish to detect if a playerpawn is controlled remotely.

&lt;uscript&gt;
if (Viewport(SomePlayerPawn.Player)!=none)
  //This player is controlled locally.
else if (NetConnection(SomePlayerPawn.Player)!=none)
  // This player is controlled remotely.
else
  // This player is not controlled by anybody yet...
&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>5485</id>
      <timestamp>2002-06-26T05:53:09Z</timestamp>
      <contributor>
        <ip>UsAaR33</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:Player|Player]] &gt;&gt; NetConnection}}

A class that only exists in C++.  It represents a Player playing remotely (i.e. connected to the server Unreal is running on).  Also used for Demo Recording.

&lt;uscript&gt;

if (Viewport(SomePlayerPawn.Player)!=none)
  //This player is controlled locally.
else if (NetConnection(SomePlayerPawn.Player)!=none)
  // This player is controlled remotely.
else
  // This player is not controlled by anybody yet...
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NetMode</title>
    <id>2293</id>
    <revision>
      <id>5536</id>
      <timestamp>2005-12-27T15:28:39Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">In [[Legacy:Replication|replication]], the NetMode property of the Level indicates what type of network game or standalone game is being played.  

It is sometimes checked within functions or within the [[Legacy:Replication Block|replication block]] when the code needs to behave slightly differently in a different network environment.  It is most commonly used to differentiate whether an object with ROLE_Authority is in a botmatch/listen server or a dedicated server.

It will be different on clients and servers though other parts of the [[Legacy:LevelInfo|LevelInfo]] actor should be the same. The options are:

; NM_Standalone : a botmatch or single player game 
; NM_DedicatedServer : a dedicated server 
; NM_ListenServer : a non-dedicated server (ie the Host Multiplayer Game in the menu)
; NM_Client : a network client

&lt;uscript&gt;
simulated event Tick (float DeltaTime) {
  if ( Level.NetMode != NM_DedicatedServer ) {
    // Code here will only be executed on Listen servers and game clients.
  }
  if ( Level.NetMode == NM_DedicatedServer ) {
    // Code here will only be executed on a server.
  }
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Netcode Idioms|Netcode Idioms]]
* [[Legacy:Introduction To Replication|Introduction to Replication]]

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5537</id>
      <timestamp>2004-06-03T16:30:58Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>* [[Netcode Idioms]]</comment>
      <text xml:space="preserve">In [[Legacy:Replication|replication]], the NetMode property of the Level indicates what type of network game or standalone game is being played. This is similar to an [[Legacy:Actor|Actor]]'s [[Legacy:Role|Role]] property.

It will be different on clients and servers though other parts of the [[Legacy:LevelInfo|LevelInfo]] actor should be the same. The options are:

; NM_Standalone : a botmatch or single player game 
; NM_DedicatedServer : a dedicated server 
; NM_ListenServer : a non-dedicated server (ie the Host Multiplayer Game in the menu)
; NM_Client : a network client

These can be checked within functions or within the [[Legacy:Replication Block|replication block]] to do specific things under various circumstances. This is most commonly used to differentiate whether an object with ROLE_Authority is in a botmatch/listen server or a dedicated server.

&lt;uscript&gt;
simulated event Tick (float DeltaTime) {
  if ( Level.NetMode != NM_DedicatedServer ) {
    // Code here will only be executed on Listen servers and game clients.
  }
  if ( Level.NetMode == NM_DedicatedServer ) {
    // Code here will only be executed on a server.
  }
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Netcode Idioms|Netcode Idioms]]

[[Category:Legacy Enum|{{PAGENAME}}]]
[[Category:Legacy Replication|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5538</id>
      <timestamp>2005-12-10T20:08:28Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">In [[Legacy:Replication|replication]], the NetMode property of the Level indicates what type of network game or standalone game is being played.  

It is sometimes checked within functions or within the [[Legacy:Replication Block|replication block]] when the code needs to behave slightly differently in a different network environment.  It is most commonly used to differentiate whether an object with ROLE_Authority is in a botmatch/listen server or a dedicated server.

It will be different on clients and servers though other parts of the [[Legacy:LevelInfo|LevelInfo]] actor should be the same. The options are:

; NM_Standalone : a botmatch or single player game 
; NM_DedicatedServer : a dedicated server 
; NM_ListenServer : a non-dedicated server (ie the Host Multiplayer Game in the menu)
; NM_Client : a network client

&lt;uscript&gt;
simulated event Tick (float DeltaTime) {
  if ( Level.NetMode != NM_DedicatedServer ) {
    // Code here will only be executed on Listen servers and game clients.
  }
  if ( Level.NetMode == NM_DedicatedServer ) {
    // Code here will only be executed on a server.
  }
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Netcode Idioms|Netcode Idioms]]

[[Category:Legacy Enum|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NetSapiens</title>
    <id>2298</id>
    <revision>
      <id>5546</id>
      <timestamp>2004-06-12T11:04:00Z</timestamp>
      <contributor>
        <ip>NetSapiens</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==About me:==

I'm a coder at heart... always have been, always will be.

Unfortunately I'm not a coder by skill og talent, so learning is a slow process for me. But I intend to keep trying until I get it right.

I hope I'll be able to bring some nice coding tutorials to the Wiki, since I learn a lot more by writing out stuff.

I also have a thing I really would like to make in the UT2004 engine, but I'll post that on a later date, when I have the time (and inclination)

==Current status==

right now, playing with the markup to get a decent feel for it... soon I'll be running rampant through the Wiki, butt-naked and with a spellchecker in hand :)

I'm also in the proces of figuring out how I should use this page for something interesting... for starters I'll try a blog-like thingie.. maybe that'll keep me occupied ;)

==subsections==

[[Legacy:NetSapiens/Coding Diary|NetSapiens/Coding Diary]]

[[Legacy:Pet Projects|Pet Projects]]

----

===Comments:===

'''Tarquin:''' Hi, welcome to the wiki. :)

'''NetSapiens:''' Thank you kindly. I'll try not to break anything while I'm here :) But I must admit that I am a bit intimidated by the possibility that I might do just that, so bear with me if I don't change too many things initially.

'''Tarquin:''' Note the revisions links at the foot of each page. :) We can easily go back to a previous version of a page, so no harm done. 

'''NetSapiens:''' hmmm... now I've gone and done it... I changed the title of my diary page, and now I've orphaned the page I made there, since the reference is gone. How do I go about changing links like that? For now I've changed it back, but I'd like to know how I change the Blog/Coding Diary to just &quot;Coding Diary&quot; without losing the link?

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5547</id>
      <timestamp>2004-06-12T09:13:35Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===About me:===

I'm a coder at heart... always have been, always will be.

Unfortunately I'm not a coder by skill og talent, so learning is a slow process for me. But I intend to keep trying until I get it right.

I hope I'll be able to bring some nice coding tutorials to the Wiki, since I learn a lot more by writing out stuff.

I also have a thing I really would like to make in the UT2004 engine, but I'll post that on a later date, when I have the time (and inclination)

'''Tarquin:''' Hi, welcome to the wiki. :)

'''NetSapiens:''' Thank you kindly. I'll try not to break anything while I'm here :) But I must admit that I am a bit intimidated by the possibility that I might do just that, so bear with me if I don't change too many things initially.

'''Tarquin:''' Note the revisions links at the foot of each page. :) We can easily go back to a previous version of a page, so no harm done. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5548</id>
      <timestamp>2004-06-12T11:00:05Z</timestamp>
      <contributor>
        <ip>NetSapiens</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==About me:==

I'm a coder at heart... always have been, always will be.

Unfortunately I'm not a coder by skill og talent, so learning is a slow process for me. But I intend to keep trying until I get it right.

I hope I'll be able to bring some nice coding tutorials to the Wiki, since I learn a lot more by writing out stuff.

I also have a thing I really would like to make in the UT2004 engine, but I'll post that on a later date, when I have the time (and inclination)

==Current status==

right now, playing with the markup to get a decent feel for it... soon I'll be running rampant through the Wiki, butt-naked and with a spellchecker in hand :)

I'm also in the proces of figuring out how I should use this page for something interesting... for starters I'll try a blog-like thingie.. maybe that'll keep me occupied ;)

==subsections==

[[Legacy:Coding Diary|Coding Diary]]

[[Legacy:Pet Projects|Pet Projects]]

----

===Comments:===

'''Tarquin:''' Hi, welcome to the wiki. :)

'''NetSapiens:''' Thank you kindly. I'll try not to break anything while I'm here :) But I must admit that I am a bit intimidated by the possibility that I might do just that, so bear with me if I don't change too many things initially.

'''Tarquin:''' Note the revisions links at the foot of each page. :) We can easily go back to a previous version of a page, so no harm done. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NetSapiens/Coding Diary</title>
    <id>2299</id>
    <revision>
      <id>5549</id>
      <timestamp>2004-06-20T19:01:39Z</timestamp>
      <contributor>
        <ip>NetSapiens</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Coding Diary==

===June 20th, 21.00 CET===

Holy &lt;insert favored deity here&gt; ..

I am so busy these days that it's downright frightening. Being double-booked is an every-day occurrence to me now.

Hopefully I'll be back in the swing of trying to grasp the most basic of Uscript concepts soon.

===June 13th, 07.30 CET===

I'm finding it hard to edit pages with my limited knowledge, i.e. it's not hard to edit them, it's editing the right information that's the problem.. guess that's what you get for letting the patients run the asylum :)

Until someone tells me to please stop, I'll keep trying though.

As for coding... well, haven't had much time for that and I don't know if I will today. I was thinking of making a mutator which gave the player instagib for the duration. Don't know how valuable and/or interesting it is to play with, but I need to work on some skills regarding arrays and lists, and this might be simple enough that I can get it to work

===June 12th, noon CET===

Just started on this massive venture called Wiki.. I hope I'll be able to add to the site and the knowledge base here.. in time :)

For now, all I'm doing is getting a feel for it, but I'll try to write up something along the lines of a tutorial when I have something to write about.

----

'''Wormbo:''' Erm, shouldn't this page be called [[Legacy:NetSapiens/Coding Diary|NetSapiens/Coding Diary]]?

'''NetSapiens:''' Fixed. By the way.. is it proper to delete both of these comments now that they're no longer valid? I would assume so, but we all know what assumptions do. :)

'''Wormbo:''' Only an admin can &quot;fix&quot; the page name by renaming the page itself.

'''NetSapiens:''' oh yeah, I see what I did now... my bad... ok, well if an admin would like to remove the Blog part of the above, as well as on my personal page, that would be grand... told you I'd break something :)

'''Tarquin:''' Done :)</text>
    </revision>
    <revision>
      <id>5550</id>
      <timestamp>2004-06-12T11:43:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Coding Diary==

===June 12th, noon CET===

Just started on this massive venture called Wiki.. I hope I'll be able to add to the site and the knowledge base here.. in time :)

For now, all I'm doing is getting a feel for it, but I'll try to write up something along the lines of a tutorial when I have something to write about.

----

'''Wormbo:''' Erm, shouldn't this page be called [[Legacy:NetSapiens/Coding Diary|NetSapiens/Coding Diary]]?

'''NetSapiens:''' Fixed. By the way.. is it proper to delete both of these comments now that they're no longer valid? I would assume so, but we all know what assumptions do. :)

'''Wormbo:''' Only an admin can &quot;fix&quot; the page name by renaming the page itself.

'''NetSapiens:''' oh yeah, I see what I did now... my bad... ok, well if an admin would like to remove the Blog part of the above, as well as on my personal page, that would be grand... told you I'd break something :)

'''Tarquin:''' Done :)</text>
    </revision>
    <revision>
      <id>5551</id>
      <timestamp>2004-06-13T05:43:40Z</timestamp>
      <contributor>
        <ip>NetSapiens</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Coding Diary==

===June 13th, 07.30 CET===

I'm finding it hard to edit pages with my limited knowledge, i.e. it's not hard to edit them, it's editing the right information that's the problem.. guess that's what you get for letting the patients run the asylum :)

Until someone tells me to please stop, I'll keep trying though.

As for coding... well, haven't had much time for that and I don't know if I will today. I was thinking of making a mutator which gave the player instagib for the duration. Don't know how valuable and/or interesting it is to play with, but I need to work on some skills regarding arrays and lists, and this might be simple enough that I can get it to work

===June 12th, noon CET===

Just started on this massive venture called Wiki.. I hope I'll be able to add to the site and the knowledge base here.. in time :)

For now, all I'm doing is getting a feel for it, but I'll try to write up something along the lines of a tutorial when I have something to write about.

----

'''Wormbo:''' Erm, shouldn't this page be called [[Legacy:NetSapiens/Coding Diary|NetSapiens/Coding Diary]]?

'''NetSapiens:''' Fixed. By the way.. is it proper to delete both of these comments now that they're no longer valid? I would assume so, but we all know what assumptions do. :)

'''Wormbo:''' Only an admin can &quot;fix&quot; the page name by renaming the page itself.

'''NetSapiens:''' oh yeah, I see what I did now... my bad... ok, well if an admin would like to remove the Blog part of the above, as well as on my personal page, that would be grand... told you I'd break something :)

'''Tarquin:''' Done :)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Netcode Idioms</title>
    <id>2287</id>
    <revision>
      <id>5525</id>
      <timestamp>2007-05-05T08:14:39Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a cookbook of ways to get round some of the 'gotchas' in [[Legacy:Replication|replication]].

==Targetting types of machine==

There are basically 5 types of machine:
* &lt;code&gt;(Level.NetMode == NM_ListenServer)&lt;/code&gt; &amp;ndash; listen servers (with a local player)
* &lt;code&gt;(Level.NetMode == NM_DedicatedServer)&lt;/code&gt; &amp;ndash; dedicated servers (no local player)
* &lt;code&gt;(Level.NetMode == NM_Client)&lt;/code&gt; &amp;ndash; clients
* &lt;code&gt;(Level.NetMode == NM_Client &amp;&amp; bNetOwner)&lt;/code&gt; &amp;ndash; owner clients (special case of client where the local player is the Owner of the actor in question)
* &lt;code&gt;(Level.NetMode == NM_Standalone)&lt;/code&gt; &amp;ndash; standalone games

You sometimes need things to happen only on certain types of machine. Here's how:

&lt;uscript&gt;
if (Level.NetMode != NM_DedicatedServer) {
  // This could be offline, a listen server or a client, but we know
  // we have a local player on this machine, someone who can see or hear things.
}
if (Role == ROLE_Authority) {
  // This is the authorative copy of this actor, it was spawned on this machine.
  // It is not a guarantee that we are on the server or in single player!
}
if (Role &lt; ROLE_Authortity) {
  // This is a non-authorative copy of this actor that was replicated
  // from the server. In other words, we must be on a client.
}

// please add more!
&lt;/uscript&gt;

See also: [[Legacy:NetMode|NetMode]], [[Legacy:Role|Role]].

==Finding the Local PlayerPawn or PlayerController==

===UnrealEngine1===

The usual idiom for finding the local player's [[Legacy:PlayerPawn|PlayerPawn]] (UT) on a network client or a listen server is (after declaring a class-level &lt;tt&gt;var PlayerPawn PlayerLocal&lt;/tt&gt;):

&lt;uscript&gt;
if (PlayerLocal == None)
  foreach AllActors(class 'PlayerPawn', PlayerLocal)
    if (Viewport(PlayerLocal.Player) != None)
      break;

if (PlayerLocal != None) { ... }  // do something with it
&lt;/uscript&gt;

If you have a [[Legacy:Canvas|Canvas]] object handy (in engine events like RenderOverlays, for instance), there's even a more straightforward way to get hold of the local player:

&lt;uscript&gt;
PlayerLocal = Canvas.Viewport.Actor;
&lt;/uscript&gt;

===UnrealEngine2===

[[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] have a function to get the local PlayerController which actually uses the PlayerController/DynamicActors combo (and stores the local controller for later use too):

&lt;uscript&gt;
PlayerLocal = Level.GetLocalPlayerController();
&lt;/uscript&gt;

Again, if you have a [[Legacy:Canvas|Canvas]] object handy you should use the more straight forward version like in UT:

&lt;uscript&gt;
PlayerLocal = Canvas.Viewport.Actor;
&lt;/uscript&gt;

Note that the local [[Legacy:PlayerPawn|PlayerPawn]] or [[Legacy:PlayerController|PlayerController]] is always relevant (for obvious reasons) and thus always exists on its respective client.

==HUD Mutators==

See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] or [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists in Unreal Tournament]] (use the Quick Navigation menu to browse to &quot;HUD Mutators&quot;).  You'll find a description there how to set up a HUD mutator that actually works in network games.

==Replicating Config Variables==

Clients load the value of &lt;tt&gt;config&lt;/tt&gt; or &lt;tt&gt;globalconfig&lt;/tt&gt; variables from their own .ini files. Since these values are treated as defaults they are not replicated until they are changed through code.  Clients will see their own customized configuration instead of the server's.

To force replication of these variables use a second (non-config) variable:

&lt;uscript&gt;
var config string MySettings;
var string ServerSettings;

replication
{
    // replicate the ServerSettings variable to all (relevant) clients
    reliable if ( Role == ROLE_Authority )
        ServerSettings;
}

function PreBeginPlay()
{
// non-simulated PreBeginPlay() is only executed on the server - You can take away the 'if' expression below then.
// simulated PreBeginPlay() is executed on both the server and the client. - You must include the 'if' expression below then.
    if ( Role == ROLE_Authority )
        ServerSettings = MySettings;
    Super.PreBeginPlay();
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Replication|Replication]]

==Discussion==

'''Matariel:''' Correct me if Im wrong but... doesn't Role == Role_Authority simply mean that this is the authoritative copy of the actor? What if this actor was spawned on a client? I don't think a Role == Role_Authority check qualifies the machine as a server, but simply as the owner.

'''Wormbo:''' That's correct, but usually you only do any Role checks if you intend to replicate your actor.</text>
    </revision>
    <revision>
      <id>5526</id>
      <timestamp>2007-05-04T23:07:19Z</timestamp>
      <contributor>
        <ip>CPE001346f35721-CM00122574ae50.cpe.net.cable.rogers.com</ip>
      </contributor>
      <comment>*Added Discussion section, added the first comment.</comment>
      <text xml:space="preserve">This is a cookbook of ways to get round some of the 'gotchas' in [[Legacy:Replication|replication]].

==Targetting types of machine==

There are basically 5 types of machine:
* &lt;code&gt;(Level.NetMode == NM_ListenServer)&lt;/code&gt; &amp;ndash; listen servers (with a local player)
* &lt;code&gt;(Level.NetMode == NM_DedicatedServer)&lt;/code&gt; &amp;ndash; dedicated servers (no local player)
* &lt;code&gt;(Level.NetMode == NM_Client)&lt;/code&gt; &amp;ndash; clients
* &lt;code&gt;(Level.NetMode == NM_Client &amp;&amp; bNetOwner)&lt;/code&gt; &amp;ndash; owner clients (special case of client where the local player is the Owner of the actor in question)
* &lt;code&gt;(Level.NetMode == NM_Standalone)&lt;/code&gt; &amp;ndash; standalone games

You sometimes need things to happen only on certain types of machine. Here's how:

&lt;uscript&gt;
if (Level.NetMode != NM_DedicatedServer) {
  // This could be offline, a listen server or a client, but we know
  // we have a local player on this machine, someone who can see or hear things.
}
if (Role == ROLE_Authority) {
  // This is the authorative copy of this actor, it was spawned on this machine.
  // It is not a guarantee that we are on the server or in single player!
}
if (Role &lt; ROLE_Authortity) {
  // This is a non-authorative copy of this actor that was replicated
  // from the server. In other words, we must be on a client.
}

// please add more!
&lt;/uscript&gt;

See also: [[Legacy:NetMode|NetMode]], [[Legacy:Role|Role]].

==Finding the Local PlayerPawn or PlayerController==

===UnrealEngine1===

The usual idiom for finding the local player's [[Legacy:PlayerPawn|PlayerPawn]] (UT) on a network client or a listen server is (after declaring a class-level &lt;tt&gt;var PlayerPawn PlayerLocal&lt;/tt&gt;):

&lt;uscript&gt;
if (PlayerLocal == None)
  foreach AllActors(class 'PlayerPawn', PlayerLocal)
    if (Viewport(PlayerLocal.Player) != None)
      break;

if (PlayerLocal != None) { ... }  // do something with it
&lt;/uscript&gt;

If you have a [[Legacy:Canvas|Canvas]] object handy (in engine events like RenderOverlays, for instance), there's even a more straightforward way to get hold of the local player:

&lt;uscript&gt;
PlayerLocal = Canvas.Viewport.Actor;
&lt;/uscript&gt;

===UnrealEngine2===

[[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]] have a function to get the local PlayerController which actually uses the PlayerController/DynamicActors combo (and stores the local controller for later use too):

&lt;uscript&gt;
PlayerLocal = Level.GetLocalPlayerController();
&lt;/uscript&gt;

Again, if you have a [[Legacy:Canvas|Canvas]] object handy you should use the more straight forward version like in UT:

&lt;uscript&gt;
PlayerLocal = Canvas.Viewport.Actor;
&lt;/uscript&gt;

Note that the local [[Legacy:PlayerPawn|PlayerPawn]] or [[Legacy:PlayerController|PlayerController]] is always relevant (for obvious reasons) and thus always exists on its respective client.

==HUD Mutators==

See [[Legacy:Useful Mutator Functions|Useful Mutator Functions]] or [[Legacy:Linked List/Existing Lists In Unreal Tournament|Linked List/Existing Lists in Unreal Tournament]] (use the Quick Navigation menu to browse to &quot;HUD Mutators&quot;).  You'll find a description there how to set up a HUD mutator that actually works in network games.

==Replicating Config Variables==

Clients load the value of &lt;tt&gt;config&lt;/tt&gt; or &lt;tt&gt;globalconfig&lt;/tt&gt; variables from their own .ini files. Since these values are treated as defaults they are not replicated until they are changed through code.  Clients will see their own customized configuration instead of the server's.

To force replication of these variables use a second (non-config) variable:

&lt;uscript&gt;
var config string MySettings;
var string ServerSettings;

replication
{
    // replicate the ServerSettings variable to all (relevant) clients
    reliable if ( Role == ROLE_Authority )
        ServerSettings;
}

function PreBeginPlay()
{
// non-simulated PreBeginPlay() is only executed on the server - You can take away the 'if' expression below then.
// simulated PreBeginPlay() is executed on both the server and the client. - You must include the 'if' expression below then.
    if ( Role == ROLE_Authority )
        ServerSettings = MySettings;
    Super.PreBeginPlay();
}
&lt;/uscript&gt;

==Related Topics==
* [[Legacy:Replication|Replication]]

==Discussion==

'''Matariel:''' Correct me if Im wrong but... doesn't Role == Role_Authority simply mean that this is the authoritative copy of the actor? What if this actor was spawned on a client? I don't think a Role == Role_Authority check qualifies the machine as a server, but simply as the owner.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NetworkEmitter</title>
    <id>2274</id>
    <revision>
      <id>5498</id>
      <timestamp>2004-11-21T18:56:45Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Emitter|Emitter]] &gt;&gt; NetworkEmitter (Package: UnrealGame)}}

(This actor is new in [[Legacy:UT2004|UT2004]])

A NetworkEmitter is an [[Legacy:Emitter|Emitter]] which, unlike normal Emitters, also exists on the server and can be triggered by server events.  This functionality is basically equivalent to using a [[Legacy:NetworkTrigger|NetworkTrigger]] to trigger a normal Emitter, but in one convenient package.

Unlike NetworkTrigger, a NetworkEmitter will only trigger its own [[Legacy:ParticleEmitter|ParticleEmitter]]s when it receives a server event.  It will not trigger an Events-&gt;Event on the client side (so you can't use a NetworkEmitter to trigger other client-side actors).

==Properties ==

This actor implements the same basic functionality as an Emitter.  For more information see [[Legacy:Emitter|Emitter]].

==Methods ==

This actor implements the same methods as NetworkTrigger to replicate server events to actions on the client.  For more information see [[Legacy:NetworkTrigger|NetworkTrigger]].

==Known Subclasses ==

(None)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NetworkTrigger</title>
    <id>2273</id>
    <revision>
      <id>5497</id>
      <timestamp>2004-11-21T18:55:29Z</timestamp>
      <contributor>
        <ip>Foogod</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2004|UT2004]] :: [[Legacy:Actor|Actor]] &gt;&gt; NetworkTrigger (Package: UnrealGame)}}

(This actor is new in [[Legacy:UT2004|UT2004]])

When a NetworkTrigger's Events-&gt;Tag is triggered or reset on the server, it will cause an Events-&gt;Event to be triggered/reset on all clients.

NetworkTriggers will keep track of the number of times they have been triggered and reset, and will automatically cause a new client to replay the same sequence when joining a game, to bring it up to the same point as everybody else.

This actor is mainly useful when something which generates events on the server (such as a [[Legacy:ScriptedTrigger|ScriptedTrigger]]) needs to trigger actors which only exist on the clients (such as [[Legacy:Emitter|Emitter]]s, and other effects).

It should be noted that if you are considering using a NetworkTrigger to trigger an Emitter, you might want to look at the [[Legacy:NetworkEmitter|NetworkEmitter]] actor, which combines both of these functions in one convenient package.

==Properties ==

===Important Properties Inherited from [[Legacy:Actor|Actor]] ===

; Events-&gt;Tag: When a trigger matching this tag occurs, this actor will trigger an event on all clients.
; Events-&gt;Event: The name of the event which is triggered on clients.

===(Hidden Properties) ===
; byte TriggerCount [replicated to clients]: Keeps track of how many times this actor has been triggered.
; byte OldTriggerCount: Used to determine whether TriggerCount has changed (and thus should generate client event(s)).
; byte ResetCount [replicated to clients]: Keeps track of how many times this actor has been reset.
; byte OldResetCount: Used to determine whether ResetCount has changed (and thus should generate client reset(s)).
; bool bNotFirstCall: Used internally to prevent spurious client resets at the beginning of the game.

==Methods ==

===Events ===
; PostNetReceive ( ) [simulated] : Calls UpdateTriggerCount.  Also calls DoClientReset if a resent event has occurred.
; Trigger (Actor Other, Pawn EventInstigator) [simulated] :  On the server, updates TriggerCount and initiates a replication event.  If called on a client, immediately triggers an Events-&gt;Event.

===Other Functions ===
; PostNetBeginPlay ( ) [simulated] : Calls DoClientReset and UpdateTriggerCount to set up initial property values.
; UpdateTriggerCount ( ) [simulated] : Keeps track of triggering history, and fires Events-&gt;Event triggers as many times as necessary to keep up with TriggerCount.
; DoClientReset ( ) [simulated] : Calls Reset() on all actors with tags matching Events-&gt;Event.
; Reset ( ) [simulated] : On the server, updates ResetCount and initiates a replication event.

==Known Subclasses ==

(None)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NeverWinter Nights To UT2003</title>
    <id>2292</id>
    <revision>
      <id>5535</id>
      <timestamp>2003-08-29T23:14:14Z</timestamp>
      <contributor>
        <ip>Nytrogen</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This page explains how to get '''Neverwinter Nights Models''' into [[Legacy:UT2003|UT2003]].

'''Note:'''  Don't do this unless you have permission to from the model's original author, either express or implied.  See [[Legacy:Mod Copyright|Mod Copyright]] for details.

==What You Need==

This is quite a tricky process and requires the following:

* Neverwinter Nights &lt;br /&gt;http://nwn.bioware.com

* NWNExplorer for exporting models and textures from NWN &lt;br /&gt;http://www.torlack.com/index.html?topics=nwnexplorer_readme

* NWNMDLCOMP.EXE for converting the models to ASCII format &lt;br /&gt;http://www.torlack.com/index.html?topics=nwnmdlcomp_readme

* Milkshape3D for converting the models to LWO format &lt;br /&gt;http://www.swissquake.ch/chumbalum-soft/

* The NWN Import Plugin for Milkshape3D (msMDLImporter.dll) &lt;br /&gt;http://www.augustweb.com/~anim8r/downloads/msMDLImporter1.0.zip

==Let's Import==

[[Image:Legacy_nwn-import-spider.jpeg|right|]]

Here's a tutorial on importing the phase spider from NWN.

* Open NWN Explorer
* Select File -&gt; Open Neverwinter Nights
* expand data\models_01.bif
* expand Models
* Right click c_spidphase.mdl and select Export.
* Save the file to the directory containing MDL2ASCII.EXE
* expand data\textures_01.bif, then Textures, TGA
* Export c_spidphase.tga
* 


Go to a DOS prompt to this directory and type

	NWNMDLCOMP -dx c_spidphase.mdl


* A file c_spidphase.mdl.ascii should be created.
* Delete c_spidphase.mdl and rename c_spidphase.mdl.ascii to c_spidphase.mdl
* Load Milkshape 3D
* Select File -&gt; Import -&gt; Neverwinter Nights Model Importer.
* Load the c_spidphase.mdl. It will look a mess!
* Click Anim to go to animation mode - it will look a little better :)
* Click the Materials tab
* Click the 'c_spidphase' button and pick the c_spidphase.tga file. For more complex models you'll need to repeat this for each texture in the list.
* Right-click the 3d panel and select Textured - voila funky phase spider :)
* Now select File -&gt; Export -&gt; Lightwave 6.5x (THE TOP ONE - the bottom one produces weird artifacts)
* Click OK 
* Save it as c_spidphase.lwo
* Start UnrealED.
* Import the c_spidphase.tga as a new texture in the myLevel package.
* Import the c_spidphase.lwo as a new static mesh. Ignore the warning messages. That's it!

==Notes==

[[Image:Legacy_nwn-import-scale.jpeg|right|]]

The models are well tiny &amp;ndash; so when you place them scale them up by at least 64x. Or you could scale them up in Milkshape prior to export. Scaling by 102.5 in UnrealEd makes them fit into a 1024x1024 square, which gives a good proportion.

Importing most of the tileset models into milkshape produces a strange copy of most of the model with a NULL texture, as well as setting one of the &quot;proper&quot; model sections to a NULL texture. You will need to assign the correct texture to the missing section and delete the unwanted bits. 

Some of the textures have a mask (eg Splotch1) and you should tick the 'alpha' and 'mask' boxes when importing these textures.

Before importing tileset models, load the ASCII model into notepad and delete any 'light' nodes. The presence of these also seems to throw the import out of whack (the model dissapears when the Anim mode is selected).</text>
    </revision>
  </page>
  <page>
    <title>Legacy:New Contributors Quick Start</title>
    <id>2251</id>
    <revision>
      <id>5446</id>
      <timestamp>2007-08-02T20:24:05Z</timestamp>
      <contributor>
        <ip>Email.rtassoc.com</ip>
      </contributor>
      <comment>reverted</comment>
      <text xml:space="preserve">This page should be a quick and easy guide to contributing to the UnrealWiki. Ideally, it should give a newcomer enough information to get started right away. If it doesn't, change it! Feel free to visit the [http://forums.beyondunreal.com/forumdisplay.php?forumid=249 Unreal Wiki forum] if you have questions, or irc://irc.enterthegame.com/unrealwiki

==Quick Start ==

===Background ===

You might want to read [[Legacy:Project FAQ|Project FAQ]] or [[Legacy:Project Aims|Project Aims]] for info on the site.

===Registration (optional) ===

Go to [http://www.unrealwiki.com/wiki?action=editprefs Preferences] and give yourself a username and password. This is so your name appears on the [[Legacy:Recent Changes|Recent Changes]] list; nothing else (you don't even need an email address). The [[:Category:Legacy Personal Page]] page has a list of all people who have contributed to the wiki; you can also add your name to this list if you like.

===Exploring ===

Browse around the site. If you find a page you'd like to add something to, click the '''Edit text of this page''' link at the bottom of the page. This will load up a form containing the text of the page. Make additions or corrections and press '''Save'''.

===Editing Pages ===

When editing there is a link to the markup syntax.  Use '''Preview''' to check your formatting.  Wiki has its own markup, but it's very very simple and you can pick it up by following what's on a page so far.  The reference page is [[Legacy:Wiki Markup|Wiki Markup]].

You can use the [[Legacy:Sandbox|Sandbox]] page if you just want to practise editing and markup.  You can also see examples of markup on there.

That said, don't worry too much if you make markup errors on a page &amp;ndash; someone else is bound to come along and correct them. 

Note that the [[Legacy:Home Page|Home Page]] is read-only to avoid people making practice edits on it.

===Adding New Material ===

You can edit existing pages to add information or ideas, fix mistakes, or create links to other relevant pages on the wiki or elsewhere.  Before adding new material, make sure it is actually new to the wiki by doing a thorough '''[[Legacy:Search|Search]]''' for the topic.  If you're unsure of what name to give a new page, or you want to add something small but aren't sure where, add it to the [[Legacy:Inbox|Inbox]], or to your own page (you will see that when you register).  

If you spot an inaccuracy, it's much better to correct it than to simply make a note about it.  However, do not use guesswork to correct information, do a little bit of research or an experiment to confirm what you are going to write.  If you know something is wrong but do not know the right answer, it's better to do it as a note after all.

===Creating Pages ===

To add a new page, first find somewhere to link from &amp;ndash; somewhere like [[Legacy:Mapping Lessons|Mapping Lessons]] or [[Legacy:UnrealEd Tips|UnrealEd Tips]] for example. Edit that page, and in a suitable place write the title of the page you want to add, surrounded by double square brackets like this:&lt;br /&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&lt;nowiki&gt; [[Legacy:Name Of Your New Page|name of your new page]]&lt;/nowiki&gt;&lt;/tt&gt;&lt;br /&gt;Press ''Save''. The page will reload. The new text will be rendered with a ''?'' link after it &amp;ndash; this means it's a link to page that doesn't exist yet. Clicking the link will take you to the edit form for this new page. Write some text, press save, and the new page is created.&lt;br /&gt;Please don't start new pages by just typing in a URL into your browser. Pages created like this won't be linked to anything else in the wiki (hence they're called orphans). The idea is to build a web. Find somewhere to link from first.

Many class pages are missing from this website. This Wiki community would appreciate it greatly if you helped add them. It's pretty easy to create a class page, and you of course do not have to complete it, but can leave much of it blank for other people to start. People will be much more likely to edit and add to a class page that already exists then to create a new one. To see a template for creating a class page, see the&lt;br /&gt;[[Legacy:Class_Wikifier|Class_Wikifier]]

'''Note''' that admins can rename pages: if you create a page and then it vanishes, this is probably what has happened. Find the link you made for it  or look on [[Legacy:Recent Changes|Recent Changes]]: the page name will have been updated there too. More: [[Legacy:Guidelines On Tutorials|Guidelines On Tutorials]].

===Making Rough Starts ===

You don't need to write an entire article for a new page. It's fine to just make a start on something, or write what you know.  If you write a partial article, it can be a good idea to list things you think the article should eventually cover: You can come back to it later, and in the meantime someone else may have made additions to the page. 

It's best to start with content rather than structure though.  If you end up creating many pages of headings with no actual information in them it makes it harder for everyone to find useful information on the wiki.

===Don't submit material that is copyrighted... ===

...unless you have express permission. If you own the copyright (ie if you wrote it yourself), then obviously it's fine. If you already have tutes on the web you are very welcome to add your technological and cultural distinctiveness to our own.

===Use existing resources ===

and don't reinvent the wheel. Most simple tasks are explained on [[:Category:Legacy Basic Procedure]] pages: you can link to those from tutorials.

===Content Ownership===

The content submitted to the wiki does not belong to the author.  It is not the personal property of anyone, but rather the &quot;ownership&quot; belongs to all wiki users.  As a wiki, it's content is subject to change by any other wiki user.  Hopefully this change is for the better, as it usually is.  But, please do not take personal offense to edits on a page you've created.  The edits or changes made were most likely made in the spirit of making the wiki better; more inclusive, more reference-like, more generalized, more linkable, more useful.  If you have a question or comment about the changes made, make your thoughts heard in the Discussion section at the bottom of the page.

==Community ==

(brief notes...) Checking [[Legacy:Recent Changes|Recent Changes]] is part of the responsibilities of being a good Wikizen:
* check for vandalism, 
* see what other people have written and help out if you can, 
* check if you have messages, 
* check what people have been doing on pages you've worked on recently

If you've got a minute to spare, take a look at [[Legacy:UnrealWiki To Do|UnrealWiki To Do]]

==What Next? ==
* You can create a [[:Category:Legacy Personal Page|personal page]] for yourself, and get a smug sense of satisfaction at the increasing number of people who are working together on the project.
* [[Legacy:Recent Changes|Recent Changes]] is the nerve center of the site. It's what the hive mind is currently thinking about. It's also rather a large page, so you may want to change the number of displayed days in your Preferences. It's also where important news about the site is posted.

==See Also ==

Some general guidelines for pages:
* [[Legacy:Guidelines On General Style|Guidelines on General Style]]
* [[Legacy:Guidelines On Page Creation|Guidelines on Page Creation]]
* [[Legacy:Guidelines On Page Links|Guidelines on Page Links]]
* [[Legacy:Guidelines On Technical Names|Guidelines on Technical Names]]
* [[Legacy:Guidelines On Tutorials|Guidelines on Tutorials]]

More about the project and what contributors think of it:
* [[Legacy:Project Aims|Project Aims]]
* [[Legacy:Project FAQ|Project FAQ]]
* [[Legacy:Project Copyright|Project Copyright]]

More information about Wiki:
* [[Legacy:Wiki FAQ|Wiki FAQ]]

Discuss:
* [[Legacy:Project Discussion|Project Discussion]]
* Visit '''#unrealwiki''' on '''irc.enterthegame.com'''
* [http://forums.beyondunreal.com/forumdisplay.php?s=&amp;forumid=249 Unreal Wiki Forum], hosted by Beyond Unreal forums.
* [http://forums.beyoundunreal.com/ BeyondUnreal's General Editing Forum].

==Discussion==

'''Dr.AwkwArD:''' Since I have no idea where to ask general proceedural questions and I'm a &quot;new contributor&quot;, I'll just do it here.  Is there a convenient (or even painful, i suppose) way to generate a list of pages that link to a specific page? 

'''Sweavo:''' you can click on the '''Actor''' title on the actor page for backlinks.

'''Foxpaw:''' Not sure if it's really convention to have a &quot;UT2003&quot; version of the pages.. I believe the convention we've been using is, the straight name refers to the most recent incarnation of the engine, or the engine for which the most recent information is availible. So I wouldn't think we should move Actor to Actor (UT2003) until the next generation Unreal Engine comes out. Though, if there's stuff changed in UT2004, that can be indicated on the page. I don't think that a new page should be created for UT2004 though, if that's what you were thinking.

Anyways, that's just my two cents. In response to your question, it's quite simple. The search searches the text contents of the files that make the wiki pages, not formatted data. So, searching for &lt;nowiki&gt;[[Legacy:Actor|Actor]]&lt;/nowiki&gt; will find all pages that link to actor. Except piped ones, which I guess you might be able to find with &lt;nowiki&gt;{|

|-
|Actor]]
|}
&lt;/nowiki&gt; or something.

I'll warn you though, there's a lot of pages that reference Actor. :D

'''SuperApe:''' Having just been told by Tarquin to not use definition lists for anything but definitions, I find myself having to reformat this page.  After all, this is the one of the first places new people would look for proper formatting, yes?  Edit.

'''Dr.AwkwArD:''' Foxpaw -&gt; '''''&lt;rant&gt;''''' Though present convention may be to use the unembellished name to refer to the most current version of the tech available, I feel rather strongly that it leads to confusion and that we really require a paradigm shift here.  How many pages using &quot;just the name&quot; are actually for the most current game/engine/build?  How many are not?  Loads on both sides, right?  If we begin to associate each section/page/link with the game/engine/build for which it is valid at the time of creation, then the effectiveness of the info will be increased (IMHO); plus, we won't have as much to clean up later (as we do right now... like figuring out if a page is refering to UT, UT2003,or what and then relabeling it).  As a ''user'' of this resource, I've been burned by this very problem several times&amp;ndash;and I know I'm not the only one.  I acknowledge that this kind of overhaul is an enormous undertaking, but even if we go one page, one section at a time, it'll make the WIKI that much more useful, reliable, expedient, trustworthy...'''''&lt;/rant&gt;''''' Phew! Anyway, thanks for the info on searches, that'll definitely come in handy!:D

SuperApe -&gt; What, pray tell, is a &quot;definition list.&quot;  And yes, this is one of the places I came to find examples of WIKI page templates... :)

'''Tarquin:''' answer to questions: 
* click title of page to generate list of backlinks. 
* definition list is HTML DL tag, made by ;: in wiki: read the markup page. and thanks for the layout work here ;)

'''SuperApe:''' Boy, that last comment of mine is old. :D  I would like to suggest a sub-section on this page, but before I go and add it, I wanted some input from the &quot;Wiki elders&quot;: 

''(see Content Ownership above)''

This comes after edits made soon after page creation spur the author to accuse the editor of stealing and vandalism.  The concept of a wiki isn't unique to this site, is it?

'''Sweavo:''' I think (uh, I'm not an elder :-) ) that something like this might be in order.  If users have registered then all their contributions are logged and thus they are acknowledged as author.  But all authors in real publishing expect to be edited, and that's the whole point of a wiki, not only lots of authors but lots of editors too.

'''Tarquin:''' Yup. Except the wiki software we use gradually forgets a page's authors. Look at the history of this one for example.

'''SuperApe:''' Does that mean you like the Content Ownership subsection, Tarquin?  Should I go ahead and move it to the body of the page here?

'''Xian:''' Hello everyone :-) I'm new here but I have my share of experience with UE 1 and would like to share it to those still interested in such an old engine :-) (unfortunately I have no clue of anything from UE 2, but I noticed there are still some things regarding UE 1 which might need some filling up with info, thought you never know). I was curious if copypasting code from the UT SDK (code made by EPIC) is allowed here, as I wanted to make a few comments on a piece of code I recently read out of boredom.

'''Tarquin:''' I think that if it's obvious where the code has come from (eg it's on a class page), and it's a small piece, then fair use applies &amp;ndash; go for it :) And I think it's understood anyway that when you write UnrealScript code you're going to be reusing snippets of Epic's code, the same way you reuse pieces of maps to make new ones.

'''Xian:''' just making sure nobody gets a bite out of justice with copyright issues :) well, since you have an affinity for brushes, check out what I'll post in the Mover section shortly and tell me what you think :) and tnx for your reply mate!

'''SuperApe:''' Moved the Content Ownership section to the main body of the page.

----

'''OlympusMons:''' Where do you post bugs on this wiki? I noticed when ever I type in a window the edit box resizes off the screen and makes it hard to see about 1/5 of the line. Its fine after I resize but as soon as I type its borked again.

----

'''Juxtapose:''' Somewhere there should be a description of the Summary box when editing pages. It took me a while to figure out that it only affects the &quot;recent changes&quot; section of the given page and not the page content itself.

Also, I haven't seen anything mentioned about what happens to your edits when you click &quot;Save.&quot; Either I have amnesia or someone has been moving my edits stealthily.</text>
    </revision>
    <revision>
      <id>5447</id>
      <timestamp>2007-08-02T20:03:33Z</timestamp>
      <contributor>
        <ip>203.223.152.82</ip>
      </contributor>
      <comment>http://bulba.sdsu.edu/docwiki/FrontPage?action=AttachFile&amp;do=get&amp;target=MySpace</comment>
      <text xml:space="preserve">I love your website. It has a lot of great pictures and is very informative. &lt;a href=http://wiki.slimdevices.com/plugin/attachments/HomePage/shrek-3.html &gt;shrek 3 317541240&lt;/a&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:New Features In UT200X</title>
    <id>2301</id>
    <revision>
      <id>5555</id>
      <timestamp>2006-09-17T10:19:47Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a page of features in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]], focusing on the changes from [[Legacy:Unreal Tournament|Unreal Tournament]] editing.

See also: 
* [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]]
* [[Legacy:New UnrealEd Interface In UT200X|New UnrealEd Interface In UT200X]]

==Key Differences ==
* [[Legacy:BSP|BSP]] no longer occludes
* [[Legacy:Static Mesh|Static Mesh]]es form most of the [[Legacy:Unreal World|Unreal World]], much less BSP work
* [[Legacy:Volume|Volume]]s instead of [[Legacy:Zone|Zone]]s for effects such as water, gravity etc. In other words, zones now are ''only'' used for [[Legacy:Map Optimization|Map Optimization]].
* [[Legacy:Antiportal|Antiportal]]s are placed by the mapper for occlusion
* [[Legacy:Sunlight|Sunlight]]

==New Terminology ==
* [[Legacy:Static Mesh|Static Mesh]]es (old page: [[Legacy:Hardware Brush|Hardware Brush]])
* [[Legacy:Karma|Karma]] &amp;ndash; Rigid-body and ragdoll physics, used for map eyecandy and in place of death animations.
* [[Legacy:Terrain|Terrain]]
* [[Legacy:Volume|Volume]]s &amp;ndash; Arbitrary shapes that set players' properties, used instead of zones for water, lava and other zone effects in Unreal Tournament.
* [[Legacy:Antiportal|Antiportal]] &amp;ndash; Used for manual occlusion, since BSP doesn't automatically occlude anymore (and static meshes never did).
* [[Legacy:Static Mesh|Static mesh]]
* [[Legacy:Volume|Volume]]
* [[Legacy:Topics On Materials|Topics On Materials]] - Shaders, cubemaps, whathaveyou.
* [[Legacy:Fluid Surfaces|Fluid surfaces]] - Animated sheets used for fluid surfaces
* [[Legacy:ScriptedTrigger|ScriptedTrigger]] - replaces Counter, Dispatcher, SpecialEventTrigger that were used in UT

==New Tools ==
* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]] (KAT)
* [[Legacy:Matinee|Matinee]]
* [[Legacy:Maya|Maya]]
* [[Legacy:UDE|UDE]] &amp;ndash; This is based on WotGreal.
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] from the Deep Paint guys.
* [[Legacy:Using The Terrain Tool|Using The Terrain Tool]] &amp;ndash; Opens the new Terrain Editor window, for creating complex terrain surfaces.

==Modelling ==
* [[Legacy:Player Modeling|Player Modeling]]
* [[Legacy:Static Mesh Modeling|Static Mesh Modeling]]

==Particle Engine ==

&quot;The particle system in UT2003 looks just amazing. UT just faked it, with particle meshes and animated sprites. UT2003 has a real true-to-life particle system, that lets you do sprite, mesh, or beam emitters. The beam emitters they showed us were used to make very cool lightning effects (and is likely what they use to do the lightning gun's electrical effects). I imagine it can also be used for lasers and similar things. Mesh and sprite emitters really only differ in the type of particles they create. A sprite particle draws a particular texture at its location, a mesh particle draws a fully skinned mesh. In either case, you have a great deal of control over the particles, including their scale, color, and velocity at varying points in time. The particle system in UT2003 looks to be so versatile and adaptive that you can probably spend days creating particle effects and no two will be alike.&quot;

Source: [http://www.rps.net/NE/ Nights Edge]

Lee Perry (Epic)on Polycount:

&quot;but even if they're {they were talking about spacewarps to modify particles} not in our system, DE's system is still in the engine as well, and both are full-function.&quot;

So there appears to be 2 particle systems :)

'''Githianki:''' I posted the above Lee Perry quote on a special mod makers thread over on Polycount where Lee Perry as eepers (:)) hands out info.  He comfirmed that yes there are two complete particle implementations.

&quot;Gith, 

Yeah there's 2 particle systems, Emitters and xEmitters (DE's system). You can use either in levels with no probs. Xemitters still have the ability to be moved around by force effecting things like rockets. DM-Compressed has some steam vents that do this I believe.

The UDN docs should cover our system, I'm not sure if DE has a tutorial for theirs planned or not, but they're both generally easy to use. I heartily reccomend not making effects from scratch, but instead snagging them from other levels, then editing them to what you want customized. The fields in properties are relatively self explanatory and the effects update realtime in the editor, so it's pretty easy to jack around with.

There's no vertex manipulation such as the explosion thing you mentioned, I'm not sure where that story came from, sorry, I haven't heard that before.

There's not a real way to use karma on bits right now without significant code/scripting work for a mod, future engine games may have that but UT2k3 doesn't have that implemented easily right now. Would be nice, but we weren't ready to hold the game's release to implement functions we didn't actually use on the game's shipping characters.

Maybe James has some more insight...&quot;

and from BigSquid (James):

&quot;Regarding dangling Karma stuff from character - as Lee says you can't really do that right now. It will probably be too tricky to add in at this point, but I will look into it if I get a chance...&quot;

The vertex thing was something I asked about a thread discussion in the BeyondUnreal forums where someone posted a pic that sure as heck looked like it had this.  Various previews of Unreal 2 mentiond a similar feature so I thought I'd ask. U2 is a diff engine though (sort of).

==External References ==

* [http://www.epicgames.com/UnrealEngine/Build633Enhancements.html UnrealEd and Engine Enhancements]

==Related Topics ==

===Transferring Maps from Unreal Tournament ===
* [[Legacy:MapScale|MapScale]]

===Projects ===
* [[Legacy:Mod Ideas|Mod Ideas]]

----

'''UsAaR33''': Are you supposed to know this? :p  Can people just put any information they know about UT2K3 or what?

'''Dma:'''  We don't know how we know this.  Mainly rumor and hearsay.  Try googling for DynamicActors or something.  UDN does have some stuff on it about terrain.

'''Tarquin:'''  The link there has a list of new features, but it's a bit old. I'm hoping that with a rough list here we'll have an idea of what to write new pages about when we get the demo. :D

'''EntropicLqd:'''  Arrrrgh!  Stop making me impatient for the game. :(  New stuff sounds fun :)

'''Dma:'''  Actually some loser leaked a demo version of the game.  I didn't know it wasn't legitimate until after I ran it and noticed the banner at the top.

'''UsAaR33''': But basically, I can put anything I do know about the &quot;new features&quot; of UT2003, regardless of how I got such &quot;information&quot;?

'''Mychaeel:'''  Well, there are ''some'' that have legitimate means of knowing those things (and some of it is public knowledge too).  :-)  Posting information gathered from illegally obtained software isn't endorsed, in any case.

'''UsAaR33:''' Well, if I posted something that I don't really know, just delete it :p  And projects, er?

'''Wang:''' Just added a bunch of stuff I came across when bored

'''Hugh:''' UsAaR33: If you're not under NDA, legally, you can say anything you know about it. However, if you're not, but you found out things using 'dodgy' methods (leaked version, talking to someone who was under NDA), then I'd say you probably ought not to say. If you are under NDA, then you're not allowed to say anything which has not already been made public.

'''Tarquin:'''  I've changed the top of this page to reflect that. Hugh, feel free to change it again if it needs it.

'''Mychaeel:'''  As for NDAs:  The one Epic had the people on the [[Legacy:UT2003/Mod Summit|UT2003/Mod Summit]] sign technically disallowed disclosure of any information obtained on the summit to anyone outside the invited mod teams, but Tim Sweeney expressly told us at the end of the summit that we were free to talk about it publicly, and that the NDA's main purpose was to prevent software leaks.

'''DJPaul:''' If, in theory, I knew someone with a leaked build of UT2003, in theory, and I stole a look at the class file, would the data gathered be postable on the Wiki or considered &quot;hands-off&quot;?  Remember, this is in theory and I don't have it, so no accusing.

'''Mychaeel:''' It would be considered hands-off.  We're not going to embrace the use of stolen software, neither directly nor indirectly.

'''Highlander:''' I have been wondering, Due to the use of static meshes in maps, would it be better to go for a granular / modular approch for making meshs. For example: instead of making a large support beam (one of those made from cylinders if you know what i mean) make the cylinders as meshes and simply use them to make the support beam in unrealed(scaled &amp; rotated etc etc...). I realise the memory footprint of lotsa identical smaller meshes would be less (i think). But would there be a performance hit in fps from having to render &quot;more&quot; objects?

'''Mychaeel:''' Well... using many different low-poly meshes is worse for performance than using a single high-poly one many times, I believe.  As for modularity, settle for what makes sense:  That would be (in my opinion, in most cases) neither building an entire map as a static mesh nor making 3D primitives to be combined in UnrealEd but, in your example, building that support beam as a single static mesh.

'''Highlander:''' Another question would be what is happening with collision in ut2k3? is it still cylinders? or can we create arbitary shapes for collision? (do we even still have the option of cylinders?) 

'''Mychaeel:''' See [[Legacy:Hardware Brush|Hardware Brush]].  (Collision cylinders are only for actors, and static meshes aren't technically related to Unreal Tournament's [[Legacy:Decoration|Decoration]] meshes anymore.)

----

'''EntropicLqd:'''  So how are we going to handle UT2003 stuff then?  Has a decision been made yet.  From all accounts (and this is all based upon rumor, speculation, and the odd fact here and there) the class hierarchy for UT2003 is pretty different to that of UT.  It also sounds like a lot of the classes have tweaked (or changed) functionality as well.  Although it does seem like the game isn't due out any time soon now, I think we'll wind up having to keep most of the script-type information seperate from the UT stuff.

'''Mychaeel:''' This has been discussed at length in a now lost thread in the Unreal Wiki forum.  We haven't found a conclusive answer yet, but your input would certainly be welcome.

'''EntropicLqd:'''  Thanks.  I always forget about the Wiki forums.

'''Luggage:''' Better check this whole thread: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636.html PolyCount's Mod Summit thread]

'''Tarquin:''' quote from that thread: &quot;as well as a bunch of non-descript europeans or something&quot; !!!

'''Githianki:''' I've added some info I confirmed about the particle systems.  Someone should go through here (who can do a complete list) and re-factor and clean out obviously old comments.

AS for the mesh questions, recall that each mesh has an overhead so the overall number of dicreet and distinct meshes is what impacts performance (along with tex obviously) not necessarily the number of instances of any one of those meshes or the number of polys in one of those meshes.  That said lots of instances of a huge variety of of high poly meshes will have a big performance impact over a few instances, of a few, low poly meshes.  The least important factor is the poly count of a mesh since the poly numbers that can be thrown around are enormous.

'''GRAFIK:''' Seen as how UT2003 differs little in terms of engine features, instead of having seperate [[Legacy:New Features In UT2004|New Features in UT2004]] as linked to on the Home Page, shouldn't there be a [[Legacy:New Features In UT200X|New Features in UT200X]]?

'''Tarquin:''' Since the 2004 page doesn't exist, yup. Might as well rename this one to 200x and link all the more spcific new feature lists from here.

'''GRAFIK:''' Done. :)
:[Edit: Updated pages linked to at top of page as well.]

'''LionsPhil:''' Would it be worth having a section on &quot;broken/removed features in UT200X&quot;, like warp zones, mirrors, and even vaguely advanced dynamic lighting (no, projectors do not replace that as they don't actually cast light, and &quot;casting shadow&quot; is an unnecessarily complex ugly kludge; bDynamic doesn't work for animation effects like rotation)? I don't mean a whole new node, but just another heading on this one.

'''Evilmrfran:''' There is one big difference in the old and new editors.  The Unreal Ed 2.0 had an option called &quot;create new path network&quot;  As far as I know UT2k3/UT2k4 doesn't have this option.  I miss being lazy -_- lol

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5556</id>
      <timestamp>2005-11-06T15:01:15Z</timestamp>
      <contributor>
        <ip>Mask241.ups.edu</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a page of features in [[Legacy:UT2003|UT2003]] and [[Legacy:UT2004|UT2004]], focusing on the changes from [[Legacy:Unreal Tournament|Unreal Tournament]] editing.

See also: 
* [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]]
* [[Legacy:New UnrealEd Interface In UT200X|New UnrealEd Interface In UT200X]]

==Key Differences ==
* [[Legacy:BSP|BSP]] no longer occludes
* [[Legacy:Static Mesh|Static Mesh]]es form most of the [[Legacy:Unreal World|Unreal World]], much less BSP work
* [[Legacy:Volume|Volume]]s instead of [[Legacy:Zone|Zone]]s for effects such as water, gravity etc. In other words, zones now are ''only'' used for [[Legacy:Map Optimization|Map Optimization]].
* [[Legacy:Antiportal|Antiportal]]s are placed by the mapper for occlusion
* [[Legacy:Sunlight|Sunlight]]

==New Terminology ==
* [[Legacy:Static Mesh|Static Mesh]]es (old page: [[Legacy:Hardware Brush|Hardware Brush]])
* [[Legacy:Karma|Karma]] &amp;ndash; Rigid-body and ragdoll physics, used for map eyecandy and in place of death animations.
* [[Legacy:Terrain|Terrain]]
* [[Legacy:Volume|Volume]]s &amp;ndash; Arbitrary shapes that set players' properties, used instead of zones for water, lava and other zone effects in Unreal Tournament.
* [[Legacy:Antiportal|Antiportal]] &amp;ndash; Used for manual occlusion, since BSP doesn't automatically occlude anymore (and static meshes never did).
* [[Legacy:Static Mesh|Static mesh]]
* [[Legacy:Volume|Volume]]
* [[Legacy:Topics On Materials|Topics On Materials]] - Shaders, cubemaps, whathaveyou.
* [[Legacy:Fluid Surfaces|Fluid surfaces]] - Animated sheets used for fluid surfaces
* [[Legacy:ScriptedTrigger|ScriptedTrigger]] - replaces Counter, Dispatcher, SpecialEventTrigger that were used in UT

==New Tools ==
* [[Legacy:Karma Authoring Tool|Karma Authoring Tool]] (KAT)
* [[Legacy:Matinee|Matinee]]
* [[Legacy:Maya|Maya]]
* [[Legacy:UDE|UDE]] &amp;ndash; This is based on WotGreal.
* [[Legacy:UDebugger|UDebugger]]
* [[Legacy:UPaint|UPaint]] from the Deep Paint guys.
* [[Legacy:Using The Terrain Tool|Using The Terrain Tool]] &amp;ndash; Opens the new Terrain Editor window, for creating complex terrain surfaces.

==Mapping ==
* [[Legacy:UT2003 Mapping|UT2003 Mapping]] &amp;ndash; Contains links to all the pages that were listed here

==Modelling ==
* [[Legacy:Player Modeling|Player Modeling]]
* [[Legacy:Static Mesh Modeling|Static Mesh Modeling]]

==Particle Engine ==

&quot;The particle system in UT2003 looks just amazing. UT just faked it, with particle meshes and animated sprites. UT2003 has a real true-to-life particle system, that lets you do sprite, mesh, or beam emitters. The beam emitters they showed us were used to make very cool lightning effects (and is likely what they use to do the lightning gun's electrical effects). I imagine it can also be used for lasers and similar things. Mesh and sprite emitters really only differ in the type of particles they create. A sprite particle draws a particular texture at its location, a mesh particle draws a fully skinned mesh. In either case, you have a great deal of control over the particles, including their scale, color, and velocity at varying points in time. The particle system in UT2003 looks to be so versatile and adaptive that you can probably spend days creating particle effects and no two will be alike.&quot;

Source: [http://www.rps.net/NE/ Nights Edge]

Lee Perry (Epic)on Polycount:

&quot;but even if they're {they were talking about spacewarps to modify particles} not in our system, DE's system is still in the engine as well, and both are full-function.&quot;

So there appears to be 2 particle systems :)

'''Githianki:''' I posted the above Lee Perry quote on a special mod makers thread over on Polycount where Lee Perry as eepers (:)) hands out info.  He comfirmed that yes there are two complete particle implementations.

&quot;Gith, 

Yeah there's 2 particle systems, Emitters and xEmitters (DE's system). You can use either in levels with no probs. Xemitters still have the ability to be moved around by force effecting things like rockets. DM-Compressed has some steam vents that do this I believe.

The UDN docs should cover our system, I'm not sure if DE has a tutorial for theirs planned or not, but they're both generally easy to use. I heartily reccomend not making effects from scratch, but instead snagging them from other levels, then editing them to what you want customized. The fields in properties are relatively self explanatory and the effects update realtime in the editor, so it's pretty easy to jack around with.

There's no vertex manipulation such as the explosion thing you mentioned, I'm not sure where that story came from, sorry, I haven't heard that before.

There's not a real way to use karma on bits right now without significant code/scripting work for a mod, future engine games may have that but UT2k3 doesn't have that implemented easily right now. Would be nice, but we weren't ready to hold the game's release to implement functions we didn't actually use on the game's shipping characters.

Maybe James has some more insight...&quot;

and from BigSquid (James):

&quot;Regarding dangling Karma stuff from character - as Lee says you can't really do that right now. It will probably be too tricky to add in at this point, but I will look into it if I get a chance...&quot;

The vertex thing was something I asked about a thread discussion in the BeyondUnreal forums where someone posted a pic that sure as heck looked like it had this.  Various previews of Unreal 2 mentiond a similar feature so I thought I'd ask. U2 is a diff engine though (sort of).

==External References ==

* [http://www.epicgames.com/UnrealEngine/Build633Enhancements.html UnrealEd and Engine Enhancements]

==Related Topics ==

===Transferring Maps from Unreal Tournament ===
* [[Legacy:MapScale|MapScale]]

===Projects ===
* [[Legacy:Mod Ideas|Mod Ideas]]

----

'''UsAaR33''': Are you supposed to know this? :p  Can people just put any information they know about UT2K3 or what?

'''Dma:'''  We don't know how we know this.  Mainly rumor and hearsay.  Try googling for DynamicActors or something.  UDN does have some stuff on it about terrain.

'''Tarquin:'''  The link there has a list of new features, but it's a bit old. I'm hoping that with a rough list here we'll have an idea of what to write new pages about when we get the demo. :D

'''EntropicLqd:'''  Arrrrgh!  Stop making me impatient for the game. :(  New stuff sounds fun :)

'''Dma:'''  Actually some loser leaked a demo version of the game.  I didn't know it wasn't legitimate until after I ran it and noticed the banner at the top.

'''UsAaR33''': But basically, I can put anything I do know about the &quot;new features&quot; of UT2003, regardless of how I got such &quot;information&quot;?

'''Mychaeel:'''  Well, there are ''some'' that have legitimate means of knowing those things (and some of it is public knowledge too).  :-)  Posting information gathered from illegally obtained software isn't endorsed, in any case.

'''UsAaR33:''' Well, if I posted something that I don't really know, just delete it :p  And projects, er?

'''Wang:''' Just added a bunch of stuff I came across when bored

'''Hugh:''' UsAaR33: If you're not under NDA, legally, you can say anything you know about it. However, if you're not, but you found out things using 'dodgy' methods (leaked version, talking to someone who was under NDA), then I'd say you probably ought not to say. If you are under NDA, then you're not allowed to say anything which has not already been made public.

'''Tarquin:'''  I've changed the top of this page to reflect that. Hugh, feel free to change it again if it needs it.

'''Mychaeel:'''  As for NDAs:  The one Epic had the people on the [[Legacy:UT2003/Mod Summit|UT2003/Mod Summit]] sign technically disallowed disclosure of any information obtained on the summit to anyone outside the invited mod teams, but Tim Sweeney expressly told us at the end of the summit that we were free to talk about it publicly, and that the NDA's main purpose was to prevent software leaks.

'''DJPaul:''' If, in theory, I knew someone with a leaked build of UT2003, in theory, and I stole a look at the class file, would the data gathered be postable on the Wiki or considered &quot;hands-off&quot;?  Remember, this is in theory and I don't have it, so no accusing.

'''Mychaeel:''' It would be considered hands-off.  We're not going to embrace the use of stolen software, neither directly nor indirectly.

'''Highlander:''' I have been wondering, Due to the use of static meshes in maps, would it be better to go for a granular / modular approch for making meshs. For example: instead of making a large support beam (one of those made from cylinders if you know what i mean) make the cylinders as meshes and simply use them to make the support beam in unrealed(scaled &amp; rotated etc etc...). I realise the memory footprint of lotsa identical smaller meshes would be less (i think). But would there be a performance hit in fps from having to render &quot;more&quot; objects?

'''Mychaeel:''' Well... using many different low-poly meshes is worse for performance than using a single high-poly one many times, I believe.  As for modularity, settle for what makes sense:  That would be (in my opinion, in most cases) neither building an entire map as a static mesh nor making 3D primitives to be combined in UnrealEd but, in your example, building that support beam as a single static mesh.

'''Highlander:''' Another question would be what is happening with collision in ut2k3? is it still cylinders? or can we create arbitary shapes for collision? (do we even still have the option of cylinders?) 

'''Mychaeel:''' See [[Legacy:Hardware Brush|Hardware Brush]].  (Collision cylinders are only for actors, and static meshes aren't technically related to Unreal Tournament's [[Legacy:Decoration|Decoration]] meshes anymore.)

----

'''EntropicLqd:'''  So how are we going to handle UT2003 stuff then?  Has a decision been made yet.  From all accounts (and this is all based upon rumor, speculation, and the odd fact here and there) the class hierarchy for UT2003 is pretty different to that of UT.  It also sounds like a lot of the classes have tweaked (or changed) functionality as well.  Although it does seem like the game isn't due out any time soon now, I think we'll wind up having to keep most of the script-type information seperate from the UT stuff.

'''Mychaeel:''' This has been discussed at length in a now lost thread in the Unreal Wiki forum.  We haven't found a conclusive answer yet, but your input would certainly be welcome.

'''EntropicLqd:'''  Thanks.  I always forget about the Wiki forums.

'''Luggage:''' Better check this whole thread: [http://dynamic.gamespy.com/~polycount/ubb/Forum1/HTML/006636.html PolyCount's Mod Summit thread]

'''Tarquin:''' quote from that thread: &quot;as well as a bunch of non-descript europeans or something&quot; !!!

'''Githianki:''' I've added some info I confirmed about the particle systems.  Someone should go through here (who can do a complete list) and re-factor and clean out obviously old comments.

AS for the mesh questions, recall that each mesh has an overhead so the overall number of dicreet and distinct meshes is what impacts performance (along with tex obviously) not necessarily the number of instances of any one of those meshes or the number of polys in one of those meshes.  That said lots of instances of a huge variety of of high poly meshes will have a big performance impact over a few instances, of a few, low poly meshes.  The least important factor is the poly count of a mesh since the poly numbers that can be thrown around are enormous.

'''GRAFIK:''' Seen as how UT2003 differs little in terms of engine features, instead of having seperate [[Legacy:New Features In UT2004|New Features in UT2004]] as linked to on the Home Page, shouldn't there be a [[Legacy:New Features In UT200X|New Features in UT200X]]?

'''Tarquin:''' Since the 2004 page doesn't exist, yup. Might as well rename this one to 200x and link all the more spcific new feature lists from here.

'''GRAFIK:''' Done. :)
:[Edit: Updated pages linked to at top of page as well.]

'''LionsPhil:''' Would it be worth having a section on &quot;broken/removed features in UT200X&quot;, like warp zones, mirrors, and even vaguely advanced dynamic lighting (no, projectors do not replace that as they don't actually cast light, and &quot;casting shadow&quot; is an unnecessarily complex ugly kludge; bDynamic doesn't work for animation effects like rotation)? I don't mean a whole new node, but just another heading on this one.

'''Evilmrfran:''' There is one big difference in the old and new editors.  The Unreal Ed 2.0 had an option called &quot;create new path network&quot;  As far as I know UT2k3/UT2k4 doesn't have this option.  I miss being lazy -_- lol

[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:New UnrealEd Interface In UT200X</title>
    <id>2303</id>
    <revision>
      <id>5559</id>
      <timestamp>2006-09-17T10:20:38Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">New tools, toolbar buttons etc.

Also new editors such as [[Legacy:Matinee|Matinee]] and the [[Legacy:Terrain Mode|Terrain Mode]].

See also: 
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]]

==Brushes ==

The [[Legacy:Red Builder Brush|red builder brush]] is now solid lines instead of dotted. (''the campaign to bring back the dotted line starts here!'')

'''Dark Pulse:''' Really? Never noticed it...

===Brush-like non-brushes ===

There are now things about that ''look'' like brushes but aren't.
* [[Legacy:Volume|volume]]s
* [[Legacy:Static Mesh|static mesh]]es, aka Hardware Brushes
* [[Legacy:Antiportal|antiportal]]s

===Scaling &amp; Rotation ===
* brush scaling is now a dialog box
* brush rotation seems to be no longer stored in the Movement -&gt; Rotation property. O_o &amp;ndash; but setting a value here still changes the brush

==New Browsers ==

==Problems &amp; Solutions ==

* I can't click anything in the [[Legacy:Viewport|viewport]]s

You probably activated anti-aliasing - turning it off should fix the problem.

==Discussion ==

'''Tarquin:''' We could fold material from this page into the FAQ and the general UEd Interface pages

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5560</id>
      <timestamp>2003-07-05T04:37:13Z</timestamp>
      <contributor>
        <ip>Dark Pulse</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">New tools, toolbar buttons etc.

Also new editors such as [[Legacy:Matinee|Matinee]] and the [[Legacy:Terrain Mode|Terrain Mode]].

See also: 
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]]
* [[Legacy:UT2003 Mapping|UT2003 Mapping]]

==Brushes ==

The [[Legacy:Red Builder Brush|red builder brush]] is now solid lines instead of dotted. (''the campaign to bring back the dotted line starts here!'')

'''Dark Pulse:''' Really? Never noticed it...

===Brush-like non-brushes ===

There are now things about that ''look'' like brushes but aren't.
* [[Legacy:Volume|volume]]s
* [[Legacy:Static Mesh|static mesh]]es, aka Hardware Brushes
* [[Legacy:Antiportal|antiportal]]s

===Scaling &amp; Rotation ===
* brush scaling is now a dialog box
* brush rotation seems to be no longer stored in the Movement -&gt; Rotation property. O_o &amp;ndash; but setting a value here still changes the brush

==New Browsers ==

==Problems &amp; Solutions ==

* I can't click anything in the [[Legacy:Viewport|viewport]]s

You probably activated anti-aliasing - turning it off should fix the problem.

==Discussion ==

'''Birelli:''' I started a tutorials section, but on second thought this page should probably just go in its entirety and move everything into &quot;new features in UT2003&quot; (along with the scripting page). And then just make a subpage off of that called something like &quot;UT2003 Mapping&quot; with content from this page and more.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:New UnrealScript In UT200X</title>
    <id>2302</id>
    <revision>
      <id>5557</id>
      <timestamp>2005-05-31T15:59:22Z</timestamp>
      <contributor>
        <ip>Defx666</ip>
      </contributor>
      <comment>*removed a useless comment in the middle of the text</comment>
      <text xml:space="preserve">See also:

* [[Legacy:UT2003|UT2003]]
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:New UnrealEd Interface In UT200X|New UnrealEd Interface In UT200X]]

; UnrealEd : More control over [[Legacy:Actor|actor]]s' representation in UnrealEd.
;* Syntax extension to class declarations to hide (inherited) editable property categories from the property sheet in UnrealEd: &lt;code&gt;hidecategories(category names)&lt;/code&gt;
;* The previously existing &lt;code&gt;nousercreate&lt;/code&gt; class attribute seems to have been renamed to &lt;code&gt;notplaceable&lt;/code&gt;, and there's a new (redundant?) &lt;code&gt;placeable&lt;/code&gt; class attribute.  Placeable classes are marked with an asterisk in the new [[Legacy:Actor Browser|actor browser]].
;* Classes and objects can be marked as &lt;code&gt;editinline&lt;/code&gt;, which allows their use and creation directly in another object's property sheet.

; Artificial Intelligence :
;* The class-level distinction between bots and players has shifted: You'll have models with plug-in &quot;controllers&quot; which can either be players (local or remote) or bot brains &amp;ndash; that's going to make modding bot behavior very much easier. Not forgetting the ability to write a custom playerpawn and have it support all (including custom) models. You can also plug in controllers at will, allowing you to possess bots for example during a game.
;* Bot AI is at higher levels split in team AI and squad AI.  Each team is built of one or more squads which contain one or more bots.

;:'''See Also:''' [[Legacy:Controller Overview|Controller Overview]]

; Dynamic Array Support : Are accessed like regular arrays, but provide a &lt;code&gt;Length&lt;/code&gt; property (read/write) to set their size dynamically and various methods to add, insert and remove items.

; Weapon Split: Weapons have been split into various actors for handling firing, pickup view, muzzleflash?, etc.
; AccessControl : does servery, adminy things, such as handle bans, kicks, cheats, etc.
; BroadcastHandler : controls whether the player can say anything, recives any sort of ingame message, etc.

; New Iterators :
;* '''DynamicActors''', loops over all actors that have been dynamically added since the game started (as opposed to &quot;were statically present in the loaded map&quot;).  According to Mongo, all bStatic actors are &quot;sorted&quot; placed at the beginning of the actor list; all non-bStatic ones are placed after.  The interator starts at the non-bStatic ones.
;* '''AllObjects'''. The Garbage Collection array has been opened up to UnrealScript.

; More new native functions (besides Iterators) :
;*Hud drawing is simplified in the [[Legacy:HUDBase|HUDBase]] class, with the DrawSpriteWidget and DrawNumericWidget functions.

; Created: All [[Legacy:Object|Object]]s now receive notification when they are created (similar to [[Legacy:Actor|Actor]].(Pre/Post)BeginPlay())

; Trig functions: Asin(), Acos(), and Atan2() (the more exact atan) are open to unrealscript.

; DrawScale3D: Can now scale by height, length, and width, as opposed to raw drawscale and fatness.

; Delegated Functions : Basically method pointers, to be used in OnEvent-style events. See [[Legacy:Delegate|Delegate]], [[udn2:UnrealScriptDelegates]].

; Animation Control : Coders will have a lot of control over animations, apparently. For instance, you can instruct an animation to only play for a certain bone (and its sub-bones), and a different animation on other bones. In other words, you can combine a running animation (for the legs) with a shooting animation (for the torso) and a talking or head turning animation (for the head). Source: [http://www.rps.net/NE/ Nights Edge]

; Exec Directive : new stuff in [[Legacy:Exec Directive|Exec Directive]]

; Class definition : New modifier keywords and you can't use ''expands'' anymore. Always use ''extends'' now. (see [[Legacy:Class_Syntax|Class_Syntax]])

; Actor names : You'll find that actors you spawn will not have sequentially numbered names by default, instead they'll just have the name of their class which can make debugging tricky.  Run UT2K3 with the &quot;-makenames&quot; switch and they'll be numbered just like in UT.

----

'''Mychaeel:''' I noticed an interesting new UnrealScript keyword in class [[Legacy:ConstantColor|ConstantColor]] (might be elsewhere too):  &lt;code&gt;cpptext { ... }&lt;/code&gt;.  Any ideas on that one? 

'''EntropicLqd:''' Case-sensitive function delcarations that hook directly to C++ equivalents by the looks of it.  Used in a fair number of places as well.  Only used in native functions and only used to declare functions.

'''Mychaeel:''' I figured that much out myself.  What I'm interested in is:  What purpose does it serve?  Does it directly output arbitrary C++ code into the C++ headers generated from the UnrealScript sources?

'''Trystan:''' I'm assuming you're working with the Epic sources and not the UnrealEd extracted sources.  In the UnrealEd extracted sources each line of a cpptext indicator is simply &lt;tt&gt;// (cpptext)&lt;/tt&gt;, so apparently UnrealEd doesn't know what to do with it.  A Google cached page showing it is at http://216.239.39.100/search?q=cache:pP3sM2uVC7oC:udn.epicgames.com/pub/Technical/AnimNotifies/+cpptext&amp;hl=en&amp;ie=UTF-8 - perhaps that will shed some light for your more experienced guys.  (Er, the content isn't available straight from the Epic site since it's for licensees only, so I guess Mychaeel may want to delete this..)  Looks like it's always used for virtual functions.. dunno, I'm sure you guys know all this. :)

'''Wormbo:''' I think I heared it in #unrealscript that the compiler comments out those lines to ensure the sources can be exported properly. Something with line numbers getting messed up.

===Discussion ===

'''DJPaul:''' Need explanation/example of delegated functions quick sharp.

'''Wormbo:''' They are explained on the UDN: [[udn2:UnrealScriptDelegates]]</text>
    </revision>
    <revision>
      <id>5558</id>
      <timestamp>2004-03-18T19:45:16Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">See also:

* [[Legacy:UT2003|UT2003]]
* [[Legacy:New Features In UT200X|New Features In UT200X]]
* [[Legacy:New UnrealEd Interface In UT200X|New UnrealEd Interface In UT200X]]

; UnrealEd : More control over [[Legacy:Actor|actor]]s' representation in UnrealEd.
;* Syntax extension to class declarations to hide (inherited) editable property categories from the property sheet in UnrealEd: &lt;code&gt;hidecategories(category names)&lt;/code&gt;
;* The previously existing &lt;code&gt;nousercreate&lt;/code&gt; class attribute seems to have been renamed to &lt;code&gt;notplaceable&lt;/code&gt;, and there's a new (redundant?) &lt;code&gt;placeable&lt;/code&gt; class attribute.  Placeable classes are marked with an asterisk in the new [[Legacy:Actor Browser|actor browser]].
;* Classes and objects can be marked as &lt;code&gt;editinline&lt;/code&gt;, which allows their use and creation directly in another object's property sheet.

; Artificial Intelligence :
;* The class-level distinction between bots and players has shifted: You'll have models with plug-in &quot;controllers&quot; which can either be players (local or remote) or bot brains &amp;ndash; that's going to make modding bot behavior very much easier. Not forgetting the ability to write a custom playerpawn and have it support all (including custom) models. You can also plug in controllers at will, allowing you to possess bots for example during a game.
;* Bot AI is at higher levels split in team AI and squad AI.  Each team is built of one or more squads which contain one or more bots.
;:'''DJPaul:''' Allowing some possesion-type mods, I forsee when the 1337 scripting kids find out about this.
;:'''See Also:''' [[Legacy:Controller Overview|Controller Overview]]

; Dynamic Array Support : Are accessed like regular arrays, but provide a &lt;code&gt;Length&lt;/code&gt; property (read/write) to set their size dynamically and various methods to add, insert and remove items.

; Weapon Split: Weapons have been split into various actors for handling firing, pickup view, muzzleflash?, etc.
; AccessControl : does servery, adminy things, such as handle bans, kicks, cheats, etc.
; BroadcastHandler : controls whether the player can say anything, recives any sort of ingame message, etc.

; New Iterators :
;* '''DynamicActors''', loops over all actors that have been dynamically added since the game started (as opposed to &quot;were statically present in the loaded map&quot;).  According to Mongo, all bStatic actors are &quot;sorted&quot; placed at the beginning of the actor list; all non-bStatic ones are placed after.  The interator starts at the non-bStatic ones.
;* '''AllObjects'''. The Garbage Collection array has been opened up to UnrealScript.

; More new native functions (besides Iterators) :
;*Hud drawing is simplified in the [[Legacy:HUDBase|HUDBase]] class, with the DrawSpriteWidget and DrawNumericWidget functions.

; Created: All [[Legacy:Object|Object]]s now receive notification when they are created (similar to [[Legacy:Actor|Actor]].(Pre/Post)BeginPlay())

; Trig functions: Asin(), Acos(), and Atan2() (the more exact atan) are open to unrealscript.

; DrawScale3D: Can now scale by height, length, and width, as opposed to raw drawscale and fatness.

; Delegated Functions : Basically method pointers, to be used in OnEvent-style events. See [[Legacy:Delegate|Delegate]], [[udn2:UnrealScriptDelegates]].

; Animation Control : Coders will have a lot of control over animations, apparently. For instance, you can instruct an animation to only play for a certain bone (and its sub-bones), and a different animation on other bones. In other words, you can combine a running animation (for the legs) with a shooting animation (for the torso) and a talking or head turning animation (for the head). Source: [http://www.rps.net/NE/ Nights Edge]

; Exec Directive : new stuff in [[Legacy:Exec Directive|Exec Directive]]

; Class definition : New modifier keywords and you can't use ''expands'' anymore. Always use ''extends'' now. (see [[Legacy:Class_Syntax|Class_Syntax]])

; Actor names : You'll find that actors you spawn will not have sequentially numbered names by default, instead they'll just have the name of their class which can make debugging tricky.  Run UT2K3 with the &quot;-makenames&quot; switch and they'll be numbered just like in UT.

----

'''Mychaeel:''' I noticed an interesting new UnrealScript keyword in class [[Legacy:ConstantColor|ConstantColor]] (might be elsewhere too):  &lt;code&gt;cpptext { ... }&lt;/code&gt;.  Any ideas on that one? 

'''EntropicLqd:''' Case-sensitive function delcarations that hook directly to C++ equivalents by the looks of it.  Used in a fair number of places as well.  Only used in native functions and only used to declare functions.

'''Mychaeel:''' I figured that much out myself.  What I'm interested in is:  What purpose does it serve?  Does it directly output arbitrary C++ code into the C++ headers generated from the UnrealScript sources?

'''Trystan:''' I'm assuming you're working with the Epic sources and not the UnrealEd extracted sources.  In the UnrealEd extracted sources each line of a cpptext indicator is simply &lt;tt&gt;// (cpptext)&lt;/tt&gt;, so apparently UnrealEd doesn't know what to do with it.  A Google cached page showing it is at http://216.239.39.100/search?q=cache:pP3sM2uVC7oC:udn.epicgames.com/pub/Technical/AnimNotifies/+cpptext&amp;hl=en&amp;ie=UTF-8 - perhaps that will shed some light for your more experienced guys.  (Er, the content isn't available straight from the Epic site since it's for licensees only, so I guess Mychaeel may want to delete this..)  Looks like it's always used for virtual functions.. dunno, I'm sure you guys know all this. :)

'''Wormbo:''' I think I heared it in #unrealscript that the compiler comments out those lines to ensure the sources can be exported properly. Something with line numbers getting messed up.

===Discussion ===

'''DJPaul:''' Need explanation/example of delegated functions quick sharp.

'''Wormbo:''' They are explained on the UDN: [[udn2:UnrealScriptDelegates]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:New UnrealScript In UT3</title>
    <id>2312</id>
    <revision>
      <id>5575</id>
      <timestamp>2008-01-18T20:39:53Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>created page with lots of content already</comment>
      <text xml:space="preserve">This is a list of new UnrealScript features in [[Legacy:UT3|UT3]], compared to [[Legacy:UT2004|UT2004]]:

==Interfaces==

Previously only some licensees implemented interface support in their games, but UnrealEngine 3 adds it as a default feature.

Interfaces are declared in separate .UC files, just like classes. The difference is, that they are declared using the keyword &quot;interface&quot; instead of &quot;class&quot;. Interfaces don't have to extend from any other class, but if they do, the other class needs to be an interface as well.

Like in Java, you can only declare constants (not variables marked with the &quot;const&quot; modifier!), functions and delegates. It is currently unknown whether functions and delegates can have an implementation, but some stock interfaces declare native functions, which could be considered a kind of implementation.

==Built-in Preprocessor==

The [[Legacy:UE3 Preprocessor|UE3 Preprocessor]] provides a powerful macro system, similar to that provided by elmuerte's [[Legacy:UCPP|UCPP]]. There are a few built-in macro functions and values. For example the type of compiler run can be determined by checking if any of the macros DEBUG, RELEASE or FINAL_RELEASE are defined.

Logging is preferably done through the `log() and `warn() macro functions now. They take the message string as first parameter and an optional condition as second parameter. The message is only logged if the condition evaluates to true at runtime.

There are no instances of user-defined macro functions in the downloadable UnrealScript sources, but several instances of macro definitions for code snippets. An example is located in Object.uc:

&lt;uscript&gt;
`if(`isdefined(FINAL_RELEASE))
 	`define	prevent_direct_calls	private
 `else
 	`define	prevent_direct_calls
 `endif
&lt;/uscript&gt;

it is used further down in declaration of the LogInternal and WarnInternal functions, which now should be called through the `log and `warn macros:

&lt;uscript&gt;
native(231) final static `{prevent_direct_calls}  function LogInternal( coerce string S, optional name Tag );
native(232) final static `{prevent_direct_calls}  function WarnInternal( coerce string S );
&lt;/uscript&gt;

The `{''macroname''} syntax apparently means the macro value should be omitted from the imported source code, but still be used by the compiler. If the macro value should be inserted into the imported source code, use the `''macroname'' syntax instead.

==No More #-Directives==

There's no replacement for #[[Legacy:Exec Directive|exec directive]]s, you have to use UnrealEd to import resources now.

The (admittedly, very infrequently used) '''#include''' directive has been replaced by the '''`include()''' preprocessor macro.

==New Default Properties Features==

In addition to the defaultproperties block of the class file you can now also specify a structdefaultproperties block for every newly declared struct type. Members of a struct variable are initialized with the specified values, no matter where the struct is used.

Default dynamic array values can now be added or removed with special macros. (see '''New Dynamic Array Features''' below)

[[Legacy:Subobject|Subobject]]s can now be modified by subclasses. For this, the subobject needs to be redeclared in the subclass's defaults block with the same name, but without a class specification. The following is an example from [[Legacy:PathNode|PathNode]] changing the sprite component's texture:

&lt;uscript&gt;
defaultproperties
{
	Begin Object NAME=Sprite
		Sprite=Texture2D'EngineResources.S_Pickup'
	End Object
}
&lt;/uscript&gt;

The &quot;Sprite&quot; object was originally defined in the [[Legacy:NavigationPoint|NavigationPoint]] class:

&lt;uscript&gt;
	Begin Object Class=SpriteComponent Name=Sprite
		Sprite=Texture2D'EngineResources.S_NavP'
		HiddenGame=true
		HiddenEditor=false
		AlwaysLoadOnClient=False
		AlwaysLoadOnServer=False
	End Object
	Components.Add(Sprite)
	GoodSprite=Sprite
&lt;/uscript&gt;

Note that &lt;code&gt;HiddenGame&lt;/code&gt;, etc. are inherited by the PathNode Sprite. If these classes were in different packages and the NavigationPoint's Sprite properties were changed, all changes (except those to the Sprite property, which was overridden in PathNode's Sprite) would propagate to the PathNode Sprite without recompiling its package as well.

==New Dynamic Array Features==

[[Legacy:Dynamic Array|Dynamic array]]s are now a lot easier to handle, both in regular code and the [[Legacy:Default Properties|default properties]] blocks. In UT200x dynamic arrays only had the property Length and the functions Insert and Remove and they were only available in regular code, not in the defaults section.

Now the following additional functions are available in regular code:

; Add(''number'') : Adds empty elements to the end of the array. &lt;code&gt;ar.Add(x)&lt;/code&gt; is the same as: &lt;uscript&gt;ar.Length = ar.Length + x;&lt;/uscript&gt;

; AddItem(''value'') : Adds the value to the array. &lt;code&gt;ar.AddItem(value)&lt;/code&gt; is the same as: &lt;uscript&gt;ar[ar.Length] = value;&lt;/uscript&gt;

; RemoveItem(''value'') : Removes all occurrences of the value from the array. For example &lt;code&gt;ar.RemoveItem(none)&lt;/code&gt; removes all empty elements from an object array, which would otherwise require code similar to the following snippet but is likely to perform faster: &lt;uscript&gt;
for (i = ar.length-1; i &gt;= 0; i--)
  if (ar[i] == None)
    ar.Remove(i, 1);
&lt;/uscript&gt;

; InsertItem(''value'', ''index'') : Inserts a value before the specified array element. &lt;code&gt;ar.InsertItem(x, i)&lt;/code&gt; has the same effect as: &lt;uscript&gt;
ar.Insert(i, 1);
ar[i] = x;
&lt;/uscript&gt;

; Find(''value'') : Searches for a value and either returns the index of the first array element containing that value or -1 if the array doesn't contain the value.

; Find(''property name'', ''value'') : A special version of '''Find''' for dynamic arrays of structs. The first parameter must be a name value matching the name of the struct member to compare to the specified value.

Additionally, every dynamic arrays automatically serves as an [[Legacy:Iterator|Iterator]] function. If an actual iterator function existed, its declaration would probably look similar to the following:

&lt;uscript&gt;
// The array would be declared as &quot;array&lt;ArrayType&gt; ArrayName&quot;
// NOTE: No actual code!
native iterator function ArrayName(out ArrayType Value, optional out int Index);
&lt;/uscript&gt;

Note that, unlike &quot;real&quot; iterator functions, there's no way to limit the output to certain classes.

And finally, UnrealEngine 3 also adds dynamic array macros to defaultproperties and the new structdefaultproperties blocks. These are different from the functions available in &quot;real&quot; code.

; Add(''value'') : Like AddItem in real code.

; Remove(''value'') : Like RemoveItem in real code. This makes it easier to remove specific inherited values from a dynamic array without having to know the exact index.

; Empty : Removes all inherited values from the dynamic array. You don't have to add any parentheses after this one.

==Metatags for Variables and Enum Elements==

After the name of class and struct variables and enum elements you can now add metadata in angle brackets. Various fields are comma-separated.

Syntax:
 var() ''usual modifiers'' type name&lt;tag1=value1,tag2=value2,tag3&gt;;

The following tags have been spotted in the UT3 UnrealScript source code:

; Tooltip=''text'' : Displays the specified description as tooltip for the variable in UnrealEd's property window. Note that it's usually easier to use a doc comment, i.e. &lt;code&gt;/** ... */&lt;/code&gt;, but if you already have such a comment and want to use a different text for the tooltip, you need to use the tag to override the displayed text.

; DisplayName=''text'' : Displays the specified text instead of the variable or enum element name. Note that UnrealEd already automatically removes enum name prefixes in ALL-CAPS followed by an underscore '_' character.

; EditCondition=''boolean value'' : ''(needs confirmation)'' Similar to the editconst variable modifier, but applied dynamically based on the specified condition.&lt;br /&gt;All occurrences in stock code refer to bool variables at the same scope, i.e. for class variables it's a bool variable in the same class and for struct members it's a bool-type member in the same struct.

; AllowAbstract : For variables of type Class this tag allows the user to select abstract classes. Without the tag, only non-abstract classes can be selected from the drop-down list. Always use this tag if you don't intend to create instances of the specified class. For for example it is absolutely essential to use this class for [[Legacy:DamageType|DamageType]]s or [[Legacy:LocalMessage|LocalMessage]]s, since those classes are always abstract.

; AutoComment=true : Apparently this tag only works in [[Legacy:SequenceObject|SequenceObject]] classes and also only if the class's bSuppressAutoComment property is set to false. The effect of this tag seems to be that the tagged variable's value is displayed in the sequence object's comment in the [[Legacy:Kismet|Kismet]] editor.</text>
    </revision>
    <revision>
      <id>43029</id>
      <timestamp>2010-04-22T05:25:48Z</timestamp>
      <contributor>
        <username>Eliot</username>
        <id>65</id>
      </contributor>
      <minor/>
      <comment>Redirected</comment>
      <text xml:space="preserve">#REDIRECT [[UnrealScript history]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:New Unrealscript In UT2003</title>
    <id>2305</id>
    <revision>
      <id>5563</id>
      <timestamp>2004-12-12T09:10:44Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:New UnrealScript In UT200X|New UnrealScript In UT200X]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Newbie</title>
    <id>2270</id>
    <revision>
      <id>5490</id>
      <timestamp>2005-12-16T19:21:10Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Definition==

'''Newbie''' (''nĕw' bē'') (n) : A person new to and thus unexperienced in something, a novice. (aka: noob, n00b, newb)

==Overview==

Everybody was a newbie once for everything he or she knows, so being a newbie alone is nothing contemptible.  Quite often newbies don't just lack ''experience'' or ''knowledge'' but ''common sense'' and display a considerable amount of ''ignorance'' though; those people are frequently, with a certain degree of contempt, called '''n00bs'''.

==Are you a n00b? ==

The key sign of a n00b is that they think big. Way, way too big. Cool it. Your first map or mod does not have to redefine the genre, push the engine to its limits, or do something that's never been done before. 

* Do you ever describe an idea as &quot;best ever&quot; (or even &quot;bestest evar&quot;)?
* Do you have a website and only a website for your new mod idea, and do you lack any of the technical skills needed to make a mod at the same time?

==Related Topics==
* [[Legacy:Terminology|Terminology]]
* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]]
* [http://mep.beyondunreal.com/mymod.html SUPER UBER COOL MOD]

==Discussion==

(I hope you dont mind me adding this?)

'''Will:'''

Anyway, I disagree with this point (among others):

&quot;Do you use abbreviations like &quot;ne1&quot;, &quot;nme&quot;, &quot;u&quot;, &quot;4&quot; in written text outside IRC?&quot;

In my opinion that is not down to 'n00bish-ness', but pure lazyness. I freqently get frustrated with people who refuse to use full english, when they can perfectly well.

As for 'thinking big', then failing to acheive as you described using a map as an analogy, personally I dont think that is a sign of being a newbie. Its a case of attempting to do something you're not yet experienced enough to do. A 'non-n00b' will realise that, and put the project on hold for a while until they are experienced enough to achieve the desired result. A 'n00b' will, when coming up against a block, just pester others to solve their problem (though that applies more to 'copy-and-paste' coders).

'''Tarquin:''' My typing is atrocious, so the fewer letter, the less chance of typos. Also, IRC has an immediacy that wiki or forums don't; there's often an impulse to respond as quickly as possible. I will cheerfully admit that my first few maps were atrocious. I was way too ambitious, and yes, I too had ideas of &quot;pushing the engine&quot;, &quot;doing something '''big'''&quot;, etc. My advice to beginner mappers is along the same lines as DavidM's: don't try to be wildly original. Focus on technique. Don't try anything fancy: stick to the basic UT [[Legacy:Texture Package|Texture Package]], if you don't understand movers or triggers, don't use them. Stick to geometry and (unfortunately) bot pathing.

'''Wormbo:''' Same goes for coding. Don't try to make a huge TC, start small with mutators. Try to understand how UnrealScript works, your first mods will soon grow almost on their own. (Trust me, Rockets UT is one of my very first mods. :) )

'''ProjectX:''' And what a sweet mod it was :)

'''Wormbo:''' Mind you, '''is'''. ;) I don't see, why I should completely stop working on it just because I have UT 2003 now. Some people still play UT and search for new mods. It would be stupid to trash all the work right before finishing the mod you put most of your coding time into.

'''Eldhrin:''' Mutators are a great place to start, I'm liking coding them lots. Probably too ambitious on Sorcery, but I don't have any other real ideas right now. Maybe if I can find out how to make a new keybinding, I can come up with some interesting ones that add new abilities or something. Or maybe new adrenaline stuff... just random thoughts here :-)

'''SabbathCat:''' Heheh. I'll admit to a handful of the crimes listed. Yeah, mutators are a great place to start, just to play about with source and messing about with changing properties to ease your way into the language. Especially if you've no previous experience of [[Legacy:OOP|OOP]]. From about the age of 10 I was playing with Basic on the Commodore 64, then moving onto my Dad's 286 and GWbasic. UnrealScript is a totally different beast for anyone coming from a sequential language background. For someone starting out in UnrealScript, (as I am re-learning ), It's far more rewarding to have a small script you've actually hand-typed yourself than something bigger, but that you've simply bashed together from other scripts without really understanding or learning anything from what you've done. :)

'''Draconx:''' It's always good to start small - even better to do something small that can be extended.  My current project (RuneUT) is just a fairly basic mutator, but the whole thing can be taken one rune at a time.  This is actually my first *real* mod for UT, before I just did some fairly basic map actors (See: [[Legacy:Input Keys|Input Keys]] &amp; [[Legacy:Changing The Enforcer (UT)|Changing the Enforcer (UT)]]).  After those and a few more, I took on the more ambitious project, which will feature 700 unique runes with bot support so good you'll wish you could beat them, as well as 30 maps designed exclusively for the mod!  (j/k :wink:)

'''SuperApe:''' Nice. :D  ( Add [[:Category:Legacy FAQ]]? ;) )</text>
    </revision>
    <revision>
      <id>5491</id>
      <timestamp>2004-09-02T16:30:45Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">'''Newbie,''' a person new to and thus unexperienced in something.

Everybody was a newbie once for everything he or she knows, so being a newbie alone is nothing contemptible.  Quite often newbies don't just lack ''experience'' or ''knowledge'' but ''common sense'' and display a considerable amount of ''ignorance'' though; those people are frequently, with a certain degree of contempt, called '''n00bs'''.

==Are you a n00b? ==

The key sign of a n00b is that they think big. Way, way too big. Cool it. Your first map or mod does not have to redefine the genre, push the engine to its limits, or do something that's never been done before. 

* Do you ever describe an idea as &quot;best ever&quot; (or even &quot;bestest evar&quot;)?
* Do you have a website and only a website for your new mod idea, and do you lack any of the technical skills needed to make a mod at the same time?

==Related Topics ==

* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]]
* [http://mep.beyondunreal.com/mymod.html SUPER UBER COOL MOD]

==Comments ==

(I hope you dont mind me adding this?)

'''Will:'''

Anyway, I disagree with this point (among others):

&quot;Do you use abbreviations like &quot;ne1&quot;, &quot;nme&quot;, &quot;u&quot;, &quot;4&quot; in written text outside IRC?&quot;

In my opinion that is not down to 'n00bish-ness', but pure lazyness. I freqently get frustrated with people who refuse to use full english, when they can perfectly well.

As for 'thinking big', then failing to acheive as you described using a map as an analogy, personally I dont think that is a sign of being a newbie. Its a case of attempting to do something you're not yet experienced enough to do. A 'non-n00b' will realise that, and put the project on hold for a while until they are experienced enough to achieve the desired result. A 'n00b' will, when coming up against a block, just pester others to solve their problem (though that applies more to 'copy-and-paste' coders).

'''Tarquin:''' My typing is atricious, so the fewer letter, the less chance of typos. Also, IRC has an immediacy that wiki or forums don't; there's often an impulse to respond as quickly as possible. I will cheerfully admit that my first few maps were atrocious. I was way too ambitious, and yes, I too had ideas of &quot;pushing the engine&quot;, &quot;doing something '''big'''&quot;, etc. My advice to beginner mappers is along the same lines as DavidM's: don't try to be wildly original. Focus on technique. Don't try anything fancy: stick to the basic UT [[Legacy:Texture Package|Texture Package]], if you don't understand movers or triggers, don't use them. Stick to geometry and (unfortunately) bot pathing.

'''Wormbo:''' Same goes for coding. Don't try to make a huge TC, start small with mutators. Try to understand how UnrealScript works, your first mods will soon grow almost on their own. (Trust me, Rockets UT is one of my very first mods. :) )

'''ProjectX:''' And what a sweet mod it was :)

'''Wormbo:''' Mind you, '''is'''. ;) I don't see, why I should completely stop working on it just because I have UT 2003 now. Some people still play UT and search for new mods. It would be stupid to trash all the work right before finishing the mod you put most of your coding time into.

'''Eldhrin:''' Mutators are a great place to start, I'm liking coding them lots. Probably too ambitious on Sorcery, but I don't have any other real ideas right now. Maybe if I can find out how to make a new keybinding, I can come up with some interesting ones that add new abilities or something. Or maybe new adrenaline stuff... just random thoughts here :-)

'''SabbathCat:''' Heheh. I'll admit to a handful of the crimes listed. Yeah, mutators are a great place to start, just to play about with source and messing about with changing properties to ease your way into the language. Especially if you've no previous experience of [[Legacy:OOP|OOP]]. From about the age of 10 I was playing with Basic on the Commodore 64, then moving onto my Dad's 286 and GWbasic. UnrealScript is a totally different beast for anyone coming from a sequential language background. For someone starting out in UnrealScript, (as I am re-learning ), It's far more rewarding to have a small script you've actually hand-typed yourself than something bigger, but that you've simply bashed together from other scripts without really understanding or learning anything from what you've done. :)</text>
    </revision>
    <revision>
      <id>5492</id>
      <timestamp>2004-10-27T04:34:52Z</timestamp>
      <contributor>
        <ip>Draconx</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''Newbie,''' a person new to and thus unexperienced in something.

Everybody was a newbie once for everything he or she knows, so being a newbie alone is nothing contemptible.  Quite often newbies don't just lack ''experience'' or ''knowledge'' but ''common sense'' and display a considerable amount of ''ignorance'' though; those people are frequently, with a certain degree of contempt, called '''n00bs'''.

==Are you a n00b? ==

The key sign of a n00b is that they think big. Way, way too big. Cool it. Your first map or mod does not have to redefine the genre, push the engine to its limits, or do something that's never been done before. 

* Do you ever describe an idea as &quot;best ever&quot; (or even &quot;bestest evar&quot;)?
* Do you have a website and only a website for your new mod idea, and do you lack any of the technical skills needed to make a mod at the same time?

==Related Topics ==

* [[Legacy:Mychaeel/Mod Startups|Mychaeel/Mod Startups]]
* [http://mep.beyondunreal.com/mymod.html SUPER UBER COOL MOD]

==Comments ==

(I hope you dont mind me adding this?)

'''Will:'''

Anyway, I disagree with this point (among others):

&quot;Do you use abbreviations like &quot;ne1&quot;, &quot;nme&quot;, &quot;u&quot;, &quot;4&quot; in written text outside IRC?&quot;

In my opinion that is not down to 'n00bish-ness', but pure lazyness. I freqently get frustrated with people who refuse to use full english, when they can perfectly well.

As for 'thinking big', then failing to acheive as you described using a map as an analogy, personally I dont think that is a sign of being a newbie. Its a case of attempting to do something you're not yet experienced enough to do. A 'non-n00b' will realise that, and put the project on hold for a while until they are experienced enough to achieve the desired result. A 'n00b' will, when coming up against a block, just pester others to solve their problem (though that applies more to 'copy-and-paste' coders).

'''Tarquin:''' My typing is atricious, so the fewer letter, the less chance of typos. Also, IRC has an immediacy that wiki or forums don't; there's often an impulse to respond as quickly as possible. I will cheerfully admit that my first few maps were atrocious. I was way too ambitious, and yes, I too had ideas of &quot;pushing the engine&quot;, &quot;doing something '''big'''&quot;, etc. My advice to beginner mappers is along the same lines as DavidM's: don't try to be wildly original. Focus on technique. Don't try anything fancy: stick to the basic UT [[Legacy:Texture Package|Texture Package]], if you don't understand movers or triggers, don't use them. Stick to geometry and (unfortunately) bot pathing.

'''Wormbo:''' Same goes for coding. Don't try to make a huge TC, start small with mutators. Try to understand how UnrealScript works, your first mods will soon grow almost on their own. (Trust me, Rockets UT is one of my very first mods. :) )

'''ProjectX:''' And what a sweet mod it was :)

'''Wormbo:''' Mind you, '''is'''. ;) I don't see, why I should completely stop working on it just because I have UT 2003 now. Some people still play UT and search for new mods. It would be stupid to trash all the work right before finishing the mod you put most of your coding time into.

'''Eldhrin:''' Mutators are a great place to start, I'm liking coding them lots. Probably too ambitious on Sorcery, but I don't have any other real ideas right now. Maybe if I can find out how to make a new keybinding, I can come up with some interesting ones that add new abilities or something. Or maybe new adrenaline stuff... just random thoughts here :-)

'''SabbathCat:''' Heheh. I'll admit to a handful of the crimes listed. Yeah, mutators are a great place to start, just to play about with source and messing about with changing properties to ease your way into the language. Especially if you've no previous experience of [[Legacy:OOP|OOP]]. From about the age of 10 I was playing with Basic on the Commodore 64, then moving onto my Dad's 286 and GWbasic. UnrealScript is a totally different beast for anyone coming from a sequential language background. For someone starting out in UnrealScript, (as I am re-learning ), It's far more rewarding to have a small script you've actually hand-typed yourself than something bigger, but that you've simply bashed together from other scripts without really understanding or learning anything from what you've done. :)

'''Draconx:''' It's always good to start small - even better to do something small that can be extended.  My current project (RuneUT) is just a fairly basic mutator, but the whole thing can be taken one rune at a time.  This is actually my first *real* mod for UT, before I just did some fairly basic map actors (See: [[Legacy:Input Keys|Input Keys]] &amp; [[Legacy:Changing The Enforcer (UT)|Changing the Enforcer (UT)]]).  After those and a few more, I took on the more ambitious project, which will feature 700 unique runes with bot support so good you'll wish you could beat them, as well as 30 maps designed exclusively for the mod!  (j/k :wink:)</text>
    </revision>
  </page>
  <page>
    <title>Legacy:News</title>
    <id>2269</id>
    <revision>
      <id>5489</id>
      <timestamp>2005-06-25T14:16:32Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>#REDIRECT [[Featured Pages]] for now</comment>
      <text xml:space="preserve">#REDIRECT [[Legacy:Featured Pages|Featured Pages]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NewsFeed</title>
    <id>2288</id>
    <revision>
      <id>5527</id>
      <timestamp>2007-11-19T16:54:56Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:NewsFeed|NewsFeed]]}}

RSS\RDF Porcessing. Part of [[Legacy:LibHTTP|LibHTTP]].

Either RSS or RDF format is accepted.

''Note:'' the HTML special chars are NOT fixed, you have to do this yourself

''Note:'' Don't pound the webserver with requests, cache your results

==Properties==
; bool bSizeBugFix :  if set to false it will not strip the entry size to 512 bytes 

===Config===
; int LastUpdate :  Last time this source had been fetched, you have to do this yourself 

; bool rssEnabled :  true if this feed is enabled 

; string rssHost :  name of this object 

; string rssLocation :  download location 

; int rssUpdateInterval :  minutes between updates, make this a nice value like 45 minutes 

===RSSContent===
; string ChannelDescription :  Channel description as defined in the RSS file 

; string ChannelLink :  Channel link as defined in the RSS file 

; string ChannelTitle :  Channel title as defined in the RSS file 

; array&lt;RDFRentry&gt; Entries :  the current content 

==Structures==

===RDFRentry===

RDF\RSS item record 

; string Desc :  description of the RDF Entry 

; string Link :  link of the RDF Entry 

; string Title :  title of the RDF Entry 

==Functions==
; bool getLine( ):  fill the line buffer 

; string getTag(out array&lt;string&gt; Args ):  retreive a tag with arguments 

; string getToNextTag( ): 
; string getWord( ):  get another word from the buffer 

; int ParseRDFData(array&lt;string&gt; inp ):  Main function to parse the input data 

; bool _channel(array&lt;string&gt; Args ): 
; bool _item(array&lt;string&gt; Args ): 
; bool _rdf( ): 

==Related Documents ==
* [http://my.netscape.com/publish/formats/rss-spec-0.91.html RSS 0.91 specification]
* [http://www.w3.org/RDF/ RDF specification]

[[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5528</id>
      <timestamp>2006-01-09T18:54:55Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2004|UT2004]] :: [[Legacy:Object|Object]] &gt;&gt; [[Legacy:NewsFeed|NewsFeed]]}}

RSS\RDF Porcessing. Part of [[Legacy:LibHTTP|LibHTTP]].

Either RSS or RDF format is accepted.

''Note:'' the HTML special chars are NOT fixed, you have to do this yourself

''Note:'' Don't pound the webserver with requests, cache your results

==Properties==
; bool bSizeBugFix :  if set to false it will not strip the entry size to 512 bytes 

===Config===
; int LastUpdate :  Last time this source had been fetched, you have to do this yourself 

; bool rssEnabled :  true if this feed is enabled 

; string rssHost :  name of this object 

; string rssLocation :  download location 

; int rssUpdateInterval :  minutes between updates, make this a nice value like 45 minutes 

===RSSContent===
; string ChannelDescription :  Channel description as defined in the RSS file 

; string ChannelLink :  Channel link as defined in the RSS file 

; string ChannelTitle :  Channel title as defined in the RSS file 

; array&lt;RDFRentry&gt; Entries :  the current content 

==Structures==

===RDFRentry===

RDF\RSS item record 

; string Desc :  description of the RDF Entry 

; string Link :  link of the RDF Entry 

; string Title :  title of the RDF Entry 

==Functions==
; bool getLine( ):  fill the line buffer 

; string getTag(out array&lt;string&gt; Args ):  retreive a tag with arguments 

; string getToNextTag( ): 
; string getWord( ):  get another word from the buffer 

; int ParseRDFData(array&lt;string&gt; inp ):  Main function to parse the input data 

; bool _channel(array&lt;string&gt; Args ): 
; bool _item(array&lt;string&gt; Args ): 
; bool _rdf( ): 

==Related Documents ==
* [http://my.netscape.com/publish/formats/rss-spec-0.91.html RSS 0.91 specification]
* [http://www.w3.org/RDF/ RDF specification]

[[Category:Legacy Custom Class|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Niaht</title>
    <id>2260</id>
    <revision>
      <id>5469</id>
      <timestamp>2003-08-04T15:47:43Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>screening [[Category Journal]]</comment>
      <text xml:space="preserve">{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |[[Niaht/Developer Journal
|Journals]]
| style=&quot;text-align: center&quot; |[[/Projects
|Projects]]
| style=&quot;text-align: center&quot; |[[/Wiki Notes
|Wiki Design Notes]]
| style=&quot;text-align: center&quot; |[[/Wiki ChangeLog
|Wiki ChangeLog]] 
|}

Welcome! The names niaht. ;) It's nice ta meet'cha.

==Contact==

You can e-mail me at logicf@speakeasy.net. I can sometimes be found on [http://www.openprojects.net OPN] as well.

==niaht what?==

Nigh as in &quot;Night&quot;, at. Nigh-at. niaht. Of course, I desire no restrictions on artistic license. *gryn*

Does it have a definition? Not that I know of, although it seems to be a VERY common word in the [http://www.google.com/search?q=niaht english language]. 

==Why is niaht here?==

If I build it they will come? :)

UnrealED has presented a unique way to interface with the 3d world that is desireable to me. I see the Unreal engine as something that has potential far beyond the amazing depth of use it has already seen, and I beleive that the flexability and overall design gives it an edge over the rest. Even with the breathtaking work that has been done for Unreal 2003 it may not be the absolute best in every way, but more importantly IMHO it will be the work that is the basis for the majority of future work done in the field. Live 3d rendering of a malable environment in real-time has important implications and uses in our world which I think will require the type of traits that Unreal has embodied. Many more technologies and capabilities will be added to the Unreal engine over the next years, and the possibilities already seem endless.

I have dabbled in the 3d arts for many years and I enjoy most of the work involved. I like working with AutoCAD and 3D Studio and enjoy building textures from real world objects. My background is highly technical in general, and I have spent the majority of my 26 years working with computers and software of one type or another. I currently work as an Engineer in a two man team that runs the computer systems of Marmot Mountain, my current employer and high performance outdoor equipment manufacturer. It's a pretty big job for two guys, but we work hard, and that is probably the main reason why I am here. As I have said I really enjoy working with the type of material the Unreal Engine will expose me to, and that I see a great future for UT, so with these things in mind I embark upon an expedition to learn and have fun, and hopefully make it a skill I can leverage in the future to keep me gainfully employed while contributing to our world in a benificial way.

All aside, I'm here to have some fun, and get some work done that '''I''' will enjoy.

==News==

: 06/02/02 - I've made a few mental revisions of my organization here and I think I've finalized it. All normal pages will go under this one unless they are a link page in a location like [[:Category:Legacy Journal]]. That makes it simple as long as I don't forget about ones I've made!!! &lt;br /&gt;&lt;br /&gt;I added a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki ChangeLog|Wiki ChangeLog]] to keep a record of changes I've made. I do this to keep track of what I have and have not yet done. If I don't do it I'll forget about things half way through doing them. I'll likely add a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki ToDo|Wiki ToDo]] list as well at some point when [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki_Notes|Wiki Notes]] becomes unmanageable.

: 06/01/02 - Added a link bar on the top with some ideas on how I can organize documentation of my work here.

{{innerbox| &quot;Reality is nothing more than a collective hunch&quot; - ''I forget''

}}

==Guestbook - Stop on by, have a beer, and relax with a dose of frag.==

'''Mychaeel:'''  Welcome to the Wiki.  :-)

'''Tarquin:'''  Impressive wumping on the sandbox. :) welcome aboard.

'''Niaht:''' Thanks to the both of you! I am glad to have found your Wiki and look forward to getting to know everyone.

'''BlAcK_PlAgUe22''' Hee, wump is a funny word. :D Welcome. :)

'''Bean:''' heya there niaht, and welcome!!!!!!!!

'''Tarquin:'''  subpages only go to one level. I suggest [[Legacy:Developer Journals/Niaht (UnrealEd)|Developer Journals/Niaht (UnrealEd)]] or [[Legacy:Developer Journals/Niaht UnrealEd|Developer Journals/Niaht UnrealEd]] as alternatives.

'''Niaht''' works for me. Thanks! :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5470</id>
      <timestamp>2002-06-03T01:53:58Z</timestamp>
      <contributor>
        <ip>Niaht</ip>
      </contributor>
      <minor/>
      <comment>More additions, fixes</comment>
      <text xml:space="preserve">{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |[[Niaht/Developer Journal
|Journals]]
| style=&quot;text-align: center&quot; |[[/Projects
|Projects]]
| style=&quot;text-align: center&quot; |[[/Wiki Notes
|Wiki Design Notes]]
| style=&quot;text-align: center&quot; |[[/Wiki ChangeLog
|Wiki ChangeLog]] 
|}

Welcome! The names niaht. ;) It's nice ta meet'cha.

==Contact==

 You can e-mail me at logicf@speakeasy.net. I can sometimes be found on [http://www.openprojects.net OPN] as well.

'''Mychaeel:'''  This email address bounces.   (It's been fixed &amp;ndash; ''Niaht'')

'''BlAcK_PlAgUe22''' That's because he doesn't want any spam. Just take off the 1st and 3rd word, then convert the at and dot to (@, .). ;)

'''Mychaeel:'''  No kidding.  :)  I just don't like such email addresses in disguise; even though I'm not wanting any spam myself.  It's especially pointless that he made it clickable...

'''Niaht:''' Sorry about that. Old habits are hard to break, and the amount of spam I already receive is surpising at times. When I click on scrambled addresses I am myself accustomed to performing a quick edit and my mail software lends well to this. Slashdot and friends can do strange things to people. I've undisguised it, and changed it to a new address where the spam can be handled a little better ;)

==niaht what?==

Nigh as in &quot;Night&quot;, at. Nigh-at. niaht. Of course, I desire no restrictions on artistic license. *gryn*

Does it have a definition? Not that I know of, although it seems to be a VERY common word in the [http://www.google.com/search?q=niaht english language]. 

==Why is niaht here?==

If I build it they will come? :)

UnrealED has presented a unique way to interface with the 3d world that is desireable to me. I see the Unreal engine as something that has potential far beyond the amazing depth of use it has already seen, and I beleive that the flexability and overall design gives it an edge over the rest. Even with the breathtaking work that has been done for Unreal 2003 it may not be the absolute best in every way, but more importantly IMHO it will be the work that is the basis for the majority of future work done in the field. Live 3d rendering of a malable environment in real-time has important implications and uses in our world which I think will require the type of traits that Unreal has embodied. Many more technologies and capabilities will be added to the Unreal engine over the next years, and the possibilities already seem endless.

I have dabbled in the 3d arts for many years and I enjoy most of the work involved. I like working with AutoCAD and 3D Studio and enjoy building textures from real world objects. My background is highly technical in general, and I have spent the majority of my 26 years working with computers and software of one type or another. I currently work as an Engineer in a two man team that runs the computer systems of Marmot Mountain, my current employer and high performance outdoor equipment manufacturer. It's a pretty big job for two guys, but we work hard, and that is probably the main reason why I am here. As I have said I really enjoy working with the type of material the Unreal Engine will expose me to, and that I see a great future for UT, so with these things in mind I embark upon an expedition to learn and have fun, and hopefully make it a skill I can leverage in the future to keep me gainfully employed while contributing to our world in a benificial way.

All aside, I'm here to have some fun, and get some work done that '''I''' will enjoy.

==News==

: 06/02/02 - I've made a few mental revisions of my organization here and I think I've finalized it. All normal pages will go under this one unless they are a link page in a location like [[:Category:Legacy Journal]]. That makes it simple as long as I don't forget about ones I've made!!! &lt;br /&gt;&lt;br /&gt;I added a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki ChangeLog|Wiki ChangeLog]] to keep a record of changes I've made. I do this to keep track of what I have and have not yet done. If I don't do it I'll forget about things half way through doing them. I'll likely add a [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki ToDo|Wiki ToDo]] list as well at some point when [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki_Notes|Wiki Notes]] becomes unmanageable.

: 06/01/02 - Added a link bar on the top with some ideas on how I can organize documentation of my work here.

{{innerbox| &quot;Reality is nothing more than a collective hunch&quot; - ''I forget''

}}

==Guestbook - Stop on by, have a beer, and relax with a dose of frag.==

'''Mychaeel:'''  Welcome to the Wiki.  :-)

'''Tarquin:'''  Impressive wumping on the sandbox. :) welcome aboard.

'''Niaht:''' Thanks to the both of you! I am glad to have found your Wiki and look forward to getting to know everyone.

'''BlAcK_PlAgUe22''' Hee, wump is a funny word. :D Welcome. :)

'''Bean:''' heya there niaht, and welcome!!!!!!!!

'''Tarquin:'''  subpages only go to one level. I suggest [[Legacy:Developer Journals/Niaht (UnrealEd)|Developer Journals/Niaht (UnrealEd)]] or [[Legacy:Developer Journals/Niaht UnrealEd|Developer Journals/Niaht UnrealEd]] as alternatives.

'''Niaht''' works for me. Thanks! :)
[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Niaht/Developer Journal</title>
    <id>2263</id>
    <revision>
      <id>5475</id>
      <timestamp>2003-08-05T09:52:15Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>[[Category Journal]]</comment>
      <text xml:space="preserve">Welcome to niaht's Developer Journal.

Here I will detail out my travels and journeys through the world of UnrealEd and all things related to Unreal Level Design.

==Niaht's UnrealEd Journal==

====[Fri May 31 2002 19:25:46] Beginning Again.====

It has been about a year since I last worked with UnrealEd. It's high time I started up again.

Today I started working through the tutorials on [http://www.planetunreal.com/unrealed UnrealEd]. I remember going through quite a few of these and so I skimmed through most of the super basic interface stuff.

Colored lights are pretty simple. The tutorial on [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=75 Colored Lights from UnrealEd] is straight forward and to the point. It has good information to help you set the color values the way you desire.

Using Intersections to condense complex objects into single brushes that can be saved and reused is a very handy feature. I feel that there are implications in using it that I am unaware of. There is definately something odd about the results of the Intersection that while not damaging (so far) to the functionality of the object, is confusing, and at least once that I experienced, frustrating.

I created some Kickers, a'la Quake, which worked out quite nicely. I can see how botpathing can be difficult. I will need to revisit the [http://www.planetunreal.com/unrealed/index.asp?action=spec_cat&amp;cat_id=6 Kicker Tutorial on UnrealEd] once I go over a tutorial on Lifts and Bothpathing.

Vertex Editing turned out to be quite difficult to learn. The tutorials I found had instructions that did not work or were difficult to read. I eventually figured out by trial and error how to do some editing in Vertex Editing Mode and Camera Mode. I still need to learn how exactly the Vertex Snap and other Grid features effect Vertex Editing.

''Note: There is much more to these instructions, however these basics will get you started.

* Vertex Editing Mode
: In any one of your [[Legacy:Orthagonal|Orthagonal]] (Top/Front/Side) Windows:
:: Hold Down Ctl-Alt and drag to select a Vertex or set of Vertexes. It is important to note that this will select any Vertexes in view as well as any that are underneith them.
:: Hold down Ctl and drag the mouse to move the selected points. This can be kinda tricky on certain shapes, so make sure you watch what you are doing in the other windows.

* Camera Movement Mode
: In ANY window
:: Click once on the Vertex you wish to edit.
:: Hold down Alt and drag the mouse to move the selected point. This will move only the vertex selected.

I started the tutorial for [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=77 Curved Hallways on UnrealEd] a while ago, but had trouble when I couldn't do the needed Vertex editing. Once I got the Vertex basics down I was able to create the &quot;Circular Room&quot; that the tutorial appears to reference. This tutorial is difficult to follow, but I got the point. ;)

{{innerbox| Tutorials Completed

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=75 Colored Lighting] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=76 Complex Brushes] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=82 Jump Pads (Kickers] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=102 Vertex Editing] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=77 Curved Hallways] - ''UnrealEd''

}}

====[Sat June 1 2002 9:29:38] Raising a Wumpus.====

Today I found the [http://wiki.beyondunreal.com Unreal Wiki]! This place is amazing. I found the Vertex Editing stuff that I had been needing so much.. ohh well. sometimes you gotta figure it out the hard way. The most important point being the 'doing it' part.

I didn't end up doing a single tutorial today and instead spent all my time learning about the Wiki. I am truely amazed, and humbled. I really like the whole concept that drives the Wiki and am both grateful and excited to be able to participate. I'm going to take a little lesson from this and see if I can bring Wiki to my workplace. I think it would fit well with the type of people we tend to draw.

While scooting about the Wiki I found the item [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] which is probably the most useful bits of information a beginner can read.

'''Niaht:''' I must have been on crack. I had two days yesterday and didn't even realize it.

Something I need to focus on in the near future is getting these Journal entries looking pretty.

{{innerbox| Tutorials

 : [[Legacy:Vertex_Editing|Vertex_Editing]] - ''Unreal Wiki'' 

 : [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] - ''Wiki''

}}

====[Sun Jun 2 2002 12:14:22] Continue the Wiki.====

Bahh... grunt.. didn't really do squat here. Started a trigger tut, but had to hit the sack before I finished. Ohh well. But I did hash out a bunch of Wiki stuff so being that I'm new to Wiki this is a good thing.

====[Mon Jun 3 2002 00:00:00] Finally  ====

Well, I'm back to doing some tutorials.

The first tutorial is on [[Legacy:Triggers (UT)|Triggers (UT)]]. I've been through this, but need a refresher badly. Triggers being a big part of making really engaging [[Legacy:Assault|Assault]] maps, which are my personal fav. 

'''oop.. I'm having a hard-disk failure.. gotta shut down and do some upgrades real quick so I can get back to doing stuff.. I hate it when this happens, but at least I caught it this time.. SMART really does work.''' - [[Legacy:Niaht|Niaht]]

==Comments==

'''Niaht:''' If the minor edit feature has the total effect I *think* it have, it might be a good idea if I use it on this page each time I do an update. Updates here will be quite frequent. Any thoughts?

'''Tarquin:'''  most Wiki elders &amp; wiki guardians have [[Legacy:Recent Changes|Recent Changes]] set to show minor edits anyway, so we see all edit to the wiki. No matter how many times you edit a page, it still shows only once in the RC list. Feel free to make as any edits as you need.

'''MythOpus:''' Yo Niaht -&gt; I'm not 2 sure if u actually had a hard drive failure, but thats besides the point :)  GET A NEW HARD DRIVE :D  And if it is nu, then I think it may have someth'n to do with not enough of your power suply going to it.... or it wasn't any good to start out wit... hm... l8r.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5476</id>
      <timestamp>2002-06-04T02:21:10Z</timestamp>
      <contributor>
        <ip>Niaht</ip>
      </contributor>
      <minor/>
      <comment>Updates, fixes, and hard disk failures...</comment>
      <text xml:space="preserve">Welcome to niaht's Developer Journal.

Here I will detail out my travels and journeys through the world of UnrealEd and all things related to Unreal Level Design.

==Niaht's UnrealEd Journal==

====[Fri May 31 2002 19:25:46] Beginning Again.====

It has been about a year since I last worked with UnrealEd. It's high time I started up again.

Today I started working through the tutorials on [http://www.planetunreal.com/unrealed UnrealEd]. I remember going through quite a few of these and so I skimmed through most of the super basic interface stuff.

Colored lights are pretty simple. The tutorial on [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=75 Colored Lights from UnrealEd] is straight forward and to the point. It has good information to help you set the color values the way you desire.

Using Intersections to condense complex objects into single brushes that can be saved and reused is a very handy feature. I feel that there are implications in using it that I am unaware of. There is definately something odd about the results of the Intersection that while not damaging (so far) to the functionality of the object, is confusing, and at least once that I experienced, frustrating.

I created some Kickers, a'la Quake, which worked out quite nicely. I can see how botpathing can be difficult. I will need to revisit the [http://www.planetunreal.com/unrealed/index.asp?action=spec_cat&amp;cat_id=6 Kicker Tutorial on UnrealEd] once I go over a tutorial on Lifts and Bothpathing.

Vertex Editing turned out to be quite difficult to learn. The tutorials I found had instructions that did not work or were difficult to read. I eventually figured out by trial and error how to do some editing in Vertex Editing Mode and Camera Mode. I still need to learn how exactly the Vertex Snap and other Grid features effect Vertex Editing.

''Note: There is much more to these instructions, however these basics will get you started.

* Vertex Editing Mode
: In any one of your [[Legacy:Orthagonal|Orthagonal]] (Top/Front/Side) Windows:
:: Hold Down Ctl-Alt and drag to select a Vertex or set of Vertexes. It is important to note that this will select any Vertexes in view as well as any that are underneith them.
:: Hold down Ctl and drag the mouse to move the selected points. This can be kinda tricky on certain shapes, so make sure you watch what you are doing in the other windows.

* Camera Movement Mode
: In ANY window
:: Click once on the Vertex you wish to edit.
:: Hold down Alt and drag the mouse to move the selected point. This will move only the vertex selected.

I started the tutorial for [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=77 Curved Hallways on UnrealEd] a while ago, but had trouble when I couldn't do the needed Vertex editing. Once I got the Vertex basics down I was able to create the &quot;Circular Room&quot; that the tutorial appears to reference. This tutorial is difficult to follow, but I got the point. ;)

{{innerbox| Tutorials Completed

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=75 Colored Lighting] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=76 Complex Brushes] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=82 Jump Pads (Kickers] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=102 Vertex Editing] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=77 Curved Hallways] - ''UnrealEd''

}}

====[Sat June 1 2002 9:29:38] Raising a Wumpus.====

Today I found the [http://wiki.beyondunreal.com Unreal Wiki]! This place is amazing. I found the Vertex Editing stuff that I had been needing so much.. ohh well. sometimes you gotta figure it out the hard way. The most important point being the 'doing it' part.

I didn't end up doing a single tutorial today and instead spent all my time learning about the Wiki. I am truely amazed, and humbled. I really like the whole concept that drives the Wiki and am both grateful and excited to be able to participate. I'm going to take a little lesson from this and see if I can bring Wiki to my workplace. I think it would fit well with the type of people we tend to draw.

While scooting about the Wiki I found the item [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] which is probably the most useful bits of information a beginner can read.

'''Niaht:''' I must have been on crack. I had two days yesterday and didn't even realize it.

Something I need to focus on in the near future is getting these Journal entries looking pretty.

{{innerbox| Tutorials

 : [[Legacy:Vertex_Editing|Vertex_Editing]] - ''Unreal Wiki'' 

 : [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] - ''Wiki''

}}

====[Sun Jun 2 2002 12:14:22] Continue the Wiki.====

Bahh... grunt.. didn't really do squat here. Started a trigger tut, but had to hit the sack before I finished. Ohh well. But I did hash out a bunch of Wiki stuff so being that I'm new to Wiki this is a good thing.

====[Mon Jun 3 2002 00:00:00] Finally  ====

Well, I'm back to doing some tutorials.

The first tutorial is on [[Legacy:Triggers (UT)|Triggers (UT)]]. I've been through this, but need a refresher badly. Triggers being a big part of making really engaging [[Legacy:Assault|Assault]] maps, which are my personal fav. 

'''oop.. I'm having a hard-disk failure.. gotta shut down and do some upgrades real quick so I can get back to doing stuff.. I hate it when this happens, but at least I caught it this time.. SMART really does work.''' - [[Legacy:Niaht|Niaht]]

==Comments==

'''Niaht:''' If the minor edit feature has the total effect I *think* it have, it might be a good idea if I use it on this page each time I do an update. Updates here will be quite frequent. Any thoughts?</text>
    </revision>
    <revision>
      <id>5477</id>
      <timestamp>2003-02-09T18:01:55Z</timestamp>
      <contributor>
        <ip>MythOpus</ip>
      </contributor>
      <minor/>
      <comment>*Hard Drive Failure</comment>
      <text xml:space="preserve">Welcome to niaht's Developer Journal.

Here I will detail out my travels and journeys through the world of UnrealEd and all things related to Unreal Level Design.

==Niaht's UnrealEd Journal==

====[Fri May 31 2002 19:25:46] Beginning Again.====

It has been about a year since I last worked with UnrealEd. It's high time I started up again.

Today I started working through the tutorials on [http://www.planetunreal.com/unrealed UnrealEd]. I remember going through quite a few of these and so I skimmed through most of the super basic interface stuff.

Colored lights are pretty simple. The tutorial on [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=75 Colored Lights from UnrealEd] is straight forward and to the point. It has good information to help you set the color values the way you desire.

Using Intersections to condense complex objects into single brushes that can be saved and reused is a very handy feature. I feel that there are implications in using it that I am unaware of. There is definately something odd about the results of the Intersection that while not damaging (so far) to the functionality of the object, is confusing, and at least once that I experienced, frustrating.

I created some Kickers, a'la Quake, which worked out quite nicely. I can see how botpathing can be difficult. I will need to revisit the [http://www.planetunreal.com/unrealed/index.asp?action=spec_cat&amp;cat_id=6 Kicker Tutorial on UnrealEd] once I go over a tutorial on Lifts and Bothpathing.

Vertex Editing turned out to be quite difficult to learn. The tutorials I found had instructions that did not work or were difficult to read. I eventually figured out by trial and error how to do some editing in Vertex Editing Mode and Camera Mode. I still need to learn how exactly the Vertex Snap and other Grid features effect Vertex Editing.

''Note: There is much more to these instructions, however these basics will get you started.

* Vertex Editing Mode
: In any one of your [[Legacy:Orthagonal|Orthagonal]] (Top/Front/Side) Windows:
:: Hold Down Ctl-Alt and drag to select a Vertex or set of Vertexes. It is important to note that this will select any Vertexes in view as well as any that are underneith them.
:: Hold down Ctl and drag the mouse to move the selected points. This can be kinda tricky on certain shapes, so make sure you watch what you are doing in the other windows.

* Camera Movement Mode
: In ANY window
:: Click once on the Vertex you wish to edit.
:: Hold down Alt and drag the mouse to move the selected point. This will move only the vertex selected.

I started the tutorial for [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=77 Curved Hallways on UnrealEd] a while ago, but had trouble when I couldn't do the needed Vertex editing. Once I got the Vertex basics down I was able to create the &quot;Circular Room&quot; that the tutorial appears to reference. This tutorial is difficult to follow, but I got the point. ;)

{{innerbox| Tutorials Completed

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=75 Colored Lighting] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=76 Complex Brushes] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=82 Jump Pads (Kickers] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=102 Vertex Editing] - ''UnrealEd''

 : [http://www.planetunreal.com/unrealed/index.asp?action=spec_art&amp;cat_id=6&amp;art_id=77 Curved Hallways] - ''UnrealEd''

}}

====[Sat June 1 2002 9:29:38] Raising a Wumpus.====

Today I found the [http://wiki.beyondunreal.com Unreal Wiki]! This place is amazing. I found the Vertex Editing stuff that I had been needing so much.. ohh well. sometimes you gotta figure it out the hard way. The most important point being the 'doing it' part.

I didn't end up doing a single tutorial today and instead spent all my time learning about the Wiki. I am truely amazed, and humbled. I really like the whole concept that drives the Wiki and am both grateful and excited to be able to participate. I'm going to take a little lesson from this and see if I can bring Wiki to my workplace. I think it would fit well with the type of people we tend to draw.

While scooting about the Wiki I found the item [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] which is probably the most useful bits of information a beginner can read.

'''Niaht:''' I must have been on crack. I had two days yesterday and didn't even realize it.

Something I need to focus on in the near future is getting these Journal entries looking pretty.

{{innerbox| Tutorials

 : [[Legacy:Vertex_Editing|Vertex_Editing]] - ''Unreal Wiki'' 

 : [[Legacy:General_Scale_And_Dimensions|General_Scale_And_Dimensions]] - ''Wiki''

}}

====[Sun Jun 2 2002 12:14:22] Continue the Wiki.====

Bahh... grunt.. didn't really do squat here. Started a trigger tut, but had to hit the sack before I finished. Ohh well. But I did hash out a bunch of Wiki stuff so being that I'm new to Wiki this is a good thing.

====[Mon Jun 3 2002 00:00:00] Finally  ====

Well, I'm back to doing some tutorials.

The first tutorial is on [[Legacy:Triggers (UT)|Triggers (UT)]]. I've been through this, but need a refresher badly. Triggers being a big part of making really engaging [[Legacy:Assault|Assault]] maps, which are my personal fav. 

'''oop.. I'm having a hard-disk failure.. gotta shut down and do some upgrades real quick so I can get back to doing stuff.. I hate it when this happens, but at least I caught it this time.. SMART really does work.''' - [[Legacy:Niaht|Niaht]]

==Comments==

'''Niaht:''' If the minor edit feature has the total effect I *think* it have, it might be a good idea if I use it on this page each time I do an update. Updates here will be quite frequent. Any thoughts?

'''Tarquin:'''  most Wiki elders &amp; wiki guardians have [[Legacy:Recent Changes|Recent Changes]] set to show minor edits anyway, so we see all edit to the wiki. No matter how many times you edit a page, it still shows only once in the RC list. Feel free to make as any edits as you need.

'''MythOpus:''' Yo Niaht -&gt; I'm not 2 sure if u actually had a hard drive failure, but thats besides the point :)  GET A NEW HARD DRIVE :D  And if it is nu, then I think it may have someth'n to do with not enough of your power suply going to it.... or it wasn't any good to start out wit... hm... l8r.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Niaht/Wiki ChangeLog</title>
    <id>2262</id>
    <revision>
      <id>5474</id>
      <timestamp>2002-06-03T01:25:26Z</timestamp>
      <contributor>
        <ip>Niaht</ip>
      </contributor>
      <comment>First entry</comment>
      <text xml:space="preserve">{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |[[Legacy:Niaht|Niaht]]
| style=&quot;text-align: center&quot; |[[Niaht/Developer Journal
|Journals]]
| style=&quot;text-align: center&quot; |[[Niaht/Projects
|Projects]]
| style=&quot;text-align: center&quot; |[[Legacy:Niaht/Wiki Notes|Niaht/Wiki Notes]]
| style=&quot;text-align: center&quot; |[[Niaht/Wiki Projects
|Wiki Projects]] 
|}

==ChangeLog ==

This is my Wiki ChangeLog. I will list changes I have made to the Wiki here so that I may not forget things that effect other things I've done or want to do. So.. how does one classify '''this''' behavior? ehehe... &amp;ndash; [[Legacy:Niaht|Niaht]]

====Sun Jun 2 2002 18:10:45 ====
* Added [[Legacy:Topics|Topics]] page

==Comments ==</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Niaht/Wiki Notes</title>
    <id>2261</id>
    <revision>
      <id>5471</id>
      <timestamp>2002-06-23T04:48:47Z</timestamp>
      <contributor>
        <ip>Niaht</ip>
      </contributor>
      <minor/>
      <comment>stuff</comment>
      <text xml:space="preserve">{| class=&quot;wikitable&quot;

|-
| style=&quot;text-align: center&quot; |[[Legacy:Niaht|Niaht]]
| style=&quot;text-align: center&quot; |[[Niaht/Developer Journal
|Journals]]
| style=&quot;text-align: center&quot; |[[Niaht/Projects
|Projects]]
| style=&quot;text-align: center&quot; |[[Niaht/Wiki ChangeLog
|Wiki ChangeLog]]
| style=&quot;text-align: center&quot; |[[Niaht/Wiki Projects
|Wiki Projects]] 
|}

On this page I will list out ideas for pages I am thinking about. Please add anything you can think of. The things on this page will probably constitute ideas I'm forming that could represent fairly large changes so this is also partly a way to avoid any surprises.

As always, in the Wiki way, feel free to go ahead and do anything you see here and just wanna do. :) You can add it to the [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Wiki ChangeLog|ChangeLog]] as well if you like with your name and comments and mark the item on this page as done with a date (someone will delete it when it gets really old).

If a project ever solidifies into an idea much larger than just my ramblings, I'll move all the related material out to a better, more public area.

: Looks interesting. Feel free to make changes :)  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

==News ==

None Yet.

==Warning - Brainstorming Territory. ==

----

'''A Concept for Lessons'''

I would like to put forth an interpretation of a concept that I have on the difference between a Lesson, and a Raw Data or Guide page. I think this is an important distinction to make where the two can present data in different ways. A Lesson would present a congruent path to a result and verbalized examples, where a Guide would expose the variables, descriptions, tips and other info as factual, indexed, data. A Lesson should then link to the Guide wherever appropriate. For instance, a hot tip would be better integrated into the actual design of the Tutorial if possible, and listed in the Guide as well for reference. The concept needs further expansion of course. What do you think? - ''Niaht''

''' Topic Structure '''

I've always been fond of the whole Idea/Synopsis/Description/Example/Bugs/Reference thing and I think parts of its methodology can be applied here on the Wiki, though I realize that some of the structure is/may be unnecessary. Thoughts? &amp;ndash; ''Niaht''

'''High level topic classification'''

Should tutorials, or lessons, go under a sub structure like Lessons/Name? For one this is slightly more difficult to link with in a 'pretty' manner and it creates more text to be stored overall. Another idea is to have somewhat of a naming convention for such things, such as lesson names being prefixed, suffixed or being non object names. &quot;Lesson: Building rooms&quot;, &quot;Working with Brushes&quot;, &quot;Basic Lighting&quot;.

'''''Section Framing'''''

There is a series of pages named ''Topic''_Topics, such as [[Legacy:Mover Topics|Mover Topics]].I think that along with a couple other similar namings can come in handy big time. This is a reminder to self to think about it more. I have created a [[Legacy:Topics|Topics]] page with a list of a few topics pages that do, or could exist.

'''Wiki Fun'''''

This is a tentitive idea to create some fun. I've got all kinda ideas, but I can't tell you or I'd have ta' frag ya. Think about it :D

'''QuickStart Guide'''

I just thought to seperate out the idea of short lessons and extended lessons. I think a [[Legacy:QuickStart|QuickStart]] page with only the short lessons would be good to cover that, along with a reference to the NotSoQuickStart??? page :)

'''[[Legacy:Links|Links]] Pages'''

Seems like a very Wiki thing to do! Links were never easy to maintain.. But this might be the most sucessful way ever, but then maybe not, who knows.

----

Here are any specific pages/areas I've got ideas for.

===[[Legacy:Mapping Lessons|Mapping Lessons]] ===

* Add Guides section for important &quot;textbook&quot; material that doesn't constitute as an actual Lesson.
* Streamline the &quot;Level&quot; sections so that they provide a task oriented logical path and consistant result.
* Some of the subsections may need to be reorganized in order to accomplish this, and lots of Lesson material written.

This is a rough Task Set idea. There is a good amount of thought that needs to be put into the way the naming is done, and also regarding the idea that Basic and Intermediate and such are perspective and a well written Lesson can change those boundaries.

=Mapping Lessons =

== [[Legacy:Mapping Lessons/Creating A Basic Room|Mapping Lessons/Creating a Basic Room]] =

=== Subtracting Space =

In the Unreal Universe we think of space in reverse. Imagine that in the 3D Viewport the black &quot;space&quot; that you see with the blue grid-lines is in fact not space, but solid matter. Your new world is a block of clay, now we shall cut it.

==== Setup =

Start a fresh map by clicking on the '''File\New''' menu. For the following lessons we will reuse this new map.

You will want to start off with your 3d view in [[Legacy:Textured Mode|Textured Mode]]. Find the '''Textured (IMAGE)''' icon immediately above the 3d viewport. 

I also suggest using the [[Legacy:Realtime Preview|Realtime Preview]] (IMAGE) option on all viewports in order to keep them syncronized as you modify your map. It is located on the far left side of each viewports top bar.

==== Step 1 =

Find the [[Legacy:Cube Builder|Cube Builder]] icon on your lefthand toolbar and [[Legacy:Right Click|Right Click]] on it. It appears as a blue-green, three-dimentional cube.(IMAGE) If you float your mouse over it for a moment a tooltip will appear with the word &quot;Cube&quot;.

A dialog box should appear with the title [[Legacy:CubeBuilder|CubeBuilder]].

{IMAGE}

==== Step 2 =

Change the dimentions of the cube to 128\256\256 (That's Height:128, Width: 256, Breadth: 256) and click on the '''Build''' button. ''It is important to note that any time you set a value in UnrealEd, you should select a value that is evenly divisible by two.'' See [[Legacy:Crashing UnrealEd|Crashing UnrealEd]]

You should now see a red rectangular wireframe in each of your viewports. If you have difficulting finding the [[Legacy:Builder Brush|Builder Brush]], try zoming in and out, and moving side to side in one of viewports.

==== Step 3 =

Now locate and click on the [[Legacy:Subtract Brush|Subtract Brush]] button. The icon is a pair of colored squares one overlapping the other. Floating the mouse over the icon will reveal the tooltip &quot;Subtract&quot;. 

Your brush will now appear solid in the 3d window. In the '''Top Viewport''', select the builder brush and move it in any direction by holding down the shift key and dragging the mouse. You will notice that the builder brush is not attached to your room. I suggest [[Legacy:Turning On Real-Time Preview|turning on Real-Time Preview]] so that your views will be synched as you modify your map, otherwise your changes in one window, won't affect others.

Unless you skipped ahead (''tisk-tisk'' :) ), you will have a large cube in your 3d viewport something like this:

{IMAGE}

Well, that's pretty drab, so lets add some texture!

=== Adding Textures =

==== Setup =

Lets start off by moving the 3d viewport camera so that you are '''inside''' the room. It should look

==== Step 4 =

=== Adding Textures =

'''Intermediate'''
# Learn The Interface
## Creating Keybindings
## Creating Buttons
## Custom Viewports
# Working with Brushes
## Cylinders and Cones
## Intersections
## Stairs
## Volumetric Trickery
## 

'''Niaht:''' I'm not even to this level yet, so categorizing is a bit difficult.

===Guides===

# The UnrealEd Interface
## Using the Mouse
## Using the Keyboard
## Standard Buttons
## Viewport Controls

# About Mapping
## Mapping Preparation
## Mapping Concepts (Map Space, Actors, etc)

# Working with Brushes
## Building a Room
# Applying Textures
# Lighting Rooms
## Level Ambient Light
## Adding Lights
# Adding Actors
## PlayerStart Actor

===Lesson Topic Notes ===

[[Legacy:Building A Skybox|Building A Skybox]]

Notes:

[[Legacy:Making A 2D Shape|Making a 2D Shape]]

Notes: Has some stuff that really belongs somwhere else, and needs to be rewritten as a tutorial/lesson.

[[Legacy:Making Arches|Making Arches]]

Notes: 

[[Legacy:Making Curved Corridors|Making Curved Corridors]]

Notes:
* Detail Machismo's tutorial permission notice.
* Add picture of 2d screen solution
* Add some further explanation

[[Legacy:Making Complex Doors|Making Complex Doors]]

Notes:

[[Legacy:Making Trim|Making Trim]]

Notes:

[[Legacy:Making Trim With The Extruder|Making Trim with the Extruder]]

Notes:

[[Legacy:Making Flames|Making Flames]]

Notes:

[[Legacy:Create A Mover|Create A Mover]]

Notes:

[[Legacy:Activating A Mover|Activating A Mover]]

Notes:

[[Legacy:Keyframe|Keyframe]]

Notes:
* Maybe merge this over to Keyframing and make this a definition.

[[Legacy:Building An Outside Area|Building an Outside Area]]

[[Legacy:Embedding Code|Embedding Code]]

===[[Legacy:Topics|Topics]] pages ===

[[Legacy:Mover Topics|Mover Topics]]

Notes:

[[Legacy:Beginner Topics|Beginner Topics]]

Notes:

[[Legacy:Texture Topics|Texture Topics]]

Notes:

[[Legacy:Program Interface|Program Interface]]

Notes: Consider this and the others on the side-bar. The names remain appropriate in my mind, but I think they can work together better. Redirects?</text>
    </revision>
    <revision>
      <id>5472</id>
      <timestamp>2002-06-02T07:49:46Z</timestamp>
      <contributor>
        <ip>Niaht</ip>
      </contributor>
      <comment>my wiki design ideas, notes and stuff</comment>
      <text xml:space="preserve">On this page I will list out ideas for pages I am thinking about. Please add anything you can think of. The things on this page will probably constitute ideas I'm forming that could represent fairly large changes so this is also partly a way to avoid any surprises.

==Warning - Brainstorming Territory. ==

----

'''A Concept for Lessons'''

I would like to put forth an interpretation of a concept that I have on the difference between a Lesson, and a Raw Data or Guide page. I think this is an important distinction to make where the two can present data in different ways. A Lesson would present a congruent path to a result and verbalized examples, where a Guide would expose the variables, descriptions, tips and other info as factual, indexed, data. A Lesson should then link to the Guide wherever appropriate. For instance, a hot tip would be better integrated into the actual design of the Tutorial if possible, and listed in the Guide as well for reference. The concept needs further expansion of course. What do you think? - ''Niaht''

''' Topic Structure '''

I've always been fond of the whole Idea/Synopsis/Description/Example/Bugs/Reference thing and I think parts of its methodology can be applied here on the Wiki, though I realize that some of the structure is/may be unnecessary. Thoughts? &amp;ndash; ''Niaht''

----

Here are any specific pages/areas I've got ideas for.

===[[Legacy:Mapping Lessons|Mapping Lessons]] ===

* Add Guides section for important &quot;textbook&quot; material that doesn't constitute as an actual Lesson.
* Streamline the &quot;Level&quot; sections so that they provide a task oriented logical path and consistant result.
* Some of the subsections may need to be reorganized in order to accomplish this, and lots of Lesson material written.

This is a rough Task Set idea. There is a good amount of thought that needs to be put into the way the naming is done, and also regarding the idea that Basic and Intermediate and such are perspective and a well written Lesson can change those boundaries.

'''Basic'''
# About Mapping
## Mapping Preparation
## Mapping Concepts (Map Space, Actors, etc)
# Learn the Interface
## Using the Mouse
## Using teh Keyboard
## Standard Buttons
## Viewport Controls
# Working with Brushes
## Building a Room
# Applying Textures
# Lighting Rooms
## Level Ambient Light
## Adding Lights
# Adding Actors
## PlayerStart Actor

'''Intermediate'''
# Learn The Interface
## Creating Keybindings
## Creating Buttons
## Custom Viewports
# Working with Brushes
## Cylinders and Cones
## Intersections
## Stairs
## Volumetric Trickery
## 

'''Niaht:''' I'm not even to this level yet, so categorizing is a bit difficult.</text>
    </revision>
    <revision>
      <id>5473</id>
      <timestamp>2002-06-02T12:18:46Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">On this page I will list out ideas for pages I am thinking about. Please add anything you can think of. The things on this page will probably constitute ideas I'm forming that could represent fairly large changes so this is also partly a way to avoid any surprises.

: Looks interesting. Feel free to make changes :)  &amp;rarr;[[Legacy:Tarquin|Tarquin]] 

==Warning - Brainstorming Territory. ==

----

'''A Concept for Lessons'''

I would like to put forth an interpretation of a concept that I have on the difference between a Lesson, and a Raw Data or Guide page. I think this is an important distinction to make where the two can present data in different ways. A Lesson would present a congruent path to a result and verbalized examples, where a Guide would expose the variables, descriptions, tips and other info as factual, indexed, data. A Lesson should then link to the Guide wherever appropriate. For instance, a hot tip would be better integrated into the actual design of the Tutorial if possible, and listed in the Guide as well for reference. The concept needs further expansion of course. What do you think? - ''Niaht''

''' Topic Structure '''

I've always been fond of the whole Idea/Synopsis/Description/Example/Bugs/Reference thing and I think parts of its methodology can be applied here on the Wiki, though I realize that some of the structure is/may be unnecessary. Thoughts? &amp;ndash; ''Niaht''

----

Here are any specific pages/areas I've got ideas for.

===[[Legacy:Mapping Lessons|Mapping Lessons]] ===

* Add Guides section for important &quot;textbook&quot; material that doesn't constitute as an actual Lesson.
* Streamline the &quot;Level&quot; sections so that they provide a task oriented logical path and consistant result.
* Some of the subsections may need to be reorganized in order to accomplish this, and lots of Lesson material written.

This is a rough Task Set idea. There is a good amount of thought that needs to be put into the way the naming is done, and also regarding the idea that Basic and Intermediate and such are perspective and a well written Lesson can change those boundaries.

'''Basic'''
# About Mapping
## Mapping Preparation
## Mapping Concepts (Map Space, Actors, etc) (some rough notes on this on [[Legacy:Welcome To UnrealEd|Welcome to UnrealEd]])
# Learn the Interface
## Using the Mouse
## Using teh Keyboard
## Standard Buttons
## Viewport Controls
# Working with Brushes
## Building a Room
# Applying Textures
# Lighting Rooms
## Level Ambient Light
## Adding Lights
# Adding Actors
## PlayerStart Actor

'''Intermediate'''
# Learn The Interface
## Creating Keybindings
## Creating Buttons
## Custom Viewports
# Working with Brushes
## Cylinders and Cones
## Intersections
## Stairs
## Volumetric Trickery
## 

'''Niaht:''' I'm not even to this level yet, so categorizing is a bit difficult.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nick89</title>
    <id>2300</id>
    <revision>
      <id>5552</id>
      <timestamp>2005-12-21T08:30:21Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Nick89? Oh, that's me! :cheesy:

[[:Category:Legacy Personal Page]]

==Projects==

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Fooling With TransSpider]]

[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Nick89GUI]]

==Contact Me==

===E-mail, MSN, etc.===

*Top Tips: 
**Remove the 'NOSPAM' in the addresses, or you won't get me.
**E-mail and MSN Messenger are good ways to contact me.
**I'm rarely on XFire.
**I may take my time to respond to messages here.
*Contact Adresses 
**E-mail: n.youngNOSPAM@findex.net.au
**MSN Messenger: nick89NOSPAM@gmail.com
**XFire: nickNOSPAM089

===Wiki Messages===

''Spam/Talk to me below. Lead each message with your name:

(&lt;nowiki&gt;~~~ Your message here&lt;/nowiki&gt;). By leaving me a message you agree  that I own your soul.''

----

'''SuperApe:''' Welcome to the wiki, Nick89.  So far you've been very helpful. :)  Note that you don't need the &lt;nowiki&gt;\\&lt;/nowiki&gt; marks as much, just when you want to continue the current line's indentation or formatting.  Oh, and I have a feeling the list of &quot;Pages I've Contributed To&quot; will get longer than you'll care to list.  There's no need, wiki users will know you by how helpful you are. ;)

'''Nick89:''' Thanks for the tips. I just added a few more obscure class pages, Yep it's going to get longer than I care to list, Removed :P
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5553</id>
      <timestamp>2005-12-19T05:08:17Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>Welcome.</comment>
      <text xml:space="preserve">Nick89? Oh, that's me! :cheesy:

==Pages I've contributed to==
*Crashing UnrealEd
*Invasion (Creator)
*UT2004
*UTJumpPad
*More to come I'm sure.

==Contact Me==

===E-mail, MSN, etc.===

*Top Tips: 
**Remove the 'NOSPAM' in the addresses, or you won't get me.
**E-mail and MSN Messenger are good ways to contact me.
**I'm rarely on XFire.
**I may take my time to respond to messages here.
*Contact Adresses 
**E-mail: n.youngNOSPAM@findex.net.au
**MSN Messenger: nick89NOSPAM@gmail.com
**XFire: nickNOSPAM089

===Wiki Messages===

''Spam/Talk to me below. Leave a horizontal line: &lt;br /&gt;(&lt;nowiki&gt;----&lt;/nowiki&gt;) between each message and lead each message with your name:  &lt;br /&gt;(&lt;nowiki&gt;~~~ Your message here&lt;/nowiki&gt;). By leaving me a message you agree  that I own your soul.''

----

'''SuperApe:''' Welcome to the wiki, Nick89.  So far you've been very helpful. :)  Note that you don't need the &lt;nowiki&gt;\\&lt;/nowiki&gt; marks as much, just when you want to continue the current line's indentation or formatting.  Oh, and I have a feeling the list of &quot;Pages I've Contributed To&quot; will get longer than you'll care to list.  There's no need, wiki users will know you by how helpful you are. ;)</text>
    </revision>
    <revision>
      <id>5554</id>
      <timestamp>2005-12-19T11:17:00Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Nick89? Oh, that's me! :cheesy:

[[:Category:Legacy Personal Page]]

==Contact Me==

===E-mail, MSN, etc.===

*Top Tips: 
**Remove the 'NOSPAM' in the addresses, or you won't get me.
**E-mail and MSN Messenger are good ways to contact me.
**I'm rarely on XFire.
**I may take my time to respond to messages here.
*Contact Adresses 
**E-mail: n.youngNOSPAM@findex.net.au
**MSN Messenger: nick89NOSPAM@gmail.com
**XFire: nickNOSPAM089

===Wiki Messages===

''Spam/Talk to me below. Lead each message with your name:

(&lt;nowiki&gt;~~~ Your message here&lt;/nowiki&gt;). By leaving me a message you agree  that I own your soul.''

----

'''SuperApe:''' Welcome to the wiki, Nick89.  So far you've been very helpful. :)  Note that you don't need the &lt;nowiki&gt;\\&lt;/nowiki&gt; marks as much, just when you want to continue the current line's indentation or formatting.  Oh, and I have a feeling the list of &quot;Pages I've Contributed To&quot; will get longer than you'll care to list.  There's no need, wiki users will know you by how helpful you are. ;)

'''Nick89:''' Thanks for the tips. I just added a few more obscure class pages, Yep it's going to get longer than I care to list, Removed :P
[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nick89/Fooling With TransSpider</title>
    <id>2307</id>
    <revision>
      <id>5567</id>
      <timestamp>2005-12-20T02:11:50Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Intro==

Recently porkmanii released Beta 1.0 of his latest mutator attempt, the [http://ut2007world.com/showthread.php?t=1920 TransSpider].

He gave it this description:

{{innerbox| Ever wished your Translocator beacon could grow legs and walk around? Neither have I, but now it can!

}}

Inspired by this little mod, I thought I would try to get into UnrealScript once again in order to fool around with this mod (add features etc).

Also revealing he would not have much time to work on it for a while, I thought I could attempt to flatten out some bugs and attempt some of the feature suggestions. (I still don't know how far I will be able to go with it).

This page is a Mini Journal of the things i attempt (in all my coding n00biness), the problems I encounter and the solutions I find. If i find no solutions at certain stages, I welcome people to help me! This is about me learning to UnrealScript more than anything.

Although I'm very much new to UnrealScript, i have lots of other coding experience under my belt, including plenty of OOP. I've had experience with:
* PHP
* C++
* Java (Only very little though)
* Visual Basic (VB6 and .NET)
* Quick Basic
* HTML, CSS (not that it counts ;) )

==Before we start==

If you intend to read through this, I suggest you [http://ut2007world.com/showthread.php?t=1920 familiarise yourself] with the features of the mutator by porkmanii.

I have made the original exported scripts available from my File Front account:

''Still looking for my filefront password.''

==Feature Attempts/Bug Fixes==

===Slightly More Explosive (Unresolved)===

The first feature I try and it all works well, all but one thing!

I decided for my first feature I would change the self-destruct explosion from a Grenade Explosion to a Leviathan Cannon Implosion.

I found the function, &lt;tt&gt;BlowUp&lt;/tt&gt;, in the SpiderPawn code and some default properties which it utilised and created the following new function:

&lt;uscript&gt;
simulated function BlowUp(Vector HitLocation)
{
    if (Role == ROLE_Authority)
        HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation);

    PlaySound(ExplodeSound, SLOT_Misc);

    if ( Role == ROLE_Authority &amp;&amp; EffectIsRelevant(Location,false) )
        Spawn(class'ONSMASCannonImplosionEffect'); // Previously ONSGrenadeExplosionEffect

    Destroy();
}
&lt;/uscript&gt;

&lt;uscript&gt;
defaultproperties
{
     Damage=6000.000000 //Previously 95
     DamageRadius=2200.000000 // Previously 250
     MomentumTransfer=50000.000000
     MyDamageType=Class'OnslaughtFull.DamTypeMASCannon' //Previously Onslaught.DamTypeONSMine
     //ExplodeSound=SoundGroup'WeaponSounds.RocketLauncher.RocketLauncherFire'
     ExplodeSound=Sound'ONSVehicleSounds-S.MAS.MASBIGFire01'
     ....
     ....
}
&lt;/uscript&gt;

Most of which i was able to find from the Leviathan code itself. The damage and damage radius is actually somewhat interesting. The Leviathan explosion is actually 6 smaller explosions which happen consecutively, each explosion does 1000 damage and each consecutive explosion has a slightly bigger DamageRadius than the last (until the sixth which is 2200uu). Rather than repeating this effect, I just used the largest radius and the sum of all of the damage.

Now for the most part this worked fantastically, however a small bug from the original code became apparent once given a huge amount of Damage. The self destruct or death explosion would do no damage to PowerNodes and PowerCores if they were triggered whilst you were possessing the SpiderPawn.

Now looking at the class ONSPowerCore (Which is the base class for PowerCores and PowerNodes), the following snippet of code can be found in &lt;tt&gt;TakeDamage&lt;/tt&gt;:

&lt;uscript&gt;
if (InstigatorController == None &amp;&amp; damageType != None)
		return;
&lt;/uscript&gt;

Which is saying that if the Pawn has no [[Legacy:Controller|Controller]], it won't take damage.

This suggests that we are Relinquishing the Controller before we cause the damage.

Unfortunately this is where i am lost. I can't find where this must be happening.

Here is where I am at with the code:

&lt;uscript&gt;
function Died(Controller Killer, class&lt;DamageType&gt; damageType, vector HitLocation)
{
    if (bDeleteMe || Level.bLevelChange || Level.Game == None)
        return; // already destroyed, or level is being cleaned up
      
    Health = Min(0, Health);

    if (DrivenVehicle != None)
        DrivenVehicle.DriverDied();

    Level.Game.NotifyKilled(Killer, Controller, self);

    // discard Inventory, but not the flag!
    PlayerReplicationInfo = none;
    Level.Game.DiscardInventory(self);

    DrivenVehicle = None;

    if (IsHumanControlled())
        PlayerController(Controller).ForceDeathUpdate();
    
    BlowUp(HitLocation);
}

simulated function BlowUp(Vector HitLocation)
{
    if (Role == ROLE_Authority)
        HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation);

    PlaySound(ExplodeSound, SLOT_Misc);

    if ( Role == ROLE_Authority &amp;&amp; EffectIsRelevant(Location,false) )
        Spawn(class'ONSMASCannonImplosionEffect'); // Previously ONSGrenadeExplosionEffect

    Destroy();
}
&lt;/uscript&gt;

Died is called when you use the self destruct, or if the Spider actually dies.

Destroy has not been Overridden from [[Legacy:UnrealPawn|UnrealPawn]].

'''Nick89:''' Any thoughts?

===Spider No Jump! (Success)===

The problem was that the spider couldn't use [[Legacy:UTJumpPad|UTJumpPad]]s.

So i dug up the code for the Jump Pad and found the following slice of code:

&lt;uscript&gt;
event Touch(Actor Other)
{
	if ( (UnrealPawn(Other) == None) || (Other.Physics == PHYS_None) )
		return;

	PendingTouch = Other.PendingTouch;
	Other.PendingTouch = self;
}
&lt;/uscript&gt;

Once i had found the code the limiting factor was fairly obvious.
; UnrealPawn(Other) == None : Will test if the [[Legacy:Actor|Actor]] which has touched the Jump Pad is a [[Legacy:UnrealPawn|UnrealPawn]] or [[Legacy:SubClass|SubClass]] thereof.

The spider is a [[Legacy:Pawn|Pawn]], and the tree structure of this area looks as follows:

&lt;tt&gt;
 +- [[Legacy:Actor|Actor]]
     +- [[Legacy:Pawn|Pawn]]
         +- [[Legacy:UnrealPawn|UnrealPawn]]
&lt;/tt&gt;

Which meant that our TransSpider did not meet the condition set by the [[Legacy:UTJumpPad|UTJumpPad]] for a successful jump.

This was fairly easily fixed, a quick change from [[Legacy:Pawn|Pawn]] to [[Legacy:UnrealPawn|UnrealPawn]].

&lt;uscript&gt;
class ts_SpiderPawn extends UnrealPawn;
&lt;/uscript&gt;

===Allowing the Spider to Pickup and Use inventory (Success)===

This feature was just something I decided I would like to do, but would take out in the future.

This fix was relatively easy. After perusing some of the properties which the Spider would now inherit and some of the code I found the following things.

&lt;uscript&gt;
function GiveWeapon(string aClassName )
{
    // never give weapons to Spiders
}

function bool AddInventory( inventory NewItem )
{
    // never allow inventory
    return false;
}

simulated function bool IsPlayerPawn()
{
    // don't allow Spider to trigger objectives (or movers)
    return false;
}
&lt;/uscript&gt;

And in the deafault properties of [[Legacy:UnrealPawn|UnrealPawn]]:

&lt;uscript&gt;
bCanPickupInventory=False
bAcceptAllInventory=False
&lt;/uscript&gt;

Yet another easy fix. I added these two properties as True to the default properties of the TransSpider [[Legacy:UnrealPawn|UnrealPawn]] and commented out the &quot;Rejection Code&quot;, which I discovered was the source of the Lifts([[Legacy:Mover|Mover]]s) not working.

One last quick change to the default properties of the TransSpider [[Legacy:UnrealPawn|UnrealPawn]] and we got our crosshair back too:

&lt;uscript&gt;
bSpecialCrosshair=True

//BECOMES

bSpecialCrosshair=False
&lt;/uscript&gt;

All worked out fine here, although there is a problem with the Spider not dropping the flag. (ie. you can capture again and again and again). I am aware of where this problem is, however as this feature will be later removed, i'm not too concerned.

===Give master the pickups you find===

Yet to begin.

==Discussion==

'''Nick89:''' Any thoughts? Any thoughts with my PowerNode Problem?

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nick89/Nick89GUI</title>
    <id>2308</id>
    <revision>
      <id>5568</id>
      <timestamp>2005-12-21T08:40:04Z</timestamp>
      <contributor>
        <ip>Nick89</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==What is nick89GUI?==

nick89GUI is a series of interface improvements for UT2004.

==Features==
* Enhanced Server Loading Page

==Planned Features==
* Enhanced Music Player
* Enhanced In-Game Chat</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nightvision</title>
    <id>2291</id>
    <revision>
      <id>5533</id>
      <timestamp>2004-04-28T07:44:05Z</timestamp>
      <contributor>
        <ip>Jarronis, The Vampiric Unicorn</ip>
      </contributor>
      <comment>added 3dbuzz Thread.</comment>
      <text xml:space="preserve">Creating NighVision goggles' effect is done in 2 parts:

1 - exec function 

where you turn on unlit texture rendering mode like with &quot;rmode 6&quot;.

2 - overlays

alpha overlay to simulate limited oval goggle view and 

a similar greenish overlay texture to simulate greenish part of a NighVision goggles.

&lt;uscript&gt;
class HudWithNighVision extends HudBTeamDeathMatch;

var bool bNighVision;
var Material mtScopeAlpha;
var Material mtScopeOverlay;

exec function ToggleNightVision()
{
	
	bNighVision=!bNighVision;
	
	if (!bNighVision)
	{
		playerowner.RendMap=5; //normal mode
		playerowner.ClientMessage(&quot;--bNighVision OFF!&quot;);
	}
	else
	{
		playerowner.RendMap=6; //textured mode unlit
		playerowner.ClientMessage(&quot;--bNighVision ON!&quot;);
	}
	
}

simulated function DrawHud (Canvas C)
{
	if( PlayerOwner.pawn == None)
	{
		bNighVision=false;
		playerowner.RendMap=5; 
	}
	
	DrawNightVision(C);
	Super.DrawHud(C);
}

//DRAW OVERLAYS
//like scope and greenish color multiply
simulated function DrawNightVision(Canvas C)
{
	if (bNighVision)
	{
		//set green color only
		C.DrawColor.R = 0; 
		C.DrawColor.G = 127; 
		C.DrawColor.B = 0;
		C.DrawColor.A = 255; 	
		
		//scope alpha
		C.Style = ERenderStyle.STY_Alpha; 
		C.SetPos(0,0); 
		C.DrawTile(mtScopeAlpha, C.SizeX, C.SizeY,0.0,0.0,512,512);
		
		//greenish modulation
		C.Style = ERenderStyle.STY_Modulated;   
		C.SetPos(0,0); 
		C.DrawTile(mtScopeOverlay, C.SizeX, C.SizeY,0.0,0.0,512,512);
		
		//greenish overlay
		C.Style = ERenderStyle.STY_Additive; 
		C.SetPos(0,0); 
		C.DrawTile(mtScopeOverlay, C.SizeX, C.SizeY,0.0,0.0,512,512);
	
	}
}
&lt;/uscript&gt;

This should be simple. 

Note that there may be lighting issues with the terrain, since it wont always loose the lighting (Epic bug).

&amp;ndash;HeatVision&amp;ndash;

I found a way to see actors (pawns) through walls. It's a little limited on-line tho.

If you set the OverlayMaterial of a pawn to a texture with bZTest= false then you can see it trough walls. 

I tried it with Material'XGameShaders.ModuNoise'. This material is not suitable for real heat vision but just an example how this works. 

&lt;uscript&gt;
simulated function DrawHeatVision(Canvas C)
{
	local Actor p;
	
	ForEach DynamicActors(class'Actor', p)
	{//NOTE: On server side you could go trough the ControllerList.
		if (p.IsA('Pawn') &amp;&amp; pawn(p) != playerowner.pawn)
		{
			p.SetOverlayMaterial(Material'XGameShaders.ModuNoise',1, true);
		}
	}
}
&lt;/uscript&gt;

&amp;ndash;DocEDo&amp;ndash;

'''Foxpaw:''' Wouldn't it be better to leave the lights on and simply amplify existing light? That's how real night vision systems work, so I'd think that would be cooler. Maybe that's just me though..

'''DocEDo:''' It is? You can always leave the lights on. I tried, it was cool untill I tried it in dark rooms, where it sucked. I have a camera with NV and it amplifys light but not only the one we see, actually mostly the one we can't. 

'''Foxpaw:''' Yes, it's mostly the infrared light (I think) that is picked up on it, but it does work on amplifying the existing light. If you take it into a completely dark room (IE a room with no windows at night) you won't be able to see anything, unless the night vision unit also has an IR &quot;flashlight&quot; on it, which some units do. You could also get &quot;heat vision&quot; which is similar, but has the cool thing with all the different colors representing different levels of heat. Mmm, that'd be a neat feature for a sniper rifle in UT.

'''DocEDo:''' Added &quot;heat vision&quot;.

'''Pingz:''' Shouldn't 'heat vision' be on some other page?

'''Daid303:''' Well, it's also a vision enhancer. Maybe call this page vision enhancement?

'''Jarronis, The Vampiric Unicorn:''' I'll have interesting thread on 3dbuzz about heat vision: http://sv1.3dbuzz.com/vbforum/showthread.php?s=&amp;threadid=66761&amp;pagenumber=4</text>
    </revision>
    <revision>
      <id>5534</id>
      <timestamp>2003-08-27T23:54:24Z</timestamp>
      <contributor>
        <ip>Daid303</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Creating NighVision goggles' effect is done in 2 parts:

1 - exec function 

where you turn on unlit texture rendering mode like with &quot;rmode 6&quot;.

2 - overlays

alpha overlay to simulate limited oval goggle view and 

a similar greenish overlay texture to simulate greenish part of a NighVision goggles.

&lt;uscript&gt;
class HudWithNighVision extends HudBTeamDeathMatch;

var bool bNighVision;
var Material mtScopeAlpha;
var Material mtScopeOverlay;

exec function ToggleNightVision()
{
	
	bNighVision=!bNighVision;
	
	if (!bNighVision)
	{
		playerowner.RendMap=5; //normal mode
		playerowner.ClientMessage(&quot;--bNighVision OFF!&quot;);
	}
	else
	{
		playerowner.RendMap=6; //textured mode unlit
		playerowner.ClientMessage(&quot;--bNighVision ON!&quot;);
	}
	
}

simulated function DrawHud (Canvas C)
{
	if( PlayerOwner.pawn == None)
	{
		bNighVision=false;
		playerowner.RendMap=5; 
	}
	
	DrawNightVision(C);
	Super.DrawHud(C);
}

//DRAW OVERLAYS
//like scope and greenish color multiply
simulated function DrawNightVision(Canvas C)
{
	if (bNighVision)
	{
		//set green color only
		C.DrawColor.R = 0; 
		C.DrawColor.G = 127; 
		C.DrawColor.B = 0;
		C.DrawColor.A = 255; 	
		
		//scope alpha
		C.Style = ERenderStyle.STY_Alpha; 
		C.SetPos(0,0); 
		C.DrawTile(mtScopeAlpha, C.SizeX, C.SizeY,0.0,0.0,512,512);
		
		//greenish modulation
		C.Style = ERenderStyle.STY_Modulated;   
		C.SetPos(0,0); 
		C.DrawTile(mtScopeOverlay, C.SizeX, C.SizeY,0.0,0.0,512,512);
		
		//greenish overlay
		C.Style = ERenderStyle.STY_Additive; 
		C.SetPos(0,0); 
		C.DrawTile(mtScopeOverlay, C.SizeX, C.SizeY,0.0,0.0,512,512);
	
	}
}
&lt;/uscript&gt;

This should be simple. 

Note that there may be lighting issues with the terrain, since it wont always loose the lighting (Epic bug).

&amp;ndash;HeatVision&amp;ndash;

I found a way to see actors (pawns) through walls. It's a little limited on-line tho.

If you set the OverlayMaterial of a pawn to a texture with bZTest= false then you can see it trough walls. 

I tried it with Material'XGameShaders.ModuNoise'. This material is not suitable for real heat vision but just an example how this works. 

&lt;uscript&gt;
simulated function DrawHeatVision(Canvas C)
{
	local Actor p;
	
	ForEach DynamicActors(class'Actor', p)
	{//NOTE: On server side you could go trough the ControllerList.
		if (p.IsA('Pawn') &amp;&amp; pawn(p) != playerowner.pawn)
		{
			p.SetOverlayMaterial(Material'XGameShaders.ModuNoise',1, true);
		}
	}
}
&lt;/uscript&gt;

&amp;ndash;DocEDo&amp;ndash;

'''Foxpaw:''' Wouldn't it be better to leave the lights on and simply amplify existing light? That's how real night vision systems work, so I'd think that would be cooler. Maybe that's just me though..

'''DocEDo:''' It is? You can always leave the lights on. I tried, it was cool untill I tried it in dark rooms, where it sucked. I have a camera with NV and it amplifys light but not only the one we see, actually mostly the one we can't. 

'''Foxpaw:''' Yes, it's mostly the infrared light (I think) that is picked up on it, but it does work on amplifying the existing light. If you take it into a completely dark room (IE a room with no windows at night) you won't be able to see anything, unless the night vision unit also has an IR &quot;flashlight&quot; on it, which some units do. You could also get &quot;heat vision&quot; which is similar, but has the cool thing with all the different colors representing different levels of heat. Mmm, that'd be a neat feature for a sniper rifle in UT.

'''DocEDo:''' Added &quot;heat vision&quot;.

'''Pingz:''' Shouldn't 'heat vision' be on some other page?

'''Daid303:''' Well, it's also a vision enhancer. Maybe call this page vision enhancement?</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NitrogenZone</title>
    <id>2257</id>
    <revision>
      <id>5460</id>
      <timestamp>2002-05-30T12:05:49Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; NitrogenZone}}

This zone is used in DM-Pyramid as the [[Legacy:ZoneInfo|ZoneInfo]] object for the central floating area.  A Nitrogen zone behaves in a similar way to a water zone in the players can &quot;swim&quot; around in it but their movement is twice as quick as it would be in a normal water zone.

==Default Properties ==

This class doesn't add any new properties or behaviour. It holds the following defaults:

*''DamagePerSec'' = 20
*''DamageType'' = Frozen
*''bWaterZone'' = True
*''bPainZone'' = True
*''ViewFog'' = (X=0.011719,Y=0.039063,Z=0.046875)

==Events ==
; event ActorEntered( actor Other ) : When the actor enters the zone increase the default water speed by a factor of two, and set the underwater time to -1 (so the player can't drown).

; event ActorLeaving( actor Other ) : When the actor leaves the zone re-set the water speed and underwater time to their defaults.</text>
    </revision>
    <revision>
      <id>5461</id>
      <timestamp>2002-04-10T20:28:28Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; NitrogenZone}}

This zone is used in [[Legacy:DM-Pyramid|DM-Pyramid]] as the [[Legacy:ZoneInfo|ZoneInfo]] object for the central floating area.  A Nitrogen zone behaves in a similar way to a water zone in the players can &quot;swim&quot; around in it but their movement is twice as quick as it would be in a normal water zone.  Players don't suffocate in a Nitrogen zone either.</text>
    </revision>
    <revision>
      <id>5462</id>
      <timestamp>2002-04-16T19:34:38Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Added details</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:ZoneInfo|ZoneInfo]] &gt;&gt; NitrogenZone}}

This zone is used in DM-Pyramid as the [[Legacy:ZoneInfo|ZoneInfo]] object for the central floating area.  A Nitrogen zone behaves in a similar way to a water zone in the players can &quot;swim&quot; around in it but their movement is twice as quick as it would be in a normal water zone.

==Properties ==

''DamagePerSec'' = 20&lt;br /&gt;''DamageType'' = Frozen&lt;br /&gt;''bWaterZone'' = True&lt;br /&gt;''bPainZone'' = True&lt;br /&gt;''ViewFog'' = (X=0.011719,Y=0.039063,Z=0.046875)&lt;br /&gt;

==Events ==
; event ActorEntered( actor Other ) : When the actor enters the zone increase the default water speed by a factor of two, and set the underwater time to -1 (so the player can't drown).

; event ActorLeaving( actor Other ) : When the actor leaves the zone re-set the water speed and underwater time to their defaults.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NoFear MSL</title>
    <id>2277</id>
    <revision>
      <id>5503</id>
      <timestamp>2003-04-25T17:54:54Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===][NoFear &lt;sub&gt;MSL&lt;/sub&gt;][ ===

Age: 22 &lt;br /&gt;Gender: male &lt;br /&gt;Occupation: Student &lt;br /&gt;Education : Dentistry, University of Nijmegen

----

====Where can I be Found?====
; Country: Holland
; City: Nijmegen
; Email : NoFear_MSL@Hotmail.com

----

'''Wormbo:''' Welcome to the Wiki, NoFear MSL. Have a nice stay. :)

'''ZxAnPhOrIaN:''' YES beat tarq and Mych! Welcome to the wiki! :) :tup:

'''NoFear MSL:''' Thanx guys! I hope to make the best of it! ;) i'm sure gonna try!!!

----

==Help Desk ==

'''EntropicLqd:''' Hi M8,  I added your question to the [[Legacy:Help Desk|Help Desk]].  Hope you don't mind.  I was going to put it here but I changed my mind.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5504</id>
      <timestamp>2002-09-23T08:53:11Z</timestamp>
      <contributor>
        <ip>NoFear MSL</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===][NoFear &lt;sub&gt;MSL&lt;/sub&gt;][ ===

Age: 22 &lt;br /&gt;Gender: male &lt;br /&gt;Occupation: Student &lt;br /&gt;Education : Dentistry, University of Nijmegen

----

====Where can I be Found?====
; Country: Holland
; City: Nijmegen
; @inline@b2 : NoFear_MSL@Hotmail.com

----

'''Wormbo:''' Welcome to the Wiki, NoFear MSL. Have a nice stay. :)

'''ZxAnPhOrIaN:''' YES beat tarq and Mych! Welcome to the wiki! :) :tup:

'''NoFear MSL:''' Thanx guys! I hope to make the best of it! ;) i'm sure gonna try!!!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5505</id>
      <timestamp>2002-09-23T15:02:55Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>Added question to help desk instead - gtg kids!</comment>
      <text xml:space="preserve">===][NoFear &lt;sub&gt;MSL&lt;/sub&gt;][ ===

Age: 22 &lt;br /&gt;Gender: male &lt;br /&gt;Occupation: Student &lt;br /&gt;Education : Dentistry, University of Nijmegen

----

====Where can I be Found?====
; Country: Holland
; City: Nijmegen
; @inline@b2 : NoFear_MSL@Hotmail.com

----

'''Wormbo:''' Welcome to the Wiki, NoFear MSL. Have a nice stay. :)

'''ZxAnPhOrIaN:''' YES beat tarq and Mych! Welcome to the wiki! :) :tup:

'''NoFear MSL:''' Thanx guys! I hope to make the best of it! ;) i'm sure gonna try!!!

----

==Help Desk ==

'''EntropicLqd:''' Hi M8,  I added your question to the [[Legacy:Help Desk|Help Desk]].  Hope you don't mind.  I was going to put it here but I changed my mind.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NoPowerups</title>
    <id>2253</id>
    <revision>
      <id>5450</id>
      <timestamp>2003-05-27T09:47:28Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; NoPowerups (Package: Botpack)}}

The no powerups mutator does exactly what you would expect.  It removes all powerups from the game.  The objects removed from the map are:
* Super health pack
* Sheild belt
* Invisibility
* Ultra damage
* Health vials

==Methods Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]==
; bool CheckReplacement ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; when the class types [[Legacy:HealthPack|HealthPack]], [[Legacy:UT_ShieldBelt|UT_ShieldBelt]], [[Legacy:UT_Invisibility|UT_Invisibility]], [[Legacy:UDamage|UDamage]] or [[Legacy:HealthVial|HealthVial]] actors are encountered.  This effectively removes them from the game.&lt;br /&gt;For all other objects this function returns &lt;tt&gt;true&lt;/tt&gt;.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5451</id>
      <timestamp>2002-04-10T18:24:46Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>for wormbo</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; NoPowerups}}

The no powerups mutator does exactly what you would expect.  It removes all powerups from the game.  The objects removed from the map are:
* Super health pack
* Sheild belt
* Invisibility
* Ultra damage
* Health vials

==Properties ==

None

==Functions ==
; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; when the class types [[Legacy:HealthPack|HealthPack]], [[Legacy:UT_ShieldBelt|UT_ShieldBelt]], [[Legacy:UT_Invisibility|UT_Invisibility]], [[Legacy:UDamage|UDamage]], and [[Legacy:HealthVial|HealthVial]] are encountered.  This effectively removes them from the game.&lt;br /&gt;For all other objects this function returns &lt;tt&gt;true&lt;/tt&gt;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NoRedeemer</title>
    <id>2254</id>
    <revision>
      <id>5452</id>
      <timestamp>2003-05-27T09:46:03Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT|UT]] :: [[Legacy:Actor (UT)|Actor (UT)]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator (UT)|Mutator (UT)]] &gt;&gt; NoRedeemer (Package: Botpack)}}

The No Redeemer mutator removes the Redeemer from the game.  Nothing more, nothing less.  It does exactly what it says on the tin.

==Methods Inherited From [[Legacy:Mutator (UT)|Mutator (UT)]]==
; bool CheckReplacement ([[Legacy:Actor (UT)|Actor (UT)]] Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; whenever an actor of type [[Legacy:WarheadLauncher|WarheadLauncher]] (the redeemer pickup) is encountered removing it from the game.&lt;br /&gt;For all other objects the function returns &lt;tt&gt;true&lt;/tt&gt; to let other mutators or the [[Legacy:GameInfo (UT)|GameInfo (UT)]] decide what to do with it.

[[Category:Legacy Class (UT)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5453</id>
      <timestamp>2002-04-10T18:23:29Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>For Wormbo</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:Actor|Actor]] &gt;&gt; [[Legacy:Info (UT)|Info (UT)]] &gt;&gt; [[Legacy:Mutator|Mutator]] &gt;&gt; NoRedeemer}}

The No Redeemer mutator removes the Redeemer from the game.  Nothing more, nothing less.  It does exactly what it says on the tin.

==Properties ==

None

==Functions ==
; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) : This function returns &lt;tt&gt;false&lt;/tt&gt; whenever an actor of type [[Legacy:WarHeadLauncher|WarHeadLauncher]] is encountered removing it from the game.&lt;br /&gt;For all other objects the function returns &lt;tt&gt;true&lt;/tt&gt;.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Node Count</title>
    <id>2252</id>
    <revision>
      <id>5448</id>
      <timestamp>2007-04-05T03:10:56Z</timestamp>
      <contributor>
        <ip>210.213.243.37.pldt.net</ip>
      </contributor>
      <comment>*Added a comment...</comment>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5449</id>
      <timestamp>2006-04-06T22:16:08Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>revert</comment>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11478</id>
      <timestamp>2008-04-24T01:47:17Z</timestamp>
      <contributor>
        <username>0 Kelvin</username>
        <id>139</id>
      </contributor>
      <comment>/* A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) */</comment>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''Damn:''' That poly/node ratio seems to have little impact on map's performance. In my maps changing the bsp cuts slider to get a ratio of 2:1 / 1,99:1 / 2,01:1 would cause my maps to run 1 - 7 fps slower. On the other way around, aggressive bsp cuts setting would cause a strange boost of (laughts) 5fps or so. A map can become unaplayable if it's huge, even with low poly counts. I've found that by playing in various servers, maps that need a lot of memory and are huge cause the server to be on full load and prone to crash when there is too much action going on. Not only that but I've seen a map run twice as fast after the server admin complained about cpu overuse, forcing the map author to split the map in two.

I did a quick search in google and found that 65536 is the same node limit in quake / hl engine, sounds like BSP trees are limited to 16 bits something somewhere.

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>11479</id>
      <timestamp>2008-04-24T01:56:06Z</timestamp>
      <contributor>
        <username>0 Kelvin</username>
        <id>139</id>
      </contributor>
      <minor/>
      <comment>/* A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) */</comment>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''Damn:''' That poly/node ratio seems to have little impact on map's performance. In my maps changing the bsp cuts slider to get a ratio of 2:1 / 1,99:1 / 2,01:1 would cause my maps to run 1 - 7 fps slower. On the other way around, aggressive bsp cuts setting would cause a strange boost of (laughts) 5fps or so. A map can become unaplayable if it's huge, even with low poly counts. I've found that by playing in various servers, maps that need a lot of memory and are huge cause the server to be on full load and prone to crash when there is too much action going on. Not only that but I've seen a map run twice as fast after the server admin complained about cpu overuse, forcing the map author to split the map in two.

I did a quick search in google and found that 65536 is the same node limit in quake / hl engine, sounds like BSP trees are limited to 16 bits something somewhere.

Ops... ISn't it 65535? If i'm not mistaken computers start counting from 0.

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43810</id>
      <timestamp>2010-08-08T13:33:46Z</timestamp>
      <contributor>
        <ip>89.142.19.200</ip>
      </contributor>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''Damn:''' That poly/node ratio seems to have little impact on map's performance. In my maps changing the bsp cuts slider to get a ratio of 2:1 / 1,99:1 / 2,01:1 would cause my maps to run 1 - 7 fps slower. On the other way around, aggressive bsp cuts setting would cause a strange boost of (laughts) 5fps or so. A map can become unaplayable if it's huge, even with low poly counts. I've found that by playing in various servers, maps that need a lot of memory and are huge cause the server to be on full load and prone to crash when there is too much action going on. Not only that but I've seen a map run twice as fast after the server admin complained about cpu overuse, forcing the map author to split the map in two.

I did a quick search in google and found that 65536 is the same node limit in quake / hl engine, sounds like BSP trees are limited to 16 bits something somewhere.

Ops... ISn't it 65535? If i'm not mistaken computers start counting from 0.

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

'''WhirlWindWabbit:''' As far as I know, GTD-Carthage is correct. But, as you are all aware, Unreal engine 1 has some difficulties rendering a lot of movers in a small area or just rendering complex movers. Moreover, if you use too much movers, even simple ones, your map is prone to &quot;losing&quot; the movers when you play the game. They are simply not rendered. Not sure why that happens though. So, in my opinion, movers act sort of like a Static Meshes do in the new Unreal engines as they do not effect the BSP tree, but due to the buggy nature of movers - including incorrect display of lighting on its surface - using movers to replace geometry should be used sparingly.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>43811</id>
      <timestamp>2010-08-08T13:35:03Z</timestamp>
      <contributor>
        <ip>89.142.19.200</ip>
      </contributor>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''Damn:''' That poly/node ratio seems to have little impact on map's performance. In my maps changing the bsp cuts slider to get a ratio of 2:1 / 1,99:1 / 2,01:1 would cause my maps to run 1 - 7 fps slower. On the other way around, aggressive bsp cuts setting would cause a strange boost of (laughts) 5fps or so. A map can become unaplayable if it's huge, even with low poly counts. I've found that by playing in various servers, maps that need a lot of memory and are huge cause the server to be on full load and prone to crash when there is too much action going on. Not only that but I've seen a map run twice as fast after the server admin complained about cpu overuse, forcing the map author to split the map in two.

I did a quick search in google and found that 65536 is the same node limit in quake / hl engine, sounds like BSP trees are limited to 16 bits something somewhere.

Ops... ISn't it 65535? If i'm not mistaken computers start counting from 0.

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

'''WhirlWindWabbit:''' As far as I know, GTD-Carthage is correct. But, as you are all aware, Unreal engine 1 has some difficulties rendering a lot of movers in a small area or just rendering complex movers. Moreover, if you use too much movers, even simple ones, your map is prone to &quot;losing&quot; the movers when you play the game. They are simply not rendered. So, in my opinion, movers act sort of like static meshes do in the new Unreal engines as they do not effect the BSP tree, but due to the buggy nature of movers - including incorrect display of lighting on its surface - using movers to replace geometry should be used sparingly.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44350</id>
      <timestamp>2011-04-05T12:26:25Z</timestamp>
      <contributor>
        <ip>92.40.20.152</ip>
      </contributor>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''Damn:''' That poly/node ratio seems to have little impact on map's performance. In my maps changing the bsp cuts slider to get a ratio of 2:1 / 1,99:1 / 2,01:1 would cause my maps to run 1 - 7 fps slower. On the other way around, aggressive bsp cuts setting would cause a strange boost of (laughts) 5fps or so. A map can become unaplayable if it's huge, even with low poly counts. I've found that by playing in various servers, maps that need a lot of memory and are huge cause the server to be on full load and prone to crash when there is too much action going on. Not only that but I've seen a map run twice as fast after the server admin complained about cpu overuse, forcing the map author to split the map in two.

I did a quick search in google and found that 65536 is the same node limit in quake / hl engine, sounds like BSP trees are limited to 16 bits something somewhere.

Ops... ISn't it 65535? If i'm not mistaken computers start counting from 0.
You are correct in that they start from 0, but you are misunderstanding: The index of the first node would be 0, and the index of the last node would be 65535, but the actual number of nodes doesn't change when 0-indexing, it's still 65536.

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

'''WhirlWindWabbit:''' As far as I know, GTD-Carthage is correct. But, as you are all aware, Unreal engine 1 has some difficulties rendering a lot of movers in a small area or just rendering complex movers. Moreover, if you use too much movers, even simple ones, your map is prone to &quot;losing&quot; the movers when you play the game. They are simply not rendered. So, in my opinion, movers act sort of like static meshes do in the new Unreal engines as they do not effect the BSP tree, but due to the buggy nature of movers - including incorrect display of lighting on its surface - using movers to replace geometry should be used sparingly.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>44351</id>
      <timestamp>2011-04-05T12:27:30Z</timestamp>
      <contributor>
        <ip>92.40.20.152</ip>
      </contributor>
      <text xml:space="preserve">Common confusions about what the term &quot;Node Count&quot; means:
* it's not the number of [[Legacy:PathNode|PathNode]]s
* it's not the number of [[Legacy:Brush|brush]] vertices
* it's not the number of BSP regions
* it's in fact the number of [[Legacy:BSP|BSP]] leaf nodes 

In other words, a Node is one of the coloured polygons in UnrealEd's Zone / Portal view.

The term is used in two ways: 
* the total number of nodes in the map (this is given in the [[Legacy:Build|Build]] window's Stats tab.
* the number of currently visible nodes in game

===Example: single cube ===

A map consisting of a single subtracted cube will have:
* a total poly count of 6 (6 surfaces)
* a total node count of 6 (no surfaces are split)
* and therefore a node:poly ratio of 1.00:1

==Reducing Node Count ==

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

UnrealEd apparently cannot handle more than 65536 BSP nodes. Even if it takes 30 minutes alone to apply all structural brushes to the world, it will crash while handling lights.

----

'''refactoring in progress...'''

But the plot thickens. At least one person in the world of Unreal editing, a certain [[Legacy:Tarquin|Tarquin]], was for a long time under the mistaken impression that a BSP node was a region of space. It's not. That's a region, probably.

Experiments support the hypothesis (see below) that a BSP node is a poly belonging to a region: in other words, one of the ares of colour that is seen in UnrealEd's Zone / Portal view.

----

Current theory is that it's none of the above. See experiment below.

High node counts require more processing power (to render them all at once) and so can cause your map to play slowly on your machine, and could make it next to unplayable on a lower powered PC, especially if you have any special effects in there like snow or fog.

[[Legacy:Semisolid|Semisolid]] brushes help drastically reduce the node count of a level &amp;ndash; but overuse is also a bad idea. The node count in any one area can also be reduced by proper [[Legacy:Zoning|Zoning]] of your map.

:&lt;i&gt;Egad, I was about to create a page on Node Count too... :-) I am, however, fairly sure that node count is the number of BSP nodes, not the number of vertices.  ''Tarquin'' &lt;/i&gt;

It would appear everyone was wrong: evidence shows that Node Count is the number of currently visible BSP polys. The Poly/Node ratio is then a measure of how much surfaces are split up by BSP cuts across the map. 

(evidence is this: a single cube should be a single BSP region. NodeCount when looking at this is exactly the number of visible polys.)

Question: are the final leaves of the BSP tree regions which own polys, or polys themselves?
: &lt;i&gt;If the node count is the number of visible polys in your cube then it would seem that the leaves of the BSP tree reate to the polys themselves rather than the region that relates to the the polys in a single BSP cut.&lt;/i&gt;
::Yup  &amp;ndash; ''Tarquin'' 

===Quick Experiment ===

Build two subtractive boxes:
* 128 x 128 x 256
* 256 x 512 x 256

Put them side by side, so the small box is halfway up the side of the large box.

Look at the Build window's Stats tab, &amp; note the following:
* We have 11 surfaces (entities that are selected in 3D view), since the small box loses one surface entirely
* One surface is a rectangle with a square hole in it. In Zone view this is split into 4 BSP polys. 
* Total Nodes is 14. This is not the number of vertices (16) in the map.

Wandering around UEd with &quot;stat FPS&quot; enabled (type into the [[Legacy:UnrealEd Console|UnrealEd console]]) you can see the following:
* Poly count is 11, hence this is simply the number of surfaces. This already surprises me, I'd always figured poly count was the number of BSP polys, not surfaces, and node count was the BSP leafs... arg! 
* Node count appears to be the number of BSP polys visible. Try looking at the small box from the big box. The high node count is due to the hollow surface being split.

;Question : Is the node count the total number of BSP nodes used to render the scene?  Or is it the total number of leaf nodes used to render the scene? - it sounds like it's the total number of BSP nodes used as you would only expect faces to exist at the tree leafs.

===Another experiment ===

Create an 8 pointed start in the 2D shape editor and extrude it.  Place two of them in a reasonably large room such that the flat face lies in the vertical plane (so you can look at it straight on).  Now subtract (or clip) the front off of one of the stars you created to create a single polygon on the front face.  Then merge all of the faces on the other star.

When you look at the level within the game you will see that the the star with the clipped or subtracted brush has both a reduced node count and a reduced poly count.  When you look at the star with the mreged faces you will see that only the poly count has decreased.

This would seem to prove the BSP poly theory as the clip/subtract approach actually alters the wireframe of the star brush rather than simply &quot;pretending&quot; to alter the wireframe.  The real question then is - why didn't the BSP merge any of the co-planar faces of the star brush? &lt;i&gt;because it only merges to convex pieces&lt;/i&gt;

''Tarquin'': I haven't tried this in UnrealEd yet, but as far as I know:
* Clipping / Intersecting / BSP code splits concave polys by travelling round and making a cut for each face. For the star, I imagine this could make some cuts that fall midway across a side of the star face. Depends on how the star is made.
* Poly-merging code already has convex pieces to work with. It therefore only has to stick them together in an optimal way to make the smallest number of convex pieces.

A star shape isn't much suited to merging &amp;ndash; again, much depends on the shape of the star, and possibly the order in which it was drawn in 2D (I think the way the shape is made out of triangles initially depends on side split order). Clipping/Intersecting may manage more merging in this case.

&lt;i&gt;I tried clipping the star shape I built.  Rather than having the wireframe change shape, the wireframe simply got thinner when I performed the clip.  Ofcourse, this might have been a problem with the way I clipped it - I tend not to use the clipping tool much as on my old system it would tend to cause the editor to crash.  Seems fine on the new one though so I might use it more.&lt;/i&gt;

===A look at the motivation for Node Count and Node:Poly ratios (SuicideMissions{CLR}'s Theory) ===

The idea is to minimize the number of nodes traversed in the BSP tree. Due to the Binary/Logarithmic nature of BSP trees, the more balanced the tree is, the fewer node traversals will be required to reach the leaf nodes (BSP polys actually rendered). The leaf nodes represent (more or less) the actual BSP polys rendered at runtime. In this pic below, the ''visible'' BSP polys to a player are circled in red. In addition, the nodes which must be traversed are red. Notice that as trees become more unwieldy and less balanced, the traversed nodes goes up in proportion to leaf nodes (actual polys rendered). Count them! Imagine how much worse a large tree would be with many more of these unsightly unbalances!

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees below! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!.]]

How do we do this? By making sure that in any given space of our level, there are not a bunch of BSP polys bunched up in one area. The more evenly spread out the BSP polys (shown in BSP cut view of the perspective window), the more balanced the tree, and the closer to 2:1 node:poly ratio, and the more effecient the map.

When you need more detail in a paritcular spot of your map, like a torch on the wall, then you use Semisolid brushes since they are not BSP based and will therefore not cause BSP cuts and clumps of leaves on the tree. (They do not even effect the tree structure).

'''Damn:''' That poly/node ratio seems to have little impact on map's performance. In my maps changing the bsp cuts slider to get a ratio of 2:1 / 1,99:1 / 2,01:1 would cause my maps to run 1 - 7 fps slower. On the other way around, aggressive bsp cuts setting would cause a strange boost of (laughts) 5fps or so. A map can become unaplayable if it's huge, even with low poly counts. I've found that by playing in various servers, maps that need a lot of memory and are huge cause the server to be on full load and prone to crash when there is too much action going on. Not only that but I've seen a map run twice as fast after the server admin complained about cpu overuse, forcing the map author to split the map in two.

I did a quick search in google and found that 65536 is the same node limit in quake / hl engine, sounds like BSP trees are limited to 16 bits something somewhere.

Ops... ISn't it 65535? If i'm not mistaken computers start counting from 0.

You are correct in that they start from 0, but you are misunderstanding: The index of the first node would be 0, and the index of the last node would be 65535, but the actual number of nodes doesn't change when 0-indexing, it's still 65536.

'''ProjectX:''' Ayone know the recommended poly/node count for maps to be playable on most machines?
:'''Ironblayde:''' Check the [[Legacy:Polycount|Polycount]] page for some good figures to shoot for. As to the node:poly ratio, I've heard that 2:1 is a good figure to keep in mind. It won't be the end of the world if you go over this a bit, though. Many of the retail UT maps are closer to 2.5 or 2.6. Not sure about UT2003. 

'''Aphex'''  I believe the node count isn't just the leaf nodes, but all the nodes in the tree.  At each node is a 3-d plane eqn that subdivides 3d space, its two children representing the space either side of that plane.

Just to make things a bit more complicated, your node count may change just by rebuilding the map with no changes to anything, suggesting it isn't a simple mapping to polygons, but an adaptive process with feedback (i.e. it uses the current bsp as input to the build process!) that probably arbitrarily chooses the first spatial subdivision.

I remember some epic person saying some time ago that it's best to have all your large brushes at the beginning of the CSG list, with detail brushes nearer the end for optimal BSP building...

'''T-1''' I have a question: Wouldn't fog speed up rendering rather than slow it down? IIRC stuff behind fog is occluded.

'''GTD-Carthage:''' Though this is not really part of the debate, I thought maybe I could add the fact that converting high-poly brushes into movers will vastly (and cleverly) reduce the node count?

'''WhirlWindWabbit:''' As far as I know, GTD-Carthage is correct. But, as you are all aware, Unreal engine 1 has some difficulties rendering a lot of movers in a small area or just rendering complex movers. Moreover, if you use too much movers, even simple ones, your map is prone to &quot;losing&quot; the movers when you play the game. They are simply not rendered. So, in my opinion, movers act sort of like static meshes do in the new Unreal engines as they do not effect the BSP tree, but due to the buggy nature of movers - including incorrect display of lighting on its surface - using movers to replace geometry should be used sparingly.

* [[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/MergingDebate]]. 

[[Category:Legacy Mapping|{{PAGENAME}}]]
[[Category:Legacy Refactor Me|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Node Count/MergingDebate</title>
    <id>2256</id>
    <revision>
      <id>5457</id>
      <timestamp>2005-03-10T12:28:16Z</timestamp>
      <contributor>
        <ip>C-67-183-19-195.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a pge for Tarquin &amp; Entropic &amp; anyone else who's interested to thrash out this nodecount / merging thing. See if we can work it out ourselves... and maybe call in the Epic cavalry if we can't. ;-)''

==Definitions ==

Just so we're talking about the same stuff....
;Face: a maximal set of coplanar polygons of a brush. (mathematician terminology, sorry...)
;Surface: a polygon entity that is selectable with a single click in 3D view
;BSP Poly: (maybe not the right word...) An area of single colour in the Zone view. (this is what I *believe* is the nodecount... but that's another story)
;Edge: the edge of either a surface or BSP poly

Ways to merge:
; Polymerge : using the Polys -&gt; merge command on aligned surfaces &amp; then rebuilding
; Clip : slice off the face to be merged
; Intersect : while still at the red build brush stage, use world geometry to slice off the face to be merged.

== Discussion ===

===Exp 1 ===

Shape: a square with the right-hand side split, and the new vertex brought in to the left till it's 1/4 of the width from the left side. The face is initially 3 surfaces.

* Intersect: 1 surface made of 2 BSP polys
*Clip: 2 surfaces, each is a single BSP poly
*Polymerge: 1 surface, 3 BSP polys. 

[[Image:Legacy_polymerge.shape1.gif|center|]]

In this particular case, no pair of the existing triangles can be merged to produce a convex shape, so the number of BSP polys isn't reduced by merging Nodecount when looking at this brush straight on is 4: 3 polys for the brush &amp; the subtract in the background. Hence for this shape, polymerging is merely a convenience to the mapper &amp; has no impact on the engine. 

On the other hand, the other two methods produce an off-grid point.

: I think I need a picture - I can't quite visualise the geometry your are using here.  Good idea to create this page btw - keeps what's going to be a long and tortuous discussion (I suspect) out of the way.  I'll repeat my extrusion experiments tonight and update this page with the pics. and results - [[Legacy:EntropicLqd|EntropicLqd]].
:: tada! Piccy :) It's starting to seem like there's not one simple answer, different shapes benefit most from different techniques. N00bs in search of a one-size fits all holy grail answer are not gonna like this... lol!  &amp;ndash; ''Tarquin'' 

[[Image:Legacy_archway_example.gif|center|]]

Here's a good one.  Looking from left to right you have the original brush (a little redundant but I forgot to clip it out of the picture), the merged brush, the brush created using a clip, and the brush created using the subtract.  For both the clipped and subtracted brush I used an intersected version of the brush to add them to the world.  When viewed in game, I got the following results:

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;Brush type&lt;/td&gt;&lt;td&gt;Nodes&lt;/td&gt;&lt;td&gt;Polygons&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Default extrusion&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Merged polys&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Clipped polys&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Subtracted polys&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

The implication of that is pretty interesting.  It seems that as the number of points on the extruded face increases subtracting or clipping the face produces better results than simply merging the polys.  The most interesting thing about the above example though is that the very best results would be achieved by merging the faces on the &quot;clipped&quot; brush.  For some reason the clipped brush produces a more efficient set of Faces.

Something else I just tried - Zoning the level I built (essentially a cross roads with four large rooms to the north, south, east, and west).  This changes the node count which lends weight to my theory that the node count is the total number of nodes within the BSP traversed rather than visible (which makes more sense to me from a performance monitoring point of view as well).  Here's the post level zoning results

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;Brush type&lt;/td&gt;&lt;td&gt;Nodes&lt;/td&gt;&lt;td&gt;Polygons&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Default extrusion&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Merged polys&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Clipped polys&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Subtracted polys&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

I did cheat a little as I set the BSP &quot;minimise cuts/balance tree&quot; weighting to 5 when I built the level.

'''Mosquito:'''I read all this and it doesn't even have a conclusion, This Channel sucks. Now I'm gonna be bothered for weeks.

'''Tarquin:''' Well.... the conclusion was, I think: &quot;It depends on the type of shape. Clip and intersect cuts may have non-grid points, so that's an extra thing to watch for.&quot;

'''EntropicLqd:''' It's more of a journey than a destination :) &amp;ndash; To be honest this topic is somewhat moot now that everythings gone to static-mesh hell.

'''SuicideMissions{CLR}:''' LOL. We know that the leaves of the BSP tree correspond to BSP Polys. If in the phrase &quot;node:poly&quot; ratio, &quot;poly&quot; refers to BSP Polys, then how could the ratio be anything other than 1:1? Therefore, *if* poly means BSP poly, then node MUST mean all nodes traversed in the tree. This also does make sense from a performance-stat point of view.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!. Count the traversed nodes (&quot;Node Count&quot;) vs. the leaf nodes (BSP Polys).]]

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees above! A 2:1 ratio gives you the most leaves for the fewest traversals possible for any non-trival tree. It happens when the tree is balanced.</text>
    </revision>
    <revision>
      <id>5458</id>
      <timestamp>2004-02-26T20:17:25Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>static meshes make this a largely pointless page anyway</comment>
      <text xml:space="preserve">''This is a pge for Tarquin &amp; Entropic &amp; anyone else who's interested to thrash out this nodecount / merging thing. See if we can work it out ourselves... and maybe call in the Epic cavalry if we can't. ;-)''

==Definitions ==

Just so we're talking about the same stuff....
;Face: a maximal set of coplanar polygons of a brush. (mathematician terminology, sorry...)
;Surface: a polygon entity that is selectable with a single click in 3D view
;BSP Poly: (maybe not the right word...) An area of single colour in the Zone view. (this is what I *believe* is the nodecount... but that's another story)
;Edge: the edge of either a surface or BSP poly

Ways to merge:
; Polymerge : using the Polys -&gt; merge command on aligned surfaces &amp; then rebuilding
; Clip : slice off the face to be merged
; Intersect : while still at the red build brush stage, use world geometry to slice off the face to be merged.

== Discussion ===

===Exp 1 ===

Shape: a square with the right-hand side split, and the new vertex brought in to the left till it's 1/4 of the width from the left side. The face is initially 3 surfaces.

* Intersect: 1 surface made of 2 BSP polys
*Clip: 2 surfaces, each is a single BSP poly
*Polymerge: 1 surface, 3 BSP polys. 

[[Image:Legacy_polymerge.shape1.gif|center|]]

In this particular case, no pair of the existing triangles can be merged to produce a convex shape, so the number of BSP polys isn't reduced by merging Nodecount when looking at this brush straight on is 4: 3 polys for the brush &amp; the subtract in the background. Hence for this shape, polymerging is merely a convenience to the mapper &amp; has no impact on the engine. 

On the other hand, the other two methods produce an off-grid point.

: I think I need a picture - I can't quite visualise the geometry your are using here.  Good idea to create this page btw - keeps what's going to be a long and tortuous discussion (I suspect) out of the way.  I'll repeat my extrusion experiments tonight and update this page with the pics. and results - [[Legacy:EntropicLqd|EntropicLqd]].
:: tada! Piccy :) It's starting to seem like there's not one simple answer, different shapes benefit most from different techniques. N00bs in search of a one-size fits all holy grail answer are not gonna like this... lol!  &amp;ndash; ''Tarquin'' 

[[Image:Legacy_archway_example.gif|center|]]

Here's a good one.  Looking from left to right you have the original brush (a little redundant but I forgot to clip it out of the picture), the merged brush, the brush created using a clip, and the brush created using the subtract.  For both the clipped and subtracted brush I used an intersected version of the brush to add them to the world.  When viewed in game, I got the following results:

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;Brush type&lt;/td&gt;&lt;td&gt;Nodes&lt;/td&gt;&lt;td&gt;Polygons&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Default extrusion&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Merged polys&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Clipped polys&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Subtracted polys&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

The implication of that is pretty interesting.  It seems that as the number of points on the extruded face increases subtracting or clipping the face produces better results than simply merging the polys.  The most interesting thing about the above example though is that the very best results would be achieved by merging the faces on the &quot;clipped&quot; brush.  For some reason the clipped brush produces a more efficient set of Faces.

Something else I just tried - Zoning the level I built (essentially a cross roads with four large rooms to the north, south, east, and west).  This changes the node count which lends weight to my theory that the node count is the total number of nodes within the BSP traversed rather than visible (which makes more sense to me from a performance monitoring point of view as well).  Here's the post level zoning results

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;Brush type&lt;/td&gt;&lt;td&gt;Nodes&lt;/td&gt;&lt;td&gt;Polygons&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Default extrusion&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Merged polys&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Clipped polys&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Subtracted polys&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

I did cheat a little as I set the BSP &quot;minimise cuts/balance tree&quot; weighting to 5 when I built the level.

'''Mosquito:'''I read all this and it doesn't even have a conclusion, This Channel sucks. Now I'm gonna be bothered for weeks.

'''Tarquin:''' Well.... the conclusion was, I think: &quot;It depends on the type of shape. Clip and intersect cuts may have non-grid points, so that's an extra thing to watch for.&quot;

'''EntropicLqd:''' It's more of a journey than a destination :) &amp;ndash; To be honest this topic is somewhat moot now that everythings gone to static-mesh hell.</text>
    </revision>
    <revision>
      <id>5459</id>
      <timestamp>2005-03-10T12:26:14Z</timestamp>
      <contributor>
        <ip>C-67-183-19-195.client.comcast.net</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">''This is a pge for Tarquin &amp; Entropic &amp; anyone else who's interested to thrash out this nodecount / merging thing. See if we can work it out ourselves... and maybe call in the Epic cavalry if we can't. ;-)''

==Definitions ==

Just so we're talking about the same stuff....
;Face: a maximal set of coplanar polygons of a brush. (mathematician terminology, sorry...)
;Surface: a polygon entity that is selectable with a single click in 3D view
;BSP Poly: (maybe not the right word...) An area of single colour in the Zone view. (this is what I *believe* is the nodecount... but that's another story)
;Edge: the edge of either a surface or BSP poly

Ways to merge:
; Polymerge : using the Polys -&gt; merge command on aligned surfaces &amp; then rebuilding
; Clip : slice off the face to be merged
; Intersect : while still at the red build brush stage, use world geometry to slice off the face to be merged.

== Discussion ===

===Exp 1 ===

Shape: a square with the right-hand side split, and the new vertex brought in to the left till it's 1/4 of the width from the left side. The face is initially 3 surfaces.

* Intersect: 1 surface made of 2 BSP polys
*Clip: 2 surfaces, each is a single BSP poly
*Polymerge: 1 surface, 3 BSP polys. 

[[Image:Legacy_polymerge.shape1.gif|center|]]

In this particular case, no pair of the existing triangles can be merged to produce a convex shape, so the number of BSP polys isn't reduced by merging Nodecount when looking at this brush straight on is 4: 3 polys for the brush &amp; the subtract in the background. Hence for this shape, polymerging is merely a convenience to the mapper &amp; has no impact on the engine. 

On the other hand, the other two methods produce an off-grid point.

: I think I need a picture - I can't quite visualise the geometry your are using here.  Good idea to create this page btw - keeps what's going to be a long and tortuous discussion (I suspect) out of the way.  I'll repeat my extrusion experiments tonight and update this page with the pics. and results - [[Legacy:EntropicLqd|EntropicLqd]].
:: tada! Piccy :) It's starting to seem like there's not one simple answer, different shapes benefit most from different techniques. N00bs in search of a one-size fits all holy grail answer are not gonna like this... lol!  &amp;ndash; ''Tarquin'' 

[[Image:Legacy_archway_example.gif|center|]]

Here's a good one.  Looking from left to right you have the original brush (a little redundant but I forgot to clip it out of the picture), the merged brush, the brush created using a clip, and the brush created using the subtract.  For both the clipped and subtracted brush I used an intersected version of the brush to add them to the world.  When viewed in game, I got the following results:

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;Brush type&lt;/td&gt;&lt;td&gt;Nodes&lt;/td&gt;&lt;td&gt;Polygons&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Default extrusion&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Merged polys&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Clipped polys&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Subtracted polys&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

The implication of that is pretty interesting.  It seems that as the number of points on the extruded face increases subtracting or clipping the face produces better results than simply merging the polys.  The most interesting thing about the above example though is that the very best results would be achieved by merging the faces on the &quot;clipped&quot; brush.  For some reason the clipped brush produces a more efficient set of Faces.

Something else I just tried - Zoning the level I built (essentially a cross roads with four large rooms to the north, south, east, and west).  This changes the node count which lends weight to my theory that the node count is the total number of nodes within the BSP traversed rather than visible (which makes more sense to me from a performance monitoring point of view as well).  Here's the post level zoning results

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;Brush type&lt;/td&gt;&lt;td&gt;Nodes&lt;/td&gt;&lt;td&gt;Polygons&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Default extrusion&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Merged polys&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Clipped polys&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;Subtracted polys&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

I did cheat a little as I set the BSP &quot;minimise cuts/balance tree&quot; weighting to 5 when I built the level.

'''Mosquito:'''I read all this and it doesn't even have a conclusion, This Channel sucks. Now I'm gonna be bothered for weeks.

'''Tarquin:''' Well.... the conclusion was, I think: &quot;It depends on the type of shape. Clip and intersect cuts may have non-grid points, so that's an extra thing to watch for.&quot;

'''EntropicLqd:''' It's more of a journey than a destination :) &amp;ndash; To be honest this topic is somewhat moot now that everythings gone to static-mesh hell.

'''SuicideMissions{CLR}:''' LOL. We know that the leaves of the BSP tree correspond to BSP Polys. If in the phrase &quot;node:poly&quot; ratio, &quot;poly&quot; refers to BSP Polys, then how could the ratio be anything other than 1:1? Therefore, *if* poly means BSP poly, then node MUST mean all nodes traversed in the tree. This also does make sense from a performance-stat point of view.

[[Image:Legacy_BSPTreeNodes.jpeg|center|Doggone near PROOF that &quot;Node Count&quot; refers to the number of nodes TRAVERSED in the BSP tree!. Count the traversed nodes (&quot;Node Count&quot;) vs. the leaf nodes (BSP Polys).]]

And that number 2 (as in 2:1) sounds suspiciously related to the BINARY/Logarithmic nature of BSP trees. A well balanced tree will have approximately a 2:1 ratio of traversal vs. leaves. Try it! Count nodes and leaves in those trees above!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NogginBasher</title>
    <id>2310</id>
    <revision>
      <id>5571</id>
      <timestamp>2006-10-15T08:38:41Z</timestamp>
      <contributor>
        <ip>NogginBasher</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi all, thanks for this great Wiki.

I'll put links up to my UT99 maps sometime...

Until then, you can find them on unreal://213.121.244.94/</text>
    </revision>
    <revision>
      <id>5572</id>
      <timestamp>2006-10-15T08:36:36Z</timestamp>
      <contributor>
        <ip>NogginBasher</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Hi all, thanks for this great Wiki.

I'll put links up to some of my UT99 maps sometime...

Until then, you can find them on unreal://213.121.244.94/</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nomad/WUtils</title>
    <id>2281</id>
    <revision>
      <id>5514</id>
      <timestamp>2002-11-21T15:03:25Z</timestamp>
      <contributor>
        <ip>Nomad</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">[[Legacy:El Muerte TDS/WUtils|What is wUtils?]]

==wString ==

===InStrPlus() ===

&lt;uscript&gt;static final function int InStrPlus( coerce string HayStack, coerce string Needle, optional int Start )
{
     local int i;

     for ( i = Start; i &lt; Len( HayStack ); i++ )
          if ( Mid( HayStack, i, 1 ) == Needle )
               break;

     return i;
}&lt;/uscript&gt;

'''Mychaeel:''' I'm afraid this is a very slow and inefficient way to implement this function; besides, it'll only search for single-character &quot;Needle&quot;s.  Better do something like InStrFrom on [[Legacy:UT2003/Suggestions|UT2003/Suggestions]].

'''''nomad''''': Your version is a lot better, this is something I used in Deus Ex ages ago.

===ReplaceOption() ===

'''''nomad''''': Not sure wheather or not this should be added to wUtils. It allows you to quickly change a value in the Options string used in Login and PostLogin.

&lt;uscript&gt;static function bool ReplaceOption( out string Options, string Key, string NewValue, optional out string OldValue, optional bool bAddIfMissing )
{
     local array&lt;string&gt; OptionsArray;
     local int i;
     local string   CurrentKey, CurrentValue;
     local bool     bReplaced;
     bReplaced = false;

     // Need to strip the first ? from Options otherwise Split doesn't work
     if ( Left( Options, 1 ) == &quot;?&quot; )
          Options = Right( Options, Len( Options ) - 1 );

     Split( Options, &quot;?&quot;, OptionsArray );

     for ( i = 0; i &lt; OptionsArray.Length; i++ ) {
          Divide( OptionsArray[i], &quot;=&quot;, CurrentKey, CurrentValue );

          if ( CurrentKey ~= Key ) {
               OldValue = CurrentValue;
               OptionsArray[i] = CurrentKey$&quot;=&quot;$NewValue;
               bReplaced = true;
               log( &quot;ReplaceOption() :: Replaced [&quot;$CurrentKey$&quot;] Old = &quot;$OldValue$&quot;, new = &quot;$NewValue, 'wUtils' );
          }
     }

     if ( !bReplaced &amp;&amp; bAddIfMissing )
          OptionsArray[OptionsArray.Length] = Key$&quot;=&quot;$NewValue;

     Options = &quot;?&quot;$Join( OptionsArray, &quot;?&quot;, Options );
     return bReplaced;
}&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>5515</id>
      <timestamp>2002-11-21T08:43:25Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==wString ==

===InStrPlus() ===

&lt;uscript&gt;static final function int InStrPlus( coerce string HayStack, coerce string Needle, optional int Start )
{
     local int i;

     for ( i = Start; i &lt; Len( HayStack ); i++ )
          if ( Mid( HayStack, i, 1 ) == Needle )
               break;

     return i;
}&lt;/uscript&gt;

'''Mychaeel:''' I'm afraid this is a very slow and inefficient way to implement this function; besides, it'll only search for single-character &quot;Needle&quot;s.  Better do something like InStrFrom on [[Legacy:UT2003/Suggestions|UT2003/Suggestions]].

===ReplaceOption() ===

'''''nomad''''': Not sure wheather or not this should be added to wUtils. It allows you to quickly change a value in the Options string used in Login and PostLogin.

&lt;uscript&gt;static function bool ReplaceOption( out string Options, string Key, string NewValue, optional out string OldValue, optional bool bAddIfMissing )
{
     local array&lt;string&gt; OptionsArray;
     local int i;
     local string   CurrentKey, CurrentValue;
     local bool     bReplaced;
     bReplaced = false;

     // Need to strip the first ? from Options otherwise Split doesn't work
     if ( Left( Options, 1 ) == &quot;?&quot; )
          Options = Right( Options, Len( Options ) - 1 );

     Split( Options, &quot;?&quot;, OptionsArray );

     for ( i = 0; i &lt; OptionsArray.Length; i++ ) {
          Divide( OptionsArray[i], &quot;=&quot;, CurrentKey, CurrentValue );

          if ( CurrentKey ~= Key ) {
               OldValue = CurrentValue;
               OptionsArray[i] = CurrentKey$&quot;=&quot;$NewValue;
               bReplaced = true;
               log( &quot;ReplaceOption() :: Replaced [&quot;$CurrentKey$&quot;] Old = &quot;$OldValue$&quot;, new = &quot;$NewValue, 'wUtils' );
          }
     }

     if ( !bReplaced &amp;&amp; bAddIfMissing )
          OptionsArray[OptionsArray.Length] = Key$&quot;=&quot;$NewValue;

     Options = &quot;?&quot;$Join( OptionsArray, &quot;?&quot;, Options );
     return bReplaced;
}&lt;/uscript&gt;</text>
    </revision>
    <revision>
      <id>5516</id>
      <timestamp>2002-11-21T14:59:32Z</timestamp>
      <contributor>
        <ip>Nomad</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==wString ==

===InStrPlus() ===

&lt;uscript&gt;static final function int InStrPlus( coerce string HayStack, coerce string Needle, optional int Start )
{
     local int i;

     for ( i = Start; i &lt; Len( HayStack ); i++ )
          if ( Mid( HayStack, i, 1 ) == Needle )
               break;

     return i;
}&lt;/uscript&gt;

'''Mychaeel:''' I'm afraid this is a very slow and inefficient way to implement this function; besides, it'll only search for single-character &quot;Needle&quot;s.  Better do something like InStrFrom on [[Legacy:UT2003/Suggestions|UT2003/Suggestions]].

'''''nomad''''': Your version is a lot better, this is something I used in Deus Ex ages ago.

===ReplaceOption() ===

'''''nomad''''': Not sure wheather or not this should be added to wUtils. It allows you to quickly change a value in the Options string used in Login and PostLogin.

&lt;uscript&gt;static function bool ReplaceOption( out string Options, string Key, string NewValue, optional out string OldValue, optional bool bAddIfMissing )
{
     local array&lt;string&gt; OptionsArray;
     local int i;
     local string   CurrentKey, CurrentValue;
     local bool     bReplaced;
     bReplaced = false;

     // Need to strip the first ? from Options otherwise Split doesn't work
     if ( Left( Options, 1 ) == &quot;?&quot; )
          Options = Right( Options, Len( Options ) - 1 );

     Split( Options, &quot;?&quot;, OptionsArray );

     for ( i = 0; i &lt; OptionsArray.Length; i++ ) {
          Divide( OptionsArray[i], &quot;=&quot;, CurrentKey, CurrentValue );

          if ( CurrentKey ~= Key ) {
               OldValue = CurrentValue;
               OptionsArray[i] = CurrentKey$&quot;=&quot;$NewValue;
               bReplaced = true;
               log( &quot;ReplaceOption() :: Replaced [&quot;$CurrentKey$&quot;] Old = &quot;$OldValue$&quot;, new = &quot;$NewValue, 'wUtils' );
          }
     }

     if ( !bReplaced &amp;&amp; bAddIfMissing )
          OptionsArray[OptionsArray.Length] = Key$&quot;=&quot;$NewValue;

     Options = &quot;?&quot;$Join( OptionsArray, &quot;?&quot;, Options );
     return bReplaced;
}&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nonsolid</title>
    <id>2264</id>
    <revision>
      <id>5478</id>
      <timestamp>2005-01-13T21:50:47Z</timestamp>
      <contributor>
        <ip>Copperman</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a type of brush [[Legacy:Solidity|solidity]]. 
* Nonsolid [[Legacy:Brush|brush]]es are additive
* They don't block players
* Used for things like [[Legacy:Zone Portal|zone portal]]s and [[Legacy:Making Liquids|Making Liquids]]
* May intersect add and subtractive brushes
* Must not touch or intersect other nonsolids or [[Legacy:Semisolid|semisolid]]s

==Related Topics==
* Nonsolids are [[Legacy:Building With CSG | Built with CSG]]
* There are general [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Brush Hacking|Brush Hacking]] can turn nonsolids into subtractives

==Comments==

'''Dorkorama''' Considering that UnrealEd is dead and only part of its remains were incorporated into LevelDesigner.com , this page, and any others like it if there are any, needs a bit of fleshing out.

'''Tarquin:''' maybe someone should contact LevelDesigner to ask them if they'd like to donate the stuff they're no longer using. Though I doubt they would.

'''Copperman''': If I'm not mistaken, non-solids may abutt each other edge to edge without any problems.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5479</id>
      <timestamp>2003-10-01T09:42:48Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">This is a type of brush [[Legacy:Solidity|solidity]]. 
* Nonsolid [[Legacy:Brush|brush]]es are additive
* They don't block players
* Used for things like [[Legacy:Zone Portal|zone portal]]s and [[Legacy:Making Liquids|Making Liquids]]
* May intersect add and subtractive brushes
* Must not touch or intersect other nonsolids or [[Legacy:Semisolid|semisolid]]s

==Related Topics==
* Nonsolids are [[Legacy:Building With CSG | Built with CSG]]
* There are general [[Legacy:Topics On Mapping|Topics on Mapping]]
* [[Legacy:Brush Hacking|Brush Hacking]] can turn nonsolids into subtractives

==Comments==

'''Dorkorama''' Considering that UnrealEd is dead and only part of its remains were incorporated into LevelDesigner.com , this page, and any others like it if there are any, needs a bit of fleshing out.

'''Tarquin:''' maybe someone should contact LevelDesigner to ask them if they'd like to donate the stuff they're no longer using. Though I doubt they would.

[[Category:Legacy Mapping|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Note</title>
    <id>2279</id>
    <revision>
      <id>5509</id>
      <timestamp>2006-09-02T18:41:50Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| [[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Note (Package: Engine)}}

A &quot;sticky&quot; note.  Level designers can place these in the level and then view them as a batch in the error/warnings window or as individual by reading the Text property.

This actor contains no code and performs no functions beyond that.

==Properties==

===Main===
; string Text : This property holds the text of the note from the Level Designer.

==Discussion==

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]
[[Category:Legacy Class (UT2004)|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5510</id>
      <timestamp>2003-07-29T09:26:33Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox|[[Legacy:UT2003|UT2003]] :: [[Legacy:Actor|Actor]] &gt;&gt; Note (Package: Engine)}}

&quot;A sticky note.  Level designers can place these in the level and then view them as a batch in the error/warnings window.&quot;

[[Category:Legacy Class (UT2003)|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NotifyProperties</title>
    <id>28481</id>
    <revision>
      <id>40182</id>
      <timestamp>2009-11-17T10:54:58Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Novacane</title>
    <id>2276</id>
    <revision>
      <id>5501</id>
      <timestamp>2002-09-21T19:26:27Z</timestamp>
      <contributor>
        <ip>ZxAnPhOrIaN</ip>
      </contributor>
      <comment>Nnnnnnnnnnoooooooooooooooooooo!!!! fourth place! :(</comment>
      <text xml:space="preserve">'''EntropicLqd:''' Welcome to the Wiki ... \o/ I beat Zxan to it :)

'''Tarquin:''' so did I! Hello Novacane.

'''Wormbo:''' Hi Novacane. Welcome to the Wiki and have a nice stay. :)

'''ZxAnPhOrIaN:''' Nnnnnnooooooooooooooooooooooooo... :( Anyway, welcome to the wiki! :) :tup: 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5502</id>
      <timestamp>2002-09-21T11:28:32Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">'''EntropicLqd:''' Welcome to the Wiki ... \o/ I beat Zxan to it :)

'''Tarquin:''' so did I! Hello Novacane.

'''Wormbo:''' Hi Novacane. Welcome to the Wiki and have a nice stay. :)

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Novodex</title>
    <id>2275</id>
    <revision>
      <id>5499</id>
      <timestamp>2005-10-04T16:06:32Z</timestamp>
      <contributor>
        <ip>61.68.241.74</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Novodex is the default physics engine for UnrealEngine3

==Content==

==Links==

The [http://www.ageia.com/novodex.html Official Website]

http://www.novodex.com/downloads.html

There is also [[Legacy:Karma|Karma]] and Havok physics.

----

==Discussion==

'''OlympusMons:''' Didnt really know what to put here so I added the links to the novodex sites.

'''El Muerte:''' you know, there are much more physics engines than just the late Karma and Havok.

'''OlympusMons:''' Yeah I know I just figured those were more relevant to unreal engine development.</text>
    </revision>
    <revision>
      <id>5500</id>
      <timestamp>2005-10-04T14:37:36Z</timestamp>
      <contributor>
        <ip>El Muerte</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Novodex is the default physics engine for UnrealEngine3

==Content==

==Links==

The [http://www.ageia.com/novodex.html Official Website]

http://www.novodex.com/downloads.html

There is also [[Legacy:Karma|Karma]] and Havok physics.

----

==Discussion==

'''OlympusMons:''' Didnt really know what to put here so I added the links to the novodex sites.

'''El Muerte:''' you know, there are much more physics engines than just the late Karma and Havok.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nozomi</title>
    <id>2294</id>
    <revision>
      <id>5539</id>
      <timestamp>2003-10-05T06:41:33Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">==Comments==

'''Dragonmaw:''' Hey welcome to the Wiki!

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5540</id>
      <timestamp>2003-10-05T06:39:25Z</timestamp>
      <contributor>
        <ip>Dragonmaw</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Comments==

'''Dragonmaw:''' Hey welcome to the Wiki!</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nuclear Fuzz Grunge</title>
    <id>2255</id>
    <revision>
      <id>5454</id>
      <timestamp>2004-09-07T23:35:46Z</timestamp>
      <contributor>
        <ip>GRAFIK</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Much appreciation to Tarquin, Mychaeel, Wormbo, Entropic, and 

all the other contributors, who made the Wiki such a great resource.

==For tarquin==

I read on your personal page that you are moving on (presumably to Reality), and, I wanted to let you know that you were a great inspiration to many of us marginal Unrealsters. Unfortunately, most of us are institutionalized, and it is difficult to attack the keyboard properly while wrapped in these infernal white jackets, sedated, and otherwise mentally imobilized. We'll miss your incredible zen, and your indomitable spirit. Good luck in the future. May you face great challenges and adventures and prevail. P.S. I will always remember the Torus-builder, which after propbably millions of aborted attempts, I never could figure out what to do with it. (But is was so cool I added it as a mover to all my levels.)

Also, I have a suggestion: Please don't let Entropic take over Wiki command. His comment, &quot;Mychaeel is like a big scary alien with the brain the size of a planet&quot;, is completely accurate, and causes me terminal anxiety, and, hell, I live on THE OTHER SIDE OF THE EARTH.

As in all Mission Impossible episodes, this message will self-delete in 5 seconds. (If only I had the appropriate RPC protocol.) Sincerely, Nuclear Fuzz Grunge (aka, Nebulous Person)

----

'''Collision detection''' is the process by which the [[Legacy:Unreal Engine|Unreal Engine]] determines whether actors are touching or not, and whether one actor can pass through another.

* Technical overview: [[Legacy:OCD|OCD]].
* [[Legacy:Collision Cylinder|Collision Cylinder]]
* [[Legacy:Actor/Collision|Actor/Collision]], [[Legacy:Actor (UT)/Collision|Actor (UT)/Collision]]: collision properties 
* [[Legacy:Karma|Karma]]

===Discussion===

'''GRAF1K:''' I moved this to your personal page. Please use less offensive titles for your pages.

'''EntropicLqd:''' Heh - no chance of me taking over Wiki command ... I don't have time to significantly contribute to the Wiki at the best of times these days let alone keep an eye on it.  Good to know you are still alive and lurking though.

'''Tarquin:''' don't knwo if you saw, Ent, but I've suggested you as a [[Legacy:Wiki Admin|wiki admin]]. Feel free to refuse though, if you don't feel like it :)  NFG, you say one thing, but then do another. What is the point of &quot;TARQUIN SUCKS&quot; as a page title? You know perfectly well that I check recent changes and I'd notice something anyway. 

==Collision Detection==

===General Introduction ===

&lt;br /&gt;

&lt;table bgColor=&quot;#cccccc&quot;&gt;&lt;tr&gt;&lt;td&gt;One of the most important requirements for 3D game realism and excitement is fast and accurate collision detection, and the need to do so with the maximum efficiency. In a simple simulation, a collision detection check has to be carried out for every time step,...an operation whose computational cost increases almost exponentially with scene complexity.

There has been a great deal of research interest in collision detection and distance computation for 3D interactive graphics and no universally popular algorithm has emerged. A 3D game engine computes interactions between the geometries of the objects in the environment, and, their moving parts and physical properties to simulate physical behaviors. Moving entities and players need to behave like real ones in the physical world, in order to enhance the degree of game realism. However, real time dynamic simulation has been unattainable till recently, due to the absence of efficient, practical collision detection algorithms and fast, accurate dynamics computations.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; 

===BSP Tree Based Collision Detection ===

&lt;br&gt;

&lt;table bgColor=&quot;#cccccc&quot;&gt;&lt;tr&gt;&lt;td&gt;One of the most critical problems when creating a BSP-tree based 3D-engine is collision detection. It is not difficult to solve the collision problem, but, it is difficult to perform with great speed. In the vast majority of FPS games most of the processor time is consumed by performing the necessary collision detection algorithms. Consider an object or player that is moving through the 3D world. It has to be checked against the static Constructive Solid Geometry and against all other objects in the world to see that it does not pass through or interact unrealistically with them. For one player or object this can be done with a slow algorithm at an acceptable frame rate. The problem becomes much more complex when several objects and players interact during the time interval for each real time rendering of the frame. The rendering of the Potential Visible Set (PVS) of the scene has to be done only once for each frame, while collision detection might need to be done an order of magnitude (ten or a hundred times) more often for each frame, depending on the number of objects currently moving in the world. So the collision detection algorithm is required to operate at great speed and accuracy.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

:&lt;i&gt;That's extremely interesting stuff.  Where is it from?  &amp;mdash;[[Legacy:Mychaeel|Mychaeel]]&lt;/i&gt;
:I sort of re-wrote it from an introductory section on BSP Trees that I found at flipcode. Interesting review paper (it was a Thesis Paper) The address is: [http://www.flipcode.com/misc/SamuelRanta-Eskola_BSPTrees.pdf Binary Space Partioning Trees and Polygon Removal in Real Time 3D Rendering]. [[Legacy:Nuclear Fuzz Grunge|NFG]]

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5455</id>
      <timestamp>2004-08-31T06:51:42Z</timestamp>
      <contributor>
        <ip>EntropicLqd</ip>
      </contributor>
      <comment>hello again - it has been a while.</comment>
      <text xml:space="preserve">Much appreciation to Tarquin, Mychaeel, Wormbo, Entropic, and 

all the other contributors, who made the Wiki such a great resource.

==For tarquin==

I read on your personal page that you are moving on (presumably to Reality), and, I wanted to let you know that you were a great inspiration to many of us marginal Unrealsters. Unfortunately, most of us are institutionalized, and it is difficult to attack the keyboard properly while wrapped in these infernal white jackets, sedated, and otherwise mentally imobilized. We'll miss your incredible zen, and your indomitable spirit. Good luck in the future. May you face great challenges and adventures and prevail. P.S. I will always remember the Torus-builder, which after propbably millions of aborted attempts, I never could figure out what to do with it. (But is was so cool I added it as a mover to all my levels.)

Also, I have a suggestion: Please don't let Entropic take over Wiki command. His comment, &quot;Mychaeel is like a big scary alien with the brain the size of a planet&quot;, is completely accurate, and causes me terminal anxiety, and, hell, I live on THE OTHER SIDE OF THE EARTH.

As in all Mission Impossible episodes, this message will self-delete in 5 seconds. (If only I had the appropriate RPC protocol.) Sincerely, Nuclear Fuzz Grunge (aka, Nebulous Person)

==Discussion==

'''GRAF1K:''' I moved this to your personal page. Please use less offensive titles for your pages.

'''EntropicLqd:''' Heh - no chance of me taking over Wiki command ... I don't have time to significantly contribute to the Wiki at the best of times these days let alone keep an eye on it.  Good to know you are still alive and lurking though.

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5456</id>
      <timestamp>2004-08-31T16:18:07Z</timestamp>
      <contributor>
        <username>Tarquin</username>
        <id>3</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Much appreciation to Tarquin, Mychaeel, Wormbo, Entropic, and 

all the other contributors, who made the Wiki such a great resource.

==For tarquin==

I read on your personal page that you are moving on (presumably to Reality), and, I wanted to let you know that you were a great inspiration to many of us marginal Unrealsters. Unfortunately, most of us are institutionalized, and it is difficult to attack the keyboard properly while wrapped in these infernal white jackets, sedated, and otherwise mentally imobilized. We'll miss your incredible zen, and your indomitable spirit. Good luck in the future. May you face great challenges and adventures and prevail. P.S. I will always remember the Torus-builder, which after propbably millions of aborted attempts, I never could figure out what to do with it. (But is was so cool I added it as a mover to all my levels.)

Also, I have a suggestion: Please don't let Entropic take over Wiki command. His comment, &quot;Mychaeel is like a big scary alien with the brain the size of a planet&quot;, is completely accurate, and causes me terminal anxiety, and, hell, I live on THE OTHER SIDE OF THE EARTH.

As in all Mission Impossible episodes, this message will self-delete in 5 seconds. (If only I had the appropriate RPC protocol.) Sincerely, Nuclear Fuzz Grunge (aka, Nebulous Person)

==Discussion==

'''GRAF1K:''' I moved this to your personal page. Please use less offensive titles for your pages.

'''EntropicLqd:''' Heh - no chance of me taking over Wiki command ... I don't have time to significantly contribute to the Wiki at the best of times these days let alone keep an eye on it.  Good to know you are still alive and lurking though.

'''Tarquin:''' don't knwo if you saw, Ent, but I've suggested you as a [[Legacy:Wiki Admin|wiki admin]]. Feel free to refuse though, if you don't feel like it :)  NFG, you say one thing, but then do another. What is the point of &quot;TARQUIN SUCKS&quot; as a page title? You know perfectly well that I check recent changes and I'd notice something anyway. 

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NukeRifle</title>
    <id>2283</id>
    <revision>
      <id>5518</id>
      <timestamp>2003-01-05T21:42:18Z</timestamp>
      <contributor>
        <ip>Electric Mini</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles ===

====NukeRifle ====

&lt;uscript&gt;
//=============================================================================
// NukeRifle
//=============================================================================
class NukeRifle extends ShockRifle;

#exec OBJ LOAD FILE=..\Sounds\WeaponSounds.uax
#exec OBJ LOAD FILE=XEffectMat.utx

function float GetAIRating()
{
	return AIRating;
}

simulated function bool StartFire(int mode)
{
	bWaitForCombo = false;
	return Super.StartFire(mode);
}

function float RangedAttackTime()
{
	return 0;
}

/* BestMode()
choose between regular or alt-fire
*/
function byte BestMode()
{
	return 0;
}

defaultproperties
{
    bCanThrow=false
	AIRating=+1.0
	
    FireModeClass(0)=NukeRifleFire
    FireModeClass(1)=NukeRifleFire
    InventoryGroup=4
    ItemName=&quot;Nuke Rifle&quot;
    PickupClass=class'NukeRiflePickup'
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NukeRifleFire</title>
    <id>2284</id>
    <revision>
      <id>5519</id>
      <timestamp>2007-11-19T17:03:27Z</timestamp>
      <contributor>
        <ip>Sweavo</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles ===

====NukeRifleFire ====

&lt;uscript&gt;
class NukeRifleFire extends ShockBeamFire;

var() int Damage; // per wave
var() float MomentumTransfer; // per wave
var() float DamageRadius; // of final wave

function DoTrace(Vector Start, Rotator Dir)
{
	local Vector X;
	
	X = vector(Dir);
	TracePart(Start,Start+X*TraceRange,X,Dir,Instigator);
}	

function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
	local NukeRifleProjectile Mushroom_cloud;

    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        //if ( !Other.bWorldGeometry )
        //{
            HitNormal = Vect(0,0,0);
            //if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; Weapon.IsA('NukeRifle') )
			//	TracePart(HitLocation,End,X,Dir,Pawn(Other));
        //}
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
	SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
	if( Instigator.bDeleteMe != true )
		Mushroom_cloud = Spawn(class'my_mod2.NukeRifleProjectile',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);                      
}

function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShockBeamEffect Beam;
    
    if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
		Beam = Spawn(class'BlueSuperShockBeam',,, Start, Dir);
	else
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
    if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
    Beam.AimAt(HitLocation, HitNormal);
}

defaultproperties
{
    AmmoClass=class'SuperShockAmmo'
    AmmoPerFire=0
    DamageType=class'my_mod2.DamTypeNukeRifle'
    DamageMin=500
    DamageMax=500
	Momentum=70000
    FireSound=Sound'WeaponSounds.instagib_rifleshot'
    FireForce=&quot;ShockRifleFire&quot;  
    bReflective=true
    FireRate=1.5
	BeamEffectClass=class'SuperShockBeamEffect'
	bModeExclusive=true
    AimError=700
}
&lt;/uscript&gt;

==Discussion==

'''SuperApe:''' Needs class page markup, reguardless.  Needs linkage.  Which version is this for?

'''sweavo:''' in my opinion this should be deleted, unless the author's around and happy to post a zip file with the textures etc in it.

----

[[:Category:Legacy To Do]]  &amp;ndash; See Discussion above.
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5520</id>
      <timestamp>2005-12-22T18:13:41Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <comment>I see, custom class.</comment>
      <text xml:space="preserve">===NukeRifles ===

====NukeRifleFire ====

&lt;uscript&gt;
class NukeRifleFire extends ShockBeamFire;

var() int Damage; // per wave
var() float MomentumTransfer; // per wave
var() float DamageRadius; // of final wave

function DoTrace(Vector Start, Rotator Dir)
{
	local Vector X;
	
	X = vector(Dir);
	TracePart(Start,Start+X*TraceRange,X,Dir,Instigator);
}	

function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored)
{
    local Vector HitLocation, HitNormal;
    local Actor Other;
	local NukeRifleProjectile Mushroom_cloud;

    Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true);

    if ( (Other != None) &amp;&amp; (Other != Ignored) )
    {
        //if ( !Other.bWorldGeometry )
        //{
            HitNormal = Vect(0,0,0);
            //if ( (Pawn(Other) != None) &amp;&amp; (HitLocation != Start) &amp;&amp; Weapon.IsA('NukeRifle') )
			//	TracePart(HitLocation,End,X,Dir,Pawn(Other));
        //}
    }
    else
    {
        HitLocation = End;
        HitNormal = Vect(0,0,0);
    }
	SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0);
	if( Instigator.bDeleteMe != true )
		Mushroom_cloud = Spawn(class'my_mod2.NukeRifleProjectile',Instigator,, HitLocation - (100*Normal(HitLocation - Start)) , Dir);                      
}

function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum)
{
    local ShockBeamEffect Beam;
    
    if ( (Instigator.PlayerReplicationInfo.Team != None) &amp;&amp; (Instigator.PlayerReplicationInfo.Team.TeamIndex == 1) )
		Beam = Spawn(class'BlueSuperShockBeam',,, Start, Dir);
	else
		Beam = Spawn(BeamEffectClass,,, Start, Dir);
    if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start
    Beam.AimAt(HitLocation, HitNormal);
}

defaultproperties
{
    AmmoClass=class'SuperShockAmmo'
    AmmoPerFire=0
    DamageType=class'my_mod2.DamTypeNukeRifle'
    DamageMin=500
    DamageMax=500
	Momentum=70000
    FireSound=Sound'WeaponSounds.instagib_rifleshot'
    FireForce=&quot;ShockRifleFire&quot;  
    bReflective=true
    FireRate=1.5
	BeamEffectClass=class'SuperShockBeamEffect'
	bModeExclusive=true
    AimError=700
}
&lt;/uscript&gt;

==Discussion==

'''SuperApe:''' Needs class page markup, reguardless.  Needs linkage.  Which version is this for?

----

[[:Category:Legacy Custom Class]]

[[:Category:Legacy To Do]]  &amp;ndash; See Discussion above.
[[Category:Legacy Custom Class|{{PAGENAME}}]]
[[Category:Legacy To Do|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NukeRiflePickup</title>
    <id>2285</id>
    <revision>
      <id>5521</id>
      <timestamp>2003-01-05T21:46:08Z</timestamp>
      <contributor>
        <ip>Electric Mini</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles ===

====NukeRiflePickup ====

&lt;uscript&gt;
//=============================================================================
// NukeRiflePickup
//=============================================================================
class NukeRiflePickup extends UTWeaponPickup;

defaultproperties
{ 
    InventoryType=class'NukeRifle'

    PickupMessage=&quot;Oh my god... you got a NUKE Rifle! Go have some fun!&quot;
    PickupSound=Sound'PickupSounds.ShockRiflePickup'
    PickupForce=&quot;ShockRiflePickup&quot;  // jdf

	MaxDesireability=+0.65

    StaticMesh=StaticMesh'WeaponStaticMesh.ShockRiflePickup'
    DrawType=DT_StaticMesh
    DrawScale=0.75
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NukeRifleProjectile</title>
    <id>2282</id>
    <revision>
      <id>5517</id>
      <timestamp>2003-01-05T21:35:12Z</timestamp>
      <contributor>
        <ip>Electric Mini</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles ===

====NukeRifleProjectile ====

&lt;uscript&gt;
//=============================================================================
// Nukerifle projectile, gets spawned instantly on whatever gets hit
//=============================================================================
class NukeRifleProjectile extends Projectile;


// camera shakes //
var() vector ShakeRotMag;           // how far to rot view
var() vector ShakeRotRate;          // how fast to rot view
var() float  ShakeRotTime;          // how much time to rot the instigator's view
var() vector ShakeOffsetMag;        // max view offset vertically
var() vector ShakeOffsetRate;       // how fast to offset view vertically
var() float  ShakeOffsetTime;       // how much time to offset view
var bool bExploded;

simulated function Destroyed() 
{
	Super.Destroyed();
}

simulated function PostBeginPlay()
{
	local vector Dir;
	
	if ( bDeleteMe || IsInState('Dying') )
		return;
		
	Dir = vector(Rotation);
	Velocity = speed * Dir;
}

event bool EncroachingOn( actor Other )
{
	if ( Other.bWorldGeometry )
		return true;
		
	return false;
}
simulated function ProcessTouch (Actor Other, Vector HitLocation)
{
	if ( Other != instigator ) 
		Explode(HitLocation,Vect(0,0,1));
}

simulated function Explode(vector HitLocation, vector HitNormal) 
{
	BlowUp(HitLocation);
}

simulated function PhysicsVolumeChange( PhysicsVolume Volume )
{
}

simulated function Landed( vector HitNormal )
{
	BlowUp(Location);
}

simulated function HitWall(vector HitNormal, actor Wall)
{
	BlowUp(Location);
}

function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, 
							Vector momentum, class&lt;DamageType&gt; damageType) 
{
	if ( Damage &gt; 0 )
	{
		BlowUp(Location);
	}
}

simulated event FellOutOfWorld(eKillZType KillType)
{
	BlowUp(Location);
}	

function BlowUp(vector HitLocation)
{
    Spawn(class'RedeemerExplosion',,, HitLocation - 100 * Normal(Velocity), Rot(0,16384,0));
	MakeNoise(1.0);
	SetPhysics(PHYS_None);
	bHidden = true;
    GotoState('Dying'); 
}

state Dying
{
	function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, 
							Vector momentum, class&lt;DamageType&gt; damageType) {}
							
    function BeginState()
    {
		bHidden = true;
		SetPhysics(PHYS_None);
		SetCollision(false,false,false);
		if ( !bExploded )
		{
			Spawn(class'IonCore',,, Location, Rotation);
			ShakeView();
		}
		InitialState = 'Dying';
    }

    function ShakeView()
    {
        local Controller C;
        local PlayerController PC;
        local float Dist, Scale;

        for ( C=Level.ControllerList; C!=None; C=C.NextController )
        {
            PC = PlayerController(C);
            if ( PC != None &amp;&amp; PC.ViewTarget != None )
            {
                Dist = VSize(Location - PC.ViewTarget.Location);
                if ( Dist &lt; DamageRadius * 2.0)
                {
                    if (Dist &lt; DamageRadius)
                        Scale = 1.0;
                    else
                        Scale = (DamageRadius*2.0 - Dist) / (DamageRadius);
                    C.ShakeView(ShakeRotMag*Scale, ShakeRotRate, ShakeRotTime, ShakeOffsetMag*Scale, ShakeOffsetRate, ShakeOffsetTime);
                }
            }
        }
    }

Begin:
    PlaySound(sound'WeaponSounds.redeemer_explosionsound');
    HurtRadius(Damage, DamageRadius*0.125, MyDamageType, MomentumTransfer, Location);
    Sleep(0.5);
    HurtRadius(Damage, DamageRadius*0.300, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.475, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.650, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*0.825, MyDamageType, MomentumTransfer, Location);
    Sleep(0.2);
    HurtRadius(Damage, DamageRadius*1.000, MyDamageType, MomentumTransfer, Location);
    Destroy();
}

defaultproperties
{
    bNetTemporary=false

//    DrawType=DT_StaticMesh
//    StaticMesh=StaticMesh'WeaponStaticMesh.RedeemerMissile'
    DrawScale=0.5
    AmbientGlow=96
    bUnlit=false

    bDynamicLight=true
    LightType=LT_Steady
    LightEffect=LE_QuadraticNonIncidence
    LightBrightness=255
    LightHue=28
    LightRadius=6

    ForceType=FT_DragAlong
    ForceScale=5.0
    ForceRadius=100.0

    Damage=200.0
    DamageRadius=1500.0
    MomentumTransfer=100000
    MyDamageType=class'my_mod2.DamTypeNukeRifle'


    bCollideActors=true
    bCollideWorld=true
    CollisionHeight=12.0
    CollisionRadius=12.0

    ShakeRotMag=(Z=250)
    ShakeRotRate=(Z=2500)
    ShakeRotTime=6
    ShakeOffsetMag=(Z=10)
    ShakeOffsetRate=(Z=200)
    ShakeOffsetTime=10
    
	bProjTarget=true
    speed=200
    MaxSpeed=500

    bBounce=false
    bFixedRotationDir=True
    RotationRate=(Roll=50000)
    DesiredRotation=(Roll=30000)
    
    TransientSoundVolume=1.0
    TransientSoundRadius=5000.0
}
&lt;/uscript&gt;</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NukeRifles Code</title>
    <id>2286</id>
    <revision>
      <id>5522</id>
      <timestamp>2003-01-09T00:22:19Z</timestamp>
      <contributor>
        <ip>Electric Mini</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">===NukeRifles Arena Mutator code ===

Warning! The code below is a rather gross hack, I'm still just learning how UnrealScript works. So go easy on me, eh?  ;-)

'''Electric Mini'''

&lt;br /&gt;Modified files
;* MutNukeRifles.uc
::based on MutInstaGib, extends [[Legacy:Mutator|Mutator]]. Replaces weapon pickups with NukeRiflePickups
;* NukeRifle.uc
::based on SuperShockRifle, extends ShockRifle.
;* NukeRifleFire.uc
::based on SuperShockBeamFire, extends ShockBeamFire.
;* NukeRiflePickup.uc
::based on ShockRiflePickup, extends UTWeaponPickup
;* NukeRifleProjectile.uc
::based on RedeemerProjectile, extends Projectile

----

'''Dma:''' This might work better on a subpage of [[Legacy:Electric Mini|Electric Mini]].

'''Mychaeel:''' Hmm.  I appreciate the notion of sharing code, but the Unreal Wiki isn't meant to be a repository for the source code of entire mod projects.  Maybe the best idea to zip the individual sources up and link the archive from here.  (We can host that .zip file here.)  *bump*

'''Electric Mini''' Ooops... sorry 'bout that. I'll get onto making a .zip archive instead. Probably be a good idea for me to tidy up some bits of the code too.</text>
    </revision>
    <revision>
      <id>5523</id>
      <timestamp>2003-01-06T10:15:00Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>What now?</comment>
      <text xml:space="preserve">===NukeRifles Arena Mutator code ===

Warning! The code below is a rather gross hack, I'm still just learning how UnrealScript works. So go easy on me, eh?  ;-)

'''Electric Mini'''

&lt;br /&gt;Modified files
;* [[Legacy:MutNukeRifles|MutNukeRifles.uc]]
::based on MutInstaGib, extends [[Legacy:Mutator|Mutator]]. Replaces weapon pickups with [[Legacy:NukeRiflePickup|NukeRiflePickups]]
;* [[Legacy:NukeRifle|NukeRifle.uc]]
::based on SuperShockRifle, extends ShockRifle.
;* [[Legacy:NukeRifleFire|NukeRifleFire.uc]]
::based on SuperShockBeamFire, extends ShockBeamFire.
;* [[Legacy:NukeRiflePickup|NukeRiflePickup.uc]]
::based on ShockRiflePickup, extends UTWeaponPickup
;* [[Legacy:NukeRifleProjectile|NukeRifleProjectile.uc]]
::based on RedeemerProjectile, extends Projectile

----

'''Dma:''' This might work better on a subpage of [[Legacy:Electric Mini|Electric Mini]].

'''Mychaeel:''' Hmm.  I appreciate the notion of sharing code, but the Unreal Wiki isn't meant to be a repository for the source code of entire mod projects.  Maybe the best idea to zip the individual sources up and link the archive from here.  (We can host that .zip file here.)</text>
    </revision>
    <revision>
      <id>5524</id>
      <timestamp>2003-01-07T06:47:49Z</timestamp>
      <contributor>
        <ip>Mychaeel</ip>
      </contributor>
      <comment>*bump*</comment>
      <text xml:space="preserve">===NukeRifles Arena Mutator code ===

Warning! The code below is a rather gross hack, I'm still just learning how UnrealScript works. So go easy on me, eh?  ;-)

'''Electric Mini'''

&lt;br /&gt;Modified files
;* [[Legacy:MutNukeRifles|MutNukeRifles.uc]]
::based on MutInstaGib, extends [[Legacy:Mutator|Mutator]]. Replaces weapon pickups with [[Legacy:NukeRiflePickup|NukeRiflePickups]]
;* [[Legacy:NukeRifle|NukeRifle.uc]]
::based on SuperShockRifle, extends ShockRifle.
;* [[Legacy:NukeRifleFire|NukeRifleFire.uc]]
::based on SuperShockBeamFire, extends ShockBeamFire.
;* [[Legacy:NukeRiflePickup|NukeRiflePickup.uc]]
::based on ShockRiflePickup, extends UTWeaponPickup
;* [[Legacy:NukeRifleProjectile|NukeRifleProjectile.uc]]
::based on RedeemerProjectile, extends Projectile

----

'''Dma:''' This might work better on a subpage of [[Legacy:Electric Mini|Electric Mini]].

'''Mychaeel:''' Hmm.  I appreciate the notion of sharing code, but the Unreal Wiki isn't meant to be a repository for the source code of entire mod projects.  Maybe the best idea to zip the individual sources up and link the archive from here.  (We can host that .zip file here.)  *bump*</text>
    </revision>
  </page>
  <page>
    <title>Legacy:NullAmmo</title>
    <id>28624</id>
    <revision>
      <id>40480</id>
      <timestamp>2010-01-14T08:55:05Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>missing legacy class</comment>
      <text xml:space="preserve">{{missing legacy class}}</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nvidia Texture Tools</title>
    <id>2304</id>
    <revision>
      <id>5561</id>
      <timestamp>2006-11-28T18:38:07Z</timestamp>
      <contributor>
        <ip>Fyfe</ip>
      </contributor>
      <minor/>
      <comment>Changed link to point at Unreal Engine Versions/3</comment>
      <text xml:space="preserve">The NVIDIA Texture Tools are a collection of useful texture manipulation tools.

==Photoshop DDS Plugin==

This plugin allowes Adobe Photoshop and other applications that can use Photoshop-compatible plugins to open and save .DDS files. The download for this plugin also contains one for creating &quot;normal maps&quot; from height map bitmaps, which might be interesting for modding games based on the [[Legacy:Unreal Engine Versions/3|third generation Unreal Engine]].

==3D Studio Max DDS Plugins==

These plugins allow [[Legacy:3D Studio Max|3D Studio Max]] to read .DDS files. The download includes plugins for 3D Studio Max 3, 4 and 5, as well as source code for the latest version.

==External Links==
* [http://developer.nvidia.com/object/nv_texture_tools.html NVIDIA Texture Tools]

==Related Topics==
* [[Legacy:DXT|DXT]]
* [[Legacy:Graphics Application|Graphics Application]]

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5562</id>
      <timestamp>2004-11-24T14:26:21Z</timestamp>
      <contributor>
        <username>Wormbo</username>
        <id>2</id>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">The NVIDIA Texture Tools are a collection of useful texture manipulation tools.

==Photoshop DDS Plugin==

This plugin allowes Adobe Photoshop and other applications that can use Photoshop-compatible plugins to open and save .DDS files. The download for this plugin also contains one for creating &quot;normal maps&quot; from height map bitmaps, which might be interesting for modding games based on the third generation [[Legacy:Unreal Engine|Unreal Engine]].

==3D Studio Max DDS Plugins==

These plugins allow [[Legacy:3D Studio Max|3D Studio Max]] to read .DDS files. The download includes plugins for 3D Studio Max 3, 4 and 5, as well as source code for the latest version.

==External Links==
* [http://developer.nvidia.com/object/nv_texture_tools.html NVIDIA Texture Tools]

==Related Topics==
* [[Legacy:DXT|DXT]]
* [[Legacy:Graphics Application|Graphics Application]]

[[Category:Legacy Application|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:Nytrogen</title>
    <id>2290</id>
    <revision>
      <id>5531</id>
      <timestamp>2006-01-05T03:41:32Z</timestamp>
      <contributor>
        <ip>SuperApe</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">Nytrogen is a design studio in Sydney, Australia. We specialise in graphic design and illustration.

You can view our portfolio or contact  us through our Agent at Wild Rascailles.

just email: rascals@wildrascailles.com

==Discussion==

'''SuperApe:''' Chongqing fodder?  Or Personal Page?

----</text>
    </revision>
    <revision>
      <id>5532</id>
      <timestamp>2004-04-04T21:49:33Z</timestamp>
      <contributor>
        <ip>Adsl-35-234.swiftdsl.com.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Nytrogen is a design studio in Sydney, Australia. We specialise in graphic design and illustration.

You can view our portfolio or contact  us through our Agent at Wild Rascailles.

just email: rascals@wildrascailles.com</text>
    </revision>
  </page>
  <page>
    <title>Legacy:O-GL</title>
    <id>2344</id>
    <revision>
      <id>5645</id>
      <timestamp>2005-12-05T15:57:45Z</timestamp>
      <contributor>
        <ip>OGL</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==O-GL ==

'''Name: Joshua Beattie'''

'''DoB: 1/8/81 '''

'''Location:''' Perth, Australia

'''E-Mail:''' joshuabeattie1@hotmail.com

'''MSN:''' joshuabeattie1@hotmail.com

'''CPU:''' AMD64 3200 @ 2.45Ghz. 

'''Graphics Card:''' GeForce 6600GT.

'''Fav Game:''' UT2004 instagib.

----

==MyWiki Stuff:  ==

'''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Desperado2185]]:''' This is the mod I'm working on &amp;ndash; not updated for ages although alot of work has been done on an integrated netcode, database, replay, and karma physics system.

'''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]:''' This is my Journal.

----

==Comments: ==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5646</id>
      <timestamp>2005-06-28T05:09:40Z</timestamp>
      <contributor>
        <ip>203-59-176-69.dyn.iinet.net.au</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==O-GL ==

'''Name: Joshua Beattie'''

'''Age: 23 '''

'''Location:''' Perth, Australia

'''E-Mail:''' joshuabeattie1@hotmail.com

'''MSN:''' joshuabeattie1@hotmail.com

'''CPU:''' AMD64 3200 @ 2.45Ghz. 

'''Graphics Card:''' GeForce 6600GT.

'''Fav Game:''' UT2004 instagib.

----

==MyWiki Stuff:  ==

'''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Desperado2185]]:''' This is the mod I'm working on &amp;ndash; not updated for ages although alot of work has been done on an integrated netcode, database, replay, and karma physics system.

'''[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}/Developer_Journal]]:''' This is my not-used Journal.

----

==Comments: ==

[[Category:Legacy Personal Page|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:O-GL/Desperado2185</title>
    <id>2345</id>
    <revision>
      <id>5647</id>
      <timestamp>2006-03-22T04:30:00Z</timestamp>
      <contributor>
        <ip>EricBlade</ip>
      </contributor>
      <comment>* question about displaying player model in sp</comment>
      <text xml:space="preserve">==Desperado2185 ==

'''Desperado2185''' is a fps shooter game set on another planet and in the future.  The planet is newly colonized so it has wierd things crossing between western and futuristic such as robotic horses.  It started out in January as part of a Gaming and Puppetry Course at the [http://www.fti.asn.au/ Film &amp; Telivision Institute].  It was basically me and 3 artists, one of whom decided to use the UT2003 engine because it seemed like it had alot of support....  Anyway, it took me a fair while to change over from c++ apps and start learning mods!

The guy which came up with the concept for the game had a very rough singleplayer script, with optional multiplayer deathmatch support later.  I tried to understand and implement replication fairly early on, but I didn't understand some concepts of it back then and therefore my multiplayer progress was very slow compared to singleplayer code progress.  The multiplayer aspect sorta went by the wayside when I realised there was a whole lot more I needed to learn about multiplayer in general.  I felt I needed to disregard all current multiplayer design progression and figure it out on my own :s ... but that would take time, so I left it until after I had implemented the singleplayer script.

==Desperado2185 Singleplayer ==

The singleplayer project ended sometime in August, and was quite dodgy, if I do say so myself.  Basically, we have this town, and you have to go through it talking to people and stuff in order to get a train ticket out of the town in a certain time limit.  The main problem with it, was that the character interaction was done with scripted sequences.  I spent a hell of a lot of time modifying the unreal scripted sequence code to support things such as choices when talking to characters and handing inventory items to them (which in turn creates different choices for the user).  I now realise that scripted sequences are NOT the way of the future ... the complexity can get too high and as such the interactivity is limited.  In the end, I ran out of time tracking down branching errors in the source code that I basically got one interaction with one character done &amp;ndash; and I couldn't be bothered with scripted sequences anymore.  I think the way of the future is AI characters that have specified knowledge and abilities ... can some1 take some time-out to make an AI SDK plz!? lol

Some of the better things I had completed by August were: 

====1. Realistic hovering vehicle simulation code.====

Ok, let me start by saying this isn't complete ... its just cool.  Like .. I had it working back then, but I had some bob, so I reworked it and now its buggered and waiting for me to finish it off :P.  Let me tell you something though, it was a great learning experience and hacks can't substitute for real hover code!  What I mean by this is you have to hover by only applying force and without knowing your mass.  Name any game except maybe UT2004's repulsors and I doubt they have done it hack free.  Have a look at the hover vehicle in the halflife2 vids for an example of unrealistic hover code.

====2. New player movement/animation code.====

In our singleplayer map, we have a saloon.  Our modeller likes the karma stuff and experimented with some karma swinging saloon doors.  One problem was that the unreal pawn physics cannot push the door to walk through it.  To solve this problem, I spawned a bulldog tire, set pawn PHYS_None and SetLocation(BulldogTire.Location) and then you have new pawn physics.  Next was the control code to make sure it moves like a pawn, and then the more confusing part for me was to find out which direction you are moving relative to your rotation and then play the appropriate animation.  Prolly the trickiest animation was the jump because you needa make sure that you can only jump once while in air.  One of the annoying things about doing all that work was that ... perhaps a month after I'd done it, Steven Polge surprisingly released the native animation/movement code on the epic mailing list which was like 10x more efficiently-coded than mine ... and therefore, probably runs 200x faster :).  Even though I was glad to see the simplicity of their code, I still kept mine because I can't bring myself to delete it somehow lol ....

====3. Realistic physics for player interaction to objects such as doors and pickups.====

Made it so u can carry objects around with certain tags.  The l33t3st thing about the singleplayer aspect of the mod for me is the doors.  Gone are the days of magically moving, robotic doors, my friend.  Say hello to Karma doors.  What you do is bump into a door and it moves ... wow!  When looking at a door you can either &quot;push&quot; [LMB] or pull [RMB] ... wow!  When the door angle is within its lock angle either &quot;push&quot; or &quot;pull&quot; will change to &quot;lock door&quot; ... wow!  When a looking at a locked door, it checks your inventory for the key required to unlock the door.  If you have the key, a mouse button will say &quot;unlock door&quot;.  If not, &quot;you need a key&quot;.  Pretty good?

====4. New weapon projectile system.====

I know its not much but I re-did the weapon fire design to make all shots projectile shots and redid most of the weapon fire classes.  The projectile system works similar to the rail gun in Q3.  Whatever your cursor is on, you will hit, if it is a one trace shot.  If a slow moving projectile thats not instant hit, the projectile will hit things along the way from the tip of the gun.  However, the rail can theoretically go through things along the path from the gun tip to the cursor's destination.  So, what I have basically done, is the shot goes from the 'camera', finds the hit location, and then the projectile goes from gun tip to that hit location.  That way you always hit what the 'camera' is looking at, unlike other games such as Troopers where what you hit is what the 'gun' is looking at, not what the camera is looking at.  I have found UT2003 is very strange because their weapons vary wildly ... some will use the camera, some will use the camera with the projectile coming from the camera, some will use the gun aim, and some just seem to have aim positions based on other things.

====5. New inventory system.====

Our game required 2 slots for guns and 8 slots for pickup items.  I didn't spend much time trying to use the UT2003 system because it seemed like it was going to be complicated to use.   I just made two arrays of class pickups [2] and [8] in Pawn which makes things quicker/easier to access.  When the pickup detects a Pawn touching itself, it attemps to get the Pawn to add itself to the appropriate array.  If so, it disables collision detection and the Pawn attaches the mesh to one of his bones.  Btw, our player model is visible so you can look down and see your feet etc.  This seems to give a more realistic view and helps make weapon creation easier because you dont have to make a separate FP mesh placed in the right position.  Making the player mesh visible requires the modeller to place a bone for the camera to set its location to.  The modeller also creates an animation going between looking up and looking down so that the 10 UU wide camera doesn't clip the player model.

====6. 3D Hud.====

My hardcore modeller friend, Gareth, (who left the team June/July to do other stuff) is a real frames/detail nut.  I told him how slow drawing to the canvas is (the default ut2003 hud can take you from 280 to 210 fps), we decided to go full 3d hud.  This guy loves UT2003 static meshes and antiportals and went full on hardcore and converted our 2d hud pic into 3d with a massive 500 or so polys staticmesh.  We dont use drawactor either because that has a slight decrease in fps.  Just have to make sure that other players dont see a flying hud by making it not replicated.

==Desperado2185 Multiplayer ==

This is what I've been working on since August.  I'm not sure if I should say my ideas here since I'm not sure they're going to work :S.

==Comments ==

'''O-GL:''' Btw, if anyone wants source code ... tell me the most important things you want and I'll make a tut page for it instead of wasting my time playing starcraft :D.

'''Foxpaw:''' 280 fps! Eek, my computer only runs UT2003 at about 20 fps. :( One issue that I could foresee with having a 3D HUD like that is - how do you update the values on it? If you use a scripted texture to do it, you forego all compatibility with Max, Linux, and PC boxes not running Direct3D.

'''O-GL:''' Thats 280 fps looking at corner wall in a simple map, Deathmatch, all details lowest, and no weapon visible.  Updating values was first done with placing a very small 3d version of an item in the appropriate position ... but that was canned due to many annoying problems. We ended up placing thumbnail pics on the Canvas in the appropriate place instead.  

'''EricBlade:''' I would be very interested in talking with you a bit more about having the player model in view in SP.. thats something i was just toying around with yesterday, and obviously you've figured out a way to defeat the obvious problems that crop when just turning the option on :)</text>
    </revision>
    <revision>
      <id>5648</id>
      <timestamp>2003-11-15T06:37:59Z</timestamp>
      <contributor>
        <ip>O-GL</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">==Desperado2185 ==

'''Desperado2185''' is a fps shooter game set on another planet and in the future.  The planet is newly colonized so it has wierd things crossing between western and futuristic such as robotic horses.  It started out in January as part of a Gaming and Puppetry Course at the [http://www.fti.asn.au/ Film &amp; Telivision Institute].  It was basically me and 3 artists, one of whom decided to use the UT2003 engine because it seemed like it had alot of support....  Anyway, it took me a fair while to change over from c++ apps and start learning mods!

The guy which came up with the concept for the game had a very rough singleplayer script, with optional multiplayer deathmatch support later.  I tried to understand and implement replication fairly early on, but I didn't understand some concepts of it back then and therefore my multiplayer progress was very slow compared to singleplayer code progress.  The multiplayer aspect sorta went by the wayside when I realised there was a whole lot more I needed to learn about multiplayer in general.  I felt I needed to disregard all current multiplayer design progression and figure it out on my own :s ... but that would take time, so I left it until after I had implemented the singleplayer script.

==Desperado2185 Singleplayer ==

The singleplayer project ended sometime in August, and was quite dodgy, if I do say so myself.  Basically, we have this town, and you have to go through it talking to people and stuff in order to get a train ticket out of the town in a certain time limit.  The main problem with it, was that the character interaction was done with scripted sequences.  I spent a hell of a lot of time modifying the unreal scripted sequence code to support things such as choices when talking to characters and handing inventory items to them (which in turn creates different choices for the user).  I now realise that scripted sequences are NOT the way of the future ... the complexity can get too high and as such the interactivity is limited.  In the end, I ran out of time tracking down branching errors in the source code that I basically got one interaction with one character done &amp;ndash; and I couldn't be bothered with scripted sequences anymore.  I think the way of the future is AI characters that have specified knowledge and abilities ... can some1 take some time-out to make an AI SDK plz!? lol

Some of the better things I had completed by August were: 

====1. Realistic hovering vehicle simulation code.====

Ok, let me start by saying this isn't complete ... its just cool.  Like .. I had it working back then, but I had some bob, so I reworked it and now its buggered and waiting for me to finish it off :P.  Let me tell you something though, it was a great learning experience and hacks can't substitute for real hover code!  What I mean by this is you have to hover by only applying force and without knowing your mass.  Name any game except maybe UT2004's repulsors and I doubt they have done it hack free.  Have a look at the hover vehicle in the halflife2 vids for an example of unrealistic hover code.

====2. New player movement/animation code.====

In our singleplayer map, we have a saloon.  Our modeller likes the karma stuff and experimented with some karma swinging saloon doors.  One problem was that the unreal pawn physics cannot push the door to walk through it.  To solve this problem, I spawned a bulldog tire, set pawn PHYS_None and SetLocation(BulldogTire.Location) and then you have new pawn physics.  Next was the control code to make sure it moves like a pawn, and then the more confusing part for me was to find out which direction you are moving relative to your rotation and then play the appropriate animation.  Prolly the trickiest animation was the jump because you needa make sure that you can only jump once while in air.  One of the annoying things about doing all that work was that ... perhaps a month after I'd done it, Steven Polge surprisingly released the native animation/movement code on the epic mailing list which was like 10x more efficiently-coded than mine ... and therefore, probably runs 200x faster :).  Even though I was glad to see the simplicity of their code, I still kept mine because I can't bring myself to delete it somehow lol ....

====3. Realistic physics for player interaction to objects such as doors and pickups.====

Made it so u can carry objects around with certain tags.  The l33t3st thing about the singleplayer aspect of the mod for me is the doors.  Gone are the days of magically moving, robotic doors, my friend.  Say hello to Karma doors.  What you do is bump into a door and it moves ... wow!  When looking at a door you can either &quot;push&quot; [LMB] or pull [RMB] ... wow!  When the door angle is within its lock angle either &quot;push&quot; or &quot;pull&quot; will change to &quot;lock door&quot; ... wow!  When a looking at a locked door, it checks your inventory for the key required to unlock the door.  If you have the key, a mouse button will say &quot;unlock door&quot;.  If not, &quot;you need a key&quot;.  Pretty good?

====4. New weapon projectile system.====

I know its not much but I re-did the weapon fire design to make all shots projectile shots and redid most of the weapon fire classes.  The projectile system works similar to the rail gun in Q3.  Whatever your cursor is on, you will hit, if it is a one trace shot.  If a slow moving projectile thats not instant hit, the projectile will hit things along the way from the tip of the gun.  However, the rail can theoretically go through things along the path from the gun tip to the cursor's destination.  So, what I have basically done, is the shot goes from the 'camera', finds the hit location, and then the projectile goes from gun tip to that hit location.  That way you always hit what the 'camera' is looking at, unlike other games such as Troopers where what you hit is what the 'gun' is looking at, not what the camera is looking at.  I have found UT2003 is very strange because their weapons vary wildly ... some will use the camera, some will use the camera with the projectile coming from the camera, some will use the gun aim, and some just seem to have aim positions based on other things.

====5. New inventory system.====

Our game required 2 slots for guns and 8 slots for pickup items.  I didn't spend much time trying to use the UT2003 system because it seemed like it was going to be complicated to use.   I just made two arrays of class pickups [2] and [8] in Pawn which makes things quicker/easier to access.  When the pickup detects a Pawn touching itself, it attemps to get the Pawn to add itself to the appropriate array.  If so, it disables collision detection and the Pawn attaches the mesh to one of his bones.  Btw, our player model is visible so you can look down and see your feet etc.  This seems to give a more realistic view and helps make weapon creation easier because you dont have to make a separate FP mesh placed in the right position.  Making the player mesh visible requires the modeller to place a bone for the camera to set its location to.  The modeller also creates an animation going between looking up and looking down so that the 10 UU wide camera doesn't clip the player model.

====6. 3D Hud.====

My hardcore modeller friend, Gareth, (who left the team June/July to do other stuff) is a real frames/detail nut.  I told him how slow drawing to the canvas is (the default ut2003 hud can take you from 280 to 210 fps), we decided to go full 3d hud.  This guy loves UT2003 static meshes and antiportals and went full on hardcore and converted our 2d hud pic into 3d with a massive 500 or so polys staticmesh.  We dont use drawactor either because that has a slight decrease in fps.  Just have to make sure that other players dont see a flying hud by making it not replicated.

==Desperado2185 Multiplayer ==

This is what I've been working on since August.  I'm not sure if I should say my ideas here since I'm not sure they're going to work :S.

==Comments ==

'''O-GL:''' Btw, if anyone wants source code ... tell me the most important things you want and I'll make a tut page for it instead of wasting my time playing starcraft :D.

'''Foxpaw:''' 280 fps! Eek, my computer only runs UT2003 at about 20 fps. :( One issue that I could foresee with having a 3D HUD like that is - how do you update the values on it? If you use a scripted texture to do it, you forego all compatibility with Max, Linux, and PC boxes not running Direct3D.

'''O-GL:''' Thats 280 fps looking at corner wall in a simple map, Deathmatch, all details lowest, and no weapon visible.  Updating values was first done with placing a very small 3d version of an item in the appropriate position ... but that was canned due to many annoying problems. We ended up placing thumbnail pics on the Canvas in the appropriate place instead.</text>
    </revision>
  </page>
  <page>
    <title>Legacy:O-GL/Developer Journal</title>
    <id>2346</id>
    <revision>
      <id>5649</id>
      <timestamp>2005-12-05T15:50:58Z</timestamp>
      <contributor>
        <ip>OGL</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| 17th November, 2003}}

Today, I started implementing my network flow design more and came to a few conclusions and solidified my design more.  I'll write my thoughts about '''instant shots''' and clients '''moving instantly''' vs clients that have a '''full ping movement delay'''.

'''Instant movement''' problems: 1. That all clients see all the other client positions behind the server by server-to-client time.  2. The client that made the move is ahead of the server by client-to-server time.

'''Delayed movement''' has problem #1 but not #2.

-

Ok, if you want to apply '''instant shot''' to any of these ways of movement you have to apply certain tricks.

Required with instant movement:  

1.  Server needs to rewind world reality to the time the client was behind the server when the shot occured.  This will effectivily fast-forward the clients' shot so that it is running server time (really only makes sense if you think of 'slow' projectiles). So server is rewinding the time it took the reality to get to the client (server-to-client time) + the time it took to get the shot to the server (client-to-server time) = full ping time.

2. Because the client is moving ahead of the server, and your view of the world is behind the server, you basically took the shot at total pings worth of movement above the server - not good!.  That aside, the server will not rewind the client that made the shot's position so that the shot is the same on the server as on the client.  So, here again, we see proof that the client will be 1 ping ahead of other clients, or half ahead of the server and half behind the server.  This is not good because it allows someone with a high ping to be in a position to get a potentially unfair shot.

Required with delayed movement:  

1. This is the same as above.

2. Because the client is moving behind the server, as with your view of other clients, the server will also rewind your position.  So, here, we basically have both your movement and the other clients' movements behind the server by server-to-client time.  This is ok, but still not so good because your movement is delayed by full ping time.  

The '''best solution''' IMO, is the '''delayed movement and instant shot'''.  This is because it, er, enables you to actually hit stuff.  Low Ping Bastard's are still disadvantaged because they have to wait their ping time to move.

After I get that solution done, a potential solution I can do to fix full lag wait is to decrease it to half wait, and predict halfwait in front of what the server sends you (so you're basically running at same time as server).  However, the prediction would just be velocity based I dont know if the errors are worth the extra half ping until I actually implement it (later of course).

-

The final thing, which I found out a while ago, and I think have come to my conclusion on is: finding server-to-client time or client-to-server time is impossible! Believe me, I spent at least a few weeks on this :(.  I could only figure out a way to find out how much those values have ''changed'', but not what their actual values were.

{{classbox| 31st December, 2003}}

OMG, last day of 2003!  I better write something to make that 2 updates for the year 2003 *wink wink*.  I seriously gotta start writing in here more often lol ....  Been doing alot of stuff since my last update like going to camps, lans, and other fun &quot;learning&quot; because after I implemented my network code I realised it sucked and got depressed for a bit figuring out what to do next.  I cant believe how unplayable even a 100ms is on delayed movement.  I also cant believe this problem was solved by JC in the Quakeworld days so long ago ... hats off to him for listening to the fans who said Quake was &quot;unplayable&quot; online (I read a quote saying QuakeWorld was a &quot;BIG architectural change&quot; and that he barely even thought about high ping playability during Quake).

Only problem, is i cant do much with karma on the network.  I even figured out a way to do instant shots, as well as instant movement.  Instant shots are achieved by making the shot come from the position you were at one ping ago.  This makes replays possible because the game state is basically the same on all machines after they have rewound time.  It uses a special trick where the shot you made is coming from a previous position, but it is also hitting the same thing that you aimed at by finding the correct rotation.  You would send this rotation to the server all the time instead of your simulated rotation to maintain smoothness on the server.  I dont think zeroPing use this method.  Anyway, I'm sure that in the future, instant movement and instant shots will make it so that everyone plays without lag ... but those with high pings get discrepancies and will still be saying bad words to their modems ^^.

Interesting thing about the repulsor implementation is how simple it is.  I mean, its a bit harsh to expect modellers to write code, but I think repulsors are a sorta technical thing rather than an arty thing so they should be left to the programmers.  That said, it works by the vehicle spawning (usually) two repulsors at a set position.  This is made even easier for you by doing the bulldog wheel placement trick where you just specify and offset.

The Repulsors themselves are very simple also:

var()	bool	bEnableRepulsion;

var()	vector	CheckDir; // In owner ref frame

var()	float	CheckDist;

var()	float	Softness;

var()	float	PenScale;

// Used internally for Karma stuff - DO NOT CHANGE!

var		transient const int		KContact;  

I like it alot and it seems to work well but there is problems with the placement on the vehicles in the UT2R I think because some slopes can be rather buggy.  I'm still not sure how the repulsor works because it seems a bit hackish due to the softness variable and the speed at which it stabilises.  Could be wrong though.

===Later that day===

I modified the hoverbike to only have one repulsor.  One thing that is moderately disturbing is that SHover extends SVehicle and its PostBeginPlay function spawns two repulsors for you unconditionally.  Therefore, if you wanted to make another hover vehicle with different numbers of repulsors, youd have to call super(classabovesuper).PostBeginPlay().  ANYWAY, not that big of a deal.

I found that repulsors are similar to other constraints.  For example, KConstraint Actor1 would be the vehicle and Actor2 is an actor in tries to maintain CheckDist along CheckDir.  Only problem is they extend Actor (instead of KConstraint) and they are a composite of KParams (instead of being spawned on their own).  Seems like bad design :(.

I also went back to Tim's Networking doc to check on what he said about quakeworld.  It seems QW wasn't so good after all: &quot;lock-step prediction protocol&quot; and the &quot;network code and the game code are separate modules&quot;.  Gee, Carmack made it sound so good :(.  I still admire him tho :D.

{{classbox| 5th December, 2005}}

Wow, long time, no see.  Going to try to update this more regularly.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
    <revision>
      <id>5650</id>
      <timestamp>2004-01-01T05:24:33Z</timestamp>
      <contributor>
        <ip>O-GL</ip>
      </contributor>
      <minor/>
      <comment>*</comment>
      <text xml:space="preserve">{{classbox| 17th November, 2003}}

Today, I started implementing my network flow design more and came to a few conclusions and solidified my design more.  I'll write my thoughts about '''instant shots''' and clients '''moving instantly''' vs clients that have a '''full ping movement delay'''.

'''Instant movement''' problems: 1. That all clients see all the other client positions behind the server by server-to-client time.  2. The client that made the move is ahead of the server by client-to-server time.

'''Delayed movement''' has problem #1 but not #2.

-

Ok, if you want to apply '''instant shot''' to any of these ways of movement you have to apply certain tricks.

Required with instant movement:  

1.  Server needs to rewind world reality to the time the client was behind the server when the shot occured.  This will effectivily fast-forward the clients' shot so that it is running server time (really only makes sense if you think of 'slow' projectiles). So server is rewinding the time it took the reality to get to the client (server-to-client time) + the time it took to get the shot to the server (client-to-server time) = full ping time.

2. Because the client is moving ahead of the server, and your view of the world is behind the server, you basically took the shot at total pings worth of movement above the server - not good!.  That aside, the server will not rewind the client that made the shot's position so that the shot is the same on the server as on the client.  So, here again, we see proof that the client will be 1 ping ahead of other clients, or half ahead of the server and half behind the server.  This is not good because it allows someone with a high ping to be in a position to get a potentially unfair shot.

Required with delayed movement:  

1. This is the same as above.

2. Because the client is moving behind the server, as with your view of other clients, the server will also rewind your position.  So, here, we basically have both your movement and the other clients' movements behind the server by server-to-client time.  This is ok, but still not so good because your movement is delayed by full ping time.  

The '''best solution''' IMO, is the '''delayed movement and instant shot'''.  This is because it, er, enables you to actually hit stuff.  Low Ping Bastard's are still disadvantaged because they have to wait their ping time to move.

After I get that solution done, a potential solution I can do to fix full lag wait is to decrease it to half wait, and predict halfwait in front of what the server sends you (so you're basically running at same time as server).  However, the prediction would just be velocity based I dont know if the errors are worth the extra half ping until I actually implement it (later of course).

-

The final thing, which I found out a while ago, and I think have come to my conclusion on is: finding server-to-client time or client-to-server time is impossible! Believe me, I spent at least a few weeks on this :(.  I could only figure out a way to find out how much those values have ''changed'', but not what their actual values were.

{{classbox| 31st December, 2003}}

OMG, last day of 2003!  I better write something to make that 2 updates for the year 2003 *wink wink*.  I seriously gotta start writing in here more often lol ....  Been doing alot of stuff since my last update like going to camps, lans, and other fun &quot;learning&quot; because after I implemented my network code I realised it sucked and got depressed for a bit figuring out what to do next.  I cant believe how unplayable even a 100ms is on delayed movement.  I also cant believe this problem was solved by JC in the Quakeworld days so long ago ... hats off to him for listening to the fans who said Quake was &quot;unplayable&quot; online (I read a quote saying QuakeWorld was a &quot;BIG architectural change&quot; and that he barely even thought about high ping playability during Quake).

Only problem, is i cant do much with karma on the network.  I even figured out a way to do instant shots, as well as instant movement.  Instant shots are achieved by making the shot come from the position you were at one ping ago.  This makes replays possible because the game state is basically the same on all machines after they have rewound time.  It uses a special trick where the shot you made is coming from a previous position, but it is also hitting the same thing that you aimed at by finding the correct rotation.  You would send this rotation to the server all the time instead of your simulated rotation to maintain smoothness on the server.  I dont think zeroPing use this method.  Anyway, I'm sure that in the future, instant movement and instant shots will make it so that everyone plays without lag ... but those with high pings get discrepancies and will still be saying bad words to their modems ^^.

Interesting thing about the repulsor implementation is how simple it is.  I mean, its a bit harsh to expect modellers to write code, but I think repulsors are a sorta technical thing rather than an arty thing so they should be left to the programmers.  That said, it works by the vehicle spawning (usually) two repulsors at a set position.  This is made even easier for you by doing the bulldog wheel placement trick where you just specify and offset.

The Repulsors themselves are very simple also:

var()	bool	bEnableRepulsion;

var()	vector	CheckDir; // In owner ref frame

var()	float	CheckDist;

var()	float	Softness;

var()	float	PenScale;

// Used internally for Karma stuff - DO NOT CHANGE!

var		transient const int		KContact;  

I like it alot and it seems to work well but there is problems with the placement on the vehicles in the UT2R I think because some slopes can be rather buggy.  I'm still not sure how the repulsor works because it seems a bit hackish due to the softness variable and the speed at which it stabilises.  Could be wrong though.

===Later that day===

I modified the hoverbike to only have one repulsor.  One thing that is moderately disturbing is that SHover extends SVehicle and its PostBeginPlay function spawns two repulsors for you unconditionally.  Therefore, if you wanted to make another hover vehicle with different numbers of repulsors, youd have to call super(classabovesuper).PostBeginPlay().  ANYWAY, not that big of a deal.

I found that repulsors are similar to other constraints.  For example, KConstraint Actor1 would be the vehicle and Actor2 is an actor in tries to maintain CheckDist along CheckDir.  Only problem is they extend Actor (instead of KConstraint) and they are a composite of KParams (instead of being spawned on their own).  Seems like bad design :(.

I also went back to Tim's Networking doc to check on what he said about quakeworld.  It seems QW wasn't so good after all: &quot;lock-step prediction protocol&quot; and the &quot;network code and the game code are separate modules&quot;.  Gee, Carmack made it sound so good :(.  I still admire him tho :D.

[[Category:Legacy Journal|{{PAGENAME}}]]</text>
    </revision>
  </page>
  <page>
    <title>Legacy:OBJ File</title>
    <id>2354</id>
    <revision>
      <id>5666</id>
      <timestamp>2004-06-13T00:09:26Z</timestamp>
      <contributor>
        <ip>Radiosity</ip>
      </contributor>
      <comment>*</comment>
      <text xml:space="preserve">Wavefront .obj [[Legacy:File Format|file format]].

Can be imported to [[Legacy:UnrealEd|UnrealEd]] and possibly exported, but that seems to be broken for me.

Can be opened by most editors.

==Note==

OBJ-Export support is only available in UT2003/UT2004.

==How-To: Export Level content to OBJ==

Create a big subtracted brush and insert your favorite StaticMeshes. Go to the main menu &quot;File -&gt; Export&quot; and export this content to an OBJ file.

For more information go to this website: http://www3.sk.sympatico.ca/kelbeau/max2ued/html/17.html

'''Radiosity:''' You don't even need to subtract - just add the mesh directly to the level and export. Make sure you set the pivot point of the mesh where you want it to appear in 3dmax. Also, bear in mind that only the first UVMap channel will be exported, so you will lose any additional textures the mesh might be using.

==OBJ-Plugins for 3DSMAX==

OBJ2MAX for 3DSMAX 4 &amp; 5: http://www.habware.at/duck4.htm

OBJ2MAX for 3DSMAX 6: http://www.habware.at/duck6.htm

==Comments ==

'''Legal:''' Is it just me who can't export any brush OUT of UED?

'''Jan:''' Note, How-To and Plugin information added</text>
    </revision>
    <revision>
      <id>5667</id>
      <timestamp>2004-05-30T13:03:48Z</timestamp>
      <contributor>
        <ip>Jan</ip>
      </contributor>
      <comment>Added some information</comment>
      <text xml:space="preserve">Wavefront .obj [[Legacy:File Format|file format]].

Can be imported to [[Legacy:UnrealEd|UnrealEd]] and possibly exported, but that seems to be broken for me.

Can be opened by most editors.

==Note==

OBJ-Export support is only available in UT2003/UT2004.

==How-To: Export Level content to OBJ==

Create a big subtracted brush and insert your favorite StaticMeshes. Go to the main menu &quot;File -&gt; Export&quot; and export this content to an OBJ file.

For more information go to this website: http://www3.sk.sympatico.ca/kelbeau/max2ued/html/17.html

==OBJ-Plugins for 3DSMAX==

OBJ2MAX for 3DSMAX 4 &amp; 5: http://www.habware.at/duck4.htm

OBJ2MAX for 3DSMAX 6: http://www.habware.at/duck6.htm

==Comments ==

'''Legal:''' Is it just me who can't export any brush OUT of UED?

'''Jan:''' Note, How-To and Plugin information added</text>
    </revision>
  </page>
  <page>
    <title>Legacy:OBWANDO</title>
    <id>2341</id>
    <revision>
      <id>5637</id>
      <timestamp>2004-01-02T13:07:13Z</timestamp>
      <contributor>
        <ip>H18n2fls34o984.telia.com</ip>
      </contributor>
      <comment>Deathnote?</comment>
      <text xml:space="preserve">Well heres my small stamp on the unreal world... Basically I'm going to document as I learn different areas and try to move them to places where they can be used, or for others to be able to find a 'shortcut' to certain things. My main focus is pretty much writing ut2003 mods, not mutators, but maybe muts later on.

If I write something screwy, just comment it in. I'm sure theres always a better way.

First thing is to start here: [[Legacy:Mod_Authoring_For_UT2K3|Mod_Authoring_For_UT2K3]] So I put it into my /ut2003 folder (ex: /ut2003/RollerBall2169)

Next you need to create the game class you plan on deriving from. In my case I used xBombingRun...

&lt;uscript&gt;
class RollerBallGame extends xBombingRun;
&lt;/uscript&gt;

and saved it into /ut2003/RBall/RollerBallGame.uc

The important thing is that the class name must match the filename.

You can specify a new [[Legacy:HUD|HUD]], [[Legacy:PlayerController|PlayerController]], game name, and other things in here, but we'll go into that later.

Next thing you need to do is create an .int file, and add the reference to the packages loaded.

The [[Legacy:INT_File|INT_File]] (.int) will specify a lot of things about your mod. You will place this file into your /ut2003/system folder

In this case I called it RollerBall2169.int and heres the contents. I read the .int page, but got confused a bit with the pipes, so there is an example of what it looks like with the pipes (A|B|C|D|E).

&lt;uscript&gt;
[PUBLIC]
Object=(Class=Class,MetaClass=Engine.GameInfo,Name=RollerBall2169.RollerBallGame,Description=&quot;RB|RollerBall 2169|xinterface.Tab_IABombingRun|RollerBall2169.MapListRollerBall|true&quot;)&lt;/uscript&gt;

Notice I'm using a custom [[Legacy:MapList|MapList]] and Map prefix. The prefix serves as to filter out maps in your list. If I used BR I would get all bombing run maps.

Next thing is to put your mod's file into the ut2003.ini file at the end of [Editor.EditorEngine]. In this case the entry was: EditPackages=RollerBall2169

now you have a basic framework to start from.

My mod is pretty simple by theory here. I want to remove all shooting weapons, use gliding skates, add some speed, do some ragdoll stuff, add some bludgeoning weapons, powerups, and of course a new ball and goals. Another item is that I want to make sure people stay on the course (people play on a track) and dont try to go backwards or stay off of the track.

I'll break down how I achieved some of the effects and what classes I modified and how I got them to work. You can extend any class you want, but dont expect it to be called or ever receive an event unless you get it plugged into your game correctly. Learn to use the [[Legacy:Debugging_Techniques|Debugging_Techniques]], they will make your life much easier. 

I use the DisplayDebug for my routines so I can show that I am getting calls to each class correctly. Broadcast to yourself events, you can get instant response with triggering or performing actions.

Drawing on the [[Legacy:Canvas|Canvas]] is easy, and if you want to simply put something on the next line in the DisplayDebug use:

&lt;uscript&gt;
simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos)
{
  super.DisplayDebug(Canvas, YL, YPos);
  Canvas.SetDrawColor(255,255,255); // Change colors for routines
  Canvas.DrawText(&quot;Player's name is &quot;$PlayerOwner.PlayerReplicationInfo.PlayerName,false); // show: Player's name is Player
  YPos += YL; // move to the next line
  Canvas.SetPos(4,YPos); // and set the next position for the next drawtext.
}
&lt;/uscript&gt;

Im going to move ahead here and put things as I go along, As I move the items out into the open I will link them from here.

----

Now we're going to talk about controlling your (x)player and playercontrol. You can find the tree here at the [[Legacy:Actor_Class_Hierarchy|Actor_Class_Hierarchy]].

The hiearchy we are looking at is: [[Legacy:Actor|Actor]]-&gt;[[Legacy:Controller|Controller]]-&gt;[[PlayerController]-&gt;[[Legacy:UnrealPlayer|UnrealPlayer]]-&gt;[[Legacy:XPlayer|xPlayer]].

The [[Legacy:PlayerController|PlayerController]] is the instruction that is given a possessed [[Legacy:Pawn|Pawn]]. Think of the PlayerController as the mind and soul and the pawn as the physical body. You possess the pawn and control it to do whatever you want. Also, if the computer is playing, it uses the AIController and takes over the pawn in the same fashion as I just explained. (Think Matrix here)

The idea here was to allow the person to 'glide' along the surface which means no fast stopping, and accelerated motion. To do this you need to modify the PlayerController's PlayerTick. Why? because you want to have it check for controller changes and accelerate instead of applying motion immediately at each player time interval. This means we need to modify how the PlayController changes the acceleration and how the pawn will apply this acceleration. We're going to subclass the xPlayer class here since it has all of the same class info inhereted from its parent classes (more importantly to us the PlayerController class). Why didnt we just go for the PlayerController class? Simply because we only want to make a slight change and dont want to change how UnrealPlayer and xPlayer interact with the PlayerController. If we take over a function then we have to make sure all child classes are taken care of as well or you may get into big trouble. 

To first get the engine to even send our new class some events we need to specify the PlayerController class and also specify our Pawn class (which has our PlayerMove function) that we are going to be using. If you remember we created a RollerBallGame which extended xBombingRun. It had our gamename and HUDType to show a custom HUD. Well we need to add a new line in there, so here it is:

&lt;uscript&gt;
// RollerBallGame.uc

class RollerBallGame extends xBombingRun;

defaultproperties
{
 GameName=&quot;RollerBall 2169&quot;
 HUDType=&quot;RollerBall2169.RollerBallHUD&quot;
 PlayerControllerClassName=&quot;RollerBall2169.RBxPlayer&quot; // This is our new custom PlayerController class.
}
&lt;/uscript&gt;

I'm sure you're saying... Wait a second, didn't you say that we werent going to modify the PlayerController class???

Thats correct, we haven't... We gave it a class that is derived from the PlayerController class and has all of the inhereted functions and variables of the PlayerController class, but only the functions we wanted to modify were changed. The class we are using here is the xPlayer class. Look it up in the hiearchy again, you will understand.

So heres is the patch you put in the front of the event:

&lt;uscript&gt;
// RBxPlayer.uc file

class RBxPlayer extends xPlayer;

simulated event PlayerTick( float DeltaTime )
{
    local int CurrentKey, DiffKey; // the first 5 lines here are from the PlayerTick in the PlayerController.uc file.
    local int c, i;                // We still need the logic in PlayerController to apply, 
    local bool bFullBuffer,bMatch; // so we copy the whole event in here and modify to suit our taste.
	
    Super.PlayerTick(DeltaTime);

    if (aForward &gt; 0)	AccelSpeed += AccelSpeedRate;
    else if (aForward &lt; 0)  AccelSpeed -= AccelSpeedRate;		
	
	if ( (aForward == 0) &amp;&amp; (AccelSpeed != 0) ) {
		if (AccelSpeed &gt;0 ) {
			AccelSpeed -= AccelSpeedDecay;
		} else {
			AccelSpeed += AccelSpeedDecay;
		}
		
		if (AccelSpeedDecay &gt; abs(AccelSpeed))  AccelSpeed = 0; // if we're inside of the decay zero it out
	}

	if ( abs(AccelSpeed) &gt; Pawn.AccelRate ) { // make sure they arent going faster than the possible acceleration speed.
		if (AccelSpeed&lt;0) {
			AccelSpeed = -Pawn.AccelRate;
		}	else {
			AccelSpeed = Pawn.AccelRate;
		}
	}
// ... And the rest of the event goes under here.

// and at the tail of the file you need this added so that it will use our custom Pawn for other attributes we'll address later on.
defaultproperties
{
	AccelSpeedRate=50.00  // this is just for acceleration so that every playertick that happens it will accelerate by this interval.
	PawnClass=Class'RollerBall2169.RBxPawn' // This is the pawn we want to control not the default xPawn. Ill explain later.
}
&lt;/uscript&gt;

In case you are curious, the maximum acceleration rate of a pawn and other important stuff can be found in Pawn.uc:

&lt;uscript&gt;
// Movement.
var float   GroundSpeed;    // The maximum ground speed.
var float   WaterSpeed;     // The maximum swimming speed.
var float   AirSpeed;		// The maximum flying speed.
var float   LadderSpeed;	// Ladder climbing speed
var float   AccelRate;		// max acceleration rate
var float   JumpZ;      	// vertical acceleration w/ jump
var float   AirControl;		// amount of AirControl available to the pawn
var float   WalkingPct;		// pct. of running speed that walking speed is
var float   CrouchedPct;	// pct. of running speed that crouched walking speed is
var float   MaxFallSpeed;	// max speed pawn can land without taking damage (also limits what paths AI can use)
var vector  ConstantAcceleration;	// acceleration added to pawn when falling
&lt;/uscript&gt;

Once we do that modification there we need to change the PlayerMove as well. The PlayerMove is part of the Pawn.uc class. But there are multiple [[Legacy:State|State]]s a player could be in. The player could be 'PlayerWalking', 'PlayerSwimming', etc... Each state controls how the player will move. If you are flying, you arent doing the same motions as if you were walking or swimming. Well, we're interested on how we walk, or in this case glide. Since we never plan on having our guy walk, we will simply modify the PlayerMove inside of the PlayerWalking state.

----

Tonight's dilemma was about bot control. I ride on skates, they walk. When I get hit, I fall down, crumple, whatever my karma body feels like (until i do the vectors for the correct hits (this weekend :)). They dont. SO how do i fix this?

To change a bot you first need to extend the xBot. Problem is where is it called from? I tried changing the default class to my custom bot class (RBxBot) and no gold. Still went to xGame.xBot. So that means that I need to dig deeper...

Lets think about this. Almost everything we play derives from the deathmatch class. (insert class heiarchy here) So, we need to figure out what actually cranks a bot up!

After digging around, I found this little nugget inside of the deathmatch.uc file:

&lt;uscript&gt;

/* Spawn and initialize a bot
*/
function Bot SpawnBot(optional string botName)
{
    local Bot NewBot;
    local RosterEntry Chosen;
	local UnrealTeamInfo BotTeam;

	BotTeam = GetBotTeam();
    Chosen = BotTeam.ChooseBotClass(botName);

    if (Chosen.PawnClass == None)
        Chosen.Init(); //amb
    // log(&quot;Chose pawn class &quot;$Chosen.PawnClass);
    NewBot = Bot(Spawn(Chosen.PawnClass.default.ControllerClass));

    if ( NewBot != None )
        InitializeBot(NewBot,BotTeam,Chosen);
    return NewBot;
}
&lt;/uscript&gt;

Very interesting... so I went to my RollerBallGame.uc file (where I specified my gametype class) and tossed it in there with some minor changes.

&lt;uscript&gt;
function Bot SpawnBot(optional string botName)
{
    local Bot NewBot;
    local RosterEntry Chosen;
    local UnrealTeamInfo BotTeam;

    BotTeam = GetBotTeam();
    Chosen = BotTeam.ChooseBotClass(botName);

    if (Chosen.PawnClass == None)
        Chosen.Init(); //amb
    log(&quot;Chose pawn class &quot;$Chosen.PawnClass); // just to make sure I uncommented this out
    NewBot = Spawn(class'RBxBot'); // explicitly specify my bot class
//	 NewBot = Bot(Spawn(Chosen.PawnClass.default.ControllerClass));

    if ( NewBot != None )
        InitializeBot(NewBot,BotTeam,Chosen);
    return NewBot;
}

&lt;/uscript&gt;

Compile, showdebug, viewplayer (botname), Voila!!! Controller is RBxBot! So far so good, but they arent falling down yet!...

So in the RBxBot.uc file I put in:

&lt;uscript&gt;
function SetPawnClass(string inClass, string inCharacter)
{
    local class&lt;RBxPawn&gt; pClass;
    
    PawnClass = class'RBxPawn';
    log(&quot;Chose pawn class &quot;$PawnClass); // again checking to make sure it works well...

    PawnSetupRecord = class'xUtil'.static.FindPlayerRecord(inCharacter);
    PlayerReplicationInfo.SetCharacterName(inCharacter);
}

&lt;/uscript&gt;

There are some other advantages, since you can set bot parameters in your gameclass file. If theres an easier way, I'm all for it, but until then, I'll continue to study the bot files and start filling in the bot page as I go along...

----

The next item up was the Karma Ragdoll physics. I wanted to have people actually fall over when they get hit and the percentage was to be dictated by the amount of force the weapon being used would 'stun' the player. Instead of going over it here, just jump to the [[Legacy:Karma Ragdoll|Karma Ragdoll]] page and read it. I added my working code to the bottom and tried to clear up any assumptions. I give all of the kudos to the guys who wrote that page (and the other it links from), they were essential to the learning curve.

----

Now its time for replication, and so far... Its a pain in the ...

====Comments====

'''Mychaeel:''' Welcome.  :-)  But please don't put stuff of general interest on your personal page &amp;ndash; nobody will ever find it there.  Just look around a bit, find a nice place for a link to your content, add it and then create a new page to add your content from there.  (If others feel that the new page should have a different name or be linked from elsewhere, no harm done &amp;ndash; that can be changed easily.)

'''OBWANDO:''' No problem, Would a developers journal be more appropriate? Or a &quot;Mod from nuts to bolts&quot;? In the end I want to allow new people to look at the mod I've created from start to finish and try to give them a template for as many classes as possible with the assistance of other pages that have the definition of many of the classes. Kind of like a practical use for the instructional pages.

'''Foxpaw:''' Have you considered just using PHYS_Hovering for the skates simulation? It may not make much of a difference, but I think it behaves essentially as you have described you want your skates to act, and since it runs natively it would probrably execute faster.

'''LegalAssassin:''' Hey, Ob, are you dead? Haven't seen you around l